pspp-1.4.1/0000755000175000017500000000000013725012650012114 5ustar00blpblp00000000000000pspp-1.4.1/po/0000755000175000017500000000000013725012647012540 5ustar00blpblp00000000000000pspp-1.4.1/po/tr.po0000644000175000017500000110057213725012645013531 0ustar00blpblp00000000000000# Turkish translation for pspp. # Copyright (C) 2014 Free Software Foundation, Inc. # This file is distributed under the same license as the pspp package. # Ayhan YALÇINSOY , 2014. # Volkan Gezer , 2014. # Mehmet Kececi , 2017. msgid "" msgstr "" "Project-Id-Version: pspp 0.10.5pre1\n" "Report-Msgid-Bugs-To: pspp-dev@gnu.org\n" "PO-Revision-Date: 2017-06-24 02:50+0300\n" "Last-Translator: Mehmet Kececi \n" "Language-Team: Turkish \n" "Language: tr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" "X-Generator: Virtaal 0.7.1\n" "X-Bugs: Report translation errors to the Language-Team address.\n" #: src/data/any-reader.c:72 src/data/encrypted-file.c:78 #, c-format msgid "An error occurred while opening `%s': %s." msgstr "`%s' açılırken bir hata oluştu: %s." #: src/data/any-reader.c:93 src/language/lexer/lexer.c:1633 #, c-format msgid "Error reading `%s': %s." msgstr "`%s' okunamadı: %s." #: src/data/any-reader.c:114 #, c-format msgid "`%s' is not a system or portable file." msgstr "`%s' bir sistem dosyası ya da taşınabilir dosya değil." #: src/data/any-reader.c:123 src/data/any-writer.c:66 msgid "The inline file is not allowed here." msgstr "Satıriçi dosyalara burada izin verilmiyor." #: src/data/any-reader.c:205 #, c-format msgid "" "Cannot read from dataset %s because no dictionary or data has been written " "to it yet." msgstr "Yazılan sözlük veya veri olmadığından veri kümesi %s veri okunamadı." #: src/data/any-reader.c:260 src/language/data-io/dataset.c:253 msgid "Dataset" msgstr "Veri Seti" #: src/data/calendar.c:100 #, c-format msgid "Month %d is not in acceptable range of 0 to 13." msgstr "%d bir ay olarak, kabul edilebilir 0 - 13 aralığında değil." #: src/data/calendar.c:110 #, c-format msgid "Day %d is not in acceptable range of 0 to 31." msgstr "%d bir gün olarak, kabul edilebilir 0 - 31 aralığında değil." #: src/data/calendar.c:119 #, c-format msgid "Date %04d-%d-%d is before the earliest acceptable date of 1582-10-15." msgstr "" "%04d-%d-%d tarihi en erken kabul edilebilir 1582-10-15 tarihinden önce." #: src/data/casereader-filter.c:221 msgid "" "At least one case in the data read had a weight value that was user-missing, " "system-missing, zero, or negative. These case(s) were ignored." msgstr "" "Veri okumada en az bir vaka kullanıcı kaybı, sistem kaybı, sıfır veya " "negatif değer ağırlığına sahip. Bu vaka(lar) yoksayıldı." #. TRANSLATORS: this fragment will be interpolated into messages in fh_lock() #. that identify types of files. #: src/data/csv-file-writer.c:138 msgid "CSV file" msgstr "CSV dosyası" #: src/data/csv-file-writer.c:146 #, fuzzy, c-format #| msgid "Error opening `%s' for writing as a system file: %s." msgid "Error opening `%s' for writing as a CSV file: %s." msgstr "`%s' dosyası, bir sistem dosyası olarak yazmak için açılamadı: %s." #: src/data/csv-file-writer.c:453 #, c-format msgid "An I/O error occurred writing CSV file `%s'." msgstr "CSV dosyası `%s' yazılırken bir girdi/çıktı hatası oluştu." #: src/data/data-in.c:175 #, c-format msgid "Data is not valid as format %s: %s" msgstr "Veri %s biçiminde geçerli değil: %s" #: src/data/data-in.c:377 src/data/data-in.c:553 msgid "Field contents are not numeric." msgstr "Alan içeriği sayısal değil." #: src/data/data-in.c:379 src/data/data-in.c:555 msgid "Number followed by garbage." msgstr "Değersiz veriyi takip eden numara" #: src/data/data-in.c:392 msgid "Invalid numeric syntax." msgstr "Geçersiz sayısal sözdizimi." #: src/data/data-in.c:400 src/data/data-in.c:571 msgid "Too-large number set to system-missing." msgstr "Sistem kaybı için çok büyük rakam kümesi." #: src/data/data-in.c:406 src/data/data-in.c:577 msgid "Too-small number set to zero." msgstr "Çok küçük rakamları sıfır olarak ayarlandı." #: src/data/data-in.c:426 msgid "All characters in field must be digits." msgstr "Alandaki tüm karakterler rakam olmalıdır." #: src/data/data-in.c:445 msgid "Unrecognized character in field." msgstr "Alan içerisinde tanınmayan karakter." #: src/data/data-in.c:466 src/data/data-in.c:729 msgid "Field must have even length." msgstr "Alanın bir uzunluğu olmalı." #: src/data/data-in.c:468 src/data/data-in.c:732 msgid "Field must contain only hex digits." msgstr "Alan sadece onaltılık sayılar içerebilir." #: src/data/data-in.c:544 msgid "Invalid zoned decimal syntax." msgstr "Geçersiz kuşatılmış ondalık sözdizimi." #: src/data/data-in.c:644 src/data/data-in.c:650 msgid "Invalid syntax for P field." msgstr "P alanı için geçersiz sözdizimi." #: src/data/data-in.c:768 src/data/data-in.c:818 msgid "Syntax error in date field." msgstr "Tarih alanında sözdizimi hatası." #: src/data/data-in.c:783 #, c-format msgid "Day (%ld) must be between 1 and 31." msgstr "Gün (%ld) 1 ile 31 arasında olmalıdır." #: src/data/data-in.c:832 msgid "Delimiter expected between fields in date." msgstr "Tarih içerisindeki alanlarda sınırlandırıcı bekleniyor." #: src/data/data-in.c:906 msgid "" "Unrecognized month format. Months may be specified as Arabic or Roman " "numerals or as at least 3 letters of their English names." msgstr "" "Bilinmeyen ay biçimi. Aylar Arapça ve Roma rakamlı olarak ya da İngilizce " "isimlerinin en az 3 harfi olarak belirlenebilir." #: src/data/data-in.c:933 #, c-format msgid "Year (%ld) must be between 1582 and 19999." msgstr "Yıl (%ld) 1582 ile 19999 arasında olmalıdır." #: src/data/data-in.c:944 #, c-format msgid "Trailing garbage `%.*s' following date." msgstr "İzlenen çöp `%.*s' takip tarihi." #: src/data/data-in.c:958 msgid "Julian day must have exactly three digits." msgstr "Jülyen takvimine göre gün tam olarak üç rakamdan oluşmalıdır." #: src/data/data-in.c:960 #, c-format msgid "Julian day (%ld) must be between 1 and 366." msgstr "Jülyen takvimine göre gün (%ld) 1 ile 366 arasında olmalıdır." #: src/data/data-in.c:984 #, c-format msgid "Quarter (%ld) must be between 1 and 4." msgstr "Çeyrek (%ld) 1 ile 4 arasında olmalıdır." #: src/data/data-in.c:1005 #, c-format msgid "Week (%ld) must be between 1 and 53." msgstr "Hafta (%ld) 1 ile 53 rasında olmalıdır." #: src/data/data-in.c:1017 msgid "Delimiter expected between fields in time." msgstr "Zaman içerisindeki alanlarda sınırlandırıcı bekleniyor." #: src/data/data-in.c:1037 #, c-format msgid "Minute (%ld) must be between 0 and 59." msgstr "Dakika (%ld) 0 ile 59 arasında olmalıdır." #: src/data/data-in.c:1075 msgid "" "Unrecognized weekday name. At least the first two letters of an English " "weekday name must be specified." msgstr "" "Bilinmeyen gün adı. En azından İngilizce gün isimlerinden birisinin ilk iki " "harfi belirtilmelidir." #: src/data/data-in.c:1210 #, c-format msgid "`%c' expected in date field." msgstr "Tarih alanında`%c' bekleniyor." #: src/data/data-out.c:580 #, c-format msgid "Weekday number %f is not between 1 and 7." msgstr "Haftanın günü %f, 1 ile 7 arasında değil." #: src/data/data-out.c:605 #, c-format msgid "Month number %f is not between 1 and 12." msgstr "Ay numarası %f, 1 ile 12 arasında değil." #. TRANSLATORS: this fragment will be interpolated into #. messages in fh_lock() that identify types of files. #: src/data/dataset-writer.c:66 src/language/data-io/file-handle.c:304 msgid "dataset" msgstr "veri seti" #: src/data/dict-class.c:52 msgid "ordinary" msgstr "olağan" #: src/data/dict-class.c:54 msgid "system" msgstr "sistem" #: src/data/dict-class.c:56 msgid "scratch" msgstr "baştan" #: src/data/dictionary.c:1523 #, c-format msgid "Truncating document line to %d bytes." msgstr "Belge satırı %d bayta kadar kısaltılıyor." #: src/data/encrypted-file.c:89 #, c-format msgid "An error occurred while reading `%s': %s." msgstr "`%s' okunurken bir hata oluştu: %s." #: src/data/encrypted-file.c:430 #, c-format msgid "" "%s: encrypted file corrupted (ends in incomplete %u-byte ciphertext block)" msgstr "" #: src/data/encrypted-file.c:449 #, c-format msgid "%s: encrypted file corrupted (ends with bad padding)" msgstr "" #: src/data/file-handle-def.c:283 src/language/data-io/dataset.c:266 msgid "active dataset" msgstr "etkin veri seti" #: src/data/file-handle-def.c:518 #, c-format msgid "Can't read from %s as a %s because it is already being read as a %s." msgstr "" "%s ögesinden %s olarak okunamıyor çünkü dosya halihazırda %s olarak okunmuş." #: src/data/file-handle-def.c:522 #, c-format msgid "Can't write to %s as a %s because it is already being written as a %s." msgstr "" "%s ögesine %s olarak yazılamıyor çünkü dosya halihazırda %s olarak yazılmış." #: src/data/file-handle-def.c:529 #, c-format msgid "Can't re-open %s as a %s." msgstr "%s, %s olarak yeniden açılamadı." #: src/data/file-name.c:133 #, c-format msgid "Not opening pipe file `%s' because %s option set." msgstr "" #: src/data/format.c:339 msgid "Input format" msgstr "Girdi biçimi" #: src/data/format.c:339 msgid "Output format" msgstr "Çıktı biçimi" #: src/data/format.c:342 #, c-format msgid "Format %s may not be used for input." msgstr "%s biçimi girdi için kullanılamaz." #: src/data/format.c:349 #, c-format msgid "%s specifies width %d, but %s requires an even width." msgstr "%s %d genişliğini belirler ancak %s eşit bir genişlik gerektiriyor." #: src/data/format.c:358 #, c-format msgid "%s %s specifies width %d, but %s requires a width between %d and %d." msgstr "" "%s %s %d genişliğini belirler ancak %s %d ve %d arasında bir genişlik " "gerektirir." #: src/data/format.c:367 #, c-format msgid "%s %s specifies %d decimal place, but %s does not allow any decimals." msgid_plural "" "%s %s specifies %d decimal places, but %s does not allow any decimals." msgstr[0] "%s %s %d ondalık yerini belirler ancak %s ondalığa izin vermez." msgstr[1] "%s %s %d ondalık yerini belirler ancak %s ondalığa izin vermez." #: src/data/format.c:378 #, c-format msgid "" "%s %s specifies %d decimal place, but the given width allows at most %d " "decimals." msgid_plural "" "%s %s specifies %d decimal places, but the given width allows at most %d " "decimals." msgstr[0] "" "%s %s %d ondalık yerini belirler ancak verilen genişlik en çok %d ondalığına " "izin veriyor." msgstr[1] "" "%s %s %d ondalık yerini belirler ancak verilen genişlik en çok %d ondalığına " "izin veriyor." #: src/data/format.c:385 #, c-format msgid "" "%s %s specifies %d decimal place, but the given width does not allow for any " "decimals." msgid_plural "" "%s %s specifies %d decimal places, but the given width does not allow for " "any decimals." msgstr[0] "" "%s %s %d ondalık yerini belirler ancak verilen genişlik ondalık için uygun " "değil." msgstr[1] "" "%s %s %d ondalık yerini belirler ancak verilen genişlik ondalık için uygun " "değil." #: src/data/format.c:424 #, c-format msgid "%s variables are not compatible with %s format %s." msgstr "%s değişkenler %s biçimli %s ile uyumlu değildir." #: src/data/format.c:425 src/data/format.c:1074 #: src/ui/gui/var-type-dialog.ui:167 msgid "String" msgstr "Dize" #: src/data/format.c:425 src/data/format.c:1035 #: src/ui/gui/var-type-dialog.ui:48 msgid "Numeric" msgstr "Sayısal" #: src/data/format.c:426 src/data/sys-file-reader.c:2212 #: src/data/sys-file-reader.c:2214 src/language/xforms/recode.c:512 #: src/language/xforms/recode.c:513 src/language/xforms/recode.c:525 #: src/language/xforms/recode.c:526 #: src/language/dictionary/apply-dictionary.c:77 #: src/language/dictionary/apply-dictionary.c:78 msgid "numeric" msgstr "sayısal" #: src/data/format.c:426 src/data/sys-file-reader.c:2212 #: src/data/sys-file-reader.c:2214 src/language/xforms/recode.c:512 #: src/language/xforms/recode.c:513 src/language/xforms/recode.c:525 #: src/language/xforms/recode.c:526 #: src/language/dictionary/apply-dictionary.c:77 #: src/language/dictionary/apply-dictionary.c:78 msgid "string" msgstr "dize" #: src/data/format.c:444 #, c-format msgid "String variable with width %d is not compatible with format %s." msgstr "%d ile oluşturulmuş dize değişken %s biçimi ile uyumlu değil." #: src/data/format.c:1038 src/ui/gui/var-type-dialog.ui:65 msgid "Comma" msgstr "Virgül" #: src/data/format.c:1041 src/ui/gui/var-type-dialog.ui:82 msgid "Dot" msgstr "Nokta" #: src/data/format.c:1044 msgid "Scientific" msgstr "Bilimsel" #: src/data/format.c:1061 src/ui/gui/var-type-dialog.ui:116 msgid "Date" msgstr "Tarih" #: src/data/format.c:1064 src/ui/gui/var-type-dialog.ui:133 msgid "Dollar" msgstr "Dolar" #: src/data/format.c:1071 msgid "Custom" msgstr "Özel" #: src/data/gnumeric-reader.c:478 src/data/ods-reader.c:505 #, c-format msgid "Cannot convert the value in the spreadsheet cell %s to format (%s): %s" msgstr "Hesap Tablosu %s hücresindeki değer (%s) biçimine dönüştülemiyor: %s" #: src/data/gnumeric-reader.c:502 src/data/ods-reader.c:567 #, c-format msgid "" "There was a problem whilst reading the %s file `%s' (near line %d): `%s'" msgstr "%s dosyası `%s' (yakın satır %d) okuma esnasında bir problem: `%s'" #: src/data/gnumeric-reader.c:597 #, c-format msgid "" "The gnumeric file `%s' is encoded as %s instead of the usual UTF-8 encoding. " "Any non-ascii characters will be incorrectly imported." msgstr "" #: src/data/gnumeric-reader.c:641 src/data/ods-reader.c:682 #, c-format msgid "Invalid cell range `%s'" msgstr "Geçersiz hücre aralığı `%s'" #: src/data/gnumeric-reader.c:813 src/data/ods-reader.c:710 #: src/data/ods-reader.c:843 #, c-format msgid "Selected sheet or range of spreadsheet `%s' is empty." msgstr "`%s' hesap tablosunun seçilmiş sayfası veya aralığı boş." #: src/data/identifier2.c:60 #, c-format msgid "Identifier `%s' exceeds %d-byte limit." msgstr "`%s' tanımlayıcısı %d-bayt sınırını aşıyor." #: src/data/identifier2.c:84 msgid "Identifier cannot be empty string." msgstr "Tanımlayıcı dize boş bırakılamaz." #: src/data/identifier2.c:92 #, c-format msgid "`%s' may not be used as an identifier because it is a reserved word." msgstr "" "`%s' bir tanımlayıcı olarak kullanılamaz, çünkü bu sözcük program tarafından " "önceden ayrılmış özel bir sözcük." #: src/data/identifier2.c:103 #, c-format msgid "" "`%s' may not be used as an identifier because it contains ill-formed UTF-8 " "at byte offset %tu." msgstr "" "`%s' tanımlayıcı olarak kullanılamaz çünkü %tu bayt baskısında kötü " "biçimlendirilmiş UTF-8 içeriyor." #: src/data/identifier2.c:114 #, c-format msgid "" "Character %s (in `%s') may not appear as the first character in a identifier." msgstr "" "%s karakteri (`%s' deki) bir belirteçte ilk karakter olarak görünmeyebilir." #: src/data/identifier2.c:126 #, c-format msgid "Character %s (in `%s') may not appear in an identifier." msgstr "%s karakteri (`%s' deki) bir belirteçte görünmeyebilir." #: src/data/mdd-writer.c:241 #, fuzzy, c-format #| msgid "I/O error occurred writing data file `%s'." msgid "An I/O error occurred writing metadata file `%s'." msgstr "`%s' veri dosyası yazılırken girdi/çıktı hatası oluştu." #. TRANSLATORS: this fragment will be interpolated into #. messages in fh_lock() that identify types of files. #: src/data/mdd-writer.c:457 #, fuzzy #| msgid "data file" msgid "metadata file" msgstr "veri dosyası" #: src/data/mdd-writer.c:465 #, fuzzy, c-format #| msgid "Error opening `%s' for writing as a portable file: %s." msgid "Error opening `%s' for writing as a metadata file: %s." msgstr "`%s' dosyası, bir taşınabilir dosya olarak yazmak için açılamadı: %s." #: src/data/mdd-writer.c:473 #, c-format msgid "Internal error creating xmlTextWriter. Please report this to %s." msgstr "" #: src/data/make-file.c:217 #, c-format msgid "Opening %s for writing: %s." msgstr "%s yazılmak için açılıyor: %s." #: src/data/make-file.c:228 #, c-format msgid "Opening stream for %s: %s." msgstr "%s için dosya açılıyor: %s" #: src/data/make-file.c:260 #, c-format msgid "Creating temporary file to replace %s: %s." msgstr "%s ile değiştirmek için geçici dosya oluşturuluyor: %s." #: src/data/make-file.c:277 #, c-format msgid "Creating temporary file %s: %s." msgstr "Geçici dosya %s oluşturuluyor: %s." #: src/data/make-file.c:289 #, c-format msgid "Opening stream for temporary file %s: %s." msgstr "%s geçici dosyası için dosya açılıyor: %s." #: src/data/make-file.c:326 #, c-format msgid "Replacing %s by %s: %s." msgstr "%s, %s ile değiştiriliyor: %s." #: src/data/make-file.c:354 #, c-format msgid "Removing %s: %s." msgstr "%s kaldırılıyor: %s." #: src/data/mrset.c:83 #, c-format msgid "" "%s is not a valid name for a multiple response set. Multiple response set " "names must begin with `$'." msgstr "" "%s çoklu yanıt kümesi için geçerli bir ad değil. Çoklu yanıt kümesi adları `" "$' ile başlamalıdır." #: src/data/ods-reader.c:620 #, c-format msgid "Cannot open %s as a OpenDocument file: %s" msgstr "%s bir AçıkBelge dosyası olarak açılamadı: %s" #. TRANSLATORS: this fragment will be interpolated into #. messages in fh_lock() that identify types of files. #: src/data/pc+-file-reader.c:206 msgid "SPSS/PC+ system file" msgstr "SPSS/PC+ sistem dosyası" #: src/data/pc+-file-reader.c:215 #, c-format msgid "Error opening `%s' for reading as an SPSS/PC+ system file: %s." msgstr "" "`%s' dosyası, bir SPSS/PC+ sistem dosyası gibi okumak için açılamadı: %s." #: src/data/pc+-file-reader.c:224 src/data/sys-file-reader.c:3541 #, c-format msgid "%s: stat failed (%s)." msgstr "%s: stat başarısız oldu (%s)." #: src/data/pc+-file-reader.c:230 #, c-format msgid "%s: file too large." msgstr "%s: dosya çok büyük." #: src/data/pc+-file-reader.c:257 #, c-format msgid "" "Directory entry is for a %u-byte record starting at offset %u but file is " "only %u bytes long." msgstr "" "Dizin girişi mahsup %u-byte başlangıç %u kaydı ancak dosyası sadece %u bayt " "uzunluğunda." #: src/data/pc+-file-reader.c:275 #, c-format msgid "Directory fields have unexpected values (%u,%u)." msgstr "Dizin alanları beklenmeyen değerlere sahip (%u,%u)." #: src/data/pc+-file-reader.c:372 src/data/sys-file-reader.c:672 #, c-format msgid "Variable %zu" msgstr "Değişken %zu" #: src/data/pc+-file-reader.c:380 src/data/sys-file-reader.c:680 #, c-format msgid "Variable %zu Label" msgstr "Değişken %zu etiket" #: src/data/pc+-file-reader.c:385 #, c-format msgid "Variable %zu Value Label %zu" msgstr "Değişken %zu Değer Etiketi %zu" #: src/data/pc+-file-reader.c:388 src/data/sys-file-reader.c:690 msgid "Creation Date" msgstr "Oluşturma tarihi" #: src/data/pc+-file-reader.c:389 src/data/sys-file-reader.c:691 msgid "Creation Time" msgstr "Oluşturulma saati" #: src/data/pc+-file-reader.c:390 src/data/sys-file-reader.c:692 #: src/language/dictionary/sys-file-info.c:200 msgid "Product" msgstr "Ürün" #: src/data/pc+-file-reader.c:391 src/data/sys-file-reader.c:693 #: src/language/dictionary/sys-file-info.c:300 msgid "File Label" msgstr "Dosya Etiketi" #: src/data/pc+-file-reader.c:427 #, c-format msgid "" "Using default encoding %s to read this SPSS/PC+ system file. For best " "results, specify an encoding explicitly. Use SYSFILE INFO with ENCODING=" "\"DETECT\" to analyze the possible encodings." msgstr "" #: src/data/pc+-file-reader.c:483 src/data/sys-file-reader.c:890 #, c-format msgid "Error closing system file `%s': %s." msgstr "`%s' sistem dosyası kapatılırken bir hata oluştu: %s." #: src/data/pc+-file-reader.c:544 #, fuzzy #| msgid "This is not an SPSS system file." msgid "This is not an SPSS/PC+ system file." msgstr "Bu bir SPSS sistem dosyası değil." #: src/data/pc+-file-reader.c:548 #, c-format msgid "Record 0 has unexpected length %u." msgstr "" #: src/data/pc+-file-reader.c:572 #, c-format msgid "Record 0 specifies unexpected system missing value %g (%a)." msgstr "" #: src/data/pc+-file-reader.c:577 #, c-format msgid "Record 0 reserved fields have unexpected values (%u,%u,%u,%u,%u,%u)." msgstr "" #: src/data/pc+-file-reader.c:581 #, c-format msgid "Record 0 case counts differ (%u versus %u)." msgstr "" #: src/data/pc+-file-reader.c:585 #, fuzzy, c-format #| msgid "Unsupported compression type (%d)" msgid "Invalid compression type %u." msgstr "Desteklenmeyen sıkıştırma türü (%d)" #: src/data/pc+-file-reader.c:596 #, c-format msgid "" "Record 0 claims %u cases with %u values per case (requiring at least %zu " "bytes) but data record is only %u bytes long." msgstr "" #: src/data/pc+-file-reader.c:618 #, c-format msgid "" "Value labels claimed to end at offset %u in labels record but labels record " "is only %u bytes." msgstr "" #: src/data/pc+-file-reader.c:629 #, c-format msgid "" "Value labels claimed to be at offset %u with length %u but file size is only " "%u bytes." msgstr "" #: src/data/pc+-file-reader.c:656 #, c-format msgid "" "Value labels end with partial label (%u bytes left in record, label length " "%)." msgstr "" #: src/data/pc+-file-reader.c:669 #, c-format msgid "%u leftover bytes following value labels." msgstr "" #: src/data/pc+-file-reader.c:685 #, c-format msgid "" "Variable label claimed to start at offset %u in labels record but labels " "record is only %u bytes." msgstr "" #: src/data/pc+-file-reader.c:697 #, c-format msgid "" "Variable label with length %u starting at offset %u in labels record " "overruns end of %u-byte labels record." msgstr "" #: src/data/pc+-file-reader.c:719 #, c-format msgid "Record 1 has length %u (expected %u)." msgstr "Kayıtlı 1 uzunlukta %u (beklenen %u)." #: src/data/pc+-file-reader.c:751 #, c-format msgid "Variable %u has invalid type %." msgstr "Değişken %u geçersiz tür %." #: src/data/pc+-file-reader.c:787 #, c-format msgid "Invalid weight index %u." msgstr "Geçersiz ağırlık endeksi %u." #: src/data/pc+-file-reader.c:857 #, c-format msgid "Invalid variable name `%s'." msgstr "`%s' uygun olmayan değişken ismi." #: src/data/pc+-file-reader.c:865 src/data/sys-file-reader.c:1444 #, c-format msgid "Renaming variable with duplicate name `%s' to `%s'." msgstr "Değişkenin yinelenen adı `%s' `%s' ile yeniden adlandırma." #: src/data/pc+-file-reader.c:877 #, c-format msgid "Cannot weight by string variable `%s'." msgstr "Dize değişkeni tarafından `%s' değiştirilemez ağırlık." #: src/data/pc+-file-reader.c:973 src/data/sys-file-reader.c:2762 msgid "File ends in partial case." msgstr "Dosya yarım kalmış bir olay ile bitiyor." #: src/data/pc+-file-reader.c:979 #, c-format msgid "" "Case beginning at offset 0x%08x extends past end of data record at offset 0x" "%08x." msgstr "Mahsup başlangıcı 0x%08x ofsette veri kaydının sonunu uzatır 0x%08x." #: src/data/pc+-file-reader.c:998 src/data/sys-file-reader.c:2770 #, c-format msgid "Error reading case from file %s." msgstr "%s dosyasından olay okunamadı." #: src/data/pc+-file-reader.c:1114 src/data/sys-file-reader.c:2933 #, c-format msgid "" "Possible compressed data corruption: string contains compressed integer " "(opcode %d)." msgstr "" "Mümkün sıkıştırılmış veri bozulması: dize içeren sıkıştırılmış tamsayı " "(opcode %d)." #: src/data/pc+-file-reader.c:1156 src/data/sys-file-reader.c:3234 #, c-format msgid "`%s' near offset 0x%llx: " msgstr "'%s' yakınındaki offset 0x%llx:" #: src/data/pc+-file-reader.c:1159 src/data/sys-file-reader.c:3237 #, c-format msgid "`%s': " msgstr "`%s': " #: src/data/pc+-file-reader.c:1211 src/data/sys-file-reader.c:3288 #, c-format msgid "System error: %s." msgstr "Sistem hatası: %s." #: src/data/pc+-file-reader.c:1216 src/data/sys-file-reader.c:3293 msgid "Unexpected end of file." msgstr "Beklenmedik dosya sonu." #: src/data/pc+-file-reader.c:1301 src/data/sys-file-reader.c:3518 #, c-format msgid "%s: seek failed (%s)." msgstr "%s: arama başarısız oldu (%s)." #: src/data/pc+-file-reader.c:1351 msgid "SPSS/PC+ System File" msgstr "SPSS/PC+ Sistemi Dosya" #: src/data/por-file-reader.c:109 #, c-format msgid "portable file %s corrupt at offset 0x%llx: " msgstr "taşınabilir %s dosyası 0x%llx konumunda bozuk: " #: src/data/por-file-reader.c:136 #, c-format msgid "reading portable file %s at offset 0x%llx: " msgstr "%s taşınabilir dosyası 0x%llx ofsetinden okunuyor: " #: src/data/por-file-reader.c:164 #, c-format msgid "Error closing portable file `%s': %s." msgstr "taşınabilir `%s' dosyası kapatılırken bir hata oluştu: %s." #: src/data/por-file-reader.c:216 msgid "unexpected end of file" msgstr "beklenmeyen dosya sonu" #. TRANSLATORS: this fragment will be interpolated into #. messages in fh_lock() that identify types of files. #: src/data/por-file-reader.c:275 src/data/por-file-writer.c:147 msgid "portable file" msgstr "taşınabilir dosya" #: src/data/por-file-reader.c:283 #, c-format msgid "" "An error occurred while opening `%s' for reading as a portable file: %s." msgstr "" "`%s' bir taşınabilir dosya olarak okuma için açılırken hata oluştu: %s." #: src/data/por-file-reader.c:304 msgid "Data record expected." msgstr "Veri kaydı gerekli." #: src/data/por-file-reader.c:402 msgid "Number expected." msgstr "Sayı bekleniyor." #: src/data/por-file-reader.c:430 msgid "Missing numeric terminator." msgstr "Sayısal sonlandırıcı eksik." #: src/data/por-file-reader.c:453 msgid "Invalid integer." msgstr "Geçersiz tamsayı." #: src/data/por-file-reader.c:464 src/data/por-file-reader.c:484 #, c-format msgid "Bad string length %d." msgstr "Uygunsuz dize uzunluğu %d." #: src/data/por-file-reader.c:547 #, c-format msgid "%s: Not a portable file." msgstr "%s: Bir taşınabilir dosya değil." #: src/data/por-file-reader.c:564 #, c-format msgid "Unrecognized version code `%c'." msgstr "Tanınmayan sürüm kodu `%c'." #: src/data/por-file-reader.c:577 #, c-format msgid "Bad date string length %zu." msgstr "Uygunsuz tarih dizesi uzunluğu %zu." #: src/data/por-file-reader.c:579 #, c-format msgid "Bad time string length %zu." msgstr "Uygunsuz zaman dizesi uzunluğu %zu." #: src/data/por-file-reader.c:630 #, c-format msgid "" "%s: Bad format specifier byte (%d). Variable will be assigned a default " "format." msgstr "" "%s: Kötü biçim belirleyici bayt (% d). Değişken varsayılan bir biçim olarak " "atanacaktır." #: src/data/por-file-reader.c:651 #, c-format msgid "Numeric variable %s has invalid format specifier %s." msgstr "Sayısal değişken %s geçersiz %s biçim belirleyici içeriyor." #: src/data/por-file-reader.c:655 #, c-format msgid "String variable %s with width %d has invalid format specifier %s." msgstr "" "Dize değişkeni %s %d genişliğinde geçersiz %s biçim belirleyicisini içeriyor." #: src/data/por-file-reader.c:679 msgid "Expected variable count record." msgstr "Gerekli değişken sayı kaydı." #: src/data/por-file-reader.c:683 #, c-format msgid "Invalid number of variables %d." msgstr "Geçersiz değişken sayısı %d." #: src/data/por-file-reader.c:692 #, c-format msgid "Weight variable name (%s) truncated." msgstr "Ağırlık değişken adı (%s) kısaltıldı." #: src/data/por-file-reader.c:707 msgid "Expected variable record." msgstr "Gerekli değişken kaydı." #: src/data/por-file-reader.c:711 #, c-format msgid "Invalid variable width %d." msgstr "Geçersiz değişken genişliği %d." #: src/data/por-file-reader.c:719 #, c-format msgid "Invalid variable name `%s' in position %d." msgstr "Geçersiz değişken adı `%s' %d konumunda." #: src/data/por-file-reader.c:723 src/data/sys-file-reader.c:1426 #, c-format msgid "Bad width %d for variable %s." msgstr "Kötü genişlik %d, %s değişkeni için." #: src/data/por-file-reader.c:737 #, c-format msgid "Duplicate variable name %s in position %d renamed to %s." msgstr "" "Kopyalanmış değişken adı %s %d konumunda %s olarak yeniden aldandırıldı." #: src/data/por-file-reader.c:786 #, c-format msgid "Weighting variable %s not present in dictionary." msgstr "Dizinde ağırlık değişkeni %s sözlükte yok." #: src/data/por-file-reader.c:830 #, c-format msgid "Unknown variable %s while parsing value labels." msgstr "Değer etiketleri ayrıştırılırken bilinmeyen %s değişkeni." #: src/data/por-file-reader.c:833 #, c-format msgid "" "Cannot assign value labels to %s and %s, which have different variable types." msgstr "" "Farklı değişken türleri olan %s ve %s değişkenlerine değer etiketleri " "atanamıyor." #: src/data/por-file-reader.c:972 #, fuzzy #| msgid "Portable File" msgid "SPSS Portable File" msgstr "Taşınabilir Dosya" #: src/data/por-file-writer.c:139 #, c-format msgid "Invalid decimal digits count %d. Treating as %d." msgstr "Geçersiz ondalık rakam sayısı %d. %d gibi değişiyor." #: src/data/por-file-writer.c:159 #, c-format msgid "Error opening `%s' for writing as a portable file: %s." msgstr "`%s' dosyası, bir taşınabilir dosya olarak yazmak için açılamadı: %s." #: src/data/por-file-writer.c:505 #, c-format msgid "An I/O error occurred writing portable file `%s'." msgstr "Taşınabilir `%s' dosyasına yazılırken bir girdi/çıktı hatası oluştu." #: src/data/psql-reader.c:48 msgid "" "Support for reading postgres databases was not compiled into this " "installation of PSPP" msgstr "" "Postgres veritabanları okuma için destek PSPP'nin bu kurulumunda " "bulunmamaktadır." #: src/data/psql-reader.c:242 msgid "Memory error whilst opening psql source" msgstr "Psql kaynağı açılırken bellek hatası oluştu" #: src/data/psql-reader.c:248 #, c-format msgid "Error opening psql source: %s." msgstr "Psql kaynağı açılamadı: %s." #: src/data/psql-reader.c:263 #, c-format msgid "" "Postgres server is version %s. Reading from versions earlier than 8.0 is not " "supported." msgstr "" "Postgresql sunucu sürümü %s. Bu sunucunun 8.0 sürümünden daha eski " "sürümlerinden okuma eylemi desteklenmiyor." #: src/data/psql-reader.c:283 msgid "" "Connection is unencrypted, but unencrypted connections have not been " "permitted." msgstr "Bağlantı şifrelenmemiş, şifrelenmemiş bağlantılara izin verilmiyor." #: src/data/psql-reader.c:324 src/data/psql-reader.c:349 #: src/data/psql-reader.c:359 #, c-format msgid "Error from psql source: %s." msgstr "Psql kaynağında hata: %s." #: src/data/psql-reader.c:454 #, c-format msgid "Unsupported OID %d. SYSMIS values will be inserted." msgstr "Desteklenmeyen OID %d. SYSMIS değerleri eklenecek." #: src/data/settings.c:391 msgid "" "MXWARNS set to zero. No further warnings will be given even when " "potentially problematic situations are encountered." msgstr "" "MXWARNS sıfıra ayarlandı. Artık olası sorunlu durumlarda bile bir uyarı " "yapılmayacak." #: src/data/settings.c:398 #, c-format msgid "" "Warnings re-enabled. %d warnings will be issued before aborting syntax " "processing." msgstr "" "Uyarılar yeniden etkinleştirildi. %d uyarıları sözdizim işleminden çıkmadan " "önce bildirilecek." #: src/data/settings.c:618 #, c-format msgid "" "%s: Custom currency string `%s' does not contain exactly three periods or " "commas (or it contains both)." msgstr "" "%s: Özel geçerlilik dizesi `%s' tam olarak üç nokta veya virgül içermiyor " "(ya da ikisini birden içeriyor)." #. TRANSLATORS: this fragment will be interpolated into #. messages in fh_lock() that identify types of files. #: src/data/sys-file-reader.c:407 src/data/sys-file-writer.c:245 msgid "system file" msgstr "sistem dosyası" #: src/data/sys-file-reader.c:414 #, c-format msgid "Error opening `%s' for reading as a system file: %s." msgstr "`%s' dosyası, bir sistem dosyası olarak okumak için açılamadı: %s." #: src/data/sys-file-reader.c:491 msgid "Misplaced type 4 record." msgstr "Tip 4 kaydı yanlış yerleştirildi." #: src/data/sys-file-reader.c:496 msgid "Duplicate type 6 (document) record." msgstr "Tür 6 (belge) kaydını kopyala." #: src/data/sys-file-reader.c:506 src/data/sys-file-reader.c:1343 #, fuzzy, c-format #| msgid "" #| "Unrecognized record type 7, subtype %d. Please send a copy of this file, " #| "and the syntax which created it to %s." msgid "" "Unrecognized record type 7, subtype %d. For help, please send this file to " "%s and mention that you were using %s." msgstr "" "Bilinmeyen kayıt türü 7, alt tür %d. Lütfen bu dosyanın bir kopyasını ve " "kendisini oluşturan söz dizimini %s adresine gönderin." #: src/data/sys-file-reader.c:526 #, c-format msgid "" "Record type 7, subtype %d found here has the same type as the record found " "near offset 0x%llx. For help, please send this file to %s and mention that " "you were using %s." msgstr "" #: src/data/sys-file-reader.c:538 #, c-format msgid "Unrecognized record type %d." msgstr "Bilinmeyen kayıt türü %d." #: src/data/sys-file-reader.c:688 #, c-format msgid "Value Label %zu" msgstr "" #: src/data/sys-file-reader.c:697 msgid "Extra Product Info" msgstr "" #: src/data/sys-file-reader.c:710 #, c-format msgid "Document Line %zu" msgstr "" #: src/data/sys-file-reader.c:718 #, c-format msgid "MRSET %zu" msgstr "" #: src/data/sys-file-reader.c:720 #, c-format msgid "MRSET %zu Label" msgstr "" #: src/data/sys-file-reader.c:725 #, c-format msgid "MRSET %zu Counted Value" msgstr "" #: src/data/sys-file-reader.c:763 #, c-format msgid "" "This system file does not indicate its own character encoding. Using " "default encoding %s. For best results, specify an encoding explicitly. Use " "SYSFILE INFO with ENCODING=\"DETECT\" to analyze the possible encodings." msgstr "" #: src/data/sys-file-reader.c:845 #, c-format msgid "File header claims %d variable positions but %zu were read from file." msgstr "Dosya başlığı %d değişken konumunu istiyor ancak dosyadan %zu okundu." #: src/data/sys-file-reader.c:958 src/data/sys-file-reader.c:972 msgid "This is not an SPSS system file." msgstr "Bu bir SPSS sistem dosyası değil." #: src/data/sys-file-reader.c:1027 msgid "" "Compression bias is not the usual value of 100, or system file uses " "unrecognized floating-point format." msgstr "" #: src/data/sys-file-reader.c:1102 msgid "Variable label indicator field is not 0 or 1." msgstr "Değişken etiketi gösterici alanı 0 ya da 1 değil." #: src/data/sys-file-reader.c:1115 msgid "Numeric missing value indicator field is not -3, -2, 0, 1, 2, or 3." msgstr "Sayısal kayıp değer gösterge alanı -3, -2, 0, 1, 2 veya 3 değildir." #: src/data/sys-file-reader.c:1125 msgid "String missing value indicator field is not 0, 1, 2, or 3." msgstr "Dize kayıp değer gösterge alanı 0, 1, 2 veya 3 değildir." #: src/data/sys-file-reader.c:1152 #, c-format msgid "Invalid number of labels %u." msgstr "" #: src/data/sys-file-reader.c:1185 msgid "" "Variable index record (type 4) does not immediately follow value label " "record (type 3) as it should." msgstr "" #: src/data/sys-file-reader.c:1197 #, c-format msgid "" "Number of variables associated with a value label (%u) is not between 1 and " "the number of variables (%zu)." msgstr "" #: src/data/sys-file-reader.c:1224 #, c-format msgid "Number of document lines (%d) must be greater than 0 and less than %d." msgstr "Belge satır sayısı (%d) 0'dan büyük ve %d sayısından küçük olmalıdır." #: src/data/sys-file-reader.c:1317 #, c-format msgid "Record type 7, subtype %d has bad size %u (expected %d)." msgstr "" #: src/data/sys-file-reader.c:1321 #, c-format msgid "Record type 7, subtype %d has bad count %u (expected %d)." msgstr "" #: src/data/sys-file-reader.c:1435 #, fuzzy, c-format #| msgid "Renaming variable with duplicate name `%s' to `%s'." msgid "Renaming variable with invalid name `%s' to `%s'." msgstr "Değişkenin yinelenen adı `%s' `%s' ile yeniden adlandırma." #: src/data/sys-file-reader.c:1517 msgid "Missing string continuation record." msgstr "Dize devam kaydı eksik." #: src/data/sys-file-reader.c:1550 #, c-format msgid "Variable %s with width %d has invalid print format 0x%x." msgstr "Değişken %s (%d genişlikli) 0x%x geçersiz yazdırma biçimi içeriyor." #: src/data/sys-file-reader.c:1554 #, c-format msgid "Variable %s with width %d has invalid write format 0x%x." msgstr "Değişken %s (%d genişlikli) 0x%x geçersiz yazma biçimi içeriyor." #: src/data/sys-file-reader.c:1559 msgid "Suppressing further invalid format warnings." msgstr "Sonraki geçersiz biçim uyarıları engelleniyor." #: src/data/sys-file-reader.c:1613 #, c-format msgid "" "Floating-point representation indicated by system file (%d) differs from " "expected (%d)." msgstr "" #: src/data/sys-file-reader.c:1629 #, c-format msgid "" "Integer format indicated by system file (%d) differs from expected (%d)." msgstr "" "Sistem dosyası (%d) tarafından tamsayı biçiminin beklenen (%d) biçiminden " "farklı olduğu gösterildi." #: src/data/sys-file-reader.c:1647 src/data/sys-file-reader.c:1653 #, c-format msgid "File specifies unexpected value %g (%a) as %s, instead of %g (%a)." msgstr "" #: src/data/sys-file-reader.c:1662 #, c-format msgid "" "File specifies unexpected value %g (%a) as %s, instead of %g (%a) or %g (%a)." msgstr "" #: src/data/sys-file-reader.c:1714 src/data/sys-file-reader.c:1733 #, c-format msgid "Missing space following `%c' at offset %zu in MRSETS record." msgstr "" #: src/data/sys-file-reader.c:1741 #, fuzzy, c-format #| msgid "Expecting space at offset %zu in MRSETS record." msgid "" "Missing label source value following `E' at offset %zu in MRSETS record." msgstr "MRSETS kaydındaki %zu baskısında boşluk bekleniyor." #: src/data/sys-file-reader.c:1748 #, c-format msgid "" "Unexpected label source value following `E' at offset %zu in MRSETS record." msgstr "" #: src/data/sys-file-reader.c:1755 #, c-format msgid "Missing `C', `D', or `E' at offset %zu in MRSETS record." msgstr "" #: src/data/sys-file-reader.c:1782 #, c-format msgid "Missing new-line parsing variable names at offset %zu in MRSETS record." msgstr "" #: src/data/sys-file-reader.c:1817 #, fuzzy, c-format #| msgid "Invalid variable name `%s'." msgid "Invalid multiple response set name `%s'." msgstr "`%s' uygun olmayan değişken ismi." #: src/data/sys-file-reader.c:1850 #, c-format msgid "MRSET %s contains duplicate variable name %s." msgstr "" #: src/data/sys-file-reader.c:1865 #, c-format msgid "MRSET %s contains both string and numeric variables." msgstr "MRSET %s hem dize hem de sayısal değişkenler içeriyor." #: src/data/sys-file-reader.c:1877 #, c-format msgid "MRSET %s has no variables." msgstr "" #: src/data/sys-file-reader.c:1879 #, c-format msgid "MRSET %s has only one variable." msgstr "" #: src/data/sys-file-reader.c:1923 #, c-format msgid "Extension 11 has bad count %u (for %zu variables)." msgstr "" #: src/data/sys-file-reader.c:1956 #, c-format msgid "" "Invalid variable display parameters for variable %zu (%s). Default " "parameters substituted." msgstr "" "Değişken %zu (%s) için değişken görüntüleme parametreleri geçersiz. Yerine " "öntanımlı parametreler kullanıldı." #: src/data/sys-file-reader.c:2000 #, c-format msgid "Duplicate long variable name `%s'." msgstr "`%s' uzun değişken adını kopyala." #: src/data/sys-file-reader.c:2053 #, c-format msgid "Long variable mapping from %s to invalid variable name `%s'." msgstr "" #: src/data/sys-file-reader.c:2088 #, c-format msgid "%s listed as string of invalid length %s in very long string record." msgstr "" #: src/data/sys-file-reader.c:2099 #, c-format msgid "" "%s listed in very long string record with width %s, which requires only one " "segment." msgstr "" #: src/data/sys-file-reader.c:2107 #, c-format msgid "Very long string %s overflows dictionary." msgstr "Çok uzun olan %s dize sözlükten taşıyor." #: src/data/sys-file-reader.c:2125 #, c-format msgid "" "Very long string with width %ld has segment %d of width %d (expected %d)." msgstr "" #: src/data/sys-file-reader.c:2183 #, fuzzy, c-format #| msgid "Variable index %d not in valid range 1...%zu." msgid "Value label variable index %d not in valid range 1...%zu." msgstr "Değişken dizini %d 1...%zu geçerli aralığında değil." #: src/data/sys-file-reader.c:2193 #, c-format msgid "Value label variable index %d refers to long string continuation." msgstr "" #: src/data/sys-file-reader.c:2208 #, c-format msgid "" "Variables associated with value label are not all of identical type. " "Variable %s is %s, but variable %s is %s." msgstr "" #: src/data/sys-file-reader.c:2226 #, c-format msgid "" "Value labels may not be added to long string variables (e.g. %s) using " "records types 3 and 4." msgstr "" #: src/data/sys-file-reader.c:2255 #, c-format msgid "Duplicate value label for %g on %s." msgstr "%g için %s üzerinde yinelenmiş değer etiketi." #: src/data/sys-file-reader.c:2260 src/data/sys-file-reader.c:2600 #, c-format msgid "Duplicate value label for `%.*s' on %s." msgstr "`%.*s için %s üzerinde yinelenmiş değer etiketi." #: src/data/sys-file-reader.c:2283 #, c-format msgid "Suppressed %d additional warnings for value labels." msgstr "" #: src/data/sys-file-reader.c:2297 #, fuzzy, c-format #| msgid "Variable index %d not in valid range 1...%zu." msgid "" "Weight variable index %d not in valid range 1...%zu. Treating file as " "unweighted." msgstr "Değişken dizini %d 1...%zu geçerli aralığında değil." #: src/data/sys-file-reader.c:2307 #, c-format msgid "" "Weight variable index %d refers to long string continuation. Treating file " "as unweighted." msgstr "" #: src/data/sys-file-reader.c:2315 #, c-format msgid "Ignoring string variable `%s' set as weighting variable." msgstr "" #: src/data/sys-file-reader.c:2352 #, c-format msgid "Error parsing attribute value %s[%d]." msgstr "%s[%d] öznitelik değeri ayrıştırılamadı." #: src/data/sys-file-reader.c:2366 #, c-format msgid "Attribute value %s[%d] is not quoted: %s." msgstr "" #: src/data/sys-file-reader.c:2379 #, fuzzy, c-format #| msgid "Duplicate variable name %s." msgid "Duplicate attribute %s." msgstr "%s değişken adı zaten kullanılıyor." #: src/data/sys-file-reader.c:2463 #, c-format msgid "Invalid role for variable %s." msgstr "Değişken %s için geçersiz rol." #: src/data/sys-file-reader.c:2472 #, c-format msgid "%zu other variables had invalid roles." msgstr "%zu diğer değişkenler geçersiz rollere sahip." #: src/data/sys-file-reader.c:2485 #, fuzzy, c-format msgid "Extension record subtype %d ends unexpectedly." msgstr "Uzun dizgi değer etiketi kaydı beklenmedik bir şekilde sonlandı." #: src/data/sys-file-reader.c:2531 #, c-format msgid "Ignoring long string value label record for unknown variable %s." msgstr "Bilinmeyen değişken %s için uzun dize değer etiketi kaydını yoksay." #: src/data/sys-file-reader.c:2536 #, c-format msgid "Ignoring long string value label record for numeric variable %s." msgstr "Sayısal değişken %s için uzun dize değer etiketi kaydını yoksay." #: src/data/sys-file-reader.c:2543 #, c-format msgid "" "Ignoring long string value label record for variable %s because the record's " "width (%d) does not match the variable's width (%d)." msgstr "" #: src/data/sys-file-reader.c:2573 #, c-format msgid "" "Ignoring long string value label %zu for variable %s, with width %d, that " "has bad value width %zu." msgstr "" #: src/data/sys-file-reader.c:2646 #, c-format msgid "" "Long string missing values record says variable %s has %d missing values, " "but only 1 to 3 missing values are allowed." msgstr "" #: src/data/sys-file-reader.c:2656 #, c-format msgid "Ignoring long string missing value record for unknown variable %s." msgstr "" "Bilinmeyen değişken %s için uzun dize kayıp değer etiketi kaydını yoksay." #: src/data/sys-file-reader.c:2661 #, c-format msgid "Ignoring long string missing value record for numeric variable %s." msgstr "Sayısal değişken %s için uzun dize kayıp değer etiketi kaydını yoksay." #: src/data/sys-file-reader.c:2686 #, c-format msgid "" "Ignoring long string missing value %zu for variable %s, with width %d, that " "has bad value width %zu." msgstr "" #: src/data/sys-file-reader.c:2740 msgid "File ends in partial string value." msgstr "" #: src/data/sys-file-reader.c:2879 msgid "" "Possible compressed data corruption: compressed spaces appear in numeric " "field." msgstr "" #: src/data/sys-file-reader.c:3030 #, c-format msgid "Suppressed %d additional related warnings." msgstr "" #: src/data/sys-file-reader.c:3076 src/data/sys-file-reader.c:3093 #, c-format msgid "Dictionary record refers to unknown variable %s." msgstr "" #: src/data/sys-file-reader.c:3159 #, c-format msgid "Expecting digit at offset %zu in MRSETS record." msgstr "MRSETS kaydındaki %zu baskısında rakam bekleniyor." #: src/data/sys-file-reader.c:3167 #, c-format msgid "Expecting space at offset %zu in MRSETS record." msgstr "MRSETS kaydındaki %zu baskısında boşluk bekleniyor." #: src/data/sys-file-reader.c:3175 #, c-format msgid "%zu-byte string starting at offset %zu exceeds record length %zu." msgstr "" #: src/data/sys-file-reader.c:3185 #, c-format msgid "Expecting space at offset %zu following %zu-byte string." msgstr "" #: src/data/sys-file-reader.c:3476 #, c-format msgid "Wrong ZLIB data header offset %#llx (expected %#llx)." msgstr "" #: src/data/sys-file-reader.c:3484 #, c-format msgid "Impossible ZLIB trailer offset 0x%llx." msgstr "" #: src/data/sys-file-reader.c:3491 #, fuzzy, c-format msgid "Invalid ZLIB trailer length %lld." msgstr "Geçersiz değişken genişliği %d." #: src/data/sys-file-reader.c:3555 #, c-format msgid "End of ZLIB trailer (0x%llx) is not file size (0x%llx)." msgstr "" #: src/data/sys-file-reader.c:3565 #, c-format msgid "ZLIB trailer bias (%lld) differs from file header bias (%.2f)." msgstr "" #: src/data/sys-file-reader.c:3575 #, c-format msgid "ZLIB trailer \"zero\" field has nonzero value %lld." msgstr "" #: src/data/sys-file-reader.c:3581 #, c-format msgid "ZLIB trailer specifies unexpected %u-byte block size." msgstr "" #: src/data/sys-file-reader.c:3589 #, c-format msgid "%lld-byte ZLIB trailer specifies %u data blocks (expected %lld)." msgstr "" #: src/data/sys-file-reader.c:3614 #, c-format msgid "" "ZLIB block descriptor %u reported uncompressed data offset %#llx, when %#llx " "was expected." msgstr "" #: src/data/sys-file-reader.c:3623 #, c-format msgid "" "ZLIB block descriptor %u reported compressed data offset %#llx, when %#llx " "was expected." msgstr "" #: src/data/sys-file-reader.c:3633 #, c-format msgid "" "ZLIB block descriptor %u reported block size %#x, when %#x was expected." msgstr "" #: src/data/sys-file-reader.c:3641 #, c-format msgid "" "ZLIB block descriptor %u reported block size %#x, when at most %#x was " "expected." msgstr "" #: src/data/sys-file-reader.c:3653 #, c-format msgid "" "ZLIB block descriptor %u reports compressed size %u and uncompressed size %u." msgstr "" #: src/data/sys-file-reader.c:3665 #, c-format msgid "" "ZLIB trailer is at offset %#llx but %#llx would be expected from block " "descriptors." msgstr "" #: src/data/sys-file-reader.c:3684 #, c-format msgid "ZLIB initialization failed (%s)." msgstr "" #: src/data/sys-file-reader.c:3699 #, c-format msgid "Inconsistency at end of ZLIB stream (%s)." msgstr "" #: src/data/sys-file-reader.c:3758 #, c-format msgid "ZLIB stream inconsistency (%s)." msgstr "" #: src/data/sys-file-reader.c:3782 msgid "Unexpected end of ZLIB compressed data." msgstr "Beklenmedik ZLIB sıkıştırılmış veri sonu." #: src/data/sys-file-reader.c:3820 #, fuzzy #| msgid "System File" msgid "SPSS System File" msgstr "Sistem Dosyası" #: src/data/sys-file-writer.c:210 #, c-format msgid "Unknown system file version %d. Treating as version %d." msgstr "Bilinmeyen sistem dosyası sürümü %d. %d sürümü gibi değerlendiriliyor." #: src/data/sys-file-writer.c:256 #, c-format msgid "Error opening `%s' for writing as a system file: %s." msgstr "`%s' dosyası, bir sistem dosyası olarak yazmak için açılamadı: %s." #: src/data/sys-file-writer.c:1271 #, c-format msgid "An I/O error occurred writing system file `%s'." msgstr "Sistem dosyası `%s' yazılırken bir girdi/çıktı hatası oluştu." #: src/data/sys-file-writer.c:1378 #, c-format msgid "Failed to initialize ZLIB for compression (%s)." msgstr "" #: src/data/sys-file-writer.c:1407 #, c-format msgid "Failed to complete ZLIB stream compression (%s)." msgstr "" #: src/data/sys-file-writer.c:1449 #, c-format msgid "ZLIB stream compression failed (%s)." msgstr "ZLIB sıkıştırma başarısız oldu (%s)." #: src/data/sys-file-writer.c:1491 #, c-format msgid "%s: Seek failed (%s)." msgstr "%s: Arama başarısız oldu (%s)." #: src/data/variable.c:58 msgid "Left" msgstr "Sol" #: src/data/variable.c:59 msgid "Right" msgstr "Sağ" #: src/data/variable.c:60 msgid "Center" msgstr "Orta" #: src/data/variable.c:66 msgid "Nominal" msgstr "Sınıfsal" #: src/data/variable.c:67 msgid "Ordinal" msgstr "Sırasal" #: src/data/variable.c:68 src/language/stats/ks-one-sample.c:300 msgid "Scale" msgstr "Ölçek" #: src/data/variable.c:74 msgid "Input" msgstr "Girdi" #. TRANSLATORS: This will be part of a filename. Please avoid whitespace. #: src/data/variable.c:75 src/output/spv/spv-writer.c:213 #: src/ui/gui/psppire-output-window.c:547 msgid "Output" msgstr "Çıktı" #: src/data/variable.c:76 msgid "Both" msgstr "Her ikisi de" #: src/data/variable.c:77 src/language/dictionary/sys-file-info.c:237 #: src/ui/gui/psppire-dialog-action-crosstabs.c:86 #: src/ui/gui/psppire-dialog-action-crosstabs.c:98 #: src/ui/gui/psppire-dialog-action-crosstabs.c:133 #: src/ui/gui/psppire-dialog-action-crosstabs.c:141 #: src/ui/gui/psppire-variable-sheet.c:408 src/ui/gui/var-display.c:34 msgid "None" msgstr "Hiçbiri" #: src/data/variable.c:78 msgid "Partition" msgstr "Bölüm" #: src/data/variable.c:79 src/ui/gui/reliability.ui:37 msgid "Split" msgstr "Böl" #: src/data/variable.c:729 #, c-format msgid "%s (%s)" msgstr "" #: src/data/variable.c:1339 msgid "" "At least one case in the data file had a weight value that was user-missing, " "system-missing, zero, or negative. These case(s) were ignored." msgstr "" "Veri dosyasında en az bir vaka kullanıcı kaybı, sistem kaybı, sıfır veya " "negatif değer ağırlığına sahip. Bu vaka(lar) yoksayıldı." #: src/language/command.c:207 src/language/stats/graph.c:749 #: src/language/stats/graph.c:755 src/language/stats/graph.c:789 #: src/language/stats/graph.c:794 src/language/stats/graph.c:799 #: src/language/stats/graph.c:852 src/language/stats/graph.c:857 #: src/language/stats/graph.c:862 src/language/stats/graph.c:867 #: src/language/stats/graph.c:872 src/language/stats/graph.c:877 #: src/language/stats/graph.c:882 src/language/utilities/set.q:236 #, c-format msgid "%s is not yet implemented." msgstr "%s henüz eklenmedi." #: src/language/command.c:212 #, c-format msgid "%s may be used only in testing mode." msgstr "%s sadece deneme kipinde kullanılabilir." #: src/language/command.c:217 #, c-format msgid "%s may be used only in enhanced syntax mode." msgstr "%s sadece gelişmiş sözdizimi kipinde kullanılabilir." #: src/language/command.c:345 msgid "expecting command name" msgstr "komut adı bekleniyor" #: src/language/command.c:347 #, c-format msgid "Unknown command `%s'." msgstr "Bilinmeyen `%s' komutu." #: src/language/command.c:380 #, c-format msgid "%s is allowed only before the active dataset has been defined." msgstr "" "%s komutuna sadece etkin bir veri seti belirtilmeden önce izin verilir." #: src/language/command.c:384 #, c-format msgid "%s is allowed only after the active dataset has been defined." msgstr "" "%s komutuna sadece etkin bir veri seti belirtildikten sonra izin verilir." #: src/language/command.c:388 src/language/command.c:392 #, c-format msgid "%s is allowed only inside %s." msgstr "" #: src/language/command.c:399 src/language/command.c:403 #, c-format msgid "" "%s is allowed only before the active dataset has been defined or inside %s." msgstr "" #: src/language/command.c:407 src/language/command.c:411 #, c-format msgid "" "%s is allowed only after the active dataset has been defined or inside %s." msgstr "" #: src/language/command.c:415 #, c-format msgid "%s is allowed only inside %s or inside %s." msgstr "" #: src/language/command.c:421 #, c-format msgid "" "%s is allowed only after the active dataset has been defined, inside INPUT " "PROGRAM, or inside FILE TYPE." msgstr "" #: src/language/command.c:426 #, c-format msgid "" "%s is allowed only before the active dataset has been defined, inside INPUT " "PROGRAM, or inside FILE TYPE." msgstr "" #: src/language/command.c:444 src/language/command.c:447 #, c-format msgid "%s is not allowed inside %s." msgstr "%s komutuna %s içerisinde izin verilmiyor." #: src/language/command.c:529 src/language/utilities/host.c:272 #: src/language/utilities/permissions.c:105 #, c-format msgid "This command not allowed when the %s option is set." msgstr "" #: src/language/command.c:545 #, c-format msgid "Error removing `%s': %s." msgstr "`%s' kaldırılamadı: %s." #: src/language/lexer/lexer.c:296 #, c-format msgid "expecting %s" msgstr "%s bekleniyor" #: src/language/lexer/lexer.c:300 #, c-format msgid "expecting %s or %s" msgstr "%s veya %s bekleniyor" #: src/language/lexer/lexer.c:304 #, c-format msgid "expecting %s, %s, or %s" msgstr " %s, %s veya %s bekleniyor" #: src/language/lexer/lexer.c:309 #, c-format msgid "expecting %s, %s, %s, or %s" msgstr "%s, %s, %s veya %s bekleniyor" #: src/language/lexer/lexer.c:314 #, c-format msgid "expecting %s, %s, %s, %s, or %s" msgstr "%s, %s, %s, %s veya %s bekleniyor" #: src/language/lexer/lexer.c:319 #, c-format msgid "expecting %s, %s, %s, %s, %s, or %s" msgstr "%s, %s, %s, %s, %s veya %s bekleniyor" #: src/language/lexer/lexer.c:325 #, c-format msgid "expecting %s, %s, %s, %s, %s, %s, or %s" msgstr "%s, %s, %s, %s, %s, %s veya %s bekleniyor" #: src/language/lexer/lexer.c:331 #, c-format msgid "expecting %s, %s, %s, %s, %s, %s, %s, or %s" msgstr "%s, %s, %s, %s, %s, %s, %s veya %s bekleniyor" #: src/language/lexer/lexer.c:351 #, c-format msgid "Subcommand %s may only be specified once." msgstr "%s alt komutu sadece bir kez belirtilebilir." #: src/language/lexer/lexer.c:363 #, c-format msgid "Required subcommand %s was not specified." msgstr "Gerekli olan %s alt komutu belirtilmedi." #: src/language/lexer/lexer.c:371 #, c-format msgid "%s may only be specified once within subcommand %s" msgstr "%s , %s alt komutunda sadece bir kez belirlenebilir" #: src/language/lexer/lexer.c:380 #, c-format msgid "Required %s specification missing from %s subcommand" msgstr "" #: src/language/lexer/lexer.c:399 msgid "Syntax error at end of input" msgstr "Girdinin sonunda sözdizimi hatası" #: src/language/lexer/lexer.c:420 src/language/xforms/select-if.c:60 #: src/language/stats/autorecode.c:206 src/language/stats/npar.c:503 #: src/language/data-io/print-space.c:83 msgid "expecting end of command" msgstr "komut sonu bekleniyor" #: src/language/lexer/lexer.c:631 msgid "expecting string" msgstr "dize bekleniyor" #: src/language/lexer/lexer.c:660 msgid "expecting integer" msgstr "tamsayı bekleniyor" #: src/language/lexer/lexer.c:673 msgid "expecting number" msgstr "sayı bekleniyor" #: src/language/lexer/lexer.c:685 msgid "expecting identifier" msgstr "tanımlayıcı bekleniyor" #: src/language/lexer/lexer.c:1272 msgid "Syntax error at end of command" msgstr "Komut sonunda sözdizimi hatası" #: src/language/lexer/lexer.c:1281 #, c-format msgid "Syntax error at `%s'" msgstr "`%s' satırında sözdizimi hatası" #: src/language/lexer/lexer.c:1284 msgid "Syntax error" msgstr "Sözdizimi hatası" #: src/language/lexer/lexer.c:1470 #, c-format msgid "String of hex digits has %d characters, which is not a multiple of 2" msgstr "" #: src/language/lexer/lexer.c:1477 #, c-format msgid "`%c' is not a valid hex digit" msgstr "" #: src/language/lexer/lexer.c:1482 #, c-format msgid "" "Unicode string contains %d bytes, which is not in the valid range of 1 to 8 " "bytes" msgstr "" #: src/language/lexer/lexer.c:1488 #, c-format msgid "U+%04X is not a valid Unicode code point" msgstr "" #: src/language/lexer/lexer.c:1493 msgid "Unterminated string constant" msgstr "Sonlandırılmamış dize sabiti" #: src/language/lexer/lexer.c:1497 #, c-format msgid "Missing exponent following `%s'" msgstr "" #: src/language/lexer/lexer.c:1502 msgid "Unexpected `.' in middle of command" msgstr "Komutun ortasında beklenmedik `.'" #: src/language/lexer/lexer.c:1508 #, c-format msgid "Bad character %s in input" msgstr "Girdide uygun olmayan %s karakteri" #: src/language/lexer/lexer.c:1603 #, c-format msgid "Opening `%s': %s." msgstr "`%s' açılıyor: %s." #: src/language/lexer/lexer.c:1647 #, c-format msgid "Error closing `%s': %s." msgstr "`%s' kapatılamadı: %s." #: src/language/lexer/subcommand-list.c:118 #, c-format msgid "No more than %d %s subcommands allowed." msgstr "%d %s taneden fazla alt komuta izin verilmiyor." #: src/language/lexer/format-parser.c:77 msgid "expecting valid format specifier" msgstr "geçerli biçim belirteci bekleniyor" #: src/language/lexer/format-parser.c:116 #: src/language/lexer/format-parser.c:143 src/language/utilities/output.c:108 #: src/language/data-io/data-list.c:453 src/language/data-io/get-data.c:638 #: src/language/data-io/placement-parser.c:236 #, c-format msgid "Unknown format type `%s'." msgstr "`%s' bilinmeyen biçim türü." #: src/language/lexer/format-parser.c:122 #, c-format msgid "Format specifier `%s' lacks required width." msgstr "" #: src/language/lexer/format-parser.c:138 msgid "expecting format type" msgstr "beklenen biçim türü" #: src/language/lexer/value-parser.c:66 #, c-format msgid "" "The high end of the range (%.*g) is below the low end (%.*g). The range " "will be treated as if reversed." msgstr "" #: src/language/lexer/value-parser.c:74 #, c-format msgid "Ends of range are equal (%.*g)." msgstr "" #: src/language/lexer/value-parser.c:82 #, c-format msgid "%s or %s must be part of a range." msgstr "" #: src/language/lexer/value-parser.c:112 msgid "System-missing value is not valid here." msgstr "Sistem kayıp değeri burada geçersiz." #: src/language/lexer/variable-parser.c:86 utilities/pspp-convert.c:83 msgid "expecting variable name" msgstr "değişken adı bekleniyor" #: src/language/lexer/variable-parser.c:96 #, c-format msgid "%s is not a variable name." msgstr "%s bir değişken adı değil." #: src/language/lexer/variable-parser.c:206 #, c-format msgid "" "%s is not a numeric variable. It will not be included in the variable list." msgstr "%s bir sayısal değişken değil. Değişken listesinde içerilmeyecek." #: src/language/lexer/variable-parser.c:209 #, c-format msgid "" "%s is not a string variable. It will not be included in the variable list." msgstr "%s bir dize değişken değil. Değişken listesinde içerilmeyecek." #: src/language/lexer/variable-parser.c:213 #, c-format msgid "Scratch variables (such as %s) are not allowed here." msgstr "Rastgele değişkenlere (%s gibi) burada izin verilmiyor." #: src/language/lexer/variable-parser.c:217 #, c-format msgid "" "%s and %s are not the same type. All variables in this variable list must " "be of the same type. %s will be omitted from the list." msgstr "" "%s ve %s aynı tür değil. Bu değişken listesindeki tüm değişkenler aynı türde " "olmalıdır. %s listeden çıkarılacak." #: src/language/lexer/variable-parser.c:223 #, c-format msgid "" "%s and %s are string variables with different widths. All variables in this " "variable list must have the same width. %s will be omitted from the list." msgstr "" "%s ve %s değişkenleri farklı genişlikteki dize değişkenleri. Bu listedeki " "tüm değişkenler aynı genişlikte olmalıdır. %s değişkeni listeden " "çıkartılacak." #: src/language/lexer/variable-parser.c:228 #: src/language/lexer/variable-parser.c:447 #, c-format msgid "Variable %s appears twice in variable list." msgstr "%s değişkeni değişken listesinde iki kez kullanılmış." #: src/language/lexer/variable-parser.c:341 #, c-format msgid "%s TO %s is not valid syntax since %s precedes %s in the dictionary." msgstr "" #: src/language/lexer/variable-parser.c:349 #, c-format msgid "" "When using the TO keyword to specify several variables, both variables must " "be from the same variable dictionaries, of either ordinary, scratch, or " "system variables. %s is a %s variable, whereas %s is %s." msgstr "" #: src/language/lexer/variable-parser.c:424 #, c-format msgid "`%s' cannot be used with TO because it does not end in a digit." msgstr "" #: src/language/lexer/variable-parser.c:432 #, c-format msgid "Numeric suffix on `%s' is larger than supported with TO." msgstr "" #: src/language/lexer/variable-parser.c:505 msgid "Scratch variables not allowed here." msgstr "Rastgele değişkenlere burada izin verilmiyor." #: src/language/lexer/variable-parser.c:529 msgid "Prefixes don't match in use of TO convention." msgstr "" #: src/language/lexer/variable-parser.c:534 msgid "Bad bounds in use of TO convention." msgstr "" #: src/language/xforms/compute.c:150 src/language/xforms/compute.c:205 #, c-format msgid "" "When executing COMPUTE: SYSMIS is not a valid value as an index into vector " "%s." msgstr "" #: src/language/xforms/compute.c:154 src/language/xforms/compute.c:212 #, c-format msgid "" "When executing COMPUTE: %.*g is not a valid value as an index into vector %s." msgstr "" #: src/language/xforms/compute.c:356 #, c-format msgid "There is no vector named %s." msgstr "%s isimli vektör yok." #: src/language/xforms/count.c:125 msgid "Destination cannot be a string variable." msgstr "Hedef, bir dize değişken olamaz." #: src/language/xforms/sample.c:76 msgid "The sampling factor must be between 0 and 1 exclusive." msgstr "" #: src/language/xforms/sample.c:96 #, c-format msgid "Cannot sample %d observations from a population of %d." msgstr "%d nüfusundan %d gözlemleri örneklenemez." #: src/language/xforms/recode.c:261 msgid "" "Inconsistent target variable types. Target variables must be all numeric or " "all string." msgstr "" "Tutarsız hedef değişken türü. Hedef değişkenlerin tümü sayısal ya da dize " "değişken olmalıdır." #: src/language/xforms/recode.c:282 msgid "CONVERT requires string input values and numeric output values." msgstr "DÖNÜŞTÜR dize giriş değerleri ve sayısal çıkış değerleri gerektirir." #: src/language/xforms/recode.c:339 #, c-format msgid "%s is not allowed with string variables." msgstr "" #: src/language/xforms/recode.c:422 msgid "expecting output value" msgstr "çıktı değeri bekleniyor" #: src/language/xforms/recode.c:479 #, c-format msgid "" "%zu variable(s) cannot be recoded into %zu variable(s). Specify the same " "number of variables as source and target variables." msgstr "" #: src/language/xforms/recode.c:494 #, c-format msgid "" "There is no variable named %s. (All string variables specified on INTO must " "already exist. Use the STRING command to create a string variable.)" msgstr "" #: src/language/xforms/recode.c:510 #, c-format msgid "INTO is required with %s input values and %s output values." msgstr "" #: src/language/xforms/recode.c:523 #, c-format msgid "Type mismatch. Cannot store %s data in %s variable %s." msgstr "" #: src/language/xforms/recode.c:566 #, c-format msgid "" "Cannot recode because the variable %s would require a width of %d bytes or " "greater, but it has a width of only %d bytes." msgstr "" #: src/language/xforms/select-if.c:100 msgid "Syntax error expecting OFF or BY. Turning off case filtering." msgstr "" #: src/language/xforms/select-if.c:115 msgid "The filter variable must be numeric." msgstr "Filtre değişkeni sayısal olmalıdır." #: src/language/xforms/select-if.c:121 msgid "The filter variable may not be scratch." msgstr "" #: src/language/control/control-stack.c:49 #, c-format msgid "%s without %s." msgstr "%s, %s olmaksızın." #: src/language/control/control-stack.c:77 #, c-format msgid "This command must appear inside %s...%s, without intermediate %s...%s." msgstr "" #: src/language/control/control-stack.c:94 #, c-format msgid "This command cannot appear outside %s...%s." msgstr "" #: src/language/control/do-if.c:180 #, c-format msgid "This command may not follow %s in %s ... %s." msgstr "" #: src/language/control/loop.c:211 msgid "Only one index clause may be specified." msgstr "Sadece bir tane dizin tümcesi belirtilebilir." #: src/language/control/repeat.c:120 #, c-format msgid "Dummy variable name `%s' hides dictionary variable `%s'." msgstr "Yapay değişken adı `%s' `%s' sözlük değişkenini gizledi." #: src/language/control/repeat.c:126 #, c-format msgid "Dummy variable name `%s' is given twice." msgstr "Yapay değişken adı `%s' iki kere verildi." #: src/language/control/repeat.c:170 #, c-format msgid "" "Dummy variable `%s' had %zu substitutions, so `%s' must also, but %zu were " "specified." msgstr "" #: src/language/control/repeat.c:379 msgid "Ranges may only have integer bounds." msgstr "Aralıklar sadece tam sayı sınırlarına sahip olmalıdır." #: src/language/control/repeat.c:393 #, c-format msgid "%ld TO %ld is an invalid range." msgstr "%ld ile %ld arası geçersiz bir aralıktır." #: src/language/control/repeat.c:443 #, c-format msgid "No matching %s." msgstr "" #: src/language/control/temporary.c:44 msgid "" "This command may only appear once between procedures and procedure-like " "commands." msgstr "" #: src/language/dictionary/attributes.c:104 msgid "Attribute array index must be between 1 and 65535." msgstr "" #: src/language/dictionary/apply-dictionary.c:74 #, c-format msgid "Variable %s is %s in target file, but %s in source file." msgstr "" #: src/language/dictionary/apply-dictionary.c:110 msgid "No matching variables found between the source and target files." msgstr "Kaynak ve hedef dosyalar arasında eşleşen değişken yok." #: src/language/dictionary/delete-variables.c:40 #: src/language/dictionary/modify-variables.c:79 #: src/language/dictionary/rename-variables.c:51 #, c-format msgid "" "%s may not be used after %s. Temporary transformations will be made " "permanent." msgstr "" #: src/language/dictionary/delete-variables.c:48 #: src/language/dictionary/modify-variables.c:312 #, c-format msgid "" "%s may not be used to delete all variables from the active dataset " "dictionary. Use %s instead." msgstr "" #: src/language/dictionary/missing-values.c:70 #, c-format msgid "" "Cannot mix numeric variables (e.g. %s) and string variables (e.g. %s) within " "a single list." msgstr "" #: src/language/dictionary/missing-values.c:91 msgid "" "Too many numeric missing values. At most three individual values or one " "value and one range are allowed." msgstr "" #: src/language/dictionary/missing-values.c:126 #, c-format msgid "Truncating missing value to maximum acceptable length (%d bytes)." msgstr "" #: src/language/dictionary/missing-values.c:137 msgid "" "Too many string missing values. At most three individual values are allowed." msgstr "" #: src/language/dictionary/missing-values.c:154 #, c-format msgid "Missing values provided are too long to assign to variable of width %d." msgstr "" #: src/language/dictionary/modify-variables.c:145 msgid "Cannot specify ALL after specifying a set of variables." msgstr "" #: src/language/dictionary/modify-variables.c:221 #: src/language/dictionary/rename-variables.c:76 #, c-format msgid "" "Differing number of variables in old name list (%zu) and in new name list " "(%zu)." msgstr "" #: src/language/dictionary/modify-variables.c:244 #: src/language/dictionary/modify-variables.c:294 #, c-format msgid "" "%s subcommand may be given at most once. It may not be given in conjunction " "with the %s subcommand." msgstr "" #: src/language/dictionary/modify-variables.c:331 #, c-format msgid "Unrecognized subcommand name `%s'." msgstr "Tanınmayan alt komut adı `%s'." #: src/language/dictionary/modify-variables.c:334 msgid "Subcommand name expected." msgstr "Alt komut adı bekleniyor." #: src/language/dictionary/mrsets.c:117 #, c-format msgid "" "VARIABLES specified only variable %s on %s, but at least two variables are " "required." msgstr "" #: src/language/dictionary/mrsets.c:150 msgid "Numeric VALUE must be an integer." msgstr "Sayısal DEĞER bir tamsayı olmalıdır." #: src/language/dictionary/mrsets.c:230 src/language/dictionary/mrsets.c:268 #, c-format msgid "" "MDGROUP subcommand for group %s specifies a string VALUE, but the variables " "specified for this group are numeric." msgstr "" #: src/language/dictionary/mrsets.c:254 #, c-format msgid "" "VALUE string on MDGROUP subcommand for group %s is %d bytes long, but it " "must be no longer than the narrowest variable in the group, which is %s with " "a width of %d bytes." msgstr "" #: src/language/dictionary/mrsets.c:280 #, c-format msgid "" "MDGROUP subcommand for group %s specifies LABELSOURCE=VARLABEL but not " "CATEGORYLABELS=COUNTEDVALUES. Ignoring LABELSOURCE." msgstr "" #: src/language/dictionary/mrsets.c:286 #, c-format msgid "" "MDGROUP subcommand for group %s specifies both LABEL and LABELSOURCE, but " "only one of these subcommands may be used at a time. Ignoring LABELSOURCE." msgstr "" #: src/language/dictionary/mrsets.c:326 #, c-format msgid "" "Variables %s and %s specified as part of multiple dichotomy group %s have " "the same variable label. Categories represented by these variables will not " "be distinguishable in output." msgstr "" #: src/language/dictionary/mrsets.c:356 #, c-format msgid "" "Variable %s specified as part of multiple dichotomy group %s (which has " "CATEGORYLABELS=COUNTEDVALUES) has no value label for its counted value. " "This category will not be distinguishable in output." msgstr "" #: src/language/dictionary/mrsets.c:369 #, c-format msgid "" "Variables %s and %s specified as part of multiple dichotomy group %s (which " "has CATEGORYLABELS=COUNTEDVALUES) have the same value label for the group's " "counted value. These categories will not be distinguishable in output." msgstr "" #: src/language/dictionary/mrsets.c:426 #, c-format msgid "" "Variables specified on MCGROUP should have the same categories, but %s and " "%s (and possibly others) in multiple category group %s have different value " "labels for value %s." msgstr "" #: src/language/dictionary/mrsets.c:484 #, c-format msgid "No multiple response set named %s." msgstr "" #: src/language/dictionary/mrsets.c:533 msgid "" "The active dataset dictionary does not contain any multiple response sets." msgstr "" #: src/language/dictionary/mrsets.c:540 msgid "Multiple Response Sets" msgstr "" #: src/language/dictionary/mrsets.c:543 #: src/language/dictionary/sys-file-info.c:446 #: src/language/dictionary/sys-file-info.c:733 #: src/language/stats/autorecode.c:375 src/language/data-io/data-parser.c:679 #: src/language/data-io/data-parser.c:725 src/language/data-io/print.c:434 #, fuzzy #| msgid "Attribute" msgid "Attributes" msgstr "Öznitelik" #: src/language/dictionary/mrsets.c:544 #: src/language/dictionary/sys-file-info.c:191 #: src/language/dictionary/sys-file-info.c:301 #: src/language/dictionary/sys-file-info.c:302 #: src/language/dictionary/sys-file-info.c:455 #: src/language/dictionary/sys-file-info.c:570 #: src/ui/gui/psppire-var-sheet-header.c:67 src/ui/gui/compute.ui:157 msgid "Label" msgstr "Etiket" #: src/language/dictionary/mrsets.c:544 #: src/language/dictionary/sys-file-info.c:241 #, fuzzy #| msgid "Locale Encoding" msgid "Encoding" msgstr "Yerel Kodlama" #: src/language/dictionary/mrsets.c:544 #, fuzzy #| msgid "Counted value" msgid "Counted Value" msgstr "Sayılan değer" #: src/language/dictionary/mrsets.c:544 #, fuzzy #| msgid "Cl_ear Variables" msgid "Member Variables" msgstr "Değişkenleri _Temizle" #: src/language/dictionary/mrsets.c:547 #: src/language/dictionary/sys-file-info.c:470 #: src/ui/gui/psppire-var-sheet-header.c:55 msgid "Name" msgstr "İsim" #: src/language/dictionary/mrsets.c:564 msgid "Dichotomies" msgstr "" #: src/language/dictionary/mrsets.c:565 src/language/stats/logistic.c:1391 #, fuzzy #| msgid "Category" msgid "Categories" msgstr "Kategori" #: src/language/dictionary/numeric.c:67 #, c-format msgid "Format type %s may not be used with a numeric variable." msgstr "" #: src/language/dictionary/numeric.c:86 src/language/dictionary/numeric.c:153 #, c-format msgid "There is already a variable named %s." msgstr "%s isimli bir değişken zaten var." #: src/language/dictionary/numeric.c:138 #, c-format msgid "Format type %s may not be used with a string variable." msgstr "" #: src/language/dictionary/rename-variables.c:92 #, c-format msgid "Renaming would duplicate variable name %s." msgstr "" #: src/language/dictionary/split-file.c:75 #, fuzzy #| msgid "Split File" msgid "Split Values" msgstr "Dosyayı Böl" #: src/language/dictionary/split-file.c:76 #: src/language/dictionary/split-file.c:77 #: src/language/dictionary/sys-file-info.c:696 #: src/language/stats/chisquare.c:195 src/language/stats/cochran.c:156 #: src/language/stats/cochran.c:185 src/language/stats/examine.c:841 #: src/language/stats/reliability.c:648 src/language/stats/reliability.c:651 #: src/language/stats/crosstabs.q:1303 src/language/stats/crosstabs.q:1325 #: src/language/stats/crosstabs.q:1365 src/language/stats/crosstabs.q:1412 msgid "Value" msgstr "Değer" #: src/language/dictionary/split-file.c:79 #: src/language/dictionary/sys-file-info.c:734 #: src/language/stats/chisquare.c:246 src/language/stats/chisquare.c:328 #: src/language/stats/cochran.c:164 src/language/stats/correlations.c:100 #: src/language/stats/descriptives.c:1004 src/language/stats/friedman.c:226 #: src/language/stats/jonckheere-terpstra.c:377 #: src/language/stats/npar-summary.c:113 src/language/stats/quick-cluster.c:588 #: src/language/stats/runs.c:331 src/language/data-io/data-parser.c:683 #: src/language/data-io/data-parser.c:728 src/language/data-io/print.c:438 #: src/ui/gui/psppire-dictview.c:580 src/ui/gui/psppire-data-editor.c:502 msgid "Variable" msgstr "Değişken" #: src/language/dictionary/sys-file-info.c:184 #, fuzzy #| msgid "Variable Information:" msgid "File Information" msgstr "Değişken Bilgileri:" #: src/language/dictionary/sys-file-info.c:185 msgid "Attribute" msgstr "Öznitelik" #: src/language/dictionary/sys-file-info.c:187 #, fuzzy #| msgid "File:" msgid "File" msgstr "Dosya:" #: src/language/dictionary/sys-file-info.c:194 #, fuzzy #| msgid "Created:" msgid "Created" msgstr "Oluşturulma zamanı:" #: src/language/dictionary/sys-file-info.c:203 #, fuzzy #| msgid "Integer Format:" msgid "Integer Format" msgstr "Tamsayı Biçimi:" #: src/language/dictionary/sys-file-info.c:205 msgid "Big Endian" msgstr "Big Endian" #: src/language/dictionary/sys-file-info.c:206 msgid "Little Endian" msgstr "Little Endian" #: src/language/dictionary/sys-file-info.c:207 #: src/language/dictionary/sys-file-info.c:216 #: src/language/dictionary/sys-file-info.c:223 src/language/utilities/set.q:930 msgid "Unknown" msgstr "Bilinmeyen" #: src/language/dictionary/sys-file-info.c:209 #, fuzzy #| msgid "Real Format:" msgid "Real Format" msgstr "Gerçek Biçim:" #: src/language/dictionary/sys-file-info.c:211 msgid "IEEE 754 LE." msgstr "IEEE 754 LE." #: src/language/dictionary/sys-file-info.c:212 msgid "IEEE 754 BE." msgstr "IEEE 754 BE." #: src/language/dictionary/sys-file-info.c:213 msgid "VAX D." msgstr "VAX D." #: src/language/dictionary/sys-file-info.c:214 msgid "VAX G." msgstr "VAX G." #: src/language/dictionary/sys-file-info.c:215 msgid "IBM 390 Hex Long." msgstr "IBM 390 Hex Long." #: src/language/dictionary/sys-file-info.c:218 #: src/language/dictionary/sys-file-info.c:443 #: src/language/stats/binomial.c:199 src/language/stats/correlations.c:131 #: src/language/stats/correlations.c:159 src/language/stats/descriptives.c:585 #: src/language/stats/factor.c:1658 src/language/stats/factor.c:1701 #: src/language/stats/factor.c:1860 src/language/stats/factor.c:2074 #: src/language/stats/frequencies.c:1583 #: src/language/stats/kruskal-wallis.c:254 #: src/language/stats/kruskal-wallis.c:303 #: src/language/stats/ks-one-sample.c:316 src/language/stats/logistic.c:1187 #: src/language/stats/mann-whitney.c:254 src/language/stats/means.c:718 #: src/language/stats/means.c:800 src/language/stats/median.c:358 #: src/language/stats/oneway.c:985 src/language/stats/oneway.c:1157 #: src/language/stats/reliability.c:591 src/language/stats/regression.c:924 #: src/language/stats/t-test-one-sample.c:132 #: src/language/stats/t-test-paired.c:157 src/language/data-io/list.c:104 #: src/ui/gui/variable-info.ui:25 msgid "Variables" msgstr "Değişkenler" #: src/language/dictionary/sys-file-info.c:221 src/language/stats/examine.c:929 #: src/language/stats/means.c:697 src/language/stats/reliability.c:548 #: src/language/stats/crosstabs.q:930 msgid "Cases" msgstr "Vakalar" #: src/language/dictionary/sys-file-info.c:226 src/language/stats/oneway.c:980 #: src/ui/gui/psppire-var-sheet-header.c:58 src/ui/gui/compute.ui:303 msgid "Type" msgstr "Tür" #: src/language/dictionary/sys-file-info.c:230 #, fuzzy #| msgid "Weight:" msgid "Weight" msgstr "Ağırlık:" #: src/language/dictionary/sys-file-info.c:233 #, fuzzy #| msgid "Not weighted." msgid "Not weighted" msgstr "Ağırlıklandırılmamış." #: src/language/dictionary/sys-file-info.c:235 #, fuzzy #| msgid "Compression:" msgid "Compression" msgstr "Sıkıştırma:" #: src/language/dictionary/sys-file-info.c:245 #: src/language/dictionary/sys-file-info.c:424 #: src/language/dictionary/sys-file-info.c:426 #, fuzzy #| msgid "Comments:" msgid "Documents" msgstr "Açıklamalar:" #: src/language/dictionary/sys-file-info.c:305 #: src/language/dictionary/sys-file-info.c:430 msgid "(none)" msgstr "" #: src/language/dictionary/sys-file-info.c:393 msgid "No variables to display." msgstr "Gösterilecek değişken yok." #: src/language/dictionary/sys-file-info.c:404 msgid "Macros not supported." msgstr "Makrolar desteklenmiyor." #: src/language/dictionary/sys-file-info.c:426 msgid "Document" msgstr "" #: src/language/dictionary/sys-file-info.c:454 msgid "Position" msgstr "Konum" #: src/language/dictionary/sys-file-info.c:456 #, fuzzy #| msgid "Measurement Level: %s\n" msgid "Measurement Level" msgstr "Ölçü Düzeyi: %s\n" #: src/language/dictionary/sys-file-info.c:457 #: src/ui/gui/psppire-var-sheet-header.c:85 msgid "Role" msgstr "Rol" #: src/language/dictionary/sys-file-info.c:458 #: src/ui/gui/psppire-var-sheet-header.c:61 src/ui/gui/compute.ui:215 msgid "Width" msgstr "Genişlik" #: src/language/dictionary/sys-file-info.c:459 #, fuzzy #| msgid "Align" msgid "Alignment" msgstr "Yerleşim" #: src/language/dictionary/sys-file-info.c:460 #: src/language/dictionary/sys-file-info.c:734 msgid "Print Format" msgstr "Yazdırma Biçimi" #: src/language/dictionary/sys-file-info.c:461 #, fuzzy #| msgid "Print Format" msgid "Write Format" msgstr "Yazdırma Biçimi" #: src/language/dictionary/sys-file-info.c:462 #: src/ui/gui/missing-val-dialog.c:379 src/ui/gui/psppire-var-sheet-header.c:73 #: src/ui/gui/examine.ui:416 src/ui/gui/t-test.ui:105 msgid "Missing Values" msgstr "Eksik Değerler" #: src/language/dictionary/sys-file-info.c:567 #: src/ui/gui/psppire-var-sheet-header.c:70 src/ui/gui/val-labs-dialog.c:489 #: src/ui/gui/val-labs-dialog.ui:194 msgid "Value Labels" msgstr "Değer Etiketleri" #: src/language/dictionary/sys-file-info.c:573 #, fuzzy #| msgid "Variable View" msgid "Variable Value" msgstr "Değişken Görünümü" #: src/language/dictionary/sys-file-info.c:577 #, fuzzy #| msgid "Last non-missing value" msgid "User-missing value" msgstr "Son eksik olmayan değer" #: src/language/dictionary/sys-file-info.c:693 #, fuzzy #| msgid "Variable under test" msgid "Variable and Dataset Attributes" msgstr "Test edilen değişken" #: src/language/dictionary/sys-file-info.c:699 #, fuzzy #| msgid "Variable Name: " msgid "Variable and Name" msgstr "Değişken Adı:" #: src/language/dictionary/sys-file-info.c:702 #, fuzzy #| msgid "dataset" msgid "(dataset)" msgstr "veri seti" #: src/language/dictionary/sys-file-info.c:722 msgid "No vectors defined." msgstr "Tanımlanan vektör yok." #: src/language/dictionary/sys-file-info.c:732 #, fuzzy #| msgid "Vector" msgid "Vectors" msgstr "Vektör" #: src/language/dictionary/sys-file-info.c:736 msgid "Vector and Position" msgstr "" #: src/language/dictionary/sys-file-info.c:998 msgid "No valid encodings found." msgstr "" #: src/language/dictionary/sys-file-info.c:1004 #, c-format msgid "Usable encodings for %s." msgstr "" #: src/language/dictionary/sys-file-info.c:1007 #, c-format msgid "" "Encodings that can successfully read %s (by specifying the encoding name on " "the GET command's ENCODING subcommand). Encodings that yield identical text " "are listed together." msgstr "" #: src/language/dictionary/sys-file-info.c:1012 #: src/language/dictionary/sys-file-info.c:1013 msgid "Encodings" msgstr "" #: src/language/dictionary/sys-file-info.c:1042 #, c-format msgid "%s Encoded Text Strings" msgstr "" #: src/language/dictionary/sys-file-info.c:1046 msgid "" "Text strings in the file dictionary that the previously listed encodings " "interpret differently, along with the interpretations." msgstr "" #: src/language/dictionary/sys-file-info.c:1049 src/output/text-item.c:57 #: src/ui/gui/psppire-import-assistant.c:885 msgid "Text" msgstr "Metin" #: src/language/dictionary/sys-file-info.c:1059 msgid "Purpose" msgstr "" #: src/language/dictionary/value-labels.c:154 #, c-format msgid "Truncating value label to %d bytes." msgstr "Değer etiketi %d bayta kadar kısaltılıyor." #: src/language/dictionary/vector.c:66 #, c-format msgid "A vector named %s already exists." msgstr "Vektör adı %s zaten var." #: src/language/dictionary/vector.c:74 #, c-format msgid "Vector name %s is given twice." msgstr "Vektör adı %s iki kere verildi." #: src/language/dictionary/vector.c:98 msgid "A slash must separate each vector specification in VECTOR's long form." msgstr "" #: src/language/dictionary/vector.c:131 msgid "Vectors must have at least one element." msgstr "" #: src/language/dictionary/vector.c:151 msgid "expecting vector length" msgstr "vektör uzunluğu bekleniyor" #: src/language/dictionary/vector.c:170 #, c-format msgid "%s is an existing variable name." msgstr "%s var olan bir değişken adı." #: src/language/dictionary/variable-display.c:121 msgid "Variable display width must be a positive integer." msgstr "" #: src/language/dictionary/weight.c:49 msgid "The weighting variable must be numeric." msgstr "" #: src/language/dictionary/weight.c:54 msgid "The weighting variable may not be scratch." msgstr "" #: src/language/tests/moments-test.c:50 msgid "expecting weight value" msgstr "ağırlık değeri bekleniyor" #: src/language/utilities/cd.c:45 src/language/utilities/include.c:173 #, fuzzy, c-format #| msgid "Cannot change directory to %s: %s " msgid "Cannot change directory to %s: %s" msgstr "Dizin %s olarak değiştirilemedi: %s " #: src/language/utilities/date.c:33 #, c-format msgid "Only %s is currently implemented." msgstr "" #: src/language/utilities/host.c:60 #, fuzzy #| msgid "Command shell not supported on this platform." msgid "Time limit not supported on this platform." msgstr "Bu platformda komut kabuğu desteklenmiyor." #: src/language/utilities/host.c:74 #, c-format msgid "%s: Command exited with status %d." msgstr "" #: src/language/utilities/host.c:95 #, fuzzy, c-format #| msgid "failed to create temporary file" msgid "Failed to create temporary file (%s)." msgstr "geçici dosya oluşturulamadı" #: src/language/utilities/host.c:102 #, c-format msgid "/dev/null: Failed to open (%s)." msgstr "" #: src/language/utilities/host.c:117 #, c-format msgid "Couldn't fork: %s." msgstr "Çatallanamadı: %s." #: src/language/utilities/host.c:193 #, c-format msgid "While running \"%s\", waiting for child process failed (%s)." msgstr "" #: src/language/utilities/host.c:203 #, c-format msgid "Command \"%s\" timed out." msgstr "" #: src/language/utilities/host.c:205 #, c-format msgid "Command \"%s\" terminated by signal %d." msgstr "" #: src/language/utilities/host.c:212 msgid "Command or shell not found" msgstr "" #: src/language/utilities/host.c:214 msgid "Could not invoke command or shell" msgstr "" #: src/language/utilities/host.c:217 #, c-format msgid "Command \"%s\" exited with status %d (%s)." msgstr "" #: src/language/utilities/host.c:220 #, c-format msgid "Command \"%s\" exited with status %d." msgstr "" #: src/language/utilities/host.c:230 #, c-format msgid "Command \"%s\" output could not be read (%s)." msgstr "" #: src/language/utilities/title.c:88 #, c-format msgid " (Entered %s)" msgstr " (%s girildi)" #: src/language/utilities/include.c:73 #, c-format msgid "Can't find `%s' in include file search path." msgstr "İçerilecek dosyaları arama yolunda `%s' bulunamadı." #: src/language/utilities/output.c:128 #, fuzzy, c-format #| msgid "Unknown command `%s'." msgid "Unknown cell class %s." msgstr "Bilinmeyen `%s' komutu." #: src/language/utilities/permissions.c:113 #, c-format msgid "Cannot stat %s: %s" msgstr "%s durumu alınamadı: %s" #: src/language/utilities/permissions.c:127 #, c-format msgid "Cannot change mode of %s: %s" msgstr " %s ögesinin kipi değiştiremedi: %s" #: src/language/stats/aggregate.c:96 msgid "Sum of values" msgstr "Değerler toplamı" #: src/language/stats/aggregate.c:97 msgid "Mean average" msgstr "Aritmetik ortalama" #: src/language/stats/aggregate.c:98 msgid "Median average" msgstr "Medyan ortalaması" #: src/language/stats/aggregate.c:99 #: src/ui/gui/psppire-dialog-action-descriptives.c:40 #: src/ui/gui/psppire-dialog-action-frequencies.c:41 msgid "Standard deviation" msgstr "Standart sapma" #: src/language/stats/aggregate.c:100 #: src/ui/gui/psppire-dialog-action-descriptives.c:42 msgid "Maximum value" msgstr "En yüksek değer" #: src/language/stats/aggregate.c:101 #: src/ui/gui/psppire-dialog-action-descriptives.c:41 msgid "Minimum value" msgstr "En düşük değer" #: src/language/stats/aggregate.c:102 msgid "Percentage greater than" msgstr "Bundan daha büyük yüzdeler" #: src/language/stats/aggregate.c:103 msgid "Percentage less than" msgstr "Bundan daha küçük yüzdeler" #: src/language/stats/aggregate.c:104 msgid "Percentage included in range" msgstr "" #: src/language/stats/aggregate.c:105 msgid "Percentage excluded from range" msgstr "" #: src/language/stats/aggregate.c:106 msgid "Fraction greater than" msgstr "" #: src/language/stats/aggregate.c:107 msgid "Fraction less than" msgstr "" #: src/language/stats/aggregate.c:108 msgid "Fraction included in range" msgstr "" #: src/language/stats/aggregate.c:109 msgid "Fraction excluded from range" msgstr "" #: src/language/stats/aggregate.c:110 msgid "Number of cases" msgstr "Vaka sayısı" #: src/language/stats/aggregate.c:111 msgid "Number of cases (unweighted)" msgstr "Vaka sayısı (ağırlıklandırılmamış)" #: src/language/stats/aggregate.c:112 msgid "Number of missing values" msgstr "Eksik değerlerin sayısı" #: src/language/stats/aggregate.c:113 msgid "Number of missing values (unweighted)" msgstr "Eksik değerlerin sayısı (ağırlıklandırılmamış)" #: src/language/stats/aggregate.c:114 msgid "First non-missing value" msgstr "İlk eksik olmayan değer" #: src/language/stats/aggregate.c:115 msgid "Last non-missing value" msgstr "Son eksik olmayan değer" #: src/language/stats/aggregate.c:258 msgid "" "When PRESORTED is specified, specifying sorting directions with (A) or (D) " "has no effect. Output data will be sorted the same way as the input data." msgstr "" "ÖNSINIFLANDIRMA belirlendiğinde (Artan) veya (Azalan) ile sıralama yönünü " "belirlemek etkisizdir. Çıktı verisi girdi verisi gibi aynı şekilde " "sıralanacaktır." #: src/language/stats/aggregate.c:448 msgid "expecting aggregation function" msgstr "kümeleme fonksiyonu bekleniyor" #: src/language/stats/aggregate.c:460 #, c-format msgid "Unknown aggregation function %s." msgstr "Bilinmeyen kümeleme fonksiyonu %s." #: src/language/stats/aggregate.c:513 #, c-format msgid "Missing argument %zu to %s." msgstr "" #: src/language/stats/aggregate.c:522 #, c-format msgid "Arguments to %s must be of same type as source variables." msgstr "" #: src/language/stats/aggregate.c:541 #, c-format msgid "" "Number of source variables (%zu) does not match number of target variables " "(%zu)." msgstr "" #: src/language/stats/aggregate.c:557 #, c-format msgid "" "The value arguments passed to the %s function are out-of-order. They will " "be treated as if they had been specified in the correct order." msgstr "" #: src/language/stats/aggregate.c:631 #, c-format msgid "" "Variable name %s is not unique within the aggregate file dictionary, which " "contains the aggregate variables and the break variables." msgstr "" #: src/language/stats/autorecode.c:152 #, c-format msgid "Source variable count (%zu) does not match target variable count (%zu)." msgstr "" "Kaynak değişken sayısı (%zu) hedef değişken sayısı (%zu) ile eşleşmiyor." #: src/language/stats/autorecode.c:164 #, c-format msgid "Target variable %s duplicates existing variable %s." msgstr "Hedef değişken %s, %s değişkeninin aynısı." #: src/language/stats/autorecode.c:221 #, c-format msgid "" "With GROUP, variables may not mix string variables (such as %s) and numeric " "variables (such as %s)." msgstr "" #: src/language/stats/autorecode.c:363 #, fuzzy #| msgid "Recode into Same Variables" msgid "Recoding grouped variables." msgstr "Aynı Değişkenlere Kodla" #: src/language/stats/autorecode.c:365 #, fuzzy, c-format #| msgid "Replacing %s by %s: %s." msgid "Recoding %s into %s (%s)." msgstr "%s, %s ile değiştiriliyor: %s." #: src/language/stats/autorecode.c:369 #, fuzzy, c-format #| msgid "Removing %s: %s." msgid "Recoding %s into %s." msgstr "%s kaldırılıyor: %s." #: src/language/stats/autorecode.c:376 src/ui/gui/recode.ui:209 msgid "New Value" msgstr "Yeni Değer" #: src/language/stats/autorecode.c:376 msgid "Value Label" msgstr "Değer Etiketi" #: src/language/stats/autorecode.c:379 msgid "Old Value" msgstr "Eski Değer" #: src/language/stats/binomial.c:138 #, c-format msgid "Variable %s is not dichotomous" msgstr "%s değişkeni iki değerli (dichotomous) bir değişken değil" #: src/language/stats/binomial.c:182 src/ui/gui/binomial.ui:30 msgid "Binomial Test" msgstr "Binom Testi" #: src/language/stats/binomial.c:186 src/language/stats/chisquare.c:183 #: src/language/stats/chisquare.c:239 src/language/stats/chisquare.c:322 #: src/language/stats/cochran.c:188 src/language/stats/correlations.c:94 #: src/language/stats/correlations.c:145 src/language/stats/descriptives.c:991 #: src/language/stats/examine.c:602 src/language/stats/examine.c:742 #: src/language/stats/examine.c:836 src/language/stats/examine.c:925 #: src/language/stats/factor.c:1755 src/language/stats/factor.c:1878 #: src/language/stats/factor.c:1908 src/language/stats/factor.c:2068 #: src/language/stats/factor.c:2102 src/language/stats/frequencies.c:302 #: src/language/stats/frequencies.c:1579 src/language/stats/frequencies.c:1586 #: src/language/stats/friedman.c:250 src/language/stats/glm.c:729 #: src/language/stats/kruskal-wallis.c:249 #: src/language/stats/kruskal-wallis.c:297 #: src/language/stats/ks-one-sample.c:278 src/language/stats/logistic.c:1170 #: src/language/stats/logistic.c:1300 src/language/stats/logistic.c:1330 #: src/language/stats/jonckheere-terpstra.c:361 #: src/language/stats/mann-whitney.c:184 src/language/stats/mann-whitney.c:247 #: src/language/stats/means.c:757 src/language/stats/means.c:811 #: src/language/stats/mcnemar.c:222 src/language/stats/median.c:315 #: src/language/stats/median.c:350 src/language/stats/npar-summary.c:106 #: src/language/stats/oneway.c:973 src/language/stats/oneway.c:1051 #: src/language/stats/oneway.c:1150 src/language/stats/oneway.c:1238 #: src/language/stats/oneway.c:1373 src/language/stats/quick-cluster.c:746 #: src/language/stats/reliability.c:543 src/language/stats/reliability.c:584 #: src/language/stats/reliability.c:633 src/language/stats/reliability.c:644 #: src/language/stats/roc.c:969 src/language/stats/roc.c:1067 #: src/language/stats/regression.c:867 src/language/stats/regression.c:899 #: src/language/stats/regression.c:1023 src/language/stats/regression.c:1089 #: src/language/stats/runs.c:318 src/language/stats/sign.c:102 #: src/language/stats/t-test-indep.c:193 src/language/stats/t-test-indep.c:259 #: src/language/stats/t-test-one-sample.c:68 #: src/language/stats/t-test-one-sample.c:125 #: src/language/stats/t-test-paired.c:150 #: src/language/stats/t-test-paired.c:193 #: src/language/stats/t-test-paired.c:238 src/language/stats/wilcoxon.c:243 #: src/language/stats/wilcoxon.c:282 src/language/stats/crosstabs.q:925 #: src/language/stats/crosstabs.q:1253 src/language/stats/crosstabs.q:1293 #: src/language/stats/crosstabs.q:1302 src/language/stats/crosstabs.q:1331 #: src/language/stats/crosstabs.q:1373 src/language/stats/crosstabs.q:1418 #: src/ui/gui/crosstabs.ui:499 src/ui/gui/oneway.ui:615 msgid "Statistics" msgstr "İstatistikler" #: src/language/stats/binomial.c:187 src/language/stats/chisquare.c:240 #: src/language/stats/chisquare.c:252 msgid "Category" msgstr "Kategori" #: src/language/stats/binomial.c:188 src/language/stats/cochran.c:189 #: src/language/stats/correlations.c:97 src/language/stats/correlations.c:155 #: src/language/stats/descriptives.c:993 src/language/stats/examine.c:926 #: src/language/stats/frequencies.c:1588 src/language/stats/friedman.c:251 #: src/language/stats/kruskal-wallis.c:250 #: src/language/stats/ks-one-sample.c:279 src/language/stats/logistic.c:1331 #: src/language/stats/jonckheere-terpstra.c:369 #: src/language/stats/mann-whitney.c:185 src/language/stats/means.c:710 #: src/language/stats/means-calc.c:439 src/language/stats/mcnemar.c:223 #: src/language/stats/median.c:351 src/language/stats/npar-summary.c:107 #: src/language/stats/oneway.c:1052 src/language/stats/reliability.c:544 #: src/language/stats/sign.c:69 src/language/stats/sign.c:70 #: src/language/stats/t-test-indep.c:194 #: src/language/stats/t-test-one-sample.c:126 #: src/language/stats/t-test-paired.c:151 #: src/language/stats/t-test-paired.c:194 src/language/stats/wilcoxon.c:244 #: src/language/stats/crosstabs.q:926 msgid "N" msgstr "Adet" #: src/language/stats/binomial.c:189 msgid "Observed Prop." msgstr "Gözlenen Miktar" #: src/language/stats/binomial.c:190 msgid "Test Prop." msgstr "Test Miktarı" #: src/language/stats/binomial.c:192 src/language/stats/mcnemar.c:224 #: src/language/stats/sign.c:103 src/language/stats/wilcoxon.c:288 #: src/language/stats/crosstabs.q:1306 msgid "Exact Sig. (2-tailed)" msgstr "Kesin Anlamlılık (İki Yanlı)" #: src/language/stats/binomial.c:193 src/language/stats/mcnemar.c:225 #: src/language/stats/sign.c:104 src/language/stats/wilcoxon.c:289 #: src/language/stats/crosstabs.q:1307 msgid "Exact Sig. (1-tailed)" msgstr "Kesin Anlamlılık (Tek Yanlı)" #: src/language/stats/binomial.c:195 #, fuzzy #| msgid "Group1" msgid "Groups" msgstr "Grup1" #: src/language/stats/binomial.c:196 #, fuzzy #| msgid "Group1" msgid "Group 1" msgstr "Grup1" #: src/language/stats/binomial.c:196 #, fuzzy #| msgid "Group2" msgid "Group 2" msgstr "Grup2" #: src/language/stats/binomial.c:196 src/language/stats/chisquare.c:223 #: src/language/stats/chisquare.c:257 src/language/stats/examine.c:930 #: src/language/stats/factor.c:1756 src/language/stats/frequencies.c:344 #: src/language/stats/glm.c:811 src/language/stats/kruskal-wallis.c:285 #: src/language/stats/logistic.c:1336 src/language/stats/mann-whitney.c:197 #: src/language/stats/means.c:706 src/language/stats/oneway.c:982 #: src/language/stats/oneway.c:1072 src/language/stats/reliability.c:549 #: src/language/stats/regression.c:1031 src/language/stats/sign.c:75 #: src/language/stats/wilcoxon.c:250 #: src/ui/gui/psppire-dialog-action-crosstabs.c:93 #: src/language/stats/crosstabs.q:931 src/language/stats/crosstabs.q:1218 msgid "Total" msgstr "Toplam" #: src/language/stats/chisquare.c:171 #, fuzzy, c-format #| msgid "" #| "CHISQUARE test specified %d expected values, but %d distinct values were " #| "encountered in variable %s." msgid "" "CHISQUARE test specified %d expected values, but variable %s has %zu " "distinct values." msgstr "" "Kİ-KARE testi %d beklenen değerleri belirledi ancak %d farklı değerleri %s " "değişkeninde çakıştı." #: src/language/stats/chisquare.c:184 src/language/stats/chisquare.c:241 msgid "Observed N" msgstr "Gözlenen N" #: src/language/stats/chisquare.c:185 src/language/stats/chisquare.c:242 msgid "Expected N" msgstr "Beklenen N" #: src/language/stats/chisquare.c:186 src/language/stats/chisquare.c:243 #: src/language/stats/regression.c:1031 #: src/ui/gui/psppire-dialog-action-crosstabs.c:95 #: src/language/stats/crosstabs.q:1267 msgid "Residual" msgstr "Artık" #: src/language/stats/chisquare.c:235 src/language/stats/cochran.c:150 #: src/language/stats/median.c:305 src/language/stats/sign.c:66 #: src/ui/gui/frequencies.ui:676 msgid "Frequencies" msgstr "Frekanslar" #: src/language/stats/chisquare.c:320 src/language/stats/cochran.c:181 #: src/language/stats/friedman.c:246 src/language/stats/kruskal-wallis.c:295 #: src/language/stats/mann-whitney.c:244 src/language/stats/mcnemar.c:219 #: src/language/stats/median.c:347 src/language/stats/sign.c:100 #: src/language/stats/wilcoxon.c:279 msgid "Test Statistics" msgstr "Test İstatistikleri" #: src/language/stats/chisquare.c:323 #, fuzzy #| msgid "Chi-Square" msgid "Chi-square" msgstr "Ki-Kare" #: src/language/stats/chisquare.c:324 src/language/stats/cochran.c:191 #: src/language/stats/examine.c:675 src/language/stats/factor.c:2107 #: src/language/stats/friedman.c:257 src/language/stats/glm.c:733 #: src/language/stats/kruskal-wallis.c:299 src/language/stats/logistic.c:1174 #: src/language/stats/median.c:354 src/language/stats/oneway.c:975 #: src/language/stats/oneway.c:1242 src/language/stats/regression.c:1025 #: src/language/stats/t-test-indep.c:267 #: src/language/stats/t-test-one-sample.c:75 #: src/language/stats/t-test-paired.c:253 src/language/stats/crosstabs.q:1304 msgid "df" msgstr "Serbestlik Derecesi" #: src/language/stats/chisquare.c:325 src/language/stats/cochran.c:192 #: src/language/stats/friedman.c:258 src/language/stats/kruskal-wallis.c:300 #: src/language/stats/median.c:355 msgid "Asymp. Sig." msgstr "Asimptotik Anlamlılık" #: src/language/stats/cochran.c:111 msgid "More than two values encountered. Cochran Q test will not be run." msgstr "İki değerden fazlasıyla karşılaşıldı. Cochran Q testi çalışmayacak." #: src/language/stats/cochran.c:153 #, c-format msgid "Success (%.*g)" msgstr "" #: src/language/stats/cochran.c:154 #, c-format msgid "Failure (%.*g)" msgstr "" #: src/language/stats/cochran.c:190 msgid "Cochran's Q" msgstr "Cochran's Q" #: src/language/stats/correlations.c:91 src/language/stats/descriptives.c:987 #: src/language/stats/factor.c:2065 src/language/stats/npar-summary.c:102 msgid "Descriptive Statistics" msgstr "Betimleyici İstatistikler" #: src/language/stats/correlations.c:95 src/language/stats/descriptives.c:108 #: src/language/stats/examine.c:742 src/language/stats/factor.c:2069 #: src/language/stats/frequencies.c:141 src/language/stats/graph.c:211 #: src/language/stats/ks-one-sample.c:290 src/language/stats/means-calc.c:438 #: src/language/stats/npar-summary.c:108 src/language/stats/oneway.c:1052 #: src/language/stats/t-test-indep.c:195 #: src/language/stats/t-test-one-sample.c:127 #: src/language/stats/t-test-paired.c:152 #: src/language/stats/t-test-paired.c:241 #: src/ui/gui/psppire-dialog-action-descriptives.c:39 #: src/ui/gui/psppire-dialog-action-frequencies.c:40 msgid "Mean" msgstr "Ortalama" #: src/language/stats/correlations.c:96 src/language/stats/examine.c:751 #: src/language/stats/factor.c:2070 src/language/stats/ks-one-sample.c:290 #: src/language/stats/means-calc.c:440 src/language/stats/npar-summary.c:109 #: src/language/stats/oneway.c:1052 src/language/stats/t-test-indep.c:196 #: src/language/stats/t-test-one-sample.c:128 #: src/language/stats/t-test-paired.c:153 #: src/language/stats/t-test-paired.c:242 msgid "Std. Deviation" msgstr "Standart Sapma" #: src/language/stats/correlations.c:126 msgid "Correlations" msgstr "Korelasyon" #: src/language/stats/correlations.c:146 msgid "Pearson Correlation" msgstr "Pearson Korelasyonu" #: src/language/stats/correlations.c:147 src/language/stats/oneway.c:1243 #: src/language/stats/t-test-indep.c:268 #: src/language/stats/t-test-one-sample.c:76 #: src/language/stats/t-test-paired.c:254 msgid "Sig. (2-tailed)" msgstr "Anlamlılık (2 yanlı)" #: src/language/stats/correlations.c:147 src/language/stats/factor.c:1913 msgid "Sig. (1-tailed)" msgstr "Anlamlılık (Tek yanlı)" #: src/language/stats/correlations.c:151 msgid "Cross-products" msgstr "Çapraz ürünler" #: src/language/stats/correlations.c:152 msgid "Covariance" msgstr "Kovaryans" #: src/language/stats/correlations.c:165 msgid "Significant at .05 level" msgstr "" #: src/language/stats/correlations.c:234 msgid "The data for the chosen variables are all missing or empty." msgstr "" #: src/language/stats/correlations.c:390 src/language/stats/descriptives.c:368 #: src/language/data-io/list.c:166 msgid "No variables specified." msgstr "Değişken belirtilmedi." #: src/language/stats/descriptives.c:109 src/language/stats/frequencies.c:142 #: src/language/stats/means-calc.c:445 src/language/stats/t-test-indep.c:197 #: src/language/stats/t-test-one-sample.c:129 #: src/language/stats/t-test-paired.c:154 #: src/language/stats/t-test-paired.c:243 msgid "S.E. Mean" msgstr "Standart Hata Ortalaması" #: src/language/stats/descriptives.c:110 src/language/stats/frequencies.c:145 msgid "Std Dev" msgstr "Std. Sapma" #: src/language/stats/descriptives.c:111 src/language/stats/examine.c:750 #: src/language/stats/frequencies.c:146 src/language/stats/means-calc.c:450 #: src/ui/gui/psppire-dialog-action-descriptives.c:46 #: src/ui/gui/psppire-dialog-action-frequencies.c:45 msgid "Variance" msgstr "Varyans" #: src/language/stats/descriptives.c:112 src/language/stats/examine.c:752 #: src/language/stats/frequencies.c:147 src/language/stats/means-calc.c:451 #: src/ui/gui/psppire-dialog-action-descriptives.c:47 #: src/ui/gui/psppire-dialog-action-frequencies.c:50 msgid "Kurtosis" msgstr "Basıklık" #: src/language/stats/descriptives.c:113 src/language/stats/frequencies.c:148 #: src/language/stats/means-calc.c:452 msgid "S.E. Kurt" msgstr "Standart Hata Basıklığı" #: src/language/stats/descriptives.c:114 src/language/stats/examine.c:752 #: src/language/stats/frequencies.c:149 src/language/stats/means-calc.c:453 #: src/ui/gui/psppire-dialog-action-descriptives.c:48 #: src/ui/gui/psppire-dialog-action-frequencies.c:46 msgid "Skewness" msgstr "Çarpıklık" #: src/language/stats/descriptives.c:115 src/language/stats/frequencies.c:150 #: src/language/stats/means-calc.c:454 msgid "S.E. Skew" msgstr "Standart Hata Çarpıklığı" #: src/language/stats/descriptives.c:116 src/language/stats/examine.c:751 #: src/language/stats/frequencies.c:151 src/language/stats/means-calc.c:449 #: src/ui/gui/psppire-dialog-action-descriptives.c:43 #: src/ui/gui/psppire-dialog-action-frequencies.c:48 msgid "Range" msgstr "Aralık" #: src/language/stats/descriptives.c:117 src/language/stats/examine.c:751 #: src/language/stats/frequencies.c:152 src/language/stats/graph.c:214 #: src/language/stats/ks-one-sample.c:285 src/language/stats/means-calc.c:447 #: src/language/stats/npar-summary.c:110 src/language/stats/oneway.c:1061 #: src/ui/gui/psppire-dialog-action-descriptives.c:41 #: src/ui/gui/psppire-dialog-action-frequencies.c:42 msgid "Minimum" msgstr "En düşük" #: src/language/stats/descriptives.c:118 src/language/stats/examine.c:751 #: src/language/stats/frequencies.c:153 src/language/stats/graph.c:213 #: src/language/stats/ks-one-sample.c:285 src/language/stats/means-calc.c:448 #: src/language/stats/npar-summary.c:110 src/language/stats/oneway.c:1061 #: src/ui/gui/psppire-dialog-action-descriptives.c:42 #: src/ui/gui/psppire-dialog-action-frequencies.c:43 msgid "Maximum" msgstr "En yüksek" #: src/language/stats/descriptives.c:119 src/language/stats/frequencies.c:154 #: src/language/stats/graph.c:212 src/language/stats/means-calc.c:446 #: src/ui/gui/psppire-dialog-action-descriptives.c:44 #: src/ui/gui/psppire-dialog-action-frequencies.c:53 msgid "Sum" msgstr "Toplam" #: src/language/stats/descriptives.c:350 #, c-format msgid "Z-score variable name %s would be a duplicate variable name." msgstr "" #: src/language/stats/descriptives.c:401 msgid "" "DESCRIPTIVES with Z scores ignores TEMPORARY. Temporary transformations " "will be made permanent." msgstr "" #: src/language/stats/descriptives.c:478 msgid "expecting statistic name: reverting to default" msgstr "istatistik adı bekleniyor: varsayılana döndürülüyor" #: src/language/stats/descriptives.c:561 msgid "" "Ran out of generic names for Z-score variables. There are only 126 generic " "names: ZSC001-ZSC0999, STDZ01-STDZ09, ZZZZ01-ZZZZ09, ZQZQ01-ZQZQ09." msgstr "" #: src/language/stats/descriptives.c:579 msgid "Mapping of Variables to Z-scores" msgstr "" #: src/language/stats/descriptives.c:581 #, fuzzy #| msgid "Name" msgid "Names" msgstr "İsim" #: src/language/stats/descriptives.c:582 src/language/stats/glm.c:739 #: src/language/stats/regression.c:1030 msgid "Source" msgstr "Kaynak" #: src/language/stats/descriptives.c:582 msgid "Target" msgstr "Hedef" #: src/language/stats/descriptives.c:659 #, c-format msgid "Internal error processing Z scores. Please report this to %s." msgstr "" #: src/language/stats/descriptives.c:759 #, c-format msgid "Z-score of %s" msgstr "%s ögesinin Z-skoru" #: src/language/stats/descriptives.c:1028 src/language/stats/roc.c:1029 msgid "Valid N (listwise)" msgstr "Geçerli N (tüm değerler girilmiş)" #: src/language/stats/descriptives.c:1028 #, fuzzy #| msgid "Valid N (listwise)" msgid "Missing N (listwise)" msgstr "Geçerli N (tüm değerler girilmiş)" #: src/language/stats/examine.c:75 msgid " (missing)" msgstr " (eksik)" #: src/language/stats/examine.c:225 #, c-format msgid "Boxplot of %s vs. %s" msgstr "" #: src/language/stats/examine.c:231 src/language/stats/examine.c:338 #, c-format msgid "Boxplot of %s" msgstr "" #: src/language/stats/examine.c:321 msgid "Boxplot" msgstr "" #: src/language/stats/examine.c:418 msgid "Not creating NP plot because data set is empty." msgstr "" #: src/language/stats/examine.c:478 #, c-format msgid "Not creating spreadlevel chart for %s" msgstr "" #: src/language/stats/examine.c:585 #, fuzzy #| msgid "Last non-missing value" msgid "User-missing value." msgstr "Son eksik olmayan değer" #: src/language/stats/examine.c:591 src/language/stats/examine.c:595 #: src/language/stats/frequencies.c:1606 msgid "Percentiles" msgstr "Yüzdebirlikler" #: src/language/stats/examine.c:603 src/math/percentiles.c:37 msgid "Weighted Average" msgstr "Ağırlıklı Ortalama" #: src/language/stats/examine.c:603 msgid "Tukey's Hinges" msgstr "Tukey's Hinges" #: src/language/stats/examine.c:610 src/language/stats/examine.c:685 #: src/language/stats/examine.c:759 src/language/stats/examine.c:858 #: src/language/stats/examine.c:938 src/language/stats/mann-whitney.c:200 #: src/language/stats/median.c:319 src/language/stats/t-test-indep.c:227 #: src/language/stats/t-test-indep.c:282 #: src/language/stats/t-test-one-sample.c:87 #, fuzzy #| msgid "_Dependent Variable" msgid "Dependent Variables" msgstr "_Bağımlı Değişken" #: src/language/stats/examine.c:669 msgid "Tests of Normality" msgstr "" #: src/language/stats/examine.c:673 msgid "Shapiro-Wilk" msgstr "" #: src/language/stats/examine.c:674 src/language/stats/examine.c:739 #: src/ui/gui/psppire-checkbox-treeview.c:73 msgid "Statistic" msgstr "İstatistik" #: src/language/stats/examine.c:676 src/language/stats/factor.c:2108 #: src/language/stats/glm.c:736 src/language/stats/logistic.c:1175 #: src/language/stats/oneway.c:978 src/language/stats/oneway.c:1154 #: src/language/stats/oneway.c:1376 src/language/stats/regression.c:906 #: src/language/stats/regression.c:1028 src/language/stats/t-test-indep.c:263 #: src/language/stats/t-test-paired.c:196 msgid "Sig." msgstr "Anlamlılık" #: src/language/stats/examine.c:735 src/language/stats/oneway.c:1045 #: src/ui/gui/descriptives.ui:25 msgid "Descriptives" msgstr "Betimleyiciler" #: src/language/stats/examine.c:738 msgid "Aspect" msgstr "" #: src/language/stats/examine.c:739 src/language/stats/oneway.c:1053 #: src/language/stats/oneway.c:1240 src/language/stats/oneway.c:1375 #: src/language/stats/roc.c:975 src/language/stats/regression.c:902 msgid "Std. Error" msgstr "Standart Hata" #: src/language/stats/examine.c:745 src/language/stats/oneway.c:1056 #, c-format msgid "%g%% Confidence Interval for Mean" msgstr "%g%% Ortalama için Güven Aralığı" #: src/language/stats/examine.c:747 src/language/stats/oneway.c:1058 #: src/language/stats/oneway.c:1382 src/language/stats/roc.c:982 #: src/language/stats/regression.c:913 msgid "Lower Bound" msgstr "Alt Sınır" #: src/language/stats/examine.c:748 src/language/stats/oneway.c:1059 #: src/language/stats/oneway.c:1383 src/language/stats/roc.c:983 #: src/language/stats/regression.c:914 msgid "Upper Bound" msgstr "Üst Sınır" #: src/language/stats/examine.c:750 msgid "5% Trimmed Mean" msgstr "5% Budanmış Ortalama" #: src/language/stats/examine.c:750 src/language/stats/frequencies.c:143 #: src/language/stats/means-calc.c:442 src/language/stats/median.c:352 #: src/ui/gui/psppire-dialog-action-frequencies.c:52 msgid "Median" msgstr "Medyan" #: src/language/stats/examine.c:752 msgid "Interquartile Range" msgstr "Çeyrekler Açıklığı (Değişim Aralığı)" #: src/language/stats/examine.c:832 msgid "Extreme Values" msgstr "Uç Değerler" #: src/language/stats/examine.c:840 src/language/stats/quick-cluster.c:664 #: src/language/data-io/list.c:110 msgid "Case Number" msgstr "Vaka Numarası" #: src/language/stats/examine.c:844 #, fuzzy #| msgid "Order by" msgid "Order" msgstr "Sıralama düzeni" #. TRANSLATORS: This is a noun, not an adjective. #: src/language/stats/examine.c:850 #, fuzzy #| msgid "_Extremes" msgid "Extreme" msgstr "_Uç Değerler" #: src/language/stats/examine.c:851 msgid "Highest" msgstr "En Yüksek" #: src/language/stats/examine.c:851 msgid "Lowest" msgstr "En Düşük" #: src/language/stats/examine.c:921 src/language/stats/logistic.c:1328 #: src/language/stats/means.c:694 src/language/stats/reliability.c:540 msgid "Case Processing Summary" msgstr "Vaka İşleme Özeti" #: src/language/stats/examine.c:927 src/language/stats/frequencies.c:304 #: src/language/stats/frequencies.c:1494 src/language/stats/logistic.c:1332 #: src/language/stats/means.c:713 src/language/stats/reliability.c:545 #: src/language/stats/crosstabs.q:927 msgid "Percent" msgstr "Yüzde" #: src/language/stats/examine.c:929 src/language/stats/frequencies.c:321 #: src/language/stats/frequencies.c:1590 src/language/stats/quick-cluster.c:766 #: src/language/stats/reliability.c:548 src/language/stats/crosstabs.q:931 msgid "Valid" msgstr "Geçerli" #: src/language/stats/examine.c:929 src/language/stats/frequencies.c:336 #: src/language/stats/frequencies.c:1591 src/language/stats/crosstabs.q:931 msgid "Missing" msgstr "Eksik" #: src/language/stats/examine.c:1550 #, c-format msgid "%s may not be negative. Using default value (%g)." msgstr "%s negatif olmamalıdır. Öntanımlı değer kullanılıyor (%g)." #: src/language/stats/examine.c:1587 msgid "Percentiles must lie in the range (0, 100)" msgstr "Yüzdebirlikler bu oran içerisinde olmalıdır (0, 100)" #: src/language/stats/examine.c:1777 #, c-format msgid "%s and %s are mutually exclusive" msgstr "%s ve %s birbirini dışlar (mutually exclusive)" #: src/language/stats/factor.c:1121 #, c-format msgid "Matrix input for %s must be either COV or CORR" msgstr "" #: src/language/stats/factor.c:1519 msgid "Factor analysis on a single variable is not useful." msgstr "Sadece bir değişkenin faktör analizi faydalı bir bilgi değildir." #: src/language/stats/factor.c:1523 #, fuzzy #| msgid "Factor analysis on a single variable is not useful." msgid "Factor analysis without variables is not possible." msgstr "Sadece bir değişkenin faktör analizi faydalı bir bilgi değildir." #: src/language/stats/factor.c:1634 msgid "Component Number" msgstr "Bileşen Numarası" #: src/language/stats/factor.c:1634 msgid "Factor Number" msgstr "Faktör Sayısı" #: src/language/stats/factor.c:1648 src/language/stats/factor.c:1651 msgid "Communalities" msgstr "" #: src/language/stats/factor.c:1653 msgid "Initial" msgstr "Başlangıç" #: src/language/stats/factor.c:1655 msgid "Extraction" msgstr "Özet Sonuç" #: src/language/stats/factor.c:1697 src/language/stats/factor.c:1777 #: src/language/stats/factor.c:1839 msgid "Component" msgstr "Bileşen" #: src/language/stats/factor.c:1697 src/language/stats/factor.c:1777 #: src/language/stats/factor.c:1839 msgid "Factor" msgstr "Faktör" #: src/language/stats/factor.c:1752 msgid "Total Variance Explained" msgstr "Açıklanan Toplam Varyans" #: src/language/stats/factor.c:1758 #, no-c-format msgid "% of Variance" msgstr "Varyansın % değeri" #: src/language/stats/factor.c:1760 #, no-c-format msgid "Cumulative %" msgstr "Kümülatif %" #: src/language/stats/factor.c:1763 msgid "Phase" msgstr "" #: src/language/stats/factor.c:1765 msgid "Initial Eigenvalues" msgstr "Başlangıçtaki Özdeğerler" #: src/language/stats/factor.c:1769 msgid "Extraction Sums of Squared Loadings" msgstr "" #: src/language/stats/factor.c:1773 msgid "Rotation Sums of Squared Loadings" msgstr "" #: src/language/stats/factor.c:1835 #, fuzzy #| msgid "Correlation Matrix" msgid "Factor Correlation Matrix" msgstr "Korelasyon Matrisi" #: src/language/stats/factor.c:1842 #, fuzzy #| msgid "Factor" msgid "Factor 2" msgstr "Faktör" #: src/language/stats/factor.c:1874 msgid "Anti-Image Matrices" msgstr "" #: src/language/stats/factor.c:1879 #, fuzzy #| msgid "Covariance" msgid "Anti-image Covariance" msgstr "Kovaryans" #: src/language/stats/factor.c:1880 #, fuzzy #| msgid "Bivariate Correlations" msgid "Anti-image Correlation" msgstr "İki Değişkenli Korelasyonlar" #: src/language/stats/factor.c:1901 msgid "Correlation Matrix" msgstr "Korelasyon Matrisi" #: src/language/stats/factor.c:1910 src/language/stats/t-test-paired.c:195 msgid "Correlation" msgstr "Korelasyon" #: src/language/stats/factor.c:1947 msgid "Determinant" msgstr "Determinant" #: src/language/stats/factor.c:1958 #, fuzzy #| msgid "Co_variance matrix" msgid "Covariance Matrix" msgstr "Ko_varyans matrisi" #: src/language/stats/factor.c:1990 msgid "" "The dataset contains no complete observations. No analysis will be performed." msgstr "Veriseti tamamlanmış gözlemler içermiyor. Analiz yapılmayacak." #: src/language/stats/factor.c:2014 msgid "The dataset has no complete covariance or correlation matrix." msgstr "" #: src/language/stats/factor.c:2071 msgid "Analysis N" msgstr "Analiz Sayısı" #: src/language/stats/factor.c:2099 msgid "KMO and Bartlett's Test" msgstr "KMO ve Bartlett Testi" #: src/language/stats/factor.c:2103 msgid "Kaiser-Meyer-Olkin Measure of Sampling Adequacy" msgstr "" #: src/language/stats/factor.c:2105 msgid "Bartlett's Test of Sphericity" msgstr "Bartlett'in Küresellik Testi" #: src/language/stats/factor.c:2106 msgid "Approx. Chi-Square" msgstr "Yaklaşık Ki-Kare" #: src/language/stats/factor.c:2154 #, c-format msgid "" "The %s criteria result in zero factors extracted. Therefore no analysis will " "be performed." msgstr "" #: src/language/stats/factor.c:2161 #, c-format msgid "" "The %s criteria result in more factors than variables, which is not " "meaningful. No analysis will be performed." msgstr "" #: src/language/stats/factor.c:2254 msgid "Component Matrix" msgstr "Bileşen Matrisi" #: src/language/stats/factor.c:2254 msgid "Factor Matrix" msgstr "Faktör Matrisi" #: src/language/stats/factor.c:2259 #, fuzzy #| msgid "Factor Matrix" msgid "Pattern Matrix" msgstr "Faktör Matrisi" #: src/language/stats/factor.c:2268 #, fuzzy #| msgid "Factor Matrix" msgid "Structure Matrix" msgstr "Faktör Matrisi" #: src/language/stats/factor.c:2270 msgid "Rotated Component Matrix" msgstr "Yönlendirilmiş Bileşen Matriksi" #: src/language/stats/factor.c:2271 msgid "Rotated Factor Matrix" msgstr "Yönlendirilmiş Faktör Matriksi" #: src/language/stats/flip.c:100 #, c-format msgid "%s ignores %s. Temporary transformations will be made permanent." msgstr "" #: src/language/stats/flip.c:153 #, c-format msgid "Could not create temporary file for %s." msgstr "" #: src/language/stats/flip.c:341 #, c-format msgid "Error rewinding %s file: %s." msgstr "" #: src/language/stats/flip.c:348 #, c-format msgid "Error creating %s source file." msgstr "" #: src/language/stats/flip.c:361 #, c-format msgid "Error reading %s file: %s." msgstr "" #: src/language/stats/flip.c:363 #, c-format msgid "Unexpected end of file reading %s file." msgstr "" #: src/language/stats/flip.c:379 #, c-format msgid "Error seeking %s source file: %s." msgstr "" #: src/language/stats/flip.c:387 #, c-format msgid "Error writing %s source file: %s." msgstr "" #: src/language/stats/flip.c:402 #, c-format msgid "Error rewinding %s source file: %s." msgstr "" #: src/language/stats/flip.c:433 #, c-format msgid "Error reading %s temporary file: %s." msgstr "" #: src/language/stats/flip.c:436 #, c-format msgid "Unexpected end of file reading %s temporary file." msgstr "" #: src/language/stats/frequencies.c:144 #: src/ui/gui/psppire-dialog-action-frequencies.c:49 msgid "Mode" msgstr "Kip" #: src/language/stats/frequencies.c:303 src/language/stats/logistic.c:1381 #: src/output/charts/plot-hist-cairo.c:112 msgid "Frequency" msgstr "Frekans" #: src/language/stats/frequencies.c:305 msgid "Valid Percent" msgstr "Geçerli Yüzde" #: src/language/stats/frequencies.c:306 src/language/stats/graph.c:208 #, fuzzy #| msgid "Cum Percent" msgid "Cumulative Percent" msgstr "Kümülatif Yüzde" #: src/language/stats/frequencies.c:905 msgid "Histogram frequency must be greater than zero." msgstr "" #: src/language/stats/frequencies.c:923 #, fuzzy #| msgid "Percentage greater than" msgid "Histogram percentage must be greater than zero." msgstr "Bundan daha büyük yüzdeler" #: src/language/stats/frequencies.c:1139 #, c-format msgid "" "%s for histogram must be greater than or equal to %s, but %s was specified " "as %.15g and %s as %.15g. %s and %s will be ignored." msgstr "" #: src/language/stats/frequencies.c:1184 #, c-format msgid "" "%s for pie chart must be greater than or equal to %s, but %s was specified " "as %.15g and %s as %.15g. %s and %s will be ignored." msgstr "" #: src/language/stats/frequencies.c:1474 #, c-format msgid "Omitting pie chart for %s, which has only %d unique values." msgstr "" #: src/language/stats/frequencies.c:1477 #, c-format msgid "Omitting pie chart for %s, which has over 50 unique values." msgstr "" #: src/language/stats/frequencies.c:1494 src/language/stats/graph.c:205 #: src/language/stats/quick-cluster.c:747 #: src/ui/gui/psppire-dialog-action-crosstabs.c:90 #: src/language/stats/crosstabs.q:789 src/language/stats/crosstabs.q:1262 msgid "Count" msgstr "Sayı" #: src/language/stats/friedman.c:220 src/language/stats/kruskal-wallis.c:247 #: src/language/stats/mann-whitney.c:182 src/language/stats/wilcoxon.c:240 msgid "Ranks" msgstr "Dereceler" #: src/language/stats/friedman.c:222 src/language/stats/friedman.c:223 #: src/language/stats/kruskal-wallis.c:251 #: src/language/stats/mann-whitney.c:186 src/language/stats/wilcoxon.c:245 msgid "Mean Rank" msgstr "Derece Ortalaması" #: src/language/stats/friedman.c:253 msgid "Kendall's W" msgstr "Kendall's W" #: src/language/stats/friedman.c:256 src/language/stats/kruskal-wallis.c:298 #: src/language/stats/median.c:353 msgid "Chi-Square" msgstr "Ki-Kare" #: src/language/stats/glm.c:169 msgid "Multivariate analysis is not yet implemented" msgstr "Çok değişkenli analizler henüz eklenmedi" #: src/language/stats/glm.c:274 msgid "Only types 1, 2 & 3 sums of squares are currently implemented" msgstr "" #: src/language/stats/glm.c:727 msgid "Tests of Between-Subjects Effects" msgstr "" #: src/language/stats/glm.c:730 #, fuzzy #| msgid "Sum of Squares" msgid "Type I Sum Of Squares" msgstr "Kareler Toplamı" #: src/language/stats/glm.c:731 #, fuzzy #| msgid "Sum of Squares" msgid "Type II Sum Of Squares" msgstr "Kareler Toplamı" #: src/language/stats/glm.c:732 #, fuzzy #| msgid "Sum of Squares" msgid "Type III Sum Of Squares" msgstr "Kareler Toplamı" #: src/language/stats/glm.c:734 src/language/stats/oneway.c:976 #: src/language/stats/regression.c:1026 msgid "Mean Square" msgstr "Ortalama Karesi" #: src/language/stats/glm.c:735 src/language/stats/oneway.c:977 #: src/language/stats/regression.c:1027 src/language/stats/t-test-indep.c:262 msgid "F" msgstr "F" #: src/language/stats/glm.c:740 msgid "Corrected Model" msgstr "Düzeltilmiş Model" #: src/language/stats/glm.c:740 msgid "Model" msgstr "Model" #: src/language/stats/glm.c:752 msgid "Intercept" msgstr "Kesen" #: src/language/stats/glm.c:802 src/output/pivot-table.c:763 #: src/output/spv/spv.c:867 msgid "Error" msgstr "Hata" #: src/language/stats/glm.c:819 msgid "Corrected Total" msgstr "Düzeltilmiş Toplam" #: src/language/stats/graph.c:206 #, fuzzy #| msgid "_Percentages" msgid "Percentage" msgstr "_Yüzdeler" #: src/language/stats/graph.c:207 #, fuzzy #| msgid "Cumulative %" msgid "Cumulative Count" msgstr "Kümülatif %" #: src/language/stats/graph.c:296 #, c-format msgid "%s vs. %s by %s" msgstr "" #: src/language/stats/graph.c:303 #, c-format msgid "%s vs. %s" msgstr "" #: src/language/stats/graph.c:322 msgid "" "Maximum number of scatterplot categories reached. Your BY variable has too " "many distinct values. The coloring of the plot will not be correct." msgstr "" #: src/language/stats/graph.c:551 src/language/stats/rank.c:636 #, c-format msgid "%s of %s" msgstr "" #: src/language/stats/graph.c:698 src/language/stats/graph.c:729 #: src/language/stats/graph.c:777 msgid "Only one chart type is allowed." msgstr "" #: src/language/stats/graph.c:721 src/language/stats/graph.c:820 #: src/language/stats/graph.c:834 #, fuzzy #| msgid "The inline file is not allowed here." msgid "Only one variable is allowed." msgstr "Satıriçi dosyalara burada izin verilmiyor." #: src/language/stats/graph.c:843 #, fuzzy #| msgid "Number expected." msgid "Variable expected" msgstr "Sayı bekleniyor." #: src/language/stats/graph.c:883 msgid "FOOTNOTE is not implemented yet for GRAPH" msgstr "" #: src/language/stats/ks-one-sample.c:274 src/ui/gui/ks-one-sample.ui:24 msgid "One-Sample Kolmogorov-Smirnov Test" msgstr "Tek Örneklemli Kolmogorov-Smirnov Testi" #: src/language/stats/ks-one-sample.c:284 msgid "Uniform Parameters" msgstr "Tekdüze Parametreler" #: src/language/stats/ks-one-sample.c:289 msgid "Normal Parameters" msgstr "Normal Parametreler" #: src/language/stats/ks-one-sample.c:294 msgid "Poisson Parameters" msgstr "Poisson Parametreleri" #: src/language/stats/ks-one-sample.c:295 #: src/ui/gui/psppire-dialog-action-crosstabs.c:76 #: src/language/stats/crosstabs.q:1421 msgid "Lambda" msgstr "Lambda" #: src/language/stats/ks-one-sample.c:300 msgid "Exponential Parameters" msgstr "Üstel Parametreler" #: src/language/stats/ks-one-sample.c:308 msgid "Most Extreme Differences" msgstr "En Fazla Aşırı Farklar" #: src/language/stats/ks-one-sample.c:309 msgid "Absolute" msgstr "Mutlak" #: src/language/stats/ks-one-sample.c:309 src/language/stats/roc.c:1037 msgid "Positive" msgstr "Pozitif" #: src/language/stats/ks-one-sample.c:309 src/language/stats/roc.c:1037 msgid "Negative" msgstr "Negatif" #: src/language/stats/ks-one-sample.c:312 msgid "Kolmogorov-Smirnov Z" msgstr "Kolmogorov-Smirnov Z" #: src/language/stats/ks-one-sample.c:313 #: src/language/stats/jonckheere-terpstra.c:374 #: src/language/stats/mann-whitney.c:251 src/language/stats/runs.c:328 #: src/language/stats/wilcoxon.c:284 msgid "Asymp. Sig. (2-tailed)" msgstr "Asimptotik Anlamlılık (İki yanlı)" #: src/language/stats/logistic.c:327 msgid "All predicted values are either 1 or 0" msgstr "" #: src/language/stats/logistic.c:525 msgid "Dependent variable's values are not dichotomous." msgstr "" #: src/language/stats/logistic.c:614 #, c-format msgid "" "Category %s does not have at least two distinct values. Logistic regression " "will not be run." msgstr "" "Kategori %s en az iki farklı değere sahip değil. Lojistik regrasyon " "çalışmayacak." #: src/language/stats/logistic.c:674 #, c-format msgid "" "Estimation terminated at iteration number %d because parameter estimates " "changed by less than %g" msgstr "" #: src/language/stats/logistic.c:686 #, c-format msgid "" "Estimation terminated at iteration number %d because Log Likelihood " "decreased by less than %g%%" msgstr "" #: src/language/stats/logistic.c:701 #, c-format msgid "" "Estimation terminated at iteration number %d because maximum iterations has " "been reached" msgstr "" #: src/language/stats/logistic.c:994 msgid "Cut point value must be in the range [0,1]" msgstr "" #: src/language/stats/logistic.c:1139 msgid "Dependent Variable Encoding" msgstr "Bağımlı Değişken Kodlama" #: src/language/stats/logistic.c:1141 msgid "Mapping" msgstr "" #: src/language/stats/logistic.c:1142 msgid "Internal Value" msgstr "İç Değer" #: src/language/stats/logistic.c:1145 msgid "Original Value" msgstr "Asıl Değer" #: src/language/stats/logistic.c:1167 msgid "Variables in the Equation" msgstr "Denklemdeki Değişkenler:" #: src/language/stats/logistic.c:1171 src/language/stats/regression.c:902 msgid "B" msgstr "B" #: src/language/stats/logistic.c:1172 msgid "S.E." msgstr "Standart Hata" #: src/language/stats/logistic.c:1173 msgid "Wald" msgstr "" #: src/language/stats/logistic.c:1176 msgid "Exp(B)" msgstr "" #: src/language/stats/logistic.c:1181 #, c-format msgid "%d%% CI for Exp(B)" msgstr "" #: src/language/stats/logistic.c:1183 src/language/stats/t-test-indep.c:274 #: src/language/stats/t-test-one-sample.c:83 #: src/language/stats/t-test-paired.c:249 src/language/stats/crosstabs.q:1369 msgid "Lower" msgstr "Alt" #: src/language/stats/logistic.c:1183 src/language/stats/t-test-indep.c:275 #: src/language/stats/t-test-one-sample.c:84 #: src/language/stats/t-test-paired.c:250 src/language/stats/crosstabs.q:1370 msgid "Upper" msgstr "Üst" #: src/language/stats/logistic.c:1189 src/language/stats/logistic.c:1470 msgid "Step 1" msgstr "Adım 1" #: src/language/stats/logistic.c:1263 msgid "Constant" msgstr "Sabit" #: src/language/stats/logistic.c:1298 msgid "Model Summary" msgstr "Model Özeti" #: src/language/stats/logistic.c:1301 msgid "-2 Log likelihood" msgstr "" #: src/language/stats/logistic.c:1302 msgid "Cox & Snell R Square" msgstr "" #: src/language/stats/logistic.c:1303 msgid "Nagelkerke R Square" msgstr "" #: src/language/stats/logistic.c:1306 src/language/stats/logistic.c:1470 #, fuzzy #| msgid "Step 1" msgid "Step" msgstr "Adım 1" #: src/language/stats/logistic.c:1335 msgid "Unweighted Cases" msgstr "Ağırlıklandırılmamış Vakalar" #: src/language/stats/logistic.c:1336 msgid "Included in Analysis" msgstr "Analizlere Eklendi" #: src/language/stats/logistic.c:1336 msgid "Missing Cases" msgstr "Kayıp Vakalar" #: src/language/stats/logistic.c:1365 msgid "Categorical Variables' Codings" msgstr "Kategorik Değişkenlerin Kodlaması" #: src/language/stats/logistic.c:1380 msgid "Codings" msgstr "" #: src/language/stats/logistic.c:1383 msgid "Parameter coding" msgstr "Parametre kodlama" #: src/language/stats/logistic.c:1462 msgid "Classification Table" msgstr "Sınıflandırma Tablosu" #: src/language/stats/logistic.c:1466 msgid "Predicted" msgstr "Beklenen" #: src/language/stats/logistic.c:1466 #, fuzzy #| msgid "" #| "Percentage\n" #| "Correct" msgid "Percentage Correct" msgstr "" "Yüzde\n" "Doğru" #: src/language/stats/logistic.c:1468 msgid "Observed" msgstr "Gözlenen" #: src/language/stats/logistic.c:1468 msgid "Overall Percentage" msgstr "Tam Yüzde" #: src/language/stats/jonckheere-terpstra.c:357 msgid "Jonckheere-Terpstra Test" msgstr "Jonckheere-Terpstra Testi" #: src/language/stats/jonckheere-terpstra.c:364 #, c-format msgid "Number of levels in %s" msgstr "%s ögesindeki seviye sayısı" #: src/language/stats/jonckheere-terpstra.c:370 msgid "Observed J-T Statistic" msgstr "Gözlenen J-T İstatistiği" #: src/language/stats/jonckheere-terpstra.c:371 msgid "Mean J-T Statistic" msgstr "Ortalama J-T İstatistiği" #: src/language/stats/jonckheere-terpstra.c:372 msgid "Std. Deviation of J-T Statistic" msgstr " J-T İstatistiğinin Standart Sapması" #: src/language/stats/jonckheere-terpstra.c:373 msgid "Std. J-T Statistic" msgstr "Standart J-T İstatistiği" #: src/language/stats/mann-whitney.c:187 src/language/stats/wilcoxon.c:246 msgid "Sum of Ranks" msgstr "Derecelerin Toplamı" #: src/language/stats/mann-whitney.c:248 msgid "Mann-Whitney U" msgstr "Mann-Whitney U" #: src/language/stats/mann-whitney.c:249 msgid "Wilcoxon W" msgstr "Wilcoxon W" #: src/language/stats/mann-whitney.c:250 src/language/stats/runs.c:327 #: src/language/stats/wilcoxon.c:283 msgid "Z" msgstr "Z" #: src/language/stats/means.c:702 msgid "Included" msgstr "İçerilen" #: src/language/stats/means.c:704 src/language/stats/reliability.c:548 msgid "Excluded" msgstr "Hariç tutulan" #: src/language/stats/means.c:753 msgid "Report" msgstr "Rapor" #: src/language/stats/means.c:838 #, fuzzy, c-format #| msgid "" #| "Dependent variable %s has no non-missing values. No analysis for this " #| "variable will be done." msgid "" "The table \"%s\" has no non-empty control variables. No result for this " "table will be displayed." msgstr "" "Bağımlı değişken %s kayıp değer içermiyor. Bu değişken için analiz " "yapılmayacak." #: src/language/stats/means-calc.c:443 msgid "Group Median" msgstr "Grup Medyanı" #: src/language/stats/means-calc.c:455 msgid "First" msgstr "İlk" #: src/language/stats/means-calc.c:456 msgid "Last" msgstr "Son" #: src/language/stats/means-calc.c:458 msgid "Percent N" msgstr "Yüzde N" #: src/language/stats/means-calc.c:459 msgid "Percent Sum" msgstr "Yüzde Toplamı" #: src/language/stats/means-calc.c:461 msgid "Harmonic Mean" msgstr "Harmonik Ortalama" #: src/language/stats/means-calc.c:462 msgid "Geom. Mean" msgstr "Geometrik Ortalama" #: src/language/stats/mcnemar.c:144 msgid "The McNemar test is appropriate only for dichotomous variables" msgstr "McNemar testi çift yönlü değişkenler için uygundur" #: src/language/stats/mcnemar.c:226 src/language/stats/sign.c:105 msgid "Point Probability" msgstr "Nokta Olasılığı" #: src/language/stats/mcnemar.c:229 src/language/stats/sign.c:78 #: src/language/stats/sign.c:108 src/language/stats/t-test-paired.c:199 #: src/language/stats/t-test-paired.c:257 src/language/stats/wilcoxon.c:253 #: src/language/stats/wilcoxon.c:292 #, fuzzy #| msgid "Pair %d" msgid "Pairs" msgstr "%d çifti" #: src/language/stats/median.c:316 msgid "> Median" msgstr "> Medyan" #: src/language/stats/median.c:316 msgid "≤ Median" msgstr "≤ Medyan" #: src/language/stats/npar.c:536 #, c-format msgid "%s subcommand not currently implemented." msgstr "" #: src/language/stats/npar.c:691 #, c-format msgid "Expecting %s, %s, %s or a number." msgstr "" #: src/language/stats/npar.c:845 #, c-format msgid "" "The specified value of HI (%d) is lower than the specified value of LO (%d)" msgstr "Belirlenen YÜKSEK değeri (%d) belirlenen DÜŞÜK (%d) değerinden daha az" #: src/language/stats/npar.c:897 #, c-format msgid "" "%d expected values were given, but the specified range (%d-%d) requires " "exactly %d values." msgstr "" "%d verilen değerleri bekliyordu ancak belirlenen aralık (%d-%d) tamam olarak " "%d değerini gerektiriyor." #: src/language/stats/npar.c:1118 src/language/stats/t-test-parser.c:173 #, c-format msgid "" "PAIRED was specified but the number of variables preceding WITH (%zu) did " "not match the number following (%zu)." msgstr "" #: src/language/stats/oneway.c:361 msgid "LSD" msgstr "LSD" #: src/language/stats/oneway.c:362 src/ui/gui/oneway.ui:338 msgid "Tukey HSD" msgstr "Tukey HSD" #: src/language/stats/oneway.c:363 src/ui/gui/oneway.ui:253 msgid "Bonferroni" msgstr "Bonferroni" #: src/language/stats/oneway.c:364 src/ui/gui/oneway.ui:304 msgid "Scheffé" msgstr "Scheffé" #: src/language/stats/oneway.c:365 msgid "Games-Howell" msgstr "Games-Howell" #: src/language/stats/oneway.c:366 src/ui/gui/oneway.ui:321 msgid "Šidák" msgstr "Šidák" #: src/language/stats/oneway.c:519 #, c-format msgid "The post hoc analysis method %s is not supported." msgstr "" #: src/language/stats/oneway.c:842 #, c-format msgid "" "Dependent variable %s has no non-missing values. No analysis for this " "variable will be done." msgstr "" "Bağımlı değişken %s kayıp değer içermiyor. Bu değişken için analiz " "yapılmayacak." #: src/language/stats/oneway.c:924 #, c-format msgid "" "In contrast list %zu, the number of coefficients (%zu) does not equal the " "number of groups (%d). This contrast list will be ignored." msgstr "" #: src/language/stats/oneway.c:936 #, c-format msgid "Coefficients for contrast %zu do not total zero" msgstr "" #: src/language/stats/oneway.c:971 msgid "ANOVA" msgstr "ANOVA" #: src/language/stats/oneway.c:974 src/language/stats/regression.c:1024 msgid "Sum of Squares" msgstr "Kareler Toplamı" #: src/language/stats/oneway.c:981 msgid "Between Groups" msgstr "Gruplar Arasında" #: src/language/stats/oneway.c:981 msgid "Within Groups" msgstr "Grup İçerisinde" #: src/language/stats/oneway.c:1075 src/language/stats/oneway.c:1257 #, fuzzy #| msgid "_Dependent Variable" msgid "Dependent Variable" msgstr "_Bağımlı Değişken" #: src/language/stats/oneway.c:1148 msgid "Test of Homogeneity of Variances" msgstr "Varyansların Homojenlik Testi" #: src/language/stats/oneway.c:1151 msgid "Levene Statistic" msgstr "Levene İstatistiği" #: src/language/stats/oneway.c:1152 msgid "df1" msgstr "Serbestlik Derecesi1" #: src/language/stats/oneway.c:1153 msgid "df2" msgstr "Serbestlik Derecesi2" #: src/language/stats/oneway.c:1192 msgid "Contrast Coefficients" msgstr "Zıtlık Katsayıları" #: src/language/stats/oneway.c:1199 src/language/stats/oneway.c:1246 msgid "Contrast" msgstr "Zıtlık" #: src/language/stats/oneway.c:1236 msgid "Contrast Tests" msgstr "Zıtlık Testleri" #: src/language/stats/oneway.c:1239 msgid "Value of Contrast" msgstr "Zıtlık Değeri" #: src/language/stats/oneway.c:1241 src/language/stats/regression.c:905 #: src/language/stats/t-test-indep.c:266 #: src/language/stats/t-test-one-sample.c:74 #: src/language/stats/t-test-paired.c:252 msgid "t" msgstr "t" #: src/language/stats/oneway.c:1252 msgid "Assumption" msgstr "" #: src/language/stats/oneway.c:1253 msgid "Assume equal variances" msgstr "Varyanslar eşit sayılır" #: src/language/stats/oneway.c:1254 #, fuzzy #| msgid "Does not assume equal" msgid "Does not assume equal variances" msgstr "Eşit sayılmaz" #: src/language/stats/oneway.c:1367 #, c-format msgid "Multiple Comparisons (%s)" msgstr "Çoklu Karşılaştırmalar (%s)" #: src/language/stats/oneway.c:1374 #, fuzzy #| msgid "Mean Difference" msgid "Mean Difference (I - J)" msgstr "Ortalama Fark" #: src/language/stats/oneway.c:1379 #, c-format msgid "%g%% Confidence Interval" msgstr "%g%% Güven Aralığı" #: src/language/stats/oneway.c:1386 src/language/stats/oneway.c:1390 msgid "(J) Family" msgstr "" #: src/language/stats/oneway.c:1406 #, fuzzy #| msgid "Runs Test" msgid "Test" msgstr "Testi Çalıştır" #: src/language/stats/quick-cluster.c:576 msgid "Initial Cluster Centers" msgstr "" #: src/language/stats/quick-cluster.c:577 msgid "Final Cluster Centers" msgstr "" #: src/language/stats/quick-cluster.c:580 #: src/language/stats/quick-cluster.c:660 #: src/language/stats/quick-cluster.c:661 #: src/language/stats/quick-cluster.c:753 msgid "Cluster" msgstr "Küme" #: src/language/stats/quick-cluster.c:658 msgid "Cluster Membership" msgstr "" #: src/language/stats/quick-cluster.c:744 msgid "Number of Cases in each Cluster" msgstr "Her Kümedeki Vaka Sayısı" #: src/language/stats/quick-cluster.c:750 #, fuzzy #| msgid "Cluster" msgid "Clusters" msgstr "Küme" #: src/language/stats/quick-cluster.c:867 #: src/language/stats/quick-cluster.c:893 #, fuzzy, c-format #| msgid "Variable %s already exists." msgid "A variable called `%s' already exists." msgstr "%s değişkeni zaten var." #: src/language/stats/quick-cluster.c:908 #, fuzzy, c-format #| msgid "expecting %s or %s" msgid "Expecting %s or %s." msgstr "%s veya %s bekleniyor" #: src/language/stats/quick-cluster.c:928 msgid "The number of clusters must be positive" msgstr "" #: src/language/stats/quick-cluster.c:944 #, fuzzy #| msgid "The number of iterations must be positive" msgid "The convergence criterion must be positive" msgstr "Tekrarlanma sayısı pozitif olmalıdır" #: src/language/stats/quick-cluster.c:960 msgid "The number of iterations must be positive" msgstr "Tekrarlanma sayısı pozitif olmalıdır" #: src/language/stats/rank.c:205 #, c-format msgid "" "Cannot generate variable name for ranking %s with %s. All candidates in use." msgstr "" #: src/language/stats/rank.c:321 #, c-format msgid "Too many variables in %s clause." msgstr "" #: src/language/stats/rank.c:323 #, c-format msgid "Variable %s already exists." msgstr "%s değişkeni zaten var." #: src/language/stats/rank.c:325 src/language/expressions/evaluate.c:164 #, c-format msgid "Duplicate variable name %s." msgstr "%s değişken adı zaten kullanılıyor." #: src/language/stats/rank.c:631 #, c-format msgid "%s of %s by %s" msgstr "" #: src/language/stats/rank.c:825 #, fuzzy #| msgid "Number expected." msgid "Variables Created by RANK" msgstr "Sayı bekleniyor." #: src/language/stats/rank.c:828 src/language/stats/rank.c:829 #, fuzzy #| msgid "Name Variable:" msgid "New Variable" msgstr "İsim Değişkeni:" #: src/language/stats/rank.c:829 #, fuzzy #| msgid "Function: " msgid "Function" msgstr "Fonksiyon:" #: src/language/stats/rank.c:830 #, fuzzy #| msgid "Extraction" msgid "Fraction" msgstr "Özet Sonuç" #: src/language/stats/rank.c:830 #, fuzzy #| msgid "_Grouping Variable:" msgid "Grouping Variables" msgstr "_Gruplama Değişkeni:" #: src/language/stats/rank.c:833 src/language/stats/rank.c:834 #, fuzzy #| msgid "_Test Variable:" msgid "Existing Variable" msgstr "_Test Değişkeni:" #: src/language/stats/reliability.c:164 msgid "Reliability on a single variable is not useful." msgstr "Sadece bir değişkenin güvenilirliği faydalı bir bilgi değildir." #: src/language/stats/reliability.c:281 msgid "" "The STATISTICS subcommand is not yet implemented. No statistics will be " "produced." msgstr "" #: src/language/stats/reliability.c:300 msgid "The split point must be less than the number of variables" msgstr "" #: src/language/stats/reliability.c:525 #, c-format msgid "Scale: %s" msgstr "Ölçek: %s" #: src/language/stats/reliability.c:582 msgid "Item-Total Statistics" msgstr "" #: src/language/stats/reliability.c:585 msgid "Scale Mean if Item Deleted" msgstr "" #: src/language/stats/reliability.c:586 msgid "Scale Variance if Item Deleted" msgstr "Eğer Öge Silinmişse Ölçek Varyansı" #: src/language/stats/reliability.c:587 msgid "Corrected Item-Total Correlation" msgstr "" #: src/language/stats/reliability.c:588 msgid "Cronbach's Alpha if Item Deleted" msgstr "Öge Silindiğinde Cronbach'ın Alpha Değeri" #: src/language/stats/reliability.c:627 msgid "Reliability Statistics" msgstr "Güvenilirlik İstatistikleri" #: src/language/stats/reliability.c:634 src/language/stats/reliability.c:646 msgid "Cronbach's Alpha" msgstr "Cronbach's Alpha" #: src/language/stats/reliability.c:635 src/language/stats/reliability.c:649 #: src/language/stats/reliability.c:652 msgid "N of Items" msgstr "Ögelerin N tanesi" #: src/language/stats/reliability.c:647 msgid "Part 1" msgstr "Bölüm 1" #: src/language/stats/reliability.c:650 msgid "Part 2" msgstr "Bölüm 2" #: src/language/stats/reliability.c:654 msgid "Total N of Items" msgstr "" #: src/language/stats/reliability.c:656 msgid "Correlation Between Forms" msgstr "" #: src/language/stats/reliability.c:659 msgid "Spearman-Brown Coefficient" msgstr "Spearman-Brown Katsayısı" #: src/language/stats/reliability.c:660 msgid "Equal Length" msgstr "Eşit Uzunluk" #: src/language/stats/reliability.c:661 msgid "Unequal Length" msgstr "Eşit Olmayan Uzunluk" #: src/language/stats/reliability.c:663 msgid "Guttman Split-Half Coefficient" msgstr "" #: src/language/stats/roc.c:966 msgid "Area Under the Curve" msgstr "Eğrinin Altındaki Alan" #: src/language/stats/roc.c:970 msgid "Area" msgstr "Alan" #: src/language/stats/roc.c:976 msgid "Asymptotic Sig." msgstr "Asimptotik Anlamlılık" #: src/language/stats/roc.c:979 #, c-format msgid "Asymp. %g%% Confidence Interval" msgstr "Asimptotik %g%% Güven Aralığı" #: src/language/stats/roc.c:987 msgid "Variable under test" msgstr "Test edilen değişken" #: src/language/stats/roc.c:1026 msgid "Case Summary" msgstr "Vaka Özeti" #: src/language/stats/roc.c:1030 msgid "Unweighted" msgstr "Ağırlıklandırılmamış" #: src/language/stats/roc.c:1031 msgid "Weighted" msgstr "Ağırlıklı" #: src/language/stats/roc.c:1064 msgid "Coordinates of the Curve" msgstr "Eğrinin Koordinatları" #: src/language/stats/roc.c:1068 msgid "Positive if greater than or equal to" msgstr "Bu değerden büyük veya eşit ise pozitif" #: src/language/stats/roc.c:1069 src/output/charts/roc-chart-cairo.c:38 msgid "Sensitivity" msgstr "Duyarlılık" #: src/language/stats/roc.c:1069 src/output/charts/roc-chart-cairo.c:37 msgid "1 - Specificity" msgstr "1 - Belirginlik" #: src/language/stats/roc.c:1072 #, fuzzy #| msgid "ordinary" msgid "Coordinates" msgstr "olağan" #: src/language/stats/roc.c:1076 msgid "Test variable" msgstr "Değişkeni Test Et" #: src/language/stats/regression.c:224 src/language/stats/regression.c:229 #, c-format msgid "VARIABLES may not appear after %s" msgstr "" #: src/language/stats/regression.c:412 msgid "" "REGRESSION with SAVE ignores TEMPORARY. Temporary transformations will be " "made permanent." msgstr "" #: src/language/stats/regression.c:416 msgid "REGRESSION with SAVE ignores FILTER. All cases will be processed." msgstr "" #: src/language/stats/regression.c:569 msgid "" "The dependent variable is equal to the independent variable. The least " "squares line is therefore Y=X. Standard errors and related statistics may be " "meaningless." msgstr "" #: src/language/stats/regression.c:776 msgid "No valid data found. This command was skipped." msgstr "Geçerli veri bulunamadı. Bu komut atlanıyor." #: src/language/stats/regression.c:863 #, c-format msgid "Model Summary (%s)" msgstr "Model Özeti (%s)" #: src/language/stats/regression.c:868 #: src/ui/gui/psppire-dialog-action-regression.c:42 msgid "R" msgstr "R" #: src/language/stats/regression.c:868 msgid "R Square" msgstr "R Kare" #: src/language/stats/regression.c:868 msgid "Adjusted R Square" msgstr "Ayarlanmış R Kare" #: src/language/stats/regression.c:869 msgid "Std. Error of the Estimate" msgstr "Tahminin Standart Hatası" #: src/language/stats/regression.c:895 #, c-format msgid "Coefficients (%s)" msgstr "Katsayılar (%s)" #: src/language/stats/regression.c:901 msgid "Unstandardized Coefficients" msgstr "" #: src/language/stats/regression.c:904 msgid "Standardized Coefficients" msgstr "" #: src/language/stats/regression.c:904 msgid "Beta" msgstr "Beta" #: src/language/stats/regression.c:911 #, c-format msgid "%g%% Confidence Interval for B" msgstr "" #: src/language/stats/regression.c:919 #, fuzzy #| msgid "Reliability Statistics" msgid "Collinearity Statistics" msgstr "Güvenilirlik İstatistikleri" #: src/language/stats/regression.c:920 #, fuzzy #| msgid "Covariance" msgid "Tolerance" msgstr "Kovaryans" #: src/language/stats/regression.c:920 msgid "VIF" msgstr "" #: src/language/stats/regression.c:933 msgid "(Constant)" msgstr "(Sabit)" #: src/language/stats/regression.c:1020 #, c-format msgid "ANOVA (%s)" msgstr "ANOVA (%s)" #: src/language/stats/regression.c:1031 src/ui/gui/regression.ui:24 msgid "Regression" msgstr "Regresyon" #: src/language/stats/regression.c:1075 #, c-format msgid "Coefficient Correlations (%s)" msgstr "Katsayılı Korelasyonlar (%s)" #: src/language/stats/regression.c:1082 #, fuzzy #| msgid "Model" msgid "Models" msgstr "Model" #: src/language/stats/regression.c:1090 msgid "Covariances" msgstr "Kovaryanslar" #: src/language/stats/runs.c:169 #, c-format msgid "" "Multiple modes exist for variable `%s'. Using %.*g as the threshold value." msgstr "" #: src/language/stats/runs.c:314 src/ui/gui/runs.ui:24 msgid "Runs Test" msgstr "Testi Çalıştır" #: src/language/stats/runs.c:319 msgid "Test Value" msgstr "Test Değeri" #: src/language/stats/runs.c:320 msgid "Test Value (mode)" msgstr "Test Değeri (mod)" #: src/language/stats/runs.c:321 msgid "Test Value (mean)" msgstr "Test Değeri (ortalama)" #: src/language/stats/runs.c:322 msgid "Test Value (median)" msgstr "Test Değeri (medyan)" #: src/language/stats/runs.c:323 msgid "Cases < Test Value" msgstr "Vakalar < Test Değeri" #: src/language/stats/runs.c:324 msgid "Cases ≥ Test Value" msgstr "Vakalar ≥ Test Değeri" #: src/language/stats/runs.c:325 msgid "Total Cases" msgstr "Toplam Vakalar" #: src/language/stats/runs.c:326 msgid "Number of Runs" msgstr "Çalıştırma Sayısı" #: src/language/stats/sign.c:72 #, fuzzy #| msgid "Mean Difference" msgid "Differences" msgstr "Ortalama Fark" #: src/language/stats/sign.c:73 msgid "Negative Differences" msgstr "Negatif Farklar" #: src/language/stats/sign.c:74 msgid "Positive Differences" msgstr "Pozitif Farklar" #: src/language/stats/sign.c:75 src/language/stats/wilcoxon.c:250 msgid "Ties" msgstr "" #: src/language/stats/sort-cases.c:63 msgid "Buffer limit must be at least 2." msgstr "Tampon sınırı en az 2 olmalıdır." #: src/language/stats/sort-criteria.c:89 #, c-format msgid "Variable %s specified twice in sort criteria." msgstr "Değişken %s sınıflandırma ölçütünde iki defa tanımlanmış." #: src/language/stats/t-test-indep.c:190 msgid "Group Statistics" msgstr "Grup İstatistikleri" #: src/language/stats/t-test-indep.c:200 #, fuzzy #| msgid "Group1" msgid "Group" msgstr "Grup1" #: src/language/stats/t-test-indep.c:256 msgid "Independent Samples Test" msgstr "Bağımsız Örnekler Testi" #: src/language/stats/t-test-indep.c:261 msgid "Levene's Test for Equality of Variances" msgstr "" #: src/language/stats/t-test-indep.c:265 #, fuzzy #| msgid "t-test for Equality of Means" msgid "T-Test for Equality of Means" msgstr "Ortalamanın eşitliği için t-testi" #: src/language/stats/t-test-indep.c:269 #: src/language/stats/t-test-one-sample.c:77 msgid "Mean Difference" msgstr "Ortalama Fark" #: src/language/stats/t-test-indep.c:270 msgid "Std. Error Difference" msgstr "Standart Hata Farkı" #: src/language/stats/t-test-indep.c:273 #, fuzzy, no-c-format #| msgid "%g%% Confidence Interval of the Difference" msgid "95% Confidence Interval of the Difference" msgstr "%g%% Farkın Güven Aralığı" #: src/language/stats/t-test-indep.c:277 #, fuzzy #| msgid "Options" msgid "Assumptions" msgstr "Seçenekler" #: src/language/stats/t-test-indep.c:278 msgid "Equal variances assumed" msgstr "Eşit varyanslar alındı" #: src/language/stats/t-test-indep.c:279 msgid "Equal variances not assumed" msgstr "Eşit varyanslar alınmadı" #: src/language/stats/t-test-one-sample.c:64 msgid "One-Sample Test" msgstr "Tek-Örnek Testi" #: src/language/stats/t-test-one-sample.c:71 #, fuzzy, c-format #| msgid "Test Value = %f" msgid "Test Value = %.*g" msgstr "Test Değeri = %f" #: src/language/stats/t-test-one-sample.c:80 #: src/language/stats/t-test-paired.c:246 #, c-format msgid "%g%% Confidence Interval of the Difference" msgstr "%g%% Farkın Güven Aralığı" #: src/language/stats/t-test-one-sample.c:122 msgid "One-Sample Statistics" msgstr "Tek-Örnek İstatistikleri" #: src/language/stats/t-test-paired.c:147 msgid "Paired Sample Statistics" msgstr "Çift Örnek İstatistikleri" #: src/language/stats/t-test-paired.c:163 #: src/language/stats/t-test-paired.c:205 #: src/language/stats/t-test-paired.c:263 #, fuzzy, c-format #| msgid "Pair %d" msgid "Pair %zu" msgstr "%d çifti" #: src/language/stats/t-test-paired.c:190 msgid "Paired Samples Correlations" msgstr "Çift Örnek Korelasyonu" #: src/language/stats/t-test-paired.c:208 #, c-format msgid "%s & %s" msgstr "%s & %s" #: src/language/stats/t-test-paired.c:234 msgid "Paired Samples Test" msgstr "Çift Örnek Testi" #: src/language/stats/t-test-paired.c:240 msgid "Paired Differences" msgstr "" #: src/language/stats/t-test-paired.c:266 #, c-format msgid "%s - %s" msgstr "%s - %s" #: src/language/stats/t-test-parser.c:133 #, c-format msgid "When applying %s to a string variable, two values must be specified." msgstr "" #: src/language/stats/t-test-parser.c:145 #: src/language/stats/t-test-parser.c:241 #, c-format msgid "%s subcommand may not be used with %s." msgstr "" #: src/language/stats/t-test-parser.c:305 msgid "Exactly one of TESTVAL, GROUPS and PAIRS subcommands must be specified." msgstr "" #: src/language/stats/wilcoxon.c:248 msgid "Sign" msgstr "" #: src/language/stats/wilcoxon.c:249 msgid "Negative Ranks" msgstr "Negatif Dereceler " #: src/language/stats/wilcoxon.c:249 msgid "Positive Ranks" msgstr "Pozitif Dereceler" #: src/language/stats/wilcoxon.c:296 msgid "Too many pairs to calculate exact significance" msgstr "" #: src/language/data-io/combine-files.c:214 msgid "Cannot specify the active dataset since none has been defined." msgstr "" #: src/language/data-io/combine-files.c:220 msgid "" "This command may not be used after TEMPORARY when the active dataset is an " "input source. Temporary transformations will be made permanent." msgstr "" #: src/language/data-io/combine-files.c:255 msgid "Multiple IN subcommands for a single FILE or TABLE." msgstr "" #: src/language/data-io/combine-files.c:308 #, c-format msgid "File %s lacks BY variable %s." msgstr "" #: src/language/data-io/combine-files.c:311 #, c-format msgid "Active dataset lacks BY variable %s." msgstr "" #: src/language/data-io/combine-files.c:388 #: src/language/data-io/combine-files.c:393 #, c-format msgid "BY is required when %s is specified." msgstr "" #: src/language/data-io/combine-files.c:521 msgid "" "Combining files with incompatible encodings. String data may not be " "represented correctly." msgstr "" #: src/language/data-io/combine-files.c:564 #, c-format msgid "" "Variable %s in file %s has different type or width from the same variable in " "earlier file." msgstr "" #: src/language/data-io/combine-files.c:570 #, c-format msgid "In file %s, %s is numeric." msgstr "%s dosyasında, %s sayısal." #: src/language/data-io/combine-files.c:573 #, c-format msgid "In file %s, %s is a string variable with width %d." msgstr "" #: src/language/data-io/combine-files.c:578 #, c-format msgid "In an earlier file, %s was numeric." msgstr "" #: src/language/data-io/combine-files.c:581 #, c-format msgid "In an earlier file, %s was a string variable with width %d." msgstr "" #: src/language/data-io/combine-files.c:621 #, c-format msgid "" "Variable name %s specified on %s subcommand duplicates an existing variable " "name." msgstr "" #: src/language/data-io/combine-files.c:793 #, c-format msgid "Encountered %zu sets of duplicate cases in the master file." msgstr "Ana dosya içindeki kopyalanan vakaların %zu serisi ile karşılaşıldı." #: src/language/data-io/data-list.c:129 src/language/data-io/data-list.c:144 #, fuzzy, c-format #| msgid "%s must not be negative." msgid "The %s value must be non-negative." msgstr "%s negatif olmamalıdır." #: src/language/data-io/data-list.c:154 #, c-format msgid "The %s subcommand may only be used within %s." msgstr "" #: src/language/data-io/data-list.c:159 #, c-format msgid "The %s subcommand may only be specified once." msgstr "" #: src/language/data-io/data-list.c:197 msgid "Only one of FIXED, FREE, or LIST may be specified." msgstr "" "SABİT, SERBEST veya LİSTE seçeneklerinden sadece bir tanesi belirlenebilir." #: src/language/data-io/data-list.c:260 msgid "Encoding should not be specified for inline data. It will be ignored." msgstr "" #: src/language/data-io/data-list.c:269 #, c-format msgid "The %s subcommand may be used only with %s." msgstr "" #: src/language/data-io/data-list.c:284 src/language/data-io/matrix-data.c:578 msgid "At least one variable must be specified." msgstr "En az bir değişken belirtilmelidir." #: src/language/data-io/data-list.c:383 src/language/data-io/data-list.c:491 #: src/language/data-io/get-data.c:662 #, c-format msgid "%s is a duplicate variable name." msgstr "" #: src/language/data-io/data-list.c:390 #, c-format msgid "There is already a variable %s of a different type." msgstr "" #: src/language/data-io/data-list.c:397 #, c-format msgid "There is already a string variable %s of a different width." msgstr "" #: src/language/data-io/data-list.c:405 #, c-format msgid "Cannot place variable %s on record %d when RECORDS=%d is specified." msgstr "" #: src/language/data-io/data-parser.c:453 #: src/language/data-io/data-parser.c:462 msgid "Quoted string extends beyond end of line." msgstr "" #: src/language/data-io/data-parser.c:488 msgid "Missing delimiter following quoted string." msgstr "" #: src/language/data-io/data-parser.c:506 #, c-format msgid "Data for variable %s is not valid as format %s: %s" msgstr "" #: src/language/data-io/data-parser.c:536 #, c-format msgid "Partial case of %d of %d records discarded." msgstr "" #: src/language/data-io/data-parser.c:592 #, c-format msgid "Partial case discarded. The first variable missing was %s." msgstr "Yarım vaka değerlendirmeden çıkartıldı. Eksik olan ilk değer %s." #: src/language/data-io/data-parser.c:634 #, c-format msgid "" "Missing value(s) for all variables from %s onward. These will be filled " "with the system-missing value or blanks, as appropriate." msgstr "" #: src/language/data-io/data-parser.c:655 msgid "Record ends in data not part of any field." msgstr "" #: src/language/data-io/data-parser.c:670 #, c-format msgid "Reading %d record from %s." msgid_plural "Reading %d records from %s." msgstr[0] "" msgstr[1] "" #: src/language/data-io/data-parser.c:680 src/language/data-io/print.c:435 msgid "Record" msgstr "Kayıt" #: src/language/data-io/data-parser.c:680 src/language/data-io/print.c:435 #: src/ui/gui/psppire-var-sheet-header.c:76 msgid "Columns" msgstr "Sütunlar" #: src/language/data-io/data-parser.c:680 #: src/language/data-io/data-parser.c:725 src/language/data-io/print.c:435 msgid "Format" msgstr "Biçim" #: src/language/data-io/data-parser.c:720 #, c-format msgid "Reading free-form data from %s." msgstr "%s dosyasından bağımsız form verileri okunuyor." #. TRANSLATORS: this fragment will be interpolated into #. messages in fh_lock() that identify types of files. #: src/language/data-io/data-reader.c:136 src/language/data-io/data-writer.c:79 msgid "data file" msgstr "veri dosyası" #: src/language/data-io/data-reader.c:160 #, c-format msgid "Could not open `%s' for reading as a data file: %s." msgstr "`%s' dosyası okumak için, bir veri dosyası olarak açılamadı: %s." #: src/language/data-io/data-reader.c:174 #, c-format msgid "Could not read `%s' as a text file with encoding `%s': %s." msgstr "`%s' kodu ile `%s' bir metin dosyası olarak okunmadı: %s." #: src/language/data-io/data-reader.c:233 #, c-format msgid "" "Missing %s while reading inline data. This probably indicates a missing or " "incorrectly formatted %s command. %s must appear by itself on a single line " "with exactly one space between words." msgstr "" #: src/language/data-io/data-reader.c:253 #: src/language/data-io/data-reader.c:387 #, c-format msgid "Error reading file %s: %s." msgstr "%s dosyası okunamadı: %s." #: src/language/data-io/data-reader.c:261 #, c-format msgid "Unexpected end of file in partial record reading %s." msgstr "" #: src/language/data-io/data-reader.c:321 #, c-format msgid "Corrupt block descriptor word at offset 0x%lx in %s." msgstr "" #: src/language/data-io/data-reader.c:322 #, c-format msgid "Corrupt record descriptor word at offset 0x%lx in %s." msgstr "" #: src/language/data-io/data-reader.c:335 #, c-format msgid "Corrupt record size at offset 0x%lx in %s." msgstr "" #: src/language/data-io/data-reader.c:493 msgid "Record exceeds remaining block length." msgstr "" #: src/language/data-io/data-reader.c:567 #, c-format msgid "Attempt to read beyond end-of-file on file %s." msgstr "" #: src/language/data-io/data-reader.c:570 #, c-format msgid "Attempt to read beyond %s." msgstr "" #: src/language/data-io/data-reader.c:733 msgid "" "This command is not valid here since the current input program does not " "access the inline file." msgstr "" #: src/language/data-io/data-writer.c:106 #, c-format msgid "An error occurred while opening `%s' for writing as a data file: %s." msgstr "`%s' dosyası, bir veri dosyası olarak yazmak için açılamadı: %s." #: src/language/data-io/data-writer.c:224 #, c-format msgid "I/O error occurred writing data file `%s'." msgstr "`%s' veri dosyası yazılırken girdi/çıktı hatası oluştu." #: src/language/data-io/dataset.c:64 #, c-format msgid "There is no dataset named %s." msgstr "%s adlı bir veri seti dosyası yok." #: src/language/data-io/dataset.c:250 #, fuzzy #| msgid "Dataset" msgid "Datasets" msgstr "Veri Seti" #: src/language/data-io/dataset.c:263 msgid "unnamed dataset" msgstr "İsimsiz Veri Seti" #: src/language/data-io/file-handle.c:61 #, c-format msgid "" "File handle %s is already defined. Use %s before redefining a file handle." msgstr "" #: src/language/data-io/file-handle.c:241 #, c-format msgid "%s must be specified with %s." msgstr "" #: src/language/data-io/file-handle.c:252 #, c-format msgid "" "The specified file mode requires LRECL. Assuming %zu-character records." msgstr "" "Belirlenen dosya modu LRECL gerektiriyor. %zu-karakter kayıtları " "varsayılıyor." #: src/language/data-io/file-handle.c:256 #, fuzzy, c-format #| msgid "" #| "The specified file mode requires LRECL. Assuming %zu-character records." msgid "" "Record length (%d) must be between 1 and %lu bytes. Assuming %zu-character " "records." msgstr "" "Belirlenen dosya modu LRECL gerektiriyor. %zu-karakter kayıtları " "varsayılıyor." #: src/language/data-io/file-handle.c:300 msgid "file" msgstr "dosya" #: src/language/data-io/file-handle.c:302 msgid "inline file" msgstr "satıriçi dosya" #: src/language/data-io/file-handle.c:350 msgid "expecting a file name or handle name" msgstr "bir dosya adı veya tanıtıcı adı bekleniyor" #: src/language/data-io/file-handle.c:365 #, c-format msgid "Handle for %s not allowed here." msgstr "%s için tanıtıcıya burada izin verilmiyor." #: src/language/data-io/get-data.c:108 src/output/measure.c:262 #, c-format msgid "error reading file `%s'" msgstr "`%s' dosyası okunamadı" #: src/language/data-io/get-data.c:127 #, c-format msgid "Unsupported TYPE %s." msgstr "Desteklenmeyen TÜR %s." #: src/language/data-io/get-data.c:278 msgid "The sheet index must be greater than or equal to 1" msgstr "Sayfa dizini 1'den büyük veya eşit olmalıdır" #: src/language/data-io/get-data.c:285 src/language/data-io/get-data.c:308 #: src/language/data-io/get-data.c:327 #, c-format msgid "%s must be followed by either \"%s\" or \"%s\"." msgstr "" #: src/language/data-io/get-data.c:357 #, c-format msgid "" "%s is allowed only with %s arrangement, but %s arrangement was stated or " "implied earlier in this command." msgstr "" #: src/language/data-io/get-data.c:441 src/language/data-io/get-data.c:479 #, c-format msgid "Value of %s must be 1 or greater." msgstr "" #: src/language/data-io/get-data.c:504 msgid "" "Ignoring obsolete IMPORTCASES subcommand. (N OF CASES or SAMPLE may be used " "to substitute.)" msgstr "" #: src/language/data-io/get-data.c:551 msgid "" "In compatible syntax mode, the QUALIFIER string must contain exactly one " "character." msgstr "" #: src/language/data-io/get-data.c:583 #, c-format msgid "" "The record number specified, %ld, is at or before the previous record, %d. " "Data fields must be listed in order of increasing record number." msgstr "" #: src/language/data-io/get-data.c:592 #, c-format msgid "" "The record number specified, %ld, exceeds the number of records per case " "specified on FIXCASE, %d." msgstr "" #: src/language/data-io/get.c:132 #, c-format msgid "%s: Data file dictionary has no variables." msgstr "" #: src/language/data-io/inpt-pgm.c:133 #, c-format msgid "Unexpected end-of-file within %s." msgstr "" #: src/language/data-io/inpt-pgm.c:146 #, c-format msgid "Input program must contain %s or %s." msgstr "" #: src/language/data-io/inpt-pgm.c:152 msgid "Input program did not create any variables." msgstr "Girdi programı hiç değişken oluşturmadı." #: src/language/data-io/inpt-pgm.c:365 msgid "" "REREAD: Column numbers must be positive finite numbers. Column set to 1." msgstr "" #: src/language/data-io/list.c:100 #, fuzzy #| msgid "Dataset" msgid "Data List" msgstr "Veri Seti" #: src/language/data-io/list.c:221 #, c-format msgid "" "The first case (%ld) specified precedes the last case (%ld) specified. The " "values will be swapped." msgstr "" "Belirlenen ilk vaka (%ld) belirlenen son vakadan (%ld) önce geliyor. " "Değerler takas edilecek." #: src/language/data-io/list.c:230 #, fuzzy, c-format #| msgid "" #| "The first case (%ld) to list is less than 1. The value is being reset to " #| "1." msgid "" "The first case (%ld) to list is numbered less than 1. The value is being " "reset to 1." msgstr "İlk vaka (%ld) 1'den küçük. Değer 1'e eşitleniyor." #: src/language/data-io/list.c:237 #, fuzzy, c-format #| msgid "" #| "The last case (%ld) to list is less than 1. The value is being reset to " #| "1." msgid "" "The last case (%ld) to list is numbered less than 1. The value is being " "reset to 1." msgstr "Son vaka (%ld) 1'den küçük. Değer 1'e eşitleniyor." #: src/language/data-io/list.c:244 #, c-format msgid "The step value %ld is less than 1. The value is being reset to 1." msgstr "Adım değeri %ld 1'den küçük. Değer 1'e eşitleniyor." #: src/language/data-io/placement-parser.c:96 #, c-format msgid "" "Number of variables specified (%zu) differs from number of variable formats " "(%zu)." msgstr "" "Belirlenen (%zu) değişken sayıları değişken biçimleri(%zu)'nden farklıdır." #: src/language/data-io/placement-parser.c:106 msgid "" "SPSS-like or Fortran-like format specification expected after variable names." msgstr "" "Değişken isimlerinden sonra SPSS benzeri veya Fortran benzeri biçim " "belirleme bekleniyor." #: src/language/data-io/placement-parser.c:129 #, c-format msgid "The %d columns %d-%d can't be evenly divided into %zu fields." msgstr "%d sütunları %d-%d %zu alanlarına bölünemez." #: src/language/data-io/placement-parser.c:310 msgid "Column positions for fields must be positive." msgstr "Alanlar için sütun konumları pozitif olmalıdır." #: src/language/data-io/placement-parser.c:312 msgid "Column positions for fields must not be negative." msgstr "Alanlar için sütun konumları negatif olamaz." #: src/language/data-io/placement-parser.c:372 msgid "The ending column for a field must be greater than the starting column." msgstr "Bir alan için bitiş sütunu başlangıç sütundan daha büyük olmalıdır." #: src/language/data-io/placement-parser.c:409 #, c-format msgid "" "The record number specified, %.0f, is at or before the previous record, %d. " "Data fields must be listed in order of increasing record number." msgstr "" #: src/language/data-io/print-space.c:127 #, c-format msgid "The expression on %s evaluated to the system-missing value." msgstr "" #: src/language/data-io/print-space.c:130 #, c-format msgid "The expression on %s evaluated to %g." msgstr "" #: src/language/data-io/print.c:189 src/language/data-io/trim.c:58 msgid "expecting a valid subcommand" msgstr "geçerli bir alt komut bekleniyor" #: src/language/data-io/print.c:219 #, c-format msgid "%s is required when binary formats are specified." msgstr "" #: src/language/data-io/print.c:302 #, c-format msgid "Output calls for %d records but %zu specified on RECORDS subcommand." msgstr "" #: src/language/data-io/print.c:432 #, fuzzy #| msgid "Case Processing Summary" msgid "Print Summary" msgstr "Vaka İşleme Özeti" #: src/language/data-io/print.c:462 #, fuzzy #| msgid "Record" msgid "N of Records" msgstr "Kayıt" #: src/language/data-io/matrix-data.c:191 #, c-format msgid "" "There are %d variable declared but the data has at least %d matrix rows." msgstr "" #: src/language/data-io/matrix-data.c:292 msgid "" "The N subcommand was specified, but a N record was also found in the data. " "The N record will be ignored." msgstr "" #: src/language/data-io/matrix-data.c:488 src/language/utilities/set.q:186 #, c-format msgid "%s must not be negative." msgstr "%s negatif olmamalıdır." #: src/language/data-io/matrix-data.c:568 #, fuzzy #| msgid "%s and %s are mutually exclusive" msgid "FORMAT = FULL and FORMAT = NODIAGONAL are mutually exclusive." msgstr "%s ve %s birbirini dışlar (mutually exclusive)" #: src/language/data-io/matrix-reader.c:102 #: src/language/data-io/matrix-reader.c:118 #, fuzzy, c-format #| msgid "There is already a variable named %s." msgid "Matrix dataset lacks a variable called %s." msgstr "%s isimli bir değişken zaten var." #: src/language/data-io/matrix-reader.c:109 #: src/language/data-io/matrix-reader.c:125 #, c-format msgid "Matrix dataset variable %s should be of string type." msgstr "" #: src/language/data-io/save-translate.c:168 #: src/language/data-io/save-translate.c:183 #, c-format msgid "The %s string must contain exactly one character." msgstr "" #: src/language/data-io/save-translate.c:249 #, c-format msgid "Output file `%s' exists but %s was not specified." msgstr "" #: src/language/data-io/save.c:309 msgid "The OUTFILE or METADATA subcommand is required." msgstr "" #: src/language/data-io/trim.c:69 #, c-format msgid "" "Cannot rename %s as %s because there already exists a variable named %s. To " "rename variables with overlapping names, use a single RENAME subcommand such " "as `/RENAME (A=B)(B=C)(C=A)', or equivalently, `/RENAME (A B C=B C A)'." msgstr "" #: src/language/data-io/trim.c:227 #, c-format msgid "" "Number of variables on left side of `=' (%zu) does not match number of " "variables on right side (%zu), in parenthesized group %d of RENAME " "subcommand." msgstr "" #: src/language/data-io/trim.c:242 #, c-format msgid "Requested renaming duplicates variable name %s." msgstr "" #: src/language/data-io/trim.c:281 msgid "Cannot DROP all variables from dictionary." msgstr "" #: src/language/expressions/evaluate.c:151 msgid "expecting number or string" msgstr "rakam veya dize bekleniyor" #: src/language/expressions/helpers.c:43 msgid "" "One of the arguments to a DATE function is not an integer. The result will " "be system-missing." msgstr "" #: src/language/expressions/helpers.c:71 msgid "" "The week argument to DATE.WKYR is not an integer. The result will be system-" "missing." msgstr "" #: src/language/expressions/helpers.c:77 msgid "" "The week argument to DATE.WKYR is outside the acceptable range of 1 to 53. " "The result will be system-missing." msgstr "" #: src/language/expressions/helpers.c:99 msgid "" "The day argument to DATE.YRDAY is not an integer. The result will be system-" "missing." msgstr "" #: src/language/expressions/helpers.c:105 msgid "" "The day argument to DATE.YRDAY is outside the acceptable range of 1 to 366. " "The result will be system-missing." msgstr "" #: src/language/expressions/helpers.c:127 msgid "" "The year argument to YRMODA is greater than 47516. The result will be " "system-missing." msgstr "" #: src/language/expressions/helpers.c:180 #, c-format msgid "" "Unrecognized date unit `%.*s'. Valid date units are `%s', `%s', `%s', `%s', " "`%s', `%s', `%s', and `%s'." msgstr "" "Tanımlanmayan tarih biçim `%.*s'. Geçerli tarih biçimleri `%s', `%s', `%s', " "`%s', `%s', `%s', `%s', `%s'." #: src/language/expressions/helpers.c:333 #, c-format msgid "Invalid DATESUM method. Valid choices are `%s' and `%s'." msgstr "" #: src/language/expressions/parse.c:261 #, c-format msgid "" "Type mismatch: expression has %s type, but a numeric value is required here." msgstr "" #: src/language/expressions/parse.c:274 #, c-format msgid "" "Type mismatch: expression has %s type, but a string value is required here." msgstr "" #: src/language/expressions/parse.c:436 #, c-format msgid "Type mismatch while applying %s operator: cannot convert %s to %s." msgstr "" #: src/language/expressions/parse.c:650 msgid "" "Chaining relational operators (e.g. `a < b < c') will not produce the " "mathematically expected result. Use the AND logical operator to fix the " "problem (e.g. `a < b AND b < c'). If chaining is really intended, " "parentheses will disable this warning (e.g. `(a < b) < c'.)" msgstr "" #: src/language/expressions/parse.c:752 msgid "" "The exponentiation operator (`**') is left-associative, even though right-" "associative semantics are more useful. That is, `a**b**c' equals " "`(a**b)**c', not as `a**(b**c)'. To disable this warning, insert " "parentheses." msgstr "" #: src/language/expressions/parse.c:832 #, c-format msgid "Unknown system variable %s." msgstr "Bilinmeyen sistem değişkeni %s." #: src/language/expressions/parse.c:880 #, c-format msgid "Unknown identifier %s." msgstr "Bilinmeyen tanımlayıcı %s." #: src/language/expressions/parse.c:1102 #, c-format msgid "%s must have at least %d arguments in list." msgstr "" #: src/language/expressions/parse.c:1111 #, c-format msgid "%s must have an even number of arguments in list." msgstr "" #: src/language/expressions/parse.c:1114 #, c-format msgid "%s must have multiple of %d arguments in list." msgstr "" #: src/language/expressions/parse.c:1124 #, c-format msgid "%s function does not accept a minimum valid argument count." msgstr "" #: src/language/expressions/parse.c:1133 #, c-format msgid "%s requires at least %d valid arguments in list." msgstr "" #: src/language/expressions/parse.c:1139 #, c-format msgid "" "With %s, using minimum valid argument count of %d does not make sense when " "passing only %d arguments in list." msgstr "" #: src/language/expressions/parse.c:1193 #, c-format msgid "Type mismatch invoking %s as " msgstr "" #: src/language/expressions/parse.c:1198 msgid "Function invocation " msgstr "" #: src/language/expressions/parse.c:1200 msgid " does not match any known function. Candidates are:" msgstr " hiçbir fonksiyonla eşleşmiyor. Adaylar:" #: src/language/expressions/parse.c:1230 #, c-format msgid "No function or vector named %s." msgstr "%s isimli işlev veya vektör yok." #: src/language/expressions/parse.c:1292 #, c-format msgid "%s is a PSPP extension." msgstr "%s bir PSPP uzantısıdır." #: src/language/expressions/parse.c:1295 #, fuzzy, c-format #| msgid "%s is not a variable name." msgid "%s is not available in this version of PSPP." msgstr "%s bir değişken adı değil." #: src/language/expressions/parse.c:1302 #, c-format msgid "%s may not appear after %s." msgstr "" #: src/libpspp/ext-array.c:66 msgid "failed to create temporary file" msgstr "geçici dosya oluşturulamadı" #: src/libpspp/ext-array.c:106 msgid "seeking in temporary file" msgstr "geçici dosyada aranıyor" #: src/libpspp/ext-array.c:125 msgid "reading temporary file" msgstr "geçici dosya okunuyor" #: src/libpspp/ext-array.c:127 msgid "unexpected end of file reading temporary file" msgstr "" #: src/libpspp/ext-array.c:147 msgid "writing to temporary file" msgstr "geçici dosyaya yazılıyor" #: src/libpspp/i18n.c:1128 msgid "Arabic" msgstr "Arapça" #: src/libpspp/i18n.c:1130 msgid "Armenian" msgstr "Ermenice" #: src/libpspp/i18n.c:1131 msgid "Baltic" msgstr "Baltık" #: src/libpspp/i18n.c:1133 msgid "Celtic" msgstr "Kelt" #: src/libpspp/i18n.c:1134 msgid "Central European" msgstr "Orta Avrupa" #: src/libpspp/i18n.c:1136 msgid "Chinese Simplified" msgstr "Basitleştirilmiş Çince" #: src/libpspp/i18n.c:1138 msgid "Chinese Traditional" msgstr "Geleneksel Çince" #: src/libpspp/i18n.c:1140 msgid "Croatian" msgstr "Hırvatça" #: src/libpspp/i18n.c:1141 msgid "Cyrillic" msgstr "Kiril" #: src/libpspp/i18n.c:1143 msgid "Cyrillic/Russian" msgstr "Kiril/Rusça" #: src/libpspp/i18n.c:1144 msgid "Cyrillic/Ukrainian" msgstr "Kiril/Ukraynaca" #: src/libpspp/i18n.c:1146 msgid "Georgian" msgstr "Gürcüce" #: src/libpspp/i18n.c:1147 msgid "Greek" msgstr "Yunanca" #: src/libpspp/i18n.c:1148 msgid "Gujarati" msgstr "Gujarat Dili" #: src/libpspp/i18n.c:1149 msgid "Gurmukhi" msgstr "Gurmukhi Dili" #: src/libpspp/i18n.c:1150 msgid "Hebrew" msgstr "İbranice" #: src/libpspp/i18n.c:1152 msgid "Hebrew Visual" msgstr "Görsel İbranice" #: src/libpspp/i18n.c:1153 msgid "Hindi" msgstr "Hintçe" #: src/libpspp/i18n.c:1154 msgid "Icelandic" msgstr "İzlanda Dili" #: src/libpspp/i18n.c:1155 msgid "Japanese" msgstr "Japonca" #: src/libpspp/i18n.c:1157 msgid "Korean" msgstr "Korece" #: src/libpspp/i18n.c:1159 msgid "Nordic" msgstr "İskandinav Dili" #: src/libpspp/i18n.c:1160 msgid "Romanian" msgstr "Romence" #: src/libpspp/i18n.c:1162 msgid "South European" msgstr "Güney Avrupa" #: src/libpspp/i18n.c:1163 msgid "Thai" msgstr "Tay Dili" #: src/libpspp/i18n.c:1165 msgid "Turkish" msgstr "Türkçe" #: src/libpspp/i18n.c:1167 msgid "Vietnamese" msgstr "Vietnam Dili" #: src/libpspp/i18n.c:1169 msgid "Western European" msgstr "Batı Avrupa" #: src/libpspp/message.c:89 #, c-format msgid "%s: %s" msgstr "" #: src/libpspp/message.c:113 msgid "error" msgstr "hata" #: src/libpspp/message.c:115 msgid "warning" msgstr "uyarı" #: src/libpspp/message.c:118 msgid "note" msgstr "not" #: src/libpspp/message.c:327 #, c-format msgid "Notes (%d) exceed limit (%d). Suppressing further notes." msgstr "" #: src/libpspp/message.c:335 #, c-format msgid "Warnings (%d) exceed limit (%d). Syntax processing will be halted." msgstr "" #: src/libpspp/message.c:338 #, c-format msgid "Errors (%d) exceed limit (%d). Syntax processing will be halted." msgstr "" #: src/libpspp/zip-reader.c:202 #, c-format msgid "%s: corrupt archive at 0x%llx: expected %# but got %#" msgstr "" #: src/libpspp/zip-reader.c:329 src/libpspp/zip-reader.c:449 #, fuzzy, c-format #| msgid "%s: seek failed (%s)." msgid "%s: open failed (%s)" msgstr "%s: arama başarısız oldu (%s)." #: src/libpspp/zip-reader.c:344 #, fuzzy, c-format #| msgid "Cannot find central directory" msgid "%s: cannot find central directory" msgstr "Merkez dizin bulunamadı" #: src/libpspp/zip-reader.c:353 src/libpspp/zip-reader.c:384 #: src/libpspp/zip-reader.c:468 #, fuzzy, c-format #| msgid "%s: seek failed (%s)." msgid "%s: seek failed (%s)" msgstr "%s: arama başarısız oldu (%s)." #: src/libpspp/zip-reader.c:441 #, fuzzy, c-format #| msgid "%s: unknown option `%s'" msgid "%s: unknown member \"%s\"" msgstr "%s: `%s' bilinmeyen seçenek" #: src/libpspp/zip-reader.c:503 #, c-format msgid "" "%s: name mismatch between central directory (%s) and local file header (%s)" msgstr "" #: src/libpspp/zip-reader.c:696 #, c-format msgid "%s: cannot initialize inflator (%s)" msgstr "" #: src/libpspp/zip-reader.c:751 #, c-format msgid "%s: error inflating \"%s\" (%s)" msgstr "" #: src/libpspp/zip-writer.c:97 utilities/pspp-convert.c:346 #, c-format msgid "%s: error opening output file" msgstr "%s: Çıktı dosyası açılamadı" #: src/libpspp/zip-writer.c:169 #, fuzzy, c-format #| msgid "%s: error opening output file" msgid "%s: error seeking in output file" msgstr "%s: Çıktı dosyası açılamadı" #: src/libpspp/zip-writer.c:210 msgid "error creating temporary file" msgstr "geçici dosya oluşturulamadı" #: src/libpspp/zip-writer.c:279 #, c-format msgid "%s: write failed" msgstr "%s: Yazma hatası" #. TRANSLATORS: This is a format string which, when presented to #. printf like functions, will create a pango markup string to #. display real number in scientific notation. #. #. In its untranslated form, it will display similar to "1.23 x 10^4". You #. can leave it untranslated if this is how scientific notation is usually #. presented in your language. #. #. Some locales (such as German) prefer the centered dot rather than the #. multiplication sign between the mantissa an exponent. In which #. case, you can change "#215;" to "#8901;" or other unicode code #. point as appropriate. #. #. The . in this string does not and should not be changed, since #. that is taken care of by the stdc library. #. #. For information on Pango markup, see #. http://developer.gnome.org/pango/stable/PangoMarkupFormat.html #. #. For tables of unicode code points, see http://unicode.org/charts #. #: src/math/chart-geometry.c:123 #, c-format msgid "%%.%dlf×10%d" msgstr "" #: src/math/histogram.c:145 msgid "" "Not creating histogram because the data contains less than 2 distinct values" msgstr "" #: src/math/percentiles.c:36 msgid "HAverage" msgstr "Ağırlıklı Ortalama" #: src/math/percentiles.c:38 msgid "Rounded" msgstr "Yuvarlanmış" #: src/math/percentiles.c:39 msgid "Empirical" msgstr "Denemeli" #: src/math/percentiles.c:40 msgid "Empirical with averaging" msgstr "" #: src/math/shapiro-wilk.c:84 msgid "" "One or more weight values are non-integer. Fractional parts will be ignored " "when calculating the Shapiro-Wilk statistic." msgstr "" #: src/output/ascii.c:340 #, c-format msgid "ascii: opening output file `%s'" msgstr "ascii: çıktı dosyası `%s' açılıyor" #: src/output/ascii.c:371 #, c-format msgid "%s: %s must be positive integer or `auto'" msgstr "" #: src/output/ascii.c:393 #, c-format msgid "" "ascii: page must be at least %d characters wide, but as configured is only " "%d characters" msgstr "" #: src/output/ascii.c:508 #, c-format msgid "See %s for a chart." msgstr "Grafik için %s konumuna bakın." #: src/output/charts/piechart.c:54 msgid "*MISSING*" msgstr "" #: src/output/csv.c:100 src/output/html.c:117 src/output/journal.c:166 #: src/output/msglog.c:68 #, c-format msgid "error opening output file `%s'" msgstr "`%s' çıktı dosyası açılamadı" #: src/output/driver.c:522 #, c-format msgid "%s is not a valid device type (the choices are `%s' and `%s')" msgstr "%s geçerli bir aygıt türü değil (seçenekler `%s' ve `%s')" #: src/output/driver.c:536 #, c-format msgid "%s: unknown option `%s'" msgstr "%s: `%s' bilinmeyen seçenek" #: src/output/driver.c:553 #, c-format msgid "%s: output option missing `='" msgstr "%s: çıktı seçeneği `=' eksik" #: src/output/driver.c:560 #, c-format msgid "%s: output option specified more than once" msgstr "%s: çıktı seçeneği birden fazla belirtilmiş" #: src/output/html.c:129 msgid "PSPP Output" msgstr "PSPP Çıktısı" #: src/output/html.c:266 msgid "No description" msgstr "Açıklama yok" #: src/output/journal.c:69 #, c-format msgid "error writing output file `%s'" msgstr "`%s' çıktı dosyasına yazılamadı" #: src/output/measure.c:68 #, c-format msgid "`%s' is not a valid length." msgstr "`%s' geçerli bir uzunluk değil." #: src/output/measure.c:96 #, c-format msgid "syntax error in paper size `%s'" msgstr "sayfa boyutunda`%s' sözdizimi hatası" #: src/output/measure.c:233 #, c-format msgid "unknown paper type `%.*s'" msgstr "`%.*s' bilinmeyen sayfa türü" #: src/output/measure.c:251 #, c-format msgid "error opening input file `%s'" msgstr "`%s' girdi dosyası açılamadı" #: src/output/measure.c:279 #, c-format msgid "file `%s' does not state a paper size" msgstr "" #: src/output/options.c:112 #, c-format msgid "%s: `%s' is `%s' but a Boolean value is required" msgstr "%s: `%s' bir `%s' ama bir Mantıksal değer gerekiyor" #: src/output/options.c:187 #, c-format msgid "%s: `%s' is `%s' but one of the following is required: %s" msgstr "%s: `%s' bir `%s' ama şunlardan biri gerekiyor: %s" #: src/output/options.c:231 #, fuzzy, c-format #| msgid "%s: `%s' is `%s' but a positive integer is required" msgid "%s: `%s' is `%s' but a non-negative integer is required" msgstr "%s: `%s' bir `%s' ama pozitif bir tamsayı gerekiyor" #: src/output/options.c:235 #, c-format msgid "%s: `%s' is `%s' but a positive integer is required" msgstr "%s: `%s' bir `%s' ama pozitif bir tamsayı gerekiyor" #: src/output/options.c:238 #, c-format msgid "%s: `%s' is `%s' but an integer is required" msgstr "%s: `%s' bir `%s' ama tamsayı gerekiyor" #: src/output/options.c:241 #, c-format msgid "%s: `%s' is `%s' but an integer greater than %d is required" msgstr "" #: src/output/options.c:246 #, c-format msgid "%s: `%s' is `%s' but an integer between %d and %d is required" msgstr "" #: src/output/options.c:325 #, c-format msgid "%s: `%s' is `%s' but a file name that contains `#' is required." msgstr "" #. TRANSLATORS: Do not translate this string. If the script of your language #. reads from right to left (eg Persian, Arabic, Hebrew etc), then replace #. this string with "output-direction-rtl". Otherwise either leave it #. untranslated or copy it verbatim. #: src/output/render.c:994 msgid "output-direction-ltr" msgstr "" #: src/output/text-item.c:44 msgid "Page Title" msgstr "" #: src/output/text-item.c:47 msgid "Title" msgstr "" #: src/output/text-item.c:51 msgid "Log" msgstr "" #: src/output/text-item.c:54 msgid "Page Break" msgstr "" #: src/output/cairo.c:520 #, c-format msgid "`%s': bad font specification" msgstr "`%s': uygun olmayan yazı tipi belirtimi" #: src/output/cairo.c:744 #, c-format msgid "" "The defined page is not wide enough to hold at least %d characters in the " "default font. In fact, there's only room for %d characters." msgstr "" #: src/output/cairo.c:752 #, c-format msgid "" "The defined page is not long enough to hold at least %d lines in the default " "font. In fact, there's only room for %d lines." msgstr "" #: src/output/cairo.c:837 #, c-format msgid "error opening output file `%s': %s" msgstr "`%s' çıktı dosyası açılamadı: %s" #: src/output/cairo.c:892 #, c-format msgid "error drawing output for %s driver: %s" msgstr "" #: src/output/cairo.c:2056 #, c-format msgid "error writing output file `%s': %s" msgstr "`%s' çıktı dosyasına yazılamadı: %s" #: src/output/charts/np-plot-cairo.c:37 #, c-format msgid "Normal Q-Q Plot of %s" msgstr "" #: src/output/charts/np-plot-cairo.c:38 src/output/charts/np-plot-cairo.c:68 msgid "Observed Value" msgstr "Gözlenen Değer" #: src/output/charts/np-plot-cairo.c:39 msgid "Expected Normal" msgstr "Beklenen Normal" #: src/output/charts/np-plot-cairo.c:67 #, c-format msgid "Detrended Normal Q-Q Plot of %s" msgstr "" #: src/output/charts/np-plot-cairo.c:69 msgid "Dev from Normal" msgstr "" #: src/output/charts/barchart-cairo.c:65 msgid "Bar Chart" msgstr "" #: src/output/charts/plot-hist-cairo.c:43 #, c-format msgid "N = %.2f" msgstr "N = %.2f" #: src/output/charts/plot-hist-cairo.c:52 #, c-format msgid "Mean = %.1f" msgstr "Ortalama = %.1f" #: src/output/charts/plot-hist-cairo.c:61 #, c-format msgid "Std. Dev = %.2f" msgstr "Standart Sapma = %.2f" #: src/output/charts/plot-hist-cairo.c:110 msgid "HISTOGRAM" msgstr "ÇUBUK GRAFİĞİ" #: src/output/charts/roc-chart-cairo.c:36 src/ui/gui/roc.ui:24 msgid "ROC Curve" msgstr "ROC Eğrisi" #: src/output/charts/scree-cairo.c:36 msgid "Scree Plot" msgstr "Kaygantaş Çizimi" #: src/output/charts/scree-cairo.c:38 msgid "Eigenvalue" msgstr "Özdeğer" #: src/output/charts/spreadlevel-cairo.c:37 #, c-format msgid "Spread vs. Level Plot of %s" msgstr "" #: src/output/charts/spreadlevel-cairo.c:38 msgid "Level" msgstr "Düzey" #: src/output/charts/spreadlevel-cairo.c:39 msgid "Spread" msgstr "Yayılma" #: src/output/charts/scatterplot-cairo.c:57 #, c-format msgid "Scatterplot %s" msgstr "" #: src/output/spv/spv-legacy-decoder.c:2222 msgid "Table lacks cell data." msgstr "" #: src/output/spv/spv-writer.c:68 #, fuzzy, c-format #| msgid "%s: write failed" msgid "%s: create failed" msgstr "%s: Yazma hatası" #: src/output/spv/spv-writer.c:89 #, fuzzy #| msgid "%s: error writing output file" msgid "I/O error writing SPV file" msgstr "%s: çıktı dosyası yazma hatası" #: src/output/spv/spv.c:693 #, fuzzy, c-format #| msgid "failed to create temporary file" msgid "%s: Failed to create XML parser" msgstr "geçici dosya oluşturulamadı" #: src/output/spv/spv.c:718 #, c-format msgid "%s: document is not well-formed" msgstr "" #: src/output/spv/spv.c:726 #, c-format msgid "%s: root node is \"%s\" but \"%s\" was expected" msgstr "" #: src/ui/gui/psppire-acr.c:273 msgid "Add" msgstr "Ekle" #: src/ui/gui/psppire-acr.c:274 msgid "Edit" msgstr "Düzenle" #: src/ui/gui/psppire-acr.c:275 msgid "Remove" msgstr "Kaldır" #: src/ui/gui/psppire-buttonbox.c:311 msgid "OK" msgstr "Tamam" #: src/ui/gui/psppire-buttonbox.c:319 msgid "Go To" msgstr "Git" #: src/ui/gui/psppire-buttonbox.c:327 msgid "Continue" msgstr "Devam Et" #: src/ui/gui/psppire-buttonbox.c:339 src/ui/gui/psppire-import-assistant.c:759 msgid "Paste" msgstr "Yapıştır" #: src/ui/gui/psppire-buttonbox.c:345 #: src/ui/gui/psppire-dialog-action-aggregate.c:216 #: src/ui/gui/psppire-data-window.c:496 src/ui/gui/psppire-data-window.c:624 #: src/ui/gui/psppire-output-window.c:353 #: src/ui/gui/psppire-syntax-window.c:594 src/ui/gui/psppire-window.c:445 #: src/ui/gui/psppire-window.c:628 msgid "Cancel" msgstr "İptal" #: src/ui/gui/psppire-buttonbox.c:351 msgid "Close" msgstr "Kapat" #: src/ui/gui/psppire-buttonbox.c:358 src/ui/gui/psppire-import-assistant.c:760 msgid "Reset" msgstr "Sıfırlama" #: src/ui/gui/psppire-buttonbox.c:365 msgid "Help" msgstr "Yardım" #: src/ui/gui/psppire-dialog-action-aggregate.c:213 msgid "Aggregate destination file" msgstr "Hedef dosyayı kümele" #: src/ui/gui/psppire-dialog-action-aggregate.c:217 #: src/ui/gui/psppire-data-window.c:493 src/ui/gui/psppire-data-window.c:497 #: src/ui/gui/psppire-output-window.c:354 #: src/ui/gui/psppire-syntax-window.c:595 src/ui/gui/psppire-window.c:449 #: src/ui/gui/aggregate.ui:565 msgid "Save" msgstr "Kaydet" #: src/ui/gui/psppire-dialog-action-aggregate.c:226 #: src/ui/gui/psppire-data-window.c:503 msgid "System Files (*.sav)" msgstr "Sistem Dosyaları (*.sav)" #: src/ui/gui/psppire-dialog-action-aggregate.c:231 #: src/ui/gui/psppire-data-window.c:508 msgid "Compressed System Files (*.zsav)" msgstr "Sıkıştırılmış Sistem Dosyaları (*.zsav)" #: src/ui/gui/psppire-dialog-action-aggregate.c:236 #: src/ui/gui/psppire-data-window.c:513 src/ui/gui/psppire-window.c:652 msgid "Portable Files (*.por) " msgstr "Taşınabilir Dosyalar (*.por) " #: src/ui/gui/psppire-dialog-action-autorecode.c:337 #: src/ui/gui/psppire-dialog-action-recode.c:535 #: src/ui/gui/psppire-dialog-action-recode-different.c:288 msgid "New" msgstr "Yeni" #: src/ui/gui/psppire-dialog-action-autorecode.c:351 #: src/ui/gui/psppire-dialog-action-recode.c:527 #: src/ui/gui/psppire-dialog-action-recode-different.c:301 msgid "Old" msgstr "Eski" #: src/ui/gui/psppire-dialog-action-comments.c:142 #, c-format msgid "Column Number: %d" msgstr "Sütun Numarası: %d" #: src/ui/gui/psppire-dialog-action-crosstabs.c:71 msgid "Chisq" msgstr "Ki-Kare" #: src/ui/gui/psppire-dialog-action-crosstabs.c:71 msgid "" "Pearson chi-square, likelihood ratio, Fisher’s exact test, continuity " "correction, linear-by-linear association." msgstr "" #: src/ui/gui/psppire-dialog-action-crosstabs.c:74 #: src/language/stats/crosstabs.q:1334 msgid "Phi" msgstr "Fi" #: src/ui/gui/psppire-dialog-action-crosstabs.c:75 msgid "CC" msgstr "Çaprazlık Katsayısı" #: src/ui/gui/psppire-dialog-action-crosstabs.c:75 #, fuzzy #| msgid "Contingency Coefficient" msgid "Contingency coefficient" msgstr "Çaprazlık Katsayısı" #: src/ui/gui/psppire-dialog-action-crosstabs.c:77 msgid "UC" msgstr "Belirsizlik Katsayısı" #: src/ui/gui/psppire-dialog-action-crosstabs.c:77 #, fuzzy #| msgid "Uncertainty Coefficient" msgid "Uncertainty coefficient" msgstr "Belirsizlik Katsayısı" #: src/ui/gui/psppire-dialog-action-crosstabs.c:78 msgid "BTau" msgstr "Tau-b" #: src/ui/gui/psppire-dialog-action-crosstabs.c:78 #, fuzzy #| msgid "Kendall's tau-b" msgid "Kendall's Tau-b" msgstr "Kendall's tau-b" #: src/ui/gui/psppire-dialog-action-crosstabs.c:79 msgid "CTau" msgstr "Tau-c" #: src/ui/gui/psppire-dialog-action-crosstabs.c:79 #, fuzzy #| msgid "Kendall's tau-c" msgid "Kendall's Tau-c" msgstr "Kendall's tau-c" #: src/ui/gui/psppire-dialog-action-crosstabs.c:80 msgid "Risk" msgstr "Risk" #: src/ui/gui/psppire-dialog-action-crosstabs.c:80 #, fuzzy #| msgid "Risk estimate." msgid "Relative Risk estimate" msgstr "Risk tahmini." #: src/ui/gui/psppire-dialog-action-crosstabs.c:81 #: src/language/stats/crosstabs.q:1338 msgid "Gamma" msgstr "Gamma" #: src/ui/gui/psppire-dialog-action-crosstabs.c:82 msgid "D" msgstr "D" #: src/ui/gui/psppire-dialog-action-crosstabs.c:82 #, fuzzy #| msgid "Somers' d" msgid "Somer's d" msgstr "Somers' d" #: src/ui/gui/psppire-dialog-action-crosstabs.c:83 #: src/language/stats/crosstabs.q:1344 msgid "Kappa" msgstr "Kappa" #: src/ui/gui/psppire-dialog-action-crosstabs.c:83 msgid "Cohen's Kappa" msgstr "" #: src/ui/gui/psppire-dialog-action-crosstabs.c:84 #: src/language/stats/crosstabs.q:1429 msgid "Eta" msgstr "Eta" #: src/ui/gui/psppire-dialog-action-crosstabs.c:85 msgid "Corr" msgstr "Korr." #: src/ui/gui/psppire-dialog-action-crosstabs.c:85 #, fuzzy #| msgid "Spearman Correlation" msgid "Spearman correlation, Pearson's r" msgstr "Spearman Korelasyonu" #: src/ui/gui/psppire-dialog-action-crosstabs.c:90 #, fuzzy #| msgid "Frequency" msgid "Frequency Count" msgstr "Frekans" #: src/ui/gui/psppire-dialog-action-crosstabs.c:91 msgid "Row" msgstr "Satır" #: src/ui/gui/psppire-dialog-action-crosstabs.c:91 #, fuzzy #| msgid "Percent" msgid "Row percent" msgstr "Yüzde" #: src/ui/gui/psppire-dialog-action-crosstabs.c:92 msgid "Column" msgstr "Sütun" #: src/ui/gui/psppire-dialog-action-crosstabs.c:92 #, fuzzy #| msgid "Cum Percent" msgid "Column percent" msgstr "Kümülatif Yüzde" #: src/ui/gui/psppire-dialog-action-crosstabs.c:93 #, fuzzy #| msgid "Valid Percent" msgid "Total percent" msgstr "Geçerli Yüzde" #: src/ui/gui/psppire-dialog-action-crosstabs.c:94 #: src/language/stats/crosstabs.q:1266 msgid "Expected" msgstr "Beklenen" #: src/ui/gui/psppire-dialog-action-crosstabs.c:94 #, fuzzy #| msgid "Expected Values:" msgid "Expected value" msgstr "_Beklenen Değerler:" #: src/ui/gui/psppire-dialog-action-crosstabs.c:96 #: src/language/stats/crosstabs.q:1268 msgid "Std. Residual" msgstr "Standart Artık" #: src/ui/gui/psppire-dialog-action-crosstabs.c:96 #, fuzzy #| msgid "Std. Residual" msgid "Standardized Residual" msgstr "Standart Artık" #: src/ui/gui/psppire-dialog-action-crosstabs.c:97 msgid "Adjusted Std. Residual" msgstr "Ayarlanmış Standart Artık" #: src/ui/gui/psppire-dialog-action-descriptives.c:45 msgid "Standard error" msgstr "Standart hata" #: src/ui/gui/psppire-dialog-action-descriptives.c:45 #, fuzzy #| msgid "Standard error of the mean" msgid "Standard error of mean" msgstr "Ortalamanın standart hatası" #: src/ui/gui/psppire-dialog-action-descriptives.c:47 #, fuzzy #| msgid "Standard error of the kurtosis" msgid "Kurtosis and standard error of kurtosis" msgstr "Basıklığın standart hatası" #: src/ui/gui/psppire-dialog-action-descriptives.c:48 #, fuzzy #| msgid "Standard error of the skewness" msgid "Skewness and standard error of skewness" msgstr "Çarpıklığın standart hatası" #: src/ui/gui/psppire-dialog-action-factor.c:323 #, c-format msgid "_Eigenvalues over %4.2f times the mean eigenvalue" msgstr "" #: src/ui/gui/psppire-dialog-action-frequencies.c:44 msgid "Standard error of the mean" msgstr "Ortalamanın standart hatası" #: src/ui/gui/psppire-dialog-action-frequencies.c:47 msgid "Standard error of the skewness" msgstr "Çarpıklığın standart hatası" #: src/ui/gui/psppire-dialog-action-frequencies.c:51 msgid "Standard error of the kurtosis" msgstr "Basıklığın standart hatası" #: src/ui/gui/psppire-dialog-action-oneway.c:175 #, c-format msgid "Contrast %d of %d" msgstr "" #: src/ui/gui/psppire-dialog-action-paired.c:162 src/ui/gui/examine.ui:282 #: src/ui/gui/indep-samples.ui:334 src/ui/gui/t-test.ui:296 msgid "O_ptions..." msgstr "_Seçenekler..." #: src/ui/gui/psppire-dialog-action-paired.c:168 msgid "Paired Samples T Test" msgstr "Bağlı İki Örneklemli T Testi" #: src/ui/gui/psppire-dialog-action-recode-different.c:327 msgid "Recode into Different Variables" msgstr "Farklı Değişkenlere Kodla" #: src/ui/gui/psppire-dialog-action-recode-different.c:330 msgid "Recode into Different Variables: Old and New Values " msgstr "Farklı Değişkenlere Kodla: Eski ve Yeni Değerler " #: src/ui/gui/psppire-dialog-action-recode-same.c:108 src/ui/gui/recode.ui:391 msgid "Recode into Same Variables" msgstr "Aynı Değişkenlere Kodla" #: src/ui/gui/psppire-dialog-action-recode-same.c:114 msgid "Recode into Same Variables: Old and New Values" msgstr "Aynı Değişkenlere Kodla: Eski ve Yeni Değerler" #: src/ui/gui/psppire-dialog-action-regression.c:40 msgid "Coeff" msgstr "Katsayı" #: src/ui/gui/psppire-dialog-action-regression.c:40 msgid "Show the regression coefficients" msgstr "" #: src/ui/gui/psppire-dialog-action-regression.c:41 msgid "Conf. Interval" msgstr "" #: src/ui/gui/psppire-dialog-action-regression.c:41 msgid "Show the confidence interval for the regression coefficients" msgstr "" #: src/ui/gui/psppire-dialog-action-regression.c:42 msgid "Show the correlation between observed and predicted values" msgstr "" #: src/ui/gui/psppire-dialog-action-regression.c:43 msgid "Anova" msgstr "Anova" #: src/ui/gui/psppire-dialog-action-regression.c:43 msgid "Show the analysis of variance table" msgstr "" #: src/ui/gui/psppire-dialog-action-regression.c:44 msgid "Bcov" msgstr "Bcov" #: src/ui/gui/psppire-dialog-action-regression.c:44 msgid "Show the variance coefficient matrix" msgstr "" #: src/ui/gui/psppire-dialog-action-regression.c:45 #, fuzzy #| msgid "Total" msgid "Tol" msgstr "Toplam" #: src/ui/gui/psppire-dialog-action-regression.c:45 msgid "Show the variance inflation factor and its reciprocal" msgstr "" #: src/ui/gui/psppire-dialog-action-select.c:88 #, c-format msgid "Approximately %3d%% of all cases." msgstr "Tüm vakaların yaklaşık %%%3d kadarını seç." #: src/ui/gui/psppire-dialog-action-select.c:89 #, c-format msgid "Exactly %3d cases from the first %3d cases." msgstr "Tam olarak %3d vaka seç (ilk %3d vaka arasından)." #: src/ui/gui/psppire-dialog-action-select.c:236 #, c-format msgid "%d thru %d" msgstr "" #: src/ui/gui/psppire-dialog-action-two-sample.c:180 #: src/ui/gui/k-independent.ui:404 src/ui/gui/k-related.ui:197 msgid "Test Type" msgstr "Test Tipi" #: src/ui/gui/psppire-dialog-action-two-sample.c:189 msgid "_Wilcoxon" msgstr "_Wilcoxon" #: src/ui/gui/psppire-dialog-action-two-sample.c:190 msgid "_Sign" msgstr "" #: src/ui/gui/psppire-dialog-action-two-sample.c:191 msgid "_McNemar" msgstr "_McNemar" #: src/ui/gui/psppire-dialog-action-two-sample.c:209 msgid "Two-Related-Samples Tests" msgstr "İki Bağlı Örneklem Testleri" #: src/ui/gui/psppire-dialog-action-weight.c:74 src/ui/gui/weight.ui:83 #: src/ui/gui/weight.ui:211 msgid "Do not weight cases" msgstr "Vakaları ağırlıklandırma" #: src/ui/gui/psppire-dialog-action-weight.c:80 #, c-format msgid "Weight cases by %s" msgstr "Vakaları %s ile ağırlıklandır" #: src/ui/gui/psppire-dict.c:95 #, fuzzy #| msgid "Var%d" msgid "Var" msgstr "Değişken%d" #. TRANSLATORS: This string must be a valid variable name. That means: #. - The string must be at most 64 bytes (not characters) long. #. - The string may not contain whitespace. #. - The first character may not be '$' #. - The first character may not be a digit #. - The final character may not be '.' or '_' #. #: src/ui/gui/psppire-dict.c:385 #, c-format msgid "Var%04d" msgstr "" #: src/ui/gui/psppire-dict.c:566 msgid "Duplicate variable name." msgstr "Değişken adı zaten kullanılıyor." #: src/ui/gui/psppire-dictview.c:617 msgid "Prefer variable labels" msgstr "Değişken etiketlerini tercih et" #: src/ui/gui/psppire-dictview.c:631 msgid "Default sort order" msgstr "Varsayılan sıralama düzeni" #: src/ui/gui/psppire-dictview.c:637 msgid "Unsorted (dictionary order)" msgstr "Sıralanmamış (sözlük sırası)" #: src/ui/gui/psppire-dictview.c:642 msgid "Sort by name" msgstr "Ada göre sırala" #: src/ui/gui/psppire-dictview.c:647 msgid "Sort by label" msgstr "Etiket göre sırala" #: src/ui/gui/psppire-means-layer.c:95 #, c-format msgid "Layer %d of %d" msgstr "%d katmanı %d" #: src/ui/gui/psppire-means-layer.c:169 msgid "Forward" msgstr "" #: src/ui/gui/psppire-means-layer.c:170 msgid "Back" msgstr "" #: src/ui/gui/psppire-text-file.c:55 #, c-format msgid "Could not open `%s'" msgstr "`%s' açılamadı" #: src/ui/gui/psppire-text-file.c:71 #, c-format msgid "Error reading `%s': %s" msgstr "`%s' okunamadı: %s" #: src/ui/gui/psppire-text-file.c:74 #, c-format msgid "" "Failed to read `%s', because it contains a line over %d bytes long and " "therefore appears not to be a text file." msgstr "" "`%s' dosyasını okuma başarısız oldu. Çünkü %d bayt uzunluğundan fazla satır " "içeriyor ve bu nedenle bir metin dosyası olarak gözükmüyor." #: src/ui/gui/psppire-text-file.c:96 #, c-format msgid "`%s' is empty." msgstr "`%s' boş." #: src/ui/gui/psppire-val-chooser.c:255 msgid "through" msgstr "boyunca" #: src/ui/gui/psppire-val-chooser.c:288 msgid "_Value:" msgstr "_Değer:" #: src/ui/gui/psppire-val-chooser.c:289 msgid "_System Missing" msgstr "_Sistem Eksik" #: src/ui/gui/psppire-val-chooser.c:290 msgid "System _or User Missing" msgstr "Sistem _veya Kullanıcı Eksik" #: src/ui/gui/psppire-val-chooser.c:291 msgid "_Range:" msgstr "_Aralık:" #: src/ui/gui/psppire-val-chooser.c:292 msgid "Range, _LOWEST thru value" msgstr "Aralık, _ENDÜŞÜK değerden değere" #: src/ui/gui/psppire-val-chooser.c:293 msgid "Range, value thru _HIGHEST" msgstr "Aralık, değerden EN _YÜKSEK değere" #: src/ui/gui/psppire-val-chooser.c:294 msgid "_All other values" msgstr "_Diğer tüm değerler" #: src/ui/gui/psppire-var-view.c:153 #, c-format msgid "Var%d" msgstr "Değişken%d" #: src/ui/source-init-opts.c:72 #, c-format msgid "Algorithm must be either `%s' or `%s'." msgstr "Algoritma ya `%s' ya da`%s' olmalıdır." #: src/ui/source-init-opts.c:97 #, c-format msgid "Syntax must be either `%s' or `%s'." msgstr "Sözdizimi ya `%s' ya da `%s' olmalıdır." #: src/ui/terminal/main.c:144 msgid "Error encountered while ERROR=STOP is effective." msgstr "" #: src/ui/terminal/main.c:150 msgid "" "Stopping syntax file processing here to avoid a cascade of dependent command " "failures." msgstr "" #: src/ui/terminal/terminal-opts.c:147 #, fuzzy, c-format msgid "" "PSPP, a program for statistical analysis of sampled data.\n" "Usage: %s [OPTION]... FILE...\n" "\n" "Arguments to long options also apply to equivalent short options.\n" "\n" "Output options:\n" " -o, --output=FILE output to FILE, default format from FILE's name\n" " -O format=FORMAT override format for previous -o\n" " -O OPTION=VALUE set output option to customize previous -o\n" " -O device={terminal|listing} override device type for previous -o\n" " -e, --error-file=FILE append errors, warnings, and notes to FILE\n" " --no-output disable default output driver\n" "Supported output formats: %s\n" "\n" "Language options:\n" " -I, --include=DIR append DIR to search path\n" " -I-, --no-include clear search path\n" " -r, --no-statrc disable running rc file at startup\n" " -a, --algorithm={compatible|enhanced}\n" " set to `compatible' if you want output\n" " calculated from broken algorithms\n" " -x, --syntax={compatible|enhanced}\n" " set to `compatible' to disable PSPP extensions\n" " -b, --batch interpret syntax in batch mode\n" " -i, --interactive interpret syntax in interactive mode\n" " --syntax-encoding=ENCODING specify encoding for syntax files\n" " -s, --safer don't allow some unsafe operations\n" "Default search path: %s\n" "\n" "Informative output:\n" " -h, --help display this help and exit\n" " -V, --version output version information and exit\n" "\n" "Non-option arguments are interpreted as syntax files to execute.\n" msgstr "" "PSPP, örneklenmiş verilerin istatistiksel analizi için bir uygulamadır.\n" "Kullanım: %s [SEÇENEK]... DOSYA...\n" "\n" "Arguments to long options also apply to equivalent short options.\n" "\n" "Çıktı Seçenekleri:\n" " -o, --output=FILE output to FILE, default format from FILE's name\n" " -O format=FORMAT override format for previous -o\n" " -O OPTION=VALUE set output option to customize previous -o\n" " -O device={terminal|listing} override device type for previous -o\n" " -e, --error-file=FILE append errors, warnings, and notes to FILE\n" " --no-output varsayılan çıktı sürücüsünü iptal eder\n" "Desteklenen çıktı biçimleri: %s\n" "\n" "Dil Seçenekleri:\n" " -I, --include=DIR append DIR to search path\n" " -I-, --no-include arama yolunu temizler\n" " -r, --no-statrc disable running rc file at startup\n" " -a, --algorithm={compatible|enhanced}\n" " set to `compatible' if you want output\n" " calculated from broken algorithms\n" " -x, --syntax={compatible|enhanced}\n" " set to `compatible' to disable PSPP extensions\n" " -b, --batch interpret syntax in batch mode\n" " -i, --interactive interpret syntax in interactive mode\n" " --syntax-encoding=ENCODING sözdizimi dosyaları için kodlama belirler\n" " -s, --safer bazı güvensiz eylemlere izin vermez\n" "Öntanımlı arama yolu: %s\n" "\n" "Bilgilendirici Çıktı:\n" " -h, --help Bu yardımı gösterir ve çıkış\n" " -V, --version çıktı sürüm bilgisi ve çıkış\n" "\n" "Non-option arguments are interpreted as syntax files to execute.\n" #: src/ui/gui/find-dialog.c:197 #, fuzzy #| msgid "_Find..." msgid "Find" msgstr "_Bul..." #: src/ui/gui/find-dialog.c:662 #, c-format msgid "Bad regular expression: %s" msgstr "Hatalı düzenli ifade: %s" #: src/ui/gui/help-menu.c:70 msgid "A program for the analysis of sampled data" msgstr "Örneklenmiş verileri analiz etmek için bir uygulama" #. TRANSLATORS: Do not translate this string. Instead, put the names of the people #. who have helped in the translation. #: src/ui/gui/help-menu.c:80 msgid "translator-credits" msgstr "" "Serdar Soytetir \n" "Ayhan YALÇINSOY " #: src/ui/gui/help-menu.c:170 #, c-format msgid "Help path conversion error: %s" msgstr "" #: src/ui/gui/help-menu.c:197 #, fuzzy, c-format #| msgid "" #| "Cannot open reference manual: %s. The PSPP user manual is also available " #| "at %s" msgid "" "Cannot open via html: %s with uri: %s The PSSP manual is also available at %s" msgstr "" "Başvuru kılavuzu açılamıyor: %s. PSPP kullanıcı kılavuzu %s adresinde " "bulunmaktadır." #: src/ui/gui/help-menu.c:218 msgid "_Help" msgstr "_Yardım" #: src/ui/gui/help-menu.c:221 msgid "_About" msgstr "" #: src/ui/gui/help-menu.c:222 msgid "_Reference Manual" msgstr "_Başvuru Kitabı" #: src/ui/gui/main.c:306 msgid "Show version information and exit" msgstr "" #: src/ui/gui/main.c:409 msgid "Do not display the splash screen" msgstr "" #: src/ui/gui/main.c:411 msgid "Do not attempt single instance negotiation" msgstr "" #: src/ui/gui/missing-val-dialog.c:217 msgid "" "The maximum length of a missing value for a string variable is 8 in UTF-8." msgstr "" #: src/ui/gui/missing-val-dialog.c:268 #, fuzzy #| msgid "At least one variable must be specified." msgid "At least one value must be specified" msgstr "En az bir değişken belirtilmelidir." #: src/ui/gui/missing-val-dialog.c:298 msgid "Incorrect range specification" msgstr "Geçersiz aralık belirlemesi" #: src/ui/gui/psppire-data-editor.c:380 #, c-format msgid "%d : %s" msgstr "" #: src/ui/gui/psppire-data-editor.c:391 #, c-format msgid "%'d case" msgid_plural "%'d cases" msgstr[0] "%'d vaka" msgstr[1] "%'d vaka" #: src/ui/gui/psppire-data-editor.c:396 #, c-format msgid "%'d variable" msgid_plural "%'d variables" msgstr[0] "%'d değişken" msgstr[1] "%'d değişken" #: src/ui/gui/psppire-data-editor.c:485 msgid "Case" msgstr "Vaka" #: src/ui/gui/psppire-data-editor.c:495 msgid "Data View" msgstr "Veri Görünümü" #: src/ui/gui/psppire-data-editor.c:505 msgid "Variable View" msgstr "Değişken Görünümü" #: src/ui/gui/psppire-data-sheet.c:171 src/ui/gui/psppire-data-window.c:1338 #, fuzzy #| msgid "Insert Case" msgid "_Insert Case" msgstr "Vaka Ekle" #: src/ui/gui/psppire-data-sheet.c:179 src/ui/gui/psppire-data-window.c:1391 #, fuzzy #| msgid "_Clear Cases" msgid "Cl_ear Cases" msgstr "Vakaları temizle" #: src/ui/gui/psppire-data-sheet.c:305 src/ui/gui/psppire-data-window.c:1337 #: src/ui/gui/psppire-variable-sheet.c:274 #, fuzzy #| msgid "Insert Variable" msgid "_Insert Variable" msgstr "Değişken Ekle" #: src/ui/gui/psppire-data-sheet.c:314 src/ui/gui/psppire-variable-sheet.c:283 msgid "Cl_ear Variables" msgstr "Değişkenleri _Temizle" #: src/ui/gui/psppire-data-sheet.c:326 msgid "Sort _Ascending" msgstr "Artan Sıralama" #: src/ui/gui/psppire-data-sheet.c:333 msgid "Sort _Descending" msgstr "Azalan Sıralama" #: src/ui/gui/psppire-data-window.c:175 msgid "Transformations Pending" msgstr "Bekleyen Dönüşümler" #: src/ui/gui/psppire-data-window.c:191 msgid "Filter off" msgstr "Filtreleme kapalı" #: src/ui/gui/psppire-data-window.c:203 #, c-format msgid "Filter by %s" msgstr "%s ile filtrele" #: src/ui/gui/psppire-data-window.c:224 msgid "No Split" msgstr "Bölme Yok" #: src/ui/gui/psppire-data-window.c:233 msgid "Split by " msgstr "Böl: " #: src/ui/gui/psppire-data-window.c:261 msgid "Weights off" msgstr "Ağırlıklar kapalı" #: src/ui/gui/psppire-data-window.c:273 #, c-format msgid "Weight by %s" msgstr "%s ile ağırlıklandır" #: src/ui/gui/psppire-data-window.c:518 #: src/ui/gui/psppire-import-assistant.c:681 #: src/ui/gui/psppire-syntax-window.c:607 src/ui/gui/psppire-window.c:669 msgid "All Files" msgstr "Tüm Dosyalar" #: src/ui/gui/psppire-data-window.c:535 msgid "System File" msgstr "Sistem Dosyası" #: src/ui/gui/psppire-data-window.c:542 msgid "Compressed System File" msgstr "Sıkıştırılmış Sistem Dosyası" #: src/ui/gui/psppire-data-window.c:548 msgid "Portable File" msgstr "Taşınabilir Dosya" #: src/ui/gui/psppire-data-window.c:551 msgid "Format:" msgstr "Biçim:" #: src/ui/gui/psppire-data-window.c:615 msgid "Delete Existing Dataset?" msgstr "Var Olan Veri Seti Silinsin mi?" #: src/ui/gui/psppire-data-window.c:619 #, c-format msgid "" "Renaming \"%s\" to \"%s\" will destroy the existing dataset named \"%s\". " "Are you sure that you want to do this?" msgstr "" "\"%s\" değişkenini \"%s\" olarak yeniden adlandırmak varolan \"%s\" isimli " "veri kümesine zarar verecektir. Bunu yapmak istediğinizden emin misiniz?" #: src/ui/gui/psppire-data-window.c:625 #, fuzzy #| msgid "Deleted" msgid "Delete" msgstr "Silinmiş" #: src/ui/gui/psppire-data-window.c:647 #, c-format msgid "Please enter a new name for dataset \"%s\":" msgstr "Lütfen \"%s\" veri seti için yeni bir isim girin:" #: src/ui/gui/psppire-data-window.c:649 msgid "Rename Dataset" msgstr "Veri Setini Yeniden Adlandır" #: src/ui/gui/psppire-data-window.c:1199 src/ui/gui/output-window.ui:68 #: src/ui/gui/syntax-editor.ui:22 msgid "_File" msgstr "_Dosya" #: src/ui/gui/psppire-data-window.c:1203 src/ui/gui/syntax-editor.ui:25 #, fuzzy #| msgid "_New Name" msgid "_New" msgstr "_Yeni İsim" #: src/ui/gui/psppire-data-window.c:1210 msgid "_Syntax" msgstr "_Sözdizimi" #: src/ui/gui/psppire-data-window.c:1213 src/ui/gui/data-editor.ui:177 #: src/ui/gui/data-editor.ui:189 msgid "_Data" msgstr "_Veri" #: src/ui/gui/psppire-data-window.c:1220 src/ui/gui/syntax-editor.ui:36 #, fuzzy #| msgid "Open" msgid "_Open" msgstr "Aç" #: src/ui/gui/psppire-data-window.c:1223 #, fuzzy #| msgid "I_mport Data..." msgid "_Import Data..." msgstr "_İçeriye Aktar..." #: src/ui/gui/psppire-data-window.c:1231 src/ui/gui/logistic.ui:261 #: src/ui/gui/regression.ui:66 msgid "_Save..." msgstr "_Kaydet..." #: src/ui/gui/psppire-data-window.c:1234 msgid "Save _As..." msgstr "_Farklı Kaydet..." #: src/ui/gui/psppire-data-window.c:1237 msgid "_Rename Dataset..." msgstr "_Veri Setini Yeniden Adlandır..." #: src/ui/gui/psppire-data-window.c:1248 #, fuzzy #| msgid "D_isplay Data File Information" msgid "_Display Data File Information" msgstr "Veri Dosyası _Bilgilerini Göster" #: src/ui/gui/psppire-data-window.c:1255 msgid "Working File" msgstr "Çalışılan Dosya" #: src/ui/gui/psppire-data-window.c:1257 #, fuzzy #| msgid "External File..." msgid "_External File..." msgstr "Harici Dosya..." #: src/ui/gui/psppire-data-window.c:1267 #, fuzzy #| msgid "Recently Used Da_ta" msgid "_Recently Used Data" msgstr "Son Kullanılan _Veriler" #: src/ui/gui/psppire-data-window.c:1268 msgid "Recently Used _Files" msgstr "Son Kullanılan _Dosyalar" #: src/ui/gui/psppire-data-window.c:1315 src/ui/gui/output-window.ui:82 #: src/ui/gui/syntax-editor.ui:59 msgid "_Quit" msgstr "" #: src/ui/gui/psppire-data-window.c:1333 src/ui/gui/output-window.ui:89 #: src/ui/gui/syntax-editor.ui:66 msgid "_Edit" msgstr "_Düzen" #: src/ui/gui/psppire-data-window.c:1339 #, fuzzy #| msgid "Go To Variable..." msgid "_Go To Variable..." msgstr "_Değişkene git..." #: src/ui/gui/psppire-data-window.c:1340 #, fuzzy #| msgid "Go To Case..." msgid "_Go To Case..." msgstr "Vakaya Git..." #: src/ui/gui/psppire-data-window.c:1364 src/ui/gui/syntax-editor.ui:69 msgid "Cu_t" msgstr "" #: src/ui/gui/psppire-data-window.c:1373 src/ui/gui/output-window.ui:96 #: src/ui/gui/syntax-editor.ui:74 msgid "_Copy" msgstr "_Kopyala" #: src/ui/gui/psppire-data-window.c:1380 src/ui/gui/syntax-editor.ui:79 msgid "_Paste" msgstr "" #: src/ui/gui/psppire-data-window.c:1387 #, fuzzy #| msgid "Cl_ear Variables" msgid "Clear _Variables" msgstr "Değişkenleri _Temizle" #: src/ui/gui/psppire-data-window.c:1401 msgid "_Find..." msgstr "_Bul..." #: src/ui/gui/psppire-data-window.c:1407 src/ui/gui/logistic.ui:246 msgid "_Options..." msgstr "_Seçenekler..." #: src/ui/gui/psppire-data-window.c:1676 msgid "Jump to variable" msgstr "Değişkene atla" #: src/ui/gui/psppire-data-window.c:1689 msgid "Jump to a case in the data sheet" msgstr "Veri setinde bulunan belirli bir olaya git" #: src/ui/gui/psppire-data-window.c:1703 #, fuzzy #| msgid "Sort cases in the active dataset" msgid "Search for values in the data" msgstr "Etkin veri seti içerisindeki olayları sınıflandır" #: src/ui/gui/psppire-data-window.c:1715 msgid "Create a new case at the current position" msgstr "Şimdiki konumda yeni bir olay oluştur" #: src/ui/gui/psppire-data-window.c:1727 msgid "Create a new variable at the current position" msgstr "Şimdiki konumda yeni bir değişken oluştur" #: src/ui/gui/psppire-data-window.c:1741 msgid "Split the active dataset" msgstr "Etkin veri setini böl" #: src/ui/gui/psppire-data-window.c:1753 msgid "Weight cases by variable" msgstr "Vakaları değişken ile ağırlıklandır" #: src/ui/gui/psppire-data-window.c:1764 msgid "Show/hide value labels" msgstr "Değer etiketlerini göster/gizle" #: src/ui/gui/psppire-data-window.c:1904 msgid "Data Editor" msgstr "Veri Düzenleyici" #: src/ui/gui/psppire-encoding-selector.c:140 msgid "Automatically Detect" msgstr "Otomatik Belirle" #: src/ui/gui/psppire-encoding-selector.c:147 msgid "Locale Encoding" msgstr "Yerel Kodlama" #: src/ui/gui/psppire-encoding-selector.c:177 msgid "Character Encoding: " msgstr "Karakter Kodlaması:" #: src/ui/gui/psppire-import-assistant.c:337 msgid "line" msgstr "" #: src/ui/gui/psppire-import-assistant.c:347 msgid "var" msgstr "değişken" #: src/ui/gui/psppire-import-assistant.c:560 msgid "Importing Spreadsheet Data" msgstr "Hesap Tablo Verisini İçeriye Aktarma" #: src/ui/gui/psppire-import-assistant.c:686 msgid "Text Files" msgstr "Metin Dosyaları" #: src/ui/gui/psppire-import-assistant.c:691 msgid "Text (*.txt) Files" msgstr "Metin (*.txt) Dosyaları" #: src/ui/gui/psppire-import-assistant.c:697 msgid "Plain Text (ASCII) Files" msgstr "Düz Metin (ASCII) Dosyaları" #: src/ui/gui/psppire-import-assistant.c:702 msgid "Comma Separated Value Files" msgstr "Virgül ile Ayrılmış Değerler Dosyaları" #: src/ui/gui/psppire-import-assistant.c:709 msgid "Tab Separated Value Files" msgstr "Sekme ile Ayrılmış Değerler Dosyaları" #: src/ui/gui/psppire-import-assistant.c:714 msgid "Gnumeric Spreadsheet Files" msgstr "Gnumeric Hesap Tablo Dosyaları" #: src/ui/gui/psppire-import-assistant.c:719 msgid "OpenDocument Spreadsheet Files" msgstr "AçıkBelge Hesap Tablosu Dosyaları" #: src/ui/gui/psppire-import-assistant.c:724 msgid "All Spreadsheet Files" msgstr "Tüm Hesap Tablosu Dosyaları" #: src/ui/gui/psppire-import-assistant.c:733 #, fuzzy #| msgid "Select Data to Import" msgid "Select File to Import" msgstr "İçeriye Aktarmak için Verileri Seçin" #: src/ui/gui/psppire-import-assistant.c:770 msgid "Importing Delimited Text Data" msgstr "Sınırlandırılmış Metin Verileri İçeriye Aktarma" #: src/ui/gui/psppire-import-assistant.c:865 #, fuzzy #| msgid "Select Cases: Range" msgid "Select the First Line" msgstr "Vakaları Seç: Aralık" #: src/ui/gui/psppire-import-assistant.c:877 msgid "Line" msgstr "Satır" #: src/ui/gui/psppire-import-assistant.c:931 msgid "" "This assistant will guide you through the process of importing data into " "PSPP from a text file with one line per case, in which fields are separated " "by tabs, commas, or other delimiters.\n" "\n" msgstr "" "Bu sihirbaz sekmeyle, virgülle veya diğer diğer sınırlayıcılarla ayrılmış " "vaka başına tek satırlı metin dosyalarından PSPP'ye veri aktarma sürecinde " "size yardım edecektir.\n" "\n" #: src/ui/gui/psppire-import-assistant.c:941 #, fuzzy, c-format #| msgid "The selected file contains %'zu line of text. " #| msgid_plural "The selected file contains %'zu lines of text. " msgid "The selected file contains %'lu line of text. " msgid_plural "The selected file contains %'lu lines of text. " msgstr[0] "Seçilen dosya %'zu satır metin içeriyor. " msgstr[1] "Seçilen dosya %'zu satır metin içeriyor. " #: src/ui/gui/psppire-import-assistant.c:950 #, c-format msgid "The selected file contains approximately %'lu line of text. " msgid_plural "The selected file contains approximately %'lu lines of text. " msgstr[0] "Seçilen dosya yaklaşık olarak %'lu satır metin içeriyor. " msgstr[1] "Seçilen dosya yaklaşık olarak %'lu satır metin içeriyor. " #: src/ui/gui/psppire-import-assistant.c:956 #, c-format msgid "" "Only the first %zu line of the file will be shown for preview purposes in " "the following screens. " msgid_plural "" "Only the first %zu lines of the file will be shown for preview purposes in " "the following screens. " msgstr[0] "" "Sonraki ekranlarda dosyanın ilk %zu satırları ön izleme amacıyla " "gösterilecektir. " msgstr[1] "" "Sonraki ekranlarda dosyanın ilk %zu satırları ön izleme amacıyla " "gösterilecektir. " #: src/ui/gui/psppire-import-assistant.c:965 msgid "You may choose below how much of the file should actually be imported." msgstr "" "Aşağıdan dosyaların kaç tanesini içeriye aktaracağınızı seçebilirsiniz." #: src/ui/gui/psppire-import-assistant.c:974 #, c-format msgid "Only the first %4d cases" msgstr "Sadece ilk %4d vaka" #: src/ui/gui/psppire-import-assistant.c:985 #, c-format msgid "Only the first %3d %% of file (approximately)" msgstr "Sadece dosyaların ilk %% %3d kadarını (yaklaşık olarak)" #: src/ui/gui/psppire-import-assistant.c:1009 #, fuzzy #| msgid "Select Data to Import" msgid "Select the Lines to Import" msgstr "İçeriye Aktarmak için Verileri Seçin" #: src/ui/gui/psppire-import-assistant.c:1151 msgid "Choose Separators" msgstr "Ayırıcıları Seç" #: src/ui/gui/psppire-import-assistant.c:1438 msgid "Adjust Variable Formats" msgstr "Değişken Biçimlerini Ayarla" #: src/ui/gui/psppire-output-view.c:410 msgid "Message" msgstr "İleti" #: src/ui/gui/psppire-output-view.c:543 #, fuzzy msgid "failed to create temporary directory during clipboard operation" msgstr "geçici dizin oluşturulamadı" #: src/ui/gui/psppire-output-window.c:241 msgid "Infer file type from extension" msgstr "Dosya uzantısından belirle" #: src/ui/gui/psppire-output-window.c:242 msgid "SPSS Viewer (*.spv)" msgstr "" #: src/ui/gui/psppire-output-window.c:243 msgid "PDF (*.pdf)" msgstr "PDF (*.pdf)" #: src/ui/gui/psppire-output-window.c:244 msgid "HTML (*.html)" msgstr "HTML (*.html)" #: src/ui/gui/psppire-output-window.c:245 msgid "OpenDocument (*.odt)" msgstr "OpenDocument (*.odt)" #: src/ui/gui/psppire-output-window.c:246 msgid "Text (*.txt)" msgstr "Metin (*.txt)" #: src/ui/gui/psppire-output-window.c:247 #, fuzzy #| msgid "Text (*.txt)" msgid "Text [plain] (*.txt)" msgstr "Metin (*.txt)" #: src/ui/gui/psppire-output-window.c:248 msgid "PostScript (*.ps)" msgstr "PostScript (*.ps)" #: src/ui/gui/psppire-output-window.c:249 msgid "Comma-Separated Values (*.csv)" msgstr "Virgülle Ayrılmış Değerler (*.csv)" #: src/ui/gui/psppire-output-window.c:350 msgid "Export Output" msgstr "Çıktıyı Dışarıya Aktar" #: src/ui/gui/psppire-output-window.c:548 msgid "Output Viewer" msgstr "Çıktı Gösterici" #: src/ui/gui/psppire-spreadsheet-model.c:237 msgid "(empty)" msgstr "(boş)" #: src/ui/gui/psppire-syntax-window.c:226 msgid "Text Search" msgstr "" #: src/ui/gui/psppire-syntax-window.c:229 #, fuzzy #| msgid "OK" msgid "_OK" msgstr "Tamam" #: src/ui/gui/psppire-syntax-window.c:231 #, fuzzy #| msgid "Cancel" msgid "_Cancel" msgstr "İptal" #: src/ui/gui/psppire-syntax-window.c:239 msgid "Text to search for:" msgstr "" #: src/ui/gui/psppire-syntax-window.c:570 #, c-format msgid "Saved file `%s'" msgstr "`%s' dosyası kaydedildi" #: src/ui/gui/psppire-syntax-window.c:591 msgid "Save Syntax" msgstr "Sözdizimi Kaydet" #: src/ui/gui/psppire-syntax-window.c:601 src/ui/gui/psppire-window.c:657 msgid "Syntax Files (*.sps) " msgstr "Sözdizimi Dosyaları (*.sps) " #: src/ui/gui/psppire-syntax-window.c:970 msgid "Syntax Editor" msgstr "Sözdizimi Düzenleyici" #: src/ui/gui/psppire-syntax-window.c:990 #, c-format msgid "Cannot load syntax file `%s'" msgstr "`%s' sözdizimi dosyası yüklenemedi" #: src/ui/gui/psppire-variable-sheet.c:412 #, c-format msgid "{%s, %s}..." msgstr "{%s, %s}..." #: src/ui/gui/psppire-var-sheet-header.c:64 #, fuzzy #| msgid "Decimals" msgid "Decimal" msgstr "Ondalık Basamak" #: src/ui/gui/psppire-var-sheet-header.c:79 msgid "Align" msgstr "Yerleşim" #: src/ui/gui/psppire-var-sheet-header.c:82 msgid "Measure" msgstr "Ölçü" #: src/ui/gui/psppire-window.c:430 #, c-format msgid "Save the changes to `%s' before closing?" msgstr "Kapatılmadan önce değişiklikler `%s' dosyasına yazılsın mı?" #: src/ui/gui/psppire-window.c:437 #, c-format msgid "" "If you don't save, changes from the last %ld seconds will be permanently " "lost." msgstr "" "Eğer kaydetmezseniz %ld saniyedir yaptığınız tüm değişiklikleri kalıcı " "olarak kaybedeceksiniz." #: src/ui/gui/psppire-window.c:441 msgid "Close _without saving" msgstr "_Kaydetmeden kapat" #: src/ui/gui/psppire-window.c:625 src/ui/gui/psppire-window.c:629 msgid "Open" msgstr "Aç" #: src/ui/gui/psppire-window.c:634 msgid "Data and Syntax Files" msgstr "Veri ve Sözdizimi Dosyaları" #: src/ui/gui/psppire-window.c:646 msgid "System Files (*.sav, *.zsav)" msgstr "Sistem Dosyaları (*.sav, *zsav)" #: src/ui/gui/psppire-window.c:663 #, fuzzy #| msgid "Syntax Files (*.sps) " msgid "Output Files (*.spv) " msgstr "Sözdizimi Dosyaları (*.sps) " #: src/ui/gui/t-test-options.c:65 #, c-format msgid "Con_fidence Interval: %2d %%" msgstr "_Güven Aralığı: %% %2d" #: src/ui/gui/val-labs-dialog.c:591 #, c-format msgid "%s = `%s'" msgstr "%s = `%s'" #: src/ui/gui/var-type-dialog.c:541 #, fuzzy #| msgid "Compute Variable: Type and Label" msgid "Variable Type and Format" msgstr "Değişkeni Hesapla: Tür ve Etiket" #: src/ui/gui/windows-menu.c:92 #, fuzzy #| msgid "_Minimize All Windows" msgid "_Minimize all Windows" msgstr "_Tüm Pencereleri Küçült" #: src/ui/gui/windows-menu.c:100 msgid "_Split" msgstr "_Böl" #: src/ui/gui/windows-menu.c:132 msgid "_Windows" msgstr "_Pencereler" #: utilities/pspp-convert.c:67 #, c-format msgid "%s argument must be a single character" msgstr "" #: utilities/pspp-convert.c:265 msgid "exactly two non-option arguments are required; use --help for help" msgstr "" #: utilities/pspp-convert.c:276 #, c-format msgid "%s: cannot guess output format (use -O option)" msgstr "" #: utilities/pspp-convert.c:341 #, c-format msgid "%s: unknown output format (use -O option)" msgstr "" #: utilities/pspp-convert.c:360 #, c-format msgid "%s: error reading input file" msgstr "%s: girdi dosyası okunamadı" #: utilities/pspp-convert.c:362 #, c-format msgid "%s: error writing output file" msgstr "%s: çıktı dosyası yazma hatası" #: utilities/pspp-convert.c:409 #, fuzzy, c-format #| msgid "%s: error opening output file" msgid "%s: error opening password file" msgstr "%s: Çıktı dosyası açılamadı" #: utilities/pspp-convert.c:425 #, fuzzy, c-format #| msgid "%s: error reading input file" msgid "" "\n" "%s: password not in file" msgstr "%s: girdi dosyası okunamadı" #: utilities/pspp-convert.c:462 #, c-format msgid "%s: '%c' is not in alphabet" msgstr "" #: utilities/pspp-convert.c:526 msgid "sorry, wrong password" msgstr "" #: utilities/pspp-output.c:92 #, c-format msgid "%s and %s:" msgstr "" #: utilities/pspp-output.c:547 #, c-format msgid "%s: invalid XPath expression" msgstr "" #: utilities/pspp-output.c:716 msgid "missing command name (use --help for help)" msgstr "" #: utilities/pspp-output.c:720 #, c-format msgid "unknown command \"%s\" (use --help for help)" msgstr "" #: utilities/pspp-output.c:728 #, c-format msgid "\"%s\" command takes exactly %d argument" msgid_plural "\"%s\" command takes exactly %d arguments" msgstr[0] "" msgstr[1] "" #: utilities/pspp-output.c:735 #, c-format msgid "\"%s\" command requires at least %d argument" msgid_plural "\"%s\" command requires at least %d arguments" msgstr[0] "" msgstr[1] "" #: utilities/pspp-output.c:742 #, c-format msgid "\"%s\" command requires between %d and %d arguments" msgstr "" #: utilities/pspp-output.c:782 msgid "The following object classes are supported:" msgstr "" #: utilities/pspp-output.c:791 #, c-format msgid "%s: unknown object class (use --select=help for help" msgstr "" #: src/language/utilities/set.q:162 #, fuzzy, c-format #| msgid "Day (%ld) must be between 1 and 31." msgid "%s must be between 0 and 20." msgstr "Gün (%ld) 1 ile 31 arasında olmalıdır." #: src/language/utilities/set.q:172 src/language/utilities/set.q:179 #, c-format msgid "%s must be at least 1." msgstr "%s en az 1 olmalıdır." #: src/language/utilities/set.q:205 #, c-format msgid "%s must be at least 1MB" msgstr "" #: src/language/utilities/set.q:207 #, c-format msgid "%s must be positive" msgstr "" #: src/language/utilities/set.q:213 src/language/utilities/set.q:215 #: src/language/utilities/set.q:217 src/language/utilities/set.q:219 #: src/language/utilities/set.q:221 src/language/utilities/set.q:223 #: src/language/utilities/set.q:225 src/language/utilities/set.q:227 #: src/language/utilities/set.q:229 src/language/utilities/set.q:231 #: src/language/utilities/set.q:233 #, c-format msgid "%s is obsolete." msgstr "%s gereksiz." #: src/language/utilities/set.q:239 msgid "Active file compression is not implemented." msgstr "Etkin dosyaları sıkıştırma özelliği henüz eklenmedi." #: src/language/utilities/set.q:403 #, c-format msgid "%s must be 1500 or later." msgstr "" #: src/language/utilities/set.q:410 #, c-format msgid "expecting %s or year" msgstr "" #: src/language/utilities/set.q:438 src/language/utilities/set.q:535 #, c-format msgid "%s must be at least %d." msgstr "" #: src/language/utilities/set.q:474 #, c-format msgid "%s is not a recognized encoding or locale name" msgstr "%s tanımlanan bir kodlama veya yerel ad değil" #: src/language/utilities/set.q:562 #, c-format msgid "" "%s requires numeric output format as an argument. Specified format %s is of " "type string." msgstr "" #: src/language/utilities/set.q:791 msgid "ISL (32-bit IEEE 754 single, little-endian)" msgstr "ISL (32-bit IEEE 754 tek, little-endian)" #: src/language/utilities/set.q:794 msgid "ISB (32-bit IEEE 754 single, big-endian)" msgstr "ISB (32-bit IEEE 754 tek, big-endian)" #: src/language/utilities/set.q:797 msgid "IDL (64-bit IEEE 754 double, little-endian)" msgstr "IDL (64-bit IEEE 754 çift, little-endian)" #: src/language/utilities/set.q:800 msgid "IDB (64-bit IEEE 754 double, big-endian)" msgstr "IDB (64-bit IEEE 754 çift, big-endian)" #: src/language/utilities/set.q:804 msgid "VF (32-bit VAX F, VAX-endian)" msgstr "VF (32-bit VAX F, VAX-endian)" #: src/language/utilities/set.q:807 msgid "VD (64-bit VAX D, VAX-endian)" msgstr "VD (64-bit VAX D, VAX-endian)" #: src/language/utilities/set.q:810 msgid "VG (64-bit VAX G, VAX-endian)" msgstr "VG (64-bit VAX G, VAX-endian)" #: src/language/utilities/set.q:814 msgid "ZS (32-bit IBM Z hexadecimal short, big-endian)" msgstr "ZS (32-bit IBM Z hexadecimal short, big-endian)" #: src/language/utilities/set.q:817 msgid "ZL (64-bit IBM Z hexadecimal long, big-endian)" msgstr "ZL (64-bit IBM Z hexadecimal long, big-endian)" #: src/language/utilities/set.q:985 #, c-format msgid "%s is %s." msgstr "%s bir %s." #: src/language/utilities/set.q:1089 #, c-format msgid "" "Too many %s commands without a %s: at most %d levels of saved settings are " "allowed." msgstr "" #: src/language/utilities/set.q:1109 #, c-format msgid "%s without matching %s." msgstr "" #: src/language/stats/crosstabs.q:327 #, c-format msgid "Missing mode %s not allowed in general mode. Assuming %s." msgstr "" #: src/language/stats/crosstabs.q:444 msgid "Too many cross-tabulation variables or dimensions." msgstr "Çok fazla çapraz tablolama değişkeni ya da boyutu." #: src/language/stats/crosstabs.q:509 #, c-format msgid "%s must be specified before %s." msgstr "" #: src/language/stats/crosstabs.q:543 #, c-format msgid "Maximum value (%ld) less than minimum value (%ld)." msgstr "En yüksek değer (%ld) en düşük değerden (%ld) daha küçük." #: src/language/stats/crosstabs.q:922 #, fuzzy #| msgid "Summary." msgid "Summary" msgstr "Özet." #: src/language/stats/crosstabs.q:935 #, fuzzy #| msgid "Crosstabs" msgid "Crosstabulation" msgstr "Çapraz Tablolar" #. TRANSLATORS: The %s here describes a crosstabulation. It takes the #. form "var1 * var2 * var3 * ...". #: src/language/stats/crosstabs.q:1013 #, c-format msgid "Crosstabulation %s contained no non-missing cases." msgstr "Çapraz tablo %s kayıp vakaları içermiyor." #: src/language/stats/crosstabs.q:1204 #, fuzzy #| msgid "Missing Values" msgid "Missing value" msgstr "Eksik Değerler" #: src/language/stats/crosstabs.q:1263 #, fuzzy #| msgid "row %" msgid "Row %" msgstr "satır %" #: src/language/stats/crosstabs.q:1264 #, fuzzy #| msgid "column %" msgid "Column %" msgstr "sütun %" #: src/language/stats/crosstabs.q:1265 #, fuzzy #| msgid "total %" msgid "Total %" msgstr "toplam %" #: src/language/stats/crosstabs.q:1269 #, fuzzy #| msgid "Adjusted Std. Residual" msgid "Adjusted Residual" msgstr "Ayarlanmış Standart Artık" #: src/language/stats/crosstabs.q:1288 #, fuzzy #| msgid "Chi-Square Test" msgid "Chi-Square Tests" msgstr "Ki-Kare Testi" #: src/language/stats/crosstabs.q:1294 msgid "Pearson Chi-Square" msgstr "Pearson Ki-Kare" #: src/language/stats/crosstabs.q:1295 msgid "Likelihood Ratio" msgstr "Olabilirlik Oranı" #: src/language/stats/crosstabs.q:1296 msgid "Fisher's Exact Test" msgstr "Fisher Anlamlılık Testi" #: src/language/stats/crosstabs.q:1297 msgid "Continuity Correction" msgstr "Süreklilik Düzeltmesi" #: src/language/stats/crosstabs.q:1298 msgid "Linear-by-Linear Association" msgstr "Doğrusal - Doğrusal Birliktelik" #: src/language/stats/crosstabs.q:1299 src/language/stats/crosstabs.q:1345 #: src/language/stats/crosstabs.q:1854 msgid "N of Valid Cases" msgstr "Geçerli Vakaların N Tanesi" #: src/language/stats/crosstabs.q:1305 #, fuzzy #| msgid "Asymp. Sig. (2-tailed)" msgid "Asymptotic Sig. (2-tailed)" msgstr "Asimptotik Anlamlılık (İki yanlı)" #: src/language/stats/crosstabs.q:1319 #, fuzzy #| msgid "Symmetric measures." msgid "Symmetric Measures" msgstr "Simetrik ölçüler." #: src/language/stats/crosstabs.q:1324 src/language/stats/crosstabs.q:1364 #: src/language/stats/crosstabs.q:1411 #, fuzzy #| msgid "_Values" msgid "Values" msgstr "_Değerler" #: src/language/stats/crosstabs.q:1326 src/language/stats/crosstabs.q:1413 msgid "Asymp. Std. Error" msgstr "Asimptotik Standart Hata" #: src/language/stats/crosstabs.q:1327 src/language/stats/crosstabs.q:1414 msgid "Approx. T" msgstr "Yaklaşık T" #: src/language/stats/crosstabs.q:1328 src/language/stats/crosstabs.q:1415 msgid "Approx. Sig." msgstr "Yaklaşık Anlamlılık" #: src/language/stats/crosstabs.q:1333 src/language/stats/crosstabs.q:1420 msgid "Nominal by Nominal" msgstr "Sınıf - Sınıf" #: src/language/stats/crosstabs.q:1334 msgid "Cramer's V" msgstr "Cramer's V" #: src/language/stats/crosstabs.q:1334 msgid "Contingency Coefficient" msgstr "Çaprazlık Katsayısı" #: src/language/stats/crosstabs.q:1336 src/language/stats/crosstabs.q:1425 msgid "Ordinal by Ordinal" msgstr "Sıra - Sıra" #: src/language/stats/crosstabs.q:1337 msgid "Kendall's tau-b" msgstr "Kendall's tau-b" #: src/language/stats/crosstabs.q:1337 msgid "Kendall's tau-c" msgstr "Kendall's tau-c" #: src/language/stats/crosstabs.q:1338 msgid "Spearman Correlation" msgstr "Spearman Korelasyonu" #: src/language/stats/crosstabs.q:1340 msgid "Interval by Interval" msgstr "Aralık - Aralık" #: src/language/stats/crosstabs.q:1341 msgid "Pearson's R" msgstr "Pearson's R" #: src/language/stats/crosstabs.q:1343 msgid "Measure of Agreement" msgstr "Uzlaşma Ölçüsü" #: src/language/stats/crosstabs.q:1359 #, fuzzy #| msgid "Risk estimate." msgid "Risk Estimate" msgstr "Risk tahmini." #: src/language/stats/crosstabs.q:1368 #, fuzzy, no-c-format #| msgid "95%% Confidence Interval" msgid "95% Confidence Interval" msgstr "%%95 Güven Aralığı" #: src/language/stats/crosstabs.q:1389 msgid "Symmetric" msgstr "Simetrik" #: src/language/stats/crosstabs.q:1391 src/language/stats/crosstabs.q:1396 #, c-format msgid "%s Dependent" msgstr "%s Bağımlı" #: src/language/stats/crosstabs.q:1406 #, fuzzy #| msgid "Directional measures." msgid "Directional Measures" msgstr "Yöneltmeli ölçüler." #: src/language/stats/crosstabs.q:1422 msgid "Goodman and Kruskal tau" msgstr "Goodman - Kruskal tau katsayısı" #: src/language/stats/crosstabs.q:1423 msgid "Uncertainty Coefficient" msgstr "Belirsizlik Katsayısı" #: src/language/stats/crosstabs.q:1426 msgid "Somers' d" msgstr "Somers' d" #: src/language/stats/crosstabs.q:1428 msgid "Nominal by Interval" msgstr "Sınıf - Aralık" #: src/language/stats/crosstabs.q:1826 #, fuzzy, c-format #| msgid "Odds Ratio for %s (%g / %g)" msgid "Odds Ratio for %s" msgstr "%s için Bahis/Risk Oranı (%g / %g)" #: src/language/stats/crosstabs.q:1835 #, fuzzy, c-format #| msgid "For cohort %s = %.*s" msgid "For cohort %s = " msgstr "%s kuşağı için = %.*s" #: src/ui/gui/aggregate.ui:24 msgid "Aggregate Data" msgstr "Verileri Kümele" #: src/ui/gui/aggregate.ui:126 msgid "_Break variable(s)" msgstr "_Değişen(ler)i kes" #: src/ui/gui/aggregate.ui:179 msgid "Variable Name: " msgstr "Değişken Adı:" #: src/ui/gui/aggregate.ui:215 msgid "Variable Label: " msgstr "Değişken Etiketi:" #: src/ui/gui/aggregate.ui:252 msgid "Function: " msgstr "Fonksiyon:" #: src/ui/gui/aggregate.ui:327 msgid "Argument 1: " msgstr "Argüman 1:" #: src/ui/gui/aggregate.ui:364 msgid "Argument 2: " msgstr "Argüman 2:" #: src/ui/gui/aggregate.ui:428 msgid "Aggregated variables" msgstr "Kümelenmiş değişkenler" #: src/ui/gui/aggregate.ui:469 msgid "_Add aggregated variables to the active dataset" msgstr "Etkin veri setine _kümelenmiş değişkenler ekle" #: src/ui/gui/aggregate.ui:486 msgid "_Replace the current dataset with the aggregated variables" msgstr "Şimdiki veri setini _kümelenmiş değişkenler ile değiştir" #: src/ui/gui/aggregate.ui:504 msgid "_Write a new data file containing only the aggregated variables" msgstr "_Sadece kümelenmiş değişkenleri içeren yeni bir veri dosyası yaz" #: src/ui/gui/aggregate.ui:544 msgid "label" msgstr "etiket" #: src/ui/gui/aggregate.ui:593 msgid "File is _already sorted on break variable(s)" msgstr "_Dosya zaten kesme değişken(ler)ine göre sınıflandırılmış" #: src/ui/gui/aggregate.ui:609 msgid "Sort file before a_ggregating" msgstr "_Kümelemeden önce dosyayı sınıflandır" #: src/ui/gui/aggregate.ui:630 msgid "Options for very large datasets" msgstr "Çok büyük veri setleri için seçenekler" #: src/ui/gui/autorecode.ui:24 msgid "Automatic Recode" msgstr "Otomatik Yeniden Kodlama" #: src/ui/gui/autorecode.ui:120 msgid "Variable -> New Name" msgstr "Değişken -> Yeni İsim" #: src/ui/gui/autorecode.ui:145 msgid "_Lowest value" msgstr "_En düşük değer" #: src/ui/gui/autorecode.ui:163 msgid "_Highest value" msgstr "_En yüksek değer" #: src/ui/gui/autorecode.ui:185 msgid "Recode starting from" msgstr "Buradan başlayarak yeniden kodla" #: src/ui/gui/autorecode.ui:204 msgid "_New Name" msgstr "_Yeni İsim" #: src/ui/gui/autorecode.ui:227 msgid "_Add New Name" msgstr "_Yeni İsim Ekle" #: src/ui/gui/autorecode.ui:285 msgid "_Use the same recoding scheme for all variables" msgstr "_Tüm değişkenler için aynı yeniden kodlama düzenini kullan" #: src/ui/gui/autorecode.ui:301 msgid "Treat _blank string values as missing" msgstr "_Boş dize değişkenlerini eksikmiş gibi değerlendir" #: src/ui/gui/binomial.ui:86 msgid "_Test Variable List:" msgstr "_Test Değişken Listesi:" #: src/ui/gui/binomial.ui:160 src/ui/gui/chi-square.ui:281 msgid "_Get from data" msgstr "_Veriden al" #: src/ui/gui/binomial.ui:181 src/ui/gui/indep-samples.ui:150 msgid "_Cut point:" msgstr "_Kesme noktası:" #: src/ui/gui/binomial.ui:225 msgid "Define Dichotomy" msgstr "İkiye Ayırma Tanımla" #: src/ui/gui/binomial.ui:245 msgid "Test _Proportion:" msgstr "Test Miktarı:" #: src/ui/gui/compute.ui:32 msgid "Compute Variable: Type and Label" msgstr "Değişkeni Hesapla: Tür ve Etiket" #: src/ui/gui/compute.ui:67 msgid "Use _expression as label" msgstr "_İfadeyi etiket olarak kullan" #: src/ui/gui/compute.ui:90 msgid "_Label:" msgstr "_Etiket:" #: src/ui/gui/compute.ui:194 msgid "_String" msgstr "_Dize" #: src/ui/gui/compute.ui:287 msgid "_Numeric" msgstr "_Sayısal" #: src/ui/gui/compute.ui:343 msgid "Compute Variable" msgstr "Değişkeni Hesapla" #: src/ui/gui/compute.ui:381 msgid "Target _Variable:" msgstr "Hedef Değişken:" #: src/ui/gui/compute.ui:412 msgid "_Type & Label..." msgstr "Tip & Etiket..." #: src/ui/gui/compute.ui:469 msgid "=" msgstr "=" #: src/ui/gui/compute.ui:526 msgid "_Numeric Expressions:" msgstr "Sayısal İfadeler:" #: src/ui/gui/compute.ui:598 msgid "_Functions:" msgstr "İşlevler:" #: src/ui/gui/compute.ui:678 msgid "_If..." msgstr "_Eğer..." #: src/ui/gui/barchart.ui:24 msgid "Barchart" msgstr "" #: src/ui/gui/barchart.ui:112 #, fuzzy #| msgid "Category" msgid "Category A_xis:" msgstr "Kategori" #: src/ui/gui/barchart.ui:140 #, fuzzy #| msgid "Number of cases" msgid "_N of cases" msgstr "Vaka sayısı" #: src/ui/gui/barchart.ui:158 #, fuzzy #| msgid "Number of cases" msgid "_Cum. n of cases" msgstr "Vaka sayısı" #: src/ui/gui/barchart.ui:174 msgid "Other _summary function" msgstr "" #: src/ui/gui/barchart.ui:191 #, fuzzy #| msgid "Number of cases" msgid "% of c_ases" msgstr "Vaka sayısı" #: src/ui/gui/barchart.ui:207 #, fuzzy #| msgid "Number of cases" msgid "C_um. % of cases" msgstr "Vaka sayısı" #: src/ui/gui/barchart.ui:270 src/ui/gui/histogram.ui:100 #, fuzzy #| msgid "_Variables:" msgid "_Variable:" msgstr "_Değişkenler:" #: src/ui/gui/barchart.ui:308 msgid "Bars Represent" msgstr "" #: src/ui/gui/barchart.ui:340 #, fuzzy #| msgid "Category label source" msgid "Category C_luster:" msgstr "Kategori etiketi kaynağı" #: src/ui/gui/correlation.ui:24 msgid "Bivariate Correlations" msgstr "İki Değişkenli Korelasyonlar" #: src/ui/gui/correlation.ui:148 msgid "Pearso_n" msgstr "Pearso_n" #: src/ui/gui/correlation.ui:164 msgid "_Kendall's tau-b" msgstr "_Kendall's tau-b" #: src/ui/gui/correlation.ui:180 msgid "_Spearman" msgstr "_Spearman" #: src/ui/gui/correlation.ui:200 msgid "Correlation Coefficients" msgstr "Korelasyon Katsayıları" #: src/ui/gui/correlation.ui:224 msgid "_Two-tailed" msgstr "_İki yanlı" #: src/ui/gui/correlation.ui:241 msgid "One-tai_led" msgstr "_Tek yanlı" #: src/ui/gui/correlation.ui:262 msgid "Test of Significance" msgstr "Anlamlılık Testi" #: src/ui/gui/correlation.ui:275 msgid "_Flag significant correlations" msgstr "_Anlamlı korelasyonları işaretle" #: src/ui/gui/count.ui:24 msgid "Count Occurrences of Values within Cases" msgstr "Değerlerin Vakalarda Görülme Adetlerini Say" #: src/ui/gui/count.ui:117 msgid "Numeric _Variables:" msgstr "Sayısal _Değişkenler:" #: src/ui/gui/count.ui:147 msgid "_Target Variable:" msgstr "_Hedef Değişken:" #: src/ui/gui/count.ui:178 msgid "Target _Label:" msgstr "Hedef _Etiket:" #: src/ui/gui/count.ui:192 msgid "_Define Values..." msgstr "_Değerleri Tanımla..." #: src/ui/gui/count.ui:257 msgid "Count Values within Cases: Values to Count" msgstr "Vakalardaki Değerleri Say: Sayılacak Değerler" #: src/ui/gui/count.ui:305 msgid "Values _to Count:" msgstr "_Hesaplanacak Değerler:" #: src/ui/gui/comments.ui:25 msgid "Data File Comments" msgstr "Veri Dosyası Açıklamaları" #: src/ui/gui/comments.ui:49 msgid "Comments:" msgstr "Açıklamalar:" #: src/ui/gui/comments.ui:106 msgid "Display comments in output" msgstr "Açıklamaları çıktıda göster" #: src/ui/gui/comments.ui:127 msgid "Column Number: 0" msgstr "Sütun Numarası: 0" #: src/ui/gui/crosstabs.ui:25 msgid "Crosstabs: Cells" msgstr "Çapraz Tablolar: Hücreler" #: src/ui/gui/crosstabs.ui:67 msgid "Cell Display" msgstr "Hücre Görünümü" #: src/ui/gui/crosstabs.ui:99 msgid "Crosstabs" msgstr "Çapraz Tablolar" #: src/ui/gui/crosstabs.ui:150 msgid "_Rows" msgstr "_Satırlar" #: src/ui/gui/crosstabs.ui:195 msgid "_Columns" msgstr "_Sütunlar" #: src/ui/gui/crosstabs.ui:242 msgid "_Format..." msgstr "_Biçim..." #: src/ui/gui/crosstabs.ui:256 src/ui/gui/examine.ui:267 msgid "_Statistics..." msgstr "_İstatistikler..." #: src/ui/gui/crosstabs.ui:270 msgid "Ce_lls..." msgstr "_Hücreler..." #: src/ui/gui/crosstabs.ui:348 msgid "Crosstabs: Format" msgstr "Çapraz Tablolar: Biçim" #: src/ui/gui/crosstabs.ui:371 msgid "Print tables" msgstr "Tabloları yazdır" #: src/ui/gui/crosstabs.ui:387 msgid "Pivot" msgstr "Eksen" #: src/ui/gui/crosstabs.ui:403 src/ui/gui/sort.ui:157 msgid "Ascending" msgstr "Artan" #: src/ui/gui/crosstabs.ui:455 msgid "Crosstabs: Statistics" msgstr "Çapraz Tablolar: İstatistikler" #: src/ui/gui/chi-square.ui:30 msgid "Chi-Square Test" msgstr "Ki-Kare Testi" #: src/ui/gui/chi-square.ui:82 msgid "All categor_ies equal" msgstr "Tüm _kategoriler eşit" #: src/ui/gui/chi-square.ui:103 msgid "_Values" msgstr "_Değerler" #: src/ui/gui/chi-square.ui:159 msgid "Expected Values:" msgstr "_Beklenen Değerler:" #: src/ui/gui/chi-square.ui:204 msgid "Test _Variables" msgstr "Test _Değişkenleri" #: src/ui/gui/chi-square.ui:298 msgid "Use _specified range" msgstr "Belirtilen _aralığı kullan" #: src/ui/gui/chi-square.ui:323 msgid "_Lower:" msgstr "Aşağı:" #: src/ui/gui/chi-square.ui:337 msgid "_Upper:" msgstr "Yukarı:" #: src/ui/gui/chi-square.ui:381 msgid "Expected Range:" msgstr "Beklenen Aralık:" #: src/ui/gui/descriptives.ui:131 src/ui/gui/factor.ui:797 #: src/ui/gui/recode.ui:638 msgid "_Variables:" msgstr "_Değişkenler:" #: src/ui/gui/descriptives.ui:176 msgid "S_tatistics:" msgstr "İ_statistikler:" #: src/ui/gui/descriptives.ui:230 msgid "_Exclude entire case if any selected variable is missing" msgstr "_Eğer seçili değişkenlerden biri dahi eksikse olayı hariç tut" #: src/ui/gui/descriptives.ui:247 msgid "_Include user-missing data in analysis" msgstr "_Analizinde kullanıcı eksiği verileri içer" #: src/ui/gui/descriptives.ui:264 msgid "Save _Z-scores of selected variables as new variables" msgstr "Seçilmiş değişkenlerin _Z-skorlarını yeni değişken olarak kaydet" #: src/ui/gui/descriptives.ui:286 msgid "Options:" msgstr "Seçenekler:" #: src/ui/gui/examine.ui:25 msgid "Explore" msgstr "Araştır" #: src/ui/gui/examine.ui:69 msgid "_Label Cases by:" msgstr "_Vakaları buna göre etiketle:" #: src/ui/gui/examine.ui:116 msgid "_Factor List:" msgstr "Faktör Listesi:" #: src/ui/gui/examine.ui:163 src/ui/gui/means.ui:126 msgid "_Dependent List:" msgstr "_Bağımlılar Listesi:" #: src/ui/gui/examine.ui:331 msgid "Explore: Options" msgstr "Araştır: Seçenekler" #: src/ui/gui/examine.ui:355 src/ui/gui/t-test.ui:81 msgid "Exclude cases _listwise" msgstr "Vakaları _liste olarak hariç tut" #: src/ui/gui/examine.ui:373 msgid "Exclude cases _pairwise" msgstr "_Eşleşmeyen vakaları hariç tut" #: src/ui/gui/examine.ui:392 msgid "_Report values" msgstr "_Rapor değerleri" #: src/ui/gui/examine.ui:449 msgid "Explore: Statistics" msgstr "Araştır: İstatistikler" #: src/ui/gui/examine.ui:468 src/ui/gui/oneway.ui:576 msgid "_Descriptives" msgstr "_Betimleyiciler" #: src/ui/gui/examine.ui:485 msgid "_Extremes" msgstr "_Uç Değerler" #: src/ui/gui/examine.ui:502 msgid "_Percentiles" msgstr "_Yüzdebirlikler" #: src/ui/gui/goto-case.ui:31 msgid "Goto Case" msgstr "Vakaya Git" #: src/ui/gui/goto-case.ui:52 msgid "Goto Case Number:" msgstr "Vaka Numarasına Git:" #: src/ui/gui/factor.ui:39 msgid "Factor Analysis: Rotation" msgstr "Faktör Analizi: Döndürme" #: src/ui/gui/factor.ui:70 msgid "_None" msgstr "_Hiçbiri" #: src/ui/gui/factor.ui:87 msgid "_Varimax" msgstr "_Varimax" #: src/ui/gui/factor.ui:104 msgid "_Quartimax" msgstr "En Büyük _Çeyrek" #: src/ui/gui/factor.ui:123 msgid "_Equimax" msgstr "_Equimax" #: src/ui/gui/factor.ui:146 msgid "Method" msgstr "Yöntem" #: src/ui/gui/factor.ui:159 msgid "_Display rotated solution" msgstr "Dönen çözümü _görüntüle" #: src/ui/gui/factor.ui:181 src/ui/gui/factor.ui:582 msgid "Ma_ximum iterations for convergence:" msgstr "_Yakınsama için en fazla yineleme sayısı" #: src/ui/gui/factor.ui:241 src/ui/gui/factor.ui:255 msgid "Principal Components Analysis" msgstr "Ana Bileşen Analizleri" #: src/ui/gui/factor.ui:246 src/ui/gui/factor.ui:258 msgid "Principal Axis Factoring" msgstr "Ana Eksen Çarpanlaması" #: src/ui/gui/factor.ui:264 msgid "Factor Analysis: Extraction" msgstr "Faktör Analizi: Özet Sonuç" #: src/ui/gui/factor.ui:290 msgid "_Method: " msgstr "_Yöntem: " #: src/ui/gui/factor.ui:345 msgid "Co_rrelation matrix" msgstr "_Korelasyon matrisi" #: src/ui/gui/factor.ui:361 msgid "Co_variance matrix" msgstr "Ko_varyans matrisi" #: src/ui/gui/factor.ui:382 msgid "Analyze" msgstr "Çözümle" #: src/ui/gui/factor.ui:407 msgid "_Unrotated factor solution" msgstr "Yönlendirilmemiş faktör çözümü" #: src/ui/gui/factor.ui:423 msgid "_Scree plot" msgstr "_Kaygantaş çizimi" #: src/ui/gui/factor.ui:443 src/ui/gui/histogram.ui:146 src/ui/gui/roc.ui:329 msgid "Display" msgstr "Göster" #: src/ui/gui/factor.ui:526 msgid "_Number of factors:" msgstr "Faktör _sayısı:" #: src/ui/gui/factor.ui:563 msgid "Extract" msgstr "Çıkart" #: src/ui/gui/factor.ui:640 msgid "Factor Analysis" msgstr "Faktör Analizi" #: src/ui/gui/factor.ui:672 src/ui/gui/data-editor.ui:266 msgid "_Descriptives..." msgstr "_Betimleyiciler..." #: src/ui/gui/factor.ui:685 msgid "_Extraction..." msgstr "_Özet Sonuç..." #: src/ui/gui/factor.ui:699 msgid "_Rotations..." msgstr "_Döndürmeler..." #: src/ui/gui/find.ui:25 msgid "Find Case" msgstr "Vaka Bul" #: src/ui/gui/find.ui:117 msgid "Variable:" msgstr "Değişken:" #: src/ui/gui/find.ui:157 src/ui/gui/val-labs-dialog.ui:113 msgid "Value:" msgstr "Değer:" #: src/ui/gui/find.ui:180 msgid "Search value labels" msgstr "Değer etiketlerinde ara" #: src/ui/gui/find.ui:210 msgid "Regular expression Match" msgstr "Eşlenecek düzenli ifade" #: src/ui/gui/find.ui:227 msgid "Search substrings" msgstr "Alt dizeleri ara" #: src/ui/gui/find.ui:244 msgid "Wrap around" msgstr "Başa dön" #: src/ui/gui/find.ui:260 msgid "Search backward" msgstr "Geriye doğru ara" #: src/ui/gui/frequencies.ui:32 msgid "Frequencies: Frequency Tables" msgstr "Frekanslar: Frekans Tabloları" #: src/ui/gui/frequencies.ui:67 msgid "_Always" msgstr "_Her Zaman" #: src/ui/gui/frequencies.ui:85 msgid "_Never" msgstr "_Asla" #: src/ui/gui/frequencies.ui:107 msgid "If no _more than " msgstr "_Bundan fazla değilse" #: src/ui/gui/frequencies.ui:129 src/ui/gui/frequencies.ui:454 msgid "100" msgstr "" #: src/ui/gui/frequencies.ui:145 msgid "values" msgstr "değerler" #: src/ui/gui/frequencies.ui:167 msgid "Display frequency tables" msgstr "Frekans tablolarını göster" #: src/ui/gui/frequencies.ui:194 msgid "A_scending value" msgstr "_Artan değer" #: src/ui/gui/frequencies.ui:212 msgid "D_escending value" msgstr "A_zalan değer" #: src/ui/gui/frequencies.ui:230 msgid "Ascending _frequency" msgstr "Artan _frekanslar" #: src/ui/gui/frequencies.ui:248 msgid "Descending f_requency" msgstr "Azalan f_rekanslar" #: src/ui/gui/frequencies.ui:271 msgid "Order by" msgstr "Sıralama düzeni" #: src/ui/gui/frequencies.ui:324 msgid "Frequencies: Charts" msgstr "Frekanslar: Grafikler" #: src/ui/gui/frequencies.ui:356 msgid "Scale:" msgstr "Ölçek:" #: src/ui/gui/frequencies.ui:366 msgid "_Frequencies" msgstr "_Frekanslar" #: src/ui/gui/frequencies.ui:383 msgid "_Percentages" msgstr "_Yüzdeler" #: src/ui/gui/frequencies.ui:407 msgid "Exclude values _below " msgstr "_Aşağıdaki değerleri hariç tut" #: src/ui/gui/frequencies.ui:422 msgid "Exclude values _above " msgstr "_Yukarıdaki değerleri hariç tut" #: src/ui/gui/frequencies.ui:441 src/ui/gui/reliability.ui:227 msgid "0" msgstr "" #: src/ui/gui/frequencies.ui:469 msgid "Chart Formatting" msgstr "Grafik Biçimlendirme" #: src/ui/gui/frequencies.ui:494 msgid "Draw _histograms" msgstr "Sütun _grafikleri çiz" #: src/ui/gui/frequencies.ui:510 msgid "Superimpose _normal curve" msgstr "_Normal eğrinin üzerine ekle" #: src/ui/gui/frequencies.ui:530 msgid "Histograms" msgstr "Sütun Grafikleri" #: src/ui/gui/frequencies.ui:555 #, fuzzy #| msgid "Draw _pie charts" msgid "Draw _bar charts" msgstr "_Pasta grafikleri çiz" #: src/ui/gui/frequencies.ui:575 #, fuzzy #| msgid "Pie Charts" msgid "Bar Charts" msgstr "Pasta Grafikleri" #: src/ui/gui/frequencies.ui:600 msgid "Draw _pie charts" msgstr "_Pasta grafikleri çiz" #: src/ui/gui/frequencies.ui:616 msgid "Include slices for _missing values" msgstr "_Eksik değerler için dilimleri içer" #: src/ui/gui/frequencies.ui:636 msgid "Pie Charts" msgstr "Pasta Grafikleri" #: src/ui/gui/frequencies.ui:725 src/ui/gui/rank.ui:489 msgid "_Variable(s):" msgstr "_Değişken(ler):" #: src/ui/gui/frequencies.ui:769 msgid "_Statistics:" msgstr "_İstatistikler:" #: src/ui/gui/frequencies.ui:783 msgid "Include _missing values" msgstr "Eksik _değerleri içer" #: src/ui/gui/frequencies.ui:806 msgid "Ch_arts..." msgstr "_Grafikler..." #: src/ui/gui/frequencies.ui:821 msgid "Frequency _Tables..." msgstr "Frekans _Tabloları..." #: src/ui/gui/histogram.ui:24 #, fuzzy #| msgid "Histograms" msgid "Histogram" msgstr "Sütun Grafikleri" #: src/ui/gui/histogram.ui:126 #, fuzzy #| msgid "Superimpose _normal curve" msgid "_Display normal curve" msgstr "_Normal eğrinin üzerine ekle" #: src/ui/gui/indep-samples.ui:25 src/ui/gui/k-independent.ui:35 msgid "Define Groups" msgstr "Grupları Tanımla" #: src/ui/gui/indep-samples.ui:75 msgid "Group_2 value:" msgstr "Grup_2 değeri:" #: src/ui/gui/indep-samples.ui:89 msgid "Group_1 value:" msgstr "Grup_1 değeri:" #: src/ui/gui/indep-samples.ui:190 msgid "_Use specified values:" msgstr "_Belirtilmiş değerleri kullan:" #: src/ui/gui/indep-samples.ui:259 msgid "Independent-Samples T Test" msgstr "Bağımsız Örneklem T Testi" #: src/ui/gui/indep-samples.ui:319 msgid "_Define Groups..." msgstr "Grupları _Tanımla" #: src/ui/gui/indep-samples.ui:401 src/ui/gui/t-test.ui:211 msgid "_Test Variable(s):" msgstr "Değişken(ler)i _Sına:" #: src/ui/gui/indep-samples.ui:454 src/ui/gui/k-independent.ui:165 msgid "_Grouping Variable:" msgstr "_Gruplama Değişkeni:" #: src/ui/gui/k-independent.ui:63 #, fuzzy #| msgid "_Upper:" msgid "_Upper limit:" msgstr "Yukarı:" #: src/ui/gui/k-independent.ui:77 #, fuzzy #| msgid "_Lower:" msgid "_Lower limit:" msgstr "Aşağı:" #: src/ui/gui/k-independent.ui:136 #, fuzzy #| msgid "Tests for Several Related Samples" msgid "Tests for Several Independent Samples" msgstr "Birkaç Bağlı Örneklem Testi" #: src/ui/gui/k-independent.ui:208 src/ui/gui/ks-one-sample.ui:131 msgid "Test _Variable List:" msgstr "Test _Değişkenleri Listesi:" #: src/ui/gui/k-independent.ui:320 #, fuzzy #| msgid "Define Groups" msgid "_Define Groups" msgstr "Grupları Tanımla" #: src/ui/gui/k-independent.ui:365 msgid "_Kruskal-Wallis H" msgstr "" #: src/ui/gui/k-independent.ui:382 src/ui/gui/runs.ui:140 msgid "_Median" msgstr "_Medyan" #: src/ui/gui/k-means.ui:24 msgid "K-Means Cluster Analysis" msgstr "_K-Ortalamalar Kümelemesi Analizi" #: src/ui/gui/k-means.ui:122 msgid "N_umber of Clusters: " msgstr "Kümelerin _Sayısı: " #: src/ui/gui/k-related.ui:24 msgid "Tests for Several Related Samples" msgstr "Birkaç Bağlı Örneklem Testi" #: src/ui/gui/k-related.ui:113 msgid "_Test Variables:" msgstr "_Test Değişkenleri:" #: src/ui/gui/k-related.ui:145 msgid "_Friedman" msgstr "_Friedman" #: src/ui/gui/k-related.ui:161 msgid "_Kendall's W" msgstr "_Kendall's W" #: src/ui/gui/k-related.ui:177 msgid "_Cochran's Q" msgstr "_Cochran's Q" #: src/ui/gui/ks-one-sample.ui:163 msgid "_Normal" msgstr "_Normal" #: src/ui/gui/ks-one-sample.ui:181 msgid "_Poisson" msgstr "_Poisson" #: src/ui/gui/ks-one-sample.ui:198 msgid "_Uniform" msgstr "_Tekdüze" #: src/ui/gui/ks-one-sample.ui:213 msgid "_Exponential" msgstr "_Üstel" #: src/ui/gui/ks-one-sample.ui:232 msgid "Test Distribution" msgstr "Test Dağılımı" #: src/ui/gui/logistic.ui:42 msgid "Logistic Regression: Options" msgstr "Lojistik Regresyon: Seçenekler" #: src/ui/gui/logistic.ui:66 msgid "CI for _exp(B): " msgstr "" #: src/ui/gui/logistic.ui:97 msgid "%" msgstr "%" #: src/ui/gui/logistic.ui:146 msgid "Classification cu_toff: " msgstr "_Sınıflandırma noktası:" #: src/ui/gui/logistic.ui:159 msgid "_Maximum Iterations: " msgstr "En Fazla Yineleme Sayısı: " #: src/ui/gui/logistic.ui:177 msgid "Include _constant in model" msgstr "Modelde _sabitleri dahil et" #: src/ui/gui/logistic.ui:219 msgid "Logistic Regression" msgstr "Lojistik Regresyon" #: src/ui/gui/logistic.ui:364 src/ui/gui/regression.ui:185 msgid "_Dependent" msgstr "_Bağımlı" #: src/ui/gui/logistic.ui:412 src/ui/gui/regression.ui:232 msgid "_Independent" msgstr "Bağım_sız" #: src/ui/gui/means.ui:25 msgid "Means" msgstr "Ortalamalar" #: src/ui/gui/means.ui:179 msgid "_Independent List:" msgstr "Bağımsı_zlar Listesi:" #: src/ui/gui/missing-val-dialog.ui:48 msgid "_No missing values" msgstr "_Eksik değer yok" #: src/ui/gui/missing-val-dialog.ui:136 msgid "_Discrete missing values" msgstr "_Eksik değerleri ayrık tut" #: src/ui/gui/missing-val-dialog.ui:172 msgid "_Low:" msgstr "_Düşük:" #: src/ui/gui/missing-val-dialog.ui:197 msgid "_High:" msgstr "_Yüksek:" #: src/ui/gui/missing-val-dialog.ui:221 msgid "Di_screte value:" msgstr "_Ayrık değer:" #: src/ui/gui/missing-val-dialog.ui:245 msgid "_Range plus one optional discrete missing value" msgstr "_Birden fazla isteğe bağlı farklı kayıp değeri sırala" #: src/ui/gui/oneway.ui:25 msgid "One-Way ANOVA: Contrasts" msgstr "Tek Yönlü ANOVA: Zıtlıklar" #: src/ui/gui/oneway.ui:107 msgid "_Coefficients:" msgstr "_Katsayılar:" #: src/ui/gui/oneway.ui:161 msgid "Coefficient Total: " msgstr "Katsayılar Toplamı: " #: src/ui/gui/oneway.ui:198 msgid "Contrast 1 of 1" msgstr "" #: src/ui/gui/oneway.ui:234 #, fuzzy #| msgid "One-Way ANOVA: Contrasts" msgid "One-Way ANOVA: Post-Hoc" msgstr "Tek Yönlü ANOVA: Zıtlıklar" #: src/ui/gui/oneway.ui:270 #, fuzzy #| msgid "Games-Howell" msgid "Games Howell" msgstr "Games-Howell" #: src/ui/gui/oneway.ui:287 msgid "Fisher's LSD" msgstr "" #: src/ui/gui/oneway.ui:379 msgid "One-Way ANOVA" msgstr "Tek Yönlü ANOVA" #: src/ui/gui/oneway.ui:408 msgid "_Factor:" msgstr "_Faktör:" #: src/ui/gui/oneway.ui:451 msgid "Dependent _Variable(s):" msgstr "Bağımlı _Değişken(ler):" #: src/ui/gui/oneway.ui:593 msgid "_Homogeneity" msgstr "_Türdeşlik" #: src/ui/gui/oneway.ui:637 msgid "Post-Hoc..." msgstr "" #: src/ui/gui/oneway.ui:652 msgid "_Contrasts..." msgstr "_Zıtlıklar..." #: src/ui/gui/options.ui:25 #, fuzzy #| msgid "Options" msgid "Options Case" msgstr "Seçenekler" #: src/ui/gui/options.ui:55 #, fuzzy #| msgid "Value _Labels" msgid "Display _Labels" msgstr "Değer _Etiketleri" #: src/ui/gui/options.ui:71 #, fuzzy #| msgid "Display" msgid "Display _Names" msgstr "Göster" #: src/ui/gui/options.ui:99 #, fuzzy #| msgid "Sort by:" msgid "Sort by L_abel" msgstr "Buna göre sınıflandır:" #: src/ui/gui/options.ui:115 #, fuzzy #| msgid "Sort by:" msgid "Sort by Na_me" msgstr "Buna göre sınıflandır:" #: src/ui/gui/options.ui:131 msgid "Do not S_ort" msgstr "" #: src/ui/gui/options.ui:159 #, fuzzy #| msgid "Variables" msgid "Variable Lists" msgstr "Değişkenler" #: src/ui/gui/options.ui:184 msgid "Ma_ximize" msgstr "" #: src/ui/gui/options.ui:199 msgid "_Raise" msgstr "" #: src/ui/gui/options.ui:214 msgid "Aler_t" msgstr "" #: src/ui/gui/options.ui:233 msgid "Output Window Action" msgstr "" #: src/ui/gui/paired-samples.ui:147 msgid "_Test Pair(s):" msgstr "Test Çift(ler)i:" #: src/ui/gui/rank.ui:30 msgid "Rank Cases: Types" msgstr "Vakaları Derecelendir: Türler" #: src/ui/gui/rank.ui:57 msgid "Sum of case _weights" msgstr "Vaka ağırlıklarının toplamı" #: src/ui/gui/rank.ui:74 msgid "Fractional rank as _%" msgstr "% olarak kesirli derecelendirme" #: src/ui/gui/rank.ui:92 msgid "_Fractional rank" msgstr "Kesirli derecelendirme" #: src/ui/gui/rank.ui:109 msgid "_Savage score" msgstr "" #: src/ui/gui/rank.ui:125 msgid "_Rank" msgstr "Derece" #: src/ui/gui/rank.ui:147 msgid "N_tiles" msgstr "" #: src/ui/gui/rank.ui:195 msgid "_Proportion Estimates" msgstr "Miktar Tahminleri" #: src/ui/gui/rank.ui:213 msgid "_Normal Scores" msgstr "Normal Skorlar" #: src/ui/gui/rank.ui:251 msgid "_Blom" msgstr "Blom" #: src/ui/gui/rank.ui:269 msgid "Tuke_y" msgstr "Tukey" #: src/ui/gui/rank.ui:287 msgid "Ran_kit" msgstr "" #: src/ui/gui/rank.ui:305 msgid "_Van der Waerden" msgstr "Van der Wärden" #: src/ui/gui/rank.ui:328 msgid "Proportion Estimation Formula" msgstr "Miktar Tahmin Formülü" #: src/ui/gui/rank.ui:369 msgid "Rank Cases" msgstr "Vakaları Derecelendir" #: src/ui/gui/rank.ui:434 msgid "_By:" msgstr "" #: src/ui/gui/rank.ui:595 msgid "_Smallest Value" msgstr "_En Küçük Değer" #: src/ui/gui/rank.ui:613 msgid "_Largest Value" msgstr "En _Büyük Değer" #: src/ui/gui/rank.ui:637 msgid "Assign rank 1 to:" msgstr "Derece 1'i ata:" #: src/ui/gui/rank.ui:656 msgid "_Display summary tables" msgstr "_Özet tablolarını göster" #: src/ui/gui/rank.ui:679 msgid "Rank T_ypes" msgstr "Derece Türleri" #: src/ui/gui/rank.ui:694 msgid "_Ties..." msgstr "Bağlar..." #: src/ui/gui/rank.ui:756 msgid "Rank Cases: Ties" msgstr "Vakaları Derecelendir: Bağlar" #: src/ui/gui/rank.ui:788 msgid "_Mean" msgstr "_Ortalama" #: src/ui/gui/rank.ui:806 msgid "_Low" msgstr "_Düşük" #: src/ui/gui/rank.ui:825 msgid "_High" msgstr "_Yüksek" #: src/ui/gui/rank.ui:851 msgid "_Sequential ranks to unique values" msgstr "Özgün değerlere sıralı dereceler" #: src/ui/gui/rank.ui:875 msgid "Rank Assigned to Ties" msgstr "Bağlara derece atandı" #: src/ui/gui/runs.ui:155 msgid "M_ean" msgstr "_Ortalama" #: src/ui/gui/runs.ui:171 msgid "Mo_de" msgstr "Mo_d" #: src/ui/gui/runs.ui:191 msgid "_Custom:" msgstr "_Özel:" #: src/ui/gui/runs.ui:230 msgid "Cut Point" msgstr "Kesme Noktası" #: src/ui/gui/sort.ui:25 msgid "Sort Cases" msgstr "Vakaları Sınıflandır" #: src/ui/gui/sort.ui:101 msgid "Sort by:" msgstr "Buna göre sınıflandır:" #: src/ui/gui/sort.ui:174 msgid "Descending" msgstr "Azalan" #: src/ui/gui/sort.ui:196 msgid "Sort Order" msgstr "Sınıflandırma Düzeni" #: src/ui/gui/split-file.ui:25 msgid "Split File" msgstr "Dosyayı Böl" #: src/ui/gui/split-file.ui:103 msgid "Anal_yze all cases. Do not create groups." msgstr "Tüm vakaları analiz et. Grup oluşturma." #: src/ui/gui/split-file.ui:121 msgid "Compare _groups." msgstr "Grupları karşılaştır." #: src/ui/gui/split-file.ui:140 msgid "Organize ou_tput by groups." msgstr "Çıktıyı gruplara göre düzenle." #: src/ui/gui/split-file.ui:225 msgid "Groups _based on:" msgstr "Buna göre grupla:" #: src/ui/gui/split-file.ui:255 msgid "_Sort the file by grouping variables." msgstr "_Dosyayı değişkenleri gruplandırarak sınıflandır." #: src/ui/gui/split-file.ui:273 msgid "_File is already sorted." msgstr "_Dosya zaten sınıflandırılmış." #: src/ui/gui/split-file.ui:334 msgid "Current Status : " msgstr "Şimdiki Durum : " #: src/ui/gui/split-file.ui:348 msgid "Analysis by groups is off" msgstr "Gruplara göre analizler kapalı" #: src/ui/gui/recode.ui:135 msgid "System _Missing" msgstr "Sistem Eksiği" #: src/ui/gui/recode.ui:150 msgid "Co_py old values" msgstr "Eski değerleri kopyala" #: src/ui/gui/recode.ui:172 msgid "Va_lue: " msgstr "Değer: " #: src/ui/gui/recode.ui:276 msgid "Conver_t numeric strings to numbers (`5' -> 5)" msgstr "_Sayısal dizeleri sayılara dönüştür (`5' -> 5)" #: src/ui/gui/recode.ui:297 msgid "Output variables are _strings" msgstr "Çıktı değişkenleri _dize" #: src/ui/gui/recode.ui:318 msgid "Width: " msgstr "Genişlik: " #: src/ui/gui/recode.ui:499 msgid "_Name:" msgstr "_İsim:" #: src/ui/gui/recode.ui:527 msgid "La_bel:" msgstr "_Etiket:" #: src/ui/gui/recode.ui:556 msgid "Chan_ge" msgstr "_Değiştir" #: src/ui/gui/recode.ui:584 msgid "Output Variable" msgstr "Çıktı Değişkeni" #: src/ui/gui/recode.ui:658 msgid "Old and New Va_lues..." msgstr "_Eski ve Yeni Değerler" #: src/ui/gui/regression.ui:51 msgid "S_tatistics..." msgstr "İ_statistikler..." #: src/ui/gui/regression.ui:272 msgid "Regression: Save" msgstr "Regresyon: Kaydet" #: src/ui/gui/regression.ui:290 src/ui/gui/univariate.ui:42 msgid "_Predicted values" msgstr "_Beklenen değerler" #: src/ui/gui/regression.ui:307 src/ui/gui/univariate.ui:59 msgid "_Residuals" msgstr "_Artıklar" #: src/ui/gui/regression.ui:351 msgid "Regression: Statistics" msgstr "Regresyon: İstatistikler" #: src/ui/gui/regression.ui:393 src/ui/gui/univariate.ui:143 msgid "S_tatistics" msgstr "İ_statistikler" #: src/ui/gui/reliability.ui:34 msgid "Alpha" msgstr "" #: src/ui/gui/reliability.ui:43 msgid "Reliability Analysis" msgstr "Güvenilirlik Analizi" #: src/ui/gui/reliability.ui:144 msgid "_Items:" msgstr "_Ögeler:" #: src/ui/gui/reliability.ui:166 msgid "_Model: " msgstr "_Model: " #: src/ui/gui/reliability.ui:212 msgid "_Variables in first split:" msgstr "_Birinci parçadaki değişkenler:" #: src/ui/gui/reliability.ui:259 msgid "Show _descriptives for scale if item is deleted" msgstr "Eğer ögeler silinmişse ölçek için tanımlayıcıları göster" #: src/ui/gui/roc.ui:145 msgid "_Test Variable:" msgstr "_Test Değişkeni:" #: src/ui/gui/roc.ui:175 msgid "_State Variable:" msgstr "_Durum Değişkeni:" #: src/ui/gui/roc.ui:202 msgid "_Value of state variable:" msgstr "Durum değişkeninin d_eğeri:" #: src/ui/gui/roc.ui:249 msgid "ROC C_urve" msgstr "ROC _Eğrisi" #: src/ui/gui/roc.ui:269 msgid "_With diagonal reference line" msgstr "Köşegen başvuru çizgisi ile" #: src/ui/gui/roc.ui:293 msgid "Standard _Error and Confidence Interval" msgstr "Standart _Hata ve Güven Aralığı" #: src/ui/gui/roc.ui:309 msgid "_Coordinate points of the ROC Curve" msgstr "_ROC Eğrisinin noktalarını düzenle" #: src/ui/gui/scatterplot.ui:25 #, fuzzy #| msgid "_Scree plot" msgid "Scatterplot" msgstr "_Kaygantaş çizimi" #: src/ui/gui/scatterplot.ui:56 msgid "_X Axis:" msgstr "" #: src/ui/gui/scatterplot.ui:100 msgid "_Y Axis:" msgstr "" #: src/ui/gui/select-cases.ui:37 msgid "Select Cases: Range" msgstr "Vakaları Seç: Aralık" #: src/ui/gui/select-cases.ui:87 msgid "First case" msgstr "İlk Vaka" #: src/ui/gui/select-cases.ui:99 msgid "Last case" msgstr "Son vaka" #: src/ui/gui/select-cases.ui:111 msgid "Observation" msgstr "Gözlem" #: src/ui/gui/select-cases.ui:161 msgid "Select Cases" msgstr "Vakaları Seç" #: src/ui/gui/select-cases.ui:313 msgid "Use filter variable" msgstr "Filtre değişkenini kullan" #: src/ui/gui/select-cases.ui:380 msgid "Based on time or case range" msgstr "Zaman veya vaka aralığı temelli" #: src/ui/gui/select-cases.ui:395 msgid "Range..." msgstr "Aralık..." #: src/ui/gui/select-cases.ui:444 msgid "Random sample of cases" msgstr "Rastgele vaka örneklemi" #: src/ui/gui/select-cases.ui:460 msgid "Sample..." msgstr "Örneklem..." #: src/ui/gui/select-cases.ui:508 msgid "If condition is satisfied" msgstr "Eğer koşul sağlanırsa" #: src/ui/gui/select-cases.ui:523 msgid "If..." msgstr "Eğer..." #: src/ui/gui/select-cases.ui:567 msgid "All Cases" msgstr "Tüm Vakalar" #: src/ui/gui/select-cases.ui:581 msgid "Select" msgstr "Seç" #: src/ui/gui/select-cases.ui:608 msgid "Filtered" msgstr "Filtrelenmiş" #: src/ui/gui/select-cases.ui:625 msgid "Deleted" msgstr "Silinmiş" #: src/ui/gui/select-cases.ui:647 msgid "Unselected Cases Are" msgstr "Seçilmemiş Vakalar" #: src/ui/gui/select-cases.ui:694 msgid "Select Cases: Random Sample" msgstr "Vakaları Seç: Rastgele Örneklem" #: src/ui/gui/select-cases.ui:756 msgid "Sample Size" msgstr "Örneklem Boyutu" #: src/ui/gui/t-test.ui:25 msgid "Options" msgstr "Seçenekler" #: src/ui/gui/t-test.ui:63 msgid "Exclude cases _analysis by analysis" msgstr "Vaka analizlerini çözümlemeden hariç tut" #: src/ui/gui/t-test.ui:148 msgid "One - Sample T Test" msgstr "Tek Örneklemli T Testi" #: src/ui/gui/t-test.ui:265 msgid "Test _Value: " msgstr "Test _Değeri:" #: src/ui/gui/text-data-import.ui:32 msgid "Select the first line of the data file that contains data." msgstr "Veri dosyasında veri içeren ilk satırı seç." #: src/ui/gui/text-data-import.ui:54 msgid "Line above selected line contains variable names" msgstr "Seçilen satır üzerindeki satır değişken özelliklerini içeriyor" #: src/ui/gui/text-data-import.ui:80 msgid "" "Check the data formats displayed below and fix any that are incorrect. You " "may set other variable properties now or later." msgstr "" "Aşağıda görüntülenen veri biçimlerini denetle ve yanlışlık varsa düzelt. " "Diğer değişken özelliklerini şimdi veya daha sonra ayarlayabilirsiniz." #: src/ui/gui/text-data-import.ui:121 msgid "Variables" msgstr "Değişkenler" #: src/ui/gui/text-data-import.ui:152 msgid "Data Preview" msgstr "Veri Önizlemesi" #: src/ui/gui/text-data-import.ui:181 #, fuzzy #| msgid "" #| "This assistant will guide you through the process of importing data into " #| "PSPP from a text file with one line per case, in which fields are " #| "separated by tabs, commas, or other delimiters.\n" #| "\n" #| "The selected file contains N lines of text. Only the first M of these " #| "will be shown for preview purposes in the following screens. You may " #| "choose below how much of the file should actually be imported." msgid "" "This assistant will guide you through the process of importing data into " "PSPP from a text file with one line per case, in which fields are separated " "by tabs, commas, or other delimiters.\n" "\n" "\tThe selected file contains N lines of text. Only the first M of these " "will be shown for preview purposes in the following screens. You may choose " "below how much of the file should actually be imported." msgstr "" "Bu sihirbaz sekmeyle, virgülle veya diğer diğer sınırlayıcılarla ayrılmış " "tek satırlı metin dosyalarından PSPP'ye veri aktarma sürecinde size yardım " "edecektir.\n" "\n" "Seçilen dosya N kadar satır içeriyor. Bunlardan ilki M sonraki ekranlarda ön " "izleme amacıyla gösterilecek. Dosyanın ne kadarının içeri aktarılaracığını " "aşağıdan seçebilirsiniz." #: src/ui/gui/text-data-import.ui:252 msgid "All cases" msgstr "Tüm Vakalar" #: src/ui/gui/text-data-import.ui:272 msgid "Amount to Import" msgstr "İçeriye Aktarılacak Miktar" #: src/ui/gui/text-data-import.ui:325 msgid "C_ustom" msgstr "_Özel" #: src/ui/gui/text-data-import.ui:341 msgid "Slas_h (/)" msgstr "Eğik Çizgi (/)" #: src/ui/gui/text-data-import.ui:357 msgid "Semicolo_n (;)" msgstr "_Noktalı Virgül (;)" #: src/ui/gui/text-data-import.ui:373 msgid "P_ipe (|)" msgstr "Di_k Çizgi (|)" #: src/ui/gui/text-data-import.ui:389 msgid "H_yphen (-)" msgstr "K_ısa Çizgi (-)" #: src/ui/gui/text-data-import.ui:405 msgid "Co_mma (,)" msgstr "_Virgül (,)" #: src/ui/gui/text-data-import.ui:421 msgid "_Colon (:)" msgstr "_İki Nokta Üst Üste (:)" #: src/ui/gui/text-data-import.ui:437 msgid "Ban_g (!)" msgstr "_Ünlem (!)" #: src/ui/gui/text-data-import.ui:453 msgid "Ta_b" msgstr "_Sekme" #: src/ui/gui/text-data-import.ui:469 msgid "_Space" msgstr "_Boşluk" #: src/ui/gui/text-data-import.ui:490 msgid "Separators" msgstr "Ayırıcılar" #: src/ui/gui/text-data-import.ui:541 msgid "Quote separator characters with" msgstr "Alıntı ayırıcı karakterler ile" #: src/ui/gui/text-data-import.ui:561 msgid "Quoting" msgstr "Quoting" #: src/ui/gui/text-data-import.ui:599 msgid "Fields Preview" msgstr "Alan Önizlemeleri" #: src/ui/gui/text-data-import.ui:622 msgid "" "Enter below the sheet number and the cell range which you wish to import." msgstr "" "Aşağıya içeri aktarmak istediğiniz sayfa numarası ve hücre aralığını girin." #: src/ui/gui/text-data-import.ui:670 msgid "_Cells: " msgstr "_Hücreler: " #: src/ui/gui/text-data-import.ui:684 msgid "_Sheet Index: " msgstr "_Sayfa Dizini: " #: src/ui/gui/text-data-import.ui:695 msgid "Use first row as _variable names" msgstr "İlk satırı bir değişken adı olarak kullan" #: src/ui/gui/text-data-import.ui:717 msgid "Cells to Import" msgstr "İçeriye Aktarılacak Hücreler" #: src/ui/gui/transpose.ui:24 msgid "Transpose" msgstr "Yer Değiştir" #: src/ui/gui/transpose.ui:91 msgid "Name Variable:" msgstr "İsim Değişkeni:" #: src/ui/gui/transpose.ui:127 msgid "Variable(s):" msgstr "Değişken(ler):" #: src/ui/gui/univariate.ui:25 msgid "Univariate: Save" msgstr "Tek Değişkenli: Kaydet" #: src/ui/gui/univariate.ui:103 msgid "Univariate: Statistics" msgstr "Tek Değişkenli: İstatistikler" #: src/ui/gui/univariate.ui:178 msgid "Univariate" msgstr "Tek Değişkenli" #: src/ui/gui/univariate.ui:281 msgid "_Dependent Variable" msgstr "_Bağımlı Değişken" #: src/ui/gui/univariate.ui:329 msgid "_Fixed Factors" msgstr "_Sabit Faktörler" #: src/ui/gui/val-labs-dialog.ui:101 msgid "Value Label:" msgstr "Değer Etiketi:" #: src/ui/gui/data-editor.ui:33 msgid "Information Area" msgstr "Bilgilendirme Alanı" #: src/ui/gui/data-editor.ui:55 msgid "Case Counter Area" msgstr "Vaka Sayacı Alanı" #: src/ui/gui/data-editor.ui:80 msgid "Filter Use Status Area" msgstr "Filtre Kullanım Durumu Alanı" #: src/ui/gui/data-editor.ui:106 msgid "Weight Status Area" msgstr "Ağırlık Durumu Alanı" #: src/ui/gui/data-editor.ui:132 msgid "Split File Status Area" msgstr "Dosya Durumu Alanını Böl" #: src/ui/gui/data-editor.ui:154 msgid "_View" msgstr "_Görünüm" #: src/ui/gui/data-editor.ui:157 msgid "_Status Bar" msgstr "_Durum Çubuğu" #: src/ui/gui/data-editor.ui:163 msgid "_Font..." msgstr "_Yazı Tipi..." #: src/ui/gui/data-editor.ui:167 msgid "_Grid Lines" msgstr "_Kılavuz Çizgileri" #: src/ui/gui/data-editor.ui:171 msgid "Value _Labels" msgstr "Değer _Etiketleri" #: src/ui/gui/data-editor.ui:182 msgid "_Variables" msgstr "_Değişkenler" #: src/ui/gui/data-editor.ui:192 msgid "_Sort Cases..." msgstr "Vakaları _Sırala..." #: src/ui/gui/data-editor.ui:196 msgid "_Transpose..." msgstr "_Yer Değiştir..." #: src/ui/gui/data-editor.ui:200 msgid "_Aggregate..." msgstr "_Kümele..." #: src/ui/gui/data-editor.ui:206 msgid "S_plit File..." msgstr "Dosyayı B_öl..." #: src/ui/gui/data-editor.ui:210 msgid "Select _Cases..." msgstr "Vakaları Seç..." #: src/ui/gui/data-editor.ui:214 msgid "_Weight Cases..." msgstr "Vakaları _Ağırlıklandır..." #: src/ui/gui/data-editor.ui:220 msgid "_Transform" msgstr "_Dönüştür" #: src/ui/gui/data-editor.ui:223 msgid "_Compute..." msgstr "_Hesapla..." #: src/ui/gui/data-editor.ui:227 msgid "Cou_nt..." msgstr "Sa_y..." #: src/ui/gui/data-editor.ui:231 msgid "Ran_k Cases..." msgstr "Vakaları _Derecelendir..." #: src/ui/gui/data-editor.ui:235 msgid "Auto_matic Recode..." msgstr "_Otomatik Yeniden Kodlama..." #: src/ui/gui/data-editor.ui:241 msgid "Recode into _Same Variables..." msgstr "_Aynı Değişkenlere Kodla..." #: src/ui/gui/data-editor.ui:245 msgid "Recode into _Different Variables..." msgstr "_Farklı Değişkenlere Kodla..." #: src/ui/gui/data-editor.ui:251 msgid "_Run Pending Transforms" msgstr "_Bekleyen Dönüşümleri Çalıştır" #: src/ui/gui/data-editor.ui:257 msgid "_Analyze" msgstr "_Analiz Et" #: src/ui/gui/data-editor.ui:260 msgid "_Descriptive Statistics" msgstr "A_çıklayıcı İstatistikler" #: src/ui/gui/data-editor.ui:262 msgid "_Frequencies..." msgstr "_Frekanslar..." #: src/ui/gui/data-editor.ui:270 msgid "_Explore..." msgstr "Araş_tır..." #: src/ui/gui/data-editor.ui:274 msgid "_Crosstabs..." msgstr "_Çapraz Tablolar..." #: src/ui/gui/data-editor.ui:279 msgid "Compare _Means" msgstr "_Ortalamaları Karşılaştır" #: src/ui/gui/data-editor.ui:281 msgid "_Means..." msgstr "_Ortalamalar..." #: src/ui/gui/data-editor.ui:285 msgid "_One Sample T Test..." msgstr "_Tek Örneklemli T Testi..." #: src/ui/gui/data-editor.ui:289 msgid "_Independent Samples T Test..." msgstr "_Bağımsız İki Örneklemli T Testi..." #: src/ui/gui/data-editor.ui:293 msgid "_Paired Samples T Test..." msgstr "Bağlı _İki Örneklemli T Testi..." #: src/ui/gui/data-editor.ui:297 #, fuzzy #| msgid "One Way _ANOVA..." msgid "One Way _ANOVA..." msgstr "Tek Yönlü _ANOVA..." #: src/ui/gui/data-editor.ui:302 msgid "_Univariate Analysis..." msgstr "_Tek Değişkenli Analizler..." #: src/ui/gui/data-editor.ui:306 msgid "Bivariate _Correlation..." msgstr "_İki Değişkenli Korelasyon..." #: src/ui/gui/data-editor.ui:310 msgid "_K-Means Cluster..." msgstr "_K-Ortalamalar Kümelemesi..." #: src/ui/gui/data-editor.ui:314 #, fuzzy #| msgid "Factor _Analysis..." msgid "_Factor Analysis..." msgstr "_Faktör Analizi..." #: src/ui/gui/data-editor.ui:318 msgid "Re_liability..." msgstr "_Güvenilirlik..." #: src/ui/gui/data-editor.ui:322 msgid "_Regression" msgstr "_Regresyon" #: src/ui/gui/data-editor.ui:325 msgid "_Linear..." msgstr "_Doğrusal" #: src/ui/gui/data-editor.ui:329 msgid "_Binary Logistic..." msgstr "_İkili Lojistik..." #: src/ui/gui/data-editor.ui:335 msgid "_Non-Parametric Statistics" msgstr "_Parametrik Olmayan İstatistikler" #: src/ui/gui/data-editor.ui:338 #, fuzzy #| msgid "_Chi-Square..." msgid "_Chi Square..." msgstr "_Ki-Kare..." #: src/ui/gui/data-editor.ui:342 msgid "_Binomial..." msgstr "_Binom..." #: src/ui/gui/data-editor.ui:346 #, fuzzy #| msgid "R_uns..." msgid "_Runs..." msgstr "_Çalıştırmalar..." #: src/ui/gui/data-editor.ui:350 #, fuzzy #| msgid "1-Sample _K-S..." msgid "_1 Sample K-S..." msgstr "Tek Örneklemli _Kolmogorov-Smirnov..." #: src/ui/gui/data-editor.ui:354 #, fuzzy #| msgid "2 _Related Samples..." msgid "_2 Related Samples..." msgstr "2 _Bağımlı Örneklem..." #: src/ui/gui/data-editor.ui:358 #, fuzzy #| msgid "K Related _Samples..." msgid "_K Related Samples..." msgstr "K Bağımlı _Örneklem..." #: src/ui/gui/data-editor.ui:362 #, fuzzy #| msgid "_Independent Samples T Test..." msgid "K _Independent Samples..." msgstr "_Bağımsız İki Örneklemli T Testi..." #: src/ui/gui/data-editor.ui:368 msgid "ROC Cur_ve..." msgstr "ROC _Eğrisi..." #: src/ui/gui/data-editor.ui:374 msgid "_Graphs" msgstr "" #: src/ui/gui/data-editor.ui:377 #, fuzzy #| msgid "_Scree plot" msgid "_Scatterplot" msgstr "_Kaygantaş çizimi" #: src/ui/gui/data-editor.ui:381 #, fuzzy #| msgid "Draw _histograms" msgid "_Histogram" msgstr "Sütun _grafikleri çiz" #: src/ui/gui/data-editor.ui:385 msgid "_Barchart" msgstr "" #: src/ui/gui/data-editor.ui:391 msgid "_Utilities" msgstr "_Araçlar" #: src/ui/gui/data-editor.ui:394 msgid "_Variables..." msgstr "_Değişkenler..." #: src/ui/gui/data-editor.ui:398 msgid "Data File _Comments..." msgstr "Veri Dosyası Açıklamaları..." #: src/ui/gui/output-window.ui:71 msgid "_Print..." msgstr "_Yazdır..." #: src/ui/gui/output-window.ui:76 msgid "_Export..." msgstr "_Dışarıya Aktar..." #: src/ui/gui/output-window.ui:92 msgid "Select _All" msgstr "Tümünü _Seç" #: src/ui/gui/syntax-editor.ui:27 #, fuzzy #| msgid "_Syntax" msgid "Syntax" msgstr "_Sözdizimi" #: src/ui/gui/syntax-editor.ui:31 #, fuzzy #| msgid "_Data" msgid "Data" msgstr "_Veri" #: src/ui/gui/syntax-editor.ui:41 msgid "_Save" msgstr "_Kaydet" #: src/ui/gui/syntax-editor.ui:46 #, fuzzy #| msgid "Save _As..." msgid "Save _As" msgstr "_Farklı Kaydet..." #: src/ui/gui/syntax-editor.ui:53 #, fuzzy #| msgid "_Print..." msgid "_Print" msgstr "_Yazdır..." #: src/ui/gui/syntax-editor.ui:84 #, fuzzy #| msgid "Deleted" msgid "_Delete" msgstr "Silinmiş" #: src/ui/gui/syntax-editor.ui:90 msgid "_Undo" msgstr "" #: src/ui/gui/syntax-editor.ui:94 msgid "_Redo" msgstr "" #: src/ui/gui/syntax-editor.ui:100 #, fuzzy #| msgid "_Find..." msgid "_Find" msgstr "_Bul..." #: src/ui/gui/syntax-editor.ui:106 msgid "_Run" msgstr "_Çalıştır" #: src/ui/gui/syntax-editor.ui:109 msgid "_All" msgstr "" #: src/ui/gui/syntax-editor.ui:113 #, fuzzy #| msgid "Selection" msgid "_Selection" msgstr "Seçim" #: src/ui/gui/syntax-editor.ui:117 #, fuzzy #| msgid "Current Line" msgid "_Current Line" msgstr "Şimdiki Satır" #: src/ui/gui/syntax-editor.ui:122 #, fuzzy #| msgid "To End" msgid "_To End" msgstr "Sona Kadar" #: src/ui/gui/var-type-dialog.ui:99 msgid "Scientific notation" msgstr "Bilimsel gösterim" #: src/ui/gui/var-type-dialog.ui:150 msgid "Custom currency" msgstr "Özel para birimi" #: src/ui/gui/var-type-dialog.ui:267 msgid "positive" msgstr "pozitif" #: src/ui/gui/var-type-dialog.ui:279 msgid "negative" msgstr "negatif" #: src/ui/gui/var-type-dialog.ui:293 msgid "Sample" msgstr "Örneklem" #: src/ui/gui/var-type-dialog.ui:350 msgid "Width:" msgstr "Genişlik:" #: src/ui/gui/var-type-dialog.ui:396 msgid "Decimal Places:" msgstr "Ondalık Basamaklar:" #: src/ui/gui/weight.ui:24 msgid "Weight Cases" msgstr "Vakaları Ağırlıklandır" #: src/ui/gui/weight.ui:100 msgid "Weight cases by" msgstr "Vakaları buna göre ağırlıklandır" #: src/ui/gui/weight.ui:144 msgid "Frequency Variable" msgstr "Frekans Değişkeni" #: src/ui/gui/weight.ui:198 msgid "Current Status: " msgstr "Şimdiki Durum: " #. TRANSLATORS: This is the application name in the desktop file #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:7 #: src/ui/gui/org.fsf.pspp.desktop.in:7 msgid "GNU PSPP" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:8 #, fuzzy #| msgid "A program for the analysis of sampled data" msgid "GNU PSPP is a program for statistical analysis of sampled data" msgstr "Örneklenmiş verileri analiz etmek için bir uygulama" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:10 msgid "" "GNU PSPP is a program for the statistical analysis of sampled data. It is a " "Free replacement for the proprietary program SPSS, and appears very similar " "to it with a few exceptions. The most important of these exceptions are, " "that there are no “time bombs”; your copy of PSPP will not “expire” or " "deliberately stop working in the future. Neither are there any artificial " "limits on the number of cases or variables which you can use. There are no " "additional packages to purchase in order to get “advanced” functions; all " "functionality that PSPP currently supports is in the core package." msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:11 msgid "" "PSPP is a stable and reliable application. It can perform descriptive " "statistics, T-tests, anova, linear and logistic regression, measures of " "association, cluster analysis, reliability and factor analysis, non-" "parametric tests and more. Its backend is designed to perform its analyses " "as fast as possible, regardless of the size of the input data. You can use " "PSPP with its graphical interface or the more traditional syntax commands." msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:12 msgid "A brief list of some of the PSPP's features." msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:14 msgid "Support for over 1 billion cases" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:15 msgid "Support for over 1 billion variables" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:16 msgid "Syntax and data files which are compatible with those of SPSS" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:17 msgid "A choice of terminal or graphical user interface" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:18 msgid "A choice of text, postscript, pdf, opendocument or html output formats" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:19 msgid "" "Inter-operability with: LibreOffice, Apache OpenOffice, Gnumeric and other " "free software" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:20 msgid "Easy data import from spreadsheets, text files and database sources" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:21 msgid "" "The capability to open, analyse and edit two or more datasets concurrently" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:22 msgid "A user interface supporting all common character sets" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:23 msgid "A user interface has been translated to multiple languages" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:24 msgid "Very fast statistical procedures, even on very large data sets" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:25 msgid "No license fees and no expiration period" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:26 msgid "No unethical “end user license agreements”" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:27 msgid "A fully indexed user manual" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:28 msgid "Freedom ensured; It is licensed under the GPLv3 or later" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:29 msgid "" "Portability; Runs on many different computers and many different operating " "systems" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:31 msgid "" "PSPP is particularly aimed at statisticians, social scientists and students " "requiring fast convenient analysis of sampled data." msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:41 #, fuzzy #| msgid "Variable View" msgid "GNU PSPP Variable View" msgstr "Değişken Görünümü" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:54 msgid "Free Software Foundation" msgstr "" #: src/ui/gui/org.fsf.pspp.desktop.in:8 msgid "Statistical Software" msgstr "İstatistiksel Yazılım" #: src/ui/gui/org.fsf.pspp.desktop.in:9 msgid "Analyze statistical data with a free alternative to SPSS" msgstr "" "SPSS yazılımının özgür alternatifi ile istatistiksel verileri analiz edin" #. TRANSLATORS: Do not translate this string. Keep it as is, verbatim. #: src/ui/gui/org.fsf.pspp.desktop.in:12 msgid "pspp" msgstr "" #. TRANSLATORS: You must keep all ";" - also at the end of line. #: src/ui/gui/org.fsf.pspp.desktop.in:17 msgid "statistics;analysis;spss;" msgstr "" #~ msgid "Sorry. The help system hasn't yet been implemented." #~ msgstr "Üzgünüm. Yardım sistemi henüz eklenmedi." #~ msgid "Support for %s files was not compiled into this installation of PSPP" #~ msgstr "" #~ "Bu PSPP kurulumunda, derleme sırasında %s dosyası desteği eklenmemiş" #~ msgid "Details" #~ msgstr "Ayrıntılar" #~ msgid "Multiple category set" #~ msgstr "Çoklu kategori kümesi" #~ msgid "Label source" #~ msgstr "Etiket kaynağı" #~ msgid "First variable label among variables" #~ msgstr "Değişkenler arasında ilk değişken adı" #~ msgid "Provided by user" #~ msgstr "Kullanıcı tarafından sağlanan" #~ msgid "Category label source" #~ msgstr "Kategori etiketi kaynağı" #~ msgid "Variable labels" #~ msgstr "Değişken etiketleri" #~ msgid "Value labels of counted value" #~ msgstr "Sayılan değerlerin değer etiketleri" #~ msgid "Label:" #~ msgstr "Etiket:" #~ msgid "No label." #~ msgstr "Etiket yok." #~ msgid "Product:" #~ msgstr "Ürün:" #~ msgid "Variables:" #~ msgstr "Değişkenler:" #~ msgid "Cases:" #~ msgstr "Vakalar:" #~ msgid "Type:" #~ msgstr "Tür:" #~ msgid "Description" #~ msgstr "Açıklama" #~ msgid "The active dataset does not have a file label." #~ msgstr "Etkin veri setinin bir dosya etiketi yok." #~ msgid "File label: %s" #~ msgstr "Dosya etiketi: %s" #~ msgid "The active dataset dictionary does not contain any documents." #~ msgstr "Etkin veri seti sözlüğü bir belge içermiyor." #~ msgid "Documents in the active dataset:" #~ msgstr "Etkin veri seti içerisindeki belgeler:" #~ msgid "Label: %s\n" #~ msgstr "Etiket: %s\n" #, fuzzy #~| msgid "Format: %s" #~ msgid "Format: %s\n" #~ msgstr "Biçim: %s" #, fuzzy #~| msgid "Print Format: %s" #~ msgid "Print Format: %s\n" #~ msgstr "Yazdırma Biçimi: %s" #, fuzzy #~| msgid "Write Format: %s" #~ msgid "Write Format: %s\n" #~ msgstr "Yazma Biçimi: %s" #, fuzzy #~| msgid "Measure: %s" #~ msgid "Measure: %s\n" #~ msgstr "Ölçü: %s" #, fuzzy #~| msgid "Role: %s" #~ msgid "Role: %s\n" #~ msgstr "Rol: %s" #, fuzzy #~| msgid "Display Alignment: %s" #~ msgid "Display Alignment: %s\n" #~ msgstr "Ekran Yerleşimi: %s" #, fuzzy #~| msgid "Display Width: %d" #~ msgid "Display Width: %d\n" #~ msgstr "Ekran Genişliği: %d" #~ msgid "Missing Values: " #~ msgstr "Eksik Değerler: " #~ msgid "Interactive shell not supported on this platform." #~ msgstr "Bu platformda etkileşimli kabuk desteklenmiyor." #~ msgid "Error executing command: %s." #~ msgstr "Komut çalıştırılamadı: %s." #~ msgid "Exact Sig. (%d-tailed)" #~ msgstr "Kesin Anlamlılık (%d Yanlı)" #~ msgid "Valid N" #~ msgstr "Geçerli N" #~ msgid "Missing N" #~ msgstr "Eksik N" #~ msgid "%g" #~ msgstr "%g" #~ msgid "%d" #~ msgstr "%d" #~ msgid "%zu" #~ msgstr "%zu" #~ msgid "50 (Median)" #~ msgstr "50 (Medyan)" #~ msgid "(%d)" #~ msgstr "(%d)" #~ msgid "Min" #~ msgstr "En düş." #~ msgid "Max" #~ msgstr "En yük." #~ msgid "%g%%" #~ msgstr "%g%%" #~ msgid "25th" #~ msgstr "25." #~ msgid "50th (Median)" #~ msgstr "50. (Medyan)" #~ msgid "75th" #~ msgstr "75." #~ msgid "(I) %s" #~ msgstr "(I) %s" #~ msgid "(J) %s" #~ msgstr "(J) %s" #~ msgid "(I - J)" #~ msgstr "(I - J)" #~ msgid "Area Under the Curve (%s)" #~ msgstr "Eğrinin Altındaki Alan (%s)" #~ msgid "Coordinates of the Curve (%s)" #~ msgstr "Eğrinin Koordinatları (%s)" #~ msgid "Std. Error Mean" #~ msgstr "Standart Hata Ortalaması" #~ msgid "(active dataset)" #~ msgstr "(etkin veri seti)" #~ msgid "Writing %zu record to %s." #~ msgid_plural "Writing %zu records to %s." #~ msgstr[0] "%zu kayıt %s ögesine yazılıyor." #~ msgstr[1] "%zu kayıt %s ögesine yazılıyor." #~ msgid "Writing %zu record." #~ msgid_plural "Writing %zu records." #~ msgstr[0] "%zu kayıt yazılıyor." #~ msgstr[1] "%zu kayıt yazılıyor." #~ msgid "Unsupported compression type (%d)" #~ msgstr "Desteklenmeyen sıkıştırma türü (%d)" #~ msgid "Failed to seek to central directory: %s" #~ msgstr "Esas dizin arama başarısız oldu: %s" #~ msgid "ascii: closing output file `%s'" #~ msgstr "ascii: çıktı dosyası `%s' kapatılıyor" #~ msgid "%s - Page %d" #~ msgstr "%s - Sayfa %d" #~ msgid "bad vline: x=%d+%d=%d y=(%d+%d=%d,%d+%d=%d) in table size (%d,%d)\n" #~ msgstr "" #~ "uygunsuz dikey çizgi: (%d,%d) tablo boyutu x=%d+%d=%d y=(%d+%d=%d,%d+%d=" #~ "%d) \n" #~ msgid "bad hline: x=(%d+%d=%d,%d+%d=%d) y=%d+%d=%d in table size (%d,%d)\n" #~ msgstr "" #~ "uygunsuz yatay çizgi: tablo boyutunda (%d,%d) x=(%d+%d=%d,%d+%d=%d) y=%d+" #~ "%d=%d\n" #~ msgid "This input line has too few separators to fill in this field." #~ msgstr "Bu alandaki girdi satırında doldurmak için çok az ayraç var." #~ msgid "An error occurred reading the spreadsheet file." #~ msgstr "Hesap Tablo dosyası açılırken bir hata oluştu." #~ msgid "Enter a number to add a new variable." #~ msgstr "Yeni bir değişkene eklemek için bir sayı girin." #~ msgid "Enter a number to add a new case." #~ msgstr "Yeni bir vakaya eklemek için bir sayı girin." #~ msgid "Cannot create variable." #~ msgstr "Değişken oluşturulmadı." #~ msgid "\"%s\" is not a valid variable name." #~ msgstr "%s geçerli bir değişken adı değil." #~ msgid "This dictionary already contains a variable named \"%s\"." #~ msgstr "Bu sözlük zaten \"%s\" isimli bir değişken içeriyor." #~ msgid "Cannot rename variable." #~ msgstr "Değişken yeniden adlandırılamadı." #~ msgid "Enter a variable name to add a new variable." #~ msgstr "Yeni bir değişkene eklemek için bir değişken adı girin." #~ msgid "{%s, %s}\n" #~ msgstr "{%s, %s}\n" #~ msgid "count" #~ msgstr "sayı" #~ msgid "expected" #~ msgstr "beklenen" #~ msgid "residual" #~ msgstr "artık" #~ msgid "std. resid." #~ msgstr "standart artık" #~ msgid "adj. resid." #~ msgstr "ayarlanmış artık" #~ msgid "Chi-square tests." #~ msgstr "Ki-kare testleri." #~ msgid "Odds Ratio for %s (%.*s / %.*s)" #~ msgstr "%s için Bahis/Risk Oranı (%.*s / %.*s)" #~ msgid "expecting number or data string" #~ msgstr "sayı veya veri dizesi bekleniyor" #~ msgid "Label: %s" #~ msgstr "Etiket: %s" #~ msgid "Number of clusters may not be larger than the number of cases." #~ msgstr "Küme sayısı vaka sayısından daha büyük olamaz." #~ msgid "TreeView path" #~ msgstr "Ağaç Görünü yolu" #~ msgid "Diagonal slash" #~ msgstr "Çapraz çizgi" #~ msgid "Whether to draw a diagonal slash across the button." #~ msgstr "Düğme üzerine bir çapraz çizgi çiz." #, fuzzy #~ msgid "" #~ "PSPPIRE, a GUI for PSPP, a program for statistical analysis of sampled " #~ "data.\n" #~ "Usage: %s [OPTION]... FILE\n" #~ "\n" #~ "Arguments to long options also apply to equivalent short options.\n" #~ "\n" #~ "GUI options:\n" #~ " -q, --no-splash don't show splash screen during startup\n" #~ "\n" #~ "%sLanguage options:\n" #~ " -I, --include=DIR append DIR to search path\n" #~ " -I-, --no-include clear search path\n" #~ " -a, --algorithm={compatible|enhanced}\n" #~ " set to `compatible' if you want output\n" #~ " calculated from broken algorithms\n" #~ " -x, --syntax={compatible|enhanced}\n" #~ " set to `compatible' to disable PSPP " #~ "extensions\n" #~ " -i, --interactive interpret syntax in interactive mode\n" #~ " -s, --safer don't allow some unsafe operations\n" #~ "Default search path: %s\n" #~ "\n" #~ "Informative output:\n" #~ " -h, --help display this help and exit\n" #~ " -V, --version output version information and exit\n" #~ "\n" #~ "A non-option argument is interpreted as a data file in .sav or .zsav or ." #~ "por\n" #~ "format or a syntax file to load.\n" #~ msgstr "" #~ "PSPP, örneklenmiş verilerin istatistiksel analizi için bir uygulamadır.\n" #~ "Kullanım: %s [SEÇENEK]... DOSYA...\n" #~ "\n" #~ "Arguments to long options also apply to equivalent short options.\n" #~ "\n" #~ "Çıktı Seçenekleri:\n" #~ " -o, --output=FILE output to FILE, default format from FILE's " #~ "name\n" #~ " -O format=FORMAT override format for previous -o\n" #~ " -O OPTION=VALUE set output option to customize previous -o\n" #~ " -O device={terminal|listing} override device type for previous -o\n" #~ " -e, --error-file=FILE append errors, warnings, and notes to FILE\n" #~ " --no-output varsayılan çıktı sürücüsünü iptal eder\n" #~ "Desteklenen çıktı biçimleri: %s\n" #~ "\n" #~ "Dil Seçenekleri:\n" #~ " -I, --include=DIR append DIR to search path\n" #~ " -I-, --no-include arama yolunu temizler\n" #~ " -r, --no-statrc disable running rc file at startup\n" #~ " -a, --algorithm={compatible|enhanced}\n" #~ " set to `compatible' if you want output\n" #~ " calculated from broken algorithms\n" #~ " -x, --syntax={compatible|enhanced}\n" #~ " set to `compatible' to disable PSPP " #~ "extensions\n" #~ " -b, --batch interpret syntax in batch mode\n" #~ " -i, --interactive interpret syntax in interactive mode\n" #~ " --syntax-encoding=ENCODING sözdizimi dosyaları için kodlama belirler\n" #~ " -s, --safer bazı güvensiz eylemlere izin vermez\n" #~ "Öntanımlı arama yolu: %s\n" #~ "\n" #~ "Bilgilendirici Çıktı:\n" #~ " -h, --help Bu yardımı gösterir ve çıkış\n" #~ " -V, --version çıktı sürüm bilgisi ve çıkış\n" #~ "\n" #~ "Non-option arguments are interpreted as syntax files to execute.\n" #~ msgid "Incorrect value for variable type" #~ msgstr "Değişken türü için yanlış değer" #~ msgid "_Select" #~ msgstr "_Seç" #~ msgid "Font Selection" #~ msgstr "Yazı Tipi Seçimi" #~ msgid "Type: %s\n" #~ msgstr "Tip: %s\n" #~ msgid "Missing Values: %s\n" #~ msgstr "Eksik Değerler: %s\n" #~ msgid "Value Labels:\n" #~ msgstr "Değer Etiketleri:\n" #~ msgid "%s %s\n" #~ msgstr "%s %s\n" #~ msgid "Import Delimited Text Data" #~ msgstr "Sınırlandırılmış Metin Verilerini İçeriye Aktarma" #~ msgid "Bar charts are not implemented." #~ msgstr "Çubuk grafikler henüz eklenmedi." #~ msgid "No valid data for variable %s; statistics not displayed." #~ msgstr "%s değişkeni için geçerli veri yok; istatistikler gösterilemez." #~ msgid "Delete the variables at the selected position(s)" #~ msgstr "Seçilen konum(lar)daki değişkenleri sil" #~ msgid "Delete the cases at the selected position(s)" #~ msgstr "Seçilen konum(lar)daki vakaları sil" #~ msgid "(optional case selection condition)" #~ msgstr "(seçimlik vaka seçme koşulu)" #~ msgid "Importing Textual Data" #~ msgstr "Metinsel Veri İçeriye Aktarılıyor" #~ msgid "Doubled quote mark treated as escape" #~ msgstr "Çift tırnak işareti kaçış karakteri olarak değerlendirildi" #~ msgid "_Open..." #~ msgstr "_Aç..." #~ msgid "Transpose the cases with the variables" #~ msgstr "Vakaları değişkenler ile yer değiştir" #~ msgid "Choose a subset of cases for analysis" #~ msgstr "Analiz için vakaların alt kümesini seçin" #~ msgid "All" #~ msgstr "Tümü" pspp-1.4.1/po/zh_CN.po0000644000175000017500000112404013725012645014101 0ustar00blpblp00000000000000# Simplified Chinese messages for PSPP. # Copyright (C) 2015 Free Software Foundation, Inc. # This file is distributed under the same license as the pspp package. # Shulin Yang , 2015. # msgid "" msgstr "" "Project-Id-Version: pspp-1.0.1\n" "Report-Msgid-Bugs-To: pspp-dev@gnu.org\n" "PO-Revision-Date: 2017-08-29 16:17+0800\n" "Last-Translator: Shulin Yang \n" "Language-Team: Chinese (simplified) \n" "Language: zh_CN\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Bugs: Report translation errors to the Language-Team address.\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: Poedit 2.0.3\n" #: src/data/any-reader.c:72 src/data/encrypted-file.c:78 #, c-format msgid "An error occurred while opening `%s': %s." msgstr "打开操作出错`%s': %s。" #: src/data/any-reader.c:93 src/language/lexer/lexer.c:1633 #, c-format msgid "Error reading `%s': %s." msgstr "读取错误`%s': %s。" #: src/data/any-reader.c:114 #, c-format msgid "`%s' is not a system or portable file." msgstr "`%s'非系统或便携格式文件。" #: src/data/any-reader.c:123 src/data/any-writer.c:66 msgid "The inline file is not allowed here." msgstr "此处不能使用内联文件。" #: src/data/any-reader.c:205 #, c-format msgid "" "Cannot read from dataset %s because no dictionary or data has been written " "to it yet." msgstr "数字集%s未包含字典或数据,无法读取数据。" #: src/data/any-reader.c:260 src/language/data-io/dataset.c:253 msgid "Dataset" msgstr "数据集" #: src/data/calendar.c:100 #, c-format msgid "Month %d is not in acceptable range of 0 to 13." msgstr "月份%d超出介于0-13间的正常范围。" #: src/data/calendar.c:110 #, c-format msgid "Day %d is not in acceptable range of 0 to 31." msgstr "日期%d超出介于0-31间的正常范围。" #: src/data/calendar.c:119 #, c-format msgid "Date %04d-%d-%d is before the earliest acceptable date of 1582-10-15." msgstr "日期%04d-%d-%d早于系统可接受最早日期1582年10月15日。" #: src/data/casereader-filter.c:221 msgid "" "At least one case in the data read had a weight value that was user-missing, " "system-missing, zero, or negative. These case(s) were ignored." msgstr "读取的数据中至少有一个个案因其权重值缺失或小于等于零而被忽略。" #. TRANSLATORS: this fragment will be interpolated into messages in fh_lock() #. that identify types of files. #: src/data/csv-file-writer.c:138 msgid "CSV file" msgstr "CSV文件" #: src/data/csv-file-writer.c:146 #, fuzzy, c-format #| msgid "Error opening `%s' for writing as a system file: %s." msgid "Error opening `%s' for writing as a CSV file: %s." msgstr "系统文件`%s'读写错误:%s。" #: src/data/csv-file-writer.c:453 #, c-format msgid "An I/O error occurred writing CSV file `%s'." msgstr "写入CSV文件`%s'时出现读/写错误。" #: src/data/data-in.c:175 #, c-format msgid "Data is not valid as format %s: %s" msgstr "数据格式不符%s: %s" #: src/data/data-in.c:377 src/data/data-in.c:553 msgid "Field contents are not numeric." msgstr "字段内容不是数字。" #: src/data/data-in.c:379 src/data/data-in.c:555 msgid "Number followed by garbage." msgstr "数字后含无效内容。" #: src/data/data-in.c:392 msgid "Invalid numeric syntax." msgstr "数字语法无效。" #: src/data/data-in.c:400 src/data/data-in.c:571 msgid "Too-large number set to system-missing." msgstr "系统缺失数字值设置过大。" #: src/data/data-in.c:406 src/data/data-in.c:577 msgid "Too-small number set to zero." msgstr "零值设置过小。" #: src/data/data-in.c:426 msgid "All characters in field must be digits." msgstr "字段中的字符必须为数字。" #: src/data/data-in.c:445 msgid "Unrecognized character in field." msgstr "字段中含有无法识别字符。" #: src/data/data-in.c:466 src/data/data-in.c:729 msgid "Field must have even length." msgstr "字段长度须为偶数值。" #: src/data/data-in.c:468 src/data/data-in.c:732 msgid "Field must contain only hex digits." msgstr "字段只能为16进制数字。" #: src/data/data-in.c:544 msgid "Invalid zoned decimal syntax." msgstr "区位十进制数据无效。" #: src/data/data-in.c:644 src/data/data-in.c:650 msgid "Invalid syntax for P field." msgstr "P字段语法无效。" #: src/data/data-in.c:768 src/data/data-in.c:818 msgid "Syntax error in date field." msgstr "日期字段语法错误。" #: src/data/data-in.c:783 #, c-format msgid "Day (%ld) must be between 1 and 31." msgstr "日期值(%ld)须在范围1~31间。" #: src/data/data-in.c:832 msgid "Delimiter expected between fields in date." msgstr "日期字段间须有分隔符。" #: src/data/data-in.c:906 msgid "" "Unrecognized month format. Months may be specified as Arabic or Roman " "numerals or as at least 3 letters of their English names." msgstr "" "无法识别月份。可用阿拉伯数字、罗马数字或月份英文名称的至少前3个字母表示。" #: src/data/data-in.c:933 #, c-format msgid "Year (%ld) must be between 1582 and 19999." msgstr "年份(%ld)值的有效范围为1582到19999。" #: src/data/data-in.c:944 #, c-format msgid "Trailing garbage `%.*s' following date." msgstr "日期之后带有无效信息`%.*s'。" #: src/data/data-in.c:958 msgid "Julian day must have exactly three digits." msgstr "儒略日须由三位数字组成。" #: src/data/data-in.c:960 #, c-format msgid "Julian day (%ld) must be between 1 and 366." msgstr "儒略日(%ld)的取值范围为1到366。" #: src/data/data-in.c:984 #, c-format msgid "Quarter (%ld) must be between 1 and 4." msgstr "季度(%ld) 值范围为1到4." #: src/data/data-in.c:1005 #, c-format msgid "Week (%ld) must be between 1 and 53." msgstr "周数值(%ld) 范围为1到53." #: src/data/data-in.c:1017 msgid "Delimiter expected between fields in time." msgstr "时间字段间必须要有分隔符。" #: src/data/data-in.c:1037 #, c-format msgid "Minute (%ld) must be between 0 and 59." msgstr "分钟(%ld) 的范围为0到59." #: src/data/data-in.c:1075 msgid "" "Unrecognized weekday name. At least the first two letters of an English " "weekday name must be specified." msgstr "无法识别平日名称。用平日的英文至少前两位字母来表示该平日。" #: src/data/data-in.c:1210 #, c-format msgid "`%c' expected in date field." msgstr "日期字段应含有`%c'。" #: src/data/data-out.c:580 #, c-format msgid "Weekday number %f is not between 1 and 7." msgstr "表示平日的数字%f超出区间1到7。" #: src/data/data-out.c:605 #, c-format msgid "Month number %f is not between 1 and 12." msgstr "月份数字%f 超出区间1到12。" #. TRANSLATORS: this fragment will be interpolated into #. messages in fh_lock() that identify types of files. #: src/data/dataset-writer.c:66 src/language/data-io/file-handle.c:304 msgid "dataset" msgstr "数据集" #: src/data/dict-class.c:52 msgid "ordinary" msgstr "普通" #: src/data/dict-class.c:54 msgid "system" msgstr "系统" #: src/data/dict-class.c:56 msgid "scratch" msgstr "草稿" #: src/data/dictionary.c:1523 #, c-format msgid "Truncating document line to %d bytes." msgstr "将文件行截短到%d字节。" #: src/data/encrypted-file.c:89 #, c-format msgid "An error occurred while reading `%s': %s." msgstr "读取`%s'时出现错误: %s。" #: src/data/encrypted-file.c:430 #, c-format msgid "" "%s: encrypted file corrupted (ends in incomplete %u-byte ciphertext block)" msgstr "" #: src/data/encrypted-file.c:449 #, c-format msgid "%s: encrypted file corrupted (ends with bad padding)" msgstr "" #: src/data/file-handle-def.c:283 src/language/data-io/dataset.c:266 msgid "active dataset" msgstr "当前数据集" #: src/data/file-handle-def.c:518 #, c-format msgid "Can't read from %s as a %s because it is already being read as a %s." msgstr "因%s已经存在,无法将%s再次读取为%s。" #: src/data/file-handle-def.c:522 #, c-format msgid "Can't write to %s as a %s because it is already being written as a %s." msgstr "因%s已经存在,无法将%s写入为%s。" #: src/data/file-handle-def.c:529 #, c-format msgid "Can't re-open %s as a %s." msgstr "无法将%s再次打开为%s。" #: src/data/file-name.c:133 #, c-format msgid "Not opening pipe file `%s' because %s option set." msgstr "已设置%s,将不打开管道文件`%s'。" #: src/data/format.c:339 msgid "Input format" msgstr "输入格式" #: src/data/format.c:339 msgid "Output format" msgstr "输出格式" #: src/data/format.c:342 #, c-format msgid "Format %s may not be used for input." msgstr "格式%s可能无法用于输入。" #: src/data/format.c:349 #, c-format msgid "%s specifies width %d, but %s requires an even width." msgstr "%s的宽度为%d,而%s要求使用偶宽度。" #: src/data/format.c:358 #, c-format msgid "%s %s specifies width %d, but %s requires a width between %d and %d." msgstr "%s %s的宽度为%d,而%s要求的宽度范围介于%d到%d间。" #: src/data/format.c:367 #, c-format msgid "%s %s specifies %d decimal place, but %s does not allow any decimals." msgid_plural "" "%s %s specifies %d decimal places, but %s does not allow any decimals." msgstr[0] "%s %s具有%d的小数位数,而%s不允许使用小数。" #: src/data/format.c:378 #, c-format msgid "" "%s %s specifies %d decimal place, but the given width allows at most %d " "decimals." msgid_plural "" "%s %s specifies %d decimal places, but the given width allows at most %d " "decimals." msgstr[0] "%s %s 含有 %d 位小数,但其宽度最多能容纳 %d 位小数。" #: src/data/format.c:385 #, c-format msgid "" "%s %s specifies %d decimal place, but the given width does not allow for any " "decimals." msgid_plural "" "%s %s specifies %d decimal places, but the given width does not allow for " "any decimals." msgstr[0] "%s %s 含有 %d 位小数,但其宽度不允许包含小数。" #: src/data/format.c:424 #, c-format msgid "%s variables are not compatible with %s format %s." msgstr "%s变量与%s格式%s不匹配。" #: src/data/format.c:425 src/data/format.c:1074 #: src/ui/gui/var-type-dialog.ui:167 msgid "String" msgstr "字符串" #: src/data/format.c:425 src/data/format.c:1035 #: src/ui/gui/var-type-dialog.ui:48 msgid "Numeric" msgstr "数字" #: src/data/format.c:426 src/data/sys-file-reader.c:2212 #: src/data/sys-file-reader.c:2214 src/language/xforms/recode.c:512 #: src/language/xforms/recode.c:513 src/language/xforms/recode.c:525 #: src/language/xforms/recode.c:526 #: src/language/dictionary/apply-dictionary.c:77 #: src/language/dictionary/apply-dictionary.c:78 msgid "numeric" msgstr "数字" #: src/data/format.c:426 src/data/sys-file-reader.c:2212 #: src/data/sys-file-reader.c:2214 src/language/xforms/recode.c:512 #: src/language/xforms/recode.c:513 src/language/xforms/recode.c:525 #: src/language/xforms/recode.c:526 #: src/language/dictionary/apply-dictionary.c:77 #: src/language/dictionary/apply-dictionary.c:78 msgid "string" msgstr "字符串" #: src/data/format.c:444 #, c-format msgid "String variable with width %d is not compatible with format %s." msgstr "字符串变量宽度%d与格式%s不匹配。" #: src/data/format.c:1038 src/ui/gui/var-type-dialog.ui:65 msgid "Comma" msgstr "逗号" #: src/data/format.c:1041 src/ui/gui/var-type-dialog.ui:82 msgid "Dot" msgstr "点号" #: src/data/format.c:1044 msgid "Scientific" msgstr "科学" #: src/data/format.c:1061 src/ui/gui/var-type-dialog.ui:116 msgid "Date" msgstr "日期" #: src/data/format.c:1064 src/ui/gui/var-type-dialog.ui:133 msgid "Dollar" msgstr "美元" #: src/data/format.c:1071 msgid "Custom" msgstr "自定义" #: src/data/gnumeric-reader.c:478 src/data/ods-reader.c:505 #, c-format msgid "Cannot convert the value in the spreadsheet cell %s to format (%s): %s" msgstr "无法将表中单元格%s的值转换为(%s): %s格式" #: src/data/gnumeric-reader.c:502 src/data/ods-reader.c:567 #, c-format msgid "" "There was a problem whilst reading the %s file `%s' (near line %d): `%s'" msgstr "读取%s文件`%s'在行%d附近出现错误:`%s'" #: src/data/gnumeric-reader.c:597 #, c-format msgid "" "The gnumeric file `%s' is encoded as %s instead of the usual UTF-8 encoding. " "Any non-ascii characters will be incorrectly imported." msgstr "Gnumeric文件%s的为%s编码而不是UTF-8编码,非ASCII字符可能无法正确导入。" #: src/data/gnumeric-reader.c:641 src/data/ods-reader.c:682 #, c-format msgid "Invalid cell range `%s'" msgstr "无效的数据格范围`%s'" #: src/data/gnumeric-reader.c:813 src/data/ods-reader.c:710 #: src/data/ods-reader.c:843 #, c-format msgid "Selected sheet or range of spreadsheet `%s' is empty." msgstr "工作表或其选择范围`%s'为空。" #: src/data/identifier2.c:60 #, c-format msgid "Identifier `%s' exceeds %d-byte limit." msgstr "识别符`%s'超过%d字节限制。" #: src/data/identifier2.c:84 msgid "Identifier cannot be empty string." msgstr "识别符不能为空字符。" #: src/data/identifier2.c:92 #, c-format msgid "`%s' may not be used as an identifier because it is a reserved word." msgstr "`%s'为系统保留字,不能作为识别符使用。" #: src/data/identifier2.c:103 #, c-format msgid "" "`%s' may not be used as an identifier because it contains ill-formed UTF-8 " "at byte offset %tu." msgstr "`%s'在%tu字节处与UTF-8编码不符,不能作为识别符使用。" #: src/data/identifier2.c:114 #, c-format msgid "" "Character %s (in `%s') may not appear as the first character in a identifier." msgstr "不能使用`%s'中的字符%s作为识别符的第一个字符。" #: src/data/identifier2.c:126 #, c-format msgid "Character %s (in `%s') may not appear in an identifier." msgstr "`%s'中的字符%s不能用于识别符。" #: src/data/mdd-writer.c:241 #, fuzzy, c-format #| msgid "I/O error occurred writing data file `%s'." msgid "An I/O error occurred writing metadata file `%s'." msgstr "写入数据文件`%s'时发生读写错误。" #. TRANSLATORS: this fragment will be interpolated into #. messages in fh_lock() that identify types of files. #: src/data/mdd-writer.c:457 #, fuzzy #| msgid "data file" msgid "metadata file" msgstr "数据文件" #: src/data/mdd-writer.c:465 #, fuzzy, c-format #| msgid "Error opening `%s' for writing as a portable file: %s." msgid "Error opening `%s' for writing as a metadata file: %s." msgstr "将文件`%s' 打开为便携格式文件以写入时出错:%s。" #: src/data/mdd-writer.c:473 #, c-format msgid "Internal error creating xmlTextWriter. Please report this to %s." msgstr "" #: src/data/make-file.c:217 #, c-format msgid "Opening %s for writing: %s." msgstr "打开%s以写入数据:%s。" #: src/data/make-file.c:228 #, c-format msgid "Opening stream for %s: %s." msgstr "给%s打开数据流:%s。" #: src/data/make-file.c:260 #, c-format msgid "Creating temporary file to replace %s: %s." msgstr "新建临时文件以替代%s: %s。" #: src/data/make-file.c:277 #, c-format msgid "Creating temporary file %s: %s." msgstr "创建临时文件 %s: %s。" #: src/data/make-file.c:289 #, c-format msgid "Opening stream for temporary file %s: %s." msgstr "为临时文件%s打开数据流:%s。" #: src/data/make-file.c:326 #, c-format msgid "Replacing %s by %s: %s." msgstr "将%s替换为%s: %s。" #: src/data/make-file.c:354 #, c-format msgid "Removing %s: %s." msgstr "移除%s: %s。" #: src/data/mrset.c:83 #, c-format msgid "" "%s is not a valid name for a multiple response set. Multiple response set " "names must begin with `$'." msgstr "多重响应集名称%s不符合要求,多重响应集名称必须以`$'开头。" #: src/data/ods-reader.c:620 #, c-format msgid "Cannot open %s as a OpenDocument file: %s" msgstr "不能将%s以OpenDocument文件形式打开:%s" #. TRANSLATORS: this fragment will be interpolated into #. messages in fh_lock() that identify types of files. #: src/data/pc+-file-reader.c:206 msgid "SPSS/PC+ system file" msgstr "SPSS/PC+系统文件" #: src/data/pc+-file-reader.c:215 #, c-format msgid "Error opening `%s' for reading as an SPSS/PC+ system file: %s." msgstr "打开SPSS/PC+系统文件`%s'时出现错误:%s。" #: src/data/pc+-file-reader.c:224 src/data/sys-file-reader.c:3541 #, c-format msgid "%s: stat failed (%s)." msgstr "%s: 状态统计失败 (%s)." #: src/data/pc+-file-reader.c:230 #, c-format msgid "%s: file too large." msgstr "%s:文件太大。" #: src/data/pc+-file-reader.c:257 #, c-format msgid "" "Directory entry is for a %u-byte record starting at offset %u but file is " "only %u bytes long." msgstr "目录项为%u-字节记录,从偏移量%u处开始,但文件长度仅%u字节。" #: src/data/pc+-file-reader.c:275 #, c-format msgid "Directory fields have unexpected values (%u,%u)." msgstr "目录字段含有预期范围之外的值(%u, %u)。" #: src/data/pc+-file-reader.c:372 src/data/sys-file-reader.c:672 #, c-format msgid "Variable %zu" msgstr "变量 %zu" #: src/data/pc+-file-reader.c:380 src/data/sys-file-reader.c:680 #, c-format msgid "Variable %zu Label" msgstr "变量 %zu 标签" #: src/data/pc+-file-reader.c:385 #, c-format msgid "Variable %zu Value Label %zu" msgstr "变量 %zu 值标签%zu" #: src/data/pc+-file-reader.c:388 src/data/sys-file-reader.c:690 msgid "Creation Date" msgstr "创建日期" #: src/data/pc+-file-reader.c:389 src/data/sys-file-reader.c:691 msgid "Creation Time" msgstr "创建时间" #: src/data/pc+-file-reader.c:390 src/data/sys-file-reader.c:692 #: src/language/dictionary/sys-file-info.c:200 msgid "Product" msgstr "产品" #: src/data/pc+-file-reader.c:391 src/data/sys-file-reader.c:693 #: src/language/dictionary/sys-file-info.c:300 msgid "File Label" msgstr "文件标签" #: src/data/pc+-file-reader.c:427 #, c-format msgid "" "Using default encoding %s to read this SPSS/PC+ system file. For best " "results, specify an encoding explicitly. Use SYSFILE INFO with ENCODING=" "\"DETECT\" to analyze the possible encodings." msgstr "" "将使用默认的编码%s来打开SPSS/PC+系统文件。为得到最佳处理结果,请指定一个编" "码。可以使用含ENCODING=\"DETECT\"的SYSFILE INFO命令来分析文件可能使用的编码。" #: src/data/pc+-file-reader.c:483 src/data/sys-file-reader.c:890 #, c-format msgid "Error closing system file `%s': %s." msgstr "关闭系统文件时出现错误`%s': %s。" #: src/data/pc+-file-reader.c:544 msgid "This is not an SPSS/PC+ system file." msgstr "该文件不是SPSS/PC+系统文件。" #: src/data/pc+-file-reader.c:548 #, c-format msgid "Record 0 has unexpected length %u." msgstr "记录0的长度%u与预期不符。" #: src/data/pc+-file-reader.c:572 #, c-format msgid "Record 0 specifies unexpected system missing value %g (%a)." msgstr "记录0指定意外时系统缺失值%g (%a)。" #: src/data/pc+-file-reader.c:577 #, c-format msgid "Record 0 reserved fields have unexpected values (%u,%u,%u,%u,%u,%u)." msgstr "记录0的保留字段值(%u,%u,%u,%u,%u,%u)与预期不符。" #: src/data/pc+-file-reader.c:581 #, c-format msgid "Record 0 case counts differ (%u versus %u)." msgstr "记录0的个案数有差异(%u对%u)。" #: src/data/pc+-file-reader.c:585 #, c-format msgid "Invalid compression type %u." msgstr "不支持压缩类型%u。" #: src/data/pc+-file-reader.c:596 #, c-format msgid "" "Record 0 claims %u cases with %u values per case (requiring at least %zu " "bytes) but data record is only %u bytes long." msgstr "" "记录0应该包含%u个案,每个案%u个值(需至少%zu字节),但数据记录长度仅为%u字" "节。" #: src/data/pc+-file-reader.c:618 #, c-format msgid "" "Value labels claimed to end at offset %u in labels record but labels record " "is only %u bytes." msgstr "值标签在标签记录中应结束于偏移量%u处,但标签记录仅为%u字节。" #: src/data/pc+-file-reader.c:629 #, c-format msgid "" "Value labels claimed to be at offset %u with length %u but file size is only " "%u bytes." msgstr "值标签应位于偏移%u处,长度为%u,但文件大小仅为%u字节。" #: src/data/pc+-file-reader.c:656 #, c-format msgid "" "Value labels end with partial label (%u bytes left in record, label length " "%)." msgstr "值标签的末尾标签值不完整(记录尚剩余%u字节,标签长度为%)" #: src/data/pc+-file-reader.c:669 #, c-format msgid "%u leftover bytes following value labels." msgstr "值标签后有%u字节空间。" #: src/data/pc+-file-reader.c:685 #, c-format msgid "" "Variable label claimed to start at offset %u in labels record but labels " "record is only %u bytes." msgstr "变量标签在标签记录中应于偏移量%u处开始,但标签记录仅%u字节。" #: src/data/pc+-file-reader.c:697 #, c-format msgid "" "Variable label with length %u starting at offset %u in labels record " "overruns end of %u-byte labels record." msgstr "变量标签长度为%u(开始于偏移量%u处)大于标签记录的长度%u。" #: src/data/pc+-file-reader.c:719 #, c-format msgid "Record 1 has length %u (expected %u)." msgstr "记录1长度为%u(要求为%u)。" #: src/data/pc+-file-reader.c:751 #, c-format msgid "Variable %u has invalid type %." msgstr "变量%u的类型%无效。" #: src/data/pc+-file-reader.c:787 #, c-format msgid "Invalid weight index %u." msgstr "加权指数%u不符要求。" #: src/data/pc+-file-reader.c:857 #, c-format msgid "Invalid variable name `%s'." msgstr "变量名称有误`%s'。" #: src/data/pc+-file-reader.c:865 src/data/sys-file-reader.c:1444 #, c-format msgid "Renaming variable with duplicate name `%s' to `%s'." msgstr "将重复的变量名称`%s'重命名为`%s'。" #: src/data/pc+-file-reader.c:877 #, c-format msgid "Cannot weight by string variable `%s'." msgstr "字符串变量 `%s'不能用于加权操作。" #: src/data/pc+-file-reader.c:973 src/data/sys-file-reader.c:2762 msgid "File ends in partial case." msgstr "文件结束于不完整个案。" #: src/data/pc+-file-reader.c:979 #, c-format msgid "" "Case beginning at offset 0x%08x extends past end of data record at offset 0x" "%08x." msgstr "始于0x%08x处的个案长度超过数据记录末尾的偏移量0x%08x。" #: src/data/pc+-file-reader.c:998 src/data/sys-file-reader.c:2770 #, c-format msgid "Error reading case from file %s." msgstr "从文件%s读取个案时出现错误。" #: src/data/pc+-file-reader.c:1114 src/data/sys-file-reader.c:2933 #, c-format msgid "" "Possible compressed data corruption: string contains compressed integer " "(opcode %d)." msgstr "压缩数据可能已损坏:字符串含有压缩过整数(操作 %d)。" #: src/data/pc+-file-reader.c:1156 src/data/sys-file-reader.c:3234 #, c-format msgid "`%s' near offset 0x%llx: " msgstr "`%s'位于偏移量0x%llx附近:" #: src/data/pc+-file-reader.c:1159 src/data/sys-file-reader.c:3237 #, c-format msgid "`%s': " msgstr "`%s': " #: src/data/pc+-file-reader.c:1211 src/data/sys-file-reader.c:3288 #, c-format msgid "System error: %s." msgstr "系统错误:%s。" #: src/data/pc+-file-reader.c:1216 src/data/sys-file-reader.c:3293 msgid "Unexpected end of file." msgstr "文件意外结束。" #: src/data/pc+-file-reader.c:1301 src/data/sys-file-reader.c:3518 #, c-format msgid "%s: seek failed (%s)." msgstr "%s: 查找失败 (%s)." #: src/data/pc+-file-reader.c:1351 msgid "SPSS/PC+ System File" msgstr "SPSS/PC+ 系统文件" #: src/data/por-file-reader.c:109 #, c-format msgid "portable file %s corrupt at offset 0x%llx: " msgstr "便携格式%s于偏量值0x%llx:处损坏:" #: src/data/por-file-reader.c:136 #, c-format msgid "reading portable file %s at offset 0x%llx: " msgstr "打开便携格式%s,偏移量位置为0x%llx:" #: src/data/por-file-reader.c:164 #, c-format msgid "Error closing portable file `%s': %s." msgstr "关闭便携文件出错`%s': %s。" #: src/data/por-file-reader.c:216 msgid "unexpected end of file" msgstr "文件意外结束" #. TRANSLATORS: this fragment will be interpolated into #. messages in fh_lock() that identify types of files. #: src/data/por-file-reader.c:275 src/data/por-file-writer.c:147 msgid "portable file" msgstr "便携格式文件" #: src/data/por-file-reader.c:283 #, c-format msgid "" "An error occurred while opening `%s' for reading as a portable file: %s." msgstr "打开便携格式`%s'时出错:%s。" #: src/data/por-file-reader.c:304 msgid "Data record expected." msgstr "要求输入数据记录。" #: src/data/por-file-reader.c:402 msgid "Number expected." msgstr "要求输入数字。" #: src/data/por-file-reader.c:430 msgid "Missing numeric terminator." msgstr "缺少数字终止符。" #: src/data/por-file-reader.c:453 msgid "Invalid integer." msgstr "非整数。" #: src/data/por-file-reader.c:464 src/data/por-file-reader.c:484 #, c-format msgid "Bad string length %d." msgstr "字符串长度%d不符。" #: src/data/por-file-reader.c:547 #, c-format msgid "%s: Not a portable file." msgstr "%s: 不是便携格式。" #: src/data/por-file-reader.c:564 #, c-format msgid "Unrecognized version code `%c'." msgstr "版本代码`%c'无法识别。" #: src/data/por-file-reader.c:577 #, c-format msgid "Bad date string length %zu." msgstr "日期字串长度有误%zu。" #: src/data/por-file-reader.c:579 #, c-format msgid "Bad time string length %zu." msgstr "时间字串长度有误%zu。" #: src/data/por-file-reader.c:630 #, c-format msgid "" "%s: Bad format specifier byte (%d). Variable will be assigned a default " "format." msgstr "%s:指定格式字节(%d)有误,变量将使用默认格式。" #: src/data/por-file-reader.c:651 #, c-format msgid "Numeric variable %s has invalid format specifier %s." msgstr "数字变量%s的格式设置%s有误。" #: src/data/por-file-reader.c:655 #, c-format msgid "String variable %s with width %d has invalid format specifier %s." msgstr "字符串变量%s(宽度为%d)的格式设置有误%s。" #: src/data/por-file-reader.c:679 msgid "Expected variable count record." msgstr "要求变量数量记录。" #: src/data/por-file-reader.c:683 #, c-format msgid "Invalid number of variables %d." msgstr "变量数量有误%d。" #: src/data/por-file-reader.c:692 #, c-format msgid "Weight variable name (%s) truncated." msgstr "权重变量名称%s已被截短。" #: src/data/por-file-reader.c:707 msgid "Expected variable record." msgstr "要求变量记录。" #: src/data/por-file-reader.c:711 #, c-format msgid "Invalid variable width %d." msgstr "变量宽度%d有误。" #: src/data/por-file-reader.c:719 #, c-format msgid "Invalid variable name `%s' in position %d." msgstr "变量名称`%s' 在位置%d处有错误。" #: src/data/por-file-reader.c:723 src/data/sys-file-reader.c:1426 #, c-format msgid "Bad width %d for variable %s." msgstr "变量宽度%d(变量%s)有误。" #: src/data/por-file-reader.c:737 #, c-format msgid "Duplicate variable name %s in position %d renamed to %s." msgstr "重复变量名%s(位于%d),更名为%s。" #: src/data/por-file-reader.c:786 #, c-format msgid "Weighting variable %s not present in dictionary." msgstr "字典中权重变量%s不存在。" #: src/data/por-file-reader.c:830 #, c-format msgid "Unknown variable %s while parsing value labels." msgstr "变量%s在标签值中不存在。" #: src/data/por-file-reader.c:833 #, c-format msgid "" "Cannot assign value labels to %s and %s, which have different variable types." msgstr "由于变量类型不同,不能将标签值赋与%s和%s。" #: src/data/por-file-reader.c:972 msgid "SPSS Portable File" msgstr "SPSS便携格式文件" #: src/data/por-file-writer.c:139 #, c-format msgid "Invalid decimal digits count %d. Treating as %d." msgstr "小数位数%d有误,视为%d处理。" #: src/data/por-file-writer.c:159 #, c-format msgid "Error opening `%s' for writing as a portable file: %s." msgstr "将文件`%s' 打开为便携格式文件以写入时出错:%s。" #: src/data/por-file-writer.c:505 #, c-format msgid "An I/O error occurred writing portable file `%s'." msgstr "写入便携格式时出现I/O错误:`%s' 。" #: src/data/psql-reader.c:48 msgid "" "Support for reading postgres databases was not compiled into this " "installation of PSPP" msgstr "PSPP没有安装Postgres数据库读取模块" #: src/data/psql-reader.c:242 msgid "Memory error whilst opening psql source" msgstr "打开psql源时发生内存错误" #: src/data/psql-reader.c:248 #, c-format msgid "Error opening psql source: %s." msgstr "打开psql源时出现错误:%s。" #: src/data/psql-reader.c:263 #, c-format msgid "" "Postgres server is version %s. Reading from versions earlier than 8.0 is not " "supported." msgstr "Postgres服务器版本为%s,不支持从8.0以前版本读取数据。" #: src/data/psql-reader.c:283 msgid "" "Connection is unencrypted, but unencrypted connections have not been " "permitted." msgstr "不允许未加密的连接。" #: src/data/psql-reader.c:324 src/data/psql-reader.c:349 #: src/data/psql-reader.c:359 #, c-format msgid "Error from psql source: %s." msgstr "psql源错误:%s。" #: src/data/psql-reader.c:454 #, c-format msgid "Unsupported OID %d. SYSMIS values will be inserted." msgstr "未支持的OID值%d。将使用SYSMIS值来代替。" #: src/data/settings.c:391 msgid "" "MXWARNS set to zero. No further warnings will be given even when " "potentially problematic situations are encountered." msgstr "MXWARNS设置为零。当出现问题时将不再提示警告信息。" #: src/data/settings.c:398 #, c-format msgid "" "Warnings re-enabled. %d warnings will be issued before aborting syntax " "processing." msgstr "警告信息已激活,在放弃语法处理前将提示%d警告信息。" #: src/data/settings.c:618 #, c-format msgid "" "%s: Custom currency string `%s' does not contain exactly three periods or " "commas (or it contains both)." msgstr "" "%s: 自定义货币字符 `%s' 未包含正好三个句号或逗号(或同时含有句号和逗号)。" #. TRANSLATORS: this fragment will be interpolated into #. messages in fh_lock() that identify types of files. #: src/data/sys-file-reader.c:407 src/data/sys-file-writer.c:245 msgid "system file" msgstr "系统文件" #: src/data/sys-file-reader.c:414 #, c-format msgid "Error opening `%s' for reading as a system file: %s." msgstr "打开系统文件`%s'时出现错误:%s。" #: src/data/sys-file-reader.c:491 msgid "Misplaced type 4 record." msgstr "类型4记录错位。" #: src/data/sys-file-reader.c:496 msgid "Duplicate type 6 (document) record." msgstr "类型6(文档)记录重复。" #: src/data/sys-file-reader.c:506 src/data/sys-file-reader.c:1343 #, c-format msgid "" "Unrecognized record type 7, subtype %d. For help, please send this file to " "%s and mention that you were using %s." msgstr "" "记录类型7无法识别,子类型为%d。若需帮助,请将这个文件发送到%s并注明您在使" "用%s。" #: src/data/sys-file-reader.c:526 #, c-format msgid "" "Record type 7, subtype %d found here has the same type as the record found " "near offset 0x%llx. For help, please send this file to %s and mention that " "you were using %s." msgstr "" "此处子类型%d的记录类型7与偏移量 0x%llx处的记录为同一类型。若需帮助,请将这个" "文件发送到%s并注明您在使用%s。" #: src/data/sys-file-reader.c:538 #, c-format msgid "Unrecognized record type %d." msgstr "记录类型%d无法识别。" #: src/data/sys-file-reader.c:688 #, c-format msgid "Value Label %zu" msgstr "变量标签 %zu" #: src/data/sys-file-reader.c:697 msgid "Extra Product Info" msgstr "更多产品信息" #: src/data/sys-file-reader.c:710 #, c-format msgid "Document Line %zu" msgstr "文件行%zu" #: src/data/sys-file-reader.c:718 #, c-format msgid "MRSET %zu" msgstr "多重响应集(MRSET) %zu" #: src/data/sys-file-reader.c:720 #, c-format msgid "MRSET %zu Label" msgstr "多重响应集(MRSET) %zu 标签" #: src/data/sys-file-reader.c:725 #, c-format msgid "MRSET %zu Counted Value" msgstr "多重响应集(MRSET)%zu 数量" #: src/data/sys-file-reader.c:763 #, c-format msgid "" "This system file does not indicate its own character encoding. Using " "default encoding %s. For best results, specify an encoding explicitly. Use " "SYSFILE INFO with ENCODING=\"DETECT\" to analyze the possible encodings." msgstr "" "该系统文件没有字符编码信息。将使用默认的编码%s。为得到最佳处理结果,请指定一" "个编码。可以使用含ENCODING=\"DETECT\"的SYSFILE INFO命令来分析文件可能使用的编" "码。" #: src/data/sys-file-reader.c:845 #, c-format msgid "File header claims %d variable positions but %zu were read from file." msgstr "文件头指定%d变量位置,而文件中实际读取到%zu。" #: src/data/sys-file-reader.c:958 src/data/sys-file-reader.c:972 msgid "This is not an SPSS system file." msgstr "该文件不是SPSS系统文件。" #: src/data/sys-file-reader.c:1027 msgid "" "Compression bias is not the usual value of 100, or system file uses " "unrecognized floating-point format." msgstr "压缩偏值不是常用的100,系统文件可能使用了无法识别的浮点格式。" #: src/data/sys-file-reader.c:1102 msgid "Variable label indicator field is not 0 or 1." msgstr "变量标签指示字段值非0或1。" #: src/data/sys-file-reader.c:1115 msgid "Numeric missing value indicator field is not -3, -2, 0, 1, 2, or 3." msgstr "数字缺失指示字段值不在下列值中: -3, -2, 0, 1, 2, 3。" #: src/data/sys-file-reader.c:1125 msgid "String missing value indicator field is not 0, 1, 2, or 3." msgstr "字符串缺失值提示字段不等于下列任一值:0, 1, 2, 3。" #: src/data/sys-file-reader.c:1152 #, c-format msgid "Invalid number of labels %u." msgstr "标签数量有误%u。" #: src/data/sys-file-reader.c:1185 msgid "" "Variable index record (type 4) does not immediately follow value label " "record (type 3) as it should." msgstr "变量索引记录(类型4)没有按照要求紧接于变量值的标签记录(类型3)之后。" #: src/data/sys-file-reader.c:1197 #, c-format msgid "" "Number of variables associated with a value label (%u) is not between 1 and " "the number of variables (%zu)." msgstr "与变量值标签(%u)相对应的变量数量没有处于范围1和变量数目(%zu)之间。" #: src/data/sys-file-reader.c:1224 #, c-format msgid "Number of document lines (%d) must be greater than 0 and less than %d." msgstr "文件的行数(%d)必须大于0且小于%d。" #: src/data/sys-file-reader.c:1317 #, c-format msgid "Record type 7, subtype %d has bad size %u (expected %d)." msgstr "变量类型7的亚类型%d大小%u有误(要求为%d)。" #: src/data/sys-file-reader.c:1321 #, c-format msgid "Record type 7, subtype %d has bad count %u (expected %d)." msgstr "变量类型7的亚类型%d数量%u有误(要求%d)。" #: src/data/sys-file-reader.c:1435 #, fuzzy, c-format #| msgid "Renaming variable with duplicate name `%s' to `%s'." msgid "Renaming variable with invalid name `%s' to `%s'." msgstr "将重复的变量名称`%s'重命名为`%s'。" #: src/data/sys-file-reader.c:1517 msgid "Missing string continuation record." msgstr "缺少字符串连续记录。" #: src/data/sys-file-reader.c:1550 #, c-format msgid "Variable %s with width %d has invalid print format 0x%x." msgstr "变量%s(宽度%d)输出格式有误0x%x。" #: src/data/sys-file-reader.c:1554 #, c-format msgid "Variable %s with width %d has invalid write format 0x%x." msgstr "变量%s(宽度为%d)的写入格式有误0x%x。" #: src/data/sys-file-reader.c:1559 msgid "Suppressing further invalid format warnings." msgstr "不再提示错误格式。" #: src/data/sys-file-reader.c:1613 #, c-format msgid "" "Floating-point representation indicated by system file (%d) differs from " "expected (%d)." msgstr "系统文件(%d)提供的浮点格式与要求的格式(%d)不同。" #: src/data/sys-file-reader.c:1629 #, c-format msgid "" "Integer format indicated by system file (%d) differs from expected (%d)." msgstr "系统文件(%d)提供的整数格式与要求的格式(%d)不同。" #: src/data/sys-file-reader.c:1647 src/data/sys-file-reader.c:1653 #, c-format msgid "File specifies unexpected value %g (%a) as %s, instead of %g (%a)." msgstr "文件指定的值%g (%a)为%s,与要求的%g (%a)不一致。" #: src/data/sys-file-reader.c:1662 #, c-format msgid "" "File specifies unexpected value %g (%a) as %s, instead of %g (%a) or %g (%a)." msgstr "文件指定的值%g (%a)为%s,与要求的%g (%a)或%g (%a)不一致。" #: src/data/sys-file-reader.c:1714 src/data/sys-file-reader.c:1733 #, c-format msgid "Missing space following `%c' at offset %zu in MRSETS record." msgstr "多重响应数据集(MRSETS)在`%c'后 缺少空格,该处的偏移量为%zu。" #: src/data/sys-file-reader.c:1741 #, fuzzy, c-format #| msgid "" #| "Unexpected label source value following `E' at offset %zu in MRSETS " #| "record." msgid "" "Missing label source value following `E' at offset %zu in MRSETS record." msgstr "多重响应数据集(MRSETS)的`E'之后标签源值与要求不符,该处的偏移量为%zu。" #: src/data/sys-file-reader.c:1748 #, c-format msgid "" "Unexpected label source value following `E' at offset %zu in MRSETS record." msgstr "多重响应数据集(MRSETS)的`E'之后标签源值与要求不符,该处的偏移量为%zu。" #: src/data/sys-file-reader.c:1755 #, c-format msgid "Missing `C', `D', or `E' at offset %zu in MRSETS record." msgstr "多重响应数据集(MRSETS)缺少`C', `D' 或 `E',该处的偏移量为%zu。" #: src/data/sys-file-reader.c:1782 #, c-format msgid "Missing new-line parsing variable names at offset %zu in MRSETS record." msgstr "多重响应数据集(MRSETS)在偏移量%zu处缺少换行解析变量名称。" #: src/data/sys-file-reader.c:1817 #, c-format msgid "Invalid multiple response set name `%s'." msgstr "多重响应集名称%s无效。" #: src/data/sys-file-reader.c:1850 #, c-format msgid "MRSET %s contains duplicate variable name %s." msgstr "多重响应数据集(MRSETS)%s含有重复的变量名称%s。" #: src/data/sys-file-reader.c:1865 #, c-format msgid "MRSET %s contains both string and numeric variables." msgstr "多重响应数据集(MRSETS)%s同时含有字符串变量和数字变量。" #: src/data/sys-file-reader.c:1877 #, c-format msgid "MRSET %s has no variables." msgstr "多重响应数据集(MRSETS)%s中没有变量。" #: src/data/sys-file-reader.c:1879 #, c-format msgid "MRSET %s has only one variable." msgstr "多重响应数据集(MRSETS)%s只有一个变量。" #: src/data/sys-file-reader.c:1923 #, c-format msgid "Extension 11 has bad count %u (for %zu variables)." msgstr "扩展11数量%u有误(共%zu个变量)。" #: src/data/sys-file-reader.c:1956 #, c-format msgid "" "Invalid variable display parameters for variable %zu (%s). Default " "parameters substituted." msgstr "变量 %zu (%s)的显示参数有误,使用默认参数代替。" #: src/data/sys-file-reader.c:2000 #, c-format msgid "Duplicate long variable name `%s'." msgstr "长变量名`%s'重复。" #: src/data/sys-file-reader.c:2053 #, c-format msgid "Long variable mapping from %s to invalid variable name `%s'." msgstr "将%s用长变量映射为不合语法的`%s'。" #: src/data/sys-file-reader.c:2088 #, c-format msgid "%s listed as string of invalid length %s in very long string record." msgstr "超长字符串记录中的字符串%s的长度%s有误。" #: src/data/sys-file-reader.c:2099 #, c-format msgid "" "%s listed in very long string record with width %s, which requires only one " "segment." msgstr "%s作为宽度为%s的非常长字符串记录列出,而该宽度仅需一个节段。" #: src/data/sys-file-reader.c:2107 #, c-format msgid "Very long string %s overflows dictionary." msgstr "长字符串%s溢出字典。" #: src/data/sys-file-reader.c:2125 #, c-format msgid "" "Very long string with width %ld has segment %d of width %d (expected %d)." msgstr "宽度%ld的长字符串具节段%d,宽度为%d(预期为%d)。" #: src/data/sys-file-reader.c:2183 #, fuzzy, c-format #| msgid "Variable index %d not in valid range 1...%zu." msgid "Value label variable index %d not in valid range 1...%zu." msgstr "变量索引%d的超出有效范围1...%zu。" #: src/data/sys-file-reader.c:2193 #, fuzzy, c-format #| msgid "Variable index %d refers to long string continuation." msgid "Value label variable index %d refers to long string continuation." msgstr "变量索引%d指向长字符串连续性。" #: src/data/sys-file-reader.c:2208 #, c-format msgid "" "Variables associated with value label are not all of identical type. " "Variable %s is %s, but variable %s is %s." msgstr "变量与相应的标签值类型不一致。变量%s为%s,而变量%s为%s。" #: src/data/sys-file-reader.c:2226 #, c-format msgid "" "Value labels may not be added to long string variables (e.g. %s) using " "records types 3 and 4." msgstr "值标签可能无法使用记录类型3和4添加到长字串变量(例如:%s)中。" #: src/data/sys-file-reader.c:2255 #, c-format msgid "Duplicate value label for %g on %s." msgstr "值标签%g于%s上重复。" #: src/data/sys-file-reader.c:2260 src/data/sys-file-reader.c:2600 #, c-format msgid "Duplicate value label for `%.*s' on %s." msgstr "值标签`%.*s'于%s上重复。" #: src/data/sys-file-reader.c:2283 #, fuzzy, c-format #| msgid "Suppressed %d additional related warnings." msgid "Suppressed %d additional warnings for value labels." msgstr "%d的相关警告没有显示。" #: src/data/sys-file-reader.c:2297 #, fuzzy, c-format #| msgid "Variable index %d not in valid range 1...%zu." msgid "" "Weight variable index %d not in valid range 1...%zu. Treating file as " "unweighted." msgstr "变量索引%d的超出有效范围1...%zu。" #: src/data/sys-file-reader.c:2307 #, fuzzy, c-format #| msgid "Variable index %d refers to long string continuation." msgid "" "Weight variable index %d refers to long string continuation. Treating file " "as unweighted." msgstr "变量索引%d指向长字符串连续性。" #: src/data/sys-file-reader.c:2315 #, c-format msgid "Ignoring string variable `%s' set as weighting variable." msgstr "忽略作为权重变量的字符串变量`%s'。" #: src/data/sys-file-reader.c:2352 #, c-format msgid "Error parsing attribute value %s[%d]." msgstr "特征值解析错误%s[%d]。" #: src/data/sys-file-reader.c:2366 #, c-format msgid "Attribute value %s[%d] is not quoted: %s." msgstr "特征值%s[%d]没有被引用:%s。" #: src/data/sys-file-reader.c:2379 #, c-format msgid "Duplicate attribute %s." msgstr "特征%s重复。" #: src/data/sys-file-reader.c:2463 #, c-format msgid "Invalid role for variable %s." msgstr "变量%s角色错误。" #: src/data/sys-file-reader.c:2472 #, c-format msgid "%zu other variables had invalid roles." msgstr "%zu的其他变量角色无效。" #: src/data/sys-file-reader.c:2485 #, c-format msgid "Extension record subtype %d ends unexpectedly." msgstr "扩展变量子类型%d意外结束。" #: src/data/sys-file-reader.c:2531 #, c-format msgid "Ignoring long string value label record for unknown variable %s." msgstr "未知变量%s,忽略长字串值标签记录。" #: src/data/sys-file-reader.c:2536 #, c-format msgid "Ignoring long string value label record for numeric variable %s." msgstr "忽略数字变量%s的长字串值标签记录。" #: src/data/sys-file-reader.c:2543 #, c-format msgid "" "Ignoring long string value label record for variable %s because the record's " "width (%d) does not match the variable's width (%d)." msgstr "忽略变量%s的长字串值标签记录,因其宽度(%d)与变量宽度(%d)不符。" #: src/data/sys-file-reader.c:2573 #, c-format msgid "" "Ignoring long string value label %zu for variable %s, with width %d, that " "has bad value width %zu." msgstr "忽略长字串值标签%zu,因变量%s(宽度%d)变量宽度%zu不正确。" #: src/data/sys-file-reader.c:2646 #, c-format msgid "" "Long string missing values record says variable %s has %d missing values, " "but only 1 to 3 missing values are allowed." msgstr "长字符串缺失值记录显示变量%s有%d个缺失值,而系统只允许1至3个缺失值。" #: src/data/sys-file-reader.c:2656 #, c-format msgid "Ignoring long string missing value record for unknown variable %s." msgstr "忽略未知变量%s的长字符串缺失值记录。" #: src/data/sys-file-reader.c:2661 #, c-format msgid "Ignoring long string missing value record for numeric variable %s." msgstr "忽略数字变量%s的长字符串缺失值记录。" #: src/data/sys-file-reader.c:2686 #, c-format msgid "" "Ignoring long string missing value %zu for variable %s, with width %d, that " "has bad value width %zu." msgstr "忽略长字串值标签%zu,因变量%s(宽度%d)变量宽度%zu不正确。" #: src/data/sys-file-reader.c:2740 msgid "File ends in partial string value." msgstr "文件结束于不完整字符串值。" #: src/data/sys-file-reader.c:2879 msgid "" "Possible compressed data corruption: compressed spaces appear in numeric " "field." msgstr "压缩的数据可能已损坏:压缩空间出现于数字字段。" #: src/data/sys-file-reader.c:3030 #, c-format msgid "Suppressed %d additional related warnings." msgstr "%d的相关警告没有显示。" #: src/data/sys-file-reader.c:3076 src/data/sys-file-reader.c:3093 #, c-format msgid "Dictionary record refers to unknown variable %s." msgstr "字典记录指向未知变量%s。" #: src/data/sys-file-reader.c:3159 #, c-format msgid "Expecting digit at offset %zu in MRSETS record." msgstr "多重响应记录在偏移量%zu处应为数字。" #: src/data/sys-file-reader.c:3167 #, c-format msgid "Expecting space at offset %zu in MRSETS record." msgstr "多重响应记录在偏移量%zu处应为空格。" #: src/data/sys-file-reader.c:3175 #, c-format msgid "%zu-byte string starting at offset %zu exceeds record length %zu." msgstr "%zu字节的字符串从偏移量%zu开始处超过记录长度%zu。" #: src/data/sys-file-reader.c:3185 #, c-format msgid "Expecting space at offset %zu following %zu-byte string." msgstr "偏移量%zu处应为紧接于%zu-字节字符串后的空格。" #: src/data/sys-file-reader.c:3476 #, c-format msgid "Wrong ZLIB data header offset %#llx (expected %#llx)." msgstr "ZLIB数据头偏移错误%#llx(应为%#llx)." #: src/data/sys-file-reader.c:3484 #, c-format msgid "Impossible ZLIB trailer offset 0x%llx." msgstr "错误的ZLIB尾端偏移0x%llx." #: src/data/sys-file-reader.c:3491 #, c-format msgid "Invalid ZLIB trailer length %lld." msgstr "ZLIB尾端长度错误%lld." #: src/data/sys-file-reader.c:3555 #, c-format msgid "End of ZLIB trailer (0x%llx) is not file size (0x%llx)." msgstr "ZLIB尾端(0x%llx)结束处不是文件大小(0x%llx)." #: src/data/sys-file-reader.c:3565 #, c-format msgid "ZLIB trailer bias (%lld) differs from file header bias (%.2f)." msgstr "ZLIB尾端偏量(%lld)与文件头偏量(%.2f)不符。" #: src/data/sys-file-reader.c:3575 #, c-format msgid "ZLIB trailer \"zero\" field has nonzero value %lld." msgstr "ZLIB尾端\"zero\"字段含有非零值%lld。" #: src/data/sys-file-reader.c:3581 #, c-format msgid "ZLIB trailer specifies unexpected %u-byte block size." msgstr "ZLIB尾端含有不符合要求的%u字节块。" #: src/data/sys-file-reader.c:3589 #, c-format msgid "%lld-byte ZLIB trailer specifies %u data blocks (expected %lld)." msgstr "ZLIB尾端%lld-字节含有%u数据块(应该为%lld)。" #: src/data/sys-file-reader.c:3614 #, c-format msgid "" "ZLIB block descriptor %u reported uncompressed data offset %#llx, when %#llx " "was expected." msgstr "ZLIB块描述%u发现%#llx的未压缩数据偏移,应该为%#llx。" #: src/data/sys-file-reader.c:3623 #, c-format msgid "" "ZLIB block descriptor %u reported compressed data offset %#llx, when %#llx " "was expected." msgstr "ZLIB块描述%u发现%#llx的压缩数据偏移,应该为%#llx。" #: src/data/sys-file-reader.c:3633 #, c-format msgid "" "ZLIB block descriptor %u reported block size %#x, when %#x was expected." msgstr "ZLIB块描述%u的区块尺寸为%#x,应该为%#x。" #: src/data/sys-file-reader.c:3641 #, c-format msgid "" "ZLIB block descriptor %u reported block size %#x, when at most %#x was " "expected." msgstr "ZLIB块描述%u的区块尺寸为%#x,而最大值为%#x。" #: src/data/sys-file-reader.c:3653 #, c-format msgid "" "ZLIB block descriptor %u reports compressed size %u and uncompressed size %u." msgstr "ZLIB块描述%u中的压缩尺寸为%u,未压缩尺寸为%u。" #: src/data/sys-file-reader.c:3665 #, c-format msgid "" "ZLIB trailer is at offset %#llx but %#llx would be expected from block " "descriptors." msgstr "ZLIB尾端位于偏移量%#llx处,根据区块描述其大小应为%#llx。" #: src/data/sys-file-reader.c:3684 #, c-format msgid "ZLIB initialization failed (%s)." msgstr "ZLIB初始化失败(%s)。" #: src/data/sys-file-reader.c:3699 #, c-format msgid "Inconsistency at end of ZLIB stream (%s)." msgstr "ZLIB流结束处数据前后矛盾(%s)。" #: src/data/sys-file-reader.c:3758 #, c-format msgid "ZLIB stream inconsistency (%s)." msgstr "ZLIB流数据前后矛盾(%s)。" #: src/data/sys-file-reader.c:3782 msgid "Unexpected end of ZLIB compressed data." msgstr "ZLIB压缩数据结束处不符要求。" #: src/data/sys-file-reader.c:3820 msgid "SPSS System File" msgstr "SPSS系统文件" #: src/data/sys-file-writer.c:210 #, c-format msgid "Unknown system file version %d. Treating as version %d." msgstr "未知系统文件版本%d。将其作为版本%d处理。" #: src/data/sys-file-writer.c:256 #, c-format msgid "Error opening `%s' for writing as a system file: %s." msgstr "系统文件`%s'读写错误:%s。" #: src/data/sys-file-writer.c:1271 #, c-format msgid "An I/O error occurred writing system file `%s'." msgstr "写入系统文件显示出现输入/输出错误`%s'。" #: src/data/sys-file-writer.c:1378 #, c-format msgid "Failed to initialize ZLIB for compression (%s)." msgstr "ZLIB压缩初始化失败(%s)。" #: src/data/sys-file-writer.c:1407 #, c-format msgid "Failed to complete ZLIB stream compression (%s)." msgstr "无法完成ZLIB流压缩(%s)。" #: src/data/sys-file-writer.c:1449 #, c-format msgid "ZLIB stream compression failed (%s)." msgstr "ZLIB流压缩失败(%s)。" #: src/data/sys-file-writer.c:1491 #, c-format msgid "%s: Seek failed (%s)." msgstr "%s: 查找失败(%s)。" #: src/data/variable.c:58 msgid "Left" msgstr "左" #: src/data/variable.c:59 msgid "Right" msgstr "右" #: src/data/variable.c:60 msgid "Center" msgstr "中心" #: src/data/variable.c:66 msgid "Nominal" msgstr "名称上" #: src/data/variable.c:67 msgid "Ordinal" msgstr "顺序上" #: src/data/variable.c:68 src/language/stats/ks-one-sample.c:300 msgid "Scale" msgstr "比例" #: src/data/variable.c:74 msgid "Input" msgstr "输入" #. TRANSLATORS: This will be part of a filename. Please avoid whitespace. #: src/data/variable.c:75 src/output/spv/spv-writer.c:213 #: src/ui/gui/psppire-output-window.c:547 msgid "Output" msgstr "输出" #: src/data/variable.c:76 msgid "Both" msgstr "同时" #: src/data/variable.c:77 src/language/dictionary/sys-file-info.c:237 #: src/ui/gui/psppire-dialog-action-crosstabs.c:86 #: src/ui/gui/psppire-dialog-action-crosstabs.c:98 #: src/ui/gui/psppire-dialog-action-crosstabs.c:133 #: src/ui/gui/psppire-dialog-action-crosstabs.c:141 #: src/ui/gui/psppire-variable-sheet.c:408 src/ui/gui/var-display.c:34 msgid "None" msgstr "无" #: src/data/variable.c:78 msgid "Partition" msgstr "划分" #: src/data/variable.c:79 src/ui/gui/reliability.ui:37 msgid "Split" msgstr "切割" #: src/data/variable.c:729 #, c-format msgid "%s (%s)" msgstr "%s (%s)" #: src/data/variable.c:1339 msgid "" "At least one case in the data file had a weight value that was user-missing, " "system-missing, zero, or negative. These case(s) were ignored." msgstr "数据文件中至少有一个个案因其权重值缺失或小于等于零而被忽略。" #: src/language/command.c:207 src/language/stats/graph.c:749 #: src/language/stats/graph.c:755 src/language/stats/graph.c:789 #: src/language/stats/graph.c:794 src/language/stats/graph.c:799 #: src/language/stats/graph.c:852 src/language/stats/graph.c:857 #: src/language/stats/graph.c:862 src/language/stats/graph.c:867 #: src/language/stats/graph.c:872 src/language/stats/graph.c:877 #: src/language/stats/graph.c:882 src/language/utilities/set.q:236 #, c-format msgid "%s is not yet implemented." msgstr "%s尚未实现。" #: src/language/command.c:212 #, c-format msgid "%s may be used only in testing mode." msgstr "%s可能仅用于测试模式。" #: src/language/command.c:217 #, c-format msgid "%s may be used only in enhanced syntax mode." msgstr "%s可能仅用于增强语法模式。" #: src/language/command.c:345 msgid "expecting command name" msgstr "输入指令名称" #: src/language/command.c:347 #, c-format msgid "Unknown command `%s'." msgstr "未知指令`%s'。" #: src/language/command.c:380 #, c-format msgid "%s is allowed only before the active dataset has been defined." msgstr "%s操作仅可在选定数据集之前进行。" #: src/language/command.c:384 #, c-format msgid "%s is allowed only after the active dataset has been defined." msgstr "%s操作仅可在选定数据集之后进行。" #: src/language/command.c:388 src/language/command.c:392 #, c-format msgid "%s is allowed only inside %s." msgstr "%s操作仅可在%s内进行。" #: src/language/command.c:399 src/language/command.c:403 #, c-format msgid "" "%s is allowed only before the active dataset has been defined or inside %s." msgstr "%s操作仅可在选定数据集之前或%s内进行。" #: src/language/command.c:407 src/language/command.c:411 #, c-format msgid "" "%s is allowed only after the active dataset has been defined or inside %s." msgstr "%s操作仅可在选定数据集之后或%s内进行。" #: src/language/command.c:415 #, c-format msgid "%s is allowed only inside %s or inside %s." msgstr "%s操作仅可在%s或%s内进行。" #: src/language/command.c:421 #, c-format msgid "" "%s is allowed only after the active dataset has been defined, inside INPUT " "PROGRAM, or inside FILE TYPE." msgstr "%s操作仅可在选定数据集之后或INPUT PROGRAM、FILE TYPE之内进行。" #: src/language/command.c:426 #, c-format msgid "" "%s is allowed only before the active dataset has been defined, inside INPUT " "PROGRAM, or inside FILE TYPE." msgstr "%s操作仅可在选定数据集之前或INPUT PROGRAM、FILE TYPE之内进行。" #: src/language/command.c:444 src/language/command.c:447 #, c-format msgid "%s is not allowed inside %s." msgstr "%s操作不能于%s内进行。" #: src/language/command.c:529 src/language/utilities/host.c:272 #: src/language/utilities/permissions.c:105 #, c-format msgid "This command not allowed when the %s option is set." msgstr "当设置%s选项后不能运行此命令。" #: src/language/command.c:545 #, c-format msgid "Error removing `%s': %s." msgstr "移除`%s'时出现错误: %s。" #: src/language/lexer/lexer.c:296 #, c-format msgid "expecting %s" msgstr "要求%s" #: src/language/lexer/lexer.c:300 #, c-format msgid "expecting %s or %s" msgstr "要求%s或%s" #: src/language/lexer/lexer.c:304 #, c-format msgid "expecting %s, %s, or %s" msgstr "要求%s、%s或%s" #: src/language/lexer/lexer.c:309 #, c-format msgid "expecting %s, %s, %s, or %s" msgstr "要求%s、%s、%s或%s" #: src/language/lexer/lexer.c:314 #, c-format msgid "expecting %s, %s, %s, %s, or %s" msgstr "要求%s、%s、%s、%s或%s" #: src/language/lexer/lexer.c:319 #, c-format msgid "expecting %s, %s, %s, %s, %s, or %s" msgstr "要求%s、%s、%s、%s、%s或%s" #: src/language/lexer/lexer.c:325 #, c-format msgid "expecting %s, %s, %s, %s, %s, %s, or %s" msgstr "要求%s、%s、%s、%s、%s、%s或%s" #: src/language/lexer/lexer.c:331 #, c-format msgid "expecting %s, %s, %s, %s, %s, %s, %s, or %s" msgstr "要求%s、%s、%s、%s、%s、%s、%s或%s" #: src/language/lexer/lexer.c:351 #, c-format msgid "Subcommand %s may only be specified once." msgstr "子命令%s可能被多次指定。" #: src/language/lexer/lexer.c:363 #, c-format msgid "Required subcommand %s was not specified." msgstr "必须使用的子命令%s没有指定。" #: src/language/lexer/lexer.c:371 #, c-format msgid "%s may only be specified once within subcommand %s" msgstr "%s仅可在子命令%s下设定一次" #: src/language/lexer/lexer.c:380 #, c-format msgid "Required %s specification missing from %s subcommand" msgstr "缺少%s,为子命令%s要求必需设定" #: src/language/lexer/lexer.c:399 msgid "Syntax error at end of input" msgstr "输入结尾处语法错误" #: src/language/lexer/lexer.c:420 src/language/xforms/select-if.c:60 #: src/language/stats/autorecode.c:206 src/language/stats/npar.c:503 #: src/language/data-io/print-space.c:83 msgid "expecting end of command" msgstr "要求结束指令" #: src/language/lexer/lexer.c:631 msgid "expecting string" msgstr "要求字符串" #: src/language/lexer/lexer.c:660 msgid "expecting integer" msgstr "要求整数" #: src/language/lexer/lexer.c:673 msgid "expecting number" msgstr "要求数字" #: src/language/lexer/lexer.c:685 msgid "expecting identifier" msgstr "要求识别符" #: src/language/lexer/lexer.c:1272 msgid "Syntax error at end of command" msgstr "指令结尾处语法错误" #: src/language/lexer/lexer.c:1281 #, c-format msgid "Syntax error at `%s'" msgstr "`%s'处出现语法错误" #: src/language/lexer/lexer.c:1284 msgid "Syntax error" msgstr "语法错误" #: src/language/lexer/lexer.c:1470 #, c-format msgid "String of hex digits has %d characters, which is not a multiple of 2" msgstr "16进制字符长度%d不是2的倍数" #: src/language/lexer/lexer.c:1477 #, c-format msgid "`%c' is not a valid hex digit" msgstr "`%c'不是有效的16进制数字" #: src/language/lexer/lexer.c:1482 #, c-format msgid "" "Unicode string contains %d bytes, which is not in the valid range of 1 to 8 " "bytes" msgstr "%d字节的Unicode字符串超出1到8字节的有效范围" #: src/language/lexer/lexer.c:1488 #, c-format msgid "U+%04X is not a valid Unicode code point" msgstr "U+%04X不是正确的Unicode输入码" #: src/language/lexer/lexer.c:1493 msgid "Unterminated string constant" msgstr "字符串常量尚未结束" #: src/language/lexer/lexer.c:1497 #, c-format msgid "Missing exponent following `%s'" msgstr "`%s'后缺少组件" #: src/language/lexer/lexer.c:1502 msgid "Unexpected `.' in middle of command" msgstr "指令中的`.'不符合要求" #: src/language/lexer/lexer.c:1508 #, c-format msgid "Bad character %s in input" msgstr "输入含有无效字符%s" #: src/language/lexer/lexer.c:1603 #, c-format msgid "Opening `%s': %s." msgstr "正在打开 `%s': %s。" #: src/language/lexer/lexer.c:1647 #, c-format msgid "Error closing `%s': %s." msgstr "关闭时出错`%s': %s。" #: src/language/lexer/subcommand-list.c:118 #, c-format msgid "No more than %d %s subcommands allowed." msgstr "子命令不能超过%d %s。" #: src/language/lexer/format-parser.c:77 msgid "expecting valid format specifier" msgstr "要求有效的格式设定" #: src/language/lexer/format-parser.c:116 #: src/language/lexer/format-parser.c:143 src/language/utilities/output.c:108 #: src/language/data-io/data-list.c:453 src/language/data-io/get-data.c:638 #: src/language/data-io/placement-parser.c:236 #, c-format msgid "Unknown format type `%s'." msgstr "未知的格式类型`%s'。" #: src/language/lexer/format-parser.c:122 #, c-format msgid "Format specifier `%s' lacks required width." msgstr "格式设定`%s'必需设定宽度。" #: src/language/lexer/format-parser.c:138 msgid "expecting format type" msgstr "要求格式类型" #: src/language/lexer/value-parser.c:66 #, c-format msgid "" "The high end of the range (%.*g) is below the low end (%.*g). The range " "will be treated as if reversed." msgstr "区间上界值(%.*g)低于下界值(%.*g),视为反转区间处理。" #: src/language/lexer/value-parser.c:74 #, c-format msgid "Ends of range are equal (%.*g)." msgstr "区界上下界相同(%.*g)。" #: src/language/lexer/value-parser.c:82 #, c-format msgid "%s or %s must be part of a range." msgstr "%s或%s必需处在区间内。" #: src/language/lexer/value-parser.c:112 msgid "System-missing value is not valid here." msgstr "系统缺失值于此处无效。" #: src/language/lexer/variable-parser.c:86 utilities/pspp-convert.c:83 msgid "expecting variable name" msgstr "要求变量名" #: src/language/lexer/variable-parser.c:96 #, c-format msgid "%s is not a variable name." msgstr "%s不是有效的变量名。" #: src/language/lexer/variable-parser.c:206 #, c-format msgid "" "%s is not a numeric variable. It will not be included in the variable list." msgstr "%s不是数字变量,将不包括在变量列表中。" #: src/language/lexer/variable-parser.c:209 #, c-format msgid "" "%s is not a string variable. It will not be included in the variable list." msgstr "%s不是字符串变量,将不包括在变量列表中。" #: src/language/lexer/variable-parser.c:213 #, c-format msgid "Scratch variables (such as %s) are not allowed here." msgstr "不允许使用临时变量(如%s)。" #: src/language/lexer/variable-parser.c:217 #, c-format msgid "" "%s and %s are not the same type. All variables in this variable list must " "be of the same type. %s will be omitted from the list." msgstr "%s和%s类型不同。变量列表中的变量须为同一类型。%s将被忽略。" #: src/language/lexer/variable-parser.c:223 #, c-format msgid "" "%s and %s are string variables with different widths. All variables in this " "variable list must have the same width. %s will be omitted from the list." msgstr "%s和%s字符串变量宽度不同。变量列表中的变量具有相同宽度。%s将被忽略。" #: src/language/lexer/variable-parser.c:228 #: src/language/lexer/variable-parser.c:447 #, c-format msgid "Variable %s appears twice in variable list." msgstr "%s在列表中重复出现。" #: src/language/lexer/variable-parser.c:341 #, c-format msgid "%s TO %s is not valid syntax since %s precedes %s in the dictionary." msgstr "%s到%s不符合语法,字典中%s先于%s出现。" #: src/language/lexer/variable-parser.c:349 #, c-format msgid "" "When using the TO keyword to specify several variables, both variables must " "be from the same variable dictionaries, of either ordinary, scratch, or " "system variables. %s is a %s variable, whereas %s is %s." msgstr "" "使用关键字TO指定多个变量时,这些变量必需出自相同的普通变量、临时变量或系统变" "量表。%s是%s变量,而%s是%s。" #: src/language/lexer/variable-parser.c:424 #, c-format msgid "`%s' cannot be used with TO because it does not end in a digit." msgstr "`%s'没有以数字结尾,不能在TO中使用。" #: src/language/lexer/variable-parser.c:432 #, c-format msgid "Numeric suffix on `%s' is larger than supported with TO." msgstr "`%s'的数字结尾大于TO支持的值。" #: src/language/lexer/variable-parser.c:505 msgid "Scratch variables not allowed here." msgstr "不能使用临时变量。" #: src/language/lexer/variable-parser.c:529 msgid "Prefixes don't match in use of TO convention." msgstr "前缀不符合TO命名规范。" #: src/language/lexer/variable-parser.c:534 msgid "Bad bounds in use of TO convention." msgstr "边界不符合TO规范。" #: src/language/xforms/compute.c:150 src/language/xforms/compute.c:205 #, c-format msgid "" "When executing COMPUTE: SYSMIS is not a valid value as an index into vector " "%s." msgstr "执行COMPUTE命令时:SYSMIS的值不能作为向量%s的有效索引值。" #: src/language/xforms/compute.c:154 src/language/xforms/compute.c:212 #, c-format msgid "" "When executing COMPUTE: %.*g is not a valid value as an index into vector %s." msgstr "执行COMPUTE命令时:%.*g的值不能作为向量%s的有效索引值。" #: src/language/xforms/compute.c:356 #, c-format msgid "There is no vector named %s." msgstr "无法找到名称为%s的向量。" #: src/language/xforms/count.c:125 msgid "Destination cannot be a string variable." msgstr "字符串变量不能作目的路径使用。" #: src/language/xforms/sample.c:76 msgid "The sampling factor must be between 0 and 1 exclusive." msgstr "取样因子的值必须介于(不含)0和1之间。" #: src/language/xforms/sample.c:96 #, c-format msgid "Cannot sample %d observations from a population of %d." msgstr "%d的样本量无法自%d的种群中获取。" #: src/language/xforms/recode.c:261 msgid "" "Inconsistent target variable types. Target variables must be all numeric or " "all string." msgstr "目标变量不一致。目标变量必须全部为数字型或全部为字符串型。" #: src/language/xforms/recode.c:282 msgid "CONVERT requires string input values and numeric output values." msgstr "CONVERT要求输入为字符串值,而输出为数字值。" #: src/language/xforms/recode.c:339 #, c-format msgid "%s is not allowed with string variables." msgstr "%s不能用于字符串变量。" #: src/language/xforms/recode.c:422 msgid "expecting output value" msgstr "要求输出值" #: src/language/xforms/recode.c:479 #, c-format msgid "" "%zu variable(s) cannot be recoded into %zu variable(s). Specify the same " "number of variables as source and target variables." msgstr "变量%zu不能重新编码为变量%zu。请指定同样数量的源变量及目标变量。" #: src/language/xforms/recode.c:494 #, c-format msgid "" "There is no variable named %s. (All string variables specified on INTO must " "already exist. Use the STRING command to create a string variable.)" msgstr "" "变量%s不存在。(所有INTO语句中的字符串变量必须为已创建变量。使用STRING可以创" "建字符串变量)" #: src/language/xforms/recode.c:510 #, c-format msgid "INTO is required with %s input values and %s output values." msgstr "INTO要求%s的输入值和%s的输出值。" #: src/language/xforms/recode.c:523 #, c-format msgid "Type mismatch. Cannot store %s data in %s variable %s." msgstr "类型不匹配。不能将%s数据存放于%s变量%s中。" #: src/language/xforms/recode.c:566 #, c-format msgid "" "Cannot recode because the variable %s would require a width of %d bytes or " "greater, but it has a width of only %d bytes." msgstr "" "无法进行重编码,因为变量%s要求宽度等于或大于%d字节,而其宽度仅为%d字节。" #: src/language/xforms/select-if.c:100 msgid "Syntax error expecting OFF or BY. Turning off case filtering." msgstr "语法错误,应为OFF或BY。关闭个案过滤器。" #: src/language/xforms/select-if.c:115 msgid "The filter variable must be numeric." msgstr "过滤变量必须为数字型。" #: src/language/xforms/select-if.c:121 msgid "The filter variable may not be scratch." msgstr "过滤变量不能为临时变量。" #: src/language/control/control-stack.c:49 #, c-format msgid "%s without %s." msgstr "%s 没有 %s。" #: src/language/control/control-stack.c:77 #, c-format msgid "This command must appear inside %s...%s, without intermediate %s...%s." msgstr "该指令必须处于%s...%s内,不能处于有中间的%s...%s。" #: src/language/control/control-stack.c:94 #, c-format msgid "This command cannot appear outside %s...%s." msgstr "该指令不能处于%s...%s之外。" #: src/language/control/do-if.c:180 #, c-format msgid "This command may not follow %s in %s ... %s." msgstr "该指令可能未随%s于%s...%s之内。" #: src/language/control/loop.c:211 msgid "Only one index clause may be specified." msgstr "仅可指定一个索引语句。" #: src/language/control/repeat.c:120 #, c-format msgid "Dummy variable name `%s' hides dictionary variable `%s'." msgstr "虚拟变量名称`%s'覆盖字典变量`%s'。" #: src/language/control/repeat.c:126 #, c-format msgid "Dummy variable name `%s' is given twice." msgstr "虚拟变量名`%s'重复指定。" #: src/language/control/repeat.c:170 #, c-format msgid "" "Dummy variable `%s' had %zu substitutions, so `%s' must also, but %zu were " "specified." msgstr "虚拟变量`%s'具有%zu个替代值,`%s'应具相同设置,但%zu已经被指定。" #: src/language/control/repeat.c:379 msgid "Ranges may only have integer bounds." msgstr "区间仅可使用整数作为边界。" #: src/language/control/repeat.c:393 #, c-format msgid "%ld TO %ld is an invalid range." msgstr "区间%ld TO %ld 不符合要求。" #: src/language/control/repeat.c:443 #, c-format msgid "No matching %s." msgstr "找不到%s。" #: src/language/control/temporary.c:44 msgid "" "This command may only appear once between procedures and procedure-like " "commands." msgstr "该指令在过程与类过程中间仅可使用一次。" #: src/language/dictionary/attributes.c:104 msgid "Attribute array index must be between 1 and 65535." msgstr "特征数组索引值必须介于1到65535之间。" #: src/language/dictionary/apply-dictionary.c:74 #, c-format msgid "Variable %s is %s in target file, but %s in source file." msgstr "变量%s在目标文件中是%s,但在源文件中是%s。" #: src/language/dictionary/apply-dictionary.c:110 msgid "No matching variables found between the source and target files." msgstr "在源文件和目标文件中找不到要匹配的变量。" #: src/language/dictionary/delete-variables.c:40 #: src/language/dictionary/modify-variables.c:79 #: src/language/dictionary/rename-variables.c:51 #, c-format msgid "" "%s may not be used after %s. Temporary transformations will be made " "permanent." msgstr "%s不能用于%s之后。临时变换将被永久保存。" #: src/language/dictionary/delete-variables.c:48 #: src/language/dictionary/modify-variables.c:312 #, c-format msgid "" "%s may not be used to delete all variables from the active dataset " "dictionary. Use %s instead." msgstr "%s不能用于从当前数据集字典中删除所有变量。使用%s来完成操作。" #: src/language/dictionary/missing-values.c:70 #, c-format msgid "" "Cannot mix numeric variables (e.g. %s) and string variables (e.g. %s) within " "a single list." msgstr "同一个列表中数字型变量(如%s)和字符串变量(如%s)不能混合使用。" #: src/language/dictionary/missing-values.c:91 msgid "" "Too many numeric missing values. At most three individual values or one " "value and one range are allowed." msgstr "缺失值过多。最多允许三个单个值缺失或一个值及一个范围缺失。" #: src/language/dictionary/missing-values.c:126 #, c-format msgid "Truncating missing value to maximum acceptable length (%d bytes)." msgstr "将缺失值减少到可接受的最大长度(%d字节)。" #: src/language/dictionary/missing-values.c:137 msgid "" "Too many string missing values. At most three individual values are allowed." msgstr "字符串缺失值过多。 最多允许三个缺失值。" #: src/language/dictionary/missing-values.c:154 #, c-format msgid "Missing values provided are too long to assign to variable of width %d." msgstr "指定的缺失值长度过长而不能赋于宽度为%d的变量。" #: src/language/dictionary/modify-variables.c:145 msgid "Cannot specify ALL after specifying a set of variables." msgstr "设定一组变量之后不能再设置为ALL。" #: src/language/dictionary/modify-variables.c:221 #: src/language/dictionary/rename-variables.c:76 #, c-format msgid "" "Differing number of variables in old name list (%zu) and in new name list " "(%zu)." msgstr "区分旧名称列表(%zu)和新名称列表(%zu)的变量数量。" #: src/language/dictionary/modify-variables.c:244 #: src/language/dictionary/modify-variables.c:294 #, c-format msgid "" "%s subcommand may be given at most once. It may not be given in conjunction " "with the %s subcommand." msgstr "子命令%s只可使用一次。不能与子命令%s联合使用。" #: src/language/dictionary/modify-variables.c:331 #, c-format msgid "Unrecognized subcommand name `%s'." msgstr "无法识别命令名称`%s'。" #: src/language/dictionary/modify-variables.c:334 msgid "Subcommand name expected." msgstr "要求子命令名称。" #: src/language/dictionary/mrsets.c:117 #, c-format msgid "" "VARIABLES specified only variable %s on %s, but at least two variables are " "required." msgstr "VARIABLES里列举了变量%s于%s上,但要求至少列出2个变量。" #: src/language/dictionary/mrsets.c:150 msgid "Numeric VALUE must be an integer." msgstr "数值型值VALUE必需为整数。" #: src/language/dictionary/mrsets.c:230 src/language/dictionary/mrsets.c:268 #, c-format msgid "" "MDGROUP subcommand for group %s specifies a string VALUE, but the variables " "specified for this group are numeric." msgstr "组%s的MDGROUP子命令给出一个字符串VALUE,而该组要求变量为数字型。" #: src/language/dictionary/mrsets.c:254 #, c-format msgid "" "VALUE string on MDGROUP subcommand for group %s is %d bytes long, but it " "must be no longer than the narrowest variable in the group, which is %s with " "a width of %d bytes." msgstr "" "组%s的MDGROUP子命令的VALUE字符串长度为%d字节,但系统要求不能超过组内最短的变" "量的长度,即变量%s的%d字节。" #: src/language/dictionary/mrsets.c:280 #, c-format msgid "" "MDGROUP subcommand for group %s specifies LABELSOURCE=VARLABEL but not " "CATEGORYLABELS=COUNTEDVALUES. Ignoring LABELSOURCE." msgstr "" "组%s的MDGROUP子命令设定LABELSOURCE=VARLABEL,而非" "CATEGORYLABELS=COUNTEDVALUES. LABELSOURCE将被忽略。" #: src/language/dictionary/mrsets.c:286 #, c-format msgid "" "MDGROUP subcommand for group %s specifies both LABEL and LABELSOURCE, but " "only one of these subcommands may be used at a time. Ignoring LABELSOURCE." msgstr "" "组%s的MDGROUP子命令同时设定了LABEL和LABELSOURCE,但这些子命令一次只能使用一" "个。LABELSOURCE将被忽略。" #: src/language/dictionary/mrsets.c:326 #, c-format msgid "" "Variables %s and %s specified as part of multiple dichotomy group %s have " "the same variable label. Categories represented by these variables will not " "be distinguishable in output." msgstr "" "变量%s和%s所在的多重二分组%s具有相同的变量标签。输出将无法区分出这些变量所代" "表的类别。" #: src/language/dictionary/mrsets.c:356 #, c-format msgid "" "Variable %s specified as part of multiple dichotomy group %s (which has " "CATEGORYLABELS=COUNTEDVALUES) has no value label for its counted value. " "This category will not be distinguishable in output." msgstr "" "变量%s所在的多重二分组%s(设置了CATEGORYLABELS=COUNTEDVALUES)没有为计数值指定" "值标签。输出中无法区分该类别。" #: src/language/dictionary/mrsets.c:369 #, c-format msgid "" "Variables %s and %s specified as part of multiple dichotomy group %s (which " "has CATEGORYLABELS=COUNTEDVALUES) have the same value label for the group's " "counted value. These categories will not be distinguishable in output." msgstr "" "变量%s和%s所在的多重二分组%s(设置了CATEGORYLABELS=COUNTEDVALUES)的计数值具" "有相同的值标签。输出将无法区分出这些类别。" #: src/language/dictionary/mrsets.c:426 #, c-format msgid "" "Variables specified on MCGROUP should have the same categories, but %s and " "%s (and possibly others) in multiple category group %s have different value " "labels for value %s." msgstr "" "MCGROUP指定的变量必须具有相同的类别,但%s和%s(可能还有其他)在多类别组%s中的" "值%s含有不同的值标签。" #: src/language/dictionary/mrsets.c:484 #, c-format msgid "No multiple response set named %s." msgstr "没有找到名称为%s的多重响应集。" #: src/language/dictionary/mrsets.c:533 msgid "" "The active dataset dictionary does not contain any multiple response sets." msgstr "活动数据集的字典没有包含任何多重响应集。" #: src/language/dictionary/mrsets.c:540 msgid "Multiple Response Sets" msgstr "多重响应集" #: src/language/dictionary/mrsets.c:543 #: src/language/dictionary/sys-file-info.c:446 #: src/language/dictionary/sys-file-info.c:733 #: src/language/stats/autorecode.c:375 src/language/data-io/data-parser.c:679 #: src/language/data-io/data-parser.c:725 src/language/data-io/print.c:434 #, fuzzy #| msgid "Attribute" msgid "Attributes" msgstr "特征" #: src/language/dictionary/mrsets.c:544 #: src/language/dictionary/sys-file-info.c:191 #: src/language/dictionary/sys-file-info.c:301 #: src/language/dictionary/sys-file-info.c:302 #: src/language/dictionary/sys-file-info.c:455 #: src/language/dictionary/sys-file-info.c:570 #: src/ui/gui/psppire-var-sheet-header.c:67 src/ui/gui/compute.ui:157 msgid "Label" msgstr "标签" #: src/language/dictionary/mrsets.c:544 #: src/language/dictionary/sys-file-info.c:241 #, fuzzy #| msgid "Encoding:" msgid "Encoding" msgstr "编码:" #: src/language/dictionary/mrsets.c:544 #, fuzzy #| msgid "Counted value" msgid "Counted Value" msgstr "计数值" #: src/language/dictionary/mrsets.c:544 #, fuzzy #| msgid "Cl_ear Variables" msgid "Member Variables" msgstr "清除变量(_e)" #: src/language/dictionary/mrsets.c:547 #: src/language/dictionary/sys-file-info.c:470 #: src/ui/gui/psppire-var-sheet-header.c:55 msgid "Name" msgstr "名称" #: src/language/dictionary/mrsets.c:564 msgid "Dichotomies" msgstr "" #: src/language/dictionary/mrsets.c:565 src/language/stats/logistic.c:1391 #, fuzzy #| msgid "Category" msgid "Categories" msgstr "类别" #: src/language/dictionary/numeric.c:67 #, c-format msgid "Format type %s may not be used with a numeric variable." msgstr "格式类型%s可能不能用于数字变量。" #: src/language/dictionary/numeric.c:86 src/language/dictionary/numeric.c:153 #, c-format msgid "There is already a variable named %s." msgstr "名称为%s的变量已经存在。" #: src/language/dictionary/numeric.c:138 #, c-format msgid "Format type %s may not be used with a string variable." msgstr "格式类型%s可能不能用于字符串变量。" #: src/language/dictionary/rename-variables.c:92 #, c-format msgid "Renaming would duplicate variable name %s." msgstr "重命名的新变量名称%s已经存在。" #: src/language/dictionary/split-file.c:75 #, fuzzy #| msgid "Split File" msgid "Split Values" msgstr "拆分文件" #: src/language/dictionary/split-file.c:76 #: src/language/dictionary/split-file.c:77 #: src/language/dictionary/sys-file-info.c:696 #: src/language/stats/chisquare.c:195 src/language/stats/cochran.c:156 #: src/language/stats/cochran.c:185 src/language/stats/examine.c:841 #: src/language/stats/reliability.c:648 src/language/stats/reliability.c:651 #: src/language/stats/crosstabs.q:1303 src/language/stats/crosstabs.q:1325 #: src/language/stats/crosstabs.q:1365 src/language/stats/crosstabs.q:1412 msgid "Value" msgstr "值" #: src/language/dictionary/split-file.c:79 #: src/language/dictionary/sys-file-info.c:734 #: src/language/stats/chisquare.c:246 src/language/stats/chisquare.c:328 #: src/language/stats/cochran.c:164 src/language/stats/correlations.c:100 #: src/language/stats/descriptives.c:1004 src/language/stats/friedman.c:226 #: src/language/stats/jonckheere-terpstra.c:377 #: src/language/stats/npar-summary.c:113 src/language/stats/quick-cluster.c:588 #: src/language/stats/runs.c:331 src/language/data-io/data-parser.c:683 #: src/language/data-io/data-parser.c:728 src/language/data-io/print.c:438 #: src/ui/gui/psppire-dictview.c:580 src/ui/gui/psppire-data-editor.c:502 msgid "Variable" msgstr "变量" #: src/language/dictionary/sys-file-info.c:184 #, fuzzy #| msgid "_Display Data File Information" msgid "File Information" msgstr "显示数据文件信息(_D)" #: src/language/dictionary/sys-file-info.c:185 msgid "Attribute" msgstr "特征" #: src/language/dictionary/sys-file-info.c:187 #, fuzzy #| msgid "File:" msgid "File" msgstr "文件:" #: src/language/dictionary/sys-file-info.c:194 #, fuzzy #| msgid "Created:" msgid "Created" msgstr "创建:" #: src/language/dictionary/sys-file-info.c:203 #, fuzzy #| msgid "Integer Format:" msgid "Integer Format" msgstr "整数格式:" #: src/language/dictionary/sys-file-info.c:205 msgid "Big Endian" msgstr "大端序(Big Endian)" #: src/language/dictionary/sys-file-info.c:206 msgid "Little Endian" msgstr "小端序(Little Endian)" #: src/language/dictionary/sys-file-info.c:207 #: src/language/dictionary/sys-file-info.c:216 #: src/language/dictionary/sys-file-info.c:223 src/language/utilities/set.q:930 msgid "Unknown" msgstr "未知" #: src/language/dictionary/sys-file-info.c:209 #, fuzzy #| msgid "Real Format:" msgid "Real Format" msgstr "实数格式:" #: src/language/dictionary/sys-file-info.c:211 msgid "IEEE 754 LE." msgstr "IEEE 754 标准小端序。" #: src/language/dictionary/sys-file-info.c:212 msgid "IEEE 754 BE." msgstr "IEEE 754 标准大端序。" #: src/language/dictionary/sys-file-info.c:213 msgid "VAX D." msgstr "VAX D." #: src/language/dictionary/sys-file-info.c:214 msgid "VAX G." msgstr "VAX G." #: src/language/dictionary/sys-file-info.c:215 msgid "IBM 390 Hex Long." msgstr "IBM 390 16进制长格式。" #: src/language/dictionary/sys-file-info.c:218 #: src/language/dictionary/sys-file-info.c:443 #: src/language/stats/binomial.c:199 src/language/stats/correlations.c:131 #: src/language/stats/correlations.c:159 src/language/stats/descriptives.c:585 #: src/language/stats/factor.c:1658 src/language/stats/factor.c:1701 #: src/language/stats/factor.c:1860 src/language/stats/factor.c:2074 #: src/language/stats/frequencies.c:1583 #: src/language/stats/kruskal-wallis.c:254 #: src/language/stats/kruskal-wallis.c:303 #: src/language/stats/ks-one-sample.c:316 src/language/stats/logistic.c:1187 #: src/language/stats/mann-whitney.c:254 src/language/stats/means.c:718 #: src/language/stats/means.c:800 src/language/stats/median.c:358 #: src/language/stats/oneway.c:985 src/language/stats/oneway.c:1157 #: src/language/stats/reliability.c:591 src/language/stats/regression.c:924 #: src/language/stats/t-test-one-sample.c:132 #: src/language/stats/t-test-paired.c:157 src/language/data-io/list.c:104 #: src/ui/gui/variable-info.ui:25 msgid "Variables" msgstr "变量" #: src/language/dictionary/sys-file-info.c:221 src/language/stats/examine.c:929 #: src/language/stats/means.c:697 src/language/stats/reliability.c:548 #: src/language/stats/crosstabs.q:930 msgid "Cases" msgstr "个案" #: src/language/dictionary/sys-file-info.c:226 src/language/stats/oneway.c:980 #: src/ui/gui/psppire-var-sheet-header.c:58 src/ui/gui/compute.ui:303 msgid "Type" msgstr "类型" #: src/language/dictionary/sys-file-info.c:230 #, fuzzy #| msgid "Weight:" msgid "Weight" msgstr "权重:" #: src/language/dictionary/sys-file-info.c:233 #, fuzzy #| msgid "Not weighted." msgid "Not weighted" msgstr "没有加权。" #: src/language/dictionary/sys-file-info.c:235 #, fuzzy #| msgid "Compression:" msgid "Compression" msgstr "压缩:" #: src/language/dictionary/sys-file-info.c:245 #: src/language/dictionary/sys-file-info.c:424 #: src/language/dictionary/sys-file-info.c:426 #, fuzzy #| msgid "Comments:" msgid "Documents" msgstr "注释:" #: src/language/dictionary/sys-file-info.c:305 #: src/language/dictionary/sys-file-info.c:430 msgid "(none)" msgstr "" #: src/language/dictionary/sys-file-info.c:393 msgid "No variables to display." msgstr "没有可用于显示的变量。" #: src/language/dictionary/sys-file-info.c:404 msgid "Macros not supported." msgstr "不支持的宏。" #: src/language/dictionary/sys-file-info.c:426 #, fuzzy #| msgid "Document Line %zu" msgid "Document" msgstr "文件行%zu" #: src/language/dictionary/sys-file-info.c:454 msgid "Position" msgstr "位置" #: src/language/dictionary/sys-file-info.c:456 msgid "Measurement Level" msgstr "" #: src/language/dictionary/sys-file-info.c:457 #: src/ui/gui/psppire-var-sheet-header.c:85 msgid "Role" msgstr "角色" #: src/language/dictionary/sys-file-info.c:458 #: src/ui/gui/psppire-var-sheet-header.c:61 src/ui/gui/compute.ui:215 msgid "Width" msgstr "宽度" #: src/language/dictionary/sys-file-info.c:459 #, fuzzy #| msgid "Align" msgid "Alignment" msgstr "对齐" #: src/language/dictionary/sys-file-info.c:460 #: src/language/dictionary/sys-file-info.c:734 msgid "Print Format" msgstr "打印格式" #: src/language/dictionary/sys-file-info.c:461 #, fuzzy #| msgid "Print Format" msgid "Write Format" msgstr "打印格式" #: src/language/dictionary/sys-file-info.c:462 #: src/ui/gui/missing-val-dialog.c:379 src/ui/gui/psppire-var-sheet-header.c:73 #: src/ui/gui/examine.ui:416 src/ui/gui/t-test.ui:105 msgid "Missing Values" msgstr "缺失值" #: src/language/dictionary/sys-file-info.c:567 #: src/ui/gui/psppire-var-sheet-header.c:70 src/ui/gui/val-labs-dialog.c:489 #: src/ui/gui/val-labs-dialog.ui:194 msgid "Value Labels" msgstr "值标签" #: src/language/dictionary/sys-file-info.c:573 #, fuzzy #| msgid "Variable View" msgid "Variable Value" msgstr "变量视图" #: src/language/dictionary/sys-file-info.c:577 #, fuzzy #| msgid "Last non-missing value" msgid "User-missing value" msgstr "最后一个非缺失值" #: src/language/dictionary/sys-file-info.c:693 #, fuzzy #| msgid "Variable under test" msgid "Variable and Dataset Attributes" msgstr "检验变量" #: src/language/dictionary/sys-file-info.c:699 #, fuzzy #| msgid "Variable Name: " msgid "Variable and Name" msgstr "变量名称:" #: src/language/dictionary/sys-file-info.c:702 #, fuzzy #| msgid "dataset" msgid "(dataset)" msgstr "数据集" #: src/language/dictionary/sys-file-info.c:722 msgid "No vectors defined." msgstr "没有定义向量。" #: src/language/dictionary/sys-file-info.c:732 #, fuzzy #| msgid "Vector" msgid "Vectors" msgstr "向量" #: src/language/dictionary/sys-file-info.c:736 msgid "Vector and Position" msgstr "" #: src/language/dictionary/sys-file-info.c:998 msgid "No valid encodings found." msgstr "没有找到有效的编码。" #: src/language/dictionary/sys-file-info.c:1004 #, c-format msgid "Usable encodings for %s." msgstr "可用于%s的编码。" #: src/language/dictionary/sys-file-info.c:1007 #, c-format msgid "" "Encodings that can successfully read %s (by specifying the encoding name on " "the GET command's ENCODING subcommand). Encodings that yield identical text " "are listed together." msgstr "" "能顺利读取%s的编码(通过GET指令下的ENCODING指定的编码)。将读取出相同文本的编" "码一并列出。" #: src/language/dictionary/sys-file-info.c:1012 #: src/language/dictionary/sys-file-info.c:1013 msgid "Encodings" msgstr "编码" #: src/language/dictionary/sys-file-info.c:1042 #, fuzzy, c-format #| msgid "%s encoded text strings." msgid "%s Encoded Text Strings" msgstr "%s已编码文字字符串。" #: src/language/dictionary/sys-file-info.c:1046 msgid "" "Text strings in the file dictionary that the previously listed encodings " "interpret differently, along with the interpretations." msgstr "文件字典为先前的编码转码结果有异的文本字符串以及转码结果。" #: src/language/dictionary/sys-file-info.c:1049 src/output/text-item.c:57 #: src/ui/gui/psppire-import-assistant.c:885 msgid "Text" msgstr "文本" #: src/language/dictionary/sys-file-info.c:1059 msgid "Purpose" msgstr "目标" #: src/language/dictionary/value-labels.c:154 #, c-format msgid "Truncating value label to %d bytes." msgstr "将值标签截短至%d字节。" #: src/language/dictionary/vector.c:66 #, c-format msgid "A vector named %s already exists." msgstr "名称为%s的向量已经存在。" #: src/language/dictionary/vector.c:74 #, c-format msgid "Vector name %s is given twice." msgstr "名称为%s的向量重复。" #: src/language/dictionary/vector.c:98 msgid "A slash must separate each vector specification in VECTOR's long form." msgstr "在长格式VECTOR中必须使用斜线将每个向量分隔开。" #: src/language/dictionary/vector.c:131 msgid "Vectors must have at least one element." msgstr "向量必须至少包括一个元素。" #: src/language/dictionary/vector.c:151 msgid "expecting vector length" msgstr "要求向量长度" #: src/language/dictionary/vector.c:170 #, c-format msgid "%s is an existing variable name." msgstr "变量名%s已存在。" #: src/language/dictionary/variable-display.c:121 msgid "Variable display width must be a positive integer." msgstr "变量显示宽度必须为一个正整数。" #: src/language/dictionary/weight.c:49 msgid "The weighting variable must be numeric." msgstr "权重变量须为数值。" #: src/language/dictionary/weight.c:54 msgid "The weighting variable may not be scratch." msgstr "权重变量不能做临时变量。" #: src/language/tests/moments-test.c:50 msgid "expecting weight value" msgstr "要求权重值" #: src/language/utilities/cd.c:45 src/language/utilities/include.c:173 #, fuzzy, c-format #| msgid "Cannot change directory to %s: %s " msgid "Cannot change directory to %s: %s" msgstr "不能转到目录%s:%s " #: src/language/utilities/date.c:33 #, c-format msgid "Only %s is currently implemented." msgstr "目前仅实现了%s功能。" #: src/language/utilities/host.c:60 #, fuzzy #| msgid "Command shell not supported on this platform." msgid "Time limit not supported on this platform." msgstr "运行平台不支持命令shell。" #: src/language/utilities/host.c:74 #, c-format msgid "%s: Command exited with status %d." msgstr "" #: src/language/utilities/host.c:95 #, fuzzy, c-format #| msgid "failed to create temporary file" msgid "Failed to create temporary file (%s)." msgstr "无法创建临时文件" #: src/language/utilities/host.c:102 #, c-format msgid "/dev/null: Failed to open (%s)." msgstr "" #: src/language/utilities/host.c:117 #, c-format msgid "Couldn't fork: %s." msgstr "无法分支:%s。" #: src/language/utilities/host.c:193 #, c-format msgid "While running \"%s\", waiting for child process failed (%s)." msgstr "" #: src/language/utilities/host.c:203 #, c-format msgid "Command \"%s\" timed out." msgstr "" #: src/language/utilities/host.c:205 #, c-format msgid "Command \"%s\" terminated by signal %d." msgstr "" #: src/language/utilities/host.c:212 msgid "Command or shell not found" msgstr "" #: src/language/utilities/host.c:214 msgid "Could not invoke command or shell" msgstr "" #: src/language/utilities/host.c:217 #, c-format msgid "Command \"%s\" exited with status %d (%s)." msgstr "" #: src/language/utilities/host.c:220 #, c-format msgid "Command \"%s\" exited with status %d." msgstr "" #: src/language/utilities/host.c:230 #, c-format msgid "Command \"%s\" output could not be read (%s)." msgstr "" #: src/language/utilities/title.c:88 #, c-format msgid " (Entered %s)" msgstr " (输入为%s)" #: src/language/utilities/include.c:73 #, c-format msgid "Can't find `%s' in include file search path." msgstr "在包含文件路径中找不到`%s'。" #: src/language/utilities/output.c:128 #, fuzzy, c-format #| msgid "Unknown command `%s'." msgid "Unknown cell class %s." msgstr "未知指令`%s'。" #: src/language/utilities/permissions.c:113 #, c-format msgid "Cannot stat %s: %s" msgstr "无法统计%s:%s" #: src/language/utilities/permissions.c:127 #, c-format msgid "Cannot change mode of %s: %s" msgstr "不能切换模式%s:%s" #: src/language/stats/aggregate.c:96 msgid "Sum of values" msgstr "总和" #: src/language/stats/aggregate.c:97 msgid "Mean average" msgstr "均值平均" #: src/language/stats/aggregate.c:98 msgid "Median average" msgstr "中位数平均" #: src/language/stats/aggregate.c:99 #: src/ui/gui/psppire-dialog-action-descriptives.c:40 #: src/ui/gui/psppire-dialog-action-frequencies.c:41 msgid "Standard deviation" msgstr "标准差" #: src/language/stats/aggregate.c:100 #: src/ui/gui/psppire-dialog-action-descriptives.c:42 msgid "Maximum value" msgstr "最大值" #: src/language/stats/aggregate.c:101 #: src/ui/gui/psppire-dialog-action-descriptives.c:41 msgid "Minimum value" msgstr "最小值" #: src/language/stats/aggregate.c:102 msgid "Percentage greater than" msgstr "高于下列值的百分比" #: src/language/stats/aggregate.c:103 msgid "Percentage less than" msgstr "低于下列值的百分比" #: src/language/stats/aggregate.c:104 msgid "Percentage included in range" msgstr "处于下列区间之内的百分比" #: src/language/stats/aggregate.c:105 msgid "Percentage excluded from range" msgstr "处于下列区间之外的百分比" #: src/language/stats/aggregate.c:106 msgid "Fraction greater than" msgstr "高于下列值的比例" #: src/language/stats/aggregate.c:107 msgid "Fraction less than" msgstr "低于下列值的比例" #: src/language/stats/aggregate.c:108 msgid "Fraction included in range" msgstr "处于下列区间之内的比例" #: src/language/stats/aggregate.c:109 msgid "Fraction excluded from range" msgstr "处于下列区间之外的比例" #: src/language/stats/aggregate.c:110 msgid "Number of cases" msgstr "个案数量" #: src/language/stats/aggregate.c:111 msgid "Number of cases (unweighted)" msgstr "个案数量(未加权)" #: src/language/stats/aggregate.c:112 msgid "Number of missing values" msgstr "缺失值数量" #: src/language/stats/aggregate.c:113 msgid "Number of missing values (unweighted)" msgstr "缺失值数量(未加权)" #: src/language/stats/aggregate.c:114 msgid "First non-missing value" msgstr "第一个非缺失值" #: src/language/stats/aggregate.c:115 msgid "Last non-missing value" msgstr "最后一个非缺失值" #: src/language/stats/aggregate.c:258 msgid "" "When PRESORTED is specified, specifying sorting directions with (A) or (D) " "has no effect. Output data will be sorted the same way as the input data." msgstr "" "设定PRESORTED(预排序)时,使用(A)和(D)设定排序方向不进行排序。 输出数据将按输" "入数据的排序方式排序" #: src/language/stats/aggregate.c:448 msgid "expecting aggregation function" msgstr "要求汇总函数" #: src/language/stats/aggregate.c:460 #, c-format msgid "Unknown aggregation function %s." msgstr "未知的汇总函数%s。" #: src/language/stats/aggregate.c:513 #, c-format msgid "Missing argument %zu to %s." msgstr "没有参数%zu被传递到%s。" #: src/language/stats/aggregate.c:522 #, c-format msgid "Arguments to %s must be of same type as source variables." msgstr "传递到%s的参数必须与源变量类型相同。" #: src/language/stats/aggregate.c:541 #, c-format msgid "" "Number of source variables (%zu) does not match number of target variables " "(%zu)." msgstr "源变量数量(%zu)与目标变量数量(%zu)不符。" #: src/language/stats/aggregate.c:557 #, c-format msgid "" "The value arguments passed to the %s function are out-of-order. They will " "be treated as if they had been specified in the correct order." msgstr "传递到%s函数的值参数顺序混乱。将被视作已正确排序处理。" #: src/language/stats/aggregate.c:631 #, c-format msgid "" "Variable name %s is not unique within the aggregate file dictionary, which " "contains the aggregate variables and the break variables." msgstr "变量名称%s在包含汇总变量和中断变量的汇总文件字典中非唯一。" #: src/language/stats/autorecode.c:152 #, c-format msgid "Source variable count (%zu) does not match target variable count (%zu)." msgstr "源变量数量(%zu)与目标变量数量(%zu)不一致。" #: src/language/stats/autorecode.c:164 #, c-format msgid "Target variable %s duplicates existing variable %s." msgstr "目标变量%s与现存变量%s冲突。" #: src/language/stats/autorecode.c:221 #, c-format msgid "" "With GROUP, variables may not mix string variables (such as %s) and numeric " "variables (such as %s)." msgstr "" #: src/language/stats/autorecode.c:363 #, fuzzy #| msgid "Recode into Same Variables" msgid "Recoding grouped variables." msgstr "重编码为到变量自身" #: src/language/stats/autorecode.c:365 #, fuzzy, c-format #| msgid "Replacing %s by %s: %s." msgid "Recoding %s into %s (%s)." msgstr "将%s替换为%s: %s。" #: src/language/stats/autorecode.c:369 #, fuzzy, c-format #| msgid "Removing %s: %s." msgid "Recoding %s into %s." msgstr "移除%s: %s。" #: src/language/stats/autorecode.c:376 src/ui/gui/recode.ui:209 msgid "New Value" msgstr "新值" #: src/language/stats/autorecode.c:376 msgid "Value Label" msgstr "值标签" #: src/language/stats/autorecode.c:379 msgid "Old Value" msgstr "旧值" #: src/language/stats/binomial.c:138 #, c-format msgid "Variable %s is not dichotomous" msgstr "变量%s不是二分变量" #: src/language/stats/binomial.c:182 src/ui/gui/binomial.ui:30 msgid "Binomial Test" msgstr "二项分布检验" #: src/language/stats/binomial.c:186 src/language/stats/chisquare.c:183 #: src/language/stats/chisquare.c:239 src/language/stats/chisquare.c:322 #: src/language/stats/cochran.c:188 src/language/stats/correlations.c:94 #: src/language/stats/correlations.c:145 src/language/stats/descriptives.c:991 #: src/language/stats/examine.c:602 src/language/stats/examine.c:742 #: src/language/stats/examine.c:836 src/language/stats/examine.c:925 #: src/language/stats/factor.c:1755 src/language/stats/factor.c:1878 #: src/language/stats/factor.c:1908 src/language/stats/factor.c:2068 #: src/language/stats/factor.c:2102 src/language/stats/frequencies.c:302 #: src/language/stats/frequencies.c:1579 src/language/stats/frequencies.c:1586 #: src/language/stats/friedman.c:250 src/language/stats/glm.c:729 #: src/language/stats/kruskal-wallis.c:249 #: src/language/stats/kruskal-wallis.c:297 #: src/language/stats/ks-one-sample.c:278 src/language/stats/logistic.c:1170 #: src/language/stats/logistic.c:1300 src/language/stats/logistic.c:1330 #: src/language/stats/jonckheere-terpstra.c:361 #: src/language/stats/mann-whitney.c:184 src/language/stats/mann-whitney.c:247 #: src/language/stats/means.c:757 src/language/stats/means.c:811 #: src/language/stats/mcnemar.c:222 src/language/stats/median.c:315 #: src/language/stats/median.c:350 src/language/stats/npar-summary.c:106 #: src/language/stats/oneway.c:973 src/language/stats/oneway.c:1051 #: src/language/stats/oneway.c:1150 src/language/stats/oneway.c:1238 #: src/language/stats/oneway.c:1373 src/language/stats/quick-cluster.c:746 #: src/language/stats/reliability.c:543 src/language/stats/reliability.c:584 #: src/language/stats/reliability.c:633 src/language/stats/reliability.c:644 #: src/language/stats/roc.c:969 src/language/stats/roc.c:1067 #: src/language/stats/regression.c:867 src/language/stats/regression.c:899 #: src/language/stats/regression.c:1023 src/language/stats/regression.c:1089 #: src/language/stats/runs.c:318 src/language/stats/sign.c:102 #: src/language/stats/t-test-indep.c:193 src/language/stats/t-test-indep.c:259 #: src/language/stats/t-test-one-sample.c:68 #: src/language/stats/t-test-one-sample.c:125 #: src/language/stats/t-test-paired.c:150 #: src/language/stats/t-test-paired.c:193 #: src/language/stats/t-test-paired.c:238 src/language/stats/wilcoxon.c:243 #: src/language/stats/wilcoxon.c:282 src/language/stats/crosstabs.q:925 #: src/language/stats/crosstabs.q:1253 src/language/stats/crosstabs.q:1293 #: src/language/stats/crosstabs.q:1302 src/language/stats/crosstabs.q:1331 #: src/language/stats/crosstabs.q:1373 src/language/stats/crosstabs.q:1418 #: src/ui/gui/crosstabs.ui:499 src/ui/gui/oneway.ui:615 msgid "Statistics" msgstr "统计量" #: src/language/stats/binomial.c:187 src/language/stats/chisquare.c:240 #: src/language/stats/chisquare.c:252 msgid "Category" msgstr "类别" #: src/language/stats/binomial.c:188 src/language/stats/cochran.c:189 #: src/language/stats/correlations.c:97 src/language/stats/correlations.c:155 #: src/language/stats/descriptives.c:993 src/language/stats/examine.c:926 #: src/language/stats/frequencies.c:1588 src/language/stats/friedman.c:251 #: src/language/stats/kruskal-wallis.c:250 #: src/language/stats/ks-one-sample.c:279 src/language/stats/logistic.c:1331 #: src/language/stats/jonckheere-terpstra.c:369 #: src/language/stats/mann-whitney.c:185 src/language/stats/means.c:710 #: src/language/stats/means-calc.c:439 src/language/stats/mcnemar.c:223 #: src/language/stats/median.c:351 src/language/stats/npar-summary.c:107 #: src/language/stats/oneway.c:1052 src/language/stats/reliability.c:544 #: src/language/stats/sign.c:69 src/language/stats/sign.c:70 #: src/language/stats/t-test-indep.c:194 #: src/language/stats/t-test-one-sample.c:126 #: src/language/stats/t-test-paired.c:151 #: src/language/stats/t-test-paired.c:194 src/language/stats/wilcoxon.c:244 #: src/language/stats/crosstabs.q:926 msgid "N" msgstr "N" #: src/language/stats/binomial.c:189 msgid "Observed Prop." msgstr "实际概率。" #: src/language/stats/binomial.c:190 msgid "Test Prop." msgstr "检验概率。" #: src/language/stats/binomial.c:192 src/language/stats/mcnemar.c:224 #: src/language/stats/sign.c:103 src/language/stats/wilcoxon.c:288 #: src/language/stats/crosstabs.q:1306 msgid "Exact Sig. (2-tailed)" msgstr "确切显著度(双尾)" #: src/language/stats/binomial.c:193 src/language/stats/mcnemar.c:225 #: src/language/stats/sign.c:104 src/language/stats/wilcoxon.c:289 #: src/language/stats/crosstabs.q:1307 msgid "Exact Sig. (1-tailed)" msgstr "确切显著度(单尾)" #: src/language/stats/binomial.c:195 #, fuzzy #| msgid "Group1" msgid "Groups" msgstr "第1组" #: src/language/stats/binomial.c:196 #, fuzzy #| msgid "Group1" msgid "Group 1" msgstr "第1组" #: src/language/stats/binomial.c:196 #, fuzzy #| msgid "Group2" msgid "Group 2" msgstr "第2组" #: src/language/stats/binomial.c:196 src/language/stats/chisquare.c:223 #: src/language/stats/chisquare.c:257 src/language/stats/examine.c:930 #: src/language/stats/factor.c:1756 src/language/stats/frequencies.c:344 #: src/language/stats/glm.c:811 src/language/stats/kruskal-wallis.c:285 #: src/language/stats/logistic.c:1336 src/language/stats/mann-whitney.c:197 #: src/language/stats/means.c:706 src/language/stats/oneway.c:982 #: src/language/stats/oneway.c:1072 src/language/stats/reliability.c:549 #: src/language/stats/regression.c:1031 src/language/stats/sign.c:75 #: src/language/stats/wilcoxon.c:250 #: src/ui/gui/psppire-dialog-action-crosstabs.c:93 #: src/language/stats/crosstabs.q:931 src/language/stats/crosstabs.q:1218 msgid "Total" msgstr "总计" #: src/language/stats/chisquare.c:171 #, fuzzy, c-format #| msgid "" #| "CHISQUARE test specified %d expected values, but %d distinct values were " #| "encountered in variable %s." msgid "" "CHISQUARE test specified %d expected values, but variable %s has %zu " "distinct values." msgstr "卡方检验指定%d的期望值,但%d不同的值存在于变量%s中。" #: src/language/stats/chisquare.c:184 src/language/stats/chisquare.c:241 msgid "Observed N" msgstr "实测 N" #: src/language/stats/chisquare.c:185 src/language/stats/chisquare.c:242 msgid "Expected N" msgstr "期望 N" #: src/language/stats/chisquare.c:186 src/language/stats/chisquare.c:243 #: src/language/stats/regression.c:1031 #: src/ui/gui/psppire-dialog-action-crosstabs.c:95 #: src/language/stats/crosstabs.q:1267 msgid "Residual" msgstr "残差" #: src/language/stats/chisquare.c:235 src/language/stats/cochran.c:150 #: src/language/stats/median.c:305 src/language/stats/sign.c:66 #: src/ui/gui/frequencies.ui:676 msgid "Frequencies" msgstr "频率" #: src/language/stats/chisquare.c:320 src/language/stats/cochran.c:181 #: src/language/stats/friedman.c:246 src/language/stats/kruskal-wallis.c:295 #: src/language/stats/mann-whitney.c:244 src/language/stats/mcnemar.c:219 #: src/language/stats/median.c:347 src/language/stats/sign.c:100 #: src/language/stats/wilcoxon.c:279 msgid "Test Statistics" msgstr "检验统计量" #: src/language/stats/chisquare.c:323 #, fuzzy #| msgid "Chi-Square" msgid "Chi-square" msgstr "卡方" #: src/language/stats/chisquare.c:324 src/language/stats/cochran.c:191 #: src/language/stats/examine.c:675 src/language/stats/factor.c:2107 #: src/language/stats/friedman.c:257 src/language/stats/glm.c:733 #: src/language/stats/kruskal-wallis.c:299 src/language/stats/logistic.c:1174 #: src/language/stats/median.c:354 src/language/stats/oneway.c:975 #: src/language/stats/oneway.c:1242 src/language/stats/regression.c:1025 #: src/language/stats/t-test-indep.c:267 #: src/language/stats/t-test-one-sample.c:75 #: src/language/stats/t-test-paired.c:253 src/language/stats/crosstabs.q:1304 msgid "df" msgstr "df" #: src/language/stats/chisquare.c:325 src/language/stats/cochran.c:192 #: src/language/stats/friedman.c:258 src/language/stats/kruskal-wallis.c:300 #: src/language/stats/median.c:355 msgid "Asymp. Sig." msgstr "渐进显著" #: src/language/stats/cochran.c:111 msgid "More than two values encountered. Cochran Q test will not be run." msgstr "检测到多于两个值。取消Cochran Q检验。" #: src/language/stats/cochran.c:153 #, c-format msgid "Success (%.*g)" msgstr "成功(%.*g)" #: src/language/stats/cochran.c:154 #, c-format msgid "Failure (%.*g)" msgstr "失败(%.*g)" #: src/language/stats/cochran.c:190 msgid "Cochran's Q" msgstr "Cochran氏Q" #: src/language/stats/correlations.c:91 src/language/stats/descriptives.c:987 #: src/language/stats/factor.c:2065 src/language/stats/npar-summary.c:102 msgid "Descriptive Statistics" msgstr "描述性统计" #: src/language/stats/correlations.c:95 src/language/stats/descriptives.c:108 #: src/language/stats/examine.c:742 src/language/stats/factor.c:2069 #: src/language/stats/frequencies.c:141 src/language/stats/graph.c:211 #: src/language/stats/ks-one-sample.c:290 src/language/stats/means-calc.c:438 #: src/language/stats/npar-summary.c:108 src/language/stats/oneway.c:1052 #: src/language/stats/t-test-indep.c:195 #: src/language/stats/t-test-one-sample.c:127 #: src/language/stats/t-test-paired.c:152 #: src/language/stats/t-test-paired.c:241 #: src/ui/gui/psppire-dialog-action-descriptives.c:39 #: src/ui/gui/psppire-dialog-action-frequencies.c:40 msgid "Mean" msgstr "均值" #: src/language/stats/correlations.c:96 src/language/stats/examine.c:751 #: src/language/stats/factor.c:2070 src/language/stats/ks-one-sample.c:290 #: src/language/stats/means-calc.c:440 src/language/stats/npar-summary.c:109 #: src/language/stats/oneway.c:1052 src/language/stats/t-test-indep.c:196 #: src/language/stats/t-test-one-sample.c:128 #: src/language/stats/t-test-paired.c:153 #: src/language/stats/t-test-paired.c:242 msgid "Std. Deviation" msgstr "标准差" #: src/language/stats/correlations.c:126 msgid "Correlations" msgstr "相关" #: src/language/stats/correlations.c:146 msgid "Pearson Correlation" msgstr "皮尔森相关" #: src/language/stats/correlations.c:147 src/language/stats/oneway.c:1243 #: src/language/stats/t-test-indep.c:268 #: src/language/stats/t-test-one-sample.c:76 #: src/language/stats/t-test-paired.c:254 msgid "Sig. (2-tailed)" msgstr "显著性 (双尾)" #: src/language/stats/correlations.c:147 src/language/stats/factor.c:1913 msgid "Sig. (1-tailed)" msgstr "显著性 (单尾)" #: src/language/stats/correlations.c:151 msgid "Cross-products" msgstr "叉积" #: src/language/stats/correlations.c:152 msgid "Covariance" msgstr "协方差" #: src/language/stats/correlations.c:165 msgid "Significant at .05 level" msgstr "" #: src/language/stats/correlations.c:234 msgid "The data for the chosen variables are all missing or empty." msgstr "用于选择变量的数据缺失或为空。" #: src/language/stats/correlations.c:390 src/language/stats/descriptives.c:368 #: src/language/data-io/list.c:166 msgid "No variables specified." msgstr "没有指定变量。" #: src/language/stats/descriptives.c:109 src/language/stats/frequencies.c:142 #: src/language/stats/means-calc.c:445 src/language/stats/t-test-indep.c:197 #: src/language/stats/t-test-one-sample.c:129 #: src/language/stats/t-test-paired.c:154 #: src/language/stats/t-test-paired.c:243 msgid "S.E. Mean" msgstr "均值标准误" #: src/language/stats/descriptives.c:110 src/language/stats/frequencies.c:145 msgid "Std Dev" msgstr "标准差" #: src/language/stats/descriptives.c:111 src/language/stats/examine.c:750 #: src/language/stats/frequencies.c:146 src/language/stats/means-calc.c:450 #: src/ui/gui/psppire-dialog-action-descriptives.c:46 #: src/ui/gui/psppire-dialog-action-frequencies.c:45 msgid "Variance" msgstr "方差" #: src/language/stats/descriptives.c:112 src/language/stats/examine.c:752 #: src/language/stats/frequencies.c:147 src/language/stats/means-calc.c:451 #: src/ui/gui/psppire-dialog-action-descriptives.c:47 #: src/ui/gui/psppire-dialog-action-frequencies.c:50 msgid "Kurtosis" msgstr "峰度" #: src/language/stats/descriptives.c:113 src/language/stats/frequencies.c:148 #: src/language/stats/means-calc.c:452 msgid "S.E. Kurt" msgstr "峰度标准误" #: src/language/stats/descriptives.c:114 src/language/stats/examine.c:752 #: src/language/stats/frequencies.c:149 src/language/stats/means-calc.c:453 #: src/ui/gui/psppire-dialog-action-descriptives.c:48 #: src/ui/gui/psppire-dialog-action-frequencies.c:46 msgid "Skewness" msgstr "偏斜度" #: src/language/stats/descriptives.c:115 src/language/stats/frequencies.c:150 #: src/language/stats/means-calc.c:454 msgid "S.E. Skew" msgstr "偏斜度标准误" #: src/language/stats/descriptives.c:116 src/language/stats/examine.c:751 #: src/language/stats/frequencies.c:151 src/language/stats/means-calc.c:449 #: src/ui/gui/psppire-dialog-action-descriptives.c:43 #: src/ui/gui/psppire-dialog-action-frequencies.c:48 msgid "Range" msgstr "极差" #: src/language/stats/descriptives.c:117 src/language/stats/examine.c:751 #: src/language/stats/frequencies.c:152 src/language/stats/graph.c:214 #: src/language/stats/ks-one-sample.c:285 src/language/stats/means-calc.c:447 #: src/language/stats/npar-summary.c:110 src/language/stats/oneway.c:1061 #: src/ui/gui/psppire-dialog-action-descriptives.c:41 #: src/ui/gui/psppire-dialog-action-frequencies.c:42 msgid "Minimum" msgstr "最小值" #: src/language/stats/descriptives.c:118 src/language/stats/examine.c:751 #: src/language/stats/frequencies.c:153 src/language/stats/graph.c:213 #: src/language/stats/ks-one-sample.c:285 src/language/stats/means-calc.c:448 #: src/language/stats/npar-summary.c:110 src/language/stats/oneway.c:1061 #: src/ui/gui/psppire-dialog-action-descriptives.c:42 #: src/ui/gui/psppire-dialog-action-frequencies.c:43 msgid "Maximum" msgstr "最大值" #: src/language/stats/descriptives.c:119 src/language/stats/frequencies.c:154 #: src/language/stats/graph.c:212 src/language/stats/means-calc.c:446 #: src/ui/gui/psppire-dialog-action-descriptives.c:44 #: src/ui/gui/psppire-dialog-action-frequencies.c:53 msgid "Sum" msgstr "和" #: src/language/stats/descriptives.c:350 #, c-format msgid "Z-score variable name %s would be a duplicate variable name." msgstr "Z-分数变量名称%s与现有变量名称冲突。" #: src/language/stats/descriptives.c:401 msgid "" "DESCRIPTIVES with Z scores ignores TEMPORARY. Temporary transformations " "will be made permanent." msgstr "带Z分数的DESCRIPTIVES忽略TEMPORARY,临时变换将被保存。" #: src/language/stats/descriptives.c:478 msgid "expecting statistic name: reverting to default" msgstr "要求统计量名称:恢复到默认设置" #: src/language/stats/descriptives.c:561 msgid "" "Ran out of generic names for Z-score variables. There are only 126 generic " "names: ZSC001-ZSC0999, STDZ01-STDZ09, ZZZZ01-ZZZZ09, ZQZQ01-ZQZQ09." msgstr "" "通用Z-分数变量名称不足。共有126个通用变量Z-分数变量名称:ZSC001-ZSC0999, " "STDZ01-STDZ09, ZZZZ01-ZZZZ09, ZQZQ01-ZQZQ09。" #: src/language/stats/descriptives.c:579 #, fuzzy #| msgid "Mapping of variables to corresponding Z-scores." msgid "Mapping of Variables to Z-scores" msgstr "将变量映射到对应的Z-分数。" #: src/language/stats/descriptives.c:581 #, fuzzy #| msgid "Name" msgid "Names" msgstr "名称" #: src/language/stats/descriptives.c:582 src/language/stats/glm.c:739 #: src/language/stats/regression.c:1030 msgid "Source" msgstr "源" #: src/language/stats/descriptives.c:582 msgid "Target" msgstr "目标" #: src/language/stats/descriptives.c:659 #, fuzzy, c-format #| msgid "Internal error processing Z scores" msgid "Internal error processing Z scores. Please report this to %s." msgstr "Z分数处理内部错误" #: src/language/stats/descriptives.c:759 #, c-format msgid "Z-score of %s" msgstr "%s的Z分数" #: src/language/stats/descriptives.c:1028 src/language/stats/roc.c:1029 msgid "Valid N (listwise)" msgstr "有效 N(含缺失值则排除)" #: src/language/stats/descriptives.c:1028 #, fuzzy #| msgid "Valid N (listwise)" msgid "Missing N (listwise)" msgstr "有效 N(含缺失值则排除)" #: src/language/stats/examine.c:75 msgid " (missing)" msgstr " (缺失)" #: src/language/stats/examine.c:225 #, c-format msgid "Boxplot of %s vs. %s" msgstr "%s对%s箱线图" #: src/language/stats/examine.c:231 src/language/stats/examine.c:338 #, c-format msgid "Boxplot of %s" msgstr "%s的箱线图" #: src/language/stats/examine.c:321 msgid "Boxplot" msgstr "箱线图" #: src/language/stats/examine.c:418 msgid "Not creating NP plot because data set is empty." msgstr "因数据为空,不能绘制NP图。" #: src/language/stats/examine.c:478 #, c-format msgid "Not creating spreadlevel chart for %s" msgstr "将不绘制%s的变异水平图" #: src/language/stats/examine.c:585 #, fuzzy #| msgid "Last non-missing value" msgid "User-missing value." msgstr "最后一个非缺失值" #: src/language/stats/examine.c:591 src/language/stats/examine.c:595 #: src/language/stats/frequencies.c:1606 msgid "Percentiles" msgstr "百分位" #: src/language/stats/examine.c:603 src/math/percentiles.c:37 msgid "Weighted Average" msgstr "加权平均值" #: src/language/stats/examine.c:603 msgid "Tukey's Hinges" msgstr "Tukey值域法" #: src/language/stats/examine.c:610 src/language/stats/examine.c:685 #: src/language/stats/examine.c:759 src/language/stats/examine.c:858 #: src/language/stats/examine.c:938 src/language/stats/mann-whitney.c:200 #: src/language/stats/median.c:319 src/language/stats/t-test-indep.c:227 #: src/language/stats/t-test-indep.c:282 #: src/language/stats/t-test-one-sample.c:87 #, fuzzy #| msgid "_Dependent Variable" msgid "Dependent Variables" msgstr "因变量(_D)" #: src/language/stats/examine.c:669 #, fuzzy #| msgid "Dev from Normal" msgid "Tests of Normality" msgstr "偏离正态值" #: src/language/stats/examine.c:673 msgid "Shapiro-Wilk" msgstr "" #: src/language/stats/examine.c:674 src/language/stats/examine.c:739 #: src/ui/gui/psppire-checkbox-treeview.c:73 msgid "Statistic" msgstr "统计量" #: src/language/stats/examine.c:676 src/language/stats/factor.c:2108 #: src/language/stats/glm.c:736 src/language/stats/logistic.c:1175 #: src/language/stats/oneway.c:978 src/language/stats/oneway.c:1154 #: src/language/stats/oneway.c:1376 src/language/stats/regression.c:906 #: src/language/stats/regression.c:1028 src/language/stats/t-test-indep.c:263 #: src/language/stats/t-test-paired.c:196 msgid "Sig." msgstr "显著性" #: src/language/stats/examine.c:735 src/language/stats/oneway.c:1045 #: src/ui/gui/descriptives.ui:25 msgid "Descriptives" msgstr "描述统计" #: src/language/stats/examine.c:738 msgid "Aspect" msgstr "" #: src/language/stats/examine.c:739 src/language/stats/oneway.c:1053 #: src/language/stats/oneway.c:1240 src/language/stats/oneway.c:1375 #: src/language/stats/roc.c:975 src/language/stats/regression.c:902 msgid "Std. Error" msgstr "标准误" #: src/language/stats/examine.c:745 src/language/stats/oneway.c:1056 #, c-format msgid "%g%% Confidence Interval for Mean" msgstr "均值的%g%%置信区间" #: src/language/stats/examine.c:747 src/language/stats/oneway.c:1058 #: src/language/stats/oneway.c:1382 src/language/stats/roc.c:982 #: src/language/stats/regression.c:913 msgid "Lower Bound" msgstr "下限" #: src/language/stats/examine.c:748 src/language/stats/oneway.c:1059 #: src/language/stats/oneway.c:1383 src/language/stats/roc.c:983 #: src/language/stats/regression.c:914 msgid "Upper Bound" msgstr "上限" #: src/language/stats/examine.c:750 msgid "5% Trimmed Mean" msgstr "去除两端5%数据后的均值" #: src/language/stats/examine.c:750 src/language/stats/frequencies.c:143 #: src/language/stats/means-calc.c:442 src/language/stats/median.c:352 #: src/ui/gui/psppire-dialog-action-frequencies.c:52 msgid "Median" msgstr "中位数" #: src/language/stats/examine.c:752 msgid "Interquartile Range" msgstr "分区数区间" #: src/language/stats/examine.c:832 msgid "Extreme Values" msgstr "极值" #: src/language/stats/examine.c:840 src/language/stats/quick-cluster.c:664 #: src/language/data-io/list.c:110 msgid "Case Number" msgstr "个案数" #: src/language/stats/examine.c:844 #, fuzzy #| msgid "Order by" msgid "Order" msgstr "排序方式" #. TRANSLATORS: This is a noun, not an adjective. #: src/language/stats/examine.c:850 #, fuzzy #| msgid "_Extremes" msgid "Extreme" msgstr "极值(_E)" #: src/language/stats/examine.c:851 msgid "Highest" msgstr "最高" #: src/language/stats/examine.c:851 msgid "Lowest" msgstr "最低" #: src/language/stats/examine.c:921 src/language/stats/logistic.c:1328 #: src/language/stats/means.c:694 src/language/stats/reliability.c:540 msgid "Case Processing Summary" msgstr "个案处理总结" #: src/language/stats/examine.c:927 src/language/stats/frequencies.c:304 #: src/language/stats/frequencies.c:1494 src/language/stats/logistic.c:1332 #: src/language/stats/means.c:713 src/language/stats/reliability.c:545 #: src/language/stats/crosstabs.q:927 msgid "Percent" msgstr "百分比" #: src/language/stats/examine.c:929 src/language/stats/frequencies.c:321 #: src/language/stats/frequencies.c:1590 src/language/stats/quick-cluster.c:766 #: src/language/stats/reliability.c:548 src/language/stats/crosstabs.q:931 msgid "Valid" msgstr "有效" #: src/language/stats/examine.c:929 src/language/stats/frequencies.c:336 #: src/language/stats/frequencies.c:1591 src/language/stats/crosstabs.q:931 msgid "Missing" msgstr "缺失" #: src/language/stats/examine.c:1550 #, c-format msgid "%s may not be negative. Using default value (%g)." msgstr "%s可能非负,使用默认值(%g)。" #: src/language/stats/examine.c:1587 msgid "Percentiles must lie in the range (0, 100)" msgstr "百分位必须处于区间(0, 100)" #: src/language/stats/examine.c:1777 #, c-format msgid "%s and %s are mutually exclusive" msgstr "%s与%s互斥" #: src/language/stats/factor.c:1121 #, c-format msgid "Matrix input for %s must be either COV or CORR" msgstr "%s 的矩阵输入必需为COV或CORR" #: src/language/stats/factor.c:1519 msgid "Factor analysis on a single variable is not useful." msgstr "对单个变量进行因子分析毫无意义。" #: src/language/stats/factor.c:1523 msgid "Factor analysis without variables is not possible." msgstr "因子分析不能在没有变量的情况下进行。" #: src/language/stats/factor.c:1634 msgid "Component Number" msgstr "成分数量" #: src/language/stats/factor.c:1634 msgid "Factor Number" msgstr "因子数量" #: src/language/stats/factor.c:1648 src/language/stats/factor.c:1651 msgid "Communalities" msgstr "公因子方差比" #: src/language/stats/factor.c:1653 msgid "Initial" msgstr "初始解" #: src/language/stats/factor.c:1655 msgid "Extraction" msgstr "提取" #: src/language/stats/factor.c:1697 src/language/stats/factor.c:1777 #: src/language/stats/factor.c:1839 msgid "Component" msgstr "成分" #: src/language/stats/factor.c:1697 src/language/stats/factor.c:1777 #: src/language/stats/factor.c:1839 msgid "Factor" msgstr "因子" #: src/language/stats/factor.c:1752 msgid "Total Variance Explained" msgstr "方差贡献率" #: src/language/stats/factor.c:1758 #, no-c-format msgid "% of Variance" msgstr "方差百分比" #: src/language/stats/factor.c:1760 #, no-c-format msgid "Cumulative %" msgstr "累积百分比" #: src/language/stats/factor.c:1763 msgid "Phase" msgstr "" #: src/language/stats/factor.c:1765 msgid "Initial Eigenvalues" msgstr "初始解特征根" #: src/language/stats/factor.c:1769 msgid "Extraction Sums of Squared Loadings" msgstr "提取载荷平方和" #: src/language/stats/factor.c:1773 msgid "Rotation Sums of Squared Loadings" msgstr "旋转载荷平方和" #: src/language/stats/factor.c:1835 msgid "Factor Correlation Matrix" msgstr "因子相关矩阵" #: src/language/stats/factor.c:1842 #, fuzzy #| msgid "Factor" msgid "Factor 2" msgstr "因子" #: src/language/stats/factor.c:1874 msgid "Anti-Image Matrices" msgstr "反映像矩阵" #: src/language/stats/factor.c:1879 msgid "Anti-image Covariance" msgstr "反映象协方差" #: src/language/stats/factor.c:1880 msgid "Anti-image Correlation" msgstr "反映象相关" #: src/language/stats/factor.c:1901 msgid "Correlation Matrix" msgstr "相关矩阵" #: src/language/stats/factor.c:1910 src/language/stats/t-test-paired.c:195 msgid "Correlation" msgstr "相关" #: src/language/stats/factor.c:1947 msgid "Determinant" msgstr "行列式" #: src/language/stats/factor.c:1958 msgid "Covariance Matrix" msgstr "协方差矩阵" #: src/language/stats/factor.c:1990 msgid "" "The dataset contains no complete observations. No analysis will be performed." msgstr "数据集没有包含完整的观测值。将不进行数据分析。" #: src/language/stats/factor.c:2014 msgid "The dataset has no complete covariance or correlation matrix." msgstr "数据不具有完全协方差或相关矩阵。" #: src/language/stats/factor.c:2071 msgid "Analysis N" msgstr "分析 N" #: src/language/stats/factor.c:2099 msgid "KMO and Bartlett's Test" msgstr "KMO和巴特利特(Bartlett)检验" #: src/language/stats/factor.c:2103 msgid "Kaiser-Meyer-Olkin Measure of Sampling Adequacy" msgstr "Kaiser-Meyer-Olkin样本充分度检验" #: src/language/stats/factor.c:2105 msgid "Bartlett's Test of Sphericity" msgstr "巴特莱特(Bartlett)球性检验" #: src/language/stats/factor.c:2106 msgid "Approx. Chi-Square" msgstr "卡方估计值" #: src/language/stats/factor.c:2154 #, c-format msgid "" "The %s criteria result in zero factors extracted. Therefore no analysis will " "be performed." msgstr "按%s标准可提取因子数为零。将不继续分析。" #: src/language/stats/factor.c:2161 #, c-format msgid "" "The %s criteria result in more factors than variables, which is not " "meaningful. No analysis will be performed." msgstr "" "按%s标准提取的因子数多于变量数,导致无意义的结果。不再往下进行分析操作。" #: src/language/stats/factor.c:2254 msgid "Component Matrix" msgstr "成分矩阵" #: src/language/stats/factor.c:2254 msgid "Factor Matrix" msgstr "因子矩阵" #: src/language/stats/factor.c:2259 msgid "Pattern Matrix" msgstr "模式矩阵" #: src/language/stats/factor.c:2268 msgid "Structure Matrix" msgstr "结构矩阵" #: src/language/stats/factor.c:2270 msgid "Rotated Component Matrix" msgstr "旋转成分矩阵" #: src/language/stats/factor.c:2271 msgid "Rotated Factor Matrix" msgstr "旋转因子矩阵" #: src/language/stats/flip.c:100 #, c-format msgid "%s ignores %s. Temporary transformations will be made permanent." msgstr "%s忽略%s。 临时变换将被保存。" #: src/language/stats/flip.c:153 #, c-format msgid "Could not create temporary file for %s." msgstr "无法为%s创建临时文件。" #: src/language/stats/flip.c:341 #, c-format msgid "Error rewinding %s file: %s." msgstr "无法撤消对文件%s的操作:%s。" #: src/language/stats/flip.c:348 #, c-format msgid "Error creating %s source file." msgstr "创建源文件%s时出错。" #: src/language/stats/flip.c:361 #, c-format msgid "Error reading %s file: %s." msgstr "读取文件%s时出错:%s。" #: src/language/stats/flip.c:363 #, c-format msgid "Unexpected end of file reading %s file." msgstr "记取文件%s时文件意外结束。" #: src/language/stats/flip.c:379 #, c-format msgid "Error seeking %s source file: %s." msgstr "源文件%s查找时出错:%s。" #: src/language/stats/flip.c:387 #, c-format msgid "Error writing %s source file: %s." msgstr "写入源文件%s时出错:%s。" #: src/language/stats/flip.c:402 #, c-format msgid "Error rewinding %s source file: %s." msgstr "撤消源文件%s操作时出错:%s。" #: src/language/stats/flip.c:433 #, c-format msgid "Error reading %s temporary file: %s." msgstr "读取临时文件%s时出错:%s。" #: src/language/stats/flip.c:436 #, c-format msgid "Unexpected end of file reading %s temporary file." msgstr "读取临时文件%s时文件意外结束。" #: src/language/stats/frequencies.c:144 #: src/ui/gui/psppire-dialog-action-frequencies.c:49 msgid "Mode" msgstr "众数" #: src/language/stats/frequencies.c:303 src/language/stats/logistic.c:1381 #: src/output/charts/plot-hist-cairo.c:112 msgid "Frequency" msgstr "频率" #: src/language/stats/frequencies.c:305 msgid "Valid Percent" msgstr "有效百分比" #: src/language/stats/frequencies.c:306 src/language/stats/graph.c:208 msgid "Cumulative Percent" msgstr "累积百分比" #: src/language/stats/frequencies.c:905 msgid "Histogram frequency must be greater than zero." msgstr "直方图频率必须大于零。" #: src/language/stats/frequencies.c:923 msgid "Histogram percentage must be greater than zero." msgstr "直方图百分比必须大于零。" #: src/language/stats/frequencies.c:1139 #, c-format msgid "" "%s for histogram must be greater than or equal to %s, but %s was specified " "as %.15g and %s as %.15g. %s and %s will be ignored." msgstr "" "直方图的%s必须大于或等于%s,但设定是:%s 为 %.15g 和 %s 为 %.15g。%s和%s将被" "忽略。" #: src/language/stats/frequencies.c:1184 #, c-format msgid "" "%s for pie chart must be greater than or equal to %s, but %s was specified " "as %.15g and %s as %.15g. %s and %s will be ignored." msgstr "" "饼状图的%s必须大于或等于%s,但设定是:%s 为 %.15g 和 %s 为 %.15g。%s和%s将被" "忽略。" #: src/language/stats/frequencies.c:1474 #, c-format msgid "Omitting pie chart for %s, which has only %d unique values." msgstr "饼状图将忽略%s,原因为其仅具有%d个唯一值。" #: src/language/stats/frequencies.c:1477 #, c-format msgid "Omitting pie chart for %s, which has over 50 unique values." msgstr "饼状图将忽略%s,原因为其具有超过50个唯一值。" #: src/language/stats/frequencies.c:1494 src/language/stats/graph.c:205 #: src/language/stats/quick-cluster.c:747 #: src/ui/gui/psppire-dialog-action-crosstabs.c:90 #: src/language/stats/crosstabs.q:789 src/language/stats/crosstabs.q:1262 msgid "Count" msgstr "计数" #: src/language/stats/friedman.c:220 src/language/stats/kruskal-wallis.c:247 #: src/language/stats/mann-whitney.c:182 src/language/stats/wilcoxon.c:240 msgid "Ranks" msgstr "次序" #: src/language/stats/friedman.c:222 src/language/stats/friedman.c:223 #: src/language/stats/kruskal-wallis.c:251 #: src/language/stats/mann-whitney.c:186 src/language/stats/wilcoxon.c:245 msgid "Mean Rank" msgstr "均值次序" #: src/language/stats/friedman.c:253 msgid "Kendall's W" msgstr "Kendall氏W" #: src/language/stats/friedman.c:256 src/language/stats/kruskal-wallis.c:298 #: src/language/stats/median.c:353 msgid "Chi-Square" msgstr "卡方" #: src/language/stats/glm.c:169 msgid "Multivariate analysis is not yet implemented" msgstr "不包含多元分析" #: src/language/stats/glm.c:274 msgid "Only types 1, 2 & 3 sums of squares are currently implemented" msgstr "仅支持平方和类型1,2和3" #: src/language/stats/glm.c:727 msgid "Tests of Between-Subjects Effects" msgstr "组间效应检验" #: src/language/stats/glm.c:730 #, fuzzy #| msgid "Type %s Sum of Squares" msgid "Type I Sum Of Squares" msgstr "类型%s的平方和" #: src/language/stats/glm.c:731 #, fuzzy #| msgid "Type %s Sum of Squares" msgid "Type II Sum Of Squares" msgstr "类型%s的平方和" #: src/language/stats/glm.c:732 #, fuzzy #| msgid "Type %s Sum of Squares" msgid "Type III Sum Of Squares" msgstr "类型%s的平方和" #: src/language/stats/glm.c:734 src/language/stats/oneway.c:976 #: src/language/stats/regression.c:1026 msgid "Mean Square" msgstr "均方" #: src/language/stats/glm.c:735 src/language/stats/oneway.c:977 #: src/language/stats/regression.c:1027 src/language/stats/t-test-indep.c:262 msgid "F" msgstr "F" #: src/language/stats/glm.c:740 msgid "Corrected Model" msgstr "校正后模型" #: src/language/stats/glm.c:740 msgid "Model" msgstr "模型" #: src/language/stats/glm.c:752 msgid "Intercept" msgstr "截距" #: src/language/stats/glm.c:802 src/output/pivot-table.c:763 #: src/output/spv/spv.c:867 msgid "Error" msgstr "错误" #: src/language/stats/glm.c:819 msgid "Corrected Total" msgstr "校正后总变异" #: src/language/stats/graph.c:206 msgid "Percentage" msgstr "百分比" #: src/language/stats/graph.c:207 msgid "Cumulative Count" msgstr "累积数量" #: src/language/stats/graph.c:296 #, c-format msgid "%s vs. %s by %s" msgstr "%s 对 %s by %s" #: src/language/stats/graph.c:303 #, c-format msgid "%s vs. %s" msgstr "%s 对 %s" #: src/language/stats/graph.c:322 msgid "" "Maximum number of scatterplot categories reached. Your BY variable has too " "many distinct values. The coloring of the plot will not be correct." msgstr "" "散点图类别数达到系统最大值。BY变量含有过多的独特值。图像的颜色显示可能不正" "确。" #: src/language/stats/graph.c:551 src/language/stats/rank.c:636 #, c-format msgid "%s of %s" msgstr "%s源于%s" #: src/language/stats/graph.c:698 src/language/stats/graph.c:729 #: src/language/stats/graph.c:777 msgid "Only one chart type is allowed." msgstr "只能选择一种图表类型。" #: src/language/stats/graph.c:721 src/language/stats/graph.c:820 #: src/language/stats/graph.c:834 msgid "Only one variable is allowed." msgstr "只允许一个变量。" #: src/language/stats/graph.c:843 msgid "Variable expected" msgstr "要求为变量。" #: src/language/stats/graph.c:883 msgid "FOOTNOTE is not implemented yet for GRAPH" msgstr "GRAPH命令中暂不支持FOOTNOTE子命令" #: src/language/stats/ks-one-sample.c:274 src/ui/gui/ks-one-sample.ui:24 msgid "One-Sample Kolmogorov-Smirnov Test" msgstr "单样本Kolmogorov-Smirnov检验" #: src/language/stats/ks-one-sample.c:284 msgid "Uniform Parameters" msgstr "均匀分布参数" #: src/language/stats/ks-one-sample.c:289 msgid "Normal Parameters" msgstr "正态分布参数" #: src/language/stats/ks-one-sample.c:294 msgid "Poisson Parameters" msgstr "泊松分布参数" #: src/language/stats/ks-one-sample.c:295 #: src/ui/gui/psppire-dialog-action-crosstabs.c:76 #: src/language/stats/crosstabs.q:1421 msgid "Lambda" msgstr "Lambda" #: src/language/stats/ks-one-sample.c:300 msgid "Exponential Parameters" msgstr "指数分布参数" #: src/language/stats/ks-one-sample.c:308 msgid "Most Extreme Differences" msgstr "最大极值差异" #: src/language/stats/ks-one-sample.c:309 msgid "Absolute" msgstr "绝对" #: src/language/stats/ks-one-sample.c:309 src/language/stats/roc.c:1037 msgid "Positive" msgstr "正" #: src/language/stats/ks-one-sample.c:309 src/language/stats/roc.c:1037 msgid "Negative" msgstr "负" #: src/language/stats/ks-one-sample.c:312 msgid "Kolmogorov-Smirnov Z" msgstr "Kolmogorov-Smirnov Z" #: src/language/stats/ks-one-sample.c:313 #: src/language/stats/jonckheere-terpstra.c:374 #: src/language/stats/mann-whitney.c:251 src/language/stats/runs.c:328 #: src/language/stats/wilcoxon.c:284 msgid "Asymp. Sig. (2-tailed)" msgstr "渐进显著度(双尾)" #: src/language/stats/logistic.c:327 msgid "All predicted values are either 1 or 0" msgstr "所有估计值均为1或0" #: src/language/stats/logistic.c:525 msgid "Dependent variable's values are not dichotomous." msgstr "因变量的值不是二分型。" #: src/language/stats/logistic.c:614 #, c-format msgid "" "Category %s does not have at least two distinct values. Logistic regression " "will not be run." msgstr "类别%s不包含至少两个明显区别的值。不进行逻辑斯蒂回归分析。" #: src/language/stats/logistic.c:674 #, c-format msgid "" "Estimation terminated at iteration number %d because parameter estimates " "changed by less than %g" msgstr "估计在迭代%d时终止,原因是参数估计的变化少于%g" #: src/language/stats/logistic.c:686 #, c-format msgid "" "Estimation terminated at iteration number %d because Log Likelihood " "decreased by less than %g%%" msgstr "估计在迭代%d时终止,原因是对数似然下降小于%g%%" #: src/language/stats/logistic.c:701 #, c-format msgid "" "Estimation terminated at iteration number %d because maximum iterations has " "been reached" msgstr "估计在迭代%d时终止,已达到最大迭代次数" #: src/language/stats/logistic.c:994 msgid "Cut point value must be in the range [0,1]" msgstr "分割点的值必须处于区间[0,1]" #: src/language/stats/logistic.c:1139 msgid "Dependent Variable Encoding" msgstr "因变量编码" #: src/language/stats/logistic.c:1141 msgid "Mapping" msgstr "" #: src/language/stats/logistic.c:1142 msgid "Internal Value" msgstr "内部值" #: src/language/stats/logistic.c:1145 msgid "Original Value" msgstr "原始值" #: src/language/stats/logistic.c:1167 msgid "Variables in the Equation" msgstr "公式中的变量" #: src/language/stats/logistic.c:1171 src/language/stats/regression.c:902 msgid "B" msgstr "B" #: src/language/stats/logistic.c:1172 msgid "S.E." msgstr "S.E." #: src/language/stats/logistic.c:1173 msgid "Wald" msgstr "Wald" #: src/language/stats/logistic.c:1176 msgid "Exp(B)" msgstr "Exp(B)" #: src/language/stats/logistic.c:1181 #, c-format msgid "%d%% CI for Exp(B)" msgstr "Exp(B)的%d%%置信区间" #: src/language/stats/logistic.c:1183 src/language/stats/t-test-indep.c:274 #: src/language/stats/t-test-one-sample.c:83 #: src/language/stats/t-test-paired.c:249 src/language/stats/crosstabs.q:1369 msgid "Lower" msgstr "下限" #: src/language/stats/logistic.c:1183 src/language/stats/t-test-indep.c:275 #: src/language/stats/t-test-one-sample.c:84 #: src/language/stats/t-test-paired.c:250 src/language/stats/crosstabs.q:1370 msgid "Upper" msgstr "上限" #: src/language/stats/logistic.c:1189 src/language/stats/logistic.c:1470 msgid "Step 1" msgstr "步骤一" #: src/language/stats/logistic.c:1263 msgid "Constant" msgstr "常量" #: src/language/stats/logistic.c:1298 msgid "Model Summary" msgstr "模型总结" #: src/language/stats/logistic.c:1301 msgid "-2 Log likelihood" msgstr "-2x对数似然" #: src/language/stats/logistic.c:1302 msgid "Cox & Snell R Square" msgstr "Cox和Snell R平方" #: src/language/stats/logistic.c:1303 msgid "Nagelkerke R Square" msgstr "Nagelkerke R平方" #: src/language/stats/logistic.c:1306 src/language/stats/logistic.c:1470 #, fuzzy #| msgid "Step 1" msgid "Step" msgstr "步骤一" #: src/language/stats/logistic.c:1335 msgid "Unweighted Cases" msgstr "未加权个案" #: src/language/stats/logistic.c:1336 msgid "Included in Analysis" msgstr "包括在分析内" #: src/language/stats/logistic.c:1336 msgid "Missing Cases" msgstr "缺失个案" #: src/language/stats/logistic.c:1365 msgid "Categorical Variables' Codings" msgstr "类别变量编码" #: src/language/stats/logistic.c:1380 #, fuzzy #| msgid "Encodings" msgid "Codings" msgstr "编码" #: src/language/stats/logistic.c:1383 msgid "Parameter coding" msgstr "参数编码" #: src/language/stats/logistic.c:1462 msgid "Classification Table" msgstr "分类表" #: src/language/stats/logistic.c:1466 msgid "Predicted" msgstr "预测值" #: src/language/stats/logistic.c:1466 #, fuzzy #| msgid "" #| "Percentage\n" #| "Correct" msgid "Percentage Correct" msgstr "" "百分比\n" "正确" #: src/language/stats/logistic.c:1468 msgid "Observed" msgstr "观测值" #: src/language/stats/logistic.c:1468 msgid "Overall Percentage" msgstr "总百分比" #: src/language/stats/jonckheere-terpstra.c:357 msgid "Jonckheere-Terpstra Test" msgstr "Jonckheere-Terpstra检验" #: src/language/stats/jonckheere-terpstra.c:364 #, c-format msgid "Number of levels in %s" msgstr "%s的水平数量" #: src/language/stats/jonckheere-terpstra.c:370 msgid "Observed J-T Statistic" msgstr "实测J-T统计量" #: src/language/stats/jonckheere-terpstra.c:371 msgid "Mean J-T Statistic" msgstr "J-T统计量均值" #: src/language/stats/jonckheere-terpstra.c:372 msgid "Std. Deviation of J-T Statistic" msgstr "J-T统计量标准差" #: src/language/stats/jonckheere-terpstra.c:373 msgid "Std. J-T Statistic" msgstr "标准J-T统计量" #: src/language/stats/mann-whitney.c:187 src/language/stats/wilcoxon.c:246 msgid "Sum of Ranks" msgstr "秩之和" #: src/language/stats/mann-whitney.c:248 msgid "Mann-Whitney U" msgstr "Mann-Whitney U" #: src/language/stats/mann-whitney.c:249 msgid "Wilcoxon W" msgstr "Wilcoxon W" #: src/language/stats/mann-whitney.c:250 src/language/stats/runs.c:327 #: src/language/stats/wilcoxon.c:283 msgid "Z" msgstr "Z" #: src/language/stats/means.c:702 msgid "Included" msgstr "包含" #: src/language/stats/means.c:704 src/language/stats/reliability.c:548 msgid "Excluded" msgstr "排除" #: src/language/stats/means.c:753 msgid "Report" msgstr "报告" #: src/language/stats/means.c:838 #, fuzzy, c-format #| msgid "" #| "Dependent variable %s has no non-missing values. No analysis for this " #| "variable will be done." msgid "" "The table \"%s\" has no non-empty control variables. No result for this " "table will be displayed." msgstr "因变量%s不包含非缺失值,不对其进行分析。" #: src/language/stats/means-calc.c:443 msgid "Group Median" msgstr "组中位数" #: src/language/stats/means-calc.c:455 msgid "First" msgstr "第一个" #: src/language/stats/means-calc.c:456 msgid "Last" msgstr "最后一个" #: src/language/stats/means-calc.c:458 msgid "Percent N" msgstr "百分比N" #: src/language/stats/means-calc.c:459 msgid "Percent Sum" msgstr "百分比和" #: src/language/stats/means-calc.c:461 msgid "Harmonic Mean" msgstr "调和平均数" #: src/language/stats/means-calc.c:462 msgid "Geom. Mean" msgstr "几何平均数" #: src/language/stats/mcnemar.c:144 msgid "The McNemar test is appropriate only for dichotomous variables" msgstr "McNemar检验仅适用于二分变量" #: src/language/stats/mcnemar.c:226 src/language/stats/sign.c:105 msgid "Point Probability" msgstr "点概率" #: src/language/stats/mcnemar.c:229 src/language/stats/sign.c:78 #: src/language/stats/sign.c:108 src/language/stats/t-test-paired.c:199 #: src/language/stats/t-test-paired.c:257 src/language/stats/wilcoxon.c:253 #: src/language/stats/wilcoxon.c:292 #, fuzzy #| msgid "Pair %d" msgid "Pairs" msgstr "个案对数量%d" #: src/language/stats/median.c:316 msgid "> Median" msgstr ">中位数" #: src/language/stats/median.c:316 msgid "≤ Median" msgstr "≤中位数" #: src/language/stats/npar.c:536 #, c-format msgid "%s subcommand not currently implemented." msgstr "当前版本不含%s子命令。" #: src/language/stats/npar.c:691 #, c-format msgid "Expecting %s, %s, %s or a number." msgstr "要求%s, %s, %s或数字。" #: src/language/stats/npar.c:845 #, c-format msgid "" "The specified value of HI (%d) is lower than the specified value of LO (%d)" msgstr "指定的HI值(%d)小于指定的LO值(%d)" #: src/language/stats/npar.c:897 #, c-format msgid "" "%d expected values were given, but the specified range (%d-%d) requires " "exactly %d values." msgstr "虽然要求的值%d已给出,但指定区间(%d-%d)要求值为%d。" #: src/language/stats/npar.c:1118 src/language/stats/t-test-parser.c:173 #, c-format msgid "" "PAIRED was specified but the number of variables preceding WITH (%zu) did " "not match the number following (%zu)." msgstr "设定了PAIRED参数,但WITH前的变量数量(%zu)与其后的数量(%zu)不匹配。" #: src/language/stats/oneway.c:361 msgid "LSD" msgstr "最小显著差数(LSD)" #: src/language/stats/oneway.c:362 src/ui/gui/oneway.ui:338 msgid "Tukey HSD" msgstr "Tukey HSD" #: src/language/stats/oneway.c:363 src/ui/gui/oneway.ui:253 msgid "Bonferroni" msgstr "Bonferroni" #: src/language/stats/oneway.c:364 src/ui/gui/oneway.ui:304 msgid "Scheffé" msgstr "Scheffé" #: src/language/stats/oneway.c:365 msgid "Games-Howell" msgstr "Games-Howell" #: src/language/stats/oneway.c:366 src/ui/gui/oneway.ui:321 msgid "Šidák" msgstr "Šidák" #: src/language/stats/oneway.c:519 #, c-format msgid "The post hoc analysis method %s is not supported." msgstr "不支持事后分析方法%s。" #: src/language/stats/oneway.c:842 #, c-format msgid "" "Dependent variable %s has no non-missing values. No analysis for this " "variable will be done." msgstr "因变量%s不包含非缺失值,不对其进行分析。" #: src/language/stats/oneway.c:924 #, c-format msgid "" "In contrast list %zu, the number of coefficients (%zu) does not equal the " "number of groups (%d). This contrast list will be ignored." msgstr "对比列表%zu中,系数数量(%zu)不等于组数(%d),忽略该对比。" #: src/language/stats/oneway.c:936 #, c-format msgid "Coefficients for contrast %zu do not total zero" msgstr "对比%zu的系数这和非零" #: src/language/stats/oneway.c:971 msgid "ANOVA" msgstr "方差分析" #: src/language/stats/oneway.c:974 src/language/stats/regression.c:1024 msgid "Sum of Squares" msgstr "平方和" #: src/language/stats/oneway.c:981 msgid "Between Groups" msgstr "组间" #: src/language/stats/oneway.c:981 msgid "Within Groups" msgstr "组内" #: src/language/stats/oneway.c:1075 src/language/stats/oneway.c:1257 #, fuzzy #| msgid "_Dependent Variable" msgid "Dependent Variable" msgstr "因变量(_D)" #: src/language/stats/oneway.c:1148 msgid "Test of Homogeneity of Variances" msgstr "方差齐性检验" #: src/language/stats/oneway.c:1151 msgid "Levene Statistic" msgstr "Levene氏统计" #: src/language/stats/oneway.c:1152 msgid "df1" msgstr "df1" #: src/language/stats/oneway.c:1153 msgid "df2" msgstr "df2" #: src/language/stats/oneway.c:1192 msgid "Contrast Coefficients" msgstr "对比系数" #: src/language/stats/oneway.c:1199 src/language/stats/oneway.c:1246 msgid "Contrast" msgstr "对比" #: src/language/stats/oneway.c:1236 msgid "Contrast Tests" msgstr "对比检验" #: src/language/stats/oneway.c:1239 msgid "Value of Contrast" msgstr "对比值" #: src/language/stats/oneway.c:1241 src/language/stats/regression.c:905 #: src/language/stats/t-test-indep.c:266 #: src/language/stats/t-test-one-sample.c:74 #: src/language/stats/t-test-paired.c:252 msgid "t" msgstr "t" #: src/language/stats/oneway.c:1252 msgid "Assumption" msgstr "" #: src/language/stats/oneway.c:1253 msgid "Assume equal variances" msgstr "假设方差相同" #: src/language/stats/oneway.c:1254 #, fuzzy #| msgid "Does not assume equal" msgid "Does not assume equal variances" msgstr "不假设方差相同" #: src/language/stats/oneway.c:1367 #, c-format msgid "Multiple Comparisons (%s)" msgstr "多重比较(%s)" #: src/language/stats/oneway.c:1374 #, fuzzy #| msgid "Mean Difference" msgid "Mean Difference (I - J)" msgstr "均值差异" #: src/language/stats/oneway.c:1379 #, c-format msgid "%g%% Confidence Interval" msgstr "%g%%的置信区间" #: src/language/stats/oneway.c:1386 src/language/stats/oneway.c:1390 msgid "(J) Family" msgstr "" #: src/language/stats/oneway.c:1406 #, fuzzy #| msgid "Runs Test" msgid "Test" msgstr "游程检验" #: src/language/stats/quick-cluster.c:576 msgid "Initial Cluster Centers" msgstr "初始类群中心点" #: src/language/stats/quick-cluster.c:577 msgid "Final Cluster Centers" msgstr "结果类群中心点" #: src/language/stats/quick-cluster.c:580 #: src/language/stats/quick-cluster.c:660 #: src/language/stats/quick-cluster.c:661 #: src/language/stats/quick-cluster.c:753 msgid "Cluster" msgstr "类群" #: src/language/stats/quick-cluster.c:658 msgid "Cluster Membership" msgstr "类群归属" #: src/language/stats/quick-cluster.c:744 msgid "Number of Cases in each Cluster" msgstr "类群中个案数" #: src/language/stats/quick-cluster.c:750 #, fuzzy #| msgid "Cluster" msgid "Clusters" msgstr "类群" #: src/language/stats/quick-cluster.c:867 #: src/language/stats/quick-cluster.c:893 #, fuzzy, c-format #| msgid "Variable %s already exists." msgid "A variable called `%s' already exists." msgstr "变量%s已经存在。" #: src/language/stats/quick-cluster.c:908 #, fuzzy, c-format #| msgid "expecting %s or %s" msgid "Expecting %s or %s." msgstr "要求%s或%s" #: src/language/stats/quick-cluster.c:928 msgid "The number of clusters must be positive" msgstr "类群数量必须为正" #: src/language/stats/quick-cluster.c:944 #, fuzzy #| msgid "The convergence criterium must be positive" msgid "The convergence criterion must be positive" msgstr "迭代次数必须为正" #: src/language/stats/quick-cluster.c:960 msgid "The number of iterations must be positive" msgstr "迭代次数必须为正" #: src/language/stats/rank.c:205 #, c-format msgid "" "Cannot generate variable name for ranking %s with %s. All candidates in use." msgstr "不能为秩%s生成名称%s。可用名称均已被使用。" #: src/language/stats/rank.c:321 #, c-format msgid "Too many variables in %s clause." msgstr "%s子句变量过多。" #: src/language/stats/rank.c:323 #, c-format msgid "Variable %s already exists." msgstr "变量%s已经存在。" #: src/language/stats/rank.c:325 src/language/expressions/evaluate.c:164 #, c-format msgid "Duplicate variable name %s." msgstr "变量名称%s重复。" #: src/language/stats/rank.c:631 #, c-format msgid "%s of %s by %s" msgstr "%s源于%s经由%s" #: src/language/stats/rank.c:825 #, fuzzy #| msgid "Variables Created By %s" msgid "Variables Created by RANK" msgstr "从%s创建变量" #: src/language/stats/rank.c:828 src/language/stats/rank.c:829 #, fuzzy #| msgid "Name Variable:" msgid "New Variable" msgstr "名称变量:" #: src/language/stats/rank.c:829 #, fuzzy #| msgid "Function: " msgid "Function" msgstr "函数" #: src/language/stats/rank.c:830 #, fuzzy #| msgid "Extraction" msgid "Fraction" msgstr "提取" #: src/language/stats/rank.c:830 #, fuzzy #| msgid "_Grouping Variable:" msgid "Grouping Variables" msgstr "分组变量(_G)" #: src/language/stats/rank.c:833 src/language/stats/rank.c:834 #, fuzzy #| msgid "_Test Variable:" msgid "Existing Variable" msgstr "检验变量(_T):" #: src/language/stats/reliability.c:164 msgid "Reliability on a single variable is not useful." msgstr "单个变量的信度用处不大。" #: src/language/stats/reliability.c:281 msgid "" "The STATISTICS subcommand is not yet implemented. No statistics will be " "produced." msgstr "暂不支持STATISTICS 子命令。将不输出统计量。" #: src/language/stats/reliability.c:300 msgid "The split point must be less than the number of variables" msgstr "分割点必须小于变量数量" #: src/language/stats/reliability.c:525 #, c-format msgid "Scale: %s" msgstr "评分:%s" #: src/language/stats/reliability.c:582 msgid "Item-Total Statistics" msgstr "项-总计统计量" #: src/language/stats/reliability.c:585 msgid "Scale Mean if Item Deleted" msgstr "删除该项后的均值" #: src/language/stats/reliability.c:586 msgid "Scale Variance if Item Deleted" msgstr "删除该项后的方差" #: src/language/stats/reliability.c:587 msgid "Corrected Item-Total Correlation" msgstr "该项与总表的相关" #: src/language/stats/reliability.c:588 msgid "Cronbach's Alpha if Item Deleted" msgstr "删除该项后的Cronbach氏Alpha" #: src/language/stats/reliability.c:627 msgid "Reliability Statistics" msgstr "信度统计量" #: src/language/stats/reliability.c:634 src/language/stats/reliability.c:646 msgid "Cronbach's Alpha" msgstr "Cronbach氏Alpha" #: src/language/stats/reliability.c:635 src/language/stats/reliability.c:649 #: src/language/stats/reliability.c:652 msgid "N of Items" msgstr "项数 N" #: src/language/stats/reliability.c:647 msgid "Part 1" msgstr "第1部分" #: src/language/stats/reliability.c:650 msgid "Part 2" msgstr "第2部分" #: src/language/stats/reliability.c:654 msgid "Total N of Items" msgstr "总项数 N" #: src/language/stats/reliability.c:656 msgid "Correlation Between Forms" msgstr "形式间相关性" #: src/language/stats/reliability.c:659 msgid "Spearman-Brown Coefficient" msgstr "Spearman-Brown系数" #: src/language/stats/reliability.c:660 msgid "Equal Length" msgstr "长度相等" #: src/language/stats/reliability.c:661 msgid "Unequal Length" msgstr "长度不等" #: src/language/stats/reliability.c:663 msgid "Guttman Split-Half Coefficient" msgstr "Guttman Split-Half系数" #: src/language/stats/roc.c:966 msgid "Area Under the Curve" msgstr "曲线下面积" #: src/language/stats/roc.c:970 msgid "Area" msgstr "面积" #: src/language/stats/roc.c:976 msgid "Asymptotic Sig." msgstr "渐进显著度" #: src/language/stats/roc.c:979 #, c-format msgid "Asymp. %g%% Confidence Interval" msgstr "渐进%g%%的置信区间" #: src/language/stats/roc.c:987 msgid "Variable under test" msgstr "检验变量" #: src/language/stats/roc.c:1026 msgid "Case Summary" msgstr "个案总结" #: src/language/stats/roc.c:1030 msgid "Unweighted" msgstr "未加权" #: src/language/stats/roc.c:1031 msgid "Weighted" msgstr "加权" #: src/language/stats/roc.c:1064 msgid "Coordinates of the Curve" msgstr "曲线的坐标" #: src/language/stats/roc.c:1068 msgid "Positive if greater than or equal to" msgstr "正,若大于等于" #: src/language/stats/roc.c:1069 src/output/charts/roc-chart-cairo.c:38 msgid "Sensitivity" msgstr "灵敏度" #: src/language/stats/roc.c:1069 src/output/charts/roc-chart-cairo.c:37 msgid "1 - Specificity" msgstr "1 - 特异度" #: src/language/stats/roc.c:1072 #, fuzzy #| msgid "ordinary" msgid "Coordinates" msgstr "普通" #: src/language/stats/roc.c:1076 msgid "Test variable" msgstr "检验变量" #: src/language/stats/regression.c:224 src/language/stats/regression.c:229 #, c-format msgid "VARIABLES may not appear after %s" msgstr "变量不能出现在%s之后" #: src/language/stats/regression.c:412 msgid "" "REGRESSION with SAVE ignores TEMPORARY. Temporary transformations will be " "made permanent." msgstr "带SAVE选项的REGRESSION忽略TEMPORARY选项。临时变换将被保存。" #: src/language/stats/regression.c:416 msgid "REGRESSION with SAVE ignores FILTER. All cases will be processed." msgstr "带 SAVE 选项的 REGRESSION 将忽略 FILTER 选项。所有个案都参与分析。" #: src/language/stats/regression.c:569 msgid "" "The dependent variable is equal to the independent variable. The least " "squares line is therefore Y=X. Standard errors and related statistics may be " "meaningless." msgstr "因变量等于自变量。最小二乘直线为Y=X。标准误及相关统计量无意义。" #: src/language/stats/regression.c:776 msgid "No valid data found. This command was skipped." msgstr "没有找到有效数据,忽略该指令。" #: src/language/stats/regression.c:863 #, c-format msgid "Model Summary (%s)" msgstr "模型总结(%s)" #: src/language/stats/regression.c:868 #: src/ui/gui/psppire-dialog-action-regression.c:42 msgid "R" msgstr "R" #: src/language/stats/regression.c:868 msgid "R Square" msgstr "R平方" #: src/language/stats/regression.c:868 msgid "Adjusted R Square" msgstr "调整后的R平方" #: src/language/stats/regression.c:869 msgid "Std. Error of the Estimate" msgstr "估值的标准误" #: src/language/stats/regression.c:895 #, c-format msgid "Coefficients (%s)" msgstr "系数(%s)" #: src/language/stats/regression.c:901 msgid "Unstandardized Coefficients" msgstr "未标准化系数" #: src/language/stats/regression.c:904 msgid "Standardized Coefficients" msgstr "标准化后系数" #: src/language/stats/regression.c:904 msgid "Beta" msgstr "Beta" #: src/language/stats/regression.c:911 #, c-format msgid "%g%% Confidence Interval for B" msgstr "B的%g%%置信区间" #: src/language/stats/regression.c:919 #, fuzzy #| msgid "Reliability Statistics" msgid "Collinearity Statistics" msgstr "信度统计量" #: src/language/stats/regression.c:920 #, fuzzy #| msgid "Covariance" msgid "Tolerance" msgstr "协方差" #: src/language/stats/regression.c:920 msgid "VIF" msgstr "" #: src/language/stats/regression.c:933 msgid "(Constant)" msgstr "(常量)" #: src/language/stats/regression.c:1020 #, c-format msgid "ANOVA (%s)" msgstr "方差分析(%s)" #: src/language/stats/regression.c:1031 src/ui/gui/regression.ui:24 msgid "Regression" msgstr "回归" #: src/language/stats/regression.c:1075 #, c-format msgid "Coefficient Correlations (%s)" msgstr "相关系数(%s)" #: src/language/stats/regression.c:1082 #, fuzzy #| msgid "Model" msgid "Models" msgstr "模型" #: src/language/stats/regression.c:1090 msgid "Covariances" msgstr "协方差" #: src/language/stats/runs.c:169 #, c-format msgid "" "Multiple modes exist for variable `%s'. Using %.*g as the threshold value." msgstr "变量`%s'有多个众数。使用%.*g作为阈值。" #: src/language/stats/runs.c:314 src/ui/gui/runs.ui:24 msgid "Runs Test" msgstr "游程检验" #: src/language/stats/runs.c:319 msgid "Test Value" msgstr "检验值" #: src/language/stats/runs.c:320 msgid "Test Value (mode)" msgstr "检验值(众数)" #: src/language/stats/runs.c:321 msgid "Test Value (mean)" msgstr "检验值(均值)" #: src/language/stats/runs.c:322 msgid "Test Value (median)" msgstr "检验值(中位数)" #: src/language/stats/runs.c:323 msgid "Cases < Test Value" msgstr "<检验值的个案" #: src/language/stats/runs.c:324 msgid "Cases ≥ Test Value" msgstr "≥检验值的个案" #: src/language/stats/runs.c:325 msgid "Total Cases" msgstr "个案总数" #: src/language/stats/runs.c:326 msgid "Number of Runs" msgstr "运行次数" #: src/language/stats/sign.c:72 #, fuzzy #| msgid "Mean Difference" msgid "Differences" msgstr "均值差异" #: src/language/stats/sign.c:73 msgid "Negative Differences" msgstr "负差异" #: src/language/stats/sign.c:74 msgid "Positive Differences" msgstr "正差异" #: src/language/stats/sign.c:75 src/language/stats/wilcoxon.c:250 msgid "Ties" msgstr "相同" #: src/language/stats/sort-cases.c:63 msgid "Buffer limit must be at least 2." msgstr "缓冲限制必须至少为2。" #: src/language/stats/sort-criteria.c:89 #, c-format msgid "Variable %s specified twice in sort criteria." msgstr "排序标准中变量%s设定了两次。" #: src/language/stats/t-test-indep.c:190 msgid "Group Statistics" msgstr "组统计量" #: src/language/stats/t-test-indep.c:200 #, fuzzy #| msgid "Group1" msgid "Group" msgstr "第1组" #: src/language/stats/t-test-indep.c:256 msgid "Independent Samples Test" msgstr "独立样本检验" #: src/language/stats/t-test-indep.c:261 msgid "Levene's Test for Equality of Variances" msgstr "Levene氏方差齐性检验" #: src/language/stats/t-test-indep.c:265 #, fuzzy #| msgid "t-test for Equality of Means" msgid "T-Test for Equality of Means" msgstr "均值相同t检验" #: src/language/stats/t-test-indep.c:269 #: src/language/stats/t-test-one-sample.c:77 msgid "Mean Difference" msgstr "均值差异" #: src/language/stats/t-test-indep.c:270 msgid "Std. Error Difference" msgstr "差异的标准误" #: src/language/stats/t-test-indep.c:273 #, fuzzy, no-c-format #| msgid "%g%% Confidence Interval of the Difference" msgid "95% Confidence Interval of the Difference" msgstr "差异的%g%%置信区间" #: src/language/stats/t-test-indep.c:277 #, fuzzy #| msgid "Options" msgid "Assumptions" msgstr "选项" #: src/language/stats/t-test-indep.c:278 msgid "Equal variances assumed" msgstr "假设方差相同" #: src/language/stats/t-test-indep.c:279 msgid "Equal variances not assumed" msgstr "不假设方差相同" #: src/language/stats/t-test-one-sample.c:64 msgid "One-Sample Test" msgstr "单样本检验" #: src/language/stats/t-test-one-sample.c:71 #, fuzzy, c-format #| msgid "Test Value = %f" msgid "Test Value = %.*g" msgstr "检验值=%f" #: src/language/stats/t-test-one-sample.c:80 #: src/language/stats/t-test-paired.c:246 #, c-format msgid "%g%% Confidence Interval of the Difference" msgstr "差异的%g%%置信区间" #: src/language/stats/t-test-one-sample.c:122 msgid "One-Sample Statistics" msgstr "单样本统计量" #: src/language/stats/t-test-paired.c:147 msgid "Paired Sample Statistics" msgstr "成对样本统计量" #: src/language/stats/t-test-paired.c:163 #: src/language/stats/t-test-paired.c:205 #: src/language/stats/t-test-paired.c:263 #, fuzzy, c-format #| msgid "Pair %d" msgid "Pair %zu" msgstr "个案对数量%d" #: src/language/stats/t-test-paired.c:190 msgid "Paired Samples Correlations" msgstr "成对样本相关" #: src/language/stats/t-test-paired.c:208 #, c-format msgid "%s & %s" msgstr "%s 和 %s" #: src/language/stats/t-test-paired.c:234 msgid "Paired Samples Test" msgstr "成对样本检验" #: src/language/stats/t-test-paired.c:240 msgid "Paired Differences" msgstr "个案对之差" #: src/language/stats/t-test-paired.c:266 #, c-format msgid "%s - %s" msgstr "%s - %s" #: src/language/stats/t-test-parser.c:133 #, c-format msgid "When applying %s to a string variable, two values must be specified." msgstr "将%s应用于字符串变量时,须同时指定两个值。" #: src/language/stats/t-test-parser.c:145 #: src/language/stats/t-test-parser.c:241 #, c-format msgid "%s subcommand may not be used with %s." msgstr "%s子指令必须与%s一起使用。" #: src/language/stats/t-test-parser.c:305 msgid "Exactly one of TESTVAL, GROUPS and PAIRS subcommands must be specified." msgstr "必须三个子指令TESTVAL、GROUPS和PAIRS中的一个。" #: src/language/stats/wilcoxon.c:248 #, fuzzy #| msgid "_Sign" msgid "Sign" msgstr "符号(_S)" #: src/language/stats/wilcoxon.c:249 msgid "Negative Ranks" msgstr "负秩" #: src/language/stats/wilcoxon.c:249 msgid "Positive Ranks" msgstr "正秩" #: src/language/stats/wilcoxon.c:296 #, fuzzy #| msgid "Too many pairs to calculate exact significance." msgid "Too many pairs to calculate exact significance" msgstr "过多数据对,无法计算确切显著度。" #: src/language/data-io/combine-files.c:214 msgid "Cannot specify the active dataset since none has been defined." msgstr "没有可用数据集来指定活动数据集。" #: src/language/data-io/combine-files.c:220 msgid "" "This command may not be used after TEMPORARY when the active dataset is an " "input source. Temporary transformations will be made permanent." msgstr "" "活动数据集作为输入源时,该指令将不能用于TEMPORARY之后。临时变换将被保存。" #: src/language/data-io/combine-files.c:255 msgid "Multiple IN subcommands for a single FILE or TABLE." msgstr "单个FILE或TABLE内指定了多个IN子指令。" #: src/language/data-io/combine-files.c:308 #, c-format msgid "File %s lacks BY variable %s." msgstr "文件%s缺少BY变量%s。" #: src/language/data-io/combine-files.c:311 #, c-format msgid "Active dataset lacks BY variable %s." msgstr "活动数据集缺少BY变量%s。" #: src/language/data-io/combine-files.c:388 #: src/language/data-io/combine-files.c:393 #, c-format msgid "BY is required when %s is specified." msgstr "指定%s时必须指定BY子命令。" #: src/language/data-io/combine-files.c:521 msgid "" "Combining files with incompatible encodings. String data may not be " "represented correctly." msgstr "试图合并编码兼容的文件,字符串可能不能正常显示。" #: src/language/data-io/combine-files.c:564 #, c-format msgid "" "Variable %s in file %s has different type or width from the same variable in " "earlier file." msgstr "变量%s所处的文件%s与之前文件中同一个变量类型或长度不同。" #: src/language/data-io/combine-files.c:570 #, c-format msgid "In file %s, %s is numeric." msgstr "文件%s中,%s为数字类型。" #: src/language/data-io/combine-files.c:573 #, c-format msgid "In file %s, %s is a string variable with width %d." msgstr "文件%s中,%s是长度%d的字符串类型。" #: src/language/data-io/combine-files.c:578 #, c-format msgid "In an earlier file, %s was numeric." msgstr "之前文件中,%s为数字类型。" #: src/language/data-io/combine-files.c:581 #, c-format msgid "In an earlier file, %s was a string variable with width %d." msgstr "之前文件中,%s是长度%d的字符串类型。" #: src/language/data-io/combine-files.c:621 #, c-format msgid "" "Variable name %s specified on %s subcommand duplicates an existing variable " "name." msgstr "变量名称%s(子命令%s内)与现有变量冲突。" #: src/language/data-io/combine-files.c:793 #, c-format msgid "Encountered %zu sets of duplicate cases in the master file." msgstr "%zu的个案与主文件重复。" #: src/language/data-io/data-list.c:129 src/language/data-io/data-list.c:144 #, fuzzy, c-format #| msgid "The %s value must be nonnegative." msgid "The %s value must be non-negative." msgstr "%s值不能为负数。" #: src/language/data-io/data-list.c:154 #, c-format msgid "The %s subcommand may only be used within %s." msgstr "子指令%s仅可在%s内使用。" #: src/language/data-io/data-list.c:159 #, c-format msgid "The %s subcommand may only be specified once." msgstr "子指令%s仅须指定一次。" #: src/language/data-io/data-list.c:197 msgid "Only one of FIXED, FREE, or LIST may be specified." msgstr "FIXED、FREE和LIST仅可指定一个。" #: src/language/data-io/data-list.c:260 msgid "Encoding should not be specified for inline data. It will be ignored." msgstr "内联数据无须设定编码,设置将被忽略。" #: src/language/data-io/data-list.c:269 #, c-format msgid "The %s subcommand may be used only with %s." msgstr "%s子命令仅可与%s一起使用。" #: src/language/data-io/data-list.c:284 src/language/data-io/matrix-data.c:578 msgid "At least one variable must be specified." msgstr "至少指定一个变量。" #: src/language/data-io/data-list.c:383 src/language/data-io/data-list.c:491 #: src/language/data-io/get-data.c:662 #, c-format msgid "%s is a duplicate variable name." msgstr "变量名称%s重复。" #: src/language/data-io/data-list.c:390 #, c-format msgid "There is already a variable %s of a different type." msgstr "变量名称%s已存在,且类型不同。" #: src/language/data-io/data-list.c:397 #, c-format msgid "There is already a string variable %s of a different width." msgstr "字符串变量%s已存在,且长度不同。" #: src/language/data-io/data-list.c:405 #, c-format msgid "Cannot place variable %s on record %d when RECORDS=%d is specified." msgstr "不能将变量%s置于记录%d,因为已设定RECORDS=%d。" #: src/language/data-io/data-parser.c:453 #: src/language/data-io/data-parser.c:462 msgid "Quoted string extends beyond end of line." msgstr "引号内的字符串超过行末尾。" #: src/language/data-io/data-parser.c:488 msgid "Missing delimiter following quoted string." msgstr "引号内的字符串后缺少分隔符。" #: src/language/data-io/data-parser.c:506 #, c-format msgid "Data for variable %s is not valid as format %s: %s" msgstr "变量%s的数据格式应为%s: %s" #: src/language/data-io/data-parser.c:536 #, c-format msgid "Partial case of %d of %d records discarded." msgstr "不完整个案%d的记录%d将被排除。" #: src/language/data-io/data-parser.c:592 #, c-format msgid "Partial case discarded. The first variable missing was %s." msgstr "排除不完整个案。第一个缺失的变量为%s。" #: src/language/data-io/data-parser.c:634 #, c-format msgid "" "Missing value(s) for all variables from %s onward. These will be filled " "with the system-missing value or blanks, as appropriate." msgstr "自%s起所有变量都有缺失值,将据情况以系统缺失值或空白填充。" #: src/language/data-io/data-parser.c:655 msgid "Record ends in data not part of any field." msgstr "记录末尾的数据不属于任何字段。" #: src/language/data-io/data-parser.c:670 #, c-format msgid "Reading %d record from %s." msgid_plural "Reading %d records from %s." msgstr[0] "读取%d条记录于%s。" #: src/language/data-io/data-parser.c:680 src/language/data-io/print.c:435 msgid "Record" msgstr "记录" #: src/language/data-io/data-parser.c:680 src/language/data-io/print.c:435 #: src/ui/gui/psppire-var-sheet-header.c:76 msgid "Columns" msgstr "列" #: src/language/data-io/data-parser.c:680 #: src/language/data-io/data-parser.c:725 src/language/data-io/print.c:435 msgid "Format" msgstr "格式" #: src/language/data-io/data-parser.c:720 #, c-format msgid "Reading free-form data from %s." msgstr "从%s读取不带格式的数据。" #. TRANSLATORS: this fragment will be interpolated into #. messages in fh_lock() that identify types of files. #: src/language/data-io/data-reader.c:136 src/language/data-io/data-writer.c:79 msgid "data file" msgstr "数据文件" #: src/language/data-io/data-reader.c:160 #, c-format msgid "Could not open `%s' for reading as a data file: %s." msgstr "无法打开`%s'作为数据文件:%s。" #: src/language/data-io/data-reader.c:174 #, c-format msgid "Could not read `%s' as a text file with encoding `%s': %s." msgstr "不能读取`%s'作为以编码`%s'的文本文件:%s。" #: src/language/data-io/data-reader.c:233 #, c-format msgid "" "Missing %s while reading inline data. This probably indicates a missing or " "incorrectly formatted %s command. %s must appear by itself on a single line " "with exactly one space between words." msgstr "" "读取内联数据时找不到%s。原因可能是缺少%s指令或指令格式不正确。%s必须作为单独" "的行列出,单词之间以仅一个空格分隔。" #: src/language/data-io/data-reader.c:253 #: src/language/data-io/data-reader.c:387 #, c-format msgid "Error reading file %s: %s." msgstr "读取文件%s出错:%s。" #: src/language/data-io/data-reader.c:261 #, c-format msgid "Unexpected end of file in partial record reading %s." msgstr "读取不完全记录%s时文件意外结束。" #: src/language/data-io/data-reader.c:321 #, c-format msgid "Corrupt block descriptor word at offset 0x%lx in %s." msgstr "区块描述损坏于偏移量0x%lx处,位于%s中。" #: src/language/data-io/data-reader.c:322 #, c-format msgid "Corrupt record descriptor word at offset 0x%lx in %s." msgstr "记录描述损坏于偏移量0x%lx处,位于%s中。" #: src/language/data-io/data-reader.c:335 #, c-format msgid "Corrupt record size at offset 0x%lx in %s." msgstr "记录大小损坏于偏移量0x%lx处,位于%s中。" #: src/language/data-io/data-reader.c:493 msgid "Record exceeds remaining block length." msgstr "记录超过剩余区块长度。" #: src/language/data-io/data-reader.c:567 #, c-format msgid "Attempt to read beyond end-of-file on file %s." msgstr "试图读取超过文件%s的结尾的内容。" #: src/language/data-io/data-reader.c:570 #, c-format msgid "Attempt to read beyond %s." msgstr "试图读取超过%s处的内容。" #: src/language/data-io/data-reader.c:733 msgid "" "This command is not valid here since the current input program does not " "access the inline file." msgstr "指令失效,原因是输入程序无读取内联文件权限。" #: src/language/data-io/data-writer.c:106 #, c-format msgid "An error occurred while opening `%s' for writing as a data file: %s." msgstr "打开`%s'作为数据文件写入时出错:%s。" #: src/language/data-io/data-writer.c:224 #, c-format msgid "I/O error occurred writing data file `%s'." msgstr "写入数据文件`%s'时发生读写错误。" #: src/language/data-io/dataset.c:64 #, c-format msgid "There is no dataset named %s." msgstr "没有名称为%s的数据集。" #: src/language/data-io/dataset.c:250 #, fuzzy #| msgid "Dataset" msgid "Datasets" msgstr "数据集" #: src/language/data-io/dataset.c:263 msgid "unnamed dataset" msgstr "未命名数据集" #: src/language/data-io/file-handle.c:61 #, c-format msgid "" "File handle %s is already defined. Use %s before redefining a file handle." msgstr "文件句柄%s已经定义。定义句柄前须使用%s。" #: src/language/data-io/file-handle.c:241 #, c-format msgid "%s must be specified with %s." msgstr "%s必须与%s一起使用。" #: src/language/data-io/file-handle.c:252 #, c-format msgid "" "The specified file mode requires LRECL. Assuming %zu-character records." msgstr "指定的文件模式要求LRECL,默认为%zu字符记录。" #: src/language/data-io/file-handle.c:256 #, c-format msgid "" "Record length (%d) must be between 1 and %lu bytes. Assuming %zu-character " "records." msgstr "记录长度(%d)必须处于1和%lu字节间,默认为%zu-字符长度的记录。" #: src/language/data-io/file-handle.c:300 msgid "file" msgstr "文件" #: src/language/data-io/file-handle.c:302 msgid "inline file" msgstr "内联文件" #: src/language/data-io/file-handle.c:350 msgid "expecting a file name or handle name" msgstr "要求一个文件名或句柄名" #: src/language/data-io/file-handle.c:365 #, c-format msgid "Handle for %s not allowed here." msgstr "该处不允许使用%s的句柄。" #: src/language/data-io/get-data.c:108 src/output/measure.c:262 #, c-format msgid "error reading file `%s'" msgstr "读取文件`%s'出错。" #: src/language/data-io/get-data.c:127 #, c-format msgid "Unsupported TYPE %s." msgstr "不支持TYPE %s。" #: src/language/data-io/get-data.c:278 msgid "The sheet index must be greater than or equal to 1" msgstr "工作表索引必须大于等于1" #: src/language/data-io/get-data.c:285 src/language/data-io/get-data.c:308 #: src/language/data-io/get-data.c:327 #, c-format msgid "%s must be followed by either \"%s\" or \"%s\"." msgstr "%s后必须接以\"%s\" 或 \"%s\"。" #: src/language/data-io/get-data.c:357 #, c-format msgid "" "%s is allowed only with %s arrangement, but %s arrangement was stated or " "implied earlier in this command." msgstr "%s仅随%s排列使用,但该命令之前已声明或暗示使用%s排列。" #: src/language/data-io/get-data.c:441 src/language/data-io/get-data.c:479 #, c-format msgid "Value of %s must be 1 or greater." msgstr "%s的值必须大于等于1。" #: src/language/data-io/get-data.c:504 msgid "" "Ignoring obsolete IMPORTCASES subcommand. (N OF CASES or SAMPLE may be used " "to substitute.)" msgstr "" "子命令 IMPORTCASES已停用,将被忽略。 (可用 N OF CASES 或 SAMPLE 替代。)" #: src/language/data-io/get-data.c:551 msgid "" "In compatible syntax mode, the QUALIFIER string must contain exactly one " "character." msgstr "兼容语法模式下,QUALIFIER字串必须包含仅一个字符。" #: src/language/data-io/get-data.c:583 #, c-format msgid "" "The record number specified, %ld, is at or before the previous record, %d. " "Data fields must be listed in order of increasing record number." msgstr "" "指定的记录编号%ld占据或居于前一记录%d位置之前。数据字段必须以记录编号的升序方" "式列出。" #: src/language/data-io/get-data.c:592 #, c-format msgid "" "The record number specified, %ld, exceeds the number of records per case " "specified on FIXCASE, %d." msgstr "指定的记录编号%ld超过FIXCASE指定的个案记录数量%d。" #: src/language/data-io/get.c:132 #, c-format msgid "%s: Data file dictionary has no variables." msgstr "%s: 数据文件字典没有变量。" #: src/language/data-io/inpt-pgm.c:133 #, c-format msgid "Unexpected end-of-file within %s." msgstr "文件意外结束于%s之内。" #: src/language/data-io/inpt-pgm.c:146 #, c-format msgid "Input program must contain %s or %s." msgstr "输入程序必须包含%s或%s。" #: src/language/data-io/inpt-pgm.c:152 msgid "Input program did not create any variables." msgstr "输入程序没有生成任何变量。" #: src/language/data-io/inpt-pgm.c:365 msgid "" "REREAD: Column numbers must be positive finite numbers. Column set to 1." msgstr "REREAD:列编号必须为正数。已设为1。" #: src/language/data-io/list.c:100 #, fuzzy #| msgid "Dataset" msgid "Data List" msgstr "数据集" #: src/language/data-io/list.c:221 #, c-format msgid "" "The first case (%ld) specified precedes the last case (%ld) specified. The " "values will be swapped." msgstr "第一个个案(%ld)先于最后一个个案(%ld)前指定。他们的值将被互换。" #: src/language/data-io/list.c:230 #, c-format msgid "" "The first case (%ld) to list is numbered less than 1. The value is being " "reset to 1." msgstr "要列出的第一个个案(%ld)编号小于1,将被重设为1。" #: src/language/data-io/list.c:237 #, c-format msgid "" "The last case (%ld) to list is numbered less than 1. The value is being " "reset to 1." msgstr "要列出的最后一个个案(%ld)编号小于1,将被重设为1。" #: src/language/data-io/list.c:244 #, c-format msgid "The step value %ld is less than 1. The value is being reset to 1." msgstr "步长%ld小于1,将被重设为1。" #: src/language/data-io/placement-parser.c:96 #, c-format msgid "" "Number of variables specified (%zu) differs from number of variable formats " "(%zu)." msgstr "变量数量(%zu)与变量格式数目(%zu)不同。" #: src/language/data-io/placement-parser.c:106 msgid "" "SPSS-like or Fortran-like format specification expected after variable names." msgstr "变量名称后要求类SPSS格式或Fortran格式。" #: src/language/data-io/placement-parser.c:129 #, c-format msgid "The %d columns %d-%d can't be evenly divided into %zu fields." msgstr "%d个列%d-%d不能被均匀分成%zu个字段。" #: src/language/data-io/placement-parser.c:310 msgid "Column positions for fields must be positive." msgstr "字段的列位置必须为正。" #: src/language/data-io/placement-parser.c:312 msgid "Column positions for fields must not be negative." msgstr "字段的列位置必须为非负。" #: src/language/data-io/placement-parser.c:372 msgid "The ending column for a field must be greater than the starting column." msgstr "字段列尾必须大于列头。" #: src/language/data-io/placement-parser.c:409 #, fuzzy, c-format #| msgid "" #| "The record number specified, %ld, is at or before the previous record, " #| "%d. Data fields must be listed in order of increasing record number." msgid "" "The record number specified, %.0f, is at or before the previous record, %d. " "Data fields must be listed in order of increasing record number." msgstr "" "指定的记录编号%ld占据或居于前一记录%d位置之前。数据字段必须以记录编号的升序方" "式列出。" #: src/language/data-io/print-space.c:127 #, c-format msgid "The expression on %s evaluated to the system-missing value." msgstr "表达式%s在求值后作为系统缺失值。" #: src/language/data-io/print-space.c:130 #, c-format msgid "The expression on %s evaluated to %g." msgstr "表达式%s在求值后作为%g。" #: src/language/data-io/print.c:189 src/language/data-io/trim.c:58 msgid "expecting a valid subcommand" msgstr "要求有效的子命令" #: src/language/data-io/print.c:219 #, c-format msgid "%s is required when binary formats are specified." msgstr "指定二进制格式后必须使用%s。" #: src/language/data-io/print.c:302 #, c-format msgid "Output calls for %d records but %zu specified on RECORDS subcommand." msgstr "输出要求%d个记录,但RECORDS子命令设定为%zu。" #: src/language/data-io/print.c:432 #, fuzzy #| msgid "Case Processing Summary" msgid "Print Summary" msgstr "个案处理总结" #: src/language/data-io/print.c:462 #, fuzzy #| msgid "Record" msgid "N of Records" msgstr "记录" #: src/language/data-io/matrix-data.c:191 #, c-format msgid "" "There are %d variable declared but the data has at least %d matrix rows." msgstr "声明了%d个变量,但数据含有至少 %d矩阵行。" #: src/language/data-io/matrix-data.c:292 msgid "" "The N subcommand was specified, but a N record was also found in the data. " "The N record will be ignored." msgstr "设置了N个子命令,但数据中也含有一个N记录。这个N记录将被忽略。" #: src/language/data-io/matrix-data.c:488 src/language/utilities/set.q:186 #, c-format msgid "%s must not be negative." msgstr "%s不能为负数。" #: src/language/data-io/matrix-data.c:568 msgid "FORMAT = FULL and FORMAT = NODIAGONAL are mutually exclusive." msgstr "设置FORMAT = FULL 与 FORMAT = NODIAGONAL互斥。" #: src/language/data-io/matrix-reader.c:102 #: src/language/data-io/matrix-reader.c:118 #, c-format msgid "Matrix dataset lacks a variable called %s." msgstr "矩阵数据缺少变量%s。" #: src/language/data-io/matrix-reader.c:109 #: src/language/data-io/matrix-reader.c:125 #, c-format msgid "Matrix dataset variable %s should be of string type." msgstr "矩阵数据变量%s应为字符串类型。" #: src/language/data-io/save-translate.c:168 #: src/language/data-io/save-translate.c:183 #, c-format msgid "The %s string must contain exactly one character." msgstr "字符串%s必须包含仅一个字符。" #: src/language/data-io/save-translate.c:249 #, c-format msgid "Output file `%s' exists but %s was not specified." msgstr "输出文件`%s'已经存在,但没有指定%s。" #: src/language/data-io/save.c:309 msgid "The OUTFILE or METADATA subcommand is required." msgstr "" #: src/language/data-io/trim.c:69 #, c-format msgid "" "Cannot rename %s as %s because there already exists a variable named %s. To " "rename variables with overlapping names, use a single RENAME subcommand such " "as `/RENAME (A=B)(B=C)(C=A)', or equivalently, `/RENAME (A B C=B C A)'." msgstr "" "不能将变量%s重命名为%s,因为变量%s已经存在。使用RENAME子命令为重复的变量名称" "重命名,例如`/RENAME (A=B)(B=C)(C=A)'或`/RENAME (A B C=B C A)'。" #: src/language/data-io/trim.c:227 #, c-format msgid "" "Number of variables on left side of `=' (%zu) does not match number of " "variables on right side (%zu), in parenthesized group %d of RENAME " "subcommand." msgstr "" "`=' (%zu)左边的变量数量与右边变量数量(%zu)不匹配。请检查RENAME子命令括号内的" "组%d。" #: src/language/data-io/trim.c:242 #, c-format msgid "Requested renaming duplicates variable name %s." msgstr "请求重命令重复的变量名称%s。" #: src/language/data-io/trim.c:281 msgid "Cannot DROP all variables from dictionary." msgstr "不能DROP字典的所有变量。" #: src/language/expressions/evaluate.c:151 msgid "expecting number or string" msgstr "要求数字或字符串" #: src/language/expressions/helpers.c:43 msgid "" "One of the arguments to a DATE function is not an integer. The result will " "be system-missing." msgstr "DATE函数的一个参数不是整数,结果将返回系统缺失值。" #: src/language/expressions/helpers.c:71 msgid "" "The week argument to DATE.WKYR is not an integer. The result will be system-" "missing." msgstr "DATE.WKYR的星期参数不是整数,返回值将为系统缺失值。" #: src/language/expressions/helpers.c:77 msgid "" "The week argument to DATE.WKYR is outside the acceptable range of 1 to 53. " "The result will be system-missing." msgstr "DATE.WKYR的星期参数超出可接收范围1~53,返回值将为系统缺失值。" #: src/language/expressions/helpers.c:99 msgid "" "The day argument to DATE.YRDAY is not an integer. The result will be system-" "missing." msgstr "DATE.YRDAY的天数参数不是整数,返回值将为系统缺失值。" #: src/language/expressions/helpers.c:105 msgid "" "The day argument to DATE.YRDAY is outside the acceptable range of 1 to 366. " "The result will be system-missing." msgstr "DATE.YRDAY的天数参数超出范围1~366之外,返回值将为系统缺失值。" #: src/language/expressions/helpers.c:127 msgid "" "The year argument to YRMODA is greater than 47516. The result will be " "system-missing." msgstr "DATE.YRDAY的年数参数大于47516,返回值将为系统缺失值。" #: src/language/expressions/helpers.c:180 #, c-format msgid "" "Unrecognized date unit `%.*s'. Valid date units are `%s', `%s', `%s', `%s', " "`%s', `%s', `%s', and `%s'." msgstr "" "时期单位`%.*s'无法识别。有效的时期单位为`%s', `%s', `%s', `%s', `%s', `%s', `" "%s' 和 `%s'。" #: src/language/expressions/helpers.c:333 #, c-format msgid "Invalid DATESUM method. Valid choices are `%s' and `%s'." msgstr "DATESUM方法无效。有效选项为`%s' 和 `%s'。" #: src/language/expressions/parse.c:261 #, c-format msgid "" "Type mismatch: expression has %s type, but a numeric value is required here." msgstr "类型不匹配:表达式含%s类型,但该处要求数值型。" #: src/language/expressions/parse.c:274 #, c-format msgid "" "Type mismatch: expression has %s type, but a string value is required here." msgstr "类型不匹配:表达式含%s类型,但该处要求字符串。" #: src/language/expressions/parse.c:436 #, c-format msgid "Type mismatch while applying %s operator: cannot convert %s to %s." msgstr "执行%s操作时类型不匹配:不能将%s转换为%s。" #: src/language/expressions/parse.c:650 msgid "" "Chaining relational operators (e.g. `a < b < c') will not produce the " "mathematically expected result. Use the AND logical operator to fix the " "problem (e.g. `a < b AND b < c'). If chaining is really intended, " "parentheses will disable this warning (e.g. `(a < b) < c'.)" msgstr "" "连锁运算(例如:`a < b < c')可能产生与预期不同的结果。使用逻辑运算符AND解决该" "问题(例如:`a < b AND b < c)。若仍要进行连锁运算,使用括号以消除本警告信息" "(如:`(a < b) < c')。" #: src/language/expressions/parse.c:752 msgid "" "The exponentiation operator (`**') is left-associative, even though right-" "associative semantics are more useful. That is, `a**b**c' equals " "`(a**b)**c', not as `a**(b**c)'. To disable this warning, insert " "parentheses." msgstr "" "指数运算符(`**')为向左结合运算符。意味着`a**b**c'=`(a**b)**c',而是不" "`a**(b**c)'。请使用括号以使本警告信息不再出现。" #: src/language/expressions/parse.c:832 #, c-format msgid "Unknown system variable %s." msgstr "未知系统变量%s。" #: src/language/expressions/parse.c:880 #, c-format msgid "Unknown identifier %s." msgstr "未知标识符%s。" #: src/language/expressions/parse.c:1102 #, c-format msgid "%s must have at least %d arguments in list." msgstr "%s必须至少含有%d个参数。" #: src/language/expressions/parse.c:1111 #, c-format msgid "%s must have an even number of arguments in list." msgstr "%s要求参数的数量为偶数。" #: src/language/expressions/parse.c:1114 #, c-format msgid "%s must have multiple of %d arguments in list." msgstr "%s要求参数数量为%d的倍数。" #: src/language/expressions/parse.c:1124 #, c-format msgid "%s function does not accept a minimum valid argument count." msgstr "函数%s不接受最小有效参数数量的参数。" #: src/language/expressions/parse.c:1133 #, c-format msgid "%s requires at least %d valid arguments in list." msgstr "%s要求至少%d个有效参数。" #: src/language/expressions/parse.c:1139 #, c-format msgid "" "With %s, using minimum valid argument count of %d does not make sense when " "passing only %d arguments in list." msgstr "对%s而言,使用最小有效参数数量%d无意义,因为仅传递了%d个参数。" #: src/language/expressions/parse.c:1193 #, c-format msgid "Type mismatch invoking %s as " msgstr "调用%s时类型不匹配" #: src/language/expressions/parse.c:1198 msgid "Function invocation " msgstr "函数调用" #: src/language/expressions/parse.c:1200 msgid " does not match any known function. Candidates are:" msgstr "与已知函数不匹配,可选范围:" #: src/language/expressions/parse.c:1230 #, c-format msgid "No function or vector named %s." msgstr "没有名称为%s的函数或向量。" #: src/language/expressions/parse.c:1292 #, c-format msgid "%s is a PSPP extension." msgstr "%s是PSPP扩展名。" #: src/language/expressions/parse.c:1295 #, c-format msgid "%s is not available in this version of PSPP." msgstr "当前版本的PSPP不支持%s。" #: src/language/expressions/parse.c:1302 #, c-format msgid "%s may not appear after %s." msgstr "%s不能出现在%s之后。" #: src/libpspp/ext-array.c:66 msgid "failed to create temporary file" msgstr "无法创建临时文件" #: src/libpspp/ext-array.c:106 msgid "seeking in temporary file" msgstr "在临时文件中查找" #: src/libpspp/ext-array.c:125 msgid "reading temporary file" msgstr "读取临时文件" #: src/libpspp/ext-array.c:127 msgid "unexpected end of file reading temporary file" msgstr "读取临时文件时文件意外结束" #: src/libpspp/ext-array.c:147 msgid "writing to temporary file" msgstr "写入到临时文件" #: src/libpspp/i18n.c:1128 msgid "Arabic" msgstr "阿拉伯语" #: src/libpspp/i18n.c:1130 msgid "Armenian" msgstr "亚美尼亚语" #: src/libpspp/i18n.c:1131 msgid "Baltic" msgstr "波罗的语" #: src/libpspp/i18n.c:1133 msgid "Celtic" msgstr "凯尔特语" #: src/libpspp/i18n.c:1134 msgid "Central European" msgstr "中欧" #: src/libpspp/i18n.c:1136 msgid "Chinese Simplified" msgstr "简体中文" #: src/libpspp/i18n.c:1138 msgid "Chinese Traditional" msgstr "繁体中文" #: src/libpspp/i18n.c:1140 msgid "Croatian" msgstr "克罗地亚语" #: src/libpspp/i18n.c:1141 msgid "Cyrillic" msgstr "西里尔语" #: src/libpspp/i18n.c:1143 msgid "Cyrillic/Russian" msgstr "西里尔/俄语" #: src/libpspp/i18n.c:1144 msgid "Cyrillic/Ukrainian" msgstr "西里尔/乌克兰语" #: src/libpspp/i18n.c:1146 msgid "Georgian" msgstr "格鲁吉亚语" #: src/libpspp/i18n.c:1147 msgid "Greek" msgstr "希腊语" #: src/libpspp/i18n.c:1148 msgid "Gujarati" msgstr "古吉拉特文" #: src/libpspp/i18n.c:1149 msgid "Gurmukhi" msgstr "古木基文" #: src/libpspp/i18n.c:1150 msgid "Hebrew" msgstr "希伯来语" #: src/libpspp/i18n.c:1152 msgid "Hebrew Visual" msgstr "希伯来符号" #: src/libpspp/i18n.c:1153 msgid "Hindi" msgstr "印地语" #: src/libpspp/i18n.c:1154 msgid "Icelandic" msgstr "冰岛语" #: src/libpspp/i18n.c:1155 msgid "Japanese" msgstr "日语" #: src/libpspp/i18n.c:1157 msgid "Korean" msgstr "韩语" #: src/libpspp/i18n.c:1159 msgid "Nordic" msgstr "挪威语" #: src/libpspp/i18n.c:1160 msgid "Romanian" msgstr "罗马尼亚语" #: src/libpspp/i18n.c:1162 msgid "South European" msgstr "南欧" #: src/libpspp/i18n.c:1163 msgid "Thai" msgstr "泰文" #: src/libpspp/i18n.c:1165 msgid "Turkish" msgstr "土耳其语" #: src/libpspp/i18n.c:1167 msgid "Vietnamese" msgstr "越南语" #: src/libpspp/i18n.c:1169 msgid "Western European" msgstr "西欧" #: src/libpspp/message.c:89 #, c-format msgid "%s: %s" msgstr "%s: %s" #: src/libpspp/message.c:113 msgid "error" msgstr "错误" #: src/libpspp/message.c:115 msgid "warning" msgstr "警告" #: src/libpspp/message.c:118 msgid "note" msgstr "提示" #: src/libpspp/message.c:327 #, c-format msgid "Notes (%d) exceed limit (%d). Suppressing further notes." msgstr "提示(%d)超过上限(%d)。不再提示。" #: src/libpspp/message.c:335 #, c-format msgid "Warnings (%d) exceed limit (%d). Syntax processing will be halted." msgstr "警告(%d)超过上限(%d)。停止语法处理。" #: src/libpspp/message.c:338 #, c-format msgid "Errors (%d) exceed limit (%d). Syntax processing will be halted." msgstr "错误(%d)超过上限(%d)。停止语法处理。" #: src/libpspp/zip-reader.c:202 #, fuzzy, c-format #| msgid "Corrupt file at 0x%llx: Expected %; got %" msgid "%s: corrupt archive at 0x%llx: expected %# but got %#" msgstr "文件于0x%llx处损坏:要求%;实际为%" #: src/libpspp/zip-reader.c:329 src/libpspp/zip-reader.c:449 #, fuzzy, c-format #| msgid "%s: seek failed (%s)." msgid "%s: open failed (%s)" msgstr "%s: 查找失败 (%s)." #: src/libpspp/zip-reader.c:344 #, fuzzy, c-format #| msgid "Cannot find central directory" msgid "%s: cannot find central directory" msgstr "找不到中间目录" #: src/libpspp/zip-reader.c:353 src/libpspp/zip-reader.c:384 #: src/libpspp/zip-reader.c:468 #, fuzzy, c-format #| msgid "%s: seek failed (%s)." msgid "%s: seek failed (%s)" msgstr "%s: 查找失败 (%s)." #: src/libpspp/zip-reader.c:441 #, fuzzy, c-format #| msgid "%s: unknown option `%s'" msgid "%s: unknown member \"%s\"" msgstr "%s: 未知选项 `%s'" #: src/libpspp/zip-reader.c:503 #, fuzzy, c-format #| msgid "" #| "Name mismatch in zip archive. Central directory says `%s'; local file " #| "header says `%s'" msgid "" "%s: name mismatch between central directory (%s) and local file header (%s)" msgstr "zip文档名称不匹配,中央目录上为`%s',而本地文件头上显示为`%s'" #: src/libpspp/zip-reader.c:696 #, fuzzy, c-format #| msgid "Cannot initialize inflator: %s" msgid "%s: cannot initialize inflator (%s)" msgstr "无法初始化膨胀因子:%s" #: src/libpspp/zip-reader.c:751 #, fuzzy, c-format #| msgid "Error inflating: %s" msgid "%s: error inflating \"%s\" (%s)" msgstr "膨胀处理出错:%s" #: src/libpspp/zip-writer.c:97 utilities/pspp-convert.c:346 #, c-format msgid "%s: error opening output file" msgstr "%s:打开输出文件出错" #: src/libpspp/zip-writer.c:169 #, c-format msgid "%s: error seeking in output file" msgstr "%s:输出文件查找出错" #: src/libpspp/zip-writer.c:210 msgid "error creating temporary file" msgstr "创建临时文件时出错" #: src/libpspp/zip-writer.c:279 #, c-format msgid "%s: write failed" msgstr "%s:写入失败" #. TRANSLATORS: This is a format string which, when presented to #. printf like functions, will create a pango markup string to #. display real number in scientific notation. #. #. In its untranslated form, it will display similar to "1.23 x 10^4". You #. can leave it untranslated if this is how scientific notation is usually #. presented in your language. #. #. Some locales (such as German) prefer the centered dot rather than the #. multiplication sign between the mantissa an exponent. In which #. case, you can change "#215;" to "#8901;" or other unicode code #. point as appropriate. #. #. The . in this string does not and should not be changed, since #. that is taken care of by the stdc library. #. #. For information on Pango markup, see #. http://developer.gnome.org/pango/stable/PangoMarkupFormat.html #. #. For tables of unicode code points, see http://unicode.org/charts #. #: src/math/chart-geometry.c:123 #, fuzzy, c-format #| msgid "%%.%dlf×10%d" msgid "%%.%dlf×10%d" msgstr "%%.%dlf×10%d" #: src/math/histogram.c:145 msgid "" "Not creating histogram because the data contains less than 2 distinct values" msgstr "数据含有少于两个不同值,不绘制直方图" #: src/math/percentiles.c:36 msgid "HAverage" msgstr "调和平均值" #: src/math/percentiles.c:38 msgid "Rounded" msgstr "舍入取整" #: src/math/percentiles.c:39 msgid "Empirical" msgstr "经验" #: src/math/percentiles.c:40 msgid "Empirical with averaging" msgstr "经验平均" #: src/math/shapiro-wilk.c:84 msgid "" "One or more weight values are non-integer. Fractional parts will be ignored " "when calculating the Shapiro-Wilk statistic." msgstr "" #: src/output/ascii.c:340 #, c-format msgid "ascii: opening output file `%s'" msgstr "ascii: 打开输出文件`%s'" #: src/output/ascii.c:371 #, c-format msgid "%s: %s must be positive integer or `auto'" msgstr "%s: %s必须为正整数或`auto'" #: src/output/ascii.c:393 #, fuzzy, c-format #| msgid "" #| "ascii: page excluding margins and headers must be at least %d characters " #| "wide by %d lines long, but as configured is only %d characters by %d lines" msgid "" "ascii: page must be at least %d characters wide, but as configured is only " "%d characters" msgstr "" "ascii: 去除边距和文件头的页面宽度至少为%d字符,行数至少为%d,但设置宽度却为%d" "字符、行数为%d行" #: src/output/ascii.c:508 #, c-format msgid "See %s for a chart." msgstr "图表参考%s。" #: src/output/charts/piechart.c:54 msgid "*MISSING*" msgstr "*缺少值*" #: src/output/csv.c:100 src/output/html.c:117 src/output/journal.c:166 #: src/output/msglog.c:68 #, c-format msgid "error opening output file `%s'" msgstr "打开输出文件出错`%s'" #: src/output/driver.c:522 #, c-format msgid "%s is not a valid device type (the choices are `%s' and `%s')" msgstr "%s不是有效设备类型(可选`%s' 及 `%s')" #: src/output/driver.c:536 #, c-format msgid "%s: unknown option `%s'" msgstr "%s: 未知选项 `%s'" #: src/output/driver.c:553 #, c-format msgid "%s: output option missing `='" msgstr "%s: 输出选项缺少`='" #: src/output/driver.c:560 #, c-format msgid "%s: output option specified more than once" msgstr "%s: 输出选项指定多次" #: src/output/html.c:129 msgid "PSPP Output" msgstr "PSPP输入" #: src/output/html.c:266 msgid "No description" msgstr "没有描述" #: src/output/journal.c:69 #, c-format msgid "error writing output file `%s'" msgstr "写入输入文件`%s'时出错" #: src/output/measure.c:68 #, c-format msgid "`%s' is not a valid length." msgstr "长度`%s'无效。" #: src/output/measure.c:96 #, c-format msgid "syntax error in paper size `%s'" msgstr "页面大小`%s'语法错误" #: src/output/measure.c:233 #, c-format msgid "unknown paper type `%.*s'" msgstr "未知的纸张类型`%.*s'" #: src/output/measure.c:251 #, c-format msgid "error opening input file `%s'" msgstr "打开输入文件`%s'出错" #: src/output/measure.c:279 #, c-format msgid "file `%s' does not state a paper size" msgstr "文件`%s'没有设置纸张大小" #: src/output/options.c:112 #, c-format msgid "%s: `%s' is `%s' but a Boolean value is required" msgstr "%s: `%s' 是 `%s',但要求提供一个布尔值" #: src/output/options.c:187 #, c-format msgid "%s: `%s' is `%s' but one of the following is required: %s" msgstr "%s: `%s' 是 `%s',但是要求提供下列当中的一个:%s" #: src/output/options.c:231 #, fuzzy, c-format #| msgid "%s: `%s' is `%s' but a nonnegative integer is required" msgid "%s: `%s' is `%s' but a non-negative integer is required" msgstr "%s: `%s' 是 `%s',但要求提供一个非负整数" #: src/output/options.c:235 #, c-format msgid "%s: `%s' is `%s' but a positive integer is required" msgstr "%s: `%s' 是 `%s',但要求提供一个正整数" #: src/output/options.c:238 #, c-format msgid "%s: `%s' is `%s' but an integer is required" msgstr "%s: `%s' 是 `%s',但要求提供一个整数" #: src/output/options.c:241 #, c-format msgid "%s: `%s' is `%s' but an integer greater than %d is required" msgstr "%s: `%s' 是 `%s',但要求提供一个大于%d的整数" #: src/output/options.c:246 #, c-format msgid "%s: `%s' is `%s' but an integer between %d and %d is required" msgstr "%s: `%s' 是 `%s',但要求提供一个介于%d到%d之间的整数" #: src/output/options.c:325 #, c-format msgid "%s: `%s' is `%s' but a file name that contains `#' is required." msgstr "%s: `%s' 是 `%s',但要求文件包含`#'" #. TRANSLATORS: Do not translate this string. If the script of your language #. reads from right to left (eg Persian, Arabic, Hebrew etc), then replace #. this string with "output-direction-rtl". Otherwise either leave it #. untranslated or copy it verbatim. #: src/output/render.c:994 msgid "output-direction-ltr" msgstr "output-direction-ltr" #: src/output/text-item.c:44 msgid "Page Title" msgstr "" #: src/output/text-item.c:47 msgid "Title" msgstr "" #: src/output/text-item.c:51 msgid "Log" msgstr "" #: src/output/text-item.c:54 msgid "Page Break" msgstr "" #: src/output/cairo.c:520 #, c-format msgid "`%s': bad font specification" msgstr "%s': 字体设置错误" #: src/output/cairo.c:744 #, c-format msgid "" "The defined page is not wide enough to hold at least %d characters in the " "default font. In fact, there's only room for %d characters." msgstr "指定的页面宽度不足容纳默认字体的至少%d个字符,仅能容纳%d个字符。" #: src/output/cairo.c:752 #, c-format msgid "" "The defined page is not long enough to hold at least %d lines in the default " "font. In fact, there's only room for %d lines." msgstr "指定的页面不足容纳默认字体的至少%d行,仅能容纳%d行。" #: src/output/cairo.c:837 #, c-format msgid "error opening output file `%s': %s" msgstr "打开输出文件错误`%s': %s" #: src/output/cairo.c:892 #, c-format msgid "error drawing output for %s driver: %s" msgstr "为驱动%s创建输出时出错:%s" #: src/output/cairo.c:2056 #, c-format msgid "error writing output file `%s': %s" msgstr "写入输入文件`%s'出错: %s" #: src/output/charts/np-plot-cairo.c:37 #, c-format msgid "Normal Q-Q Plot of %s" msgstr "%s的正态分布Q-Q图" #: src/output/charts/np-plot-cairo.c:38 src/output/charts/np-plot-cairo.c:68 msgid "Observed Value" msgstr "观察值" #: src/output/charts/np-plot-cairo.c:39 msgid "Expected Normal" msgstr "期望值" #: src/output/charts/np-plot-cairo.c:67 #, c-format msgid "Detrended Normal Q-Q Plot of %s" msgstr "%s的去除趋势正态Q-Q图" #: src/output/charts/np-plot-cairo.c:69 msgid "Dev from Normal" msgstr "偏离正态值" #: src/output/charts/barchart-cairo.c:65 msgid "Bar Chart" msgstr "条形图" #: src/output/charts/plot-hist-cairo.c:43 #, c-format msgid "N = %.2f" msgstr "总数 = %.2f" #: src/output/charts/plot-hist-cairo.c:52 #, c-format msgid "Mean = %.1f" msgstr "均值 = %.1f" #: src/output/charts/plot-hist-cairo.c:61 #, c-format msgid "Std. Dev = %.2f" msgstr "标准差 = %.2f" #: src/output/charts/plot-hist-cairo.c:110 msgid "HISTOGRAM" msgstr "直方图" #: src/output/charts/roc-chart-cairo.c:36 src/ui/gui/roc.ui:24 msgid "ROC Curve" msgstr "ROC曲线" #: src/output/charts/scree-cairo.c:36 msgid "Scree Plot" msgstr "碎石图" #: src/output/charts/scree-cairo.c:38 msgid "Eigenvalue" msgstr "特征值" #: src/output/charts/spreadlevel-cairo.c:37 #, c-format msgid "Spread vs. Level Plot of %s" msgstr "%s展布 vs. 水平图" #: src/output/charts/spreadlevel-cairo.c:38 msgid "Level" msgstr "水平" #: src/output/charts/spreadlevel-cairo.c:39 msgid "Spread" msgstr "展布" #: src/output/charts/scatterplot-cairo.c:57 #, c-format msgid "Scatterplot %s" msgstr "散点图%s" #: src/output/spv/spv-legacy-decoder.c:2222 msgid "Table lacks cell data." msgstr "" #: src/output/spv/spv-writer.c:68 #, fuzzy, c-format #| msgid "%s: write failed" msgid "%s: create failed" msgstr "%s:写入失败" #: src/output/spv/spv-writer.c:89 #, fuzzy #| msgid "%s: error writing output file" msgid "I/O error writing SPV file" msgstr "%s:写入输出文件错误" #: src/output/spv/spv.c:693 #, fuzzy, c-format #| msgid "failed to create temporary file" msgid "%s: Failed to create XML parser" msgstr "无法创建临时文件" #: src/output/spv/spv.c:718 #, c-format msgid "%s: document is not well-formed" msgstr "" #: src/output/spv/spv.c:726 #, c-format msgid "%s: root node is \"%s\" but \"%s\" was expected" msgstr "" #: src/ui/gui/psppire-acr.c:273 msgid "Add" msgstr "添加" #: src/ui/gui/psppire-acr.c:274 msgid "Edit" msgstr "编辑" #: src/ui/gui/psppire-acr.c:275 msgid "Remove" msgstr "移除" #: src/ui/gui/psppire-buttonbox.c:311 msgid "OK" msgstr "确定" #: src/ui/gui/psppire-buttonbox.c:319 msgid "Go To" msgstr "转到" #: src/ui/gui/psppire-buttonbox.c:327 msgid "Continue" msgstr "继续" #: src/ui/gui/psppire-buttonbox.c:339 src/ui/gui/psppire-import-assistant.c:759 msgid "Paste" msgstr "粘贴" #: src/ui/gui/psppire-buttonbox.c:345 #: src/ui/gui/psppire-dialog-action-aggregate.c:216 #: src/ui/gui/psppire-data-window.c:496 src/ui/gui/psppire-data-window.c:624 #: src/ui/gui/psppire-output-window.c:353 #: src/ui/gui/psppire-syntax-window.c:594 src/ui/gui/psppire-window.c:445 #: src/ui/gui/psppire-window.c:628 msgid "Cancel" msgstr "取消" #: src/ui/gui/psppire-buttonbox.c:351 msgid "Close" msgstr "关闭" #: src/ui/gui/psppire-buttonbox.c:358 src/ui/gui/psppire-import-assistant.c:760 msgid "Reset" msgstr "重置" #: src/ui/gui/psppire-buttonbox.c:365 msgid "Help" msgstr "帮助" #: src/ui/gui/psppire-dialog-action-aggregate.c:213 msgid "Aggregate destination file" msgstr "汇总的目标文件" #: src/ui/gui/psppire-dialog-action-aggregate.c:217 #: src/ui/gui/psppire-data-window.c:493 src/ui/gui/psppire-data-window.c:497 #: src/ui/gui/psppire-output-window.c:354 #: src/ui/gui/psppire-syntax-window.c:595 src/ui/gui/psppire-window.c:449 #: src/ui/gui/aggregate.ui:565 msgid "Save" msgstr "保存" #: src/ui/gui/psppire-dialog-action-aggregate.c:226 #: src/ui/gui/psppire-data-window.c:503 msgid "System Files (*.sav)" msgstr "系统文件(*.sav)" #: src/ui/gui/psppire-dialog-action-aggregate.c:231 #: src/ui/gui/psppire-data-window.c:508 msgid "Compressed System Files (*.zsav)" msgstr "压缩系统文件(*.zsav)" #: src/ui/gui/psppire-dialog-action-aggregate.c:236 #: src/ui/gui/psppire-data-window.c:513 src/ui/gui/psppire-window.c:652 msgid "Portable Files (*.por) " msgstr "便携格式文件(*.por)" #: src/ui/gui/psppire-dialog-action-autorecode.c:337 #: src/ui/gui/psppire-dialog-action-recode.c:535 #: src/ui/gui/psppire-dialog-action-recode-different.c:288 msgid "New" msgstr "新" #: src/ui/gui/psppire-dialog-action-autorecode.c:351 #: src/ui/gui/psppire-dialog-action-recode.c:527 #: src/ui/gui/psppire-dialog-action-recode-different.c:301 msgid "Old" msgstr "旧" #: src/ui/gui/psppire-dialog-action-comments.c:142 #, c-format msgid "Column Number: %d" msgstr "列编号:%d" #: src/ui/gui/psppire-dialog-action-crosstabs.c:71 msgid "Chisq" msgstr "Chisq" #: src/ui/gui/psppire-dialog-action-crosstabs.c:71 msgid "" "Pearson chi-square, likelihood ratio, Fisher’s exact test, continuity " "correction, linear-by-linear association." msgstr "" #: src/ui/gui/psppire-dialog-action-crosstabs.c:74 #: src/language/stats/crosstabs.q:1334 msgid "Phi" msgstr "Phi" #: src/ui/gui/psppire-dialog-action-crosstabs.c:75 msgid "CC" msgstr "CC" #: src/ui/gui/psppire-dialog-action-crosstabs.c:75 #, fuzzy #| msgid "Contingency Coefficient" msgid "Contingency coefficient" msgstr "列联相关系数" #: src/ui/gui/psppire-dialog-action-crosstabs.c:77 msgid "UC" msgstr "UC" #: src/ui/gui/psppire-dialog-action-crosstabs.c:77 #, fuzzy #| msgid "Uncertainty Coefficient" msgid "Uncertainty coefficient" msgstr "不确定性系数" #: src/ui/gui/psppire-dialog-action-crosstabs.c:78 msgid "BTau" msgstr "BTau" #: src/ui/gui/psppire-dialog-action-crosstabs.c:78 #, fuzzy #| msgid "Kendall's tau-b" msgid "Kendall's Tau-b" msgstr "Kendall氏tau-b" #: src/ui/gui/psppire-dialog-action-crosstabs.c:79 msgid "CTau" msgstr "CTau" #: src/ui/gui/psppire-dialog-action-crosstabs.c:79 #, fuzzy #| msgid "Kendall's tau-c" msgid "Kendall's Tau-c" msgstr "Kendall氏tau-c" #: src/ui/gui/psppire-dialog-action-crosstabs.c:80 msgid "Risk" msgstr "风险" #: src/ui/gui/psppire-dialog-action-crosstabs.c:80 #, fuzzy #| msgid "Risk estimate." msgid "Relative Risk estimate" msgstr "风险估计。" #: src/ui/gui/psppire-dialog-action-crosstabs.c:81 #: src/language/stats/crosstabs.q:1338 msgid "Gamma" msgstr "Gamma" #: src/ui/gui/psppire-dialog-action-crosstabs.c:82 msgid "D" msgstr "D" #: src/ui/gui/psppire-dialog-action-crosstabs.c:82 #, fuzzy #| msgid "Somers' d" msgid "Somer's d" msgstr "Somers氏d" #: src/ui/gui/psppire-dialog-action-crosstabs.c:83 #: src/language/stats/crosstabs.q:1344 msgid "Kappa" msgstr "Kappa" #: src/ui/gui/psppire-dialog-action-crosstabs.c:83 msgid "Cohen's Kappa" msgstr "" #: src/ui/gui/psppire-dialog-action-crosstabs.c:84 #: src/language/stats/crosstabs.q:1429 msgid "Eta" msgstr "Eta系数" #: src/ui/gui/psppire-dialog-action-crosstabs.c:85 msgid "Corr" msgstr "相关系数" #: src/ui/gui/psppire-dialog-action-crosstabs.c:85 #, fuzzy #| msgid "Spearman Correlation" msgid "Spearman correlation, Pearson's r" msgstr "Spearman相关" #: src/ui/gui/psppire-dialog-action-crosstabs.c:90 #, fuzzy #| msgid "Frequency" msgid "Frequency Count" msgstr "频率" #: src/ui/gui/psppire-dialog-action-crosstabs.c:91 msgid "Row" msgstr "行" #: src/ui/gui/psppire-dialog-action-crosstabs.c:91 #, fuzzy #| msgid "Percent" msgid "Row percent" msgstr "百分比" #: src/ui/gui/psppire-dialog-action-crosstabs.c:92 msgid "Column" msgstr "列" #: src/ui/gui/psppire-dialog-action-crosstabs.c:92 #, fuzzy #| msgid "Cum Percent" msgid "Column percent" msgstr "累积百分比" #: src/ui/gui/psppire-dialog-action-crosstabs.c:93 #, fuzzy #| msgid "Valid Percent" msgid "Total percent" msgstr "有效百分比" #: src/ui/gui/psppire-dialog-action-crosstabs.c:94 #: src/language/stats/crosstabs.q:1266 msgid "Expected" msgstr "期望值" #: src/ui/gui/psppire-dialog-action-crosstabs.c:94 #, fuzzy #| msgid "Expected Values:" msgid "Expected value" msgstr "期待值:" #: src/ui/gui/psppire-dialog-action-crosstabs.c:96 #: src/language/stats/crosstabs.q:1268 msgid "Std. Residual" msgstr "标准残差" #: src/ui/gui/psppire-dialog-action-crosstabs.c:96 #, fuzzy #| msgid "Std. Residual" msgid "Standardized Residual" msgstr "标准残差" #: src/ui/gui/psppire-dialog-action-crosstabs.c:97 msgid "Adjusted Std. Residual" msgstr "调整后标准残差" #: src/ui/gui/psppire-dialog-action-descriptives.c:45 msgid "Standard error" msgstr "标准误" #: src/ui/gui/psppire-dialog-action-descriptives.c:45 #, fuzzy #| msgid "Standard error of the mean" msgid "Standard error of mean" msgstr "均值标准误" #: src/ui/gui/psppire-dialog-action-descriptives.c:47 #, fuzzy #| msgid "Standard error of the kurtosis" msgid "Kurtosis and standard error of kurtosis" msgstr "峰度标准误" #: src/ui/gui/psppire-dialog-action-descriptives.c:48 #, fuzzy #| msgid "Standard error of the skewness" msgid "Skewness and standard error of skewness" msgstr "偏斜度标准误" #: src/ui/gui/psppire-dialog-action-factor.c:323 #, c-format msgid "_Eigenvalues over %4.2f times the mean eigenvalue" msgstr "大于平均特征根%4.2f倍的特征根(_E)" #: src/ui/gui/psppire-dialog-action-frequencies.c:44 msgid "Standard error of the mean" msgstr "均值标准误" #: src/ui/gui/psppire-dialog-action-frequencies.c:47 msgid "Standard error of the skewness" msgstr "偏斜度标准误" #: src/ui/gui/psppire-dialog-action-frequencies.c:51 msgid "Standard error of the kurtosis" msgstr "峰度标准误" #: src/ui/gui/psppire-dialog-action-oneway.c:175 #, c-format msgid "Contrast %d of %d" msgstr "对照%d,%d" #: src/ui/gui/psppire-dialog-action-paired.c:162 src/ui/gui/examine.ui:282 #: src/ui/gui/indep-samples.ui:334 src/ui/gui/t-test.ui:296 msgid "O_ptions..." msgstr "选项(_O)..." #: src/ui/gui/psppire-dialog-action-paired.c:168 msgid "Paired Samples T Test" msgstr "成对样本T检验" #: src/ui/gui/psppire-dialog-action-recode-different.c:327 msgid "Recode into Different Variables" msgstr "重编码到其他变量" #: src/ui/gui/psppire-dialog-action-recode-different.c:330 msgid "Recode into Different Variables: Old and New Values " msgstr "重编码到其他变量:旧、新值" #: src/ui/gui/psppire-dialog-action-recode-same.c:108 src/ui/gui/recode.ui:391 msgid "Recode into Same Variables" msgstr "重编码为到变量自身" #: src/ui/gui/psppire-dialog-action-recode-same.c:114 msgid "Recode into Same Variables: Old and New Values" msgstr "重编码到变量自身:旧、新值" #: src/ui/gui/psppire-dialog-action-regression.c:40 msgid "Coeff" msgstr "系数" #: src/ui/gui/psppire-dialog-action-regression.c:40 msgid "Show the regression coefficients" msgstr "显示回归系数" #: src/ui/gui/psppire-dialog-action-regression.c:41 msgid "Conf. Interval" msgstr "置信区间" #: src/ui/gui/psppire-dialog-action-regression.c:41 msgid "Show the confidence interval for the regression coefficients" msgstr "显示回归系数的置信区间" #: src/ui/gui/psppire-dialog-action-regression.c:42 msgid "Show the correlation between observed and predicted values" msgstr "显示观测值与估计值的相关性" #: src/ui/gui/psppire-dialog-action-regression.c:43 msgid "Anova" msgstr "方差分析" #: src/ui/gui/psppire-dialog-action-regression.c:43 msgid "Show the analysis of variance table" msgstr "显示方差分析表" #: src/ui/gui/psppire-dialog-action-regression.c:44 msgid "Bcov" msgstr "Bcov" #: src/ui/gui/psppire-dialog-action-regression.c:44 msgid "Show the variance coefficient matrix" msgstr "显示方差系数矩阵" #: src/ui/gui/psppire-dialog-action-regression.c:45 #, fuzzy #| msgid "Total" msgid "Tol" msgstr "总计" #: src/ui/gui/psppire-dialog-action-regression.c:45 #, fuzzy #| msgid "Show the variance coefficient matrix" msgid "Show the variance inflation factor and its reciprocal" msgstr "显示方差系数矩阵" #: src/ui/gui/psppire-dialog-action-select.c:88 #, c-format msgid "Approximately %3d%% of all cases." msgstr "大约所有个案中的%3d%%。" #: src/ui/gui/psppire-dialog-action-select.c:89 #, c-format msgid "Exactly %3d cases from the first %3d cases." msgstr "正好%3d个个案取于前%3d个个案内。" #: src/ui/gui/psppire-dialog-action-select.c:236 #, c-format msgid "%d thru %d" msgstr "%d到%d" #: src/ui/gui/psppire-dialog-action-two-sample.c:180 #: src/ui/gui/k-independent.ui:404 src/ui/gui/k-related.ui:197 msgid "Test Type" msgstr "检验类型" #: src/ui/gui/psppire-dialog-action-two-sample.c:189 msgid "_Wilcoxon" msgstr "_Wilcoxon" #: src/ui/gui/psppire-dialog-action-two-sample.c:190 msgid "_Sign" msgstr "符号(_S)" #: src/ui/gui/psppire-dialog-action-two-sample.c:191 msgid "_McNemar" msgstr "_McNemar" #: src/ui/gui/psppire-dialog-action-two-sample.c:209 msgid "Two-Related-Samples Tests" msgstr "两个相关样本的检验" #: src/ui/gui/psppire-dialog-action-weight.c:74 src/ui/gui/weight.ui:83 #: src/ui/gui/weight.ui:211 msgid "Do not weight cases" msgstr "不对个案加权" #: src/ui/gui/psppire-dialog-action-weight.c:80 #, c-format msgid "Weight cases by %s" msgstr "通过%s加权个案" #: src/ui/gui/psppire-dict.c:95 #, fuzzy #| msgid "Var%d" msgid "Var" msgstr "Var%d" #. TRANSLATORS: This string must be a valid variable name. That means: #. - The string must be at most 64 bytes (not characters) long. #. - The string may not contain whitespace. #. - The first character may not be '$' #. - The first character may not be a digit #. - The final character may not be '.' or '_' #. #: src/ui/gui/psppire-dict.c:385 #, c-format msgid "Var%04d" msgstr "变量%04d" #: src/ui/gui/psppire-dict.c:566 msgid "Duplicate variable name." msgstr "变量名重复" #: src/ui/gui/psppire-dictview.c:617 msgid "Prefer variable labels" msgstr "首选变量标签" #: src/ui/gui/psppire-dictview.c:631 msgid "Default sort order" msgstr "默认排序" #: src/ui/gui/psppire-dictview.c:637 msgid "Unsorted (dictionary order)" msgstr "未排序(字典顺序)" #: src/ui/gui/psppire-dictview.c:642 msgid "Sort by name" msgstr "按名称排序" #: src/ui/gui/psppire-dictview.c:647 msgid "Sort by label" msgstr "按标签排序" #: src/ui/gui/psppire-means-layer.c:95 #, c-format msgid "Layer %d of %d" msgstr "层%d,位于%d内" #: src/ui/gui/psppire-means-layer.c:169 msgid "Forward" msgstr "下一步" #: src/ui/gui/psppire-means-layer.c:170 msgid "Back" msgstr "上一步" #: src/ui/gui/psppire-text-file.c:55 #, c-format msgid "Could not open `%s'" msgstr "无法打开`%s'" #: src/ui/gui/psppire-text-file.c:71 #, c-format msgid "Error reading `%s': %s" msgstr "读取`%s'时出错: %s" #: src/ui/gui/psppire-text-file.c:74 #, c-format msgid "" "Failed to read `%s', because it contains a line over %d bytes long and " "therefore appears not to be a text file." msgstr "读取`%s'失败,文件可能不是一个文本文件,因其中包含一行长度超过%d字节。" #: src/ui/gui/psppire-text-file.c:96 #, c-format msgid "`%s' is empty." msgstr "`%s'为空。" #: src/ui/gui/psppire-val-chooser.c:255 msgid "through" msgstr "通过" #: src/ui/gui/psppire-val-chooser.c:288 msgid "_Value:" msgstr "值(_V):" #: src/ui/gui/psppire-val-chooser.c:289 msgid "_System Missing" msgstr "系统缺失值(_S)" #: src/ui/gui/psppire-val-chooser.c:290 msgid "System _or User Missing" msgstr "系统或用户指定缺失值(_o)" #: src/ui/gui/psppire-val-chooser.c:291 msgid "_Range:" msgstr "范围(_R):" #: src/ui/gui/psppire-val-chooser.c:292 msgid "Range, _LOWEST thru value" msgstr "范围,最低(_L)到值" #: src/ui/gui/psppire-val-chooser.c:293 msgid "Range, value thru _HIGHEST" msgstr "范围,值到最高(_H)" #: src/ui/gui/psppire-val-chooser.c:294 msgid "_All other values" msgstr "所有其他值(_A)" #: src/ui/gui/psppire-var-view.c:153 #, c-format msgid "Var%d" msgstr "Var%d" #: src/ui/source-init-opts.c:72 #, c-format msgid "Algorithm must be either `%s' or `%s'." msgstr "算法必须为`%s' 或 `%s'。" #: src/ui/source-init-opts.c:97 #, c-format msgid "Syntax must be either `%s' or `%s'." msgstr "语法必须为`%s' 或 `%s'。" #: src/ui/terminal/main.c:144 msgid "Error encountered while ERROR=STOP is effective." msgstr "设定了ERROR=STOP,有错误发生。" #: src/ui/terminal/main.c:150 msgid "" "Stopping syntax file processing here to avoid a cascade of dependent command " "failures." msgstr "停止语法文件处理以避免相关指令产生连锁错误。" #: src/ui/terminal/terminal-opts.c:147 #, c-format msgid "" "PSPP, a program for statistical analysis of sampled data.\n" "Usage: %s [OPTION]... FILE...\n" "\n" "Arguments to long options also apply to equivalent short options.\n" "\n" "Output options:\n" " -o, --output=FILE output to FILE, default format from FILE's name\n" " -O format=FORMAT override format for previous -o\n" " -O OPTION=VALUE set output option to customize previous -o\n" " -O device={terminal|listing} override device type for previous -o\n" " -e, --error-file=FILE append errors, warnings, and notes to FILE\n" " --no-output disable default output driver\n" "Supported output formats: %s\n" "\n" "Language options:\n" " -I, --include=DIR append DIR to search path\n" " -I-, --no-include clear search path\n" " -r, --no-statrc disable running rc file at startup\n" " -a, --algorithm={compatible|enhanced}\n" " set to `compatible' if you want output\n" " calculated from broken algorithms\n" " -x, --syntax={compatible|enhanced}\n" " set to `compatible' to disable PSPP extensions\n" " -b, --batch interpret syntax in batch mode\n" " -i, --interactive interpret syntax in interactive mode\n" " --syntax-encoding=ENCODING specify encoding for syntax files\n" " -s, --safer don't allow some unsafe operations\n" "Default search path: %s\n" "\n" "Informative output:\n" " -h, --help display this help and exit\n" " -V, --version output version information and exit\n" "\n" "Non-option arguments are interpreted as syntax files to execute.\n" msgstr "" "PSPP,样本数据统计分析软件。\n" "用法:%s [选项]... 文件名...\n" "\n" "选项有长、短格式,作用相同。\n" "\n" "输出选项:\n" " -o, --output=文件名 输出到文件,格式取决于文件扩展名\n" " -O format=格式名称 覆盖之前选项-O指定的格式\n" " -O OPTION=值 \t 调整之前-o设置的选项\n" " -O device={terminal|listing} 调整之前-o设置的设备类型\n" " -e, --error-file=文件名 将错误、警告和注释追加到文件\n" " --no-output 禁用默认输出\n" "可选的输出格式: %s\n" "\n" "语言选项:\n" " -I, --include=路径 将\"路径\"追加到搜索路径\n" " -I-, --no-include 清空搜索路径\n" " -r, --no-statrc 启动时不运行rc文件\n" " -a, --algorithm={compatible|enhanced}\n" " 设置为`compatible'以输出包含分组算法结果\n" " -x, --syntax={compatible|enhanced}\n" " 设置为`compatible'以禁用PSPP扩展名\n" " -b, --batch 设置语法解释为批处理模式\n" " -i, --interactive 设置语法解释为互动模式\n" " --syntax-encoding=编码 指定语法文件的编码\n" " -s, --safer 禁止不安全的操作\n" "默认搜索路径: %s\n" "\n" "帮助及版本信息:\n" " -h, --help 显示帮助后退出\n" " -V, --version 显示版本信息后退出\n" "\n" "没有任何选项则启动以执行语法文件。\n" #: src/ui/gui/find-dialog.c:197 msgid "Find" msgstr "查找" #: src/ui/gui/find-dialog.c:662 #, c-format msgid "Bad regular expression: %s" msgstr "正则表达式错误:%s" #: src/ui/gui/help-menu.c:70 msgid "A program for the analysis of sampled data" msgstr "样本数据分析软件" #. TRANSLATORS: Do not translate this string. Instead, put the names of the people #. who have helped in the translation. #: src/ui/gui/help-menu.c:80 msgid "translator-credits" msgstr "贵州师范大学生命科学学院选修Shulin Yang讲授的《生物统计学》的同学们。" #: src/ui/gui/help-menu.c:170 #, c-format msgid "Help path conversion error: %s" msgstr "帮助路径转换错误:%s" #: src/ui/gui/help-menu.c:197 #, fuzzy, c-format #| msgid "" #| "Cannot open reference manual via yelp: %s. Cannot open via html: %s with " #| "uri: %s The PSSP manual is also available at %s" msgid "" "Cannot open via html: %s with uri: %s The PSSP manual is also available at %s" msgstr "" "无法用yelp: %s打开使用手册。无法打开html: %s (使用uri为:%s)。PSPP用户手册还" "可以由%s 得到" #: src/ui/gui/help-menu.c:218 msgid "_Help" msgstr "帮助(_H)" #: src/ui/gui/help-menu.c:221 msgid "_About" msgstr "关于(_A)" #: src/ui/gui/help-menu.c:222 msgid "_Reference Manual" msgstr "使用手册(_R)" #: src/ui/gui/main.c:306 msgid "Show version information and exit" msgstr "显示版本信息并退出" #: src/ui/gui/main.c:409 msgid "Do not display the splash screen" msgstr "不显示欢迎屏幕" #: src/ui/gui/main.c:411 msgid "Do not attempt single instance negotiation" msgstr "不以单实例模式运行" #: src/ui/gui/missing-val-dialog.c:217 msgid "" "The maximum length of a missing value for a string variable is 8 in UTF-8." msgstr "UTF-8编码下字串变量缺失值的最大长度为8。" #: src/ui/gui/missing-val-dialog.c:268 msgid "At least one value must be specified" msgstr "至少指定一个值。" #: src/ui/gui/missing-val-dialog.c:298 msgid "Incorrect range specification" msgstr "指定的区域不正确" #: src/ui/gui/psppire-data-editor.c:380 #, fuzzy, c-format #| msgid "%s: %s" msgid "%d : %s" msgstr "%s: %s" #: src/ui/gui/psppire-data-editor.c:391 #, c-format msgid "%'d case" msgid_plural "%'d cases" msgstr[0] "%'d个个案" #: src/ui/gui/psppire-data-editor.c:396 #, c-format msgid "%'d variable" msgid_plural "%'d variables" msgstr[0] "%'d个变量" #: src/ui/gui/psppire-data-editor.c:485 msgid "Case" msgstr "个案" #: src/ui/gui/psppire-data-editor.c:495 msgid "Data View" msgstr "数据视图" #: src/ui/gui/psppire-data-editor.c:505 msgid "Variable View" msgstr "变量视图" #: src/ui/gui/psppire-data-sheet.c:171 src/ui/gui/psppire-data-window.c:1338 msgid "_Insert Case" msgstr "插入个案(_I)" #: src/ui/gui/psppire-data-sheet.c:179 src/ui/gui/psppire-data-window.c:1391 msgid "Cl_ear Cases" msgstr "清除个案(_e)" #: src/ui/gui/psppire-data-sheet.c:305 src/ui/gui/psppire-data-window.c:1337 #: src/ui/gui/psppire-variable-sheet.c:274 msgid "_Insert Variable" msgstr "插入变量(_I)" #: src/ui/gui/psppire-data-sheet.c:314 src/ui/gui/psppire-variable-sheet.c:283 msgid "Cl_ear Variables" msgstr "清除变量(_e)" #: src/ui/gui/psppire-data-sheet.c:326 msgid "Sort _Ascending" msgstr "升序排列(_A)" #: src/ui/gui/psppire-data-sheet.c:333 msgid "Sort _Descending" msgstr "降序排列(_D)" #: src/ui/gui/psppire-data-window.c:175 msgid "Transformations Pending" msgstr "转换未完成" #: src/ui/gui/psppire-data-window.c:191 msgid "Filter off" msgstr "过滤器关闭" #: src/ui/gui/psppire-data-window.c:203 #, c-format msgid "Filter by %s" msgstr "通过%s过滤" #: src/ui/gui/psppire-data-window.c:224 msgid "No Split" msgstr "不拆分" #: src/ui/gui/psppire-data-window.c:233 msgid "Split by " msgstr "拆分" #: src/ui/gui/psppire-data-window.c:261 msgid "Weights off" msgstr "无权重" #: src/ui/gui/psppire-data-window.c:273 #, c-format msgid "Weight by %s" msgstr "通过%s加权" #: src/ui/gui/psppire-data-window.c:518 #: src/ui/gui/psppire-import-assistant.c:681 #: src/ui/gui/psppire-syntax-window.c:607 src/ui/gui/psppire-window.c:669 msgid "All Files" msgstr "所有文件" #: src/ui/gui/psppire-data-window.c:535 msgid "System File" msgstr "系统文件" #: src/ui/gui/psppire-data-window.c:542 msgid "Compressed System File" msgstr "压缩过的系统文件" #: src/ui/gui/psppire-data-window.c:548 msgid "Portable File" msgstr "便携格式文件" #: src/ui/gui/psppire-data-window.c:551 msgid "Format:" msgstr "格式:" #: src/ui/gui/psppire-data-window.c:615 msgid "Delete Existing Dataset?" msgstr "删除现存数据集?" #: src/ui/gui/psppire-data-window.c:619 #, c-format msgid "" "Renaming \"%s\" to \"%s\" will destroy the existing dataset named \"%s\". " "Are you sure that you want to do this?" msgstr "将\"%s\" 重命名为 \"%s\"将破坏已有数据集\"%s\"。是否继续?" #: src/ui/gui/psppire-data-window.c:625 msgid "Delete" msgstr "删除" #: src/ui/gui/psppire-data-window.c:647 #, c-format msgid "Please enter a new name for dataset \"%s\":" msgstr "请给数据集\"%s\"输入新名称:" #: src/ui/gui/psppire-data-window.c:649 msgid "Rename Dataset" msgstr "重命名数据集" #: src/ui/gui/psppire-data-window.c:1199 src/ui/gui/output-window.ui:68 #: src/ui/gui/syntax-editor.ui:22 msgid "_File" msgstr "文件(_F)" #: src/ui/gui/psppire-data-window.c:1203 src/ui/gui/syntax-editor.ui:25 msgid "_New" msgstr "新建(_N)" #: src/ui/gui/psppire-data-window.c:1210 msgid "_Syntax" msgstr "语法文件(_S)" #: src/ui/gui/psppire-data-window.c:1213 src/ui/gui/data-editor.ui:177 #: src/ui/gui/data-editor.ui:189 msgid "_Data" msgstr "数据文件(_D)" #: src/ui/gui/psppire-data-window.c:1220 src/ui/gui/syntax-editor.ui:36 msgid "_Open" msgstr "打开(_O)" #: src/ui/gui/psppire-data-window.c:1223 msgid "_Import Data..." msgstr "导入数据(I)..." #: src/ui/gui/psppire-data-window.c:1231 src/ui/gui/logistic.ui:261 #: src/ui/gui/regression.ui:66 msgid "_Save..." msgstr "保存(_S)" #: src/ui/gui/psppire-data-window.c:1234 msgid "Save _As..." msgstr "另存为(_A)..." #: src/ui/gui/psppire-data-window.c:1237 msgid "_Rename Dataset..." msgstr "重命名数据集(_R)..." #: src/ui/gui/psppire-data-window.c:1248 msgid "_Display Data File Information" msgstr "显示数据文件信息(_D)" #: src/ui/gui/psppire-data-window.c:1255 msgid "Working File" msgstr "工作文件" #: src/ui/gui/psppire-data-window.c:1257 msgid "_External File..." msgstr "外部文件(_E)..." #: src/ui/gui/psppire-data-window.c:1267 msgid "_Recently Used Data" msgstr "最近打开过的数据(_R)" #: src/ui/gui/psppire-data-window.c:1268 msgid "Recently Used _Files" msgstr "最近打开过的文件(_F)" #: src/ui/gui/psppire-data-window.c:1315 src/ui/gui/output-window.ui:82 #: src/ui/gui/syntax-editor.ui:59 msgid "_Quit" msgstr "退出(_Q)" #: src/ui/gui/psppire-data-window.c:1333 src/ui/gui/output-window.ui:89 #: src/ui/gui/syntax-editor.ui:66 msgid "_Edit" msgstr "编辑(_E)" #: src/ui/gui/psppire-data-window.c:1339 msgid "_Go To Variable..." msgstr "转到变量(_G)..." #: src/ui/gui/psppire-data-window.c:1340 msgid "_Go To Case..." msgstr "转到个案(_G)..." #: src/ui/gui/psppire-data-window.c:1364 src/ui/gui/syntax-editor.ui:69 msgid "Cu_t" msgstr "剪切(_t)" #: src/ui/gui/psppire-data-window.c:1373 src/ui/gui/output-window.ui:96 #: src/ui/gui/syntax-editor.ui:74 msgid "_Copy" msgstr "拷贝(_C)" #: src/ui/gui/psppire-data-window.c:1380 src/ui/gui/syntax-editor.ui:79 msgid "_Paste" msgstr "粘贴(_P)" #: src/ui/gui/psppire-data-window.c:1387 msgid "Clear _Variables" msgstr "清除变量(_V)" #: src/ui/gui/psppire-data-window.c:1401 msgid "_Find..." msgstr "查找(_F)" #: src/ui/gui/psppire-data-window.c:1407 src/ui/gui/logistic.ui:246 msgid "_Options..." msgstr "选项(_O)..." #: src/ui/gui/psppire-data-window.c:1676 msgid "Jump to variable" msgstr "跳转到变量" #: src/ui/gui/psppire-data-window.c:1689 msgid "Jump to a case in the data sheet" msgstr "跳转到数据表中的个案" #: src/ui/gui/psppire-data-window.c:1703 msgid "Search for values in the data" msgstr "在数据中搜索值" #: src/ui/gui/psppire-data-window.c:1715 msgid "Create a new case at the current position" msgstr "在当前位置创建个案" #: src/ui/gui/psppire-data-window.c:1727 msgid "Create a new variable at the current position" msgstr "在当前位置创建变量" #: src/ui/gui/psppire-data-window.c:1741 msgid "Split the active dataset" msgstr "分割当前数据集" #: src/ui/gui/psppire-data-window.c:1753 msgid "Weight cases by variable" msgstr "使用变量对个案加权" #: src/ui/gui/psppire-data-window.c:1764 msgid "Show/hide value labels" msgstr "显示/隐藏值标签" #: src/ui/gui/psppire-data-window.c:1904 msgid "Data Editor" msgstr "数据编辑器" #: src/ui/gui/psppire-encoding-selector.c:140 msgid "Automatically Detect" msgstr "自动检测" #: src/ui/gui/psppire-encoding-selector.c:147 msgid "Locale Encoding" msgstr "语言环境编码" #: src/ui/gui/psppire-encoding-selector.c:177 msgid "Character Encoding: " msgstr "字符编码:" #: src/ui/gui/psppire-import-assistant.c:337 msgid "line" msgstr "" #: src/ui/gui/psppire-import-assistant.c:347 msgid "var" msgstr "var" #: src/ui/gui/psppire-import-assistant.c:560 msgid "Importing Spreadsheet Data" msgstr "从工作表导入数据" #: src/ui/gui/psppire-import-assistant.c:686 msgid "Text Files" msgstr "文本文件" #: src/ui/gui/psppire-import-assistant.c:691 msgid "Text (*.txt) Files" msgstr "文本文件(*.txt)" #: src/ui/gui/psppire-import-assistant.c:697 msgid "Plain Text (ASCII) Files" msgstr "纯文本(ASCII)文件" #: src/ui/gui/psppire-import-assistant.c:702 msgid "Comma Separated Value Files" msgstr "逗号分隔值文件" #: src/ui/gui/psppire-import-assistant.c:709 msgid "Tab Separated Value Files" msgstr "制表符分隔值的文件" #: src/ui/gui/psppire-import-assistant.c:714 msgid "Gnumeric Spreadsheet Files" msgstr "Gnumeric工作表文件" #: src/ui/gui/psppire-import-assistant.c:719 msgid "OpenDocument Spreadsheet Files" msgstr "OpenDocument工作表文件" #: src/ui/gui/psppire-import-assistant.c:724 msgid "All Spreadsheet Files" msgstr "所有工作表文件" #: src/ui/gui/psppire-import-assistant.c:733 msgid "Select File to Import" msgstr "选择文件以导入" #: src/ui/gui/psppire-import-assistant.c:770 msgid "Importing Delimited Text Data" msgstr "导入分隔符分隔的文本数据" #: src/ui/gui/psppire-import-assistant.c:865 msgid "Select the First Line" msgstr "选择第一行" #: src/ui/gui/psppire-import-assistant.c:877 msgid "Line" msgstr "行" #: src/ui/gui/psppire-import-assistant.c:931 msgid "" "This assistant will guide you through the process of importing data into " "PSPP from a text file with one line per case, in which fields are separated " "by tabs, commas, or other delimiters.\n" "\n" msgstr "" "本帮助将指导从文本文件中导入数据到PSPP,每次导入一行作为一个个案,行中字段以" "制表符、逗号或其他分隔符隔开。\n" "\n" #: src/ui/gui/psppire-import-assistant.c:941 #, c-format msgid "The selected file contains %'lu line of text. " msgid_plural "The selected file contains %'lu lines of text. " msgstr[0] "选中的文件含有%'lu行文本。" #: src/ui/gui/psppire-import-assistant.c:950 #, c-format msgid "The selected file contains approximately %'lu line of text. " msgid_plural "The selected file contains approximately %'lu lines of text. " msgstr[0] "选中的文件约含有%'lu行文本。" #: src/ui/gui/psppire-import-assistant.c:956 #, c-format msgid "" "Only the first %zu line of the file will be shown for preview purposes in " "the following screens. " msgid_plural "" "Only the first %zu lines of the file will be shown for preview purposes in " "the following screens. " msgstr[0] "接下来预览显示仅显示文件最开始的%zu行。" #: src/ui/gui/psppire-import-assistant.c:965 msgid "You may choose below how much of the file should actually be imported." msgstr "您可在下面选择导入多少文件内容。" #: src/ui/gui/psppire-import-assistant.c:974 #, c-format msgid "Only the first %4d cases" msgstr "仅前%4d个个案" #: src/ui/gui/psppire-import-assistant.c:985 #, c-format msgid "Only the first %3d %% of file (approximately)" msgstr "仅文件的前%3d %%(约数)" #: src/ui/gui/psppire-import-assistant.c:1009 msgid "Select the Lines to Import" msgstr "选择数据行以导入" #: src/ui/gui/psppire-import-assistant.c:1151 msgid "Choose Separators" msgstr "选择分隔符" #: src/ui/gui/psppire-import-assistant.c:1438 msgid "Adjust Variable Formats" msgstr "调整变量格式" #: src/ui/gui/psppire-output-view.c:410 msgid "Message" msgstr "信息" #: src/ui/gui/psppire-output-view.c:543 msgid "failed to create temporary directory during clipboard operation" msgstr "剪贴版操作时创建临时目录失败" #: src/ui/gui/psppire-output-window.c:241 msgid "Infer file type from extension" msgstr "从扩展名推断文件类型" #: src/ui/gui/psppire-output-window.c:242 msgid "SPSS Viewer (*.spv)" msgstr "" #: src/ui/gui/psppire-output-window.c:243 msgid "PDF (*.pdf)" msgstr "PDF (*.pdf)" #: src/ui/gui/psppire-output-window.c:244 msgid "HTML (*.html)" msgstr "HTML (*.html)" #: src/ui/gui/psppire-output-window.c:245 msgid "OpenDocument (*.odt)" msgstr "OpenDocument (*.odt)" #: src/ui/gui/psppire-output-window.c:246 msgid "Text (*.txt)" msgstr "文本文件(*.txt)" #: src/ui/gui/psppire-output-window.c:247 msgid "Text [plain] (*.txt)" msgstr "纯文本文件(*.txt)" #: src/ui/gui/psppire-output-window.c:248 msgid "PostScript (*.ps)" msgstr "PostScript (*.ps)" #: src/ui/gui/psppire-output-window.c:249 msgid "Comma-Separated Values (*.csv)" msgstr "逗号分隔值文件(*.csv)" #: src/ui/gui/psppire-output-window.c:350 msgid "Export Output" msgstr "导出输出结果" #: src/ui/gui/psppire-output-window.c:548 msgid "Output Viewer" msgstr "输出窗口" #: src/ui/gui/psppire-spreadsheet-model.c:237 msgid "(empty)" msgstr "(空)" #: src/ui/gui/psppire-syntax-window.c:226 msgid "Text Search" msgstr "" #: src/ui/gui/psppire-syntax-window.c:229 #, fuzzy #| msgid "OK" msgid "_OK" msgstr "确定" #: src/ui/gui/psppire-syntax-window.c:231 #, fuzzy #| msgid "Cancel" msgid "_Cancel" msgstr "取消" #: src/ui/gui/psppire-syntax-window.c:239 msgid "Text to search for:" msgstr "" #: src/ui/gui/psppire-syntax-window.c:570 #, c-format msgid "Saved file `%s'" msgstr "保存文件`%s'" #: src/ui/gui/psppire-syntax-window.c:591 msgid "Save Syntax" msgstr "保存语法" #: src/ui/gui/psppire-syntax-window.c:601 src/ui/gui/psppire-window.c:657 msgid "Syntax Files (*.sps) " msgstr "语法文件(*.sps)" #: src/ui/gui/psppire-syntax-window.c:970 msgid "Syntax Editor" msgstr "语法编辑器" #: src/ui/gui/psppire-syntax-window.c:990 #, c-format msgid "Cannot load syntax file `%s'" msgstr "无法载入语法文件`%s'" #: src/ui/gui/psppire-variable-sheet.c:412 #, c-format msgid "{%s, %s}..." msgstr "{%s, %s}..." #: src/ui/gui/psppire-var-sheet-header.c:64 #, fuzzy #| msgid "Decimals" msgid "Decimal" msgstr "小数位数" #: src/ui/gui/psppire-var-sheet-header.c:79 msgid "Align" msgstr "对齐" #: src/ui/gui/psppire-var-sheet-header.c:82 msgid "Measure" msgstr "衡量" #: src/ui/gui/psppire-window.c:430 #, c-format msgid "Save the changes to `%s' before closing?" msgstr "关闭前将改动保存到`%s'?" #: src/ui/gui/psppire-window.c:437 #, c-format msgid "" "If you don't save, changes from the last %ld seconds will be permanently " "lost." msgstr "如果选择不保存,之前%ld秒内作的改动将永久丢失。" #: src/ui/gui/psppire-window.c:441 msgid "Close _without saving" msgstr "不保存而关闭(_w)" #: src/ui/gui/psppire-window.c:625 src/ui/gui/psppire-window.c:629 msgid "Open" msgstr "打开" #: src/ui/gui/psppire-window.c:634 msgid "Data and Syntax Files" msgstr "数据和语法文件" #: src/ui/gui/psppire-window.c:646 msgid "System Files (*.sav, *.zsav)" msgstr "系统文件(*.sav, *.zsav)" #: src/ui/gui/psppire-window.c:663 #, fuzzy #| msgid "Syntax Files (*.sps) " msgid "Output Files (*.spv) " msgstr "语法文件(*.sps)" #: src/ui/gui/t-test-options.c:65 #, c-format msgid "Con_fidence Interval: %2d %%" msgstr "置信区间:%2d %%" #: src/ui/gui/val-labs-dialog.c:591 #, c-format msgid "%s = `%s'" msgstr "%s = `%s'" #: src/ui/gui/var-type-dialog.c:541 #, fuzzy #| msgid "Compute Variable: Type and Label" msgid "Variable Type and Format" msgstr "计算变量:类型和标签" #: src/ui/gui/windows-menu.c:92 msgid "_Minimize all Windows" msgstr "最小化所有窗口(_M)" #: src/ui/gui/windows-menu.c:100 msgid "_Split" msgstr "拆分(_S)" #: src/ui/gui/windows-menu.c:132 msgid "_Windows" msgstr "窗口(_W)" #: utilities/pspp-convert.c:67 #, c-format msgid "%s argument must be a single character" msgstr "" #: utilities/pspp-convert.c:265 msgid "exactly two non-option arguments are required; use --help for help" msgstr "必须使用正好两个非选项参数;使用--help查看帮助" #: utilities/pspp-convert.c:276 #, c-format msgid "%s: cannot guess output format (use -O option)" msgstr "%s:不能猜测输出格式类型(使用-O选项)" #: utilities/pspp-convert.c:341 #, c-format msgid "%s: unknown output format (use -O option)" msgstr "%s:未知的输出格式(使用-O选项)" #: utilities/pspp-convert.c:360 #, c-format msgid "%s: error reading input file" msgstr "%s:读取输入文件错误" #: utilities/pspp-convert.c:362 #, c-format msgid "%s: error writing output file" msgstr "%s:写入输出文件错误" #: utilities/pspp-convert.c:409 #, fuzzy, c-format #| msgid "%s: error opening output file" msgid "%s: error opening password file" msgstr "%s:打开输出文件出错" #: utilities/pspp-convert.c:425 #, fuzzy, c-format #| msgid "%s: error reading input file" msgid "" "\n" "%s: password not in file" msgstr "%s:读取输入文件错误" #: utilities/pspp-convert.c:462 #, fuzzy, c-format #| msgid "`%c' is not a valid hex digit" msgid "%s: '%c' is not in alphabet" msgstr "`%c'不是有效的16进制数字" #: utilities/pspp-convert.c:526 msgid "sorry, wrong password" msgstr "抱歉,密码错误" #: utilities/pspp-output.c:92 #, c-format msgid "%s and %s:" msgstr "" #: utilities/pspp-output.c:547 #, c-format msgid "%s: invalid XPath expression" msgstr "" #: utilities/pspp-output.c:716 msgid "missing command name (use --help for help)" msgstr "" #: utilities/pspp-output.c:720 #, c-format msgid "unknown command \"%s\" (use --help for help)" msgstr "" #: utilities/pspp-output.c:728 #, c-format msgid "\"%s\" command takes exactly %d argument" msgid_plural "\"%s\" command takes exactly %d arguments" msgstr[0] "" #: utilities/pspp-output.c:735 #, fuzzy, c-format #| msgid "%s requires at least %d valid arguments in list." msgid "\"%s\" command requires at least %d argument" msgid_plural "\"%s\" command requires at least %d arguments" msgstr[0] "%s要求至少%d个有效参数。" #: utilities/pspp-output.c:742 #, fuzzy, c-format #| msgid "%s requires at least %d valid arguments in list." msgid "\"%s\" command requires between %d and %d arguments" msgstr "%s要求至少%d个有效参数。" #: utilities/pspp-output.c:782 msgid "The following object classes are supported:" msgstr "" #: utilities/pspp-output.c:791 #, c-format msgid "%s: unknown object class (use --select=help for help" msgstr "" #: src/language/utilities/set.q:162 #, c-format msgid "%s must be between 0 and 20." msgstr "%s的值必须介于0与20。" #: src/language/utilities/set.q:172 src/language/utilities/set.q:179 #, c-format msgid "%s must be at least 1." msgstr "%s必须至少为1。" #: src/language/utilities/set.q:205 #, c-format msgid "%s must be at least 1MB" msgstr "%s至少为1MB" #: src/language/utilities/set.q:207 #, c-format msgid "%s must be positive" msgstr "%s必须为正数" #: src/language/utilities/set.q:213 src/language/utilities/set.q:215 #: src/language/utilities/set.q:217 src/language/utilities/set.q:219 #: src/language/utilities/set.q:221 src/language/utilities/set.q:223 #: src/language/utilities/set.q:225 src/language/utilities/set.q:227 #: src/language/utilities/set.q:229 src/language/utilities/set.q:231 #: src/language/utilities/set.q:233 #, c-format msgid "%s is obsolete." msgstr "%s已过时。" #: src/language/utilities/set.q:239 msgid "Active file compression is not implemented." msgstr "活动文件压缩功能未实现。" #: src/language/utilities/set.q:403 #, c-format msgid "%s must be 1500 or later." msgstr "%s必须为1500或之后。" #: src/language/utilities/set.q:410 #, c-format msgid "expecting %s or year" msgstr "要求%s可年份" #: src/language/utilities/set.q:438 src/language/utilities/set.q:535 #, c-format msgid "%s must be at least %d." msgstr "%s必须至少为%d。" #: src/language/utilities/set.q:474 #, c-format msgid "%s is not a recognized encoding or locale name" msgstr "无法识别编码或语言环境名称%s" #: src/language/utilities/set.q:562 #, c-format msgid "" "%s requires numeric output format as an argument. Specified format %s is of " "type string." msgstr "%s要求数字输入格式作为参数,而设定的格式%s是字符串。" #: src/language/utilities/set.q:791 msgid "ISL (32-bit IEEE 754 single, little-endian)" msgstr "ISL (32-位 IEEE 754 单精度,小端序)" #: src/language/utilities/set.q:794 msgid "ISB (32-bit IEEE 754 single, big-endian)" msgstr "ISB (32-位 IEEE 754 单精度,大端序)" #: src/language/utilities/set.q:797 msgid "IDL (64-bit IEEE 754 double, little-endian)" msgstr "IDL (64-位 IEEE 754 双精度,小端序)" #: src/language/utilities/set.q:800 msgid "IDB (64-bit IEEE 754 double, big-endian)" msgstr "IDB (64-位 IEEE 754 双精度,大端序)" #: src/language/utilities/set.q:804 msgid "VF (32-bit VAX F, VAX-endian)" msgstr "VF (32-位 VAX F,VAX-端序)" #: src/language/utilities/set.q:807 msgid "VD (64-bit VAX D, VAX-endian)" msgstr "VD (64-位 VAX D,VAX-端序)" #: src/language/utilities/set.q:810 msgid "VG (64-bit VAX G, VAX-endian)" msgstr "VG (64-位 VAX G,VAX-端序)" #: src/language/utilities/set.q:814 msgid "ZS (32-bit IBM Z hexadecimal short, big-endian)" msgstr "ZS (32-位 IBM Z 短16进制,大端序)" #: src/language/utilities/set.q:817 msgid "ZL (64-bit IBM Z hexadecimal long, big-endian)" msgstr "ZL (64-位 IBM Z 长16进制,大端序)" #: src/language/utilities/set.q:985 #, c-format msgid "%s is %s." msgstr "%s 是 %s。" #: src/language/utilities/set.q:1089 #, c-format msgid "" "Too many %s commands without a %s: at most %d levels of saved settings are " "allowed." msgstr "过多%s命令没有带%s:保存的水平设置最多允许%d水平。" #: src/language/utilities/set.q:1109 #, c-format msgid "%s without matching %s." msgstr "%s没有匹配%s。" #: src/language/stats/crosstabs.q:327 #, c-format msgid "Missing mode %s not allowed in general mode. Assuming %s." msgstr "缺少的模式%s在通用模式中不被允许,假定为%s。" #: src/language/stats/crosstabs.q:444 msgid "Too many cross-tabulation variables or dimensions." msgstr "过多交叉表变量或维度。" #: src/language/stats/crosstabs.q:509 #, c-format msgid "%s must be specified before %s." msgstr "%s必须先于%s之前设定。" #: src/language/stats/crosstabs.q:543 #, c-format msgid "Maximum value (%ld) less than minimum value (%ld)." msgstr "最大值(%ld)少于最小值(%ld)。" #: src/language/stats/crosstabs.q:922 #, fuzzy #| msgid "Summary." msgid "Summary" msgstr "总结。" #: src/language/stats/crosstabs.q:935 #, fuzzy #| msgid "Crosstabs" msgid "Crosstabulation" msgstr "交叉表" #. TRANSLATORS: The %s here describes a crosstabulation. It takes the #. form "var1 * var2 * var3 * ...". #: src/language/stats/crosstabs.q:1013 #, c-format msgid "Crosstabulation %s contained no non-missing cases." msgstr "交叉表%s不含非缺失值。" #: src/language/stats/crosstabs.q:1204 #, fuzzy #| msgid "Missing Values" msgid "Missing value" msgstr "缺失值" #: src/language/stats/crosstabs.q:1263 #, fuzzy #| msgid "row %" msgid "Row %" msgstr "行 %" #: src/language/stats/crosstabs.q:1264 #, fuzzy #| msgid "column %" msgid "Column %" msgstr "列 %" #: src/language/stats/crosstabs.q:1265 #, fuzzy #| msgid "total %" msgid "Total %" msgstr "总计 %" #: src/language/stats/crosstabs.q:1269 #, fuzzy #| msgid "Adjusted Std. Residual" msgid "Adjusted Residual" msgstr "调整后标准残差" #: src/language/stats/crosstabs.q:1288 #, fuzzy #| msgid "Chi-Square Test" msgid "Chi-Square Tests" msgstr "卡方检验" #: src/language/stats/crosstabs.q:1294 msgid "Pearson Chi-Square" msgstr "Pearson卡方" #: src/language/stats/crosstabs.q:1295 msgid "Likelihood Ratio" msgstr "似然比例" #: src/language/stats/crosstabs.q:1296 msgid "Fisher's Exact Test" msgstr "Fisher精确检验" #: src/language/stats/crosstabs.q:1297 msgid "Continuity Correction" msgstr "连续性校正" #: src/language/stats/crosstabs.q:1298 msgid "Linear-by-Linear Association" msgstr "线性对线性关联" #: src/language/stats/crosstabs.q:1299 src/language/stats/crosstabs.q:1345 #: src/language/stats/crosstabs.q:1854 msgid "N of Valid Cases" msgstr "有效个案N" #: src/language/stats/crosstabs.q:1305 #, fuzzy #| msgid "Asymp. Sig. (2-tailed)" msgid "Asymptotic Sig. (2-tailed)" msgstr "渐进显著度(双尾)" #: src/language/stats/crosstabs.q:1319 #, fuzzy #| msgid "Symmetric measures." msgid "Symmetric Measures" msgstr "对称性测度。" #: src/language/stats/crosstabs.q:1324 src/language/stats/crosstabs.q:1364 #: src/language/stats/crosstabs.q:1411 #, fuzzy #| msgid "_Values" msgid "Values" msgstr "值(_V)" #: src/language/stats/crosstabs.q:1326 src/language/stats/crosstabs.q:1413 msgid "Asymp. Std. Error" msgstr "渐进标准误" #: src/language/stats/crosstabs.q:1327 src/language/stats/crosstabs.q:1414 msgid "Approx. T" msgstr "近似 T" #: src/language/stats/crosstabs.q:1328 src/language/stats/crosstabs.q:1415 msgid "Approx. Sig." msgstr "近似显著度" #: src/language/stats/crosstabs.q:1333 src/language/stats/crosstabs.q:1420 msgid "Nominal by Nominal" msgstr "名称变量对名称变量" #: src/language/stats/crosstabs.q:1334 msgid "Cramer's V" msgstr "Cramer's V" #: src/language/stats/crosstabs.q:1334 msgid "Contingency Coefficient" msgstr "列联相关系数" #: src/language/stats/crosstabs.q:1336 src/language/stats/crosstabs.q:1425 msgid "Ordinal by Ordinal" msgstr "顺序变量对顺序变量" #: src/language/stats/crosstabs.q:1337 msgid "Kendall's tau-b" msgstr "Kendall氏tau-b" #: src/language/stats/crosstabs.q:1337 msgid "Kendall's tau-c" msgstr "Kendall氏tau-c" #: src/language/stats/crosstabs.q:1338 msgid "Spearman Correlation" msgstr "Spearman相关" #: src/language/stats/crosstabs.q:1340 msgid "Interval by Interval" msgstr "等距变量对等距变量" #: src/language/stats/crosstabs.q:1341 msgid "Pearson's R" msgstr "Pearson氏R" #: src/language/stats/crosstabs.q:1343 msgid "Measure of Agreement" msgstr "一致性检验" #: src/language/stats/crosstabs.q:1359 #, fuzzy #| msgid "Risk estimate." msgid "Risk Estimate" msgstr "风险估计。" #: src/language/stats/crosstabs.q:1368 #, fuzzy, no-c-format #| msgid "95%% Confidence Interval" msgid "95% Confidence Interval" msgstr "95%%置信区间" #: src/language/stats/crosstabs.q:1389 msgid "Symmetric" msgstr "对称性" #: src/language/stats/crosstabs.q:1391 src/language/stats/crosstabs.q:1396 #, c-format msgid "%s Dependent" msgstr "%s 依赖性" #: src/language/stats/crosstabs.q:1406 #, fuzzy #| msgid "Directional measures." msgid "Directional Measures" msgstr "方向性测度。" #: src/language/stats/crosstabs.q:1422 msgid "Goodman and Kruskal tau" msgstr "Goodman和Kruskal氏tau" #: src/language/stats/crosstabs.q:1423 msgid "Uncertainty Coefficient" msgstr "不确定性系数" #: src/language/stats/crosstabs.q:1426 msgid "Somers' d" msgstr "Somers氏d" #: src/language/stats/crosstabs.q:1428 msgid "Nominal by Interval" msgstr "名义变量对定距变量" #: src/language/stats/crosstabs.q:1826 #, fuzzy, c-format #| msgid "Odds Ratio for %s (%g / %g)" msgid "Odds Ratio for %s" msgstr "%s (%g / %g)的比值比" #: src/language/stats/crosstabs.q:1835 #, fuzzy, c-format #| msgid "For cohort %s = %.*g" msgid "For cohort %s = " msgstr "%s = %.*g 定群" #: src/ui/gui/aggregate.ui:24 msgid "Aggregate Data" msgstr "数据汇总" #: src/ui/gui/aggregate.ui:126 msgid "_Break variable(s)" msgstr "分组变量(_B)" #: src/ui/gui/aggregate.ui:179 msgid "Variable Name: " msgstr "变量名称:" #: src/ui/gui/aggregate.ui:215 msgid "Variable Label: " msgstr "变量标签:" #: src/ui/gui/aggregate.ui:252 msgid "Function: " msgstr "函数" #: src/ui/gui/aggregate.ui:327 msgid "Argument 1: " msgstr "参数1:" #: src/ui/gui/aggregate.ui:364 msgid "Argument 2: " msgstr "参数2:" #: src/ui/gui/aggregate.ui:428 msgid "Aggregated variables" msgstr "汇总后的变量" #: src/ui/gui/aggregate.ui:469 msgid "_Add aggregated variables to the active dataset" msgstr "将汇总后产生的变量添加到活动数据集(_A)" #: src/ui/gui/aggregate.ui:486 msgid "_Replace the current dataset with the aggregated variables" msgstr "用汇总后的变量更换当前数据集(_R)" #: src/ui/gui/aggregate.ui:504 msgid "_Write a new data file containing only the aggregated variables" msgstr "将汇总后的变量写入新文件(_W)" #: src/ui/gui/aggregate.ui:544 msgid "label" msgstr "标签" #: src/ui/gui/aggregate.ui:593 msgid "File is _already sorted on break variable(s)" msgstr "文件中分组变量已排序(_a)" #: src/ui/gui/aggregate.ui:609 msgid "Sort file before a_ggregating" msgstr "会计前先排序(_g)" #: src/ui/gui/aggregate.ui:630 msgid "Options for very large datasets" msgstr "超大数据集选项" #: src/ui/gui/autorecode.ui:24 msgid "Automatic Recode" msgstr "自动重编码" #: src/ui/gui/autorecode.ui:120 msgid "Variable -> New Name" msgstr "变量 -> 新名称" #: src/ui/gui/autorecode.ui:145 msgid "_Lowest value" msgstr "最低值(_L)" #: src/ui/gui/autorecode.ui:163 msgid "_Highest value" msgstr "最高值(_H)" #: src/ui/gui/autorecode.ui:185 msgid "Recode starting from" msgstr "重编码始于" #: src/ui/gui/autorecode.ui:204 msgid "_New Name" msgstr "新名称(_N)" #: src/ui/gui/autorecode.ui:227 msgid "_Add New Name" msgstr "添加新名称(_A)" #: src/ui/gui/autorecode.ui:285 msgid "_Use the same recoding scheme for all variables" msgstr "对所有变量使用相同重编码规则(_U)" #: src/ui/gui/autorecode.ui:301 msgid "Treat _blank string values as missing" msgstr "空白字符串当缺失值处理(_b)" #: src/ui/gui/binomial.ui:86 msgid "_Test Variable List:" msgstr "检验变量列表(_T):" #: src/ui/gui/binomial.ui:160 src/ui/gui/chi-square.ui:281 msgid "_Get from data" msgstr "从数据获取(_G)" #: src/ui/gui/binomial.ui:181 src/ui/gui/indep-samples.ui:150 msgid "_Cut point:" msgstr "分割点(_C):" #: src/ui/gui/binomial.ui:225 msgid "Define Dichotomy" msgstr "设定二分变量" #: src/ui/gui/binomial.ui:245 msgid "Test _Proportion:" msgstr "检验比例(_P):" #: src/ui/gui/compute.ui:32 msgid "Compute Variable: Type and Label" msgstr "计算变量:类型和标签" #: src/ui/gui/compute.ui:67 msgid "Use _expression as label" msgstr "使用表达式作标签(_e)" #: src/ui/gui/compute.ui:90 msgid "_Label:" msgstr "标签(_L):" #: src/ui/gui/compute.ui:194 msgid "_String" msgstr "字符串(_S)" #: src/ui/gui/compute.ui:287 msgid "_Numeric" msgstr "数字型(_N)" #: src/ui/gui/compute.ui:343 msgid "Compute Variable" msgstr "变量计算" #: src/ui/gui/compute.ui:381 msgid "Target _Variable:" msgstr "目标变量(_V):" #: src/ui/gui/compute.ui:412 msgid "_Type & Label..." msgstr "类型和标签(_T)..." #: src/ui/gui/compute.ui:469 msgid "=" msgstr "=" #: src/ui/gui/compute.ui:526 msgid "_Numeric Expressions:" msgstr "表达式(_N)" #: src/ui/gui/compute.ui:598 msgid "_Functions:" msgstr "函数(_F):" #: src/ui/gui/compute.ui:678 msgid "_If..." msgstr "如果(_I)..." #: src/ui/gui/barchart.ui:24 msgid "Barchart" msgstr "条形图" #: src/ui/gui/barchart.ui:112 msgid "Category A_xis:" msgstr "类别轴(_x)" #: src/ui/gui/barchart.ui:140 msgid "_N of cases" msgstr "个案数量(_N)" #: src/ui/gui/barchart.ui:158 msgid "_Cum. n of cases" msgstr "累积个案数量(_C)" #: src/ui/gui/barchart.ui:174 msgid "Other _summary function" msgstr "其他汇总函数(_s)" #: src/ui/gui/barchart.ui:191 msgid "% of c_ases" msgstr "个案数量百分比(_a)" #: src/ui/gui/barchart.ui:207 msgid "C_um. % of cases" msgstr "累积个案数量百分比(_u)" #: src/ui/gui/barchart.ui:270 src/ui/gui/histogram.ui:100 msgid "_Variable:" msgstr "变量(_V):" #: src/ui/gui/barchart.ui:308 msgid "Bars Represent" msgstr "柱条代表:" #: src/ui/gui/barchart.ui:340 msgid "Category C_luster:" msgstr "类别群(_l)" #: src/ui/gui/correlation.ui:24 msgid "Bivariate Correlations" msgstr "二元相关性" #: src/ui/gui/correlation.ui:148 msgid "Pearso_n" msgstr "Pearso_n" #: src/ui/gui/correlation.ui:164 msgid "_Kendall's tau-b" msgstr "_Kendall's tau-b" #: src/ui/gui/correlation.ui:180 msgid "_Spearman" msgstr "_Spearman" #: src/ui/gui/correlation.ui:200 msgid "Correlation Coefficients" msgstr "相关系数" #: src/ui/gui/correlation.ui:224 msgid "_Two-tailed" msgstr "双尾(_T)" #: src/ui/gui/correlation.ui:241 msgid "One-tai_led" msgstr "单尾(_l)" #: src/ui/gui/correlation.ui:262 msgid "Test of Significance" msgstr "显著度检验" #: src/ui/gui/correlation.ui:275 msgid "_Flag significant correlations" msgstr "标记显著的系数(_F)" #: src/ui/gui/count.ui:24 msgid "Count Occurrences of Values within Cases" msgstr "计数个案中值出现的次数" #: src/ui/gui/count.ui:117 msgid "Numeric _Variables:" msgstr "数字型变量(_V):" #: src/ui/gui/count.ui:147 msgid "_Target Variable:" msgstr "目的变量(_T):" #: src/ui/gui/count.ui:178 msgid "Target _Label:" msgstr "目的标签(_L):" #: src/ui/gui/count.ui:192 msgid "_Define Values..." msgstr "指定值(_D)..." #: src/ui/gui/count.ui:257 msgid "Count Values within Cases: Values to Count" msgstr "个案中值的数量:要计数的值" #: src/ui/gui/count.ui:305 msgid "Values _to Count:" msgstr "要计数的值(_t):" #: src/ui/gui/comments.ui:25 msgid "Data File Comments" msgstr "数据文件注释" #: src/ui/gui/comments.ui:49 msgid "Comments:" msgstr "注释:" #: src/ui/gui/comments.ui:106 msgid "Display comments in output" msgstr "输出中显示注释" #: src/ui/gui/comments.ui:127 msgid "Column Number: 0" msgstr "字段数量:0" #: src/ui/gui/crosstabs.ui:25 msgid "Crosstabs: Cells" msgstr "交叉表:单元格" #: src/ui/gui/crosstabs.ui:67 msgid "Cell Display" msgstr "单元格显示" #: src/ui/gui/crosstabs.ui:99 msgid "Crosstabs" msgstr "交叉表" #: src/ui/gui/crosstabs.ui:150 msgid "_Rows" msgstr "行(_R)" #: src/ui/gui/crosstabs.ui:195 msgid "_Columns" msgstr "列(_C)" #: src/ui/gui/crosstabs.ui:242 msgid "_Format..." msgstr "格式(_F)..." #: src/ui/gui/crosstabs.ui:256 src/ui/gui/examine.ui:267 msgid "_Statistics..." msgstr "统计量(_S)..." #: src/ui/gui/crosstabs.ui:270 msgid "Ce_lls..." msgstr "单元格(_l)..." #: src/ui/gui/crosstabs.ui:348 msgid "Crosstabs: Format" msgstr "交叉表:格式" #: src/ui/gui/crosstabs.ui:371 msgid "Print tables" msgstr "输出表格" #: src/ui/gui/crosstabs.ui:387 msgid "Pivot" msgstr "旋转" #: src/ui/gui/crosstabs.ui:403 src/ui/gui/sort.ui:157 msgid "Ascending" msgstr "升序" #: src/ui/gui/crosstabs.ui:455 msgid "Crosstabs: Statistics" msgstr "交叉表:统计量" #: src/ui/gui/chi-square.ui:30 msgid "Chi-Square Test" msgstr "卡方检验" #: src/ui/gui/chi-square.ui:82 msgid "All categor_ies equal" msgstr "所有类别相等(_i)" #: src/ui/gui/chi-square.ui:103 msgid "_Values" msgstr "值(_V)" #: src/ui/gui/chi-square.ui:159 msgid "Expected Values:" msgstr "期待值:" #: src/ui/gui/chi-square.ui:204 msgid "Test _Variables" msgstr "检验变量(_V)" #: src/ui/gui/chi-square.ui:298 msgid "Use _specified range" msgstr "指定范围(_s)" #: src/ui/gui/chi-square.ui:323 msgid "_Lower:" msgstr "下限(_L):" #: src/ui/gui/chi-square.ui:337 msgid "_Upper:" msgstr "上限(_U):" #: src/ui/gui/chi-square.ui:381 msgid "Expected Range:" msgstr "期待范围:" #: src/ui/gui/descriptives.ui:131 src/ui/gui/factor.ui:797 #: src/ui/gui/recode.ui:638 msgid "_Variables:" msgstr "变量(_V):" #: src/ui/gui/descriptives.ui:176 msgid "S_tatistics:" msgstr "统计量(_t):" #: src/ui/gui/descriptives.ui:230 msgid "_Exclude entire case if any selected variable is missing" msgstr "排除有变量缺失的个案(_E)" #: src/ui/gui/descriptives.ui:247 msgid "_Include user-missing data in analysis" msgstr "将用户定义的缺失值包含于数据分析(_I)" #: src/ui/gui/descriptives.ui:264 msgid "Save _Z-scores of selected variables as new variables" msgstr "将选中变量的Z-分数保存为新变量(_Z)" #: src/ui/gui/descriptives.ui:286 msgid "Options:" msgstr "选项:" #: src/ui/gui/examine.ui:25 msgid "Explore" msgstr "数据探索" #: src/ui/gui/examine.ui:69 msgid "_Label Cases by:" msgstr "个案标签(_L):" #: src/ui/gui/examine.ui:116 msgid "_Factor List:" msgstr "因子列表(_F):" #: src/ui/gui/examine.ui:163 src/ui/gui/means.ui:126 msgid "_Dependent List:" msgstr "因变量列表(_D):" #: src/ui/gui/examine.ui:331 msgid "Explore: Options" msgstr "数据探索:选项" #: src/ui/gui/examine.ui:355 src/ui/gui/t-test.ui:81 msgid "Exclude cases _listwise" msgstr "去除有缺失值的任何记录(_l)" #: src/ui/gui/examine.ui:373 msgid "Exclude cases _pairwise" msgstr "因、自变量都有缺失值才去除该记录(_p)" #: src/ui/gui/examine.ui:392 msgid "_Report values" msgstr "报告值(_R)" #: src/ui/gui/examine.ui:449 msgid "Explore: Statistics" msgstr "数据探索:统计量" #: src/ui/gui/examine.ui:468 src/ui/gui/oneway.ui:576 msgid "_Descriptives" msgstr "描述性统计分析(_D)" #: src/ui/gui/examine.ui:485 msgid "_Extremes" msgstr "极值(_E)" #: src/ui/gui/examine.ui:502 msgid "_Percentiles" msgstr "百分位(_P)" #: src/ui/gui/goto-case.ui:31 msgid "Goto Case" msgstr "转到个案" #: src/ui/gui/goto-case.ui:52 msgid "Goto Case Number:" msgstr "根据标号跳转到个案:" #: src/ui/gui/factor.ui:39 msgid "Factor Analysis: Rotation" msgstr "因子分析:旋转" #: src/ui/gui/factor.ui:70 msgid "_None" msgstr "无(_N)" #: src/ui/gui/factor.ui:87 msgid "_Varimax" msgstr "方差最大化旋转(_V)" #: src/ui/gui/factor.ui:104 msgid "_Quartimax" msgstr "四次幂最大化旋转(_Q)" #: src/ui/gui/factor.ui:123 msgid "_Equimax" msgstr "等量最大法(_E)" #: src/ui/gui/factor.ui:146 msgid "Method" msgstr "方法" #: src/ui/gui/factor.ui:159 msgid "_Display rotated solution" msgstr "显示旋转结果(_D)" #: src/ui/gui/factor.ui:181 src/ui/gui/factor.ui:582 msgid "Ma_ximum iterations for convergence:" msgstr "收敛前最大迭代次数(_x):" #: src/ui/gui/factor.ui:241 src/ui/gui/factor.ui:255 msgid "Principal Components Analysis" msgstr "主成分分析" #: src/ui/gui/factor.ui:246 src/ui/gui/factor.ui:258 msgid "Principal Axis Factoring" msgstr "主轴因素" #: src/ui/gui/factor.ui:264 msgid "Factor Analysis: Extraction" msgstr "因子分析:提取" #: src/ui/gui/factor.ui:290 msgid "_Method: " msgstr "方法(_M):" #: src/ui/gui/factor.ui:345 msgid "Co_rrelation matrix" msgstr "相关矩阵(_r)" #: src/ui/gui/factor.ui:361 msgid "Co_variance matrix" msgstr "协方差矩阵(_v)" #: src/ui/gui/factor.ui:382 msgid "Analyze" msgstr "分析" #: src/ui/gui/factor.ui:407 msgid "_Unrotated factor solution" msgstr "无旋转因子方案(_U)" #: src/ui/gui/factor.ui:423 msgid "_Scree plot" msgstr "碎石图(_S)" #: src/ui/gui/factor.ui:443 src/ui/gui/histogram.ui:146 src/ui/gui/roc.ui:329 msgid "Display" msgstr "显示" #: src/ui/gui/factor.ui:526 msgid "_Number of factors:" msgstr "因子数量(_N):" #: src/ui/gui/factor.ui:563 msgid "Extract" msgstr "提取" #: src/ui/gui/factor.ui:640 msgid "Factor Analysis" msgstr "因子分析" #: src/ui/gui/factor.ui:672 src/ui/gui/data-editor.ui:266 msgid "_Descriptives..." msgstr "描述统计(_D)..." #: src/ui/gui/factor.ui:685 msgid "_Extraction..." msgstr "提取(_E)..." #: src/ui/gui/factor.ui:699 msgid "_Rotations..." msgstr "旋转(_R)..." #: src/ui/gui/find.ui:25 msgid "Find Case" msgstr "查找个案" #: src/ui/gui/find.ui:117 msgid "Variable:" msgstr "变量:" #: src/ui/gui/find.ui:157 src/ui/gui/val-labs-dialog.ui:113 msgid "Value:" msgstr "值:" #: src/ui/gui/find.ui:180 msgid "Search value labels" msgstr "查找值标签" #: src/ui/gui/find.ui:210 msgid "Regular expression Match" msgstr "正刚表达式匹配" #: src/ui/gui/find.ui:227 msgid "Search substrings" msgstr "字符串部分匹配" #: src/ui/gui/find.ui:244 msgid "Wrap around" msgstr "换行" #: src/ui/gui/find.ui:260 msgid "Search backward" msgstr "后退查找" #: src/ui/gui/frequencies.ui:32 msgid "Frequencies: Frequency Tables" msgstr "频率:频率表" #: src/ui/gui/frequencies.ui:67 msgid "_Always" msgstr "总是(_A)" #: src/ui/gui/frequencies.ui:85 msgid "_Never" msgstr "从不(_N)" #: src/ui/gui/frequencies.ui:107 msgid "If no _more than " msgstr "若不超过(_m)" #: src/ui/gui/frequencies.ui:129 src/ui/gui/frequencies.ui:454 msgid "100" msgstr "100" #: src/ui/gui/frequencies.ui:145 msgid "values" msgstr "值" #: src/ui/gui/frequencies.ui:167 msgid "Display frequency tables" msgstr "显示频率表" #: src/ui/gui/frequencies.ui:194 msgid "A_scending value" msgstr "上升的值(_s)" #: src/ui/gui/frequencies.ui:212 msgid "D_escending value" msgstr "下降的值(_e)" #: src/ui/gui/frequencies.ui:230 msgid "Ascending _frequency" msgstr "上升的频率(_f)" #: src/ui/gui/frequencies.ui:248 msgid "Descending f_requency" msgstr "下降的频率(_e)" #: src/ui/gui/frequencies.ui:271 msgid "Order by" msgstr "排序方式" #: src/ui/gui/frequencies.ui:324 msgid "Frequencies: Charts" msgstr "频率:图表" #: src/ui/gui/frequencies.ui:356 msgid "Scale:" msgstr "缩放:" #: src/ui/gui/frequencies.ui:366 msgid "_Frequencies" msgstr "频率(_F)" #: src/ui/gui/frequencies.ui:383 msgid "_Percentages" msgstr "百分比(_P)" #: src/ui/gui/frequencies.ui:407 msgid "Exclude values _below " msgstr "排除小于下值的值(_b)" #: src/ui/gui/frequencies.ui:422 msgid "Exclude values _above " msgstr "排除大于下值的值(_a)" #: src/ui/gui/frequencies.ui:441 src/ui/gui/reliability.ui:227 msgid "0" msgstr "0" #: src/ui/gui/frequencies.ui:469 msgid "Chart Formatting" msgstr "图表格式" #: src/ui/gui/frequencies.ui:494 msgid "Draw _histograms" msgstr "绘制直方图(_h)" #: src/ui/gui/frequencies.ui:510 msgid "Superimpose _normal curve" msgstr "叠加正态曲线(_n)" #: src/ui/gui/frequencies.ui:530 msgid "Histograms" msgstr "直方图" #: src/ui/gui/frequencies.ui:555 msgid "Draw _bar charts" msgstr "绘制条形图(_b)" #: src/ui/gui/frequencies.ui:575 msgid "Bar Charts" msgstr "条形图" #: src/ui/gui/frequencies.ui:600 msgid "Draw _pie charts" msgstr "绘制饼状图(_p)" #: src/ui/gui/frequencies.ui:616 msgid "Include slices for _missing values" msgstr "饼状图中绘制缺失值(_m)" #: src/ui/gui/frequencies.ui:636 msgid "Pie Charts" msgstr "饼状图" #: src/ui/gui/frequencies.ui:725 src/ui/gui/rank.ui:489 msgid "_Variable(s):" msgstr "变量(_V):" #: src/ui/gui/frequencies.ui:769 msgid "_Statistics:" msgstr "统计量(_S):" #: src/ui/gui/frequencies.ui:783 msgid "Include _missing values" msgstr "包含缺失值(_m)" #: src/ui/gui/frequencies.ui:806 msgid "Ch_arts..." msgstr "图表(_a)..." #: src/ui/gui/frequencies.ui:821 msgid "Frequency _Tables..." msgstr "频率表(_T)..." #: src/ui/gui/histogram.ui:24 msgid "Histogram" msgstr "直方图" #: src/ui/gui/histogram.ui:126 msgid "_Display normal curve" msgstr "显示正态曲线(_D)" #: src/ui/gui/indep-samples.ui:25 src/ui/gui/k-independent.ui:35 msgid "Define Groups" msgstr "定义组" #: src/ui/gui/indep-samples.ui:75 msgid "Group_2 value:" msgstr "第2组(_2):" #: src/ui/gui/indep-samples.ui:89 msgid "Group_1 value:" msgstr "第1组(_1):" #: src/ui/gui/indep-samples.ui:190 msgid "_Use specified values:" msgstr "使用指定的值(_U):" #: src/ui/gui/indep-samples.ui:259 msgid "Independent-Samples T Test" msgstr "独立样本T检验" #: src/ui/gui/indep-samples.ui:319 msgid "_Define Groups..." msgstr "定义组(_D)..." #: src/ui/gui/indep-samples.ui:401 src/ui/gui/t-test.ui:211 msgid "_Test Variable(s):" msgstr "检验变量(_T)" #: src/ui/gui/indep-samples.ui:454 src/ui/gui/k-independent.ui:165 msgid "_Grouping Variable:" msgstr "分组变量(_G)" #: src/ui/gui/k-independent.ui:63 msgid "_Upper limit:" msgstr "上限(_U):" #: src/ui/gui/k-independent.ui:77 msgid "_Lower limit:" msgstr "下限(_L):" #: src/ui/gui/k-independent.ui:136 msgid "Tests for Several Independent Samples" msgstr "样本独立性检验" #: src/ui/gui/k-independent.ui:208 src/ui/gui/ks-one-sample.ui:131 msgid "Test _Variable List:" msgstr "检验变量列表(_V)" #: src/ui/gui/k-independent.ui:320 msgid "_Define Groups" msgstr "定义组(_G)" #: src/ui/gui/k-independent.ui:365 msgid "_Kruskal-Wallis H" msgstr "_Kruskal-Wallis H" #: src/ui/gui/k-independent.ui:382 src/ui/gui/runs.ui:140 msgid "_Median" msgstr "中位数(_M)" #: src/ui/gui/k-means.ui:24 msgid "K-Means Cluster Analysis" msgstr "K-均值聚类分析" #: src/ui/gui/k-means.ui:122 msgid "N_umber of Clusters: " msgstr "类群数量(_u):" #: src/ui/gui/k-related.ui:24 msgid "Tests for Several Related Samples" msgstr "相关样本检验" #: src/ui/gui/k-related.ui:113 msgid "_Test Variables:" msgstr "检验变量(_T):" #: src/ui/gui/k-related.ui:145 msgid "_Friedman" msgstr "_Friedman" #: src/ui/gui/k-related.ui:161 msgid "_Kendall's W" msgstr "_Kendall's W" #: src/ui/gui/k-related.ui:177 msgid "_Cochran's Q" msgstr "_Cochran's Q" #: src/ui/gui/ks-one-sample.ui:163 msgid "_Normal" msgstr "正态分布(_N)" #: src/ui/gui/ks-one-sample.ui:181 msgid "_Poisson" msgstr "泊松分布(_P)" #: src/ui/gui/ks-one-sample.ui:198 msgid "_Uniform" msgstr "均匀分布(_U)" #: src/ui/gui/ks-one-sample.ui:213 msgid "_Exponential" msgstr "指数分布(_E)" #: src/ui/gui/ks-one-sample.ui:232 msgid "Test Distribution" msgstr "检验分布" #: src/ui/gui/logistic.ui:42 msgid "Logistic Regression: Options" msgstr "逻辑斯蒂回归:选项" #: src/ui/gui/logistic.ui:66 msgid "CI for _exp(B): " msgstr "_exp(B)的置信区间:" #: src/ui/gui/logistic.ui:97 msgid "%" msgstr "%" #: src/ui/gui/logistic.ui:146 msgid "Classification cu_toff: " msgstr "分类分割点(_t):" #: src/ui/gui/logistic.ui:159 msgid "_Maximum Iterations: " msgstr "最大迭代次数(_M):" #: src/ui/gui/logistic.ui:177 msgid "Include _constant in model" msgstr "模型中包含常量(_c)" #: src/ui/gui/logistic.ui:219 msgid "Logistic Regression" msgstr "逻辑斯蒂回归" #: src/ui/gui/logistic.ui:364 src/ui/gui/regression.ui:185 msgid "_Dependent" msgstr "因变量(_D)" #: src/ui/gui/logistic.ui:412 src/ui/gui/regression.ui:232 msgid "_Independent" msgstr "自变量(_I)" #: src/ui/gui/means.ui:25 msgid "Means" msgstr "均值" #: src/ui/gui/means.ui:179 msgid "_Independent List:" msgstr "自变量列表(_I):" #: src/ui/gui/missing-val-dialog.ui:48 msgid "_No missing values" msgstr "不包含缺失值(_N)" #: src/ui/gui/missing-val-dialog.ui:136 msgid "_Discrete missing values" msgstr "离散缺失值(_D)" #: src/ui/gui/missing-val-dialog.ui:172 msgid "_Low:" msgstr "低(_L):" #: src/ui/gui/missing-val-dialog.ui:197 msgid "_High:" msgstr "高(_H):" #: src/ui/gui/missing-val-dialog.ui:221 msgid "Di_screte value:" msgstr "离散值(_s):" #: src/ui/gui/missing-val-dialog.ui:245 msgid "_Range plus one optional discrete missing value" msgstr "区间及一个可选离散缺失值(_R)" #: src/ui/gui/oneway.ui:25 msgid "One-Way ANOVA: Contrasts" msgstr "单因素方差分析:对照" #: src/ui/gui/oneway.ui:107 msgid "_Coefficients:" msgstr "系数(_C):" #: src/ui/gui/oneway.ui:161 msgid "Coefficient Total: " msgstr "系数总和:" #: src/ui/gui/oneway.ui:198 msgid "Contrast 1 of 1" msgstr "对照1当中的1" #: src/ui/gui/oneway.ui:234 #, fuzzy #| msgid "One-Way ANOVA: Contrasts" msgid "One-Way ANOVA: Post-Hoc" msgstr "单因素方差分析:对照" #: src/ui/gui/oneway.ui:270 #, fuzzy #| msgid "Games-Howell" msgid "Games Howell" msgstr "Games-Howell" #: src/ui/gui/oneway.ui:287 msgid "Fisher's LSD" msgstr "" #: src/ui/gui/oneway.ui:379 msgid "One-Way ANOVA" msgstr "单因素方差分析" #: src/ui/gui/oneway.ui:408 msgid "_Factor:" msgstr "因素(_F):" #: src/ui/gui/oneway.ui:451 msgid "Dependent _Variable(s):" msgstr "因变量(_V):" #: src/ui/gui/oneway.ui:593 msgid "_Homogeneity" msgstr "齐性(_H)" #: src/ui/gui/oneway.ui:637 msgid "Post-Hoc..." msgstr "" #: src/ui/gui/oneway.ui:652 msgid "_Contrasts..." msgstr "对照(_C)..." #: src/ui/gui/options.ui:25 #, fuzzy #| msgid "Options" msgid "Options Case" msgstr "选项" #: src/ui/gui/options.ui:55 msgid "Display _Labels" msgstr "显示标签(_L)" #: src/ui/gui/options.ui:71 msgid "Display _Names" msgstr "显示名称(_N)" #: src/ui/gui/options.ui:99 msgid "Sort by L_abel" msgstr "按标签排序(_a)" #: src/ui/gui/options.ui:115 msgid "Sort by Na_me" msgstr "按名称排序(_m)" #: src/ui/gui/options.ui:131 msgid "Do not S_ort" msgstr "不排序(_o)" #: src/ui/gui/options.ui:159 msgid "Variable Lists" msgstr "变量列表" #: src/ui/gui/options.ui:184 msgid "Ma_ximize" msgstr "最大化(_x)" #: src/ui/gui/options.ui:199 msgid "_Raise" msgstr "提升(_R)" #: src/ui/gui/options.ui:214 msgid "Aler_t" msgstr "警示(_t)" #: src/ui/gui/options.ui:233 msgid "Output Window Action" msgstr "输出窗口动作" #: src/ui/gui/paired-samples.ui:147 msgid "_Test Pair(s):" msgstr "检验对(_T):" #: src/ui/gui/rank.ui:30 msgid "Rank Cases: Types" msgstr "个案排秩:类型" #: src/ui/gui/rank.ui:57 msgid "Sum of case _weights" msgstr "个案权重之和(_w)" #: src/ui/gui/rank.ui:74 msgid "Fractional rank as _%" msgstr "分数秩为_%" #: src/ui/gui/rank.ui:92 msgid "_Fractional rank" msgstr "分数秩(_F)" #: src/ui/gui/rank.ui:109 msgid "_Savage score" msgstr "Savage得分(_S)" #: src/ui/gui/rank.ui:125 msgid "_Rank" msgstr "秩(_R)" #: src/ui/gui/rank.ui:147 msgid "N_tiles" msgstr "N层(_t)" #: src/ui/gui/rank.ui:195 msgid "_Proportion Estimates" msgstr "比例估计(_P)" #: src/ui/gui/rank.ui:213 msgid "_Normal Scores" msgstr "正态得分(_N)" #: src/ui/gui/rank.ui:251 msgid "_Blom" msgstr "_Blom公式" #: src/ui/gui/rank.ui:269 msgid "Tuke_y" msgstr "Tuke_y公式" #: src/ui/gui/rank.ui:287 msgid "Ran_kit" msgstr "Ran_kit公式" #: src/ui/gui/rank.ui:305 msgid "_Van der Waerden" msgstr "_Van der Waerden公式" #: src/ui/gui/rank.ui:328 msgid "Proportion Estimation Formula" msgstr "比例估计公式" #: src/ui/gui/rank.ui:369 msgid "Rank Cases" msgstr "个案排秩" #: src/ui/gui/rank.ui:434 msgid "_By:" msgstr "依据(_B):" #: src/ui/gui/rank.ui:595 msgid "_Smallest Value" msgstr "最小值(_S)" #: src/ui/gui/rank.ui:613 msgid "_Largest Value" msgstr "最大值(_L)" #: src/ui/gui/rank.ui:637 msgid "Assign rank 1 to:" msgstr "分配秩1到:" #: src/ui/gui/rank.ui:656 msgid "_Display summary tables" msgstr "显示总结表(_D)" #: src/ui/gui/rank.ui:679 msgid "Rank T_ypes" msgstr "排秩类型(_T)" #: src/ui/gui/rank.ui:694 msgid "_Ties..." msgstr "同秩(_T)..." #: src/ui/gui/rank.ui:756 msgid "Rank Cases: Ties" msgstr "个案排秩:同秩" #: src/ui/gui/rank.ui:788 msgid "_Mean" msgstr "均值(_M)" #: src/ui/gui/rank.ui:806 msgid "_Low" msgstr "低(_L)" #: src/ui/gui/rank.ui:825 msgid "_High" msgstr "高(_H)" #: src/ui/gui/rank.ui:851 msgid "_Sequential ranks to unique values" msgstr "顺序秩到唯一值(_S)" #: src/ui/gui/rank.ui:875 msgid "Rank Assigned to Ties" msgstr "为同秩指定秩" #: src/ui/gui/runs.ui:155 msgid "M_ean" msgstr "均值(_e)" #: src/ui/gui/runs.ui:171 msgid "Mo_de" msgstr "众数(_o)" #: src/ui/gui/runs.ui:191 msgid "_Custom:" msgstr "自定义(_C)" #: src/ui/gui/runs.ui:230 msgid "Cut Point" msgstr "分割点" #: src/ui/gui/sort.ui:25 msgid "Sort Cases" msgstr "排序" #: src/ui/gui/sort.ui:101 msgid "Sort by:" msgstr "排序变量" #: src/ui/gui/sort.ui:174 msgid "Descending" msgstr "降序" #: src/ui/gui/sort.ui:196 msgid "Sort Order" msgstr "排序顺序" #: src/ui/gui/split-file.ui:25 msgid "Split File" msgstr "拆分文件" #: src/ui/gui/split-file.ui:103 msgid "Anal_yze all cases. Do not create groups." msgstr "不分组,分析所有个案(_y)。" #: src/ui/gui/split-file.ui:121 msgid "Compare _groups." msgstr "分组比较(_g)" #: src/ui/gui/split-file.ui:140 msgid "Organize ou_tput by groups." msgstr "按组别输出(_t)" #: src/ui/gui/split-file.ui:225 msgid "Groups _based on:" msgstr "分组依据(_b):" #: src/ui/gui/split-file.ui:255 msgid "_Sort the file by grouping variables." msgstr "将文件按分组变量排序(_S)。" #: src/ui/gui/split-file.ui:273 msgid "_File is already sorted." msgstr "文件已排序(_F)。" #: src/ui/gui/split-file.ui:334 msgid "Current Status : " msgstr "当前状态 :" #: src/ui/gui/split-file.ui:348 msgid "Analysis by groups is off" msgstr "分组分析选项关闭" #: src/ui/gui/recode.ui:135 msgid "System _Missing" msgstr "系统缺失设置(_M)" #: src/ui/gui/recode.ui:150 msgid "Co_py old values" msgstr "拷贝旧值(_p)" #: src/ui/gui/recode.ui:172 msgid "Va_lue: " msgstr "值(_l):" #: src/ui/gui/recode.ui:276 msgid "Conver_t numeric strings to numbers (`5' -> 5)" msgstr "将数字字符转换为数字,如`5' -> 5(_t)" #: src/ui/gui/recode.ui:297 msgid "Output variables are _strings" msgstr "输出变量为字符串(_s)" #: src/ui/gui/recode.ui:318 msgid "Width: " msgstr "宽度:" #: src/ui/gui/recode.ui:499 msgid "_Name:" msgstr "名称(_N):" #: src/ui/gui/recode.ui:527 msgid "La_bel:" msgstr "标签(_b):" #: src/ui/gui/recode.ui:556 msgid "Chan_ge" msgstr "改动(_g)" #: src/ui/gui/recode.ui:584 msgid "Output Variable" msgstr "输出变量" #: src/ui/gui/recode.ui:658 msgid "Old and New Va_lues..." msgstr "旧值和新值(_l)..." #: src/ui/gui/regression.ui:51 msgid "S_tatistics..." msgstr "统计量(_t)..." #: src/ui/gui/regression.ui:272 msgid "Regression: Save" msgstr "回归:保存" #: src/ui/gui/regression.ui:290 src/ui/gui/univariate.ui:42 msgid "_Predicted values" msgstr "估计值(_P)" #: src/ui/gui/regression.ui:307 src/ui/gui/univariate.ui:59 msgid "_Residuals" msgstr "残差(_R)" #: src/ui/gui/regression.ui:351 msgid "Regression: Statistics" msgstr "回归:统计量" #: src/ui/gui/regression.ui:393 src/ui/gui/univariate.ui:143 msgid "S_tatistics" msgstr "统计量(_t)" #: src/ui/gui/reliability.ui:34 msgid "Alpha" msgstr "Alpha" #: src/ui/gui/reliability.ui:43 msgid "Reliability Analysis" msgstr "信度分析" #: src/ui/gui/reliability.ui:144 msgid "_Items:" msgstr "项(_I):" #: src/ui/gui/reliability.ui:166 msgid "_Model: " msgstr "模型(_M):" #: src/ui/gui/reliability.ui:212 msgid "_Variables in first split:" msgstr "第一拆分的变量(_V):" #: src/ui/gui/reliability.ui:259 msgid "Show _descriptives for scale if item is deleted" msgstr "若项已删除则显示的描述(_d)" #: src/ui/gui/roc.ui:145 msgid "_Test Variable:" msgstr "检验变量(_T):" #: src/ui/gui/roc.ui:175 msgid "_State Variable:" msgstr "状态变量(_S):" #: src/ui/gui/roc.ui:202 msgid "_Value of state variable:" msgstr "状态变量值(_V):" #: src/ui/gui/roc.ui:249 msgid "ROC C_urve" msgstr "ROC曲线(_u)" #: src/ui/gui/roc.ui:269 msgid "_With diagonal reference line" msgstr "绘制对角参考线(_W)" #: src/ui/gui/roc.ui:293 msgid "Standard _Error and Confidence Interval" msgstr "标准误和置信区间(_E)" #: src/ui/gui/roc.ui:309 msgid "_Coordinate points of the ROC Curve" msgstr "ROC曲线的坐标点(_C)" #: src/ui/gui/scatterplot.ui:25 msgid "Scatterplot" msgstr "散点图" #: src/ui/gui/scatterplot.ui:56 msgid "_X Axis:" msgstr "_X轴:" #: src/ui/gui/scatterplot.ui:100 msgid "_Y Axis:" msgstr "_Y轴:" #: src/ui/gui/select-cases.ui:37 msgid "Select Cases: Range" msgstr "选择个案:范围" #: src/ui/gui/select-cases.ui:87 msgid "First case" msgstr "第一个个案" #: src/ui/gui/select-cases.ui:99 msgid "Last case" msgstr "最后一个个案" #: src/ui/gui/select-cases.ui:111 msgid "Observation" msgstr "观测值" #: src/ui/gui/select-cases.ui:161 msgid "Select Cases" msgstr "选择个案" #: src/ui/gui/select-cases.ui:313 msgid "Use filter variable" msgstr "使用过滤变量" #: src/ui/gui/select-cases.ui:380 msgid "Based on time or case range" msgstr "基于时间或个案范围" #: src/ui/gui/select-cases.ui:395 msgid "Range..." msgstr "范围..." #: src/ui/gui/select-cases.ui:444 msgid "Random sample of cases" msgstr "随机抽取个案" #: src/ui/gui/select-cases.ui:460 msgid "Sample..." msgstr "样本..." #: src/ui/gui/select-cases.ui:508 msgid "If condition is satisfied" msgstr "若满足条件" #: src/ui/gui/select-cases.ui:523 msgid "If..." msgstr "如果..." #: src/ui/gui/select-cases.ui:567 msgid "All Cases" msgstr "所有个案" #: src/ui/gui/select-cases.ui:581 msgid "Select" msgstr "选择" #: src/ui/gui/select-cases.ui:608 msgid "Filtered" msgstr "已过滤" #: src/ui/gui/select-cases.ui:625 msgid "Deleted" msgstr "已删除" #: src/ui/gui/select-cases.ui:647 msgid "Unselected Cases Are" msgstr "未选中个案进行的操作" #: src/ui/gui/select-cases.ui:694 msgid "Select Cases: Random Sample" msgstr "选择个案:随机抽样" #: src/ui/gui/select-cases.ui:756 msgid "Sample Size" msgstr "样本大小" #: src/ui/gui/t-test.ui:25 msgid "Options" msgstr "选项" #: src/ui/gui/t-test.ui:63 msgid "Exclude cases _analysis by analysis" msgstr "通过下列分析来进行排除个案分析(_a)" #: src/ui/gui/t-test.ui:148 msgid "One - Sample T Test" msgstr "单样本T检验" #: src/ui/gui/t-test.ui:265 msgid "Test _Value: " msgstr "检验值(_V):" #: src/ui/gui/text-data-import.ui:32 msgid "Select the first line of the data file that contains data." msgstr "在包含数据的数据文件行中选择第一行。" #: src/ui/gui/text-data-import.ui:54 msgid "Line above selected line contains variable names" msgstr "选中行之上的行含有变量名称" #: src/ui/gui/text-data-import.ui:80 msgid "" "Check the data formats displayed below and fix any that are incorrect. You " "may set other variable properties now or later." msgstr "检查下列数据格式并更正错误。现在或以后均可设置其他变量属性。" #: src/ui/gui/text-data-import.ui:121 msgid "Variables" msgstr "变量" #: src/ui/gui/text-data-import.ui:152 msgid "Data Preview" msgstr "数据预览" #: src/ui/gui/text-data-import.ui:181 msgid "" "This assistant will guide you through the process of importing data into " "PSPP from a text file with one line per case, in which fields are separated " "by tabs, commas, or other delimiters.\n" "\n" "\tThe selected file contains N lines of text. Only the first M of these " "will be shown for preview purposes in the following screens. You may choose " "below how much of the file should actually be imported." msgstr "" "本指南将协助您以每行作为一个个案的方式从文本文件导入数据到PSPP,文本文件中字" "段间以制表符、逗号或其他分隔符隔开。\n" "\n" "选中的文件含有N行文本。预览窗口将只显示M行。之后您可选择您想导入的行数。" #: src/ui/gui/text-data-import.ui:252 msgid "All cases" msgstr "所有个案" #: src/ui/gui/text-data-import.ui:272 msgid "Amount to Import" msgstr "导入量" #: src/ui/gui/text-data-import.ui:325 msgid "C_ustom" msgstr "自定义(_u)" #: src/ui/gui/text-data-import.ui:341 msgid "Slas_h (/)" msgstr "斜杠 / (_h)" #: src/ui/gui/text-data-import.ui:357 msgid "Semicolo_n (;)" msgstr "分号 ; (_n)" #: src/ui/gui/text-data-import.ui:373 msgid "P_ipe (|)" msgstr "管道 | (_i)" #: src/ui/gui/text-data-import.ui:389 msgid "H_yphen (-)" msgstr "连字符 - (_y)" #: src/ui/gui/text-data-import.ui:405 msgid "Co_mma (,)" msgstr "逗号,(_)" #: src/ui/gui/text-data-import.ui:421 msgid "_Colon (:)" msgstr "冒号 :(_C)" #: src/ui/gui/text-data-import.ui:437 msgid "Ban_g (!)" msgstr "感叹号 ! (_g)" #: src/ui/gui/text-data-import.ui:453 msgid "Ta_b" msgstr "制表符(_b)" #: src/ui/gui/text-data-import.ui:469 msgid "_Space" msgstr "空格(_S)" #: src/ui/gui/text-data-import.ui:490 msgid "Separators" msgstr "分隔符" #: src/ui/gui/text-data-import.ui:541 msgid "Quote separator characters with" msgstr "用下列符号作分隔符的引用符号" #: src/ui/gui/text-data-import.ui:561 msgid "Quoting" msgstr "引用" #: src/ui/gui/text-data-import.ui:599 msgid "Fields Preview" msgstr "字段预览" #: src/ui/gui/text-data-import.ui:622 msgid "" "Enter below the sheet number and the cell range which you wish to import." msgstr "在下面输入要导入的工作表序号及单元格范围。" #: src/ui/gui/text-data-import.ui:670 msgid "_Cells: " msgstr "单元格(_C):" #: src/ui/gui/text-data-import.ui:684 msgid "_Sheet Index: " msgstr "工作表索引(_S):" #: src/ui/gui/text-data-import.ui:695 msgid "Use first row as _variable names" msgstr "第一行作为变量名(_v)" #: src/ui/gui/text-data-import.ui:717 msgid "Cells to Import" msgstr "要导入的单元格" #: src/ui/gui/transpose.ui:24 msgid "Transpose" msgstr "转置" #: src/ui/gui/transpose.ui:91 msgid "Name Variable:" msgstr "名称变量:" #: src/ui/gui/transpose.ui:127 msgid "Variable(s):" msgstr "变量:" #: src/ui/gui/univariate.ui:25 msgid "Univariate: Save" msgstr "一元变量:保存" #: src/ui/gui/univariate.ui:103 msgid "Univariate: Statistics" msgstr "一元变量:统计量" #: src/ui/gui/univariate.ui:178 msgid "Univariate" msgstr "一元变量" #: src/ui/gui/univariate.ui:281 msgid "_Dependent Variable" msgstr "因变量(_D)" #: src/ui/gui/univariate.ui:329 msgid "_Fixed Factors" msgstr "固定因子(_F)" #: src/ui/gui/val-labs-dialog.ui:101 msgid "Value Label:" msgstr "值标签:" #: src/ui/gui/data-editor.ui:33 msgid "Information Area" msgstr "信息区" #: src/ui/gui/data-editor.ui:55 msgid "Case Counter Area" msgstr "个案计数区" #: src/ui/gui/data-editor.ui:80 msgid "Filter Use Status Area" msgstr "过滤器使用状态区" #: src/ui/gui/data-editor.ui:106 msgid "Weight Status Area" msgstr "权重状态区" #: src/ui/gui/data-editor.ui:132 msgid "Split File Status Area" msgstr "文件拆分状态区" #: src/ui/gui/data-editor.ui:154 msgid "_View" msgstr "视图(_V)" #: src/ui/gui/data-editor.ui:157 msgid "_Status Bar" msgstr "状态栏(_S)" #: src/ui/gui/data-editor.ui:163 msgid "_Font..." msgstr "字体(_F)" #: src/ui/gui/data-editor.ui:167 msgid "_Grid Lines" msgstr "网格线(_G)" #: src/ui/gui/data-editor.ui:171 msgid "Value _Labels" msgstr "值标签(_L)" #: src/ui/gui/data-editor.ui:182 msgid "_Variables" msgstr "变量(_V)" #: src/ui/gui/data-editor.ui:192 msgid "_Sort Cases..." msgstr "排序(_S)" #: src/ui/gui/data-editor.ui:196 msgid "_Transpose..." msgstr "转置(_T)" #: src/ui/gui/data-editor.ui:200 msgid "_Aggregate..." msgstr "汇总(_A)" #: src/ui/gui/data-editor.ui:206 msgid "S_plit File..." msgstr "分割文件(_p)" #: src/ui/gui/data-editor.ui:210 msgid "Select _Cases..." msgstr "选择个案(_C)" #: src/ui/gui/data-editor.ui:214 msgid "_Weight Cases..." msgstr "个案加权(_W)" #: src/ui/gui/data-editor.ui:220 msgid "_Transform" msgstr "变换(_T)" #: src/ui/gui/data-editor.ui:223 msgid "_Compute..." msgstr "计算(_C)..." #: src/ui/gui/data-editor.ui:227 msgid "Cou_nt..." msgstr "计数(_n)..." #: src/ui/gui/data-editor.ui:231 msgid "Ran_k Cases..." msgstr "个案排序(_k)..." #: src/ui/gui/data-editor.ui:235 msgid "Auto_matic Recode..." msgstr "自动编码(_m)..." #: src/ui/gui/data-editor.ui:241 msgid "Recode into _Same Variables..." msgstr "重编码到变量自身(_S)" #: src/ui/gui/data-editor.ui:245 msgid "Recode into _Different Variables..." msgstr "重编码到其他变量(_D)" #: src/ui/gui/data-editor.ui:251 msgid "_Run Pending Transforms" msgstr "运行设定好的转换(_R)" #: src/ui/gui/data-editor.ui:257 msgid "_Analyze" msgstr "分析(_A)" #: src/ui/gui/data-editor.ui:260 msgid "_Descriptive Statistics" msgstr "描述性统计(_D)" #: src/ui/gui/data-editor.ui:262 msgid "_Frequencies..." msgstr "频率(_F)" #: src/ui/gui/data-editor.ui:270 msgid "_Explore..." msgstr "数据探索(_E)" #: src/ui/gui/data-editor.ui:274 msgid "_Crosstabs..." msgstr "交叉表(_C)" #: src/ui/gui/data-editor.ui:279 msgid "Compare _Means" msgstr "比较均值(_M)" #: src/ui/gui/data-editor.ui:281 msgid "_Means..." msgstr "均值(_M)" #: src/ui/gui/data-editor.ui:285 msgid "_One Sample T Test..." msgstr "单样本T检验(_O)..." #: src/ui/gui/data-editor.ui:289 msgid "_Independent Samples T Test..." msgstr "独立样本T检验(_I)..." #: src/ui/gui/data-editor.ui:293 msgid "_Paired Samples T Test..." msgstr "成对样本T检验(_P)..." #: src/ui/gui/data-editor.ui:297 msgid "One Way _ANOVA..." msgstr "单因素方差分析(_A)..." #: src/ui/gui/data-editor.ui:302 msgid "_Univariate Analysis..." msgstr "单变量分析(_U)..." #: src/ui/gui/data-editor.ui:306 msgid "Bivariate _Correlation..." msgstr "二元相关性(_C)..." #: src/ui/gui/data-editor.ui:310 msgid "_K-Means Cluster..." msgstr "K-均值聚类分析(_K)" #: src/ui/gui/data-editor.ui:314 msgid "_Factor Analysis..." msgstr "因子分析(_F)" #: src/ui/gui/data-editor.ui:318 msgid "Re_liability..." msgstr "信度分析(_l)..." #: src/ui/gui/data-editor.ui:322 msgid "_Regression" msgstr "回归(_R)" #: src/ui/gui/data-editor.ui:325 msgid "_Linear..." msgstr "线性回归(_L)..." #: src/ui/gui/data-editor.ui:329 msgid "_Binary Logistic..." msgstr "二元Logistic回归分析(_B)..." #: src/ui/gui/data-editor.ui:335 msgid "_Non-Parametric Statistics" msgstr "非参数统计(_N)" #: src/ui/gui/data-editor.ui:338 msgid "_Chi Square..." msgstr "卡方(_C)..." #: src/ui/gui/data-editor.ui:342 msgid "_Binomial..." msgstr "二项分布检验(_B)..." #: src/ui/gui/data-editor.ui:346 msgid "_Runs..." msgstr "运行次数(_R)" #: src/ui/gui/data-editor.ui:350 msgid "_1 Sample K-S..." msgstr "单样本K-S检验(_1)" #: src/ui/gui/data-editor.ui:354 msgid "_2 Related Samples..." msgstr "两个相关样本检验(_2)..." #: src/ui/gui/data-editor.ui:358 msgid "_K Related Samples..." msgstr "K个相关样本检验(_K)..." #: src/ui/gui/data-editor.ui:362 msgid "K _Independent Samples..." msgstr "K独立样本检验(_I)..." #: src/ui/gui/data-editor.ui:368 msgid "ROC Cur_ve..." msgstr "ROC曲线(_v)..." #: src/ui/gui/data-editor.ui:374 msgid "_Graphs" msgstr "图形(_G)" #: src/ui/gui/data-editor.ui:377 msgid "_Scatterplot" msgstr "散点图(_S)" #: src/ui/gui/data-editor.ui:381 msgid "_Histogram" msgstr "直方图(_H)" #: src/ui/gui/data-editor.ui:385 msgid "_Barchart" msgstr "条形图(_B)" #: src/ui/gui/data-editor.ui:391 msgid "_Utilities" msgstr "工具(_U)" #: src/ui/gui/data-editor.ui:394 msgid "_Variables..." msgstr "变量(_V)..." #: src/ui/gui/data-editor.ui:398 msgid "Data File _Comments..." msgstr "数据文件注释(_C)..." #: src/ui/gui/output-window.ui:71 msgid "_Print..." msgstr "打印(_P)..." #: src/ui/gui/output-window.ui:76 msgid "_Export..." msgstr "导出(_E)..." #: src/ui/gui/output-window.ui:92 msgid "Select _All" msgstr "选择全部(_A)" #: src/ui/gui/syntax-editor.ui:27 msgid "Syntax" msgstr "语法" #: src/ui/gui/syntax-editor.ui:31 msgid "Data" msgstr "数据" #: src/ui/gui/syntax-editor.ui:41 msgid "_Save" msgstr "保存(_S)" #: src/ui/gui/syntax-editor.ui:46 msgid "Save _As" msgstr "另存为(_A)" #: src/ui/gui/syntax-editor.ui:53 msgid "_Print" msgstr "打印(_P)" #: src/ui/gui/syntax-editor.ui:84 msgid "_Delete" msgstr "删除(_D)" #: src/ui/gui/syntax-editor.ui:90 msgid "_Undo" msgstr "撤销(_U)" #: src/ui/gui/syntax-editor.ui:94 msgid "_Redo" msgstr "重做(_R)" #: src/ui/gui/syntax-editor.ui:100 #, fuzzy #| msgid "Find" msgid "_Find" msgstr "查找" #: src/ui/gui/syntax-editor.ui:106 msgid "_Run" msgstr "运行(_R)" #: src/ui/gui/syntax-editor.ui:109 msgid "_All" msgstr "全部(_A)" #: src/ui/gui/syntax-editor.ui:113 msgid "_Selection" msgstr "选中(_S)" #: src/ui/gui/syntax-editor.ui:117 msgid "_Current Line" msgstr "当前行(_C)" #: src/ui/gui/syntax-editor.ui:122 msgid "_To End" msgstr "至末尾(_T)" #: src/ui/gui/var-type-dialog.ui:99 msgid "Scientific notation" msgstr "科学符号" #: src/ui/gui/var-type-dialog.ui:150 msgid "Custom currency" msgstr "自定义货币" #: src/ui/gui/var-type-dialog.ui:267 msgid "positive" msgstr "正" #: src/ui/gui/var-type-dialog.ui:279 msgid "negative" msgstr "负" #: src/ui/gui/var-type-dialog.ui:293 msgid "Sample" msgstr "样本" #: src/ui/gui/var-type-dialog.ui:350 msgid "Width:" msgstr "宽度:" #: src/ui/gui/var-type-dialog.ui:396 msgid "Decimal Places:" msgstr "小数位置:" #: src/ui/gui/weight.ui:24 msgid "Weight Cases" msgstr "加权个案" #: src/ui/gui/weight.ui:100 msgid "Weight cases by" msgstr "加权个案" #: src/ui/gui/weight.ui:144 msgid "Frequency Variable" msgstr "频率变量" #: src/ui/gui/weight.ui:198 msgid "Current Status: " msgstr "当前状态:" #. TRANSLATORS: This is the application name in the desktop file #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:7 #: src/ui/gui/org.fsf.pspp.desktop.in:7 msgid "GNU PSPP" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:8 #, fuzzy #| msgid "A program for the analysis of sampled data" msgid "GNU PSPP is a program for statistical analysis of sampled data" msgstr "样本数据分析软件" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:10 msgid "" "GNU PSPP is a program for the statistical analysis of sampled data. It is a " "Free replacement for the proprietary program SPSS, and appears very similar " "to it with a few exceptions. The most important of these exceptions are, " "that there are no “time bombs”; your copy of PSPP will not “expire” or " "deliberately stop working in the future. Neither are there any artificial " "limits on the number of cases or variables which you can use. There are no " "additional packages to purchase in order to get “advanced” functions; all " "functionality that PSPP currently supports is in the core package." msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:11 msgid "" "PSPP is a stable and reliable application. It can perform descriptive " "statistics, T-tests, anova, linear and logistic regression, measures of " "association, cluster analysis, reliability and factor analysis, non-" "parametric tests and more. Its backend is designed to perform its analyses " "as fast as possible, regardless of the size of the input data. You can use " "PSPP with its graphical interface or the more traditional syntax commands." msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:12 msgid "A brief list of some of the PSPP's features." msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:14 msgid "Support for over 1 billion cases" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:15 msgid "Support for over 1 billion variables" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:16 msgid "Syntax and data files which are compatible with those of SPSS" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:17 msgid "A choice of terminal or graphical user interface" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:18 msgid "A choice of text, postscript, pdf, opendocument or html output formats" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:19 msgid "" "Inter-operability with: LibreOffice, Apache OpenOffice, Gnumeric and other " "free software" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:20 msgid "Easy data import from spreadsheets, text files and database sources" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:21 msgid "" "The capability to open, analyse and edit two or more datasets concurrently" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:22 msgid "A user interface supporting all common character sets" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:23 msgid "A user interface has been translated to multiple languages" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:24 msgid "Very fast statistical procedures, even on very large data sets" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:25 msgid "No license fees and no expiration period" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:26 msgid "No unethical “end user license agreements”" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:27 msgid "A fully indexed user manual" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:28 msgid "Freedom ensured; It is licensed under the GPLv3 or later" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:29 msgid "" "Portability; Runs on many different computers and many different operating " "systems" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:31 msgid "" "PSPP is particularly aimed at statisticians, social scientists and students " "requiring fast convenient analysis of sampled data." msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:41 #, fuzzy #| msgid "Variable View" msgid "GNU PSPP Variable View" msgstr "变量视图" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:54 msgid "Free Software Foundation" msgstr "" #: src/ui/gui/org.fsf.pspp.desktop.in:8 msgid "Statistical Software" msgstr "统计软件" #: src/ui/gui/org.fsf.pspp.desktop.in:9 msgid "Analyze statistical data with a free alternative to SPSS" msgstr "替代SPSS的免费数据统计分析软件" #. TRANSLATORS: Do not translate this string. Keep it as is, verbatim. #: src/ui/gui/org.fsf.pspp.desktop.in:12 msgid "pspp" msgstr "" #. TRANSLATORS: You must keep all ";" - also at the end of line. #: src/ui/gui/org.fsf.pspp.desktop.in:17 msgid "statistics;analysis;spss;" msgstr "" #~ msgid "Sorry. The help system hasn't yet been implemented." #~ msgstr "很抱歉,帮助系统尚未完成。" #~ msgid "Support for %s files was not compiled into this installation of PSPP" #~ msgstr "兼容%s类型文件的PSPP模块未安装" #~ msgid "Details" #~ msgstr "详细信息" #~ msgid "Multiple dichotomy set" #~ msgstr "多重二分休" #~ msgid "Multiple category set" #~ msgstr "多重类别集" #~ msgid "Label source" #~ msgstr "标签来源" #~ msgid "First variable label among variables" #~ msgstr "首个变量标签" #~ msgid "Provided by user" #~ msgstr "用户指定" #~ msgid "Category label source" #~ msgstr "类别标签来源" #~ msgid "Variable labels" #~ msgstr "变量标签" #~ msgid "Value labels of counted value" #~ msgstr "计数值的值标签" #~ msgid "Label:" #~ msgstr "标签:" #~ msgid "No label." #~ msgstr "没有标签。" #~ msgid "Product:" #~ msgstr "产品:" #~ msgid "Variables:" #~ msgstr "变量:" #~ msgid "Cases:" #~ msgstr "个案:" #~ msgid "Type:" #~ msgstr "类型:" #~ msgid "Description" #~ msgstr "描述" #~ msgid "The active dataset does not have a file label." #~ msgstr "活动数据集没有包含文件标签。" #~ msgid "File label: %s" #~ msgstr "文件标签:%s" #~ msgid "The active dataset dictionary does not contain any documents." #~ msgstr "活动数据集字典没有包含任何文件。" #~ msgid "Documents in the active dataset:" #~ msgstr "活动数据集中的文件:" #~ msgid "Custom data file attributes." #~ msgstr "自定义数据文件特征。" #~ msgid "Label: %s\n" #~ msgstr "标签:%s\n" #~ msgid "Format: %s\n" #~ msgstr "格式:%s\n" #~ msgid "Print Format: %s\n" #~ msgstr "打印格式:%s\n" #~ msgid "Write Format: %s\n" #~ msgstr "写入格式:%s\n" #~ msgid "Measure: %s\n" #~ msgstr "衡量:%s\n" #~ msgid "Role: %s\n" #~ msgstr "角色:%s\n" #~ msgid "Display Alignment: %s\n" #~ msgstr "显示对齐:%s\n" #~ msgid "Display Width: %d\n" #~ msgstr "显示宽度:%d\n" #~ msgid "Missing Values: " #~ msgstr "缺失值:" #~ msgid "Interactive shell not supported on this platform." #~ msgstr "运行平台不支持交互式命令shell。" #~ msgid "Error executing command: %s." #~ msgstr "指令运行出错:%s。" #~ msgid "Unknown TABLECELLS class" #~ msgstr "未知的TABLECELLS类" #~ msgid "Exact Sig. (%d-tailed)" #~ msgstr "精确显著性(%d-尾)" #~ msgid "Valid N" #~ msgstr "有效N" #~ msgid "Missing N" #~ msgstr "缺失N" #~ msgid "Valid cases = %.*g; cases with missing value(s) = %.*g." #~ msgstr "有效个案数 = %.*g;有缺失值的个案数 = %.*g。" #~ msgid "%g" #~ msgstr "%g" #~ msgid "%d" #~ msgstr "%d" #~ msgid "%zu" #~ msgstr "%zu" #~ msgid "50 (Median)" #~ msgstr "50 (中位数)" #~ msgid "(%d)" #~ msgstr "(%d)" #~ msgid "Min" #~ msgstr "最小值" #~ msgid "Max" #~ msgstr "最大值" #~ msgid "%g%%" #~ msgstr "%g%%" #~ msgid "25th" #~ msgstr "25%" #~ msgid "50th (Median)" #~ msgstr "50%(中位数)" #~ msgid "75th" #~ msgstr "75%" #~ msgid "(I) %s" #~ msgstr "(I) %s" #~ msgid "(J) %s" #~ msgstr "(J) %s" #~ msgid "(I - J)" #~ msgstr "(I - J)" #~ msgid "%s into %s(%s of %s using %s BY %s)" #~ msgstr "%s在%s之内(%s在%s内,使用%s经由%s)" #~ msgid "%s into %s(%s of %s BY %s)" #~ msgstr "%s在%s之内(%s在%s内经由%s)" #~ msgid "%s into %s(%s of %s using %s)" #~ msgstr "%s在%s之内(%s在%s内使用%s)" #~ msgid "%s into %s(%s of %s)" #~ msgstr "%s在%s之内(%s在%s内)" #~ msgid "Area Under the Curve (%s)" #~ msgstr "曲线下面积(%s)" #~ msgid "Coordinates of the Curve (%s)" #~ msgstr "曲线(%s)的坐标" #~ msgid "Std. Error Mean" #~ msgstr "均值标准误" #~ msgid "(active dataset)" #~ msgstr "(活动数据集)" #~ msgid "Writing %zu record to %s." #~ msgid_plural "Writing %zu records to %s." #~ msgstr[0] "写入%zu条记录到%s。" #~ msgid "Writing %zu record." #~ msgid_plural "Writing %zu records." #~ msgstr[0] "写入%zu条记录。" #~ msgid "Unsupported compression type (%d)" #~ msgstr "不支持压缩类型(%d)" #~ msgid "Failed to seek to end of central directory record: %s" #~ msgstr "中央记录末端查询失败:%s" #~ msgid "Failed to seek to central directory: %s" #~ msgstr "中央记录查询失败:%s" #~ msgid "Failed to seek to start of member `%s': %s" #~ msgstr "头端查询失败`%s': %s" #~ msgid "ascii: closing output file `%s'" #~ msgstr "ascii:关闭输入文件`%s'" #~ msgid "%s - Page %d" #~ msgstr "%s - %d页" #~ msgid "bad vline: x=%d+%d=%d y=(%d+%d=%d,%d+%d=%d) in table size (%d,%d)\n" #~ msgstr "" #~ "vline错误:x=%d+%d=%d y=(%d+%d=%d,%d+%d=%d),位于表格大小(%d,%d)中\n" #~ msgid "bad hline: x=(%d+%d=%d,%d+%d=%d) y=%d+%d=%d in table size (%d,%d)\n" #~ msgstr "" #~ "hline错误:x=(%d+%d=%d,%d+%d=%d) y=%d+%d=%d,位于表格大小(%d,%d)中\n" #~ msgid "" #~ "bad box: (%d+%d=%d,%d+%d=%d)-(%d+%d=%d,%d+%d=%d) in table size (%d,%d)\n" #~ msgstr "" #~ "box错误: (%d+%d=%d,%d+%d=%d)-(%d+%d=%d,%d+%d=%d),位于表格大小(%d,%d)中\n" #~ msgid "Cannot parse field content `%.*s' as format %s: %s" #~ msgstr "不能将字段内容`%.*s' 解析为格式 %s: %s" #~ msgid "This input line has too few separators to fill in this field." #~ msgstr "输入行的分隔数过少不足以分隔字段。" #~ msgid "An error occurred reading the spreadsheet file." #~ msgstr "读取工作表文件时发生错误。" #~ msgid "Enter a number to add a new variable." #~ msgstr "输入一个数字以添加新变量。" #~ msgid "Enter a number to add a new case." #~ msgstr "输入一个数字以添加新个案。" #~ msgid "Cannot create variable." #~ msgstr "无法创建变量。" #~ msgid "\"%s\" is not a valid variable name." #~ msgstr "\"%s\"不是有效的变量名称。" #~ msgid "This dictionary already contains a variable named \"%s\"." #~ msgstr "该字典已包含名称为\"%s\"的变量。" #~ msgid "Cannot rename variable." #~ msgstr "不能重命名变量。" #~ msgid "Enter a variable name to add a new variable." #~ msgstr "输入变量名称以添加新变量。" #~ msgid "{%s, %s}\n" #~ msgstr "{%s, %s}\n" #~ msgid "can only convert encrypted data file to sav or sys format" #~ msgstr "加密数据文件只能转换为sav或sys格式" #~ msgid "can only convert encrypted syntax file to sps format" #~ msgstr "加密语法文件只能转换为sps格式" #~ msgid "count" #~ msgstr "计数" #~ msgid "expected" #~ msgstr "期望值" #~ msgid "residual" #~ msgstr "残差" #~ msgid "std. resid." #~ msgstr "标准残差" #~ msgid "adj. resid." #~ msgstr "调整后残差" #~ msgid "Chi-square tests." #~ msgstr "卡方检验。" #~ msgid "Odds Ratio for %s (%.*s / %.*s)" #~ msgstr "%s (%.*s / %.*s)的比值比" #~ msgid "For cohort %s = %.*s" #~ msgstr "%s = %.*s 定群" #~ msgid "Multiple response set name `%s' does not begin with `$'." #~ msgstr "多重响应数据集(MRSETS)名称 `%s' 应该以 `$'开头。" #, fuzzy #~| msgid "> Median" #~ msgid "> Median" #~ msgstr ">中位数" #~ msgid "Cases < Test Value" #~ msgstr "个案<检验值" #~ msgid "<b>Histograms</b>" #~ msgstr "<b>直方图</b>" #~ msgid "<b>Bar Charts</b>" #~ msgstr "<b>柱形图</b>" #~ msgid "<b>Pie Charts</b>" #~ msgstr "<b>饼图</b>" #~ msgid "<b>Variables</b>" #~ msgstr "<b>变量</b>" #, fuzzy #~| msgid "Data Preview" #~ msgid "<b>Data Preview</b>" #~ msgstr "数据预览" #~ msgid "<b>Separators</b>" #~ msgstr "<b>分隔符</b>" #, fuzzy #~ msgid "<b>Quoting</b>" #~ msgstr "<b>字串引述</b>" #~ msgid "expecting number or data string" #~ msgstr "要求数字或数据字符串" #~ msgid "could not access definition for terminal `%s'" #~ msgstr "无法访问终端`%s'的定义设置" #~ msgid "" #~ "PSPPIRE, a GUI for PSPP, a program for statistical analysis of sampled " #~ "data.\n" #~ "Usage: %s [OPTION]... FILE\n" #~ "\n" #~ "Arguments to long options also apply to equivalent short options.\n" #~ "\n" #~ "GUI options:\n" #~ " -q, --no-splash don't show splash screen during startup\n" #~ "\n" #~ "%sLanguage options:\n" #~ " -I, --include=DIR append DIR to search path\n" #~ " -I-, --no-include clear search path\n" #~ " -a, --algorithm={compatible|enhanced}\n" #~ " set to `compatible' if you want output\n" #~ " calculated from broken algorithms\n" #~ " -x, --syntax={compatible|enhanced}\n" #~ " set to `compatible' to disable PSPP " #~ "extensions\n" #~ " -i, --interactive interpret syntax in interactive mode\n" #~ " -s, --safer don't allow some unsafe operations\n" #~ "Default search path: %s\n" #~ "\n" #~ "Informative output:\n" #~ " -h, --help display this help and exit\n" #~ " -V, --version output version information and exit\n" #~ "\n" #~ "A non-option argument is interpreted as a data file in .sav or .zsav or ." #~ "por\n" #~ "format or a syntax file to load.\n" #~ msgstr "" #~ "PSPPIRE, 数据统计分析软件PSPP的图形界面。\n" #~ "用法: %s [选项]... 文件名\n" #~ "\n" #~ "选项有长、短格式,作用相同。\n" #~ "\n" #~ "图形界面选项:\n" #~ " -q, --no-splash 软件打开时不显示启动画面\n" #~ "\n" #~ "%s语言选项:\n" #~ " -I, --include=路径 将\"路径\"追加到搜索路径\n" #~ " -I-, --no-include 清空搜索路径\n" #~ " -a, --algorithm={compatible|enhanced}\n" #~ " 设置为`compatible'以输出包含分组算法结果\n" #~ " -x, --syntax={compatible|enhanced}\n" #~ " 设置为`compatible'以禁用PSPP扩展名\n" #~ " -i, --interactive 设置语法解释为互动模式\n" #~ " -s, --safer 禁止不安全的操作\n" #~ "Default search path: %s\n" #~ "\n" #~ "帮助及版本信息:\n" #~ " -h, --help 显示帮助后退出\n" #~ " -V, --version 显示版本信息后退出\n" #~ "\n" #~ "不带任何参数则程序启动运行以备载入.sav、.zsav或.por格式的数据文件或语法文" #~ "件。\n" #~ msgid "_Reset" #~ msgstr "重置(_R)" #~ msgid "_Select" #~ msgstr "选择(_S)" #~ msgid "Delete the variables at the selected position(s)" #~ msgstr "删除选中的变量" #~ msgid "Delete the cases at the selected position(s)" #~ msgstr "删除选中的个案" #~ msgid "_Open..." #~ msgstr "打开(_O)..." #~ msgid "Transpose the cases with the variables" #~ msgstr "对变量进行排序" #~ msgid "Aggregate the case values into a new variable" #~ msgstr "将多个个案总计为新变量" #~ msgid "Choose a subset of cases for analysis" #~ msgstr "选定一组个案进行分析" #~ msgid "All" #~ msgstr "全部" #~ msgid "Number of clusters may not be larger than the number of cases." #~ msgstr "类别数量不能大于个案数量。" #~ msgid "Value of %s must be between 1 and 100." #~ msgstr "%s的值必须处于1到100之间。" #~ msgid "TreeView path" #~ msgstr "树视图路径" #~ msgid "The path to the row in the GtkTreeView, as a string" #~ msgstr "到GtkTreeView行的路径,类型为字符串" #~ msgid "Diagonal slash" #~ msgstr "对角斜线" #~ msgid "Whether to draw a diagonal slash across the button." #~ msgstr "是否在按钮上绘制对角斜线。" #~ msgid "Incorrect value for variable type" #~ msgstr "变量类型的值不正确" #~ msgid "Font Selection" #~ msgstr "选择字体" #~ msgid "Import Delimited Text Data" #~ msgstr "导入分隔符分隔的文本数据。" #~ msgid "(optional case selection condition)" #~ msgstr "(自选个案选择条件)" #~ msgid "Importing Textual Data" #~ msgstr "导入文本数据" #~ msgid "Doubled quote mark treated as escape" #~ msgstr "将双引号用作转义字符" #~ msgid "Bar charts are not implemented." #~ msgstr "没有包含条形图绘制功能。" #~ msgid "No valid data for variable %s; statistics not displayed." #~ msgstr "变量%s不包含有效数据;不显示其统计量。" pspp-1.4.1/po/de.po0000644000175000017500000120224513725012645013474 0ustar00blpblp00000000000000# German translation for PSPP # Copyright (C) 2020 Free Software Foundation, Inc. # This file is distributed under the same license as the pspp package. # Matthias Keil , 2012 - 2018 # Olaf Noehring , 2013 - 2016 # Bob Earl , 2014 - 2018 # Friedrich Beckmann , 2020 msgid "" msgstr "" "Project-Id-Version: pspp 1.4.0\n" "Report-Msgid-Bugs-To: pspp-dev@gnu.org\n" "PO-Revision-Date: 2020-09-03 10:20+0200\n" "Last-Translator: Friedrich Beckmann \n" "Language-Team: German \n" "Language: de_DE\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Bugs: Report translation errors to the Language-Team address.\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Poedit-SourceCharset: UTF-8\n" "X-Generator: Emacs\n" #: src/data/any-reader.c:72 src/data/encrypted-file.c:78 #, c-format msgid "An error occurred while opening `%s': %s." msgstr "Beim Öffnen von `%s' ist ein Fehler aufgetreten: %s." #: src/data/any-reader.c:93 src/language/lexer/lexer.c:1633 #, c-format msgid "Error reading `%s': %s." msgstr "Fehler beim Lesen von `%s': %s." #: src/data/any-reader.c:114 #, c-format msgid "`%s' is not a system or portable file." msgstr "`%s' ist keine System- oder Portable-Datei." #: src/data/any-reader.c:123 src/data/any-writer.c:66 msgid "The inline file is not allowed here." msgstr "Die Inline-Datei ist hier nicht erlaubt." #: src/data/any-reader.c:205 #, c-format msgid "" "Cannot read from dataset %s because no dictionary or data has been written " "to it yet." msgstr "" "Das Datenblatt %s kann nicht gelesen werden, weil bisher entweder kein " "Codebuch oder keine Daten darauf gespeichert wurden." #: src/data/any-reader.c:260 src/language/data-io/dataset.c:253 msgid "Dataset" msgstr "Datensatz" #: src/data/calendar.c:100 #, c-format msgid "Month %d is not in acceptable range of 0 to 13." msgstr "Der Monat %d ist nicht im akzeptierten Bereich von 0 bis 13." #: src/data/calendar.c:110 #, c-format msgid "Day %d is not in acceptable range of 0 to 31." msgstr "Der Tag %d ist nicht im akzeptierten Bereich von 0 bis 31" #: src/data/calendar.c:119 #, c-format msgid "Date %04d-%d-%d is before the earliest acceptable date of 1582-10-15." msgstr "" "Das Datum %04d-%d-%d ist vor dem frühsten akzeptierten Datum 1582-10-15." #: src/data/casereader-filter.c:221 msgid "" "At least one case in the data read had a weight value that was user-missing, " "system-missing, zero, or negative. These case(s) were ignored." msgstr "" "Mindestens ein Fall der gelesenen Daten hat ein Gewicht das Benutzer-" "Fehlend, System-Fehlend, Null oder Negativ war. Diese Fälle wurden ignoriert." #. TRANSLATORS: this fragment will be interpolated into messages in fh_lock() #. that identify types of files. #: src/data/csv-file-writer.c:138 msgid "CSV file" msgstr "CSV Datei" #: src/data/csv-file-writer.c:146 #, fuzzy, c-format #| msgid "Error opening `%s' for writing as a system file: %s." msgid "Error opening `%s' for writing as a CSV file: %s." msgstr "Fehler beim öffnen `%s' um dies als Systemdatei zu speichern: %s." #: src/data/csv-file-writer.c:453 #, c-format msgid "An I/O error occurred writing CSV file `%s'." msgstr "Ein I/O Fehler ist beim Schreiben von CSV Datei `%s' aufgetreten." #: src/data/data-in.c:175 #, c-format msgid "Data is not valid as format %s: %s" msgstr "Daten sind nicht als Format %s gültig: %s" #: src/data/data-in.c:377 src/data/data-in.c:553 msgid "Field contents are not numeric." msgstr "Feldinhalte sind nicht numerisch." #: src/data/data-in.c:379 src/data/data-in.c:555 msgid "Number followed by garbage." msgstr "Zahl gefolgt von Müll." #: src/data/data-in.c:392 msgid "Invalid numeric syntax." msgstr "Ungültige numerische Syntax." #: src/data/data-in.c:400 src/data/data-in.c:571 msgid "Too-large number set to system-missing." msgstr "Zu große Zahl auf fehlend gesetzt." #: src/data/data-in.c:406 src/data/data-in.c:577 msgid "Too-small number set to zero." msgstr "Zu kleine Zahl auf Null gesetzt." #: src/data/data-in.c:426 msgid "All characters in field must be digits." msgstr "Alle Zeichen im Feld müssen Ziffern sein." #: src/data/data-in.c:445 msgid "Unrecognized character in field." msgstr "Unerkanntes Zeichen im Feld." #: src/data/data-in.c:466 src/data/data-in.c:729 msgid "Field must have even length." msgstr "Felder müssen gleiche Länge haben." #: src/data/data-in.c:468 src/data/data-in.c:732 msgid "Field must contain only hex digits." msgstr "Felder dürfen nur Hex-Zahlen enthalten." #: src/data/data-in.c:544 msgid "Invalid zoned decimal syntax." msgstr "Fehlerhaft aufgeteilte Syntax der Dezimalen." #: src/data/data-in.c:644 src/data/data-in.c:650 msgid "Invalid syntax for P field." msgstr "Ungültige Syntax für P Feld." #: src/data/data-in.c:768 src/data/data-in.c:818 msgid "Syntax error in date field." msgstr "Syntaxfehler in Datum-Feld." #: src/data/data-in.c:783 #, c-format msgid "Day (%ld) must be between 1 and 31." msgstr "Tag (%ld) muss zwischen 1 und 31 liegen." #: src/data/data-in.c:832 msgid "Delimiter expected between fields in date." msgstr "Trennzeichen zwischen Feldern in Datum-Feld erwartet." #: src/data/data-in.c:906 msgid "" "Unrecognized month format. Months may be specified as Arabic or Roman " "numerals or as at least 3 letters of their English names." msgstr "" "Unbekanntes Monatsformat. Monate müssen mit arabischen oder romanischen " "Zahlen oder mindestens den ersten 3 Buchstaben ihrer englischen Namen " "bezeichnet werden." #: src/data/data-in.c:933 #, c-format msgid "Year (%ld) must be between 1582 and 19999." msgstr "Jahr (%ld) muss zwischen 1582 und 19999 liegen." #: src/data/data-in.c:944 #, c-format msgid "Trailing garbage `%.*s' following date." msgstr "Nach dem Datum folgt Müll `%.*s'." #: src/data/data-in.c:958 msgid "Julian day must have exactly three digits." msgstr "Julianischer Tag muss exakt drei Ziffern haben." #: src/data/data-in.c:960 #, c-format msgid "Julian day (%ld) must be between 1 and 366." msgstr "Julianischer Tag (%ld) muss zwischen 1 und 366 liegen." #: src/data/data-in.c:984 #, c-format msgid "Quarter (%ld) must be between 1 and 4." msgstr "Quartal (%ld) muss zwischen 1 und 4 liegen." #: src/data/data-in.c:1005 #, c-format msgid "Week (%ld) must be between 1 and 53." msgstr "Woche (%ld) muss zwischen 1 und 53 liegen." #: src/data/data-in.c:1017 msgid "Delimiter expected between fields in time." msgstr "Trennzeichen zwischen Feldern in Zeit erwartet." #: src/data/data-in.c:1037 #, c-format msgid "Minute (%ld) must be between 0 and 59." msgstr "Minute (%ld) muss zwischen 0 und 59 liegen." #: src/data/data-in.c:1075 msgid "" "Unrecognized weekday name. At least the first two letters of an English " "weekday name must be specified." msgstr "" "Wochentagsname nicht erkannt. Mindestens die ersten zwei Buchstaben einer " "englischen Wochentagsbezeichnung müssen angegeben sein." #: src/data/data-in.c:1210 #, c-format msgid "`%c' expected in date field." msgstr "`%c' erwartet im Datum-Feld." #: src/data/data-out.c:580 #, c-format msgid "Weekday number %f is not between 1 and 7." msgstr "Die Nummer des Wochentages %f ist nicht zwischen 1 und 7." #: src/data/data-out.c:605 #, c-format msgid "Month number %f is not between 1 and 12." msgstr "Die Nummer des Monats %f ist nicht zwischen 1 und 12." #. TRANSLATORS: this fragment will be interpolated into #. messages in fh_lock() that identify types of files. #: src/data/dataset-writer.c:66 src/language/data-io/file-handle.c:304 msgid "dataset" msgstr "Datensatz" #: src/data/dict-class.c:52 msgid "ordinary" msgstr "normal" #: src/data/dict-class.c:54 msgid "system" msgstr "System" #: src/data/dict-class.c:56 msgid "scratch" msgstr "temporär" #: src/data/dictionary.c:1523 #, c-format msgid "Truncating document line to %d bytes." msgstr "Schneide Beschreibungszeile nach %d Zeichen ab." #: src/data/encrypted-file.c:89 #, c-format msgid "An error occurred while reading `%s': %s." msgstr "Beim Öffnen von `%s' ist ein Fehler aufgetreten: %s." #: src/data/encrypted-file.c:430 #, c-format msgid "" "%s: encrypted file corrupted (ends in incomplete %u-byte ciphertext block)" msgstr "" "%s: verschlüsselte Datei fehlerhaft (endet in unvollständigem %u-byte " "ciphertext Block)" #: src/data/encrypted-file.c:449 #, c-format msgid "%s: encrypted file corrupted (ends with bad padding)" msgstr "%s: verschlüsselte Datei fehlerhaft (endet mit falschen padding)" #: src/data/file-handle-def.c:283 src/language/data-io/dataset.c:266 msgid "active dataset" msgstr "aktiver Datensatz" #: src/data/file-handle-def.c:518 #, c-format msgid "Can't read from %s as a %s because it is already being read as a %s." msgstr "" "Aus der Datei %s kann nicht als %s gelesen werden, weil diese bereits als %s " "gelesen wird." #: src/data/file-handle-def.c:522 #, c-format msgid "Can't write to %s as a %s because it is already being written as a %s." msgstr "" "In die Datei %s kann nicht als %s geschrieben werden, weil in diese bereits " "als %s geschrieben wird." #: src/data/file-handle-def.c:529 #, c-format msgid "Can't re-open %s as a %s." msgstr "Kann %s nicht als %s neu öffnen." #: src/data/file-name.c:133 #, c-format msgid "Not opening pipe file `%s' because %s option set." msgstr "" "Die Ausgabedatei (pipe) `%s' wurde nicht geöffnet, weil die Option %s " "gesetzt ist." #: src/data/format.c:339 msgid "Input format" msgstr "Eingabeformat" #: src/data/format.c:339 msgid "Output format" msgstr "Ausgabeformat" #: src/data/format.c:342 #, c-format msgid "Format %s may not be used for input." msgstr "Format %s kann nicht für Eingaben verwendet werden." #: src/data/format.c:349 #, c-format msgid "%s specifies width %d, but %s requires an even width." msgstr "%s spezifiziert breite %d, aber %s benötigt eine gerade/gleiche Breite" #: src/data/format.c:358 #, c-format msgid "%s %s specifies width %d, but %s requires a width between %d and %d." msgstr "" "%s %s legt eine Breite von %d fest, aber %s erfordert eine Breite zwischen " "%d und %d." #: src/data/format.c:367 #, c-format msgid "%s %s specifies %d decimal place, but %s does not allow any decimals." msgid_plural "" "%s %s specifies %d decimal places, but %s does not allow any decimals." msgstr[0] "" "%s %s legt %d Dezimalstelle fest, aber %s erlaubt keine Dezimalstellen." msgstr[1] "" "%s %s legt %d Dezimalstellen fest, aber %s erlaubt keine Dezimalstellen." #: src/data/format.c:378 #, c-format msgid "" "%s %s specifies %d decimal place, but the given width allows at most %d " "decimals." msgid_plural "" "%s %s specifies %d decimal places, but the given width allows at most %d " "decimals." msgstr[0] "" "%s %s legt %d Dezimalstelle fest, aber die vorgegebene Breite erlaubt " "höchstens %d Dezimalstellen." msgstr[1] "" "%s %s legt %d Dezimalstellen fest, aber die vorgegebene Breite erlaubt " "höchstens %d Dezimalstellen." #: src/data/format.c:385 #, c-format msgid "" "%s %s specifies %d decimal place, but the given width does not allow for any " "decimals." msgid_plural "" "%s %s specifies %d decimal places, but the given width does not allow for " "any decimals." msgstr[0] "" "%s %s legt %d Dezimalstelle fest, aber die vorgegebene Breite erlaubt keine " "Dezimalstellen." msgstr[1] "" "%s %s legt %d Dezimalstellen fest, aber die vorgegebene Breite erlaubt keine " "Dezimalstellen." #: src/data/format.c:424 #, c-format msgid "%s variables are not compatible with %s format %s." msgstr "%s Variablen sind nicht kompatibel mit %s Format %s." #: src/data/format.c:425 src/data/format.c:1074 #: src/ui/gui/var-type-dialog.ui:167 msgid "String" msgstr "String" #: src/data/format.c:425 src/data/format.c:1035 #: src/ui/gui/var-type-dialog.ui:48 msgid "Numeric" msgstr "Numerisch" #: src/data/format.c:426 src/data/sys-file-reader.c:2212 #: src/data/sys-file-reader.c:2214 src/language/xforms/recode.c:512 #: src/language/xforms/recode.c:513 src/language/xforms/recode.c:525 #: src/language/xforms/recode.c:526 #: src/language/dictionary/apply-dictionary.c:77 #: src/language/dictionary/apply-dictionary.c:78 msgid "numeric" msgstr "numerisch" #: src/data/format.c:426 src/data/sys-file-reader.c:2212 #: src/data/sys-file-reader.c:2214 src/language/xforms/recode.c:512 #: src/language/xforms/recode.c:513 src/language/xforms/recode.c:525 #: src/language/xforms/recode.c:526 #: src/language/dictionary/apply-dictionary.c:77 #: src/language/dictionary/apply-dictionary.c:78 msgid "string" msgstr "String" #: src/data/format.c:444 #, c-format msgid "String variable with width %d is not compatible with format %s." msgstr "String-Variable mit Breite %d ist nicht mit dem Format %s kompatibel." #: src/data/format.c:1038 src/ui/gui/var-type-dialog.ui:65 msgid "Comma" msgstr "Komma" #: src/data/format.c:1041 src/ui/gui/var-type-dialog.ui:82 msgid "Dot" msgstr "Punkt" #: src/data/format.c:1044 msgid "Scientific" msgstr "Wissenschaftlich" #: src/data/format.c:1061 src/ui/gui/var-type-dialog.ui:116 msgid "Date" msgstr "Datum" #: src/data/format.c:1064 src/ui/gui/var-type-dialog.ui:133 msgid "Dollar" msgstr "Dollar" #: src/data/format.c:1071 msgid "Custom" msgstr "Benutzerdefiniert" #: src/data/gnumeric-reader.c:478 src/data/ods-reader.c:505 #, c-format msgid "Cannot convert the value in the spreadsheet cell %s to format (%s): %s" msgstr "" "Der Wert in der Tabellenzelle %s kann nicht ins Format konvertiert werden " "(%s): %s" #: src/data/gnumeric-reader.c:502 src/data/ods-reader.c:567 #, c-format msgid "" "There was a problem whilst reading the %s file `%s' (near line %d): `%s'" msgstr "Beim Lesen der %s Datei `%s' (ungefähr bei Zeile %d): `%s'" #: src/data/gnumeric-reader.c:597 #, c-format msgid "" "The gnumeric file `%s' is encoded as %s instead of the usual UTF-8 encoding. " "Any non-ascii characters will be incorrectly imported." msgstr "" "Die Gnumeric-Datei `%s' ist mit %s kodiert, statt mit der üblichen UTF-8 " "Kodierung. Alle Nicht-ASCII-Zeichen werden fehlerhaft improtiert." #: src/data/gnumeric-reader.c:641 src/data/ods-reader.c:682 #, c-format msgid "Invalid cell range `%s'" msgstr "Ungültiger Zellbereich `%s'" #: src/data/gnumeric-reader.c:813 src/data/ods-reader.c:710 #: src/data/ods-reader.c:843 #, c-format msgid "Selected sheet or range of spreadsheet `%s' is empty." msgstr "Ausgewähltes Blatt oder Bereich der Tabelle `%s' ist leer." #: src/data/identifier2.c:60 #, c-format msgid "Identifier `%s' exceeds %d-byte limit." msgstr "Bezeichnung `%s' überschreitet die Grenze von %d Bytes." #: src/data/identifier2.c:84 msgid "Identifier cannot be empty string." msgstr "Identifier kann keine leere Zeichenkette sein." #: src/data/identifier2.c:92 #, c-format msgid "`%s' may not be used as an identifier because it is a reserved word." msgstr "" "`%s' darf nicht als Identifier verwendet werden, da es sich um ein " "reserviertes Wort handelt." #: src/data/identifier2.c:103 #, c-format msgid "" "`%s' may not be used as an identifier because it contains ill-formed UTF-8 " "at byte offset %tu." msgstr "" "`%s' darf nicht als Identifier verwendet werden, da er ein UTF-8 Zeichen an " "der Byte-Offset Stelle %tu enthält." #: src/data/identifier2.c:114 #, c-format msgid "" "Character %s (in `%s') may not appear as the first character in a identifier." msgstr "" "Das Zeichen %s (in `%s') darf nicht als erstes Zeichen eines Identifiers " "verwendet werden." #: src/data/identifier2.c:126 #, c-format msgid "Character %s (in `%s') may not appear in an identifier." msgstr "" "Das Zeichen %s (in `%s') darf nicht als in einem Identifier verwendet werden." #: src/data/mdd-writer.c:241 #, c-format msgid "An I/O error occurred writing metadata file `%s'." msgstr "" "Ein I/O Fehler ist beim Schreiben der Metadaten-Datei `%s' aufgetreten." #. TRANSLATORS: this fragment will be interpolated into #. messages in fh_lock() that identify types of files. #: src/data/mdd-writer.c:457 msgid "metadata file" msgstr "Metadaten-Datei" #: src/data/mdd-writer.c:465 #, c-format msgid "Error opening `%s' for writing as a metadata file: %s." msgstr "Fehler beim Öffnen von `%s' zum Schreiben als Metadaten-Datei: %s." #: src/data/mdd-writer.c:473 #, c-format msgid "Internal error creating xmlTextWriter. Please report this to %s." msgstr "" "Interner Fehler beim Erstellen des xmlTextWriter. Bitte informieren Sie %s " "darüber." #: src/data/make-file.c:217 #, c-format msgid "Opening %s for writing: %s." msgstr "Öffne %s zum schreiben: %s." #: src/data/make-file.c:228 #, c-format msgid "Opening stream for %s: %s." msgstr "Öffne Stream für %s: %s." #: src/data/make-file.c:260 #, c-format msgid "Creating temporary file to replace %s: %s." msgstr "Erstelle temporäre Datei um %s zu ersetzen: %s." #: src/data/make-file.c:277 #, c-format msgid "Creating temporary file %s: %s." msgstr "Erstelle temporäre Datei %s: %s." #: src/data/make-file.c:289 #, c-format msgid "Opening stream for temporary file %s: %s." msgstr "Öffne Stream für temporäre Datei %s: %s." #: src/data/make-file.c:326 #, c-format msgid "Replacing %s by %s: %s." msgstr "Ersetze %s mit %s: %s." #: src/data/make-file.c:354 #, c-format msgid "Removing %s: %s." msgstr "Entferne %s: %s." #: src/data/mrset.c:83 #, c-format msgid "" "%s is not a valid name for a multiple response set. Multiple response set " "names must begin with `$'." msgstr "" "%s ist kein gültiger Name für ein Set von Mehrfachantworten. Die Namen von " "Mehrfachantwort-Sets müssen mit `$' beginnen." #: src/data/ods-reader.c:620 #, c-format msgid "Cannot open %s as a OpenDocument file: %s" msgstr "Kann %s nicht als OpenDocument Datei öffnen: %s" #. TRANSLATORS: this fragment will be interpolated into #. messages in fh_lock() that identify types of files. #: src/data/pc+-file-reader.c:206 msgid "SPSS/PC+ system file" msgstr "SPSS/PC+ Systemdatei" #: src/data/pc+-file-reader.c:215 #, c-format msgid "Error opening `%s' for reading as an SPSS/PC+ system file: %s." msgstr "" "Beim Öffnen von `%s' als SPSS/PC+ System-Datei ist ein Fehler aufgetreten: " "%s." #: src/data/pc+-file-reader.c:224 src/data/sys-file-reader.c:3541 #, c-format msgid "%s: stat failed (%s)." msgstr "%s: Stat ist fehlgeschlagen (%s)." #: src/data/pc+-file-reader.c:230 #, c-format msgid "%s: file too large." msgstr "%s: Datei zu groß." #: src/data/pc+-file-reader.c:257 #, c-format msgid "" "Directory entry is for a %u-byte record starting at offset %u but file is " "only %u bytes long." msgstr "" "Der Verzeichniseintrag ist für einen Eintrag der Länge %u Byte beim Offset " "%u, aber die Datei ist nur %u Bytes lang." #: src/data/pc+-file-reader.c:275 #, c-format msgid "Directory fields have unexpected values (%u,%u)." msgstr "Die Verzeichnisfelder haben unerwartete Werte (%u,%u)." #: src/data/pc+-file-reader.c:372 src/data/sys-file-reader.c:672 #, c-format msgid "Variable %zu" msgstr "Variable %zu" #: src/data/pc+-file-reader.c:380 src/data/sys-file-reader.c:680 #, c-format msgid "Variable %zu Label" msgstr "Beschriftung der Variable %zu" #: src/data/pc+-file-reader.c:385 #, c-format msgid "Variable %zu Value Label %zu" msgstr "Variable %zu Wertelabel %zu" #: src/data/pc+-file-reader.c:388 src/data/sys-file-reader.c:690 msgid "Creation Date" msgstr "Erstellungsdatum" #: src/data/pc+-file-reader.c:389 src/data/sys-file-reader.c:691 msgid "Creation Time" msgstr "Erstellungszeit" #: src/data/pc+-file-reader.c:390 src/data/sys-file-reader.c:692 #: src/language/dictionary/sys-file-info.c:200 msgid "Product" msgstr "Produkt" #: src/data/pc+-file-reader.c:391 src/data/sys-file-reader.c:693 #: src/language/dictionary/sys-file-info.c:300 msgid "File Label" msgstr "Dateibezeichnung" #: src/data/pc+-file-reader.c:427 #, c-format msgid "" "Using default encoding %s to read this SPSS/PC+ system file. For best " "results, specify an encoding explicitly. Use SYSFILE INFO with ENCODING=" "\"DETECT\" to analyze the possible encodings." msgstr "" "Beim Einlesen der SPSS/PC+ Systemdatei wird die voreingestellte " "Zeichensatzkodierung %s verwendet. Um Ihre Ergebnisse noch weiter zu " "verbessern, sollten Sie einen Zeichensatz explizit festlegen. Verwenden Sie " "den Befehl SYSFILE INFO mit dem Argument ENCODING=\"DETECT\", um die zur " "Verfügung stehenden Zeichensätze in Erfahren zu bringen." #: src/data/pc+-file-reader.c:483 src/data/sys-file-reader.c:890 #, c-format msgid "Error closing system file `%s': %s." msgstr "Fehler beim schließen der Systemdatei `%s': %s." #: src/data/pc+-file-reader.c:544 msgid "This is not an SPSS/PC+ system file." msgstr "Dies ist keine SPSS/PC+ System Datei." #: src/data/pc+-file-reader.c:548 #, c-format msgid "Record 0 has unexpected length %u." msgstr "Eintrag 0 hat die unerwartete Länge %u." #: src/data/pc+-file-reader.c:572 #, c-format msgid "Record 0 specifies unexpected system missing value %g (%a)." msgstr "Im Eintrag 0 werden unerwartete fehlende Werte %g (%a) festgelegt." #: src/data/pc+-file-reader.c:577 #, c-format msgid "Record 0 reserved fields have unexpected values (%u,%u,%u,%u,%u,%u)." msgstr "" "Die reservierten Felder im Eintrag 0 haben unerwartete Werte (%u,%u,%u,%u,%u," "%u)." #: src/data/pc+-file-reader.c:581 #, c-format msgid "Record 0 case counts differ (%u versus %u)." msgstr "" "Die Angaben zur Fallzahl im Eintrag 0 unterscheiden sich (%u versus %u)." #: src/data/pc+-file-reader.c:585 #, c-format msgid "Invalid compression type %u." msgstr "Ungültiger Komprimierungstyp %u." #: src/data/pc+-file-reader.c:596 #, c-format msgid "" "Record 0 claims %u cases with %u values per case (requiring at least %zu " "bytes) but data record is only %u bytes long." msgstr "" "Im Eintrag 0 werden %u Fälle mit jeweils %u Werten definiert (dies erfordert " "mindestens %zu Bytes), aber der Dateneintrag ist nur %u Bytes lang." #: src/data/pc+-file-reader.c:618 #, c-format msgid "" "Value labels claimed to end at offset %u in labels record but labels record " "is only %u bytes." msgstr "" "Laut Definition der Wertelabels enden diese am Offset %u, aber der Eintrag " "hat nur %u Bytes." #: src/data/pc+-file-reader.c:629 #, c-format msgid "" "Value labels claimed to be at offset %u with length %u but file size is only " "%u bytes." msgstr "" "Laut Definition der Wertelabels liegen diese am Offset %u mit der Länge %u " "Bytes, aber die Datei ist nur %u Bytes lang." #: src/data/pc+-file-reader.c:656 #, c-format msgid "" "Value labels end with partial label (%u bytes left in record, label length " "%)." msgstr "" "Die Wertelabels enden mit einem unvollständigen Label (%u Bytes sind im " "Eintrag noch übrig, das Label hat die Länge %)." #: src/data/pc+-file-reader.c:669 #, c-format msgid "%u leftover bytes following value labels." msgstr "%u Bytes bleiben hinter dem Wertelabel übrig." #: src/data/pc+-file-reader.c:685 #, c-format msgid "" "Variable label claimed to start at offset %u in labels record but labels " "record is only %u bytes." msgstr "" "Laut Definition der Variablenbeschriftung beginnt der Eintrag am Offset %u, " "aber der Eintrag ist nur %u Bytes lang." #: src/data/pc+-file-reader.c:697 #, c-format msgid "" "Variable label with length %u starting at offset %u in labels record " "overruns end of %u-byte labels record." msgstr "" "Laut Definition der Variablenbeschriftung beginnt der Eintrag der Länge %u " "am Offset %u und überschreitet damit das Ende des Eintrags der Länge %u " "Bytes." #: src/data/pc+-file-reader.c:719 #, c-format msgid "Record 1 has length %u (expected %u)." msgstr "Eintrag 1 hat die Länge %u (erwartetet %u)." #: src/data/pc+-file-reader.c:751 #, c-format msgid "Variable %u has invalid type %." msgstr "Die Variable %u hat den ungültigen Typ %." #: src/data/pc+-file-reader.c:787 #, c-format msgid "Invalid weight index %u." msgstr "Ungültiger Gewichtungsindex %u." #: src/data/pc+-file-reader.c:857 #, c-format msgid "Invalid variable name `%s'." msgstr "Ungültiger Variablenname `%s'." #: src/data/pc+-file-reader.c:865 src/data/sys-file-reader.c:1444 #, c-format msgid "Renaming variable with duplicate name `%s' to `%s'." msgstr "Variable mit doppeltem Namen wird von `%s' zu `%s' umbenannt." #: src/data/pc+-file-reader.c:877 #, c-format msgid "Cannot weight by string variable `%s'." msgstr "Gewichtung mit der Stringvariablen `%s' ist nicht möglich." #: src/data/pc+-file-reader.c:973 src/data/sys-file-reader.c:2762 msgid "File ends in partial case." msgstr "Datei endet in einem Fall." #: src/data/pc+-file-reader.c:979 #, c-format msgid "" "Case beginning at offset 0x%08x extends past end of data record at offset 0x" "%08x." msgstr "" "Der Fall, der am Offset 0x%08x beginnt, überschreitet das Ende des " "Dateneintrags am Offset 0x%08x." #: src/data/pc+-file-reader.c:998 src/data/sys-file-reader.c:2770 #, c-format msgid "Error reading case from file %s." msgstr "Fehler beim lesen eines Falls aus Datei %s." #: src/data/pc+-file-reader.c:1114 src/data/sys-file-reader.c:2933 #, c-format msgid "" "Possible compressed data corruption: string contains compressed integer " "(opcode %d)." msgstr "" "Komprimierte Daten sind möglicherweise nicht lesbar: Zeichenfolge enthält " "eine Integerzahl (opcode %d)." #: src/data/pc+-file-reader.c:1156 src/data/sys-file-reader.c:3234 #, c-format msgid "`%s' near offset 0x%llx: " msgstr "`%s' nahe Offset 0x%llx: " #: src/data/pc+-file-reader.c:1159 src/data/sys-file-reader.c:3237 #, c-format msgid "`%s': " msgstr "`%s': " #: src/data/pc+-file-reader.c:1211 src/data/sys-file-reader.c:3288 #, c-format msgid "System error: %s." msgstr "System Fehler: %s." #: src/data/pc+-file-reader.c:1216 src/data/sys-file-reader.c:3293 msgid "Unexpected end of file." msgstr "Unerwartetes Dateiende." #: src/data/pc+-file-reader.c:1301 src/data/sys-file-reader.c:3518 #, c-format msgid "%s: seek failed (%s)." msgstr "%s: Suche ist fehlgeschlagen (%s)." #: src/data/pc+-file-reader.c:1351 msgid "SPSS/PC+ System File" msgstr "SPSS/PC+ Systemdatei" #: src/data/por-file-reader.c:109 #, c-format msgid "portable file %s corrupt at offset 0x%llx: " msgstr "Portable Datei %s ist defekt bei Offset 0x%llx: " #: src/data/por-file-reader.c:136 #, c-format msgid "reading portable file %s at offset 0x%llx: " msgstr "lese portable Datei %s bei Offset 0x%llx: " #: src/data/por-file-reader.c:164 #, c-format msgid "Error closing portable file `%s': %s." msgstr "Fehler beim Schließen der portablen Datei `%s': %s." #: src/data/por-file-reader.c:216 msgid "unexpected end of file" msgstr "unerwartetes Dateiende" #. TRANSLATORS: this fragment will be interpolated into #. messages in fh_lock() that identify types of files. #: src/data/por-file-reader.c:275 src/data/por-file-writer.c:147 msgid "portable file" msgstr "Portable-Datei" #: src/data/por-file-reader.c:283 #, c-format msgid "" "An error occurred while opening `%s' for reading as a portable file: %s." msgstr "" "Beim Öffnen von `%s' als Portable-Datei ist ein Fehler aufgetreten: %s." #: src/data/por-file-reader.c:304 msgid "Data record expected." msgstr "Datensatz erwartet." #: src/data/por-file-reader.c:402 msgid "Number expected." msgstr "Zahl erwartet." #: src/data/por-file-reader.c:430 msgid "Missing numeric terminator." msgstr "Fehlende numerische Begrenzung." #: src/data/por-file-reader.c:453 msgid "Invalid integer." msgstr "Ungültige Zahl." #: src/data/por-file-reader.c:464 src/data/por-file-reader.c:484 #, c-format msgid "Bad string length %d." msgstr "Falsche Zeichenkettenlänge %d." #: src/data/por-file-reader.c:547 #, c-format msgid "%s: Not a portable file." msgstr "%s: Keine portable Datei." #: src/data/por-file-reader.c:564 #, c-format msgid "Unrecognized version code `%c'." msgstr "Unbekannter Versionscode `%c'." #: src/data/por-file-reader.c:577 #, c-format msgid "Bad date string length %zu." msgstr "Falsche Datums-Feld-Länge %zu." #: src/data/por-file-reader.c:579 #, c-format msgid "Bad time string length %zu." msgstr "Falsche Zeit-Feld-Länge %zu." #: src/data/por-file-reader.c:630 #, c-format msgid "" "%s: Bad format specifier byte (%d). Variable will be assigned a default " "format." msgstr "" "%s: Ungültiges Formatspezifikations-Byte (%d). Der Variable wird das " "voreingestellte Format zugewiesen." #: src/data/por-file-reader.c:651 #, c-format msgid "Numeric variable %s has invalid format specifier %s." msgstr "Die numerische Variable %s hat eine ungültige Formatspezifikation %s." #: src/data/por-file-reader.c:655 #, c-format msgid "String variable %s with width %d has invalid format specifier %s." msgstr "" "Die String-Variable %s mit Breite %d hat eine ungültige Formatspezifikation " "%s." #: src/data/por-file-reader.c:679 msgid "Expected variable count record." msgstr "Angabe der Variablenanzahl erwartet." #: src/data/por-file-reader.c:683 #, c-format msgid "Invalid number of variables %d." msgstr "Ungültige Anzahl von Variablen %d." #: src/data/por-file-reader.c:692 #, c-format msgid "Weight variable name (%s) truncated." msgstr "Der Name der Gewichtungs-Variable (%s) wurde gekürzt." #: src/data/por-file-reader.c:707 msgid "Expected variable record." msgstr "Angabe der Variablen erwartet." #: src/data/por-file-reader.c:711 #, c-format msgid "Invalid variable width %d." msgstr "Ungültige Variablenbreite %d." #: src/data/por-file-reader.c:719 #, c-format msgid "Invalid variable name `%s' in position %d." msgstr "Ungültiger Variablenname `%s' an Position %d. " #: src/data/por-file-reader.c:723 src/data/sys-file-reader.c:1426 #, c-format msgid "Bad width %d for variable %s." msgstr "Falsche Breite %d für Variable %s." #: src/data/por-file-reader.c:737 #, c-format msgid "Duplicate variable name %s in position %d renamed to %s." msgstr "Doppelter Variablenname %s an Position %d wurde umbenannt zu %s." #: src/data/por-file-reader.c:786 #, c-format msgid "Weighting variable %s not present in dictionary." msgstr "Gewichtungsvariable %s ist nicht im Codebuch enthalten." #: src/data/por-file-reader.c:830 #, c-format msgid "Unknown variable %s while parsing value labels." msgstr "Unbekannte Variable %s beim Parsen der Wertelabels." #: src/data/por-file-reader.c:833 #, c-format msgid "" "Cannot assign value labels to %s and %s, which have different variable types." msgstr "" "Wertelabels können nicht auf %s und %s angewendet werden, da sie einen " "anderen Variablentyp besitzen." #: src/data/por-file-reader.c:972 msgid "SPSS Portable File" msgstr "SPSS Portable Datei" #: src/data/por-file-writer.c:139 #, c-format msgid "Invalid decimal digits count %d. Treating as %d." msgstr "Ungültige Anzahl von Dezimalziffern %d. Wird als %d behandelt." #: src/data/por-file-writer.c:159 #, c-format msgid "Error opening `%s' for writing as a portable file: %s." msgstr "Fehler beim Öffnen von `%s' zum schreiben als portable Datei: %s." #: src/data/por-file-writer.c:505 #, c-format msgid "An I/O error occurred writing portable file `%s'." msgstr "Ein I/O Fehler ist beim Schreiben der Portable-Datei `%s' aufgetreten." #: src/data/psql-reader.c:48 msgid "" "Support for reading postgres databases was not compiled into this " "installation of PSPP" msgstr "" "Unterstützung für das Lesen von Postgres Datenbanken wurde nicht in dieser " "Installation von PSPP kompiliert" #: src/data/psql-reader.c:242 msgid "Memory error whilst opening psql source" msgstr "Speicherfehler beim öffnen der PSQL-Quelle" #: src/data/psql-reader.c:248 #, c-format msgid "Error opening psql source: %s." msgstr "Fehler beim Öffnen der psql Quelle: %s." #: src/data/psql-reader.c:263 #, c-format msgid "" "Postgres server is version %s. Reading from versions earlier than 8.0 is not " "supported." msgstr "" "Postgres Server hat die Version %s. Das Lesen von Versionen kleiner als 8.0 " "wird nicht unterstützt." #: src/data/psql-reader.c:283 msgid "" "Connection is unencrypted, but unencrypted connections have not been " "permitted." msgstr "" "Die Verbindung ist unverschlüselt, aber es liegt keine Berechtigung für " "eine unverschlüsselte Verbindungen vor." #: src/data/psql-reader.c:324 src/data/psql-reader.c:349 #: src/data/psql-reader.c:359 #, c-format msgid "Error from psql source: %s." msgstr "Fehler aus psql Quelle: %s." #: src/data/psql-reader.c:454 #, c-format msgid "Unsupported OID %d. SYSMIS values will be inserted." msgstr "" "Nicht unterstützter Object Identifier (OID) %d. Stattdessen wird SYSMIS " "eingefügt." #: src/data/settings.c:391 msgid "" "MXWARNS set to zero. No further warnings will be given even when " "potentially problematic situations are encountered." msgstr "" "MXWARNS wurde auf Null gesetzt. Es werden keine weiteren Warnungen " "ausgegeben, selbst wenn möglicherweise problematische Situationen auftreten." #: src/data/settings.c:398 #, c-format msgid "" "Warnings re-enabled. %d warnings will be issued before aborting syntax " "processing." msgstr "" "Warnungen wurden wieder aktiviert. %d Warnungen werden ausgegeben, bevor die " "Syntaxverarbeitung abgebrochen wird." #: src/data/settings.c:618 #, c-format msgid "" "%s: Custom currency string `%s' does not contain exactly three periods or " "commas (or it contains both)." msgstr "" "%s: Benutzerdefinierte Währungsdefinition `%s' enthält nicht genau drei " "Punkte oder Kommas (oder sie enthält beides)." #. TRANSLATORS: this fragment will be interpolated into #. messages in fh_lock() that identify types of files. #: src/data/sys-file-reader.c:407 src/data/sys-file-writer.c:245 msgid "system file" msgstr "Systemdatei" #: src/data/sys-file-reader.c:414 #, c-format msgid "Error opening `%s' for reading as a system file: %s." msgstr "Beim Öffnen von `%s' als System-Datei ist ein Fehler aufgetreten: %s." #: src/data/sys-file-reader.c:491 msgid "Misplaced type 4 record." msgstr "Falsch gesetzter Typ 4 Eintrag." #: src/data/sys-file-reader.c:496 msgid "Duplicate type 6 (document) record." msgstr "Doppelter Typ 6 (Dokument) Eintrag." #: src/data/sys-file-reader.c:506 src/data/sys-file-reader.c:1343 #, c-format msgid "" "Unrecognized record type 7, subtype %d. For help, please send this file to " "%s and mention that you were using %s." msgstr "" "Eintrag vom Typ 7, Untertyp %d wurde nicht erkannt. Bitte schicken Sie eine " "Kopie dieser Datei an %s und geben Sie an, dass Sie %s verwendet haben." #: src/data/sys-file-reader.c:526 #, c-format msgid "" "Record type 7, subtype %d found here has the same type as the record found " "near offset 0x%llx. For help, please send this file to %s and mention that " "you were using %s." msgstr "" "Der hier gefundene Eintrag vom Typ 7, Untertyp %d ist vom selben Type wie " "der Eintrag der in der Nähe des Offsets 0x%llx. Bitte senden Sie eine Kopie " "dieser Datei an %s und geben Sie an, dass Sie %s verwendet haben." #: src/data/sys-file-reader.c:538 #, c-format msgid "Unrecognized record type %d." msgstr "Typ des Eintrags %d nicht erkannt." #: src/data/sys-file-reader.c:688 #, c-format msgid "Value Label %zu" msgstr "Wertelabel %zu" #: src/data/sys-file-reader.c:697 msgid "Extra Product Info" msgstr "Zusätzliche Produktinformation" #: src/data/sys-file-reader.c:710 #, c-format msgid "Document Line %zu" msgstr "Zeile imDokument %zu" #: src/data/sys-file-reader.c:718 #, c-format msgid "MRSET %zu" msgstr "MRSET %zu" #: src/data/sys-file-reader.c:720 #, c-format msgid "MRSET %zu Label" msgstr "MRSET %zu Label" #: src/data/sys-file-reader.c:725 #, c-format msgid "MRSET %zu Counted Value" msgstr "MRSET %zu Anzahl" #: src/data/sys-file-reader.c:763 #, c-format msgid "" "This system file does not indicate its own character encoding. Using " "default encoding %s. For best results, specify an encoding explicitly. Use " "SYSFILE INFO with ENCODING=\"DETECT\" to analyze the possible encodings." msgstr "" "Diese Systemdatei enthält keine Angaben zur Kodierung des Zeichensatzes. Es " "wird der voreingestellte Zeichensatz %s verwendet. Um Ihre Ergebnisse noch " "weiter zu verbessern, sollten Sie einen Zeichensatz explizit festlegen. " "Verwenden Sie den Befehl SYSFILE INFO mit dem Argument ENCODING=\"DETECT\", " "um die zur Verfügung stehenden Zeichensätze in Erfahren zu bringen." #: src/data/sys-file-reader.c:845 #, c-format msgid "File header claims %d variable positions but %zu were read from file." msgstr "" "Der Dateikopf legt %d Variablenpositionen fest, aber es wurden %zu " "Positionen ausgelesen." #: src/data/sys-file-reader.c:958 src/data/sys-file-reader.c:972 msgid "This is not an SPSS system file." msgstr "Dies ist keine SPSS System Datei." #: src/data/sys-file-reader.c:1027 msgid "" "Compression bias is not the usual value of 100, or system file uses " "unrecognized floating-point format." msgstr "" "Der compression bias hat nicht den üblichen Wert von 100 oder die " "Systemdatei verwendet ein nicht erkanntes Format für Fließkommazahlen." #: src/data/sys-file-reader.c:1102 msgid "Variable label indicator field is not 0 or 1." msgstr "Variablenindikator-Feld ist weder 0 noch 1." #: src/data/sys-file-reader.c:1115 msgid "Numeric missing value indicator field is not -3, -2, 0, 1, 2, or 3." msgstr "" "Numerisches Feld für die Anzeige fehlender Werte ist nicht -3, -2, 0, 1, 2, " "oder 3." #: src/data/sys-file-reader.c:1125 msgid "String missing value indicator field is not 0, 1, 2, or 3." msgstr "Wert für fehlende Daten ist nicht 0, 1, 2, oder 3." #: src/data/sys-file-reader.c:1152 #, c-format msgid "Invalid number of labels %u." msgstr "Ungültige Anzahl von Beschriftungen %u." #: src/data/sys-file-reader.c:1185 msgid "" "Variable index record (type 4) does not immediately follow value label " "record (type 3) as it should." msgstr "" "Der Eintrag des Variablenindex (Typ 4) folgt nicht direkt auf den Eintrag " "des Wertelabels (Typ 3) wie erforderlich." #: src/data/sys-file-reader.c:1197 #, c-format msgid "" "Number of variables associated with a value label (%u) is not between 1 and " "the number of variables (%zu)." msgstr "" "Die Anzahl der Variablen, die mit einem Variablenlabel assoziiert wurden " "(%u) liegt nicht zwischen 1 und der Anzahl der Variablen (%zu)." #: src/data/sys-file-reader.c:1224 #, c-format msgid "Number of document lines (%d) must be greater than 0 and less than %d." msgstr "" "Anzahl der Zeilen im Dokument (%d) muss größer als 0 und kleiner als %d sein." #: src/data/sys-file-reader.c:1317 #, c-format msgid "Record type 7, subtype %d has bad size %u (expected %d)." msgstr "" "Eintrag vom Typ 7, Untertyp %d hat die falsche Größe %u (erwarteter Wert %d)." #: src/data/sys-file-reader.c:1321 #, c-format msgid "Record type 7, subtype %d has bad count %u (expected %d)." msgstr "" "Eintrag vom Typ 7, Untertyp %d hat die falsche Anzahl %u (erwarteter Wert " "%d)." #: src/data/sys-file-reader.c:1435 #, c-format msgid "Renaming variable with invalid name `%s' to `%s'." msgstr "Variable mit ungültigem Namen wird von `%s' zu `%s' umbenannt." #: src/data/sys-file-reader.c:1517 msgid "Missing string continuation record." msgstr "Fehlender Eintrag zur Fortführung der Zeichenfolge." #: src/data/sys-file-reader.c:1550 #, c-format msgid "Variable %s with width %d has invalid print format 0x%x." msgstr "Variable %s mit Breite %d hat ein ungültiges Ausgabeformat 0x%x." #: src/data/sys-file-reader.c:1554 #, c-format msgid "Variable %s with width %d has invalid write format 0x%x." msgstr "Variable %s mit Breite %d hat ein ungültiges Schreibformat 0x%x." #: src/data/sys-file-reader.c:1559 msgid "Suppressing further invalid format warnings." msgstr "Weitere Warnungen zu ungültigen Formaten werden unterdrückt." #: src/data/sys-file-reader.c:1613 #, c-format msgid "" "Floating-point representation indicated by system file (%d) differs from " "expected (%d)." msgstr "" "Die in der Systemdatei (%d) angegebene Fließkommadarstellung weicht vom " "erwarteten Format (%d) ab." #: src/data/sys-file-reader.c:1629 #, c-format msgid "" "Integer format indicated by system file (%d) differs from expected (%d)." msgstr "" "Das in der Systemdatei (%d) angegebene Integerformat weicht vom erwarteten " "Format (%d) ab." #: src/data/sys-file-reader.c:1647 src/data/sys-file-reader.c:1653 #, c-format msgid "File specifies unexpected value %g (%a) as %s, instead of %g (%a)." msgstr "" "Die Datei legt unerwarteter Weise den Wert %g (%a) als %s fest anstatt %g " "(%a)." #: src/data/sys-file-reader.c:1662 #, c-format msgid "" "File specifies unexpected value %g (%a) as %s, instead of %g (%a) or %g (%a)." msgstr "" "Die Datei legt unerwarteter Weise den Wert %g (%a) als %s fest anstatt %g " "(%a) oder %g (%a)." #: src/data/sys-file-reader.c:1714 src/data/sys-file-reader.c:1733 #, c-format msgid "Missing space following `%c' at offset %zu in MRSETS record." msgstr "Fehlendes Leezeichen nach `%c' beim Offset %zu in MRSETS Eintrag." #: src/data/sys-file-reader.c:1741 #, c-format msgid "" "Missing label source value following `E' at offset %zu in MRSETS record." msgstr "" "Fehlender Wert für LABELSOURCE nach `E' beim Offset %zu in MRSETS Eintrag." #: src/data/sys-file-reader.c:1748 #, c-format msgid "" "Unexpected label source value following `E' at offset %zu in MRSETS record." msgstr "" "Unerwarteter Wert für LABELSOURCE nach `E' beim Offset %zu in MRSETS Eintrag." #: src/data/sys-file-reader.c:1755 #, c-format msgid "Missing `C', `D', or `E' at offset %zu in MRSETS record." msgstr "Fehlendes `C', `D', or `E' beim Offset %zu in MRSETS Eintrag." #: src/data/sys-file-reader.c:1782 #, c-format msgid "Missing new-line parsing variable names at offset %zu in MRSETS record." msgstr "" "Fehlender Zeilenumbruch beim Einlesen der Variablennamen beim Offset %zu in " "MRSETS Eintrag." #: src/data/sys-file-reader.c:1817 #, c-format msgid "Invalid multiple response set name `%s'." msgstr "Ungültiger Name für das Mehrfachantworten-Set %s." #: src/data/sys-file-reader.c:1850 #, c-format msgid "MRSET %s contains duplicate variable name %s." msgstr "MRSET %s enthält doppelten Variablennamen %s." #: src/data/sys-file-reader.c:1865 #, c-format msgid "MRSET %s contains both string and numeric variables." msgstr "MRSET %s enthält sowohl Stringvariablen als auch numerische Variablen." #: src/data/sys-file-reader.c:1877 #, c-format msgid "MRSET %s has no variables." msgstr "MRSET %s hat keine Variablen." #: src/data/sys-file-reader.c:1879 #, c-format msgid "MRSET %s has only one variable." msgstr "MRSET %s hat nur eine Variable." #: src/data/sys-file-reader.c:1923 #, c-format msgid "Extension 11 has bad count %u (for %zu variables)." msgstr "Erweiterung 11 hat die falsche Anzahl %u (für %zu Variablen)." #: src/data/sys-file-reader.c:1956 #, c-format msgid "" "Invalid variable display parameters for variable %zu (%s). Default " "parameters substituted." msgstr "" "Ungültige Parameter der Variablenanzeige für Variable %zu (%s). " "Voreingestellte Parameter werden eingesetzt." #: src/data/sys-file-reader.c:2000 #, c-format msgid "Duplicate long variable name `%s'." msgstr "Doppelter langer Variablenname `%s'." #: src/data/sys-file-reader.c:2053 #, c-format msgid "Long variable mapping from %s to invalid variable name `%s'." msgstr "" "Zuordnung eines langen Variablennamens von %s zum ungültigen Namen `%s'." #: src/data/sys-file-reader.c:2088 #, c-format msgid "%s listed as string of invalid length %s in very long string record." msgstr "" "%s wird als String mit ungültiger Länge %s in einem sehr langen " "Stringeintrag verzeichnet." #: src/data/sys-file-reader.c:2099 #, c-format msgid "" "%s listed in very long string record with width %s, which requires only one " "segment." msgstr "" "%s ist in einem sehr langen Stringeintrag mit Breite %s verzeichnet, welcher " "nur ein Segment benötigt." #: src/data/sys-file-reader.c:2107 #, c-format msgid "Very long string %s overflows dictionary." msgstr "Sehr lange Zeichenfolge %s übersteigt das Codebuch." #: src/data/sys-file-reader.c:2125 #, c-format msgid "" "Very long string with width %ld has segment %d of width %d (expected %d)." msgstr "" "Sehr lange Zeichenfolge mit Breite %ld hat das Segment %d der Breite %d " "(erwartet wurde %d)." #: src/data/sys-file-reader.c:2183 #, c-format msgid "Value label variable index %d not in valid range 1...%zu." msgstr "" "Der Variablenindex %d für das Wertelabel liegt nicht im gültigen Bereich 1..." "%zu." #: src/data/sys-file-reader.c:2193 #, c-format msgid "Value label variable index %d refers to long string continuation." msgstr "" "Der Variablenindex %d des Wertelabels verweist auf die Forsetzung einer " "langen Zeichenfolge." #: src/data/sys-file-reader.c:2208 #, c-format msgid "" "Variables associated with value label are not all of identical type. " "Variable %s is %s, but variable %s is %s." msgstr "" "Die mit dem Wertelabel verbundenen Variablen haben nicht alle den gleichen " "Typ. Die Variable %s ist %s, aber die Variable %s ist %s." #: src/data/sys-file-reader.c:2226 #, c-format msgid "" "Value labels may not be added to long string variables (e.g. %s) using " "records types 3 and 4." msgstr "" "Wertelabels dürfen nicht zu langen Stringvariablen hinzugefügt werden (z.B. " "%s), wenn Einträge des Typs 3 und 4 verwendet werden." #: src/data/sys-file-reader.c:2255 #, c-format msgid "Duplicate value label for %g on %s." msgstr "Doppelte Wertebeschriftung für %g in %s." #: src/data/sys-file-reader.c:2260 src/data/sys-file-reader.c:2600 #, c-format msgid "Duplicate value label for `%.*s' on %s." msgstr "Doppelte Wertebeschriftung für `%.*s' in %s." #: src/data/sys-file-reader.c:2283 #, c-format msgid "Suppressed %d additional warnings for value labels." msgstr "Weitere %d Warnungen für Wertelabels werden unterdrückt." #: src/data/sys-file-reader.c:2297 #, c-format msgid "" "Weight variable index %d not in valid range 1...%zu. Treating file as " "unweighted." msgstr "" "Der Variablenindex %d für die Gewichtung liegt nicht im gültigen Bereich 1..." "%zu. Die Datei wird als ungewichtet behandelt." #: src/data/sys-file-reader.c:2307 #, c-format msgid "" "Weight variable index %d refers to long string continuation. Treating file " "as unweighted." msgstr "" "Der Variablenindex %d der Gewichtung (weight) verweist auf die Forsetzung " "einer langen Zeichenfolge. Die Datei wird as ungewichtet (unweighted) " "behandelt." #: src/data/sys-file-reader.c:2315 #, c-format msgid "Ignoring string variable `%s' set as weighting variable." msgstr "Die Stringvariable `%s' wird nicht als Gewichtungsvariable übernommen." #: src/data/sys-file-reader.c:2352 #, c-format msgid "Error parsing attribute value %s[%d]." msgstr "Fehler beim bearbeiten des Attribut-Wertes %s[%d]." #: src/data/sys-file-reader.c:2366 #, c-format msgid "Attribute value %s[%d] is not quoted: %s." msgstr "" "Der Wert des Attributs %s[%d] wurde nicht in Anführungszeichen gesetzt: %s." #: src/data/sys-file-reader.c:2379 #, c-format msgid "Duplicate attribute %s." msgstr "Doppeltes Attribut %s." #: src/data/sys-file-reader.c:2463 #, c-format msgid "Invalid role for variable %s." msgstr "Ungültige Rolle für Variable `%s'." #: src/data/sys-file-reader.c:2472 #, c-format msgid "%zu other variables had invalid roles." msgstr "%zu weitere Variablen hatten ungültige Rollen." #: src/data/sys-file-reader.c:2485 #, c-format msgid "Extension record subtype %d ends unexpectedly." msgstr "Erweiterungseintrag des Untertyps %d endet unerwartet." #: src/data/sys-file-reader.c:2531 #, c-format msgid "Ignoring long string value label record for unknown variable %s." msgstr "" "Langer String im Eintrag der Wertebezeichnung für die Variable %s wird " "ignoriert." #: src/data/sys-file-reader.c:2536 #, c-format msgid "Ignoring long string value label record for numeric variable %s." msgstr "" "Langer String im Eintrag der Wertebezeichnung für die numerische Variable %s " "wird ignoriert." #: src/data/sys-file-reader.c:2543 #, c-format msgid "" "Ignoring long string value label record for variable %s because the record's " "width (%d) does not match the variable's width (%d)." msgstr "" "Langer String im Eintrag der Wertebezeichnung für Variable %s wird " "ignoriert, weil die Breite des Eintrags (%d) nicht mit der Breite der " "Variable (%d) übereinstimmt." #: src/data/sys-file-reader.c:2573 #, c-format msgid "" "Ignoring long string value label %zu for variable %s, with width %d, that " "has bad value width %zu." msgstr "" "Langer String der Wertebezeichnung %zu für die Variable %s mit Breite %d hat " "die fehlerhafte Breite %zu und wird ignoriert." #: src/data/sys-file-reader.c:2646 #, c-format msgid "" "Long string missing values record says variable %s has %d missing values, " "but only 1 to 3 missing values are allowed." msgstr "" "Langer String im Eintrag der fehlenden Werte besagt, dass die Variable %s %d " "fehlende Werte hat, es sind aber nur zwischen 1 und 3 fehlende Werte erlaubt." #: src/data/sys-file-reader.c:2656 #, c-format msgid "Ignoring long string missing value record for unknown variable %s." msgstr "" "Langer String im Eintrag der fehlenden Werte für die unbekannte Variable %s " "wird ignoriert." #: src/data/sys-file-reader.c:2661 #, c-format msgid "Ignoring long string missing value record for numeric variable %s." msgstr "" "Langer String im Eintrag der fehlenden Werte für die numerische Variable %s " "wird ignoriert." #: src/data/sys-file-reader.c:2686 #, c-format msgid "" "Ignoring long string missing value %zu for variable %s, with width %d, that " "has bad value width %zu." msgstr "" "Langer String des fehlenden Wertes %zu für die Variable %s mit Breite %d hat " "die fehlerhafte Breite %zu und wird ignoriert." #: src/data/sys-file-reader.c:2740 msgid "File ends in partial string value." msgstr "Datei endet innerhalb eines unvollständigen Falls." #: src/data/sys-file-reader.c:2879 msgid "" "Possible compressed data corruption: compressed spaces appear in numeric " "field." msgstr "" "Komprimierte Daten sind möglicherweise nicht lesbar: kompriemierte " "Leerzeichen erscheinen in einem numerischen Feld." #: src/data/sys-file-reader.c:3030 #, c-format msgid "Suppressed %d additional related warnings." msgstr "" "Weitere %d Warnungen, die damit in Verbindung stehen, werden unterdrückt." #: src/data/sys-file-reader.c:3076 src/data/sys-file-reader.c:3093 #, c-format msgid "Dictionary record refers to unknown variable %s." msgstr "Eintrag im Codebuch bezieht sich auf die unbekannte Variable %s." #: src/data/sys-file-reader.c:3159 #, c-format msgid "Expecting digit at offset %zu in MRSETS record." msgstr "Beim Offset %zu im MRSETS Eintrag wurde eine Ziffer erwartet." #: src/data/sys-file-reader.c:3167 #, c-format msgid "Expecting space at offset %zu in MRSETS record." msgstr "Beim Offset %zu im MRSETS Eintrag wurde ein Leerzeichen erwartet." #: src/data/sys-file-reader.c:3175 #, c-format msgid "%zu-byte string starting at offset %zu exceeds record length %zu." msgstr "" "Die %zu-byte lange Zeichenfolge, die beim Offset %zu beginnt, überschreitet " "die Länge %zu." #: src/data/sys-file-reader.c:3185 #, c-format msgid "Expecting space at offset %zu following %zu-byte string." msgstr "" "Beim Offset %zu nach der %zu-byte langen Zeichenfolge wurde ein Leerzeichen " "erwartet." #: src/data/sys-file-reader.c:3476 #, c-format msgid "Wrong ZLIB data header offset %#llx (expected %#llx)." msgstr "" "Fehlerhafter Offset %#llx (erwartet wurde %#llx) im Kopf der ZLIB-Daten." #: src/data/sys-file-reader.c:3484 #, c-format msgid "Impossible ZLIB trailer offset 0x%llx." msgstr "Offset 0x%llx im Nachspann der ZLIB-Daten ist nicht möglich." #: src/data/sys-file-reader.c:3491 #, c-format msgid "Invalid ZLIB trailer length %lld." msgstr "Länge %lld des Nachspanns der ZLIB-Daten ist ungültig." #: src/data/sys-file-reader.c:3555 #, c-format msgid "End of ZLIB trailer (0x%llx) is not file size (0x%llx)." msgstr "" "Das Ende des Nachspanns der ZLIB-Daten (0x%llx) stimmt nicht mit der " "Dateigröße (0x%llx) überein." #: src/data/sys-file-reader.c:3565 #, c-format msgid "ZLIB trailer bias (%lld) differs from file header bias (%.2f)." msgstr "" "Der Bias im Nachspann der ZLIB-Daten (%lld) unterscheidet sich vom Bias im " "Kopf der Datei (%.2f)." #: src/data/sys-file-reader.c:3575 #, c-format msgid "ZLIB trailer \"zero\" field has nonzero value %lld." msgstr "" "Das Feld \"zero\" im Nachspann der ZLIB-Daten hat den von Null verschiedenen " "Wert %lld." #: src/data/sys-file-reader.c:3581 #, c-format msgid "ZLIB trailer specifies unexpected %u-byte block size." msgstr "" "Der Nachspann der ZLIB-Daten legt die unerwartete Blockgröße von %u Bytes " "fest." #: src/data/sys-file-reader.c:3589 #, c-format msgid "%lld-byte ZLIB trailer specifies %u data blocks (expected %lld)." msgstr "" "Der Nachspann der ZLIB-Daten der Größe %lld Bytes legt %u Datenblocks fest " "(erwartet wurde %lld)." #: src/data/sys-file-reader.c:3614 #, c-format msgid "" "ZLIB block descriptor %u reported uncompressed data offset %#llx, when %#llx " "was expected." msgstr "" "Die Blockbeschreibung %u der ZLIB-Daten berichtet ein Offset der " "unkomprimierten Daten von %#llx, wobei %#llx erwartet wurde." #: src/data/sys-file-reader.c:3623 #, c-format msgid "" "ZLIB block descriptor %u reported compressed data offset %#llx, when %#llx " "was expected." msgstr "" "Die Blockbeschreibung %u der ZLIB-Daten berichtet ein Offset der " "komprimierten Daten von %#llx, wobei %#llx erwartet wurde." #: src/data/sys-file-reader.c:3633 #, c-format msgid "" "ZLIB block descriptor %u reported block size %#x, when %#x was expected." msgstr "" "Die Blockbeschreibung %u der ZLIB-Daten berichtet eine Blockgröße von %#x, " "wobei %#x erwartet wurde." #: src/data/sys-file-reader.c:3641 #, c-format msgid "" "ZLIB block descriptor %u reported block size %#x, when at most %#x was " "expected." msgstr "" "Die Blockbeschreibung %u der ZLIB-Daten berichtet eine Blockgröße von %#x, " "wobei höchstens %#x erwartet wurde." #: src/data/sys-file-reader.c:3653 #, c-format msgid "" "ZLIB block descriptor %u reports compressed size %u and uncompressed size %u." msgstr "" "Die Blockbeschreibung %u der ZLIB-Daten berichtet eine komprimierte Größe " "von %u und eine unkomprimierte Größe von %u." #: src/data/sys-file-reader.c:3665 #, c-format msgid "" "ZLIB trailer is at offset %#llx but %#llx would be expected from block " "descriptors." msgstr "" "Der Nachspann der ZLIB-Daten liegt beim Offset %#llx, aber auf Grund der " "Blockbeschreibungen wurde %#llx erwartet." #: src/data/sys-file-reader.c:3684 #, c-format msgid "ZLIB initialization failed (%s)." msgstr "Initialisierung von ZLIB ist fehlgeschlagen (%s)." #: src/data/sys-file-reader.c:3699 #, c-format msgid "Inconsistency at end of ZLIB stream (%s)." msgstr "Am Ende des ZLIB-Datenstroms ist eine Inkonsistenz aufgetreten (%s)." #: src/data/sys-file-reader.c:3758 #, c-format msgid "ZLIB stream inconsistency (%s)." msgstr "Im ZLIB-Datenstrom ist eine Inkonsistenz aufgetreten (%s)." #: src/data/sys-file-reader.c:3782 msgid "Unexpected end of ZLIB compressed data." msgstr "Unerwartetes Ende der komprimierten ZLIB-Daten." #: src/data/sys-file-reader.c:3820 msgid "SPSS System File" msgstr "SPSS Systemdatei" #: src/data/sys-file-writer.c:210 #, c-format msgid "Unknown system file version %d. Treating as version %d." msgstr "" "Die Version %d der Szstemdatei ist unbekannt. Es wird die Version %d " "verwendet." #: src/data/sys-file-writer.c:256 #, c-format msgid "Error opening `%s' for writing as a system file: %s." msgstr "Fehler beim öffnen `%s' um dies als Systemdatei zu speichern: %s." #: src/data/sys-file-writer.c:1271 #, c-format msgid "An I/O error occurred writing system file `%s'." msgstr "Beim Schreiben der Systemdatei `%s' ist ein I/O-Fehler aufgetreten." #: src/data/sys-file-writer.c:1378 #, c-format msgid "Failed to initialize ZLIB for compression (%s)." msgstr "" "Initialisierung von ZLIB für die Komprimierung ist fehlgeschlagen (%s)." #: src/data/sys-file-writer.c:1407 #, c-format msgid "Failed to complete ZLIB stream compression (%s)." msgstr "" "Die Komprimierung des ZLIB-Datenstroms konnte nicht abgeschlossen werden " "(%s)." #: src/data/sys-file-writer.c:1449 #, c-format msgid "ZLIB stream compression failed (%s)." msgstr "Die Komprimierung des ZLIB-Datenstroms ist fehlgeschlagen (%s)." #: src/data/sys-file-writer.c:1491 #, c-format msgid "%s: Seek failed (%s)." msgstr "%s: Suche fehlgeschlagen (%s)." #: src/data/variable.c:58 msgid "Left" msgstr "Links" #: src/data/variable.c:59 msgid "Right" msgstr "Rechts" #: src/data/variable.c:60 msgid "Center" msgstr "Zentriert" #: src/data/variable.c:66 msgid "Nominal" msgstr "Nominal" #: src/data/variable.c:67 msgid "Ordinal" msgstr "Ordinal" #: src/data/variable.c:68 src/language/stats/ks-one-sample.c:300 msgid "Scale" msgstr "Skala" #: src/data/variable.c:74 msgid "Input" msgstr "Eingabe" #. TRANSLATORS: This will be part of a filename. Please avoid whitespace. #: src/data/variable.c:75 src/output/spv/spv-writer.c:213 #: src/ui/gui/psppire-output-window.c:547 msgid "Output" msgstr "Ziel" #: src/data/variable.c:76 msgid "Both" msgstr "Beides" #: src/data/variable.c:77 src/language/dictionary/sys-file-info.c:237 #: src/ui/gui/psppire-dialog-action-crosstabs.c:86 #: src/ui/gui/psppire-dialog-action-crosstabs.c:98 #: src/ui/gui/psppire-dialog-action-crosstabs.c:133 #: src/ui/gui/psppire-dialog-action-crosstabs.c:141 #: src/ui/gui/psppire-variable-sheet.c:408 src/ui/gui/var-display.c:34 msgid "None" msgstr "Keine" #: src/data/variable.c:78 msgid "Partition" msgstr "Partitionieren" #: src/data/variable.c:79 src/ui/gui/reliability.ui:37 msgid "Split" msgstr "Aufteilen" #: src/data/variable.c:729 #, c-format msgid "%s (%s)" msgstr "%s (%s)" #: src/data/variable.c:1339 msgid "" "At least one case in the data file had a weight value that was user-missing, " "system-missing, zero, or negative. These case(s) were ignored." msgstr "" "Mindestens ein Wert in der Datendatei hatte ein Gewicht das Benutzer-" "Fehlend, System-Fehlend, Null oder negativ war. Diese Fälle wurden ignoriert." #: src/language/command.c:207 src/language/stats/graph.c:749 #: src/language/stats/graph.c:755 src/language/stats/graph.c:789 #: src/language/stats/graph.c:794 src/language/stats/graph.c:799 #: src/language/stats/graph.c:852 src/language/stats/graph.c:857 #: src/language/stats/graph.c:862 src/language/stats/graph.c:867 #: src/language/stats/graph.c:872 src/language/stats/graph.c:877 #: src/language/stats/graph.c:882 src/language/utilities/set.q:236 #, c-format msgid "%s is not yet implemented." msgstr "%s ist noch nicht implementiert." #: src/language/command.c:212 #, c-format msgid "%s may be used only in testing mode." msgstr "%s darf nur im Testmodus verwendet werden." #: src/language/command.c:217 #, c-format msgid "%s may be used only in enhanced syntax mode." msgstr "%s darf nur im erweiterten Syntaxmodus verwendet werden." #: src/language/command.c:345 msgid "expecting command name" msgstr "erwarte den Namen eines Befehls" #: src/language/command.c:347 #, c-format msgid "Unknown command `%s'." msgstr "Unbekannter Befehl `%s'." #: src/language/command.c:380 #, c-format msgid "%s is allowed only before the active dataset has been defined." msgstr "%s ist nur erlaubt bevor das aktive Daten-Set festgelegt wurde." #: src/language/command.c:384 #, c-format msgid "%s is allowed only after the active dataset has been defined." msgstr "%s ist nur erlaubt nachdem das aktive Daten-Set festgelegt wurde." #: src/language/command.c:388 src/language/command.c:392 #, c-format msgid "%s is allowed only inside %s." msgstr "%s ist nur innerhalb von %s erlaubt." #: src/language/command.c:399 src/language/command.c:403 #, c-format msgid "" "%s is allowed only before the active dataset has been defined or inside %s." msgstr "" "%s ist nur erlaubt bevor das aktive Daten-Set festgelegt wurde oder " "innerhalb von %s." #: src/language/command.c:407 src/language/command.c:411 #, c-format msgid "" "%s is allowed only after the active dataset has been defined or inside %s." msgstr "" "%s ist nur erlaubt nachdem das aktive Daten-Set festgelegt wurde oder " "innerhalb von %s." #: src/language/command.c:415 #, c-format msgid "%s is allowed only inside %s or inside %s." msgstr "%s ist nur innerhalb von %s oder von %s erlaubt." #: src/language/command.c:421 #, c-format msgid "" "%s is allowed only after the active dataset has been defined, inside INPUT " "PROGRAM, or inside FILE TYPE." msgstr "" "%s ist nur erlaubt nachdem das aktive Daten-Set festgelegt wurde, innerhalb " "von INPUT PROGRAM oder innerhalb von FILE TYPE." #: src/language/command.c:426 #, c-format msgid "" "%s is allowed only before the active dataset has been defined, inside INPUT " "PROGRAM, or inside FILE TYPE." msgstr "" "%s ist nur erlaubt bevor das aktive Daten-Set festgelegt wurde, innerhalb " "von INPUT PROGRAM oder innerhalb von FILE TYPE." #: src/language/command.c:444 src/language/command.c:447 #, c-format msgid "%s is not allowed inside %s." msgstr "%s ist innerhalb von %s nicht erlaubt." #: src/language/command.c:529 src/language/utilities/host.c:272 #: src/language/utilities/permissions.c:105 #, c-format msgid "This command not allowed when the %s option is set." msgstr "Dieser Befehl ist nicht erlaubt, wenn die Option %s gesetzt wurde." #: src/language/command.c:545 #, c-format msgid "Error removing `%s': %s." msgstr "Fehler beim Entfernen `%s': %s." #: src/language/lexer/lexer.c:296 #, c-format msgid "expecting %s" msgstr "erwarte %s" #: src/language/lexer/lexer.c:300 #, c-format msgid "expecting %s or %s" msgstr "erwarte %s oder %s" #: src/language/lexer/lexer.c:304 #, c-format msgid "expecting %s, %s, or %s" msgstr "erwarte %s, %s oder %s" #: src/language/lexer/lexer.c:309 #, c-format msgid "expecting %s, %s, %s, or %s" msgstr "erwarte %s, %s, %s oder %s" #: src/language/lexer/lexer.c:314 #, c-format msgid "expecting %s, %s, %s, %s, or %s" msgstr "erwarte %s, %s, %s, %s oder %s" #: src/language/lexer/lexer.c:319 #, c-format msgid "expecting %s, %s, %s, %s, %s, or %s" msgstr "erwarte %s, %s, %s, %s, %s oder %s" #: src/language/lexer/lexer.c:325 #, c-format msgid "expecting %s, %s, %s, %s, %s, %s, or %s" msgstr "erwarte %s, %s, %s, %s, %s, %s oder %s" #: src/language/lexer/lexer.c:331 #, c-format msgid "expecting %s, %s, %s, %s, %s, %s, %s, or %s" msgstr "erwarte %s, %s, %s, %s, %s, %s, %s oder %s" #: src/language/lexer/lexer.c:351 #, c-format msgid "Subcommand %s may only be specified once." msgstr "Unterbefehl %s darf nur einmal verwendet werden." #: src/language/lexer/lexer.c:363 #, c-format msgid "Required subcommand %s was not specified." msgstr "Der erforderliche Unterbefehl %s wurde nicht angegeben." #: src/language/lexer/lexer.c:371 #, c-format msgid "%s may only be specified once within subcommand %s" msgstr "%s darf nur einmal innerhalb des Unterbefehls %s verwendet werden" #: src/language/lexer/lexer.c:380 #, c-format msgid "Required %s specification missing from %s subcommand" msgstr "Erforderliche Angabe %s fehlt im Unterbefehl %s" #: src/language/lexer/lexer.c:399 msgid "Syntax error at end of input" msgstr "Syntax Fehler am ende der Eingabe" #: src/language/lexer/lexer.c:420 src/language/xforms/select-if.c:60 #: src/language/stats/autorecode.c:206 src/language/stats/npar.c:503 #: src/language/data-io/print-space.c:83 msgid "expecting end of command" msgstr "erwarte Befehlsende" #: src/language/lexer/lexer.c:631 msgid "expecting string" msgstr "erwarte Zeichenkette" #: src/language/lexer/lexer.c:660 msgid "expecting integer" msgstr "erwarte Integer" #: src/language/lexer/lexer.c:673 msgid "expecting number" msgstr "erwarte Zahl" #: src/language/lexer/lexer.c:685 msgid "expecting identifier" msgstr "erwarte Identifier" #: src/language/lexer/lexer.c:1272 msgid "Syntax error at end of command" msgstr "Syntax Fehler am Ende des Befehls" #: src/language/lexer/lexer.c:1281 #, c-format msgid "Syntax error at `%s'" msgstr "Syntax Fehler bei `%s'" #: src/language/lexer/lexer.c:1284 msgid "Syntax error" msgstr "Syntax Fehler" #: src/language/lexer/lexer.c:1470 #, c-format msgid "String of hex digits has %d characters, which is not a multiple of 2" msgstr "" "String der Hexadezimalziffern hat %d Zeichen, was nicht ein Vielfaches von 2 " "ist" #: src/language/lexer/lexer.c:1477 #, c-format msgid "`%c' is not a valid hex digit" msgstr "`%c' ist keine gültige Hexadezimalziffer" #: src/language/lexer/lexer.c:1482 #, c-format msgid "" "Unicode string contains %d bytes, which is not in the valid range of 1 to 8 " "bytes" msgstr "" "Unicode String enthält %d Bytes, was nicht im gültigen Bereich von 1 bis 8 " "Bytes liegt" #: src/language/lexer/lexer.c:1488 #, c-format msgid "U+%04X is not a valid Unicode code point" msgstr "U+%04X ist kein gültiger Unicode Codepoint" #: src/language/lexer/lexer.c:1493 msgid "Unterminated string constant" msgstr "Nicht abgeschlossene Stringkonstante" #: src/language/lexer/lexer.c:1497 #, c-format msgid "Missing exponent following `%s'" msgstr "Nach `%s' fehlt der Exponent" #: src/language/lexer/lexer.c:1502 msgid "Unexpected `.' in middle of command" msgstr "Unerwarteter Punkt `.' in der Mitte des Befehls." #: src/language/lexer/lexer.c:1508 #, c-format msgid "Bad character %s in input" msgstr "Ungültiges Zeichen %s in der Eingabe" #: src/language/lexer/lexer.c:1603 #, c-format msgid "Opening `%s': %s." msgstr "Öffne `%s': %s." #: src/language/lexer/lexer.c:1647 #, c-format msgid "Error closing `%s': %s." msgstr "Fehler beim Schließen von `%s': %s." #: src/language/lexer/subcommand-list.c:118 #, c-format msgid "No more than %d %s subcommands allowed." msgstr "Es sind nicht mehr als %d %s Unterbefehle erlaubt." #: src/language/lexer/format-parser.c:77 msgid "expecting valid format specifier" msgstr "erwarte gültige Formatangabe" #: src/language/lexer/format-parser.c:116 #: src/language/lexer/format-parser.c:143 src/language/utilities/output.c:108 #: src/language/data-io/data-list.c:453 src/language/data-io/get-data.c:638 #: src/language/data-io/placement-parser.c:236 #, c-format msgid "Unknown format type `%s'." msgstr "Unbekannter Formattyp `%s'." #: src/language/lexer/format-parser.c:122 #, c-format msgid "Format specifier `%s' lacks required width." msgstr "Formatangabe `%s' hat nicht die erforderliche Breite." #: src/language/lexer/format-parser.c:138 msgid "expecting format type" msgstr "erwarte Formattyp" #: src/language/lexer/value-parser.c:66 #, c-format msgid "" "The high end of the range (%.*g) is below the low end (%.*g). The range " "will be treated as if reversed." msgstr "" "Das obere Ende des Bereichs (%.*g) ist kleiner als das untere Ende (%.*g). " "Die Bereichsgrenzen werden vertauscht." #: src/language/lexer/value-parser.c:74 #, c-format msgid "Ends of range are equal (%.*g)." msgstr "Die beiden Grenzen des Bereichs sind gleich (%.*g)." #: src/language/lexer/value-parser.c:82 #, c-format msgid "%s or %s must be part of a range." msgstr "%s oder %s müssen innerhalb eines Bereichs liegen." #: src/language/lexer/value-parser.c:112 msgid "System-missing value is not valid here." msgstr "System-definierter fehlender Wert ist hier nicht gültig." #: src/language/lexer/variable-parser.c:86 utilities/pspp-convert.c:83 msgid "expecting variable name" msgstr "erwarte Variablenname" #: src/language/lexer/variable-parser.c:96 #, c-format msgid "%s is not a variable name." msgstr "%s ist kein Variablenname" #: src/language/lexer/variable-parser.c:206 #, c-format msgid "" "%s is not a numeric variable. It will not be included in the variable list." msgstr "" "%s ist keine numerische Variable. Sie wird nicht in die Variablenliste " "eingefügt." #: src/language/lexer/variable-parser.c:209 #, c-format msgid "" "%s is not a string variable. It will not be included in the variable list." msgstr "" "%s ist keine String-Variable. Sie wird nicht in die Variablenliste eingefügt." #: src/language/lexer/variable-parser.c:213 #, c-format msgid "Scratch variables (such as %s) are not allowed here." msgstr "Temporäre Variablen (wie z.B. %s) sind hier nicht erlaubt." #: src/language/lexer/variable-parser.c:217 #, c-format msgid "" "%s and %s are not the same type. All variables in this variable list must " "be of the same type. %s will be omitted from the list." msgstr "" "%s und %s haben nicht den gleichen Variablentyp. Alle Variablen in dieser " "Liste müssen vom selben Typ sein. %s wird nicht übernommen." #: src/language/lexer/variable-parser.c:223 #, c-format msgid "" "%s and %s are string variables with different widths. All variables in this " "variable list must have the same width. %s will be omitted from the list." msgstr "" "%s und %s sind String-Variablen mit unterschiedlichen Breiten. Alle " "Variablen in dieser Liste müssen die selbe Breite haben. %s wird nicht aus " "der Liste übernommen." #: src/language/lexer/variable-parser.c:228 #: src/language/lexer/variable-parser.c:447 #, c-format msgid "Variable %s appears twice in variable list." msgstr "Variable %s taucht zwei Mal in der Variablenliste auf." #: src/language/lexer/variable-parser.c:341 #, c-format msgid "%s TO %s is not valid syntax since %s precedes %s in the dictionary." msgstr "%s TO %s ist keine gültige Syntax, weil %s im Codebuch vor %s liegt." #: src/language/lexer/variable-parser.c:349 #, c-format msgid "" "When using the TO keyword to specify several variables, both variables must " "be from the same variable dictionaries, of either ordinary, scratch, or " "system variables. %s is a %s variable, whereas %s is %s." msgstr "" "Bei der Verwendung des TO Schlüsselwortes für die Spezifikation mehrerer " "Variablen müssen beide Variablen aus dem selben Codebuch von normalen, " "temporären oder Systemvariablen stammen. %s ist eine %s Variable, aber %s " "ist %s." #: src/language/lexer/variable-parser.c:424 #, c-format msgid "`%s' cannot be used with TO because it does not end in a digit." msgstr "" "`%s' kann nicht in Kombination mit TO verwendet werden, weil es nicht mit " "einer Ziffer endet." #: src/language/lexer/variable-parser.c:432 #, c-format msgid "Numeric suffix on `%s' is larger than supported with TO." msgstr "Der numerische Suffix von `%s' ist größer als von TO unterstützt wird." #: src/language/lexer/variable-parser.c:505 msgid "Scratch variables not allowed here." msgstr "Temporäre Variablen sind hier nicht erlaubt." #: src/language/lexer/variable-parser.c:529 msgid "Prefixes don't match in use of TO convention." msgstr "" "Die Prefixes stimmen nicht überein, wie für den TO Befehl erforderlich." #: src/language/lexer/variable-parser.c:534 msgid "Bad bounds in use of TO convention." msgstr "" "Die Grenzen bei der Verwendung des TO Befehls sind nicht richtig angegeben." #: src/language/xforms/compute.c:150 src/language/xforms/compute.c:205 #, c-format msgid "" "When executing COMPUTE: SYSMIS is not a valid value as an index into vector " "%s." msgstr "" "Beim Ausführen von COMPUTE: SYSMIS ist kein gültiger Wert für einen Index im " "Vektor %s." #: src/language/xforms/compute.c:154 src/language/xforms/compute.c:212 #, c-format msgid "" "When executing COMPUTE: %.*g is not a valid value as an index into vector %s." msgstr "" "Beim Ausführen von COMPUTE: %.*g ist kein gültiger Wert für einen Index im " "Vektor %s." #: src/language/xforms/compute.c:356 #, c-format msgid "There is no vector named %s." msgstr "Es gibt keinen Vektor namens %s." #: src/language/xforms/count.c:125 msgid "Destination cannot be a string variable." msgstr "Ziel kann keine Stringvariable sein." #: src/language/xforms/sample.c:76 msgid "The sampling factor must be between 0 and 1 exclusive." msgstr "Der Anteilswert der Zufallsstichprobe muss zwischen 0 und 1 liegen." #: src/language/xforms/sample.c:96 #, c-format msgid "Cannot sample %d observations from a population of %d." msgstr "" "Es ist nicht möglich eine Stichprobe von %d Beobachtungen aus eine " "Population von %d zu ziehen." #: src/language/xforms/recode.c:261 msgid "" "Inconsistent target variable types. Target variables must be all numeric or " "all string." msgstr "" "Inkonsistenz im Typ der Zielvariablen. Zielvariablen müssen alle numerisch " "oder alle vom Typ String sein." #: src/language/xforms/recode.c:282 msgid "CONVERT requires string input values and numeric output values." msgstr "" "CONVERT erfordert Stringwerte als Input und numerische Werte als Output." #: src/language/xforms/recode.c:339 #, c-format msgid "%s is not allowed with string variables." msgstr "%s ist bei Stringvariablen nicht erlaubt." #: src/language/xforms/recode.c:422 msgid "expecting output value" msgstr "erwarte Ausgabewert" #: src/language/xforms/recode.c:479 #, c-format msgid "" "%zu variable(s) cannot be recoded into %zu variable(s). Specify the same " "number of variables as source and target variables." msgstr "" "%zu Variable(n) können nicht zu %zu Variable(n) umkodiert werden. Legen Sie " "die selbe Anzahl von Quell- und Zielvariablen fest." #: src/language/xforms/recode.c:494 #, c-format msgid "" "There is no variable named %s. (All string variables specified on INTO must " "already exist. Use the STRING command to create a string variable.)" msgstr "" "Eine Variable mit dem Namen %s existiert nicht. (Alle Stringvariablen die " "mit INTO angegeben werden, müssen bereits existieren. Verwenden Sie den " "STRING-Befehl um eine Stringvariable zu erstellen.)" #: src/language/xforms/recode.c:510 #, c-format msgid "INTO is required with %s input values and %s output values." msgstr "Für INTO werden %s Eingabewerte und %s Ausgabewerte benötigt." #: src/language/xforms/recode.c:523 #, c-format msgid "Type mismatch. Cannot store %s data in %s variable %s." msgstr "" "Typen stimmen nicht überein. %s Daten können nicht in %s Variable %s " "gespeichert werden." #: src/language/xforms/recode.c:566 #, c-format msgid "" "Cannot recode because the variable %s would require a width of %d bytes or " "greater, but it has a width of only %d bytes." msgstr "" "Umkodierung kann nicht erfolgen, weil die Variable %s eine Breite von %d " "Bytes erfordern würde, aber sie eine Breite von nur %d Bytes hat." #: src/language/xforms/select-if.c:100 msgid "Syntax error expecting OFF or BY. Turning off case filtering." msgstr "" "Syntaxfehler, es wurde OFF oder BY erwartet. Fallauswahl wird abgeschalten." #: src/language/xforms/select-if.c:115 msgid "The filter variable must be numeric." msgstr "Die Filtervariable muss numerisch sein." #: src/language/xforms/select-if.c:121 msgid "The filter variable may not be scratch." msgstr "Die Filtervariable darf keine Scratchvariable sein." #: src/language/control/control-stack.c:49 #, c-format msgid "%s without %s." msgstr "%s ohne %s." #: src/language/control/control-stack.c:77 #, c-format msgid "This command must appear inside %s...%s, without intermediate %s...%s." msgstr "" "Dieser Befehl muss innerhalb von %s...%s verwendet werden, ohne " "Unterbrechung durch %s...%s." #: src/language/control/control-stack.c:94 #, c-format msgid "This command cannot appear outside %s...%s." msgstr "Dieser Befehl kann nicht außerhalb von %s...%s verwendet werden." #: src/language/control/do-if.c:180 #, c-format msgid "This command may not follow %s in %s ... %s." msgstr "" "Dieser Befehl kann nicht nach %s innerhalb von %s ... %s verwendet werden." #: src/language/control/loop.c:211 msgid "Only one index clause may be specified." msgstr "Es darf nur eine Index Anweisung verwendet werden." #: src/language/control/repeat.c:120 #, c-format msgid "Dummy variable name `%s' hides dictionary variable `%s'." msgstr "Name der Dummyvariable `%s' verdeckt die Variable `%s' im Codebuch." #: src/language/control/repeat.c:126 #, c-format msgid "Dummy variable name `%s' is given twice." msgstr "Der Name der Dummyvariable `%s' wurde doppelt vergeben." #: src/language/control/repeat.c:170 #, c-format msgid "" "Dummy variable `%s' had %zu substitutions, so `%s' must also, but %zu were " "specified." msgstr "" "Die Dummyvariable `%s' hatte %zu Ersetzungen, daher sollte dies auch für `" "%s' der Fall sein, aber es wurden %zu Ersetzungen angegeben." #: src/language/control/repeat.c:379 msgid "Ranges may only have integer bounds." msgstr "Bereiche dürfen nur ganze Zahlen als Grenzen haben." #: src/language/control/repeat.c:393 #, c-format msgid "%ld TO %ld is an invalid range." msgstr "%ld TO %ld ist ein ungültiger Bereich." #: src/language/control/repeat.c:443 #, c-format msgid "No matching %s." msgstr "Keine Übereinstimmungen mit %s." #: src/language/control/temporary.c:44 msgid "" "This command may only appear once between procedures and procedure-like " "commands." msgstr "" "Dieser Befehl darf zwischen Prozeduren und prozedur-ähnlichen Befehlen nur " "ein Mal verwendet werden." #: src/language/dictionary/attributes.c:104 msgid "Attribute array index must be between 1 and 65535." msgstr "Attribut Array Index muss zwischen 1 und 65535 liegen." #: src/language/dictionary/apply-dictionary.c:74 #, c-format msgid "Variable %s is %s in target file, but %s in source file." msgstr "" "Die Variable %s hat in der Zieldatei den Typ %s, aber in der Quelldatei den " "Typ %s." #: src/language/dictionary/apply-dictionary.c:110 msgid "No matching variables found between the source and target files." msgstr "" "Keine übereinstimmenden Variablen in der Quelldatei und der Zieldatei " "gefunden." #: src/language/dictionary/delete-variables.c:40 #: src/language/dictionary/modify-variables.c:79 #: src/language/dictionary/rename-variables.c:51 #, c-format msgid "" "%s may not be used after %s. Temporary transformations will be made " "permanent." msgstr "" "%s darf nicht nach %s verwendet werden. Temporäre Transformationen werden " "dauerhaft gemacht." #: src/language/dictionary/delete-variables.c:48 #: src/language/dictionary/modify-variables.c:312 #, c-format msgid "" "%s may not be used to delete all variables from the active dataset " "dictionary. Use %s instead." msgstr "" "%s darf nicht dafür verwendet werden, alle Variablen aus dem Codebuch des " "aktiven Datenblatts zu löschen. Verwenden Sie stattdessen %s." #: src/language/dictionary/missing-values.c:70 #, c-format msgid "" "Cannot mix numeric variables (e.g. %s) and string variables (e.g. %s) within " "a single list." msgstr "" "Numerische Variablen (z.B. %s) und Stringvariablen (z.B. %s) können nicht in " "einer Liste kombiniert werden." #: src/language/dictionary/missing-values.c:91 msgid "" "Too many numeric missing values. At most three individual values or one " "value and one range are allowed." msgstr "" "Zu viele fehlende numerische Werte. Es sind höchstens drei einzelne Werte " "oder ein Wert und eine Wertebereich erlaubt." #: src/language/dictionary/missing-values.c:126 #, c-format msgid "Truncating missing value to maximum acceptable length (%d bytes)." msgstr "" "Der fehlende Wert wird auf die maximal erlaubte Länge (%d Bytes) gekürzt." #: src/language/dictionary/missing-values.c:137 msgid "" "Too many string missing values. At most three individual values are allowed." msgstr "" "Zu viele fehlende String-Werte. Es sind höchstens drei einzelne Werte " "erlaubt." #: src/language/dictionary/missing-values.c:154 #, c-format msgid "Missing values provided are too long to assign to variable of width %d." msgstr "Die angegebenen Werte sind zu lang für eine Variable der Breite %d." #: src/language/dictionary/modify-variables.c:145 msgid "Cannot specify ALL after specifying a set of variables." msgstr "" "Nach der Angabe von Variablen kann der Befehl ALL nicht mehr verwendet " "werden." #: src/language/dictionary/modify-variables.c:221 #: src/language/dictionary/rename-variables.c:76 #, c-format msgid "" "Differing number of variables in old name list (%zu) and in new name list " "(%zu)." msgstr "" "Die Anzahl an Variablen in der Liste der alten Namen (%zu) stimmt nicht mit " "der Anzahl in der Liste der neuen Namen (%zu) überein." #: src/language/dictionary/modify-variables.c:244 #: src/language/dictionary/modify-variables.c:294 #, c-format msgid "" "%s subcommand may be given at most once. It may not be given in conjunction " "with the %s subcommand." msgstr "" "Der Unterbefehl %s darf höchstens ein Mal verwendet werden. Gemeinsam mit " "dem Unterbefehl %s darf er gar nicht verwendet werden." #: src/language/dictionary/modify-variables.c:331 #, c-format msgid "Unrecognized subcommand name `%s'." msgstr "Der Unterbefehl `%s' wurde nicht erkannt." #: src/language/dictionary/modify-variables.c:334 msgid "Subcommand name expected." msgstr "Es wurde der Name eines Unterbefehls erwartet." #: src/language/dictionary/mrsets.c:117 #, c-format msgid "" "VARIABLES specified only variable %s on %s, but at least two variables are " "required." msgstr "" "In VARIABLES wurde nur die Variable %s beim Unterbefehl %s angegeben, es " "sind aber mindestens zwei Variablen erforderlich." #: src/language/dictionary/mrsets.c:150 msgid "Numeric VALUE must be an integer." msgstr "Numerischer Wert für VALUE muss ganzzahlig sein." #: src/language/dictionary/mrsets.c:230 src/language/dictionary/mrsets.c:268 #, c-format msgid "" "MDGROUP subcommand for group %s specifies a string VALUE, but the variables " "specified for this group are numeric." msgstr "" "Der Unterbefehl MDGROUP für Gruppe %s legt einen String VALUE fest, aber die " "Variablen dieser Gruppe sind numerisch." #: src/language/dictionary/mrsets.c:254 #, c-format msgid "" "VALUE string on MDGROUP subcommand for group %s is %d bytes long, but it " "must be no longer than the narrowest variable in the group, which is %s with " "a width of %d bytes." msgstr "" "Der String VALUE im Unterbefehl MDGROUP für Gruppe %s ist %d Bytes lang, " "aber er darf nicht länger als die kürzeste Variable dieser Gruppe sein, also " "so lang wie die Variable %s mit %d Bytes." #: src/language/dictionary/mrsets.c:280 #, c-format msgid "" "MDGROUP subcommand for group %s specifies LABELSOURCE=VARLABEL but not " "CATEGORYLABELS=COUNTEDVALUES. Ignoring LABELSOURCE." msgstr "" "Im Unterbefehl MDGROUP für die Gruppe %s ist LABELSOURCE=VARLABEL angegeben, " "aber CATEGORYLABELS=COUNTEDVALUES wird nicht genannt. LABELSOURCE wird " "übersprungen." #: src/language/dictionary/mrsets.c:286 #, c-format msgid "" "MDGROUP subcommand for group %s specifies both LABEL and LABELSOURCE, but " "only one of these subcommands may be used at a time. Ignoring LABELSOURCE." msgstr "" "Im Unterbefehl MDGROUP für die Gruppe %s wurde sowohl LABEL als auch " "LABELSOURCE angegeben, aber nur einer der beiden Unterbefehle darf " "gleichzeitig verwendet werden. LABELSOURCE wird übersprungen." #: src/language/dictionary/mrsets.c:326 #, c-format msgid "" "Variables %s and %s specified as part of multiple dichotomy group %s have " "the same variable label. Categories represented by these variables will not " "be distinguishable in output." msgstr "" "Die Variablen %s und %s sind Teil der Mehrfach-Dichotomie-Gruppe %s und " "haben das gleiche Variablenlabel. Kategorien dieser Variablen werden sich " "in der Ausgabe nicht unterscheiden lassen." #: src/language/dictionary/mrsets.c:356 #, c-format msgid "" "Variable %s specified as part of multiple dichotomy group %s (which has " "CATEGORYLABELS=COUNTEDVALUES) has no value label for its counted value. " "This category will not be distinguishable in output." msgstr "" "Die Variable %s ist Teil der Multi-Dichotomie-Gruppe %s (mit " "CATEGORYLABELS=COUNTEDVALUES) und hat kein Wertelabel für den zu gezählten " "Wert (COUNTEDVALUE) festgelegt. Diese Kategorie wird in der Ausgabe nicht " "unterscheidbar sein." #: src/language/dictionary/mrsets.c:369 #, c-format msgid "" "Variables %s and %s specified as part of multiple dichotomy group %s (which " "has CATEGORYLABELS=COUNTEDVALUES) have the same value label for the group's " "counted value. These categories will not be distinguishable in output." msgstr "" "Die Variablen %s und %s sind Teil der Mehrfach-Dichotomie-Gruppe %s (mit ) " "und haben das gleiche Variablenlabel für den gezählten Wert (COUNTEDVALUE) " "der Gruppe. Kategorien dieser Variablen werden sich in der Ausgabe nicht " "unterscheiden lassen." #: src/language/dictionary/mrsets.c:426 #, c-format msgid "" "Variables specified on MCGROUP should have the same categories, but %s and " "%s (and possibly others) in multiple category group %s have different value " "labels for value %s." msgstr "" "Variablen, die im Befehl MCGROUP angegeben werden, müssen die gleichen " "Kategorien besitzen, aber %s und %s (und möglicherweise weitere) in der " "Mehrfach-Kategorien-Gruppe %s haben unterschiedliche Labels für den Wert %s." #: src/language/dictionary/mrsets.c:484 #, c-format msgid "No multiple response set named %s." msgstr "Es gibt kein Mehrfachantworten-Set namens %s." #: src/language/dictionary/mrsets.c:533 msgid "" "The active dataset dictionary does not contain any multiple response sets." msgstr "Das Codebuch des aktiven Datenblatts enthält keine Mehrfachantworten." #: src/language/dictionary/mrsets.c:540 msgid "Multiple Response Sets" msgstr "Mehrfachantworten-Sets" #: src/language/dictionary/mrsets.c:543 #: src/language/dictionary/sys-file-info.c:446 #: src/language/dictionary/sys-file-info.c:733 #: src/language/stats/autorecode.c:375 src/language/data-io/data-parser.c:679 #: src/language/data-io/data-parser.c:725 src/language/data-io/print.c:434 msgid "Attributes" msgstr "Attribute" #: src/language/dictionary/mrsets.c:544 #: src/language/dictionary/sys-file-info.c:191 #: src/language/dictionary/sys-file-info.c:301 #: src/language/dictionary/sys-file-info.c:302 #: src/language/dictionary/sys-file-info.c:455 #: src/language/dictionary/sys-file-info.c:570 #: src/ui/gui/psppire-var-sheet-header.c:67 src/ui/gui/compute.ui:157 msgid "Label" msgstr "Beschriftung" #: src/language/dictionary/mrsets.c:544 #: src/language/dictionary/sys-file-info.c:241 msgid "Encoding" msgstr "Kodierung" #: src/language/dictionary/mrsets.c:544 msgid "Counted Value" msgstr "Gezählter Wert" #: src/language/dictionary/mrsets.c:544 msgid "Member Variables" msgstr "Mitgliedervariablen" #: src/language/dictionary/mrsets.c:547 #: src/language/dictionary/sys-file-info.c:470 #: src/ui/gui/psppire-var-sheet-header.c:55 msgid "Name" msgstr "Name" #: src/language/dictionary/mrsets.c:564 msgid "Dichotomies" msgstr "Dichomotien" #: src/language/dictionary/mrsets.c:565 src/language/stats/logistic.c:1391 msgid "Categories" msgstr "Kategorien" #: src/language/dictionary/numeric.c:67 #, c-format msgid "Format type %s may not be used with a numeric variable." msgstr "" "Formattyp %s darf nicht bei einer numerischen Variable verwendet werden." #: src/language/dictionary/numeric.c:86 src/language/dictionary/numeric.c:153 #, c-format msgid "There is already a variable named %s." msgstr "Es existiert bereits eine Variable namens %s." #: src/language/dictionary/numeric.c:138 #, c-format msgid "Format type %s may not be used with a string variable." msgstr "Formattyp %s darf nicht bei einer Stringvariable verwendet werden." #: src/language/dictionary/rename-variables.c:92 #, c-format msgid "Renaming would duplicate variable name %s." msgstr "Die Umbenennung würde den doppelten Variablennamen %s erzeugen." #: src/language/dictionary/split-file.c:75 msgid "Split Values" msgstr "Werte aufteilen" #: src/language/dictionary/split-file.c:76 #: src/language/dictionary/split-file.c:77 #: src/language/dictionary/sys-file-info.c:696 #: src/language/stats/chisquare.c:195 src/language/stats/cochran.c:156 #: src/language/stats/cochran.c:185 src/language/stats/examine.c:841 #: src/language/stats/reliability.c:648 src/language/stats/reliability.c:651 #: src/language/stats/crosstabs.q:1303 src/language/stats/crosstabs.q:1325 #: src/language/stats/crosstabs.q:1365 src/language/stats/crosstabs.q:1412 msgid "Value" msgstr "Wert" #: src/language/dictionary/split-file.c:79 #: src/language/dictionary/sys-file-info.c:734 #: src/language/stats/chisquare.c:246 src/language/stats/chisquare.c:328 #: src/language/stats/cochran.c:164 src/language/stats/correlations.c:100 #: src/language/stats/descriptives.c:1004 src/language/stats/friedman.c:226 #: src/language/stats/jonckheere-terpstra.c:377 #: src/language/stats/npar-summary.c:113 src/language/stats/quick-cluster.c:588 #: src/language/stats/runs.c:331 src/language/data-io/data-parser.c:683 #: src/language/data-io/data-parser.c:728 src/language/data-io/print.c:438 #: src/ui/gui/psppire-dictview.c:580 src/ui/gui/psppire-data-editor.c:502 msgid "Variable" msgstr "Variable" #: src/language/dictionary/sys-file-info.c:184 msgid "File Information" msgstr "Dateiinformation" #: src/language/dictionary/sys-file-info.c:185 msgid "Attribute" msgstr "Attribute" #: src/language/dictionary/sys-file-info.c:187 msgid "File" msgstr "Datei" #: src/language/dictionary/sys-file-info.c:194 msgid "Created" msgstr "Erstellt" #: src/language/dictionary/sys-file-info.c:203 msgid "Integer Format" msgstr "Integer Format" #: src/language/dictionary/sys-file-info.c:205 msgid "Big Endian" msgstr "Big Endian" #: src/language/dictionary/sys-file-info.c:206 msgid "Little Endian" msgstr "Little Endian" #: src/language/dictionary/sys-file-info.c:207 #: src/language/dictionary/sys-file-info.c:216 #: src/language/dictionary/sys-file-info.c:223 src/language/utilities/set.q:930 msgid "Unknown" msgstr "Unbekannt" #: src/language/dictionary/sys-file-info.c:209 msgid "Real Format" msgstr "Gleitkomma Format" #: src/language/dictionary/sys-file-info.c:211 msgid "IEEE 754 LE." msgstr "IEEE 754 LE." #: src/language/dictionary/sys-file-info.c:212 msgid "IEEE 754 BE." msgstr "IEEE 754 BE." #: src/language/dictionary/sys-file-info.c:213 msgid "VAX D." msgstr "VAX D." #: src/language/dictionary/sys-file-info.c:214 msgid "VAX G." msgstr "VAX G." #: src/language/dictionary/sys-file-info.c:215 msgid "IBM 390 Hex Long." msgstr "IBM 390 Hex Long." #: src/language/dictionary/sys-file-info.c:218 #: src/language/dictionary/sys-file-info.c:443 #: src/language/stats/binomial.c:199 src/language/stats/correlations.c:131 #: src/language/stats/correlations.c:159 src/language/stats/descriptives.c:585 #: src/language/stats/factor.c:1658 src/language/stats/factor.c:1701 #: src/language/stats/factor.c:1860 src/language/stats/factor.c:2074 #: src/language/stats/frequencies.c:1583 #: src/language/stats/kruskal-wallis.c:254 #: src/language/stats/kruskal-wallis.c:303 #: src/language/stats/ks-one-sample.c:316 src/language/stats/logistic.c:1187 #: src/language/stats/mann-whitney.c:254 src/language/stats/means.c:718 #: src/language/stats/means.c:800 src/language/stats/median.c:358 #: src/language/stats/oneway.c:985 src/language/stats/oneway.c:1157 #: src/language/stats/reliability.c:591 src/language/stats/regression.c:924 #: src/language/stats/t-test-one-sample.c:132 #: src/language/stats/t-test-paired.c:157 src/language/data-io/list.c:104 #: src/ui/gui/variable-info.ui:25 msgid "Variables" msgstr "Variablen" #: src/language/dictionary/sys-file-info.c:221 src/language/stats/examine.c:929 #: src/language/stats/means.c:697 src/language/stats/reliability.c:548 #: src/language/stats/crosstabs.q:930 msgid "Cases" msgstr "Fälle" #: src/language/dictionary/sys-file-info.c:226 src/language/stats/oneway.c:980 #: src/ui/gui/psppire-var-sheet-header.c:58 src/ui/gui/compute.ui:303 msgid "Type" msgstr "Typ" #: src/language/dictionary/sys-file-info.c:230 msgid "Weight" msgstr "Gewicht" #: src/language/dictionary/sys-file-info.c:233 msgid "Not weighted" msgstr "Nicht gewichtet" #: src/language/dictionary/sys-file-info.c:235 msgid "Compression" msgstr "Komprimierung" #: src/language/dictionary/sys-file-info.c:245 #: src/language/dictionary/sys-file-info.c:424 #: src/language/dictionary/sys-file-info.c:426 msgid "Documents" msgstr "Dokumente" #: src/language/dictionary/sys-file-info.c:305 #: src/language/dictionary/sys-file-info.c:430 msgid "(none)" msgstr "(keine)" #: src/language/dictionary/sys-file-info.c:393 msgid "No variables to display." msgstr "Keine Variablen." #: src/language/dictionary/sys-file-info.c:404 msgid "Macros not supported." msgstr "Makros werden nicht unterstützt." #: src/language/dictionary/sys-file-info.c:426 msgid "Document" msgstr "Dokument" #: src/language/dictionary/sys-file-info.c:454 msgid "Position" msgstr "Position" #: src/language/dictionary/sys-file-info.c:456 msgid "Measurement Level" msgstr "Messniveau" #: src/language/dictionary/sys-file-info.c:457 #: src/ui/gui/psppire-var-sheet-header.c:85 msgid "Role" msgstr "Rolle" #: src/language/dictionary/sys-file-info.c:458 #: src/ui/gui/psppire-var-sheet-header.c:61 src/ui/gui/compute.ui:215 msgid "Width" msgstr "Spaltenbreite" #: src/language/dictionary/sys-file-info.c:459 msgid "Alignment" msgstr "Ausrichtung" #: src/language/dictionary/sys-file-info.c:460 #: src/language/dictionary/sys-file-info.c:734 msgid "Print Format" msgstr "Druckformat" #: src/language/dictionary/sys-file-info.c:461 msgid "Write Format" msgstr "Ausgabeformat" #: src/language/dictionary/sys-file-info.c:462 #: src/ui/gui/missing-val-dialog.c:379 src/ui/gui/psppire-var-sheet-header.c:73 #: src/ui/gui/examine.ui:416 src/ui/gui/t-test.ui:105 msgid "Missing Values" msgstr "Fehlende Werte" #: src/language/dictionary/sys-file-info.c:567 #: src/ui/gui/psppire-var-sheet-header.c:70 src/ui/gui/val-labs-dialog.c:489 #: src/ui/gui/val-labs-dialog.ui:194 msgid "Value Labels" msgstr "Wertelabels" #: src/language/dictionary/sys-file-info.c:573 msgid "Variable Value" msgstr "Variablenwert" #: src/language/dictionary/sys-file-info.c:577 msgid "User-missing value" msgstr "fehlender Wert, benutzerdefiniert" #: src/language/dictionary/sys-file-info.c:693 msgid "Variable and Dataset Attributes" msgstr "Attribute der Variable und des Datensatzes" #: src/language/dictionary/sys-file-info.c:699 msgid "Variable and Name" msgstr "Variable und Name" #: src/language/dictionary/sys-file-info.c:702 msgid "(dataset)" msgstr "(Datensatz)" #: src/language/dictionary/sys-file-info.c:722 msgid "No vectors defined." msgstr "Keine Vektoren definiert." #: src/language/dictionary/sys-file-info.c:732 msgid "Vectors" msgstr "Vektoren" #: src/language/dictionary/sys-file-info.c:736 msgid "Vector and Position" msgstr "Vektor und Position" #: src/language/dictionary/sys-file-info.c:998 msgid "No valid encodings found." msgstr "Keine gültige Kodierung gefunden." #: src/language/dictionary/sys-file-info.c:1004 #, c-format msgid "Usable encodings for %s." msgstr "Verfügbare Kodierungen für %s." #: src/language/dictionary/sys-file-info.c:1007 #, c-format msgid "" "Encodings that can successfully read %s (by specifying the encoding name on " "the GET command's ENCODING subcommand). Encodings that yield identical text " "are listed together." msgstr "" "Kodierungen mit denen %s eingelesen werden kann (indem beim Befehl GET im " "Unterbefehl ENCODING die passsende Kodierung angegeben wird). Kodierungen, " "die zum selben Text führen, sind gemeinsam aufgelistet." #: src/language/dictionary/sys-file-info.c:1012 #: src/language/dictionary/sys-file-info.c:1013 msgid "Encodings" msgstr "Kodierungen" #: src/language/dictionary/sys-file-info.c:1042 #, c-format msgid "%s Encoded Text Strings" msgstr "%s kodierte Zeichenketten" #: src/language/dictionary/sys-file-info.c:1046 msgid "" "Text strings in the file dictionary that the previously listed encodings " "interpret differently, along with the interpretations." msgstr "" "Textauszüge aus dem Codebuch, die von den Kodierungen unterschiedlich " "interpretiert würden sowie die Interpretationen selbst." #: src/language/dictionary/sys-file-info.c:1049 src/output/text-item.c:57 #: src/ui/gui/psppire-import-assistant.c:885 msgid "Text" msgstr "Text" #: src/language/dictionary/sys-file-info.c:1059 msgid "Purpose" msgstr "Zweck" #: src/language/dictionary/value-labels.c:154 #, c-format msgid "Truncating value label to %d bytes." msgstr "Wertebezeichnung wird auf %d Bytes gekürzt." #: src/language/dictionary/vector.c:66 #, c-format msgid "A vector named %s already exists." msgstr "Ein Vektor mit dem Namen %s existiert bereits." #: src/language/dictionary/vector.c:74 #, c-format msgid "Vector name %s is given twice." msgstr "Vektorname %s wurde doppelt vergeben." #: src/language/dictionary/vector.c:98 msgid "A slash must separate each vector specification in VECTOR's long form." msgstr "" "In der Langform des VECTOR Befehls müssen die Vektorbezeichnungen durch " "einen Schrägstrich getrennt werden." #: src/language/dictionary/vector.c:131 msgid "Vectors must have at least one element." msgstr "Vektoren müssen mindestens ein Element besitzen." #: src/language/dictionary/vector.c:151 msgid "expecting vector length" msgstr "erwarte Vektorlänge" #: src/language/dictionary/vector.c:170 #, c-format msgid "%s is an existing variable name." msgstr "%s ist ein existierender Variablenname" #: src/language/dictionary/variable-display.c:121 msgid "Variable display width must be a positive integer." msgstr "Anzeigebreite der Variable muß eine positive ganze Zahl sein." #: src/language/dictionary/weight.c:49 msgid "The weighting variable must be numeric." msgstr "Die Gewichtungsvariable muß numerisch sein." #: src/language/dictionary/weight.c:54 msgid "The weighting variable may not be scratch." msgstr "Die Gewichtungsvariable darf nicht temporär sein." #: src/language/tests/moments-test.c:50 msgid "expecting weight value" msgstr "erwarte Gewichtungswert" #: src/language/utilities/cd.c:45 src/language/utilities/include.c:173 #, c-format msgid "Cannot change directory to %s: %s" msgstr "Kann nicht in das Verzeichnis %s wechseln: %s" #: src/language/utilities/date.c:33 #, c-format msgid "Only %s is currently implemented." msgstr "Nur %s ist bisher implementiert." #: src/language/utilities/host.c:60 #, fuzzy #| msgid "Command shell not supported on this platform." msgid "Time limit not supported on this platform." msgstr "Kommandozeile wird auf dieser Plattform nicht unterstützt." #: src/language/utilities/host.c:74 #, c-format msgid "%s: Command exited with status %d." msgstr "" #: src/language/utilities/host.c:95 #, fuzzy, c-format #| msgid "failed to create temporary file" msgid "Failed to create temporary file (%s)." msgstr "die temporäre Datei konnte nicht erzeugt werden" #: src/language/utilities/host.c:102 #, c-format msgid "/dev/null: Failed to open (%s)." msgstr "" #: src/language/utilities/host.c:117 #, c-format msgid "Couldn't fork: %s." msgstr "Verzweigung nicht möglich: %s." #: src/language/utilities/host.c:193 #, c-format msgid "While running \"%s\", waiting for child process failed (%s)." msgstr "" #: src/language/utilities/host.c:203 #, c-format msgid "Command \"%s\" timed out." msgstr "" #: src/language/utilities/host.c:205 #, c-format msgid "Command \"%s\" terminated by signal %d." msgstr "" #: src/language/utilities/host.c:212 msgid "Command or shell not found" msgstr "" #: src/language/utilities/host.c:214 msgid "Could not invoke command or shell" msgstr "" #: src/language/utilities/host.c:217 #, c-format msgid "Command \"%s\" exited with status %d (%s)." msgstr "" #: src/language/utilities/host.c:220 #, c-format msgid "Command \"%s\" exited with status %d." msgstr "" #: src/language/utilities/host.c:230 #, c-format msgid "Command \"%s\" output could not be read (%s)." msgstr "" #: src/language/utilities/title.c:88 #, c-format msgid " (Entered %s)" msgstr " (%s eingegeben)" #: src/language/utilities/include.c:73 #, c-format msgid "Can't find `%s' in include file search path." msgstr "`%s' konnte im Dateisuchpfad nicht gefunden werden." #: src/language/utilities/output.c:128 #, c-format msgid "Unknown cell class %s." msgstr "Unbekannte Zellklasse %s." #: src/language/utilities/permissions.c:113 #, c-format msgid "Cannot stat %s: %s" msgstr "Der Status der Datei %s kann nicht ermittelt werden: %s" #: src/language/utilities/permissions.c:127 #, c-format msgid "Cannot change mode of %s: %s" msgstr "Berechtigungen für %s können nicht geändert werden: %s" #: src/language/stats/aggregate.c:96 msgid "Sum of values" msgstr "Summe der Werte" #: src/language/stats/aggregate.c:97 msgid "Mean average" msgstr "Mittelwert" #: src/language/stats/aggregate.c:98 msgid "Median average" msgstr "Median" #: src/language/stats/aggregate.c:99 #: src/ui/gui/psppire-dialog-action-descriptives.c:40 #: src/ui/gui/psppire-dialog-action-frequencies.c:41 msgid "Standard deviation" msgstr "Standardabweichung" #: src/language/stats/aggregate.c:100 #: src/ui/gui/psppire-dialog-action-descriptives.c:42 msgid "Maximum value" msgstr "Maximumwert" #: src/language/stats/aggregate.c:101 #: src/ui/gui/psppire-dialog-action-descriptives.c:41 msgid "Minimum value" msgstr "Minimumwert" #: src/language/stats/aggregate.c:102 msgid "Percentage greater than" msgstr "Prozentsatz größer als" #: src/language/stats/aggregate.c:103 msgid "Percentage less than" msgstr "Prozentsatz kleiner als" #: src/language/stats/aggregate.c:104 msgid "Percentage included in range" msgstr "Prozentsatz innerhalb des Bereiches von" #: src/language/stats/aggregate.c:105 msgid "Percentage excluded from range" msgstr "Prozentsatz außerhalb des Bereiches von" #: src/language/stats/aggregate.c:106 msgid "Fraction greater than" msgstr "Anteil größer als" #: src/language/stats/aggregate.c:107 msgid "Fraction less than" msgstr "Anteil kleiner als" #: src/language/stats/aggregate.c:108 msgid "Fraction included in range" msgstr "Anteil innerhalb des Bereiches von" #: src/language/stats/aggregate.c:109 msgid "Fraction excluded from range" msgstr "Anteil außerhalb des Bereiches von" #: src/language/stats/aggregate.c:110 msgid "Number of cases" msgstr "Anzahl der Fälle" #: src/language/stats/aggregate.c:111 msgid "Number of cases (unweighted)" msgstr "Anzahl der Fälle (ungewichtet)" #: src/language/stats/aggregate.c:112 msgid "Number of missing values" msgstr "Anzahl der fehlenden Werte" #: src/language/stats/aggregate.c:113 msgid "Number of missing values (unweighted)" msgstr "Anzahl der fehlenden Werte (ungewichtet)" #: src/language/stats/aggregate.c:114 msgid "First non-missing value" msgstr "Erster nicht fehlender Wert" #: src/language/stats/aggregate.c:115 msgid "Last non-missing value" msgstr "Letzter nicht fehlender Wert" #: src/language/stats/aggregate.c:258 msgid "" "When PRESORTED is specified, specifying sorting directions with (A) or (D) " "has no effect. Output data will be sorted the same way as the input data." msgstr "" "Bei der Verwendung von PRESORTED hat die Angabe der Richtung (A) oder (D) " "keinen Effekt. Ausgabedaten werden in der Reihenfolge der Eingabedaten " "sortiert." #: src/language/stats/aggregate.c:448 msgid "expecting aggregation function" msgstr "erwarte Aggregierungsfunktion" #: src/language/stats/aggregate.c:460 #, c-format msgid "Unknown aggregation function %s." msgstr "Unbekannte Aggregierungsfunktion %s." #: src/language/stats/aggregate.c:513 #, c-format msgid "Missing argument %zu to %s." msgstr "Fehlendes Argument %zu in %s." #: src/language/stats/aggregate.c:522 #, c-format msgid "Arguments to %s must be of same type as source variables." msgstr "Argumente in %s müssen den selben Typ wie die Quellvariablen haben." #: src/language/stats/aggregate.c:541 #, c-format msgid "" "Number of source variables (%zu) does not match number of target variables " "(%zu)." msgstr "" "Anzahl der Quellvariablen (%zu) stimmt nicht mit der Anzahl der " "Zielvariablen (%zu) überein." #: src/language/stats/aggregate.c:557 #, c-format msgid "" "The value arguments passed to the %s function are out-of-order. They will " "be treated as if they had been specified in the correct order." msgstr "" "Die Wertargumente, die an die %s Funktion übergeben wurden, sind nicht in " "der richtigen Reihenfolge. Sie werden so behandelt, als ob sie in der " "richtigen Reihenfolge wären." #: src/language/stats/aggregate.c:631 #, c-format msgid "" "Variable name %s is not unique within the aggregate file dictionary, which " "contains the aggregate variables and the break variables." msgstr "" "Der Variablenname %s erscheint im aggregierten Codebuch der Datei, das die " "zusammengefassten Variablen und die Break-Variablen enthält, mehr als einmal." #: src/language/stats/autorecode.c:152 #, c-format msgid "Source variable count (%zu) does not match target variable count (%zu)." msgstr "" "Anzahl der Quellvariablen (%zu) stimmt nicht mit der Anzahl der " "Zielvariablen (%zu) überein." #: src/language/stats/autorecode.c:164 #, c-format msgid "Target variable %s duplicates existing variable %s." msgstr "Zielvariable %s hat den selben Namen wie die existierende Variable %s." #: src/language/stats/autorecode.c:221 #, c-format msgid "" "With GROUP, variables may not mix string variables (such as %s) and numeric " "variables (such as %s)." msgstr "" "Mit GROUP dürfen Stringvariablen wie beispielsweise %s und numerische " "Variablen wie %s nicht vermischt werden" #: src/language/stats/autorecode.c:363 msgid "Recoding grouped variables." msgstr "Umkodieren von gruppierten Variablen." #: src/language/stats/autorecode.c:365 #, c-format msgid "Recoding %s into %s (%s)." msgstr "Umkodieren von %s in %s (%s)." #: src/language/stats/autorecode.c:369 #, c-format msgid "Recoding %s into %s." msgstr "Kodiere %s in %s um." #: src/language/stats/autorecode.c:376 src/ui/gui/recode.ui:209 msgid "New Value" msgstr "Neuer Wert" #: src/language/stats/autorecode.c:376 msgid "Value Label" msgstr "Wertelabel" #: src/language/stats/autorecode.c:379 msgid "Old Value" msgstr "Alter Wert" #: src/language/stats/binomial.c:138 #, c-format msgid "Variable %s is not dichotomous" msgstr "Variable %s ist nicht dichotom " #: src/language/stats/binomial.c:182 src/ui/gui/binomial.ui:30 msgid "Binomial Test" msgstr "Test auf Binomialverteilung" #: src/language/stats/binomial.c:186 src/language/stats/chisquare.c:183 #: src/language/stats/chisquare.c:239 src/language/stats/chisquare.c:322 #: src/language/stats/cochran.c:188 src/language/stats/correlations.c:94 #: src/language/stats/correlations.c:145 src/language/stats/descriptives.c:991 #: src/language/stats/examine.c:602 src/language/stats/examine.c:742 #: src/language/stats/examine.c:836 src/language/stats/examine.c:925 #: src/language/stats/factor.c:1755 src/language/stats/factor.c:1878 #: src/language/stats/factor.c:1908 src/language/stats/factor.c:2068 #: src/language/stats/factor.c:2102 src/language/stats/frequencies.c:302 #: src/language/stats/frequencies.c:1579 src/language/stats/frequencies.c:1586 #: src/language/stats/friedman.c:250 src/language/stats/glm.c:729 #: src/language/stats/kruskal-wallis.c:249 #: src/language/stats/kruskal-wallis.c:297 #: src/language/stats/ks-one-sample.c:278 src/language/stats/logistic.c:1170 #: src/language/stats/logistic.c:1300 src/language/stats/logistic.c:1330 #: src/language/stats/jonckheere-terpstra.c:361 #: src/language/stats/mann-whitney.c:184 src/language/stats/mann-whitney.c:247 #: src/language/stats/means.c:757 src/language/stats/means.c:811 #: src/language/stats/mcnemar.c:222 src/language/stats/median.c:315 #: src/language/stats/median.c:350 src/language/stats/npar-summary.c:106 #: src/language/stats/oneway.c:973 src/language/stats/oneway.c:1051 #: src/language/stats/oneway.c:1150 src/language/stats/oneway.c:1238 #: src/language/stats/oneway.c:1373 src/language/stats/quick-cluster.c:746 #: src/language/stats/reliability.c:543 src/language/stats/reliability.c:584 #: src/language/stats/reliability.c:633 src/language/stats/reliability.c:644 #: src/language/stats/roc.c:969 src/language/stats/roc.c:1067 #: src/language/stats/regression.c:867 src/language/stats/regression.c:899 #: src/language/stats/regression.c:1023 src/language/stats/regression.c:1089 #: src/language/stats/runs.c:318 src/language/stats/sign.c:102 #: src/language/stats/t-test-indep.c:193 src/language/stats/t-test-indep.c:259 #: src/language/stats/t-test-one-sample.c:68 #: src/language/stats/t-test-one-sample.c:125 #: src/language/stats/t-test-paired.c:150 #: src/language/stats/t-test-paired.c:193 #: src/language/stats/t-test-paired.c:238 src/language/stats/wilcoxon.c:243 #: src/language/stats/wilcoxon.c:282 src/language/stats/crosstabs.q:925 #: src/language/stats/crosstabs.q:1253 src/language/stats/crosstabs.q:1293 #: src/language/stats/crosstabs.q:1302 src/language/stats/crosstabs.q:1331 #: src/language/stats/crosstabs.q:1373 src/language/stats/crosstabs.q:1418 #: src/ui/gui/crosstabs.ui:499 src/ui/gui/oneway.ui:615 msgid "Statistics" msgstr "Statistiken" #: src/language/stats/binomial.c:187 src/language/stats/chisquare.c:240 #: src/language/stats/chisquare.c:252 msgid "Category" msgstr "Kategorie" #: src/language/stats/binomial.c:188 src/language/stats/cochran.c:189 #: src/language/stats/correlations.c:97 src/language/stats/correlations.c:155 #: src/language/stats/descriptives.c:993 src/language/stats/examine.c:926 #: src/language/stats/frequencies.c:1588 src/language/stats/friedman.c:251 #: src/language/stats/kruskal-wallis.c:250 #: src/language/stats/ks-one-sample.c:279 src/language/stats/logistic.c:1331 #: src/language/stats/jonckheere-terpstra.c:369 #: src/language/stats/mann-whitney.c:185 src/language/stats/means.c:710 #: src/language/stats/means-calc.c:439 src/language/stats/mcnemar.c:223 #: src/language/stats/median.c:351 src/language/stats/npar-summary.c:107 #: src/language/stats/oneway.c:1052 src/language/stats/reliability.c:544 #: src/language/stats/sign.c:69 src/language/stats/sign.c:70 #: src/language/stats/t-test-indep.c:194 #: src/language/stats/t-test-one-sample.c:126 #: src/language/stats/t-test-paired.c:151 #: src/language/stats/t-test-paired.c:194 src/language/stats/wilcoxon.c:244 #: src/language/stats/crosstabs.q:926 msgid "N" msgstr "N" #: src/language/stats/binomial.c:189 msgid "Observed Prop." msgstr "Beobachtete Wahrsch." #: src/language/stats/binomial.c:190 msgid "Test Prop." msgstr "Testwahrsch." #: src/language/stats/binomial.c:192 src/language/stats/mcnemar.c:224 #: src/language/stats/sign.c:103 src/language/stats/wilcoxon.c:288 #: src/language/stats/crosstabs.q:1306 msgid "Exact Sig. (2-tailed)" msgstr "Exakte Sig. (2-seitig)" #: src/language/stats/binomial.c:193 src/language/stats/mcnemar.c:225 #: src/language/stats/sign.c:104 src/language/stats/wilcoxon.c:289 #: src/language/stats/crosstabs.q:1307 msgid "Exact Sig. (1-tailed)" msgstr "Exakte Sig. (1-seitig)" #: src/language/stats/binomial.c:195 msgid "Groups" msgstr "Gruppen" #: src/language/stats/binomial.c:196 msgid "Group 1" msgstr "Gruppe 1" #: src/language/stats/binomial.c:196 msgid "Group 2" msgstr "Gruppe 2" #: src/language/stats/binomial.c:196 src/language/stats/chisquare.c:223 #: src/language/stats/chisquare.c:257 src/language/stats/examine.c:930 #: src/language/stats/factor.c:1756 src/language/stats/frequencies.c:344 #: src/language/stats/glm.c:811 src/language/stats/kruskal-wallis.c:285 #: src/language/stats/logistic.c:1336 src/language/stats/mann-whitney.c:197 #: src/language/stats/means.c:706 src/language/stats/oneway.c:982 #: src/language/stats/oneway.c:1072 src/language/stats/reliability.c:549 #: src/language/stats/regression.c:1031 src/language/stats/sign.c:75 #: src/language/stats/wilcoxon.c:250 #: src/ui/gui/psppire-dialog-action-crosstabs.c:93 #: src/language/stats/crosstabs.q:931 src/language/stats/crosstabs.q:1218 msgid "Total" msgstr "Gesamt" #: src/language/stats/chisquare.c:171 #, c-format msgid "" "CHISQUARE test specified %d expected values, but variable %s has %zu " "distinct values." msgstr "" "CHISQUARE Test gibt %d erwartete Werte vor, aber die Variable %s hat %zu " "unterschiedliche Werte." #: src/language/stats/chisquare.c:184 src/language/stats/chisquare.c:241 msgid "Observed N" msgstr "Beobachtete N" #: src/language/stats/chisquare.c:185 src/language/stats/chisquare.c:242 msgid "Expected N" msgstr "Erwartete N" #: src/language/stats/chisquare.c:186 src/language/stats/chisquare.c:243 #: src/language/stats/regression.c:1031 #: src/ui/gui/psppire-dialog-action-crosstabs.c:95 #: src/language/stats/crosstabs.q:1267 msgid "Residual" msgstr "Residual" #: src/language/stats/chisquare.c:235 src/language/stats/cochran.c:150 #: src/language/stats/median.c:305 src/language/stats/sign.c:66 #: src/ui/gui/frequencies.ui:676 msgid "Frequencies" msgstr "Häufigkeiten" #: src/language/stats/chisquare.c:320 src/language/stats/cochran.c:181 #: src/language/stats/friedman.c:246 src/language/stats/kruskal-wallis.c:295 #: src/language/stats/mann-whitney.c:244 src/language/stats/mcnemar.c:219 #: src/language/stats/median.c:347 src/language/stats/sign.c:100 #: src/language/stats/wilcoxon.c:279 msgid "Test Statistics" msgstr "Teststatistiken" #: src/language/stats/chisquare.c:323 msgid "Chi-square" msgstr "Chi-Quadrat" #: src/language/stats/chisquare.c:324 src/language/stats/cochran.c:191 #: src/language/stats/examine.c:675 src/language/stats/factor.c:2107 #: src/language/stats/friedman.c:257 src/language/stats/glm.c:733 #: src/language/stats/kruskal-wallis.c:299 src/language/stats/logistic.c:1174 #: src/language/stats/median.c:354 src/language/stats/oneway.c:975 #: src/language/stats/oneway.c:1242 src/language/stats/regression.c:1025 #: src/language/stats/t-test-indep.c:267 #: src/language/stats/t-test-one-sample.c:75 #: src/language/stats/t-test-paired.c:253 src/language/stats/crosstabs.q:1304 msgid "df" msgstr "df" #: src/language/stats/chisquare.c:325 src/language/stats/cochran.c:192 #: src/language/stats/friedman.c:258 src/language/stats/kruskal-wallis.c:300 #: src/language/stats/median.c:355 msgid "Asymp. Sig." msgstr "Asymp. Sig." #: src/language/stats/cochran.c:111 msgid "More than two values encountered. Cochran Q test will not be run." msgstr "Mehr als zwei Werte gefunden. Cochran Q-Test wird nicht durchgeführt." #: src/language/stats/cochran.c:153 #, c-format msgid "Success (%.*g)" msgstr "Erfolg (%.*g)" #: src/language/stats/cochran.c:154 #, c-format msgid "Failure (%.*g)" msgstr "Misserfolg (%.*g)" #: src/language/stats/cochran.c:190 msgid "Cochran's Q" msgstr "Cochrans Q" #: src/language/stats/correlations.c:91 src/language/stats/descriptives.c:987 #: src/language/stats/factor.c:2065 src/language/stats/npar-summary.c:102 msgid "Descriptive Statistics" msgstr "Deskriptive Statistiken" #: src/language/stats/correlations.c:95 src/language/stats/descriptives.c:108 #: src/language/stats/examine.c:742 src/language/stats/factor.c:2069 #: src/language/stats/frequencies.c:141 src/language/stats/graph.c:211 #: src/language/stats/ks-one-sample.c:290 src/language/stats/means-calc.c:438 #: src/language/stats/npar-summary.c:108 src/language/stats/oneway.c:1052 #: src/language/stats/t-test-indep.c:195 #: src/language/stats/t-test-one-sample.c:127 #: src/language/stats/t-test-paired.c:152 #: src/language/stats/t-test-paired.c:241 #: src/ui/gui/psppire-dialog-action-descriptives.c:39 #: src/ui/gui/psppire-dialog-action-frequencies.c:40 msgid "Mean" msgstr "Mittelwert" #: src/language/stats/correlations.c:96 src/language/stats/examine.c:751 #: src/language/stats/factor.c:2070 src/language/stats/ks-one-sample.c:290 #: src/language/stats/means-calc.c:440 src/language/stats/npar-summary.c:109 #: src/language/stats/oneway.c:1052 src/language/stats/t-test-indep.c:196 #: src/language/stats/t-test-one-sample.c:128 #: src/language/stats/t-test-paired.c:153 #: src/language/stats/t-test-paired.c:242 msgid "Std. Deviation" msgstr "Std. Abweichung" #: src/language/stats/correlations.c:126 msgid "Correlations" msgstr "Korrelationen" #: src/language/stats/correlations.c:146 msgid "Pearson Correlation" msgstr "Pearson Korrelation" #: src/language/stats/correlations.c:147 src/language/stats/oneway.c:1243 #: src/language/stats/t-test-indep.c:268 #: src/language/stats/t-test-one-sample.c:76 #: src/language/stats/t-test-paired.c:254 msgid "Sig. (2-tailed)" msgstr "Sig. (2-seitig)" #: src/language/stats/correlations.c:147 src/language/stats/factor.c:1913 msgid "Sig. (1-tailed)" msgstr "Sig. (1-seitig)" #: src/language/stats/correlations.c:151 msgid "Cross-products" msgstr "Kreuzprodukte" #: src/language/stats/correlations.c:152 msgid "Covariance" msgstr "Kovarianz" #: src/language/stats/correlations.c:165 msgid "Significant at .05 level" msgstr "Signifikant bei 0.05 Grenze" #: src/language/stats/correlations.c:234 msgid "The data for the chosen variables are all missing or empty." msgstr "" "Die Daten der ausgewählten Variablen sind entweder alle fehlend oder leer." #: src/language/stats/correlations.c:390 src/language/stats/descriptives.c:368 #: src/language/data-io/list.c:166 msgid "No variables specified." msgstr "Keine Variablen angegeben." #: src/language/stats/descriptives.c:109 src/language/stats/frequencies.c:142 #: src/language/stats/means-calc.c:445 src/language/stats/t-test-indep.c:197 #: src/language/stats/t-test-one-sample.c:129 #: src/language/stats/t-test-paired.c:154 #: src/language/stats/t-test-paired.c:243 msgid "S.E. Mean" msgstr "Standardfehler des Mittelwertes" #: src/language/stats/descriptives.c:110 src/language/stats/frequencies.c:145 msgid "Std Dev" msgstr "Std Abw" #: src/language/stats/descriptives.c:111 src/language/stats/examine.c:750 #: src/language/stats/frequencies.c:146 src/language/stats/means-calc.c:450 #: src/ui/gui/psppire-dialog-action-descriptives.c:46 #: src/ui/gui/psppire-dialog-action-frequencies.c:45 msgid "Variance" msgstr "Varianz" #: src/language/stats/descriptives.c:112 src/language/stats/examine.c:752 #: src/language/stats/frequencies.c:147 src/language/stats/means-calc.c:451 #: src/ui/gui/psppire-dialog-action-descriptives.c:47 #: src/ui/gui/psppire-dialog-action-frequencies.c:50 msgid "Kurtosis" msgstr "Kurtosis" #: src/language/stats/descriptives.c:113 src/language/stats/frequencies.c:148 #: src/language/stats/means-calc.c:452 msgid "S.E. Kurt" msgstr "S.E. Kurt" #: src/language/stats/descriptives.c:114 src/language/stats/examine.c:752 #: src/language/stats/frequencies.c:149 src/language/stats/means-calc.c:453 #: src/ui/gui/psppire-dialog-action-descriptives.c:48 #: src/ui/gui/psppire-dialog-action-frequencies.c:46 msgid "Skewness" msgstr "Schiefe" #: src/language/stats/descriptives.c:115 src/language/stats/frequencies.c:150 #: src/language/stats/means-calc.c:454 msgid "S.E. Skew" msgstr "Std.-Fehler Schiefe" #: src/language/stats/descriptives.c:116 src/language/stats/examine.c:751 #: src/language/stats/frequencies.c:151 src/language/stats/means-calc.c:449 #: src/ui/gui/psppire-dialog-action-descriptives.c:43 #: src/ui/gui/psppire-dialog-action-frequencies.c:48 msgid "Range" msgstr "Spannweite" #: src/language/stats/descriptives.c:117 src/language/stats/examine.c:751 #: src/language/stats/frequencies.c:152 src/language/stats/graph.c:214 #: src/language/stats/ks-one-sample.c:285 src/language/stats/means-calc.c:447 #: src/language/stats/npar-summary.c:110 src/language/stats/oneway.c:1061 #: src/ui/gui/psppire-dialog-action-descriptives.c:41 #: src/ui/gui/psppire-dialog-action-frequencies.c:42 msgid "Minimum" msgstr "Minimum" #: src/language/stats/descriptives.c:118 src/language/stats/examine.c:751 #: src/language/stats/frequencies.c:153 src/language/stats/graph.c:213 #: src/language/stats/ks-one-sample.c:285 src/language/stats/means-calc.c:448 #: src/language/stats/npar-summary.c:110 src/language/stats/oneway.c:1061 #: src/ui/gui/psppire-dialog-action-descriptives.c:42 #: src/ui/gui/psppire-dialog-action-frequencies.c:43 msgid "Maximum" msgstr "Maximum" #: src/language/stats/descriptives.c:119 src/language/stats/frequencies.c:154 #: src/language/stats/graph.c:212 src/language/stats/means-calc.c:446 #: src/ui/gui/psppire-dialog-action-descriptives.c:44 #: src/ui/gui/psppire-dialog-action-frequencies.c:53 msgid "Sum" msgstr "Summe" #: src/language/stats/descriptives.c:350 #, c-format msgid "Z-score variable name %s would be a duplicate variable name." msgstr "Z-Wert Variablenname %s wäre ein Duplikat." #: src/language/stats/descriptives.c:401 msgid "" "DESCRIPTIVES with Z scores ignores TEMPORARY. Temporary transformations " "will be made permanent." msgstr "" "DESCRIPTIVES mit Z-Werten ignoriert TEMPORARY. Temporäre Umformungen werden " "dauerhaft gemacht." #: src/language/stats/descriptives.c:478 msgid "expecting statistic name: reverting to default" msgstr "erwarte den Namen einer Statistik: Rückfall auf die Voreinstellung" #: src/language/stats/descriptives.c:561 msgid "" "Ran out of generic names for Z-score variables. There are only 126 generic " "names: ZSC001-ZSC0999, STDZ01-STDZ09, ZZZZ01-ZZZZ09, ZQZQ01-ZQZQ09." msgstr "" "Es stehen nicht genügend generische Namen für Z-Wert Variablen zur " "Verfügung. Es gibt nur 126 generische Namen: ZSC001-ZSC0999, STDZ01-STDZ09, " "ZZZZ01-ZZZZ09, ZQZQ01-ZQZQ09." #: src/language/stats/descriptives.c:579 msgid "Mapping of Variables to Z-scores" msgstr "Abbildung von Variablen auf Z-Werte." #: src/language/stats/descriptives.c:581 msgid "Names" msgstr "Namen" #: src/language/stats/descriptives.c:582 src/language/stats/glm.c:739 #: src/language/stats/regression.c:1030 msgid "Source" msgstr "Quelle" #: src/language/stats/descriptives.c:582 msgid "Target" msgstr "Ziel" #: src/language/stats/descriptives.c:659 #, c-format msgid "Internal error processing Z scores. Please report this to %s." msgstr "" "Interner Fehler beim Verarbeiten der Z-Werte. Bitte informieren Sie %s." #: src/language/stats/descriptives.c:759 #, c-format msgid "Z-score of %s" msgstr "Z-Wert von %s" #: src/language/stats/descriptives.c:1028 src/language/stats/roc.c:1029 msgid "Valid N (listwise)" msgstr "Gültige N (listenweise)" #: src/language/stats/descriptives.c:1028 msgid "Missing N (listwise)" msgstr "Fehlende N (listenweise)" #: src/language/stats/examine.c:75 msgid " (missing)" msgstr "(fehlend)" #: src/language/stats/examine.c:225 #, c-format msgid "Boxplot of %s vs. %s" msgstr "Boxplot von %s vs. %s" #: src/language/stats/examine.c:231 src/language/stats/examine.c:338 #, c-format msgid "Boxplot of %s" msgstr "Boxplot von %s" #: src/language/stats/examine.c:321 msgid "Boxplot" msgstr "Boxplot" #: src/language/stats/examine.c:418 msgid "Not creating NP plot because data set is empty." msgstr "NP-Plot wird nicht erstellt, weil das Datenblatt leer ist." #: src/language/stats/examine.c:478 #, c-format msgid "Not creating spreadlevel chart for %s" msgstr "Spreadlevel-Plot für %s wird nicht erstellt." #: src/language/stats/examine.c:585 msgid "User-missing value." msgstr "User-missing Wert." #: src/language/stats/examine.c:591 src/language/stats/examine.c:595 #: src/language/stats/frequencies.c:1606 msgid "Percentiles" msgstr "Perzentile" #: src/language/stats/examine.c:603 src/math/percentiles.c:37 msgid "Weighted Average" msgstr "Gewichteter Durchschnitt" #: src/language/stats/examine.c:603 msgid "Tukey's Hinges" msgstr "Tukeys Hinges" #: src/language/stats/examine.c:610 src/language/stats/examine.c:685 #: src/language/stats/examine.c:759 src/language/stats/examine.c:858 #: src/language/stats/examine.c:938 src/language/stats/mann-whitney.c:200 #: src/language/stats/median.c:319 src/language/stats/t-test-indep.c:227 #: src/language/stats/t-test-indep.c:282 #: src/language/stats/t-test-one-sample.c:87 msgid "Dependent Variables" msgstr "Abhängige Variablen" #: src/language/stats/examine.c:669 msgid "Tests of Normality" msgstr "Test der Normalität" #: src/language/stats/examine.c:673 msgid "Shapiro-Wilk" msgstr "Shapiro-Wilk" #: src/language/stats/examine.c:674 src/language/stats/examine.c:739 #: src/ui/gui/psppire-checkbox-treeview.c:73 msgid "Statistic" msgstr "Statistik" #: src/language/stats/examine.c:676 src/language/stats/factor.c:2108 #: src/language/stats/glm.c:736 src/language/stats/logistic.c:1175 #: src/language/stats/oneway.c:978 src/language/stats/oneway.c:1154 #: src/language/stats/oneway.c:1376 src/language/stats/regression.c:906 #: src/language/stats/regression.c:1028 src/language/stats/t-test-indep.c:263 #: src/language/stats/t-test-paired.c:196 msgid "Sig." msgstr "Sig." #: src/language/stats/examine.c:735 src/language/stats/oneway.c:1045 #: src/ui/gui/descriptives.ui:25 msgid "Descriptives" msgstr "Deskriptive Statistiken" #: src/language/stats/examine.c:738 msgid "Aspect" msgstr "Aspekt" #: src/language/stats/examine.c:739 src/language/stats/oneway.c:1053 #: src/language/stats/oneway.c:1240 src/language/stats/oneway.c:1375 #: src/language/stats/roc.c:975 src/language/stats/regression.c:902 msgid "Std. Error" msgstr "Standardfehler" #: src/language/stats/examine.c:745 src/language/stats/oneway.c:1056 #, c-format msgid "%g%% Confidence Interval for Mean" msgstr "%g%% Konfidenzintervall für Mittelwert" #: src/language/stats/examine.c:747 src/language/stats/oneway.c:1058 #: src/language/stats/oneway.c:1382 src/language/stats/roc.c:982 #: src/language/stats/regression.c:913 msgid "Lower Bound" msgstr "Untere Grenze" #: src/language/stats/examine.c:748 src/language/stats/oneway.c:1059 #: src/language/stats/oneway.c:1383 src/language/stats/roc.c:983 #: src/language/stats/regression.c:914 msgid "Upper Bound" msgstr "Obere Grenze" #: src/language/stats/examine.c:750 msgid "5% Trimmed Mean" msgstr "5% getrimmtes Mittel" #: src/language/stats/examine.c:750 src/language/stats/frequencies.c:143 #: src/language/stats/means-calc.c:442 src/language/stats/median.c:352 #: src/ui/gui/psppire-dialog-action-frequencies.c:52 msgid "Median" msgstr "Median" #: src/language/stats/examine.c:752 msgid "Interquartile Range" msgstr "Interquartilsabstand" #: src/language/stats/examine.c:832 msgid "Extreme Values" msgstr "Extremwerte" #: src/language/stats/examine.c:840 src/language/stats/quick-cluster.c:664 #: src/language/data-io/list.c:110 msgid "Case Number" msgstr "Fallnummer" #: src/language/stats/examine.c:844 msgid "Order" msgstr "Sortierung" #. TRANSLATORS: This is a noun, not an adjective. #: src/language/stats/examine.c:850 msgid "Extreme" msgstr "Ausreißer" #: src/language/stats/examine.c:851 msgid "Highest" msgstr "Höchster" #: src/language/stats/examine.c:851 msgid "Lowest" msgstr "Niedrigster" #: src/language/stats/examine.c:921 src/language/stats/logistic.c:1328 #: src/language/stats/means.c:694 src/language/stats/reliability.c:540 msgid "Case Processing Summary" msgstr "Zusammenfassung der Fallverarbeitung" #: src/language/stats/examine.c:927 src/language/stats/frequencies.c:304 #: src/language/stats/frequencies.c:1494 src/language/stats/logistic.c:1332 #: src/language/stats/means.c:713 src/language/stats/reliability.c:545 #: src/language/stats/crosstabs.q:927 msgid "Percent" msgstr "Prozent" #: src/language/stats/examine.c:929 src/language/stats/frequencies.c:321 #: src/language/stats/frequencies.c:1590 src/language/stats/quick-cluster.c:766 #: src/language/stats/reliability.c:548 src/language/stats/crosstabs.q:931 msgid "Valid" msgstr "Gültig" #: src/language/stats/examine.c:929 src/language/stats/frequencies.c:336 #: src/language/stats/frequencies.c:1591 src/language/stats/crosstabs.q:931 msgid "Missing" msgstr "Fehlende Werte" #: src/language/stats/examine.c:1550 #, c-format msgid "%s may not be negative. Using default value (%g)." msgstr "" "%s darf nicht negativ sein. Der voreingestellte Wert (%g) wird verwendet." #: src/language/stats/examine.c:1587 msgid "Percentiles must lie in the range (0, 100)" msgstr "Perzentile müssen im Bereich (0, 100) liegen" #: src/language/stats/examine.c:1777 #, c-format msgid "%s and %s are mutually exclusive" msgstr "%s und %s schließen sich gegeseitig aus" #: src/language/stats/factor.c:1121 #, c-format msgid "Matrix input for %s must be either COV or CORR" msgstr "" "Die Eingabe der Matrix für %s muss entweder über COV oder CORR erfolgen" #: src/language/stats/factor.c:1519 msgid "Factor analysis on a single variable is not useful." msgstr "Faktorenanalyse einer einzelnen Variable ist nicht sinnvoll." #: src/language/stats/factor.c:1523 msgid "Factor analysis without variables is not possible." msgstr "Eine Faktorenanalyse ohne Variablen ist nicht sinnvoll." #: src/language/stats/factor.c:1634 msgid "Component Number" msgstr "Komponentennummer" #: src/language/stats/factor.c:1634 msgid "Factor Number" msgstr "Faktorzahl" #: src/language/stats/factor.c:1648 src/language/stats/factor.c:1651 msgid "Communalities" msgstr "Kommunalitäten" #: src/language/stats/factor.c:1653 msgid "Initial" msgstr "Ursprünglich" #: src/language/stats/factor.c:1655 msgid "Extraction" msgstr "Extraktion" #: src/language/stats/factor.c:1697 src/language/stats/factor.c:1777 #: src/language/stats/factor.c:1839 msgid "Component" msgstr "Komponente" #: src/language/stats/factor.c:1697 src/language/stats/factor.c:1777 #: src/language/stats/factor.c:1839 msgid "Factor" msgstr "Faktor" #: src/language/stats/factor.c:1752 msgid "Total Variance Explained" msgstr "Erklärte Gesamtvarianz" #: src/language/stats/factor.c:1758 #, no-c-format msgid "% of Variance" msgstr "% der Varianz" #: src/language/stats/factor.c:1760 #, no-c-format msgid "Cumulative %" msgstr "Kumuliert %" #: src/language/stats/factor.c:1763 msgid "Phase" msgstr "Phase" #: src/language/stats/factor.c:1765 msgid "Initial Eigenvalues" msgstr "Ursprüngliche Eigenwerte" #: src/language/stats/factor.c:1769 msgid "Extraction Sums of Squared Loadings" msgstr "Summe der quadrierten Ladungen der Extraktion" #: src/language/stats/factor.c:1773 msgid "Rotation Sums of Squared Loadings" msgstr "Summe der quadrierten Ladungen der Rotation" #: src/language/stats/factor.c:1835 msgid "Factor Correlation Matrix" msgstr "Faktor-Korrelationsmatrix" #: src/language/stats/factor.c:1842 msgid "Factor 2" msgstr "Faktor 2" #: src/language/stats/factor.c:1874 msgid "Anti-Image Matrices" msgstr "Anti-Image-Korrelationsmatrix" #: src/language/stats/factor.c:1879 msgid "Anti-image Covariance" msgstr "Anti-Image-Kovarianz" #: src/language/stats/factor.c:1880 msgid "Anti-image Correlation" msgstr "Anti-Image-Korrelation" #: src/language/stats/factor.c:1901 msgid "Correlation Matrix" msgstr "Korrelationsmatrix" #: src/language/stats/factor.c:1910 src/language/stats/t-test-paired.c:195 msgid "Correlation" msgstr "Korrelation" #: src/language/stats/factor.c:1947 msgid "Determinant" msgstr "Determinante" #: src/language/stats/factor.c:1958 msgid "Covariance Matrix" msgstr "Kovarianzmatrix" #: src/language/stats/factor.c:1990 msgid "" "The dataset contains no complete observations. No analysis will be performed." msgstr "" "Der Datensatz enthält keine vollständigen Beobachtungen. Die Analyse wird " "nicht durchgeführt." #: src/language/stats/factor.c:2014 msgid "The dataset has no complete covariance or correlation matrix." msgstr "" "Im Datensatz ist keine vollständige Kovarianz oder Korrelationsmatrix " "enthalten." #: src/language/stats/factor.c:2071 msgid "Analysis N" msgstr "Analyse N" #: src/language/stats/factor.c:2099 msgid "KMO and Bartlett's Test" msgstr "KMO und Bartlett's Test" #: src/language/stats/factor.c:2103 msgid "Kaiser-Meyer-Olkin Measure of Sampling Adequacy" msgstr "Kaiser-Meyer-Olkin-Maß für Angemessenheit der Stichproben" #: src/language/stats/factor.c:2105 msgid "Bartlett's Test of Sphericity" msgstr "Bartlett's Test auf Sphärizität" #: src/language/stats/factor.c:2106 msgid "Approx. Chi-Square" msgstr "Geschätztes Chi-Quadrat" #: src/language/stats/factor.c:2154 #, c-format msgid "" "The %s criteria result in zero factors extracted. Therefore no analysis will " "be performed." msgstr "" "Auf Grund des %s-Kriteriums konnten keine Faktoren extrahiert werden. Daher " "wird keine Analyse durchgeführt." #: src/language/stats/factor.c:2161 #, c-format msgid "" "The %s criteria result in more factors than variables, which is not " "meaningful. No analysis will be performed." msgstr "" "Das %s-Kriterium führt zu mehr Faktoren als Variablen. Dies ist nicht " "sinnvoll. Die Analyse wird nicht durchgeführt." #: src/language/stats/factor.c:2254 msgid "Component Matrix" msgstr "Komponentenmatrix" #: src/language/stats/factor.c:2254 msgid "Factor Matrix" msgstr "Faktor Matrix" #: src/language/stats/factor.c:2259 msgid "Pattern Matrix" msgstr "Mustermatrix" #: src/language/stats/factor.c:2268 msgid "Structure Matrix" msgstr "Strukturmatrix" #: src/language/stats/factor.c:2270 msgid "Rotated Component Matrix" msgstr "Rotierte Komponentenmatrix" #: src/language/stats/factor.c:2271 msgid "Rotated Factor Matrix" msgstr "Rotierte Faktormatrix" #: src/language/stats/flip.c:100 #, c-format msgid "%s ignores %s. Temporary transformations will be made permanent." msgstr "%s ignoriert %s. Temporäre Umformungen werden dauerhaft gemacht." #: src/language/stats/flip.c:153 #, c-format msgid "Could not create temporary file for %s." msgstr "Temporäre Datei für %s konnte nicht erstellt werden." #: src/language/stats/flip.c:341 #, c-format msgid "Error rewinding %s file: %s." msgstr "Fehler beim Zurücksetzen der %s Datei: %s." #: src/language/stats/flip.c:348 #, c-format msgid "Error creating %s source file." msgstr "Fehler beim Erstellen der %s Quelldatei." #: src/language/stats/flip.c:361 #, c-format msgid "Error reading %s file: %s." msgstr "Fehler beim Lesen der %s Datei: %s." #: src/language/stats/flip.c:363 #, c-format msgid "Unexpected end of file reading %s file." msgstr "Unerwartetes Dateiende beim Lesen der %s Datei." #: src/language/stats/flip.c:379 #, c-format msgid "Error seeking %s source file: %s." msgstr "Fehler beim Suchen der %s Quelledatei: %s." #: src/language/stats/flip.c:387 #, c-format msgid "Error writing %s source file: %s." msgstr "Fehler beim Schreiben der %s Quelldatei: %s." #: src/language/stats/flip.c:402 #, c-format msgid "Error rewinding %s source file: %s." msgstr "Fehler beim Zurücksetzen der %s Quelldatei: %s." #: src/language/stats/flip.c:433 #, c-format msgid "Error reading %s temporary file: %s." msgstr "Fehler beim Lesen der %s Temporärdatei: %s." #: src/language/stats/flip.c:436 #, c-format msgid "Unexpected end of file reading %s temporary file." msgstr "Unerwartetes Dateiende beim Lesen der %s Temporärdatei." #: src/language/stats/frequencies.c:144 #: src/ui/gui/psppire-dialog-action-frequencies.c:49 msgid "Mode" msgstr "Modalwert" #: src/language/stats/frequencies.c:303 src/language/stats/logistic.c:1381 #: src/output/charts/plot-hist-cairo.c:112 msgid "Frequency" msgstr "Häufigkeit" #: src/language/stats/frequencies.c:305 msgid "Valid Percent" msgstr "Gültige Prozente" #: src/language/stats/frequencies.c:306 src/language/stats/graph.c:208 msgid "Cumulative Percent" msgstr "Kumulierte Prozente" #: src/language/stats/frequencies.c:905 msgid "Histogram frequency must be greater than zero." msgstr "" "Die Angabe zur Häufigkeit (FREQUENCY) für das Histogramm muss größer als " "Null sein." #: src/language/stats/frequencies.c:923 msgid "Histogram percentage must be greater than zero." msgstr "" "Die Prozentangabe (PERCENT) für das Histogramm muss größer als Null sein." #: src/language/stats/frequencies.c:1139 #, c-format msgid "" "%s for histogram must be greater than or equal to %s, but %s was specified " "as %.15g and %s as %.15g. %s and %s will be ignored." msgstr "" "%s für das Histogramm muss größer oder gleich %s sein, aber %s wurde als " "%.15g und %s als %.15g angegeben. %s und %s werden nicht übernommen." #: src/language/stats/frequencies.c:1184 #, c-format msgid "" "%s for pie chart must be greater than or equal to %s, but %s was specified " "as %.15g and %s as %.15g. %s and %s will be ignored." msgstr "" "%s für das Kreisdiagramm muss größer oder gleich %s sein, aber %s wurde als " "%.15g und %s als %.15g angegeben. %s und %s werden nicht übernommen." #: src/language/stats/frequencies.c:1474 #, c-format msgid "Omitting pie chart for %s, which has only %d unique values." msgstr "" "Kreisdiagramm für %s wird ausgelassen, weil es nur %d unterschiedliche Werte " "gibt." #: src/language/stats/frequencies.c:1477 #, c-format msgid "Omitting pie chart for %s, which has over 50 unique values." msgstr "" "Kreisdiagramm für %s wird ausgelassen, weil es mehr als 50 unterschiedliche " "Werte gibt." #: src/language/stats/frequencies.c:1494 src/language/stats/graph.c:205 #: src/language/stats/quick-cluster.c:747 #: src/ui/gui/psppire-dialog-action-crosstabs.c:90 #: src/language/stats/crosstabs.q:789 src/language/stats/crosstabs.q:1262 msgid "Count" msgstr "Beobachtete Häufigkeit" #: src/language/stats/friedman.c:220 src/language/stats/kruskal-wallis.c:247 #: src/language/stats/mann-whitney.c:182 src/language/stats/wilcoxon.c:240 msgid "Ranks" msgstr "Ränge" #: src/language/stats/friedman.c:222 src/language/stats/friedman.c:223 #: src/language/stats/kruskal-wallis.c:251 #: src/language/stats/mann-whitney.c:186 src/language/stats/wilcoxon.c:245 msgid "Mean Rank" msgstr "Durchschnittlicher Rang" #: src/language/stats/friedman.c:253 msgid "Kendall's W" msgstr "Kendall's W" #: src/language/stats/friedman.c:256 src/language/stats/kruskal-wallis.c:298 #: src/language/stats/median.c:353 msgid "Chi-Square" msgstr "Chi-Quadrat" #: src/language/stats/glm.c:169 msgid "Multivariate analysis is not yet implemented" msgstr "Multivariate Analysen sind noch nicht implementiert" #: src/language/stats/glm.c:274 msgid "Only types 1, 2 & 3 sums of squares are currently implemented" msgstr "Bisher sind nur Quadratsummen vom Typ I, II & III sind implementiert" #: src/language/stats/glm.c:727 msgid "Tests of Between-Subjects Effects" msgstr "Test der Zwischensubjekteffekte" #: src/language/stats/glm.c:730 msgid "Type I Sum Of Squares" msgstr "Quadratsumme Typ I" #: src/language/stats/glm.c:731 msgid "Type II Sum Of Squares" msgstr "Quadratsumme Typ II" #: src/language/stats/glm.c:732 msgid "Type III Sum Of Squares" msgstr "Quadratsumme Typ III" #: src/language/stats/glm.c:734 src/language/stats/oneway.c:976 #: src/language/stats/regression.c:1026 msgid "Mean Square" msgstr "Mittel der Quadrate" #: src/language/stats/glm.c:735 src/language/stats/oneway.c:977 #: src/language/stats/regression.c:1027 src/language/stats/t-test-indep.c:262 msgid "F" msgstr "F" #: src/language/stats/glm.c:740 msgid "Corrected Model" msgstr "Korrigiertes Modell" #: src/language/stats/glm.c:740 msgid "Model" msgstr "Modell" #: src/language/stats/glm.c:752 msgid "Intercept" msgstr "Konstanter Term" #: src/language/stats/glm.c:802 src/output/pivot-table.c:763 #: src/output/spv/spv.c:867 msgid "Error" msgstr "Fehler" #: src/language/stats/glm.c:819 msgid "Corrected Total" msgstr "Korrigierte Gesamtvariation" #: src/language/stats/graph.c:206 msgid "Percentage" msgstr "Prozentwerte" #: src/language/stats/graph.c:207 msgid "Cumulative Count" msgstr "Kumulierte Anzahl" #: src/language/stats/graph.c:296 #, c-format msgid "%s vs. %s by %s" msgstr "%s vs. %s gruppiert nach %s" #: src/language/stats/graph.c:303 #, c-format msgid "%s vs. %s" msgstr "%s vs. %s" #: src/language/stats/graph.c:322 msgid "" "Maximum number of scatterplot categories reached. Your BY variable has too " "many distinct values. The coloring of the plot will not be correct." msgstr "" "Maximale Anzahl an Kategorien im Scatterplot erreicht. Die Variable BY hat " "zu viele unterschiedliche Werte. Die Farben im Diagramm werden nicht korrekt " "umgesetzt." #: src/language/stats/graph.c:551 src/language/stats/rank.c:636 #, c-format msgid "%s of %s" msgstr "%s von %s" #: src/language/stats/graph.c:698 src/language/stats/graph.c:729 #: src/language/stats/graph.c:777 msgid "Only one chart type is allowed." msgstr "Nur ein Diagrammtyp ist erlaubt." #: src/language/stats/graph.c:721 src/language/stats/graph.c:820 #: src/language/stats/graph.c:834 msgid "Only one variable is allowed." msgstr "Nur eine Vriable ist erlaubt." #: src/language/stats/graph.c:843 msgid "Variable expected" msgstr "Variable erwartet" #: src/language/stats/graph.c:883 msgid "FOOTNOTE is not implemented yet for GRAPH" msgstr "FOOTNOTE ist für den Befehl GRAPH noch nicht implementiert" #: src/language/stats/ks-one-sample.c:274 src/ui/gui/ks-one-sample.ui:24 msgid "One-Sample Kolmogorov-Smirnov Test" msgstr "Kolmogorov-Smirnov Test für eine Stichprobe" #: src/language/stats/ks-one-sample.c:284 msgid "Uniform Parameters" msgstr "Uniform Parameter" #: src/language/stats/ks-one-sample.c:289 msgid "Normal Parameters" msgstr "Normal Parameter" #: src/language/stats/ks-one-sample.c:294 msgid "Poisson Parameters" msgstr "Poisson Parameter" #: src/language/stats/ks-one-sample.c:295 #: src/ui/gui/psppire-dialog-action-crosstabs.c:76 #: src/language/stats/crosstabs.q:1421 msgid "Lambda" msgstr "Lambda" #: src/language/stats/ks-one-sample.c:300 msgid "Exponential Parameters" msgstr "Exponential Parameter" #: src/language/stats/ks-one-sample.c:308 msgid "Most Extreme Differences" msgstr "Größte Differenz" #: src/language/stats/ks-one-sample.c:309 msgid "Absolute" msgstr "Absolut" #: src/language/stats/ks-one-sample.c:309 src/language/stats/roc.c:1037 msgid "Positive" msgstr "Positiv" #: src/language/stats/ks-one-sample.c:309 src/language/stats/roc.c:1037 msgid "Negative" msgstr "Negativ" #: src/language/stats/ks-one-sample.c:312 msgid "Kolmogorov-Smirnov Z" msgstr "Kolmogorov-Smirnov Z" #: src/language/stats/ks-one-sample.c:313 #: src/language/stats/jonckheere-terpstra.c:374 #: src/language/stats/mann-whitney.c:251 src/language/stats/runs.c:328 #: src/language/stats/wilcoxon.c:284 msgid "Asymp. Sig. (2-tailed)" msgstr "Asymp. Sig. (2-seitig)" #: src/language/stats/logistic.c:327 msgid "All predicted values are either 1 or 0" msgstr "Alle vorhergesagten Werte sind entweder 1 oder 0" #: src/language/stats/logistic.c:525 msgid "Dependent variable's values are not dichotomous." msgstr "Die Werte der abhängigen Variable sind nicht dichotom." #: src/language/stats/logistic.c:614 #, c-format msgid "" "Category %s does not have at least two distinct values. Logistic regression " "will not be run." msgstr "" "Kategorie %s enthält nicht mindestens zwei unterschiedliche Werte. " "Logistische Regression wird nicht durchgeführt." #: src/language/stats/logistic.c:674 #, c-format msgid "" "Estimation terminated at iteration number %d because parameter estimates " "changed by less than %g" msgstr "" "Schätzung wurde bei Wiederholung Nummer %d abgebrochen, weil sich die " "geschätzten Parameter um weniger als %g verändert haben." #: src/language/stats/logistic.c:686 #, c-format msgid "" "Estimation terminated at iteration number %d because Log Likelihood " "decreased by less than %g%%" msgstr "" "Schätzung wurde bei Wiederholung Nummer %d abgebrochen, weil sich die Log " "Likelihood um weniger als %g% % verringert hat" #: src/language/stats/logistic.c:701 #, c-format msgid "" "Estimation terminated at iteration number %d because maximum iterations has " "been reached" msgstr "" "Schätzung wurde bei Wiederholung Nummer %d abgebrochen, weil das Maximum an " "Wiederholungen erreicht wurde" #: src/language/stats/logistic.c:994 msgid "Cut point value must be in the range [0,1]" msgstr "Der Trennwert muss im Bereich [0; 1] liegen" #: src/language/stats/logistic.c:1139 msgid "Dependent Variable Encoding" msgstr "Codierung abhängiger Variablen" #: src/language/stats/logistic.c:1141 msgid "Mapping" msgstr "Zuordnung" #: src/language/stats/logistic.c:1142 msgid "Internal Value" msgstr "Interner Wert" #: src/language/stats/logistic.c:1145 msgid "Original Value" msgstr "Ursprünglicher Wert" #: src/language/stats/logistic.c:1167 msgid "Variables in the Equation" msgstr "Variablen in der Gleichung " #: src/language/stats/logistic.c:1171 src/language/stats/regression.c:902 msgid "B" msgstr "B" #: src/language/stats/logistic.c:1172 msgid "S.E." msgstr "S.E." #: src/language/stats/logistic.c:1173 msgid "Wald" msgstr "Wald" #: src/language/stats/logistic.c:1176 msgid "Exp(B)" msgstr "Exp(B)" #: src/language/stats/logistic.c:1181 #, c-format msgid "%d%% CI for Exp(B)" msgstr "%d%% CI für Exp(B)" #: src/language/stats/logistic.c:1183 src/language/stats/t-test-indep.c:274 #: src/language/stats/t-test-one-sample.c:83 #: src/language/stats/t-test-paired.c:249 src/language/stats/crosstabs.q:1369 msgid "Lower" msgstr "Untere" #: src/language/stats/logistic.c:1183 src/language/stats/t-test-indep.c:275 #: src/language/stats/t-test-one-sample.c:84 #: src/language/stats/t-test-paired.c:250 src/language/stats/crosstabs.q:1370 msgid "Upper" msgstr "Obere" #: src/language/stats/logistic.c:1189 src/language/stats/logistic.c:1470 msgid "Step 1" msgstr "Schritt 1" #: src/language/stats/logistic.c:1263 msgid "Constant" msgstr "Konstante" #: src/language/stats/logistic.c:1298 msgid "Model Summary" msgstr "Modellzusammenfassung" #: src/language/stats/logistic.c:1301 msgid "-2 Log likelihood" msgstr "-2 Log Likelihood" #: src/language/stats/logistic.c:1302 msgid "Cox & Snell R Square" msgstr "Cox & Snell R-Quadrat" #: src/language/stats/logistic.c:1303 msgid "Nagelkerke R Square" msgstr "Nagelkerke R-Quadrat" #: src/language/stats/logistic.c:1306 src/language/stats/logistic.c:1470 msgid "Step" msgstr "Schritt" #: src/language/stats/logistic.c:1335 msgid "Unweighted Cases" msgstr "Ungewichtete Fälle" #: src/language/stats/logistic.c:1336 msgid "Included in Analysis" msgstr "Einbezogen in Analyse" #: src/language/stats/logistic.c:1336 msgid "Missing Cases" msgstr "Fehlende Fälle" #: src/language/stats/logistic.c:1365 msgid "Categorical Variables' Codings" msgstr "Kodierungen der kategorialen Variablen" #: src/language/stats/logistic.c:1380 msgid "Codings" msgstr "Kodierungen" #: src/language/stats/logistic.c:1383 msgid "Parameter coding" msgstr "Parameterkodierung" #: src/language/stats/logistic.c:1462 msgid "Classification Table" msgstr "Klassifikationstabelle" #: src/language/stats/logistic.c:1466 msgid "Predicted" msgstr "Vorhergesagt" #: src/language/stats/logistic.c:1466 msgid "Percentage Correct" msgstr "Prozentsatz der Richtigen" #: src/language/stats/logistic.c:1468 msgid "Observed" msgstr "Beobachtet" #: src/language/stats/logistic.c:1468 msgid "Overall Percentage" msgstr "Gesamtprozentsatz" #: src/language/stats/jonckheere-terpstra.c:357 msgid "Jonckheere-Terpstra Test" msgstr "Jonckheere-Terpstra Test" #: src/language/stats/jonckheere-terpstra.c:364 #, c-format msgid "Number of levels in %s" msgstr "Anzahl der Stufen in %s" #: src/language/stats/jonckheere-terpstra.c:370 msgid "Observed J-T Statistic" msgstr "Beobachtete J-T Statistik" #: src/language/stats/jonckheere-terpstra.c:371 msgid "Mean J-T Statistic" msgstr "Mittelwert der J-T Statistik" #: src/language/stats/jonckheere-terpstra.c:372 msgid "Std. Deviation of J-T Statistic" msgstr "Standardabweichung der J-T Statistik" #: src/language/stats/jonckheere-terpstra.c:373 msgid "Std. J-T Statistic" msgstr "Std. J-T Statistik" #: src/language/stats/mann-whitney.c:187 src/language/stats/wilcoxon.c:246 msgid "Sum of Ranks" msgstr "Summe der Ränge" #: src/language/stats/mann-whitney.c:248 msgid "Mann-Whitney U" msgstr "Mann-Whitney U" #: src/language/stats/mann-whitney.c:249 msgid "Wilcoxon W" msgstr "Wilcoxon W" #: src/language/stats/mann-whitney.c:250 src/language/stats/runs.c:327 #: src/language/stats/wilcoxon.c:283 msgid "Z" msgstr "Z" #: src/language/stats/means.c:702 msgid "Included" msgstr "Eingeschlossen" #: src/language/stats/means.c:704 src/language/stats/reliability.c:548 msgid "Excluded" msgstr "Ausgeschlossen" #: src/language/stats/means.c:753 msgid "Report" msgstr "Bericht" #: src/language/stats/means.c:838 #, c-format msgid "" "The table \"%s\" has no non-empty control variables. No result for this " "table will be displayed." msgstr "" "Die Tabelle \"%s\" hat nur leere Kontrollvariablen. Es werden für diese " "Tabelle keine Ergebnisse angezeigt." #: src/language/stats/means-calc.c:443 msgid "Group Median" msgstr "Gruppen Median" #: src/language/stats/means-calc.c:455 msgid "First" msgstr "Erstes" #: src/language/stats/means-calc.c:456 msgid "Last" msgstr "Letztes" #: src/language/stats/means-calc.c:458 msgid "Percent N" msgstr "Prozent N" #: src/language/stats/means-calc.c:459 msgid "Percent Sum" msgstr "Prozent Summe" #: src/language/stats/means-calc.c:461 msgid "Harmonic Mean" msgstr "Harmonisches Mittel" #: src/language/stats/means-calc.c:462 msgid "Geom. Mean" msgstr "Geom. Mittel" #: src/language/stats/mcnemar.c:144 msgid "The McNemar test is appropriate only for dichotomous variables" msgstr "Der McNemar-Test ist nur für dichotome Variablen geeignet" #: src/language/stats/mcnemar.c:226 src/language/stats/sign.c:105 msgid "Point Probability" msgstr "Punktwahrscheinlichkeit" #: src/language/stats/mcnemar.c:229 src/language/stats/sign.c:78 #: src/language/stats/sign.c:108 src/language/stats/t-test-paired.c:199 #: src/language/stats/t-test-paired.c:257 src/language/stats/wilcoxon.c:253 #: src/language/stats/wilcoxon.c:292 msgid "Pairs" msgstr "Paare" #: src/language/stats/median.c:316 msgid "> Median" msgstr "> Median" #: src/language/stats/median.c:316 msgid "≤ Median" msgstr "≤ Median" #: src/language/stats/npar.c:536 #, c-format msgid "%s subcommand not currently implemented." msgstr "%s ist noch nicht implementiert." #: src/language/stats/npar.c:691 #, c-format msgid "Expecting %s, %s, %s or a number." msgstr "Erwarte %s, %s, %s oder eine Zahl." #: src/language/stats/npar.c:845 #, c-format msgid "" "The specified value of HI (%d) is lower than the specified value of LO (%d)" msgstr "" "Der angegebene Wert von HI (%d) ist niedriger als der angegebene Wert von LO " "(%d)" #: src/language/stats/npar.c:897 #, c-format msgid "" "%d expected values were given, but the specified range (%d-%d) requires " "exactly %d values." msgstr "" "%d erwartete Werte wurden angegeben, aber der spezifizierte Bereich (%d-%d) " "erfordert genau %d Werte." #: src/language/stats/npar.c:1118 src/language/stats/t-test-parser.c:173 #, c-format msgid "" "PAIRED was specified but the number of variables preceding WITH (%zu) did " "not match the number following (%zu)." msgstr "" "PAIRED wurde angegeben, aber die Anzahl der vorhergehenden Variablen (%zu) " "stimmt nicht mit der Anzahl der nachfolgenden Variablen (%zu) überein." #: src/language/stats/oneway.c:361 msgid "LSD" msgstr "LSD" #: src/language/stats/oneway.c:362 src/ui/gui/oneway.ui:338 msgid "Tukey HSD" msgstr "Tukey HSD" #: src/language/stats/oneway.c:363 src/ui/gui/oneway.ui:253 msgid "Bonferroni" msgstr "Bonferroni" #: src/language/stats/oneway.c:364 src/ui/gui/oneway.ui:304 msgid "Scheffé" msgstr "Scheffé" #: src/language/stats/oneway.c:365 msgid "Games-Howell" msgstr "Games-Howell" #: src/language/stats/oneway.c:366 src/ui/gui/oneway.ui:321 msgid "Šidák" msgstr "Šidák" #: src/language/stats/oneway.c:519 #, c-format msgid "The post hoc analysis method %s is not supported." msgstr "Die Post-Hoc-Analysemethode %s wird nicht unterstützt." #: src/language/stats/oneway.c:842 #, c-format msgid "" "Dependent variable %s has no non-missing values. No analysis for this " "variable will be done." msgstr "" "Die abhängige Variable %s hat keine nicht-fehlenden Werte. Es wird keine " "Analyse für diese Variable durchgeführt." #: src/language/stats/oneway.c:924 #, c-format msgid "" "In contrast list %zu, the number of coefficients (%zu) does not equal the " "number of groups (%d). This contrast list will be ignored." msgstr "" "In der Liste der Kontraste %zu stimmt die Anzahl der Koeffizienten (%zu) " "nicht mit der Anzahl der Gruppen (%d) überein. Dieser Kontrast wird nicht " "berechnet." #: src/language/stats/oneway.c:936 #, c-format msgid "Coefficients for contrast %zu do not total zero" msgstr "" "Die Koeffizienten für den Kontrast %zu addieren sich nicht zu Null auf." #: src/language/stats/oneway.c:971 msgid "ANOVA" msgstr "ANOVA" #: src/language/stats/oneway.c:974 src/language/stats/regression.c:1024 msgid "Sum of Squares" msgstr "Quadratsumme" #: src/language/stats/oneway.c:981 msgid "Between Groups" msgstr "Zwischen Gruppen" #: src/language/stats/oneway.c:981 msgid "Within Groups" msgstr "Innerhalb Gruppen" #: src/language/stats/oneway.c:1075 src/language/stats/oneway.c:1257 msgid "Dependent Variable" msgstr "Abhängige Variable" #: src/language/stats/oneway.c:1148 msgid "Test of Homogeneity of Variances" msgstr "Test der Homogenität der Varianzen" #: src/language/stats/oneway.c:1151 msgid "Levene Statistic" msgstr "Levene Statistik" #: src/language/stats/oneway.c:1152 msgid "df1" msgstr "df1" #: src/language/stats/oneway.c:1153 msgid "df2" msgstr "df2" #: src/language/stats/oneway.c:1192 msgid "Contrast Coefficients" msgstr "Kontrast Koeffizienten" #: src/language/stats/oneway.c:1199 src/language/stats/oneway.c:1246 msgid "Contrast" msgstr "Kontrast" #: src/language/stats/oneway.c:1236 msgid "Contrast Tests" msgstr "Kontrast Tests" #: src/language/stats/oneway.c:1239 msgid "Value of Contrast" msgstr "Kontrastwert" #: src/language/stats/oneway.c:1241 src/language/stats/regression.c:905 #: src/language/stats/t-test-indep.c:266 #: src/language/stats/t-test-one-sample.c:74 #: src/language/stats/t-test-paired.c:252 msgid "t" msgstr "t" #: src/language/stats/oneway.c:1252 msgid "Assumption" msgstr "Annahme" #: src/language/stats/oneway.c:1253 msgid "Assume equal variances" msgstr "Nehme gleiche Varianzen an" #: src/language/stats/oneway.c:1254 msgid "Does not assume equal variances" msgstr "Nehme nicht gleiche Varianzen an" #: src/language/stats/oneway.c:1367 #, c-format msgid "Multiple Comparisons (%s)" msgstr "Mehrfachvergleiche (%s)" #: src/language/stats/oneway.c:1374 msgid "Mean Difference (I - J)" msgstr "Differenz der Mittelwerte (I - J)" #: src/language/stats/oneway.c:1379 #, c-format msgid "%g%% Confidence Interval" msgstr "%g%% Konfidenzintervall" #: src/language/stats/oneway.c:1386 src/language/stats/oneway.c:1390 msgid "(J) Family" msgstr "(J) Familie" #: src/language/stats/oneway.c:1406 msgid "Test" msgstr "Test" #: src/language/stats/quick-cluster.c:576 msgid "Initial Cluster Centers" msgstr "Anfängliche Clusterzentren" #: src/language/stats/quick-cluster.c:577 msgid "Final Cluster Centers" msgstr "Clusterzentren der Ausgangsklassifikation" #: src/language/stats/quick-cluster.c:580 #: src/language/stats/quick-cluster.c:660 #: src/language/stats/quick-cluster.c:661 #: src/language/stats/quick-cluster.c:753 msgid "Cluster" msgstr "Cluster" #: src/language/stats/quick-cluster.c:658 msgid "Cluster Membership" msgstr "Cluster-Zugehörigkeit" #: src/language/stats/quick-cluster.c:744 msgid "Number of Cases in each Cluster" msgstr "Anzahl der Fälle in jedem Cluster" #: src/language/stats/quick-cluster.c:750 msgid "Clusters" msgstr "Cluster" #: src/language/stats/quick-cluster.c:867 #: src/language/stats/quick-cluster.c:893 #, c-format msgid "A variable called `%s' already exists." msgstr "Eine Variable mit dem Namen `%s' existiert bereits." #: src/language/stats/quick-cluster.c:908 #, c-format msgid "Expecting %s or %s." msgstr "Erwarte %s oder %s." #: src/language/stats/quick-cluster.c:928 msgid "The number of clusters must be positive" msgstr "Anzahl der Cluster muß positiv sein" #: src/language/stats/quick-cluster.c:944 msgid "The convergence criterion must be positive" msgstr "Das Konvergenzkriterium muss positiv sein" #: src/language/stats/quick-cluster.c:960 msgid "The number of iterations must be positive" msgstr "Anzahl der Iterationen muß positiv sein" #: src/language/stats/rank.c:205 #, c-format msgid "" "Cannot generate variable name for ranking %s with %s. All candidates in use." msgstr "" "Ein Variablenname für die Rangbildung von %s mit %s konnte nicht erzeugt " "werden. Alle Kandidaten werden bereits verwedet." #: src/language/stats/rank.c:321 #, c-format msgid "Too many variables in %s clause." msgstr "Zu viele Variablen im Block %s." #: src/language/stats/rank.c:323 #, c-format msgid "Variable %s already exists." msgstr "Variable %s existiert bereits." #: src/language/stats/rank.c:325 src/language/expressions/evaluate.c:164 #, c-format msgid "Duplicate variable name %s." msgstr "Doppelter Variablenname %s." #: src/language/stats/rank.c:631 #, c-format msgid "%s of %s by %s" msgstr "%s von %s durch %s" #: src/language/stats/rank.c:825 msgid "Variables Created by RANK" msgstr "Variablen, die von RANK erstellt wurden" #: src/language/stats/rank.c:828 src/language/stats/rank.c:829 msgid "New Variable" msgstr "Neue Variable" #: src/language/stats/rank.c:829 msgid "Function" msgstr "Funktion" #: src/language/stats/rank.c:830 msgid "Fraction" msgstr "Anteil" #: src/language/stats/rank.c:830 msgid "Grouping Variables" msgstr "Gruppenvariablen" #: src/language/stats/rank.c:833 src/language/stats/rank.c:834 msgid "Existing Variable" msgstr "Vorhandene Variable" #: src/language/stats/reliability.c:164 msgid "Reliability on a single variable is not useful." msgstr "Reliabilität einer einzelnen Variable ist nicht sinnvoll." #: src/language/stats/reliability.c:281 msgid "" "The STATISTICS subcommand is not yet implemented. No statistics will be " "produced." msgstr "" "Der Unterbefehl STATISTICS ist noch nicht implementiert. Es wird keine " "Statistik erstellt." #: src/language/stats/reliability.c:300 msgid "The split point must be less than the number of variables" msgstr "Der Trennwert muß kleiner als die Anzahl von Variablen sein" #: src/language/stats/reliability.c:525 #, c-format msgid "Scale: %s" msgstr "Skala: %s" #: src/language/stats/reliability.c:582 msgid "Item-Total Statistics" msgstr "Item-Gesamt Statistiken" #: src/language/stats/reliability.c:585 msgid "Scale Mean if Item Deleted" msgstr "Skalenmittelwert wenn Item gelöscht" #: src/language/stats/reliability.c:586 msgid "Scale Variance if Item Deleted" msgstr "Skalenvarianz wenn Item gelöscht" #: src/language/stats/reliability.c:587 msgid "Corrected Item-Total Correlation" msgstr "Korrigierte Item-Gesamt-Korrelation" #: src/language/stats/reliability.c:588 msgid "Cronbach's Alpha if Item Deleted" msgstr "Cronbachs Alpha wenn Item gelöscht" #: src/language/stats/reliability.c:627 msgid "Reliability Statistics" msgstr "Reliabilitätsstatistiken" #: src/language/stats/reliability.c:634 src/language/stats/reliability.c:646 msgid "Cronbach's Alpha" msgstr "Cronbach's Alpha" #: src/language/stats/reliability.c:635 src/language/stats/reliability.c:649 #: src/language/stats/reliability.c:652 msgid "N of Items" msgstr "N der Items" #: src/language/stats/reliability.c:647 msgid "Part 1" msgstr "Teil 1" #: src/language/stats/reliability.c:650 msgid "Part 2" msgstr "Teil 2" #: src/language/stats/reliability.c:654 msgid "Total N of Items" msgstr "Gesamt N der Items" #: src/language/stats/reliability.c:656 msgid "Correlation Between Forms" msgstr "Korrelation zwischen Formen" #: src/language/stats/reliability.c:659 msgid "Spearman-Brown Coefficient" msgstr "Spearman-Brown Koeffizient" #: src/language/stats/reliability.c:660 msgid "Equal Length" msgstr "Gleiche Länge" #: src/language/stats/reliability.c:661 msgid "Unequal Length" msgstr "Ungleiche Länge" #: src/language/stats/reliability.c:663 msgid "Guttman Split-Half Coefficient" msgstr "Guttman Split-Half-Koeffizient" #: src/language/stats/roc.c:966 msgid "Area Under the Curve" msgstr "Fläche unter der Kurve" #: src/language/stats/roc.c:970 msgid "Area" msgstr "Fläche" #: src/language/stats/roc.c:976 msgid "Asymptotic Sig." msgstr "Asymptotisch Sig." #: src/language/stats/roc.c:979 #, c-format msgid "Asymp. %g%% Confidence Interval" msgstr "Asymp. %g%% Konfidenzintervall" #: src/language/stats/roc.c:987 msgid "Variable under test" msgstr "Getestete Variable" #: src/language/stats/roc.c:1026 msgid "Case Summary" msgstr "Fallzusammenfassung" #: src/language/stats/roc.c:1030 msgid "Unweighted" msgstr "ungewichtet" #: src/language/stats/roc.c:1031 msgid "Weighted" msgstr "gewichtet" #: src/language/stats/roc.c:1064 msgid "Coordinates of the Curve" msgstr "Koordinaten der Kurve" #: src/language/stats/roc.c:1068 msgid "Positive if greater than or equal to" msgstr "Positiv falls größer oder gleich" #: src/language/stats/roc.c:1069 src/output/charts/roc-chart-cairo.c:38 msgid "Sensitivity" msgstr "Sensitivität" #: src/language/stats/roc.c:1069 src/output/charts/roc-chart-cairo.c:37 msgid "1 - Specificity" msgstr "1- Spezifität" #: src/language/stats/roc.c:1072 msgid "Coordinates" msgstr "Koordinaten" #: src/language/stats/roc.c:1076 msgid "Test variable" msgstr "Testvariable" #: src/language/stats/regression.c:224 src/language/stats/regression.c:229 #, c-format msgid "VARIABLES may not appear after %s" msgstr "VARIABLES darf nicht nach %s erscheinen" #: src/language/stats/regression.c:412 msgid "" "REGRESSION with SAVE ignores TEMPORARY. Temporary transformations will be " "made permanent." msgstr "" "REGRESSION mit SAVE ignoriert TEMPORARY. Temporäre Umformungen werden " "dauerhaft gemacht." #: src/language/stats/regression.c:416 msgid "REGRESSION with SAVE ignores FILTER. All cases will be processed." msgstr "" "REGRESSION mit SAVE ignoriert FILTER. Es werden alle Fälle verarbeitet." #: src/language/stats/regression.c:569 msgid "" "The dependent variable is equal to the independent variable. The least " "squares line is therefore Y=X. Standard errors and related statistics may be " "meaningless." msgstr "" "Die abhängige Variable ist mit der unabhängigen Variable identisch. Die " "Regressionsgerade ist daher Y=X. Standardfehler und damit verbundene " "Statistiken sind eventuell aussagelos." #: src/language/stats/regression.c:776 msgid "No valid data found. This command was skipped." msgstr "Keine gültigen Daten gefunden. Dieser Befehl wird übersprungen." #: src/language/stats/regression.c:863 #, c-format msgid "Model Summary (%s)" msgstr "Modellzusammenfassung (%s)" #: src/language/stats/regression.c:868 #: src/ui/gui/psppire-dialog-action-regression.c:42 msgid "R" msgstr "R" #: src/language/stats/regression.c:868 msgid "R Square" msgstr "R-Quadrat" #: src/language/stats/regression.c:868 msgid "Adjusted R Square" msgstr "Korrigiertes R-Quadrat" #: src/language/stats/regression.c:869 msgid "Std. Error of the Estimate" msgstr "Standardfehler des Schätzers " #: src/language/stats/regression.c:895 #, c-format msgid "Coefficients (%s)" msgstr "Koeffizienten (%s)" #: src/language/stats/regression.c:901 msgid "Unstandardized Coefficients" msgstr "Unstandardisierte Koeffizienten" #: src/language/stats/regression.c:904 msgid "Standardized Coefficients" msgstr "Standardisierte Koeffizienten" #: src/language/stats/regression.c:904 msgid "Beta" msgstr "Beta" #: src/language/stats/regression.c:911 #, c-format msgid "%g%% Confidence Interval for B" msgstr "%g%% Konfidenzintervall für B" #: src/language/stats/regression.c:919 msgid "Collinearity Statistics" msgstr "Kollinearitätsstatistiken" #: src/language/stats/regression.c:920 msgid "Tolerance" msgstr "Toleranz" #: src/language/stats/regression.c:920 msgid "VIF" msgstr "VIF" #: src/language/stats/regression.c:933 msgid "(Constant)" msgstr "(Konstante)" #: src/language/stats/regression.c:1020 #, c-format msgid "ANOVA (%s)" msgstr "ANOVA (%s)" #: src/language/stats/regression.c:1031 src/ui/gui/regression.ui:24 msgid "Regression" msgstr "Regression" #: src/language/stats/regression.c:1075 #, c-format msgid "Coefficient Correlations (%s)" msgstr "Korrelationen der Koeffizienten (%s)" #: src/language/stats/regression.c:1082 msgid "Models" msgstr "Modelle" #: src/language/stats/regression.c:1090 msgid "Covariances" msgstr "Kovarianzen" #: src/language/stats/runs.c:169 #, c-format msgid "" "Multiple modes exist for variable `%s'. Using %.*g as the threshold value." msgstr "" "Für die Variable `%s' gibt es mehrere Modalwerte. %.*g wird als Grenzwert " "verwendet." #: src/language/stats/runs.c:314 src/ui/gui/runs.ui:24 msgid "Runs Test" msgstr "Sequenzen-Test" #: src/language/stats/runs.c:319 msgid "Test Value" msgstr "Testwert" #: src/language/stats/runs.c:320 msgid "Test Value (mode)" msgstr "Testwert (Modus)" #: src/language/stats/runs.c:321 msgid "Test Value (mean)" msgstr "Testwert (arith. Mittelwert)" #: src/language/stats/runs.c:322 msgid "Test Value (median)" msgstr "Testwert (Median)" #: src/language/stats/runs.c:323 msgid "Cases < Test Value" msgstr "Fälle < Testwert" #: src/language/stats/runs.c:324 msgid "Cases ≥ Test Value" msgstr "Fälle ≥ Testwert" #: src/language/stats/runs.c:325 msgid "Total Cases" msgstr "Gesamte Fälle" #: src/language/stats/runs.c:326 msgid "Number of Runs" msgstr "Anzahl der Sequenzen" #: src/language/stats/sign.c:72 msgid "Differences" msgstr "Differenzen" #: src/language/stats/sign.c:73 msgid "Negative Differences" msgstr "Negative Differenzen" #: src/language/stats/sign.c:74 msgid "Positive Differences" msgstr "Positive Differenzen" #: src/language/stats/sign.c:75 src/language/stats/wilcoxon.c:250 msgid "Ties" msgstr "Rangbindungen" #: src/language/stats/sort-cases.c:63 msgid "Buffer limit must be at least 2." msgstr "Puffergrenze muss mindestens 2 betragen." #: src/language/stats/sort-criteria.c:89 #, c-format msgid "Variable %s specified twice in sort criteria." msgstr "Variable %s ist in den Sortierkriterien zweimal angegeben." #: src/language/stats/t-test-indep.c:190 msgid "Group Statistics" msgstr "Gruppenstatistiken" #: src/language/stats/t-test-indep.c:200 msgid "Group" msgstr "Gruppe" #: src/language/stats/t-test-indep.c:256 msgid "Independent Samples Test" msgstr "Test bei unabhängigen Stichproben" #: src/language/stats/t-test-indep.c:261 msgid "Levene's Test for Equality of Variances" msgstr "Levene-Test der Varianzgleichheit" #: src/language/stats/t-test-indep.c:265 msgid "T-Test for Equality of Means" msgstr "T-Test für die Gleichheit der Mittelwerte" #: src/language/stats/t-test-indep.c:269 #: src/language/stats/t-test-one-sample.c:77 msgid "Mean Difference" msgstr "Mittlere Differenz" #: src/language/stats/t-test-indep.c:270 msgid "Std. Error Difference" msgstr "Stdfehler der Differenz" #: src/language/stats/t-test-indep.c:273 #, no-c-format msgid "95% Confidence Interval of the Difference" msgstr "95% Konfidenzintervall der Differenz" #: src/language/stats/t-test-indep.c:277 msgid "Assumptions" msgstr "Annahmen" #: src/language/stats/t-test-indep.c:278 msgid "Equal variances assumed" msgstr "Varianzen sind gleich" #: src/language/stats/t-test-indep.c:279 msgid "Equal variances not assumed" msgstr "Varianzen sind nicht gleich" #: src/language/stats/t-test-one-sample.c:64 msgid "One-Sample Test" msgstr "Test bei einer Sichprobe" #: src/language/stats/t-test-one-sample.c:71 #, c-format msgid "Test Value = %.*g" msgstr "Testwert = %.*g" #: src/language/stats/t-test-one-sample.c:80 #: src/language/stats/t-test-paired.c:246 #, c-format msgid "%g%% Confidence Interval of the Difference" msgstr "%g%% Konfidenzintervall der Differenz" #: src/language/stats/t-test-one-sample.c:122 msgid "One-Sample Statistics" msgstr "Statistik bei einer Stichprobe" #: src/language/stats/t-test-paired.c:147 msgid "Paired Sample Statistics" msgstr "Statistik bei gepaarten Stichproben" #: src/language/stats/t-test-paired.c:163 #: src/language/stats/t-test-paired.c:205 #: src/language/stats/t-test-paired.c:263 #, c-format msgid "Pair %zu" msgstr "Paar %zu" #: src/language/stats/t-test-paired.c:190 msgid "Paired Samples Correlations" msgstr "Korrelationen bei gepaarten Stichproben" #: src/language/stats/t-test-paired.c:208 #, c-format msgid "%s & %s" msgstr "%s & %s" #: src/language/stats/t-test-paired.c:234 msgid "Paired Samples Test" msgstr "Test bei gepaarten Stichproben" #: src/language/stats/t-test-paired.c:240 msgid "Paired Differences" msgstr "Gepaarte Differenzen" #: src/language/stats/t-test-paired.c:266 #, c-format msgid "%s - %s" msgstr "%s - %s" #: src/language/stats/t-test-parser.c:133 #, c-format msgid "When applying %s to a string variable, two values must be specified." msgstr "" "Bei der Anwendung von %s auf eine Zeichenfolge müssen zwei Werte übergeben " "werden." #: src/language/stats/t-test-parser.c:145 #: src/language/stats/t-test-parser.c:241 #, c-format msgid "%s subcommand may not be used with %s." msgstr "%s Unterbefehl kann nicht mit %s verwendet werden." #: src/language/stats/t-test-parser.c:305 msgid "Exactly one of TESTVAL, GROUPS and PAIRS subcommands must be specified." msgstr "" "Genau einer der drei Unterbefehle TESTVAL, GROUPS oder PAIRS muss angegeben " "werden." #: src/language/stats/wilcoxon.c:248 msgid "Sign" msgstr "Vorzeichen" #: src/language/stats/wilcoxon.c:249 msgid "Negative Ranks" msgstr "Negative Ränge" #: src/language/stats/wilcoxon.c:249 msgid "Positive Ranks" msgstr "Positive Ränge" #: src/language/stats/wilcoxon.c:296 msgid "Too many pairs to calculate exact significance" msgstr "Zu viele Paarungen um die exakte Sigifikanz zu berechnen" #: src/language/data-io/combine-files.c:214 msgid "Cannot specify the active dataset since none has been defined." msgstr "" "Das aktive Datenblatt kann nicht angegeben werden, da noch keines definiert " "wurde." #: src/language/data-io/combine-files.c:220 msgid "" "This command may not be used after TEMPORARY when the active dataset is an " "input source. Temporary transformations will be made permanent." msgstr "" "Dieser Befehl darf nicht nach TEMPORARY verwendet werden, wenn das aktive " "Datenblatt eine Quelle ist. Vorläufige Transformationen werden dauerhaft " "gemacht." #: src/language/data-io/combine-files.c:255 msgid "Multiple IN subcommands for a single FILE or TABLE." msgstr "" "Mehrere IN Unterbefehle für eine einzelne Datei (FILE) oder Tabelle (TABLE)." #: src/language/data-io/combine-files.c:308 #, c-format msgid "File %s lacks BY variable %s." msgstr "In der Datei %s fehlt BY Variable %s." #: src/language/data-io/combine-files.c:311 #, c-format msgid "Active dataset lacks BY variable %s." msgstr "Im aktiven Datenblatt fehlt BY Variable %s." #: src/language/data-io/combine-files.c:388 #: src/language/data-io/combine-files.c:393 #, c-format msgid "BY is required when %s is specified." msgstr "BY muss angegeben werden, wenn %s angegeben wurde." #: src/language/data-io/combine-files.c:521 msgid "" "Combining files with incompatible encodings. String data may not be " "represented correctly." msgstr "" "Zusammenführung von Dateien mit nicht kompatiblen Kodierungen. Zeichenfolgen " "werden möglicherweise nicht korrekt wiedergegeben." #: src/language/data-io/combine-files.c:564 #, c-format msgid "" "Variable %s in file %s has different type or width from the same variable in " "earlier file." msgstr "" "Die Variable %s in der Datei %s hat einen anderen Typ oder eine andere " "Breite als die gleiche Variable in einer vorherigen Datei." #: src/language/data-io/combine-files.c:570 #, c-format msgid "In file %s, %s is numeric." msgstr "In der Datei %s ist %s numerisch." #: src/language/data-io/combine-files.c:573 #, c-format msgid "In file %s, %s is a string variable with width %d." msgstr "In der Datei %s ist %s eine Stringvariable mit der Breite %d." #: src/language/data-io/combine-files.c:578 #, c-format msgid "In an earlier file, %s was numeric." msgstr "In einer vorherigen Datei war %s numerisch." #: src/language/data-io/combine-files.c:581 #, c-format msgid "In an earlier file, %s was a string variable with width %d." msgstr "" "In einer vorherigen Datei war %s eine Stringvariable mit der Breite %d." #: src/language/data-io/combine-files.c:621 #, c-format msgid "" "Variable name %s specified on %s subcommand duplicates an existing variable " "name." msgstr "" "Der Variablenname %s, der im Unterbefehl %s angegeben wurde, ist ein " "Duplikat eines existierenden Variablennamens." #: src/language/data-io/combine-files.c:793 #, c-format msgid "Encountered %zu sets of duplicate cases in the master file." msgstr "Es wurden %zu Paare von doppelten Fällen in der Masterdatei gefunden." #: src/language/data-io/data-list.c:129 src/language/data-io/data-list.c:144 #, c-format msgid "The %s value must be non-negative." msgstr "Der %s-Wert darf nicht negativ sein." #: src/language/data-io/data-list.c:154 #, c-format msgid "The %s subcommand may only be used within %s." msgstr "Der Unterbefehl %s darf nur innerhalb von %s verwendet werden." #: src/language/data-io/data-list.c:159 #, c-format msgid "The %s subcommand may only be specified once." msgstr "Der Unterbefehl %s darf nur ein Mal angegeben werden." #: src/language/data-io/data-list.c:197 msgid "Only one of FIXED, FREE, or LIST may be specified." msgstr "" "Es darf nur entweder FIXED, FREE oder LIST angegeben werden, aber nicht " "mehrere Optionen." #: src/language/data-io/data-list.c:260 msgid "Encoding should not be specified for inline data. It will be ignored." msgstr "" "Kodierung sollte bei Inline-Daten nicht angegeben werden. Diese wird " "übersprungen." #: src/language/data-io/data-list.c:269 #, c-format msgid "The %s subcommand may be used only with %s." msgstr "Der Unterbefehl %s darf nur mit %s verwendet werden." #: src/language/data-io/data-list.c:284 src/language/data-io/matrix-data.c:578 msgid "At least one variable must be specified." msgstr "Es muss mindestens eine Variable angegeben werden." #: src/language/data-io/data-list.c:383 src/language/data-io/data-list.c:491 #: src/language/data-io/get-data.c:662 #, c-format msgid "%s is a duplicate variable name." msgstr "Der Variablenname %s kommt doppelt vor." #: src/language/data-io/data-list.c:390 #, c-format msgid "There is already a variable %s of a different type." msgstr "Es gibt bereits eine Variable %s mit einem anderen Typ." #: src/language/data-io/data-list.c:397 #, c-format msgid "There is already a string variable %s of a different width." msgstr "Es gibt bereits eine Stringvariable %s mit einer anderen Breite." #: src/language/data-io/data-list.c:405 #, c-format msgid "Cannot place variable %s on record %d when RECORDS=%d is specified." msgstr "" "Die Variable %s kann nicht im EIntrag %d platziert werden, wenn RECORDS=%d " "angegeben wurde." #: src/language/data-io/data-parser.c:453 #: src/language/data-io/data-parser.c:462 msgid "Quoted string extends beyond end of line." msgstr "" "Eine Zeichenfolge in Anführungszeichen erstreckt sich über das Zeilenende " "hinaus." #: src/language/data-io/data-parser.c:488 msgid "Missing delimiter following quoted string." msgstr "Fehlendes Trennzeichen nach einer Zeichenfolge in Anführungszeichen." #: src/language/data-io/data-parser.c:506 #, c-format msgid "Data for variable %s is not valid as format %s: %s" msgstr "Die Daten für die Variable %s sind im Format %s ungültig: %s" #: src/language/data-io/data-parser.c:536 #, c-format msgid "Partial case of %d of %d records discarded." msgstr "Ein Teil des Falles %d mit %d Einträgen wurde verworfen." #: src/language/data-io/data-parser.c:592 #, c-format msgid "Partial case discarded. The first variable missing was %s." msgstr "" "Ein Teil des Falles wurde verworfen. Die erste fehlende Variable ist %s." #: src/language/data-io/data-parser.c:634 #, c-format msgid "" "Missing value(s) for all variables from %s onward. These will be filled " "with the system-missing value or blanks, as appropriate." msgstr "" "Fehlender Wert oder Werte für alle Variablen ab %s. Diese werden mit system-" "fehlenden Werten oder Leerzeichen aufgefüllt, je nachdem was jeweils " "angebracht erscheint." #: src/language/data-io/data-parser.c:655 msgid "Record ends in data not part of any field." msgstr "Eintrag endet mit Daten nicht nicht Teil eines Feldes sind." #: src/language/data-io/data-parser.c:670 #, c-format msgid "Reading %d record from %s." msgid_plural "Reading %d records from %s." msgstr[0] "%d Eintrag wird von %s gelesen." msgstr[1] "%d Einträge werden von %s gelesen." #: src/language/data-io/data-parser.c:680 src/language/data-io/print.c:435 msgid "Record" msgstr "Datensatz" #: src/language/data-io/data-parser.c:680 src/language/data-io/print.c:435 #: src/ui/gui/psppire-var-sheet-header.c:76 msgid "Columns" msgstr "Spalten" #: src/language/data-io/data-parser.c:680 #: src/language/data-io/data-parser.c:725 src/language/data-io/print.c:435 msgid "Format" msgstr "Format" #: src/language/data-io/data-parser.c:720 #, c-format msgid "Reading free-form data from %s." msgstr "Unformatierte Daten werden aus %s gelesen." #. TRANSLATORS: this fragment will be interpolated into #. messages in fh_lock() that identify types of files. #: src/language/data-io/data-reader.c:136 src/language/data-io/data-writer.c:79 msgid "data file" msgstr "Arbeitsdatei" #: src/language/data-io/data-reader.c:160 #, c-format msgid "Could not open `%s' for reading as a data file: %s." msgstr "`%s' konnte nicht als Datendatei zum Lesen geöffnet werden: %s." #: src/language/data-io/data-reader.c:174 #, c-format msgid "Could not read `%s' as a text file with encoding `%s': %s." msgstr "" "`%s' konnte nicht als Textdatei mit der Kodierung `%s' gelesen werden: %s." #: src/language/data-io/data-reader.c:233 #, c-format msgid "" "Missing %s while reading inline data. This probably indicates a missing or " "incorrectly formatted %s command. %s must appear by itself on a single line " "with exactly one space between words." msgstr "" "Beim Einlesen von Inline-Daten fehlt %s. Dies deutet auf den fehlenden " "oder falsch formatierten Befehl %s hin. %s muss in einer eigenen Zeile mit " "genau einem Leerzeichen zwischen den Wörtern stehen." #: src/language/data-io/data-reader.c:253 #: src/language/data-io/data-reader.c:387 #, c-format msgid "Error reading file %s: %s." msgstr "Fehler beim Lesen der Datei %s: %s." #: src/language/data-io/data-reader.c:261 #, c-format msgid "Unexpected end of file in partial record reading %s." msgstr "" "Unerwartetes Dateiende in einem unvollständigen Eintrag beim Lesen von %s." #: src/language/data-io/data-reader.c:321 #, c-format msgid "Corrupt block descriptor word at offset 0x%lx in %s." msgstr "Fehlerhaftes Blockbeschreibungswort beim Offset 0x%lx in %s." #: src/language/data-io/data-reader.c:322 #, c-format msgid "Corrupt record descriptor word at offset 0x%lx in %s." msgstr "Fehlerhaftes Eintragsbeschreibungswort beim Offset 0x%lx in %s." #: src/language/data-io/data-reader.c:335 #, c-format msgid "Corrupt record size at offset 0x%lx in %s." msgstr "Fehlerhafte Eintragslänge beim Offset 0x%lx in %s." #: src/language/data-io/data-reader.c:493 msgid "Record exceeds remaining block length." msgstr "Der Eintrag übersteigt die verbleibende Blocklänge." #: src/language/data-io/data-reader.c:567 #, c-format msgid "Attempt to read beyond end-of-file on file %s." msgstr "Es wurde versucht in der Datei %s über das Ende hinaus zu lesen." #: src/language/data-io/data-reader.c:570 #, c-format msgid "Attempt to read beyond %s." msgstr "Es wurde versucht über %s hinaus zu lesen." #: src/language/data-io/data-reader.c:733 msgid "" "This command is not valid here since the current input program does not " "access the inline file." msgstr "" "Dieser Befehl ist hier nicht gültig, da das aktuelle Eingabeprogramm keinen " "Zugriff auf die Inline-Datei hat." #: src/language/data-io/data-writer.c:106 #, c-format msgid "An error occurred while opening `%s' for writing as a data file: %s." msgstr "" "Beim Öffnen von `%s' um eine Datendatei zu schreiben, ist ein Fehler " "aufgetreten: %s." #: src/language/data-io/data-writer.c:224 #, c-format msgid "I/O error occurred writing data file `%s'." msgstr "Ein I/O Fehler ist beim Schreiben der Datendatei `%s' aufgetreten." #: src/language/data-io/dataset.c:64 #, c-format msgid "There is no dataset named %s." msgstr "Es gibt keinen Datensatz namens %s." #: src/language/data-io/dataset.c:250 msgid "Datasets" msgstr "Datensätze" #: src/language/data-io/dataset.c:263 msgid "unnamed dataset" msgstr "unbenannter Datensatz" #: src/language/data-io/file-handle.c:61 #, c-format msgid "" "File handle %s is already defined. Use %s before redefining a file handle." msgstr "" "Der Dateiidentifikator %s wurde bereits definiert. Bevor Sie einen " "Dateiidentifikator umdefinieren verwenden Sie bitte %s." #: src/language/data-io/file-handle.c:241 #, c-format msgid "%s must be specified with %s." msgstr "%s erfordert die Angabe von %s." #: src/language/data-io/file-handle.c:252 #, c-format msgid "" "The specified file mode requires LRECL. Assuming %zu-character records." msgstr "" "Der angegebene Dateimodus erfordert LRECL. Es werden Einträge mit %zu " "Zeichen angewendet." #: src/language/data-io/file-handle.c:256 #, c-format msgid "" "Record length (%d) must be between 1 and %lu bytes. Assuming %zu-character " "records." msgstr "" "Die Länge der Einträge (%d) muss zwischen 1 und %lu Bytes liegen. Es wird " "von Einträgen mit einer Länge von %zu Zeichen ausgegangen." #: src/language/data-io/file-handle.c:300 msgid "file" msgstr "Datei" #: src/language/data-io/file-handle.c:302 msgid "inline file" msgstr "Inline-Datei" #: src/language/data-io/file-handle.c:350 msgid "expecting a file name or handle name" msgstr "es wurde ein Dateinname oder ein Identifikator erwartet" #: src/language/data-io/file-handle.c:365 #, c-format msgid "Handle for %s not allowed here." msgstr "Identifikator für %s ist hier nicht erlaubt." #: src/language/data-io/get-data.c:108 src/output/measure.c:262 #, c-format msgid "error reading file `%s'" msgstr "Fehler beim Lesen der Datei `%s'" #: src/language/data-io/get-data.c:127 #, c-format msgid "Unsupported TYPE %s." msgstr "TYPE %s wird nicht unterstützt." #: src/language/data-io/get-data.c:278 msgid "The sheet index must be greater than or equal to 1" msgstr "Die Nummer des Datenblatts muss größer oder gleich 1 sein" #: src/language/data-io/get-data.c:285 src/language/data-io/get-data.c:308 #: src/language/data-io/get-data.c:327 #, c-format msgid "%s must be followed by either \"%s\" or \"%s\"." msgstr "Nach %s muss entweder von \"%s\" oder \"%s\" folgen." #: src/language/data-io/get-data.c:357 #, c-format msgid "" "%s is allowed only with %s arrangement, but %s arrangement was stated or " "implied earlier in this command." msgstr "" "%s ist nur in Verbindung mit /ARRAGEMENT=%s erlaubt, aber es wurde entweder " "explizit oder implizit in diesem Befehl an früherer Stelle festegelegt, " "dass /ARRAGEMENT=%s sein soll." #: src/language/data-io/get-data.c:441 src/language/data-io/get-data.c:479 #, c-format msgid "Value of %s must be 1 or greater." msgstr "Der Wert von %s muss 1 oder mehr betragen." #: src/language/data-io/get-data.c:504 msgid "" "Ignoring obsolete IMPORTCASES subcommand. (N OF CASES or SAMPLE may be used " "to substitute.)" msgstr "" "Der Unterbefehl IMPORTCASES wird ignoriert (ersatzweise können Sie die " "Befehle N OF CASES oder SAMPLE verwenden)." #: src/language/data-io/get-data.c:551 msgid "" "In compatible syntax mode, the QUALIFIER string must contain exactly one " "character." msgstr "" "Im Modus Kompatible Syntax muss der String QUALIFIER genau ein Zeichen " "enthalten." #: src/language/data-io/get-data.c:583 #, c-format msgid "" "The record number specified, %ld, is at or before the previous record, %d. " "Data fields must be listed in order of increasing record number." msgstr "" "Die angegebene Nummer des Eintrags, %ld, liegt beim oder vor dem " "vorhergehenden Eintrag, %d. Datenfelder müssen in aufsteigender Reihenfolge " "aufgelistet werden." #: src/language/data-io/get-data.c:592 #, c-format msgid "" "The record number specified, %ld, exceeds the number of records per case " "specified on FIXCASE, %d." msgstr "" "Die angegebene Nummer des Eintrags, %ld, übersteigt die Anzahl der Einträge " "pro Fall, %d, die mit FIXCASE festgelegt wurde." #: src/language/data-io/get.c:132 #, c-format msgid "%s: Data file dictionary has no variables." msgstr "%s: Im Codebuch der Datei sind keine Variablen verzeichnet." #: src/language/data-io/inpt-pgm.c:133 #, c-format msgid "Unexpected end-of-file within %s." msgstr "Unerwartetes Dateiende innerhalb von %s." #: src/language/data-io/inpt-pgm.c:146 #, c-format msgid "Input program must contain %s or %s." msgstr "INPUT PROGRAM muss %s oder %s enthalten." #: src/language/data-io/inpt-pgm.c:152 msgid "Input program did not create any variables." msgstr "INPUT PROGRAM hat keine Variablen erzeugt." #: src/language/data-io/inpt-pgm.c:365 msgid "" "REREAD: Column numbers must be positive finite numbers. Column set to 1." msgstr "" "REREAD: Die Spaltennummer muss eine positive endliche Zahl sein. " "Spaltennummer wird auf 1 gesetzt." #: src/language/data-io/list.c:100 msgid "Data List" msgstr "Datenliste" #: src/language/data-io/list.c:221 #, c-format msgid "" "The first case (%ld) specified precedes the last case (%ld) specified. The " "values will be swapped." msgstr "" "Der erste angegebene Fall (%ld) liegt vor dem letzten angegebenen Fall " "(%ld). Die Werte werden vertauscht." #: src/language/data-io/list.c:230 #, c-format msgid "" "The first case (%ld) to list is numbered less than 1. The value is being " "reset to 1." msgstr "" "Der erste auzulistende Fall (%ld) ist kleiner als 1. Der Wert wird auf 1 " "gesetzt." #: src/language/data-io/list.c:237 #, c-format msgid "" "The last case (%ld) to list is numbered less than 1. The value is being " "reset to 1." msgstr "" "Der letzte auzulistende Fall (%ld) ist kleiner als 1. Der Wert wird auf 1 " "gesetzt." #: src/language/data-io/list.c:244 #, c-format msgid "The step value %ld is less than 1. The value is being reset to 1." msgstr "Die Schrittgröße %ld ist kleiner als 1. Der Wert wird auf 1 gesetzt." #: src/language/data-io/placement-parser.c:96 #, c-format msgid "" "Number of variables specified (%zu) differs from number of variable formats " "(%zu)." msgstr "" "Die Anzahl der angegebenen Variablen (%zu) stimmt nicht mit der Anzahl der " "Variablenformate (%zu) überein." #: src/language/data-io/placement-parser.c:106 msgid "" "SPSS-like or Fortran-like format specification expected after variable names." msgstr "" "Nach dem Variablennamen wurde ein Format im SPSS- oder FORTRAN-Stil erwartet." #: src/language/data-io/placement-parser.c:129 #, c-format msgid "The %d columns %d-%d can't be evenly divided into %zu fields." msgstr "" "Die %d Spalten %d-%d können nicht gleichmäßig auf %zu Felder verteilt werden." #: src/language/data-io/placement-parser.c:310 msgid "Column positions for fields must be positive." msgstr "Die Spaltenpositionen für die Felder müssen positiv sein." #: src/language/data-io/placement-parser.c:312 msgid "Column positions for fields must not be negative." msgstr "Die Spaltenpositionen für die Felder dürfen nicht negativ sein." #: src/language/data-io/placement-parser.c:372 msgid "The ending column for a field must be greater than the starting column." msgstr "Die Endspalte eines Feldes muss größer als die Anfangsspalte sein." #: src/language/data-io/placement-parser.c:409 #, c-format msgid "" "The record number specified, %.0f, is at or before the previous record, %d. " "Data fields must be listed in order of increasing record number." msgstr "" "Die angegebene Nummer des Eintrags, %.0f, liegt beim oder vor dem " "vorhergehenden Eintrag, %d. Datenfelder müssen in aufsteigender Reihenfolge " "aufgelistet werden." #: src/language/data-io/print-space.c:127 #, c-format msgid "The expression on %s evaluated to the system-missing value." msgstr "Der Ausdruck in %s wurde als system-fehlender Wert ausgewertet." #: src/language/data-io/print-space.c:130 #, c-format msgid "The expression on %s evaluated to %g." msgstr "Der Ausdruck in %s wurde als %g ausgewertet." #: src/language/data-io/print.c:189 src/language/data-io/trim.c:58 msgid "expecting a valid subcommand" msgstr "es wurde ein gültiger Unterbefehl erwartet" #: src/language/data-io/print.c:219 #, c-format msgid "%s is required when binary formats are specified." msgstr "Bei der Angabe von Binärformaten ist %s erforderlich." #: src/language/data-io/print.c:302 #, c-format msgid "Output calls for %d records but %zu specified on RECORDS subcommand." msgstr "" "Die Ausgabe erfordert %d Einträge, es wurden aber mit den Unterbefehl " "RECORDS %zu Einträge angegeben." #: src/language/data-io/print.c:432 msgid "Print Summary" msgstr "Ausgabe der Zusammenfassung" #: src/language/data-io/print.c:462 msgid "N of Records" msgstr "Anz. Datensätze" #: src/language/data-io/matrix-data.c:191 #, c-format msgid "" "There are %d variable declared but the data has at least %d matrix rows." msgstr "" "Es wurden %d Variablen spezifiziert, in den Daten sind aber mindestens %d " "Matrix-Zeilen enthalten." #: src/language/data-io/matrix-data.c:292 msgid "" "The N subcommand was specified, but a N record was also found in the data. " "The N record will be ignored." msgstr "" "Der Unterbefehl N wurde angegeben, aber es wurde auch ein Eintrag für N in " "den Daten gefunden. Der N-Eintrag wird ignoriert." #: src/language/data-io/matrix-data.c:488 src/language/utilities/set.q:186 #, c-format msgid "%s must not be negative." msgstr "%s darf nicht negativ sein." #: src/language/data-io/matrix-data.c:568 msgid "FORMAT = FULL and FORMAT = NODIAGONAL are mutually exclusive." msgstr "FORMAT = FULL und FORMAT = NODIAGONAL schließen sich gegeseitig aus." #: src/language/data-io/matrix-reader.c:102 #: src/language/data-io/matrix-reader.c:118 #, c-format msgid "Matrix dataset lacks a variable called %s." msgstr "Im Matrix-Datensatz fehlt die Variable %s." #: src/language/data-io/matrix-reader.c:109 #: src/language/data-io/matrix-reader.c:125 #, c-format msgid "Matrix dataset variable %s should be of string type." msgstr "Die Variable %s im Matrix-Datensatz sollte vom Typ String sein." #: src/language/data-io/save-translate.c:168 #: src/language/data-io/save-translate.c:183 #, c-format msgid "The %s string must contain exactly one character." msgstr "Der %s String muss genau ein Zeichen enthalten." #: src/language/data-io/save-translate.c:249 #, c-format msgid "Output file `%s' exists but %s was not specified." msgstr "Die Ausgabedatei `%s' existiert, aber %s wurde nicht angegeben." #: src/language/data-io/save.c:309 msgid "The OUTFILE or METADATA subcommand is required." msgstr "Das Unterkommando OUTFILE oder METADATA wird benötigt." #: src/language/data-io/trim.c:69 #, c-format msgid "" "Cannot rename %s as %s because there already exists a variable named %s. To " "rename variables with overlapping names, use a single RENAME subcommand such " "as `/RENAME (A=B)(B=C)(C=A)', or equivalently, `/RENAME (A B C=B C A)'." msgstr "" "%s kann nicht zu %s umbenannt werden, weil eine Variable mit dem Namen %s " "bereits existiert. Um mehrere Variablen mit sich gegenseitig überlappenden " "Namen umzubenennen, verwenden Sie den Unterbefehl RENAME, wie z.B. in `/" "RENAME (A=B)(B=C)(C=A)' oder auch gleichbedeutend in `/RENAME (A B C=B C A)'." #: src/language/data-io/trim.c:227 #, c-format msgid "" "Number of variables on left side of `=' (%zu) does not match number of " "variables on right side (%zu), in parenthesized group %d of RENAME " "subcommand." msgstr "" "Die Anzahl der Variablen auf der linken Seite von `=' (%zu) stimmt nicht mit " "der Anzahl der Variablen auf der rechten Seite (%zu) in der eingeklammerten " "Gruppe %d des Befehls RENAME überein." #: src/language/data-io/trim.c:242 #, c-format msgid "Requested renaming duplicates variable name %s." msgstr "" "Es wurde angefragt, ob der doppelte Variablenname %s umbenannt werden soll." #: src/language/data-io/trim.c:281 msgid "Cannot DROP all variables from dictionary." msgstr "Mit DROP können nicht alle Variablen aus dem Codebuch gelöscht werden." #: src/language/expressions/evaluate.c:151 msgid "expecting number or string" msgstr "es wurde eine Zahl oder eine Zeichenfolge erwartet" #: src/language/expressions/helpers.c:43 msgid "" "One of the arguments to a DATE function is not an integer. The result will " "be system-missing." msgstr "" "Eines der Argumente der Funktion DATE ist nicht vom Typ Integer. Das " "Ergebnis ist system-fehlender Wert." #: src/language/expressions/helpers.c:71 msgid "" "The week argument to DATE.WKYR is not an integer. The result will be system-" "missing." msgstr "" "Das Argument week der Funktion DATE.WKYR ist nicht vom Typ Integer. Das " "Ergebnis ist system-fehlender Wert." #: src/language/expressions/helpers.c:77 msgid "" "The week argument to DATE.WKYR is outside the acceptable range of 1 to 53. " "The result will be system-missing." msgstr "" "Das Argument week der Funktion DATE.WKYR ist nicht innerhalb des " "akzeptierten Bereichs von 1 bis 53. Das Ergebnis ist system-fehlender Wert." #: src/language/expressions/helpers.c:99 msgid "" "The day argument to DATE.YRDAY is not an integer. The result will be system-" "missing." msgstr "" "Das Argument day der Funktion DATE.YRDAY ist nicht vom Typ Integer. Das " "Ergebnis ist system-fehlender Wert." #: src/language/expressions/helpers.c:105 msgid "" "The day argument to DATE.YRDAY is outside the acceptable range of 1 to 366. " "The result will be system-missing." msgstr "" "Das Argument Tag der Funktion DATE.YRDAY ist nicht innerhalb des " "akzeptierten Bereichs von 1 bis 366. Das Ergebnis ist system-fehlender Wert." #: src/language/expressions/helpers.c:127 msgid "" "The year argument to YRMODA is greater than 47516. The result will be " "system-missing." msgstr "" "Das Argument year in YRMODA ist größer als 47516. Das Ergebnis ist system-" "fehlender Wert." #: src/language/expressions/helpers.c:180 #, c-format msgid "" "Unrecognized date unit `%.*s'. Valid date units are `%s', `%s', `%s', `%s', " "`%s', `%s', `%s', and `%s'." msgstr "" "Nicht erkannte Datumsangabe `%.*s'. Gültige Datumsangaben sind `%s', `%s', `" "%s', `%s', `%s', `%s', `%s' und `%s'." #: src/language/expressions/helpers.c:333 #, c-format msgid "Invalid DATESUM method. Valid choices are `%s' and `%s'." msgstr "Ungültige Methode DATESUM. Zur Auswahl stehen `%s' und `%s'." #: src/language/expressions/parse.c:261 #, c-format msgid "" "Type mismatch: expression has %s type, but a numeric value is required here." msgstr "" "Diskrepanz der Typen: der Ausdruck ist vom Typ %s, aber an dieser Stelle ist " "ein numerischer Wert erforderlich." #: src/language/expressions/parse.c:274 #, c-format msgid "" "Type mismatch: expression has %s type, but a string value is required here." msgstr "" "Diskrepanz der Typen: der Ausdruck ist vom Typ %s, aber an dieser Stelle ist " "ein String erforderlich." #: src/language/expressions/parse.c:436 #, c-format msgid "Type mismatch while applying %s operator: cannot convert %s to %s." msgstr "" "Diskrepanz der Typen bei der Anwendung des Operators %s: %s kann nicht zu %s " "umgewandelt werden." #: src/language/expressions/parse.c:650 msgid "" "Chaining relational operators (e.g. `a < b < c') will not produce the " "mathematically expected result. Use the AND logical operator to fix the " "problem (e.g. `a < b AND b < c'). If chaining is really intended, " "parentheses will disable this warning (e.g. `(a < b) < c'.)" msgstr "" "Die Verkettung relationaler Operatoren (z.B. `a < b < c') führt nicht zum " "erwarteten mathematischen Ergebnis. Verwenden Sie den Logikoperator AND, um " "dieses Problem zi beheben (z.B. `a < b AND b < c'). Falls Sie tatsächlich " "eine Verkettung vornehmen wollen, verwenden Sie Klammern, um diese Warnung " "zu unterdrücken (z.B. `(a < b) < c')." #: src/language/expressions/parse.c:752 msgid "" "The exponentiation operator (`**') is left-associative, even though right-" "associative semantics are more useful. That is, `a**b**c' equals " "`(a**b)**c', not as `a**(b**c)'. To disable this warning, insert " "parentheses." msgstr "" "Der Operator für Exponenten (`**') ist immer mit dem linken Argument " "verknüpft, obwohl eine rechts-seitige Verknüpfung praktischer wäre. D.h. der " "Ausdruck `a**b**c' ist gleichbedeutend mit `(a**b)**c', aber nicht mit dem " "Ausdruck `a**(b**c)'. Um diese Warnung zu unterdrücken, fügen Sie die " "passenden Klammern ein." #: src/language/expressions/parse.c:832 #, c-format msgid "Unknown system variable %s." msgstr "Unbekannt Systemvariable %s." #: src/language/expressions/parse.c:880 #, c-format msgid "Unknown identifier %s." msgstr "Unbekannter Bezeichner %s." #: src/language/expressions/parse.c:1102 #, c-format msgid "%s must have at least %d arguments in list." msgstr "%s muss mindestens %d Argumente in der Liste haben." #: src/language/expressions/parse.c:1111 #, c-format msgid "%s must have an even number of arguments in list." msgstr "%s muss eine gerade Anzahl von Argumenten in der Liste haben." #: src/language/expressions/parse.c:1114 #, c-format msgid "%s must have multiple of %d arguments in list." msgstr "%s muss ein Vielfachenes von %d Argumenten in der Liste haben." #: src/language/expressions/parse.c:1124 #, c-format msgid "%s function does not accept a minimum valid argument count." msgstr "" "Für die Funktion %s kann die minimale Anzahl von gültigen Argumenten nicht " "festgelegt werden." #: src/language/expressions/parse.c:1133 #, c-format msgid "%s requires at least %d valid arguments in list." msgstr "%s erfordert mindestens %d gültige Argumente in der Liste." #: src/language/expressions/parse.c:1139 #, c-format msgid "" "With %s, using minimum valid argument count of %d does not make sense when " "passing only %d arguments in list." msgstr "" "Beim der Verwendung von %s ergibt es keinen Sinn die minimale Anzahl von %d " "Argumenten anzugeben, wenn in der Liste nur %d Argumente übergeben werden. " #: src/language/expressions/parse.c:1193 #, c-format msgid "Type mismatch invoking %s as " msgstr "Diskrepanz der Typen beim Aufruf von %s als " #: src/language/expressions/parse.c:1198 msgid "Function invocation " msgstr "Funktionaufruf " #: src/language/expressions/parse.c:1200 msgid " does not match any known function. Candidates are:" msgstr " passt nicht zu einer bekannten Funktion. Mögliche Kandidaten wären:" #: src/language/expressions/parse.c:1230 #, c-format msgid "No function or vector named %s." msgstr "Eine Funktion oder einen Vektor mit dem Namen %s gibt es nicht." #: src/language/expressions/parse.c:1292 #, c-format msgid "%s is a PSPP extension." msgstr "%s ist eine PSPP-Erweiterung." #: src/language/expressions/parse.c:1295 #, c-format msgid "%s is not available in this version of PSPP." msgstr "%s ist in dieser Version von PSPP nicht verfügbar." #: src/language/expressions/parse.c:1302 #, c-format msgid "%s may not appear after %s." msgstr "%s darf nicht nach %s erscheinen." #: src/libpspp/ext-array.c:66 msgid "failed to create temporary file" msgstr "die temporäre Datei konnte nicht erzeugt werden" #: src/libpspp/ext-array.c:106 msgid "seeking in temporary file" msgstr "in der temporären Datei wird gesucht" #: src/libpspp/ext-array.c:125 msgid "reading temporary file" msgstr "die temporäre Datei wird gelesen" #: src/libpspp/ext-array.c:127 msgid "unexpected end of file reading temporary file" msgstr "unerwartetes Ende der Datei beim Lesen der temporären Datei" #: src/libpspp/ext-array.c:147 msgid "writing to temporary file" msgstr "es wird in die temporäre Datei geschrieben" #: src/libpspp/i18n.c:1128 msgid "Arabic" msgstr "Arabisch" #: src/libpspp/i18n.c:1130 msgid "Armenian" msgstr "Armenisch" #: src/libpspp/i18n.c:1131 msgid "Baltic" msgstr "Baltisch" #: src/libpspp/i18n.c:1133 msgid "Celtic" msgstr "Keltisch" #: src/libpspp/i18n.c:1134 msgid "Central European" msgstr "Zentraleuropäisch" #: src/libpspp/i18n.c:1136 msgid "Chinese Simplified" msgstr "Chinesisch, vereinfacht" #: src/libpspp/i18n.c:1138 msgid "Chinese Traditional" msgstr "Chinesisch, traditionell" #: src/libpspp/i18n.c:1140 msgid "Croatian" msgstr "Kroatisch" #: src/libpspp/i18n.c:1141 msgid "Cyrillic" msgstr "Kyrillisch" #: src/libpspp/i18n.c:1143 msgid "Cyrillic/Russian" msgstr "Kyrillisch, Russisch" #: src/libpspp/i18n.c:1144 msgid "Cyrillic/Ukrainian" msgstr "Kyrillisch, Ukrainisch" #: src/libpspp/i18n.c:1146 msgid "Georgian" msgstr "Georgisch" #: src/libpspp/i18n.c:1147 msgid "Greek" msgstr "Griechisch" #: src/libpspp/i18n.c:1148 msgid "Gujarati" msgstr "Gujaratisch" #: src/libpspp/i18n.c:1149 msgid "Gurmukhi" msgstr "Gurmukhi" #: src/libpspp/i18n.c:1150 msgid "Hebrew" msgstr "Hebräisch" #: src/libpspp/i18n.c:1152 msgid "Hebrew Visual" msgstr "Hebräisch, visuell" #: src/libpspp/i18n.c:1153 msgid "Hindi" msgstr "Hindi" #: src/libpspp/i18n.c:1154 msgid "Icelandic" msgstr "Isländisch" #: src/libpspp/i18n.c:1155 msgid "Japanese" msgstr "Japanisch" #: src/libpspp/i18n.c:1157 msgid "Korean" msgstr "Koreanisch" #: src/libpspp/i18n.c:1159 msgid "Nordic" msgstr "Nordisch" #: src/libpspp/i18n.c:1160 msgid "Romanian" msgstr "Rumänisch" #: src/libpspp/i18n.c:1162 msgid "South European" msgstr "Südeuropäisch" #: src/libpspp/i18n.c:1163 msgid "Thai" msgstr "Thailändisch" #: src/libpspp/i18n.c:1165 msgid "Turkish" msgstr "Türkisch" #: src/libpspp/i18n.c:1167 msgid "Vietnamese" msgstr "Vietnamesisch" #: src/libpspp/i18n.c:1169 msgid "Western European" msgstr "Westeuropäisch" #: src/libpspp/message.c:89 #, c-format msgid "%s: %s" msgstr "%s: %s" #: src/libpspp/message.c:113 msgid "error" msgstr "Fehler" #: src/libpspp/message.c:115 msgid "warning" msgstr "Warnung" #: src/libpspp/message.c:118 msgid "note" msgstr "Hinweis" #: src/libpspp/message.c:327 #, c-format msgid "Notes (%d) exceed limit (%d). Suppressing further notes." msgstr "" "Anzahl der Meldungen (%d) hat die Grenze (%d) überschritten. Weitere " "Meldungen werden unterdrückt." #: src/libpspp/message.c:335 #, c-format msgid "Warnings (%d) exceed limit (%d). Syntax processing will be halted." msgstr "" "Anzahl der Warnmeldungen (%d) hat die Grenze (%d) überschritten. " "Verarbeitung der Syntax wird angehalten." #: src/libpspp/message.c:338 #, c-format msgid "Errors (%d) exceed limit (%d). Syntax processing will be halted." msgstr "" "Anzahl der Fehler (%d) hat die Grenze (%d) überschritten. Verarbeitung der " "Syntax wird angehalten." #: src/libpspp/zip-reader.c:202 #, c-format msgid "%s: corrupt archive at 0x%llx: expected %# but got %#" msgstr "" "%s: Fehlerhafte Datei an der Stelle 0x%llx: erwartet %#; gefunden " "%#" #: src/libpspp/zip-reader.c:329 src/libpspp/zip-reader.c:449 #, c-format msgid "%s: open failed (%s)" msgstr "%s: Öffnen ist fehlgeschlagen (%s)" #: src/libpspp/zip-reader.c:344 #, c-format msgid "%s: cannot find central directory" msgstr "%s: Das Hauptverzeichnis konnte nicht gefunden werden" #: src/libpspp/zip-reader.c:353 src/libpspp/zip-reader.c:384 #: src/libpspp/zip-reader.c:468 #, c-format msgid "%s: seek failed (%s)" msgstr "%s: Suche ist fehlgeschlagen (%s)" #: src/libpspp/zip-reader.c:441 #, c-format msgid "%s: unknown member \"%s\"" msgstr "%s: unbekanntes Mitglied \"%s\"" #: src/libpspp/zip-reader.c:503 #, c-format msgid "" "%s: name mismatch between central directory (%s) and local file header (%s)" msgstr "" "%s: Unterschiedliche Namen im Hauptverzeichnis (%s) und im lokalen Dateikopf " "(%s)" #: src/libpspp/zip-reader.c:696 #, c-format msgid "%s: cannot initialize inflator (%s)" msgstr "%s: Der Dekomprimierer konnte nicht initialisiert werden (%s)" #: src/libpspp/zip-reader.c:751 #, c-format msgid "%s: error inflating \"%s\" (%s)" msgstr "%s: Fehler bei der Dekomprimierung \"%s\" (%s)" #: src/libpspp/zip-writer.c:97 utilities/pspp-convert.c:346 #, c-format msgid "%s: error opening output file" msgstr "%s: Fehler beim Öffnen der Ausgabedatei" #: src/libpspp/zip-writer.c:169 #, c-format msgid "%s: error seeking in output file" msgstr "%s: Fehler beim Durchsuchen der Ausgabedatei" #: src/libpspp/zip-writer.c:210 msgid "error creating temporary file" msgstr "Fehler beim Lesen der temporären Datei" #: src/libpspp/zip-writer.c:279 #, c-format msgid "%s: write failed" msgstr "%s: Schreiben ist fehlgeschlagen" #. TRANSLATORS: This is a format string which, when presented to #. printf like functions, will create a pango markup string to #. display real number in scientific notation. #. #. In its untranslated form, it will display similar to "1.23 x 10^4". You #. can leave it untranslated if this is how scientific notation is usually #. presented in your language. #. #. Some locales (such as German) prefer the centered dot rather than the #. multiplication sign between the mantissa an exponent. In which #. case, you can change "#215;" to "#8901;" or other unicode code #. point as appropriate. #. #. The . in this string does not and should not be changed, since #. that is taken care of by the stdc library. #. #. For information on Pango markup, see #. http://developer.gnome.org/pango/stable/PangoMarkupFormat.html #. #. For tables of unicode code points, see http://unicode.org/charts #. #: src/math/chart-geometry.c:123 #, c-format msgid "%%.%dlf×10%d" msgstr "%%.%dlf×10%d" #: src/math/histogram.c:145 msgid "" "Not creating histogram because the data contains less than 2 distinct values" msgstr "" "Ein Histogramm wird nicht erzeugt, weil die Daten weniger als 2 verschiedene " "Wertausprägungen enthalten." #: src/math/percentiles.c:36 msgid "HAverage" msgstr "HAverage" #: src/math/percentiles.c:38 msgid "Rounded" msgstr "Gerundet" #: src/math/percentiles.c:39 msgid "Empirical" msgstr "Empirisch" #: src/math/percentiles.c:40 msgid "Empirical with averaging" msgstr "Empirisch mit Durchschnittsbildung" #: src/math/shapiro-wilk.c:84 msgid "" "One or more weight values are non-integer. Fractional parts will be ignored " "when calculating the Shapiro-Wilk statistic." msgstr "" "Einer oder mehrere Gewichtungsfaktoren sind keine Ganzzahl. Die " "Nachkommastellen werden bei der Berechnung der Shapiro-Wilk Statistik " "ignoriert." #: src/output/ascii.c:340 #, c-format msgid "ascii: opening output file `%s'" msgstr "ASCII: die Ausgabedatei `%s' wird geöffnet" #: src/output/ascii.c:371 #, c-format msgid "%s: %s must be positive integer or `auto'" msgstr "%s: %s muss eine positive ganze Zahl sein oder `auto'" #: src/output/ascii.c:393 #, c-format msgid "" "ascii: page must be at least %d characters wide, but as configured is only " "%d characters" msgstr "" "ASCII: eine Seite muss mindestens %d Zeichen breit sein. Es sind aber nur %d " "Zeichen als Seitenbreite eingestellt" #: src/output/ascii.c:508 #, c-format msgid "See %s for a chart." msgstr "Siehe Diagramm in der Datei %s." #: src/output/charts/piechart.c:54 msgid "*MISSING*" msgstr "*FEHLEND*" #: src/output/csv.c:100 src/output/html.c:117 src/output/journal.c:166 #: src/output/msglog.c:68 #, c-format msgid "error opening output file `%s'" msgstr "Fehler beim Öffnen der Ausgabedatei `%s'" #: src/output/driver.c:522 #, c-format msgid "%s is not a valid device type (the choices are `%s' and `%s')" msgstr "%s ist kein gültiger Gerätetyp (zur Auswahl stehen `%s' und `%s')" #: src/output/driver.c:536 #, c-format msgid "%s: unknown option `%s'" msgstr "%s: unbekannte Option `%s'" #: src/output/driver.c:553 #, c-format msgid "%s: output option missing `='" msgstr "%s: die Ausgabeoption `=' fehlt" #: src/output/driver.c:560 #, c-format msgid "%s: output option specified more than once" msgstr "%s: die Ausgabeoption wurde mehr als einmal angegeben" #: src/output/html.c:129 msgid "PSPP Output" msgstr "PSPP Ausgabe" #: src/output/html.c:266 msgid "No description" msgstr "Keine Beschreibung" #: src/output/journal.c:69 #, c-format msgid "error writing output file `%s'" msgstr "Fehler beim Schreiben der Ausgabedatei `%s'" #: src/output/measure.c:68 #, c-format msgid "`%s' is not a valid length." msgstr "`%s' ist keine gültige Länge." #: src/output/measure.c:96 #, c-format msgid "syntax error in paper size `%s'" msgstr "Syntaxfehler bei der Papiergröße `%s'" #: src/output/measure.c:233 #, c-format msgid "unknown paper type `%.*s'" msgstr "Unbekannter Papiertyp `%.*s'" #: src/output/measure.c:251 #, c-format msgid "error opening input file `%s'" msgstr "Fehler beim Öffnen der Eingabedatei `%s'" #: src/output/measure.c:279 #, c-format msgid "file `%s' does not state a paper size" msgstr "Datei `%s' legt keine Papiergröße fest" #: src/output/options.c:112 #, c-format msgid "%s: `%s' is `%s' but a Boolean value is required" msgstr "%s: `%s' ist `%s', es ist aber ein Boolscher Wert erfoderlich" #: src/output/options.c:187 #, c-format msgid "%s: `%s' is `%s' but one of the following is required: %s" msgstr "%s: `%s' ist `%s', es ist aber einer der folgenden erfoderlich: %s" #: src/output/options.c:231 #, c-format msgid "%s: `%s' is `%s' but a non-negative integer is required" msgstr "" "%s: `%s' ist `%s', es ist aber ein nicht-negativer, ganzzahliger Wert " "erfoderlich" #: src/output/options.c:235 #, c-format msgid "%s: `%s' is `%s' but a positive integer is required" msgstr "" "%s: `%s' ist `%s', es ist aber ein positiver, ganzzahliger Wert erfoderlich" #: src/output/options.c:238 #, c-format msgid "%s: `%s' is `%s' but an integer is required" msgstr "%s: `%s' ist `%s', es ist aber ein ganzzahliger Wert erfoderlich" #: src/output/options.c:241 #, c-format msgid "%s: `%s' is `%s' but an integer greater than %d is required" msgstr "" "%s: `%s' ist `%s', es ist aber ein ganzzahliger Wert größer als %d " "erfoderlich" #: src/output/options.c:246 #, c-format msgid "%s: `%s' is `%s' but an integer between %d and %d is required" msgstr "" "%s: `%s' ist `%s', es ist aber ein ganzzahliger Wert zwischen %d und %d " "erfoderlich" #: src/output/options.c:325 #, c-format msgid "%s: `%s' is `%s' but a file name that contains `#' is required." msgstr "%s: `%s' ist `%s', es ist aber ein Dateiname mit `#' erforderlich." #. TRANSLATORS: Do not translate this string. If the script of your language #. reads from right to left (eg Persian, Arabic, Hebrew etc), then replace #. this string with "output-direction-rtl". Otherwise either leave it #. untranslated or copy it verbatim. #: src/output/render.c:994 msgid "output-direction-ltr" msgstr "output-direction-ltr" #: src/output/text-item.c:44 msgid "Page Title" msgstr "Seitentitel" #: src/output/text-item.c:47 msgid "Title" msgstr "Titel" #: src/output/text-item.c:51 msgid "Log" msgstr "Log" #: src/output/text-item.c:54 msgid "Page Break" msgstr "Seitenumbruch" #: src/output/cairo.c:520 #, c-format msgid "`%s': bad font specification" msgstr "`%s': falsche Angabe der Schriftart" #: src/output/cairo.c:744 #, c-format msgid "" "The defined page is not wide enough to hold at least %d characters in the " "default font. In fact, there's only room for %d characters." msgstr "" "Das angegebene Seitenformat ist nicht groß genug, um in der " "Standardschriftart mindestens %d Zeichen darzustellen. Tatsächlich passen " "nur %d Zeichen auf eine Seite." #: src/output/cairo.c:752 #, c-format msgid "" "The defined page is not long enough to hold at least %d lines in the default " "font. In fact, there's only room for %d lines." msgstr "" "Das angegebene Seitenformat ist nicht groß genug um in der " "Standardschriftart mindestens %d Zeilen darzustellen. Tatsächlich passen " "nur %d Zeilen auf eine Seite." #: src/output/cairo.c:837 #, c-format msgid "error opening output file `%s': %s" msgstr "Fehler beim Öffnen der Ausgabedatei `%s': %s" #: src/output/cairo.c:892 #, c-format msgid "error drawing output for %s driver: %s" msgstr "Fehler beim Zeichnen der Ausgabe für den Treiber %s: %s" #: src/output/cairo.c:2056 #, c-format msgid "error writing output file `%s': %s" msgstr "Fehler beim Schreiben der Ausgabedatei `%s': %s" #: src/output/charts/np-plot-cairo.c:37 #, c-format msgid "Normal Q-Q Plot of %s" msgstr "Normalitäts Q-Q-Plot für %s" #: src/output/charts/np-plot-cairo.c:38 src/output/charts/np-plot-cairo.c:68 msgid "Observed Value" msgstr "Beobachteter Wert" #: src/output/charts/np-plot-cairo.c:39 msgid "Expected Normal" msgstr "Erwartete Normale" #: src/output/charts/np-plot-cairo.c:67 #, c-format msgid "Detrended Normal Q-Q Plot of %s" msgstr "Trendbereinigter Normalitäts Q-Q-Plot für %s" #: src/output/charts/np-plot-cairo.c:69 msgid "Dev from Normal" msgstr "Abweichung von der Normalverteilung" #: src/output/charts/barchart-cairo.c:65 msgid "Bar Chart" msgstr "Balkendiagramm" #: src/output/charts/plot-hist-cairo.c:43 #, c-format msgid "N = %.2f" msgstr "N = %.2f" #: src/output/charts/plot-hist-cairo.c:52 #, c-format msgid "Mean = %.1f" msgstr "Mittelwert = %.1f" #: src/output/charts/plot-hist-cairo.c:61 #, c-format msgid "Std. Dev = %.2f" msgstr "Std.-Abw. = %.2f" #: src/output/charts/plot-hist-cairo.c:110 msgid "HISTOGRAM" msgstr "HISTOGRAMM" #: src/output/charts/roc-chart-cairo.c:36 src/ui/gui/roc.ui:24 msgid "ROC Curve" msgstr "ROC-Kurve" #: src/output/charts/scree-cairo.c:36 msgid "Scree Plot" msgstr "Scree-Plot" #: src/output/charts/scree-cairo.c:38 msgid "Eigenvalue" msgstr "Eigenwert" #: src/output/charts/spreadlevel-cairo.c:37 #, c-format msgid "Spread vs. Level Plot of %s" msgstr "Streubreite gegen mittleres Niveau Diagramm von %s" #: src/output/charts/spreadlevel-cairo.c:38 msgid "Level" msgstr "mittleres Niveau" #: src/output/charts/spreadlevel-cairo.c:39 msgid "Spread" msgstr "Streubreite" #: src/output/charts/scatterplot-cairo.c:57 #, c-format msgid "Scatterplot %s" msgstr "Scatterplot %s" #: src/output/spv/spv-legacy-decoder.c:2222 msgid "Table lacks cell data." msgstr "Die Tabelle enthält keine Zelldaten" #: src/output/spv/spv-writer.c:68 #, c-format msgid "%s: create failed" msgstr "%s: Schreiben ist fehlgeschlagen" #: src/output/spv/spv-writer.c:89 msgid "I/O error writing SPV file" msgstr "Fehler beim Schreiben der SPV Datei" #: src/output/spv/spv.c:693 #, c-format msgid "%s: Failed to create XML parser" msgstr "%s: Fehler beim Initialisieren der XML Verarbeitung" #: src/output/spv/spv.c:718 #, c-format msgid "%s: document is not well-formed" msgstr "%s: Dokument ist nicht richtig formatiert" #: src/output/spv/spv.c:726 #, c-format msgid "%s: root node is \"%s\" but \"%s\" was expected" msgstr "%s: Wurzelknoten ist \"%s\" aber \"%s\" wurde erwartet" #: src/ui/gui/psppire-acr.c:273 msgid "Add" msgstr "Hinzufügen" #: src/ui/gui/psppire-acr.c:274 msgid "Edit" msgstr "Bearbeiten" #: src/ui/gui/psppire-acr.c:275 msgid "Remove" msgstr "Löschen" #: src/ui/gui/psppire-buttonbox.c:311 msgid "OK" msgstr "OK" #: src/ui/gui/psppire-buttonbox.c:319 msgid "Go To" msgstr "Gehe zu" #: src/ui/gui/psppire-buttonbox.c:327 msgid "Continue" msgstr "Weiter" #: src/ui/gui/psppire-buttonbox.c:339 src/ui/gui/psppire-import-assistant.c:759 msgid "Paste" msgstr "Einfügen" #: src/ui/gui/psppire-buttonbox.c:345 #: src/ui/gui/psppire-dialog-action-aggregate.c:216 #: src/ui/gui/psppire-data-window.c:496 src/ui/gui/psppire-data-window.c:624 #: src/ui/gui/psppire-output-window.c:353 #: src/ui/gui/psppire-syntax-window.c:594 src/ui/gui/psppire-window.c:445 #: src/ui/gui/psppire-window.c:628 msgid "Cancel" msgstr "Abbrechen" #: src/ui/gui/psppire-buttonbox.c:351 msgid "Close" msgstr "Schließen" #: src/ui/gui/psppire-buttonbox.c:358 src/ui/gui/psppire-import-assistant.c:760 msgid "Reset" msgstr "Zurücksetzen" #: src/ui/gui/psppire-buttonbox.c:365 msgid "Help" msgstr "Hilfe" #: src/ui/gui/psppire-dialog-action-aggregate.c:213 msgid "Aggregate destination file" msgstr "Zusammenführende Zieldatei" #: src/ui/gui/psppire-dialog-action-aggregate.c:217 #: src/ui/gui/psppire-data-window.c:493 src/ui/gui/psppire-data-window.c:497 #: src/ui/gui/psppire-output-window.c:354 #: src/ui/gui/psppire-syntax-window.c:595 src/ui/gui/psppire-window.c:449 #: src/ui/gui/aggregate.ui:565 msgid "Save" msgstr "Speichern" #: src/ui/gui/psppire-dialog-action-aggregate.c:226 #: src/ui/gui/psppire-data-window.c:503 msgid "System Files (*.sav)" msgstr "PSPP Systemdateien (*.sav)" #: src/ui/gui/psppire-dialog-action-aggregate.c:231 #: src/ui/gui/psppire-data-window.c:508 msgid "Compressed System Files (*.zsav)" msgstr "Komprimierte PSPP Systemdateien (*.zsav)" #: src/ui/gui/psppire-dialog-action-aggregate.c:236 #: src/ui/gui/psppire-data-window.c:513 src/ui/gui/psppire-window.c:652 msgid "Portable Files (*.por) " msgstr "Portable Dateien (*.por) " #: src/ui/gui/psppire-dialog-action-autorecode.c:337 #: src/ui/gui/psppire-dialog-action-recode.c:535 #: src/ui/gui/psppire-dialog-action-recode-different.c:288 msgid "New" msgstr "Neu" #: src/ui/gui/psppire-dialog-action-autorecode.c:351 #: src/ui/gui/psppire-dialog-action-recode.c:527 #: src/ui/gui/psppire-dialog-action-recode-different.c:301 msgid "Old" msgstr "Alt" #: src/ui/gui/psppire-dialog-action-comments.c:142 #, c-format msgid "Column Number: %d" msgstr "Spaltennummer: %d" #: src/ui/gui/psppire-dialog-action-crosstabs.c:71 msgid "Chisq" msgstr "Chi-Quadrat" #: src/ui/gui/psppire-dialog-action-crosstabs.c:71 msgid "" "Pearson chi-square, likelihood ratio, Fisher’s exact test, continuity " "correction, linear-by-linear association." msgstr "" "Pearson Chi-Quadrat, Likelihood Quotient, exakter Test nach Fischer, " "Stetigkeitskorrektur, Zusammenhangstest linear mit linear" #: src/ui/gui/psppire-dialog-action-crosstabs.c:74 #: src/language/stats/crosstabs.q:1334 msgid "Phi" msgstr "Phi" #: src/ui/gui/psppire-dialog-action-crosstabs.c:75 msgid "CC" msgstr "Kontingenzkoeffizient C" #: src/ui/gui/psppire-dialog-action-crosstabs.c:75 msgid "Contingency coefficient" msgstr "Kontingenzkoeffizient" #: src/ui/gui/psppire-dialog-action-crosstabs.c:77 msgid "UC" msgstr "Unsicherheitskoeffizient" #: src/ui/gui/psppire-dialog-action-crosstabs.c:77 msgid "Uncertainty coefficient" msgstr "Unsicherheitskoeffizient" #: src/ui/gui/psppire-dialog-action-crosstabs.c:78 msgid "BTau" msgstr "Tau-b" #: src/ui/gui/psppire-dialog-action-crosstabs.c:78 msgid "Kendall's Tau-b" msgstr "Kendall's Tau-b" #: src/ui/gui/psppire-dialog-action-crosstabs.c:79 msgid "CTau" msgstr "Tau-c" #: src/ui/gui/psppire-dialog-action-crosstabs.c:79 msgid "Kendall's Tau-c" msgstr "Kendall's Tau-c" #: src/ui/gui/psppire-dialog-action-crosstabs.c:80 msgid "Risk" msgstr "Risikoschätzung" #: src/ui/gui/psppire-dialog-action-crosstabs.c:80 msgid "Relative Risk estimate" msgstr "Relative Risikoschätzung" #: src/ui/gui/psppire-dialog-action-crosstabs.c:81 #: src/language/stats/crosstabs.q:1338 msgid "Gamma" msgstr "Gamma" #: src/ui/gui/psppire-dialog-action-crosstabs.c:82 msgid "D" msgstr "Somers-d" #: src/ui/gui/psppire-dialog-action-crosstabs.c:82 msgid "Somer's d" msgstr "Somer's d" #: src/ui/gui/psppire-dialog-action-crosstabs.c:83 #: src/language/stats/crosstabs.q:1344 msgid "Kappa" msgstr "Kappa" #: src/ui/gui/psppire-dialog-action-crosstabs.c:83 msgid "Cohen's Kappa" msgstr "Cohen´s Kappa" #: src/ui/gui/psppire-dialog-action-crosstabs.c:84 #: src/language/stats/crosstabs.q:1429 msgid "Eta" msgstr "Eta" #: src/ui/gui/psppire-dialog-action-crosstabs.c:85 msgid "Corr" msgstr "Korr" #: src/ui/gui/psppire-dialog-action-crosstabs.c:85 msgid "Spearman correlation, Pearson's r" msgstr "Spearman Korrelation, Pearson's r" #: src/ui/gui/psppire-dialog-action-crosstabs.c:90 msgid "Frequency Count" msgstr "Häufigkeit" #: src/ui/gui/psppire-dialog-action-crosstabs.c:91 msgid "Row" msgstr "Zeile" #: src/ui/gui/psppire-dialog-action-crosstabs.c:91 msgid "Row percent" msgstr "Zeile Prozent" #: src/ui/gui/psppire-dialog-action-crosstabs.c:92 msgid "Column" msgstr "Spalte" #: src/ui/gui/psppire-dialog-action-crosstabs.c:92 msgid "Column percent" msgstr "Spalte Prozent" #: src/ui/gui/psppire-dialog-action-crosstabs.c:93 msgid "Total percent" msgstr "Summe Prozent" #: src/ui/gui/psppire-dialog-action-crosstabs.c:94 #: src/language/stats/crosstabs.q:1266 msgid "Expected" msgstr "Erwartet" #: src/ui/gui/psppire-dialog-action-crosstabs.c:94 msgid "Expected value" msgstr "Erwarteter Wert" #: src/ui/gui/psppire-dialog-action-crosstabs.c:96 #: src/language/stats/crosstabs.q:1268 msgid "Std. Residual" msgstr "Std. Residuum" #: src/ui/gui/psppire-dialog-action-crosstabs.c:96 msgid "Standardized Residual" msgstr "Standardisiertes Residuum" #: src/ui/gui/psppire-dialog-action-crosstabs.c:97 msgid "Adjusted Std. Residual" msgstr "Korrigiertes standardisiertes Residuum" #: src/ui/gui/psppire-dialog-action-descriptives.c:45 msgid "Standard error" msgstr "Standardfehler" #: src/ui/gui/psppire-dialog-action-descriptives.c:45 msgid "Standard error of mean" msgstr "Standardfehler des Mittelwerts" #: src/ui/gui/psppire-dialog-action-descriptives.c:47 msgid "Kurtosis and standard error of kurtosis" msgstr "Kurtosis und Standardfehler der Kurtosis" #: src/ui/gui/psppire-dialog-action-descriptives.c:48 msgid "Skewness and standard error of skewness" msgstr "Schiefe und Standardfehler der Schiefe" #: src/ui/gui/psppire-dialog-action-factor.c:323 #, c-format msgid "_Eigenvalues over %4.2f times the mean eigenvalue" msgstr "_Eigenwerte über dem %4.2f fachen des mittleren Eigenwertes" #: src/ui/gui/psppire-dialog-action-frequencies.c:44 msgid "Standard error of the mean" msgstr "Standardfehler des Mittelwerts" #: src/ui/gui/psppire-dialog-action-frequencies.c:47 msgid "Standard error of the skewness" msgstr "Standardfehler der Schiefe" #: src/ui/gui/psppire-dialog-action-frequencies.c:51 msgid "Standard error of the kurtosis" msgstr "Standardfehler der Kurtosis" #: src/ui/gui/psppire-dialog-action-oneway.c:175 #, c-format msgid "Contrast %d of %d" msgstr "Kontraste %d von %d" #: src/ui/gui/psppire-dialog-action-paired.c:162 src/ui/gui/examine.ui:282 #: src/ui/gui/indep-samples.ui:334 src/ui/gui/t-test.ui:296 msgid "O_ptions..." msgstr "_Optionen..." #: src/ui/gui/psppire-dialog-action-paired.c:168 msgid "Paired Samples T Test" msgstr "T-Test bei gepaarten Stichproben" #: src/ui/gui/psppire-dialog-action-recode-different.c:327 msgid "Recode into Different Variables" msgstr "Umkodieren in andere Variable" #: src/ui/gui/psppire-dialog-action-recode-different.c:330 msgid "Recode into Different Variables: Old and New Values " msgstr "Umkodieren in andere Variable: Alte und neue Werte" #: src/ui/gui/psppire-dialog-action-recode-same.c:108 src/ui/gui/recode.ui:391 msgid "Recode into Same Variables" msgstr "Umkodieren in dieselbe Variable " #: src/ui/gui/psppire-dialog-action-recode-same.c:114 msgid "Recode into Same Variables: Old and New Values" msgstr "Umkodieren in dieselbe Variable: Alte und neue Werte" #: src/ui/gui/psppire-dialog-action-regression.c:40 msgid "Coeff" msgstr "Modellkoeffizienten" #: src/ui/gui/psppire-dialog-action-regression.c:40 msgid "Show the regression coefficients" msgstr "Zeige die Regressionskoeffizienten" #: src/ui/gui/psppire-dialog-action-regression.c:41 msgid "Conf. Interval" msgstr "Konfidenzintervall" #: src/ui/gui/psppire-dialog-action-regression.c:41 msgid "Show the confidence interval for the regression coefficients" msgstr "Zeige das Konfidenzintervall der Regressionskoeffizienten" #: src/ui/gui/psppire-dialog-action-regression.c:42 msgid "Show the correlation between observed and predicted values" msgstr "Zeige die Korrelation zwischen beobachteten und vorhergesagten Werten" #: src/ui/gui/psppire-dialog-action-regression.c:43 msgid "Anova" msgstr "ANOVA " #: src/ui/gui/psppire-dialog-action-regression.c:43 msgid "Show the analysis of variance table" msgstr "Zeige die ANOVA Ergebnisse" #: src/ui/gui/psppire-dialog-action-regression.c:44 msgid "Bcov" msgstr "Bcov" #: src/ui/gui/psppire-dialog-action-regression.c:44 msgid "Show the variance coefficient matrix" msgstr "Zeige die Matrix der Varianzkoeffizienten" #: src/ui/gui/psppire-dialog-action-regression.c:45 msgid "Tol" msgstr "Tol" #: src/ui/gui/psppire-dialog-action-regression.c:45 msgid "Show the variance inflation factor and its reciprocal" msgstr "Zeige den Varianzinflationsfaktor und seinen Kehrwert" #: src/ui/gui/psppire-dialog-action-select.c:88 #, c-format msgid "Approximately %3d%% of all cases." msgstr "Ungefähr %3d%% der Fälle." #: src/ui/gui/psppire-dialog-action-select.c:89 #, c-format msgid "Exactly %3d cases from the first %3d cases." msgstr "Exakt %3d Fälle von den ersten %3d Fällen." #: src/ui/gui/psppire-dialog-action-select.c:236 #, c-format msgid "%d thru %d" msgstr "%d bis %d" #: src/ui/gui/psppire-dialog-action-two-sample.c:180 #: src/ui/gui/k-independent.ui:404 src/ui/gui/k-related.ui:197 msgid "Test Type" msgstr "Testtyp" #: src/ui/gui/psppire-dialog-action-two-sample.c:189 msgid "_Wilcoxon" msgstr "_Wilcoxon" #: src/ui/gui/psppire-dialog-action-two-sample.c:190 msgid "_Sign" msgstr "_Sign" #: src/ui/gui/psppire-dialog-action-two-sample.c:191 msgid "_McNemar" msgstr "_McNemar" #: src/ui/gui/psppire-dialog-action-two-sample.c:209 msgid "Two-Related-Samples Tests" msgstr "Tests für zwei verbundene Stichproben" #: src/ui/gui/psppire-dialog-action-weight.c:74 src/ui/gui/weight.ui:83 #: src/ui/gui/weight.ui:211 msgid "Do not weight cases" msgstr "Fälle nicht gewichten" #: src/ui/gui/psppire-dialog-action-weight.c:80 #, c-format msgid "Weight cases by %s" msgstr "Fälle gewichten mit %s" #: src/ui/gui/psppire-dict.c:95 msgid "Var" msgstr "Var" #. TRANSLATORS: This string must be a valid variable name. That means: #. - The string must be at most 64 bytes (not characters) long. #. - The string may not contain whitespace. #. - The first character may not be '$' #. - The first character may not be a digit #. - The final character may not be '.' or '_' #. #: src/ui/gui/psppire-dict.c:385 #, c-format msgid "Var%04d" msgstr "Var%04d" #: src/ui/gui/psppire-dict.c:566 msgid "Duplicate variable name." msgstr "Doppelter Variablenname." #: src/ui/gui/psppire-dictview.c:617 msgid "Prefer variable labels" msgstr "Variablenlabel verwenden" #: src/ui/gui/psppire-dictview.c:631 msgid "Default sort order" msgstr "Voreingestellte Sortierung" #: src/ui/gui/psppire-dictview.c:637 msgid "Unsorted (dictionary order)" msgstr "Unsortiert (Codebuch)" #: src/ui/gui/psppire-dictview.c:642 msgid "Sort by name" msgstr "Sortieren nach Name" #: src/ui/gui/psppire-dictview.c:647 msgid "Sort by label" msgstr "Sortieren nach Label" #: src/ui/gui/psppire-means-layer.c:95 #, c-format msgid "Layer %d of %d" msgstr "Schicht %d von %d" #: src/ui/gui/psppire-means-layer.c:169 msgid "Forward" msgstr "Weiter" #: src/ui/gui/psppire-means-layer.c:170 msgid "Back" msgstr "Zurück" #: src/ui/gui/psppire-text-file.c:55 #, c-format msgid "Could not open `%s'" msgstr "`%s' konnte nicht geöffnet werden" #: src/ui/gui/psppire-text-file.c:71 #, c-format msgid "Error reading `%s': %s" msgstr "Fehler beim Lesen von `%s': %s" #: src/ui/gui/psppire-text-file.c:74 #, c-format msgid "" "Failed to read `%s', because it contains a line over %d bytes long and " "therefore appears not to be a text file." msgstr "" "Fehler beim Einlesen der Datei `%s', weil sie eine Zeile enthält, die über " "%d Bytes lang ist. Dies deutet darauf hin, dass es sich nicht um eine " "Textdatei handelt. " #: src/ui/gui/psppire-text-file.c:96 #, c-format msgid "`%s' is empty." msgstr "`%s' ist leer." #: src/ui/gui/psppire-val-chooser.c:255 msgid "through" msgstr "bis" #: src/ui/gui/psppire-val-chooser.c:288 msgid "_Value:" msgstr "W_ert:" #: src/ui/gui/psppire-val-chooser.c:289 msgid "_System Missing" msgstr "Systemde_finiert fehlend" #: src/ui/gui/psppire-val-chooser.c:290 msgid "System _or User Missing" msgstr "System- _oder benutzerdefinierte fehlende Werte" #: src/ui/gui/psppire-val-chooser.c:291 msgid "_Range:" msgstr "Bereich:" #: src/ui/gui/psppire-val-chooser.c:292 msgid "Range, _LOWEST thru value" msgstr "Bereich, _KLEINSTER bis Wert" #: src/ui/gui/psppire-val-chooser.c:293 msgid "Range, value thru _HIGHEST" msgstr "Bereic_h, Wert bis GRÖSSTER" #: src/ui/gui/psppire-val-chooser.c:294 msgid "_All other values" msgstr "A_lle anderen Werte" #: src/ui/gui/psppire-var-view.c:153 #, c-format msgid "Var%d" msgstr "Variable%d" #: src/ui/source-init-opts.c:72 #, c-format msgid "Algorithm must be either `%s' or `%s'." msgstr "Algorithmus muss entweder `%s' oder `%s' sein." #: src/ui/source-init-opts.c:97 #, c-format msgid "Syntax must be either `%s' or `%s'." msgstr "Syntax mus entweder `%s' oder `%s' sein." #: src/ui/terminal/main.c:144 msgid "Error encountered while ERROR=STOP is effective." msgstr "Ein Fehler wurde gefunden während ERROR = STOP aktiviert war." #: src/ui/terminal/main.c:150 msgid "" "Stopping syntax file processing here to avoid a cascade of dependent command " "failures." msgstr "" "Die Ausführung der Syntaxdatei wird hier abgebrochen, um zu verhindern, dass " "eine Kaskade von fehlgeschlagenen Befehlen entsteht." #: src/ui/terminal/terminal-opts.c:147 #, c-format msgid "" "PSPP, a program for statistical analysis of sampled data.\n" "Usage: %s [OPTION]... FILE...\n" "\n" "Arguments to long options also apply to equivalent short options.\n" "\n" "Output options:\n" " -o, --output=FILE output to FILE, default format from FILE's name\n" " -O format=FORMAT override format for previous -o\n" " -O OPTION=VALUE set output option to customize previous -o\n" " -O device={terminal|listing} override device type for previous -o\n" " -e, --error-file=FILE append errors, warnings, and notes to FILE\n" " --no-output disable default output driver\n" "Supported output formats: %s\n" "\n" "Language options:\n" " -I, --include=DIR append DIR to search path\n" " -I-, --no-include clear search path\n" " -r, --no-statrc disable running rc file at startup\n" " -a, --algorithm={compatible|enhanced}\n" " set to `compatible' if you want output\n" " calculated from broken algorithms\n" " -x, --syntax={compatible|enhanced}\n" " set to `compatible' to disable PSPP extensions\n" " -b, --batch interpret syntax in batch mode\n" " -i, --interactive interpret syntax in interactive mode\n" " --syntax-encoding=ENCODING specify encoding for syntax files\n" " -s, --safer don't allow some unsafe operations\n" "Default search path: %s\n" "\n" "Informative output:\n" " -h, --help display this help and exit\n" " -V, --version output version information and exit\n" "\n" "Non-option arguments are interpreted as syntax files to execute.\n" msgstr "" "PSPP, ein Programm zur statistischen Analyse von Stichproben.\n" "Befehl: %s [OPTIONEN]... DATEI...\n" "\n" "Die gezeigten Argumente für die Langform der Optionen finden auch in der " "entsprechenden Kurzform der Optionen Anwendung.\n" "\n" "Ausgabeoptionen:\n" " -o, --output=DATEI Ausgabe in DATEI, Voreinstellung des " "Dateiformats aus dem Dateinamen\n" " -O format=FORMAT überschreibt das Format aus der vorhergehenden " "Option -o\n" " -O OPTION=WERT setzt die Ausgabeoption um die vorhergehende " "Option -o anzupassen\n" " -O device={terminal|listing} überschreibt den Gerätetyp der " "vorhergehenden Option -o\n" " -e, --error-file=DATEI Fehler, Warnungen und Mitteilungen werden an " "DATEI angehängt\n" " --no-output das voreingerstellte Ausgabegerät wird ausser " "Kraft gesetzt\n" "Unterstützte Ausgabeformate: %s\n" "\n" "Sprachoptionen:\n" " -I, --include=VERZEICHNIS füge das VERZEICHNIS dem Suchpfad hinzu\n" " -I-, --no-include Löschung des Suchpfads\n" " -r, --no-statrc Ausführung der rc-Datei beim Start wird " "deaktiviert\n" " -a, --algorithm={compatible|enhanced}\n" " auf `compatible' setzen, um auch von " "fehlerhaften\n" " Algorithmen Ausgaben erzeugen zu lassen\n" " -x, --syntax={compatible|enhanced}\n" " auf `compatible' setzen, um PSPP-Erweiterungen " "auszuschalten\n" " -b, --batch interpretiere die Syntax im Batch-Modus\n" " -i, --interactive interpretiere die Syntax im interaktiven Modus\n" " --syntax-encoding=KODIERUNG legt die Kodierung der Syntaxdatei fest\n" " -s, --safer unterbindet unsichere Operationen\n" "Voreigestellter Suchpfad: %s\n" "\n" "Information:\n" " -h, --help Anzeige dieses Hilfetextes\n" " -V, --version Anzeige der Versionsinformationen\n" "\n" "Argumente ohne Optionen werden als Syntaxdateien interpretiert und " "ausgeführt.\n" #: src/ui/gui/find-dialog.c:197 msgid "Find" msgstr "Suchen" #: src/ui/gui/find-dialog.c:662 #, c-format msgid "Bad regular expression: %s" msgstr "Ungültiger regulärer Ausdruck: %s" #: src/ui/gui/help-menu.c:70 msgid "A program for the analysis of sampled data" msgstr "Eine Software zur Analyse von statistischen Daten" #. TRANSLATORS: Do not translate this string. Instead, put the names of the people #. who have helped in the translation. #: src/ui/gui/help-menu.c:80 msgid "translator-credits" msgstr "" "Matthias Keil\n" "Olaf Nöhring\n" "Bob Earl" #: src/ui/gui/help-menu.c:170 #, c-format msgid "Help path conversion error: %s" msgstr "Fehler bei der Konvertierung des Hilfe-Pfades: %s" #: src/ui/gui/help-menu.c:197 #, c-format msgid "" "Cannot open via html: %s with uri: %s The PSSP manual is also available at %s" msgstr "" "Das Handbuch kann nicht als html geöffnet werden: %s mit URI: %s . Das PSPP " "Benutzerhandbuch ist auch unter %s verfügbar" #: src/ui/gui/help-menu.c:218 msgid "_Help" msgstr "_Hilfe" #: src/ui/gui/help-menu.c:221 msgid "_About" msgstr "_Über" #: src/ui/gui/help-menu.c:222 msgid "_Reference Manual" msgstr "_Handbuch inkl. Befehlsreferenz" #: src/ui/gui/main.c:306 msgid "Show version information and exit" msgstr "Zeige die Versionsinformation und beende die Anwendung" #: src/ui/gui/main.c:409 msgid "Do not display the splash screen" msgstr "Zeige den Startbildschirm nicht an" #: src/ui/gui/main.c:411 msgid "Do not attempt single instance negotiation" msgstr "Versuche keine Aushandlung einer Single Instance" #: src/ui/gui/missing-val-dialog.c:217 msgid "" "The maximum length of a missing value for a string variable is 8 in UTF-8." msgstr "" "Die maximale Länge eines fehlenden Wertes für eine String-Variable beträgt 8 " "in UTF-8." #: src/ui/gui/missing-val-dialog.c:268 msgid "At least one value must be specified" msgstr "Es muss mindestens ein Wert angegeben werden." #: src/ui/gui/missing-val-dialog.c:298 msgid "Incorrect range specification" msgstr "Ungültige Bereichsspezifikation" #: src/ui/gui/psppire-data-editor.c:380 #, c-format msgid "%d : %s" msgstr "%d: %s" #: src/ui/gui/psppire-data-editor.c:391 #, c-format msgid "%'d case" msgid_plural "%'d cases" msgstr[0] "%'d Fall" msgstr[1] "%'d Fälle" #: src/ui/gui/psppire-data-editor.c:396 #, c-format msgid "%'d variable" msgid_plural "%'d variables" msgstr[0] "%'d Variable" msgstr[1] "%'d Variablen" #: src/ui/gui/psppire-data-editor.c:485 msgid "Case" msgstr "Fall" #: src/ui/gui/psppire-data-editor.c:495 msgid "Data View" msgstr "Datenansicht" #: src/ui/gui/psppire-data-editor.c:505 msgid "Variable View" msgstr "Variablenansicht" #: src/ui/gui/psppire-data-sheet.c:171 src/ui/gui/psppire-data-window.c:1338 msgid "_Insert Case" msgstr "_Fall einfügen" #: src/ui/gui/psppire-data-sheet.c:179 src/ui/gui/psppire-data-window.c:1391 msgid "Cl_ear Cases" msgstr "Fälle lös_chen" #: src/ui/gui/psppire-data-sheet.c:305 src/ui/gui/psppire-data-window.c:1337 #: src/ui/gui/psppire-variable-sheet.c:274 msgid "_Insert Variable" msgstr "Variable _einfügen" #: src/ui/gui/psppire-data-sheet.c:314 src/ui/gui/psppire-variable-sheet.c:283 msgid "Cl_ear Variables" msgstr "Variabl_e löschen" #: src/ui/gui/psppire-data-sheet.c:326 msgid "Sort _Ascending" msgstr "_Aufsteigend" #: src/ui/gui/psppire-data-sheet.c:333 msgid "Sort _Descending" msgstr "A_bsteigend" #: src/ui/gui/psppire-data-window.c:175 msgid "Transformations Pending" msgstr "Offene Transformationen werden ausgeführt" #: src/ui/gui/psppire-data-window.c:191 msgid "Filter off" msgstr "Keine Auswahl" #: src/ui/gui/psppire-data-window.c:203 #, c-format msgid "Filter by %s" msgstr "Ausgewählt nach %s" #: src/ui/gui/psppire-data-window.c:224 msgid "No Split" msgstr "Keine Aufteilung" #: src/ui/gui/psppire-data-window.c:233 msgid "Split by " msgstr "Aufgeteilt nach" #: src/ui/gui/psppire-data-window.c:261 msgid "Weights off" msgstr "Keine Gewichtung" #: src/ui/gui/psppire-data-window.c:273 #, c-format msgid "Weight by %s" msgstr "Gewichtet nach %s" #: src/ui/gui/psppire-data-window.c:518 #: src/ui/gui/psppire-import-assistant.c:681 #: src/ui/gui/psppire-syntax-window.c:607 src/ui/gui/psppire-window.c:669 msgid "All Files" msgstr "Alle Dateien" #: src/ui/gui/psppire-data-window.c:535 msgid "System File" msgstr "PSPP Systemdatei" #: src/ui/gui/psppire-data-window.c:542 msgid "Compressed System File" msgstr "Komprimierte PSPP Systemdatei" #: src/ui/gui/psppire-data-window.c:548 msgid "Portable File" msgstr "Portable Datei" #: src/ui/gui/psppire-data-window.c:551 msgid "Format:" msgstr "Format:" #: src/ui/gui/psppire-data-window.c:615 msgid "Delete Existing Dataset?" msgstr "Vorhandenes Datenblatt löschen?" #: src/ui/gui/psppire-data-window.c:619 #, c-format msgid "" "Renaming \"%s\" to \"%s\" will destroy the existing dataset named \"%s\". " "Are you sure that you want to do this?" msgstr "" "Umbenennen von \"%s\" nach \"%s\" löscht das vorhandene Datenblatt \"%s\". " "Sind Sie sicher, dass Sie das tun wollen?" #: src/ui/gui/psppire-data-window.c:625 msgid "Delete" msgstr "Löschen" #: src/ui/gui/psppire-data-window.c:647 #, c-format msgid "Please enter a new name for dataset \"%s\":" msgstr "Geben sie einen neuen Namen für das Datenblatt \"%s\" ein:" #: src/ui/gui/psppire-data-window.c:649 msgid "Rename Dataset" msgstr "Datenblatt umbenennen" #: src/ui/gui/psppire-data-window.c:1199 src/ui/gui/output-window.ui:68 #: src/ui/gui/syntax-editor.ui:22 msgid "_File" msgstr "_Datei" #: src/ui/gui/psppire-data-window.c:1203 src/ui/gui/syntax-editor.ui:25 msgid "_New" msgstr "_Neu" #: src/ui/gui/psppire-data-window.c:1210 msgid "_Syntax" msgstr "_Syntax" #: src/ui/gui/psppire-data-window.c:1213 src/ui/gui/data-editor.ui:177 #: src/ui/gui/data-editor.ui:189 msgid "_Data" msgstr "_Daten" #: src/ui/gui/psppire-data-window.c:1220 src/ui/gui/syntax-editor.ui:36 msgid "_Open" msgstr "_Öffnen" #: src/ui/gui/psppire-data-window.c:1223 msgid "_Import Data..." msgstr "Daten _importieren..." #: src/ui/gui/psppire-data-window.c:1231 src/ui/gui/logistic.ui:261 #: src/ui/gui/regression.ui:66 msgid "_Save..." msgstr "Speichern..." #: src/ui/gui/psppire-data-window.c:1234 msgid "Save _As..." msgstr "Speichern _unter..." #: src/ui/gui/psppire-data-window.c:1237 msgid "_Rename Dataset..." msgstr "_Datenblatt umbenennen..." #: src/ui/gui/psppire-data-window.c:1248 msgid "_Display Data File Information" msgstr "_Informationen zur Arbeitsdatei anzeigen" #: src/ui/gui/psppire-data-window.c:1255 msgid "Working File" msgstr "Arbeitsdatei" #: src/ui/gui/psppire-data-window.c:1257 msgid "_External File..." msgstr "_Externe Datei..." #: src/ui/gui/psppire-data-window.c:1267 msgid "_Recently Used Data" msgstr "_Zuletzt verwendete Daten" #: src/ui/gui/psppire-data-window.c:1268 msgid "Recently Used _Files" msgstr "Z_uletzt verwendete Dateien" #: src/ui/gui/psppire-data-window.c:1315 src/ui/gui/output-window.ui:82 #: src/ui/gui/syntax-editor.ui:59 msgid "_Quit" msgstr "_Beenden" #: src/ui/gui/psppire-data-window.c:1333 src/ui/gui/output-window.ui:89 #: src/ui/gui/syntax-editor.ui:66 msgid "_Edit" msgstr "_Bearbeiten" #: src/ui/gui/psppire-data-window.c:1339 msgid "_Go To Variable..." msgstr "_Gehe zu Variable..." #: src/ui/gui/psppire-data-window.c:1340 msgid "_Go To Case..." msgstr "Gehe zu _Fall..." #: src/ui/gui/psppire-data-window.c:1364 src/ui/gui/syntax-editor.ui:69 msgid "Cu_t" msgstr "_Ausschneiden" #: src/ui/gui/psppire-data-window.c:1373 src/ui/gui/output-window.ui:96 #: src/ui/gui/syntax-editor.ui:74 msgid "_Copy" msgstr "_Kopieren" #: src/ui/gui/psppire-data-window.c:1380 src/ui/gui/syntax-editor.ui:79 msgid "_Paste" msgstr "_Einfügen" #: src/ui/gui/psppire-data-window.c:1387 msgid "Clear _Variables" msgstr "Variabl_e löschen" #: src/ui/gui/psppire-data-window.c:1401 msgid "_Find..." msgstr "_Suchen..." #: src/ui/gui/psppire-data-window.c:1407 src/ui/gui/logistic.ui:246 msgid "_Options..." msgstr "_Optionen..." #: src/ui/gui/psppire-data-window.c:1676 msgid "Jump to variable" msgstr "Zu Variable springen" #: src/ui/gui/psppire-data-window.c:1689 msgid "Jump to a case in the data sheet" msgstr "Gehe zu Fall" #: src/ui/gui/psppire-data-window.c:1703 msgid "Search for values in the data" msgstr "Suche nach Werten im Datensatz" #: src/ui/gui/psppire-data-window.c:1715 msgid "Create a new case at the current position" msgstr "An der aktuellen Stelle einen neuen Fall einfügen" #: src/ui/gui/psppire-data-window.c:1727 msgid "Create a new variable at the current position" msgstr "An der aktuellen Stelle eine neue Variable einfügen" #: src/ui/gui/psppire-data-window.c:1741 msgid "Split the active dataset" msgstr "Datei aufteilen" #: src/ui/gui/psppire-data-window.c:1753 msgid "Weight cases by variable" msgstr "Fälle anhand einer Variable gewichten" #: src/ui/gui/psppire-data-window.c:1764 msgid "Show/hide value labels" msgstr "Ein- / Ausblenden der Wertelabels" #: src/ui/gui/psppire-data-window.c:1904 msgid "Data Editor" msgstr "Dateneditor" #: src/ui/gui/psppire-encoding-selector.c:140 msgid "Automatically Detect" msgstr "Automatisch bestimmen" #: src/ui/gui/psppire-encoding-selector.c:147 msgid "Locale Encoding" msgstr "Lokale Kodierung" #: src/ui/gui/psppire-encoding-selector.c:177 msgid "Character Encoding: " msgstr "Zeichenkodierung:" #: src/ui/gui/psppire-import-assistant.c:337 msgid "line" msgstr "Zeile" #: src/ui/gui/psppire-import-assistant.c:347 msgid "var" msgstr "var" #: src/ui/gui/psppire-import-assistant.c:560 msgid "Importing Spreadsheet Data" msgstr "Einlesen von Tabellendokumenten" #: src/ui/gui/psppire-import-assistant.c:686 msgid "Text Files" msgstr "Text-Dateien" #: src/ui/gui/psppire-import-assistant.c:691 msgid "Text (*.txt) Files" msgstr "Text-Dateien (*.txt)" #: src/ui/gui/psppire-import-assistant.c:697 msgid "Plain Text (ASCII) Files" msgstr "Text-Dateien (ASCII)" #: src/ui/gui/psppire-import-assistant.c:702 msgid "Comma Separated Value Files" msgstr "Komma-getrennte Datendatei (CVS)" #: src/ui/gui/psppire-import-assistant.c:709 msgid "Tab Separated Value Files" msgstr "Tabulator-getrennte Datendatei" #: src/ui/gui/psppire-import-assistant.c:714 msgid "Gnumeric Spreadsheet Files" msgstr "Gnumeric Tabellendokument" #: src/ui/gui/psppire-import-assistant.c:719 msgid "OpenDocument Spreadsheet Files" msgstr "OpenDocument Tabellendokument" #: src/ui/gui/psppire-import-assistant.c:724 msgid "All Spreadsheet Files" msgstr "Alle Tabellendokumente" #: src/ui/gui/psppire-import-assistant.c:733 msgid "Select File to Import" msgstr "Wählen Sie eine Importdatei" #: src/ui/gui/psppire-import-assistant.c:770 msgid "Importing Delimited Text Data" msgstr "Importieren von Textdaten" #: src/ui/gui/psppire-import-assistant.c:865 msgid "Select the First Line" msgstr "Wählen Sie die erste Zeile aus" #: src/ui/gui/psppire-import-assistant.c:877 msgid "Line" msgstr "Zeile" #: src/ui/gui/psppire-import-assistant.c:931 msgid "" "This assistant will guide you through the process of importing data into " "PSPP from a text file with one line per case, in which fields are separated " "by tabs, commas, or other delimiters.\n" "\n" msgstr "" "Dieser Assistent führt Sie durch den Einlesevorgang von Daten in PSPP, die " "aus einer Textdatei stammen, in der jede Zeile einen Fall darstellt und in " "der Datenfelder durch Tabulatoren, Kommas oder andere Trennzeichen separiert " "sind.\n" "\n" #: src/ui/gui/psppire-import-assistant.c:941 #, c-format msgid "The selected file contains %'lu line of text. " msgid_plural "The selected file contains %'lu lines of text. " msgstr[0] "Die gewählte Datei enthält ungefähr %'lu Textzeile. " msgstr[1] "Die gewählte Datei enthält ungefähr %'lu Textzeilen. " #: src/ui/gui/psppire-import-assistant.c:950 #, c-format msgid "The selected file contains approximately %'lu line of text. " msgid_plural "The selected file contains approximately %'lu lines of text. " msgstr[0] "Die gewählte Datei enthält ungefähr %lu Textzeile. " msgstr[1] "Die gewählte Datei enthält ungefähr %lu Textzeilen. " #: src/ui/gui/psppire-import-assistant.c:956 #, c-format msgid "" "Only the first %zu line of the file will be shown for preview purposes in " "the following screens. " msgid_plural "" "Only the first %zu lines of the file will be shown for preview purposes in " "the following screens. " msgstr[0] "" "Nur die erste Zeile wird in den folgenden Vorschaufenstern gezeigt. " msgstr[1] "" "Nur die ersten %zu Zeilen werden in den folgenden Vorschaufenstern gezeigt. " #: src/ui/gui/psppire-import-assistant.c:965 msgid "You may choose below how much of the file should actually be imported." msgstr "" "Sie können unten wählen, wie viele Zeilen der Datei tatsächlich eingelesen " "werden." #: src/ui/gui/psppire-import-assistant.c:974 #, c-format msgid "Only the first %4d cases" msgstr "Nur die ersten %4d Fälle" #: src/ui/gui/psppire-import-assistant.c:985 #, c-format msgid "Only the first %3d %% of file (approximately)" msgstr "Nur die ersten %3d %% der Datei (schätzungsweise)" #: src/ui/gui/psppire-import-assistant.c:1009 msgid "Select the Lines to Import" msgstr "Wählen Sie die zu importierenden Zeilen aus" #: src/ui/gui/psppire-import-assistant.c:1151 msgid "Choose Separators" msgstr "Trennzeichen auswählen" #: src/ui/gui/psppire-import-assistant.c:1438 msgid "Adjust Variable Formats" msgstr "Einstellen des Variablenformates" #: src/ui/gui/psppire-output-view.c:410 msgid "Message" msgstr "Nachricht" #: src/ui/gui/psppire-output-view.c:543 msgid "failed to create temporary directory during clipboard operation" msgstr "" "Erstellung eines temporären Verzeichnisses während einer Operation der " "Zwischenablage fehlgeschlagen" #: src/ui/gui/psppire-output-window.c:241 msgid "Infer file type from extension" msgstr "Dateityp aus Dateiendung bestimmen" #: src/ui/gui/psppire-output-window.c:242 msgid "SPSS Viewer (*.spv)" msgstr "SPSS Viewer (*.spv)" #: src/ui/gui/psppire-output-window.c:243 msgid "PDF (*.pdf)" msgstr "PDF (*.pdf)" #: src/ui/gui/psppire-output-window.c:244 msgid "HTML (*.html)" msgstr "HTML (*.html)" #: src/ui/gui/psppire-output-window.c:245 msgid "OpenDocument (*.odt)" msgstr "OpenDocument (*.odt)" #: src/ui/gui/psppire-output-window.c:246 msgid "Text (*.txt)" msgstr "Text (*.txt)" #: src/ui/gui/psppire-output-window.c:247 msgid "Text [plain] (*.txt)" msgstr "Text [ohne Formatierung] (*.txt)" #: src/ui/gui/psppire-output-window.c:248 msgid "PostScript (*.ps)" msgstr "PostScript (*.ps)" #: src/ui/gui/psppire-output-window.c:249 msgid "Comma-Separated Values (*.csv)" msgstr "CSV Datei (*.csv)" #: src/ui/gui/psppire-output-window.c:350 msgid "Export Output" msgstr "Ausgabe exportieren" #: src/ui/gui/psppire-output-window.c:548 msgid "Output Viewer" msgstr "Ausgabeanzeige" #: src/ui/gui/psppire-spreadsheet-model.c:237 msgid "(empty)" msgstr "(leer)" #: src/ui/gui/psppire-syntax-window.c:226 msgid "Text Search" msgstr "Textsuche" #: src/ui/gui/psppire-syntax-window.c:229 msgid "_OK" msgstr "_OK" #: src/ui/gui/psppire-syntax-window.c:231 msgid "_Cancel" msgstr "_Abbrechen" #: src/ui/gui/psppire-syntax-window.c:239 msgid "Text to search for:" msgstr "Suchtext:" #: src/ui/gui/psppire-syntax-window.c:570 #, c-format msgid "Saved file `%s'" msgstr "Gepeicherte Datei `%s'" #: src/ui/gui/psppire-syntax-window.c:591 msgid "Save Syntax" msgstr "Syntax speichern" #: src/ui/gui/psppire-syntax-window.c:601 src/ui/gui/psppire-window.c:657 msgid "Syntax Files (*.sps) " msgstr "Syntax Dateien (*.sps) " #: src/ui/gui/psppire-syntax-window.c:970 msgid "Syntax Editor" msgstr "Syntax Editor" #: src/ui/gui/psppire-syntax-window.c:990 #, c-format msgid "Cannot load syntax file `%s'" msgstr "Die Syntax-Datei `%s' kann nicht geladen werden" #: src/ui/gui/psppire-variable-sheet.c:412 #, c-format msgid "{%s, %s}..." msgstr "{%s,%s}..." #: src/ui/gui/psppire-var-sheet-header.c:64 msgid "Decimal" msgstr "Dezimalstellen" #: src/ui/gui/psppire-var-sheet-header.c:79 msgid "Align" msgstr "Ausrichtung" #: src/ui/gui/psppire-var-sheet-header.c:82 msgid "Measure" msgstr "Messniveau" #: src/ui/gui/psppire-window.c:430 #, c-format msgid "Save the changes to `%s' before closing?" msgstr "Änderungen an `%s' vor dem Schließen speichern?" #: src/ui/gui/psppire-window.c:437 #, c-format msgid "" "If you don't save, changes from the last %ld seconds will be permanently " "lost." msgstr "" "Falls Sie nicht speichern, gehen die Änderungen der letzten %ld Sekunden " "dauerhaft verloren." #: src/ui/gui/psppire-window.c:441 msgid "Close _without saving" msgstr "Schließen _ohne Speichern" #: src/ui/gui/psppire-window.c:625 src/ui/gui/psppire-window.c:629 msgid "Open" msgstr "Öffnen" #: src/ui/gui/psppire-window.c:634 msgid "Data and Syntax Files" msgstr "Daten- und Syntaxdateien" #: src/ui/gui/psppire-window.c:646 msgid "System Files (*.sav, *.zsav)" msgstr "PSPP Systemdateien (*.sav, *.zsav)" #: src/ui/gui/psppire-window.c:663 msgid "Output Files (*.spv) " msgstr "Ausgabedateien (*.spv) " #: src/ui/gui/t-test-options.c:65 #, c-format msgid "Con_fidence Interval: %2d %%" msgstr "_Konfidenzintervall: %2d %%" #: src/ui/gui/val-labs-dialog.c:591 #, c-format msgid "%s = `%s'" msgstr "%s = `%s'" #: src/ui/gui/var-type-dialog.c:541 msgid "Variable Type and Format" msgstr "Variablentyp und -format" #: src/ui/gui/windows-menu.c:92 msgid "_Minimize all Windows" msgstr "Alle Fenster _minimieren" #: src/ui/gui/windows-menu.c:100 msgid "_Split" msgstr "Au_fteilen" #: src/ui/gui/windows-menu.c:132 msgid "_Windows" msgstr "_Fenster" #: utilities/pspp-convert.c:67 #, c-format msgid "%s argument must be a single character" msgstr "%s Argument muss ein einzelner Buchstabe sein" #: utilities/pspp-convert.c:265 msgid "exactly two non-option arguments are required; use --help for help" msgstr "" "es sind genau zwei Argumente ohne Optionen erforderlich; verwenden Sie --" "help um Hilfe zu erhalten" #: utilities/pspp-convert.c:276 #, c-format msgid "%s: cannot guess output format (use -O option)" msgstr "" "%s: das Ausgabeformat wurde nicht erkannt (verwenden Sie die Option -O)" #: utilities/pspp-convert.c:341 #, c-format msgid "%s: unknown output format (use -O option)" msgstr "%s: unbekanntes Ausgabeformat (verwenden Sie die Option -O)" #: utilities/pspp-convert.c:360 #, c-format msgid "%s: error reading input file" msgstr "%s: Fehler beim Lesen der Datei" #: utilities/pspp-convert.c:362 #, c-format msgid "%s: error writing output file" msgstr "%s: Fehler beim Schreiben der Datei" #: utilities/pspp-convert.c:409 #, c-format msgid "%s: error opening password file" msgstr "%s: Fehler beim Öffnen der Passwortdatei" #: utilities/pspp-convert.c:425 #, c-format msgid "" "\n" "%s: password not in file" msgstr "" "\n" "%s: In der Datei befindet sich kein Passwort" #: utilities/pspp-convert.c:462 #, c-format msgid "%s: '%c' is not in alphabet" msgstr "%s: `%c' ist nicht im Alphabet" #: utilities/pspp-convert.c:526 msgid "sorry, wrong password" msgstr "Passwort ist leider falsch" #: utilities/pspp-output.c:92 #, c-format msgid "%s and %s:" msgstr "%s und %s:" #: utilities/pspp-output.c:547 #, c-format msgid "%s: invalid XPath expression" msgstr "%s: ungültiger XPath Ausdruck" #: utilities/pspp-output.c:716 msgid "missing command name (use --help for help)" msgstr "Fehlender Befehlsname (--help für Hilfe)" #: utilities/pspp-output.c:720 #, c-format msgid "unknown command \"%s\" (use --help for help)" msgstr "Unbekannter Befehl \"%s\" (--help für Hilfe)" #: utilities/pspp-output.c:728 #, fuzzy, c-format #| msgid "\"%s\" command takes exactly %d argument%s" msgid "\"%s\" command takes exactly %d argument" msgid_plural "\"%s\" command takes exactly %d arguments" msgstr[0] "\"%s\" Befehl benötigt genau %d Argumente%s" msgstr[1] "\"%s\" Befehl benötigt genau %d Argumente%s" #: utilities/pspp-output.c:735 #, fuzzy, c-format #| msgid "\"%s\" command requires at least %d argument%s" msgid "\"%s\" command requires at least %d argument" msgid_plural "\"%s\" command requires at least %d arguments" msgstr[0] "Das Kommando \"%s\" erfordert mindestens %d gültige Argumente%s" msgstr[1] "Das Kommando \"%s\" erfordert mindestens %d gültige Argumente%s" #: utilities/pspp-output.c:742 #, c-format msgid "\"%s\" command requires between %d and %d arguments" msgstr "Das Kommando \"%s\" erfordert zwischen %d und %d Argumente" #: utilities/pspp-output.c:782 msgid "The following object classes are supported:" msgstr "Die folgenden Objektklassen werden unterstützt:" #: utilities/pspp-output.c:791 #, c-format msgid "%s: unknown object class (use --select=help for help" msgstr "%s: unbekannte Objektklasse (--select=help für Hilfe)" #: src/language/utilities/set.q:162 #, c-format msgid "%s must be between 0 and 20." msgstr "%s muss zwischen 0 und 20 liegen." #: src/language/utilities/set.q:172 src/language/utilities/set.q:179 #, c-format msgid "%s must be at least 1." msgstr "%s muss mindestens 1 sein." #: src/language/utilities/set.q:205 #, c-format msgid "%s must be at least 1MB" msgstr "%s muss mindestens 1MB sein" #: src/language/utilities/set.q:207 #, c-format msgid "%s must be positive" msgstr "%s muss positiv sein" #: src/language/utilities/set.q:213 src/language/utilities/set.q:215 #: src/language/utilities/set.q:217 src/language/utilities/set.q:219 #: src/language/utilities/set.q:221 src/language/utilities/set.q:223 #: src/language/utilities/set.q:225 src/language/utilities/set.q:227 #: src/language/utilities/set.q:229 src/language/utilities/set.q:231 #: src/language/utilities/set.q:233 #, c-format msgid "%s is obsolete." msgstr "%s ist obsolet" #: src/language/utilities/set.q:239 msgid "Active file compression is not implemented." msgstr "Aktive Komprimierung von Dateien ist nicht implementiert." #: src/language/utilities/set.q:403 #, c-format msgid "%s must be 1500 or later." msgstr "%s muss mindestens 1500 oder später sein." #: src/language/utilities/set.q:410 #, c-format msgid "expecting %s or year" msgstr "erwarte %s oder eine Jahreszahl" #: src/language/utilities/set.q:438 src/language/utilities/set.q:535 #, c-format msgid "%s must be at least %d." msgstr "%s muss mindestens %d sein." #: src/language/utilities/set.q:474 #, c-format msgid "%s is not a recognized encoding or locale name" msgstr "%s ist keine bekannte Enkodierung oder lokale Kodierung" #: src/language/utilities/set.q:562 #, c-format msgid "" "%s requires numeric output format as an argument. Specified format %s is of " "type string." msgstr "" "%s erfordert ein numerisches Ausgabeformat als Argument. Das angegebene " "Format %s ist vom Typ String." #: src/language/utilities/set.q:791 msgid "ISL (32-bit IEEE 754 single, little-endian)" msgstr "ISL (32-bit IEEE 754 single, little-endian)" #: src/language/utilities/set.q:794 msgid "ISB (32-bit IEEE 754 single, big-endian)" msgstr "ISB (32-bit IEEE 754 single, big-endian)" #: src/language/utilities/set.q:797 msgid "IDL (64-bit IEEE 754 double, little-endian)" msgstr "IDL (64-bit IEEE 754 double, little-endian)" #: src/language/utilities/set.q:800 msgid "IDB (64-bit IEEE 754 double, big-endian)" msgstr "IDB (64-bit IEEE 754 double, big-endian)" #: src/language/utilities/set.q:804 msgid "VF (32-bit VAX F, VAX-endian)" msgstr "VF (32-bit VAX F, VAX-endian)" #: src/language/utilities/set.q:807 msgid "VD (64-bit VAX D, VAX-endian)" msgstr "VD (64-bit VAX D, VAX-endian)" #: src/language/utilities/set.q:810 msgid "VG (64-bit VAX G, VAX-endian)" msgstr "VG (64-bit VAX G, VAX-endian)" #: src/language/utilities/set.q:814 msgid "ZS (32-bit IBM Z hexadecimal short, big-endian)" msgstr "ZS (32-bit IBM Z hexadecimal short, big-endian)" #: src/language/utilities/set.q:817 msgid "ZL (64-bit IBM Z hexadecimal long, big-endian)" msgstr "ZL (64-bit IBM Z hexadecimal long, big-endian)" #: src/language/utilities/set.q:985 #, c-format msgid "%s is %s." msgstr "%s ist %s." #: src/language/utilities/set.q:1089 #, c-format msgid "" "Too many %s commands without a %s: at most %d levels of saved settings are " "allowed." msgstr "" "Der Befehl %s wurde zu häufig ohne %s verwendet: Es sind höchstens %d Ebenen " "von Einstellungsspeicherungen erlaubt." #: src/language/utilities/set.q:1109 #, c-format msgid "%s without matching %s." msgstr "%s ohne zugehöriges %s." #: src/language/stats/crosstabs.q:327 #, c-format msgid "Missing mode %s not allowed in general mode. Assuming %s." msgstr "" "Die Behandlungsoption %s für fehlende Werte ist im normalen Modus (general " "mode) nicht erlaubt. Es wird %s verwendet." #: src/language/stats/crosstabs.q:444 msgid "Too many cross-tabulation variables or dimensions." msgstr "Zu viele Variablen oder Dimensionen in der Kreuztabelle." #: src/language/stats/crosstabs.q:509 #, c-format msgid "%s must be specified before %s." msgstr "%s muss vor %s angegeben werden." #: src/language/stats/crosstabs.q:543 #, c-format msgid "Maximum value (%ld) less than minimum value (%ld)." msgstr "Maximalwert (%ld) kleiner als Minimalwert (%ld)." #: src/language/stats/crosstabs.q:922 msgid "Summary" msgstr "Zusammenfassung" #: src/language/stats/crosstabs.q:935 msgid "Crosstabulation" msgstr "Kreuztabelle" #. TRANSLATORS: The %s here describes a crosstabulation. It takes the #. form "var1 * var2 * var3 * ...". #: src/language/stats/crosstabs.q:1013 #, c-format msgid "Crosstabulation %s contained no non-missing cases." msgstr "Kreuztabelle %s enthält keine nicht-fehlenden Werte." #: src/language/stats/crosstabs.q:1204 msgid "Missing value" msgstr "Fehlender Wert" #: src/language/stats/crosstabs.q:1263 msgid "Row %" msgstr "Zeile %" #: src/language/stats/crosstabs.q:1264 msgid "Column %" msgstr "Spalte %" #: src/language/stats/crosstabs.q:1265 msgid "Total %" msgstr "Gesamt %" #: src/language/stats/crosstabs.q:1269 msgid "Adjusted Residual" msgstr "Korrigiertes Residuum" #: src/language/stats/crosstabs.q:1288 msgid "Chi-Square Tests" msgstr "Chi-Quadrat Tests" #: src/language/stats/crosstabs.q:1294 msgid "Pearson Chi-Square" msgstr "Pearson Chi-Quadrat" #: src/language/stats/crosstabs.q:1295 msgid "Likelihood Ratio" msgstr "Likelihood-Quotient" #: src/language/stats/crosstabs.q:1296 msgid "Fisher's Exact Test" msgstr "Exakter Test nach Fisher" #: src/language/stats/crosstabs.q:1297 msgid "Continuity Correction" msgstr "Kontinuitätskorrektur" #: src/language/stats/crosstabs.q:1298 msgid "Linear-by-Linear Association" msgstr "Zusammenhangstest linear-mit-linear" #: src/language/stats/crosstabs.q:1299 src/language/stats/crosstabs.q:1345 #: src/language/stats/crosstabs.q:1854 msgid "N of Valid Cases" msgstr "N der gültigen Fälle" #: src/language/stats/crosstabs.q:1305 msgid "Asymptotic Sig. (2-tailed)" msgstr "Asymptotische Sig. (2-seitig)" #: src/language/stats/crosstabs.q:1319 msgid "Symmetric Measures" msgstr "Symmetrische Zusammenhangsmaße" #: src/language/stats/crosstabs.q:1324 src/language/stats/crosstabs.q:1364 #: src/language/stats/crosstabs.q:1411 msgid "Values" msgstr "Wertelabel" #: src/language/stats/crosstabs.q:1326 src/language/stats/crosstabs.q:1413 msgid "Asymp. Std. Error" msgstr "Asymp. Std.-Fehler" #: src/language/stats/crosstabs.q:1327 src/language/stats/crosstabs.q:1414 msgid "Approx. T" msgstr "Näherungsweises T" #: src/language/stats/crosstabs.q:1328 src/language/stats/crosstabs.q:1415 msgid "Approx. Sig." msgstr "Näherungsweise Signifikanz" #: src/language/stats/crosstabs.q:1333 src/language/stats/crosstabs.q:1420 msgid "Nominal by Nominal" msgstr "Nominal zu Nominal" #: src/language/stats/crosstabs.q:1334 msgid "Cramer's V" msgstr "Cramer's V" #: src/language/stats/crosstabs.q:1334 msgid "Contingency Coefficient" msgstr "Kontingenz Koeffizient" #: src/language/stats/crosstabs.q:1336 src/language/stats/crosstabs.q:1425 msgid "Ordinal by Ordinal" msgstr "Ordinal zu Ordinal" #: src/language/stats/crosstabs.q:1337 msgid "Kendall's tau-b" msgstr "Kendall's tau-b" #: src/language/stats/crosstabs.q:1337 msgid "Kendall's tau-c" msgstr "Kendall's tau-c" #: src/language/stats/crosstabs.q:1338 msgid "Spearman Correlation" msgstr "Spearman Korrelation" #: src/language/stats/crosstabs.q:1340 msgid "Interval by Interval" msgstr "Interval zu Interval" #: src/language/stats/crosstabs.q:1341 msgid "Pearson's R" msgstr "Pearson's R" #: src/language/stats/crosstabs.q:1343 msgid "Measure of Agreement" msgstr "Übereinstimmungsmaß" #: src/language/stats/crosstabs.q:1359 msgid "Risk Estimate" msgstr "Risikoschätzung" #: src/language/stats/crosstabs.q:1368 #, no-c-format msgid "95% Confidence Interval" msgstr "95% Konfidenzintervall" #: src/language/stats/crosstabs.q:1389 msgid "Symmetric" msgstr "Symmetrisch" #: src/language/stats/crosstabs.q:1391 src/language/stats/crosstabs.q:1396 #, c-format msgid "%s Dependent" msgstr "%s Abhängig" #: src/language/stats/crosstabs.q:1406 msgid "Directional Measures" msgstr "Gerichtete Maße" #: src/language/stats/crosstabs.q:1422 msgid "Goodman and Kruskal tau" msgstr "Goodman und Kruskal tau" #: src/language/stats/crosstabs.q:1423 msgid "Uncertainty Coefficient" msgstr "Unsicherheitskoeffizient" #: src/language/stats/crosstabs.q:1426 msgid "Somers' d" msgstr "Somers' d" #: src/language/stats/crosstabs.q:1428 msgid "Nominal by Interval" msgstr "Nominal zu Interval" #: src/language/stats/crosstabs.q:1826 #, c-format msgid "Odds Ratio for %s" msgstr "Quotenverhältnis für %s" #: src/language/stats/crosstabs.q:1835 #, c-format msgid "For cohort %s = " msgstr "Für Kohorte %s = " #: src/ui/gui/aggregate.ui:24 msgid "Aggregate Data" msgstr "Daten aggregieren" #: src/ui/gui/aggregate.ui:126 msgid "_Break variable(s)" msgstr "Break-_Variable(n)" #: src/ui/gui/aggregate.ui:179 msgid "Variable Name: " msgstr "Variablenname:" #: src/ui/gui/aggregate.ui:215 msgid "Variable Label: " msgstr "Variablenlabel:" #: src/ui/gui/aggregate.ui:252 msgid "Function: " msgstr "Funktion:" #: src/ui/gui/aggregate.ui:327 msgid "Argument 1: " msgstr "Argument 1: " #: src/ui/gui/aggregate.ui:364 msgid "Argument 2: " msgstr "Argument 2: " #: src/ui/gui/aggregate.ui:428 msgid "Aggregated variables" msgstr "Aggregierte Variablen" #: src/ui/gui/aggregate.ui:469 msgid "_Add aggregated variables to the active dataset" msgstr "Agg_regierte Variablen zum aktiven Datenblatt hinzufügen" #: src/ui/gui/aggregate.ui:486 msgid "_Replace the current dataset with the aggregated variables" msgstr "_Ersetze das aktuelle Datenblatt mit aggregierten Variablen" #: src/ui/gui/aggregate.ui:504 msgid "_Write a new data file containing only the aggregated variables" msgstr "" "_Neue Arbeitsdatei erstellen, die nur die aggregierten Variablen enthält" #: src/ui/gui/aggregate.ui:544 msgid "label" msgstr "Label" #: src/ui/gui/aggregate.ui:593 msgid "File is _already sorted on break variable(s)" msgstr "Die Datei ist bereits anhand der Break-Variable(n) sortiert" #: src/ui/gui/aggregate.ui:609 msgid "Sort file before a_ggregating" msgstr "Datei vor A_ggregierung sortieren" #: src/ui/gui/aggregate.ui:630 msgid "Options for very large datasets" msgstr "Optionen für sehr große Datenblätter" #: src/ui/gui/autorecode.ui:24 msgid "Automatic Recode" msgstr "Automatisches Umkodieren" #: src/ui/gui/autorecode.ui:120 msgid "Variable -> New Name" msgstr "Variable -> Neuer Name" #: src/ui/gui/autorecode.ui:145 msgid "_Lowest value" msgstr "_Kleinstem Wert" #: src/ui/gui/autorecode.ui:163 msgid "_Highest value" msgstr "_Größtem Wert" #: src/ui/gui/autorecode.ui:185 msgid "Recode starting from" msgstr "Umkodieren beginnen beim" #: src/ui/gui/autorecode.ui:204 msgid "_New Name" msgstr "_Neuer Name" #: src/ui/gui/autorecode.ui:227 msgid "_Add New Name" msgstr "Neuen Namen _hinzufügen" #: src/ui/gui/autorecode.ui:285 msgid "_Use the same recoding scheme for all variables" msgstr "_Dasselbe Umkodierungsschema für alle Variablen verwenden" #: src/ui/gui/autorecode.ui:301 msgid "Treat _blank string values as missing" msgstr "_Leere Strings als benutzerdefiniert fehlend markieren" #: src/ui/gui/binomial.ui:86 msgid "_Test Variable List:" msgstr "Test_variablen:" #: src/ui/gui/binomial.ui:160 src/ui/gui/chi-square.ui:281 msgid "_Get from data" msgstr "Aus _den Daten ermitteln" #: src/ui/gui/binomial.ui:181 src/ui/gui/indep-samples.ui:150 msgid "_Cut point:" msgstr "_Trennwert:" #: src/ui/gui/binomial.ui:225 msgid "Define Dichotomy" msgstr "Dichotomie definieren" #: src/ui/gui/binomial.ui:245 msgid "Test _Proportion:" msgstr "T_estanteil:" #: src/ui/gui/compute.ui:32 msgid "Compute Variable: Type and Label" msgstr "Variable berechnen: Typ und Label" #: src/ui/gui/compute.ui:67 msgid "Use _expression as label" msgstr "_Ausdruck als Label verwenden" #: src/ui/gui/compute.ui:90 msgid "_Label:" msgstr "_Beschriftung:" #: src/ui/gui/compute.ui:194 msgid "_String" msgstr "_String" #: src/ui/gui/compute.ui:287 msgid "_Numeric" msgstr "_Numerisch" #: src/ui/gui/compute.ui:343 msgid "Compute Variable" msgstr "Variable berechnen" #: src/ui/gui/compute.ui:381 msgid "Target _Variable:" msgstr "Ziel_variable:" #: src/ui/gui/compute.ui:412 msgid "_Type & Label..." msgstr "Typ & _Label..." #: src/ui/gui/compute.ui:469 msgid "=" msgstr "=" #: src/ui/gui/compute.ui:526 msgid "_Numeric Expressions:" msgstr "Numerischer _Ausdruck:" #: src/ui/gui/compute.ui:598 msgid "_Functions:" msgstr "_Funktionen:" #: src/ui/gui/compute.ui:678 msgid "_If..." msgstr "F_alls..." #: src/ui/gui/barchart.ui:24 msgid "Barchart" msgstr "Balkendiagramm" #: src/ui/gui/barchart.ui:112 msgid "Category A_xis:" msgstr "Kategorien A_chse:" #: src/ui/gui/barchart.ui:140 msgid "_N of cases" msgstr "_Anzahl der Fälle" #: src/ui/gui/barchart.ui:158 msgid "_Cum. n of cases" msgstr "_Kum. Anzahl der Fälle" #: src/ui/gui/barchart.ui:174 msgid "Other _summary function" msgstr "Andere _Statistik" #: src/ui/gui/barchart.ui:191 msgid "% of c_ases" msgstr "% der _Fälle" #: src/ui/gui/barchart.ui:207 msgid "C_um. % of cases" msgstr "K_um. % der Fälle" #: src/ui/gui/barchart.ui:270 src/ui/gui/histogram.ui:100 msgid "_Variable:" msgstr "_Variable:" #: src/ui/gui/barchart.ui:308 msgid "Bars Represent" msgstr "Bedeutung der Balken" #: src/ui/gui/barchart.ui:340 msgid "Category C_luster:" msgstr "Kategorien-C_luster:" #: src/ui/gui/correlation.ui:24 msgid "Bivariate Correlations" msgstr "Bivariate Korrelationen" #: src/ui/gui/correlation.ui:148 msgid "Pearso_n" msgstr "_Pearson" #: src/ui/gui/correlation.ui:164 msgid "_Kendall's tau-b" msgstr "_Kendalls Tau b" #: src/ui/gui/correlation.ui:180 msgid "_Spearman" msgstr "_Spearman" #: src/ui/gui/correlation.ui:200 msgid "Correlation Coefficients" msgstr "Korrelationskoeffizienten" #: src/ui/gui/correlation.ui:224 msgid "_Two-tailed" msgstr "Z_weiseitig" #: src/ui/gui/correlation.ui:241 msgid "One-tai_led" msgstr "E_inseitig" #: src/ui/gui/correlation.ui:262 msgid "Test of Significance" msgstr "Signifikanztest" #: src/ui/gui/correlation.ui:275 msgid "_Flag significant correlations" msgstr "Signifi_kante Korrelationen markieren" #: src/ui/gui/count.ui:24 msgid "Count Occurrences of Values within Cases" msgstr "Häufigkeiten von Werten in den Fällen zählen" #: src/ui/gui/count.ui:117 msgid "Numeric _Variables:" msgstr "_Numerische Variablen:" #: src/ui/gui/count.ui:147 msgid "_Target Variable:" msgstr "_Zielvariable:" #: src/ui/gui/count.ui:178 msgid "Target _Label:" msgstr "Ziel_label:" #: src/ui/gui/count.ui:192 msgid "_Define Values..." msgstr "_Werte definieren..." #: src/ui/gui/count.ui:257 msgid "Count Values within Cases: Values to Count" msgstr "Werte in Fällen zählen: Welche Werte?" #: src/ui/gui/count.ui:305 msgid "Values _to Count:" msgstr "_Zu zählende Werte:" #: src/ui/gui/comments.ui:25 msgid "Data File Comments" msgstr "Datendateikommentare" #: src/ui/gui/comments.ui:49 msgid "Comments:" msgstr "Kommentare" #: src/ui/gui/comments.ui:106 msgid "Display comments in output" msgstr "Kommentare in der Ausgabe anzeigen" #: src/ui/gui/comments.ui:127 msgid "Column Number: 0" msgstr "Spaltennummer: 0" #: src/ui/gui/crosstabs.ui:25 msgid "Crosstabs: Cells" msgstr "Kreuztabellen: Zellen anzeigen" #: src/ui/gui/crosstabs.ui:67 msgid "Cell Display" msgstr "Anzeige in den Zellen" #: src/ui/gui/crosstabs.ui:99 msgid "Crosstabs" msgstr "Kreuztabellen" #: src/ui/gui/crosstabs.ui:150 msgid "_Rows" msgstr "_Reihen" #: src/ui/gui/crosstabs.ui:195 msgid "_Columns" msgstr "S_palten" #: src/ui/gui/crosstabs.ui:242 msgid "_Format..." msgstr "_Format..." #: src/ui/gui/crosstabs.ui:256 src/ui/gui/examine.ui:267 msgid "_Statistics..." msgstr "_Statistiken..." #: src/ui/gui/crosstabs.ui:270 msgid "Ce_lls..." msgstr "_Zellen..." #: src/ui/gui/crosstabs.ui:348 msgid "Crosstabs: Format" msgstr "Kreuztabellen: Format" #: src/ui/gui/crosstabs.ui:371 msgid "Print tables" msgstr "Tabellen ausgeben" #: src/ui/gui/crosstabs.ui:387 msgid "Pivot" msgstr "Pivottabelle" #: src/ui/gui/crosstabs.ui:403 src/ui/gui/sort.ui:157 msgid "Ascending" msgstr "Aufsteigend" #: src/ui/gui/crosstabs.ui:455 msgid "Crosstabs: Statistics" msgstr "Kreuztabellen: Statistiken" #: src/ui/gui/chi-square.ui:30 msgid "Chi-Square Test" msgstr "Chi-Quadrat-Test" #: src/ui/gui/chi-square.ui:82 msgid "All categor_ies equal" msgstr "Alle Kate_gorien gleich" #: src/ui/gui/chi-square.ui:103 msgid "_Values" msgstr "_Werte" #: src/ui/gui/chi-square.ui:159 msgid "Expected Values:" msgstr "Erwartete Werte:" #: src/ui/gui/chi-square.ui:204 msgid "Test _Variables" msgstr "_Testvariablen:" #: src/ui/gui/chi-square.ui:298 msgid "Use _specified range" msgstr "_Angegebenen Bereich verwenden" #: src/ui/gui/chi-square.ui:323 msgid "_Lower:" msgstr "_Minimum:" #: src/ui/gui/chi-square.ui:337 msgid "_Upper:" msgstr "Ma_ximum:" #: src/ui/gui/chi-square.ui:381 msgid "Expected Range:" msgstr "Erwarteter Bereich:" #: src/ui/gui/descriptives.ui:131 src/ui/gui/factor.ui:797 #: src/ui/gui/recode.ui:638 msgid "_Variables:" msgstr "_Variablen:" #: src/ui/gui/descriptives.ui:176 msgid "S_tatistics:" msgstr "_Statistiken:" #: src/ui/gui/descriptives.ui:230 msgid "_Exclude entire case if any selected variable is missing" msgstr "" "_Ausschluss des gesamten Falls, wenn eine der gewählten Variablen fehlt " #: src/ui/gui/descriptives.ui:247 msgid "_Include user-missing data in analysis" msgstr "_Benutzerdefiniert fehlende Werte in Analyse mit einschließen" #: src/ui/gui/descriptives.ui:264 msgid "Save _Z-scores of selected variables as new variables" msgstr "_Z-Werte der gewählten Variablen als neue Variablen speichern" #: src/ui/gui/descriptives.ui:286 msgid "Options:" msgstr "Optionen:" #: src/ui/gui/examine.ui:25 msgid "Explore" msgstr "Explorative Datenanalyse" #: src/ui/gui/examine.ui:69 msgid "_Label Cases by:" msgstr "Fallb_eschriftung" #: src/ui/gui/examine.ui:116 msgid "_Factor List:" msgstr "F_aktorenliste" #: src/ui/gui/examine.ui:163 src/ui/gui/means.ui:126 msgid "_Dependent List:" msgstr "Liste der ab_hängigen Variablen" #: src/ui/gui/examine.ui:331 msgid "Explore: Options" msgstr "Explorative Datenanalyse: Optionen" #: src/ui/gui/examine.ui:355 src/ui/gui/t-test.ui:81 msgid "Exclude cases _listwise" msgstr "_Listenweiser Fallausschluss" #: src/ui/gui/examine.ui:373 msgid "Exclude cases _pairwise" msgstr "_Paarweiser Fallausschluss" #: src/ui/gui/examine.ui:392 msgid "_Report values" msgstr "W_erte einbeziehen" #: src/ui/gui/examine.ui:449 msgid "Explore: Statistics" msgstr "Explorative Datenanalyse: Statistiken" #: src/ui/gui/examine.ui:468 src/ui/gui/oneway.ui:576 msgid "_Descriptives" msgstr "_Deskriptive" #: src/ui/gui/examine.ui:485 msgid "_Extremes" msgstr "_Ausreißer" #: src/ui/gui/examine.ui:502 msgid "_Percentiles" msgstr "_Perzentile" #: src/ui/gui/goto-case.ui:31 msgid "Goto Case" msgstr "Gehe zu Fall" #: src/ui/gui/goto-case.ui:52 msgid "Goto Case Number:" msgstr "Fallnummer:" #: src/ui/gui/factor.ui:39 msgid "Factor Analysis: Rotation" msgstr "Faktorenanalyse: Rotation" #: src/ui/gui/factor.ui:70 msgid "_None" msgstr "Ke_ine" #: src/ui/gui/factor.ui:87 msgid "_Varimax" msgstr "_Varimax" #: src/ui/gui/factor.ui:104 msgid "_Quartimax" msgstr "_Quartimax" #: src/ui/gui/factor.ui:123 msgid "_Equimax" msgstr "_Equamax" #: src/ui/gui/factor.ui:146 msgid "Method" msgstr "Methode" #: src/ui/gui/factor.ui:159 msgid "_Display rotated solution" msgstr "_Rotierte Lösung anzeigen" #: src/ui/gui/factor.ui:181 src/ui/gui/factor.ui:582 msgid "Ma_ximum iterations for convergence:" msgstr "Ma_ximale Anzahl der Iterationsschritte für Konvergenz:" #: src/ui/gui/factor.ui:241 src/ui/gui/factor.ui:255 msgid "Principal Components Analysis" msgstr "Hauptkomponentenanalyse" #: src/ui/gui/factor.ui:246 src/ui/gui/factor.ui:258 msgid "Principal Axis Factoring" msgstr "Hauptachsen-Faktorenanalyse" #: src/ui/gui/factor.ui:264 msgid "Factor Analysis: Extraction" msgstr "Faktorenanalyse: Extraktion" #: src/ui/gui/factor.ui:290 msgid "_Method: " msgstr "_Methode:" #: src/ui/gui/factor.ui:345 msgid "Co_rrelation matrix" msgstr "_Korrelationsmatrix" #: src/ui/gui/factor.ui:361 msgid "Co_variance matrix" msgstr "Ko_varianzmatrix" #: src/ui/gui/factor.ui:382 msgid "Analyze" msgstr "Analysieren" #: src/ui/gui/factor.ui:407 msgid "_Unrotated factor solution" msgstr "Nicht _rotierte Faktorlösung" #: src/ui/gui/factor.ui:423 msgid "_Scree plot" msgstr "_Screeplot" #: src/ui/gui/factor.ui:443 src/ui/gui/histogram.ui:146 src/ui/gui/roc.ui:329 msgid "Display" msgstr "Anzeige" #: src/ui/gui/factor.ui:526 msgid "_Number of factors:" msgstr "_Anzahl der Faktoren:" #: src/ui/gui/factor.ui:563 msgid "Extract" msgstr "Extrahieren" #: src/ui/gui/factor.ui:640 msgid "Factor Analysis" msgstr "Faktorenanalyse" #: src/ui/gui/factor.ui:672 src/ui/gui/data-editor.ui:266 msgid "_Descriptives..." msgstr "_Deskriptive Statistiken..." #: src/ui/gui/factor.ui:685 msgid "_Extraction..." msgstr "E_xtraktion..." #: src/ui/gui/factor.ui:699 msgid "_Rotations..." msgstr "Ro_tation..." #: src/ui/gui/find.ui:25 msgid "Find Case" msgstr "Fälle finden" #: src/ui/gui/find.ui:117 msgid "Variable:" msgstr "Variable:" #: src/ui/gui/find.ui:157 src/ui/gui/val-labs-dialog.ui:113 msgid "Value:" msgstr "Wert:" #: src/ui/gui/find.ui:180 msgid "Search value labels" msgstr "Wertelabel durchsuchen" #: src/ui/gui/find.ui:210 msgid "Regular expression Match" msgstr "Übereinstimmung mit regulärem Ausdruck" #: src/ui/gui/find.ui:227 msgid "Search substrings" msgstr "Einzelnen Worteile durchsuchen" #: src/ui/gui/find.ui:244 msgid "Wrap around" msgstr "Am Ende von vorn beginnen" #: src/ui/gui/find.ui:260 msgid "Search backward" msgstr "Rückwärts suchen" #: src/ui/gui/frequencies.ui:32 msgid "Frequencies: Frequency Tables" msgstr "Häufigkeiten: Häufigkeitstabellen" #: src/ui/gui/frequencies.ui:67 msgid "_Always" msgstr "_Immer" #: src/ui/gui/frequencies.ui:85 msgid "_Never" msgstr "_Niemals" #: src/ui/gui/frequencies.ui:107 msgid "If no _more than " msgstr "_Wenn nicht mehr als " #: src/ui/gui/frequencies.ui:129 src/ui/gui/frequencies.ui:454 msgid "100" msgstr "100" #: src/ui/gui/frequencies.ui:145 msgid "values" msgstr "Werte" #: src/ui/gui/frequencies.ui:167 msgid "Display frequency tables" msgstr "Häufigkeitstabellen anzeigen" #: src/ui/gui/frequencies.ui:194 msgid "A_scending value" msgstr "_Aufsteigenden Werte" #: src/ui/gui/frequencies.ui:212 msgid "D_escending value" msgstr "A_bsteigenden Werte" #: src/ui/gui/frequencies.ui:230 msgid "Ascending _frequency" msgstr "Aufs_teigenden Häufigkeiten" #: src/ui/gui/frequencies.ui:248 msgid "Descending f_requency" msgstr "Ab_steigenden Häufigkeiten" #: src/ui/gui/frequencies.ui:271 msgid "Order by" msgstr "Sortieren nach" #: src/ui/gui/frequencies.ui:324 msgid "Frequencies: Charts" msgstr "Häufigkeiten: Diagramme" #: src/ui/gui/frequencies.ui:356 msgid "Scale:" msgstr "Skala:" #: src/ui/gui/frequencies.ui:366 msgid "_Frequencies" msgstr "_Häufigkeiten" #: src/ui/gui/frequencies.ui:383 msgid "_Percentages" msgstr "_Prozentwerte" #: src/ui/gui/frequencies.ui:407 msgid "Exclude values _below " msgstr "Ausschließen von Werten _unter " #: src/ui/gui/frequencies.ui:422 msgid "Exclude values _above " msgstr "Ausschließen von Werten _über " #: src/ui/gui/frequencies.ui:441 src/ui/gui/reliability.ui:227 msgid "0" msgstr "0" #: src/ui/gui/frequencies.ui:469 msgid "Chart Formatting" msgstr "Diagrammformat" #: src/ui/gui/frequencies.ui:494 msgid "Draw _histograms" msgstr "_Histogramme zeichnen" #: src/ui/gui/frequencies.ui:510 msgid "Superimpose _normal curve" msgstr "_Normalverteilungskurve anzeigen" #: src/ui/gui/frequencies.ui:530 msgid "Histograms" msgstr "Histogramme" #: src/ui/gui/frequencies.ui:555 msgid "Draw _bar charts" msgstr "_Balkendiagramm zeichnen" #: src/ui/gui/frequencies.ui:575 msgid "Bar Charts" msgstr "Balkendiagramme" #: src/ui/gui/frequencies.ui:600 msgid "Draw _pie charts" msgstr "_Kreisdiagramm zeichnen" #: src/ui/gui/frequencies.ui:616 msgid "Include slices for _missing values" msgstr "_Segmente für fehlende Werte einfügen" #: src/ui/gui/frequencies.ui:636 msgid "Pie Charts" msgstr "Kreisdiagramme" #: src/ui/gui/frequencies.ui:725 src/ui/gui/rank.ui:489 msgid "_Variable(s):" msgstr "_Variable(n):" #: src/ui/gui/frequencies.ui:769 msgid "_Statistics:" msgstr "_Statistiken:" #: src/ui/gui/frequencies.ui:783 msgid "Include _missing values" msgstr "_Fehlende Werte mit einschließen" #: src/ui/gui/frequencies.ui:806 msgid "Ch_arts..." msgstr "_Diagramme..." #: src/ui/gui/frequencies.ui:821 msgid "Frequency _Tables..." msgstr "_Häufigkeitstabellen..." #: src/ui/gui/histogram.ui:24 msgid "Histogram" msgstr "Histogramm" #: src/ui/gui/histogram.ui:126 msgid "_Display normal curve" msgstr "_Normalverteilungskurve anzeigen" #: src/ui/gui/indep-samples.ui:25 src/ui/gui/k-independent.ui:35 msgid "Define Groups" msgstr "Gruppenvariable" #: src/ui/gui/indep-samples.ui:75 msgid "Group_2 value:" msgstr "Wert Gruppe_2:" #: src/ui/gui/indep-samples.ui:89 msgid "Group_1 value:" msgstr "Wert Gruppe_1:" #: src/ui/gui/indep-samples.ui:190 msgid "_Use specified values:" msgstr "_Angegebene Werte verwenden:" #: src/ui/gui/indep-samples.ui:259 msgid "Independent-Samples T Test" msgstr "T-Test bei unabhängigen Stichproben" #: src/ui/gui/indep-samples.ui:319 msgid "_Define Groups..." msgstr "Gruppen _definieren" #: src/ui/gui/indep-samples.ui:401 src/ui/gui/t-test.ui:211 msgid "_Test Variable(s):" msgstr "_Testvariable(n):" #: src/ui/gui/indep-samples.ui:454 src/ui/gui/k-independent.ui:165 msgid "_Grouping Variable:" msgstr "_Gruppenvariable:" #: src/ui/gui/k-independent.ui:63 msgid "_Upper limit:" msgstr "Ma_ximum:" #: src/ui/gui/k-independent.ui:77 msgid "_Lower limit:" msgstr "_Minimum:" #: src/ui/gui/k-independent.ui:136 msgid "Tests for Several Independent Samples" msgstr "Tests für mehreren unabhängige Stichproben" #: src/ui/gui/k-independent.ui:208 src/ui/gui/ks-one-sample.ui:131 msgid "Test _Variable List:" msgstr "_Testvariablen:" #: src/ui/gui/k-independent.ui:320 msgid "_Define Groups" msgstr "Gruppenvariable" #: src/ui/gui/k-independent.ui:365 msgid "_Kruskal-Wallis H" msgstr "_Kruskal-Wallis H" #: src/ui/gui/k-independent.ui:382 src/ui/gui/runs.ui:140 msgid "_Median" msgstr "_Median" #: src/ui/gui/k-means.ui:24 msgid "K-Means Cluster Analysis" msgstr "k-Means Clusteranalyse" #: src/ui/gui/k-means.ui:122 msgid "N_umber of Clusters: " msgstr "Anzahl der Cluster:" #: src/ui/gui/k-related.ui:24 msgid "Tests for Several Related Samples" msgstr "Tests für mehreren verbundenen Stichproben" #: src/ui/gui/k-related.ui:113 msgid "_Test Variables:" msgstr "Test_variablen:" #: src/ui/gui/k-related.ui:145 msgid "_Friedman" msgstr "Frie_dman" #: src/ui/gui/k-related.ui:161 msgid "_Kendall's W" msgstr "Kendall-_W" #: src/ui/gui/k-related.ui:177 msgid "_Cochran's Q" msgstr "_Cochran-Q" #: src/ui/gui/ks-one-sample.ui:163 msgid "_Normal" msgstr "_Normalverteilung" #: src/ui/gui/ks-one-sample.ui:181 msgid "_Poisson" msgstr "_Poisson" #: src/ui/gui/ks-one-sample.ui:198 msgid "_Uniform" msgstr "_Gleichverteilung" #: src/ui/gui/ks-one-sample.ui:213 msgid "_Exponential" msgstr "_Exponential" #: src/ui/gui/ks-one-sample.ui:232 msgid "Test Distribution" msgstr "Zu testende Verteilung" #: src/ui/gui/logistic.ui:42 msgid "Logistic Regression: Options" msgstr "Logistische Regression: Optionen" #: src/ui/gui/logistic.ui:66 msgid "CI for _exp(B): " msgstr "Konfidenzintervall für exp(B):" #: src/ui/gui/logistic.ui:97 msgid "%" msgstr "%" #: src/ui/gui/logistic.ui:146 msgid "Classification cu_toff: " msgstr "Klassifikationssch_wellenwert" #: src/ui/gui/logistic.ui:159 msgid "_Maximum Iterations: " msgstr "_Maximale Anzahl der Iterationen:" #: src/ui/gui/logistic.ui:177 msgid "Include _constant in model" msgstr "K_onstante in Modell einschließen" #: src/ui/gui/logistic.ui:219 msgid "Logistic Regression" msgstr "Logistische Regression" #: src/ui/gui/logistic.ui:364 src/ui/gui/regression.ui:185 msgid "_Dependent" msgstr "_Abhängige Variable" #: src/ui/gui/logistic.ui:412 src/ui/gui/regression.ui:232 msgid "_Independent" msgstr "_Unabhängige Variable(n)" #: src/ui/gui/means.ui:25 msgid "Means" msgstr "Mittelwerte" #: src/ui/gui/means.ui:179 msgid "_Independent List:" msgstr "Liste der _abhänigen Variablen" #: src/ui/gui/missing-val-dialog.ui:48 msgid "_No missing values" msgstr "Kei_ne fehlenden Werte" #: src/ui/gui/missing-val-dialog.ui:136 msgid "_Discrete missing values" msgstr "_Einzelne fehlende Werte" #: src/ui/gui/missing-val-dialog.ui:172 msgid "_Low:" msgstr "_Kleinster Wert:" #: src/ui/gui/missing-val-dialog.ui:197 msgid "_High:" msgstr "_Größter Wert:" #: src/ui/gui/missing-val-dialog.ui:221 msgid "Di_screte value:" msgstr "Ein_zelner Wert:" #: src/ui/gui/missing-val-dialog.ui:245 msgid "_Range plus one optional discrete missing value" msgstr "_Bereich und einzelner fehlender Wert" #: src/ui/gui/oneway.ui:25 msgid "One-Way ANOVA: Contrasts" msgstr "Einfaktorielle ANOVA: Kontraste" #: src/ui/gui/oneway.ui:107 msgid "_Coefficients:" msgstr "K_oeffizienten:" #: src/ui/gui/oneway.ui:161 msgid "Coefficient Total: " msgstr "Koeffizientensumme:" #: src/ui/gui/oneway.ui:198 msgid "Contrast 1 of 1" msgstr "Kontrast 1 von 1" #: src/ui/gui/oneway.ui:234 msgid "One-Way ANOVA: Post-Hoc" msgstr "Einfaktorielle ANOVA: Post-Hoc" #: src/ui/gui/oneway.ui:270 msgid "Games Howell" msgstr "Games Howell" #: src/ui/gui/oneway.ui:287 msgid "Fisher's LSD" msgstr "Fisher's LSD" #: src/ui/gui/oneway.ui:379 msgid "One-Way ANOVA" msgstr "Einfaktorielle ANOVA" #: src/ui/gui/oneway.ui:408 msgid "_Factor:" msgstr "Fak_tor:" #: src/ui/gui/oneway.ui:451 msgid "Dependent _Variable(s):" msgstr "_Abhängige Variable(n):" #: src/ui/gui/oneway.ui:593 msgid "_Homogeneity" msgstr "_Homogenität" #: src/ui/gui/oneway.ui:637 msgid "Post-Hoc..." msgstr "Post-Hoc..." #: src/ui/gui/oneway.ui:652 msgid "_Contrasts..." msgstr "_Kontraste..." #: src/ui/gui/options.ui:25 msgid "Options Case" msgstr "Optionen" #: src/ui/gui/options.ui:55 msgid "Display _Labels" msgstr "Zeige _Wertelabels" #: src/ui/gui/options.ui:71 msgid "Display _Names" msgstr "Zeige _Namen" #: src/ui/gui/options.ui:99 msgid "Sort by L_abel" msgstr "Sortieren nach L_abel" #: src/ui/gui/options.ui:115 msgid "Sort by Na_me" msgstr "Sortieren nach Na_me" #: src/ui/gui/options.ui:131 msgid "Do not S_ort" msgstr "Nicht S_ortieren" #: src/ui/gui/options.ui:159 msgid "Variable Lists" msgstr "Variablenlisten" #: src/ui/gui/options.ui:184 msgid "Ma_ximize" msgstr "Ma_ximieren" #: src/ui/gui/options.ui:199 msgid "_Raise" msgstr "_Erhöhen" #: src/ui/gui/options.ui:214 msgid "Aler_t" msgstr "_Warnung" #: src/ui/gui/options.ui:233 msgid "Output Window Action" msgstr "Ausgabe Fenster" #: src/ui/gui/paired-samples.ui:147 msgid "_Test Pair(s):" msgstr "_Variablenpaar(e):" #: src/ui/gui/rank.ui:30 msgid "Rank Cases: Types" msgstr "Rangfolge bilden: Typen" #: src/ui/gui/rank.ui:57 msgid "Sum of case _weights" msgstr "Summe der _Fallgewichte" #: src/ui/gui/rank.ui:74 msgid "Fractional rank as _%" msgstr "Relative Rangfolge in _%" #: src/ui/gui/rank.ui:92 msgid "_Fractional rank" msgstr "R_elative Rangfolge" #: src/ui/gui/rank.ui:109 msgid "_Savage score" msgstr "_Savage-Wert" #: src/ui/gui/rank.ui:125 msgid "_Rank" msgstr "_Rang" #: src/ui/gui/rank.ui:147 msgid "N_tiles" msgstr "_N-Perzentile" #: src/ui/gui/rank.ui:195 msgid "_Proportion Estimates" msgstr "Anteilssc_hätzungen" #: src/ui/gui/rank.ui:213 msgid "_Normal Scores" msgstr "N_ormalrangwerte" #: src/ui/gui/rank.ui:251 msgid "_Blom" msgstr "_Blom" #: src/ui/gui/rank.ui:269 msgid "Tuke_y" msgstr "_Tukey" #: src/ui/gui/rank.ui:287 msgid "Ran_kit" msgstr "Ran_kit" #: src/ui/gui/rank.ui:305 msgid "_Van der Waerden" msgstr "_Van der Waerden" #: src/ui/gui/rank.ui:328 msgid "Proportion Estimation Formula" msgstr "Formel für Anteilsschätzung" #: src/ui/gui/rank.ui:369 msgid "Rank Cases" msgstr "Rangfolge bilden" #: src/ui/gui/rank.ui:434 msgid "_By:" msgstr "_Schritt:" #: src/ui/gui/rank.ui:595 msgid "_Smallest Value" msgstr "Kleinste_m Wert" #: src/ui/gui/rank.ui:613 msgid "_Largest Value" msgstr "_Größtem Wert" #: src/ui/gui/rank.ui:637 msgid "Assign rank 1 to:" msgstr "Rang 1 zuweisen:" #: src/ui/gui/rank.ui:656 msgid "_Display summary tables" msgstr "Z_usammenfassungen anzeigen" #: src/ui/gui/rank.ui:679 msgid "Rank T_ypes" msgstr "Rang_typen" #: src/ui/gui/rank.ui:694 msgid "_Ties..." msgstr "Rang_bedingungen" #: src/ui/gui/rank.ui:756 msgid "Rank Cases: Ties" msgstr "Rangfolge bilden: Rangbedienungen" #: src/ui/gui/rank.ui:788 msgid "_Mean" msgstr "_Mittelwert" #: src/ui/gui/rank.ui:806 msgid "_Low" msgstr "Mi_nimum" #: src/ui/gui/rank.ui:825 msgid "_High" msgstr "Ma_ximum" #: src/ui/gui/rank.ui:851 msgid "_Sequential ranks to unique values" msgstr "_Ränge fortlaufend vergeben" #: src/ui/gui/rank.ui:875 msgid "Rank Assigned to Ties" msgstr "Zugewiesener Rang bein Rangbedingungen" #: src/ui/gui/runs.ui:155 msgid "M_ean" msgstr "Mittel_wert" #: src/ui/gui/runs.ui:171 msgid "Mo_de" msgstr "Mo_dalwert" #: src/ui/gui/runs.ui:191 msgid "_Custom:" msgstr "_Benutzerdefiniert:" #: src/ui/gui/runs.ui:230 msgid "Cut Point" msgstr "Trennwert" #: src/ui/gui/sort.ui:25 msgid "Sort Cases" msgstr "Fälle sortieren" #: src/ui/gui/sort.ui:101 msgid "Sort by:" msgstr "Sortieren nach:" #: src/ui/gui/sort.ui:174 msgid "Descending" msgstr "Absteigend" #: src/ui/gui/sort.ui:196 msgid "Sort Order" msgstr "Sortierreihenfolge" #: src/ui/gui/split-file.ui:25 msgid "Split File" msgstr "Datei aufteilen" #: src/ui/gui/split-file.ui:103 msgid "Anal_yze all cases. Do not create groups." msgstr "_Alle Fälle analysieren, keine Gruppen bilden." #: src/ui/gui/split-file.ui:121 msgid "Compare _groups." msgstr "Gruppen verglei_chen." #: src/ui/gui/split-file.ui:140 msgid "Organize ou_tput by groups." msgstr "Aus_gabe nach Gruppen aufteilen." #: src/ui/gui/split-file.ui:225 msgid "Groups _based on:" msgstr "Gr_uppen basierend auf:" #: src/ui/gui/split-file.ui:255 msgid "_Sort the file by grouping variables." msgstr "_Datei nach Gruppenvariablen sortieren." #: src/ui/gui/split-file.ui:273 msgid "_File is already sorted." msgstr "Date_i ist sortiert." #: src/ui/gui/split-file.ui:334 msgid "Current Status : " msgstr "Aktueller Status : " #: src/ui/gui/split-file.ui:348 msgid "Analysis by groups is off" msgstr "Gruppenweise Analyse ist deaktiviert" #: src/ui/gui/recode.ui:135 msgid "System _Missing" msgstr "S_ystemdefiniert fehlend" #: src/ui/gui/recode.ui:150 msgid "Co_py old values" msgstr "Alte Werte ko_pieren" #: src/ui/gui/recode.ui:172 msgid "Va_lue: " msgstr "W_ert:" #: src/ui/gui/recode.ui:276 msgid "Conver_t numeric strings to numbers (`5' -> 5)" msgstr "Nu_m. Strings in Zahlen umwandeln (`5' -> 5)" #: src/ui/gui/recode.ui:297 msgid "Output variables are _strings" msgstr "Aus_gabe der Variablen als Strings" #: src/ui/gui/recode.ui:318 msgid "Width: " msgstr "Breite:" #: src/ui/gui/recode.ui:499 msgid "_Name:" msgstr "_Name:" #: src/ui/gui/recode.ui:527 msgid "La_bel:" msgstr "_Beschriftung:" #: src/ui/gui/recode.ui:556 msgid "Chan_ge" msgstr "_Ändern" #: src/ui/gui/recode.ui:584 msgid "Output Variable" msgstr "Ausgabevariable" #: src/ui/gui/recode.ui:658 msgid "Old and New Va_lues..." msgstr "Alte und neue _Werte" #: src/ui/gui/regression.ui:51 msgid "S_tatistics..." msgstr "_Statistiken..." #: src/ui/gui/regression.ui:272 msgid "Regression: Save" msgstr "Lineare Regression: Speichern" #: src/ui/gui/regression.ui:290 src/ui/gui/univariate.ui:42 msgid "_Predicted values" msgstr "_Vorhergesagte Werte" #: src/ui/gui/regression.ui:307 src/ui/gui/univariate.ui:59 msgid "_Residuals" msgstr "_Residuen" #: src/ui/gui/regression.ui:351 msgid "Regression: Statistics" msgstr "Lineare Regression: Statistiken" #: src/ui/gui/regression.ui:393 src/ui/gui/univariate.ui:143 msgid "S_tatistics" msgstr "_Statistiken" #: src/ui/gui/reliability.ui:34 msgid "Alpha" msgstr "Alpha" #: src/ui/gui/reliability.ui:43 msgid "Reliability Analysis" msgstr "Reliabilitätsanalyse" #: src/ui/gui/reliability.ui:144 msgid "_Items:" msgstr "I_tems:" #: src/ui/gui/reliability.ui:166 msgid "_Model: " msgstr "_Modell:\t" #: src/ui/gui/reliability.ui:212 msgid "_Variables in first split:" msgstr "_Variablen in der ersten Hälfte:" #: src/ui/gui/reliability.ui:259 msgid "Show _descriptives for scale if item is deleted" msgstr "" "_Deskriptive Statistiken für Skala anzeigen, wenn das Item gelöscht wurde" #: src/ui/gui/roc.ui:145 msgid "_Test Variable:" msgstr "_Test Variable:" #: src/ui/gui/roc.ui:175 msgid "_State Variable:" msgstr "_Zustandsvariable:" #: src/ui/gui/roc.ui:202 msgid "_Value of state variable:" msgstr "_Wert der Zustandsvariable:" #: src/ui/gui/roc.ui:249 msgid "ROC C_urve" msgstr "ROC-_Kurve" #: src/ui/gui/roc.ui:269 msgid "_With diagonal reference line" msgstr "_Mit diagonaler Bezugslinie" #: src/ui/gui/roc.ui:293 msgid "Standard _Error and Confidence Interval" msgstr "_Standardfehler und Konfidenzintervall" #: src/ui/gui/roc.ui:309 msgid "_Coordinate points of the ROC Curve" msgstr "_Koordinaten-Punkte der ROC-Kurve" #: src/ui/gui/scatterplot.ui:25 msgid "Scatterplot" msgstr "Scatterplot" #: src/ui/gui/scatterplot.ui:56 msgid "_X Axis:" msgstr "_x-Achse:" #: src/ui/gui/scatterplot.ui:100 msgid "_Y Axis:" msgstr "_y-Achse:" #: src/ui/gui/select-cases.ui:37 msgid "Select Cases: Range" msgstr "Fälle auswählen: Bereich" #: src/ui/gui/select-cases.ui:87 msgid "First case" msgstr "Erster Fall" #: src/ui/gui/select-cases.ui:99 msgid "Last case" msgstr "Letzter Fall" #: src/ui/gui/select-cases.ui:111 msgid "Observation" msgstr "Beobachtung" #: src/ui/gui/select-cases.ui:161 msgid "Select Cases" msgstr "Fälle auswählen" #: src/ui/gui/select-cases.ui:313 msgid "Use filter variable" msgstr "Filtervariable verwenden" #: src/ui/gui/select-cases.ui:380 msgid "Based on time or case range" msgstr "Nach Zeit oder Fallbereich" #: src/ui/gui/select-cases.ui:395 msgid "Range..." msgstr "Bereich..." #: src/ui/gui/select-cases.ui:444 msgid "Random sample of cases" msgstr "Zufallsstichprobe aus den Fällen" #: src/ui/gui/select-cases.ui:460 msgid "Sample..." msgstr "Stichprobe..." #: src/ui/gui/select-cases.ui:508 msgid "If condition is satisfied" msgstr "Wenn Bedingung erfüllt ist" #: src/ui/gui/select-cases.ui:523 msgid "If..." msgstr "Falls..." #: src/ui/gui/select-cases.ui:567 msgid "All Cases" msgstr "Alle Fälle" #: src/ui/gui/select-cases.ui:581 msgid "Select" msgstr "Auswahl" #: src/ui/gui/select-cases.ui:608 msgid "Filtered" msgstr "Filtern" #: src/ui/gui/select-cases.ui:625 msgid "Deleted" msgstr "Löschen" #: src/ui/gui/select-cases.ui:647 msgid "Unselected Cases Are" msgstr "Nicht gewählte Fälle" #: src/ui/gui/select-cases.ui:694 msgid "Select Cases: Random Sample" msgstr "Fälle auswählen: Zufallsstichprobe" #: src/ui/gui/select-cases.ui:756 msgid "Sample Size" msgstr "Stichprobengröße" #: src/ui/gui/t-test.ui:25 msgid "Options" msgstr "Optionen" #: src/ui/gui/t-test.ui:63 msgid "Exclude cases _analysis by analysis" msgstr "Fallau_sschluss Test für Test" #: src/ui/gui/t-test.ui:148 msgid "One - Sample T Test" msgstr "T-Test bei einer Stichprobe" #: src/ui/gui/t-test.ui:265 msgid "Test _Value: " msgstr "Test_wert:" #: src/ui/gui/text-data-import.ui:32 msgid "Select the first line of the data file that contains data." msgstr "Wählen Sie die erste Zeile der Textdatei aus, die Daten enthält." #: src/ui/gui/text-data-import.ui:54 msgid "Line above selected line contains variable names" msgstr "Die Zeile oberhalb der ausgewählte Zeilen enthält die Variablennamen" #: src/ui/gui/text-data-import.ui:80 msgid "" "Check the data formats displayed below and fix any that are incorrect. You " "may set other variable properties now or later." msgstr "" "Überprüfen sie die unten angezeigten Datenformate und korrigieren sie die " "inkorrekten. Sie können die anderen Eigenschaften der Variablen jetzt oder " "später festlegen." #: src/ui/gui/text-data-import.ui:121 msgid "Variables" msgstr "Variablen" #: src/ui/gui/text-data-import.ui:152 msgid "Data Preview" msgstr "Datenvorschau" #: src/ui/gui/text-data-import.ui:181 msgid "" "This assistant will guide you through the process of importing data into " "PSPP from a text file with one line per case, in which fields are separated " "by tabs, commas, or other delimiters.\n" "\n" "\tThe selected file contains N lines of text. Only the first M of these " "will be shown for preview purposes in the following screens. You may choose " "below how much of the file should actually be imported." msgstr "" "Dieser Assistent führt Sie durch den Einlesevorgang von Daten in PSPP, die " "aus einer Textdatei stammen, in der jede Zeile einen Fall darstellt und in " "der Datenfelder durch Tabulatoren, Kommas oder andere Trennzeichen separiert " "sind.\n" " \n" "Die gewählte Datei enthält N Textzeilen. Nur die ersten M Zeilen werden in " "den folgenden Vorschaufenstern gezeigt. Sie können unten wählen, wie viele " "Zeilen der Datei tatsächlich eingelesen werden." #: src/ui/gui/text-data-import.ui:252 msgid "All cases" msgstr "Alle Fälle" #: src/ui/gui/text-data-import.ui:272 msgid "Amount to Import" msgstr "Einzulesende Menge" #: src/ui/gui/text-data-import.ui:325 msgid "C_ustom" msgstr "A_ndere" #: src/ui/gui/text-data-import.ui:341 msgid "Slas_h (/)" msgstr "Slas_h (/)" #: src/ui/gui/text-data-import.ui:357 msgid "Semicolo_n (;)" msgstr "_Semikolon (;)" #: src/ui/gui/text-data-import.ui:373 msgid "P_ipe (|)" msgstr "_Pipe (|)" #: src/ui/gui/text-data-import.ui:389 msgid "H_yphen (-)" msgstr "_Bindestrich (-)" #: src/ui/gui/text-data-import.ui:405 msgid "Co_mma (,)" msgstr "_Komma (,)" #: src/ui/gui/text-data-import.ui:421 msgid "_Colon (:)" msgstr "_Doppelpunkt (:)" #: src/ui/gui/text-data-import.ui:437 msgid "Ban_g (!)" msgstr "_Ausrufezeichen (!)" #: src/ui/gui/text-data-import.ui:453 msgid "Ta_b" msgstr "_Tabstopp" #: src/ui/gui/text-data-import.ui:469 msgid "_Space" msgstr "_Leerzeichen" #: src/ui/gui/text-data-import.ui:490 msgid "Separators" msgstr "Trennzeichen" #: src/ui/gui/text-data-import.ui:541 msgid "Quote separator characters with" msgstr "Texterkennungzeichen" #: src/ui/gui/text-data-import.ui:561 msgid "Quoting" msgstr "Texterkennungszeichen" #: src/ui/gui/text-data-import.ui:599 msgid "Fields Preview" msgstr "Vorschau der Datenfelder" #: src/ui/gui/text-data-import.ui:622 msgid "" "Enter below the sheet number and the cell range which you wish to import." msgstr "" "Geben Sie unten die Nummer des Arbeitsblatts und den Zellenbereich an, den " "Sie importieren möchten." #: src/ui/gui/text-data-import.ui:670 msgid "_Cells: " msgstr "_Zellen:" #: src/ui/gui/text-data-import.ui:684 msgid "_Sheet Index: " msgstr "_Arbeitsblattnummer" #: src/ui/gui/text-data-import.ui:695 msgid "Use first row as _variable names" msgstr "Die _erste Zeile als Variablennamen verwenden" #: src/ui/gui/text-data-import.ui:717 msgid "Cells to Import" msgstr "Einzulesende Zellen" #: src/ui/gui/transpose.ui:24 msgid "Transpose" msgstr "Transponieren" #: src/ui/gui/transpose.ui:91 msgid "Name Variable:" msgstr "Namensvariable:" #: src/ui/gui/transpose.ui:127 msgid "Variable(s):" msgstr "Variable(n):" #: src/ui/gui/univariate.ui:25 msgid "Univariate: Save" msgstr "Univariat: Speichern" #: src/ui/gui/univariate.ui:103 msgid "Univariate: Statistics" msgstr "Univariat: Statistiken" #: src/ui/gui/univariate.ui:178 msgid "Univariate" msgstr "Univariat" #: src/ui/gui/univariate.ui:281 msgid "_Dependent Variable" msgstr "_Abhängige Variable" #: src/ui/gui/univariate.ui:329 msgid "_Fixed Factors" msgstr "F_este Faktoren" #: src/ui/gui/val-labs-dialog.ui:101 msgid "Value Label:" msgstr "Wertelabel:" #: src/ui/gui/data-editor.ui:33 msgid "Information Area" msgstr "Informationsbereich" #: src/ui/gui/data-editor.ui:55 msgid "Case Counter Area" msgstr "Status der verarbeiteten Fälle" #: src/ui/gui/data-editor.ui:80 msgid "Filter Use Status Area" msgstr "Status der Fallauswahl" #: src/ui/gui/data-editor.ui:106 msgid "Weight Status Area" msgstr "Status der Fallgewichtung" #: src/ui/gui/data-editor.ui:132 msgid "Split File Status Area" msgstr "Status der Dateiaufteilung" #: src/ui/gui/data-editor.ui:154 msgid "_View" msgstr "A_nsicht" #: src/ui/gui/data-editor.ui:157 msgid "_Status Bar" msgstr "_Statusleiste" #: src/ui/gui/data-editor.ui:163 msgid "_Font..." msgstr "S_chriftart..." #: src/ui/gui/data-editor.ui:167 msgid "_Grid Lines" msgstr "_Gitterlinien" #: src/ui/gui/data-editor.ui:171 msgid "Value _Labels" msgstr "_Wertelabels" #: src/ui/gui/data-editor.ui:182 msgid "_Variables" msgstr "V_ariablen" #: src/ui/gui/data-editor.ui:192 msgid "_Sort Cases..." msgstr "Fälle s_ortieren..." #: src/ui/gui/data-editor.ui:196 msgid "_Transpose..." msgstr "Trans_ponieren..." #: src/ui/gui/data-editor.ui:200 msgid "_Aggregate..." msgstr "_Aggregieren..." #: src/ui/gui/data-editor.ui:206 msgid "S_plit File..." msgstr "Datei aufte_ilen..." #: src/ui/gui/data-editor.ui:210 msgid "Select _Cases..." msgstr "Fälle au_swählen..." #: src/ui/gui/data-editor.ui:214 msgid "_Weight Cases..." msgstr "Fä_lle gewichten..." #: src/ui/gui/data-editor.ui:220 msgid "_Transform" msgstr "T_ransformieren" #: src/ui/gui/data-editor.ui:223 msgid "_Compute..." msgstr "Varia_ble berechnen..." #: src/ui/gui/data-editor.ui:227 msgid "Cou_nt..." msgstr "Werte in Fällen _zählen..." #: src/ui/gui/data-editor.ui:231 msgid "Ran_k Cases..." msgstr "Ran_gfolge bilden..." #: src/ui/gui/data-editor.ui:235 msgid "Auto_matic Recode..." msgstr "_Automatisches Umkodieren..." #: src/ui/gui/data-editor.ui:241 msgid "Recode into _Same Variables..." msgstr "Umko_dieren in dieselbe Variable..." #: src/ui/gui/data-editor.ui:245 msgid "Recode into _Different Variables..." msgstr "_Umkodieren in andere Variable..." #: src/ui/gui/data-editor.ui:251 msgid "_Run Pending Transforms" msgstr "Offene _Transformationen ausführen" #: src/ui/gui/data-editor.ui:257 msgid "_Analyze" msgstr "Anal_ysieren" #: src/ui/gui/data-editor.ui:260 msgid "_Descriptive Statistics" msgstr "D_eskriptive Statistiken" #: src/ui/gui/data-editor.ui:262 msgid "_Frequencies..." msgstr "_Häufigkeiten..." #: src/ui/gui/data-editor.ui:270 msgid "_Explore..." msgstr "_Explorative Datenanalyse..." #: src/ui/gui/data-editor.ui:274 msgid "_Crosstabs..." msgstr "_Kreuztabellen..." #: src/ui/gui/data-editor.ui:279 msgid "Compare _Means" msgstr "_Mittelwerte vergleichen" #: src/ui/gui/data-editor.ui:281 msgid "_Means..." msgstr "_Mittelwerte..." #: src/ui/gui/data-editor.ui:285 msgid "_One Sample T Test..." msgstr "T-Te_st bei einer Stichprobe..." #: src/ui/gui/data-editor.ui:289 msgid "_Independent Samples T Test..." msgstr "_T-Test bei unabhängigen Stichproben..." #: src/ui/gui/data-editor.ui:293 msgid "_Paired Samples T Test..." msgstr "T-Test bei gepaarten Stich_proben..." #: src/ui/gui/data-editor.ui:297 msgid "One Way _ANOVA..." msgstr "Einfaktorielle _ANOVA..." #: src/ui/gui/data-editor.ui:302 msgid "_Univariate Analysis..." msgstr "_Univariate Analyse..." #: src/ui/gui/data-editor.ui:306 msgid "Bivariate _Correlation..." msgstr "Bivariate _Korrelationen..." #: src/ui/gui/data-editor.ui:310 msgid "_K-Means Cluster..." msgstr "k-Means Clusteranalyse..." #: src/ui/gui/data-editor.ui:314 msgid "_Factor Analysis..." msgstr "_Faktorenanalyse..." #: src/ui/gui/data-editor.ui:318 msgid "Re_liability..." msgstr "Re_liabilitätsanalyse..." #: src/ui/gui/data-editor.ui:322 msgid "_Regression" msgstr "_Regression" #: src/ui/gui/data-editor.ui:325 msgid "_Linear..." msgstr "_Linear..." #: src/ui/gui/data-editor.ui:329 msgid "_Binary Logistic..." msgstr "_Binär Logistisch..." #: src/ui/gui/data-editor.ui:335 msgid "_Non-Parametric Statistics" msgstr "_Nichtparametrische Tests" #: src/ui/gui/data-editor.ui:338 msgid "_Chi Square..." msgstr "_Chi-Quadrat..." #: src/ui/gui/data-editor.ui:342 msgid "_Binomial..." msgstr "_Binominal..." #: src/ui/gui/data-editor.ui:346 msgid "_Runs..." msgstr "R_uns-Test..." #: src/ui/gui/data-editor.ui:350 msgid "_1 Sample K-S..." msgstr "K-S Test bei einer Stichprobe..." #: src/ui/gui/data-editor.ui:354 msgid "_2 Related Samples..." msgstr "Zwei _verbundene Stichproben..." #: src/ui/gui/data-editor.ui:358 msgid "_K Related Samples..." msgstr "K ver_bundene Stichproben..." #: src/ui/gui/data-editor.ui:362 msgid "K _Independent Samples..." msgstr "K _unabhängige Stichproben..." #: src/ui/gui/data-editor.ui:368 msgid "ROC Cur_ve..." msgstr "ROC-Kur_ve..." #: src/ui/gui/data-editor.ui:374 msgid "_Graphs" msgstr "_Diagramme" #: src/ui/gui/data-editor.ui:377 msgid "_Scatterplot" msgstr "_Scatterplot" #: src/ui/gui/data-editor.ui:381 msgid "_Histogram" msgstr "_Histogramm" #: src/ui/gui/data-editor.ui:385 msgid "_Barchart" msgstr "_Balkendiagramm" #: src/ui/gui/data-editor.ui:391 msgid "_Utilities" msgstr "E_xtras" #: src/ui/gui/data-editor.ui:394 msgid "_Variables..." msgstr "_Variablen..." #: src/ui/gui/data-editor.ui:398 msgid "Data File _Comments..." msgstr "Datendateikommentare..." #: src/ui/gui/output-window.ui:71 msgid "_Print..." msgstr "_Drucken..." #: src/ui/gui/output-window.ui:76 msgid "_Export..." msgstr "_Exportieren..." #: src/ui/gui/output-window.ui:92 msgid "Select _All" msgstr "_Alles auswählen" #: src/ui/gui/syntax-editor.ui:27 msgid "Syntax" msgstr "Syntax" #: src/ui/gui/syntax-editor.ui:31 msgid "Data" msgstr "Daten" #: src/ui/gui/syntax-editor.ui:41 msgid "_Save" msgstr "Speichern" #: src/ui/gui/syntax-editor.ui:46 msgid "Save _As" msgstr "Speichern _unter..." #: src/ui/gui/syntax-editor.ui:53 msgid "_Print" msgstr "_Drucken" #: src/ui/gui/syntax-editor.ui:84 msgid "_Delete" msgstr "_Löschen" #: src/ui/gui/syntax-editor.ui:90 msgid "_Undo" msgstr "_Rückgängig" #: src/ui/gui/syntax-editor.ui:94 msgid "_Redo" msgstr "_Wiederherstellen" #: src/ui/gui/syntax-editor.ui:100 msgid "_Find" msgstr "_Suchen" #: src/ui/gui/syntax-editor.ui:106 msgid "_Run" msgstr "_Ausführen" #: src/ui/gui/syntax-editor.ui:109 msgid "_All" msgstr "_Alle" #: src/ui/gui/syntax-editor.ui:113 msgid "_Selection" msgstr "_Auswahl" #: src/ui/gui/syntax-editor.ui:117 msgid "_Current Line" msgstr "Aktuelle _Zeile" #: src/ui/gui/syntax-editor.ui:122 msgid "_To End" msgstr "_Bis Ende" #: src/ui/gui/var-type-dialog.ui:99 msgid "Scientific notation" msgstr "Wissenschaftliche Notation" #: src/ui/gui/var-type-dialog.ui:150 msgid "Custom currency" msgstr "Benutzerdefinierte Währung" #: src/ui/gui/var-type-dialog.ui:267 msgid "positive" msgstr "Positiv" #: src/ui/gui/var-type-dialog.ui:279 msgid "negative" msgstr "Negativ" #: src/ui/gui/var-type-dialog.ui:293 msgid "Sample" msgstr "Beispiel" #: src/ui/gui/var-type-dialog.ui:350 msgid "Width:" msgstr "Breite:" #: src/ui/gui/var-type-dialog.ui:396 msgid "Decimal Places:" msgstr "Anzahl Dezimalstellen:" #: src/ui/gui/weight.ui:24 msgid "Weight Cases" msgstr "Fälle gewichten" #: src/ui/gui/weight.ui:100 msgid "Weight cases by" msgstr "Fälle gewichten nach" #: src/ui/gui/weight.ui:144 msgid "Frequency Variable" msgstr "Häufigkeitsvariable" #: src/ui/gui/weight.ui:198 msgid "Current Status: " msgstr "Aktueller Status: " #. TRANSLATORS: This is the application name in the desktop file #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:7 #: src/ui/gui/org.fsf.pspp.desktop.in:7 msgid "GNU PSPP" msgstr "GNU PSPP" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:8 msgid "GNU PSPP is a program for statistical analysis of sampled data" msgstr "GNU PSPP ist ein Programm zur statistischen Analyse von Stichproben" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:10 msgid "" "GNU PSPP is a program for the statistical analysis of sampled data. It is a " "Free replacement for the proprietary program SPSS, and appears very similar " "to it with a few exceptions. The most important of these exceptions are, " "that there are no “time bombs”; your copy of PSPP will not “expire” or " "deliberately stop working in the future. Neither are there any artificial " "limits on the number of cases or variables which you can use. There are no " "additional packages to purchase in order to get “advanced” functions; all " "functionality that PSPP currently supports is in the core package." msgstr "" "GNU PSPP ist ein Programm zur statistischen Analyse von Stichproben. Es ist " "ein freier Ersatz für das proprietäre Programm SPSS. Es verhält sich " "abgesehen von einigen Ausnahmen sehr ähnlich. Die wichtigste Ausnahme ist: " "Es enthält keine „Zeitbomben“. Diese Kopie von PSPP wird nicht „auslaufen“ " "oder irgendwann in der Zukunft aufhören zu funktionieren. Weiterhin gibt es " "keine künstlichen Grenzen bei der Anzahl der Fälle oder der Variablen. Es " "gibt keine zusätzlichen Pakete, die man zunächst erwerben muss um " "„fortgeschrittene“ Funktionen benutzen zu können. Die gesamte " "Funktionalität, die PSPP derzeit unterstützt, ist hier enthalten." #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:11 msgid "" "PSPP is a stable and reliable application. It can perform descriptive " "statistics, T-tests, anova, linear and logistic regression, measures of " "association, cluster analysis, reliability and factor analysis, non-" "parametric tests and more. Its backend is designed to perform its analyses " "as fast as possible, regardless of the size of the input data. You can use " "PSPP with its graphical interface or the more traditional syntax commands." msgstr "" "PSPP ist eine stabile und zuverlässige Applikation. Man kann deskriptive " "Statistiken, T-Tests, ANOVA, lineare und logistische Regression, " "Zusammenhangsfaktoren, Clusteranalysen, Verlässlichkeits- und " "Faktoranalysen, nicht-parametrische Tests und vieles mehr berechnen. Das " "backend wurde für eine hohe Rechengeschwindigkeit auch bei großen zu " "verarbeitenden Datenmengen ausgelegt. Sie können PSPP mit der graphischen " "Oberfläche oder traditionell mit Kommandos verwenden." #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:12 msgid "A brief list of some of the PSPP's features." msgstr "Eine kurze Featureliste von PSPP." #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:14 msgid "Support for over 1 billion cases" msgstr "Verarbeitung von mehr als einer Milliarde Fällen" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:15 msgid "Support for over 1 billion variables" msgstr "Verarbeitung von mehr als einer Milliarde Variablen" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:16 msgid "Syntax and data files which are compatible with those of SPSS" msgstr "Syntax- und Datendateien sind kompatibel mit SPSS" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:17 msgid "A choice of terminal or graphical user interface" msgstr "Auswahl zwischen Terminal oder grafischer Benutzeroberfläche" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:18 msgid "A choice of text, postscript, pdf, opendocument or html output formats" msgstr "Text, Postscript, pdf, opendocument oder html als Ausgabeformate" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:19 msgid "" "Inter-operability with: LibreOffice, Apache OpenOffice, Gnumeric and other " "free software" msgstr "" "Interoperabel mit Libreoffice, Apache OpenOffice, Gnumeric und anderer " "freier Software" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:20 msgid "Easy data import from spreadsheets, text files and database sources" msgstr "Einfacher Datenimport aus Tabellen, Textdateien und Datenbankquellen" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:21 msgid "" "The capability to open, analyse and edit two or more datasets concurrently" msgstr "" "Möglichkeit zwei oder mehr Datensätze gleichzeitig zu öffnen und zu " "bearbeiten" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:22 msgid "A user interface supporting all common character sets" msgstr "Eine Benutzeroberfläche, die alle üblichen Zeichensätze unterstützt" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:23 msgid "A user interface has been translated to multiple languages" msgstr "Übersetzt in mehrere Sprachen" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:24 msgid "Very fast statistical procedures, even on very large data sets" msgstr "Schnelle statistische Berechnung auch bei sehr großen Datensätzen" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:25 msgid "No license fees and no expiration period" msgstr "Keine Lizenzgebühren oder zeitliche Befristung" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:26 msgid "No unethical “end user license agreements”" msgstr "Keine unethischen Lizenzvereinbarungen" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:27 msgid "A fully indexed user manual" msgstr "Ein voll indiziertes englisches Benutzerhandbuch" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:28 msgid "Freedom ensured; It is licensed under the GPLv3 or later" msgstr "Freiheit auch zukünftig gesichert. Lizensiert mit GPLv3 oder später" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:29 msgid "" "Portability; Runs on many different computers and many different operating " "systems" msgstr "" "Portabilität. Läuft auf vielen verschiedenen Computern und Betriebssystemen" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:31 msgid "" "PSPP is particularly aimed at statisticians, social scientists and students " "requiring fast convenient analysis of sampled data." msgstr "" "PSPP richtet sich insbesondere an Statistiker, Sozialforscher und Studenten, " "die eine schnelle und einfache Analyse von Stichprobendaten benötigen" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:41 msgid "GNU PSPP Variable View" msgstr "GNU PSPP Variablenansicht" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:54 msgid "Free Software Foundation" msgstr "" #: src/ui/gui/org.fsf.pspp.desktop.in:8 msgid "Statistical Software" msgstr "Statistische Software" #: src/ui/gui/org.fsf.pspp.desktop.in:9 msgid "Analyze statistical data with a free alternative to SPSS" msgstr "Analyse statistischer Daten mit einer freien Alternative zu SPSS" #. TRANSLATORS: Do not translate this string. Keep it as is, verbatim. #: src/ui/gui/org.fsf.pspp.desktop.in:12 msgid "pspp" msgstr "pspp" #. TRANSLATORS: You must keep all ";" - also at the end of line. #: src/ui/gui/org.fsf.pspp.desktop.in:17 msgid "statistics;analysis;spss;" msgstr "Statistik;Analyse;spss;" #~ msgid "Interactive shell not supported on this platform." #~ msgstr "" #~ "Interaktive Komandozeile wird auf dieser Plattform nicht unterstützt." #~ msgid "Error executing command: %s." #~ msgstr "Fehler beim Ausführen des Befehls: %s." #~ msgid "Sorry. The help system hasn't yet been implemented." #~ msgstr "Entschuldigung. Das Hilfesystem wurde noch nicht implementiert." #~ msgid "Details" #~ msgstr "Details" #~ msgid "Multiple dichotomy set" #~ msgstr "Mehrfachantworten-Set für Dichotomien" #~ msgid "Multiple category set" #~ msgstr "Mehrfachantworten-Set für kategoriale Daten" #~ msgid "Label source" #~ msgstr "Quelle der Beschriftungen" #~ msgid "First variable label among variables" #~ msgstr "Erstes Variablenbeschriftung in den Variablen" #~ msgid "Provided by user" #~ msgstr "Vom Benutzer angegeben" #~ msgid "Category label source" #~ msgstr "Quelle der Kategorienbeschreibung" #~ msgid "Variable labels" #~ msgstr "Variablenbeschriftung" #~ msgid "Value labels of counted value" #~ msgstr "Wertebeschriftungen des gezählten Werts" #~ msgid "Label:" #~ msgstr "Label:" #~ msgid "No label." #~ msgstr "Kein Label." #~ msgid "Product:" #~ msgstr "Produkt:" #~ msgid "Variables:" #~ msgstr "Variablen:" #~ msgid "Cases:" #~ msgstr "Fälle:" #~ msgid "Type:" #~ msgstr "Typ:" #~ msgid "Description" #~ msgstr "Beschreibung" #~ msgid "The active dataset does not have a file label." #~ msgstr "Das aktive Datenblatt hat keine Dateibezeichnung." #~ msgid "File label: %s" #~ msgstr "Dateibezeichnung: %s" #~ msgid "The active dataset dictionary does not contain any documents." #~ msgstr "Das Codebuch des aktuellen Datenblatts besitzt keine Dokumente." #~ msgid "Documents in the active dataset:" #~ msgstr "Dokumente im aktuellen Datenblatt:" #~ msgid "Custom data file attributes." #~ msgstr "Benutzerdefinierte Attribute der Datendatei." #~ msgid "Label: %s\n" #~ msgstr "Label: %s\n" #~ msgid "Format: %s\n" #~ msgstr "Format: %s\n" #~ msgid "Print Format: %s\n" #~ msgstr "Druckformat: %s\n" #~ msgid "Write Format: %s\n" #~ msgstr "Schreibformat: %s\n" #~ msgid "Measure: %s\n" #~ msgstr "Skalenniveau: %s\n" #~ msgid "Role: %s\n" #~ msgstr "Rolle: %s\n" #~ msgid "Display Alignment: %s\n" #~ msgstr "Anzeigeausrichtung: %s\n" #~ msgid "Display Width: %d\n" #~ msgstr "Anzeigebreite: %d\n" #~ msgid "Missing Values: " #~ msgstr "Fehlende Werte:" #~ msgid "Unknown TABLECELLS class" #~ msgstr "Unbekannte Klasse von TABLECELLS" #~ msgid "Exact Sig. (%d-tailed)" #~ msgstr "Exakte Sig. (%d-seitig)" #~ msgid "Valid N" #~ msgstr "Gültige N" #~ msgid "Missing N" #~ msgstr "Fehlende N" #~ msgid "Valid cases = %.*g; cases with missing value(s) = %.*g." #~ msgstr "Gültige Fälle = %.*g; Fälle mit fehlenden Werten = %.*g." #~ msgid "%g" #~ msgstr "%g" #~ msgid "%d" #~ msgstr "%d" #~ msgid "%zu" #~ msgstr "%zu" #~ msgid "50 (Median)" #~ msgstr "50 (Median)" #~ msgid "(%d)" #~ msgstr "(%d)" #~ msgid "Min" #~ msgstr "Min" #~ msgid "Max" #~ msgstr "Max" #~ msgid "%g%%" #~ msgstr "%g%%" #~ msgid "25th" #~ msgstr "25tes" #~ msgid "50th (Median)" #~ msgstr "50tes (Median)" #~ msgid "75th" #~ msgstr "75tes" #~ msgid "(I) %s" #~ msgstr "(I) %s" #~ msgid "(J) %s" #~ msgstr "(J) %s" #~ msgid "(I - J)" #~ msgstr "(I - J)" #~ msgid "%s into %s(%s of %s using %s BY %s)" #~ msgstr "%s zu %s(%s von %s mit %s BY %s)" #~ msgid "%s into %s(%s of %s BY %s)" #~ msgstr "%s zu %s(%s von %s BY %s)" #~ msgid "%s into %s(%s of %s using %s)" #~ msgstr "%s zu %s(%s von %s mit %s)" #~ msgid "%s into %s(%s of %s)" #~ msgstr "%s zu %s(%s von %s)" #~ msgid "Area Under the Curve (%s)" #~ msgstr "Fläche unter der Kurve (%s)" #~ msgid "Coordinates of the Curve (%s)" #~ msgstr "Koordinaten der Kurve (%s)" #~ msgid "Std. Error Mean" #~ msgstr "Std.fehler des Mittelwertes" #~ msgid "(active dataset)" #~ msgstr "(aktiver Datensatz)" #~ msgid "Writing %zu record to %s." #~ msgid_plural "Writing %zu records to %s." #~ msgstr[0] "%zu Eintrag wird in %s geschrieben." #~ msgstr[1] "%zu Einträge werden in %s geschrieben." #~ msgid "Writing %zu record." #~ msgid_plural "Writing %zu records." #~ msgstr[0] "%zu Eintrag wird geschrieben." #~ msgstr[1] "%zu Einträge werden geschrieben." #~ msgid "Unsupported compression type (%d)" #~ msgstr "Komprimierungstyp (%d) wird nicht unterstützt" #~ msgid "Failed to seek to end of central directory record: %s" #~ msgstr "" #~ "Fehler bei der Suche nach dem Ende des Hauptverzeichnis-Eintrags: %s" #~ msgid "Failed to seek to central directory: %s" #~ msgstr "Fehler bei der Suche nach dem Hauptverzeichnis: %s" #~ msgid "Failed to seek to start of member `%s': %s" #~ msgstr "Fehler bei der Suche des Anfangs des Elements `%s': %s" #~ msgid "ascii: closing output file `%s'" #~ msgstr "ASCII: die Ausgabedatei `%s' wird geschlossen" #~ msgid "%s - Page %d" #~ msgstr "%s - Seite %d" #~ msgid "bad vline: x=%d+%d=%d y=(%d+%d=%d,%d+%d=%d) in table size (%d,%d)\n" #~ msgstr "" #~ "falsche Angabe vline: x=%d+%d=%d y=(%d+%d=%d,%d+%d=%d) in der Tabellen " #~ "der Größe (%d,%d)\n" #~ msgid "bad hline: x=(%d+%d=%d,%d+%d=%d) y=%d+%d=%d in table size (%d,%d)\n" #~ msgstr "" #~ "falsche Angabe hline: x=(%d+%d=%d,%d+%d=%d) y=%d+%d=%d in der Tabell der " #~ "Größe (%d,%d)\n" #~ msgid "" #~ "bad box: (%d+%d=%d,%d+%d=%d)-(%d+%d=%d,%d+%d=%d) in table size (%d,%d)\n" #~ msgstr "" #~ "falsche Angabe box: (%d+%d=%d,%d+%d=%d)-(%d+%d=%d,%d+%d=%d) in Tabelle " #~ "der Größe (%d,%d)\n" #~ msgid "can only convert encrypted data file to sav or sys format" #~ msgstr "" #~ "verschlüsselte Datendateien können nur ins .sav oder .sys Format " #~ "konvertiert werden" #~ msgid "can only convert encrypted syntax file to sps format" #~ msgstr "" #~ "nur verschlüsselte Syntaxdateien können nur ins .sps Format konvertiert " #~ "werden" #~ msgid "count" #~ msgstr "Anzahl" #~ msgid "expected" #~ msgstr "Erwartet" #~ msgid "residual" #~ msgstr "Residual" #~ msgid "std. resid." #~ msgstr "Std. Resid." #~ msgid "adj. resid." #~ msgstr "Korr. Resid." #~ msgid "Chi-square tests." #~ msgstr "Chi-Quadrat Tests." #~ msgid "Odds Ratio for %s (%.*s / %.*s)" #~ msgstr "Quotenverhältnis für %s (%.*s / %.*s)" #~ msgid "For cohort %s = %.*s" #~ msgstr "Für Kohorte %s = %.*s" #~ msgid "Support for %s files was not compiled into this installation of PSPP" #~ msgstr "" #~ "Unterstützung für %s Dateien ist nicht in dieser PSPP Installation " #~ "enthalten." #~ msgid "Cannot parse field content `%.*s' as format %s: %s" #~ msgstr "Der Feldinhalt `%.*s' kann nicht als Format %s geparst werden: %s" #~ msgid "This input line has too few separators to fill in this field." #~ msgstr "" #~ "Diese Datenzeile besitzt zu wenig Trennzeichen um dieses Feld zu füllen." #~ msgid "An error occurred reading the spreadsheet file." #~ msgstr "Beim Schreiben des Tabellendokuments ist ein Fehler aufgetreten." #~ msgid "Enter a number to add a new variable." #~ msgstr "Geben Sie eine Zahl ein, um eine neue Variable hinzuzufügen." #~ msgid "Enter a number to add a new case." #~ msgstr "Geben Sie eine Zahl ein, um einen neuen Fall hinzuzufügen." #~ msgid "Cannot create variable." #~ msgstr "Variable kann nicht erstellt werden." #~ msgid "\"%s\" is not a valid variable name." #~ msgstr "\"%s\" ist kein gültiger Variablenname" #~ msgid "This dictionary already contains a variable named \"%s\"." #~ msgstr "Das Codebuch enthält bereits eine Variable mit dem Namen \"%s\"." #~ msgid "Cannot rename variable." #~ msgstr "Änderung des Variablennamens nicht möglich." #~ msgid "Enter a variable name to add a new variable." #~ msgstr "" #~ "Geben Sie einen Variablennamen ein, um eine neue Variable hinzuzufügen" #~ msgid "{%s, %s}\n" #~ msgstr "{%s,%s}\n" #~ msgid "Multiple response set name `%s' does not begin with `$'." #~ msgstr "Name des Mehrfachantwort-Sets `%s' beginnt nicht mit `$'." #~ msgid "could not access definition for terminal `%s'" #~ msgstr "" #~ "Auf die Eigenschaften des Terminals `%s' konnte nicht zugegriffen werden." #~ msgid "" #~ "PSPPIRE, a GUI for PSPP, a program for statistical analysis of sampled " #~ "data.\n" #~ "Usage: %s [OPTION]... FILE\n" #~ "\n" #~ "Arguments to long options also apply to equivalent short options.\n" #~ "\n" #~ "GUI options:\n" #~ " -q, --no-splash don't show splash screen during startup\n" #~ "\n" #~ "%sLanguage options:\n" #~ " -I, --include=DIR append DIR to search path\n" #~ " -I-, --no-include clear search path\n" #~ " -a, --algorithm={compatible|enhanced}\n" #~ " set to `compatible' if you want output\n" #~ " calculated from broken algorithms\n" #~ " -x, --syntax={compatible|enhanced}\n" #~ " set to `compatible' to disable PSPP " #~ "extensions\n" #~ " -i, --interactive interpret syntax in interactive mode\n" #~ " -s, --safer don't allow some unsafe operations\n" #~ "Default search path: %s\n" #~ "\n" #~ "Informative output:\n" #~ " -h, --help display this help and exit\n" #~ " -V, --version output version information and exit\n" #~ "\n" #~ "A non-option argument is interpreted as a data file in .sav or .zsav or ." #~ "por\n" #~ "format or a syntax file to load.\n" #~ msgstr "" #~ "PSPPIRE, eine grafische Oberfläche für PSPP, ein Programm zur " #~ "statistischen Analyse von Stichprobendaten.\n" #~ "Befehl: %s [OPTION]... DATEI\n" #~ "\n" #~ "Die gezeigten Argumente für die Langform der Optionen finden auch in der " #~ "entsprechenden Kurzform der Optionen Anwendung.\n" #~ "\n" #~ "GUI Optionen:\n" #~ " -q, --no-splash Begrüßungsbildschirm soll beim Start nicht " #~ "gezeigt werden\n" #~ "\n" #~ "%sSprachoptionen:\n" #~ " -I, --include=VERZEICHNIS füge das VERZEICHNIS dem Suchpfad " #~ "hinzu\n" #~ " -I-, --no-include Löschung des Suchpfads\n" #~ " -a, --algorithm={compatible|enhanced}\n" #~ " auf `compatible' setzen, um auch von " #~ "fehlerhaften\n" #~ " Algorithmen Ausgaben erzeugen zu lassen\n" #~ " -x, --syntax={compatible|enhanced}\n" #~ " auf `compatible' setzen, um PSPP-" #~ "Erweiterungen auszuschalten\n" #~ " -i, --interactive interpretiere die Syntax im interaktiven " #~ "Modus\n" #~ " --syntax-encoding=KODIERUNG legt die Kodierung der Syntaxdatei fest\n" #~ " -s, --safer unterbindet unsichere Operationen\n" #~ "Voreigestellter Suchpfad: %s\n" #~ "\n" #~ "Information:\n" #~ " -h, --help Anzeige dieses Hilfetextes\n" #~ " -V, --version Anzeige der Versionsinformationen\n" #~ "\n" #~ "Ein Argument ohne Optionen wird als Datendatei im .sav oder .zsav Format " #~ "interpretiert\n" #~ "oder als Syntaxdatei, die ausgeführt wird.\n" #~ msgid "_Reset" #~ msgstr "_Zurücksetzen" #~ msgid "_Select" #~ msgstr "A_swählen" #~ msgid "Delete the variables at the selected position(s)" #~ msgstr "Die ausgewählte(n) Variable(n) löschen" #~ msgid "Delete the cases at the selected position(s)" #~ msgstr "Lösche Fälle in den/der ausgewählten Position(en)" #~ msgid "_Open..." #~ msgstr "Ö_ffnen..." #~ msgid "Transpose the cases with the variables" #~ msgstr "Transponiert die Fälle mit den Variablen" #~ msgid "Aggregate the case values into a new variable" #~ msgstr "Zusammenführung der Werte in einer neuen Variable" #~ msgid "Choose a subset of cases for analysis" #~ msgstr "Wählen Sie einen Teil der Fälle zur Analyse aus" #~ msgid "All" #~ msgstr "Alles" #~ msgid "expecting number or data string" #~ msgstr "erwarte Zahl oder Zeichenkette" #~ msgid "Number of clusters may not be larger than the number of cases." #~ msgstr "Anzahl der Cluster darf nicht größer als die Anzahl der Fälle sein." #~ msgid "Value of %s must be between 1 and 100." #~ msgstr "Der Wert von %s muss zwischen 1 und 100 liegen." #~ msgid "TreeView path" #~ msgstr "TreeView-Pfad" #~ msgid "The path to the row in the GtkTreeView, as a string" #~ msgstr "Der Pfad zu der Zeile im Gtk TreeView als String" #~ msgid "Diagonal slash" #~ msgstr "Diagonaler Strich" #~ msgid "Whether to draw a diagonal slash across the button." #~ msgstr "Ob ein diagonaler Strich über den Button gezeichnet werden soll." #~ msgid "Incorrect value for variable type" #~ msgstr "Ungültiger Wert für Variablentyp" #~ msgid "Font Selection" #~ msgstr "Schriftarten" #~ msgid "Import Delimited Text Data" #~ msgstr "Textdaten importieren" #~ msgid "(optional case selection condition)" #~ msgstr "(optionale Fallauswahlbedingung)" #~ msgid "Importing Textual Data" #~ msgstr "Import von Textdaten" #~ msgid "Doubled quote mark treated as escape" #~ msgstr "Aufeinanderfolgende Texterkennungszeichen als ein Zeichen behandeln" #~ msgid "Bar charts are not implemented." #~ msgstr "Balkendiagramme sind noch nicht implementiert." #~ msgid "No valid data for variable %s; statistics not displayed." #~ msgstr "" #~ "Keine gültigen Daten für Variable %s; Statistiken werden nicht angezeigt." #~ msgid "Label: %s" #~ msgstr "Label: %s" #~ msgid "Type: %s\n" #~ msgstr "Typ: %s\n" #~ msgid "Missing Values: %s\n" #~ msgstr "Fehlende Werte: %s\n" #~ msgid "Value Labels:\n" #~ msgstr "Wertelabel:\n" #~ msgid "%s %s\n" #~ msgstr "%s %s\n" #~ msgid "Variables %s specified multiple times on %s subcommand." #~ msgstr "Die Variablen %s wurden im Unterbefehl %s mehrfach angegeben." #~ msgid "Variables %s specified on %s but not on %s." #~ msgstr "Die Variablen %s wurden unter %s angegeben, aber nicht unter %s." #~ msgid "> Median" #~ msgstr "> Median" # not shown in output #~ msgid "Cases < Test Value" #~ msgstr "Fälle < Testwert" # not shown in application #~ msgid "<b>Histograms</b>" #~ msgstr "<b>Histogramme</b>" #~ msgid "<b>Pie Charts</b>" #~ msgstr "<b>Kreisdiagramme</b>" #~ msgid "<b>Separators</b>" #~ msgstr "<b>Trennzeichen</b>" #~ msgid "<b>Quoting</b>" #~ msgstr "<b>Texterkennung</b>" #~ msgid "<b>Variables</b>" #~ msgstr "<b>Variablen</b>" #~ msgid "Charset:" #~ msgstr "Zeichensatz:" #~ msgid "on" #~ msgstr "an" #~ msgid "off" #~ msgstr "aus" #~ msgid "_Options" #~ msgstr "_Optionen" #~ msgid "REGRESSION requires numeric variables." #~ msgstr "REGRESSION benötigt numerische Variablen." #~ msgid "Statistics..." #~ msgstr "Statistiken..." #~ msgid "Exclude cases listwise" #~ msgstr "Listenweiser Fallausschluss" #~ msgid "By:" #~ msgstr "Gruppieren nach:" #~ msgid "Rankit" #~ msgstr "Rankit" #~ msgid "_Import Delimited Text Data..." #~ msgstr "Textdaten importieren..." #~ msgid "Linear _Regression..." #~ msgstr "Lineare Regression..." #~ msgid "Processor Area" #~ msgstr "Prozessor Status Bereich" #, fuzzy #~ msgid "`(' expected." #~ msgstr "Erwarteter Wert" #, fuzzy #~ msgid "Variables cannot be parsed" #~ msgstr "Variablenlabel" #, fuzzy #~ msgid "`)' expected." #~ msgstr "Erwarteter Wert" #, fuzzy #~ msgid "No label" #~ msgstr "Label" #, fuzzy #~ msgid "Suppress value labels" #~ msgstr "Ein- / Ausblenden der Wertelabels" #, fuzzy #~ msgid "Labeling" #~ msgstr "Label" #, fuzzy #~ msgid "Model:\t" #~ msgstr "Modell" pspp-1.4.1/po/automake.mk0000644000175000017500000000772413725012634014705 0ustar00blpblp00000000000000# PSPP - a program for statistical analysis. # Copyright (C) 2017, 2020 Free Software Foundation, Inc. # # 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 3 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, see . # include $(top_srcdir)/po/Makevars XGETTEXT=xgettext MSGMERGE=msgmerge MSGFMT=msgfmt POFILES = \ po/ca.po \ po/de.po \ po/el.po \ po/es.po \ po/fr.po \ po/gl.po \ po/hu.po \ po/ja.po \ po/lt.po \ po/nl.po \ po/pl.po \ po/pt_BR.po \ po/ru.po \ po/sl.po \ po/tr.po \ po/uk.po \ po/zh_CN.po LOCALPOFILES = po/cs.po POTFILE=po/$(DOMAIN).pot TRANSLATABLE_FILES = $(DIST_SOURCES) $(all_q_sources) XGETTEXT_OPTIONS = \ --copyright-holder="$(COPYRIGHT_HOLDER)" \ --package-name=$(PACKAGE) \ --package-version=$(VERSION) \ --msgid-bugs-address=$(MSGID_BUGS_ADDRESS) \ --from-code=UTF-8 \ --add-comments='TRANSLATORS:' \ --directory=$(top_srcdir) ALL_TRANSLATABLE_FILES = \ $(TRANSLATABLE_FILES) \ $(UI_FILES) \ src/ui/gui/org.fsf.pspp.metainfo.xml.in \ src/ui/gui/org.fsf.pspp.desktop.in $(POTFILE): $(ALL_TRANSLATABLE_FILES) Makefile @$(MKDIR_P) po $(AM_V_GEN)$(XGETTEXT) $(XGETTEXT_OPTIONS) $(TRANSLATABLE_FILES) --language=C --keyword=_ --keyword=N_ -o $@,tmp $(AM_V_at)$(XGETTEXT) $(XGETTEXT_OPTIONS) -j $(UI_FILES) --language=Glade -o $@,tmp $(AM_V_at)$(XGETTEXT) $(XGETTEXT_OPTIONS) -j src/ui/gui/org.fsf.pspp.metainfo.xml.in -o $@,tmp $(AM_V_at)$(XGETTEXT) $(XGETTEXT_OPTIONS) -j src/ui/gui/org.fsf.pspp.desktop.in -o $@,tmp $(AM_V_at)$(SED) -e '/^"POT-Creation-Date: .*/d' $@,tmp > $@ rm -f $@,tmp $(LOCALPOFILES) $(POFILES): $(POTFILE) $(AM_V_GEN)$(MSGMERGE) --previous --quiet $(top_srcdir)/$@ $? -o $@,tmp $(AM_V_at)if test -e $(top_srcdir)/$@,aux ; then \ touch $@,tmp ; \ msgcat --use-first $(top_srcdir)/$@,aux $@,tmp -o $@,tmp; \ fi ; $(AM_V_at)$(SED) -e '/^"POT-Creation-Date: /d' $@,tmp > $@,tmp2 $(RM) $@,tmp $(MSGFMT) -c $@,tmp2 -o - > /dev/null mv $@,tmp2 $@ SUFFIXES += .po .gmo .po.gmo: @$(MKDIR_P) `dirname $@` $(AM_V_GEN)$(MSGFMT) $< -o $@ GMOFILES = $(LOCALPOFILES:.po=.gmo) $(POFILES:.po=.gmo) ALL_LOCAL += $(GMOFILES) install-data-hook: $(GMOFILES) for f in $(GMOFILES); do \ lang=`echo $$f | $(SED) -e 's%po/\(.*\)\.gmo%\1%' ` ; \ $(MKDIR_P) $(DESTDIR)$(prefix)/share/locale/$$lang/LC_MESSAGES; \ $(INSTALL_DATA) $$f $(DESTDIR)$(prefix)/share/locale/$$lang/LC_MESSAGES/$(DOMAIN).mo ; \ done uninstall-hook: for f in $(GMOFILES); do \ lang=`echo $$f | $(SED) -e 's%po/\(.*\)\.gmo%\1%' ` ; \ rm -f $(DESTDIR)$(prefix)/share/locale/$$lang/LC_MESSAGES/$(DOMAIN).mo ; \ done EXTRA_DIST += \ $(LOCALPOFILES) \ $(POFILES) \ $(POTFILE) \ po/LINGUAS \ po/ChangeLog \ po/cs.po,aux CLEANFILES += $(GMOFILES) $(POTFILE) # Clean $(POFILES) from build directory but not if that's the same as # the source directory. po_CLEAN: @if test "$(srcdir)" != .; then \ echo rm -f $(LOCALPOFILES) $(POFILES); \ rm -f $(LOCALPOFILES) $(POFILES); \ fi CLEAN_LOCAL += po_CLEAN # Download the po files from http://translationproject.org # The final action to this rule is to remove the .pot file. This # is because the po files must be re-merged against an updated version of it. PHONY += po-update po-update: $(POFILES) for p in $^; do \ wget --recursive --level=1 --accept=po --no-directories --no-use-server-timestamps \ --directory-prefix=po -O ${top_srcdir}/$$p,tmp \ https://translationproject.org/latest/pspp/`basename $$p` ; \ mv ${top_srcdir}/$$p,tmp ${top_srcdir}/$$p; \ done $(RM) $(POTFILE) pspp-1.4.1/po/ja.po0000644000175000017500000124126313725012645013501 0ustar00blpblp00000000000000# Japanese translations for pspp package. # Copyright (C) 2013 Free Software Foundation, Inc. # This file is distributed under the same license as the pspp package. # Tetsuya Suga , 2013. # msgid "" msgstr "" "Project-Id-Version: pspp 0.10.2\n" "Report-Msgid-Bugs-To: pspp-dev@gnu.org\n" "PO-Revision-Date: 2016-09-15 16:33+0900\n" "Last-Translator: Tetsuya Suga \n" "Language-Team: Japanese \n" "Language: ja\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Bugs: Report translation errors to the Language-Team address.\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: Poedit 1.8.9\n" #: src/data/any-reader.c:72 src/data/encrypted-file.c:78 #, c-format msgid "An error occurred while opening `%s': %s." msgstr "`%s' を開くときにエラーが発生しました: %s." #: src/data/any-reader.c:93 src/language/lexer/lexer.c:1633 #, c-format msgid "Error reading `%s': %s." msgstr "`%s' を読み込み中にエラー: %s" #: src/data/any-reader.c:114 #, c-format msgid "`%s' is not a system or portable file." msgstr "`%s' はシステムファイルまたはポータブルファイルではありません." #: src/data/any-reader.c:123 src/data/any-writer.c:66 msgid "The inline file is not allowed here." msgstr "ここではインラインファイルは使えません." #: src/data/any-reader.c:205 #, c-format msgid "" "Cannot read from dataset %s because no dictionary or data has been written " "to it yet." msgstr "ディクショナリかデータが未記入のためデータセット %s から読めません." #: src/data/any-reader.c:260 src/language/data-io/dataset.c:253 msgid "Dataset" msgstr "データセット" #: src/data/calendar.c:100 #, c-format msgid "Month %d is not in acceptable range of 0 to 13." msgstr "月 %d が 0 から 13 の範囲外です." #: src/data/calendar.c:110 #, c-format msgid "Day %d is not in acceptable range of 0 to 31." msgstr "日 %d が 0 から 31 の範囲外です." #: src/data/calendar.c:119 #, c-format msgid "Date %04d-%d-%d is before the earliest acceptable date of 1582-10-15." msgstr "日付 %04d-%d-%d は許容される1582-10-15より前です." #: src/data/casereader-filter.c:221 msgid "" "At least one case in the data read had a weight value that was user-missing, " "system-missing, zero, or negative. These case(s) were ignored." msgstr "" "読み込まれたデータのうち少なくとも1つのケースの重み付け値はユーザ欠損値または" "システム欠損値,ゼロ,負です.これらのケースは無視されます." #. TRANSLATORS: this fragment will be interpolated into messages in fh_lock() #. that identify types of files. #: src/data/csv-file-writer.c:138 msgid "CSV file" msgstr "コンマ区切りデータ(CSV)ファイル" #: src/data/csv-file-writer.c:146 #, fuzzy, c-format #| msgid "Error opening `%s' for writing as a system file: %s." msgid "Error opening `%s' for writing as a CSV file: %s." msgstr "システムファイルとして書き込むために開く `%s' でエラー: %s." #: src/data/csv-file-writer.c:453 #, c-format msgid "An I/O error occurred writing CSV file `%s'." msgstr "CSV ファイル `%s' の書き込み中にエラーが発生しました." #: src/data/data-in.c:175 #, c-format msgid "Data is not valid as format %s: %s" msgstr "データはフォーマット %s としては有効でありません: %s" #: src/data/data-in.c:377 src/data/data-in.c:553 msgid "Field contents are not numeric." msgstr "フィールドは数値ではありません." #: src/data/data-in.c:379 src/data/data-in.c:555 msgid "Number followed by garbage." msgstr "不要データを伴う数値" #: src/data/data-in.c:392 msgid "Invalid numeric syntax." msgstr "不正な数値シンタックス" #: src/data/data-in.c:400 src/data/data-in.c:571 msgid "Too-large number set to system-missing." msgstr "大きすぎる数値がシステム欠損値に指定されています." #: src/data/data-in.c:406 src/data/data-in.c:577 msgid "Too-small number set to zero." msgstr "小さすぎる数値は0とします." #: src/data/data-in.c:426 msgid "All characters in field must be digits." msgstr "フィールド中のすべての文字は数字に限ります." #: src/data/data-in.c:445 msgid "Unrecognized character in field." msgstr "フィールド中に認識できない文字があります." #: src/data/data-in.c:466 src/data/data-in.c:729 msgid "Field must have even length." msgstr "フィールド長は偶数です." #: src/data/data-in.c:468 src/data/data-in.c:732 msgid "Field must contain only hex digits." msgstr "フィールド内は 16 進数文字に限ります." #: src/data/data-in.c:544 msgid "Invalid zoned decimal syntax." msgstr "不正なゾーン10進数シンタックス." #: src/data/data-in.c:644 src/data/data-in.c:650 msgid "Invalid syntax for P field." msgstr "Pフィールドでの不正なシンタックス" #: src/data/data-in.c:768 src/data/data-in.c:818 msgid "Syntax error in date field." msgstr "データフィールドでのシンタックスエラー" #: src/data/data-in.c:783 #, c-format msgid "Day (%ld) must be between 1 and 31." msgstr "日(%ld)は1から31でなければなりません." #: src/data/data-in.c:832 msgid "Delimiter expected between fields in date." msgstr "日付のフィールド間には区切り記号が必要です." #: src/data/data-in.c:906 msgid "" "Unrecognized month format. Months may be specified as Arabic or Roman " "numerals or as at least 3 letters of their English names." msgstr "" "月フォーマットが識別不能.月はアラビアまたはローマ数字,少なくと3文字以上の英" "語名で指定します." #: src/data/data-in.c:933 #, c-format msgid "Year (%ld) must be between 1582 and 19999." msgstr "年(%ld)は 1582 から 19999 の範囲内です." #: src/data/data-in.c:944 #, c-format msgid "Trailing garbage `%.*s' following date." msgstr "日付の後に不要データ `%.*s' が続いています." #: src/data/data-in.c:958 msgid "Julian day must have exactly three digits." msgstr "ユリウス通日は必ず3文字でなければなりません." #: src/data/data-in.c:960 #, c-format msgid "Julian day (%ld) must be between 1 and 366." msgstr "ユリウス通日(%ld)は1から366でなければなりません." #: src/data/data-in.c:984 #, c-format msgid "Quarter (%ld) must be between 1 and 4." msgstr "四半期(%ld)は1から4の範囲内です." #: src/data/data-in.c:1005 #, c-format msgid "Week (%ld) must be between 1 and 53." msgstr "週(%ld)は 1 から 53 の範囲内です." #: src/data/data-in.c:1017 msgid "Delimiter expected between fields in time." msgstr "時間フィールド間には区切りが必要です." #: src/data/data-in.c:1037 #, c-format msgid "Minute (%ld) must be between 0 and 59." msgstr "分(%ld)は 0 から 59 の範囲内です." #: src/data/data-in.c:1075 msgid "" "Unrecognized weekday name. At least the first two letters of an English " "weekday name must be specified." msgstr "曜日が識別不能.英語の少なくとも最初の2文字で指定します." #: src/data/data-in.c:1210 #, c-format msgid "`%c' expected in date field." msgstr "日付フィールドには `%c' が必要です." #: src/data/data-out.c:580 #, c-format msgid "Weekday number %f is not between 1 and 7." msgstr "曜日(%f)が 1 から 7 の範囲外です." #: src/data/data-out.c:605 #, c-format msgid "Month number %f is not between 1 and 12." msgstr "月(%f)が1から12の範囲外です." #. TRANSLATORS: this fragment will be interpolated into #. messages in fh_lock() that identify types of files. #: src/data/dataset-writer.c:66 src/language/data-io/file-handle.c:304 msgid "dataset" msgstr "データセット" #: src/data/dict-class.c:52 msgid "ordinary" msgstr "通常の" #: src/data/dict-class.c:54 msgid "system" msgstr "システム" #: src/data/dict-class.c:56 msgid "scratch" msgstr "消去" #: src/data/dictionary.c:1523 #, c-format msgid "Truncating document line to %d bytes." msgstr "ドキュメント行を %d バイトに縮めました." #: src/data/encrypted-file.c:89 #, c-format msgid "An error occurred while reading `%s': %s." msgstr "`%s' を読み込み中にエラーが発生しました: %s." #: src/data/encrypted-file.c:430 #, c-format msgid "" "%s: encrypted file corrupted (ends in incomplete %u-byte ciphertext block)" msgstr "" #: src/data/encrypted-file.c:449 #, c-format msgid "%s: encrypted file corrupted (ends with bad padding)" msgstr "" #: src/data/file-handle-def.c:283 src/language/data-io/dataset.c:266 msgid "active dataset" msgstr "アクティブなデータセット" #: src/data/file-handle-def.c:518 #, c-format msgid "Can't read from %s as a %s because it is already being read as a %s." msgstr "%s から %s として読み込めません(すでに %s として読み込み済みです)." #: src/data/file-handle-def.c:522 #, c-format msgid "Can't write to %s as a %s because it is already being written as a %s." msgstr "%s に %s として書き込めません(すでに %s として書き込み済みです)." #: src/data/file-handle-def.c:529 #, c-format msgid "Can't re-open %s as a %s." msgstr "%s を %s として再オープンできません." #: src/data/file-name.c:133 #, c-format msgid "Not opening pipe file `%s' because %s option set." msgstr "パイプファイル %s が開けません.%s オプションが指定されています." #: src/data/format.c:339 msgid "Input format" msgstr "入力フォーマット" #: src/data/format.c:339 msgid "Output format" msgstr "出力フォーマット" #: src/data/format.c:342 #, c-format msgid "Format %s may not be used for input." msgstr "フォーマット %s は入力では使えません." #: src/data/format.c:349 #, c-format msgid "%s specifies width %d, but %s requires an even width." msgstr "%s は横幅 %d と指定,しかし %s は偶数幅を必要としています." #: src/data/format.c:358 #, c-format msgid "%s %s specifies width %d, but %s requires a width between %d and %d." msgstr "" "%s %s は横幅 %dと指定,しかし %s は %d から %d の横幅を必要としています." #: src/data/format.c:367 #, c-format msgid "%s %s specifies %d decimal place, but %s does not allow any decimals." msgid_plural "" "%s %s specifies %d decimal places, but %s does not allow any decimals." msgstr[0] "" "%s %s は小数点位置 %d を指定しますが,%s では小数は許されていません." #: src/data/format.c:378 #, c-format msgid "" "%s %s specifies %d decimal place, but the given width allows at most %d " "decimals." msgid_plural "" "%s %s specifies %d decimal places, but the given width allows at most %d " "decimals." msgstr[0] "" "%s %s は 小数点位置 %d を指定しますが,指定の横幅では最大 %d 桁の小数しか許さ" "れません." #: src/data/format.c:385 #, c-format msgid "" "%s %s specifies %d decimal place, but the given width does not allow for any " "decimals." msgid_plural "" "%s %s specifies %d decimal places, but the given width does not allow for " "any decimals." msgstr[0] "" "%s %s は小数点位置 %d を指定しますが,指定の横幅では小数はまったく許されてい" "ません." #: src/data/format.c:424 #, c-format msgid "%s variables are not compatible with %s format %s." msgstr "%s 変数は %s フォーマット %s に適合しません." #: src/data/format.c:425 src/data/format.c:1074 #: src/ui/gui/var-type-dialog.ui:167 msgid "String" msgstr "文字列" #: src/data/format.c:425 src/data/format.c:1035 #: src/ui/gui/var-type-dialog.ui:48 msgid "Numeric" msgstr "数値" #: src/data/format.c:426 src/data/sys-file-reader.c:2212 #: src/data/sys-file-reader.c:2214 src/language/xforms/recode.c:512 #: src/language/xforms/recode.c:513 src/language/xforms/recode.c:525 #: src/language/xforms/recode.c:526 #: src/language/dictionary/apply-dictionary.c:77 #: src/language/dictionary/apply-dictionary.c:78 msgid "numeric" msgstr "数値" #: src/data/format.c:426 src/data/sys-file-reader.c:2212 #: src/data/sys-file-reader.c:2214 src/language/xforms/recode.c:512 #: src/language/xforms/recode.c:513 src/language/xforms/recode.c:525 #: src/language/xforms/recode.c:526 #: src/language/dictionary/apply-dictionary.c:77 #: src/language/dictionary/apply-dictionary.c:78 msgid "string" msgstr "文字列" #: src/data/format.c:444 #, c-format msgid "String variable with width %d is not compatible with format %s." msgstr "長さ %d の文字型変数はフォーマット %s に適合しません." #: src/data/format.c:1038 src/ui/gui/var-type-dialog.ui:65 msgid "Comma" msgstr "コンマ" #: src/data/format.c:1041 src/ui/gui/var-type-dialog.ui:82 msgid "Dot" msgstr "ドット" #: src/data/format.c:1044 msgid "Scientific" msgstr "科学的" #: src/data/format.c:1061 src/ui/gui/var-type-dialog.ui:116 msgid "Date" msgstr "日付" #: src/data/format.c:1064 src/ui/gui/var-type-dialog.ui:133 msgid "Dollar" msgstr "ドル通貨" #: src/data/format.c:1071 msgid "Custom" msgstr "カスタム" #: src/data/gnumeric-reader.c:478 src/data/ods-reader.c:505 #, c-format msgid "Cannot convert the value in the spreadsheet cell %s to format (%s): %s" msgstr "表計算ファイル中のセル %s の値をフォーマット(%s)に変換できません: %s" #: src/data/gnumeric-reader.c:502 src/data/ods-reader.c:567 #, c-format msgid "" "There was a problem whilst reading the %s file `%s' (near line %d): `%s'" msgstr "%s ファイル `%s’(%d 行付近)を読み込み中に問題が発生しました: `%s' " #: src/data/gnumeric-reader.c:597 #, c-format msgid "" "The gnumeric file `%s' is encoded as %s instead of the usual UTF-8 encoding. " "Any non-ascii characters will be incorrectly imported." msgstr "" "グニューメリックファイル `%s' は通常の UTF-8 ではなく %s でエンコードされてい" "ます.非アスキー文字は不正に読み込まれます." #: src/data/gnumeric-reader.c:641 src/data/ods-reader.c:682 #, c-format msgid "Invalid cell range `%s'" msgstr "不正なセル範囲 `%s'" #: src/data/gnumeric-reader.c:813 src/data/ods-reader.c:710 #: src/data/ods-reader.c:843 #, c-format msgid "Selected sheet or range of spreadsheet `%s' is empty." msgstr "表計算ファイル `%s' の選択されたシートまたは範囲は空です." #: src/data/identifier2.c:60 #, c-format msgid "Identifier `%s' exceeds %d-byte limit." msgstr "識別子 `%s' は %d バイト制限を超えています." #: src/data/identifier2.c:84 msgid "Identifier cannot be empty string." msgstr "識別子が空の文字列ではいけません." #: src/data/identifier2.c:92 #, c-format msgid "`%s' may not be used as an identifier because it is a reserved word." msgstr "予約語であるため `%s' は識別子として使えません." #: src/data/identifier2.c:103 #, c-format msgid "" "`%s' may not be used as an identifier because it contains ill-formed UTF-8 " "at byte offset %tu." msgstr "" "%s にはバイトオフセット %tu で不正形式のUTF-8が含まれているため識別子としては" "使えません." #: src/data/identifier2.c:114 #, c-format msgid "" "Character %s (in `%s') may not appear as the first character in a identifier." msgstr "文字 %s(`%s' 中)は識別子の第1文字には出現しません." #: src/data/identifier2.c:126 #, c-format msgid "Character %s (in `%s') may not appear in an identifier." msgstr "文字 %s(`%s' 中)は識別子には出現しません." #: src/data/mdd-writer.c:241 #, fuzzy, c-format #| msgid "I/O error occurred writing data file `%s'." msgid "An I/O error occurred writing metadata file `%s'." msgstr "データファイル `%s' に書き込み中にI/Oエラー." #. TRANSLATORS: this fragment will be interpolated into #. messages in fh_lock() that identify types of files. #: src/data/mdd-writer.c:457 #, fuzzy #| msgid "data file" msgid "metadata file" msgstr "データファイル" #: src/data/mdd-writer.c:465 #, fuzzy, c-format #| msgid "Error opening `%s' for writing as a portable file: %s." msgid "Error opening `%s' for writing as a metadata file: %s." msgstr "`%s' をポータブルファイルとして開くときエラー: %s." #: src/data/mdd-writer.c:473 #, c-format msgid "Internal error creating xmlTextWriter. Please report this to %s." msgstr "" #: src/data/make-file.c:217 #, c-format msgid "Opening %s for writing: %s." msgstr "書き込み用として %s を開いています: %s." #: src/data/make-file.c:228 #, c-format msgid "Opening stream for %s: %s." msgstr "%s のためにストリームを開いています: %s." #: src/data/make-file.c:260 #, c-format msgid "Creating temporary file to replace %s: %s." msgstr "%s を置き換える一時ファイルを新規作成中: %s." #: src/data/make-file.c:277 #, c-format msgid "Creating temporary file %s: %s." msgstr "一時ファイル %s を新規作成中: %s." #: src/data/make-file.c:289 #, c-format msgid "Opening stream for temporary file %s: %s." msgstr "一時ファイル %s 用のストリームを開いています: %s." #: src/data/make-file.c:326 #, c-format msgid "Replacing %s by %s: %s." msgstr "%s を %s で置換: %s." #: src/data/make-file.c:354 #, c-format msgid "Removing %s: %s." msgstr "%s を削除: %s." #: src/data/mrset.c:83 #, c-format msgid "" "%s is not a valid name for a multiple response set. Multiple response set " "names must begin with `$'." msgstr "" "%s は多重反応セットにとって適切な名前ではありません.多重回答セット名は `$' " "で始まらねばなりません." #: src/data/ods-reader.c:620 #, c-format msgid "Cannot open %s as a OpenDocument file: %s" msgstr "%s をオープンドキュメントファイルとして開けません: %s" #. TRANSLATORS: this fragment will be interpolated into #. messages in fh_lock() that identify types of files. #: src/data/pc+-file-reader.c:206 msgid "SPSS/PC+ system file" msgstr "SPSS/PC+システムファイル" #: src/data/pc+-file-reader.c:215 #, c-format msgid "Error opening `%s' for reading as an SPSS/PC+ system file: %s." msgstr "SPSS/PC+システムファイルとして `%s' を開くときにエラー: %s." #: src/data/pc+-file-reader.c:224 src/data/sys-file-reader.c:3541 #, c-format msgid "%s: stat failed (%s)." msgstr "%s: 情報取得でエラー(%s)." #: src/data/pc+-file-reader.c:230 #, c-format msgid "%s: file too large." msgstr "%s: ファイルが大きすぎます." #: src/data/pc+-file-reader.c:257 #, c-format msgid "" "Directory entry is for a %u-byte record starting at offset %u but file is " "only %u bytes long." msgstr "" "オフセット %u から始まる %u バイトのレコードを格納したディレクトリ項目です" "が,ファイル長が %u バイトしかありません." #: src/data/pc+-file-reader.c:275 #, c-format msgid "Directory fields have unexpected values (%u,%u)." msgstr "ディレクトリ・フィールドに予期せぬ値 (%u,%u) があります." #: src/data/pc+-file-reader.c:372 src/data/sys-file-reader.c:672 #, c-format msgid "Variable %zu" msgstr "変数 %zu" #: src/data/pc+-file-reader.c:380 src/data/sys-file-reader.c:680 #, c-format msgid "Variable %zu Label" msgstr "変数 %zu ラベル" #: src/data/pc+-file-reader.c:385 #, c-format msgid "Variable %zu Value Label %zu" msgstr "変数 %zu 値ラベル %zu." #: src/data/pc+-file-reader.c:388 src/data/sys-file-reader.c:690 msgid "Creation Date" msgstr "作成日" #: src/data/pc+-file-reader.c:389 src/data/sys-file-reader.c:691 msgid "Creation Time" msgstr "作成時刻" #: src/data/pc+-file-reader.c:390 src/data/sys-file-reader.c:692 #: src/language/dictionary/sys-file-info.c:200 msgid "Product" msgstr "プロダクト" #: src/data/pc+-file-reader.c:391 src/data/sys-file-reader.c:693 #: src/language/dictionary/sys-file-info.c:300 msgid "File Label" msgstr "ファイルラベル" #: src/data/pc+-file-reader.c:427 #, c-format msgid "" "Using default encoding %s to read this SPSS/PC+ system file. For best " "results, specify an encoding explicitly. Use SYSFILE INFO with ENCODING=" "\"DETECT\" to analyze the possible encodings." msgstr "" "この SPSS/PC+システムファイルではデフォールトのエンコーディング %s が適用され" "ます.最適な結果を得るためには,エンコーディングを明示して下さい.利用可能な" "エンコーディングを調べるには,SYSTEM INFOコマンドでENCODING=\"DETECT\"を使っ" "て下さい." #: src/data/pc+-file-reader.c:483 src/data/sys-file-reader.c:890 #, c-format msgid "Error closing system file `%s': %s." msgstr "システムファイル `%s' を閉じるときにエラーが発生しました: %s." #: src/data/pc+-file-reader.c:544 msgid "This is not an SPSS/PC+ system file." msgstr "SPSS/PC+ のシステムファイルではありません." #: src/data/pc+-file-reader.c:548 #, c-format msgid "Record 0 has unexpected length %u." msgstr "レコード 0 には予期せぬ長さ %u が指定されています." #: src/data/pc+-file-reader.c:572 #, c-format msgid "Record 0 specifies unexpected system missing value %g (%a)." msgstr "レコード 0 では予期せぬシステム欠損値 %g (%a) が指定されています." #: src/data/pc+-file-reader.c:577 #, c-format msgid "Record 0 reserved fields have unexpected values (%u,%u,%u,%u,%u,%u)." msgstr "" "レコード 0 の予約領域には予期せぬ値 %u,%u,%u,%u,%u,%u が含まれています." #: src/data/pc+-file-reader.c:581 #, c-format msgid "Record 0 case counts differ (%u versus %u)." msgstr "レコード 0 のケース数が違います(%u 対 %u)." #: src/data/pc+-file-reader.c:585 #, c-format msgid "Invalid compression type %u." msgstr "無効な圧縮形式 (%u) です." #: src/data/pc+-file-reader.c:596 #, c-format msgid "" "Record 0 claims %u cases with %u values per case (requiring at least %zu " "bytes) but data record is only %u bytes long." msgstr "" "レコード 0 には %u ケースがあり,各ケースには %u 個の値があるとされているが" "(少なくとも %zu バイトが必要),データレコードの長さは %u バイトしかない." #: src/data/pc+-file-reader.c:618 #, c-format msgid "" "Value labels claimed to end at offset %u in labels record but labels record " "is only %u bytes." msgstr "" "ラベルレコードのオフセット %u で終わる値ラベルですが,ラベルレコードは %u バ" "イトしかありません." #: src/data/pc+-file-reader.c:629 #, c-format msgid "" "Value labels claimed to be at offset %u with length %u but file size is only " "%u bytes." msgstr "" "オフセット %u から始まる長さ %u の値ラベルですが,ファイルサイズは %u バイト" "しかありません." #: src/data/pc+-file-reader.c:656 #, c-format msgid "" "Value labels end with partial label (%u bytes left in record, label length " "%)." msgstr "" "値ラベルは部分ラベルで終わっています(レコードの残りは %u バイト,ラベル長は " "%)." #: src/data/pc+-file-reader.c:669 #, c-format msgid "%u leftover bytes following value labels." msgstr "値ラベルの後に残り %u バイトがあります." #: src/data/pc+-file-reader.c:685 #, c-format msgid "" "Variable label claimed to start at offset %u in labels record but labels " "record is only %u bytes." msgstr "" "ラベルレコードでオフセット %u で始まるとされている変数ラベルですが,ラベルレ" "コードは %u バイトしかありません." #: src/data/pc+-file-reader.c:697 #, c-format msgid "" "Variable label with length %u starting at offset %u in labels record " "overruns end of %u-byte labels record." msgstr "" "ラベルレコードでオフセット %u で始まるとされている長さ %u の変数ラベルです" "が,%u バイトのラベル終端を超えています." #: src/data/pc+-file-reader.c:719 #, c-format msgid "Record 1 has length %u (expected %u)." msgstr "レコード 1 の長さは %u です (%u のはずです)." #: src/data/pc+-file-reader.c:751 #, c-format msgid "Variable %u has invalid type %." msgstr "変数 %u は無効なタイプ % です." #: src/data/pc+-file-reader.c:787 #, c-format msgid "Invalid weight index %u." msgstr "%u は無効な重み付けインデックスです." #: src/data/pc+-file-reader.c:857 #, c-format msgid "Invalid variable name `%s'." msgstr "不正な変数名 `%s'." #: src/data/pc+-file-reader.c:865 src/data/sys-file-reader.c:1444 #, c-format msgid "Renaming variable with duplicate name `%s' to `%s'." msgstr "名前の変更で変数名 `%s' と `%s' が重複します." #: src/data/pc+-file-reader.c:877 #, c-format msgid "Cannot weight by string variable `%s'." msgstr "文字列変数 %s は重み付けには使えません." #: src/data/pc+-file-reader.c:973 src/data/sys-file-reader.c:2762 msgid "File ends in partial case." msgstr "ケースの一部でファイルが終わっています." #: src/data/pc+-file-reader.c:979 #, c-format msgid "" "Case beginning at offset 0x%08x extends past end of data record at offset 0x" "%08x." msgstr "" "オフセット 0x%08x から始まるケースは,オフセット 0x%08x でレコードの終端を超" "えています." #: src/data/pc+-file-reader.c:998 src/data/sys-file-reader.c:2770 #, c-format msgid "Error reading case from file %s." msgstr "ファイル %s からケースを読み込み中にエラーが発生しました." #: src/data/pc+-file-reader.c:1114 src/data/sys-file-reader.c:2933 #, c-format msgid "" "Possible compressed data corruption: string contains compressed integer " "(opcode %d)." msgstr "" "圧縮データの破損の可能性: 文字列に圧縮された整数(オペコード %d)が含まれていま" "す." #: src/data/pc+-file-reader.c:1156 src/data/sys-file-reader.c:3234 #, c-format msgid "`%s' near offset 0x%llx: " msgstr "`%s'(オフセット 0x%llx 付近):" #: src/data/pc+-file-reader.c:1159 src/data/sys-file-reader.c:3237 #, c-format msgid "`%s': " msgstr "`%s': " #: src/data/pc+-file-reader.c:1211 src/data/sys-file-reader.c:3288 #, c-format msgid "System error: %s." msgstr "システムエラー: %s." #: src/data/pc+-file-reader.c:1216 src/data/sys-file-reader.c:3293 msgid "Unexpected end of file." msgstr "予期せぬファイル終端" #: src/data/pc+-file-reader.c:1301 src/data/sys-file-reader.c:3518 #, c-format msgid "%s: seek failed (%s)." msgstr "%s: 探索でエラー(%s)." #: src/data/pc+-file-reader.c:1351 msgid "SPSS/PC+ System File" msgstr "SPSS/PC+システムファイル" #: src/data/por-file-reader.c:109 #, c-format msgid "portable file %s corrupt at offset 0x%llx: " msgstr "ポータブルファイル %s はオフセット 0x%llx で壊れています:" #: src/data/por-file-reader.c:136 #, c-format msgid "reading portable file %s at offset 0x%llx: " msgstr "ポータブルファイル %s のオフセット 0x%llx を読み込んでいます:" #: src/data/por-file-reader.c:164 #, c-format msgid "Error closing portable file `%s': %s." msgstr "ポータブルファイル `%s' を閉じるときにエラーです: %s." #: src/data/por-file-reader.c:216 msgid "unexpected end of file" msgstr "予期せぬファイル終端" #. TRANSLATORS: this fragment will be interpolated into #. messages in fh_lock() that identify types of files. #: src/data/por-file-reader.c:275 src/data/por-file-writer.c:147 msgid "portable file" msgstr "ポータブルファイル" #: src/data/por-file-reader.c:283 #, c-format msgid "" "An error occurred while opening `%s' for reading as a portable file: %s." msgstr "" "ポータブルファイルとして読み込み用に %s を開こうとしてエラーが発生しました: " "%s." #: src/data/por-file-reader.c:304 msgid "Data record expected." msgstr "データレコードでなければなりません." #: src/data/por-file-reader.c:402 msgid "Number expected." msgstr "数値でなければなりません." #: src/data/por-file-reader.c:430 msgid "Missing numeric terminator." msgstr "数値の終わりがありません." #: src/data/por-file-reader.c:453 msgid "Invalid integer." msgstr "不正な整数" #: src/data/por-file-reader.c:464 src/data/por-file-reader.c:484 #, c-format msgid "Bad string length %d." msgstr "誤った文字列長 %d" #: src/data/por-file-reader.c:547 #, c-format msgid "%s: Not a portable file." msgstr "%s: ポータブルファイルではありません." #: src/data/por-file-reader.c:564 #, c-format msgid "Unrecognized version code `%c'." msgstr "認識できないバージョン番号 `%c'." #: src/data/por-file-reader.c:577 #, c-format msgid "Bad date string length %zu." msgstr "誤った日付文字列長 %zu" #: src/data/por-file-reader.c:579 #, c-format msgid "Bad time string length %zu." msgstr "誤った時刻文字列長 %zu" #: src/data/por-file-reader.c:630 #, c-format msgid "" "%s: Bad format specifier byte (%d). Variable will be assigned a default " "format." msgstr "" "%s: 誤ったフォーマット指定子バイト(%d).変数にはデフォールトのフォーマットが" "割り当てられます." #: src/data/por-file-reader.c:651 #, c-format msgid "Numeric variable %s has invalid format specifier %s." msgstr "数値変数 %s のフォーマット指定子 %s は不正です." #: src/data/por-file-reader.c:655 #, c-format msgid "String variable %s with width %d has invalid format specifier %s." msgstr "文字列型変数 %s (長さ %d)のフォーマット指定子 %s は不正です." #: src/data/por-file-reader.c:679 msgid "Expected variable count record." msgstr "変数の計数記録が必要です." #: src/data/por-file-reader.c:683 #, c-format msgid "Invalid number of variables %d." msgstr "不正な変数の数 %d." #: src/data/por-file-reader.c:692 #, c-format msgid "Weight variable name (%s) truncated." msgstr "重み付け変数名(%s)が短縮されました." #: src/data/por-file-reader.c:707 msgid "Expected variable record." msgstr "変数レコードが必要です." #: src/data/por-file-reader.c:711 #, c-format msgid "Invalid variable width %d." msgstr "不正な変数幅 %d." #: src/data/por-file-reader.c:719 #, c-format msgid "Invalid variable name `%s' in position %d." msgstr "不正な変数名 `%s'(出現位置 %d)." #: src/data/por-file-reader.c:723 src/data/sys-file-reader.c:1426 #, c-format msgid "Bad width %d for variable %s." msgstr "不正な横幅 %d(変数 %s)." #: src/data/por-file-reader.c:737 #, c-format msgid "Duplicate variable name %s in position %d renamed to %s." msgstr "重複した変数名 %s(出現位置 %d)は %s とリネームされました." #: src/data/por-file-reader.c:786 #, c-format msgid "Weighting variable %s not present in dictionary." msgstr "重み付け変数 %s が現在のディクショナリには存在しません." #: src/data/por-file-reader.c:830 #, c-format msgid "Unknown variable %s while parsing value labels." msgstr "値ラベルの解析中における不明な変数 %s ." #: src/data/por-file-reader.c:833 #, c-format msgid "" "Cannot assign value labels to %s and %s, which have different variable types." msgstr "異なる変数型である %s と %s には値ラベルは割り当てられません." #: src/data/por-file-reader.c:972 msgid "SPSS Portable File" msgstr "SPSS ポータブルファイル" #: src/data/por-file-writer.c:139 #, c-format msgid "Invalid decimal digits count %d. Treating as %d." msgstr "%d 個の不正な小数点.%d として扱う." #: src/data/por-file-writer.c:159 #, c-format msgid "Error opening `%s' for writing as a portable file: %s." msgstr "`%s' をポータブルファイルとして開くときエラー: %s." #: src/data/por-file-writer.c:505 #, c-format msgid "An I/O error occurred writing portable file `%s'." msgstr "ポータブルファイル `%s' の書き込み中にI/Oエラーが発生しました." #: src/data/psql-reader.c:48 msgid "" "Support for reading postgres databases was not compiled into this " "installation of PSPP" msgstr "" "postgresデータベースからの読み込みサポートは現在の PSPP には含まれていませ" "ん." #: src/data/psql-reader.c:242 msgid "Memory error whilst opening psql source" msgstr "PSQL ソースを開くときにメモリエラーが発生しました." #: src/data/psql-reader.c:248 #, c-format msgid "Error opening psql source: %s." msgstr "PSQL のソースが開けません: %s." #: src/data/psql-reader.c:263 #, c-format msgid "" "Postgres server is version %s. Reading from versions earlier than 8.0 is not " "supported." msgstr "" "Postgresサーバのバージョンは %s です.バージョン8.0以前からの読み込みはサ" "ポートされていません." #: src/data/psql-reader.c:283 msgid "" "Connection is unencrypted, but unencrypted connections have not been " "permitted." msgstr "非暗号化接続はサポートされていません." #: src/data/psql-reader.c:324 src/data/psql-reader.c:349 #: src/data/psql-reader.c:359 #, c-format msgid "Error from psql source: %s." msgstr "PSQLソースからのエラー: %s." #: src/data/psql-reader.c:454 #, c-format msgid "Unsupported OID %d. SYSMIS values will be inserted." msgstr "サポートされていない OID %d.システム値が挿入されます." #: src/data/settings.c:391 msgid "" "MXWARNS set to zero. No further warnings will be given even when " "potentially problematic situations are encountered." msgstr "" "MXWARNS は 0 にセットされました.潜在的に問題となるような状況に出会っても,こ" "れ以上の警告は出力されません." #: src/data/settings.c:398 #, c-format msgid "" "Warnings re-enabled. %d warnings will be issued before aborting syntax " "processing." msgstr "" "警告は再び有効になりました.シンタックス処理を中止する前に%d の警告が出力され" "ます." #: src/data/settings.c:618 #, c-format msgid "" "%s: Custom currency string `%s' does not contain exactly three periods or " "commas (or it contains both)." msgstr "" "%s: カスタム通貨文字列 `%s' には3つのピリオドかコンマがきっちりとありません" "(または両方が含まれています)." #. TRANSLATORS: this fragment will be interpolated into #. messages in fh_lock() that identify types of files. #: src/data/sys-file-reader.c:407 src/data/sys-file-writer.c:245 msgid "system file" msgstr "システムファイル" #: src/data/sys-file-reader.c:414 #, c-format msgid "Error opening `%s' for reading as a system file: %s." msgstr "システムファイルとして読み込む `%s' を開くときにエラー: %s." #: src/data/sys-file-reader.c:491 msgid "Misplaced type 4 record." msgstr "誤配置されたタイプ 4 レコード" #: src/data/sys-file-reader.c:496 msgid "Duplicate type 6 (document) record." msgstr "重複したタイプ 6 (ドキュメント)レコード" #: src/data/sys-file-reader.c:506 src/data/sys-file-reader.c:1343 #, c-format msgid "" "Unrecognized record type 7, subtype %d. For help, please send this file to " "%s and mention that you were using %s." msgstr "" "認識できないレコードタイプ 7,サブタイプ %d.このファイルを %s に送って下さい" "(使用中の %s もお示し下さい)." #: src/data/sys-file-reader.c:526 #, c-format msgid "" "Record type 7, subtype %d found here has the same type as the record found " "near offset 0x%llx. For help, please send this file to %s and mention that " "you were using %s." msgstr "" "ここで見つかったレコードタイプ 7,サブタイプ %d は,オフセット 0X%llx の近く" "で見つかったレコードと同じ型を持っています.このファイルを %s に送って下さい" "(使用中の %s もお示し下さい)." #: src/data/sys-file-reader.c:538 #, c-format msgid "Unrecognized record type %d." msgstr "不明なレコードタイプ %d." #: src/data/sys-file-reader.c:688 #, c-format msgid "Value Label %zu" msgstr "値ラベル %zu" #: src/data/sys-file-reader.c:697 msgid "Extra Product Info" msgstr "追加製品情報" #: src/data/sys-file-reader.c:710 #, c-format msgid "Document Line %zu" msgstr "ドキュメント行 %zu" #: src/data/sys-file-reader.c:718 #, c-format msgid "MRSET %zu" msgstr "MRSET %zu" #: src/data/sys-file-reader.c:720 #, c-format msgid "MRSET %zu Label" msgstr "MRSET %zu ラベル" #: src/data/sys-file-reader.c:725 #, c-format msgid "MRSET %zu Counted Value" msgstr "MRSET %zu 計数値" #: src/data/sys-file-reader.c:763 #, c-format msgid "" "This system file does not indicate its own character encoding. Using " "default encoding %s. For best results, specify an encoding explicitly. Use " "SYSFILE INFO with ENCODING=\"DETECT\" to analyze the possible encodings." msgstr "" "このシステムファイルでは文字エンコーディングが示されていません.デフォールト" "のエンコーディング %s が適用されます.最適な結果を得るためには,エンコーディ" "ングを明示して下さい.利用可能なエンコーディングを調べるには,SYSTEM INFOコマ" "ンドでENCODING=\"DETECT\"を使って下さい." #: src/data/sys-file-reader.c:845 #, c-format msgid "File header claims %d variable positions but %zu were read from file." msgstr "" "ファイルヘッダには %d 変数位置とありますが %zu がファイルから読み込まれまし" "た." #: src/data/sys-file-reader.c:958 src/data/sys-file-reader.c:972 msgid "This is not an SPSS system file." msgstr "SPSS のシステムファイルではありません." #: src/data/sys-file-reader.c:1027 msgid "" "Compression bias is not the usual value of 100, or system file uses " "unrecognized floating-point format." msgstr "" "圧縮バイアス通常の値である100でないか,またはシステムファイルでは認識できない" "浮動小数点形式が使われています." #: src/data/sys-file-reader.c:1102 msgid "Variable label indicator field is not 0 or 1." msgstr "変数ラベル表示子フィールドが 0 または 1 でありません." #: src/data/sys-file-reader.c:1115 msgid "Numeric missing value indicator field is not -3, -2, 0, 1, 2, or 3." msgstr "数値型の欠損値の指示子は -3, -2, 0, 1, 2, 3 ではありません." #: src/data/sys-file-reader.c:1125 msgid "String missing value indicator field is not 0, 1, 2, or 3." msgstr "文字列欠損値の指示子が 0, 1, 2, 3 ではありません." #: src/data/sys-file-reader.c:1152 #, c-format msgid "Invalid number of labels %u." msgstr "不正なラベル %u の数." #: src/data/sys-file-reader.c:1185 msgid "" "Variable index record (type 4) does not immediately follow value label " "record (type 3) as it should." msgstr "" "変数インデックスレコード(タイプ 4)が値ラベルレコード(タイプ 3)の直後にあ" "りません." #: src/data/sys-file-reader.c:1197 #, c-format msgid "" "Number of variables associated with a value label (%u) is not between 1 and " "the number of variables (%zu)." msgstr "" "値ラベル(%u)に関連づけられた変数の数は1と変数の数(%zu)の範囲内にありません." #: src/data/sys-file-reader.c:1224 #, c-format msgid "Number of document lines (%d) must be greater than 0 and less than %d." msgstr "ドキュメントの行数(%d)は1以上,%d 未満でなければなりません." #: src/data/sys-file-reader.c:1317 #, c-format msgid "Record type 7, subtype %d has bad size %u (expected %d)." msgstr "" "レコードタイプ7,サブタイプ %d のサイズ %u は誤っています(%d でなければなりま" "せん)." #: src/data/sys-file-reader.c:1321 #, c-format msgid "Record type 7, subtype %d has bad count %u (expected %d)." msgstr "" "レコードタイプ7,サブタイプ %d のカウント %u は誤っています(%d でなければなり" "ません)." #: src/data/sys-file-reader.c:1435 #, fuzzy, c-format #| msgid "Renaming variable with duplicate name `%s' to `%s'." msgid "Renaming variable with invalid name `%s' to `%s'." msgstr "名前の変更で変数名 `%s' と `%s' が重複します." #: src/data/sys-file-reader.c:1517 msgid "Missing string continuation record." msgstr "文字継続レコードがありません." #: src/data/sys-file-reader.c:1550 #, c-format msgid "Variable %s with width %d has invalid print format 0x%x." msgstr "変数 %s(横幅 %d)の印刷フォーマット 0x%x は適切ではありません." #: src/data/sys-file-reader.c:1554 #, c-format msgid "Variable %s with width %d has invalid write format 0x%x." msgstr "変数 %s(横幅 %d)の書き出しフォーマット 0x%x は適切ではありません." #: src/data/sys-file-reader.c:1559 msgid "Suppressing further invalid format warnings." msgstr " `%s' " #: src/data/sys-file-reader.c:1613 #, c-format msgid "" "Floating-point representation indicated by system file (%d) differs from " "expected (%d)." msgstr "システムファイル(%d)での浮動小数点形式は規定(%d)にあっていません." #: src/data/sys-file-reader.c:1629 #, c-format msgid "" "Integer format indicated by system file (%d) differs from expected (%d)." msgstr "システムファイル(%d)での整数形式は規定(%d)にあっていません." #: src/data/sys-file-reader.c:1647 src/data/sys-file-reader.c:1653 #, c-format msgid "File specifies unexpected value %g (%a) as %s, instead of %g (%a)." msgstr "ファイルは予期せぬ値 %g(%a) を %s としています.正しくは %g(%a)です." #: src/data/sys-file-reader.c:1662 #, c-format msgid "" "File specifies unexpected value %g (%a) as %s, instead of %g (%a) or %g (%a)." msgstr "" "ファイルは予期せぬ値 %g(%a) を %s としています.正しくは %g(%a) または " "%g(%a) です." #: src/data/sys-file-reader.c:1714 src/data/sys-file-reader.c:1733 #, c-format msgid "Missing space following `%c' at offset %zu in MRSETS record." msgstr "MRSETS レコードで `%c’(オフセット %zu)の次に空白がありません." #: src/data/sys-file-reader.c:1741 #, fuzzy, c-format #| msgid "" #| "Unexpected label source value following `E' at offset %zu in MRSETS " #| "record." msgid "" "Missing label source value following `E' at offset %zu in MRSETS record." msgstr "" "予期しないラベルソース値が MRSETS レコード内のオフセット %zu にある`E' に続い" "ています." #: src/data/sys-file-reader.c:1748 #, c-format msgid "" "Unexpected label source value following `E' at offset %zu in MRSETS record." msgstr "" "予期しないラベルソース値が MRSETS レコード内のオフセット %zu にある`E' に続い" "ています." #: src/data/sys-file-reader.c:1755 #, c-format msgid "Missing `C', `D', or `E' at offset %zu in MRSETS record." msgstr "MRSETS レコードにおいてオフセット %zu で `C', `D', `E' がありません." #: src/data/sys-file-reader.c:1782 #, c-format msgid "Missing new-line parsing variable names at offset %zu in MRSETS record." msgstr "" "MRSETS レコード内のオフセット %zu で変数名を解析中に改行が見つかりません." #: src/data/sys-file-reader.c:1817 #, fuzzy, c-format #| msgid "No multiple response set named %s." msgid "Invalid multiple response set name `%s'." msgstr "%s という名前の多重回答セットはありません." #: src/data/sys-file-reader.c:1850 #, c-format msgid "MRSET %s contains duplicate variable name %s." msgstr "MRSET %s には重複した変数名 %s が含まれています." #: src/data/sys-file-reader.c:1865 #, c-format msgid "MRSET %s contains both string and numeric variables." msgstr "MRSET %s には文字列と数値の両方が入っています." #: src/data/sys-file-reader.c:1877 #, c-format msgid "MRSET %s has no variables." msgstr "MRSET %s には変数がありません." #: src/data/sys-file-reader.c:1879 #, c-format msgid "MRSET %s has only one variable." msgstr "MRSET %s には変数が1つしかありません." #: src/data/sys-file-reader.c:1923 #, c-format msgid "Extension 11 has bad count %u (for %zu variables)." msgstr "エクステンション 11 のカウント数 %u は誤りです(%zu 変数が対象)." #: src/data/sys-file-reader.c:1956 #, c-format msgid "" "Invalid variable display parameters for variable %zu (%s). Default " "parameters substituted." msgstr "無効な変数 %zu(%s)の変数表示パラメータ.デフォルトのパラメータが置換." #: src/data/sys-file-reader.c:2000 #, c-format msgid "Duplicate long variable name `%s'." msgstr "長い変数名 `%s' は重複しています." #: src/data/sys-file-reader.c:2053 #, c-format msgid "Long variable mapping from %s to invalid variable name `%s'." msgstr "長い変数マッピング: %s から不正な変数名 `%s' まで." #: src/data/sys-file-reader.c:2088 #, c-format msgid "%s listed as string of invalid length %s in very long string record." msgstr "" "%s は非常に長い文字列レコードにおいて不正な長さ %s の文字列としてリストされま" "した." #: src/data/sys-file-reader.c:2099 #, c-format msgid "" "%s listed in very long string record with width %s, which requires only one " "segment." msgstr "" "%s は長さ %s の非常に長い文字列の中でリストされました(セグメントは1つだけ必" "要)." #: src/data/sys-file-reader.c:2107 #, c-format msgid "Very long string %s overflows dictionary." msgstr "非常に長い文字列 %s によりディクショナリがオーバーフローしました." #: src/data/sys-file-reader.c:2125 #, c-format msgid "" "Very long string with width %ld has segment %d of width %d (expected %d)." msgstr "" "長さが %ld の非常に長い文字列はセグメント %d(長さ %d)を持っています(予想は " "%d)" #: src/data/sys-file-reader.c:2183 #, fuzzy, c-format #| msgid "Variable index %d not in valid range 1...%zu." msgid "Value label variable index %d not in valid range 1...%zu." msgstr "変数インデックス %d は有効な 1 ... %zu の範囲外です." #: src/data/sys-file-reader.c:2193 #, fuzzy, c-format #| msgid "Variable index %d refers to long string continuation." msgid "Value label variable index %d refers to long string continuation." msgstr "変数インデックス %d は長い文字列の連続を参照しています." #: src/data/sys-file-reader.c:2208 #, c-format msgid "" "Variables associated with value label are not all of identical type. " "Variable %s is %s, but variable %s is %s." msgstr "" "値ラベルに関連付けられた変数は,すべてが同一タイプではありません.変数 %s は " "%s ですが,変数 %s は %s です." #: src/data/sys-file-reader.c:2226 #, c-format msgid "" "Value labels may not be added to long string variables (e.g. %s) using " "records types 3 and 4." msgstr "" "値ラベルは長い文字列型変数(たとえば %s)に対してレコードタイプ 3 と 4 を使用" "して追加することはできません." #: src/data/sys-file-reader.c:2255 #, c-format msgid "Duplicate value label for %g on %s." msgstr "%g(%s 内)のための値ラベルに重複があります." #: src/data/sys-file-reader.c:2260 src/data/sys-file-reader.c:2600 #, c-format msgid "Duplicate value label for `%.*s' on %s." msgstr "`%.*s'(%s 内)のための値ラベルに重複があります." #: src/data/sys-file-reader.c:2283 #, fuzzy, c-format #| msgid "Suppressed %d additional related warnings." msgid "Suppressed %d additional warnings for value labels." msgstr "以下の %d 個の関連する警告は非表示とされました." #: src/data/sys-file-reader.c:2297 #, fuzzy, c-format #| msgid "Variable index %d not in valid range 1...%zu." msgid "" "Weight variable index %d not in valid range 1...%zu. Treating file as " "unweighted." msgstr "変数インデックス %d は有効な 1 ... %zu の範囲外です." #: src/data/sys-file-reader.c:2307 #, fuzzy, c-format #| msgid "Variable index %d refers to long string continuation." msgid "" "Weight variable index %d refers to long string continuation. Treating file " "as unweighted." msgstr "変数インデックス %d は長い文字列の連続を参照しています." #: src/data/sys-file-reader.c:2315 #, c-format msgid "Ignoring string variable `%s' set as weighting variable." msgstr "重み付け変数としての文字列型変数 `%s' は無視されます." #: src/data/sys-file-reader.c:2352 #, c-format msgid "Error parsing attribute value %s[%d]." msgstr "属性値 %s[%d] の解析中にエラーが発生しました." #: src/data/sys-file-reader.c:2366 #, c-format msgid "Attribute value %s[%d] is not quoted: %s." msgstr "属性値 %s[%d] は参照されていません: %s." #: src/data/sys-file-reader.c:2379 #, fuzzy, c-format #| msgid "Duplicate variable name %s." msgid "Duplicate attribute %s." msgstr "重複した変数名 %s." #: src/data/sys-file-reader.c:2463 #, c-format msgid "Invalid role for variable %s." msgstr "変数 %s にとっての不正な役割" #: src/data/sys-file-reader.c:2472 #, c-format msgid "%zu other variables had invalid roles." msgstr "%zu の他の変数は不適切な役割を担っています." #: src/data/sys-file-reader.c:2485 #, c-format msgid "Extension record subtype %d ends unexpectedly." msgstr "拡張レコードのサブタイプ %d は予期せぬ終了となっています." #: src/data/sys-file-reader.c:2531 #, c-format msgid "Ignoring long string value label record for unknown variable %s." msgstr "不明な変数 %s のための長い文字列の変数ラベルレコードは無視されました." #: src/data/sys-file-reader.c:2536 #, c-format msgid "Ignoring long string value label record for numeric variable %s." msgstr "数値型変数 %s のための長い文字列の変数ラベルレコードは無視されました." #: src/data/sys-file-reader.c:2543 #, c-format msgid "" "Ignoring long string value label record for variable %s because the record's " "width (%d) does not match the variable's width (%d)." msgstr "" "変数 %s のための長い文字列の変数ラベルレコードは無視されました.レコード長" "(%d)が変数長(%d)と一致しません." #: src/data/sys-file-reader.c:2573 #, c-format msgid "" "Ignoring long string value label %zu for variable %s, with width %d, that " "has bad value width %zu." msgstr "" "長い文字列値 %zu(変数は %s,長さは %d)は無視されます.値幅 %zu が正しくないか" "らです." #: src/data/sys-file-reader.c:2646 #, c-format msgid "" "Long string missing values record says variable %s has %d missing values, " "but only 1 to 3 missing values are allowed." msgstr "" "長い文字列謙遜値レコードでは変数 %s には %d 個の欠損値があるとされているが,1" "から3個の欠損値だけが許されています." #: src/data/sys-file-reader.c:2656 #, c-format msgid "Ignoring long string missing value record for unknown variable %s." msgstr "不明な変数 %s のための長い文字列の欠損値レコードは無視されました." #: src/data/sys-file-reader.c:2661 #, c-format msgid "Ignoring long string missing value record for numeric variable %s." msgstr "数値型変数 %s のための長い文字列の欠損値レコードは無視されました." #: src/data/sys-file-reader.c:2686 #, c-format msgid "" "Ignoring long string missing value %zu for variable %s, with width %d, that " "has bad value width %zu." msgstr "" "長い文字欠損値 %zu(変数は %s,長さは %d)は無視されます.値幅 %zu が正しくない" "からです." #: src/data/sys-file-reader.c:2740 msgid "File ends in partial string value." msgstr "文字列の断片でファイルが終わっています." #: src/data/sys-file-reader.c:2879 msgid "" "Possible compressed data corruption: compressed spaces appear in numeric " "field." msgstr "" "圧縮データの破損の可能性: 圧縮されたスペースは数値フィールドに表示されます." #: src/data/sys-file-reader.c:3030 #, c-format msgid "Suppressed %d additional related warnings." msgstr "以下の %d 個の関連する警告は非表示とされました." #: src/data/sys-file-reader.c:3076 src/data/sys-file-reader.c:3093 #, c-format msgid "Dictionary record refers to unknown variable %s." msgstr "ディクショナリのレコードは不明な変数 %s を参照しています." #: src/data/sys-file-reader.c:3159 #, c-format msgid "Expecting digit at offset %zu in MRSETS record." msgstr "MRSETSレコードのオフセット %zu には数字が必要です." #: src/data/sys-file-reader.c:3167 #, c-format msgid "Expecting space at offset %zu in MRSETS record." msgstr "MRSETSレコードのオフセット %zu には空白が必要です." #: src/data/sys-file-reader.c:3175 #, c-format msgid "%zu-byte string starting at offset %zu exceeds record length %zu." msgstr "" "%zu バイトの文字列(開始オフセット %zu)はレコード長 %zu を超えています." #: src/data/sys-file-reader.c:3185 #, c-format msgid "Expecting space at offset %zu following %zu-byte string." msgstr "オフセット %zu に空白が必要です(%zu-バイトの文字列に続く)." #: src/data/sys-file-reader.c:3476 #, c-format msgid "Wrong ZLIB data header offset %#llx (expected %#llx)." msgstr "誤ったZLIBデータヘッダのオフセット %#llx(予測は %#llx)." #: src/data/sys-file-reader.c:3484 #, c-format msgid "Impossible ZLIB trailer offset 0x%llx." msgstr "誤ったZLIBトレイラーのオフセット 0x%llx." #: src/data/sys-file-reader.c:3491 #, c-format msgid "Invalid ZLIB trailer length %lld." msgstr "不正なZLIBトレイラー長 %lld." #: src/data/sys-file-reader.c:3555 #, c-format msgid "End of ZLIB trailer (0x%llx) is not file size (0x%llx)." msgstr "" "ZLIB トレイラーの終わり(0x%llx)はファイルサイズ(0x%llx)ではありません." #: src/data/sys-file-reader.c:3565 #, c-format msgid "ZLIB trailer bias (%lld) differs from file header bias (%.2f)." msgstr "" "ZLIB トレイラーのバイアス(%lld)はファイルヘッダのバイアス(%.2f)とは異なりま" "す." #: src/data/sys-file-reader.c:3575 #, c-format msgid "ZLIB trailer \"zero\" field has nonzero value %lld." msgstr "ZLIB トレイラーの \"zero\" フィールドは非 0 値(%lld)です." #: src/data/sys-file-reader.c:3581 #, c-format msgid "ZLIB trailer specifies unexpected %u-byte block size." msgstr "ZLIB トレーラーは予期せぬ %u-バイトのブロック長を指定しています." #: src/data/sys-file-reader.c:3589 #, c-format msgid "%lld-byte ZLIB trailer specifies %u data blocks (expected %lld)." msgstr "" "%lld バイトの ZLIB トレイラーは %u のデータブロックを指定しています(予測は " "%lld)." #: src/data/sys-file-reader.c:3614 #, c-format msgid "" "ZLIB block descriptor %u reported uncompressed data offset %#llx, when %#llx " "was expected." msgstr "" "ZLIB ブロック記述子 %u は非圧縮データのオフセットを %#llx としています" "が,%#llx なければなりません." #: src/data/sys-file-reader.c:3623 #, c-format msgid "" "ZLIB block descriptor %u reported compressed data offset %#llx, when %#llx " "was expected." msgstr "" "ZLIB ブロック記述子 %u は圧縮データのオフセットを %#llx としています" "が,%#llx なければなりません." #: src/data/sys-file-reader.c:3633 #, c-format msgid "" "ZLIB block descriptor %u reported block size %#x, when %#x was expected." msgstr "" "ZLIB ブロック記述子 %u はブロックサイズを %#x としていますが,%#x なければな" "りません." #: src/data/sys-file-reader.c:3641 #, c-format msgid "" "ZLIB block descriptor %u reported block size %#x, when at most %#x was " "expected." msgstr "" "ZLIB ブロック記述子 %u はブロックサイズを %#x としていますが,多くても %x な" "ければなりません." #: src/data/sys-file-reader.c:3653 #, c-format msgid "" "ZLIB block descriptor %u reports compressed size %u and uncompressed size %u." msgstr "" "ZLIB ブロック記述子 %u は圧縮サイズは %u ,非圧縮サイズは %u だと報告していま" "す." #: src/data/sys-file-reader.c:3665 #, c-format msgid "" "ZLIB trailer is at offset %#llx but %#llx would be expected from block " "descriptors." msgstr "" "ZLIBトレイラーはオフセット %#llxにありますが,ブロック記述子からは %#llx だと" "予測されています." #: src/data/sys-file-reader.c:3684 #, c-format msgid "ZLIB initialization failed (%s)." msgstr "ZLIB の初期化でエラー(%s)." #: src/data/sys-file-reader.c:3699 #, c-format msgid "Inconsistency at end of ZLIB stream (%s)." msgstr "ZLIB ストリームの最後での不一致(%s)." #: src/data/sys-file-reader.c:3758 #, c-format msgid "ZLIB stream inconsistency (%s)." msgstr "ZLIB ストリームの不一致(%s)." #: src/data/sys-file-reader.c:3782 msgid "Unexpected end of ZLIB compressed data." msgstr "予期せぬ ZLIB 圧縮データの終端" #: src/data/sys-file-reader.c:3820 msgid "SPSS System File" msgstr "SPSS システムファイル" #: src/data/sys-file-writer.c:210 #, c-format msgid "Unknown system file version %d. Treating as version %d." msgstr "システムファイルのバージョン %d は不明.バージョン %d として扱います." #: src/data/sys-file-writer.c:256 #, c-format msgid "Error opening `%s' for writing as a system file: %s." msgstr "システムファイルとして書き込むために開く `%s' でエラー: %s." #: src/data/sys-file-writer.c:1271 #, c-format msgid "An I/O error occurred writing system file `%s'." msgstr "システムファイル `%s' の書き込み中にエラーが発生しました." #: src/data/sys-file-writer.c:1378 #, c-format msgid "Failed to initialize ZLIB for compression (%s)." msgstr "圧縮のための ZLIB を初期化できませんでした(%s)." #: src/data/sys-file-writer.c:1407 #, c-format msgid "Failed to complete ZLIB stream compression (%s)." msgstr "ZLIB ストリーム圧縮を完了できませんでした(%s)." #: src/data/sys-file-writer.c:1449 #, c-format msgid "ZLIB stream compression failed (%s)." msgstr "ZLIB ストリーム圧縮でエラー(%s)." #: src/data/sys-file-writer.c:1491 #, c-format msgid "%s: Seek failed (%s)." msgstr "%s: 探索でエラー(%s)." #: src/data/variable.c:58 msgid "Left" msgstr "左" #: src/data/variable.c:59 msgid "Right" msgstr "右" #: src/data/variable.c:60 msgid "Center" msgstr "中央" #: src/data/variable.c:66 msgid "Nominal" msgstr "名義" #: src/data/variable.c:67 msgid "Ordinal" msgstr "順序" #: src/data/variable.c:68 src/language/stats/ks-one-sample.c:300 msgid "Scale" msgstr "尺度" #: src/data/variable.c:74 msgid "Input" msgstr "入力" #. TRANSLATORS: This will be part of a filename. Please avoid whitespace. #: src/data/variable.c:75 src/output/spv/spv-writer.c:213 #: src/ui/gui/psppire-output-window.c:547 msgid "Output" msgstr "出力" #: src/data/variable.c:76 msgid "Both" msgstr "両方" #: src/data/variable.c:77 src/language/dictionary/sys-file-info.c:237 #: src/ui/gui/psppire-dialog-action-crosstabs.c:86 #: src/ui/gui/psppire-dialog-action-crosstabs.c:98 #: src/ui/gui/psppire-dialog-action-crosstabs.c:133 #: src/ui/gui/psppire-dialog-action-crosstabs.c:141 #: src/ui/gui/psppire-variable-sheet.c:408 src/ui/gui/var-display.c:34 msgid "None" msgstr "なし" #: src/data/variable.c:78 msgid "Partition" msgstr "区分" #: src/data/variable.c:79 src/ui/gui/reliability.ui:37 msgid "Split" msgstr "折半法" #: src/data/variable.c:729 #, c-format msgid "%s (%s)" msgstr "%s (%s)" #: src/data/variable.c:1339 msgid "" "At least one case in the data file had a weight value that was user-missing, " "system-missing, zero, or negative. These case(s) were ignored." msgstr "" "データファイル中の少なくとも1つのケースの重み付け値はユーザ欠損値またはシステ" "ム欠損値,ゼロ,負です.これらのケースは無視されます." #: src/language/command.c:207 src/language/stats/graph.c:749 #: src/language/stats/graph.c:755 src/language/stats/graph.c:789 #: src/language/stats/graph.c:794 src/language/stats/graph.c:799 #: src/language/stats/graph.c:852 src/language/stats/graph.c:857 #: src/language/stats/graph.c:862 src/language/stats/graph.c:867 #: src/language/stats/graph.c:872 src/language/stats/graph.c:877 #: src/language/stats/graph.c:882 src/language/utilities/set.q:236 #, c-format msgid "%s is not yet implemented." msgstr "%s は実装されていません." #: src/language/command.c:212 #, c-format msgid "%s may be used only in testing mode." msgstr "%s はテストモードでしか使えません." #: src/language/command.c:217 #, c-format msgid "%s may be used only in enhanced syntax mode." msgstr "%s は拡張システムモードでしか使えません." #: src/language/command.c:345 msgid "expecting command name" msgstr "コマンド名が必要です." #: src/language/command.c:347 #, c-format msgid "Unknown command `%s'." msgstr "不明なコマンド `%s'." #: src/language/command.c:380 #, c-format msgid "%s is allowed only before the active dataset has been defined." msgstr "%s はアクティブなデータセットが定義される以前においてのみ有効です." #: src/language/command.c:384 #, c-format msgid "%s is allowed only after the active dataset has been defined." msgstr "%s はアクティブなデータセットが定義された以降においてのみ有効です." #: src/language/command.c:388 src/language/command.c:392 #, c-format msgid "%s is allowed only inside %s." msgstr "%s は %s 内でしか許されません." #: src/language/command.c:399 src/language/command.c:403 #, c-format msgid "" "%s is allowed only before the active dataset has been defined or inside %s." msgstr "" "%s はアクティブなデータセットが定義される以前か %s の内部においてのみ有効で" "す." #: src/language/command.c:407 src/language/command.c:411 #, c-format msgid "" "%s is allowed only after the active dataset has been defined or inside %s." msgstr "" "%s はアクティブなデータセットが定義された以降か %s の内部においてのみ有効で" "す." #: src/language/command.c:415 #, c-format msgid "%s is allowed only inside %s or inside %s." msgstr "%s は %s か %s の内部でしか認められません." #: src/language/command.c:421 #, c-format msgid "" "%s is allowed only after the active dataset has been defined, inside INPUT " "PROGRAM, or inside FILE TYPE." msgstr "" "%s アクティブなデータセットが定義された後か,INPUT PROGRAM または FILE TYPE " "の内部においてのみ有効です." #: src/language/command.c:426 #, c-format msgid "" "%s is allowed only before the active dataset has been defined, inside INPUT " "PROGRAM, or inside FILE TYPE." msgstr "" "%s アクティブなデータセットが定義される前か,INPUT PROGRAM または FILE TYPE " "の内部においてのみ有効です." #: src/language/command.c:444 src/language/command.c:447 #, c-format msgid "%s is not allowed inside %s." msgstr "%s は %s 内では許されません." #: src/language/command.c:529 src/language/utilities/host.c:272 #: src/language/utilities/permissions.c:105 #, c-format msgid "This command not allowed when the %s option is set." msgstr "このコマンドは %s オプションが設定されているときには使えません." #: src/language/command.c:545 #, c-format msgid "Error removing `%s': %s." msgstr "エラーで `%s' を除外しています: %s." #: src/language/lexer/lexer.c:296 #, c-format msgid "expecting %s" msgstr "%s が必要です." #: src/language/lexer/lexer.c:300 #, c-format msgid "expecting %s or %s" msgstr "%s か %s が必要です." #: src/language/lexer/lexer.c:304 #, c-format msgid "expecting %s, %s, or %s" msgstr "%s か %s, %s が必要です." #: src/language/lexer/lexer.c:309 #, c-format msgid "expecting %s, %s, %s, or %s" msgstr "%s か %s, %s, %s が必要です." #: src/language/lexer/lexer.c:314 #, c-format msgid "expecting %s, %s, %s, %s, or %s" msgstr "%s か %s, %s, %s, %s が必要です." #: src/language/lexer/lexer.c:319 #, c-format msgid "expecting %s, %s, %s, %s, %s, or %s" msgstr "%s か %s, %s, %s, %s, %s が必要です." #: src/language/lexer/lexer.c:325 #, c-format msgid "expecting %s, %s, %s, %s, %s, %s, or %s" msgstr "%s か %s, %s, %s, %s, %s, %s が必要です." #: src/language/lexer/lexer.c:331 #, c-format msgid "expecting %s, %s, %s, %s, %s, %s, %s, or %s" msgstr "%s か %s, %s, %s, %s, %s, %s, %s が必要です." #: src/language/lexer/lexer.c:351 #, c-format msgid "Subcommand %s may only be specified once." msgstr "サブコマンド %s は1度しか使えません." #: src/language/lexer/lexer.c:363 #, c-format msgid "Required subcommand %s was not specified." msgstr "必要なサブ込まんd %s が指定されていません." #: src/language/lexer/lexer.c:371 #, c-format msgid "%s may only be specified once within subcommand %s" msgstr "%s はサブコマンド %s においては1度しか使用できません." #: src/language/lexer/lexer.c:380 #, c-format msgid "Required %s specification missing from %s subcommand" msgstr "必要とされる %s という指示が %s サブコマンドにはありません." #: src/language/lexer/lexer.c:399 msgid "Syntax error at end of input" msgstr "入力の最後でシンタックスエラー." #: src/language/lexer/lexer.c:420 src/language/xforms/select-if.c:60 #: src/language/stats/autorecode.c:206 src/language/stats/npar.c:503 #: src/language/data-io/print-space.c:83 msgid "expecting end of command" msgstr "コマンドの終了していなければなりません." #: src/language/lexer/lexer.c:631 msgid "expecting string" msgstr "文字列が必要" #: src/language/lexer/lexer.c:660 msgid "expecting integer" msgstr "整数が必要" #: src/language/lexer/lexer.c:673 msgid "expecting number" msgstr "数値が必要" #: src/language/lexer/lexer.c:685 msgid "expecting identifier" msgstr "識別子が必要" #: src/language/lexer/lexer.c:1272 msgid "Syntax error at end of command" msgstr "最終コマンドでのシンタックスエラー" #: src/language/lexer/lexer.c:1281 #, c-format msgid "Syntax error at `%s'" msgstr "`%s' でのシンタックスエラー" #: src/language/lexer/lexer.c:1284 msgid "Syntax error" msgstr "シンタックスエラー" #: src/language/lexer/lexer.c:1470 #, c-format msgid "String of hex digits has %d characters, which is not a multiple of 2" msgstr "" "16進数が格納された文字列の長さは %d ですが,これは2の倍数ではありません." #: src/language/lexer/lexer.c:1477 #, c-format msgid "`%c' is not a valid hex digit" msgstr "`%c' は正しい 16 進数文字ではありません." #: src/language/lexer/lexer.c:1482 #, c-format msgid "" "Unicode string contains %d bytes, which is not in the valid range of 1 to 8 " "bytes" msgstr "" "UNICODE 文字列の長さは %d バイトですが,これは適正な範囲である 1 から 8 バイ" "ト外です." #: src/language/lexer/lexer.c:1488 #, c-format msgid "U+%04X is not a valid Unicode code point" msgstr "U+%04X は有効な Unicode 点ではありません." #: src/language/lexer/lexer.c:1493 msgid "Unterminated string constant" msgstr "終端がない文字定数" #: src/language/lexer/lexer.c:1497 #, c-format msgid "Missing exponent following `%s'" msgstr "`%s' に続く指数がありません." #: src/language/lexer/lexer.c:1502 msgid "Unexpected `.' in middle of command" msgstr "コマンドの途中に予期せぬコンマ(.)があります." #: src/language/lexer/lexer.c:1508 #, c-format msgid "Bad character %s in input" msgstr "入力に不正な文字 %s" #: src/language/lexer/lexer.c:1603 #, c-format msgid "Opening `%s': %s." msgstr "`%s' をオープン中: %s." #: src/language/lexer/lexer.c:1647 #, c-format msgid "Error closing `%s': %s." msgstr "`%s' を閉じるときにエラー: %s." #: src/language/lexer/subcommand-list.c:118 #, c-format msgid "No more than %d %s subcommands allowed." msgstr "%d 以下の %s サブコマンドが使用可能です." #: src/language/lexer/format-parser.c:77 msgid "expecting valid format specifier" msgstr "有効なフォーマット指定が必要です." #: src/language/lexer/format-parser.c:116 #: src/language/lexer/format-parser.c:143 src/language/utilities/output.c:108 #: src/language/data-io/data-list.c:453 src/language/data-io/get-data.c:638 #: src/language/data-io/placement-parser.c:236 #, c-format msgid "Unknown format type `%s'." msgstr "不明なフォーマットタイプ `%s'." #: src/language/lexer/format-parser.c:122 #, c-format msgid "Format specifier `%s' lacks required width." msgstr "フォーマット指定子 `%s' は必要" #: src/language/lexer/format-parser.c:138 msgid "expecting format type" msgstr "フォーマットのタイプが必要です." #: src/language/lexer/value-parser.c:66 #, c-format msgid "" "The high end of the range (%.*g) is below the low end (%.*g). The range " "will be treated as if reversed." msgstr "" "範囲の上限(%.*g)が下限(%.*g)未満です.範囲は上下を逆転して設定されます." #: src/language/lexer/value-parser.c:74 #, c-format msgid "Ends of range are equal (%.*g)." msgstr "両範囲の終わりは同じです(%.*g)." #: src/language/lexer/value-parser.c:82 #, c-format msgid "%s or %s must be part of a range." msgstr "%s または %s は範囲の一部でなければなりません." #: src/language/lexer/value-parser.c:112 msgid "System-missing value is not valid here." msgstr "ここではシステム欠損値は無効です." #: src/language/lexer/variable-parser.c:86 utilities/pspp-convert.c:83 msgid "expecting variable name" msgstr "変数名が必要です." #: src/language/lexer/variable-parser.c:96 #, c-format msgid "%s is not a variable name." msgstr "%s は有効な変数名ではありません." #: src/language/lexer/variable-parser.c:206 #, c-format msgid "" "%s is not a numeric variable. It will not be included in the variable list." msgstr "%s は数値型変数ではありません.そのため変数リストに含まれません." #: src/language/lexer/variable-parser.c:209 #, c-format msgid "" "%s is not a string variable. It will not be included in the variable list." msgstr "%s は文字列型変数ではありません.そのため変数リストに含まれません." #: src/language/lexer/variable-parser.c:213 #, c-format msgid "Scratch variables (such as %s) are not allowed here." msgstr "%s のようなスクラッチ変数は,ここでは許されません." #: src/language/lexer/variable-parser.c:217 #, c-format msgid "" "%s and %s are not the same type. All variables in this variable list must " "be of the same type. %s will be omitted from the list." msgstr "" "%s と %s は同じタイプではありません.この変数リストにおける全ての変数は同じタ" "イプでなければなりません.%s はリストから除外されます." #: src/language/lexer/variable-parser.c:223 #, c-format msgid "" "%s and %s are string variables with different widths. All variables in this " "variable list must have the same width. %s will be omitted from the list." msgstr "" "%s と %s は異なる長さを持つ文字列型変数です.この変数リスト内のすべての変数は" "同じ長さを持っている必要があります.%s はリストから除外されます." #: src/language/lexer/variable-parser.c:228 #: src/language/lexer/variable-parser.c:447 #, c-format msgid "Variable %s appears twice in variable list." msgstr "変数 %s は変数リストに2つあります." #: src/language/lexer/variable-parser.c:341 #, c-format msgid "%s TO %s is not valid syntax since %s precedes %s in the dictionary." msgstr "" "%s TO %s は不正なシンタックスです.ディクショナリ内で %s は %s を超えていま" "す." #: src/language/lexer/variable-parser.c:349 #, c-format msgid "" "When using the TO keyword to specify several variables, both variables must " "be from the same variable dictionaries, of either ordinary, scratch, or " "system variables. %s is a %s variable, whereas %s is %s." msgstr "" "複数の変数を指定するためにキーワード TO を使用するときは,両変数とも同じディ" "クショナリからの通常またはスクラッチ,システム変数である必要があります.%s " "は %s 変数であるのに対して %s は %s です." #: src/language/lexer/variable-parser.c:424 #, c-format msgid "`%s' cannot be used with TO because it does not end in a digit." msgstr "最後が数字でないため `%s' は TO と一緒にはつかえません." #: src/language/lexer/variable-parser.c:432 #, c-format msgid "Numeric suffix on `%s' is larger than supported with TO." msgstr "`%s' の数値後置子は TO でサポートされているものより大きいです." #: src/language/lexer/variable-parser.c:505 msgid "Scratch variables not allowed here." msgstr "ここでは削除された変数は使えません." #: src/language/lexer/variable-parser.c:529 msgid "Prefixes don't match in use of TO convention." msgstr "TO変換の使用でプリフィックスが一致していません." #: src/language/lexer/variable-parser.c:534 msgid "Bad bounds in use of TO convention." msgstr "TO 変換における誤った境界" #: src/language/xforms/compute.c:150 src/language/xforms/compute.c:205 #, c-format msgid "" "When executing COMPUTE: SYSMIS is not a valid value as an index into vector " "%s." msgstr "" "COMPUTE の実行中: SYSMIS はベクトルの %s へのインデックスとして有効な値ではあ" "りません." #: src/language/xforms/compute.c:154 src/language/xforms/compute.c:212 #, c-format msgid "" "When executing COMPUTE: %.*g is not a valid value as an index into vector %s." msgstr "" "COMPUTE の実行中: %.*g はベクトル %s へのインデックスとして有効な値ではありま" "せん." #: src/language/xforms/compute.c:356 #, c-format msgid "There is no vector named %s." msgstr "%s というベクトルはありません." #: src/language/xforms/count.c:125 msgid "Destination cannot be a string variable." msgstr "代入先は文字列型変数ではありません." #: src/language/xforms/sample.c:76 msgid "The sampling factor must be between 0 and 1 exclusive." msgstr "サンプリングファクタ-は 0 と 1 のあいだでなければなりません." #: src/language/xforms/sample.c:96 #, c-format msgid "Cannot sample %d observations from a population of %d." msgstr "%d の標本を %d の母集団から抽出できません." #: src/language/xforms/recode.c:261 msgid "" "Inconsistent target variable types. Target variables must be all numeric or " "all string." msgstr "" "一貫性のないターゲット変数の型.ターゲット変数はすべて数値型またはすべての文" "字列型でなければなりません." #: src/language/xforms/recode.c:282 msgid "CONVERT requires string input values and numeric output values." msgstr "CONVERT には文字列型の入力値と数値型の出力値が必要です." #: src/language/xforms/recode.c:339 #, c-format msgid "%s is not allowed with string variables." msgstr "文字列変数では %s は使えません." #: src/language/xforms/recode.c:422 msgid "expecting output value" msgstr "出力する値が必要です." #: src/language/xforms/recode.c:479 #, c-format msgid "" "%zu variable(s) cannot be recoded into %zu variable(s). Specify the same " "number of variables as source and target variables." msgstr "" "%zu 変数は %zu 変数に再コード化することができません.ソースおよびターゲット変" "数と同じ数の変数を指定して下さい." #: src/language/xforms/recode.c:494 #, c-format msgid "" "There is no variable named %s. (All string variables specified on INTO must " "already exist. Use the STRING command to create a string variable.)" msgstr "" "%s という名前の変数がありません.(INTO で指定されたすべての文字列型変数はす" "でに存在している必要があります.文字列型変数を作成するにはSTRINGコマンドを使" "用します.)" #: src/language/xforms/recode.c:510 #, c-format msgid "INTO is required with %s input values and %s output values." msgstr "INTO には %s の入力値と %s の出力値が必要です." #: src/language/xforms/recode.c:523 #, c-format msgid "Type mismatch. Cannot store %s data in %s variable %s." msgstr "タイプの不一致.%s データを %s 変数 %s に格納できません." #: src/language/xforms/recode.c:566 #, c-format msgid "" "Cannot recode because the variable %s would require a width of %d bytes or " "greater, but it has a width of only %d bytes." msgstr "" "変数 %s は %d バイト以上の幅が必要となるが %d バイトしか幅を持っているので再" "エンコードできません." #: src/language/xforms/select-if.c:100 msgid "Syntax error expecting OFF or BY. Turning off case filtering." msgstr "" "シンタックスエラー: OFFかBYが必要.ケースのフィルタリングは解除されます." #: src/language/xforms/select-if.c:115 msgid "The filter variable must be numeric." msgstr "フィルタ変数は数値でなければなりません." #: src/language/xforms/select-if.c:121 msgid "The filter variable may not be scratch." msgstr "フィルタ変数はスクラッチではいけません." #: src/language/control/control-stack.c:49 #, c-format msgid "%s without %s." msgstr "%s(%s 抜き)" #: src/language/control/control-stack.c:77 #, c-format msgid "This command must appear inside %s...%s, without intermediate %s...%s." msgstr "" "このコマンドは %s ... %s の範囲内でしか指定できません(%s ... %s の中間は除" "く)." #: src/language/control/control-stack.c:94 #, c-format msgid "This command cannot appear outside %s...%s." msgstr "このコマンドは %s ... %s の範囲外では使えません." #: src/language/control/do-if.c:180 #, c-format msgid "This command may not follow %s in %s ... %s." msgstr "このコマンドは %s にの次に来てはいけません(%s ... %s内)." #: src/language/control/loop.c:211 msgid "Only one index clause may be specified." msgstr "インデックス句は1つだけしか指定できません." #: src/language/control/repeat.c:120 #, c-format msgid "Dummy variable name `%s' hides dictionary variable `%s'." msgstr "ダミー変数 `%s' はディクショナリ変数 `%s' を不可視にしています." #: src/language/control/repeat.c:126 #, c-format msgid "Dummy variable name `%s' is given twice." msgstr "ダミー変数名 `%s' は2度使われています." #: src/language/control/repeat.c:170 #, c-format msgid "" "Dummy variable `%s' had %zu substitutions, so `%s' must also, but %zu were " "specified." msgstr "" "ダミー変数 `%s ' には %zu 置換があり,%s も同様であるが,しかし %zu が指定さ" "れています." #: src/language/control/repeat.c:379 msgid "Ranges may only have integer bounds." msgstr "範囲は両端は整数です." #: src/language/control/repeat.c:393 #, c-format msgid "%ld TO %ld is an invalid range." msgstr "%ld から %ld は不正な範囲です." #: src/language/control/repeat.c:443 #, c-format msgid "No matching %s." msgstr "%s が対応しません." #: src/language/control/temporary.c:44 msgid "" "This command may only appear once between procedures and procedure-like " "commands." msgstr "このコマンドは手続きや手続き型コマンドの間で1度しか使えません." #: src/language/dictionary/attributes.c:104 msgid "Attribute array index must be between 1 and 65535." msgstr "属性配列のインデックスは 1 から 65535 の範囲内でなければなりません." #: src/language/dictionary/apply-dictionary.c:74 #, c-format msgid "Variable %s is %s in target file, but %s in source file." msgstr "" "変数 %s はターゲットファイルでは %s ですが,ソースファイルでは %s です." #: src/language/dictionary/apply-dictionary.c:110 msgid "No matching variables found between the source and target files." msgstr "ソースとターゲットとなるファイル間に一致する変数がありません." #: src/language/dictionary/delete-variables.c:40 #: src/language/dictionary/modify-variables.c:79 #: src/language/dictionary/rename-variables.c:51 #, c-format msgid "" "%s may not be used after %s. Temporary transformations will be made " "permanent." msgstr "%s は %s の後で使用することはできません.一時的な変換が確定されます." #: src/language/dictionary/delete-variables.c:48 #: src/language/dictionary/modify-variables.c:312 #, c-format msgid "" "%s may not be used to delete all variables from the active dataset " "dictionary. Use %s instead." msgstr "" "%s はアクティブなデータセットの辞書からすべての変数を削除するために使用するこ" "とはできません.代わりに %s を使用して下さい." #: src/language/dictionary/missing-values.c:70 #, c-format msgid "" "Cannot mix numeric variables (e.g. %s) and string variables (e.g. %s) within " "a single list." msgstr "" "単一のリスト内に数値型変数(たとえば %s)と文字列型変数を(たとえば %s)を混在さ" "せることはできません." #: src/language/dictionary/missing-values.c:91 msgid "" "Too many numeric missing values. At most three individual values or one " "value and one range are allowed." msgstr "" "数値の欠損値が多すぎます.それぞれ最大で3つの値,または1つの値と1つの範囲" "までが許されています." #: src/language/dictionary/missing-values.c:126 #, c-format msgid "Truncating missing value to maximum acceptable length (%d bytes)." msgstr "欠損値は許される最大長(%d バイト)に短縮されました." #: src/language/dictionary/missing-values.c:137 msgid "" "Too many string missing values. At most three individual values are allowed." msgstr "" "文字列の欠損値が多すぎます.それぞれ最大で3つの値までが許されています." #: src/language/dictionary/missing-values.c:154 #, c-format msgid "Missing values provided are too long to assign to variable of width %d." msgstr "与えられた欠損値は長さ %d の変数に割り当てるには長すぎます." #: src/language/dictionary/modify-variables.c:145 msgid "Cannot specify ALL after specifying a set of variables." msgstr "1組の変数群を定めた後ではALLは指定できません." #: src/language/dictionary/modify-variables.c:221 #: src/language/dictionary/rename-variables.c:76 #, c-format msgid "" "Differing number of variables in old name list (%zu) and in new name list " "(%zu)." msgstr "古い名前リスト(%zu)と新しい名前リスト(%zu)で変数の数が異なります." #: src/language/dictionary/modify-variables.c:244 #: src/language/dictionary/modify-variables.c:294 #, c-format msgid "" "%s subcommand may be given at most once. It may not be given in conjunction " "with the %s subcommand." msgstr "" "%s サブコマンドは1度だけ使用できます.また %s サブコマンドと一緒には使えませ" "ん." #: src/language/dictionary/modify-variables.c:331 #, c-format msgid "Unrecognized subcommand name `%s'." msgstr "識別不能なサブコマンド名 `%s'." #: src/language/dictionary/modify-variables.c:334 msgid "Subcommand name expected." msgstr "サブコマンド名が必要です." #: src/language/dictionary/mrsets.c:117 #, c-format msgid "" "VARIABLES specified only variable %s on %s, but at least two variables are " "required." msgstr "" "VARIABLES は変数 %s(%s内)でのみ指定しますが,少なくとも2つの変数が必要にな" "ります." #: src/language/dictionary/mrsets.c:150 msgid "Numeric VALUE must be an integer." msgstr "数値は整数でなければなりません." #: src/language/dictionary/mrsets.c:230 src/language/dictionary/mrsets.c:268 #, c-format msgid "" "MDGROUP subcommand for group %s specifies a string VALUE, but the variables " "specified for this group are numeric." msgstr "" "グループ %s に対しての MDGROUP サブコマンドは文字列 VALUE を指定しますが,こ" "のグループに対して指定された変数は数値です." #: src/language/dictionary/mrsets.c:254 #, c-format msgid "" "VALUE string on MDGROUP subcommand for group %s is %d bytes long, but it " "must be no longer than the narrowest variable in the group, which is %s with " "a width of %d bytes." msgstr "" "グループ %s に対する MDGROUP サブコマンドで VALUE 文字列は %d バイト長いです" "が,そのグループ内のもっとも短い変数(%s で長さ %d)以下でなければなりませ" "ん." #: src/language/dictionary/mrsets.c:280 #, c-format msgid "" "MDGROUP subcommand for group %s specifies LABELSOURCE=VARLABEL but not " "CATEGORYLABELS=COUNTEDVALUES. Ignoring LABELSOURCE." msgstr "" "グループ %s に対する MDGROUP サブコマンドは LABELSOURCE = VARLABEL を指定して" "いますが,CATEGORYLABELS = COUNTEDVALUES ではありません.LABELSOURCE は無視さ" "れます." #: src/language/dictionary/mrsets.c:286 #, c-format msgid "" "MDGROUP subcommand for group %s specifies both LABEL and LABELSOURCE, but " "only one of these subcommands may be used at a time. Ignoring LABELSOURCE." msgstr "" "グループ %s に対する MDGROUP サブコマンドは LABEL と LABELSOURCE の両方を指定" "していますが,これらのサブコマンドの1つだけが1度に使用できます.LABELSOURCE " "は無視されます." #: src/language/dictionary/mrsets.c:326 #, c-format msgid "" "Variables %s and %s specified as part of multiple dichotomy group %s have " "the same variable label. Categories represented by these variables will not " "be distinguishable in output." msgstr "" "変数 %s と %s は多重2分割グループ %s の一部として指定されていますが,同一の変" "数ラベルを持ちます.これらの変数によって表されているカテゴリーは,出力で区別" "されません." #: src/language/dictionary/mrsets.c:356 #, c-format msgid "" "Variable %s specified as part of multiple dichotomy group %s (which has " "CATEGORYLABELS=COUNTEDVALUES) has no value label for its counted value. " "This category will not be distinguishable in output." msgstr "" "変数 %s は多重2分割グループ %s(CATEGORYLABELS = COUNTEDVALUES あり)の一部と" "して指定されていますが,計数値の値ラベルがありません.このカテゴリーは出力で" "区別されません." #: src/language/dictionary/mrsets.c:369 #, c-format msgid "" "Variables %s and %s specified as part of multiple dichotomy group %s (which " "has CATEGORYLABELS=COUNTEDVALUES) have the same value label for the group's " "counted value. These categories will not be distinguishable in output." msgstr "" "変数 %s と %s は多重2分割グループ %s(CATEGORYLABELS = COUNTEDVALUESあり))の" "一部として指定されていますが,グループ計数値の値ラベルが同じです.このカテゴ" "リーは出力で区別されません." #: src/language/dictionary/mrsets.c:426 #, c-format msgid "" "Variables specified on MCGROUP should have the same categories, but %s and " "%s (and possibly others) in multiple category group %s have different value " "labels for value %s." msgstr "" "MCGROUP で指定された変数は同じカテゴリを持っている必要がありますが,%s と " "%s(多重カテゴリグループ %s 内)は値 %s にとっての異なる値ラベルを持っていま" "す." #: src/language/dictionary/mrsets.c:484 #, c-format msgid "No multiple response set named %s." msgstr "%s という名前の多重回答セットはありません." #: src/language/dictionary/mrsets.c:533 msgid "" "The active dataset dictionary does not contain any multiple response sets." msgstr "" "アクティブなデータセットのディクショナリには任意の多重回答グループが含まれて" "いません." #: src/language/dictionary/mrsets.c:540 msgid "Multiple Response Sets" msgstr "多重回答セット" #: src/language/dictionary/mrsets.c:543 #: src/language/dictionary/sys-file-info.c:446 #: src/language/dictionary/sys-file-info.c:733 #: src/language/stats/autorecode.c:375 src/language/data-io/data-parser.c:679 #: src/language/data-io/data-parser.c:725 src/language/data-io/print.c:434 #, fuzzy #| msgid "Attribute" msgid "Attributes" msgstr "属性" #: src/language/dictionary/mrsets.c:544 #: src/language/dictionary/sys-file-info.c:191 #: src/language/dictionary/sys-file-info.c:301 #: src/language/dictionary/sys-file-info.c:302 #: src/language/dictionary/sys-file-info.c:455 #: src/language/dictionary/sys-file-info.c:570 #: src/ui/gui/psppire-var-sheet-header.c:67 src/ui/gui/compute.ui:157 msgid "Label" msgstr "ラベル" #: src/language/dictionary/mrsets.c:544 #: src/language/dictionary/sys-file-info.c:241 #, fuzzy #| msgid "Encoding:" msgid "Encoding" msgstr "エンコーディング:" #: src/language/dictionary/mrsets.c:544 #, fuzzy #| msgid "Counted value" msgid "Counted Value" msgstr "計数値" #: src/language/dictionary/mrsets.c:544 #, fuzzy #| msgid "Cl_ear Variables" msgid "Member Variables" msgstr "変数の削除(_e)" #: src/language/dictionary/mrsets.c:547 #: src/language/dictionary/sys-file-info.c:470 #: src/ui/gui/psppire-var-sheet-header.c:55 msgid "Name" msgstr "名前" #: src/language/dictionary/mrsets.c:564 msgid "Dichotomies" msgstr "" #: src/language/dictionary/mrsets.c:565 src/language/stats/logistic.c:1391 #, fuzzy #| msgid "Category" msgid "Categories" msgstr "カテゴリ" #: src/language/dictionary/numeric.c:67 #, c-format msgid "Format type %s may not be used with a numeric variable." msgstr "フォーマットタイプ %s は数値型変数では使えません." #: src/language/dictionary/numeric.c:86 src/language/dictionary/numeric.c:153 #, c-format msgid "There is already a variable named %s." msgstr "%s という変数名はすでに存在します." #: src/language/dictionary/numeric.c:138 #, c-format msgid "Format type %s may not be used with a string variable." msgstr "フォーマットタイプ %s は文字列型変数では使えません." #: src/language/dictionary/rename-variables.c:92 #, c-format msgid "Renaming would duplicate variable name %s." msgstr "名前の変更で変数名 %s が重複します." #: src/language/dictionary/split-file.c:75 #, fuzzy #| msgid "Split File" msgid "Split Values" msgstr "ファイルの分割" #: src/language/dictionary/split-file.c:76 #: src/language/dictionary/split-file.c:77 #: src/language/dictionary/sys-file-info.c:696 #: src/language/stats/chisquare.c:195 src/language/stats/cochran.c:156 #: src/language/stats/cochran.c:185 src/language/stats/examine.c:841 #: src/language/stats/reliability.c:648 src/language/stats/reliability.c:651 #: src/language/stats/crosstabs.q:1303 src/language/stats/crosstabs.q:1325 #: src/language/stats/crosstabs.q:1365 src/language/stats/crosstabs.q:1412 msgid "Value" msgstr "値" #: src/language/dictionary/split-file.c:79 #: src/language/dictionary/sys-file-info.c:734 #: src/language/stats/chisquare.c:246 src/language/stats/chisquare.c:328 #: src/language/stats/cochran.c:164 src/language/stats/correlations.c:100 #: src/language/stats/descriptives.c:1004 src/language/stats/friedman.c:226 #: src/language/stats/jonckheere-terpstra.c:377 #: src/language/stats/npar-summary.c:113 src/language/stats/quick-cluster.c:588 #: src/language/stats/runs.c:331 src/language/data-io/data-parser.c:683 #: src/language/data-io/data-parser.c:728 src/language/data-io/print.c:438 #: src/ui/gui/psppire-dictview.c:580 src/ui/gui/psppire-data-editor.c:502 msgid "Variable" msgstr "変数" #: src/language/dictionary/sys-file-info.c:184 #, fuzzy #| msgid "Variable Information:" msgid "File Information" msgstr "変数情報:" #: src/language/dictionary/sys-file-info.c:185 msgid "Attribute" msgstr "属性" #: src/language/dictionary/sys-file-info.c:187 #, fuzzy #| msgid "File:" msgid "File" msgstr "ファイル:" #: src/language/dictionary/sys-file-info.c:194 #, fuzzy #| msgid "Created:" msgid "Created" msgstr "新規作成:" #: src/language/dictionary/sys-file-info.c:203 #, fuzzy #| msgid "Integer Format:" msgid "Integer Format" msgstr "整数フォーマット:" #: src/language/dictionary/sys-file-info.c:205 msgid "Big Endian" msgstr "上位バイト順" #: src/language/dictionary/sys-file-info.c:206 msgid "Little Endian" msgstr "下位バイト順" #: src/language/dictionary/sys-file-info.c:207 #: src/language/dictionary/sys-file-info.c:216 #: src/language/dictionary/sys-file-info.c:223 src/language/utilities/set.q:930 msgid "Unknown" msgstr "不明" #: src/language/dictionary/sys-file-info.c:209 #, fuzzy #| msgid "Real Format:" msgid "Real Format" msgstr "実数フォーマット:" #: src/language/dictionary/sys-file-info.c:211 msgid "IEEE 754 LE." msgstr "IEEE 754 LE." #: src/language/dictionary/sys-file-info.c:212 msgid "IEEE 754 BE." msgstr "IEEE 754 BE." #: src/language/dictionary/sys-file-info.c:213 msgid "VAX D." msgstr "VAX D." #: src/language/dictionary/sys-file-info.c:214 msgid "VAX G." msgstr "VAX G." #: src/language/dictionary/sys-file-info.c:215 msgid "IBM 390 Hex Long." msgstr "IBM 390 16 進 長整数." #: src/language/dictionary/sys-file-info.c:218 #: src/language/dictionary/sys-file-info.c:443 #: src/language/stats/binomial.c:199 src/language/stats/correlations.c:131 #: src/language/stats/correlations.c:159 src/language/stats/descriptives.c:585 #: src/language/stats/factor.c:1658 src/language/stats/factor.c:1701 #: src/language/stats/factor.c:1860 src/language/stats/factor.c:2074 #: src/language/stats/frequencies.c:1583 #: src/language/stats/kruskal-wallis.c:254 #: src/language/stats/kruskal-wallis.c:303 #: src/language/stats/ks-one-sample.c:316 src/language/stats/logistic.c:1187 #: src/language/stats/mann-whitney.c:254 src/language/stats/means.c:718 #: src/language/stats/means.c:800 src/language/stats/median.c:358 #: src/language/stats/oneway.c:985 src/language/stats/oneway.c:1157 #: src/language/stats/reliability.c:591 src/language/stats/regression.c:924 #: src/language/stats/t-test-one-sample.c:132 #: src/language/stats/t-test-paired.c:157 src/language/data-io/list.c:104 #: src/ui/gui/variable-info.ui:25 msgid "Variables" msgstr "変数" #: src/language/dictionary/sys-file-info.c:221 src/language/stats/examine.c:929 #: src/language/stats/means.c:697 src/language/stats/reliability.c:548 #: src/language/stats/crosstabs.q:930 msgid "Cases" msgstr "ケース" #: src/language/dictionary/sys-file-info.c:226 src/language/stats/oneway.c:980 #: src/ui/gui/psppire-var-sheet-header.c:58 src/ui/gui/compute.ui:303 msgid "Type" msgstr "タイプ" #: src/language/dictionary/sys-file-info.c:230 #, fuzzy #| msgid "Weight:" msgid "Weight" msgstr "重み付け:" #: src/language/dictionary/sys-file-info.c:233 #, fuzzy #| msgid "Not weighted." msgid "Not weighted" msgstr "非加重." #: src/language/dictionary/sys-file-info.c:235 #, fuzzy #| msgid "Compression:" msgid "Compression" msgstr "圧縮:" #: src/language/dictionary/sys-file-info.c:245 #: src/language/dictionary/sys-file-info.c:424 #: src/language/dictionary/sys-file-info.c:426 #, fuzzy #| msgid "Comments:" msgid "Documents" msgstr "コメント:" #: src/language/dictionary/sys-file-info.c:305 #: src/language/dictionary/sys-file-info.c:430 msgid "(none)" msgstr "" #: src/language/dictionary/sys-file-info.c:393 msgid "No variables to display." msgstr "表示する変数がありません." #: src/language/dictionary/sys-file-info.c:404 msgid "Macros not supported." msgstr "マクロはサポートされていません." #: src/language/dictionary/sys-file-info.c:426 #, fuzzy #| msgid "Document Line %zu" msgid "Document" msgstr "ドキュメント行 %zu" #: src/language/dictionary/sys-file-info.c:454 msgid "Position" msgstr "位置" #: src/language/dictionary/sys-file-info.c:456 #, fuzzy #| msgid "Measurement Level: %s\n" msgid "Measurement Level" msgstr "尺度: %s\n" #: src/language/dictionary/sys-file-info.c:457 #: src/ui/gui/psppire-var-sheet-header.c:85 msgid "Role" msgstr "役割" #: src/language/dictionary/sys-file-info.c:458 #: src/ui/gui/psppire-var-sheet-header.c:61 src/ui/gui/compute.ui:215 msgid "Width" msgstr "横幅" #: src/language/dictionary/sys-file-info.c:459 #, fuzzy #| msgid "Align" msgid "Alignment" msgstr "配置" #: src/language/dictionary/sys-file-info.c:460 #: src/language/dictionary/sys-file-info.c:734 msgid "Print Format" msgstr "印字フォーマット" #: src/language/dictionary/sys-file-info.c:461 #, fuzzy #| msgid "Print Format" msgid "Write Format" msgstr "印字フォーマット" #: src/language/dictionary/sys-file-info.c:462 #: src/ui/gui/missing-val-dialog.c:379 src/ui/gui/psppire-var-sheet-header.c:73 #: src/ui/gui/examine.ui:416 src/ui/gui/t-test.ui:105 msgid "Missing Values" msgstr "欠損値" #: src/language/dictionary/sys-file-info.c:567 #: src/ui/gui/psppire-var-sheet-header.c:70 src/ui/gui/val-labs-dialog.c:489 #: src/ui/gui/val-labs-dialog.ui:194 msgid "Value Labels" msgstr "変数ラベル" #: src/language/dictionary/sys-file-info.c:573 #, fuzzy #| msgid "Variable View" msgid "Variable Value" msgstr "変数ビュー" #: src/language/dictionary/sys-file-info.c:577 #, fuzzy #| msgid "Last non-missing value" msgid "User-missing value" msgstr "最後の非欠損値" #: src/language/dictionary/sys-file-info.c:693 #, fuzzy #| msgid "Variable under test" msgid "Variable and Dataset Attributes" msgstr "検定対象の変数" #: src/language/dictionary/sys-file-info.c:699 #, fuzzy #| msgid "Variable Name: " msgid "Variable and Name" msgstr "変数名:" #: src/language/dictionary/sys-file-info.c:702 #, fuzzy #| msgid "dataset" msgid "(dataset)" msgstr "データセット" #: src/language/dictionary/sys-file-info.c:722 msgid "No vectors defined." msgstr "ベクトルが未定義です." #: src/language/dictionary/sys-file-info.c:732 #, fuzzy #| msgid "Vector" msgid "Vectors" msgstr "ベクトル" #: src/language/dictionary/sys-file-info.c:736 msgid "Vector and Position" msgstr "" #: src/language/dictionary/sys-file-info.c:998 msgid "No valid encodings found." msgstr "有効な院コーディングが見つかりません." #: src/language/dictionary/sys-file-info.c:1004 #, c-format msgid "Usable encodings for %s." msgstr "%s にとって許されるエンコーディング." #: src/language/dictionary/sys-file-info.c:1007 #, c-format msgid "" "Encodings that can successfully read %s (by specifying the encoding name on " "the GET command's ENCODING subcommand). Encodings that yield identical text " "are listed together." msgstr "" "次の表は %s を正しく読めるエンコーディングの一覧である.そのためには GET コマ" "ンドの ENCODING サブコマンドでエンコード名を指定する.同じテキストを生成する" "エンコーディングも一緒にリストされる." #: src/language/dictionary/sys-file-info.c:1012 #: src/language/dictionary/sys-file-info.c:1013 msgid "Encodings" msgstr "エンコーディング" #: src/language/dictionary/sys-file-info.c:1042 #, fuzzy, c-format #| msgid "%s encoded text strings." msgid "%s Encoded Text Strings" msgstr "%s でエンコードされたテキスト文字列." #: src/language/dictionary/sys-file-info.c:1046 msgid "" "Text strings in the file dictionary that the previously listed encodings " "interpret differently, along with the interpretations." msgstr "" "先にリストされたエンコーディングを含むファイル辞書内のテキスト文字列は,文脈" "に応じて異なった解釈がなされる." #: src/language/dictionary/sys-file-info.c:1049 src/output/text-item.c:57 #: src/ui/gui/psppire-import-assistant.c:885 msgid "Text" msgstr "テキスト" #: src/language/dictionary/sys-file-info.c:1059 msgid "Purpose" msgstr "目的" #: src/language/dictionary/value-labels.c:154 #, c-format msgid "Truncating value label to %d bytes." msgstr "変数ラベルを %d バイトに短縮." #: src/language/dictionary/vector.c:66 #, c-format msgid "A vector named %s already exists." msgstr "ベクトル名 %s はすでに使われています." #: src/language/dictionary/vector.c:74 #, c-format msgid "Vector name %s is given twice." msgstr "ベクトル名 %s は2度使われています." #: src/language/dictionary/vector.c:98 msgid "A slash must separate each vector specification in VECTOR's long form." msgstr "" "VECTORの長いフォームではそれぞれのベクトルはスラッシュで区切らねばなりませ" "ん." #: src/language/dictionary/vector.c:131 msgid "Vectors must have at least one element." msgstr "ベクトルには少なくとも1つの要素が必要です." #: src/language/dictionary/vector.c:151 msgid "expecting vector length" msgstr "ベクトル長が必要です." #: src/language/dictionary/vector.c:170 #, c-format msgid "%s is an existing variable name." msgstr "%s はすでに存在する変数名です." #: src/language/dictionary/variable-display.c:121 msgid "Variable display width must be a positive integer." msgstr "変数の表示幅は正の整数に限ります." #: src/language/dictionary/weight.c:49 msgid "The weighting variable must be numeric." msgstr "重み付け変数は数値でなければなりません." #: src/language/dictionary/weight.c:54 msgid "The weighting variable may not be scratch." msgstr "重み付け変数はスクラッチではいけません." #: src/language/tests/moments-test.c:50 msgid "expecting weight value" msgstr "重み付けする値が必要です." #: src/language/utilities/cd.c:45 src/language/utilities/include.c:173 #, fuzzy, c-format #| msgid "Cannot change directory to %s: %s " msgid "Cannot change directory to %s: %s" msgstr "ディレクトリを %s に変更できません: %s" #: src/language/utilities/date.c:33 #, c-format msgid "Only %s is currently implemented." msgstr "今のところ %s だけが実装されています." #: src/language/utilities/host.c:60 #, fuzzy #| msgid "Command shell not supported on this platform." msgid "Time limit not supported on this platform." msgstr "この OS ではコマンド型シェルはサポートされていません." #: src/language/utilities/host.c:74 #, c-format msgid "%s: Command exited with status %d." msgstr "" #: src/language/utilities/host.c:95 #, fuzzy, c-format #| msgid "failed to create temporary file" msgid "Failed to create temporary file (%s)." msgstr "一時ファイルが作成できません." #: src/language/utilities/host.c:102 #, c-format msgid "/dev/null: Failed to open (%s)." msgstr "" #: src/language/utilities/host.c:117 #, c-format msgid "Couldn't fork: %s." msgstr "起動出来ません: %s." #: src/language/utilities/host.c:193 #, c-format msgid "While running \"%s\", waiting for child process failed (%s)." msgstr "" #: src/language/utilities/host.c:203 #, c-format msgid "Command \"%s\" timed out." msgstr "" #: src/language/utilities/host.c:205 #, c-format msgid "Command \"%s\" terminated by signal %d." msgstr "" #: src/language/utilities/host.c:212 msgid "Command or shell not found" msgstr "" #: src/language/utilities/host.c:214 msgid "Could not invoke command or shell" msgstr "" #: src/language/utilities/host.c:217 #, c-format msgid "Command \"%s\" exited with status %d (%s)." msgstr "" #: src/language/utilities/host.c:220 #, c-format msgid "Command \"%s\" exited with status %d." msgstr "" #: src/language/utilities/host.c:230 #, c-format msgid "Command \"%s\" output could not be read (%s)." msgstr "" #: src/language/utilities/title.c:88 #, c-format msgid " (Entered %s)" msgstr "(%s 処理中)" #: src/language/utilities/include.c:73 #, c-format msgid "Can't find `%s' in include file search path." msgstr "インクルードファイル探索パス内で `%s' が見つかりません." #: src/language/utilities/output.c:128 #, fuzzy, c-format #| msgid "Unknown command `%s'." msgid "Unknown cell class %s." msgstr "不明なコマンド `%s'." #: src/language/utilities/permissions.c:113 #, c-format msgid "Cannot stat %s: %s" msgstr "分析 %s ができません: %s" #: src/language/utilities/permissions.c:127 #, c-format msgid "Cannot change mode of %s: %s" msgstr "%s のモードは変更できません: %s" #: src/language/stats/aggregate.c:96 msgid "Sum of values" msgstr "合計" #: src/language/stats/aggregate.c:97 msgid "Mean average" msgstr "平均" #: src/language/stats/aggregate.c:98 msgid "Median average" msgstr "中央値" #: src/language/stats/aggregate.c:99 #: src/ui/gui/psppire-dialog-action-descriptives.c:40 #: src/ui/gui/psppire-dialog-action-frequencies.c:41 msgid "Standard deviation" msgstr "標準偏差" #: src/language/stats/aggregate.c:100 #: src/ui/gui/psppire-dialog-action-descriptives.c:42 msgid "Maximum value" msgstr "最大値" #: src/language/stats/aggregate.c:101 #: src/ui/gui/psppire-dialog-action-descriptives.c:41 msgid "Minimum value" msgstr "最小値" #: src/language/stats/aggregate.c:102 msgid "Percentage greater than" msgstr "パーセンテージ:上" #: src/language/stats/aggregate.c:103 msgid "Percentage less than" msgstr "パーセンテージ:下" #: src/language/stats/aggregate.c:104 msgid "Percentage included in range" msgstr "パーセンテージ:内側" #: src/language/stats/aggregate.c:105 msgid "Percentage excluded from range" msgstr "パーセンテージ:外側" #: src/language/stats/aggregate.c:106 msgid "Fraction greater than" msgstr "割合:上" #: src/language/stats/aggregate.c:107 msgid "Fraction less than" msgstr "割合:下" #: src/language/stats/aggregate.c:108 msgid "Fraction included in range" msgstr "割合:内側" #: src/language/stats/aggregate.c:109 msgid "Fraction excluded from range" msgstr "割合:外側" #: src/language/stats/aggregate.c:110 msgid "Number of cases" msgstr "ケースの数:重み付けされる" #: src/language/stats/aggregate.c:111 msgid "Number of cases (unweighted)" msgstr "ケースの数:重み付けされない" #: src/language/stats/aggregate.c:112 msgid "Number of missing values" msgstr "ケースの数:重み付けされる欠損" #: src/language/stats/aggregate.c:113 msgid "Number of missing values (unweighted)" msgstr "ケース数:重み付けされない欠損" #: src/language/stats/aggregate.c:114 msgid "First non-missing value" msgstr "最初の非欠損値" #: src/language/stats/aggregate.c:115 msgid "Last non-missing value" msgstr "最後の非欠損値" #: src/language/stats/aggregate.c:258 msgid "" "When PRESORTED is specified, specifying sorting directions with (A) or (D) " "has no effect. Output data will be sorted the same way as the input data." msgstr "" "PRESORTED を指定した場合は並び替え方向を指定する(A)または(D)の効果はありませ" "ん.出力データは入力データと同じように並べ替えられます." #: src/language/stats/aggregate.c:448 msgid "expecting aggregation function" msgstr "集計関数が必要です." #: src/language/stats/aggregate.c:460 #, c-format msgid "Unknown aggregation function %s." msgstr "不明な集計関数 `%s'." #: src/language/stats/aggregate.c:513 #, c-format msgid "Missing argument %zu to %s." msgstr "引数 %zu (%s が対象) がありません." #: src/language/stats/aggregate.c:522 #, c-format msgid "Arguments to %s must be of same type as source variables." msgstr "%s への引数は元の変数と同じタイプでなければなりません." #: src/language/stats/aggregate.c:541 #, c-format msgid "" "Number of source variables (%zu) does not match number of target variables " "(%zu)." msgstr "ソース変数(%zu)の数がターゲット変数(%zu)の数と一致しません." #: src/language/stats/aggregate.c:557 #, c-format msgid "" "The value arguments passed to the %s function are out-of-order. They will " "be treated as if they had been specified in the correct order." msgstr "" "関数 %s に渡された値の引数は順序が不正です.それらは正しい順序で指定された場" "合と同様に扱われます." #: src/language/stats/aggregate.c:631 #, c-format msgid "" "Variable name %s is not unique within the aggregate file dictionary, which " "contains the aggregate variables and the break variables." msgstr "" "変数名 %s は集計変数とブレーク変数が含まれている集計ファイルディクショナリ内" "で一意ではありません." #: src/language/stats/autorecode.c:152 #, c-format msgid "Source variable count (%zu) does not match target variable count (%zu)." msgstr "" "ソース変数カウント(%zu)とターゲット変数カウント(%zu)が一致していません." #: src/language/stats/autorecode.c:164 #, c-format msgid "Target variable %s duplicates existing variable %s." msgstr "対象となる変数 %s はすでにある変数 %s と重複しています." #: src/language/stats/autorecode.c:221 #, c-format msgid "" "With GROUP, variables may not mix string variables (such as %s) and numeric " "variables (such as %s)." msgstr "" #: src/language/stats/autorecode.c:363 #, fuzzy #| msgid "Recode into Same Variables" msgid "Recoding grouped variables." msgstr "同一の変数への値の再割り当て" #: src/language/stats/autorecode.c:365 #, fuzzy, c-format #| msgid "Replacing %s by %s: %s." msgid "Recoding %s into %s (%s)." msgstr "%s を %s で置換: %s." #: src/language/stats/autorecode.c:369 #, fuzzy, c-format #| msgid "Removing %s: %s." msgid "Recoding %s into %s." msgstr "%s を削除: %s." #: src/language/stats/autorecode.c:376 src/ui/gui/recode.ui:209 msgid "New Value" msgstr "新しい値" #: src/language/stats/autorecode.c:376 msgid "Value Label" msgstr "値ラベル" #: src/language/stats/autorecode.c:379 msgid "Old Value" msgstr "元の値" #: src/language/stats/binomial.c:138 #, c-format msgid "Variable %s is not dichotomous" msgstr "変数 %s は2値型ではありません." #: src/language/stats/binomial.c:182 src/ui/gui/binomial.ui:30 msgid "Binomial Test" msgstr "2項検定" #: src/language/stats/binomial.c:186 src/language/stats/chisquare.c:183 #: src/language/stats/chisquare.c:239 src/language/stats/chisquare.c:322 #: src/language/stats/cochran.c:188 src/language/stats/correlations.c:94 #: src/language/stats/correlations.c:145 src/language/stats/descriptives.c:991 #: src/language/stats/examine.c:602 src/language/stats/examine.c:742 #: src/language/stats/examine.c:836 src/language/stats/examine.c:925 #: src/language/stats/factor.c:1755 src/language/stats/factor.c:1878 #: src/language/stats/factor.c:1908 src/language/stats/factor.c:2068 #: src/language/stats/factor.c:2102 src/language/stats/frequencies.c:302 #: src/language/stats/frequencies.c:1579 src/language/stats/frequencies.c:1586 #: src/language/stats/friedman.c:250 src/language/stats/glm.c:729 #: src/language/stats/kruskal-wallis.c:249 #: src/language/stats/kruskal-wallis.c:297 #: src/language/stats/ks-one-sample.c:278 src/language/stats/logistic.c:1170 #: src/language/stats/logistic.c:1300 src/language/stats/logistic.c:1330 #: src/language/stats/jonckheere-terpstra.c:361 #: src/language/stats/mann-whitney.c:184 src/language/stats/mann-whitney.c:247 #: src/language/stats/means.c:757 src/language/stats/means.c:811 #: src/language/stats/mcnemar.c:222 src/language/stats/median.c:315 #: src/language/stats/median.c:350 src/language/stats/npar-summary.c:106 #: src/language/stats/oneway.c:973 src/language/stats/oneway.c:1051 #: src/language/stats/oneway.c:1150 src/language/stats/oneway.c:1238 #: src/language/stats/oneway.c:1373 src/language/stats/quick-cluster.c:746 #: src/language/stats/reliability.c:543 src/language/stats/reliability.c:584 #: src/language/stats/reliability.c:633 src/language/stats/reliability.c:644 #: src/language/stats/roc.c:969 src/language/stats/roc.c:1067 #: src/language/stats/regression.c:867 src/language/stats/regression.c:899 #: src/language/stats/regression.c:1023 src/language/stats/regression.c:1089 #: src/language/stats/runs.c:318 src/language/stats/sign.c:102 #: src/language/stats/t-test-indep.c:193 src/language/stats/t-test-indep.c:259 #: src/language/stats/t-test-one-sample.c:68 #: src/language/stats/t-test-one-sample.c:125 #: src/language/stats/t-test-paired.c:150 #: src/language/stats/t-test-paired.c:193 #: src/language/stats/t-test-paired.c:238 src/language/stats/wilcoxon.c:243 #: src/language/stats/wilcoxon.c:282 src/language/stats/crosstabs.q:925 #: src/language/stats/crosstabs.q:1253 src/language/stats/crosstabs.q:1293 #: src/language/stats/crosstabs.q:1302 src/language/stats/crosstabs.q:1331 #: src/language/stats/crosstabs.q:1373 src/language/stats/crosstabs.q:1418 #: src/ui/gui/crosstabs.ui:499 src/ui/gui/oneway.ui:615 msgid "Statistics" msgstr "統計" #: src/language/stats/binomial.c:187 src/language/stats/chisquare.c:240 #: src/language/stats/chisquare.c:252 msgid "Category" msgstr "カテゴリ" #: src/language/stats/binomial.c:188 src/language/stats/cochran.c:189 #: src/language/stats/correlations.c:97 src/language/stats/correlations.c:155 #: src/language/stats/descriptives.c:993 src/language/stats/examine.c:926 #: src/language/stats/frequencies.c:1588 src/language/stats/friedman.c:251 #: src/language/stats/kruskal-wallis.c:250 #: src/language/stats/ks-one-sample.c:279 src/language/stats/logistic.c:1331 #: src/language/stats/jonckheere-terpstra.c:369 #: src/language/stats/mann-whitney.c:185 src/language/stats/means.c:710 #: src/language/stats/means-calc.c:439 src/language/stats/mcnemar.c:223 #: src/language/stats/median.c:351 src/language/stats/npar-summary.c:107 #: src/language/stats/oneway.c:1052 src/language/stats/reliability.c:544 #: src/language/stats/sign.c:69 src/language/stats/sign.c:70 #: src/language/stats/t-test-indep.c:194 #: src/language/stats/t-test-one-sample.c:126 #: src/language/stats/t-test-paired.c:151 #: src/language/stats/t-test-paired.c:194 src/language/stats/wilcoxon.c:244 #: src/language/stats/crosstabs.q:926 msgid "N" msgstr "N" #: src/language/stats/binomial.c:189 msgid "Observed Prop." msgstr "観測比率" #: src/language/stats/binomial.c:190 msgid "Test Prop." msgstr "検定比率" #: src/language/stats/binomial.c:192 src/language/stats/mcnemar.c:224 #: src/language/stats/sign.c:103 src/language/stats/wilcoxon.c:288 #: src/language/stats/crosstabs.q:1306 msgid "Exact Sig. (2-tailed)" msgstr "正確有意水準(両側検定)" #: src/language/stats/binomial.c:193 src/language/stats/mcnemar.c:225 #: src/language/stats/sign.c:104 src/language/stats/wilcoxon.c:289 #: src/language/stats/crosstabs.q:1307 msgid "Exact Sig. (1-tailed)" msgstr "正確有意水準(片側検定)" #: src/language/stats/binomial.c:195 #, fuzzy #| msgid "Group1" msgid "Groups" msgstr "グループ1" #: src/language/stats/binomial.c:196 #, fuzzy #| msgid "Group1" msgid "Group 1" msgstr "グループ1" #: src/language/stats/binomial.c:196 #, fuzzy #| msgid "Group2" msgid "Group 2" msgstr "グループ2" #: src/language/stats/binomial.c:196 src/language/stats/chisquare.c:223 #: src/language/stats/chisquare.c:257 src/language/stats/examine.c:930 #: src/language/stats/factor.c:1756 src/language/stats/frequencies.c:344 #: src/language/stats/glm.c:811 src/language/stats/kruskal-wallis.c:285 #: src/language/stats/logistic.c:1336 src/language/stats/mann-whitney.c:197 #: src/language/stats/means.c:706 src/language/stats/oneway.c:982 #: src/language/stats/oneway.c:1072 src/language/stats/reliability.c:549 #: src/language/stats/regression.c:1031 src/language/stats/sign.c:75 #: src/language/stats/wilcoxon.c:250 #: src/ui/gui/psppire-dialog-action-crosstabs.c:93 #: src/language/stats/crosstabs.q:931 src/language/stats/crosstabs.q:1218 msgid "Total" msgstr "合計" #: src/language/stats/chisquare.c:171 #, fuzzy, c-format #| msgid "" #| "CHISQUARE test specified %d expected values, but %d distinct values were " #| "encountered in variable %s." msgid "" "CHISQUARE test specified %d expected values, but variable %s has %zu " "distinct values." msgstr "" "カイ2乗検定では %d 個の期待度数が指定されていますが,%d 個の異なる値が変数 " "%s で見つかりました." #: src/language/stats/chisquare.c:184 src/language/stats/chisquare.c:241 msgid "Observed N" msgstr "観測度数" #: src/language/stats/chisquare.c:185 src/language/stats/chisquare.c:242 msgid "Expected N" msgstr "期待度数" #: src/language/stats/chisquare.c:186 src/language/stats/chisquare.c:243 #: src/language/stats/regression.c:1031 #: src/ui/gui/psppire-dialog-action-crosstabs.c:95 #: src/language/stats/crosstabs.q:1267 msgid "Residual" msgstr "残差" #: src/language/stats/chisquare.c:235 src/language/stats/cochran.c:150 #: src/language/stats/median.c:305 src/language/stats/sign.c:66 #: src/ui/gui/frequencies.ui:676 msgid "Frequencies" msgstr "度数分布表" #: src/language/stats/chisquare.c:320 src/language/stats/cochran.c:181 #: src/language/stats/friedman.c:246 src/language/stats/kruskal-wallis.c:295 #: src/language/stats/mann-whitney.c:244 src/language/stats/mcnemar.c:219 #: src/language/stats/median.c:347 src/language/stats/sign.c:100 #: src/language/stats/wilcoxon.c:279 msgid "Test Statistics" msgstr "検定統計" #: src/language/stats/chisquare.c:323 #, fuzzy #| msgid "Chi-Square" msgid "Chi-square" msgstr "カイ2乗" #: src/language/stats/chisquare.c:324 src/language/stats/cochran.c:191 #: src/language/stats/examine.c:675 src/language/stats/factor.c:2107 #: src/language/stats/friedman.c:257 src/language/stats/glm.c:733 #: src/language/stats/kruskal-wallis.c:299 src/language/stats/logistic.c:1174 #: src/language/stats/median.c:354 src/language/stats/oneway.c:975 #: src/language/stats/oneway.c:1242 src/language/stats/regression.c:1025 #: src/language/stats/t-test-indep.c:267 #: src/language/stats/t-test-one-sample.c:75 #: src/language/stats/t-test-paired.c:253 src/language/stats/crosstabs.q:1304 msgid "df" msgstr "自由度" #: src/language/stats/chisquare.c:325 src/language/stats/cochran.c:192 #: src/language/stats/friedman.c:258 src/language/stats/kruskal-wallis.c:300 #: src/language/stats/median.c:355 msgid "Asymp. Sig." msgstr "近似的有意水準" #: src/language/stats/cochran.c:111 msgid "More than two values encountered. Cochran Q test will not be run." msgstr "2つ以上の値に遭遇.コクランのQ検定は実行されません." #: src/language/stats/cochran.c:153 #, c-format msgid "Success (%.*g)" msgstr "成功 (%.*g)" #: src/language/stats/cochran.c:154 #, c-format msgid "Failure (%.*g)" msgstr "失敗 (%.*g)" #: src/language/stats/cochran.c:190 msgid "Cochran's Q" msgstr "コクランのQ" #: src/language/stats/correlations.c:91 src/language/stats/descriptives.c:987 #: src/language/stats/factor.c:2065 src/language/stats/npar-summary.c:102 msgid "Descriptive Statistics" msgstr "記述統計" #: src/language/stats/correlations.c:95 src/language/stats/descriptives.c:108 #: src/language/stats/examine.c:742 src/language/stats/factor.c:2069 #: src/language/stats/frequencies.c:141 src/language/stats/graph.c:211 #: src/language/stats/ks-one-sample.c:290 src/language/stats/means-calc.c:438 #: src/language/stats/npar-summary.c:108 src/language/stats/oneway.c:1052 #: src/language/stats/t-test-indep.c:195 #: src/language/stats/t-test-one-sample.c:127 #: src/language/stats/t-test-paired.c:152 #: src/language/stats/t-test-paired.c:241 #: src/ui/gui/psppire-dialog-action-descriptives.c:39 #: src/ui/gui/psppire-dialog-action-frequencies.c:40 msgid "Mean" msgstr "平均" #: src/language/stats/correlations.c:96 src/language/stats/examine.c:751 #: src/language/stats/factor.c:2070 src/language/stats/ks-one-sample.c:290 #: src/language/stats/means-calc.c:440 src/language/stats/npar-summary.c:109 #: src/language/stats/oneway.c:1052 src/language/stats/t-test-indep.c:196 #: src/language/stats/t-test-one-sample.c:128 #: src/language/stats/t-test-paired.c:153 #: src/language/stats/t-test-paired.c:242 msgid "Std. Deviation" msgstr "標準偏差" #: src/language/stats/correlations.c:126 msgid "Correlations" msgstr "相関" #: src/language/stats/correlations.c:146 msgid "Pearson Correlation" msgstr "ピアソン相関" #: src/language/stats/correlations.c:147 src/language/stats/oneway.c:1243 #: src/language/stats/t-test-indep.c:268 #: src/language/stats/t-test-one-sample.c:76 #: src/language/stats/t-test-paired.c:254 msgid "Sig. (2-tailed)" msgstr "有意水準(両側)" #: src/language/stats/correlations.c:147 src/language/stats/factor.c:1913 msgid "Sig. (1-tailed)" msgstr "有意水準(片側)" #: src/language/stats/correlations.c:151 msgid "Cross-products" msgstr "外積" #: src/language/stats/correlations.c:152 msgid "Covariance" msgstr "共分散" #: src/language/stats/correlations.c:165 #, fuzzy #| msgid "Significance" msgid "Significant at .05 level" msgstr "有意水準" #: src/language/stats/correlations.c:234 msgid "The data for the chosen variables are all missing or empty." msgstr "選択された変数のデータはすべて欠損値か空です." #: src/language/stats/correlations.c:390 src/language/stats/descriptives.c:368 #: src/language/data-io/list.c:166 msgid "No variables specified." msgstr "変数が指定されていません." #: src/language/stats/descriptives.c:109 src/language/stats/frequencies.c:142 #: src/language/stats/means-calc.c:445 src/language/stats/t-test-indep.c:197 #: src/language/stats/t-test-one-sample.c:129 #: src/language/stats/t-test-paired.c:154 #: src/language/stats/t-test-paired.c:243 msgid "S.E. Mean" msgstr "標準誤差(平均)" #: src/language/stats/descriptives.c:110 src/language/stats/frequencies.c:145 msgid "Std Dev" msgstr "標準偏差" #: src/language/stats/descriptives.c:111 src/language/stats/examine.c:750 #: src/language/stats/frequencies.c:146 src/language/stats/means-calc.c:450 #: src/ui/gui/psppire-dialog-action-descriptives.c:46 #: src/ui/gui/psppire-dialog-action-frequencies.c:45 msgid "Variance" msgstr "分散" #: src/language/stats/descriptives.c:112 src/language/stats/examine.c:752 #: src/language/stats/frequencies.c:147 src/language/stats/means-calc.c:451 #: src/ui/gui/psppire-dialog-action-descriptives.c:47 #: src/ui/gui/psppire-dialog-action-frequencies.c:50 msgid "Kurtosis" msgstr "尖度" #: src/language/stats/descriptives.c:113 src/language/stats/frequencies.c:148 #: src/language/stats/means-calc.c:452 msgid "S.E. Kurt" msgstr "標準誤差(尖度)" #: src/language/stats/descriptives.c:114 src/language/stats/examine.c:752 #: src/language/stats/frequencies.c:149 src/language/stats/means-calc.c:453 #: src/ui/gui/psppire-dialog-action-descriptives.c:48 #: src/ui/gui/psppire-dialog-action-frequencies.c:46 msgid "Skewness" msgstr "歪度" #: src/language/stats/descriptives.c:115 src/language/stats/frequencies.c:150 #: src/language/stats/means-calc.c:454 msgid "S.E. Skew" msgstr "標準誤差(歪度)" #: src/language/stats/descriptives.c:116 src/language/stats/examine.c:751 #: src/language/stats/frequencies.c:151 src/language/stats/means-calc.c:449 #: src/ui/gui/psppire-dialog-action-descriptives.c:43 #: src/ui/gui/psppire-dialog-action-frequencies.c:48 msgid "Range" msgstr "範囲" #: src/language/stats/descriptives.c:117 src/language/stats/examine.c:751 #: src/language/stats/frequencies.c:152 src/language/stats/graph.c:214 #: src/language/stats/ks-one-sample.c:285 src/language/stats/means-calc.c:447 #: src/language/stats/npar-summary.c:110 src/language/stats/oneway.c:1061 #: src/ui/gui/psppire-dialog-action-descriptives.c:41 #: src/ui/gui/psppire-dialog-action-frequencies.c:42 msgid "Minimum" msgstr "最小値" #: src/language/stats/descriptives.c:118 src/language/stats/examine.c:751 #: src/language/stats/frequencies.c:153 src/language/stats/graph.c:213 #: src/language/stats/ks-one-sample.c:285 src/language/stats/means-calc.c:448 #: src/language/stats/npar-summary.c:110 src/language/stats/oneway.c:1061 #: src/ui/gui/psppire-dialog-action-descriptives.c:42 #: src/ui/gui/psppire-dialog-action-frequencies.c:43 msgid "Maximum" msgstr "最大値" #: src/language/stats/descriptives.c:119 src/language/stats/frequencies.c:154 #: src/language/stats/graph.c:212 src/language/stats/means-calc.c:446 #: src/ui/gui/psppire-dialog-action-descriptives.c:44 #: src/ui/gui/psppire-dialog-action-frequencies.c:53 msgid "Sum" msgstr "合計" #: src/language/stats/descriptives.c:350 #, c-format msgid "Z-score variable name %s would be a duplicate variable name." msgstr "標準得点の変数名 %s は重複した変数名になってしまいます." #: src/language/stats/descriptives.c:401 msgid "" "DESCRIPTIVES with Z scores ignores TEMPORARY. Temporary transformations " "will be made permanent." msgstr "" "標準得点を伴った DESCRIPTIVS により TEMPORARY は無視されます.一時的な変換が" "確定されます." #: src/language/stats/descriptives.c:478 msgid "expecting statistic name: reverting to default" msgstr "分析名が必要: デフォールトに戻します." #: src/language/stats/descriptives.c:561 msgid "" "Ran out of generic names for Z-score variables. There are only 126 generic " "names: ZSC001-ZSC0999, STDZ01-STDZ09, ZZZZ01-ZZZZ09, ZQZQ01-ZQZQ09." msgstr "" "標準得点のための変数の一般名を使い果たしました.一般名は 126 しかありません: " "ZSC001 - ZSC0999,STDZ01 - STDZ09,ZZZZ01 - ZZZZ09,ZQZQ01 - ZQZQ09." #: src/language/stats/descriptives.c:579 #, fuzzy #| msgid "Mapping of variables to corresponding Z-scores." msgid "Mapping of Variables to Z-scores" msgstr "標準得点に対応した変数のマッピング." #: src/language/stats/descriptives.c:581 #, fuzzy #| msgid "Name" msgid "Names" msgstr "名前" #: src/language/stats/descriptives.c:582 src/language/stats/glm.c:739 #: src/language/stats/regression.c:1030 msgid "Source" msgstr "ソース" #: src/language/stats/descriptives.c:582 msgid "Target" msgstr "ターゲット" #: src/language/stats/descriptives.c:659 #, fuzzy, c-format #| msgid "Internal error processing Z scores" msgid "Internal error processing Z scores. Please report this to %s." msgstr "Z得点処理中の初期エラー" #: src/language/stats/descriptives.c:759 #, c-format msgid "Z-score of %s" msgstr "%s の標準得点" #: src/language/stats/descriptives.c:1028 src/language/stats/roc.c:1029 msgid "Valid N (listwise)" msgstr "有効データ数 (リスト単位)" #: src/language/stats/descriptives.c:1028 #, fuzzy #| msgid "Valid N (listwise)" msgid "Missing N (listwise)" msgstr "有効データ数 (リスト単位)" #: src/language/stats/examine.c:75 msgid " (missing)" msgstr "(欠損)" #: src/language/stats/examine.c:225 #, c-format msgid "Boxplot of %s vs. %s" msgstr "%s 対 %s の箱ひげ図" #: src/language/stats/examine.c:231 src/language/stats/examine.c:338 #, c-format msgid "Boxplot of %s" msgstr "%s の箱ひげ図" #: src/language/stats/examine.c:321 msgid "Boxplot" msgstr "箱ひげ図" #: src/language/stats/examine.c:418 msgid "Not creating NP plot because data set is empty." msgstr "データセットがからのため NP プロットが作成できません." #: src/language/stats/examine.c:478 #, c-format msgid "Not creating spreadlevel chart for %s" msgstr "%s のための拡散レベルチャートチャートを作成できません." #: src/language/stats/examine.c:585 #, fuzzy #| msgid "Last non-missing value" msgid "User-missing value." msgstr "最後の非欠損値" #: src/language/stats/examine.c:591 src/language/stats/examine.c:595 #: src/language/stats/frequencies.c:1606 msgid "Percentiles" msgstr "パーセンタイル" #: src/language/stats/examine.c:603 src/math/percentiles.c:37 msgid "Weighted Average" msgstr "加重平均" #: src/language/stats/examine.c:603 msgid "Tukey's Hinges" msgstr "テューキーのヒンジ" #: src/language/stats/examine.c:610 src/language/stats/examine.c:685 #: src/language/stats/examine.c:759 src/language/stats/examine.c:858 #: src/language/stats/examine.c:938 src/language/stats/mann-whitney.c:200 #: src/language/stats/median.c:319 src/language/stats/t-test-indep.c:227 #: src/language/stats/t-test-indep.c:282 #: src/language/stats/t-test-one-sample.c:87 #, fuzzy #| msgid "_Dependent Variable" msgid "Dependent Variables" msgstr "従属変数(_D)" #: src/language/stats/examine.c:669 #, fuzzy #| msgid "Dev from Normal" msgid "Tests of Normality" msgstr "正規分布から逸脱" #: src/language/stats/examine.c:673 msgid "Shapiro-Wilk" msgstr "" #: src/language/stats/examine.c:674 src/language/stats/examine.c:739 #: src/ui/gui/psppire-checkbox-treeview.c:73 msgid "Statistic" msgstr "統計量" #: src/language/stats/examine.c:676 src/language/stats/factor.c:2108 #: src/language/stats/glm.c:736 src/language/stats/logistic.c:1175 #: src/language/stats/oneway.c:978 src/language/stats/oneway.c:1154 #: src/language/stats/oneway.c:1376 src/language/stats/regression.c:906 #: src/language/stats/regression.c:1028 src/language/stats/t-test-indep.c:263 #: src/language/stats/t-test-paired.c:196 msgid "Sig." msgstr "有意水準" #: src/language/stats/examine.c:735 src/language/stats/oneway.c:1045 #: src/ui/gui/descriptives.ui:25 msgid "Descriptives" msgstr "記述統計量" #: src/language/stats/examine.c:738 msgid "Aspect" msgstr "" #: src/language/stats/examine.c:739 src/language/stats/oneway.c:1053 #: src/language/stats/oneway.c:1240 src/language/stats/oneway.c:1375 #: src/language/stats/roc.c:975 src/language/stats/regression.c:902 msgid "Std. Error" msgstr "標準誤差" #: src/language/stats/examine.c:745 src/language/stats/oneway.c:1056 #, c-format msgid "%g%% Confidence Interval for Mean" msgstr "平均の %g%% 信頼区間" #: src/language/stats/examine.c:747 src/language/stats/oneway.c:1058 #: src/language/stats/oneway.c:1382 src/language/stats/roc.c:982 #: src/language/stats/regression.c:913 msgid "Lower Bound" msgstr "下限" #: src/language/stats/examine.c:748 src/language/stats/oneway.c:1059 #: src/language/stats/oneway.c:1383 src/language/stats/roc.c:983 #: src/language/stats/regression.c:914 msgid "Upper Bound" msgstr "上限" #: src/language/stats/examine.c:750 msgid "5% Trimmed Mean" msgstr "上下5%除外平均" #: src/language/stats/examine.c:750 src/language/stats/frequencies.c:143 #: src/language/stats/means-calc.c:442 src/language/stats/median.c:352 #: src/ui/gui/psppire-dialog-action-frequencies.c:52 msgid "Median" msgstr "中央値" #: src/language/stats/examine.c:752 msgid "Interquartile Range" msgstr "四分位範囲" #: src/language/stats/examine.c:832 msgid "Extreme Values" msgstr "外れ値" #: src/language/stats/examine.c:840 src/language/stats/quick-cluster.c:664 #: src/language/data-io/list.c:110 msgid "Case Number" msgstr "ケース番号" #: src/language/stats/examine.c:844 #, fuzzy #| msgid "Order by" msgid "Order" msgstr "表示順" #. TRANSLATORS: This is a noun, not an adjective. #: src/language/stats/examine.c:850 #, fuzzy #| msgid "_Extremes" msgid "Extreme" msgstr "外れ値(_E)" #: src/language/stats/examine.c:851 msgid "Highest" msgstr "最高" #: src/language/stats/examine.c:851 msgid "Lowest" msgstr "最低" #: src/language/stats/examine.c:921 src/language/stats/logistic.c:1328 #: src/language/stats/means.c:694 src/language/stats/reliability.c:540 msgid "Case Processing Summary" msgstr "ケース処理の要約" #: src/language/stats/examine.c:927 src/language/stats/frequencies.c:304 #: src/language/stats/frequencies.c:1494 src/language/stats/logistic.c:1332 #: src/language/stats/means.c:713 src/language/stats/reliability.c:545 #: src/language/stats/crosstabs.q:927 msgid "Percent" msgstr "パーセント" #: src/language/stats/examine.c:929 src/language/stats/frequencies.c:321 #: src/language/stats/frequencies.c:1590 src/language/stats/quick-cluster.c:766 #: src/language/stats/reliability.c:548 src/language/stats/crosstabs.q:931 msgid "Valid" msgstr "有効" #: src/language/stats/examine.c:929 src/language/stats/frequencies.c:336 #: src/language/stats/frequencies.c:1591 src/language/stats/crosstabs.q:931 msgid "Missing" msgstr "欠損" #: src/language/stats/examine.c:1550 #, c-format msgid "%s may not be negative. Using default value (%g)." msgstr "%s は非負です.デフォールト値(%g)が使われます." #: src/language/stats/examine.c:1587 msgid "Percentiles must lie in the range (0, 100)" msgstr "パーセンタイルは 0 から 100 の範囲内に限られます." #: src/language/stats/examine.c:1777 #, c-format msgid "%s and %s are mutually exclusive" msgstr "%s と %s は互いに背反です." #: src/language/stats/factor.c:1121 #, c-format msgid "Matrix input for %s must be either COV or CORR" msgstr "" #: src/language/stats/factor.c:1519 msgid "Factor analysis on a single variable is not useful." msgstr "単変数の因子分析は意味がありません。" #: src/language/stats/factor.c:1523 #, fuzzy #| msgid "Factor analysis on a single variable is not useful." msgid "Factor analysis without variables is not possible." msgstr "単変数の因子分析は意味がありません。" #: src/language/stats/factor.c:1634 msgid "Component Number" msgstr "成分数" #: src/language/stats/factor.c:1634 msgid "Factor Number" msgstr "因子数" #: src/language/stats/factor.c:1648 src/language/stats/factor.c:1651 msgid "Communalities" msgstr "共通性" #: src/language/stats/factor.c:1653 msgid "Initial" msgstr "初期" #: src/language/stats/factor.c:1655 msgid "Extraction" msgstr "抽出の基準" #: src/language/stats/factor.c:1697 src/language/stats/factor.c:1777 #: src/language/stats/factor.c:1839 msgid "Component" msgstr "成分" #: src/language/stats/factor.c:1697 src/language/stats/factor.c:1777 #: src/language/stats/factor.c:1839 msgid "Factor" msgstr "因子" #: src/language/stats/factor.c:1752 msgid "Total Variance Explained" msgstr "説明される分散の和" #: src/language/stats/factor.c:1758 #, no-c-format msgid "% of Variance" msgstr "分散%" #: src/language/stats/factor.c:1760 #, no-c-format msgid "Cumulative %" msgstr "累積%" #: src/language/stats/factor.c:1763 msgid "Phase" msgstr "" #: src/language/stats/factor.c:1765 msgid "Initial Eigenvalues" msgstr "初期固有値" #: src/language/stats/factor.c:1769 msgid "Extraction Sums of Squared Loadings" msgstr "抽出後の負荷量の平方和" #: src/language/stats/factor.c:1773 msgid "Rotation Sums of Squared Loadings" msgstr "回転後の負荷量の平方和" #: src/language/stats/factor.c:1835 msgid "Factor Correlation Matrix" msgstr "因子相関行列" #: src/language/stats/factor.c:1842 #, fuzzy #| msgid "Factor" msgid "Factor 2" msgstr "因子" #: src/language/stats/factor.c:1874 msgid "Anti-Image Matrices" msgstr "" #: src/language/stats/factor.c:1879 #, fuzzy #| msgid "Covariance" msgid "Anti-image Covariance" msgstr "共分散" #: src/language/stats/factor.c:1880 #, fuzzy #| msgid "Bivariate Correlations" msgid "Anti-image Correlation" msgstr "2変量の相関分析" #: src/language/stats/factor.c:1901 msgid "Correlation Matrix" msgstr "相関行列" #: src/language/stats/factor.c:1910 src/language/stats/t-test-paired.c:195 msgid "Correlation" msgstr "相関係数" #: src/language/stats/factor.c:1947 msgid "Determinant" msgstr "行列式" #: src/language/stats/factor.c:1958 #, fuzzy #| msgid "Co_variance matrix" msgid "Covariance Matrix" msgstr "分散共分散行列(_v)" #: src/language/stats/factor.c:1990 msgid "" "The dataset contains no complete observations. No analysis will be performed." msgstr "" "データセットには完全なオブザベーションが含まれていません.解析は行われませ" "ん." #: src/language/stats/factor.c:2014 msgid "The dataset has no complete covariance or correlation matrix." msgstr "" #: src/language/stats/factor.c:2071 msgid "Analysis N" msgstr "分析データ数" #: src/language/stats/factor.c:2099 msgid "KMO and Bartlett's Test" msgstr "KMO・バートレット検定" #: src/language/stats/factor.c:2103 msgid "Kaiser-Meyer-Olkin Measure of Sampling Adequacy" msgstr "カイザー・マイヤー・オルキンのサンプリング適切性尺度" #: src/language/stats/factor.c:2105 msgid "Bartlett's Test of Sphericity" msgstr "バートレットの球面性検定" #: src/language/stats/factor.c:2106 msgid "Approx. Chi-Square" msgstr "近似カイ2乗値" #: src/language/stats/factor.c:2154 #, c-format msgid "" "The %s criteria result in zero factors extracted. Therefore no analysis will " "be performed." msgstr "" "%s 基準により因子はまったく抽出されませんでした.したがって解析は行われませ" "ん." #: src/language/stats/factor.c:2161 #, c-format msgid "" "The %s criteria result in more factors than variables, which is not " "meaningful. No analysis will be performed." msgstr "" "%s 基準により意味がない変数の数以上の因子が抽出されました.解析は行われませ" "ん." #: src/language/stats/factor.c:2254 msgid "Component Matrix" msgstr "成分行列" #: src/language/stats/factor.c:2254 msgid "Factor Matrix" msgstr "因子行列" #: src/language/stats/factor.c:2259 msgid "Pattern Matrix" msgstr "因子パターン行列" #: src/language/stats/factor.c:2268 msgid "Structure Matrix" msgstr "因子構造行列" #: src/language/stats/factor.c:2270 msgid "Rotated Component Matrix" msgstr "回転後の成分行列" #: src/language/stats/factor.c:2271 msgid "Rotated Factor Matrix" msgstr "回転後の因子行列" #: src/language/stats/flip.c:100 #, c-format msgid "%s ignores %s. Temporary transformations will be made permanent." msgstr "%s は %s を無視しました.一時的な変換が確定されます." #: src/language/stats/flip.c:153 #, c-format msgid "Could not create temporary file for %s." msgstr "%s 用の一時ファイルを新規作成できませんでした." #: src/language/stats/flip.c:341 #, c-format msgid "Error rewinding %s file: %s." msgstr "%s ファイルの「巻き戻し」エラー: %s." #: src/language/stats/flip.c:348 #, c-format msgid "Error creating %s source file." msgstr "%s ソースファイルの新規作成エラー." #: src/language/stats/flip.c:361 #, c-format msgid "Error reading %s file: %s." msgstr "%s ファイルの読み込みエラー: %s." #: src/language/stats/flip.c:363 #, c-format msgid "Unexpected end of file reading %s file." msgstr "%s ファイル読み込み中の予期せぬファイル終端." #: src/language/stats/flip.c:379 #, c-format msgid "Error seeking %s source file: %s." msgstr "%s ソースファイルの探索エラー: %s." #: src/language/stats/flip.c:387 #, c-format msgid "Error writing %s source file: %s." msgstr "%s ソースワイルの書き込みエラー: %s." #: src/language/stats/flip.c:402 #, c-format msgid "Error rewinding %s source file: %s." msgstr "%s ソースファイルの「巻き戻し」エラー: %s." #: src/language/stats/flip.c:433 #, c-format msgid "Error reading %s temporary file: %s." msgstr "%s 一時ファイルの読み込みエラー: %s." #: src/language/stats/flip.c:436 #, c-format msgid "Unexpected end of file reading %s temporary file." msgstr "%s 一時ファイル読み込み中の予期せぬファイル終端." #: src/language/stats/frequencies.c:144 #: src/ui/gui/psppire-dialog-action-frequencies.c:49 msgid "Mode" msgstr "最頻値" #: src/language/stats/frequencies.c:303 src/language/stats/logistic.c:1381 #: src/output/charts/plot-hist-cairo.c:112 msgid "Frequency" msgstr "度数" #: src/language/stats/frequencies.c:305 msgid "Valid Percent" msgstr "有効パーセント" #: src/language/stats/frequencies.c:306 src/language/stats/graph.c:208 msgid "Cumulative Percent" msgstr "累積パーセント" #: src/language/stats/frequencies.c:905 msgid "Histogram frequency must be greater than zero." msgstr "ヒストグラムでの頻度は 0 より大きくなければなりません." #: src/language/stats/frequencies.c:923 msgid "Histogram percentage must be greater than zero." msgstr "ヒストグラムのパーセント表示は 0 より大きくなければなりません." #: src/language/stats/frequencies.c:1139 #, c-format msgid "" "%s for histogram must be greater than or equal to %s, but %s was specified " "as %.15g and %s as %.15g. %s and %s will be ignored." msgstr "" "ヒストグラムにおける %s は %s よりも大きいか等しくなければなりませんが,%s " "は %.15g,%s は %.15g と指定されていました.%s と %s は無視されます." #: src/language/stats/frequencies.c:1184 #, c-format msgid "" "%s for pie chart must be greater than or equal to %s, but %s was specified " "as %.15g and %s as %.15g. %s and %s will be ignored." msgstr "" "円グラフにおける %s は %s よりも大きいか等しくなければなりませんが,%s は " "%.15g,%s は %.15g と指定されていました.%s と %s は無視されます." #: src/language/stats/frequencies.c:1474 #, c-format msgid "Omitting pie chart for %s, which has only %d unique values." msgstr "%s の円グラフは省略(ユニークな値が %d しかないため)" #: src/language/stats/frequencies.c:1477 #, c-format msgid "Omitting pie chart for %s, which has over 50 unique values." msgstr "%s の円グラフは省略(異なる値が 50 を超えているため)" #: src/language/stats/frequencies.c:1494 src/language/stats/graph.c:205 #: src/language/stats/quick-cluster.c:747 #: src/ui/gui/psppire-dialog-action-crosstabs.c:90 #: src/language/stats/crosstabs.q:789 src/language/stats/crosstabs.q:1262 msgid "Count" msgstr "度数" #: src/language/stats/friedman.c:220 src/language/stats/kruskal-wallis.c:247 #: src/language/stats/mann-whitney.c:182 src/language/stats/wilcoxon.c:240 msgid "Ranks" msgstr "階数" #: src/language/stats/friedman.c:222 src/language/stats/friedman.c:223 #: src/language/stats/kruskal-wallis.c:251 #: src/language/stats/mann-whitney.c:186 src/language/stats/wilcoxon.c:245 msgid "Mean Rank" msgstr "平均順位" #: src/language/stats/friedman.c:253 msgid "Kendall's W" msgstr "Kendall の W" #: src/language/stats/friedman.c:256 src/language/stats/kruskal-wallis.c:298 #: src/language/stats/median.c:353 msgid "Chi-Square" msgstr "カイ2乗" #: src/language/stats/glm.c:169 msgid "Multivariate analysis is not yet implemented" msgstr "多変量解析はまだ実装されていません." #: src/language/stats/glm.c:274 msgid "Only types 1, 2 & 3 sums of squares are currently implemented" msgstr "タイプ1,2,3平方和だけが今のところ実装されています." #: src/language/stats/glm.c:727 msgid "Tests of Between-Subjects Effects" msgstr "被験者間効果の検定" #: src/language/stats/glm.c:730 #, fuzzy #| msgid "Type %s Sum of Squares" msgid "Type I Sum Of Squares" msgstr "タイプ %s の平方和" #: src/language/stats/glm.c:731 #, fuzzy #| msgid "Type %s Sum of Squares" msgid "Type II Sum Of Squares" msgstr "タイプ %s の平方和" #: src/language/stats/glm.c:732 #, fuzzy #| msgid "Type %s Sum of Squares" msgid "Type III Sum Of Squares" msgstr "タイプ %s の平方和" #: src/language/stats/glm.c:734 src/language/stats/oneway.c:976 #: src/language/stats/regression.c:1026 msgid "Mean Square" msgstr "平均平方" #: src/language/stats/glm.c:735 src/language/stats/oneway.c:977 #: src/language/stats/regression.c:1027 src/language/stats/t-test-indep.c:262 msgid "F" msgstr "F" #: src/language/stats/glm.c:740 msgid "Corrected Model" msgstr "修正モデル" #: src/language/stats/glm.c:740 msgid "Model" msgstr "モデル" #: src/language/stats/glm.c:752 msgid "Intercept" msgstr "切片" #: src/language/stats/glm.c:802 src/output/pivot-table.c:763 #: src/output/spv/spv.c:867 msgid "Error" msgstr "エラー" #: src/language/stats/glm.c:819 msgid "Corrected Total" msgstr "修正済み合計" #: src/language/stats/graph.c:206 msgid "Percentage" msgstr "パーセンテージ" #: src/language/stats/graph.c:207 msgid "Cumulative Count" msgstr "累積度数" #: src/language/stats/graph.c:296 #, c-format msgid "%s vs. %s by %s" msgstr "%s 対 %s (%s 別)" #: src/language/stats/graph.c:303 #, c-format msgid "%s vs. %s" msgstr "%s 対 %s" #: src/language/stats/graph.c:322 msgid "" "Maximum number of scatterplot categories reached. Your BY variable has too " "many distinct values. The coloring of the plot will not be correct." msgstr "" "散布図のカラゴリ数が上限に達しました.使われた BY 変数には異なる値が多すぎま" "す.プロットの識別色は正しく表示されていません." #: src/language/stats/graph.c:551 src/language/stats/rank.c:636 #, c-format msgid "%s of %s" msgstr "%s / %s" #: src/language/stats/graph.c:698 src/language/stats/graph.c:729 #: src/language/stats/graph.c:777 msgid "Only one chart type is allowed." msgstr "チャートタイプは1つしか指定できません." #: src/language/stats/graph.c:721 src/language/stats/graph.c:820 #: src/language/stats/graph.c:834 msgid "Only one variable is allowed." msgstr "許される変数は1つだけです." #: src/language/stats/graph.c:843 msgid "Variable expected" msgstr "変数でなければなりません." #: src/language/stats/graph.c:883 msgid "FOOTNOTE is not implemented yet for GRAPH" msgstr "GRAPH には FOOTNOTE がまだ実装されていません." #: src/language/stats/ks-one-sample.c:274 src/ui/gui/ks-one-sample.ui:24 msgid "One-Sample Kolmogorov-Smirnov Test" msgstr "1サンプルによる Kolmogorov-Smirnov 検定" #: src/language/stats/ks-one-sample.c:284 msgid "Uniform Parameters" msgstr "一様分布母数" #: src/language/stats/ks-one-sample.c:289 msgid "Normal Parameters" msgstr "正規分布母数" #: src/language/stats/ks-one-sample.c:294 msgid "Poisson Parameters" msgstr "ポアソン分布母数" #: src/language/stats/ks-one-sample.c:295 #: src/ui/gui/psppire-dialog-action-crosstabs.c:76 #: src/language/stats/crosstabs.q:1421 msgid "Lambda" msgstr "ラムダ" #: src/language/stats/ks-one-sample.c:300 msgid "Exponential Parameters" msgstr "指数分布母数" #: src/language/stats/ks-one-sample.c:308 msgid "Most Extreme Differences" msgstr "最大差異" #: src/language/stats/ks-one-sample.c:309 msgid "Absolute" msgstr "絶対" #: src/language/stats/ks-one-sample.c:309 src/language/stats/roc.c:1037 msgid "Positive" msgstr "正" #: src/language/stats/ks-one-sample.c:309 src/language/stats/roc.c:1037 msgid "Negative" msgstr "負" #: src/language/stats/ks-one-sample.c:312 msgid "Kolmogorov-Smirnov Z" msgstr "コルモゴロフ・スミルノフの Z" #: src/language/stats/ks-one-sample.c:313 #: src/language/stats/jonckheere-terpstra.c:374 #: src/language/stats/mann-whitney.c:251 src/language/stats/runs.c:328 #: src/language/stats/wilcoxon.c:284 msgid "Asymp. Sig. (2-tailed)" msgstr "近似的有意水準(両側検定)" #: src/language/stats/logistic.c:327 msgid "All predicted values are either 1 or 0" msgstr "すべての予測値は1か0です." #: src/language/stats/logistic.c:525 msgid "Dependent variable's values are not dichotomous." msgstr "従属変数の値が2値型ではありません." #: src/language/stats/logistic.c:614 #, c-format msgid "" "Category %s does not have at least two distinct values. Logistic regression " "will not be run." msgstr "" "カテゴリー %s は少なくとも2つの別個の値を持っていません.ロジスティック回帰分" "析は実行されません." #: src/language/stats/logistic.c:674 #, c-format msgid "" "Estimation terminated at iteration number %d because parameter estimates " "changed by less than %g" msgstr "" "推定は反復回数 %d で終了しました.パラメータ推定値が %g に変化したためです." #: src/language/stats/logistic.c:686 #, c-format msgid "" "Estimation terminated at iteration number %d because Log Likelihood " "decreased by less than %g%%" msgstr "" "推定は反復回数 %d で終了しました.対数尤度が %g%% 未満に減少したためです." #: src/language/stats/logistic.c:701 #, c-format msgid "" "Estimation terminated at iteration number %d because maximum iterations has " "been reached" msgstr "推定は反復回数 %d で終了しました.最大反復回数に達したためです." #: src/language/stats/logistic.c:994 msgid "Cut point value must be in the range [0,1]" msgstr "カット点の値は0以上1以下でなければなりません." #: src/language/stats/logistic.c:1139 msgid "Dependent Variable Encoding" msgstr "従属変数のコード化" #: src/language/stats/logistic.c:1141 msgid "Mapping" msgstr "" #: src/language/stats/logistic.c:1142 msgid "Internal Value" msgstr "インターナル値" #: src/language/stats/logistic.c:1145 msgid "Original Value" msgstr "元の値" #: src/language/stats/logistic.c:1167 msgid "Variables in the Equation" msgstr "等式内の変数群" #: src/language/stats/logistic.c:1171 src/language/stats/regression.c:902 msgid "B" msgstr "B" #: src/language/stats/logistic.c:1172 msgid "S.E." msgstr "標準誤差" #: src/language/stats/logistic.c:1173 msgid "Wald" msgstr "ウォード" #: src/language/stats/logistic.c:1176 msgid "Exp(B)" msgstr "Exp(B)" #: src/language/stats/logistic.c:1181 #, c-format msgid "%d%% CI for Exp(B)" msgstr "%d%% CI for Exp(B)" #: src/language/stats/logistic.c:1183 src/language/stats/t-test-indep.c:274 #: src/language/stats/t-test-one-sample.c:83 #: src/language/stats/t-test-paired.c:249 src/language/stats/crosstabs.q:1369 msgid "Lower" msgstr "下限" #: src/language/stats/logistic.c:1183 src/language/stats/t-test-indep.c:275 #: src/language/stats/t-test-one-sample.c:84 #: src/language/stats/t-test-paired.c:250 src/language/stats/crosstabs.q:1370 msgid "Upper" msgstr "上限" #: src/language/stats/logistic.c:1189 src/language/stats/logistic.c:1470 msgid "Step 1" msgstr "ステップ1" #: src/language/stats/logistic.c:1263 msgid "Constant" msgstr "定数" #: src/language/stats/logistic.c:1298 msgid "Model Summary" msgstr "モデル要約" #: src/language/stats/logistic.c:1301 msgid "-2 Log likelihood" msgstr "-2対数尤度" #: src/language/stats/logistic.c:1302 msgid "Cox & Snell R Square" msgstr "コックス・スネルのR2乗" #: src/language/stats/logistic.c:1303 msgid "Nagelkerke R Square" msgstr "ナゲルケルケの R2 乗" #: src/language/stats/logistic.c:1306 src/language/stats/logistic.c:1470 #, fuzzy #| msgid "Step 1" msgid "Step" msgstr "ステップ1" #: src/language/stats/logistic.c:1335 msgid "Unweighted Cases" msgstr "ケースの重み付け" #: src/language/stats/logistic.c:1336 msgid "Included in Analysis" msgstr "分析に投入" #: src/language/stats/logistic.c:1336 msgid "Missing Cases" msgstr "欠損ケース" #: src/language/stats/logistic.c:1365 msgid "Categorical Variables' Codings" msgstr "カテゴリ変数にコード化" #: src/language/stats/logistic.c:1380 #, fuzzy #| msgid "Encodings" msgid "Codings" msgstr "エンコーディング" #: src/language/stats/logistic.c:1383 msgid "Parameter coding" msgstr "パラメータコーディング" #: src/language/stats/logistic.c:1462 msgid "Classification Table" msgstr "分類表" #: src/language/stats/logistic.c:1466 msgid "Predicted" msgstr "予測" #: src/language/stats/logistic.c:1466 #, fuzzy #| msgid "" #| "Percentage\n" #| "Correct" msgid "Percentage Correct" msgstr "パーセンテージ:上" #: src/language/stats/logistic.c:1468 msgid "Observed" msgstr "観測地" #: src/language/stats/logistic.c:1468 msgid "Overall Percentage" msgstr "全体のパーセント" #: src/language/stats/jonckheere-terpstra.c:357 msgid "Jonckheere-Terpstra Test" msgstr "ヨンクヒール・タプストラ検定" #: src/language/stats/jonckheere-terpstra.c:364 #, c-format msgid "Number of levels in %s" msgstr "%s の水準数" #: src/language/stats/jonckheere-terpstra.c:370 msgid "Observed J-T Statistic" msgstr "観測 J-T 統計" #: src/language/stats/jonckheere-terpstra.c:371 msgid "Mean J-T Statistic" msgstr "平均J-T統計" #: src/language/stats/jonckheere-terpstra.c:372 msgid "Std. Deviation of J-T Statistic" msgstr "J-T統計の標準偏差" #: src/language/stats/jonckheere-terpstra.c:373 msgid "Std. J-T Statistic" msgstr "標準J-T統計" #: src/language/stats/mann-whitney.c:187 src/language/stats/wilcoxon.c:246 msgid "Sum of Ranks" msgstr "順位和" #: src/language/stats/mann-whitney.c:248 msgid "Mann-Whitney U" msgstr "マン・ホイットニーのU" #: src/language/stats/mann-whitney.c:249 msgid "Wilcoxon W" msgstr "ウィルコクソンのW" #: src/language/stats/mann-whitney.c:250 src/language/stats/runs.c:327 #: src/language/stats/wilcoxon.c:283 msgid "Z" msgstr "Z" #: src/language/stats/means.c:702 msgid "Included" msgstr "包含" #: src/language/stats/means.c:704 src/language/stats/reliability.c:548 msgid "Excluded" msgstr "除外" #: src/language/stats/means.c:753 msgid "Report" msgstr "レポート" #: src/language/stats/means.c:838 #, fuzzy, c-format #| msgid "" #| "Dependent variable %s has no non-missing values. No analysis for this " #| "variable will be done." msgid "" "The table \"%s\" has no non-empty control variables. No result for this " "table will be displayed." msgstr "" "従属変数 %s には非欠損値が有りません.この変数のための分析は行われません." #: src/language/stats/means-calc.c:443 msgid "Group Median" msgstr "グループ中央値" #: src/language/stats/means-calc.c:455 msgid "First" msgstr "最初" #: src/language/stats/means-calc.c:456 msgid "Last" msgstr "最後" #: src/language/stats/means-calc.c:458 msgid "Percent N" msgstr "パーセント N" #: src/language/stats/means-calc.c:459 msgid "Percent Sum" msgstr "パーセント和" #: src/language/stats/means-calc.c:461 msgid "Harmonic Mean" msgstr "調和平均" #: src/language/stats/means-calc.c:462 msgid "Geom. Mean" msgstr "幾何平均" #: src/language/stats/mcnemar.c:144 msgid "The McNemar test is appropriate only for dichotomous variables" msgstr "マクネマー検定は2値データに限って有効です." #: src/language/stats/mcnemar.c:226 src/language/stats/sign.c:105 msgid "Point Probability" msgstr "ポイント確率" #: src/language/stats/mcnemar.c:229 src/language/stats/sign.c:78 #: src/language/stats/sign.c:108 src/language/stats/t-test-paired.c:199 #: src/language/stats/t-test-paired.c:257 src/language/stats/wilcoxon.c:253 #: src/language/stats/wilcoxon.c:292 #, fuzzy #| msgid "Pair %d" msgid "Pairs" msgstr "ペア %d" #: src/language/stats/median.c:316 msgid "> Median" msgstr "> 中央値" #: src/language/stats/median.c:316 msgid "≤ Median" msgstr "≤ 中央値" #: src/language/stats/npar.c:536 #, c-format msgid "%s subcommand not currently implemented." msgstr "%s サブコマンドはまだ実装されていません." #: src/language/stats/npar.c:691 #, c-format msgid "Expecting %s, %s, %s or a number." msgstr "%s か %s, %s または数値が必要です." #: src/language/stats/npar.c:845 #, c-format msgid "" "The specified value of HI (%d) is lower than the specified value of LO (%d)" msgstr "指定されたHIの値(%d)は指定されたLOの値 (%d) よりも小さいです." #: src/language/stats/npar.c:897 #, c-format msgid "" "%d expected values were given, but the specified range (%d-%d) requires " "exactly %d values." msgstr "" "%d 個の期待度数が与えられていますが指定された範囲(%d - %d)にはきっちり %d 個" "の値が必要です." #: src/language/stats/npar.c:1118 src/language/stats/t-test-parser.c:173 #, c-format msgid "" "PAIRED was specified but the number of variables preceding WITH (%zu) did " "not match the number following (%zu)." msgstr "" "PAIRED が指定されましたが WITH に先行する変数の数(%zu)は,それに続く数(%zu)と" "一致しませんでした." #: src/language/stats/oneway.c:361 msgid "LSD" msgstr "LSD" #: src/language/stats/oneway.c:362 src/ui/gui/oneway.ui:338 msgid "Tukey HSD" msgstr "テューキーの HSD" #: src/language/stats/oneway.c:363 src/ui/gui/oneway.ui:253 msgid "Bonferroni" msgstr "ボンフェローニ" #: src/language/stats/oneway.c:364 src/ui/gui/oneway.ui:304 msgid "Scheffé" msgstr "シェッフェ" #: src/language/stats/oneway.c:365 msgid "Games-Howell" msgstr "ゲームズ・ハウエル" #: src/language/stats/oneway.c:366 src/ui/gui/oneway.ui:321 msgid "Šidák" msgstr "シダック" #: src/language/stats/oneway.c:519 #, c-format msgid "The post hoc analysis method %s is not supported." msgstr "事後における多重比較の検定法 %s はサポートされていません." #: src/language/stats/oneway.c:842 #, c-format msgid "" "Dependent variable %s has no non-missing values. No analysis for this " "variable will be done." msgstr "" "従属変数 %s には非欠損値が有りません.この変数のための分析は行われません." #: src/language/stats/oneway.c:924 #, c-format msgid "" "In contrast list %zu, the number of coefficients (%zu) does not equal the " "number of groups (%d). This contrast list will be ignored." msgstr "" "対比リスト %zu において,係数の数(%zu)がグループの数(%d)と等しくありません." "この対比リストは無視されます." #: src/language/stats/oneway.c:936 #, c-format msgid "Coefficients for contrast %zu do not total zero" msgstr "対比係数 %zu の合計が0でありません." #: src/language/stats/oneway.c:971 msgid "ANOVA" msgstr "分散分析" #: src/language/stats/oneway.c:974 src/language/stats/regression.c:1024 msgid "Sum of Squares" msgstr "平方和" #: src/language/stats/oneway.c:981 msgid "Between Groups" msgstr "群間" #: src/language/stats/oneway.c:981 msgid "Within Groups" msgstr "郡内" #: src/language/stats/oneway.c:1075 src/language/stats/oneway.c:1257 #, fuzzy #| msgid "_Dependent Variable" msgid "Dependent Variable" msgstr "従属変数(_D)" #: src/language/stats/oneway.c:1148 msgid "Test of Homogeneity of Variances" msgstr "分散の等質性検定" #: src/language/stats/oneway.c:1151 msgid "Levene Statistic" msgstr "レーベンの検定" #: src/language/stats/oneway.c:1152 msgid "df1" msgstr "df1" #: src/language/stats/oneway.c:1153 msgid "df2" msgstr "df2" #: src/language/stats/oneway.c:1192 msgid "Contrast Coefficients" msgstr "対比係数" #: src/language/stats/oneway.c:1199 src/language/stats/oneway.c:1246 msgid "Contrast" msgstr "対比" #: src/language/stats/oneway.c:1236 msgid "Contrast Tests" msgstr "対比検定" #: src/language/stats/oneway.c:1239 msgid "Value of Contrast" msgstr "対比値" #: src/language/stats/oneway.c:1241 src/language/stats/regression.c:905 #: src/language/stats/t-test-indep.c:266 #: src/language/stats/t-test-one-sample.c:74 #: src/language/stats/t-test-paired.c:252 msgid "t" msgstr "t" #: src/language/stats/oneway.c:1252 msgid "Assumption" msgstr "" #: src/language/stats/oneway.c:1253 msgid "Assume equal variances" msgstr "等分散を仮定する." #: src/language/stats/oneway.c:1254 #, fuzzy #| msgid "Does not assume equal" msgid "Does not assume equal variances" msgstr "等分散を仮定しない." #: src/language/stats/oneway.c:1367 #, c-format msgid "Multiple Comparisons (%s)" msgstr "多重比較(%s)" #: src/language/stats/oneway.c:1374 #, fuzzy #| msgid "Mean Difference" msgid "Mean Difference (I - J)" msgstr "平均の差" #: src/language/stats/oneway.c:1379 #, c-format msgid "%g%% Confidence Interval" msgstr "%g%% 信頼区間" #: src/language/stats/oneway.c:1386 src/language/stats/oneway.c:1390 msgid "(J) Family" msgstr "" #: src/language/stats/oneway.c:1406 #, fuzzy #| msgid "Runs Test" msgid "Test" msgstr "ラン(連)検定" #: src/language/stats/quick-cluster.c:576 msgid "Initial Cluster Centers" msgstr "初期クラスタ起点" #: src/language/stats/quick-cluster.c:577 msgid "Final Cluster Centers" msgstr "最終クラスタ起点" #: src/language/stats/quick-cluster.c:580 #: src/language/stats/quick-cluster.c:660 #: src/language/stats/quick-cluster.c:661 #: src/language/stats/quick-cluster.c:753 msgid "Cluster" msgstr "クラスタ" #: src/language/stats/quick-cluster.c:658 msgid "Cluster Membership" msgstr "クラスタのメンバーシップ" #: src/language/stats/quick-cluster.c:744 msgid "Number of Cases in each Cluster" msgstr "各クラスタ内のケース数" #: src/language/stats/quick-cluster.c:750 #, fuzzy #| msgid "Cluster" msgid "Clusters" msgstr "クラスタ" #: src/language/stats/quick-cluster.c:867 #: src/language/stats/quick-cluster.c:893 #, fuzzy, c-format #| msgid "Variable %s already exists." msgid "A variable called `%s' already exists." msgstr "変数 %s はすでに存在します." #: src/language/stats/quick-cluster.c:908 #, fuzzy, c-format #| msgid "expecting %s or %s" msgid "Expecting %s or %s." msgstr "%s か %s が必要です." #: src/language/stats/quick-cluster.c:928 msgid "The number of clusters must be positive" msgstr "クラスタ数は正でなければなりません." #: src/language/stats/quick-cluster.c:944 #, fuzzy #| msgid "The convergence criterium must be positive" msgid "The convergence criterion must be positive" msgstr "収束基準はは正でなければなりません." #: src/language/stats/quick-cluster.c:960 msgid "The number of iterations must be positive" msgstr "反復回数は正でなければなりません." #: src/language/stats/rank.c:205 #, c-format msgid "" "Cannot generate variable name for ranking %s with %s. All candidates in use." msgstr "" "%s の順位付け(%s による)のための変数名を生成することができません.すべての" "候補対象は使用中です." #: src/language/stats/rank.c:321 #, c-format msgid "Too many variables in %s clause." msgstr "%s 句の変数は多すぎます." #: src/language/stats/rank.c:323 #, c-format msgid "Variable %s already exists." msgstr "変数 %s はすでに存在します." #: src/language/stats/rank.c:325 src/language/expressions/evaluate.c:164 #, c-format msgid "Duplicate variable name %s." msgstr "重複した変数名 %s." #: src/language/stats/rank.c:631 #, c-format msgid "%s of %s by %s" msgstr "%s(%s 中で %s によるもの)" #: src/language/stats/rank.c:825 #, fuzzy #| msgid "Variables Created By %s" msgid "Variables Created by RANK" msgstr "%s によって作成された変数" #: src/language/stats/rank.c:828 src/language/stats/rank.c:829 #, fuzzy #| msgid "Name Variable:" msgid "New Variable" msgstr "名前変数:" #: src/language/stats/rank.c:829 #, fuzzy #| msgid "Function: " msgid "Function" msgstr "関数:" #: src/language/stats/rank.c:830 #, fuzzy #| msgid "Extraction" msgid "Fraction" msgstr "抽出の基準" #: src/language/stats/rank.c:830 #, fuzzy #| msgid "_Grouping Variable:" msgid "Grouping Variables" msgstr "グループ化変数(_G):" #: src/language/stats/rank.c:833 src/language/stats/rank.c:834 #, fuzzy #| msgid "Insert Variable" msgid "Existing Variable" msgstr "変数の挿入" #: src/language/stats/reliability.c:164 msgid "Reliability on a single variable is not useful." msgstr "単一変数では信頼性は意味をもちません." #: src/language/stats/reliability.c:281 msgid "" "The STATISTICS subcommand is not yet implemented. No statistics will be " "produced." msgstr "" "STATISTICS サブコマンドはまだ実装されていません.追加統計は出力されません." #: src/language/stats/reliability.c:300 msgid "The split point must be less than the number of variables" msgstr "分割点は変数の数より少なければなりません." #: src/language/stats/reliability.c:525 #, c-format msgid "Scale: %s" msgstr "尺度: %s" #: src/language/stats/reliability.c:582 msgid "Item-Total Statistics" msgstr "全項目の統計" #: src/language/stats/reliability.c:585 msgid "Scale Mean if Item Deleted" msgstr "当該項目を除いた尺度平均" #: src/language/stats/reliability.c:586 msgid "Scale Variance if Item Deleted" msgstr "当該項目を除いた分散" #: src/language/stats/reliability.c:587 msgid "Corrected Item-Total Correlation" msgstr "修正済み項目ー合計相関" #: src/language/stats/reliability.c:588 msgid "Cronbach's Alpha if Item Deleted" msgstr "当該項目を除いたクロンバックのアルファ(α)" #: src/language/stats/reliability.c:627 msgid "Reliability Statistics" msgstr "信頼性統計" #: src/language/stats/reliability.c:634 src/language/stats/reliability.c:646 msgid "Cronbach's Alpha" msgstr "クロンバックのアルファ(α)" #: src/language/stats/reliability.c:635 src/language/stats/reliability.c:649 #: src/language/stats/reliability.c:652 msgid "N of Items" msgstr "アイテム数" #: src/language/stats/reliability.c:647 msgid "Part 1" msgstr "パート 1" #: src/language/stats/reliability.c:650 msgid "Part 2" msgstr "パート 2" #: src/language/stats/reliability.c:654 msgid "Total N of Items" msgstr "全アイテム数" #: src/language/stats/reliability.c:656 msgid "Correlation Between Forms" msgstr "フォーム間の相関" #: src/language/stats/reliability.c:659 msgid "Spearman-Brown Coefficient" msgstr "スピアマン・ブラウン係数" #: src/language/stats/reliability.c:660 msgid "Equal Length" msgstr "等長" #: src/language/stats/reliability.c:661 msgid "Unequal Length" msgstr "不等長" #: src/language/stats/reliability.c:663 msgid "Guttman Split-Half Coefficient" msgstr "ガットマンの折半係数" #: src/language/stats/roc.c:966 msgid "Area Under the Curve" msgstr "曲線以下のエリア" #: src/language/stats/roc.c:970 msgid "Area" msgstr "エリア" #: src/language/stats/roc.c:976 msgid "Asymptotic Sig." msgstr "近似的有意水準" #: src/language/stats/roc.c:979 #, c-format msgid "Asymp. %g%% Confidence Interval" msgstr "漸近 %g%% 信頼区間" #: src/language/stats/roc.c:987 msgid "Variable under test" msgstr "検定対象の変数" #: src/language/stats/roc.c:1026 msgid "Case Summary" msgstr "ケース要約" #: src/language/stats/roc.c:1030 msgid "Unweighted" msgstr "非加重" #: src/language/stats/roc.c:1031 msgid "Weighted" msgstr "加重" #: src/language/stats/roc.c:1064 msgid "Coordinates of the Curve" msgstr "曲線の座標" #: src/language/stats/roc.c:1068 msgid "Positive if greater than or equal to" msgstr "以上であれば正" #: src/language/stats/roc.c:1069 src/output/charts/roc-chart-cairo.c:38 msgid "Sensitivity" msgstr "感度" #: src/language/stats/roc.c:1069 src/output/charts/roc-chart-cairo.c:37 msgid "1 - Specificity" msgstr "1 - 特異度" #: src/language/stats/roc.c:1072 #, fuzzy #| msgid "ordinary" msgid "Coordinates" msgstr "通常の" #: src/language/stats/roc.c:1076 msgid "Test variable" msgstr "検定変数" #: src/language/stats/regression.c:224 src/language/stats/regression.c:229 #, fuzzy, c-format #| msgid "%s may not appear after %s." msgid "VARIABLES may not appear after %s" msgstr "%s が %s 以後にありません." #: src/language/stats/regression.c:412 msgid "" "REGRESSION with SAVE ignores TEMPORARY. Temporary transformations will be " "made permanent." msgstr "" "SAVE が指定された REGRESSION では TEMPORARY は無視されます.一時的な変換は確" "定されます." #: src/language/stats/regression.c:416 msgid "REGRESSION with SAVE ignores FILTER. All cases will be processed." msgstr "" "SAVE を伴う REGRESSIONにより FILTER は無視されます.すべてのケースが処理され" "ます." #: src/language/stats/regression.c:569 msgid "" "The dependent variable is equal to the independent variable. The least " "squares line is therefore Y=X. Standard errors and related statistics may be " "meaningless." msgstr "" "従属変数が独立変数は同じです.したがって最小2乗直線はY=Xとなります.標準誤差" "および関連する統計は無意味となります." #: src/language/stats/regression.c:776 msgid "No valid data found. This command was skipped." msgstr "適正なコマンドが見つかりません.このコマンドはスキップされました." #: src/language/stats/regression.c:863 #, c-format msgid "Model Summary (%s)" msgstr "モデル要約 (%s)" #: src/language/stats/regression.c:868 #: src/ui/gui/psppire-dialog-action-regression.c:42 msgid "R" msgstr "R" #: src/language/stats/regression.c:868 msgid "R Square" msgstr "R2乗" #: src/language/stats/regression.c:868 msgid "Adjusted R Square" msgstr "自由度調整済みR2乗" #: src/language/stats/regression.c:869 msgid "Std. Error of the Estimate" msgstr "推定の標準誤差" #: src/language/stats/regression.c:895 #, c-format msgid "Coefficients (%s)" msgstr "係数 (%s)" #: src/language/stats/regression.c:901 msgid "Unstandardized Coefficients" msgstr "非基準化係数" #: src/language/stats/regression.c:904 msgid "Standardized Coefficients" msgstr "基準化係数" #: src/language/stats/regression.c:904 msgid "Beta" msgstr "ベータ" #: src/language/stats/regression.c:911 #, c-format msgid "%g%% Confidence Interval for B" msgstr "B の %g%% 信頼区間" #: src/language/stats/regression.c:919 #, fuzzy #| msgid "Reliability Statistics" msgid "Collinearity Statistics" msgstr "信頼性統計" #: src/language/stats/regression.c:920 #, fuzzy #| msgid "Covariance" msgid "Tolerance" msgstr "共分散" #: src/language/stats/regression.c:920 msgid "VIF" msgstr "" #: src/language/stats/regression.c:933 msgid "(Constant)" msgstr "(定数)" #: src/language/stats/regression.c:1020 #, c-format msgid "ANOVA (%s)" msgstr "分散分析 (%s)" #: src/language/stats/regression.c:1031 src/ui/gui/regression.ui:24 msgid "Regression" msgstr "回帰" #: src/language/stats/regression.c:1075 #, c-format msgid "Coefficient Correlations (%s)" msgstr "係数相関 (%s)" #: src/language/stats/regression.c:1082 #, fuzzy #| msgid "Model" msgid "Models" msgstr "モデル" #: src/language/stats/regression.c:1090 msgid "Covariances" msgstr "共分散" #: src/language/stats/runs.c:169 #, c-format msgid "" "Multiple modes exist for variable `%s'. Using %.*g as the threshold value." msgstr "複数のモードが変数`%s 'には存在します.閾値として %.*g が使われます." #: src/language/stats/runs.c:314 src/ui/gui/runs.ui:24 msgid "Runs Test" msgstr "ラン(連)検定" #: src/language/stats/runs.c:319 msgid "Test Value" msgstr "検定値" #: src/language/stats/runs.c:320 msgid "Test Value (mode)" msgstr "検定値 (最頻値)" #: src/language/stats/runs.c:321 msgid "Test Value (mean)" msgstr "検定値(平均)" #: src/language/stats/runs.c:322 msgid "Test Value (median)" msgstr "検定値 (中央値)" #: src/language/stats/runs.c:323 msgid "Cases < Test Value" msgstr "ケース < 検定値" #: src/language/stats/runs.c:324 msgid "Cases ≥ Test Value" msgstr "ケース ≥ 検定値" #: src/language/stats/runs.c:325 msgid "Total Cases" msgstr "全ケース数" #: src/language/stats/runs.c:326 msgid "Number of Runs" msgstr "ラン(連)の数" #: src/language/stats/sign.c:72 #, fuzzy #| msgid "Mean Difference" msgid "Differences" msgstr "平均の差" #: src/language/stats/sign.c:73 msgid "Negative Differences" msgstr "負の差分" #: src/language/stats/sign.c:74 msgid "Positive Differences" msgstr "正の差分" #: src/language/stats/sign.c:75 src/language/stats/wilcoxon.c:250 msgid "Ties" msgstr "同順位" #: src/language/stats/sort-cases.c:63 msgid "Buffer limit must be at least 2." msgstr "バッファのリミットは少なくとも2でなければなりません." #: src/language/stats/sort-criteria.c:89 #, c-format msgid "Variable %s specified twice in sort criteria." msgstr "変数 %s は並べ替え基準で2度指定されています." #: src/language/stats/t-test-indep.c:190 msgid "Group Statistics" msgstr "グループ統計" #: src/language/stats/t-test-indep.c:200 #, fuzzy #| msgid "Group1" msgid "Group" msgstr "グループ1" #: src/language/stats/t-test-indep.c:256 msgid "Independent Samples Test" msgstr "独立したサンプルのt検定" #: src/language/stats/t-test-indep.c:261 msgid "Levene's Test for Equality of Variances" msgstr "レーベンの分散同等性検定" #: src/language/stats/t-test-indep.c:265 #, fuzzy #| msgid "t-test for Equality of Means" msgid "T-Test for Equality of Means" msgstr "平均値同等性のt検定" #: src/language/stats/t-test-indep.c:269 #: src/language/stats/t-test-one-sample.c:77 msgid "Mean Difference" msgstr "平均の差" #: src/language/stats/t-test-indep.c:270 msgid "Std. Error Difference" msgstr "標準誤差の差分" #: src/language/stats/t-test-indep.c:273 #, fuzzy, no-c-format #| msgid "%g%% Confidence Interval of the Difference" msgid "95% Confidence Interval of the Difference" msgstr "差分の %g%% 信頼区間" #: src/language/stats/t-test-indep.c:277 #, fuzzy #| msgid "Options" msgid "Assumptions" msgstr "オプション" #: src/language/stats/t-test-indep.c:278 msgid "Equal variances assumed" msgstr "等分散性を仮定する" #: src/language/stats/t-test-indep.c:279 msgid "Equal variances not assumed" msgstr "等分散性を仮定しない" #: src/language/stats/t-test-one-sample.c:64 msgid "One-Sample Test" msgstr "一標本検定" #: src/language/stats/t-test-one-sample.c:71 #, fuzzy, c-format #| msgid "Test Value = %f" msgid "Test Value = %.*g" msgstr "検定値 = %f" #: src/language/stats/t-test-one-sample.c:80 #: src/language/stats/t-test-paired.c:246 #, c-format msgid "%g%% Confidence Interval of the Difference" msgstr "差分の %g%% 信頼区間" #: src/language/stats/t-test-one-sample.c:122 msgid "One-Sample Statistics" msgstr "一標本統計" #: src/language/stats/t-test-paired.c:147 msgid "Paired Sample Statistics" msgstr "対応のあるサンプルの統計" #: src/language/stats/t-test-paired.c:163 #: src/language/stats/t-test-paired.c:205 #: src/language/stats/t-test-paired.c:263 #, fuzzy, c-format #| msgid "Pair %d" msgid "Pair %zu" msgstr "ペア %d" #: src/language/stats/t-test-paired.c:190 msgid "Paired Samples Correlations" msgstr "対応のあるサンプルの相関" #: src/language/stats/t-test-paired.c:208 #, c-format msgid "%s & %s" msgstr "%s & %s" #: src/language/stats/t-test-paired.c:234 msgid "Paired Samples Test" msgstr "対応のある標本の検定" #: src/language/stats/t-test-paired.c:240 msgid "Paired Differences" msgstr "対応がある差異" #: src/language/stats/t-test-paired.c:266 #, c-format msgid "%s - %s" msgstr "%s - %s" #: src/language/stats/t-test-parser.c:133 #, c-format msgid "When applying %s to a string variable, two values must be specified." msgstr "文字列変数に %s を適用する場合は,2つの値を指定する必要があります." #: src/language/stats/t-test-parser.c:145 #: src/language/stats/t-test-parser.c:241 #, c-format msgid "%s subcommand may not be used with %s." msgstr "%s サブコマンドは %s と共には使えません." #: src/language/stats/t-test-parser.c:305 msgid "Exactly one of TESTVAL, GROUPS and PAIRS subcommands must be specified." msgstr "" "TESTVAL, GROUP,PAIRSサブコマンドのいずれか1つだけを指定せねばなりません." #: src/language/stats/wilcoxon.c:248 #, fuzzy #| msgid "_Sign" msgid "Sign" msgstr "符号(_S)" #: src/language/stats/wilcoxon.c:249 msgid "Negative Ranks" msgstr "負の階数" #: src/language/stats/wilcoxon.c:249 msgid "Positive Ranks" msgstr "正の階数" #: src/language/stats/wilcoxon.c:296 #, fuzzy #| msgid "Too many pairs to calculate exact significance." msgid "Too many pairs to calculate exact significance" msgstr "正確な有意水準を計算するにはペア数が多すぎます." #: src/language/data-io/combine-files.c:214 msgid "Cannot specify the active dataset since none has been defined." msgstr "" "まだ定義されていないためアクティブなデータセットを指定することはできません." #: src/language/data-io/combine-files.c:220 msgid "" "This command may not be used after TEMPORARY when the active dataset is an " "input source. Temporary transformations will be made permanent." msgstr "" "このコマンドは,アクティブなデータセットが入力ソースの場合,TEMPORARYの後で使" "用することはできません.一時的な変換が確定されます." #: src/language/data-io/combine-files.c:255 msgid "Multiple IN subcommands for a single FILE or TABLE." msgstr "複数の IN サブコマンドが1つの FILE または TABLE にあります." #: src/language/data-io/combine-files.c:308 #, c-format msgid "File %s lacks BY variable %s." msgstr "ファイル %s では BY 変数 %s が足りません." #: src/language/data-io/combine-files.c:311 #, c-format msgid "Active dataset lacks BY variable %s." msgstr "アクティブなデータセットではBY変数 %s が足りません." #: src/language/data-io/combine-files.c:388 #: src/language/data-io/combine-files.c:393 #, c-format msgid "BY is required when %s is specified." msgstr "%s が指定されていると BY が必要です." #: src/language/data-io/combine-files.c:521 msgid "" "Combining files with incompatible encodings. String data may not be " "represented correctly." msgstr "" "互換性のないエンコーディングであるファイル同士の結合です.文字列データは正し" "く表示されません." #: src/language/data-io/combine-files.c:564 #, c-format msgid "" "Variable %s in file %s has different type or width from the same variable in " "earlier file." msgstr "" "変数 %s(%s 内)は以前のファイルにおける同じ変数とは異なるタイプまたは長さで" "す." #: src/language/data-io/combine-files.c:570 #, c-format msgid "In file %s, %s is numeric." msgstr "ファイル %s 内の %s は数字です." #: src/language/data-io/combine-files.c:573 #, c-format msgid "In file %s, %s is a string variable with width %d." msgstr "ファイル %s 内の %s は長さ %d の文字列です." #: src/language/data-io/combine-files.c:578 #, c-format msgid "In an earlier file, %s was numeric." msgstr "以前のファイルにおいて %s は数字でした." #: src/language/data-io/combine-files.c:581 #, c-format msgid "In an earlier file, %s was a string variable with width %d." msgstr "以前のファイルにおいて %s は長さ %d の文字列でした." #: src/language/data-io/combine-files.c:621 #, c-format msgid "" "Variable name %s specified on %s subcommand duplicates an existing variable " "name." msgstr "変数名 %s(サブコマンド %s内)は既存の変数名と重複しています." #: src/language/data-io/combine-files.c:793 #, c-format msgid "Encountered %zu sets of duplicate cases in the master file." msgstr "マスターファイルにおいて %zu 組の重複したケースに遭遇しました." #: src/language/data-io/data-list.c:129 src/language/data-io/data-list.c:144 #, fuzzy, c-format #| msgid "The %s value must be nonnegative." msgid "The %s value must be non-negative." msgstr "%s の値は非負でなければなりません." #: src/language/data-io/data-list.c:154 #, c-format msgid "The %s subcommand may only be used within %s." msgstr "%s サブコマンドは %s においてのみ使用できます." #: src/language/data-io/data-list.c:159 #, c-format msgid "The %s subcommand may only be specified once." msgstr "%s サブコマンドは1度だけしか指定できません." #: src/language/data-io/data-list.c:197 msgid "Only one of FIXED, FREE, or LIST may be specified." msgstr "FIXED または FREE,LIST のどれか1つしか使えません." #: src/language/data-io/data-list.c:260 msgid "Encoding should not be specified for inline data. It will be ignored." msgstr "" "エンコーディングはインラインデータに対して指定すべきではありません.無視され" "ます." #: src/language/data-io/data-list.c:269 #, c-format msgid "The %s subcommand may be used only with %s." msgstr "%s サブコマンドは %s とともにしか使えません." #: src/language/data-io/data-list.c:284 src/language/data-io/matrix-data.c:578 msgid "At least one variable must be specified." msgstr "少なくとも1つの変数は指定されねばなりません." #: src/language/data-io/data-list.c:383 src/language/data-io/data-list.c:491 #: src/language/data-io/get-data.c:662 #, c-format msgid "%s is a duplicate variable name." msgstr "%s は重複した変数名です." #: src/language/data-io/data-list.c:390 #, c-format msgid "There is already a variable %s of a different type." msgstr "異なる型の変数 %s がすでに存在します." #: src/language/data-io/data-list.c:397 #, c-format msgid "There is already a string variable %s of a different width." msgstr "異なる長さの文字列変数 %s がすでに存在します." #: src/language/data-io/data-list.c:405 #, c-format msgid "Cannot place variable %s on record %d when RECORDS=%d is specified." msgstr "" "変数 %s をレコード %d の格納できません.RECORDS = %d が指定されているためで" "す." #: src/language/data-io/data-parser.c:453 #: src/language/data-io/data-parser.c:462 msgid "Quoted string extends beyond end of line." msgstr "引用符で始まる文字列が1行を超えています." #: src/language/data-io/data-parser.c:488 msgid "Missing delimiter following quoted string." msgstr "引用符でくくられた文字列に続く区切記号がありません." #: src/language/data-io/data-parser.c:506 #, c-format msgid "Data for variable %s is not valid as format %s: %s" msgstr "変数 %s に対するデータはフォーマット %s にとっては不正です: %s" #: src/language/data-io/data-parser.c:536 #, c-format msgid "Partial case of %d of %d records discarded." msgstr "%d ケースに一部(%d レコード中)は破棄されました." #: src/language/data-io/data-parser.c:592 #, c-format msgid "Partial case discarded. The first variable missing was %s." msgstr "ケースの一部が読み捨てされました.失われた最初の変数は %s でした." #: src/language/data-io/data-parser.c:634 #, c-format msgid "" "Missing value(s) for all variables from %s onward. These will be filled " "with the system-missing value or blanks, as appropriate." msgstr "" "%s 以降のすべての変数は欠損値です.これらは適切なシステム欠損値または空白で埋" "められます." #: src/language/data-io/data-parser.c:655 msgid "Record ends in data not part of any field." msgstr "レコードはどのフィールドの一部分でもないデータで終わっています." #: src/language/data-io/data-parser.c:670 #, c-format msgid "Reading %d record from %s." msgid_plural "Reading %d records from %s." msgstr[0] "%d レコードを %sから読み込み中." #: src/language/data-io/data-parser.c:680 src/language/data-io/print.c:435 msgid "Record" msgstr "レコード" #: src/language/data-io/data-parser.c:680 src/language/data-io/print.c:435 #: src/ui/gui/psppire-var-sheet-header.c:76 msgid "Columns" msgstr "列" #: src/language/data-io/data-parser.c:680 #: src/language/data-io/data-parser.c:725 src/language/data-io/print.c:435 msgid "Format" msgstr "フォーマット" #: src/language/data-io/data-parser.c:720 #, c-format msgid "Reading free-form data from %s." msgstr "%s から自由形式のデータを読み込み中." #. TRANSLATORS: this fragment will be interpolated into #. messages in fh_lock() that identify types of files. #: src/language/data-io/data-reader.c:136 src/language/data-io/data-writer.c:79 msgid "data file" msgstr "データファイル" #: src/language/data-io/data-reader.c:160 #, c-format msgid "Could not open `%s' for reading as a data file: %s." msgstr "データファイルとして読み込むための %s を開けませんでした: %s." #: src/language/data-io/data-reader.c:174 #, c-format msgid "Could not read `%s' as a text file with encoding `%s': %s." msgstr "" "`%s' をテキストファイル(エンコード `%s')として読み込めませんでした: %s." #: src/language/data-io/data-reader.c:233 #, c-format msgid "" "Missing %s while reading inline data. This probably indicates a missing or " "incorrectly formatted %s command. %s must appear by itself on a single line " "with exactly one space between words." msgstr "" "インラインデータを読み込み中に %s が見当たりません.おそらく存在しないか,ま" "たは間違ってフォーマットされた %s コマンドの可能性があります.%s は単語の間に" "正確に1つの空白を持つ単一の行に単独で存在する必要があります." #: src/language/data-io/data-reader.c:253 #: src/language/data-io/data-reader.c:387 #, c-format msgid "Error reading file %s: %s." msgstr "ファイル %s の読み込みエラー: %s." #: src/language/data-io/data-reader.c:261 #, c-format msgid "Unexpected end of file in partial record reading %s." msgstr "予期せぬファイル終端が%s レコードの一部分の読み込みにありました." #: src/language/data-io/data-reader.c:321 #, c-format msgid "Corrupt block descriptor word at offset 0x%lx in %s." msgstr "壊れたブロック記述子ワードがオフセット 0x%lx(%s 内)にあります." #: src/language/data-io/data-reader.c:322 #, c-format msgid "Corrupt record descriptor word at offset 0x%lx in %s." msgstr "壊れたレコード記述子ワードがオフセット 0x%lx(%s 内)にあります." #: src/language/data-io/data-reader.c:335 #, c-format msgid "Corrupt record size at offset 0x%lx in %s." msgstr "壊れたレコードサイズがオフセット 0x%lx(%s 内)にあります." #: src/language/data-io/data-reader.c:493 msgid "Record exceeds remaining block length." msgstr "レコードは残りのブロック長を超えています." #: src/language/data-io/data-reader.c:567 #, c-format msgid "Attempt to read beyond end-of-file on file %s." msgstr "ファイル %s の終端より先を読み込もうとしました." #: src/language/data-io/data-reader.c:570 #, c-format msgid "Attempt to read beyond %s." msgstr "%s より先を読み込もうとしました." #: src/language/data-io/data-reader.c:733 msgid "" "This command is not valid here since the current input program does not " "access the inline file." msgstr "" "---現在の入力プログラムがインラインファイルにアクセスしないので,このコマンド" "はここでは有効ではありません." #: src/language/data-io/data-writer.c:106 #, c-format msgid "An error occurred while opening `%s' for writing as a data file: %s." msgstr "%s を書き込みデータファイルとして開くときにエラーが発生しました: %s." #: src/language/data-io/data-writer.c:224 #, c-format msgid "I/O error occurred writing data file `%s'." msgstr "データファイル `%s' に書き込み中にI/Oエラー." #: src/language/data-io/dataset.c:64 #, c-format msgid "There is no dataset named %s." msgstr "%s という名前のデータセットはありません." #: src/language/data-io/dataset.c:250 #, fuzzy #| msgid "Dataset" msgid "Datasets" msgstr "データセット" #: src/language/data-io/dataset.c:263 msgid "unnamed dataset" msgstr "名前なしデータセット" #: src/language/data-io/file-handle.c:61 #, c-format msgid "" "File handle %s is already defined. Use %s before redefining a file handle." msgstr "" "ファイルハンドルが %s はすでに定義されています.ファイルハンドルを再定義する" "前に %s を使用してください." #: src/language/data-io/file-handle.c:241 #, c-format msgid "%s must be specified with %s." msgstr "%s は %s とともに指定せねばなりません." #: src/language/data-io/file-handle.c:252 #, c-format msgid "" "The specified file mode requires LRECL. Assuming %zu-character records." msgstr "" "指定されたファイルモードには LRECL が必要です.%zu-文字のレコードが仮定されま" "す." #: src/language/data-io/file-handle.c:256 #, c-format msgid "" "Record length (%d) must be between 1 and %lu bytes. Assuming %zu-character " "records." msgstr "" "レコード長 (%d) は 1 と %lu バイトの間でなければなりません.%zu-文字のレコー" "ドが仮定されます." #: src/language/data-io/file-handle.c:300 msgid "file" msgstr "ファイル" #: src/language/data-io/file-handle.c:302 msgid "inline file" msgstr "インラインファイル" #: src/language/data-io/file-handle.c:350 msgid "expecting a file name or handle name" msgstr "ファイル名かハンドル名が必要" #: src/language/data-io/file-handle.c:365 #, c-format msgid "Handle for %s not allowed here." msgstr "%s のためのハンドルは許されません." #: src/language/data-io/get-data.c:108 src/output/measure.c:262 #, c-format msgid "error reading file `%s'" msgstr "ファイル `%s' の読み込み中にエラー" #: src/language/data-io/get-data.c:127 #, c-format msgid "Unsupported TYPE %s." msgstr "サポートされていない TYPE %s." #: src/language/data-io/get-data.c:278 msgid "The sheet index must be greater than or equal to 1" msgstr "シートのインデックスは1以上でなければなりません." #: src/language/data-io/get-data.c:285 src/language/data-io/get-data.c:308 #: src/language/data-io/get-data.c:327 #, c-format msgid "%s must be followed by either \"%s\" or \"%s\"." msgstr "%s は \"%s\" または \"%s\" のいずれか1つの次に来なければなりません." #: src/language/data-io/get-data.c:357 #, c-format msgid "" "%s is allowed only with %s arrangement, but %s arrangement was stated or " "implied earlier in this command." msgstr "" "%s は %s 配置のみで許可されますが,%s 配置はこのコマンドより前に明示または暗" "示されています." #: src/language/data-io/get-data.c:441 src/language/data-io/get-data.c:479 #, c-format msgid "Value of %s must be 1 or greater." msgstr "%s の値は1以上です." #: src/language/data-io/get-data.c:504 msgid "" "Ignoring obsolete IMPORTCASES subcommand. (N OF CASES or SAMPLE may be used " "to substitute.)" msgstr "" "廃止された IMPORTCASES サブコマンドは無視されます.代わりに N OF CASES か " "SAMPLE を使って下さい." #: src/language/data-io/get-data.c:551 msgid "" "In compatible syntax mode, the QUALIFIER string must contain exactly one " "character." msgstr "" "互換性のあるシンタックスモードでは QUALIFIER 文字列は正確に1文字が含まれてい" "る必要があります." #: src/language/data-io/get-data.c:583 #, c-format msgid "" "The record number specified, %ld, is at or before the previous record, %d. " "Data fields must be listed in order of increasing record number." msgstr "" "指定されたレコード数 %ld は直前のレコードまたは以前のレコード %d にあります." "データフィールドはレコード番号の昇順でリストされなばなりません." #: src/language/data-io/get-data.c:592 #, c-format msgid "" "The record number specified, %ld, exceeds the number of records per case " "specified on FIXCASE, %d." msgstr "" "指定されたレコード番号 %ld は,FIXCASEで指定されたケースあたりのレコード数 " "%d を超えています." #: src/language/data-io/get.c:132 #, c-format msgid "%s: Data file dictionary has no variables." msgstr "%s: データファイル辞書には変数がありません." #: src/language/data-io/inpt-pgm.c:133 #, c-format msgid "Unexpected end-of-file within %s." msgstr "%s において予期せぬファイル終端." #: src/language/data-io/inpt-pgm.c:146 #, c-format msgid "Input program must contain %s or %s." msgstr "入力プログラムには %s か %s が含まれていなければなりません." #: src/language/data-io/inpt-pgm.c:152 msgid "Input program did not create any variables." msgstr "入力プログラムは変数をまったく新規作成できませんでした." #: src/language/data-io/inpt-pgm.c:365 msgid "" "REREAD: Column numbers must be positive finite numbers. Column set to 1." msgstr "" "REREAD: 列番号は正の有限数でなければなりません.列には1が設定されます." #: src/language/data-io/list.c:100 #, fuzzy #| msgid "Dataset" msgid "Data List" msgstr "データセット" #: src/language/data-io/list.c:221 #, c-format msgid "" "The first case (%ld) specified precedes the last case (%ld) specified. The " "values will be swapped." msgstr "" "指定された最初のケース(%ld)は指定された最後のケース(%ld)を超えていました.2つ" "の値は交換されます." #: src/language/data-io/list.c:230 #, c-format msgid "" "The first case (%ld) to list is numbered less than 1. The value is being " "reset to 1." msgstr "" "リストする最初のケース (%ld) は1未満でした.この値は1に設定変更されます." #: src/language/data-io/list.c:237 #, c-format msgid "" "The last case (%ld) to list is numbered less than 1. The value is being " "reset to 1." msgstr "" "リストする最後のケース (%ld) は 1 未満でした.この値は 1 に設定変更されます." #: src/language/data-io/list.c:244 #, c-format msgid "The step value %ld is less than 1. The value is being reset to 1." msgstr "ステップ値 %ld は1未満でした.この値は1に設定変更されます." #: src/language/data-io/placement-parser.c:96 #, c-format msgid "" "Number of variables specified (%zu) differs from number of variable formats " "(%zu)." msgstr "指定された変数の数(%zu)は変数フォーマットの数(%zu)とは異なります." #: src/language/data-io/placement-parser.c:106 msgid "" "SPSS-like or Fortran-like format specification expected after variable names." msgstr "SPSS または Fortran のようなのフォーマット仕様が変数名の後に必要です." #: src/language/data-io/placement-parser.c:129 #, c-format msgid "The %d columns %d-%d can't be evenly divided into %zu fields." msgstr "%d 列 %d-%d は均等な %zu フィールドに分割できません." #: src/language/data-io/placement-parser.c:310 msgid "Column positions for fields must be positive." msgstr "フィールドの列位置は正でなければなりません." #: src/language/data-io/placement-parser.c:312 msgid "Column positions for fields must not be negative." msgstr "フィールドの列位置は負であってはなりません." #: src/language/data-io/placement-parser.c:372 msgid "The ending column for a field must be greater than the starting column." msgstr "フィールドの最後の列は最初の列よりも大きくなければなりません." #: src/language/data-io/placement-parser.c:409 #, fuzzy, c-format #| msgid "" #| "The record number specified, %ld, is at or before the previous record, " #| "%d. Data fields must be listed in order of increasing record number." msgid "" "The record number specified, %.0f, is at or before the previous record, %d. " "Data fields must be listed in order of increasing record number." msgstr "" "指定されたレコード数 %ld は直前のレコードまたは以前のレコード %d にあります." "データフィールドはレコード番号の昇順でリストされなばなりません." #: src/language/data-io/print-space.c:127 #, c-format msgid "The expression on %s evaluated to the system-missing value." msgstr "%s 中の表現はシステム欠損値として評価されました." #: src/language/data-io/print-space.c:130 #, c-format msgid "The expression on %s evaluated to %g." msgstr "%s での表現は %g と評価されました." #: src/language/data-io/print.c:189 src/language/data-io/trim.c:58 msgid "expecting a valid subcommand" msgstr "有効なサブコマンドが必要です." #: src/language/data-io/print.c:219 #, c-format msgid "%s is required when binary formats are specified." msgstr "バイナリのフォーマットが指定されたときは %s が必要です." #: src/language/data-io/print.c:302 #, c-format msgid "Output calls for %d records but %zu specified on RECORDS subcommand." msgstr "" "出力は %d レコードを呼び出しますが,RECORDS サブコマンドでは %zu が指定されて" "います." #: src/language/data-io/print.c:432 #, fuzzy #| msgid "Case Processing Summary" msgid "Print Summary" msgstr "ケース処理の要約" #: src/language/data-io/print.c:462 #, fuzzy #| msgid "Record" msgid "N of Records" msgstr "レコード" #: src/language/data-io/matrix-data.c:191 #, c-format msgid "" "There are %d variable declared but the data has at least %d matrix rows." msgstr "" #: src/language/data-io/matrix-data.c:292 msgid "" "The N subcommand was specified, but a N record was also found in the data. " "The N record will be ignored." msgstr "" #: src/language/data-io/matrix-data.c:488 src/language/utilities/set.q:186 #, c-format msgid "%s must not be negative." msgstr "%s は非負でなければなりません." #: src/language/data-io/matrix-data.c:568 #, fuzzy #| msgid "%s and %s are mutually exclusive" msgid "FORMAT = FULL and FORMAT = NODIAGONAL are mutually exclusive." msgstr "%s と %s は互いに背反です." #: src/language/data-io/matrix-reader.c:102 #: src/language/data-io/matrix-reader.c:118 #, fuzzy, c-format #| msgid "Active dataset lacks BY variable %s." msgid "Matrix dataset lacks a variable called %s." msgstr "アクティブなデータセットではBY変数 %s が足りません." #: src/language/data-io/matrix-reader.c:109 #: src/language/data-io/matrix-reader.c:125 #, c-format msgid "Matrix dataset variable %s should be of string type." msgstr "" #: src/language/data-io/save-translate.c:168 #: src/language/data-io/save-translate.c:183 #, c-format msgid "The %s string must contain exactly one character." msgstr "%s 文字列はきっちり1文字でなければなりません." #: src/language/data-io/save-translate.c:249 #, c-format msgid "Output file `%s' exists but %s was not specified." msgstr "出力ファイル `%s' は存在しますが %s が指定されていません." #: src/language/data-io/save.c:309 msgid "The OUTFILE or METADATA subcommand is required." msgstr "" #: src/language/data-io/trim.c:69 #, c-format msgid "" "Cannot rename %s as %s because there already exists a variable named %s. To " "rename variables with overlapping names, use a single RENAME subcommand such " "as `/RENAME (A=B)(B=C)(C=A)', or equivalently, `/RENAME (A B C=B C A)'." msgstr "" "%s を %s に名前変更できません.すでに変数名 %s が存在するためです.重複してい" "る変数名を変更するためには,単一のRENAMEサブコマンドを`/RENAME (A=B)(B=C)" "(C=A)'または等価な`/RENAME (A B C=B C A)'のように使います." #: src/language/data-io/trim.c:227 #, c-format msgid "" "Number of variables on left side of `=' (%zu) does not match number of " "variables on right side (%zu), in parenthesized group %d of RENAME " "subcommand." msgstr "" "`='の左側にある変数の数(%zu)は,RENAME サブコマンドの括弧で括られたグループの" "右側の変数の数(%zu)と一致しません(グループ %d)." #: src/language/data-io/trim.c:242 #, c-format msgid "Requested renaming duplicates variable name %s." msgstr "要求された名前の変更によって変数名 %s が重複してしまいます." #: src/language/data-io/trim.c:281 msgid "Cannot DROP all variables from dictionary." msgstr "ディクショナリから全ての変数を DROP できません." #: src/language/expressions/evaluate.c:151 msgid "expecting number or string" msgstr "数値化か文字列が必要です" #: src/language/expressions/helpers.c:43 msgid "" "One of the arguments to a DATE function is not an integer. The result will " "be system-missing." msgstr "" "DATE 関数の引数の1つが整数ではありません.結果はシステム欠損値になります." #: src/language/expressions/helpers.c:71 msgid "" "The week argument to DATE.WKYR is not an integer. The result will be system-" "missing." msgstr "" "DATE.WKYR の週引数は整数ではありません.結果はシステム欠損値になります." #: src/language/expressions/helpers.c:77 msgid "" "The week argument to DATE.WKYR is outside the acceptable range of 1 to 53. " "The result will be system-missing." msgstr "" "DATE.WKYR の週引数は 1〜53 の許容範囲外です.結果はシステム欠損値になります." #: src/language/expressions/helpers.c:99 msgid "" "The day argument to DATE.YRDAY is not an integer. The result will be system-" "missing." msgstr "" "DATE.YRDAY の日引数は整数ではありません.結果はシステム欠損値になります." #: src/language/expressions/helpers.c:105 msgid "" "The day argument to DATE.YRDAY is outside the acceptable range of 1 to 366. " "The result will be system-missing." msgstr "" "DATE.YRDAY の日引数は 1〜366 の許容範囲外です.結果はシステム欠損値になりま" "す." #: src/language/expressions/helpers.c:127 msgid "" "The year argument to YRMODA is greater than 47516. The result will be " "system-missing." msgstr "" "YRMODA に年引数は 47516 を超えています.結果はシステム欠損値になります." #: src/language/expressions/helpers.c:180 #, c-format msgid "" "Unrecognized date unit `%.*s'. Valid date units are `%s', `%s', `%s', `%s', " "`%s', `%s', `%s', and `%s'." msgstr "" "認識されない日付ユニット `%.*s'です.有効な日付の単位は `%s ',`%s',`%s ',`" "%s',`%s ',`%s',`% s ',`%s'です." #: src/language/expressions/helpers.c:333 #, c-format msgid "Invalid DATESUM method. Valid choices are `%s' and `%s'." msgstr "不正な DATASUM の使用.適正な選択肢は `%s' と `%s' です." #: src/language/expressions/parse.c:261 #, c-format msgid "" "Type mismatch: expression has %s type, but a numeric value is required here." msgstr "型の不一致: 式のタイプは %s ですがここでは数値が必要です." #: src/language/expressions/parse.c:274 #, c-format msgid "" "Type mismatch: expression has %s type, but a string value is required here." msgstr "型の不一致: 式のタイプは %s ですがここでは文字列値が必要です." #: src/language/expressions/parse.c:436 #, c-format msgid "Type mismatch while applying %s operator: cannot convert %s to %s." msgstr "演算子 %s の適用中にタイプが一致しません: %s を %s へ変換できません." #: src/language/expressions/parse.c:650 msgid "" "Chaining relational operators (e.g. `a < b < c') will not produce the " "mathematically expected result. Use the AND logical operator to fix the " "problem (e.g. `a < b AND b < c'). If chaining is really intended, " "parentheses will disable this warning (e.g. `(a < b) < c'.)" msgstr "" "連鎖関係演算子(例えば `a < b < c')は数学的に期待される結果とはなりません." "この問題(例えば `a < b と b < c ')を解決するためには AND 論理演算子を使用し" "ます.連鎖を本当に意図している場合は,括弧を使うことで警告を無効にできます(例" "えば `(a < b)< C')." #: src/language/expressions/parse.c:752 msgid "" "The exponentiation operator (`**') is left-associative, even though right-" "associative semantics are more useful. That is, `a**b**c' equals " "`(a**b)**c', not as `a**(b**c)'. To disable this warning, insert " "parentheses." msgstr "" "指数演算子は(`**'),右結合セマンティクスがより有用であるにもかかわらず左結合" "です.すなわち`a**b**C'は`(a**b)**c`と等しく,`a**(b**c)'ではありません.この" "警告を無効にするには括弧を挿入します." #: src/language/expressions/parse.c:832 #, c-format msgid "Unknown system variable %s." msgstr "不明なシステム変数 %s." #: src/language/expressions/parse.c:880 #, c-format msgid "Unknown identifier %s." msgstr "不明な識別し %s." #: src/language/expressions/parse.c:1102 #, c-format msgid "%s must have at least %d arguments in list." msgstr "%s にはリスト中に少なくとも %d の引数がなければなりません." #: src/language/expressions/parse.c:1111 #, c-format msgid "%s must have an even number of arguments in list." msgstr "%s にはリスト中に偶数個の引数がなければなりません." #: src/language/expressions/parse.c:1114 #, c-format msgid "%s must have multiple of %d arguments in list." msgstr "%s はリスト中に %d の倍数個の引数がなければなりません." #: src/language/expressions/parse.c:1124 #, c-format msgid "%s function does not accept a minimum valid argument count." msgstr "%s 関数で最小限の有効な引数の数が受け取れません." #: src/language/expressions/parse.c:1133 #, c-format msgid "%s requires at least %d valid arguments in list." msgstr "%s はリスト中に少なくとも %d の有効な引数が必要です." #: src/language/expressions/parse.c:1139 #, c-format msgid "" "With %s, using minimum valid argument count of %d does not make sense when " "passing only %d arguments in list." msgstr "" "%s であれば,最小で有効な引数の数 %d を使用する意味がありません(リスト内の " "%d 個の引数を渡すとき)." #: src/language/expressions/parse.c:1193 #, c-format msgid "Type mismatch invoking %s as " msgstr "%s を起動中にタイプの不一致:" #: src/language/expressions/parse.c:1198 msgid "Function invocation " msgstr "関数の起動" #: src/language/expressions/parse.c:1200 msgid " does not match any known function. Candidates are:" msgstr "既知のどの関数にも一致しません.代替候補は:" #: src/language/expressions/parse.c:1230 #, c-format msgid "No function or vector named %s." msgstr "%s という関数またはベクトルはありません." #: src/language/expressions/parse.c:1292 #, c-format msgid "%s is a PSPP extension." msgstr "%s は PSPP のによる拡張です." #: src/language/expressions/parse.c:1295 #, c-format msgid "%s is not available in this version of PSPP." msgstr "このバージョンの PSPP では %s は使えません." #: src/language/expressions/parse.c:1302 #, c-format msgid "%s may not appear after %s." msgstr "%s が %s 以後にありません." #: src/libpspp/ext-array.c:66 msgid "failed to create temporary file" msgstr "一時ファイルが作成できません." #: src/libpspp/ext-array.c:106 msgid "seeking in temporary file" msgstr "一時ファイルを探索中" #: src/libpspp/ext-array.c:125 msgid "reading temporary file" msgstr "一時ファイルから読み込み中" #: src/libpspp/ext-array.c:127 msgid "unexpected end of file reading temporary file" msgstr "一時ファイル読み込み中に予期せぬ終端に到達" #: src/libpspp/ext-array.c:147 msgid "writing to temporary file" msgstr "一時ファイルに書き込み中" #: src/libpspp/i18n.c:1128 msgid "Arabic" msgstr "アラビア語" #: src/libpspp/i18n.c:1130 msgid "Armenian" msgstr "米語" #: src/libpspp/i18n.c:1131 msgid "Baltic" msgstr "バルティック語" #: src/libpspp/i18n.c:1133 msgid "Celtic" msgstr "ケルト語" #: src/libpspp/i18n.c:1134 msgid "Central European" msgstr "中央ヨーロッパ" #: src/libpspp/i18n.c:1136 msgid "Chinese Simplified" msgstr "中国(略字体)" #: src/libpspp/i18n.c:1138 msgid "Chinese Traditional" msgstr "中国(繁字体)" #: src/libpspp/i18n.c:1140 msgid "Croatian" msgstr "クロアチア語" #: src/libpspp/i18n.c:1141 msgid "Cyrillic" msgstr "キリル" #: src/libpspp/i18n.c:1143 msgid "Cyrillic/Russian" msgstr "キリル/ロシア語" #: src/libpspp/i18n.c:1144 msgid "Cyrillic/Ukrainian" msgstr "キリル/ウクライナ語" #: src/libpspp/i18n.c:1146 msgid "Georgian" msgstr "グルジア語" #: src/libpspp/i18n.c:1147 msgid "Greek" msgstr "ギリシャ語" #: src/libpspp/i18n.c:1148 msgid "Gujarati" msgstr "グジャラート語" #: src/libpspp/i18n.c:1149 msgid "Gurmukhi" msgstr "グルムキー" #: src/libpspp/i18n.c:1150 msgid "Hebrew" msgstr "ヘブライ語" #: src/libpspp/i18n.c:1152 msgid "Hebrew Visual" msgstr "ヘブライ語ビジュアル" #: src/libpspp/i18n.c:1153 msgid "Hindi" msgstr "ヒンディー語" #: src/libpspp/i18n.c:1154 msgid "Icelandic" msgstr "アイスランド語" #: src/libpspp/i18n.c:1155 msgid "Japanese" msgstr "日本語" #: src/libpspp/i18n.c:1157 msgid "Korean" msgstr "韓国語" #: src/libpspp/i18n.c:1159 msgid "Nordic" msgstr "ノルディック語" #: src/libpspp/i18n.c:1160 msgid "Romanian" msgstr "ルーマニア語" #: src/libpspp/i18n.c:1162 msgid "South European" msgstr "南ヨーロッパ語" #: src/libpspp/i18n.c:1163 msgid "Thai" msgstr "タイ語" #: src/libpspp/i18n.c:1165 msgid "Turkish" msgstr "トルコ語" #: src/libpspp/i18n.c:1167 msgid "Vietnamese" msgstr "ベトナム語" #: src/libpspp/i18n.c:1169 msgid "Western European" msgstr "西ヨーロッパ語" #: src/libpspp/message.c:89 #, c-format msgid "%s: %s" msgstr "%s: %s" #: src/libpspp/message.c:113 msgid "error" msgstr "エラー" #: src/libpspp/message.c:115 msgid "warning" msgstr "警告" #: src/libpspp/message.c:118 msgid "note" msgstr "注意" #: src/libpspp/message.c:327 #, c-format msgid "Notes (%d) exceed limit (%d). Suppressing further notes." msgstr "通知(%d)が制限(%d)を超えています.これ以上の通知は抑止されます." #: src/libpspp/message.c:335 #, c-format msgid "Warnings (%d) exceed limit (%d). Syntax processing will be halted." msgstr "警告(%d)が制限(%d)を超えています.シンタックス処理は停止されます." #: src/libpspp/message.c:338 #, c-format msgid "Errors (%d) exceed limit (%d). Syntax processing will be halted." msgstr "エラー(%d)が制限(%d)を超えています.シンタックス処理は停止します." #: src/libpspp/zip-reader.c:202 #, fuzzy, c-format #| msgid "Corrupt file at 0x%llx: Expected %; got %" msgid "%s: corrupt archive at 0x%llx: expected %# but got %#" msgstr "" "ファイルが 0x%llx で壊れています: % が必要ですが % が得られま" "した." #: src/libpspp/zip-reader.c:329 src/libpspp/zip-reader.c:449 #, fuzzy, c-format #| msgid "%s: seek failed (%s)." msgid "%s: open failed (%s)" msgstr "%s: 探索でエラー(%s)." #: src/libpspp/zip-reader.c:344 #, fuzzy, c-format #| msgid "Cannot find central directory" msgid "%s: cannot find central directory" msgstr "中心ディレクトリが見つかりません." #: src/libpspp/zip-reader.c:353 src/libpspp/zip-reader.c:384 #: src/libpspp/zip-reader.c:468 #, fuzzy, c-format #| msgid "%s: seek failed (%s)." msgid "%s: seek failed (%s)" msgstr "%s: 探索でエラー(%s)." #: src/libpspp/zip-reader.c:441 #, fuzzy, c-format #| msgid "%s: unknown option `%s'" msgid "%s: unknown member \"%s\"" msgstr "%s: 不明なオプション `%s'" #: src/libpspp/zip-reader.c:503 #, fuzzy, c-format #| msgid "" #| "Name mismatch in zip archive. Central directory says `%s'; local file " #| "header says `%s'" msgid "" "%s: name mismatch between central directory (%s) and local file header (%s)" msgstr "" "Zip アーカイブ内の名前が一致しません. 中心ディレクトリでは`%s'でですが,ロー" "カルファイルヘッダでは`%s'です." #: src/libpspp/zip-reader.c:696 #, fuzzy, c-format #| msgid "Cannot initialize inflator: %s" msgid "%s: cannot initialize inflator (%s)" msgstr "インフレ-タを初期化できません: %s" #: src/libpspp/zip-reader.c:751 #, fuzzy, c-format #| msgid "Error inflating: %s" msgid "%s: error inflating \"%s\" (%s)" msgstr "インフレータの使用でエラー: %s" #: src/libpspp/zip-writer.c:97 utilities/pspp-convert.c:346 #, c-format msgid "%s: error opening output file" msgstr "%s: 出力ファイルのオープンエラー" #: src/libpspp/zip-writer.c:169 #, c-format msgid "%s: error seeking in output file" msgstr "%s: 出力ファイルのシークエラー" #: src/libpspp/zip-writer.c:210 msgid "error creating temporary file" msgstr "一時ファイルを新規作成するときにエラー" #: src/libpspp/zip-writer.c:279 #, c-format msgid "%s: write failed" msgstr "%s: 書き込めません" #. TRANSLATORS: This is a format string which, when presented to #. printf like functions, will create a pango markup string to #. display real number in scientific notation. #. #. In its untranslated form, it will display similar to "1.23 x 10^4". You #. can leave it untranslated if this is how scientific notation is usually #. presented in your language. #. #. Some locales (such as German) prefer the centered dot rather than the #. multiplication sign between the mantissa an exponent. In which #. case, you can change "#215;" to "#8901;" or other unicode code #. point as appropriate. #. #. The . in this string does not and should not be changed, since #. that is taken care of by the stdc library. #. #. For information on Pango markup, see #. http://developer.gnome.org/pango/stable/PangoMarkupFormat.html #. #. For tables of unicode code points, see http://unicode.org/charts #. #: src/math/chart-geometry.c:123 #, c-format msgid "%%.%dlf×10%d" msgstr "%%.%dlf×10%d" #: src/math/histogram.c:145 msgid "" "Not creating histogram because the data contains less than 2 distinct values" msgstr "データには個別の値が2未満のためヒストグラムは作成されません." #: src/math/percentiles.c:36 msgid "HAverage" msgstr "調和平均" #: src/math/percentiles.c:38 msgid "Rounded" msgstr "丸められた" #: src/math/percentiles.c:39 msgid "Empirical" msgstr "実証的" #: src/math/percentiles.c:40 msgid "Empirical with averaging" msgstr "平均化による実証" #: src/math/shapiro-wilk.c:84 msgid "" "One or more weight values are non-integer. Fractional parts will be ignored " "when calculating the Shapiro-Wilk statistic." msgstr "" #: src/output/ascii.c:340 #, c-format msgid "ascii: opening output file `%s'" msgstr "ASCII: 出力ファイル `%s' を開いています." #: src/output/ascii.c:371 #, c-format msgid "%s: %s must be positive integer or `auto'" msgstr "%s: %s は正の整数か `auto' でなければなりません." #: src/output/ascii.c:393 #, fuzzy, c-format #| msgid "" #| "ascii: page excluding margins and headers must be at least %d characters " #| "wide by %d lines long, but as configured is only %d characters by %d lines" msgid "" "ascii: page must be at least %d characters wide, but as configured is only " "%d characters" msgstr "" "ASCII: ページは余白やヘッダを除いて少なくとも横 %d 文字×縦 %d 行でなければな" "りませんが,設定では横 %d 文字×縦 %d 行しかありません." #: src/output/ascii.c:508 #, c-format msgid "See %s for a chart." msgstr "チャートでは %s を参照" #: src/output/charts/piechart.c:54 msgid "*MISSING*" msgstr "*MISSING*" #: src/output/csv.c:100 src/output/html.c:117 src/output/journal.c:166 #: src/output/msglog.c:68 #, c-format msgid "error opening output file `%s'" msgstr "出力ファイル `%s' を開くときにエラー" #: src/output/driver.c:522 #, c-format msgid "%s is not a valid device type (the choices are `%s' and `%s')" msgstr "%s は有効なデバイスタイプではありません(s選択肢は `%s' か `%s' です)." #: src/output/driver.c:536 #, c-format msgid "%s: unknown option `%s'" msgstr "%s: 不明なオプション `%s'" #: src/output/driver.c:553 #, c-format msgid "%s: output option missing `='" msgstr "%s: 出力オプションに `=' がありません." #: src/output/driver.c:560 #, c-format msgid "%s: output option specified more than once" msgstr "%s: 出力オプションが2度以上指定されています." #: src/output/html.c:129 msgid "PSPP Output" msgstr "PSPP出力" #: src/output/html.c:266 msgid "No description" msgstr "記述なし" #: src/output/journal.c:69 #, c-format msgid "error writing output file `%s'" msgstr "出力ファイル `%s' の書き込み中にエラー" #: src/output/measure.c:68 #, c-format msgid "`%s' is not a valid length." msgstr "`%s' は適切な長さではありません." #: src/output/measure.c:96 #, c-format msgid "syntax error in paper size `%s'" msgstr "用紙サイズ `%s' シンタックスエラー" #: src/output/measure.c:233 #, c-format msgid "unknown paper type `%.*s'" msgstr "不明な用紙タイプ `%.*s'" #: src/output/measure.c:251 #, c-format msgid "error opening input file `%s'" msgstr "入力ファイル `%s' を開くときにエラー" #: src/output/measure.c:279 #, c-format msgid "file `%s' does not state a paper size" msgstr "ファイル `%s' には用紙サイズが記述されていません." #: src/output/options.c:112 #, c-format msgid "%s: `%s' is `%s' but a Boolean value is required" msgstr "%s: `%s' は `%s' ですが論理値が必要です." #: src/output/options.c:187 #, c-format msgid "%s: `%s' is `%s' but one of the following is required: %s" msgstr "%s: `%s' は `%s' ですが以下 %s のいづれかが必要です." #: src/output/options.c:231 #, fuzzy, c-format #| msgid "%s: `%s' is `%s' but a nonnegative integer is required" msgid "%s: `%s' is `%s' but a non-negative integer is required" msgstr "%s: `%s' は `%s' ですが負でない整数が必要です." #: src/output/options.c:235 #, c-format msgid "%s: `%s' is `%s' but a positive integer is required" msgstr "%s: `%s' は `%s' ですが正の整数が必要です." #: src/output/options.c:238 #, c-format msgid "%s: `%s' is `%s' but an integer is required" msgstr "%s: `%s' は `%s' ですが整数が必要です." #: src/output/options.c:241 #, c-format msgid "%s: `%s' is `%s' but an integer greater than %d is required" msgstr "%s: `%s' は `%s' ですが %d を超える整数が必要です." #: src/output/options.c:246 #, c-format msgid "%s: `%s' is `%s' but an integer between %d and %d is required" msgstr "%s: `%s' は `%s' ですが %d と %d のあいだの整数が必要です." #: src/output/options.c:325 #, c-format msgid "%s: `%s' is `%s' but a file name that contains `#' is required." msgstr "%s: `%s' は `%s' ですが`#'を含むファイル名が必要です." #. TRANSLATORS: Do not translate this string. If the script of your language #. reads from right to left (eg Persian, Arabic, Hebrew etc), then replace #. this string with "output-direction-rtl". Otherwise either leave it #. untranslated or copy it verbatim. #: src/output/render.c:994 msgid "output-direction-ltr" msgstr "output-direction-ltr" #: src/output/text-item.c:44 msgid "Page Title" msgstr "" #: src/output/text-item.c:47 msgid "Title" msgstr "" #: src/output/text-item.c:51 msgid "Log" msgstr "" #: src/output/text-item.c:54 msgid "Page Break" msgstr "" #: src/output/cairo.c:520 #, c-format msgid "`%s': bad font specification" msgstr "`%s': 誤ったフォントの仕様" #: src/output/cairo.c:744 #, c-format msgid "" "The defined page is not wide enough to hold at least %d characters in the " "default font. In fact, there's only room for %d characters." msgstr "" "定義されたページには,デフォルトのフォントで少なくとも %d 文字を表示するのに" "十分な幅がありません.実際には %d 文字分の余地しかありません." #: src/output/cairo.c:752 #, c-format msgid "" "The defined page is not long enough to hold at least %d lines in the default " "font. In fact, there's only room for %d lines." msgstr "" "定義されたページには,デフォルトのフォントで少なくとも %d 行を表示するのに十" "分な長さがありません.実際には %d 行分の余地しかありません." #: src/output/cairo.c:837 #, c-format msgid "error opening output file `%s': %s" msgstr "出力ファイル `%s' を開くときにエラー: %s" #: src/output/cairo.c:892 #, c-format msgid "error drawing output for %s driver: %s" msgstr "%s ドライバへの描画出力中にエラー: %s" #: src/output/cairo.c:2056 #, c-format msgid "error writing output file `%s': %s" msgstr "出力ファイル `%s' の書き込み中にエラー: %s" #: src/output/charts/np-plot-cairo.c:37 #, c-format msgid "Normal Q-Q Plot of %s" msgstr "%s の正規 Q-Q プロット" #: src/output/charts/np-plot-cairo.c:38 src/output/charts/np-plot-cairo.c:68 msgid "Observed Value" msgstr "観測値" #: src/output/charts/np-plot-cairo.c:39 msgid "Expected Normal" msgstr "期待される正規分布" #: src/output/charts/np-plot-cairo.c:67 #, c-format msgid "Detrended Normal Q-Q Plot of %s" msgstr "%s のトレンド除去された正規 Q-Q プロット" #: src/output/charts/np-plot-cairo.c:69 msgid "Dev from Normal" msgstr "正規分布から逸脱" #: src/output/charts/barchart-cairo.c:65 msgid "Bar Chart" msgstr "バーチャート" #: src/output/charts/plot-hist-cairo.c:43 #, c-format msgid "N = %.2f" msgstr "データ数 = %.2f" #: src/output/charts/plot-hist-cairo.c:52 #, c-format msgid "Mean = %.1f" msgstr "平均 = %.1f" #: src/output/charts/plot-hist-cairo.c:61 #, c-format msgid "Std. Dev = %.2f" msgstr "標準偏差 = %.2f" #: src/output/charts/plot-hist-cairo.c:110 msgid "HISTOGRAM" msgstr "ヒストグラム" #: src/output/charts/roc-chart-cairo.c:36 src/ui/gui/roc.ui:24 msgid "ROC Curve" msgstr "ROC 曲線" #: src/output/charts/scree-cairo.c:36 msgid "Scree Plot" msgstr "スクリープロット" #: src/output/charts/scree-cairo.c:38 msgid "Eigenvalue" msgstr "固有値" #: src/output/charts/spreadlevel-cairo.c:37 #, c-format msgid "Spread vs. Level Plot of %s" msgstr "%s のスプレッド対レベルプロット" #: src/output/charts/spreadlevel-cairo.c:38 msgid "Level" msgstr "レベル" #: src/output/charts/spreadlevel-cairo.c:39 msgid "Spread" msgstr "スプレッド" #: src/output/charts/scatterplot-cairo.c:57 #, c-format msgid "Scatterplot %s" msgstr "散布図 %s" #: src/output/spv/spv-legacy-decoder.c:2222 msgid "Table lacks cell data." msgstr "" #: src/output/spv/spv-writer.c:68 #, fuzzy, c-format #| msgid "%s: write failed" msgid "%s: create failed" msgstr "%s: 書き込めません" #: src/output/spv/spv-writer.c:89 #, fuzzy #| msgid "%s: error writing output file" msgid "I/O error writing SPV file" msgstr "%s: 出力ファイルの書き込みエラー" #: src/output/spv/spv.c:693 #, fuzzy, c-format #| msgid "failed to create temporary file" msgid "%s: Failed to create XML parser" msgstr "一時ファイルが作成できません." #: src/output/spv/spv.c:718 #, c-format msgid "%s: document is not well-formed" msgstr "" #: src/output/spv/spv.c:726 #, c-format msgid "%s: root node is \"%s\" but \"%s\" was expected" msgstr "" #: src/ui/gui/psppire-acr.c:273 msgid "Add" msgstr "追加" #: src/ui/gui/psppire-acr.c:274 msgid "Edit" msgstr "編集" #: src/ui/gui/psppire-acr.c:275 msgid "Remove" msgstr "削除" #: src/ui/gui/psppire-buttonbox.c:311 msgid "OK" msgstr "Ok" #: src/ui/gui/psppire-buttonbox.c:319 msgid "Go To" msgstr "移動" #: src/ui/gui/psppire-buttonbox.c:327 msgid "Continue" msgstr "続く" #: src/ui/gui/psppire-buttonbox.c:339 src/ui/gui/psppire-import-assistant.c:759 msgid "Paste" msgstr "貼り付け" #: src/ui/gui/psppire-buttonbox.c:345 #: src/ui/gui/psppire-dialog-action-aggregate.c:216 #: src/ui/gui/psppire-data-window.c:496 src/ui/gui/psppire-data-window.c:624 #: src/ui/gui/psppire-output-window.c:353 #: src/ui/gui/psppire-syntax-window.c:594 src/ui/gui/psppire-window.c:445 #: src/ui/gui/psppire-window.c:628 msgid "Cancel" msgstr "キャンセル" #: src/ui/gui/psppire-buttonbox.c:351 msgid "Close" msgstr "閉じる" #: src/ui/gui/psppire-buttonbox.c:358 src/ui/gui/psppire-import-assistant.c:760 msgid "Reset" msgstr "リセット" #: src/ui/gui/psppire-buttonbox.c:365 msgid "Help" msgstr "ヘルプ" #: src/ui/gui/psppire-dialog-action-aggregate.c:213 msgid "Aggregate destination file" msgstr "書き出し先ファイルの統合" #: src/ui/gui/psppire-dialog-action-aggregate.c:217 #: src/ui/gui/psppire-data-window.c:493 src/ui/gui/psppire-data-window.c:497 #: src/ui/gui/psppire-output-window.c:354 #: src/ui/gui/psppire-syntax-window.c:595 src/ui/gui/psppire-window.c:449 #: src/ui/gui/aggregate.ui:565 msgid "Save" msgstr "保存" #: src/ui/gui/psppire-dialog-action-aggregate.c:226 #: src/ui/gui/psppire-data-window.c:503 msgid "System Files (*.sav)" msgstr "システムファイル(*sav)" #: src/ui/gui/psppire-dialog-action-aggregate.c:231 #: src/ui/gui/psppire-data-window.c:508 msgid "Compressed System Files (*.zsav)" msgstr "圧縮されたシステムファイル(*.zsav)" #: src/ui/gui/psppire-dialog-action-aggregate.c:236 #: src/ui/gui/psppire-data-window.c:513 src/ui/gui/psppire-window.c:652 msgid "Portable Files (*.por) " msgstr "ポータブルファイル (*.por)" #: src/ui/gui/psppire-dialog-action-autorecode.c:337 #: src/ui/gui/psppire-dialog-action-recode.c:535 #: src/ui/gui/psppire-dialog-action-recode-different.c:288 msgid "New" msgstr "新規" #: src/ui/gui/psppire-dialog-action-autorecode.c:351 #: src/ui/gui/psppire-dialog-action-recode.c:527 #: src/ui/gui/psppire-dialog-action-recode-different.c:301 msgid "Old" msgstr "現在" #: src/ui/gui/psppire-dialog-action-comments.c:142 #, c-format msgid "Column Number: %d" msgstr "列の数: %d" #: src/ui/gui/psppire-dialog-action-crosstabs.c:71 msgid "Chisq" msgstr "カイ2乗" #: src/ui/gui/psppire-dialog-action-crosstabs.c:71 msgid "" "Pearson chi-square, likelihood ratio, Fisher’s exact test, continuity " "correction, linear-by-linear association." msgstr "" #: src/ui/gui/psppire-dialog-action-crosstabs.c:74 #: src/language/stats/crosstabs.q:1334 msgid "Phi" msgstr "Phi" #: src/ui/gui/psppire-dialog-action-crosstabs.c:75 msgid "CC" msgstr "分割係数" #: src/ui/gui/psppire-dialog-action-crosstabs.c:75 #, fuzzy #| msgid "Contingency Coefficient" msgid "Contingency coefficient" msgstr "C係数" #: src/ui/gui/psppire-dialog-action-crosstabs.c:77 msgid "UC" msgstr "不確定係数" #: src/ui/gui/psppire-dialog-action-crosstabs.c:77 #, fuzzy #| msgid "Uncertainty Coefficient" msgid "Uncertainty coefficient" msgstr "不確実係数" #: src/ui/gui/psppire-dialog-action-crosstabs.c:78 msgid "BTau" msgstr "Kendallのタウb" #: src/ui/gui/psppire-dialog-action-crosstabs.c:78 #, fuzzy #| msgid "Kendall's tau-b" msgid "Kendall's Tau-b" msgstr "ケンドールのタウ" #: src/ui/gui/psppire-dialog-action-crosstabs.c:79 msgid "CTau" msgstr "Kendall のタウ c" #: src/ui/gui/psppire-dialog-action-crosstabs.c:79 #, fuzzy #| msgid "Kendall's tau-c" msgid "Kendall's Tau-c" msgstr "ケンドールのタウ" #: src/ui/gui/psppire-dialog-action-crosstabs.c:80 msgid "Risk" msgstr "相対リスク" #: src/ui/gui/psppire-dialog-action-crosstabs.c:80 #, fuzzy #| msgid "Risk estimate." msgid "Relative Risk estimate" msgstr "リスク推定" #: src/ui/gui/psppire-dialog-action-crosstabs.c:81 #: src/language/stats/crosstabs.q:1338 msgid "Gamma" msgstr "ガンマ" #: src/ui/gui/psppire-dialog-action-crosstabs.c:82 msgid "D" msgstr "Somersのd" #: src/ui/gui/psppire-dialog-action-crosstabs.c:82 #, fuzzy #| msgid "Somers' d" msgid "Somer's d" msgstr "ソマーズのd" #: src/ui/gui/psppire-dialog-action-crosstabs.c:83 #: src/language/stats/crosstabs.q:1344 msgid "Kappa" msgstr "カッパ" #: src/ui/gui/psppire-dialog-action-crosstabs.c:83 msgid "Cohen's Kappa" msgstr "" #: src/ui/gui/psppire-dialog-action-crosstabs.c:84 #: src/language/stats/crosstabs.q:1429 msgid "Eta" msgstr "イータ" #: src/ui/gui/psppire-dialog-action-crosstabs.c:85 msgid "Corr" msgstr "相関係数" #: src/ui/gui/psppire-dialog-action-crosstabs.c:85 #, fuzzy #| msgid "Spearman Correlation" msgid "Spearman correlation, Pearson's r" msgstr "スピアマンの順位相関" #: src/ui/gui/psppire-dialog-action-crosstabs.c:90 #, fuzzy #| msgid "Frequency" msgid "Frequency Count" msgstr "度数" #: src/ui/gui/psppire-dialog-action-crosstabs.c:91 msgid "Row" msgstr "行" #: src/ui/gui/psppire-dialog-action-crosstabs.c:91 #, fuzzy #| msgid "Percent" msgid "Row percent" msgstr "パーセント" #: src/ui/gui/psppire-dialog-action-crosstabs.c:92 msgid "Column" msgstr "列" #: src/ui/gui/psppire-dialog-action-crosstabs.c:92 #, fuzzy #| msgid "Cum Percent" msgid "Column percent" msgstr "累積パーセント" #: src/ui/gui/psppire-dialog-action-crosstabs.c:93 #, fuzzy #| msgid "Valid Percent" msgid "Total percent" msgstr "有効パーセント" #: src/ui/gui/psppire-dialog-action-crosstabs.c:94 #: src/language/stats/crosstabs.q:1266 msgid "Expected" msgstr "期待" #: src/ui/gui/psppire-dialog-action-crosstabs.c:94 #, fuzzy #| msgid "Expected Values:" msgid "Expected value" msgstr "期待度数:" #: src/ui/gui/psppire-dialog-action-crosstabs.c:96 #: src/language/stats/crosstabs.q:1268 msgid "Std. Residual" msgstr "標準された残差" #: src/ui/gui/psppire-dialog-action-crosstabs.c:96 #, fuzzy #| msgid "Std. Residual" msgid "Standardized Residual" msgstr "標準された残差" #: src/ui/gui/psppire-dialog-action-crosstabs.c:97 msgid "Adjusted Std. Residual" msgstr "調整済みの標準化された残差" #: src/ui/gui/psppire-dialog-action-descriptives.c:45 msgid "Standard error" msgstr "標準誤差" #: src/ui/gui/psppire-dialog-action-descriptives.c:45 #, fuzzy #| msgid "Standard error of the mean" msgid "Standard error of mean" msgstr "平均の標準誤差" #: src/ui/gui/psppire-dialog-action-descriptives.c:47 #, fuzzy #| msgid "Standard error of the kurtosis" msgid "Kurtosis and standard error of kurtosis" msgstr "尖度の標準誤差" #: src/ui/gui/psppire-dialog-action-descriptives.c:48 #, fuzzy #| msgid "Standard error of the skewness" msgid "Skewness and standard error of skewness" msgstr "歪度の標準誤差" #: src/ui/gui/psppire-dialog-action-factor.c:323 #, c-format msgid "_Eigenvalues over %4.2f times the mean eigenvalue" msgstr "固有値平均の %4.2f 倍以上の固有値(_E)" #: src/ui/gui/psppire-dialog-action-frequencies.c:44 msgid "Standard error of the mean" msgstr "平均の標準誤差" #: src/ui/gui/psppire-dialog-action-frequencies.c:47 msgid "Standard error of the skewness" msgstr "歪度の標準誤差" #: src/ui/gui/psppire-dialog-action-frequencies.c:51 msgid "Standard error of the kurtosis" msgstr "尖度の標準誤差" #: src/ui/gui/psppire-dialog-action-oneway.c:175 #, c-format msgid "Contrast %d of %d" msgstr "対比 %d / %d" #: src/ui/gui/psppire-dialog-action-paired.c:162 src/ui/gui/examine.ui:282 #: src/ui/gui/indep-samples.ui:334 src/ui/gui/t-test.ui:296 msgid "O_ptions..." msgstr "オプション(_p)..." #: src/ui/gui/psppire-dialog-action-paired.c:168 msgid "Paired Samples T Test" msgstr "対応のあるサンプルの t 検定" #: src/ui/gui/psppire-dialog-action-recode-different.c:327 msgid "Recode into Different Variables" msgstr "他の変数への値の再割り当て" #: src/ui/gui/psppire-dialog-action-recode-different.c:330 msgid "Recode into Different Variables: Old and New Values " msgstr "同じ変数への再コード化: 今までの値と新しい値" #: src/ui/gui/psppire-dialog-action-recode-same.c:108 src/ui/gui/recode.ui:391 msgid "Recode into Same Variables" msgstr "同一の変数への値の再割り当て" #: src/ui/gui/psppire-dialog-action-recode-same.c:114 msgid "Recode into Same Variables: Old and New Values" msgstr "新しい変数への再コード化: 今までの値と新しい値" #: src/ui/gui/psppire-dialog-action-regression.c:40 msgid "Coeff" msgstr "係数" #: src/ui/gui/psppire-dialog-action-regression.c:40 msgid "Show the regression coefficients" msgstr "回帰係数の表示" #: src/ui/gui/psppire-dialog-action-regression.c:41 msgid "Conf. Interval" msgstr "信頼区間" #: src/ui/gui/psppire-dialog-action-regression.c:41 msgid "Show the confidence interval for the regression coefficients" msgstr "回帰係数の信頼区間の表示" #: src/ui/gui/psppire-dialog-action-regression.c:42 msgid "Show the correlation between observed and predicted values" msgstr "観測値と予測値との相関の表示" #: src/ui/gui/psppire-dialog-action-regression.c:43 msgid "Anova" msgstr "分散分析" #: src/ui/gui/psppire-dialog-action-regression.c:43 msgid "Show the analysis of variance table" msgstr "分散分析表の表示" #: src/ui/gui/psppire-dialog-action-regression.c:44 msgid "Bcov" msgstr "BCOV" #: src/ui/gui/psppire-dialog-action-regression.c:44 msgid "Show the variance coefficient matrix" msgstr "分散係数行列の表示" #: src/ui/gui/psppire-dialog-action-regression.c:45 #, fuzzy #| msgid "Total" msgid "Tol" msgstr "合計" #: src/ui/gui/psppire-dialog-action-regression.c:45 #, fuzzy #| msgid "Show the variance coefficient matrix" msgid "Show the variance inflation factor and its reciprocal" msgstr "分散係数行列の表示" #: src/ui/gui/psppire-dialog-action-select.c:88 #, c-format msgid "Approximately %3d%% of all cases." msgstr "およそ全ケースの%3d%%" #: src/ui/gui/psppire-dialog-action-select.c:89 #, c-format msgid "Exactly %3d cases from the first %3d cases." msgstr "きっちり %3d ケース(最初に %3d ケース中)" #: src/ui/gui/psppire-dialog-action-select.c:236 #, c-format msgid "%d thru %d" msgstr "%d から %d" #: src/ui/gui/psppire-dialog-action-two-sample.c:180 #: src/ui/gui/k-independent.ui:404 src/ui/gui/k-related.ui:197 msgid "Test Type" msgstr "検定の種類" #: src/ui/gui/psppire-dialog-action-two-sample.c:189 msgid "_Wilcoxon" msgstr "Wilcoxon(_W)" #: src/ui/gui/psppire-dialog-action-two-sample.c:190 msgid "_Sign" msgstr "符号(_S)" #: src/ui/gui/psppire-dialog-action-two-sample.c:191 msgid "_McNemar" msgstr "McNemar(_M)" #: src/ui/gui/psppire-dialog-action-two-sample.c:209 msgid "Two-Related-Samples Tests" msgstr "対応のある2標本の検定" #: src/ui/gui/psppire-dialog-action-weight.c:74 src/ui/gui/weight.ui:83 #: src/ui/gui/weight.ui:211 msgid "Do not weight cases" msgstr "ケースの重み付けなし" #: src/ui/gui/psppire-dialog-action-weight.c:80 #, c-format msgid "Weight cases by %s" msgstr "重み付け変数は%s" #: src/ui/gui/psppire-dict.c:95 #, fuzzy #| msgid "Var%d" msgid "Var" msgstr "Var%d" #. TRANSLATORS: This string must be a valid variable name. That means: #. - The string must be at most 64 bytes (not characters) long. #. - The string may not contain whitespace. #. - The first character may not be '$' #. - The first character may not be a digit #. - The final character may not be '.' or '_' #. #: src/ui/gui/psppire-dict.c:385 #, c-format msgid "Var%04d" msgstr "Var%04d" #: src/ui/gui/psppire-dict.c:566 msgid "Duplicate variable name." msgstr "変数名の重複" #: src/ui/gui/psppire-dictview.c:617 msgid "Prefer variable labels" msgstr "変数ラベルの使用" #: src/ui/gui/psppire-dictview.c:631 msgid "Default sort order" msgstr "" #: src/ui/gui/psppire-dictview.c:637 msgid "Unsorted (dictionary order)" msgstr "未ソート(辞書順)" #: src/ui/gui/psppire-dictview.c:642 msgid "Sort by name" msgstr "名前による並び替え" #: src/ui/gui/psppire-dictview.c:647 msgid "Sort by label" msgstr "ラベルによる並び替え" #: src/ui/gui/psppire-means-layer.c:95 #, c-format msgid "Layer %d of %d" msgstr "レイヤー %d / %d" #: src/ui/gui/psppire-means-layer.c:169 msgid "Forward" msgstr "前へ" #: src/ui/gui/psppire-means-layer.c:170 msgid "Back" msgstr "後へ" #: src/ui/gui/psppire-text-file.c:55 #, c-format msgid "Could not open `%s'" msgstr "`%s' を開けません" #: src/ui/gui/psppire-text-file.c:71 #, c-format msgid "Error reading `%s': %s" msgstr "`%s' の読み込みエラー: %s" #: src/ui/gui/psppire-text-file.c:74 #, c-format msgid "" "Failed to read `%s', because it contains a line over %d bytes long and " "therefore appears not to be a text file." msgstr "" "`%s' の読み込みに失敗しました.そこには長い %d バイト以上の行が含まれていたの" "で,テキストファイルではないと判断されたためです." #: src/ui/gui/psppire-text-file.c:96 #, c-format msgid "`%s' is empty." msgstr "`%s' は空です." #: src/ui/gui/psppire-val-chooser.c:255 msgid "through" msgstr "~" #: src/ui/gui/psppire-val-chooser.c:288 msgid "_Value:" msgstr "値(_V):" #: src/ui/gui/psppire-val-chooser.c:289 msgid "_System Missing" msgstr "システム欠損値(_S)" #: src/ui/gui/psppire-val-chooser.c:290 msgid "System _or User Missing" msgstr "システムまたはユーザ欠損値(_o)" #: src/ui/gui/psppire-val-chooser.c:291 msgid "_Range:" msgstr "範囲(_R):" #: src/ui/gui/psppire-val-chooser.c:292 msgid "Range, _LOWEST thru value" msgstr "範囲,最小値から次の値まで(_L)" #: src/ui/gui/psppire-val-chooser.c:293 msgid "Range, value thru _HIGHEST" msgstr "範囲,次の値から最大値まで(_H)" #: src/ui/gui/psppire-val-chooser.c:294 msgid "_All other values" msgstr "その他の全ての値(_A)" #: src/ui/gui/psppire-var-view.c:153 #, c-format msgid "Var%d" msgstr "Var%d" #: src/ui/source-init-opts.c:72 #, c-format msgid "Algorithm must be either `%s' or `%s'." msgstr "アルゴリズムは `%s' と `%s' のどちらかでなければなりません." #: src/ui/source-init-opts.c:97 #, c-format msgid "Syntax must be either `%s' or `%s'." msgstr "シンタックスは %s か %s のどちらかでなければなりません." #: src/ui/terminal/main.c:144 msgid "Error encountered while ERROR=STOP is effective." msgstr "ERROR=STOPが有効時にエラーが起こりました." #: src/ui/terminal/main.c:150 msgid "" "Stopping syntax file processing here to avoid a cascade of dependent command " "failures." msgstr "" "依存するコマンドエラーの連鎖を回避するために,シンタックスファイルの処理を停" "止しました." #: src/ui/terminal/terminal-opts.c:147 #, c-format msgid "" "PSPP, a program for statistical analysis of sampled data.\n" "Usage: %s [OPTION]... FILE...\n" "\n" "Arguments to long options also apply to equivalent short options.\n" "\n" "Output options:\n" " -o, --output=FILE output to FILE, default format from FILE's name\n" " -O format=FORMAT override format for previous -o\n" " -O OPTION=VALUE set output option to customize previous -o\n" " -O device={terminal|listing} override device type for previous -o\n" " -e, --error-file=FILE append errors, warnings, and notes to FILE\n" " --no-output disable default output driver\n" "Supported output formats: %s\n" "\n" "Language options:\n" " -I, --include=DIR append DIR to search path\n" " -I-, --no-include clear search path\n" " -r, --no-statrc disable running rc file at startup\n" " -a, --algorithm={compatible|enhanced}\n" " set to `compatible' if you want output\n" " calculated from broken algorithms\n" " -x, --syntax={compatible|enhanced}\n" " set to `compatible' to disable PSPP extensions\n" " -b, --batch interpret syntax in batch mode\n" " -i, --interactive interpret syntax in interactive mode\n" " --syntax-encoding=ENCODING specify encoding for syntax files\n" " -s, --safer don't allow some unsafe operations\n" "Default search path: %s\n" "\n" "Informative output:\n" " -h, --help display this help and exit\n" " -V, --version output version information and exit\n" "\n" "Non-option arguments are interpreted as syntax files to execute.\n" msgstr "" "PSPP, 標本データのための統計分析プログラム.\n" "使い方: %s [OPTION] ... FILE ... \n" "\n" "長い形式のオプションの引数は短い形式にも適用できます.\n" "\n" "出力オプション:\n" " -o, --output=FILE output to FILE, default format from FILE's name\n" " -O format=FORMAT override format for previous -o\n" " -O OPTION=VALUE set output option to customize previous -o\n" " -O device={terminal|listing} override device type for previous -o\n" " -e, --error-file=FILE append errors, warnings, and notes to FILE\n" " --no-output disable default output driver\n" "サポートされる出力形式: %s\n" "\n" "言語オプション:\n" " -I, --include=DIR append DIR to search path\n" " -I-, --no-include clear search path\n" " -r, --no-statrc disable running rc file at startup\n" " -a, --algorithm={compatible|enhanced}\n" " set to `compatible' if you want output\n" " calculated from broken algorithms\n" " -x, --syntax={compatible|enhanced}\n" " set to `compatible' to disable PSPP extensions\n" " -b, --batch interpret syntax in batch mode\n" " -i, --interactive interpret syntax in interactive mode\n" " --syntax-encoding=ENCODING specify encoding for syntax files\n" " -s, --safer don't allow some unsafe operations\n" "デフォールトのサーチパス: %s\n" "\n" "情報出力:\n" " -h, --help display this help and exit\n" " -V, --version output version information and exit\n" "\n" "オプションの非引数は実行すべきファイル名と解釈されます.\n" #: src/ui/gui/find-dialog.c:197 msgid "Find" msgstr "検索" #: src/ui/gui/find-dialog.c:662 #, c-format msgid "Bad regular expression: %s" msgstr "誤った正規表現: %s" #: src/ui/gui/help-menu.c:70 msgid "A program for the analysis of sampled data" msgstr "標本抽出によるデータの分析プログラム" #. TRANSLATORS: Do not translate this string. Instead, put the names of the people #. who have helped in the translation. #: src/ui/gui/help-menu.c:80 msgid "translator-credits" msgstr "翻訳者クレジット" #: src/ui/gui/help-menu.c:170 #, c-format msgid "Help path conversion error: %s" msgstr "ヘルプパスの変換エラー: %s" #: src/ui/gui/help-menu.c:197 #, fuzzy, c-format #| msgid "" #| "Cannot open reference manual via yelp: %s. Cannot open via html: %s with " #| "uri: %s The PSSP manual is also available at %s" msgid "" "Cannot open via html: %s with uri: %s The PSSP manual is also available at %s" msgstr "" "ヘルプ: %s からはリファレンスマニュアルを開けません.html: %s の uri: %s から" "も開けません.PSPP ユーザマニュアルは %s で利用できます." #: src/ui/gui/help-menu.c:218 msgid "_Help" msgstr "ヘルプ(_H)" #: src/ui/gui/help-menu.c:221 msgid "_About" msgstr "このプログラムについて(_A)" #: src/ui/gui/help-menu.c:222 msgid "_Reference Manual" msgstr "リファレンスマニュアル(_R)" #: src/ui/gui/main.c:306 msgid "Show version information and exit" msgstr "" #: src/ui/gui/main.c:409 msgid "Do not display the splash screen" msgstr "" #: src/ui/gui/main.c:411 msgid "Do not attempt single instance negotiation" msgstr "" #: src/ui/gui/missing-val-dialog.c:217 msgid "" "The maximum length of a missing value for a string variable is 8 in UTF-8." msgstr "文字列変数において欠損値の最長は UTF-8 で 8 文字です." #: src/ui/gui/missing-val-dialog.c:268 msgid "At least one value must be specified" msgstr "少なくとも1つの値は指定せねばなりません." #: src/ui/gui/missing-val-dialog.c:298 msgid "Incorrect range specification" msgstr "不正な範囲指定" #: src/ui/gui/psppire-data-editor.c:380 #, fuzzy, c-format #| msgid "%s: %s" msgid "%d : %s" msgstr "%s: %s" #: src/ui/gui/psppire-data-editor.c:391 #, c-format msgid "%'d case" msgid_plural "%'d cases" msgstr[0] "%'d ケース" #: src/ui/gui/psppire-data-editor.c:396 #, c-format msgid "%'d variable" msgid_plural "%'d variables" msgstr[0] "%'d 変数" #: src/ui/gui/psppire-data-editor.c:485 msgid "Case" msgstr "ケース" #: src/ui/gui/psppire-data-editor.c:495 msgid "Data View" msgstr "データビュー" #: src/ui/gui/psppire-data-editor.c:505 msgid "Variable View" msgstr "変数ビュー" #: src/ui/gui/psppire-data-sheet.c:171 src/ui/gui/psppire-data-window.c:1338 #, fuzzy #| msgid "Insert Case" msgid "_Insert Case" msgstr "ケースの挿入" #: src/ui/gui/psppire-data-sheet.c:179 src/ui/gui/psppire-data-window.c:1391 #, fuzzy #| msgid "_Clear Cases" msgid "Cl_ear Cases" msgstr "ケースの削除(_C)" #: src/ui/gui/psppire-data-sheet.c:305 src/ui/gui/psppire-data-window.c:1337 #: src/ui/gui/psppire-variable-sheet.c:274 #, fuzzy #| msgid "Insert Variable" msgid "_Insert Variable" msgstr "変数の挿入" #: src/ui/gui/psppire-data-sheet.c:314 src/ui/gui/psppire-variable-sheet.c:283 msgid "Cl_ear Variables" msgstr "変数の削除(_e)" #: src/ui/gui/psppire-data-sheet.c:326 msgid "Sort _Ascending" msgstr "昇順でソート(_A)" #: src/ui/gui/psppire-data-sheet.c:333 msgid "Sort _Descending" msgstr "降順でソート(_D)" #: src/ui/gui/psppire-data-window.c:175 msgid "Transformations Pending" msgstr "変換保留" #: src/ui/gui/psppire-data-window.c:191 msgid "Filter off" msgstr "フィルタリングなし" #: src/ui/gui/psppire-data-window.c:203 #, c-format msgid "Filter by %s" msgstr "%s によるフィルタリング" #: src/ui/gui/psppire-data-window.c:224 msgid "No Split" msgstr "分割なし" #: src/ui/gui/psppire-data-window.c:233 msgid "Split by " msgstr "分割" #: src/ui/gui/psppire-data-window.c:261 msgid "Weights off" msgstr "重み付けなし" #: src/ui/gui/psppire-data-window.c:273 #, c-format msgid "Weight by %s" msgstr "%s による重み付け" #: src/ui/gui/psppire-data-window.c:518 #: src/ui/gui/psppire-import-assistant.c:681 #: src/ui/gui/psppire-syntax-window.c:607 src/ui/gui/psppire-window.c:669 msgid "All Files" msgstr "すべてのファイル" #: src/ui/gui/psppire-data-window.c:535 msgid "System File" msgstr "システムファイル" #: src/ui/gui/psppire-data-window.c:542 msgid "Compressed System File" msgstr "圧縮されたシステムファイル" #: src/ui/gui/psppire-data-window.c:548 msgid "Portable File" msgstr "ポータブルファイル" #: src/ui/gui/psppire-data-window.c:551 msgid "Format:" msgstr "フォーマット:" #: src/ui/gui/psppire-data-window.c:615 msgid "Delete Existing Dataset?" msgstr "現在あるデータセットを消去しますか?" #: src/ui/gui/psppire-data-window.c:619 #, c-format msgid "" "Renaming \"%s\" to \"%s\" will destroy the existing dataset named \"%s\". " "Are you sure that you want to do this?" msgstr "" "\"%s \" から \"%s\"への名前の変更は既存のデータセット \"%s\" を破壊します.本" "当に実行しますか?" #: src/ui/gui/psppire-data-window.c:625 msgid "Delete" msgstr "削除" #: src/ui/gui/psppire-data-window.c:647 #, c-format msgid "Please enter a new name for dataset \"%s\":" msgstr "データセット \"%s\" の新しい名前を入力して下さい:" #: src/ui/gui/psppire-data-window.c:649 msgid "Rename Dataset" msgstr "データセット名を変更" #: src/ui/gui/psppire-data-window.c:1199 src/ui/gui/output-window.ui:68 #: src/ui/gui/syntax-editor.ui:22 msgid "_File" msgstr "ファイル(_F)" #: src/ui/gui/psppire-data-window.c:1203 src/ui/gui/syntax-editor.ui:25 #, fuzzy #| msgid "_New..." msgid "_New" msgstr "新規作成(_N) ..." #: src/ui/gui/psppire-data-window.c:1210 msgid "_Syntax" msgstr "シンタックス(_S)" #: src/ui/gui/psppire-data-window.c:1213 src/ui/gui/data-editor.ui:177 #: src/ui/gui/data-editor.ui:189 msgid "_Data" msgstr "データ(_D)" #: src/ui/gui/psppire-data-window.c:1220 src/ui/gui/syntax-editor.ui:36 #, fuzzy #| msgid "Open" msgid "_Open" msgstr "開く" #: src/ui/gui/psppire-data-window.c:1223 #, fuzzy #| msgid "I_mport Data..." msgid "_Import Data..." msgstr "テキストデータの読み込み(_I) ..." #: src/ui/gui/psppire-data-window.c:1231 src/ui/gui/logistic.ui:261 #: src/ui/gui/regression.ui:66 msgid "_Save..." msgstr "保存(_S) ..." #: src/ui/gui/psppire-data-window.c:1234 msgid "Save _As..." msgstr "名前を付けて保存(_A) ..." #: src/ui/gui/psppire-data-window.c:1237 msgid "_Rename Dataset..." msgstr "データセット名を変更(_R) ..." #: src/ui/gui/psppire-data-window.c:1248 #, fuzzy #| msgid "D_isplay Data File Information" msgid "_Display Data File Information" msgstr "データファイル情報の表示(_i)" #: src/ui/gui/psppire-data-window.c:1255 msgid "Working File" msgstr "作業ファイル" #: src/ui/gui/psppire-data-window.c:1257 #, fuzzy #| msgid "External File..." msgid "_External File..." msgstr "外部ファイル ..." #: src/ui/gui/psppire-data-window.c:1267 #, fuzzy #| msgid "Recently Used Da_ta" msgid "_Recently Used Data" msgstr "最近使ったデータ(_t)" #: src/ui/gui/psppire-data-window.c:1268 msgid "Recently Used _Files" msgstr "最近使ったファイル(_F)" #: src/ui/gui/psppire-data-window.c:1315 src/ui/gui/output-window.ui:82 #: src/ui/gui/syntax-editor.ui:59 msgid "_Quit" msgstr "" #: src/ui/gui/psppire-data-window.c:1333 src/ui/gui/output-window.ui:89 #: src/ui/gui/syntax-editor.ui:66 msgid "_Edit" msgstr "編集(_E)" #: src/ui/gui/psppire-data-window.c:1339 #, fuzzy #| msgid "Go To Variable..." msgid "_Go To Variable..." msgstr "変数 ..." #: src/ui/gui/psppire-data-window.c:1340 #, fuzzy #| msgid "Go To Case..." msgid "_Go To Case..." msgstr "指定のケースへの移動 ..." #: src/ui/gui/psppire-data-window.c:1364 src/ui/gui/syntax-editor.ui:69 msgid "Cu_t" msgstr "" #: src/ui/gui/psppire-data-window.c:1373 src/ui/gui/output-window.ui:96 #: src/ui/gui/syntax-editor.ui:74 msgid "_Copy" msgstr "コピー(_C)" #: src/ui/gui/psppire-data-window.c:1380 src/ui/gui/syntax-editor.ui:79 #, fuzzy #| msgid "Paste" msgid "_Paste" msgstr "貼り付け" #: src/ui/gui/psppire-data-window.c:1387 #, fuzzy #| msgid "Cl_ear Variables" msgid "Clear _Variables" msgstr "変数の削除(_e)" #: src/ui/gui/psppire-data-window.c:1401 msgid "_Find..." msgstr "検索(F) ..." #: src/ui/gui/psppire-data-window.c:1407 src/ui/gui/logistic.ui:246 msgid "_Options..." msgstr "オプション(_O) ..." #: src/ui/gui/psppire-data-window.c:1676 msgid "Jump to variable" msgstr "変数へのジャンプ" #: src/ui/gui/psppire-data-window.c:1689 msgid "Jump to a case in the data sheet" msgstr "データシート内のケースへジャンプ" #: src/ui/gui/psppire-data-window.c:1703 #, fuzzy #| msgid "Sort cases in the active dataset" msgid "Search for values in the data" msgstr "アクティブなデータセットのケース並べ替え" #: src/ui/gui/psppire-data-window.c:1715 msgid "Create a new case at the current position" msgstr "現在の場所に新しいケースを作成." #: src/ui/gui/psppire-data-window.c:1727 msgid "Create a new variable at the current position" msgstr "現在の場所に新しい変数を作成." #: src/ui/gui/psppire-data-window.c:1741 msgid "Split the active dataset" msgstr "アクティブなデータセットの分割" #: src/ui/gui/psppire-data-window.c:1753 msgid "Weight cases by variable" msgstr "変数によるケースの重み付け" #: src/ui/gui/psppire-data-window.c:1764 msgid "Show/hide value labels" msgstr "値ラベル表示/非表示" #: src/ui/gui/psppire-data-window.c:1904 msgid "Data Editor" msgstr "データ エディタ" #: src/ui/gui/psppire-encoding-selector.c:140 msgid "Automatically Detect" msgstr "自動検出" #: src/ui/gui/psppire-encoding-selector.c:147 msgid "Locale Encoding" msgstr "ロケール" #: src/ui/gui/psppire-encoding-selector.c:177 msgid "Character Encoding: " msgstr "文字コード:" #: src/ui/gui/psppire-import-assistant.c:337 msgid "line" msgstr "" #: src/ui/gui/psppire-import-assistant.c:347 msgid "var" msgstr "変数" #: src/ui/gui/psppire-import-assistant.c:560 msgid "Importing Spreadsheet Data" msgstr "表計算データの読み込み" #: src/ui/gui/psppire-import-assistant.c:686 msgid "Text Files" msgstr "テキストファイル" #: src/ui/gui/psppire-import-assistant.c:691 msgid "Text (*.txt) Files" msgstr "テキストファイル(*.txt)" #: src/ui/gui/psppire-import-assistant.c:697 msgid "Plain Text (ASCII) Files" msgstr "単純テキスト(ASCII)ファイル" #: src/ui/gui/psppire-import-assistant.c:702 msgid "Comma Separated Value Files" msgstr "コンマ区切りデータ(CSV)ファイル" #: src/ui/gui/psppire-import-assistant.c:709 msgid "Tab Separated Value Files" msgstr "タブ区切りデータファイル" #: src/ui/gui/psppire-import-assistant.c:714 msgid "Gnumeric Spreadsheet Files" msgstr "グニューメリック表計算ファイル" #: src/ui/gui/psppire-import-assistant.c:719 msgid "OpenDocument Spreadsheet Files" msgstr "オープンドキュメント表計算ファイル" #: src/ui/gui/psppire-import-assistant.c:724 msgid "All Spreadsheet Files" msgstr "すべての表計算ファイル" #: src/ui/gui/psppire-import-assistant.c:733 msgid "Select File to Import" msgstr "インポートするファイルの選択" #: src/ui/gui/psppire-import-assistant.c:770 msgid "Importing Delimited Text Data" msgstr "区切られたテキストデータの読み込み" #: src/ui/gui/psppire-import-assistant.c:865 msgid "Select the First Line" msgstr "1 行目の選択" #: src/ui/gui/psppire-import-assistant.c:877 msgid "Line" msgstr "並び" #: src/ui/gui/psppire-import-assistant.c:931 msgid "" "This assistant will guide you through the process of importing data into " "PSPP from a text file with one line per case, in which fields are separated " "by tabs, commas, or other delimiters.\n" "\n" msgstr "" "このアシスタントはフィールドがタブまたはコンマ,その他の区切り文字で区切られ" "ているケースごとに1行のテキストファイルからPSPPにデータを読み込むプロセスをご" "案内します.\n" #: src/ui/gui/psppire-import-assistant.c:941 #, c-format msgid "The selected file contains %'lu line of text. " msgid_plural "The selected file contains %'lu lines of text. " msgstr[0] "選択されたファイルには %'lu 行のテキストがあります." #: src/ui/gui/psppire-import-assistant.c:950 #, c-format msgid "The selected file contains approximately %'lu line of text. " msgid_plural "The selected file contains approximately %'lu lines of text. " msgstr[0] "選択されたファイルにはおよそ %lu 行のテキストがあります." #: src/ui/gui/psppire-import-assistant.c:956 #, c-format msgid "" "Only the first %zu line of the file will be shown for preview purposes in " "the following screens. " msgid_plural "" "Only the first %zu lines of the file will be shown for preview purposes in " "the following screens. " msgstr[0] "" "次の画面ではプレビューのためにファイル内の最初の %zu 行だけが表示されていま" "す." #: src/ui/gui/psppire-import-assistant.c:965 msgid "You may choose below how much of the file should actually be imported." msgstr "下のなかでどれだけのファイルを読み込むかを選択して下さい." #: src/ui/gui/psppire-import-assistant.c:974 #, c-format msgid "Only the first %4d cases" msgstr "最初の %4d ケースのみ" #: src/ui/gui/psppire-import-assistant.c:985 #, c-format msgid "Only the first %3d %% of file (approximately)" msgstr "ファイル全体の最初の %3d%% のケースのみ(概数)" #: src/ui/gui/psppire-import-assistant.c:1009 msgid "Select the Lines to Import" msgstr "インポートする行の選択" #: src/ui/gui/psppire-import-assistant.c:1151 msgid "Choose Separators" msgstr "分割記号の選択" #: src/ui/gui/psppire-import-assistant.c:1438 msgid "Adjust Variable Formats" msgstr "変数フォーマットの調整" #: src/ui/gui/psppire-output-view.c:410 msgid "Message" msgstr "メッセージ" #: src/ui/gui/psppire-output-view.c:543 msgid "failed to create temporary directory during clipboard operation" msgstr "クリップボード操作の際に一時的なディレクトリの作成に失敗しました." #: src/ui/gui/psppire-output-window.c:241 msgid "Infer file type from extension" msgstr "拡張子からのファイルタイプの判定" #: src/ui/gui/psppire-output-window.c:242 msgid "SPSS Viewer (*.spv)" msgstr "" #: src/ui/gui/psppire-output-window.c:243 msgid "PDF (*.pdf)" msgstr "PDF (*.pdf)" #: src/ui/gui/psppire-output-window.c:244 msgid "HTML (*.html)" msgstr "HTML (*.html)" #: src/ui/gui/psppire-output-window.c:245 msgid "OpenDocument (*.odt)" msgstr "オープンドキュメント(*odt)" #: src/ui/gui/psppire-output-window.c:246 msgid "Text (*.txt)" msgstr "テキスト(*.txt)" #: src/ui/gui/psppire-output-window.c:247 msgid "Text [plain] (*.txt)" msgstr "プレインテキスト(*.txt)" #: src/ui/gui/psppire-output-window.c:248 msgid "PostScript (*.ps)" msgstr "PostScript (*.ps)" #: src/ui/gui/psppire-output-window.c:249 msgid "Comma-Separated Values (*.csv)" msgstr "コンマ区切りデータファイル(*.csv)" #: src/ui/gui/psppire-output-window.c:350 msgid "Export Output" msgstr "出力のエクスポート" #: src/ui/gui/psppire-output-window.c:548 msgid "Output Viewer" msgstr "出力ビューア" #: src/ui/gui/psppire-spreadsheet-model.c:237 msgid "(empty)" msgstr "(空)" #: src/ui/gui/psppire-syntax-window.c:226 msgid "Text Search" msgstr "" #: src/ui/gui/psppire-syntax-window.c:229 #, fuzzy #| msgid "OK" msgid "_OK" msgstr "Ok" #: src/ui/gui/psppire-syntax-window.c:231 #, fuzzy #| msgid "Cancel" msgid "_Cancel" msgstr "キャンセル" #: src/ui/gui/psppire-syntax-window.c:239 msgid "Text to search for:" msgstr "" #: src/ui/gui/psppire-syntax-window.c:570 #, c-format msgid "Saved file `%s'" msgstr "保存ファイル `%s'" #: src/ui/gui/psppire-syntax-window.c:591 msgid "Save Syntax" msgstr "シンタックス保存" #: src/ui/gui/psppire-syntax-window.c:601 src/ui/gui/psppire-window.c:657 msgid "Syntax Files (*.sps) " msgstr "シンタックスファイル(*.sps)" #: src/ui/gui/psppire-syntax-window.c:970 msgid "Syntax Editor" msgstr "シンタックスエディタ" #: src/ui/gui/psppire-syntax-window.c:990 #, c-format msgid "Cannot load syntax file `%s'" msgstr "シンタックスファイル `%s' をロードできません." #: src/ui/gui/psppire-variable-sheet.c:412 #, c-format msgid "{%s, %s}..." msgstr "{%s, %s} ..." #: src/ui/gui/psppire-var-sheet-header.c:64 #, fuzzy #| msgid "Decimals" msgid "Decimal" msgstr "小数点" #: src/ui/gui/psppire-var-sheet-header.c:79 msgid "Align" msgstr "配置" #: src/ui/gui/psppire-var-sheet-header.c:82 msgid "Measure" msgstr "測度" #: src/ui/gui/psppire-window.c:430 #, c-format msgid "Save the changes to `%s' before closing?" msgstr "終了する前に変更を `%s' に保存しますか?" #: src/ui/gui/psppire-window.c:437 #, c-format msgid "" "If you don't save, changes from the last %ld seconds will be permanently " "lost." msgstr "保存しない場合は,これまで %ld 秒の変更は永久に失われます." #: src/ui/gui/psppire-window.c:441 msgid "Close _without saving" msgstr "保存せずに閉じる(_w)" #: src/ui/gui/psppire-window.c:625 src/ui/gui/psppire-window.c:629 msgid "Open" msgstr "開く" #: src/ui/gui/psppire-window.c:634 msgid "Data and Syntax Files" msgstr "データおよびシンタックスファイル" #: src/ui/gui/psppire-window.c:646 msgid "System Files (*.sav, *.zsav)" msgstr "システムファイル(*.sav, *.zsav)" #: src/ui/gui/psppire-window.c:663 #, fuzzy #| msgid "Syntax Files (*.sps) " msgid "Output Files (*.spv) " msgstr "シンタックスファイル(*.sps)" #: src/ui/gui/t-test-options.c:65 #, c-format msgid "Con_fidence Interval: %2d %%" msgstr "信頼区間: %2d %%(_f)" #: src/ui/gui/val-labs-dialog.c:591 #, c-format msgid "%s = `%s'" msgstr "%s = `%s'" #: src/ui/gui/var-type-dialog.c:541 #, fuzzy #| msgid "Compute Variable: Type and Label" msgid "Variable Type and Format" msgstr "計算変数: タイプとラベル" #: src/ui/gui/windows-menu.c:92 msgid "_Minimize all Windows" msgstr "すべてのウィンドウを最小化する(_M)" #: src/ui/gui/windows-menu.c:100 msgid "_Split" msgstr "画面分割(_S)" #: src/ui/gui/windows-menu.c:132 msgid "_Windows" msgstr "ウィンドウ(_W)" #: utilities/pspp-convert.c:67 #, c-format msgid "%s argument must be a single character" msgstr "" #: utilities/pspp-convert.c:265 msgid "exactly two non-option arguments are required; use --help for help" msgstr "きっちり2つの非引数が必要です.--helpでヘルプを参照して下さい." #: utilities/pspp-convert.c:276 #, c-format msgid "%s: cannot guess output format (use -O option)" msgstr "%s: 推測できない出力フォーマット(-O オプションを使用)" #: utilities/pspp-convert.c:341 #, c-format msgid "%s: unknown output format (use -O option)" msgstr "%s: 不明な出力フォーマット(-O オプションを使用)" #: utilities/pspp-convert.c:360 #, c-format msgid "%s: error reading input file" msgstr "%s: 入力ファイルの読み込みエラー" #: utilities/pspp-convert.c:362 #, c-format msgid "%s: error writing output file" msgstr "%s: 出力ファイルの書き込みエラー" #: utilities/pspp-convert.c:409 #, fuzzy, c-format #| msgid "%s: error opening output file" msgid "%s: error opening password file" msgstr "%s: 出力ファイルのオープンエラー" #: utilities/pspp-convert.c:425 #, fuzzy, c-format #| msgid "%s: error reading input file" msgid "" "\n" "%s: password not in file" msgstr "%s: 入力ファイルの読み込みエラー" #: utilities/pspp-convert.c:462 #, fuzzy, c-format #| msgid "`%c' is not a valid hex digit" msgid "%s: '%c' is not in alphabet" msgstr "`%c' は正しい 16 進数文字ではありません." #: utilities/pspp-convert.c:526 msgid "sorry, wrong password" msgstr "パスワードが誤りです" #: utilities/pspp-output.c:92 #, c-format msgid "%s and %s:" msgstr "" #: utilities/pspp-output.c:547 #, c-format msgid "%s: invalid XPath expression" msgstr "" #: utilities/pspp-output.c:716 msgid "missing command name (use --help for help)" msgstr "" #: utilities/pspp-output.c:720 #, c-format msgid "unknown command \"%s\" (use --help for help)" msgstr "" #: utilities/pspp-output.c:728 #, c-format msgid "\"%s\" command takes exactly %d argument" msgid_plural "\"%s\" command takes exactly %d arguments" msgstr[0] "" #: utilities/pspp-output.c:735 #, fuzzy, c-format #| msgid "%s requires at least %d valid arguments in list." msgid "\"%s\" command requires at least %d argument" msgid_plural "\"%s\" command requires at least %d arguments" msgstr[0] "%s はリスト中に少なくとも %d の有効な引数が必要です." #: utilities/pspp-output.c:742 #, fuzzy, c-format #| msgid "%s requires at least %d valid arguments in list." msgid "\"%s\" command requires between %d and %d arguments" msgstr "%s はリスト中に少なくとも %d の有効な引数が必要です." #: utilities/pspp-output.c:782 msgid "The following object classes are supported:" msgstr "" #: utilities/pspp-output.c:791 #, c-format msgid "%s: unknown object class (use --select=help for help" msgstr "" #: src/language/utilities/set.q:162 #, c-format msgid "%s must be between 0 and 20." msgstr "%s の値は 1 から 20 でなければなりません." #: src/language/utilities/set.q:172 src/language/utilities/set.q:179 #, c-format msgid "%s must be at least 1." msgstr "%s は少なくとも 1 でなければなりません." #: src/language/utilities/set.q:205 #, c-format msgid "%s must be at least 1MB" msgstr "%s は少なくとも 1MB でなければなりません." #: src/language/utilities/set.q:207 #, c-format msgid "%s must be positive" msgstr "%s は正でなければなりません." #: src/language/utilities/set.q:213 src/language/utilities/set.q:215 #: src/language/utilities/set.q:217 src/language/utilities/set.q:219 #: src/language/utilities/set.q:221 src/language/utilities/set.q:223 #: src/language/utilities/set.q:225 src/language/utilities/set.q:227 #: src/language/utilities/set.q:229 src/language/utilities/set.q:231 #: src/language/utilities/set.q:233 #, c-format msgid "%s is obsolete." msgstr "%s は廃止されています." #: src/language/utilities/set.q:239 msgid "Active file compression is not implemented." msgstr "アクティブなファイルの圧縮は実装されていません." #: src/language/utilities/set.q:403 #, c-format msgid "%s must be 1500 or later." msgstr "%s は 1500 以降に限られます." #: src/language/utilities/set.q:410 #, c-format msgid "expecting %s or year" msgstr "%s か年が必要です." #: src/language/utilities/set.q:438 src/language/utilities/set.q:535 #, c-format msgid "%s must be at least %d." msgstr "%s は少なくとも %d でなければなりません." #: src/language/utilities/set.q:474 #, c-format msgid "%s is not a recognized encoding or locale name" msgstr "%s は既知のエンコーディングまたはロケールではありません." #: src/language/utilities/set.q:562 #, c-format msgid "" "%s requires numeric output format as an argument. Specified format %s is of " "type string." msgstr "" "%s は引数として数値の出力形式を必要とします.指定された書式 %s は文字列型で" "す." #: src/language/utilities/set.q:791 msgid "ISL (32-bit IEEE 754 single, little-endian)" msgstr "ISL(32-bit IEEE 754 単精度, 下位バイト順)" #: src/language/utilities/set.q:794 msgid "ISB (32-bit IEEE 754 single, big-endian)" msgstr "ISB(32-bit IEEE 754 単精度, 上位バイト順)" #: src/language/utilities/set.q:797 msgid "IDL (64-bit IEEE 754 double, little-endian)" msgstr "IDL (64-bit IEEE 754 倍精度, 下位バイト順)" #: src/language/utilities/set.q:800 msgid "IDB (64-bit IEEE 754 double, big-endian)" msgstr "IDB (64-bit IEEE 754 倍精度, 上位バイト順)" #: src/language/utilities/set.q:804 msgid "VF (32-bit VAX F, VAX-endian)" msgstr "VF(32-bit VAX F, VAX バイト順)" #: src/language/utilities/set.q:807 msgid "VD (64-bit VAX D, VAX-endian)" msgstr "VD(64-bit VAX D, VAXバイト順)" #: src/language/utilities/set.q:810 msgid "VG (64-bit VAX G, VAX-endian)" msgstr "VG(64-bit VAX G, VAX バイト順)" #: src/language/utilities/set.q:814 msgid "ZS (32-bit IBM Z hexadecimal short, big-endian)" msgstr "ZS (32-bit IBM Z 16進数 単精度, 上位バイト順)" #: src/language/utilities/set.q:817 msgid "ZL (64-bit IBM Z hexadecimal long, big-endian)" msgstr "ZL(64-bit IBM Z 16 進数 倍精度, 上位バイト順)" #: src/language/utilities/set.q:985 #, c-format msgid "%s is %s." msgstr "%s は %s です." #: src/language/utilities/set.q:1089 #, c-format msgid "" "Too many %s commands without a %s: at most %d levels of saved settings are " "allowed." msgstr "" "RESTORE を伴わない多すぎる %s コマンド(%s はない): 保存された設定の最大で " "%d レベルまでが許可されています." #: src/language/utilities/set.q:1109 #, c-format msgid "%s without matching %s." msgstr "%s は %s とマッチしない." #: src/language/stats/crosstabs.q:327 #, c-format msgid "Missing mode %s not allowed in general mode. Assuming %s." msgstr "欠損モード %s は一般モードで使用できません.%s が仮定されます." #: src/language/stats/crosstabs.q:444 msgid "Too many cross-tabulation variables or dimensions." msgstr "クロス集計変数あまたは次元が多すぎます." #: src/language/stats/crosstabs.q:509 #, c-format msgid "%s must be specified before %s." msgstr "%s は %s より前に指定せねばなりません." #: src/language/stats/crosstabs.q:543 #, c-format msgid "Maximum value (%ld) less than minimum value (%ld)." msgstr "最大値(%ld)が最小値(%ld)未満です." #: src/language/stats/crosstabs.q:922 #, fuzzy #| msgid "Summary." msgid "Summary" msgstr "要約." #: src/language/stats/crosstabs.q:935 #, fuzzy #| msgid "Crosstabs" msgid "Crosstabulation" msgstr "クロス集計表" #. TRANSLATORS: The %s here describes a crosstabulation. It takes the #. form "var1 * var2 * var3 * ...". #: src/language/stats/crosstabs.q:1013 #, c-format msgid "Crosstabulation %s contained no non-missing cases." msgstr "クロス集計表 %s には欠損値でないデータがありません" #: src/language/stats/crosstabs.q:1204 #, fuzzy #| msgid "Missing Values" msgid "Missing value" msgstr "欠損値" #: src/language/stats/crosstabs.q:1263 #, fuzzy #| msgid "row %" msgid "Row %" msgstr "行%" #: src/language/stats/crosstabs.q:1264 #, fuzzy #| msgid "column %" msgid "Column %" msgstr "列%" #: src/language/stats/crosstabs.q:1265 #, fuzzy #| msgid "total %" msgid "Total %" msgstr "全体%" #: src/language/stats/crosstabs.q:1269 #, fuzzy #| msgid "Adjusted Std. Residual" msgid "Adjusted Residual" msgstr "調整済みの標準化された残差" #: src/language/stats/crosstabs.q:1288 #, fuzzy #| msgid "Chi-Square Test" msgid "Chi-Square Tests" msgstr "カイ2乗検定" #: src/language/stats/crosstabs.q:1294 msgid "Pearson Chi-Square" msgstr "ピアソンのカイ2乗" #: src/language/stats/crosstabs.q:1295 msgid "Likelihood Ratio" msgstr "最尤比" #: src/language/stats/crosstabs.q:1296 msgid "Fisher's Exact Test" msgstr "フィッシャーの正確確率検定" #: src/language/stats/crosstabs.q:1297 msgid "Continuity Correction" msgstr "連続性のための修正" #: src/language/stats/crosstabs.q:1298 msgid "Linear-by-Linear Association" msgstr "線形-線形関連" #: src/language/stats/crosstabs.q:1299 src/language/stats/crosstabs.q:1345 #: src/language/stats/crosstabs.q:1854 msgid "N of Valid Cases" msgstr "有効ケース数" #: src/language/stats/crosstabs.q:1305 #, fuzzy #| msgid "Asymp. Sig. (2-tailed)" msgid "Asymptotic Sig. (2-tailed)" msgstr "近似的有意水準(両側検定)" #: src/language/stats/crosstabs.q:1319 #, fuzzy #| msgid "Symmetric measures." msgid "Symmetric Measures" msgstr "対称測度" #: src/language/stats/crosstabs.q:1324 src/language/stats/crosstabs.q:1364 #: src/language/stats/crosstabs.q:1411 #, fuzzy #| msgid "_Values" msgid "Values" msgstr "値(_V)" #: src/language/stats/crosstabs.q:1326 src/language/stats/crosstabs.q:1413 msgid "Asymp. Std. Error" msgstr "漸近的標準誤差" #: src/language/stats/crosstabs.q:1327 src/language/stats/crosstabs.q:1414 msgid "Approx. T" msgstr "近似t" #: src/language/stats/crosstabs.q:1328 src/language/stats/crosstabs.q:1415 msgid "Approx. Sig." msgstr "近似的有意水準" #: src/language/stats/crosstabs.q:1333 src/language/stats/crosstabs.q:1420 msgid "Nominal by Nominal" msgstr "名義と名義" #: src/language/stats/crosstabs.q:1334 msgid "Cramer's V" msgstr "クラメールのV" #: src/language/stats/crosstabs.q:1334 msgid "Contingency Coefficient" msgstr "C係数" #: src/language/stats/crosstabs.q:1336 src/language/stats/crosstabs.q:1425 msgid "Ordinal by Ordinal" msgstr "順序と順序" #: src/language/stats/crosstabs.q:1337 msgid "Kendall's tau-b" msgstr "ケンドールのタウ" #: src/language/stats/crosstabs.q:1337 msgid "Kendall's tau-c" msgstr "ケンドールのタウ" #: src/language/stats/crosstabs.q:1338 msgid "Spearman Correlation" msgstr "スピアマンの順位相関" #: src/language/stats/crosstabs.q:1340 msgid "Interval by Interval" msgstr "間隔と間隔" #: src/language/stats/crosstabs.q:1341 msgid "Pearson's R" msgstr "ピアソンの R" #: src/language/stats/crosstabs.q:1343 msgid "Measure of Agreement" msgstr "合意尺度" #: src/language/stats/crosstabs.q:1359 #, fuzzy #| msgid "Risk estimate." msgid "Risk Estimate" msgstr "リスク推定" #: src/language/stats/crosstabs.q:1368 #, fuzzy, no-c-format #| msgid "95%% Confidence Interval" msgid "95% Confidence Interval" msgstr "95%% 信頼区間" #: src/language/stats/crosstabs.q:1389 msgid "Symmetric" msgstr "対称" #: src/language/stats/crosstabs.q:1391 src/language/stats/crosstabs.q:1396 #, c-format msgid "%s Dependent" msgstr "%s 従属" #: src/language/stats/crosstabs.q:1406 #, fuzzy #| msgid "Directional measures." msgid "Directional Measures" msgstr "指向性測度" #: src/language/stats/crosstabs.q:1422 msgid "Goodman and Kruskal tau" msgstr "グッドマン・クラスカルのタウ" #: src/language/stats/crosstabs.q:1423 msgid "Uncertainty Coefficient" msgstr "不確実係数" #: src/language/stats/crosstabs.q:1426 msgid "Somers' d" msgstr "ソマーズのd" #: src/language/stats/crosstabs.q:1428 msgid "Nominal by Interval" msgstr "名義と間隔" #: src/language/stats/crosstabs.q:1826 #, fuzzy, c-format #| msgid "Odds Ratio for %s (%g / %g)" msgid "Odds Ratio for %s" msgstr "%s(%g / %g)のためのオッズ比" #: src/language/stats/crosstabs.q:1835 #, fuzzy, c-format #| msgid "For cohort %s = %g" msgid "For cohort %s = " msgstr "コホート %s = %g" #: src/ui/gui/aggregate.ui:24 msgid "Aggregate Data" msgstr "データのグループ集計" #: src/ui/gui/aggregate.ui:126 msgid "_Break variable(s)" msgstr "ブレーク変数(_B)" #: src/ui/gui/aggregate.ui:179 msgid "Variable Name: " msgstr "変数名:" #: src/ui/gui/aggregate.ui:215 msgid "Variable Label: " msgstr "ラベル:" #: src/ui/gui/aggregate.ui:252 msgid "Function: " msgstr "関数:" #: src/ui/gui/aggregate.ui:327 msgid "Argument 1: " msgstr "引数1:" #: src/ui/gui/aggregate.ui:364 msgid "Argument 2: " msgstr "引数2:" #: src/ui/gui/aggregate.ui:428 msgid "Aggregated variables" msgstr "集計変数" #: src/ui/gui/aggregate.ui:469 msgid "_Add aggregated variables to the active dataset" msgstr "アクティブなデータセットに集計変数を追加(_A)" #: src/ui/gui/aggregate.ui:486 msgid "_Replace the current dataset with the aggregated variables" msgstr "現在のデータセットを集計変数で置き換える(_R)" #: src/ui/gui/aggregate.ui:504 msgid "_Write a new data file containing only the aggregated variables" msgstr "集計変数のみを含む新しいデータファイルを作成する(_W)" #: src/ui/gui/aggregate.ui:544 msgid "label" msgstr "ラベル" #: src/ui/gui/aggregate.ui:593 msgid "File is _already sorted on break variable(s)" msgstr "ファイルは既にブレーク変数で並べ替えられている(_a)" #: src/ui/gui/aggregate.ui:609 msgid "Sort file before a_ggregating" msgstr "グループ集計前にファイルを並べ替え(_g)" #: src/ui/gui/aggregate.ui:630 msgid "Options for very large datasets" msgstr "非常に大きなデータセットのオプション" #: src/ui/gui/autorecode.ui:24 msgid "Automatic Recode" msgstr "連続数への再割当" #: src/ui/gui/autorecode.ui:120 msgid "Variable -> New Name" msgstr "変数 -> 新規名" #: src/ui/gui/autorecode.ui:145 msgid "_Lowest value" msgstr "最低値(_L)" #: src/ui/gui/autorecode.ui:163 msgid "_Highest value" msgstr "最高値(_H)" #: src/ui/gui/autorecode.ui:185 msgid "Recode starting from" msgstr "変換の開始値" #: src/ui/gui/autorecode.ui:204 msgid "_New Name" msgstr "新しい変数名(_N):" #: src/ui/gui/autorecode.ui:227 msgid "_Add New Name" msgstr "新しい変数名の追加(_A)" #: src/ui/gui/autorecode.ui:285 msgid "_Use the same recoding scheme for all variables" msgstr "すべての変数に同一の値の再割り当てスキーマを使用(_U)" #: src/ui/gui/autorecode.ui:301 msgid "Treat _blank string values as missing" msgstr "空白文字列をユーザ欠損値として扱う(_b)" #: src/ui/gui/binomial.ui:86 msgid "_Test Variable List:" msgstr "検定変数リスト(_T):" #: src/ui/gui/binomial.ui:160 src/ui/gui/chi-square.ui:281 msgid "_Get from data" msgstr "データからの取得(_G)" #: src/ui/gui/binomial.ui:181 src/ui/gui/indep-samples.ui:150 msgid "_Cut point:" msgstr "分割点(_C):" #: src/ui/gui/binomial.ui:225 msgid "Define Dichotomy" msgstr "2分割の定義" #: src/ui/gui/binomial.ui:245 msgid "Test _Proportion:" msgstr "検定比率(_P):" #: src/ui/gui/compute.ui:32 msgid "Compute Variable: Type and Label" msgstr "計算変数: タイプとラベル" #: src/ui/gui/compute.ui:67 msgid "Use _expression as label" msgstr "表示をラベルとして使用(_e)" #: src/ui/gui/compute.ui:90 msgid "_Label:" msgstr "ラベル(_L):" #: src/ui/gui/compute.ui:194 msgid "_String" msgstr "文字列(_S)" #: src/ui/gui/compute.ui:287 msgid "_Numeric" msgstr "数値(_N)" #: src/ui/gui/compute.ui:343 msgid "Compute Variable" msgstr "変数の計算" #: src/ui/gui/compute.ui:381 msgid "Target _Variable:" msgstr "目標変数(_V):" #: src/ui/gui/compute.ui:412 msgid "_Type & Label..." msgstr "型とラベル(_T) ..." #: src/ui/gui/compute.ui:469 msgid "=" msgstr "=" #: src/ui/gui/compute.ui:526 msgid "_Numeric Expressions:" msgstr "数式(_N):" #: src/ui/gui/compute.ui:598 msgid "_Functions:" msgstr "関数(_F):" #: src/ui/gui/compute.ui:678 msgid "_If..." msgstr "_If ..." #: src/ui/gui/barchart.ui:24 msgid "Barchart" msgstr "バーチャート" #: src/ui/gui/barchart.ui:112 msgid "Category A_xis:" msgstr "カテゴリ軸(_x)" #: src/ui/gui/barchart.ui:140 msgid "_N of cases" msgstr "ケース数(_N)" #: src/ui/gui/barchart.ui:158 msgid "_Cum. n of cases" msgstr "累積ケース数(_C)" #: src/ui/gui/barchart.ui:174 msgid "Other _summary function" msgstr "他の要約機能(_s)" #: src/ui/gui/barchart.ui:191 msgid "% of c_ases" msgstr "ケースのパーセント(_a)" #: src/ui/gui/barchart.ui:207 msgid "C_um. % of cases" msgstr "ケースの累積パーセント" #: src/ui/gui/barchart.ui:270 src/ui/gui/histogram.ui:100 msgid "_Variable:" msgstr "変数(_V):" #: src/ui/gui/barchart.ui:308 msgid "Bars Represent" msgstr "バーの表示" #: src/ui/gui/barchart.ui:340 msgid "Category C_luster:" msgstr "カテゴリのクラスタ(_l)" #: src/ui/gui/correlation.ui:24 msgid "Bivariate Correlations" msgstr "2変量の相関分析" #: src/ui/gui/correlation.ui:148 msgid "Pearso_n" msgstr "ピアソン(_n)" #: src/ui/gui/correlation.ui:164 msgid "_Kendall's tau-b" msgstr "ケンドールのタウ(_K)" #: src/ui/gui/correlation.ui:180 msgid "_Spearman" msgstr "スピアマン(_S)" #: src/ui/gui/correlation.ui:200 msgid "Correlation Coefficients" msgstr "相関係数" #: src/ui/gui/correlation.ui:224 msgid "_Two-tailed" msgstr "両側検定(_T)" #: src/ui/gui/correlation.ui:241 msgid "One-tai_led" msgstr "片側検定(_l)" #: src/ui/gui/correlation.ui:262 msgid "Test of Significance" msgstr "有意性検定" #: src/ui/gui/correlation.ui:275 msgid "_Flag significant correlations" msgstr "有意な相関の星印を付ける(_F)" #: src/ui/gui/count.ui:24 msgid "Count Occurrences of Values within Cases" msgstr "出現数の計算" #: src/ui/gui/count.ui:117 msgid "Numeric _Variables:" msgstr "数値変数(_V):" #: src/ui/gui/count.ui:147 msgid "_Target Variable:" msgstr "グループ化変数(_T):" #: src/ui/gui/count.ui:178 msgid "Target _Label:" msgstr "目標変数のラベル(_L):" #: src/ui/gui/count.ui:192 msgid "_Define Values..." msgstr "グループの定義(_D) ..." #: src/ui/gui/count.ui:257 msgid "Count Values within Cases: Values to Count" msgstr "ケース内の値の計数: 計数する値" #: src/ui/gui/count.ui:305 msgid "Values _to Count:" msgstr "集計される値(_t):" #: src/ui/gui/comments.ui:25 msgid "Data File Comments" msgstr "データファイルのコメント" #: src/ui/gui/comments.ui:49 msgid "Comments:" msgstr "コメント:" #: src/ui/gui/comments.ui:106 msgid "Display comments in output" msgstr "出力時にコメントを表示する" #: src/ui/gui/comments.ui:127 msgid "Column Number: 0" msgstr "列の数: 0" #: src/ui/gui/crosstabs.ui:25 msgid "Crosstabs: Cells" msgstr "クロス集計: セル" #: src/ui/gui/crosstabs.ui:67 msgid "Cell Display" msgstr "セル表示" #: src/ui/gui/crosstabs.ui:99 msgid "Crosstabs" msgstr "クロス集計表" #: src/ui/gui/crosstabs.ui:150 msgid "_Rows" msgstr "行(_R)" #: src/ui/gui/crosstabs.ui:195 msgid "_Columns" msgstr "列(_C)" #: src/ui/gui/crosstabs.ui:242 msgid "_Format..." msgstr "書式(_F) ..." #: src/ui/gui/crosstabs.ui:256 src/ui/gui/examine.ui:267 msgid "_Statistics..." msgstr "統計(_S) ..." #: src/ui/gui/crosstabs.ui:270 msgid "Ce_lls..." msgstr "セル(_l) ..." #: src/ui/gui/crosstabs.ui:348 msgid "Crosstabs: Format" msgstr "クロス集計: 書式" #: src/ui/gui/crosstabs.ui:371 msgid "Print tables" msgstr "表の印刷" #: src/ui/gui/crosstabs.ui:387 msgid "Pivot" msgstr "ピボット(軸)" #: src/ui/gui/crosstabs.ui:403 src/ui/gui/sort.ui:157 msgid "Ascending" msgstr "昇順" #: src/ui/gui/crosstabs.ui:455 msgid "Crosstabs: Statistics" msgstr "クロス集計: 統計" #: src/ui/gui/chi-square.ui:30 msgid "Chi-Square Test" msgstr "カイ2乗検定" #: src/ui/gui/chi-square.ui:82 msgid "All categor_ies equal" msgstr "全てのカテゴリが同じ(_i)" #: src/ui/gui/chi-square.ui:103 msgid "_Values" msgstr "値(_V)" #: src/ui/gui/chi-square.ui:159 msgid "Expected Values:" msgstr "期待度数:" #: src/ui/gui/chi-square.ui:204 msgid "Test _Variables" msgstr "検定変数リスト(_V)" #: src/ui/gui/chi-square.ui:298 msgid "Use _specified range" msgstr "指定された範囲を使用(_s)" #: src/ui/gui/chi-square.ui:323 msgid "_Lower:" msgstr "下限(_L):" #: src/ui/gui/chi-square.ui:337 msgid "_Upper:" msgstr "上限(_U)" #: src/ui/gui/chi-square.ui:381 msgid "Expected Range:" msgstr "期待範囲:" #: src/ui/gui/descriptives.ui:131 src/ui/gui/factor.ui:797 #: src/ui/gui/recode.ui:638 msgid "_Variables:" msgstr "変数(_V):" #: src/ui/gui/descriptives.ui:176 msgid "S_tatistics:" msgstr "統計(_t):" #: src/ui/gui/descriptives.ui:230 msgid "_Exclude entire case if any selected variable is missing" msgstr "選択された変数いずれかが欠損値ならばケース全体を除外(_E)" #: src/ui/gui/descriptives.ui:247 msgid "_Include user-missing data in analysis" msgstr "ユーザ欠損値を分析に含める(_I)" #: src/ui/gui/descriptives.ui:264 msgid "Save _Z-scores of selected variables as new variables" msgstr "標準得点を変数として保存(_Z)" #: src/ui/gui/descriptives.ui:286 msgid "Options:" msgstr "オプション:" #: src/ui/gui/examine.ui:25 msgid "Explore" msgstr "探索的" #: src/ui/gui/examine.ui:69 msgid "_Label Cases by:" msgstr "ケースのラベル(_L):" #: src/ui/gui/examine.ui:116 msgid "_Factor List:" msgstr "因子(_F):" #: src/ui/gui/examine.ui:163 src/ui/gui/means.ui:126 msgid "_Dependent List:" msgstr "従属変数(_D):" #: src/ui/gui/examine.ui:331 msgid "Explore: Options" msgstr "探索的分析: オプション" #: src/ui/gui/examine.ui:355 src/ui/gui/t-test.ui:81 msgid "Exclude cases _listwise" msgstr "リストごとに除外(_l)" #: src/ui/gui/examine.ui:373 msgid "Exclude cases _pairwise" msgstr "ペアごとに除外(_p)" #: src/ui/gui/examine.ui:392 msgid "_Report values" msgstr "欠損値を出力(_R)" #: src/ui/gui/examine.ui:449 msgid "Explore: Statistics" msgstr "探索的分析: 統計" #: src/ui/gui/examine.ui:468 src/ui/gui/oneway.ui:576 msgid "_Descriptives" msgstr "記述統計量(_D)" #: src/ui/gui/examine.ui:485 msgid "_Extremes" msgstr "外れ値(_E)" #: src/ui/gui/examine.ui:502 msgid "_Percentiles" msgstr "パーセンタイル(_P)" #: src/ui/gui/goto-case.ui:31 msgid "Goto Case" msgstr "指定のケースへの移動 ..." #: src/ui/gui/goto-case.ui:52 msgid "Goto Case Number:" msgstr "ケース番号へ移動:" #: src/ui/gui/factor.ui:39 msgid "Factor Analysis: Rotation" msgstr "因子分析: 回転" #: src/ui/gui/factor.ui:70 msgid "_None" msgstr "なし(_N)" #: src/ui/gui/factor.ui:87 msgid "_Varimax" msgstr "バリマックス(_V)" #: src/ui/gui/factor.ui:104 msgid "_Quartimax" msgstr "クォーティマックス(_Q)" #: src/ui/gui/factor.ui:123 msgid "_Equimax" msgstr "エカマックス(_E)" #: src/ui/gui/factor.ui:146 msgid "Method" msgstr "方法" #: src/ui/gui/factor.ui:159 msgid "_Display rotated solution" msgstr "回転後の解(_D)" #: src/ui/gui/factor.ui:181 src/ui/gui/factor.ui:582 msgid "Ma_ximum iterations for convergence:" msgstr "収束のための最大反復回数(_x):" #: src/ui/gui/factor.ui:241 src/ui/gui/factor.ui:255 msgid "Principal Components Analysis" msgstr "主成分分析" #: src/ui/gui/factor.ui:246 src/ui/gui/factor.ui:258 msgid "Principal Axis Factoring" msgstr "主因子法" #: src/ui/gui/factor.ui:264 msgid "Factor Analysis: Extraction" msgstr "因子分析: 抽出" #: src/ui/gui/factor.ui:290 msgid "_Method: " msgstr "解法(_M):" #: src/ui/gui/factor.ui:345 msgid "Co_rrelation matrix" msgstr "相関行列(_r)" #: src/ui/gui/factor.ui:361 msgid "Co_variance matrix" msgstr "分散共分散行列(_v)" #: src/ui/gui/factor.ui:382 msgid "Analyze" msgstr "分析" #: src/ui/gui/factor.ui:407 msgid "_Unrotated factor solution" msgstr "回転のない因子解(_U)" #: src/ui/gui/factor.ui:423 msgid "_Scree plot" msgstr "スクリープロット(_S)" #: src/ui/gui/factor.ui:443 src/ui/gui/histogram.ui:146 src/ui/gui/roc.ui:329 msgid "Display" msgstr "表示" #: src/ui/gui/factor.ui:526 msgid "_Number of factors:" msgstr "抽出する因子(_N):" #: src/ui/gui/factor.ui:563 msgid "Extract" msgstr "抽出" #: src/ui/gui/factor.ui:640 msgid "Factor Analysis" msgstr "因子分析" #: src/ui/gui/factor.ui:672 src/ui/gui/data-editor.ui:266 msgid "_Descriptives..." msgstr "記述統計量(_D) ..." #: src/ui/gui/factor.ui:685 msgid "_Extraction..." msgstr "因子抽出(_E) ..." #: src/ui/gui/factor.ui:699 msgid "_Rotations..." msgstr "回転(_R) ..." #: src/ui/gui/find.ui:25 msgid "Find Case" msgstr "ケース検索" #: src/ui/gui/find.ui:117 msgid "Variable:" msgstr "変数:" #: src/ui/gui/find.ui:157 src/ui/gui/val-labs-dialog.ui:113 msgid "Value:" msgstr "値:" #: src/ui/gui/find.ui:180 msgid "Search value labels" msgstr "値ラベルの検索" #: src/ui/gui/find.ui:210 msgid "Regular expression Match" msgstr "正規表現で一致" #: src/ui/gui/find.ui:227 msgid "Search substrings" msgstr "部分文字列の検索" #: src/ui/gui/find.ui:244 msgid "Wrap around" msgstr "最初に戻る" #: src/ui/gui/find.ui:260 msgid "Search backward" msgstr "逆方向の検索" #: src/ui/gui/frequencies.ui:32 msgid "Frequencies: Frequency Tables" msgstr "度数分布: 度数分布表" #: src/ui/gui/frequencies.ui:67 msgid "_Always" msgstr "常に表示する(_A)" #: src/ui/gui/frequencies.ui:85 msgid "_Never" msgstr "常に表示しない(_N)" #: src/ui/gui/frequencies.ui:107 msgid "If no _more than " msgstr "カテゴリ数が(_n)" #: src/ui/gui/frequencies.ui:129 src/ui/gui/frequencies.ui:454 msgid "100" msgstr "100" #: src/ui/gui/frequencies.ui:145 msgid "values" msgstr "以下ならば表示する" #: src/ui/gui/frequencies.ui:167 msgid "Display frequency tables" msgstr "度数分布表の表示" #: src/ui/gui/frequencies.ui:194 msgid "A_scending value" msgstr "値による昇順(_s)" #: src/ui/gui/frequencies.ui:212 msgid "D_escending value" msgstr "値による降順(_e)" #: src/ui/gui/frequencies.ui:230 msgid "Ascending _frequency" msgstr "度数による昇順(_f)" #: src/ui/gui/frequencies.ui:248 msgid "Descending f_requency" msgstr "度数による降順(_r)" #: src/ui/gui/frequencies.ui:271 msgid "Order by" msgstr "表示順" #: src/ui/gui/frequencies.ui:324 msgid "Frequencies: Charts" msgstr "度数分布: チャート" #: src/ui/gui/frequencies.ui:356 msgid "Scale:" msgstr "尺度:" #: src/ui/gui/frequencies.ui:366 msgid "_Frequencies" msgstr "度数分布(_F)" #: src/ui/gui/frequencies.ui:383 msgid "_Percentages" msgstr "パーセンテージ(_P)" #: src/ui/gui/frequencies.ui:407 msgid "Exclude values _below " msgstr "未満を除外(_b)" #: src/ui/gui/frequencies.ui:422 msgid "Exclude values _above " msgstr "超過を除外(_a)" #: src/ui/gui/frequencies.ui:441 src/ui/gui/reliability.ui:227 msgid "0" msgstr "0" #: src/ui/gui/frequencies.ui:469 msgid "Chart Formatting" msgstr "チャートのフォーマット" #: src/ui/gui/frequencies.ui:494 msgid "Draw _histograms" msgstr "ヒストグラムの描画(_h)" #: src/ui/gui/frequencies.ui:510 msgid "Superimpose _normal curve" msgstr "正規曲線の重ね書き(_n)" #: src/ui/gui/frequencies.ui:530 msgid "Histograms" msgstr "ヒストグラム" #: src/ui/gui/frequencies.ui:555 msgid "Draw _bar charts" msgstr "バーチャートの描画(_b)" #: src/ui/gui/frequencies.ui:575 msgid "Bar Charts" msgstr "バーチャート" #: src/ui/gui/frequencies.ui:600 msgid "Draw _pie charts" msgstr "パイチャートの描画(_p)" #: src/ui/gui/frequencies.ui:616 msgid "Include slices for _missing values" msgstr "欠損値のスライスを含める(_m)" #: src/ui/gui/frequencies.ui:636 msgid "Pie Charts" msgstr "パイチャート" #: src/ui/gui/frequencies.ui:725 src/ui/gui/rank.ui:489 msgid "_Variable(s):" msgstr "変数(_V):" #: src/ui/gui/frequencies.ui:769 msgid "_Statistics:" msgstr "統計(_S):" #: src/ui/gui/frequencies.ui:783 msgid "Include _missing values" msgstr "欠損値を含む(_m)" #: src/ui/gui/frequencies.ui:806 msgid "Ch_arts..." msgstr "チャート(_a) ..." #: src/ui/gui/frequencies.ui:821 msgid "Frequency _Tables..." msgstr "度数分布表(_T) ..." #: src/ui/gui/histogram.ui:24 msgid "Histogram" msgstr "ヒストグラム" #: src/ui/gui/histogram.ui:126 msgid "_Display normal curve" msgstr "正規曲線の表示(_D)" #: src/ui/gui/indep-samples.ui:25 src/ui/gui/k-independent.ui:35 msgid "Define Groups" msgstr "グループの定義" #: src/ui/gui/indep-samples.ui:75 msgid "Group_2 value:" msgstr "グループ2の値(_2):" #: src/ui/gui/indep-samples.ui:89 msgid "Group_1 value:" msgstr "グループ1の値(_1):" #: src/ui/gui/indep-samples.ui:190 msgid "_Use specified values:" msgstr "特定の値を使用(_U):" #: src/ui/gui/indep-samples.ui:259 msgid "Independent-Samples T Test" msgstr "独立したサンプルのt検定" #: src/ui/gui/indep-samples.ui:319 msgid "_Define Groups..." msgstr "グループの定義(_D) ..." #: src/ui/gui/indep-samples.ui:401 src/ui/gui/t-test.ui:211 msgid "_Test Variable(s):" msgstr "検定変数(_T):" #: src/ui/gui/indep-samples.ui:454 src/ui/gui/k-independent.ui:165 msgid "_Grouping Variable:" msgstr "グループ化変数(_G):" #: src/ui/gui/k-independent.ui:63 #, fuzzy #| msgid "_Upper:" msgid "_Upper limit:" msgstr "上限(_U)" #: src/ui/gui/k-independent.ui:77 #, fuzzy #| msgid "_Lower:" msgid "_Lower limit:" msgstr "下限(_L):" #: src/ui/gui/k-independent.ui:136 #, fuzzy #| msgid "Tests for Several Related Samples" msgid "Tests for Several Independent Samples" msgstr "複数の対応サンプルの検定" #: src/ui/gui/k-independent.ui:208 src/ui/gui/ks-one-sample.ui:131 msgid "Test _Variable List:" msgstr "検定変数リスト(_V):" #: src/ui/gui/k-independent.ui:320 #, fuzzy #| msgid "Define Groups" msgid "_Define Groups" msgstr "グループの定義" #: src/ui/gui/k-independent.ui:365 msgid "_Kruskal-Wallis H" msgstr "" #: src/ui/gui/k-independent.ui:382 src/ui/gui/runs.ui:140 msgid "_Median" msgstr "メディアン(_M)" #: src/ui/gui/k-means.ui:24 msgid "K-Means Cluster Analysis" msgstr "K平均法クラスタ分析" #: src/ui/gui/k-means.ui:122 msgid "N_umber of Clusters: " msgstr "クラスタ数(_N):" #: src/ui/gui/k-related.ui:24 msgid "Tests for Several Related Samples" msgstr "複数の対応サンプルの検定" #: src/ui/gui/k-related.ui:113 msgid "_Test Variables:" msgstr "検定変数(_T):" #: src/ui/gui/k-related.ui:145 msgid "_Friedman" msgstr "Friedman(_F)" #: src/ui/gui/k-related.ui:161 msgid "_Kendall's W" msgstr "Kendall の W(_K)" #: src/ui/gui/k-related.ui:177 msgid "_Cochran's Q" msgstr "CochranのQ(_Q)" #: src/ui/gui/ks-one-sample.ui:163 msgid "_Normal" msgstr "正規(_N)" #: src/ui/gui/ks-one-sample.ui:181 msgid "_Poisson" msgstr "ポアソン(_P)" #: src/ui/gui/ks-one-sample.ui:198 msgid "_Uniform" msgstr "一様(_U)" #: src/ui/gui/ks-one-sample.ui:213 msgid "_Exponential" msgstr "指数(_E)" #: src/ui/gui/ks-one-sample.ui:232 msgid "Test Distribution" msgstr "検定のための分布" #: src/ui/gui/logistic.ui:42 msgid "Logistic Regression: Options" msgstr "ロジスティック回帰: オプション" #: src/ui/gui/logistic.ui:66 msgid "CI for _exp(B): " msgstr "CI for _exp(B): " #: src/ui/gui/logistic.ui:97 msgid "%" msgstr "%" #: src/ui/gui/logistic.ui:146 msgid "Classification cu_toff: " msgstr "カットオフの分類(_t):" #: src/ui/gui/logistic.ui:159 msgid "_Maximum Iterations: " msgstr "最大反復回数(_M):" #: src/ui/gui/logistic.ui:177 msgid "Include _constant in model" msgstr "モデルに定数を含める(_c)" #: src/ui/gui/logistic.ui:219 msgid "Logistic Regression" msgstr "回帰" #: src/ui/gui/logistic.ui:364 src/ui/gui/regression.ui:185 msgid "_Dependent" msgstr "従属変数(_D)" #: src/ui/gui/logistic.ui:412 src/ui/gui/regression.ui:232 msgid "_Independent" msgstr "独立変数(_I)" #: src/ui/gui/means.ui:25 msgid "Means" msgstr "平均" #: src/ui/gui/means.ui:179 msgid "_Independent List:" msgstr "独立変数(_I):" #: src/ui/gui/missing-val-dialog.ui:48 msgid "_No missing values" msgstr "欠損値なし(_N)" #: src/ui/gui/missing-val-dialog.ui:136 msgid "_Discrete missing values" msgstr "離散的欠損値(_D)" #: src/ui/gui/missing-val-dialog.ui:172 msgid "_Low:" msgstr "下限(_L):" #: src/ui/gui/missing-val-dialog.ui:197 msgid "_High:" msgstr "上限(_H):" #: src/ui/gui/missing-val-dialog.ui:221 msgid "Di_screte value:" msgstr "離散値(_s):" #: src/ui/gui/missing-val-dialog.ui:245 msgid "_Range plus one optional discrete missing value" msgstr "範囲とオプションの離散的欠損値(_R)" #: src/ui/gui/oneway.ui:25 msgid "One-Way ANOVA: Contrasts" msgstr "一元配置分散分析: 対比" #: src/ui/gui/oneway.ui:107 msgid "_Coefficients:" msgstr "係数(_C):" #: src/ui/gui/oneway.ui:161 msgid "Coefficient Total: " msgstr "係数の合計:" #: src/ui/gui/oneway.ui:198 msgid "Contrast 1 of 1" msgstr "対比1の1" #: src/ui/gui/oneway.ui:234 #, fuzzy #| msgid "One-Way ANOVA: Contrasts" msgid "One-Way ANOVA: Post-Hoc" msgstr "一元配置分散分析: 対比" #: src/ui/gui/oneway.ui:270 #, fuzzy #| msgid "Games-Howell" msgid "Games Howell" msgstr "ゲームズ・ハウエル" #: src/ui/gui/oneway.ui:287 msgid "Fisher's LSD" msgstr "" #: src/ui/gui/oneway.ui:379 msgid "One-Way ANOVA" msgstr "一元配置分散分析" #: src/ui/gui/oneway.ui:408 msgid "_Factor:" msgstr "因子(_F):" #: src/ui/gui/oneway.ui:451 msgid "Dependent _Variable(s):" msgstr "従属変数リスト(_V):" #: src/ui/gui/oneway.ui:593 msgid "_Homogeneity" msgstr "等分散性の検定(_H)" #: src/ui/gui/oneway.ui:637 msgid "Post-Hoc..." msgstr "" #: src/ui/gui/oneway.ui:652 msgid "_Contrasts..." msgstr "対比(_C) ..." #: src/ui/gui/options.ui:25 #, fuzzy #| msgid "Options" msgid "Options Case" msgstr "オプション" #: src/ui/gui/options.ui:55 #, fuzzy #| msgid "Value _Labels" msgid "Display _Labels" msgstr "値ラベル(_L)" #: src/ui/gui/options.ui:71 #, fuzzy #| msgid "Display" msgid "Display _Names" msgstr "表示" #: src/ui/gui/options.ui:99 #, fuzzy #| msgid "Sort by label" msgid "Sort by L_abel" msgstr "ラベルによる並び替え" #: src/ui/gui/options.ui:115 #, fuzzy #| msgid "Sort by name" msgid "Sort by Na_me" msgstr "名前による並び替え" #: src/ui/gui/options.ui:131 msgid "Do not S_ort" msgstr "" #: src/ui/gui/options.ui:159 #, fuzzy #| msgid "Variables" msgid "Variable Lists" msgstr "変数" #: src/ui/gui/options.ui:184 msgid "Ma_ximize" msgstr "" #: src/ui/gui/options.ui:199 msgid "_Raise" msgstr "" #: src/ui/gui/options.ui:214 msgid "Aler_t" msgstr "" #: src/ui/gui/options.ui:233 msgid "Output Window Action" msgstr "" #: src/ui/gui/paired-samples.ui:147 msgid "_Test Pair(s):" msgstr "対応のある変数(_T):" #: src/ui/gui/rank.ui:30 msgid "Rank Cases: Types" msgstr "ケースの順位付け: タイプ" #: src/ui/gui/rank.ui:57 msgid "Sum of case _weights" msgstr "ケースの重み付けの合計(_w)" #: src/ui/gui/rank.ui:74 msgid "Fractional rank as _%" msgstr "小数点付き順位パーセント(_%)" #: src/ui/gui/rank.ui:92 msgid "_Fractional rank" msgstr "小数点付き順位(_F)" #: src/ui/gui/rank.ui:109 msgid "_Savage score" msgstr "サベージスコア(_S)" #: src/ui/gui/rank.ui:125 msgid "_Rank" msgstr "順位(_R)" #: src/ui/gui/rank.ui:147 msgid "N_tiles" msgstr "百分位(_t)" #: src/ui/gui/rank.ui:195 msgid "_Proportion Estimates" msgstr "比率推定値(_E)" #: src/ui/gui/rank.ui:213 msgid "_Normal Scores" msgstr "正規スコア(_N)" #: src/ui/gui/rank.ui:251 msgid "_Blom" msgstr "ブロム(_B)" #: src/ui/gui/rank.ui:269 msgid "Tuke_y" msgstr "テューキー(_y)" #: src/ui/gui/rank.ui:287 msgid "Ran_kit" msgstr "Rankit(_k)" #: src/ui/gui/rank.ui:305 msgid "_Van der Waerden" msgstr "ファン・デル・ヴェルデン(_V)" #: src/ui/gui/rank.ui:328 msgid "Proportion Estimation Formula" msgstr "比率推定式" #: src/ui/gui/rank.ui:369 msgid "Rank Cases" msgstr "ケースのランク付け" #: src/ui/gui/rank.ui:434 msgid "_By:" msgstr "グループ(_B):" #: src/ui/gui/rank.ui:595 msgid "_Smallest Value" msgstr "最小値(_S)" #: src/ui/gui/rank.ui:613 msgid "_Largest Value" msgstr "最大値(_L)" #: src/ui/gui/rank.ui:637 msgid "Assign rank 1 to:" msgstr "ランク1の割当:" #: src/ui/gui/rank.ui:656 msgid "_Display summary tables" msgstr "要約表の表示(_D)" #: src/ui/gui/rank.ui:679 msgid "Rank T_ypes" msgstr "手法(_y)" #: src/ui/gui/rank.ui:694 msgid "_Ties..." msgstr "同順位(_T) ..." #: src/ui/gui/rank.ui:756 msgid "Rank Cases: Ties" msgstr "ケースの順位付け: 同順位" #: src/ui/gui/rank.ui:788 msgid "_Mean" msgstr "平均(_M)" #: src/ui/gui/rank.ui:806 msgid "_Low" msgstr "下(_L)" #: src/ui/gui/rank.ui:825 msgid "_High" msgstr "上(_H)" #: src/ui/gui/rank.ui:851 msgid "_Sequential ranks to unique values" msgstr "同じ値に対する同順位(_S)" #: src/ui/gui/rank.ui:875 msgid "Rank Assigned to Ties" msgstr "同順位に割り当てる順位" #: src/ui/gui/runs.ui:155 msgid "M_ean" msgstr "平均(_e)" #: src/ui/gui/runs.ui:171 msgid "Mo_de" msgstr "最頻値(_d)" #: src/ui/gui/runs.ui:191 msgid "_Custom:" msgstr "ユーザの指定(_C):" #: src/ui/gui/runs.ui:230 msgid "Cut Point" msgstr "分割点" #: src/ui/gui/sort.ui:25 msgid "Sort Cases" msgstr "ケースの並び替え" #: src/ui/gui/sort.ui:101 msgid "Sort by:" msgstr "並び替え:" #: src/ui/gui/sort.ui:174 msgid "Descending" msgstr "降順" #: src/ui/gui/sort.ui:196 msgid "Sort Order" msgstr "並び順" #: src/ui/gui/split-file.ui:25 msgid "Split File" msgstr "ファイルの分割" #: src/ui/gui/split-file.ui:103 msgid "Anal_yze all cases. Do not create groups." msgstr "全てのケースを分析(_y)" #: src/ui/gui/split-file.ui:121 msgid "Compare _groups." msgstr "グループの比較(_g)" #: src/ui/gui/split-file.ui:140 msgid "Organize ou_tput by groups." msgstr "グループごとの分析(_t)" #: src/ui/gui/split-file.ui:225 msgid "Groups _based on:" msgstr "グループ化変数(_b):" #: src/ui/gui/split-file.ui:255 msgid "_Sort the file by grouping variables." msgstr "グループ変数によるファイルの並べ替え(_S)" #: src/ui/gui/split-file.ui:273 msgid "_File is already sorted." msgstr "ファイルはすでに並べ替え済み(_F)" #: src/ui/gui/split-file.ui:334 msgid "Current Status : " msgstr "現在の状態:" #: src/ui/gui/split-file.ui:348 msgid "Analysis by groups is off" msgstr "グループごとに分析しない" #: src/ui/gui/recode.ui:135 msgid "System _Missing" msgstr "システム欠損値(_M)" #: src/ui/gui/recode.ui:150 msgid "Co_py old values" msgstr "Co_py old values" #: src/ui/gui/recode.ui:172 msgid "Va_lue: " msgstr "値(_l):" #: src/ui/gui/recode.ui:276 msgid "Conver_t numeric strings to numbers (`5' -> 5)" msgstr "数字文字の数値への変換 [`5' -> 5](_t)" #: src/ui/gui/recode.ui:297 msgid "Output variables are _strings" msgstr "変換先変数(_s)" #: src/ui/gui/recode.ui:318 msgid "Width: " msgstr "横幅:" #: src/ui/gui/recode.ui:499 msgid "_Name:" msgstr "名前(_N):" #: src/ui/gui/recode.ui:527 msgid "La_bel:" msgstr "ラベル(_L):" #: src/ui/gui/recode.ui:556 msgid "Chan_ge" msgstr "変更(_g)" #: src/ui/gui/recode.ui:584 msgid "Output Variable" msgstr "変換先変数" #: src/ui/gui/recode.ui:658 msgid "Old and New Va_lues..." msgstr "今までの値と新しい値(_l) ..." #: src/ui/gui/regression.ui:51 msgid "S_tatistics..." msgstr "統計(_t) ..." #: src/ui/gui/regression.ui:272 msgid "Regression: Save" msgstr "回帰: 保存" #: src/ui/gui/regression.ui:290 src/ui/gui/univariate.ui:42 msgid "_Predicted values" msgstr "予測値(_P)" #: src/ui/gui/regression.ui:307 src/ui/gui/univariate.ui:59 msgid "_Residuals" msgstr "残差(_R)" #: src/ui/gui/regression.ui:351 msgid "Regression: Statistics" msgstr "回帰分析: 統計" #: src/ui/gui/regression.ui:393 src/ui/gui/univariate.ui:143 msgid "S_tatistics" msgstr "統計(_t)" #: src/ui/gui/reliability.ui:34 msgid "Alpha" msgstr "アルファ (α)" #: src/ui/gui/reliability.ui:43 msgid "Reliability Analysis" msgstr "信頼性分析" #: src/ui/gui/reliability.ui:144 msgid "_Items:" msgstr "項目(_I):" #: src/ui/gui/reliability.ui:166 msgid "_Model: " msgstr "モデル(_M):" #: src/ui/gui/reliability.ui:212 msgid "_Variables in first split:" msgstr "第1分割の変数(_V):" #: src/ui/gui/reliability.ui:259 msgid "Show _descriptives for scale if item is deleted" msgstr "項目を削除したときの尺度(_d)" #: src/ui/gui/roc.ui:145 msgid "_Test Variable:" msgstr "検定変数(_T):" #: src/ui/gui/roc.ui:175 msgid "_State Variable:" msgstr "状態変数(_S):" #: src/ui/gui/roc.ui:202 msgid "_Value of state variable:" msgstr "状態変数の値(_V):" #: src/ui/gui/roc.ui:249 msgid "ROC C_urve" msgstr "ROC 曲線(_u)" #: src/ui/gui/roc.ui:269 msgid "_With diagonal reference line" msgstr "対角参照線(_W)" #: src/ui/gui/roc.ui:293 msgid "Standard _Error and Confidence Interval" msgstr "標準誤差と信頼区間(_E)" #: src/ui/gui/roc.ui:309 msgid "_Coordinate points of the ROC Curve" msgstr "ROC曲線の座標点(_C)" #: src/ui/gui/scatterplot.ui:25 msgid "Scatterplot" msgstr "散布図" #: src/ui/gui/scatterplot.ui:56 msgid "_X Axis:" msgstr "X 軸(_X)" #: src/ui/gui/scatterplot.ui:100 msgid "_Y Axis:" msgstr "Y 軸(_Y)" #: src/ui/gui/select-cases.ui:37 msgid "Select Cases: Range" msgstr "ケースの選択: 範囲指定" #: src/ui/gui/select-cases.ui:87 msgid "First case" msgstr "最初のケース" #: src/ui/gui/select-cases.ui:99 msgid "Last case" msgstr "最後のケース" #: src/ui/gui/select-cases.ui:111 msgid "Observation" msgstr "オブザベーション" #: src/ui/gui/select-cases.ui:161 msgid "Select Cases" msgstr "ケースの選択" #: src/ui/gui/select-cases.ui:313 msgid "Use filter variable" msgstr "フィルター変数の使用" #: src/ui/gui/select-cases.ui:380 msgid "Based on time or case range" msgstr "日付またはケース番号の範囲" #: src/ui/gui/select-cases.ui:395 msgid "Range..." msgstr "範囲 .." #: src/ui/gui/select-cases.ui:444 msgid "Random sample of cases" msgstr "ケースの無作為抽出" #: src/ui/gui/select-cases.ui:460 msgid "Sample..." msgstr "サンプル ..." #: src/ui/gui/select-cases.ui:508 msgid "If condition is satisfied" msgstr "IF 条件が満たされるケース" #: src/ui/gui/select-cases.ui:523 msgid "If..." msgstr "If ..." #: src/ui/gui/select-cases.ui:567 msgid "All Cases" msgstr "すべてのケース" #: src/ui/gui/select-cases.ui:581 msgid "Select" msgstr "選択状況" #: src/ui/gui/select-cases.ui:608 msgid "Filtered" msgstr "除外" #: src/ui/gui/select-cases.ui:625 msgid "Deleted" msgstr "削除" #: src/ui/gui/select-cases.ui:647 msgid "Unselected Cases Are" msgstr "選択されなかったケース" #: src/ui/gui/select-cases.ui:694 msgid "Select Cases: Random Sample" msgstr "ケースの選択: 無作為抽出" #: src/ui/gui/select-cases.ui:756 msgid "Sample Size" msgstr "標本の大きさ" #: src/ui/gui/t-test.ui:25 msgid "Options" msgstr "オプション" #: src/ui/gui/t-test.ui:63 msgid "Exclude cases _analysis by analysis" msgstr "分析ごとに除外(_a)" #: src/ui/gui/t-test.ui:148 msgid "One - Sample T Test" msgstr "1サンプルの t 検定" #: src/ui/gui/t-test.ui:265 msgid "Test _Value: " msgstr "検定値(_V):" #: src/ui/gui/text-data-import.ui:32 msgid "Select the first line of the data file that contains data." msgstr "データが含まれているデータファイルの最初の行を選択して下さい." #: src/ui/gui/text-data-import.ui:54 msgid "Line above selected line contains variable names" msgstr "選択された行より上の行には変数名が含まれています." #: src/ui/gui/text-data-import.ui:80 msgid "" "Check the data formats displayed below and fix any that are incorrect. You " "may set other variable properties now or later." msgstr "" "次に表示されるデータ形式を確認し,間違っているものを修正して下さい.これで以" "降は他の変数のプロパティを設定することもできます." #: src/ui/gui/text-data-import.ui:121 msgid "Variables" msgstr "変数" #: src/ui/gui/text-data-import.ui:152 msgid "Data Preview" msgstr "データのプレビューAmount to Import" msgstr "読み込み量" #: src/ui/gui/text-data-import.ui:325 msgid "C_ustom" msgstr "カスタム(_u)" #: src/ui/gui/text-data-import.ui:341 msgid "Slas_h (/)" msgstr "スラッシュ'/'(_h)" #: src/ui/gui/text-data-import.ui:357 msgid "Semicolo_n (;)" msgstr "セミコロン';'(_n)" #: src/ui/gui/text-data-import.ui:373 msgid "P_ipe (|)" msgstr "パイプ'|'(_i)" #: src/ui/gui/text-data-import.ui:389 msgid "H_yphen (-)" msgstr "ハイフン'-'(_y)" #: src/ui/gui/text-data-import.ui:405 msgid "Co_mma (,)" msgstr "コンマ','(_m)" #: src/ui/gui/text-data-import.ui:421 msgid "_Colon (:)" msgstr "コロン':'(_C)" #: src/ui/gui/text-data-import.ui:437 msgid "Ban_g (!)" msgstr "感嘆符'!'(_g)" #: src/ui/gui/text-data-import.ui:453 msgid "Ta_b" msgstr "タブ(_b)" #: src/ui/gui/text-data-import.ui:469 msgid "_Space" msgstr "スペース' '(_S)" #: src/ui/gui/text-data-import.ui:490 msgid "Separators" msgstr "分割記号" #: src/ui/gui/text-data-import.ui:541 msgid "Quote separator characters with" msgstr "引用区切り文字" #: src/ui/gui/text-data-import.ui:561 msgid "Quoting" msgstr "引用" #: src/ui/gui/text-data-import.ui:599 msgid "Fields Preview" msgstr "フィールドのプレビュー" #: src/ui/gui/text-data-import.ui:622 msgid "" "Enter below the sheet number and the cell range which you wish to import." msgstr "読み込みたいシート数とセル範囲を下に入力して下さい." #: src/ui/gui/text-data-import.ui:670 msgid "_Cells: " msgstr "セル(_C):" #: src/ui/gui/text-data-import.ui:684 msgid "_Sheet Index: " msgstr "シート番号(_S):" #: src/ui/gui/text-data-import.ui:695 msgid "Use first row as _variable names" msgstr "フィルター変数の使用(_v)" #: src/ui/gui/text-data-import.ui:717 msgid "Cells to Import" msgstr "読み込むセル" #: src/ui/gui/transpose.ui:24 msgid "Transpose" msgstr "行と列の入れ換え" #: src/ui/gui/transpose.ui:91 msgid "Name Variable:" msgstr "名前変数:" #: src/ui/gui/transpose.ui:127 msgid "Variable(s):" msgstr "変数:" #: src/ui/gui/univariate.ui:25 msgid "Univariate: Save" msgstr "単変量: 保存" #: src/ui/gui/univariate.ui:103 msgid "Univariate: Statistics" msgstr "一変量: 統計" #: src/ui/gui/univariate.ui:178 msgid "Univariate" msgstr "一変量" #: src/ui/gui/univariate.ui:281 msgid "_Dependent Variable" msgstr "従属変数(_D)" #: src/ui/gui/univariate.ui:329 msgid "_Fixed Factors" msgstr "固定因子(_F)" #: src/ui/gui/val-labs-dialog.ui:101 msgid "Value Label:" msgstr "値ラベル:" #: src/ui/gui/data-editor.ui:33 msgid "Information Area" msgstr "情報エリア" #: src/ui/gui/data-editor.ui:55 msgid "Case Counter Area" msgstr "ケース数エリア" #: src/ui/gui/data-editor.ui:80 msgid "Filter Use Status Area" msgstr "フィルタ使用状態エリア" #: src/ui/gui/data-editor.ui:106 msgid "Weight Status Area" msgstr "重み付け状態エリア" #: src/ui/gui/data-editor.ui:132 msgid "Split File Status Area" msgstr "分割ファイル状態エリア" #: src/ui/gui/data-editor.ui:154 msgid "_View" msgstr "表示(_V)" #: src/ui/gui/data-editor.ui:157 msgid "_Status Bar" msgstr "ステータスバー(_S)" #: src/ui/gui/data-editor.ui:163 msgid "_Font..." msgstr "フォント(_F) ..." #: src/ui/gui/data-editor.ui:167 msgid "_Grid Lines" msgstr "格子線(_G)" #: src/ui/gui/data-editor.ui:171 msgid "Value _Labels" msgstr "値ラベル(_L)" #: src/ui/gui/data-editor.ui:182 msgid "_Variables" msgstr "変数(_V)" #: src/ui/gui/data-editor.ui:192 msgid "_Sort Cases..." msgstr "ケースの並び替え(_S) ..." #: src/ui/gui/data-editor.ui:196 msgid "_Transpose..." msgstr "行と列の入れ換え(_T) ..." #: src/ui/gui/data-editor.ui:200 msgid "_Aggregate..." msgstr "データのグループ集計(_A) ..." #: src/ui/gui/data-editor.ui:206 msgid "S_plit File..." msgstr "ファイルの分割(_p) ..." #: src/ui/gui/data-editor.ui:210 msgid "Select _Cases..." msgstr "ケースの選択(_C) ..." #: src/ui/gui/data-editor.ui:214 msgid "_Weight Cases..." msgstr "ケースの重み付け(_W) ..." #: src/ui/gui/data-editor.ui:220 msgid "_Transform" msgstr "変換(_T)" #: src/ui/gui/data-editor.ui:223 msgid "_Compute..." msgstr "変数の計算(_C) ..." #: src/ui/gui/data-editor.ui:227 msgid "Cou_nt..." msgstr "カウント(_n) ..." #: src/ui/gui/data-editor.ui:231 msgid "Ran_k Cases..." msgstr "ケースのランク付け(_k) ..." #: src/ui/gui/data-editor.ui:235 msgid "Auto_matic Recode..." msgstr "連続数への再割り当て_m) ..." #: src/ui/gui/data-editor.ui:241 msgid "Recode into _Same Variables..." msgstr "同一の変数への値の再割り当て(_S) ..." #: src/ui/gui/data-editor.ui:245 msgid "Recode into _Different Variables..." msgstr "他の変数への値の再割り当て(_D) ..." #: src/ui/gui/data-editor.ui:251 msgid "_Run Pending Transforms" msgstr "保留された変換の実行(_R)" #: src/ui/gui/data-editor.ui:257 msgid "_Analyze" msgstr "分析(_A)" #: src/ui/gui/data-editor.ui:260 msgid "_Descriptive Statistics" msgstr "記述統計量(_D)" #: src/ui/gui/data-editor.ui:262 msgid "_Frequencies..." msgstr "度数分布表(_F) ..." #: src/ui/gui/data-editor.ui:270 msgid "_Explore..." msgstr "探索的(_E) ..." #: src/ui/gui/data-editor.ui:274 msgid "_Crosstabs..." msgstr "クロス集計表(_C) ..." #: src/ui/gui/data-editor.ui:279 msgid "Compare _Means" msgstr "平均の比較(_M)" #: src/ui/gui/data-editor.ui:281 msgid "_Means..." msgstr "グループの平均(_M) ..." #: src/ui/gui/data-editor.ui:285 msgid "_One Sample T Test..." msgstr "1サンプルの t 検定(_O) ..." #: src/ui/gui/data-editor.ui:289 msgid "_Independent Samples T Test..." msgstr "独立したサンプルのt検定(_I) ..." #: src/ui/gui/data-editor.ui:293 msgid "_Paired Samples T Test..." msgstr "対応のあるサンプルの t 検定(_P) ..." #: src/ui/gui/data-editor.ui:297 msgid "One Way _ANOVA..." msgstr "一元配置分散分析(_A) ..." #: src/ui/gui/data-editor.ui:302 msgid "_Univariate Analysis..." msgstr "一変量分析(_U) ..." #: src/ui/gui/data-editor.ui:306 msgid "Bivariate _Correlation..." msgstr "2変量相関(_C) ..." #: src/ui/gui/data-editor.ui:310 msgid "_K-Means Cluster..." msgstr "K平均法クラスタ分析(_K) ..." #: src/ui/gui/data-editor.ui:314 #, fuzzy #| msgid "Factor _Analysis..." msgid "_Factor Analysis..." msgstr "因子分析(_A) ..." #: src/ui/gui/data-editor.ui:318 msgid "Re_liability..." msgstr "信頼性(_l) ..." #: src/ui/gui/data-editor.ui:322 msgid "_Regression" msgstr "回帰(_R)" #: src/ui/gui/data-editor.ui:325 msgid "_Linear..." msgstr "線形(_L) ..." #: src/ui/gui/data-editor.ui:329 msgid "_Binary Logistic..." msgstr "2項ロジスティック回帰(_B) ..." #: src/ui/gui/data-editor.ui:335 msgid "_Non-Parametric Statistics" msgstr "ノンパラメトリック検定(_N)" #: src/ui/gui/data-editor.ui:338 #, fuzzy #| msgid "_Chi-Square..." msgid "_Chi Square..." msgstr "カイ2乗(_C) ..." #: src/ui/gui/data-editor.ui:342 msgid "_Binomial..." msgstr "2項(_B) ..." #: src/ui/gui/data-editor.ui:346 #, fuzzy #| msgid "R_uns..." msgid "_Runs..." msgstr "ラン(_U) ..." #: src/ui/gui/data-editor.ui:350 #, fuzzy #| msgid "1-Sample _K-S..." msgid "_1 Sample K-S..." msgstr "1サンプルによるK-S検定(_K) ..." #: src/ui/gui/data-editor.ui:354 #, fuzzy #| msgid "2 _Related Samples..." msgid "_2 Related Samples..." msgstr "2個の対応サンプルの検定(_R) ..." #: src/ui/gui/data-editor.ui:358 #, fuzzy #| msgid "K Related _Samples..." msgid "_K Related Samples..." msgstr "K個の対応サンプルの検定(_S) ..." #: src/ui/gui/data-editor.ui:362 #, fuzzy #| msgid "_Independent Samples T Test..." msgid "K _Independent Samples..." msgstr "独立したサンプルのt検定(_I) ..." #: src/ui/gui/data-editor.ui:368 msgid "ROC Cur_ve..." msgstr "ROC 曲線(_V) ..." #: src/ui/gui/data-editor.ui:374 msgid "_Graphs" msgstr "グラフ(_G)" #: src/ui/gui/data-editor.ui:377 msgid "_Scatterplot" msgstr "散布図(_S)" #: src/ui/gui/data-editor.ui:381 msgid "_Histogram" msgstr "ヒストグラムの描画(_H)" #: src/ui/gui/data-editor.ui:385 msgid "_Barchart" msgstr "バーチャート(_B)" #: src/ui/gui/data-editor.ui:391 msgid "_Utilities" msgstr "ユーティリティ(_U)" #: src/ui/gui/data-editor.ui:394 msgid "_Variables..." msgstr "変数(_V) ..." #: src/ui/gui/data-editor.ui:398 msgid "Data File _Comments..." msgstr "データファイルのコメント(_C) ..." #: src/ui/gui/output-window.ui:71 msgid "_Print..." msgstr "印刷(_P) ..." #: src/ui/gui/output-window.ui:76 msgid "_Export..." msgstr "書き出し(_E) ..." #: src/ui/gui/output-window.ui:92 msgid "Select _All" msgstr "すべてを選択(_A)" #: src/ui/gui/syntax-editor.ui:27 #, fuzzy #| msgid "_Syntax" msgid "Syntax" msgstr "シンタックス(_S)" #: src/ui/gui/syntax-editor.ui:31 #, fuzzy #| msgid "_Data" msgid "Data" msgstr "データ(_D)" #: src/ui/gui/syntax-editor.ui:41 msgid "_Save" msgstr "上書き保存" #: src/ui/gui/syntax-editor.ui:46 #, fuzzy #| msgid "Save _As..." msgid "Save _As" msgstr "名前を付けて保存(_A) ..." #: src/ui/gui/syntax-editor.ui:53 #, fuzzy #| msgid "_Print..." msgid "_Print" msgstr "印刷(_P) ..." #: src/ui/gui/syntax-editor.ui:84 #, fuzzy #| msgid "Delete" msgid "_Delete" msgstr "削除" #: src/ui/gui/syntax-editor.ui:90 msgid "_Undo" msgstr "" #: src/ui/gui/syntax-editor.ui:94 msgid "_Redo" msgstr "" #: src/ui/gui/syntax-editor.ui:100 #, fuzzy #| msgid "Find" msgid "_Find" msgstr "検索" #: src/ui/gui/syntax-editor.ui:106 msgid "_Run" msgstr "実行(_R)" #: src/ui/gui/syntax-editor.ui:109 msgid "_All" msgstr "" #: src/ui/gui/syntax-editor.ui:113 #, fuzzy #| msgid "Selection" msgid "_Selection" msgstr "選択" #: src/ui/gui/syntax-editor.ui:117 #, fuzzy #| msgid "Current Line" msgid "_Current Line" msgstr "現在行" #: src/ui/gui/syntax-editor.ui:122 #, fuzzy #| msgid "To End" msgid "_To End" msgstr "最終行へ" #: src/ui/gui/var-type-dialog.ui:99 msgid "Scientific notation" msgstr "科学的表記法" #: src/ui/gui/var-type-dialog.ui:150 msgid "Custom currency" msgstr "カスタム通貨" #: src/ui/gui/var-type-dialog.ui:267 msgid "positive" msgstr "正" #: src/ui/gui/var-type-dialog.ui:279 msgid "negative" msgstr "負" #: src/ui/gui/var-type-dialog.ui:293 msgid "Sample" msgstr "標本" #: src/ui/gui/var-type-dialog.ui:350 msgid "Width:" msgstr "横幅:" #: src/ui/gui/var-type-dialog.ui:396 msgid "Decimal Places:" msgstr "小数点位置:" #: src/ui/gui/weight.ui:24 msgid "Weight Cases" msgstr "ケースの重み付け" #: src/ui/gui/weight.ui:100 msgid "Weight cases by" msgstr "ケースの重み付け" #: src/ui/gui/weight.ui:144 msgid "Frequency Variable" msgstr "度数変数" #: src/ui/gui/weight.ui:198 msgid "Current Status: " msgstr "現在の状態:" #. TRANSLATORS: This is the application name in the desktop file #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:7 #: src/ui/gui/org.fsf.pspp.desktop.in:7 msgid "GNU PSPP" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:8 #, fuzzy #| msgid "A program for the analysis of sampled data" msgid "GNU PSPP is a program for statistical analysis of sampled data" msgstr "標本抽出によるデータの分析プログラム" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:10 msgid "" "GNU PSPP is a program for the statistical analysis of sampled data. It is a " "Free replacement for the proprietary program SPSS, and appears very similar " "to it with a few exceptions. The most important of these exceptions are, " "that there are no “time bombs”; your copy of PSPP will not “expire” or " "deliberately stop working in the future. Neither are there any artificial " "limits on the number of cases or variables which you can use. There are no " "additional packages to purchase in order to get “advanced” functions; all " "functionality that PSPP currently supports is in the core package." msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:11 msgid "" "PSPP is a stable and reliable application. It can perform descriptive " "statistics, T-tests, anova, linear and logistic regression, measures of " "association, cluster analysis, reliability and factor analysis, non-" "parametric tests and more. Its backend is designed to perform its analyses " "as fast as possible, regardless of the size of the input data. You can use " "PSPP with its graphical interface or the more traditional syntax commands." msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:12 msgid "A brief list of some of the PSPP's features." msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:14 msgid "Support for over 1 billion cases" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:15 msgid "Support for over 1 billion variables" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:16 msgid "Syntax and data files which are compatible with those of SPSS" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:17 msgid "A choice of terminal or graphical user interface" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:18 msgid "A choice of text, postscript, pdf, opendocument or html output formats" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:19 msgid "" "Inter-operability with: LibreOffice, Apache OpenOffice, Gnumeric and other " "free software" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:20 msgid "Easy data import from spreadsheets, text files and database sources" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:21 msgid "" "The capability to open, analyse and edit two or more datasets concurrently" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:22 msgid "A user interface supporting all common character sets" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:23 msgid "A user interface has been translated to multiple languages" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:24 msgid "Very fast statistical procedures, even on very large data sets" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:25 msgid "No license fees and no expiration period" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:26 msgid "No unethical “end user license agreements”" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:27 msgid "A fully indexed user manual" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:28 msgid "Freedom ensured; It is licensed under the GPLv3 or later" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:29 msgid "" "Portability; Runs on many different computers and many different operating " "systems" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:31 msgid "" "PSPP is particularly aimed at statisticians, social scientists and students " "requiring fast convenient analysis of sampled data." msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:41 #, fuzzy #| msgid "Variable View" msgid "GNU PSPP Variable View" msgstr "変数ビュー" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:54 msgid "Free Software Foundation" msgstr "" #: src/ui/gui/org.fsf.pspp.desktop.in:8 msgid "Statistical Software" msgstr "統計ソフトウェア" #: src/ui/gui/org.fsf.pspp.desktop.in:9 msgid "Analyze statistical data with a free alternative to SPSS" msgstr "フリーな SPSS 代替ソフトウェアによる統計データ分析" #. TRANSLATORS: Do not translate this string. Keep it as is, verbatim. #: src/ui/gui/org.fsf.pspp.desktop.in:12 msgid "pspp" msgstr "" #. TRANSLATORS: You must keep all ";" - also at the end of line. #: src/ui/gui/org.fsf.pspp.desktop.in:17 msgid "statistics;analysis;spss;" msgstr "" #~ msgid "Sorry. The help system hasn't yet been implemented." #~ msgstr "ヘルプシステムはまだ実装されていません." #~ msgid "Support for %s files was not compiled into this installation of PSPP" #~ msgstr "%s ファイルのサポートはこの版の PSPP には含まれていません." #~ msgid "Multiple response set name `%s' does not begin with `$'." #~ msgstr "`%s' という名前の多重回答セットは `$' で始まっていません." #~ msgid "Details" #~ msgstr "詳細" #~ msgid "Multiple dichotomy set" #~ msgstr "多重二分法セット" #~ msgid "Multiple category set" #~ msgstr "多重カテゴリセット" #~ msgid "Label source" #~ msgstr "ラベルソース" #~ msgid "First variable label among variables" #~ msgstr "変数中の最初の変数ラベル" #~ msgid "Provided by user" #~ msgstr "ユーザ指定" #~ msgid "Category label source" #~ msgstr "分類ラベルソース" #~ msgid "Variable labels" #~ msgstr "変数ラベル" #~ msgid "Value labels of counted value" #~ msgstr "計数値の値ラベル" #~ msgid "Label:" #~ msgstr "ラベル(_L):" #~ msgid "No label." #~ msgstr "ラベルなし" #~ msgid "Product:" #~ msgstr "プロダクト:" #~ msgid "Variables:" #~ msgstr "変数:" #~ msgid "Cases:" #~ msgstr "ケース:" #~ msgid "Type:" #~ msgstr "タイプ:" #~ msgid "Description" #~ msgstr "記述" #~ msgid "The active dataset does not have a file label." #~ msgstr "アクティブなデータセットにはファイルラベルがありません." #~ msgid "File label: %s" #~ msgstr "ファイルラベル: %s" #~ msgid "The active dataset dictionary does not contain any documents." #~ msgstr "" #~ "アクティブなデータセットのディクショナリにはドキュメントが含まれていませ" #~ "ん." #~ msgid "Documents in the active dataset:" #~ msgstr "アクティブなデータセット中のドキュメント:" #~ msgid "Custom data file attributes." #~ msgstr "カスタムデータのファイル属性" #~ msgid "Label: %s\n" #~ msgstr "ラベル: %s\n" #~ msgid "Format: %s\n" #~ msgstr "フォーマット: %s\n" #~ msgid "Print Format: %s\n" #~ msgstr "印刷フォーマット: %s\n" #~ msgid "Write Format: %s\n" #~ msgstr "書き出しフォーマット: %s\n" #~ msgid "Measure: %s\n" #~ msgstr "測度: %s\n" #~ msgid "Role: %s\n" #~ msgstr "ロール: %s\n" #~ msgid "Display Alignment: %s\n" #~ msgstr "表示配置: %s\n" #~ msgid "Display Width: %d\n" #~ msgstr "表示横幅: %d\n" #~ msgid "Missing Values: " #~ msgstr "欠損値:" #~ msgid "Interactive shell not supported on this platform." #~ msgstr "このOSでは対話型シェルはサポートされていません." #~ msgid "Error executing command: %s." #~ msgstr "実行コマンドのエラー: %s." #~ msgid "Unknown TABLECELLS class" #~ msgstr "不明な TABLECELLS クラス" #~ msgid "Exact Sig. (%d-tailed)" #~ msgstr "正確有意水準(%d-tailed検定)" #~ msgid "Valid N" #~ msgstr "有効データ数" #~ msgid "Missing N" #~ msgstr "欠損値数" #~ msgid "Valid cases = %.*g; cases with missing value(s) = %.*g." #~ msgstr "有効ケース = %.*g; 欠損値を含むケース =%.*g." #~ msgid "%g" #~ msgstr "%g" #~ msgid "%d" #~ msgstr "%d" #~ msgid "%zu" #~ msgstr "%zu" #~ msgid "50 (Median)" #~ msgstr "50(中央値)" #~ msgid "(%d)" #~ msgstr "(%d)" #~ msgid "Min" #~ msgstr "最小値" #~ msgid "Max" #~ msgstr "最大値" #~ msgid "%g%%" #~ msgstr "%g%%" #~ msgid "25th" #~ msgstr "下 25% 分位" #~ msgid "50th (Median)" #~ msgstr "下 50% 分位(中央値)" #~ msgid "75th" #~ msgstr "下 75% 分位" #~ msgid "(I) %s" #~ msgstr "( I ) %s" #~ msgid "(J) %s" #~ msgstr "( J ) %s" #~ msgid "(I - J)" #~ msgstr "( I - J )" #~ msgid "%s into %s(%s of %s using %s BY %s)" #~ msgstr "%s は %sへ(%s of %s using %s BY %s)" #~ msgid "%s into %s(%s of %s BY %s)" #~ msgstr "%s は %s へ(%s / %s BY %s)" #~ msgid "%s into %s(%s of %s using %s)" #~ msgstr "%s は %s へ(%s of %s using %s)" #~ msgid "%s into %s(%s of %s)" #~ msgstr "%s は %s へ(%s of %s)" #~ msgid "Area Under the Curve (%s)" #~ msgstr "曲線以下のエリア (%s)" #~ msgid "Coordinates of the Curve (%s)" #~ msgstr "曲線の座標(%s)" #~ msgid "Std. Error Mean" #~ msgstr "標準誤差の平均" #~ msgid "(active dataset)" #~ msgstr "(アクティブなデータセット)" #~ msgid "Writing %zu record to %s." #~ msgid_plural "Writing %zu records to %s." #~ msgstr[0] "%zu レコードを %s に書き込み中." #~ msgid "Writing %zu record." #~ msgid_plural "Writing %zu records." #~ msgstr[0] "%zu レコードを書き込み中." #~ msgid "Unsupported compression type (%d)" #~ msgstr "サポートされていない圧縮形式(%d)" #~ msgid "Failed to seek to end of central directory record: %s" #~ msgstr "中心ディレクトリレコードの終端を探索中にエラー: %s" #~ msgid "Failed to seek to central directory: %s" #~ msgstr "中心ディレクトリの探索中にエラー: %s" #~ msgid "Failed to seek to start of member `%s': %s" #~ msgstr "開始番号 `%s' の探索中にエラー: %s" #~ msgid "ascii: closing output file `%s'" #~ msgstr "ASCII: 出力ファイル `%s' 閉じています." #~ msgid "%s - Page %d" #~ msgstr "%s - ページ %d" #~ msgid "bad vline: x=%d+%d=%d y=(%d+%d=%d,%d+%d=%d) in table size (%d,%d)\n" #~ msgstr "" #~ "誤った VLINE: x=%d+%d=%d, y=(%d+%d=%d, %d+%d=%d).表のサイズは(%d, %d)\n" #~ msgid "bad hline: x=(%d+%d=%d,%d+%d=%d) y=%d+%d=%d in table size (%d,%d)\n" #~ msgstr "" #~ "誤ったHLINE: x=(%d+%d=%d, %d+%d=%d), y=%d+%d=%d.表のサイズは(%d, %d)\n" #~ msgid "" #~ "bad box: (%d+%d=%d,%d+%d=%d)-(%d+%d=%d,%d+%d=%d) in table size (%d,%d)\n" #~ msgstr "" #~ "誤ったBOX: (%d+%d=%d, %d+%d=%d) - (%d+%d=%d, %d+%d=%d).表のサイズは(%d, " #~ "%d)\n" #~ msgid "could not access definition for terminal `%s'" #~ msgstr "目的の端末 `%s' にアクセスできません." #~ msgid "Cannot parse field content `%.*s' as format %s: %s" #~ msgstr "フィールドの内容 `%.*s' をフォーマット %s として解析できません: %s" #~ msgid "This input line has too few separators to fill in this field." #~ msgstr "入力行の区切り記号は少なすぎてこのフィールドを埋め切れません." #~ msgid "An error occurred reading the spreadsheet file." #~ msgstr "表計算ファイルの読み込み中にエラーが発生しました." #~ msgid "" #~ "PSPPIRE, a GUI for PSPP, a program for statistical analysis of sampled " #~ "data.\n" #~ "Usage: %s [OPTION]... FILE\n" #~ "\n" #~ "Arguments to long options also apply to equivalent short options.\n" #~ "\n" #~ "GUI options:\n" #~ " -q, --no-splash don't show splash screen during startup\n" #~ "\n" #~ "%sLanguage options:\n" #~ " -I, --include=DIR append DIR to search path\n" #~ " -I-, --no-include clear search path\n" #~ " -a, --algorithm={compatible|enhanced}\n" #~ " set to `compatible' if you want output\n" #~ " calculated from broken algorithms\n" #~ " -x, --syntax={compatible|enhanced}\n" #~ " set to `compatible' to disable PSPP " #~ "extensions\n" #~ " -i, --interactive interpret syntax in interactive mode\n" #~ " -s, --safer don't allow some unsafe operations\n" #~ "Default search path: %s\n" #~ "\n" #~ "Informative output:\n" #~ " -h, --help display this help and exit\n" #~ " -V, --version output version information and exit\n" #~ "\n" #~ "A non-option argument is interpreted as a data file in .sav or .zsav or ." #~ "por\n" #~ "format or a syntax file to load.\n" #~ msgstr "" #~ "PSPPIRE, a GUI for PSPP, a program for statistical analysis of sample " #~ "data.\n" #~ "PSPPIRE,GUI の PSPP,標本データのための統計分析プログラム.\n" #~ "使い方: %s [OPTION]... FILE\n" #~ "\n" #~ "Arguments to long options also apply to equivalent short options.\n" #~ "長い形式のオプションの引数は短い形式にもできます.\n" #~ "\n" #~ "GUIオプション:\n" #~ " -q, --no-splash don't show splash screen during startup\n" #~ "\n" #~ "%s 言語オプション:\n" #~ " -I, --include=DIR append DIR to search path\n" #~ " -I-, --no-include clear search path\n" #~ " -a, --algorithm={compatible|enhanced}\n" #~ " set to `compatible' if you want output\n" #~ " calculated from broken algorithms\n" #~ " -x, --syntax={compatible|enhanced}\n" #~ " set to `compatible' to disable PSPP " #~ "extensions\n" #~ " -i, --interactive interpret syntax in interactive mode\n" #~ " -s, --safer don't allow some unsafe operations\n" #~ "Default search path: %s\n" #~ "\n" #~ "情報出力:\n" #~ " -h, --help display this help and exit\n" #~ " -V, --version output version information and exit\n" #~ "\n" #~ "オプションの非引数は読み込むべき .sav ファイルか .por ファイル,シンタック" #~ "スファイルと解釈されます.\n" #~ msgid "_Reset" #~ msgstr "戻す(_R)" #~ msgid "_Select" #~ msgstr "選択(_S)" #~ msgid "Enter a number to add a new variable." #~ msgstr "新しく追加する変数の数を入力して下さい." #~ msgid "Enter a number to add a new case." #~ msgstr "新しく追加するケースの数を入力して下さい." #~ msgid "Cannot create variable." #~ msgstr "集計変数" #~ msgid "\"%s\" is not a valid variable name." #~ msgstr "\"%s\" は有効な変数名ではありません." #~ msgid "This dictionary already contains a variable named \"%s\"." #~ msgstr "このディクショナリにはすでに変数名 \"%s\" が含まれています." #~ msgid "Cannot rename variable." #~ msgstr "変数の計算" #~ msgid "Enter a variable name to add a new variable." #~ msgstr "新しい変数を追加するための新しい変数名を入力して下さい." #~ msgid "{%s, %s}\n" #~ msgstr "{%s, %s}\n" #~ msgid "can only convert encrypted data file to sav or sys format" #~ msgstr "暗号化されたデータファイルは sav か sys フォーマットにのみ変換可能" #~ msgid "can only convert encrypted syntax file to sps format" #~ msgstr "暗号化されたシンタックスファイルは sps フォーマットにのみ変換可能" #~ msgid "count" #~ msgstr "計数" #~ msgid "expected" #~ msgstr "期待" #~ msgid "residual" #~ msgstr "残差" #~ msgid "std. resid." #~ msgstr "標準化残差" #~ msgid "adj. resid." #~ msgstr "調整済み残差" #~ msgid "Chi-square tests." #~ msgstr "カイ2乗検定" #~ msgid "Odds Ratio for %s (%.*s / %.*s)" #~ msgstr "%s (%.*s / %.*s) のためのオッズ比" #~ msgid "For cohort %s = %.*g" #~ msgstr "コホート %s = %.*g" #~ msgid "For cohort %s = %.*s" #~ msgstr "コホート %s = %.*s" #~ msgid "Delete the variables at the selected position(s)" #~ msgstr "選択された場所にある変数の削除" #~ msgid "Delete the cases at the selected position(s)" #~ msgstr "選択された場所にあるケースの削除" #~ msgid "_Open..." #~ msgstr "開く(_O) ..." #~ msgid "Transpose the cases with the variables" #~ msgstr "変数によるケースの置き換え" #~ msgid "Aggregate the case values into a new variable" #~ msgstr "ケース値の集計を新しい変数への代入変数" #~ msgid "Choose a subset of cases for analysis" #~ msgstr "分析対象となるケースを選択" #~ msgid "All" #~ msgstr "すべて" #~ msgid "expecting number or data string" #~ msgstr "数値またはデータの文字列が必要です." #~ msgid "Label: %s" #~ msgstr "ラベル: %s" #~ msgid "Number of clusters may not be larger than the number of cases." #~ msgstr "クラスタ数はケース数よりも大きくてはいけません." #~ msgid "TreeView path" #~ msgstr "系統樹パス" #~ msgid "The path to the row in the GtkTreeView, as a string" #~ msgstr "GtkTreeViewにおける特定行へのパス(文字列)" #~ msgid "Diagonal slash" #~ msgstr "対角スラッシュ" #~ msgid "Whether to draw a diagonal slash across the button." #~ msgstr "下へ向かっての対角斜線を描画" #~ msgid "Incorrect value for variable type" #~ msgstr "変数タイプに対して不正な値" #~ msgid "Font Selection" #~ msgstr "フォント選択" #~ msgid "Type: %s\n" #~ msgstr "種類: %s\n" #~ msgid "Missing Values: %s\n" #~ msgstr "欠損値: %s\n" #~ msgid "Value Labels:\n" #~ msgstr "値ラベル:\n" #~ msgid "%s %s\n" #~ msgstr "%s %s\n" #~ msgid "Import Delimited Text Data" #~ msgstr "区切られたテキストデータの読み込み" #~ msgid "Bar charts are not implemented." #~ msgstr "棒グラフは実装されていません." #~ msgid "Variables %s specified multiple times on %s subcommand." #~ msgstr "変数 %s は %s サブコマンドで重複指定されている." #~ msgid "Variables %s specified on %s but not on %s." #~ msgstr "変数 %s(%s 内で指定)は %s 内にはありません." #~ msgid "No valid data for variable %s; statistics not displayed." #~ msgstr "変数 %s には有効なデータがありません; 分析結果は表示されません." #~ msgid "(optional case selection condition)" #~ msgstr "(オプションのケース選択状態)" #~ msgid "Importing Textual Data" #~ msgstr "元データの読み込み" #~ msgid "Doubled quote mark treated as escape" #~ msgstr "2重引用符はエスケープとみなされます." #~ msgid "Weighting variable must be numeric (not string variable `%s')." #~ msgstr "重み付け変数は数値型でなければなりません(文字列型変数 %s は無効.)" #~ msgid "Duplicate variable name `%s'." #~ msgstr "重複した変数名 `%s'." #~ msgid "`%s' does not begin with `$' at offset %zu in MRSETS record." #~ msgstr "%s はMRSETSレコードにおいてオフセット %zu は`$'で始まっていません." #~ msgid "Duplicate variable name %s at offset %zu in MRSETS record." #~ msgstr "MRSETSレコードの変数名 %s(オフセット %zu)は重複しています." #~ msgid "Truncating variable label for variable `%s' to %d bytes." #~ msgstr "変数 `%s' の変数ラベルは %d バイトに短縮されました." #~ msgid "%s is allowed only inside INPUT PROGRAM." #~ msgstr "%s はINPUT PROGRAMの内側でしか使えません." #~ msgid "%s is allowed only inside FILE TYPE." #~ msgstr "%s は FILE TYPEの内側でしか使えません." #~ msgid "" #~ "DELETE VARIABLES may not be used after TEMPORARY. Temporary " #~ "transformations will be made permanent." #~ msgstr "" #~ "DELETE VARIABLESをTEMPORARYの後で使用することはできません.一時的な変換が" #~ "確定されます." #~ msgid "" #~ "DROP subcommand may be given at most once. It may not be given in " #~ "conjunction with the KEEP subcommand." #~ msgstr "" #~ "DROPサブコマンドは1度だけ使用できます.またKEEPサブコマンドと一緒には使え" #~ "ません." #~ msgid "" #~ "RENAME VARS may not be used after TEMPORARY. Temporary transformations " #~ "will be made permanent." #~ msgstr "" #~ "RENAME VARSはTEMPORARYの後で使用することはできません.一時的な変換が確定さ" #~ "れます." #~ msgid "Charset:" #~ msgstr "文字セット:" #~ msgid "Expecting MEAN, MEDIAN, MODE or number" #~ msgstr "平均または中央値、最頻値、数値のどれかが必要です." #~ msgid "Value of FIXCASE must be at least 1." #~ msgstr "FIXCASEの値は少なくとも1です." #~ msgid "Value of FIRST must be at least 1." #~ msgstr "FIRSTの値は少なくても1です." #~ msgid "WORKSPACE must be at least 1MB" #~ msgstr "WORKSPACEは最小で1MBです." #~ msgid "expecting AUTOMATIC or year" #~ msgstr "AUTOMATICか年が必要です." #~ msgid "LENGTH must be at least 1." #~ msgstr "LENGTHは少なくとも1でなければなりません。" #~ msgid "WIDTH must be at least 40." #~ msgstr "WIDTHは少なくとも40です." #~ msgid "RESTORE without matching PRESERVE." #~ msgstr "RESTOREに対応するMATCHINGがありません." #~ msgid "Mode:" #~ msgstr "モード:" #~ msgid "on" #~ msgstr "オン" #~ msgid "off" #~ msgstr "オフ" #~ msgid "Error opening `%s' for reading as a Gnumeric file: %s." #~ msgstr "Error opening ‘%s’ for reading as a Gnumeric file: %s." #~ msgid "By:" #~ msgstr "グループ:" #~ msgid "Linear _Regression..." #~ msgstr "線形回帰(_R)..." #~ msgid "" #~ "Recoded variable name duplicates an existing `%s' within system file." #~ msgstr "" #~ "Recoded variable name duplicates an existing ‘%s’ within system file." #~ msgid "Duplicate variable name `%s' within system file." #~ msgstr "Duplicate variable name ‘%s’ within system file." #~ msgid "Reading `%s': %s." #~ msgstr "Reading ‘%s’: %s." #~ msgid "Closing `%s': %s." #~ msgstr "Closing ‘%s’: %s." #~ msgid "`(' expected after variable list." #~ msgstr "‘(’ expected after variable list." #~ msgid "`)' expected after output format." #~ msgstr "‘)’ expected after output format." #~ msgid "`(' expected on %s subcommand." #~ msgstr "‘(’ expected on %s subcommand." #~ msgid "`)' expected following variable names on REORDER subcommand." #~ msgstr "‘)’ expected following variable names on REORDER subcommand." #~ msgid "`)' expected after variable lists on RENAME subcommand." #~ msgstr "‘)’ expected after variable lists on RENAME subcommand." #~ msgid "`/' or `.' expected." #~ msgstr "‘/’ or ‘.’ expected." #~ msgid "`(' expected." #~ msgstr "‘(’ expected." #~ msgid "`=' expected between lists of new and old variable names." #~ msgstr "‘=’ expected between lists of new and old variable names." #~ msgid "Unexpected token: `%s'." #~ msgstr "Unexpected token: ‘%s’." #~ msgid "Unable to open `%s': %s." #~ msgstr "Unable to open ‘%s’: %s." #~ msgid "`A' or `D' expected inside parentheses." #~ msgstr "‘A’ or ‘D’ expected inside parentheses." #~ msgid "`)' expected." #~ msgstr "‘)’ expected." #~ msgid "`=' expected after variable list." #~ msgstr "‘=’ expected after variable list." #~ msgid "expecting `,' or `)' invoking %s function" #~ msgstr "expecting ‘,’ or ‘)’ invoking %s function" #~ msgid "Unrecognized record type 7, subtype %d." #~ msgstr "Unrecognised record type 7, subtype %d." #~ msgid "`)' expected after GROUPED interval list." #~ msgstr "‘)’ expected after GROUPED interval list." pspp-1.4.1/po/cs.po0000644000175000017500000067541713725012645013527 0ustar00blpblp00000000000000# Auxilliary translation of pspp to Czech # msgid "" msgstr "" "Project-Id-Version: pspp-0.7.9\n" "Report-Msgid-Bugs-To: pspp-dev@gnu.org\n" "PO-Revision-Date: 2011-07-20 21:10+0300\n" "Language: cs\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Lokalize 1.2\n" #: src/ui/gui/gen-dot-desktop.sh:12 msgid "Statistical Software" msgstr "Statistický program" #: src/ui/gui/gen-dot-desktop.sh:21 msgid "Analyze statistical data with a free alternative to SPSS" msgstr "Analyzuj statistická data se svobodnou variantou SPSS" #: src/data/any-reader.c:72 src/data/encrypted-file.c:78 #, c-format msgid "An error occurred while opening `%s': %s." msgstr "" #: src/data/any-reader.c:93 src/language/lexer/lexer.c:1633 #, c-format msgid "Error reading `%s': %s." msgstr "" #: src/data/any-reader.c:114 #, c-format msgid "`%s' is not a system or portable file." msgstr "" #: src/data/any-reader.c:123 src/data/any-writer.c:66 msgid "The inline file is not allowed here." msgstr "" #: src/data/any-reader.c:205 #, c-format msgid "" "Cannot read from dataset %s because no dictionary or data has been written " "to it yet." msgstr "" #: src/data/any-reader.c:260 src/language/data-io/dataset.c:253 msgid "Dataset" msgstr "" #: src/data/calendar.c:100 #, c-format msgid "Month %d is not in acceptable range of 0 to 13." msgstr "" #: src/data/calendar.c:110 #, c-format msgid "Day %d is not in acceptable range of 0 to 31." msgstr "" #: src/data/calendar.c:119 #, c-format msgid "Date %04d-%d-%d is before the earliest acceptable date of 1582-10-15." msgstr "" #: src/data/casereader-filter.c:221 msgid "" "At least one case in the data read had a weight value that was user-missing, " "system-missing, zero, or negative. These case(s) were ignored." msgstr "" #. TRANSLATORS: this fragment will be interpolated into messages in fh_lock() #. that identify types of files. #: src/data/csv-file-writer.c:138 msgid "CSV file" msgstr "" #: src/data/csv-file-writer.c:146 #, c-format msgid "Error opening `%s' for writing as a CSV file: %s." msgstr "" #: src/data/csv-file-writer.c:453 #, c-format msgid "An I/O error occurred writing CSV file `%s'." msgstr "" #: src/data/data-in.c:175 #, c-format msgid "Data is not valid as format %s: %s" msgstr "" #: src/data/data-in.c:377 src/data/data-in.c:553 msgid "Field contents are not numeric." msgstr "" #: src/data/data-in.c:379 src/data/data-in.c:555 msgid "Number followed by garbage." msgstr "" #: src/data/data-in.c:392 msgid "Invalid numeric syntax." msgstr "" #: src/data/data-in.c:400 src/data/data-in.c:571 msgid "Too-large number set to system-missing." msgstr "" #: src/data/data-in.c:406 src/data/data-in.c:577 msgid "Too-small number set to zero." msgstr "" #: src/data/data-in.c:426 msgid "All characters in field must be digits." msgstr "" #: src/data/data-in.c:445 msgid "Unrecognized character in field." msgstr "" #: src/data/data-in.c:466 src/data/data-in.c:729 msgid "Field must have even length." msgstr "" #: src/data/data-in.c:468 src/data/data-in.c:732 msgid "Field must contain only hex digits." msgstr "" #: src/data/data-in.c:544 msgid "Invalid zoned decimal syntax." msgstr "" #: src/data/data-in.c:644 src/data/data-in.c:650 msgid "Invalid syntax for P field." msgstr "" #: src/data/data-in.c:768 src/data/data-in.c:818 msgid "Syntax error in date field." msgstr "" #: src/data/data-in.c:783 #, c-format msgid "Day (%ld) must be between 1 and 31." msgstr "" #: src/data/data-in.c:832 msgid "Delimiter expected between fields in date." msgstr "" #: src/data/data-in.c:906 msgid "" "Unrecognized month format. Months may be specified as Arabic or Roman " "numerals or as at least 3 letters of their English names." msgstr "" #: src/data/data-in.c:933 #, c-format msgid "Year (%ld) must be between 1582 and 19999." msgstr "" #: src/data/data-in.c:944 #, c-format msgid "Trailing garbage `%.*s' following date." msgstr "" #: src/data/data-in.c:958 msgid "Julian day must have exactly three digits." msgstr "" #: src/data/data-in.c:960 #, c-format msgid "Julian day (%ld) must be between 1 and 366." msgstr "" #: src/data/data-in.c:984 #, c-format msgid "Quarter (%ld) must be between 1 and 4." msgstr "" #: src/data/data-in.c:1005 #, c-format msgid "Week (%ld) must be between 1 and 53." msgstr "" #: src/data/data-in.c:1017 msgid "Delimiter expected between fields in time." msgstr "" #: src/data/data-in.c:1037 #, c-format msgid "Minute (%ld) must be between 0 and 59." msgstr "" #: src/data/data-in.c:1075 msgid "" "Unrecognized weekday name. At least the first two letters of an English " "weekday name must be specified." msgstr "" #: src/data/data-in.c:1210 #, c-format msgid "`%c' expected in date field." msgstr "" #: src/data/data-out.c:580 #, c-format msgid "Weekday number %f is not between 1 and 7." msgstr "" #: src/data/data-out.c:605 #, c-format msgid "Month number %f is not between 1 and 12." msgstr "" #. TRANSLATORS: this fragment will be interpolated into #. messages in fh_lock() that identify types of files. #: src/data/dataset-writer.c:66 src/language/data-io/file-handle.c:304 msgid "dataset" msgstr "" #: src/data/dict-class.c:52 msgid "ordinary" msgstr "" #: src/data/dict-class.c:54 msgid "system" msgstr "" #: src/data/dict-class.c:56 msgid "scratch" msgstr "" #: src/data/dictionary.c:1523 #, c-format msgid "Truncating document line to %d bytes." msgstr "" #: src/data/encrypted-file.c:89 #, c-format msgid "An error occurred while reading `%s': %s." msgstr "" #: src/data/encrypted-file.c:430 #, c-format msgid "" "%s: encrypted file corrupted (ends in incomplete %u-byte ciphertext block)" msgstr "" #: src/data/encrypted-file.c:449 #, c-format msgid "%s: encrypted file corrupted (ends with bad padding)" msgstr "" #: src/data/file-handle-def.c:283 src/language/data-io/dataset.c:266 msgid "active dataset" msgstr "" #: src/data/file-handle-def.c:518 #, c-format msgid "Can't read from %s as a %s because it is already being read as a %s." msgstr "" #: src/data/file-handle-def.c:522 #, c-format msgid "Can't write to %s as a %s because it is already being written as a %s." msgstr "" #: src/data/file-handle-def.c:529 #, c-format msgid "Can't re-open %s as a %s." msgstr "" #: src/data/file-name.c:133 #, c-format msgid "Not opening pipe file `%s' because %s option set." msgstr "" #: src/data/format.c:339 msgid "Input format" msgstr "" #: src/data/format.c:339 msgid "Output format" msgstr "" #: src/data/format.c:342 #, c-format msgid "Format %s may not be used for input." msgstr "" #: src/data/format.c:349 #, c-format msgid "%s specifies width %d, but %s requires an even width." msgstr "" #: src/data/format.c:358 #, c-format msgid "%s %s specifies width %d, but %s requires a width between %d and %d." msgstr "" #: src/data/format.c:367 #, c-format msgid "%s %s specifies %d decimal place, but %s does not allow any decimals." msgid_plural "" "%s %s specifies %d decimal places, but %s does not allow any decimals." msgstr[0] "" msgstr[1] "" #: src/data/format.c:378 #, c-format msgid "" "%s %s specifies %d decimal place, but the given width allows at most %d " "decimals." msgid_plural "" "%s %s specifies %d decimal places, but the given width allows at most %d " "decimals." msgstr[0] "" msgstr[1] "" #: src/data/format.c:385 #, c-format msgid "" "%s %s specifies %d decimal place, but the given width does not allow for any " "decimals." msgid_plural "" "%s %s specifies %d decimal places, but the given width does not allow for " "any decimals." msgstr[0] "" msgstr[1] "" #: src/data/format.c:424 #, c-format msgid "%s variables are not compatible with %s format %s." msgstr "" #: src/data/format.c:425 src/data/format.c:1074 #: src/ui/gui/var-type-dialog.ui:167 msgid "String" msgstr "" #: src/data/format.c:425 src/data/format.c:1035 #: src/ui/gui/var-type-dialog.ui:48 msgid "Numeric" msgstr "" #: src/data/format.c:426 src/data/sys-file-reader.c:2212 #: src/data/sys-file-reader.c:2214 src/language/xforms/recode.c:512 #: src/language/xforms/recode.c:513 src/language/xforms/recode.c:525 #: src/language/xforms/recode.c:526 #: src/language/dictionary/apply-dictionary.c:77 #: src/language/dictionary/apply-dictionary.c:78 msgid "numeric" msgstr "" #: src/data/format.c:426 src/data/sys-file-reader.c:2212 #: src/data/sys-file-reader.c:2214 src/language/xforms/recode.c:512 #: src/language/xforms/recode.c:513 src/language/xforms/recode.c:525 #: src/language/xforms/recode.c:526 #: src/language/dictionary/apply-dictionary.c:77 #: src/language/dictionary/apply-dictionary.c:78 msgid "string" msgstr "" #: src/data/format.c:444 #, c-format msgid "String variable with width %d is not compatible with format %s." msgstr "" #: src/data/format.c:1038 src/ui/gui/var-type-dialog.ui:65 msgid "Comma" msgstr "" #: src/data/format.c:1041 src/ui/gui/var-type-dialog.ui:82 msgid "Dot" msgstr "" #: src/data/format.c:1044 msgid "Scientific" msgstr "" #: src/data/format.c:1061 src/ui/gui/var-type-dialog.ui:116 msgid "Date" msgstr "" #: src/data/format.c:1064 src/ui/gui/var-type-dialog.ui:133 msgid "Dollar" msgstr "" #: src/data/format.c:1071 msgid "Custom" msgstr "" #: src/data/gnumeric-reader.c:478 src/data/ods-reader.c:505 #, c-format msgid "Cannot convert the value in the spreadsheet cell %s to format (%s): %s" msgstr "" #: src/data/gnumeric-reader.c:502 src/data/ods-reader.c:567 #, c-format msgid "" "There was a problem whilst reading the %s file `%s' (near line %d): `%s'" msgstr "" #: src/data/gnumeric-reader.c:597 #, c-format msgid "" "The gnumeric file `%s' is encoded as %s instead of the usual UTF-8 encoding. " "Any non-ascii characters will be incorrectly imported." msgstr "" #: src/data/gnumeric-reader.c:641 src/data/ods-reader.c:682 #, c-format msgid "Invalid cell range `%s'" msgstr "" #: src/data/gnumeric-reader.c:813 src/data/ods-reader.c:710 #: src/data/ods-reader.c:843 #, c-format msgid "Selected sheet or range of spreadsheet `%s' is empty." msgstr "" #: src/data/identifier2.c:60 #, c-format msgid "Identifier `%s' exceeds %d-byte limit." msgstr "" #: src/data/identifier2.c:84 msgid "Identifier cannot be empty string." msgstr "" #: src/data/identifier2.c:92 #, c-format msgid "`%s' may not be used as an identifier because it is a reserved word." msgstr "" #: src/data/identifier2.c:103 #, c-format msgid "" "`%s' may not be used as an identifier because it contains ill-formed UTF-8 " "at byte offset %tu." msgstr "" #: src/data/identifier2.c:114 #, c-format msgid "" "Character %s (in `%s') may not appear as the first character in a identifier." msgstr "" #: src/data/identifier2.c:126 #, c-format msgid "Character %s (in `%s') may not appear in an identifier." msgstr "" #: src/data/mdd-writer.c:241 #, c-format msgid "An I/O error occurred writing metadata file `%s'." msgstr "" #. TRANSLATORS: this fragment will be interpolated into #. messages in fh_lock() that identify types of files. #: src/data/mdd-writer.c:457 msgid "metadata file" msgstr "" #: src/data/mdd-writer.c:465 #, c-format msgid "Error opening `%s' for writing as a metadata file: %s." msgstr "" #: src/data/mdd-writer.c:473 #, c-format msgid "Internal error creating xmlTextWriter. Please report this to %s." msgstr "" #: src/data/make-file.c:217 #, c-format msgid "Opening %s for writing: %s." msgstr "" #: src/data/make-file.c:228 #, c-format msgid "Opening stream for %s: %s." msgstr "" #: src/data/make-file.c:260 #, c-format msgid "Creating temporary file to replace %s: %s." msgstr "" #: src/data/make-file.c:277 #, c-format msgid "Creating temporary file %s: %s." msgstr "" #: src/data/make-file.c:289 #, c-format msgid "Opening stream for temporary file %s: %s." msgstr "" #: src/data/make-file.c:326 #, c-format msgid "Replacing %s by %s: %s." msgstr "" #: src/data/make-file.c:354 #, c-format msgid "Removing %s: %s." msgstr "" #: src/data/mrset.c:83 #, c-format msgid "" "%s is not a valid name for a multiple response set. Multiple response set " "names must begin with `$'." msgstr "" #: src/data/ods-reader.c:620 #, c-format msgid "Cannot open %s as a OpenDocument file: %s" msgstr "" #. TRANSLATORS: this fragment will be interpolated into #. messages in fh_lock() that identify types of files. #: src/data/pc+-file-reader.c:206 msgid "SPSS/PC+ system file" msgstr "" #: src/data/pc+-file-reader.c:215 #, c-format msgid "Error opening `%s' for reading as an SPSS/PC+ system file: %s." msgstr "" #: src/data/pc+-file-reader.c:224 src/data/sys-file-reader.c:3541 #, c-format msgid "%s: stat failed (%s)." msgstr "" #: src/data/pc+-file-reader.c:230 #, c-format msgid "%s: file too large." msgstr "" #: src/data/pc+-file-reader.c:257 #, c-format msgid "" "Directory entry is for a %u-byte record starting at offset %u but file is " "only %u bytes long." msgstr "" #: src/data/pc+-file-reader.c:275 #, c-format msgid "Directory fields have unexpected values (%u,%u)." msgstr "" #: src/data/pc+-file-reader.c:372 src/data/sys-file-reader.c:672 #, c-format msgid "Variable %zu" msgstr "" #: src/data/pc+-file-reader.c:380 src/data/sys-file-reader.c:680 #, c-format msgid "Variable %zu Label" msgstr "" #: src/data/pc+-file-reader.c:385 #, c-format msgid "Variable %zu Value Label %zu" msgstr "" #: src/data/pc+-file-reader.c:388 src/data/sys-file-reader.c:690 msgid "Creation Date" msgstr "" #: src/data/pc+-file-reader.c:389 src/data/sys-file-reader.c:691 msgid "Creation Time" msgstr "" #: src/data/pc+-file-reader.c:390 src/data/sys-file-reader.c:692 #: src/language/dictionary/sys-file-info.c:200 msgid "Product" msgstr "" #: src/data/pc+-file-reader.c:391 src/data/sys-file-reader.c:693 #: src/language/dictionary/sys-file-info.c:300 msgid "File Label" msgstr "" #: src/data/pc+-file-reader.c:427 #, c-format msgid "" "Using default encoding %s to read this SPSS/PC+ system file. For best " "results, specify an encoding explicitly. Use SYSFILE INFO with ENCODING=" "\"DETECT\" to analyze the possible encodings." msgstr "" #: src/data/pc+-file-reader.c:483 src/data/sys-file-reader.c:890 #, c-format msgid "Error closing system file `%s': %s." msgstr "" #: src/data/pc+-file-reader.c:544 msgid "This is not an SPSS/PC+ system file." msgstr "" #: src/data/pc+-file-reader.c:548 #, c-format msgid "Record 0 has unexpected length %u." msgstr "" #: src/data/pc+-file-reader.c:572 #, c-format msgid "Record 0 specifies unexpected system missing value %g (%a)." msgstr "" #: src/data/pc+-file-reader.c:577 #, c-format msgid "Record 0 reserved fields have unexpected values (%u,%u,%u,%u,%u,%u)." msgstr "" #: src/data/pc+-file-reader.c:581 #, c-format msgid "Record 0 case counts differ (%u versus %u)." msgstr "" #: src/data/pc+-file-reader.c:585 #, c-format msgid "Invalid compression type %u." msgstr "" #: src/data/pc+-file-reader.c:596 #, c-format msgid "" "Record 0 claims %u cases with %u values per case (requiring at least %zu " "bytes) but data record is only %u bytes long." msgstr "" #: src/data/pc+-file-reader.c:618 #, c-format msgid "" "Value labels claimed to end at offset %u in labels record but labels record " "is only %u bytes." msgstr "" #: src/data/pc+-file-reader.c:629 #, c-format msgid "" "Value labels claimed to be at offset %u with length %u but file size is only " "%u bytes." msgstr "" #: src/data/pc+-file-reader.c:656 #, c-format msgid "" "Value labels end with partial label (%u bytes left in record, label length " "%)." msgstr "" #: src/data/pc+-file-reader.c:669 #, c-format msgid "%u leftover bytes following value labels." msgstr "" #: src/data/pc+-file-reader.c:685 #, c-format msgid "" "Variable label claimed to start at offset %u in labels record but labels " "record is only %u bytes." msgstr "" #: src/data/pc+-file-reader.c:697 #, c-format msgid "" "Variable label with length %u starting at offset %u in labels record " "overruns end of %u-byte labels record." msgstr "" #: src/data/pc+-file-reader.c:719 #, c-format msgid "Record 1 has length %u (expected %u)." msgstr "" #: src/data/pc+-file-reader.c:751 #, c-format msgid "Variable %u has invalid type %." msgstr "" #: src/data/pc+-file-reader.c:787 #, c-format msgid "Invalid weight index %u." msgstr "" #: src/data/pc+-file-reader.c:857 #, c-format msgid "Invalid variable name `%s'." msgstr "" #: src/data/pc+-file-reader.c:865 src/data/sys-file-reader.c:1444 #, c-format msgid "Renaming variable with duplicate name `%s' to `%s'." msgstr "" #: src/data/pc+-file-reader.c:877 #, c-format msgid "Cannot weight by string variable `%s'." msgstr "" #: src/data/pc+-file-reader.c:973 src/data/sys-file-reader.c:2762 msgid "File ends in partial case." msgstr "" #: src/data/pc+-file-reader.c:979 #, c-format msgid "" "Case beginning at offset 0x%08x extends past end of data record at offset 0x" "%08x." msgstr "" #: src/data/pc+-file-reader.c:998 src/data/sys-file-reader.c:2770 #, c-format msgid "Error reading case from file %s." msgstr "" #: src/data/pc+-file-reader.c:1114 src/data/sys-file-reader.c:2933 #, c-format msgid "" "Possible compressed data corruption: string contains compressed integer " "(opcode %d)." msgstr "" #: src/data/pc+-file-reader.c:1156 src/data/sys-file-reader.c:3234 #, c-format msgid "`%s' near offset 0x%llx: " msgstr "" #: src/data/pc+-file-reader.c:1159 src/data/sys-file-reader.c:3237 #, c-format msgid "`%s': " msgstr "" #: src/data/pc+-file-reader.c:1211 src/data/sys-file-reader.c:3288 #, c-format msgid "System error: %s." msgstr "" #: src/data/pc+-file-reader.c:1216 src/data/sys-file-reader.c:3293 msgid "Unexpected end of file." msgstr "" #: src/data/pc+-file-reader.c:1301 src/data/sys-file-reader.c:3518 #, c-format msgid "%s: seek failed (%s)." msgstr "" #: src/data/pc+-file-reader.c:1351 msgid "SPSS/PC+ System File" msgstr "" #: src/data/por-file-reader.c:109 #, c-format msgid "portable file %s corrupt at offset 0x%llx: " msgstr "" #: src/data/por-file-reader.c:136 #, c-format msgid "reading portable file %s at offset 0x%llx: " msgstr "" #: src/data/por-file-reader.c:164 #, c-format msgid "Error closing portable file `%s': %s." msgstr "" #: src/data/por-file-reader.c:216 msgid "unexpected end of file" msgstr "" #. TRANSLATORS: this fragment will be interpolated into #. messages in fh_lock() that identify types of files. #: src/data/por-file-reader.c:275 src/data/por-file-writer.c:147 msgid "portable file" msgstr "" #: src/data/por-file-reader.c:283 #, c-format msgid "" "An error occurred while opening `%s' for reading as a portable file: %s." msgstr "" #: src/data/por-file-reader.c:304 msgid "Data record expected." msgstr "" #: src/data/por-file-reader.c:402 msgid "Number expected." msgstr "" #: src/data/por-file-reader.c:430 msgid "Missing numeric terminator." msgstr "" #: src/data/por-file-reader.c:453 msgid "Invalid integer." msgstr "" #: src/data/por-file-reader.c:464 src/data/por-file-reader.c:484 #, c-format msgid "Bad string length %d." msgstr "" #: src/data/por-file-reader.c:547 #, c-format msgid "%s: Not a portable file." msgstr "" #: src/data/por-file-reader.c:564 #, c-format msgid "Unrecognized version code `%c'." msgstr "" #: src/data/por-file-reader.c:577 #, c-format msgid "Bad date string length %zu." msgstr "" #: src/data/por-file-reader.c:579 #, c-format msgid "Bad time string length %zu." msgstr "" #: src/data/por-file-reader.c:630 #, c-format msgid "" "%s: Bad format specifier byte (%d). Variable will be assigned a default " "format." msgstr "" #: src/data/por-file-reader.c:651 #, c-format msgid "Numeric variable %s has invalid format specifier %s." msgstr "" #: src/data/por-file-reader.c:655 #, c-format msgid "String variable %s with width %d has invalid format specifier %s." msgstr "" #: src/data/por-file-reader.c:679 msgid "Expected variable count record." msgstr "" #: src/data/por-file-reader.c:683 #, c-format msgid "Invalid number of variables %d." msgstr "" #: src/data/por-file-reader.c:692 #, c-format msgid "Weight variable name (%s) truncated." msgstr "" #: src/data/por-file-reader.c:707 msgid "Expected variable record." msgstr "" #: src/data/por-file-reader.c:711 #, c-format msgid "Invalid variable width %d." msgstr "" #: src/data/por-file-reader.c:719 #, c-format msgid "Invalid variable name `%s' in position %d." msgstr "" #: src/data/por-file-reader.c:723 src/data/sys-file-reader.c:1426 #, c-format msgid "Bad width %d for variable %s." msgstr "" #: src/data/por-file-reader.c:737 #, c-format msgid "Duplicate variable name %s in position %d renamed to %s." msgstr "" #: src/data/por-file-reader.c:786 #, c-format msgid "Weighting variable %s not present in dictionary." msgstr "" #: src/data/por-file-reader.c:830 #, c-format msgid "Unknown variable %s while parsing value labels." msgstr "" #: src/data/por-file-reader.c:833 #, c-format msgid "" "Cannot assign value labels to %s and %s, which have different variable types." msgstr "" #: src/data/por-file-reader.c:972 msgid "SPSS Portable File" msgstr "" #: src/data/por-file-writer.c:139 #, c-format msgid "Invalid decimal digits count %d. Treating as %d." msgstr "" #: src/data/por-file-writer.c:159 #, c-format msgid "Error opening `%s' for writing as a portable file: %s." msgstr "" #: src/data/por-file-writer.c:505 #, c-format msgid "An I/O error occurred writing portable file `%s'." msgstr "" #: src/data/psql-reader.c:48 msgid "" "Support for reading postgres databases was not compiled into this " "installation of PSPP" msgstr "" #: src/data/psql-reader.c:242 msgid "Memory error whilst opening psql source" msgstr "" #: src/data/psql-reader.c:248 #, c-format msgid "Error opening psql source: %s." msgstr "" #: src/data/psql-reader.c:263 #, c-format msgid "" "Postgres server is version %s. Reading from versions earlier than 8.0 is not " "supported." msgstr "" #: src/data/psql-reader.c:283 msgid "" "Connection is unencrypted, but unencrypted connections have not been " "permitted." msgstr "" #: src/data/psql-reader.c:324 src/data/psql-reader.c:349 #: src/data/psql-reader.c:359 #, c-format msgid "Error from psql source: %s." msgstr "" #: src/data/psql-reader.c:454 #, c-format msgid "Unsupported OID %d. SYSMIS values will be inserted." msgstr "" #: src/data/settings.c:391 msgid "" "MXWARNS set to zero. No further warnings will be given even when " "potentially problematic situations are encountered." msgstr "" #: src/data/settings.c:398 #, c-format msgid "" "Warnings re-enabled. %d warnings will be issued before aborting syntax " "processing." msgstr "" #: src/data/settings.c:618 #, c-format msgid "" "%s: Custom currency string `%s' does not contain exactly three periods or " "commas (or it contains both)." msgstr "" #. TRANSLATORS: this fragment will be interpolated into #. messages in fh_lock() that identify types of files. #: src/data/sys-file-reader.c:407 src/data/sys-file-writer.c:245 msgid "system file" msgstr "" #: src/data/sys-file-reader.c:414 #, c-format msgid "Error opening `%s' for reading as a system file: %s." msgstr "" #: src/data/sys-file-reader.c:491 msgid "Misplaced type 4 record." msgstr "" #: src/data/sys-file-reader.c:496 msgid "Duplicate type 6 (document) record." msgstr "" #: src/data/sys-file-reader.c:506 src/data/sys-file-reader.c:1343 #, c-format msgid "" "Unrecognized record type 7, subtype %d. For help, please send this file to " "%s and mention that you were using %s." msgstr "" #: src/data/sys-file-reader.c:526 #, c-format msgid "" "Record type 7, subtype %d found here has the same type as the record found " "near offset 0x%llx. For help, please send this file to %s and mention that " "you were using %s." msgstr "" #: src/data/sys-file-reader.c:538 #, c-format msgid "Unrecognized record type %d." msgstr "" #: src/data/sys-file-reader.c:688 #, c-format msgid "Value Label %zu" msgstr "" #: src/data/sys-file-reader.c:697 msgid "Extra Product Info" msgstr "" #: src/data/sys-file-reader.c:710 #, c-format msgid "Document Line %zu" msgstr "" #: src/data/sys-file-reader.c:718 #, c-format msgid "MRSET %zu" msgstr "" #: src/data/sys-file-reader.c:720 #, c-format msgid "MRSET %zu Label" msgstr "" #: src/data/sys-file-reader.c:725 #, c-format msgid "MRSET %zu Counted Value" msgstr "" #: src/data/sys-file-reader.c:763 #, c-format msgid "" "This system file does not indicate its own character encoding. Using " "default encoding %s. For best results, specify an encoding explicitly. Use " "SYSFILE INFO with ENCODING=\"DETECT\" to analyze the possible encodings." msgstr "" #: src/data/sys-file-reader.c:845 #, c-format msgid "File header claims %d variable positions but %zu were read from file." msgstr "" #: src/data/sys-file-reader.c:958 src/data/sys-file-reader.c:972 msgid "This is not an SPSS system file." msgstr "" #: src/data/sys-file-reader.c:1027 msgid "" "Compression bias is not the usual value of 100, or system file uses " "unrecognized floating-point format." msgstr "" #: src/data/sys-file-reader.c:1102 msgid "Variable label indicator field is not 0 or 1." msgstr "" #: src/data/sys-file-reader.c:1115 msgid "Numeric missing value indicator field is not -3, -2, 0, 1, 2, or 3." msgstr "" #: src/data/sys-file-reader.c:1125 msgid "String missing value indicator field is not 0, 1, 2, or 3." msgstr "" #: src/data/sys-file-reader.c:1152 #, c-format msgid "Invalid number of labels %u." msgstr "" #: src/data/sys-file-reader.c:1185 msgid "" "Variable index record (type 4) does not immediately follow value label " "record (type 3) as it should." msgstr "" #: src/data/sys-file-reader.c:1197 #, c-format msgid "" "Number of variables associated with a value label (%u) is not between 1 and " "the number of variables (%zu)." msgstr "" #: src/data/sys-file-reader.c:1224 #, c-format msgid "Number of document lines (%d) must be greater than 0 and less than %d." msgstr "" #: src/data/sys-file-reader.c:1317 #, c-format msgid "Record type 7, subtype %d has bad size %u (expected %d)." msgstr "" #: src/data/sys-file-reader.c:1321 #, c-format msgid "Record type 7, subtype %d has bad count %u (expected %d)." msgstr "" #: src/data/sys-file-reader.c:1435 #, c-format msgid "Renaming variable with invalid name `%s' to `%s'." msgstr "" #: src/data/sys-file-reader.c:1517 msgid "Missing string continuation record." msgstr "" #: src/data/sys-file-reader.c:1550 #, c-format msgid "Variable %s with width %d has invalid print format 0x%x." msgstr "" #: src/data/sys-file-reader.c:1554 #, c-format msgid "Variable %s with width %d has invalid write format 0x%x." msgstr "" #: src/data/sys-file-reader.c:1559 msgid "Suppressing further invalid format warnings." msgstr "" #: src/data/sys-file-reader.c:1613 #, c-format msgid "" "Floating-point representation indicated by system file (%d) differs from " "expected (%d)." msgstr "" #: src/data/sys-file-reader.c:1629 #, c-format msgid "" "Integer format indicated by system file (%d) differs from expected (%d)." msgstr "" #: src/data/sys-file-reader.c:1647 src/data/sys-file-reader.c:1653 #, c-format msgid "File specifies unexpected value %g (%a) as %s, instead of %g (%a)." msgstr "" #: src/data/sys-file-reader.c:1662 #, c-format msgid "" "File specifies unexpected value %g (%a) as %s, instead of %g (%a) or %g (%a)." msgstr "" #: src/data/sys-file-reader.c:1714 src/data/sys-file-reader.c:1733 #, c-format msgid "Missing space following `%c' at offset %zu in MRSETS record." msgstr "" #: src/data/sys-file-reader.c:1741 #, c-format msgid "" "Missing label source value following `E' at offset %zu in MRSETS record." msgstr "" #: src/data/sys-file-reader.c:1748 #, c-format msgid "" "Unexpected label source value following `E' at offset %zu in MRSETS record." msgstr "" #: src/data/sys-file-reader.c:1755 #, c-format msgid "Missing `C', `D', or `E' at offset %zu in MRSETS record." msgstr "" #: src/data/sys-file-reader.c:1782 #, c-format msgid "Missing new-line parsing variable names at offset %zu in MRSETS record." msgstr "" #: src/data/sys-file-reader.c:1817 #, c-format msgid "Invalid multiple response set name `%s'." msgstr "" #: src/data/sys-file-reader.c:1850 #, c-format msgid "MRSET %s contains duplicate variable name %s." msgstr "" #: src/data/sys-file-reader.c:1865 #, c-format msgid "MRSET %s contains both string and numeric variables." msgstr "" #: src/data/sys-file-reader.c:1877 #, c-format msgid "MRSET %s has no variables." msgstr "" #: src/data/sys-file-reader.c:1879 #, c-format msgid "MRSET %s has only one variable." msgstr "" #: src/data/sys-file-reader.c:1923 #, c-format msgid "Extension 11 has bad count %u (for %zu variables)." msgstr "" #: src/data/sys-file-reader.c:1956 #, c-format msgid "" "Invalid variable display parameters for variable %zu (%s). Default " "parameters substituted." msgstr "" #: src/data/sys-file-reader.c:2000 #, c-format msgid "Duplicate long variable name `%s'." msgstr "" #: src/data/sys-file-reader.c:2053 #, c-format msgid "Long variable mapping from %s to invalid variable name `%s'." msgstr "" #: src/data/sys-file-reader.c:2088 #, c-format msgid "%s listed as string of invalid length %s in very long string record." msgstr "" #: src/data/sys-file-reader.c:2099 #, c-format msgid "" "%s listed in very long string record with width %s, which requires only one " "segment." msgstr "" #: src/data/sys-file-reader.c:2107 #, c-format msgid "Very long string %s overflows dictionary." msgstr "" #: src/data/sys-file-reader.c:2125 #, c-format msgid "" "Very long string with width %ld has segment %d of width %d (expected %d)." msgstr "" #: src/data/sys-file-reader.c:2183 #, c-format msgid "Value label variable index %d not in valid range 1...%zu." msgstr "" #: src/data/sys-file-reader.c:2193 #, c-format msgid "Value label variable index %d refers to long string continuation." msgstr "" #: src/data/sys-file-reader.c:2208 #, c-format msgid "" "Variables associated with value label are not all of identical type. " "Variable %s is %s, but variable %s is %s." msgstr "" #: src/data/sys-file-reader.c:2226 #, c-format msgid "" "Value labels may not be added to long string variables (e.g. %s) using " "records types 3 and 4." msgstr "" #: src/data/sys-file-reader.c:2255 #, c-format msgid "Duplicate value label for %g on %s." msgstr "" #: src/data/sys-file-reader.c:2260 src/data/sys-file-reader.c:2600 #, c-format msgid "Duplicate value label for `%.*s' on %s." msgstr "" #: src/data/sys-file-reader.c:2283 #, c-format msgid "Suppressed %d additional warnings for value labels." msgstr "" #: src/data/sys-file-reader.c:2297 #, c-format msgid "" "Weight variable index %d not in valid range 1...%zu. Treating file as " "unweighted." msgstr "" #: src/data/sys-file-reader.c:2307 #, c-format msgid "" "Weight variable index %d refers to long string continuation. Treating file " "as unweighted." msgstr "" #: src/data/sys-file-reader.c:2315 #, c-format msgid "Ignoring string variable `%s' set as weighting variable." msgstr "" #: src/data/sys-file-reader.c:2352 #, c-format msgid "Error parsing attribute value %s[%d]." msgstr "" #: src/data/sys-file-reader.c:2366 #, c-format msgid "Attribute value %s[%d] is not quoted: %s." msgstr "" #: src/data/sys-file-reader.c:2379 #, c-format msgid "Duplicate attribute %s." msgstr "" #: src/data/sys-file-reader.c:2463 #, c-format msgid "Invalid role for variable %s." msgstr "" #: src/data/sys-file-reader.c:2472 #, c-format msgid "%zu other variables had invalid roles." msgstr "" #: src/data/sys-file-reader.c:2485 #, c-format msgid "Extension record subtype %d ends unexpectedly." msgstr "" #: src/data/sys-file-reader.c:2531 #, c-format msgid "Ignoring long string value label record for unknown variable %s." msgstr "" #: src/data/sys-file-reader.c:2536 #, c-format msgid "Ignoring long string value label record for numeric variable %s." msgstr "" #: src/data/sys-file-reader.c:2543 #, c-format msgid "" "Ignoring long string value label record for variable %s because the record's " "width (%d) does not match the variable's width (%d)." msgstr "" #: src/data/sys-file-reader.c:2573 #, c-format msgid "" "Ignoring long string value label %zu for variable %s, with width %d, that " "has bad value width %zu." msgstr "" #: src/data/sys-file-reader.c:2646 #, c-format msgid "" "Long string missing values record says variable %s has %d missing values, " "but only 1 to 3 missing values are allowed." msgstr "" #: src/data/sys-file-reader.c:2656 #, c-format msgid "Ignoring long string missing value record for unknown variable %s." msgstr "" #: src/data/sys-file-reader.c:2661 #, c-format msgid "Ignoring long string missing value record for numeric variable %s." msgstr "" #: src/data/sys-file-reader.c:2686 #, c-format msgid "" "Ignoring long string missing value %zu for variable %s, with width %d, that " "has bad value width %zu." msgstr "" #: src/data/sys-file-reader.c:2740 msgid "File ends in partial string value." msgstr "" #: src/data/sys-file-reader.c:2879 msgid "" "Possible compressed data corruption: compressed spaces appear in numeric " "field." msgstr "" #: src/data/sys-file-reader.c:3030 #, c-format msgid "Suppressed %d additional related warnings." msgstr "" #: src/data/sys-file-reader.c:3076 src/data/sys-file-reader.c:3093 #, c-format msgid "Dictionary record refers to unknown variable %s." msgstr "" #: src/data/sys-file-reader.c:3159 #, c-format msgid "Expecting digit at offset %zu in MRSETS record." msgstr "" #: src/data/sys-file-reader.c:3167 #, c-format msgid "Expecting space at offset %zu in MRSETS record." msgstr "" #: src/data/sys-file-reader.c:3175 #, c-format msgid "%zu-byte string starting at offset %zu exceeds record length %zu." msgstr "" #: src/data/sys-file-reader.c:3185 #, c-format msgid "Expecting space at offset %zu following %zu-byte string." msgstr "" #: src/data/sys-file-reader.c:3476 #, c-format msgid "Wrong ZLIB data header offset %#llx (expected %#llx)." msgstr "" #: src/data/sys-file-reader.c:3484 #, c-format msgid "Impossible ZLIB trailer offset 0x%llx." msgstr "" #: src/data/sys-file-reader.c:3491 #, c-format msgid "Invalid ZLIB trailer length %lld." msgstr "" #: src/data/sys-file-reader.c:3555 #, c-format msgid "End of ZLIB trailer (0x%llx) is not file size (0x%llx)." msgstr "" #: src/data/sys-file-reader.c:3565 #, c-format msgid "ZLIB trailer bias (%lld) differs from file header bias (%.2f)." msgstr "" #: src/data/sys-file-reader.c:3575 #, c-format msgid "ZLIB trailer \"zero\" field has nonzero value %lld." msgstr "" #: src/data/sys-file-reader.c:3581 #, c-format msgid "ZLIB trailer specifies unexpected %u-byte block size." msgstr "" #: src/data/sys-file-reader.c:3589 #, c-format msgid "%lld-byte ZLIB trailer specifies %u data blocks (expected %lld)." msgstr "" #: src/data/sys-file-reader.c:3614 #, c-format msgid "" "ZLIB block descriptor %u reported uncompressed data offset %#llx, when %#llx " "was expected." msgstr "" #: src/data/sys-file-reader.c:3623 #, c-format msgid "" "ZLIB block descriptor %u reported compressed data offset %#llx, when %#llx " "was expected." msgstr "" #: src/data/sys-file-reader.c:3633 #, c-format msgid "" "ZLIB block descriptor %u reported block size %#x, when %#x was expected." msgstr "" #: src/data/sys-file-reader.c:3641 #, c-format msgid "" "ZLIB block descriptor %u reported block size %#x, when at most %#x was " "expected." msgstr "" #: src/data/sys-file-reader.c:3653 #, c-format msgid "" "ZLIB block descriptor %u reports compressed size %u and uncompressed size %u." msgstr "" #: src/data/sys-file-reader.c:3665 #, c-format msgid "" "ZLIB trailer is at offset %#llx but %#llx would be expected from block " "descriptors." msgstr "" #: src/data/sys-file-reader.c:3684 #, c-format msgid "ZLIB initialization failed (%s)." msgstr "" #: src/data/sys-file-reader.c:3699 #, c-format msgid "Inconsistency at end of ZLIB stream (%s)." msgstr "" #: src/data/sys-file-reader.c:3758 #, c-format msgid "ZLIB stream inconsistency (%s)." msgstr "" #: src/data/sys-file-reader.c:3782 msgid "Unexpected end of ZLIB compressed data." msgstr "" #: src/data/sys-file-reader.c:3820 msgid "SPSS System File" msgstr "" #: src/data/sys-file-writer.c:210 #, c-format msgid "Unknown system file version %d. Treating as version %d." msgstr "" #: src/data/sys-file-writer.c:256 #, c-format msgid "Error opening `%s' for writing as a system file: %s." msgstr "" #: src/data/sys-file-writer.c:1271 #, c-format msgid "An I/O error occurred writing system file `%s'." msgstr "" #: src/data/sys-file-writer.c:1378 #, c-format msgid "Failed to initialize ZLIB for compression (%s)." msgstr "" #: src/data/sys-file-writer.c:1407 #, c-format msgid "Failed to complete ZLIB stream compression (%s)." msgstr "" #: src/data/sys-file-writer.c:1449 #, c-format msgid "ZLIB stream compression failed (%s)." msgstr "" #: src/data/sys-file-writer.c:1491 #, c-format msgid "%s: Seek failed (%s)." msgstr "" #: src/data/variable.c:58 msgid "Left" msgstr "" #: src/data/variable.c:59 msgid "Right" msgstr "" #: src/data/variable.c:60 msgid "Center" msgstr "" #: src/data/variable.c:66 msgid "Nominal" msgstr "" #: src/data/variable.c:67 msgid "Ordinal" msgstr "" #: src/data/variable.c:68 src/language/stats/ks-one-sample.c:300 msgid "Scale" msgstr "" #: src/data/variable.c:74 msgid "Input" msgstr "" #. TRANSLATORS: This will be part of a filename. Please avoid whitespace. #: src/data/variable.c:75 src/output/spv/spv-writer.c:213 #: src/ui/gui/psppire-output-window.c:547 msgid "Output" msgstr "" #: src/data/variable.c:76 msgid "Both" msgstr "" #: src/data/variable.c:77 src/language/dictionary/sys-file-info.c:237 #: src/ui/gui/psppire-dialog-action-crosstabs.c:86 #: src/ui/gui/psppire-dialog-action-crosstabs.c:98 #: src/ui/gui/psppire-dialog-action-crosstabs.c:133 #: src/ui/gui/psppire-dialog-action-crosstabs.c:141 #: src/ui/gui/psppire-variable-sheet.c:408 src/ui/gui/var-display.c:34 msgid "None" msgstr "" #: src/data/variable.c:78 msgid "Partition" msgstr "" #: src/data/variable.c:79 src/ui/gui/reliability.ui:37 msgid "Split" msgstr "" #: src/data/variable.c:729 #, c-format msgid "%s (%s)" msgstr "" #: src/data/variable.c:1339 msgid "" "At least one case in the data file had a weight value that was user-missing, " "system-missing, zero, or negative. These case(s) were ignored." msgstr "" #: src/language/command.c:207 src/language/stats/graph.c:749 #: src/language/stats/graph.c:755 src/language/stats/graph.c:789 #: src/language/stats/graph.c:794 src/language/stats/graph.c:799 #: src/language/stats/graph.c:852 src/language/stats/graph.c:857 #: src/language/stats/graph.c:862 src/language/stats/graph.c:867 #: src/language/stats/graph.c:872 src/language/stats/graph.c:877 #: src/language/stats/graph.c:882 src/language/utilities/set.q:236 #, c-format msgid "%s is not yet implemented." msgstr "" #: src/language/command.c:212 #, c-format msgid "%s may be used only in testing mode." msgstr "" #: src/language/command.c:217 #, c-format msgid "%s may be used only in enhanced syntax mode." msgstr "" #: src/language/command.c:345 msgid "expecting command name" msgstr "" #: src/language/command.c:347 #, c-format msgid "Unknown command `%s'." msgstr "" #: src/language/command.c:380 #, c-format msgid "%s is allowed only before the active dataset has been defined." msgstr "" #: src/language/command.c:384 #, c-format msgid "%s is allowed only after the active dataset has been defined." msgstr "" #: src/language/command.c:388 src/language/command.c:392 #, c-format msgid "%s is allowed only inside %s." msgstr "" #: src/language/command.c:399 src/language/command.c:403 #, c-format msgid "" "%s is allowed only before the active dataset has been defined or inside %s." msgstr "" #: src/language/command.c:407 src/language/command.c:411 #, c-format msgid "" "%s is allowed only after the active dataset has been defined or inside %s." msgstr "" #: src/language/command.c:415 #, c-format msgid "%s is allowed only inside %s or inside %s." msgstr "" #: src/language/command.c:421 #, c-format msgid "" "%s is allowed only after the active dataset has been defined, inside INPUT " "PROGRAM, or inside FILE TYPE." msgstr "" #: src/language/command.c:426 #, c-format msgid "" "%s is allowed only before the active dataset has been defined, inside INPUT " "PROGRAM, or inside FILE TYPE." msgstr "" #: src/language/command.c:444 src/language/command.c:447 #, c-format msgid "%s is not allowed inside %s." msgstr "" #: src/language/command.c:529 src/language/utilities/host.c:272 #: src/language/utilities/permissions.c:105 #, c-format msgid "This command not allowed when the %s option is set." msgstr "" #: src/language/command.c:545 #, c-format msgid "Error removing `%s': %s." msgstr "" #: src/language/lexer/lexer.c:296 #, c-format msgid "expecting %s" msgstr "" #: src/language/lexer/lexer.c:300 #, c-format msgid "expecting %s or %s" msgstr "" #: src/language/lexer/lexer.c:304 #, c-format msgid "expecting %s, %s, or %s" msgstr "" #: src/language/lexer/lexer.c:309 #, c-format msgid "expecting %s, %s, %s, or %s" msgstr "" #: src/language/lexer/lexer.c:314 #, c-format msgid "expecting %s, %s, %s, %s, or %s" msgstr "" #: src/language/lexer/lexer.c:319 #, c-format msgid "expecting %s, %s, %s, %s, %s, or %s" msgstr "" #: src/language/lexer/lexer.c:325 #, c-format msgid "expecting %s, %s, %s, %s, %s, %s, or %s" msgstr "" #: src/language/lexer/lexer.c:331 #, c-format msgid "expecting %s, %s, %s, %s, %s, %s, %s, or %s" msgstr "" #: src/language/lexer/lexer.c:351 #, c-format msgid "Subcommand %s may only be specified once." msgstr "" #: src/language/lexer/lexer.c:363 #, c-format msgid "Required subcommand %s was not specified." msgstr "" #: src/language/lexer/lexer.c:371 #, c-format msgid "%s may only be specified once within subcommand %s" msgstr "" #: src/language/lexer/lexer.c:380 #, c-format msgid "Required %s specification missing from %s subcommand" msgstr "" #: src/language/lexer/lexer.c:399 msgid "Syntax error at end of input" msgstr "" #: src/language/lexer/lexer.c:420 src/language/xforms/select-if.c:60 #: src/language/stats/autorecode.c:206 src/language/stats/npar.c:503 #: src/language/data-io/print-space.c:83 msgid "expecting end of command" msgstr "" #: src/language/lexer/lexer.c:631 msgid "expecting string" msgstr "" #: src/language/lexer/lexer.c:660 msgid "expecting integer" msgstr "" #: src/language/lexer/lexer.c:673 msgid "expecting number" msgstr "" #: src/language/lexer/lexer.c:685 msgid "expecting identifier" msgstr "" #: src/language/lexer/lexer.c:1272 msgid "Syntax error at end of command" msgstr "" #: src/language/lexer/lexer.c:1281 #, c-format msgid "Syntax error at `%s'" msgstr "" #: src/language/lexer/lexer.c:1284 msgid "Syntax error" msgstr "" #: src/language/lexer/lexer.c:1470 #, c-format msgid "String of hex digits has %d characters, which is not a multiple of 2" msgstr "" #: src/language/lexer/lexer.c:1477 #, c-format msgid "`%c' is not a valid hex digit" msgstr "" #: src/language/lexer/lexer.c:1482 #, c-format msgid "" "Unicode string contains %d bytes, which is not in the valid range of 1 to 8 " "bytes" msgstr "" #: src/language/lexer/lexer.c:1488 #, c-format msgid "U+%04X is not a valid Unicode code point" msgstr "" #: src/language/lexer/lexer.c:1493 msgid "Unterminated string constant" msgstr "" #: src/language/lexer/lexer.c:1497 #, c-format msgid "Missing exponent following `%s'" msgstr "" #: src/language/lexer/lexer.c:1502 msgid "Unexpected `.' in middle of command" msgstr "" #: src/language/lexer/lexer.c:1508 #, c-format msgid "Bad character %s in input" msgstr "" #: src/language/lexer/lexer.c:1603 #, c-format msgid "Opening `%s': %s." msgstr "" #: src/language/lexer/lexer.c:1647 #, c-format msgid "Error closing `%s': %s." msgstr "" #: src/language/lexer/subcommand-list.c:118 #, c-format msgid "No more than %d %s subcommands allowed." msgstr "" #: src/language/lexer/format-parser.c:77 msgid "expecting valid format specifier" msgstr "" #: src/language/lexer/format-parser.c:116 #: src/language/lexer/format-parser.c:143 src/language/utilities/output.c:108 #: src/language/data-io/data-list.c:453 src/language/data-io/get-data.c:638 #: src/language/data-io/placement-parser.c:236 #, c-format msgid "Unknown format type `%s'." msgstr "" #: src/language/lexer/format-parser.c:122 #, c-format msgid "Format specifier `%s' lacks required width." msgstr "" #: src/language/lexer/format-parser.c:138 msgid "expecting format type" msgstr "" #: src/language/lexer/value-parser.c:66 #, c-format msgid "" "The high end of the range (%.*g) is below the low end (%.*g). The range " "will be treated as if reversed." msgstr "" #: src/language/lexer/value-parser.c:74 #, c-format msgid "Ends of range are equal (%.*g)." msgstr "" #: src/language/lexer/value-parser.c:82 #, c-format msgid "%s or %s must be part of a range." msgstr "" #: src/language/lexer/value-parser.c:112 msgid "System-missing value is not valid here." msgstr "" #: src/language/lexer/variable-parser.c:86 utilities/pspp-convert.c:83 msgid "expecting variable name" msgstr "" #: src/language/lexer/variable-parser.c:96 #, c-format msgid "%s is not a variable name." msgstr "" #: src/language/lexer/variable-parser.c:206 #, c-format msgid "" "%s is not a numeric variable. It will not be included in the variable list." msgstr "" #: src/language/lexer/variable-parser.c:209 #, c-format msgid "" "%s is not a string variable. It will not be included in the variable list." msgstr "" #: src/language/lexer/variable-parser.c:213 #, c-format msgid "Scratch variables (such as %s) are not allowed here." msgstr "" #: src/language/lexer/variable-parser.c:217 #, c-format msgid "" "%s and %s are not the same type. All variables in this variable list must " "be of the same type. %s will be omitted from the list." msgstr "" #: src/language/lexer/variable-parser.c:223 #, c-format msgid "" "%s and %s are string variables with different widths. All variables in this " "variable list must have the same width. %s will be omitted from the list." msgstr "" #: src/language/lexer/variable-parser.c:228 #: src/language/lexer/variable-parser.c:447 #, c-format msgid "Variable %s appears twice in variable list." msgstr "" #: src/language/lexer/variable-parser.c:341 #, c-format msgid "%s TO %s is not valid syntax since %s precedes %s in the dictionary." msgstr "" #: src/language/lexer/variable-parser.c:349 #, c-format msgid "" "When using the TO keyword to specify several variables, both variables must " "be from the same variable dictionaries, of either ordinary, scratch, or " "system variables. %s is a %s variable, whereas %s is %s." msgstr "" #: src/language/lexer/variable-parser.c:424 #, c-format msgid "`%s' cannot be used with TO because it does not end in a digit." msgstr "" #: src/language/lexer/variable-parser.c:432 #, c-format msgid "Numeric suffix on `%s' is larger than supported with TO." msgstr "" #: src/language/lexer/variable-parser.c:505 msgid "Scratch variables not allowed here." msgstr "" #: src/language/lexer/variable-parser.c:529 msgid "Prefixes don't match in use of TO convention." msgstr "" #: src/language/lexer/variable-parser.c:534 msgid "Bad bounds in use of TO convention." msgstr "" #: src/language/xforms/compute.c:150 src/language/xforms/compute.c:205 #, c-format msgid "" "When executing COMPUTE: SYSMIS is not a valid value as an index into vector " "%s." msgstr "" #: src/language/xforms/compute.c:154 src/language/xforms/compute.c:212 #, c-format msgid "" "When executing COMPUTE: %.*g is not a valid value as an index into vector %s." msgstr "" #: src/language/xforms/compute.c:356 #, c-format msgid "There is no vector named %s." msgstr "" #: src/language/xforms/count.c:125 msgid "Destination cannot be a string variable." msgstr "" #: src/language/xforms/sample.c:76 msgid "The sampling factor must be between 0 and 1 exclusive." msgstr "" #: src/language/xforms/sample.c:96 #, c-format msgid "Cannot sample %d observations from a population of %d." msgstr "" #: src/language/xforms/recode.c:261 msgid "" "Inconsistent target variable types. Target variables must be all numeric or " "all string." msgstr "" #: src/language/xforms/recode.c:282 msgid "CONVERT requires string input values and numeric output values." msgstr "" #: src/language/xforms/recode.c:339 #, c-format msgid "%s is not allowed with string variables." msgstr "" #: src/language/xforms/recode.c:422 msgid "expecting output value" msgstr "" #: src/language/xforms/recode.c:479 #, c-format msgid "" "%zu variable(s) cannot be recoded into %zu variable(s). Specify the same " "number of variables as source and target variables." msgstr "" #: src/language/xforms/recode.c:494 #, c-format msgid "" "There is no variable named %s. (All string variables specified on INTO must " "already exist. Use the STRING command to create a string variable.)" msgstr "" #: src/language/xforms/recode.c:510 #, c-format msgid "INTO is required with %s input values and %s output values." msgstr "" #: src/language/xforms/recode.c:523 #, c-format msgid "Type mismatch. Cannot store %s data in %s variable %s." msgstr "" #: src/language/xforms/recode.c:566 #, c-format msgid "" "Cannot recode because the variable %s would require a width of %d bytes or " "greater, but it has a width of only %d bytes." msgstr "" #: src/language/xforms/select-if.c:100 msgid "Syntax error expecting OFF or BY. Turning off case filtering." msgstr "" #: src/language/xforms/select-if.c:115 msgid "The filter variable must be numeric." msgstr "" #: src/language/xforms/select-if.c:121 msgid "The filter variable may not be scratch." msgstr "" #: src/language/control/control-stack.c:49 #, c-format msgid "%s without %s." msgstr "" #: src/language/control/control-stack.c:77 #, c-format msgid "This command must appear inside %s...%s, without intermediate %s...%s." msgstr "" #: src/language/control/control-stack.c:94 #, c-format msgid "This command cannot appear outside %s...%s." msgstr "" #: src/language/control/do-if.c:180 #, c-format msgid "This command may not follow %s in %s ... %s." msgstr "" #: src/language/control/loop.c:211 msgid "Only one index clause may be specified." msgstr "" #: src/language/control/repeat.c:120 #, c-format msgid "Dummy variable name `%s' hides dictionary variable `%s'." msgstr "" #: src/language/control/repeat.c:126 #, c-format msgid "Dummy variable name `%s' is given twice." msgstr "" #: src/language/control/repeat.c:170 #, c-format msgid "" "Dummy variable `%s' had %zu substitutions, so `%s' must also, but %zu were " "specified." msgstr "" #: src/language/control/repeat.c:379 msgid "Ranges may only have integer bounds." msgstr "" #: src/language/control/repeat.c:393 #, c-format msgid "%ld TO %ld is an invalid range." msgstr "" #: src/language/control/repeat.c:443 #, c-format msgid "No matching %s." msgstr "" #: src/language/control/temporary.c:44 msgid "" "This command may only appear once between procedures and procedure-like " "commands." msgstr "" #: src/language/dictionary/attributes.c:104 msgid "Attribute array index must be between 1 and 65535." msgstr "" #: src/language/dictionary/apply-dictionary.c:74 #, c-format msgid "Variable %s is %s in target file, but %s in source file." msgstr "" #: src/language/dictionary/apply-dictionary.c:110 msgid "No matching variables found between the source and target files." msgstr "" #: src/language/dictionary/delete-variables.c:40 #: src/language/dictionary/modify-variables.c:79 #: src/language/dictionary/rename-variables.c:51 #, c-format msgid "" "%s may not be used after %s. Temporary transformations will be made " "permanent." msgstr "" #: src/language/dictionary/delete-variables.c:48 #: src/language/dictionary/modify-variables.c:312 #, c-format msgid "" "%s may not be used to delete all variables from the active dataset " "dictionary. Use %s instead." msgstr "" #: src/language/dictionary/missing-values.c:70 #, c-format msgid "" "Cannot mix numeric variables (e.g. %s) and string variables (e.g. %s) within " "a single list." msgstr "" #: src/language/dictionary/missing-values.c:91 msgid "" "Too many numeric missing values. At most three individual values or one " "value and one range are allowed." msgstr "" #: src/language/dictionary/missing-values.c:126 #, c-format msgid "Truncating missing value to maximum acceptable length (%d bytes)." msgstr "" #: src/language/dictionary/missing-values.c:137 msgid "" "Too many string missing values. At most three individual values are allowed." msgstr "" #: src/language/dictionary/missing-values.c:154 #, c-format msgid "Missing values provided are too long to assign to variable of width %d." msgstr "" #: src/language/dictionary/modify-variables.c:145 msgid "Cannot specify ALL after specifying a set of variables." msgstr "" #: src/language/dictionary/modify-variables.c:221 #: src/language/dictionary/rename-variables.c:76 #, c-format msgid "" "Differing number of variables in old name list (%zu) and in new name list " "(%zu)." msgstr "" #: src/language/dictionary/modify-variables.c:244 #: src/language/dictionary/modify-variables.c:294 #, c-format msgid "" "%s subcommand may be given at most once. It may not be given in conjunction " "with the %s subcommand." msgstr "" #: src/language/dictionary/modify-variables.c:331 #, c-format msgid "Unrecognized subcommand name `%s'." msgstr "" #: src/language/dictionary/modify-variables.c:334 msgid "Subcommand name expected." msgstr "" #: src/language/dictionary/mrsets.c:117 #, c-format msgid "" "VARIABLES specified only variable %s on %s, but at least two variables are " "required." msgstr "" #: src/language/dictionary/mrsets.c:150 msgid "Numeric VALUE must be an integer." msgstr "" #: src/language/dictionary/mrsets.c:230 src/language/dictionary/mrsets.c:268 #, c-format msgid "" "MDGROUP subcommand for group %s specifies a string VALUE, but the variables " "specified for this group are numeric." msgstr "" #: src/language/dictionary/mrsets.c:254 #, c-format msgid "" "VALUE string on MDGROUP subcommand for group %s is %d bytes long, but it " "must be no longer than the narrowest variable in the group, which is %s with " "a width of %d bytes." msgstr "" #: src/language/dictionary/mrsets.c:280 #, c-format msgid "" "MDGROUP subcommand for group %s specifies LABELSOURCE=VARLABEL but not " "CATEGORYLABELS=COUNTEDVALUES. Ignoring LABELSOURCE." msgstr "" #: src/language/dictionary/mrsets.c:286 #, c-format msgid "" "MDGROUP subcommand for group %s specifies both LABEL and LABELSOURCE, but " "only one of these subcommands may be used at a time. Ignoring LABELSOURCE." msgstr "" #: src/language/dictionary/mrsets.c:326 #, c-format msgid "" "Variables %s and %s specified as part of multiple dichotomy group %s have " "the same variable label. Categories represented by these variables will not " "be distinguishable in output." msgstr "" #: src/language/dictionary/mrsets.c:356 #, c-format msgid "" "Variable %s specified as part of multiple dichotomy group %s (which has " "CATEGORYLABELS=COUNTEDVALUES) has no value label for its counted value. " "This category will not be distinguishable in output." msgstr "" #: src/language/dictionary/mrsets.c:369 #, c-format msgid "" "Variables %s and %s specified as part of multiple dichotomy group %s (which " "has CATEGORYLABELS=COUNTEDVALUES) have the same value label for the group's " "counted value. These categories will not be distinguishable in output." msgstr "" #: src/language/dictionary/mrsets.c:426 #, c-format msgid "" "Variables specified on MCGROUP should have the same categories, but %s and " "%s (and possibly others) in multiple category group %s have different value " "labels for value %s." msgstr "" #: src/language/dictionary/mrsets.c:484 #, c-format msgid "No multiple response set named %s." msgstr "" #: src/language/dictionary/mrsets.c:533 msgid "" "The active dataset dictionary does not contain any multiple response sets." msgstr "" #: src/language/dictionary/mrsets.c:540 msgid "Multiple Response Sets" msgstr "" #: src/language/dictionary/mrsets.c:543 #: src/language/dictionary/sys-file-info.c:446 #: src/language/dictionary/sys-file-info.c:733 #: src/language/stats/autorecode.c:375 src/language/data-io/data-parser.c:679 #: src/language/data-io/data-parser.c:725 src/language/data-io/print.c:434 msgid "Attributes" msgstr "" #: src/language/dictionary/mrsets.c:544 #: src/language/dictionary/sys-file-info.c:191 #: src/language/dictionary/sys-file-info.c:301 #: src/language/dictionary/sys-file-info.c:302 #: src/language/dictionary/sys-file-info.c:455 #: src/language/dictionary/sys-file-info.c:570 #: src/ui/gui/psppire-var-sheet-header.c:67 src/ui/gui/compute.ui:157 msgid "Label" msgstr "" #: src/language/dictionary/mrsets.c:544 #: src/language/dictionary/sys-file-info.c:241 msgid "Encoding" msgstr "" #: src/language/dictionary/mrsets.c:544 msgid "Counted Value" msgstr "" #: src/language/dictionary/mrsets.c:544 msgid "Member Variables" msgstr "" #: src/language/dictionary/mrsets.c:547 #: src/language/dictionary/sys-file-info.c:470 #: src/ui/gui/psppire-var-sheet-header.c:55 msgid "Name" msgstr "" #: src/language/dictionary/mrsets.c:564 msgid "Dichotomies" msgstr "" #: src/language/dictionary/mrsets.c:565 src/language/stats/logistic.c:1391 msgid "Categories" msgstr "" #: src/language/dictionary/numeric.c:67 #, c-format msgid "Format type %s may not be used with a numeric variable." msgstr "" #: src/language/dictionary/numeric.c:86 src/language/dictionary/numeric.c:153 #, c-format msgid "There is already a variable named %s." msgstr "" #: src/language/dictionary/numeric.c:138 #, c-format msgid "Format type %s may not be used with a string variable." msgstr "" #: src/language/dictionary/rename-variables.c:92 #, c-format msgid "Renaming would duplicate variable name %s." msgstr "" #: src/language/dictionary/split-file.c:75 msgid "Split Values" msgstr "" #: src/language/dictionary/split-file.c:76 #: src/language/dictionary/split-file.c:77 #: src/language/dictionary/sys-file-info.c:696 #: src/language/stats/chisquare.c:195 src/language/stats/cochran.c:156 #: src/language/stats/cochran.c:185 src/language/stats/examine.c:841 #: src/language/stats/reliability.c:648 src/language/stats/reliability.c:651 #: src/language/stats/crosstabs.q:1303 src/language/stats/crosstabs.q:1325 #: src/language/stats/crosstabs.q:1365 src/language/stats/crosstabs.q:1412 msgid "Value" msgstr "" #: src/language/dictionary/split-file.c:79 #: src/language/dictionary/sys-file-info.c:734 #: src/language/stats/chisquare.c:246 src/language/stats/chisquare.c:328 #: src/language/stats/cochran.c:164 src/language/stats/correlations.c:100 #: src/language/stats/descriptives.c:1004 src/language/stats/friedman.c:226 #: src/language/stats/jonckheere-terpstra.c:377 #: src/language/stats/npar-summary.c:113 src/language/stats/quick-cluster.c:588 #: src/language/stats/runs.c:331 src/language/data-io/data-parser.c:683 #: src/language/data-io/data-parser.c:728 src/language/data-io/print.c:438 #: src/ui/gui/psppire-dictview.c:580 src/ui/gui/psppire-data-editor.c:502 msgid "Variable" msgstr "" #: src/language/dictionary/sys-file-info.c:184 msgid "File Information" msgstr "" #: src/language/dictionary/sys-file-info.c:185 msgid "Attribute" msgstr "" #: src/language/dictionary/sys-file-info.c:187 msgid "File" msgstr "" #: src/language/dictionary/sys-file-info.c:194 msgid "Created" msgstr "" #: src/language/dictionary/sys-file-info.c:203 msgid "Integer Format" msgstr "" #: src/language/dictionary/sys-file-info.c:205 msgid "Big Endian" msgstr "" #: src/language/dictionary/sys-file-info.c:206 msgid "Little Endian" msgstr "" #: src/language/dictionary/sys-file-info.c:207 #: src/language/dictionary/sys-file-info.c:216 #: src/language/dictionary/sys-file-info.c:223 src/language/utilities/set.q:930 msgid "Unknown" msgstr "" #: src/language/dictionary/sys-file-info.c:209 msgid "Real Format" msgstr "" #: src/language/dictionary/sys-file-info.c:211 msgid "IEEE 754 LE." msgstr "" #: src/language/dictionary/sys-file-info.c:212 msgid "IEEE 754 BE." msgstr "" #: src/language/dictionary/sys-file-info.c:213 msgid "VAX D." msgstr "" #: src/language/dictionary/sys-file-info.c:214 msgid "VAX G." msgstr "" #: src/language/dictionary/sys-file-info.c:215 msgid "IBM 390 Hex Long." msgstr "" #: src/language/dictionary/sys-file-info.c:218 #: src/language/dictionary/sys-file-info.c:443 #: src/language/stats/binomial.c:199 src/language/stats/correlations.c:131 #: src/language/stats/correlations.c:159 src/language/stats/descriptives.c:585 #: src/language/stats/factor.c:1658 src/language/stats/factor.c:1701 #: src/language/stats/factor.c:1860 src/language/stats/factor.c:2074 #: src/language/stats/frequencies.c:1583 #: src/language/stats/kruskal-wallis.c:254 #: src/language/stats/kruskal-wallis.c:303 #: src/language/stats/ks-one-sample.c:316 src/language/stats/logistic.c:1187 #: src/language/stats/mann-whitney.c:254 src/language/stats/means.c:718 #: src/language/stats/means.c:800 src/language/stats/median.c:358 #: src/language/stats/oneway.c:985 src/language/stats/oneway.c:1157 #: src/language/stats/reliability.c:591 src/language/stats/regression.c:924 #: src/language/stats/t-test-one-sample.c:132 #: src/language/stats/t-test-paired.c:157 src/language/data-io/list.c:104 #: src/ui/gui/variable-info.ui:25 msgid "Variables" msgstr "" #: src/language/dictionary/sys-file-info.c:221 src/language/stats/examine.c:929 #: src/language/stats/means.c:697 src/language/stats/reliability.c:548 #: src/language/stats/crosstabs.q:930 msgid "Cases" msgstr "" #: src/language/dictionary/sys-file-info.c:226 src/language/stats/oneway.c:980 #: src/ui/gui/psppire-var-sheet-header.c:58 src/ui/gui/compute.ui:303 msgid "Type" msgstr "" #: src/language/dictionary/sys-file-info.c:230 msgid "Weight" msgstr "" #: src/language/dictionary/sys-file-info.c:233 msgid "Not weighted" msgstr "" #: src/language/dictionary/sys-file-info.c:235 msgid "Compression" msgstr "" #: src/language/dictionary/sys-file-info.c:245 #: src/language/dictionary/sys-file-info.c:424 #: src/language/dictionary/sys-file-info.c:426 msgid "Documents" msgstr "" #: src/language/dictionary/sys-file-info.c:305 #: src/language/dictionary/sys-file-info.c:430 msgid "(none)" msgstr "" #: src/language/dictionary/sys-file-info.c:393 msgid "No variables to display." msgstr "" #: src/language/dictionary/sys-file-info.c:404 msgid "Macros not supported." msgstr "" #: src/language/dictionary/sys-file-info.c:426 msgid "Document" msgstr "" #: src/language/dictionary/sys-file-info.c:454 msgid "Position" msgstr "" #: src/language/dictionary/sys-file-info.c:456 msgid "Measurement Level" msgstr "" #: src/language/dictionary/sys-file-info.c:457 #: src/ui/gui/psppire-var-sheet-header.c:85 msgid "Role" msgstr "" #: src/language/dictionary/sys-file-info.c:458 #: src/ui/gui/psppire-var-sheet-header.c:61 src/ui/gui/compute.ui:215 msgid "Width" msgstr "" #: src/language/dictionary/sys-file-info.c:459 msgid "Alignment" msgstr "" #: src/language/dictionary/sys-file-info.c:460 #: src/language/dictionary/sys-file-info.c:734 msgid "Print Format" msgstr "" #: src/language/dictionary/sys-file-info.c:461 msgid "Write Format" msgstr "" #: src/language/dictionary/sys-file-info.c:462 #: src/ui/gui/missing-val-dialog.c:379 src/ui/gui/psppire-var-sheet-header.c:73 #: src/ui/gui/examine.ui:416 src/ui/gui/t-test.ui:105 msgid "Missing Values" msgstr "" #: src/language/dictionary/sys-file-info.c:567 #: src/ui/gui/psppire-var-sheet-header.c:70 src/ui/gui/val-labs-dialog.c:489 #: src/ui/gui/val-labs-dialog.ui:194 msgid "Value Labels" msgstr "" #: src/language/dictionary/sys-file-info.c:573 msgid "Variable Value" msgstr "" #: src/language/dictionary/sys-file-info.c:577 msgid "User-missing value" msgstr "" #: src/language/dictionary/sys-file-info.c:693 msgid "Variable and Dataset Attributes" msgstr "" #: src/language/dictionary/sys-file-info.c:699 msgid "Variable and Name" msgstr "" #: src/language/dictionary/sys-file-info.c:702 msgid "(dataset)" msgstr "" #: src/language/dictionary/sys-file-info.c:722 msgid "No vectors defined." msgstr "" #: src/language/dictionary/sys-file-info.c:732 msgid "Vectors" msgstr "" #: src/language/dictionary/sys-file-info.c:736 msgid "Vector and Position" msgstr "" #: src/language/dictionary/sys-file-info.c:998 msgid "No valid encodings found." msgstr "" #: src/language/dictionary/sys-file-info.c:1004 #, c-format msgid "Usable encodings for %s." msgstr "" #: src/language/dictionary/sys-file-info.c:1007 #, c-format msgid "" "Encodings that can successfully read %s (by specifying the encoding name on " "the GET command's ENCODING subcommand). Encodings that yield identical text " "are listed together." msgstr "" #: src/language/dictionary/sys-file-info.c:1012 #: src/language/dictionary/sys-file-info.c:1013 msgid "Encodings" msgstr "" #: src/language/dictionary/sys-file-info.c:1042 #, c-format msgid "%s Encoded Text Strings" msgstr "" #: src/language/dictionary/sys-file-info.c:1046 msgid "" "Text strings in the file dictionary that the previously listed encodings " "interpret differently, along with the interpretations." msgstr "" #: src/language/dictionary/sys-file-info.c:1049 src/output/text-item.c:57 #: src/ui/gui/psppire-import-assistant.c:885 msgid "Text" msgstr "" #: src/language/dictionary/sys-file-info.c:1059 msgid "Purpose" msgstr "" #: src/language/dictionary/value-labels.c:154 #, c-format msgid "Truncating value label to %d bytes." msgstr "" #: src/language/dictionary/vector.c:66 #, c-format msgid "A vector named %s already exists." msgstr "" #: src/language/dictionary/vector.c:74 #, c-format msgid "Vector name %s is given twice." msgstr "" #: src/language/dictionary/vector.c:98 msgid "A slash must separate each vector specification in VECTOR's long form." msgstr "" #: src/language/dictionary/vector.c:131 msgid "Vectors must have at least one element." msgstr "" #: src/language/dictionary/vector.c:151 msgid "expecting vector length" msgstr "" #: src/language/dictionary/vector.c:170 #, c-format msgid "%s is an existing variable name." msgstr "" #: src/language/dictionary/variable-display.c:121 msgid "Variable display width must be a positive integer." msgstr "" #: src/language/dictionary/weight.c:49 msgid "The weighting variable must be numeric." msgstr "" #: src/language/dictionary/weight.c:54 msgid "The weighting variable may not be scratch." msgstr "" #: src/language/tests/moments-test.c:50 msgid "expecting weight value" msgstr "" #: src/language/utilities/cd.c:45 src/language/utilities/include.c:173 #, c-format msgid "Cannot change directory to %s: %s" msgstr "" #: src/language/utilities/date.c:33 #, c-format msgid "Only %s is currently implemented." msgstr "" #: src/language/utilities/host.c:60 msgid "Time limit not supported on this platform." msgstr "" #: src/language/utilities/host.c:74 #, c-format msgid "%s: Command exited with status %d." msgstr "" #: src/language/utilities/host.c:95 #, c-format msgid "Failed to create temporary file (%s)." msgstr "" #: src/language/utilities/host.c:102 #, c-format msgid "/dev/null: Failed to open (%s)." msgstr "" #: src/language/utilities/host.c:117 #, c-format msgid "Couldn't fork: %s." msgstr "" #: src/language/utilities/host.c:193 #, c-format msgid "While running \"%s\", waiting for child process failed (%s)." msgstr "" #: src/language/utilities/host.c:203 #, c-format msgid "Command \"%s\" timed out." msgstr "" #: src/language/utilities/host.c:205 #, c-format msgid "Command \"%s\" terminated by signal %d." msgstr "" #: src/language/utilities/host.c:212 msgid "Command or shell not found" msgstr "" #: src/language/utilities/host.c:214 msgid "Could not invoke command or shell" msgstr "" #: src/language/utilities/host.c:217 #, c-format msgid "Command \"%s\" exited with status %d (%s)." msgstr "" #: src/language/utilities/host.c:220 #, c-format msgid "Command \"%s\" exited with status %d." msgstr "" #: src/language/utilities/host.c:230 #, c-format msgid "Command \"%s\" output could not be read (%s)." msgstr "" #: src/language/utilities/title.c:88 #, c-format msgid " (Entered %s)" msgstr "" #: src/language/utilities/include.c:73 #, c-format msgid "Can't find `%s' in include file search path." msgstr "" #: src/language/utilities/output.c:128 #, c-format msgid "Unknown cell class %s." msgstr "" #: src/language/utilities/permissions.c:113 #, c-format msgid "Cannot stat %s: %s" msgstr "" #: src/language/utilities/permissions.c:127 #, c-format msgid "Cannot change mode of %s: %s" msgstr "" #: src/language/stats/aggregate.c:96 msgid "Sum of values" msgstr "" #: src/language/stats/aggregate.c:97 msgid "Mean average" msgstr "" #: src/language/stats/aggregate.c:98 msgid "Median average" msgstr "" #: src/language/stats/aggregate.c:99 #: src/ui/gui/psppire-dialog-action-descriptives.c:40 #: src/ui/gui/psppire-dialog-action-frequencies.c:41 msgid "Standard deviation" msgstr "" #: src/language/stats/aggregate.c:100 #: src/ui/gui/psppire-dialog-action-descriptives.c:42 msgid "Maximum value" msgstr "" #: src/language/stats/aggregate.c:101 #: src/ui/gui/psppire-dialog-action-descriptives.c:41 msgid "Minimum value" msgstr "" #: src/language/stats/aggregate.c:102 msgid "Percentage greater than" msgstr "" #: src/language/stats/aggregate.c:103 msgid "Percentage less than" msgstr "" #: src/language/stats/aggregate.c:104 msgid "Percentage included in range" msgstr "" #: src/language/stats/aggregate.c:105 msgid "Percentage excluded from range" msgstr "" #: src/language/stats/aggregate.c:106 msgid "Fraction greater than" msgstr "" #: src/language/stats/aggregate.c:107 msgid "Fraction less than" msgstr "" #: src/language/stats/aggregate.c:108 msgid "Fraction included in range" msgstr "" #: src/language/stats/aggregate.c:109 msgid "Fraction excluded from range" msgstr "" #: src/language/stats/aggregate.c:110 msgid "Number of cases" msgstr "" #: src/language/stats/aggregate.c:111 msgid "Number of cases (unweighted)" msgstr "" #: src/language/stats/aggregate.c:112 msgid "Number of missing values" msgstr "" #: src/language/stats/aggregate.c:113 msgid "Number of missing values (unweighted)" msgstr "" #: src/language/stats/aggregate.c:114 msgid "First non-missing value" msgstr "" #: src/language/stats/aggregate.c:115 msgid "Last non-missing value" msgstr "" #: src/language/stats/aggregate.c:258 msgid "" "When PRESORTED is specified, specifying sorting directions with (A) or (D) " "has no effect. Output data will be sorted the same way as the input data." msgstr "" #: src/language/stats/aggregate.c:448 msgid "expecting aggregation function" msgstr "" #: src/language/stats/aggregate.c:460 #, c-format msgid "Unknown aggregation function %s." msgstr "" #: src/language/stats/aggregate.c:513 #, c-format msgid "Missing argument %zu to %s." msgstr "" #: src/language/stats/aggregate.c:522 #, c-format msgid "Arguments to %s must be of same type as source variables." msgstr "" #: src/language/stats/aggregate.c:541 #, c-format msgid "" "Number of source variables (%zu) does not match number of target variables " "(%zu)." msgstr "" #: src/language/stats/aggregate.c:557 #, c-format msgid "" "The value arguments passed to the %s function are out-of-order. They will " "be treated as if they had been specified in the correct order." msgstr "" #: src/language/stats/aggregate.c:631 #, c-format msgid "" "Variable name %s is not unique within the aggregate file dictionary, which " "contains the aggregate variables and the break variables." msgstr "" #: src/language/stats/autorecode.c:152 #, c-format msgid "Source variable count (%zu) does not match target variable count (%zu)." msgstr "" #: src/language/stats/autorecode.c:164 #, c-format msgid "Target variable %s duplicates existing variable %s." msgstr "" #: src/language/stats/autorecode.c:221 #, c-format msgid "" "With GROUP, variables may not mix string variables (such as %s) and numeric " "variables (such as %s)." msgstr "" #: src/language/stats/autorecode.c:363 msgid "Recoding grouped variables." msgstr "" #: src/language/stats/autorecode.c:365 #, c-format msgid "Recoding %s into %s (%s)." msgstr "" #: src/language/stats/autorecode.c:369 #, c-format msgid "Recoding %s into %s." msgstr "" #: src/language/stats/autorecode.c:376 src/ui/gui/recode.ui:209 msgid "New Value" msgstr "" #: src/language/stats/autorecode.c:376 msgid "Value Label" msgstr "" #: src/language/stats/autorecode.c:379 msgid "Old Value" msgstr "" #: src/language/stats/binomial.c:138 #, c-format msgid "Variable %s is not dichotomous" msgstr "" #: src/language/stats/binomial.c:182 src/ui/gui/binomial.ui:30 msgid "Binomial Test" msgstr "" #: src/language/stats/binomial.c:186 src/language/stats/chisquare.c:183 #: src/language/stats/chisquare.c:239 src/language/stats/chisquare.c:322 #: src/language/stats/cochran.c:188 src/language/stats/correlations.c:94 #: src/language/stats/correlations.c:145 src/language/stats/descriptives.c:991 #: src/language/stats/examine.c:602 src/language/stats/examine.c:742 #: src/language/stats/examine.c:836 src/language/stats/examine.c:925 #: src/language/stats/factor.c:1755 src/language/stats/factor.c:1878 #: src/language/stats/factor.c:1908 src/language/stats/factor.c:2068 #: src/language/stats/factor.c:2102 src/language/stats/frequencies.c:302 #: src/language/stats/frequencies.c:1579 src/language/stats/frequencies.c:1586 #: src/language/stats/friedman.c:250 src/language/stats/glm.c:729 #: src/language/stats/kruskal-wallis.c:249 #: src/language/stats/kruskal-wallis.c:297 #: src/language/stats/ks-one-sample.c:278 src/language/stats/logistic.c:1170 #: src/language/stats/logistic.c:1300 src/language/stats/logistic.c:1330 #: src/language/stats/jonckheere-terpstra.c:361 #: src/language/stats/mann-whitney.c:184 src/language/stats/mann-whitney.c:247 #: src/language/stats/means.c:757 src/language/stats/means.c:811 #: src/language/stats/mcnemar.c:222 src/language/stats/median.c:315 #: src/language/stats/median.c:350 src/language/stats/npar-summary.c:106 #: src/language/stats/oneway.c:973 src/language/stats/oneway.c:1051 #: src/language/stats/oneway.c:1150 src/language/stats/oneway.c:1238 #: src/language/stats/oneway.c:1373 src/language/stats/quick-cluster.c:746 #: src/language/stats/reliability.c:543 src/language/stats/reliability.c:584 #: src/language/stats/reliability.c:633 src/language/stats/reliability.c:644 #: src/language/stats/roc.c:969 src/language/stats/roc.c:1067 #: src/language/stats/regression.c:867 src/language/stats/regression.c:899 #: src/language/stats/regression.c:1023 src/language/stats/regression.c:1089 #: src/language/stats/runs.c:318 src/language/stats/sign.c:102 #: src/language/stats/t-test-indep.c:193 src/language/stats/t-test-indep.c:259 #: src/language/stats/t-test-one-sample.c:68 #: src/language/stats/t-test-one-sample.c:125 #: src/language/stats/t-test-paired.c:150 #: src/language/stats/t-test-paired.c:193 #: src/language/stats/t-test-paired.c:238 src/language/stats/wilcoxon.c:243 #: src/language/stats/wilcoxon.c:282 src/language/stats/crosstabs.q:925 #: src/language/stats/crosstabs.q:1253 src/language/stats/crosstabs.q:1293 #: src/language/stats/crosstabs.q:1302 src/language/stats/crosstabs.q:1331 #: src/language/stats/crosstabs.q:1373 src/language/stats/crosstabs.q:1418 #: src/ui/gui/crosstabs.ui:499 src/ui/gui/oneway.ui:615 #, fuzzy msgid "Statistics" msgstr "Statistický program" #: src/language/stats/binomial.c:187 src/language/stats/chisquare.c:240 #: src/language/stats/chisquare.c:252 msgid "Category" msgstr "" #: src/language/stats/binomial.c:188 src/language/stats/cochran.c:189 #: src/language/stats/correlations.c:97 src/language/stats/correlations.c:155 #: src/language/stats/descriptives.c:993 src/language/stats/examine.c:926 #: src/language/stats/frequencies.c:1588 src/language/stats/friedman.c:251 #: src/language/stats/kruskal-wallis.c:250 #: src/language/stats/ks-one-sample.c:279 src/language/stats/logistic.c:1331 #: src/language/stats/jonckheere-terpstra.c:369 #: src/language/stats/mann-whitney.c:185 src/language/stats/means.c:710 #: src/language/stats/means-calc.c:439 src/language/stats/mcnemar.c:223 #: src/language/stats/median.c:351 src/language/stats/npar-summary.c:107 #: src/language/stats/oneway.c:1052 src/language/stats/reliability.c:544 #: src/language/stats/sign.c:69 src/language/stats/sign.c:70 #: src/language/stats/t-test-indep.c:194 #: src/language/stats/t-test-one-sample.c:126 #: src/language/stats/t-test-paired.c:151 #: src/language/stats/t-test-paired.c:194 src/language/stats/wilcoxon.c:244 #: src/language/stats/crosstabs.q:926 msgid "N" msgstr "" #: src/language/stats/binomial.c:189 msgid "Observed Prop." msgstr "" #: src/language/stats/binomial.c:190 msgid "Test Prop." msgstr "" #: src/language/stats/binomial.c:192 src/language/stats/mcnemar.c:224 #: src/language/stats/sign.c:103 src/language/stats/wilcoxon.c:288 #: src/language/stats/crosstabs.q:1306 msgid "Exact Sig. (2-tailed)" msgstr "" #: src/language/stats/binomial.c:193 src/language/stats/mcnemar.c:225 #: src/language/stats/sign.c:104 src/language/stats/wilcoxon.c:289 #: src/language/stats/crosstabs.q:1307 msgid "Exact Sig. (1-tailed)" msgstr "" #: src/language/stats/binomial.c:195 msgid "Groups" msgstr "" #: src/language/stats/binomial.c:196 msgid "Group 1" msgstr "" #: src/language/stats/binomial.c:196 msgid "Group 2" msgstr "" #: src/language/stats/binomial.c:196 src/language/stats/chisquare.c:223 #: src/language/stats/chisquare.c:257 src/language/stats/examine.c:930 #: src/language/stats/factor.c:1756 src/language/stats/frequencies.c:344 #: src/language/stats/glm.c:811 src/language/stats/kruskal-wallis.c:285 #: src/language/stats/logistic.c:1336 src/language/stats/mann-whitney.c:197 #: src/language/stats/means.c:706 src/language/stats/oneway.c:982 #: src/language/stats/oneway.c:1072 src/language/stats/reliability.c:549 #: src/language/stats/regression.c:1031 src/language/stats/sign.c:75 #: src/language/stats/wilcoxon.c:250 #: src/ui/gui/psppire-dialog-action-crosstabs.c:93 #: src/language/stats/crosstabs.q:931 src/language/stats/crosstabs.q:1218 msgid "Total" msgstr "" #: src/language/stats/chisquare.c:171 #, c-format msgid "" "CHISQUARE test specified %d expected values, but variable %s has %zu " "distinct values." msgstr "" #: src/language/stats/chisquare.c:184 src/language/stats/chisquare.c:241 msgid "Observed N" msgstr "" #: src/language/stats/chisquare.c:185 src/language/stats/chisquare.c:242 msgid "Expected N" msgstr "" #: src/language/stats/chisquare.c:186 src/language/stats/chisquare.c:243 #: src/language/stats/regression.c:1031 #: src/ui/gui/psppire-dialog-action-crosstabs.c:95 #: src/language/stats/crosstabs.q:1267 msgid "Residual" msgstr "" #: src/language/stats/chisquare.c:235 src/language/stats/cochran.c:150 #: src/language/stats/median.c:305 src/language/stats/sign.c:66 #: src/ui/gui/frequencies.ui:676 msgid "Frequencies" msgstr "" #: src/language/stats/chisquare.c:320 src/language/stats/cochran.c:181 #: src/language/stats/friedman.c:246 src/language/stats/kruskal-wallis.c:295 #: src/language/stats/mann-whitney.c:244 src/language/stats/mcnemar.c:219 #: src/language/stats/median.c:347 src/language/stats/sign.c:100 #: src/language/stats/wilcoxon.c:279 msgid "Test Statistics" msgstr "" #: src/language/stats/chisquare.c:323 msgid "Chi-square" msgstr "" #: src/language/stats/chisquare.c:324 src/language/stats/cochran.c:191 #: src/language/stats/examine.c:675 src/language/stats/factor.c:2107 #: src/language/stats/friedman.c:257 src/language/stats/glm.c:733 #: src/language/stats/kruskal-wallis.c:299 src/language/stats/logistic.c:1174 #: src/language/stats/median.c:354 src/language/stats/oneway.c:975 #: src/language/stats/oneway.c:1242 src/language/stats/regression.c:1025 #: src/language/stats/t-test-indep.c:267 #: src/language/stats/t-test-one-sample.c:75 #: src/language/stats/t-test-paired.c:253 src/language/stats/crosstabs.q:1304 msgid "df" msgstr "" #: src/language/stats/chisquare.c:325 src/language/stats/cochran.c:192 #: src/language/stats/friedman.c:258 src/language/stats/kruskal-wallis.c:300 #: src/language/stats/median.c:355 msgid "Asymp. Sig." msgstr "" #: src/language/stats/cochran.c:111 msgid "More than two values encountered. Cochran Q test will not be run." msgstr "" #: src/language/stats/cochran.c:153 #, c-format msgid "Success (%.*g)" msgstr "" #: src/language/stats/cochran.c:154 #, c-format msgid "Failure (%.*g)" msgstr "" #: src/language/stats/cochran.c:190 msgid "Cochran's Q" msgstr "" #: src/language/stats/correlations.c:91 src/language/stats/descriptives.c:987 #: src/language/stats/factor.c:2065 src/language/stats/npar-summary.c:102 msgid "Descriptive Statistics" msgstr "" #: src/language/stats/correlations.c:95 src/language/stats/descriptives.c:108 #: src/language/stats/examine.c:742 src/language/stats/factor.c:2069 #: src/language/stats/frequencies.c:141 src/language/stats/graph.c:211 #: src/language/stats/ks-one-sample.c:290 src/language/stats/means-calc.c:438 #: src/language/stats/npar-summary.c:108 src/language/stats/oneway.c:1052 #: src/language/stats/t-test-indep.c:195 #: src/language/stats/t-test-one-sample.c:127 #: src/language/stats/t-test-paired.c:152 #: src/language/stats/t-test-paired.c:241 #: src/ui/gui/psppire-dialog-action-descriptives.c:39 #: src/ui/gui/psppire-dialog-action-frequencies.c:40 msgid "Mean" msgstr "" #: src/language/stats/correlations.c:96 src/language/stats/examine.c:751 #: src/language/stats/factor.c:2070 src/language/stats/ks-one-sample.c:290 #: src/language/stats/means-calc.c:440 src/language/stats/npar-summary.c:109 #: src/language/stats/oneway.c:1052 src/language/stats/t-test-indep.c:196 #: src/language/stats/t-test-one-sample.c:128 #: src/language/stats/t-test-paired.c:153 #: src/language/stats/t-test-paired.c:242 msgid "Std. Deviation" msgstr "" #: src/language/stats/correlations.c:126 msgid "Correlations" msgstr "" #: src/language/stats/correlations.c:146 msgid "Pearson Correlation" msgstr "" #: src/language/stats/correlations.c:147 src/language/stats/oneway.c:1243 #: src/language/stats/t-test-indep.c:268 #: src/language/stats/t-test-one-sample.c:76 #: src/language/stats/t-test-paired.c:254 msgid "Sig. (2-tailed)" msgstr "" #: src/language/stats/correlations.c:147 src/language/stats/factor.c:1913 msgid "Sig. (1-tailed)" msgstr "" #: src/language/stats/correlations.c:151 msgid "Cross-products" msgstr "" #: src/language/stats/correlations.c:152 msgid "Covariance" msgstr "" #: src/language/stats/correlations.c:165 msgid "Significant at .05 level" msgstr "" #: src/language/stats/correlations.c:234 msgid "The data for the chosen variables are all missing or empty." msgstr "" #: src/language/stats/correlations.c:390 src/language/stats/descriptives.c:368 #: src/language/data-io/list.c:166 msgid "No variables specified." msgstr "" #: src/language/stats/descriptives.c:109 src/language/stats/frequencies.c:142 #: src/language/stats/means-calc.c:445 src/language/stats/t-test-indep.c:197 #: src/language/stats/t-test-one-sample.c:129 #: src/language/stats/t-test-paired.c:154 #: src/language/stats/t-test-paired.c:243 msgid "S.E. Mean" msgstr "" #: src/language/stats/descriptives.c:110 src/language/stats/frequencies.c:145 msgid "Std Dev" msgstr "" #: src/language/stats/descriptives.c:111 src/language/stats/examine.c:750 #: src/language/stats/frequencies.c:146 src/language/stats/means-calc.c:450 #: src/ui/gui/psppire-dialog-action-descriptives.c:46 #: src/ui/gui/psppire-dialog-action-frequencies.c:45 msgid "Variance" msgstr "" #: src/language/stats/descriptives.c:112 src/language/stats/examine.c:752 #: src/language/stats/frequencies.c:147 src/language/stats/means-calc.c:451 #: src/ui/gui/psppire-dialog-action-descriptives.c:47 #: src/ui/gui/psppire-dialog-action-frequencies.c:50 msgid "Kurtosis" msgstr "" #: src/language/stats/descriptives.c:113 src/language/stats/frequencies.c:148 #: src/language/stats/means-calc.c:452 msgid "S.E. Kurt" msgstr "" #: src/language/stats/descriptives.c:114 src/language/stats/examine.c:752 #: src/language/stats/frequencies.c:149 src/language/stats/means-calc.c:453 #: src/ui/gui/psppire-dialog-action-descriptives.c:48 #: src/ui/gui/psppire-dialog-action-frequencies.c:46 msgid "Skewness" msgstr "" #: src/language/stats/descriptives.c:115 src/language/stats/frequencies.c:150 #: src/language/stats/means-calc.c:454 msgid "S.E. Skew" msgstr "" #: src/language/stats/descriptives.c:116 src/language/stats/examine.c:751 #: src/language/stats/frequencies.c:151 src/language/stats/means-calc.c:449 #: src/ui/gui/psppire-dialog-action-descriptives.c:43 #: src/ui/gui/psppire-dialog-action-frequencies.c:48 msgid "Range" msgstr "" #: src/language/stats/descriptives.c:117 src/language/stats/examine.c:751 #: src/language/stats/frequencies.c:152 src/language/stats/graph.c:214 #: src/language/stats/ks-one-sample.c:285 src/language/stats/means-calc.c:447 #: src/language/stats/npar-summary.c:110 src/language/stats/oneway.c:1061 #: src/ui/gui/psppire-dialog-action-descriptives.c:41 #: src/ui/gui/psppire-dialog-action-frequencies.c:42 msgid "Minimum" msgstr "" #: src/language/stats/descriptives.c:118 src/language/stats/examine.c:751 #: src/language/stats/frequencies.c:153 src/language/stats/graph.c:213 #: src/language/stats/ks-one-sample.c:285 src/language/stats/means-calc.c:448 #: src/language/stats/npar-summary.c:110 src/language/stats/oneway.c:1061 #: src/ui/gui/psppire-dialog-action-descriptives.c:42 #: src/ui/gui/psppire-dialog-action-frequencies.c:43 msgid "Maximum" msgstr "" #: src/language/stats/descriptives.c:119 src/language/stats/frequencies.c:154 #: src/language/stats/graph.c:212 src/language/stats/means-calc.c:446 #: src/ui/gui/psppire-dialog-action-descriptives.c:44 #: src/ui/gui/psppire-dialog-action-frequencies.c:53 msgid "Sum" msgstr "" #: src/language/stats/descriptives.c:350 #, c-format msgid "Z-score variable name %s would be a duplicate variable name." msgstr "" #: src/language/stats/descriptives.c:401 msgid "" "DESCRIPTIVES with Z scores ignores TEMPORARY. Temporary transformations " "will be made permanent." msgstr "" #: src/language/stats/descriptives.c:478 msgid "expecting statistic name: reverting to default" msgstr "" #: src/language/stats/descriptives.c:561 msgid "" "Ran out of generic names for Z-score variables. There are only 126 generic " "names: ZSC001-ZSC0999, STDZ01-STDZ09, ZZZZ01-ZZZZ09, ZQZQ01-ZQZQ09." msgstr "" #: src/language/stats/descriptives.c:579 msgid "Mapping of Variables to Z-scores" msgstr "" #: src/language/stats/descriptives.c:581 msgid "Names" msgstr "" #: src/language/stats/descriptives.c:582 src/language/stats/glm.c:739 #: src/language/stats/regression.c:1030 msgid "Source" msgstr "" #: src/language/stats/descriptives.c:582 msgid "Target" msgstr "" #: src/language/stats/descriptives.c:659 #, c-format msgid "Internal error processing Z scores. Please report this to %s." msgstr "" #: src/language/stats/descriptives.c:759 #, c-format msgid "Z-score of %s" msgstr "" #: src/language/stats/descriptives.c:1028 src/language/stats/roc.c:1029 msgid "Valid N (listwise)" msgstr "" #: src/language/stats/descriptives.c:1028 msgid "Missing N (listwise)" msgstr "" #: src/language/stats/examine.c:75 msgid " (missing)" msgstr "" #: src/language/stats/examine.c:225 #, c-format msgid "Boxplot of %s vs. %s" msgstr "" #: src/language/stats/examine.c:231 src/language/stats/examine.c:338 #, c-format msgid "Boxplot of %s" msgstr "" #: src/language/stats/examine.c:321 msgid "Boxplot" msgstr "" #: src/language/stats/examine.c:418 msgid "Not creating NP plot because data set is empty." msgstr "" #: src/language/stats/examine.c:478 #, c-format msgid "Not creating spreadlevel chart for %s" msgstr "" #: src/language/stats/examine.c:585 msgid "User-missing value." msgstr "" #: src/language/stats/examine.c:591 src/language/stats/examine.c:595 #: src/language/stats/frequencies.c:1606 msgid "Percentiles" msgstr "" #: src/language/stats/examine.c:603 src/math/percentiles.c:37 msgid "Weighted Average" msgstr "" #: src/language/stats/examine.c:603 msgid "Tukey's Hinges" msgstr "" #: src/language/stats/examine.c:610 src/language/stats/examine.c:685 #: src/language/stats/examine.c:759 src/language/stats/examine.c:858 #: src/language/stats/examine.c:938 src/language/stats/mann-whitney.c:200 #: src/language/stats/median.c:319 src/language/stats/t-test-indep.c:227 #: src/language/stats/t-test-indep.c:282 #: src/language/stats/t-test-one-sample.c:87 msgid "Dependent Variables" msgstr "" #: src/language/stats/examine.c:669 msgid "Tests of Normality" msgstr "" #: src/language/stats/examine.c:673 msgid "Shapiro-Wilk" msgstr "" #: src/language/stats/examine.c:674 src/language/stats/examine.c:739 #: src/ui/gui/psppire-checkbox-treeview.c:73 #, fuzzy msgid "Statistic" msgstr "Statistický program" #: src/language/stats/examine.c:676 src/language/stats/factor.c:2108 #: src/language/stats/glm.c:736 src/language/stats/logistic.c:1175 #: src/language/stats/oneway.c:978 src/language/stats/oneway.c:1154 #: src/language/stats/oneway.c:1376 src/language/stats/regression.c:906 #: src/language/stats/regression.c:1028 src/language/stats/t-test-indep.c:263 #: src/language/stats/t-test-paired.c:196 msgid "Sig." msgstr "" #: src/language/stats/examine.c:735 src/language/stats/oneway.c:1045 #: src/ui/gui/descriptives.ui:25 msgid "Descriptives" msgstr "" #: src/language/stats/examine.c:738 msgid "Aspect" msgstr "" #: src/language/stats/examine.c:739 src/language/stats/oneway.c:1053 #: src/language/stats/oneway.c:1240 src/language/stats/oneway.c:1375 #: src/language/stats/roc.c:975 src/language/stats/regression.c:902 msgid "Std. Error" msgstr "" #: src/language/stats/examine.c:745 src/language/stats/oneway.c:1056 #, c-format msgid "%g%% Confidence Interval for Mean" msgstr "" #: src/language/stats/examine.c:747 src/language/stats/oneway.c:1058 #: src/language/stats/oneway.c:1382 src/language/stats/roc.c:982 #: src/language/stats/regression.c:913 msgid "Lower Bound" msgstr "" #: src/language/stats/examine.c:748 src/language/stats/oneway.c:1059 #: src/language/stats/oneway.c:1383 src/language/stats/roc.c:983 #: src/language/stats/regression.c:914 msgid "Upper Bound" msgstr "" #: src/language/stats/examine.c:750 msgid "5% Trimmed Mean" msgstr "" #: src/language/stats/examine.c:750 src/language/stats/frequencies.c:143 #: src/language/stats/means-calc.c:442 src/language/stats/median.c:352 #: src/ui/gui/psppire-dialog-action-frequencies.c:52 msgid "Median" msgstr "" #: src/language/stats/examine.c:752 msgid "Interquartile Range" msgstr "" #: src/language/stats/examine.c:832 msgid "Extreme Values" msgstr "" #: src/language/stats/examine.c:840 src/language/stats/quick-cluster.c:664 #: src/language/data-io/list.c:110 msgid "Case Number" msgstr "" #: src/language/stats/examine.c:844 msgid "Order" msgstr "" #. TRANSLATORS: This is a noun, not an adjective. #: src/language/stats/examine.c:850 msgid "Extreme" msgstr "" #: src/language/stats/examine.c:851 msgid "Highest" msgstr "" #: src/language/stats/examine.c:851 msgid "Lowest" msgstr "" #: src/language/stats/examine.c:921 src/language/stats/logistic.c:1328 #: src/language/stats/means.c:694 src/language/stats/reliability.c:540 msgid "Case Processing Summary" msgstr "" #: src/language/stats/examine.c:927 src/language/stats/frequencies.c:304 #: src/language/stats/frequencies.c:1494 src/language/stats/logistic.c:1332 #: src/language/stats/means.c:713 src/language/stats/reliability.c:545 #: src/language/stats/crosstabs.q:927 msgid "Percent" msgstr "" #: src/language/stats/examine.c:929 src/language/stats/frequencies.c:321 #: src/language/stats/frequencies.c:1590 src/language/stats/quick-cluster.c:766 #: src/language/stats/reliability.c:548 src/language/stats/crosstabs.q:931 msgid "Valid" msgstr "" #: src/language/stats/examine.c:929 src/language/stats/frequencies.c:336 #: src/language/stats/frequencies.c:1591 src/language/stats/crosstabs.q:931 msgid "Missing" msgstr "" #: src/language/stats/examine.c:1550 #, c-format msgid "%s may not be negative. Using default value (%g)." msgstr "" #: src/language/stats/examine.c:1587 msgid "Percentiles must lie in the range (0, 100)" msgstr "" #: src/language/stats/examine.c:1777 #, c-format msgid "%s and %s are mutually exclusive" msgstr "" #: src/language/stats/factor.c:1121 #, c-format msgid "Matrix input for %s must be either COV or CORR" msgstr "" #: src/language/stats/factor.c:1519 msgid "Factor analysis on a single variable is not useful." msgstr "" #: src/language/stats/factor.c:1523 msgid "Factor analysis without variables is not possible." msgstr "" #: src/language/stats/factor.c:1634 msgid "Component Number" msgstr "" #: src/language/stats/factor.c:1634 msgid "Factor Number" msgstr "" #: src/language/stats/factor.c:1648 src/language/stats/factor.c:1651 msgid "Communalities" msgstr "" #: src/language/stats/factor.c:1653 msgid "Initial" msgstr "" #: src/language/stats/factor.c:1655 msgid "Extraction" msgstr "" #: src/language/stats/factor.c:1697 src/language/stats/factor.c:1777 #: src/language/stats/factor.c:1839 msgid "Component" msgstr "" #: src/language/stats/factor.c:1697 src/language/stats/factor.c:1777 #: src/language/stats/factor.c:1839 msgid "Factor" msgstr "" #: src/language/stats/factor.c:1752 msgid "Total Variance Explained" msgstr "" #: src/language/stats/factor.c:1758 #, no-c-format msgid "% of Variance" msgstr "" #: src/language/stats/factor.c:1760 #, no-c-format msgid "Cumulative %" msgstr "" #: src/language/stats/factor.c:1763 msgid "Phase" msgstr "" #: src/language/stats/factor.c:1765 msgid "Initial Eigenvalues" msgstr "" #: src/language/stats/factor.c:1769 msgid "Extraction Sums of Squared Loadings" msgstr "" #: src/language/stats/factor.c:1773 msgid "Rotation Sums of Squared Loadings" msgstr "" #: src/language/stats/factor.c:1835 msgid "Factor Correlation Matrix" msgstr "" #: src/language/stats/factor.c:1842 msgid "Factor 2" msgstr "" #: src/language/stats/factor.c:1874 msgid "Anti-Image Matrices" msgstr "" #: src/language/stats/factor.c:1879 msgid "Anti-image Covariance" msgstr "" #: src/language/stats/factor.c:1880 msgid "Anti-image Correlation" msgstr "" #: src/language/stats/factor.c:1901 msgid "Correlation Matrix" msgstr "" #: src/language/stats/factor.c:1910 src/language/stats/t-test-paired.c:195 msgid "Correlation" msgstr "" #: src/language/stats/factor.c:1947 msgid "Determinant" msgstr "" #: src/language/stats/factor.c:1958 msgid "Covariance Matrix" msgstr "" #: src/language/stats/factor.c:1990 msgid "" "The dataset contains no complete observations. No analysis will be performed." msgstr "" #: src/language/stats/factor.c:2014 msgid "The dataset has no complete covariance or correlation matrix." msgstr "" #: src/language/stats/factor.c:2071 msgid "Analysis N" msgstr "" #: src/language/stats/factor.c:2099 msgid "KMO and Bartlett's Test" msgstr "" #: src/language/stats/factor.c:2103 msgid "Kaiser-Meyer-Olkin Measure of Sampling Adequacy" msgstr "" #: src/language/stats/factor.c:2105 msgid "Bartlett's Test of Sphericity" msgstr "" #: src/language/stats/factor.c:2106 msgid "Approx. Chi-Square" msgstr "" #: src/language/stats/factor.c:2154 #, c-format msgid "" "The %s criteria result in zero factors extracted. Therefore no analysis will " "be performed." msgstr "" #: src/language/stats/factor.c:2161 #, c-format msgid "" "The %s criteria result in more factors than variables, which is not " "meaningful. No analysis will be performed." msgstr "" #: src/language/stats/factor.c:2254 msgid "Component Matrix" msgstr "" #: src/language/stats/factor.c:2254 msgid "Factor Matrix" msgstr "" #: src/language/stats/factor.c:2259 msgid "Pattern Matrix" msgstr "" #: src/language/stats/factor.c:2268 msgid "Structure Matrix" msgstr "" #: src/language/stats/factor.c:2270 msgid "Rotated Component Matrix" msgstr "" #: src/language/stats/factor.c:2271 msgid "Rotated Factor Matrix" msgstr "" #: src/language/stats/flip.c:100 #, c-format msgid "%s ignores %s. Temporary transformations will be made permanent." msgstr "" #: src/language/stats/flip.c:153 #, c-format msgid "Could not create temporary file for %s." msgstr "" #: src/language/stats/flip.c:341 #, c-format msgid "Error rewinding %s file: %s." msgstr "" #: src/language/stats/flip.c:348 #, c-format msgid "Error creating %s source file." msgstr "" #: src/language/stats/flip.c:361 #, c-format msgid "Error reading %s file: %s." msgstr "" #: src/language/stats/flip.c:363 #, c-format msgid "Unexpected end of file reading %s file." msgstr "" #: src/language/stats/flip.c:379 #, c-format msgid "Error seeking %s source file: %s." msgstr "" #: src/language/stats/flip.c:387 #, c-format msgid "Error writing %s source file: %s." msgstr "" #: src/language/stats/flip.c:402 #, c-format msgid "Error rewinding %s source file: %s." msgstr "" #: src/language/stats/flip.c:433 #, c-format msgid "Error reading %s temporary file: %s." msgstr "" #: src/language/stats/flip.c:436 #, c-format msgid "Unexpected end of file reading %s temporary file." msgstr "" #: src/language/stats/frequencies.c:144 #: src/ui/gui/psppire-dialog-action-frequencies.c:49 msgid "Mode" msgstr "" #: src/language/stats/frequencies.c:303 src/language/stats/logistic.c:1381 #: src/output/charts/plot-hist-cairo.c:112 msgid "Frequency" msgstr "" #: src/language/stats/frequencies.c:305 msgid "Valid Percent" msgstr "" #: src/language/stats/frequencies.c:306 src/language/stats/graph.c:208 msgid "Cumulative Percent" msgstr "" #: src/language/stats/frequencies.c:905 msgid "Histogram frequency must be greater than zero." msgstr "" #: src/language/stats/frequencies.c:923 msgid "Histogram percentage must be greater than zero." msgstr "" #: src/language/stats/frequencies.c:1139 #, c-format msgid "" "%s for histogram must be greater than or equal to %s, but %s was specified " "as %.15g and %s as %.15g. %s and %s will be ignored." msgstr "" #: src/language/stats/frequencies.c:1184 #, c-format msgid "" "%s for pie chart must be greater than or equal to %s, but %s was specified " "as %.15g and %s as %.15g. %s and %s will be ignored." msgstr "" #: src/language/stats/frequencies.c:1474 #, c-format msgid "Omitting pie chart for %s, which has only %d unique values." msgstr "" #: src/language/stats/frequencies.c:1477 #, c-format msgid "Omitting pie chart for %s, which has over 50 unique values." msgstr "" #: src/language/stats/frequencies.c:1494 src/language/stats/graph.c:205 #: src/language/stats/quick-cluster.c:747 #: src/ui/gui/psppire-dialog-action-crosstabs.c:90 #: src/language/stats/crosstabs.q:789 src/language/stats/crosstabs.q:1262 msgid "Count" msgstr "" #: src/language/stats/friedman.c:220 src/language/stats/kruskal-wallis.c:247 #: src/language/stats/mann-whitney.c:182 src/language/stats/wilcoxon.c:240 msgid "Ranks" msgstr "" #: src/language/stats/friedman.c:222 src/language/stats/friedman.c:223 #: src/language/stats/kruskal-wallis.c:251 #: src/language/stats/mann-whitney.c:186 src/language/stats/wilcoxon.c:245 msgid "Mean Rank" msgstr "" #: src/language/stats/friedman.c:253 msgid "Kendall's W" msgstr "" #: src/language/stats/friedman.c:256 src/language/stats/kruskal-wallis.c:298 #: src/language/stats/median.c:353 msgid "Chi-Square" msgstr "" #: src/language/stats/glm.c:169 msgid "Multivariate analysis is not yet implemented" msgstr "" #: src/language/stats/glm.c:274 msgid "Only types 1, 2 & 3 sums of squares are currently implemented" msgstr "" #: src/language/stats/glm.c:727 msgid "Tests of Between-Subjects Effects" msgstr "" #: src/language/stats/glm.c:730 msgid "Type I Sum Of Squares" msgstr "" #: src/language/stats/glm.c:731 msgid "Type II Sum Of Squares" msgstr "" #: src/language/stats/glm.c:732 msgid "Type III Sum Of Squares" msgstr "" #: src/language/stats/glm.c:734 src/language/stats/oneway.c:976 #: src/language/stats/regression.c:1026 msgid "Mean Square" msgstr "" #: src/language/stats/glm.c:735 src/language/stats/oneway.c:977 #: src/language/stats/regression.c:1027 src/language/stats/t-test-indep.c:262 msgid "F" msgstr "" #: src/language/stats/glm.c:740 msgid "Corrected Model" msgstr "" #: src/language/stats/glm.c:740 msgid "Model" msgstr "" #: src/language/stats/glm.c:752 msgid "Intercept" msgstr "" #: src/language/stats/glm.c:802 src/output/pivot-table.c:763 #: src/output/spv/spv.c:867 msgid "Error" msgstr "" #: src/language/stats/glm.c:819 msgid "Corrected Total" msgstr "" #: src/language/stats/graph.c:206 msgid "Percentage" msgstr "" #: src/language/stats/graph.c:207 msgid "Cumulative Count" msgstr "" #: src/language/stats/graph.c:296 #, c-format msgid "%s vs. %s by %s" msgstr "" #: src/language/stats/graph.c:303 #, c-format msgid "%s vs. %s" msgstr "" #: src/language/stats/graph.c:322 msgid "" "Maximum number of scatterplot categories reached. Your BY variable has too " "many distinct values. The coloring of the plot will not be correct." msgstr "" #: src/language/stats/graph.c:551 src/language/stats/rank.c:636 #, c-format msgid "%s of %s" msgstr "" #: src/language/stats/graph.c:698 src/language/stats/graph.c:729 #: src/language/stats/graph.c:777 msgid "Only one chart type is allowed." msgstr "" #: src/language/stats/graph.c:721 src/language/stats/graph.c:820 #: src/language/stats/graph.c:834 msgid "Only one variable is allowed." msgstr "" #: src/language/stats/graph.c:843 msgid "Variable expected" msgstr "" #: src/language/stats/graph.c:883 msgid "FOOTNOTE is not implemented yet for GRAPH" msgstr "" #: src/language/stats/ks-one-sample.c:274 src/ui/gui/ks-one-sample.ui:24 msgid "One-Sample Kolmogorov-Smirnov Test" msgstr "" #: src/language/stats/ks-one-sample.c:284 msgid "Uniform Parameters" msgstr "" #: src/language/stats/ks-one-sample.c:289 msgid "Normal Parameters" msgstr "" #: src/language/stats/ks-one-sample.c:294 msgid "Poisson Parameters" msgstr "" #: src/language/stats/ks-one-sample.c:295 #: src/ui/gui/psppire-dialog-action-crosstabs.c:76 #: src/language/stats/crosstabs.q:1421 msgid "Lambda" msgstr "" #: src/language/stats/ks-one-sample.c:300 msgid "Exponential Parameters" msgstr "" #: src/language/stats/ks-one-sample.c:308 msgid "Most Extreme Differences" msgstr "" #: src/language/stats/ks-one-sample.c:309 msgid "Absolute" msgstr "" #: src/language/stats/ks-one-sample.c:309 src/language/stats/roc.c:1037 msgid "Positive" msgstr "" #: src/language/stats/ks-one-sample.c:309 src/language/stats/roc.c:1037 msgid "Negative" msgstr "" #: src/language/stats/ks-one-sample.c:312 msgid "Kolmogorov-Smirnov Z" msgstr "" #: src/language/stats/ks-one-sample.c:313 #: src/language/stats/jonckheere-terpstra.c:374 #: src/language/stats/mann-whitney.c:251 src/language/stats/runs.c:328 #: src/language/stats/wilcoxon.c:284 msgid "Asymp. Sig. (2-tailed)" msgstr "" #: src/language/stats/logistic.c:327 msgid "All predicted values are either 1 or 0" msgstr "" #: src/language/stats/logistic.c:525 msgid "Dependent variable's values are not dichotomous." msgstr "" #: src/language/stats/logistic.c:614 #, c-format msgid "" "Category %s does not have at least two distinct values. Logistic regression " "will not be run." msgstr "" #: src/language/stats/logistic.c:674 #, c-format msgid "" "Estimation terminated at iteration number %d because parameter estimates " "changed by less than %g" msgstr "" #: src/language/stats/logistic.c:686 #, c-format msgid "" "Estimation terminated at iteration number %d because Log Likelihood " "decreased by less than %g%%" msgstr "" #: src/language/stats/logistic.c:701 #, c-format msgid "" "Estimation terminated at iteration number %d because maximum iterations has " "been reached" msgstr "" #: src/language/stats/logistic.c:994 msgid "Cut point value must be in the range [0,1]" msgstr "" #: src/language/stats/logistic.c:1139 msgid "Dependent Variable Encoding" msgstr "" #: src/language/stats/logistic.c:1141 msgid "Mapping" msgstr "" #: src/language/stats/logistic.c:1142 msgid "Internal Value" msgstr "" #: src/language/stats/logistic.c:1145 msgid "Original Value" msgstr "" #: src/language/stats/logistic.c:1167 msgid "Variables in the Equation" msgstr "" #: src/language/stats/logistic.c:1171 src/language/stats/regression.c:902 msgid "B" msgstr "" #: src/language/stats/logistic.c:1172 msgid "S.E." msgstr "" #: src/language/stats/logistic.c:1173 msgid "Wald" msgstr "" #: src/language/stats/logistic.c:1176 msgid "Exp(B)" msgstr "" #: src/language/stats/logistic.c:1181 #, c-format msgid "%d%% CI for Exp(B)" msgstr "" #: src/language/stats/logistic.c:1183 src/language/stats/t-test-indep.c:274 #: src/language/stats/t-test-one-sample.c:83 #: src/language/stats/t-test-paired.c:249 src/language/stats/crosstabs.q:1369 msgid "Lower" msgstr "" #: src/language/stats/logistic.c:1183 src/language/stats/t-test-indep.c:275 #: src/language/stats/t-test-one-sample.c:84 #: src/language/stats/t-test-paired.c:250 src/language/stats/crosstabs.q:1370 msgid "Upper" msgstr "" #: src/language/stats/logistic.c:1189 src/language/stats/logistic.c:1470 msgid "Step 1" msgstr "" #: src/language/stats/logistic.c:1263 msgid "Constant" msgstr "" #: src/language/stats/logistic.c:1298 msgid "Model Summary" msgstr "" #: src/language/stats/logistic.c:1301 msgid "-2 Log likelihood" msgstr "" #: src/language/stats/logistic.c:1302 msgid "Cox & Snell R Square" msgstr "" #: src/language/stats/logistic.c:1303 msgid "Nagelkerke R Square" msgstr "" #: src/language/stats/logistic.c:1306 src/language/stats/logistic.c:1470 msgid "Step" msgstr "" #: src/language/stats/logistic.c:1335 msgid "Unweighted Cases" msgstr "" #: src/language/stats/logistic.c:1336 msgid "Included in Analysis" msgstr "" #: src/language/stats/logistic.c:1336 msgid "Missing Cases" msgstr "" #: src/language/stats/logistic.c:1365 msgid "Categorical Variables' Codings" msgstr "" #: src/language/stats/logistic.c:1380 msgid "Codings" msgstr "" #: src/language/stats/logistic.c:1383 msgid "Parameter coding" msgstr "" #: src/language/stats/logistic.c:1462 msgid "Classification Table" msgstr "" #: src/language/stats/logistic.c:1466 msgid "Predicted" msgstr "" #: src/language/stats/logistic.c:1466 msgid "Percentage Correct" msgstr "" #: src/language/stats/logistic.c:1468 msgid "Observed" msgstr "" #: src/language/stats/logistic.c:1468 msgid "Overall Percentage" msgstr "" #: src/language/stats/jonckheere-terpstra.c:357 msgid "Jonckheere-Terpstra Test" msgstr "" #: src/language/stats/jonckheere-terpstra.c:364 #, c-format msgid "Number of levels in %s" msgstr "" #: src/language/stats/jonckheere-terpstra.c:370 msgid "Observed J-T Statistic" msgstr "" #: src/language/stats/jonckheere-terpstra.c:371 msgid "Mean J-T Statistic" msgstr "" #: src/language/stats/jonckheere-terpstra.c:372 msgid "Std. Deviation of J-T Statistic" msgstr "" #: src/language/stats/jonckheere-terpstra.c:373 msgid "Std. J-T Statistic" msgstr "" #: src/language/stats/mann-whitney.c:187 src/language/stats/wilcoxon.c:246 msgid "Sum of Ranks" msgstr "" #: src/language/stats/mann-whitney.c:248 msgid "Mann-Whitney U" msgstr "" #: src/language/stats/mann-whitney.c:249 msgid "Wilcoxon W" msgstr "" #: src/language/stats/mann-whitney.c:250 src/language/stats/runs.c:327 #: src/language/stats/wilcoxon.c:283 msgid "Z" msgstr "" #: src/language/stats/means.c:702 msgid "Included" msgstr "" #: src/language/stats/means.c:704 src/language/stats/reliability.c:548 msgid "Excluded" msgstr "" #: src/language/stats/means.c:753 msgid "Report" msgstr "" #: src/language/stats/means.c:838 #, c-format msgid "" "The table \"%s\" has no non-empty control variables. No result for this " "table will be displayed." msgstr "" #: src/language/stats/means-calc.c:443 msgid "Group Median" msgstr "" #: src/language/stats/means-calc.c:455 msgid "First" msgstr "" #: src/language/stats/means-calc.c:456 msgid "Last" msgstr "" #: src/language/stats/means-calc.c:458 msgid "Percent N" msgstr "" #: src/language/stats/means-calc.c:459 msgid "Percent Sum" msgstr "" #: src/language/stats/means-calc.c:461 msgid "Harmonic Mean" msgstr "" #: src/language/stats/means-calc.c:462 msgid "Geom. Mean" msgstr "" #: src/language/stats/mcnemar.c:144 msgid "The McNemar test is appropriate only for dichotomous variables" msgstr "" #: src/language/stats/mcnemar.c:226 src/language/stats/sign.c:105 msgid "Point Probability" msgstr "" #: src/language/stats/mcnemar.c:229 src/language/stats/sign.c:78 #: src/language/stats/sign.c:108 src/language/stats/t-test-paired.c:199 #: src/language/stats/t-test-paired.c:257 src/language/stats/wilcoxon.c:253 #: src/language/stats/wilcoxon.c:292 msgid "Pairs" msgstr "" #: src/language/stats/median.c:316 msgid "> Median" msgstr "" #: src/language/stats/median.c:316 msgid "≤ Median" msgstr "" #: src/language/stats/npar.c:536 #, c-format msgid "%s subcommand not currently implemented." msgstr "" #: src/language/stats/npar.c:691 #, c-format msgid "Expecting %s, %s, %s or a number." msgstr "" #: src/language/stats/npar.c:845 #, c-format msgid "" "The specified value of HI (%d) is lower than the specified value of LO (%d)" msgstr "" #: src/language/stats/npar.c:897 #, c-format msgid "" "%d expected values were given, but the specified range (%d-%d) requires " "exactly %d values." msgstr "" #: src/language/stats/npar.c:1118 src/language/stats/t-test-parser.c:173 #, c-format msgid "" "PAIRED was specified but the number of variables preceding WITH (%zu) did " "not match the number following (%zu)." msgstr "" #: src/language/stats/oneway.c:361 msgid "LSD" msgstr "" #: src/language/stats/oneway.c:362 src/ui/gui/oneway.ui:338 msgid "Tukey HSD" msgstr "" #: src/language/stats/oneway.c:363 src/ui/gui/oneway.ui:253 msgid "Bonferroni" msgstr "" #: src/language/stats/oneway.c:364 src/ui/gui/oneway.ui:304 msgid "Scheffé" msgstr "" #: src/language/stats/oneway.c:365 msgid "Games-Howell" msgstr "" #: src/language/stats/oneway.c:366 src/ui/gui/oneway.ui:321 msgid "Šidák" msgstr "" #: src/language/stats/oneway.c:519 #, c-format msgid "The post hoc analysis method %s is not supported." msgstr "" #: src/language/stats/oneway.c:842 #, c-format msgid "" "Dependent variable %s has no non-missing values. No analysis for this " "variable will be done." msgstr "" #: src/language/stats/oneway.c:924 #, c-format msgid "" "In contrast list %zu, the number of coefficients (%zu) does not equal the " "number of groups (%d). This contrast list will be ignored." msgstr "" #: src/language/stats/oneway.c:936 #, c-format msgid "Coefficients for contrast %zu do not total zero" msgstr "" #: src/language/stats/oneway.c:971 msgid "ANOVA" msgstr "" #: src/language/stats/oneway.c:974 src/language/stats/regression.c:1024 msgid "Sum of Squares" msgstr "" #: src/language/stats/oneway.c:981 msgid "Between Groups" msgstr "" #: src/language/stats/oneway.c:981 msgid "Within Groups" msgstr "" #: src/language/stats/oneway.c:1075 src/language/stats/oneway.c:1257 msgid "Dependent Variable" msgstr "" #: src/language/stats/oneway.c:1148 msgid "Test of Homogeneity of Variances" msgstr "" #: src/language/stats/oneway.c:1151 msgid "Levene Statistic" msgstr "" #: src/language/stats/oneway.c:1152 msgid "df1" msgstr "" #: src/language/stats/oneway.c:1153 msgid "df2" msgstr "" #: src/language/stats/oneway.c:1192 msgid "Contrast Coefficients" msgstr "" #: src/language/stats/oneway.c:1199 src/language/stats/oneway.c:1246 msgid "Contrast" msgstr "" #: src/language/stats/oneway.c:1236 msgid "Contrast Tests" msgstr "" #: src/language/stats/oneway.c:1239 msgid "Value of Contrast" msgstr "" #: src/language/stats/oneway.c:1241 src/language/stats/regression.c:905 #: src/language/stats/t-test-indep.c:266 #: src/language/stats/t-test-one-sample.c:74 #: src/language/stats/t-test-paired.c:252 msgid "t" msgstr "" #: src/language/stats/oneway.c:1252 msgid "Assumption" msgstr "" #: src/language/stats/oneway.c:1253 msgid "Assume equal variances" msgstr "" #: src/language/stats/oneway.c:1254 msgid "Does not assume equal variances" msgstr "" #: src/language/stats/oneway.c:1367 #, c-format msgid "Multiple Comparisons (%s)" msgstr "" #: src/language/stats/oneway.c:1374 msgid "Mean Difference (I - J)" msgstr "" #: src/language/stats/oneway.c:1379 #, c-format msgid "%g%% Confidence Interval" msgstr "" #: src/language/stats/oneway.c:1386 src/language/stats/oneway.c:1390 msgid "(J) Family" msgstr "" #: src/language/stats/oneway.c:1406 msgid "Test" msgstr "" #: src/language/stats/quick-cluster.c:576 msgid "Initial Cluster Centers" msgstr "" #: src/language/stats/quick-cluster.c:577 msgid "Final Cluster Centers" msgstr "" #: src/language/stats/quick-cluster.c:580 #: src/language/stats/quick-cluster.c:660 #: src/language/stats/quick-cluster.c:661 #: src/language/stats/quick-cluster.c:753 msgid "Cluster" msgstr "" #: src/language/stats/quick-cluster.c:658 msgid "Cluster Membership" msgstr "" #: src/language/stats/quick-cluster.c:744 msgid "Number of Cases in each Cluster" msgstr "" #: src/language/stats/quick-cluster.c:750 msgid "Clusters" msgstr "" #: src/language/stats/quick-cluster.c:867 #: src/language/stats/quick-cluster.c:893 #, c-format msgid "A variable called `%s' already exists." msgstr "" #: src/language/stats/quick-cluster.c:908 #, c-format msgid "Expecting %s or %s." msgstr "" #: src/language/stats/quick-cluster.c:928 msgid "The number of clusters must be positive" msgstr "" #: src/language/stats/quick-cluster.c:944 msgid "The convergence criterion must be positive" msgstr "" #: src/language/stats/quick-cluster.c:960 msgid "The number of iterations must be positive" msgstr "" #: src/language/stats/rank.c:205 #, c-format msgid "" "Cannot generate variable name for ranking %s with %s. All candidates in use." msgstr "" #: src/language/stats/rank.c:321 #, c-format msgid "Too many variables in %s clause." msgstr "" #: src/language/stats/rank.c:323 #, c-format msgid "Variable %s already exists." msgstr "" #: src/language/stats/rank.c:325 src/language/expressions/evaluate.c:164 #, c-format msgid "Duplicate variable name %s." msgstr "" #: src/language/stats/rank.c:631 #, c-format msgid "%s of %s by %s" msgstr "" #: src/language/stats/rank.c:825 msgid "Variables Created by RANK" msgstr "" #: src/language/stats/rank.c:828 src/language/stats/rank.c:829 msgid "New Variable" msgstr "" #: src/language/stats/rank.c:829 msgid "Function" msgstr "" #: src/language/stats/rank.c:830 msgid "Fraction" msgstr "" #: src/language/stats/rank.c:830 msgid "Grouping Variables" msgstr "" #: src/language/stats/rank.c:833 src/language/stats/rank.c:834 msgid "Existing Variable" msgstr "" #: src/language/stats/reliability.c:164 msgid "Reliability on a single variable is not useful." msgstr "" #: src/language/stats/reliability.c:281 msgid "" "The STATISTICS subcommand is not yet implemented. No statistics will be " "produced." msgstr "" #: src/language/stats/reliability.c:300 msgid "The split point must be less than the number of variables" msgstr "" #: src/language/stats/reliability.c:525 #, c-format msgid "Scale: %s" msgstr "" #: src/language/stats/reliability.c:582 msgid "Item-Total Statistics" msgstr "" #: src/language/stats/reliability.c:585 msgid "Scale Mean if Item Deleted" msgstr "" #: src/language/stats/reliability.c:586 msgid "Scale Variance if Item Deleted" msgstr "" #: src/language/stats/reliability.c:587 msgid "Corrected Item-Total Correlation" msgstr "" #: src/language/stats/reliability.c:588 msgid "Cronbach's Alpha if Item Deleted" msgstr "" #: src/language/stats/reliability.c:627 msgid "Reliability Statistics" msgstr "" #: src/language/stats/reliability.c:634 src/language/stats/reliability.c:646 msgid "Cronbach's Alpha" msgstr "" #: src/language/stats/reliability.c:635 src/language/stats/reliability.c:649 #: src/language/stats/reliability.c:652 msgid "N of Items" msgstr "" #: src/language/stats/reliability.c:647 msgid "Part 1" msgstr "" #: src/language/stats/reliability.c:650 msgid "Part 2" msgstr "" #: src/language/stats/reliability.c:654 msgid "Total N of Items" msgstr "" #: src/language/stats/reliability.c:656 msgid "Correlation Between Forms" msgstr "" #: src/language/stats/reliability.c:659 msgid "Spearman-Brown Coefficient" msgstr "" #: src/language/stats/reliability.c:660 msgid "Equal Length" msgstr "" #: src/language/stats/reliability.c:661 msgid "Unequal Length" msgstr "" #: src/language/stats/reliability.c:663 msgid "Guttman Split-Half Coefficient" msgstr "" #: src/language/stats/roc.c:966 msgid "Area Under the Curve" msgstr "" #: src/language/stats/roc.c:970 msgid "Area" msgstr "" #: src/language/stats/roc.c:976 msgid "Asymptotic Sig." msgstr "" #: src/language/stats/roc.c:979 #, c-format msgid "Asymp. %g%% Confidence Interval" msgstr "" #: src/language/stats/roc.c:987 msgid "Variable under test" msgstr "" #: src/language/stats/roc.c:1026 msgid "Case Summary" msgstr "" #: src/language/stats/roc.c:1030 msgid "Unweighted" msgstr "" #: src/language/stats/roc.c:1031 msgid "Weighted" msgstr "" #: src/language/stats/roc.c:1064 msgid "Coordinates of the Curve" msgstr "" #: src/language/stats/roc.c:1068 msgid "Positive if greater than or equal to" msgstr "" #: src/language/stats/roc.c:1069 src/output/charts/roc-chart-cairo.c:38 msgid "Sensitivity" msgstr "" #: src/language/stats/roc.c:1069 src/output/charts/roc-chart-cairo.c:37 msgid "1 - Specificity" msgstr "" #: src/language/stats/roc.c:1072 msgid "Coordinates" msgstr "" #: src/language/stats/roc.c:1076 msgid "Test variable" msgstr "" #: src/language/stats/regression.c:224 src/language/stats/regression.c:229 #, c-format msgid "VARIABLES may not appear after %s" msgstr "" #: src/language/stats/regression.c:412 msgid "" "REGRESSION with SAVE ignores TEMPORARY. Temporary transformations will be " "made permanent." msgstr "" #: src/language/stats/regression.c:416 msgid "REGRESSION with SAVE ignores FILTER. All cases will be processed." msgstr "" #: src/language/stats/regression.c:569 msgid "" "The dependent variable is equal to the independent variable. The least " "squares line is therefore Y=X. Standard errors and related statistics may be " "meaningless." msgstr "" #: src/language/stats/regression.c:776 msgid "No valid data found. This command was skipped." msgstr "" #: src/language/stats/regression.c:863 #, c-format msgid "Model Summary (%s)" msgstr "" #: src/language/stats/regression.c:868 #: src/ui/gui/psppire-dialog-action-regression.c:42 msgid "R" msgstr "" #: src/language/stats/regression.c:868 msgid "R Square" msgstr "" #: src/language/stats/regression.c:868 msgid "Adjusted R Square" msgstr "" #: src/language/stats/regression.c:869 msgid "Std. Error of the Estimate" msgstr "" #: src/language/stats/regression.c:895 #, c-format msgid "Coefficients (%s)" msgstr "" #: src/language/stats/regression.c:901 msgid "Unstandardized Coefficients" msgstr "" #: src/language/stats/regression.c:904 msgid "Standardized Coefficients" msgstr "" #: src/language/stats/regression.c:904 msgid "Beta" msgstr "" #: src/language/stats/regression.c:911 #, c-format msgid "%g%% Confidence Interval for B" msgstr "" #: src/language/stats/regression.c:919 #, fuzzy msgid "Collinearity Statistics" msgstr "Statistický program" #: src/language/stats/regression.c:920 msgid "Tolerance" msgstr "" #: src/language/stats/regression.c:920 msgid "VIF" msgstr "" #: src/language/stats/regression.c:933 msgid "(Constant)" msgstr "" #: src/language/stats/regression.c:1020 #, c-format msgid "ANOVA (%s)" msgstr "" #: src/language/stats/regression.c:1031 src/ui/gui/regression.ui:24 msgid "Regression" msgstr "" #: src/language/stats/regression.c:1075 #, c-format msgid "Coefficient Correlations (%s)" msgstr "" #: src/language/stats/regression.c:1082 msgid "Models" msgstr "" #: src/language/stats/regression.c:1090 msgid "Covariances" msgstr "" #: src/language/stats/runs.c:169 #, c-format msgid "" "Multiple modes exist for variable `%s'. Using %.*g as the threshold value." msgstr "" #: src/language/stats/runs.c:314 src/ui/gui/runs.ui:24 msgid "Runs Test" msgstr "" #: src/language/stats/runs.c:319 msgid "Test Value" msgstr "" #: src/language/stats/runs.c:320 msgid "Test Value (mode)" msgstr "" #: src/language/stats/runs.c:321 msgid "Test Value (mean)" msgstr "" #: src/language/stats/runs.c:322 msgid "Test Value (median)" msgstr "" #: src/language/stats/runs.c:323 msgid "Cases < Test Value" msgstr "" #: src/language/stats/runs.c:324 msgid "Cases ≥ Test Value" msgstr "" #: src/language/stats/runs.c:325 msgid "Total Cases" msgstr "" #: src/language/stats/runs.c:326 msgid "Number of Runs" msgstr "" #: src/language/stats/sign.c:72 msgid "Differences" msgstr "" #: src/language/stats/sign.c:73 msgid "Negative Differences" msgstr "" #: src/language/stats/sign.c:74 msgid "Positive Differences" msgstr "" #: src/language/stats/sign.c:75 src/language/stats/wilcoxon.c:250 msgid "Ties" msgstr "" #: src/language/stats/sort-cases.c:63 msgid "Buffer limit must be at least 2." msgstr "" #: src/language/stats/sort-criteria.c:89 #, c-format msgid "Variable %s specified twice in sort criteria." msgstr "" #: src/language/stats/t-test-indep.c:190 msgid "Group Statistics" msgstr "" #: src/language/stats/t-test-indep.c:200 msgid "Group" msgstr "" #: src/language/stats/t-test-indep.c:256 msgid "Independent Samples Test" msgstr "" #: src/language/stats/t-test-indep.c:261 msgid "Levene's Test for Equality of Variances" msgstr "" #: src/language/stats/t-test-indep.c:265 msgid "T-Test for Equality of Means" msgstr "" #: src/language/stats/t-test-indep.c:269 #: src/language/stats/t-test-one-sample.c:77 msgid "Mean Difference" msgstr "" #: src/language/stats/t-test-indep.c:270 msgid "Std. Error Difference" msgstr "" #: src/language/stats/t-test-indep.c:273 #, no-c-format msgid "95% Confidence Interval of the Difference" msgstr "" #: src/language/stats/t-test-indep.c:277 msgid "Assumptions" msgstr "" #: src/language/stats/t-test-indep.c:278 msgid "Equal variances assumed" msgstr "" #: src/language/stats/t-test-indep.c:279 msgid "Equal variances not assumed" msgstr "" #: src/language/stats/t-test-one-sample.c:64 msgid "One-Sample Test" msgstr "" #: src/language/stats/t-test-one-sample.c:71 #, c-format msgid "Test Value = %.*g" msgstr "" #: src/language/stats/t-test-one-sample.c:80 #: src/language/stats/t-test-paired.c:246 #, c-format msgid "%g%% Confidence Interval of the Difference" msgstr "" #: src/language/stats/t-test-one-sample.c:122 msgid "One-Sample Statistics" msgstr "" #: src/language/stats/t-test-paired.c:147 msgid "Paired Sample Statistics" msgstr "" #: src/language/stats/t-test-paired.c:163 #: src/language/stats/t-test-paired.c:205 #: src/language/stats/t-test-paired.c:263 #, c-format msgid "Pair %zu" msgstr "" #: src/language/stats/t-test-paired.c:190 msgid "Paired Samples Correlations" msgstr "" #: src/language/stats/t-test-paired.c:208 #, c-format msgid "%s & %s" msgstr "" #: src/language/stats/t-test-paired.c:234 msgid "Paired Samples Test" msgstr "" #: src/language/stats/t-test-paired.c:240 msgid "Paired Differences" msgstr "" #: src/language/stats/t-test-paired.c:266 #, c-format msgid "%s - %s" msgstr "" #: src/language/stats/t-test-parser.c:133 #, c-format msgid "When applying %s to a string variable, two values must be specified." msgstr "" #: src/language/stats/t-test-parser.c:145 #: src/language/stats/t-test-parser.c:241 #, c-format msgid "%s subcommand may not be used with %s." msgstr "" #: src/language/stats/t-test-parser.c:305 msgid "Exactly one of TESTVAL, GROUPS and PAIRS subcommands must be specified." msgstr "" #: src/language/stats/wilcoxon.c:248 msgid "Sign" msgstr "" #: src/language/stats/wilcoxon.c:249 msgid "Negative Ranks" msgstr "" #: src/language/stats/wilcoxon.c:249 msgid "Positive Ranks" msgstr "" #: src/language/stats/wilcoxon.c:296 msgid "Too many pairs to calculate exact significance" msgstr "" #: src/language/data-io/combine-files.c:214 msgid "Cannot specify the active dataset since none has been defined." msgstr "" #: src/language/data-io/combine-files.c:220 msgid "" "This command may not be used after TEMPORARY when the active dataset is an " "input source. Temporary transformations will be made permanent." msgstr "" #: src/language/data-io/combine-files.c:255 msgid "Multiple IN subcommands for a single FILE or TABLE." msgstr "" #: src/language/data-io/combine-files.c:308 #, c-format msgid "File %s lacks BY variable %s." msgstr "" #: src/language/data-io/combine-files.c:311 #, c-format msgid "Active dataset lacks BY variable %s." msgstr "" #: src/language/data-io/combine-files.c:388 #: src/language/data-io/combine-files.c:393 #, c-format msgid "BY is required when %s is specified." msgstr "" #: src/language/data-io/combine-files.c:521 msgid "" "Combining files with incompatible encodings. String data may not be " "represented correctly." msgstr "" #: src/language/data-io/combine-files.c:564 #, c-format msgid "" "Variable %s in file %s has different type or width from the same variable in " "earlier file." msgstr "" #: src/language/data-io/combine-files.c:570 #, c-format msgid "In file %s, %s is numeric." msgstr "" #: src/language/data-io/combine-files.c:573 #, c-format msgid "In file %s, %s is a string variable with width %d." msgstr "" #: src/language/data-io/combine-files.c:578 #, c-format msgid "In an earlier file, %s was numeric." msgstr "" #: src/language/data-io/combine-files.c:581 #, c-format msgid "In an earlier file, %s was a string variable with width %d." msgstr "" #: src/language/data-io/combine-files.c:621 #, c-format msgid "" "Variable name %s specified on %s subcommand duplicates an existing variable " "name." msgstr "" #: src/language/data-io/combine-files.c:793 #, c-format msgid "Encountered %zu sets of duplicate cases in the master file." msgstr "" #: src/language/data-io/data-list.c:129 src/language/data-io/data-list.c:144 #, c-format msgid "The %s value must be non-negative." msgstr "" #: src/language/data-io/data-list.c:154 #, c-format msgid "The %s subcommand may only be used within %s." msgstr "" #: src/language/data-io/data-list.c:159 #, c-format msgid "The %s subcommand may only be specified once." msgstr "" #: src/language/data-io/data-list.c:197 msgid "Only one of FIXED, FREE, or LIST may be specified." msgstr "" #: src/language/data-io/data-list.c:260 msgid "Encoding should not be specified for inline data. It will be ignored." msgstr "" #: src/language/data-io/data-list.c:269 #, c-format msgid "The %s subcommand may be used only with %s." msgstr "" #: src/language/data-io/data-list.c:284 src/language/data-io/matrix-data.c:578 msgid "At least one variable must be specified." msgstr "" #: src/language/data-io/data-list.c:383 src/language/data-io/data-list.c:491 #: src/language/data-io/get-data.c:662 #, c-format msgid "%s is a duplicate variable name." msgstr "" #: src/language/data-io/data-list.c:390 #, c-format msgid "There is already a variable %s of a different type." msgstr "" #: src/language/data-io/data-list.c:397 #, c-format msgid "There is already a string variable %s of a different width." msgstr "" #: src/language/data-io/data-list.c:405 #, c-format msgid "Cannot place variable %s on record %d when RECORDS=%d is specified." msgstr "" #: src/language/data-io/data-parser.c:453 #: src/language/data-io/data-parser.c:462 msgid "Quoted string extends beyond end of line." msgstr "" #: src/language/data-io/data-parser.c:488 msgid "Missing delimiter following quoted string." msgstr "" #: src/language/data-io/data-parser.c:506 #, c-format msgid "Data for variable %s is not valid as format %s: %s" msgstr "" #: src/language/data-io/data-parser.c:536 #, c-format msgid "Partial case of %d of %d records discarded." msgstr "" #: src/language/data-io/data-parser.c:592 #, c-format msgid "Partial case discarded. The first variable missing was %s." msgstr "" #: src/language/data-io/data-parser.c:634 #, c-format msgid "" "Missing value(s) for all variables from %s onward. These will be filled " "with the system-missing value or blanks, as appropriate." msgstr "" #: src/language/data-io/data-parser.c:655 msgid "Record ends in data not part of any field." msgstr "" #: src/language/data-io/data-parser.c:670 #, c-format msgid "Reading %d record from %s." msgid_plural "Reading %d records from %s." msgstr[0] "" msgstr[1] "" #: src/language/data-io/data-parser.c:680 src/language/data-io/print.c:435 msgid "Record" msgstr "" #: src/language/data-io/data-parser.c:680 src/language/data-io/print.c:435 #: src/ui/gui/psppire-var-sheet-header.c:76 msgid "Columns" msgstr "" #: src/language/data-io/data-parser.c:680 #: src/language/data-io/data-parser.c:725 src/language/data-io/print.c:435 msgid "Format" msgstr "" #: src/language/data-io/data-parser.c:720 #, c-format msgid "Reading free-form data from %s." msgstr "" #. TRANSLATORS: this fragment will be interpolated into #. messages in fh_lock() that identify types of files. #: src/language/data-io/data-reader.c:136 src/language/data-io/data-writer.c:79 msgid "data file" msgstr "" #: src/language/data-io/data-reader.c:160 #, c-format msgid "Could not open `%s' for reading as a data file: %s." msgstr "" #: src/language/data-io/data-reader.c:174 #, c-format msgid "Could not read `%s' as a text file with encoding `%s': %s." msgstr "" #: src/language/data-io/data-reader.c:233 #, c-format msgid "" "Missing %s while reading inline data. This probably indicates a missing or " "incorrectly formatted %s command. %s must appear by itself on a single line " "with exactly one space between words." msgstr "" #: src/language/data-io/data-reader.c:253 #: src/language/data-io/data-reader.c:387 #, c-format msgid "Error reading file %s: %s." msgstr "" #: src/language/data-io/data-reader.c:261 #, c-format msgid "Unexpected end of file in partial record reading %s." msgstr "" #: src/language/data-io/data-reader.c:321 #, c-format msgid "Corrupt block descriptor word at offset 0x%lx in %s." msgstr "" #: src/language/data-io/data-reader.c:322 #, c-format msgid "Corrupt record descriptor word at offset 0x%lx in %s." msgstr "" #: src/language/data-io/data-reader.c:335 #, c-format msgid "Corrupt record size at offset 0x%lx in %s." msgstr "" #: src/language/data-io/data-reader.c:493 msgid "Record exceeds remaining block length." msgstr "" #: src/language/data-io/data-reader.c:567 #, c-format msgid "Attempt to read beyond end-of-file on file %s." msgstr "" #: src/language/data-io/data-reader.c:570 #, c-format msgid "Attempt to read beyond %s." msgstr "" #: src/language/data-io/data-reader.c:733 msgid "" "This command is not valid here since the current input program does not " "access the inline file." msgstr "" #: src/language/data-io/data-writer.c:106 #, c-format msgid "An error occurred while opening `%s' for writing as a data file: %s." msgstr "" #: src/language/data-io/data-writer.c:224 #, c-format msgid "I/O error occurred writing data file `%s'." msgstr "" #: src/language/data-io/dataset.c:64 #, c-format msgid "There is no dataset named %s." msgstr "" #: src/language/data-io/dataset.c:250 msgid "Datasets" msgstr "" #: src/language/data-io/dataset.c:263 msgid "unnamed dataset" msgstr "" #: src/language/data-io/file-handle.c:61 #, c-format msgid "" "File handle %s is already defined. Use %s before redefining a file handle." msgstr "" #: src/language/data-io/file-handle.c:241 #, c-format msgid "%s must be specified with %s." msgstr "" #: src/language/data-io/file-handle.c:252 #, c-format msgid "" "The specified file mode requires LRECL. Assuming %zu-character records." msgstr "" #: src/language/data-io/file-handle.c:256 #, c-format msgid "" "Record length (%d) must be between 1 and %lu bytes. Assuming %zu-character " "records." msgstr "" #: src/language/data-io/file-handle.c:300 msgid "file" msgstr "" #: src/language/data-io/file-handle.c:302 msgid "inline file" msgstr "" #: src/language/data-io/file-handle.c:350 msgid "expecting a file name or handle name" msgstr "" #: src/language/data-io/file-handle.c:365 #, c-format msgid "Handle for %s not allowed here." msgstr "" #: src/language/data-io/get-data.c:108 src/output/measure.c:262 #, c-format msgid "error reading file `%s'" msgstr "" #: src/language/data-io/get-data.c:127 #, c-format msgid "Unsupported TYPE %s." msgstr "" #: src/language/data-io/get-data.c:278 msgid "The sheet index must be greater than or equal to 1" msgstr "" #: src/language/data-io/get-data.c:285 src/language/data-io/get-data.c:308 #: src/language/data-io/get-data.c:327 #, c-format msgid "%s must be followed by either \"%s\" or \"%s\"." msgstr "" #: src/language/data-io/get-data.c:357 #, c-format msgid "" "%s is allowed only with %s arrangement, but %s arrangement was stated or " "implied earlier in this command." msgstr "" #: src/language/data-io/get-data.c:441 src/language/data-io/get-data.c:479 #, c-format msgid "Value of %s must be 1 or greater." msgstr "" #: src/language/data-io/get-data.c:504 msgid "" "Ignoring obsolete IMPORTCASES subcommand. (N OF CASES or SAMPLE may be used " "to substitute.)" msgstr "" #: src/language/data-io/get-data.c:551 msgid "" "In compatible syntax mode, the QUALIFIER string must contain exactly one " "character." msgstr "" #: src/language/data-io/get-data.c:583 #, c-format msgid "" "The record number specified, %ld, is at or before the previous record, %d. " "Data fields must be listed in order of increasing record number." msgstr "" #: src/language/data-io/get-data.c:592 #, c-format msgid "" "The record number specified, %ld, exceeds the number of records per case " "specified on FIXCASE, %d." msgstr "" #: src/language/data-io/get.c:132 #, c-format msgid "%s: Data file dictionary has no variables." msgstr "" #: src/language/data-io/inpt-pgm.c:133 #, c-format msgid "Unexpected end-of-file within %s." msgstr "" #: src/language/data-io/inpt-pgm.c:146 #, c-format msgid "Input program must contain %s or %s." msgstr "" #: src/language/data-io/inpt-pgm.c:152 msgid "Input program did not create any variables." msgstr "" #: src/language/data-io/inpt-pgm.c:365 msgid "" "REREAD: Column numbers must be positive finite numbers. Column set to 1." msgstr "" #: src/language/data-io/list.c:100 msgid "Data List" msgstr "" #: src/language/data-io/list.c:221 #, c-format msgid "" "The first case (%ld) specified precedes the last case (%ld) specified. The " "values will be swapped." msgstr "" #: src/language/data-io/list.c:230 #, c-format msgid "" "The first case (%ld) to list is numbered less than 1. The value is being " "reset to 1." msgstr "" #: src/language/data-io/list.c:237 #, c-format msgid "" "The last case (%ld) to list is numbered less than 1. The value is being " "reset to 1." msgstr "" #: src/language/data-io/list.c:244 #, c-format msgid "The step value %ld is less than 1. The value is being reset to 1." msgstr "" #: src/language/data-io/placement-parser.c:96 #, c-format msgid "" "Number of variables specified (%zu) differs from number of variable formats " "(%zu)." msgstr "" #: src/language/data-io/placement-parser.c:106 msgid "" "SPSS-like or Fortran-like format specification expected after variable names." msgstr "" #: src/language/data-io/placement-parser.c:129 #, c-format msgid "The %d columns %d-%d can't be evenly divided into %zu fields." msgstr "" #: src/language/data-io/placement-parser.c:310 msgid "Column positions for fields must be positive." msgstr "" #: src/language/data-io/placement-parser.c:312 msgid "Column positions for fields must not be negative." msgstr "" #: src/language/data-io/placement-parser.c:372 msgid "The ending column for a field must be greater than the starting column." msgstr "" #: src/language/data-io/placement-parser.c:409 #, c-format msgid "" "The record number specified, %.0f, is at or before the previous record, %d. " "Data fields must be listed in order of increasing record number." msgstr "" #: src/language/data-io/print-space.c:127 #, c-format msgid "The expression on %s evaluated to the system-missing value." msgstr "" #: src/language/data-io/print-space.c:130 #, c-format msgid "The expression on %s evaluated to %g." msgstr "" #: src/language/data-io/print.c:189 src/language/data-io/trim.c:58 msgid "expecting a valid subcommand" msgstr "" #: src/language/data-io/print.c:219 #, c-format msgid "%s is required when binary formats are specified." msgstr "" #: src/language/data-io/print.c:302 #, c-format msgid "Output calls for %d records but %zu specified on RECORDS subcommand." msgstr "" #: src/language/data-io/print.c:432 msgid "Print Summary" msgstr "" #: src/language/data-io/print.c:462 msgid "N of Records" msgstr "" #: src/language/data-io/matrix-data.c:191 #, c-format msgid "" "There are %d variable declared but the data has at least %d matrix rows." msgstr "" #: src/language/data-io/matrix-data.c:292 msgid "" "The N subcommand was specified, but a N record was also found in the data. " "The N record will be ignored." msgstr "" #: src/language/data-io/matrix-data.c:488 src/language/utilities/set.q:186 #, c-format msgid "%s must not be negative." msgstr "" #: src/language/data-io/matrix-data.c:568 msgid "FORMAT = FULL and FORMAT = NODIAGONAL are mutually exclusive." msgstr "" #: src/language/data-io/matrix-reader.c:102 #: src/language/data-io/matrix-reader.c:118 #, c-format msgid "Matrix dataset lacks a variable called %s." msgstr "" #: src/language/data-io/matrix-reader.c:109 #: src/language/data-io/matrix-reader.c:125 #, c-format msgid "Matrix dataset variable %s should be of string type." msgstr "" #: src/language/data-io/save-translate.c:168 #: src/language/data-io/save-translate.c:183 #, c-format msgid "The %s string must contain exactly one character." msgstr "" #: src/language/data-io/save-translate.c:249 #, c-format msgid "Output file `%s' exists but %s was not specified." msgstr "" #: src/language/data-io/save.c:309 msgid "The OUTFILE or METADATA subcommand is required." msgstr "" #: src/language/data-io/trim.c:69 #, c-format msgid "" "Cannot rename %s as %s because there already exists a variable named %s. To " "rename variables with overlapping names, use a single RENAME subcommand such " "as `/RENAME (A=B)(B=C)(C=A)', or equivalently, `/RENAME (A B C=B C A)'." msgstr "" #: src/language/data-io/trim.c:227 #, c-format msgid "" "Number of variables on left side of `=' (%zu) does not match number of " "variables on right side (%zu), in parenthesized group %d of RENAME " "subcommand." msgstr "" #: src/language/data-io/trim.c:242 #, c-format msgid "Requested renaming duplicates variable name %s." msgstr "" #: src/language/data-io/trim.c:281 msgid "Cannot DROP all variables from dictionary." msgstr "" #: src/language/expressions/evaluate.c:151 msgid "expecting number or string" msgstr "" #: src/language/expressions/helpers.c:43 msgid "" "One of the arguments to a DATE function is not an integer. The result will " "be system-missing." msgstr "" #: src/language/expressions/helpers.c:71 msgid "" "The week argument to DATE.WKYR is not an integer. The result will be system-" "missing." msgstr "" #: src/language/expressions/helpers.c:77 msgid "" "The week argument to DATE.WKYR is outside the acceptable range of 1 to 53. " "The result will be system-missing." msgstr "" #: src/language/expressions/helpers.c:99 msgid "" "The day argument to DATE.YRDAY is not an integer. The result will be system-" "missing." msgstr "" #: src/language/expressions/helpers.c:105 msgid "" "The day argument to DATE.YRDAY is outside the acceptable range of 1 to 366. " "The result will be system-missing." msgstr "" #: src/language/expressions/helpers.c:127 msgid "" "The year argument to YRMODA is greater than 47516. The result will be " "system-missing." msgstr "" #: src/language/expressions/helpers.c:180 #, c-format msgid "" "Unrecognized date unit `%.*s'. Valid date units are `%s', `%s', `%s', `%s', " "`%s', `%s', `%s', and `%s'." msgstr "" #: src/language/expressions/helpers.c:333 #, c-format msgid "Invalid DATESUM method. Valid choices are `%s' and `%s'." msgstr "" #: src/language/expressions/parse.c:261 #, c-format msgid "" "Type mismatch: expression has %s type, but a numeric value is required here." msgstr "" #: src/language/expressions/parse.c:274 #, c-format msgid "" "Type mismatch: expression has %s type, but a string value is required here." msgstr "" #: src/language/expressions/parse.c:436 #, c-format msgid "Type mismatch while applying %s operator: cannot convert %s to %s." msgstr "" #: src/language/expressions/parse.c:650 msgid "" "Chaining relational operators (e.g. `a < b < c') will not produce the " "mathematically expected result. Use the AND logical operator to fix the " "problem (e.g. `a < b AND b < c'). If chaining is really intended, " "parentheses will disable this warning (e.g. `(a < b) < c'.)" msgstr "" #: src/language/expressions/parse.c:752 msgid "" "The exponentiation operator (`**') is left-associative, even though right-" "associative semantics are more useful. That is, `a**b**c' equals " "`(a**b)**c', not as `a**(b**c)'. To disable this warning, insert " "parentheses." msgstr "" #: src/language/expressions/parse.c:832 #, c-format msgid "Unknown system variable %s." msgstr "" #: src/language/expressions/parse.c:880 #, c-format msgid "Unknown identifier %s." msgstr "" #: src/language/expressions/parse.c:1102 #, c-format msgid "%s must have at least %d arguments in list." msgstr "" #: src/language/expressions/parse.c:1111 #, c-format msgid "%s must have an even number of arguments in list." msgstr "" #: src/language/expressions/parse.c:1114 #, c-format msgid "%s must have multiple of %d arguments in list." msgstr "" #: src/language/expressions/parse.c:1124 #, c-format msgid "%s function does not accept a minimum valid argument count." msgstr "" #: src/language/expressions/parse.c:1133 #, c-format msgid "%s requires at least %d valid arguments in list." msgstr "" #: src/language/expressions/parse.c:1139 #, c-format msgid "" "With %s, using minimum valid argument count of %d does not make sense when " "passing only %d arguments in list." msgstr "" #: src/language/expressions/parse.c:1193 #, c-format msgid "Type mismatch invoking %s as " msgstr "" #: src/language/expressions/parse.c:1198 msgid "Function invocation " msgstr "" #: src/language/expressions/parse.c:1200 msgid " does not match any known function. Candidates are:" msgstr "" #: src/language/expressions/parse.c:1230 #, c-format msgid "No function or vector named %s." msgstr "" #: src/language/expressions/parse.c:1292 #, c-format msgid "%s is a PSPP extension." msgstr "" #: src/language/expressions/parse.c:1295 #, c-format msgid "%s is not available in this version of PSPP." msgstr "" #: src/language/expressions/parse.c:1302 #, c-format msgid "%s may not appear after %s." msgstr "" #: src/libpspp/ext-array.c:66 msgid "failed to create temporary file" msgstr "" #: src/libpspp/ext-array.c:106 msgid "seeking in temporary file" msgstr "" #: src/libpspp/ext-array.c:125 msgid "reading temporary file" msgstr "" #: src/libpspp/ext-array.c:127 msgid "unexpected end of file reading temporary file" msgstr "" #: src/libpspp/ext-array.c:147 msgid "writing to temporary file" msgstr "" #: src/libpspp/i18n.c:1128 msgid "Arabic" msgstr "" #: src/libpspp/i18n.c:1130 msgid "Armenian" msgstr "" #: src/libpspp/i18n.c:1131 msgid "Baltic" msgstr "" #: src/libpspp/i18n.c:1133 msgid "Celtic" msgstr "" #: src/libpspp/i18n.c:1134 msgid "Central European" msgstr "" #: src/libpspp/i18n.c:1136 msgid "Chinese Simplified" msgstr "" #: src/libpspp/i18n.c:1138 msgid "Chinese Traditional" msgstr "" #: src/libpspp/i18n.c:1140 msgid "Croatian" msgstr "" #: src/libpspp/i18n.c:1141 msgid "Cyrillic" msgstr "" #: src/libpspp/i18n.c:1143 msgid "Cyrillic/Russian" msgstr "" #: src/libpspp/i18n.c:1144 msgid "Cyrillic/Ukrainian" msgstr "" #: src/libpspp/i18n.c:1146 msgid "Georgian" msgstr "" #: src/libpspp/i18n.c:1147 msgid "Greek" msgstr "" #: src/libpspp/i18n.c:1148 msgid "Gujarati" msgstr "" #: src/libpspp/i18n.c:1149 msgid "Gurmukhi" msgstr "" #: src/libpspp/i18n.c:1150 msgid "Hebrew" msgstr "" #: src/libpspp/i18n.c:1152 msgid "Hebrew Visual" msgstr "" #: src/libpspp/i18n.c:1153 msgid "Hindi" msgstr "" #: src/libpspp/i18n.c:1154 msgid "Icelandic" msgstr "" #: src/libpspp/i18n.c:1155 msgid "Japanese" msgstr "" #: src/libpspp/i18n.c:1157 msgid "Korean" msgstr "" #: src/libpspp/i18n.c:1159 msgid "Nordic" msgstr "" #: src/libpspp/i18n.c:1160 msgid "Romanian" msgstr "" #: src/libpspp/i18n.c:1162 msgid "South European" msgstr "" #: src/libpspp/i18n.c:1163 msgid "Thai" msgstr "" #: src/libpspp/i18n.c:1165 msgid "Turkish" msgstr "" #: src/libpspp/i18n.c:1167 msgid "Vietnamese" msgstr "" #: src/libpspp/i18n.c:1169 msgid "Western European" msgstr "" #: src/libpspp/message.c:89 #, c-format msgid "%s: %s" msgstr "" #: src/libpspp/message.c:113 msgid "error" msgstr "" #: src/libpspp/message.c:115 msgid "warning" msgstr "" #: src/libpspp/message.c:118 msgid "note" msgstr "" #: src/libpspp/message.c:327 #, c-format msgid "Notes (%d) exceed limit (%d). Suppressing further notes." msgstr "" #: src/libpspp/message.c:335 #, c-format msgid "Warnings (%d) exceed limit (%d). Syntax processing will be halted." msgstr "" #: src/libpspp/message.c:338 #, c-format msgid "Errors (%d) exceed limit (%d). Syntax processing will be halted." msgstr "" #: src/libpspp/zip-reader.c:202 #, c-format msgid "%s: corrupt archive at 0x%llx: expected %# but got %#" msgstr "" #: src/libpspp/zip-reader.c:329 src/libpspp/zip-reader.c:449 #, c-format msgid "%s: open failed (%s)" msgstr "" #: src/libpspp/zip-reader.c:344 #, c-format msgid "%s: cannot find central directory" msgstr "" #: src/libpspp/zip-reader.c:353 src/libpspp/zip-reader.c:384 #: src/libpspp/zip-reader.c:468 #, c-format msgid "%s: seek failed (%s)" msgstr "" #: src/libpspp/zip-reader.c:441 #, c-format msgid "%s: unknown member \"%s\"" msgstr "" #: src/libpspp/zip-reader.c:503 #, c-format msgid "" "%s: name mismatch between central directory (%s) and local file header (%s)" msgstr "" #: src/libpspp/zip-reader.c:696 #, c-format msgid "%s: cannot initialize inflator (%s)" msgstr "" #: src/libpspp/zip-reader.c:751 #, c-format msgid "%s: error inflating \"%s\" (%s)" msgstr "" #: src/libpspp/zip-writer.c:97 utilities/pspp-convert.c:346 #, c-format msgid "%s: error opening output file" msgstr "" #: src/libpspp/zip-writer.c:169 #, c-format msgid "%s: error seeking in output file" msgstr "" #: src/libpspp/zip-writer.c:210 msgid "error creating temporary file" msgstr "" #: src/libpspp/zip-writer.c:279 #, c-format msgid "%s: write failed" msgstr "" #. TRANSLATORS: This is a format string which, when presented to #. printf like functions, will create a pango markup string to #. display real number in scientific notation. #. #. In its untranslated form, it will display similar to "1.23 x 10^4". You #. can leave it untranslated if this is how scientific notation is usually #. presented in your language. #. #. Some locales (such as German) prefer the centered dot rather than the #. multiplication sign between the mantissa an exponent. In which #. case, you can change "#215;" to "#8901;" or other unicode code #. point as appropriate. #. #. The . in this string does not and should not be changed, since #. that is taken care of by the stdc library. #. #. For information on Pango markup, see #. http://developer.gnome.org/pango/stable/PangoMarkupFormat.html #. #. For tables of unicode code points, see http://unicode.org/charts #. #: src/math/chart-geometry.c:123 #, c-format msgid "%%.%dlf×10%d" msgstr "" #: src/math/histogram.c:145 msgid "" "Not creating histogram because the data contains less than 2 distinct values" msgstr "" #: src/math/percentiles.c:36 msgid "HAverage" msgstr "" #: src/math/percentiles.c:38 msgid "Rounded" msgstr "" #: src/math/percentiles.c:39 msgid "Empirical" msgstr "" #: src/math/percentiles.c:40 msgid "Empirical with averaging" msgstr "" #: src/math/shapiro-wilk.c:84 msgid "" "One or more weight values are non-integer. Fractional parts will be ignored " "when calculating the Shapiro-Wilk statistic." msgstr "" #: src/output/ascii.c:340 #, c-format msgid "ascii: opening output file `%s'" msgstr "" #: src/output/ascii.c:371 #, c-format msgid "%s: %s must be positive integer or `auto'" msgstr "" #: src/output/ascii.c:393 #, c-format msgid "" "ascii: page must be at least %d characters wide, but as configured is only " "%d characters" msgstr "" #: src/output/ascii.c:508 #, c-format msgid "See %s for a chart." msgstr "" #: src/output/charts/piechart.c:54 msgid "*MISSING*" msgstr "" #: src/output/csv.c:100 src/output/html.c:117 src/output/journal.c:166 #: src/output/msglog.c:68 #, c-format msgid "error opening output file `%s'" msgstr "" #: src/output/driver.c:522 #, c-format msgid "%s is not a valid device type (the choices are `%s' and `%s')" msgstr "" #: src/output/driver.c:536 #, c-format msgid "%s: unknown option `%s'" msgstr "" #: src/output/driver.c:553 #, c-format msgid "%s: output option missing `='" msgstr "" #: src/output/driver.c:560 #, c-format msgid "%s: output option specified more than once" msgstr "" #: src/output/html.c:129 msgid "PSPP Output" msgstr "" #: src/output/html.c:266 msgid "No description" msgstr "" #: src/output/journal.c:69 #, c-format msgid "error writing output file `%s'" msgstr "" #: src/output/measure.c:68 #, c-format msgid "`%s' is not a valid length." msgstr "" #: src/output/measure.c:96 #, c-format msgid "syntax error in paper size `%s'" msgstr "" #: src/output/measure.c:233 #, c-format msgid "unknown paper type `%.*s'" msgstr "" #: src/output/measure.c:251 #, c-format msgid "error opening input file `%s'" msgstr "" #: src/output/measure.c:279 #, c-format msgid "file `%s' does not state a paper size" msgstr "" #: src/output/options.c:112 #, c-format msgid "%s: `%s' is `%s' but a Boolean value is required" msgstr "" #: src/output/options.c:187 #, c-format msgid "%s: `%s' is `%s' but one of the following is required: %s" msgstr "" #: src/output/options.c:231 #, c-format msgid "%s: `%s' is `%s' but a non-negative integer is required" msgstr "" #: src/output/options.c:235 #, c-format msgid "%s: `%s' is `%s' but a positive integer is required" msgstr "" #: src/output/options.c:238 #, c-format msgid "%s: `%s' is `%s' but an integer is required" msgstr "" #: src/output/options.c:241 #, c-format msgid "%s: `%s' is `%s' but an integer greater than %d is required" msgstr "" #: src/output/options.c:246 #, c-format msgid "%s: `%s' is `%s' but an integer between %d and %d is required" msgstr "" #: src/output/options.c:325 #, c-format msgid "%s: `%s' is `%s' but a file name that contains `#' is required." msgstr "" #. TRANSLATORS: Do not translate this string. If the script of your language #. reads from right to left (eg Persian, Arabic, Hebrew etc), then replace #. this string with "output-direction-rtl". Otherwise either leave it #. untranslated or copy it verbatim. #: src/output/render.c:994 msgid "output-direction-ltr" msgstr "" #: src/output/text-item.c:44 msgid "Page Title" msgstr "" #: src/output/text-item.c:47 msgid "Title" msgstr "" #: src/output/text-item.c:51 msgid "Log" msgstr "" #: src/output/text-item.c:54 msgid "Page Break" msgstr "" #: src/output/cairo.c:520 #, c-format msgid "`%s': bad font specification" msgstr "" #: src/output/cairo.c:744 #, c-format msgid "" "The defined page is not wide enough to hold at least %d characters in the " "default font. In fact, there's only room for %d characters." msgstr "" #: src/output/cairo.c:752 #, c-format msgid "" "The defined page is not long enough to hold at least %d lines in the default " "font. In fact, there's only room for %d lines." msgstr "" #: src/output/cairo.c:837 #, c-format msgid "error opening output file `%s': %s" msgstr "" #: src/output/cairo.c:892 #, c-format msgid "error drawing output for %s driver: %s" msgstr "" #: src/output/cairo.c:2056 #, c-format msgid "error writing output file `%s': %s" msgstr "" #: src/output/charts/np-plot-cairo.c:37 #, c-format msgid "Normal Q-Q Plot of %s" msgstr "" #: src/output/charts/np-plot-cairo.c:38 src/output/charts/np-plot-cairo.c:68 msgid "Observed Value" msgstr "" #: src/output/charts/np-plot-cairo.c:39 msgid "Expected Normal" msgstr "" #: src/output/charts/np-plot-cairo.c:67 #, c-format msgid "Detrended Normal Q-Q Plot of %s" msgstr "" #: src/output/charts/np-plot-cairo.c:69 msgid "Dev from Normal" msgstr "" #: src/output/charts/barchart-cairo.c:65 msgid "Bar Chart" msgstr "" #: src/output/charts/plot-hist-cairo.c:43 #, c-format msgid "N = %.2f" msgstr "" #: src/output/charts/plot-hist-cairo.c:52 #, c-format msgid "Mean = %.1f" msgstr "" #: src/output/charts/plot-hist-cairo.c:61 #, c-format msgid "Std. Dev = %.2f" msgstr "" #: src/output/charts/plot-hist-cairo.c:110 msgid "HISTOGRAM" msgstr "" #: src/output/charts/roc-chart-cairo.c:36 src/ui/gui/roc.ui:24 msgid "ROC Curve" msgstr "" #: src/output/charts/scree-cairo.c:36 msgid "Scree Plot" msgstr "" #: src/output/charts/scree-cairo.c:38 msgid "Eigenvalue" msgstr "" #: src/output/charts/spreadlevel-cairo.c:37 #, c-format msgid "Spread vs. Level Plot of %s" msgstr "" #: src/output/charts/spreadlevel-cairo.c:38 msgid "Level" msgstr "" #: src/output/charts/spreadlevel-cairo.c:39 msgid "Spread" msgstr "" #: src/output/charts/scatterplot-cairo.c:57 #, c-format msgid "Scatterplot %s" msgstr "" #: src/output/spv/spv-legacy-decoder.c:2222 msgid "Table lacks cell data." msgstr "" #: src/output/spv/spv-writer.c:68 #, c-format msgid "%s: create failed" msgstr "" #: src/output/spv/spv-writer.c:89 msgid "I/O error writing SPV file" msgstr "" #: src/output/spv/spv.c:693 #, c-format msgid "%s: Failed to create XML parser" msgstr "" #: src/output/spv/spv.c:718 #, c-format msgid "%s: document is not well-formed" msgstr "" #: src/output/spv/spv.c:726 #, c-format msgid "%s: root node is \"%s\" but \"%s\" was expected" msgstr "" #: src/ui/gui/psppire-acr.c:273 msgid "Add" msgstr "" #: src/ui/gui/psppire-acr.c:274 msgid "Edit" msgstr "" #: src/ui/gui/psppire-acr.c:275 msgid "Remove" msgstr "" #: src/ui/gui/psppire-buttonbox.c:311 msgid "OK" msgstr "" #: src/ui/gui/psppire-buttonbox.c:319 msgid "Go To" msgstr "" #: src/ui/gui/psppire-buttonbox.c:327 msgid "Continue" msgstr "" #: src/ui/gui/psppire-buttonbox.c:339 src/ui/gui/psppire-import-assistant.c:759 msgid "Paste" msgstr "" #: src/ui/gui/psppire-buttonbox.c:345 #: src/ui/gui/psppire-dialog-action-aggregate.c:216 #: src/ui/gui/psppire-data-window.c:496 src/ui/gui/psppire-data-window.c:624 #: src/ui/gui/psppire-output-window.c:353 #: src/ui/gui/psppire-syntax-window.c:594 src/ui/gui/psppire-window.c:445 #: src/ui/gui/psppire-window.c:628 msgid "Cancel" msgstr "" #: src/ui/gui/psppire-buttonbox.c:351 msgid "Close" msgstr "" #: src/ui/gui/psppire-buttonbox.c:358 src/ui/gui/psppire-import-assistant.c:760 msgid "Reset" msgstr "" #: src/ui/gui/psppire-buttonbox.c:365 msgid "Help" msgstr "" #: src/ui/gui/psppire-dialog-action-aggregate.c:213 msgid "Aggregate destination file" msgstr "" #: src/ui/gui/psppire-dialog-action-aggregate.c:217 #: src/ui/gui/psppire-data-window.c:493 src/ui/gui/psppire-data-window.c:497 #: src/ui/gui/psppire-output-window.c:354 #: src/ui/gui/psppire-syntax-window.c:595 src/ui/gui/psppire-window.c:449 #: src/ui/gui/aggregate.ui:565 msgid "Save" msgstr "" #: src/ui/gui/psppire-dialog-action-aggregate.c:226 #: src/ui/gui/psppire-data-window.c:503 msgid "System Files (*.sav)" msgstr "" #: src/ui/gui/psppire-dialog-action-aggregate.c:231 #: src/ui/gui/psppire-data-window.c:508 msgid "Compressed System Files (*.zsav)" msgstr "" #: src/ui/gui/psppire-dialog-action-aggregate.c:236 #: src/ui/gui/psppire-data-window.c:513 src/ui/gui/psppire-window.c:652 msgid "Portable Files (*.por) " msgstr "" #: src/ui/gui/psppire-dialog-action-autorecode.c:337 #: src/ui/gui/psppire-dialog-action-recode.c:535 #: src/ui/gui/psppire-dialog-action-recode-different.c:288 msgid "New" msgstr "" #: src/ui/gui/psppire-dialog-action-autorecode.c:351 #: src/ui/gui/psppire-dialog-action-recode.c:527 #: src/ui/gui/psppire-dialog-action-recode-different.c:301 msgid "Old" msgstr "" #: src/ui/gui/psppire-dialog-action-comments.c:142 #, c-format msgid "Column Number: %d" msgstr "" #: src/ui/gui/psppire-dialog-action-crosstabs.c:71 msgid "Chisq" msgstr "" #: src/ui/gui/psppire-dialog-action-crosstabs.c:71 msgid "" "Pearson chi-square, likelihood ratio, Fisher’s exact test, continuity " "correction, linear-by-linear association." msgstr "" #: src/ui/gui/psppire-dialog-action-crosstabs.c:74 #: src/language/stats/crosstabs.q:1334 msgid "Phi" msgstr "" #: src/ui/gui/psppire-dialog-action-crosstabs.c:75 msgid "CC" msgstr "" #: src/ui/gui/psppire-dialog-action-crosstabs.c:75 msgid "Contingency coefficient" msgstr "" #: src/ui/gui/psppire-dialog-action-crosstabs.c:77 msgid "UC" msgstr "" #: src/ui/gui/psppire-dialog-action-crosstabs.c:77 msgid "Uncertainty coefficient" msgstr "" #: src/ui/gui/psppire-dialog-action-crosstabs.c:78 msgid "BTau" msgstr "" #: src/ui/gui/psppire-dialog-action-crosstabs.c:78 msgid "Kendall's Tau-b" msgstr "" #: src/ui/gui/psppire-dialog-action-crosstabs.c:79 msgid "CTau" msgstr "" #: src/ui/gui/psppire-dialog-action-crosstabs.c:79 msgid "Kendall's Tau-c" msgstr "" #: src/ui/gui/psppire-dialog-action-crosstabs.c:80 msgid "Risk" msgstr "" #: src/ui/gui/psppire-dialog-action-crosstabs.c:80 msgid "Relative Risk estimate" msgstr "" #: src/ui/gui/psppire-dialog-action-crosstabs.c:81 #: src/language/stats/crosstabs.q:1338 msgid "Gamma" msgstr "" #: src/ui/gui/psppire-dialog-action-crosstabs.c:82 msgid "D" msgstr "" #: src/ui/gui/psppire-dialog-action-crosstabs.c:82 msgid "Somer's d" msgstr "" #: src/ui/gui/psppire-dialog-action-crosstabs.c:83 #: src/language/stats/crosstabs.q:1344 msgid "Kappa" msgstr "" #: src/ui/gui/psppire-dialog-action-crosstabs.c:83 msgid "Cohen's Kappa" msgstr "" #: src/ui/gui/psppire-dialog-action-crosstabs.c:84 #: src/language/stats/crosstabs.q:1429 msgid "Eta" msgstr "" #: src/ui/gui/psppire-dialog-action-crosstabs.c:85 msgid "Corr" msgstr "" #: src/ui/gui/psppire-dialog-action-crosstabs.c:85 msgid "Spearman correlation, Pearson's r" msgstr "" #: src/ui/gui/psppire-dialog-action-crosstabs.c:90 msgid "Frequency Count" msgstr "" #: src/ui/gui/psppire-dialog-action-crosstabs.c:91 msgid "Row" msgstr "" #: src/ui/gui/psppire-dialog-action-crosstabs.c:91 msgid "Row percent" msgstr "" #: src/ui/gui/psppire-dialog-action-crosstabs.c:92 msgid "Column" msgstr "" #: src/ui/gui/psppire-dialog-action-crosstabs.c:92 msgid "Column percent" msgstr "" #: src/ui/gui/psppire-dialog-action-crosstabs.c:93 msgid "Total percent" msgstr "" #: src/ui/gui/psppire-dialog-action-crosstabs.c:94 #: src/language/stats/crosstabs.q:1266 msgid "Expected" msgstr "" #: src/ui/gui/psppire-dialog-action-crosstabs.c:94 msgid "Expected value" msgstr "" #: src/ui/gui/psppire-dialog-action-crosstabs.c:96 #: src/language/stats/crosstabs.q:1268 msgid "Std. Residual" msgstr "" #: src/ui/gui/psppire-dialog-action-crosstabs.c:96 msgid "Standardized Residual" msgstr "" #: src/ui/gui/psppire-dialog-action-crosstabs.c:97 msgid "Adjusted Std. Residual" msgstr "" #: src/ui/gui/psppire-dialog-action-descriptives.c:45 msgid "Standard error" msgstr "" #: src/ui/gui/psppire-dialog-action-descriptives.c:45 msgid "Standard error of mean" msgstr "" #: src/ui/gui/psppire-dialog-action-descriptives.c:47 msgid "Kurtosis and standard error of kurtosis" msgstr "" #: src/ui/gui/psppire-dialog-action-descriptives.c:48 msgid "Skewness and standard error of skewness" msgstr "" #: src/ui/gui/psppire-dialog-action-factor.c:323 #, c-format msgid "_Eigenvalues over %4.2f times the mean eigenvalue" msgstr "" #: src/ui/gui/psppire-dialog-action-frequencies.c:44 msgid "Standard error of the mean" msgstr "" #: src/ui/gui/psppire-dialog-action-frequencies.c:47 msgid "Standard error of the skewness" msgstr "" #: src/ui/gui/psppire-dialog-action-frequencies.c:51 msgid "Standard error of the kurtosis" msgstr "" #: src/ui/gui/psppire-dialog-action-oneway.c:175 #, c-format msgid "Contrast %d of %d" msgstr "" #: src/ui/gui/psppire-dialog-action-paired.c:162 src/ui/gui/examine.ui:282 #: src/ui/gui/indep-samples.ui:334 src/ui/gui/t-test.ui:296 msgid "O_ptions..." msgstr "" #: src/ui/gui/psppire-dialog-action-paired.c:168 msgid "Paired Samples T Test" msgstr "" #: src/ui/gui/psppire-dialog-action-recode-different.c:327 msgid "Recode into Different Variables" msgstr "" #: src/ui/gui/psppire-dialog-action-recode-different.c:330 msgid "Recode into Different Variables: Old and New Values " msgstr "" #: src/ui/gui/psppire-dialog-action-recode-same.c:108 src/ui/gui/recode.ui:391 msgid "Recode into Same Variables" msgstr "" #: src/ui/gui/psppire-dialog-action-recode-same.c:114 msgid "Recode into Same Variables: Old and New Values" msgstr "" #: src/ui/gui/psppire-dialog-action-regression.c:40 msgid "Coeff" msgstr "" #: src/ui/gui/psppire-dialog-action-regression.c:40 msgid "Show the regression coefficients" msgstr "" #: src/ui/gui/psppire-dialog-action-regression.c:41 msgid "Conf. Interval" msgstr "" #: src/ui/gui/psppire-dialog-action-regression.c:41 msgid "Show the confidence interval for the regression coefficients" msgstr "" #: src/ui/gui/psppire-dialog-action-regression.c:42 msgid "Show the correlation between observed and predicted values" msgstr "" #: src/ui/gui/psppire-dialog-action-regression.c:43 msgid "Anova" msgstr "" #: src/ui/gui/psppire-dialog-action-regression.c:43 msgid "Show the analysis of variance table" msgstr "" #: src/ui/gui/psppire-dialog-action-regression.c:44 msgid "Bcov" msgstr "" #: src/ui/gui/psppire-dialog-action-regression.c:44 msgid "Show the variance coefficient matrix" msgstr "" #: src/ui/gui/psppire-dialog-action-regression.c:45 msgid "Tol" msgstr "" #: src/ui/gui/psppire-dialog-action-regression.c:45 msgid "Show the variance inflation factor and its reciprocal" msgstr "" #: src/ui/gui/psppire-dialog-action-select.c:88 #, c-format msgid "Approximately %3d%% of all cases." msgstr "" #: src/ui/gui/psppire-dialog-action-select.c:89 #, c-format msgid "Exactly %3d cases from the first %3d cases." msgstr "" #: src/ui/gui/psppire-dialog-action-select.c:236 #, c-format msgid "%d thru %d" msgstr "" #: src/ui/gui/psppire-dialog-action-two-sample.c:180 #: src/ui/gui/k-independent.ui:404 src/ui/gui/k-related.ui:197 msgid "Test Type" msgstr "" #: src/ui/gui/psppire-dialog-action-two-sample.c:189 msgid "_Wilcoxon" msgstr "" #: src/ui/gui/psppire-dialog-action-two-sample.c:190 msgid "_Sign" msgstr "" #: src/ui/gui/psppire-dialog-action-two-sample.c:191 msgid "_McNemar" msgstr "" #: src/ui/gui/psppire-dialog-action-two-sample.c:209 msgid "Two-Related-Samples Tests" msgstr "" #: src/ui/gui/psppire-dialog-action-weight.c:74 src/ui/gui/weight.ui:83 #: src/ui/gui/weight.ui:211 msgid "Do not weight cases" msgstr "" #: src/ui/gui/psppire-dialog-action-weight.c:80 #, c-format msgid "Weight cases by %s" msgstr "" #: src/ui/gui/psppire-dict.c:95 msgid "Var" msgstr "" #. TRANSLATORS: This string must be a valid variable name. That means: #. - The string must be at most 64 bytes (not characters) long. #. - The string may not contain whitespace. #. - The first character may not be '$' #. - The first character may not be a digit #. - The final character may not be '.' or '_' #. #: src/ui/gui/psppire-dict.c:385 #, c-format msgid "Var%04d" msgstr "" #: src/ui/gui/psppire-dict.c:566 msgid "Duplicate variable name." msgstr "" #: src/ui/gui/psppire-dictview.c:617 msgid "Prefer variable labels" msgstr "" #: src/ui/gui/psppire-dictview.c:631 msgid "Default sort order" msgstr "" #: src/ui/gui/psppire-dictview.c:637 msgid "Unsorted (dictionary order)" msgstr "" #: src/ui/gui/psppire-dictview.c:642 msgid "Sort by name" msgstr "" #: src/ui/gui/psppire-dictview.c:647 msgid "Sort by label" msgstr "" #: src/ui/gui/psppire-means-layer.c:95 #, c-format msgid "Layer %d of %d" msgstr "" #: src/ui/gui/psppire-means-layer.c:169 msgid "Forward" msgstr "" #: src/ui/gui/psppire-means-layer.c:170 msgid "Back" msgstr "" #: src/ui/gui/psppire-text-file.c:55 #, c-format msgid "Could not open `%s'" msgstr "" #: src/ui/gui/psppire-text-file.c:71 #, c-format msgid "Error reading `%s': %s" msgstr "" #: src/ui/gui/psppire-text-file.c:74 #, c-format msgid "" "Failed to read `%s', because it contains a line over %d bytes long and " "therefore appears not to be a text file." msgstr "" #: src/ui/gui/psppire-text-file.c:96 #, c-format msgid "`%s' is empty." msgstr "" #: src/ui/gui/psppire-val-chooser.c:255 msgid "through" msgstr "" #: src/ui/gui/psppire-val-chooser.c:288 msgid "_Value:" msgstr "" #: src/ui/gui/psppire-val-chooser.c:289 msgid "_System Missing" msgstr "" #: src/ui/gui/psppire-val-chooser.c:290 msgid "System _or User Missing" msgstr "" #: src/ui/gui/psppire-val-chooser.c:291 msgid "_Range:" msgstr "" #: src/ui/gui/psppire-val-chooser.c:292 msgid "Range, _LOWEST thru value" msgstr "" #: src/ui/gui/psppire-val-chooser.c:293 msgid "Range, value thru _HIGHEST" msgstr "" #: src/ui/gui/psppire-val-chooser.c:294 msgid "_All other values" msgstr "" #: src/ui/gui/psppire-var-view.c:153 #, c-format msgid "Var%d" msgstr "" #: src/ui/source-init-opts.c:72 #, c-format msgid "Algorithm must be either `%s' or `%s'." msgstr "" #: src/ui/source-init-opts.c:97 #, c-format msgid "Syntax must be either `%s' or `%s'." msgstr "" #: src/ui/terminal/main.c:144 msgid "Error encountered while ERROR=STOP is effective." msgstr "" #: src/ui/terminal/main.c:150 msgid "" "Stopping syntax file processing here to avoid a cascade of dependent command " "failures." msgstr "" #: src/ui/terminal/terminal-opts.c:147 #, c-format msgid "" "PSPP, a program for statistical analysis of sampled data.\n" "Usage: %s [OPTION]... FILE...\n" "\n" "Arguments to long options also apply to equivalent short options.\n" "\n" "Output options:\n" " -o, --output=FILE output to FILE, default format from FILE's name\n" " -O format=FORMAT override format for previous -o\n" " -O OPTION=VALUE set output option to customize previous -o\n" " -O device={terminal|listing} override device type for previous -o\n" " -e, --error-file=FILE append errors, warnings, and notes to FILE\n" " --no-output disable default output driver\n" "Supported output formats: %s\n" "\n" "Language options:\n" " -I, --include=DIR append DIR to search path\n" " -I-, --no-include clear search path\n" " -r, --no-statrc disable running rc file at startup\n" " -a, --algorithm={compatible|enhanced}\n" " set to `compatible' if you want output\n" " calculated from broken algorithms\n" " -x, --syntax={compatible|enhanced}\n" " set to `compatible' to disable PSPP extensions\n" " -b, --batch interpret syntax in batch mode\n" " -i, --interactive interpret syntax in interactive mode\n" " --syntax-encoding=ENCODING specify encoding for syntax files\n" " -s, --safer don't allow some unsafe operations\n" "Default search path: %s\n" "\n" "Informative output:\n" " -h, --help display this help and exit\n" " -V, --version output version information and exit\n" "\n" "Non-option arguments are interpreted as syntax files to execute.\n" msgstr "" #: src/ui/gui/find-dialog.c:197 msgid "Find" msgstr "" #: src/ui/gui/find-dialog.c:662 #, c-format msgid "Bad regular expression: %s" msgstr "" #: src/ui/gui/help-menu.c:70 msgid "A program for the analysis of sampled data" msgstr "" #. TRANSLATORS: Do not translate this string. Instead, put the names of the people #. who have helped in the translation. #: src/ui/gui/help-menu.c:80 msgid "translator-credits" msgstr "" #: src/ui/gui/help-menu.c:170 #, c-format msgid "Help path conversion error: %s" msgstr "" #: src/ui/gui/help-menu.c:197 #, c-format msgid "" "Cannot open via html: %s with uri: %s The PSSP manual is also available at %s" msgstr "" #: src/ui/gui/help-menu.c:218 msgid "_Help" msgstr "" #: src/ui/gui/help-menu.c:221 msgid "_About" msgstr "" #: src/ui/gui/help-menu.c:222 msgid "_Reference Manual" msgstr "" #: src/ui/gui/main.c:306 msgid "Show version information and exit" msgstr "" #: src/ui/gui/main.c:409 msgid "Do not display the splash screen" msgstr "" #: src/ui/gui/main.c:411 msgid "Do not attempt single instance negotiation" msgstr "" #: src/ui/gui/missing-val-dialog.c:217 msgid "" "The maximum length of a missing value for a string variable is 8 in UTF-8." msgstr "" #: src/ui/gui/missing-val-dialog.c:268 msgid "At least one value must be specified" msgstr "" #: src/ui/gui/missing-val-dialog.c:298 msgid "Incorrect range specification" msgstr "" #: src/ui/gui/psppire-data-editor.c:380 #, c-format msgid "%d : %s" msgstr "" #: src/ui/gui/psppire-data-editor.c:391 #, c-format msgid "%'d case" msgid_plural "%'d cases" msgstr[0] "" msgstr[1] "" #: src/ui/gui/psppire-data-editor.c:396 #, c-format msgid "%'d variable" msgid_plural "%'d variables" msgstr[0] "" msgstr[1] "" #: src/ui/gui/psppire-data-editor.c:485 msgid "Case" msgstr "" #: src/ui/gui/psppire-data-editor.c:495 msgid "Data View" msgstr "" #: src/ui/gui/psppire-data-editor.c:505 msgid "Variable View" msgstr "" #: src/ui/gui/psppire-data-sheet.c:171 src/ui/gui/psppire-data-window.c:1338 msgid "_Insert Case" msgstr "" #: src/ui/gui/psppire-data-sheet.c:179 src/ui/gui/psppire-data-window.c:1391 msgid "Cl_ear Cases" msgstr "" #: src/ui/gui/psppire-data-sheet.c:305 src/ui/gui/psppire-data-window.c:1337 #: src/ui/gui/psppire-variable-sheet.c:274 msgid "_Insert Variable" msgstr "" #: src/ui/gui/psppire-data-sheet.c:314 src/ui/gui/psppire-variable-sheet.c:283 msgid "Cl_ear Variables" msgstr "" #: src/ui/gui/psppire-data-sheet.c:326 msgid "Sort _Ascending" msgstr "" #: src/ui/gui/psppire-data-sheet.c:333 msgid "Sort _Descending" msgstr "" #: src/ui/gui/psppire-data-window.c:175 msgid "Transformations Pending" msgstr "" #: src/ui/gui/psppire-data-window.c:191 msgid "Filter off" msgstr "" #: src/ui/gui/psppire-data-window.c:203 #, c-format msgid "Filter by %s" msgstr "" #: src/ui/gui/psppire-data-window.c:224 msgid "No Split" msgstr "" #: src/ui/gui/psppire-data-window.c:233 msgid "Split by " msgstr "" #: src/ui/gui/psppire-data-window.c:261 msgid "Weights off" msgstr "" #: src/ui/gui/psppire-data-window.c:273 #, c-format msgid "Weight by %s" msgstr "" #: src/ui/gui/psppire-data-window.c:518 #: src/ui/gui/psppire-import-assistant.c:681 #: src/ui/gui/psppire-syntax-window.c:607 src/ui/gui/psppire-window.c:669 msgid "All Files" msgstr "" #: src/ui/gui/psppire-data-window.c:535 msgid "System File" msgstr "" #: src/ui/gui/psppire-data-window.c:542 msgid "Compressed System File" msgstr "" #: src/ui/gui/psppire-data-window.c:548 msgid "Portable File" msgstr "" #: src/ui/gui/psppire-data-window.c:551 msgid "Format:" msgstr "" #: src/ui/gui/psppire-data-window.c:615 msgid "Delete Existing Dataset?" msgstr "" #: src/ui/gui/psppire-data-window.c:619 #, c-format msgid "" "Renaming \"%s\" to \"%s\" will destroy the existing dataset named \"%s\". " "Are you sure that you want to do this?" msgstr "" #: src/ui/gui/psppire-data-window.c:625 msgid "Delete" msgstr "" #: src/ui/gui/psppire-data-window.c:647 #, c-format msgid "Please enter a new name for dataset \"%s\":" msgstr "" #: src/ui/gui/psppire-data-window.c:649 msgid "Rename Dataset" msgstr "" #: src/ui/gui/psppire-data-window.c:1199 src/ui/gui/output-window.ui:68 #: src/ui/gui/syntax-editor.ui:22 msgid "_File" msgstr "" #: src/ui/gui/psppire-data-window.c:1203 src/ui/gui/syntax-editor.ui:25 msgid "_New" msgstr "" #: src/ui/gui/psppire-data-window.c:1210 msgid "_Syntax" msgstr "" #: src/ui/gui/psppire-data-window.c:1213 src/ui/gui/data-editor.ui:177 #: src/ui/gui/data-editor.ui:189 msgid "_Data" msgstr "" #: src/ui/gui/psppire-data-window.c:1220 src/ui/gui/syntax-editor.ui:36 msgid "_Open" msgstr "" #: src/ui/gui/psppire-data-window.c:1223 msgid "_Import Data..." msgstr "" #: src/ui/gui/psppire-data-window.c:1231 src/ui/gui/logistic.ui:261 #: src/ui/gui/regression.ui:66 msgid "_Save..." msgstr "" #: src/ui/gui/psppire-data-window.c:1234 msgid "Save _As..." msgstr "" #: src/ui/gui/psppire-data-window.c:1237 msgid "_Rename Dataset..." msgstr "" #: src/ui/gui/psppire-data-window.c:1248 msgid "_Display Data File Information" msgstr "" #: src/ui/gui/psppire-data-window.c:1255 msgid "Working File" msgstr "" #: src/ui/gui/psppire-data-window.c:1257 msgid "_External File..." msgstr "" #: src/ui/gui/psppire-data-window.c:1267 msgid "_Recently Used Data" msgstr "" #: src/ui/gui/psppire-data-window.c:1268 msgid "Recently Used _Files" msgstr "" #: src/ui/gui/psppire-data-window.c:1315 src/ui/gui/output-window.ui:82 #: src/ui/gui/syntax-editor.ui:59 msgid "_Quit" msgstr "" #: src/ui/gui/psppire-data-window.c:1333 src/ui/gui/output-window.ui:89 #: src/ui/gui/syntax-editor.ui:66 msgid "_Edit" msgstr "" #: src/ui/gui/psppire-data-window.c:1339 msgid "_Go To Variable..." msgstr "" #: src/ui/gui/psppire-data-window.c:1340 msgid "_Go To Case..." msgstr "" #: src/ui/gui/psppire-data-window.c:1364 src/ui/gui/syntax-editor.ui:69 msgid "Cu_t" msgstr "" #: src/ui/gui/psppire-data-window.c:1373 src/ui/gui/output-window.ui:96 #: src/ui/gui/syntax-editor.ui:74 msgid "_Copy" msgstr "" #: src/ui/gui/psppire-data-window.c:1380 src/ui/gui/syntax-editor.ui:79 msgid "_Paste" msgstr "" #: src/ui/gui/psppire-data-window.c:1387 msgid "Clear _Variables" msgstr "" #: src/ui/gui/psppire-data-window.c:1401 msgid "_Find..." msgstr "" #: src/ui/gui/psppire-data-window.c:1407 src/ui/gui/logistic.ui:246 msgid "_Options..." msgstr "" #: src/ui/gui/psppire-data-window.c:1676 msgid "Jump to variable" msgstr "" #: src/ui/gui/psppire-data-window.c:1689 msgid "Jump to a case in the data sheet" msgstr "" #: src/ui/gui/psppire-data-window.c:1703 msgid "Search for values in the data" msgstr "" #: src/ui/gui/psppire-data-window.c:1715 msgid "Create a new case at the current position" msgstr "" #: src/ui/gui/psppire-data-window.c:1727 msgid "Create a new variable at the current position" msgstr "" #: src/ui/gui/psppire-data-window.c:1741 msgid "Split the active dataset" msgstr "" #: src/ui/gui/psppire-data-window.c:1753 msgid "Weight cases by variable" msgstr "" #: src/ui/gui/psppire-data-window.c:1764 msgid "Show/hide value labels" msgstr "" #: src/ui/gui/psppire-data-window.c:1904 msgid "Data Editor" msgstr "" #: src/ui/gui/psppire-encoding-selector.c:140 msgid "Automatically Detect" msgstr "" #: src/ui/gui/psppire-encoding-selector.c:147 msgid "Locale Encoding" msgstr "" #: src/ui/gui/psppire-encoding-selector.c:177 msgid "Character Encoding: " msgstr "" #: src/ui/gui/psppire-import-assistant.c:337 msgid "line" msgstr "" #: src/ui/gui/psppire-import-assistant.c:347 msgid "var" msgstr "" #: src/ui/gui/psppire-import-assistant.c:560 msgid "Importing Spreadsheet Data" msgstr "" #: src/ui/gui/psppire-import-assistant.c:686 msgid "Text Files" msgstr "" #: src/ui/gui/psppire-import-assistant.c:691 msgid "Text (*.txt) Files" msgstr "" #: src/ui/gui/psppire-import-assistant.c:697 msgid "Plain Text (ASCII) Files" msgstr "" #: src/ui/gui/psppire-import-assistant.c:702 msgid "Comma Separated Value Files" msgstr "" #: src/ui/gui/psppire-import-assistant.c:709 msgid "Tab Separated Value Files" msgstr "" #: src/ui/gui/psppire-import-assistant.c:714 msgid "Gnumeric Spreadsheet Files" msgstr "" #: src/ui/gui/psppire-import-assistant.c:719 msgid "OpenDocument Spreadsheet Files" msgstr "" #: src/ui/gui/psppire-import-assistant.c:724 msgid "All Spreadsheet Files" msgstr "" #: src/ui/gui/psppire-import-assistant.c:733 msgid "Select File to Import" msgstr "" #: src/ui/gui/psppire-import-assistant.c:770 msgid "Importing Delimited Text Data" msgstr "" #: src/ui/gui/psppire-import-assistant.c:865 msgid "Select the First Line" msgstr "" #: src/ui/gui/psppire-import-assistant.c:877 msgid "Line" msgstr "" #: src/ui/gui/psppire-import-assistant.c:931 msgid "" "This assistant will guide you through the process of importing data into " "PSPP from a text file with one line per case, in which fields are separated " "by tabs, commas, or other delimiters.\n" "\n" msgstr "" #: src/ui/gui/psppire-import-assistant.c:941 #, c-format msgid "The selected file contains %'lu line of text. " msgid_plural "The selected file contains %'lu lines of text. " msgstr[0] "" msgstr[1] "" #: src/ui/gui/psppire-import-assistant.c:950 #, c-format msgid "The selected file contains approximately %'lu line of text. " msgid_plural "The selected file contains approximately %'lu lines of text. " msgstr[0] "" msgstr[1] "" #: src/ui/gui/psppire-import-assistant.c:956 #, c-format msgid "" "Only the first %zu line of the file will be shown for preview purposes in " "the following screens. " msgid_plural "" "Only the first %zu lines of the file will be shown for preview purposes in " "the following screens. " msgstr[0] "" msgstr[1] "" #: src/ui/gui/psppire-import-assistant.c:965 msgid "You may choose below how much of the file should actually be imported." msgstr "" #: src/ui/gui/psppire-import-assistant.c:974 #, c-format msgid "Only the first %4d cases" msgstr "" #: src/ui/gui/psppire-import-assistant.c:985 #, c-format msgid "Only the first %3d %% of file (approximately)" msgstr "" #: src/ui/gui/psppire-import-assistant.c:1009 msgid "Select the Lines to Import" msgstr "" #: src/ui/gui/psppire-import-assistant.c:1151 msgid "Choose Separators" msgstr "" #: src/ui/gui/psppire-import-assistant.c:1438 msgid "Adjust Variable Formats" msgstr "" #: src/ui/gui/psppire-output-view.c:410 msgid "Message" msgstr "" #: src/ui/gui/psppire-output-view.c:543 msgid "failed to create temporary directory during clipboard operation" msgstr "" #: src/ui/gui/psppire-output-window.c:241 msgid "Infer file type from extension" msgstr "" #: src/ui/gui/psppire-output-window.c:242 msgid "SPSS Viewer (*.spv)" msgstr "" #: src/ui/gui/psppire-output-window.c:243 msgid "PDF (*.pdf)" msgstr "" #: src/ui/gui/psppire-output-window.c:244 msgid "HTML (*.html)" msgstr "" #: src/ui/gui/psppire-output-window.c:245 msgid "OpenDocument (*.odt)" msgstr "" #: src/ui/gui/psppire-output-window.c:246 msgid "Text (*.txt)" msgstr "" #: src/ui/gui/psppire-output-window.c:247 msgid "Text [plain] (*.txt)" msgstr "" #: src/ui/gui/psppire-output-window.c:248 msgid "PostScript (*.ps)" msgstr "" #: src/ui/gui/psppire-output-window.c:249 msgid "Comma-Separated Values (*.csv)" msgstr "" #: src/ui/gui/psppire-output-window.c:350 msgid "Export Output" msgstr "" #: src/ui/gui/psppire-output-window.c:548 msgid "Output Viewer" msgstr "" #: src/ui/gui/psppire-spreadsheet-model.c:237 msgid "(empty)" msgstr "" #: src/ui/gui/psppire-syntax-window.c:226 msgid "Text Search" msgstr "" #: src/ui/gui/psppire-syntax-window.c:229 msgid "_OK" msgstr "" #: src/ui/gui/psppire-syntax-window.c:231 msgid "_Cancel" msgstr "" #: src/ui/gui/psppire-syntax-window.c:239 msgid "Text to search for:" msgstr "" #: src/ui/gui/psppire-syntax-window.c:570 #, c-format msgid "Saved file `%s'" msgstr "" #: src/ui/gui/psppire-syntax-window.c:591 msgid "Save Syntax" msgstr "" #: src/ui/gui/psppire-syntax-window.c:601 src/ui/gui/psppire-window.c:657 msgid "Syntax Files (*.sps) " msgstr "" #: src/ui/gui/psppire-syntax-window.c:970 msgid "Syntax Editor" msgstr "" #: src/ui/gui/psppire-syntax-window.c:990 #, c-format msgid "Cannot load syntax file `%s'" msgstr "" #: src/ui/gui/psppire-variable-sheet.c:412 #, c-format msgid "{%s, %s}..." msgstr "" #: src/ui/gui/psppire-var-sheet-header.c:64 msgid "Decimal" msgstr "" #: src/ui/gui/psppire-var-sheet-header.c:79 msgid "Align" msgstr "" #: src/ui/gui/psppire-var-sheet-header.c:82 msgid "Measure" msgstr "" #: src/ui/gui/psppire-window.c:430 #, c-format msgid "Save the changes to `%s' before closing?" msgstr "" #: src/ui/gui/psppire-window.c:437 #, c-format msgid "" "If you don't save, changes from the last %ld seconds will be permanently " "lost." msgstr "" #: src/ui/gui/psppire-window.c:441 msgid "Close _without saving" msgstr "" #: src/ui/gui/psppire-window.c:625 src/ui/gui/psppire-window.c:629 msgid "Open" msgstr "" #: src/ui/gui/psppire-window.c:634 msgid "Data and Syntax Files" msgstr "" #: src/ui/gui/psppire-window.c:646 msgid "System Files (*.sav, *.zsav)" msgstr "" #: src/ui/gui/psppire-window.c:663 msgid "Output Files (*.spv) " msgstr "" #: src/ui/gui/t-test-options.c:65 #, c-format msgid "Con_fidence Interval: %2d %%" msgstr "" #: src/ui/gui/val-labs-dialog.c:591 #, c-format msgid "%s = `%s'" msgstr "" #: src/ui/gui/var-type-dialog.c:541 msgid "Variable Type and Format" msgstr "" #: src/ui/gui/windows-menu.c:92 msgid "_Minimize all Windows" msgstr "" #: src/ui/gui/windows-menu.c:100 msgid "_Split" msgstr "" #: src/ui/gui/windows-menu.c:132 msgid "_Windows" msgstr "" #: utilities/pspp-convert.c:67 #, c-format msgid "%s argument must be a single character" msgstr "" #: utilities/pspp-convert.c:265 msgid "exactly two non-option arguments are required; use --help for help" msgstr "" #: utilities/pspp-convert.c:276 #, c-format msgid "%s: cannot guess output format (use -O option)" msgstr "" #: utilities/pspp-convert.c:341 #, c-format msgid "%s: unknown output format (use -O option)" msgstr "" #: utilities/pspp-convert.c:360 #, c-format msgid "%s: error reading input file" msgstr "" #: utilities/pspp-convert.c:362 #, c-format msgid "%s: error writing output file" msgstr "" #: utilities/pspp-convert.c:409 #, c-format msgid "%s: error opening password file" msgstr "" #: utilities/pspp-convert.c:425 #, c-format msgid "" "\n" "%s: password not in file" msgstr "" #: utilities/pspp-convert.c:462 #, c-format msgid "%s: '%c' is not in alphabet" msgstr "" #: utilities/pspp-convert.c:526 msgid "sorry, wrong password" msgstr "" #: utilities/pspp-output.c:92 #, c-format msgid "%s and %s:" msgstr "" #: utilities/pspp-output.c:547 #, c-format msgid "%s: invalid XPath expression" msgstr "" #: utilities/pspp-output.c:716 msgid "missing command name (use --help for help)" msgstr "" #: utilities/pspp-output.c:720 #, c-format msgid "unknown command \"%s\" (use --help for help)" msgstr "" #: utilities/pspp-output.c:728 #, c-format msgid "\"%s\" command takes exactly %d argument" msgid_plural "\"%s\" command takes exactly %d arguments" msgstr[0] "" msgstr[1] "" #: utilities/pspp-output.c:735 #, c-format msgid "\"%s\" command requires at least %d argument" msgid_plural "\"%s\" command requires at least %d arguments" msgstr[0] "" msgstr[1] "" #: utilities/pspp-output.c:742 #, c-format msgid "\"%s\" command requires between %d and %d arguments" msgstr "" #: utilities/pspp-output.c:782 msgid "The following object classes are supported:" msgstr "" #: utilities/pspp-output.c:791 #, c-format msgid "%s: unknown object class (use --select=help for help" msgstr "" #: src/language/utilities/set.q:162 #, c-format msgid "%s must be between 0 and 20." msgstr "" #: src/language/utilities/set.q:172 src/language/utilities/set.q:179 #, c-format msgid "%s must be at least 1." msgstr "" #: src/language/utilities/set.q:205 #, c-format msgid "%s must be at least 1MB" msgstr "" #: src/language/utilities/set.q:207 #, c-format msgid "%s must be positive" msgstr "" #: src/language/utilities/set.q:213 src/language/utilities/set.q:215 #: src/language/utilities/set.q:217 src/language/utilities/set.q:219 #: src/language/utilities/set.q:221 src/language/utilities/set.q:223 #: src/language/utilities/set.q:225 src/language/utilities/set.q:227 #: src/language/utilities/set.q:229 src/language/utilities/set.q:231 #: src/language/utilities/set.q:233 #, c-format msgid "%s is obsolete." msgstr "" #: src/language/utilities/set.q:239 msgid "Active file compression is not implemented." msgstr "" #: src/language/utilities/set.q:403 #, c-format msgid "%s must be 1500 or later." msgstr "" #: src/language/utilities/set.q:410 #, c-format msgid "expecting %s or year" msgstr "" #: src/language/utilities/set.q:438 src/language/utilities/set.q:535 #, c-format msgid "%s must be at least %d." msgstr "" #: src/language/utilities/set.q:474 #, c-format msgid "%s is not a recognized encoding or locale name" msgstr "" #: src/language/utilities/set.q:562 #, c-format msgid "" "%s requires numeric output format as an argument. Specified format %s is of " "type string." msgstr "" #: src/language/utilities/set.q:791 msgid "ISL (32-bit IEEE 754 single, little-endian)" msgstr "" #: src/language/utilities/set.q:794 msgid "ISB (32-bit IEEE 754 single, big-endian)" msgstr "" #: src/language/utilities/set.q:797 msgid "IDL (64-bit IEEE 754 double, little-endian)" msgstr "" #: src/language/utilities/set.q:800 msgid "IDB (64-bit IEEE 754 double, big-endian)" msgstr "" #: src/language/utilities/set.q:804 msgid "VF (32-bit VAX F, VAX-endian)" msgstr "" #: src/language/utilities/set.q:807 msgid "VD (64-bit VAX D, VAX-endian)" msgstr "" #: src/language/utilities/set.q:810 msgid "VG (64-bit VAX G, VAX-endian)" msgstr "" #: src/language/utilities/set.q:814 msgid "ZS (32-bit IBM Z hexadecimal short, big-endian)" msgstr "" #: src/language/utilities/set.q:817 msgid "ZL (64-bit IBM Z hexadecimal long, big-endian)" msgstr "" #: src/language/utilities/set.q:985 #, c-format msgid "%s is %s." msgstr "" #: src/language/utilities/set.q:1089 #, c-format msgid "" "Too many %s commands without a %s: at most %d levels of saved settings are " "allowed." msgstr "" #: src/language/utilities/set.q:1109 #, c-format msgid "%s without matching %s." msgstr "" #: src/language/stats/crosstabs.q:327 #, c-format msgid "Missing mode %s not allowed in general mode. Assuming %s." msgstr "" #: src/language/stats/crosstabs.q:444 msgid "Too many cross-tabulation variables or dimensions." msgstr "" #: src/language/stats/crosstabs.q:509 #, c-format msgid "%s must be specified before %s." msgstr "" #: src/language/stats/crosstabs.q:543 #, c-format msgid "Maximum value (%ld) less than minimum value (%ld)." msgstr "" #: src/language/stats/crosstabs.q:922 msgid "Summary" msgstr "" #: src/language/stats/crosstabs.q:935 msgid "Crosstabulation" msgstr "" #. TRANSLATORS: The %s here describes a crosstabulation. It takes the #. form "var1 * var2 * var3 * ...". #: src/language/stats/crosstabs.q:1013 #, c-format msgid "Crosstabulation %s contained no non-missing cases." msgstr "" #: src/language/stats/crosstabs.q:1204 msgid "Missing value" msgstr "" #: src/language/stats/crosstabs.q:1263 msgid "Row %" msgstr "" #: src/language/stats/crosstabs.q:1264 msgid "Column %" msgstr "" #: src/language/stats/crosstabs.q:1265 msgid "Total %" msgstr "" #: src/language/stats/crosstabs.q:1269 msgid "Adjusted Residual" msgstr "" #: src/language/stats/crosstabs.q:1288 msgid "Chi-Square Tests" msgstr "" #: src/language/stats/crosstabs.q:1294 msgid "Pearson Chi-Square" msgstr "" #: src/language/stats/crosstabs.q:1295 msgid "Likelihood Ratio" msgstr "" #: src/language/stats/crosstabs.q:1296 msgid "Fisher's Exact Test" msgstr "" #: src/language/stats/crosstabs.q:1297 msgid "Continuity Correction" msgstr "" #: src/language/stats/crosstabs.q:1298 msgid "Linear-by-Linear Association" msgstr "" #: src/language/stats/crosstabs.q:1299 src/language/stats/crosstabs.q:1345 #: src/language/stats/crosstabs.q:1854 msgid "N of Valid Cases" msgstr "" #: src/language/stats/crosstabs.q:1305 msgid "Asymptotic Sig. (2-tailed)" msgstr "" #: src/language/stats/crosstabs.q:1319 msgid "Symmetric Measures" msgstr "" #: src/language/stats/crosstabs.q:1324 src/language/stats/crosstabs.q:1364 #: src/language/stats/crosstabs.q:1411 msgid "Values" msgstr "" #: src/language/stats/crosstabs.q:1326 src/language/stats/crosstabs.q:1413 msgid "Asymp. Std. Error" msgstr "" #: src/language/stats/crosstabs.q:1327 src/language/stats/crosstabs.q:1414 msgid "Approx. T" msgstr "" #: src/language/stats/crosstabs.q:1328 src/language/stats/crosstabs.q:1415 msgid "Approx. Sig." msgstr "" #: src/language/stats/crosstabs.q:1333 src/language/stats/crosstabs.q:1420 msgid "Nominal by Nominal" msgstr "" #: src/language/stats/crosstabs.q:1334 msgid "Cramer's V" msgstr "" #: src/language/stats/crosstabs.q:1334 msgid "Contingency Coefficient" msgstr "" #: src/language/stats/crosstabs.q:1336 src/language/stats/crosstabs.q:1425 msgid "Ordinal by Ordinal" msgstr "" #: src/language/stats/crosstabs.q:1337 msgid "Kendall's tau-b" msgstr "" #: src/language/stats/crosstabs.q:1337 msgid "Kendall's tau-c" msgstr "" #: src/language/stats/crosstabs.q:1338 msgid "Spearman Correlation" msgstr "" #: src/language/stats/crosstabs.q:1340 msgid "Interval by Interval" msgstr "" #: src/language/stats/crosstabs.q:1341 msgid "Pearson's R" msgstr "" #: src/language/stats/crosstabs.q:1343 msgid "Measure of Agreement" msgstr "" #: src/language/stats/crosstabs.q:1359 msgid "Risk Estimate" msgstr "" #: src/language/stats/crosstabs.q:1368 #, no-c-format msgid "95% Confidence Interval" msgstr "" #: src/language/stats/crosstabs.q:1389 msgid "Symmetric" msgstr "" #: src/language/stats/crosstabs.q:1391 src/language/stats/crosstabs.q:1396 #, c-format msgid "%s Dependent" msgstr "" #: src/language/stats/crosstabs.q:1406 msgid "Directional Measures" msgstr "" #: src/language/stats/crosstabs.q:1422 msgid "Goodman and Kruskal tau" msgstr "" #: src/language/stats/crosstabs.q:1423 msgid "Uncertainty Coefficient" msgstr "" #: src/language/stats/crosstabs.q:1426 msgid "Somers' d" msgstr "" #: src/language/stats/crosstabs.q:1428 msgid "Nominal by Interval" msgstr "" #: src/language/stats/crosstabs.q:1826 #, c-format msgid "Odds Ratio for %s" msgstr "" #: src/language/stats/crosstabs.q:1835 #, c-format msgid "For cohort %s = " msgstr "" #: src/ui/gui/aggregate.ui:24 msgid "Aggregate Data" msgstr "" #: src/ui/gui/aggregate.ui:126 msgid "_Break variable(s)" msgstr "" #: src/ui/gui/aggregate.ui:179 msgid "Variable Name: " msgstr "" #: src/ui/gui/aggregate.ui:215 msgid "Variable Label: " msgstr "" #: src/ui/gui/aggregate.ui:252 msgid "Function: " msgstr "" #: src/ui/gui/aggregate.ui:327 msgid "Argument 1: " msgstr "" #: src/ui/gui/aggregate.ui:364 msgid "Argument 2: " msgstr "" #: src/ui/gui/aggregate.ui:428 msgid "Aggregated variables" msgstr "" #: src/ui/gui/aggregate.ui:469 msgid "_Add aggregated variables to the active dataset" msgstr "" #: src/ui/gui/aggregate.ui:486 msgid "_Replace the current dataset with the aggregated variables" msgstr "" #: src/ui/gui/aggregate.ui:504 msgid "_Write a new data file containing only the aggregated variables" msgstr "" #: src/ui/gui/aggregate.ui:544 msgid "label" msgstr "" #: src/ui/gui/aggregate.ui:593 msgid "File is _already sorted on break variable(s)" msgstr "" #: src/ui/gui/aggregate.ui:609 msgid "Sort file before a_ggregating" msgstr "" #: src/ui/gui/aggregate.ui:630 msgid "Options for very large datasets" msgstr "" #: src/ui/gui/autorecode.ui:24 msgid "Automatic Recode" msgstr "" #: src/ui/gui/autorecode.ui:120 msgid "Variable -> New Name" msgstr "" #: src/ui/gui/autorecode.ui:145 msgid "_Lowest value" msgstr "" #: src/ui/gui/autorecode.ui:163 msgid "_Highest value" msgstr "" #: src/ui/gui/autorecode.ui:185 msgid "Recode starting from" msgstr "" #: src/ui/gui/autorecode.ui:204 msgid "_New Name" msgstr "" #: src/ui/gui/autorecode.ui:227 msgid "_Add New Name" msgstr "" #: src/ui/gui/autorecode.ui:285 msgid "_Use the same recoding scheme for all variables" msgstr "" #: src/ui/gui/autorecode.ui:301 msgid "Treat _blank string values as missing" msgstr "" #: src/ui/gui/binomial.ui:86 msgid "_Test Variable List:" msgstr "" #: src/ui/gui/binomial.ui:160 src/ui/gui/chi-square.ui:281 msgid "_Get from data" msgstr "" #: src/ui/gui/binomial.ui:181 src/ui/gui/indep-samples.ui:150 msgid "_Cut point:" msgstr "" #: src/ui/gui/binomial.ui:225 msgid "Define Dichotomy" msgstr "" #: src/ui/gui/binomial.ui:245 msgid "Test _Proportion:" msgstr "" #: src/ui/gui/compute.ui:32 msgid "Compute Variable: Type and Label" msgstr "" #: src/ui/gui/compute.ui:67 msgid "Use _expression as label" msgstr "" #: src/ui/gui/compute.ui:90 msgid "_Label:" msgstr "" #: src/ui/gui/compute.ui:194 msgid "_String" msgstr "" #: src/ui/gui/compute.ui:287 msgid "_Numeric" msgstr "" #: src/ui/gui/compute.ui:343 msgid "Compute Variable" msgstr "" #: src/ui/gui/compute.ui:381 msgid "Target _Variable:" msgstr "" #: src/ui/gui/compute.ui:412 msgid "_Type & Label..." msgstr "" #: src/ui/gui/compute.ui:469 msgid "=" msgstr "" #: src/ui/gui/compute.ui:526 msgid "_Numeric Expressions:" msgstr "" #: src/ui/gui/compute.ui:598 msgid "_Functions:" msgstr "" #: src/ui/gui/compute.ui:678 msgid "_If..." msgstr "" #: src/ui/gui/barchart.ui:24 msgid "Barchart" msgstr "" #: src/ui/gui/barchart.ui:112 msgid "Category A_xis:" msgstr "" #: src/ui/gui/barchart.ui:140 msgid "_N of cases" msgstr "" #: src/ui/gui/barchart.ui:158 msgid "_Cum. n of cases" msgstr "" #: src/ui/gui/barchart.ui:174 msgid "Other _summary function" msgstr "" #: src/ui/gui/barchart.ui:191 msgid "% of c_ases" msgstr "" #: src/ui/gui/barchart.ui:207 msgid "C_um. % of cases" msgstr "" #: src/ui/gui/barchart.ui:270 src/ui/gui/histogram.ui:100 msgid "_Variable:" msgstr "" #: src/ui/gui/barchart.ui:308 msgid "Bars Represent" msgstr "" #: src/ui/gui/barchart.ui:340 msgid "Category C_luster:" msgstr "" #: src/ui/gui/correlation.ui:24 msgid "Bivariate Correlations" msgstr "" #: src/ui/gui/correlation.ui:148 msgid "Pearso_n" msgstr "" #: src/ui/gui/correlation.ui:164 msgid "_Kendall's tau-b" msgstr "" #: src/ui/gui/correlation.ui:180 msgid "_Spearman" msgstr "" #: src/ui/gui/correlation.ui:200 msgid "Correlation Coefficients" msgstr "" #: src/ui/gui/correlation.ui:224 msgid "_Two-tailed" msgstr "" #: src/ui/gui/correlation.ui:241 msgid "One-tai_led" msgstr "" #: src/ui/gui/correlation.ui:262 msgid "Test of Significance" msgstr "" #: src/ui/gui/correlation.ui:275 msgid "_Flag significant correlations" msgstr "" #: src/ui/gui/count.ui:24 msgid "Count Occurrences of Values within Cases" msgstr "" #: src/ui/gui/count.ui:117 msgid "Numeric _Variables:" msgstr "" #: src/ui/gui/count.ui:147 msgid "_Target Variable:" msgstr "" #: src/ui/gui/count.ui:178 msgid "Target _Label:" msgstr "" #: src/ui/gui/count.ui:192 msgid "_Define Values..." msgstr "" #: src/ui/gui/count.ui:257 msgid "Count Values within Cases: Values to Count" msgstr "" #: src/ui/gui/count.ui:305 msgid "Values _to Count:" msgstr "" #: src/ui/gui/comments.ui:25 msgid "Data File Comments" msgstr "" #: src/ui/gui/comments.ui:49 msgid "Comments:" msgstr "" #: src/ui/gui/comments.ui:106 msgid "Display comments in output" msgstr "" #: src/ui/gui/comments.ui:127 msgid "Column Number: 0" msgstr "" #: src/ui/gui/crosstabs.ui:25 msgid "Crosstabs: Cells" msgstr "" #: src/ui/gui/crosstabs.ui:67 msgid "Cell Display" msgstr "" #: src/ui/gui/crosstabs.ui:99 msgid "Crosstabs" msgstr "" #: src/ui/gui/crosstabs.ui:150 msgid "_Rows" msgstr "" #: src/ui/gui/crosstabs.ui:195 msgid "_Columns" msgstr "" #: src/ui/gui/crosstabs.ui:242 msgid "_Format..." msgstr "" #: src/ui/gui/crosstabs.ui:256 src/ui/gui/examine.ui:267 msgid "_Statistics..." msgstr "" #: src/ui/gui/crosstabs.ui:270 msgid "Ce_lls..." msgstr "" #: src/ui/gui/crosstabs.ui:348 msgid "Crosstabs: Format" msgstr "" #: src/ui/gui/crosstabs.ui:371 msgid "Print tables" msgstr "" #: src/ui/gui/crosstabs.ui:387 msgid "Pivot" msgstr "" #: src/ui/gui/crosstabs.ui:403 src/ui/gui/sort.ui:157 msgid "Ascending" msgstr "" #: src/ui/gui/crosstabs.ui:455 msgid "Crosstabs: Statistics" msgstr "" #: src/ui/gui/chi-square.ui:30 msgid "Chi-Square Test" msgstr "" #: src/ui/gui/chi-square.ui:82 msgid "All categor_ies equal" msgstr "" #: src/ui/gui/chi-square.ui:103 msgid "_Values" msgstr "" #: src/ui/gui/chi-square.ui:159 msgid "Expected Values:" msgstr "" #: src/ui/gui/chi-square.ui:204 msgid "Test _Variables" msgstr "" #: src/ui/gui/chi-square.ui:298 msgid "Use _specified range" msgstr "" #: src/ui/gui/chi-square.ui:323 msgid "_Lower:" msgstr "" #: src/ui/gui/chi-square.ui:337 msgid "_Upper:" msgstr "" #: src/ui/gui/chi-square.ui:381 msgid "Expected Range:" msgstr "" #: src/ui/gui/descriptives.ui:131 src/ui/gui/factor.ui:797 #: src/ui/gui/recode.ui:638 msgid "_Variables:" msgstr "" #: src/ui/gui/descriptives.ui:176 msgid "S_tatistics:" msgstr "" #: src/ui/gui/descriptives.ui:230 msgid "_Exclude entire case if any selected variable is missing" msgstr "" #: src/ui/gui/descriptives.ui:247 msgid "_Include user-missing data in analysis" msgstr "" #: src/ui/gui/descriptives.ui:264 msgid "Save _Z-scores of selected variables as new variables" msgstr "" #: src/ui/gui/descriptives.ui:286 msgid "Options:" msgstr "" #: src/ui/gui/examine.ui:25 msgid "Explore" msgstr "" #: src/ui/gui/examine.ui:69 msgid "_Label Cases by:" msgstr "" #: src/ui/gui/examine.ui:116 msgid "_Factor List:" msgstr "" #: src/ui/gui/examine.ui:163 src/ui/gui/means.ui:126 msgid "_Dependent List:" msgstr "" #: src/ui/gui/examine.ui:331 msgid "Explore: Options" msgstr "" #: src/ui/gui/examine.ui:355 src/ui/gui/t-test.ui:81 msgid "Exclude cases _listwise" msgstr "" #: src/ui/gui/examine.ui:373 msgid "Exclude cases _pairwise" msgstr "" #: src/ui/gui/examine.ui:392 msgid "_Report values" msgstr "" #: src/ui/gui/examine.ui:449 msgid "Explore: Statistics" msgstr "" #: src/ui/gui/examine.ui:468 src/ui/gui/oneway.ui:576 msgid "_Descriptives" msgstr "" #: src/ui/gui/examine.ui:485 msgid "_Extremes" msgstr "" #: src/ui/gui/examine.ui:502 msgid "_Percentiles" msgstr "" #: src/ui/gui/goto-case.ui:31 msgid "Goto Case" msgstr "" #: src/ui/gui/goto-case.ui:52 msgid "Goto Case Number:" msgstr "" #: src/ui/gui/factor.ui:39 msgid "Factor Analysis: Rotation" msgstr "" #: src/ui/gui/factor.ui:70 msgid "_None" msgstr "" #: src/ui/gui/factor.ui:87 msgid "_Varimax" msgstr "" #: src/ui/gui/factor.ui:104 msgid "_Quartimax" msgstr "" #: src/ui/gui/factor.ui:123 msgid "_Equimax" msgstr "" #: src/ui/gui/factor.ui:146 msgid "Method" msgstr "" #: src/ui/gui/factor.ui:159 msgid "_Display rotated solution" msgstr "" #: src/ui/gui/factor.ui:181 src/ui/gui/factor.ui:582 msgid "Ma_ximum iterations for convergence:" msgstr "" #: src/ui/gui/factor.ui:241 src/ui/gui/factor.ui:255 msgid "Principal Components Analysis" msgstr "" #: src/ui/gui/factor.ui:246 src/ui/gui/factor.ui:258 msgid "Principal Axis Factoring" msgstr "" #: src/ui/gui/factor.ui:264 msgid "Factor Analysis: Extraction" msgstr "" #: src/ui/gui/factor.ui:290 msgid "_Method: " msgstr "" #: src/ui/gui/factor.ui:345 msgid "Co_rrelation matrix" msgstr "" #: src/ui/gui/factor.ui:361 msgid "Co_variance matrix" msgstr "" #: src/ui/gui/factor.ui:382 msgid "Analyze" msgstr "" #: src/ui/gui/factor.ui:407 msgid "_Unrotated factor solution" msgstr "" #: src/ui/gui/factor.ui:423 msgid "_Scree plot" msgstr "" #: src/ui/gui/factor.ui:443 src/ui/gui/histogram.ui:146 src/ui/gui/roc.ui:329 msgid "Display" msgstr "" #: src/ui/gui/factor.ui:526 msgid "_Number of factors:" msgstr "" #: src/ui/gui/factor.ui:563 msgid "Extract" msgstr "" #: src/ui/gui/factor.ui:640 msgid "Factor Analysis" msgstr "" #: src/ui/gui/factor.ui:672 src/ui/gui/data-editor.ui:266 msgid "_Descriptives..." msgstr "" #: src/ui/gui/factor.ui:685 msgid "_Extraction..." msgstr "" #: src/ui/gui/factor.ui:699 msgid "_Rotations..." msgstr "" #: src/ui/gui/find.ui:25 msgid "Find Case" msgstr "" #: src/ui/gui/find.ui:117 msgid "Variable:" msgstr "" #: src/ui/gui/find.ui:157 src/ui/gui/val-labs-dialog.ui:113 msgid "Value:" msgstr "" #: src/ui/gui/find.ui:180 msgid "Search value labels" msgstr "" #: src/ui/gui/find.ui:210 msgid "Regular expression Match" msgstr "" #: src/ui/gui/find.ui:227 msgid "Search substrings" msgstr "" #: src/ui/gui/find.ui:244 msgid "Wrap around" msgstr "" #: src/ui/gui/find.ui:260 msgid "Search backward" msgstr "" #: src/ui/gui/frequencies.ui:32 msgid "Frequencies: Frequency Tables" msgstr "" #: src/ui/gui/frequencies.ui:67 msgid "_Always" msgstr "" #: src/ui/gui/frequencies.ui:85 msgid "_Never" msgstr "" #: src/ui/gui/frequencies.ui:107 msgid "If no _more than " msgstr "" #: src/ui/gui/frequencies.ui:129 src/ui/gui/frequencies.ui:454 msgid "100" msgstr "" #: src/ui/gui/frequencies.ui:145 msgid "values" msgstr "" #: src/ui/gui/frequencies.ui:167 msgid "Display frequency tables" msgstr "" #: src/ui/gui/frequencies.ui:194 msgid "A_scending value" msgstr "" #: src/ui/gui/frequencies.ui:212 msgid "D_escending value" msgstr "" #: src/ui/gui/frequencies.ui:230 msgid "Ascending _frequency" msgstr "" #: src/ui/gui/frequencies.ui:248 msgid "Descending f_requency" msgstr "" #: src/ui/gui/frequencies.ui:271 msgid "Order by" msgstr "" #: src/ui/gui/frequencies.ui:324 msgid "Frequencies: Charts" msgstr "" #: src/ui/gui/frequencies.ui:356 msgid "Scale:" msgstr "" #: src/ui/gui/frequencies.ui:366 msgid "_Frequencies" msgstr "" #: src/ui/gui/frequencies.ui:383 msgid "_Percentages" msgstr "" #: src/ui/gui/frequencies.ui:407 msgid "Exclude values _below " msgstr "" #: src/ui/gui/frequencies.ui:422 msgid "Exclude values _above " msgstr "" #: src/ui/gui/frequencies.ui:441 src/ui/gui/reliability.ui:227 msgid "0" msgstr "" #: src/ui/gui/frequencies.ui:469 msgid "Chart Formatting" msgstr "" #: src/ui/gui/frequencies.ui:494 msgid "Draw _histograms" msgstr "" #: src/ui/gui/frequencies.ui:510 msgid "Superimpose _normal curve" msgstr "" #: src/ui/gui/frequencies.ui:530 msgid "Histograms" msgstr "" #: src/ui/gui/frequencies.ui:555 msgid "Draw _bar charts" msgstr "" #: src/ui/gui/frequencies.ui:575 msgid "Bar Charts" msgstr "" #: src/ui/gui/frequencies.ui:600 msgid "Draw _pie charts" msgstr "" #: src/ui/gui/frequencies.ui:616 msgid "Include slices for _missing values" msgstr "" #: src/ui/gui/frequencies.ui:636 msgid "Pie Charts" msgstr "" #: src/ui/gui/frequencies.ui:725 src/ui/gui/rank.ui:489 msgid "_Variable(s):" msgstr "" #: src/ui/gui/frequencies.ui:769 msgid "_Statistics:" msgstr "" #: src/ui/gui/frequencies.ui:783 msgid "Include _missing values" msgstr "" #: src/ui/gui/frequencies.ui:806 msgid "Ch_arts..." msgstr "" #: src/ui/gui/frequencies.ui:821 msgid "Frequency _Tables..." msgstr "" #: src/ui/gui/histogram.ui:24 msgid "Histogram" msgstr "" #: src/ui/gui/histogram.ui:126 msgid "_Display normal curve" msgstr "" #: src/ui/gui/indep-samples.ui:25 src/ui/gui/k-independent.ui:35 msgid "Define Groups" msgstr "" #: src/ui/gui/indep-samples.ui:75 msgid "Group_2 value:" msgstr "" #: src/ui/gui/indep-samples.ui:89 msgid "Group_1 value:" msgstr "" #: src/ui/gui/indep-samples.ui:190 msgid "_Use specified values:" msgstr "" #: src/ui/gui/indep-samples.ui:259 msgid "Independent-Samples T Test" msgstr "" #: src/ui/gui/indep-samples.ui:319 msgid "_Define Groups..." msgstr "" #: src/ui/gui/indep-samples.ui:401 src/ui/gui/t-test.ui:211 msgid "_Test Variable(s):" msgstr "" #: src/ui/gui/indep-samples.ui:454 src/ui/gui/k-independent.ui:165 msgid "_Grouping Variable:" msgstr "" #: src/ui/gui/k-independent.ui:63 msgid "_Upper limit:" msgstr "" #: src/ui/gui/k-independent.ui:77 msgid "_Lower limit:" msgstr "" #: src/ui/gui/k-independent.ui:136 msgid "Tests for Several Independent Samples" msgstr "" #: src/ui/gui/k-independent.ui:208 src/ui/gui/ks-one-sample.ui:131 msgid "Test _Variable List:" msgstr "" #: src/ui/gui/k-independent.ui:320 msgid "_Define Groups" msgstr "" #: src/ui/gui/k-independent.ui:365 msgid "_Kruskal-Wallis H" msgstr "" #: src/ui/gui/k-independent.ui:382 src/ui/gui/runs.ui:140 msgid "_Median" msgstr "" #: src/ui/gui/k-means.ui:24 msgid "K-Means Cluster Analysis" msgstr "" #: src/ui/gui/k-means.ui:122 msgid "N_umber of Clusters: " msgstr "" #: src/ui/gui/k-related.ui:24 msgid "Tests for Several Related Samples" msgstr "" #: src/ui/gui/k-related.ui:113 msgid "_Test Variables:" msgstr "" #: src/ui/gui/k-related.ui:145 msgid "_Friedman" msgstr "" #: src/ui/gui/k-related.ui:161 msgid "_Kendall's W" msgstr "" #: src/ui/gui/k-related.ui:177 msgid "_Cochran's Q" msgstr "" #: src/ui/gui/ks-one-sample.ui:163 msgid "_Normal" msgstr "" #: src/ui/gui/ks-one-sample.ui:181 msgid "_Poisson" msgstr "" #: src/ui/gui/ks-one-sample.ui:198 msgid "_Uniform" msgstr "" #: src/ui/gui/ks-one-sample.ui:213 msgid "_Exponential" msgstr "" #: src/ui/gui/ks-one-sample.ui:232 msgid "Test Distribution" msgstr "" #: src/ui/gui/logistic.ui:42 msgid "Logistic Regression: Options" msgstr "" #: src/ui/gui/logistic.ui:66 msgid "CI for _exp(B): " msgstr "" #: src/ui/gui/logistic.ui:97 msgid "%" msgstr "" #: src/ui/gui/logistic.ui:146 msgid "Classification cu_toff: " msgstr "" #: src/ui/gui/logistic.ui:159 msgid "_Maximum Iterations: " msgstr "" #: src/ui/gui/logistic.ui:177 msgid "Include _constant in model" msgstr "" #: src/ui/gui/logistic.ui:219 msgid "Logistic Regression" msgstr "" #: src/ui/gui/logistic.ui:364 src/ui/gui/regression.ui:185 msgid "_Dependent" msgstr "" #: src/ui/gui/logistic.ui:412 src/ui/gui/regression.ui:232 msgid "_Independent" msgstr "" #: src/ui/gui/means.ui:25 msgid "Means" msgstr "" #: src/ui/gui/means.ui:179 msgid "_Independent List:" msgstr "" #: src/ui/gui/missing-val-dialog.ui:48 msgid "_No missing values" msgstr "" #: src/ui/gui/missing-val-dialog.ui:136 msgid "_Discrete missing values" msgstr "" #: src/ui/gui/missing-val-dialog.ui:172 msgid "_Low:" msgstr "" #: src/ui/gui/missing-val-dialog.ui:197 msgid "_High:" msgstr "" #: src/ui/gui/missing-val-dialog.ui:221 msgid "Di_screte value:" msgstr "" #: src/ui/gui/missing-val-dialog.ui:245 msgid "_Range plus one optional discrete missing value" msgstr "" #: src/ui/gui/oneway.ui:25 msgid "One-Way ANOVA: Contrasts" msgstr "" #: src/ui/gui/oneway.ui:107 msgid "_Coefficients:" msgstr "" #: src/ui/gui/oneway.ui:161 msgid "Coefficient Total: " msgstr "" #: src/ui/gui/oneway.ui:198 msgid "Contrast 1 of 1" msgstr "" #: src/ui/gui/oneway.ui:234 msgid "One-Way ANOVA: Post-Hoc" msgstr "" #: src/ui/gui/oneway.ui:270 msgid "Games Howell" msgstr "" #: src/ui/gui/oneway.ui:287 msgid "Fisher's LSD" msgstr "" #: src/ui/gui/oneway.ui:379 msgid "One-Way ANOVA" msgstr "" #: src/ui/gui/oneway.ui:408 msgid "_Factor:" msgstr "" #: src/ui/gui/oneway.ui:451 msgid "Dependent _Variable(s):" msgstr "" #: src/ui/gui/oneway.ui:593 msgid "_Homogeneity" msgstr "" #: src/ui/gui/oneway.ui:637 msgid "Post-Hoc..." msgstr "" #: src/ui/gui/oneway.ui:652 msgid "_Contrasts..." msgstr "" #: src/ui/gui/options.ui:25 msgid "Options Case" msgstr "" #: src/ui/gui/options.ui:55 msgid "Display _Labels" msgstr "" #: src/ui/gui/options.ui:71 msgid "Display _Names" msgstr "" #: src/ui/gui/options.ui:99 msgid "Sort by L_abel" msgstr "" #: src/ui/gui/options.ui:115 msgid "Sort by Na_me" msgstr "" #: src/ui/gui/options.ui:131 msgid "Do not S_ort" msgstr "" #: src/ui/gui/options.ui:159 msgid "Variable Lists" msgstr "" #: src/ui/gui/options.ui:184 msgid "Ma_ximize" msgstr "" #: src/ui/gui/options.ui:199 msgid "_Raise" msgstr "" #: src/ui/gui/options.ui:214 msgid "Aler_t" msgstr "" #: src/ui/gui/options.ui:233 msgid "Output Window Action" msgstr "" #: src/ui/gui/paired-samples.ui:147 msgid "_Test Pair(s):" msgstr "" #: src/ui/gui/rank.ui:30 msgid "Rank Cases: Types" msgstr "" #: src/ui/gui/rank.ui:57 msgid "Sum of case _weights" msgstr "" #: src/ui/gui/rank.ui:74 msgid "Fractional rank as _%" msgstr "" #: src/ui/gui/rank.ui:92 msgid "_Fractional rank" msgstr "" #: src/ui/gui/rank.ui:109 msgid "_Savage score" msgstr "" #: src/ui/gui/rank.ui:125 msgid "_Rank" msgstr "" #: src/ui/gui/rank.ui:147 msgid "N_tiles" msgstr "" #: src/ui/gui/rank.ui:195 msgid "_Proportion Estimates" msgstr "" #: src/ui/gui/rank.ui:213 msgid "_Normal Scores" msgstr "" #: src/ui/gui/rank.ui:251 msgid "_Blom" msgstr "" #: src/ui/gui/rank.ui:269 msgid "Tuke_y" msgstr "" #: src/ui/gui/rank.ui:287 msgid "Ran_kit" msgstr "" #: src/ui/gui/rank.ui:305 msgid "_Van der Waerden" msgstr "" #: src/ui/gui/rank.ui:328 msgid "Proportion Estimation Formula" msgstr "" #: src/ui/gui/rank.ui:369 msgid "Rank Cases" msgstr "" #: src/ui/gui/rank.ui:434 msgid "_By:" msgstr "" #: src/ui/gui/rank.ui:595 msgid "_Smallest Value" msgstr "" #: src/ui/gui/rank.ui:613 msgid "_Largest Value" msgstr "" #: src/ui/gui/rank.ui:637 msgid "Assign rank 1 to:" msgstr "" #: src/ui/gui/rank.ui:656 msgid "_Display summary tables" msgstr "" #: src/ui/gui/rank.ui:679 msgid "Rank T_ypes" msgstr "" #: src/ui/gui/rank.ui:694 msgid "_Ties..." msgstr "" #: src/ui/gui/rank.ui:756 msgid "Rank Cases: Ties" msgstr "" #: src/ui/gui/rank.ui:788 msgid "_Mean" msgstr "" #: src/ui/gui/rank.ui:806 msgid "_Low" msgstr "" #: src/ui/gui/rank.ui:825 msgid "_High" msgstr "" #: src/ui/gui/rank.ui:851 msgid "_Sequential ranks to unique values" msgstr "" #: src/ui/gui/rank.ui:875 msgid "Rank Assigned to Ties" msgstr "" #: src/ui/gui/runs.ui:155 msgid "M_ean" msgstr "" #: src/ui/gui/runs.ui:171 msgid "Mo_de" msgstr "" #: src/ui/gui/runs.ui:191 msgid "_Custom:" msgstr "" #: src/ui/gui/runs.ui:230 msgid "Cut Point" msgstr "" #: src/ui/gui/sort.ui:25 msgid "Sort Cases" msgstr "" #: src/ui/gui/sort.ui:101 msgid "Sort by:" msgstr "" #: src/ui/gui/sort.ui:174 msgid "Descending" msgstr "" #: src/ui/gui/sort.ui:196 msgid "Sort Order" msgstr "" #: src/ui/gui/split-file.ui:25 msgid "Split File" msgstr "" #: src/ui/gui/split-file.ui:103 msgid "Anal_yze all cases. Do not create groups." msgstr "" #: src/ui/gui/split-file.ui:121 msgid "Compare _groups." msgstr "" #: src/ui/gui/split-file.ui:140 msgid "Organize ou_tput by groups." msgstr "" #: src/ui/gui/split-file.ui:225 msgid "Groups _based on:" msgstr "" #: src/ui/gui/split-file.ui:255 msgid "_Sort the file by grouping variables." msgstr "" #: src/ui/gui/split-file.ui:273 msgid "_File is already sorted." msgstr "" #: src/ui/gui/split-file.ui:334 msgid "Current Status : " msgstr "" #: src/ui/gui/split-file.ui:348 msgid "Analysis by groups is off" msgstr "" #: src/ui/gui/recode.ui:135 msgid "System _Missing" msgstr "" #: src/ui/gui/recode.ui:150 msgid "Co_py old values" msgstr "" #: src/ui/gui/recode.ui:172 msgid "Va_lue: " msgstr "" #: src/ui/gui/recode.ui:276 msgid "Conver_t numeric strings to numbers (`5' -> 5)" msgstr "" #: src/ui/gui/recode.ui:297 msgid "Output variables are _strings" msgstr "" #: src/ui/gui/recode.ui:318 msgid "Width: " msgstr "" #: src/ui/gui/recode.ui:499 msgid "_Name:" msgstr "" #: src/ui/gui/recode.ui:527 msgid "La_bel:" msgstr "" #: src/ui/gui/recode.ui:556 msgid "Chan_ge" msgstr "" #: src/ui/gui/recode.ui:584 msgid "Output Variable" msgstr "" #: src/ui/gui/recode.ui:658 msgid "Old and New Va_lues..." msgstr "" #: src/ui/gui/regression.ui:51 msgid "S_tatistics..." msgstr "" #: src/ui/gui/regression.ui:272 msgid "Regression: Save" msgstr "" #: src/ui/gui/regression.ui:290 src/ui/gui/univariate.ui:42 msgid "_Predicted values" msgstr "" #: src/ui/gui/regression.ui:307 src/ui/gui/univariate.ui:59 msgid "_Residuals" msgstr "" #: src/ui/gui/regression.ui:351 msgid "Regression: Statistics" msgstr "" #: src/ui/gui/regression.ui:393 src/ui/gui/univariate.ui:143 msgid "S_tatistics" msgstr "" #: src/ui/gui/reliability.ui:34 msgid "Alpha" msgstr "" #: src/ui/gui/reliability.ui:43 msgid "Reliability Analysis" msgstr "" #: src/ui/gui/reliability.ui:144 msgid "_Items:" msgstr "" #: src/ui/gui/reliability.ui:166 msgid "_Model: " msgstr "" #: src/ui/gui/reliability.ui:212 msgid "_Variables in first split:" msgstr "" #: src/ui/gui/reliability.ui:259 msgid "Show _descriptives for scale if item is deleted" msgstr "" #: src/ui/gui/roc.ui:145 msgid "_Test Variable:" msgstr "" #: src/ui/gui/roc.ui:175 msgid "_State Variable:" msgstr "" #: src/ui/gui/roc.ui:202 msgid "_Value of state variable:" msgstr "" #: src/ui/gui/roc.ui:249 msgid "ROC C_urve" msgstr "" #: src/ui/gui/roc.ui:269 msgid "_With diagonal reference line" msgstr "" #: src/ui/gui/roc.ui:293 msgid "Standard _Error and Confidence Interval" msgstr "" #: src/ui/gui/roc.ui:309 msgid "_Coordinate points of the ROC Curve" msgstr "" #: src/ui/gui/scatterplot.ui:25 msgid "Scatterplot" msgstr "" #: src/ui/gui/scatterplot.ui:56 msgid "_X Axis:" msgstr "" #: src/ui/gui/scatterplot.ui:100 msgid "_Y Axis:" msgstr "" #: src/ui/gui/select-cases.ui:37 msgid "Select Cases: Range" msgstr "" #: src/ui/gui/select-cases.ui:87 msgid "First case" msgstr "" #: src/ui/gui/select-cases.ui:99 msgid "Last case" msgstr "" #: src/ui/gui/select-cases.ui:111 msgid "Observation" msgstr "" #: src/ui/gui/select-cases.ui:161 msgid "Select Cases" msgstr "" #: src/ui/gui/select-cases.ui:313 msgid "Use filter variable" msgstr "" #: src/ui/gui/select-cases.ui:380 msgid "Based on time or case range" msgstr "" #: src/ui/gui/select-cases.ui:395 msgid "Range..." msgstr "" #: src/ui/gui/select-cases.ui:444 msgid "Random sample of cases" msgstr "" #: src/ui/gui/select-cases.ui:460 msgid "Sample..." msgstr "" #: src/ui/gui/select-cases.ui:508 msgid "If condition is satisfied" msgstr "" #: src/ui/gui/select-cases.ui:523 msgid "If..." msgstr "" #: src/ui/gui/select-cases.ui:567 msgid "All Cases" msgstr "" #: src/ui/gui/select-cases.ui:581 msgid "Select" msgstr "" #: src/ui/gui/select-cases.ui:608 msgid "Filtered" msgstr "" #: src/ui/gui/select-cases.ui:625 msgid "Deleted" msgstr "" #: src/ui/gui/select-cases.ui:647 msgid "Unselected Cases Are" msgstr "" #: src/ui/gui/select-cases.ui:694 msgid "Select Cases: Random Sample" msgstr "" #: src/ui/gui/select-cases.ui:756 msgid "Sample Size" msgstr "" #: src/ui/gui/t-test.ui:25 msgid "Options" msgstr "" #: src/ui/gui/t-test.ui:63 msgid "Exclude cases _analysis by analysis" msgstr "" #: src/ui/gui/t-test.ui:148 msgid "One - Sample T Test" msgstr "" #: src/ui/gui/t-test.ui:265 msgid "Test _Value: " msgstr "" #: src/ui/gui/text-data-import.ui:32 msgid "Select the first line of the data file that contains data." msgstr "" #: src/ui/gui/text-data-import.ui:54 msgid "Line above selected line contains variable names" msgstr "" #: src/ui/gui/text-data-import.ui:80 msgid "" "Check the data formats displayed below and fix any that are incorrect. You " "may set other variable properties now or later." msgstr "" #: src/ui/gui/text-data-import.ui:121 msgid "Variables" msgstr "" #: src/ui/gui/text-data-import.ui:152 msgid "Data Preview" msgstr "" #: src/ui/gui/text-data-import.ui:181 msgid "" "This assistant will guide you through the process of importing data into " "PSPP from a text file with one line per case, in which fields are separated " "by tabs, commas, or other delimiters.\n" "\n" "\tThe selected file contains N lines of text. Only the first M of these " "will be shown for preview purposes in the following screens. You may choose " "below how much of the file should actually be imported." msgstr "" #: src/ui/gui/text-data-import.ui:252 msgid "All cases" msgstr "" #: src/ui/gui/text-data-import.ui:272 msgid "Amount to Import" msgstr "" #: src/ui/gui/text-data-import.ui:325 msgid "C_ustom" msgstr "" #: src/ui/gui/text-data-import.ui:341 msgid "Slas_h (/)" msgstr "" #: src/ui/gui/text-data-import.ui:357 msgid "Semicolo_n (;)" msgstr "" #: src/ui/gui/text-data-import.ui:373 msgid "P_ipe (|)" msgstr "" #: src/ui/gui/text-data-import.ui:389 msgid "H_yphen (-)" msgstr "" #: src/ui/gui/text-data-import.ui:405 msgid "Co_mma (,)" msgstr "" #: src/ui/gui/text-data-import.ui:421 msgid "_Colon (:)" msgstr "" #: src/ui/gui/text-data-import.ui:437 msgid "Ban_g (!)" msgstr "" #: src/ui/gui/text-data-import.ui:453 msgid "Ta_b" msgstr "" #: src/ui/gui/text-data-import.ui:469 msgid "_Space" msgstr "" #: src/ui/gui/text-data-import.ui:490 msgid "Separators" msgstr "" #: src/ui/gui/text-data-import.ui:541 msgid "Quote separator characters with" msgstr "" #: src/ui/gui/text-data-import.ui:561 msgid "Quoting" msgstr "" #: src/ui/gui/text-data-import.ui:599 msgid "Fields Preview" msgstr "" #: src/ui/gui/text-data-import.ui:622 msgid "" "Enter below the sheet number and the cell range which you wish to import." msgstr "" #: src/ui/gui/text-data-import.ui:670 msgid "_Cells: " msgstr "" #: src/ui/gui/text-data-import.ui:684 msgid "_Sheet Index: " msgstr "" #: src/ui/gui/text-data-import.ui:695 msgid "Use first row as _variable names" msgstr "" #: src/ui/gui/text-data-import.ui:717 msgid "Cells to Import" msgstr "" #: src/ui/gui/transpose.ui:24 msgid "Transpose" msgstr "" #: src/ui/gui/transpose.ui:91 msgid "Name Variable:" msgstr "" #: src/ui/gui/transpose.ui:127 msgid "Variable(s):" msgstr "" #: src/ui/gui/univariate.ui:25 msgid "Univariate: Save" msgstr "" #: src/ui/gui/univariate.ui:103 msgid "Univariate: Statistics" msgstr "" #: src/ui/gui/univariate.ui:178 msgid "Univariate" msgstr "" #: src/ui/gui/univariate.ui:281 msgid "_Dependent Variable" msgstr "" #: src/ui/gui/univariate.ui:329 msgid "_Fixed Factors" msgstr "" #: src/ui/gui/val-labs-dialog.ui:101 msgid "Value Label:" msgstr "" #: src/ui/gui/data-editor.ui:33 msgid "Information Area" msgstr "" #: src/ui/gui/data-editor.ui:55 msgid "Case Counter Area" msgstr "" #: src/ui/gui/data-editor.ui:80 msgid "Filter Use Status Area" msgstr "" #: src/ui/gui/data-editor.ui:106 msgid "Weight Status Area" msgstr "" #: src/ui/gui/data-editor.ui:132 msgid "Split File Status Area" msgstr "" #: src/ui/gui/data-editor.ui:154 msgid "_View" msgstr "" #: src/ui/gui/data-editor.ui:157 msgid "_Status Bar" msgstr "" #: src/ui/gui/data-editor.ui:163 msgid "_Font..." msgstr "" #: src/ui/gui/data-editor.ui:167 msgid "_Grid Lines" msgstr "" #: src/ui/gui/data-editor.ui:171 msgid "Value _Labels" msgstr "" #: src/ui/gui/data-editor.ui:182 msgid "_Variables" msgstr "" #: src/ui/gui/data-editor.ui:192 msgid "_Sort Cases..." msgstr "" #: src/ui/gui/data-editor.ui:196 msgid "_Transpose..." msgstr "" #: src/ui/gui/data-editor.ui:200 msgid "_Aggregate..." msgstr "" #: src/ui/gui/data-editor.ui:206 msgid "S_plit File..." msgstr "" #: src/ui/gui/data-editor.ui:210 msgid "Select _Cases..." msgstr "" #: src/ui/gui/data-editor.ui:214 msgid "_Weight Cases..." msgstr "" #: src/ui/gui/data-editor.ui:220 msgid "_Transform" msgstr "" #: src/ui/gui/data-editor.ui:223 msgid "_Compute..." msgstr "" #: src/ui/gui/data-editor.ui:227 msgid "Cou_nt..." msgstr "" #: src/ui/gui/data-editor.ui:231 msgid "Ran_k Cases..." msgstr "" #: src/ui/gui/data-editor.ui:235 msgid "Auto_matic Recode..." msgstr "" #: src/ui/gui/data-editor.ui:241 msgid "Recode into _Same Variables..." msgstr "" #: src/ui/gui/data-editor.ui:245 msgid "Recode into _Different Variables..." msgstr "" #: src/ui/gui/data-editor.ui:251 msgid "_Run Pending Transforms" msgstr "" #: src/ui/gui/data-editor.ui:257 msgid "_Analyze" msgstr "" #: src/ui/gui/data-editor.ui:260 msgid "_Descriptive Statistics" msgstr "" #: src/ui/gui/data-editor.ui:262 msgid "_Frequencies..." msgstr "" #: src/ui/gui/data-editor.ui:270 msgid "_Explore..." msgstr "" #: src/ui/gui/data-editor.ui:274 msgid "_Crosstabs..." msgstr "" #: src/ui/gui/data-editor.ui:279 msgid "Compare _Means" msgstr "" #: src/ui/gui/data-editor.ui:281 msgid "_Means..." msgstr "" #: src/ui/gui/data-editor.ui:285 msgid "_One Sample T Test..." msgstr "" #: src/ui/gui/data-editor.ui:289 msgid "_Independent Samples T Test..." msgstr "" #: src/ui/gui/data-editor.ui:293 msgid "_Paired Samples T Test..." msgstr "" #: src/ui/gui/data-editor.ui:297 msgid "One Way _ANOVA..." msgstr "" #: src/ui/gui/data-editor.ui:302 msgid "_Univariate Analysis..." msgstr "" #: src/ui/gui/data-editor.ui:306 msgid "Bivariate _Correlation..." msgstr "" #: src/ui/gui/data-editor.ui:310 msgid "_K-Means Cluster..." msgstr "" #: src/ui/gui/data-editor.ui:314 msgid "_Factor Analysis..." msgstr "" #: src/ui/gui/data-editor.ui:318 msgid "Re_liability..." msgstr "" #: src/ui/gui/data-editor.ui:322 msgid "_Regression" msgstr "" #: src/ui/gui/data-editor.ui:325 msgid "_Linear..." msgstr "" #: src/ui/gui/data-editor.ui:329 msgid "_Binary Logistic..." msgstr "" #: src/ui/gui/data-editor.ui:335 msgid "_Non-Parametric Statistics" msgstr "" #: src/ui/gui/data-editor.ui:338 msgid "_Chi Square..." msgstr "" #: src/ui/gui/data-editor.ui:342 msgid "_Binomial..." msgstr "" #: src/ui/gui/data-editor.ui:346 msgid "_Runs..." msgstr "" #: src/ui/gui/data-editor.ui:350 msgid "_1 Sample K-S..." msgstr "" #: src/ui/gui/data-editor.ui:354 msgid "_2 Related Samples..." msgstr "" #: src/ui/gui/data-editor.ui:358 msgid "_K Related Samples..." msgstr "" #: src/ui/gui/data-editor.ui:362 msgid "K _Independent Samples..." msgstr "" #: src/ui/gui/data-editor.ui:368 msgid "ROC Cur_ve..." msgstr "" #: src/ui/gui/data-editor.ui:374 msgid "_Graphs" msgstr "" #: src/ui/gui/data-editor.ui:377 msgid "_Scatterplot" msgstr "" #: src/ui/gui/data-editor.ui:381 msgid "_Histogram" msgstr "" #: src/ui/gui/data-editor.ui:385 msgid "_Barchart" msgstr "" #: src/ui/gui/data-editor.ui:391 msgid "_Utilities" msgstr "" #: src/ui/gui/data-editor.ui:394 msgid "_Variables..." msgstr "" #: src/ui/gui/data-editor.ui:398 msgid "Data File _Comments..." msgstr "" #: src/ui/gui/output-window.ui:71 msgid "_Print..." msgstr "" #: src/ui/gui/output-window.ui:76 msgid "_Export..." msgstr "" #: src/ui/gui/output-window.ui:92 msgid "Select _All" msgstr "" #: src/ui/gui/syntax-editor.ui:27 msgid "Syntax" msgstr "" #: src/ui/gui/syntax-editor.ui:31 msgid "Data" msgstr "" #: src/ui/gui/syntax-editor.ui:41 msgid "_Save" msgstr "" #: src/ui/gui/syntax-editor.ui:46 msgid "Save _As" msgstr "" #: src/ui/gui/syntax-editor.ui:53 msgid "_Print" msgstr "" #: src/ui/gui/syntax-editor.ui:84 msgid "_Delete" msgstr "" #: src/ui/gui/syntax-editor.ui:90 msgid "_Undo" msgstr "" #: src/ui/gui/syntax-editor.ui:94 msgid "_Redo" msgstr "" #: src/ui/gui/syntax-editor.ui:100 msgid "_Find" msgstr "" #: src/ui/gui/syntax-editor.ui:106 msgid "_Run" msgstr "" #: src/ui/gui/syntax-editor.ui:109 msgid "_All" msgstr "" #: src/ui/gui/syntax-editor.ui:113 msgid "_Selection" msgstr "" #: src/ui/gui/syntax-editor.ui:117 msgid "_Current Line" msgstr "" #: src/ui/gui/syntax-editor.ui:122 msgid "_To End" msgstr "" #: src/ui/gui/var-type-dialog.ui:99 msgid "Scientific notation" msgstr "" #: src/ui/gui/var-type-dialog.ui:150 msgid "Custom currency" msgstr "" #: src/ui/gui/var-type-dialog.ui:267 msgid "positive" msgstr "" #: src/ui/gui/var-type-dialog.ui:279 msgid "negative" msgstr "" #: src/ui/gui/var-type-dialog.ui:293 msgid "Sample" msgstr "" #: src/ui/gui/var-type-dialog.ui:350 msgid "Width:" msgstr "" #: src/ui/gui/var-type-dialog.ui:396 msgid "Decimal Places:" msgstr "" #: src/ui/gui/weight.ui:24 msgid "Weight Cases" msgstr "" #: src/ui/gui/weight.ui:100 msgid "Weight cases by" msgstr "" #: src/ui/gui/weight.ui:144 msgid "Frequency Variable" msgstr "" #: src/ui/gui/weight.ui:198 msgid "Current Status: " msgstr "" #. TRANSLATORS: This is the application name in the desktop file #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:7 #: src/ui/gui/org.fsf.pspp.desktop.in:7 msgid "GNU PSPP" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:8 msgid "GNU PSPP is a program for statistical analysis of sampled data" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:10 msgid "" "GNU PSPP is a program for the statistical analysis of sampled data. It is a " "Free replacement for the proprietary program SPSS, and appears very similar " "to it with a few exceptions. The most important of these exceptions are, " "that there are no “time bombs”; your copy of PSPP will not “expire” or " "deliberately stop working in the future. Neither are there any artificial " "limits on the number of cases or variables which you can use. There are no " "additional packages to purchase in order to get “advanced” functions; all " "functionality that PSPP currently supports is in the core package." msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:11 msgid "" "PSPP is a stable and reliable application. It can perform descriptive " "statistics, T-tests, anova, linear and logistic regression, measures of " "association, cluster analysis, reliability and factor analysis, non-" "parametric tests and more. Its backend is designed to perform its analyses " "as fast as possible, regardless of the size of the input data. You can use " "PSPP with its graphical interface or the more traditional syntax commands." msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:12 msgid "A brief list of some of the PSPP's features." msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:14 msgid "Support for over 1 billion cases" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:15 msgid "Support for over 1 billion variables" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:16 msgid "Syntax and data files which are compatible with those of SPSS" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:17 msgid "A choice of terminal or graphical user interface" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:18 msgid "A choice of text, postscript, pdf, opendocument or html output formats" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:19 msgid "" "Inter-operability with: LibreOffice, Apache OpenOffice, Gnumeric and other " "free software" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:20 msgid "Easy data import from spreadsheets, text files and database sources" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:21 msgid "" "The capability to open, analyse and edit two or more datasets concurrently" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:22 msgid "A user interface supporting all common character sets" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:23 msgid "A user interface has been translated to multiple languages" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:24 msgid "Very fast statistical procedures, even on very large data sets" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:25 msgid "No license fees and no expiration period" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:26 msgid "No unethical “end user license agreements”" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:27 msgid "A fully indexed user manual" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:28 msgid "Freedom ensured; It is licensed under the GPLv3 or later" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:29 msgid "" "Portability; Runs on many different computers and many different operating " "systems" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:31 msgid "" "PSPP is particularly aimed at statisticians, social scientists and students " "requiring fast convenient analysis of sampled data." msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:41 msgid "GNU PSPP Variable View" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:54 msgid "Free Software Foundation" msgstr "" #. TRANSLATORS: Do not translate this string. Keep it as is, verbatim. #: src/ui/gui/org.fsf.pspp.desktop.in:12 msgid "pspp" msgstr "" #. TRANSLATORS: You must keep all ";" - also at the end of line. #: src/ui/gui/org.fsf.pspp.desktop.in:17 msgid "statistics;analysis;spss;" msgstr "" pspp-1.4.1/po/nl.po0000644000175000017500000116013113725012645013512 0ustar00blpblp00000000000000# Dutch translation for pspp. # Copyright (C) 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017 Free Software Foundation, Inc. # This file is distributed under the same licence as the PSPP package. # filename: pspp-.nl.po # Harry Thijssen , 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017. # Jaap Verhage , 2017, 2018. # Weet je een betere vertaling dan de huidige of een vertaling voor een nog niet vertaalde ingang, mail die dan naar Jaap alsjeblieft. msgid "" msgstr "" "Project-Id-Version: pspp-1.4.0\n" "Report-Msgid-Bugs-To: pspp-dev@gnu.org\n" "PO-Revision-Date: 2020-08-21 11:56+0200\n" "Last-Translator: Jaap Verhage \n" "Language-Team: Dutch \n" "Language: nl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Bugs: Report translation errors to the Language-Team address.\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Poedit 2.4.1\n" "X-Poedit-Bookmarks: 270,-1,-1,-1,-1,-1,-1,-1,-1,-1\n" #: src/data/any-reader.c:72 src/data/encrypted-file.c:78 #, c-format msgid "An error occurred while opening `%s': %s." msgstr "Fout opgetreden bij openen van `%s': %s." #: src/data/any-reader.c:93 src/language/lexer/lexer.c:1633 #, c-format msgid "Error reading `%s': %s." msgstr "Fout bij lezen `%s': %s." #: src/data/any-reader.c:114 #, c-format msgid "`%s' is not a system or portable file." msgstr "`%s' is geen systeem- of overdraagbaar bestand." #: src/data/any-reader.c:123 src/data/any-writer.c:66 msgid "The inline file is not allowed here." msgstr "Het \"inline\"-bestand is hier niet toegestaan." #: src/data/any-reader.c:205 #, c-format msgid "" "Cannot read from dataset %s because no dictionary or data has been written " "to it yet." msgstr "" "Kan niet lezen van dataset %s omdat er nog geen woordenboek of gegevens " "naartoe zijn geschreven." #: src/data/any-reader.c:260 src/language/data-io/dataset.c:253 msgid "Dataset" msgstr "Dataset" #: src/data/calendar.c:100 #, c-format msgid "Month %d is not in acceptable range of 0 to 13." msgstr "Maand %d valt niet in het acceptabele bereik van 0 tot en met 13." #: src/data/calendar.c:110 #, c-format msgid "Day %d is not in acceptable range of 0 to 31." msgstr "Dag %d valt niet in het acceptabele bereik van 0 tot en met 31." #: src/data/calendar.c:119 #, c-format msgid "Date %04d-%d-%d is before the earliest acceptable date of 1582-10-15." msgstr "Datum %04d-%d-%d ligt vóór de eerste acceptabele datum van 1582-10-15." #: src/data/casereader-filter.c:221 msgid "" "At least one case in the data read had a weight value that was user-missing, " "system-missing, zero, or negative. These case(s) were ignored." msgstr "" "Tenminste één observatie in de gelezen gegevens heeft een gewicht met user-" "missing, system-missing, zero, of negatief als waarde. Deze observatie(s) " "zijn genegeerd." #. TRANSLATORS: this fragment will be interpolated into messages in fh_lock() #. that identify types of files. #: src/data/csv-file-writer.c:138 msgid "CSV file" msgstr "CSV-bestand" #: src/data/csv-file-writer.c:146 #, fuzzy, c-format #| msgid "Error opening `%s' for writing as a system file: %s." msgid "Error opening `%s' for writing as a CSV file: %s." msgstr "Fout bij het openen van `%s' voor schrijven als systeembestand: %s." #: src/data/csv-file-writer.c:453 #, c-format msgid "An I/O error occurred writing CSV file `%s'." msgstr "Een I/O-fout is opgetreden tijdens schrijven van systeembestand `%s'." #: src/data/data-in.c:175 #, c-format msgid "Data is not valid as format %s: %s" msgstr "Gegevens zijn niet geldig voor indeling %s: %s" #: src/data/data-in.c:377 src/data/data-in.c:553 msgid "Field contents are not numeric." msgstr "Veldinhoud is niet numeriek." #: src/data/data-in.c:379 src/data/data-in.c:555 msgid "Number followed by garbage." msgstr "Getal gevolgd door rommel." #: src/data/data-in.c:392 msgid "Invalid numeric syntax." msgstr "Ongeldige numerieke syntax." #: src/data/data-in.c:400 src/data/data-in.c:571 msgid "Too-large number set to system-missing." msgstr "Te groot getal is op \"system-missing\" gezet." #: src/data/data-in.c:406 src/data/data-in.c:577 msgid "Too-small number set to zero." msgstr "Te klein getal is op nul gezet." #: src/data/data-in.c:426 msgid "All characters in field must be digits." msgstr "Alle tekens in veld moeten cijfers zijn." #: src/data/data-in.c:445 msgid "Unrecognized character in field." msgstr "Niet-herkend teken in veld." #: src/data/data-in.c:466 src/data/data-in.c:729 msgid "Field must have even length." msgstr "Veld moet even lengte hebben." #: src/data/data-in.c:468 src/data/data-in.c:732 msgid "Field must contain only hex digits." msgstr "Veld mag alleen hexadecimale cijfers bevatten." #: src/data/data-in.c:544 msgid "Invalid zoned decimal syntax." msgstr "Ongeldige syntax voor \"zoned decimal\"." #: src/data/data-in.c:644 src/data/data-in.c:650 msgid "Invalid syntax for P field." msgstr "Ongeldige syntax voor P-veld." #: src/data/data-in.c:768 src/data/data-in.c:818 msgid "Syntax error in date field." msgstr "Syntaxfout in datumveld." #: src/data/data-in.c:783 #, c-format msgid "Day (%ld) must be between 1 and 31." msgstr "Dag (%ld) moet tussen 1 en 31 liggen." #: src/data/data-in.c:832 msgid "Delimiter expected between fields in date." msgstr "Scheidingsteken verwacht tussen velden in datum." #: src/data/data-in.c:906 msgid "" "Unrecognized month format. Months may be specified as Arabic or Roman " "numerals or as at least 3 letters of their English names." msgstr "" "Niet-herkende maandindeling. Maanden mogen worden opgegeven als Arabische " "of Romeinse getallen of als tenminste de eerste 3 letters van hun Engelse " "naam." #: src/data/data-in.c:933 #, c-format msgid "Year (%ld) must be between 1582 and 19999." msgstr "Jaar (%ld) moet liggen tussen 1582 en 19999." #: src/data/data-in.c:944 #, c-format msgid "Trailing garbage `%.*s' following date." msgstr "Na datum volgt rommel `%.*s'." #: src/data/data-in.c:958 msgid "Julian day must have exactly three digits." msgstr "Juliaanse datum moet bestaan uit precies 3 cijfers." #: src/data/data-in.c:960 #, c-format msgid "Julian day (%ld) must be between 1 and 366." msgstr "Juliaanse dag (%ld) moet tussen 1 en 366 zijn." #: src/data/data-in.c:984 #, c-format msgid "Quarter (%ld) must be between 1 and 4." msgstr "Kwartaal (%ld) moet tussen 1 en 4 zijn." #: src/data/data-in.c:1005 #, c-format msgid "Week (%ld) must be between 1 and 53." msgstr "Week (%ld) moet tussen 1 en 53 zijn." #: src/data/data-in.c:1017 msgid "Delimiter expected between fields in time." msgstr "Scheidingsteken verwacht tussen velden in tijd." #: src/data/data-in.c:1037 #, c-format msgid "Minute (%ld) must be between 0 and 59." msgstr "Minuut (%ld) moet tussen 0 en 59 zijn." #: src/data/data-in.c:1075 msgid "" "Unrecognized weekday name. At least the first two letters of an English " "weekday name must be specified." msgstr "" "Niet-herkende weekdagnaam. Tenminste de eerste twee letters van een Engelse " "weekdagnaam moeten worden opgegeven." #: src/data/data-in.c:1210 #, c-format msgid "`%c' expected in date field." msgstr "`%c' verwacht in datumveld." #: src/data/data-out.c:580 #, c-format msgid "Weekday number %f is not between 1 and 7." msgstr "Weekdagnummer %f ligt niet tussen 1 en 7." #: src/data/data-out.c:605 #, c-format msgid "Month number %f is not between 1 and 12." msgstr "Maandnummer %f ligt niet tussen 1 en 12." #. TRANSLATORS: this fragment will be interpolated into #. messages in fh_lock() that identify types of files. #: src/data/dataset-writer.c:66 src/language/data-io/file-handle.c:304 msgid "dataset" msgstr "dataset" #: src/data/dict-class.c:52 msgid "ordinary" msgstr "gewoon" #: src/data/dict-class.c:54 msgid "system" msgstr "systeem" #: src/data/dict-class.c:56 msgid "scratch" msgstr "klad" #: src/data/dictionary.c:1523 #, c-format msgid "Truncating document line to %d bytes." msgstr "Documentregel wordt afgekapt tot %d bytes." #: src/data/encrypted-file.c:89 #, c-format msgid "An error occurred while reading `%s': %s." msgstr "Fout opgetreden bij lezen van `%s': %s." #: src/data/encrypted-file.c:430 #, c-format msgid "" "%s: encrypted file corrupted (ends in incomplete %u-byte ciphertext block)" msgstr "" "%s: versleuteld bestand beschadigd (eindigt met incompleet %u-byte " "ciphertext-blok)" #: src/data/encrypted-file.c:449 #, c-format msgid "%s: encrypted file corrupted (ends with bad padding)" msgstr "%s: versleuteld bestand beschadigd (eindigt met onjuiste \"padding\")" #: src/data/file-handle-def.c:283 src/language/data-io/dataset.c:266 msgid "active dataset" msgstr "actieve dataset" #: src/data/file-handle-def.c:518 #, c-format msgid "Can't read from %s as a %s because it is already being read as a %s." msgstr "" "Kan niet lezen van %s als een %s omdat dit reeds gelezen wordt als een %s." #: src/data/file-handle-def.c:522 #, c-format msgid "Can't write to %s as a %s because it is already being written as a %s." msgstr "" "Kan niet schrijven naar %s als een %s omdat dit reeds geschreven wordt als " "een %s." #: src/data/file-handle-def.c:529 #, c-format msgid "Can't re-open %s as a %s." msgstr "Kan %s niet heropenen als een %s." #: src/data/file-name.c:133 #, c-format msgid "Not opening pipe file `%s' because %s option set." msgstr "\"Pipe\"-bestand `%s' wordt niet geopend omdat optie %s is gezet." #: src/data/format.c:339 msgid "Input format" msgstr "Invoerindeling" #: src/data/format.c:339 msgid "Output format" msgstr "Uitvoerindeling" #: src/data/format.c:342 #, c-format msgid "Format %s may not be used for input." msgstr "Indeling %s mag niet gebruikt worden voor invoer." #: src/data/format.c:349 #, c-format msgid "%s specifies width %d, but %s requires an even width." msgstr "%s specificeert breedte %d, maar %s vereist een even breedte." #: src/data/format.c:358 #, c-format msgid "%s %s specifies width %d, but %s requires a width between %d and %d." msgstr "" "%s %s specificeert breedte %d, maar %s vereist een breedte tussen %d en %d." #: src/data/format.c:367 #, c-format msgid "%s %s specifies %d decimal place, but %s does not allow any decimals." msgid_plural "" "%s %s specifies %d decimal places, but %s does not allow any decimals." msgstr[0] "%s %s specificeert %d decimaal, maar %s staat geen decimalen toe." msgstr[1] "%s %s specificeert %d decimalen, maar %s staat geen decimalen toe." #: src/data/format.c:378 #, c-format msgid "" "%s %s specifies %d decimal place, but the given width allows at most %d " "decimals." msgid_plural "" "%s %s specifies %d decimal places, but the given width allows at most %d " "decimals." msgstr[0] "" "%s %s specificeert %d decimaal, maar de opgegeven breedte staat maximaal %d " "decimalen toe." msgstr[1] "" "%s %s specificeert %d decimalen, maar de opgegeven breedte staat maximaal %d " "decimalen toe." #: src/data/format.c:385 #, c-format msgid "" "%s %s specifies %d decimal place, but the given width does not allow for any " "decimals." msgid_plural "" "%s %s specifies %d decimal places, but the given width does not allow for " "any decimals." msgstr[0] "" "%s %s specificeert %d decimaal, maar de opgegeven breedte staat geen " "decimalen toe." msgstr[1] "" "%s %s specificeert %d decimalen, maar de opgegeven breedte staat geen " "decimalen toe." #: src/data/format.c:424 #, c-format msgid "%s variables are not compatible with %s format %s." msgstr "%s variabelen komen niet overeen met %s indeling %s." #: src/data/format.c:425 src/data/format.c:1074 #: src/ui/gui/var-type-dialog.ui:167 msgid "String" msgstr "Alfanumeriek" #: src/data/format.c:425 src/data/format.c:1035 #: src/ui/gui/var-type-dialog.ui:48 msgid "Numeric" msgstr "Numeriek" #: src/data/format.c:426 src/data/sys-file-reader.c:2212 #: src/data/sys-file-reader.c:2214 src/language/xforms/recode.c:512 #: src/language/xforms/recode.c:513 src/language/xforms/recode.c:525 #: src/language/xforms/recode.c:526 #: src/language/dictionary/apply-dictionary.c:77 #: src/language/dictionary/apply-dictionary.c:78 msgid "numeric" msgstr "numeriek" #: src/data/format.c:426 src/data/sys-file-reader.c:2212 #: src/data/sys-file-reader.c:2214 src/language/xforms/recode.c:512 #: src/language/xforms/recode.c:513 src/language/xforms/recode.c:525 #: src/language/xforms/recode.c:526 #: src/language/dictionary/apply-dictionary.c:77 #: src/language/dictionary/apply-dictionary.c:78 msgid "string" msgstr "alfanumeriek" #: src/data/format.c:444 #, c-format msgid "String variable with width %d is not compatible with format %s." msgstr "" "Alfanumerieke variabele met breedte %d komt niet overeen met indeling %s." #: src/data/format.c:1038 src/ui/gui/var-type-dialog.ui:65 msgid "Comma" msgstr "Komma" #: src/data/format.c:1041 src/ui/gui/var-type-dialog.ui:82 msgid "Dot" msgstr "Punt" #: src/data/format.c:1044 msgid "Scientific" msgstr "Wetenschappelijk" #: src/data/format.c:1061 src/ui/gui/var-type-dialog.ui:116 msgid "Date" msgstr "Datum" #: src/data/format.c:1064 src/ui/gui/var-type-dialog.ui:133 msgid "Dollar" msgstr "Dollar" #: src/data/format.c:1071 msgid "Custom" msgstr "Aangepast" #: src/data/gnumeric-reader.c:478 src/data/ods-reader.c:505 #, c-format msgid "Cannot convert the value in the spreadsheet cell %s to format (%s): %s" msgstr "" "Kan de waarde in de rekenbladcel %s niet omzetten naar indeling (%s): %s" #: src/data/gnumeric-reader.c:502 src/data/ods-reader.c:567 #, c-format msgid "" "There was a problem whilst reading the %s file `%s' (near line %d): `%s'" msgstr "" "Een probleem deed zich voor tijdens het lezen van het %s-bestand `%s' (in de " "buurt van regel %d): `%s'" #: src/data/gnumeric-reader.c:597 #, c-format msgid "" "The gnumeric file `%s' is encoded as %s instead of the usual UTF-8 encoding. " "Any non-ascii characters will be incorrectly imported." msgstr "" "Het gnumeric-bestand `%s' is gecodeerd als %s in plaats van de gebruikelijke " "UTF-8-codering. Alle niet-ASCII-tekens zullen verkeerd worden geïmporteerd." #: src/data/gnumeric-reader.c:641 src/data/ods-reader.c:682 #, c-format msgid "Invalid cell range `%s'" msgstr "Ongeldig celbereik `%s'" #: src/data/gnumeric-reader.c:813 src/data/ods-reader.c:710 #: src/data/ods-reader.c:843 #, c-format msgid "Selected sheet or range of spreadsheet `%s' is empty." msgstr "Gekozen blad of bereik van werkblad `%s' is leeg." #: src/data/identifier2.c:60 #, c-format msgid "Identifier `%s' exceeds %d-byte limit." msgstr "Identificator %s overschrijdt de limiet van %d bytes." #: src/data/identifier2.c:84 msgid "Identifier cannot be empty string." msgstr "Identificator kan geen lege tekenreeks zijn." #: src/data/identifier2.c:92 #, c-format msgid "`%s' may not be used as an identifier because it is a reserved word." msgstr "" "`%s' mag niet gebruikt worden als identificator omdat het een gereserveerd " "woord is." #: src/data/identifier2.c:103 #, c-format msgid "" "`%s' may not be used as an identifier because it contains ill-formed UTF-8 " "at byte offset %tu." msgstr "" "`%s' mag niet gebruikt worden als identificator omdat het foutief gevormde " "UTF-8 bevat op byte positie %tu." #: src/data/identifier2.c:114 #, c-format msgid "" "Character %s (in `%s') may not appear as the first character in a identifier." msgstr "" "Teken %s (in `%s') mag niet als eerste teken in een identificator voorkomen." #: src/data/identifier2.c:126 #, c-format msgid "Character %s (in `%s') may not appear in an identifier." msgstr "Teken %s (in `%s') mag niet in een identificator voorkomen." #: src/data/mdd-writer.c:241 #, c-format msgid "An I/O error occurred writing metadata file `%s'." msgstr "" "Invoer-/uitvoerfout opgetreden tijdens schrijven van metagegevensbestand `" "%s'." #. TRANSLATORS: this fragment will be interpolated into #. messages in fh_lock() that identify types of files. #: src/data/mdd-writer.c:457 msgid "metadata file" msgstr "metagegevensbestand" #: src/data/mdd-writer.c:465 #, c-format msgid "Error opening `%s' for writing as a metadata file: %s." msgstr "Fout tijdens openen `%s' voor schrijven als metagegevensbestand: %s." #: src/data/mdd-writer.c:473 #, c-format msgid "Internal error creating xmlTextWriter. Please report this to %s." msgstr "Interne fout bij aanmaken xmlTextWriter. Meld dit a.u.b. aan %s." #: src/data/make-file.c:217 #, c-format msgid "Opening %s for writing: %s." msgstr "%s wordt geopend voor schrijven: %s." #: src/data/make-file.c:228 #, c-format msgid "Opening stream for %s: %s." msgstr "Stroom voor %s wordt geopend: %s." #: src/data/make-file.c:260 #, c-format msgid "Creating temporary file to replace %s: %s." msgstr "Tijdelijk bestand voor vervangen van %s wordt aangemaakt: %s." #: src/data/make-file.c:277 #, c-format msgid "Creating temporary file %s: %s." msgstr "Tijdelijk bestand %s wordt aangemaakt: %s." #: src/data/make-file.c:289 #, c-format msgid "Opening stream for temporary file %s: %s." msgstr "Stroom voor tijdelijk bestand %s wordt aangemaakt: %s." #: src/data/make-file.c:326 #, c-format msgid "Replacing %s by %s: %s." msgstr "%s wordt vervangen door %s: %s." #: src/data/make-file.c:354 #, c-format msgid "Removing %s: %s." msgstr "%s wordt verwijderd: %s." #: src/data/mrset.c:83 #, c-format msgid "" "%s is not a valid name for a multiple response set. Multiple response set " "names must begin with `$'." msgstr "" "%s is geen geldige naam voor een \"multiple response set\". Namen voor " "multiple response sets moeten beginnen met `$'." #: src/data/ods-reader.c:620 #, c-format msgid "Cannot open %s as a OpenDocument file: %s" msgstr "Kan %s niet openen als een OpenDocument-bestand: %s" #. TRANSLATORS: this fragment will be interpolated into #. messages in fh_lock() that identify types of files. #: src/data/pc+-file-reader.c:206 msgid "SPSS/PC+ system file" msgstr "SPSS/PC+-systeembestand" #: src/data/pc+-file-reader.c:215 #, c-format msgid "Error opening `%s' for reading as an SPSS/PC+ system file: %s." msgstr "" "Fout bij openen van `%s' voor lezen als een SPSS/PC+-systeembestand: %s." #: src/data/pc+-file-reader.c:224 src/data/sys-file-reader.c:3541 #, c-format msgid "%s: stat failed (%s)." msgstr "%s: stat mislukt (%s)." #: src/data/pc+-file-reader.c:230 #, c-format msgid "%s: file too large." msgstr "%s: bestand te groot." #: src/data/pc+-file-reader.c:257 #, c-format msgid "" "Directory entry is for a %u-byte record starting at offset %u but file is " "only %u bytes long." msgstr "" "De directory-ingang is voor een kaart van %u-bytes, beginnend op positie %u, " "maar het bestand is slechts %u bytes lang." #: src/data/pc+-file-reader.c:275 #, c-format msgid "Directory fields have unexpected values (%u,%u)." msgstr "Directoryvelden hebben onverwachte waarden (%u,%u)." #: src/data/pc+-file-reader.c:372 src/data/sys-file-reader.c:672 #, c-format msgid "Variable %zu" msgstr "Variabele %zu" #: src/data/pc+-file-reader.c:380 src/data/sys-file-reader.c:680 #, c-format msgid "Variable %zu Label" msgstr "Variabele %zu label" #: src/data/pc+-file-reader.c:385 #, c-format msgid "Variable %zu Value Label %zu" msgstr "Variabele %zu Waardelabel %zu" #: src/data/pc+-file-reader.c:388 src/data/sys-file-reader.c:690 msgid "Creation Date" msgstr "Aanmaakdatum" #: src/data/pc+-file-reader.c:389 src/data/sys-file-reader.c:691 msgid "Creation Time" msgstr "Aanmaaktijd" #: src/data/pc+-file-reader.c:390 src/data/sys-file-reader.c:692 #: src/language/dictionary/sys-file-info.c:200 msgid "Product" msgstr "Product" #: src/data/pc+-file-reader.c:391 src/data/sys-file-reader.c:693 #: src/language/dictionary/sys-file-info.c:300 msgid "File Label" msgstr "Bestandslabel" #: src/data/pc+-file-reader.c:427 #, c-format msgid "" "Using default encoding %s to read this SPSS/PC+ system file. For best " "results, specify an encoding explicitly. Use SYSFILE INFO with ENCODING=" "\"DETECT\" to analyze the possible encodings." msgstr "" "Standaardcodering %s wordt gebruikt om dit SPSS/PC+-systeembestand te lezen. " "Geef expliciet een codering op voor de beste resultaten. Gebruik SYSFILE " "INFO met ENCODING=\"DETECT\" om mogelijke coderingen te analyseren." #: src/data/pc+-file-reader.c:483 src/data/sys-file-reader.c:890 #, c-format msgid "Error closing system file `%s': %s." msgstr "Fout bij sluiten van systeembestand `%s': %s." #: src/data/pc+-file-reader.c:544 msgid "This is not an SPSS/PC+ system file." msgstr "Dit is geen SPSS/PC+-systeembestand." #: src/data/pc+-file-reader.c:548 #, c-format msgid "Record 0 has unexpected length %u." msgstr "Kaart 0 heeft onverwachte lengte %u." #: src/data/pc+-file-reader.c:572 #, c-format msgid "Record 0 specifies unexpected system missing value %g (%a)." msgstr "Kaart 0 specificeert onverwachte system-missing waarde %g (%a)." #: src/data/pc+-file-reader.c:577 #, c-format msgid "Record 0 reserved fields have unexpected values (%u,%u,%u,%u,%u,%u)." msgstr "" "Gereserveerde velden op kaart 0 hebben onverwachte waarden (%u,%u,%u,%u,%u," "%u)." #: src/data/pc+-file-reader.c:581 #, c-format msgid "Record 0 case counts differ (%u versus %u)." msgstr "Telling van aantal observaties in kaart 0 verschilt (%u vs. %u)." #: src/data/pc+-file-reader.c:585 #, c-format msgid "Invalid compression type %u." msgstr "Ongeldig compressietype %u." #: src/data/pc+-file-reader.c:596 #, c-format msgid "" "Record 0 claims %u cases with %u values per case (requiring at least %zu " "bytes) but data record is only %u bytes long." msgstr "" "Kaart 0 impliceert %u observaties met %u waarden per observatie, waarvoor " "minstens %zu bytes nodig zijn. Maar de gegevenskaart is slechts %u bytes " "lang." #: src/data/pc+-file-reader.c:618 #, c-format msgid "" "Value labels claimed to end at offset %u in labels record but labels record " "is only %u bytes." msgstr "" "Waardelabels zouden moeten eindigen op positie %u in de labelskaart, maar " "die is slechts %u bytes." #: src/data/pc+-file-reader.c:629 #, c-format msgid "" "Value labels claimed to be at offset %u with length %u but file size is only " "%u bytes." msgstr "" "Waardelabels zouden moeten staan op positie %u met lengte %u, maar de " "bestandsgrootte is slechts %u bytes." #: src/data/pc+-file-reader.c:656 #, c-format msgid "" "Value labels end with partial label (%u bytes left in record, label length " "%)." msgstr "" "Waardelabels eindigen met gedeeltelijk label (%u bytes resteren in kaart, " "labellengte is %)." #: src/data/pc+-file-reader.c:669 #, c-format msgid "%u leftover bytes following value labels." msgstr "%u overgebleven bytes na waardelabels." #: src/data/pc+-file-reader.c:685 #, c-format msgid "" "Variable label claimed to start at offset %u in labels record but labels " "record is only %u bytes." msgstr "" "Variabelelabel zou moeten beginnen op positie %u in labelskaart, maar die is " "slechts %u bytes." #: src/data/pc+-file-reader.c:697 #, c-format msgid "" "Variable label with length %u starting at offset %u in labels record " "overruns end of %u-byte labels record." msgstr "" "Variabelelabel met lengte %u, beginnend op positie %u in labelskaart, " "overschrijdt einde van %u bytes grote labelskaart." #: src/data/pc+-file-reader.c:719 #, c-format msgid "Record 1 has length %u (expected %u)." msgstr "Kaart 1 heeft lengte %u (verwacht werd %u)." #: src/data/pc+-file-reader.c:751 #, c-format msgid "Variable %u has invalid type %." msgstr "Variabele %u heeft een ongeldig type %." #: src/data/pc+-file-reader.c:787 #, c-format msgid "Invalid weight index %u." msgstr "Ongeldige gewichtindex %u." #: src/data/pc+-file-reader.c:857 #, c-format msgid "Invalid variable name `%s'." msgstr "Ongeldige variabelenaam `%s'." #: src/data/pc+-file-reader.c:865 src/data/sys-file-reader.c:1444 #, c-format msgid "Renaming variable with duplicate name `%s' to `%s'." msgstr "Variabele met eerder gebruikte naam `%s' wordt hernoemd tot `%s'." #: src/data/pc+-file-reader.c:877 #, c-format msgid "Cannot weight by string variable `%s'." msgstr "Kan niet wegen met alfanumerieke variabele `%s'." #: src/data/pc+-file-reader.c:973 src/data/sys-file-reader.c:2762 msgid "File ends in partial case." msgstr "Bestand eindigt in gedeeltelijke observatie." #: src/data/pc+-file-reader.c:979 #, c-format msgid "" "Case beginning at offset 0x%08x extends past end of data record at offset 0x" "%08x." msgstr "" "Observatie beginnend op positie 0x%08x overschrijdt einde van gegevenskaart " "op positie 0x%08x." #: src/data/pc+-file-reader.c:998 src/data/sys-file-reader.c:2770 #, c-format msgid "Error reading case from file %s." msgstr "Fout tijdens lezen observatie van bestand %s." #: src/data/pc+-file-reader.c:1114 src/data/sys-file-reader.c:2933 #, c-format msgid "" "Possible compressed data corruption: string contains compressed integer " "(opcode %d)." msgstr "" "Mogelijke fout in gecomprimeerde gegevens: tekenreeks bevat gecomprimeerd " "geheel getal (\"opcode\" %d)." #: src/data/pc+-file-reader.c:1156 src/data/sys-file-reader.c:3234 #, c-format msgid "`%s' near offset 0x%llx: " msgstr "`%s' in de buurt van positie 0x%llx: " #: src/data/pc+-file-reader.c:1159 src/data/sys-file-reader.c:3237 #, c-format msgid "`%s': " msgstr "`%s': " #: src/data/pc+-file-reader.c:1211 src/data/sys-file-reader.c:3288 #, c-format msgid "System error: %s." msgstr "Systeemfout: %s." #: src/data/pc+-file-reader.c:1216 src/data/sys-file-reader.c:3293 msgid "Unexpected end of file." msgstr "Onverwacht einde van bestand." #: src/data/pc+-file-reader.c:1301 src/data/sys-file-reader.c:3518 #, c-format msgid "%s: seek failed (%s)." msgstr "%s: zoeken mislukt (%s)." #: src/data/pc+-file-reader.c:1351 msgid "SPSS/PC+ System File" msgstr "SPSS/PC+-systeembestand" #: src/data/por-file-reader.c:109 #, c-format msgid "portable file %s corrupt at offset 0x%llx: " msgstr "overdraagbaar bestand %s beschadigd op positie 0x%llx: " #: src/data/por-file-reader.c:136 #, c-format msgid "reading portable file %s at offset 0x%llx: " msgstr "overdraagbaar bestand %s wordt gelezen op positie 0x%llx: " #: src/data/por-file-reader.c:164 #, c-format msgid "Error closing portable file `%s': %s." msgstr "Fout bij afsluiten overdraagbaar bestand `%s': %s." #: src/data/por-file-reader.c:216 msgid "unexpected end of file" msgstr "onverwacht einde van bestand" #. TRANSLATORS: this fragment will be interpolated into #. messages in fh_lock() that identify types of files. #: src/data/por-file-reader.c:275 src/data/por-file-writer.c:147 msgid "portable file" msgstr "overdraagbaar bestand" #: src/data/por-file-reader.c:283 #, c-format msgid "" "An error occurred while opening `%s' for reading as a portable file: %s." msgstr "" "Fout opgetreden tijdens openen van `%s' voor lezen als overdraagbaar " "bestand: %s." #: src/data/por-file-reader.c:304 msgid "Data record expected." msgstr "Gegevenskaart verwacht." #: src/data/por-file-reader.c:402 msgid "Number expected." msgstr "Getal verwacht." #: src/data/por-file-reader.c:430 msgid "Missing numeric terminator." msgstr "Ontbrekende numerieke afsluiter." #: src/data/por-file-reader.c:453 msgid "Invalid integer." msgstr "Ongeldig geheel getal." #: src/data/por-file-reader.c:464 src/data/por-file-reader.c:484 #, c-format msgid "Bad string length %d." msgstr "Onjuiste lengte van tekenreeks %d." #: src/data/por-file-reader.c:547 #, c-format msgid "%s: Not a portable file." msgstr "%s: geen overdraagbaar (\"portable\") bestand." #: src/data/por-file-reader.c:564 #, c-format msgid "Unrecognized version code `%c'." msgstr "Niet-herkende versiecode `%c'." #: src/data/por-file-reader.c:577 #, c-format msgid "Bad date string length %zu." msgstr "Onjuiste datum-tekenreekslengte %zu." #: src/data/por-file-reader.c:579 #, c-format msgid "Bad time string length %zu." msgstr "Onjuiste tijd-tekenreekslengte %zu." #: src/data/por-file-reader.c:630 #, c-format msgid "" "%s: Bad format specifier byte (%d). Variable will be assigned a default " "format." msgstr "" "%s: Onjuist opmaakspecificatie-byte (%d). Variabele krijgt een " "standaardopmaak." #: src/data/por-file-reader.c:651 #, c-format msgid "Numeric variable %s has invalid format specifier %s." msgstr "Numerieke variabele %s heeft een ongeldig opmaakspecificatie %s." #: src/data/por-file-reader.c:655 #, c-format msgid "String variable %s with width %d has invalid format specifier %s." msgstr "" "Tekenreeksvariabele %s met breedte %d heeft ongeldige opmaakspecificatie %s." #: src/data/por-file-reader.c:679 msgid "Expected variable count record." msgstr "Kaart met variabelentelling verwacht." #: src/data/por-file-reader.c:683 #, c-format msgid "Invalid number of variables %d." msgstr "Ongeldig aantal variabelen %d." #: src/data/por-file-reader.c:692 #, c-format msgid "Weight variable name (%s) truncated." msgstr "Naam van wegingsvariabele (%s) is afgekapt." #: src/data/por-file-reader.c:707 msgid "Expected variable record." msgstr "Variabelekaart verwacht." #: src/data/por-file-reader.c:711 #, c-format msgid "Invalid variable width %d." msgstr "Ongeldige variabelebreedte %d." #: src/data/por-file-reader.c:719 #, c-format msgid "Invalid variable name `%s' in position %d." msgstr "Ongeldige variabelenaam `%s' op positie %d." #: src/data/por-file-reader.c:723 src/data/sys-file-reader.c:1426 #, c-format msgid "Bad width %d for variable %s." msgstr "Onjuiste breedte %d voor variabele %s." #: src/data/por-file-reader.c:737 #, c-format msgid "Duplicate variable name %s in position %d renamed to %s." msgstr "Eerder gebruikte variabelenaam %s op positie %d is hernoemd naar %s." #: src/data/por-file-reader.c:786 #, c-format msgid "Weighting variable %s not present in dictionary." msgstr "Wegingvariabele %s niet aanwezig in woordenboek." #: src/data/por-file-reader.c:830 #, c-format msgid "Unknown variable %s while parsing value labels." msgstr "Onbekende variabele %s gevonden tijdens lezen van waardelabels." #: src/data/por-file-reader.c:833 #, c-format msgid "" "Cannot assign value labels to %s and %s, which have different variable types." msgstr "" "Kan geen waardelabels toekennen aan %s en %s, die verschillende " "variabeletypes hebben." #: src/data/por-file-reader.c:972 msgid "SPSS Portable File" msgstr "SPSS/PC+-overdraagbaar bestand" #: src/data/por-file-writer.c:139 #, c-format msgid "Invalid decimal digits count %d. Treating as %d." msgstr "Ongeldig aantal decimale cijfers geteld %d. Wordt behandeld als %d." #: src/data/por-file-writer.c:159 #, c-format msgid "Error opening `%s' for writing as a portable file: %s." msgstr "Fout tijdens openen `%s' voor schrijven als overdraagbaar bestand: %s." #: src/data/por-file-writer.c:505 #, c-format msgid "An I/O error occurred writing portable file `%s'." msgstr "" "Een invoer-uitvoerfout is opgetreden tijdens schrijven van overdraagbaar " "bestand `%s'." #: src/data/psql-reader.c:48 msgid "" "Support for reading postgres databases was not compiled into this " "installation of PSPP" msgstr "" "Ondersteuning voor lezen van \"postgres databases\" is niet gecompileerd in " "deze installatie van PSPP" #: src/data/psql-reader.c:242 msgid "Memory error whilst opening psql source" msgstr "Geheugenfout bij openen van psql-bron" #: src/data/psql-reader.c:248 #, c-format msgid "Error opening psql source: %s." msgstr "Fout tijdens openen psql-bron: %s." #: src/data/psql-reader.c:263 #, c-format msgid "" "Postgres server is version %s. Reading from versions earlier than 8.0 is not " "supported." msgstr "" "De \"postgres\"-server heeft versie %s. Lezen van versies ouder dan 8.0 " "wordt niet ondersteund." #: src/data/psql-reader.c:283 msgid "" "Connection is unencrypted, but unencrypted connections have not been " "permitted." msgstr "" "Verbinding is niet versleuteld, maar niet-versleutelde verbindingen zijn " "niet toegestaan." #: src/data/psql-reader.c:324 src/data/psql-reader.c:349 #: src/data/psql-reader.c:359 #, c-format msgid "Error from psql source: %s." msgstr "Fout van psql-bron: %s." #: src/data/psql-reader.c:454 #, c-format msgid "Unsupported OID %d. SYSMIS values will be inserted." msgstr "Niet-ondersteunde OID %d. SYSMIS-waarden zullen worden ingevoegd." #: src/data/settings.c:391 msgid "" "MXWARNS set to zero. No further warnings will be given even when " "potentially problematic situations are encountered." msgstr "" "MXWARNS is op nul gezet. Er worden verder geen waarschuwingen gegeven, " "zelfs niet als potentieel problematische situaties zich voordoen." #: src/data/settings.c:398 #, c-format msgid "" "Warnings re-enabled. %d warnings will be issued before aborting syntax " "processing." msgstr "" "Waarschuwingen weer ingeschakeld. %d waarschuwingen zullen worden gegeven " "voordat syntaxverwerking wordt afgebroken." #: src/data/settings.c:618 #, c-format msgid "" "%s: Custom currency string `%s' does not contain exactly three periods or " "commas (or it contains both)." msgstr "" "%s: Aangepaste financiële tekenreeks `%s' bevat niet exact drie punten of " "komma's (of de reeks bevat beide)." #. TRANSLATORS: this fragment will be interpolated into #. messages in fh_lock() that identify types of files. #: src/data/sys-file-reader.c:407 src/data/sys-file-writer.c:245 msgid "system file" msgstr "systeembestand" #: src/data/sys-file-reader.c:414 #, c-format msgid "Error opening `%s' for reading as a system file: %s." msgstr "Fout bij het openen van `%s' voor lezen als systeembestand: %s." #: src/data/sys-file-reader.c:491 msgid "Misplaced type 4 record." msgstr "Verkeerd geplaatste kaart van type 4." #: src/data/sys-file-reader.c:496 msgid "Duplicate type 6 (document) record." msgstr "Meerdere kaarten van type 6 (document)." # c-format #: src/data/sys-file-reader.c:506 src/data/sys-file-reader.c:1343 #, c-format msgid "" "Unrecognized record type 7, subtype %d. For help, please send this file to " "%s and mention that you were using %s." msgstr "" "Niet-herkende kaart van type 7, subtype %d. Als u hulp wilt, stuur dan a.u." "b. dit bestand naar %s en vermeld dat u %s gebruikte." #: src/data/sys-file-reader.c:526 #, c-format msgid "" "Record type 7, subtype %d found here has the same type as the record found " "near offset 0x%llx. For help, please send this file to %s and mention that " "you were using %s." msgstr "" "Het hier aangetroffen kaarttype 7, subtype %d heeft hetzelfde type als de " "kaart gevonden in de buurt van positie 0x%llx. Als u hulp wilt, stuur dan a." "u.b. dit bestand naar %s en vermeld dat u %s gebruikte." #: src/data/sys-file-reader.c:538 #, c-format msgid "Unrecognized record type %d." msgstr "Niet-herkend kaarttype %d." #: src/data/sys-file-reader.c:688 #, c-format msgid "Value Label %zu" msgstr "Waardelabel %zu" #: src/data/sys-file-reader.c:697 msgid "Extra Product Info" msgstr "Extra productinfo" #: src/data/sys-file-reader.c:710 #, c-format msgid "Document Line %zu" msgstr "Documentregel %zu" #: src/data/sys-file-reader.c:718 #, c-format msgid "MRSET %zu" msgstr "MRSET %zu" #: src/data/sys-file-reader.c:720 #, c-format msgid "MRSET %zu Label" msgstr "MRSET %zu Label" #: src/data/sys-file-reader.c:725 #, c-format msgid "MRSET %zu Counted Value" msgstr "MRSET %zu getelde waarde" #: src/data/sys-file-reader.c:763 #, c-format msgid "" "This system file does not indicate its own character encoding. Using " "default encoding %s. For best results, specify an encoding explicitly. Use " "SYSFILE INFO with ENCODING=\"DETECT\" to analyze the possible encodings." msgstr "" "Het systeembestand vermeldt de eigen tekencodering niet. Standaardcodering " "%s wordt gebruikt. Specificeer expliciet een codering voor de beste " "resultaten. Gebruik SYSFILE INFO met ENCODING=\"DETECT\" om mogelijke " "coideringen te analyseren." #: src/data/sys-file-reader.c:845 #, c-format msgid "File header claims %d variable positions but %zu were read from file." msgstr "" "Bestandsheader vermeldt %d variabelenposities, maar %zu zijn uit het bestand " "gelezen." #: src/data/sys-file-reader.c:958 src/data/sys-file-reader.c:972 msgid "This is not an SPSS system file." msgstr "Dit is geen SPSS-systeembestand." #: src/data/sys-file-reader.c:1027 msgid "" "Compression bias is not the usual value of 100, or system file uses " "unrecognized floating-point format." msgstr "" "De compressie-instelling heeft niet de gebruikelijke waarde 100, of het " "systeembestand gebruikt een niet-herkende drijvende-komma-indeling." #: src/data/sys-file-reader.c:1102 msgid "Variable label indicator field is not 0 or 1." msgstr "Indicatorveld voor variabelelabel is niet 0 of 1." #: src/data/sys-file-reader.c:1115 msgid "Numeric missing value indicator field is not -3, -2, 0, 1, 2, or 3." msgstr "" "Indicatorveld voor numerieke ontbrekende waarde is niet -3, -2, 0, 1, 2, of " "3." #: src/data/sys-file-reader.c:1125 msgid "String missing value indicator field is not 0, 1, 2, or 3." msgstr "" "Indicatorveld voor alfanumerieke ontbrekende waarde is niet 0, 1, 2, of 3." #: src/data/sys-file-reader.c:1152 #, c-format msgid "Invalid number of labels %u." msgstr "Ongeldig aantal labels %u." #: src/data/sys-file-reader.c:1185 msgid "" "Variable index record (type 4) does not immediately follow value label " "record (type 3) as it should." msgstr "" "Variabele-indexkaart (type 4) volgt niet onmiddellijk waardelabelkaart (type " "3) zoals zou moeten." #: src/data/sys-file-reader.c:1197 #, c-format msgid "" "Number of variables associated with a value label (%u) is not between 1 and " "the number of variables (%zu)." msgstr "" "Aantal variabelen geassocieerd aan een waardelabel (%u) is niet tussen 1 en " "het aantal variabelen (%zu)." #: src/data/sys-file-reader.c:1224 #, c-format msgid "Number of document lines (%d) must be greater than 0 and less than %d." msgstr "Aantal documentregels (%d) moet groter dan 0 en kleiner dan %d zijn." #: src/data/sys-file-reader.c:1317 #, c-format msgid "Record type 7, subtype %d has bad size %u (expected %d)." msgstr "Kaart type 7, subtype %d heeft foutieve lengte %u (verwacht %d)." #: src/data/sys-file-reader.c:1321 #, c-format msgid "Record type 7, subtype %d has bad count %u (expected %d)." msgstr "Kaart type 7, subtype %d heeft foutieve telling %u (verwacht %d)." #: src/data/sys-file-reader.c:1435 #, fuzzy, c-format #| msgid "Renaming variable with duplicate name `%s' to `%s'." msgid "Renaming variable with invalid name `%s' to `%s'." msgstr "Variabele met eerder gebruikte naam `%s' wordt hernoemd tot `%s'." #: src/data/sys-file-reader.c:1517 msgid "Missing string continuation record." msgstr "Kaart met voortzetting van tekenreeks ontbreekt." #: src/data/sys-file-reader.c:1550 #, c-format msgid "Variable %s with width %d has invalid print format 0x%x." msgstr "Variabele %s met breedte %d heeft ongeldige afdrukspecificatie 0x%x." #: src/data/sys-file-reader.c:1554 #, c-format msgid "Variable %s with width %d has invalid write format 0x%x." msgstr "Variabele %s met breedte %d heeft ongeldige schrijfspecificatie 0x%x." #: src/data/sys-file-reader.c:1559 msgid "Suppressing further invalid format warnings." msgstr "Verdere waarschuwingen over ongeldige specificaties onderdrukt." #: src/data/sys-file-reader.c:1613 #, c-format msgid "" "Floating-point representation indicated by system file (%d) differs from " "expected (%d)." msgstr "" "Drijvende-kommarepresentatie aangegeven door systeembestand (%d) verschilt " "van wat verwacht werd (%d)." #: src/data/sys-file-reader.c:1629 #, c-format msgid "" "Integer format indicated by system file (%d) differs from expected (%d)." msgstr "" "Integer-indeling aangegeven door systeembestand (%d) verschilt van wat " "verwacht werd (%d)." #: src/data/sys-file-reader.c:1647 src/data/sys-file-reader.c:1653 #, c-format msgid "File specifies unexpected value %g (%a) as %s, instead of %g (%a)." msgstr "" "Bestand specificeert onverwachte waarde %g (%a) als %s in plaats van %g (%a)." #: src/data/sys-file-reader.c:1662 #, c-format msgid "" "File specifies unexpected value %g (%a) as %s, instead of %g (%a) or %g (%a)." msgstr "" "Bestand specificeert onverwachte waarde %g (%a) als %s inplaats van %g (%a) " "of %g (%a)." #: src/data/sys-file-reader.c:1714 src/data/sys-file-reader.c:1733 #, c-format msgid "Missing space following `%c' at offset %zu in MRSETS record." msgstr "Ontbrekende spatie achter `%c' op positie %zu in MRSETS-kaart." #: src/data/sys-file-reader.c:1741 #, c-format msgid "" "Missing label source value following `E' at offset %zu in MRSETS record." msgstr "" "Ontbrekende label-bronwaarde achter `E' op positie %zu in MRSETS-kaart." #: src/data/sys-file-reader.c:1748 #, c-format msgid "" "Unexpected label source value following `E' at offset %zu in MRSETS record." msgstr "" "Onverwachte label-bronwaarde achter `E' op positie %zu in MRSETS-kaart." #: src/data/sys-file-reader.c:1755 #, c-format msgid "Missing `C', `D', or `E' at offset %zu in MRSETS record." msgstr "Ontbrekende `C', `D', of `E' op positie %zu in MRSETS-kaart." #: src/data/sys-file-reader.c:1782 #, c-format msgid "Missing new-line parsing variable names at offset %zu in MRSETS record." msgstr "" "Nieuwe-regel ontbreekt bij lezen variabelenamen op positie %zu in MRSETS-" "kaart." #: src/data/sys-file-reader.c:1817 #, c-format msgid "Invalid multiple response set name `%s'." msgstr "Ongeldige naam %s voor \"multiple response set\"." #: src/data/sys-file-reader.c:1850 #, c-format msgid "MRSET %s contains duplicate variable name %s." msgstr "MRSET %s bevat eerder gebruikte variabelenaam %s." #: src/data/sys-file-reader.c:1865 #, c-format msgid "MRSET %s contains both string and numeric variables." msgstr "MRSET %s bevat zowel alfanumerieke als numerieke variabelen." #: src/data/sys-file-reader.c:1877 #, c-format msgid "MRSET %s has no variables." msgstr "MRSET %s heeft geen variabelen." #: src/data/sys-file-reader.c:1879 #, c-format msgid "MRSET %s has only one variable." msgstr "MRSET %s heeft slechts één variabele." #: src/data/sys-file-reader.c:1923 #, c-format msgid "Extension 11 has bad count %u (for %zu variables)." msgstr "Extensie 11 heeft foutief aantal %u (voor %zu variabelen)." #: src/data/sys-file-reader.c:1956 #, c-format msgid "" "Invalid variable display parameters for variable %zu (%s). Default " "parameters substituted." msgstr "" "Ongeldige parameters voor weergeven van variabele %zu (%s). Vervangen door " "standaardparameters." #: src/data/sys-file-reader.c:2000 #, c-format msgid "Duplicate long variable name `%s'." msgstr "Al gebruikte lange variabelenaam `%s'." #: src/data/sys-file-reader.c:2053 #, c-format msgid "Long variable mapping from %s to invalid variable name `%s'." msgstr "" "\"Mapping\" van lange variabele van %s tot ongeldige variabelenaam `%s'." #: src/data/sys-file-reader.c:2088 #, c-format msgid "%s listed as string of invalid length %s in very long string record." msgstr "" "%s vermeld als tekenreeks van foutieve lengte %s in zeer lange alfanumerieke " "kaart." #: src/data/sys-file-reader.c:2099 #, c-format msgid "" "%s listed in very long string record with width %s, which requires only one " "segment." msgstr "" "%s vermeld in zeer lange alfanumerieke kaart met breedte %s, die slechts één " "segment vereist." #: src/data/sys-file-reader.c:2107 #, c-format msgid "Very long string %s overflows dictionary." msgstr "Zeer lange tekenreeks %s is te groot voor woordenboek." #: src/data/sys-file-reader.c:2125 #, c-format msgid "" "Very long string with width %ld has segment %d of width %d (expected %d)." msgstr "" "Zeer lange tekenreeks met breedte %ld heeft segment %d van breedte %d " "(verwacht werd %d)." #: src/data/sys-file-reader.c:2183 #, fuzzy, c-format #| msgid "Variable index %d not in valid range 1...%zu." msgid "Value label variable index %d not in valid range 1...%zu." msgstr "Variabele-index %d niet in geldig bereik 1...%zu." #: src/data/sys-file-reader.c:2193 #, fuzzy, c-format #| msgid "Variable index %d refers to long string continuation." msgid "Value label variable index %d refers to long string continuation." msgstr "Variabele-index %d verwijst naar voortzetting van lange tekenreeks." #: src/data/sys-file-reader.c:2208 #, c-format msgid "" "Variables associated with value label are not all of identical type. " "Variable %s is %s, but variable %s is %s." msgstr "" "Variabelen geassocieerd met waardelabel zijn niet alle van hetzelfde type. " "Variabele %s is %s, maar variabele %s is %s." #: src/data/sys-file-reader.c:2226 #, c-format msgid "" "Value labels may not be added to long string variables (e.g. %s) using " "records types 3 and 4." msgstr "" "Waardelabels mogen niet worden toegevoegd aan lange alfanumerieke variabelen " "(bijv. %s) door middel van kaarten van types 3 en 4." #: src/data/sys-file-reader.c:2255 #, c-format msgid "Duplicate value label for %g on %s." msgstr "Eerder gebruikt waardelabel voor %g in %s." #: src/data/sys-file-reader.c:2260 src/data/sys-file-reader.c:2600 #, c-format msgid "Duplicate value label for `%.*s' on %s." msgstr "Eerder gebruikt waardelabel voor `%.*s' in %s." #: src/data/sys-file-reader.c:2283 #, fuzzy, c-format #| msgid "Suppressed %d additional related warnings." msgid "Suppressed %d additional warnings for value labels." msgstr "%d bijkomende gerelateerde waarschuwingen zijn onderdrukt." #: src/data/sys-file-reader.c:2297 #, fuzzy, c-format #| msgid "Weight variable index %d not in valid range 1...%zu." msgid "" "Weight variable index %d not in valid range 1...%zu. Treating file as " "unweighted." msgstr "Gewichtsvariabele-index %d niet in geldig bereik 1...%zu." #: src/data/sys-file-reader.c:2307 #, fuzzy, c-format #| msgid "Weight variable index %d refers to long string continuation." msgid "" "Weight variable index %d refers to long string continuation. Treating file " "as unweighted." msgstr "" "Gewichtsvariabele-index %d verwijst naar voortzetting van lange tekenreeks." #: src/data/sys-file-reader.c:2315 #, c-format msgid "Ignoring string variable `%s' set as weighting variable." msgstr "Weging door alfanumerieke variabele `%s' wordt genegeerd." #: src/data/sys-file-reader.c:2352 #, c-format msgid "Error parsing attribute value %s[%d]." msgstr "Fout tijdens lezen van eigenschapwaarde %s[%d]." #: src/data/sys-file-reader.c:2366 #, c-format msgid "Attribute value %s[%d] is not quoted: %s." msgstr "Attribuutwaarde %s[%d] wordt niet geciteerd: %s." #: src/data/sys-file-reader.c:2379 #, c-format msgid "Duplicate attribute %s." msgstr "Reeds gebruikt kenmerk %s." #: src/data/sys-file-reader.c:2463 #, c-format msgid "Invalid role for variable %s." msgstr "Ongeldige rol voor variabele %s." #: src/data/sys-file-reader.c:2472 #, c-format msgid "%zu other variables had invalid roles." msgstr "%zu andere variabelen hadden ongeldige rollen." #: src/data/sys-file-reader.c:2485 #, c-format msgid "Extension record subtype %d ends unexpectedly." msgstr "Uitbreidingskaart van subtype %d eindigt onverwacht." #: src/data/sys-file-reader.c:2531 #, c-format msgid "Ignoring long string value label record for unknown variable %s." msgstr "" "Kaart met lange alfanumerieke waardelabels voor onbekende variabele %s wordt " "genegeerd." #: src/data/sys-file-reader.c:2536 #, c-format msgid "Ignoring long string value label record for numeric variable %s." msgstr "" "Kaart met lange alfanumerieke waardelabels voor numerieke variabele %s wordt " "genegeerd." #: src/data/sys-file-reader.c:2543 #, c-format msgid "" "Ignoring long string value label record for variable %s because the record's " "width (%d) does not match the variable's width (%d)." msgstr "" "Kaart met lange alfanumerieke waardelabels voor variabele %s wordt genegeerd " "omdat de breedte van de kaart (%d) niet overeenkomt met de breedte van de " "variabele (%d)." #: src/data/sys-file-reader.c:2573 #, c-format msgid "" "Ignoring long string value label %zu for variable %s, with width %d, that " "has bad value width %zu." msgstr "" "Lang alfanumeriek waardelabel %zu voor variabele %s met breedte %d, dat een " "foutieve breedtewaarde %zu heeft, wordt genegeerd." #: src/data/sys-file-reader.c:2646 #, c-format msgid "" "Long string missing values record says variable %s has %d missing values, " "but only 1 to 3 missing values are allowed." msgstr "" "Volgens kaart met lange alfanumerieke ontbrekende waarden heeft variabele %s " "%d ontbrekende waarden, maar slechts 1 tot en met 3 ontbrekende waarden zijn " "toegestaan." #: src/data/sys-file-reader.c:2656 #, c-format msgid "Ignoring long string missing value record for unknown variable %s." msgstr "" "Kaart met lange alfanumerieke ontbrekende waarden voor onbekende variabele " "%s wordt genegeerd." #: src/data/sys-file-reader.c:2661 #, c-format msgid "Ignoring long string missing value record for numeric variable %s." msgstr "" "Kaart met lange alfanumerieke ontbrekende waarden voor numerieke variabele " "%s wordt genegeerd." #: src/data/sys-file-reader.c:2686 #, c-format msgid "" "Ignoring long string missing value %zu for variable %s, with width %d, that " "has bad value width %zu." msgstr "" "Lange alfanumerieke ontbrekende waarde %zu voor variabele %s met breedte %d, " "die een foutieve breedtewaarde %zu heeft, wordt genegeerd." #: src/data/sys-file-reader.c:2740 msgid "File ends in partial string value." msgstr "Bestand eindigt in gedeeltelijke alfanumerieke waarde." #: src/data/sys-file-reader.c:2879 msgid "" "Possible compressed data corruption: compressed spaces appear in numeric " "field." msgstr "" "Mogelijke fout in gecomprimeerde gegevens: gecomprimeerde spaties " "verschijnen in numeriek veld." #: src/data/sys-file-reader.c:3030 #, c-format msgid "Suppressed %d additional related warnings." msgstr "%d bijkomende gerelateerde waarschuwingen zijn onderdrukt." #: src/data/sys-file-reader.c:3076 src/data/sys-file-reader.c:3093 #, c-format msgid "Dictionary record refers to unknown variable %s." msgstr "Woordenboekkaart verwijst naar onbekende variabele %s." #: src/data/sys-file-reader.c:3159 #, c-format msgid "Expecting digit at offset %zu in MRSETS record." msgstr "Op positie %zu in MRSETS-kaart wordt een cijfer verwacht." #: src/data/sys-file-reader.c:3167 #, c-format msgid "Expecting space at offset %zu in MRSETS record." msgstr "Op positie %zu in MRSETS-kaart wordt een spatie verwacht." #: src/data/sys-file-reader.c:3175 #, c-format msgid "%zu-byte string starting at offset %zu exceeds record length %zu." msgstr "" "Tekenreeks van %zu bytes, beginnend op positie %zu, overschrijdt kaartlengte " "%zu." #: src/data/sys-file-reader.c:3185 #, c-format msgid "Expecting space at offset %zu following %zu-byte string." msgstr "" "Op positie %zu, volgend op tekenreeks van %zu bytes, wordt spatie verwacht." #: src/data/sys-file-reader.c:3476 #, c-format msgid "Wrong ZLIB data header offset %#llx (expected %#llx)." msgstr "Onjuiste positie %#llx van ZLIB gegevens-header (verwacht werd %#llx)." #: src/data/sys-file-reader.c:3484 #, c-format msgid "Impossible ZLIB trailer offset 0x%llx." msgstr "Onmogelijke positie 0x%llx van ZLIB-trailer." #: src/data/sys-file-reader.c:3491 #, c-format msgid "Invalid ZLIB trailer length %lld." msgstr "Ongeldige lengte %lld van ZLIB-trailer." #: src/data/sys-file-reader.c:3555 #, c-format msgid "End of ZLIB trailer (0x%llx) is not file size (0x%llx)." msgstr "" "Einde van ZLIB-trailer (0x%llx) is ongelijk aan bestandsgrootte (0x%llx)." #: src/data/sys-file-reader.c:3565 #, c-format msgid "ZLIB trailer bias (%lld) differs from file header bias (%.2f)." msgstr "" "Afwijking ZLIB-trailer (%lld) verschilt van afwijking bestandsheader (%.2f)." #: src/data/sys-file-reader.c:3575 #, c-format msgid "ZLIB trailer \"zero\" field has nonzero value %lld." msgstr "\"Nul\"-veld van ZLIB-trailer heeft waarde %lld: ongelijk nul." #: src/data/sys-file-reader.c:3581 #, c-format msgid "ZLIB trailer specifies unexpected %u-byte block size." msgstr "ZLIB-trailer specificeert onverwachte blokgrootte van %u bytes." #: src/data/sys-file-reader.c:3589 #, c-format msgid "%lld-byte ZLIB trailer specifies %u data blocks (expected %lld)." msgstr "" "ZLIB-trailer van %lld-bytes specificeert %u gegevensblokken (%lld verwacht)." #: src/data/sys-file-reader.c:3614 #, c-format msgid "" "ZLIB block descriptor %u reported uncompressed data offset %#llx, when %#llx " "was expected." msgstr "" "ZLIB-blokbeschrijving %u rapporteert ongecomprimeerde gegevens vanaf positie " "%#llx; verwacht werd %#llx." #: src/data/sys-file-reader.c:3623 #, c-format msgid "" "ZLIB block descriptor %u reported compressed data offset %#llx, when %#llx " "was expected." msgstr "" "ZLIB-blokbeschrijving %u rapporteert gecomprimeerde gegevens vanaf positie " "%#llx; verwacht werd %#llx." #: src/data/sys-file-reader.c:3633 #, c-format msgid "" "ZLIB block descriptor %u reported block size %#x, when %#x was expected." msgstr "" "ZLIB-blokbeschrijving %u rapporteert blokgrootte %#x; verwacht werd %#x." #: src/data/sys-file-reader.c:3641 #, c-format msgid "" "ZLIB block descriptor %u reported block size %#x, when at most %#x was " "expected." msgstr "" "ZLIB-blokbeschrijving %u rapporteert blokgrootte %#x; verwacht werd ten " "hoogste %#x." #: src/data/sys-file-reader.c:3653 #, c-format msgid "" "ZLIB block descriptor %u reports compressed size %u and uncompressed size %u." msgstr "" "ZLIB-blokbeschrijving %u rapporteert gecomprimeerde grootte %u en " "ongecomprimeerde grootte %u." #: src/data/sys-file-reader.c:3665 #, c-format msgid "" "ZLIB trailer is at offset %#llx but %#llx would be expected from block " "descriptors." msgstr "" "ZLIB-trailer begint op positie %#llx, maar uit blokbeschrijvingen werd %#llx " "verwacht." #: src/data/sys-file-reader.c:3684 #, c-format msgid "ZLIB initialization failed (%s)." msgstr "ZLIB-initialisatie mislukt (%s)." #: src/data/sys-file-reader.c:3699 #, c-format msgid "Inconsistency at end of ZLIB stream (%s)." msgstr "Inconsistentie aan einde van ZLIB-stroom (%s)." #: src/data/sys-file-reader.c:3758 #, c-format msgid "ZLIB stream inconsistency (%s)." msgstr "ZLIB-stroom inconsistent (%s)." #: src/data/sys-file-reader.c:3782 msgid "Unexpected end of ZLIB compressed data." msgstr "Onverwacht einde van ZLIB-gecomprimeerde data." #: src/data/sys-file-reader.c:3820 msgid "SPSS System File" msgstr "SPSS-systeembestand" #: src/data/sys-file-writer.c:210 #, c-format msgid "Unknown system file version %d. Treating as version %d." msgstr "Onbekende systeembestandsversie %d. Wordt behandeld als versie %d." #: src/data/sys-file-writer.c:256 #, c-format msgid "Error opening `%s' for writing as a system file: %s." msgstr "Fout bij het openen van `%s' voor schrijven als systeembestand: %s." #: src/data/sys-file-writer.c:1271 #, c-format msgid "An I/O error occurred writing system file `%s'." msgstr "" "Een invoer-uitvoerfout is opgetreden tijdens schrijven van systeembestand `" "%s'." #: src/data/sys-file-writer.c:1378 #, c-format msgid "Failed to initialize ZLIB for compression (%s)." msgstr "ZLIB initialiseren voor compressie is mislukt (%s)." #: src/data/sys-file-writer.c:1407 #, c-format msgid "Failed to complete ZLIB stream compression (%s)." msgstr "Voltooien ZLIB-stroomcompressie is mislukt (%s)." #: src/data/sys-file-writer.c:1449 #, c-format msgid "ZLIB stream compression failed (%s)." msgstr "Comprimeren ZLIB-stroom is mislukt (%s)." #: src/data/sys-file-writer.c:1491 #, c-format msgid "%s: Seek failed (%s)." msgstr "%s: zoeken mislukt (%s)." #: src/data/variable.c:58 msgid "Left" msgstr "Links" #: src/data/variable.c:59 msgid "Right" msgstr "Rechts" #: src/data/variable.c:60 msgid "Center" msgstr "Midden" #: src/data/variable.c:66 msgid "Nominal" msgstr "Nominaal" #: src/data/variable.c:67 msgid "Ordinal" msgstr "Ordinaal" #: src/data/variable.c:68 src/language/stats/ks-one-sample.c:300 msgid "Scale" msgstr "Schaal" #: src/data/variable.c:74 msgid "Input" msgstr "Invoer" #. TRANSLATORS: This will be part of a filename. Please avoid whitespace. #: src/data/variable.c:75 src/output/spv/spv-writer.c:213 #: src/ui/gui/psppire-output-window.c:547 msgid "Output" msgstr "Uitvoer" #: src/data/variable.c:76 msgid "Both" msgstr "Beide" #: src/data/variable.c:77 src/language/dictionary/sys-file-info.c:237 #: src/ui/gui/psppire-dialog-action-crosstabs.c:86 #: src/ui/gui/psppire-dialog-action-crosstabs.c:98 #: src/ui/gui/psppire-dialog-action-crosstabs.c:133 #: src/ui/gui/psppire-dialog-action-crosstabs.c:141 #: src/ui/gui/psppire-variable-sheet.c:408 src/ui/gui/var-display.c:34 msgid "None" msgstr "Geen" #: src/data/variable.c:78 msgid "Partition" msgstr "Partitie" #: src/data/variable.c:79 src/ui/gui/reliability.ui:37 msgid "Split" msgstr "Splits" #: src/data/variable.c:729 #, c-format msgid "%s (%s)" msgstr "%s (%s)" #: src/data/variable.c:1339 msgid "" "At least one case in the data file had a weight value that was user-missing, " "system-missing, zero, or negative. These case(s) were ignored." msgstr "" "Minstens één observatie in het gegevensbestand heeft een gewichtwaarde user-" "missing, system-missing, nul, of negatief. Deze observatie(s) zijn " "genegeerd." #: src/language/command.c:207 src/language/stats/graph.c:749 #: src/language/stats/graph.c:755 src/language/stats/graph.c:789 #: src/language/stats/graph.c:794 src/language/stats/graph.c:799 #: src/language/stats/graph.c:852 src/language/stats/graph.c:857 #: src/language/stats/graph.c:862 src/language/stats/graph.c:867 #: src/language/stats/graph.c:872 src/language/stats/graph.c:877 #: src/language/stats/graph.c:882 src/language/utilities/set.q:236 #, c-format msgid "%s is not yet implemented." msgstr "%s is nog niet geïmplementeerd." #: src/language/command.c:212 #, c-format msgid "%s may be used only in testing mode." msgstr "%s mag alleen in testmodus worden gebruikt." #: src/language/command.c:217 #, c-format msgid "%s may be used only in enhanced syntax mode." msgstr "%s mag alleen in uitgebreide syntaxmodus worden gebruikt." #: src/language/command.c:345 msgid "expecting command name" msgstr "opdrachtnaam verwacht" #: src/language/command.c:347 #, c-format msgid "Unknown command `%s'." msgstr "Onbekende opdracht `%s'." #: src/language/command.c:380 #, c-format msgid "%s is allowed only before the active dataset has been defined." msgstr "%s is alleen toegestaan voordat de actieve dataset is gedefinieerd." #: src/language/command.c:384 #, c-format msgid "%s is allowed only after the active dataset has been defined." msgstr "%s is alleen toegestaan nadat de actieve dataset is gedefinieerd." #: src/language/command.c:388 src/language/command.c:392 #, c-format msgid "%s is allowed only inside %s." msgstr "%s is alleen toegestaan binnen %s." #: src/language/command.c:399 src/language/command.c:403 #, c-format msgid "" "%s is allowed only before the active dataset has been defined or inside %s." msgstr "" "%s is alleen toegestaan voordat de actieve dataset is gedefinieerd of binnen " "%s." #: src/language/command.c:407 src/language/command.c:411 #, c-format msgid "" "%s is allowed only after the active dataset has been defined or inside %s." msgstr "" "%s is alleen toegestaan nadat de actieve dataset is gedefinieerd of binnen " "%s." #: src/language/command.c:415 #, c-format msgid "%s is allowed only inside %s or inside %s." msgstr "%s is alleen toegestaan binnen %s of binnen %s." #: src/language/command.c:421 #, c-format msgid "" "%s is allowed only after the active dataset has been defined, inside INPUT " "PROGRAM, or inside FILE TYPE." msgstr "" "%s is alleen toegestaan nadat de actieve dataset is gedefinieerd, binnen " "INPUT PROGRAM, of binnen FILE TYPE." #: src/language/command.c:426 #, c-format msgid "" "%s is allowed only before the active dataset has been defined, inside INPUT " "PROGRAM, or inside FILE TYPE." msgstr "" "%s is alleen toegestaan voordat de actieve dataset is gedefinieerd, binnen " "INPUT PROGRAM, of binnen FILE TYPE." #: src/language/command.c:444 src/language/command.c:447 #, c-format msgid "%s is not allowed inside %s." msgstr "%s is niet toegestaan binnen %s." #: src/language/command.c:529 src/language/utilities/host.c:272 #: src/language/utilities/permissions.c:105 #, c-format msgid "This command not allowed when the %s option is set." msgstr "Deze opdracht is niet toegestaan als de %s-optie is gezet." #: src/language/command.c:545 #, c-format msgid "Error removing `%s': %s." msgstr "Fout bij verwijderen `%s': %s." #: src/language/lexer/lexer.c:296 #, c-format msgid "expecting %s" msgstr "%s verwacht" #: src/language/lexer/lexer.c:300 #, c-format msgid "expecting %s or %s" msgstr "%s of %s verwacht" #: src/language/lexer/lexer.c:304 #, c-format msgid "expecting %s, %s, or %s" msgstr "%s, %s, of %s verwacht" #: src/language/lexer/lexer.c:309 #, c-format msgid "expecting %s, %s, %s, or %s" msgstr "%s, %s, %s, of %s verwacht" #: src/language/lexer/lexer.c:314 #, c-format msgid "expecting %s, %s, %s, %s, or %s" msgstr "%s, %s, %s, %s of %s verwacht" #: src/language/lexer/lexer.c:319 #, c-format msgid "expecting %s, %s, %s, %s, %s, or %s" msgstr "%s, %s, %s, %s, %s of %s verwacht" #: src/language/lexer/lexer.c:325 #, c-format msgid "expecting %s, %s, %s, %s, %s, %s, or %s" msgstr "%s, %s, %s, %s, %s, %s of %s verwacht" #: src/language/lexer/lexer.c:331 #, c-format msgid "expecting %s, %s, %s, %s, %s, %s, %s, or %s" msgstr "%s, %s, %s, %s, %s, %s, %s of %s verwacht" #: src/language/lexer/lexer.c:351 #, c-format msgid "Subcommand %s may only be specified once." msgstr "Subopdracht %s mag slechts éénmaal gespecificeerd worden." #: src/language/lexer/lexer.c:363 #, c-format msgid "Required subcommand %s was not specified." msgstr "Vereiste subopdracht %s werd niet opgegeven." #: src/language/lexer/lexer.c:371 #, c-format msgid "%s may only be specified once within subcommand %s" msgstr "%s mag slechts éénmaal worden opgegevenbinnen subopdracht %s" #: src/language/lexer/lexer.c:380 #, c-format msgid "Required %s specification missing from %s subcommand" msgstr "Vereiste %s-specificatie ontbreekt op %s-subopdracht" #: src/language/lexer/lexer.c:399 msgid "Syntax error at end of input" msgstr "Syntaxfout aan einde van invoer" #: src/language/lexer/lexer.c:420 src/language/xforms/select-if.c:60 #: src/language/stats/autorecode.c:206 src/language/stats/npar.c:503 #: src/language/data-io/print-space.c:83 msgid "expecting end of command" msgstr "verwacht einde van opdracht" #: src/language/lexer/lexer.c:631 msgid "expecting string" msgstr "tekenreeks verwacht" #: src/language/lexer/lexer.c:660 msgid "expecting integer" msgstr "geheel getal verwacht" #: src/language/lexer/lexer.c:673 msgid "expecting number" msgstr "getal verwacht" #: src/language/lexer/lexer.c:685 msgid "expecting identifier" msgstr "identificator verwacht" #: src/language/lexer/lexer.c:1272 msgid "Syntax error at end of command" msgstr "Syntaxfout aan einde van opdracht" #: src/language/lexer/lexer.c:1281 #, c-format msgid "Syntax error at `%s'" msgstr "Syntaxfout op `%s'" #: src/language/lexer/lexer.c:1284 msgid "Syntax error" msgstr "Syntaxfout" #: src/language/lexer/lexer.c:1470 #, c-format msgid "String of hex digits has %d characters, which is not a multiple of 2" msgstr "" "Reeks van hexadecimale cijfers bevat %d tekens; dit is geen veelvoud van 2" #: src/language/lexer/lexer.c:1477 #, c-format msgid "`%c' is not a valid hex digit" msgstr "`%c' is geen geldig hexadecimaal cijfer" #: src/language/lexer/lexer.c:1482 #, c-format msgid "" "Unicode string contains %d bytes, which is not in the valid range of 1 to 8 " "bytes" msgstr "" "Unicode-tekenreeks bevat %d bytes; dit valt niet binnen het geldige bereik " "van 1 tot en met 8 bytes" #: src/language/lexer/lexer.c:1488 #, c-format msgid "U+%04X is not a valid Unicode code point" msgstr "U+%04X is geen geldig Unicode-codepunt" #: src/language/lexer/lexer.c:1493 msgid "Unterminated string constant" msgstr "Tekenreeksconstante is niet afgesloten" #: src/language/lexer/lexer.c:1497 #, c-format msgid "Missing exponent following `%s'" msgstr "Ontbrekende exponent volgend op `%s'" #: src/language/lexer/lexer.c:1502 msgid "Unexpected `.' in middle of command" msgstr "Onverwachte `.' in midden van opdracht" #: src/language/lexer/lexer.c:1508 #, c-format msgid "Bad character %s in input" msgstr "Foutief teken %s in invoer" #: src/language/lexer/lexer.c:1603 #, c-format msgid "Opening `%s': %s." msgstr "Openen `%s': %s." #: src/language/lexer/lexer.c:1647 #, c-format msgid "Error closing `%s': %s." msgstr "Fout bij sluiten `%s': %s." #: src/language/lexer/subcommand-list.c:118 #, c-format msgid "No more than %d %s subcommands allowed." msgstr "Niet meer dan %d %s subopdrachten toegestaan." #: src/language/lexer/format-parser.c:77 msgid "expecting valid format specifier" msgstr "verwacht geldige indelingsspecificatie" #: src/language/lexer/format-parser.c:116 #: src/language/lexer/format-parser.c:143 src/language/utilities/output.c:108 #: src/language/data-io/data-list.c:453 src/language/data-io/get-data.c:638 #: src/language/data-io/placement-parser.c:236 #, c-format msgid "Unknown format type `%s'." msgstr "Onbekend indelingstype `%s'." #: src/language/lexer/format-parser.c:122 #, c-format msgid "Format specifier `%s' lacks required width." msgstr "In indelingsspecificatie `%s' ontbreekt vereiste breedte." #: src/language/lexer/format-parser.c:138 msgid "expecting format type" msgstr "verwacht indelingstype" #: src/language/lexer/value-parser.c:66 #, c-format msgid "" "The high end of the range (%.*g) is below the low end (%.*g). The range " "will be treated as if reversed." msgstr "" "De bovengrens van bereik (%.*g) is lager dan de benedengrens (%.*g). Het " "bereik wordt behandeld alsof het was omgekeerd." #: src/language/lexer/value-parser.c:74 #, c-format msgid "Ends of range are equal (%.*g)." msgstr "Grenzen van bereik zijn gelijk (%.*g)." #: src/language/lexer/value-parser.c:82 #, c-format msgid "%s or %s must be part of a range." msgstr "%s of %s moet deel van een bereik zijn." #: src/language/lexer/value-parser.c:112 msgid "System-missing value is not valid here." msgstr "System-missing waarde is hier niet geldig." #: src/language/lexer/variable-parser.c:86 utilities/pspp-convert.c:83 msgid "expecting variable name" msgstr "variabelenaam werd verwacht" #: src/language/lexer/variable-parser.c:96 #, c-format msgid "%s is not a variable name." msgstr "%s is geen variabelenaam." #: src/language/lexer/variable-parser.c:206 #, c-format msgid "" "%s is not a numeric variable. It will not be included in the variable list." msgstr "" "%s is geen numerieke variabele. Deze wordt niet opgenomen in de " "variabelenlijst." #: src/language/lexer/variable-parser.c:209 #, c-format msgid "" "%s is not a string variable. It will not be included in the variable list." msgstr "" "%s is geen alfanumerieke variabele. Deze wordt niet opgenomen in de " "variabelenlijst." #: src/language/lexer/variable-parser.c:213 #, c-format msgid "Scratch variables (such as %s) are not allowed here." msgstr "Kladvariabelen (zoals %s) zijn hier niet toegestaan." #: src/language/lexer/variable-parser.c:217 #, c-format msgid "" "%s and %s are not the same type. All variables in this variable list must " "be of the same type. %s will be omitted from the list." msgstr "" "%s en %s zijn niet van hetzelfde type. Alle variabelen in deze " "variabelenlijst moeten van hetzelfde type zijn. %s wordt uit de lijst " "weggelaten." #: src/language/lexer/variable-parser.c:223 #, c-format msgid "" "%s and %s are string variables with different widths. All variables in this " "variable list must have the same width. %s will be omitted from the list." msgstr "" "%s en %s zijn alfanumerieke variabelen met verschillende breedtes. Alle " "variabelen in deze variabelenlijst moeten dezelfde breedte hebben. %s wordt " "uit de lijst weggelaten." #: src/language/lexer/variable-parser.c:228 #: src/language/lexer/variable-parser.c:447 #, c-format msgid "Variable %s appears twice in variable list." msgstr "Variabele %s komt tweemaal voor in de variabelenlijst." #: src/language/lexer/variable-parser.c:341 #, c-format msgid "%s TO %s is not valid syntax since %s precedes %s in the dictionary." msgstr "" "%s TO %s is geen geldige syntax omdat in het woordenboek %s vóór %s staat." #: src/language/lexer/variable-parser.c:349 #, c-format msgid "" "When using the TO keyword to specify several variables, both variables must " "be from the same variable dictionaries, of either ordinary, scratch, or " "system variables. %s is a %s variable, whereas %s is %s." msgstr "" "Bij gebruik van het sleutelwoord TO om meerdere variabelen te specificeren, " "moeten beide variabelen komen uit hetzelfde variabelenwoordenboek met " "gewone, klad- of systeemvariabelen. %s is een %s variabele, terwijl %s %s is." #: src/language/lexer/variable-parser.c:424 #, c-format msgid "`%s' cannot be used with TO because it does not end in a digit." msgstr "" "`%s' kan niet gebruikt worden met TO omdat het niet eindigt met een cijfer." #: src/language/lexer/variable-parser.c:432 #, c-format msgid "Numeric suffix on `%s' is larger than supported with TO." msgstr "Numeriek achtervoegsel op `%s' is langer dan ondersteund door TO." #: src/language/lexer/variable-parser.c:505 msgid "Scratch variables not allowed here." msgstr "Kladvariabelen zijn hier niet toegestaan." #: src/language/lexer/variable-parser.c:529 msgid "Prefixes don't match in use of TO convention." msgstr "Voorvoegsels komen niet overeen bij gebruik van TO-conventie." #: src/language/lexer/variable-parser.c:534 msgid "Bad bounds in use of TO convention." msgstr "Foutieve grenzen bij gebruik van TO-conventie." #: src/language/xforms/compute.c:150 src/language/xforms/compute.c:205 #, c-format msgid "" "When executing COMPUTE: SYSMIS is not a valid value as an index into vector " "%s." msgstr "" "Tijdens uitvoeren van COMPUTE: SYSMIS is geen geldige waarde als een index " "in vector %s." #: src/language/xforms/compute.c:154 src/language/xforms/compute.c:212 #, c-format msgid "" "When executing COMPUTE: %.*g is not a valid value as an index into vector %s." msgstr "" "Tijdens uitvoeren van COMPUTE: %.*g is geen geldige waarde als een index in " "vector %s." #: src/language/xforms/compute.c:356 #, c-format msgid "There is no vector named %s." msgstr "Er is geen vector genaamd %s." #: src/language/xforms/count.c:125 msgid "Destination cannot be a string variable." msgstr "Bestemming kan geen alfanumerieke variabele zijn." #: src/language/xforms/sample.c:76 msgid "The sampling factor must be between 0 and 1 exclusive." msgstr "De steekproeffactor moet tussen 0 en 1 exclusief liggen." #: src/language/xforms/sample.c:96 #, c-format msgid "Cannot sample %d observations from a population of %d." msgstr "" "Kan geen steekproef van %d observaties trekken uit een populatie van %d." #: src/language/xforms/recode.c:261 msgid "" "Inconsistent target variable types. Target variables must be all numeric or " "all string." msgstr "" "Inconsistente soorten doelvariabelen. Doelvariabelen moeten alle numeriek " "of alfanumeriek zijn." #: src/language/xforms/recode.c:282 msgid "CONVERT requires string input values and numeric output values." msgstr "" "CONVERT vereist alfanumerieke invoerwaarden en numerieke uitvoerwaarden." #: src/language/xforms/recode.c:339 #, c-format msgid "%s is not allowed with string variables." msgstr "%s is met alfanumerieke variabelen niet toegestaan." #: src/language/xforms/recode.c:422 msgid "expecting output value" msgstr "verwacht uitvoerwaarde" #: src/language/xforms/recode.c:479 #, c-format msgid "" "%zu variable(s) cannot be recoded into %zu variable(s). Specify the same " "number of variables as source and target variables." msgstr "" "%zu variabel(en) kunnen niet gehercodeerd worden tot %zu variabel(en). " "Specificeer hetzelfde aantal variabelen als bron- en doelvariabelen." #: src/language/xforms/recode.c:494 #, c-format msgid "" "There is no variable named %s. (All string variables specified on INTO must " "already exist. Use the STRING command to create a string variable.)" msgstr "" "Er is geen variabele genaamd %s. (Alle alfanumerieke variabelen " "gespecificeerd bij INTO moeten reeds bestaan. Gebruik de STRING-opdracht om " "een alfanumerieke variabele aan te maken.)" #: src/language/xforms/recode.c:510 #, c-format msgid "INTO is required with %s input values and %s output values." msgstr "INTO is vereist met %s invoerwaarden en %s uitvoerwaarden." #: src/language/xforms/recode.c:523 #, c-format msgid "Type mismatch. Cannot store %s data in %s variable %s." msgstr "" "Fout met variabeletype. Kan %s gegevens niet in %s variabele %s opslaan." #: src/language/xforms/recode.c:566 #, c-format msgid "" "Cannot recode because the variable %s would require a width of %d bytes or " "greater, but it has a width of only %d bytes." msgstr "" "Kan niet hercoderen: variabele %s zou een breedte van %d bytes of meer " "moeten hebben, maar is slechts %d bytes breed." #: src/language/xforms/select-if.c:100 msgid "Syntax error expecting OFF or BY. Turning off case filtering." msgstr "" "Syntaxfout: OFF of BY verwacht. Filteren van observaties wordt uitgeschakeld." #: src/language/xforms/select-if.c:115 msgid "The filter variable must be numeric." msgstr "De filtervariabele moet numeriek zijn." #: src/language/xforms/select-if.c:121 msgid "The filter variable may not be scratch." msgstr "De filtervariabele mag geen kladvariabele zijn." #: src/language/control/control-stack.c:49 #, c-format msgid "%s without %s." msgstr "%s zonder %s." #: src/language/control/control-stack.c:77 #, c-format msgid "This command must appear inside %s...%s, without intermediate %s...%s." msgstr "" "Deze opdracht moet staan binnen %s...%s, zonder tussenliggende %s...%s." #: src/language/control/control-stack.c:94 #, c-format msgid "This command cannot appear outside %s...%s." msgstr "Deze opdracht kan niet voorkomen buiten %s...%s." #: src/language/control/do-if.c:180 #, c-format msgid "This command may not follow %s in %s ... %s." msgstr "Deze opdracht mag niet volgen op %s in %s ... %s." #: src/language/control/loop.c:211 msgid "Only one index clause may be specified." msgstr "Slechts één indexclausule mag worden opgegeven." #: src/language/control/repeat.c:120 #, c-format msgid "Dummy variable name `%s' hides dictionary variable `%s'." msgstr "\"Dummy\"-variabelenaam `%s' verbergt woordenboekvariabele `%s'." #: src/language/control/repeat.c:126 #, c-format msgid "Dummy variable name `%s' is given twice." msgstr "\"Dummy\"-variabelenaam `%s' is twee keer opgegeven." #: src/language/control/repeat.c:170 #, c-format msgid "" "Dummy variable `%s' had %zu substitutions, so `%s' must also, but %zu were " "specified." msgstr "" "\"Dummy\"-variabele `%s' had %zu vervangingen, dus `%s' moet dat ook, maar " "er werden %zu vervangingen gespecificeerd." #: src/language/control/repeat.c:379 msgid "Ranges may only have integer bounds." msgstr "Bereiken mogen alleen grenzen van gehele getallen hebben." #: src/language/control/repeat.c:393 #, c-format msgid "%ld TO %ld is an invalid range." msgstr "%ld TO %ld is een ongeldig bereik." #: src/language/control/repeat.c:443 #, c-format msgid "No matching %s." msgstr "Geen overeenkomende %s." #: src/language/control/temporary.c:44 msgid "" "This command may only appear once between procedures and procedure-like " "commands." msgstr "" "Deze opdracht mag slechts éénmaal voorkomen tussen procedures en procedure-" "achtige opdrachten." #: src/language/dictionary/attributes.c:104 msgid "Attribute array index must be between 1 and 65535." msgstr "" "Index van de eigenschappentabel moet minimaal 1 en maximaal 65535 zijn." #: src/language/dictionary/apply-dictionary.c:74 #, c-format msgid "Variable %s is %s in target file, but %s in source file." msgstr "Variabele %s is %s in doelbestand, maar %s in bronbestand." #: src/language/dictionary/apply-dictionary.c:110 msgid "No matching variables found between the source and target files." msgstr "Geen overeenkomende variabelen gevonden tussen bron- en doelbestanden." #: src/language/dictionary/delete-variables.c:40 #: src/language/dictionary/modify-variables.c:79 #: src/language/dictionary/rename-variables.c:51 #, c-format msgid "" "%s may not be used after %s. Temporary transformations will be made " "permanent." msgstr "" "%s mag niet gebruikt worden na %s. Tijdelijke transformaties zullen blijvend " "worden." #: src/language/dictionary/delete-variables.c:48 #: src/language/dictionary/modify-variables.c:312 #, c-format msgid "" "%s may not be used to delete all variables from the active dataset " "dictionary. Use %s instead." msgstr "" "%s mag niet worden gebruikt om alle variabelen uit het actieve " "bestandswoordenboek te verwijderen. Gebruik in plaats hiervan %s." #: src/language/dictionary/missing-values.c:70 #, c-format msgid "" "Cannot mix numeric variables (e.g. %s) and string variables (e.g. %s) within " "a single list." msgstr "" "Kan numerieke variabelen (bijv. %s) en alfanumerieke variabelen (bijv. %s) " "niet beide in een enkele lijst opnemen." #: src/language/dictionary/missing-values.c:91 msgid "" "Too many numeric missing values. At most three individual values or one " "value and one range are allowed." msgstr "" "Teveel numerieke ontbrekende waarden. Ten hoogste drie individuele waarden " "of één waarde en één bereik zijn toegestaan." #: src/language/dictionary/missing-values.c:126 #, c-format msgid "Truncating missing value to maximum acceptable length (%d bytes)." msgstr "" "Ontbrekende waarde wordt afgekapt tot grootste acceptabele lengte (%d bytes)." #: src/language/dictionary/missing-values.c:137 msgid "" "Too many string missing values. At most three individual values are allowed." msgstr "" "Teveel alfanumerieke ontbrekende waarden. Ten hoogste drie individuele " "waarden zijn toegestaan." #: src/language/dictionary/missing-values.c:154 #, c-format msgid "Missing values provided are too long to assign to variable of width %d." msgstr "" "De opgegeven ontbrekende waarden zijn te lang om toe te kennen aan een " "variabele met breedte %d." #: src/language/dictionary/modify-variables.c:145 msgid "Cannot specify ALL after specifying a set of variables." msgstr "" "ALL kan niet worden opgegeven ná specificatie van een verzameling variabelen." #: src/language/dictionary/modify-variables.c:221 #: src/language/dictionary/rename-variables.c:76 #, c-format msgid "" "Differing number of variables in old name list (%zu) and in new name list " "(%zu)." msgstr "" "Verschillend aantal variabelen in oude namenlijst (%zu) en nieuwe namenlijst " "(%zu)." #: src/language/dictionary/modify-variables.c:244 #: src/language/dictionary/modify-variables.c:294 #, c-format msgid "" "%s subcommand may be given at most once. It may not be given in conjunction " "with the %s subcommand." msgstr "" "Subopdracht %s mag ten hoogste éénmaal gegeven worden. Deze mag niet worden " "gegeven samen met subopdracht %s." #: src/language/dictionary/modify-variables.c:331 #, c-format msgid "Unrecognized subcommand name `%s'." msgstr "Niet-herkende subopdrachtnaam `%s'." #: src/language/dictionary/modify-variables.c:334 msgid "Subcommand name expected." msgstr "Subopdrachtnaam verwacht." #: src/language/dictionary/mrsets.c:117 #, c-format msgid "" "VARIABLES specified only variable %s on %s, but at least two variables are " "required." msgstr "" "VARIABLES specificeert alleen variabele %s op %s, maar tenminste twee " "variabelen zijn vereist." #: src/language/dictionary/mrsets.c:150 msgid "Numeric VALUE must be an integer." msgstr "Numerieke VALUE moet een geheel getal zijn ." #: src/language/dictionary/mrsets.c:230 src/language/dictionary/mrsets.c:268 #, c-format msgid "" "MDGROUP subcommand for group %s specifies a string VALUE, but the variables " "specified for this group are numeric." msgstr "" "Subopdracht MDGROUP voor groep %s specificeert een alfanumerieke VALUE, maar " "de voor deze groep opgegeven variabelen zijn numeriek." #: src/language/dictionary/mrsets.c:254 #, c-format msgid "" "VALUE string on MDGROUP subcommand for group %s is %d bytes long, but it " "must be no longer than the narrowest variable in the group, which is %s with " "a width of %d bytes." msgstr "" "VALUE-tekenreeks op subopdracht MDGROUP voor groep %s is %d bytes lang, maar " "mag niet langer zijn dan de smalste variabele in de groep: %s met een " "breedte van %d bytes." #: src/language/dictionary/mrsets.c:280 #, c-format msgid "" "MDGROUP subcommand for group %s specifies LABELSOURCE=VARLABEL but not " "CATEGORYLABELS=COUNTEDVALUES. Ignoring LABELSOURCE." msgstr "" "Subopdracht MDGROUP voor groep %s specificeert LABELSOURCE=VARLABEL maar " "niet CATEGORYLABELS=COUNTEDVALUES. LABELSOURCE wordt genegeerd." #: src/language/dictionary/mrsets.c:286 #, c-format msgid "" "MDGROUP subcommand for group %s specifies both LABEL and LABELSOURCE, but " "only one of these subcommands may be used at a time. Ignoring LABELSOURCE." msgstr "" "Subopdracht MDGROUP voor groep %s specificeert zowel LABEL als LABELSOURCE, " "maar slechts één van deze subopdrachten mag per keer worden gebruikt. " "LABELSOURCE wordt genegeerd." #: src/language/dictionary/mrsets.c:326 #, c-format msgid "" "Variables %s and %s specified as part of multiple dichotomy group %s have " "the same variable label. Categories represented by these variables will not " "be distinguishable in output." msgstr "" "De variabelen %s en %s, opgegeven als onderdeel van de \"multiple dichotomy " "group\" %s, hebben hetzelfde variabelelabel. Categorieën die door deze " "variabelen worden gerepresenteerd, zullen in de uitvoer niet te " "onderscheiden zijn." #: src/language/dictionary/mrsets.c:356 #, c-format msgid "" "Variable %s specified as part of multiple dichotomy group %s (which has " "CATEGORYLABELS=COUNTEDVALUES) has no value label for its counted value. " "This category will not be distinguishable in output." msgstr "" "Variabele %s, opgegeven als onderdeel van de \"multiple dichotomy group\" %s " "(met CATEGORYLABELS=COUNTEDVALUES), heeft geen waardelabel voor de getelde " "waarde. Deze categorie zal in de uitvoer niet te onderscheiden zijn." #: src/language/dictionary/mrsets.c:369 #, c-format msgid "" "Variables %s and %s specified as part of multiple dichotomy group %s (which " "has CATEGORYLABELS=COUNTEDVALUES) have the same value label for the group's " "counted value. These categories will not be distinguishable in output." msgstr "" "De variabelen %s en %s, opgegeven als onderdeel van de \"multiple dichotomy " "group\" %s (met CATEGORYLABELS=COUNTEDVALUES), hebben hetzelfde waardelabel " "voor de getelde waarde van de groep. Deze categorieën zullen in de uitvoer " "niet te onderscheiden zijn." #: src/language/dictionary/mrsets.c:426 #, c-format msgid "" "Variables specified on MCGROUP should have the same categories, but %s and " "%s (and possibly others) in multiple category group %s have different value " "labels for value %s." msgstr "" "Variabelen die worden opgegeven voor MCGROUP moeten dezelfde categorieën " "hebben, maar %s en %s (en mogelijkerwijs andere) in groep %s met meerdere " "categorieën, hebben verschillende waardelabels voor waarde %s." #: src/language/dictionary/mrsets.c:484 #, c-format msgid "No multiple response set named %s." msgstr "Er bestaat geen \"multiple response set\" genaamd %s." #: src/language/dictionary/mrsets.c:533 msgid "" "The active dataset dictionary does not contain any multiple response sets." msgstr "" "Het woordenboek van de actieve dataset bevat geen \"multiple response sets\"." #: src/language/dictionary/mrsets.c:540 msgid "Multiple Response Sets" msgstr "\"Multiple response sets\"" #: src/language/dictionary/mrsets.c:543 #: src/language/dictionary/sys-file-info.c:446 #: src/language/dictionary/sys-file-info.c:733 #: src/language/stats/autorecode.c:375 src/language/data-io/data-parser.c:679 #: src/language/data-io/data-parser.c:725 src/language/data-io/print.c:434 msgid "Attributes" msgstr "Eigenschappen" #: src/language/dictionary/mrsets.c:544 #: src/language/dictionary/sys-file-info.c:191 #: src/language/dictionary/sys-file-info.c:301 #: src/language/dictionary/sys-file-info.c:302 #: src/language/dictionary/sys-file-info.c:455 #: src/language/dictionary/sys-file-info.c:570 #: src/ui/gui/psppire-var-sheet-header.c:67 src/ui/gui/compute.ui:157 msgid "Label" msgstr "Label" #: src/language/dictionary/mrsets.c:544 #: src/language/dictionary/sys-file-info.c:241 msgid "Encoding" msgstr "Codering" #: src/language/dictionary/mrsets.c:544 msgid "Counted Value" msgstr "Getelde waarde" #: src/language/dictionary/mrsets.c:544 msgid "Member Variables" msgstr "Bijbehorende variabelen" #: src/language/dictionary/mrsets.c:547 #: src/language/dictionary/sys-file-info.c:470 #: src/ui/gui/psppire-var-sheet-header.c:55 msgid "Name" msgstr "Naam" #: src/language/dictionary/mrsets.c:564 msgid "Dichotomies" msgstr "Dichotomieën" #: src/language/dictionary/mrsets.c:565 src/language/stats/logistic.c:1391 msgid "Categories" msgstr "Categorieën" #: src/language/dictionary/numeric.c:67 #, c-format msgid "Format type %s may not be used with a numeric variable." msgstr "Opmaaktype %s mag niet gebruikt worden met een numerieke variabele." #: src/language/dictionary/numeric.c:86 src/language/dictionary/numeric.c:153 #, c-format msgid "There is already a variable named %s." msgstr "Er bestaat reeds een variabele genaamd %s." #: src/language/dictionary/numeric.c:138 #, c-format msgid "Format type %s may not be used with a string variable." msgstr "" "Opmaaktype %s mag niet gebruikt worden met een alfanumerieke variabele." #: src/language/dictionary/rename-variables.c:92 #, c-format msgid "Renaming would duplicate variable name %s." msgstr "Hernoemen zou variabelenaam %s dupliceren." #: src/language/dictionary/split-file.c:75 msgid "Split Values" msgstr "Splits waarden" #: src/language/dictionary/split-file.c:76 #: src/language/dictionary/split-file.c:77 #: src/language/dictionary/sys-file-info.c:696 #: src/language/stats/chisquare.c:195 src/language/stats/cochran.c:156 #: src/language/stats/cochran.c:185 src/language/stats/examine.c:841 #: src/language/stats/reliability.c:648 src/language/stats/reliability.c:651 #: src/language/stats/crosstabs.q:1303 src/language/stats/crosstabs.q:1325 #: src/language/stats/crosstabs.q:1365 src/language/stats/crosstabs.q:1412 msgid "Value" msgstr "Waarde" #: src/language/dictionary/split-file.c:79 #: src/language/dictionary/sys-file-info.c:734 #: src/language/stats/chisquare.c:246 src/language/stats/chisquare.c:328 #: src/language/stats/cochran.c:164 src/language/stats/correlations.c:100 #: src/language/stats/descriptives.c:1004 src/language/stats/friedman.c:226 #: src/language/stats/jonckheere-terpstra.c:377 #: src/language/stats/npar-summary.c:113 src/language/stats/quick-cluster.c:588 #: src/language/stats/runs.c:331 src/language/data-io/data-parser.c:683 #: src/language/data-io/data-parser.c:728 src/language/data-io/print.c:438 #: src/ui/gui/psppire-dictview.c:580 src/ui/gui/psppire-data-editor.c:502 msgid "Variable" msgstr "Variabele" #: src/language/dictionary/sys-file-info.c:184 msgid "File Information" msgstr "Bestandsinformatie" #: src/language/dictionary/sys-file-info.c:185 msgid "Attribute" msgstr "Eigenschap" #: src/language/dictionary/sys-file-info.c:187 msgid "File" msgstr "Bestand" #: src/language/dictionary/sys-file-info.c:194 msgid "Created" msgstr "Aangemaakt" #: src/language/dictionary/sys-file-info.c:203 msgid "Integer Format" msgstr "Opmaak geheel getal" #: src/language/dictionary/sys-file-info.c:205 msgid "Big Endian" msgstr "\"Big Endian\"" #: src/language/dictionary/sys-file-info.c:206 msgid "Little Endian" msgstr "\"Little Endian\"" #: src/language/dictionary/sys-file-info.c:207 #: src/language/dictionary/sys-file-info.c:216 #: src/language/dictionary/sys-file-info.c:223 src/language/utilities/set.q:930 msgid "Unknown" msgstr "Onbekend" #: src/language/dictionary/sys-file-info.c:209 msgid "Real Format" msgstr "Opmaak kommagetal" #: src/language/dictionary/sys-file-info.c:211 msgid "IEEE 754 LE." msgstr "IEEE 754 LE." #: src/language/dictionary/sys-file-info.c:212 msgid "IEEE 754 BE." msgstr "IEEE 754 BE." #: src/language/dictionary/sys-file-info.c:213 msgid "VAX D." msgstr "VAX D." #: src/language/dictionary/sys-file-info.c:214 msgid "VAX G." msgstr "VAX G." #: src/language/dictionary/sys-file-info.c:215 msgid "IBM 390 Hex Long." msgstr "IBM 390 Hex Long." #: src/language/dictionary/sys-file-info.c:218 #: src/language/dictionary/sys-file-info.c:443 #: src/language/stats/binomial.c:199 src/language/stats/correlations.c:131 #: src/language/stats/correlations.c:159 src/language/stats/descriptives.c:585 #: src/language/stats/factor.c:1658 src/language/stats/factor.c:1701 #: src/language/stats/factor.c:1860 src/language/stats/factor.c:2074 #: src/language/stats/frequencies.c:1583 #: src/language/stats/kruskal-wallis.c:254 #: src/language/stats/kruskal-wallis.c:303 #: src/language/stats/ks-one-sample.c:316 src/language/stats/logistic.c:1187 #: src/language/stats/mann-whitney.c:254 src/language/stats/means.c:718 #: src/language/stats/means.c:800 src/language/stats/median.c:358 #: src/language/stats/oneway.c:985 src/language/stats/oneway.c:1157 #: src/language/stats/reliability.c:591 src/language/stats/regression.c:924 #: src/language/stats/t-test-one-sample.c:132 #: src/language/stats/t-test-paired.c:157 src/language/data-io/list.c:104 #: src/ui/gui/variable-info.ui:25 msgid "Variables" msgstr "Variabelen" #: src/language/dictionary/sys-file-info.c:221 src/language/stats/examine.c:929 #: src/language/stats/means.c:697 src/language/stats/reliability.c:548 #: src/language/stats/crosstabs.q:930 msgid "Cases" msgstr "Observaties" #: src/language/dictionary/sys-file-info.c:226 src/language/stats/oneway.c:980 #: src/ui/gui/psppire-var-sheet-header.c:58 src/ui/gui/compute.ui:303 msgid "Type" msgstr "Type" #: src/language/dictionary/sys-file-info.c:230 msgid "Weight" msgstr "Gewicht" #: src/language/dictionary/sys-file-info.c:233 msgid "Not weighted" msgstr "Niet gewogen" #: src/language/dictionary/sys-file-info.c:235 msgid "Compression" msgstr "Compressie" #: src/language/dictionary/sys-file-info.c:245 #: src/language/dictionary/sys-file-info.c:424 #: src/language/dictionary/sys-file-info.c:426 msgid "Documents" msgstr "Documenten" #: src/language/dictionary/sys-file-info.c:305 #: src/language/dictionary/sys-file-info.c:430 msgid "(none)" msgstr "(geen)" #: src/language/dictionary/sys-file-info.c:393 msgid "No variables to display." msgstr "Geen variabelen om weer te geven." #: src/language/dictionary/sys-file-info.c:404 msgid "Macros not supported." msgstr "Macro's worden niet ondersteund." #: src/language/dictionary/sys-file-info.c:426 msgid "Document" msgstr "Document" #: src/language/dictionary/sys-file-info.c:454 msgid "Position" msgstr "Positie" #: src/language/dictionary/sys-file-info.c:456 msgid "Measurement Level" msgstr "Meetniveau" #: src/language/dictionary/sys-file-info.c:457 #: src/ui/gui/psppire-var-sheet-header.c:85 msgid "Role" msgstr "Rol" #: src/language/dictionary/sys-file-info.c:458 #: src/ui/gui/psppire-var-sheet-header.c:61 src/ui/gui/compute.ui:215 msgid "Width" msgstr "Breedte" #: src/language/dictionary/sys-file-info.c:459 msgid "Alignment" msgstr "Uitlijning" #: src/language/dictionary/sys-file-info.c:460 #: src/language/dictionary/sys-file-info.c:734 msgid "Print Format" msgstr "Afdrukopmaak" #: src/language/dictionary/sys-file-info.c:461 msgid "Write Format" msgstr "Schrijfopmaak" #: src/language/dictionary/sys-file-info.c:462 #: src/ui/gui/missing-val-dialog.c:379 src/ui/gui/psppire-var-sheet-header.c:73 #: src/ui/gui/examine.ui:416 src/ui/gui/t-test.ui:105 msgid "Missing Values" msgstr "Ontbrekende waarden" #: src/language/dictionary/sys-file-info.c:567 #: src/ui/gui/psppire-var-sheet-header.c:70 src/ui/gui/val-labs-dialog.c:489 #: src/ui/gui/val-labs-dialog.ui:194 msgid "Value Labels" msgstr "Waardelabels" #: src/language/dictionary/sys-file-info.c:573 msgid "Variable Value" msgstr "Variabelewaarde" #: src/language/dictionary/sys-file-info.c:577 msgid "User-missing value" msgstr "Door gebruiker gedefinieerde ontbrekende waarde" #: src/language/dictionary/sys-file-info.c:693 msgid "Variable and Dataset Attributes" msgstr "Eigenschappen variabele en dataset" #: src/language/dictionary/sys-file-info.c:699 msgid "Variable and Name" msgstr "Variabele en naam" #: src/language/dictionary/sys-file-info.c:702 msgid "(dataset)" msgstr "(dataset)" #: src/language/dictionary/sys-file-info.c:722 msgid "No vectors defined." msgstr "Geen vectoren gedefinieerd." #: src/language/dictionary/sys-file-info.c:732 msgid "Vectors" msgstr "Vectoren" #: src/language/dictionary/sys-file-info.c:736 msgid "Vector and Position" msgstr "Vector en positie" #: src/language/dictionary/sys-file-info.c:998 msgid "No valid encodings found." msgstr "Geen geldige coderingen gevonden." #: src/language/dictionary/sys-file-info.c:1004 #, c-format msgid "Usable encodings for %s." msgstr "Bruikbare coderingen voor %s." #: src/language/dictionary/sys-file-info.c:1007 #, c-format msgid "" "Encodings that can successfully read %s (by specifying the encoding name on " "the GET command's ENCODING subcommand). Encodings that yield identical text " "are listed together." msgstr "" "Coderingen die %s succesvol kunnen lezen (door de codering op te geven op " "subopdracht ENCODING van de GET-opdracht). Coderingen die identieke tekst " "opleveren, zijn bij elkaar gezet." #: src/language/dictionary/sys-file-info.c:1012 #: src/language/dictionary/sys-file-info.c:1013 msgid "Encodings" msgstr "Coderingen" #: src/language/dictionary/sys-file-info.c:1042 #, c-format msgid "%s Encoded Text Strings" msgstr "%s-gecodeerde tekenreeksen" #: src/language/dictionary/sys-file-info.c:1046 msgid "" "Text strings in the file dictionary that the previously listed encodings " "interpret differently, along with the interpretations." msgstr "" "Tekenreeksen in het bestandswoordenboek die de hiervoor getoonde coderingen " "verschillend interpreteren, samen met die interpretaties." #: src/language/dictionary/sys-file-info.c:1049 src/output/text-item.c:57 #: src/ui/gui/psppire-import-assistant.c:885 msgid "Text" msgstr "Tekst" #: src/language/dictionary/sys-file-info.c:1059 msgid "Purpose" msgstr "Doel" #: src/language/dictionary/value-labels.c:154 #, c-format msgid "Truncating value label to %d bytes." msgstr "Waardelabel wordt afgekapt tot %d bytes." #: src/language/dictionary/vector.c:66 #, c-format msgid "A vector named %s already exists." msgstr "Een vector genaamd %s bestaat al." #: src/language/dictionary/vector.c:74 #, c-format msgid "Vector name %s is given twice." msgstr "Vectornaam %s is tweemaal gegeven." #: src/language/dictionary/vector.c:98 msgid "A slash must separate each vector specification in VECTOR's long form." msgstr "" "In de lange vorm van VECTOR moet een schuine streep de vectorspecificaties " "van elkaar scheiden." #: src/language/dictionary/vector.c:131 msgid "Vectors must have at least one element." msgstr "Vectoren moeten tenminste één element bevatten." #: src/language/dictionary/vector.c:151 msgid "expecting vector length" msgstr "vectorlengte verwacht" #: src/language/dictionary/vector.c:170 #, c-format msgid "%s is an existing variable name." msgstr "%s is een bestaande variabelenaam." #: src/language/dictionary/variable-display.c:121 msgid "Variable display width must be a positive integer." msgstr "" "Weergavebreedte voor een variabele moet een positief geheel getal zijn." #: src/language/dictionary/weight.c:49 msgid "The weighting variable must be numeric." msgstr "De wegingsvariabele moet numeriek zijn." #: src/language/dictionary/weight.c:54 msgid "The weighting variable may not be scratch." msgstr "De wegingsvariabele mag geen kladvariabele zijn." #: src/language/tests/moments-test.c:50 msgid "expecting weight value" msgstr "waarde voor weging verwacht" #: src/language/utilities/cd.c:45 src/language/utilities/include.c:173 #, fuzzy, c-format #| msgid "Cannot change directory to %s: %s " msgid "Cannot change directory to %s: %s" msgstr "Kan map niet veranderen in %s: %s " #: src/language/utilities/date.c:33 #, c-format msgid "Only %s is currently implemented." msgstr "Alleen %s is momenteel geïmplementeerd." #: src/language/utilities/host.c:60 #, fuzzy #| msgid "Command shell not supported on this platform." msgid "Time limit not supported on this platform." msgstr "Opdracht-\"shell\" wordt op dit platform niet ondersteund." #: src/language/utilities/host.c:74 #, c-format msgid "%s: Command exited with status %d." msgstr "" #: src/language/utilities/host.c:95 #, fuzzy, c-format #| msgid "failed to create temporary file" msgid "Failed to create temporary file (%s)." msgstr "aanmaken van tijdelijk bestand is mislukt" #: src/language/utilities/host.c:102 #, c-format msgid "/dev/null: Failed to open (%s)." msgstr "" #: src/language/utilities/host.c:117 #, c-format msgid "Couldn't fork: %s." msgstr "\"Fork\" niet mogelijk: %s." #: src/language/utilities/host.c:193 #, c-format msgid "While running \"%s\", waiting for child process failed (%s)." msgstr "" #: src/language/utilities/host.c:203 #, c-format msgid "Command \"%s\" timed out." msgstr "" #: src/language/utilities/host.c:205 #, c-format msgid "Command \"%s\" terminated by signal %d." msgstr "" #: src/language/utilities/host.c:212 msgid "Command or shell not found" msgstr "" #: src/language/utilities/host.c:214 msgid "Could not invoke command or shell" msgstr "" #: src/language/utilities/host.c:217 #, c-format msgid "Command \"%s\" exited with status %d (%s)." msgstr "" #: src/language/utilities/host.c:220 #, c-format msgid "Command \"%s\" exited with status %d." msgstr "" #: src/language/utilities/host.c:230 #, c-format msgid "Command \"%s\" output could not be read (%s)." msgstr "" #: src/language/utilities/title.c:88 #, c-format msgid " (Entered %s)" msgstr " (Ingevoerd %s)" #: src/language/utilities/include.c:73 #, c-format msgid "Can't find `%s' in include file search path." msgstr "Kan `%s' niet vinden in zoekpad voor \"include\"-bestand." #: src/language/utilities/output.c:128 #, c-format msgid "Unknown cell class %s." msgstr "Onbekende celklasse %s." #: src/language/utilities/permissions.c:113 #, c-format msgid "Cannot stat %s: %s" msgstr "\"Stat\" %s niet mogelijk: %s" #: src/language/utilities/permissions.c:127 #, c-format msgid "Cannot change mode of %s: %s" msgstr "Kan modus van %s niet veranderen: %s" #: src/language/stats/aggregate.c:96 msgid "Sum of values" msgstr "Som van waarden" #: src/language/stats/aggregate.c:97 msgid "Mean average" msgstr "Rekenkundig gemiddelde" #: src/language/stats/aggregate.c:98 msgid "Median average" msgstr "Mediaan" #: src/language/stats/aggregate.c:99 #: src/ui/gui/psppire-dialog-action-descriptives.c:40 #: src/ui/gui/psppire-dialog-action-frequencies.c:41 msgid "Standard deviation" msgstr "Standaarddeviatie" #: src/language/stats/aggregate.c:100 #: src/ui/gui/psppire-dialog-action-descriptives.c:42 msgid "Maximum value" msgstr "Maximumwaarde" #: src/language/stats/aggregate.c:101 #: src/ui/gui/psppire-dialog-action-descriptives.c:41 msgid "Minimum value" msgstr "Minimumwaarde" #: src/language/stats/aggregate.c:102 msgid "Percentage greater than" msgstr "Percentage groter dan" #: src/language/stats/aggregate.c:103 msgid "Percentage less than" msgstr "Percentage kleiner dan" #: src/language/stats/aggregate.c:104 msgid "Percentage included in range" msgstr "Percentage opgenomen in bereik" #: src/language/stats/aggregate.c:105 msgid "Percentage excluded from range" msgstr "Percentage uitgesloten van bereik" #: src/language/stats/aggregate.c:106 msgid "Fraction greater than" msgstr "Fractie groter dan" #: src/language/stats/aggregate.c:107 msgid "Fraction less than" msgstr "Fractie kleiner dan" #: src/language/stats/aggregate.c:108 msgid "Fraction included in range" msgstr "Fractie opgenomen in bereik" #: src/language/stats/aggregate.c:109 msgid "Fraction excluded from range" msgstr "Fractie uitgesloten van bereik" #: src/language/stats/aggregate.c:110 msgid "Number of cases" msgstr "Aantal observaties" #: src/language/stats/aggregate.c:111 msgid "Number of cases (unweighted)" msgstr "Aantal observaties (ongewogen)" #: src/language/stats/aggregate.c:112 msgid "Number of missing values" msgstr "Aantal ontbrekende waarden" #: src/language/stats/aggregate.c:113 msgid "Number of missing values (unweighted)" msgstr "Aantal ontbrekende waarden (ongewogen)" #: src/language/stats/aggregate.c:114 msgid "First non-missing value" msgstr "Eerste niet-ontbrekende waarde" #: src/language/stats/aggregate.c:115 msgid "Last non-missing value" msgstr "Laatste niet-ontbrekende waarde" #: src/language/stats/aggregate.c:258 msgid "" "When PRESORTED is specified, specifying sorting directions with (A) or (D) " "has no effect. Output data will be sorted the same way as the input data." msgstr "" "Als PRESORTED is opgegeven, heeft specificeren van sorteervolgorde met (A) " "of (D) geen effect. Uitvoergegevens zullen op dezelfde manier worden " "gesorteerd als de invoergegevens." #: src/language/stats/aggregate.c:448 msgid "expecting aggregation function" msgstr "aggregatiefunctie verwacht" #: src/language/stats/aggregate.c:460 #, c-format msgid "Unknown aggregation function %s." msgstr "Onbekende aggregatiefunctie %s." #: src/language/stats/aggregate.c:513 #, c-format msgid "Missing argument %zu to %s." msgstr "Argument %zu naar %s ontbreekt." #: src/language/stats/aggregate.c:522 #, c-format msgid "Arguments to %s must be of same type as source variables." msgstr "Argumenten voor %s moeten van hetzelfde type zijn als bronvariabelen." #: src/language/stats/aggregate.c:541 #, c-format msgid "" "Number of source variables (%zu) does not match number of target variables " "(%zu)." msgstr "" "Aantal bronvariabelen (%zu) komt niet overeen met aantal doelvariabelen " "(%zu)." #: src/language/stats/aggregate.c:557 #, c-format msgid "" "The value arguments passed to the %s function are out-of-order. They will " "be treated as if they had been specified in the correct order." msgstr "" "De volgorde van de waarde-argumenten, doorgegeven aan de %s-functie, klopt " "niet. Ze worden behandeld alsof ze in de correcte volgorde waren opgegeven." #: src/language/stats/aggregate.c:631 #, c-format msgid "" "Variable name %s is not unique within the aggregate file dictionary, which " "contains the aggregate variables and the break variables." msgstr "" "Variabelenaam %s is niet uniek binnen het woordenboek van het " "aggregatiebestand, dat de aggregatie- en \"break\"-variabelen bevat." #: src/language/stats/autorecode.c:152 #, c-format msgid "Source variable count (%zu) does not match target variable count (%zu)." msgstr "" "Telling van bronvariabelen (%zu) komt niet overeen met telling van " "doelvariabelen (%zu)." #: src/language/stats/autorecode.c:164 #, c-format msgid "Target variable %s duplicates existing variable %s." msgstr "Doelvariabele %s dupliceert bestaande variabele %s." #: src/language/stats/autorecode.c:221 #, c-format msgid "" "With GROUP, variables may not mix string variables (such as %s) and numeric " "variables (such as %s)." msgstr "" "Binnen GROUP mogen alfanumerieke (zoals %s) en numerieke variabelen (zoals " "%s) niet worden gemengd." #: src/language/stats/autorecode.c:363 msgid "Recoding grouped variables." msgstr "Gegroepeerde variabelen worden gehercodeerd." #: src/language/stats/autorecode.c:365 #, c-format msgid "Recoding %s into %s (%s)." msgstr "%s wordt gehercodeerd in %s (%s)." #: src/language/stats/autorecode.c:369 #, c-format msgid "Recoding %s into %s." msgstr "%s wordt gehercodeerd in %s." #: src/language/stats/autorecode.c:376 src/ui/gui/recode.ui:209 msgid "New Value" msgstr "Nieuwe waarde" #: src/language/stats/autorecode.c:376 msgid "Value Label" msgstr "Waardelabel" #: src/language/stats/autorecode.c:379 msgid "Old Value" msgstr "Oude waarde" #: src/language/stats/binomial.c:138 #, c-format msgid "Variable %s is not dichotomous" msgstr "Variabele %s is niet dichotoom" #: src/language/stats/binomial.c:182 src/ui/gui/binomial.ui:30 msgid "Binomial Test" msgstr "Binomiaaltoets" #: src/language/stats/binomial.c:186 src/language/stats/chisquare.c:183 #: src/language/stats/chisquare.c:239 src/language/stats/chisquare.c:322 #: src/language/stats/cochran.c:188 src/language/stats/correlations.c:94 #: src/language/stats/correlations.c:145 src/language/stats/descriptives.c:991 #: src/language/stats/examine.c:602 src/language/stats/examine.c:742 #: src/language/stats/examine.c:836 src/language/stats/examine.c:925 #: src/language/stats/factor.c:1755 src/language/stats/factor.c:1878 #: src/language/stats/factor.c:1908 src/language/stats/factor.c:2068 #: src/language/stats/factor.c:2102 src/language/stats/frequencies.c:302 #: src/language/stats/frequencies.c:1579 src/language/stats/frequencies.c:1586 #: src/language/stats/friedman.c:250 src/language/stats/glm.c:729 #: src/language/stats/kruskal-wallis.c:249 #: src/language/stats/kruskal-wallis.c:297 #: src/language/stats/ks-one-sample.c:278 src/language/stats/logistic.c:1170 #: src/language/stats/logistic.c:1300 src/language/stats/logistic.c:1330 #: src/language/stats/jonckheere-terpstra.c:361 #: src/language/stats/mann-whitney.c:184 src/language/stats/mann-whitney.c:247 #: src/language/stats/means.c:757 src/language/stats/means.c:811 #: src/language/stats/mcnemar.c:222 src/language/stats/median.c:315 #: src/language/stats/median.c:350 src/language/stats/npar-summary.c:106 #: src/language/stats/oneway.c:973 src/language/stats/oneway.c:1051 #: src/language/stats/oneway.c:1150 src/language/stats/oneway.c:1238 #: src/language/stats/oneway.c:1373 src/language/stats/quick-cluster.c:746 #: src/language/stats/reliability.c:543 src/language/stats/reliability.c:584 #: src/language/stats/reliability.c:633 src/language/stats/reliability.c:644 #: src/language/stats/roc.c:969 src/language/stats/roc.c:1067 #: src/language/stats/regression.c:867 src/language/stats/regression.c:899 #: src/language/stats/regression.c:1023 src/language/stats/regression.c:1089 #: src/language/stats/runs.c:318 src/language/stats/sign.c:102 #: src/language/stats/t-test-indep.c:193 src/language/stats/t-test-indep.c:259 #: src/language/stats/t-test-one-sample.c:68 #: src/language/stats/t-test-one-sample.c:125 #: src/language/stats/t-test-paired.c:150 #: src/language/stats/t-test-paired.c:193 #: src/language/stats/t-test-paired.c:238 src/language/stats/wilcoxon.c:243 #: src/language/stats/wilcoxon.c:282 src/language/stats/crosstabs.q:925 #: src/language/stats/crosstabs.q:1253 src/language/stats/crosstabs.q:1293 #: src/language/stats/crosstabs.q:1302 src/language/stats/crosstabs.q:1331 #: src/language/stats/crosstabs.q:1373 src/language/stats/crosstabs.q:1418 #: src/ui/gui/crosstabs.ui:499 src/ui/gui/oneway.ui:615 msgid "Statistics" msgstr "Statistische maten" #: src/language/stats/binomial.c:187 src/language/stats/chisquare.c:240 #: src/language/stats/chisquare.c:252 msgid "Category" msgstr "Categorie" #: src/language/stats/binomial.c:188 src/language/stats/cochran.c:189 #: src/language/stats/correlations.c:97 src/language/stats/correlations.c:155 #: src/language/stats/descriptives.c:993 src/language/stats/examine.c:926 #: src/language/stats/frequencies.c:1588 src/language/stats/friedman.c:251 #: src/language/stats/kruskal-wallis.c:250 #: src/language/stats/ks-one-sample.c:279 src/language/stats/logistic.c:1331 #: src/language/stats/jonckheere-terpstra.c:369 #: src/language/stats/mann-whitney.c:185 src/language/stats/means.c:710 #: src/language/stats/means-calc.c:439 src/language/stats/mcnemar.c:223 #: src/language/stats/median.c:351 src/language/stats/npar-summary.c:107 #: src/language/stats/oneway.c:1052 src/language/stats/reliability.c:544 #: src/language/stats/sign.c:69 src/language/stats/sign.c:70 #: src/language/stats/t-test-indep.c:194 #: src/language/stats/t-test-one-sample.c:126 #: src/language/stats/t-test-paired.c:151 #: src/language/stats/t-test-paired.c:194 src/language/stats/wilcoxon.c:244 #: src/language/stats/crosstabs.q:926 msgid "N" msgstr "N" #: src/language/stats/binomial.c:189 msgid "Observed Prop." msgstr "Geobs. prop." #: src/language/stats/binomial.c:190 msgid "Test Prop." msgstr "Toetsprop." #: src/language/stats/binomial.c:192 src/language/stats/mcnemar.c:224 #: src/language/stats/sign.c:103 src/language/stats/wilcoxon.c:288 #: src/language/stats/crosstabs.q:1306 msgid "Exact Sig. (2-tailed)" msgstr "Exacte sign. (tweezijdig)" #: src/language/stats/binomial.c:193 src/language/stats/mcnemar.c:225 #: src/language/stats/sign.c:104 src/language/stats/wilcoxon.c:289 #: src/language/stats/crosstabs.q:1307 msgid "Exact Sig. (1-tailed)" msgstr "Exact Sig. (1-tailed)" #: src/language/stats/binomial.c:195 msgid "Groups" msgstr "Groepen" #: src/language/stats/binomial.c:196 msgid "Group 1" msgstr "Groep 1" #: src/language/stats/binomial.c:196 msgid "Group 2" msgstr "Groep 2" #: src/language/stats/binomial.c:196 src/language/stats/chisquare.c:223 #: src/language/stats/chisquare.c:257 src/language/stats/examine.c:930 #: src/language/stats/factor.c:1756 src/language/stats/frequencies.c:344 #: src/language/stats/glm.c:811 src/language/stats/kruskal-wallis.c:285 #: src/language/stats/logistic.c:1336 src/language/stats/mann-whitney.c:197 #: src/language/stats/means.c:706 src/language/stats/oneway.c:982 #: src/language/stats/oneway.c:1072 src/language/stats/reliability.c:549 #: src/language/stats/regression.c:1031 src/language/stats/sign.c:75 #: src/language/stats/wilcoxon.c:250 #: src/ui/gui/psppire-dialog-action-crosstabs.c:93 #: src/language/stats/crosstabs.q:931 src/language/stats/crosstabs.q:1218 msgid "Total" msgstr "Totaal" #: src/language/stats/chisquare.c:171 #, c-format msgid "" "CHISQUARE test specified %d expected values, but variable %s has %zu " "distinct values." msgstr "" "CHISQUARE-opdracht specificeerde %d verwachte waarden, maar variabele %s " "heeft %zu afzonderlijke waarden." #: src/language/stats/chisquare.c:184 src/language/stats/chisquare.c:241 msgid "Observed N" msgstr "Waargenomen N" #: src/language/stats/chisquare.c:185 src/language/stats/chisquare.c:242 msgid "Expected N" msgstr "Verwachte N" #: src/language/stats/chisquare.c:186 src/language/stats/chisquare.c:243 #: src/language/stats/regression.c:1031 #: src/ui/gui/psppire-dialog-action-crosstabs.c:95 #: src/language/stats/crosstabs.q:1267 msgid "Residual" msgstr "Residu" #: src/language/stats/chisquare.c:235 src/language/stats/cochran.c:150 #: src/language/stats/median.c:305 src/language/stats/sign.c:66 #: src/ui/gui/frequencies.ui:676 msgid "Frequencies" msgstr "Frequenties" #: src/language/stats/chisquare.c:320 src/language/stats/cochran.c:181 #: src/language/stats/friedman.c:246 src/language/stats/kruskal-wallis.c:295 #: src/language/stats/mann-whitney.c:244 src/language/stats/mcnemar.c:219 #: src/language/stats/median.c:347 src/language/stats/sign.c:100 #: src/language/stats/wilcoxon.c:279 msgid "Test Statistics" msgstr "Statistische maten voor toets" #: src/language/stats/chisquare.c:323 msgid "Chi-square" msgstr "Chi-kwadraat" #: src/language/stats/chisquare.c:324 src/language/stats/cochran.c:191 #: src/language/stats/examine.c:675 src/language/stats/factor.c:2107 #: src/language/stats/friedman.c:257 src/language/stats/glm.c:733 #: src/language/stats/kruskal-wallis.c:299 src/language/stats/logistic.c:1174 #: src/language/stats/median.c:354 src/language/stats/oneway.c:975 #: src/language/stats/oneway.c:1242 src/language/stats/regression.c:1025 #: src/language/stats/t-test-indep.c:267 #: src/language/stats/t-test-one-sample.c:75 #: src/language/stats/t-test-paired.c:253 src/language/stats/crosstabs.q:1304 msgid "df" msgstr "vr.gr." #: src/language/stats/chisquare.c:325 src/language/stats/cochran.c:192 #: src/language/stats/friedman.c:258 src/language/stats/kruskal-wallis.c:300 #: src/language/stats/median.c:355 msgid "Asymp. Sig." msgstr "Asymp. sign." #: src/language/stats/cochran.c:111 msgid "More than two values encountered. Cochran Q test will not be run." msgstr "" "Meer dan twee waarden gevonden. Cochran Q-toets wordt niet uitgevoerd." #: src/language/stats/cochran.c:153 #, c-format msgid "Success (%.*g)" msgstr "Succes (%.*g)" #: src/language/stats/cochran.c:154 #, c-format msgid "Failure (%.*g)" msgstr "Mislukt (%.*g)" #: src/language/stats/cochran.c:190 msgid "Cochran's Q" msgstr "Cochrans Q" #: src/language/stats/correlations.c:91 src/language/stats/descriptives.c:987 #: src/language/stats/factor.c:2065 src/language/stats/npar-summary.c:102 msgid "Descriptive Statistics" msgstr "Beschrijvende statistische maten" #: src/language/stats/correlations.c:95 src/language/stats/descriptives.c:108 #: src/language/stats/examine.c:742 src/language/stats/factor.c:2069 #: src/language/stats/frequencies.c:141 src/language/stats/graph.c:211 #: src/language/stats/ks-one-sample.c:290 src/language/stats/means-calc.c:438 #: src/language/stats/npar-summary.c:108 src/language/stats/oneway.c:1052 #: src/language/stats/t-test-indep.c:195 #: src/language/stats/t-test-one-sample.c:127 #: src/language/stats/t-test-paired.c:152 #: src/language/stats/t-test-paired.c:241 #: src/ui/gui/psppire-dialog-action-descriptives.c:39 #: src/ui/gui/psppire-dialog-action-frequencies.c:40 msgid "Mean" msgstr "Gemiddelde" #: src/language/stats/correlations.c:96 src/language/stats/examine.c:751 #: src/language/stats/factor.c:2070 src/language/stats/ks-one-sample.c:290 #: src/language/stats/means-calc.c:440 src/language/stats/npar-summary.c:109 #: src/language/stats/oneway.c:1052 src/language/stats/t-test-indep.c:196 #: src/language/stats/t-test-one-sample.c:128 #: src/language/stats/t-test-paired.c:153 #: src/language/stats/t-test-paired.c:242 msgid "Std. Deviation" msgstr "St.deviatie" #: src/language/stats/correlations.c:126 msgid "Correlations" msgstr "Correlaties" #: src/language/stats/correlations.c:146 msgid "Pearson Correlation" msgstr "Pearsoncorrelatie" #: src/language/stats/correlations.c:147 src/language/stats/oneway.c:1243 #: src/language/stats/t-test-indep.c:268 #: src/language/stats/t-test-one-sample.c:76 #: src/language/stats/t-test-paired.c:254 msgid "Sig. (2-tailed)" msgstr "Sign. (tweezijdig)" #: src/language/stats/correlations.c:147 src/language/stats/factor.c:1913 msgid "Sig. (1-tailed)" msgstr "Sign. (éénzijdig)" #: src/language/stats/correlations.c:151 msgid "Cross-products" msgstr "Kruisproducten" #: src/language/stats/correlations.c:152 msgid "Covariance" msgstr "Covariantie" #: src/language/stats/correlations.c:165 msgid "Significant at .05 level" msgstr "Significant op .05-niveau" #: src/language/stats/correlations.c:234 msgid "The data for the chosen variables are all missing or empty." msgstr "De gegevens van de gekozen variabelen zijn alle ontbrekend of leeg." #: src/language/stats/correlations.c:390 src/language/stats/descriptives.c:368 #: src/language/data-io/list.c:166 msgid "No variables specified." msgstr "Geen variabelen gespecificeerd." #: src/language/stats/descriptives.c:109 src/language/stats/frequencies.c:142 #: src/language/stats/means-calc.c:445 src/language/stats/t-test-indep.c:197 #: src/language/stats/t-test-one-sample.c:129 #: src/language/stats/t-test-paired.c:154 #: src/language/stats/t-test-paired.c:243 msgid "S.E. Mean" msgstr "St.f. gem." #: src/language/stats/descriptives.c:110 src/language/stats/frequencies.c:145 msgid "Std Dev" msgstr "St.dev." #: src/language/stats/descriptives.c:111 src/language/stats/examine.c:750 #: src/language/stats/frequencies.c:146 src/language/stats/means-calc.c:450 #: src/ui/gui/psppire-dialog-action-descriptives.c:46 #: src/ui/gui/psppire-dialog-action-frequencies.c:45 msgid "Variance" msgstr "Variantie" #: src/language/stats/descriptives.c:112 src/language/stats/examine.c:752 #: src/language/stats/frequencies.c:147 src/language/stats/means-calc.c:451 #: src/ui/gui/psppire-dialog-action-descriptives.c:47 #: src/ui/gui/psppire-dialog-action-frequencies.c:50 msgid "Kurtosis" msgstr "Welving" #: src/language/stats/descriptives.c:113 src/language/stats/frequencies.c:148 #: src/language/stats/means-calc.c:452 msgid "S.E. Kurt" msgstr "S.f. welving" #: src/language/stats/descriptives.c:114 src/language/stats/examine.c:752 #: src/language/stats/frequencies.c:149 src/language/stats/means-calc.c:453 #: src/ui/gui/psppire-dialog-action-descriptives.c:48 #: src/ui/gui/psppire-dialog-action-frequencies.c:46 msgid "Skewness" msgstr "Scheefheid" #: src/language/stats/descriptives.c:115 src/language/stats/frequencies.c:150 #: src/language/stats/means-calc.c:454 msgid "S.E. Skew" msgstr "S.f. scheefh." #: src/language/stats/descriptives.c:116 src/language/stats/examine.c:751 #: src/language/stats/frequencies.c:151 src/language/stats/means-calc.c:449 #: src/ui/gui/psppire-dialog-action-descriptives.c:43 #: src/ui/gui/psppire-dialog-action-frequencies.c:48 msgid "Range" msgstr "Bereik" #: src/language/stats/descriptives.c:117 src/language/stats/examine.c:751 #: src/language/stats/frequencies.c:152 src/language/stats/graph.c:214 #: src/language/stats/ks-one-sample.c:285 src/language/stats/means-calc.c:447 #: src/language/stats/npar-summary.c:110 src/language/stats/oneway.c:1061 #: src/ui/gui/psppire-dialog-action-descriptives.c:41 #: src/ui/gui/psppire-dialog-action-frequencies.c:42 msgid "Minimum" msgstr "Minimum" #: src/language/stats/descriptives.c:118 src/language/stats/examine.c:751 #: src/language/stats/frequencies.c:153 src/language/stats/graph.c:213 #: src/language/stats/ks-one-sample.c:285 src/language/stats/means-calc.c:448 #: src/language/stats/npar-summary.c:110 src/language/stats/oneway.c:1061 #: src/ui/gui/psppire-dialog-action-descriptives.c:42 #: src/ui/gui/psppire-dialog-action-frequencies.c:43 msgid "Maximum" msgstr "Maximum" #: src/language/stats/descriptives.c:119 src/language/stats/frequencies.c:154 #: src/language/stats/graph.c:212 src/language/stats/means-calc.c:446 #: src/ui/gui/psppire-dialog-action-descriptives.c:44 #: src/ui/gui/psppire-dialog-action-frequencies.c:53 msgid "Sum" msgstr "Som" #: src/language/stats/descriptives.c:350 #, c-format msgid "Z-score variable name %s would be a duplicate variable name." msgstr "Z-score-variabelenaam %s zou een eerder gebruikte variabelenaam zijn." #: src/language/stats/descriptives.c:401 msgid "" "DESCRIPTIVES with Z scores ignores TEMPORARY. Temporary transformations " "will be made permanent." msgstr "" "DESCRIPTIVES met Z-scores negeert TEMPORARY. Tijdelijke transformaties " "zullen blijvend worden." #: src/language/stats/descriptives.c:478 msgid "expecting statistic name: reverting to default" msgstr "naam van statistische maat verwacht: teruggezet op standaardwaarde" #: src/language/stats/descriptives.c:561 msgid "" "Ran out of generic names for Z-score variables. There are only 126 generic " "names: ZSC001-ZSC0999, STDZ01-STDZ09, ZZZZ01-ZZZZ09, ZQZQ01-ZQZQ09." msgstr "" "Generieke namen voor Z-score-variabelen zijn uitgeput. Er zijn slechts 126 " "generieke namen: ZSC001-ZSC0999, STDZ01-STDZ09, ZZZZ01-ZZZZ09, ZQZQ01-ZQZQ09." #: src/language/stats/descriptives.c:579 msgid "Mapping of Variables to Z-scores" msgstr "Z-scores worden toegewezen aan corresponderende variabelen" #: src/language/stats/descriptives.c:581 msgid "Names" msgstr "Namen" #: src/language/stats/descriptives.c:582 src/language/stats/glm.c:739 #: src/language/stats/regression.c:1030 msgid "Source" msgstr "Bron" #: src/language/stats/descriptives.c:582 msgid "Target" msgstr "Doel" #: src/language/stats/descriptives.c:659 #, c-format msgid "Internal error processing Z scores. Please report this to %s." msgstr "Interne fout bij verwerken Z-scores. Meld dit a.u.b. aan %s." #: src/language/stats/descriptives.c:759 #, c-format msgid "Z-score of %s" msgstr "Z-score van %s" #: src/language/stats/descriptives.c:1028 src/language/stats/roc.c:1029 msgid "Valid N (listwise)" msgstr "Geldige N (lijstgewijs)" #: src/language/stats/descriptives.c:1028 msgid "Missing N (listwise)" msgstr "Ontbrekende N (lijstgewijs)" #: src/language/stats/examine.c:75 msgid " (missing)" msgstr " (ontbrekend)" #: src/language/stats/examine.c:225 #, c-format msgid "Boxplot of %s vs. %s" msgstr "\"Box\"diagram van %s vs. %s" #: src/language/stats/examine.c:231 src/language/stats/examine.c:338 #, c-format msgid "Boxplot of %s" msgstr "\"Box\"diagram van %s" #: src/language/stats/examine.c:321 msgid "Boxplot" msgstr "\"Box\"diagram" #: src/language/stats/examine.c:418 msgid "Not creating NP plot because data set is empty." msgstr "NP-diagram wordt niet gemaakt omdat gegevensverzameling leeg is." #: src/language/stats/examine.c:478 #, c-format msgid "Not creating spreadlevel chart for %s" msgstr "Er wordt geen grafiek van spreiding vs. niveau gemaakt voor %s" #: src/language/stats/examine.c:585 msgid "User-missing value." msgstr "Door gebruiker gedefinieerde ontbrekende waarde." #: src/language/stats/examine.c:591 src/language/stats/examine.c:595 #: src/language/stats/frequencies.c:1606 msgid "Percentiles" msgstr "Percentielen" #: src/language/stats/examine.c:603 src/math/percentiles.c:37 msgid "Weighted Average" msgstr "Gewogen gemiddelde" #: src/language/stats/examine.c:603 msgid "Tukey's Hinges" msgstr "Tukeys \"hinges\"" #: src/language/stats/examine.c:610 src/language/stats/examine.c:685 #: src/language/stats/examine.c:759 src/language/stats/examine.c:858 #: src/language/stats/examine.c:938 src/language/stats/mann-whitney.c:200 #: src/language/stats/median.c:319 src/language/stats/t-test-indep.c:227 #: src/language/stats/t-test-indep.c:282 #: src/language/stats/t-test-one-sample.c:87 msgid "Dependent Variables" msgstr "Afhankelijke variabelen" #: src/language/stats/examine.c:669 msgid "Tests of Normality" msgstr "Normaliteitstoetsen" #: src/language/stats/examine.c:673 msgid "Shapiro-Wilk" msgstr "Shapiro-Wilk" #: src/language/stats/examine.c:674 src/language/stats/examine.c:739 #: src/ui/gui/psppire-checkbox-treeview.c:73 msgid "Statistic" msgstr "Statistische maat" #: src/language/stats/examine.c:676 src/language/stats/factor.c:2108 #: src/language/stats/glm.c:736 src/language/stats/logistic.c:1175 #: src/language/stats/oneway.c:978 src/language/stats/oneway.c:1154 #: src/language/stats/oneway.c:1376 src/language/stats/regression.c:906 #: src/language/stats/regression.c:1028 src/language/stats/t-test-indep.c:263 #: src/language/stats/t-test-paired.c:196 msgid "Sig." msgstr "Sign." #: src/language/stats/examine.c:735 src/language/stats/oneway.c:1045 #: src/ui/gui/descriptives.ui:25 msgid "Descriptives" msgstr "Beschrijvende statistische maten" #: src/language/stats/examine.c:738 msgid "Aspect" msgstr "Aspect" #: src/language/stats/examine.c:739 src/language/stats/oneway.c:1053 #: src/language/stats/oneway.c:1240 src/language/stats/oneway.c:1375 #: src/language/stats/roc.c:975 src/language/stats/regression.c:902 msgid "Std. Error" msgstr "St.fout" #: src/language/stats/examine.c:745 src/language/stats/oneway.c:1056 #, c-format msgid "%g%% Confidence Interval for Mean" msgstr "%g%%-betrouwbaarheidsinterval voor gemiddelde" #: src/language/stats/examine.c:747 src/language/stats/oneway.c:1058 #: src/language/stats/oneway.c:1382 src/language/stats/roc.c:982 #: src/language/stats/regression.c:913 msgid "Lower Bound" msgstr "Benedengrens" #: src/language/stats/examine.c:748 src/language/stats/oneway.c:1059 #: src/language/stats/oneway.c:1383 src/language/stats/roc.c:983 #: src/language/stats/regression.c:914 msgid "Upper Bound" msgstr "Bovengrens" #: src/language/stats/examine.c:750 msgid "5% Trimmed Mean" msgstr "5% \"getrimd\" gemiddelde" #: src/language/stats/examine.c:750 src/language/stats/frequencies.c:143 #: src/language/stats/means-calc.c:442 src/language/stats/median.c:352 #: src/ui/gui/psppire-dialog-action-frequencies.c:52 msgid "Median" msgstr "Mediaan" #: src/language/stats/examine.c:752 msgid "Interquartile Range" msgstr "Bereik tussen percentiel 25 en 75" #: src/language/stats/examine.c:832 msgid "Extreme Values" msgstr "Extreme waarden" #: src/language/stats/examine.c:840 src/language/stats/quick-cluster.c:664 #: src/language/data-io/list.c:110 msgid "Case Number" msgstr "Observatienummer" #: src/language/stats/examine.c:844 msgid "Order" msgstr "Volgorde" #. TRANSLATORS: This is a noun, not an adjective. #: src/language/stats/examine.c:850 msgid "Extreme" msgstr "Extreem" #: src/language/stats/examine.c:851 msgid "Highest" msgstr "Hoogste" #: src/language/stats/examine.c:851 msgid "Lowest" msgstr "Laagste" #: src/language/stats/examine.c:921 src/language/stats/logistic.c:1328 #: src/language/stats/means.c:694 src/language/stats/reliability.c:540 msgid "Case Processing Summary" msgstr "Overzicht observatieverwerking" #: src/language/stats/examine.c:927 src/language/stats/frequencies.c:304 #: src/language/stats/frequencies.c:1494 src/language/stats/logistic.c:1332 #: src/language/stats/means.c:713 src/language/stats/reliability.c:545 #: src/language/stats/crosstabs.q:927 msgid "Percent" msgstr "Procent" #: src/language/stats/examine.c:929 src/language/stats/frequencies.c:321 #: src/language/stats/frequencies.c:1590 src/language/stats/quick-cluster.c:766 #: src/language/stats/reliability.c:548 src/language/stats/crosstabs.q:931 msgid "Valid" msgstr "Geldig" #: src/language/stats/examine.c:929 src/language/stats/frequencies.c:336 #: src/language/stats/frequencies.c:1591 src/language/stats/crosstabs.q:931 msgid "Missing" msgstr "Ontbrekend" #: src/language/stats/examine.c:1550 #, c-format msgid "%s may not be negative. Using default value (%g)." msgstr "%s mag niet negatief zijn. Verstekwaarde (%g) wordt gebruikt." #: src/language/stats/examine.c:1587 msgid "Percentiles must lie in the range (0, 100)" msgstr "Percentielen moeten liggen binnen het bereik (0, 100)" #: src/language/stats/examine.c:1777 #, c-format msgid "%s and %s are mutually exclusive" msgstr "%s en %s sluiten elkaar uit" #: src/language/stats/factor.c:1121 #, c-format msgid "Matrix input for %s must be either COV or CORR" msgstr "Matrixinvoer voor %s moet òf COV òf CORR zijn" #: src/language/stats/factor.c:1519 msgid "Factor analysis on a single variable is not useful." msgstr "Factoranalyse op een enkele variabele is niet zinvol." #: src/language/stats/factor.c:1523 msgid "Factor analysis without variables is not possible." msgstr "Factoranalyse zonder variabele is niet mogelijk." #: src/language/stats/factor.c:1634 msgid "Component Number" msgstr "Componentnummer" #: src/language/stats/factor.c:1634 msgid "Factor Number" msgstr "Factornummer" #: src/language/stats/factor.c:1648 src/language/stats/factor.c:1651 msgid "Communalities" msgstr "Communaliteiten" #: src/language/stats/factor.c:1653 msgid "Initial" msgstr "Initieel" #: src/language/stats/factor.c:1655 msgid "Extraction" msgstr "Extractie" #: src/language/stats/factor.c:1697 src/language/stats/factor.c:1777 #: src/language/stats/factor.c:1839 msgid "Component" msgstr "Component" #: src/language/stats/factor.c:1697 src/language/stats/factor.c:1777 #: src/language/stats/factor.c:1839 msgid "Factor" msgstr "Factor" #: src/language/stats/factor.c:1752 msgid "Total Variance Explained" msgstr "Totale verklaarde variantie" #: src/language/stats/factor.c:1758 #, fuzzy, no-c-format #| msgid "Variance" msgid "% of Variance" msgstr "Variantie" # msgid "% of Variance" # msgstr " %s variantie" #: src/language/stats/factor.c:1760 #, no-c-format msgid "Cumulative %" msgstr "Cumulatief %" #: src/language/stats/factor.c:1763 msgid "Phase" msgstr "Fase" #: src/language/stats/factor.c:1765 msgid "Initial Eigenvalues" msgstr "Initiële eigenwaarden" #: src/language/stats/factor.c:1769 msgid "Extraction Sums of Squared Loadings" msgstr "Extractiesommen van gekwadrateerde ladingen" #: src/language/stats/factor.c:1773 msgid "Rotation Sums of Squared Loadings" msgstr "Rotatiesommen van gekwadrateerde ladingen" #: src/language/stats/factor.c:1835 msgid "Factor Correlation Matrix" msgstr "Factorcorrelatiematrix" #: src/language/stats/factor.c:1842 msgid "Factor 2" msgstr "Factor 2" #: src/language/stats/factor.c:1874 msgid "Anti-Image Matrices" msgstr "\"Anti-image\"-matrices" #: src/language/stats/factor.c:1879 msgid "Anti-image Covariance" msgstr "\"Anti-image\"-covariantie" #: src/language/stats/factor.c:1880 msgid "Anti-image Correlation" msgstr "\"Anti-image\"-correlaties" #: src/language/stats/factor.c:1901 msgid "Correlation Matrix" msgstr "Correlatiematrix" #: src/language/stats/factor.c:1910 src/language/stats/t-test-paired.c:195 msgid "Correlation" msgstr "Correlatie" #: src/language/stats/factor.c:1947 msgid "Determinant" msgstr "Determinant" #: src/language/stats/factor.c:1958 msgid "Covariance Matrix" msgstr "Covariantiematrix" #: src/language/stats/factor.c:1990 msgid "" "The dataset contains no complete observations. No analysis will be performed." msgstr "" "De dataset bevat geen complete observaties. Er zal geen analyse worden " "uitgevoerd." #: src/language/stats/factor.c:2014 msgid "The dataset has no complete covariance or correlation matrix." msgstr "De dataaset heeft geen complete covariantie- of correlatiematrix." #: src/language/stats/factor.c:2071 msgid "Analysis N" msgstr "Analyse N" #: src/language/stats/factor.c:2099 msgid "KMO and Bartlett's Test" msgstr "KMO en toets van Bartlett" #: src/language/stats/factor.c:2103 msgid "Kaiser-Meyer-Olkin Measure of Sampling Adequacy" msgstr "Maat van Kaiser-Meyer-Olkin voor steekproeftrekking" #: src/language/stats/factor.c:2105 msgid "Bartlett's Test of Sphericity" msgstr "Toets van Bartlett voor homogeniteit van varianties" #: src/language/stats/factor.c:2106 msgid "Approx. Chi-Square" msgstr "Chi-kwadraat bij benadering" #: src/language/stats/factor.c:2154 #, c-format msgid "" "The %s criteria result in zero factors extracted. Therefore no analysis will " "be performed." msgstr "" "De %s criteria resulteren in extractie van nul factoren. Daarom zal geen " "analyse worden uitgevoerd." #: src/language/stats/factor.c:2161 #, c-format msgid "" "The %s criteria result in more factors than variables, which is not " "meaningful. No analysis will be performed." msgstr "" "De %s criteria resulteren in meer factoren dan variabelen, hetgeen niet " "betekenisvol is. Er zal geen analyse worden uitgevoerd." #: src/language/stats/factor.c:2254 msgid "Component Matrix" msgstr "Componentrenmatrix" #: src/language/stats/factor.c:2254 msgid "Factor Matrix" msgstr "Factormatrix" #: src/language/stats/factor.c:2259 msgid "Pattern Matrix" msgstr "Patroonmatrix" #: src/language/stats/factor.c:2268 msgid "Structure Matrix" msgstr "Structuurmatrix" #: src/language/stats/factor.c:2270 msgid "Rotated Component Matrix" msgstr "Geroteerde componentenmatrix" #: src/language/stats/factor.c:2271 msgid "Rotated Factor Matrix" msgstr "Geroteerde factormatrix" #: src/language/stats/flip.c:100 #, c-format msgid "%s ignores %s. Temporary transformations will be made permanent." msgstr "%s negeert %s. Tijdelijke transformaties zullen blijvend worden." #: src/language/stats/flip.c:153 #, c-format msgid "Could not create temporary file for %s." msgstr "Kon geen tijdelijk bestand voor %s aanmaken." #: src/language/stats/flip.c:341 #, c-format msgid "Error rewinding %s file: %s." msgstr "Fout tijdens terugspoelen van %s bestand: %s." #: src/language/stats/flip.c:348 #, c-format msgid "Error creating %s source file." msgstr "Fout tijdens creëren van %s bronbestand." #: src/language/stats/flip.c:361 #, c-format msgid "Error reading %s file: %s." msgstr "Fout tijdens lezen van %s bestand: %s." #: src/language/stats/flip.c:363 #, c-format msgid "Unexpected end of file reading %s file." msgstr "Onverwacht einde-bestand gevonden tijdens lezen van %s bestand." #: src/language/stats/flip.c:379 #, c-format msgid "Error seeking %s source file: %s." msgstr "Fout tijdens zoeken %s bronbestand: %s." #: src/language/stats/flip.c:387 #, c-format msgid "Error writing %s source file: %s." msgstr "Fout tijdens schrijven %s bronbestand: %s." #: src/language/stats/flip.c:402 #, c-format msgid "Error rewinding %s source file: %s." msgstr "Fout tijdens terugspoelen %s bronbestand: %s." #: src/language/stats/flip.c:433 #, c-format msgid "Error reading %s temporary file: %s." msgstr "Fout tijdens lezen van %s tijdelijk bestand: %s." #: src/language/stats/flip.c:436 #, c-format msgid "Unexpected end of file reading %s temporary file." msgstr "" "Onverwacht einde-bestand gevonden tijdens lezen van %s tijdelijk bestand." #: src/language/stats/frequencies.c:144 #: src/ui/gui/psppire-dialog-action-frequencies.c:49 msgid "Mode" msgstr "Modus" #: src/language/stats/frequencies.c:303 src/language/stats/logistic.c:1381 #: src/output/charts/plot-hist-cairo.c:112 msgid "Frequency" msgstr "Frequentie" #: src/language/stats/frequencies.c:305 msgid "Valid Percent" msgstr "Percentage geldig" #: src/language/stats/frequencies.c:306 src/language/stats/graph.c:208 msgid "Cumulative Percent" msgstr "Cumulatief percentage" #: src/language/stats/frequencies.c:905 msgid "Histogram frequency must be greater than zero." msgstr "Histogramfrequentie moet groter dan nul zijn." #: src/language/stats/frequencies.c:923 msgid "Histogram percentage must be greater than zero." msgstr "Histogrampercentage moet groter dan nul zijn." #: src/language/stats/frequencies.c:1139 #, c-format msgid "" "%s for histogram must be greater than or equal to %s, but %s was specified " "as %.15g and %s as %.15g. %s and %s will be ignored." msgstr "" "%s voor histogram moet groter dan of gelijk aan %s zijn, maar %s was " "opgegeven als %.15g en %s als %.15g. %s en %s worden genegeerd." #: src/language/stats/frequencies.c:1184 #, c-format msgid "" "%s for pie chart must be greater than or equal to %s, but %s was specified " "as %.15g and %s as %.15g. %s and %s will be ignored." msgstr "" "%s voor cirkeldiagram moet groter dan of gelijk aan %s zijn, maar %s was " "opgegeven als %.15g en %s als %.15g. %s en %s worden genegeerd." #: src/language/stats/frequencies.c:1474 #, c-format msgid "Omitting pie chart for %s, which has only %d unique values." msgstr "" "Cirkeldiagram voor %s wordt weggelaten: deze variabele heeft slechts %d " "unieke waarden." #: src/language/stats/frequencies.c:1477 #, c-format msgid "Omitting pie chart for %s, which has over 50 unique values." msgstr "" "Cirkeldiagram voor %s wordt weggelaten: deze variabele heeft meer dan 50 " "unieke waarden." #: src/language/stats/frequencies.c:1494 src/language/stats/graph.c:205 #: src/language/stats/quick-cluster.c:747 #: src/ui/gui/psppire-dialog-action-crosstabs.c:90 #: src/language/stats/crosstabs.q:789 src/language/stats/crosstabs.q:1262 msgid "Count" msgstr "Telling" #: src/language/stats/friedman.c:220 src/language/stats/kruskal-wallis.c:247 #: src/language/stats/mann-whitney.c:182 src/language/stats/wilcoxon.c:240 msgid "Ranks" msgstr "Rangen" #: src/language/stats/friedman.c:222 src/language/stats/friedman.c:223 #: src/language/stats/kruskal-wallis.c:251 #: src/language/stats/mann-whitney.c:186 src/language/stats/wilcoxon.c:245 msgid "Mean Rank" msgstr "Gemiddelde rang" #: src/language/stats/friedman.c:253 msgid "Kendall's W" msgstr "Kendalls W" #: src/language/stats/friedman.c:256 src/language/stats/kruskal-wallis.c:298 #: src/language/stats/median.c:353 msgid "Chi-Square" msgstr "Chi-kwadraat" #: src/language/stats/glm.c:169 msgid "Multivariate analysis is not yet implemented" msgstr "Multivariate analyse is nog niet geïmplementeerd" #: src/language/stats/glm.c:274 msgid "Only types 1, 2 & 3 sums of squares are currently implemented" msgstr "" "Alleen kwadratensommen van type 1, 2 en 3 zijn momenteel geimplementeerd" #: src/language/stats/glm.c:727 msgid "Tests of Between-Subjects Effects" msgstr "Toetsen voor effecten tussen subjecten" #: src/language/stats/glm.c:730 msgid "Type I Sum Of Squares" msgstr "Type I som van kwadraten" #: src/language/stats/glm.c:731 msgid "Type II Sum Of Squares" msgstr "Type II som van kwadraten" #: src/language/stats/glm.c:732 msgid "Type III Sum Of Squares" msgstr "Type III som van kwadraten" #: src/language/stats/glm.c:734 src/language/stats/oneway.c:976 #: src/language/stats/regression.c:1026 msgid "Mean Square" msgstr "Gemiddelde kwadraat" #: src/language/stats/glm.c:735 src/language/stats/oneway.c:977 #: src/language/stats/regression.c:1027 src/language/stats/t-test-indep.c:262 msgid "F" msgstr "F" #: src/language/stats/glm.c:740 msgid "Corrected Model" msgstr "Gecorrigeerd model" #: src/language/stats/glm.c:740 msgid "Model" msgstr "Model" #: src/language/stats/glm.c:752 msgid "Intercept" msgstr "Oorsprong" #: src/language/stats/glm.c:802 src/output/pivot-table.c:763 #: src/output/spv/spv.c:867 msgid "Error" msgstr "Fout" #: src/language/stats/glm.c:819 msgid "Corrected Total" msgstr "Gecorrigeerd totaal" #: src/language/stats/graph.c:206 msgid "Percentage" msgstr "Percentage" #: src/language/stats/graph.c:207 msgid "Cumulative Count" msgstr "Cumulatieve telling" #: src/language/stats/graph.c:296 #, c-format msgid "%s vs. %s by %s" msgstr "%s vs. %s per %s" #: src/language/stats/graph.c:303 #, c-format msgid "%s vs. %s" msgstr "%s vs. %s" #: src/language/stats/graph.c:322 msgid "" "Maximum number of scatterplot categories reached. Your BY variable has too " "many distinct values. The coloring of the plot will not be correct." msgstr "" "Maximaal aantal categoriën voor spreidingsdiagrammen is bereikt. Uw BY-" "variabele heeft teveel verschillende waarden. De kleuren in de grafiek " "zullen niet juist zijn." #: src/language/stats/graph.c:551 src/language/stats/rank.c:636 #, c-format msgid "%s of %s" msgstr "%s van %s" #: src/language/stats/graph.c:698 src/language/stats/graph.c:729 #: src/language/stats/graph.c:777 msgid "Only one chart type is allowed." msgstr "Slechts één grafiektype is toegestaan." #: src/language/stats/graph.c:721 src/language/stats/graph.c:820 #: src/language/stats/graph.c:834 msgid "Only one variable is allowed." msgstr "Slechts één variable is toegestaan." #: src/language/stats/graph.c:843 msgid "Variable expected" msgstr "Variabele verwacht" #: src/language/stats/graph.c:883 msgid "FOOTNOTE is not implemented yet for GRAPH" msgstr "FOOTNOTE is voor GRAPH nog niet geïmplementeerd" #: src/language/stats/ks-one-sample.c:274 src/ui/gui/ks-one-sample.ui:24 msgid "One-Sample Kolmogorov-Smirnov Test" msgstr "Kolmogorov-Smirnovtoets voor één steekproef" #: src/language/stats/ks-one-sample.c:284 msgid "Uniform Parameters" msgstr "Uniforme parameters" #: src/language/stats/ks-one-sample.c:289 msgid "Normal Parameters" msgstr "Normale parameters" #: src/language/stats/ks-one-sample.c:294 msgid "Poisson Parameters" msgstr "Poissonparameters" #: src/language/stats/ks-one-sample.c:295 #: src/ui/gui/psppire-dialog-action-crosstabs.c:76 #: src/language/stats/crosstabs.q:1421 msgid "Lambda" msgstr "Lambda" #: src/language/stats/ks-one-sample.c:300 msgid "Exponential Parameters" msgstr "Exponentiële parameters" #: src/language/stats/ks-one-sample.c:308 msgid "Most Extreme Differences" msgstr "Meest extreme verschillen" #: src/language/stats/ks-one-sample.c:309 msgid "Absolute" msgstr "Absoluut" #: src/language/stats/ks-one-sample.c:309 src/language/stats/roc.c:1037 msgid "Positive" msgstr "Positief" #: src/language/stats/ks-one-sample.c:309 src/language/stats/roc.c:1037 msgid "Negative" msgstr "Negatief" #: src/language/stats/ks-one-sample.c:312 msgid "Kolmogorov-Smirnov Z" msgstr "Z van Kolmogorov-Smirnov" #: src/language/stats/ks-one-sample.c:313 #: src/language/stats/jonckheere-terpstra.c:374 #: src/language/stats/mann-whitney.c:251 src/language/stats/runs.c:328 #: src/language/stats/wilcoxon.c:284 msgid "Asymp. Sig. (2-tailed)" msgstr "Asymp. sign. (tweezijdig)" #: src/language/stats/logistic.c:327 msgid "All predicted values are either 1 or 0" msgstr "Alle voorspelde waarden zijn òf 1 òf 0" #: src/language/stats/logistic.c:525 msgid "Dependent variable's values are not dichotomous." msgstr "Waarden van afhankelijke variabele zijn niet dichotoom." #: src/language/stats/logistic.c:614 #, c-format msgid "" "Category %s does not have at least two distinct values. Logistic regression " "will not be run." msgstr "" "Categorie %s bevat niet minstens twee verschillende waarden. Logistische " "regressie wordt niet uitgevoerd." #: src/language/stats/logistic.c:674 #, c-format msgid "" "Estimation terminated at iteration number %d because parameter estimates " "changed by less than %g" msgstr "" "Schatting is na iteratie nummer %d beëindigd omdat parameterschattingen met " "minder dan %g veranderden" #: src/language/stats/logistic.c:686 #, c-format msgid "" "Estimation terminated at iteration number %d because Log Likelihood " "decreased by less than %g%%" msgstr "" "Schatting is na iteratie nummer %d beëindigd omdat Log Likelihood met minder " "dan %g%% verminderde" #: src/language/stats/logistic.c:701 #, c-format msgid "" "Estimation terminated at iteration number %d because maximum iterations has " "been reached" msgstr "" "Schatting is na iteratie nummer %d beëindigd omdat maximaal aantal iteraties " "is bereikt" #: src/language/stats/logistic.c:994 msgid "Cut point value must be in the range [0,1]" msgstr "Waarde van afsnijpunt moet in bereik [0,1] liggen" #: src/language/stats/logistic.c:1139 msgid "Dependent Variable Encoding" msgstr "Codering van afhankelijke variabele" #: src/language/stats/logistic.c:1141 msgid "Mapping" msgstr "\"Mapping\"" #: src/language/stats/logistic.c:1142 msgid "Internal Value" msgstr "Interne waarde" #: src/language/stats/logistic.c:1145 msgid "Original Value" msgstr "Oorspronkelijke waarde" #: src/language/stats/logistic.c:1167 msgid "Variables in the Equation" msgstr "Variabelen in de vergelijking" #: src/language/stats/logistic.c:1171 src/language/stats/regression.c:902 msgid "B" msgstr "B" #: src/language/stats/logistic.c:1172 msgid "S.E." msgstr "St.f." #: src/language/stats/logistic.c:1173 msgid "Wald" msgstr "Wald" #: src/language/stats/logistic.c:1176 msgid "Exp(B)" msgstr "Exp(B)" #: src/language/stats/logistic.c:1181 #, c-format msgid "%d%% CI for Exp(B)" msgstr "%d%% B.I. voor Exp(B)" #: src/language/stats/logistic.c:1183 src/language/stats/t-test-indep.c:274 #: src/language/stats/t-test-one-sample.c:83 #: src/language/stats/t-test-paired.c:249 src/language/stats/crosstabs.q:1369 msgid "Lower" msgstr "Lager" #: src/language/stats/logistic.c:1183 src/language/stats/t-test-indep.c:275 #: src/language/stats/t-test-one-sample.c:84 #: src/language/stats/t-test-paired.c:250 src/language/stats/crosstabs.q:1370 msgid "Upper" msgstr "Hoger" #: src/language/stats/logistic.c:1189 src/language/stats/logistic.c:1470 msgid "Step 1" msgstr "Stap 1" #: src/language/stats/logistic.c:1263 msgid "Constant" msgstr "Constante" #: src/language/stats/logistic.c:1298 msgid "Model Summary" msgstr "Samenvatting van model" #: src/language/stats/logistic.c:1301 msgid "-2 Log likelihood" msgstr "-2 log waarschijnlijkheid" #: src/language/stats/logistic.c:1302 msgid "Cox & Snell R Square" msgstr "R-kwadraat van Cox en Snell" #: src/language/stats/logistic.c:1303 msgid "Nagelkerke R Square" msgstr "R-kwadraat van Nagelkerke" #: src/language/stats/logistic.c:1306 src/language/stats/logistic.c:1470 msgid "Step" msgstr "Stap" #: src/language/stats/logistic.c:1335 msgid "Unweighted Cases" msgstr "Ongewogen observaties" #: src/language/stats/logistic.c:1336 msgid "Included in Analysis" msgstr "Opgenomen in analyse" #: src/language/stats/logistic.c:1336 msgid "Missing Cases" msgstr "Ontbrekende observaties" #: src/language/stats/logistic.c:1365 msgid "Categorical Variables' Codings" msgstr "Codering van categorische variabelen" #: src/language/stats/logistic.c:1380 msgid "Codings" msgstr "Coderingen" #: src/language/stats/logistic.c:1383 msgid "Parameter coding" msgstr "Parametercodering" #: src/language/stats/logistic.c:1462 msgid "Classification Table" msgstr "Classificatietabel" #: src/language/stats/logistic.c:1466 msgid "Predicted" msgstr "Voorspeld" #: src/language/stats/logistic.c:1466 msgid "Percentage Correct" msgstr "Percentage correct" #: src/language/stats/logistic.c:1468 msgid "Observed" msgstr "Waargenomen" #: src/language/stats/logistic.c:1468 msgid "Overall Percentage" msgstr "Algeheel percentage" #: src/language/stats/jonckheere-terpstra.c:357 msgid "Jonckheere-Terpstra Test" msgstr "Toets van Jonckheere-Terpstra" #: src/language/stats/jonckheere-terpstra.c:364 #, c-format msgid "Number of levels in %s" msgstr "Aantal niveaus in %s" #: src/language/stats/jonckheere-terpstra.c:370 msgid "Observed J-T Statistic" msgstr "Waargenomen J-T-statistiek" #: src/language/stats/jonckheere-terpstra.c:371 msgid "Mean J-T Statistic" msgstr "Gemiddelde J-T-statistiek" #: src/language/stats/jonckheere-terpstra.c:372 msgid "Std. Deviation of J-T Statistic" msgstr "St.deviatie van J-T-statistiek" #: src/language/stats/jonckheere-terpstra.c:373 msgid "Std. J-T Statistic" msgstr "St. J-T-statistiek" #: src/language/stats/mann-whitney.c:187 src/language/stats/wilcoxon.c:246 msgid "Sum of Ranks" msgstr "Som van rangen" #: src/language/stats/mann-whitney.c:248 msgid "Mann-Whitney U" msgstr "U van Mann-Whitney" #: src/language/stats/mann-whitney.c:249 msgid "Wilcoxon W" msgstr "W van Wilcoxon" #: src/language/stats/mann-whitney.c:250 src/language/stats/runs.c:327 #: src/language/stats/wilcoxon.c:283 msgid "Z" msgstr "Z" #: src/language/stats/means.c:702 msgid "Included" msgstr "Opgenomen" #: src/language/stats/means.c:704 src/language/stats/reliability.c:548 msgid "Excluded" msgstr "Uitgesloten" #: src/language/stats/means.c:753 msgid "Report" msgstr "Rapport" #: src/language/stats/means.c:838 #, c-format msgid "" "The table \"%s\" has no non-empty control variables. No result for this " "table will be displayed." msgstr "" "Tabel \"%s\" heeft alleen lege controlevariabelen. Voor deze tabel zal geen " "resultaat worden getoond." #: src/language/stats/means-calc.c:443 msgid "Group Median" msgstr "Groepsmediaan" #: src/language/stats/means-calc.c:455 msgid "First" msgstr "Eerste" #: src/language/stats/means-calc.c:456 msgid "Last" msgstr "Laatste" #: src/language/stats/means-calc.c:458 msgid "Percent N" msgstr "Procent N" #: src/language/stats/means-calc.c:459 msgid "Percent Sum" msgstr "Som van percentages" #: src/language/stats/means-calc.c:461 msgid "Harmonic Mean" msgstr "Harmonisch geniddelde" #: src/language/stats/means-calc.c:462 msgid "Geom. Mean" msgstr "Geom. gemiddelde" #: src/language/stats/mcnemar.c:144 msgid "The McNemar test is appropriate only for dichotomous variables" msgstr "De McNemar-toets is alleen gepast bij dichotome variabelen" #: src/language/stats/mcnemar.c:226 src/language/stats/sign.c:105 msgid "Point Probability" msgstr "Puntwaarschijnlijkheid" #: src/language/stats/mcnemar.c:229 src/language/stats/sign.c:78 #: src/language/stats/sign.c:108 src/language/stats/t-test-paired.c:199 #: src/language/stats/t-test-paired.c:257 src/language/stats/wilcoxon.c:253 #: src/language/stats/wilcoxon.c:292 msgid "Pairs" msgstr "Paren" #: src/language/stats/median.c:316 msgid "> Median" msgstr "> Mediaan" #: src/language/stats/median.c:316 msgid "≤ Median" msgstr "≤ Mediaan" #: src/language/stats/npar.c:536 #, c-format msgid "%s subcommand not currently implemented." msgstr "%s subopdracht is op dit moment nog niet geïmplementeerd." #: src/language/stats/npar.c:691 #, c-format msgid "Expecting %s, %s, %s or a number." msgstr "Verwacht %s, %s, %s of een getal." #: src/language/stats/npar.c:845 #, c-format msgid "" "The specified value of HI (%d) is lower than the specified value of LO (%d)" msgstr "" "De opgegeven waarde van HI (%d) is lager dan de opgegeven waarde van LO (%d)" #: src/language/stats/npar.c:897 #, c-format msgid "" "%d expected values were given, but the specified range (%d-%d) requires " "exactly %d values." msgstr "" "%d verwachte waarden waren opgegeven, maar het opgegeven bereik (%d-%d) " "vereist precies %d waarden." #: src/language/stats/npar.c:1118 src/language/stats/t-test-parser.c:173 #, c-format msgid "" "PAIRED was specified but the number of variables preceding WITH (%zu) did " "not match the number following (%zu)." msgstr "" "PAIRED was opgegeven maar het aantal variabelen voor WITH (%zu) komt niet " "overeen met het aantal er achter (%zu)." #: src/language/stats/oneway.c:361 msgid "LSD" msgstr "LSD" #: src/language/stats/oneway.c:362 src/ui/gui/oneway.ui:338 msgid "Tukey HSD" msgstr "HSD van Tukey" #: src/language/stats/oneway.c:363 src/ui/gui/oneway.ui:253 msgid "Bonferroni" msgstr "Bonferroni" #: src/language/stats/oneway.c:364 src/ui/gui/oneway.ui:304 msgid "Scheffé" msgstr "Scheffé" #: src/language/stats/oneway.c:365 msgid "Games-Howell" msgstr "Games-Howell" #: src/language/stats/oneway.c:366 src/ui/gui/oneway.ui:321 msgid "Šidák" msgstr "Šidák" #: src/language/stats/oneway.c:519 #, c-format msgid "The post hoc analysis method %s is not supported." msgstr "De post hoc-analysemethode %s wordt niet ondersteund." #: src/language/stats/oneway.c:842 #, c-format msgid "" "Dependent variable %s has no non-missing values. No analysis for this " "variable will be done." msgstr "" "Afhankelijke variabele %s heeft alleen ontbrekende waarden. Voor deze " "variabele zullen geen analyses worden uitgevoerd." #: src/language/stats/oneway.c:924 #, c-format msgid "" "In contrast list %zu, the number of coefficients (%zu) does not equal the " "number of groups (%d). This contrast list will be ignored." msgstr "" "In contrastenlijst %zu is het aantal coëfficiënten (%zu) niet gelijk aan het " "aantal groepen (%d). Deze contrastenlijst zal worden genegeerd." #: src/language/stats/oneway.c:936 #, c-format msgid "Coefficients for contrast %zu do not total zero" msgstr "Coëfficiënten voor contrast %zu tellen niet op tot nul" #: src/language/stats/oneway.c:971 msgid "ANOVA" msgstr "ANOVA" #: src/language/stats/oneway.c:974 src/language/stats/regression.c:1024 msgid "Sum of Squares" msgstr "Som van kwadraten" #: src/language/stats/oneway.c:981 msgid "Between Groups" msgstr "Tussen groepen" #: src/language/stats/oneway.c:981 msgid "Within Groups" msgstr "Binnen groepen" #: src/language/stats/oneway.c:1075 src/language/stats/oneway.c:1257 msgid "Dependent Variable" msgstr "Afhankelijke variabele" #: src/language/stats/oneway.c:1148 msgid "Test of Homogeneity of Variances" msgstr "Toets voor homogeniteit van varianties" #: src/language/stats/oneway.c:1151 msgid "Levene Statistic" msgstr "Stat. maat van Levene" #: src/language/stats/oneway.c:1152 msgid "df1" msgstr "vr.gr. 1" #: src/language/stats/oneway.c:1153 msgid "df2" msgstr "vr.gr. 2" #: src/language/stats/oneway.c:1192 msgid "Contrast Coefficients" msgstr "Contrastcoëfficiënten" #: src/language/stats/oneway.c:1199 src/language/stats/oneway.c:1246 msgid "Contrast" msgstr "Contrast" #: src/language/stats/oneway.c:1236 msgid "Contrast Tests" msgstr "Contrasttoetsen" #: src/language/stats/oneway.c:1239 msgid "Value of Contrast" msgstr "Waarde van contrast" #: src/language/stats/oneway.c:1241 src/language/stats/regression.c:905 #: src/language/stats/t-test-indep.c:266 #: src/language/stats/t-test-one-sample.c:74 #: src/language/stats/t-test-paired.c:252 msgid "t" msgstr "t" #: src/language/stats/oneway.c:1252 msgid "Assumption" msgstr "Aanname" #: src/language/stats/oneway.c:1253 msgid "Assume equal variances" msgstr "Veronderstel gelijke varianties" #: src/language/stats/oneway.c:1254 msgid "Does not assume equal variances" msgstr "Veronderstelt geen gelijke varianties" #: src/language/stats/oneway.c:1367 #, c-format msgid "Multiple Comparisons (%s)" msgstr "Meerdere vergelijkingen (%s)" #: src/language/stats/oneway.c:1374 msgid "Mean Difference (I - J)" msgstr "Gemiddeld verschil (I - J)" #: src/language/stats/oneway.c:1379 #, c-format msgid "%g%% Confidence Interval" msgstr "%g%%-betrouwbaarheidsinterval" #: src/language/stats/oneway.c:1386 src/language/stats/oneway.c:1390 msgid "(J) Family" msgstr "(J)-familie" #: src/language/stats/oneway.c:1406 msgid "Test" msgstr "Toets" #: src/language/stats/quick-cluster.c:576 msgid "Initial Cluster Centers" msgstr "Initiële clustercentra" #: src/language/stats/quick-cluster.c:577 msgid "Final Cluster Centers" msgstr "Uiteindelijke clustercentra" #: src/language/stats/quick-cluster.c:580 #: src/language/stats/quick-cluster.c:660 #: src/language/stats/quick-cluster.c:661 #: src/language/stats/quick-cluster.c:753 msgid "Cluster" msgstr "Cluster" #: src/language/stats/quick-cluster.c:658 msgid "Cluster Membership" msgstr "Clusterlidmaatschap" #: src/language/stats/quick-cluster.c:744 msgid "Number of Cases in each Cluster" msgstr "Aantal observaties in elk cluster" #: src/language/stats/quick-cluster.c:750 msgid "Clusters" msgstr "Clusters" #: src/language/stats/quick-cluster.c:867 #: src/language/stats/quick-cluster.c:893 #, c-format msgid "A variable called `%s' already exists." msgstr "Een variabele met de naam `%s’ bestaat reeds." #: src/language/stats/quick-cluster.c:908 #, c-format msgid "Expecting %s or %s." msgstr "%s of %s verwacht." #: src/language/stats/quick-cluster.c:928 msgid "The number of clusters must be positive" msgstr "Het aantal clusters moet positief zijn" #: src/language/stats/quick-cluster.c:944 msgid "The convergence criterion must be positive" msgstr "Het convergentiecriterium moet positief zijn" #: src/language/stats/quick-cluster.c:960 msgid "The number of iterations must be positive" msgstr "Het aantal iteraries moet positief zijn" #: src/language/stats/rank.c:205 #, c-format msgid "" "Cannot generate variable name for ranking %s with %s. All candidates in use." msgstr "" "Kan geen variabelenaam genereren voor rang %s met %s. Alle kandidaat-namen " "zijn in gebruik." #: src/language/stats/rank.c:321 #, c-format msgid "Too many variables in %s clause." msgstr "Teveel variabelen in clausule %s." #: src/language/stats/rank.c:323 #, c-format msgid "Variable %s already exists." msgstr "Variabele %s bestaat reeds." #: src/language/stats/rank.c:325 src/language/expressions/evaluate.c:164 #, c-format msgid "Duplicate variable name %s." msgstr "Reeds gebruikte variabelenaam %s." #: src/language/stats/rank.c:631 #, c-format msgid "%s of %s by %s" msgstr "%s van %s per %s" #: src/language/stats/rank.c:825 msgid "Variables Created by RANK" msgstr "Variabelen gecreëerd door RANK" #: src/language/stats/rank.c:828 src/language/stats/rank.c:829 msgid "New Variable" msgstr "Nieuwe variabele" #: src/language/stats/rank.c:829 msgid "Function" msgstr "Functie" #: src/language/stats/rank.c:830 msgid "Fraction" msgstr "Fractie" #: src/language/stats/rank.c:830 msgid "Grouping Variables" msgstr "Groepeervariabelen" #: src/language/stats/rank.c:833 src/language/stats/rank.c:834 msgid "Existing Variable" msgstr "Bestaande variabele" #: src/language/stats/reliability.c:164 msgid "Reliability on a single variable is not useful." msgstr "Betrouwbaarheidsanalyse op een enkele variabele is niet zinvol." #: src/language/stats/reliability.c:281 msgid "" "The STATISTICS subcommand is not yet implemented. No statistics will be " "produced." msgstr "" "De subopdracht STATISTICS is nog niet geïmplementeerd. Er zullen geen " "statistische maten worden geproduceerd." #: src/language/stats/reliability.c:300 msgid "The split point must be less than the number of variables" msgstr "Het splitspunt moet kleiner zijn dan het aantal variabelen" #: src/language/stats/reliability.c:525 #, c-format msgid "Scale: %s" msgstr "Schaal: %s" #: src/language/stats/reliability.c:582 msgid "Item-Total Statistics" msgstr "Statistische item-totaalmaten" #: src/language/stats/reliability.c:585 msgid "Scale Mean if Item Deleted" msgstr "Schaalgemiddelde als item wordt verwijderd" #: src/language/stats/reliability.c:586 msgid "Scale Variance if Item Deleted" msgstr "Schaalvariantie als item wordt verwijderd" #: src/language/stats/reliability.c:587 msgid "Corrected Item-Total Correlation" msgstr "Gecorrigeerde item-totaalcorrelatie" #: src/language/stats/reliability.c:588 msgid "Cronbach's Alpha if Item Deleted" msgstr "Cronbachs Alfa als item wordt weggelaten" #: src/language/stats/reliability.c:627 msgid "Reliability Statistics" msgstr "Betrouwbaarheidsstatistieken" #: src/language/stats/reliability.c:634 src/language/stats/reliability.c:646 msgid "Cronbach's Alpha" msgstr "Cronbachs Alfa" #: src/language/stats/reliability.c:635 src/language/stats/reliability.c:649 #: src/language/stats/reliability.c:652 msgid "N of Items" msgstr "Aantal items" #: src/language/stats/reliability.c:647 msgid "Part 1" msgstr "Deel 1" #: src/language/stats/reliability.c:650 msgid "Part 2" msgstr "Deel 2" #: src/language/stats/reliability.c:654 msgid "Total N of Items" msgstr "Totaal aantal items" #: src/language/stats/reliability.c:656 msgid "Correlation Between Forms" msgstr "Correlatie tussen formulieren" #: src/language/stats/reliability.c:659 msgid "Spearman-Brown Coefficient" msgstr "Coëfficiënt van Spearman-Brown" #: src/language/stats/reliability.c:660 msgid "Equal Length" msgstr "Gelijke lengte" #: src/language/stats/reliability.c:661 msgid "Unequal Length" msgstr "Ongelijke lengte" #: src/language/stats/reliability.c:663 msgid "Guttman Split-Half Coefficient" msgstr "\"Split-half\"-coëfficiënt van Guttman" #: src/language/stats/roc.c:966 msgid "Area Under the Curve" msgstr "Gebied onder de curve" #: src/language/stats/roc.c:970 msgid "Area" msgstr "Gebied" #: src/language/stats/roc.c:976 msgid "Asymptotic Sig." msgstr "Asymptotische sign." #: src/language/stats/roc.c:979 #, c-format msgid "Asymp. %g%% Confidence Interval" msgstr "Asymp. %g%%-betrouwbaarheidsinterval" #: src/language/stats/roc.c:987 msgid "Variable under test" msgstr "Getoetste variabele" #: src/language/stats/roc.c:1026 msgid "Case Summary" msgstr "Samenvatting observaties" #: src/language/stats/roc.c:1030 msgid "Unweighted" msgstr "Niet gewogen" #: src/language/stats/roc.c:1031 msgid "Weighted" msgstr "Gewogen" #: src/language/stats/roc.c:1064 msgid "Coordinates of the Curve" msgstr "Coördinaten van de curve" #: src/language/stats/roc.c:1068 msgid "Positive if greater than or equal to" msgstr "Positief als groter dan of gelijk aan" #: src/language/stats/roc.c:1069 src/output/charts/roc-chart-cairo.c:38 msgid "Sensitivity" msgstr "Gevoeligheid" #: src/language/stats/roc.c:1069 src/output/charts/roc-chart-cairo.c:37 msgid "1 - Specificity" msgstr "1 - Specificiteit" #: src/language/stats/roc.c:1072 msgid "Coordinates" msgstr "Coördinaten" #: src/language/stats/roc.c:1076 msgid "Test variable" msgstr "Toetsvariabele" #: src/language/stats/regression.c:224 src/language/stats/regression.c:229 #, c-format msgid "VARIABLES may not appear after %s" msgstr "VARIABLES mag niet voorkomen na %s" #: src/language/stats/regression.c:412 msgid "" "REGRESSION with SAVE ignores TEMPORARY. Temporary transformations will be " "made permanent." msgstr "" "REGRESSION met SAVE negeert TEMPORARY. Tijdelijke transformaties zullen " "blijvend worden." #: src/language/stats/regression.c:416 msgid "REGRESSION with SAVE ignores FILTER. All cases will be processed." msgstr "" "REGRESSION met SAVE negeert FILTER. Alle observaties zullen worden verwerkt." #: src/language/stats/regression.c:569 msgid "" "The dependent variable is equal to the independent variable. The least " "squares line is therefore Y=X. Standard errors and related statistics may be " "meaningless." msgstr "" "De afhankelijke variabele is gelijk aan de onafhankelijke variabele. " "Daardoor is de kleinste-kwadratenlijn Y=X. Standaardfouten en aanverwante " "statistische maten zijn wellicht betekenisloos." #: src/language/stats/regression.c:776 msgid "No valid data found. This command was skipped." msgstr "Geen geldige gegevens gevonden. Deze opdracht is overgeslagen." #: src/language/stats/regression.c:863 #, c-format msgid "Model Summary (%s)" msgstr "Model-samenvatting (%s)" #: src/language/stats/regression.c:868 #: src/ui/gui/psppire-dialog-action-regression.c:42 msgid "R" msgstr "R" #: src/language/stats/regression.c:868 msgid "R Square" msgstr "R-kwadraat" #: src/language/stats/regression.c:868 msgid "Adjusted R Square" msgstr "Bijgestelde R-kwadraat" #: src/language/stats/regression.c:869 msgid "Std. Error of the Estimate" msgstr "St.-schattingsfout" #: src/language/stats/regression.c:895 #, c-format msgid "Coefficients (%s)" msgstr "Coëfficiënten (%s)" #: src/language/stats/regression.c:901 msgid "Unstandardized Coefficients" msgstr "Niet-gestandaardiseerde coëfficiënten" #: src/language/stats/regression.c:904 msgid "Standardized Coefficients" msgstr "Gestandaardiseerde coëfficiënten" #: src/language/stats/regression.c:904 msgid "Beta" msgstr "Bèta" #: src/language/stats/regression.c:911 #, c-format msgid "%g%% Confidence Interval for B" msgstr "%g%%-betrouwbaarheidsinterval voor B" #: src/language/stats/regression.c:919 msgid "Collinearity Statistics" msgstr "Statistieken betr. collineariteit" #: src/language/stats/regression.c:920 msgid "Tolerance" msgstr "Tolerantie" #: src/language/stats/regression.c:920 msgid "VIF" msgstr "VIF" #: src/language/stats/regression.c:933 msgid "(Constant)" msgstr "(Constante)" #: src/language/stats/regression.c:1020 #, c-format msgid "ANOVA (%s)" msgstr "ANOVA (%s)" #: src/language/stats/regression.c:1031 src/ui/gui/regression.ui:24 msgid "Regression" msgstr "Regressie" #: src/language/stats/regression.c:1075 #, c-format msgid "Coefficient Correlations (%s)" msgstr "Coëfficiëntcorrelaties (%s)" #: src/language/stats/regression.c:1082 msgid "Models" msgstr "Modellen" #: src/language/stats/regression.c:1090 msgid "Covariances" msgstr "Covarianties" #: src/language/stats/runs.c:169 #, c-format msgid "" "Multiple modes exist for variable `%s'. Using %.*g as the threshold value." msgstr "" "Voor variabele `%s' bestaan meerdere modes. %.*g wordt als drempelwaarde " "gebruikt." #: src/language/stats/runs.c:314 src/ui/gui/runs.ui:24 msgid "Runs Test" msgstr "\"Runs\"-toets" #: src/language/stats/runs.c:319 msgid "Test Value" msgstr "Toetswaarde" #: src/language/stats/runs.c:320 msgid "Test Value (mode)" msgstr "Toetswaarde (mode)" #: src/language/stats/runs.c:321 msgid "Test Value (mean)" msgstr "Toetswaarde (gemiddelde)" #: src/language/stats/runs.c:322 msgid "Test Value (median)" msgstr "Toetswaarde (mediaan)" #: src/language/stats/runs.c:323 msgid "Cases < Test Value" msgstr "Observaties < toetswaarde" #: src/language/stats/runs.c:324 msgid "Cases ≥ Test Value" msgstr "Observaties ≥ toetswaarde" #: src/language/stats/runs.c:325 msgid "Total Cases" msgstr "Observaties totaal" #: src/language/stats/runs.c:326 msgid "Number of Runs" msgstr "Aantal \"Runs\"" #: src/language/stats/sign.c:72 msgid "Differences" msgstr "Verschillen" #: src/language/stats/sign.c:73 msgid "Negative Differences" msgstr "Negatieve verschillen" #: src/language/stats/sign.c:74 msgid "Positive Differences" msgstr "Positieve verschillen" #: src/language/stats/sign.c:75 src/language/stats/wilcoxon.c:250 msgid "Ties" msgstr "Gelijke waarden" #: src/language/stats/sort-cases.c:63 msgid "Buffer limit must be at least 2." msgstr "Bufferlimiet moet tenminste 2 zijn." #: src/language/stats/sort-criteria.c:89 #, c-format msgid "Variable %s specified twice in sort criteria." msgstr "Variabele %s tweemaal opgegeven in sorteercriteria." #: src/language/stats/t-test-indep.c:190 msgid "Group Statistics" msgstr "Statistische maten voor groep" #: src/language/stats/t-test-indep.c:200 msgid "Group" msgstr "Groep" #: src/language/stats/t-test-indep.c:256 msgid "Independent Samples Test" msgstr "Toets voor onafhankelijke steekproeven" #: src/language/stats/t-test-indep.c:261 msgid "Levene's Test for Equality of Variances" msgstr "Toets van Levene voor gelijkheid van varianties" #: src/language/stats/t-test-indep.c:265 msgid "T-Test for Equality of Means" msgstr "T-toets voor gelijkheid van gemiddelden" #: src/language/stats/t-test-indep.c:269 #: src/language/stats/t-test-one-sample.c:77 msgid "Mean Difference" msgstr "Gemiddeld verschil" #: src/language/stats/t-test-indep.c:270 msgid "Std. Error Difference" msgstr "St.fout van verschil" #: src/language/stats/t-test-indep.c:273 #, fuzzy, no-c-format #| msgid "%g%% Confidence Interval of the Difference" msgid "95% Confidence Interval of the Difference" msgstr "%g%%-betrouwbaarheidsinterval voor verschil" # msgid "95% Confidence Interval of the Difference" # msgstr "95% betrouwbaarheidsinterval voor verschil" #: src/language/stats/t-test-indep.c:277 msgid "Assumptions" msgstr "Aannamen" #: src/language/stats/t-test-indep.c:278 msgid "Equal variances assumed" msgstr "Aangenomen dat varianties gelijk zijn" #: src/language/stats/t-test-indep.c:279 msgid "Equal variances not assumed" msgstr "Niet aangenomen dat varianties gelijk zijn" #: src/language/stats/t-test-one-sample.c:64 msgid "One-Sample Test" msgstr "Toets voor één steekproef" #: src/language/stats/t-test-one-sample.c:71 #, c-format msgid "Test Value = %.*g" msgstr "Toetswaarde = %.*g" #: src/language/stats/t-test-one-sample.c:80 #: src/language/stats/t-test-paired.c:246 #, c-format msgid "%g%% Confidence Interval of the Difference" msgstr "%g%%-betrouwbaarheidsinterval voor verschil" #: src/language/stats/t-test-one-sample.c:122 msgid "One-Sample Statistics" msgstr "Statistische maten voor één steekproef" #: src/language/stats/t-test-paired.c:147 msgid "Paired Sample Statistics" msgstr "Statistische maten voor gepaarde steekproeven" #: src/language/stats/t-test-paired.c:163 #: src/language/stats/t-test-paired.c:205 #: src/language/stats/t-test-paired.c:263 #, c-format msgid "Pair %zu" msgstr "Paar %zu" #: src/language/stats/t-test-paired.c:190 msgid "Paired Samples Correlations" msgstr "Correlaties voor gepaarde steekproeven" #: src/language/stats/t-test-paired.c:208 #, c-format msgid "%s & %s" msgstr "%s & %s" #: src/language/stats/t-test-paired.c:234 msgid "Paired Samples Test" msgstr "Toets voor gepaarde steekproeven" #: src/language/stats/t-test-paired.c:240 msgid "Paired Differences" msgstr "Gepaarde verschillen" #: src/language/stats/t-test-paired.c:266 #, c-format msgid "%s - %s" msgstr "%s - %s" #: src/language/stats/t-test-parser.c:133 #, c-format msgid "When applying %s to a string variable, two values must be specified." msgstr "" "Bij het toepassen van %s op een alfanumerieke variabele moeten twee waarden " "worden opgegeven." #: src/language/stats/t-test-parser.c:145 #: src/language/stats/t-test-parser.c:241 #, c-format msgid "%s subcommand may not be used with %s." msgstr "Subopdracht %s mag niet gebruikt worden met %s." #: src/language/stats/t-test-parser.c:305 msgid "Exactly one of TESTVAL, GROUPS and PAIRS subcommands must be specified." msgstr "" "Precies één van de subopdrachten TESTVAL, GROUPS of PAIRS moet worden " "opgegeven." #: src/language/stats/wilcoxon.c:248 msgid "Sign" msgstr "Teken" #: src/language/stats/wilcoxon.c:249 msgid "Negative Ranks" msgstr "Negatieve rangen" #: src/language/stats/wilcoxon.c:249 msgid "Positive Ranks" msgstr "Positieve rangen" #: src/language/stats/wilcoxon.c:296 msgid "Too many pairs to calculate exact significance" msgstr "Teveel paren om precieze significantie te kunnen berekenen" #: src/language/data-io/combine-files.c:214 msgid "Cannot specify the active dataset since none has been defined." msgstr "" "De actieve dataset kan niet worden gespecificeerd omdat er geen actieve " "dataset is gedefinieerd." #: src/language/data-io/combine-files.c:220 msgid "" "This command may not be used after TEMPORARY when the active dataset is an " "input source. Temporary transformations will be made permanent." msgstr "" "Deze opdracht mag niet gebruikt worden na TEMPORARY als de actieve dataset " "een invoerbron is. Tijdelijke transformaties zullen blijvend worden." #: src/language/data-io/combine-files.c:255 msgid "Multiple IN subcommands for a single FILE or TABLE." msgstr "Meerdere IN-subopdrachten voor een enkele FILE of TABLE." #: src/language/data-io/combine-files.c:308 #, c-format msgid "File %s lacks BY variable %s." msgstr "Bestand %s mist de BY-variabele %s." #: src/language/data-io/combine-files.c:311 #, c-format msgid "Active dataset lacks BY variable %s." msgstr "Actieve dataset mist de BY-variabele %s." #: src/language/data-io/combine-files.c:388 #: src/language/data-io/combine-files.c:393 #, c-format msgid "BY is required when %s is specified." msgstr "BY is vereist als %s is opgegeven." #: src/language/data-io/combine-files.c:521 msgid "" "Combining files with incompatible encodings. String data may not be " "represented correctly." msgstr "" "Bestanden met incompatibele codering worden gecombineerd. Tekenreeks-" "gegevens worden mogelijk niet correct weergegeven." #: src/language/data-io/combine-files.c:564 #, c-format msgid "" "Variable %s in file %s has different type or width from the same variable in " "earlier file." msgstr "" "Variabele %s in bestand %s verschilt qua type of breedte van dezelfde " "variabele in eerder bestand." #: src/language/data-io/combine-files.c:570 #, c-format msgid "In file %s, %s is numeric." msgstr "In bestand %s is %s numeriek." #: src/language/data-io/combine-files.c:573 #, c-format msgid "In file %s, %s is a string variable with width %d." msgstr "In bestand %s is %s een alfanumerieke variabele met breedte %d." #: src/language/data-io/combine-files.c:578 #, c-format msgid "In an earlier file, %s was numeric." msgstr "In een eerder bestand was %s numeriek." #: src/language/data-io/combine-files.c:581 #, c-format msgid "In an earlier file, %s was a string variable with width %d." msgstr "" "In een eerder bestand was %s een alfanumerieke variabele met breedte %d." #: src/language/data-io/combine-files.c:621 #, c-format msgid "" "Variable name %s specified on %s subcommand duplicates an existing variable " "name." msgstr "" "Variabelennaam %s, opgegeven in subopdracht %s, is hetzelfde als een " "bestaande variabelenaam." #: src/language/data-io/combine-files.c:793 #, c-format msgid "Encountered %zu sets of duplicate cases in the master file." msgstr "Gevonden% zu sets van dubbele observaties in het master-bestand." #: src/language/data-io/data-list.c:129 src/language/data-io/data-list.c:144 #, c-format msgid "The %s value must be non-negative." msgstr "De %s waarde mag niet negatief zijn." #: src/language/data-io/data-list.c:154 #, c-format msgid "The %s subcommand may only be used within %s." msgstr "De subopdracht %s mag alleen binnen %s gebruikt worden." #: src/language/data-io/data-list.c:159 #, c-format msgid "The %s subcommand may only be specified once." msgstr "De subopdracht %s mag slechts één keer worden opgegeven." #: src/language/data-io/data-list.c:197 msgid "Only one of FIXED, FREE, or LIST may be specified." msgstr "Slechts één van FIXED, FREE of LIST mag gespecificeerd worden." #: src/language/data-io/data-list.c:260 msgid "Encoding should not be specified for inline data. It will be ignored." msgstr "" "Codering mag niet opgegeven worden voor inline-gegevens. Deze wordt " "genegeerd." #: src/language/data-io/data-list.c:269 #, c-format msgid "The %s subcommand may be used only with %s." msgstr "De subopdracht %s mag alleen gebruikt worden met %s." #: src/language/data-io/data-list.c:284 src/language/data-io/matrix-data.c:578 msgid "At least one variable must be specified." msgstr "Tenminste één variabele moet worden opgegeven." #: src/language/data-io/data-list.c:383 src/language/data-io/data-list.c:491 #: src/language/data-io/get-data.c:662 #, c-format msgid "%s is a duplicate variable name." msgstr "%s is een eerder gebruikte variabelenaam." #: src/language/data-io/data-list.c:390 #, c-format msgid "There is already a variable %s of a different type." msgstr "Er is reeds een variabele %s van een ander type." #: src/language/data-io/data-list.c:397 #, c-format msgid "There is already a string variable %s of a different width." msgstr "Er is reeds een alfanumerieke variabele %s van een andere breedte." #: src/language/data-io/data-list.c:405 #, c-format msgid "Cannot place variable %s on record %d when RECORDS=%d is specified." msgstr "" "Kan variabele %s niet plaatsen op kaart %d als RECORDS=%d is opgegeven." #: src/language/data-io/data-parser.c:453 #: src/language/data-io/data-parser.c:462 msgid "Quoted string extends beyond end of line." msgstr "Aangehaalde tekenreeks loopt door na regeleinde." #: src/language/data-io/data-parser.c:488 msgid "Missing delimiter following quoted string." msgstr "Ontbrekend scheidingsteken na aangehaalde tekenreeks." #: src/language/data-io/data-parser.c:506 #, c-format msgid "Data for variable %s is not valid as format %s: %s" msgstr "Data voor variabele %s is niet geldig als opmaak %s: %s" #: src/language/data-io/data-parser.c:536 #, c-format msgid "Partial case of %d of %d records discarded." msgstr "Gedeeltelijke observatie van %d van %d kaarten genegeerd." #: src/language/data-io/data-parser.c:592 #, c-format msgid "Partial case discarded. The first variable missing was %s." msgstr "" "Gedeeltelijke observatie is verwijderd. De eerste gemiste variabele was %s." #: src/language/data-io/data-parser.c:634 #, c-format msgid "" "Missing value(s) for all variables from %s onward. These will be filled " "with the system-missing value or blanks, as appropriate." msgstr "" "Ontbrekende waarde(n) voor alle variabelen vanaf %s. Deze worden gevuld met " "de system-missing waarde of spaties, zoals passend.." #: src/language/data-io/data-parser.c:655 msgid "Record ends in data not part of any field." msgstr "Kaart eindigt in gegevens die geen onderdeel zijn van enig veld." #: src/language/data-io/data-parser.c:670 #, c-format msgid "Reading %d record from %s." msgid_plural "Reading %d records from %s." msgstr[0] "Kaart %d van %s wordt gelezen." msgstr[1] "%d van %s kaarten worden gelezen." #: src/language/data-io/data-parser.c:680 src/language/data-io/print.c:435 msgid "Record" msgstr "Kaart" #: src/language/data-io/data-parser.c:680 src/language/data-io/print.c:435 #: src/ui/gui/psppire-var-sheet-header.c:76 msgid "Columns" msgstr "Kolommen" #: src/language/data-io/data-parser.c:680 #: src/language/data-io/data-parser.c:725 src/language/data-io/print.c:435 msgid "Format" msgstr "Indeling" #: src/language/data-io/data-parser.c:720 #, c-format msgid "Reading free-form data from %s." msgstr "Gelezen worden vrije-vormgegevens van %s." #. TRANSLATORS: this fragment will be interpolated into #. messages in fh_lock() that identify types of files. #: src/language/data-io/data-reader.c:136 src/language/data-io/data-writer.c:79 msgid "data file" msgstr "gegevensbestand" #: src/language/data-io/data-reader.c:160 #, c-format msgid "Could not open `%s' for reading as a data file: %s." msgstr "Kon `%s' niet openen voor lezen als gegevensbestand: %s." #: src/language/data-io/data-reader.c:174 #, c-format msgid "Could not read `%s' as a text file with encoding `%s': %s." msgstr "Kon `%s' niet lezen als een tekstbestand met codering `%s': %s." #: src/language/data-io/data-reader.c:233 #, c-format msgid "" "Missing %s while reading inline data. This probably indicates a missing or " "incorrectly formatted %s command. %s must appear by itself on a single line " "with exactly one space between words." msgstr "" "Mis %s tijdens het lezen van \"inline\"-gegevens. Dit duidt waarschijnlijk " "op een ontbrekende of onjuist ingedeelde %s-opdracht. %s moet alleen en op " "een enkele regel staan, met precies één spatie tussen de woorden." #: src/language/data-io/data-reader.c:253 #: src/language/data-io/data-reader.c:387 #, c-format msgid "Error reading file %s: %s." msgstr "Fout tijdens lezen bestand %s: %s." #: src/language/data-io/data-reader.c:261 #, c-format msgid "Unexpected end of file in partial record reading %s." msgstr "Onverwacht einde van bestand in gedeeltelijke kaart bij lezen van %s." #: src/language/data-io/data-reader.c:321 #, c-format msgid "Corrupt block descriptor word at offset 0x%lx in %s." msgstr "Beschadigd blokbeschrijvend woord op positie 0x%lx in %s." #: src/language/data-io/data-reader.c:322 #, c-format msgid "Corrupt record descriptor word at offset 0x%lx in %s." msgstr "Beschadigd kaartbeschrijvend woord op positie 0x%lx in %s." #: src/language/data-io/data-reader.c:335 #, c-format msgid "Corrupt record size at offset 0x%lx in %s." msgstr "Beschadigde kaartgrootte op positie 0x%lx in %s." #: src/language/data-io/data-reader.c:493 msgid "Record exceeds remaining block length." msgstr "Kaart overschrijdt resterende bloklengte." #: src/language/data-io/data-reader.c:567 #, c-format msgid "Attempt to read beyond end-of-file on file %s." msgstr "Poging om te lezen na einde-bestand in bestand %s." #: src/language/data-io/data-reader.c:570 #, c-format msgid "Attempt to read beyond %s." msgstr "Poging om te lezen na %s." #: src/language/data-io/data-reader.c:733 msgid "" "This command is not valid here since the current input program does not " "access the inline file." msgstr "" "Deze opdracht is hier niet geldig omdat het huidige invoerprogramma geen " "toegang zoekt tot het \"inline\"-bestand." #: src/language/data-io/data-writer.c:106 #, c-format msgid "An error occurred while opening `%s' for writing as a data file: %s." msgstr "" "Fout opgetreden tijdens het openen van `%s' voor schrijven als " "gegevensbestand: %s." #: src/language/data-io/data-writer.c:224 #, c-format msgid "I/O error occurred writing data file `%s'." msgstr "" "Invoer-/uitvoerfout opgetreden tijdens schrijven van gegevensbestand `%s'." #: src/language/data-io/dataset.c:64 #, c-format msgid "There is no dataset named %s." msgstr "Er is geen dataset genaamd %s." #: src/language/data-io/dataset.c:250 msgid "Datasets" msgstr "Datasets" #: src/language/data-io/dataset.c:263 msgid "unnamed dataset" msgstr "naamloze dataset" #: src/language/data-io/file-handle.c:61 #, c-format msgid "" "File handle %s is already defined. Use %s before redefining a file handle." msgstr "" "\"File handle\" %s is reeds gedefinieerd. Gebruik %s vóór het herdefiniëren " "van een file handle." #: src/language/data-io/file-handle.c:241 #, c-format msgid "%s must be specified with %s." msgstr "%s moet opgegeven worden met %s." #: src/language/data-io/file-handle.c:252 #, c-format msgid "" "The specified file mode requires LRECL. Assuming %zu-character records." msgstr "" "De opgegeven bestandsmodus vereist LRECL. Aangenomen wordt dat kaarten %zu " "tekens bevatten." #: src/language/data-io/file-handle.c:256 #, c-format msgid "" "Record length (%d) must be between 1 and %lu bytes. Assuming %zu-character " "records." msgstr "" "Kaartlengte (%d) moet tussen 1 en %lu bytes liggen. Aangenomen wordt dat " "kaarten %zu tekens bevatten." #: src/language/data-io/file-handle.c:300 msgid "file" msgstr "bestand" #: src/language/data-io/file-handle.c:302 msgid "inline file" msgstr "\"inline\"-bestand" #: src/language/data-io/file-handle.c:350 msgid "expecting a file name or handle name" msgstr "bestandsnaam of \"handle\"-naam verwacht" #: src/language/data-io/file-handle.c:365 #, c-format msgid "Handle for %s not allowed here." msgstr "\"Handle\" voor %s is hier niet toegestaan." #: src/language/data-io/get-data.c:108 src/output/measure.c:262 #, c-format msgid "error reading file `%s'" msgstr "fout bij lezen van bestand `%s'" #: src/language/data-io/get-data.c:127 #, c-format msgid "Unsupported TYPE %s." msgstr "Niet-ondersteund TYPE %s." #: src/language/data-io/get-data.c:278 msgid "The sheet index must be greater than or equal to 1" msgstr "De blad-index moet groter dan of gelijk aan 1 zijn" #: src/language/data-io/get-data.c:285 src/language/data-io/get-data.c:308 #: src/language/data-io/get-data.c:327 #, c-format msgid "%s must be followed by either \"%s\" or \"%s\"." msgstr "%s moet gevolgd worden door \"%s\" of \"%s\"." #: src/language/data-io/get-data.c:357 #, c-format msgid "" "%s is allowed only with %s arrangement, but %s arrangement was stated or " "implied earlier in this command." msgstr "" "%s is alleen toegestaan met %s regeling, maar %s regeling was eerder in deze " "opdracht opgegeven of geïmpliceerd." #: src/language/data-io/get-data.c:441 src/language/data-io/get-data.c:479 #, c-format msgid "Value of %s must be 1 or greater." msgstr "Waarde van %s moet 1 of groter zijn." #: src/language/data-io/get-data.c:504 msgid "" "Ignoring obsolete IMPORTCASES subcommand. (N OF CASES or SAMPLE may be used " "to substitute.)" msgstr "" "Verouderde subopdracht IMPORTCASES wordt genegeerd. (N OF CASES of SAMPLE " "kan als vervanging worden gebruikt.)" #: src/language/data-io/get-data.c:551 msgid "" "In compatible syntax mode, the QUALIFIER string must contain exactly one " "character." msgstr "" "In compatibele syntaxmodus moet de QUALIFIER-tekenreeks precies één teken " "bevatten." #: src/language/data-io/get-data.c:583 #, c-format msgid "" "The record number specified, %ld, is at or before the previous record, %d. " "Data fields must be listed in order of increasing record number." msgstr "" "Het opgegeven kaartnummer, %ld, ligt op of vóór de huidige kaart, %d. " "Gegevensvelden moeten worden opgegeven in oplopende volgorde van kaartnummer." #: src/language/data-io/get-data.c:592 #, c-format msgid "" "The record number specified, %ld, exceeds the number of records per case " "specified on FIXCASE, %d." msgstr "" "Het opgegevene kaartnummer, %ld, overschrijdt het aantal kaarten per " "observatie zoals opgegeven bij FIXCASE, %d." #: src/language/data-io/get.c:132 #, c-format msgid "%s: Data file dictionary has no variables." msgstr "%s: woordenboek van gegevensbestand bevat geen variabelen." #: src/language/data-io/inpt-pgm.c:133 #, c-format msgid "Unexpected end-of-file within %s." msgstr "Onverwacht einde-bestand binnen %s." #: src/language/data-io/inpt-pgm.c:146 #, c-format msgid "Input program must contain %s or %s." msgstr "Invoerprogramma moet %s of %s bevatten." #: src/language/data-io/inpt-pgm.c:152 msgid "Input program did not create any variables." msgstr "Invoerprogramma heeft geen variabelen aangemaakt." #: src/language/data-io/inpt-pgm.c:365 msgid "" "REREAD: Column numbers must be positive finite numbers. Column set to 1." msgstr "" "REREAD: kolomnummers moeten positieve eindige nummers zijn. Kolom is op 1 " "gezet." #: src/language/data-io/list.c:100 msgid "Data List" msgstr "Data List" #: src/language/data-io/list.c:221 #, c-format msgid "" "The first case (%ld) specified precedes the last case (%ld) specified. The " "values will be swapped." msgstr "" "De eerste opgegeven observatie (%ld) gaat vooraf aan de laatste opgegeven " "observatie (%ld). De waarden zullen worden omgewisseld." #: src/language/data-io/list.c:230 #, c-format msgid "" "The first case (%ld) to list is numbered less than 1. The value is being " "reset to 1." msgstr "" "De eerste observatie (%ld) om weer te geven heeft een nummer kleiner dan 1. " "De waarde wordt op 1 gezet." #: src/language/data-io/list.c:237 #, c-format msgid "" "The last case (%ld) to list is numbered less than 1. The value is being " "reset to 1." msgstr "" "De laatste observatie (%ld) om weer te geven heeft een nummer kleiner dan 1. " "De waarde wordt op 1 gezet." #: src/language/data-io/list.c:244 #, c-format msgid "The step value %ld is less than 1. The value is being reset to 1." msgstr "De stapwaarde %ld is kleiner dan 1. De waarde wordt op 1 gezet." #: src/language/data-io/placement-parser.c:96 #, c-format msgid "" "Number of variables specified (%zu) differs from number of variable formats " "(%zu)." msgstr "" "Aantal opgegeven variabelen (%zu) verschilt van aantal variabele-indelingen " "(%zu)." #: src/language/data-io/placement-parser.c:106 msgid "" "SPSS-like or Fortran-like format specification expected after variable names." msgstr "" "SPSS- of Fortran-achtige indelingsspecificatie verwacht na variabelenamen." #: src/language/data-io/placement-parser.c:129 #, c-format msgid "The %d columns %d-%d can't be evenly divided into %zu fields." msgstr "De %d kolommen %d-%d kunnen niet gelijk verdeeld worden in %zu velden." #: src/language/data-io/placement-parser.c:310 msgid "Column positions for fields must be positive." msgstr "Kolomposities voor velden moeten positief zijn." #: src/language/data-io/placement-parser.c:312 msgid "Column positions for fields must not be negative." msgstr "Kolomposities voor velden mogen niet negatief zijn." #: src/language/data-io/placement-parser.c:372 msgid "The ending column for a field must be greater than the starting column." msgstr "De eindkolom voor een veld moet groter zijn dan de beginkolom." #: src/language/data-io/placement-parser.c:409 #, fuzzy, c-format #| msgid "" #| "The record number specified, %ld, is at or before the previous record, " #| "%d. Data fields must be listed in order of increasing record number." msgid "" "The record number specified, %.0f, is at or before the previous record, %d. " "Data fields must be listed in order of increasing record number." msgstr "" "Het opgegeven kaartnummer, %ld, ligt op of vóór de huidige kaart, %d. " "Gegevensvelden moeten worden opgegeven in oplopende volgorde van kaartnummer." #: src/language/data-io/print-space.c:127 #, c-format msgid "The expression on %s evaluated to the system-missing value." msgstr "De expressie bij %s evalueerde tot de system-missing waarde." #: src/language/data-io/print-space.c:130 #, c-format msgid "The expression on %s evaluated to %g." msgstr "De expressie bij %s evalueerde tot %g." #: src/language/data-io/print.c:189 src/language/data-io/trim.c:58 msgid "expecting a valid subcommand" msgstr "een geldige subopdracht wordt verwacht" #: src/language/data-io/print.c:219 #, c-format msgid "%s is required when binary formats are specified." msgstr "%s is vereist als binaire indelingen worden gespecificieerd." #: src/language/data-io/print.c:302 #, c-format msgid "Output calls for %d records but %zu specified on RECORDS subcommand." msgstr "" "De uitvoer vraagt om %d kaarten, maar in de RECORDS-subopdracht zijn er %zu " "opgegeven." #: src/language/data-io/print.c:432 msgid "Print Summary" msgstr "Druk samenvatting af" #: src/language/data-io/print.c:462 msgid "N of Records" msgstr "Aantal kaarten" #: src/language/data-io/matrix-data.c:191 #, c-format msgid "" "There are %d variable declared but the data has at least %d matrix rows." msgstr "" "Er worden %d variabelen gedeclareerd, maar de matrix heeft ten minste %d " "matrixrijen." #: src/language/data-io/matrix-data.c:292 msgid "" "The N subcommand was specified, but a N record was also found in the data. " "The N record will be ignored." msgstr "" "Subopdracht N is gegeven, maar een N-kaart is ook in de gegevens " "aangetroffen. De N-kaart wordt genegeerd." #: src/language/data-io/matrix-data.c:488 src/language/utilities/set.q:186 #, c-format msgid "%s must not be negative." msgstr "%s mag niet negatief zijn." #: src/language/data-io/matrix-data.c:568 msgid "FORMAT = FULL and FORMAT = NODIAGONAL are mutually exclusive." msgstr "FORMAT=FULL en FORMAT=NODIAGONAL sluiten elkaar uit." #: src/language/data-io/matrix-reader.c:102 #: src/language/data-io/matrix-reader.c:118 #, c-format msgid "Matrix dataset lacks a variable called %s." msgstr "Matrix-dataset mist een variabele genaamd %s." #: src/language/data-io/matrix-reader.c:109 #: src/language/data-io/matrix-reader.c:125 #, c-format msgid "Matrix dataset variable %s should be of string type." msgstr "De matrix-datasetvariabele %s moet alfanumeriek zijn." #: src/language/data-io/save-translate.c:168 #: src/language/data-io/save-translate.c:183 #, c-format msgid "The %s string must contain exactly one character." msgstr "De %s-tekenreeks moet precies één teken bevatten." #: src/language/data-io/save-translate.c:249 #, c-format msgid "Output file `%s' exists but %s was not specified." msgstr "Uitvoerbestand `%s' bestaat maar %s was niet opgegeven." #: src/language/data-io/save.c:309 msgid "The OUTFILE or METADATA subcommand is required." msgstr "De OUITFILE- of METADATA-subopdracht is verplicht." #: src/language/data-io/trim.c:69 #, c-format msgid "" "Cannot rename %s as %s because there already exists a variable named %s. To " "rename variables with overlapping names, use a single RENAME subcommand such " "as `/RENAME (A=B)(B=C)(C=A)', or equivalently, `/RENAME (A B C=B C A)'." msgstr "" "Kan %s niet hernoemen naar %s omdat er al een variabele met genaamd %s " "bestaat. Gebruik, om variabelen met overlappende namen te hernoemen, een " "enkele RENAME-subopdracht zoals '/RENAME (A=B)(B=C)(C=A)', of gelijkwaardig, " "'/R,ENAME (A B C=B C A)'." #: src/language/data-io/trim.c:227 #, c-format msgid "" "Number of variables on left side of `=' (%zu) does not match number of " "variables on right side (%zu), in parenthesized group %d of RENAME " "subcommand." msgstr "" "Aantal variabelen aan linkerzijde van `=' (%zu) komt niet overeen met aantal " "variabelen aan rechterzijde (%zu), in groep tussen haakjes %d van RENAME-" "subopdracht." #: src/language/data-io/trim.c:242 #, c-format msgid "Requested renaming duplicates variable name %s." msgstr "Gevraagde hernoeming dupliceert variabelenaam %s." #: src/language/data-io/trim.c:281 msgid "Cannot DROP all variables from dictionary." msgstr "Kan niet alle variabelen verwijderen (DROP) uit woordenboek." #: src/language/expressions/evaluate.c:151 msgid "expecting number or string" msgstr "getal of tekenreeks wordt verwacht" #: src/language/expressions/helpers.c:43 msgid "" "One of the arguments to a DATE function is not an integer. The result will " "be system-missing." msgstr "" "Een van de argumenten voor een DATE-functie is geen geheel getal. Het " "resultaat zal system-missing zijn." #: src/language/expressions/helpers.c:71 msgid "" "The week argument to DATE.WKYR is not an integer. The result will be system-" "missing." msgstr "" "Het week-argument voor DATE.WKYR is geen geheel getal. Het resultaat zal " "system-missing zijn." #: src/language/expressions/helpers.c:77 msgid "" "The week argument to DATE.WKYR is outside the acceptable range of 1 to 53. " "The result will be system-missing." msgstr "" "Het week-argument voor DATE.WKYR ligt buiten het acceptabele bereik van 1 " "tot en met 53. Het resultaat zal system-missing zijn." #: src/language/expressions/helpers.c:99 msgid "" "The day argument to DATE.YRDAY is not an integer. The result will be system-" "missing." msgstr "" "Het dag-argument voor DATE.WKYR is geen geheel getal. Het resultaat zal " "system-missing zijn." #: src/language/expressions/helpers.c:105 msgid "" "The day argument to DATE.YRDAY is outside the acceptable range of 1 to 366. " "The result will be system-missing." msgstr "" "Het dag-argument voor DATE.WKYR ligt buiten het acceptabele bereik van 1 tot " "en met 366. Het resultaat zal system-missing zijn." #: src/language/expressions/helpers.c:127 msgid "" "The year argument to YRMODA is greater than 47516. The result will be " "system-missing." msgstr "" "Het jaar-argument voor YRMODA is groter dan 47516. Het resultaat zal system-" "missing zijn." #: src/language/expressions/helpers.c:180 #, c-format msgid "" "Unrecognized date unit `%.*s'. Valid date units are `%s', `%s', `%s', `%s', " "`%s', `%s', `%s', and `%s'." msgstr "" "Niet-herkende datumeenheid `%.*s'. Geldige datumeenheden zijn `%s', `%s', `" "%s', `%s', `%s', `%s', `%s' en `%s'." #: src/language/expressions/helpers.c:333 #, c-format msgid "Invalid DATESUM method. Valid choices are `%s' and `%s'." msgstr "Ongeldige DATESUM-methode. Geldige keuzes zijn `%s' en `%s'." #: src/language/expressions/parse.c:261 #, c-format msgid "" "Type mismatch: expression has %s type, but a numeric value is required here." msgstr "" "Type komt niet overeen: expressie heeft type %s, maar hier is een numerieke " "waarde verplicht." #: src/language/expressions/parse.c:274 #, c-format msgid "" "Type mismatch: expression has %s type, but a string value is required here." msgstr "" "Type komt niet overeen: expressie heeft type %s, maar hier is een " "alfanumerieke waarde verplicht." #: src/language/expressions/parse.c:436 #, c-format msgid "Type mismatch while applying %s operator: cannot convert %s to %s." msgstr "" "Type komt niet overeen bij toepassen van %s-operator: kan %s niet naar %s " "omzetten." #: src/language/expressions/parse.c:650 msgid "" "Chaining relational operators (e.g. `a < b < c') will not produce the " "mathematically expected result. Use the AND logical operator to fix the " "problem (e.g. `a < b AND b < c'). If chaining is really intended, " "parentheses will disable this warning (e.g. `(a < b) < c'.)" msgstr "" "Achter elkaar zetten van relationele operatoren (bijv. `a < b < c') zal niet " "het verwachte resultaat opleveren. Gebruik de logische operator AND om het " "probleem te verhelpen (bijv. `a < b AND b < c'). Als achter elkaar zetten " "werkelijk de bedoeling is, zullen haakjes deze waarschuwing uitschakelen " "(bijv. `(a < b) < c')." #: src/language/expressions/parse.c:752 msgid "" "The exponentiation operator (`**') is left-associative, even though right-" "associative semantics are more useful. That is, `a**b**c' equals " "`(a**b)**c', not as `a**(b**c)'. To disable this warning, insert " "parentheses." msgstr "" "De machtsverheffings-operator (`**') is links-associatief, hoewel rechts-" "associatieve semantiek bruikbaarder is. D.w.z., `a**b**c' komt overeen met " "`(a**b)**c', niet met `a**(b**c)'. Gebruik haakjes om deze waarschuwing uit " "te schakelen." #: src/language/expressions/parse.c:832 #, c-format msgid "Unknown system variable %s." msgstr "Onbekende systeemvariabele %s." #: src/language/expressions/parse.c:880 #, c-format msgid "Unknown identifier %s." msgstr "Onbekende identificator %s." #: src/language/expressions/parse.c:1102 #, c-format msgid "%s must have at least %d arguments in list." msgstr "%s heeft tenminste %d argumenten nodig in lijst." #: src/language/expressions/parse.c:1111 #, c-format msgid "%s must have an even number of arguments in list." msgstr "%s heeft een even aantal argumenten nodig in lijst." #: src/language/expressions/parse.c:1114 #, c-format msgid "%s must have multiple of %d arguments in list." msgstr "%s heeft veelvoud van %d argumenten nodig in lijst." #: src/language/expressions/parse.c:1124 #, c-format msgid "%s function does not accept a minimum valid argument count." msgstr "%s-functie accepteert geen \"minimum valid argument count\"." #: src/language/expressions/parse.c:1133 #, c-format msgid "%s requires at least %d valid arguments in list." msgstr "%s vereist tenminste %d geldige argumenten in lijst." #: src/language/expressions/parse.c:1139 #, c-format msgid "" "With %s, using minimum valid argument count of %d does not make sense when " "passing only %d arguments in list." msgstr "" "Met %s heeft het gebruik van de \"minimum valid argument count\" van %d geen " "zin als een lijst van slechts %d argumenten wordt doorgegeven." #: src/language/expressions/parse.c:1193 #, c-format msgid "Type mismatch invoking %s as " msgstr "Type komt niet overeen bij aanroep van %s als " #: src/language/expressions/parse.c:1198 msgid "Function invocation " msgstr "Functie-aanroep " #: src/language/expressions/parse.c:1200 msgid " does not match any known function. Candidates are:" msgstr " komt niet overeen met enige bekende functie. Kandidaten zijn:" #: src/language/expressions/parse.c:1230 #, c-format msgid "No function or vector named %s." msgstr "Geen functie of vector genaamd %s." #: src/language/expressions/parse.c:1292 #, c-format msgid "%s is a PSPP extension." msgstr "%s is een PSPP-uitbreiding." #: src/language/expressions/parse.c:1295 #, c-format msgid "%s is not available in this version of PSPP." msgstr "%s is niet beschikbaar in deze versie van PSPP." #: src/language/expressions/parse.c:1302 #, c-format msgid "%s may not appear after %s." msgstr "%s mag niet voorkomen na %s." #: src/libpspp/ext-array.c:66 msgid "failed to create temporary file" msgstr "aanmaken van tijdelijk bestand is mislukt" #: src/libpspp/ext-array.c:106 msgid "seeking in temporary file" msgstr "in tijdelijk bestand wordt gezocht" #: src/libpspp/ext-array.c:125 msgid "reading temporary file" msgstr "tijdelijk bestand wordt gelezen" #: src/libpspp/ext-array.c:127 msgid "unexpected end of file reading temporary file" msgstr "onverwacht einde-bestand bij lezen van tijdelijk bestand" #: src/libpspp/ext-array.c:147 msgid "writing to temporary file" msgstr "schrijven naar tijdelijk bestand" #: src/libpspp/i18n.c:1128 msgid "Arabic" msgstr "Arabisch" #: src/libpspp/i18n.c:1130 msgid "Armenian" msgstr "Armeens" #: src/libpspp/i18n.c:1131 msgid "Baltic" msgstr "Baltisch" #: src/libpspp/i18n.c:1133 msgid "Celtic" msgstr "Keltisch" #: src/libpspp/i18n.c:1134 msgid "Central European" msgstr "Centraal-Europees" #: src/libpspp/i18n.c:1136 msgid "Chinese Simplified" msgstr "Vereenvoudigd Chinees" #: src/libpspp/i18n.c:1138 msgid "Chinese Traditional" msgstr "Traditioneel Chinees" #: src/libpspp/i18n.c:1140 msgid "Croatian" msgstr "Croatisch" #: src/libpspp/i18n.c:1141 msgid "Cyrillic" msgstr "Cyrillisch" #: src/libpspp/i18n.c:1143 msgid "Cyrillic/Russian" msgstr "Cyrillisch/Russisch" #: src/libpspp/i18n.c:1144 msgid "Cyrillic/Ukrainian" msgstr "Cyrillisch/Oekraïens" #: src/libpspp/i18n.c:1146 msgid "Georgian" msgstr "Georgisch" #: src/libpspp/i18n.c:1147 msgid "Greek" msgstr "Grieks" #: src/libpspp/i18n.c:1148 msgid "Gujarati" msgstr "Gujarati" #: src/libpspp/i18n.c:1149 msgid "Gurmukhi" msgstr "Gurmukhi" #: src/libpspp/i18n.c:1150 msgid "Hebrew" msgstr "Hebreeuws" #: src/libpspp/i18n.c:1152 msgid "Hebrew Visual" msgstr "Hebreeuws visueel" #: src/libpspp/i18n.c:1153 msgid "Hindi" msgstr "Hindi" #: src/libpspp/i18n.c:1154 msgid "Icelandic" msgstr "IJslands" #: src/libpspp/i18n.c:1155 msgid "Japanese" msgstr "Japans" #: src/libpspp/i18n.c:1157 msgid "Korean" msgstr "Koreaans" #: src/libpspp/i18n.c:1159 msgid "Nordic" msgstr "Noors" #: src/libpspp/i18n.c:1160 msgid "Romanian" msgstr "Roemeens" #: src/libpspp/i18n.c:1162 msgid "South European" msgstr "Zuid-Europees" #: src/libpspp/i18n.c:1163 msgid "Thai" msgstr "Thais" #: src/libpspp/i18n.c:1165 msgid "Turkish" msgstr "Turks" #: src/libpspp/i18n.c:1167 msgid "Vietnamese" msgstr "Vietnamees" #: src/libpspp/i18n.c:1169 msgid "Western European" msgstr "West-Europees" #: src/libpspp/message.c:89 #, c-format msgid "%s: %s" msgstr "%s: %s" #: src/libpspp/message.c:113 msgid "error" msgstr "fout" #: src/libpspp/message.c:115 msgid "warning" msgstr "waarschuwing" #: src/libpspp/message.c:118 msgid "note" msgstr "opmerking" #: src/libpspp/message.c:327 #, c-format msgid "Notes (%d) exceed limit (%d). Suppressing further notes." msgstr "" "Opmerkingen (%d) overschrijden limiet (%d). Verdere opmerkingen worden " "onderdrukt." #: src/libpspp/message.c:335 #, c-format msgid "Warnings (%d) exceed limit (%d). Syntax processing will be halted." msgstr "" "Waarschuwingen (%d) overschrijden limiet (%d). Syntaxverwerking wordt " "gestopt." #: src/libpspp/message.c:338 #, c-format msgid "Errors (%d) exceed limit (%d). Syntax processing will be halted." msgstr "" "Fouten (%d) overschrijden limiet (%d). Syntaxverwerking wordt gestopt." #: src/libpspp/zip-reader.c:202 #, c-format msgid "%s: corrupt archive at 0x%llx: expected %# but got %#" msgstr "" "%s: corrupt bestand op 0x%llx: verwachtte %# maar vond %#" #: src/libpspp/zip-reader.c:329 src/libpspp/zip-reader.c:449 #, c-format msgid "%s: open failed (%s)" msgstr "%s: openen mislukt (%s)" #: src/libpspp/zip-reader.c:344 #, c-format msgid "%s: cannot find central directory" msgstr "%s: kan \"central directory\" niet vinden" #: src/libpspp/zip-reader.c:353 src/libpspp/zip-reader.c:384 #: src/libpspp/zip-reader.c:468 #, c-format msgid "%s: seek failed (%s)" msgstr "%s: zoeken mislukt (%s)" #: src/libpspp/zip-reader.c:441 #, c-format msgid "%s: unknown member \"%s\"" msgstr "%s: onbekend lid \"%s\"" #: src/libpspp/zip-reader.c:503 #, fuzzy, c-format #| msgid "" #| "%s: name mismatch betwen central directory (%s) and local file header (%s)" msgid "" "%s: name mismatch between central directory (%s) and local file header (%s)" msgstr "" "%s: naam in \"central directory\" (%s) en van lokale bestands\"header\" (%s) " "komen niet overeen" #: src/libpspp/zip-reader.c:696 #, c-format msgid "%s: cannot initialize inflator (%s)" msgstr "%s: kan \"inflator\" niet initialiseren (%s)" #: src/libpspp/zip-reader.c:751 #, c-format msgid "%s: error inflating \"%s\" (%s)" msgstr "%s: fout bij \"inflating\" \"%s\" (%s)" #: src/libpspp/zip-writer.c:97 utilities/pspp-convert.c:346 #, c-format msgid "%s: error opening output file" msgstr "%s: fout bij openen uitvoerbestand" #: src/libpspp/zip-writer.c:169 #, c-format msgid "%s: error seeking in output file" msgstr "%s: fout bij zoeken in uitvoerbestand" #: src/libpspp/zip-writer.c:210 msgid "error creating temporary file" msgstr "fout bij aanmaken tijdelijk bestand" #: src/libpspp/zip-writer.c:279 #, c-format msgid "%s: write failed" msgstr "%s: schrijven mislukt" #. TRANSLATORS: This is a format string which, when presented to #. printf like functions, will create a pango markup string to #. display real number in scientific notation. #. #. In its untranslated form, it will display similar to "1.23 x 10^4". You #. can leave it untranslated if this is how scientific notation is usually #. presented in your language. #. #. Some locales (such as German) prefer the centered dot rather than the #. multiplication sign between the mantissa an exponent. In which #. case, you can change "#215;" to "#8901;" or other unicode code #. point as appropriate. #. #. The . in this string does not and should not be changed, since #. that is taken care of by the stdc library. #. #. For information on Pango markup, see #. http://developer.gnome.org/pango/stable/PangoMarkupFormat.html #. #. For tables of unicode code points, see http://unicode.org/charts #. #: src/math/chart-geometry.c:123 #, c-format msgid "%%.%dlf×10%d" msgstr "%%.%dlf×10%d" #: src/math/histogram.c:145 msgid "" "Not creating histogram because the data contains less than 2 distinct values" msgstr "" "Histogram wordt niet gemaakt omdat de gegevens minder dan 2 verschillende " "waarden bevatten" #: src/math/percentiles.c:36 msgid "HAverage" msgstr "HAverage" #: src/math/percentiles.c:38 msgid "Rounded" msgstr "Afgerond" #: src/math/percentiles.c:39 msgid "Empirical" msgstr "Empirisch" #: src/math/percentiles.c:40 msgid "Empirical with averaging" msgstr "Empirisch met middelen" #: src/math/shapiro-wilk.c:84 msgid "" "One or more weight values are non-integer. Fractional parts will be ignored " "when calculating the Shapiro-Wilk statistic." msgstr "" "Één of meer gewichtswaarden zijn geen geheel getal. Fracties zullen bij " "berekening van de W van Shapiro-Wilk worden genegeerd." #: src/output/ascii.c:340 #, c-format msgid "ascii: opening output file `%s'" msgstr "ascii: uitvoerbestand `%s' wordt geopend" #: src/output/ascii.c:371 #, c-format msgid "%s: %s must be positive integer or `auto'" msgstr "%s: %s moet positief geheel getal zijn of `auto'" #: src/output/ascii.c:393 #, c-format msgid "" "ascii: page must be at least %d characters wide, but as configured is only " "%d characters" msgstr "" "ascii: pagina moet tenminste %d tekens breed zijn, maar geconfigureerd zijn " "slechts %d tekens" #: src/output/ascii.c:508 #, c-format msgid "See %s for a chart." msgstr "Zie %s voor een diagram." #: src/output/charts/piechart.c:54 msgid "*MISSING*" msgstr "*ONTBREKEND*" #: src/output/csv.c:100 src/output/html.c:117 src/output/journal.c:166 #: src/output/msglog.c:68 #, c-format msgid "error opening output file `%s'" msgstr "fout bij openen uitvoerbestand `%s'" #: src/output/driver.c:522 #, c-format msgid "%s is not a valid device type (the choices are `%s' and `%s')" msgstr "%s is geen geldig apparaattype (de keuzes zijn `%s' en `%s')" #: src/output/driver.c:536 #, c-format msgid "%s: unknown option `%s'" msgstr "%s: onbekende optie `%s'" #: src/output/driver.c:553 #, c-format msgid "%s: output option missing `='" msgstr "%s: ontbrekende uitvoer-optie '='" #: src/output/driver.c:560 #, c-format msgid "%s: output option specified more than once" msgstr "%s: uitvoer-optie meer dan eens gespecificeerd" #: src/output/html.c:129 msgid "PSPP Output" msgstr "PSPP-uitvoer" #: src/output/html.c:266 msgid "No description" msgstr "Geen beschrijving" #: src/output/journal.c:69 #, c-format msgid "error writing output file `%s'" msgstr "fout bij schrijven naar uitvoerbestand `%s'" #: src/output/measure.c:68 #, c-format msgid "`%s' is not a valid length." msgstr "`%s' is geen geldige lengte." #: src/output/measure.c:96 #, c-format msgid "syntax error in paper size `%s'" msgstr "syntaxfout in papiergrootte `%s'" #: src/output/measure.c:233 #, c-format msgid "unknown paper type `%.*s'" msgstr "onbekend papiertype `%.*s'" #: src/output/measure.c:251 #, c-format msgid "error opening input file `%s'" msgstr "fout bij openen invoerbestand `%s'" #: src/output/measure.c:279 #, c-format msgid "file `%s' does not state a paper size" msgstr "bestand `%s' geeft geen papiergrootte aan" #: src/output/options.c:112 #, c-format msgid "%s: `%s' is `%s' but a Boolean value is required" msgstr "%s: `%s' is `%s', maar een Booleanse waarde is vereist" #: src/output/options.c:187 #, c-format msgid "%s: `%s' is `%s' but one of the following is required: %s" msgstr "%s: `%s' is `%s' maar één van de volgende is vereist: %s" #: src/output/options.c:231 #, c-format msgid "%s: `%s' is `%s' but a non-negative integer is required" msgstr "%s: `%s' is `%s' maar een niet-negatief geheel getal is vereist" #: src/output/options.c:235 #, c-format msgid "%s: `%s' is `%s' but a positive integer is required" msgstr "%s: `%s' is `%s' maar een positief geheel getal is vereist" #: src/output/options.c:238 #, c-format msgid "%s: `%s' is `%s' but an integer is required" msgstr "%s: `%s' is `%s' maar een geheel getal is vereist" #: src/output/options.c:241 #, c-format msgid "%s: `%s' is `%s' but an integer greater than %d is required" msgstr "%s: `%s' is `%s' maar een geheel getal groter dan %d is vereist" #: src/output/options.c:246 #, c-format msgid "%s: `%s' is `%s' but an integer between %d and %d is required" msgstr "%s: `%s' is `%s' maar een geheel getal tussen %d en %d is vereist" #: src/output/options.c:325 #, c-format msgid "%s: `%s' is `%s' but a file name that contains `#' is required." msgstr "%s: `%s' is `%s' maar een bestandsnaam die `#' bevat is vereist." #. TRANSLATORS: Do not translate this string. If the script of your language #. reads from right to left (eg Persian, Arabic, Hebrew etc), then replace #. this string with "output-direction-rtl". Otherwise either leave it #. untranslated or copy it verbatim. #: src/output/render.c:994 msgid "output-direction-ltr" msgstr "uitvoer-richting-ltr" #: src/output/text-item.c:44 msgid "Page Title" msgstr "Paginatitel" #: src/output/text-item.c:47 msgid "Title" msgstr "Titel" #: src/output/text-item.c:51 msgid "Log" msgstr "Log" #: src/output/text-item.c:54 msgid "Page Break" msgstr "Pagina-einde" #: src/output/cairo.c:520 #, c-format msgid "`%s': bad font specification" msgstr "`%s': foutieve lettertype-specificatie" #: src/output/cairo.c:744 #, c-format msgid "" "The defined page is not wide enough to hold at least %d characters in the " "default font. In fact, there's only room for %d characters." msgstr "" "De gedefinieerde pagina is niet breed genoeg om ten minste %d tekens in het " "standaardlettertype te bevatten. In feite is er slechts plaats voor %d " "tekens." #: src/output/cairo.c:752 #, c-format msgid "" "The defined page is not long enough to hold at least %d lines in the default " "font. In fact, there's only room for %d lines." msgstr "" "De gedefinieerde pagina is niet lang genoeg om tenminste %d regels van het " "standaardlettertype te bevatten. In feite is er slechts plaats voor %d " "regels." #: src/output/cairo.c:837 #, c-format msgid "error opening output file `%s': %s" msgstr "fout bij openen uitvoerbestand `%s': %s" #: src/output/cairo.c:892 #, c-format msgid "error drawing output for %s driver: %s" msgstr "fout bij tekenen uitvoer voor stuurprogramma %s: %s" #: src/output/cairo.c:2056 #, c-format msgid "error writing output file `%s': %s" msgstr "fout bij schrijven uitvoerbestand `%s': %s" #: src/output/charts/np-plot-cairo.c:37 #, c-format msgid "Normal Q-Q Plot of %s" msgstr "Normaal Q-Q-diagram van %s" #: src/output/charts/np-plot-cairo.c:38 src/output/charts/np-plot-cairo.c:68 msgid "Observed Value" msgstr "Waargenomen waarde" #: src/output/charts/np-plot-cairo.c:39 msgid "Expected Normal" msgstr "Verwacht normaal" #: src/output/charts/np-plot-cairo.c:67 #, c-format msgid "Detrended Normal Q-Q Plot of %s" msgstr "\"Detrended\" normaal Q-Q-diagram van %s" #: src/output/charts/np-plot-cairo.c:69 msgid "Dev from Normal" msgstr "Afw. van normaal" #: src/output/charts/barchart-cairo.c:65 msgid "Bar Chart" msgstr "Staafdiagram" #: src/output/charts/plot-hist-cairo.c:43 #, c-format msgid "N = %.2f" msgstr "N = %.2f" #: src/output/charts/plot-hist-cairo.c:52 #, c-format msgid "Mean = %.1f" msgstr "Gemiddelde = %.1f" #: src/output/charts/plot-hist-cairo.c:61 #, c-format msgid "Std. Dev = %.2f" msgstr "St.dev. = %.2f" #: src/output/charts/plot-hist-cairo.c:110 msgid "HISTOGRAM" msgstr "HISTOGRAM" #: src/output/charts/roc-chart-cairo.c:36 src/ui/gui/roc.ui:24 msgid "ROC Curve" msgstr "ROC-curve" #: src/output/charts/scree-cairo.c:36 msgid "Scree Plot" msgstr "Puindiagram" #: src/output/charts/scree-cairo.c:38 msgid "Eigenvalue" msgstr "Eigenwaarde" #: src/output/charts/spreadlevel-cairo.c:37 #, c-format msgid "Spread vs. Level Plot of %s" msgstr "Diagram van spreiding vs. niveau van %s" #: src/output/charts/spreadlevel-cairo.c:38 msgid "Level" msgstr "Niveau" #: src/output/charts/spreadlevel-cairo.c:39 msgid "Spread" msgstr "Spreiding" #: src/output/charts/scatterplot-cairo.c:57 #, c-format msgid "Scatterplot %s" msgstr "Spreidingsdiagram %s" #: src/output/spv/spv-legacy-decoder.c:2222 msgid "Table lacks cell data." msgstr "In tabel ontbreken celgegevens." #: src/output/spv/spv-writer.c:68 #, c-format msgid "%s: create failed" msgstr "%s: creatie mislukt" #: src/output/spv/spv-writer.c:89 msgid "I/O error writing SPV file" msgstr "Invoer-uitvoerfout bij schrijven SPV-bestand" #: src/output/spv/spv.c:693 #, c-format msgid "%s: Failed to create XML parser" msgstr "%s: Maken van XML-\"parser\" is mislukt" #: src/output/spv/spv.c:718 #, c-format msgid "%s: document is not well-formed" msgstr "%s: document heeft onjuiste vormgeving" #: src/output/spv/spv.c:726 #, c-format msgid "%s: root node is \"%s\" but \"%s\" was expected" msgstr "%s: de \"root node\" is \"%s\", maar verwacht werd \"%s\"" #: src/ui/gui/psppire-acr.c:273 msgid "Add" msgstr "Toevoegen" # Standaard snelleter voor Bewerken is de w. #: src/ui/gui/psppire-acr.c:274 msgid "Edit" msgstr "Bewerken" #: src/ui/gui/psppire-acr.c:275 msgid "Remove" msgstr "Verwijderen" #: src/ui/gui/psppire-buttonbox.c:311 msgid "OK" msgstr "OK" #: src/ui/gui/psppire-buttonbox.c:319 msgid "Go To" msgstr "Ga naar" #: src/ui/gui/psppire-buttonbox.c:327 msgid "Continue" msgstr "Klaar" #: src/ui/gui/psppire-buttonbox.c:339 src/ui/gui/psppire-import-assistant.c:759 msgid "Paste" msgstr "Plakken" #: src/ui/gui/psppire-buttonbox.c:345 #: src/ui/gui/psppire-dialog-action-aggregate.c:216 #: src/ui/gui/psppire-data-window.c:496 src/ui/gui/psppire-data-window.c:624 #: src/ui/gui/psppire-output-window.c:353 #: src/ui/gui/psppire-syntax-window.c:594 src/ui/gui/psppire-window.c:445 #: src/ui/gui/psppire-window.c:628 msgid "Cancel" msgstr "Annuleren" #: src/ui/gui/psppire-buttonbox.c:351 msgid "Close" msgstr "Sluiten" #: src/ui/gui/psppire-buttonbox.c:358 src/ui/gui/psppire-import-assistant.c:760 msgid "Reset" msgstr "Herstel" #: src/ui/gui/psppire-buttonbox.c:365 msgid "Help" msgstr "Help" #: src/ui/gui/psppire-dialog-action-aggregate.c:213 msgid "Aggregate destination file" msgstr "Aggregatie-doelbestand" #: src/ui/gui/psppire-dialog-action-aggregate.c:217 #: src/ui/gui/psppire-data-window.c:493 src/ui/gui/psppire-data-window.c:497 #: src/ui/gui/psppire-output-window.c:354 #: src/ui/gui/psppire-syntax-window.c:595 src/ui/gui/psppire-window.c:449 #: src/ui/gui/aggregate.ui:565 msgid "Save" msgstr "Opslaan" #: src/ui/gui/psppire-dialog-action-aggregate.c:226 #: src/ui/gui/psppire-data-window.c:503 msgid "System Files (*.sav)" msgstr "Systeembestanden (*.sav)" #: src/ui/gui/psppire-dialog-action-aggregate.c:231 #: src/ui/gui/psppire-data-window.c:508 msgid "Compressed System Files (*.zsav)" msgstr "Gecomprimeerde systeembestanden (*.zsav)" #: src/ui/gui/psppire-dialog-action-aggregate.c:236 #: src/ui/gui/psppire-data-window.c:513 src/ui/gui/psppire-window.c:652 msgid "Portable Files (*.por) " msgstr "Overdraagbare (\"portable\") bestanden (*.por) " #: src/ui/gui/psppire-dialog-action-autorecode.c:337 #: src/ui/gui/psppire-dialog-action-recode.c:535 #: src/ui/gui/psppire-dialog-action-recode-different.c:288 msgid "New" msgstr "Nieuw" #: src/ui/gui/psppire-dialog-action-autorecode.c:351 #: src/ui/gui/psppire-dialog-action-recode.c:527 #: src/ui/gui/psppire-dialog-action-recode-different.c:301 msgid "Old" msgstr "Oud" #: src/ui/gui/psppire-dialog-action-comments.c:142 #, c-format msgid "Column Number: %d" msgstr "Kolomnummer: %d" #: src/ui/gui/psppire-dialog-action-crosstabs.c:71 msgid "Chisq" msgstr "Chi-kw" #: src/ui/gui/psppire-dialog-action-crosstabs.c:71 msgid "" "Pearson chi-square, likelihood ratio, Fisher’s exact test, continuity " "correction, linear-by-linear association." msgstr "" #: src/ui/gui/psppire-dialog-action-crosstabs.c:74 #: src/language/stats/crosstabs.q:1334 msgid "Phi" msgstr "Phi" #: src/ui/gui/psppire-dialog-action-crosstabs.c:75 msgid "CC" msgstr "CC" #: src/ui/gui/psppire-dialog-action-crosstabs.c:75 #, fuzzy #| msgid "Contingency Coefficient" msgid "Contingency coefficient" msgstr "Contingentiecoëfficiënt" #: src/ui/gui/psppire-dialog-action-crosstabs.c:77 msgid "UC" msgstr "UC" #: src/ui/gui/psppire-dialog-action-crosstabs.c:77 #, fuzzy #| msgid "Uncertainty Coefficient" msgid "Uncertainty coefficient" msgstr "Onzekerheidscoëfficiënt" #: src/ui/gui/psppire-dialog-action-crosstabs.c:78 msgid "BTau" msgstr "BTau" #: src/ui/gui/psppire-dialog-action-crosstabs.c:78 #, fuzzy #| msgid "Kendall's tau-b" msgid "Kendall's Tau-b" msgstr "Kendalls tau-b" #: src/ui/gui/psppire-dialog-action-crosstabs.c:79 msgid "CTau" msgstr "CTau" #: src/ui/gui/psppire-dialog-action-crosstabs.c:79 #, fuzzy #| msgid "Kendall's tau-c" msgid "Kendall's Tau-c" msgstr "Kendalls tau-c" #: src/ui/gui/psppire-dialog-action-crosstabs.c:80 msgid "Risk" msgstr "Risico" #: src/ui/gui/psppire-dialog-action-crosstabs.c:80 #, fuzzy #| msgid "Risk Estimate" msgid "Relative Risk estimate" msgstr "Risicoschatting" #: src/ui/gui/psppire-dialog-action-crosstabs.c:81 #: src/language/stats/crosstabs.q:1338 msgid "Gamma" msgstr "Gamma" #: src/ui/gui/psppire-dialog-action-crosstabs.c:82 msgid "D" msgstr "D" #: src/ui/gui/psppire-dialog-action-crosstabs.c:82 #, fuzzy #| msgid "Somers' d" msgid "Somer's d" msgstr "Somers' d" #: src/ui/gui/psppire-dialog-action-crosstabs.c:83 #: src/language/stats/crosstabs.q:1344 msgid "Kappa" msgstr "Kappa" #: src/ui/gui/psppire-dialog-action-crosstabs.c:83 msgid "Cohen's Kappa" msgstr "" #: src/ui/gui/psppire-dialog-action-crosstabs.c:84 #: src/language/stats/crosstabs.q:1429 msgid "Eta" msgstr "Eta" #: src/ui/gui/psppire-dialog-action-crosstabs.c:85 msgid "Corr" msgstr "Corr" #: src/ui/gui/psppire-dialog-action-crosstabs.c:85 #, fuzzy #| msgid "Spearman Correlation" msgid "Spearman correlation, Pearson's r" msgstr "Spearmancorrelatie" #: src/ui/gui/psppire-dialog-action-crosstabs.c:90 #, fuzzy #| msgid "Frequency" msgid "Frequency Count" msgstr "Frequentie" #: src/ui/gui/psppire-dialog-action-crosstabs.c:91 msgid "Row" msgstr "Rij" #: src/ui/gui/psppire-dialog-action-crosstabs.c:91 #, fuzzy #| msgid "Percent" msgid "Row percent" msgstr "Procent" #: src/ui/gui/psppire-dialog-action-crosstabs.c:92 msgid "Column" msgstr "Kolom" #: src/ui/gui/psppire-dialog-action-crosstabs.c:92 #, fuzzy #| msgid "Cum Percent" msgid "Column percent" msgstr "Cum. percentage" #: src/ui/gui/psppire-dialog-action-crosstabs.c:93 #, fuzzy #| msgid "Valid Percent" msgid "Total percent" msgstr "Percentage geldig" #: src/ui/gui/psppire-dialog-action-crosstabs.c:94 #: src/language/stats/crosstabs.q:1266 msgid "Expected" msgstr "Verwacht" #: src/ui/gui/psppire-dialog-action-crosstabs.c:94 #, fuzzy #| msgid "Expected Values:" msgid "Expected value" msgstr "Verwachte waarden:" #: src/ui/gui/psppire-dialog-action-crosstabs.c:96 #: src/language/stats/crosstabs.q:1268 msgid "Std. Residual" msgstr "Gestandaardiseerd residu" #: src/ui/gui/psppire-dialog-action-crosstabs.c:96 #, fuzzy #| msgid "Std. Residual" msgid "Standardized Residual" msgstr "Gestandaardiseerd residu" #: src/ui/gui/psppire-dialog-action-crosstabs.c:97 msgid "Adjusted Std. Residual" msgstr "Aangepast gestandaardiseerd residu" #: src/ui/gui/psppire-dialog-action-descriptives.c:45 msgid "Standard error" msgstr "Standaardfout" #: src/ui/gui/psppire-dialog-action-descriptives.c:45 #, fuzzy #| msgid "Standard error of the mean" msgid "Standard error of mean" msgstr "Standaardfout van het gemiddelde" #: src/ui/gui/psppire-dialog-action-descriptives.c:47 #, fuzzy #| msgid "Standard error of the kurtosis" msgid "Kurtosis and standard error of kurtosis" msgstr "Standaardfout van de welving" #: src/ui/gui/psppire-dialog-action-descriptives.c:48 #, fuzzy #| msgid "Standard error of the skewness" msgid "Skewness and standard error of skewness" msgstr "Standaardfout van de scheefheid" #: src/ui/gui/psppire-dialog-action-factor.c:323 #, c-format msgid "_Eigenvalues over %4.2f times the mean eigenvalue" msgstr "_Eigenwaarden groter dan %4.2f keer de gemiddelde eigenwaarde" #: src/ui/gui/psppire-dialog-action-frequencies.c:44 msgid "Standard error of the mean" msgstr "Standaardfout van het gemiddelde" #: src/ui/gui/psppire-dialog-action-frequencies.c:47 msgid "Standard error of the skewness" msgstr "Standaardfout van de scheefheid" #: src/ui/gui/psppire-dialog-action-frequencies.c:51 msgid "Standard error of the kurtosis" msgstr "Standaardfout van de welving" #: src/ui/gui/psppire-dialog-action-oneway.c:175 #, c-format msgid "Contrast %d of %d" msgstr "Contrast %d van %d" #: src/ui/gui/psppire-dialog-action-paired.c:162 src/ui/gui/examine.ui:282 #: src/ui/gui/indep-samples.ui:334 src/ui/gui/t-test.ui:296 msgid "O_ptions..." msgstr "O_pties..." #: src/ui/gui/psppire-dialog-action-paired.c:168 msgid "Paired Samples T Test" msgstr "T-toets voor gepaarde steekproeven" #: src/ui/gui/psppire-dialog-action-recode-different.c:327 msgid "Recode into Different Variables" msgstr "Hercodeer in andere variabelen" #: src/ui/gui/psppire-dialog-action-recode-different.c:330 msgid "Recode into Different Variables: Old and New Values " msgstr "Hercodeer in andere variabelen: oude en nieuwe waarden " #: src/ui/gui/psppire-dialog-action-recode-same.c:108 src/ui/gui/recode.ui:391 msgid "Recode into Same Variables" msgstr "Hercodeer binnen dezelfde variabelen" #: src/ui/gui/psppire-dialog-action-recode-same.c:114 msgid "Recode into Same Variables: Old and New Values" msgstr "Hercoderen binnen dezelfde variabelen: oude en nieuwe waarden" #: src/ui/gui/psppire-dialog-action-regression.c:40 msgid "Coeff" msgstr "Coëff." #: src/ui/gui/psppire-dialog-action-regression.c:40 msgid "Show the regression coefficients" msgstr "Toon de regressiecoëfficiënten" #: src/ui/gui/psppire-dialog-action-regression.c:41 msgid "Conf. Interval" msgstr "Betr.interval" #: src/ui/gui/psppire-dialog-action-regression.c:41 msgid "Show the confidence interval for the regression coefficients" msgstr "Toon het betrouwbaarheidsinterval voor de regressiecoëfficiënten" #: src/ui/gui/psppire-dialog-action-regression.c:42 msgid "Show the correlation between observed and predicted values" msgstr "Toon de correlatie tussen waargenomen en voorspelde waarden" #: src/ui/gui/psppire-dialog-action-regression.c:43 msgid "Anova" msgstr "Anova" #: src/ui/gui/psppire-dialog-action-regression.c:43 msgid "Show the analysis of variance table" msgstr "Toon de variantie-analyse-tabel" #: src/ui/gui/psppire-dialog-action-regression.c:44 msgid "Bcov" msgstr "Bcov" #: src/ui/gui/psppire-dialog-action-regression.c:44 msgid "Show the variance coefficient matrix" msgstr "Toon de matrix van variantie-coëfficiënten" #: src/ui/gui/psppire-dialog-action-regression.c:45 msgid "Tol" msgstr "Tol" #: src/ui/gui/psppire-dialog-action-regression.c:45 msgid "Show the variance inflation factor and its reciprocal" msgstr "Toon de inflatiefactor van de variantie en diens reciproke" #: src/ui/gui/psppire-dialog-action-select.c:88 #, c-format msgid "Approximately %3d%% of all cases." msgstr "Ongeveer %3d%% van alle observaties." #: src/ui/gui/psppire-dialog-action-select.c:89 #, c-format msgid "Exactly %3d cases from the first %3d cases." msgstr "Precies %3d van de eerste %3d observaties." #: src/ui/gui/psppire-dialog-action-select.c:236 #, c-format msgid "%d thru %d" msgstr "%d tot en met %d" #: src/ui/gui/psppire-dialog-action-two-sample.c:180 #: src/ui/gui/k-independent.ui:404 src/ui/gui/k-related.ui:197 msgid "Test Type" msgstr "Toetstype" #: src/ui/gui/psppire-dialog-action-two-sample.c:189 msgid "_Wilcoxon" msgstr "_Wilcoxon" #: src/ui/gui/psppire-dialog-action-two-sample.c:190 msgid "_Sign" msgstr "_Teken" #: src/ui/gui/psppire-dialog-action-two-sample.c:191 msgid "_McNemar" msgstr "_McNemar" #: src/ui/gui/psppire-dialog-action-two-sample.c:209 msgid "Two-Related-Samples Tests" msgstr "Toetsen voor twee afhankelijke steekproeven" #: src/ui/gui/psppire-dialog-action-weight.c:74 src/ui/gui/weight.ui:83 #: src/ui/gui/weight.ui:211 msgid "Do not weight cases" msgstr "Weeg observaties niet" #: src/ui/gui/psppire-dialog-action-weight.c:80 #, c-format msgid "Weight cases by %s" msgstr "Weeg observaties met %s" #: src/ui/gui/psppire-dict.c:95 msgid "Var" msgstr "Var" #. TRANSLATORS: This string must be a valid variable name. That means: #. - The string must be at most 64 bytes (not characters) long. #. - The string may not contain whitespace. #. - The first character may not be '$' #. - The first character may not be a digit #. - The final character may not be '.' or '_' #. #: src/ui/gui/psppire-dict.c:385 #, c-format msgid "Var%04d" msgstr "Var%04d" #: src/ui/gui/psppire-dict.c:566 msgid "Duplicate variable name." msgstr "Reeds gebruikte variabelenaam." #: src/ui/gui/psppire-dictview.c:617 msgid "Prefer variable labels" msgstr "Voorkeur voor variabelelabels" #: src/ui/gui/psppire-dictview.c:631 msgid "Default sort order" msgstr "Standaard-sorteervolgorde" #: src/ui/gui/psppire-dictview.c:637 msgid "Unsorted (dictionary order)" msgstr "Ongesorteerd (woordenboekvolgorde)" #: src/ui/gui/psppire-dictview.c:642 msgid "Sort by name" msgstr "Sorteer op naam" #: src/ui/gui/psppire-dictview.c:647 msgid "Sort by label" msgstr "Sorteer op label" #: src/ui/gui/psppire-means-layer.c:95 #, c-format msgid "Layer %d of %d" msgstr "Laag %d van %d" #: src/ui/gui/psppire-means-layer.c:169 msgid "Forward" msgstr "Vooruit" #: src/ui/gui/psppire-means-layer.c:170 msgid "Back" msgstr "Terug" #: src/ui/gui/psppire-text-file.c:55 #, c-format msgid "Could not open `%s'" msgstr "Kon `%s' niet openen" #: src/ui/gui/psppire-text-file.c:71 #, c-format msgid "Error reading `%s': %s" msgstr "Fout bij lezen `%s': %s" #: src/ui/gui/psppire-text-file.c:74 #, c-format msgid "" "Failed to read `%s', because it contains a line over %d bytes long and " "therefore appears not to be a text file." msgstr "" "Lezen van `%s' mislukt omdat dit een regel bevat die meer dan %d bytes lang " "is, waardoor het geen tekstbestand lijkt te zijn." #: src/ui/gui/psppire-text-file.c:96 #, c-format msgid "`%s' is empty." msgstr "`%s' is leeg." #: src/ui/gui/psppire-val-chooser.c:255 msgid "through" msgstr "tot en met" #: src/ui/gui/psppire-val-chooser.c:288 msgid "_Value:" msgstr "_Waarde:" #: src/ui/gui/psppire-val-chooser.c:289 msgid "_System Missing" msgstr "_System-missing" #: src/ui/gui/psppire-val-chooser.c:290 msgid "System _or User Missing" msgstr "System- of _user-missing" #: src/ui/gui/psppire-val-chooser.c:291 msgid "_Range:" msgstr "_Bereik:" #: src/ui/gui/psppire-val-chooser.c:292 msgid "Range, _LOWEST thru value" msgstr "Bereik, _LAAGSTE tot en met waarde" #: src/ui/gui/psppire-val-chooser.c:293 msgid "Range, value thru _HIGHEST" msgstr "Bereik, waarde tot en met _HOOGSTE" #: src/ui/gui/psppire-val-chooser.c:294 msgid "_All other values" msgstr "_Alle andere waarden" #: src/ui/gui/psppire-var-view.c:153 #, c-format msgid "Var%d" msgstr "Var%d" #: src/ui/source-init-opts.c:72 #, c-format msgid "Algorithm must be either `%s' or `%s'." msgstr "Algoritme moet òf `%s' òf `%s' zijn." #: src/ui/source-init-opts.c:97 #, c-format msgid "Syntax must be either `%s' or `%s'." msgstr "Syntax moet òf `%s' òf `%s' zijn." #: src/ui/terminal/main.c:144 msgid "Error encountered while ERROR=STOP is effective." msgstr "Op fout gestuit terwijl ERROR=STOP actief is." #: src/ui/terminal/main.c:150 msgid "" "Stopping syntax file processing here to avoid a cascade of dependent command " "failures." msgstr "" "Uitvoering van syntaxbestand wordt hier stopgezet ter vermijding van een " "waterval aan afhankelijke opdrachtfouten." #: src/ui/terminal/terminal-opts.c:147 #, c-format msgid "" "PSPP, a program for statistical analysis of sampled data.\n" "Usage: %s [OPTION]... FILE...\n" "\n" "Arguments to long options also apply to equivalent short options.\n" "\n" "Output options:\n" " -o, --output=FILE output to FILE, default format from FILE's name\n" " -O format=FORMAT override format for previous -o\n" " -O OPTION=VALUE set output option to customize previous -o\n" " -O device={terminal|listing} override device type for previous -o\n" " -e, --error-file=FILE append errors, warnings, and notes to FILE\n" " --no-output disable default output driver\n" "Supported output formats: %s\n" "\n" "Language options:\n" " -I, --include=DIR append DIR to search path\n" " -I-, --no-include clear search path\n" " -r, --no-statrc disable running rc file at startup\n" " -a, --algorithm={compatible|enhanced}\n" " set to `compatible' if you want output\n" " calculated from broken algorithms\n" " -x, --syntax={compatible|enhanced}\n" " set to `compatible' to disable PSPP extensions\n" " -b, --batch interpret syntax in batch mode\n" " -i, --interactive interpret syntax in interactive mode\n" " --syntax-encoding=ENCODING specify encoding for syntax files\n" " -s, --safer don't allow some unsafe operations\n" "Default search path: %s\n" "\n" "Informative output:\n" " -h, --help display this help and exit\n" " -V, --version output version information and exit\n" "\n" "Non-option arguments are interpreted as syntax files to execute.\n" msgstr "" "PSPP, een programma voor statistische analyse van steekproefgegevens.\n" "Gebruik: %s [OPTIE}... BESTAND... \n" "\n" "Argumenten voor niet-afgekorte opties gelden ook voor equivalente afgekorte " "opties.\n" "\n" "Uitvoeropties:\n" " -o, --output=BESTAND uitvoer naar BESTAND, standaardindeling " "afgeleid uit naam (extensie) van BESTAND\n" " -O format=INDELING overschrijft indeling vanuit voorgaande -o\n" " -O OPTIE=WAARDE zet uitvoeroptie als aanpassing van voorgaande -" "o\n" " -O device={terminal|listing} overschrijft apparaattype voor voorgaande -" "o\n" " -e, --error-file=BESTAND voeg fouten, waarschuwingen en opmerkingen " "toe aan BESTAND\n" " --no-output schakel standaard-uitvoerstuurprogramma uit\n" "Ondersteunde uitvoerindelingen: %s\n" "\n" "Language options:\n" " -I, --include=MAP voeg MAP toe aan zoekpad\n" " -I-, --no-include wis zoekpad\n" " -r, --no-statrc schakel uitvoeren rc-bestand bij opstarten uit\n" " -a, --algorithm={compatible|enhanced}\n" " geef op `compatible' als u uitvoer wilt\n" " berekend uit \"gebroken\" algoritmes\n" " -x, --syntax={compatible|enhanced}\n" " geef op `compatible' om PSPP-uitbreidingen uit " "te schakelen\n" " -b, --batch interpreteer syntax in \"batch\"-modus\n" " -i, --interactive interpreteer syntax in interactieve modus\n" " --syntax-encoding=CODERING geef codering van syntaxbestanden op\n" " -s, --safer sta sommige onveilige operaties niet toe\n" "Standaard-zoekpad: %s\n" "\n" "Informatieve uitvoer:\n" " -h, --help toon deze hulp en sluit af\n" " -V, --version toon versie-informatie en sluit af\n" "\n" "Argumenten die geen opties zijn, worden geïnterpreteerd als uit te voeren " "syntaxbestanden.\n" #: src/ui/gui/find-dialog.c:197 msgid "Find" msgstr "Zoek" #: src/ui/gui/find-dialog.c:662 #, c-format msgid "Bad regular expression: %s" msgstr "Foutieve reguliere expressie: %s" #: src/ui/gui/help-menu.c:70 msgid "A program for the analysis of sampled data" msgstr "Een programma voor de analyse van steekproefgegevens" #. TRANSLATORS: Do not translate this string. Instead, put the names of the people #. who have helped in the translation. #: src/ui/gui/help-menu.c:80 msgid "translator-credits" msgstr "" "Harry Thijssen (2009-2017)\n" "Jaap Verhage (2017-heden)" #: src/ui/gui/help-menu.c:170 #, c-format msgid "Help path conversion error: %s" msgstr "Omzettingsfout van pad naar Help: %s" #: src/ui/gui/help-menu.c:197 #, fuzzy, c-format #| msgid "" #| "Cannot open reference manual via yelp: %s. Cannot open via html: %s with " #| "uri: %s The PSSP manual is also available at %s" msgid "" "Cannot open via html: %s with uri: %s The PSSP manual is also available at %s" msgstr "" "Kan de handleiding niet via yelp openen: %s. Openen lukt niet via html: %s " "met uri: %s De PSSP-handleiding is ook beschikbaar op %s" #: src/ui/gui/help-menu.c:218 msgid "_Help" msgstr "_Help" #: src/ui/gui/help-menu.c:221 msgid "_About" msgstr "_Over" #: src/ui/gui/help-menu.c:222 msgid "_Reference Manual" msgstr "_Handleiding" #: src/ui/gui/main.c:306 msgid "Show version information and exit" msgstr "Toon versie-informatie en sluit af" #: src/ui/gui/main.c:409 msgid "Do not display the splash screen" msgstr "Laat het opstartscherm niet zien" #: src/ui/gui/main.c:411 msgid "Do not attempt single instance negotiation" msgstr "Probeer geen \"single instance\"-onderhandeling" #: src/ui/gui/missing-val-dialog.c:217 msgid "" "The maximum length of a missing value for a string variable is 8 in UTF-8." msgstr "" "De maximale lengte voor een ontbrekende waarde van een alfanumerieke " "variabele in UTF-8-codering is 8." #: src/ui/gui/missing-val-dialog.c:268 msgid "At least one value must be specified" msgstr "Tenminste één waarde moet worden opgegeven" #: src/ui/gui/missing-val-dialog.c:298 msgid "Incorrect range specification" msgstr "Onjuiste specificatie van bereik" #: src/ui/gui/psppire-data-editor.c:380 #, c-format msgid "%d : %s" msgstr "%d: %s" #: src/ui/gui/psppire-data-editor.c:391 #, c-format msgid "%'d case" msgid_plural "%'d cases" msgstr[0] "%'d observatie" msgstr[1] "%'d observaties" #: src/ui/gui/psppire-data-editor.c:396 #, c-format msgid "%'d variable" msgid_plural "%'d variables" msgstr[0] "%'d variabele" msgstr[1] "%'d variabelen" #: src/ui/gui/psppire-data-editor.c:485 msgid "Case" msgstr "Observatie" #: src/ui/gui/psppire-data-editor.c:495 msgid "Data View" msgstr "Gegevensweergave" #: src/ui/gui/psppire-data-editor.c:505 msgid "Variable View" msgstr "Variabelenweergave" #: src/ui/gui/psppire-data-sheet.c:171 src/ui/gui/psppire-data-window.c:1338 msgid "_Insert Case" msgstr "_Voeg observatie in" #: src/ui/gui/psppire-data-sheet.c:179 src/ui/gui/psppire-data-window.c:1391 msgid "Cl_ear Cases" msgstr "_Wis observaties" #: src/ui/gui/psppire-data-sheet.c:305 src/ui/gui/psppire-data-window.c:1337 #: src/ui/gui/psppire-variable-sheet.c:274 msgid "_Insert Variable" msgstr "_Voeg variabele in" #: src/ui/gui/psppire-data-sheet.c:314 src/ui/gui/psppire-variable-sheet.c:283 msgid "Cl_ear Variables" msgstr "Wis _variabelen" #: src/ui/gui/psppire-data-sheet.c:326 msgid "Sort _Ascending" msgstr "Sorteer _oplopend" #: src/ui/gui/psppire-data-sheet.c:333 msgid "Sort _Descending" msgstr "Sorteer _aflopend" #: src/ui/gui/psppire-data-window.c:175 msgid "Transformations Pending" msgstr "Uitstaande transformaties" #: src/ui/gui/psppire-data-window.c:191 msgid "Filter off" msgstr "Filter uit" #: src/ui/gui/psppire-data-window.c:203 #, c-format msgid "Filter by %s" msgstr "Filter op %s" #: src/ui/gui/psppire-data-window.c:224 msgid "No Split" msgstr "Splitsen uit" #: src/ui/gui/psppire-data-window.c:233 msgid "Split by " msgstr "Splits op " #: src/ui/gui/psppire-data-window.c:261 msgid "Weights off" msgstr "Weging uit" #: src/ui/gui/psppire-data-window.c:273 #, c-format msgid "Weight by %s" msgstr "Weeg met %s" #: src/ui/gui/psppire-data-window.c:518 #: src/ui/gui/psppire-import-assistant.c:681 #: src/ui/gui/psppire-syntax-window.c:607 src/ui/gui/psppire-window.c:669 msgid "All Files" msgstr "Alle bestanden" #: src/ui/gui/psppire-data-window.c:535 msgid "System File" msgstr "Systeembestand" #: src/ui/gui/psppire-data-window.c:542 msgid "Compressed System File" msgstr "Gecomprimeerd systeembestand" #: src/ui/gui/psppire-data-window.c:548 msgid "Portable File" msgstr "Overdraagbaar bestand" #: src/ui/gui/psppire-data-window.c:551 msgid "Format:" msgstr "Indeling:" #: src/ui/gui/psppire-data-window.c:615 msgid "Delete Existing Dataset?" msgstr "Moet bestaande dataset worden verwijderd?" #: src/ui/gui/psppire-data-window.c:619 #, c-format msgid "" "Renaming \"%s\" to \"%s\" will destroy the existing dataset named \"%s\". " "Are you sure that you want to do this?" msgstr "" "Hernoemen van \"%s\" naar \"%s\" zal de bestaande dataset genaamd \"%s\" " "vernietigen. Weet u zeker dat u dit wilt?" #: src/ui/gui/psppire-data-window.c:625 msgid "Delete" msgstr "Verwijderen" #: src/ui/gui/psppire-data-window.c:647 #, c-format msgid "Please enter a new name for dataset \"%s\":" msgstr "Voer een nieuwe naam in voor de dateset \"%s\":" #: src/ui/gui/psppire-data-window.c:649 msgid "Rename Dataset" msgstr "Hernoem dataset" #: src/ui/gui/psppire-data-window.c:1199 src/ui/gui/output-window.ui:68 #: src/ui/gui/syntax-editor.ui:22 msgid "_File" msgstr "_Bestand" #: src/ui/gui/psppire-data-window.c:1203 src/ui/gui/syntax-editor.ui:25 msgid "_New" msgstr "_Nieuw" #: src/ui/gui/psppire-data-window.c:1210 msgid "_Syntax" msgstr "_Syntax" #: src/ui/gui/psppire-data-window.c:1213 src/ui/gui/data-editor.ui:177 #: src/ui/gui/data-editor.ui:189 msgid "_Data" msgstr "_Gegevens" #: src/ui/gui/psppire-data-window.c:1220 src/ui/gui/syntax-editor.ui:36 msgid "_Open" msgstr "_Open" #: src/ui/gui/psppire-data-window.c:1223 msgid "_Import Data..." msgstr "Gegevens _importeren..." #: src/ui/gui/psppire-data-window.c:1231 src/ui/gui/logistic.ui:261 #: src/ui/gui/regression.ui:66 msgid "_Save..." msgstr "O_pslaan..." #: src/ui/gui/psppire-data-window.c:1234 msgid "Save _As..." msgstr "Opslaan _als..." #: src/ui/gui/psppire-data-window.c:1237 msgid "_Rename Dataset..." msgstr "Dataset _hernoemen..." #: src/ui/gui/psppire-data-window.c:1248 msgid "_Display Data File Information" msgstr "_Informatie gegevensbestand tonen" #: src/ui/gui/psppire-data-window.c:1255 msgid "Working File" msgstr "Werkbestand" #: src/ui/gui/psppire-data-window.c:1257 msgid "_External File..." msgstr "_Extern bestand..." #: src/ui/gui/psppire-data-window.c:1267 msgid "_Recently Used Data" msgstr "Onlangs gebruikte _gegevens" #: src/ui/gui/psppire-data-window.c:1268 msgid "Recently Used _Files" msgstr "Onlangs gebruikte _bestanden" #: src/ui/gui/psppire-data-window.c:1315 src/ui/gui/output-window.ui:82 #: src/ui/gui/syntax-editor.ui:59 msgid "_Quit" msgstr "_Afsluiten" # Standaard snelleter voor Bewerken is de w. #: src/ui/gui/psppire-data-window.c:1333 src/ui/gui/output-window.ui:89 #: src/ui/gui/syntax-editor.ui:66 msgid "_Edit" msgstr "Be_werken" #: src/ui/gui/psppire-data-window.c:1339 msgid "_Go To Variable..." msgstr "_Spring naar variabele..." #: src/ui/gui/psppire-data-window.c:1340 msgid "_Go To Case..." msgstr "_Spring naar observatie..." #: src/ui/gui/psppire-data-window.c:1364 src/ui/gui/syntax-editor.ui:69 msgid "Cu_t" msgstr "K_nippen" #: src/ui/gui/psppire-data-window.c:1373 src/ui/gui/output-window.ui:96 #: src/ui/gui/syntax-editor.ui:74 msgid "_Copy" msgstr "K_opiëren" #: src/ui/gui/psppire-data-window.c:1380 src/ui/gui/syntax-editor.ui:79 msgid "_Paste" msgstr "P_lakken" #: src/ui/gui/psppire-data-window.c:1387 msgid "Clear _Variables" msgstr "_Wis variabelen" #: src/ui/gui/psppire-data-window.c:1401 msgid "_Find..." msgstr "_Zoek..." #: src/ui/gui/psppire-data-window.c:1407 src/ui/gui/logistic.ui:246 msgid "_Options..." msgstr "O_pties..." #: src/ui/gui/psppire-data-window.c:1676 msgid "Jump to variable" msgstr "Spring naar variabele" #: src/ui/gui/psppire-data-window.c:1689 msgid "Jump to a case in the data sheet" msgstr "Spring naar een observatie in het gegevensblad" #: src/ui/gui/psppire-data-window.c:1703 msgid "Search for values in the data" msgstr "Zoek naar waarden in de gegevens" #: src/ui/gui/psppire-data-window.c:1715 msgid "Create a new case at the current position" msgstr "Maak een nieuwe observatie aan op de huidige positie" #: src/ui/gui/psppire-data-window.c:1727 msgid "Create a new variable at the current position" msgstr "Maak een nieuwe variabele aan op de huidige positie" #: src/ui/gui/psppire-data-window.c:1741 msgid "Split the active dataset" msgstr "Splits de actieve dataset" #: src/ui/gui/psppire-data-window.c:1753 msgid "Weight cases by variable" msgstr "Weeg observaties via variabele" #: src/ui/gui/psppire-data-window.c:1764 msgid "Show/hide value labels" msgstr "Toon/verberg waardelabels" #: src/ui/gui/psppire-data-window.c:1904 msgid "Data Editor" msgstr "Gegevensbewerker" #: src/ui/gui/psppire-encoding-selector.c:140 msgid "Automatically Detect" msgstr "Automatische detectie" #: src/ui/gui/psppire-encoding-selector.c:147 msgid "Locale Encoding" msgstr "Plaatselijke codering" #: src/ui/gui/psppire-encoding-selector.c:177 msgid "Character Encoding: " msgstr "Tekencodering: " #: src/ui/gui/psppire-import-assistant.c:337 msgid "line" msgstr "regel" #: src/ui/gui/psppire-import-assistant.c:347 msgid "var" msgstr "var" #: src/ui/gui/psppire-import-assistant.c:560 msgid "Importing Spreadsheet Data" msgstr "Rekenbladgegevens worden geïmporteerd" #: src/ui/gui/psppire-import-assistant.c:686 msgid "Text Files" msgstr "Tekstbestanden" #: src/ui/gui/psppire-import-assistant.c:691 msgid "Text (*.txt) Files" msgstr "Tekstbestand (*.txt)" #: src/ui/gui/psppire-import-assistant.c:697 msgid "Plain Text (ASCII) Files" msgstr "Bestand met platte tekst (ASCII)" #: src/ui/gui/psppire-import-assistant.c:702 msgid "Comma Separated Value Files" msgstr "Bestanden met door komma's gescheiden waarden (CSV)" #: src/ui/gui/psppire-import-assistant.c:709 msgid "Tab Separated Value Files" msgstr "Bestanden met door tabs gescheiden waarden" #: src/ui/gui/psppire-import-assistant.c:714 msgid "Gnumeric Spreadsheet Files" msgstr "Gnumeric-rekenbladbestanden" #: src/ui/gui/psppire-import-assistant.c:719 msgid "OpenDocument Spreadsheet Files" msgstr "OpenDocument-rekenbladbestanden" #: src/ui/gui/psppire-import-assistant.c:724 msgid "All Spreadsheet Files" msgstr "Alle rekenbladbestanden" #: src/ui/gui/psppire-import-assistant.c:733 msgid "Select File to Import" msgstr "Kies te importeren bestand" #: src/ui/gui/psppire-import-assistant.c:770 msgid "Importing Delimited Text Data" msgstr "Tekstgegevens met scheidingstekens worden geïmporteerd" #: src/ui/gui/psppire-import-assistant.c:865 msgid "Select the First Line" msgstr "Kies de eerste regel" #: src/ui/gui/psppire-import-assistant.c:877 msgid "Line" msgstr "Regel" #: src/ui/gui/psppire-import-assistant.c:931 msgid "" "This assistant will guide you through the process of importing data into " "PSPP from a text file with one line per case, in which fields are separated " "by tabs, commas, or other delimiters.\n" "\n" msgstr "" "Deze assistent zal u begeleiden bij het importeren van gegevens in PSPP uit " "een tekstbestand met één regel per observatie, waarin velden van elkaar " "worden gescheiden door tabs, komma's of andere scheidingstekens.\n" #: src/ui/gui/psppire-import-assistant.c:941 #, c-format msgid "The selected file contains %'lu line of text. " msgid_plural "The selected file contains %'lu lines of text. " msgstr[0] "Het gekozen bestand bevat %'lu regel tekst. " msgstr[1] "Het gekozen bestand bevat %'lu regels tekst. " #: src/ui/gui/psppire-import-assistant.c:950 #, c-format msgid "The selected file contains approximately %'lu line of text. " msgid_plural "The selected file contains approximately %'lu lines of text. " msgstr[0] "Het gekozen bestand bevat ongeveer %'lu regel tekst. " msgstr[1] "Het gekozen bestand bevat ongeveer %'lu regels tekst. " #: src/ui/gui/psppire-import-assistant.c:956 #, c-format msgid "" "Only the first %zu line of the file will be shown for preview purposes in " "the following screens. " msgid_plural "" "Only the first %zu lines of the file will be shown for preview purposes in " "the following screens. " msgstr[0] "" "Alleen de eerste %zu regel van het bestand wordt bij wijze van voorbeeld in " "de volgende schermen getoond. " msgstr[1] "" "Alleen de eerste %zu regels van het bestand worden bij wijze van voorbeeld " "in de volgende schermen getoond. " #: src/ui/gui/psppire-import-assistant.c:965 msgid "You may choose below how much of the file should actually be imported." msgstr "" "Hieronder kunt u kiezen hoeveel van het bestand daadwerkelijk geïmporteerd " "moet worden." #: src/ui/gui/psppire-import-assistant.c:974 #, c-format msgid "Only the first %4d cases" msgstr "Alleen de eerste %4d observaties" #: src/ui/gui/psppire-import-assistant.c:985 #, c-format msgid "Only the first %3d %% of file (approximately)" msgstr "Niet meer dan de eerste %3d %% van het bestand (ongeveer)" #: src/ui/gui/psppire-import-assistant.c:1009 msgid "Select the Lines to Import" msgstr "Kies de te importeren regels" #: src/ui/gui/psppire-import-assistant.c:1151 msgid "Choose Separators" msgstr "Kies scheidingstekens" #: src/ui/gui/psppire-import-assistant.c:1438 msgid "Adjust Variable Formats" msgstr "Pas variabelenindeling aan" #: src/ui/gui/psppire-output-view.c:410 msgid "Message" msgstr "Bericht" #: src/ui/gui/psppire-output-view.c:543 msgid "failed to create temporary directory during clipboard operation" msgstr "tijdelijke directory aanmaken tijdens klembord-operatie is mislukt" #: src/ui/gui/psppire-output-window.c:241 msgid "Infer file type from extension" msgstr "Leid bestandstype af uit extensie" #: src/ui/gui/psppire-output-window.c:242 msgid "SPSS Viewer (*.spv)" msgstr "SPSS Viewer (*.spv)" #: src/ui/gui/psppire-output-window.c:243 msgid "PDF (*.pdf)" msgstr "PDF (*.pdf)" #: src/ui/gui/psppire-output-window.c:244 msgid "HTML (*.html)" msgstr "HTML (*.html)" #: src/ui/gui/psppire-output-window.c:245 msgid "OpenDocument (*.odt)" msgstr "OpenDocument (*.odt)" #: src/ui/gui/psppire-output-window.c:246 msgid "Text (*.txt)" msgstr "Tekst (*.txt)" #: src/ui/gui/psppire-output-window.c:247 msgid "Text [plain] (*.txt)" msgstr "Platte tekst (*.txt)" #: src/ui/gui/psppire-output-window.c:248 msgid "PostScript (*.ps)" msgstr "PostScript (*.ps)" #: src/ui/gui/psppire-output-window.c:249 msgid "Comma-Separated Values (*.csv)" msgstr "Door komma's gescheiden waarden (*.csv)" #: src/ui/gui/psppire-output-window.c:350 msgid "Export Output" msgstr "Exporteer uitvoer" #: src/ui/gui/psppire-output-window.c:548 msgid "Output Viewer" msgstr "Uitvoerweergever" #: src/ui/gui/psppire-spreadsheet-model.c:237 msgid "(empty)" msgstr "(leeg)" #: src/ui/gui/psppire-syntax-window.c:226 msgid "Text Search" msgstr "Zoeken van tekst" #: src/ui/gui/psppire-syntax-window.c:229 msgid "_OK" msgstr "_OK" #: src/ui/gui/psppire-syntax-window.c:231 msgid "_Cancel" msgstr "_Annuleren" #: src/ui/gui/psppire-syntax-window.c:239 msgid "Text to search for:" msgstr "Zoektekst:" #: src/ui/gui/psppire-syntax-window.c:570 #, c-format msgid "Saved file `%s'" msgstr "Bestand `%s' opgeslagen" #: src/ui/gui/psppire-syntax-window.c:591 msgid "Save Syntax" msgstr "Sla syntax op" #: src/ui/gui/psppire-syntax-window.c:601 src/ui/gui/psppire-window.c:657 msgid "Syntax Files (*.sps) " msgstr "Syntaxbestanden (*.sps) " #: src/ui/gui/psppire-syntax-window.c:970 msgid "Syntax Editor" msgstr "Syntaxbewerker" #: src/ui/gui/psppire-syntax-window.c:990 #, c-format msgid "Cannot load syntax file `%s'" msgstr "Kan syntaxbestand `%s' niet laden" #: src/ui/gui/psppire-variable-sheet.c:412 #, c-format msgid "{%s, %s}..." msgstr "{%s, %s}..." #: src/ui/gui/psppire-var-sheet-header.c:64 msgid "Decimal" msgstr "Decimaal" #: src/ui/gui/psppire-var-sheet-header.c:79 msgid "Align" msgstr "Uitlijnen" #: src/ui/gui/psppire-var-sheet-header.c:82 msgid "Measure" msgstr "Meting" #: src/ui/gui/psppire-window.c:430 #, c-format msgid "Save the changes to `%s' before closing?" msgstr "Moeten de aanpassingen vóór het afsluiten in `%s' worden opgeslagen?" #: src/ui/gui/psppire-window.c:437 #, c-format msgid "" "If you don't save, changes from the last %ld seconds will be permanently " "lost." msgstr "" "Als u niet opslaat, zullen aanpassingen van de laatste %ld seconden " "permanent verloren gaan." #: src/ui/gui/psppire-window.c:441 msgid "Close _without saving" msgstr "Sluit _zonder op te slaan" #: src/ui/gui/psppire-window.c:625 src/ui/gui/psppire-window.c:629 msgid "Open" msgstr "Open" #: src/ui/gui/psppire-window.c:634 msgid "Data and Syntax Files" msgstr "Gegevens- en syntaxbestanden" #: src/ui/gui/psppire-window.c:646 msgid "System Files (*.sav, *.zsav)" msgstr "Systeembestanden (*.sav, *.zsav)" #: src/ui/gui/psppire-window.c:663 msgid "Output Files (*.spv) " msgstr "Uitvoerbestanden (*.spv) " #: src/ui/gui/t-test-options.c:65 #, c-format msgid "Con_fidence Interval: %2d %%" msgstr "Betrouwbaarheidsinterval: %2d %%" #: src/ui/gui/val-labs-dialog.c:591 #, c-format msgid "%s = `%s'" msgstr "%s = `%s'" #: src/ui/gui/var-type-dialog.c:541 #, fuzzy #| msgid "Variable and Name" msgid "Variable Type and Format" msgstr "Variabele en naam" #: src/ui/gui/windows-menu.c:92 msgid "_Minimize all Windows" msgstr "_Minimaliseer alle vensters" #: src/ui/gui/windows-menu.c:100 msgid "_Split" msgstr "_Splits" #: src/ui/gui/windows-menu.c:132 msgid "_Windows" msgstr "_Venster" #: utilities/pspp-convert.c:67 #, c-format msgid "%s argument must be a single character" msgstr "argument voor %s moet één teken zijn" #: utilities/pspp-convert.c:265 msgid "exactly two non-option arguments are required; use --help for help" msgstr "" "precies twee niet-optie-argumenten zijn verplicht; gebruik --help voor hulp" #: utilities/pspp-convert.c:276 #, c-format msgid "%s: cannot guess output format (use -O option)" msgstr "%s: kan de uitvoerindeling niet raden (gebruik optie -O)" #: utilities/pspp-convert.c:341 #, c-format msgid "%s: unknown output format (use -O option)" msgstr "%s: onbekende uitvoerindeling (gebruik optie -O)" #: utilities/pspp-convert.c:360 #, c-format msgid "%s: error reading input file" msgstr "%s: fout bij lezen invoerbestand" #: utilities/pspp-convert.c:362 #, c-format msgid "%s: error writing output file" msgstr "%s: fout bij schrijven uitvoerbestand" #: utilities/pspp-convert.c:409 #, c-format msgid "%s: error opening password file" msgstr "%s: fout bij openen wachtwoordbestand" #: utilities/pspp-convert.c:425 #, c-format msgid "" "\n" "%s: password not in file" msgstr "" "\n" "%s: wachtwoord niet in bestand" #: utilities/pspp-convert.c:462 #, c-format msgid "%s: '%c' is not in alphabet" msgstr "%s: '%c' zit niet in alfabet" #: utilities/pspp-convert.c:526 msgid "sorry, wrong password" msgstr "sorry, verkeerd wachtwoord" #: utilities/pspp-output.c:92 #, c-format msgid "%s and %s:" msgstr "%s en %s:" #: utilities/pspp-output.c:547 #, c-format msgid "%s: invalid XPath expression" msgstr "%s: onjuiste XPath-expressie" #: utilities/pspp-output.c:716 msgid "missing command name (use --help for help)" msgstr "opdrachtnaam ontbreekt (geef --help voor hulp)" #: utilities/pspp-output.c:720 #, c-format msgid "unknown command \"%s\" (use --help for help)" msgstr "opdracht \"%s\" onbekend (geef --help voor hulp)" #: utilities/pspp-output.c:728 #, fuzzy, c-format #| msgid "\"%s\" command takes exactly %d argument%s" msgid "\"%s\" command takes exactly %d argument" msgid_plural "\"%s\" command takes exactly %d arguments" msgstr[0] "opdracht \"%s\" aanvaardt precies %d argument%s" msgstr[1] "opdracht \"%s\" aanvaardt precies %d argument%s" #: utilities/pspp-output.c:735 #, fuzzy, c-format #| msgid "\"%s\" command requires at least %d argument%s" msgid "\"%s\" command requires at least %d argument" msgid_plural "\"%s\" command requires at least %d arguments" msgstr[0] "\"%s\" vereist tenminste %d-argument%s" msgstr[1] "\"%s\" vereist tenminste %d-argument%s" #: utilities/pspp-output.c:742 #, c-format msgid "\"%s\" command requires between %d and %d arguments" msgstr "\"%s\"-opdracht vereist tussen %d en %d argumenten" #: utilities/pspp-output.c:782 msgid "The following object classes are supported:" msgstr "De volgende objectklassen worden ondersteund:" #: utilities/pspp-output.c:791 #, c-format msgid "%s: unknown object class (use --select=help for help" msgstr "%s: onbekende objectklasse (geef --select=help voor hulp)" #: src/language/utilities/set.q:162 #, c-format msgid "%s must be between 0 and 20." msgstr "%s moet tussen 0 en 20 zijn." #: src/language/utilities/set.q:172 src/language/utilities/set.q:179 #, c-format msgid "%s must be at least 1." msgstr "%s moet tenminste 1 zijn." #: src/language/utilities/set.q:205 #, c-format msgid "%s must be at least 1MB" msgstr "%s moet tenminste 1MB zijn" #: src/language/utilities/set.q:207 #, c-format msgid "%s must be positive" msgstr "%s moet positief zijn" #: src/language/utilities/set.q:213 src/language/utilities/set.q:215 #: src/language/utilities/set.q:217 src/language/utilities/set.q:219 #: src/language/utilities/set.q:221 src/language/utilities/set.q:223 #: src/language/utilities/set.q:225 src/language/utilities/set.q:227 #: src/language/utilities/set.q:229 src/language/utilities/set.q:231 #: src/language/utilities/set.q:233 #, c-format msgid "%s is obsolete." msgstr "%s is verouderd." #: src/language/utilities/set.q:239 msgid "Active file compression is not implemented." msgstr "Actieve bestandscompressie is niet geïmplementeerd." #: src/language/utilities/set.q:403 #, c-format msgid "%s must be 1500 or later." msgstr "%s moet 1500 of later zijn." #: src/language/utilities/set.q:410 #, c-format msgid "expecting %s or year" msgstr "%s of jaar wordt verwacht" #: src/language/utilities/set.q:438 src/language/utilities/set.q:535 #, c-format msgid "%s must be at least %d." msgstr "%s moet tenminste %d zijn." #: src/language/utilities/set.q:474 #, c-format msgid "%s is not a recognized encoding or locale name" msgstr "%s is geen herkende codering of lokale naam" #: src/language/utilities/set.q:562 #, c-format msgid "" "%s requires numeric output format as an argument. Specified format %s is of " "type string." msgstr "" "%s vereist numerieke uitvoeropmaak als een argument. Opgegeven opmaak %s is " "van het type alfanumeriek." #: src/language/utilities/set.q:791 msgid "ISL (32-bit IEEE 754 single, little-endian)" msgstr "ISL (32-bit IEEE 754 single, little-endian)" #: src/language/utilities/set.q:794 msgid "ISB (32-bit IEEE 754 single, big-endian)" msgstr "ISB (32-bit IEEE 754 single, big-endian)" #: src/language/utilities/set.q:797 msgid "IDL (64-bit IEEE 754 double, little-endian)" msgstr "IDL (64-bit IEEE 754 double, little-endian)" #: src/language/utilities/set.q:800 msgid "IDB (64-bit IEEE 754 double, big-endian)" msgstr "IDB (64-bit IEEE 754 double, big-endian)" #: src/language/utilities/set.q:804 msgid "VF (32-bit VAX F, VAX-endian)" msgstr "VF (32-bit VAX F, VAX-endian)" #: src/language/utilities/set.q:807 msgid "VD (64-bit VAX D, VAX-endian)" msgstr "VD (64-bit VAX D, VAX-endian)" #: src/language/utilities/set.q:810 msgid "VG (64-bit VAX G, VAX-endian)" msgstr "VG (64-bit VAX G, VAX-endian)" #: src/language/utilities/set.q:814 msgid "ZS (32-bit IBM Z hexadecimal short, big-endian)" msgstr "ZS (32-bit IBM Z hexadecimal short, big-endian)" #: src/language/utilities/set.q:817 msgid "ZL (64-bit IBM Z hexadecimal long, big-endian)" msgstr "ZL (64-bit IBM Z hexadecimal long, big-endian)" #: src/language/utilities/set.q:985 #, c-format msgid "%s is %s." msgstr "%s is %s." #: src/language/utilities/set.q:1089 #, c-format msgid "" "Too many %s commands without a %s: at most %d levels of saved settings are " "allowed." msgstr "" "Te veel %s-opdrachten zonder een %s: ten hoogste %d niveaus van \"saved " "settings\" zijn toegestaand." #: src/language/utilities/set.q:1109 #, c-format msgid "%s without matching %s." msgstr "%s zonder overeenkomende %s." #: src/language/stats/crosstabs.q:327 #, c-format msgid "Missing mode %s not allowed in general mode. Assuming %s." msgstr "" "\"Missing modus\" %s niet toegestaan in algemene modus. %s wordt aangenomen." #: src/language/stats/crosstabs.q:444 msgid "Too many cross-tabulation variables or dimensions." msgstr "Teveel kruistabel-variabelen of -dimensies." #: src/language/stats/crosstabs.q:509 #, c-format msgid "%s must be specified before %s." msgstr "%s moet vóór %s worden opgegeven." #: src/language/stats/crosstabs.q:543 #, c-format msgid "Maximum value (%ld) less than minimum value (%ld)." msgstr "Maximumwaarde (%ld) is kleiner dan minimumwaarde (%ld)." #: src/language/stats/crosstabs.q:922 msgid "Summary" msgstr "Samenvatting" #: src/language/stats/crosstabs.q:935 msgid "Crosstabulation" msgstr "Kruistabel" #. TRANSLATORS: The %s here describes a crosstabulation. It takes the #. form "var1 * var2 * var3 * ...". #: src/language/stats/crosstabs.q:1013 #, c-format msgid "Crosstabulation %s contained no non-missing cases." msgstr "Kruistabulatie %s bevatte geen niet-ontbrekende observaties." #: src/language/stats/crosstabs.q:1204 msgid "Missing value" msgstr "Ontbrekende waarde" #: src/language/stats/crosstabs.q:1263 msgid "Row %" msgstr "Rij-%" #: src/language/stats/crosstabs.q:1264 msgid "Column %" msgstr "Kolom-%" #: src/language/stats/crosstabs.q:1265 msgid "Total %" msgstr "Totaal-%" #: src/language/stats/crosstabs.q:1269 msgid "Adjusted Residual" msgstr "Aangepast residu" #: src/language/stats/crosstabs.q:1288 msgid "Chi-Square Tests" msgstr "Chi-kwadraattoetsen" #: src/language/stats/crosstabs.q:1294 msgid "Pearson Chi-Square" msgstr "Pearson Chi-kwadraat" #: src/language/stats/crosstabs.q:1295 msgid "Likelihood Ratio" msgstr "Waarschijnlijkheidsratio" #: src/language/stats/crosstabs.q:1296 msgid "Fisher's Exact Test" msgstr "Exact-toets van Fisher" #: src/language/stats/crosstabs.q:1297 msgid "Continuity Correction" msgstr "Continuïteitscorrectie" #: src/language/stats/crosstabs.q:1298 msgid "Linear-by-Linear Association" msgstr "Associatie van lineair met lineair" #: src/language/stats/crosstabs.q:1299 src/language/stats/crosstabs.q:1345 #: src/language/stats/crosstabs.q:1854 msgid "N of Valid Cases" msgstr "N van geldige observaties" #: src/language/stats/crosstabs.q:1305 msgid "Asymptotic Sig. (2-tailed)" msgstr "Asympt. sign. (tweezijdig)" #: src/language/stats/crosstabs.q:1319 msgid "Symmetric Measures" msgstr "Symmetrische metingen" #: src/language/stats/crosstabs.q:1324 src/language/stats/crosstabs.q:1364 #: src/language/stats/crosstabs.q:1411 msgid "Values" msgstr "Waarden" #: src/language/stats/crosstabs.q:1326 src/language/stats/crosstabs.q:1413 msgid "Asymp. Std. Error" msgstr "Asympt. stand.fout" #: src/language/stats/crosstabs.q:1327 src/language/stats/crosstabs.q:1414 msgid "Approx. T" msgstr "Ongev. T" #: src/language/stats/crosstabs.q:1328 src/language/stats/crosstabs.q:1415 msgid "Approx. Sig." msgstr "Ongev. Sig." #: src/language/stats/crosstabs.q:1333 src/language/stats/crosstabs.q:1420 msgid "Nominal by Nominal" msgstr "Nominaal met nominaal" #: src/language/stats/crosstabs.q:1334 msgid "Cramer's V" msgstr "Cramers V" #: src/language/stats/crosstabs.q:1334 msgid "Contingency Coefficient" msgstr "Contingentiecoëfficiënt" #: src/language/stats/crosstabs.q:1336 src/language/stats/crosstabs.q:1425 msgid "Ordinal by Ordinal" msgstr "Ordinaal met ordinaal" #: src/language/stats/crosstabs.q:1337 msgid "Kendall's tau-b" msgstr "Kendalls tau-b" #: src/language/stats/crosstabs.q:1337 msgid "Kendall's tau-c" msgstr "Kendalls tau-c" #: src/language/stats/crosstabs.q:1338 msgid "Spearman Correlation" msgstr "Spearmancorrelatie" #: src/language/stats/crosstabs.q:1340 msgid "Interval by Interval" msgstr "Interval met interval" #: src/language/stats/crosstabs.q:1341 msgid "Pearson's R" msgstr "Pearsons R" #: src/language/stats/crosstabs.q:1343 msgid "Measure of Agreement" msgstr "Mate van overeenstemming" #: src/language/stats/crosstabs.q:1359 msgid "Risk Estimate" msgstr "Risicoschatting" #: src/language/stats/crosstabs.q:1368 #, fuzzy, no-c-format #| msgid "%g%% Confidence Interval" msgid "95% Confidence Interval" msgstr "%g%%-betrouwbaarheidsinterval" # msgid "95% Confidence Interval" # msgstr "95% betrouwbaarheidsinterval" #: src/language/stats/crosstabs.q:1389 msgid "Symmetric" msgstr "Symmetrisch" #: src/language/stats/crosstabs.q:1391 src/language/stats/crosstabs.q:1396 #, c-format msgid "%s Dependent" msgstr "%s Afhankelijk" #: src/language/stats/crosstabs.q:1406 msgid "Directional Measures" msgstr "Directionele metingen" #: src/language/stats/crosstabs.q:1422 msgid "Goodman and Kruskal tau" msgstr "Goodman en Kruskals tau" #: src/language/stats/crosstabs.q:1423 msgid "Uncertainty Coefficient" msgstr "Onzekerheidscoëfficiënt" #: src/language/stats/crosstabs.q:1426 msgid "Somers' d" msgstr "Somers' d" #: src/language/stats/crosstabs.q:1428 msgid "Nominal by Interval" msgstr "Nominaal met interval" #: src/language/stats/crosstabs.q:1826 #, c-format msgid "Odds Ratio for %s" msgstr "\"Odds ratio\" voor %s" #: src/language/stats/crosstabs.q:1835 #, c-format msgid "For cohort %s = " msgstr "Voor cohort %s = " #: src/ui/gui/aggregate.ui:24 msgid "Aggregate Data" msgstr "Aggregeer gegevens" #: src/ui/gui/aggregate.ui:126 msgid "_Break variable(s)" msgstr "_Break-variabele(n)" #: src/ui/gui/aggregate.ui:179 msgid "Variable Name: " msgstr "Variabelenaam: " #: src/ui/gui/aggregate.ui:215 msgid "Variable Label: " msgstr "Variabelelabels: " #: src/ui/gui/aggregate.ui:252 msgid "Function: " msgstr "Functie: " #: src/ui/gui/aggregate.ui:327 msgid "Argument 1: " msgstr "Argument 1: " #: src/ui/gui/aggregate.ui:364 msgid "Argument 2: " msgstr "Argument 2: " #: src/ui/gui/aggregate.ui:428 msgid "Aggregated variables" msgstr "Geaggregeerde variabelen" #: src/ui/gui/aggregate.ui:469 msgid "_Add aggregated variables to the active dataset" msgstr "Voeg geaggregeerde variabelen toe aan _actieve dataset" #: src/ui/gui/aggregate.ui:486 msgid "_Replace the current dataset with the aggregated variables" msgstr "Vervang _huidige dataset door geaggregeerde variabelen" #: src/ui/gui/aggregate.ui:504 msgid "_Write a new data file containing only the aggregated variables" msgstr "" "_Schrijf nieuw gegevensbestand dat uitsluitend geaggregeerde variabelen bevat" #: src/ui/gui/aggregate.ui:544 msgid "label" msgstr "label" #: src/ui/gui/aggregate.ui:593 msgid "File is _already sorted on break variable(s)" msgstr "Bestand is _reeds gesorteerd op break-variabele(n)" #: src/ui/gui/aggregate.ui:609 msgid "Sort file before a_ggregating" msgstr "Sorteer bestand _vóór aggregeren" #: src/ui/gui/aggregate.ui:630 msgid "Options for very large datasets" msgstr "Opties voor zeer grote datasets" #: src/ui/gui/autorecode.ui:24 msgid "Automatic Recode" msgstr "Automatische hercodering" #: src/ui/gui/autorecode.ui:120 msgid "Variable -> New Name" msgstr "Variabele -> nieuwe naam" #: src/ui/gui/autorecode.ui:145 msgid "_Lowest value" msgstr "_Laagste waarde" #: src/ui/gui/autorecode.ui:163 msgid "_Highest value" msgstr "_Hoogste waarde" #: src/ui/gui/autorecode.ui:185 msgid "Recode starting from" msgstr "Hercoderen beginnen met" #: src/ui/gui/autorecode.ui:204 msgid "_New Name" msgstr "_Nieuwe naam" #: src/ui/gui/autorecode.ui:227 msgid "_Add New Name" msgstr "_Voeg nieuwe naam toe" #: src/ui/gui/autorecode.ui:285 msgid "_Use the same recoding scheme for all variables" msgstr "Gebruik hetzelfde hercoderingsschema voor _alle variabelen" #: src/ui/gui/autorecode.ui:301 msgid "Treat _blank string values as missing" msgstr "Behandel _lege tekenreeksen als ontbrekend" #: src/ui/gui/binomial.ui:86 msgid "_Test Variable List:" msgstr "_Toetsvariabelen:" #: src/ui/gui/binomial.ui:160 src/ui/gui/chi-square.ui:281 msgid "_Get from data" msgstr "_Haal op uit data" #: src/ui/gui/binomial.ui:181 src/ui/gui/indep-samples.ui:150 msgid "_Cut point:" msgstr "_Afsnijpunt:" #: src/ui/gui/binomial.ui:225 msgid "Define Dichotomy" msgstr "Definieer dichotomie" #: src/ui/gui/binomial.ui:245 msgid "Test _Proportion:" msgstr "Toets_proportie:" #: src/ui/gui/compute.ui:32 msgid "Compute Variable: Type and Label" msgstr "Bereken variabele: type en label" #: src/ui/gui/compute.ui:67 msgid "Use _expression as label" msgstr "Gebruik _expressie als label" #: src/ui/gui/compute.ui:90 msgid "_Label:" msgstr "_Label:" #: src/ui/gui/compute.ui:194 msgid "_String" msgstr "_Alfanumeriek" #: src/ui/gui/compute.ui:287 msgid "_Numeric" msgstr "_Numeriek" #: src/ui/gui/compute.ui:343 msgid "Compute Variable" msgstr "Bereken variabele" #: src/ui/gui/compute.ui:381 msgid "Target _Variable:" msgstr "Doel_variabele:" #: src/ui/gui/compute.ui:412 msgid "_Type & Label..." msgstr "_Type en label..." #: src/ui/gui/compute.ui:469 msgid "=" msgstr "=" #: src/ui/gui/compute.ui:526 msgid "_Numeric Expressions:" msgstr "_Numerieke expressies:" #: src/ui/gui/compute.ui:598 msgid "_Functions:" msgstr "_Functies:" #: src/ui/gui/compute.ui:678 msgid "_If..." msgstr "_Als..." #: src/ui/gui/barchart.ui:24 msgid "Barchart" msgstr "Staafdiagram" #: src/ui/gui/barchart.ui:112 msgid "Category A_xis:" msgstr "Ca_tegorie-as:" #: src/ui/gui/barchart.ui:140 msgid "_N of cases" msgstr "_Aantal observaties" #: src/ui/gui/barchart.ui:158 msgid "_Cum. n of cases" msgstr "_Cum. aantal observaties" #: src/ui/gui/barchart.ui:174 msgid "Other _summary function" msgstr "Andere _samenvattingsfunctie" #: src/ui/gui/barchart.ui:191 msgid "% of c_ases" msgstr "% van _observaties" #: src/ui/gui/barchart.ui:207 msgid "C_um. % of cases" msgstr "C_um. % van observaties" #: src/ui/gui/barchart.ui:270 src/ui/gui/histogram.ui:100 msgid "_Variable:" msgstr "_Variabele:" #: src/ui/gui/barchart.ui:308 msgid "Bars Represent" msgstr "Staven staan voor" #: src/ui/gui/barchart.ui:340 msgid "Category C_luster:" msgstr "Categoriec_luster:" #: src/ui/gui/correlation.ui:24 msgid "Bivariate Correlations" msgstr "Bivariate correlaties" #: src/ui/gui/correlation.ui:148 msgid "Pearso_n" msgstr "Pearso_n" #: src/ui/gui/correlation.ui:164 msgid "_Kendall's tau-b" msgstr "_Kendalls tau-b" #: src/ui/gui/correlation.ui:180 msgid "_Spearman" msgstr "_Spearman" #: src/ui/gui/correlation.ui:200 msgid "Correlation Coefficients" msgstr "Correlatiecoëfficiënten" #: src/ui/gui/correlation.ui:224 msgid "_Two-tailed" msgstr "_Tweezijdig" #: src/ui/gui/correlation.ui:241 msgid "One-tai_led" msgstr "_Eenzijdig" #: src/ui/gui/correlation.ui:262 msgid "Test of Significance" msgstr "Significantietoets" #: src/ui/gui/correlation.ui:275 msgid "_Flag significant correlations" msgstr "_Markeer significante correlaties" #: src/ui/gui/count.ui:24 msgid "Count Occurrences of Values within Cases" msgstr "Tel waarden in observaties" #: src/ui/gui/count.ui:117 msgid "Numeric _Variables:" msgstr "Numerieke variabelen:" #: src/ui/gui/count.ui:147 msgid "_Target Variable:" msgstr "_Doelvariabele:" #: src/ui/gui/count.ui:178 msgid "Target _Label:" msgstr "Doel_label:" #: src/ui/gui/count.ui:192 msgid "_Define Values..." msgstr "_Defineer waarden..." #: src/ui/gui/count.ui:257 msgid "Count Values within Cases: Values to Count" msgstr "Tel waarden in observaties: te tellen waarden" #: src/ui/gui/count.ui:305 msgid "Values _to Count:" msgstr "_Te tellen waarden:" #: src/ui/gui/comments.ui:25 msgid "Data File Comments" msgstr "Opmerkingen in gegevensbestand" #: src/ui/gui/comments.ui:49 msgid "Comments:" msgstr "Opmerkingen:" #: src/ui/gui/comments.ui:106 msgid "Display comments in output" msgstr "Toon opmerkingen in uitvoer" #: src/ui/gui/comments.ui:127 msgid "Column Number: 0" msgstr "Kolomnummer: 0" #: src/ui/gui/crosstabs.ui:25 msgid "Crosstabs: Cells" msgstr "Kruistabellen: cellen" #: src/ui/gui/crosstabs.ui:67 msgid "Cell Display" msgstr "Celweergave" #: src/ui/gui/crosstabs.ui:99 msgid "Crosstabs" msgstr "Kruistabellen" #: src/ui/gui/crosstabs.ui:150 msgid "_Rows" msgstr "_Rijen" #: src/ui/gui/crosstabs.ui:195 msgid "_Columns" msgstr "_Kolommen" #: src/ui/gui/crosstabs.ui:242 msgid "_Format..." msgstr "_Opmaak..." #: src/ui/gui/crosstabs.ui:256 src/ui/gui/examine.ui:267 msgid "_Statistics..." msgstr "_Statistische maten..." #: src/ui/gui/crosstabs.ui:270 msgid "Ce_lls..." msgstr "_Cellen..." #: src/ui/gui/crosstabs.ui:348 msgid "Crosstabs: Format" msgstr "Kruistabellen: opmaak" #: src/ui/gui/crosstabs.ui:371 msgid "Print tables" msgstr "Druk tabellen af" #: src/ui/gui/crosstabs.ui:387 msgid "Pivot" msgstr "Draai" #: src/ui/gui/crosstabs.ui:403 src/ui/gui/sort.ui:157 msgid "Ascending" msgstr "Oplopend" #: src/ui/gui/crosstabs.ui:455 msgid "Crosstabs: Statistics" msgstr "Kruistabellen: statistische maten" #: src/ui/gui/chi-square.ui:30 msgid "Chi-Square Test" msgstr "Chi-kwadraattoets" #: src/ui/gui/chi-square.ui:82 msgid "All categor_ies equal" msgstr "_Alle categorieën gelijk" #: src/ui/gui/chi-square.ui:103 msgid "_Values" msgstr "_Waarden" #: src/ui/gui/chi-square.ui:159 msgid "Expected Values:" msgstr "Verwachte waarden:" #: src/ui/gui/chi-square.ui:204 msgid "Test _Variables" msgstr "_Toetsvariabelen" #: src/ui/gui/chi-square.ui:298 msgid "Use _specified range" msgstr "_Gebruik gespecificeerd bereik" #: src/ui/gui/chi-square.ui:323 msgid "_Lower:" msgstr "_Onder:" #: src/ui/gui/chi-square.ui:337 msgid "_Upper:" msgstr "_Boven:" #: src/ui/gui/chi-square.ui:381 msgid "Expected Range:" msgstr "Verwacht bereik:" #: src/ui/gui/descriptives.ui:131 src/ui/gui/factor.ui:797 #: src/ui/gui/recode.ui:638 msgid "_Variables:" msgstr "_Variabelen:" #: src/ui/gui/descriptives.ui:176 msgid "S_tatistics:" msgstr "_Statistische maten:" #: src/ui/gui/descriptives.ui:230 msgid "_Exclude entire case if any selected variable is missing" msgstr "Sluit _observatie geheel uit als een gekozen variabele ontbreekt" #: src/ui/gui/descriptives.ui:247 msgid "_Include user-missing data in analysis" msgstr "_Inclusief \"user-missing\" gegevens in analyse" #: src/ui/gui/descriptives.ui:264 msgid "Save _Z-scores of selected variables as new variables" msgstr "Sla _Z-scores van gekozen variabelen op als nieuwe variabelen" #: src/ui/gui/descriptives.ui:286 msgid "Options:" msgstr "Opties:" #: src/ui/gui/examine.ui:25 msgid "Explore" msgstr "Ontdek" #: src/ui/gui/examine.ui:69 msgid "_Label Cases by:" msgstr "_Label observaties via:" #: src/ui/gui/examine.ui:116 msgid "_Factor List:" msgstr "_Factoren:" #: src/ui/gui/examine.ui:163 src/ui/gui/means.ui:126 msgid "_Dependent List:" msgstr "_Afhankelijke variabelen:" #: src/ui/gui/examine.ui:331 msgid "Explore: Options" msgstr "Onderzoek: Opties" #: src/ui/gui/examine.ui:355 src/ui/gui/t-test.ui:81 msgid "Exclude cases _listwise" msgstr "Sluit observaties _lijstgewijs uit" #: src/ui/gui/examine.ui:373 msgid "Exclude cases _pairwise" msgstr "Sluit observaties _paarsgewijs uit" #: src/ui/gui/examine.ui:392 msgid "_Report values" msgstr "_Rapporteer waarden" #: src/ui/gui/examine.ui:449 msgid "Explore: Statistics" msgstr "Onderzoek: Statistieken" #: src/ui/gui/examine.ui:468 src/ui/gui/oneway.ui:576 msgid "_Descriptives" msgstr "_Beschrijvende maten" #: src/ui/gui/examine.ui:485 msgid "_Extremes" msgstr "_Extremen" #: src/ui/gui/examine.ui:502 msgid "_Percentiles" msgstr "_Percentielen" #: src/ui/gui/goto-case.ui:31 msgid "Goto Case" msgstr "Ga naar observatie" #: src/ui/gui/goto-case.ui:52 msgid "Goto Case Number:" msgstr "Ga naar observatie nummer:" #: src/ui/gui/factor.ui:39 msgid "Factor Analysis: Rotation" msgstr "Factoranalyse: rotatie" #: src/ui/gui/factor.ui:70 msgid "_None" msgstr "_Geen" #: src/ui/gui/factor.ui:87 msgid "_Varimax" msgstr "_Varimax" #: src/ui/gui/factor.ui:104 msgid "_Quartimax" msgstr "_Quartimax" #: src/ui/gui/factor.ui:123 msgid "_Equimax" msgstr "_Equimax" #: src/ui/gui/factor.ui:146 msgid "Method" msgstr "Methode" #: src/ui/gui/factor.ui:159 msgid "_Display rotated solution" msgstr "_Toon geroteerde oplossing" #: src/ui/gui/factor.ui:181 src/ui/gui/factor.ui:582 msgid "Ma_ximum iterations for convergence:" msgstr "_Maximaal aantal iteraties om convergentie te bereiken:" #: src/ui/gui/factor.ui:241 src/ui/gui/factor.ui:255 msgid "Principal Components Analysis" msgstr "Principale componentenanalyse" #: src/ui/gui/factor.ui:246 src/ui/gui/factor.ui:258 msgid "Principal Axis Factoring" msgstr "Principale assenanalyse" #: src/ui/gui/factor.ui:264 msgid "Factor Analysis: Extraction" msgstr "Factoranalyse: extractie" #: src/ui/gui/factor.ui:290 msgid "_Method: " msgstr "_Methode: " #: src/ui/gui/factor.ui:345 msgid "Co_rrelation matrix" msgstr "Co_rrelatiematrix" #: src/ui/gui/factor.ui:361 msgid "Co_variance matrix" msgstr "Co_variantiematrix" #: src/ui/gui/factor.ui:382 msgid "Analyze" msgstr "Analyseer" #: src/ui/gui/factor.ui:407 msgid "_Unrotated factor solution" msgstr "_Niet-geroteerde factoroplossing" #: src/ui/gui/factor.ui:423 msgid "_Scree plot" msgstr "_Puindiagram" #: src/ui/gui/factor.ui:443 src/ui/gui/histogram.ui:146 src/ui/gui/roc.ui:329 msgid "Display" msgstr "Weergave" #: src/ui/gui/factor.ui:526 msgid "_Number of factors:" msgstr "_Aantal factoren:" #: src/ui/gui/factor.ui:563 msgid "Extract" msgstr "Extraheer" #: src/ui/gui/factor.ui:640 msgid "Factor Analysis" msgstr "Factoranalyse" #: src/ui/gui/factor.ui:672 src/ui/gui/data-editor.ui:266 msgid "_Descriptives..." msgstr "_Beschrijvende maten..." #: src/ui/gui/factor.ui:685 msgid "_Extraction..." msgstr "_Extractie..." #: src/ui/gui/factor.ui:699 msgid "_Rotations..." msgstr "_Rotaties..." #: src/ui/gui/find.ui:25 msgid "Find Case" msgstr "Zoek observatie" #: src/ui/gui/find.ui:117 msgid "Variable:" msgstr "Variabele:" #: src/ui/gui/find.ui:157 src/ui/gui/val-labs-dialog.ui:113 msgid "Value:" msgstr "Waarde:" #: src/ui/gui/find.ui:180 msgid "Search value labels" msgstr "Zoek waardelabels" #: src/ui/gui/find.ui:210 msgid "Regular expression Match" msgstr "Overeenkomst met reguliere expressie" #: src/ui/gui/find.ui:227 msgid "Search substrings" msgstr "Zoek delen van tekenreeksen" #: src/ui/gui/find.ui:244 msgid "Wrap around" msgstr "Tekstterugloop" #: src/ui/gui/find.ui:260 msgid "Search backward" msgstr "Zoek terug" #: src/ui/gui/frequencies.ui:32 msgid "Frequencies: Frequency Tables" msgstr "Frequenties: frequentietabellen" #: src/ui/gui/frequencies.ui:67 msgid "_Always" msgstr "_Altijd" #: src/ui/gui/frequencies.ui:85 msgid "_Never" msgstr "_Nooit" #: src/ui/gui/frequencies.ui:107 msgid "If no _more than " msgstr "Indien niet _meer dan " #: src/ui/gui/frequencies.ui:129 src/ui/gui/frequencies.ui:454 msgid "100" msgstr "100" #: src/ui/gui/frequencies.ui:145 msgid "values" msgstr "waarden" #: src/ui/gui/frequencies.ui:167 msgid "Display frequency tables" msgstr "Toon frequentietabelen" #: src/ui/gui/frequencies.ui:194 msgid "A_scending value" msgstr "_Oplopende waarde" #: src/ui/gui/frequencies.ui:212 msgid "D_escending value" msgstr "_Aflopende waarde" #: src/ui/gui/frequencies.ui:230 msgid "Ascending _frequency" msgstr "O_plopende frequentie" #: src/ui/gui/frequencies.ui:248 msgid "Descending f_requency" msgstr "A_flopende frequentie" #: src/ui/gui/frequencies.ui:271 msgid "Order by" msgstr "Sorteer op" #: src/ui/gui/frequencies.ui:324 msgid "Frequencies: Charts" msgstr "Frequenties: diagrammen" #: src/ui/gui/frequencies.ui:356 msgid "Scale:" msgstr "Schaal:" #: src/ui/gui/frequencies.ui:366 msgid "_Frequencies" msgstr "_Frequenties" #: src/ui/gui/frequencies.ui:383 msgid "_Percentages" msgstr "_Percentages" #: src/ui/gui/frequencies.ui:407 msgid "Exclude values _below " msgstr "Sluit waarden uit _onder " #: src/ui/gui/frequencies.ui:422 msgid "Exclude values _above " msgstr "Sluit waarden uit _boven " #: src/ui/gui/frequencies.ui:441 src/ui/gui/reliability.ui:227 msgid "0" msgstr "0" #: src/ui/gui/frequencies.ui:469 msgid "Chart Formatting" msgstr "Diagramopmaak" #: src/ui/gui/frequencies.ui:494 msgid "Draw _histograms" msgstr "Teken _histogrammen" #: src/ui/gui/frequencies.ui:510 msgid "Superimpose _normal curve" msgstr "Toon ook _normaalcurve" #: src/ui/gui/frequencies.ui:530 msgid "Histograms" msgstr "Histogrammen" #: src/ui/gui/frequencies.ui:555 msgid "Draw _bar charts" msgstr "Teken _staafdiagram" #: src/ui/gui/frequencies.ui:575 msgid "Bar Charts" msgstr "Staafdiagrammen" #: src/ui/gui/frequencies.ui:600 msgid "Draw _pie charts" msgstr "Teken _cirkeldiagram" #: src/ui/gui/frequencies.ui:616 msgid "Include slices for _missing values" msgstr "Voeg _taartpunten voor ontbrekende waarden toe" #: src/ui/gui/frequencies.ui:636 msgid "Pie Charts" msgstr "Cirkeldiagrammen" #: src/ui/gui/frequencies.ui:725 src/ui/gui/rank.ui:489 msgid "_Variable(s):" msgstr "_Variabele(n):" #: src/ui/gui/frequencies.ui:769 msgid "_Statistics:" msgstr "_Statistische maten:" #: src/ui/gui/frequencies.ui:783 msgid "Include _missing values" msgstr "_Gebruik ook ontbrekende waarden" #: src/ui/gui/frequencies.ui:806 msgid "Ch_arts..." msgstr "_Diagrammen..." #: src/ui/gui/frequencies.ui:821 msgid "Frequency _Tables..." msgstr "_Frequentietabellen..." #: src/ui/gui/histogram.ui:24 msgid "Histogram" msgstr "Histogram" #: src/ui/gui/histogram.ui:126 msgid "_Display normal curve" msgstr "_Toon normaalcurve" #: src/ui/gui/indep-samples.ui:25 src/ui/gui/k-independent.ui:35 msgid "Define Groups" msgstr "Definieer groepen" #: src/ui/gui/indep-samples.ui:75 msgid "Group_2 value:" msgstr "Waarde Groep_2:" #: src/ui/gui/indep-samples.ui:89 msgid "Group_1 value:" msgstr "Waarde Groep_1:" #: src/ui/gui/indep-samples.ui:190 msgid "_Use specified values:" msgstr "Gebr_uik opgegeven waarden:" #: src/ui/gui/indep-samples.ui:259 msgid "Independent-Samples T Test" msgstr "T-toets voor onafhankelijke steekproeven" #: src/ui/gui/indep-samples.ui:319 msgid "_Define Groups..." msgstr "_Definieer groepen..." #: src/ui/gui/indep-samples.ui:401 src/ui/gui/t-test.ui:211 msgid "_Test Variable(s):" msgstr "_Toetsvariabele(n):" #: src/ui/gui/indep-samples.ui:454 src/ui/gui/k-independent.ui:165 msgid "_Grouping Variable:" msgstr "_Groepeervariabele:" #: src/ui/gui/k-independent.ui:63 msgid "_Upper limit:" msgstr "_Bovengrens:" #: src/ui/gui/k-independent.ui:77 msgid "_Lower limit:" msgstr "_Ondergrens:" #: src/ui/gui/k-independent.ui:136 msgid "Tests for Several Independent Samples" msgstr "Toetsen voor meerdere afhankelijke steekproeven" #: src/ui/gui/k-independent.ui:208 src/ui/gui/ks-one-sample.ui:131 msgid "Test _Variable List:" msgstr "_Toetsvariabelen:" #: src/ui/gui/k-independent.ui:320 msgid "_Define Groups" msgstr "_Definieer groepen" #: src/ui/gui/k-independent.ui:365 msgid "_Kruskal-Wallis H" msgstr "_Kruskal-Wallis H" #: src/ui/gui/k-independent.ui:382 src/ui/gui/runs.ui:140 msgid "_Median" msgstr "M_ediaan" #: src/ui/gui/k-means.ui:24 msgid "K-Means Cluster Analysis" msgstr "Clusteranalyse met K gemiddelden" #: src/ui/gui/k-means.ui:122 msgid "N_umber of Clusters: " msgstr "_Aantal clusters: " #: src/ui/gui/k-related.ui:24 msgid "Tests for Several Related Samples" msgstr "Toetsen voor meerdere afhankelijke steekproeven" #: src/ui/gui/k-related.ui:113 msgid "_Test Variables:" msgstr "_Toetsvariabelen:" #: src/ui/gui/k-related.ui:145 msgid "_Friedman" msgstr "_Friedman" #: src/ui/gui/k-related.ui:161 msgid "_Kendall's W" msgstr "_Kendalls W" #: src/ui/gui/k-related.ui:177 msgid "_Cochran's Q" msgstr "_Cochrans Q" #: src/ui/gui/ks-one-sample.ui:163 msgid "_Normal" msgstr "_Normaal" #: src/ui/gui/ks-one-sample.ui:181 msgid "_Poisson" msgstr "_Poisson" #: src/ui/gui/ks-one-sample.ui:198 msgid "_Uniform" msgstr "_Uniform" #: src/ui/gui/ks-one-sample.ui:213 msgid "_Exponential" msgstr "_Exponentieel" #: src/ui/gui/ks-one-sample.ui:232 msgid "Test Distribution" msgstr "Toetsverdeling" #: src/ui/gui/logistic.ui:42 msgid "Logistic Regression: Options" msgstr "Logistische regressie: opties" #: src/ui/gui/logistic.ui:66 msgid "CI for _exp(B): " msgstr "_B.i. voor exp(B): " #: src/ui/gui/logistic.ui:97 msgid "%" msgstr "%" #: src/ui/gui/logistic.ui:146 msgid "Classification cu_toff: " msgstr "_Classificatie afsnijding: " #: src/ui/gui/logistic.ui:159 msgid "_Maximum Iterations: " msgstr "_Maximaal aantal iteraties: " #: src/ui/gui/logistic.ui:177 msgid "Include _constant in model" msgstr "_Neem constante op in model" #: src/ui/gui/logistic.ui:219 msgid "Logistic Regression" msgstr "Logistische regressie" #: src/ui/gui/logistic.ui:364 src/ui/gui/regression.ui:185 msgid "_Dependent" msgstr "_Afhankelijk" #: src/ui/gui/logistic.ui:412 src/ui/gui/regression.ui:232 msgid "_Independent" msgstr "_Onafhankelijk" #: src/ui/gui/means.ui:25 msgid "Means" msgstr "Gemiddelden" #: src/ui/gui/means.ui:179 msgid "_Independent List:" msgstr "_Onafhankelijke variabelen:" #: src/ui/gui/missing-val-dialog.ui:48 msgid "_No missing values" msgstr "Gee_n ontbrekende waarden" #: src/ui/gui/missing-val-dialog.ui:136 msgid "_Discrete missing values" msgstr "_Discrete ontbrekende waarden" #: src/ui/gui/missing-val-dialog.ui:172 msgid "_Low:" msgstr "_Laag:" #: src/ui/gui/missing-val-dialog.ui:197 msgid "_High:" msgstr "_Hoog:" #: src/ui/gui/missing-val-dialog.ui:221 msgid "Di_screte value:" msgstr "Di_screte waarde:" #: src/ui/gui/missing-val-dialog.ui:245 msgid "_Range plus one optional discrete missing value" msgstr "Be_reik plus één optionele discrete ontbrekende waarde" #: src/ui/gui/oneway.ui:25 msgid "One-Way ANOVA: Contrasts" msgstr "Éénweg-ANOVA: contrasten" #: src/ui/gui/oneway.ui:107 msgid "_Coefficients:" msgstr "_Coëfficiënten:" #: src/ui/gui/oneway.ui:161 msgid "Coefficient Total: " msgstr "Coëfficiënt-totaal: " #: src/ui/gui/oneway.ui:198 msgid "Contrast 1 of 1" msgstr "Contrast 1 van 1" #: src/ui/gui/oneway.ui:234 msgid "One-Way ANOVA: Post-Hoc" msgstr "Éénweg-ANOVA: Post-hoc" #: src/ui/gui/oneway.ui:270 msgid "Games Howell" msgstr "Games Howell" #: src/ui/gui/oneway.ui:287 msgid "Fisher's LSD" msgstr "Fishers LSD" #: src/ui/gui/oneway.ui:379 msgid "One-Way ANOVA" msgstr "Éénweg-ANOVA" #: src/ui/gui/oneway.ui:408 msgid "_Factor:" msgstr "_Factor:" #: src/ui/gui/oneway.ui:451 msgid "Dependent _Variable(s):" msgstr "_Afhankelijke variabele(n):" #: src/ui/gui/oneway.ui:593 msgid "_Homogeneity" msgstr "_Homogeniteit" #: src/ui/gui/oneway.ui:637 msgid "Post-Hoc..." msgstr "Post-hoc..." #: src/ui/gui/oneway.ui:652 msgid "_Contrasts..." msgstr "_Contrasten..." #: src/ui/gui/options.ui:25 msgid "Options Case" msgstr "Opties voor observaties" #: src/ui/gui/options.ui:55 msgid "Display _Labels" msgstr "Toon _labels" #: src/ui/gui/options.ui:71 msgid "Display _Names" msgstr "Toon _namen" #: src/ui/gui/options.ui:99 msgid "Sort by L_abel" msgstr "Sorteer op la_bel" #: src/ui/gui/options.ui:115 msgid "Sort by Na_me" msgstr "Sorteer op n_aam" #: src/ui/gui/options.ui:131 msgid "Do not S_ort" msgstr "Sorteer n_iet" #: src/ui/gui/options.ui:159 msgid "Variable Lists" msgstr "In variabelenlijsten" #: src/ui/gui/options.ui:184 msgid "Ma_ximize" msgstr "_Maximaliseer" #: src/ui/gui/options.ui:199 msgid "_Raise" msgstr "_Op voorgrond" #: src/ui/gui/options.ui:214 msgid "Aler_t" msgstr "_Waarschuw" #: src/ui/gui/options.ui:233 msgid "Output Window Action" msgstr "Bij uitvoer" #: src/ui/gui/paired-samples.ui:147 msgid "_Test Pair(s):" msgstr "_Toetspa(a)r(en):" #: src/ui/gui/rank.ui:30 msgid "Rank Cases: Types" msgstr "Rangschik observaties: types" #: src/ui/gui/rank.ui:57 msgid "Sum of case _weights" msgstr "Totaal van observatiege_wichten" #: src/ui/gui/rank.ui:74 msgid "Fractional rank as _%" msgstr "Fractionele rang als _%" #: src/ui/gui/rank.ui:92 msgid "_Fractional rank" msgstr "Fractionele rang" #: src/ui/gui/rank.ui:109 msgid "_Savage score" msgstr "\"_Savage\"-waarde" #: src/ui/gui/rank.ui:125 msgid "_Rank" msgstr "_Rang" #: src/ui/gui/rank.ui:147 msgid "N_tiles" msgstr "N_tielen" #: src/ui/gui/rank.ui:195 msgid "_Proportion Estimates" msgstr "_Proportieschattingen" #: src/ui/gui/rank.ui:213 msgid "_Normal Scores" msgstr "_Normaalwaarden" #: src/ui/gui/rank.ui:251 msgid "_Blom" msgstr "_Blom" #: src/ui/gui/rank.ui:269 msgid "Tuke_y" msgstr "Tuke_y" #: src/ui/gui/rank.ui:287 msgid "Ran_kit" msgstr "Ran_kit" #: src/ui/gui/rank.ui:305 msgid "_Van der Waerden" msgstr "_Van der Waerden" #: src/ui/gui/rank.ui:328 msgid "Proportion Estimation Formula" msgstr "Formule voor proportieschatting" #: src/ui/gui/rank.ui:369 msgid "Rank Cases" msgstr "Rangschik observaties" #: src/ui/gui/rank.ui:434 msgid "_By:" msgstr "_Via:" #: src/ui/gui/rank.ui:595 msgid "_Smallest Value" msgstr "_Kleinste waarde" #: src/ui/gui/rank.ui:613 msgid "_Largest Value" msgstr "_Grootste waarde" #: src/ui/gui/rank.ui:637 msgid "Assign rank 1 to:" msgstr "Ken rang 1 toe aan:" #: src/ui/gui/rank.ui:656 msgid "_Display summary tables" msgstr "_Toon samenvattende tabellen" #: src/ui/gui/rank.ui:679 msgid "Rank T_ypes" msgstr "Rangschik t_ypes" #: src/ui/gui/rank.ui:694 msgid "_Ties..." msgstr "_Gelijke waarden..." #: src/ui/gui/rank.ui:756 msgid "Rank Cases: Ties" msgstr "Rangschik observaties: gelijke rangen" #: src/ui/gui/rank.ui:788 msgid "_Mean" msgstr "_Gemiddelde" #: src/ui/gui/rank.ui:806 msgid "_Low" msgstr "_Laag" #: src/ui/gui/rank.ui:825 msgid "_High" msgstr "_Hoog" #: src/ui/gui/rank.ui:851 msgid "_Sequential ranks to unique values" msgstr "_Opeenvolgende rangen naar unieke waarden" #: src/ui/gui/rank.ui:875 msgid "Rank Assigned to Ties" msgstr "Rang toegewezem aan gelijke waarden" #: src/ui/gui/runs.ui:155 msgid "M_ean" msgstr "_Gemiddelde" #: src/ui/gui/runs.ui:171 msgid "Mo_de" msgstr "M_odus" #: src/ui/gui/runs.ui:191 msgid "_Custom:" msgstr "_Aangepast:" #: src/ui/gui/runs.ui:230 msgid "Cut Point" msgstr "Afsnijpunt" #: src/ui/gui/sort.ui:25 msgid "Sort Cases" msgstr "Sorteer observaties" #: src/ui/gui/sort.ui:101 msgid "Sort by:" msgstr "Sorteer op:" #: src/ui/gui/sort.ui:174 msgid "Descending" msgstr "Aflopend" #: src/ui/gui/sort.ui:196 msgid "Sort Order" msgstr "Sorteervolgorde" #: src/ui/gui/split-file.ui:25 msgid "Split File" msgstr "Splits bestand" #: src/ui/gui/split-file.ui:103 msgid "Anal_yze all cases. Do not create groups." msgstr "_Analyseer alle observaties. Maak geen groepen aan." #: src/ui/gui/split-file.ui:121 msgid "Compare _groups." msgstr "_Vergelijk groepen." #: src/ui/gui/split-file.ui:140 msgid "Organize ou_tput by groups." msgstr "_Organiseer uitvoer naar groepen." #: src/ui/gui/split-file.ui:225 msgid "Groups _based on:" msgstr "_Groepen gebaseerd op:" #: src/ui/gui/split-file.ui:255 msgid "_Sort the file by grouping variables." msgstr "_Sorteer bestand op groeperingsvariabelen." #: src/ui/gui/split-file.ui:273 msgid "_File is already sorted." msgstr "_Bestand is reeds gesorteerd." #: src/ui/gui/split-file.ui:334 msgid "Current Status : " msgstr "Huidige Status : " #: src/ui/gui/split-file.ui:348 msgid "Analysis by groups is off" msgstr "Analyse per groep staat uit" #: src/ui/gui/recode.ui:135 msgid "System _Missing" msgstr "\"System-_missing\"" #: src/ui/gui/recode.ui:150 msgid "Co_py old values" msgstr "Ko_pieer oude waarden" #: src/ui/gui/recode.ui:172 msgid "Va_lue: " msgstr "Waarde: " #: src/ui/gui/recode.ui:276 msgid "Conver_t numeric strings to numbers (`5' -> 5)" msgstr "Ze_t numerieke tekenreeksen om naar getallen (`5' -> 5)" #: src/ui/gui/recode.ui:297 msgid "Output variables are _strings" msgstr "Uitvoervariabelen zijn alfanumeriek" #: src/ui/gui/recode.ui:318 msgid "Width: " msgstr "Breedte: " #: src/ui/gui/recode.ui:499 msgid "_Name:" msgstr "_Naam:" #: src/ui/gui/recode.ui:527 msgid "La_bel:" msgstr "La_bel:" #: src/ui/gui/recode.ui:556 msgid "Chan_ge" msgstr "Wijzi_g" #: src/ui/gui/recode.ui:584 msgid "Output Variable" msgstr "Uitvoervariabele" #: src/ui/gui/recode.ui:658 msgid "Old and New Va_lues..." msgstr "Oude en nieuwe waarden..." #: src/ui/gui/regression.ui:51 msgid "S_tatistics..." msgstr "_Statistische maten..." #: src/ui/gui/regression.ui:272 msgid "Regression: Save" msgstr "Regressie: opslaan" #: src/ui/gui/regression.ui:290 src/ui/gui/univariate.ui:42 msgid "_Predicted values" msgstr "_Voorspelde waarden" #: src/ui/gui/regression.ui:307 src/ui/gui/univariate.ui:59 msgid "_Residuals" msgstr "_Residuen" #: src/ui/gui/regression.ui:351 msgid "Regression: Statistics" msgstr "Regressie: statististische maten" #: src/ui/gui/regression.ui:393 src/ui/gui/univariate.ui:143 msgid "S_tatistics" msgstr "S_tatistische maten" #: src/ui/gui/reliability.ui:34 msgid "Alpha" msgstr "Alfa" #: src/ui/gui/reliability.ui:43 msgid "Reliability Analysis" msgstr "Betrouwbaarheidsanalyse" #: src/ui/gui/reliability.ui:144 msgid "_Items:" msgstr "_Items:" #: src/ui/gui/reliability.ui:166 msgid "_Model: " msgstr "_Model: " #: src/ui/gui/reliability.ui:212 msgid "_Variables in first split:" msgstr "_Variabelen in eerste splitsing:" #: src/ui/gui/reliability.ui:259 msgid "Show _descriptives for scale if item is deleted" msgstr "_Toon beschrijvende maten voor schaal als item wordt verwijderd" #: src/ui/gui/roc.ui:145 msgid "_Test Variable:" msgstr "_Toetsvariabele:" #: src/ui/gui/roc.ui:175 msgid "_State Variable:" msgstr "_Statusvariabele:" #: src/ui/gui/roc.ui:202 msgid "_Value of state variable:" msgstr "_Waarde van status­variabele:" #: src/ui/gui/roc.ui:249 msgid "ROC C_urve" msgstr "_ROC-curve" #: src/ui/gui/roc.ui:269 msgid "_With diagonal reference line" msgstr "_Met diagonale referentielijn" #: src/ui/gui/roc.ui:293 msgid "Standard _Error and Confidence Interval" msgstr "Standaard_fout en betrouwbaarheidsinterval" #: src/ui/gui/roc.ui:309 msgid "_Coordinate points of the ROC Curve" msgstr "_Coördinaatpunten van de ROC-curve" #: src/ui/gui/scatterplot.ui:25 msgid "Scatterplot" msgstr "Spreidingsdiagram" #: src/ui/gui/scatterplot.ui:56 msgid "_X Axis:" msgstr "_X-as:" #: src/ui/gui/scatterplot.ui:100 msgid "_Y Axis:" msgstr "_Y-as:" #: src/ui/gui/select-cases.ui:37 msgid "Select Cases: Range" msgstr "Selecteer observaties: bereik" #: src/ui/gui/select-cases.ui:87 msgid "First case" msgstr "Eerste observatie" #: src/ui/gui/select-cases.ui:99 msgid "Last case" msgstr "Laatste observatie" #: src/ui/gui/select-cases.ui:111 msgid "Observation" msgstr "Waarneming" #: src/ui/gui/select-cases.ui:161 msgid "Select Cases" msgstr "Selecteer observaties" #: src/ui/gui/select-cases.ui:313 msgid "Use filter variable" msgstr "Gebruik filtervariabele" #: src/ui/gui/select-cases.ui:380 msgid "Based on time or case range" msgstr "Gebaseerd op tijd of observatiebereik" #: src/ui/gui/select-cases.ui:395 msgid "Range..." msgstr "Bereik..." #: src/ui/gui/select-cases.ui:444 msgid "Random sample of cases" msgstr "Willekeurige steekproef van observaties" #: src/ui/gui/select-cases.ui:460 msgid "Sample..." msgstr "Steekproef..." #: src/ui/gui/select-cases.ui:508 msgid "If condition is satisfied" msgstr "Als aan voorwaarde wordt voldaan" #: src/ui/gui/select-cases.ui:523 msgid "If..." msgstr "Als..." #: src/ui/gui/select-cases.ui:567 msgid "All Cases" msgstr "Alle observaties" #: src/ui/gui/select-cases.ui:581 msgid "Select" msgstr "Kies" #: src/ui/gui/select-cases.ui:608 msgid "Filtered" msgstr "Gefilterd" #: src/ui/gui/select-cases.ui:625 msgid "Deleted" msgstr "Verwijderd" #: src/ui/gui/select-cases.ui:647 msgid "Unselected Cases Are" msgstr "Niet-gekozen observaties zijn" #: src/ui/gui/select-cases.ui:694 msgid "Select Cases: Random Sample" msgstr "Kies observaties: willekeurige steekproef" #: src/ui/gui/select-cases.ui:756 msgid "Sample Size" msgstr "Steekproefgrootte" #: src/ui/gui/t-test.ui:25 msgid "Options" msgstr "Opties" #: src/ui/gui/t-test.ui:63 msgid "Exclude cases _analysis by analysis" msgstr "Sluit observaties _analysegewijs uit" #: src/ui/gui/t-test.ui:148 msgid "One - Sample T Test" msgstr "T-toets voor één steekproef" #: src/ui/gui/t-test.ui:265 msgid "Test _Value: " msgstr "Toets_waarde: " #: src/ui/gui/text-data-import.ui:32 msgid "Select the first line of the data file that contains data." msgstr "Kies de eerste regel van het gegevensbestand die gegevens bevat." #: src/ui/gui/text-data-import.ui:54 msgid "Line above selected line contains variable names" msgstr "Regel boven gekozen regel bevat variabelennamen" #: src/ui/gui/text-data-import.ui:80 msgid "" "Check the data formats displayed below and fix any that are incorrect. You " "may set other variable properties now or later." msgstr "" "Controleer de gegevensindelingen hieronder en verbeter alle die niet juist " "zijn. U kunt andere variabele-opties nu of later zetten." #: src/ui/gui/text-data-import.ui:121 msgid "Variables" msgstr "Variabelen" #: src/ui/gui/text-data-import.ui:152 msgid "Data Preview" msgstr "Voorbeeldweergave van gegevens" #: src/ui/gui/text-data-import.ui:181 msgid "" "This assistant will guide you through the process of importing data into " "PSPP from a text file with one line per case, in which fields are separated " "by tabs, commas, or other delimiters.\n" "\n" "\tThe selected file contains N lines of text. Only the first M of these " "will be shown for preview purposes in the following screens. You may choose " "below how much of the file should actually be imported." msgstr "" "Deze assistent zal u gidsen bij het importeren van gegevens in PSPP vanuit " "een tekstbestand met één regel per observatie en velden gescheiden door " "tabs, komma's of andere scheidingstekens.\n" "\n" "\tHet gekozen bestand bevat N regels tekst. Alleen de eerste M hiervan " "zullen als voorbeeldweergave in de volgende schermen worden getoond. U kunt " "hieronder kiezen hoeveel van het bestand daadwerkelijk geïmporteerd moet " "worden." #: src/ui/gui/text-data-import.ui:252 msgid "All cases" msgstr "Alle observaties" #: src/ui/gui/text-data-import.ui:272 msgid "Amount to Import" msgstr "Te importeren hoeveelheid" #: src/ui/gui/text-data-import.ui:325 msgid "C_ustom" msgstr "_Aangepast" #: src/ui/gui/text-data-import.ui:341 msgid "Slas_h (/)" msgstr "Sc_huine streep (/)" #: src/ui/gui/text-data-import.ui:357 msgid "Semicolo_n (;)" msgstr "Pu_ntkomma (;)" #: src/ui/gui/text-data-import.ui:373 msgid "P_ipe (|)" msgstr "P_ijp (|)" #: src/ui/gui/text-data-import.ui:389 msgid "H_yphen (-)" msgstr "Kop_pelteken (-)" #: src/ui/gui/text-data-import.ui:405 msgid "Co_mma (,)" msgstr "Ko_mma (,)" #: src/ui/gui/text-data-import.ui:421 msgid "_Colon (:)" msgstr "_Dubbele punt (:)" #: src/ui/gui/text-data-import.ui:437 msgid "Ban_g (!)" msgstr "_Uitroepteken (!)" #: src/ui/gui/text-data-import.ui:453 msgid "Ta_b" msgstr "Ta_b" #: src/ui/gui/text-data-import.ui:469 msgid "_Space" msgstr "_Spatie" #: src/ui/gui/text-data-import.ui:490 msgid "Separators" msgstr "Scheiders" #: src/ui/gui/text-data-import.ui:541 msgid "Quote separator characters with" msgstr "Citeer scheidingstekens met" #: src/ui/gui/text-data-import.ui:561 msgid "Quoting" msgstr "Citeren" #: src/ui/gui/text-data-import.ui:599 msgid "Fields Preview" msgstr "Voorbeeldweergave van velden" #: src/ui/gui/text-data-import.ui:622 msgid "" "Enter below the sheet number and the cell range which you wish to import." msgstr "Voer hieronder het bladnummer en celbereik in dat u wilt importeren." #: src/ui/gui/text-data-import.ui:670 msgid "_Cells: " msgstr "_Cellen: " #: src/ui/gui/text-data-import.ui:684 msgid "_Sheet Index: " msgstr "Bladnummer: " #: src/ui/gui/text-data-import.ui:695 msgid "Use first row as _variable names" msgstr "Gebruik eerste rij als ­_variabelenamen" #: src/ui/gui/text-data-import.ui:717 msgid "Cells to Import" msgstr "Te importeren cellen" #: src/ui/gui/transpose.ui:24 msgid "Transpose" msgstr "Transponeren" #: src/ui/gui/transpose.ui:91 msgid "Name Variable:" msgstr "Naam variabele:" #: src/ui/gui/transpose.ui:127 msgid "Variable(s):" msgstr "Variabele(n):" #: src/ui/gui/univariate.ui:25 msgid "Univariate: Save" msgstr "Univariaat: opslaan" #: src/ui/gui/univariate.ui:103 msgid "Univariate: Statistics" msgstr "Univariaat: statistische maten" #: src/ui/gui/univariate.ui:178 msgid "Univariate" msgstr "Univariaat" #: src/ui/gui/univariate.ui:281 msgid "_Dependent Variable" msgstr "_Afhankelijke variabele" #: src/ui/gui/univariate.ui:329 msgid "_Fixed Factors" msgstr "_Vaste factoren" #: src/ui/gui/val-labs-dialog.ui:101 msgid "Value Label:" msgstr "Waardelabel:" #: src/ui/gui/data-editor.ui:33 msgid "Information Area" msgstr "Informatiegebied" #: src/ui/gui/data-editor.ui:55 msgid "Case Counter Area" msgstr "Gebied voor observatieteller" #: src/ui/gui/data-editor.ui:80 msgid "Filter Use Status Area" msgstr "Gebied voor status filtergebruik" #: src/ui/gui/data-editor.ui:106 msgid "Weight Status Area" msgstr "Gebied voor status weging" #: src/ui/gui/data-editor.ui:132 msgid "Split File Status Area" msgstr "Gebied voor status bestandssplitsing" #: src/ui/gui/data-editor.ui:154 msgid "_View" msgstr "Bee_ld" #: src/ui/gui/data-editor.ui:157 msgid "_Status Bar" msgstr "_Statusbalk" #: src/ui/gui/data-editor.ui:163 msgid "_Font..." msgstr "_Lettertype..." #: src/ui/gui/data-editor.ui:167 msgid "_Grid Lines" msgstr "_Rasterlijnen" #: src/ui/gui/data-editor.ui:171 msgid "Value _Labels" msgstr "_Waardelabels" #: src/ui/gui/data-editor.ui:182 msgid "_Variables" msgstr "_Variabelen" #: src/ui/gui/data-editor.ui:192 msgid "_Sort Cases..." msgstr "_Sorteer observaties..." #: src/ui/gui/data-editor.ui:196 msgid "_Transpose..." msgstr "_Transponeer..." #: src/ui/gui/data-editor.ui:200 msgid "_Aggregate..." msgstr "_Aggregeer..." #: src/ui/gui/data-editor.ui:206 msgid "S_plit File..." msgstr "Splits _bestand..." #: src/ui/gui/data-editor.ui:210 msgid "Select _Cases..." msgstr "_Kies observaties..." #: src/ui/gui/data-editor.ui:214 msgid "_Weight Cases..." msgstr "_Weeg observaties..." #: src/ui/gui/data-editor.ui:220 msgid "_Transform" msgstr "_Omzetten" #: src/ui/gui/data-editor.ui:223 msgid "_Compute..." msgstr "_Bereken..." #: src/ui/gui/data-editor.ui:227 msgid "Cou_nt..." msgstr "_Tel..." #: src/ui/gui/data-editor.ui:231 msgid "Ran_k Cases..." msgstr "_Rangschik observaties..." #: src/ui/gui/data-editor.ui:235 msgid "Auto_matic Recode..." msgstr "_Hercodeer automatisch..." #: src/ui/gui/data-editor.ui:241 msgid "Recode into _Same Variables..." msgstr "Hercodeer binnen de_zelfde variabelen..." #: src/ui/gui/data-editor.ui:245 msgid "Recode into _Different Variables..." msgstr "Hercodeer naar _andere variabelen..." #: src/ui/gui/data-editor.ui:251 msgid "_Run Pending Transforms" msgstr "_Voer uitstaande omzettingen uit" #: src/ui/gui/data-editor.ui:257 msgid "_Analyze" msgstr "_Analyseren" #: src/ui/gui/data-editor.ui:260 msgid "_Descriptive Statistics" msgstr "_Beschrijvende statistische maten" #: src/ui/gui/data-editor.ui:262 msgid "_Frequencies..." msgstr "_Frequenties..." #: src/ui/gui/data-editor.ui:270 msgid "_Explore..." msgstr "_Ontdek..." #: src/ui/gui/data-editor.ui:274 msgid "_Crosstabs..." msgstr "_Kruistabellen..." #: src/ui/gui/data-editor.ui:279 msgid "Compare _Means" msgstr "_Vergelijk gemiddelden" #: src/ui/gui/data-editor.ui:281 msgid "_Means..." msgstr "_Gemiddelden..." #: src/ui/gui/data-editor.ui:285 msgid "_One Sample T Test..." msgstr "T-toets voor _één steekproef..." #: src/ui/gui/data-editor.ui:289 msgid "_Independent Samples T Test..." msgstr "T-toets voor _onafhankelijke steekproeven..." #: src/ui/gui/data-editor.ui:293 msgid "_Paired Samples T Test..." msgstr "T-toets voor ge_paarde steekproeven..." #: src/ui/gui/data-editor.ui:297 msgid "One Way _ANOVA..." msgstr "_Éénweg-ANOVA..." #: src/ui/gui/data-editor.ui:302 msgid "_Univariate Analysis..." msgstr "_Univariate analyse..." #: src/ui/gui/data-editor.ui:306 msgid "Bivariate _Correlation..." msgstr "Bivariate _correlatie..." #: src/ui/gui/data-editor.ui:310 msgid "_K-Means Cluster..." msgstr "Clusteranalyse met _K gemiddelden..." #: src/ui/gui/data-editor.ui:314 msgid "_Factor Analysis..." msgstr "_Factoranalyse..." #: src/ui/gui/data-editor.ui:318 msgid "Re_liability..." msgstr "Be_trouwbaarheid..." #: src/ui/gui/data-editor.ui:322 msgid "_Regression" msgstr "_Regressie" #: src/ui/gui/data-editor.ui:325 msgid "_Linear..." msgstr "_Lineair..." #: src/ui/gui/data-editor.ui:329 msgid "_Binary Logistic..." msgstr "_Binair-logistisch..." #: src/ui/gui/data-editor.ui:335 msgid "_Non-Parametric Statistics" msgstr "_Non-parametrische toetsen" #: src/ui/gui/data-editor.ui:338 msgid "_Chi Square..." msgstr "_Chi-kwadraat..." #: src/ui/gui/data-editor.ui:342 msgid "_Binomial..." msgstr "_Binomiaal..." #: src/ui/gui/data-editor.ui:346 msgid "_Runs..." msgstr "\"_Runs\"..." #: src/ui/gui/data-editor.ui:350 msgid "_1 Sample K-S..." msgstr "_Eén steekproef..." #: src/ui/gui/data-editor.ui:354 msgid "_2 Related Samples..." msgstr "_Twee afhankelijke steekproeven..." #: src/ui/gui/data-editor.ui:358 msgid "_K Related Samples..." msgstr "_Meerdere afhankelijke steekproeven..." #: src/ui/gui/data-editor.ui:362 msgid "K _Independent Samples..." msgstr "K _onafhankelijke steekproeven..." #: src/ui/gui/data-editor.ui:368 msgid "ROC Cur_ve..." msgstr "R_OC-curve..." #: src/ui/gui/data-editor.ui:374 msgid "_Graphs" msgstr "Gra_fieken" #: src/ui/gui/data-editor.ui:377 msgid "_Scatterplot" msgstr "S_preidingsdiagram" #: src/ui/gui/data-editor.ui:381 msgid "_Histogram" msgstr "_Histogram" #: src/ui/gui/data-editor.ui:385 msgid "_Barchart" msgstr "S_taafdiagram" #: src/ui/gui/data-editor.ui:391 msgid "_Utilities" msgstr "E_xtra" #: src/ui/gui/data-editor.ui:394 msgid "_Variables..." msgstr "_Variabelen..." #: src/ui/gui/data-editor.ui:398 msgid "Data File _Comments..." msgstr "_Opmerkingen in gegevensbestand..." #: src/ui/gui/output-window.ui:71 msgid "_Print..." msgstr "Druk af..." #: src/ui/gui/output-window.ui:76 msgid "_Export..." msgstr "_Exporteer..." #: src/ui/gui/output-window.ui:92 msgid "Select _All" msgstr "Kies _alles" #: src/ui/gui/syntax-editor.ui:27 msgid "Syntax" msgstr "Syntax" #: src/ui/gui/syntax-editor.ui:31 msgid "Data" msgstr "Gegevens" #: src/ui/gui/syntax-editor.ui:41 msgid "_Save" msgstr "Op_slaan" #: src/ui/gui/syntax-editor.ui:46 msgid "Save _As" msgstr "Ops_laan als" #: src/ui/gui/syntax-editor.ui:53 msgid "_Print" msgstr "Af­_drukken" #: src/ui/gui/syntax-editor.ui:84 msgid "_Delete" msgstr "_Verwijderen" #: src/ui/gui/syntax-editor.ui:90 msgid "_Undo" msgstr "_Ongedaan maken" #: src/ui/gui/syntax-editor.ui:94 msgid "_Redo" msgstr "_Opnieuw" #: src/ui/gui/syntax-editor.ui:100 msgid "_Find" msgstr "_Zoek" #: src/ui/gui/syntax-editor.ui:106 msgid "_Run" msgstr "Uitvoe_ren" #: src/ui/gui/syntax-editor.ui:109 msgid "_All" msgstr "_Alle" #: src/ui/gui/syntax-editor.ui:113 msgid "_Selection" msgstr "_Selectie" #: src/ui/gui/syntax-editor.ui:117 msgid "_Current Line" msgstr "_Huidige regel" #: src/ui/gui/syntax-editor.ui:122 msgid "_To End" msgstr "_Naar einde" #: src/ui/gui/var-type-dialog.ui:99 msgid "Scientific notation" msgstr "Wetenschappelijke notatie" #: src/ui/gui/var-type-dialog.ui:150 msgid "Custom currency" msgstr "Aangepaste munteenheid" #: src/ui/gui/var-type-dialog.ui:267 msgid "positive" msgstr "positief" #: src/ui/gui/var-type-dialog.ui:279 msgid "negative" msgstr "negatief" #: src/ui/gui/var-type-dialog.ui:293 msgid "Sample" msgstr "Steekproef" #: src/ui/gui/var-type-dialog.ui:350 msgid "Width:" msgstr "Breedte:" #: src/ui/gui/var-type-dialog.ui:396 msgid "Decimal Places:" msgstr "Decimalen:" #: src/ui/gui/weight.ui:24 msgid "Weight Cases" msgstr "Weeg observaties" #: src/ui/gui/weight.ui:100 msgid "Weight cases by" msgstr "Weeg observaties met" #: src/ui/gui/weight.ui:144 msgid "Frequency Variable" msgstr "Frequentievariabele" #: src/ui/gui/weight.ui:198 msgid "Current Status: " msgstr "Huidige status: " #. TRANSLATORS: This is the application name in the desktop file #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:7 #: src/ui/gui/org.fsf.pspp.desktop.in:7 msgid "GNU PSPP" msgstr "GNU PSPP" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:8 #, fuzzy #| msgid "A program for the analysis of sampled data" msgid "GNU PSPP is a program for statistical analysis of sampled data" msgstr "Een programma voor de analyse van steekproefgegevens" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:10 msgid "" "GNU PSPP is a program for the statistical analysis of sampled data. It is a " "Free replacement for the proprietary program SPSS, and appears very similar " "to it with a few exceptions. The most important of these exceptions are, " "that there are no “time bombs”; your copy of PSPP will not “expire” or " "deliberately stop working in the future. Neither are there any artificial " "limits on the number of cases or variables which you can use. There are no " "additional packages to purchase in order to get “advanced” functions; all " "functionality that PSPP currently supports is in the core package." msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:11 msgid "" "PSPP is a stable and reliable application. It can perform descriptive " "statistics, T-tests, anova, linear and logistic regression, measures of " "association, cluster analysis, reliability and factor analysis, non-" "parametric tests and more. Its backend is designed to perform its analyses " "as fast as possible, regardless of the size of the input data. You can use " "PSPP with its graphical interface or the more traditional syntax commands." msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:12 msgid "A brief list of some of the PSPP's features." msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:14 msgid "Support for over 1 billion cases" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:15 msgid "Support for over 1 billion variables" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:16 msgid "Syntax and data files which are compatible with those of SPSS" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:17 msgid "A choice of terminal or graphical user interface" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:18 msgid "A choice of text, postscript, pdf, opendocument or html output formats" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:19 msgid "" "Inter-operability with: LibreOffice, Apache OpenOffice, Gnumeric and other " "free software" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:20 msgid "Easy data import from spreadsheets, text files and database sources" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:21 msgid "" "The capability to open, analyse and edit two or more datasets concurrently" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:22 msgid "A user interface supporting all common character sets" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:23 msgid "A user interface has been translated to multiple languages" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:24 msgid "Very fast statistical procedures, even on very large data sets" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:25 msgid "No license fees and no expiration period" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:26 msgid "No unethical “end user license agreements”" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:27 msgid "A fully indexed user manual" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:28 msgid "Freedom ensured; It is licensed under the GPLv3 or later" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:29 msgid "" "Portability; Runs on many different computers and many different operating " "systems" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:31 msgid "" "PSPP is particularly aimed at statisticians, social scientists and students " "requiring fast convenient analysis of sampled data." msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:41 #, fuzzy #| msgid "Variable View" msgid "GNU PSPP Variable View" msgstr "Variabelenweergave" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:54 msgid "Free Software Foundation" msgstr "" #: src/ui/gui/org.fsf.pspp.desktop.in:8 msgid "Statistical Software" msgstr "Statistische software" #: src/ui/gui/org.fsf.pspp.desktop.in:9 msgid "Analyze statistical data with a free alternative to SPSS" msgstr "Analyseer statistische data met een gratis alternatief voor SPSS" #. TRANSLATORS: Do not translate this string. Keep it as is, verbatim. #: src/ui/gui/org.fsf.pspp.desktop.in:12 msgid "pspp" msgstr "pspp" #. TRANSLATORS: You must keep all ";" - also at the end of line. #: src/ui/gui/org.fsf.pspp.desktop.in:17 msgid "statistics;analysis;spss;" msgstr "statistieken;analyse;spss;" #~ msgid "Sorry. The help system hasn't yet been implemented." #~ msgstr "Sorry. Het hulpsysteem is nog niet geïmplementeerd." #~ msgid "Interactive shell not supported on this platform." #~ msgstr "Interactieve \"shell\" wordt op dit platform niet ondersteund." #~ msgid "Error executing command: %s." #~ msgstr "Fout bij uitvoeren opdracht: %s." #~ msgid "Details" #~ msgstr "Details" #~ msgid "Multiple dichotomy set" #~ msgstr "\"Multiple dichotomy set\"" #~ msgid "Multiple category set" #~ msgstr "\"Multiple category set\"" #~ msgid "Label source" #~ msgstr "Bron van label" #~ msgid "First variable label among variables" #~ msgstr "Eerste variabelelabel onder variabelen" #~ msgid "Provided by user" #~ msgstr "Verstrekt door gebruiker" #~ msgid "Category label source" #~ msgstr "Bron van categorielabel" #~ msgid "Variable labels" #~ msgstr "Variabelelabels" #~ msgid "Value labels of counted value" #~ msgstr "Waardelabels van getelde waarde" #~ msgid "Label:" #~ msgstr "Label:" #~ msgid "No label." #~ msgstr "Geen label." #~ msgid "Product:" #~ msgstr "Produkt:" #~ msgid "Variables:" #~ msgstr "Variabelen:" #~ msgid "Cases:" #~ msgstr "Observaties:" #~ msgid "Type:" #~ msgstr "Type:" #~ msgid "Description" #~ msgstr "Omschrijving" #~ msgid "The active dataset does not have a file label." #~ msgstr "De actieve dataset heeft geen bestandslabel." #~ msgid "File label: %s" #~ msgstr "Bestandlabel: %s" #~ msgid "The active dataset dictionary does not contain any documents." #~ msgstr "Het woordenboek van de actieve dataset bevat geen documenten." #~ msgid "Documents in the active dataset:" #~ msgstr "Documenten in de actieve dataset:" #~ msgid "Custom data file attributes." #~ msgstr "Aangepaste eigenschappen van gegevensbestand." #~ msgid "Label: %s\n" #~ msgstr "Label: %s\n" #~ msgid "Format: %s\n" #~ msgstr "Indeling: %s\n" #~ msgid "Print Format: %s\n" #~ msgstr "Afdrukopmaak: %s\n" #~ msgid "Write Format: %s\n" #~ msgstr "Schrijfopmaak: %s\n" #~ msgid "Measure: %s\n" #~ msgstr "Meting: %s\n" #~ msgid "Role: %s\n" #~ msgstr "Rol: %s\n" #~ msgid "Display Alignment: %s\n" #~ msgstr "Uitlijning bij weergave: %s\n" #~ msgid "Display Width: %d\n" #~ msgstr "Breedte bij weergave: %d\n" #~ msgid "Missing Values: " #~ msgstr "Ontbrekende waarden: " #~ msgid "Unknown TABLECELLS class" #~ msgstr "Onbekende klasse TABLECELLS" #~ msgid "Exact Sig. (%d-tailed)" #~ msgstr "Exacte sign. (%d-zijdig)" #~ msgid "Valid N" #~ msgstr "Geldige N" #~ msgid "Missing N" #~ msgstr "Ontbrekende N" #~ msgid "Valid cases = %.*g; cases with missing value(s) = %.*g." #~ msgstr "" #~ "Geldige observaties = %.*g; observaties met ontbrekende waarde(n) = %.*g." #~ msgid "%g" #~ msgstr "%g" #~ msgid "%d" #~ msgstr "%d" #~ msgid "%zu" #~ msgstr "%zu" #~ msgid "50 (Median)" #~ msgstr "50 (mediaan)" #~ msgid "(%d)" #~ msgstr "(%d)" #~ msgid "Min" #~ msgstr "Min" #~ msgid "Max" #~ msgstr "Max" #~ msgid "%g%%" #~ msgstr "%g%%" #~ msgid "25th" #~ msgstr "25e" #~ msgid "50th (Median)" #~ msgstr "50e (mediaan)" #~ msgid "75th" #~ msgstr "75e" #~ msgid "(I) %s" #~ msgstr "(I) %s" #~ msgid "(J) %s" #~ msgstr "(J) %s" #~ msgid "(I - J)" #~ msgstr "(I - J)" #~ msgid "%s into %s(%s of %s using %s BY %s)" #~ msgstr "%s in %s(%s van %s gebruikt %s BY %s)" #~ msgid "%s into %s(%s of %s BY %s)" #~ msgstr "%s in %s(%s van %s BY %s)" #~ msgid "%s into %s(%s of %s using %s)" #~ msgstr "%s in %s(%s van %s gebruikt %s)" #~ msgid "%s into %s(%s of %s)" #~ msgstr "%s in %s(%s van %s)" #~ msgid "Area Under the Curve (%s)" #~ msgstr "Gebied onder de curve (%s)" #~ msgid "Coordinates of the Curve (%s)" #~ msgstr "Coördinaten van de curve (%s)" #~ msgid "Std. Error Mean" #~ msgstr "St.fout van gemiddelde" #~ msgid "(active dataset)" #~ msgstr "(actieve dataset)" #~ msgid "Writing %zu record to %s." #~ msgid_plural "Writing %zu records to %s." #~ msgstr[0] "Kaart %zu wordt geschreven naar %s." #~ msgstr[1] "%zu kaarten worden geschreven naar %s." #~ msgid "Writing %zu record." #~ msgid_plural "Writing %zu records." #~ msgstr[0] "Kaart %zu wordt geschreven." #~ msgstr[1] "%zu kaarten worden geschreven." #~ msgid "Unsupported compression type (%d)" #~ msgstr "Niet-ondersteund compressietype (%d)" #~ msgid "Failed to seek to end of central directory record: %s" #~ msgstr "Zoeken tot einde van \"central directory record\" is mislukt: %s" #~ msgid "Failed to seek to central directory: %s" #~ msgstr "Zoeken naar \"central directory\" is mislukt: %s" #~ msgid "Failed to seek to start of member `%s': %s" #~ msgstr "Zoeken naar begin van lid `%s' is mislukt: %s" #~ msgid "ascii: closing output file `%s'" #~ msgstr "ascii: uitvoerbestand `%s' wordt gesloten" #~ msgid "%s - Page %d" #~ msgstr "%s - Pagina %d" #~ msgid "bad vline: x=%d+%d=%d y=(%d+%d=%d,%d+%d=%d) in table size (%d,%d)\n" #~ msgstr "" #~ "foutieve verticale lijn: x=%d+%d=%d y=(%d+%d=%d,%d+%d=%d) in tabelgrootte " #~ "(%d,%d)\n" #~ msgid "bad hline: x=(%d+%d=%d,%d+%d=%d) y=%d+%d=%d in table size (%d,%d)\n" #~ msgstr "" #~ "foutieve horizontale lijn: x=(%d+%d=%d,%d+%d=%d) y=%d+%d=%d in " #~ "tabelgrootte (%d,%d)\n" #~ msgid "" #~ "bad box: (%d+%d=%d,%d+%d=%d)-(%d+%d=%d,%d+%d=%d) in table size (%d,%d)\n" #~ msgstr "" #~ "foutief kader: (%d+%d=%d,%d+%d=%d)-(%d+%d=%d,%d+%d=%d) in tabelgrootte " #~ "(%d,%d)\n" #~ msgid "can only convert encrypted data file to sav or sys format" #~ msgstr "" #~ "kan versleuteld gegevensbestand alleen omzetten naar sav- of sys-indeling" #~ msgid "can only convert encrypted syntax file to sps format" #~ msgstr "kan versleuteld syntaxbestand alleen omzetten naar sps-indeling" #~ msgid "count" #~ msgstr "aantal" #~ msgid "expected" #~ msgstr "verwacht" #~ msgid "residual" #~ msgstr "residu" #~ msgid "std. resid." #~ msgstr "gest. resid." #~ msgid "adj. resid." #~ msgstr "aangep. resid." #~ msgid "Chi-square tests." #~ msgstr "Chi-kwadraat-toetsen." #~ msgid "Odds Ratio for %s (%.*s / %.*s)" #~ msgstr "\"Odds ratio\" voor %s (%.*s / %.*s)" #~ msgid "For cohort %s = %.*s" #~ msgstr "Voor cohort %s = %.*s" #~ msgid "Support for %s files was not compiled into this installation of PSPP" #~ msgstr "" #~ "Ondersteuning voor %s-bestanden is niet gecompileerd in deze installatie " #~ "van PSPP" #~ msgid "Cannot parse field content `%.*s' as format %s: %s" #~ msgstr "Kan veldinhoud `%.*s' niet verwerken als opmaak %s: %s" #~ msgid "This input line has too few separators to fill in this field." #~ msgstr "" #~ "Deze invoerregel heeft te weinig scheidingstekens om dit veld te vullen." #~ msgid "An error occurred reading the spreadsheet file." #~ msgstr "Er is een fout opgetreden bij het lezen van het rekenbladbestand." #~ msgid "Enter a number to add a new variable." #~ msgstr "Voer een getal in om een nieuwe variabele toe te voegen." #~ msgid "Enter a number to add a new case." #~ msgstr "Voer een getal in om een nieuwe observatie toe te voegen." #~ msgid "Cannot create variable." #~ msgstr "Kan variabele niet aanmaken." #~ msgid "\"%s\" is not a valid variable name." #~ msgstr "\"%s\" is geen geldige variabelenaam." #~ msgid "This dictionary already contains a variable named \"%s\"." #~ msgstr "Dit woordenboek bevat al een variabele genaamd \"%s\"." #~ msgid "Cannot rename variable." #~ msgstr "Kan variabele niet hernoemen." #~ msgid "Enter a variable name to add a new variable." #~ msgstr "Voer een variablennaam in om een nieuwe variabele toe te voegen." #~ msgid "{%s, %s}\n" #~ msgstr "{%s, %s}\n" #~ msgid "Multiple response set name `%s' does not begin with `$'." #~ msgstr "Naam van \"multiple response set\" `%s' begint niet met `$'." #~ msgid "could not access definition for terminal `%s'" #~ msgstr "kon geen toegang krijgen tot definitie voor terminal `%s'" #~ msgid "" #~ "PSPPIRE, a GUI for PSPP, a program for statistical analysis of sampled " #~ "data.\n" #~ "Usage: %s [OPTION]... FILE\n" #~ "\n" #~ "Arguments to long options also apply to equivalent short options.\n" #~ "\n" #~ "GUI options:\n" #~ " -q, --no-splash don't show splash screen during startup\n" #~ "\n" #~ "%sLanguage options:\n" #~ " -I, --include=DIR append DIR to search path\n" #~ " -I-, --no-include clear search path\n" #~ " -a, --algorithm={compatible|enhanced}\n" #~ " set to `compatible' if you want output\n" #~ " calculated from broken algorithms\n" #~ " -x, --syntax={compatible|enhanced}\n" #~ " set to `compatible' to disable PSPP " #~ "extensions\n" #~ " -i, --interactive interpret syntax in interactive mode\n" #~ " -s, --safer don't allow some unsafe operations\n" #~ "Default search path: %s\n" #~ "\n" #~ "Informative output:\n" #~ " -h, --help display this help and exit\n" #~ " -V, --version output version information and exit\n" #~ "\n" #~ "A non-option argument is interpreted as a data file in .sav or .zsav or ." #~ "por\n" #~ "format or a syntax file to load.\n" #~ msgstr "" #~ "PSPPIRE, een grafische gebruiksinterface voor PSPP, een programma voor " #~ "statistische analyse van steekproefgegevens.\n" #~ "Gebruik: %s [OPTIE]... BESTAND\n" #~ "\n" #~ "Argumenten voor niet-afgekorte opties gelden ook voor equivalente " #~ "afgekorte opties.\n" #~ "\n" #~ "Opties voor de grafische interface:\n" #~ " -q, --no-splash toon het opstartscherm niet\n" #~ "\n" #~ "%sOpties voor taal:\n" #~ " -I, --include=MAP voeg MAP toe aan zoekpad\n" #~ " -I-, --no-include wis zoekpad\n" #~ " -a, --algorithm={compatible|enhanced}\n" #~ " geef op `compatible' als u uitvoer wilt\n" #~ " berekend uit \"gebroken\" algoritmes\n" #~ " -x, --syntax={compatible|enhanced}\n" #~ " geef op `compatible' om PSPP-uitbreidingen " #~ "uit te schakelen\n" #~ " -i, --interactive interpreteer syntax in interactieve modus\n" #~ " -s, --safer sta sommige onveilige operaties niet toe\n" #~ "Standaard-zoekpad: %s\n" #~ "\n" #~ "Informatieve uitvoer:\n" #~ " -h, --help toon deze hulp en sluit af\n" #~ " -V, --version toon versie-informatie en sluit af\n" #~ "\n" #~ "Een argument dat geen optie is, wordt geïnterpreteerd als gegevensbestand " #~ "in .sav-, .zsav- of .por-\n" #~ "indeling, of als een te laden syntaxbestand.\n" #~ msgid "_Reset" #~ msgstr "_Herstel" #~ msgid "_Select" #~ msgstr "_Kies" #~ msgid "Delete the variables at the selected position(s)" #~ msgstr "Verwijder de variabelen op de gekozen positie(s)" #~ msgid "Delete the cases at the selected position(s)" #~ msgstr "Verwijder de observaties op de gekozen positie(s)" #~ msgid "_Open..." #~ msgstr "_Open..." #~ msgid "Transpose the cases with the variables" #~ msgstr "Draai observaties en variabelen om" #~ msgid "Aggregate the case values into a new variable" #~ msgstr "Aggregeer de observatiewaarden in een nieuwe variabele" #~ msgid "Choose a subset of cases for analysis" #~ msgstr "Kies een subset van observaties om te analyseren" #~ msgid "All" #~ msgstr "Alles" pspp-1.4.1/po/el.po0000644000175000017500000135335413725012645013514 0ustar00blpblp00000000000000# Greek translation for PSPP # Copyright (C) 2016 Free Software Foundation, Inc. # This file is distributed under the same license as the pspp package. # Elias Tsolis , 2016 -, 2018. # msgid "" msgstr "" "Project-Id-Version: pspp 1.4.0\n" "Report-Msgid-Bugs-To: pspp-dev@gnu.org\n" "PO-Revision-Date: 2020-08-16 20:02+0300\n" "Last-Translator: Elias Tsolis \n" "Language-Team: Greek \n" "Language: el\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Bugs: Report translation errors to the Language-Team address.\n" "X-Generator: Poedit 2.0.6\n" "Plural-Forms: nplurals=2; plural=n == 1 ? 0 : 1;\n" #: src/data/any-reader.c:72 src/data/encrypted-file.c:78 #, c-format msgid "An error occurred while opening `%s': %s." msgstr "Ένα σφάλμα προέκυψε κατά το άνοιγμα `%s': %s." #: src/data/any-reader.c:93 src/language/lexer/lexer.c:1633 #, c-format msgid "Error reading `%s': %s." msgstr "Σφάλμα ανάγνωσης `%s': %s." #: src/data/any-reader.c:114 #, c-format msgid "`%s' is not a system or portable file." msgstr "`%s' δεν είναι αρχείο φορητό ή συστήματος." #: src/data/any-reader.c:123 src/data/any-writer.c:66 msgid "The inline file is not allowed here." msgstr "Το εσωκλειώμενο αρχείο δεν επιτρέπεται εδώ." #: src/data/any-reader.c:205 #, c-format msgid "" "Cannot read from dataset %s because no dictionary or data has been written " "to it yet." msgstr "" "Δεν μπορεί να γίνει ανάγνωση από τη βάση δεδομένων %s επειδή δεν υπάρχει " "λίστα αυτών ή δεδομένα σε αυτό ακόμη." #: src/data/any-reader.c:260 src/language/data-io/dataset.c:253 msgid "Dataset" msgstr "Βάση δεδομένων" #: src/data/calendar.c:100 #, c-format msgid "Month %d is not in acceptable range of 0 to 13." msgstr "Ο μήνας %d δεν είναι στο αποδεκτό εύρος 0 ως 13." #: src/data/calendar.c:110 #, c-format msgid "Day %d is not in acceptable range of 0 to 31." msgstr "Η μέρα %d δεν είναι στο αποδεκτό εύρος από 0 ως 31." #: src/data/calendar.c:119 #, c-format msgid "Date %04d-%d-%d is before the earliest acceptable date of 1582-10-15." msgstr "" "Η ημερομηνία %04d-%d-%d είναι εκτός του κατώτατου ορίου αποδεκτής " "ημερομηνίας, θεσμοθετημένης ως 1582-10-15." #: src/data/casereader-filter.c:221 msgid "" "At least one case in the data read had a weight value that was user-missing, " "system-missing, zero, or negative. These case(s) were ignored." msgstr "" "Τουλάχιστον μία υπόθεση στα αναγνωσμένα δεδομένα είχε τιμή Στάθμισης που " "ήταν 'ελλειπούσα-Χρήστη', 'ελλειπούσα-συστήματος', μηδενική, ή αρνητική. " "Αυτές οι υποθέσεις αγνοήθηκαν." #. TRANSLATORS: this fragment will be interpolated into messages in fh_lock() #. that identify types of files. #: src/data/csv-file-writer.c:138 msgid "CSV file" msgstr "CSV αρχείο" #: src/data/csv-file-writer.c:146 #, fuzzy, c-format #| msgid "Error opening `%s' for writing as a system file: %s." msgid "Error opening `%s' for writing as a CSV file: %s." msgstr "Σφάλμα ανοίγματος `%s' προς εγγραφή σαν αρχείο συστήματος: %s." #: src/data/csv-file-writer.c:453 #, c-format msgid "An I/O error occurred writing CSV file `%s'." msgstr "Ένα I/O σφάλμα συναίβει στην εγγραφή του CSV αρχείου `%s'." #: src/data/data-in.c:175 #, c-format msgid "Data is not valid as format %s: %s" msgstr "Τα δεδομένα δεν είναι έγκυρα με μορφότυπο %s: %s" #: src/data/data-in.c:377 src/data/data-in.c:553 msgid "Field contents are not numeric." msgstr "Τα περιεχόμενα του πεδίου δεν είναι αριθμητικά." #: src/data/data-in.c:379 src/data/data-in.c:555 msgid "Number followed by garbage." msgstr "Αριθμός με μη έγκυρη ακολουθία." #: src/data/data-in.c:392 msgid "Invalid numeric syntax." msgstr "Άκυρη αριθμητική σύνταξη." #: src/data/data-in.c:400 src/data/data-in.c:571 msgid "Too-large number set to system-missing." msgstr "Πολύ μεγάλος αριθμός ορίστηκε σαν ελλειπούσες-συστήματος." #: src/data/data-in.c:406 src/data/data-in.c:577 msgid "Too-small number set to zero." msgstr "Πολύ μικρός αριθμός ορίστηκε σαν μηδέν." #: src/data/data-in.c:426 msgid "All characters in field must be digits." msgstr "Όλοι οι χαρακτήρες στο πεδίο πρέπει να είναι αριθμητικά ψηφία." #: src/data/data-in.c:445 msgid "Unrecognized character in field." msgstr "Μη κατανόητος χαρακτήρας στο πεδίο." #: src/data/data-in.c:466 src/data/data-in.c:729 msgid "Field must have even length." msgstr "Το πεδίο πρέπει να έχει ζυγό μήκος." #: src/data/data-in.c:468 src/data/data-in.c:732 msgid "Field must contain only hex digits." msgstr "Το πεδίο πρέπει να έχει μόνο Δεκαεξαδικά ψηφία." #: src/data/data-in.c:544 msgid "Invalid zoned decimal syntax." msgstr "Μη έγκυρη ζώνη δεκαδικής σύνταξης." #: src/data/data-in.c:644 src/data/data-in.c:650 msgid "Invalid syntax for P field." msgstr "Μη έγκυρη σύνταξη για το P πεδίο." #: src/data/data-in.c:768 src/data/data-in.c:818 msgid "Syntax error in date field." msgstr "Σφάλμα σύνταξης στο πεδίο ημερομηνίας." #: src/data/data-in.c:783 #, c-format msgid "Day (%ld) must be between 1 and 31." msgstr "Η μέρα (%ld) πρέπει να είναι μεταξύ 1 και 31." #: src/data/data-in.c:832 msgid "Delimiter expected between fields in date." msgstr "Οριοθέτης αναμενόταν ανάμεσα στα πεδία της ημερομηνίας." #: src/data/data-in.c:906 msgid "" "Unrecognized month format. Months may be specified as Arabic or Roman " "numerals or as at least 3 letters of their English names." msgstr "" "Μη αναγνωρίσιμη μορφή ημερομηνίας. Οι μήνες μπορεί να δηλωθούν ως Αραβικοί ή " "Ρωμαϊκοί αριθμοί ή τουλάχιστον 3 γράμματα από την Αγγλική τους ονομασία." #: src/data/data-in.c:933 #, c-format msgid "Year (%ld) must be between 1582 and 19999." msgstr "Το έτος (%ld) πρέπει να είναι μεταξύ 1582 και 19999." #: src/data/data-in.c:944 #, c-format msgid "Trailing garbage `%.*s' following date." msgstr "Μη αναγκαίος χαρακτήρας `%.*s' μετά την ημερομηνία." #: src/data/data-in.c:958 msgid "Julian day must have exactly three digits." msgstr "Η Ιουλιανή μέρα πρέπει να έχει ακριβώς τρία ψηφία." #: src/data/data-in.c:960 #, c-format msgid "Julian day (%ld) must be between 1 and 366." msgstr "Η Ιουλιανή μέρα (%ld) πρέπει να είναι μεταξύ 1 και 366." #: src/data/data-in.c:984 #, c-format msgid "Quarter (%ld) must be between 1 and 4." msgstr "Το Ένα Τέταρτο (%ld) πρέπει να είναι μεταξύ 1 και 4." #: src/data/data-in.c:1005 #, c-format msgid "Week (%ld) must be between 1 and 53." msgstr "Η εβδομάδα (%ld) πρέπει να είναι μεταξύ 1 και 53." #: src/data/data-in.c:1017 msgid "Delimiter expected between fields in time." msgstr "Διαχωριστής αναμένεται μεταξύ των πεδίων χρόνου." #: src/data/data-in.c:1037 #, c-format msgid "Minute (%ld) must be between 0 and 59." msgstr "Το λεπτό (%ld) πρέπει να είναι μεταξύ 0 και 59." #: src/data/data-in.c:1075 msgid "" "Unrecognized weekday name. At least the first two letters of an English " "weekday name must be specified." msgstr "" "Μη κατανοητό όνομα εβομαδιαίας μέρας. Τουλάχιστον, τα πρώτα δύο ψηφία μιας " "εβομαδιαίας μέρας στα Αγγλικά πρέπει να οριστεί." #: src/data/data-in.c:1210 #, c-format msgid "`%c' expected in date field." msgstr "`%c' αναμένεται στο πεδίο ημερομηνίας." #: src/data/data-out.c:580 #, c-format msgid "Weekday number %f is not between 1 and 7." msgstr "Ο αριθμός της εβδομαδιαίας μέρας %f δεν είναι μεταξύ 1 και 7." #: src/data/data-out.c:605 #, c-format msgid "Month number %f is not between 1 and 12." msgstr "Ο αριθμο του μήνα %f δεν είναι μεταξύ 1 και 12." #. TRANSLATORS: this fragment will be interpolated into #. messages in fh_lock() that identify types of files. #: src/data/dataset-writer.c:66 src/language/data-io/file-handle.c:304 msgid "dataset" msgstr "βάση δεδομένων" #: src/data/dict-class.c:52 msgid "ordinary" msgstr "κλασσική" #: src/data/dict-class.c:54 msgid "system" msgstr "σύστημα" #: src/data/dict-class.c:56 msgid "scratch" msgstr "πρόχειρο" #: src/data/dictionary.c:1523 #, c-format msgid "Truncating document line to %d bytes." msgstr "Περικοπή γραμμής κειμένου κατά %d bytes." #: src/data/encrypted-file.c:89 #, c-format msgid "An error occurred while reading `%s': %s." msgstr "Σφάλμα συνέβη στην ανάγνωση `%s': %s." #: src/data/encrypted-file.c:430 #, c-format msgid "" "%s: encrypted file corrupted (ends in incomplete %u-byte ciphertext block)" msgstr "" "%s: κρυπτογραφημένο αρχείο κατεστραμμένο (τελειώνει σε ατελή %u-byte " "κρυπτογραφημένο κείμενο μπλοκ)" #: src/data/encrypted-file.c:449 #, c-format msgid "%s: encrypted file corrupted (ends with bad padding)" msgstr "" "%s:κρυπτογραφημένο αρχείο έχει καταστραφεί (τελειώνει με μη έγκυρο κενό)" #: src/data/file-handle-def.c:283 src/language/data-io/dataset.c:266 msgid "active dataset" msgstr "ενεργή βάση δεδομένων" #: src/data/file-handle-def.c:518 #, c-format msgid "Can't read from %s as a %s because it is already being read as a %s." msgstr "" "Δεν μπορεί να γίνει ανάγνωση από %s σαν %s επειδή ήδη έχει αναγνωστεί ως %s." #: src/data/file-handle-def.c:522 #, c-format msgid "Can't write to %s as a %s because it is already being written as a %s." msgstr "" "Δεν μπορεί να γίνει εγγραφή στο %s σαν %s επειδή ήδη έχει εγγραφτεί σαν %s." #: src/data/file-handle-def.c:529 #, c-format msgid "Can't re-open %s as a %s." msgstr "Δεν μπορεί να ξανά-ανοικτεί %s σαν %s." #: src/data/file-name.c:133 #, c-format msgid "Not opening pipe file `%s' because %s option set." msgstr "" "Δεν μπορεί να ανοιχθεί το αρχείο pipe `%s' επειδή η επιλογή αυτή %s είναι " "ενεργή." #: src/data/format.c:339 msgid "Input format" msgstr "Εισαγωγή μορφότυπου" #: src/data/format.c:339 msgid "Output format" msgstr "Εξαγωγή μορφότυπου" #: src/data/format.c:342 #, c-format msgid "Format %s may not be used for input." msgstr "Το μορφότυπο %s δεν μπορεί να χρησιμοποιηθεί σαν εισαγωγή." #: src/data/format.c:349 #, c-format msgid "%s specifies width %d, but %s requires an even width." msgstr "%s ορίζει εύρος %d, αλλά %s απαιτεί ένα ζυγό εύρος." #: src/data/format.c:358 #, c-format msgid "%s %s specifies width %d, but %s requires a width between %d and %d." msgstr "%s %s ορίζει εύρος %d, αλλά %s απαιτεί ένα εύρος μεταξύ %d και %d." #: src/data/format.c:367 #, c-format msgid "%s %s specifies %d decimal place, but %s does not allow any decimals." msgid_plural "" "%s %s specifies %d decimal places, but %s does not allow any decimals." msgstr[0] "" "%s %s ορίζει %d δεκαδική θέση, αλλά %s δεν επιτρέπει κανένα δεκαδικό ψηφίο." msgstr[1] "" "%s %s ορίζει %d δεκαδικές θέσεις, αλλά %s δεν επιτρέπει κανένα δεκαδικό " "ψηφίο." #: src/data/format.c:378 #, c-format msgid "" "%s %s specifies %d decimal place, but the given width allows at most %d " "decimals." msgid_plural "" "%s %s specifies %d decimal places, but the given width allows at most %d " "decimals." msgstr[0] "" "%s %s ορίζει %d δεκαδική θέση, αλλά το δοσμένο εύρος επιτρέπει μέγιστα %d " "δεκαδικά ψηφία." msgstr[1] "" "%s %s ορίζει %d δεκαδικές θέσεις, αλλά το δοσμένο εύρος επιτρέπει μέγιστα %d " "δεκαδικά ψηφία." #: src/data/format.c:385 #, c-format msgid "" "%s %s specifies %d decimal place, but the given width does not allow for any " "decimals." msgid_plural "" "%s %s specifies %d decimal places, but the given width does not allow for " "any decimals." msgstr[0] "" "%s %s ορίζει %d δεκαδική θέση, αλλά το δοσμένο εύρος δεν επιτρέπει κανένα " "δεκαδικό ψηφίο." msgstr[1] "" "%s %s ορίζει %d δεκαδικές θέσεις, αλλά το δοσμένο εύρος δεν επιτρέπει κανένα " "δεκαδικό ψηφίο." #: src/data/format.c:424 #, c-format msgid "%s variables are not compatible with %s format %s." msgstr "%s μεταβλητές δεν είναι συμβατές με %s το μορφότυπο %s." #: src/data/format.c:425 src/data/format.c:1074 #: src/ui/gui/var-type-dialog.ui:167 msgid "String" msgstr "Συμβολοσειρά" #: src/data/format.c:425 src/data/format.c:1035 #: src/ui/gui/var-type-dialog.ui:48 msgid "Numeric" msgstr "Αριθμητικά" #: src/data/format.c:426 src/data/sys-file-reader.c:2212 #: src/data/sys-file-reader.c:2214 src/language/xforms/recode.c:512 #: src/language/xforms/recode.c:513 src/language/xforms/recode.c:525 #: src/language/xforms/recode.c:526 #: src/language/dictionary/apply-dictionary.c:77 #: src/language/dictionary/apply-dictionary.c:78 msgid "numeric" msgstr "αριθμητικά" #: src/data/format.c:426 src/data/sys-file-reader.c:2212 #: src/data/sys-file-reader.c:2214 src/language/xforms/recode.c:512 #: src/language/xforms/recode.c:513 src/language/xforms/recode.c:525 #: src/language/xforms/recode.c:526 #: src/language/dictionary/apply-dictionary.c:77 #: src/language/dictionary/apply-dictionary.c:78 msgid "string" msgstr "συμβολοσειρά" #: src/data/format.c:444 #, c-format msgid "String variable with width %d is not compatible with format %s." msgstr "" "Μεταβλητή συμβολοσειράς με εύρος %d δεν είναι συμβατή με το μορφότυπο %s." #: src/data/format.c:1038 src/ui/gui/var-type-dialog.ui:65 msgid "Comma" msgstr "Κόμμα" #: src/data/format.c:1041 src/ui/gui/var-type-dialog.ui:82 msgid "Dot" msgstr "Τελεία" #: src/data/format.c:1044 msgid "Scientific" msgstr "Επιστημονικό" #: src/data/format.c:1061 src/ui/gui/var-type-dialog.ui:116 msgid "Date" msgstr "Ημερομηνία" #: src/data/format.c:1064 src/ui/gui/var-type-dialog.ui:133 msgid "Dollar" msgstr "Δολλάριο" #: src/data/format.c:1071 msgid "Custom" msgstr "Επιλογή χρήστη" #: src/data/gnumeric-reader.c:478 src/data/ods-reader.c:505 #, c-format msgid "Cannot convert the value in the spreadsheet cell %s to format (%s): %s" msgstr "" "Δεν μπορεί να μετατραπεί η τιμή του κελιού του υπολογιστικού φύλλου %s στο " "μορφότυπο (%s): %s" #: src/data/gnumeric-reader.c:502 src/data/ods-reader.c:567 #, c-format msgid "" "There was a problem whilst reading the %s file `%s' (near line %d): `%s'" msgstr "" "Υπήρξε πρόβλημα στην ανάγνωση του %s αρχείου `%s' (κοντά στη γραμμή %d): `%s'" #: src/data/gnumeric-reader.c:597 #, c-format msgid "" "The gnumeric file `%s' is encoded as %s instead of the usual UTF-8 encoding. " "Any non-ascii characters will be incorrectly imported." msgstr "" "Το αρχείο του Gnumeric `%s' είναι κωδικοποιημένο σαν %s αντί UTF-8." "Οποιοσδήποτε μη-ascii χαρακτήρας θα εισαχθεί εσφαλμένα." #: src/data/gnumeric-reader.c:641 src/data/ods-reader.c:682 #, c-format msgid "Invalid cell range `%s'" msgstr "Μη έγκυρο εύρος κελιού `%s'" #: src/data/gnumeric-reader.c:813 src/data/ods-reader.c:710 #: src/data/ods-reader.c:843 #, c-format msgid "Selected sheet or range of spreadsheet `%s' is empty." msgstr "" "Το επιλεγμένο φύλλο ή το εύρος των υπολογιστικών φύλλων `%s' είναι άδειο." #: src/data/identifier2.c:60 #, c-format msgid "Identifier `%s' exceeds %d-byte limit." msgstr "Ο αναγνώστης ID `%s' υπερβαίνει το όριο των %d-δύφιων." #: src/data/identifier2.c:84 msgid "Identifier cannot be empty string." msgstr "Ο αναγνώστης, ID, δεν μπορεί να είναι άδεια συμβολοσειρά." #: src/data/identifier2.c:92 #, c-format msgid "`%s' may not be used as an identifier because it is a reserved word." msgstr "" "`%s' δεν μπορεί να χρησημοποιηθεί σαν αναγνώστης, ID, επειδή είναι μία " "δεσμευμένη λέξη." #: src/data/identifier2.c:103 #, c-format msgid "" "`%s' may not be used as an identifier because it contains ill-formed UTF-8 " "at byte offset %tu." msgstr "" "`%s' δεν μπορεί να χρησημοποιηθεί σαν Αναγνωριστης, ID, επειδή έχει " "λανθασμένο UTF-8 στο δυφίο που αρχίζει στο %tu." #: src/data/identifier2.c:114 #, c-format msgid "" "Character %s (in `%s') may not appear as the first character in a identifier." msgstr "" "Ο χαρακτήρας %s (στο `%s') δεν μπορεί να είναι σαν αρχικο χαρακτήρας στον " "Αναγνωριστή, ID." #: src/data/identifier2.c:126 #, c-format msgid "Character %s (in `%s') may not appear in an identifier." msgstr "Ο χαρακτήρας %s (στο `%s') δεν μπορεί να είναι στον Αναγνωριστή, ID." #: src/data/mdd-writer.c:241 #, c-format msgid "An I/O error occurred writing metadata file `%s'." msgstr "I/O σφάλμα προέκυψε στην εγγραφή του μεταδεδομένων `%s'." #. TRANSLATORS: this fragment will be interpolated into #. messages in fh_lock() that identify types of files. #: src/data/mdd-writer.c:457 msgid "metadata file" msgstr "μεταδεδομένα αρχείου" #: src/data/mdd-writer.c:465 #, c-format msgid "Error opening `%s' for writing as a metadata file: %s." msgstr "Σφάλμα ανοίγματος `%s' για εγγραφή μεταδεδομένων αρχείου: %s." #: src/data/mdd-writer.c:473 #, c-format msgid "Internal error creating xmlTextWriter. Please report this to %s." msgstr "" "Εσωτερικό σφάλμα κατά τη δημιουργία xmlTextWriter. Αναφέρετέ το στο %s." #: src/data/make-file.c:217 #, c-format msgid "Opening %s for writing: %s." msgstr "Άνοιγμα %s για εγγραφή: %s." #: src/data/make-file.c:228 #, c-format msgid "Opening stream for %s: %s." msgstr "Άνοιγμα ροοθήκευσης για %s: %s." #: src/data/make-file.c:260 #, c-format msgid "Creating temporary file to replace %s: %s." msgstr "Δημιουργία πρόχειρου αρχείου για αντικατάσταση του %s: %s." #: src/data/make-file.c:277 #, c-format msgid "Creating temporary file %s: %s." msgstr "Δημιουργία πρόχειρου αρχείου %s: %s." #: src/data/make-file.c:289 #, c-format msgid "Opening stream for temporary file %s: %s." msgstr "Άνοιγμα ροοθήκευσης για πρόχειρο αρχείο %s: %s." #: src/data/make-file.c:326 #, c-format msgid "Replacing %s by %s: %s." msgstr "Αντικατάσταση του %s από %s: %s." #: src/data/make-file.c:354 #, c-format msgid "Removing %s: %s." msgstr "Αφαίρεση του %s: %s." #: src/data/mrset.c:83 #, c-format msgid "" "%s is not a valid name for a multiple response set. Multiple response set " "names must begin with `$'." msgstr "" "%s δεν είναι έγκυρο όνομα για το σετ πολλαπλής ανταπόκρισης. Τα ονόματα για " "το σετ πολλαπλής ανταπόκρισης πρέπει να ξεκινάνε με `$'." #: src/data/ods-reader.c:620 #, c-format msgid "Cannot open %s as a OpenDocument file: %s" msgstr "Δεν μπορεί να ανοιχθεί %s σαν ένα OpenDocument αρχείο: %s" #. TRANSLATORS: this fragment will be interpolated into #. messages in fh_lock() that identify types of files. #: src/data/pc+-file-reader.c:206 msgid "SPSS/PC+ system file" msgstr "SPSS/PC+ αρχείο συστήματος" #: src/data/pc+-file-reader.c:215 #, c-format msgid "Error opening `%s' for reading as an SPSS/PC+ system file: %s." msgstr "" "Σφάλμα ανοίγματος `%s' για ανάγνωση σαν αρχείο συστήματος SPSS/PC+: %s." #: src/data/pc+-file-reader.c:224 src/data/sys-file-reader.c:3541 #, c-format msgid "%s: stat failed (%s)." msgstr "%s: αποτυχία του stat (%s)." #: src/data/pc+-file-reader.c:230 #, c-format msgid "%s: file too large." msgstr "%s: αρχείο πολυ'μεγάλο." #: src/data/pc+-file-reader.c:257 #, c-format msgid "" "Directory entry is for a %u-byte record starting at offset %u but file is " "only %u bytes long." msgstr "" "Η καταχώρηση καταλόγου είναι έκτασης %u-byte που η εγγραφή αρχίζει από %u " "αλλά το αρχείο είναι μόνο %u δύφια." #: src/data/pc+-file-reader.c:275 #, c-format msgid "Directory fields have unexpected values (%u,%u)." msgstr "Τα πεδία του καταλόγου έχουν μη αναμενόμενες τιμές (%u,%u)." #: src/data/pc+-file-reader.c:372 src/data/sys-file-reader.c:672 #, c-format msgid "Variable %zu" msgstr "Μεταβλητή %zu" #: src/data/pc+-file-reader.c:380 src/data/sys-file-reader.c:680 #, c-format msgid "Variable %zu Label" msgstr "Μεταβλητή %zu ετικέτας" #: src/data/pc+-file-reader.c:385 #, c-format msgid "Variable %zu Value Label %zu" msgstr "Μεταβλητή %zu Τιμές Ετικέτας %zu" #: src/data/pc+-file-reader.c:388 src/data/sys-file-reader.c:690 msgid "Creation Date" msgstr "Ημερομηνία δημιουργίας" #: src/data/pc+-file-reader.c:389 src/data/sys-file-reader.c:691 msgid "Creation Time" msgstr "Ώρα δημιουργίας" #: src/data/pc+-file-reader.c:390 src/data/sys-file-reader.c:692 #: src/language/dictionary/sys-file-info.c:200 msgid "Product" msgstr "Προϊόν" #: src/data/pc+-file-reader.c:391 src/data/sys-file-reader.c:693 #: src/language/dictionary/sys-file-info.c:300 msgid "File Label" msgstr "Ετικέτα αρχείου" #: src/data/pc+-file-reader.c:427 #, c-format msgid "" "Using default encoding %s to read this SPSS/PC+ system file. For best " "results, specify an encoding explicitly. Use SYSFILE INFO with ENCODING=" "\"DETECT\" to analyze the possible encodings." msgstr "" "Χρησιμοποιώντας τις προκαθορισμένες επιλογές κωδικοποίησης %s για ανάγνωση " "του αρχείου συστήματος SPSS/PC+. Καλύτερα, προκαθόρισε έναν κωδικοποιητή " "εξαρχής. Χρησιμοποίησε SYSFILE INFO με ENCODING=\"DETECT\" για να δεις " "πιθανούς κωδικοποιητές." #: src/data/pc+-file-reader.c:483 src/data/sys-file-reader.c:890 #, c-format msgid "Error closing system file `%s': %s." msgstr "Σφάλμα κλεισίματος αρχείου συστήματος `%s': %s." #: src/data/pc+-file-reader.c:544 msgid "This is not an SPSS/PC+ system file." msgstr "Δεν είναι ένα αρχείο συστήματος SPSS/PC+." #: src/data/pc+-file-reader.c:548 #, c-format msgid "Record 0 has unexpected length %u." msgstr "Η εγγραφή 0 έχει μη αναμενόμενο μήκος %u." #: src/data/pc+-file-reader.c:572 #, c-format msgid "Record 0 specifies unexpected system missing value %g (%a)." msgstr "" "Η εγγραφή 0 καθορίζει μία μη αναμενόμενη ελλειπούσα τιμή συστήματος %g (%a)." #: src/data/pc+-file-reader.c:577 #, c-format msgid "Record 0 reserved fields have unexpected values (%u,%u,%u,%u,%u,%u)." msgstr "" "Η εγγραφή 0 δεσμεύει πεδία τα οποία έχουν μη αναμενόμενες τιμές (%u,%u,%u,%u," "%u,%u)." #: src/data/pc+-file-reader.c:581 #, c-format msgid "Record 0 case counts differ (%u versus %u)." msgstr "Η εγγραφή 0 υπόθεση διαφορετικά υπολογίζεται (%u αντί για %u)." #: src/data/pc+-file-reader.c:585 #, c-format msgid "Invalid compression type %u." msgstr "Μη έγκυρη συμπίεση τύπου %u." #: src/data/pc+-file-reader.c:596 #, c-format msgid "" "Record 0 claims %u cases with %u values per case (requiring at least %zu " "bytes) but data record is only %u bytes long." msgstr "" "Η εγγραφή 0 αναφέρει %u υποθέσεις με %u τιμές ανά υπόθεση (απαιτεί " "τουλάχιστον %zu δύφια) αλλά οι εγγραφές δεδομένων είναι μόνο %u δύφια." #: src/data/pc+-file-reader.c:618 #, c-format msgid "" "Value labels claimed to end at offset %u in labels record but labels record " "is only %u bytes." msgstr "" "Οι ταμπέλες τιμών ανέφεραν ότι σταμάτησαν στο %u στις εγγραφές ταμπελών αλλά " "οι εγγραφές ταμπελών είναι μόνο %u δύφια." #: src/data/pc+-file-reader.c:629 #, c-format msgid "" "Value labels claimed to be at offset %u with length %u but file size is only " "%u bytes." msgstr "" "Οι ταμπέλες τιμών ανέφεραν ότι ξεκινούν στο %u με μήκος %u αλλά το μέγεθος " "του αρχείου είναι μόνο %u δύφια." #: src/data/pc+-file-reader.c:656 #, c-format msgid "" "Value labels end with partial label (%u bytes left in record, label length " "%)." msgstr "" "Οι ετικέτας τιμών τελειώνουν με περικομμένη ταμπέλα (%u δύφια έμειναν για " "εγγραφή, μήκος ετικέτας %)." #: src/data/pc+-file-reader.c:669 #, c-format msgid "%u leftover bytes following value labels." msgstr "%u δύφια έμείναν για ταμπέλες τιμών." #: src/data/pc+-file-reader.c:685 #, c-format msgid "" "Variable label claimed to start at offset %u in labels record but labels " "record is only %u bytes." msgstr "" "Οι ταμπέλες μεταβλητών ανέφεραν ότι ξεκινούν στο %u στις εγγραφές ταμπέλων " "αλλά οι εγγραφές ταμπέλων είναι μόνο %u δύφια." #: src/data/pc+-file-reader.c:697 #, c-format msgid "" "Variable label with length %u starting at offset %u in labels record " "overruns end of %u-byte labels record." msgstr "" "Οι ταμπέλες μεταβλητών με μήκος %u που ξεκινούν στο %u στις εγγραφές " "ταμπέλων υπερβαίνουν το τέλος των %u-δυφίων στις εγγραφές ταμπελών." #: src/data/pc+-file-reader.c:719 #, c-format msgid "Record 1 has length %u (expected %u)." msgstr "Η εγγραφή 1 έχει μήκος %u (αναμενόταν %u)." #: src/data/pc+-file-reader.c:751 #, c-format msgid "Variable %u has invalid type %." msgstr "Η μεταβλητή %u έχει μη έγκυρο τύπο %." #: src/data/pc+-file-reader.c:787 #, c-format msgid "Invalid weight index %u." msgstr "Μη έγκυρος καταχωρητής στάθμισης %u." #: src/data/pc+-file-reader.c:857 #, c-format msgid "Invalid variable name `%s'." msgstr "Μη έγκυρο όνομα μεταβλητής `%s'." #: src/data/pc+-file-reader.c:865 src/data/sys-file-reader.c:1444 #, c-format msgid "Renaming variable with duplicate name `%s' to `%s'." msgstr "Μετονομασία μεταβλητής με διπλότυπο όνομα από `%s' σε `%s'." #: src/data/pc+-file-reader.c:877 #, c-format msgid "Cannot weight by string variable `%s'." msgstr "Δεν μπορεί να χρησιμοποιηθεί σαν Βάρος μεταβλητή συμβολοσειράς `%s'." #: src/data/pc+-file-reader.c:973 src/data/sys-file-reader.c:2762 msgid "File ends in partial case." msgstr "Το αρχείο τελειώνει πρόωρα." #: src/data/pc+-file-reader.c:979 #, c-format msgid "" "Case beginning at offset 0x%08x extends past end of data record at offset 0x" "%08x." msgstr "" "Η υπόθεση που αρχίζει στο 0x%08x επεκτείνεται μετά το τέλος του αρχείου στο " "0x%08x." #: src/data/pc+-file-reader.c:998 src/data/sys-file-reader.c:2770 #, c-format msgid "Error reading case from file %s." msgstr "Σφάλμα ανάγνωσης υπόθεσης από το αρχείο %s." #: src/data/pc+-file-reader.c:1114 src/data/sys-file-reader.c:2933 #, c-format msgid "" "Possible compressed data corruption: string contains compressed integer " "(opcode %d)." msgstr "" "Πιθανόν αλλοιωμένα συμπιεσμένα δεδομένα: Η συμβολοσειρά περιέχει ακέραιο τον " "ακέραιο αριθμό συμπίεσης (opcode %d)." #: src/data/pc+-file-reader.c:1156 src/data/sys-file-reader.c:3234 #, c-format msgid "`%s' near offset 0x%llx: " msgstr "`%s' κόντα στο 0x%llx: " #: src/data/pc+-file-reader.c:1159 src/data/sys-file-reader.c:3237 #, c-format msgid "`%s': " msgstr "`%s': " #: src/data/pc+-file-reader.c:1211 src/data/sys-file-reader.c:3288 #, c-format msgid "System error: %s." msgstr "Σφάλμα συστήματος: %s." #: src/data/pc+-file-reader.c:1216 src/data/sys-file-reader.c:3293 msgid "Unexpected end of file." msgstr "Μη αναμενόμενο τέλος αρχείου." #: src/data/pc+-file-reader.c:1301 src/data/sys-file-reader.c:3518 #, c-format msgid "%s: seek failed (%s)." msgstr "%s: η αναζήτηση απέτυχε (%s)." #: src/data/pc+-file-reader.c:1351 msgid "SPSS/PC+ System File" msgstr "Αρχείο συστήματος SPSS/PC+" #: src/data/por-file-reader.c:109 #, c-format msgid "portable file %s corrupt at offset 0x%llx: " msgstr "φορητό αρχείο %s αλλοιωμένο στο 0x%llx: " #: src/data/por-file-reader.c:136 #, c-format msgid "reading portable file %s at offset 0x%llx: " msgstr "διάβασμα φορητού αρχείου %s από 0x%llx: " #: src/data/por-file-reader.c:164 #, c-format msgid "Error closing portable file `%s': %s." msgstr "Σφάλμα στο κλείσιμο του φορητού αρχείου `%s': %s." #: src/data/por-file-reader.c:216 msgid "unexpected end of file" msgstr "μη αναμενόμενο τέλος αρχείου" #. TRANSLATORS: this fragment will be interpolated into #. messages in fh_lock() that identify types of files. #: src/data/por-file-reader.c:275 src/data/por-file-writer.c:147 msgid "portable file" msgstr "φορητό αρχείο" #: src/data/por-file-reader.c:283 #, c-format msgid "" "An error occurred while opening `%s' for reading as a portable file: %s." msgstr "" "Σφάλμα συνέβη στο άνοιγμα του `%s' για διάβασμα σαν φορητού αρχείου: %s." #: src/data/por-file-reader.c:304 msgid "Data record expected." msgstr "Δεδομένα αναμενόταν να υπάρχουν." #: src/data/por-file-reader.c:402 msgid "Number expected." msgstr "Αριθμός αναμενόταν." #: src/data/por-file-reader.c:430 msgid "Missing numeric terminator." msgstr "Λείπει αριθμητικός τερματιστής." #: src/data/por-file-reader.c:453 msgid "Invalid integer." msgstr "Μη έγκυρος ακέραιςο αριθμός." #: src/data/por-file-reader.c:464 src/data/por-file-reader.c:484 #, c-format msgid "Bad string length %d." msgstr "Λάθος μήκος συμβολοσειράς %d." #: src/data/por-file-reader.c:547 #, c-format msgid "%s: Not a portable file." msgstr "%s: Δεν είναι φορητό αρχείο." #: src/data/por-file-reader.c:564 #, c-format msgid "Unrecognized version code `%c'." msgstr "Μη αναγνωρίσιμη έκδοση κώδικα `%c'." #: src/data/por-file-reader.c:577 #, c-format msgid "Bad date string length %zu." msgstr "Λάθος μήκος συμβολοσειράς ημερομηνίας %zu." #: src/data/por-file-reader.c:579 #, c-format msgid "Bad time string length %zu." msgstr "Λάθος μήκος συμβολοσειράς χρόνου %zu." #: src/data/por-file-reader.c:630 #, c-format msgid "" "%s: Bad format specifier byte (%d). Variable will be assigned a default " "format." msgstr "" "%s: Λανθασμένο μορφότυπο διφύου (%d). Η μεταβλητή θα μορφοποιηθεί με μία " "προκαθορισμένη μορφοποίηση." #: src/data/por-file-reader.c:651 #, c-format msgid "Numeric variable %s has invalid format specifier %s." msgstr "Η αριθμητική μεταβλητή %s έχει μη έγκυρο δοσμένο μορφότυπο %s." #: src/data/por-file-reader.c:655 #, c-format msgid "String variable %s with width %d has invalid format specifier %s." msgstr "" "Η μεταβλητή συμβολοσειράς %s με εύρος %d έχει μη έγκυρο δοσμένο μορφότυπο " "%s." #: src/data/por-file-reader.c:679 msgid "Expected variable count record." msgstr "Αναμενόταν εγγραφή μετρήσιμου δείκτη μεταβλητής." #: src/data/por-file-reader.c:683 #, c-format msgid "Invalid number of variables %d." msgstr "Μη έγκυρος αριθμός μεταβλητών %d." #: src/data/por-file-reader.c:692 #, c-format msgid "Weight variable name (%s) truncated." msgstr "Το όνομα της μεταβλητής στάθμισης (%s) περικόπηκε." #: src/data/por-file-reader.c:707 msgid "Expected variable record." msgstr "Αναμετόνα εγγραφή μεταβλητής." #: src/data/por-file-reader.c:711 #, c-format msgid "Invalid variable width %d." msgstr "Μη έγκυρο εύρος μεταβλητής %d." #: src/data/por-file-reader.c:719 #, c-format msgid "Invalid variable name `%s' in position %d." msgstr "Μη έγκυρο όνομα μεταβλητής `%s' στη θέση %d." #: src/data/por-file-reader.c:723 src/data/sys-file-reader.c:1426 #, c-format msgid "Bad width %d for variable %s." msgstr "Λάθος εύρος %d για την μεταβλητή %s." #: src/data/por-file-reader.c:737 #, c-format msgid "Duplicate variable name %s in position %d renamed to %s." msgstr "" "Διπλοεγγραφή ονόματος μεταβλητής %s στη θέση %d που μετονομάστηκε σεσ %s." #: src/data/por-file-reader.c:786 #, c-format msgid "Weighting variable %s not present in dictionary." msgstr "Η μεταβλητή στάθμισης %s δεν υπάρχει στην λίστα." #: src/data/por-file-reader.c:830 #, c-format msgid "Unknown variable %s while parsing value labels." msgstr "Άγνωστη μεταβλητή %s καθώς γινόταν ανάλυση των Ταμπέλων τιμών." #: src/data/por-file-reader.c:833 #, c-format msgid "" "Cannot assign value labels to %s and %s, which have different variable types." msgstr "" "Δεν μπορεί να τοποθετηθεί ετικέτα τιμής στην %s και στην %s, οι οποίες είναι " "διαφορετικού τύπου μεταβλητές." #: src/data/por-file-reader.c:972 msgid "SPSS Portable File" msgstr "Φορητό αρχείο SPSS" #: src/data/por-file-writer.c:139 #, c-format msgid "Invalid decimal digits count %d. Treating as %d." msgstr "Μη έγκυρη μέτρηση δεκαδικών ψηφίων %d. Θεωρείται ως %d." #: src/data/por-file-writer.c:159 #, c-format msgid "Error opening `%s' for writing as a portable file: %s." msgstr "Σφάλμα ανοίγματος `%s' για εγγραφή σαν φορητό αρχείο: %s." #: src/data/por-file-writer.c:505 #, c-format msgid "An I/O error occurred writing portable file `%s'." msgstr "Ένα σφάλμα I/O συνέβη στην εγγραφή φορητού αρχείου `%s'." #: src/data/psql-reader.c:48 msgid "" "Support for reading postgres databases was not compiled into this " "installation of PSPP" msgstr "" "Υποστήριξη για ανάγνωση postgres βάσης δεδομένων δεν υπάρχει σε αυτή την " "εγκατάσταση PSPP" #: src/data/psql-reader.c:242 msgid "Memory error whilst opening psql source" msgstr "Σφάλμα μνήμης στη διάρκεια ανοίγματος της psql" #: src/data/psql-reader.c:248 #, c-format msgid "Error opening psql source: %s." msgstr "Σφάλμα ανοίγματος psql: %s." #: src/data/psql-reader.c:263 #, c-format msgid "" "Postgres server is version %s. Reading from versions earlier than 8.0 is not " "supported." msgstr "" "Ο Postgres διακομιστής είναι έκδοσης %s. Η ανάγνωση εκδόσεων πριν την 8.0 " "δεν υποστηρίζεται." #: src/data/psql-reader.c:283 msgid "" "Connection is unencrypted, but unencrypted connections have not been " "permitted." msgstr "" "Η σύνδεση είναι μη κρυπτογραφημένη, αλλά μη κρυπτογραφημένες συνδέσεις δεν " "έχουν επιτραπεί." #: src/data/psql-reader.c:324 src/data/psql-reader.c:349 #: src/data/psql-reader.c:359 #, c-format msgid "Error from psql source: %s." msgstr "Σφάλμα από την psql: %s." #: src/data/psql-reader.c:454 #, c-format msgid "Unsupported OID %d. SYSMIS values will be inserted." msgstr "Μη υποστηριζόμενη OID %d. SYSMIS τιμές θα εισαχθούν." #: src/data/settings.c:391 msgid "" "MXWARNS set to zero. No further warnings will be given even when " "potentially problematic situations are encountered." msgstr "" "MXWARNS ορίστηκε στο 0. Δεν θα δοθούν άλλες προειδοποιήσεις ακόμη και αν " "άλλες προβληματικές καταστάσεις εμφανιστούν." #: src/data/settings.c:398 #, c-format msgid "" "Warnings re-enabled. %d warnings will be issued before aborting syntax " "processing." msgstr "" "Οι προειδοποιήσεις επανενεργοποιείθηκαν. %d προειδοποιήσεις θα εκδίδονται " "πριν την διακοπή στην επεξεργασία της σύνταξης." #: src/data/settings.c:618 #, c-format msgid "" "%s: Custom currency string `%s' does not contain exactly three periods or " "commas (or it contains both)." msgstr "" "%s: Η επιλεγμένη συμβολοσειρά νομίσματος `%s' δεν περιλαμβάνει ακριβώς τρεις " "τελίες ή κόμματα (ή περιλαμβάνει και τα δύο)." #. TRANSLATORS: this fragment will be interpolated into #. messages in fh_lock() that identify types of files. #: src/data/sys-file-reader.c:407 src/data/sys-file-writer.c:245 msgid "system file" msgstr "αρχείο συστήματος" #: src/data/sys-file-reader.c:414 #, c-format msgid "Error opening `%s' for reading as a system file: %s." msgstr "Σφάλμα ανοίγματος `%s' για ανάγνωση σαν αρχείο συστήματος: %s." #: src/data/sys-file-reader.c:491 msgid "Misplaced type 4 record." msgstr "Αστοχεία τύπου 4 εγγραφή." #: src/data/sys-file-reader.c:496 msgid "Duplicate type 6 (document) record." msgstr "Διπλότυπο τύπου 6 (εγγράφου) εγγραφή." #: src/data/sys-file-reader.c:506 src/data/sys-file-reader.c:1343 #, c-format msgid "" "Unrecognized record type 7, subtype %d. For help, please send this file to " "%s and mention that you were using %s." msgstr "" "Μη αναγνωρίσιμη εγγραφή τύπου 7, υπότυπος %d. Στείλε ένα αντίγραφο του " "αρχείου σε %s, και ανέφερε ότι έκανες χρήσης του %s." #: src/data/sys-file-reader.c:526 #, c-format msgid "" "Record type 7, subtype %d found here has the same type as the record found " "near offset 0x%llx. For help, please send this file to %s and mention that " "you were using %s." msgstr "" "Εγγραφή τύπου 7, υπότυπος %d που βρέθηκε εδώ έχει τον ίδιο τύπο όπως η " "εγγραφή που βρέθηκε κοντά στο 0x%llx. Για βοήθεια, στείλε το αρχείο αυτό %s " "και ανέφερε ότι έκανες χρήσης του %s." #: src/data/sys-file-reader.c:538 #, c-format msgid "Unrecognized record type %d." msgstr "Μη αναγνωρίσιμη εγγραφή τύπου %d." #: src/data/sys-file-reader.c:688 #, c-format msgid "Value Label %zu" msgstr "Ετικέτα τιμής %zu" #: src/data/sys-file-reader.c:697 msgid "Extra Product Info" msgstr "Επιπλέον πληροφορίες προίοντος" #: src/data/sys-file-reader.c:710 #, c-format msgid "Document Line %zu" msgstr "Γρααμή εγγράφου %zu" #: src/data/sys-file-reader.c:718 #, c-format msgid "MRSET %zu" msgstr "MRSET %zu" #: src/data/sys-file-reader.c:720 #, c-format msgid "MRSET %zu Label" msgstr "MRSET %zu Ετικέτας" #: src/data/sys-file-reader.c:725 #, c-format msgid "MRSET %zu Counted Value" msgstr "MRSET %zu υπολογίσιμη τιμή" #: src/data/sys-file-reader.c:763 #, c-format msgid "" "This system file does not indicate its own character encoding. Using " "default encoding %s. For best results, specify an encoding explicitly. Use " "SYSFILE INFO with ENCODING=\"DETECT\" to analyze the possible encodings." msgstr "" "Αυτό το αρχείο συστήματος δεν αναφέρει το σύστημα κωδικοποίησης των " "χαρακτήρων του. Χρησιμοποιήτε η ορισμένη κψδικοποίηση %s. Μπορείτε να " "ορίσετε μία κωδικοποίηση. Κάνε χρήση του SYSFILE INFO με ENCODING=\"DETECT" "\" για να δεις πιθανές κωδικοποιήσεις." #: src/data/sys-file-reader.c:845 #, c-format msgid "File header claims %d variable positions but %zu were read from file." msgstr "" "Η επικεφαλίδα αρχείου αναφέρει %d διάφορες θέσεις αλλά %zu διαβάστηκε από το " "αρχείο." #: src/data/sys-file-reader.c:958 src/data/sys-file-reader.c:972 msgid "This is not an SPSS system file." msgstr "Αυτό δεν είναι ένα αρχείο συστήματος SPSS." #: src/data/sys-file-reader.c:1027 msgid "" "Compression bias is not the usual value of 100, or system file uses " "unrecognized floating-point format." msgstr "" "Η τιμή συμπίεσης δεν έχει τη συνήθης τιμή 100, ή το αρχείο συστήματος κάνει " "χρήση μη αναγνωρίσιμης μορφής κινητής υποδιαστολής." #: src/data/sys-file-reader.c:1102 msgid "Variable label indicator field is not 0 or 1." msgstr "Η ένδειξη πεδίου της ετικέτας μεταβλητής δεν είναι 0 ή 1." #: src/data/sys-file-reader.c:1115 msgid "Numeric missing value indicator field is not -3, -2, 0, 1, 2, or 3." msgstr "" "Η ένδειξη πεδίου των αριθμητικών ελλειπούσων τιμών δεν είναι -3, -2, 0, 1, " "2, ή 3." #: src/data/sys-file-reader.c:1125 msgid "String missing value indicator field is not 0, 1, 2, or 3." msgstr "Η ένδειξη πεδίου της συμβολοσειράς δεν είναι 0, 1, 2, ή 3." #: src/data/sys-file-reader.c:1152 #, c-format msgid "Invalid number of labels %u." msgstr "Μη έγκυρος αριθμός Ταμπέλων %u." #: src/data/sys-file-reader.c:1185 msgid "" "Variable index record (type 4) does not immediately follow value label " "record (type 3) as it should." msgstr "" "Η ένδειξη εγγραφής μεταβλητών (τύπου 4) δεν ακολουθεί άμεσα τις εγγραφές των " "ταμπέλων τιμών (τύπου 3) όπως θα έπρεπε." #: src/data/sys-file-reader.c:1197 #, c-format msgid "" "Number of variables associated with a value label (%u) is not between 1 and " "the number of variables (%zu)." msgstr "" "Ο αριθμός των μεταβλητών που έχουν σχέση με μία τιμή ετικέτας (%u) δεν είναι " "μεταξύ 1 και με τον αριθμό των μεταβλητών (%zu)." #: src/data/sys-file-reader.c:1224 #, c-format msgid "Number of document lines (%d) must be greater than 0 and less than %d." msgstr "" "Ο αριθμός των γραμμών του εγγράφου (%d) πρέπει να είναι μεγαλύτερος από 0 " "και μικρότερος από %d." #: src/data/sys-file-reader.c:1317 #, c-format msgid "Record type 7, subtype %d has bad size %u (expected %d)." msgstr "" "Η εγγραφή τύπου 7, υποτύπου %d είχε λανθασμένο μέγεθος %u (αναμενόταν %d)." #: src/data/sys-file-reader.c:1321 #, c-format msgid "Record type 7, subtype %d has bad count %u (expected %d)." msgstr "" "Η εγγραφή τύπου 7, υποτύπου %d είχαν λανθασμένη αρίθμηση %u (expected %d)." #: src/data/sys-file-reader.c:1435 #, fuzzy, c-format #| msgid "Renaming variable with duplicate name `%s' to `%s'." msgid "Renaming variable with invalid name `%s' to `%s'." msgstr "Μετονομασία μεταβλητής με διπλότυπο όνομα από `%s' σε `%s'." #: src/data/sys-file-reader.c:1517 msgid "Missing string continuation record." msgstr "Ελλειπής εγγραφή της συνέχηση της συμβολοσειράς." #: src/data/sys-file-reader.c:1550 #, c-format msgid "Variable %s with width %d has invalid print format 0x%x." msgstr "Η μεταβλητή %s με εύρος %d έχει μη έγκυρο μορφότυπο εκτύπωσης 0x%x." #: src/data/sys-file-reader.c:1554 #, c-format msgid "Variable %s with width %d has invalid write format 0x%x." msgstr "Η μεταβλητή %s με εύρος %d έχει μη έγκυρο εγγράψιμο μορφότυπο 0x%x." #: src/data/sys-file-reader.c:1559 msgid "Suppressing further invalid format warnings." msgstr "Επιπλέον παράλλειψη μη έγκυρο μορφότυπο προειδοποιήσεων." #: src/data/sys-file-reader.c:1613 #, c-format msgid "" "Floating-point representation indicated by system file (%d) differs from " "expected (%d)." msgstr "" "Η δηλωθείς κινητή υποδιαστολή από το αρχείο συστήματος (%d) διαφέρει από την " "αναμενόμενη (%d)." #: src/data/sys-file-reader.c:1629 #, c-format msgid "" "Integer format indicated by system file (%d) differs from expected (%d)." msgstr "" "Ο μορφότυποε των ακέραιων δηλωθείς από το αρχείο συστήματος (%d) διαφέρει " "από την αναμενόμενη (%d)." #: src/data/sys-file-reader.c:1647 src/data/sys-file-reader.c:1653 #, c-format msgid "File specifies unexpected value %g (%a) as %s, instead of %g (%a)." msgstr "Το αρχείο ορίζει μη αναμενόμενη τιμή %g (%a) σαν %s, αντί για %g (%a)." #: src/data/sys-file-reader.c:1662 #, c-format msgid "" "File specifies unexpected value %g (%a) as %s, instead of %g (%a) or %g (%a)." msgstr "" "Το αρχείο ορίζει μη αναμενόμενη τιμή %g (%a) σαν %s, αντί για %g (%a) ή %g " "(%a)." #: src/data/sys-file-reader.c:1714 src/data/sys-file-reader.c:1733 #, c-format msgid "Missing space following `%c' at offset %zu in MRSETS record." msgstr "Ελλειπές διάστημα που ακολουθεί το `%c' στο %zu στις εγγραφές MRSETS." #: src/data/sys-file-reader.c:1741 #, c-format msgid "" "Missing label source value following `E' at offset %zu in MRSETS record." msgstr "" "Ε ετικέτα τιμής από τη πηγή που ακολουθεί το `E' στο %zu στις εγγραφές " "MRSETS." #: src/data/sys-file-reader.c:1748 #, c-format msgid "" "Unexpected label source value following `E' at offset %zu in MRSETS record." msgstr "" "Μη αναμενόμενη ετικέτα τιμής από τη πηγή που ακολουθεί το `E' στο %zu στις " "εγγραφές MRSETS." #: src/data/sys-file-reader.c:1755 #, c-format msgid "Missing `C', `D', or `E' at offset %zu in MRSETS record." msgstr "Ελλειπούσες `C', `D', ή `E' στο %zu στις εγγραφές MRSETS." #: src/data/sys-file-reader.c:1782 #, c-format msgid "Missing new-line parsing variable names at offset %zu in MRSETS record." msgstr "" "Ελλειπούσα νέα γραμμή ανάλυσης ονομάτων μεταβλητών στο %zu στις εγγραφές " "MRSETS." #: src/data/sys-file-reader.c:1817 #, c-format msgid "Invalid multiple response set name `%s'." msgstr "Δεν ορίστηκε όνομα για το σετ πολλαπλών απαντήσεων `%s'." #: src/data/sys-file-reader.c:1850 #, c-format msgid "MRSET %s contains duplicate variable name %s." msgstr "MRSET %s περιλαμβάνει διπλότυπο όνομα μεταβλητής %s." #: src/data/sys-file-reader.c:1865 #, c-format msgid "MRSET %s contains both string and numeric variables." msgstr "MRSET %s περιλαμβάνει και συμβολοσειρές και Αριθμητικές μεταβλητές." #: src/data/sys-file-reader.c:1877 #, c-format msgid "MRSET %s has no variables." msgstr "MRSET %s δεν έχει μεταβλητές." #: src/data/sys-file-reader.c:1879 #, c-format msgid "MRSET %s has only one variable." msgstr "MRSET %s έχει μόνο μία μεταβλητή." #: src/data/sys-file-reader.c:1923 #, c-format msgid "Extension 11 has bad count %u (for %zu variables)." msgstr "Η επέκταση 11 έχει κακή αρίθμηση %u (για %zu μεταβλητές)." #: src/data/sys-file-reader.c:1956 #, c-format msgid "" "Invalid variable display parameters for variable %zu (%s). Default " "parameters substituted." msgstr "" "Μη έγκυρή παράμετρος απεικόνισης για μεταβλητές %zu (%s). Η καθορισμένη " "παράμετρος υποκαταστάθηκε." #: src/data/sys-file-reader.c:2000 #, c-format msgid "Duplicate long variable name `%s'." msgstr "Διπλότυπο μεγάλο όνομα μεταβλητής `%s'." #: src/data/sys-file-reader.c:2053 #, c-format msgid "Long variable mapping from %s to invalid variable name `%s'." msgstr "Αντιγραφή μεγάλου ονόματος μεταβλητής από %s σε μη έγκυρο όνομα `%s'." #: src/data/sys-file-reader.c:2088 #, c-format msgid "%s listed as string of invalid length %s in very long string record." msgstr "" "%s αναφέρθηκε σαν συμβολοσειρά μη έγκυρου μήκους %s σε εγγραφή με πολύ " "μεγάλο μήκος." #: src/data/sys-file-reader.c:2099 #, c-format msgid "" "%s listed in very long string record with width %s, which requires only one " "segment." msgstr "" "%s αναφέρθηκε σε εγγραφή με πολύ μεγάλο εύρος %s, το οποίο απαιτέι μόνο ένα " "τμήμα." #: src/data/sys-file-reader.c:2107 #, c-format msgid "Very long string %s overflows dictionary." msgstr "Πολύ μεγάλη συμβολοσειρά %s που υπερχειλίζει την λίστα." #: src/data/sys-file-reader.c:2125 #, c-format msgid "" "Very long string with width %ld has segment %d of width %d (expected %d)." msgstr "" "Πολύ μεγάλη συμβολοσειρά με εύρος %ld έχει τμήμα %d εύρους %d (αναμενόμενο " "%d)." #: src/data/sys-file-reader.c:2183 #, fuzzy, c-format #| msgid "Variable index %d not in valid range 1...%zu." msgid "Value label variable index %d not in valid range 1...%zu." msgstr "Ο καταχωρητής μεταβλητής %d δεν είναι σε έγκυρο εύρος 1...%zu." #: src/data/sys-file-reader.c:2193 #, fuzzy, c-format #| msgid "Variable index %d refers to long string continuation." msgid "Value label variable index %d refers to long string continuation." msgstr "" "Ο καταχωρητής μεταβλητής %d αναφέρεται σε μεγάλες συμβολοσειρές που " "συνεχίζονται." #: src/data/sys-file-reader.c:2208 #, c-format msgid "" "Variables associated with value label are not all of identical type. " "Variable %s is %s, but variable %s is %s." msgstr "" "Μεταβλητές που έχουν σχετιστεί με τιμές ταμπελών δεν είναι όλες ίδιου " "τύπου. Η μεταβλητή %s είναι %s, αλλά η μεταβλητή %s είναι %s." #: src/data/sys-file-reader.c:2226 #, c-format msgid "" "Value labels may not be added to long string variables (e.g. %s) using " "records types 3 and 4." msgstr "" "Ταμπέλες τιμών δεν μπορούν να προσθεθούν σε μεγάλες μεταβλητές συμβολοσειράς " "(π.χ. %s) σε εγγραφές τύπου 3 και 4." #: src/data/sys-file-reader.c:2255 #, c-format msgid "Duplicate value label for %g on %s." msgstr "Διπλότυπες τιμές ταμπέλων για %g στο %s." #: src/data/sys-file-reader.c:2260 src/data/sys-file-reader.c:2600 #, c-format msgid "Duplicate value label for `%.*s' on %s." msgstr "Διπλότυπη τιμή ετικέτας για `%.*s' στο %s." #: src/data/sys-file-reader.c:2283 #, fuzzy, c-format #| msgid "Suppressed %d additional related warnings." msgid "Suppressed %d additional warnings for value labels." msgstr "Παράληψη %d επιπλεόν σχετικών προειδοποιήσεων." #: src/data/sys-file-reader.c:2297 #, fuzzy, c-format #| msgid "Weight variable index %d not in valid range 1...%zu." msgid "" "Weight variable index %d not in valid range 1...%zu. Treating file as " "unweighted." msgstr "Ο Δείκτης Βάρους μεταβλητής %d σε μη έγκυρο εύρος 1 ... %zu." #: src/data/sys-file-reader.c:2307 #, fuzzy, c-format #| msgid "Weight variable index %d refers to long string continuation." msgid "" "Weight variable index %d refers to long string continuation. Treating file " "as unweighted." msgstr "" "Ο Δείκτης Βάρους μεταβλητής %d αναφέρεται σε μακρά συνεχή συμβολοσειρών." #: src/data/sys-file-reader.c:2315 #, c-format msgid "Ignoring string variable `%s' set as weighting variable." msgstr "" "Αγνόηση της μεταβλητής συμβολοσειράς `%s' που ορίστηκε σαν μεταβλητή " "στάθμισης." #: src/data/sys-file-reader.c:2352 #, c-format msgid "Error parsing attribute value %s[%d]." msgstr "Σφάλμα ανάλυσης ιδιότητας τιμής %s[%d]." #: src/data/sys-file-reader.c:2366 #, c-format msgid "Attribute value %s[%d] is not quoted: %s." msgstr "Ιδιότητα τιμής %s[%d] δεν έχουν παρατεθεί: %s." #: src/data/sys-file-reader.c:2379 #, c-format msgid "Duplicate attribute %s." msgstr "Διπλότυπο χαρακτηριστικό %s." #: src/data/sys-file-reader.c:2463 #, c-format msgid "Invalid role for variable %s." msgstr "Μη έγκυρος ρολος για μεταβλητή %s." #: src/data/sys-file-reader.c:2472 #, c-format msgid "%zu other variables had invalid roles." msgstr "%zu άλλες μεταβλητές είχαν μη έγκυρους ρόλους." #: src/data/sys-file-reader.c:2485 #, c-format msgid "Extension record subtype %d ends unexpectedly." msgstr "Η εγγραφή επέκτασης υποτύπου %d τελειώνει μη αναμενόμενα." #: src/data/sys-file-reader.c:2531 #, c-format msgid "Ignoring long string value label record for unknown variable %s." msgstr "" "Αγνόηση ταμπέλες τιμών για μεγάλες συμβολοσειρές για άγνωστη μεταβλητή %s." #: src/data/sys-file-reader.c:2536 #, c-format msgid "Ignoring long string value label record for numeric variable %s." msgstr "" "Αγνόηση ταμπέλες τιμών για μεγάλες συμβολοσειρές για Αριθμητική μεταβλητή %s." #: src/data/sys-file-reader.c:2543 #, c-format msgid "" "Ignoring long string value label record for variable %s because the record's " "width (%d) does not match the variable's width (%d)." msgstr "" "Αγνόηση εγγραφής ταμπέλων τιμών για μεγάλες συμβολοσειρές για μεταβλητή %s " "επειδή το εύρος της εγγραφής (%d) δεν ταιριάζει με το εύρος της μεταβλητής " "(%d)." #: src/data/sys-file-reader.c:2573 #, c-format msgid "" "Ignoring long string value label %zu for variable %s, with width %d, that " "has bad value width %zu." msgstr "" "Αγνόηση ετικέτας τιμών για μεγάλες συμβολοσειρές %zu για μεταβλητή %s, με " "εύρος %d, που έχει λάθος τιμή εύρους %zu." #: src/data/sys-file-reader.c:2646 #, c-format msgid "" "Long string missing values record says variable %s has %d missing values, " "but only 1 to 3 missing values are allowed." msgstr "" "Η εγγραφή ελλειπούσων τιμών μεγάλων συμβολοσειρών αναφέρει ότι η μεταβλητή " "%s έχει %d ελλειπούσες τιμές αλλά μόνο 1 ως 3 ελλειπούσες τιμές επιτρέπονται." #: src/data/sys-file-reader.c:2656 #, c-format msgid "Ignoring long string missing value record for unknown variable %s." msgstr "" "Αγνόηση εγγραφής ελλειπούσων τιμών μεγάλων συμβολοσειρών για άγνωστη " "μεταβλητή %s." #: src/data/sys-file-reader.c:2661 #, c-format msgid "Ignoring long string missing value record for numeric variable %s." msgstr "" "Αγνόηση εγγραφής ελλειπούσων τιμών μεγάλων συμβολοσειρών για Αριθμητική " "μεταβλητή %s." #: src/data/sys-file-reader.c:2686 #, c-format msgid "" "Ignoring long string missing value %zu for variable %s, with width %d, that " "has bad value width %zu." msgstr "" "Αγνόηση ελλειπούσων τιμών μεγάλων συμβολοσειρών %zu για μεταβλητή %s, με " "εύρος %d, που έχει λάθος τιμή εύρους %zu." #: src/data/sys-file-reader.c:2740 msgid "File ends in partial string value." msgstr "Το αρχείο τελειώνει με περικομμένη τιμή συμβολοσειράς." #: src/data/sys-file-reader.c:2879 msgid "" "Possible compressed data corruption: compressed spaces appear in numeric " "field." msgstr "" "Πιθανόν αλλοίωση στη συμπίεση: Συμπιεσμένα διαστήματα εμφανίζονται σε " "αριθμητικά πεδία." #: src/data/sys-file-reader.c:3030 #, c-format msgid "Suppressed %d additional related warnings." msgstr "Παράληψη %d επιπλεόν σχετικών προειδοποιήσεων." #: src/data/sys-file-reader.c:3076 src/data/sys-file-reader.c:3093 #, c-format msgid "Dictionary record refers to unknown variable %s." msgstr "Η εγγραφή στην λίστα αναφέρει άγνωστη μεταβλητή %s." #: src/data/sys-file-reader.c:3159 #, c-format msgid "Expecting digit at offset %zu in MRSETS record." msgstr "Αναμενόταν ψηφίο στο %zu στις εγγραφές MRSETS." #: src/data/sys-file-reader.c:3167 #, c-format msgid "Expecting space at offset %zu in MRSETS record." msgstr "Αναμενόταν διάστημα στο %zu στις εγγραφές MRSETS." #: src/data/sys-file-reader.c:3175 #, c-format msgid "%zu-byte string starting at offset %zu exceeds record length %zu." msgstr "" "%zu-δίφυα συμβολοσειράς ξεκινόντας από %zu υπερβαίνει το μήκος εγγραφής %zu." #: src/data/sys-file-reader.c:3185 #, c-format msgid "Expecting space at offset %zu following %zu-byte string." msgstr "Αναμενόταν διάστημα στο %zu με ακολουθία από %zu-δίφυα συμβολοσειράς." #: src/data/sys-file-reader.c:3476 #, c-format msgid "Wrong ZLIB data header offset %#llx (expected %#llx)." msgstr "Λάθος ZLIB δεδομένα επικεφαλίδας στο %#llx (αναμενόταν %#llx)." #: src/data/sys-file-reader.c:3484 #, c-format msgid "Impossible ZLIB trailer offset 0x%llx." msgstr "Μη δυνατόν κομμάτι ZLIB που ξεκινά στο 0x%llx." #: src/data/sys-file-reader.c:3491 #, c-format msgid "Invalid ZLIB trailer length %lld." msgstr "Μη έγκυρο μήκος κομματιού ΖLIB που ξεκινά στο %lld." #: src/data/sys-file-reader.c:3555 #, c-format msgid "End of ZLIB trailer (0x%llx) is not file size (0x%llx)." msgstr "" "Τέλος του κομματιού ΖLIB (0x%llx) που δεν είναι μέγεθος αρχείου (0x%llx)." #: src/data/sys-file-reader.c:3565 #, c-format msgid "ZLIB trailer bias (%lld) differs from file header bias (%.2f)." msgstr "" "H τιμή του ZLIB κομματιού (%lld) διαφέρει από αυτό της επικεφαλίδας του " "αρχείου (%.2f)." #: src/data/sys-file-reader.c:3575 #, c-format msgid "ZLIB trailer \"zero\" field has nonzero value %lld." msgstr "Το πεδίο του κομματιού ZLIB \"μηδέν\" έχει μη μηδενική τιμή %lld." #: src/data/sys-file-reader.c:3581 #, c-format msgid "ZLIB trailer specifies unexpected %u-byte block size." msgstr "Το κομμάτι του ZLIB ορίζει μη αναμενόμενο %u-δίφυα μέγεθος συμπλόκου." #: src/data/sys-file-reader.c:3589 #, c-format msgid "%lld-byte ZLIB trailer specifies %u data blocks (expected %lld)." msgstr "" "%lld-δίφυα του κομματιού του ZLIB ορίζει %u σύμπλοκα δεδομένων (αναμενόταν " "%lld)." #: src/data/sys-file-reader.c:3614 #, c-format msgid "" "ZLIB block descriptor %u reported uncompressed data offset %#llx, when %#llx " "was expected." msgstr "" "Ο περιγραφέας του συμπλόκου ZLIB %u ανέφερε ότι τα ασυμπίεστα δεδομένα " "ξεκινούν στο %#llx, όταν %#llx αναμενόταν." #: src/data/sys-file-reader.c:3623 #, c-format msgid "" "ZLIB block descriptor %u reported compressed data offset %#llx, when %#llx " "was expected." msgstr "" "Ο περιγραφέας του συμπλόκου ZLIB %u ανέφερε ότι τα συμπιεσμένα δεδομένα " "ξεκινούν στο %#llx, όταν %#llx αναμενόταν." #: src/data/sys-file-reader.c:3633 #, c-format msgid "" "ZLIB block descriptor %u reported block size %#x, when %#x was expected." msgstr "" "Ο περιγραφέας του συμπλόκου ZLIB %u ανέφερε μέγεθος συμπλόκου %#x, όταν %#x " "αναμενόταν." #: src/data/sys-file-reader.c:3641 #, c-format msgid "" "ZLIB block descriptor %u reported block size %#x, when at most %#x was " "expected." msgstr "" "Ο περιγραφέας του συμπλόκου ZLIB %u ανέφερε μέγεθος συμπλόκου %#x, όταν " "μέγιστα %#x αναμενόταν." #: src/data/sys-file-reader.c:3653 #, c-format msgid "" "ZLIB block descriptor %u reports compressed size %u and uncompressed size %u." msgstr "" "Ο περιγραφέας του συμπλόκου ZLIB %u αναφέρει συμπιεσμένο μέγεθος %u και " "ασυμπίεστο μέγεθος %u." #: src/data/sys-file-reader.c:3665 #, c-format msgid "" "ZLIB trailer is at offset %#llx but %#llx would be expected from block " "descriptors." msgstr "" "Το κομμάτι του ZLIB ξεκινά στο %#llx αλλά %#llx αναμενόταν από τους " "περιγραφείς συμπλόκων." #: src/data/sys-file-reader.c:3684 #, c-format msgid "ZLIB initialization failed (%s)." msgstr "Η έναρξη του ZLIB απέτυχε (%s)." #: src/data/sys-file-reader.c:3699 #, c-format msgid "Inconsistency at end of ZLIB stream (%s)." msgstr "Ασυνέπεια στο τέλος του ZLIB (%s)." #: src/data/sys-file-reader.c:3758 #, c-format msgid "ZLIB stream inconsistency (%s)." msgstr "ZLIB ασυνέπεια (%s)." #: src/data/sys-file-reader.c:3782 msgid "Unexpected end of ZLIB compressed data." msgstr "Μη αναμενόμενο τέλος των συμπιεσμένων δεδομένων του ZLIB." #: src/data/sys-file-reader.c:3820 msgid "SPSS System File" msgstr "Αρχείο συστήματος SPSS" #: src/data/sys-file-writer.c:210 #, c-format msgid "Unknown system file version %d. Treating as version %d." msgstr "Άγνωστη έκδοση αρχείου συστήαμτος %d. Χρήση σαν έκδοση %d." #: src/data/sys-file-writer.c:256 #, c-format msgid "Error opening `%s' for writing as a system file: %s." msgstr "Σφάλμα ανοίγματος `%s' προς εγγραφή σαν αρχείο συστήματος: %s." #: src/data/sys-file-writer.c:1271 #, c-format msgid "An I/O error occurred writing system file `%s'." msgstr "Ένα σφάλμα I/O συνέβηστην εγγραφή αρχείου συστήματος `%s'." #: src/data/sys-file-writer.c:1378 #, c-format msgid "Failed to initialize ZLIB for compression (%s)." msgstr "Αποτυχία έναρξης του ZLIB για συμπίεση (%s)." #: src/data/sys-file-writer.c:1407 #, c-format msgid "Failed to complete ZLIB stream compression (%s)." msgstr "Αποτυχία ολοκλήρωσης ZLIB συμπίεσης (%s)." #: src/data/sys-file-writer.c:1449 #, c-format msgid "ZLIB stream compression failed (%s)." msgstr "ZLIB συμπίεση απέτυχε (%s)." #: src/data/sys-file-writer.c:1491 #, c-format msgid "%s: Seek failed (%s)." msgstr "%s: Η αναζήτηση απέτυχε (%s)." #: src/data/variable.c:58 msgid "Left" msgstr "Αριστερά" #: src/data/variable.c:59 msgid "Right" msgstr "Δεξιά" #: src/data/variable.c:60 msgid "Center" msgstr "Κέντρο" #: src/data/variable.c:66 msgid "Nominal" msgstr "Ονομαστική" #: src/data/variable.c:67 msgid "Ordinal" msgstr "Τακτική" #: src/data/variable.c:68 src/language/stats/ks-one-sample.c:300 msgid "Scale" msgstr "Κλίμακα" #: src/data/variable.c:74 msgid "Input" msgstr "Εισαγωγή" #. TRANSLATORS: This will be part of a filename. Please avoid whitespace. #: src/data/variable.c:75 src/output/spv/spv-writer.c:213 #: src/ui/gui/psppire-output-window.c:547 msgid "Output" msgstr "Εξαγωγή" #: src/data/variable.c:76 msgid "Both" msgstr "Κ τα δύο" #: src/data/variable.c:77 src/language/dictionary/sys-file-info.c:237 #: src/ui/gui/psppire-dialog-action-crosstabs.c:86 #: src/ui/gui/psppire-dialog-action-crosstabs.c:98 #: src/ui/gui/psppire-dialog-action-crosstabs.c:133 #: src/ui/gui/psppire-dialog-action-crosstabs.c:141 #: src/ui/gui/psppire-variable-sheet.c:408 src/ui/gui/var-display.c:34 msgid "None" msgstr "Κανένα" #: src/data/variable.c:78 msgid "Partition" msgstr "Διαχώρισμα" #: src/data/variable.c:79 src/ui/gui/reliability.ui:37 msgid "Split" msgstr "Ημίσεα" #: src/data/variable.c:729 #, c-format msgid "%s (%s)" msgstr "%s (%s)" #: src/data/variable.c:1339 msgid "" "At least one case in the data file had a weight value that was user-missing, " "system-missing, zero, or negative. These case(s) were ignored." msgstr "" "Τουλάχιστον μία υπόθεση στο αρχείο δεδομένων είχε τιμή Βάρους που ήταν " "ελλειπούσα-χρήστη, ελλειπούσα-συστήματος, μηδέν, ή αρνητική. Αυτές οι " "υποθέσεις αγνοήθηκαν." #: src/language/command.c:207 src/language/stats/graph.c:749 #: src/language/stats/graph.c:755 src/language/stats/graph.c:789 #: src/language/stats/graph.c:794 src/language/stats/graph.c:799 #: src/language/stats/graph.c:852 src/language/stats/graph.c:857 #: src/language/stats/graph.c:862 src/language/stats/graph.c:867 #: src/language/stats/graph.c:872 src/language/stats/graph.c:877 #: src/language/stats/graph.c:882 src/language/utilities/set.q:236 #, c-format msgid "%s is not yet implemented." msgstr "%s δεν είναι διαθέσιμο ακόμη." #: src/language/command.c:212 #, c-format msgid "%s may be used only in testing mode." msgstr "%s μπορεί να χρησιμοποιηθεί μόνο σε λειτουργία δοκιμής." #: src/language/command.c:217 #, c-format msgid "%s may be used only in enhanced syntax mode." msgstr "%s μπορεί να χρησιμοποιηθεί μόνο στη πλήρη λειτουργία της σύνταξης." #: src/language/command.c:345 msgid "expecting command name" msgstr "αναμένει όνομα εντολής" #: src/language/command.c:347 #, c-format msgid "Unknown command `%s'." msgstr "Άγνωστη εντολή `%s'." #: src/language/command.c:380 #, c-format msgid "%s is allowed only before the active dataset has been defined." msgstr "%s επιτρέπεται μόνο πριν τον καθορισμό της ενεργής βάσης δεδομένων." #: src/language/command.c:384 #, c-format msgid "%s is allowed only after the active dataset has been defined." msgstr "%s επιτρέπεται μόνο μετά το καθορισμό της ενεργής βάσης δεδομένων." #: src/language/command.c:388 src/language/command.c:392 #, c-format msgid "%s is allowed only inside %s." msgstr "%s επιτρέπεται μόνο μέσα στο %s." #: src/language/command.c:399 src/language/command.c:403 #, c-format msgid "" "%s is allowed only before the active dataset has been defined or inside %s." msgstr "" "%s επιτρέπεται μόνο πριν τον καθορισμό της ενεργής βάσης δεδομένων ή μέσα " "στο %s." #: src/language/command.c:407 src/language/command.c:411 #, c-format msgid "" "%s is allowed only after the active dataset has been defined or inside %s." msgstr "" "%s επιτρέπεται μόνο μετά τον καθορισμό της ενεργής βάσης δεδομένων ή μέσα " "στο %s." #: src/language/command.c:415 #, c-format msgid "%s is allowed only inside %s or inside %s." msgstr "%s επιτρέπεται μόνο μέσα στο %s ή στο %s." #: src/language/command.c:421 #, c-format msgid "" "%s is allowed only after the active dataset has been defined, inside INPUT " "PROGRAM, or inside FILE TYPE." msgstr "" "%s επιτρέπεται μόνο μετά τον καθορισμό της ενεργής βάσης δεδομένων, μέσα στο " "INPUT PROGRAM, ή μέσα στο FILE TYPE." #: src/language/command.c:426 #, c-format msgid "" "%s is allowed only before the active dataset has been defined, inside INPUT " "PROGRAM, or inside FILE TYPE." msgstr "" "%s επιτρέπεται μόνο πριν τον καθορισμό της ενεργής βάσης δεδομένων, μέσα στο " "INPUT PROGRAM, ή μέσα στο FILE TYPE." #: src/language/command.c:444 src/language/command.c:447 #, c-format msgid "%s is not allowed inside %s." msgstr "%s δεν επιτρέπεται μέσα στο %s." #: src/language/command.c:529 src/language/utilities/host.c:272 #: src/language/utilities/permissions.c:105 #, c-format msgid "This command not allowed when the %s option is set." msgstr "Αυτή η εντολή δεν επιτρέπεται όταν η επιλογή %s έχει καθοριστεί." #: src/language/command.c:545 #, c-format msgid "Error removing `%s': %s." msgstr "Σφάλμα αφαίρεσης `%s': %s." #: src/language/lexer/lexer.c:296 #, c-format msgid "expecting %s" msgstr "αναμένει %s" #: src/language/lexer/lexer.c:300 #, c-format msgid "expecting %s or %s" msgstr "αναμένει %s ή %s" #: src/language/lexer/lexer.c:304 #, c-format msgid "expecting %s, %s, or %s" msgstr "αναμένει %s, %s, ή %s" #: src/language/lexer/lexer.c:309 #, c-format msgid "expecting %s, %s, %s, or %s" msgstr "αναμένει %s, %s, %s, ή %s" #: src/language/lexer/lexer.c:314 #, c-format msgid "expecting %s, %s, %s, %s, or %s" msgstr "αναμένει %s, %s, %s, %s, ή %s" #: src/language/lexer/lexer.c:319 #, c-format msgid "expecting %s, %s, %s, %s, %s, or %s" msgstr "αναμένει %s, %s, %s, %s, %s, ή %s" #: src/language/lexer/lexer.c:325 #, c-format msgid "expecting %s, %s, %s, %s, %s, %s, or %s" msgstr "αναμένει %s, %s, %s, %s, %s, %s, ή %s" #: src/language/lexer/lexer.c:331 #, c-format msgid "expecting %s, %s, %s, %s, %s, %s, %s, or %s" msgstr "αναμένει %s, %s, %s, %s, %s, %s, %s, ή %s" #: src/language/lexer/lexer.c:351 #, c-format msgid "Subcommand %s may only be specified once." msgstr "Η υποεντολή %s μπορεί να καθοριστεί μόνο μία φορά." #: src/language/lexer/lexer.c:363 #, c-format msgid "Required subcommand %s was not specified." msgstr "Η αναγκαία υποεντολή %s δεν έχει καθοριστεί." #: src/language/lexer/lexer.c:371 #, c-format msgid "%s may only be specified once within subcommand %s" msgstr "%s μπορεί να καθοριστεί μόνο μία φορά μέσα στην υποεντολή %s" #: src/language/lexer/lexer.c:380 #, c-format msgid "Required %s specification missing from %s subcommand" msgstr "Ο αναγκαίος %s προσδιορισμός λείπει από την υποεντολή %s" #: src/language/lexer/lexer.c:399 msgid "Syntax error at end of input" msgstr "Συντακτικό σφάλμα στο τέλος της εισαγωγής" #: src/language/lexer/lexer.c:420 src/language/xforms/select-if.c:60 #: src/language/stats/autorecode.c:206 src/language/stats/npar.c:503 #: src/language/data-io/print-space.c:83 msgid "expecting end of command" msgstr "αναμένει τέλος της εντολής" #: src/language/lexer/lexer.c:631 msgid "expecting string" msgstr "αναμένει συμβολοσειρά" #: src/language/lexer/lexer.c:660 msgid "expecting integer" msgstr "αναμένει ακέραιο" #: src/language/lexer/lexer.c:673 msgid "expecting number" msgstr "αναμένει αριθμό" #: src/language/lexer/lexer.c:685 msgid "expecting identifier" msgstr "αναμένει αναγνωριστήρα" #: src/language/lexer/lexer.c:1272 msgid "Syntax error at end of command" msgstr "Συντακτικό σφάλμα στο τέλης της εντολής" #: src/language/lexer/lexer.c:1281 #, c-format msgid "Syntax error at `%s'" msgstr "Συντακτικό σφάλμα στο `%s'" #: src/language/lexer/lexer.c:1284 msgid "Syntax error" msgstr "Συντακτικό σφάλμα" #: src/language/lexer/lexer.c:1470 #, c-format msgid "String of hex digits has %d characters, which is not a multiple of 2" msgstr "" "Η συμβολοσειρά των Δεκαεξαδικών ψηφίων έχει %d χαρακτήρες, που δεν είανι " "πολλαπλάσια του 2" #: src/language/lexer/lexer.c:1477 #, c-format msgid "`%c' is not a valid hex digit" msgstr "`%c' δεν είναι ένα έγκυρο Δεκαεξαδικό ψηφίο" #: src/language/lexer/lexer.c:1482 #, c-format msgid "" "Unicode string contains %d bytes, which is not in the valid range of 1 to 8 " "bytes" msgstr "" "Η Unicode συμβολοσειρά περιέχει %d διφύα, που δεν είναι στο έγκυρο εύρος του " "1 ως 8 διφύων" #: src/language/lexer/lexer.c:1488 #, c-format msgid "U+%04X is not a valid Unicode code point" msgstr "U+%04X δεν είναι έγκυρη κωδικοποίηση Unicode σημείου" #: src/language/lexer/lexer.c:1493 msgid "Unterminated string constant" msgstr "Ατερμάτιστη σταθερά συμβολοσειράς" #: src/language/lexer/lexer.c:1497 #, c-format msgid "Missing exponent following `%s'" msgstr "Λείπει ο εκθέτης έπειτα του `%s'" #: src/language/lexer/lexer.c:1502 msgid "Unexpected `.' in middle of command" msgstr "Μη αναμενόμενη `.' ενδιάμεσα της εντολής" #: src/language/lexer/lexer.c:1508 #, c-format msgid "Bad character %s in input" msgstr "Λάθος χαρακτήρας %s στην εισαγωγή" #: src/language/lexer/lexer.c:1603 #, c-format msgid "Opening `%s': %s." msgstr "Άνοιγμα του `%s': %s." #: src/language/lexer/lexer.c:1647 #, c-format msgid "Error closing `%s': %s." msgstr "Σφάλμα κλεισίματος `%s': %s." #: src/language/lexer/subcommand-list.c:118 #, c-format msgid "No more than %d %s subcommands allowed." msgstr "Όχι περισσότερες από %d %s υποεντολές επιτρέπονται." #: src/language/lexer/format-parser.c:77 msgid "expecting valid format specifier" msgstr "αναμένει έγκυρο μορφότυπο" #: src/language/lexer/format-parser.c:116 #: src/language/lexer/format-parser.c:143 src/language/utilities/output.c:108 #: src/language/data-io/data-list.c:453 src/language/data-io/get-data.c:638 #: src/language/data-io/placement-parser.c:236 #, c-format msgid "Unknown format type `%s'." msgstr "Άγνωστος τύπος μορφοτύπου `%s'." #: src/language/lexer/format-parser.c:122 #, c-format msgid "Format specifier `%s' lacks required width." msgstr "Ο μορφότυπος `%s' στερείται το απαιτούμενο εύρος." #: src/language/lexer/format-parser.c:138 msgid "expecting format type" msgstr "αναμένει μορφότυπο" #: src/language/lexer/value-parser.c:66 #, c-format msgid "" "The high end of the range (%.*g) is below the low end (%.*g). The range " "will be treated as if reversed." msgstr "" "Το υψηλό όριο του εύρους (%.*g) είναι κάτω από το χαμηλό όριο (%.*g). Οι " "τιμές αυτές θα χρησιμοποιηθούν σαν να ήταν αντίστροφες." #: src/language/lexer/value-parser.c:74 #, c-format msgid "Ends of range are equal (%.*g)." msgstr "Τα άκρα του εύρους είναι ίσα (%.*g)." #: src/language/lexer/value-parser.c:82 #, c-format msgid "%s or %s must be part of a range." msgstr "%s ή %s πρέπει να είναι μέρος του εύρους." #: src/language/lexer/value-parser.c:112 msgid "System-missing value is not valid here." msgstr "Η ελλειπούσ-συστήματος τιμή δεν είναι έγκυρη εδώ." #: src/language/lexer/variable-parser.c:86 utilities/pspp-convert.c:83 msgid "expecting variable name" msgstr "αναμένει όνομα μεταβλητής" #: src/language/lexer/variable-parser.c:96 #, c-format msgid "%s is not a variable name." msgstr "%s δεν είναι όνομα μεταβλητής." #: src/language/lexer/variable-parser.c:206 #, c-format msgid "" "%s is not a numeric variable. It will not be included in the variable list." msgstr "" "%s δεν είναι αριθμητική μεταβλητή. Δεν θα συμπεριληφθεί στη λίστα μεταβλητών." #: src/language/lexer/variable-parser.c:209 #, c-format msgid "" "%s is not a string variable. It will not be included in the variable list." msgstr "" "%s δεν είναι μία μεταβλητή συμβολοσειράς. Δεν θα συμπεριληφθεί στη λίστα " "μεταβλητών." #: src/language/lexer/variable-parser.c:213 #, c-format msgid "Scratch variables (such as %s) are not allowed here." msgstr "Πρόχειρες μεταβλητές (όπως η %s) δεν επιτρέπονται εδώ." #: src/language/lexer/variable-parser.c:217 #, c-format msgid "" "%s and %s are not the same type. All variables in this variable list must " "be of the same type. %s will be omitted from the list." msgstr "" "%s και %s δεν είναι ίδιου τύπου. Όλες οι μεταβλητές στην λίστα αυτή πρέπει " "να είναι ίδιου τύπου. %s θα παραλειφθεί από την λίστα." #: src/language/lexer/variable-parser.c:223 #, c-format msgid "" "%s and %s are string variables with different widths. All variables in this " "variable list must have the same width. %s will be omitted from the list." msgstr "" "%s και %s είναι μεταβλητές συμβολοσειράς με διαφορετικό εύρος. Όλες οι " "μεταβλητές στην λίστα αυτή πρέπει να έχουν το ίδιο εύρος. %s θα παραλειφθεί " "από την λίστα." #: src/language/lexer/variable-parser.c:228 #: src/language/lexer/variable-parser.c:447 #, c-format msgid "Variable %s appears twice in variable list." msgstr "Η μεταβλητή %s εμφανίζεται δύο φορές στη λίστα μεταβλητών." #: src/language/lexer/variable-parser.c:341 #, c-format msgid "%s TO %s is not valid syntax since %s precedes %s in the dictionary." msgstr "" "%s TO %s δεν είναι έγκυρη σύνταξη αφού %s προηγείται του %s στην λίστα." #: src/language/lexer/variable-parser.c:349 #, c-format msgid "" "When using the TO keyword to specify several variables, both variables must " "be from the same variable dictionaries, of either ordinary, scratch, or " "system variables. %s is a %s variable, whereas %s is %s." msgstr "" "Όταν βάζετε τη λέξη TO για να καθορίσεται πολλές μεταβλητές, και οι δύο " "πρέπει να είναι από το ίδιο λεξικό μεταβλητών, από το κάθε λεξικό, " "πρόχειρες, ή μεταβλητές συστήματος. %s είναι μία %s μεταβλητή, όπου %s είναι " "%s." #: src/language/lexer/variable-parser.c:424 #, c-format msgid "`%s' cannot be used with TO because it does not end in a digit." msgstr "" "`%s' δεν μπορεί να χρησιμοποιηθεί με το TO επειδή δεν τελειώνει σε ψηφίο." #: src/language/lexer/variable-parser.c:432 #, c-format msgid "Numeric suffix on `%s' is larger than supported with TO." msgstr "" "Αριθμητική κατάληξη στο `%s' είναι μεγαλύτερη από την υποστηριζόμενη στο TO." #: src/language/lexer/variable-parser.c:505 msgid "Scratch variables not allowed here." msgstr "Πρόχειρες μεταβλητές δεν επιτρέπονται εδώ." #: src/language/lexer/variable-parser.c:529 msgid "Prefixes don't match in use of TO convention." msgstr "Προθέματα δεν ταιριάζουν με τη συμβατική χρήση του TO." #: src/language/lexer/variable-parser.c:534 msgid "Bad bounds in use of TO convention." msgstr "Λάθος όρια με τη συμβατική χρήση του TO." #: src/language/xforms/compute.c:150 src/language/xforms/compute.c:205 #, c-format msgid "" "When executing COMPUTE: SYSMIS is not a valid value as an index into vector " "%s." msgstr "" "Όταν εκτελείτε COMPUTE: SYSMIS δεν είναι μία έγκυρη τιμή καταχωρητή " "διανύσματος %s." #: src/language/xforms/compute.c:154 src/language/xforms/compute.c:212 #, c-format msgid "" "When executing COMPUTE: %.*g is not a valid value as an index into vector %s." msgstr "" "Όταν εκτελείτε COMPUTE: %.*g δεν είναι μία έγκυρη τιμή καταχωρητή " "διανύσματος %s." #: src/language/xforms/compute.c:356 #, c-format msgid "There is no vector named %s." msgstr "Δεν υπάρχει όνομα διανύσματος %s." #: src/language/xforms/count.c:125 msgid "Destination cannot be a string variable." msgstr "Ο προορισμός δεν μπορεί να είναι μία μεταβλητή συμβολοσειράς." #: src/language/xforms/sample.c:76 msgid "The sampling factor must be between 0 and 1 exclusive." msgstr "Ο δειγματικός παράγοντας πρέπει να είναι μεταξύ 0 και 1 αποκλειστικά." #: src/language/xforms/sample.c:96 #, c-format msgid "Cannot sample %d observations from a population of %d." msgstr "Δεν μπορεί να δειγματίσει %d παρατηρήσεις από τον πληθυσμό των %d." #: src/language/xforms/recode.c:261 msgid "" "Inconsistent target variable types. Target variables must be all numeric or " "all string." msgstr "" "Ασυνεπής τύπος επιλεγμένων μεταβλητών. Οι επιλεγμένες μεταβλητές πρέπει να " "είναι όλες αριθμητικές ή όλες συμβολοσειρας." #: src/language/xforms/recode.c:282 msgid "CONVERT requires string input values and numeric output values." msgstr "" "CONVERT απαιτεί στην εισαγωγή τιμών συμβολοσειράς και στην εξαγωγή " "αριθμητικές τιμές." #: src/language/xforms/recode.c:339 #, c-format msgid "%s is not allowed with string variables." msgstr "%s δεν επιτρέπεται με μεταβλητές συμβολοσειράς." #: src/language/xforms/recode.c:422 msgid "expecting output value" msgstr "αναμένει τιμή εξαγωγής" #: src/language/xforms/recode.c:479 #, c-format msgid "" "%zu variable(s) cannot be recoded into %zu variable(s). Specify the same " "number of variables as source and target variables." msgstr "" "%zu μεταβλητή(ες) δεν μπορεί(ουν) να κωδικοποιηθούν σε %zu μεταβλητή(ες). " "Καθόρισε το ίδιο αριθμό μεταβλητών τόσο σαν αρχικές όσο και σαν τελικές " "μεταβλητές." #: src/language/xforms/recode.c:494 #, c-format msgid "" "There is no variable named %s. (All string variables specified on INTO must " "already exist. Use the STRING command to create a string variable.)" msgstr "" "Δεν υπάρχει μεταβλητή που να ονομάζεται %s. (Όλες οι μεταβλητές " "συμβολοσειράς που ορίστηκαν στο INTO πρέπει να υπαρχουν ήδη. Κάνε χρήση της " "εντολής STRING για τη δημιουργία μιας μεταβλητής συμβολοσειράς.)" #: src/language/xforms/recode.c:510 #, c-format msgid "INTO is required with %s input values and %s output values." msgstr "INTO απαιτείται με %s εισαγωγή τιμών και %s με εξαγωγή τιμών." #: src/language/xforms/recode.c:523 #, c-format msgid "Type mismatch. Cannot store %s data in %s variable %s." msgstr "" "Αναντιστοιχία τύπου. Δεν μπορεί να εναποθηκεύσει %s δεδομένα στην %s " "μεταβλητή %s." #: src/language/xforms/recode.c:566 #, c-format msgid "" "Cannot recode because the variable %s would require a width of %d bytes or " "greater, but it has a width of only %d bytes." msgstr "" "Δεν μπορεί να κωδικοποιήσει επειδή η μεταβλητή %s θα απαιτούσε ένα εύρος %d " "διφύων ή μεγαλύτερο, αλλά έχει εύρος μόνο %d διφύα." #: src/language/xforms/select-if.c:100 msgid "Syntax error expecting OFF or BY. Turning off case filtering." msgstr "" "Συντακτικό σφάλμα αναμένει OFF ή BY. Το φιλτράρισμα υποθέσεων " "απενεργοποιείται." #: src/language/xforms/select-if.c:115 msgid "The filter variable must be numeric." msgstr "Η μεταβλητή φίλτρου πρέπει να είναι αριθμητική." #: src/language/xforms/select-if.c:121 msgid "The filter variable may not be scratch." msgstr "Η μεταβλητή φίλτρου δεν μπορεί να είναι πρόχειρη μεταβλητή." #: src/language/control/control-stack.c:49 #, c-format msgid "%s without %s." msgstr "%s χωρίς %s." #: src/language/control/control-stack.c:77 #, c-format msgid "This command must appear inside %s...%s, without intermediate %s...%s." msgstr "" "Αυτή η εντολή πρέπει να εμφανίζεται μέσα στο %s...%s, χωρίς ενδιάμεσο %s..." "%s." #: src/language/control/control-stack.c:94 #, c-format msgid "This command cannot appear outside %s...%s." msgstr "Αυτή η εντολή δεν μπορεί να εμφανίζεται έξω από %s...%s." #: src/language/control/do-if.c:180 #, c-format msgid "This command may not follow %s in %s ... %s." msgstr "Αυτή η εντολή δεν μπορεί να ακολουθεί %s στο %s ... %s." #: src/language/control/loop.c:211 msgid "Only one index clause may be specified." msgstr "Μόνό μία ρήτρα καταχωρητή μπορεί να οριστεί." #: src/language/control/repeat.c:120 #, c-format msgid "Dummy variable name `%s' hides dictionary variable `%s'." msgstr "Το όνομα της ψευδομεταβλητής `%s' αποκρύπτει τη μεταβλητή λίστας `%s'." #: src/language/control/repeat.c:126 #, c-format msgid "Dummy variable name `%s' is given twice." msgstr "Το όνομα της ψευδομεταβλητής `%s' δίδεται δύο φορές." #: src/language/control/repeat.c:170 #, c-format msgid "" "Dummy variable `%s' had %zu substitutions, so `%s' must also, but %zu were " "specified." msgstr "" "Η ψευδομεταβλητή `%s' είχε %zu αντικαταστάσεις, έτσι `%s' πρέπει επίσης να " "έχει, αλλά %zu ορίστηκαν." #: src/language/control/repeat.c:379 msgid "Ranges may only have integer bounds." msgstr "Τα εύρη μπορεί να έχουν μόνο ακέραια όρια." #: src/language/control/repeat.c:393 #, c-format msgid "%ld TO %ld is an invalid range." msgstr "%ld TO %ld είναι ένα μη έγκυρο εύρος." #: src/language/control/repeat.c:443 #, c-format msgid "No matching %s." msgstr "Μη ταίριασμα %s." #: src/language/control/temporary.c:44 msgid "" "This command may only appear once between procedures and procedure-like " "commands." msgstr "" "Αυτή η εντολή μπορεί να εμφανίζεται μόνο μία φορά μεταξύ διαδικασιών και " "παρόμοιων εντολών." #: src/language/dictionary/attributes.c:104 msgid "Attribute array index must be between 1 and 65535." msgstr "" "Ο καταχωρητής του Χαρακτηριστικού Σειράς πρέπει να είναι μεταξύ 1 και 65535." #: src/language/dictionary/apply-dictionary.c:74 #, c-format msgid "Variable %s is %s in target file, but %s in source file." msgstr "" "Η μεταβλητή %s είναι %s στο επιλεγμένο αρχείο, αλλά όχι %s στο αρχικό αρχείο." #: src/language/dictionary/apply-dictionary.c:110 msgid "No matching variables found between the source and target files." msgstr "Μη ταιριαστές μεταβλητές βρέθηκαν μεταξύ αρχικού και τελικού αρχείου." #: src/language/dictionary/delete-variables.c:40 #: src/language/dictionary/modify-variables.c:79 #: src/language/dictionary/rename-variables.c:51 #, c-format msgid "" "%s may not be used after %s. Temporary transformations will be made " "permanent." msgstr "" "%s δεν μπορεί να χρησιμοποιηθεί μετά το %s. Πρόχειρες μετατροπές θα γίνουν " "μόνιμες." #: src/language/dictionary/delete-variables.c:48 #: src/language/dictionary/modify-variables.c:312 #, c-format msgid "" "%s may not be used to delete all variables from the active dataset " "dictionary. Use %s instead." msgstr "" "%s δεν μπορεί να χρησιμοποιηθεί για να διαγράψει όλες τις μεταβλητές από την " "ενεργή λίστα δεδομένων. Χρησιμοποίησε αυτό %s καλύτερα." #: src/language/dictionary/missing-values.c:70 #, c-format msgid "" "Cannot mix numeric variables (e.g. %s) and string variables (e.g. %s) within " "a single list." msgstr "" "Δεν μπορεί να γίνει μίξη αριθμητικών (π.χ. %s) και συμβολοσειράς μεταβλητών " "(π.χ. %s) μέσα σε μία λίστα." #: src/language/dictionary/missing-values.c:91 msgid "" "Too many numeric missing values. At most three individual values or one " "value and one range are allowed." msgstr "" "Πολλές αριθμητικές Ελλειπούσες τιμές. Το μέγιστο, τρεις ατομικές τιμές, ή " "μία τιμή, ή ένα εύρος τιμών επιτρέπεται." #: src/language/dictionary/missing-values.c:126 #, c-format msgid "Truncating missing value to maximum acceptable length (%d bytes)." msgstr "Περικοπή ελλειπούσες τιμές ως το μέγιστο αποδεκτό μήκος (%d διφύα)." #: src/language/dictionary/missing-values.c:137 msgid "" "Too many string missing values. At most three individual values are allowed." msgstr "" "Πολλές συμβολοσειρές είναι ελλειπούσες τιμές. Το πολύ τρεις ατομικές τιμές " "επιτρέπονται." #: src/language/dictionary/missing-values.c:154 #, c-format msgid "Missing values provided are too long to assign to variable of width %d." msgstr "" "Οι δοθέντες ελλειπούσες τιμές είναι αρκετές ώστε να απονεμηθούν σε μεταβλητή " "εύρους %d." #: src/language/dictionary/modify-variables.c:145 msgid "Cannot specify ALL after specifying a set of variables." msgstr "Δεν μπορεί να οριστεί ALL μετά τον ορισμό ενός σετ μεταβλητών." #: src/language/dictionary/modify-variables.c:221 #: src/language/dictionary/rename-variables.c:76 #, c-format msgid "" "Differing number of variables in old name list (%zu) and in new name list " "(%zu)." msgstr "" "Διαφορετικός αριθμο μεταβλητω στη παλιά ονοματική λίστα (%zu) και στη νέα " "ονοματική λίστα (%zu)." #: src/language/dictionary/modify-variables.c:244 #: src/language/dictionary/modify-variables.c:294 #, c-format msgid "" "%s subcommand may be given at most once. It may not be given in conjunction " "with the %s subcommand." msgstr "" "%s υποεντιλή πρέπει να δωθεί τουλάχιστον μία φορά. Δεν μπορεί να δοθεί σε " "συνδυασμό με την %s υποεντολή." #: src/language/dictionary/modify-variables.c:331 #, c-format msgid "Unrecognized subcommand name `%s'." msgstr "Μη αναγνωρίσιμο όνομα υποεντολής `%s'." #: src/language/dictionary/modify-variables.c:334 msgid "Subcommand name expected." msgstr "Όνομα υποεντολής αναμενόταν." #: src/language/dictionary/mrsets.c:117 #, c-format msgid "" "VARIABLES specified only variable %s on %s, but at least two variables are " "required." msgstr "" "VARIABLES όρισε μόνο μία μεταβλητή %s στο %s, αλλά τουλάχιστον δύο " "μεταβλητές απαιτούνται." #: src/language/dictionary/mrsets.c:150 msgid "Numeric VALUE must be an integer." msgstr "Η Αριθμητική τιμή της VALUE πρέπει να είναι ακέραιος." #: src/language/dictionary/mrsets.c:230 src/language/dictionary/mrsets.c:268 #, c-format msgid "" "MDGROUP subcommand for group %s specifies a string VALUE, but the variables " "specified for this group are numeric." msgstr "" "MDGROUP υποεντολή για την ομάδα %s ορίζει μία συμβολοσειρά με τιμή VALUE, " "αλλά οι μεταβλητές που ορίστηκαν για αυτή την ομάδα είναι αριθμητικές." #: src/language/dictionary/mrsets.c:254 #, c-format msgid "" "VALUE string on MDGROUP subcommand for group %s is %d bytes long, but it " "must be no longer than the narrowest variable in the group, which is %s with " "a width of %d bytes." msgstr "" "Η τιμή VALUE της συμβολοσειράς στην MDGROUP υποεντολή για την ομάδα %s είναι " "%d διφύα μήκους, αλλά δεν πρέπει να είναι μακρύτερη από τη κοντινότερη " "μεταβλητή της ομάδας, η οποία είναι %s με εύρος %d διφύων." #: src/language/dictionary/mrsets.c:280 #, c-format msgid "" "MDGROUP subcommand for group %s specifies LABELSOURCE=VARLABEL but not " "CATEGORYLABELS=COUNTEDVALUES. Ignoring LABELSOURCE." msgstr "" "MDGROUP υποεντολή για την ομάδα %s ορίζει LABELSOURCE=VARLABEL αλλά όχι το " "CATEGORYLABELS=COUNTEDVALUES. Αγνόηση της LABELSOURCE." #: src/language/dictionary/mrsets.c:286 #, c-format msgid "" "MDGROUP subcommand for group %s specifies both LABEL and LABELSOURCE, but " "only one of these subcommands may be used at a time. Ignoring LABELSOURCE." msgstr "" "MDGROUP υποεντολή για την ομάδα %s ορίζει και τις δύο, τη LABEL και τη " "LABELSOURCE, αλλά μόνο μία από αυτές μπορεί να χρησιμοποιηθεί σε οποιαδήποτε " "στιγμή. Αγνόηση της LABELSOURCE." #: src/language/dictionary/mrsets.c:326 #, c-format msgid "" "Variables %s and %s specified as part of multiple dichotomy group %s have " "the same variable label. Categories represented by these variables will not " "be distinguishable in output." msgstr "" "Οι μεταβλητές %s και %s που ορίστηκαν σαν μέρος πολλαπλής διχοτόμησης ομάδας " "%s που έχουν την ίδια ετικέτα μεταβλητής. Οι κατηγορίες που αναπαρίστανται " "από αυτές τις μεταβλητές δεν θα είναι διακριτές στην οθόνη εξαγωγής." #: src/language/dictionary/mrsets.c:356 #, c-format msgid "" "Variable %s specified as part of multiple dichotomy group %s (which has " "CATEGORYLABELS=COUNTEDVALUES) has no value label for its counted value. " "This category will not be distinguishable in output." msgstr "" "Η μεταβλητή %s που ορίστηκε σαν μέρος πολλαπλής διχοτόμησης ομάδας %s (η " "οποία έχει CATEGORYLABELS=COUNTEDVALUES) δεν έχει ετικέτα τιμής για τις " "μετρήσιμες τιμές της. Αυτή η κατηγορία δεν θα είναι διακριτή στην οθόνη " "εξαγωγής." #: src/language/dictionary/mrsets.c:369 #, c-format msgid "" "Variables %s and %s specified as part of multiple dichotomy group %s (which " "has CATEGORYLABELS=COUNTEDVALUES) have the same value label for the group's " "counted value. These categories will not be distinguishable in output." msgstr "" "Οι μεταβλητές %s και %s που ορίστηκαν σαν μέρος πολλαπλής διχοτόμησης ομάδας " "%s (η οποία έχει την CATEGORYLABELS=COUNTEDVALUES) έχει την ίδια ετικέτα " "τιμής για τις μετρήσιμες τιμές αυτής της ομάδας. Αυτές οι κατηγορίες δεν θα " "είναι διακριτές στην οθόνη εξαγωγής." #: src/language/dictionary/mrsets.c:426 #, c-format msgid "" "Variables specified on MCGROUP should have the same categories, but %s and " "%s (and possibly others) in multiple category group %s have different value " "labels for value %s." msgstr "" "Οι μεταβλητές που ορίστηκαν στην MCGROUP θα πρέπει να έχουν τις ίδιες " "κατηγορίες, αλλά η %s και η %s (και ίσως και άλλες) στην ομάδα πολλαπλής " "κατηγορίας %s έχουν διαφορετικές τιμές ετικέτας για την τιμή %s." #: src/language/dictionary/mrsets.c:484 #, c-format msgid "No multiple response set named %s." msgstr "Δεν ορίστηκε όνομα για το σετ πολλαπλών απαντήσεων %s." #: src/language/dictionary/mrsets.c:533 msgid "" "The active dataset dictionary does not contain any multiple response sets." msgstr "Η ενεργή λίστα δεδομένων δεν περιέχει κανένα σετ πολλαπλών απαντήσεων." #: src/language/dictionary/mrsets.c:540 msgid "Multiple Response Sets" msgstr "Σετ πολλαπλών απαντήσεων" #: src/language/dictionary/mrsets.c:543 #: src/language/dictionary/sys-file-info.c:446 #: src/language/dictionary/sys-file-info.c:733 #: src/language/stats/autorecode.c:375 src/language/data-io/data-parser.c:679 #: src/language/data-io/data-parser.c:725 src/language/data-io/print.c:434 msgid "Attributes" msgstr "Ιδιότητες" #: src/language/dictionary/mrsets.c:544 #: src/language/dictionary/sys-file-info.c:191 #: src/language/dictionary/sys-file-info.c:301 #: src/language/dictionary/sys-file-info.c:302 #: src/language/dictionary/sys-file-info.c:455 #: src/language/dictionary/sys-file-info.c:570 #: src/ui/gui/psppire-var-sheet-header.c:67 src/ui/gui/compute.ui:157 msgid "Label" msgstr "Ετικέτα" #: src/language/dictionary/mrsets.c:544 #: src/language/dictionary/sys-file-info.c:241 msgid "Encoding" msgstr "Κωδικοποίηση" #: src/language/dictionary/mrsets.c:544 msgid "Counted Value" msgstr "Μετρημένη Τιμή" #: src/language/dictionary/mrsets.c:544 msgid "Member Variables" msgstr "Μεταβλητές Μέλη" #: src/language/dictionary/mrsets.c:547 #: src/language/dictionary/sys-file-info.c:470 #: src/ui/gui/psppire-var-sheet-header.c:55 msgid "Name" msgstr "Όνομα" #: src/language/dictionary/mrsets.c:564 msgid "Dichotomies" msgstr "Διχοτομίες" #: src/language/dictionary/mrsets.c:565 src/language/stats/logistic.c:1391 msgid "Categories" msgstr "Κατηγορίες" #: src/language/dictionary/numeric.c:67 #, c-format msgid "Format type %s may not be used with a numeric variable." msgstr "" "Ο μορφότυπος %s δεν μπορεί να γίνει χρήση του με μάι αριθμητική μεταβλητή." #: src/language/dictionary/numeric.c:86 src/language/dictionary/numeric.c:153 #, c-format msgid "There is already a variable named %s." msgstr "Υπάρχει ήδη μια μεταβλητή που ονομάζεται %s." #: src/language/dictionary/numeric.c:138 #, c-format msgid "Format type %s may not be used with a string variable." msgstr "" "Ο μορφότυπος %s δεν μπορεί να γίνει χρήση του με μία μεταβλητή συμβολοσειράς." #: src/language/dictionary/rename-variables.c:92 #, c-format msgid "Renaming would duplicate variable name %s." msgstr "Η μετονομασία θα δημιουργήσει διπλότυπο της ονομασίας μεταβλητής %s." #: src/language/dictionary/split-file.c:75 msgid "Split Values" msgstr "Διαχωρισμός Τιμών" #: src/language/dictionary/split-file.c:76 #: src/language/dictionary/split-file.c:77 #: src/language/dictionary/sys-file-info.c:696 #: src/language/stats/chisquare.c:195 src/language/stats/cochran.c:156 #: src/language/stats/cochran.c:185 src/language/stats/examine.c:841 #: src/language/stats/reliability.c:648 src/language/stats/reliability.c:651 #: src/language/stats/crosstabs.q:1303 src/language/stats/crosstabs.q:1325 #: src/language/stats/crosstabs.q:1365 src/language/stats/crosstabs.q:1412 msgid "Value" msgstr "Τιμή" #: src/language/dictionary/split-file.c:79 #: src/language/dictionary/sys-file-info.c:734 #: src/language/stats/chisquare.c:246 src/language/stats/chisquare.c:328 #: src/language/stats/cochran.c:164 src/language/stats/correlations.c:100 #: src/language/stats/descriptives.c:1004 src/language/stats/friedman.c:226 #: src/language/stats/jonckheere-terpstra.c:377 #: src/language/stats/npar-summary.c:113 src/language/stats/quick-cluster.c:588 #: src/language/stats/runs.c:331 src/language/data-io/data-parser.c:683 #: src/language/data-io/data-parser.c:728 src/language/data-io/print.c:438 #: src/ui/gui/psppire-dictview.c:580 src/ui/gui/psppire-data-editor.c:502 msgid "Variable" msgstr "Μεταβλητή" #: src/language/dictionary/sys-file-info.c:184 msgid "File Information" msgstr "Πληροφορίες Αρχείου" #: src/language/dictionary/sys-file-info.c:185 msgid "Attribute" msgstr "Ιδιότητες" #: src/language/dictionary/sys-file-info.c:187 msgid "File" msgstr "Αρχείο" #: src/language/dictionary/sys-file-info.c:194 msgid "Created" msgstr "Δημιουργήθηκε" #: src/language/dictionary/sys-file-info.c:203 msgid "Integer Format" msgstr "Μορφοποίηση ακεραίου" #: src/language/dictionary/sys-file-info.c:205 msgid "Big Endian" msgstr "Μεγάλη Τελότητα, Endian" #: src/language/dictionary/sys-file-info.c:206 msgid "Little Endian" msgstr "Μικρή Τελότητα, Endian" #: src/language/dictionary/sys-file-info.c:207 #: src/language/dictionary/sys-file-info.c:216 #: src/language/dictionary/sys-file-info.c:223 src/language/utilities/set.q:930 msgid "Unknown" msgstr "Άγνωστο" #: src/language/dictionary/sys-file-info.c:209 msgid "Real Format" msgstr "Πραγματική μορφοποίηση" #: src/language/dictionary/sys-file-info.c:211 msgid "IEEE 754 LE." msgstr "IEEE 754 LE." #: src/language/dictionary/sys-file-info.c:212 msgid "IEEE 754 BE." msgstr "IEEE 754 BE." #: src/language/dictionary/sys-file-info.c:213 msgid "VAX D." msgstr "VAX D." #: src/language/dictionary/sys-file-info.c:214 msgid "VAX G." msgstr "VAX G." #: src/language/dictionary/sys-file-info.c:215 msgid "IBM 390 Hex Long." msgstr "IBM 390 δεκαεδικό μήκος." #: src/language/dictionary/sys-file-info.c:218 #: src/language/dictionary/sys-file-info.c:443 #: src/language/stats/binomial.c:199 src/language/stats/correlations.c:131 #: src/language/stats/correlations.c:159 src/language/stats/descriptives.c:585 #: src/language/stats/factor.c:1658 src/language/stats/factor.c:1701 #: src/language/stats/factor.c:1860 src/language/stats/factor.c:2074 #: src/language/stats/frequencies.c:1583 #: src/language/stats/kruskal-wallis.c:254 #: src/language/stats/kruskal-wallis.c:303 #: src/language/stats/ks-one-sample.c:316 src/language/stats/logistic.c:1187 #: src/language/stats/mann-whitney.c:254 src/language/stats/means.c:718 #: src/language/stats/means.c:800 src/language/stats/median.c:358 #: src/language/stats/oneway.c:985 src/language/stats/oneway.c:1157 #: src/language/stats/reliability.c:591 src/language/stats/regression.c:924 #: src/language/stats/t-test-one-sample.c:132 #: src/language/stats/t-test-paired.c:157 src/language/data-io/list.c:104 #: src/ui/gui/variable-info.ui:25 msgid "Variables" msgstr "Μεταβλητές" #: src/language/dictionary/sys-file-info.c:221 src/language/stats/examine.c:929 #: src/language/stats/means.c:697 src/language/stats/reliability.c:548 #: src/language/stats/crosstabs.q:930 msgid "Cases" msgstr "Υποθέσεις" #: src/language/dictionary/sys-file-info.c:226 src/language/stats/oneway.c:980 #: src/ui/gui/psppire-var-sheet-header.c:58 src/ui/gui/compute.ui:303 msgid "Type" msgstr "Τύπος" #: src/language/dictionary/sys-file-info.c:230 msgid "Weight" msgstr "Στάθμιση" #: src/language/dictionary/sys-file-info.c:233 msgid "Not weighted" msgstr "Μη στάθμιση" #: src/language/dictionary/sys-file-info.c:235 msgid "Compression" msgstr "Συμπίεση" #: src/language/dictionary/sys-file-info.c:245 #: src/language/dictionary/sys-file-info.c:424 #: src/language/dictionary/sys-file-info.c:426 msgid "Documents" msgstr "Έγγραφα" #: src/language/dictionary/sys-file-info.c:305 #: src/language/dictionary/sys-file-info.c:430 msgid "(none)" msgstr "(Τίποτα)" #: src/language/dictionary/sys-file-info.c:393 msgid "No variables to display." msgstr "Μεταβλητές δεν υπάρχουν για να εμφανιστούν." #: src/language/dictionary/sys-file-info.c:404 msgid "Macros not supported." msgstr "Macros δεν υποστηρίζονται." #: src/language/dictionary/sys-file-info.c:426 msgid "Document" msgstr "Έγγραφα" #: src/language/dictionary/sys-file-info.c:454 msgid "Position" msgstr "Θέση" #: src/language/dictionary/sys-file-info.c:456 msgid "Measurement Level" msgstr "Επίπεδο μέτρησης" #: src/language/dictionary/sys-file-info.c:457 #: src/ui/gui/psppire-var-sheet-header.c:85 msgid "Role" msgstr "Ρόλος" #: src/language/dictionary/sys-file-info.c:458 #: src/ui/gui/psppire-var-sheet-header.c:61 src/ui/gui/compute.ui:215 msgid "Width" msgstr "Εύρος" #: src/language/dictionary/sys-file-info.c:459 msgid "Alignment" msgstr "Ευθυγράμμιση" #: src/language/dictionary/sys-file-info.c:460 #: src/language/dictionary/sys-file-info.c:734 msgid "Print Format" msgstr "Μορφοποίηση Εκτύπωσης" #: src/language/dictionary/sys-file-info.c:461 msgid "Write Format" msgstr "Διαμορφωποίηση Εγγραφής" #: src/language/dictionary/sys-file-info.c:462 #: src/ui/gui/missing-val-dialog.c:379 src/ui/gui/psppire-var-sheet-header.c:73 #: src/ui/gui/examine.ui:416 src/ui/gui/t-test.ui:105 msgid "Missing Values" msgstr "Ελλειπούσες Τιμές" #: src/language/dictionary/sys-file-info.c:567 #: src/ui/gui/psppire-var-sheet-header.c:70 src/ui/gui/val-labs-dialog.c:489 #: src/ui/gui/val-labs-dialog.ui:194 msgid "Value Labels" msgstr "Ταμπέλες Τιμών" #: src/language/dictionary/sys-file-info.c:573 msgid "Variable Value" msgstr "Τιμή Μεταβλητής" #: src/language/dictionary/sys-file-info.c:577 msgid "User-missing value" msgstr "Ελλειπούσα-Χρήστη τιμή" #: src/language/dictionary/sys-file-info.c:693 msgid "Variable and Dataset Attributes" msgstr "Ιδιότητες Μεταβλητής κ Δεδομένων" #: src/language/dictionary/sys-file-info.c:699 msgid "Variable and Name" msgstr "Μεταβλητή κ Όνομα" #: src/language/dictionary/sys-file-info.c:702 msgid "(dataset)" msgstr "(βάση δεδομένων)" #: src/language/dictionary/sys-file-info.c:722 msgid "No vectors defined." msgstr "Δεν ορίστηκε διάνυσμα." #: src/language/dictionary/sys-file-info.c:732 msgid "Vectors" msgstr "Διανύσματα" #: src/language/dictionary/sys-file-info.c:736 msgid "Vector and Position" msgstr "Διάνυσμα και θέση" #: src/language/dictionary/sys-file-info.c:998 msgid "No valid encodings found." msgstr "Μη έγκυρες κωδικοποιήσεις βρέθηκαν." #: src/language/dictionary/sys-file-info.c:1004 #, c-format msgid "Usable encodings for %s." msgstr "Εύχρηστες κωδικοποιήσεις για %s." #: src/language/dictionary/sys-file-info.c:1007 #, c-format msgid "" "Encodings that can successfully read %s (by specifying the encoding name on " "the GET command's ENCODING subcommand). Encodings that yield identical text " "are listed together." msgstr "" "Οι κωδικοποιήσεις που μπορούν να διαβάσουν επιτυχώς %s (με τον ορισμό του " "ονόματος της κωδικοποίησης στην υποεντολή ENCODING της GET). Κωδικοποιήσεις " "που έχουν σαν αποτέλεσμα ίδιο κείμενο αναφέρονται μαζί." #: src/language/dictionary/sys-file-info.c:1012 #: src/language/dictionary/sys-file-info.c:1013 msgid "Encodings" msgstr "Κωδικοποιήσεις" #: src/language/dictionary/sys-file-info.c:1042 #, c-format msgid "%s Encoded Text Strings" msgstr "%s Κωδικοποιημένο κείμενο συμβολοσειράς" #: src/language/dictionary/sys-file-info.c:1046 msgid "" "Text strings in the file dictionary that the previously listed encodings " "interpret differently, along with the interpretations." msgstr "" "Κειμενό-Συμβολοσειρές στη λίστα που οι προηγούμενες κωδικοποιήσεις " "μετέφρασαν διαφορετικά, όπως και τις ερμηνείες αυτών." #: src/language/dictionary/sys-file-info.c:1049 src/output/text-item.c:57 #: src/ui/gui/psppire-import-assistant.c:885 msgid "Text" msgstr "Κείμενο" #: src/language/dictionary/sys-file-info.c:1059 msgid "Purpose" msgstr "Σκοπός" #: src/language/dictionary/value-labels.c:154 #, c-format msgid "Truncating value label to %d bytes." msgstr "Περικοπή ετικέτας τιμής κατά %d διφύα." #: src/language/dictionary/vector.c:66 #, c-format msgid "A vector named %s already exists." msgstr "Ένα διάνυσμα ονόματι %s ήδη υπάρχει." #: src/language/dictionary/vector.c:74 #, c-format msgid "Vector name %s is given twice." msgstr "Το όνομα διανύσματος %s έχει δωθεί δύο φορές." #: src/language/dictionary/vector.c:98 msgid "A slash must separate each vector specification in VECTOR's long form." msgstr "" "Μία κάθετος πρέπει να διαχωρίζει τον κάθε προσδιορισμό διανύσματος στην " "εκτεταμένη μορφή της VECTOR." #: src/language/dictionary/vector.c:131 msgid "Vectors must have at least one element." msgstr "Τα διανύσματα πρέπει να έχουν έστω ένα στοιχείο." #: src/language/dictionary/vector.c:151 msgid "expecting vector length" msgstr "αναμένει μήκος διανύσματος" #: src/language/dictionary/vector.c:170 #, c-format msgid "%s is an existing variable name." msgstr "%s ήδη υπάρχει σαν όνομα μεταβλητής." #: src/language/dictionary/variable-display.c:121 msgid "Variable display width must be a positive integer." msgstr "Το εμφανιζόμενο εύρος μεταβλητής πρέπει να είναι θετικο ακέραιος." #: src/language/dictionary/weight.c:49 msgid "The weighting variable must be numeric." msgstr "Η μεταβλητή στάθμισης πρέπει να είναι αριθμητική." #: src/language/dictionary/weight.c:54 msgid "The weighting variable may not be scratch." msgstr "Η μεταβλητή στάθμισης δεν πρέπει να είναι πρόχειρη μεταβλητή." #: src/language/tests/moments-test.c:50 msgid "expecting weight value" msgstr "αναμένει τιμή στάθμισης" #: src/language/utilities/cd.c:45 src/language/utilities/include.c:173 #, fuzzy, c-format #| msgid "Cannot change directory to %s: %s " msgid "Cannot change directory to %s: %s" msgstr "Δεν μπορεί να αλλάξει κατάλογο σε %s: %s " #: src/language/utilities/date.c:33 #, c-format msgid "Only %s is currently implemented." msgstr "Μόνο %s υποστηρίζεται στη παρούσα στιγμή." #: src/language/utilities/host.c:60 #, fuzzy #| msgid "Command shell not supported on this platform." msgid "Time limit not supported on this platform." msgstr "Το περιβάλλον εντολών δεν υποστηρίζεται σε αυτή τη πλατφόρμα." #: src/language/utilities/host.c:74 #, c-format msgid "%s: Command exited with status %d." msgstr "" #: src/language/utilities/host.c:95 #, fuzzy, c-format #| msgid "failed to create temporary file" msgid "Failed to create temporary file (%s)." msgstr "αποτυχία δημιουργίας πρόχειρου αρχείου" #: src/language/utilities/host.c:102 #, c-format msgid "/dev/null: Failed to open (%s)." msgstr "" #: src/language/utilities/host.c:117 #, c-format msgid "Couldn't fork: %s." msgstr "Δεν μπορεί να εκτελέσει: %s." #: src/language/utilities/host.c:193 #, c-format msgid "While running \"%s\", waiting for child process failed (%s)." msgstr "" #: src/language/utilities/host.c:203 #, c-format msgid "Command \"%s\" timed out." msgstr "" #: src/language/utilities/host.c:205 #, c-format msgid "Command \"%s\" terminated by signal %d." msgstr "" #: src/language/utilities/host.c:212 msgid "Command or shell not found" msgstr "" #: src/language/utilities/host.c:214 msgid "Could not invoke command or shell" msgstr "" #: src/language/utilities/host.c:217 #, c-format msgid "Command \"%s\" exited with status %d (%s)." msgstr "" #: src/language/utilities/host.c:220 #, c-format msgid "Command \"%s\" exited with status %d." msgstr "" #: src/language/utilities/host.c:230 #, c-format msgid "Command \"%s\" output could not be read (%s)." msgstr "" #: src/language/utilities/title.c:88 #, c-format msgid " (Entered %s)" msgstr " (Εισήχθη σαν %s)" #: src/language/utilities/include.c:73 #, c-format msgid "Can't find `%s' in include file search path." msgstr "" "Δεν μπορεί να βρεθεί το `%s' στην δοσμένη διεύθυνση αναζήτησης αρχείου." #: src/language/utilities/output.c:128 #, c-format msgid "Unknown cell class %s." msgstr "Άγνωστη εντολή κλάσης κελιού %s." #: src/language/utilities/permissions.c:113 #, c-format msgid "Cannot stat %s: %s" msgstr "Δεν μπορεί να εκτελέσει την stat %s: %s" #: src/language/utilities/permissions.c:127 #, c-format msgid "Cannot change mode of %s: %s" msgstr "Δεν μπορεί να αλλάξει τύπος της %s: %s" #: src/language/stats/aggregate.c:96 msgid "Sum of values" msgstr "Άθροισμα τιμών" #: src/language/stats/aggregate.c:97 msgid "Mean average" msgstr "Αριθμητικός Μέσος" #: src/language/stats/aggregate.c:98 msgid "Median average" msgstr "Μέσος όρος Διαμέσου" #: src/language/stats/aggregate.c:99 #: src/ui/gui/psppire-dialog-action-descriptives.c:40 #: src/ui/gui/psppire-dialog-action-frequencies.c:41 msgid "Standard deviation" msgstr "Τυπική Απόκλιση" #: src/language/stats/aggregate.c:100 #: src/ui/gui/psppire-dialog-action-descriptives.c:42 msgid "Maximum value" msgstr "Μέγιστη τιμή" #: src/language/stats/aggregate.c:101 #: src/ui/gui/psppire-dialog-action-descriptives.c:41 msgid "Minimum value" msgstr "Ελάχιστη τιμή" #: src/language/stats/aggregate.c:102 msgid "Percentage greater than" msgstr "Ποσοστό μεγαλύτερο από" #: src/language/stats/aggregate.c:103 msgid "Percentage less than" msgstr "Ποσοστό λιγότερο από" #: src/language/stats/aggregate.c:104 msgid "Percentage included in range" msgstr "Ποσοστό που περιέχεται στο εύρος" #: src/language/stats/aggregate.c:105 msgid "Percentage excluded from range" msgstr "Ποσοστό που αποκλείστηκε από το εύρος" #: src/language/stats/aggregate.c:106 msgid "Fraction greater than" msgstr "Κλάσμα μεγαλύτερο από" #: src/language/stats/aggregate.c:107 msgid "Fraction less than" msgstr "Κλάσμα μικρότερο από" #: src/language/stats/aggregate.c:108 msgid "Fraction included in range" msgstr "Κλάσμα που περιέχεται στο εύρος" #: src/language/stats/aggregate.c:109 msgid "Fraction excluded from range" msgstr "Κλάσμα που αποκλείστηκε από το εύρος" #: src/language/stats/aggregate.c:110 msgid "Number of cases" msgstr "Αριθμός υποθέσεων" #: src/language/stats/aggregate.c:111 msgid "Number of cases (unweighted)" msgstr "Αριθμός υποθέσεων (αστάθμητες)" #: src/language/stats/aggregate.c:112 msgid "Number of missing values" msgstr "Αριθμός ελλειπούσων τιμών" #: src/language/stats/aggregate.c:113 msgid "Number of missing values (unweighted)" msgstr "Αριθμός ελλειπούσων τιμών (αστάθμητες)" #: src/language/stats/aggregate.c:114 msgid "First non-missing value" msgstr "Αρχική μη ελλειπούσα τιμή" #: src/language/stats/aggregate.c:115 msgid "Last non-missing value" msgstr "Τελική μη ελλειπούσα τιμή" #: src/language/stats/aggregate.c:258 msgid "" "When PRESORTED is specified, specifying sorting directions with (A) or (D) " "has no effect. Output data will be sorted the same way as the input data." msgstr "" "Όταν η PRESORTED ορίζεται, ο ορισμο κατεύθυνσης με (A) ή (D) δεν έχει " "επιρροή. Τα εξαγώμενα δεδομένα θα ταξινομηθούν με τον ίδιο τρόπο όπως στα " "εισερχόμενα." #: src/language/stats/aggregate.c:448 msgid "expecting aggregation function" msgstr "αναμένεται συνάρτηση Συνάθροισης" #: src/language/stats/aggregate.c:460 #, c-format msgid "Unknown aggregation function %s." msgstr "Άγνωστη συνάρτηση Συνάθροισης %s." #: src/language/stats/aggregate.c:513 #, c-format msgid "Missing argument %zu to %s." msgstr "Λείπει όρισμα %zu στο %s." #: src/language/stats/aggregate.c:522 #, c-format msgid "Arguments to %s must be of same type as source variables." msgstr "" "Τα ορίσματα στο %s πρέπει να είναι ίδιου τύπου όπως στις αρχικές μεταβλητές." #: src/language/stats/aggregate.c:541 #, c-format msgid "" "Number of source variables (%zu) does not match number of target variables " "(%zu)." msgstr "" "Ο αριθμός των αρχικών μεταβλητών (%zu) δεν ταιριάζει στον αριθμό των " "επιλεγμένων μεταβλητών (%zu)." #: src/language/stats/aggregate.c:557 #, c-format msgid "" "The value arguments passed to the %s function are out-of-order. They will " "be treated as if they had been specified in the correct order." msgstr "" "Τα αριθμητικά ορίσματα που δόθηκαν στην %s συνάρτηση είναι σε λάθος σειρά. " "Θα χρησιμοποιηθούν σαν να είχαν δοθεί στη σωστή σειρά." #: src/language/stats/aggregate.c:631 #, c-format msgid "" "Variable name %s is not unique within the aggregate file dictionary, which " "contains the aggregate variables and the break variables." msgstr "" "Το όνομα της μεταβλητής %s δεν είναι μοναδικό μέσα στο Αρχείο Λίστας " "Συνάθροισης, το οποίο περιλαμβάνει τις μεταβλητές συνάθροισης και τις " "μεταβλητές διαχωρισμού." #: src/language/stats/autorecode.c:152 #, c-format msgid "Source variable count (%zu) does not match target variable count (%zu)." msgstr "" "Ο μετρητής των αρχικών μεταβλητών (%zu) δεν συμφωνεί με τον μετρητή των " "τελικών μεταβλητών (%zu)." #: src/language/stats/autorecode.c:164 #, c-format msgid "Target variable %s duplicates existing variable %s." msgstr "" "Η επιλεγμένη μεταβλητή %s είναι διπλότυπος της ήδη υπάρχουσας μεταβλητής %s." #: src/language/stats/autorecode.c:221 #, c-format msgid "" "With GROUP, variables may not mix string variables (such as %s) and numeric " "variables (such as %s)." msgstr "" "Με το GROUP, οι μεταβλητές δεν πρέπει να αναμιχθούν μεταβλητές συμβολοσειράς " "(όπως %s) και αριθμητικές μεταβλητές (όπως %s)." #: src/language/stats/autorecode.c:363 msgid "Recoding grouped variables." msgstr "Επανακωδικοποίηση ομαδοποιημένων μεταβλητών." #: src/language/stats/autorecode.c:365 #, c-format msgid "Recoding %s into %s (%s)." msgstr "Επανακωδικοποίηση %s σε %s (%s)." #: src/language/stats/autorecode.c:369 #, c-format msgid "Recoding %s into %s." msgstr "Επανακωδικοποίηση του %s σε %s." #: src/language/stats/autorecode.c:376 src/ui/gui/recode.ui:209 msgid "New Value" msgstr "Νέα Τιμή" #: src/language/stats/autorecode.c:376 msgid "Value Label" msgstr "Ετικέτα Τιμής" #: src/language/stats/autorecode.c:379 msgid "Old Value" msgstr "Προηγούμενη Τιμή" #: src/language/stats/binomial.c:138 #, c-format msgid "Variable %s is not dichotomous" msgstr "Η μεταβλητή %s δεν είναι διχότομη" #: src/language/stats/binomial.c:182 src/ui/gui/binomial.ui:30 msgid "Binomial Test" msgstr "Διωνυμικό τεστ" #: src/language/stats/binomial.c:186 src/language/stats/chisquare.c:183 #: src/language/stats/chisquare.c:239 src/language/stats/chisquare.c:322 #: src/language/stats/cochran.c:188 src/language/stats/correlations.c:94 #: src/language/stats/correlations.c:145 src/language/stats/descriptives.c:991 #: src/language/stats/examine.c:602 src/language/stats/examine.c:742 #: src/language/stats/examine.c:836 src/language/stats/examine.c:925 #: src/language/stats/factor.c:1755 src/language/stats/factor.c:1878 #: src/language/stats/factor.c:1908 src/language/stats/factor.c:2068 #: src/language/stats/factor.c:2102 src/language/stats/frequencies.c:302 #: src/language/stats/frequencies.c:1579 src/language/stats/frequencies.c:1586 #: src/language/stats/friedman.c:250 src/language/stats/glm.c:729 #: src/language/stats/kruskal-wallis.c:249 #: src/language/stats/kruskal-wallis.c:297 #: src/language/stats/ks-one-sample.c:278 src/language/stats/logistic.c:1170 #: src/language/stats/logistic.c:1300 src/language/stats/logistic.c:1330 #: src/language/stats/jonckheere-terpstra.c:361 #: src/language/stats/mann-whitney.c:184 src/language/stats/mann-whitney.c:247 #: src/language/stats/means.c:757 src/language/stats/means.c:811 #: src/language/stats/mcnemar.c:222 src/language/stats/median.c:315 #: src/language/stats/median.c:350 src/language/stats/npar-summary.c:106 #: src/language/stats/oneway.c:973 src/language/stats/oneway.c:1051 #: src/language/stats/oneway.c:1150 src/language/stats/oneway.c:1238 #: src/language/stats/oneway.c:1373 src/language/stats/quick-cluster.c:746 #: src/language/stats/reliability.c:543 src/language/stats/reliability.c:584 #: src/language/stats/reliability.c:633 src/language/stats/reliability.c:644 #: src/language/stats/roc.c:969 src/language/stats/roc.c:1067 #: src/language/stats/regression.c:867 src/language/stats/regression.c:899 #: src/language/stats/regression.c:1023 src/language/stats/regression.c:1089 #: src/language/stats/runs.c:318 src/language/stats/sign.c:102 #: src/language/stats/t-test-indep.c:193 src/language/stats/t-test-indep.c:259 #: src/language/stats/t-test-one-sample.c:68 #: src/language/stats/t-test-one-sample.c:125 #: src/language/stats/t-test-paired.c:150 #: src/language/stats/t-test-paired.c:193 #: src/language/stats/t-test-paired.c:238 src/language/stats/wilcoxon.c:243 #: src/language/stats/wilcoxon.c:282 src/language/stats/crosstabs.q:925 #: src/language/stats/crosstabs.q:1253 src/language/stats/crosstabs.q:1293 #: src/language/stats/crosstabs.q:1302 src/language/stats/crosstabs.q:1331 #: src/language/stats/crosstabs.q:1373 src/language/stats/crosstabs.q:1418 #: src/ui/gui/crosstabs.ui:499 src/ui/gui/oneway.ui:615 msgid "Statistics" msgstr "Στατιστικά" #: src/language/stats/binomial.c:187 src/language/stats/chisquare.c:240 #: src/language/stats/chisquare.c:252 msgid "Category" msgstr "Κατηγορίες" #: src/language/stats/binomial.c:188 src/language/stats/cochran.c:189 #: src/language/stats/correlations.c:97 src/language/stats/correlations.c:155 #: src/language/stats/descriptives.c:993 src/language/stats/examine.c:926 #: src/language/stats/frequencies.c:1588 src/language/stats/friedman.c:251 #: src/language/stats/kruskal-wallis.c:250 #: src/language/stats/ks-one-sample.c:279 src/language/stats/logistic.c:1331 #: src/language/stats/jonckheere-terpstra.c:369 #: src/language/stats/mann-whitney.c:185 src/language/stats/means.c:710 #: src/language/stats/means-calc.c:439 src/language/stats/mcnemar.c:223 #: src/language/stats/median.c:351 src/language/stats/npar-summary.c:107 #: src/language/stats/oneway.c:1052 src/language/stats/reliability.c:544 #: src/language/stats/sign.c:69 src/language/stats/sign.c:70 #: src/language/stats/t-test-indep.c:194 #: src/language/stats/t-test-one-sample.c:126 #: src/language/stats/t-test-paired.c:151 #: src/language/stats/t-test-paired.c:194 src/language/stats/wilcoxon.c:244 #: src/language/stats/crosstabs.q:926 msgid "N" msgstr "N" #: src/language/stats/binomial.c:189 msgid "Observed Prop." msgstr "Παρατ. Ποσ." #: src/language/stats/binomial.c:190 msgid "Test Prop." msgstr "Τεστ Ποσοστών." #: src/language/stats/binomial.c:192 src/language/stats/mcnemar.c:224 #: src/language/stats/sign.c:103 src/language/stats/wilcoxon.c:288 #: src/language/stats/crosstabs.q:1306 msgid "Exact Sig. (2-tailed)" msgstr "Επακριβής Στ.Σημ. (2-κατ/νσης)" #: src/language/stats/binomial.c:193 src/language/stats/mcnemar.c:225 #: src/language/stats/sign.c:104 src/language/stats/wilcoxon.c:289 #: src/language/stats/crosstabs.q:1307 msgid "Exact Sig. (1-tailed)" msgstr "Επακριβής Στ.Σημ. (1-κατ/νσης)" #: src/language/stats/binomial.c:195 msgid "Groups" msgstr "Ομάδες" #: src/language/stats/binomial.c:196 msgid "Group 1" msgstr "Ομάδα 1" #: src/language/stats/binomial.c:196 msgid "Group 2" msgstr "Ομάδα 2" #: src/language/stats/binomial.c:196 src/language/stats/chisquare.c:223 #: src/language/stats/chisquare.c:257 src/language/stats/examine.c:930 #: src/language/stats/factor.c:1756 src/language/stats/frequencies.c:344 #: src/language/stats/glm.c:811 src/language/stats/kruskal-wallis.c:285 #: src/language/stats/logistic.c:1336 src/language/stats/mann-whitney.c:197 #: src/language/stats/means.c:706 src/language/stats/oneway.c:982 #: src/language/stats/oneway.c:1072 src/language/stats/reliability.c:549 #: src/language/stats/regression.c:1031 src/language/stats/sign.c:75 #: src/language/stats/wilcoxon.c:250 #: src/ui/gui/psppire-dialog-action-crosstabs.c:93 #: src/language/stats/crosstabs.q:931 src/language/stats/crosstabs.q:1218 msgid "Total" msgstr "Σύνολο" #: src/language/stats/chisquare.c:171 #, c-format msgid "" "CHISQUARE test specified %d expected values, but variable %s has %zu " "distinct values." msgstr "" "CHISQUARE τεστ όρισε %d αναμενόμενες τιμές, αλλά η μεταβλητή %s έχει %zu " "διακριτές τιμές." #: src/language/stats/chisquare.c:184 src/language/stats/chisquare.c:241 msgid "Observed N" msgstr "Παρατηρήσιμο N" #: src/language/stats/chisquare.c:185 src/language/stats/chisquare.c:242 msgid "Expected N" msgstr "Αναμενόμενο N" #: src/language/stats/chisquare.c:186 src/language/stats/chisquare.c:243 #: src/language/stats/regression.c:1031 #: src/ui/gui/psppire-dialog-action-crosstabs.c:95 #: src/language/stats/crosstabs.q:1267 msgid "Residual" msgstr "Σφάλμα" #: src/language/stats/chisquare.c:235 src/language/stats/cochran.c:150 #: src/language/stats/median.c:305 src/language/stats/sign.c:66 #: src/ui/gui/frequencies.ui:676 msgid "Frequencies" msgstr "Συχνότητες" #: src/language/stats/chisquare.c:320 src/language/stats/cochran.c:181 #: src/language/stats/friedman.c:246 src/language/stats/kruskal-wallis.c:295 #: src/language/stats/mann-whitney.c:244 src/language/stats/mcnemar.c:219 #: src/language/stats/median.c:347 src/language/stats/sign.c:100 #: src/language/stats/wilcoxon.c:279 msgid "Test Statistics" msgstr "Στατιστικά Τεστ" #: src/language/stats/chisquare.c:323 msgid "Chi-square" msgstr "Χ-Τετράγωνο" #: src/language/stats/chisquare.c:324 src/language/stats/cochran.c:191 #: src/language/stats/examine.c:675 src/language/stats/factor.c:2107 #: src/language/stats/friedman.c:257 src/language/stats/glm.c:733 #: src/language/stats/kruskal-wallis.c:299 src/language/stats/logistic.c:1174 #: src/language/stats/median.c:354 src/language/stats/oneway.c:975 #: src/language/stats/oneway.c:1242 src/language/stats/regression.c:1025 #: src/language/stats/t-test-indep.c:267 #: src/language/stats/t-test-one-sample.c:75 #: src/language/stats/t-test-paired.c:253 src/language/stats/crosstabs.q:1304 msgid "df" msgstr "ΒΕ" #: src/language/stats/chisquare.c:325 src/language/stats/cochran.c:192 #: src/language/stats/friedman.c:258 src/language/stats/kruskal-wallis.c:300 #: src/language/stats/median.c:355 msgid "Asymp. Sig." msgstr "Ασυμπτ. Στ.Σημ." #: src/language/stats/cochran.c:111 msgid "More than two values encountered. Cochran Q test will not be run." msgstr "Πάνω από δύο τιμές βρέθηκαν. Το Cochran Q τεστ δεν θα τρέξει." #: src/language/stats/cochran.c:153 #, c-format msgid "Success (%.*g)" msgstr "Επιτυχία (%.*g)" #: src/language/stats/cochran.c:154 #, c-format msgid "Failure (%.*g)" msgstr "Αποτυχία (%.*g)" #: src/language/stats/cochran.c:190 msgid "Cochran's Q" msgstr "Cochran's Q" #: src/language/stats/correlations.c:91 src/language/stats/descriptives.c:987 #: src/language/stats/factor.c:2065 src/language/stats/npar-summary.c:102 msgid "Descriptive Statistics" msgstr "Περιγραφικά Στατιστικά" #: src/language/stats/correlations.c:95 src/language/stats/descriptives.c:108 #: src/language/stats/examine.c:742 src/language/stats/factor.c:2069 #: src/language/stats/frequencies.c:141 src/language/stats/graph.c:211 #: src/language/stats/ks-one-sample.c:290 src/language/stats/means-calc.c:438 #: src/language/stats/npar-summary.c:108 src/language/stats/oneway.c:1052 #: src/language/stats/t-test-indep.c:195 #: src/language/stats/t-test-one-sample.c:127 #: src/language/stats/t-test-paired.c:152 #: src/language/stats/t-test-paired.c:241 #: src/ui/gui/psppire-dialog-action-descriptives.c:39 #: src/ui/gui/psppire-dialog-action-frequencies.c:40 msgid "Mean" msgstr "Μέσος Όρος" #: src/language/stats/correlations.c:96 src/language/stats/examine.c:751 #: src/language/stats/factor.c:2070 src/language/stats/ks-one-sample.c:290 #: src/language/stats/means-calc.c:440 src/language/stats/npar-summary.c:109 #: src/language/stats/oneway.c:1052 src/language/stats/t-test-indep.c:196 #: src/language/stats/t-test-one-sample.c:128 #: src/language/stats/t-test-paired.c:153 #: src/language/stats/t-test-paired.c:242 msgid "Std. Deviation" msgstr "Τυπ. Απόκλιση" #: src/language/stats/correlations.c:126 msgid "Correlations" msgstr "Συσχετίσεις" #: src/language/stats/correlations.c:146 msgid "Pearson Correlation" msgstr "Pearson Συσχέτιση" #: src/language/stats/correlations.c:147 src/language/stats/oneway.c:1243 #: src/language/stats/t-test-indep.c:268 #: src/language/stats/t-test-one-sample.c:76 #: src/language/stats/t-test-paired.c:254 msgid "Sig. (2-tailed)" msgstr "Στ.Σημ. (2-κατ/νσης)" #: src/language/stats/correlations.c:147 src/language/stats/factor.c:1913 msgid "Sig. (1-tailed)" msgstr "Στ.Σημ. (1-κατ/νσης)" #: src/language/stats/correlations.c:151 msgid "Cross-products" msgstr "Ενδογινόμενα" #: src/language/stats/correlations.c:152 msgid "Covariance" msgstr "Συνδιακύμανση" #: src/language/stats/correlations.c:165 msgid "Significant at .05 level" msgstr "Σημαντικό σε επίπεδο .05" #: src/language/stats/correlations.c:234 msgid "The data for the chosen variables are all missing or empty." msgstr "Τα δεδομένα για τις μεταβλητές επιλογής είναι όλα κενά ή ελλειπούντα." #: src/language/stats/correlations.c:390 src/language/stats/descriptives.c:368 #: src/language/data-io/list.c:166 msgid "No variables specified." msgstr "Δεν ορίστηκαν μεταβλητές." #: src/language/stats/descriptives.c:109 src/language/stats/frequencies.c:142 #: src/language/stats/means-calc.c:445 src/language/stats/t-test-indep.c:197 #: src/language/stats/t-test-one-sample.c:129 #: src/language/stats/t-test-paired.c:154 #: src/language/stats/t-test-paired.c:243 msgid "S.E. Mean" msgstr "Τ.Σ. ΜΟ" #: src/language/stats/descriptives.c:110 src/language/stats/frequencies.c:145 msgid "Std Dev" msgstr "ΤΑ" #: src/language/stats/descriptives.c:111 src/language/stats/examine.c:750 #: src/language/stats/frequencies.c:146 src/language/stats/means-calc.c:450 #: src/ui/gui/psppire-dialog-action-descriptives.c:46 #: src/ui/gui/psppire-dialog-action-frequencies.c:45 msgid "Variance" msgstr "Διακύμανση" #: src/language/stats/descriptives.c:112 src/language/stats/examine.c:752 #: src/language/stats/frequencies.c:147 src/language/stats/means-calc.c:451 #: src/ui/gui/psppire-dialog-action-descriptives.c:47 #: src/ui/gui/psppire-dialog-action-frequencies.c:50 msgid "Kurtosis" msgstr "Κύρτωση" #: src/language/stats/descriptives.c:113 src/language/stats/frequencies.c:148 #: src/language/stats/means-calc.c:452 msgid "S.E. Kurt" msgstr "Τ.Σ. Κυρτ" #: src/language/stats/descriptives.c:114 src/language/stats/examine.c:752 #: src/language/stats/frequencies.c:149 src/language/stats/means-calc.c:453 #: src/ui/gui/psppire-dialog-action-descriptives.c:48 #: src/ui/gui/psppire-dialog-action-frequencies.c:46 msgid "Skewness" msgstr "Λοξότητα" #: src/language/stats/descriptives.c:115 src/language/stats/frequencies.c:150 #: src/language/stats/means-calc.c:454 msgid "S.E. Skew" msgstr "Τ.Σ. Λοξ" #: src/language/stats/descriptives.c:116 src/language/stats/examine.c:751 #: src/language/stats/frequencies.c:151 src/language/stats/means-calc.c:449 #: src/ui/gui/psppire-dialog-action-descriptives.c:43 #: src/ui/gui/psppire-dialog-action-frequencies.c:48 msgid "Range" msgstr "Εύρος" #: src/language/stats/descriptives.c:117 src/language/stats/examine.c:751 #: src/language/stats/frequencies.c:152 src/language/stats/graph.c:214 #: src/language/stats/ks-one-sample.c:285 src/language/stats/means-calc.c:447 #: src/language/stats/npar-summary.c:110 src/language/stats/oneway.c:1061 #: src/ui/gui/psppire-dialog-action-descriptives.c:41 #: src/ui/gui/psppire-dialog-action-frequencies.c:42 msgid "Minimum" msgstr "Ελάχιστο" #: src/language/stats/descriptives.c:118 src/language/stats/examine.c:751 #: src/language/stats/frequencies.c:153 src/language/stats/graph.c:213 #: src/language/stats/ks-one-sample.c:285 src/language/stats/means-calc.c:448 #: src/language/stats/npar-summary.c:110 src/language/stats/oneway.c:1061 #: src/ui/gui/psppire-dialog-action-descriptives.c:42 #: src/ui/gui/psppire-dialog-action-frequencies.c:43 msgid "Maximum" msgstr "Μέγιστο" #: src/language/stats/descriptives.c:119 src/language/stats/frequencies.c:154 #: src/language/stats/graph.c:212 src/language/stats/means-calc.c:446 #: src/ui/gui/psppire-dialog-action-descriptives.c:44 #: src/ui/gui/psppire-dialog-action-frequencies.c:53 msgid "Sum" msgstr "Σύνολο" #: src/language/stats/descriptives.c:350 #, c-format msgid "Z-score variable name %s would be a duplicate variable name." msgstr "Το όνομα της μεταβλητής με Z-τιμές %s θα είναι διπλότυπο." #: src/language/stats/descriptives.c:401 msgid "" "DESCRIPTIVES with Z scores ignores TEMPORARY. Temporary transformations " "will be made permanent." msgstr "" "DESCRIPTIVES με Z τιμές αγνοεί TEMPORARY. Προσωρινές μετατροπές θα γίνουν " "μόνιμες." #: src/language/stats/descriptives.c:478 msgid "expecting statistic name: reverting to default" msgstr "αναμένει στατιστικό όνομα: επαναφέρεται το προκαθορισμένο" #: src/language/stats/descriptives.c:561 msgid "" "Ran out of generic names for Z-score variables. There are only 126 generic " "names: ZSC001-ZSC0999, STDZ01-STDZ09, ZZZZ01-ZZZZ09, ZQZQ01-ZQZQ09." msgstr "" "Τέλειωσαν τα γενικά ονόματα για μεταβλητές με Z-τιμές. Υπάρχουν μόνο 126 " "γενικά τέτοια ονόματα: ZSC001-ZSC0999, STDZ01-STDZ09, ZZZZ01-ZZZZ09, ZQZQ01-" "ZQZQ09." #: src/language/stats/descriptives.c:579 msgid "Mapping of Variables to Z-scores" msgstr "Αντιστοιχία Μεταβλητών σε Z-τιμές" #: src/language/stats/descriptives.c:581 msgid "Names" msgstr "Ονόματα" #: src/language/stats/descriptives.c:582 src/language/stats/glm.c:739 #: src/language/stats/regression.c:1030 msgid "Source" msgstr "Αρχικές" #: src/language/stats/descriptives.c:582 msgid "Target" msgstr "Τελικές" #: src/language/stats/descriptives.c:659 #, c-format msgid "Internal error processing Z scores. Please report this to %s." msgstr "Ενδότερο σφάλμα επεξεργασίας Z τιμές. Παρακαλώ, αναφέρετέ το στο %s." #: src/language/stats/descriptives.c:759 #, c-format msgid "Z-score of %s" msgstr "Z-τιμή για %s" #: src/language/stats/descriptives.c:1028 src/language/stats/roc.c:1029 msgid "Valid N (listwise)" msgstr "Έγκυρο N (ανά γραμμή)" #: src/language/stats/descriptives.c:1028 msgid "Missing N (listwise)" msgstr "Ελλειπούσες N (ανά υπόθεση)" #: src/language/stats/examine.c:75 msgid " (missing)" msgstr " (ελλειπούσα)" #: src/language/stats/examine.c:225 #, c-format msgid "Boxplot of %s vs. %s" msgstr "Θηκόγραμμα του %s με %s" #: src/language/stats/examine.c:231 src/language/stats/examine.c:338 #, c-format msgid "Boxplot of %s" msgstr "Θηκόγραμμα του %s" #: src/language/stats/examine.c:321 msgid "Boxplot" msgstr "Θηκόγραμμα" #: src/language/stats/examine.c:418 msgid "Not creating NP plot because data set is empty." msgstr "Μη δημιουργία NP γραφήματος επειδή η βάση δεδομένων είναι κενή." #: src/language/stats/examine.c:478 #, c-format msgid "Not creating spreadlevel chart for %s" msgstr "Μη δημιουργία spreadlevel γραφήματος για %s" #: src/language/stats/examine.c:585 msgid "User-missing value." msgstr "Ελλειπούσα-χρήστη τιμή." #: src/language/stats/examine.c:591 src/language/stats/examine.c:595 #: src/language/stats/frequencies.c:1606 msgid "Percentiles" msgstr "Εκατοστημόρια" #: src/language/stats/examine.c:603 src/math/percentiles.c:37 msgid "Weighted Average" msgstr "Σταθμισμένος Μέσος" #: src/language/stats/examine.c:603 msgid "Tukey's Hinges" msgstr "Tukey's Hinges" #: src/language/stats/examine.c:610 src/language/stats/examine.c:685 #: src/language/stats/examine.c:759 src/language/stats/examine.c:858 #: src/language/stats/examine.c:938 src/language/stats/mann-whitney.c:200 #: src/language/stats/median.c:319 src/language/stats/t-test-indep.c:227 #: src/language/stats/t-test-indep.c:282 #: src/language/stats/t-test-one-sample.c:87 msgid "Dependent Variables" msgstr "Εξαρτημένες Μεταβλητές" #: src/language/stats/examine.c:669 msgid "Tests of Normality" msgstr "Τεστ Κανονικότητας" #: src/language/stats/examine.c:673 msgid "Shapiro-Wilk" msgstr "Shapiro-Wilk" #: src/language/stats/examine.c:674 src/language/stats/examine.c:739 #: src/ui/gui/psppire-checkbox-treeview.c:73 msgid "Statistic" msgstr "Στατιστικά" #: src/language/stats/examine.c:676 src/language/stats/factor.c:2108 #: src/language/stats/glm.c:736 src/language/stats/logistic.c:1175 #: src/language/stats/oneway.c:978 src/language/stats/oneway.c:1154 #: src/language/stats/oneway.c:1376 src/language/stats/regression.c:906 #: src/language/stats/regression.c:1028 src/language/stats/t-test-indep.c:263 #: src/language/stats/t-test-paired.c:196 msgid "Sig." msgstr "Στ.Σημ." #: src/language/stats/examine.c:735 src/language/stats/oneway.c:1045 #: src/ui/gui/descriptives.ui:25 msgid "Descriptives" msgstr "Περιγραφικά" #: src/language/stats/examine.c:738 msgid "Aspect" msgstr "Προοπτική" #: src/language/stats/examine.c:739 src/language/stats/oneway.c:1053 #: src/language/stats/oneway.c:1240 src/language/stats/oneway.c:1375 #: src/language/stats/roc.c:975 src/language/stats/regression.c:902 msgid "Std. Error" msgstr "Τυπ. Σφάλμα" #: src/language/stats/examine.c:745 src/language/stats/oneway.c:1056 #, c-format msgid "%g%% Confidence Interval for Mean" msgstr "%g%% Διάστημα Εμπιστοσύνης για Μέσο όρο" #: src/language/stats/examine.c:747 src/language/stats/oneway.c:1058 #: src/language/stats/oneway.c:1382 src/language/stats/roc.c:982 #: src/language/stats/regression.c:913 msgid "Lower Bound" msgstr "Κατώτερο Όριο" #: src/language/stats/examine.c:748 src/language/stats/oneway.c:1059 #: src/language/stats/oneway.c:1383 src/language/stats/roc.c:983 #: src/language/stats/regression.c:914 msgid "Upper Bound" msgstr "Ανώτερο Όριο" #: src/language/stats/examine.c:750 msgid "5% Trimmed Mean" msgstr "5% Περικομμένος Μέσος Όρος" #: src/language/stats/examine.c:750 src/language/stats/frequencies.c:143 #: src/language/stats/means-calc.c:442 src/language/stats/median.c:352 #: src/ui/gui/psppire-dialog-action-frequencies.c:52 msgid "Median" msgstr "Διάμεσος" #: src/language/stats/examine.c:752 msgid "Interquartile Range" msgstr "Ενδοτεταρτημοριακό Εύρος" #: src/language/stats/examine.c:832 msgid "Extreme Values" msgstr "Ακραίες Τιμές" #: src/language/stats/examine.c:840 src/language/stats/quick-cluster.c:664 #: src/language/data-io/list.c:110 msgid "Case Number" msgstr "Αριθμός Υπόθεσης" #: src/language/stats/examine.c:844 msgid "Order" msgstr "Ταξινόμηση" #. TRANSLATORS: This is a noun, not an adjective. #: src/language/stats/examine.c:850 msgid "Extreme" msgstr "Ακραίες" #: src/language/stats/examine.c:851 msgid "Highest" msgstr "Ανώτατο" #: src/language/stats/examine.c:851 msgid "Lowest" msgstr "Κατώτατο" #: src/language/stats/examine.c:921 src/language/stats/logistic.c:1328 #: src/language/stats/means.c:694 src/language/stats/reliability.c:540 msgid "Case Processing Summary" msgstr "Σύνοψη Επεξεργασίας Υποθέσεων" #: src/language/stats/examine.c:927 src/language/stats/frequencies.c:304 #: src/language/stats/frequencies.c:1494 src/language/stats/logistic.c:1332 #: src/language/stats/means.c:713 src/language/stats/reliability.c:545 #: src/language/stats/crosstabs.q:927 msgid "Percent" msgstr "Ποσοστά" #: src/language/stats/examine.c:929 src/language/stats/frequencies.c:321 #: src/language/stats/frequencies.c:1590 src/language/stats/quick-cluster.c:766 #: src/language/stats/reliability.c:548 src/language/stats/crosstabs.q:931 msgid "Valid" msgstr "Έγκυρες" #: src/language/stats/examine.c:929 src/language/stats/frequencies.c:336 #: src/language/stats/frequencies.c:1591 src/language/stats/crosstabs.q:931 msgid "Missing" msgstr "Ελλειπούσες" #: src/language/stats/examine.c:1550 #, c-format msgid "%s may not be negative. Using default value (%g)." msgstr "%s ίσως να μην είναι αρνητική. Χρήση της προακαθορισμένης τιμής (%g)." #: src/language/stats/examine.c:1587 msgid "Percentiles must lie in the range (0, 100)" msgstr "Τα Εκατοστημόρια πρέπει να είναι μεταξύ εύρους (0, 100)" #: src/language/stats/examine.c:1777 #, c-format msgid "%s and %s are mutually exclusive" msgstr "%s και %s είναι αμοιβαία αποκλειώμενα" #: src/language/stats/factor.c:1121 #, c-format msgid "Matrix input for %s must be either COV or CORR" msgstr "Ο πίνακας για %s πρέπει να είναι είτε COV ή CORR" #: src/language/stats/factor.c:1519 msgid "Factor analysis on a single variable is not useful." msgstr "Η παραγοντική ανάλυση με μία μεταβλητή δεν είναι χρήσιμη." #: src/language/stats/factor.c:1523 msgid "Factor analysis without variables is not possible." msgstr "Η παραγοντική ανάλυση με μία μεταβλητή δεν είναι χρήσιμη." #: src/language/stats/factor.c:1634 msgid "Component Number" msgstr "Αριθμός Συνιστώσας" #: src/language/stats/factor.c:1634 msgid "Factor Number" msgstr "Αριθμός Παράγοντα" #: src/language/stats/factor.c:1648 src/language/stats/factor.c:1651 msgid "Communalities" msgstr "Εταιρικότητες" #: src/language/stats/factor.c:1653 msgid "Initial" msgstr "Αρχική" #: src/language/stats/factor.c:1655 msgid "Extraction" msgstr "Εξαγωγή" #: src/language/stats/factor.c:1697 src/language/stats/factor.c:1777 #: src/language/stats/factor.c:1839 msgid "Component" msgstr "Συνιστώσα" #: src/language/stats/factor.c:1697 src/language/stats/factor.c:1777 #: src/language/stats/factor.c:1839 msgid "Factor" msgstr "Παράγοντας" #: src/language/stats/factor.c:1752 msgid "Total Variance Explained" msgstr "Συν/κης. Διακύμανσης Επεξήγηση" #: src/language/stats/factor.c:1758 #, fuzzy, no-c-format #| msgid "% of Variance" msgid "% of Variance" msgstr "% της Διακύμανσης" #: src/language/stats/factor.c:1760 #, no-c-format msgid "Cumulative %" msgstr "Συσσωρευτικό %" #: src/language/stats/factor.c:1763 msgid "Phase" msgstr "Φάση" #: src/language/stats/factor.c:1765 msgid "Initial Eigenvalues" msgstr "Αρχικές Ιδιοτιμές" #: src/language/stats/factor.c:1769 msgid "Extraction Sums of Squared Loadings" msgstr "Εξαγωγή Άθροισμα Τετραγονισμένων Φορτώσεων" #: src/language/stats/factor.c:1773 msgid "Rotation Sums of Squared Loadings" msgstr "Περιστρεφόμενο Άθροισμα Τετραγονισμένων Φορτώσεων" #: src/language/stats/factor.c:1835 msgid "Factor Correlation Matrix" msgstr "Πίνακας Παραγοντικών συσχετίσεων" #: src/language/stats/factor.c:1842 msgid "Factor 2" msgstr "Παράγοντας 2" #: src/language/stats/factor.c:1874 msgid "Anti-Image Matrices" msgstr "Αντίστροφος πίνακας" #: src/language/stats/factor.c:1879 msgid "Anti-image Covariance" msgstr "Αντίστροφος πίνακας Συνδιακύμανσης" #: src/language/stats/factor.c:1880 msgid "Anti-image Correlation" msgstr "Συ" #: src/language/stats/factor.c:1901 msgid "Correlation Matrix" msgstr "Πίνακας Συσχετίσεων" #: src/language/stats/factor.c:1910 src/language/stats/t-test-paired.c:195 msgid "Correlation" msgstr "Συσχέτιση" #: src/language/stats/factor.c:1947 msgid "Determinant" msgstr "Ορίζουσα" #: src/language/stats/factor.c:1958 msgid "Covariance Matrix" msgstr "Πίνακας _Συνδιακύμανσης" #: src/language/stats/factor.c:1990 msgid "" "The dataset contains no complete observations. No analysis will be performed." msgstr "" "Η βάση δεδομένων δεν περιέχει ολοκληρωμένες παρατηρήσεις. Η ανάλυση δεν θα " "διεξαχθεί." #: src/language/stats/factor.c:2014 msgid "The dataset has no complete covariance or correlation matrix." msgstr "Τα δεδομένα του Πίνακα Συνδιακύμανσης ή Συσχέτισης δεν είναι πλήρη." #: src/language/stats/factor.c:2071 msgid "Analysis N" msgstr "Ανάλυση του N" #: src/language/stats/factor.c:2099 msgid "KMO and Bartlett's Test" msgstr "Τεστ KMO και Bartlett" #: src/language/stats/factor.c:2103 msgid "Kaiser-Meyer-Olkin Measure of Sampling Adequacy" msgstr "Kaiser-Meyer-Olkin Μέτρηση Επάρκειας Δείγματος" #: src/language/stats/factor.c:2105 msgid "Bartlett's Test of Sphericity" msgstr "Τεστ Σφαιρικότητας Bartlett" #: src/language/stats/factor.c:2106 msgid "Approx. Chi-Square" msgstr "Προσεγγ. Χ-Τετράγωνο" #: src/language/stats/factor.c:2154 #, c-format msgid "" "The %s criteria result in zero factors extracted. Therefore no analysis will " "be performed." msgstr "" "Το κριτήριο %s έχει σαν αποτέλεσμα μηδέν Παράγοντες να εξαχθούν. Για αυτό το " "λόγο, η ανάλυση δεν θα διεξαχθεί." #: src/language/stats/factor.c:2161 #, c-format msgid "" "The %s criteria result in more factors than variables, which is not " "meaningful. No analysis will be performed." msgstr "" "Το κριτήριο %s έχει σαν αποτέλεσμα περισσότερους Παράγοντες από μεταβλητές, " "το οποίο δεν είναι χρήσιμο. Η ανάλυση δεν θα διεξαχθεί." #: src/language/stats/factor.c:2254 msgid "Component Matrix" msgstr "Πίνακας Συνιστωσών" #: src/language/stats/factor.c:2254 msgid "Factor Matrix" msgstr "Παραγοντικός Πίνακας" #: src/language/stats/factor.c:2259 msgid "Pattern Matrix" msgstr "Πίνακας Μοτίβων" #: src/language/stats/factor.c:2268 msgid "Structure Matrix" msgstr "Δομικός Πίνακας" #: src/language/stats/factor.c:2270 msgid "Rotated Component Matrix" msgstr "Περιστρεφόμενος Πίνακας Συνιστωσών" #: src/language/stats/factor.c:2271 msgid "Rotated Factor Matrix" msgstr "Περιστρεφόμενος Παραγοντικός Πίνακας" #: src/language/stats/flip.c:100 #, c-format msgid "%s ignores %s. Temporary transformations will be made permanent." msgstr "%s αγνοεί %s. Προσωρινές μετατροπές θα γίνουν μόνιμες." #: src/language/stats/flip.c:153 #, c-format msgid "Could not create temporary file for %s." msgstr "Αδυναμία δημιουργίας προσωρινού αρχείου για %s." #: src/language/stats/flip.c:341 #, c-format msgid "Error rewinding %s file: %s." msgstr "Σφάλμα αναδίπλωσης %s αρχείου: %s." #: src/language/stats/flip.c:348 #, c-format msgid "Error creating %s source file." msgstr "Σφάλμα δημιουργίας %s αρχικού αρχείου." #: src/language/stats/flip.c:361 #, c-format msgid "Error reading %s file: %s." msgstr "Σφάλμα ανάγνωσης %s αρχείου: %s." #: src/language/stats/flip.c:363 #, c-format msgid "Unexpected end of file reading %s file." msgstr "Μη αναμενόμενο τέλος ανάγνωσης αρχείου του %s αρχείου." #: src/language/stats/flip.c:379 #, c-format msgid "Error seeking %s source file: %s." msgstr "Σφάλμα αναζήτησης %s αρχικού αρχείου: %s." #: src/language/stats/flip.c:387 #, c-format msgid "Error writing %s source file: %s." msgstr "Σφάλμα εγγραφής %s αρχικού αρχείου: %s." #: src/language/stats/flip.c:402 #, c-format msgid "Error rewinding %s source file: %s." msgstr "Σφάλμα αναδίπλωσης %s αρχικού αρχείου: %s." #: src/language/stats/flip.c:433 #, c-format msgid "Error reading %s temporary file: %s." msgstr "Σφάλμα ανάγνωσης %s προσωρινού αρχείου: %s." #: src/language/stats/flip.c:436 #, c-format msgid "Unexpected end of file reading %s temporary file." msgstr "Μη αναμενόμενο τέλος ανάγνωσης αρχείου του %s προσωρινού αρχείου." #: src/language/stats/frequencies.c:144 #: src/ui/gui/psppire-dialog-action-frequencies.c:49 msgid "Mode" msgstr "Επικρατούσα τιμή" #: src/language/stats/frequencies.c:303 src/language/stats/logistic.c:1381 #: src/output/charts/plot-hist-cairo.c:112 msgid "Frequency" msgstr "Συχνότητα" #: src/language/stats/frequencies.c:305 msgid "Valid Percent" msgstr "Έγκυρα Ποσοστά" #: src/language/stats/frequencies.c:306 src/language/stats/graph.c:208 msgid "Cumulative Percent" msgstr "Συσσωρευτικά Ποσοστά" #: src/language/stats/frequencies.c:905 msgid "Histogram frequency must be greater than zero." msgstr "Το Ιστόγραμμα συχνοτήτων πρέπει να είναι μεγαλύτερο από μηδέν." #: src/language/stats/frequencies.c:923 msgid "Histogram percentage must be greater than zero." msgstr "Το Ιστόγραμμα ποσοστών πρέπει να είναι μεγαλύτερο από μηδέν." #: src/language/stats/frequencies.c:1139 #, c-format msgid "" "%s for histogram must be greater than or equal to %s, but %s was specified " "as %.15g and %s as %.15g. %s and %s will be ignored." msgstr "" "%s για το Ιστόγραμμα πρέπει να είναι μεγαλύτερο ή ίσο του %s, αλλά %s " "ορίστηκε ως %.15g και %s ως %.15g. %s και %s θα αγνοηθούν." #: src/language/stats/frequencies.c:1184 #, c-format msgid "" "%s for pie chart must be greater than or equal to %s, but %s was specified " "as %.15g and %s as %.15g. %s and %s will be ignored." msgstr "" "%s για το γράφημα πίτας πρέπει να είναι μεγαλύτερο ή ίσο του %s, αλλά %s " "ορίστηκε ως %.15g και %s ως %.15g. %s και %s θα αγνοηθούν." #: src/language/stats/frequencies.c:1474 #, c-format msgid "Omitting pie chart for %s, which has only %d unique values." msgstr "" "Απαλειφή του γράφηματος πίτας για %s, το οποίο έχει μόνο %d μοναδικές τιμές." #: src/language/stats/frequencies.c:1477 #, c-format msgid "Omitting pie chart for %s, which has over 50 unique values." msgstr "" "Απαλειφή του γράφηματος πίτας για %s, το οποίο έχει πάνω από 50 μοναδικές " "τιμές." #: src/language/stats/frequencies.c:1494 src/language/stats/graph.c:205 #: src/language/stats/quick-cluster.c:747 #: src/ui/gui/psppire-dialog-action-crosstabs.c:90 #: src/language/stats/crosstabs.q:789 src/language/stats/crosstabs.q:1262 msgid "Count" msgstr "Μετρητής" #: src/language/stats/friedman.c:220 src/language/stats/kruskal-wallis.c:247 #: src/language/stats/mann-whitney.c:182 src/language/stats/wilcoxon.c:240 msgid "Ranks" msgstr "Κατατάξεις" #: src/language/stats/friedman.c:222 src/language/stats/friedman.c:223 #: src/language/stats/kruskal-wallis.c:251 #: src/language/stats/mann-whitney.c:186 src/language/stats/wilcoxon.c:245 msgid "Mean Rank" msgstr "ΜΟ Κατάταξης" #: src/language/stats/friedman.c:253 msgid "Kendall's W" msgstr "Kendall's W" #: src/language/stats/friedman.c:256 src/language/stats/kruskal-wallis.c:298 #: src/language/stats/median.c:353 msgid "Chi-Square" msgstr "Χ-Τετράγωνο" #: src/language/stats/glm.c:169 msgid "Multivariate analysis is not yet implemented" msgstr "Η Ανάλυση πολυ-διακύμανσης δεν είναι διαθέσιμη ακόμη" #: src/language/stats/glm.c:274 msgid "Only types 1, 2 & 3 sums of squares are currently implemented" msgstr "Μόνο οι Τύποι 1, 2 & 3 Αθρ. Τετραγώνων είναι προς το παρόν διαθέσιμοι" #: src/language/stats/glm.c:727 msgid "Tests of Between-Subjects Effects" msgstr "Τεστ για Μεταξύ - Συμμετεχόντων Επιδράσεις" #: src/language/stats/glm.c:730 msgid "Type I Sum Of Squares" msgstr "Τύπος Ι Αθρ. Τετραγώνων" #: src/language/stats/glm.c:731 msgid "Type II Sum Of Squares" msgstr "Τύπος ΙΙ Αθρ. Τετραγώνων" #: src/language/stats/glm.c:732 msgid "Type III Sum Of Squares" msgstr "Τύπος ΙΙΙ Αθρ. Τετραγώνων" #: src/language/stats/glm.c:734 src/language/stats/oneway.c:976 #: src/language/stats/regression.c:1026 msgid "Mean Square" msgstr "ΜΟ Τετραγώνου" #: src/language/stats/glm.c:735 src/language/stats/oneway.c:977 #: src/language/stats/regression.c:1027 src/language/stats/t-test-indep.c:262 msgid "F" msgstr "F" #: src/language/stats/glm.c:740 msgid "Corrected Model" msgstr "Διορθωμένο Μοντέλο" #: src/language/stats/glm.c:740 msgid "Model" msgstr "Μοντέλο" #: src/language/stats/glm.c:752 msgid "Intercept" msgstr "Σταθερά" #: src/language/stats/glm.c:802 src/output/pivot-table.c:763 #: src/output/spv/spv.c:867 msgid "Error" msgstr "Σφάλμα" #: src/language/stats/glm.c:819 msgid "Corrected Total" msgstr "Διορθωμένο Σύνολο" #: src/language/stats/graph.c:206 msgid "Percentage" msgstr "Ποσοστά" #: src/language/stats/graph.c:207 msgid "Cumulative Count" msgstr "Συσσωρευτική Μέτρηση" #: src/language/stats/graph.c:296 #, c-format msgid "%s vs. %s by %s" msgstr "%s vs. %s by %s" #: src/language/stats/graph.c:303 #, c-format msgid "%s vs. %s" msgstr "%s vs. %s" #: src/language/stats/graph.c:322 msgid "" "Maximum number of scatterplot categories reached. Your BY variable has too " "many distinct values. The coloring of the plot will not be correct." msgstr "" "Ο Μέγιστος αριθμός κατηγοριών για Διάγραμμα Διασποράς γέμισε. Η BY μεταβλητή " "έχει πάρα πολλές διακριτές τιμές. Ο χρωματισμός του γραφήματος δεν θα " "αποδοθεί σωστά." #: src/language/stats/graph.c:551 src/language/stats/rank.c:636 #, c-format msgid "%s of %s" msgstr "%s από %s" #: src/language/stats/graph.c:698 src/language/stats/graph.c:729 #: src/language/stats/graph.c:777 msgid "Only one chart type is allowed." msgstr "Μόνο ένα γράφημα επιτρέπεται." #: src/language/stats/graph.c:721 src/language/stats/graph.c:820 #: src/language/stats/graph.c:834 msgid "Only one variable is allowed." msgstr "Μόνο μία μεταβλητή επιτρέπεται." #: src/language/stats/graph.c:843 msgid "Variable expected" msgstr "Αναμένεται Μεταβλητή" #: src/language/stats/graph.c:883 msgid "FOOTNOTE is not implemented yet for GRAPH" msgstr "FOOTNOTE δεν είναι ακόμα διαθέσιμο για την GRAPH" #: src/language/stats/ks-one-sample.c:274 src/ui/gui/ks-one-sample.ui:24 msgid "One-Sample Kolmogorov-Smirnov Test" msgstr "Τεστ Kolmogorov-Smirnov για 1-δείγμα" #: src/language/stats/ks-one-sample.c:284 msgid "Uniform Parameters" msgstr "Παράμετροι για Ομοιόμορφη" #: src/language/stats/ks-one-sample.c:289 msgid "Normal Parameters" msgstr "Παράμετροι για Κανονικότητα" #: src/language/stats/ks-one-sample.c:294 msgid "Poisson Parameters" msgstr "Παράμετροι για Poisson" #: src/language/stats/ks-one-sample.c:295 #: src/ui/gui/psppire-dialog-action-crosstabs.c:76 #: src/language/stats/crosstabs.q:1421 msgid "Lambda" msgstr "Lambda" #: src/language/stats/ks-one-sample.c:300 msgid "Exponential Parameters" msgstr "Παράμετροι για Εκθετική" #: src/language/stats/ks-one-sample.c:308 msgid "Most Extreme Differences" msgstr "Οι πιο Ακραίες Διαφορές" #: src/language/stats/ks-one-sample.c:309 msgid "Absolute" msgstr "Απόλυτο" #: src/language/stats/ks-one-sample.c:309 src/language/stats/roc.c:1037 msgid "Positive" msgstr "Θετικό" #: src/language/stats/ks-one-sample.c:309 src/language/stats/roc.c:1037 msgid "Negative" msgstr "Αρνητικό" #: src/language/stats/ks-one-sample.c:312 msgid "Kolmogorov-Smirnov Z" msgstr "Kolmogorov-Smirnov Z" #: src/language/stats/ks-one-sample.c:313 #: src/language/stats/jonckheere-terpstra.c:374 #: src/language/stats/mann-whitney.c:251 src/language/stats/runs.c:328 #: src/language/stats/wilcoxon.c:284 msgid "Asymp. Sig. (2-tailed)" msgstr "Ασυμπτ. Στ.Σημ. (2-κατ/νσης)" #: src/language/stats/logistic.c:327 msgid "All predicted values are either 1 or 0" msgstr "Όλες οι τιμές πρόβλεψης είναι είτε 1 ή 0" #: src/language/stats/logistic.c:525 msgid "Dependent variable's values are not dichotomous." msgstr "Οι τιμές της εξαρτημένης μεταβλητής δεν είναι διχοτομημένες." #: src/language/stats/logistic.c:614 #, c-format msgid "" "Category %s does not have at least two distinct values. Logistic regression " "will not be run." msgstr "" "Η Κατηγορία %s δεν έχει τουλάχιστον δύο διακριτές τιμές.Η Λογαριθμική " "Παλινδρόμηση δεν θα διεξαχθεί." #: src/language/stats/logistic.c:674 #, c-format msgid "" "Estimation terminated at iteration number %d because parameter estimates " "changed by less than %g" msgstr "" "Η Εκτίμηση σταμάτησε στην επ'αριθμό Επανάληψη %d επειδή οι εκτιμήσεις " "παραμέτρων άλλαξαν λιγότερο από %g" #: src/language/stats/logistic.c:686 #, c-format msgid "" "Estimation terminated at iteration number %d because Log Likelihood " "decreased by less than %g%%" msgstr "" "Η Εκτίμηση σταμάτησε στην επ'αριθμό iteration %d επειδή οι Λογαριθμηκές " "Πιθανότητες ελλατώθηκαν λιγότερο από %g%%" #: src/language/stats/logistic.c:701 #, c-format msgid "" "Estimation terminated at iteration number %d because maximum iterations has " "been reached" msgstr "" "Η Εκτίμηση σταμάτησε στην επ'αριθμό διαδοχή %d επειδή ο μέγιστος αριθμός " "διαδοχών γέμισε" #: src/language/stats/logistic.c:994 msgid "Cut point value must be in the range [0,1]" msgstr "Η Τιμή Απόρριψης πρέπει είναι στο εύρος [0,1]" #: src/language/stats/logistic.c:1139 msgid "Dependent Variable Encoding" msgstr "Κωδικοποίηση της Εξαρτημένης Μεταβλητής" #: src/language/stats/logistic.c:1141 msgid "Mapping" msgstr "Χαρτογράφηση" #: src/language/stats/logistic.c:1142 msgid "Internal Value" msgstr "Εσωτερική Τιμή" #: src/language/stats/logistic.c:1145 msgid "Original Value" msgstr "Αρχική Τιμή" #: src/language/stats/logistic.c:1167 msgid "Variables in the Equation" msgstr "Μεταβλητές στην Εξίσωση" #: src/language/stats/logistic.c:1171 src/language/stats/regression.c:902 msgid "B" msgstr "B" #: src/language/stats/logistic.c:1172 msgid "S.E." msgstr "Τ.Σ." #: src/language/stats/logistic.c:1173 msgid "Wald" msgstr "Wald" #: src/language/stats/logistic.c:1176 msgid "Exp(B)" msgstr "Εκθ(Β)" #: src/language/stats/logistic.c:1181 #, c-format msgid "%d%% CI for Exp(B)" msgstr "%d%% ΔΕ για Εκθ(B)" #: src/language/stats/logistic.c:1183 src/language/stats/t-test-indep.c:274 #: src/language/stats/t-test-one-sample.c:83 #: src/language/stats/t-test-paired.c:249 src/language/stats/crosstabs.q:1369 msgid "Lower" msgstr "Κατώτερο" #: src/language/stats/logistic.c:1183 src/language/stats/t-test-indep.c:275 #: src/language/stats/t-test-one-sample.c:84 #: src/language/stats/t-test-paired.c:250 src/language/stats/crosstabs.q:1370 msgid "Upper" msgstr "Ανώτερο" #: src/language/stats/logistic.c:1189 src/language/stats/logistic.c:1470 msgid "Step 1" msgstr "Βήμα 1" #: src/language/stats/logistic.c:1263 msgid "Constant" msgstr "Σταθερά" #: src/language/stats/logistic.c:1298 msgid "Model Summary" msgstr "Σύνοψη Μοντέλου" #: src/language/stats/logistic.c:1301 msgid "-2 Log likelihood" msgstr "-2 Λογ. πιθανότητα" #: src/language/stats/logistic.c:1302 msgid "Cox & Snell R Square" msgstr "Cox & Snell R Τετράγωνο" #: src/language/stats/logistic.c:1303 msgid "Nagelkerke R Square" msgstr "Nagelkerke R Τετράγωνο" #: src/language/stats/logistic.c:1306 src/language/stats/logistic.c:1470 msgid "Step" msgstr "Βήμα" #: src/language/stats/logistic.c:1335 msgid "Unweighted Cases" msgstr "Αστάθμητες Υποθέσεις" #: src/language/stats/logistic.c:1336 msgid "Included in Analysis" msgstr "Συμπεριλήφθηκε στην Ανάλυση" #: src/language/stats/logistic.c:1336 msgid "Missing Cases" msgstr "Ελλειπούσες Υποθέσεις" #: src/language/stats/logistic.c:1365 msgid "Categorical Variables' Codings" msgstr "Κωδικοποιήσεις Κατηγορικων Μεταβλητών" #: src/language/stats/logistic.c:1380 msgid "Codings" msgstr "Κωδικοποιήσεις" #: src/language/stats/logistic.c:1383 msgid "Parameter coding" msgstr "Κωδικοποίηση παραμέτρων" #: src/language/stats/logistic.c:1462 msgid "Classification Table" msgstr "Πίνακας Ταξινόμησης" #: src/language/stats/logistic.c:1466 msgid "Predicted" msgstr "Προβλέφθηκε" #: src/language/stats/logistic.c:1466 msgid "Percentage Correct" msgstr "Ποσοστό Σωστό" #: src/language/stats/logistic.c:1468 msgid "Observed" msgstr "Παρατηρήθηκε" #: src/language/stats/logistic.c:1468 msgid "Overall Percentage" msgstr "Συνολικό Ποσοστό" #: src/language/stats/jonckheere-terpstra.c:357 msgid "Jonckheere-Terpstra Test" msgstr "Jonckheere-Terpstra Τεστ" #: src/language/stats/jonckheere-terpstra.c:364 #, c-format msgid "Number of levels in %s" msgstr "Αριθμός επιπέδων στο %s" #: src/language/stats/jonckheere-terpstra.c:370 msgid "Observed J-T Statistic" msgstr "Παρατηρούμενο J-T" #: src/language/stats/jonckheere-terpstra.c:371 msgid "Mean J-T Statistic" msgstr "Μέσος όρος J-T" #: src/language/stats/jonckheere-terpstra.c:372 msgid "Std. Deviation of J-T Statistic" msgstr "Τυπική Απόκλιση J-T" #: src/language/stats/jonckheere-terpstra.c:373 msgid "Std. J-T Statistic" msgstr "Σταθμισμένο J-T" #: src/language/stats/mann-whitney.c:187 src/language/stats/wilcoxon.c:246 msgid "Sum of Ranks" msgstr "Άθροισμα των Κατατάταξεων" #: src/language/stats/mann-whitney.c:248 msgid "Mann-Whitney U" msgstr "Mann-Whitney U" #: src/language/stats/mann-whitney.c:249 msgid "Wilcoxon W" msgstr "Wilcoxon W" #: src/language/stats/mann-whitney.c:250 src/language/stats/runs.c:327 #: src/language/stats/wilcoxon.c:283 msgid "Z" msgstr "Z" #: src/language/stats/means.c:702 msgid "Included" msgstr "Περιλήφθηκε" #: src/language/stats/means.c:704 src/language/stats/reliability.c:548 msgid "Excluded" msgstr "Αποκλείστηκε" #: src/language/stats/means.c:753 msgid "Report" msgstr "Αναφορά" #: src/language/stats/means.c:838 #, c-format msgid "" "The table \"%s\" has no non-empty control variables. No result for this " "table will be displayed." msgstr "" "Ο πίνακας \"%s\" δεν έχει μη κενές μεταβλητές ελέγχου. Δεν θα εμφανιστεί " "αποτέλεσμα για αυτόν τον πίνακα." #: src/language/stats/means-calc.c:443 msgid "Group Median" msgstr "Διάμεσος Ομάδας" #: src/language/stats/means-calc.c:455 msgid "First" msgstr "Αρχικό" #: src/language/stats/means-calc.c:456 msgid "Last" msgstr "Τελευταίο" #: src/language/stats/means-calc.c:458 msgid "Percent N" msgstr "Ποσοστιαίο N" #: src/language/stats/means-calc.c:459 msgid "Percent Sum" msgstr "Ποσοστιαίο Σύνολο" #: src/language/stats/means-calc.c:461 msgid "Harmonic Mean" msgstr "Αρμονικός Μέσος" #: src/language/stats/means-calc.c:462 msgid "Geom. Mean" msgstr "Γεωμ. Μέσος" #: src/language/stats/mcnemar.c:144 msgid "The McNemar test is appropriate only for dichotomous variables" msgstr "Το τεστ McNemar είναι κατάλληλο μόνο για διχοτομημένες μεταβλητές" #: src/language/stats/mcnemar.c:226 src/language/stats/sign.c:105 msgid "Point Probability" msgstr "Πιθανότητα Σημείου" #: src/language/stats/mcnemar.c:229 src/language/stats/sign.c:78 #: src/language/stats/sign.c:108 src/language/stats/t-test-paired.c:199 #: src/language/stats/t-test-paired.c:257 src/language/stats/wilcoxon.c:253 #: src/language/stats/wilcoxon.c:292 msgid "Pairs" msgstr "Ζεύγη" #: src/language/stats/median.c:316 msgid "> Median" msgstr "> Διάμεσος" #: src/language/stats/median.c:316 msgid "≤ Median" msgstr "≤ Διάμεσος" #: src/language/stats/npar.c:536 #, c-format msgid "%s subcommand not currently implemented." msgstr "%s υποεντολή δεν είναι προς το παρόν διαθέσιμή." #: src/language/stats/npar.c:691 #, c-format msgid "Expecting %s, %s, %s or a number." msgstr "Αναμένεται %s, %s, %s ή κάποιος αριθμός." #: src/language/stats/npar.c:845 #, c-format msgid "" "The specified value of HI (%d) is lower than the specified value of LO (%d)" msgstr "" "Η δοσμένη τιμη στο HI (%d) είναι χαμηλότερη από τη δοσμένη τιμή στο LO (%d)" #: src/language/stats/npar.c:897 #, c-format msgid "" "%d expected values were given, but the specified range (%d-%d) requires " "exactly %d values." msgstr "" "%d αναμενόμενες τιμές δόθηκαν, αλλά το δοσμένο εύρος (%d-%d) απαιτεί " "επακριβώς %d τιμές." #: src/language/stats/npar.c:1118 src/language/stats/t-test-parser.c:173 #, c-format msgid "" "PAIRED was specified but the number of variables preceding WITH (%zu) did " "not match the number following (%zu)." msgstr "" "PAIRED έχει οριστεί αλλά ο αριθμός των μεταβλητών πριν την WITH (%zu) δεν " "είναι ο ίδιος αριθμός με αυτόν που ακολουθούν (%zu)." #: src/language/stats/oneway.c:361 msgid "LSD" msgstr "LSD" #: src/language/stats/oneway.c:362 src/ui/gui/oneway.ui:338 msgid "Tukey HSD" msgstr "Tukey HSD" #: src/language/stats/oneway.c:363 src/ui/gui/oneway.ui:253 msgid "Bonferroni" msgstr "Bonferroni" #: src/language/stats/oneway.c:364 src/ui/gui/oneway.ui:304 msgid "Scheffé" msgstr "Scheffé" #: src/language/stats/oneway.c:365 msgid "Games-Howell" msgstr "Games-Howell" #: src/language/stats/oneway.c:366 src/ui/gui/oneway.ui:321 msgid "Šidák" msgstr "Šidák" #: src/language/stats/oneway.c:519 #, c-format msgid "The post hoc analysis method %s is not supported." msgstr "Η μέθοδος Πολλαπλής Σύγκρισης %s δεν υποστηρίζεται." #: src/language/stats/oneway.c:842 #, c-format msgid "" "Dependent variable %s has no non-missing values. No analysis for this " "variable will be done." msgstr "" "Η Εξαρτημένη μεταβλητή %s δεν έχει ελλειπούσες τιμές. Δεν θα γίνει ανάλυση " "για τη μεταβλητή αυτή." #: src/language/stats/oneway.c:924 #, c-format msgid "" "In contrast list %zu, the number of coefficients (%zu) does not equal the " "number of groups (%d). This contrast list will be ignored." msgstr "" "Στη λίστα Συγκρίσεων %zu, ο αριθμός των συντελεστών (%zu) δεν ισούται τον " "αριθμό των ομάδων (%d). Αυτή η λίστα Συγκρίσεων θα αγνοηθεί." #: src/language/stats/oneway.c:936 #, c-format msgid "Coefficients for contrast %zu do not total zero" msgstr "Οι Συντελεστές της Σύγκρισης %zu δεν έχουν άθροισμα μηδέν" #: src/language/stats/oneway.c:971 msgid "ANOVA" msgstr "ANOVA" #: src/language/stats/oneway.c:974 src/language/stats/regression.c:1024 msgid "Sum of Squares" msgstr "Άθρ. Τετραγώνων" #: src/language/stats/oneway.c:981 msgid "Between Groups" msgstr "Μεταξύ Ομάδων" #: src/language/stats/oneway.c:981 msgid "Within Groups" msgstr "Εντός Ομάδων" #: src/language/stats/oneway.c:1075 src/language/stats/oneway.c:1257 msgid "Dependent Variable" msgstr "Εξαρτημένη Μεταβλητή" #: src/language/stats/oneway.c:1148 msgid "Test of Homogeneity of Variances" msgstr "Τεστ Ομοιογένειας Διακύμανσης" #: src/language/stats/oneway.c:1151 msgid "Levene Statistic" msgstr "Στατιστικό Levene" #: src/language/stats/oneway.c:1152 msgid "df1" msgstr "βθ.ελ.1" #: src/language/stats/oneway.c:1153 msgid "df2" msgstr "βθ.ελ.2" #: src/language/stats/oneway.c:1192 msgid "Contrast Coefficients" msgstr "Συντελεστές Σύγκρισης" #: src/language/stats/oneway.c:1199 src/language/stats/oneway.c:1246 msgid "Contrast" msgstr "Σύγκριση" #: src/language/stats/oneway.c:1236 msgid "Contrast Tests" msgstr "Τεστ Συγκρίσεων" #: src/language/stats/oneway.c:1239 msgid "Value of Contrast" msgstr "Τιμή Σύγκρισης" #: src/language/stats/oneway.c:1241 src/language/stats/regression.c:905 #: src/language/stats/t-test-indep.c:266 #: src/language/stats/t-test-one-sample.c:74 #: src/language/stats/t-test-paired.c:252 msgid "t" msgstr "t" #: src/language/stats/oneway.c:1252 msgid "Assumption" msgstr "Προϋπόθεση" #: src/language/stats/oneway.c:1253 msgid "Assume equal variances" msgstr "Υπόθεση Ίσων Διακυμάνσεων" #: src/language/stats/oneway.c:1254 msgid "Does not assume equal variances" msgstr "Δεν προϋποθέτει ίσες διακυμάνσεις" #: src/language/stats/oneway.c:1367 #, c-format msgid "Multiple Comparisons (%s)" msgstr "Πολλαπλές Συγκρίσεις (%s)" #: src/language/stats/oneway.c:1374 msgid "Mean Difference (I - J)" msgstr "Διαφορές Μέσου (I - J)" #: src/language/stats/oneway.c:1379 #, c-format msgid "%g%% Confidence Interval" msgstr "%g%% Διάστημα Εμπιστοσύνης" #: src/language/stats/oneway.c:1386 src/language/stats/oneway.c:1390 msgid "(J) Family" msgstr "(J) Οικογένεια" #: src/language/stats/oneway.c:1406 msgid "Test" msgstr "Τεστ" #: src/language/stats/quick-cluster.c:576 msgid "Initial Cluster Centers" msgstr "Αρχική Κεντροποίηση Συστάδων" #: src/language/stats/quick-cluster.c:577 msgid "Final Cluster Centers" msgstr "Τελική Κεντροποίηση Συστάδων" #: src/language/stats/quick-cluster.c:580 #: src/language/stats/quick-cluster.c:660 #: src/language/stats/quick-cluster.c:661 #: src/language/stats/quick-cluster.c:753 msgid "Cluster" msgstr "Συστάδα" #: src/language/stats/quick-cluster.c:658 msgid "Cluster Membership" msgstr "Συμμετοχή Συστάδων" #: src/language/stats/quick-cluster.c:744 msgid "Number of Cases in each Cluster" msgstr "Αριθμός Υποθέσεων σε κάθε Συστάδα" #: src/language/stats/quick-cluster.c:750 msgid "Clusters" msgstr "Συστάδες" #: src/language/stats/quick-cluster.c:867 #: src/language/stats/quick-cluster.c:893 #, c-format msgid "A variable called `%s' already exists." msgstr "Μία μεταβλητή ονομαζόμενη %s υπάρχει ήδη." #: src/language/stats/quick-cluster.c:908 #, c-format msgid "Expecting %s or %s." msgstr "Αναμένει %s ή %s." #: src/language/stats/quick-cluster.c:928 msgid "The number of clusters must be positive" msgstr "Ο αριθμός των Συστάδων πρέπει να είναι θετικός" #: src/language/stats/quick-cluster.c:944 msgid "The convergence criterion must be positive" msgstr "Ο αριθμός της σύγκλισης πρέπει να είναι θετικός" #: src/language/stats/quick-cluster.c:960 msgid "The number of iterations must be positive" msgstr "Ο αριθμός των Διαδοχών πρέπει να είναι θετικός" #: src/language/stats/rank.c:205 #, c-format msgid "" "Cannot generate variable name for ranking %s with %s. All candidates in use." msgstr "" "Δεν μπορεί να δημιουργηθεί όνομα μεταβλητής για τη κατάταξη της %s με την " "%s. Όλοι οι συνδυασμοί σε χρήση." #: src/language/stats/rank.c:321 #, c-format msgid "Too many variables in %s clause." msgstr "Πάρα πολλές μεταβλητές στην πρόταση %s." #: src/language/stats/rank.c:323 #, c-format msgid "Variable %s already exists." msgstr "Η μεταβλητή %s υπάρχει ήδη." #: src/language/stats/rank.c:325 src/language/expressions/evaluate.c:164 #, c-format msgid "Duplicate variable name %s." msgstr "Διπλότυπο όνομα μεταβλητής %s." #: src/language/stats/rank.c:631 #, c-format msgid "%s of %s by %s" msgstr "%s της %s από %s" #: src/language/stats/rank.c:825 msgid "Variables Created by RANK" msgstr "Μεταβλητές Δημιουργήθηκαν από την RANK" #: src/language/stats/rank.c:828 src/language/stats/rank.c:829 msgid "New Variable" msgstr "Νέα Μεταβλητή" #: src/language/stats/rank.c:829 msgid "Function" msgstr "Συνάρτηση" #: src/language/stats/rank.c:830 msgid "Fraction" msgstr "Κλάσμα" #: src/language/stats/rank.c:830 msgid "Grouping Variables" msgstr "Ομαδοποίηση Μεταβλητών" #: src/language/stats/rank.c:833 src/language/stats/rank.c:834 msgid "Existing Variable" msgstr "Υπάρχουσα Μεταβλητή" #: src/language/stats/reliability.c:164 msgid "Reliability on a single variable is not useful." msgstr "Η Αξιοπιστία για μία μόνο Μεταβλητή δεν είναι χρήσιμη." #: src/language/stats/reliability.c:281 msgid "" "The STATISTICS subcommand is not yet implemented. No statistics will be " "produced." msgstr "" "Η εντολή STATISTICS δεν είναι ακόμη διαθέσιμη. Δεν θα παραχθούν στατιστικά " "αποτελέσματα." #: src/language/stats/reliability.c:300 msgid "The split point must be less than the number of variables" msgstr "" "Το Σημείο Ημίσεων πρέπει να είναι μικρότερος από τον αριθμό των μεταβλητών" #: src/language/stats/reliability.c:525 #, c-format msgid "Scale: %s" msgstr "Κλίμακα: %s" #: src/language/stats/reliability.c:582 msgid "Item-Total Statistics" msgstr "Συνολικά Στατιστικά Πρότασης" #: src/language/stats/reliability.c:585 msgid "Scale Mean if Item Deleted" msgstr "ΜΟ κλίμακας αν η Πρόταση αφαιρεθεί" #: src/language/stats/reliability.c:586 msgid "Scale Variance if Item Deleted" msgstr "Διακύμανση Κλίμακας αν η Πρόταση αφαιρεθεί" #: src/language/stats/reliability.c:587 msgid "Corrected Item-Total Correlation" msgstr "Διορθομένη Συνολική Συσχέτιση Πρότασης" #: src/language/stats/reliability.c:588 msgid "Cronbach's Alpha if Item Deleted" msgstr "Cronbach's Alpha αν η Πρόταση αφαιρεθεί" #: src/language/stats/reliability.c:627 msgid "Reliability Statistics" msgstr "Στατιστικά Αξιοπιστίας" #: src/language/stats/reliability.c:634 src/language/stats/reliability.c:646 msgid "Cronbach's Alpha" msgstr "Cronbach's Alpha" #: src/language/stats/reliability.c:635 src/language/stats/reliability.c:649 #: src/language/stats/reliability.c:652 msgid "N of Items" msgstr "N Προτάσεων" #: src/language/stats/reliability.c:647 msgid "Part 1" msgstr "Μέρος 1" #: src/language/stats/reliability.c:650 msgid "Part 2" msgstr "Μέρος 2" #: src/language/stats/reliability.c:654 msgid "Total N of Items" msgstr "Συνολικό N Προτάσεων" #: src/language/stats/reliability.c:656 msgid "Correlation Between Forms" msgstr "Συσχετίσεις ανάμεσα σε Φόρμες" #: src/language/stats/reliability.c:659 msgid "Spearman-Brown Coefficient" msgstr "Spearman-Brown Συντελεστής" #: src/language/stats/reliability.c:660 msgid "Equal Length" msgstr "Ίδιου Μήκους" #: src/language/stats/reliability.c:661 msgid "Unequal Length" msgstr "Μη ίδιου Μήκους" #: src/language/stats/reliability.c:663 msgid "Guttman Split-Half Coefficient" msgstr "Guttman Συντελεστής Ημίσεων" #: src/language/stats/roc.c:966 msgid "Area Under the Curve" msgstr "Περιοχή κάτω από τη Καμπύλη" #: src/language/stats/roc.c:970 msgid "Area" msgstr "Περιοχή" #: src/language/stats/roc.c:976 msgid "Asymptotic Sig." msgstr "Ασυμπτ. Στ.Σημ." #: src/language/stats/roc.c:979 #, c-format msgid "Asymp. %g%% Confidence Interval" msgstr "Ασυμπτ. %g%% Διάστημα Εμπιστοσύνης" #: src/language/stats/roc.c:987 msgid "Variable under test" msgstr "Μεταβλητή υπό ανάλυση" #: src/language/stats/roc.c:1026 msgid "Case Summary" msgstr "Σύνοψη Υποθέσεων" #: src/language/stats/roc.c:1030 msgid "Unweighted" msgstr "Αστάθμητα" #: src/language/stats/roc.c:1031 msgid "Weighted" msgstr "Σταθμησμένα" #: src/language/stats/roc.c:1064 msgid "Coordinates of the Curve" msgstr "Συντεταγμένες της Καμπύλης" #: src/language/stats/roc.c:1068 msgid "Positive if greater than or equal to" msgstr "Θετικό αν μεγαλύτερο από ή ίσο με" #: src/language/stats/roc.c:1069 src/output/charts/roc-chart-cairo.c:38 msgid "Sensitivity" msgstr "Ευαισθησία" #: src/language/stats/roc.c:1069 src/output/charts/roc-chart-cairo.c:37 msgid "1 - Specificity" msgstr "1 - Ειδικότητα" #: src/language/stats/roc.c:1072 msgid "Coordinates" msgstr "Συντεταγμένες" #: src/language/stats/roc.c:1076 msgid "Test variable" msgstr "Μεταβλητή για Ανάλυση" #: src/language/stats/regression.c:224 src/language/stats/regression.c:229 #, c-format msgid "VARIABLES may not appear after %s" msgstr "VARIABLES μπορεί να μην εμφανίζονται μετά από %s" #: src/language/stats/regression.c:412 msgid "" "REGRESSION with SAVE ignores TEMPORARY. Temporary transformations will be " "made permanent." msgstr "" "REGRESSION με SAVE αγνοεί την TEMPORARY. Προσωρινές μετατροπές θα γίνουν " "μόνιμες." #: src/language/stats/regression.c:416 msgid "REGRESSION with SAVE ignores FILTER. All cases will be processed." msgstr "" "REGRESSION με SAVE αγνοεί την FILTER. Όλες οι υποθέσεις θα επεξεργαστούν." #: src/language/stats/regression.c:569 msgid "" "The dependent variable is equal to the independent variable. The least " "squares line is therefore Y=X. Standard errors and related statistics may be " "meaningless." msgstr "" "Η εξαρτημένη μεταβλητή είναι ίση με την ανεξάρτητη μεταβλητή. Για αυτό η " "γραμμή περιγραφής από τα Ελάχιστα Τετράγόνα είναι Y=X. Τα Τυπικά Σφάλματα " "και τα σχετικά στατιστικά είναι άχρηστα." #: src/language/stats/regression.c:776 msgid "No valid data found. This command was skipped." msgstr "Μη έγκυρα δεδομένα βρέθηκαν. Αυτή η εντολή δεν εκτελέστηκε." #: src/language/stats/regression.c:863 #, c-format msgid "Model Summary (%s)" msgstr "Σύνοψη Μοντέλου (%s)" #: src/language/stats/regression.c:868 #: src/ui/gui/psppire-dialog-action-regression.c:42 msgid "R" msgstr "R" #: src/language/stats/regression.c:868 msgid "R Square" msgstr "R Τετράγωνο" #: src/language/stats/regression.c:868 msgid "Adjusted R Square" msgstr "Προσ. R Τετράγωνο" #: src/language/stats/regression.c:869 msgid "Std. Error of the Estimate" msgstr "Τυπικό Σφάλμα Εκτίμησης" #: src/language/stats/regression.c:895 #, c-format msgid "Coefficients (%s)" msgstr "Συντελεστές (%s)" #: src/language/stats/regression.c:901 msgid "Unstandardized Coefficients" msgstr "Αστάθμιτοι Συντελεστές" #: src/language/stats/regression.c:904 msgid "Standardized Coefficients" msgstr "Σταθμισμένοι Συντελεστές" #: src/language/stats/regression.c:904 msgid "Beta" msgstr "β" #: src/language/stats/regression.c:911 #, c-format msgid "%g%% Confidence Interval for B" msgstr "%g%% Διάστημα Εμπιστοσύνης β" #: src/language/stats/regression.c:919 msgid "Collinearity Statistics" msgstr "Στατιστικά Συγγραμικότητας" #: src/language/stats/regression.c:920 msgid "Tolerance" msgstr "Tolerance" #: src/language/stats/regression.c:920 msgid "VIF" msgstr "VIF" #: src/language/stats/regression.c:933 msgid "(Constant)" msgstr "(Σταθερά)" #: src/language/stats/regression.c:1020 #, c-format msgid "ANOVA (%s)" msgstr "ANOVA (%s)" #: src/language/stats/regression.c:1031 src/ui/gui/regression.ui:24 msgid "Regression" msgstr "Παλινδρόμηση" #: src/language/stats/regression.c:1075 #, c-format msgid "Coefficient Correlations (%s)" msgstr "Συντελεστής Συσχετίσεων (%s)" #: src/language/stats/regression.c:1082 msgid "Models" msgstr "Μοντέλα" #: src/language/stats/regression.c:1090 msgid "Covariances" msgstr "Συνδιακυμάνσεις" #: src/language/stats/runs.c:169 #, c-format msgid "" "Multiple modes exist for variable `%s'. Using %.*g as the threshold value." msgstr "" "Πολλαπλές Επικρατούσες τιμές για τη μεταβλητή `%s'. Χρήση του %.*g σαν " "Κατώφλι τιμής." #: src/language/stats/runs.c:314 src/ui/gui/runs.ui:24 msgid "Runs Test" msgstr "Τεστ Ροών" #: src/language/stats/runs.c:319 msgid "Test Value" msgstr "Τιμή Τεστ" #: src/language/stats/runs.c:320 msgid "Test Value (mode)" msgstr "Τιμή Τεστ (Επικρατούσα)" #: src/language/stats/runs.c:321 msgid "Test Value (mean)" msgstr "Τιμή Τεστ (Μ.Ο.)" #: src/language/stats/runs.c:322 msgid "Test Value (median)" msgstr "Τιμή Τεστ (Διάμεσος)" #: src/language/stats/runs.c:323 msgid "Cases < Test Value" msgstr "Υποθέσεις < Τιμή Τεστ" #: src/language/stats/runs.c:324 msgid "Cases ≥ Test Value" msgstr "Υποθέσεις ≥ Τιμή Τεστ" #: src/language/stats/runs.c:325 msgid "Total Cases" msgstr "Συνολικές Υποθέσεις" #: src/language/stats/runs.c:326 msgid "Number of Runs" msgstr "Αριθμός Ροών" #: src/language/stats/sign.c:72 msgid "Differences" msgstr "Διαφορές" #: src/language/stats/sign.c:73 msgid "Negative Differences" msgstr "Αρνητικές Διαφορές" #: src/language/stats/sign.c:74 msgid "Positive Differences" msgstr "Θετικές Διαφορές" #: src/language/stats/sign.c:75 src/language/stats/wilcoxon.c:250 msgid "Ties" msgstr "Δέσμοι" #: src/language/stats/sort-cases.c:63 msgid "Buffer limit must be at least 2." msgstr "Το όριο του Ρυθμιστή πρέπει να είναι τουλάιχτον 2." #: src/language/stats/sort-criteria.c:89 #, c-format msgid "Variable %s specified twice in sort criteria." msgstr "Η μεταβλητή %s ορίστηκε δύο φορές στα Ταξινομικά Κριτήρια." #: src/language/stats/t-test-indep.c:190 msgid "Group Statistics" msgstr "Στατιστικά Ομάδας" #: src/language/stats/t-test-indep.c:200 msgid "Group" msgstr "Ομάδα" #: src/language/stats/t-test-indep.c:256 msgid "Independent Samples Test" msgstr "Τεστ Ανεξαρτήτων Δειγμάτων" #: src/language/stats/t-test-indep.c:261 msgid "Levene's Test for Equality of Variances" msgstr "Τεστ Levene για Ισότητα Διακυμάνσεων" #: src/language/stats/t-test-indep.c:265 msgid "T-Test for Equality of Means" msgstr "T-test για Ισότητα Μέσων" #: src/language/stats/t-test-indep.c:269 #: src/language/stats/t-test-one-sample.c:77 msgid "Mean Difference" msgstr "Διαφορές Μέσου" #: src/language/stats/t-test-indep.c:270 msgid "Std. Error Difference" msgstr "Τυπικό Σφάλμα Διαφορών" #: src/language/stats/t-test-indep.c:273 #, fuzzy, no-c-format #| msgid "95% Confidence Interval of the Difference" msgid "95% Confidence Interval of the Difference" msgstr "Διάστημα Εμπιστοσύνης Διαφοράς 95%" #: src/language/stats/t-test-indep.c:277 msgid "Assumptions" msgstr "Προϋποθέσεις" #: src/language/stats/t-test-indep.c:278 msgid "Equal variances assumed" msgstr "Υπόθεση Ίσων Διακυμάνσεων" #: src/language/stats/t-test-indep.c:279 msgid "Equal variances not assumed" msgstr "Υπ. Μη Ισων Διακυμάνσεων" #: src/language/stats/t-test-one-sample.c:64 msgid "One-Sample Test" msgstr "Μονο-Δειγματικό Τεστ" #: src/language/stats/t-test-one-sample.c:71 #, c-format msgid "Test Value = %.*g" msgstr "Τιμή Τεστ = %.*g" #: src/language/stats/t-test-one-sample.c:80 #: src/language/stats/t-test-paired.c:246 #, c-format msgid "%g%% Confidence Interval of the Difference" msgstr "%g%% Διάστημα Εμπιστοσύνης για Διαφορά" #: src/language/stats/t-test-one-sample.c:122 msgid "One-Sample Statistics" msgstr "Στατιστικά Μονο-Δειγματικού τεστ" #: src/language/stats/t-test-paired.c:147 msgid "Paired Sample Statistics" msgstr "Στατιστικά Εξαρτημένων Δειγμάτων" #: src/language/stats/t-test-paired.c:163 #: src/language/stats/t-test-paired.c:205 #: src/language/stats/t-test-paired.c:263 #, c-format msgid "Pair %zu" msgstr "Ζεύγος %zu" #: src/language/stats/t-test-paired.c:190 msgid "Paired Samples Correlations" msgstr "Συσχετίσεις Εξαρτημένων Δειγμάτων" #: src/language/stats/t-test-paired.c:208 #, c-format msgid "%s & %s" msgstr "%s & %s" #: src/language/stats/t-test-paired.c:234 msgid "Paired Samples Test" msgstr "Τεστ Εξαρτημένων Δειγμάτων" #: src/language/stats/t-test-paired.c:240 msgid "Paired Differences" msgstr "Διαφορές Ζεύγων" #: src/language/stats/t-test-paired.c:266 #, c-format msgid "%s - %s" msgstr "%s - %s" #: src/language/stats/t-test-parser.c:133 #, c-format msgid "When applying %s to a string variable, two values must be specified." msgstr "" "Στην εφαρμογή του %s σε μία μεταβλητή συμβολοσειράς, δύο τιμές πρέπει να " "ορίζονται." #: src/language/stats/t-test-parser.c:145 #: src/language/stats/t-test-parser.c:241 #, c-format msgid "%s subcommand may not be used with %s." msgstr "Η %s υποεντολή δεν μπορεί να χρησιμοποιηθεί με την %s." #: src/language/stats/t-test-parser.c:305 msgid "Exactly one of TESTVAL, GROUPS and PAIRS subcommands must be specified." msgstr "" "Μόνο μία από τις TESTVAL, GROUPS και PAIRS υποεντολές πρέπει να οριστεί." #: src/language/stats/wilcoxon.c:248 msgid "Sign" msgstr "Sign" #: src/language/stats/wilcoxon.c:249 msgid "Negative Ranks" msgstr "Αρνητικές Κατατάξεις" #: src/language/stats/wilcoxon.c:249 msgid "Positive Ranks" msgstr "Θετικές Κατατάξεις" #: src/language/stats/wilcoxon.c:296 msgid "Too many pairs to calculate exact significance" msgstr "Πάρα πολλά ζεύγη για υπολογισμό Επακριβής Στ.Σημ" #: src/language/data-io/combine-files.c:214 msgid "Cannot specify the active dataset since none has been defined." msgstr "" "Δεν μπορεί να ορίσεί ενεργή βάση δεδομένων, γιατί καμμία δεν έχει οριστεί." #: src/language/data-io/combine-files.c:220 msgid "" "This command may not be used after TEMPORARY when the active dataset is an " "input source. Temporary transformations will be made permanent." msgstr "" "Αυτή η εντολή δεν μπορεί να χρησιμοποιηθεί μετά την TEMPORARY όταν η ενεργή " "βάση δεδομένων είναι εισερχόμενη πηγή. Προσωρινές μετατροπές θα γίνουν " "μόνιμες." #: src/language/data-io/combine-files.c:255 msgid "Multiple IN subcommands for a single FILE or TABLE." msgstr "Πολλαπλά IN υποεντολές για ένα μόνο FILE ή TABLE." #: src/language/data-io/combine-files.c:308 #, c-format msgid "File %s lacks BY variable %s." msgstr "Στο αρχείο %s λείπει η BY μεταβλητή %s." #: src/language/data-io/combine-files.c:311 #, c-format msgid "Active dataset lacks BY variable %s." msgstr "Στην ενεργή βάση δεδομένων λείπει η BY μεταβλητή %s." #: src/language/data-io/combine-files.c:388 #: src/language/data-io/combine-files.c:393 #, c-format msgid "BY is required when %s is specified." msgstr "Η BY απαιτείται όταν η %s έχει οριστεί." #: src/language/data-io/combine-files.c:521 msgid "" "Combining files with incompatible encodings. String data may not be " "represented correctly." msgstr "" "Συνδυασμός αρχείων με ασύμβατες κωδικοποιήσεις. Τα δεδομένα συμβολοσειράς " "ίσως να μην παρουσιαστούν σωστά." #: src/language/data-io/combine-files.c:564 #, c-format msgid "" "Variable %s in file %s has different type or width from the same variable in " "earlier file." msgstr "" "Η μεταβλητή %s στο αρχείο %s έχει διαφορετικό τύπο ή εύρος από ότι σε ένα " "προηγούμενο αρχείο." #: src/language/data-io/combine-files.c:570 #, c-format msgid "In file %s, %s is numeric." msgstr "Στο αρχείο %s, η %s είναι αριθμητική numeric." #: src/language/data-io/combine-files.c:573 #, c-format msgid "In file %s, %s is a string variable with width %d." msgstr "Στο αρχείο %s,η %s είναι μία μεταβλητή συμβολοσειράς με εύρος %d." #: src/language/data-io/combine-files.c:578 #, c-format msgid "In an earlier file, %s was numeric." msgstr "Στο προηγούμενο αρχείο, η %s ήταν αριθμητική." #: src/language/data-io/combine-files.c:581 #, c-format msgid "In an earlier file, %s was a string variable with width %d." msgstr "Στο προηγούμενο αρχείο, η %s ήταν μεταβλητή συμβολοσειράς με εύρος %d." #: src/language/data-io/combine-files.c:621 #, c-format msgid "" "Variable name %s specified on %s subcommand duplicates an existing variable " "name." msgstr "" "Το όνομα μεταβλητής %s που ορίστηκε στην υποεντολή %s επαναλαμβάνει το όνομα " "μιας υπάρχουσας μεταβλητής." #: src/language/data-io/combine-files.c:793 #, c-format msgid "Encountered %zu sets of duplicate cases in the master file." msgstr "Βρέθηκαν %zu ζεύγη διπλότυπων υποθέσεων στο Κύριο αρχείο." #: src/language/data-io/data-list.c:129 src/language/data-io/data-list.c:144 #, c-format msgid "The %s value must be non-negative." msgstr "Η τιμή %s πρέπει να είναι μη-αρνητική." #: src/language/data-io/data-list.c:154 #, c-format msgid "The %s subcommand may only be used within %s." msgstr "Η υποεντολή %s μπορεί να γίνει χρήση της μόνο μέσω της %s." #: src/language/data-io/data-list.c:159 #, c-format msgid "The %s subcommand may only be specified once." msgstr "Η υποεντολή %s μπορεί να οριστεί μόνο μία φορά." #: src/language/data-io/data-list.c:197 msgid "Only one of FIXED, FREE, or LIST may be specified." msgstr "Μόνο μία από τις FIXED, FREE, ή LIST μπορεί να οριστεί." #: src/language/data-io/data-list.c:260 msgid "Encoding should not be specified for inline data. It will be ignored." msgstr "" "Η κωδικοποίηση δεν μπορεί να οριστεί για σωγραμμικά δεδομένα. Θα αγνοηθεί." #: src/language/data-io/data-list.c:269 #, c-format msgid "The %s subcommand may be used only with %s." msgstr "Η υποεντολή %s μπορεί να γίνει χρήση της μόνο μέσω της %s." #: src/language/data-io/data-list.c:284 src/language/data-io/matrix-data.c:578 msgid "At least one variable must be specified." msgstr "Τουλάχιστον μία μεταβλητή πρέπει να οριστεί." #: src/language/data-io/data-list.c:383 src/language/data-io/data-list.c:491 #: src/language/data-io/get-data.c:662 #, c-format msgid "%s is a duplicate variable name." msgstr "%s είναι διπλότυπο όνομα μεταβλητής." #: src/language/data-io/data-list.c:390 #, c-format msgid "There is already a variable %s of a different type." msgstr "Υπάρχει ήδη μία μεταβλητή %s αλλά διαφορετικού τύπου." #: src/language/data-io/data-list.c:397 #, c-format msgid "There is already a string variable %s of a different width." msgstr "Υπάρχει ήδη μία μεταβλητή συμβολοσειράς %s αλλά διαφορετικού μήκους." #: src/language/data-io/data-list.c:405 #, c-format msgid "Cannot place variable %s on record %d when RECORDS=%d is specified." msgstr "" "Δεν μπορεί να τοποθετήσει τη μεταβλητή %s στην εγγραφή %d όταν η RECORDS=%d " "έχει οριστεί." #: src/language/data-io/data-parser.c:453 #: src/language/data-io/data-parser.c:462 msgid "Quoted string extends beyond end of line." msgstr "Η παραθεμένη συμβολοσειρά εκετείνεται πέρα το τέλος της γραμμής." #: src/language/data-io/data-parser.c:488 msgid "Missing delimiter following quoted string." msgstr "Ελλειπούσσα υποδιαστολή στην ακόλουθη παραθεμένη συμβολοσειρά." #: src/language/data-io/data-parser.c:506 #, c-format msgid "Data for variable %s is not valid as format %s: %s" msgstr "Δεδομένα για την μεταβλητή %s δεν είναι έγκυρα με μορφότυπο %s: %s" #: src/language/data-io/data-parser.c:536 #, c-format msgid "Partial case of %d of %d records discarded." msgstr "Περικομμένη υπόθεση στην %d της %d εγγραφής αφέθηκε." #: src/language/data-io/data-parser.c:592 #, c-format msgid "Partial case discarded. The first variable missing was %s." msgstr "Περικομμένη υπόθεση αφέθηκε. Η πρώτη ελλειπούσσα μεταβλητή ήταν %s." #: src/language/data-io/data-parser.c:634 #, c-format msgid "" "Missing value(s) for all variables from %s onward. These will be filled " "with the system-missing value or blanks, as appropriate." msgstr "" "Ελλειπούσες τιμές για όλες τις μεταβλητές από %s και έπειτα. Αυτές θα " "αντικατασταθούν με Ελλειπούσες-Συστήματος ή κενά." #: src/language/data-io/data-parser.c:655 msgid "Record ends in data not part of any field." msgstr "Εγγραφή τελειώνει με ορφανά δεδομένα ." #: src/language/data-io/data-parser.c:670 #, c-format msgid "Reading %d record from %s." msgid_plural "Reading %d records from %s." msgstr[0] "Ανάγνωση εγγραφής %d από %s." msgstr[1] "Ανάγνωση εγγραφών %d από %s." #: src/language/data-io/data-parser.c:680 src/language/data-io/print.c:435 msgid "Record" msgstr "Εγγραφή" #: src/language/data-io/data-parser.c:680 src/language/data-io/print.c:435 #: src/ui/gui/psppire-var-sheet-header.c:76 msgid "Columns" msgstr "Στήλες" #: src/language/data-io/data-parser.c:680 #: src/language/data-io/data-parser.c:725 src/language/data-io/print.c:435 msgid "Format" msgstr "Μορφοποίηση" #: src/language/data-io/data-parser.c:720 #, c-format msgid "Reading free-form data from %s." msgstr "Ανάγνωση μη ορισμένου τύπου δεδομένων από %s." #. TRANSLATORS: this fragment will be interpolated into #. messages in fh_lock() that identify types of files. #: src/language/data-io/data-reader.c:136 src/language/data-io/data-writer.c:79 msgid "data file" msgstr "αρχείο δεδομένων" #: src/language/data-io/data-reader.c:160 #, c-format msgid "Could not open `%s' for reading as a data file: %s." msgstr "Δεν μπορεί να ανοιχθεί `%s' για ανάγνωση σαν αρχείο δεδομένων: %s." #: src/language/data-io/data-reader.c:174 #, c-format msgid "Could not read `%s' as a text file with encoding `%s': %s." msgstr "" "Δεν μπορεί να γίνει ανάγνωση `%s' σαν αρχείο κειμένου με κωδικοποίηση `%s': " "%s." #: src/language/data-io/data-reader.c:233 #, c-format msgid "" "Missing %s while reading inline data. This probably indicates a missing or " "incorrectly formatted %s command. %s must appear by itself on a single line " "with exactly one space between words." msgstr "" "Ελλειπούσα %s ενώ γίνεται ανάγνωση σωγραμμικών δεδομένων. Υποδυκνύει πιθανόν " "ελλειπούσα ή εσφαλμένη μορφή εντολής %s. %s πρέπει να εμφανίζεται σε μία " "γραμμή μόνο, μόνη της με ακριβώς ένα κενό μεταξύ λέξεων." #: src/language/data-io/data-reader.c:253 #: src/language/data-io/data-reader.c:387 #, c-format msgid "Error reading file %s: %s." msgstr "Σφάλμα ανάγνωσης αρχείου %s: %s." #: src/language/data-io/data-reader.c:261 #, c-format msgid "Unexpected end of file in partial record reading %s." msgstr "Μη αναμενόμενο τέλος αρχείου σε περικομμένη εγγραφή ανάγνωσης %s." #: src/language/data-io/data-reader.c:321 #, c-format msgid "Corrupt block descriptor word at offset 0x%lx in %s." msgstr "Αλλοιωμένος Αναγνωριστής λέξης μπλόκου στο σημείο 0x%lx στο %s." #: src/language/data-io/data-reader.c:322 #, c-format msgid "Corrupt record descriptor word at offset 0x%lx in %s." msgstr "Αλλοιωμένη εγγραφή Αναγνωριστή λέξης στο σημείο 0x%lx στο %s." #: src/language/data-io/data-reader.c:335 #, c-format msgid "Corrupt record size at offset 0x%lx in %s." msgstr "Αλλοιωμένη εγγραφή μεγέθους στο σημείο 0x%lx στο %s." #: src/language/data-io/data-reader.c:493 msgid "Record exceeds remaining block length." msgstr "Η Εγγραφή υπερβαίνει το μέγεθος καταχωρητή." #: src/language/data-io/data-reader.c:567 #, c-format msgid "Attempt to read beyond end-of-file on file %s." msgstr "Προσπάθεια ανάγνωσης πέρας-το-τέλος στο αρχείο %s." #: src/language/data-io/data-reader.c:570 #, c-format msgid "Attempt to read beyond %s." msgstr "Προσπάθεια ανάγνωσης πέρας του %s." #: src/language/data-io/data-reader.c:733 msgid "" "This command is not valid here since the current input program does not " "access the inline file." msgstr "" "Αυτή η εντολή δεν είναι έγκυρη εδώ αφού το παρόν εισερχόμενο Πρόγραμμα δεν " "έχει πρόσβαση στο σωγραμμικό αρχείο." #: src/language/data-io/data-writer.c:106 #, c-format msgid "An error occurred while opening `%s' for writing as a data file: %s." msgstr "" "Ένα σφάλμα προέκυψε στη διάρκεια του ανοίγματος `%s' για την εγγραφή του ως " "αρχείο δεδομένων: %s." #: src/language/data-io/data-writer.c:224 #, c-format msgid "I/O error occurred writing data file `%s'." msgstr "I/O σφάλμα προέκυψε στην εγγραφή του αρχείου δεδομένων `%s'." #: src/language/data-io/dataset.c:64 #, c-format msgid "There is no dataset named %s." msgstr "Δεν υπάρχει βάση δεδομένων με το όνομα %s." #: src/language/data-io/dataset.c:250 msgid "Datasets" msgstr "Βάση δεδομένων" #: src/language/data-io/dataset.c:263 msgid "unnamed dataset" msgstr "δεδομένα δίχως όνομα" #: src/language/data-io/file-handle.c:61 #, c-format msgid "" "File handle %s is already defined. Use %s before redefining a file handle." msgstr "" "Η λαβή αρχείου %s έχει ήδη οριστεί. Χρήση της %s πριν τον επαναπροσδιορισμό " "της." #: src/language/data-io/file-handle.c:241 #, c-format msgid "%s must be specified with %s." msgstr "%s πρέπει να οριστεί με %s." #: src/language/data-io/file-handle.c:252 #, c-format msgid "" "The specified file mode requires LRECL. Assuming %zu-character records." msgstr "" "Η δοσμένη μορφή αρχείου απαιτεί LRECL. Υποθέτοντας %zu-χαρακτήρες εγγραφής." #: src/language/data-io/file-handle.c:256 #, c-format msgid "" "Record length (%d) must be between 1 and %lu bytes. Assuming %zu-character " "records." msgstr "" "Το μήκος της εγγραφής (%d) πρέπει να είναι μεταξύ 1 και %lu διφύα. " "Υποθέτωντας %zu-χαρακτήρες εγγραφής." #: src/language/data-io/file-handle.c:300 msgid "file" msgstr "αρχείο" #: src/language/data-io/file-handle.c:302 msgid "inline file" msgstr "στην ίδια γραμμή αρχείου" #: src/language/data-io/file-handle.c:350 msgid "expecting a file name or handle name" msgstr "αναμένει όνομα αρχείου ή ψευδώνυμο" #: src/language/data-io/file-handle.c:365 #, c-format msgid "Handle for %s not allowed here." msgstr "Χειρισμός για %s δεν επιτρέπεται εδώ." #: src/language/data-io/get-data.c:108 src/output/measure.c:262 #, c-format msgid "error reading file `%s'" msgstr "σφάλμα ανάγνωσης αρχείου `%s'" #: src/language/data-io/get-data.c:127 #, c-format msgid "Unsupported TYPE %s." msgstr "Μη υποστηρίζομενο TYPE %s." #: src/language/data-io/get-data.c:278 msgid "The sheet index must be greater than or equal to 1" msgstr "" "Ο καταχωρητής του υπολογιστικού φύλλου πρέπει να είναι μεγαλύτερος ή ίσος " "του 1" #: src/language/data-io/get-data.c:285 src/language/data-io/get-data.c:308 #: src/language/data-io/get-data.c:327 #, c-format msgid "%s must be followed by either \"%s\" or \"%s\"." msgstr "%s πρέπει να ακολουθείται από \"%s\" ή \"%s\"." #: src/language/data-io/get-data.c:357 #, c-format msgid "" "%s is allowed only with %s arrangement, but %s arrangement was stated or " "implied earlier in this command." msgstr "" "%s επιτρέπεται μόνο με %s την διευθέτηση, αλλά η %s διευθέτηση δηλώθηκε ή " "υπονοήθηκε πρότερα στην εντολή αυτή." #: src/language/data-io/get-data.c:441 src/language/data-io/get-data.c:479 #, c-format msgid "Value of %s must be 1 or greater." msgstr "Η τιμή της %s πρέπει να είναι ίση με 1 ή μεγαλύτερη." #: src/language/data-io/get-data.c:504 msgid "" "Ignoring obsolete IMPORTCASES subcommand. (N OF CASES or SAMPLE may be used " "to substitute.)" msgstr "" "Αγνόηση της απαρχαιωμένης IMPORTCASES υποεντολής. (N OF CASES ή SAMPLE ίσως " "μπορεί να γίνει χρήση τους σαν αντικατάσταση.)" #: src/language/data-io/get-data.c:551 msgid "" "In compatible syntax mode, the QUALIFIER string must contain exactly one " "character." msgstr "" "Σε συμβατή λειτουργία σύνταξης, η συμβολοσειρά QUALIFIER πρέπει να περιέχει " "ακριβώς έναν χαρακτήρα." #: src/language/data-io/get-data.c:583 #, c-format msgid "" "The record number specified, %ld, is at or before the previous record, %d. " "Data fields must be listed in order of increasing record number." msgstr "" "Ο αριθμός εγγραφής που ορίστηκε, %ld, είναι στο ή πριν από την προηγούμενη " "εγγραφή, %d. Τα πεδία δεδομένων πρέπει να είναι καταγεγραμμένα για να " "αυξηθεί ο αριθμός εγγραφής." #: src/language/data-io/get-data.c:592 #, c-format msgid "" "The record number specified, %ld, exceeds the number of records per case " "specified on FIXCASE, %d." msgstr "" "Ο αριθμός εγγραφής που ορίστηκε, %ld, υπερβαίνει τον αριθμό εγγραφών ανά " "υπόθεση όπως ορίστηκε στην FIXCASE, %d." #: src/language/data-io/get.c:132 #, c-format msgid "%s: Data file dictionary has no variables." msgstr "%s: Ο κατάλογος του αρχείου δεδομένων δεν έχει μεταβλητές." #: src/language/data-io/inpt-pgm.c:133 #, c-format msgid "Unexpected end-of-file within %s." msgstr "Μη αναμενόμενο τέλος-αρχείου στο %s." #: src/language/data-io/inpt-pgm.c:146 #, c-format msgid "Input program must contain %s or %s." msgstr "Το εισερχόμενο πρόγραμμα πρέπει να περιέχει είτε %s ή %s." #: src/language/data-io/inpt-pgm.c:152 msgid "Input program did not create any variables." msgstr "Το εισερχόμενο πρόγραμμα δεν δημιούργησε καμία μεταβλητή." #: src/language/data-io/inpt-pgm.c:365 msgid "" "REREAD: Column numbers must be positive finite numbers. Column set to 1." msgstr "" "REREAD: Οι αριθμοί στηλών πρέπει να είναι θετικοί πεπερασμένοι αριθμοί. Ο " "αρ. στήλης τέθηκε ως 1." #: src/language/data-io/list.c:100 msgid "Data List" msgstr "Βάση Λίστας" #: src/language/data-io/list.c:221 #, c-format msgid "" "The first case (%ld) specified precedes the last case (%ld) specified. The " "values will be swapped." msgstr "" "H 1η ορισμένη υπόθεση (%ld) προηγείται της τελευταίας υπόθεσης (%ld) που " "ορίστηκε. Οι τιμές πρέπει να ανταλλαχθούν." #: src/language/data-io/list.c:230 #, c-format msgid "" "The first case (%ld) to list is numbered less than 1. The value is being " "reset to 1." msgstr "" "Η πρώτη υπόθεση (%ld) στη λίστα είναι αριθμημένη κάτω από ένα. Η τιμή " "ορίζεται σε 1." #: src/language/data-io/list.c:237 #, c-format msgid "" "The last case (%ld) to list is numbered less than 1. The value is being " "reset to 1." msgstr "" "Η τελευταία υπόθεση (%ld) στη λίστα είναι αριθμημένη κάτω από ένα. Η τιμή " "ορίζεται σε 1." #: src/language/data-io/list.c:244 #, c-format msgid "The step value %ld is less than 1. The value is being reset to 1." msgstr "H τιμή διαδοχής %ld είναι κάτω από 1. Η τιμή ορίζεται σε 1." #: src/language/data-io/placement-parser.c:96 #, c-format msgid "" "Number of variables specified (%zu) differs from number of variable formats " "(%zu)." msgstr "" "Ο αριθμός μεταβλητών που ορίστηκε (%zu) διαφέρει από τον αριθμό μορφοποίησης " "μεταβλητών (%zu)." #: src/language/data-io/placement-parser.c:106 msgid "" "SPSS-like or Fortran-like format specification expected after variable names." msgstr "SPSS ή Fortran μορφότυπος αναμένεται έπειτα από το όνομα μεταβλητών." #: src/language/data-io/placement-parser.c:129 #, c-format msgid "The %d columns %d-%d can't be evenly divided into %zu fields." msgstr "Οι %d στήλες %d-%d δεν μπορούν να διαιρεθούν ζυγά σε %zu πεδία." #: src/language/data-io/placement-parser.c:310 msgid "Column positions for fields must be positive." msgstr "Οι θέσεις στηλών για πεδία πρέπει να είναι θετικά." #: src/language/data-io/placement-parser.c:312 msgid "Column positions for fields must not be negative." msgstr "Οι θέσεις στηλών για πεδία δεν πρέπει να είναι αρνητικά." #: src/language/data-io/placement-parser.c:372 msgid "The ending column for a field must be greater than the starting column." msgstr "" "Η τελευταία στήλη για ένα πεδίο πρέπει να είναι μεγαλύτερο από την πρώτη " "στήλη." #: src/language/data-io/placement-parser.c:409 #, fuzzy, c-format #| msgid "" #| "The record number specified, %ld, is at or before the previous record, " #| "%d. Data fields must be listed in order of increasing record number." msgid "" "The record number specified, %.0f, is at or before the previous record, %d. " "Data fields must be listed in order of increasing record number." msgstr "" "Ο αριθμός εγγραφής που ορίστηκε, %ld, είναι στο ή πριν από την προηγούμενη " "εγγραφή, %d. Τα πεδία δεδομένων πρέπει να είναι καταγεγραμμένα για να " "αυξηθεί ο αριθμός εγγραφής." #: src/language/data-io/print-space.c:127 #, c-format msgid "The expression on %s evaluated to the system-missing value." msgstr "Η έκφραση στο %s εκτιμήθηκε σαν τιμή Ελλειπούσα-Συστήματος." #: src/language/data-io/print-space.c:130 #, c-format msgid "The expression on %s evaluated to %g." msgstr "Η έκφραση στην %s εκτιμήθηκε σαν %g." #: src/language/data-io/print.c:189 src/language/data-io/trim.c:58 msgid "expecting a valid subcommand" msgstr "αναμένει μία έγκυρη υπο-εντολή" #: src/language/data-io/print.c:219 #, c-format msgid "%s is required when binary formats are specified." msgstr "%s απαιτείται όταν Δυαδικές μορφές ορίζονται." #: src/language/data-io/print.c:302 #, c-format msgid "Output calls for %d records but %zu specified on RECORDS subcommand." msgstr "" "Η εξαγωγή αναζητά %d εγγραφές αλλά %zu ορίστηκαν στην υποεντολή RECORDS." #: src/language/data-io/print.c:432 msgid "Print Summary" msgstr "Εκτυπωμένη Σύνοψη" #: src/language/data-io/print.c:462 msgid "N of Records" msgstr "Ν Εγγραφές" #: src/language/data-io/matrix-data.c:191 #, c-format msgid "" "There are %d variable declared but the data has at least %d matrix rows." msgstr "" "Υπάρχουν %d μεταβλητές δηλωμένες αλλά τα δεδομένα έχουν τουλάχιστον %d " "γραμμές στον πίνακα." #: src/language/data-io/matrix-data.c:292 msgid "" "The N subcommand was specified, but a N record was also found in the data. " "The N record will be ignored." msgstr "" "Η N υπο-εντολή ορίστηκε, αλλά μία N εγγραφή βρέθηκε στα δεδομένα. Η N " "εγγραφή θα αγνοηθεί." #: src/language/data-io/matrix-data.c:488 src/language/utilities/set.q:186 #, c-format msgid "%s must not be negative." msgstr "%s δεν πρέπει να είναι αρνητικό." #: src/language/data-io/matrix-data.c:568 msgid "FORMAT = FULL and FORMAT = NODIAGONAL are mutually exclusive." msgstr "FORMAT = FULL και FORMAT = NODIAGONAL είναι αμοιβαία αποκλειώμενα." #: src/language/data-io/matrix-reader.c:102 #: src/language/data-io/matrix-reader.c:118 #, c-format msgid "Matrix dataset lacks a variable called %s." msgstr "Στην ενεργή βάση δεδομένων λείπει η BY μεταβλητή %s." #: src/language/data-io/matrix-reader.c:109 #: src/language/data-io/matrix-reader.c:125 #, c-format msgid "Matrix dataset variable %s should be of string type." msgstr "" "Η μεταβλητή δεδομένων στον πίνακα %s πρέπει να είναι τύπου συμβολοσειρά." #: src/language/data-io/save-translate.c:168 #: src/language/data-io/save-translate.c:183 #, c-format msgid "The %s string must contain exactly one character." msgstr "Η συμβολοσειρά %s πρέπει να περιέχει ακριβώς έναν χαρακτήρα." #: src/language/data-io/save-translate.c:249 #, c-format msgid "Output file `%s' exists but %s was not specified." msgstr "Το εξαγώμενο αρχείο `%s' υπάρχει αλλά %s δεν ορίστηκε." #: src/language/data-io/save.c:309 msgid "The OUTFILE or METADATA subcommand is required." msgstr "Το OUTFILE ή METADATA εντολή απαιτείτε." #: src/language/data-io/trim.c:69 #, c-format msgid "" "Cannot rename %s as %s because there already exists a variable named %s. To " "rename variables with overlapping names, use a single RENAME subcommand such " "as `/RENAME (A=B)(B=C)(C=A)', or equivalently, `/RENAME (A B C=B C A)'." msgstr "" "Δεν μπορεί να μετονομάσει %s σε %s επειδή υπάρχει ήδη μία μεταβλητή με όνομα " "%s. Για την μετονομασία μεταβλητών με επικαλυπτόμενα ονόματα, κάνε χρήση " "μιάς μόνο υποεντολής RENAME όπως `/RENAME (A=B)(B=C)(C=A)', ή κάποια " "παρόμοια, `/RENAME (A B C=B C A)'." #: src/language/data-io/trim.c:227 #, c-format msgid "" "Number of variables on left side of `=' (%zu) does not match number of " "variables on right side (%zu), in parenthesized group %d of RENAME " "subcommand." msgstr "" "Αριθμός μεταβλητών στο αριστερό άκρο της `=' (%zu) δεν ταιριάζει στον αριθμό " "μεταβλητών στη δεξιά μεριά (%zu), μέσα στο παρενθετική ομάδα %d της " "υποεντολής RENAME." #: src/language/data-io/trim.c:242 #, c-format msgid "Requested renaming duplicates variable name %s." msgstr "Απαιτείται η μετονομασία δυπλότυπων ονομάτων μεταβλητών %s." #: src/language/data-io/trim.c:281 msgid "Cannot DROP all variables from dictionary." msgstr "Δεν μπορεί να γίνει DROP (απόρριψη) όλων των μεταβλητών από την λίστα." #: src/language/expressions/evaluate.c:151 msgid "expecting number or string" msgstr "αναμένει αριθμό ή συμβολοσειρά" #: src/language/expressions/helpers.c:43 msgid "" "One of the arguments to a DATE function is not an integer. The result will " "be system-missing." msgstr "" "Ένα από τα ορίσματα στην DATE (ημ/νία) δεν είναι ακέραιος. Το αποτέλεσμα θα " "είναι Ελλειπούσες τιμές-Συστήματος." #: src/language/expressions/helpers.c:71 msgid "" "The week argument to DATE.WKYR is not an integer. The result will be system-" "missing." msgstr "" "Το όρισμα για εβδομάδα στην DATE.WKYR δεν είναι ακέραιος. Το αποτέλεσμα θα " "είναι Ελλειπούσες τιμές-Συστήματος." #: src/language/expressions/helpers.c:77 msgid "" "The week argument to DATE.WKYR is outside the acceptable range of 1 to 53. " "The result will be system-missing." msgstr "" "Το όρισμα στην DATE.WKYR είναι εκτός αποδεκτού ορίου από 1 ως 53. Το " "αποτέλεσμα θα είναι Ελλειπούσες τιμές-Συστήματος." #: src/language/expressions/helpers.c:99 msgid "" "The day argument to DATE.YRDAY is not an integer. The result will be system-" "missing." msgstr "" "Το όρισμα Ημέρας στην DATE.YRDAY δεν είναι ακέραιος. Το αποτέλεσμα θα είναι " "Ελλειπούσες τιμές-Συστήματος." #: src/language/expressions/helpers.c:105 msgid "" "The day argument to DATE.YRDAY is outside the acceptable range of 1 to 366. " "The result will be system-missing." msgstr "" "Το όρισμα στην DATE.YRDAY είναι εκτός αποδεκτού ορίου από 1 ως 366. Το " "αποτέλεσμα θα είναι Ελλειπούσες τιμές-Συστήματος." #: src/language/expressions/helpers.c:127 msgid "" "The year argument to YRMODA is greater than 47516. The result will be " "system-missing." msgstr "" "Το όρισμα Έτους στην YRMODA είναι μεγαλύτερο από 47516. Το αποτέλεσμα θα " "είναι Ελλειπούσες τιμές-Συστήματος." #: src/language/expressions/helpers.c:180 #, c-format msgid "" "Unrecognized date unit `%.*s'. Valid date units are `%s', `%s', `%s', `%s', " "`%s', `%s', `%s', and `%s'." msgstr "" "Μη αποδεκτή μονάδα Ημερομηνίας `%.*s'. Αποδεκτές μονάδες Ημερομηνίας είναι `" "%s', `%s', `%s', `%s', `%s', `%s', `%s', and `%s'." #: src/language/expressions/helpers.c:333 #, c-format msgid "Invalid DATESUM method. Valid choices are `%s' and `%s'." msgstr "Μη έγκυρη μέθοδος DATESUM. Έγκτυρες επιλογές είναι `%s' και `%s'." #: src/language/expressions/parse.c:261 #, c-format msgid "" "Type mismatch: expression has %s type, but a numeric value is required here." msgstr "" "Αναντιστοιχία τύπου: η έκφραση έχει τύπο %s, αλλά μία αριθμητική τιμή " "απαιτείται." #: src/language/expressions/parse.c:274 #, c-format msgid "" "Type mismatch: expression has %s type, but a string value is required here." msgstr "" "Αναντιστοιχία τύπου: η έκφραση έχει τύπο %s, αλλά μία συμβολοσειρά " "απαιτείται." #: src/language/expressions/parse.c:436 #, c-format msgid "Type mismatch while applying %s operator: cannot convert %s to %s." msgstr "" "Αναντιστοιχία τύπου κατά την εφαρμογή του τελεστή %s, αδυναμία μετατροπής " "του %s σε %s." #: src/language/expressions/parse.c:650 msgid "" "Chaining relational operators (e.g. `a < b < c') will not produce the " "mathematically expected result. Use the AND logical operator to fix the " "problem (e.g. `a < b AND b < c'). If chaining is really intended, " "parentheses will disable this warning (e.g. `(a < b) < c'.)" msgstr "" "Αλυσιδωτοί Σχεσιακοί Τελεστές (ΑΣΤ) (π.χ. `a < b < c') δεν θα παράγουν " "τοαναμενόμενο μαθηματικό αποτέλεσμα. Χρήση του λογικού τελεστή AND (ΚΑΙ) για " "την επίλυση αυτού (π.χ. `a < b AND b < c'). Αν οι ΑΣΤ είναι αναγκαίοι, " "χρήση παρενθέσεων θα απενεργοποιήσει το μήνυμα αυτό (π.χ. `(a < b) < c'.)" #: src/language/expressions/parse.c:752 msgid "" "The exponentiation operator (`**') is left-associative, even though right-" "associative semantics are more useful. That is, `a**b**c' equals " "`(a**b)**c', not as `a**(b**c)'. To disable this warning, insert " "parentheses." msgstr "" "Ο εκθετικός τελεστής (`**') είναι αριστερό-σχετιστής, αν και δεξιο-" "σχετισμοίείναι πιο χρήσιμοι. Δηλαδή, `a**b**c' ισοδυναμε με `(a**b)**c', και " "όχι `a**(b**c)'. Για την απενεργοποίηση αύτου του μηνύματος, κάνε χρήση " "παρενθέσεων." #: src/language/expressions/parse.c:832 #, c-format msgid "Unknown system variable %s." msgstr "Άγνωστη μεταβλητή συστήματος %s." #: src/language/expressions/parse.c:880 #, c-format msgid "Unknown identifier %s." msgstr "Άγνωστος αναγνώστης %s." #: src/language/expressions/parse.c:1102 #, c-format msgid "%s must have at least %d arguments in list." msgstr "%s πρέπει να έχει τουλάχιστον %d ορίσματα στην λίστα." #: src/language/expressions/parse.c:1111 #, c-format msgid "%s must have an even number of arguments in list." msgstr "%s πρέπει να έχει ζυγό αριθμό ορισμάτων στη λίστα." #: src/language/expressions/parse.c:1114 #, c-format msgid "%s must have multiple of %d arguments in list." msgstr "Η %s πρέπει να έχει πολλαπλά ορίσματα της %d στη λίστα." #: src/language/expressions/parse.c:1124 #, c-format msgid "%s function does not accept a minimum valid argument count." msgstr "%s συνάρτηση δεν δέχεται έγκυρο όρισμα ελάχιστης τιμής." #: src/language/expressions/parse.c:1133 #, c-format msgid "%s requires at least %d valid arguments in list." msgstr "%s απαιτεί τουλάχιστον %d έγκυρα ορίσματα στη λίστα." #: src/language/expressions/parse.c:1139 #, c-format msgid "" "With %s, using minimum valid argument count of %d does not make sense when " "passing only %d arguments in list." msgstr "" "Με την %s, χρήση έγκυρου ορίσματος ελάχιστης τιμής της %d δεν έχει νόημα " "όταν κάνεις χρήση μόνο %d ορισμάτων λίστας." #: src/language/expressions/parse.c:1193 #, c-format msgid "Type mismatch invoking %s as " msgstr "Αναντιστοιχία τύπου προκαλεί %s σαν " #: src/language/expressions/parse.c:1198 msgid "Function invocation " msgstr "Συνάρτηση επίκλησης " #: src/language/expressions/parse.c:1200 msgid " does not match any known function. Candidates are:" msgstr " δεν έχει αντιστοιχία με καμμία γνωστή συνάρτηση. Επιλογές είναι:" #: src/language/expressions/parse.c:1230 #, c-format msgid "No function or vector named %s." msgstr "Δεν υπάρχει συνάρτηση ή διάνυσμα με όνομα %s." #: src/language/expressions/parse.c:1292 #, c-format msgid "%s is a PSPP extension." msgstr "%s είναι μια PSPP κατάληξη." #: src/language/expressions/parse.c:1295 #, c-format msgid "%s is not available in this version of PSPP." msgstr "%s δεν είναι διαθέσιμη στην έκδοση αυτή του PSPP." #: src/language/expressions/parse.c:1302 #, c-format msgid "%s may not appear after %s." msgstr "%s μπορεί να μην εμφανιστεί έπειτα της %s." #: src/libpspp/ext-array.c:66 msgid "failed to create temporary file" msgstr "αποτυχία δημιουργίας πρόχειρου αρχείου" #: src/libpspp/ext-array.c:106 msgid "seeking in temporary file" msgstr "αναζήτηση στο πρόχειρο αρχείο" #: src/libpspp/ext-array.c:125 msgid "reading temporary file" msgstr "διάβασμα πρόχειρου αρχείου" #: src/libpspp/ext-array.c:127 msgid "unexpected end of file reading temporary file" msgstr "ανεπιτυχή τερματισμό αρχείου ανάγνωση προσωρινού αρχείου" #: src/libpspp/ext-array.c:147 msgid "writing to temporary file" msgstr "δημιουργία πρόχειρου αρχείου" #: src/libpspp/i18n.c:1128 msgid "Arabic" msgstr "Αραβικά" #: src/libpspp/i18n.c:1130 msgid "Armenian" msgstr "Αρμενικά" #: src/libpspp/i18n.c:1131 msgid "Baltic" msgstr "Βαλτικά" #: src/libpspp/i18n.c:1133 msgid "Celtic" msgstr "Κέλτικα" #: src/libpspp/i18n.c:1134 msgid "Central European" msgstr "Ευρώπη: Κεντρικά" #: src/libpspp/i18n.c:1136 msgid "Chinese Simplified" msgstr "Απλοποιημένα Κινέζικα" #: src/libpspp/i18n.c:1138 msgid "Chinese Traditional" msgstr "Παραδοσιακά Κινέζικα" #: src/libpspp/i18n.c:1140 msgid "Croatian" msgstr "Κροάτικα" #: src/libpspp/i18n.c:1141 msgid "Cyrillic" msgstr "Κυριλλικά" #: src/libpspp/i18n.c:1143 msgid "Cyrillic/Russian" msgstr "Κυριλλικά/Ρώσικα" #: src/libpspp/i18n.c:1144 msgid "Cyrillic/Ukrainian" msgstr "Κυριλλικά/Ουκρανικά" #: src/libpspp/i18n.c:1146 msgid "Georgian" msgstr "Γεωργιανά" #: src/libpspp/i18n.c:1147 msgid "Greek" msgstr "Ελληνικά" #: src/libpspp/i18n.c:1148 msgid "Gujarati" msgstr "Γκουγιαράτι" #: src/libpspp/i18n.c:1149 msgid "Gurmukhi" msgstr "Γκουρμούκι" #: src/libpspp/i18n.c:1150 msgid "Hebrew" msgstr "Εβραϊκά" #: src/libpspp/i18n.c:1152 msgid "Hebrew Visual" msgstr "Οπτικά Εβραϊκά" #: src/libpspp/i18n.c:1153 msgid "Hindi" msgstr "Χίντι" #: src/libpspp/i18n.c:1154 msgid "Icelandic" msgstr "Ισλανδικά" #: src/libpspp/i18n.c:1155 msgid "Japanese" msgstr "Ιαπωνικά" #: src/libpspp/i18n.c:1157 msgid "Korean" msgstr "Κορεάτικα" #: src/libpspp/i18n.c:1159 msgid "Nordic" msgstr "Σκανδιναβικά" #: src/libpspp/i18n.c:1160 msgid "Romanian" msgstr "Ρουμάνικα" #: src/libpspp/i18n.c:1162 msgid "South European" msgstr "Ευρώπη: Νότια" #: src/libpspp/i18n.c:1163 msgid "Thai" msgstr "Ταϊλανδικά" #: src/libpspp/i18n.c:1165 msgid "Turkish" msgstr "Τούρκικα" #: src/libpspp/i18n.c:1167 msgid "Vietnamese" msgstr "Βιετναμέζικα" #: src/libpspp/i18n.c:1169 msgid "Western European" msgstr "Ευρώπη: Δυτικά" #: src/libpspp/message.c:89 #, c-format msgid "%s: %s" msgstr "%s: %s" #: src/libpspp/message.c:113 msgid "error" msgstr "σφάλμα" #: src/libpspp/message.c:115 msgid "warning" msgstr "προειδοποίηση" #: src/libpspp/message.c:118 msgid "note" msgstr "σημείωση" #: src/libpspp/message.c:327 #, c-format msgid "Notes (%d) exceed limit (%d). Suppressing further notes." msgstr "" "Οι σημειώσεις (%d) υπερβαίνουν το όριο (%d). Παράληψη επιπλέον σημειώσεων." #: src/libpspp/message.c:335 #, c-format msgid "Warnings (%d) exceed limit (%d). Syntax processing will be halted." msgstr "" "Οι Προειδοποιήσεις (%d) υπερβαίνουν το όριο (%d). Η εκτέλεση της Σύνταξης θα " "σταματήσει." #: src/libpspp/message.c:338 #, c-format msgid "Errors (%d) exceed limit (%d). Syntax processing will be halted." msgstr "" "Τα Σφάλματα (%d) υπερβαίνει το όριο (%d). Η εκτέλεση της Σύνταξης θα " "σταματήσει." #: src/libpspp/zip-reader.c:202 #, c-format msgid "%s: corrupt archive at 0x%llx: expected %# but got %#" msgstr "" "%s: κατεστραμμένο αρχείο στο 0x%llx: αναμενόταν %# αλλά είχε " "%#" #: src/libpspp/zip-reader.c:329 src/libpspp/zip-reader.c:449 #, c-format msgid "%s: open failed (%s)" msgstr "%s: το άνοιγμα απέτυχε (%s)" #: src/libpspp/zip-reader.c:344 #, c-format msgid "%s: cannot find central directory" msgstr "%s: Δεν μπορεί να βρεθεί ο κεντρικός κατάλογος" #: src/libpspp/zip-reader.c:353 src/libpspp/zip-reader.c:384 #: src/libpspp/zip-reader.c:468 #, c-format msgid "%s: seek failed (%s)" msgstr "%s: η αναζήτηση απέτυχε (%s)" #: src/libpspp/zip-reader.c:441 #, c-format msgid "%s: unknown member \"%s\"" msgstr "%s: άγνωστο μέλος `%s'" #: src/libpspp/zip-reader.c:503 #, fuzzy, c-format #| msgid "" #| "%s: name mismatch betwen central directory (%s) and local file header (%s)" msgid "" "%s: name mismatch between central directory (%s) and local file header (%s)" msgstr "" "%s: Αναντιστοιχία ονόματος μεταξύ καταλόγου (%s) και τοπικής κεφαλίδας " "αρχείου (%s)" #: src/libpspp/zip-reader.c:696 #, c-format msgid "%s: cannot initialize inflator (%s)" msgstr "%s: Δεν μπορεί να ξεκινήσει ο πληθωριστής (%s)" #: src/libpspp/zip-reader.c:751 #, c-format msgid "%s: error inflating \"%s\" (%s)" msgstr "%s: Σφάλμα πληθωριστή \"%s\" (%s)" #: src/libpspp/zip-writer.c:97 utilities/pspp-convert.c:346 #, c-format msgid "%s: error opening output file" msgstr "%s: σφάλμα ανοίγματος εξαγώμενου αρχείου" #: src/libpspp/zip-writer.c:169 #, c-format msgid "%s: error seeking in output file" msgstr "%s: σφάλμα αναζήτησης στο εξαγώμενο αρχείο" #: src/libpspp/zip-writer.c:210 msgid "error creating temporary file" msgstr "σφάλμα δημιουργίας προσωρινού αρχείου" #: src/libpspp/zip-writer.c:279 #, c-format msgid "%s: write failed" msgstr "%s: η εγγραφήεγγραφή απέτυχε" #. TRANSLATORS: This is a format string which, when presented to #. printf like functions, will create a pango markup string to #. display real number in scientific notation. #. #. In its untranslated form, it will display similar to "1.23 x 10^4". You #. can leave it untranslated if this is how scientific notation is usually #. presented in your language. #. #. Some locales (such as German) prefer the centered dot rather than the #. multiplication sign between the mantissa an exponent. In which #. case, you can change "#215;" to "#8901;" or other unicode code #. point as appropriate. #. #. The . in this string does not and should not be changed, since #. that is taken care of by the stdc library. #. #. For information on Pango markup, see #. http://developer.gnome.org/pango/stable/PangoMarkupFormat.html #. #. For tables of unicode code points, see http://unicode.org/charts #. #: src/math/chart-geometry.c:123 #, c-format msgid "%%.%dlf×10%d" msgstr "%%.%dlf×10%d" #: src/math/histogram.c:145 msgid "" "Not creating histogram because the data contains less than 2 distinct values" msgstr "" "Μη δημιουργία ιστογραμμάτος επειδή τα δεδομένα περιέχουν λιγότερες από 2 " "διακριτές τιμές" #: src/math/percentiles.c:36 msgid "HAverage" msgstr "Στθμ.Μέσος" #: src/math/percentiles.c:38 msgid "Rounded" msgstr "Στρογγυλ." #: src/math/percentiles.c:39 msgid "Empirical" msgstr "Εμπειρικά" #: src/math/percentiles.c:40 msgid "Empirical with averaging" msgstr "Εμπειρικά κατά μέσο όρο" #: src/math/shapiro-wilk.c:84 msgid "" "One or more weight values are non-integer. Fractional parts will be ignored " "when calculating the Shapiro-Wilk statistic." msgstr "" "Ένα ή παραπάνω τιμές βαρών είναι μη ακέραιος. Κλασματοειδή μέρη θα αγνοηθούν " "στους στατιστικούς υπολογισμούς Shapiro-Wilk." #: src/output/ascii.c:340 #, c-format msgid "ascii: opening output file `%s'" msgstr "ascii: άνοιγμα εξαγώμενου αρχείου `%s'" #: src/output/ascii.c:371 #, c-format msgid "%s: %s must be positive integer or `auto'" msgstr "%s: %s πρέπει να είναι θετικός ακέραιος ή `auto'" #: src/output/ascii.c:393 #, c-format msgid "" "ascii: page must be at least %d characters wide, but as configured is only " "%d characters" msgstr "" "ascii: η σελίδα πρέπει να έχει πλάτος τουλάχιστον %d χαρακτήρες, αλλά όπως " "έχει διαμορφωθεί έχει μόνο %d χαρακτήρες" #: src/output/ascii.c:508 #, c-format msgid "See %s for a chart." msgstr "Δες %s για γράφημα." #: src/output/charts/piechart.c:54 msgid "*MISSING*" msgstr "*MISSING*" #: src/output/csv.c:100 src/output/html.c:117 src/output/journal.c:166 #: src/output/msglog.c:68 #, c-format msgid "error opening output file `%s'" msgstr "σφάλμα ανοίγματος εξερχόμενου αρχείου `%s'" #: src/output/driver.c:522 #, c-format msgid "%s is not a valid device type (the choices are `%s' and `%s')" msgstr "%s δεν είναι έγκυρος τύπος συσκευής: οι επιλογές είναι `%s' και `%s'" #: src/output/driver.c:536 #, c-format msgid "%s: unknown option `%s'" msgstr "%s: άγνωστη επιλογή `%s'" #: src/output/driver.c:553 #, c-format msgid "%s: output option missing `='" msgstr "%s: επιλογή εξερχόμενου λείπει `='" #: src/output/driver.c:560 #, c-format msgid "%s: output option specified more than once" msgstr "%s: η επιλογή εξερχόμενου ορίστηκε πάνω από μία φορά" #: src/output/html.c:129 msgid "PSPP Output" msgstr "PSPP Εξαγωγή" #: src/output/html.c:266 msgid "No description" msgstr "Μη περιγραφή" #: src/output/journal.c:69 #, c-format msgid "error writing output file `%s'" msgstr "σφάλμα εγγραφής στο εξαγώμενο αρχείο `%s'" #: src/output/measure.c:68 #, c-format msgid "`%s' is not a valid length." msgstr "`%s' δεν έχει έγκυρο μήκος." #: src/output/measure.c:96 #, c-format msgid "syntax error in paper size `%s'" msgstr "συντακτικό λάθος-στο μέγεθος χαρτιού `%s'" #: src/output/measure.c:233 #, c-format msgid "unknown paper type `%.*s'" msgstr "άγνωστος τύπος χαρτιού `%.*s'" #: src/output/measure.c:251 #, c-format msgid "error opening input file `%s'" msgstr "σφάλμα ανοίγματος εισερχόμενου αρχείου `%s'" #: src/output/measure.c:279 #, c-format msgid "file `%s' does not state a paper size" msgstr "το μέγεθος χαρτιού στο αρχείο `%s' δεν αναφέρεται" #: src/output/options.c:112 #, c-format msgid "%s: `%s' is `%s' but a Boolean value is required" msgstr "%s: `%s' είναι `%s' αλλά μία λογική (Boolean) τιμη'απαιτείται" #: src/output/options.c:187 #, c-format msgid "%s: `%s' is `%s' but one of the following is required: %s" msgstr "%s: `%s' είναι `%s' αλλά ένα από τα παρακάτω απαιτείται: %s" #: src/output/options.c:231 #, c-format msgid "%s: `%s' is `%s' but a non-negative integer is required" msgstr "%s: `%s' είναι `%s' αλλά ένας μη αρνητικός ακέραιος απαιτείται" #: src/output/options.c:235 #, c-format msgid "%s: `%s' is `%s' but a positive integer is required" msgstr "%s: `%s' είναι `%s' αλλά ένας θετικός ακέραιος απαιτείται" #: src/output/options.c:238 #, c-format msgid "%s: `%s' is `%s' but an integer is required" msgstr "%s: `%s' είναι `%s' αλλά ένας ακέραιος απαιτείται" #: src/output/options.c:241 #, c-format msgid "%s: `%s' is `%s' but an integer greater than %d is required" msgstr "%s: `%s' είναι `%s' αλλά ένας ακέραιος μεγαλύτερος από %d απαιτείται" #: src/output/options.c:246 #, c-format msgid "%s: `%s' is `%s' but an integer between %d and %d is required" msgstr "%s: `%s' είναι `%s' αλλά ένας ακέραιος μεταξύ %d και %d απαιτείται" #: src/output/options.c:325 #, c-format msgid "%s: `%s' is `%s' but a file name that contains `#' is required." msgstr "" "%s: `%s' είναι `%s' αλλά ένα όνομα αρχείου που περιέχει `#' απαιτείται." #. TRANSLATORS: Do not translate this string. If the script of your language #. reads from right to left (eg Persian, Arabic, Hebrew etc), then replace #. this string with "output-direction-rtl". Otherwise either leave it #. untranslated or copy it verbatim. #: src/output/render.c:994 msgid "output-direction-ltr" msgstr "output-direction-ltr" #: src/output/text-item.c:44 msgid "Page Title" msgstr "Τίτλος Σελίδας" #: src/output/text-item.c:47 msgid "Title" msgstr "Τίτλος" #: src/output/text-item.c:51 msgid "Log" msgstr "Λογ" #: src/output/text-item.c:54 msgid "Page Break" msgstr "Αλλαγή Σελίδας" #: src/output/cairo.c:520 #, c-format msgid "`%s': bad font specification" msgstr "`%s': Λάθος στα ορίσματα γραμαμτοσειράς" #: src/output/cairo.c:744 #, c-format msgid "" "The defined page is not wide enough to hold at least %d characters in the " "default font. In fact, there's only room for %d characters." msgstr "" "Η ορίζουσα σελίδα δεν έχει αρκετό πλάτος για να δείξει τουλάχιστον %d " "χαρακτηρές στην επιλεγμένη γραμματοσειρά. Υπάρχει χώρος μόνο για %d " "χαρακτηρές." #: src/output/cairo.c:752 #, c-format msgid "" "The defined page is not long enough to hold at least %d lines in the default " "font. In fact, there's only room for %d lines." msgstr "" "Η ορίζουσα σελίδα δεν έχει αρκετό μήκος για να δείξει τουλάχιστον %d γραμμές " "στην επιλεγμένη γραμματοσειρά. Υπάρχει χώρος μόνο για %d γραμμές." #: src/output/cairo.c:837 #, c-format msgid "error opening output file `%s': %s" msgstr "σφάλμα ανοίγματος εξερχόμενου αρχείου `%s': %s" #: src/output/cairo.c:892 #, c-format msgid "error drawing output for %s driver: %s" msgstr "σφάλμα απεικόνισης εξερχομένου για %s οδηγό: %s" #: src/output/cairo.c:2056 #, c-format msgid "error writing output file `%s': %s" msgstr "σφάλμα εγγραφής εξερχομένου αρχείου `%s': %s" #: src/output/charts/np-plot-cairo.c:37 #, c-format msgid "Normal Q-Q Plot of %s" msgstr "Τυπικό Q-Q διάγραμμα του %s" #: src/output/charts/np-plot-cairo.c:38 src/output/charts/np-plot-cairo.c:68 msgid "Observed Value" msgstr "Παρατηρίσημη Τιμή" #: src/output/charts/np-plot-cairo.c:39 msgid "Expected Normal" msgstr "Αναμενόμενό Τυπικό" #: src/output/charts/np-plot-cairo.c:67 #, c-format msgid "Detrended Normal Q-Q Plot of %s" msgstr "Αποτασσικό Τυπικό Q-Q διάγραμμα του %s" #: src/output/charts/np-plot-cairo.c:69 msgid "Dev from Normal" msgstr "Απόκλ. από Τυπική" #: src/output/charts/barchart-cairo.c:65 msgid "Bar Chart" msgstr "Ραβδόγραμμα" #: src/output/charts/plot-hist-cairo.c:43 #, c-format msgid "N = %.2f" msgstr "N = %.2f" #: src/output/charts/plot-hist-cairo.c:52 #, c-format msgid "Mean = %.1f" msgstr "Μέσος= %.1f" #: src/output/charts/plot-hist-cairo.c:61 #, c-format msgid "Std. Dev = %.2f" msgstr "Τ.Α. = %.2f" #: src/output/charts/plot-hist-cairo.c:110 msgid "HISTOGRAM" msgstr "ΙΣΤΟΓΡΑΜΜΑ" #: src/output/charts/roc-chart-cairo.c:36 src/ui/gui/roc.ui:24 msgid "ROC Curve" msgstr "ROC Καμπύλη (ΛΑΙΔ-Κ)" #: src/output/charts/scree-cairo.c:36 msgid "Scree Plot" msgstr "Διάγρ. Συνιστωσών" #: src/output/charts/scree-cairo.c:38 msgid "Eigenvalue" msgstr "ΙδιοΤιμή" #: src/output/charts/spreadlevel-cairo.c:37 #, c-format msgid "Spread vs. Level Plot of %s" msgstr "Διάγραμμα Διασποράς-Επιπέδου (S-L) του %s" #: src/output/charts/spreadlevel-cairo.c:38 msgid "Level" msgstr "Επίπεδο" #: src/output/charts/spreadlevel-cairo.c:39 msgid "Spread" msgstr "Διασπορά" #: src/output/charts/scatterplot-cairo.c:57 #, c-format msgid "Scatterplot %s" msgstr "Διάγραμμα Διασποράς %s" #: src/output/spv/spv-legacy-decoder.c:2222 msgid "Table lacks cell data." msgstr "Ο πίνακας δεν διαθέτει δεδομένα κελιού." #: src/output/spv/spv-writer.c:68 #, c-format msgid "%s: create failed" msgstr "%s: η εγγραφή απέτυχε" #: src/output/spv/spv-writer.c:89 msgid "I/O error writing SPV file" msgstr "I/O σφάλμα εγγραφής SPV αρχείου" #: src/output/spv/spv.c:693 #, c-format msgid "%s: Failed to create XML parser" msgstr "%s: Αποτυχία δημιουργίας XML αναλυτή" #: src/output/spv/spv.c:718 #, c-format msgid "%s: document is not well-formed" msgstr "%s: το έγγραφο δεν είναι καλά διαμορφωμένο" #: src/output/spv/spv.c:726 #, c-format msgid "%s: root node is \"%s\" but \"%s\" was expected" msgstr "%s: ο αρχικός κόμβος είναι \"%s\" αλλά \"%s\" αναμενόταν " #: src/ui/gui/psppire-acr.c:273 msgid "Add" msgstr "Πρόσθεση" #: src/ui/gui/psppire-acr.c:274 msgid "Edit" msgstr "Διόρθωση" #: src/ui/gui/psppire-acr.c:275 msgid "Remove" msgstr "Διαγραφή" #: src/ui/gui/psppire-buttonbox.c:311 msgid "OK" msgstr "ΟΚ" #: src/ui/gui/psppire-buttonbox.c:319 msgid "Go To" msgstr "Προς" #: src/ui/gui/psppire-buttonbox.c:327 msgid "Continue" msgstr "Επόμενο" #: src/ui/gui/psppire-buttonbox.c:339 src/ui/gui/psppire-import-assistant.c:759 msgid "Paste" msgstr "Επικόλληση" #: src/ui/gui/psppire-buttonbox.c:345 #: src/ui/gui/psppire-dialog-action-aggregate.c:216 #: src/ui/gui/psppire-data-window.c:496 src/ui/gui/psppire-data-window.c:624 #: src/ui/gui/psppire-output-window.c:353 #: src/ui/gui/psppire-syntax-window.c:594 src/ui/gui/psppire-window.c:445 #: src/ui/gui/psppire-window.c:628 msgid "Cancel" msgstr "Ακύρωση" #: src/ui/gui/psppire-buttonbox.c:351 msgid "Close" msgstr "Κλείσιμο" #: src/ui/gui/psppire-buttonbox.c:358 src/ui/gui/psppire-import-assistant.c:760 msgid "Reset" msgstr "Επαναφορά" #: src/ui/gui/psppire-buttonbox.c:365 msgid "Help" msgstr "Βοήθεια" #: src/ui/gui/psppire-dialog-action-aggregate.c:213 msgid "Aggregate destination file" msgstr "Συναθροισμός προορισμού αρχείου" #: src/ui/gui/psppire-dialog-action-aggregate.c:217 #: src/ui/gui/psppire-data-window.c:493 src/ui/gui/psppire-data-window.c:497 #: src/ui/gui/psppire-output-window.c:354 #: src/ui/gui/psppire-syntax-window.c:595 src/ui/gui/psppire-window.c:449 #: src/ui/gui/aggregate.ui:565 msgid "Save" msgstr "Αποθήκευση" #: src/ui/gui/psppire-dialog-action-aggregate.c:226 #: src/ui/gui/psppire-data-window.c:503 msgid "System Files (*.sav)" msgstr "Αρχεία Συστήματος (*.sav)" #: src/ui/gui/psppire-dialog-action-aggregate.c:231 #: src/ui/gui/psppire-data-window.c:508 msgid "Compressed System Files (*.zsav)" msgstr "Συμπιεσμένα Αρχεία Συστήματος (*.zsav)" #: src/ui/gui/psppire-dialog-action-aggregate.c:236 #: src/ui/gui/psppire-data-window.c:513 src/ui/gui/psppire-window.c:652 msgid "Portable Files (*.por) " msgstr "Φορητά Αρχεία (*.por) " #: src/ui/gui/psppire-dialog-action-autorecode.c:337 #: src/ui/gui/psppire-dialog-action-recode.c:535 #: src/ui/gui/psppire-dialog-action-recode-different.c:288 msgid "New" msgstr "Νέο" #: src/ui/gui/psppire-dialog-action-autorecode.c:351 #: src/ui/gui/psppire-dialog-action-recode.c:527 #: src/ui/gui/psppire-dialog-action-recode-different.c:301 msgid "Old" msgstr "Προηγούμενο" #: src/ui/gui/psppire-dialog-action-comments.c:142 #, c-format msgid "Column Number: %d" msgstr "Αριθμός Στήλης: %d" #: src/ui/gui/psppire-dialog-action-crosstabs.c:71 msgid "Chisq" msgstr "Χ-τετρ" #: src/ui/gui/psppire-dialog-action-crosstabs.c:71 msgid "" "Pearson chi-square, likelihood ratio, Fisher’s exact test, continuity " "correction, linear-by-linear association." msgstr "" #: src/ui/gui/psppire-dialog-action-crosstabs.c:74 #: src/language/stats/crosstabs.q:1334 msgid "Phi" msgstr "Phi" #: src/ui/gui/psppire-dialog-action-crosstabs.c:75 msgid "CC" msgstr "ΣΣ" #: src/ui/gui/psppire-dialog-action-crosstabs.c:75 #, fuzzy #| msgid "Contingency Coefficient" msgid "Contingency coefficient" msgstr "Συντελεστής Συνάφειας" #: src/ui/gui/psppire-dialog-action-crosstabs.c:77 msgid "UC" msgstr "ΣΑ" #: src/ui/gui/psppire-dialog-action-crosstabs.c:77 #, fuzzy #| msgid "Uncertainty Coefficient" msgid "Uncertainty coefficient" msgstr "Συντελεστής Αβεβαιότητας" #: src/ui/gui/psppire-dialog-action-crosstabs.c:78 msgid "BTau" msgstr "BTau" #: src/ui/gui/psppire-dialog-action-crosstabs.c:78 #, fuzzy #| msgid "Kendall's tau-b" msgid "Kendall's Tau-b" msgstr "Kendall's tau-b" #: src/ui/gui/psppire-dialog-action-crosstabs.c:79 msgid "CTau" msgstr "CTau" #: src/ui/gui/psppire-dialog-action-crosstabs.c:79 #, fuzzy #| msgid "Kendall's tau-c" msgid "Kendall's Tau-c" msgstr "Kendall's tau-c" #: src/ui/gui/psppire-dialog-action-crosstabs.c:80 msgid "Risk" msgstr "Ρίσκο" #: src/ui/gui/psppire-dialog-action-crosstabs.c:80 #, fuzzy #| msgid "Risk Estimate" msgid "Relative Risk estimate" msgstr "Εκτίμηση Ρίσκου" #: src/ui/gui/psppire-dialog-action-crosstabs.c:81 #: src/language/stats/crosstabs.q:1338 msgid "Gamma" msgstr "Γάμμα" #: src/ui/gui/psppire-dialog-action-crosstabs.c:82 msgid "D" msgstr "D" #: src/ui/gui/psppire-dialog-action-crosstabs.c:82 #, fuzzy #| msgid "Somers' d" msgid "Somer's d" msgstr "Somers' d" #: src/ui/gui/psppire-dialog-action-crosstabs.c:83 #: src/language/stats/crosstabs.q:1344 msgid "Kappa" msgstr "Κάππα" #: src/ui/gui/psppire-dialog-action-crosstabs.c:83 msgid "Cohen's Kappa" msgstr "" #: src/ui/gui/psppire-dialog-action-crosstabs.c:84 #: src/language/stats/crosstabs.q:1429 msgid "Eta" msgstr "Ήτα" #: src/ui/gui/psppire-dialog-action-crosstabs.c:85 msgid "Corr" msgstr "Συσχ" #: src/ui/gui/psppire-dialog-action-crosstabs.c:85 #, fuzzy #| msgid "Spearman Correlation" msgid "Spearman correlation, Pearson's r" msgstr "Συσχέτιση Spearman" #: src/ui/gui/psppire-dialog-action-crosstabs.c:90 #, fuzzy #| msgid "Frequency" msgid "Frequency Count" msgstr "Συχνότητα" #: src/ui/gui/psppire-dialog-action-crosstabs.c:91 msgid "Row" msgstr "Σειρά" #: src/ui/gui/psppire-dialog-action-crosstabs.c:91 #, fuzzy #| msgid "Percent" msgid "Row percent" msgstr "Ποσοστά" #: src/ui/gui/psppire-dialog-action-crosstabs.c:92 msgid "Column" msgstr "Στήλη" #: src/ui/gui/psppire-dialog-action-crosstabs.c:92 #, fuzzy #| msgid "Cum Percent" msgid "Column percent" msgstr "Συσσωρευτικά Ποσοστά" #: src/ui/gui/psppire-dialog-action-crosstabs.c:93 #, fuzzy #| msgid "Valid Percent" msgid "Total percent" msgstr "Έγκυρα Ποσοστά" #: src/ui/gui/psppire-dialog-action-crosstabs.c:94 #: src/language/stats/crosstabs.q:1266 msgid "Expected" msgstr "Aναμένεται" #: src/ui/gui/psppire-dialog-action-crosstabs.c:94 #, fuzzy #| msgid "Expected Values:" msgid "Expected value" msgstr "Αναμενόμενες Τιμές:" #: src/ui/gui/psppire-dialog-action-crosstabs.c:96 #: src/language/stats/crosstabs.q:1268 msgid "Std. Residual" msgstr "Στθμ. Σφάλμα" #: src/ui/gui/psppire-dialog-action-crosstabs.c:96 #, fuzzy #| msgid "Std. Residual" msgid "Standardized Residual" msgstr "Στθμ. Σφάλμα" #: src/ui/gui/psppire-dialog-action-crosstabs.c:97 msgid "Adjusted Std. Residual" msgstr "Προσαρμοσμένο Στθμ. Σφάλμα" #: src/ui/gui/psppire-dialog-action-descriptives.c:45 msgid "Standard error" msgstr "Τυπικό Σφάλμα" #: src/ui/gui/psppire-dialog-action-descriptives.c:45 #, fuzzy #| msgid "Standard error of the mean" msgid "Standard error of mean" msgstr "Τυπικό σφάλμα μέσου" #: src/ui/gui/psppire-dialog-action-descriptives.c:47 #, fuzzy #| msgid "Standard error of the kurtosis" msgid "Kurtosis and standard error of kurtosis" msgstr "Τυπικό σφάλμα κύρτωσης" #: src/ui/gui/psppire-dialog-action-descriptives.c:48 #, fuzzy #| msgid "Standard error of the skewness" msgid "Skewness and standard error of skewness" msgstr "Τυπικό σφάλμα λοξότητας" #: src/ui/gui/psppire-dialog-action-factor.c:323 #, c-format msgid "_Eigenvalues over %4.2f times the mean eigenvalue" msgstr "_Ιδιοτιμές πάνω από %4.2f φορές τη μέση ιδιοτιμή" #: src/ui/gui/psppire-dialog-action-frequencies.c:44 msgid "Standard error of the mean" msgstr "Τυπικό σφάλμα μέσου" #: src/ui/gui/psppire-dialog-action-frequencies.c:47 msgid "Standard error of the skewness" msgstr "Τυπικό σφάλμα λοξότητας" #: src/ui/gui/psppire-dialog-action-frequencies.c:51 msgid "Standard error of the kurtosis" msgstr "Τυπικό σφάλμα κύρτωσης" #: src/ui/gui/psppire-dialog-action-oneway.c:175 #, c-format msgid "Contrast %d of %d" msgstr "Συγκρίσεις %d of %d" #: src/ui/gui/psppire-dialog-action-paired.c:162 src/ui/gui/examine.ui:282 #: src/ui/gui/indep-samples.ui:334 src/ui/gui/t-test.ui:296 msgid "O_ptions..." msgstr "Ε_πιλογές..." #: src/ui/gui/psppire-dialog-action-paired.c:168 msgid "Paired Samples T Test" msgstr "Εξαρτημένων δειγμάτων Τ Τεστ" #: src/ui/gui/psppire-dialog-action-recode-different.c:327 msgid "Recode into Different Variables" msgstr "Κωδικοποίηση σε Διαφορετικές Μεταβλητές" #: src/ui/gui/psppire-dialog-action-recode-different.c:330 msgid "Recode into Different Variables: Old and New Values " msgstr "Επανακώδικας Μεταβλητών σε Άλλες: Παλιές και Νέες Τιμές " #: src/ui/gui/psppire-dialog-action-recode-same.c:108 src/ui/gui/recode.ui:391 msgid "Recode into Same Variables" msgstr "Επανακώδικας στις Ιδίες Μεταβλητές" #: src/ui/gui/psppire-dialog-action-recode-same.c:114 msgid "Recode into Same Variables: Old and New Values" msgstr "Επανακώδικας στις Ιδίες Μεταβλητές: Παλιές και Νέες Τιμές" #: src/ui/gui/psppire-dialog-action-regression.c:40 msgid "Coeff" msgstr "Συντελ" #: src/ui/gui/psppire-dialog-action-regression.c:40 msgid "Show the regression coefficients" msgstr "Προβολή συντελεστών παλινδρόμησης" #: src/ui/gui/psppire-dialog-action-regression.c:41 msgid "Conf. Interval" msgstr "Διάστημα Εμπ." #: src/ui/gui/psppire-dialog-action-regression.c:41 msgid "Show the confidence interval for the regression coefficients" msgstr "Προβολή Διαστημάτων εμπιστοσύνης για τους συντελεστές παλινδρόμησης" #: src/ui/gui/psppire-dialog-action-regression.c:42 msgid "Show the correlation between observed and predicted values" msgstr "Προβολή συσχετίσεων μεταξύ παρατηρίσιμων και προβλέψιμων τιμών" #: src/ui/gui/psppire-dialog-action-regression.c:43 msgid "Anova" msgstr "Anova" #: src/ui/gui/psppire-dialog-action-regression.c:43 msgid "Show the analysis of variance table" msgstr "Προβολή πίνακα ανάλυσης διακύμανσης" #: src/ui/gui/psppire-dialog-action-regression.c:44 msgid "Bcov" msgstr "B Συνδ" #: src/ui/gui/psppire-dialog-action-regression.c:44 msgid "Show the variance coefficient matrix" msgstr "Προβολή πίνακα συντελεστών διακύμνασης" #: src/ui/gui/psppire-dialog-action-regression.c:45 msgid "Tol" msgstr "Tol" #: src/ui/gui/psppire-dialog-action-regression.c:45 msgid "Show the variance inflation factor and its reciprocal" msgstr "Δείχνει τον παράγοντα πληθωρισμού διακύμανσης και τον αμοιβαίο του" #: src/ui/gui/psppire-dialog-action-select.c:88 #, c-format msgid "Approximately %3d%% of all cases." msgstr "Σχεδόν %3d%% όλων των υποθέσεων." #: src/ui/gui/psppire-dialog-action-select.c:89 #, c-format msgid "Exactly %3d cases from the first %3d cases." msgstr "Ακριβώς %3d υποθέσεις από τις πρώτες %3d υποθέσεις." #: src/ui/gui/psppire-dialog-action-select.c:236 #, c-format msgid "%d thru %d" msgstr "%d ως %d" #: src/ui/gui/psppire-dialog-action-two-sample.c:180 #: src/ui/gui/k-independent.ui:404 src/ui/gui/k-related.ui:197 msgid "Test Type" msgstr "Τύπος Τεστ" #: src/ui/gui/psppire-dialog-action-two-sample.c:189 msgid "_Wilcoxon" msgstr "_Wilcoxon" #: src/ui/gui/psppire-dialog-action-two-sample.c:190 msgid "_Sign" msgstr "_Sign" #: src/ui/gui/psppire-dialog-action-two-sample.c:191 msgid "_McNemar" msgstr "_McNemar" #: src/ui/gui/psppire-dialog-action-two-sample.c:209 msgid "Two-Related-Samples Tests" msgstr "Δύο-Εξαρτημένων-Δειγμάτων Τεστ" #: src/ui/gui/psppire-dialog-action-weight.c:74 src/ui/gui/weight.ui:83 #: src/ui/gui/weight.ui:211 msgid "Do not weight cases" msgstr "Μη στάθμιση υποθέσεων" #: src/ui/gui/psppire-dialog-action-weight.c:80 #, c-format msgid "Weight cases by %s" msgstr "Στάθμιση Υποθέσεων κατά %s" #: src/ui/gui/psppire-dict.c:95 msgid "Var" msgstr "Μεταβλ" #. TRANSLATORS: This string must be a valid variable name. That means: #. - The string must be at most 64 bytes (not characters) long. #. - The string may not contain whitespace. #. - The first character may not be '$' #. - The first character may not be a digit #. - The final character may not be '.' or '_' #. #: src/ui/gui/psppire-dict.c:385 #, c-format msgid "Var%04d" msgstr "Μετ%04d" #: src/ui/gui/psppire-dict.c:566 msgid "Duplicate variable name." msgstr "Διπλότυπο όνομα μεταβλητής." #: src/ui/gui/psppire-dictview.c:617 msgid "Prefer variable labels" msgstr "Προτίμηση ετικέτας μεταβλητής" #: src/ui/gui/psppire-dictview.c:631 msgid "Default sort order" msgstr "Ορισμένη Ταξινόμιση" #: src/ui/gui/psppire-dictview.c:637 msgid "Unsorted (dictionary order)" msgstr "Αταξινόμητα (Σειρά Λίστας)" #: src/ui/gui/psppire-dictview.c:642 msgid "Sort by name" msgstr "Ταξινόμηση κατά όνομα" #: src/ui/gui/psppire-dictview.c:647 msgid "Sort by label" msgstr "Ταξινόμηση κατά ετικέτα" #: src/ui/gui/psppire-means-layer.c:95 #, c-format msgid "Layer %d of %d" msgstr "Επίπεδο %d από %d" #: src/ui/gui/psppire-means-layer.c:169 msgid "Forward" msgstr "Επόμενο" #: src/ui/gui/psppire-means-layer.c:170 msgid "Back" msgstr "Πίσω" #: src/ui/gui/psppire-text-file.c:55 #, c-format msgid "Could not open `%s'" msgstr "Αδυναμία ανοίγματος του `%s'" #: src/ui/gui/psppire-text-file.c:71 #, c-format msgid "Error reading `%s': %s" msgstr "Σφάλμα ανάγνωσης `%s': %s" #: src/ui/gui/psppire-text-file.c:74 #, c-format msgid "" "Failed to read `%s', because it contains a line over %d bytes long and " "therefore appears not to be a text file." msgstr "" "Αποτυχία ανάγνωσης του `%s'. Περιέχει μία γραμμή κατά %d διφύων μήκους και " "για αυτό φαίνεται ότι δεν είναι αρχείο κειμένου." #: src/ui/gui/psppire-text-file.c:96 #, c-format msgid "`%s' is empty." msgstr "Το `%s' είναι κενό." #: src/ui/gui/psppire-val-chooser.c:255 msgid "through" msgstr "διά" #: src/ui/gui/psppire-val-chooser.c:288 msgid "_Value:" msgstr "_Τιμή:" #: src/ui/gui/psppire-val-chooser.c:289 msgid "_System Missing" msgstr "Ελλειπούσες _Συστήματος" #: src/ui/gui/psppire-val-chooser.c:290 msgid "System _or User Missing" msgstr "Συστήματος ή _Χρήστη ελλειπούσες" #: src/ui/gui/psppire-val-chooser.c:291 msgid "_Range:" msgstr "_Εύρος:" #: src/ui/gui/psppire-val-chooser.c:292 msgid "Range, _LOWEST thru value" msgstr "Εύρος, _Ελάχιστη ως Τιμή" #: src/ui/gui/psppire-val-chooser.c:293 msgid "Range, value thru _HIGHEST" msgstr "Εύρος, Τιμή ως _Μέγιστη" #: src/ui/gui/psppire-val-chooser.c:294 msgid "_All other values" msgstr "Ό_Λες οι υπόλοιπες τιμές" #: src/ui/gui/psppire-var-view.c:153 #, c-format msgid "Var%d" msgstr "Μεταβλ%d" #: src/ui/source-init-opts.c:72 #, c-format msgid "Algorithm must be either `%s' or `%s'." msgstr "Ο Αλγόριθμος πρέπει να είναι είτε `%s' ή `%s'." #: src/ui/source-init-opts.c:97 #, c-format msgid "Syntax must be either `%s' or `%s'." msgstr "Η σύνταξη πρέπει να είναι είτε `%s' ή `%s'." #: src/ui/terminal/main.c:144 msgid "Error encountered while ERROR=STOP is effective." msgstr "Σφάλμα βρέθηκε ενώ η ERROR=STOP ήταν ενεργή." #: src/ui/terminal/main.c:150 msgid "" "Stopping syntax file processing here to avoid a cascade of dependent command " "failures." msgstr "" "Σταμάτησε την εκτέλεση της σύνταξης για την αποφυγή πολλαπλών σφαλμάτων από " "επακόλουθα σφάλματα εντολών." #: src/ui/terminal/terminal-opts.c:147 #, c-format msgid "" "PSPP, a program for statistical analysis of sampled data.\n" "Usage: %s [OPTION]... FILE...\n" "\n" "Arguments to long options also apply to equivalent short options.\n" "\n" "Output options:\n" " -o, --output=FILE output to FILE, default format from FILE's name\n" " -O format=FORMAT override format for previous -o\n" " -O OPTION=VALUE set output option to customize previous -o\n" " -O device={terminal|listing} override device type for previous -o\n" " -e, --error-file=FILE append errors, warnings, and notes to FILE\n" " --no-output disable default output driver\n" "Supported output formats: %s\n" "\n" "Language options:\n" " -I, --include=DIR append DIR to search path\n" " -I-, --no-include clear search path\n" " -r, --no-statrc disable running rc file at startup\n" " -a, --algorithm={compatible|enhanced}\n" " set to `compatible' if you want output\n" " calculated from broken algorithms\n" " -x, --syntax={compatible|enhanced}\n" " set to `compatible' to disable PSPP extensions\n" " -b, --batch interpret syntax in batch mode\n" " -i, --interactive interpret syntax in interactive mode\n" " --syntax-encoding=ENCODING specify encoding for syntax files\n" " -s, --safer don't allow some unsafe operations\n" "Default search path: %s\n" "\n" "Informative output:\n" " -h, --help display this help and exit\n" " -V, --version output version information and exit\n" "\n" "Non-option arguments are interpreted as syntax files to execute.\n" msgstr "" "PSPP, ένα πρόγραμμα για στατιστική ανάλυση δεδομένων.\n" "Χρήση: %s [OPTION]... FILE...\n" "\n" "Ορίσματα σε σύντομη και κύρια μορφή.\n" "\n" "Εξερχόμενες επιλογές:\n" " -o, --output=FILE εξερχόμενο σε ΑΡΧΕΙΟ (FILE), επιλεγμένη μορφή " "από όνομα αρχείου\n" " -O format=FORMAT όρισμα μορφής αρχείου αντί της επιλεγμένης -o\n" " -O OPTION=VALUE τιμή για μερικά ορίσματα: δες παρακάτω -o\n" " -O device={terminal|listing} επιλογή τερματικού και αρχικού οδηγού για " "εξερχόμενο -o\n" " -e, --error-file=FILE εγγράφει σφάλματα, προειδοποιήσεις, και " "σημειώσεις στο αρχείο (FILE)\n" " --no-output απενεργοποίηση του επιλεγμένου οδηγού " "εξερχόμενου\n" "Υποστηριζόμενες μορφές εξερχόμενου αρχείου: %s\n" "\n" "Επιλογές γλώσσας:\n" " -I, --include=DIR εσωκλεεί τον κατάλογο (DIR) στην διαδρομή " "αναζήτησης\n" " -I-, --no-include διαγραφής της διαδρομή αναζήτησης\n" " -r, --no-statrc απενεργοποίηση του 'rc' αρχείου στην εκκίνηση\n" " -a, --algorithm={compatible|enhanced}\n" " όρισε σε `compatible' (συμβατότητα) αν θέλεις\n" " το εξερχόμενο να υπολογιστεί από μη ολόκληρους " "αλγόριθμους\n" " -x, --syntax={compatible|enhanced}\n" " όρισε σε `compatible' (συμβατότητα) για την " "απενεργοποίηση PSPP καταλήξεων\n" " -b, --batch ερμηνεία σύνταξης σε κατάσταση Δέσμης (batch)\n" " -i, --interactive ερμηνεία σύνταξης σε διαδραστικότητα\n" " --syntax-encoding=ENCODING ορισμός κωδικοποίησης για αρχείο σύνταξης\n" " -s, --safer μη εκτέλεση μη ασφαλών λειτουργιών \n" "Δοσμένη διαδρομή αναζήτησης: %s\n" "\n" "Πληροφορίες εξερχόμενου:\n" " -h, --help απεικόνιση της βοήθειας αυτής και έξοδος\n" " -V, --version έκδοση εξερχομένου και έξοδος\n" "\n" "Ορίσματα μη απεικονιζόμενα εδώ θα ερμηνευτούν σαν σύνταξη αρχείων και θα " "εκτελεστούν ως έτσι.\n" #: src/ui/gui/find-dialog.c:197 msgid "Find" msgstr "Αναζήτηση" #: src/ui/gui/find-dialog.c:662 #, c-format msgid "Bad regular expression: %s" msgstr "Λάθος τυπικής έκφρασης: %s" #: src/ui/gui/help-menu.c:70 msgid "A program for the analysis of sampled data" msgstr "Πρόγραμμα για τη στατιστική ανάλυση δεδομένων" #. TRANSLATORS: Do not translate this string. Instead, put the names of the people #. who have helped in the translation. #: src/ui/gui/help-menu.c:80 msgid "translator-credits" msgstr "μεταφραστής-στοιχεία" #: src/ui/gui/help-menu.c:170 #, c-format msgid "Help path conversion error: %s" msgstr "Σφάλμα βοήθειας μετατροπής διαδρομής: %s" #: src/ui/gui/help-menu.c:197 #, fuzzy, c-format #| msgid "" #| "Cannot open reference manual via yelp: %s. Cannot open via html: %s with " #| "uri: %s The PSSP manual is also available at %s" msgid "" "Cannot open via html: %s with uri: %s The PSSP manual is also available at %s" msgstr "" "Αδυναμία ανοίγματος του Οδηγού αναφορών: %s. Δεν μπορεί να ανοιχθεί μέσω " "html: %s με uri: %s Ο οδηγός PSSP είναι επίσης προσβάσιμος στο %s" #: src/ui/gui/help-menu.c:218 msgid "_Help" msgstr "_Βοήθεια" #: src/ui/gui/help-menu.c:221 msgid "_About" msgstr "Σ_χετικά" #: src/ui/gui/help-menu.c:222 msgid "_Reference Manual" msgstr "_Οδηγός Αναφορών" #: src/ui/gui/main.c:306 msgid "Show version information and exit" msgstr "Απεικόνιση πληροφορίας έκδοσης και έξοδος" #: src/ui/gui/main.c:409 msgid "Do not display the splash screen" msgstr "Μη απεικόνιση της αρχικής οθόνης" #: src/ui/gui/main.c:411 msgid "Do not attempt single instance negotiation" msgstr "Μην προβείς σε απομονωμένη διαπραγμάτευση της περίπτωσης αυτής" #: src/ui/gui/missing-val-dialog.c:217 msgid "" "The maximum length of a missing value for a string variable is 8 in UTF-8." msgstr "" "Το μέγιστο μήκος μιας ελλειπούσας τιμής για μία συμβολοσειρά είναι 8 στο " "UTF-8." #: src/ui/gui/missing-val-dialog.c:268 msgid "At least one value must be specified" msgstr "Τουλάχιστον μία τιμή πρέπει να οριστεί" #: src/ui/gui/missing-val-dialog.c:298 msgid "Incorrect range specification" msgstr "Εσφαλμένο εύρος ορισμάτων" #: src/ui/gui/psppire-data-editor.c:380 #, c-format msgid "%d : %s" msgstr "%d : %s" #: src/ui/gui/psppire-data-editor.c:391 #, c-format msgid "%'d case" msgid_plural "%'d cases" msgstr[0] "%'d υπόθεση" msgstr[1] "%'d υποθέσεις" #: src/ui/gui/psppire-data-editor.c:396 #, c-format msgid "%'d variable" msgid_plural "%'d variables" msgstr[0] "%'d μεταβλητή" msgstr[1] "%'d μεταβλητές" #: src/ui/gui/psppire-data-editor.c:485 msgid "Case" msgstr "Υπόθεση" #: src/ui/gui/psppire-data-editor.c:495 msgid "Data View" msgstr "Απεικ. Δεδομένων" #: src/ui/gui/psppire-data-editor.c:505 msgid "Variable View" msgstr "Απεικ. Μεταβλητών" #: src/ui/gui/psppire-data-sheet.c:171 src/ui/gui/psppire-data-window.c:1338 msgid "_Insert Case" msgstr "Ει_Σαγωγή Υπόθεσης" #: src/ui/gui/psppire-data-sheet.c:179 src/ui/gui/psppire-data-window.c:1391 msgid "Cl_ear Cases" msgstr "_Καθαρισμός Υποθέσεων" #: src/ui/gui/psppire-data-sheet.c:305 src/ui/gui/psppire-data-window.c:1337 #: src/ui/gui/psppire-variable-sheet.c:274 msgid "_Insert Variable" msgstr "Εισαγωγή Μεταβλητή" #: src/ui/gui/psppire-data-sheet.c:314 src/ui/gui/psppire-variable-sheet.c:283 msgid "Cl_ear Variables" msgstr "Κα_Θαρισμός Μεταβλητών" #: src/ui/gui/psppire-data-sheet.c:326 msgid "Sort _Ascending" msgstr "_Ταξινόμηση Αύξουσα" #: src/ui/gui/psppire-data-sheet.c:333 msgid "Sort _Descending" msgstr "Ταξινόμηση _Φθίνουσα" #: src/ui/gui/psppire-data-window.c:175 msgid "Transformations Pending" msgstr "Μετατροπές Αναμένονται" #: src/ui/gui/psppire-data-window.c:191 msgid "Filter off" msgstr "Μη Φίλτρο" #: src/ui/gui/psppire-data-window.c:203 #, c-format msgid "Filter by %s" msgstr "Φίλτρο με %s" #: src/ui/gui/psppire-data-window.c:224 msgid "No Split" msgstr "Μη Διαίρεση" #: src/ui/gui/psppire-data-window.c:233 msgid "Split by " msgstr "Διαίρεση με " #: src/ui/gui/psppire-data-window.c:261 msgid "Weights off" msgstr "Μη Στάθμιση" #: src/ui/gui/psppire-data-window.c:273 #, c-format msgid "Weight by %s" msgstr "Στάθμιση με %s" #: src/ui/gui/psppire-data-window.c:518 #: src/ui/gui/psppire-import-assistant.c:681 #: src/ui/gui/psppire-syntax-window.c:607 src/ui/gui/psppire-window.c:669 msgid "All Files" msgstr "Όλα τα Αρχεία" #: src/ui/gui/psppire-data-window.c:535 msgid "System File" msgstr "Αρχείο Συστήματος" #: src/ui/gui/psppire-data-window.c:542 msgid "Compressed System File" msgstr "Συμπιεσμένο Αρχείο Συστήματος (CSF)" #: src/ui/gui/psppire-data-window.c:548 msgid "Portable File" msgstr "Φορητό Αρχείο" #: src/ui/gui/psppire-data-window.c:551 msgid "Format:" msgstr "Μορφή:" #: src/ui/gui/psppire-data-window.c:615 msgid "Delete Existing Dataset?" msgstr "Διαγραφή Υπάρχουσας Βάσης Δεδομένων?" #: src/ui/gui/psppire-data-window.c:619 #, c-format msgid "" "Renaming \"%s\" to \"%s\" will destroy the existing dataset named \"%s\". " "Are you sure that you want to do this?" msgstr "" "Μετονομασία από \"%s\" σε \"%s\" θα καταστρέψει την υπάρχουσα βάση δεδομένων " "με το όνομα \"%s\". Θέλεις σίγουρα να το κάνεις αυτό;" #: src/ui/gui/psppire-data-window.c:625 msgid "Delete" msgstr "Διαγραφή" #: src/ui/gui/psppire-data-window.c:647 #, c-format msgid "Please enter a new name for dataset \"%s\":" msgstr "Παρακαλώ, εισήγαγε ένα νέο όνομα για τη βάση δεδομένων \"%s\":" #: src/ui/gui/psppire-data-window.c:649 msgid "Rename Dataset" msgstr "Μετονομασία Βάσης" #: src/ui/gui/psppire-data-window.c:1199 src/ui/gui/output-window.ui:68 #: src/ui/gui/syntax-editor.ui:22 msgid "_File" msgstr "_Αρχείο" #: src/ui/gui/psppire-data-window.c:1203 src/ui/gui/syntax-editor.ui:25 msgid "_New" msgstr "_Νέο" #: src/ui/gui/psppire-data-window.c:1210 msgid "_Syntax" msgstr "_Σύνταξη" #: src/ui/gui/psppire-data-window.c:1213 src/ui/gui/data-editor.ui:177 #: src/ui/gui/data-editor.ui:189 msgid "_Data" msgstr "_Δεδομένα" #: src/ui/gui/psppire-data-window.c:1220 src/ui/gui/syntax-editor.ui:36 msgid "_Open" msgstr "_Άνοιγμα" #: src/ui/gui/psppire-data-window.c:1223 msgid "_Import Data..." msgstr "_Εισαγωγή Δεδομένων..." #: src/ui/gui/psppire-data-window.c:1231 src/ui/gui/logistic.ui:261 #: src/ui/gui/regression.ui:66 msgid "_Save..." msgstr "Απο_Θήκευση..." #: src/ui/gui/psppire-data-window.c:1234 msgid "Save _As..." msgstr "Αποθήκευση _Ως..." #: src/ui/gui/psppire-data-window.c:1237 msgid "_Rename Dataset..." msgstr "_Μετονομασία Βάσης..." #: src/ui/gui/psppire-data-window.c:1248 msgid "_Display Data File Information" msgstr "_Πληροφορίες Αρχείου Δεδομένων" #: src/ui/gui/psppire-data-window.c:1255 msgid "Working File" msgstr "_Αρχείο Εργασίας" #: src/ui/gui/psppire-data-window.c:1257 msgid "_External File..." msgstr "_Εξωτερικό Αρχείο..." #: src/ui/gui/psppire-data-window.c:1267 msgid "_Recently Used Data" msgstr "_Δεδομένα Πρόσφατης Χρήσης" #: src/ui/gui/psppire-data-window.c:1268 msgid "Recently Used _Files" msgstr "Αρχεία Πρόσφατης _Χρήσης" #: src/ui/gui/psppire-data-window.c:1315 src/ui/gui/output-window.ui:82 #: src/ui/gui/syntax-editor.ui:59 msgid "_Quit" msgstr "Έ_Ξοδος" #: src/ui/gui/psppire-data-window.c:1333 src/ui/gui/output-window.ui:89 #: src/ui/gui/syntax-editor.ui:66 msgid "_Edit" msgstr "_Διόρθωση" #: src/ui/gui/psppire-data-window.c:1339 msgid "_Go To Variable..." msgstr "_Προς την μεταβλητή..." #: src/ui/gui/psppire-data-window.c:1340 msgid "_Go To Case..." msgstr "Π_Ρος την Υπόθεση..." #: src/ui/gui/psppire-data-window.c:1364 src/ui/gui/syntax-editor.ui:69 msgid "Cu_t" msgstr "Απο_Κοπή" #: src/ui/gui/psppire-data-window.c:1373 src/ui/gui/output-window.ui:96 #: src/ui/gui/syntax-editor.ui:74 msgid "_Copy" msgstr "_Αντιγραφή" #: src/ui/gui/psppire-data-window.c:1380 src/ui/gui/syntax-editor.ui:79 msgid "_Paste" msgstr "Επικό_Λληση" #: src/ui/gui/psppire-data-window.c:1387 msgid "Clear _Variables" msgstr "Κα_Θαρισμός Μεταβλητών" #: src/ui/gui/psppire-data-window.c:1401 msgid "_Find..." msgstr "_Αναζήτηση..." #: src/ui/gui/psppire-data-window.c:1407 src/ui/gui/logistic.ui:246 msgid "_Options..." msgstr "Ε_Πιλογές..." #: src/ui/gui/psppire-data-window.c:1676 msgid "Jump to variable" msgstr "Πήγαινε στην μεταβλητή" #: src/ui/gui/psppire-data-window.c:1689 msgid "Jump to a case in the data sheet" msgstr "Πήγαινε σε μία Υπόθεση στο Φύλλο Δεδομένων" #: src/ui/gui/psppire-data-window.c:1703 msgid "Search for values in the data" msgstr "Αναζήτηση τιμών στην ενεργή βάση" #: src/ui/gui/psppire-data-window.c:1715 msgid "Create a new case at the current position" msgstr "Δημιοργία νέας υπόθεσης στην παρούσα θέση" #: src/ui/gui/psppire-data-window.c:1727 msgid "Create a new variable at the current position" msgstr "Δημιοργία νέας μεταβλητής στην παρούσα θέση" #: src/ui/gui/psppire-data-window.c:1741 msgid "Split the active dataset" msgstr "Διαίρεση της ενεργής Βάσης" #: src/ui/gui/psppire-data-window.c:1753 msgid "Weight cases by variable" msgstr "Στάθμιση υποθέσεων βάση μεταβλητής" #: src/ui/gui/psppire-data-window.c:1764 msgid "Show/hide value labels" msgstr "Δείξε/Κρύψε ταμπέλες τιμών" #: src/ui/gui/psppire-data-window.c:1904 msgid "Data Editor" msgstr "Επεξεργασία Δεδομένων" #: src/ui/gui/psppire-encoding-selector.c:140 msgid "Automatically Detect" msgstr "Αυτόματος Εντοπισμός" #: src/ui/gui/psppire-encoding-selector.c:147 msgid "Locale Encoding" msgstr "Κωδικοποίηση" #: src/ui/gui/psppire-encoding-selector.c:177 msgid "Character Encoding: " msgstr "Κωδικοποίηση Χαρακτήρων: " #: src/ui/gui/psppire-import-assistant.c:337 msgid "line" msgstr "γραμμή" #: src/ui/gui/psppire-import-assistant.c:347 msgid "var" msgstr "μετ" #: src/ui/gui/psppire-import-assistant.c:560 msgid "Importing Spreadsheet Data" msgstr "Δεδομένα Υπ. Φύλλου εισάγωνται" #: src/ui/gui/psppire-import-assistant.c:686 msgid "Text Files" msgstr "Αρχεία Κειμένου" #: src/ui/gui/psppire-import-assistant.c:691 msgid "Text (*.txt) Files" msgstr "Αρχεία Κειμένου (*.txt)" #: src/ui/gui/psppire-import-assistant.c:697 msgid "Plain Text (ASCII) Files" msgstr "Απλά Αρχεία Κειμένου (ASCII)" #: src/ui/gui/psppire-import-assistant.c:702 msgid "Comma Separated Value Files" msgstr "Αρχεία Τιμών Χωρισμένα με Κόμμα" #: src/ui/gui/psppire-import-assistant.c:709 msgid "Tab Separated Value Files" msgstr "Αρχεία Τιμών Χωρισμένα με διάκενο" #: src/ui/gui/psppire-import-assistant.c:714 msgid "Gnumeric Spreadsheet Files" msgstr "Αρχεία Υπολ. φύλλων Gnumeric" #: src/ui/gui/psppire-import-assistant.c:719 msgid "OpenDocument Spreadsheet Files" msgstr "Αρχεία Υπολογ. φύλλων Ανοικτού Εγγράφου (odt)" #: src/ui/gui/psppire-import-assistant.c:724 msgid "All Spreadsheet Files" msgstr "Όλα τα αρχεία Υπολογ.φύλλων" #: src/ui/gui/psppire-import-assistant.c:733 msgid "Select File to Import" msgstr "Επιλογή αρχείου για Εισαγωγή" #: src/ui/gui/psppire-import-assistant.c:770 msgid "Importing Delimited Text Data" msgstr "Εισαγωγή Δεδομένων από Αρχείο Κειμένου Υποδιαστολής" #: src/ui/gui/psppire-import-assistant.c:865 msgid "Select the First Line" msgstr "Επίλεξε τη Πρώτη Γραμμή" #: src/ui/gui/psppire-import-assistant.c:877 msgid "Line" msgstr "Γραμμή" #: src/ui/gui/psppire-import-assistant.c:931 msgid "" "This assistant will guide you through the process of importing data into " "PSPP from a text file with one line per case, in which fields are separated " "by tabs, commas, or other delimiters.\n" "\n" msgstr "" "Αυτός ο βοηθός θα σε καθοδηγήσει στις διαδικασίες εισαγωγής δεδομένων στο " "PSPP από ένα αρχείο κειμένου, με κάθε γραμμή να ορίζει μία υπόθεση, και με " "πεδία διαχωρισμένα με διάκενα, κόμματα, ή άλλου τύπου υποδιαστολές \n" "\n" #: src/ui/gui/psppire-import-assistant.c:941 #, c-format msgid "The selected file contains %'lu line of text. " msgid_plural "The selected file contains %'lu lines of text. " msgstr[0] "Το επιλεγμένο αρχείο περιέχει %'lu γραμμή κειμένου. " msgstr[1] "Το επιλεγμένο αρχείο περιέχει %'lu γραμμές κειμένου. " #: src/ui/gui/psppire-import-assistant.c:950 #, c-format msgid "The selected file contains approximately %'lu line of text. " msgid_plural "The selected file contains approximately %'lu lines of text. " msgstr[0] "Το επιλεγμένο αρχείο περιέχει σχεδόν %'lu γραμμή κειμένου. " msgstr[1] "Το επιλεγμένο αρχείο περιέχει σχεδόν %'lu γραμμές κειμένου. " #: src/ui/gui/psppire-import-assistant.c:956 #, c-format msgid "" "Only the first %zu line of the file will be shown for preview purposes in " "the following screens. " msgid_plural "" "Only the first %zu lines of the file will be shown for preview purposes in " "the following screens. " msgstr[0] "" "Μόνο η πρώτη %zu γραμμή του αρχείου θα εμφανιστεί στην επόμενη οθόνη για " "λόγους προεπισκόπησης. " msgstr[1] "" "Μόνο οι πρώτες %zu γραμμές του αρχείου θα εμφανιστούν στην επόμενη οθόνη για " "λόγους προεπισκόπησης. " #: src/ui/gui/psppire-import-assistant.c:965 msgid "You may choose below how much of the file should actually be imported." msgstr "Μπορείς να διαλέξεις παρακάτω πόσοτητα αρχείου που θα γίνει εισαγωγή." #: src/ui/gui/psppire-import-assistant.c:974 #, c-format msgid "Only the first %4d cases" msgstr "Μόνο οι πρώτες %4d υποθέσεις" #: src/ui/gui/psppire-import-assistant.c:985 #, c-format msgid "Only the first %3d %% of file (approximately)" msgstr "Μόνο οι πρώτες %3d %% του αρχείου (σχεδόν)" #: src/ui/gui/psppire-import-assistant.c:1009 msgid "Select the Lines to Import" msgstr "Επιλογή Γραμμών για Εισαγωγή" #: src/ui/gui/psppire-import-assistant.c:1151 msgid "Choose Separators" msgstr "Διάλεξε Διαχωριστές" #: src/ui/gui/psppire-import-assistant.c:1438 msgid "Adjust Variable Formats" msgstr "Ρύθμιση Μορφής Μεταβλητών" #: src/ui/gui/psppire-output-view.c:410 msgid "Message" msgstr "Μήνυμα" #: src/ui/gui/psppire-output-view.c:543 msgid "failed to create temporary directory during clipboard operation" msgstr "" "αποτυχία δημιουργίας προσωρινού καταλόγου στη διάρκεια διαδικασιών στο " "Πρόχειρο" #: src/ui/gui/psppire-output-window.c:241 msgid "Infer file type from extension" msgstr "Αναγνώριση τύπος αρχείου από κατάληξη" #: src/ui/gui/psppire-output-window.c:242 msgid "SPSS Viewer (*.spv)" msgstr "Προβολή SPSS (*.spv)" #: src/ui/gui/psppire-output-window.c:243 msgid "PDF (*.pdf)" msgstr "PDF (*.pdf)" #: src/ui/gui/psppire-output-window.c:244 msgid "HTML (*.html)" msgstr "HTML (*.html)" #: src/ui/gui/psppire-output-window.c:245 msgid "OpenDocument (*.odt)" msgstr "Ανοικτού Εγγράφου (*.odt)" #: src/ui/gui/psppire-output-window.c:246 msgid "Text (*.txt)" msgstr "Κειμένου (*.txt)" #: src/ui/gui/psppire-output-window.c:247 msgid "Text [plain] (*.txt)" msgstr "Κειμένου [απλού] (*.txt)" #: src/ui/gui/psppire-output-window.c:248 msgid "PostScript (*.ps)" msgstr "PostScript (*.ps)" #: src/ui/gui/psppire-output-window.c:249 msgid "Comma-Separated Values (*.csv)" msgstr "Χωρισμένες με κόμμα τιμές (*.csv)" #: src/ui/gui/psppire-output-window.c:350 msgid "Export Output" msgstr "Αποθήκευση Αρχείου" #: src/ui/gui/psppire-output-window.c:548 msgid "Output Viewer" msgstr "Απεικ. Εξαγωγής" #: src/ui/gui/psppire-spreadsheet-model.c:237 msgid "(empty)" msgstr "(κενό)" #: src/ui/gui/psppire-syntax-window.c:226 msgid "Text Search" msgstr "Αναζήτηση κειμένου" #: src/ui/gui/psppire-syntax-window.c:229 msgid "_OK" msgstr "_ΟΚ" #: src/ui/gui/psppire-syntax-window.c:231 msgid "_Cancel" msgstr "_Ακύρωση" #: src/ui/gui/psppire-syntax-window.c:239 msgid "Text to search for:" msgstr "Κείμενο προς αναζήτηση για:" #: src/ui/gui/psppire-syntax-window.c:570 #, c-format msgid "Saved file `%s'" msgstr "Αποθ/μένο αρχείο `%s'" #: src/ui/gui/psppire-syntax-window.c:591 msgid "Save Syntax" msgstr "Αποθ. Σύνταξης" #: src/ui/gui/psppire-syntax-window.c:601 src/ui/gui/psppire-window.c:657 msgid "Syntax Files (*.sps) " msgstr "Αρχεία Σύνταξης (*.sps) " #: src/ui/gui/psppire-syntax-window.c:970 msgid "Syntax Editor" msgstr "Επεξ. Σύνταξης" #: src/ui/gui/psppire-syntax-window.c:990 #, c-format msgid "Cannot load syntax file `%s'" msgstr "Αδυναμία φόρτωσης αρχείου σύνταξης `%s'" #: src/ui/gui/psppire-variable-sheet.c:412 #, c-format msgid "{%s, %s}..." msgstr "{%s, %s}..." #: src/ui/gui/psppire-var-sheet-header.c:64 msgid "Decimal" msgstr "Δεκαδικά" #: src/ui/gui/psppire-var-sheet-header.c:79 msgid "Align" msgstr "Ευθυγρ/ση" #: src/ui/gui/psppire-var-sheet-header.c:82 msgid "Measure" msgstr "Μέτρηση" #: src/ui/gui/psppire-window.c:430 #, c-format msgid "Save the changes to `%s' before closing?" msgstr "Αποθήκευση αλλαγών σε `%s' πριν το κλείσιμο?" #: src/ui/gui/psppire-window.c:437 #, c-format msgid "" "If you don't save, changes from the last %ld seconds will be permanently " "lost." msgstr "" "Αν δεν αποθηκεύσης, αλλαγές από τα τελευταία %ld δευτ/πτα θα χαθούν μόνιμα." "lost." #: src/ui/gui/psppire-window.c:441 msgid "Close _without saving" msgstr "Κλείσιμο _Δίχως Αποθήκευσης" #: src/ui/gui/psppire-window.c:625 src/ui/gui/psppire-window.c:629 msgid "Open" msgstr "Άνοιγμα" #: src/ui/gui/psppire-window.c:634 msgid "Data and Syntax Files" msgstr "Αρχεία δεδομένων και Σύνταξης" #: src/ui/gui/psppire-window.c:646 msgid "System Files (*.sav, *.zsav)" msgstr "Αρχεία Συστήματος (*.sav, *.zsav)" #: src/ui/gui/psppire-window.c:663 msgid "Output Files (*.spv) " msgstr "Εξερχόμενα Αρχεία (*.spv) " #: src/ui/gui/t-test-options.c:65 #, c-format msgid "Con_fidence Interval: %2d %%" msgstr "_Διάστημα Εμπιστοσύνης: %2d %%" #: src/ui/gui/val-labs-dialog.c:591 #, c-format msgid "%s = `%s'" msgstr "%s = `%s'" #: src/ui/gui/var-type-dialog.c:541 #, fuzzy #| msgid "Variable and Name" msgid "Variable Type and Format" msgstr "Μεταβλητή κ Όνομα" #: src/ui/gui/windows-menu.c:92 msgid "_Minimize all Windows" msgstr "Ε_Λαχιστοποίηση Όλων" #: src/ui/gui/windows-menu.c:100 msgid "_Split" msgstr "_Διαίρεση" #: src/ui/gui/windows-menu.c:132 msgid "_Windows" msgstr "_Παράθυρα" #: utilities/pspp-convert.c:67 #, c-format msgid "%s argument must be a single character" msgstr "Το όρισμα %s πρέπει να είναι ένας χαρακτήρας" #: utilities/pspp-convert.c:265 msgid "exactly two non-option arguments are required; use --help for help" msgstr "" "ακριβώς δύο (μη) ορίσματα απαιτούνται εκτός των επιλογών; χρήση της --help " "για βοήθεια" #: utilities/pspp-convert.c:276 #, c-format msgid "%s: cannot guess output format (use -O option)" msgstr "" "%s: αδυναμία κατανόησης εξερχόμενου μορφοτύπου (κάνε χρήση της επιλογής -O)" #: utilities/pspp-convert.c:341 #, c-format msgid "%s: unknown output format (use -O option)" msgstr "%s: άγνωστος εξερχόμενος μορφοτύπος (κάνε χρήση της επιλογής-O)" #: utilities/pspp-convert.c:360 #, c-format msgid "%s: error reading input file" msgstr "%s: σφάλμα ανάγνωσης εισερχόμενου αρχείου" #: utilities/pspp-convert.c:362 #, c-format msgid "%s: error writing output file" msgstr "%s: σφάλμα εγγραφής εξερχομένου αρχείου" #: utilities/pspp-convert.c:409 #, c-format msgid "%s: error opening password file" msgstr "%s: σφάλμα ανοίγματος κωδικοποιημένου αρχείου" #: utilities/pspp-convert.c:425 #, c-format msgid "" "\n" "%s: password not in file" msgstr "" "\n" "%s: κωδικός δεν είναι στο αρχείο" #: utilities/pspp-convert.c:462 #, c-format msgid "%s: '%c' is not in alphabet" msgstr "%s: '%c' δεν είναι στην αλφάβητο" #: utilities/pspp-convert.c:526 msgid "sorry, wrong password" msgstr "συγνώμη, λάθος κωδικός" #: utilities/pspp-output.c:92 #, c-format msgid "%s and %s:" msgstr "%s και %s:" #: utilities/pspp-output.c:547 #, c-format msgid "%s: invalid XPath expression" msgstr "%s: μη έγκυρη έκφραση XPath" #: utilities/pspp-output.c:716 msgid "missing command name (use --help for help)" msgstr "λείπει όνομα εντολής (χρησιμοποιήστε --help για βοήθεια)" #: utilities/pspp-output.c:720 #, c-format msgid "unknown command \"%s\" (use --help for help)" msgstr "άγνωστη εντολή \"%s\" (χρησιμοποιήστε --help για βοήθεια)" #: utilities/pspp-output.c:728 #, fuzzy, c-format #| msgid "\"%s\" command takes exactly %d argument%s" msgid "\"%s\" command takes exactly %d argument" msgid_plural "\"%s\" command takes exactly %d arguments" msgstr[0] "Η εντολή \"%s\" παίρνει ακριβώς το %d όρισμα %s" msgstr[1] "Η εντολή \"%s\" παίρνει ακριβώς το %d όρισμα %s" #: utilities/pspp-output.c:735 #, fuzzy, c-format #| msgid "\"%s\" command requires at least %d argument%s" msgid "\"%s\" command requires at least %d argument" msgid_plural "\"%s\" command requires at least %d arguments" msgstr[0] "\"%s\" εντολή απαιτεί τουλάχιστον %d ορίσματα%s" msgstr[1] "\"%s\" εντολή απαιτεί τουλάχιστον %d ορίσματα%s" #: utilities/pspp-output.c:742 #, c-format msgid "\"%s\" command requires between %d and %d arguments" msgstr "\"%s\" εντολή απαιτεί μεταξύ %d και %d ορίσματα" #: utilities/pspp-output.c:782 msgid "The following object classes are supported:" msgstr "Υποστηρίζονται οι ακόλουθες κλάσεις αντικειμένων:" #: utilities/pspp-output.c:791 #, c-format msgid "%s: unknown object class (use --select=help for help" msgstr "" "%s: άγνωστη κλάση αντικειμένων (χρησιμοποιήστε --select=help για βοήθεια)" #: src/language/utilities/set.q:162 #, c-format msgid "%s must be between 0 and 20." msgstr "%s πρέπει να είναι μεταξύ 0 και 20." #: src/language/utilities/set.q:172 src/language/utilities/set.q:179 #, c-format msgid "%s must be at least 1." msgstr "%s πρέπει να είναι τουλάχτισον 1." #: src/language/utilities/set.q:205 #, c-format msgid "%s must be at least 1MB" msgstr "%s πρέπει να είναι τουλάχιστον 1MB" #: src/language/utilities/set.q:207 #, c-format msgid "%s must be positive" msgstr "%s πρέπει να είναι θετικό" #: src/language/utilities/set.q:213 src/language/utilities/set.q:215 #: src/language/utilities/set.q:217 src/language/utilities/set.q:219 #: src/language/utilities/set.q:221 src/language/utilities/set.q:223 #: src/language/utilities/set.q:225 src/language/utilities/set.q:227 #: src/language/utilities/set.q:229 src/language/utilities/set.q:231 #: src/language/utilities/set.q:233 #, c-format msgid "%s is obsolete." msgstr "%s έχει απαρχαιωθεί." #: src/language/utilities/set.q:239 msgid "Active file compression is not implemented." msgstr "Η Ενεργή Συμπίεση Αρχείου δεν είναι διαθέσιμη." #: src/language/utilities/set.q:403 #, c-format msgid "%s must be 1500 or later." msgstr "%s πρέπει να είναι 1500 ή μεγαλύτερη." #: src/language/utilities/set.q:410 #, c-format msgid "expecting %s or year" msgstr "αναμένει %s ή έτη" #: src/language/utilities/set.q:438 src/language/utilities/set.q:535 #, c-format msgid "%s must be at least %d." msgstr "%s πρέπει να είναι τουλάχιστον %d." #: src/language/utilities/set.q:474 #, c-format msgid "%s is not a recognized encoding or locale name" msgstr "%s δεν είναι μία αναγνωρισμένη κωδικοποίηση" #: src/language/utilities/set.q:562 #, c-format msgid "" "%s requires numeric output format as an argument. Specified format %s is of " "type string." msgstr "" "%s απαιτεί μορφότυπο αριθμητικής εξαγωγής σαν όρισμα. Ο δοθέντας μορφότυπος " "%s είναι τύπου συμβολοσειράς." #: src/language/utilities/set.q:791 msgid "ISL (32-bit IEEE 754 single, little-endian)" msgstr "ISL (32-bit IEEE 754 μονό, lΜικρή-Τελότητ)" #: src/language/utilities/set.q:794 msgid "ISB (32-bit IEEE 754 single, big-endian)" msgstr "ISB (32-bit IEEE 754 μονό, Μεγάλη-Τελότητα)" #: src/language/utilities/set.q:797 msgid "IDL (64-bit IEEE 754 double, little-endian)" msgstr "IDL (64-bit IEEE 754 διπλός, Μικρή-Τελότητα)" #: src/language/utilities/set.q:800 msgid "IDB (64-bit IEEE 754 double, big-endian)" msgstr "IDB (64-bit IEEE 754 διπλός, Μεγάλη-Τελότητα)" #: src/language/utilities/set.q:804 msgid "VF (32-bit VAX F, VAX-endian)" msgstr "VF (32-bit VAX F, VAX-Τελότητα)" #: src/language/utilities/set.q:807 msgid "VD (64-bit VAX D, VAX-endian)" msgstr "VD (64-bit VAX D, VAX-Τελότητα)" #: src/language/utilities/set.q:810 msgid "VG (64-bit VAX G, VAX-endian)" msgstr "VG (64-bit VAX G, VAX-Τελότητα)" #: src/language/utilities/set.q:814 msgid "ZS (32-bit IBM Z hexadecimal short, big-endian)" msgstr "ZS (32-bit IBM Z δεκαεξαδικό ελάχιστο, Μεγάλη Τελότητα (Endian))" #: src/language/utilities/set.q:817 msgid "ZL (64-bit IBM Z hexadecimal long, big-endian)" msgstr "ZL (64-bit IBM Z δεκαεξαδικό εκτενές, Μεγάλη Τελότητα (Endian))" #: src/language/utilities/set.q:985 #, c-format msgid "%s is %s." msgstr "%s είναι %s." #: src/language/utilities/set.q:1089 #, c-format msgid "" "Too many %s commands without a %s: at most %d levels of saved settings are " "allowed." msgstr "" "Πολλές εντολές %s χωρίς %s: Μέγιστα %d επίπεδα αποθήκευσης επιλογών " "επιτρέπονται." #: src/language/utilities/set.q:1109 #, c-format msgid "%s without matching %s." msgstr "%s χωρίς ταίριασμα %s." #: src/language/stats/crosstabs.q:327 #, c-format msgid "Missing mode %s not allowed in general mode. Assuming %s." msgstr "" "Ελλειπούσα Επικρατούσα τιμή %s δεν επιτρέπεται στη γενική μορφή. Υποθέτει %s." #: src/language/stats/crosstabs.q:444 msgid "Too many cross-tabulation variables or dimensions." msgstr "Πολλές μεταβλητές ή διαστάσεις στις Πινακ. Διασταυρώσεις." #: src/language/stats/crosstabs.q:509 #, c-format msgid "%s must be specified before %s." msgstr "%s πρέπει να οριστεί πριν %s." #: src/language/stats/crosstabs.q:543 #, c-format msgid "Maximum value (%ld) less than minimum value (%ld)." msgstr "Μέγιστη τιμή (%ld) μικρότερη από την Ελάχιστη τιμή (%ld)." #: src/language/stats/crosstabs.q:922 msgid "Summary" msgstr "Σύνοψη" #: src/language/stats/crosstabs.q:935 msgid "Crosstabulation" msgstr "Π. Διασταυρώσεων" #. TRANSLATORS: The %s here describes a crosstabulation. It takes the #. form "var1 * var2 * var3 * ...". #: src/language/stats/crosstabs.q:1013 #, c-format msgid "Crosstabulation %s contained no non-missing cases." msgstr "Οι Πιν. Διασταυρώσεις %s δεν περιείχαν ελλειπούσες υποθέσεις." #: src/language/stats/crosstabs.q:1204 msgid "Missing value" msgstr "Ελλειπούσα Τιμή" #: src/language/stats/crosstabs.q:1263 msgid "Row %" msgstr "Σειρά %" #: src/language/stats/crosstabs.q:1264 msgid "Column %" msgstr "Στήλη %" #: src/language/stats/crosstabs.q:1265 msgid "Total %" msgstr "Σύνολο %" #: src/language/stats/crosstabs.q:1269 msgid "Adjusted Residual" msgstr "Προσαρμοσμένο Σφάλμα" #: src/language/stats/crosstabs.q:1288 msgid "Chi-Square Tests" msgstr "Χ-Τετράγωνο Τεστ" #: src/language/stats/crosstabs.q:1294 msgid "Pearson Chi-Square" msgstr "Pearson Χ-Τετράγωνο" #: src/language/stats/crosstabs.q:1295 msgid "Likelihood Ratio" msgstr "Λόγος Πιθανότητας" #: src/language/stats/crosstabs.q:1296 msgid "Fisher's Exact Test" msgstr "Επακριβής Τεστ Fisher" #: src/language/stats/crosstabs.q:1297 msgid "Continuity Correction" msgstr "Διόρθωση Συνέχειας" #: src/language/stats/crosstabs.q:1298 msgid "Linear-by-Linear Association" msgstr "Γραμμική-επί-Γραμμική Συσχέτιση" #: src/language/stats/crosstabs.q:1299 src/language/stats/crosstabs.q:1345 #: src/language/stats/crosstabs.q:1854 msgid "N of Valid Cases" msgstr "N έγκυρων Υποθέσεων" #: src/language/stats/crosstabs.q:1305 msgid "Asymptotic Sig. (2-tailed)" msgstr "Ασυμπτ. Στ.Σημ. (2-κατ/νσης)" #: src/language/stats/crosstabs.q:1319 msgid "Symmetric Measures" msgstr "Συμμετρικά Μέτρα" #: src/language/stats/crosstabs.q:1324 src/language/stats/crosstabs.q:1364 #: src/language/stats/crosstabs.q:1411 msgid "Values" msgstr "Τιμές" #: src/language/stats/crosstabs.q:1326 src/language/stats/crosstabs.q:1413 msgid "Asymp. Std. Error" msgstr "Ασυμπτ. Τυπικό Σφάλμα" #: src/language/stats/crosstabs.q:1327 src/language/stats/crosstabs.q:1414 msgid "Approx. T" msgstr "Προσεγγ. T" #: src/language/stats/crosstabs.q:1328 src/language/stats/crosstabs.q:1415 msgid "Approx. Sig." msgstr "Προσεγγ. Στ.Σημ." #: src/language/stats/crosstabs.q:1333 src/language/stats/crosstabs.q:1420 msgid "Nominal by Nominal" msgstr "Ονοματική επί Ονοματική" #: src/language/stats/crosstabs.q:1334 msgid "Cramer's V" msgstr "Cramer's V" #: src/language/stats/crosstabs.q:1334 msgid "Contingency Coefficient" msgstr "Συντελεστής Συνάφειας" #: src/language/stats/crosstabs.q:1336 src/language/stats/crosstabs.q:1425 msgid "Ordinal by Ordinal" msgstr "Ιεραρχική επί Ιεραρχική" #: src/language/stats/crosstabs.q:1337 msgid "Kendall's tau-b" msgstr "Kendall's tau-b" #: src/language/stats/crosstabs.q:1337 msgid "Kendall's tau-c" msgstr "Kendall's tau-c" #: src/language/stats/crosstabs.q:1338 msgid "Spearman Correlation" msgstr "Συσχέτιση Spearman" #: src/language/stats/crosstabs.q:1340 msgid "Interval by Interval" msgstr "Ισοδιαστημική επί Ισοδιαστημική" #: src/language/stats/crosstabs.q:1341 msgid "Pearson's R" msgstr "Pearson's R" #: src/language/stats/crosstabs.q:1343 msgid "Measure of Agreement" msgstr "Μέτρηση Συμφωνίας" #: src/language/stats/crosstabs.q:1359 msgid "Risk Estimate" msgstr "Εκτίμηση Ρίσκου" #: src/language/stats/crosstabs.q:1368 #, fuzzy, no-c-format #| msgid "95% Confidence Interval" msgid "95% Confidence Interval" msgstr "Διάστημα Εμπιστοσύνης 95%" #: src/language/stats/crosstabs.q:1389 msgid "Symmetric" msgstr "Συμμετρική" #: src/language/stats/crosstabs.q:1391 src/language/stats/crosstabs.q:1396 #, c-format msgid "%s Dependent" msgstr "%s Εξαρτημένη" #: src/language/stats/crosstabs.q:1406 msgid "Directional Measures" msgstr "Κατευθυντήρια Μέτρα" #: src/language/stats/crosstabs.q:1422 msgid "Goodman and Kruskal tau" msgstr "Goodman και Kruskal tau" #: src/language/stats/crosstabs.q:1423 msgid "Uncertainty Coefficient" msgstr "Συντελεστής Αβεβαιότητας" #: src/language/stats/crosstabs.q:1426 msgid "Somers' d" msgstr "Somers' d" #: src/language/stats/crosstabs.q:1428 msgid "Nominal by Interval" msgstr "Ονοματική επί Ισοδιαστημική" #: src/language/stats/crosstabs.q:1826 #, c-format msgid "Odds Ratio for %s" msgstr "Λόγος αναλογιών για %s" #: src/language/stats/crosstabs.q:1835 #, c-format msgid "For cohort %s = " msgstr "Για cohort (κλάσεις) %s = " #: src/ui/gui/aggregate.ui:24 msgid "Aggregate Data" msgstr "Συναθροιστικά Δεδομένα" #: src/ui/gui/aggregate.ui:126 msgid "_Break variable(s)" msgstr "Μεταβλητή(ες) _Διαχωρισμού" #: src/ui/gui/aggregate.ui:179 msgid "Variable Name: " msgstr "Όνομα Μεταβλητής: " #: src/ui/gui/aggregate.ui:215 msgid "Variable Label: " msgstr "Ετικέτα Μεταβλητής: " #: src/ui/gui/aggregate.ui:252 msgid "Function: " msgstr "Συναρτήσεις: " #: src/ui/gui/aggregate.ui:327 msgid "Argument 1: " msgstr "Όρισμα 1: " #: src/ui/gui/aggregate.ui:364 msgid "Argument 2: " msgstr "Όρισμα 2: " #: src/ui/gui/aggregate.ui:428 msgid "Aggregated variables" msgstr "Μεταβλητές Συνάθροισης" #: src/ui/gui/aggregate.ui:469 msgid "_Add aggregated variables to the active dataset" msgstr "_Πρόσθεση μεταβλητών Συνάθροισης στην ενεργή βάση δεδομένων" #: src/ui/gui/aggregate.ui:486 msgid "_Replace the current dataset with the aggregated variables" msgstr "Αντικατάσταση της τωρινής βάσης δεδομένων με μεταβλητές Συνάθροισης" #: src/ui/gui/aggregate.ui:504 msgid "_Write a new data file containing only the aggregated variables" msgstr "" "_Εγγραφή νέου αρχείου δεδομένων που περιέχει μόνο τις μεταβλητές Συνάθροισης" #: src/ui/gui/aggregate.ui:544 msgid "label" msgstr "ετικέτα" #: src/ui/gui/aggregate.ui:593 msgid "File is _already sorted on break variable(s)" msgstr "" "Το αρχείο είναι ήδη ταξινομημένο με βαση την(ις) Μεταβλητές(η) Διαχωρισμού" #: src/ui/gui/aggregate.ui:609 msgid "Sort file before a_ggregating" msgstr "Ταξινόμηση αρχείου πριν την Συνάθροισή του" #: src/ui/gui/aggregate.ui:630 msgid "Options for very large datasets" msgstr "Επιλογές για μεγάλες βάσεις δεδομένων" #: src/ui/gui/autorecode.ui:24 msgid "Automatic Recode" msgstr "Αυτόματη Κωδικοποίηση" #: src/ui/gui/autorecode.ui:120 msgid "Variable -> New Name" msgstr "Μεταβλητή -> Νέο Όνομα" #: src/ui/gui/autorecode.ui:145 msgid "_Lowest value" msgstr "_Κατώτατη τιμή" #: src/ui/gui/autorecode.ui:163 msgid "_Highest value" msgstr "_Ανώτατη τιμή" #: src/ui/gui/autorecode.ui:185 msgid "Recode starting from" msgstr "Να αρχίσει η Επανακωδικοποίηση από" #: src/ui/gui/autorecode.ui:204 msgid "_New Name" msgstr "_Νέο Όνομα" #: src/ui/gui/autorecode.ui:227 msgid "_Add New Name" msgstr "_Πρόσθεση Νέου Ονόματος" #: src/ui/gui/autorecode.ui:285 msgid "_Use the same recoding scheme for all variables" msgstr "Χρήρη της ίδιας μορφής κωδικοποίησης για όλες τις μεταβλητές" #: src/ui/gui/autorecode.ui:301 msgid "Treat _blank string values as missing" msgstr "_Κενές τιμές συμβολοσειράς θα θεωρηθούν σαν ελλειπούσες" #: src/ui/gui/binomial.ui:86 msgid "_Test Variable List:" msgstr "_Λίστα Εξέτασης Μεταβλητών:" #: src/ui/gui/binomial.ui:160 src/ui/gui/chi-square.ui:281 msgid "_Get from data" msgstr "_Πάρε από δεδομένα" #: src/ui/gui/binomial.ui:181 src/ui/gui/indep-samples.ui:150 msgid "_Cut point:" msgstr "Τιμή _Απόρριψης:" #: src/ui/gui/binomial.ui:225 msgid "Define Dichotomy" msgstr "Ορισμός Διχοτόμησης" #: src/ui/gui/binomial.ui:245 msgid "Test _Proportion:" msgstr "Τεστ _Αναλλογιών:" #: src/ui/gui/compute.ui:32 msgid "Compute Variable: Type and Label" msgstr "Υπολογισμός Μεταβλητής: Τύπος και Ετικέτα" #: src/ui/gui/compute.ui:67 msgid "Use _expression as label" msgstr "Χρήση _Εκφράσης σαν Ετικέτα" #: src/ui/gui/compute.ui:90 msgid "_Label:" msgstr "_Ετικέτα:" #: src/ui/gui/compute.ui:194 msgid "_String" msgstr "_Συμβολοσειρά" #: src/ui/gui/compute.ui:287 msgid "_Numeric" msgstr "_Αριθμητική" #: src/ui/gui/compute.ui:343 msgid "Compute Variable" msgstr "Υπολογισμός Μεταβλητής" #: src/ui/gui/compute.ui:381 msgid "Target _Variable:" msgstr "Επιλεγμένη _Μεταβλητή:" #: src/ui/gui/compute.ui:412 msgid "_Type & Label..." msgstr "_Τύπος & Ετικέτα..." #: src/ui/gui/compute.ui:469 msgid "=" msgstr "=" #: src/ui/gui/compute.ui:526 msgid "_Numeric Expressions:" msgstr "_Αριθμητικές Εκφράσεις:" #: src/ui/gui/compute.ui:598 msgid "_Functions:" msgstr "_Συναρτήσεις:" #: src/ui/gui/compute.ui:678 msgid "_If..." msgstr "_Αν..." #: src/ui/gui/barchart.ui:24 msgid "Barchart" msgstr "Ραβδόγραμμα" #: src/ui/gui/barchart.ui:112 msgid "Category A_xis:" msgstr "Ά_Ξονας Κατηγοριών:" #: src/ui/gui/barchart.ui:140 msgid "_N of cases" msgstr "Αριθμός _Ν υποθέσεων" #: src/ui/gui/barchart.ui:158 msgid "_Cum. n of cases" msgstr "_Συσσωρ. Ν υποθέσεις" #: src/ui/gui/barchart.ui:174 msgid "Other _summary function" msgstr "Άλλη εντολή _περίληψης" #: src/ui/gui/barchart.ui:191 msgid "% of c_ases" msgstr "% υπο_Θέσεις" #: src/ui/gui/barchart.ui:207 msgid "C_um. % of cases" msgstr "Σ_υσσορ. % υποθέσεις" #: src/ui/gui/barchart.ui:270 src/ui/gui/histogram.ui:100 msgid "_Variable:" msgstr "_Μεταβλητή:" #: src/ui/gui/barchart.ui:308 msgid "Bars Represent" msgstr "Μπάρες δείχνουν" #: src/ui/gui/barchart.ui:340 msgid "Category C_luster:" msgstr "Κατηγορία Συστ_Άδας:" #: src/ui/gui/correlation.ui:24 msgid "Bivariate Correlations" msgstr "∆ιµεταβλητή Συσχετίσεις" #: src/ui/gui/correlation.ui:148 msgid "Pearso_n" msgstr "_Pearson" #: src/ui/gui/correlation.ui:164 msgid "_Kendall's tau-b" msgstr "_Kendall's tau-b" #: src/ui/gui/correlation.ui:180 msgid "_Spearman" msgstr "_Spearman" #: src/ui/gui/correlation.ui:200 msgid "Correlation Coefficients" msgstr "Συντελεστές Συσχέτισης" #: src/ui/gui/correlation.ui:224 msgid "_Two-tailed" msgstr "2πλης _Κατ/νσης" #: src/ui/gui/correlation.ui:241 msgid "One-tai_led" msgstr "Μίας Κατ/νσης" #: src/ui/gui/correlation.ui:262 msgid "Test of Significance" msgstr "Τεστ Στ.Σημαντικότητας" #: src/ui/gui/correlation.ui:275 msgid "_Flag significant correlations" msgstr "_Διάκριση Στ.Σημαντικών συσχετίσεων" #: src/ui/gui/count.ui:24 msgid "Count Occurrences of Values within Cases" msgstr "Μέτρηση Εμφάνιση Τιμών εντός Υποθέσεωμ" #: src/ui/gui/count.ui:117 msgid "Numeric _Variables:" msgstr "_Αριθμητικές Μεταβλητές:" #: src/ui/gui/count.ui:147 msgid "_Target Variable:" msgstr "Μεταβλητή _Επιλογής:" #: src/ui/gui/count.ui:178 msgid "Target _Label:" msgstr "_Ετικέτα Επιλογής:" #: src/ui/gui/count.ui:192 msgid "_Define Values..." msgstr "_Ορισμός Τιμών..." #: src/ui/gui/count.ui:257 msgid "Count Values within Cases: Values to Count" msgstr "Μέτρηση Τιμών εντός Υποθέσεων: Μέτρηση Τιμών" #: src/ui/gui/count.ui:305 msgid "Values _to Count:" msgstr "_Μέτρηση Τιμών:" #: src/ui/gui/comments.ui:25 msgid "Data File Comments" msgstr "Σχόλια Αρχείου Δεδομένου" #: src/ui/gui/comments.ui:49 msgid "Comments:" msgstr "Σχόλια:" #: src/ui/gui/comments.ui:106 msgid "Display comments in output" msgstr "Εμφάνιση σχολίων στην Εξαγωγή" #: src/ui/gui/comments.ui:127 msgid "Column Number: 0" msgstr "Αριθμός Στήλης: 0" #: src/ui/gui/crosstabs.ui:25 msgid "Crosstabs: Cells" msgstr "Π. Διασταυρώσεων: Κελιά" #: src/ui/gui/crosstabs.ui:67 msgid "Cell Display" msgstr "Εμφάνιση Κελιών" #: src/ui/gui/crosstabs.ui:99 msgid "Crosstabs" msgstr "Π. Διασταυρώσεων" #: src/ui/gui/crosstabs.ui:150 msgid "_Rows" msgstr "Σ_Ειρές" #: src/ui/gui/crosstabs.ui:195 msgid "_Columns" msgstr "_Σ_Τήλες" #: src/ui/gui/crosstabs.ui:242 msgid "_Format..." msgstr "_Μορφοποίηση..." #: src/ui/gui/crosstabs.ui:256 src/ui/gui/examine.ui:267 msgid "_Statistics..." msgstr "_Στατιστικά..." #: src/ui/gui/crosstabs.ui:270 msgid "Ce_lls..." msgstr "_Κελιά..." #: src/ui/gui/crosstabs.ui:348 msgid "Crosstabs: Format" msgstr "Πίνακες: Μορφοποίηση" #: src/ui/gui/crosstabs.ui:371 msgid "Print tables" msgstr "Εκτύπωση Πινάκων" #: src/ui/gui/crosstabs.ui:387 msgid "Pivot" msgstr "Συγκεντρωτικοί Πίνακες" #: src/ui/gui/crosstabs.ui:403 src/ui/gui/sort.ui:157 msgid "Ascending" msgstr "Αύξουσα" #: src/ui/gui/crosstabs.ui:455 msgid "Crosstabs: Statistics" msgstr "Π. Διασταυρώσεων: Statistics" #: src/ui/gui/chi-square.ui:30 msgid "Chi-Square Test" msgstr "Χ-Τετράγωνο Τεστ" #: src/ui/gui/chi-square.ui:82 msgid "All categor_ies equal" msgstr "Όλες οι κατηγορίες _Ίσες" #: src/ui/gui/chi-square.ui:103 msgid "_Values" msgstr "_Τιμές" #: src/ui/gui/chi-square.ui:159 msgid "Expected Values:" msgstr "Αναμενόμενες Τιμές:" #: src/ui/gui/chi-square.ui:204 msgid "Test _Variables" msgstr "Τεστ _Μεταβλητών" #: src/ui/gui/chi-square.ui:298 msgid "Use _specified range" msgstr "Χρήση _Δοσμένου εύρους" #: src/ui/gui/chi-square.ui:323 msgid "_Lower:" msgstr "_Κατώτερο:" #: src/ui/gui/chi-square.ui:337 msgid "_Upper:" msgstr "_Ανώτερο:" #: src/ui/gui/chi-square.ui:381 msgid "Expected Range:" msgstr "Αναμενόμενο Εύρος:" #: src/ui/gui/descriptives.ui:131 src/ui/gui/factor.ui:797 #: src/ui/gui/recode.ui:638 msgid "_Variables:" msgstr "_Μεταβλητές:" #: src/ui/gui/descriptives.ui:176 msgid "S_tatistics:" msgstr "Σ_Τατιστικά:" #: src/ui/gui/descriptives.ui:230 msgid "_Exclude entire case if any selected variable is missing" msgstr "_Αποκλεισμός υποθέσεων με ελλειπούσες τιμές" #: src/ui/gui/descriptives.ui:247 msgid "_Include user-missing data in analysis" msgstr "Με Ελλειπούσες Τιμές-Χρήστη" #: src/ui/gui/descriptives.ui:264 msgid "Save _Z-scores of selected variables as new variables" msgstr "Αποθήκευση _Z-Τιμές σαν νέες μεταβλητές" #: src/ui/gui/descriptives.ui:286 msgid "Options:" msgstr "Επιλογές:" #: src/ui/gui/examine.ui:25 msgid "Explore" msgstr "Διερεύνηση" #: src/ui/gui/examine.ui:69 msgid "_Label Cases by:" msgstr "_Ετικέτα Υποθέσεων κατά:" #: src/ui/gui/examine.ui:116 msgid "_Factor List:" msgstr "_Λίστα Παραγόντων:" #: src/ui/gui/examine.ui:163 src/ui/gui/means.ui:126 msgid "_Dependent List:" msgstr "Λίστα _Εξαρτημένων:" #: src/ui/gui/examine.ui:331 msgid "Explore: Options" msgstr "Διερεύνηση: Επιλογές" #: src/ui/gui/examine.ui:355 src/ui/gui/t-test.ui:81 msgid "Exclude cases _listwise" msgstr "Αποκλεισμός Υποθέσεων ανά _Υπόθεση" #: src/ui/gui/examine.ui:373 msgid "Exclude cases _pairwise" msgstr "Αποκλεισμός Υποθέσεων ανά _Ανάλυση" #: src/ui/gui/examine.ui:392 msgid "_Report values" msgstr "_Αναφορά Τιμών" #: src/ui/gui/examine.ui:449 msgid "Explore: Statistics" msgstr "Διερεύνηση: Στατιστικά" #: src/ui/gui/examine.ui:468 src/ui/gui/oneway.ui:576 msgid "_Descriptives" msgstr "_Περιγραφικά" #: src/ui/gui/examine.ui:485 msgid "_Extremes" msgstr "_Ακραίες Τιμές" #: src/ui/gui/examine.ui:502 msgid "_Percentiles" msgstr "_Εκατοστημόρια" #: src/ui/gui/goto-case.ui:31 msgid "Goto Case" msgstr "Προς Υπόθεση" #: src/ui/gui/goto-case.ui:52 msgid "Goto Case Number:" msgstr "Προς Αριθμό Υπόθεσης:" #: src/ui/gui/factor.ui:39 msgid "Factor Analysis: Rotation" msgstr "Παραγοντική Ανάλυση: Περιστροφή" #: src/ui/gui/factor.ui:70 msgid "_None" msgstr "_Καμμία" #: src/ui/gui/factor.ui:87 msgid "_Varimax" msgstr "Ανω_Διακύ (varimax)" #: src/ui/gui/factor.ui:104 msgid "_Quartimax" msgstr "Ανω_Τετράς Qmax" #: src/ui/gui/factor.ui:123 msgid "_Equimax" msgstr "Ανω_Μετρία (Emax)" #: src/ui/gui/factor.ui:146 msgid "Method" msgstr "Μέθοδος" #: src/ui/gui/factor.ui:159 msgid "_Display rotated solution" msgstr "Εμφάνιση Περιστρεφόμενων _Λύσεων" #: src/ui/gui/factor.ui:181 src/ui/gui/factor.ui:582 msgid "Ma_ximum iterations for convergence:" msgstr "Μέγιστες Διαδοχές για _Σύγκλιση:" #: src/ui/gui/factor.ui:241 src/ui/gui/factor.ui:255 msgid "Principal Components Analysis" msgstr "Ανάλυση Κύριων Συνιστωσών" #: src/ui/gui/factor.ui:246 src/ui/gui/factor.ui:258 msgid "Principal Axis Factoring" msgstr "Κύριων Αξόνων Παραγοντοποίηση" #: src/ui/gui/factor.ui:264 msgid "Factor Analysis: Extraction" msgstr "Παραγοντική Ανάλυση: Εξαγωγή" #: src/ui/gui/factor.ui:290 msgid "_Method: " msgstr "Μέ_Θοδος: " #: src/ui/gui/factor.ui:345 msgid "Co_rrelation matrix" msgstr "_Πίνακας Συσχέτισης" #: src/ui/gui/factor.ui:361 msgid "Co_variance matrix" msgstr "Πίνακας _Συνδιακύμανσης" #: src/ui/gui/factor.ui:382 msgid "Analyze" msgstr "Ανάλυση" #: src/ui/gui/factor.ui:407 msgid "_Unrotated factor solution" msgstr "_Μη Περιστρεφόμενη Λύση Παραγόντων" #: src/ui/gui/factor.ui:423 msgid "_Scree plot" msgstr "Διάγραμμα _Iδιοτιμών" #: src/ui/gui/factor.ui:443 src/ui/gui/histogram.ui:146 src/ui/gui/roc.ui:329 msgid "Display" msgstr "Εμφάνιση" #: src/ui/gui/factor.ui:526 msgid "_Number of factors:" msgstr "_Αριθμός Παραγόντων:" #: src/ui/gui/factor.ui:563 msgid "Extract" msgstr "Εξαγωγή" #: src/ui/gui/factor.ui:640 msgid "Factor Analysis" msgstr "Παραγοντική Ανάλυση" #: src/ui/gui/factor.ui:672 src/ui/gui/data-editor.ui:266 msgid "_Descriptives..." msgstr "Περι_Γραφικά..." #: src/ui/gui/factor.ui:685 msgid "_Extraction..." msgstr "_Αποθήκευση..." #: src/ui/gui/factor.ui:699 msgid "_Rotations..." msgstr "Π_Εριστροφές..." #: src/ui/gui/find.ui:25 msgid "Find Case" msgstr "Αναζήτηση Υπόθεσης" #: src/ui/gui/find.ui:117 msgid "Variable:" msgstr "Μεταβλητή:" #: src/ui/gui/find.ui:157 src/ui/gui/val-labs-dialog.ui:113 msgid "Value:" msgstr "Τιμή:" #: src/ui/gui/find.ui:180 msgid "Search value labels" msgstr "Αναζήτηση Ταμπέλες Τιμών" #: src/ui/gui/find.ui:210 msgid "Regular expression Match" msgstr "Ταίρι Κανονικής Έκφρασης" #: src/ui/gui/find.ui:227 msgid "Search substrings" msgstr "Αναζήτηση Υποσυμβολοσειρές" #: src/ui/gui/find.ui:244 msgid "Wrap around" msgstr "Αναδίπλωση" #: src/ui/gui/find.ui:260 msgid "Search backward" msgstr "Oπισθόδρομη Αναζήτηση" #: src/ui/gui/frequencies.ui:32 msgid "Frequencies: Frequency Tables" msgstr "Συχνότητες: Πίνακες Συχνοτήτων" #: src/ui/gui/frequencies.ui:67 msgid "_Always" msgstr "Πά_Ντα" #: src/ui/gui/frequencies.ui:85 msgid "_Never" msgstr "Π_Οτέ" #: src/ui/gui/frequencies.ui:107 msgid "If no _more than " msgstr "Αν όχι _Περισσότερο από " #: src/ui/gui/frequencies.ui:129 src/ui/gui/frequencies.ui:454 msgid "100" msgstr "100" #: src/ui/gui/frequencies.ui:145 msgid "values" msgstr "τιμές" #: src/ui/gui/frequencies.ui:167 msgid "Display frequency tables" msgstr "Εμφάνιση πινάκων Συχνότητας" #: src/ui/gui/frequencies.ui:194 msgid "A_scending value" msgstr "Αύ_Ξουσα τιμή" #: src/ui/gui/frequencies.ui:212 msgid "D_escending value" msgstr "Φ_Θίνουσα τιμή" #: src/ui/gui/frequencies.ui:230 msgid "Ascending _frequency" msgstr "_Αύξουσα Συχνότητα" #: src/ui/gui/frequencies.ui:248 msgid "Descending f_requency" msgstr "_Φθίνουσα Συχνότητα" #: src/ui/gui/frequencies.ui:271 msgid "Order by" msgstr "Ταξινόμηση κατά" #: src/ui/gui/frequencies.ui:324 msgid "Frequencies: Charts" msgstr "Συχνότητες: Πίτες" #: src/ui/gui/frequencies.ui:356 msgid "Scale:" msgstr "Κλίμακα:" #: src/ui/gui/frequencies.ui:366 msgid "_Frequencies" msgstr "_Συχνότητες" #: src/ui/gui/frequencies.ui:383 msgid "_Percentages" msgstr "_Ποσοστά" #: src/ui/gui/frequencies.ui:407 msgid "Exclude values _below " msgstr "Αποκλεισμός _Τιμών κάτω από " #: src/ui/gui/frequencies.ui:422 msgid "Exclude values _above " msgstr "Αποκλεισμός _Τιμών πάνω από " #: src/ui/gui/frequencies.ui:441 src/ui/gui/reliability.ui:227 msgid "0" msgstr "0" #: src/ui/gui/frequencies.ui:469 msgid "Chart Formatting" msgstr "Μορφοποίηση ΡαΒδογραµµάτων" #: src/ui/gui/frequencies.ui:494 msgid "Draw _histograms" msgstr "_Ιστόγραμμα" #: src/ui/gui/frequencies.ui:510 msgid "Superimpose _normal curve" msgstr "_Καμπύλη Κανονικότητας" #: src/ui/gui/frequencies.ui:530 msgid "Histograms" msgstr "Ιστογράμματα" #: src/ui/gui/frequencies.ui:555 msgid "Draw _bar charts" msgstr "Ρα_Βδογράµµατα" #: src/ui/gui/frequencies.ui:575 msgid "Bar Charts" msgstr "Ραβδογράµµατα" #: src/ui/gui/frequencies.ui:600 msgid "Draw _pie charts" msgstr "_Πίτες" #: src/ui/gui/frequencies.ui:616 msgid "Include slices for _missing values" msgstr "Πίτες με Ελλειπούσες _Τιμές" #: src/ui/gui/frequencies.ui:636 msgid "Pie Charts" msgstr "Πίτες" #: src/ui/gui/frequencies.ui:725 src/ui/gui/rank.ui:489 msgid "_Variable(s):" msgstr "_Μεταβλητή(ες):" #: src/ui/gui/frequencies.ui:769 msgid "_Statistics:" msgstr "_Στατιστικά:" #: src/ui/gui/frequencies.ui:783 msgid "Include _missing values" msgstr "Συμπερίληψη Ελλειπούσων _Τιμών" #: src/ui/gui/frequencies.ui:806 msgid "Ch_arts..." msgstr "_Γραφήματα..." #: src/ui/gui/frequencies.ui:821 msgid "Frequency _Tables..." msgstr "Πίνακες _Συχνοτήτων..." #: src/ui/gui/histogram.ui:24 msgid "Histogram" msgstr "Ιστόγραμμα" #: src/ui/gui/histogram.ui:126 msgid "_Display normal curve" msgstr "_Εμφάνισε Καμπύλη Κανονικότητας" #: src/ui/gui/indep-samples.ui:25 src/ui/gui/k-independent.ui:35 msgid "Define Groups" msgstr "Ορισμός Ομάδων" #: src/ui/gui/indep-samples.ui:75 msgid "Group_2 value:" msgstr "Τιμή για _Ομάδα 2:" #: src/ui/gui/indep-samples.ui:89 msgid "Group_1 value:" msgstr "Τιμή για _Ομάδα 1:" #: src/ui/gui/indep-samples.ui:190 msgid "_Use specified values:" msgstr "_Χρήση των ορισμένων τιμών:" #: src/ui/gui/indep-samples.ui:259 msgid "Independent-Samples T Test" msgstr "Ανεξάρτητα-Δείγματτα T Τεστ" #: src/ui/gui/indep-samples.ui:319 msgid "_Define Groups..." msgstr "Ο_Ρισμός Ομάδων..." #: src/ui/gui/indep-samples.ui:401 src/ui/gui/t-test.ui:211 msgid "_Test Variable(s):" msgstr "_Μεταβλητή(ες) Εξέτασης:" #: src/ui/gui/indep-samples.ui:454 src/ui/gui/k-independent.ui:165 msgid "_Grouping Variable:" msgstr "Ο_Μαδοποίηση Μεταβλητής:" #: src/ui/gui/k-independent.ui:63 msgid "_Upper limit:" msgstr "_Ανώτερο Όριο:" #: src/ui/gui/k-independent.ui:77 msgid "_Lower limit:" msgstr "_Κατώτερο Όριο:" #: src/ui/gui/k-independent.ui:136 msgid "Tests for Several Independent Samples" msgstr "Τεστ Πολλαπλών Ανεξάρτητων Δειγμάτων" #: src/ui/gui/k-independent.ui:208 src/ui/gui/ks-one-sample.ui:131 msgid "Test _Variable List:" msgstr "_Λίστα μεταβλητών εξέτασης:" #: src/ui/gui/k-independent.ui:320 msgid "_Define Groups" msgstr "_Ορισμός Ομάδων" #: src/ui/gui/k-independent.ui:365 msgid "_Kruskal-Wallis H" msgstr "_Kruskal-Wallis H" #: src/ui/gui/k-independent.ui:382 src/ui/gui/runs.ui:140 msgid "_Median" msgstr "_Διάμεσος" #: src/ui/gui/k-means.ui:24 msgid "K-Means Cluster Analysis" msgstr "K-Μέσοι Ανάλυση Συστάδων" #: src/ui/gui/k-means.ui:122 msgid "N_umber of Clusters: " msgstr "Αριθμός Συστάδων: " #: src/ui/gui/k-related.ui:24 msgid "Tests for Several Related Samples" msgstr "Τεστ Πολλαπλών Εξαρτημένων Δειγμάτων" #: src/ui/gui/k-related.ui:113 msgid "_Test Variables:" msgstr "_Μεταβλητές εξέτασης:" #: src/ui/gui/k-related.ui:145 msgid "_Friedman" msgstr "_Friedman" #: src/ui/gui/k-related.ui:161 msgid "_Kendall's W" msgstr "_Kendall's W" #: src/ui/gui/k-related.ui:177 msgid "_Cochran's Q" msgstr "_Cochran's Q" #: src/ui/gui/ks-one-sample.ui:163 msgid "_Normal" msgstr "_Τυπική" #: src/ui/gui/ks-one-sample.ui:181 msgid "_Poisson" msgstr "_Πουασσόν" #: src/ui/gui/ks-one-sample.ui:198 msgid "_Uniform" msgstr "_Oμοιόμορφη" #: src/ui/gui/ks-one-sample.ui:213 msgid "_Exponential" msgstr "_Εκθετική" #: src/ui/gui/ks-one-sample.ui:232 msgid "Test Distribution" msgstr "Κατανομή Εξέτασης" #: src/ui/gui/logistic.ui:42 msgid "Logistic Regression: Options" msgstr "Λογιστική Παλινδρόμηση: Επιλογές" #: src/ui/gui/logistic.ui:66 msgid "CI for _exp(B): " msgstr "ΔΕ για _Εκθ(B): " #: src/ui/gui/logistic.ui:97 msgid "%" msgstr "%" #: src/ui/gui/logistic.ui:146 msgid "Classification cu_toff: " msgstr "Ταξινόμηση Τιμών Απόρριψης:" #: src/ui/gui/logistic.ui:159 msgid "_Maximum Iterations: " msgstr "_Μέγιστες Διαδοχές: " #: src/ui/gui/logistic.ui:177 msgid "Include _constant in model" msgstr "Συμπερίληψη _σταθεράς στο μοντέλο" #: src/ui/gui/logistic.ui:219 msgid "Logistic Regression" msgstr "Λογιστική Παλινδρόμηση" #: src/ui/gui/logistic.ui:364 src/ui/gui/regression.ui:185 msgid "_Dependent" msgstr "_Εξαρτημένη" #: src/ui/gui/logistic.ui:412 src/ui/gui/regression.ui:232 msgid "_Independent" msgstr "_Ανεξάρτητη" #: src/ui/gui/means.ui:25 msgid "Means" msgstr "Μέσοι" #: src/ui/gui/means.ui:179 msgid "_Independent List:" msgstr "_Λίστα Ανεξάρτητων:" #: src/ui/gui/missing-val-dialog.ui:48 msgid "_No missing values" msgstr "_Μη ελλειπούσες τιμές" #: src/ui/gui/missing-val-dialog.ui:136 msgid "_Discrete missing values" msgstr "Διακριτές _Ελλειπούσες τιμές" #: src/ui/gui/missing-val-dialog.ui:172 msgid "_Low:" msgstr "_Χαμηλό:" #: src/ui/gui/missing-val-dialog.ui:197 msgid "_High:" msgstr "_Υψηλό:" #: src/ui/gui/missing-val-dialog.ui:221 msgid "Di_screte value:" msgstr "_Διακριτή τιμή:" #: src/ui/gui/missing-val-dialog.ui:245 msgid "_Range plus one optional discrete missing value" msgstr "_Εύρος συν μία προαιρετική διακριτή ελελιπούσα τιμή" #: src/ui/gui/oneway.ui:25 msgid "One-Way ANOVA: Contrasts" msgstr "Μονόδρομη ANOVA: Συγκρίσεις" #: src/ui/gui/oneway.ui:107 msgid "_Coefficients:" msgstr "_Συντελεστές:" #: src/ui/gui/oneway.ui:161 msgid "Coefficient Total: " msgstr "Συντελεστής Σύνολο: " #: src/ui/gui/oneway.ui:198 msgid "Contrast 1 of 1" msgstr "Σύγκριση 1 από 1" #: src/ui/gui/oneway.ui:234 msgid "One-Way ANOVA: Post-Hoc" msgstr "Μονόδρομη ANOVA: Συγκρίσεις" #: src/ui/gui/oneway.ui:270 msgid "Games Howell" msgstr "Games-Howell" #: src/ui/gui/oneway.ui:287 msgid "Fisher's LSD" msgstr "Fisher's LSD" #: src/ui/gui/oneway.ui:379 msgid "One-Way ANOVA" msgstr "1 Κατ/σης ANOVA" #: src/ui/gui/oneway.ui:408 msgid "_Factor:" msgstr "_Παράγοντας:" #: src/ui/gui/oneway.ui:451 msgid "Dependent _Variable(s):" msgstr "Εξαρτημένη(ες) _Μεταβλητέ(ές):" #: src/ui/gui/oneway.ui:593 msgid "_Homogeneity" msgstr "_Ομοιογένεια" #: src/ui/gui/oneway.ui:637 msgid "Post-Hoc..." msgstr "Post-Hoc..." #: src/ui/gui/oneway.ui:652 msgid "_Contrasts..." msgstr "_Συγκρίσεις..." #: src/ui/gui/options.ui:25 msgid "Options Case" msgstr "Επιλογές Υποθέσεων" #: src/ui/gui/options.ui:55 msgid "Display _Labels" msgstr "Τιμές _Ετικετών" #: src/ui/gui/options.ui:71 msgid "Display _Names" msgstr "Εμφάνιση _Ονομάτων" #: src/ui/gui/options.ui:99 msgid "Sort by L_abel" msgstr "Ταξινόμηση κατά Ε_Τικέτα" #: src/ui/gui/options.ui:115 msgid "Sort by Na_me" msgstr "Ταξινόμηση κατά ό_Νομα" #: src/ui/gui/options.ui:131 msgid "Do not S_ort" msgstr "Μη Τα_Ξινόμηση" #: src/ui/gui/options.ui:159 msgid "Variable Lists" msgstr "Λίστα Μεταβλητών" #: src/ui/gui/options.ui:184 msgid "Ma_ximize" msgstr "Μεγιστο_Ποίηση" #: src/ui/gui/options.ui:199 msgid "_Raise" msgstr "_Αύξηση" #: src/ui/gui/options.ui:214 msgid "Aler_t" msgstr "Συναγε_Ρμός" #: src/ui/gui/options.ui:233 msgid "Output Window Action" msgstr "Συμβάντα του Παραθύρου Εξαγωγείς" #: src/ui/gui/paired-samples.ui:147 msgid "_Test Pair(s):" msgstr "_Ζευγάρι(α) Εξέτασης:" #: src/ui/gui/rank.ui:30 msgid "Rank Cases: Types" msgstr "Κατάταξη Υποθέσεων: Τύποι" #: src/ui/gui/rank.ui:57 msgid "Sum of case _weights" msgstr "Άθροισμα Σταθμίσεων _Υπόθεσης" #: src/ui/gui/rank.ui:74 msgid "Fractional rank as _%" msgstr "Κλασματική κατάταξη ως _%" #: src/ui/gui/rank.ui:92 msgid "_Fractional rank" msgstr "Κ_Λασματική κατάταξη" #: src/ui/gui/rank.ui:109 msgid "_Savage score" msgstr "_Savage τιμή" #: src/ui/gui/rank.ui:125 msgid "_Rank" msgstr "_Κατάταξη" #: src/ui/gui/rank.ui:147 msgid "N_tiles" msgstr "_Μόρια" #: src/ui/gui/rank.ui:195 msgid "_Proportion Estimates" msgstr "_Αναλογία Εκτιμήσεων" #: src/ui/gui/rank.ui:213 msgid "_Normal Scores" msgstr "_Τυπικές Τιμές" #: src/ui/gui/rank.ui:251 msgid "_Blom" msgstr "_Blom" #: src/ui/gui/rank.ui:269 msgid "Tuke_y" msgstr "Tuke_y" #: src/ui/gui/rank.ui:287 msgid "Ran_kit" msgstr "Ran_kit" #: src/ui/gui/rank.ui:305 msgid "_Van der Waerden" msgstr "_Van der Waerden" #: src/ui/gui/rank.ui:328 msgid "Proportion Estimation Formula" msgstr "Αναλογία Εκτίμησης Τύπου" #: src/ui/gui/rank.ui:369 msgid "Rank Cases" msgstr "Κατάταξη Υποθέσεων" #: src/ui/gui/rank.ui:434 msgid "_By:" msgstr "_Κατά:" #: src/ui/gui/rank.ui:595 msgid "_Smallest Value" msgstr "_Μικρότερη Τιμή" #: src/ui/gui/rank.ui:613 msgid "_Largest Value" msgstr "_Υψηλότερη Τιμή" #: src/ui/gui/rank.ui:637 msgid "Assign rank 1 to:" msgstr "Ανάθεση Κατάταξης 1 σε:" #: src/ui/gui/rank.ui:656 msgid "_Display summary tables" msgstr "_Εμφάνιση Συνοπτικών Πινάκων" #: src/ui/gui/rank.ui:679 msgid "Rank T_ypes" msgstr "Τύποι Κατάτα_Ξης" #: src/ui/gui/rank.ui:694 msgid "_Ties..." msgstr "_Δεσμοί..." #: src/ui/gui/rank.ui:756 msgid "Rank Cases: Ties" msgstr "Κατάταξη Υποθέσεων: Δεσμοί" #: src/ui/gui/rank.ui:788 msgid "_Mean" msgstr "_Μέσος" #: src/ui/gui/rank.ui:806 msgid "_Low" msgstr "Χαμηλό" #: src/ui/gui/rank.ui:825 msgid "_High" msgstr "_Υψηλό" #: src/ui/gui/rank.ui:851 msgid "_Sequential ranks to unique values" msgstr "Εν σειρά _Κατατάξεις προς μοναδικές τιμές" #: src/ui/gui/rank.ui:875 msgid "Rank Assigned to Ties" msgstr "Κατάταξη για Δεσμούς" #: src/ui/gui/runs.ui:155 msgid "M_ean" msgstr "_Μέσος" #: src/ui/gui/runs.ui:171 msgid "Mo_de" msgstr "_Επικρατούσα" #: src/ui/gui/runs.ui:191 msgid "_Custom:" msgstr "_Επιλογή χρήστη:" #: src/ui/gui/runs.ui:230 msgid "Cut Point" msgstr "Τιμή Απόρριψης" #: src/ui/gui/sort.ui:25 msgid "Sort Cases" msgstr "Ταξινόμηση Υποθέσεων" #: src/ui/gui/sort.ui:101 msgid "Sort by:" msgstr "Ταξινόμηση κατά:" #: src/ui/gui/sort.ui:174 msgid "Descending" msgstr "Φθίνουσα" #: src/ui/gui/sort.ui:196 msgid "Sort Order" msgstr "Είδος Ταξινόμησης" #: src/ui/gui/split-file.ui:25 msgid "Split File" msgstr "Διαχωρισμός Αρχείου" #: src/ui/gui/split-file.ui:103 msgid "Anal_yze all cases. Do not create groups." msgstr "Ανάλυση όλων των _Υποθέσεων. Μη δημιουργία ομάδων." #: src/ui/gui/split-file.ui:121 msgid "Compare _groups." msgstr "_Σύγκριση _Ομάδων." #: src/ui/gui/split-file.ui:140 msgid "Organize ou_tput by groups." msgstr "Ο_Ργάνωση της Εξαγωγής ανά ομάδα." #: src/ui/gui/split-file.ui:225 msgid "Groups _based on:" msgstr "_Ομάδες που βασίζονται σε:" #: src/ui/gui/split-file.ui:255 msgid "_Sort the file by grouping variables." msgstr "_Ταξινόμηση αρχείου με την μεταβλητή ομαδοποίησης." #: src/ui/gui/split-file.ui:273 msgid "_File is already sorted." msgstr "Το Αρ_Χείο είναι ήδη ταξινομημένο." #: src/ui/gui/split-file.ui:334 msgid "Current Status : " msgstr "Παρούσα κατάσταση : " #: src/ui/gui/split-file.ui:348 msgid "Analysis by groups is off" msgstr "Ανάλύση ανά ομάδες είναι κλειστή" #: src/ui/gui/recode.ui:135 msgid "System _Missing" msgstr "_Ελλειπούσες Συστύματος" #: src/ui/gui/recode.ui:150 msgid "Co_py old values" msgstr "Αντι_Γραφή Προηγούμενων τιμών" #: src/ui/gui/recode.ui:172 msgid "Va_lue: " msgstr "Τι_Μή: " #: src/ui/gui/recode.ui:276 msgid "Conver_t numeric strings to numbers (`5' -> 5)" msgstr "Μετατροπή Αριθμητικών συμβολοσειρών σε _Αριθμούς (`5' -> 5)" #: src/ui/gui/recode.ui:297 msgid "Output variables are _strings" msgstr "Οι μεταβλητές ε_Ξαγωγής είναι συμβολοσειρές" #: src/ui/gui/recode.ui:318 msgid "Width: " msgstr "Εύρος: " #: src/ui/gui/recode.ui:499 msgid "_Name:" msgstr "_Όνομα:" #: src/ui/gui/recode.ui:527 msgid "La_bel:" msgstr "_Ετικέτα:" #: src/ui/gui/recode.ui:556 msgid "Chan_ge" msgstr "_Αλλαγή" #: src/ui/gui/recode.ui:584 msgid "Output Variable" msgstr "Μεταβλητή Εξαγωγής" #: src/ui/gui/recode.ui:658 msgid "Old and New Va_lues..." msgstr "Παλιές κ _Νέες τιμές..." #: src/ui/gui/regression.ui:51 msgid "S_tatistics..." msgstr "Σ_Τατιστικά..." #: src/ui/gui/regression.ui:272 msgid "Regression: Save" msgstr "Παλινδρόμηση: Αποθήκευση" #: src/ui/gui/regression.ui:290 src/ui/gui/univariate.ui:42 msgid "_Predicted values" msgstr "_Τιμές Πρόβλεψης" #: src/ui/gui/regression.ui:307 src/ui/gui/univariate.ui:59 msgid "_Residuals" msgstr "Σ_Φάλματα" #: src/ui/gui/regression.ui:351 msgid "Regression: Statistics" msgstr "Παλινδρόμηση: Στατιστικά" #: src/ui/gui/regression.ui:393 src/ui/gui/univariate.ui:143 msgid "S_tatistics" msgstr "_Στατιστικά" #: src/ui/gui/reliability.ui:34 msgid "Alpha" msgstr "Alpha" #: src/ui/gui/reliability.ui:43 msgid "Reliability Analysis" msgstr "Ανάλυση Α_Ξιοπιστίας" #: src/ui/gui/reliability.ui:144 msgid "_Items:" msgstr "_Ερωτοστοιχεία:" #: src/ui/gui/reliability.ui:166 msgid "_Model: " msgstr "_Μοντέλο: " #: src/ui/gui/reliability.ui:212 msgid "_Variables in first split:" msgstr "Μεταβλητές στο 1ο _Διαχωρισμό:" #: src/ui/gui/reliability.ui:259 msgid "Show _descriptives for scale if item is deleted" msgstr "_Περιγραφικά κλίμακας όταν διαγράφεται ένα ερωτοστοιχείο" #: src/ui/gui/roc.ui:145 msgid "_Test Variable:" msgstr "Μεταβλητή _Εξέτασης:" #: src/ui/gui/roc.ui:175 msgid "_State Variable:" msgstr "Μεταβλητή _Ορισμού:" #: src/ui/gui/roc.ui:202 msgid "_Value of state variable:" msgstr "_Τιμή της Μεταβλητής-Ορισμού:" #: src/ui/gui/roc.ui:249 msgid "ROC C_urve" msgstr "ROC _Καμπύλη" #: src/ui/gui/roc.ui:269 msgid "_With diagonal reference line" msgstr "_Με γραμμή αναφοράς τη Διαγώνιο" #: src/ui/gui/roc.ui:293 msgid "Standard _Error and Confidence Interval" msgstr "Τυπικό _Λάθος κ Διάστημα Εμπιστοσύνης" #: src/ui/gui/roc.ui:309 msgid "_Coordinate points of the ROC Curve" msgstr "_Συντεταγμένες σημείων στην καμπύλη ROC" #: src/ui/gui/scatterplot.ui:25 msgid "Scatterplot" msgstr "Διάγραμμα Διασποράς" #: src/ui/gui/scatterplot.ui:56 msgid "_X Axis:" msgstr "_X άξονας:" #: src/ui/gui/scatterplot.ui:100 msgid "_Y Axis:" msgstr "_Y άξονας:" #: src/ui/gui/select-cases.ui:37 msgid "Select Cases: Range" msgstr "Επιλογή Υποθέσεων: Εύρος" #: src/ui/gui/select-cases.ui:87 msgid "First case" msgstr "Πρώτη υπόθεση" #: src/ui/gui/select-cases.ui:99 msgid "Last case" msgstr "Τελευταία υπόθεση" #: src/ui/gui/select-cases.ui:111 msgid "Observation" msgstr "Παρατήρηση" #: src/ui/gui/select-cases.ui:161 msgid "Select Cases" msgstr "Επιλογή Υποθέσεων" #: src/ui/gui/select-cases.ui:313 msgid "Use filter variable" msgstr "Χρήση της μεταβλητής φίλτρου" #: src/ui/gui/select-cases.ui:380 msgid "Based on time or case range" msgstr "Βασισμένο στο χρόνο ή στο εύρος υποθέσεων" #: src/ui/gui/select-cases.ui:395 msgid "Range..." msgstr "Εύρος..." #: src/ui/gui/select-cases.ui:444 msgid "Random sample of cases" msgstr "Τυχαίο δείγμα υποθέσεων" #: src/ui/gui/select-cases.ui:460 msgid "Sample..." msgstr "Δείγμα..." #: src/ui/gui/select-cases.ui:508 msgid "If condition is satisfied" msgstr "Αν η συνθήκη ικανοποιήθηκε" #: src/ui/gui/select-cases.ui:523 msgid "If..." msgstr "Αν... (IF)" #: src/ui/gui/select-cases.ui:567 msgid "All Cases" msgstr "Όλες οι Υποθέσεις" #: src/ui/gui/select-cases.ui:581 msgid "Select" msgstr "Επιλογή" #: src/ui/gui/select-cases.ui:608 msgid "Filtered" msgstr "Φιλτραριστούν" #: src/ui/gui/select-cases.ui:625 msgid "Deleted" msgstr "Διαγραφούν" #: src/ui/gui/select-cases.ui:647 msgid "Unselected Cases Are" msgstr "Μη Επιλεγμένες Υποθέσεις θα" #: src/ui/gui/select-cases.ui:694 msgid "Select Cases: Random Sample" msgstr "Επιλογή Υποθέσεων: Τυχαίο δείγμα" #: src/ui/gui/select-cases.ui:756 msgid "Sample Size" msgstr "Μέγεθος Δείγματος" #: src/ui/gui/t-test.ui:25 msgid "Options" msgstr "Επιλογές" #: src/ui/gui/t-test.ui:63 msgid "Exclude cases _analysis by analysis" msgstr "Αποκλεισμός υποθέσεων ανά _Ανάλυση" #: src/ui/gui/t-test.ui:148 msgid "One - Sample T Test" msgstr "Μονοδειγματικό T τεστ" #: src/ui/gui/t-test.ui:265 msgid "Test _Value: " msgstr "_Τιμή Τέστ: " #: src/ui/gui/text-data-import.ui:32 msgid "Select the first line of the data file that contains data." msgstr "Επίλεξε τη πρώτη γραμμή στο αρχείο που περιέχει δεδομένα." #: src/ui/gui/text-data-import.ui:54 msgid "Line above selected line contains variable names" msgstr "" "Η γραμμή από πάνω από την επιλεγμένη γραμμή περιέχει ονόματα μεταβλητών" #: src/ui/gui/text-data-import.ui:80 msgid "" "Check the data formats displayed below and fix any that are incorrect. You " "may set other variable properties now or later." msgstr "" "Έλεγξε τη μορφή των απεικονιζόμενων δεδομένων κ διόρθωσε τυχόν λάθη. Μπορείς " "να ορίσεις άλλες ιδιότητες μεταβλητών τώρα ή μετά." #: src/ui/gui/text-data-import.ui:121 msgid "Variables" msgstr "Μεταβλητές" #: src/ui/gui/text-data-import.ui:152 msgid "Data Preview" msgstr "Προεπισκόπιση Δεδομένων" #: src/ui/gui/text-data-import.ui:181 msgid "" "This assistant will guide you through the process of importing data into " "PSPP from a text file with one line per case, in which fields are separated " "by tabs, commas, or other delimiters.\n" "\n" "\tThe selected file contains N lines of text. Only the first M of these " "will be shown for preview purposes in the following screens. You may choose " "below how much of the file should actually be imported." msgstr "" "Ο βοηθός θα σε καθοδηγήσει στη διαδικασία εισαγωγής δεδομένων στο PSPP από " "ένα αρχείο κειμένου, τύπου txt, με μία γραμμή ανά υπόθεση, στο οποίο τα " "πεδία είναι διαχωρισμένα με Εσοχές, Κόμματα, ή άλλου τύπου οροθέτες.\n" "\n" "Το επιλεγμένο αρχείο περιέχει N γραμμές κειμένου. Μόνο οι πρώτες M αυτών θα " "εμφανιστούν στη προεπισκόπηση, στις ακόλουθες οθόνες. Μπορείς να διαλέξεις " "παρακάτω πόσα δεδομένα από το αρχείο θα εισαχθούν τελικά." #: src/ui/gui/text-data-import.ui:252 msgid "All cases" msgstr "Όλες οι υποθέσεις" #: src/ui/gui/text-data-import.ui:272 msgid "Amount to Import" msgstr "Ποσότητα για Εισαγωγή" #: src/ui/gui/text-data-import.ui:325 msgid "C_ustom" msgstr "_Ορισμός" #: src/ui/gui/text-data-import.ui:341 msgid "Slas_h (/)" msgstr "Δε_Ξιοπλαγία (/)" #: src/ui/gui/text-data-import.ui:357 msgid "Semicolo_n (;)" msgstr "_Ερωτηματικό (;)" #: src/ui/gui/text-data-import.ui:373 msgid "P_ipe (|)" msgstr "_Κάθετος (|)" #: src/ui/gui/text-data-import.ui:389 msgid "H_yphen (-)" msgstr "_Παύλα (-)" #: src/ui/gui/text-data-import.ui:405 msgid "Co_mma (,)" msgstr "Κό_Μμα (,)" #: src/ui/gui/text-data-import.ui:421 msgid "_Colon (:)" msgstr "_ΆνωΚάτω Τελεία (:)" #: src/ui/gui/text-data-import.ui:437 msgid "Ban_g (!)" msgstr "_Θαυμαστικό (!)" #: src/ui/gui/text-data-import.ui:453 msgid "Ta_b" msgstr "_Εσοχέας" #: src/ui/gui/text-data-import.ui:469 msgid "_Space" msgstr "_Διάστημα" #: src/ui/gui/text-data-import.ui:490 msgid "Separators" msgstr "Διαχωριστές" #: src/ui/gui/text-data-import.ui:541 msgid "Quote separator characters with" msgstr "Χαρακτήρες διαχωρισμού Παράθεσης με" #: src/ui/gui/text-data-import.ui:561 msgid "Quoting" msgstr "Παράθεση" #: src/ui/gui/text-data-import.ui:599 msgid "Fields Preview" msgstr "Προεπισκόπηση Πεδίων" #: src/ui/gui/text-data-import.ui:622 msgid "" "Enter below the sheet number and the cell range which you wish to import." msgstr "" "Εισήγαγε τον αριθμό Φύλλου κ το εύρος κελιών που επιθυμείς να εισαγθούν." #: src/ui/gui/text-data-import.ui:670 msgid "_Cells: " msgstr "_Κελιά: " #: src/ui/gui/text-data-import.ui:684 msgid "_Sheet Index: " msgstr "Ένδειξη Υπ. _Φύλλου: " #: src/ui/gui/text-data-import.ui:695 msgid "Use first row as _variable names" msgstr "Χρήση 1ης γραμμής σαν _Ονόμα μεταβλητών" #: src/ui/gui/text-data-import.ui:717 msgid "Cells to Import" msgstr "Κελιά για Εισαγωγή" #: src/ui/gui/transpose.ui:24 msgid "Transpose" msgstr "_Μετάθεση" #: src/ui/gui/transpose.ui:91 msgid "Name Variable:" msgstr "Όνομα Μεταβλητής:" #: src/ui/gui/transpose.ui:127 msgid "Variable(s):" msgstr "Μεταβλητή(ες):" #: src/ui/gui/univariate.ui:25 msgid "Univariate: Save" msgstr "Μονοπαραγοντική: Αποθήκευση" #: src/ui/gui/univariate.ui:103 msgid "Univariate: Statistics" msgstr "Μονοπαραγοντική: Στατιστικά" #: src/ui/gui/univariate.ui:178 msgid "Univariate" msgstr "Μονοπαραγοντική" #: src/ui/gui/univariate.ui:281 msgid "_Dependent Variable" msgstr "_Εξαρτημένη Μεταβλητή" #: src/ui/gui/univariate.ui:329 msgid "_Fixed Factors" msgstr "_Καθορισμένοι Παράγοντες" #: src/ui/gui/val-labs-dialog.ui:101 msgid "Value Label:" msgstr "Τιμές Ετικέτας:" #: src/ui/gui/data-editor.ui:33 msgid "Information Area" msgstr "Κατάσταση Ενημερώσεων" #: src/ui/gui/data-editor.ui:55 msgid "Case Counter Area" msgstr "Κατάσταση Μετρητών Υποθέσεων" #: src/ui/gui/data-editor.ui:80 msgid "Filter Use Status Area" msgstr "Κατάσταση Φίλτρων" #: src/ui/gui/data-editor.ui:106 msgid "Weight Status Area" msgstr "Κατάσταση Στάθμισης" #: src/ui/gui/data-editor.ui:132 msgid "Split File Status Area" msgstr "Κατάσταση Διαίρεσης Αρχείου" #: src/ui/gui/data-editor.ui:154 msgid "_View" msgstr "Π_Ροβολή" #: src/ui/gui/data-editor.ui:157 msgid "_Status Bar" msgstr "Μπάρα _Κατάστασης" #: src/ui/gui/data-editor.ui:163 msgid "_Font..." msgstr "_Γραμματοσειρά..." #: src/ui/gui/data-editor.ui:167 msgid "_Grid Lines" msgstr "_Πλέγμα Γραμμών" #: src/ui/gui/data-editor.ui:171 msgid "Value _Labels" msgstr "Τιμές _Ταμπέλων" #: src/ui/gui/data-editor.ui:182 msgid "_Variables" msgstr "_Μεταβλητές" #: src/ui/gui/data-editor.ui:192 msgid "_Sort Cases..." msgstr "_Κατάταξη Υποθέσεων..." #: src/ui/gui/data-editor.ui:196 msgid "_Transpose..." msgstr "_Μετάθεση..." #: src/ui/gui/data-editor.ui:200 msgid "_Aggregate..." msgstr "Συνά_Θροιση..." #: src/ui/gui/data-editor.ui:206 msgid "S_plit File..." msgstr "Διαίρεση _Αρχείου..." #: src/ui/gui/data-editor.ui:210 msgid "Select _Cases..." msgstr "Επιλογή _Υποθέσεων..." #: src/ui/gui/data-editor.ui:214 msgid "_Weight Cases..." msgstr "_Στάθμιση Υποθέσεων..." #: src/ui/gui/data-editor.ui:220 msgid "_Transform" msgstr "_Μετατροπές" #: src/ui/gui/data-editor.ui:223 msgid "_Compute..." msgstr "Υ_Πολογισμός..." #: src/ui/gui/data-editor.ui:227 msgid "Cou_nt..." msgstr "_Καταμέτρηση..." #: src/ui/gui/data-editor.ui:231 msgid "Ran_k Cases..." msgstr "Κατάταξη _Υποθέσεων..." #: src/ui/gui/data-editor.ui:235 msgid "Auto_matic Recode..." msgstr "_Αυτόματη Κωδικοποίηση..." #: src/ui/gui/data-editor.ui:241 msgid "Recode into _Same Variables..." msgstr "Κωδικοποίηση στις _Ίδιες Μεταβλητές..." #: src/ui/gui/data-editor.ui:245 msgid "Recode into _Different Variables..." msgstr "Κωδικοποίηση σε _Διαφορετικές Μεταβλητές..." #: src/ui/gui/data-editor.ui:251 msgid "_Run Pending Transforms" msgstr "_Εκτέλεση Εκκρεμών Μετατροπών" #: src/ui/gui/data-editor.ui:257 msgid "_Analyze" msgstr "_Ανάλυση" #: src/ui/gui/data-editor.ui:260 msgid "_Descriptive Statistics" msgstr "Περιγραφικά Στατιστικά" #: src/ui/gui/data-editor.ui:262 msgid "_Frequencies..." msgstr "_Συχνότητες..." #: src/ui/gui/data-editor.ui:270 msgid "_Explore..." msgstr "_Διερεύνηση..." #: src/ui/gui/data-editor.ui:274 msgid "_Crosstabs..." msgstr "_Πίνακας Διασταύρωσης..." #: src/ui/gui/data-editor.ui:279 msgid "Compare _Means" msgstr "Σύγκριση _Μέσων" #: src/ui/gui/data-editor.ui:281 msgid "_Means..." msgstr "Μέ_σοι..." #: src/ui/gui/data-editor.ui:285 msgid "_One Sample T Test..." msgstr "Μονοδειγματικό _Τ Τεστ..." #: src/ui/gui/data-editor.ui:289 msgid "_Independent Samples T Test..." msgstr "_Ανεξάρτητων Δειγμάτων Τ Τεστ..." #: src/ui/gui/data-editor.ui:293 msgid "_Paired Samples T Test..." msgstr "_Εξαρτημένων Δειγμάτων Τ Τεστ..." #: src/ui/gui/data-editor.ui:297 msgid "One Way _ANOVA..." msgstr "Μονόδρομη ANOVA..." #: src/ui/gui/data-editor.ui:302 msgid "_Univariate Analysis..." msgstr "_Μονοπαραγοντική Ανάλυση..." #: src/ui/gui/data-editor.ui:306 msgid "Bivariate _Correlation..." msgstr "_∆ιµεταβλητή Συσχέτιση..." #: src/ui/gui/data-editor.ui:310 msgid "_K-Means Cluster..." msgstr "_K-Μέσοι _Συστάδων..." #: src/ui/gui/data-editor.ui:314 msgid "_Factor Analysis..." msgstr "Παραγοντική _Ανάλυση..." #: src/ui/gui/data-editor.ui:318 msgid "Re_liability..." msgstr "Α_Ξιοπιστία..." #: src/ui/gui/data-editor.ui:322 msgid "_Regression" msgstr "_Παλινδρόμηση" #: src/ui/gui/data-editor.ui:325 msgid "_Linear..." msgstr "_Γραμμική..." #: src/ui/gui/data-editor.ui:329 msgid "_Binary Logistic..." msgstr "Δυαδική _Λογιστική..." #: src/ui/gui/data-editor.ui:335 msgid "_Non-Parametric Statistics" msgstr "_Μη-Παραμετρικά" #: src/ui/gui/data-editor.ui:338 msgid "_Chi Square..." msgstr "_Χ-τετράγωνο..." #: src/ui/gui/data-editor.ui:342 msgid "_Binomial..." msgstr "Δ_Ιωνυμική..." #: src/ui/gui/data-editor.ui:346 msgid "_Runs..." msgstr "_Ροών..." #: src/ui/gui/data-editor.ui:350 msgid "_1 Sample K-S..." msgstr "_Μονοδειγματικό K-S..." #: src/ui/gui/data-editor.ui:354 msgid "_2 Related Samples..." msgstr "2 Ε_Ξαρτημένα Δείγματα..." #: src/ui/gui/data-editor.ui:358 msgid "_K Related Samples..." msgstr "K Εξαρτημένα _Δείγματα..." #: src/ui/gui/data-editor.ui:362 msgid "K _Independent Samples..." msgstr "Κ Αν_Εξάρτητων Δειγμάτων..." #: src/ui/gui/data-editor.ui:368 msgid "ROC Cur_ve..." msgstr "ROC _Καμπύλη..." #: src/ui/gui/data-editor.ui:374 msgid "_Graphs" msgstr "_Γραφήματα" #: src/ui/gui/data-editor.ui:377 msgid "_Scatterplot" msgstr "_Διάγραμμα Διασποράς" #: src/ui/gui/data-editor.ui:381 msgid "_Histogram" msgstr "_Ιστόγραμμα" #: src/ui/gui/data-editor.ui:385 msgid "_Barchart" msgstr "_Ραβδόγραμμα" #: src/ui/gui/data-editor.ui:391 msgid "_Utilities" msgstr "_Βοηθήματα" #: src/ui/gui/data-editor.ui:394 msgid "_Variables..." msgstr "_Μεταβλητές..." #: src/ui/gui/data-editor.ui:398 msgid "Data File _Comments..." msgstr "_Σχόλια Αρχείου Δεδομένων..." #: src/ui/gui/output-window.ui:71 msgid "_Print..." msgstr "Ε_Κτύπωση..." #: src/ui/gui/output-window.ui:76 msgid "_Export..." msgstr "Ε_Ξαγωγή..." #: src/ui/gui/output-window.ui:92 msgid "Select _All" msgstr "Επιλογή Ό_Λων" #: src/ui/gui/syntax-editor.ui:27 msgid "Syntax" msgstr "_Σύνταξη" #: src/ui/gui/syntax-editor.ui:31 msgid "Data" msgstr "Δεδομένα" #: src/ui/gui/syntax-editor.ui:41 msgid "_Save" msgstr "Α_Ποθήκευση" #: src/ui/gui/syntax-editor.ui:46 msgid "Save _As" msgstr "Αποθήκευση _Ως" #: src/ui/gui/syntax-editor.ui:53 msgid "_Print" msgstr "Ε_Κτύπωση" #: src/ui/gui/syntax-editor.ui:84 msgid "_Delete" msgstr "_Διαγραφή" #: src/ui/gui/syntax-editor.ui:90 msgid "_Undo" msgstr "Α_Ναίρεση" #: src/ui/gui/syntax-editor.ui:94 msgid "_Redo" msgstr "Ε_Παναφορά" #: src/ui/gui/syntax-editor.ui:100 msgid "_Find" msgstr "Α_Ναζήτηση" #: src/ui/gui/syntax-editor.ui:106 msgid "_Run" msgstr "_Εκτέλεση" #: src/ui/gui/syntax-editor.ui:109 msgid "_All" msgstr "_Όλα" #: src/ui/gui/syntax-editor.ui:113 msgid "_Selection" msgstr "Επιλο_Γή" #: src/ui/gui/syntax-editor.ui:117 msgid "_Current Line" msgstr "Τρέχουσα _Σειρά" #: src/ui/gui/syntax-editor.ui:122 msgid "_To End" msgstr "_Ως το Τέλος" #: src/ui/gui/var-type-dialog.ui:99 msgid "Scientific notation" msgstr "Επιστημονικός συμβολισμός" #: src/ui/gui/var-type-dialog.ui:150 msgid "Custom currency" msgstr "Ορισμός νομίσματος" #: src/ui/gui/var-type-dialog.ui:267 msgid "positive" msgstr "θετικό" #: src/ui/gui/var-type-dialog.ui:279 msgid "negative" msgstr "αρνητικό" #: src/ui/gui/var-type-dialog.ui:293 msgid "Sample" msgstr "Δείγμα" #: src/ui/gui/var-type-dialog.ui:350 msgid "Width:" msgstr "Εύρος:" #: src/ui/gui/var-type-dialog.ui:396 msgid "Decimal Places:" msgstr "Δεκαδικές θέσεις:" #: src/ui/gui/weight.ui:24 msgid "Weight Cases" msgstr "Στάθμιση Υποθέσεων" #: src/ui/gui/weight.ui:100 msgid "Weight cases by" msgstr "Στάθμιση Υποθέσεων κατά" #: src/ui/gui/weight.ui:144 msgid "Frequency Variable" msgstr "Μεταβλητή Συχνοτήτων" #: src/ui/gui/weight.ui:198 msgid "Current Status: " msgstr "Παρούσα Κατάσταση: " #. TRANSLATORS: This is the application name in the desktop file #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:7 #: src/ui/gui/org.fsf.pspp.desktop.in:7 msgid "GNU PSPP" msgstr "GNU PSPP" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:8 #, fuzzy #| msgid "A program for the analysis of sampled data" msgid "GNU PSPP is a program for statistical analysis of sampled data" msgstr "Πρόγραμμα για τη στατιστική ανάλυση δεδομένων" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:10 msgid "" "GNU PSPP is a program for the statistical analysis of sampled data. It is a " "Free replacement for the proprietary program SPSS, and appears very similar " "to it with a few exceptions. The most important of these exceptions are, " "that there are no “time bombs”; your copy of PSPP will not “expire” or " "deliberately stop working in the future. Neither are there any artificial " "limits on the number of cases or variables which you can use. There are no " "additional packages to purchase in order to get “advanced” functions; all " "functionality that PSPP currently supports is in the core package." msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:11 msgid "" "PSPP is a stable and reliable application. It can perform descriptive " "statistics, T-tests, anova, linear and logistic regression, measures of " "association, cluster analysis, reliability and factor analysis, non-" "parametric tests and more. Its backend is designed to perform its analyses " "as fast as possible, regardless of the size of the input data. You can use " "PSPP with its graphical interface or the more traditional syntax commands." msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:12 msgid "A brief list of some of the PSPP's features." msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:14 msgid "Support for over 1 billion cases" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:15 msgid "Support for over 1 billion variables" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:16 msgid "Syntax and data files which are compatible with those of SPSS" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:17 msgid "A choice of terminal or graphical user interface" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:18 msgid "A choice of text, postscript, pdf, opendocument or html output formats" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:19 msgid "" "Inter-operability with: LibreOffice, Apache OpenOffice, Gnumeric and other " "free software" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:20 msgid "Easy data import from spreadsheets, text files and database sources" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:21 msgid "" "The capability to open, analyse and edit two or more datasets concurrently" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:22 msgid "A user interface supporting all common character sets" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:23 msgid "A user interface has been translated to multiple languages" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:24 msgid "Very fast statistical procedures, even on very large data sets" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:25 msgid "No license fees and no expiration period" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:26 msgid "No unethical “end user license agreements”" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:27 msgid "A fully indexed user manual" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:28 msgid "Freedom ensured; It is licensed under the GPLv3 or later" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:29 msgid "" "Portability; Runs on many different computers and many different operating " "systems" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:31 msgid "" "PSPP is particularly aimed at statisticians, social scientists and students " "requiring fast convenient analysis of sampled data." msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:41 #, fuzzy #| msgid "Variable View" msgid "GNU PSPP Variable View" msgstr "Απεικ. Μεταβλητών" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:54 msgid "Free Software Foundation" msgstr "" #: src/ui/gui/org.fsf.pspp.desktop.in:8 msgid "Statistical Software" msgstr "Στατιστικό Πρόγραμμα" #: src/ui/gui/org.fsf.pspp.desktop.in:9 msgid "Analyze statistical data with a free alternative to SPSS" msgstr "" "Ανάλυση στατιστικών δεδομένων με δωρεάν πρόγραμμα, εναλλακτικό του SPSS" #. TRANSLATORS: Do not translate this string. Keep it as is, verbatim. #: src/ui/gui/org.fsf.pspp.desktop.in:12 msgid "pspp" msgstr "pspp" #. TRANSLATORS: You must keep all ";" - also at the end of line. #: src/ui/gui/org.fsf.pspp.desktop.in:17 msgid "statistics;analysis;spss;" msgstr "στατιστικές;ανάλυση;spss;" #~ msgid "Sorry. The help system hasn't yet been implemented." #~ msgstr "Συγνώμη. Το σύστημα βοήθειας δεν είναι διαθέσιμο ακόμη." #~ msgid "Interactive shell not supported on this platform." #~ msgstr "Το διαδραστικό περιβάλλον δεν υποστηρίζεται σε αυτή τη πλατφόρμα." #~ msgid "Error executing command: %s." #~ msgstr "Σφάλμα εκτέλεσης εντολής: %s." #~ msgid "Details" #~ msgstr "Λεπτομέρειες" #~ msgid "Multiple dichotomy set" #~ msgstr "Σετ πολλαπλής διχοτόμησης" #~ msgid "Multiple category set" #~ msgstr "Σετ πολλαπλών κατηγοριών" #~ msgid "Label source" #~ msgstr "Ετικέτα (αρχική)" #~ msgid "First variable label among variables" #~ msgstr "Πρώτη ετικέτα μεταβλητής ανάμεσα σε μεταβλητές" #~ msgid "Provided by user" #~ msgstr "Έχει δοθεί από τον χρήστη" #~ msgid "Category label source" #~ msgstr "Ετικέτα κατηγορίας (αρχική)" #~ msgid "Variable labels" #~ msgstr "Ταμπέλες μεταβλητής" #~ msgid "Value labels of counted value" #~ msgstr "Ταμπέλες τιμών των μετρήσιμων τιμών" #~ msgid "Label:" #~ msgstr "Ετικέτα:" #~ msgid "No label." #~ msgstr "Μη Ετικέτα." #~ msgid "Product:" #~ msgstr "Αποτέλεσμα:" #~ msgid "Variables:" #~ msgstr "Μεταβλητές:" #~ msgid "Cases:" #~ msgstr "Υποθέσεις:" #~ msgid "Type:" #~ msgstr "Τύπος:" #~ msgid "Description" #~ msgstr "Περιγραφή" #~ msgid "The active dataset does not have a file label." #~ msgstr "Η ενεργή βάση δεδομένων δεν έχει ετικέτα αρχείου." #~ msgid "File label: %s" #~ msgstr "Ετικέτα αρχείου: %s" #~ msgid "The active dataset dictionary does not contain any documents." #~ msgstr "Η ενεργή λίστα δεδομένων δεν περιέχει κανένα έγγραφο (docs)." #~ msgid "Documents in the active dataset:" #~ msgstr "Τα έγγραφα στην ενεργή βάση δεδομένων:" #~ msgid "Custom data file attributes." #~ msgstr "Προσαρμοσμένες ιδιότητες αρχείου δεδομένων." #~ msgid "Label: %s\n" #~ msgstr "Ετικέτα: %s\n" #~ msgid "Format: %s\n" #~ msgstr "Μορφότυπος: %s\n" #~ msgid "Print Format: %s\n" #~ msgstr "Μορφοποίηση εκτύπωσης: %s\n" #~ msgid "Write Format: %s\n" #~ msgstr "Μορφοποίηση εγγραφής: %s\n" #~ msgid "Measure: %s\n" #~ msgstr "Μέτρηση: %s\n" #~ msgid "Role: %s\n" #~ msgstr "Ρόλος: %s\n" #~ msgid "Display Alignment: %s\n" #~ msgstr "Ευθυγράμμιση Εμφάνισης: %s\n" #~ msgid "Display Width: %d\n" #~ msgstr "Εύρος Εμφάνισης: %d\n" #~ msgid "Missing Values: " #~ msgstr "Ελλειπούσες Τιμές: " #~ msgid "Unknown TABLECELLS class" #~ msgstr "Άγνωστη TABLECELLS τάξη" #~ msgid "Exact Sig. (%d-tailed)" #~ msgstr "Επακριβής Στ.Σημ. (%d-κατ/νσης)" #~ msgid "Valid N" #~ msgstr "Έγκυρα N" #~ msgid "Missing N" #~ msgstr "Ελλειπούσα N" #~ msgid "Valid cases = %.*g; cases with missing value(s) = %.*g." #~ msgstr "Έγκυρες υποθέσεις = %.*g; υποθέσεις με ελλειπούσες τιμές = %.*g." #~ msgid "%g" #~ msgstr "%g" #~ msgid "%d" #~ msgstr "%d" #~ msgid "%zu" #~ msgstr "%zu" #~ msgid "50 (Median)" #~ msgstr "50 (Διάμεσος)" #~ msgid "(%d)" #~ msgstr "(%d)" #~ msgid "Min" #~ msgstr "Ελαχ." #~ msgid "Max" #~ msgstr "Μεγ." #~ msgid "%g%%" #~ msgstr "%g%%" #~ msgid "25th" #~ msgstr "25ο" #~ msgid "50th (Median)" #~ msgstr "50ο (Διάμεσος)" #~ msgid "75th" #~ msgstr "75ο" #~ msgid "(I) %s" #~ msgstr "(A) %s" #~ msgid "(J) %s" #~ msgstr "(B) %s" #~ msgid "(I - J)" #~ msgstr "(A - B)" #~ msgid "%s into %s(%s of %s using %s BY %s)" #~ msgstr "%s μέσα στο %s(%s του %s χρησιμοποιεί %s BY %s)" #~ msgid "%s into %s(%s of %s BY %s)" #~ msgstr "%s μέσα στο %s(%s του %s BY %s)" #~ msgid "%s into %s(%s of %s using %s)" #~ msgstr "%s μέσα στο %s(%s του %s χρησιμοποιεί %s)" #~ msgid "%s into %s(%s of %s)" #~ msgstr "%s μέσα στο %s(%s του %s)" #~ msgid "Area Under the Curve (%s)" #~ msgstr "Περιοχή κάτω από τη Καμπύλη (%s)" #~ msgid "Coordinates of the Curve (%s)" #~ msgstr "Συντεταγμένες της Καμπύλης (%s)" #~ msgid "Std. Error Mean" #~ msgstr "Τ.Σ. Μέσου" #~ msgid "(active dataset)" #~ msgstr "(ενεργή βάση δεδομένων)" #~ msgid "Writing %zu record to %s." #~ msgid_plural "Writing %zu records to %s." #~ msgstr[0] "Εγγράφει %zu εγγραφή σε %s." #~ msgstr[1] "Εγγράφει %zu εγγραφές σε %s." #~ msgid "Writing %zu record." #~ msgid_plural "Writing %zu records." #~ msgstr[0] "Εγγράφει %zu εγγραφή." #~ msgstr[1] "Εγγράφει %zu εγγραφές." #~ msgid "Unsupported compression type (%d)" #~ msgstr "Μη υποστηριζόμενη τύπος συμπίεσης (%d)" #~ msgid "Failed to seek to end of central directory record: %s" #~ msgstr "Αποτυχία για αναζήτηση στο τέλος της κεντρικής λίστας εγγραφής: %s" #~ msgid "Failed to seek to central directory: %s" #~ msgstr "Αποτυχία για αναζήτηση στην κεντρική λίστα: %s" #~ msgid "Failed to seek to start of member `%s': %s" #~ msgstr "Αποτυχία για αναζήτηση με ξεκίνημα από το μέλος `%s': %s" #~ msgid "ascii: closing output file `%s'" #~ msgstr "ascii: κλείσιμο εξαγώμενου αρχείου `%s'" #~ msgid "%s - Page %d" #~ msgstr "%s - Σελίδα %d" #~ msgid "bad vline: x=%d+%d=%d y=(%d+%d=%d,%d+%d=%d) in table size (%d,%d)\n" #~ msgstr "" #~ "λανθασμένη καθ.γραμμή (vline): x=%d+%d=%d y=(%d+%d=%d,%d+%d=%d) στο " #~ "μέγεθος πίνακα (%d,%d)\n" #~ msgid "bad hline: x=(%d+%d=%d,%d+%d=%d) y=%d+%d=%d in table size (%d,%d)\n" #~ msgstr "" #~ "λανθασμένη οριζ.γραμμή (hline): x=(%d+%d=%d,%d+%d=%d) y=%d+%d=%d στο " #~ "μέγεθος πίνακα (%d,%d)\n" #~ msgid "" #~ "bad box: (%d+%d=%d,%d+%d=%d)-(%d+%d=%d,%d+%d=%d) in table size (%d,%d)\n" #~ msgstr "" #~ "λάθος διαστάσεις: (%d+%d=%d,%d+%d=%d)-(%d+%d=%d,%d+%d=%d) στο μέγεθος " #~ "πίνακα (%d,%d)\n" #~ msgid "can only convert encrypted data file to sav or sys format" #~ msgstr "" #~ "μπορεί να μετατρεψεί μόνο κωδικοποιημένα αρχεία δεδομένων σε sav ή σε sys " #~ "μορφή" #~ msgid "can only convert encrypted syntax file to sps format" #~ msgstr "" #~ "μπορεί να μετατρεψεί μόνο κωδικοποιημένα αρχεία σύνταξης σε sps μορφή" #~ msgid "count" #~ msgstr "μέτρηση" #~ msgid "expected" #~ msgstr "αναμενόμενο" #~ msgid "residual" #~ msgstr "σφάλμα" #~ msgid "std. resid." #~ msgstr "στθμ. σφάλμα" #~ msgid "adj. resid." #~ msgstr "προσαρμ. Σφάλμα" #~ msgid "Chi-square tests." #~ msgstr "Τεστ Χ-Τετραγώνων." #~ msgid "Odds Ratio for %s (%.*s / %.*s)" #~ msgstr "Λόγος αναλογιών για %s (%.*s / %.*s)" #~ msgid "For cohort %s = %.*s" #~ msgstr "Για συνέπεια %s = %.*s" #~ msgid "Support for %s files was not compiled into this installation of PSPP" #~ msgstr "" #~ "υποστήριξη για τα %s αρχεία δεν υπάρχει σε αυτή την εγκατεστημένη έκδοση " #~ "του PSPP" #~ msgid "Multiple response set name `%s' does not begin with `$'." #~ msgstr "Το όνομα του σετ πολλαπλών απαντήσεων `%s' δεν αρχίζει με `$'." #~ msgid "Cannot parse field content `%.*s' as format %s: %s" #~ msgstr "Αδυναμία ανάλυσης περιεχομένου πεδίου `%.*s' σαν μορφότυπο %s: %s" #~ msgid "This input line has too few separators to fill in this field." #~ msgstr "" #~ "Αυτή η εισερχόμενη γραμμή έχει ελάχιστους διαχωριστές, για να γεμίσει " #~ "αυτό το πεδίο." #~ msgid "An error occurred reading the spreadsheet file." #~ msgstr "Σφάλμα κατά την ανάγνωση του αρχείου υπολ. φύλλων." #~ msgid "Enter a number to add a new variable." #~ msgstr "Εισήγαγε έναν αριθμό για μία νέα μεταβλητή." #~ msgid "Enter a number to add a new case." #~ msgstr "Εισήγαγε έναν αριθμό για μία νέα υπόθεση." #~ msgid "Cannot create variable." #~ msgstr "Αδυναμία δημιουργίας μεταβλητής." #~ msgid "\"%s\" is not a valid variable name." #~ msgstr "\"%s\" δεν είναι όνομα έγκυρης μεταβλητής." #~ msgid "This dictionary already contains a variable named \"%s\"." #~ msgstr "Αυτή η λίστα ήδη περιέχει μεταβλητή με το όνομα \"%s\"." #~ msgid "Cannot rename variable." #~ msgstr "Αδυναμία μετονομασίας μεταβλητής." #~ msgid "Enter a variable name to add a new variable." #~ msgstr "Εισήγαγε ένα όνομα για τη δημιουργία νέας μεταβλητής" #~ msgid "{%s, %s}\n" #~ msgstr "{%s, %s}\n" #~ msgid "could not access definition for terminal `%s'" #~ msgstr "αδυναμία πρόσβασης access definition for terminal `%s'" #~ msgid "" #~ "PSPPIRE, a GUI for PSPP, a program for statistical analysis of sampled " #~ "data.\n" #~ "Usage: %s [OPTION]... FILE\n" #~ "\n" #~ "Arguments to long options also apply to equivalent short options.\n" #~ "\n" #~ "GUI options:\n" #~ " -q, --no-splash don't show splash screen during startup\n" #~ "\n" #~ "%sLanguage options:\n" #~ " -I, --include=DIR append DIR to search path\n" #~ " -I-, --no-include clear search path\n" #~ " -a, --algorithm={compatible|enhanced}\n" #~ " set to `compatible' if you want output\n" #~ " calculated from broken algorithms\n" #~ " -x, --syntax={compatible|enhanced}\n" #~ " set to `compatible' to disable PSPP " #~ "extensions\n" #~ " -i, --interactive interpret syntax in interactive mode\n" #~ " -s, --safer don't allow some unsafe operations\n" #~ "Default search path: %s\n" #~ "\n" #~ "Informative output:\n" #~ " -h, --help display this help and exit\n" #~ " -V, --version output version information and exit\n" #~ "\n" #~ "A non-option argument is interpreted as a data file in .sav or .zsav or ." #~ "por\n" #~ "format or a syntax file to load.\n" #~ msgstr "" #~ "PSPPIRE, ένα GUI πρόγραμμα για στατιστική ανάλυση δεδομένων.\n" #~ "Χρήση: %s [OPTION]... FILE\n" #~ "\n" #~ "Ορίσματα σε σύντομη και κύρια μορφή.\n" #~ "\n" #~ "GUI options:\n" #~ " -q, --no-splash μην δείξεις την αρχική εικόνα στην εκκίνηση\n" #~ "\n" #~ "%sΕπιλογές Γλώσσας:\n" #~ " -I, --include=DIR εσωκλεεί τον κατάλογο (DIR) στην διαδρομή " #~ "αναζήτησης\n" #~ " -I-, --no-include διαγραφής της διαδρομή αναζήτησης\n" #~ " -a, --algorithm={compatible|enhanced}\n" #~ " όρισε σε `compatible' (συμβατότητα) αν " #~ "θέλεις\n" #~ " το εξερχόμενο να υπολογιστεί από μη " #~ "ολόκληρους αλγόριθμους\n" #~ " -x, --syntax={compatible|enhanced}\n" #~ " όρισε σε `compatible' (συμβατότητα) για την " #~ "απενεργοποίηση PSPP καταλήξεων\n" #~ " -i, --interactive ερμηνεία σύνταξης σε διαδραστικότητα\n" #~ " -s, --safer μη εκτέλεση μη ασφαλών λειτουργιών \n" #~ "Δοσμένη διαδρομή αναζήτησης: %s\n" #~ "\n" #~ "Πληροφορίες εξερχόμενου:\n" #~ " -h, --help απεικόνιση της βοήθειας αυτής και έξοδος\n" #~ " -V, --version έκδοση εξερχομένου και έξοδος\n" #~ "\n" #~ "Ορίσματα μη απεικονιζόμενα εδώ θα ερμηνευτούν σαν σύνταξη αρχείων και θα " #~ "εκτελεστούν ως έτσι.\n" #~ "Ορίσματα μη απεικονιζόμενα εδώ θα ερμηνευτούν σαν αρχείο δεδομένων στο ." #~ "sav ή στο .zsav ή στο .por\n" #~ "μορφότυπο ή σαν μορφή αρχείου σύνταξης προς φόρτωση.\n" #~ msgid "_Reset" #~ msgstr "_Επαναφορά" #~ msgid "_Select" #~ msgstr "Ε_Πιλογή" #~ msgid "Delete the variables at the selected position(s)" #~ msgstr "Διαγραφή μεταβλητών στην(ις) επιλεγμένη(ες) θέση(εις)." #~ msgid "Delete the cases at the selected position(s)" #~ msgstr "Διαγραφή υποθέσεων στην(ις) επιλεγμένη(ες) θέση(εις)." #~ msgid "_Open..." #~ msgstr "Άνοι_Γμα..." #~ msgid "Transpose the cases with the variables" #~ msgstr "Μετάθεση υποθέσεων με μεταβλητές" #~ msgid "Aggregate the case values into a new variable" #~ msgstr "Συνάθροιση τιμές υποθέσεων σε νέα μεταβλητή" #~ msgid "Choose a subset of cases for analysis" #~ msgstr "Επιλογή υποθέσεων για ανάλυση" #~ msgid "All" #~ msgstr "Όλα" #~ msgid "expecting number or data string" #~ msgstr "αναμένει νούμερο ή δεδομένα συμβολοσειράς" #~ msgid "Number of clusters may not be larger than the number of cases." #~ msgstr "" #~ "Ο Αριθμός των Συστάδων δεν μπορεί να είναι μεγαλύτερος από τον αριθμό " #~ "υποθέσεων." #~ msgid "Value of %s must be between 1 and 100." #~ msgstr "Η τιμή της %s πρέπει να είναι μεταξύ 1 και 100." #~ msgid "" #~ "The last case (%ld) to list is less than 1. The value is being reset to " #~ "1." #~ msgstr "" #~ "H τελευταία υπόθεση (%ld) στη λίστα είναι αριθμημένη κάτω από 1. Η τιμή " #~ "ορίζεται σε 1." #~ msgid "TreeView path" #~ msgstr "Διαδρομή TreeView" #~ msgid "The path to the row in the GtkTreeView, as a string" #~ msgstr "Η διαδρομή προς την γραμμή στο GtkTreeView, σαν συμβολοσειρά" #~ msgid "Diagonal slash" #~ msgstr "Δεξιοπλαγία" #~ msgid "Whether to draw a diagonal slash across the button." #~ msgstr "Απεικόνηση ή όχι διαγώνιας across the button." #~ msgid "Incorrect value for variable type" #~ msgstr "Εσφαλμένη τιμή για τύπο μεταβλητής" #~ msgid "Font Selection" #~ msgstr "Επιλογή Γραμ/σειράς" #~ msgid "Import Delimited Text Data" #~ msgstr "Εισαγωγή Δεδομένων από Αρχείο Κειμένου Υποδιαστολής" #~ msgid "(optional case selection condition)" #~ msgstr "(Προαιρετική επιλογή συνθήκη υπόθεσης)" #~ msgid "Importing Textual Data" #~ msgstr "Εισαγωγή Δεδομένων Κειμένου" #~ msgid "Doubled quote mark treated as escape" #~ msgstr "Σημείο Διπλής Παράθεσης ως Διαφυγή" pspp-1.4.1/po/es.po0000644000175000017500000127740613725012645013526 0ustar00blpblp00000000000000# Spanish messages for PSPP # Copyright (C) 2009, 2010 Free Software Foundation, Inc. # This file is distributed under the same licence as the pspp package. # Francesc Josep Miguel Quesada, 2009. # Palmira Payá Sanchez, 2009. # Javier Gómez Serrano, 2009. # Francesc Josep Miguel Quesada , 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017. msgid "" msgstr "" "Project-Id-Version: pspp-1.0.1\n" "Report-Msgid-Bugs-To: pspp-dev@gnu.org\n" "PO-Revision-Date: 2017-09-22 20:13+0200\n" "Last-Translator: Francesc Josep Miguel Quesada \n" "Language-Team: Spanish \n" "Language: es\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Bugs: Report translation errors to the Language-Team address.\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Lokalize 1.5\n" #: src/data/any-reader.c:72 src/data/encrypted-file.c:78 #, c-format msgid "An error occurred while opening `%s': %s." msgstr "Se ha producido un error al abrir `%s': %s." #: src/data/any-reader.c:93 src/language/lexer/lexer.c:1633 #, c-format msgid "Error reading `%s': %s." msgstr "Error leyendo `%s': %s." #: src/data/any-reader.c:114 #, c-format msgid "`%s' is not a system or portable file." msgstr "`%s' no es un archivo del sistema o portátil." #: src/data/any-reader.c:123 src/data/any-writer.c:66 msgid "The inline file is not allowed here." msgstr "El archivo en línea no está permitido aquí." #: src/data/any-reader.c:205 #, c-format msgid "" "Cannot read from dataset %s because no dictionary or data has been written " "to it yet." msgstr "" "No se puede leer desde el conjunto de datos %s porque aún no se le ha " "escrito un diccionario o datos." #: src/data/any-reader.c:260 src/language/data-io/dataset.c:253 msgid "Dataset" msgstr "Archivo de _Datos" #: src/data/calendar.c:100 #, c-format msgid "Month %d is not in acceptable range of 0 to 13." msgstr "El mes %d no está en el intervalo válido de 0 a 13." #: src/data/calendar.c:110 #, c-format msgid "Day %d is not in acceptable range of 0 to 31." msgstr "El día %d no está en el intervalo válido de 0 a 31." # Thanks to Pope Gregory XIII !!! #: src/data/calendar.c:119 #, c-format msgid "Date %04d-%d-%d is before the earliest acceptable date of 1582-10-15." msgstr "" "La fecha %04d-%d-%d es anterior a la fecha aceptada más antigua, 1582-10-15." #: src/data/casereader-filter.c:221 msgid "" "At least one case in the data read had a weight value that was user-missing, " "system-missing, zero, or negative. These case(s) were ignored." msgstr "" "Al menos un caso en la lectura de datos tenia un valor de ponderación que es " "perdido del usuario, del sistema, cero o negativo. Este(os) caso(s) fueron " "ignorado(s)." #. TRANSLATORS: this fragment will be interpolated into messages in fh_lock() #. that identify types of files. #: src/data/csv-file-writer.c:138 msgid "CSV file" msgstr "archivo CSV" #: src/data/csv-file-writer.c:146 #, fuzzy, c-format #| msgid "Error opening `%s' for writing as a system file: %s." msgid "Error opening `%s' for writing as a CSV file: %s." msgstr "Error al abrir `%s' para grabar como archivo de sistema: %s." #: src/data/csv-file-writer.c:453 #, c-format msgid "An I/O error occurred writing CSV file `%s'." msgstr "Error de E/S al guardar el archivo de sistema `%s'." #: src/data/data-in.c:175 #, c-format msgid "Data is not valid as format %s: %s" msgstr "Los datos no son válidos como formato %s: %s." #: src/data/data-in.c:377 src/data/data-in.c:553 msgid "Field contents are not numeric." msgstr "El contenido del campo no es numérico." #: src/data/data-in.c:379 src/data/data-in.c:555 msgid "Number followed by garbage." msgstr "Número seguido por desecho." #: src/data/data-in.c:392 msgid "Invalid numeric syntax." msgstr "Sintaxis numérica no válida." #: src/data/data-in.c:400 src/data/data-in.c:571 msgid "Too-large number set to system-missing." msgstr "Número demasiado grande definido como perdido del sistema." #: src/data/data-in.c:406 src/data/data-in.c:577 msgid "Too-small number set to zero." msgstr "Número demasiado pequeño definido como cero." #: src/data/data-in.c:426 msgid "All characters in field must be digits." msgstr "Todos los caracteres del campo tienen que ser dígitos." #: src/data/data-in.c:445 msgid "Unrecognized character in field." msgstr "Carácter no reconocido en el campo." #: src/data/data-in.c:466 src/data/data-in.c:729 msgid "Field must have even length." msgstr "Campo debe tener la anchura divisible por 2 (par)." #: src/data/data-in.c:468 src/data/data-in.c:732 msgid "Field must contain only hex digits." msgstr "Campo debe contener únicamente dígitos hexadecimales." #: src/data/data-in.c:544 msgid "Invalid zoned decimal syntax." msgstr "Sintaxis decimal no válida." #: src/data/data-in.c:644 src/data/data-in.c:650 msgid "Invalid syntax for P field." msgstr "Sintaxis numérica no válida para campo P." #: src/data/data-in.c:768 src/data/data-in.c:818 msgid "Syntax error in date field." msgstr "Error sintáctico en el campo de datos." #: src/data/data-in.c:783 #, c-format msgid "Day (%ld) must be between 1 and 31." msgstr "Día (%ld) debe estar entre 1 y 31." #: src/data/data-in.c:832 msgid "Delimiter expected between fields in date." msgstr "En la fecha se espera un delimitador entre los campos." #: src/data/data-in.c:906 msgid "" "Unrecognized month format. Months may be specified as Arabic or Roman " "numerals or as at least 3 letters of their English names." msgstr "" "Formato de mes no reconocido. Los meses pueden ser especificados como " "números Arábigos o Romanos, o como mínimo 3 letras de sus nombres en Inglés." #: src/data/data-in.c:933 #, c-format msgid "Year (%ld) must be between 1582 and 19999." msgstr "Año (%ld) debe estar entre 1582 y 19999." #: src/data/data-in.c:944 #, c-format msgid "Trailing garbage `%.*s' following date." msgstr "Basura `%.*s' detrás de la fecha." #: src/data/data-in.c:958 msgid "Julian day must have exactly three digits." msgstr "Un Día Juliano debe tener exactamente tres dígitos." #: src/data/data-in.c:960 #, c-format msgid "Julian day (%ld) must be between 1 and 366." msgstr "El Día Juliano (%ld) debe estar entre 1 y 366." #: src/data/data-in.c:984 #, c-format msgid "Quarter (%ld) must be between 1 and 4." msgstr "Trimestre (%ld) debe estar entre 1 y 4." #: src/data/data-in.c:1005 #, c-format msgid "Week (%ld) must be between 1 and 53." msgstr "Semana (%ld) debe estar entre 1 y 53." #: src/data/data-in.c:1017 msgid "Delimiter expected between fields in time." msgstr "Se espera un delimitador entre campos de tiempo." #: src/data/data-in.c:1037 #, c-format msgid "Minute (%ld) must be between 0 and 59." msgstr "Minuto (%ld) debe estar entre 0 y 59." #: src/data/data-in.c:1075 msgid "" "Unrecognized weekday name. At least the first two letters of an English " "weekday name must be specified." msgstr "" "Día de la semana no reconocido. Al menos se deben especificar las dos " "primeras letras del nombre en inglés." #: src/data/data-in.c:1210 #, c-format msgid "`%c' expected in date field." msgstr "Se espera `%c' en un campo de datos." #: src/data/data-out.c:580 #, c-format msgid "Weekday number %f is not between 1 and 7." msgstr "Número del día de la semana %f no está entre 1 y 7." #: src/data/data-out.c:605 #, c-format msgid "Month number %f is not between 1 and 12." msgstr "Número del mes %f no está entre 1 y 12." #. TRANSLATORS: this fragment will be interpolated into #. messages in fh_lock() that identify types of files. #: src/data/dataset-writer.c:66 src/language/data-io/file-handle.c:304 msgid "dataset" msgstr "archivo de datos" #: src/data/dict-class.c:52 msgid "ordinary" msgstr "ordinaria" #: src/data/dict-class.c:54 msgid "system" msgstr "sistema" #: src/data/dict-class.c:56 msgid "scratch" msgstr "borrador" #: src/data/dictionary.c:1523 #, c-format msgid "Truncating document line to %d bytes." msgstr "Linea de documento truncada a %d bytes." #: src/data/encrypted-file.c:89 #, c-format msgid "An error occurred while reading `%s': %s." msgstr "Se ha producido un error al abrir `%s': %s." #: src/data/encrypted-file.c:430 #, c-format msgid "" "%s: encrypted file corrupted (ends in incomplete %u-byte ciphertext block)" msgstr "" #: src/data/encrypted-file.c:449 #, c-format msgid "%s: encrypted file corrupted (ends with bad padding)" msgstr "" #: src/data/file-handle-def.c:283 src/language/data-io/dataset.c:266 msgid "active dataset" msgstr "archivo de datos activo" #: src/data/file-handle-def.c:518 #, c-format msgid "Can't read from %s as a %s because it is already being read as a %s." msgstr "" "No se puede leer de %s como una %s porque ya esta siendo leída como una %s." #: src/data/file-handle-def.c:522 #, c-format msgid "Can't write to %s as a %s because it is already being written as a %s." msgstr "" "No se puede escribir en %s como una %s porque ya esta siendo escrita como " "una %s." #: src/data/file-handle-def.c:529 #, c-format msgid "Can't re-open %s as a %s." msgstr "No se puede re-abrir %s como %s." #: src/data/file-name.c:133 #, c-format msgid "Not opening pipe file `%s' because %s option set." msgstr "" "No abrir el archivo de transferencia '%s' porque la opción %s está activada." #: src/data/format.c:339 msgid "Input format" msgstr "Formato de entrada" #: src/data/format.c:339 msgid "Output format" msgstr "Formato de salida" #: src/data/format.c:342 #, c-format msgid "Format %s may not be used for input." msgstr "Formato %s no puede ser utilizado como entrada." #: src/data/format.c:349 #, c-format msgid "%s specifies width %d, but %s requires an even width." msgstr "%s especifica %d anchura, pero %s requiere una anchura par." #: src/data/format.c:358 #, c-format msgid "%s %s specifies width %d, but %s requires a width between %d and %d." msgstr "" "%s %s especifica anchura %d, pero %s requiere una anchura entre %d y %d." #: src/data/format.c:367 #, c-format msgid "%s %s specifies %d decimal place, but %s does not allow any decimals." msgid_plural "" "%s %s specifies %d decimal places, but %s does not allow any decimals." msgstr[0] "%s %s especifica %d lugar decimal, pero %s no permite ninguno." msgstr[1] "%s %s especifica %d lugares decimales, pero %s no permite ninguno." #: src/data/format.c:378 #, c-format msgid "" "%s %s specifies %d decimal place, but the given width allows at most %d " "decimals." msgid_plural "" "%s %s specifies %d decimal places, but the given width allows at most %d " "decimals." msgstr[0] "" "%s %s especifica %d lugar decimal, pero la anchura dada permite como mucho " "%d decimales." msgstr[1] "" "%s %s especifica %d lugares decimales, pero la anchura dada permite como " "mucho %d decimales." #: src/data/format.c:385 #, c-format msgid "" "%s %s specifies %d decimal place, but the given width does not allow for any " "decimals." msgid_plural "" "%s %s specifies %d decimal places, but the given width does not allow for " "any decimals." msgstr[0] "" "%s %s especifica %d lugar decimal, pero la anchura dada no permite ninguno." msgstr[1] "" "%s %s especifica %d lugares decimales, pero la anchura dada no permite " "ninguno." #: src/data/format.c:424 #, c-format msgid "%s variables are not compatible with %s format %s." msgstr "Las variables %s no son compatibles con %s formato %s." #: src/data/format.c:425 src/data/format.c:1074 #: src/ui/gui/var-type-dialog.ui:167 msgid "String" msgstr "Cadena" #: src/data/format.c:425 src/data/format.c:1035 #: src/ui/gui/var-type-dialog.ui:48 msgid "Numeric" msgstr "Numérico" #: src/data/format.c:426 src/data/sys-file-reader.c:2212 #: src/data/sys-file-reader.c:2214 src/language/xforms/recode.c:512 #: src/language/xforms/recode.c:513 src/language/xforms/recode.c:525 #: src/language/xforms/recode.c:526 #: src/language/dictionary/apply-dictionary.c:77 #: src/language/dictionary/apply-dictionary.c:78 msgid "numeric" msgstr "numérico" #: src/data/format.c:426 src/data/sys-file-reader.c:2212 #: src/data/sys-file-reader.c:2214 src/language/xforms/recode.c:512 #: src/language/xforms/recode.c:513 src/language/xforms/recode.c:525 #: src/language/xforms/recode.c:526 #: src/language/dictionary/apply-dictionary.c:77 #: src/language/dictionary/apply-dictionary.c:78 msgid "string" msgstr "cadena" #: src/data/format.c:444 #, c-format msgid "String variable with width %d is not compatible with format %s." msgstr "Variable de cadena con ancho %d no es compatible con el formato %s." #: src/data/format.c:1038 src/ui/gui/var-type-dialog.ui:65 msgid "Comma" msgstr "Coma" #: src/data/format.c:1041 src/ui/gui/var-type-dialog.ui:82 msgid "Dot" msgstr "Punto" #: src/data/format.c:1044 msgid "Scientific" msgstr "Científico" #: src/data/format.c:1061 src/ui/gui/var-type-dialog.ui:116 msgid "Date" msgstr "Fecha" #: src/data/format.c:1064 src/ui/gui/var-type-dialog.ui:133 msgid "Dollar" msgstr "Dólar" #: src/data/format.c:1071 msgid "Custom" msgstr "De usuario" #: src/data/gnumeric-reader.c:478 src/data/ods-reader.c:505 #, c-format msgid "Cannot convert the value in the spreadsheet cell %s to format (%s): %s" msgstr "" "Imposible convertir el valor en la celda de la hoja de cálculo %s al formato " "(%s): %s" #: src/data/gnumeric-reader.c:502 src/data/ods-reader.c:567 #, c-format msgid "" "There was a problem whilst reading the %s file `%s' (near line %d): `%s'" msgstr "" "Hubo un problema mientras se leía el fichero %s `%s' (hacia la linea %d): `" "%s'" #: src/data/gnumeric-reader.c:597 #, c-format msgid "" "The gnumeric file `%s' is encoded as %s instead of the usual UTF-8 encoding. " "Any non-ascii characters will be incorrectly imported." msgstr "" "El archivo gnumeric `%s' está codificado como %s en lugar de la codificación " "habitual UTF-8. Se importaran incorrectamente cualquier caracter no-ascii." #: src/data/gnumeric-reader.c:641 src/data/ods-reader.c:682 #, c-format msgid "Invalid cell range `%s'" msgstr "Intervalo de celda `%s' inválido" #: src/data/gnumeric-reader.c:813 src/data/ods-reader.c:710 #: src/data/ods-reader.c:843 #, c-format msgid "Selected sheet or range of spreadsheet `%s' is empty." msgstr "" "La hoja o el intervalo de hojas de cálculo seleccionadas `%s' está vacía." #: src/data/identifier2.c:60 #, c-format msgid "Identifier `%s' exceeds %d-byte limit." msgstr "El identificador `%s' supera el límite de %d-bytes." #: src/data/identifier2.c:84 msgid "Identifier cannot be empty string." msgstr "El identificador no puede ser una cadena vacía." #: src/data/identifier2.c:92 #, c-format msgid "`%s' may not be used as an identifier because it is a reserved word." msgstr "" "`%s' no puede ser utilizado como identificador porque es una palabra " "reservada." #: src/data/identifier2.c:103 #, c-format msgid "" "`%s' may not be used as an identifier because it contains ill-formed UTF-8 " "at byte offset %tu." msgstr "" "`%s' no puede ser utilizado como identificador porque contiene UTF-8 mal " "formado en la posición %tu." #: src/data/identifier2.c:114 #, c-format msgid "" "Character %s (in `%s') may not appear as the first character in a identifier." msgstr "" "Carácter %s (en `%s') no puede aparecer como el primer carácter en un " "identificador." #: src/data/identifier2.c:126 #, c-format msgid "Character %s (in `%s') may not appear in an identifier." msgstr "El carácter %s (en `%s') no puede aparecer en un identificador." #: src/data/mdd-writer.c:241 #, fuzzy, c-format #| msgid "I/O error occurred writing data file `%s'." msgid "An I/O error occurred writing metadata file `%s'." msgstr "Error de E/S al escribir los datos del fichero `%s'." #. TRANSLATORS: this fragment will be interpolated into #. messages in fh_lock() that identify types of files. #: src/data/mdd-writer.c:457 #, fuzzy #| msgid "data file" msgid "metadata file" msgstr "archivo de datos" #: src/data/mdd-writer.c:465 #, fuzzy, c-format #| msgid "Error opening `%s' for writing as a portable file: %s." msgid "Error opening `%s' for writing as a metadata file: %s." msgstr "Error abriendo `%s' para escribir como archivo portátil: %s." #: src/data/mdd-writer.c:473 #, c-format msgid "Internal error creating xmlTextWriter. Please report this to %s." msgstr "" #: src/data/make-file.c:217 #, c-format msgid "Opening %s for writing: %s." msgstr "Abriendo %s para escribir: %s." #: src/data/make-file.c:228 #, c-format msgid "Opening stream for %s: %s." msgstr "Abriendo flujo para %s: %s." #: src/data/make-file.c:260 #, c-format msgid "Creating temporary file to replace %s: %s." msgstr "Creando archivo temporal para sustituir %s: %s." #: src/data/make-file.c:277 #, c-format msgid "Creating temporary file %s: %s." msgstr "Creando archivo temporal %s: %s." #: src/data/make-file.c:289 #, c-format msgid "Opening stream for temporary file %s: %s." msgstr "Abriendo flujo para el archivo temporal %s: %s." #: src/data/make-file.c:326 #, c-format msgid "Replacing %s by %s: %s." msgstr "Sustituyendo %s por %s: %s." #: src/data/make-file.c:354 #, c-format msgid "Removing %s: %s." msgstr "Eliminando %s: %s." #: src/data/mrset.c:83 #, c-format msgid "" "%s is not a valid name for a multiple response set. Multiple response set " "names must begin with `$'." msgstr "" "%s no es un nombre válido de variable para un conjunto de respuesta " "múltiple. Los conjuntos de respuesta múltiple han de comenzar con `$'." #: src/data/ods-reader.c:620 #, c-format msgid "Cannot open %s as a OpenDocument file: %s" msgstr "Imposible abrir %s como un archivo OpenDocument: %s" #. TRANSLATORS: this fragment will be interpolated into #. messages in fh_lock() that identify types of files. #: src/data/pc+-file-reader.c:206 msgid "SPSS/PC+ system file" msgstr "archivo de sistema SPSS/PC+" #: src/data/pc+-file-reader.c:215 #, c-format msgid "Error opening `%s' for reading as an SPSS/PC+ system file: %s." msgstr "" "Error abriendo `%s' para su lectura como archivo de sistema SPSS/PC+: %s." #: src/data/pc+-file-reader.c:224 src/data/sys-file-reader.c:3541 #, c-format msgid "%s: stat failed (%s)." msgstr "%s: estadístico fallido (%s)." #: src/data/pc+-file-reader.c:230 #, c-format msgid "%s: file too large." msgstr "%s: fichero demasiado grande." #: src/data/pc+-file-reader.c:257 #, c-format msgid "" "Directory entry is for a %u-byte record starting at offset %u but file is " "only %u bytes long." msgstr "" "La entrada Directorio es para un registro %u-byte comenzando en la posición " "%u pero el fichero sólo tiene %u bytes de largo." #: src/data/pc+-file-reader.c:275 #, c-format msgid "Directory fields have unexpected values (%u,%u)." msgstr "Los campos del Directorio tienen valores inesperados (%u,%u)." #: src/data/pc+-file-reader.c:372 src/data/sys-file-reader.c:672 #, c-format msgid "Variable %zu" msgstr "Variable %zu" #: src/data/pc+-file-reader.c:380 src/data/sys-file-reader.c:680 #, c-format msgid "Variable %zu Label" msgstr "Etiqueta de variable %zu " #: src/data/pc+-file-reader.c:385 #, c-format msgid "Variable %zu Value Label %zu" msgstr "Variable %zu Etiqueta de Valor %zu" #: src/data/pc+-file-reader.c:388 src/data/sys-file-reader.c:690 msgid "Creation Date" msgstr "Fecha de Creación" #: src/data/pc+-file-reader.c:389 src/data/sys-file-reader.c:691 msgid "Creation Time" msgstr "Hora de Creación" #: src/data/pc+-file-reader.c:390 src/data/sys-file-reader.c:692 #: src/language/dictionary/sys-file-info.c:200 msgid "Product" msgstr "Producto" #: src/data/pc+-file-reader.c:391 src/data/sys-file-reader.c:693 #: src/language/dictionary/sys-file-info.c:300 msgid "File Label" msgstr "Etiqueta de Fichero" #: src/data/pc+-file-reader.c:427 #, c-format msgid "" "Using default encoding %s to read this SPSS/PC+ system file. For best " "results, specify an encoding explicitly. Use SYSFILE INFO with ENCODING=" "\"DETECT\" to analyze the possible encodings." msgstr "" "Se utilizará la codificación predeterminada %s para leer este fichero de " "sistema SPSS/PC+. Para mejorar los resultados, especificar explícitamente " "una codificación. Para analizar las codificaciones posibles utilizar SYSFILE " "INFO con ENCODING=\"DETECT\"." #: src/data/pc+-file-reader.c:483 src/data/sys-file-reader.c:890 #, c-format msgid "Error closing system file `%s': %s." msgstr "Error cerrando el archivo de sistema `%s': %s." #: src/data/pc+-file-reader.c:544 msgid "This is not an SPSS/PC+ system file." msgstr "Éste no es un archivo de sistema de SPSS/PC+." #: src/data/pc+-file-reader.c:548 #, c-format msgid "Record 0 has unexpected length %u." msgstr "El registro 0 tiene longitud no esperada %u." #: src/data/pc+-file-reader.c:572 #, c-format msgid "Record 0 specifies unexpected system missing value %g (%a)." msgstr "" "El registro 0 especifica un valor perdido del sistema no esperado %g (%a)." #: src/data/pc+-file-reader.c:577 #, c-format msgid "Record 0 reserved fields have unexpected values (%u,%u,%u,%u,%u,%u)." msgstr "" "Los campos reservados del registro 0 tienen valores inesperados (%u,%u,%u,%u," "%u,%u)." #: src/data/pc+-file-reader.c:581 #, c-format msgid "Record 0 case counts differ (%u versus %u)." msgstr "El recuento de casos del registro 0 es contradictorio (%u versus %u)." #: src/data/pc+-file-reader.c:585 #, c-format msgid "Invalid compression type %u." msgstr "Tipo de compresión no válido %u." #: src/data/pc+-file-reader.c:596 #, c-format msgid "" "Record 0 claims %u cases with %u values per case (requiring at least %zu " "bytes) but data record is only %u bytes long." msgstr "" "El registro 0 pide %u casos con %u valores por caso (requiriendo al monos " "%zu bytes) pero el registro de datos sólo tiene %u bytes de largo." #: src/data/pc+-file-reader.c:618 #, c-format msgid "" "Value labels claimed to end at offset %u in labels record but labels record " "is only %u bytes." msgstr "" "Las etiquetas de valor requieren acabar en la posición %u en el registro de " "etiquetas pero el registro de etiquetas tiene sólo %u bytes." #: src/data/pc+-file-reader.c:629 #, c-format msgid "" "Value labels claimed to be at offset %u with length %u but file size is only " "%u bytes." msgstr "" "Las etiquetas de valor dicen estar en la posición %u con longitud %u pero el " "tamaño del fichero es de sólo %u bytes." #: src/data/pc+-file-reader.c:656 #, c-format msgid "" "Value labels end with partial label (%u bytes left in record, label length " "%)." msgstr "" "Las etiquetas de valor acaban con una etiqueta parcial (quedan %u bytes al " "registre, longitud de etiqueta %)." #: src/data/pc+-file-reader.c:669 #, c-format msgid "%u leftover bytes following value labels." msgstr "%u bytes sobrantes a continuación de las etiquetas de valor." #: src/data/pc+-file-reader.c:685 #, c-format msgid "" "Variable label claimed to start at offset %u in labels record but labels " "record is only %u bytes." msgstr "" "La etiqueta de variable pide comenzar en la posición %u del registro de " "etiquetas pero este registro sólo tiene %u bytes." #: src/data/pc+-file-reader.c:697 #, c-format msgid "" "Variable label with length %u starting at offset %u in labels record " "overruns end of %u-byte labels record." msgstr "" "Etiqueta de variable con longitud %u comenzando en la posición %u del " "registro de etiquetas sobrepasa el final del registro %u-byte." #: src/data/pc+-file-reader.c:719 #, c-format msgid "Record 1 has length %u (expected %u)." msgstr "Registro 1 tiene longitud %u (se espera %u)." #: src/data/pc+-file-reader.c:751 #, c-format msgid "Variable %u has invalid type %." msgstr "La variable %u tiene un tipo inválido %." #: src/data/pc+-file-reader.c:787 #, c-format msgid "Invalid weight index %u." msgstr "Índice de ponderación %u inválido." #: src/data/pc+-file-reader.c:857 #, c-format msgid "Invalid variable name `%s'." msgstr "Nombre de variable '%s' no válido." #: src/data/pc+-file-reader.c:865 src/data/sys-file-reader.c:1444 #, c-format msgid "Renaming variable with duplicate name `%s' to `%s'." msgstr "Cambiando el nombre con el nombre duplicado, de `%s' a `%s'." #: src/data/pc+-file-reader.c:877 #, c-format msgid "Cannot weight by string variable `%s'." msgstr "No está permitido ponderar por la variable de cadena `%s'." #: src/data/pc+-file-reader.c:973 src/data/sys-file-reader.c:2762 msgid "File ends in partial case." msgstr "El archivo acaba en un caso parcial." #: src/data/pc+-file-reader.c:979 #, c-format msgid "" "Case beginning at offset 0x%08x extends past end of data record at offset 0x" "%08x." msgstr "" "El caso que comienza en la posición 0x%08x se extiende más allá del final " "del registro de datos en la posición 0x%08x." #: src/data/pc+-file-reader.c:998 src/data/sys-file-reader.c:2770 #, c-format msgid "Error reading case from file %s." msgstr "Error leyendo un caso del archivo %s." #: src/data/pc+-file-reader.c:1114 src/data/sys-file-reader.c:2933 #, c-format msgid "" "Possible compressed data corruption: string contains compressed integer " "(opcode %d)." msgstr "" "Posible corrupción de datos comprimidos: una cadena textual contiene un " "entero comprimido (opcode %d)." #: src/data/pc+-file-reader.c:1156 src/data/sys-file-reader.c:3234 #, c-format msgid "`%s' near offset 0x%llx: " msgstr "`%s' cerca de la posición 0x%llx: " #: src/data/pc+-file-reader.c:1159 src/data/sys-file-reader.c:3237 #, c-format msgid "`%s': " msgstr "`%s': " #: src/data/pc+-file-reader.c:1211 src/data/sys-file-reader.c:3288 #, c-format msgid "System error: %s." msgstr "Error de sistema: %s." #: src/data/pc+-file-reader.c:1216 src/data/sys-file-reader.c:3293 msgid "Unexpected end of file." msgstr "Final de archivo inesperado." #: src/data/pc+-file-reader.c:1301 src/data/sys-file-reader.c:3518 #, c-format msgid "%s: seek failed (%s)." msgstr "%s: búsqueda fallida (%s)." #: src/data/pc+-file-reader.c:1351 msgid "SPSS/PC+ System File" msgstr "Archivo de Sistema SPSS/PC+" #: src/data/por-file-reader.c:109 #, c-format msgid "portable file %s corrupt at offset 0x%llx: " msgstr "el archivo portátil %s está corrupto en la posición 0x%llx: " #: src/data/por-file-reader.c:136 #, c-format msgid "reading portable file %s at offset 0x%llx: " msgstr "leyendo el archivo portátil %s en la posición 0x%llx: " #: src/data/por-file-reader.c:164 #, c-format msgid "Error closing portable file `%s': %s." msgstr "Error cerrando el archivo portátil `%s': %s." #: src/data/por-file-reader.c:216 msgid "unexpected end of file" msgstr "fin de archivo inesperado" #. TRANSLATORS: this fragment will be interpolated into #. messages in fh_lock() that identify types of files. #: src/data/por-file-reader.c:275 src/data/por-file-writer.c:147 msgid "portable file" msgstr "archivo portátil" #: src/data/por-file-reader.c:283 #, c-format msgid "" "An error occurred while opening `%s' for reading as a portable file: %s." msgstr "Error abriendo `%s' para la lectura como archivo portátil: %s." #: src/data/por-file-reader.c:304 msgid "Data record expected." msgstr "Registro de datos esperado." #: src/data/por-file-reader.c:402 msgid "Number expected." msgstr "Número esperado." #: src/data/por-file-reader.c:430 msgid "Missing numeric terminator." msgstr "Falta la terminación numérica." #: src/data/por-file-reader.c:453 msgid "Invalid integer." msgstr "Número entero inválido." #: src/data/por-file-reader.c:464 src/data/por-file-reader.c:484 #, c-format msgid "Bad string length %d." msgstr "Longitud de cadena %d inválida." #: src/data/por-file-reader.c:547 #, c-format msgid "%s: Not a portable file." msgstr "%s: No es un archivo portátil." #: src/data/por-file-reader.c:564 #, c-format msgid "Unrecognized version code `%c'." msgstr "Código de versión no reconocido `%c'." #: src/data/por-file-reader.c:577 #, c-format msgid "Bad date string length %zu." msgstr "Longitud de cadena de datos %zu inválida." #: src/data/por-file-reader.c:579 #, c-format msgid "Bad time string length %zu." msgstr "Longitud de cadena de tiempo %zu inválida." #: src/data/por-file-reader.c:630 #, c-format msgid "" "%s: Bad format specifier byte (%d). Variable will be assigned a default " "format." msgstr "" "%s: Byte especificador de formato inválido (%d). Se asignará formato " "predeterminado a la variable." #: src/data/por-file-reader.c:651 #, c-format msgid "Numeric variable %s has invalid format specifier %s." msgstr "" "La variable numérica %s tiene una especificación de formato inválida %s." #: src/data/por-file-reader.c:655 #, c-format msgid "String variable %s with width %d has invalid format specifier %s." msgstr "" "La variable en cadena %s con longitud %d tiene una especificación de formato " "inválida %s." #: src/data/por-file-reader.c:679 msgid "Expected variable count record." msgstr "Registro de recuento de variables esperado." #: src/data/por-file-reader.c:683 #, c-format msgid "Invalid number of variables %d." msgstr "Número inválido de variables: %d." #: src/data/por-file-reader.c:692 #, c-format msgid "Weight variable name (%s) truncated." msgstr "Nombre de la variable ponderada (%s) truncado." #: src/data/por-file-reader.c:707 msgid "Expected variable record." msgstr "Registro de variable esperado." #: src/data/por-file-reader.c:711 #, c-format msgid "Invalid variable width %d." msgstr "Ancho de variable inválida %d." #: src/data/por-file-reader.c:719 #, c-format msgid "Invalid variable name `%s' in position %d." msgstr "Nombre de la variable inválido `%s' en la posición %d." #: src/data/por-file-reader.c:723 src/data/sys-file-reader.c:1426 #, c-format msgid "Bad width %d for variable %s." msgstr "Ancho %d incorrecto para la variable %s." #: src/data/por-file-reader.c:737 #, c-format msgid "Duplicate variable name %s in position %d renamed to %s." msgstr "" "Nombre de la variable %s duplicado en la posición %d se ha renombrado a %s." #: src/data/por-file-reader.c:786 #, c-format msgid "Weighting variable %s not present in dictionary." msgstr "La variable de ponderación %s no está en el diccionario." #: src/data/por-file-reader.c:830 #, c-format msgid "Unknown variable %s while parsing value labels." msgstr "Variable %s desconocida mientras se analizaban las etiquetas de valor." #: src/data/por-file-reader.c:833 #, c-format msgid "" "Cannot assign value labels to %s and %s, which have different variable types." msgstr "" "No se puede asignar etiquetas de valor a %s y %s, que tienen diferentes " "tipos de variables." #: src/data/por-file-reader.c:972 msgid "SPSS Portable File" msgstr "Archivo Portable SPSS" #: src/data/por-file-writer.c:139 #, c-format msgid "Invalid decimal digits count %d. Treating as %d." msgstr "Recuento de dígitos decimales %d inválido. Se tratarà como %d." #: src/data/por-file-writer.c:159 #, c-format msgid "Error opening `%s' for writing as a portable file: %s." msgstr "Error abriendo `%s' para escribir como archivo portátil: %s." #: src/data/por-file-writer.c:505 #, c-format msgid "An I/O error occurred writing portable file `%s'." msgstr "Error I/O al escribir el archivo portátil `%s'." #: src/data/psql-reader.c:48 msgid "" "Support for reading postgres databases was not compiled into this " "installation of PSPP" msgstr "" "El soporte para la lectura de las bases de datos postgres no fue compilado " "en esta instalación de PSPP" #: src/data/psql-reader.c:242 msgid "Memory error whilst opening psql source" msgstr "Error de memoria en abrir la fuente psql" #: src/data/psql-reader.c:248 #, c-format msgid "Error opening psql source: %s." msgstr "Error abriendo la fuente psql: %s." #: src/data/psql-reader.c:263 #, c-format msgid "" "Postgres server is version %s. Reading from versions earlier than 8.0 is not " "supported." msgstr "" "La versión del servidor Postgres es la %s. No es posible la lectura desde " "versiones anteriores a la 8.0." #: src/data/psql-reader.c:283 msgid "" "Connection is unencrypted, but unencrypted connections have not been " "permitted." msgstr "" "La conexión no está cifrada, pero las conexiones sin cifrar no están " "permitidas." #: src/data/psql-reader.c:324 src/data/psql-reader.c:349 #: src/data/psql-reader.c:359 #, c-format msgid "Error from psql source: %s." msgstr "Error desde la fuente psql: %s." #: src/data/psql-reader.c:454 #, c-format msgid "Unsupported OID %d. SYSMIS values will be inserted." msgstr "OID %d no admitido. Valores SYSMIS serán insertados." #: src/data/settings.c:391 msgid "" "MXWARNS set to zero. No further warnings will be given even when " "potentially problematic situations are encountered." msgstr "" "MXWARNS colocado a cero. Ningún aviso se mostrará en lo sucesivo aunque se " "den situaciones problemáticas." #: src/data/settings.c:398 #, c-format msgid "" "Warnings re-enabled. %d warnings will be issued before aborting syntax " "processing." msgstr "" "Avisos re-activados. %d avisos se mostraran antes de abortar el " "procesamiento de sintaxis." #: src/data/settings.c:618 #, c-format msgid "" "%s: Custom currency string `%s' does not contain exactly three periods or " "commas (or it contains both)." msgstr "" "%s: La cadena de moneda personalizada '%s' no contiene exactamente tres " "puntos o comas (o contiene ambos)." #. TRANSLATORS: this fragment will be interpolated into #. messages in fh_lock() that identify types of files. #: src/data/sys-file-reader.c:407 src/data/sys-file-writer.c:245 msgid "system file" msgstr "archivo de sistema" #: src/data/sys-file-reader.c:414 #, c-format msgid "Error opening `%s' for reading as a system file: %s." msgstr "Error abriendo `%s' para la lectura como archivo de sistema: %s." #: src/data/sys-file-reader.c:491 msgid "Misplaced type 4 record." msgstr "Registro de tipo 4 fuera de lugar." #: src/data/sys-file-reader.c:496 msgid "Duplicate type 6 (document) record." msgstr "Registros de tipo 6 (document) duplicados." #: src/data/sys-file-reader.c:506 src/data/sys-file-reader.c:1343 #, c-format msgid "" "Unrecognized record type 7, subtype %d. For help, please send this file to " "%s and mention that you were using %s." msgstr "" "Registro de tipo 7, subtipo %d , no reconocido. Por favor envíe una copia de " "este archivo a %s y mencione que usaba %s." #: src/data/sys-file-reader.c:526 #, c-format msgid "" "Record type 7, subtype %d found here has the same type as the record found " "near offset 0x%llx. For help, please send this file to %s and mention that " "you were using %s." msgstr "" "Registro de tipo 7, subtipo %d encontrado aquí del mismo tipo que el " "registro encontrado cerca de la posición 0x%llx. Por favor envíe una copia " "de este archivo a %s y mencione que usaba %s." #: src/data/sys-file-reader.c:538 #, c-format msgid "Unrecognized record type %d." msgstr "Tipo de registro %d no reconocido." #: src/data/sys-file-reader.c:688 #, c-format msgid "Value Label %zu" msgstr "Etiqueta de Valor %zu" #: src/data/sys-file-reader.c:697 msgid "Extra Product Info" msgstr "Información Extra del Producto" #: src/data/sys-file-reader.c:710 #, c-format msgid "Document Line %zu" msgstr "Línea de Documento %zu" #: src/data/sys-file-reader.c:718 #, c-format msgid "MRSET %zu" msgstr "MRSET %zu" #: src/data/sys-file-reader.c:720 #, c-format msgid "MRSET %zu Label" msgstr "Etiqueta MRSET %zu" #: src/data/sys-file-reader.c:725 #, c-format msgid "MRSET %zu Counted Value" msgstr "Valor de recuento para MRSET %zu" #: src/data/sys-file-reader.c:763 #, c-format msgid "" "This system file does not indicate its own character encoding. Using " "default encoding %s. For best results, specify an encoding explicitly. Use " "SYSFILE INFO with ENCODING=\"DETECT\" to analyze the possible encodings." msgstr "" "Este fichero de sistema no indica su codificación de caracteres. Se " "utilizará la codificación por defecto %s. Para mejorar los resultados, " "especifica explícitamente una codificación. Para analizar codificaciones " "posibles utiliza SYSFILE INFO con ENCODING=\"DETECT\"." #: src/data/sys-file-reader.c:845 #, c-format msgid "File header claims %d variable positions but %zu were read from file." msgstr "" "La cabecera del archivo requiere %d posiciones de variable, pero se han " "leído %zu desde el archivo." #: src/data/sys-file-reader.c:958 src/data/sys-file-reader.c:972 msgid "This is not an SPSS system file." msgstr "Esto no es un archivo de sistema de SPSS." #: src/data/sys-file-reader.c:1027 msgid "" "Compression bias is not the usual value of 100, or system file uses " "unrecognized floating-point format." msgstr "" "El sesgo de compresión no es el valor habitual de 100, o el archivo de " "sistema utiliza un formato de punto flotante no reconocido." #: src/data/sys-file-reader.c:1102 msgid "Variable label indicator field is not 0 or 1." msgstr "Campo indicador de etiqueta de variable no es 0 o 1." #: src/data/sys-file-reader.c:1115 msgid "Numeric missing value indicator field is not -3, -2, 0, 1, 2, or 3." msgstr "" "Campo de indicador de valores perdidos numéricos no es -3, -2, 0, 1, 2 o 3." #: src/data/sys-file-reader.c:1125 msgid "String missing value indicator field is not 0, 1, 2, or 3." msgstr "Campo de indicador de valores perdidos de cadena no es 0, 1, 2 o 3." #: src/data/sys-file-reader.c:1152 #, c-format msgid "Invalid number of labels %u." msgstr "Número inválido de etiquetas %u." #: src/data/sys-file-reader.c:1185 msgid "" "Variable index record (type 4) does not immediately follow value label " "record (type 3) as it should." msgstr "" "Registro de índice de variable (tipo 4) no está seguido inmediatament, como " "debería, por el registro de etiquetas de valores (tipo 3) ." #: src/data/sys-file-reader.c:1197 #, c-format msgid "" "Number of variables associated with a value label (%u) is not between 1 and " "the number of variables (%zu)." msgstr "" "El número de variables asociadas con una etiqueta de valor (%u) no está " "entre 1 y el número de variables (%zu)." #: src/data/sys-file-reader.c:1224 #, c-format msgid "Number of document lines (%d) must be greater than 0 and less than %d." msgstr "" "Número de líneas de documento (%d) tiene que ser mayor que 0 y menor que %d." #: src/data/sys-file-reader.c:1317 #, c-format msgid "Record type 7, subtype %d has bad size %u (expected %d)." msgstr "" "Registro de tipo 7, subtipo %d tiene medida incorrecta %u (se espera %d)." #: src/data/sys-file-reader.c:1321 #, c-format msgid "Record type 7, subtype %d has bad count %u (expected %d)." msgstr "" "Registro de tipo 7, subtipo %d tiene recuento incorrecto %u (se espera %d)." #: src/data/sys-file-reader.c:1435 #, fuzzy, c-format #| msgid "Renaming variable with duplicate name `%s' to `%s'." msgid "Renaming variable with invalid name `%s' to `%s'." msgstr "Cambiando el nombre con el nombre duplicado, de `%s' a `%s'." #: src/data/sys-file-reader.c:1517 msgid "Missing string continuation record." msgstr "Falta de registro de continuación de cadena." #: src/data/sys-file-reader.c:1550 #, c-format msgid "Variable %s with width %d has invalid print format 0x%x." msgstr "La variable %s con longitud %d tiene formato inválido 0x%x." #: src/data/sys-file-reader.c:1554 #, c-format msgid "Variable %s with width %d has invalid write format 0x%x." msgstr "" "La variable %s con longitud %d tiene formato de escritura inválido 0x%x." #: src/data/sys-file-reader.c:1559 msgid "Suppressing further invalid format warnings." msgstr "Se desactivan las alertas posteriores de formato no válido." #: src/data/sys-file-reader.c:1613 #, c-format msgid "" "Floating-point representation indicated by system file (%d) differs from " "expected (%d)." msgstr "" "Representación del punto flotante indicado por el archivo de sistema (%d) " "difiere de lo esperado (%d)." #: src/data/sys-file-reader.c:1629 #, c-format msgid "" "Integer format indicated by system file (%d) differs from expected (%d)." msgstr "" "El formato entero indicado por el archivo de sistema (%d) difiere de lo " "esperado (%d)." #: src/data/sys-file-reader.c:1647 src/data/sys-file-reader.c:1653 #, c-format msgid "File specifies unexpected value %g (%a) as %s, instead of %g (%a)." msgstr "" "El archivo especifica un valor inesperado %g (%a) como %s, en lugar de %g " "(%a)." #: src/data/sys-file-reader.c:1662 #, c-format msgid "" "File specifies unexpected value %g (%a) as %s, instead of %g (%a) or %g (%a)." msgstr "" "El archivo especifica un valor inesperado %g (%a) como %s, en lugar de %g " "(%a) o %g (%a)." #: src/data/sys-file-reader.c:1714 src/data/sys-file-reader.c:1733 #, c-format msgid "Missing space following `%c' at offset %zu in MRSETS record." msgstr "Espacio perdido tras `%c' en la posición %zu de un registro MRSETS." #: src/data/sys-file-reader.c:1741 #, fuzzy, c-format #| msgid "" #| "Unexpected label source value following `E' at offset %zu in MRSETS " #| "record." msgid "" "Missing label source value following `E' at offset %zu in MRSETS record." msgstr "" "Valor de etiqueta inesperado tras `E' en la posición %zu de un registro " "MRSETS." #: src/data/sys-file-reader.c:1748 #, c-format msgid "" "Unexpected label source value following `E' at offset %zu in MRSETS record." msgstr "" "Valor de etiqueta inesperado tras `E' en la posición %zu de un registro " "MRSETS." #: src/data/sys-file-reader.c:1755 #, c-format msgid "Missing `C', `D', or `E' at offset %zu in MRSETS record." msgstr "Falta `C', `D' o `E' en la posición %zu de un registro MRSETS." #: src/data/sys-file-reader.c:1782 #, c-format msgid "Missing new-line parsing variable names at offset %zu in MRSETS record." msgstr "" "Faltan nombres de variables para nueva línea en la posición %zu de un " "registro MRSETS." #: src/data/sys-file-reader.c:1817 #, c-format msgid "Invalid multiple response set name `%s'." msgstr "Nombre inválido del conjunto multi-respuesta %s." #: src/data/sys-file-reader.c:1850 #, c-format msgid "MRSET %s contains duplicate variable name %s." msgstr "El MRSET %s contiene el nombre de variable duplicado %s." #: src/data/sys-file-reader.c:1865 #, c-format msgid "MRSET %s contains both string and numeric variables." msgstr "MRSET %s contiene tanto variables textuales como numéricas." #: src/data/sys-file-reader.c:1877 #, c-format msgid "MRSET %s has no variables." msgstr "El MRSET %s no tiene variables." #: src/data/sys-file-reader.c:1879 #, c-format msgid "MRSET %s has only one variable." msgstr "El MRSET %s tiene sólo una variable." #: src/data/sys-file-reader.c:1923 #, c-format msgid "Extension 11 has bad count %u (for %zu variables)." msgstr "Extensión 11 tiene un recuento inválido %u (para %zu variables)." #: src/data/sys-file-reader.c:1956 #, c-format msgid "" "Invalid variable display parameters for variable %zu (%s). Default " "parameters substituted." msgstr "" "Parámetros de visualización de variable no válidos para la variable %zu " "(%s). Sustitución de parámetros por defecto." #: src/data/sys-file-reader.c:2000 #, c-format msgid "Duplicate long variable name `%s'." msgstr "Nombre largo de la variable `%s' duplicado." #: src/data/sys-file-reader.c:2053 #, c-format msgid "Long variable mapping from %s to invalid variable name `%s'." msgstr "" "Identificación de variable larga desde %s hacia un nombre de variable " "inválido '%s'." #: src/data/sys-file-reader.c:2088 #, c-format msgid "%s listed as string of invalid length %s in very long string record." msgstr "" "%s figura como cadena de longitud no válida %s en un registro de cadena muy " "largo." #: src/data/sys-file-reader.c:2099 #, c-format msgid "" "%s listed in very long string record with width %s, which requires only one " "segment." msgstr "" "%s figura en el registro de cadena muy larga con longitud %s, que requiere " "solo un segmento." #: src/data/sys-file-reader.c:2107 #, c-format msgid "Very long string %s overflows dictionary." msgstr "Cadena muy larga %s desborda el diccionario." #: src/data/sys-file-reader.c:2125 #, c-format msgid "" "Very long string with width %ld has segment %d of width %d (expected %d)." msgstr "" "Cadena muy larga con una longitud %ld tiene un segmento %d de longitud %d " "(se espera %d)" #: src/data/sys-file-reader.c:2183 #, fuzzy, c-format #| msgid "Variable index %d not in valid range 1...%zu." msgid "Value label variable index %d not in valid range 1...%zu." msgstr "El índice de la variable %d no pertenece al intervalo válido 1...%zu." #: src/data/sys-file-reader.c:2193 #, fuzzy, c-format #| msgid "Variable index %d refers to long string continuation." msgid "Value label variable index %d refers to long string continuation." msgstr "" "Índice de la variable %d se refiere a una continuación de cadena larga." #: src/data/sys-file-reader.c:2208 #, c-format msgid "" "Variables associated with value label are not all of identical type. " "Variable %s is %s, but variable %s is %s." msgstr "" "Las variables asociadas con etiqueta de valores no son todas del mismo " "tipo. La variable %s es %s, pero la variable %s es %s." #: src/data/sys-file-reader.c:2226 #, c-format msgid "" "Value labels may not be added to long string variables (e.g. %s) using " "records types 3 and 4." msgstr "" "No se pueden añadir etiquetas de valor a las variables de cadena larga (e.g. " "%s) utilizando los tipos de registro 3 y 4." #: src/data/sys-file-reader.c:2255 #, c-format msgid "Duplicate value label for %g on %s." msgstr "Etiqueta de valor duplicad para %g en %s." #: src/data/sys-file-reader.c:2260 src/data/sys-file-reader.c:2600 #, c-format msgid "Duplicate value label for `%.*s' on %s." msgstr "Etiqueta de valor duplicada para `%.*s' en %s." #: src/data/sys-file-reader.c:2283 #, fuzzy, c-format #| msgid "Suppressed %d additional related warnings." msgid "Suppressed %d additional warnings for value labels." msgstr "Suprimidas %d advertencias adicionales." #: src/data/sys-file-reader.c:2297 #, fuzzy, c-format #| msgid "Variable index %d not in valid range 1...%zu." msgid "" "Weight variable index %d not in valid range 1...%zu. Treating file as " "unweighted." msgstr "El índice de la variable %d no pertenece al intervalo válido 1...%zu." #: src/data/sys-file-reader.c:2307 #, fuzzy, c-format #| msgid "Variable index %d refers to long string continuation." msgid "" "Weight variable index %d refers to long string continuation. Treating file " "as unweighted." msgstr "" "Índice de la variable %d se refiere a una continuación de cadena larga." #: src/data/sys-file-reader.c:2315 #, c-format msgid "Ignoring string variable `%s' set as weighting variable." msgstr "" "Se ignorará la variable de texto `%s' establecida como variable de " "ponderación." #: src/data/sys-file-reader.c:2352 #, c-format msgid "Error parsing attribute value %s[%d]." msgstr "Error al analizar el valor del atributo %s[%d]" #: src/data/sys-file-reader.c:2366 #, c-format msgid "Attribute value %s[%d] is not quoted: %s." msgstr "El valor del atributo %s[%d] no está entre comillas: %s." #: src/data/sys-file-reader.c:2379 #, c-format msgid "Duplicate attribute %s." msgstr "Atributo %s duplicado." #: src/data/sys-file-reader.c:2463 #, c-format msgid "Invalid role for variable %s." msgstr "Rol inválido para la variable %s." #: src/data/sys-file-reader.c:2472 #, c-format msgid "%zu other variables had invalid roles." msgstr "otras %zu variables tienen roles no válidos." #: src/data/sys-file-reader.c:2485 #, c-format msgid "Extension record subtype %d ends unexpectedly." msgstr "Un registro de extensión del subtipo %d finaliza inesperadamente." #: src/data/sys-file-reader.c:2531 #, c-format msgid "Ignoring long string value label record for unknown variable %s." msgstr "" "Ignorando el registro de etiquetas de valor tipo cadena larga para la " "variable desconocida %s." #: src/data/sys-file-reader.c:2536 #, c-format msgid "Ignoring long string value label record for numeric variable %s." msgstr "" "Ignorando el registro de etiqueta de valor tipo cadena larga para la " "variable numérica %s." #: src/data/sys-file-reader.c:2543 #, c-format msgid "" "Ignoring long string value label record for variable %s because the record's " "width (%d) does not match the variable's width (%d)." msgstr "" "Ignorando el registro de etiqueta de valor de cadena larga %s ya que el " "ancho del registro (%d) no coincide con el ancho de la variable (%d)." #: src/data/sys-file-reader.c:2573 #, c-format msgid "" "Ignoring long string value label %zu for variable %s, with width %d, that " "has bad value width %zu." msgstr "" "Ignorando etiqueta de valor de cadena larga %zu para la variable %s, de " "ancho %d, que tiene un ancho de valor incorrecto %zu." #: src/data/sys-file-reader.c:2646 #, c-format msgid "" "Long string missing values record says variable %s has %d missing values, " "but only 1 to 3 missing values are allowed." msgstr "" "Registro de valores perdidos tipo cadena larga indica que la variable %s " "tiene %d valores perdidos, pero sólo se admiten de 1 a 3 ." #: src/data/sys-file-reader.c:2656 #, c-format msgid "Ignoring long string missing value record for unknown variable %s." msgstr "" "Ignorando el registro de valor de cadena larga para la variable desconocida " "%s." #: src/data/sys-file-reader.c:2661 #, c-format msgid "Ignoring long string missing value record for numeric variable %s." msgstr "" "Ignorando el registro de valor de cadena larga para la variable numérica %s." #: src/data/sys-file-reader.c:2686 #, c-format msgid "" "Ignoring long string missing value %zu for variable %s, with width %d, that " "has bad value width %zu." msgstr "" "Ignorando el valor perdido de cadena larga %zu para la variable %s, de ancho " "%d, que tiene un ancho de valor incorrecto %zu." #: src/data/sys-file-reader.c:2740 msgid "File ends in partial string value." msgstr "El archivo acaba en un valor de cadena parcial." #: src/data/sys-file-reader.c:2879 msgid "" "Possible compressed data corruption: compressed spaces appear in numeric " "field." msgstr "" "Posible corrupción de datos comprimidos: aparecen espacios comprimidos en un " "campo numérico." #: src/data/sys-file-reader.c:3030 #, c-format msgid "Suppressed %d additional related warnings." msgstr "Suprimidas %d advertencias adicionales." #: src/data/sys-file-reader.c:3076 src/data/sys-file-reader.c:3093 #, c-format msgid "Dictionary record refers to unknown variable %s." msgstr "El registro diccionario se refiere a una variable desconocida %s." #: src/data/sys-file-reader.c:3159 #, c-format msgid "Expecting digit at offset %zu in MRSETS record." msgstr "Se espera un dígito en la posición %zu de un registro MRSETS." #: src/data/sys-file-reader.c:3167 #, c-format msgid "Expecting space at offset %zu in MRSETS record." msgstr "Se espera un espacio en la posición %zu de un registro MRSETS." #: src/data/sys-file-reader.c:3175 #, c-format msgid "%zu-byte string starting at offset %zu exceeds record length %zu." msgstr "" "Texto de %zu-bytes que comienza en la posición %zu excede la longitud del " "registro %zu. " #: src/data/sys-file-reader.c:3185 #, c-format msgid "Expecting space at offset %zu following %zu-byte string." msgstr "Se espera un espacio en la posición %zu tras un texto de %zu-bytes." #: src/data/sys-file-reader.c:3476 #, c-format msgid "Wrong ZLIB data header offset %#llx (expected %#llx)." msgstr "" "Posición incorrecta de cabecera de datos ZLIB %#llx (se esperaba %#llx)." #: src/data/sys-file-reader.c:3484 #, c-format msgid "Impossible ZLIB trailer offset 0x%llx." msgstr "Posición imposible del ZLIB trailer 0x%llx." #: src/data/sys-file-reader.c:3491 #, c-format msgid "Invalid ZLIB trailer length %lld." msgstr "Ancho no válido para ZLIB trailer %lld." #: src/data/sys-file-reader.c:3555 #, c-format msgid "End of ZLIB trailer (0x%llx) is not file size (0x%llx)." msgstr "Final del ZLIB trailer (0x%llx) no es el tamaño de archivo (0x%llx)." #: src/data/sys-file-reader.c:3565 #, c-format msgid "ZLIB trailer bias (%lld) differs from file header bias (%.2f)." msgstr "" "Sesgo de ZLIB trailer (%lld) difiere respecto al sesgo de cabecera de " "archivo (%.2f)." #: src/data/sys-file-reader.c:3575 #, c-format msgid "ZLIB trailer \"zero\" field has nonzero value %lld." msgstr "El campo \"zero\" del ZLIB trailer tiene valor distinto de cero %lld." #: src/data/sys-file-reader.c:3581 #, c-format msgid "ZLIB trailer specifies unexpected %u-byte block size." msgstr "El ZLIB trailer especifica un tamaño de bloque no esperado %u-byte." #: src/data/sys-file-reader.c:3589 #, c-format msgid "%lld-byte ZLIB trailer specifies %u data blocks (expected %lld)." msgstr "" "%lld-byte ZLIB trailer especifica %u bloques de datos (se esperaban %lld)." #: src/data/sys-file-reader.c:3614 #, c-format msgid "" "ZLIB block descriptor %u reported uncompressed data offset %#llx, when %#llx " "was expected." msgstr "" "El descriptor de bloque ZLIB %u indica una posición de datos no comprimidos " "%#llx, pero se esperaba %#llx." #: src/data/sys-file-reader.c:3623 #, c-format msgid "" "ZLIB block descriptor %u reported compressed data offset %#llx, when %#llx " "was expected." msgstr "" "El descriptor de bloque ZLIB %u indica una posición de datos comprimidos " "%#llx, pero se esperaba %#llx." #: src/data/sys-file-reader.c:3633 #, c-format msgid "" "ZLIB block descriptor %u reported block size %#x, when %#x was expected." msgstr "" "El descriptor de bloque ZLIB %u indica un tamaño de bloque %#x, pero se " "esperaba %#x." #: src/data/sys-file-reader.c:3641 #, c-format msgid "" "ZLIB block descriptor %u reported block size %#x, when at most %#x was " "expected." msgstr "" "El descriptor de bloque ZLIB %u indica un tamaño de bloque %#x, pero se " "esperaba como máximo %#x." #: src/data/sys-file-reader.c:3653 #, c-format msgid "" "ZLIB block descriptor %u reports compressed size %u and uncompressed size %u." msgstr "" "El descriptor de bloque ZLIB %u indica un tamaño comprimido %u y un tamaño " "no comprimido %u." #: src/data/sys-file-reader.c:3665 #, c-format msgid "" "ZLIB trailer is at offset %#llx but %#llx would be expected from block " "descriptors." msgstr "" "El ZLIB trailer está en la posición %#llx pero %#llx está reservada para " "descriptores de bloque." #: src/data/sys-file-reader.c:3684 #, c-format msgid "ZLIB initialization failed (%s)." msgstr "Falló la inicialización ZLIB (%s)." #: src/data/sys-file-reader.c:3699 #, c-format msgid "Inconsistency at end of ZLIB stream (%s)." msgstr "Inconsistencia al final del flujo ZLIB (%s)." #: src/data/sys-file-reader.c:3758 #, c-format msgid "ZLIB stream inconsistency (%s)." msgstr "Flujo ZLIB inconsistente (%s)." #: src/data/sys-file-reader.c:3782 msgid "Unexpected end of ZLIB compressed data." msgstr "Final inesperado de datos comprimidos ZLIB." #: src/data/sys-file-reader.c:3820 msgid "SPSS System File" msgstr "Archivo de Sistema SPSS" #: src/data/sys-file-writer.c:210 #, c-format msgid "Unknown system file version %d. Treating as version %d." msgstr "" "Versión de archivo de sistema %d desconocida.Se tratará como versión %d." #: src/data/sys-file-writer.c:256 #, c-format msgid "Error opening `%s' for writing as a system file: %s." msgstr "Error al abrir `%s' para grabar como archivo de sistema: %s." #: src/data/sys-file-writer.c:1271 #, c-format msgid "An I/O error occurred writing system file `%s'." msgstr "Error de E/S al guardar el archivo de sistema `%s'." #: src/data/sys-file-writer.c:1378 #, c-format msgid "Failed to initialize ZLIB for compression (%s)." msgstr "Fallo al inicializar ZLIB para compresión (%s)." #: src/data/sys-file-writer.c:1407 #, c-format msgid "Failed to complete ZLIB stream compression (%s)." msgstr "Fallo al completar la compresión de flujo ZLIB (%s)." #: src/data/sys-file-writer.c:1449 #, c-format msgid "ZLIB stream compression failed (%s)." msgstr "Falló la compresión del flujo ZLIB (%s)" #: src/data/sys-file-writer.c:1491 #, c-format msgid "%s: Seek failed (%s)." msgstr "%s: búsqueda fallida (%s)." #: src/data/variable.c:58 msgid "Left" msgstr "Izquierda" #: src/data/variable.c:59 msgid "Right" msgstr "Derecha" #: src/data/variable.c:60 msgid "Center" msgstr "Centro" #: src/data/variable.c:66 msgid "Nominal" msgstr "Nominal" #: src/data/variable.c:67 msgid "Ordinal" msgstr "Ordinal" #: src/data/variable.c:68 src/language/stats/ks-one-sample.c:300 msgid "Scale" msgstr "Escala" #: src/data/variable.c:74 msgid "Input" msgstr "Entrada" #. TRANSLATORS: This will be part of a filename. Please avoid whitespace. #: src/data/variable.c:75 src/output/spv/spv-writer.c:213 #: src/ui/gui/psppire-output-window.c:547 msgid "Output" msgstr "Objetivo" #: src/data/variable.c:76 msgid "Both" msgstr "Ambos" #: src/data/variable.c:77 src/language/dictionary/sys-file-info.c:237 #: src/ui/gui/psppire-dialog-action-crosstabs.c:86 #: src/ui/gui/psppire-dialog-action-crosstabs.c:98 #: src/ui/gui/psppire-dialog-action-crosstabs.c:133 #: src/ui/gui/psppire-dialog-action-crosstabs.c:141 #: src/ui/gui/psppire-variable-sheet.c:408 src/ui/gui/var-display.c:34 msgid "None" msgstr "Ninguno" #: src/data/variable.c:78 msgid "Partition" msgstr "Partición" #: src/data/variable.c:79 src/ui/gui/reliability.ui:37 msgid "Split" msgstr "División" #: src/data/variable.c:729 #, c-format msgid "%s (%s)" msgstr "%s (%s)" #: src/data/variable.c:1339 msgid "" "At least one case in the data file had a weight value that was user-missing, " "system-missing, zero, or negative. These case(s) were ignored." msgstr "" "Al menos un caso del archivo de datos tenía un valor de ponderación perdido " "de usuario, de sistema, cero o negativo. Estos caso(s) fueron ignorado(s)." #: src/language/command.c:207 src/language/stats/graph.c:749 #: src/language/stats/graph.c:755 src/language/stats/graph.c:789 #: src/language/stats/graph.c:794 src/language/stats/graph.c:799 #: src/language/stats/graph.c:852 src/language/stats/graph.c:857 #: src/language/stats/graph.c:862 src/language/stats/graph.c:867 #: src/language/stats/graph.c:872 src/language/stats/graph.c:877 #: src/language/stats/graph.c:882 src/language/utilities/set.q:236 #, c-format msgid "%s is not yet implemented." msgstr "%s aún no está implementado." #: src/language/command.c:212 #, c-format msgid "%s may be used only in testing mode." msgstr "%s sólo puede ser utilizado en el modo de prueba." #: src/language/command.c:217 #, c-format msgid "%s may be used only in enhanced syntax mode." msgstr "%s sólo puede ser utilizado en modo de sintaxis ampliado." #: src/language/command.c:345 msgid "expecting command name" msgstr "esperando nombre de comando" #: src/language/command.c:347 #, c-format msgid "Unknown command `%s'." msgstr "Comando `%s' desconocido." #: src/language/command.c:380 #, c-format msgid "%s is allowed only before the active dataset has been defined." msgstr "" "%s sólo se permite antes de que el archivo de datos activo se haya definido." #: src/language/command.c:384 #, c-format msgid "%s is allowed only after the active dataset has been defined." msgstr "" "%s sólo se permite después que el archivo de datos activo se haya definido." #: src/language/command.c:388 src/language/command.c:392 #, c-format msgid "%s is allowed only inside %s." msgstr "%s está permitido únicamente dentro de %s." #: src/language/command.c:399 src/language/command.c:403 #, c-format msgid "" "%s is allowed only before the active dataset has been defined or inside %s." msgstr "" "%s sólo se permite antes que el archivo de datos activo se haya definido o " "dentro de %s." #: src/language/command.c:407 src/language/command.c:411 #, c-format msgid "" "%s is allowed only after the active dataset has been defined or inside %s." msgstr "" "%s sólo se permite después que el archivo de datos activo se ha definido o " "dentro de %s." #: src/language/command.c:415 #, c-format msgid "%s is allowed only inside %s or inside %s." msgstr "%s sólo se permite dentro de %s o dentro de %s." #: src/language/command.c:421 #, c-format msgid "" "%s is allowed only after the active dataset has been defined, inside INPUT " "PROGRAM, or inside FILE TYPE." msgstr "" "%s sólo se permite después que el archivo de datos activo se ha definido, " "dentro de INPUT PROGRAM, o de FILE TYPE." #: src/language/command.c:426 #, c-format msgid "" "%s is allowed only before the active dataset has been defined, inside INPUT " "PROGRAM, or inside FILE TYPE." msgstr "" "%s sólo se permite antes que el archivo de datos activo se haya definido, " "dentro de INPUT PROGRAM, o de FILE TYPE." #: src/language/command.c:444 src/language/command.c:447 #, c-format msgid "%s is not allowed inside %s." msgstr "%s no está permitido dentro de %s." #: src/language/command.c:529 src/language/utilities/host.c:272 #: src/language/utilities/permissions.c:105 #, c-format msgid "This command not allowed when the %s option is set." msgstr "Esta orden no está permitida cuando la opción %s está activa." #: src/language/command.c:545 #, c-format msgid "Error removing `%s': %s." msgstr "Error de eliminación de '%s' : %s." #: src/language/lexer/lexer.c:296 #, c-format msgid "expecting %s" msgstr "esperando %s" #: src/language/lexer/lexer.c:300 #, c-format msgid "expecting %s or %s" msgstr "esperando %s o %s" #: src/language/lexer/lexer.c:304 #, c-format msgid "expecting %s, %s, or %s" msgstr "se espera %s, %s o %s" #: src/language/lexer/lexer.c:309 #, c-format msgid "expecting %s, %s, %s, or %s" msgstr "se espera %s, %s, ,%s, o %s" #: src/language/lexer/lexer.c:314 #, c-format msgid "expecting %s, %s, %s, %s, or %s" msgstr "se espera %s, %s, %s, %s, o %s" #: src/language/lexer/lexer.c:319 #, c-format msgid "expecting %s, %s, %s, %s, %s, or %s" msgstr "se espera %s, %s, %s, %s, %s, o %s" #: src/language/lexer/lexer.c:325 #, c-format msgid "expecting %s, %s, %s, %s, %s, %s, or %s" msgstr "se espera %s, %s, %s, %s, %s, %s, o %s" #: src/language/lexer/lexer.c:331 #, c-format msgid "expecting %s, %s, %s, %s, %s, %s, %s, or %s" msgstr "se espera %s, %s, %s, %s, %s, %s, %s, o %s" #: src/language/lexer/lexer.c:351 #, c-format msgid "Subcommand %s may only be specified once." msgstr "Subcomando %s sólo se puede especificar una vez." #: src/language/lexer/lexer.c:363 #, c-format msgid "Required subcommand %s was not specified." msgstr "El Subcomando %s requerido no fue especificado." #: src/language/lexer/lexer.c:371 #, c-format msgid "%s may only be specified once within subcommand %s" msgstr "%s sólo se puede especificar una vez dentro del subcomando %s" #: src/language/lexer/lexer.c:380 #, c-format msgid "Required %s specification missing from %s subcommand" msgstr "Falta la especificación %s requerida para el subcomando %s" #: src/language/lexer/lexer.c:399 msgid "Syntax error at end of input" msgstr "Error de sintaxis al final de la entrada" #: src/language/lexer/lexer.c:420 src/language/xforms/select-if.c:60 #: src/language/stats/autorecode.c:206 src/language/stats/npar.c:503 #: src/language/data-io/print-space.c:83 msgid "expecting end of command" msgstr "se espera el final de la orden" #: src/language/lexer/lexer.c:631 msgid "expecting string" msgstr "esperando cadena" #: src/language/lexer/lexer.c:660 msgid "expecting integer" msgstr "esperando entero" #: src/language/lexer/lexer.c:673 msgid "expecting number" msgstr "esperando número" #: src/language/lexer/lexer.c:685 msgid "expecting identifier" msgstr "esperando identificador" #: src/language/lexer/lexer.c:1272 msgid "Syntax error at end of command" msgstr "Error de sintaxis al final del comando" #: src/language/lexer/lexer.c:1281 #, c-format msgid "Syntax error at `%s'" msgstr "Error de sintaxis en `%s'." #: src/language/lexer/lexer.c:1284 msgid "Syntax error" msgstr "Error de sintaxis" #: src/language/lexer/lexer.c:1470 #, c-format msgid "String of hex digits has %d characters, which is not a multiple of 2" msgstr "La cadena hexadecimal tiene %d caracteres, que no es un múltiplo de 2." #: src/language/lexer/lexer.c:1477 #, c-format msgid "`%c' is not a valid hex digit" msgstr "`%c' no es un dígito hexadecimal válido." #: src/language/lexer/lexer.c:1482 #, c-format msgid "" "Unicode string contains %d bytes, which is not in the valid range of 1 to 8 " "bytes" msgstr "" "Cadena Unicode contiene %d bytes, lo que está fuera del rango válido entre 1 " "y 8 bytes" #: src/language/lexer/lexer.c:1488 #, c-format msgid "U+%04X is not a valid Unicode code point" msgstr "U+%04X no es un punto de código Unicode válido" #: src/language/lexer/lexer.c:1493 msgid "Unterminated string constant" msgstr "Constante de cadena inacabada" #: src/language/lexer/lexer.c:1497 #, c-format msgid "Missing exponent following `%s'" msgstr "Falta el exponente a continuación de `%s'" #: src/language/lexer/lexer.c:1502 msgid "Unexpected `.' in middle of command" msgstr "`.' inesperado en mitad de un comando" #: src/language/lexer/lexer.c:1508 #, c-format msgid "Bad character %s in input" msgstr "Carácter erróneo `%s' en la entrada" #: src/language/lexer/lexer.c:1603 #, c-format msgid "Opening `%s': %s." msgstr "Abriendo `%s': %s." #: src/language/lexer/lexer.c:1647 #, c-format msgid "Error closing `%s': %s." msgstr "Error cerrando '%s' : %s." #: src/language/lexer/subcommand-list.c:118 #, c-format msgid "No more than %d %s subcommands allowed." msgstr "No se permite más de %d %s subcomandos." #: src/language/lexer/format-parser.c:77 msgid "expecting valid format specifier" msgstr "esperando especificador de formato válido" #: src/language/lexer/format-parser.c:116 #: src/language/lexer/format-parser.c:143 src/language/utilities/output.c:108 #: src/language/data-io/data-list.c:453 src/language/data-io/get-data.c:638 #: src/language/data-io/placement-parser.c:236 #, c-format msgid "Unknown format type `%s'." msgstr "Tipo de formato `%s' desconocido." #: src/language/lexer/format-parser.c:122 #, c-format msgid "Format specifier `%s' lacks required width." msgstr "El especificador de formato `%s' carece de la longitud adecuada." #: src/language/lexer/format-parser.c:138 msgid "expecting format type" msgstr "esperando el tipo de formato" #: src/language/lexer/value-parser.c:66 #, c-format msgid "" "The high end of the range (%.*g) is below the low end (%.*g). The range " "will be treated as if reversed." msgstr "" "El límite superior del intervalo (%.*g) está por debajo del límite inferior " "(%.*g). El intervalo se tratará como invertido." #: src/language/lexer/value-parser.c:74 #, c-format msgid "Ends of range are equal (%.*g)." msgstr "Los límites del intervalo son iguales (%.*g)." #: src/language/lexer/value-parser.c:82 #, c-format msgid "%s or %s must be part of a range." msgstr "%s o %s tienen que ser parte del intervalo." #: src/language/lexer/value-parser.c:112 msgid "System-missing value is not valid here." msgstr "Valor perdido del sistema no es válido aquí." #: src/language/lexer/variable-parser.c:86 utilities/pspp-convert.c:83 msgid "expecting variable name" msgstr "esperando nombre de la variable" #: src/language/lexer/variable-parser.c:96 #, c-format msgid "%s is not a variable name." msgstr "%s no es un nombre de variable." #: src/language/lexer/variable-parser.c:206 #, c-format msgid "" "%s is not a numeric variable. It will not be included in the variable list." msgstr "" "%s no es una variable numérica. No será incluida en la lista de variables." #: src/language/lexer/variable-parser.c:209 #, c-format msgid "" "%s is not a string variable. It will not be included in the variable list." msgstr "" "%s no es una variable de cadena. No será incluida en la lista de variables." #: src/language/lexer/variable-parser.c:213 #, c-format msgid "Scratch variables (such as %s) are not allowed here." msgstr "Las variables de trabajo (como %s) no están permitidas aquí." #: src/language/lexer/variable-parser.c:217 #, c-format msgid "" "%s and %s are not the same type. All variables in this variable list must " "be of the same type. %s will be omitted from the list." msgstr "" "%s y %s no son del mismo tipo. Todas las variables de esta lista tienen que " "ser del mismo tipo. %s será omitida de la lista." #: src/language/lexer/variable-parser.c:223 #, c-format msgid "" "%s and %s are string variables with different widths. All variables in this " "variable list must have the same width. %s will be omitted from the list." msgstr "" "%s y %s son variables de cadena con tamaños diferentes. Todas las variables " "de esta lista deben tener el mismo tamaño. %s será omitida de la lista." #: src/language/lexer/variable-parser.c:228 #: src/language/lexer/variable-parser.c:447 #, c-format msgid "Variable %s appears twice in variable list." msgstr "La variable %s aparece dos veces en la lista de variables." #: src/language/lexer/variable-parser.c:341 #, c-format msgid "%s TO %s is not valid syntax since %s precedes %s in the dictionary." msgstr "" "%s TO %s no es una sintaxis válida debido a que %s precede %s en el " "diccionario." #: src/language/lexer/variable-parser.c:349 #, c-format msgid "" "When using the TO keyword to specify several variables, both variables must " "be from the same variable dictionaries, of either ordinary, scratch, or " "system variables. %s is a %s variable, whereas %s is %s." msgstr "" "Cuando se utiliza la palabra clave TO para especificar diversas variables, " "ambas tienen que ser del mismo diccionario de variables, ya sean ordinales, " "scratch, o variables de sistema. %s es una variable %s, debido a que %s es " "%s." #: src/language/lexer/variable-parser.c:424 #, c-format msgid "`%s' cannot be used with TO because it does not end in a digit." msgstr "`%s' no puede ser utilizado con TO por que no acaba con un dígito." #: src/language/lexer/variable-parser.c:432 #, c-format msgid "Numeric suffix on `%s' is larger than supported with TO." msgstr "Sufijo numérico en `%s' es más largo de lo soportado con TO." #: src/language/lexer/variable-parser.c:505 msgid "Scratch variables not allowed here." msgstr "Las variables de trabajo no están permitidas aquí." #: src/language/lexer/variable-parser.c:529 msgid "Prefixes don't match in use of TO convention." msgstr "Los prefijos no coinciden en el uso de la convención TO." #: src/language/lexer/variable-parser.c:534 msgid "Bad bounds in use of TO convention." msgstr "Límites incorrectos en el uso de la convención TO." #: src/language/xforms/compute.c:150 src/language/xforms/compute.c:205 #, c-format msgid "" "When executing COMPUTE: SYSMIS is not a valid value as an index into vector " "%s." msgstr "" "Cuando se ejecuta COMPUTE: SYSMIS no es un valor válido como índice en el " "vector %s." #: src/language/xforms/compute.c:154 src/language/xforms/compute.c:212 #, c-format msgid "" "When executing COMPUTE: %.*g is not a valid value as an index into vector %s." msgstr "" "Cuando se ejecuta COMPUTE: %.*g no es un valor válido como índice en el " "vector %s." #: src/language/xforms/compute.c:356 #, c-format msgid "There is no vector named %s." msgstr "No hay ningún vector llamado %s." #: src/language/xforms/count.c:125 msgid "Destination cannot be a string variable." msgstr "El destino no puede ser una variable de cadena." #: src/language/xforms/sample.c:76 msgid "The sampling factor must be between 0 and 1 exclusive." msgstr "El factor de muestreo tiene que estar exclusivamente entre 0 y 1." #: src/language/xforms/sample.c:96 #, c-format msgid "Cannot sample %d observations from a population of %d." msgstr "" "No se puede hacer una muestra de %d observaciones de una población de %d." #: src/language/xforms/recode.c:261 msgid "" "Inconsistent target variable types. Target variables must be all numeric or " "all string." msgstr "" "Tipo inconsistente de variables objetivo. Las variables objetivo tienen que " "ser todas, o bien de cadena o bien numéricas." #: src/language/xforms/recode.c:282 msgid "CONVERT requires string input values and numeric output values." msgstr "" "CONVERT requiere valores de entrada de cadena y valores de salida numéricos." #: src/language/xforms/recode.c:339 #, c-format msgid "%s is not allowed with string variables." msgstr "%s no está permitido con variables de cadena." #: src/language/xforms/recode.c:422 msgid "expecting output value" msgstr "esperando el valor de salida" #: src/language/xforms/recode.c:479 #, c-format msgid "" "%zu variable(s) cannot be recoded into %zu variable(s). Specify the same " "number of variables as source and target variables." msgstr "" "%zu variable(s) no pueden ser recodificadas en %zu variable(s). Especifique " "el mismo número de variables como origen y destino." #: src/language/xforms/recode.c:494 #, c-format msgid "" "There is no variable named %s. (All string variables specified on INTO must " "already exist. Use the STRING command to create a string variable.)" msgstr "" "No existe ninguna variable llamada %s. (Todas las variables de cadena " "especificadas en INTO tienen que existir. Utilice el comando STRING para " "crear una variable de cadena.)" #: src/language/xforms/recode.c:510 #, c-format msgid "INTO is required with %s input values and %s output values." msgstr "INTO es necesario con %s valores de entrada y %s valores de salida." #: src/language/xforms/recode.c:523 #, c-format msgid "Type mismatch. Cannot store %s data in %s variable %s." msgstr "Desajuste de tipo. No se puede almacenar %s datos en %s variable %s." #: src/language/xforms/recode.c:566 #, c-format msgid "" "Cannot recode because the variable %s would require a width of %d bytes or " "greater, but it has a width of only %d bytes." msgstr "" "Imposible recodificar porque la variable %s requiere una anchura de %d bytes " "o mayor, pero tiene sólo %d bytes." #: src/language/xforms/select-if.c:100 msgid "Syntax error expecting OFF or BY. Turning off case filtering." msgstr "" "Error de sintaxis esperando OFF o BY. Desactivando el filtraje de casos." #: src/language/xforms/select-if.c:115 msgid "The filter variable must be numeric." msgstr "La variable de filtro tiene que ser numérica." #: src/language/xforms/select-if.c:121 msgid "The filter variable may not be scratch." msgstr "La variable de filtro no puede ser cero." #: src/language/control/control-stack.c:49 #, c-format msgid "%s without %s." msgstr "%s sin %s." #: src/language/control/control-stack.c:77 #, c-format msgid "This command must appear inside %s...%s, without intermediate %s...%s." msgstr "" "Esta orden tiene que aparecer dentro de %s...%s, sin intermediarios %s...%s." #: src/language/control/control-stack.c:94 #, c-format msgid "This command cannot appear outside %s...%s." msgstr "Este comando no puede aparecer fuera de %s...%s." #: src/language/control/do-if.c:180 #, c-format msgid "This command may not follow %s in %s ... %s." msgstr "Este comando no puede seguir %s en %s ...%s." #: src/language/control/loop.c:211 msgid "Only one index clause may be specified." msgstr "Únicamente puede ser especificada una cláusula del índice." #: src/language/control/repeat.c:120 #, c-format msgid "Dummy variable name `%s' hides dictionary variable `%s'." msgstr "" "El nombre de la variable ficticia `%s' oculta la variable de diccionario `" "%s'." #: src/language/control/repeat.c:126 #, c-format msgid "Dummy variable name `%s' is given twice." msgstr "El nombre de la variable ficticia `%s' se da dos veces." #: src/language/control/repeat.c:170 #, c-format msgid "" "Dummy variable `%s' had %zu substitutions, so `%s' must also, but %zu were " "specified." msgstr "" "La variable ficticia `%s' tiene %zu substituciones, así que `%s' también " "tendría que tenerlas, pero se especificaron %zu." #: src/language/control/repeat.c:379 msgid "Ranges may only have integer bounds." msgstr "Los intervalos únicamente pueden tener límites enteros." #: src/language/control/repeat.c:393 #, c-format msgid "%ld TO %ld is an invalid range." msgstr "%ld TO %ld es un intervalo inválido." #: src/language/control/repeat.c:443 #, c-format msgid "No matching %s." msgstr "No coincide %s." #: src/language/control/temporary.c:44 msgid "" "This command may only appear once between procedures and procedure-like " "commands." msgstr "" "Esta orden únicamente puede aparecer una vez entre las órdenes de " "procedimientos y casi-procedimientos." #: src/language/dictionary/attributes.c:104 msgid "Attribute array index must be between 1 and 65535." msgstr "El índice de la tabla de atributos tiene que estar entre 1 y 65535." #: src/language/dictionary/apply-dictionary.c:74 #, c-format msgid "Variable %s is %s in target file, but %s in source file." msgstr "" "La variable %s es %s en el archivo de destino, pero %s en el archivo de " "origen." #: src/language/dictionary/apply-dictionary.c:110 msgid "No matching variables found between the source and target files." msgstr "" "No se han encontrado coincidencias de variables entre los archivos de origen " "y de destino." #: src/language/dictionary/delete-variables.c:40 #: src/language/dictionary/modify-variables.c:79 #: src/language/dictionary/rename-variables.c:51 #, c-format msgid "" "%s may not be used after %s. Temporary transformations will be made " "permanent." msgstr "" "%s no puede ser utilizado después de %s. Las transformaciones temporales " "serán permanentes." #: src/language/dictionary/delete-variables.c:48 #: src/language/dictionary/modify-variables.c:312 #, c-format msgid "" "%s may not be used to delete all variables from the active dataset " "dictionary. Use %s instead." msgstr "" "%s no puede ser utilizado para borrar todas las variables del archivo de " "datos de diccionario activo. Utilizar %s en su lugar." #: src/language/dictionary/missing-values.c:70 #, c-format msgid "" "Cannot mix numeric variables (e.g. %s) and string variables (e.g. %s) within " "a single list." msgstr "" "No se pueden mezclar las variables numéricas (e.g. %s) y las variables de " "cadena (e.g. %s) dentro de una lista única." #: src/language/dictionary/missing-values.c:91 msgid "" "Too many numeric missing values. At most three individual values or one " "value and one range are allowed." msgstr "" "Demasiados valores perdidos numéricos. Se permite como máximo tres valores " "individuales y un rango." #: src/language/dictionary/missing-values.c:126 #, c-format msgid "Truncating missing value to maximum acceptable length (%d bytes)." msgstr "Truncando el valor perdido a la longitud máxima aceptable (%d bytes)." #: src/language/dictionary/missing-values.c:137 msgid "" "Too many string missing values. At most three individual values are allowed." msgstr "" "Demasiados valores perdidos alfanuméricos. Se permite como máximo tres " "valores individuales." #: src/language/dictionary/missing-values.c:154 #, c-format msgid "Missing values provided are too long to assign to variable of width %d." msgstr "" "Los valores perdidos proporcionados son demasiado largos para asignar a una " "variable de ancho %d." #: src/language/dictionary/modify-variables.c:145 msgid "Cannot specify ALL after specifying a set of variables." msgstr "" "No se puede especificar ALL después de la especificación de un conjunto de " "variables." #: src/language/dictionary/modify-variables.c:221 #: src/language/dictionary/rename-variables.c:76 #, c-format msgid "" "Differing number of variables in old name list (%zu) and in new name list " "(%zu)." msgstr "" "Diferente número de variables en la lista de nombres antigua (%zu) y en la " "lista de nombres nueva (%zu)." #: src/language/dictionary/modify-variables.c:244 #: src/language/dictionary/modify-variables.c:294 #, c-format msgid "" "%s subcommand may be given at most once. It may not be given in conjunction " "with the %s subcommand." msgstr "" "El subcomando %s puede ser dado tan sólo una vez. No puede ser dado junto " "con el subcomando %s." #: src/language/dictionary/modify-variables.c:331 #, c-format msgid "Unrecognized subcommand name `%s'." msgstr "Nombre del subcomando no reconocido '%s'." #: src/language/dictionary/modify-variables.c:334 msgid "Subcommand name expected." msgstr "Nombre del subcomando esperado." #: src/language/dictionary/mrsets.c:117 #, c-format msgid "" "VARIABLES specified only variable %s on %s, but at least two variables are " "required." msgstr "" "VARIABLES especifica sólo la variable %s en %s, pero se requieren al menos " "dos variables." #: src/language/dictionary/mrsets.c:150 msgid "Numeric VALUE must be an integer." msgstr "VALUE numérico debe ser un entero." #: src/language/dictionary/mrsets.c:230 src/language/dictionary/mrsets.c:268 #, c-format msgid "" "MDGROUP subcommand for group %s specifies a string VALUE, but the variables " "specified for this group are numeric." msgstr "" "El subcomando MDGROUPS para el grupo %s especifica un VALUE textual, pero " "las variables especificadas por este grupo son numéricas." #: src/language/dictionary/mrsets.c:254 #, c-format msgid "" "VALUE string on MDGROUP subcommand for group %s is %d bytes long, but it " "must be no longer than the narrowest variable in the group, which is %s with " "a width of %d bytes." msgstr "" "El VALUE textual del subcomando MDGROUP para el grupo %s tiene %d bytes, " "pero no puede ser más largo que la variable más corta del grupo, que es %s " "con longitud %d bytes." #: src/language/dictionary/mrsets.c:280 #, c-format msgid "" "MDGROUP subcommand for group %s specifies LABELSOURCE=VARLABEL but not " "CATEGORYLABELS=COUNTEDVALUES. Ignoring LABELSOURCE." msgstr "" "El subcomando MDGROUP para el grupo %s especifica LABELSOURCE=VARLABEL pero " "no CATEGORYLABELS=COUNTEDVALUES. Se ignorará LABELSOURCE." #: src/language/dictionary/mrsets.c:286 #, c-format msgid "" "MDGROUP subcommand for group %s specifies both LABEL and LABELSOURCE, but " "only one of these subcommands may be used at a time. Ignoring LABELSOURCE." msgstr "" "El subcomando MDGROUP para el grupo %s especifica LABEL i LABELSOURCE, pero " "sólo uno de estos subcomandos puede ser utilizado a la vez. Se ignorará " "LABELSOURCE." #: src/language/dictionary/mrsets.c:326 #, c-format msgid "" "Variables %s and %s specified as part of multiple dichotomy group %s have " "the same variable label. Categories represented by these variables will not " "be distinguishable in output." msgstr "" "Las variables %s y %s especificadas como parte del grupo dicotómico múltiple " "%s tienen la misma etiqueta de variable. Las categorías representadas por " "estas variables no serán distinguibles en los resultados." #: src/language/dictionary/mrsets.c:356 #, c-format msgid "" "Variable %s specified as part of multiple dichotomy group %s (which has " "CATEGORYLABELS=COUNTEDVALUES) has no value label for its counted value. " "This category will not be distinguishable in output." msgstr "" "La variable %s especificada como parte del grupo dicotómico múltiple %s (que " "tiene CATEGORYLABELS=COUNTEDVALUES) no tiene etiqueta de valor para su valor " "de recuento. Esta categoría no será distinguible en los resultados." #: src/language/dictionary/mrsets.c:369 #, c-format msgid "" "Variables %s and %s specified as part of multiple dichotomy group %s (which " "has CATEGORYLABELS=COUNTEDVALUES) have the same value label for the group's " "counted value. These categories will not be distinguishable in output." msgstr "" "Las variables %s y %s especificadas como parte del grupo dicotómico múltiple " "%s (que tiene CATEGORYLABELS=COUNTEDVALUES) tienen la misma etiqueta de " "valor para el valor de recuento de los grupos. Estas categorías no será " "distinguibles en los resultados." #: src/language/dictionary/mrsets.c:426 #, c-format msgid "" "Variables specified on MCGROUP should have the same categories, but %s and " "%s (and possibly others) in multiple category group %s have different value " "labels for value %s." msgstr "" "La variables especificadas en MDGROUP deben tener las mismas categorías, " "pero %s y %s (y posiblemente otras) del grupo de categorías múltiples %s " "tiene diferentes etiquetas de valores para el valor %s." #: src/language/dictionary/mrsets.c:484 #, c-format msgid "No multiple response set named %s." msgstr "Ningún conjunto multi-respuesta llamado %s." #: src/language/dictionary/mrsets.c:533 msgid "" "The active dataset dictionary does not contain any multiple response sets." msgstr "" "El diccionario del fichero de datos activo no contiene ningún conjunto de " "multi-respuesta. " #: src/language/dictionary/mrsets.c:540 msgid "Multiple Response Sets" msgstr "Conjuntos Multi-Respuesta" #: src/language/dictionary/mrsets.c:543 #: src/language/dictionary/sys-file-info.c:446 #: src/language/dictionary/sys-file-info.c:733 #: src/language/stats/autorecode.c:375 src/language/data-io/data-parser.c:679 #: src/language/data-io/data-parser.c:725 src/language/data-io/print.c:434 #, fuzzy #| msgid "Attribute" msgid "Attributes" msgstr "Atributo" #: src/language/dictionary/mrsets.c:544 #: src/language/dictionary/sys-file-info.c:191 #: src/language/dictionary/sys-file-info.c:301 #: src/language/dictionary/sys-file-info.c:302 #: src/language/dictionary/sys-file-info.c:455 #: src/language/dictionary/sys-file-info.c:570 #: src/ui/gui/psppire-var-sheet-header.c:67 src/ui/gui/compute.ui:157 msgid "Label" msgstr "Etiqueta" #: src/language/dictionary/mrsets.c:544 #: src/language/dictionary/sys-file-info.c:241 #, fuzzy #| msgid "Encoding:" msgid "Encoding" msgstr "Codificación:" #: src/language/dictionary/mrsets.c:544 #, fuzzy #| msgid "Counted value" msgid "Counted Value" msgstr "Valor de recuento" #: src/language/dictionary/mrsets.c:544 #, fuzzy #| msgid "Cl_ear Variables" msgid "Member Variables" msgstr "_Eliminar Variables" #: src/language/dictionary/mrsets.c:547 #: src/language/dictionary/sys-file-info.c:470 #: src/ui/gui/psppire-var-sheet-header.c:55 msgid "Name" msgstr "Nombre" #: src/language/dictionary/mrsets.c:564 msgid "Dichotomies" msgstr "" #: src/language/dictionary/mrsets.c:565 src/language/stats/logistic.c:1391 #, fuzzy #| msgid "Category" msgid "Categories" msgstr "Categoría" #: src/language/dictionary/numeric.c:67 #, c-format msgid "Format type %s may not be used with a numeric variable." msgstr "Tipo de formato %s no puede ser utilizado con una variable numérica." #: src/language/dictionary/numeric.c:86 src/language/dictionary/numeric.c:153 #, c-format msgid "There is already a variable named %s." msgstr "Ya existe una variable con nombre %s." #: src/language/dictionary/numeric.c:138 #, c-format msgid "Format type %s may not be used with a string variable." msgstr "El tipo de formato %s no puede utilizarse con variable de cadena." #: src/language/dictionary/rename-variables.c:92 #, c-format msgid "Renaming would duplicate variable name %s." msgstr "Cambiar el nombre duplicaría el nombre de la variable %s." #: src/language/dictionary/split-file.c:75 #, fuzzy #| msgid "Split File" msgid "Split Values" msgstr "Dividir Archivo" #: src/language/dictionary/split-file.c:76 #: src/language/dictionary/split-file.c:77 #: src/language/dictionary/sys-file-info.c:696 #: src/language/stats/chisquare.c:195 src/language/stats/cochran.c:156 #: src/language/stats/cochran.c:185 src/language/stats/examine.c:841 #: src/language/stats/reliability.c:648 src/language/stats/reliability.c:651 #: src/language/stats/crosstabs.q:1303 src/language/stats/crosstabs.q:1325 #: src/language/stats/crosstabs.q:1365 src/language/stats/crosstabs.q:1412 msgid "Value" msgstr "Valor" #: src/language/dictionary/split-file.c:79 #: src/language/dictionary/sys-file-info.c:734 #: src/language/stats/chisquare.c:246 src/language/stats/chisquare.c:328 #: src/language/stats/cochran.c:164 src/language/stats/correlations.c:100 #: src/language/stats/descriptives.c:1004 src/language/stats/friedman.c:226 #: src/language/stats/jonckheere-terpstra.c:377 #: src/language/stats/npar-summary.c:113 src/language/stats/quick-cluster.c:588 #: src/language/stats/runs.c:331 src/language/data-io/data-parser.c:683 #: src/language/data-io/data-parser.c:728 src/language/data-io/print.c:438 #: src/ui/gui/psppire-dictview.c:580 src/ui/gui/psppire-data-editor.c:502 msgid "Variable" msgstr "Variable" #: src/language/dictionary/sys-file-info.c:184 #, fuzzy #| msgid "Variable Information:" msgid "File Information" msgstr "Información de la Variable:" #: src/language/dictionary/sys-file-info.c:185 msgid "Attribute" msgstr "Atributo" #: src/language/dictionary/sys-file-info.c:187 #, fuzzy #| msgid "File:" msgid "File" msgstr "Archivo:" #: src/language/dictionary/sys-file-info.c:194 #, fuzzy #| msgid "Created:" msgid "Created" msgstr "Creado:" #: src/language/dictionary/sys-file-info.c:203 #, fuzzy #| msgid "Integer Format:" msgid "Integer Format" msgstr "Formato Entero:" #: src/language/dictionary/sys-file-info.c:205 msgid "Big Endian" msgstr "Tipo Big-Endian." #: src/language/dictionary/sys-file-info.c:206 msgid "Little Endian" msgstr "Tipo Little-Endian" #: src/language/dictionary/sys-file-info.c:207 #: src/language/dictionary/sys-file-info.c:216 #: src/language/dictionary/sys-file-info.c:223 src/language/utilities/set.q:930 msgid "Unknown" msgstr "Desconocido" #: src/language/dictionary/sys-file-info.c:209 #, fuzzy #| msgid "Real Format:" msgid "Real Format" msgstr "Formato Real:" #: src/language/dictionary/sys-file-info.c:211 msgid "IEEE 754 LE." msgstr "IEEE 754 LE." #: src/language/dictionary/sys-file-info.c:212 msgid "IEEE 754 BE." msgstr "IEE 754 BE." #: src/language/dictionary/sys-file-info.c:213 msgid "VAX D." msgstr "VAX D." #: src/language/dictionary/sys-file-info.c:214 msgid "VAX G." msgstr "VAX G." #: src/language/dictionary/sys-file-info.c:215 msgid "IBM 390 Hex Long." msgstr "IBM 390 Hex Long." #: src/language/dictionary/sys-file-info.c:218 #: src/language/dictionary/sys-file-info.c:443 #: src/language/stats/binomial.c:199 src/language/stats/correlations.c:131 #: src/language/stats/correlations.c:159 src/language/stats/descriptives.c:585 #: src/language/stats/factor.c:1658 src/language/stats/factor.c:1701 #: src/language/stats/factor.c:1860 src/language/stats/factor.c:2074 #: src/language/stats/frequencies.c:1583 #: src/language/stats/kruskal-wallis.c:254 #: src/language/stats/kruskal-wallis.c:303 #: src/language/stats/ks-one-sample.c:316 src/language/stats/logistic.c:1187 #: src/language/stats/mann-whitney.c:254 src/language/stats/means.c:718 #: src/language/stats/means.c:800 src/language/stats/median.c:358 #: src/language/stats/oneway.c:985 src/language/stats/oneway.c:1157 #: src/language/stats/reliability.c:591 src/language/stats/regression.c:924 #: src/language/stats/t-test-one-sample.c:132 #: src/language/stats/t-test-paired.c:157 src/language/data-io/list.c:104 #: src/ui/gui/variable-info.ui:25 msgid "Variables" msgstr "Variables" #: src/language/dictionary/sys-file-info.c:221 src/language/stats/examine.c:929 #: src/language/stats/means.c:697 src/language/stats/reliability.c:548 #: src/language/stats/crosstabs.q:930 msgid "Cases" msgstr "Casos" #: src/language/dictionary/sys-file-info.c:226 src/language/stats/oneway.c:980 #: src/ui/gui/psppire-var-sheet-header.c:58 src/ui/gui/compute.ui:303 msgid "Type" msgstr "Tipo" #: src/language/dictionary/sys-file-info.c:230 #, fuzzy #| msgid "Weight:" msgid "Weight" msgstr "Peso:" #: src/language/dictionary/sys-file-info.c:233 #, fuzzy #| msgid "Not weighted." msgid "Not weighted" msgstr "No ponderado." #: src/language/dictionary/sys-file-info.c:235 #, fuzzy #| msgid "Compression:" msgid "Compression" msgstr "Compresión:" #: src/language/dictionary/sys-file-info.c:245 #: src/language/dictionary/sys-file-info.c:424 #: src/language/dictionary/sys-file-info.c:426 #, fuzzy #| msgid "Comments:" msgid "Documents" msgstr "Comentarios:" #: src/language/dictionary/sys-file-info.c:305 #: src/language/dictionary/sys-file-info.c:430 msgid "(none)" msgstr "" #: src/language/dictionary/sys-file-info.c:393 msgid "No variables to display." msgstr "Ninguna variable para mostrar." #: src/language/dictionary/sys-file-info.c:404 msgid "Macros not supported." msgstr "Macros no disponibles." #: src/language/dictionary/sys-file-info.c:426 #, fuzzy #| msgid "Document Line %zu" msgid "Document" msgstr "Línea de Documento %zu" #: src/language/dictionary/sys-file-info.c:454 msgid "Position" msgstr "Posición" #: src/language/dictionary/sys-file-info.c:456 #, fuzzy #| msgid "Measurement Level: %s\n" msgid "Measurement Level" msgstr "Nivel de Medida: %s\n" #: src/language/dictionary/sys-file-info.c:457 #: src/ui/gui/psppire-var-sheet-header.c:85 msgid "Role" msgstr "Rol" #: src/language/dictionary/sys-file-info.c:458 #: src/ui/gui/psppire-var-sheet-header.c:61 src/ui/gui/compute.ui:215 msgid "Width" msgstr "Ancho" #: src/language/dictionary/sys-file-info.c:459 #, fuzzy #| msgid "Align" msgid "Alignment" msgstr "Alineación" #: src/language/dictionary/sys-file-info.c:460 #: src/language/dictionary/sys-file-info.c:734 msgid "Print Format" msgstr "Formato de Impresión" #: src/language/dictionary/sys-file-info.c:461 #, fuzzy #| msgid "Print Format" msgid "Write Format" msgstr "Formato de Impresión" #: src/language/dictionary/sys-file-info.c:462 #: src/ui/gui/missing-val-dialog.c:379 src/ui/gui/psppire-var-sheet-header.c:73 #: src/ui/gui/examine.ui:416 src/ui/gui/t-test.ui:105 msgid "Missing Values" msgstr "Valores perdidos" #: src/language/dictionary/sys-file-info.c:567 #: src/ui/gui/psppire-var-sheet-header.c:70 src/ui/gui/val-labs-dialog.c:489 #: src/ui/gui/val-labs-dialog.ui:194 msgid "Value Labels" msgstr "Etiquetas de Valor" #: src/language/dictionary/sys-file-info.c:573 #, fuzzy #| msgid "Variable View" msgid "Variable Value" msgstr "Vista de Variables" #: src/language/dictionary/sys-file-info.c:577 #, fuzzy #| msgid "Last non-missing value" msgid "User-missing value" msgstr "Último valor no-perdido" #: src/language/dictionary/sys-file-info.c:693 #, fuzzy #| msgid "Variable under test" msgid "Variable and Dataset Attributes" msgstr "Variable a prueba" #: src/language/dictionary/sys-file-info.c:699 #, fuzzy #| msgid "Variable Name: " msgid "Variable and Name" msgstr "Nombre de Variable: " #: src/language/dictionary/sys-file-info.c:702 #, fuzzy #| msgid "dataset" msgid "(dataset)" msgstr "archivo de datos" #: src/language/dictionary/sys-file-info.c:722 msgid "No vectors defined." msgstr "Vectores no definidos." #: src/language/dictionary/sys-file-info.c:732 #, fuzzy #| msgid "Vector" msgid "Vectors" msgstr "Vector" #: src/language/dictionary/sys-file-info.c:736 msgid "Vector and Position" msgstr "" #: src/language/dictionary/sys-file-info.c:998 msgid "No valid encodings found." msgstr "No se encontraron codificaciones válidas." #: src/language/dictionary/sys-file-info.c:1004 #, c-format msgid "Usable encodings for %s." msgstr "Codificaciones disponibles para %s." #: src/language/dictionary/sys-file-info.c:1007 #, c-format msgid "" "Encodings that can successfully read %s (by specifying the encoding name on " "the GET command's ENCODING subcommand). Encodings that yield identical text " "are listed together." msgstr "" "Codificaciones que permiten leer correctamente %s (especificando el nombre " "de codificación en el subcomando ENCODING del comando GET). La " "codificaciones que proporcionan texto idéntico se listan juntas." #: src/language/dictionary/sys-file-info.c:1012 #: src/language/dictionary/sys-file-info.c:1013 msgid "Encodings" msgstr "Codificaciones" #: src/language/dictionary/sys-file-info.c:1042 #, fuzzy, c-format #| msgid "%s encoded text strings." msgid "%s Encoded Text Strings" msgstr "%s cadenas de texto codificado." #: src/language/dictionary/sys-file-info.c:1046 msgid "" "Text strings in the file dictionary that the previously listed encodings " "interpret differently, along with the interpretations." msgstr "" "Cadenas de texto en el diccionario del archivo que las codificaciones " "previamente listadas interpretan de forma distinta, junto con sus " "interpretaciones." #: src/language/dictionary/sys-file-info.c:1049 src/output/text-item.c:57 #: src/ui/gui/psppire-import-assistant.c:885 msgid "Text" msgstr "Texto" #: src/language/dictionary/sys-file-info.c:1059 msgid "Purpose" msgstr "Propósito" #: src/language/dictionary/value-labels.c:154 #, c-format msgid "Truncating value label to %d bytes." msgstr "Truncando etiqueta de valor a %d caracteres." #: src/language/dictionary/vector.c:66 #, c-format msgid "A vector named %s already exists." msgstr "Un vector llamado %s ya existe." #: src/language/dictionary/vector.c:74 #, c-format msgid "Vector name %s is given twice." msgstr "El nombre del vector %s se da dos veces." #: src/language/dictionary/vector.c:98 msgid "A slash must separate each vector specification in VECTOR's long form." msgstr "" "Una barra debe separar cada especificación de vector en la forma larga de " "VECTOR." #: src/language/dictionary/vector.c:131 msgid "Vectors must have at least one element." msgstr "Los vectores deben tener al menos un elemento." #: src/language/dictionary/vector.c:151 msgid "expecting vector length" msgstr "esperando longitud del vector" #: src/language/dictionary/vector.c:170 #, c-format msgid "%s is an existing variable name." msgstr "%s es un nombre de variable existente." #: src/language/dictionary/variable-display.c:121 msgid "Variable display width must be a positive integer." msgstr "El tamaño de la visualización de variable debe ser un entero positivo." #: src/language/dictionary/weight.c:49 msgid "The weighting variable must be numeric." msgstr "La variable de ponderación debe ser numérica." #: src/language/dictionary/weight.c:54 msgid "The weighting variable may not be scratch." msgstr "La variable de ponderación no puede ser cero." #: src/language/tests/moments-test.c:50 msgid "expecting weight value" msgstr "esperando valor de ponderación" #: src/language/utilities/cd.c:45 src/language/utilities/include.c:173 #, fuzzy, c-format #| msgid "Cannot change directory to %s: %s " msgid "Cannot change directory to %s: %s" msgstr "No se puede cambiar el directorio para %s: %s" #: src/language/utilities/date.c:33 #, c-format msgid "Only %s is currently implemented." msgstr "Sólo %s está implementado actualmente." #: src/language/utilities/host.c:60 #, fuzzy #| msgid "Command shell not supported on this platform." msgid "Time limit not supported on this platform." msgstr "Intérprete de órdenes no disponible para esta plataforma." #: src/language/utilities/host.c:74 #, c-format msgid "%s: Command exited with status %d." msgstr "" #: src/language/utilities/host.c:95 #, fuzzy, c-format #| msgid "failed to create temporary file" msgid "Failed to create temporary file (%s)." msgstr "error en crear el archivo temporal" #: src/language/utilities/host.c:102 #, c-format msgid "/dev/null: Failed to open (%s)." msgstr "" #: src/language/utilities/host.c:117 #, c-format msgid "Couldn't fork: %s." msgstr "Imposible crear fork: %s." #: src/language/utilities/host.c:193 #, c-format msgid "While running \"%s\", waiting for child process failed (%s)." msgstr "" #: src/language/utilities/host.c:203 #, c-format msgid "Command \"%s\" timed out." msgstr "" #: src/language/utilities/host.c:205 #, c-format msgid "Command \"%s\" terminated by signal %d." msgstr "" #: src/language/utilities/host.c:212 msgid "Command or shell not found" msgstr "" #: src/language/utilities/host.c:214 msgid "Could not invoke command or shell" msgstr "" #: src/language/utilities/host.c:217 #, c-format msgid "Command \"%s\" exited with status %d (%s)." msgstr "" #: src/language/utilities/host.c:220 #, c-format msgid "Command \"%s\" exited with status %d." msgstr "" #: src/language/utilities/host.c:230 #, c-format msgid "Command \"%s\" output could not be read (%s)." msgstr "" #: src/language/utilities/title.c:88 #, c-format msgid " (Entered %s)" msgstr " (Introducido %s)" #: src/language/utilities/include.c:73 #, c-format msgid "Can't find `%s' in include file search path." msgstr "" "No se puede encontrar `%s' en la ruta de búsqueda del archivo de inclusión." #: src/language/utilities/output.c:128 #, fuzzy, c-format #| msgid "Unknown command `%s'." msgid "Unknown cell class %s." msgstr "Comando `%s' desconocido." #: src/language/utilities/permissions.c:113 #, c-format msgid "Cannot stat %s: %s" msgstr "No se puede decir que %s: %s" #: src/language/utilities/permissions.c:127 #, c-format msgid "Cannot change mode of %s: %s" msgstr "No se puede cambiar el modo de %s: %s" #: src/language/stats/aggregate.c:96 msgid "Sum of values" msgstr "Suma de valores" #: src/language/stats/aggregate.c:97 msgid "Mean average" msgstr "Media promedio" #: src/language/stats/aggregate.c:98 msgid "Median average" msgstr "Mediana Promedio" #: src/language/stats/aggregate.c:99 #: src/ui/gui/psppire-dialog-action-descriptives.c:40 #: src/ui/gui/psppire-dialog-action-frequencies.c:41 msgid "Standard deviation" msgstr "Desviación Estándar" #: src/language/stats/aggregate.c:100 #: src/ui/gui/psppire-dialog-action-descriptives.c:42 msgid "Maximum value" msgstr "Valor Máximo" #: src/language/stats/aggregate.c:101 #: src/ui/gui/psppire-dialog-action-descriptives.c:41 msgid "Minimum value" msgstr "Valor Mínimo" #: src/language/stats/aggregate.c:102 msgid "Percentage greater than" msgstr "Porcentaje mayor que" #: src/language/stats/aggregate.c:103 msgid "Percentage less than" msgstr "Porcentaje menor que" #: src/language/stats/aggregate.c:104 msgid "Percentage included in range" msgstr "Porcentaje incluido en rango" #: src/language/stats/aggregate.c:105 msgid "Percentage excluded from range" msgstr "Porcentaje excluido del rango" #: src/language/stats/aggregate.c:106 msgid "Fraction greater than" msgstr "Fracción mayor que" #: src/language/stats/aggregate.c:107 msgid "Fraction less than" msgstr "Fracción menor que" #: src/language/stats/aggregate.c:108 msgid "Fraction included in range" msgstr "Fracción incluida en rango" #: src/language/stats/aggregate.c:109 msgid "Fraction excluded from range" msgstr "Fracción excluida del rango" #: src/language/stats/aggregate.c:110 msgid "Number of cases" msgstr "Número de casos" #: src/language/stats/aggregate.c:111 msgid "Number of cases (unweighted)" msgstr "Número de casos (sin ponderar)" #: src/language/stats/aggregate.c:112 msgid "Number of missing values" msgstr "Número de valores perdidos" #: src/language/stats/aggregate.c:113 msgid "Number of missing values (unweighted)" msgstr "Número de valores perdidos (sin ponderar)" #: src/language/stats/aggregate.c:114 msgid "First non-missing value" msgstr "Primer valor no-perdido" #: src/language/stats/aggregate.c:115 msgid "Last non-missing value" msgstr "Último valor no-perdido" #: src/language/stats/aggregate.c:258 msgid "" "When PRESORTED is specified, specifying sorting directions with (A) or (D) " "has no effect. Output data will be sorted the same way as the input data." msgstr "" "Cuando se especifica PRESORTED, dar directivas de ordenación con (A) o (D) " "no tiene efecto. Los datos de salida serán ordenados de la misma manera que " "los de entrada." #: src/language/stats/aggregate.c:448 msgid "expecting aggregation function" msgstr "esperando una función de agregación" #: src/language/stats/aggregate.c:460 #, c-format msgid "Unknown aggregation function %s." msgstr "Función de agregación desconocida %s." #: src/language/stats/aggregate.c:513 #, c-format msgid "Missing argument %zu to %s." msgstr "Argumento perdido %zu para %s." #: src/language/stats/aggregate.c:522 #, c-format msgid "Arguments to %s must be of same type as source variables." msgstr "" "Los argumentos para %s deben ser del mismo tipo que las variables de origen." #: src/language/stats/aggregate.c:541 #, c-format msgid "" "Number of source variables (%zu) does not match number of target variables " "(%zu)." msgstr "" "Número de variables de origen (%zu) no coincide con el número de variables " "de destino (%zu)." #: src/language/stats/aggregate.c:557 #, c-format msgid "" "The value arguments passed to the %s function are out-of-order. They will " "be treated as if they had been specified in the correct order." msgstr "" "El valor de los argumentos pasados en la función %s están fuera de orden. " "Serán tratados como si hubieran sido especificados en el orden correcto." #: src/language/stats/aggregate.c:631 #, c-format msgid "" "Variable name %s is not unique within the aggregate file dictionary, which " "contains the aggregate variables and the break variables." msgstr "" "El nombre de variable %s no es único dentro del archivo de diccionario " "agregado, que contiene las variables agregadas y las variables de corte." #: src/language/stats/autorecode.c:152 #, c-format msgid "Source variable count (%zu) does not match target variable count (%zu)." msgstr "" "El recuento de la variable de origen (%zu) no coincide con el recuento de la " "variable de destino (%zu)." #: src/language/stats/autorecode.c:164 #, c-format msgid "Target variable %s duplicates existing variable %s." msgstr "Variable de destino %s duplica una variable existente %s." #: src/language/stats/autorecode.c:221 #, c-format msgid "" "With GROUP, variables may not mix string variables (such as %s) and numeric " "variables (such as %s)." msgstr "" #: src/language/stats/autorecode.c:363 #, fuzzy #| msgid "Recode into Same Variables" msgid "Recoding grouped variables." msgstr "Recodificar en las Mismas variables" #: src/language/stats/autorecode.c:365 #, fuzzy, c-format #| msgid "Replacing %s by %s: %s." msgid "Recoding %s into %s (%s)." msgstr "Sustituyendo %s por %s: %s." #: src/language/stats/autorecode.c:369 #, fuzzy, c-format #| msgid "Removing %s: %s." msgid "Recoding %s into %s." msgstr "Eliminando %s: %s." #: src/language/stats/autorecode.c:376 src/ui/gui/recode.ui:209 msgid "New Value" msgstr "Nuevo Valor" #: src/language/stats/autorecode.c:376 msgid "Value Label" msgstr "Etiqueta de Valor" #: src/language/stats/autorecode.c:379 msgid "Old Value" msgstr "Valor anterior" #: src/language/stats/binomial.c:138 #, c-format msgid "Variable %s is not dichotomous" msgstr "La variable %s no es dicotómica" #: src/language/stats/binomial.c:182 src/ui/gui/binomial.ui:30 msgid "Binomial Test" msgstr "Prueba Binomial" #: src/language/stats/binomial.c:186 src/language/stats/chisquare.c:183 #: src/language/stats/chisquare.c:239 src/language/stats/chisquare.c:322 #: src/language/stats/cochran.c:188 src/language/stats/correlations.c:94 #: src/language/stats/correlations.c:145 src/language/stats/descriptives.c:991 #: src/language/stats/examine.c:602 src/language/stats/examine.c:742 #: src/language/stats/examine.c:836 src/language/stats/examine.c:925 #: src/language/stats/factor.c:1755 src/language/stats/factor.c:1878 #: src/language/stats/factor.c:1908 src/language/stats/factor.c:2068 #: src/language/stats/factor.c:2102 src/language/stats/frequencies.c:302 #: src/language/stats/frequencies.c:1579 src/language/stats/frequencies.c:1586 #: src/language/stats/friedman.c:250 src/language/stats/glm.c:729 #: src/language/stats/kruskal-wallis.c:249 #: src/language/stats/kruskal-wallis.c:297 #: src/language/stats/ks-one-sample.c:278 src/language/stats/logistic.c:1170 #: src/language/stats/logistic.c:1300 src/language/stats/logistic.c:1330 #: src/language/stats/jonckheere-terpstra.c:361 #: src/language/stats/mann-whitney.c:184 src/language/stats/mann-whitney.c:247 #: src/language/stats/means.c:757 src/language/stats/means.c:811 #: src/language/stats/mcnemar.c:222 src/language/stats/median.c:315 #: src/language/stats/median.c:350 src/language/stats/npar-summary.c:106 #: src/language/stats/oneway.c:973 src/language/stats/oneway.c:1051 #: src/language/stats/oneway.c:1150 src/language/stats/oneway.c:1238 #: src/language/stats/oneway.c:1373 src/language/stats/quick-cluster.c:746 #: src/language/stats/reliability.c:543 src/language/stats/reliability.c:584 #: src/language/stats/reliability.c:633 src/language/stats/reliability.c:644 #: src/language/stats/roc.c:969 src/language/stats/roc.c:1067 #: src/language/stats/regression.c:867 src/language/stats/regression.c:899 #: src/language/stats/regression.c:1023 src/language/stats/regression.c:1089 #: src/language/stats/runs.c:318 src/language/stats/sign.c:102 #: src/language/stats/t-test-indep.c:193 src/language/stats/t-test-indep.c:259 #: src/language/stats/t-test-one-sample.c:68 #: src/language/stats/t-test-one-sample.c:125 #: src/language/stats/t-test-paired.c:150 #: src/language/stats/t-test-paired.c:193 #: src/language/stats/t-test-paired.c:238 src/language/stats/wilcoxon.c:243 #: src/language/stats/wilcoxon.c:282 src/language/stats/crosstabs.q:925 #: src/language/stats/crosstabs.q:1253 src/language/stats/crosstabs.q:1293 #: src/language/stats/crosstabs.q:1302 src/language/stats/crosstabs.q:1331 #: src/language/stats/crosstabs.q:1373 src/language/stats/crosstabs.q:1418 #: src/ui/gui/crosstabs.ui:499 src/ui/gui/oneway.ui:615 msgid "Statistics" msgstr "Estadísticas" #: src/language/stats/binomial.c:187 src/language/stats/chisquare.c:240 #: src/language/stats/chisquare.c:252 msgid "Category" msgstr "Categoría" #: src/language/stats/binomial.c:188 src/language/stats/cochran.c:189 #: src/language/stats/correlations.c:97 src/language/stats/correlations.c:155 #: src/language/stats/descriptives.c:993 src/language/stats/examine.c:926 #: src/language/stats/frequencies.c:1588 src/language/stats/friedman.c:251 #: src/language/stats/kruskal-wallis.c:250 #: src/language/stats/ks-one-sample.c:279 src/language/stats/logistic.c:1331 #: src/language/stats/jonckheere-terpstra.c:369 #: src/language/stats/mann-whitney.c:185 src/language/stats/means.c:710 #: src/language/stats/means-calc.c:439 src/language/stats/mcnemar.c:223 #: src/language/stats/median.c:351 src/language/stats/npar-summary.c:107 #: src/language/stats/oneway.c:1052 src/language/stats/reliability.c:544 #: src/language/stats/sign.c:69 src/language/stats/sign.c:70 #: src/language/stats/t-test-indep.c:194 #: src/language/stats/t-test-one-sample.c:126 #: src/language/stats/t-test-paired.c:151 #: src/language/stats/t-test-paired.c:194 src/language/stats/wilcoxon.c:244 #: src/language/stats/crosstabs.q:926 msgid "N" msgstr "N" #: src/language/stats/binomial.c:189 msgid "Observed Prop." msgstr "Prop. Observada" #: src/language/stats/binomial.c:190 msgid "Test Prop." msgstr "Prop. Test" #: src/language/stats/binomial.c:192 src/language/stats/mcnemar.c:224 #: src/language/stats/sign.c:103 src/language/stats/wilcoxon.c:288 #: src/language/stats/crosstabs.q:1306 msgid "Exact Sig. (2-tailed)" msgstr "Sig. Exacta (2-colas)" #: src/language/stats/binomial.c:193 src/language/stats/mcnemar.c:225 #: src/language/stats/sign.c:104 src/language/stats/wilcoxon.c:289 #: src/language/stats/crosstabs.q:1307 msgid "Exact Sig. (1-tailed)" msgstr "Sig. Exacta (1-cola)" #: src/language/stats/binomial.c:195 #, fuzzy #| msgid "Group1" msgid "Groups" msgstr "Grupo 1" #: src/language/stats/binomial.c:196 #, fuzzy #| msgid "Group1" msgid "Group 1" msgstr "Grupo 1" #: src/language/stats/binomial.c:196 #, fuzzy #| msgid "Group2" msgid "Group 2" msgstr "Grupo 2" #: src/language/stats/binomial.c:196 src/language/stats/chisquare.c:223 #: src/language/stats/chisquare.c:257 src/language/stats/examine.c:930 #: src/language/stats/factor.c:1756 src/language/stats/frequencies.c:344 #: src/language/stats/glm.c:811 src/language/stats/kruskal-wallis.c:285 #: src/language/stats/logistic.c:1336 src/language/stats/mann-whitney.c:197 #: src/language/stats/means.c:706 src/language/stats/oneway.c:982 #: src/language/stats/oneway.c:1072 src/language/stats/reliability.c:549 #: src/language/stats/regression.c:1031 src/language/stats/sign.c:75 #: src/language/stats/wilcoxon.c:250 #: src/ui/gui/psppire-dialog-action-crosstabs.c:93 #: src/language/stats/crosstabs.q:931 src/language/stats/crosstabs.q:1218 msgid "Total" msgstr "Total" #: src/language/stats/chisquare.c:171 #, fuzzy, c-format #| msgid "" #| "CHISQUARE test specified %d expected values, but %d distinct values were " #| "encountered in variable %s." msgid "" "CHISQUARE test specified %d expected values, but variable %s has %zu " "distinct values." msgstr "" "Prueba CHISQUARE especifica %d valores esperados, pero %d diferentes valores " "se encontraron la variable %s." #: src/language/stats/chisquare.c:184 src/language/stats/chisquare.c:241 msgid "Observed N" msgstr "N observado" #: src/language/stats/chisquare.c:185 src/language/stats/chisquare.c:242 msgid "Expected N" msgstr "N esperado" #: src/language/stats/chisquare.c:186 src/language/stats/chisquare.c:243 #: src/language/stats/regression.c:1031 #: src/ui/gui/psppire-dialog-action-crosstabs.c:95 #: src/language/stats/crosstabs.q:1267 msgid "Residual" msgstr "Residual" #: src/language/stats/chisquare.c:235 src/language/stats/cochran.c:150 #: src/language/stats/median.c:305 src/language/stats/sign.c:66 #: src/ui/gui/frequencies.ui:676 msgid "Frequencies" msgstr "Frecuencias" #: src/language/stats/chisquare.c:320 src/language/stats/cochran.c:181 #: src/language/stats/friedman.c:246 src/language/stats/kruskal-wallis.c:295 #: src/language/stats/mann-whitney.c:244 src/language/stats/mcnemar.c:219 #: src/language/stats/median.c:347 src/language/stats/sign.c:100 #: src/language/stats/wilcoxon.c:279 msgid "Test Statistics" msgstr "Pruebas Estadísticas" #: src/language/stats/chisquare.c:323 #, fuzzy #| msgid "Chi-Square" msgid "Chi-square" msgstr "Chi-cuadrado" #: src/language/stats/chisquare.c:324 src/language/stats/cochran.c:191 #: src/language/stats/examine.c:675 src/language/stats/factor.c:2107 #: src/language/stats/friedman.c:257 src/language/stats/glm.c:733 #: src/language/stats/kruskal-wallis.c:299 src/language/stats/logistic.c:1174 #: src/language/stats/median.c:354 src/language/stats/oneway.c:975 #: src/language/stats/oneway.c:1242 src/language/stats/regression.c:1025 #: src/language/stats/t-test-indep.c:267 #: src/language/stats/t-test-one-sample.c:75 #: src/language/stats/t-test-paired.c:253 src/language/stats/crosstabs.q:1304 msgid "df" msgstr "df" #: src/language/stats/chisquare.c:325 src/language/stats/cochran.c:192 #: src/language/stats/friedman.c:258 src/language/stats/kruskal-wallis.c:300 #: src/language/stats/median.c:355 msgid "Asymp. Sig." msgstr "Sign. Asint." #: src/language/stats/cochran.c:111 msgid "More than two values encountered. Cochran Q test will not be run." msgstr "" "Más de dos valores encontrados. El test Q de Cochran Q no se ejecutará." #: src/language/stats/cochran.c:153 #, c-format msgid "Success (%.*g)" msgstr "Éxito (%.*g)" #: src/language/stats/cochran.c:154 #, c-format msgid "Failure (%.*g)" msgstr "Fallo (%.*g)" #: src/language/stats/cochran.c:190 msgid "Cochran's Q" msgstr "Q de Cochran" #: src/language/stats/correlations.c:91 src/language/stats/descriptives.c:987 #: src/language/stats/factor.c:2065 src/language/stats/npar-summary.c:102 msgid "Descriptive Statistics" msgstr "Estadísticos Descriptivos" #: src/language/stats/correlations.c:95 src/language/stats/descriptives.c:108 #: src/language/stats/examine.c:742 src/language/stats/factor.c:2069 #: src/language/stats/frequencies.c:141 src/language/stats/graph.c:211 #: src/language/stats/ks-one-sample.c:290 src/language/stats/means-calc.c:438 #: src/language/stats/npar-summary.c:108 src/language/stats/oneway.c:1052 #: src/language/stats/t-test-indep.c:195 #: src/language/stats/t-test-one-sample.c:127 #: src/language/stats/t-test-paired.c:152 #: src/language/stats/t-test-paired.c:241 #: src/ui/gui/psppire-dialog-action-descriptives.c:39 #: src/ui/gui/psppire-dialog-action-frequencies.c:40 msgid "Mean" msgstr "Media" #: src/language/stats/correlations.c:96 src/language/stats/examine.c:751 #: src/language/stats/factor.c:2070 src/language/stats/ks-one-sample.c:290 #: src/language/stats/means-calc.c:440 src/language/stats/npar-summary.c:109 #: src/language/stats/oneway.c:1052 src/language/stats/t-test-indep.c:196 #: src/language/stats/t-test-one-sample.c:128 #: src/language/stats/t-test-paired.c:153 #: src/language/stats/t-test-paired.c:242 msgid "Std. Deviation" msgstr "Desviación Estándar" #: src/language/stats/correlations.c:126 msgid "Correlations" msgstr "Correlaciones" #: src/language/stats/correlations.c:146 msgid "Pearson Correlation" msgstr "Correlación de Pearson" #: src/language/stats/correlations.c:147 src/language/stats/oneway.c:1243 #: src/language/stats/t-test-indep.c:268 #: src/language/stats/t-test-one-sample.c:76 #: src/language/stats/t-test-paired.c:254 msgid "Sig. (2-tailed)" msgstr "Sign. (2-colas)" #: src/language/stats/correlations.c:147 src/language/stats/factor.c:1913 msgid "Sig. (1-tailed)" msgstr "Sig. (1-cola)" #: src/language/stats/correlations.c:151 msgid "Cross-products" msgstr "Productos-cruzados" #: src/language/stats/correlations.c:152 msgid "Covariance" msgstr "Covarianza" #: src/language/stats/correlations.c:165 #, fuzzy #| msgid "Significance" msgid "Significant at .05 level" msgstr "Significatividad" #: src/language/stats/correlations.c:234 msgid "The data for the chosen variables are all missing or empty." msgstr "Los datos para las variables elegidas están todos vacíos o perdidos." #: src/language/stats/correlations.c:390 src/language/stats/descriptives.c:368 #: src/language/data-io/list.c:166 msgid "No variables specified." msgstr "Variables no especificadas." #: src/language/stats/descriptives.c:109 src/language/stats/frequencies.c:142 #: src/language/stats/means-calc.c:445 src/language/stats/t-test-indep.c:197 #: src/language/stats/t-test-one-sample.c:129 #: src/language/stats/t-test-paired.c:154 #: src/language/stats/t-test-paired.c:243 msgid "S.E. Mean" msgstr "Err.Est.Media" #: src/language/stats/descriptives.c:110 src/language/stats/frequencies.c:145 msgid "Std Dev" msgstr "Desv Std" #: src/language/stats/descriptives.c:111 src/language/stats/examine.c:750 #: src/language/stats/frequencies.c:146 src/language/stats/means-calc.c:450 #: src/ui/gui/psppire-dialog-action-descriptives.c:46 #: src/ui/gui/psppire-dialog-action-frequencies.c:45 msgid "Variance" msgstr "Varianza" #: src/language/stats/descriptives.c:112 src/language/stats/examine.c:752 #: src/language/stats/frequencies.c:147 src/language/stats/means-calc.c:451 #: src/ui/gui/psppire-dialog-action-descriptives.c:47 #: src/ui/gui/psppire-dialog-action-frequencies.c:50 msgid "Kurtosis" msgstr "Curtosis" #: src/language/stats/descriptives.c:113 src/language/stats/frequencies.c:148 #: src/language/stats/means-calc.c:452 msgid "S.E. Kurt" msgstr "Err.Est.Curt." #: src/language/stats/descriptives.c:114 src/language/stats/examine.c:752 #: src/language/stats/frequencies.c:149 src/language/stats/means-calc.c:453 #: src/ui/gui/psppire-dialog-action-descriptives.c:48 #: src/ui/gui/psppire-dialog-action-frequencies.c:46 msgid "Skewness" msgstr "Asimetría" #: src/language/stats/descriptives.c:115 src/language/stats/frequencies.c:150 #: src/language/stats/means-calc.c:454 msgid "S.E. Skew" msgstr "Err.Est.Asim." #: src/language/stats/descriptives.c:116 src/language/stats/examine.c:751 #: src/language/stats/frequencies.c:151 src/language/stats/means-calc.c:449 #: src/ui/gui/psppire-dialog-action-descriptives.c:43 #: src/ui/gui/psppire-dialog-action-frequencies.c:48 msgid "Range" msgstr "Intervalo" #: src/language/stats/descriptives.c:117 src/language/stats/examine.c:751 #: src/language/stats/frequencies.c:152 src/language/stats/graph.c:214 #: src/language/stats/ks-one-sample.c:285 src/language/stats/means-calc.c:447 #: src/language/stats/npar-summary.c:110 src/language/stats/oneway.c:1061 #: src/ui/gui/psppire-dialog-action-descriptives.c:41 #: src/ui/gui/psppire-dialog-action-frequencies.c:42 msgid "Minimum" msgstr "Mínimo" #: src/language/stats/descriptives.c:118 src/language/stats/examine.c:751 #: src/language/stats/frequencies.c:153 src/language/stats/graph.c:213 #: src/language/stats/ks-one-sample.c:285 src/language/stats/means-calc.c:448 #: src/language/stats/npar-summary.c:110 src/language/stats/oneway.c:1061 #: src/ui/gui/psppire-dialog-action-descriptives.c:42 #: src/ui/gui/psppire-dialog-action-frequencies.c:43 msgid "Maximum" msgstr "Máximo" #: src/language/stats/descriptives.c:119 src/language/stats/frequencies.c:154 #: src/language/stats/graph.c:212 src/language/stats/means-calc.c:446 #: src/ui/gui/psppire-dialog-action-descriptives.c:44 #: src/ui/gui/psppire-dialog-action-frequencies.c:53 msgid "Sum" msgstr "Suma" #: src/language/stats/descriptives.c:350 #, c-format msgid "Z-score variable name %s would be a duplicate variable name." msgstr "el nombre de variable Z %s sería un nombre de variable duplicado." #: src/language/stats/descriptives.c:401 msgid "" "DESCRIPTIVES with Z scores ignores TEMPORARY. Temporary transformations " "will be made permanent." msgstr "" "DESCRIPTIVES con puntuaciones Z ignora TEMPORARY. Las transformaciones " "temporales serán permanentes." #: src/language/stats/descriptives.c:478 msgid "expecting statistic name: reverting to default" msgstr "esperando nombre del estadístico: vuelve a aplicar el defecto" #: src/language/stats/descriptives.c:561 msgid "" "Ran out of generic names for Z-score variables. There are only 126 generic " "names: ZSC001-ZSC0999, STDZ01-STDZ09, ZZZZ01-ZZZZ09, ZQZQ01-ZQZQ09." msgstr "" "Se han agotado los nombres genéricos para las variables Z. Sólo hay 126 " "nombres genéricos: ZSC001-ZSC0999, STDZ01-STDZ09, ZZZZ01-ZZZZ09, ZQZQ01-" "ZQZQ09." #: src/language/stats/descriptives.c:579 #, fuzzy #| msgid "Mapping of variables to corresponding Z-scores." msgid "Mapping of Variables to Z-scores" msgstr "Convirtiendo variables a las puntuaciones-Z correspondientes." #: src/language/stats/descriptives.c:581 #, fuzzy #| msgid "Name" msgid "Names" msgstr "Nombre" #: src/language/stats/descriptives.c:582 src/language/stats/glm.c:739 #: src/language/stats/regression.c:1030 msgid "Source" msgstr "Fuente" #: src/language/stats/descriptives.c:582 msgid "Target" msgstr "Destino" #: src/language/stats/descriptives.c:659 #, fuzzy, c-format #| msgid "Internal error processing Z scores" msgid "Internal error processing Z scores. Please report this to %s." msgstr "Error interno procesando puntuaciones Z" #: src/language/stats/descriptives.c:759 #, c-format msgid "Z-score of %s" msgstr "puntuación-Z de %s" #: src/language/stats/descriptives.c:1028 src/language/stats/roc.c:1029 msgid "Valid N (listwise)" msgstr "N Válido (listwise)" #: src/language/stats/descriptives.c:1028 #, fuzzy #| msgid "Valid N (listwise)" msgid "Missing N (listwise)" msgstr "N Válido (listwise)" #: src/language/stats/examine.c:75 msgid " (missing)" msgstr " (perdido)" #: src/language/stats/examine.c:225 #, c-format msgid "Boxplot of %s vs. %s" msgstr "Diagrama de caja de %s vs. %s" #: src/language/stats/examine.c:231 src/language/stats/examine.c:338 #, c-format msgid "Boxplot of %s" msgstr "Diagrama de caja de %s" #: src/language/stats/examine.c:321 msgid "Boxplot" msgstr "Diagrama de caja" #: src/language/stats/examine.c:418 msgid "Not creating NP plot because data set is empty." msgstr "No se creará el gráfico NP porque el conjunto de datos está vacío." #: src/language/stats/examine.c:478 #, c-format msgid "Not creating spreadlevel chart for %s" msgstr "No se generará el diagrama de Heterocedasticidad (spreadlevel) para %s" #: src/language/stats/examine.c:585 #, fuzzy #| msgid "Last non-missing value" msgid "User-missing value." msgstr "Último valor no-perdido" #: src/language/stats/examine.c:591 src/language/stats/examine.c:595 #: src/language/stats/frequencies.c:1606 msgid "Percentiles" msgstr "Percentiles" #: src/language/stats/examine.c:603 src/math/percentiles.c:37 msgid "Weighted Average" msgstr "Media Ponderada" #: src/language/stats/examine.c:603 msgid "Tukey's Hinges" msgstr "Bisagras de Tukey" #: src/language/stats/examine.c:610 src/language/stats/examine.c:685 #: src/language/stats/examine.c:759 src/language/stats/examine.c:858 #: src/language/stats/examine.c:938 src/language/stats/mann-whitney.c:200 #: src/language/stats/median.c:319 src/language/stats/t-test-indep.c:227 #: src/language/stats/t-test-indep.c:282 #: src/language/stats/t-test-one-sample.c:87 #, fuzzy #| msgid "_Dependent Variable" msgid "Dependent Variables" msgstr "Variable _Dependiente" #: src/language/stats/examine.c:669 #, fuzzy #| msgid "Dev from Normal" msgid "Tests of Normality" msgstr "Desv. de la Normal" #: src/language/stats/examine.c:673 msgid "Shapiro-Wilk" msgstr "" #: src/language/stats/examine.c:674 src/language/stats/examine.c:739 #: src/ui/gui/psppire-checkbox-treeview.c:73 msgid "Statistic" msgstr "Estadístico" #: src/language/stats/examine.c:676 src/language/stats/factor.c:2108 #: src/language/stats/glm.c:736 src/language/stats/logistic.c:1175 #: src/language/stats/oneway.c:978 src/language/stats/oneway.c:1154 #: src/language/stats/oneway.c:1376 src/language/stats/regression.c:906 #: src/language/stats/regression.c:1028 src/language/stats/t-test-indep.c:263 #: src/language/stats/t-test-paired.c:196 msgid "Sig." msgstr "Sign." #: src/language/stats/examine.c:735 src/language/stats/oneway.c:1045 #: src/ui/gui/descriptives.ui:25 msgid "Descriptives" msgstr "Descriptivos" #: src/language/stats/examine.c:738 msgid "Aspect" msgstr "" #: src/language/stats/examine.c:739 src/language/stats/oneway.c:1053 #: src/language/stats/oneway.c:1240 src/language/stats/oneway.c:1375 #: src/language/stats/roc.c:975 src/language/stats/regression.c:902 msgid "Std. Error" msgstr "Error Estándar" #: src/language/stats/examine.c:745 src/language/stats/oneway.c:1056 #, c-format msgid "%g%% Confidence Interval for Mean" msgstr "Intervalo de Confianza %g%% para la Media" #: src/language/stats/examine.c:747 src/language/stats/oneway.c:1058 #: src/language/stats/oneway.c:1382 src/language/stats/roc.c:982 #: src/language/stats/regression.c:913 msgid "Lower Bound" msgstr "Límite Inferior" #: src/language/stats/examine.c:748 src/language/stats/oneway.c:1059 #: src/language/stats/oneway.c:1383 src/language/stats/roc.c:983 #: src/language/stats/regression.c:914 msgid "Upper Bound" msgstr "Límite Superior" #: src/language/stats/examine.c:750 msgid "5% Trimmed Mean" msgstr "Media recortada al 5%" #: src/language/stats/examine.c:750 src/language/stats/frequencies.c:143 #: src/language/stats/means-calc.c:442 src/language/stats/median.c:352 #: src/ui/gui/psppire-dialog-action-frequencies.c:52 msgid "Median" msgstr "Mediana" #: src/language/stats/examine.c:752 msgid "Interquartile Range" msgstr "Intervalo intercuartílico" #: src/language/stats/examine.c:832 msgid "Extreme Values" msgstr "Valores extremos" #: src/language/stats/examine.c:840 src/language/stats/quick-cluster.c:664 #: src/language/data-io/list.c:110 msgid "Case Number" msgstr "Número de Caso" #: src/language/stats/examine.c:844 #, fuzzy #| msgid "Order by" msgid "Order" msgstr "Ordenado por" #. TRANSLATORS: This is a noun, not an adjective. #: src/language/stats/examine.c:850 #, fuzzy #| msgid "_Extremes" msgid "Extreme" msgstr "_Extremos" #: src/language/stats/examine.c:851 msgid "Highest" msgstr "Máximo" #: src/language/stats/examine.c:851 msgid "Lowest" msgstr "Mínimo" #: src/language/stats/examine.c:921 src/language/stats/logistic.c:1328 #: src/language/stats/means.c:694 src/language/stats/reliability.c:540 msgid "Case Processing Summary" msgstr "Resumen del proceso de casos" #: src/language/stats/examine.c:927 src/language/stats/frequencies.c:304 #: src/language/stats/frequencies.c:1494 src/language/stats/logistic.c:1332 #: src/language/stats/means.c:713 src/language/stats/reliability.c:545 #: src/language/stats/crosstabs.q:927 msgid "Percent" msgstr "Porcentaje" #: src/language/stats/examine.c:929 src/language/stats/frequencies.c:321 #: src/language/stats/frequencies.c:1590 src/language/stats/quick-cluster.c:766 #: src/language/stats/reliability.c:548 src/language/stats/crosstabs.q:931 msgid "Valid" msgstr "Válido" #: src/language/stats/examine.c:929 src/language/stats/frequencies.c:336 #: src/language/stats/frequencies.c:1591 src/language/stats/crosstabs.q:931 msgid "Missing" msgstr "Perdidos" #: src/language/stats/examine.c:1550 #, c-format msgid "%s may not be negative. Using default value (%g)." msgstr "%s no puede ser negativo. Se utilizará en valor por defecto (%g)." #: src/language/stats/examine.c:1587 msgid "Percentiles must lie in the range (0, 100)" msgstr "Los percentiles deben estar dentro del rango (0, 100)" #: src/language/stats/examine.c:1777 #, c-format msgid "%s and %s are mutually exclusive" msgstr "%s i %s son mutuamente excluyentes" #: src/language/stats/factor.c:1121 #, c-format msgid "Matrix input for %s must be either COV or CORR" msgstr "La matriz de entrada para %s debe ser COV o CORR" #: src/language/stats/factor.c:1519 msgid "Factor analysis on a single variable is not useful." msgstr "El análisis factorial para una única variable es inútil." #: src/language/stats/factor.c:1523 msgid "Factor analysis without variables is not possible." msgstr "El análisis factorial sin variables es imposible." #: src/language/stats/factor.c:1634 msgid "Component Number" msgstr "Número de Componente" #: src/language/stats/factor.c:1634 msgid "Factor Number" msgstr "Número de Factores" #: src/language/stats/factor.c:1648 src/language/stats/factor.c:1651 msgid "Communalities" msgstr "Comunalidades" #: src/language/stats/factor.c:1653 msgid "Initial" msgstr "Inicial" #: src/language/stats/factor.c:1655 msgid "Extraction" msgstr "Extracción" #: src/language/stats/factor.c:1697 src/language/stats/factor.c:1777 #: src/language/stats/factor.c:1839 msgid "Component" msgstr "Componente" #: src/language/stats/factor.c:1697 src/language/stats/factor.c:1777 #: src/language/stats/factor.c:1839 msgid "Factor" msgstr "Factor" #: src/language/stats/factor.c:1752 msgid "Total Variance Explained" msgstr "Varianza Total Explicada" #: src/language/stats/factor.c:1758 #, no-c-format msgid "% of Variance" msgstr "% de Varianza" #: src/language/stats/factor.c:1760 #, no-c-format msgid "Cumulative %" msgstr "% Acumulado" #: src/language/stats/factor.c:1763 msgid "Phase" msgstr "" #: src/language/stats/factor.c:1765 msgid "Initial Eigenvalues" msgstr "Valores propios Iniciales" #: src/language/stats/factor.c:1769 msgid "Extraction Sums of Squared Loadings" msgstr "Sumas de Pesos al Cuadrado de la Extracción" #: src/language/stats/factor.c:1773 msgid "Rotation Sums of Squared Loadings" msgstr "Rotación: Sumas de Pesos al Cuadrado " #: src/language/stats/factor.c:1835 msgid "Factor Correlation Matrix" msgstr "Matriz de Correlación Factorial" #: src/language/stats/factor.c:1842 #, fuzzy #| msgid "Factor" msgid "Factor 2" msgstr "Factor" #: src/language/stats/factor.c:1874 msgid "Anti-Image Matrices" msgstr "Matrices Anti-Imagen" #: src/language/stats/factor.c:1879 msgid "Anti-image Covariance" msgstr "Covarianza Anti-Imagen" #: src/language/stats/factor.c:1880 msgid "Anti-image Correlation" msgstr "Correlaciones Anti-Imagen" #: src/language/stats/factor.c:1901 msgid "Correlation Matrix" msgstr "Matriz de Correlación" #: src/language/stats/factor.c:1910 src/language/stats/t-test-paired.c:195 msgid "Correlation" msgstr "Correlación" #: src/language/stats/factor.c:1947 msgid "Determinant" msgstr "Determinante" #: src/language/stats/factor.c:1958 msgid "Covariance Matrix" msgstr "Matriz de Covarianzas" #: src/language/stats/factor.c:1990 msgid "" "The dataset contains no complete observations. No analysis will be performed." msgstr "" "El conjunto de datos no contiene observaciones completas. No se realizará " "ningún análisis." #: src/language/stats/factor.c:2014 msgid "The dataset has no complete covariance or correlation matrix." msgstr "" "El conjunto de datos no tiene matriz de covarianza o correlaciión completa." #: src/language/stats/factor.c:2071 msgid "Analysis N" msgstr "Análisis N" #: src/language/stats/factor.c:2099 msgid "KMO and Bartlett's Test" msgstr "KMO y Prueba de Bartlett" #: src/language/stats/factor.c:2103 msgid "Kaiser-Meyer-Olkin Measure of Sampling Adequacy" msgstr "Medida Kaiser-Meyer-Olkin de Adecuación muestral" #: src/language/stats/factor.c:2105 msgid "Bartlett's Test of Sphericity" msgstr "Prueba de esfericidad de Bartlet" #: src/language/stats/factor.c:2106 msgid "Approx. Chi-Square" msgstr "Chi-cuadrado Aprox." #: src/language/stats/factor.c:2154 #, c-format msgid "" "The %s criteria result in zero factors extracted. Therefore no analysis will " "be performed." msgstr "" "El criterio %s resulta en la extracción de cero factores. por tanto, no se " "puede realizar ningún análisis." #: src/language/stats/factor.c:2161 #, c-format msgid "" "The %s criteria result in more factors than variables, which is not " "meaningful. No analysis will be performed." msgstr "" "El criterio %s resulta en más factores que variables, y esto no tiene ningún " "sentido. No se realiza ningún análisis." #: src/language/stats/factor.c:2254 msgid "Component Matrix" msgstr "Matriz de Componentes" #: src/language/stats/factor.c:2254 msgid "Factor Matrix" msgstr "Matriz de Factores" #: src/language/stats/factor.c:2259 msgid "Pattern Matrix" msgstr "Matriz de Patrones" #: src/language/stats/factor.c:2268 msgid "Structure Matrix" msgstr "Matriz de Estructura" #: src/language/stats/factor.c:2270 msgid "Rotated Component Matrix" msgstr "Matriz Rotada de Componentes" #: src/language/stats/factor.c:2271 msgid "Rotated Factor Matrix" msgstr "Matriz Rotada de Factores" #: src/language/stats/flip.c:100 #, c-format msgid "%s ignores %s. Temporary transformations will be made permanent." msgstr "%s ignora %s. Las transformaciones temporales serán permanentes." #: src/language/stats/flip.c:153 #, c-format msgid "Could not create temporary file for %s." msgstr "No se ha podido crear el archivo temporal para %s." #: src/language/stats/flip.c:341 #, c-format msgid "Error rewinding %s file: %s." msgstr "Error reconstruyendo el archivo %s: %s." #: src/language/stats/flip.c:348 #, c-format msgid "Error creating %s source file." msgstr "Error al crear el archivo de origen %s." #: src/language/stats/flip.c:361 #, c-format msgid "Error reading %s file: %s." msgstr "Error de lectura del archivo %s: %s." #: src/language/stats/flip.c:363 #, c-format msgid "Unexpected end of file reading %s file." msgstr "Final inesperado en la lectura del archivo %s." #: src/language/stats/flip.c:379 #, c-format msgid "Error seeking %s source file: %s." msgstr "Error al buscar el archivo fuente %s: %s." #: src/language/stats/flip.c:387 #, c-format msgid "Error writing %s source file: %s." msgstr "Error de escritura del archivo fuente %s: %s." #: src/language/stats/flip.c:402 #, c-format msgid "Error rewinding %s source file: %s." msgstr "Error reconstruyendo el archivo fuente %s: %s." #: src/language/stats/flip.c:433 #, c-format msgid "Error reading %s temporary file: %s." msgstr "Error de lectura del archivo temporal %s: %s." #: src/language/stats/flip.c:436 #, c-format msgid "Unexpected end of file reading %s temporary file." msgstr "Final inesperado de la lectura del archivo temporal %s." #: src/language/stats/frequencies.c:144 #: src/ui/gui/psppire-dialog-action-frequencies.c:49 msgid "Mode" msgstr "Modo" #: src/language/stats/frequencies.c:303 src/language/stats/logistic.c:1381 #: src/output/charts/plot-hist-cairo.c:112 msgid "Frequency" msgstr "Frecuencia" #: src/language/stats/frequencies.c:305 msgid "Valid Percent" msgstr "Porcentaje Válido" #: src/language/stats/frequencies.c:306 src/language/stats/graph.c:208 msgid "Cumulative Percent" msgstr "Porcentaje Acumulado" #: src/language/stats/frequencies.c:905 msgid "Histogram frequency must be greater than zero." msgstr "La frecuencia de histograma debe ser superior a cero." #: src/language/stats/frequencies.c:923 msgid "Histogram percentage must be greater than zero." msgstr "El porcentaje en un histograma debe ser mayor que cero." #: src/language/stats/frequencies.c:1139 #, c-format msgid "" "%s for histogram must be greater than or equal to %s, but %s was specified " "as %.15g and %s as %.15g. %s and %s will be ignored." msgstr "" "Para el histograma, %s debe ser mayor o igual a %s, pero %s se ha " "especificado como %.15g y %s como %.15g. %s y %s serán ignorados." #: src/language/stats/frequencies.c:1184 #, c-format msgid "" "%s for pie chart must be greater than or equal to %s, but %s was specified " "as %.15g and %s as %.15g. %s and %s will be ignored." msgstr "" "Para el gráfico de sectores, %s debe ser mayor o igual a %s, pero %s se ha " "especificado como %.15g y %s como %.15g. %s y %s serán ignorados." #: src/language/stats/frequencies.c:1474 #, c-format msgid "Omitting pie chart for %s, which has only %d unique values." msgstr "" "Se omite el gráfico de sectores para %s, que sólo tiene %d valores únicos." #: src/language/stats/frequencies.c:1477 #, c-format msgid "Omitting pie chart for %s, which has over 50 unique values." msgstr "" "Se omite el gráfico de sectores para %s, que tiene más de 50 valores únicos." #: src/language/stats/frequencies.c:1494 src/language/stats/graph.c:205 #: src/language/stats/quick-cluster.c:747 #: src/ui/gui/psppire-dialog-action-crosstabs.c:90 #: src/language/stats/crosstabs.q:789 src/language/stats/crosstabs.q:1262 msgid "Count" msgstr "Recuento" #: src/language/stats/friedman.c:220 src/language/stats/kruskal-wallis.c:247 #: src/language/stats/mann-whitney.c:182 src/language/stats/wilcoxon.c:240 msgid "Ranks" msgstr "Rangos" #: src/language/stats/friedman.c:222 src/language/stats/friedman.c:223 #: src/language/stats/kruskal-wallis.c:251 #: src/language/stats/mann-whitney.c:186 src/language/stats/wilcoxon.c:245 msgid "Mean Rank" msgstr " Rango medio" #: src/language/stats/friedman.c:253 msgid "Kendall's W" msgstr "W de Kendall" #: src/language/stats/friedman.c:256 src/language/stats/kruskal-wallis.c:298 #: src/language/stats/median.c:353 msgid "Chi-Square" msgstr "Chi-cuadrado" #: src/language/stats/glm.c:169 msgid "Multivariate analysis is not yet implemented" msgstr "Análisis multivariado todavía no está implementado." #: src/language/stats/glm.c:274 msgid "Only types 1, 2 & 3 sums of squares are currently implemented" msgstr "" "Sólo los tipos 1, 2 & 3 de sumas cuadráticas están actualmente implementadas." #: src/language/stats/glm.c:727 msgid "Tests of Between-Subjects Effects" msgstr "Pruebas de Efectos Entre-Sujetos" #: src/language/stats/glm.c:730 #, fuzzy #| msgid "Type %s Sum of Squares" msgid "Type I Sum Of Squares" msgstr "Suma de Cuadrados Tipo %s" #: src/language/stats/glm.c:731 #, fuzzy #| msgid "Type %s Sum of Squares" msgid "Type II Sum Of Squares" msgstr "Suma de Cuadrados Tipo %s" #: src/language/stats/glm.c:732 #, fuzzy #| msgid "Type %s Sum of Squares" msgid "Type III Sum Of Squares" msgstr "Suma de Cuadrados Tipo %s" #: src/language/stats/glm.c:734 src/language/stats/oneway.c:976 #: src/language/stats/regression.c:1026 msgid "Mean Square" msgstr "Cuadrado medio" #: src/language/stats/glm.c:735 src/language/stats/oneway.c:977 #: src/language/stats/regression.c:1027 src/language/stats/t-test-indep.c:262 msgid "F" msgstr "F" #: src/language/stats/glm.c:740 msgid "Corrected Model" msgstr "Modelo Corregido" #: src/language/stats/glm.c:740 msgid "Model" msgstr "Modelo" #: src/language/stats/glm.c:752 msgid "Intercept" msgstr "Constante" #: src/language/stats/glm.c:802 src/output/pivot-table.c:763 #: src/output/spv/spv.c:867 msgid "Error" msgstr "Error" #: src/language/stats/glm.c:819 msgid "Corrected Total" msgstr "Total Corregido " #: src/language/stats/graph.c:206 msgid "Percentage" msgstr "_Porcentaje" #: src/language/stats/graph.c:207 msgid "Cumulative Count" msgstr "Recuento Acumulado" #: src/language/stats/graph.c:296 #, c-format msgid "%s vs. %s by %s" msgstr "%s vs. %s por %s" #: src/language/stats/graph.c:303 #, c-format msgid "%s vs. %s" msgstr "%s vs. %s" #: src/language/stats/graph.c:322 msgid "" "Maximum number of scatterplot categories reached. Your BY variable has too " "many distinct values. The coloring of the plot will not be correct." msgstr "" "Se ha alcanzado el número máximo de categorías para gráficos. La variable BY " "tiene demasiados valores distintos. El coloreado del gráfico no será " "correcto." #: src/language/stats/graph.c:551 src/language/stats/rank.c:636 #, c-format msgid "%s of %s" msgstr "%s de %s" #: src/language/stats/graph.c:698 src/language/stats/graph.c:729 #: src/language/stats/graph.c:777 msgid "Only one chart type is allowed." msgstr "Solo se permite un tipo de gráfico." #: src/language/stats/graph.c:721 src/language/stats/graph.c:820 #: src/language/stats/graph.c:834 msgid "Only one variable is allowed." msgstr "Sólo se permite una variable." #: src/language/stats/graph.c:843 msgid "Variable expected" msgstr "Se espera una variable" #: src/language/stats/graph.c:883 msgid "FOOTNOTE is not implemented yet for GRAPH" msgstr "FOOTNOTE aún no está implementado para GRAPH" #: src/language/stats/ks-one-sample.c:274 src/ui/gui/ks-one-sample.ui:24 msgid "One-Sample Kolmogorov-Smirnov Test" msgstr "Prueba Kolmogorov_Smirnov para una muestra" #: src/language/stats/ks-one-sample.c:284 msgid "Uniform Parameters" msgstr "Parámetros Uniforme" #: src/language/stats/ks-one-sample.c:289 msgid "Normal Parameters" msgstr "Parámetros Normal" #: src/language/stats/ks-one-sample.c:294 msgid "Poisson Parameters" msgstr "Parámetros Poisson" #: src/language/stats/ks-one-sample.c:295 #: src/ui/gui/psppire-dialog-action-crosstabs.c:76 #: src/language/stats/crosstabs.q:1421 msgid "Lambda" msgstr "Lambda" #: src/language/stats/ks-one-sample.c:300 msgid "Exponential Parameters" msgstr "Parámetros Exponencial" #: src/language/stats/ks-one-sample.c:308 msgid "Most Extreme Differences" msgstr "Diferencias Más Extremas" #: src/language/stats/ks-one-sample.c:309 msgid "Absolute" msgstr "Absoluto" #: src/language/stats/ks-one-sample.c:309 src/language/stats/roc.c:1037 msgid "Positive" msgstr "Positivo" #: src/language/stats/ks-one-sample.c:309 src/language/stats/roc.c:1037 msgid "Negative" msgstr "Negativo" #: src/language/stats/ks-one-sample.c:312 msgid "Kolmogorov-Smirnov Z" msgstr "Z de Kolmogorov-Smirnov" #: src/language/stats/ks-one-sample.c:313 #: src/language/stats/jonckheere-terpstra.c:374 #: src/language/stats/mann-whitney.c:251 src/language/stats/runs.c:328 #: src/language/stats/wilcoxon.c:284 msgid "Asymp. Sig. (2-tailed)" msgstr "Sig. Asint. (2-colas)" #: src/language/stats/logistic.c:327 msgid "All predicted values are either 1 or 0" msgstr "Todos los valores predichos son 1 o 0" #: src/language/stats/logistic.c:525 msgid "Dependent variable's values are not dichotomous." msgstr "Los valores de las variables dependientes no son dicotómicas." #: src/language/stats/logistic.c:614 #, c-format msgid "" "Category %s does not have at least two distinct values. Logistic regression " "will not be run." msgstr "" "La categoría %s no tiene al menos dos valores distintos. No se ejecutará la " "regresión logística." #: src/language/stats/logistic.c:674 #, c-format msgid "" "Estimation terminated at iteration number %d because parameter estimates " "changed by less than %g" msgstr "" "La estimación se detuvo en la iteración número %d porque las estimaciones de " "parámetros cambiaron menos que %g" #: src/language/stats/logistic.c:686 #, c-format msgid "" "Estimation terminated at iteration number %d because Log Likelihood " "decreased by less than %g%%" msgstr "" "La estimación se detuvo en la iteración número %d porque la Log-" "Verosimilitud (Log Likelihood) ha decrecido en menos de %g%%" #: src/language/stats/logistic.c:701 #, c-format msgid "" "Estimation terminated at iteration number %d because maximum iterations has " "been reached" msgstr "" "La estimación se detuvo en la iteración número %d porque se ha alcanzado el " "máximo de iteraciones" #: src/language/stats/logistic.c:994 msgid "Cut point value must be in the range [0,1]" msgstr "El valor de punto de corte debe estar en el rango (0,1)" #: src/language/stats/logistic.c:1139 msgid "Dependent Variable Encoding" msgstr "Codificación de la Variable Dependiente" #: src/language/stats/logistic.c:1141 msgid "Mapping" msgstr "" #: src/language/stats/logistic.c:1142 msgid "Internal Value" msgstr "Valor interno" #: src/language/stats/logistic.c:1145 msgid "Original Value" msgstr "Valor original" #: src/language/stats/logistic.c:1167 msgid "Variables in the Equation" msgstr "Variables en la Ecuación" #: src/language/stats/logistic.c:1171 src/language/stats/regression.c:902 msgid "B" msgstr "B" #: src/language/stats/logistic.c:1172 msgid "S.E." msgstr "Err.Est." #: src/language/stats/logistic.c:1173 msgid "Wald" msgstr "Wald" #: src/language/stats/logistic.c:1176 msgid "Exp(B)" msgstr "Exp(B)" #: src/language/stats/logistic.c:1181 #, c-format msgid "%d%% CI for Exp(B)" msgstr "%d%% IC para Exp(B)" #: src/language/stats/logistic.c:1183 src/language/stats/t-test-indep.c:274 #: src/language/stats/t-test-one-sample.c:83 #: src/language/stats/t-test-paired.c:249 src/language/stats/crosstabs.q:1369 msgid "Lower" msgstr "Inferior" #: src/language/stats/logistic.c:1183 src/language/stats/t-test-indep.c:275 #: src/language/stats/t-test-one-sample.c:84 #: src/language/stats/t-test-paired.c:250 src/language/stats/crosstabs.q:1370 msgid "Upper" msgstr "Superior" #: src/language/stats/logistic.c:1189 src/language/stats/logistic.c:1470 msgid "Step 1" msgstr "Paso 1" #: src/language/stats/logistic.c:1263 msgid "Constant" msgstr "Constante" #: src/language/stats/logistic.c:1298 msgid "Model Summary" msgstr "Resumen del modelo" #: src/language/stats/logistic.c:1301 msgid "-2 Log likelihood" msgstr "-2 Log Verosimilitud" #: src/language/stats/logistic.c:1302 msgid "Cox & Snell R Square" msgstr "R cuadrada de Cox & Snell" #: src/language/stats/logistic.c:1303 msgid "Nagelkerke R Square" msgstr "R cuadrada de Nagelkerke" #: src/language/stats/logistic.c:1306 src/language/stats/logistic.c:1470 #, fuzzy #| msgid "Step 1" msgid "Step" msgstr "Paso 1" #: src/language/stats/logistic.c:1335 msgid "Unweighted Cases" msgstr "Casos sin ponderar" #: src/language/stats/logistic.c:1336 msgid "Included in Analysis" msgstr "Incluido en el análisis" #: src/language/stats/logistic.c:1336 msgid "Missing Cases" msgstr "Casos perdidos" #: src/language/stats/logistic.c:1365 msgid "Categorical Variables' Codings" msgstr "Codificación de Variables Categóricas" #: src/language/stats/logistic.c:1380 #, fuzzy #| msgid "Encodings" msgid "Codings" msgstr "Codificaciones" #: src/language/stats/logistic.c:1383 msgid "Parameter coding" msgstr "Codificación de parámetros" #: src/language/stats/logistic.c:1462 msgid "Classification Table" msgstr "Tabla de Clasificación" #: src/language/stats/logistic.c:1466 msgid "Predicted" msgstr "Predicho" #: src/language/stats/logistic.c:1466 #, fuzzy #| msgid "" #| "Percentage\n" #| "Correct" msgid "Percentage Correct" msgstr "" "Porcentaje\n" "Correcto" #: src/language/stats/logistic.c:1468 msgid "Observed" msgstr "Observado" #: src/language/stats/logistic.c:1468 msgid "Overall Percentage" msgstr "Porcentaje Global" #: src/language/stats/jonckheere-terpstra.c:357 msgid "Jonckheere-Terpstra Test" msgstr "Contraste Jonckheere-Terpstra" #: src/language/stats/jonckheere-terpstra.c:364 #, c-format msgid "Number of levels in %s" msgstr "Número de niveles en %s" #: src/language/stats/jonckheere-terpstra.c:370 msgid "Observed J-T Statistic" msgstr "Estadístico J-T observado" #: src/language/stats/jonckheere-terpstra.c:371 msgid "Mean J-T Statistic" msgstr "Estadístico J-T medio" #: src/language/stats/jonckheere-terpstra.c:372 msgid "Std. Deviation of J-T Statistic" msgstr "Desviación Estándar del estadístico J-T" #: src/language/stats/jonckheere-terpstra.c:373 msgid "Std. J-T Statistic" msgstr "Estadístico J-T estándar" #: src/language/stats/mann-whitney.c:187 src/language/stats/wilcoxon.c:246 msgid "Sum of Ranks" msgstr "Suma de Rangos" #: src/language/stats/mann-whitney.c:248 msgid "Mann-Whitney U" msgstr "U de Mann-Whitney" #: src/language/stats/mann-whitney.c:249 msgid "Wilcoxon W" msgstr "W de Wilcoxon" #: src/language/stats/mann-whitney.c:250 src/language/stats/runs.c:327 #: src/language/stats/wilcoxon.c:283 msgid "Z" msgstr "Z" #: src/language/stats/means.c:702 msgid "Included" msgstr "Incluido" #: src/language/stats/means.c:704 src/language/stats/reliability.c:548 msgid "Excluded" msgstr "Excluido" #: src/language/stats/means.c:753 msgid "Report" msgstr "Informe" #: src/language/stats/means.c:838 #, fuzzy, c-format #| msgid "" #| "Dependent variable %s has no non-missing values. No analysis for this " #| "variable will be done." msgid "" "The table \"%s\" has no non-empty control variables. No result for this " "table will be displayed." msgstr "" "La variable dependiente %s carece de valores no-perdidos. No se realiza " "ningún análisis para tal variable." #: src/language/stats/means-calc.c:443 msgid "Group Median" msgstr "Mediana de Grupo" #: src/language/stats/means-calc.c:455 msgid "First" msgstr "Primero" #: src/language/stats/means-calc.c:456 msgid "Last" msgstr "Último" #: src/language/stats/means-calc.c:458 msgid "Percent N" msgstr "Porcentaje N" #: src/language/stats/means-calc.c:459 msgid "Percent Sum" msgstr "Porcentaje Suma" #: src/language/stats/means-calc.c:461 msgid "Harmonic Mean" msgstr "Media Armónica" #: src/language/stats/means-calc.c:462 msgid "Geom. Mean" msgstr "Media Geom." #: src/language/stats/mcnemar.c:144 msgid "The McNemar test is appropriate only for dichotomous variables" msgstr "La prueba de McNemar es apropiada sólo para variables dicotómicas" #: src/language/stats/mcnemar.c:226 src/language/stats/sign.c:105 msgid "Point Probability" msgstr "Punto de Probabilidad" #: src/language/stats/mcnemar.c:229 src/language/stats/sign.c:78 #: src/language/stats/sign.c:108 src/language/stats/t-test-paired.c:199 #: src/language/stats/t-test-paired.c:257 src/language/stats/wilcoxon.c:253 #: src/language/stats/wilcoxon.c:292 #, fuzzy #| msgid "Pair %d" msgid "Pairs" msgstr "Pareja %d" #: src/language/stats/median.c:316 msgid "> Median" msgstr "> Mediana" #: src/language/stats/median.c:316 msgid "≤ Median" msgstr "≤ Mediana" #: src/language/stats/npar.c:536 #, c-format msgid "%s subcommand not currently implemented." msgstr "Actualmente el subcomando %s no está implementado." #: src/language/stats/npar.c:691 #, c-format msgid "Expecting %s, %s, %s or a number." msgstr "Se espera %s, %s, ,%s, o un número." #: src/language/stats/npar.c:845 #, c-format msgid "" "The specified value of HI (%d) is lower than the specified value of LO (%d)" msgstr "" "El valor especificado para HI (%d) es menor que el especificado para LO (%d)" #: src/language/stats/npar.c:897 #, c-format msgid "" "%d expected values were given, but the specified range (%d-%d) requires " "exactly %d values." msgstr "" "Se han proporcionado %d valores esperados, pero el intervalo especificado " "(%d-%d) requiere exactamente %d valores." #: src/language/stats/npar.c:1118 src/language/stats/t-test-parser.c:173 #, c-format msgid "" "PAIRED was specified but the number of variables preceding WITH (%zu) did " "not match the number following (%zu)." msgstr "" "Se ha especificado PAIRED pero el número de variables antes de WITH (%zu) no " "coincide con el número de variables posterior (%zu)." #: src/language/stats/oneway.c:361 msgid "LSD" msgstr "LSD" #: src/language/stats/oneway.c:362 src/ui/gui/oneway.ui:338 msgid "Tukey HSD" msgstr "Tukey HSD" #: src/language/stats/oneway.c:363 src/ui/gui/oneway.ui:253 msgid "Bonferroni" msgstr "Bonferroni" #: src/language/stats/oneway.c:364 src/ui/gui/oneway.ui:304 msgid "Scheffé" msgstr "Scheffé" #: src/language/stats/oneway.c:365 msgid "Games-Howell" msgstr "Games-Howell" #: src/language/stats/oneway.c:366 src/ui/gui/oneway.ui:321 msgid "Šidák" msgstr "Šidák" #: src/language/stats/oneway.c:519 #, c-format msgid "The post hoc analysis method %s is not supported." msgstr "El método post-hoc de análisis %s no está implementado." #: src/language/stats/oneway.c:842 #, c-format msgid "" "Dependent variable %s has no non-missing values. No analysis for this " "variable will be done." msgstr "" "La variable dependiente %s carece de valores no-perdidos. No se realiza " "ningún análisis para tal variable." #: src/language/stats/oneway.c:924 #, c-format msgid "" "In contrast list %zu, the number of coefficients (%zu) does not equal the " "number of groups (%d). This contrast list will be ignored." msgstr "" "En la lista de contrate %zu, el número de coeficientes (%zu) difiere del " "numero de grupos (%d). Se ignora esta lista de contraste." #: src/language/stats/oneway.c:936 #, c-format msgid "Coefficients for contrast %zu do not total zero" msgstr "Los coeficientes para contrastar %zu no suman cero" #: src/language/stats/oneway.c:971 msgid "ANOVA" msgstr "ANOVA" #: src/language/stats/oneway.c:974 src/language/stats/regression.c:1024 msgid "Sum of Squares" msgstr "Suma de Cuadrados" #: src/language/stats/oneway.c:981 msgid "Between Groups" msgstr "Entre Grupos" #: src/language/stats/oneway.c:981 msgid "Within Groups" msgstr "Intra Grupos" #: src/language/stats/oneway.c:1075 src/language/stats/oneway.c:1257 #, fuzzy #| msgid "_Dependent Variable" msgid "Dependent Variable" msgstr "Variable _Dependiente" #: src/language/stats/oneway.c:1148 msgid "Test of Homogeneity of Variances" msgstr "Prueba de Homogeneidad de Varianzas" #: src/language/stats/oneway.c:1151 msgid "Levene Statistic" msgstr "Estadístico de Levene" #: src/language/stats/oneway.c:1152 msgid "df1" msgstr "df1" #: src/language/stats/oneway.c:1153 msgid "df2" msgstr "df2" #: src/language/stats/oneway.c:1192 msgid "Contrast Coefficients" msgstr "Coeficientes de Contraste" #: src/language/stats/oneway.c:1199 src/language/stats/oneway.c:1246 msgid "Contrast" msgstr "Contraste" #: src/language/stats/oneway.c:1236 msgid "Contrast Tests" msgstr "Pruebas de contrate" #: src/language/stats/oneway.c:1239 msgid "Value of Contrast" msgstr "Valor de contraste" #: src/language/stats/oneway.c:1241 src/language/stats/regression.c:905 #: src/language/stats/t-test-indep.c:266 #: src/language/stats/t-test-one-sample.c:74 #: src/language/stats/t-test-paired.c:252 msgid "t" msgstr "t" #: src/language/stats/oneway.c:1252 msgid "Assumption" msgstr "" #: src/language/stats/oneway.c:1253 msgid "Assume equal variances" msgstr "Se asume igualdad de varianzas" #: src/language/stats/oneway.c:1254 #, fuzzy #| msgid "Does not assume equal" msgid "Does not assume equal variances" msgstr "No se asume igualdad" #: src/language/stats/oneway.c:1367 #, c-format msgid "Multiple Comparisons (%s)" msgstr "Múltiples Comparaciones (%s)" #: src/language/stats/oneway.c:1374 #, fuzzy #| msgid "Mean Difference" msgid "Mean Difference (I - J)" msgstr "Diferencia Media" #: src/language/stats/oneway.c:1379 #, c-format msgid "%g%% Confidence Interval" msgstr "Intervalo de Confianza del %g%%" #: src/language/stats/oneway.c:1386 src/language/stats/oneway.c:1390 msgid "(J) Family" msgstr "" #: src/language/stats/oneway.c:1406 #, fuzzy #| msgid "Runs Test" msgid "Test" msgstr "Ejecuta Test" #: src/language/stats/quick-cluster.c:576 msgid "Initial Cluster Centers" msgstr "Centros de Agrupaciones Iniciales" #: src/language/stats/quick-cluster.c:577 msgid "Final Cluster Centers" msgstr "Centros de Agrupaciones Finales" #: src/language/stats/quick-cluster.c:580 #: src/language/stats/quick-cluster.c:660 #: src/language/stats/quick-cluster.c:661 #: src/language/stats/quick-cluster.c:753 msgid "Cluster" msgstr "Agrupaciones" #: src/language/stats/quick-cluster.c:658 msgid "Cluster Membership" msgstr "Pertenencia a Agrupación" #: src/language/stats/quick-cluster.c:744 msgid "Number of Cases in each Cluster" msgstr "Número de casos en cada Agrupación" #: src/language/stats/quick-cluster.c:750 #, fuzzy #| msgid "Cluster" msgid "Clusters" msgstr "Agrupaciones" #: src/language/stats/quick-cluster.c:867 #: src/language/stats/quick-cluster.c:893 #, fuzzy, c-format #| msgid "Variable %s already exists." msgid "A variable called `%s' already exists." msgstr "La variable %s ya existe." #: src/language/stats/quick-cluster.c:908 #, c-format msgid "Expecting %s or %s." msgstr "Esperando %s o bien %s." #: src/language/stats/quick-cluster.c:928 msgid "The number of clusters must be positive" msgstr "El número de agrupaciones debe ser positivo" #: src/language/stats/quick-cluster.c:944 #, fuzzy #| msgid "The convergence criterium must be positive" msgid "The convergence criterion must be positive" msgstr "El criterio de convergencia debe ser positivo" #: src/language/stats/quick-cluster.c:960 msgid "The number of iterations must be positive" msgstr "El número de interacciones debe ser positivo" #: src/language/stats/rank.c:205 #, c-format msgid "" "Cannot generate variable name for ranking %s with %s. All candidates in use." msgstr "" "No se puede crear un nombre de variable para rango %s con %s. Todos los " "candidatos están en uso." #: src/language/stats/rank.c:321 #, c-format msgid "Too many variables in %s clause." msgstr "Demasiadas variables en la cláusula %s." #: src/language/stats/rank.c:323 #, c-format msgid "Variable %s already exists." msgstr "La variable %s ya existe." #: src/language/stats/rank.c:325 src/language/expressions/evaluate.c:164 #, c-format msgid "Duplicate variable name %s." msgstr "Nombre de la variable %s duplicado." #: src/language/stats/rank.c:631 #, c-format msgid "%s of %s by %s" msgstr "%s de %s para %s" #: src/language/stats/rank.c:825 #, fuzzy #| msgid "Variables Created By %s" msgid "Variables Created by RANK" msgstr "Variables creadas por %s" #: src/language/stats/rank.c:828 src/language/stats/rank.c:829 #, fuzzy #| msgid "Name Variable:" msgid "New Variable" msgstr "Nombre de Variable:" #: src/language/stats/rank.c:829 #, fuzzy #| msgid "Function: " msgid "Function" msgstr "Función: " #: src/language/stats/rank.c:830 #, fuzzy #| msgid "Extraction" msgid "Fraction" msgstr "Extracción" #: src/language/stats/rank.c:830 #, fuzzy #| msgid "_Grouping Variable:" msgid "Grouping Variables" msgstr "Variable de a_grupación:" #: src/language/stats/rank.c:833 src/language/stats/rank.c:834 #, fuzzy #| msgid "_Test Variable:" msgid "Existing Variable" msgstr "Variable de prueba:" #: src/language/stats/reliability.c:164 msgid "Reliability on a single variable is not useful." msgstr "El análisis factorial para una única variable es inútil." #: src/language/stats/reliability.c:281 msgid "" "The STATISTICS subcommand is not yet implemented. No statistics will be " "produced." msgstr "" "El sub-comando STATISTICSaún no está implementado. No se generara ningún " "estadístico." #: src/language/stats/reliability.c:300 msgid "The split point must be less than the number of variables" msgstr "El punto de división debe ser menor que el número de variables." #: src/language/stats/reliability.c:525 #, c-format msgid "Scale: %s" msgstr "Escala: %s" #: src/language/stats/reliability.c:582 msgid "Item-Total Statistics" msgstr "Estadísticas de total de Ítems" #: src/language/stats/reliability.c:585 msgid "Scale Mean if Item Deleted" msgstr "Escalar la mediana si se borra el elemento" #: src/language/stats/reliability.c:586 msgid "Scale Variance if Item Deleted" msgstr "Escalar la varianza si se borra el elemento" #: src/language/stats/reliability.c:587 msgid "Corrected Item-Total Correlation" msgstr "Correlación total-ítem corregida" #: src/language/stats/reliability.c:588 msgid "Cronbach's Alpha if Item Deleted" msgstr "Alfa de Cronbach si se borra el elemento" #: src/language/stats/reliability.c:627 msgid "Reliability Statistics" msgstr "Estadísticas de fiabilidad" #: src/language/stats/reliability.c:634 src/language/stats/reliability.c:646 msgid "Cronbach's Alpha" msgstr "Alfa de Cronbach" #: src/language/stats/reliability.c:635 src/language/stats/reliability.c:649 #: src/language/stats/reliability.c:652 msgid "N of Items" msgstr "N de elementos" #: src/language/stats/reliability.c:647 msgid "Part 1" msgstr "Parte 1" #: src/language/stats/reliability.c:650 msgid "Part 2" msgstr "Parte 2" #: src/language/stats/reliability.c:654 msgid "Total N of Items" msgstr "N total de elementos" # #: src/language/stats/reliability.c:656 msgid "Correlation Between Forms" msgstr "Correlación entre formas" #: src/language/stats/reliability.c:659 msgid "Spearman-Brown Coefficient" msgstr "Coeficiente de Spearman-Brown" #: src/language/stats/reliability.c:660 msgid "Equal Length" msgstr "Ancho igual" #: src/language/stats/reliability.c:661 msgid "Unequal Length" msgstr "Ancho desigual" #: src/language/stats/reliability.c:663 msgid "Guttman Split-Half Coefficient" msgstr "Coeficiente Guttman de División en Mitades" #: src/language/stats/roc.c:966 msgid "Area Under the Curve" msgstr "Área Bajo la Curva" #: src/language/stats/roc.c:970 msgid "Area" msgstr "Área" #: src/language/stats/roc.c:976 msgid "Asymptotic Sig." msgstr "Sig. Asintótica" #: src/language/stats/roc.c:979 #, c-format msgid "Asymp. %g%% Confidence Interval" msgstr "Asymp. %g%% Intervalo de Confianza" #: src/language/stats/roc.c:987 msgid "Variable under test" msgstr "Variable a prueba" #: src/language/stats/roc.c:1026 msgid "Case Summary" msgstr "Resumen del Caso" #: src/language/stats/roc.c:1030 msgid "Unweighted" msgstr "No ponderado" #: src/language/stats/roc.c:1031 msgid "Weighted" msgstr "Ponderado" #: src/language/stats/roc.c:1064 msgid "Coordinates of the Curve" msgstr "Coordenadas de la Curva" #: src/language/stats/roc.c:1068 msgid "Positive if greater than or equal to" msgstr "Positivo si es mayor o igual a" #: src/language/stats/roc.c:1069 src/output/charts/roc-chart-cairo.c:38 msgid "Sensitivity" msgstr "Sensibilidad" #: src/language/stats/roc.c:1069 src/output/charts/roc-chart-cairo.c:37 msgid "1 - Specificity" msgstr "1 - Especificidad" #: src/language/stats/roc.c:1072 #, fuzzy #| msgid "ordinary" msgid "Coordinates" msgstr "ordinaria" #: src/language/stats/roc.c:1076 msgid "Test variable" msgstr "Variable de prueba" #: src/language/stats/regression.c:224 src/language/stats/regression.c:229 #, c-format msgid "VARIABLES may not appear after %s" msgstr "VARIABLES no puede aparecer después de %s" #: src/language/stats/regression.c:412 msgid "" "REGRESSION with SAVE ignores TEMPORARY. Temporary transformations will be " "made permanent." msgstr "" "REGRESSION con SAVE ignora TEMPORARY. Las transformaciones temporales serán " "permanentes." #: src/language/stats/regression.c:416 msgid "REGRESSION with SAVE ignores FILTER. All cases will be processed." msgstr "REGRESSION con SAVE ignora TEMPORARY. Se procesarán todos los casos." #: src/language/stats/regression.c:569 msgid "" "The dependent variable is equal to the independent variable. The least " "squares line is therefore Y=X. Standard errors and related statistics may be " "meaningless." msgstr "" "La variable dependiente es igual a la variable independiente. La línea de " "mínimos cuadrados es, por tanto, Y=X. Los errores estándar y los " "estadísticos relacionados podrían ser irrelevantes." #: src/language/stats/regression.c:776 msgid "No valid data found. This command was skipped." msgstr "No se han encontrado datos válidos. Se ignora esta orden." #: src/language/stats/regression.c:863 #, c-format msgid "Model Summary (%s)" msgstr "Resumen del modelo (%s)" #: src/language/stats/regression.c:868 #: src/ui/gui/psppire-dialog-action-regression.c:42 msgid "R" msgstr "R" #: src/language/stats/regression.c:868 msgid "R Square" msgstr "R Cuadrada" #: src/language/stats/regression.c:868 msgid "Adjusted R Square" msgstr "R Cuadrada Ajustada" #: src/language/stats/regression.c:869 msgid "Std. Error of the Estimate" msgstr "Error estándar del Estimador" #: src/language/stats/regression.c:895 #, c-format msgid "Coefficients (%s)" msgstr "Coeficientes (%s)" #: src/language/stats/regression.c:901 msgid "Unstandardized Coefficients" msgstr "Coeficientes No Estandarizados" #: src/language/stats/regression.c:904 msgid "Standardized Coefficients" msgstr "Coeficientes Estandarizados" #: src/language/stats/regression.c:904 msgid "Beta" msgstr "Beta" #: src/language/stats/regression.c:911 #, c-format msgid "%g%% Confidence Interval for B" msgstr "Intervalo de Confianza %g%% para B" #: src/language/stats/regression.c:919 #, fuzzy #| msgid "Reliability Statistics" msgid "Collinearity Statistics" msgstr "Estadísticas de fiabilidad" #: src/language/stats/regression.c:920 #, fuzzy #| msgid "Covariance" msgid "Tolerance" msgstr "Covarianza" #: src/language/stats/regression.c:920 msgid "VIF" msgstr "" #: src/language/stats/regression.c:933 msgid "(Constant)" msgstr "(Constant)" #: src/language/stats/regression.c:1020 #, c-format msgid "ANOVA (%s)" msgstr "ANOVA (%s)" #: src/language/stats/regression.c:1031 src/ui/gui/regression.ui:24 msgid "Regression" msgstr "Regresión" #: src/language/stats/regression.c:1075 #, c-format msgid "Coefficient Correlations (%s)" msgstr "Correlaciones entre Coeficientes (%s)" #: src/language/stats/regression.c:1082 #, fuzzy #| msgid "Model" msgid "Models" msgstr "Modelo" #: src/language/stats/regression.c:1090 msgid "Covariances" msgstr "Covarianza" #: src/language/stats/runs.c:169 #, c-format msgid "" "Multiple modes exist for variable `%s'. Using %.*g as the threshold value." msgstr "" "Existen múltiples modas para la variable `%s'. Se utiliza %.*g como valor " "de umbral." #: src/language/stats/runs.c:314 src/ui/gui/runs.ui:24 msgid "Runs Test" msgstr "Ejecuta Test" #: src/language/stats/runs.c:319 msgid "Test Value" msgstr "Valor del Test" #: src/language/stats/runs.c:320 msgid "Test Value (mode)" msgstr "Valor de Test (moda)" #: src/language/stats/runs.c:321 msgid "Test Value (mean)" msgstr "Valor de Test (media)" #: src/language/stats/runs.c:322 msgid "Test Value (median)" msgstr "Valor de Test (mediana)" #: src/language/stats/runs.c:323 msgid "Cases < Test Value" msgstr "Casos < Valor de Test" #: src/language/stats/runs.c:324 msgid "Cases ≥ Test Value" msgstr "Casos ≥ Valor de Prueba" #: src/language/stats/runs.c:325 msgid "Total Cases" msgstr "Casos Totales" #: src/language/stats/runs.c:326 msgid "Number of Runs" msgstr "Número de ejecuciones" #: src/language/stats/sign.c:72 #, fuzzy #| msgid "Mean Difference" msgid "Differences" msgstr "Diferencia Media" #: src/language/stats/sign.c:73 msgid "Negative Differences" msgstr "Diferencias Negativas" #: src/language/stats/sign.c:74 msgid "Positive Differences" msgstr "Diferencias Positivas" #: src/language/stats/sign.c:75 src/language/stats/wilcoxon.c:250 msgid "Ties" msgstr "Vínculos" #: src/language/stats/sort-cases.c:63 msgid "Buffer limit must be at least 2." msgstr "El límite de la memoria intermedia debe ser al menos de 2." #: src/language/stats/sort-criteria.c:89 #, c-format msgid "Variable %s specified twice in sort criteria." msgstr "La variable %s se especifica dos veces en los criterios de ordenación." #: src/language/stats/t-test-indep.c:190 msgid "Group Statistics" msgstr "Estadísticas de grupo" #: src/language/stats/t-test-indep.c:200 #, fuzzy #| msgid "Group1" msgid "Group" msgstr "Grupo 1" #: src/language/stats/t-test-indep.c:256 msgid "Independent Samples Test" msgstr "Prueba para muestras independientes" #: src/language/stats/t-test-indep.c:261 msgid "Levene's Test for Equality of Variances" msgstr "Prueba de Levene para la igualdad de varianzas" #: src/language/stats/t-test-indep.c:265 #, fuzzy #| msgid "t-test for Equality of Means" msgid "T-Test for Equality of Means" msgstr "Prueba T para la Igualdad de Medias" #: src/language/stats/t-test-indep.c:269 #: src/language/stats/t-test-one-sample.c:77 msgid "Mean Difference" msgstr "Diferencia Media" #: src/language/stats/t-test-indep.c:270 msgid "Std. Error Difference" msgstr "Err.Est. de la Diferencia" #: src/language/stats/t-test-indep.c:273 #, fuzzy, no-c-format #| msgid "%g%% Confidence Interval of the Difference" msgid "95% Confidence Interval of the Difference" msgstr "Intervalo de confianza %g%% de la Diferencia" #: src/language/stats/t-test-indep.c:277 #, fuzzy #| msgid "Options" msgid "Assumptions" msgstr "Opciones" #: src/language/stats/t-test-indep.c:278 msgid "Equal variances assumed" msgstr "Se asume igualdad de varianzas" #: src/language/stats/t-test-indep.c:279 msgid "Equal variances not assumed" msgstr "Igualdad de varianzas no asumida" #: src/language/stats/t-test-one-sample.c:64 msgid "One-Sample Test" msgstr "Prueba de una muestra" #: src/language/stats/t-test-one-sample.c:71 #, fuzzy, c-format #| msgid "Test Value = %f" msgid "Test Value = %.*g" msgstr "Valor de prueba = %f" #: src/language/stats/t-test-one-sample.c:80 #: src/language/stats/t-test-paired.c:246 #, c-format msgid "%g%% Confidence Interval of the Difference" msgstr "Intervalo de confianza %g%% de la Diferencia" #: src/language/stats/t-test-one-sample.c:122 msgid "One-Sample Statistics" msgstr "Estadísticas de una muestra" #: src/language/stats/t-test-paired.c:147 msgid "Paired Sample Statistics" msgstr "Estadísticas de muestras emparejadas" #: src/language/stats/t-test-paired.c:163 #: src/language/stats/t-test-paired.c:205 #: src/language/stats/t-test-paired.c:263 #, fuzzy, c-format #| msgid "Pair %d" msgid "Pair %zu" msgstr "Pareja %d" #: src/language/stats/t-test-paired.c:190 msgid "Paired Samples Correlations" msgstr "Correlaciones de muestras emparejadas" #: src/language/stats/t-test-paired.c:208 #, c-format msgid "%s & %s" msgstr "%s & %s" #: src/language/stats/t-test-paired.c:234 msgid "Paired Samples Test" msgstr "Prueba de muestras emparejadas" #: src/language/stats/t-test-paired.c:240 msgid "Paired Differences" msgstr "Diferencias emparejadas" #: src/language/stats/t-test-paired.c:266 #, c-format msgid "%s - %s" msgstr "%s - %s" #: src/language/stats/t-test-parser.c:133 #, c-format msgid "When applying %s to a string variable, two values must be specified." msgstr "" "Cuando se aplica %s a una variable alfabética, se deben especificar dos " "valores." #: src/language/stats/t-test-parser.c:145 #: src/language/stats/t-test-parser.c:241 #, c-format msgid "%s subcommand may not be used with %s." msgstr "La suborden %s no puede ser utilizada con %s." #: src/language/stats/t-test-parser.c:305 msgid "Exactly one of TESTVAL, GROUPS and PAIRS subcommands must be specified." msgstr "" "Debe especificarse sólo uno de los subcomandos TESTVAL, GROUPS y PAIRS." #: src/language/stats/wilcoxon.c:248 #, fuzzy #| msgid "_Sign" msgid "Sign" msgstr "_Signo" #: src/language/stats/wilcoxon.c:249 msgid "Negative Ranks" msgstr "Rangos Negativos" #: src/language/stats/wilcoxon.c:249 msgid "Positive Ranks" msgstr "Rangos Positivos" #: src/language/stats/wilcoxon.c:296 #, fuzzy #| msgid "Too many pairs to calculate exact significance." msgid "Too many pairs to calculate exact significance" msgstr "Demasiados pares para calcular la significatividad exacta." #: src/language/data-io/combine-files.c:214 msgid "Cannot specify the active dataset since none has been defined." msgstr "" "No se puede especificar el fichero de datos activo ya que ningún fichero " "activo ha sido definido." #: src/language/data-io/combine-files.c:220 msgid "" "This command may not be used after TEMPORARY when the active dataset is an " "input source. Temporary transformations will be made permanent." msgstr "" "Este comando no puede ser utilizado después de TEMPORARY cuando el archivo " "de datos activo es una fuente de entrada. Las transformaciones temporales " "serán permanentes." #: src/language/data-io/combine-files.c:255 msgid "Multiple IN subcommands for a single FILE or TABLE." msgstr "Múltiples subcomandos IN para un único FILE o TABLE." #: src/language/data-io/combine-files.c:308 #, c-format msgid "File %s lacks BY variable %s." msgstr "El archivo %s no tiene variable BY %s." #: src/language/data-io/combine-files.c:311 #, c-format msgid "Active dataset lacks BY variable %s." msgstr "Archivo de datos activo no tiene BY variable %s." #: src/language/data-io/combine-files.c:388 #: src/language/data-io/combine-files.c:393 #, c-format msgid "BY is required when %s is specified." msgstr "BY es necesario cuando se especifica %s." #: src/language/data-io/combine-files.c:521 msgid "" "Combining files with incompatible encodings. String data may not be " "represented correctly." msgstr "" "Combinando archivos con codificaciones incompatibles. Los datos de la cadena " "no podrán estar representados correctamente." #: src/language/data-io/combine-files.c:564 #, c-format msgid "" "Variable %s in file %s has different type or width from the same variable in " "earlier file." msgstr "" "La variable %s en el archivo %s es de tipo o tamaño diferente respecto de la " "misma variable en un archivo anterior." #: src/language/data-io/combine-files.c:570 #, c-format msgid "In file %s, %s is numeric." msgstr "En el archivo %s, %s es numérico." #: src/language/data-io/combine-files.c:573 #, c-format msgid "In file %s, %s is a string variable with width %d." msgstr "En el archivo %s, %s es una variable de cadena con ancho %d." #: src/language/data-io/combine-files.c:578 #, c-format msgid "In an earlier file, %s was numeric." msgstr "En un archivo anterior, %s era numérico." #: src/language/data-io/combine-files.c:581 #, c-format msgid "In an earlier file, %s was a string variable with width %d." msgstr "" "En un archivo anterior, %s era una variable de cadena con un tamaño de %d." #: src/language/data-io/combine-files.c:621 #, c-format msgid "" "Variable name %s specified on %s subcommand duplicates an existing variable " "name." msgstr "" "Nombre de la variable %s especificado en el subcomando %s duplica el nombre " "de la variable existente." #: src/language/data-io/combine-files.c:793 #, c-format msgid "Encountered %zu sets of duplicate cases in the master file." msgstr "Encontrados %zu conjuntos de casos duplicados en el archivo principal." #: src/language/data-io/data-list.c:129 src/language/data-io/data-list.c:144 #, fuzzy, c-format #| msgid "The %s value must be nonnegative." msgid "The %s value must be non-negative." msgstr "El valor %s debe ser no-negativo." #: src/language/data-io/data-list.c:154 #, c-format msgid "The %s subcommand may only be used within %s." msgstr "El subcomando %s sólo puede ser utilizado dentro de %s." #: src/language/data-io/data-list.c:159 #, c-format msgid "The %s subcommand may only be specified once." msgstr "El subcomando %s sólo puede ser especificado una vez." #: src/language/data-io/data-list.c:197 msgid "Only one of FIXED, FREE, or LIST may be specified." msgstr "Sólo uno de FIXED, FREE, o LIST puede ser especificado." #: src/language/data-io/data-list.c:260 msgid "Encoding should not be specified for inline data. It will be ignored." msgstr "" "La codificación no debe ser especificada por los datos en línea. Será " "ignorada." #: src/language/data-io/data-list.c:269 #, c-format msgid "The %s subcommand may be used only with %s." msgstr "El subcomando %s sólo puede utilizarse con %s." #: src/language/data-io/data-list.c:284 src/language/data-io/matrix-data.c:578 msgid "At least one variable must be specified." msgstr "Al menos una variable debe ser especificada." #: src/language/data-io/data-list.c:383 src/language/data-io/data-list.c:491 #: src/language/data-io/get-data.c:662 #, c-format msgid "%s is a duplicate variable name." msgstr "%s es un nombre de variable duplicado." #: src/language/data-io/data-list.c:390 #, c-format msgid "There is already a variable %s of a different type." msgstr "Ya existe una variable %s de diferente tipo." #: src/language/data-io/data-list.c:397 #, c-format msgid "There is already a string variable %s of a different width." msgstr "Existe ya una variable de cadena %s con ancho diferente." #: src/language/data-io/data-list.c:405 #, c-format msgid "Cannot place variable %s on record %d when RECORDS=%d is specified." msgstr "" "No se puede poner la variable %s en el registro %d cuando RECORDS=%d está " "especificado." #: src/language/data-io/data-parser.c:453 #: src/language/data-io/data-parser.c:462 msgid "Quoted string extends beyond end of line." msgstr "La cadena entre comillas se extiende más allá del final de línea." #: src/language/data-io/data-parser.c:488 msgid "Missing delimiter following quoted string." msgstr "Falta delimitador detrás de una cadena entrecomillada." #: src/language/data-io/data-parser.c:506 #, c-format msgid "Data for variable %s is not valid as format %s: %s" msgstr "Los datos para la variable %s no es válido como formato %s: %s" #: src/language/data-io/data-parser.c:536 #, c-format msgid "Partial case of %d of %d records discarded." msgstr "Casos parciales de %d de %d registros descartados." #: src/language/data-io/data-parser.c:592 #, c-format msgid "Partial case discarded. The first variable missing was %s." msgstr "Caso parcial descartado. La primera variable que faltaba era %s." #: src/language/data-io/data-parser.c:634 #, c-format msgid "" "Missing value(s) for all variables from %s onward. These will be filled " "with the system-missing value or blanks, as appropriate." msgstr "" "Valor(es) perdido(s) para todas las variables desde %st. Éstos se llenan " "con el valor perdido del sistema o espacios en blanco, según corresponda." #: src/language/data-io/data-parser.c:655 msgid "Record ends in data not part of any field." msgstr "El registro termina con datos que no forman parte de ningún campo." #: src/language/data-io/data-parser.c:670 #, c-format msgid "Reading %d record from %s." msgid_plural "Reading %d records from %s." msgstr[0] "Leyendo %d registro de %s." msgstr[1] "Leyendo %d registros de %s." #: src/language/data-io/data-parser.c:680 src/language/data-io/print.c:435 msgid "Record" msgstr "Registro" #: src/language/data-io/data-parser.c:680 src/language/data-io/print.c:435 #: src/ui/gui/psppire-var-sheet-header.c:76 msgid "Columns" msgstr "Columnas" #: src/language/data-io/data-parser.c:680 #: src/language/data-io/data-parser.c:725 src/language/data-io/print.c:435 msgid "Format" msgstr "Formato" #: src/language/data-io/data-parser.c:720 #, c-format msgid "Reading free-form data from %s." msgstr "Leyendo datos con formato libre de %s." #. TRANSLATORS: this fragment will be interpolated into #. messages in fh_lock() that identify types of files. #: src/language/data-io/data-reader.c:136 src/language/data-io/data-writer.c:79 msgid "data file" msgstr "archivo de datos" #: src/language/data-io/data-reader.c:160 #, c-format msgid "Could not open `%s' for reading as a data file: %s." msgstr "" "No se ha podido abrir `%s' para la lectura como un archivo de datos: %s." #: src/language/data-io/data-reader.c:174 #, c-format msgid "Could not read `%s' as a text file with encoding `%s': %s." msgstr "" "No se ha podido leer `%s' como archivo de texto con codificación `%s': %s." #: src/language/data-io/data-reader.c:233 #, c-format msgid "" "Missing %s while reading inline data. This probably indicates a missing or " "incorrectly formatted %s command. %s must appear by itself on a single line " "with exactly one space between words." msgstr "" "Falta %s durante la lectura de datos en línea. Esto probablemente indica " "una pérdida o formato erróneo del comando %s. %s debe aparecer por sí misma " "en una sola línea con exactamente un espacio entre las palabras." #: src/language/data-io/data-reader.c:253 #: src/language/data-io/data-reader.c:387 #, c-format msgid "Error reading file %s: %s." msgstr "Se ha producido un error al leer el archivo %s: %s." #: src/language/data-io/data-reader.c:261 #, c-format msgid "Unexpected end of file in partial record reading %s." msgstr "Final de archivo inesperado en la lectura del registro parcial %s." #: src/language/data-io/data-reader.c:321 #, c-format msgid "Corrupt block descriptor word at offset 0x%lx in %s." msgstr "Palabra descriptiva de bloque dañada en localización 0x%lx en %s." #: src/language/data-io/data-reader.c:322 #, c-format msgid "Corrupt record descriptor word at offset 0x%lx in %s." msgstr "Palabra descriptora de registro dañada en localización 0x%lx en %s." #: src/language/data-io/data-reader.c:335 #, c-format msgid "Corrupt record size at offset 0x%lx in %s." msgstr "Longitud de registro dañada en localización 0x%lx en %s." #: src/language/data-io/data-reader.c:493 msgid "Record exceeds remaining block length." msgstr "El registro excede la longitud del resto de bloques." #: src/language/data-io/data-reader.c:567 #, c-format msgid "Attempt to read beyond end-of-file on file %s." msgstr "Intento de leer más allá del final de archivo en %s." #: src/language/data-io/data-reader.c:570 #, c-format msgid "Attempt to read beyond %s." msgstr "Se intentó de leer más allá de %s." #: src/language/data-io/data-reader.c:733 msgid "" "This command is not valid here since the current input program does not " "access the inline file." msgstr "" "Esta orden no es válida ya que el programa de entrada actual no tiene acceso " "al archivo en línea." #: src/language/data-io/data-writer.c:106 #, c-format msgid "An error occurred while opening `%s' for writing as a data file: %s." msgstr "" "Se ha producido un error al abrir `%s' para escribir en él como un archivo " "de datos: %s." #: src/language/data-io/data-writer.c:224 #, c-format msgid "I/O error occurred writing data file `%s'." msgstr "Error de E/S al escribir los datos del fichero `%s'." #: src/language/data-io/dataset.c:64 #, c-format msgid "There is no dataset named %s." msgstr "No hay ningún archivo de datos llamado %s." #: src/language/data-io/dataset.c:250 #, fuzzy #| msgid "Dataset" msgid "Datasets" msgstr "Archivo de _Datos" #: src/language/data-io/dataset.c:263 msgid "unnamed dataset" msgstr "archivo de datos sin nombre" #: src/language/data-io/file-handle.c:61 #, c-format msgid "" "File handle %s is already defined. Use %s before redefining a file handle." msgstr "" "El manipulador de archivo %s ya está definido. Usar %s antes de redefinir " "un manipulador de archivos." #: src/language/data-io/file-handle.c:241 #, c-format msgid "%s must be specified with %s." msgstr "%s debe ser especificado con %s." #: src/language/data-io/file-handle.c:252 #, c-format msgid "" "The specified file mode requires LRECL. Assuming %zu-character records." msgstr "" "El modo de fichero especificado requiere LRECL. Se asumen registros de %zu " "caracteres." #: src/language/data-io/file-handle.c:256 #, c-format msgid "" "Record length (%d) must be between 1 and %lu bytes. Assuming %zu-character " "records." msgstr "" "El tamaño de registro (%d) debe estar entre 1 y %lu bytes. Se asume %zu-" "registros de carácter." #: src/language/data-io/file-handle.c:300 msgid "file" msgstr "archivo" #: src/language/data-io/file-handle.c:302 msgid "inline file" msgstr "archivo en línea" #: src/language/data-io/file-handle.c:350 msgid "expecting a file name or handle name" msgstr "esperando un nombre de archivo o un manipulador" #: src/language/data-io/file-handle.c:365 #, c-format msgid "Handle for %s not allowed here." msgstr "Aquí no está permitido un manipulador para %s." #: src/language/data-io/get-data.c:108 src/output/measure.c:262 #, c-format msgid "error reading file `%s'" msgstr "error leyendo el archivo `%s'" #: src/language/data-io/get-data.c:127 #, c-format msgid "Unsupported TYPE %s." msgstr "TYPE %s no admitido." #: src/language/data-io/get-data.c:278 msgid "The sheet index must be greater than or equal to 1" msgstr "El índice de hoja debe ser mayor o igual a 1" #: src/language/data-io/get-data.c:285 src/language/data-io/get-data.c:308 #: src/language/data-io/get-data.c:327 #, c-format msgid "%s must be followed by either \"%s\" or \"%s\"." msgstr "%s debe ir d¡seguido por \"%s\" o \"%s\"." #: src/language/data-io/get-data.c:357 #, c-format msgid "" "%s is allowed only with %s arrangement, but %s arrangement was stated or " "implied earlier in this command." msgstr "" "%s sólo se permite con configuración %s, pero previamente en este comando se " "ha establecido la configuración %s." #: src/language/data-io/get-data.c:441 src/language/data-io/get-data.c:479 #, c-format msgid "Value of %s must be 1 or greater." msgstr "Valor de %s debe ser mayor o igual a 1." #: src/language/data-io/get-data.c:504 msgid "" "Ignoring obsolete IMPORTCASES subcommand. (N OF CASES or SAMPLE may be used " "to substitute.)" msgstr "" "Ignorando el subcomando obsoleto IMPORTCASES. (N OF CASES o SAMPLE deben " "usarse como substituto.)" #: src/language/data-io/get-data.c:551 msgid "" "In compatible syntax mode, the QUALIFIER string must contain exactly one " "character." msgstr "" "En el modo de sintaxis compatible, la cadena QUALIFIER debe contener " "exactamente un carácter." #: src/language/data-io/get-data.c:583 #, c-format msgid "" "The record number specified, %ld, is at or before the previous record, %d. " "Data fields must be listed in order of increasing record number." msgstr "" "El número de registro especificado, %ld, es en o antes del registro " "anterior, %d. Los campos de datos deben ser listados en orden incremental " "del número de registro." #: src/language/data-io/get-data.c:592 #, c-format msgid "" "The record number specified, %ld, exceeds the number of records per case " "specified on FIXCASE, %d." msgstr "" "El número de registro especificado, %ld, excede el número de registros para " "casos especificados en FIXCASE, %d." #: src/language/data-io/get.c:132 #, c-format msgid "%s: Data file dictionary has no variables." msgstr "%s: El diccionario de datos del archivo no contiene variables." #: src/language/data-io/inpt-pgm.c:133 #, c-format msgid "Unexpected end-of-file within %s." msgstr "Fina-de-archivo inesperado en %s." #: src/language/data-io/inpt-pgm.c:146 #, c-format msgid "Input program must contain %s or %s." msgstr "El programa de entrada de datos debe contener %s o %s." #: src/language/data-io/inpt-pgm.c:152 msgid "Input program did not create any variables." msgstr "El programa de entrada no creó ninguna variable." #: src/language/data-io/inpt-pgm.c:365 msgid "" "REREAD: Column numbers must be positive finite numbers. Column set to 1." msgstr "" "REREAD: Los números de columna tienen que ser números positivos finitos. La " "columna se establece en 1." #: src/language/data-io/list.c:100 #, fuzzy #| msgid "Dataset" msgid "Data List" msgstr "Archivo de _Datos" #: src/language/data-io/list.c:221 #, c-format msgid "" "The first case (%ld) specified precedes the last case (%ld) specified. The " "values will be swapped." msgstr "" "El primer caso (%ld) especificado precede al último caso (%ld) " "especificado. Los valores se intercambiarán." #: src/language/data-io/list.c:230 #, c-format msgid "" "The first case (%ld) to list is numbered less than 1. The value is being " "reset to 1." msgstr "" "El primer caso (%ld) a listar está numerado como menor que 1. El valor se " "ajusta a 1." #: src/language/data-io/list.c:237 #, c-format msgid "" "The last case (%ld) to list is numbered less than 1. The value is being " "reset to 1." msgstr "" "El último caso (%ld) a listar esta numerado como menor que 1. El valor se " "ajusta a 1." #: src/language/data-io/list.c:244 #, c-format msgid "The step value %ld is less than 1. The value is being reset to 1." msgstr "El valor de paso %ld es menor que 1. El valor se ajusta a 1." #: src/language/data-io/placement-parser.c:96 #, c-format msgid "" "Number of variables specified (%zu) differs from number of variable formats " "(%zu)." msgstr "" "Número de variables especificadas (%zu) difiere del número de formatos de la " "variable (%zu)." #: src/language/data-io/placement-parser.c:106 msgid "" "SPSS-like or Fortran-like format specification expected after variable names." msgstr "" "Después del nombre de las variables se esperan especificaciones en formato " "tipo-SPSS o tipo-Fortran." #: src/language/data-io/placement-parser.c:129 #, c-format msgid "The %d columns %d-%d can't be evenly divided into %zu fields." msgstr "" "Las %d columnas %d-%d no pueden ser uniformemente dividas entre los campos " "%zu." #: src/language/data-io/placement-parser.c:310 msgid "Column positions for fields must be positive." msgstr "Las posiciones de columna para los campos tienen que ser positivas." #: src/language/data-io/placement-parser.c:312 msgid "Column positions for fields must not be negative." msgstr "Las posiciones de columnas para los campos no pueden ser negativas." #: src/language/data-io/placement-parser.c:372 msgid "The ending column for a field must be greater than the starting column." msgstr "" "La columna final de un campo tiene que ser mayor que la columna de inicio." #: src/language/data-io/placement-parser.c:409 #, fuzzy, c-format #| msgid "" #| "The record number specified, %ld, is at or before the previous record, " #| "%d. Data fields must be listed in order of increasing record number." msgid "" "The record number specified, %.0f, is at or before the previous record, %d. " "Data fields must be listed in order of increasing record number." msgstr "" "El número de registro especificado, %ld, es en o antes del registro " "anterior, %d. Los campos de datos deben ser listados en orden incremental " "del número de registro." #: src/language/data-io/print-space.c:127 #, c-format msgid "The expression on %s evaluated to the system-missing value." msgstr "La expresión en %s se evalúa por el sistema de valores perdidos." #: src/language/data-io/print-space.c:130 #, c-format msgid "The expression on %s evaluated to %g." msgstr "La expresión en %s se evalúa en %g." #: src/language/data-io/print.c:189 src/language/data-io/trim.c:58 msgid "expecting a valid subcommand" msgstr "esperando un subcomando válido" #: src/language/data-io/print.c:219 #, c-format msgid "%s is required when binary formats are specified." msgstr "Se requiere %s cuando se especifiquen formatos binarios." #: src/language/data-io/print.c:302 #, c-format msgid "Output calls for %d records but %zu specified on RECORDS subcommand." msgstr "" "Resultados obtenidos para %d registros, pero %zu especificados en el " "subcomando RECORDS." #: src/language/data-io/print.c:432 #, fuzzy #| msgid "Case Processing Summary" msgid "Print Summary" msgstr "Resumen del proceso de casos" #: src/language/data-io/print.c:462 #, fuzzy #| msgid "Record" msgid "N of Records" msgstr "Registro" #: src/language/data-io/matrix-data.c:191 #, c-format msgid "" "There are %d variable declared but the data has at least %d matrix rows." msgstr "" "Hay %d variable declarada pero la matriz de datos tiene al menos %d filas." #: src/language/data-io/matrix-data.c:292 msgid "" "The N subcommand was specified, but a N record was also found in the data. " "The N record will be ignored." msgstr "" "Se especificó el subcomando N, pero también se encontró un registro N en los " "datos. Será ignorado el registro N." #: src/language/data-io/matrix-data.c:488 src/language/utilities/set.q:186 #, c-format msgid "%s must not be negative." msgstr "%s no puedes ser negativo." #: src/language/data-io/matrix-data.c:568 msgid "FORMAT = FULL and FORMAT = NODIAGONAL are mutually exclusive." msgstr "FORMAT = FULL y FORMAT = NODIAGONAL son mutuamente excluyentes." #: src/language/data-io/matrix-reader.c:102 #: src/language/data-io/matrix-reader.c:118 #, c-format msgid "Matrix dataset lacks a variable called %s." msgstr "La matriz de datos no tiene ninguna variable llamada %s." #: src/language/data-io/matrix-reader.c:109 #: src/language/data-io/matrix-reader.c:125 #, c-format msgid "Matrix dataset variable %s should be of string type." msgstr "La variable %s de la matriz de datos debe ser de tipo alfanumérico." #: src/language/data-io/save-translate.c:168 #: src/language/data-io/save-translate.c:183 #, c-format msgid "The %s string must contain exactly one character." msgstr "La cadena %s debe contener exactamente un carácter." #: src/language/data-io/save-translate.c:249 #, c-format msgid "Output file `%s' exists but %s was not specified." msgstr "El archivo de salida `%s' existe pero no ha sido especificado %s." #: src/language/data-io/save.c:309 #, fuzzy #| msgid "The BY subcommand is required." msgid "The OUTFILE or METADATA subcommand is required." msgstr "Se necesita el subcomando BY." #: src/language/data-io/trim.c:69 #, c-format msgid "" "Cannot rename %s as %s because there already exists a variable named %s. To " "rename variables with overlapping names, use a single RENAME subcommand such " "as `/RENAME (A=B)(B=C)(C=A)', or equivalently, `/RENAME (A B C=B C A)'." msgstr "" "No se puede cambiar el nombre %s por %s porque ya existe una variable " "denominada %s. Para renombrar variables con nombres coincidentes, utilice " "un sólo subcomando RENAME como `/RENAME (A=B)(B=C)(C=A)', o " "equivalentemente, `/RENAME (A B C=B C A)'." #: src/language/data-io/trim.c:227 #, c-format msgid "" "Number of variables on left side of `=' (%zu) does not match number of " "variables on right side (%zu), in parenthesized group %d of RENAME " "subcommand." msgstr "" "El número de variables en el lado izquierdo de `=' (%zu) no coincide con el " "número de variables en el lado derecho (%zu), en el grupo entre paréntesis " "%d del subcomando RENAME." #: src/language/data-io/trim.c:242 #, c-format msgid "Requested renaming duplicates variable name %s." msgstr "El renombramiento pedido duplica el nombre de la variable %s." #: src/language/data-io/trim.c:281 msgid "Cannot DROP all variables from dictionary." msgstr "Imposible DROP todas las variables del diccionario." #: src/language/expressions/evaluate.c:151 msgid "expecting number or string" msgstr "esperando número o cadena" #: src/language/expressions/helpers.c:43 msgid "" "One of the arguments to a DATE function is not an integer. The result will " "be system-missing." msgstr "" "Uno de los argumentos para función DATE no es un entero. El resultado será " "perdido por el sistema." #: src/language/expressions/helpers.c:71 msgid "" "The week argument to DATE.WKYR is not an integer. The result will be system-" "missing." msgstr "" "El argumento de semana para DATE.WKYR no es un entero. El resultado será " "perdido del sistema." #: src/language/expressions/helpers.c:77 msgid "" "The week argument to DATE.WKYR is outside the acceptable range of 1 to 53. " "The result will be system-missing." msgstr "" "El argumento de semana para DATE.WKYR está fuera del intervalo aceptable " "entre 1 y 53. El resultado será perdido del sistema." #: src/language/expressions/helpers.c:99 msgid "" "The day argument to DATE.YRDAY is not an integer. The result will be system-" "missing." msgstr "" "El argumento de día para DATE.YRDAY no es un entero. El resultado será " "perdido del sistema." #: src/language/expressions/helpers.c:105 msgid "" "The day argument to DATE.YRDAY is outside the acceptable range of 1 to 366. " "The result will be system-missing." msgstr "" "El argumento de día para DATE.YRDAY está fuera del intervalo aceptable entre " "1 y 366. El resultado será perdido del sistema." #: src/language/expressions/helpers.c:127 msgid "" "The year argument to YRMODA is greater than 47516. The result will be " "system-missing." msgstr "" "El argumento año para YRMODA es más grande que 47516. El resultado será " "perdido del sistema." #: src/language/expressions/helpers.c:180 #, c-format msgid "" "Unrecognized date unit `%.*s'. Valid date units are `%s', `%s', `%s', `%s', " "`%s', `%s', `%s', and `%s'." msgstr "" "Unidad de fecha `%.*s' no reconocida. Las unidades de fecha válidas son `" "%s', `%s', `%s', `%s', `%s', `%s', `%s', y `%s'." #: src/language/expressions/helpers.c:333 #, c-format msgid "Invalid DATESUM method. Valid choices are `%s' and `%s'." msgstr "Método DATESUM inválido. Opciones válidas son `%s' and `%s'." #: src/language/expressions/parse.c:261 #, c-format msgid "" "Type mismatch: expression has %s type, but a numeric value is required here." msgstr "" "Incompatibilidad de tipo: la expresión tiene tipo %s, pero aquí se pide un " "valor numérico." #: src/language/expressions/parse.c:274 #, c-format msgid "" "Type mismatch: expression has %s type, but a string value is required here." msgstr "" "Incompatibilidad de tipo: la expresión tiene tipo %s, pero aquí se pide un " "valor de cadena." #: src/language/expressions/parse.c:436 #, c-format msgid "Type mismatch while applying %s operator: cannot convert %s to %s." msgstr "" "Incompatibilidad de los tipos mientras se aplica el operador %s: no se puede " "convertir %s en %s." #: src/language/expressions/parse.c:650 msgid "" "Chaining relational operators (e.g. `a < b < c') will not produce the " "mathematically expected result. Use the AND logical operator to fix the " "problem (e.g. `a < b AND b < c'). If chaining is really intended, " "parentheses will disable this warning (e.g. `(a < b) < c'.)" msgstr "" "Los operadores relacionales de encadenamiento (p.e. `a < b < c') no " "produciran el resultado esperado matemáticamente. Utilizar el operador " "lógico AND para solucionar el problema (p.e. `a < b AND b < c'). Si el " "encadenamiento es realmente intencionado, los paréntesis desactivaran esta " "alerta (p.e. `(a < b) < c'.)" #: src/language/expressions/parse.c:752 msgid "" "The exponentiation operator (`**') is left-associative, even though right-" "associative semantics are more useful. That is, `a**b**c' equals " "`(a**b)**c', not as `a**(b**c)'. To disable this warning, insert " "parentheses." msgstr "" "El operador de exponenciación (`**') aparece a la izquierda, aunque si " "aparece a la derecha es más útil. Es decir, `a**b**c' equivale a " "`(a**b)**c', no a `a**(b**c)'. Para desactivar esta alerta, insertar " "paréntesis." #: src/language/expressions/parse.c:832 #, c-format msgid "Unknown system variable %s." msgstr "Variable de sistema desconocida %s." #: src/language/expressions/parse.c:880 #, c-format msgid "Unknown identifier %s." msgstr "Identificador desconocido %s." #: src/language/expressions/parse.c:1102 #, c-format msgid "%s must have at least %d arguments in list." msgstr "%s debe tener como mínimo %d argumentos en la lista." #: src/language/expressions/parse.c:1111 #, c-format msgid "%s must have an even number of arguments in list." msgstr "%s tiene que tener un número par de argumentos en la lista." #: src/language/expressions/parse.c:1114 #, c-format msgid "%s must have multiple of %d arguments in list." msgstr "%s tiene que tener un múltiplo de %d argumentos en la lista." #: src/language/expressions/parse.c:1124 #, c-format msgid "%s function does not accept a minimum valid argument count." msgstr "la función %s no acepta un mínimo recuento de argumentos válidos." #: src/language/expressions/parse.c:1133 #, c-format msgid "%s requires at least %d valid arguments in list." msgstr "%s requiere como mínimo %d argumentos válidos en la lista." #: src/language/expressions/parse.c:1139 #, c-format msgid "" "With %s, using minimum valid argument count of %d does not make sense when " "passing only %d arguments in list." msgstr "" "Con %s, no tiene sentido utilizar %d como recuento mínimo de argumento " "válido si se pasan únicamente %d argumentos en la lista." #: src/language/expressions/parse.c:1193 #, c-format msgid "Type mismatch invoking %s as " msgstr "Incompatibilidad de tipo al invocar %s como" #: src/language/expressions/parse.c:1198 msgid "Function invocation " msgstr "Invocación de función" #: src/language/expressions/parse.c:1200 msgid " does not match any known function. Candidates are:" msgstr "no coincide con ninguna función conocida. Los candidatos son:" #: src/language/expressions/parse.c:1230 #, c-format msgid "No function or vector named %s." msgstr "Ninguna función o vector nombrado %s." #: src/language/expressions/parse.c:1292 #, c-format msgid "%s is a PSPP extension." msgstr "%s es una extensión de PSPP." #: src/language/expressions/parse.c:1295 #, c-format msgid "%s is not available in this version of PSPP." msgstr "%s no está disponible en esta versión de PSPP." #: src/language/expressions/parse.c:1302 #, c-format msgid "%s may not appear after %s." msgstr "%s no puede aparecer después de %s." #: src/libpspp/ext-array.c:66 msgid "failed to create temporary file" msgstr "error en crear el archivo temporal" #: src/libpspp/ext-array.c:106 msgid "seeking in temporary file" msgstr "buscando en el archivo temporal" #: src/libpspp/ext-array.c:125 msgid "reading temporary file" msgstr "leyendo archivo temporal" #: src/libpspp/ext-array.c:127 msgid "unexpected end of file reading temporary file" msgstr "final de fichero inesperado en leer el archivo temporal" #: src/libpspp/ext-array.c:147 msgid "writing to temporary file" msgstr "escribiendo en un archivo temporal" #: src/libpspp/i18n.c:1128 msgid "Arabic" msgstr "Arábigo" #: src/libpspp/i18n.c:1130 msgid "Armenian" msgstr "Armenio" #: src/libpspp/i18n.c:1131 msgid "Baltic" msgstr "Báltico" #: src/libpspp/i18n.c:1133 msgid "Celtic" msgstr "Céltico" #: src/libpspp/i18n.c:1134 msgid "Central European" msgstr "Central Europeo" #: src/libpspp/i18n.c:1136 msgid "Chinese Simplified" msgstr "Chino Simplificado" #: src/libpspp/i18n.c:1138 msgid "Chinese Traditional" msgstr "Chino Tradicional" #: src/libpspp/i18n.c:1140 msgid "Croatian" msgstr "Croata" #: src/libpspp/i18n.c:1141 msgid "Cyrillic" msgstr "Cirílico" #: src/libpspp/i18n.c:1143 msgid "Cyrillic/Russian" msgstr "Cirílico/Ruso" #: src/libpspp/i18n.c:1144 msgid "Cyrillic/Ukrainian" msgstr "Cirílico/Ucraniano" #: src/libpspp/i18n.c:1146 msgid "Georgian" msgstr "Georgiano" #: src/libpspp/i18n.c:1147 msgid "Greek" msgstr "Griego" #: src/libpspp/i18n.c:1148 msgid "Gujarati" msgstr "Gujarati" #: src/libpspp/i18n.c:1149 msgid "Gurmukhi" msgstr "Gurmukhi" #: src/libpspp/i18n.c:1150 msgid "Hebrew" msgstr "Hebreo" #: src/libpspp/i18n.c:1152 msgid "Hebrew Visual" msgstr "Hebreo Visual" #: src/libpspp/i18n.c:1153 msgid "Hindi" msgstr "Hindi" #: src/libpspp/i18n.c:1154 msgid "Icelandic" msgstr "Islandés" #: src/libpspp/i18n.c:1155 msgid "Japanese" msgstr "Japonés" #: src/libpspp/i18n.c:1157 msgid "Korean" msgstr "Coreano" #: src/libpspp/i18n.c:1159 msgid "Nordic" msgstr "Nórdico" #: src/libpspp/i18n.c:1160 msgid "Romanian" msgstr "Rumano" #: src/libpspp/i18n.c:1162 msgid "South European" msgstr "Sur Europeo" #: src/libpspp/i18n.c:1163 msgid "Thai" msgstr "Tailandés" #: src/libpspp/i18n.c:1165 msgid "Turkish" msgstr "Turco" #: src/libpspp/i18n.c:1167 msgid "Vietnamese" msgstr "Vietnamita" #: src/libpspp/i18n.c:1169 msgid "Western European" msgstr "Europeo Occidental" #: src/libpspp/message.c:89 #, c-format msgid "%s: %s" msgstr "%s: %s" #: src/libpspp/message.c:113 msgid "error" msgstr "error" #: src/libpspp/message.c:115 msgid "warning" msgstr "aviso" #: src/libpspp/message.c:118 msgid "note" msgstr "anotación" #: src/libpspp/message.c:327 #, c-format msgid "Notes (%d) exceed limit (%d). Suppressing further notes." msgstr "" "Las notas (%d) han superado el límite (%d). Se suprimen las posteriores " "notas." #: src/libpspp/message.c:335 #, c-format msgid "Warnings (%d) exceed limit (%d). Syntax processing will be halted." msgstr "" "Las advertencias (%d) han superado el límite (%d). Se detiene el " "procesamiento de sintaxis." #: src/libpspp/message.c:338 #, c-format msgid "Errors (%d) exceed limit (%d). Syntax processing will be halted." msgstr "" "Los errores (%d) han superado el límite (%d). Se detiene el procesamiento de " "sintaxis." #: src/libpspp/zip-reader.c:202 #, fuzzy, c-format #| msgid "Corrupt file at 0x%llx: Expected %; got %" msgid "%s: corrupt archive at 0x%llx: expected %# but got %#" msgstr "" "Archivo corrompido en 0x%llx: Se esperaba %; se encontró %" #: src/libpspp/zip-reader.c:329 src/libpspp/zip-reader.c:449 #, fuzzy, c-format #| msgid "%s: seek failed (%s)." msgid "%s: open failed (%s)" msgstr "%s: búsqueda fallida (%s)." #: src/libpspp/zip-reader.c:344 #, fuzzy, c-format #| msgid "Cannot find central directory" msgid "%s: cannot find central directory" msgstr "No se pudo encontrar el directorio central" #: src/libpspp/zip-reader.c:353 src/libpspp/zip-reader.c:384 #: src/libpspp/zip-reader.c:468 #, fuzzy, c-format #| msgid "%s: seek failed (%s)." msgid "%s: seek failed (%s)" msgstr "%s: búsqueda fallida (%s)." #: src/libpspp/zip-reader.c:441 #, fuzzy, c-format #| msgid "%s: unknown option `%s'" msgid "%s: unknown member \"%s\"" msgstr "%s: opción desconocida `%s'" #: src/libpspp/zip-reader.c:503 #, fuzzy, c-format #| msgid "" #| "Name mismatch in zip archive. Central directory says `%s'; local file " #| "header says `%s'" msgid "" "%s: name mismatch between central directory (%s) and local file header (%s)" msgstr "" "Nombre incorrecto en archivo zip. El directorio central dice `%s'; la " "cabezera del archivo local dice `%s'" #: src/libpspp/zip-reader.c:696 #, fuzzy, c-format #| msgid "Cannot initialize inflator: %s" msgid "%s: cannot initialize inflator (%s)" msgstr "No se puede inicializar el inflador: %s" #: src/libpspp/zip-reader.c:751 #, fuzzy, c-format #| msgid "Error inflating: %s" msgid "%s: error inflating \"%s\" (%s)" msgstr "Error generando: %s" #: src/libpspp/zip-writer.c:97 utilities/pspp-convert.c:346 #, c-format msgid "%s: error opening output file" msgstr "%s: error abriendo el archivo de resultados" #: src/libpspp/zip-writer.c:169 #, c-format msgid "%s: error seeking in output file" msgstr "%s: error buscando en el archivo de resultados" #: src/libpspp/zip-writer.c:210 msgid "error creating temporary file" msgstr "error creando fichero temporal" #: src/libpspp/zip-writer.c:279 #, c-format msgid "%s: write failed" msgstr "%s: error de escritura" #. TRANSLATORS: This is a format string which, when presented to #. printf like functions, will create a pango markup string to #. display real number in scientific notation. #. #. In its untranslated form, it will display similar to "1.23 x 10^4". You #. can leave it untranslated if this is how scientific notation is usually #. presented in your language. #. #. Some locales (such as German) prefer the centered dot rather than the #. multiplication sign between the mantissa an exponent. In which #. case, you can change "#215;" to "#8901;" or other unicode code #. point as appropriate. #. #. The . in this string does not and should not be changed, since #. that is taken care of by the stdc library. #. #. For information on Pango markup, see #. http://developer.gnome.org/pango/stable/PangoMarkupFormat.html #. #. For tables of unicode code points, see http://unicode.org/charts #. #: src/math/chart-geometry.c:123 #, c-format msgid "%%.%dlf×10%d" msgstr "%%.%dlf×10%d" #: src/math/histogram.c:145 msgid "" "Not creating histogram because the data contains less than 2 distinct values" msgstr "" "No se crea el histograma porque los datos contienen menos de 2 valores " "distintos" #: src/math/percentiles.c:36 msgid "HAverage" msgstr "HAverage" #: src/math/percentiles.c:38 msgid "Rounded" msgstr "Redondeado" #: src/math/percentiles.c:39 msgid "Empirical" msgstr "Empírico" #: src/math/percentiles.c:40 msgid "Empirical with averaging" msgstr "Empírico promediado" #: src/math/shapiro-wilk.c:84 msgid "" "One or more weight values are non-integer. Fractional parts will be ignored " "when calculating the Shapiro-Wilk statistic." msgstr "" #: src/output/ascii.c:340 #, c-format msgid "ascii: opening output file `%s'" msgstr "ascii: abriendo el archivo de resultados `%s'" #: src/output/ascii.c:371 #, c-format msgid "%s: %s must be positive integer or `auto'" msgstr "%s: %s debe ser un entero positivo o `auto'" #: src/output/ascii.c:393 #, fuzzy, c-format #| msgid "" #| "ascii: page excluding margins and headers must be at least %d characters " #| "wide by %d lines long, but as configured is only %d characters by %d lines" msgid "" "ascii: page must be at least %d characters wide, but as configured is only " "%d characters" msgstr "" "ascii: excluyendo los margenes y encabezamientos la página debe tener como " "mínimo %d caracteres de ancho por %d líneas de largo, pero tal como está " "configurada, sólo hay %d caracteres y %d líneas" #: src/output/ascii.c:508 #, c-format msgid "See %s for a chart." msgstr "Ver %s para gráfico." #: src/output/charts/piechart.c:54 msgid "*MISSING*" msgstr "*MISSING*" #: src/output/csv.c:100 src/output/html.c:117 src/output/journal.c:166 #: src/output/msglog.c:68 #, c-format msgid "error opening output file `%s'" msgstr "error abriendo el fichero de resultados `%s'" #: src/output/driver.c:522 #, c-format msgid "%s is not a valid device type (the choices are `%s' and `%s')" msgstr "" "%s no es un tipo de dispositivo válido (las opciones son `%s' and `%s')" #: src/output/driver.c:536 #, c-format msgid "%s: unknown option `%s'" msgstr "%s: opción desconocida `%s'" #: src/output/driver.c:553 #, c-format msgid "%s: output option missing `='" msgstr "%s: falta una opción de resultado `='" #: src/output/driver.c:560 #, c-format msgid "%s: output option specified more than once" msgstr "%s: opción de resultado especificada más de una vez" #: src/output/html.c:129 msgid "PSPP Output" msgstr "Resultado de PSPP" #: src/output/html.c:266 msgid "No description" msgstr "Sin descripción" #: src/output/journal.c:69 #, c-format msgid "error writing output file `%s'" msgstr "error al escribir el fichero de resultados `%s'" #: src/output/measure.c:68 #, c-format msgid "`%s' is not a valid length." msgstr "`%s' no es una longitud válida." #: src/output/measure.c:96 #, c-format msgid "syntax error in paper size `%s'" msgstr "error de sintaxis en la medida de papel `%s'" #: src/output/measure.c:233 #, c-format msgid "unknown paper type `%.*s'" msgstr "tipo de papel desconocido `%.*s'" #: src/output/measure.c:251 #, c-format msgid "error opening input file `%s'" msgstr "error al abrir el fichero de datos `%s'" #: src/output/measure.c:279 #, c-format msgid "file `%s' does not state a paper size" msgstr "el archivo `%s' no indica una medida de papel" #: src/output/options.c:112 #, c-format msgid "%s: `%s' is `%s' but a Boolean value is required" msgstr "%s: `%s' es `%s', pero se requiere un valor Booleano" #: src/output/options.c:187 #, c-format msgid "%s: `%s' is `%s' but one of the following is required: %s" msgstr "%s: `%s' es `%s', pero se requiere uno de los siguientes: %s " #: src/output/options.c:231 #, fuzzy, c-format #| msgid "%s: `%s' is `%s' but a nonnegative integer is required" msgid "%s: `%s' is `%s' but a non-negative integer is required" msgstr "%s: `%s' es `%s', pero se requiere un entero no negativo" #: src/output/options.c:235 #, c-format msgid "%s: `%s' is `%s' but a positive integer is required" msgstr "%s: `%s' es `%s', pero se requiere un entero positivo" #: src/output/options.c:238 #, c-format msgid "%s: `%s' is `%s' but an integer is required" msgstr "%s: `%s' es `%s', pero se requiere un entero" #: src/output/options.c:241 #, c-format msgid "%s: `%s' is `%s' but an integer greater than %d is required" msgstr "%s: `%s' es `%s', pero se requiere un entero mayor que %d" #: src/output/options.c:246 #, c-format msgid "%s: `%s' is `%s' but an integer between %d and %d is required" msgstr "%s: `%s' es `%s', pero se requiere un entero entre %d y %d" #: src/output/options.c:325 #, c-format msgid "%s: `%s' is `%s' but a file name that contains `#' is required." msgstr "" "%s: `%s' es `%s', pero se requiere un nombre de fichero que contenga `#'." #. TRANSLATORS: Do not translate this string. If the script of your language #. reads from right to left (eg Persian, Arabic, Hebrew etc), then replace #. this string with "output-direction-rtl". Otherwise either leave it #. untranslated or copy it verbatim. #: src/output/render.c:994 msgid "output-direction-ltr" msgstr "output-direction-ltr" #: src/output/text-item.c:44 msgid "Page Title" msgstr "" #: src/output/text-item.c:47 #, fuzzy #| msgid "Untitled" msgid "Title" msgstr "Sin título" #: src/output/text-item.c:51 msgid "Log" msgstr "" #: src/output/text-item.c:54 msgid "Page Break" msgstr "" #: src/output/cairo.c:520 #, c-format msgid "`%s': bad font specification" msgstr "`%s': especificación de carácter no válida" #: src/output/cairo.c:744 #, c-format msgid "" "The defined page is not wide enough to hold at least %d characters in the " "default font. In fact, there's only room for %d characters." msgstr "" "La página definida no es suficientemente ancha como para contener al menos " "%d caracteres de la fuente por defecto. De hecho, sólo hay espacio para %d " "caracteres." #: src/output/cairo.c:752 #, c-format msgid "" "The defined page is not long enough to hold at least %d lines in the default " "font. In fact, there's only room for %d lines." msgstr "" "La página definida no es suficientemente larga como para contener al menos " "%d líneas en la fuente por defecto. De hecho, sólo hay espacio para %d " "líneas." #: src/output/cairo.c:837 #, c-format msgid "error opening output file `%s': %s" msgstr "error abriendo el fichero de resultados `%s': %s" #: src/output/cairo.c:892 #, c-format msgid "error drawing output for %s driver: %s" msgstr "error dibujando resultados para el controlador %s: %s" #: src/output/cairo.c:2056 #, c-format msgid "error writing output file `%s': %s" msgstr "Error escribiendo el fichero de resultados `%s': %s." #: src/output/charts/np-plot-cairo.c:37 #, c-format msgid "Normal Q-Q Plot of %s" msgstr "Gráfica Normal Q-Q de %s" #: src/output/charts/np-plot-cairo.c:38 src/output/charts/np-plot-cairo.c:68 msgid "Observed Value" msgstr "Valor Observado" #: src/output/charts/np-plot-cairo.c:39 msgid "Expected Normal" msgstr "Normal Esperada" #: src/output/charts/np-plot-cairo.c:67 #, c-format msgid "Detrended Normal Q-Q Plot of %s" msgstr "Gráfica Normal Q-Q sin tendencias de %s" #: src/output/charts/np-plot-cairo.c:69 msgid "Dev from Normal" msgstr "Desv. de la Normal" #: src/output/charts/barchart-cairo.c:65 msgid "Bar Chart" msgstr "Gráfico de Barras" #: src/output/charts/plot-hist-cairo.c:43 #, c-format msgid "N = %.2f" msgstr "N = %.2f" #: src/output/charts/plot-hist-cairo.c:52 #, c-format msgid "Mean = %.1f" msgstr "Media = %.1f" #: src/output/charts/plot-hist-cairo.c:61 #, c-format msgid "Std. Dev = %.2f" msgstr "Desv Std. = %.2f" #: src/output/charts/plot-hist-cairo.c:110 msgid "HISTOGRAM" msgstr "HISTOGRAM" #: src/output/charts/roc-chart-cairo.c:36 src/ui/gui/roc.ui:24 msgid "ROC Curve" msgstr "Curva ROC" #: src/output/charts/scree-cairo.c:36 msgid "Scree Plot" msgstr "Gráfico de Sedimentación" #: src/output/charts/scree-cairo.c:38 msgid "Eigenvalue" msgstr "Valor-propio" #: src/output/charts/spreadlevel-cairo.c:37 #, c-format msgid "Spread vs. Level Plot of %s" msgstr "Gráfica de Desviación Vs. Nivel para %s" #: src/output/charts/spreadlevel-cairo.c:38 msgid "Level" msgstr "Nivel" #: src/output/charts/spreadlevel-cairo.c:39 msgid "Spread" msgstr "Desviación" #: src/output/charts/scatterplot-cairo.c:57 #, c-format msgid "Scatterplot %s" msgstr "Gráfico de Puntos %s" #: src/output/spv/spv-legacy-decoder.c:2222 msgid "Table lacks cell data." msgstr "" #: src/output/spv/spv-writer.c:68 #, fuzzy, c-format #| msgid "%s: write failed" msgid "%s: create failed" msgstr "%s: error de escritura" #: src/output/spv/spv-writer.c:89 #, fuzzy #| msgid "%s: error writing output file" msgid "I/O error writing SPV file" msgstr "%s: error escribiendo en el archivo de resultados" #: src/output/spv/spv.c:693 #, fuzzy, c-format #| msgid "failed to create temporary file" msgid "%s: Failed to create XML parser" msgstr "error en crear el archivo temporal" #: src/output/spv/spv.c:718 #, c-format msgid "%s: document is not well-formed" msgstr "" #: src/output/spv/spv.c:726 #, c-format msgid "%s: root node is \"%s\" but \"%s\" was expected" msgstr "" #: src/ui/gui/psppire-acr.c:273 msgid "Add" msgstr "Añadir" #: src/ui/gui/psppire-acr.c:274 msgid "Edit" msgstr "_Edita" #: src/ui/gui/psppire-acr.c:275 msgid "Remove" msgstr "Elimina" #: src/ui/gui/psppire-buttonbox.c:311 msgid "OK" msgstr "OK" #: src/ui/gui/psppire-buttonbox.c:319 msgid "Go To" msgstr "Ir a" #: src/ui/gui/psppire-buttonbox.c:327 msgid "Continue" msgstr "Continuar" #: src/ui/gui/psppire-buttonbox.c:339 src/ui/gui/psppire-import-assistant.c:759 msgid "Paste" msgstr "Pegar" #: src/ui/gui/psppire-buttonbox.c:345 #: src/ui/gui/psppire-dialog-action-aggregate.c:216 #: src/ui/gui/psppire-data-window.c:496 src/ui/gui/psppire-data-window.c:624 #: src/ui/gui/psppire-output-window.c:353 #: src/ui/gui/psppire-syntax-window.c:594 src/ui/gui/psppire-window.c:445 #: src/ui/gui/psppire-window.c:628 msgid "Cancel" msgstr "Cancelar" #: src/ui/gui/psppire-buttonbox.c:351 msgid "Close" msgstr "Cerrar" #: src/ui/gui/psppire-buttonbox.c:358 src/ui/gui/psppire-import-assistant.c:760 msgid "Reset" msgstr "Reiniciar" #: src/ui/gui/psppire-buttonbox.c:365 msgid "Help" msgstr "Ayuda" #: src/ui/gui/psppire-dialog-action-aggregate.c:213 msgid "Aggregate destination file" msgstr "Archivo de destino para agregación" #: src/ui/gui/psppire-dialog-action-aggregate.c:217 #: src/ui/gui/psppire-data-window.c:493 src/ui/gui/psppire-data-window.c:497 #: src/ui/gui/psppire-output-window.c:354 #: src/ui/gui/psppire-syntax-window.c:595 src/ui/gui/psppire-window.c:449 #: src/ui/gui/aggregate.ui:565 msgid "Save" msgstr "Guardar" #: src/ui/gui/psppire-dialog-action-aggregate.c:226 #: src/ui/gui/psppire-data-window.c:503 msgid "System Files (*.sav)" msgstr "Archivos de Sistema (*.sav)" #: src/ui/gui/psppire-dialog-action-aggregate.c:231 #: src/ui/gui/psppire-data-window.c:508 msgid "Compressed System Files (*.zsav)" msgstr "Archivos de Sistema Comprimidos (*.zsav)" #: src/ui/gui/psppire-dialog-action-aggregate.c:236 #: src/ui/gui/psppire-data-window.c:513 src/ui/gui/psppire-window.c:652 msgid "Portable Files (*.por) " msgstr "Archivos Portátiles (*.por) " #: src/ui/gui/psppire-dialog-action-autorecode.c:337 #: src/ui/gui/psppire-dialog-action-recode.c:535 #: src/ui/gui/psppire-dialog-action-recode-different.c:288 msgid "New" msgstr "Nuevo" #: src/ui/gui/psppire-dialog-action-autorecode.c:351 #: src/ui/gui/psppire-dialog-action-recode.c:527 #: src/ui/gui/psppire-dialog-action-recode-different.c:301 msgid "Old" msgstr "Anterior" #: src/ui/gui/psppire-dialog-action-comments.c:142 #, c-format msgid "Column Number: %d" msgstr "Número de columna: %d" #: src/ui/gui/psppire-dialog-action-crosstabs.c:71 msgid "Chisq" msgstr "Chi-C." #: src/ui/gui/psppire-dialog-action-crosstabs.c:71 msgid "" "Pearson chi-square, likelihood ratio, Fisher’s exact test, continuity " "correction, linear-by-linear association." msgstr "" #: src/ui/gui/psppire-dialog-action-crosstabs.c:74 #: src/language/stats/crosstabs.q:1334 msgid "Phi" msgstr "Phi" #: src/ui/gui/psppire-dialog-action-crosstabs.c:75 msgid "CC" msgstr "CC" #: src/ui/gui/psppire-dialog-action-crosstabs.c:75 #, fuzzy #| msgid "Contingency Coefficient" msgid "Contingency coefficient" msgstr "Coeficiente de Contingencia" #: src/ui/gui/psppire-dialog-action-crosstabs.c:77 msgid "UC" msgstr "UC" #: src/ui/gui/psppire-dialog-action-crosstabs.c:77 #, fuzzy #| msgid "Uncertainty Coefficient" msgid "Uncertainty coefficient" msgstr "Coeficiente de Incertidumbre" #: src/ui/gui/psppire-dialog-action-crosstabs.c:78 msgid "BTau" msgstr "BTau" #: src/ui/gui/psppire-dialog-action-crosstabs.c:78 #, fuzzy #| msgid "Kendall's tau-b" msgid "Kendall's Tau-b" msgstr "Tau-B de Kendall" #: src/ui/gui/psppire-dialog-action-crosstabs.c:79 msgid "CTau" msgstr "CTau" #: src/ui/gui/psppire-dialog-action-crosstabs.c:79 #, fuzzy #| msgid "Kendall's tau-c" msgid "Kendall's Tau-c" msgstr "Tau-C de Kendall" #: src/ui/gui/psppire-dialog-action-crosstabs.c:80 msgid "Risk" msgstr "Riesgo" #: src/ui/gui/psppire-dialog-action-crosstabs.c:80 #, fuzzy #| msgid "Risk estimate." msgid "Relative Risk estimate" msgstr "Estimador de Riesgo." #: src/ui/gui/psppire-dialog-action-crosstabs.c:81 #: src/language/stats/crosstabs.q:1338 msgid "Gamma" msgstr "Gamma" #: src/ui/gui/psppire-dialog-action-crosstabs.c:82 msgid "D" msgstr "D" #: src/ui/gui/psppire-dialog-action-crosstabs.c:82 #, fuzzy #| msgid "Somers' d" msgid "Somer's d" msgstr "D de Somers" #: src/ui/gui/psppire-dialog-action-crosstabs.c:83 #: src/language/stats/crosstabs.q:1344 msgid "Kappa" msgstr "Kappa" #: src/ui/gui/psppire-dialog-action-crosstabs.c:83 msgid "Cohen's Kappa" msgstr "" #: src/ui/gui/psppire-dialog-action-crosstabs.c:84 #: src/language/stats/crosstabs.q:1429 msgid "Eta" msgstr "Eta" #: src/ui/gui/psppire-dialog-action-crosstabs.c:85 msgid "Corr" msgstr "Corr" #: src/ui/gui/psppire-dialog-action-crosstabs.c:85 #, fuzzy #| msgid "Spearman Correlation" msgid "Spearman correlation, Pearson's r" msgstr "Correlación de Spearman" #: src/ui/gui/psppire-dialog-action-crosstabs.c:90 #, fuzzy #| msgid "Frequency" msgid "Frequency Count" msgstr "Frecuencia" #: src/ui/gui/psppire-dialog-action-crosstabs.c:91 msgid "Row" msgstr "Fila" #: src/ui/gui/psppire-dialog-action-crosstabs.c:91 #, fuzzy #| msgid "Percent" msgid "Row percent" msgstr "Porcentaje" #: src/ui/gui/psppire-dialog-action-crosstabs.c:92 msgid "Column" msgstr "Columna" #: src/ui/gui/psppire-dialog-action-crosstabs.c:92 #, fuzzy #| msgid "Cum Percent" msgid "Column percent" msgstr "Porcentaje Acumulado" #: src/ui/gui/psppire-dialog-action-crosstabs.c:93 #, fuzzy #| msgid "Valid Percent" msgid "Total percent" msgstr "Porcentaje Válido" #: src/ui/gui/psppire-dialog-action-crosstabs.c:94 #: src/language/stats/crosstabs.q:1266 msgid "Expected" msgstr "Esperado" #: src/ui/gui/psppire-dialog-action-crosstabs.c:94 #, fuzzy #| msgid "Expected Values:" msgid "Expected value" msgstr "Valores Esperados:" #: src/ui/gui/psppire-dialog-action-crosstabs.c:96 #: src/language/stats/crosstabs.q:1268 msgid "Std. Residual" msgstr "Residual Tipificado" #: src/ui/gui/psppire-dialog-action-crosstabs.c:96 #, fuzzy #| msgid "Std. Residual" msgid "Standardized Residual" msgstr "Residual Tipificado" #: src/ui/gui/psppire-dialog-action-crosstabs.c:97 msgid "Adjusted Std. Residual" msgstr "Residual Tipificado Ajustado" #: src/ui/gui/psppire-dialog-action-descriptives.c:45 msgid "Standard error" msgstr "Error Estándar" #: src/ui/gui/psppire-dialog-action-descriptives.c:45 #, fuzzy #| msgid "Standard error of the mean" msgid "Standard error of mean" msgstr "Error estándar en la media" #: src/ui/gui/psppire-dialog-action-descriptives.c:47 #, fuzzy #| msgid "Standard error of the kurtosis" msgid "Kurtosis and standard error of kurtosis" msgstr "Error estándar en la curtosis" #: src/ui/gui/psppire-dialog-action-descriptives.c:48 #, fuzzy #| msgid "Standard error of the skewness" msgid "Skewness and standard error of skewness" msgstr "Error estándar de la asimetría" #: src/ui/gui/psppire-dialog-action-factor.c:323 #, c-format msgid "_Eigenvalues over %4.2f times the mean eigenvalue" msgstr "_Valores propios por encima de %4.2f veces el valor-propio medio" #: src/ui/gui/psppire-dialog-action-frequencies.c:44 msgid "Standard error of the mean" msgstr "Error estándar en la media" #: src/ui/gui/psppire-dialog-action-frequencies.c:47 msgid "Standard error of the skewness" msgstr "Error estándar de la asimetría" #: src/ui/gui/psppire-dialog-action-frequencies.c:51 msgid "Standard error of the kurtosis" msgstr "Error estándar en la curtosis" #: src/ui/gui/psppire-dialog-action-oneway.c:175 #, c-format msgid "Contrast %d of %d" msgstr "Contraste %d de %d" #: src/ui/gui/psppire-dialog-action-paired.c:162 src/ui/gui/examine.ui:282 #: src/ui/gui/indep-samples.ui:334 src/ui/gui/t-test.ui:296 msgid "O_ptions..." msgstr "O_pciones..." #: src/ui/gui/psppire-dialog-action-paired.c:168 msgid "Paired Samples T Test" msgstr "Prueba T para muestras Emparejadas" #: src/ui/gui/psppire-dialog-action-recode-different.c:327 msgid "Recode into Different Variables" msgstr "Recodificar en variables Diferentes" #: src/ui/gui/psppire-dialog-action-recode-different.c:330 msgid "Recode into Different Variables: Old and New Values " msgstr "Recodifica en variables Diferentes: Anteriores y Nuevos valores " #: src/ui/gui/psppire-dialog-action-recode-same.c:108 src/ui/gui/recode.ui:391 msgid "Recode into Same Variables" msgstr "Recodificar en las Mismas variables" #: src/ui/gui/psppire-dialog-action-recode-same.c:114 msgid "Recode into Same Variables: Old and New Values" msgstr "Recodifica en las mismas variables: Anteriores y Nuevos valores" #: src/ui/gui/psppire-dialog-action-regression.c:40 msgid "Coeff" msgstr "Coef" #: src/ui/gui/psppire-dialog-action-regression.c:40 msgid "Show the regression coefficients" msgstr "Mostrar los Coeficientes de Correlación" #: src/ui/gui/psppire-dialog-action-regression.c:41 msgid "Conf. Interval" msgstr "Interv. Confianza" #: src/ui/gui/psppire-dialog-action-regression.c:41 msgid "Show the confidence interval for the regression coefficients" msgstr "Mostrar Intervalo de confianza para los coeficientes de regresión" #: src/ui/gui/psppire-dialog-action-regression.c:42 msgid "Show the correlation between observed and predicted values" msgstr "Mostrar la correlación entre los valores observados y esperados" #: src/ui/gui/psppire-dialog-action-regression.c:43 msgid "Anova" msgstr "Anova" #: src/ui/gui/psppire-dialog-action-regression.c:43 msgid "Show the analysis of variance table" msgstr "Mostrar la tabla de análisis de la varianza" #: src/ui/gui/psppire-dialog-action-regression.c:44 msgid "Bcov" msgstr "Bcov" #: src/ui/gui/psppire-dialog-action-regression.c:44 msgid "Show the variance coefficient matrix" msgstr "Mostrar la matriz de coeficientes de varianza" #: src/ui/gui/psppire-dialog-action-regression.c:45 #, fuzzy #| msgid "Total" msgid "Tol" msgstr "Total" #: src/ui/gui/psppire-dialog-action-regression.c:45 #, fuzzy #| msgid "Show the variance coefficient matrix" msgid "Show the variance inflation factor and its reciprocal" msgstr "Mostrar la matriz de coeficientes de varianza" #: src/ui/gui/psppire-dialog-action-select.c:88 #, c-format msgid "Approximately %3d%% of all cases." msgstr "Aproximadamente %3d%% de todos los casos." #: src/ui/gui/psppire-dialog-action-select.c:89 #, c-format msgid "Exactly %3d cases from the first %3d cases." msgstr "Exactamente %3d casos de los primeros %3d casos." #: src/ui/gui/psppire-dialog-action-select.c:236 #, c-format msgid "%d thru %d" msgstr "%d hasta %d" #: src/ui/gui/psppire-dialog-action-two-sample.c:180 #: src/ui/gui/k-independent.ui:404 src/ui/gui/k-related.ui:197 msgid "Test Type" msgstr "Tipo de Test" #: src/ui/gui/psppire-dialog-action-two-sample.c:189 msgid "_Wilcoxon" msgstr "_W de Wilcoxon" #: src/ui/gui/psppire-dialog-action-two-sample.c:190 msgid "_Sign" msgstr "_Signo" #: src/ui/gui/psppire-dialog-action-two-sample.c:191 msgid "_McNemar" msgstr "_McNemar" #: src/ui/gui/psppire-dialog-action-two-sample.c:209 msgid "Two-Related-Samples Tests" msgstr "Prueba para Dos muestras emparejadas" #: src/ui/gui/psppire-dialog-action-weight.c:74 src/ui/gui/weight.ui:83 #: src/ui/gui/weight.ui:211 msgid "Do not weight cases" msgstr "No ponderar los casos" #: src/ui/gui/psppire-dialog-action-weight.c:80 #, c-format msgid "Weight cases by %s" msgstr "Ponderar los casos por %s" #: src/ui/gui/psppire-dict.c:95 #, fuzzy #| msgid "Var%d" msgid "Var" msgstr "Var%d" #. TRANSLATORS: This string must be a valid variable name. That means: #. - The string must be at most 64 bytes (not characters) long. #. - The string may not contain whitespace. #. - The first character may not be '$' #. - The first character may not be a digit #. - The final character may not be '.' or '_' #. #: src/ui/gui/psppire-dict.c:385 #, c-format msgid "Var%04d" msgstr "Var%04d" #: src/ui/gui/psppire-dict.c:566 msgid "Duplicate variable name." msgstr "Nombre de la variable duplicado." #: src/ui/gui/psppire-dictview.c:617 msgid "Prefer variable labels" msgstr "Prefiero las etiquetas de variable" #: src/ui/gui/psppire-dictview.c:631 msgid "Default sort order" msgstr "Ordenación por defecto" #: src/ui/gui/psppire-dictview.c:637 msgid "Unsorted (dictionary order)" msgstr "No ordenado (según el diccionario)" #: src/ui/gui/psppire-dictview.c:642 msgid "Sort by name" msgstr "Ordenado por nombre" #: src/ui/gui/psppire-dictview.c:647 msgid "Sort by label" msgstr "Ordenado por etiqueta" #: src/ui/gui/psppire-means-layer.c:95 #, c-format msgid "Layer %d of %d" msgstr "Capa %d de %d" #: src/ui/gui/psppire-means-layer.c:169 msgid "Forward" msgstr "Adelante" #: src/ui/gui/psppire-means-layer.c:170 msgid "Back" msgstr "Atrás" #: src/ui/gui/psppire-text-file.c:55 #, c-format msgid "Could not open `%s'" msgstr "No se puede abrir `%s'" #: src/ui/gui/psppire-text-file.c:71 #, c-format msgid "Error reading `%s': %s" msgstr "Error leyendo `%s': %s" #: src/ui/gui/psppire-text-file.c:74 #, c-format msgid "" "Failed to read `%s', because it contains a line over %d bytes long and " "therefore appears not to be a text file." msgstr "" "Error leyendo `%s', porque contiene una linea más allá de %d bytes y por " "tanto parece que no es un archivo de texto." #: src/ui/gui/psppire-text-file.c:96 #, c-format msgid "`%s' is empty." msgstr "`%s' esta vacío." #: src/ui/gui/psppire-val-chooser.c:255 msgid "through" msgstr "hasta" #: src/ui/gui/psppire-val-chooser.c:288 msgid "_Value:" msgstr "_Valor:" #: src/ui/gui/psppire-val-chooser.c:289 msgid "_System Missing" msgstr "Perdido del _Sistema" #: src/ui/gui/psppire-val-chooser.c:290 msgid "System _or User Missing" msgstr "Perdido de Sistema _o de Usuario" #: src/ui/gui/psppire-val-chooser.c:291 msgid "_Range:" msgstr "_Rango:" #: src/ui/gui/psppire-val-chooser.c:292 msgid "Range, _LOWEST thru value" msgstr "Rango, del MÍNIMO hasta el valor" #: src/ui/gui/psppire-val-chooser.c:293 msgid "Range, value thru _HIGHEST" msgstr "Rango, del valor hasta el SUPREMO" #: src/ui/gui/psppire-val-chooser.c:294 msgid "_All other values" msgstr "El resto de valores" #: src/ui/gui/psppire-var-view.c:153 #, c-format msgid "Var%d" msgstr "Var%d" #: src/ui/source-init-opts.c:72 #, c-format msgid "Algorithm must be either `%s' or `%s'." msgstr "El algoritmo tiene que ser o `%s' or `%s'." #: src/ui/source-init-opts.c:97 #, c-format msgid "Syntax must be either `%s' or `%s'." msgstr "La sintaxis tiene que ser o `%s' or `%s'." #: src/ui/terminal/main.c:144 msgid "Error encountered while ERROR=STOP is effective." msgstr "Error detectado mientras está activo ERROR=STOP." #: src/ui/terminal/main.c:150 msgid "" "Stopping syntax file processing here to avoid a cascade of dependent command " "failures." msgstr "" "Deteniendo el procesamiento del archivo de sintaxis aquí para evitar una " "cascada de errores derivados." #: src/ui/terminal/terminal-opts.c:147 #, c-format msgid "" "PSPP, a program for statistical analysis of sampled data.\n" "Usage: %s [OPTION]... FILE...\n" "\n" "Arguments to long options also apply to equivalent short options.\n" "\n" "Output options:\n" " -o, --output=FILE output to FILE, default format from FILE's name\n" " -O format=FORMAT override format for previous -o\n" " -O OPTION=VALUE set output option to customize previous -o\n" " -O device={terminal|listing} override device type for previous -o\n" " -e, --error-file=FILE append errors, warnings, and notes to FILE\n" " --no-output disable default output driver\n" "Supported output formats: %s\n" "\n" "Language options:\n" " -I, --include=DIR append DIR to search path\n" " -I-, --no-include clear search path\n" " -r, --no-statrc disable running rc file at startup\n" " -a, --algorithm={compatible|enhanced}\n" " set to `compatible' if you want output\n" " calculated from broken algorithms\n" " -x, --syntax={compatible|enhanced}\n" " set to `compatible' to disable PSPP extensions\n" " -b, --batch interpret syntax in batch mode\n" " -i, --interactive interpret syntax in interactive mode\n" " --syntax-encoding=ENCODING specify encoding for syntax files\n" " -s, --safer don't allow some unsafe operations\n" "Default search path: %s\n" "\n" "Informative output:\n" " -h, --help display this help and exit\n" " -V, --version output version information and exit\n" "\n" "Non-option arguments are interpreted as syntax files to execute.\n" msgstr "" "PSPP, un programa de análisis estadístico para datos de muestreo.\n" "Uso: %s [OPTION]... FILE...\n" "\n" "Los argumentos para opciones largas también se aplican a opciones cortas " "equivalentes.\n" "\n" "Opciones de salida:\n" " -o, --output=FILE salida a FILE, format por defecto según el " "nombre de FILE\n" " -O format=FORMAT sobrescribir el formato por el previo -o\n" " -O OPTION=VALUE establecer opciones de salida a las previas " "personalizadas -o\n" " -O device={terminal|listing} sustituir el tipo de dispositivo por el " "previo -o\n" " -e, --error-file=FILE añade errores, advertencias, y notas a FILE\n" " --no-output desactivar el dispositivo de salida por defecto\n" "Formatos de salida soportados: %s\n" "\n" "Opciones de lenguaje:\n" " -I, --include=DIR añadir DIR a la ruta de búsqueda\n" " -I-, --no-include limpiar la ruta de búsqueda\n" " -r, --no-statrc desactivar el archivo que ejecuta rc al inicio\n" " -a, --algorithm={compatible|enhanced}\n" " establecer a `compatible' si se quiere una " "salida\n" " calculada a partir de algoritmos rotos\n" " -x, --syntax={compatible|enhanced}\n" " establecer a `compatible' para desactivar las " "extensiones PSPP\n" " -b, --batch interpretar la sintaxis en modo paquete\n" " -i, --interactive interpretar la sintaxis en modo interactivo\n" " --syntax-encoding=ENCODING especificar codificación para los archivos de " "sintaxis\n" " -s, --safer no permitir algunas operaciones poco seguras\n" "Ruta de búsqueda por defecto: %s\n" "\n" "Salida informativa:\n" " -h, --help muestra esta ayuda y acaba\n" " -V, --version información sobre versión de salida y acaba\n" "\n" "Los argumentos sin opción son interpretados como archivos de sintaxis para " "ser ejecutados.\n" #: src/ui/gui/find-dialog.c:197 msgid "Find" msgstr "Busca" #: src/ui/gui/find-dialog.c:662 #, c-format msgid "Bad regular expression: %s" msgstr "Expresión regular incorrecta: %s" #: src/ui/gui/help-menu.c:70 msgid "A program for the analysis of sampled data" msgstr "Un programa para el análisis de datos de muestreo" #. TRANSLATORS: Do not translate this string. Instead, put the names of the people #. who have helped in the translation. #: src/ui/gui/help-menu.c:80 msgid "translator-credits" msgstr "F.J. Miguel, J. Gómez, P. Payà" #: src/ui/gui/help-menu.c:170 #, c-format msgid "Help path conversion error: %s" msgstr "Error de conversión de la ruta de ayuda: %s" #: src/ui/gui/help-menu.c:197 #, fuzzy, c-format #| msgid "" #| "Cannot open reference manual via yelp: %s. Cannot open via html: %s with " #| "uri: %s The PSSP manual is also available at %s" msgid "" "Cannot open via html: %s with uri: %s The PSSP manual is also available at %s" msgstr "" "No puede abrirse el manual de referencia via yelp: %s. No puede abrirse via " "html: %s con uri: %s. El manual de usuario de PSPP también está disponible " "en %s" #: src/ui/gui/help-menu.c:218 msgid "_Help" msgstr "Ayuda" #: src/ui/gui/help-menu.c:221 msgid "_About" msgstr "Sobre..." #: src/ui/gui/help-menu.c:222 msgid "_Reference Manual" msgstr "Manual de _Referencia" #: src/ui/gui/main.c:306 msgid "Show version information and exit" msgstr "Muestra información de la versión y cierra" #: src/ui/gui/main.c:409 msgid "Do not display the splash screen" msgstr "No mostrar la pantalla de bienvenida" #: src/ui/gui/main.c:411 msgid "Do not attempt single instance negotiation" msgstr "No intentar negociación de instancia única" #: src/ui/gui/missing-val-dialog.c:217 msgid "" "The maximum length of a missing value for a string variable is 8 in UTF-8." msgstr "" "La longitud máxima del valor perdido para una variable alfanumérica es 8 en " "UTF-8." #: src/ui/gui/missing-val-dialog.c:268 msgid "At least one value must be specified" msgstr "Al menos un valor debe ser especificado." #: src/ui/gui/missing-val-dialog.c:298 msgid "Incorrect range specification" msgstr "Especificación de intervalo incorrecta" #: src/ui/gui/psppire-data-editor.c:380 #, fuzzy, c-format #| msgid "%s: %s" msgid "%d : %s" msgstr "%s: %s" #: src/ui/gui/psppire-data-editor.c:391 #, c-format msgid "%'d case" msgid_plural "%'d cases" msgstr[0] "%'d caso" msgstr[1] "%'d casos" #: src/ui/gui/psppire-data-editor.c:396 #, c-format msgid "%'d variable" msgid_plural "%'d variables" msgstr[0] "Variable %'d" msgstr[1] "Variables %'d" #: src/ui/gui/psppire-data-editor.c:485 msgid "Case" msgstr "Caso" #: src/ui/gui/psppire-data-editor.c:495 msgid "Data View" msgstr "Vista de Datos" #: src/ui/gui/psppire-data-editor.c:505 msgid "Variable View" msgstr "Vista de Variables" #: src/ui/gui/psppire-data-sheet.c:171 src/ui/gui/psppire-data-window.c:1338 msgid "_Insert Case" msgstr "_Insertar Caso" #: src/ui/gui/psppire-data-sheet.c:179 src/ui/gui/psppire-data-window.c:1391 msgid "Cl_ear Cases" msgstr "El_iminar Casos" #: src/ui/gui/psppire-data-sheet.c:305 src/ui/gui/psppire-data-window.c:1337 #: src/ui/gui/psppire-variable-sheet.c:274 msgid "_Insert Variable" msgstr "_Insertar Variable" #: src/ui/gui/psppire-data-sheet.c:314 src/ui/gui/psppire-variable-sheet.c:283 msgid "Cl_ear Variables" msgstr "_Eliminar Variables" #: src/ui/gui/psppire-data-sheet.c:326 msgid "Sort _Ascending" msgstr "Ordenación _Ascendente" #: src/ui/gui/psppire-data-sheet.c:333 msgid "Sort _Descending" msgstr "Ordenación _Descendente" #: src/ui/gui/psppire-data-window.c:175 msgid "Transformations Pending" msgstr "Transformaciones pendientes" #: src/ui/gui/psppire-data-window.c:191 msgid "Filter off" msgstr "SIN Filtro" #: src/ui/gui/psppire-data-window.c:203 #, c-format msgid "Filter by %s" msgstr "Filtrado por %s" #: src/ui/gui/psppire-data-window.c:224 msgid "No Split" msgstr "NO Dividido" #: src/ui/gui/psppire-data-window.c:233 msgid "Split by " msgstr "Dividido por " #: src/ui/gui/psppire-data-window.c:261 msgid "Weights off" msgstr "SIN Ponderar" #: src/ui/gui/psppire-data-window.c:273 #, c-format msgid "Weight by %s" msgstr "Ponderado por %s" #: src/ui/gui/psppire-data-window.c:518 #: src/ui/gui/psppire-import-assistant.c:681 #: src/ui/gui/psppire-syntax-window.c:607 src/ui/gui/psppire-window.c:669 msgid "All Files" msgstr "Todos los archivos" #: src/ui/gui/psppire-data-window.c:535 msgid "System File" msgstr "Archivo de Sistema" #: src/ui/gui/psppire-data-window.c:542 msgid "Compressed System File" msgstr "Archivo de Sistema Comprimido" #: src/ui/gui/psppire-data-window.c:548 msgid "Portable File" msgstr "Archivo Portátil" #: src/ui/gui/psppire-data-window.c:551 msgid "Format:" msgstr "Formato:" #: src/ui/gui/psppire-data-window.c:615 msgid "Delete Existing Dataset?" msgstr "Eliminar el archivo de datos existente?" #: src/ui/gui/psppire-data-window.c:619 #, c-format msgid "" "Renaming \"%s\" to \"%s\" will destroy the existing dataset named \"%s\". " "Are you sure that you want to do this?" msgstr "" "Renombrar \"%s\" como \"%s\" eliminará el conjunto de datos existente " "llamado \"%s\". ¿Está seguro de querer hacer eso?" #: src/ui/gui/psppire-data-window.c:625 msgid "Delete" msgstr "Elimina" #: src/ui/gui/psppire-data-window.c:647 #, c-format msgid "Please enter a new name for dataset \"%s\":" msgstr "Por favor, introduzca un nombre para el archivo de datos \"%s\":" #: src/ui/gui/psppire-data-window.c:649 msgid "Rename Dataset" msgstr "Renombra el Archivo de datos" #: src/ui/gui/psppire-data-window.c:1199 src/ui/gui/output-window.ui:68 #: src/ui/gui/syntax-editor.ui:22 msgid "_File" msgstr "_Archivo" #: src/ui/gui/psppire-data-window.c:1203 src/ui/gui/syntax-editor.ui:25 msgid "_New" msgstr "_Nuevo" #: src/ui/gui/psppire-data-window.c:1210 msgid "_Syntax" msgstr "_Sintaxis" #: src/ui/gui/psppire-data-window.c:1213 src/ui/gui/data-editor.ui:177 #: src/ui/gui/data-editor.ui:189 msgid "_Data" msgstr "_Datos" #: src/ui/gui/psppire-data-window.c:1220 src/ui/gui/syntax-editor.ui:36 msgid "_Open" msgstr "Abrir" #: src/ui/gui/psppire-data-window.c:1223 msgid "_Import Data..." msgstr "_Importar Datos..." #: src/ui/gui/psppire-data-window.c:1231 src/ui/gui/logistic.ui:261 #: src/ui/gui/regression.ui:66 msgid "_Save..." msgstr "_Guardar..." #: src/ui/gui/psppire-data-window.c:1234 msgid "Save _As..." msgstr "Guard_ar como..." #: src/ui/gui/psppire-data-window.c:1237 msgid "_Rename Dataset..." msgstr "_Renombrar Archivo de Datos..." #: src/ui/gui/psppire-data-window.c:1248 msgid "_Display Data File Information" msgstr "Muestra información del archivo de _Datos" #: src/ui/gui/psppire-data-window.c:1255 msgid "Working File" msgstr "Archivos de trabajo" #: src/ui/gui/psppire-data-window.c:1257 msgid "_External File..." msgstr "Archivo _Externo..." #: src/ui/gui/psppire-data-window.c:1267 msgid "_Recently Used Data" msgstr "Datos utilizados _Recientemente" #: src/ui/gui/psppire-data-window.c:1268 msgid "Recently Used _Files" msgstr "Archivos utilizados recientemente" #: src/ui/gui/psppire-data-window.c:1315 src/ui/gui/output-window.ui:82 #: src/ui/gui/syntax-editor.ui:59 msgid "_Quit" msgstr "Cerrar" #: src/ui/gui/psppire-data-window.c:1333 src/ui/gui/output-window.ui:89 #: src/ui/gui/syntax-editor.ui:66 msgid "_Edit" msgstr "_Editar" #: src/ui/gui/psppire-data-window.c:1339 msgid "_Go To Variable..." msgstr "Ir a la variable..." #: src/ui/gui/psppire-data-window.c:1340 msgid "_Go To Case..." msgstr "Ir al caso..." #: src/ui/gui/psppire-data-window.c:1364 src/ui/gui/syntax-editor.ui:69 msgid "Cu_t" msgstr "Cortar" #: src/ui/gui/psppire-data-window.c:1373 src/ui/gui/output-window.ui:96 #: src/ui/gui/syntax-editor.ui:74 msgid "_Copy" msgstr "_Copiar" #: src/ui/gui/psppire-data-window.c:1380 src/ui/gui/syntax-editor.ui:79 msgid "_Paste" msgstr "_Pegar" #: src/ui/gui/psppire-data-window.c:1387 msgid "Clear _Variables" msgstr "Eliminar _Variables" #: src/ui/gui/psppire-data-window.c:1401 msgid "_Find..." msgstr "Buscar..." #: src/ui/gui/psppire-data-window.c:1407 src/ui/gui/logistic.ui:246 msgid "_Options..." msgstr "_Opciones..." #: src/ui/gui/psppire-data-window.c:1676 msgid "Jump to variable" msgstr "Ir a la variable" #: src/ui/gui/psppire-data-window.c:1689 msgid "Jump to a case in the data sheet" msgstr "Ir a un caso en la matriz de datos" #: src/ui/gui/psppire-data-window.c:1703 msgid "Search for values in the data" msgstr "Buscar valores en los datos" #: src/ui/gui/psppire-data-window.c:1715 msgid "Create a new case at the current position" msgstr "Crear un nuevo caso en la posición actual" #: src/ui/gui/psppire-data-window.c:1727 msgid "Create a new variable at the current position" msgstr "Crear una nueva variable en la posición seleccionada" #: src/ui/gui/psppire-data-window.c:1741 msgid "Split the active dataset" msgstr "Dividir el archivo de datos activo" #: src/ui/gui/psppire-data-window.c:1753 msgid "Weight cases by variable" msgstr "Pondera casos por la variable" #: src/ui/gui/psppire-data-window.c:1764 msgid "Show/hide value labels" msgstr "Muestra/Oculta etiquetas de valor" #: src/ui/gui/psppire-data-window.c:1904 msgid "Data Editor" msgstr "Editor de Datos" #: src/ui/gui/psppire-encoding-selector.c:140 msgid "Automatically Detect" msgstr "Detección Automática" #: src/ui/gui/psppire-encoding-selector.c:147 msgid "Locale Encoding" msgstr "Codificación Local" #: src/ui/gui/psppire-encoding-selector.c:177 msgid "Character Encoding: " msgstr "Codificación de carácteres: " #: src/ui/gui/psppire-import-assistant.c:337 msgid "line" msgstr "" #: src/ui/gui/psppire-import-assistant.c:347 msgid "var" msgstr "var" #: src/ui/gui/psppire-import-assistant.c:560 msgid "Importing Spreadsheet Data" msgstr "Importando datos de hoja de cálculo" #: src/ui/gui/psppire-import-assistant.c:686 msgid "Text Files" msgstr "Archivos de texto" #: src/ui/gui/psppire-import-assistant.c:691 msgid "Text (*.txt) Files" msgstr "Archivos de Texto (*.txt)" #: src/ui/gui/psppire-import-assistant.c:697 msgid "Plain Text (ASCII) Files" msgstr "Archivos de Texto plano (ASCII)" #: src/ui/gui/psppire-import-assistant.c:702 msgid "Comma Separated Value Files" msgstr "Archivos de Valores Separados por Comas" #: src/ui/gui/psppire-import-assistant.c:709 msgid "Tab Separated Value Files" msgstr "Archivos de Valores Separados por Tabuladores" #: src/ui/gui/psppire-import-assistant.c:714 msgid "Gnumeric Spreadsheet Files" msgstr "Archivos de hoja de cálculo Gnumeric" #: src/ui/gui/psppire-import-assistant.c:719 msgid "OpenDocument Spreadsheet Files" msgstr "Archivos de hoja de cálculo OpenDocument" #: src/ui/gui/psppire-import-assistant.c:724 msgid "All Spreadsheet Files" msgstr "Todos los archivos de hoja de cálculo" #: src/ui/gui/psppire-import-assistant.c:733 msgid "Select File to Import" msgstr "Seleccionar Fichero para Importar" #: src/ui/gui/psppire-import-assistant.c:770 msgid "Importing Delimited Text Data" msgstr "Importando datos de texto delimitado" #: src/ui/gui/psppire-import-assistant.c:865 msgid "Select the First Line" msgstr "Seleccionar la primera línea" #: src/ui/gui/psppire-import-assistant.c:877 msgid "Line" msgstr "Línea" #: src/ui/gui/psppire-import-assistant.c:931 msgid "" "This assistant will guide you through the process of importing data into " "PSPP from a text file with one line per case, in which fields are separated " "by tabs, commas, or other delimiters.\n" "\n" msgstr "" "Este asistente te guiará a lo largo del proceso de importar datos en PSPP " "desde un archivo de texto con una línea por caso, en el que los campos " "están separados por tabuladores, comas, u otros delimitadores.\n" "\n" #: src/ui/gui/psppire-import-assistant.c:941 #, c-format msgid "The selected file contains %'lu line of text. " msgid_plural "The selected file contains %'lu lines of text. " msgstr[0] "El archivo seleccionado contiene %'lu línea de texto." msgstr[1] "El archivo seleccionado contiene %'lu líneas de texto." #: src/ui/gui/psppire-import-assistant.c:950 #, c-format msgid "The selected file contains approximately %'lu line of text. " msgid_plural "The selected file contains approximately %'lu lines of text. " msgstr[0] "" "El archivo seleccionado contiene aproximadamente %'lu líneas de texto. " msgstr[1] "" "El archivo seleccionado contiene aproximadamente %lu líneas de texto. " #: src/ui/gui/psppire-import-assistant.c:956 #, c-format msgid "" "Only the first %zu line of the file will be shown for preview purposes in " "the following screens. " msgid_plural "" "Only the first %zu lines of the file will be shown for preview purposes in " "the following screens. " msgstr[0] "" "Únicamente la primera %zu líneas del archivo se pre-visualizaran en las " "siguientes pantallas. " msgstr[1] "" "Únicamente las primeras %zu líneas del archivo se pre-visualizaran en las " "siguientes pantallas. " #: src/ui/gui/psppire-import-assistant.c:965 msgid "You may choose below how much of the file should actually be imported." msgstr "" "Puedes escoger a continuación que parte del archivo va a ser importado." #: src/ui/gui/psppire-import-assistant.c:974 #, c-format msgid "Only the first %4d cases" msgstr "Sólo los primeros %4d casos" #: src/ui/gui/psppire-import-assistant.c:985 #, c-format msgid "Only the first %3d %% of file (approximately)" msgstr "Sólo los primeros %3d %% del archivo (aproximadamente)" #: src/ui/gui/psppire-import-assistant.c:1009 msgid "Select the Lines to Import" msgstr "Seleccionar las líneas a importar" #: src/ui/gui/psppire-import-assistant.c:1151 msgid "Choose Separators" msgstr "Escoger los separadores" #: src/ui/gui/psppire-import-assistant.c:1438 msgid "Adjust Variable Formats" msgstr "Ajustar formato de variables" #: src/ui/gui/psppire-output-view.c:410 msgid "Message" msgstr "Mensaje" #: src/ui/gui/psppire-output-view.c:543 msgid "failed to create temporary directory during clipboard operation" msgstr "" "error al crear el directorio temporal durante operación con portapapeles" #: src/ui/gui/psppire-output-window.c:241 msgid "Infer file type from extension" msgstr "Inferir tipo de archivo por la extensión" #: src/ui/gui/psppire-output-window.c:242 msgid "SPSS Viewer (*.spv)" msgstr "" #: src/ui/gui/psppire-output-window.c:243 msgid "PDF (*.pdf)" msgstr "PDF (*.pdf)" #: src/ui/gui/psppire-output-window.c:244 msgid "HTML (*.html)" msgstr "HTML (*.html)" #: src/ui/gui/psppire-output-window.c:245 msgid "OpenDocument (*.odt)" msgstr "OpenDocument (*.odt)" #: src/ui/gui/psppire-output-window.c:246 msgid "Text (*.txt)" msgstr "Texto (*.txt)" #: src/ui/gui/psppire-output-window.c:247 msgid "Text [plain] (*.txt)" msgstr "Texto [plano] (*.txt)" #: src/ui/gui/psppire-output-window.c:248 msgid "PostScript (*.ps)" msgstr "PostScript (*.ps)" #: src/ui/gui/psppire-output-window.c:249 msgid "Comma-Separated Values (*.csv)" msgstr "Valores Separados por Comas (*.csv)" #: src/ui/gui/psppire-output-window.c:350 msgid "Export Output" msgstr "Exporta Resultados" #: src/ui/gui/psppire-output-window.c:548 msgid "Output Viewer" msgstr "Visor de resultados" #: src/ui/gui/psppire-spreadsheet-model.c:237 msgid "(empty)" msgstr "(vacío)" #: src/ui/gui/psppire-syntax-window.c:226 msgid "Text Search" msgstr "" #: src/ui/gui/psppire-syntax-window.c:229 #, fuzzy #| msgid "OK" msgid "_OK" msgstr "OK" #: src/ui/gui/psppire-syntax-window.c:231 #, fuzzy #| msgid "Cancel" msgid "_Cancel" msgstr "Cancelar" #: src/ui/gui/psppire-syntax-window.c:239 msgid "Text to search for:" msgstr "" #: src/ui/gui/psppire-syntax-window.c:570 #, c-format msgid "Saved file `%s'" msgstr "Guardado archivo `%s'" #: src/ui/gui/psppire-syntax-window.c:591 msgid "Save Syntax" msgstr "Guardar sintaxis" #: src/ui/gui/psppire-syntax-window.c:601 src/ui/gui/psppire-window.c:657 msgid "Syntax Files (*.sps) " msgstr "Archivos de Sintaxis (*.sps) " #: src/ui/gui/psppire-syntax-window.c:970 msgid "Syntax Editor" msgstr "Editor de sintaxis" #: src/ui/gui/psppire-syntax-window.c:990 #, c-format msgid "Cannot load syntax file `%s'" msgstr "No se puede abrir el archivo de sintaxis `%s'" #: src/ui/gui/psppire-variable-sheet.c:412 #, c-format msgid "{%s, %s}..." msgstr "{%s, %s}..." #: src/ui/gui/psppire-var-sheet-header.c:64 #, fuzzy #| msgid "Decimals" msgid "Decimal" msgstr "Decimales" #: src/ui/gui/psppire-var-sheet-header.c:79 msgid "Align" msgstr "Alineación" #: src/ui/gui/psppire-var-sheet-header.c:82 msgid "Measure" msgstr "Medida" #: src/ui/gui/psppire-window.c:430 #, c-format msgid "Save the changes to `%s' before closing?" msgstr "¿Guardar los cambios en `%s' antes de salir?" #: src/ui/gui/psppire-window.c:437 #, c-format msgid "" "If you don't save, changes from the last %ld seconds will be permanently " "lost." msgstr "" "Si no se guarda ahora, los cambios de los últimos %ld segundos se perderán " "permanentemente." #: src/ui/gui/psppire-window.c:441 msgid "Close _without saving" msgstr "Cerrar sin guardar" #: src/ui/gui/psppire-window.c:625 src/ui/gui/psppire-window.c:629 msgid "Open" msgstr "Abrir" #: src/ui/gui/psppire-window.c:634 msgid "Data and Syntax Files" msgstr "Ficheros de Datos y Sintaxis" #: src/ui/gui/psppire-window.c:646 msgid "System Files (*.sav, *.zsav)" msgstr "Archivos de Sistema (*.sav, *.zsav)" #: src/ui/gui/psppire-window.c:663 #, fuzzy #| msgid "Syntax Files (*.sps) " msgid "Output Files (*.spv) " msgstr "Archivos de Sintaxis (*.sps) " #: src/ui/gui/t-test-options.c:65 #, c-format msgid "Con_fidence Interval: %2d %%" msgstr "Intervalo de Con_fianza: %2d %%" #: src/ui/gui/val-labs-dialog.c:591 #, c-format msgid "%s = `%s'" msgstr "%s = `%s'" #: src/ui/gui/var-type-dialog.c:541 #, fuzzy #| msgid "Compute Variable: Type and Label" msgid "Variable Type and Format" msgstr "Calcular Variable: Tipo y Etiqueta" #: src/ui/gui/windows-menu.c:92 msgid "_Minimize all Windows" msgstr "_Minimiza todas las ventanas" #: src/ui/gui/windows-menu.c:100 msgid "_Split" msgstr "Dividir" #: src/ui/gui/windows-menu.c:132 msgid "_Windows" msgstr "_Ventanas" #: utilities/pspp-convert.c:67 #, c-format msgid "%s argument must be a single character" msgstr "" #: utilities/pspp-convert.c:265 msgid "exactly two non-option arguments are required; use --help for help" msgstr "" "se requieren exactamente dos argumentos no optativos; use --help para " "obtener ayuda" #: utilities/pspp-convert.c:276 #, c-format msgid "%s: cannot guess output format (use -O option)" msgstr "%s: no se puede adivinar el formato de salida (usar la opción -O)" #: utilities/pspp-convert.c:341 #, c-format msgid "%s: unknown output format (use -O option)" msgstr "%s: formato de archivo desconocido (usar la opción -O)" #: utilities/pspp-convert.c:360 #, c-format msgid "%s: error reading input file" msgstr "%s: error leyendo el archivo de entrada" #: utilities/pspp-convert.c:362 #, c-format msgid "%s: error writing output file" msgstr "%s: error escribiendo en el archivo de resultados" #: utilities/pspp-convert.c:409 #, fuzzy, c-format #| msgid "%s: error opening output file" msgid "%s: error opening password file" msgstr "%s: error abriendo el archivo de resultados" #: utilities/pspp-convert.c:425 #, fuzzy, c-format #| msgid "%s: error reading input file" msgid "" "\n" "%s: password not in file" msgstr "%s: error leyendo el archivo de entrada" #: utilities/pspp-convert.c:462 #, fuzzy, c-format #| msgid "`%c' is not a valid hex digit" msgid "%s: '%c' is not in alphabet" msgstr "`%c' no es un dígito hexadecimal válido." #: utilities/pspp-convert.c:526 msgid "sorry, wrong password" msgstr "lo sentimos, clave incorrecta" #: utilities/pspp-output.c:92 #, c-format msgid "%s and %s:" msgstr "" #: utilities/pspp-output.c:547 #, fuzzy, c-format #| msgid "in expression" msgid "%s: invalid XPath expression" msgstr "en la expresión" #: utilities/pspp-output.c:716 msgid "missing command name (use --help for help)" msgstr "" #: utilities/pspp-output.c:720 #, c-format msgid "unknown command \"%s\" (use --help for help)" msgstr "" #: utilities/pspp-output.c:728 #, c-format msgid "\"%s\" command takes exactly %d argument" msgid_plural "\"%s\" command takes exactly %d arguments" msgstr[0] "" msgstr[1] "" #: utilities/pspp-output.c:735 #, fuzzy, c-format #| msgid "%s requires at least %d valid arguments in list." msgid "\"%s\" command requires at least %d argument" msgid_plural "\"%s\" command requires at least %d arguments" msgstr[0] "%s requiere como mínimo %d argumentos válidos en la lista." msgstr[1] "%s requiere como mínimo %d argumentos válidos en la lista." #: utilities/pspp-output.c:742 #, fuzzy, c-format #| msgid "%s requires at least %d valid arguments in list." msgid "\"%s\" command requires between %d and %d arguments" msgstr "%s requiere como mínimo %d argumentos válidos en la lista." #: utilities/pspp-output.c:782 msgid "The following object classes are supported:" msgstr "" #: utilities/pspp-output.c:791 #, c-format msgid "%s: unknown object class (use --select=help for help" msgstr "" #: src/language/utilities/set.q:162 #, c-format msgid "%s must be between 0 and 20." msgstr "%s debe estar entre 0 y 20." #: src/language/utilities/set.q:172 src/language/utilities/set.q:179 #, c-format msgid "%s must be at least 1." msgstr "%s debe ser como mínimo 1." #: src/language/utilities/set.q:205 #, c-format msgid "%s must be at least 1MB" msgstr "%s debe ser al menos 1MB" #: src/language/utilities/set.q:207 #, c-format msgid "%s must be positive" msgstr "%s debe ser positivo" #: src/language/utilities/set.q:213 src/language/utilities/set.q:215 #: src/language/utilities/set.q:217 src/language/utilities/set.q:219 #: src/language/utilities/set.q:221 src/language/utilities/set.q:223 #: src/language/utilities/set.q:225 src/language/utilities/set.q:227 #: src/language/utilities/set.q:229 src/language/utilities/set.q:231 #: src/language/utilities/set.q:233 #, c-format msgid "%s is obsolete." msgstr "%s está obsoleto." #: src/language/utilities/set.q:239 msgid "Active file compression is not implemented." msgstr "La compresión de archivos no está implementada." #: src/language/utilities/set.q:403 #, c-format msgid "%s must be 1500 or later." msgstr "%s debe ser 1500 o posterior." #: src/language/utilities/set.q:410 #, c-format msgid "expecting %s or year" msgstr "esperando %s o año" #: src/language/utilities/set.q:438 src/language/utilities/set.q:535 #, c-format msgid "%s must be at least %d." msgstr "%s debe ser como mínimo %d." #: src/language/utilities/set.q:474 #, c-format msgid "%s is not a recognized encoding or locale name" msgstr "%s no es una codificación o un nombre local reconocido" #: src/language/utilities/set.q:562 #, c-format msgid "" "%s requires numeric output format as an argument. Specified format %s is of " "type string." msgstr "" "%s requiere formato de resultado numérico como argumento. El formato %s " "especificado es de tipo cadena." #: src/language/utilities/set.q:791 msgid "ISL (32-bit IEEE 754 single, little-endian)" msgstr "ISL (32-bit IEEE 754 single, little-endian)" #: src/language/utilities/set.q:794 msgid "ISB (32-bit IEEE 754 single, big-endian)" msgstr "ISB (32-bit IEEE 754 single, big-endian)" #: src/language/utilities/set.q:797 msgid "IDL (64-bit IEEE 754 double, little-endian)" msgstr "IDL (64-bit IEEE 754 double, little-endian)" #: src/language/utilities/set.q:800 msgid "IDB (64-bit IEEE 754 double, big-endian)" msgstr "IDB (64-bit IEEE 754 double, big-endian)" #: src/language/utilities/set.q:804 msgid "VF (32-bit VAX F, VAX-endian)" msgstr "VF (32-bit VAX F, VAX-endian)" #: src/language/utilities/set.q:807 msgid "VD (64-bit VAX D, VAX-endian)" msgstr "VD (64-bit VAX D, VAX-endian)" #: src/language/utilities/set.q:810 msgid "VG (64-bit VAX G, VAX-endian)" msgstr "VG (64-bit VAX G, VAX-endian)" #: src/language/utilities/set.q:814 msgid "ZS (32-bit IBM Z hexadecimal short, big-endian)" msgstr "ZS (32-bit IBM Z hexadecimal short, big-endian)" #: src/language/utilities/set.q:817 msgid "ZL (64-bit IBM Z hexadecimal long, big-endian)" msgstr "ZL (64-bit IBM Z hexadecimal long, big-endian)" #: src/language/utilities/set.q:985 #, c-format msgid "%s is %s." msgstr "%s es %s." #: src/language/utilities/set.q:1089 #, c-format msgid "" "Too many %s commands without a %s: at most %d levels of saved settings are " "allowed." msgstr "" "Demasiados comandos %s sin un %s: se permiten al menos %d niveles de " "configuraciones salvadas." #: src/language/utilities/set.q:1109 #, c-format msgid "%s without matching %s." msgstr "%s sin coincidencia con %s." #: src/language/stats/crosstabs.q:327 #, c-format msgid "Missing mode %s not allowed in general mode. Assuming %s." msgstr "" "El modo de perdido %s no está disponible en el modo general. Se asume %s." #: src/language/stats/crosstabs.q:444 msgid "Too many cross-tabulation variables or dimensions." msgstr "Demasiadas variables o dimensiones para una Tabla Cruzada." #: src/language/stats/crosstabs.q:509 #, c-format msgid "%s must be specified before %s." msgstr "%s tiene que ser especificado antes de %s." #: src/language/stats/crosstabs.q:543 #, c-format msgid "Maximum value (%ld) less than minimum value (%ld)." msgstr "El valor máximo (%ld) en menor que el valor mínimo (%ld)." #: src/language/stats/crosstabs.q:922 #, fuzzy #| msgid "Summary." msgid "Summary" msgstr "Resumen." #: src/language/stats/crosstabs.q:935 #, fuzzy #| msgid "Generate crosstabulations" msgid "Crosstabulation" msgstr "Generar tabulación cruzada" #. TRANSLATORS: The %s here describes a crosstabulation. It takes the #. form "var1 * var2 * var3 * ...". #: src/language/stats/crosstabs.q:1013 #, c-format msgid "Crosstabulation %s contained no non-missing cases." msgstr "La tabla de contingencia %s no contiene ningún caso no-perdido." #: src/language/stats/crosstabs.q:1204 #, fuzzy #| msgid "Missing Values" msgid "Missing value" msgstr "Valores perdidos" #: src/language/stats/crosstabs.q:1263 #, fuzzy #| msgid "row %" msgid "Row %" msgstr "fila %" #: src/language/stats/crosstabs.q:1264 #, fuzzy #| msgid "column %" msgid "Column %" msgstr "columna %" #: src/language/stats/crosstabs.q:1265 #, fuzzy #| msgid "total %" msgid "Total %" msgstr "total %" #: src/language/stats/crosstabs.q:1269 #, fuzzy #| msgid "Adjusted Std. Residual" msgid "Adjusted Residual" msgstr "Residual Tipificado Ajustado" #: src/language/stats/crosstabs.q:1288 #, fuzzy #| msgid "Chi-Square Test" msgid "Chi-Square Tests" msgstr "Test Chi-cuadrado." #: src/language/stats/crosstabs.q:1294 msgid "Pearson Chi-Square" msgstr "Chi-cuadrado de Pearson" # #: src/language/stats/crosstabs.q:1295 msgid "Likelihood Ratio" msgstr "Razón de Semejanza" #: src/language/stats/crosstabs.q:1296 msgid "Fisher's Exact Test" msgstr "Prueba exacta de Fisher" #: src/language/stats/crosstabs.q:1297 msgid "Continuity Correction" msgstr "Corrección de continuidad" #: src/language/stats/crosstabs.q:1298 msgid "Linear-by-Linear Association" msgstr "Asociación Lineal-by-Lineal" #: src/language/stats/crosstabs.q:1299 src/language/stats/crosstabs.q:1345 #: src/language/stats/crosstabs.q:1854 msgid "N of Valid Cases" msgstr "N de casos válidos" #: src/language/stats/crosstabs.q:1305 #, fuzzy #| msgid "Asymp. Sig. (2-tailed)" msgid "Asymptotic Sig. (2-tailed)" msgstr "Sig. Asint. (2-colas)" #: src/language/stats/crosstabs.q:1319 #, fuzzy #| msgid "Symmetric measures." msgid "Symmetric Measures" msgstr "Medidas simétricas." #: src/language/stats/crosstabs.q:1324 src/language/stats/crosstabs.q:1364 #: src/language/stats/crosstabs.q:1411 msgid "Values" msgstr "Valores" #: src/language/stats/crosstabs.q:1326 src/language/stats/crosstabs.q:1413 msgid "Asymp. Std. Error" msgstr "Err. Est. Asint." #: src/language/stats/crosstabs.q:1327 src/language/stats/crosstabs.q:1414 msgid "Approx. T" msgstr "T Aproxim." #: src/language/stats/crosstabs.q:1328 src/language/stats/crosstabs.q:1415 msgid "Approx. Sig." msgstr "Sign. Aproxim." #: src/language/stats/crosstabs.q:1333 src/language/stats/crosstabs.q:1420 msgid "Nominal by Nominal" msgstr "Nominal según Nominal" #: src/language/stats/crosstabs.q:1334 msgid "Cramer's V" msgstr "V de Cramer" #: src/language/stats/crosstabs.q:1334 msgid "Contingency Coefficient" msgstr "Coeficiente de Contingencia" #: src/language/stats/crosstabs.q:1336 src/language/stats/crosstabs.q:1425 msgid "Ordinal by Ordinal" msgstr "Ordinal según Ordinal" #: src/language/stats/crosstabs.q:1337 msgid "Kendall's tau-b" msgstr "Tau-B de Kendall" #: src/language/stats/crosstabs.q:1337 msgid "Kendall's tau-c" msgstr "Tau-C de Kendall" #: src/language/stats/crosstabs.q:1338 msgid "Spearman Correlation" msgstr "Correlación de Spearman" #: src/language/stats/crosstabs.q:1340 msgid "Interval by Interval" msgstr "Intervalo según Intervalo" #: src/language/stats/crosstabs.q:1341 msgid "Pearson's R" msgstr "R de Pearson" #: src/language/stats/crosstabs.q:1343 msgid "Measure of Agreement" msgstr "Medida de Acuerdo" #: src/language/stats/crosstabs.q:1359 #, fuzzy #| msgid "Risk estimate." msgid "Risk Estimate" msgstr "Estimador de Riesgo." #: src/language/stats/crosstabs.q:1368 #, fuzzy, no-c-format #| msgid "95%% Confidence Interval" msgid "95% Confidence Interval" msgstr "Intervalo de Confianza del 95%%" #: src/language/stats/crosstabs.q:1389 msgid "Symmetric" msgstr "Simétrico" #: src/language/stats/crosstabs.q:1391 src/language/stats/crosstabs.q:1396 #, c-format msgid "%s Dependent" msgstr "%s Dependiente" #: src/language/stats/crosstabs.q:1406 #, fuzzy #| msgid "Directional measures." msgid "Directional Measures" msgstr "Medidas direccionales." #: src/language/stats/crosstabs.q:1422 msgid "Goodman and Kruskal tau" msgstr "Tau de Kruskal y Goodman" #: src/language/stats/crosstabs.q:1423 msgid "Uncertainty Coefficient" msgstr "Coeficiente de Incertidumbre" #: src/language/stats/crosstabs.q:1426 msgid "Somers' d" msgstr "D de Somers" #: src/language/stats/crosstabs.q:1428 msgid "Nominal by Interval" msgstr "Nominal según Intervalo" #: src/language/stats/crosstabs.q:1826 #, fuzzy, c-format #| msgid "Odds Ratio for %s (%g / %g)" msgid "Odds Ratio for %s" msgstr "Razón de diferencias para %s (%g / %g)" #: src/language/stats/crosstabs.q:1835 #, fuzzy, c-format #| msgid "For cohort %s = %g" msgid "For cohort %s = " msgstr "Para la cohorte %s = %g" #: src/ui/gui/aggregate.ui:24 msgid "Aggregate Data" msgstr "Datos Agregados" #: src/ui/gui/aggregate.ui:126 msgid "_Break variable(s)" msgstr "Variable(s) de corte" #: src/ui/gui/aggregate.ui:179 msgid "Variable Name: " msgstr "Nombre de Variable: " #: src/ui/gui/aggregate.ui:215 msgid "Variable Label: " msgstr "Etiqueta de variable: " #: src/ui/gui/aggregate.ui:252 msgid "Function: " msgstr "Función: " #: src/ui/gui/aggregate.ui:327 msgid "Argument 1: " msgstr "Argumento 1: " #: src/ui/gui/aggregate.ui:364 msgid "Argument 2: " msgstr "Argumento 2: " #: src/ui/gui/aggregate.ui:428 msgid "Aggregated variables" msgstr "Variables agregadas" #: src/ui/gui/aggregate.ui:469 msgid "_Add aggregated variables to the active dataset" msgstr "_Añadir variables agregadas al conjunto de datos activo" #: src/ui/gui/aggregate.ui:486 msgid "_Replace the current dataset with the aggregated variables" msgstr "_Reemplazar el conjunto de datos actual con variables agregadas" #: src/ui/gui/aggregate.ui:504 msgid "_Write a new data file containing only the aggregated variables" msgstr "" "Escribir un nuevo archivo de datos que contenga sólo las variables agregadas" #: src/ui/gui/aggregate.ui:544 msgid "label" msgstr "etiqueta" #: src/ui/gui/aggregate.ui:593 msgid "File is _already sorted on break variable(s)" msgstr "EL archivo y_a está ordenado según variable(s) de corte." #: src/ui/gui/aggregate.ui:609 msgid "Sort file before a_ggregating" msgstr "Ordenar el archivo antes de a_gregar" #: src/ui/gui/aggregate.ui:630 msgid "Options for very large datasets" msgstr "Opciones para conjuntos de datos muy extensos" #: src/ui/gui/autorecode.ui:24 msgid "Automatic Recode" msgstr "Recodificación Automática" #: src/ui/gui/autorecode.ui:120 msgid "Variable -> New Name" msgstr "Variable -> Nuevo nombre" #: src/ui/gui/autorecode.ui:145 msgid "_Lowest value" msgstr "_Valor Inferior" #: src/ui/gui/autorecode.ui:163 msgid "_Highest value" msgstr "_Valor Superior" #: src/ui/gui/autorecode.ui:185 msgid "Recode starting from" msgstr "Recodificación comienza desde" #: src/ui/gui/autorecode.ui:204 msgid "_New Name" msgstr "_Nuevo Nombre" #: src/ui/gui/autorecode.ui:227 msgid "_Add New Name" msgstr "_Añadir Nuevo Nombre" #: src/ui/gui/autorecode.ui:285 msgid "_Use the same recoding scheme for all variables" msgstr "_Usar el mismo esquema de codificación para todas las variables" #: src/ui/gui/autorecode.ui:301 msgid "Treat _blank string values as missing" msgstr "Tratar los valores de cadena en _blanco como perdidos" #: src/ui/gui/binomial.ui:86 msgid "_Test Variable List:" msgstr "Lista de Variable _Test:" #: src/ui/gui/binomial.ui:160 src/ui/gui/chi-square.ui:281 msgid "_Get from data" msgstr "Obtención de datos" #: src/ui/gui/binomial.ui:181 src/ui/gui/indep-samples.ui:150 msgid "_Cut point:" msgstr "Punto de corte:" #: src/ui/gui/binomial.ui:225 msgid "Define Dichotomy" msgstr "Definir Dicotomía" #: src/ui/gui/binomial.ui:245 msgid "Test _Proportion:" msgstr "Test _Proporción:" #: src/ui/gui/compute.ui:32 msgid "Compute Variable: Type and Label" msgstr "Calcular Variable: Tipo y Etiqueta" #: src/ui/gui/compute.ui:67 msgid "Use _expression as label" msgstr "Utilizar la _expresión como etiqueta" #: src/ui/gui/compute.ui:90 msgid "_Label:" msgstr "Etiqueta:" #: src/ui/gui/compute.ui:194 msgid "_String" msgstr "Cadena" #: src/ui/gui/compute.ui:287 msgid "_Numeric" msgstr "_Numérico" #: src/ui/gui/compute.ui:343 msgid "Compute Variable" msgstr "Calcular Variable" #: src/ui/gui/compute.ui:381 msgid "Target _Variable:" msgstr "_Variable objetivo:" #: src/ui/gui/compute.ui:412 msgid "_Type & Label..." msgstr "_Tipos y Etiquetas" #: src/ui/gui/compute.ui:469 msgid "=" msgstr "=" #: src/ui/gui/compute.ui:526 msgid "_Numeric Expressions:" msgstr "Expresiones _Numéricas:" #: src/ui/gui/compute.ui:598 msgid "_Functions:" msgstr "_Funciones:" #: src/ui/gui/compute.ui:678 msgid "_If..." msgstr "S_i..." #: src/ui/gui/barchart.ui:24 msgid "Barchart" msgstr "Gráfico de Barras" #: src/ui/gui/barchart.ui:112 msgid "Category A_xis:" msgstr "Eje de Categorías:" #: src/ui/gui/barchart.ui:140 msgid "_N of cases" msgstr "_Número de casos" #: src/ui/gui/barchart.ui:158 msgid "_Cum. n of cases" msgstr "Número de casos a_Cumulados" #: src/ui/gui/barchart.ui:174 msgid "Other _summary function" msgstr "Otra función de re_sumen" #: src/ui/gui/barchart.ui:191 msgid "% of c_ases" msgstr "% de c_asos" #: src/ui/gui/barchart.ui:207 msgid "C_um. % of cases" msgstr "% aC_umulado de casos" #: src/ui/gui/barchart.ui:270 src/ui/gui/histogram.ui:100 msgid "_Variable:" msgstr "_Variable:" #: src/ui/gui/barchart.ui:308 msgid "Bars Represent" msgstr "Las barras representan" #: src/ui/gui/barchart.ui:340 msgid "Category C_luster:" msgstr "Agrupación Categórica" #: src/ui/gui/correlation.ui:24 msgid "Bivariate Correlations" msgstr "Correlaciones Bivariadas" #: src/ui/gui/correlation.ui:148 msgid "Pearso_n" msgstr "Pearso_n" #: src/ui/gui/correlation.ui:164 msgid "_Kendall's tau-b" msgstr "Tau-b de _Kendall" #: src/ui/gui/correlation.ui:180 msgid "_Spearman" msgstr "_Spearman" #: src/ui/gui/correlation.ui:200 msgid "Correlation Coefficients" msgstr "Coeficientes de Correlación" #: src/ui/gui/correlation.ui:224 msgid "_Two-tailed" msgstr "Dos colas" #: src/ui/gui/correlation.ui:241 msgid "One-tai_led" msgstr "Una cola" #: src/ui/gui/correlation.ui:262 msgid "Test of Significance" msgstr "Test de Significatividad" #: src/ui/gui/correlation.ui:275 msgid "_Flag significant correlations" msgstr "Marca correlaciones significantes" #: src/ui/gui/count.ui:24 msgid "Count Occurrences of Values within Cases" msgstr "Contar Ocurrencias de Valores dentro de Casos" #: src/ui/gui/count.ui:117 msgid "Numeric _Variables:" msgstr "_Variables Numéricas:" #: src/ui/gui/count.ui:147 msgid "_Target Variable:" msgstr "_Variable Objetivo:" #: src/ui/gui/count.ui:178 msgid "Target _Label:" msgstr "_Etiqueta de Objetivo:" #: src/ui/gui/count.ui:192 msgid "_Define Values..." msgstr "_Definir Valores..." #: src/ui/gui/count.ui:257 msgid "Count Values within Cases: Values to Count" msgstr "Contar Valores en Casos: Valores a Contar" #: src/ui/gui/count.ui:305 msgid "Values _to Count:" msgstr "Valorers _a Contar:" #: src/ui/gui/comments.ui:25 msgid "Data File Comments" msgstr "Comentarios del fichero de datos" #: src/ui/gui/comments.ui:49 msgid "Comments:" msgstr "Comentarios:" #: src/ui/gui/comments.ui:106 msgid "Display comments in output" msgstr "Mostrar comentarios en el resultado" #: src/ui/gui/comments.ui:127 msgid "Column Number: 0" msgstr "Columna Número: 0" #: src/ui/gui/crosstabs.ui:25 msgid "Crosstabs: Cells" msgstr "Tablas Contingencia: Casillas" #: src/ui/gui/crosstabs.ui:67 msgid "Cell Display" msgstr "Contenido de celda" #: src/ui/gui/crosstabs.ui:99 msgid "Crosstabs" msgstr "Tablas _Contingencia" #: src/ui/gui/crosstabs.ui:150 msgid "_Rows" msgstr "_Filas" #: src/ui/gui/crosstabs.ui:195 msgid "_Columns" msgstr "_Columnas" #: src/ui/gui/crosstabs.ui:242 msgid "_Format..." msgstr "_Formato..." #: src/ui/gui/crosstabs.ui:256 src/ui/gui/examine.ui:267 msgid "_Statistics..." msgstr "_Estadísticos..." #: src/ui/gui/crosstabs.ui:270 msgid "Ce_lls..." msgstr "Ce_ldas..." #: src/ui/gui/crosstabs.ui:348 msgid "Crosstabs: Format" msgstr "Tablas Contingencia: Formato" #: src/ui/gui/crosstabs.ui:371 msgid "Print tables" msgstr "Imprimir tablas" #: src/ui/gui/crosstabs.ui:387 msgid "Pivot" msgstr "Pivot" #: src/ui/gui/crosstabs.ui:403 src/ui/gui/sort.ui:157 msgid "Ascending" msgstr "Ascendente" #: src/ui/gui/crosstabs.ui:455 msgid "Crosstabs: Statistics" msgstr "Tablas Contingencia: Estadísticos" #: src/ui/gui/chi-square.ui:30 msgid "Chi-Square Test" msgstr "Test Chi-cuadrado." #: src/ui/gui/chi-square.ui:82 msgid "All categor_ies equal" msgstr "Igual todas las categor_ias" #: src/ui/gui/chi-square.ui:103 msgid "_Values" msgstr "_Valores" #: src/ui/gui/chi-square.ui:159 msgid "Expected Values:" msgstr "Valores Esperados:" #: src/ui/gui/chi-square.ui:204 msgid "Test _Variables" msgstr "_Variables de Prueba" #: src/ui/gui/chi-square.ui:298 msgid "Use _specified range" msgstr "Utiliza rango e_specificado" #: src/ui/gui/chi-square.ui:323 msgid "_Lower:" msgstr "Mínimo:" #: src/ui/gui/chi-square.ui:337 msgid "_Upper:" msgstr "Máximo:" #: src/ui/gui/chi-square.ui:381 msgid "Expected Range:" msgstr "Rango esperado:" #: src/ui/gui/descriptives.ui:131 src/ui/gui/factor.ui:797 #: src/ui/gui/recode.ui:638 msgid "_Variables:" msgstr "_Variables:" #: src/ui/gui/descriptives.ui:176 msgid "S_tatistics:" msgstr "Es_tadísticos:" #: src/ui/gui/descriptives.ui:230 msgid "_Exclude entire case if any selected variable is missing" msgstr "" "_Excluir todo el caso si cualquier variable seleccionada tiene valor perdido" #: src/ui/gui/descriptives.ui:247 msgid "_Include user-missing data in analysis" msgstr "_Incluir los valores perdidos de usuario en el análisis" #: src/ui/gui/descriptives.ui:264 msgid "Save _Z-scores of selected variables as new variables" msgstr "" "Guardar puntuaciones-_Z de las variables seleccionadas como nuevas variables" #: src/ui/gui/descriptives.ui:286 msgid "Options:" msgstr "Opciones:" #: src/ui/gui/examine.ui:25 msgid "Explore" msgstr "Explorar" #: src/ui/gui/examine.ui:69 msgid "_Label Cases by:" msgstr "Etiquetar casos según:" #: src/ui/gui/examine.ui:116 msgid "_Factor List:" msgstr "Lista de _Factores:" #: src/ui/gui/examine.ui:163 src/ui/gui/means.ui:126 msgid "_Dependent List:" msgstr "Lista de _Dependientes:" #: src/ui/gui/examine.ui:331 msgid "Explore: Options" msgstr "Explorar: Opciones" #: src/ui/gui/examine.ui:355 src/ui/gui/t-test.ui:81 msgid "Exclude cases _listwise" msgstr "Excluir casos según _lista" #: src/ui/gui/examine.ui:373 msgid "Exclude cases _pairwise" msgstr "Excluir casos por _pareja" #: src/ui/gui/examine.ui:392 msgid "_Report values" msgstr "Valores pa_ra Informe" #: src/ui/gui/examine.ui:449 msgid "Explore: Statistics" msgstr "Explorar: Estadísticos" #: src/ui/gui/examine.ui:468 src/ui/gui/oneway.ui:576 msgid "_Descriptives" msgstr "_Descriptivos" #: src/ui/gui/examine.ui:485 msgid "_Extremes" msgstr "_Extremos" #: src/ui/gui/examine.ui:502 msgid "_Percentiles" msgstr "_Percentiles" #: src/ui/gui/goto-case.ui:31 msgid "Goto Case" msgstr "Ir al Cas" #: src/ui/gui/goto-case.ui:52 msgid "Goto Case Number:" msgstr "Ir al caso número:" #: src/ui/gui/factor.ui:39 msgid "Factor Analysis: Rotation" msgstr "Análisis Factorial: Rotación" #: src/ui/gui/factor.ui:70 msgid "_None" msgstr "_Ninguno" #: src/ui/gui/factor.ui:87 msgid "_Varimax" msgstr "_Varimax" #: src/ui/gui/factor.ui:104 msgid "_Quartimax" msgstr "_Quartimax" #: src/ui/gui/factor.ui:123 msgid "_Equimax" msgstr "_Equimax" #: src/ui/gui/factor.ui:146 msgid "Method" msgstr "Método" #: src/ui/gui/factor.ui:159 msgid "_Display rotated solution" msgstr "Muestra la solución rotada" #: src/ui/gui/factor.ui:181 src/ui/gui/factor.ui:582 msgid "Ma_ximum iterations for convergence:" msgstr "Iteraciones má_ximas para la convergencia:" #: src/ui/gui/factor.ui:241 src/ui/gui/factor.ui:255 msgid "Principal Components Analysis" msgstr "Análisis de Componentes Principales" #: src/ui/gui/factor.ui:246 src/ui/gui/factor.ui:258 msgid "Principal Axis Factoring" msgstr "Factorización de Ejes Principales" #: src/ui/gui/factor.ui:264 msgid "Factor Analysis: Extraction" msgstr "Análisis Factorial: Extracción" #: src/ui/gui/factor.ui:290 msgid "_Method: " msgstr "_Método: " #: src/ui/gui/factor.ui:345 msgid "Co_rrelation matrix" msgstr "Matriz de Co_rrelaciones" #: src/ui/gui/factor.ui:361 msgid "Co_variance matrix" msgstr "Matriz de Co_variancias" #: src/ui/gui/factor.ui:382 msgid "Analyze" msgstr "_Analizar" #: src/ui/gui/factor.ui:407 msgid "_Unrotated factor solution" msgstr "Solución factorial _sin rotar" #: src/ui/gui/factor.ui:423 msgid "_Scree plot" msgstr "Gráfico de _sedimentación" #: src/ui/gui/factor.ui:443 src/ui/gui/histogram.ui:146 src/ui/gui/roc.ui:329 msgid "Display" msgstr "Contenido" #: src/ui/gui/factor.ui:526 msgid "_Number of factors:" msgstr "_Número de factores:" #: src/ui/gui/factor.ui:563 msgid "Extract" msgstr "Extracción" #: src/ui/gui/factor.ui:640 msgid "Factor Analysis" msgstr "Análisis Factorial" #: src/ui/gui/factor.ui:672 src/ui/gui/data-editor.ui:266 msgid "_Descriptives..." msgstr "_Descriptivos..." #: src/ui/gui/factor.ui:685 msgid "_Extraction..." msgstr "_Extracción..." #: src/ui/gui/factor.ui:699 msgid "_Rotations..." msgstr "_Rotaciones..." #: src/ui/gui/find.ui:25 msgid "Find Case" msgstr "Buscar caso" #: src/ui/gui/find.ui:117 msgid "Variable:" msgstr "Variable:" #: src/ui/gui/find.ui:157 src/ui/gui/val-labs-dialog.ui:113 msgid "Value:" msgstr "Valor:" #: src/ui/gui/find.ui:180 msgid "Search value labels" msgstr "Buscar etiquetas de valor" #: src/ui/gui/find.ui:210 msgid "Regular expression Match" msgstr "Expresión regular coincidente" #: src/ui/gui/find.ui:227 msgid "Search substrings" msgstr "Buscar subcadenas" #: src/ui/gui/find.ui:244 msgid "Wrap around" msgstr "Envolver" #: src/ui/gui/find.ui:260 msgid "Search backward" msgstr "Buscar hacia atrás" #: src/ui/gui/frequencies.ui:32 msgid "Frequencies: Frequency Tables" msgstr "Frecuencias: Tablas de frecuencias" #: src/ui/gui/frequencies.ui:67 msgid "_Always" msgstr "Siempre" #: src/ui/gui/frequencies.ui:85 msgid "_Never" msgstr "_Nunca" #: src/ui/gui/frequencies.ui:107 msgid "If no _more than " msgstr "Si no _más de " #: src/ui/gui/frequencies.ui:129 src/ui/gui/frequencies.ui:454 msgid "100" msgstr "100" #: src/ui/gui/frequencies.ui:145 msgid "values" msgstr "Valores" #: src/ui/gui/frequencies.ui:167 msgid "Display frequency tables" msgstr "Mostrar tabla de frecuencias" #: src/ui/gui/frequencies.ui:194 msgid "A_scending value" msgstr "Valor A_scendente" #: src/ui/gui/frequencies.ui:212 msgid "D_escending value" msgstr "Valor D_escendente" #: src/ui/gui/frequencies.ui:230 msgid "Ascending _frequency" msgstr "_Frecuencia Ascendente" #: src/ui/gui/frequencies.ui:248 msgid "Descending f_requency" msgstr "F_recuencia Descendente" #: src/ui/gui/frequencies.ui:271 msgid "Order by" msgstr "Ordenado por" #: src/ui/gui/frequencies.ui:324 msgid "Frequencies: Charts" msgstr "Frecuencias: Gráficos" #: src/ui/gui/frequencies.ui:356 msgid "Scale:" msgstr "Escala:" #: src/ui/gui/frequencies.ui:366 msgid "_Frequencies" msgstr "_Frecuencias" #: src/ui/gui/frequencies.ui:383 msgid "_Percentages" msgstr "_Porcentajes" #: src/ui/gui/frequencies.ui:407 msgid "Exclude values _below " msgstr "Excluir valores por de_bajo de" #: src/ui/gui/frequencies.ui:422 msgid "Exclude values _above " msgstr "Excluir valores por encim_a " #: src/ui/gui/frequencies.ui:441 src/ui/gui/reliability.ui:227 msgid "0" msgstr "0" #: src/ui/gui/frequencies.ui:469 msgid "Chart Formatting" msgstr "Formato de Gráficos" #: src/ui/gui/frequencies.ui:494 msgid "Draw _histograms" msgstr "Dibujar _histogramas" #: src/ui/gui/frequencies.ui:510 msgid "Superimpose _normal curve" msgstr "Sobreimprimir curva _normal" #: src/ui/gui/frequencies.ui:530 msgid "Histograms" msgstr "Histogramas" #: src/ui/gui/frequencies.ui:555 msgid "Draw _bar charts" msgstr "Dibuja gráficos de _barras" #: src/ui/gui/frequencies.ui:575 msgid "Bar Charts" msgstr "Diagramas de Barras" #: src/ui/gui/frequencies.ui:600 msgid "Draw _pie charts" msgstr "Dibuja gráficos de sectores" #: src/ui/gui/frequencies.ui:616 msgid "Include slices for _missing values" msgstr "Incluir sectores para los valores perdidos" #: src/ui/gui/frequencies.ui:636 msgid "Pie Charts" msgstr "Diagramas de Sectores" #: src/ui/gui/frequencies.ui:725 src/ui/gui/rank.ui:489 msgid "_Variable(s):" msgstr "_Variable(s):" #: src/ui/gui/frequencies.ui:769 msgid "_Statistics:" msgstr "_Estadísticos:" #: src/ui/gui/frequencies.ui:783 msgid "Include _missing values" msgstr "Incluir valores _perdidos" #: src/ui/gui/frequencies.ui:806 msgid "Ch_arts..." msgstr "Gráfic_as..." #: src/ui/gui/frequencies.ui:821 msgid "Frequency _Tables..." msgstr "_Tablas de Frecuencias..." #: src/ui/gui/histogram.ui:24 msgid "Histogram" msgstr "Histograma" #: src/ui/gui/histogram.ui:126 msgid "_Display normal curve" msgstr "Mostrar la curva normal" #: src/ui/gui/indep-samples.ui:25 src/ui/gui/k-independent.ui:35 msgid "Define Groups" msgstr "Definir Grupos" #: src/ui/gui/indep-samples.ui:75 msgid "Group_2 value:" msgstr "Valor del grupo 2:" #: src/ui/gui/indep-samples.ui:89 msgid "Group_1 value:" msgstr "Valor del Grupo 1:" #: src/ui/gui/indep-samples.ui:190 msgid "_Use specified values:" msgstr "Utiliza valores especificados:" #: src/ui/gui/indep-samples.ui:259 msgid "Independent-Samples T Test" msgstr "Prueba T para muestras Independientes" #: src/ui/gui/indep-samples.ui:319 msgid "_Define Groups..." msgstr "_Definir Grupos" #: src/ui/gui/indep-samples.ui:401 src/ui/gui/t-test.ui:211 msgid "_Test Variable(s):" msgstr "Variable(s) de con_traste:" #: src/ui/gui/indep-samples.ui:454 src/ui/gui/k-independent.ui:165 msgid "_Grouping Variable:" msgstr "Variable de a_grupación:" #: src/ui/gui/k-independent.ui:63 msgid "_Upper limit:" msgstr "Límite superior:" #: src/ui/gui/k-independent.ui:77 msgid "_Lower limit:" msgstr "Límite inferior:" #: src/ui/gui/k-independent.ui:136 msgid "Tests for Several Independent Samples" msgstr "Contraste para K muestras independientes" #: src/ui/gui/k-independent.ui:208 src/ui/gui/ks-one-sample.ui:131 msgid "Test _Variable List:" msgstr "Lista de Variables de _Prueba:" #: src/ui/gui/k-independent.ui:320 msgid "_Define Groups" msgstr "_Definir Grupos" #: src/ui/gui/k-independent.ui:365 msgid "_Kruskal-Wallis H" msgstr "H de _Kruskal-Wallis" #: src/ui/gui/k-independent.ui:382 src/ui/gui/runs.ui:140 msgid "_Median" msgstr "_Mediana" #: src/ui/gui/k-means.ui:24 msgid "K-Means Cluster Analysis" msgstr "Análisis de Conglomerados K-Medias" #: src/ui/gui/k-means.ui:122 msgid "N_umber of Clusters: " msgstr "_Número de Conglomerados: " #: src/ui/gui/k-related.ui:24 msgid "Tests for Several Related Samples" msgstr "Tests para diversas muestras relacionadas" #: src/ui/gui/k-related.ui:113 msgid "_Test Variables:" msgstr "Variables de _Test:" #: src/ui/gui/k-related.ui:145 msgid "_Friedman" msgstr "_Friedman" #: src/ui/gui/k-related.ui:161 msgid "_Kendall's W" msgstr "W de _Kendall" #: src/ui/gui/k-related.ui:177 msgid "_Cochran's Q" msgstr "Q de _Cochran" #: src/ui/gui/ks-one-sample.ui:163 msgid "_Normal" msgstr "_Normal" #: src/ui/gui/ks-one-sample.ui:181 msgid "_Poisson" msgstr "_Poisson" #: src/ui/gui/ks-one-sample.ui:198 msgid "_Uniform" msgstr "_Uniforme" #: src/ui/gui/ks-one-sample.ui:213 msgid "_Exponential" msgstr "_Exponencial" #: src/ui/gui/ks-one-sample.ui:232 msgid "Test Distribution" msgstr "Distribución de Prueba" #: src/ui/gui/logistic.ui:42 msgid "Logistic Regression: Options" msgstr "Regresión Logística: Opciones" #: src/ui/gui/logistic.ui:66 msgid "CI for _exp(B): " msgstr "IC para _exp(B): " #: src/ui/gui/logistic.ui:97 msgid "%" msgstr "%" #: src/ui/gui/logistic.ui:146 msgid "Classification cu_toff: " msgstr "Cor_te de Clasificación: " #: src/ui/gui/logistic.ui:159 msgid "_Maximum Iterations: " msgstr "Iteraciones _máximas:" #: src/ui/gui/logistic.ui:177 msgid "Include _constant in model" msgstr "Incluir _constante en el modelo" #: src/ui/gui/logistic.ui:219 msgid "Logistic Regression" msgstr "Regresión Logística" #: src/ui/gui/logistic.ui:364 src/ui/gui/regression.ui:185 msgid "_Dependent" msgstr "_Dependiente" #: src/ui/gui/logistic.ui:412 src/ui/gui/regression.ui:232 msgid "_Independent" msgstr "_Independiente" #: src/ui/gui/means.ui:25 msgid "Means" msgstr "Medias" #: src/ui/gui/means.ui:179 msgid "_Independent List:" msgstr "Lista de _Independientes:" #: src/ui/gui/missing-val-dialog.ui:48 msgid "_No missing values" msgstr "Si_n valores perdidos" #: src/ui/gui/missing-val-dialog.ui:136 msgid "_Discrete missing values" msgstr "Valores perdidos _Discretos" #: src/ui/gui/missing-val-dialog.ui:172 msgid "_Low:" msgstr "Inferior:" #: src/ui/gui/missing-val-dialog.ui:197 msgid "_High:" msgstr "Superior:" #: src/ui/gui/missing-val-dialog.ui:221 msgid "Di_screte value:" msgstr "Valor Di_screto:" #: src/ui/gui/missing-val-dialog.ui:245 msgid "_Range plus one optional discrete missing value" msgstr "Intervalo más un valor perdido discreto ocpional" #: src/ui/gui/oneway.ui:25 msgid "One-Way ANOVA: Contrasts" msgstr "ANOVA de un factor: Contrastes" #: src/ui/gui/oneway.ui:107 msgid "_Coefficients:" msgstr "_Coeficientes:" #: src/ui/gui/oneway.ui:161 msgid "Coefficient Total: " msgstr "Coeficiente Total: " #: src/ui/gui/oneway.ui:198 msgid "Contrast 1 of 1" msgstr "Contraste 1 de 1" #: src/ui/gui/oneway.ui:234 #, fuzzy #| msgid "One-Way ANOVA: Contrasts" msgid "One-Way ANOVA: Post-Hoc" msgstr "ANOVA de un factor: Contrastes" #: src/ui/gui/oneway.ui:270 #, fuzzy #| msgid "Games-Howell" msgid "Games Howell" msgstr "Games-Howell" #: src/ui/gui/oneway.ui:287 msgid "Fisher's LSD" msgstr "" #: src/ui/gui/oneway.ui:379 msgid "One-Way ANOVA" msgstr "ANOVA de un factor" #: src/ui/gui/oneway.ui:408 msgid "_Factor:" msgstr "_Factor:" #: src/ui/gui/oneway.ui:451 msgid "Dependent _Variable(s):" msgstr "_Variable(s) Dependientes:" #: src/ui/gui/oneway.ui:593 msgid "_Homogeneity" msgstr "_Homogeneidad" #: src/ui/gui/oneway.ui:637 msgid "Post-Hoc..." msgstr "" #: src/ui/gui/oneway.ui:652 msgid "_Contrasts..." msgstr "_Contrastes..." #: src/ui/gui/options.ui:25 msgid "Options Case" msgstr "Opciones de caso" #: src/ui/gui/options.ui:55 msgid "Display _Labels" msgstr "Mostrar Etiquetas" #: src/ui/gui/options.ui:71 msgid "Display _Names" msgstr "Mostrar _Nombres" #: src/ui/gui/options.ui:99 msgid "Sort by L_abel" msgstr "Ordenar por etiqueta" #: src/ui/gui/options.ui:115 msgid "Sort by Na_me" msgstr "Ordenar por No_mbre" #: src/ui/gui/options.ui:131 msgid "Do not S_ort" msgstr "No _ordenar" #: src/ui/gui/options.ui:159 msgid "Variable Lists" msgstr "Lista de Variables" #: src/ui/gui/options.ui:184 msgid "Ma_ximize" msgstr "Ma_ximizar" #: src/ui/gui/options.ui:199 msgid "_Raise" msgstr "Elevado" #: src/ui/gui/options.ui:214 msgid "Aler_t" msgstr "Aler_ta" #: src/ui/gui/options.ui:233 msgid "Output Window Action" msgstr "Acción de Ventana de Resultados" #: src/ui/gui/paired-samples.ui:147 msgid "_Test Pair(s):" msgstr "Pareja(s) para Con_traste:" #: src/ui/gui/rank.ui:30 msgid "Rank Cases: Types" msgstr "Ranking de casos: Tipos" #: src/ui/gui/rank.ui:57 msgid "Sum of case _weights" msgstr "Suma de ponderaciones de casos" #: src/ui/gui/rank.ui:74 msgid "Fractional rank as _%" msgstr "Ranking fraccional como _%" #: src/ui/gui/rank.ui:92 msgid "_Fractional rank" msgstr "Ranking fraccional" #: src/ui/gui/rank.ui:109 msgid "_Savage score" msgstr "Puntuación _Savage" #: src/ui/gui/rank.ui:125 msgid "_Rank" msgstr "_Ranking" #: src/ui/gui/rank.ui:147 msgid "N_tiles" msgstr "N_tiles" #: src/ui/gui/rank.ui:195 msgid "_Proportion Estimates" msgstr "Estimación de _Proporciones" #: src/ui/gui/rank.ui:213 msgid "_Normal Scores" msgstr "Puntuaciones _Normales" #: src/ui/gui/rank.ui:251 msgid "_Blom" msgstr "_Blom" #: src/ui/gui/rank.ui:269 msgid "Tuke_y" msgstr "Tuke_y" #: src/ui/gui/rank.ui:287 msgid "Ran_kit" msgstr "Ran_kit" #: src/ui/gui/rank.ui:305 msgid "_Van der Waerden" msgstr "_Van der Waerden" #: src/ui/gui/rank.ui:328 msgid "Proportion Estimation Formula" msgstr "Fórmula de estimación de Proporciones" #: src/ui/gui/rank.ui:369 msgid "Rank Cases" msgstr "Ranking de Casos" #: src/ui/gui/rank.ui:434 msgid "_By:" msgstr "Según:" #: src/ui/gui/rank.ui:595 msgid "_Smallest Value" msgstr "Valor Inferior" #: src/ui/gui/rank.ui:613 msgid "_Largest Value" msgstr "Valor Superior" #: src/ui/gui/rank.ui:637 msgid "Assign rank 1 to:" msgstr "Asigna ranking 1 a:" #: src/ui/gui/rank.ui:656 msgid "_Display summary tables" msgstr "Muestra tablas resumen" #: src/ui/gui/rank.ui:679 msgid "Rank T_ypes" msgstr "Tipos de Ranking" #: src/ui/gui/rank.ui:694 msgid "_Ties..." msgstr "Vínculos..." #: src/ui/gui/rank.ui:756 msgid "Rank Cases: Ties" msgstr "Rango de casos: Vínculos" #: src/ui/gui/rank.ui:788 msgid "_Mean" msgstr "_Media" #: src/ui/gui/rank.ui:806 msgid "_Low" msgstr "Bajo" #: src/ui/gui/rank.ui:825 msgid "_High" msgstr "Superior" #: src/ui/gui/rank.ui:851 msgid "_Sequential ranks to unique values" msgstr "Rangos _Secuenciales para valores únicos" #: src/ui/gui/rank.ui:875 msgid "Rank Assigned to Ties" msgstr "Rango asignado a empates" #: src/ui/gui/runs.ui:155 msgid "M_ean" msgstr "M_edia" #: src/ui/gui/runs.ui:171 msgid "Mo_de" msgstr "M_oda" #: src/ui/gui/runs.ui:191 msgid "_Custom:" msgstr "_Personalizado:" #: src/ui/gui/runs.ui:230 msgid "Cut Point" msgstr "Punto de corte" #: src/ui/gui/sort.ui:25 msgid "Sort Cases" msgstr "Ordenar Casos" #: src/ui/gui/sort.ui:101 msgid "Sort by:" msgstr "Ordenado por:" #: src/ui/gui/sort.ui:174 msgid "Descending" msgstr "Descendente" #: src/ui/gui/sort.ui:196 msgid "Sort Order" msgstr "Ordenación" #: src/ui/gui/split-file.ui:25 msgid "Split File" msgstr "Dividir Archivo" #: src/ui/gui/split-file.ui:103 msgid "Anal_yze all cases. Do not create groups." msgstr "Analizar todos los casos. No crear grupos." #: src/ui/gui/split-file.ui:121 msgid "Compare _groups." msgstr "Comparar _grupos." #: src/ui/gui/split-file.ui:140 msgid "Organize ou_tput by groups." msgstr "Organizar los resul_tados por grupos." #: src/ui/gui/split-file.ui:225 msgid "Groups _based on:" msgstr "Grupos _basados en:" #: src/ui/gui/split-file.ui:255 msgid "_Sort the file by grouping variables." msgstr "Ordenar el archivo por las variable_s de agrupación." #: src/ui/gui/split-file.ui:273 msgid "_File is already sorted." msgstr "El archivo ya está ordenado." #: src/ui/gui/split-file.ui:334 msgid "Current Status : " msgstr "Estatus actual : " #: src/ui/gui/split-file.ui:348 msgid "Analysis by groups is off" msgstr "El análisis por grupos está activado" #: src/ui/gui/recode.ui:135 msgid "System _Missing" msgstr "Perdido del Siste_ma" #: src/ui/gui/recode.ui:150 msgid "Co_py old values" msgstr "Co_piar los valores anteriores" #: src/ui/gui/recode.ui:172 msgid "Va_lue: " msgstr "Va_lor: " #: src/ui/gui/recode.ui:276 msgid "Conver_t numeric strings to numbers (`5' -> 5)" msgstr "Conver_tir cadenas numéricas a números (`5' -> 5)" #: src/ui/gui/recode.ui:297 msgid "Output variables are _strings" msgstr "Las variables de salida son alfabética_s" #: src/ui/gui/recode.ui:318 msgid "Width: " msgstr "Ancho: " #: src/ui/gui/recode.ui:499 msgid "_Name:" msgstr "_Nombre:" #: src/ui/gui/recode.ui:527 msgid "La_bel:" msgstr "Etiqueta:" #: src/ui/gui/recode.ui:556 msgid "Chan_ge" msgstr "Cambio" #: src/ui/gui/recode.ui:584 msgid "Output Variable" msgstr "Variables de salida" #: src/ui/gui/recode.ui:658 msgid "Old and New Va_lues..." msgstr "Va_lores anteriores y nuevos" #: src/ui/gui/regression.ui:51 msgid "S_tatistics..." msgstr "E_stadísticos..." #: src/ui/gui/regression.ui:272 msgid "Regression: Save" msgstr "Regresión: Guardar" #: src/ui/gui/regression.ui:290 src/ui/gui/univariate.ui:42 msgid "_Predicted values" msgstr "Valores _Predichos" #: src/ui/gui/regression.ui:307 src/ui/gui/univariate.ui:59 msgid "_Residuals" msgstr "_Residuales" #: src/ui/gui/regression.ui:351 msgid "Regression: Statistics" msgstr "Regresión: Estadísticos" #: src/ui/gui/regression.ui:393 src/ui/gui/univariate.ui:143 msgid "S_tatistics" msgstr "Es_tadísticos" #: src/ui/gui/reliability.ui:34 msgid "Alpha" msgstr "Alpha" #: src/ui/gui/reliability.ui:43 msgid "Reliability Analysis" msgstr "Análisis de Fiabilidad" #: src/ui/gui/reliability.ui:144 msgid "_Items:" msgstr "_Items:" #: src/ui/gui/reliability.ui:166 msgid "_Model: " msgstr "_Modelo: " #: src/ui/gui/reliability.ui:212 msgid "_Variables in first split:" msgstr "_Variables en la primera segmentación:" #: src/ui/gui/reliability.ui:259 msgid "Show _descriptives for scale if item is deleted" msgstr "Muestra _descriptivos para escalas si el item es eliminado" #: src/ui/gui/roc.ui:145 msgid "_Test Variable:" msgstr "Variable de prueba:" #: src/ui/gui/roc.ui:175 msgid "_State Variable:" msgstr "Variable de Estado:" #: src/ui/gui/roc.ui:202 msgid "_Value of state variable:" msgstr "_Valor de la variable de estado:" #: src/ui/gui/roc.ui:249 msgid "ROC C_urve" msgstr "Curva ROC" #: src/ui/gui/roc.ui:269 msgid "_With diagonal reference line" msgstr "Con línea de referencia diagonal" #: src/ui/gui/roc.ui:293 msgid "Standard _Error and Confidence Interval" msgstr "_Error típico y Intervalo de Confianza" #: src/ui/gui/roc.ui:309 msgid "_Coordinate points of the ROC Curve" msgstr "_Coordenadas de la Curva ROC" #: src/ui/gui/scatterplot.ui:25 msgid "Scatterplot" msgstr "Gráfico de Puntos" #: src/ui/gui/scatterplot.ui:56 msgid "_X Axis:" msgstr "Eje _X:" #: src/ui/gui/scatterplot.ui:100 msgid "_Y Axis:" msgstr "Eje _Y:" #: src/ui/gui/select-cases.ui:37 msgid "Select Cases: Range" msgstr "Seleccionar casos: Rango" #: src/ui/gui/select-cases.ui:87 msgid "First case" msgstr "Primer caso" #: src/ui/gui/select-cases.ui:99 msgid "Last case" msgstr "Último caso" #: src/ui/gui/select-cases.ui:111 msgid "Observation" msgstr "Observación" #: src/ui/gui/select-cases.ui:161 msgid "Select Cases" msgstr "Seleccionar casos" #: src/ui/gui/select-cases.ui:313 msgid "Use filter variable" msgstr "Utilizar variable de filtro" #: src/ui/gui/select-cases.ui:380 msgid "Based on time or case range" msgstr "Basado en intervalo de tiempos o casos" #: src/ui/gui/select-cases.ui:395 msgid "Range..." msgstr "Intervalo..." #: src/ui/gui/select-cases.ui:444 msgid "Random sample of cases" msgstr "Muestra aleatoria de casos" #: src/ui/gui/select-cases.ui:460 msgid "Sample..." msgstr "Muestra..." #: src/ui/gui/select-cases.ui:508 msgid "If condition is satisfied" msgstr "Si la condición se satisface" #: src/ui/gui/select-cases.ui:523 msgid "If..." msgstr "Si..." #: src/ui/gui/select-cases.ui:567 msgid "All Cases" msgstr "Todos los Casos" #: src/ui/gui/select-cases.ui:581 msgid "Select" msgstr "Seleccionar" #: src/ui/gui/select-cases.ui:608 msgid "Filtered" msgstr "Filtrado" #: src/ui/gui/select-cases.ui:625 msgid "Deleted" msgstr "Eliminado" #: src/ui/gui/select-cases.ui:647 msgid "Unselected Cases Are" msgstr "Los casos no seleccionados son" #: src/ui/gui/select-cases.ui:694 msgid "Select Cases: Random Sample" msgstr "Seleccionar casos: Muestra aleatoria" #: src/ui/gui/select-cases.ui:756 msgid "Sample Size" msgstr "Tamaño de muestra" #: src/ui/gui/t-test.ui:25 msgid "Options" msgstr "Opciones" #: src/ui/gui/t-test.ui:63 msgid "Exclude cases _analysis by analysis" msgstr "Excluir casos _análisis por análisis" #: src/ui/gui/t-test.ui:148 msgid "One - Sample T Test" msgstr "Prueba T para una muestra" #: src/ui/gui/t-test.ui:265 msgid "Test _Value: " msgstr "_Valor de Prueba: " #: src/ui/gui/text-data-import.ui:32 msgid "Select the first line of the data file that contains data." msgstr "Seleccionar la primera línea del archivo que contiene datos." #: src/ui/gui/text-data-import.ui:54 msgid "Line above selected line contains variable names" msgstr "" "La línea por encima de la seleccionada contiene los nombres de las variables" #: src/ui/gui/text-data-import.ui:80 msgid "" "Check the data formats displayed below and fix any that are incorrect. You " "may set other variable properties now or later." msgstr "" "Comprueba los formatos de los datos mostrados a continuación y corrige los " "problemas. Se pueden asignar propiedades de las variables ahora o más " "adelante." #: src/ui/gui/text-data-import.ui:121 msgid "Variables" msgstr "Variables" #: src/ui/gui/text-data-import.ui:152 msgid "Data Preview" msgstr "Pre-visualización de datos" #: src/ui/gui/text-data-import.ui:181 msgid "" "This assistant will guide you through the process of importing data into " "PSPP from a text file with one line per case, in which fields are separated " "by tabs, commas, or other delimiters.\n" "\n" "\tThe selected file contains N lines of text. Only the first M of these " "will be shown for preview purposes in the following screens. You may choose " "below how much of the file should actually be imported." msgstr "" "Este asistente te guiará a lo largo del proceso de importar datos al PSPP " "desde un archivo de texto con una línea por caso, en el cual los campos " "están separados por tabuladores, comas, u otros delimitadores.\n" "\n" "\tEl archivo seleccionado contiene N líneas de texto. Solo las primeras M " "se mostrarán como pre-visualización en las pantallas siguientes. Puedes " "escoger a continuación qué parte del archivo ha de ser importado." #: src/ui/gui/text-data-import.ui:252 msgid "All cases" msgstr "Todos los casos" #: src/ui/gui/text-data-import.ui:272 msgid "Amount to Import" msgstr "Cantidad a importar" #: src/ui/gui/text-data-import.ui:325 msgid "C_ustom" msgstr "_Usuario" #: src/ui/gui/text-data-import.ui:341 msgid "Slas_h (/)" msgstr "Barra (/)" #: src/ui/gui/text-data-import.ui:357 msgid "Semicolo_n (;)" msgstr "Punto y coma (;)" #: src/ui/gui/text-data-import.ui:373 msgid "P_ipe (|)" msgstr "Barra (|)" #: src/ui/gui/text-data-import.ui:389 msgid "H_yphen (-)" msgstr "Guión (-)" #: src/ui/gui/text-data-import.ui:405 msgid "Co_mma (,)" msgstr "Coma (,)" #: src/ui/gui/text-data-import.ui:421 msgid "_Colon (:)" msgstr "Dos puntos (:)" #: src/ui/gui/text-data-import.ui:437 msgid "Ban_g (!)" msgstr "Exclamación (!)" #: src/ui/gui/text-data-import.ui:453 msgid "Ta_b" msgstr "Tabulador" #: src/ui/gui/text-data-import.ui:469 msgid "_Space" msgstr "E_spacio" #: src/ui/gui/text-data-import.ui:490 msgid "Separators" msgstr "Separadores" #: src/ui/gui/text-data-import.ui:541 msgid "Quote separator characters with" msgstr "Anchura de caracteres separadores con comillas" #: src/ui/gui/text-data-import.ui:561 msgid "Quoting" msgstr "Comillas" #: src/ui/gui/text-data-import.ui:599 msgid "Fields Preview" msgstr "Pre-visualizar Campos" #: src/ui/gui/text-data-import.ui:622 msgid "" "Enter below the sheet number and the cell range which you wish to import." msgstr "" "Introducir a continuación un número de hoja y el rango de celdas que se " "quieren importar." #: src/ui/gui/text-data-import.ui:670 msgid "_Cells: " msgstr "_Celdas: " #: src/ui/gui/text-data-import.ui:684 msgid "_Sheet Index: " msgstr "Índice de hoja de cálculo: " #: src/ui/gui/text-data-import.ui:695 msgid "Use first row as _variable names" msgstr "Usar la primera fila como nombres de _variable." #: src/ui/gui/text-data-import.ui:717 msgid "Cells to Import" msgstr "Celdas a importar" #: src/ui/gui/transpose.ui:24 msgid "Transpose" msgstr "Transponer" #: src/ui/gui/transpose.ui:91 msgid "Name Variable:" msgstr "Nombre de Variable:" #: src/ui/gui/transpose.ui:127 msgid "Variable(s):" msgstr "Variable(s):" #: src/ui/gui/univariate.ui:25 msgid "Univariate: Save" msgstr "Univariado: Guardar" #: src/ui/gui/univariate.ui:103 msgid "Univariate: Statistics" msgstr "Univariado: Estadísticos" #: src/ui/gui/univariate.ui:178 msgid "Univariate" msgstr "Univariado" #: src/ui/gui/univariate.ui:281 msgid "_Dependent Variable" msgstr "Variable _Dependiente" #: src/ui/gui/univariate.ui:329 msgid "_Fixed Factors" msgstr "_Factores Fijos:" #: src/ui/gui/val-labs-dialog.ui:101 msgid "Value Label:" msgstr "Etiqueta de Valor:" #: src/ui/gui/data-editor.ui:33 msgid "Information Area" msgstr "Área de Información" #: src/ui/gui/data-editor.ui:55 msgid "Case Counter Area" msgstr "Área de Recuento" #: src/ui/gui/data-editor.ui:80 msgid "Filter Use Status Area" msgstr "Área de uso de Filtro" #: src/ui/gui/data-editor.ui:106 msgid "Weight Status Area" msgstr "Área de Ponderación" #: src/ui/gui/data-editor.ui:132 msgid "Split File Status Area" msgstr "Área de División de Archivo" #: src/ui/gui/data-editor.ui:154 msgid "_View" msgstr "_Vista" #: src/ui/gui/data-editor.ui:157 msgid "_Status Bar" msgstr "Barra de E_stado" #: src/ui/gui/data-editor.ui:163 msgid "_Font..." msgstr "_Fuentes..." #: src/ui/gui/data-editor.ui:167 msgid "_Grid Lines" msgstr "Líneas divisorias" #: src/ui/gui/data-editor.ui:171 msgid "Value _Labels" msgstr "Etiquetas de Valor" #: src/ui/gui/data-editor.ui:182 msgid "_Variables" msgstr "_Variables" #: src/ui/gui/data-editor.ui:192 msgid "_Sort Cases..." msgstr "Ordenar Caso_s..." #: src/ui/gui/data-editor.ui:196 msgid "_Transpose..." msgstr "_Trasponer..." #: src/ui/gui/data-editor.ui:200 msgid "_Aggregate..." msgstr "_Agregar..." #: src/ui/gui/data-editor.ui:206 msgid "S_plit File..." msgstr "Dividir Archivo..." #: src/ui/gui/data-editor.ui:210 msgid "Select _Cases..." msgstr "Seleccionar _Casos..." #: src/ui/gui/data-editor.ui:214 msgid "_Weight Cases..." msgstr "Ponderar Casos..." #: src/ui/gui/data-editor.ui:220 msgid "_Transform" msgstr "_Transformar" #: src/ui/gui/data-editor.ui:223 msgid "_Compute..." msgstr "_Calcular..." #: src/ui/gui/data-editor.ui:227 msgid "Cou_nt..." msgstr "Recue_nto..." #: src/ui/gui/data-editor.ui:231 msgid "Ran_k Cases..." msgstr "Ran_king de Casos..." #: src/ui/gui/data-editor.ui:235 msgid "Auto_matic Recode..." msgstr "Recodificación Auto_mática..." #: src/ui/gui/data-editor.ui:241 msgid "Recode into _Same Variables..." msgstr "Recodificar en las Misma_s Variables..." #: src/ui/gui/data-editor.ui:245 msgid "Recode into _Different Variables..." msgstr "Recodificar en Variables _Diferentes..." #: src/ui/gui/data-editor.ui:251 msgid "_Run Pending Transforms" msgstr "Ejecuta_r Transformaciones pendientes" #: src/ui/gui/data-editor.ui:257 msgid "_Analyze" msgstr "_Analizar" #: src/ui/gui/data-editor.ui:260 msgid "_Descriptive Statistics" msgstr "Estadística _Descriptiva" #: src/ui/gui/data-editor.ui:262 msgid "_Frequencies..." msgstr "_Frecuencias..." #: src/ui/gui/data-editor.ui:270 msgid "_Explore..." msgstr "_Explorar..." #: src/ui/gui/data-editor.ui:274 msgid "_Crosstabs..." msgstr "Tablas _Cruzadas..." #: src/ui/gui/data-editor.ui:279 msgid "Compare _Means" msgstr "Comparar _Medias" #: src/ui/gui/data-editor.ui:281 msgid "_Means..." msgstr "_Medias..." #: src/ui/gui/data-editor.ui:285 msgid "_One Sample T Test..." msgstr "Prueba T para Una Muestra..." #: src/ui/gui/data-editor.ui:289 msgid "_Independent Samples T Test..." msgstr "Prueba T para Muestras _Independientes..." #: src/ui/gui/data-editor.ui:293 msgid "_Paired Samples T Test..." msgstr "Prueba T para Muestras Em_parejadas..." #: src/ui/gui/data-editor.ui:297 msgid "One Way _ANOVA..." msgstr "_ANOVA de un factor..." #: src/ui/gui/data-editor.ui:302 msgid "_Univariate Analysis..." msgstr "Análisis Univariado..." #: src/ui/gui/data-editor.ui:306 msgid "Bivariate _Correlation..." msgstr "_Correlación Bivariada..." #: src/ui/gui/data-editor.ui:310 msgid "_K-Means Cluster..." msgstr "Conglomerado K-Medias..." #: src/ui/gui/data-editor.ui:314 msgid "_Factor Analysis..." msgstr "Análisis _Factorial..." #: src/ui/gui/data-editor.ui:318 msgid "Re_liability..." msgstr "Fiabi_lidad..." #: src/ui/gui/data-editor.ui:322 msgid "_Regression" msgstr "_Regresión" #: src/ui/gui/data-editor.ui:325 msgid "_Linear..." msgstr "_Lineal..." #: src/ui/gui/data-editor.ui:329 msgid "_Binary Logistic..." msgstr "Logística _Binaria..." #: src/ui/gui/data-editor.ui:335 msgid "_Non-Parametric Statistics" msgstr "Pruebas _No-Paramétricas" #: src/ui/gui/data-editor.ui:338 msgid "_Chi Square..." msgstr "_Chi Cuadrado..." #: src/ui/gui/data-editor.ui:342 msgid "_Binomial..." msgstr "_Binomial..." #: src/ui/gui/data-editor.ui:346 msgid "_Runs..." msgstr "Ejecuciones..." #: src/ui/gui/data-editor.ui:350 msgid "_1 Sample K-S..." msgstr "K-S para _1 Muestra..." #: src/ui/gui/data-editor.ui:354 msgid "_2 Related Samples..." msgstr "_2 Muestras Emparejadas..." #: src/ui/gui/data-editor.ui:358 msgid "_K Related Samples..." msgstr "_K Muestras Emparejadas..." #: src/ui/gui/data-editor.ui:362 msgid "K _Independent Samples..." msgstr "K Muestras _Independientes..." #: src/ui/gui/data-editor.ui:368 msgid "ROC Cur_ve..." msgstr "Curva ROC" #: src/ui/gui/data-editor.ui:374 msgid "_Graphs" msgstr "_Gráficos" #: src/ui/gui/data-editor.ui:377 msgid "_Scatterplot" msgstr "Gráfico de Puntos" #: src/ui/gui/data-editor.ui:381 msgid "_Histogram" msgstr "_Histograma" #: src/ui/gui/data-editor.ui:385 msgid "_Barchart" msgstr "Gráfico de _Barras" #: src/ui/gui/data-editor.ui:391 msgid "_Utilities" msgstr "_Utilidades" #: src/ui/gui/data-editor.ui:394 msgid "_Variables..." msgstr "_Variables..." #: src/ui/gui/data-editor.ui:398 msgid "Data File _Comments..." msgstr "_Comentarios del Archivo de Datos..." #: src/ui/gui/output-window.ui:71 msgid "_Print..." msgstr "Im_primir..." #: src/ui/gui/output-window.ui:76 msgid "_Export..." msgstr "_Exportar..." #: src/ui/gui/output-window.ui:92 msgid "Select _All" msgstr "Seleccionar todo" #: src/ui/gui/syntax-editor.ui:27 msgid "Syntax" msgstr "Sintaxis" #: src/ui/gui/syntax-editor.ui:31 msgid "Data" msgstr "Datos" #: src/ui/gui/syntax-editor.ui:41 msgid "_Save" msgstr "Guardar" #: src/ui/gui/syntax-editor.ui:46 msgid "Save _As" msgstr "Guardar como..." #: src/ui/gui/syntax-editor.ui:53 msgid "_Print" msgstr "Imprimir..." #: src/ui/gui/syntax-editor.ui:84 msgid "_Delete" msgstr "Eliminar" #: src/ui/gui/syntax-editor.ui:90 msgid "_Undo" msgstr "Deshacer" #: src/ui/gui/syntax-editor.ui:94 msgid "_Redo" msgstr "Rehacer" #: src/ui/gui/syntax-editor.ui:100 #, fuzzy #| msgid "Find" msgid "_Find" msgstr "Busca" #: src/ui/gui/syntax-editor.ui:106 msgid "_Run" msgstr "Ejecuta_r" #: src/ui/gui/syntax-editor.ui:109 msgid "_All" msgstr "Todo" #: src/ui/gui/syntax-editor.ui:113 msgid "_Selection" msgstr "Selección" #: src/ui/gui/syntax-editor.ui:117 msgid "_Current Line" msgstr "Línea a_ctual" #: src/ui/gui/syntax-editor.ui:122 msgid "_To End" msgstr "Has_ta el final" #: src/ui/gui/var-type-dialog.ui:99 msgid "Scientific notation" msgstr "Notación científica" #: src/ui/gui/var-type-dialog.ui:150 msgid "Custom currency" msgstr "Moneda propia" #: src/ui/gui/var-type-dialog.ui:267 msgid "positive" msgstr "positivo" #: src/ui/gui/var-type-dialog.ui:279 msgid "negative" msgstr "negativo" #: src/ui/gui/var-type-dialog.ui:293 msgid "Sample" msgstr "Muestra" #: src/ui/gui/var-type-dialog.ui:350 msgid "Width:" msgstr "Ancho:" #: src/ui/gui/var-type-dialog.ui:396 msgid "Decimal Places:" msgstr "Lugares decimales:" #: src/ui/gui/weight.ui:24 msgid "Weight Cases" msgstr "Ponderar Casos" #: src/ui/gui/weight.ui:100 msgid "Weight cases by" msgstr "Ponderar casos por" #: src/ui/gui/weight.ui:144 msgid "Frequency Variable" msgstr "Variable de Frecuencia" #: src/ui/gui/weight.ui:198 msgid "Current Status: " msgstr "Estatus actual: " #. TRANSLATORS: This is the application name in the desktop file #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:7 #: src/ui/gui/org.fsf.pspp.desktop.in:7 msgid "GNU PSPP" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:8 #, fuzzy #| msgid "A program for the analysis of sampled data" msgid "GNU PSPP is a program for statistical analysis of sampled data" msgstr "Un programa para el análisis de datos de muestreo" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:10 msgid "" "GNU PSPP is a program for the statistical analysis of sampled data. It is a " "Free replacement for the proprietary program SPSS, and appears very similar " "to it with a few exceptions. The most important of these exceptions are, " "that there are no “time bombs”; your copy of PSPP will not “expire” or " "deliberately stop working in the future. Neither are there any artificial " "limits on the number of cases or variables which you can use. There are no " "additional packages to purchase in order to get “advanced” functions; all " "functionality that PSPP currently supports is in the core package." msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:11 msgid "" "PSPP is a stable and reliable application. It can perform descriptive " "statistics, T-tests, anova, linear and logistic regression, measures of " "association, cluster analysis, reliability and factor analysis, non-" "parametric tests and more. Its backend is designed to perform its analyses " "as fast as possible, regardless of the size of the input data. You can use " "PSPP with its graphical interface or the more traditional syntax commands." msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:12 msgid "A brief list of some of the PSPP's features." msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:14 msgid "Support for over 1 billion cases" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:15 msgid "Support for over 1 billion variables" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:16 msgid "Syntax and data files which are compatible with those of SPSS" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:17 msgid "A choice of terminal or graphical user interface" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:18 msgid "A choice of text, postscript, pdf, opendocument or html output formats" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:19 msgid "" "Inter-operability with: LibreOffice, Apache OpenOffice, Gnumeric and other " "free software" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:20 msgid "Easy data import from spreadsheets, text files and database sources" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:21 msgid "" "The capability to open, analyse and edit two or more datasets concurrently" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:22 msgid "A user interface supporting all common character sets" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:23 msgid "A user interface has been translated to multiple languages" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:24 msgid "Very fast statistical procedures, even on very large data sets" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:25 msgid "No license fees and no expiration period" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:26 msgid "No unethical “end user license agreements”" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:27 msgid "A fully indexed user manual" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:28 msgid "Freedom ensured; It is licensed under the GPLv3 or later" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:29 msgid "" "Portability; Runs on many different computers and many different operating " "systems" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:31 msgid "" "PSPP is particularly aimed at statisticians, social scientists and students " "requiring fast convenient analysis of sampled data." msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:41 #, fuzzy #| msgid "Variable View" msgid "GNU PSPP Variable View" msgstr "Vista de Variables" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:54 msgid "Free Software Foundation" msgstr "" #: src/ui/gui/org.fsf.pspp.desktop.in:8 msgid "Statistical Software" msgstr "Programario Estadístico" #: src/ui/gui/org.fsf.pspp.desktop.in:9 msgid "Analyze statistical data with a free alternative to SPSS" msgstr "Analiza datos estadísticos con una alternativa libre a SPSS" #. TRANSLATORS: Do not translate this string. Keep it as is, verbatim. #: src/ui/gui/org.fsf.pspp.desktop.in:12 msgid "pspp" msgstr "" #. TRANSLATORS: You must keep all ";" - also at the end of line. #: src/ui/gui/org.fsf.pspp.desktop.in:17 msgid "statistics;analysis;spss;" msgstr "" #~ msgid "Sorry. The help system hasn't yet been implemented." #~ msgstr "Disculpas. El sistema de ayuda aún no ha sido implementado." #~ msgid "Support for %s files was not compiled into this installation of PSPP" #~ msgstr "" #~ "Soporte para archivos %s no fue compilado en esta instalación de PSPP" #~ msgid "Details" #~ msgstr "Detalles" #~ msgid "Multiple dichotomy set" #~ msgstr "Conjunto de Dicotomías Múltiples" #~ msgid "Multiple category set" #~ msgstr "Conjunto de Categorías Múltiples" #~ msgid "Label source" #~ msgstr "Fuente de etiquetas" #~ msgid "First variable label among variables" #~ msgstr "Primera etiqueta de variable entre las variables" #~ msgid "Provided by user" #~ msgstr "Proporcionado por el usuario" #~ msgid "Category label source" #~ msgstr "Fuente de etiquetas de categoría" #~ msgid "Variable labels" #~ msgstr "Etiquetas de variable" #~ msgid "Value labels of counted value" #~ msgstr "Etiquetas de valor del valor de recuento" #~ msgid "Label:" #~ msgstr "Etiqueta:" #~ msgid "No label." #~ msgstr "Sin etiqueta." #~ msgid "Product:" #~ msgstr "Producto:" #~ msgid "Variables:" #~ msgstr "Variables:" #~ msgid "Cases:" #~ msgstr "Casos:" #~ msgid "Type:" #~ msgstr "Tipo:" #~ msgid "Description" #~ msgstr "Descripción" #~ msgid "The active dataset does not have a file label." #~ msgstr "El archivo de datos activo no tiene etiqueta de archivo." #~ msgid "File label: %s" #~ msgstr "Etiqueta de archivo: %s" #~ msgid "The active dataset dictionary does not contain any documents." #~ msgstr "" #~ "El diccionario del archivo de datos activo no contiene ningún documento." #~ msgid "Documents in the active dataset:" #~ msgstr "Documentos en el archivo de datos activo:" #~ msgid "Custom data file attributes." #~ msgstr "Atributos personalizables del fichero de datos." #~ msgid "Label: %s\n" #~ msgstr "Etiqueta: %s\n" #~ msgid "Format: %s\n" #~ msgstr "Formato: %s\n" #~ msgid "Print Format: %s\n" #~ msgstr "Formato de Impresión: %s\n" #~ msgid "Write Format: %s\n" #~ msgstr "Formato de Escritura: %s\n" #~ msgid "Measure: %s\n" #~ msgstr "Medida: %s\n" #~ msgid "Role: %s\n" #~ msgstr "Rol: %s\n" #~ msgid "Display Alignment: %s\n" #~ msgstr "Alineación: %s\n" #~ msgid "Display Width: %d\n" #~ msgstr "Ancho: %d\n" #~ msgid "Missing Values: " #~ msgstr "Valores perdidos: " #~ msgid "Interactive shell not supported on this platform." #~ msgstr "" #~ "Intérprete de órdenes interactivo no disponible para esta plataforma." #~ msgid "Error executing command: %s." #~ msgstr "Error de ejecución del comando: %s." #~ msgid "Unknown TABLECELLS class" #~ msgstr "Clase TABLECELLS desconocida" #~ msgid "Exact Sig. (%d-tailed)" #~ msgstr "Sig. Exact.(%d-tailed)" #~ msgid "Valid N" #~ msgstr "N válido" #~ msgid "Missing N" #~ msgstr "N Perdidos" #~ msgid "Valid cases = %.*g; cases with missing value(s) = %.*g." #~ msgstr "Casos válidos = %.*g; casos con valor(es) perdido(s) = %.*g." #~ msgid "%g" #~ msgstr "%g" #~ msgid "%d" #~ msgstr "%d" #~ msgid "%zu" #~ msgstr "%zu" #~ msgid "50 (Median)" #~ msgstr "50 (Mediana)" #~ msgid "(%d)" #~ msgstr "(%d)" #~ msgid "Min" #~ msgstr "Mínimo" #~ msgid "Max" #~ msgstr "Máximo" #~ msgid "%g%%" #~ msgstr "%g%%" #~ msgid "25th" #~ msgstr "25º" #~ msgid "50th (Median)" #~ msgstr "50º (Mediana)" #~ msgid "75th" #~ msgstr "75º" #~ msgid "(I) %s" #~ msgstr "(I) %s" #~ msgid "(J) %s" #~ msgstr "(J) %s" #~ msgid "(I - J)" #~ msgstr "(I - J)" #~ msgid "%s into %s(%s of %s using %s BY %s)" #~ msgstr "%s en %s(%s de %s utilizando %s BY %s)" #~ msgid "%s into %s(%s of %s BY %s)" #~ msgstr "%s en %s(%s de %s BY %s)" #~ msgid "%s into %s(%s of %s using %s)" #~ msgstr "%s en %s(%s de %s utilizando %s)" #~ msgid "%s into %s(%s of %s)" #~ msgstr "%s en %s(%s de %s)" #~ msgid "Area Under the Curve (%s)" #~ msgstr "Área Bajo la Curva (%s)" #~ msgid "Coordinates of the Curve (%s)" #~ msgstr "Coordenadas de la Curva (%s)" #~ msgid "Std. Error Mean" #~ msgstr "Error Est. Media" #~ msgid "(active dataset)" #~ msgstr "(archivo de datos activo)" #~ msgid "Writing %zu record to %s." #~ msgid_plural "Writing %zu records to %s." #~ msgstr[0] "Escribiendo el registro %zu en %s." #~ msgstr[1] "Escribiendo %zu registros en %s." #~ msgid "Writing %zu record." #~ msgid_plural "Writing %zu records." #~ msgstr[0] "Escribiendo el registro %zu." #~ msgstr[1] "Escribiendo %zu registros." #~ msgid "Unsupported compression type (%d)" #~ msgstr "Tipo de compresión no definido (%d)" #~ msgid "Failed to seek to end of central directory record: %s" #~ msgstr "Fallo al buscar el registro al final del directorio central: %s" #~ msgid "Failed to seek to central directory: %s" #~ msgstr "Fallo al buscar el directorio central: %s" #~ msgid "Failed to seek to start of member `%s': %s" #~ msgstr "Fallo al buscar el inicio del miembro `%s': %s" #~ msgid "ascii: closing output file `%s'" #~ msgstr "ascii: cerrando el archivo de resultados `%s'" #~ msgid "%s - Page %d" #~ msgstr "%s - Página %d" #~ msgid "bad vline: x=%d+%d=%d y=(%d+%d=%d,%d+%d=%d) in table size (%d,%d)\n" #~ msgstr "" #~ "incorrecta vline: x=%d+%d=%d y=(%d+%d=%d,%d+%d=%d) en tabla de medida (%d," #~ "%d)\n" #~ msgid "bad hline: x=(%d+%d=%d,%d+%d=%d) y=%d+%d=%d in table size (%d,%d)\n" #~ msgstr "" #~ "incorrecta hline: x=(%d+%d=%d,%d+%d=%d) y=%d+%d=%d en tabla de medida (%d," #~ "%d)\n" #~ msgid "" #~ "bad box: (%d+%d=%d,%d+%d=%d)-(%d+%d=%d,%d+%d=%d) in table size (%d,%d)\n" #~ msgstr "" #~ "bad box: (%d+%d=%d,%d+%d=%d)-(%d+%d=%d,%d+%d=%d) en taula amb mida (%d," #~ "%d)\n" #~ msgid "Cannot parse field content `%.*s' as format %s: %s" #~ msgstr "" #~ "No se puede analizar el contenido de campo `%.*s' como formato %s: %s" #~ msgid "This input line has too few separators to fill in this field." #~ msgstr "" #~ "Esta línea de entrada no tiene suficientes separadores para llenar el " #~ "campo." #~ msgid "An error occurred reading the spreadsheet file." #~ msgstr "Error al leer el archivo de hoja de cálculo." #~ msgid "Enter a number to add a new variable." #~ msgstr "Introduce un número para añadir una nueva variable." #~ msgid "Enter a number to add a new case." #~ msgstr "Introduce un número para añadir un nuevo caso." #~ msgid "Cannot create variable." #~ msgstr "Imposible crear la variable." #~ msgid "\"%s\" is not a valid variable name." #~ msgstr "\"%s\" no es un nombre de variable válido." #~ msgid "This dictionary already contains a variable named \"%s\"." #~ msgstr "Ya existe una variable llamada \"%s\" en el diccionario." #~ msgid "Cannot rename variable." #~ msgstr "Imposible renombrar la variable." #~ msgid "Enter a variable name to add a new variable." #~ msgstr "Introducir un nombre de variable para añadir una nueva variable." #~ msgid "{%s, %s}\n" #~ msgstr "{%s, %s}\n" #~ msgid "can only convert encrypted data file to sav or sys format" #~ msgstr "" #~ "sólo se pueden convertir ficheros de datos encriptados al formato sav o " #~ "sys" #~ msgid "can only convert encrypted syntax file to sps format" #~ msgstr "" #~ "sólo se pueden convertir ficheros de datos encriptados al formato sps" #~ msgid "count" #~ msgstr "recuento" #~ msgid "expected" #~ msgstr "esperado" #~ msgid "residual" #~ msgstr "residual" #~ msgid "std. resid." #~ msgstr "residuo std." #~ msgid "adj. resid." #~ msgstr "resid.ajust." #~ msgid "Chi-square tests." #~ msgstr "Pruebas Chi-cuadrado." #~ msgid "Odds Ratio for %s (%.*s / %.*s)" #~ msgstr "Razón de diferencias para %s (%.*s / %.*s)" #~ msgid "For cohort %s = %.*g" #~ msgstr "Para la cohorte %s = %.*g" #~ msgid "For cohort %s = %.*s" #~ msgstr "Para la cohorte %s = %.*s" #~ msgid "Multiple response set name `%s' does not begin with `$'." #~ msgstr "Nombre de conjunto de respuesta múltiple `%s' no comienza con `$'." #~ msgid "could not access definition for terminal `%s'" #~ msgstr "no se puede acceder a la definición para terminal `%s'" #~ msgid "" #~ "PSPPIRE, a GUI for PSPP, a program for statistical analysis of sampled " #~ "data.\n" #~ "Usage: %s [OPTION]... FILE\n" #~ "\n" #~ "Arguments to long options also apply to equivalent short options.\n" #~ "\n" #~ "GUI options:\n" #~ " -q, --no-splash don't show splash screen during startup\n" #~ "\n" #~ "%sLanguage options:\n" #~ " -I, --include=DIR append DIR to search path\n" #~ " -I-, --no-include clear search path\n" #~ " -a, --algorithm={compatible|enhanced}\n" #~ " set to `compatible' if you want output\n" #~ " calculated from broken algorithms\n" #~ " -x, --syntax={compatible|enhanced}\n" #~ " set to `compatible' to disable PSPP " #~ "extensions\n" #~ " -i, --interactive interpret syntax in interactive mode\n" #~ " -s, --safer don't allow some unsafe operations\n" #~ "Default search path: %s\n" #~ "\n" #~ "Informative output:\n" #~ " -h, --help display this help and exit\n" #~ " -V, --version output version information and exit\n" #~ "\n" #~ "A non-option argument is interpreted as a data file in .sav or .zsav or ." #~ "por\n" #~ "format or a syntax file to load.\n" #~ msgstr "" #~ "PSPPIRE, un entorno gráfico para PSPP, un programa de análisis " #~ "estadístico para datos de muestreo.\n" #~ "Uso: %s [OPTION]... FILE\n" #~ "\n" #~ "Los argumentos para opciones largas también se aplican a opciones cortas " #~ "equivalentes.\n" #~ "\n" #~ "Opciones gráficas:\n" #~ " -q, --no-splash no mostrar la pantalla inicial durante el " #~ "arranque\n" #~ "\n" #~ "%sOpciones de lenguaje:\n" #~ " -I, --include=DIR añadir DIR a la ruta de búsqueda\n" #~ " -I-, --no-include limpiar la ruta de búsqueda\n" #~ " -a, --algorithm={compatible|enhanced}\n" #~ " establecer a `compatible' si se desean " #~ "resultados\n" #~ " calculados mediante algoritmos rotos\n" #~ " -x, --syntax={compatible|enhanced}\n" #~ " establecer a `compatible' para desactivar " #~ "extensiones PSPP\n" #~ " -i, --interactive interpretar la sintaxis en modo interactivo\n" #~ " -s, --safer no permitir algunas operaciones poco seguras\n" #~ "Ruta de búsqueda por defecto: %s\n" #~ "\n" #~ "Resultados informativos:\n" #~ " -h, --help muestra esta ayuda y acaba\n" #~ " -V, --version información de versión de salida y acaba\n" #~ "\n" #~ "Un argumento sin opciones es interpretado como un archivo .sav, o *.zsav, " #~ "o *.por\n" #~ "o un archivo de sintaxis para ser cargado.\n" #~ msgid "_Reset" #~ msgstr "_Reiniciar" #~ msgid "_Select" #~ msgstr "_Selecionar" #~ msgid "Delete the variables at the selected position(s)" #~ msgstr "Borra las variables en la posición(es) seleccionada(s)" #~ msgid "Delete the cases at the selected position(s)" #~ msgstr "Borra los casos en la(s) posición(es) seleccionada(s)" #~ msgid "_Open..." #~ msgstr "Abrir..." #~ msgid "Transpose the cases with the variables" #~ msgstr "Transponer casos y variables" #~ msgid "Aggregate the case values into a new variable" #~ msgstr "Agregar valores de caso para una nueva variable variables" #~ msgid "Choose a subset of cases for analysis" #~ msgstr "Seleccionar un subconjunto de casos para el análisis" #~ msgid "All" #~ msgstr "Todos" #~ msgid "expecting number or data string" #~ msgstr "esperando nombre o cadena de datos" #~ msgid "Number of clusters may not be larger than the number of cases." #~ msgstr "" #~ "El número de agrupaciones no puede ser mayor que el número de casos." #~ msgid "Value of %s must be between 1 and 100." #~ msgstr "Valor de %s debe estar entre 1 y 100." #~ msgid "TreeView path" #~ msgstr "Ruta de Vista Jerárquica" #~ msgid "The path to the row in the GtkTreeView, as a string" #~ msgstr "La ruta a la fila en la Vista Jerárquica (GtkTreeView), como cadena" #~ msgid "Diagonal slash" #~ msgstr "Barra diagonal" #~ msgid "Whether to draw a diagonal slash across the button." #~ msgstr "Dibujar una linea diagonal cruzando el botón." #~ msgid "Incorrect value for variable type" #~ msgstr "Valor incorrecto para el tipo de variable" #~ msgid "Font Selection" #~ msgstr "Selección de fuente" #~ msgid "Import Delimited Text Data" #~ msgstr "Importar datos de texto delimitado" #~ msgid "(optional case selection condition)" #~ msgstr "(condición opcional de selección de casos)" #~ msgid "Importing Textual Data" #~ msgstr "Importando datos textuales" #~ msgid "Doubled quote mark treated as escape" #~ msgstr "Las dobles-comillas se tratan como ESCAPE" #~ msgid "Bar charts are not implemented." #~ msgstr "El gráfico de barras no está implementado." #~ msgid "No valid data for variable %s; statistics not displayed." #~ msgstr "" #~ "No hay datos válidos para la variable %s; no se muestran estadísticas." #~ msgid "Weighting variable must be numeric (not string variable `%s')." #~ msgstr "" #~ "Variable de ponderación tiene que ser numérica (no cadena textual `%s')." #~ msgid "Duplicate variable name `%s'." #~ msgstr "Nombre de variable `%s' duplicado." #~ msgid "`%s' does not begin with `$' at offset %zu in MRSETS record." #~ msgstr "`%s' no comienza con `$' en la posición %zu de un registro MRSETS." #~ msgid "Duplicate variable name %s at offset %zu in MRSETS record." #~ msgstr "" #~ "Nombre de variable %s duplicado en la posición %zu de un registro MRSETS." #~ msgid "Truncating variable label for variable `%s' to %d bytes." #~ msgstr "Truncando la etiqueta de la variable `%s' a %d bytes." #~ msgid "%s is allowed only inside INPUT PROGRAM." #~ msgstr "%s sólo se permite dentro de INPUT PROGRAM." #~ msgid "%s is allowed only inside FILE TYPE." #~ msgstr "%s sólo se permite dentro de FILE TYPE." #~ msgid "" #~ "DELETE VARIABLES may not be used after TEMPORARY. Temporary " #~ "transformations will be made permanent." #~ msgstr "" #~ "DELETE VARIABLES no puede ser utilizado después de TEMPORARY. Las " #~ "transformaciones temporales serán permanentes." #~ msgid "" #~ "DROP subcommand may be given at most once. It may not be given in " #~ "conjunction with the KEEP subcommand." #~ msgstr "" #~ "El subcomando DROP puede ser utilizado únicamente una vez. No puede ser " #~ "utilizado juntamente con el subcomando KEEP." #~ msgid "" #~ "RENAME VARS may not be used after TEMPORARY. Temporary transformations " #~ "will be made permanent." #~ msgstr "" #~ "RENAME VARS no puede ser utilizado después de TEMPORARY. Las " #~ "transformaciones temporales serán permanentes." #~ msgid "Mode:" #~ msgstr "Modo:" #~ msgid "on" #~ msgstr "activado" #~ msgid "off" #~ msgstr "desactivado" #~ msgid "Charset:" #~ msgstr "Conjunto de carácteres:" #~ msgid "Unexpected end of file reading FLIP file." #~ msgstr "Final inesperado de la lectura del archivo FLIP." #~ msgid "Expecting MEAN, MEDIAN, MODE or number" #~ msgstr "Se espera MEAN, MEDIAN, MODE o un número." #~ msgid "The END subcommand may be used only with DATA LIST FIXED." #~ msgstr "El subcomando END sólo puede ser utilizado con DATA LIST FIXED." #~ msgid "Value of FIXCASE must be at least 1." #~ msgstr "Valor de FIXCASE debe ser como mínimo 1." #~ msgid "Value of FIRST must be at least 1." #~ msgstr "Valor de FIRST debe ser como mínimo 1." #~ msgid "Unexpected end-of-file within INPUT PROGRAM." #~ msgstr "Final de archivo inesperado dentro de INPUT PROGRAM." #~ msgid "Type: %s\n" #~ msgstr "Tipo: %s\n" #~ msgid "Missing Values: %s\n" #~ msgstr "Valores perdidos: %s\n" #~ msgid "Value Labels:\n" #~ msgstr "Etiquetas de valor:\n" #~ msgid "%s %s\n" #~ msgstr "%s %s\n" #~ msgid "WORKSPACE must be at least 1MB" #~ msgstr "WORKSPACE debe ser como mínimo 1 Mb" #~ msgid "expecting AUTOMATIC or year" #~ msgstr "esperando AUTOMATICA o año" #~ msgid "LENGTH must be at least 1." #~ msgstr "LENGTH debe ser como mínimo 1." #~ msgid "WIDTH must be at least 40." #~ msgstr "WIDTH debe ser como mínimo 40." #~ msgid "RESTORE without matching PRESERVE." #~ msgstr "RESTORE sin el correspondiente PRESERVE." #~ msgid "Variables %s specified multiple times on GROUPED subcommand." #~ msgstr "" #~ "La variable %s se ha especificado más de una vez en el subcomando GROUPED." #~ msgid "Variables %s specified on GROUPED but not on VARIABLES." #~ msgstr "Variables %s especificadas en GROUPED pero no en VARIABLES." #~ msgid "Insert Cases" #~ msgstr "Insertar Casos" #~ msgid "Processor Area" #~ msgstr "Área del procesador" #~ msgid "Error opening `%s' for reading as a Gnumeric file: %s." #~ msgstr "Error al abrir `%s' para la lectura como archivo Gnumeric: %s." #~ msgid "" #~ "Error opening `%s' for reading as a OpenDocument spreadsheet file: %s." #~ msgstr "" #~ "Error al abrir `%s' para la lectura como archivo de hoja de cálculo " #~ "OpenDocument: %s." #~ msgid "VAR%05d" #~ msgstr "VAR%05d" #~ msgid "_Options" #~ msgstr "_Opciones" #~ msgid "REGRESSION requires numeric variables." #~ msgstr "REGRESSION requiere variables numéricas." #~ msgid "Statistics..." #~ msgstr "Estadísticos..." #~ msgid "Exclude cases listwise" #~ msgstr "Excluir casos según lista" #~ msgid "By:" #~ msgstr "Por:" #~ msgid "Rankit" #~ msgstr "Rankit" #~ msgid "_Import Delimited Text Data..." #~ msgstr "_Importar Datos de Texto Delimitados..." #~ msgid "Linear _Regression..." #~ msgstr "_Regresión Lineal..." #~ msgid "Unknown variable format %." #~ msgstr "Formato de variable % desconocido." #~ msgid "print" #~ msgstr "imprimir" #~ msgid "write" #~ msgstr "escribir" #~ msgid "" #~ "%s is allowed only before the active dataset has been defined or inside " #~ "INPUT PROGRAM." #~ msgstr "" #~ "%s sólo se permite antes que el archivo de datos activo se haya definido " #~ "o dentro de INPUT PROGRAM." #~ msgid "" #~ "%s is allowed only after the active dataset has been defined or inside " #~ "INPUT PROGRAM." #~ msgstr "" #~ "%s sólo se permite después que el archivo de datos activo se ha definido " #~ "o dentro de INPUT PROGRAM." #~ msgid "missing required subcommand %s" #~ msgstr "suborden requerida %s ausente" #~ msgid "expecting `%s'" #~ msgstr "esperando '%s'" #~ msgid "String expected." #~ msgstr "Cadena esperada." #~ msgid "`(' expected after variable list." #~ msgstr "`(' esperado después de la lista de variables." #~ msgid "`)' expected after output format." #~ msgstr "`)' esperado después del formato de resultados." #~ msgid "%s subcommand may be given at most once." #~ msgstr "El subcomando %s sólo puede utilizarse una vez." #~ msgid "`(' expected on %s subcommand." #~ msgstr "Se espera `(' en el subcomando %s." #~ msgid "`)' expected following variable names on REORDER subcommand." #~ msgstr "" #~ "`)' se esperaba seguido de los nombres de la variable en el subcomando " #~ "REORDER." #~ msgid "" #~ "`=' expected between lists of new and old variable names on RENAME " #~ "subcommand." #~ msgstr "" #~ "`=' esperado entre las listas de nombres de variables nuevas y viejas en " #~ "el subcomando RENAME." #~ msgid "`)' expected after variable lists on RENAME subcommand." #~ msgstr "" #~ "`)' esperado después de las listas de variables en el subcomando RENAME." #~ msgid "`/' or `.' expected." #~ msgstr "'/' o '.' esperado." #~ msgid "`(' expected." #~ msgstr "'(' esperado." #~ msgid "`=' expected between lists of new and old variable names." #~ msgstr "" #~ "`=' esperado entre listas de nuevos y antiguos nombres de la variable." #~ msgid "`)' expected after variable names." #~ msgstr "`)' esperado después de los nombres de variables." #~ msgid "expecting file name" #~ msgstr "esperando nombre de archivo" #~ msgid "expecting %s or %s after %s" #~ msgstr "esperando %s o %s tras %s" #~ msgid "Number of contrast coefficients must equal the number of groups" #~ msgstr "" #~ "El número de coeficientes de contraste debe ser igual al número de grupos" #~ msgid "Variables cannot be parsed" #~ msgstr "No se pueden generar las variables" #~ msgid "Cases >= Test Value" #~ msgstr "Casos >= Valor de Test" #~ msgid "`A' or `D' expected inside parentheses." #~ msgstr "Se espera `A' o `D' dentro del paréntesis." #~ msgid "`)' expected." #~ msgstr "`)' esperado." #~ msgid "`=' expected after variable list." #~ msgstr "`=' esperado después de lista de variables." #~ msgid "expecting `,' or `)' invoking %s function" #~ msgstr "esperando `,' o `)' al invocar la función %s" #~ msgid "Unrecognized record type 7, subtype %d." #~ msgstr "Tipo de registro 7 no reconocido, subtipo %d." #~ msgid "Bad size (%zu) or count (%zu) field on record type 7, subtype 3." #~ msgstr "" #~ "Campo de longitud (%zu) o cantidad (%zu) inválidos en el registro tipo 7, " #~ "subtipo 3." #~ msgid "Bad size (%zu) or count (%zu) on extension 4." #~ msgstr "Longitud (%zu) o cantidad (%zu) de la extensión 4 no válida." #~ msgid "Missing space following `%c' at offset %zu in MRSETS record" #~ msgstr "Espacio perdido tras `%c' en la posición %zu del registro MRSETS" #~ msgid "" #~ "Unexpected label source value `%s' following `E' at offset %zu in MRSETS " #~ "record" #~ msgstr "" #~ "Valor de fuente de etiqueta inesperado `%s' tras `E' en la posición %zu " #~ "del registro MRSETS" #~ msgid "Bad size %zu on extension 11." #~ msgstr "Longitud no válida %zu en la extensión 11." #~ msgid "%s: Error parsing attribute value %s[%d]" #~ msgstr "%s: Error al analizar el valor del atributo %s[%d]" #~ msgid "%s: Attribute value %s[%d] is not quoted: %s" #~ msgstr "%s: El valor del atributo %s[%d] no está entre comillas: %s" #~ msgid "Bad size %zu for extended number of cases." #~ msgstr "Longitud no válida %zu para un número extenso de casos." #~ msgid "Bad count %zu for extended number of cases." #~ msgstr "Recuento incorrecto %zu para un número extenso de casos." #~ msgid "" #~ "Variable name length in long string value label record (%d) exceeds %d-" #~ "byte limit." #~ msgstr "" #~ "La longitud del nombre de la variable en el registro de la etiqueta del " #~ "valor de cadena larga (%d) supera el límite %d-byte." #~ msgid "`)' expected after GROUPED interval list." #~ msgstr "`)' esperada después de la lista de variables GRUPED." #~ msgid "" #~ "FRACTION has been specified, but NORMAL and PROPORTION rank functions " #~ "have not been requested. The FRACTION subcommand will be ignored." #~ msgstr "" #~ "Se ha especificado FRACTION, pero no se han pedido funciones de rango " #~ "NORMAL o PROPORTION. La suborden FRACTION será ignorada." #~ msgid "One or more VARIABLES must be specified." #~ msgstr "Una o más VARIABLES deben ser especificadas." #~ msgid "At least two variables must be specified on PAIRS." #~ msgstr "Al menos dos variables se deben especificar en PAIRS." #~ msgid "No label" #~ msgstr "Sin etiqueta" #~ msgid "Suppress value labels" #~ msgstr "Suprimir etiquetas de variable" #~ msgid "Labeling" #~ msgstr "Etiquetando" #~ msgid "" #~ "Scratch file handle %s has not yet been written, using SAVE or another " #~ "procedure, so it cannot yet be used for reading." #~ msgstr "" #~ "El manipulador de archivos de trabajo %s aún no se ha escrito, utilizando " #~ "SAVE u otro procedimiento, de forma que aún no se puede leer." #~ msgid "scratch file" #~ msgstr "archivo de trabajo" #~ msgid "Missing space following `%c' at UTF-8 offset %zu in MRSETS record." #~ msgstr "" #~ "Espacio perdido tras `%c' en la posición UTF-8 %zu del registro MRSETS." #~ msgid "" #~ "Unexpected label source value `%s' following `E' at UTF-8 offset %zu in " #~ "MRSETS record." #~ msgstr "" #~ "Etiqueta de valor fuente inesperada `%s' tras 'E' en la posición UTF-8 " #~ "%zu del registro MRSETS." #~ msgid "PSPP-data" #~ msgstr "datos-PSPP" #~ msgid "%s %s PSPPIRE %s" #~ msgstr "%s %s PSPPIRE %s" #~ msgid "column %d" #~ msgstr "columna %d" #~ msgid "columns %d-%d" #~ msgstr "columnas %d-%d" #~ msgid "%s field) " #~ msgstr "%s campo)" #~ msgid "%s: Creating temporary file: %s." #~ msgstr "%s: Creando archivo temporal: %s." #~ msgid "Duplicate variable name %s in position %d." #~ msgstr "Nombre de la variable %s duplicado en la posición %d." #~ msgid "" #~ "Recoded variable name duplicates an existing `%s' within system file." #~ msgstr "" #~ "El nombre de la variable recodificada duplica `%s' existente dentro del " #~ "archivo del sistema." #~ msgid "Duplicate variable name `%s' within system file." #~ msgstr "Nombre de variable '%s' duplicado dentro del archivo de sistema." #~ msgid "Document line contains null byte." #~ msgstr "Una línea del documento contiene un byte nulo." #~ msgid "Missing space following 'E' at offset %zu in MRSETS record" #~ msgstr "Espacio perdido tras 'E' en la posición %zu del registro MRSETS" #~ msgid "Duplicate long variable name `%s' within system file." #~ msgstr "" #~ "Nombre de la variable larga '%s' duplicada dentro del archivo de sistema." #~ msgid "Invalid number of labels: %d. Ignoring labels." #~ msgstr "Número de etiquetas inválido: %d. Ignorando etiquetas." #~ msgid "Reading `%s': %s." #~ msgstr "Leyendo `%s': %s." #~ msgid "Closing `%s': %s." #~ msgstr "Cerrando `%s': %s." #~ msgid "%s does not form a valid number." #~ msgstr "%s no constituye un número vàlido." #~ msgid "Syntax error %s at %s." #~ msgstr "Error de sintaxis %s en %s." #~ msgid "binary" #~ msgstr "binario" #~ msgid "octal" #~ msgstr "octal" #~ msgid "hex" #~ msgstr "hexadecimal" #~ msgid "Unexpected end of file in string concatenation." #~ msgstr "Final de archivo inesperado en la concatenación de cadenas." #~ msgid "String exceeds 255 characters in length (%zu characters)." #~ msgstr "La cadena supera los 255 carácteres de longitud (%zu carácteres)." #~ msgid "incorrect use of TO convention" #~ msgstr "uso incorrecto de la convención TO" # recursivamente? recurridamente? repetidamente? #~ msgid "DO REPEAT may not nest in compatibility mode." #~ msgstr "DO REPEAT no puede usarse recursivamente en modo compatibilidad." #~ msgid "expecting ATTRIBUTE= or DELETE=" #~ msgstr "esperando ATTRIBUTE= o DELETE=" #~ msgid "expecting `('" #~ msgstr "esperando `('" #~ msgid "String expected for variable label." #~ msgstr "Se espera una cadena como etiqueta de variable." #~ msgid "%s is too long for a variable name." #~ msgstr "%s es demasiado largo para un nombre de variable." #~ msgid "%zu-byte string needed but %zu-byte string supplied." #~ msgstr "" #~ "Se necesita cadena de %zu-byte pero se han suministrado de %zu-byte." #~ msgid "Hexadecimal floating constant too long." #~ msgstr "Constante hexadecimal flotante demasiado larga." #~ msgid "" #~ "%s conversion of %s from %s to %s should have produced %s but actually " #~ "produced %s." #~ msgstr "" #~ "conversión %s de %s desde %s en %s debería haber producido %s pero " #~ "actualmente ha producido %s." #~ msgid "Too many values in single command." #~ msgstr "Demasiados valores en un sólo comando." #~ msgid "Expecting BATCH or INTERACTIVE after SYNTAX." #~ msgstr "Esperando BATCH o INTERACTIVE después de SYNTAX." #~ msgid "Expecting YES or NO after CD." #~ msgstr "Esperando YES o NO después del CD." #~ msgid "Expecting CONTINUE or STOP after ERROR." #~ msgstr "Esperando CONTINUE o bien STOP después del ERROR." #~ msgid "Unexpected token: `%s'." #~ msgstr "Testimonio inesperado: `%s'." #~ msgid "Unable to open `%s': %s." #~ msgstr "No se puede abrir `%s': %s." #~ msgid "while expecting COLUMNWISE" #~ msgstr "mientras tanto esperando COLUMNWISE" #~ msgid "expecting BREAK" #~ msgstr "esperando BREAK" #~ msgid "expecting `)'" #~ msgstr "esperando ')'" #~ msgid "Sig. 1-tailed" #~ msgstr "Sig. (1-cola)" #~ msgid "Error closing FLIP source file: %s." #~ msgstr "Error de cierre del archivo de fuente FLIP: %s." #~ msgid "expecting FIXED or DELIMITED" #~ msgstr "esperando FIXED o DELIMITED" #~ msgid "expecting LINE or VARIABLES" #~ msgstr "esperando LINE o VARIABLES" #~ msgid "expecting VARIABLES" #~ msgstr "esperando VARIABLES" #~ msgid "expecting COMM or TAPE" #~ msgstr "esperando COMM o TAPE" #~ msgid "COLUMN subcommand multiply specified." #~ msgstr "subcomando COLUMN especificado múltiples veces." #~ msgid "hash table:" #~ msgstr "tabla hash:" #~ msgid "Warnings (%d) exceed limit (%d)." #~ msgstr "Avisos (%d) exceden el límite (%d)." #~ msgid "Errors (%d) exceed limit (%d)." #~ msgstr "Los errores (%d) exceden el límite (%d)." #~ msgid "Field content \"%.*s\" cannot be parsed in format %s." #~ msgstr "" #~ "El contenido del campo \"%.*s\" no puede ser analizado en formato %s." #~ msgid "expecting BY" #~ msgstr "esperando BY" #~ msgid "Asymp. Sig. (2-sided)" #~ msgstr "Sign. Asint. (2-colas)" #~ msgid "Exact Sig. (2-sided)" #~ msgstr "Sign. Exacta (2-colas)" #~ msgid "Exact Sig. (1-sided)" #~ msgstr "Sign. Exacta (1-cola)" #~ msgid "Multivariate GLM not yet supported" #~ msgstr "GLM multivariable todavía no disponible" #~ msgid "Missing required subcommand TABLES." #~ msgstr "Falta el subcomando requerido TABLES." #~ msgid "TABLES subcommand may not appear more than once." #~ msgstr "El subcomando TABLES no puede aparecer más de una vez." #~ msgid "`%s' is not a variable name" #~ msgstr "`%s' no es un nombre de variable" #~ msgid "Analyse" #~ msgstr "Analizar" #~ msgid "Buttons" #~ msgstr "Botones" #~ msgid "The mask that decides what buttons appear in the button box" #~ msgstr "La máscara que decide qué botones aparecen en la caja de botones" #~ msgid "The dictionary to be displayed by this widget" #~ msgstr "El diccionario que se mostrará con este widget" #~ msgid "A predicate function" #~ msgstr "Una función de predicado" #~ msgid "How many things can be selected" #~ msgstr "Cuantas cosas se pueden seleccionar" #~ msgid "searching for \"%s\" in path \"%s\"" #~ msgstr "buscando \"%s\" dentro de la carpeta \"%s\"" #~ msgid "...found \"%s\"" #~ msgstr "...\"%s\" encontrado" #~ msgid "...not found" #~ msgstr "...no se encuentra" #~ msgid "little-endian" #~ msgstr "little-endian" #~ msgid "big-endian" #~ msgstr "big-endian" #~ msgid "Compressed data is corrupt." #~ msgstr "Los datos comprimidos están dañados." #~ msgid "opening \"%s\" as syntax file" #~ msgstr "abriendo \"%s\" como archivo de sintaxis" #~ msgid "%s is not allowed inside INPUT PROGRAM." #~ msgstr "%s no se permite dentro de INPUT PROGRAM." #~ msgid "REORDER subcommand may be given at most once." #~ msgstr "El subcomando REORDER puede ser emitido más de una vez." #~ msgid "`(' expected on REORDER subcommand." #~ msgstr "`(' esperado en el subcomando REORDER." #~ msgid "Unknown." #~ msgstr "Desconocido." #~ msgid "System File." #~ msgstr "Archivo de Sistema." #~ msgid "S E Mean" #~ msgstr "Mitj. E E" #~ msgid "S E Kurt" #~ msgstr "Err.Est. Curt." #~ msgid "S E Skew" #~ msgstr "Err.Est. Asim." #~ msgid "BY is required when TABLE is specified." #~ msgstr "BY es necesario cuando TABLE se especifica." #~ msgid "opening font metrics file \"%s\"" #~ msgstr "abriendo archivo de métricas de origen \"%s\"" #~ msgid "first line must be StartFontMetrics" #~ msgstr "la primera línea tiene que ser StarFontMetrics" #~ msgid "unsupported MappingScheme %d" #~ msgstr "MappingScheme %d no soportado" #~ msgid "required FontName is missing" #~ msgstr "Falta de FontName requerido" #~ msgid "CharMetrics line must start with C or CH" #~ msgstr "La línea CharMetrics tiene que comenzar con C o H" #~ msgid "reference to unknown character \"%s\"" #~ msgstr "referencia al carácter desconocido \"%s\"" #~ msgid "expected end of file" #~ msgstr "final de archivo esperado" #~ msgid "number out of valid range" #~ msgstr "número fuera del intervalo válido" #~ msgid "invalid numeric syntax" #~ msgstr "sintaxis numérica inválida" #~ msgid "syntax error expecting integer" #~ msgstr "error de sintaxis esperando un entero" #~ msgid "syntax error expecting number" #~ msgstr "error de sintaxis esperando un número" #~ msgid "syntax error in hex constant" #~ msgstr "error de sintaxis en constante hexadecimal" #~ msgid "syntax error expecting hex constant" #~ msgstr "error de sintaxis cuando se esperaba un hexadecimal" #~ msgid "unexpected end of line" #~ msgstr "final de línea inesperado" #~ msgid "unexpected end of line expecting string" #~ msgstr "final de línea inesperado cuando se esperaba una cadena" #~ msgid "" #~ "ascii: bad index value for `box' key: syntax is box[INDEX], 0 <= INDEX < " #~ "%d decimal, with INDEX expressed in base 4" #~ msgstr "" #~ "ascii: índice de valor defectuoso para la clave `box' : la sintaxis es la " #~ "box[INDEX], 0 <= INDEX < %d decimal, con INDEX expresado en base 4" #~ msgid "ascii: multiple values for %s" #~ msgstr "ascii: valores múltiples para %s" #~ msgid "ascii: only screen devices may have `auto' length or width" #~ msgstr "" #~ "ascii: únicamente los dispositivos de pantalla pueden tener largo o ancho " #~ "`auto'" #~ msgid "ascii: positive integer required as `%s' value" #~ msgstr "ascii: entero positivo requerido como valor `%s'" #~ msgid "ascii: `emphasis' value must be `bold', `underline', or `none'" #~ msgstr "" #~ "ascii: el valor de `emphasis' tiene que ser `bold', `underline', o `none'" #~ msgid "ascii: zero or positive integer required as `%s' value" #~ msgstr "ascii: cero o entero positivo requerido como valor `%s'" #~ msgid "ascii: boolean value expected for `%s'" #~ msgstr "ascii: valor booleano esperado para `%s'" #~ msgid "`chart-files' value must contain `#'" #~ msgstr "`chart-files' tiene que contener el valor `#'" #~ msgid "ascii: bad line (%d,%d)-(%d,%d) out of (%d,%d)\n" #~ msgstr "ascii: línea defectuosa (%d,%d)-(%d,%d) de (%d,%d)\n" #~ msgid "opening HTML output file: %s" #~ msgstr "abriendo archivo de resultado HTML: %s" #~ msgid "unknown configuration parameter `%s' for HTML device driver" #~ msgstr "" #~ "parámetro de configuración `%s' desconocido para el dispositivo " #~ "controlador HTML" #~ msgid "unknown output driver `%s'" #~ msgstr "driver de resultado desconocido `%s'" #~ msgid "output driver `%s' referenced but never defined" #~ msgstr "controlador de salida `%s' referenciado pero nunca definido" #~ msgid "using default output driver configuration" #~ msgstr "utilizando driver de configuración de resultados por defecto" #~ msgid "" #~ "cannot find output initialization file (use `-vv' to view search path)" #~ msgstr "" #~ "no se puede encontrar el archivo de inicialización de resultados " #~ "(utilizar `-vv' para ver la ruta de búsqueda)" #~ msgid "cannot open \"%s\"" #~ msgstr "no se puede abrir \"%s\"" #~ msgid "reading \"%s\"" #~ msgstr "leyendo \"%s\"" #~ msgid "error closing \"%s\"" #~ msgstr "error en cerrar \"%s\"" #~ msgid "no active output drivers" #~ msgstr "no hay controladores de salida activos" #~ msgid "error reading device definition file" #~ msgstr "error leyendo el archivo de definición del dispositivo" #~ msgid "" #~ "Driver classes:\n" #~ "\t" #~ msgstr "" #~ "Clases de controlador:\n" #~ "\t" #~ msgid "" #~ "reached end of options inside quoted string parsing options for \"%s\" " #~ "driver" #~ msgstr "" #~ "Llegado al final de opciones dentro de la cadena entre comillas " #~ "analitzando opciones para el controlador \"%s\"" #~ msgid "syntax error in string constant parsing options for \"%s\" driver" #~ msgstr "" #~ "error de sintaxis en una constante de cadena analizando opciones para el " #~ "controlador \"%s\"" #~ msgid "syntax error expecting `=' parsing options for driver \"%s\"" #~ msgstr "" #~ "error de sintaxis cuando se esperaba `=' analizando las opciones para el " #~ "controlador \"%s\"" #~ msgid "unknown output driver class `%.*s'" #~ msgstr "controlador de salida de clase desconocida `%.*s'" #~ msgid "unknown device type `%.*s'" #~ msgstr "tipo de dispositivo desconocido `%.*s'" #~ msgid "driver definition line missing driver name or class name" #~ msgstr "" #~ "línea de definición del controlador sin nombre del controlador o nombre " #~ "de la clase" #~ msgid "opening PostScript output file \"%s\"" #~ msgstr "abriendo el archivo de salida PostScript \"%s\"" #~ msgid "closing PostScript output file \"%s\"" #~ msgstr "cierre el archivo de salida PostScript \"%s\"" #~ msgid "unknown configuration parameter `%s' for PostScript device driver" #~ msgstr "" #~ "parámetro de configuración desconocido`%s' para el controlador del " #~ "dispositivo PostScript" #~ msgid "" #~ "unknown orientation `%s' (valid orientations are `portrait' and " #~ "`landscape')" #~ msgstr "" #~ "orientación desconocida `%s' (las orientaciones válidas son `retrato' i " #~ "`paisaje')" #~ msgid "boolean value expected for %s" #~ msgstr "valor booleano esperado para %s" #~ msgid "positive integer value required for `%s'" #~ msgstr "valor entero positivo necesario para `%s'" #~ msgid "" #~ "default font size must be at least 1 point (value of 1000 for key `%s')" #~ msgstr "" #~ "la medida de carácter por defecto tiene que ser como mínimo 1 punto " #~ "(valor de 1000 por la clave `%s')" #~ msgid "could not find AFM file \"%s\"" #~ msgstr "no se puede encontrar el archivo AFM \"%s\"" #~ msgid "could not find font \"%s\"" #~ msgstr "no se puede encontrar el carácter \"%s\"" #~ msgid "could not find encoding \"%s\"" #~ msgstr "no se puede encontrar la codificación \"%s\"" #~ msgid "reading font file \"%s\"" #~ msgstr "leyendo el archivo de carácter \"%s\"" #~ msgid "cannot open font encoding file \"%s\"" #~ msgstr "no se puede abrir el fichero de codificación del carácter \"%s\"" #~ msgid "invalid numeric format" #~ msgstr "formato numérico no válido" #~ msgid "closing Postscript encoding \"%s\"" #~ msgstr "cierre de codificación Postscript \"%s\"" #~ msgid "creating \"%s\"" #~ msgstr "creando \"%s\"" #~ msgid "" #~ "set to `compatible' if you want output calculated from broken algorithms" #~ msgstr "" #~ "active `compatible' si quiere obtener resultados calculados a partir de " #~ "algoritmos rotos" #~ msgid "Append DIR to include path" #~ msgstr "Adjuntar DIR en la ruta de inclusión" #~ msgid "Clear include path" #~ msgstr "Borrar la ruta de inclusión" #~ msgid "Disable execution of .pspp/rc at startup" #~ msgstr "Deshabilitar la ejecución de .pspp/rc en el inicio" #~ msgid "Set configuration directory to DIR" #~ msgstr "Establecer DIR como directorio de configuración" #~ msgid "Don't allow some unsafe operations" #~ msgstr "No permite algunas operaciones inseguras" #~ msgid "" #~ "Set to `compatible' if you want only to accept SPSS compatible syntax" #~ msgstr "" #~ "Active `compatible' si únicamente quiere aceptar la sintaxis compatible " #~ "de SPSS" #~ msgid "PSPP --- A program for statistical analysis" #~ msgstr "PSPP ---Un programa de análisis estadístico" #~ msgid "FILE1, FILE2 ... FILEn" #~ msgstr "FILE1, FILE2 ... FILEn" #~ msgid "Options affecting input and output locations:" #~ msgstr "Opciones que afecten a ubicaciones de entrada y salida:" #~ msgid "Diagnostic options:" #~ msgstr "Opciones de diagnóstico:" #~ msgid "Options affecting syntax and behavior:" #~ msgstr "Opciones que afectan a la sintaxis y al comportamiento:" #~ msgid "Cannot open %s (%s). Writing errors to stdout instead.\n" #~ msgstr "" #~ "No se puede abrir %s (%s). Alternativamente, escribiendo errores a " #~ "stdout.\n" #~ msgid "Terminating execution of syntax file due to error." #~ msgstr "Finalizando la ejecución del archivo de sintaxis debido a un error." #~ msgid "Increase diagnostic verbosity level" #~ msgstr "Aumentar el nivel de verbosidad del diagnóstico" #~ msgid "Send error messages to FILE (appended)" #~ msgstr "Enviar mensajes de error a FILE (anexa)" #~ msgid "Select output driver DEVICE and disable defaults" #~ msgstr "" #~ "Seleccionar el controlador de salida DEVICE y desactivar los valores por " #~ "defecto" #~ msgid "Print a list of known driver classes, then exit" #~ msgstr "" #~ "Imprimir una lista de clases de controladores conocidos, después salir" #~ msgid "Start an interactive session" #~ msgstr "Inicio de una sesión interactiva" #~ msgid "Style of bevel around the custom entry button" #~ msgstr "Estilo de bisel en del botón de entrada personalizado" #~ msgid "Cannot open reference manual: %s" #~ msgstr "No se puede abrir el manual de referencia: %s" #~ msgid "PSPPIRE --- A user interface for PSPP" #~ msgstr "PSPPIRE --- Una interfaz de usuario para PSPP" #~ msgid "Miscellaneous options:" #~ msgstr "Diversas opciones:" #~ msgid "data file error" #~ msgstr "Error en el archivo de datos" #~ msgid "PSPP error" #~ msgstr "Error de PSPP" #~ msgid "syntax warning" #~ msgstr "aviso de sintaxis" #~ msgid "data file warning" #~ msgstr "aviso del archivo de datos" #~ msgid "PSPP warning" #~ msgstr "aviso de PSPP" #~ msgid "syntax information" #~ msgstr "información de sintaxis" #~ msgid "data file information" #~ msgstr "información del archivo de datos" #~ msgid "PSPP information" #~ msgstr "Información de PSPP" # #~ msgid "The PSPP processing engine reported the following message:" #~ msgid_plural "The PSPP processing engine reported the following messages:" #~ msgstr[0] "El procesador de PSPP ha dado el siguiente mensaje:" #~ msgstr[1] "El procesador de PSPP ha dado los siguientes mensajes:" #~ msgid "The PSPP processing engine reported %d message." #~ msgid_plural "The PSPP processing engine reported %d messages." #~ msgstr[0] "El procesador de PSPP ha dado %d mensaje." #~ msgstr[1] "El procesador de PSPP ha dado %d mensajes." #~ msgid "%d of these messages are displayed below." #~ msgid_plural "%d of these messages are displayed below." #~ msgstr[0] "%d de estos mensajes se muestran a continuación." #~ msgstr[1] "%d de estos mensajes se muestran a continuación." #~ msgid "Clear" #~ msgstr "Limpiar" #~ msgid "Open a data file" #~ msgstr "Abrir un archivo de datos" #~ msgid "New data file" #~ msgstr "Nuevo archivo de datos" #~ msgid "Import text data file" #~ msgstr "Importar archivo de texto" #~ msgid "Select cases from the active file" #~ msgstr "Seleccionar casos del archivo activo" #~ msgid "Compute new values for a variable" #~ msgstr "Calcular nuevos valores para la variable" #~ msgid "Calculate T Test for samples from independent groups" #~ msgstr "Calcular pruebas T para muestras de grupos independientes" #~ msgid "Calculate T Test for paired samples" #~ msgstr "Calcular pruebas T para muestras emparejadas" #~ msgid "Calculate T Test for sample from a single distribution" #~ msgstr "Calcular pruebas T para muestra de una distribución única" #~ msgid "Commentary text for the data file" #~ msgstr "Comentario textual para el archivo de datos" #~ msgid "Recode values into different variables" #~ msgstr "Recodificar valores en diferentes variables" #~ msgid "Calculate descriptive statistics (mean, variance, ...)" #~ msgstr "Calcular estadísticos descriptivos (mediana, variancia,...)" #~ msgid "Generate frequency statistics" #~ msgstr "Generar estadísticos de frecuencias" #~ msgid "Examine Data by Factors" #~ msgstr "Examinar los datos segun Factores" #~ msgid "Estimate parameters of the linear model" #~ msgstr "Estimar parámetros del modelo lineal" #~ msgid "Split the window vertically and horizontally" #~ msgstr "Dividir la ventana vertical y horizontalmente" #~ msgid "Open Syntax" #~ msgstr "Abrir sintaxis" #~ msgid "Var 1" #~ msgstr "Var 1" #~ msgid "Var 2" #~ msgstr "Var 2" #~ msgid "gtk-find" #~ msgstr "gtk-find" #~ msgid "Recall" #~ msgstr "Regresar" #~ msgid "Use Sets" #~ msgstr "Utilizar conjuntos" #~ msgid "Ascending Counts" #~ msgstr "Recuento Ascendente" #~ msgid "Descending Counts" #~ msgstr "Recuento Descendente" #~ msgid "Supress tables with more than N categories" #~ msgstr "Suprimir las tablas con más de N categorias" #~ msgid "Maximum no of categories" #~ msgstr "Máximo número de categorias" #~ msgid "Messages Reported" #~ msgstr "Se han generado mensajes" #~ msgid "" #~ "The PSPP processor reported # errors. The first # and last # are shown " #~ "below:" #~ msgstr "" #~ "El procesador de PSPP ha generado # errores. Los # primeros y los # " #~ "últimos se muestran a continuación:" #~ msgid "gtk-close" #~ msgstr "gtk-close" #~ msgid "gtk-go-back" #~ msgstr "gtk-go-back" #~ msgid "gtk-go-forward" #~ msgstr "gtk-go-forward" #~ msgid "gtk-save" #~ msgstr "gtk-save" #~ msgid "gtk-save-as" #~ msgstr "gtk-save-as" #~ msgid "gtk-copy" #~ msgstr "gtk-copy" #~ msgid "System-Missing" #~ msgstr "Perdidos del sistema" #~ msgid "" #~ "At most one of BARCHART, HISTOGRAM, or HBAR should be given. HBAR will " #~ "be assumed. Argument values will be given precedence increasing along " #~ "the order given." #~ msgstr "" #~ "Al menos se ha de declarar un tipo de entre BARCHART, HISTOGRAM o HBAR. " #~ "Se asume HBAR. (Argument values will be given precedence increasing " #~ "along the order given)." #~ msgid "Variable %s specified multiple times on VARIABLES subcommand." #~ msgstr "" #~ "La variable %s se ha especificado más de una vez en el subcomando " #~ "VARIABLES." #~ msgid "Cum" #~ msgstr "Acum." #~ msgid "Freq" #~ msgstr "Frec." #~ msgid "Pct" #~ msgstr "Pct" #~ msgid "N of items" #~ msgstr "N de elementos" #~ msgid "`/FORMAT WEIGHT' specified, but weighting is not on." #~ msgstr "" #~ "`/FORMAT WEIGHT' especificado, pero la ponderación no está activada." pspp-1.4.1/po/Makevars0000644000175000017500000000453013556410621014232 0ustar00blpblp00000000000000## PSPP - a program for statistical analysis. ## Copyright (C) 2019 Free Software Foundation, Inc. ## ## 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 3 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, see . # Makefile variables for PO directory in any package using GNU gettext. # Usually the message domain is the same as the package name. DOMAIN = $(PACKAGE) # This is the copyright holder that gets inserted into the header of the # $(DOMAIN).pot file. Set this to the copyright holder of the surrounding # package. (Note that the msgstr strings, extracted from the package's # sources, belong to the copyright holder of the package.) Translators are # expected to transfer the copyright for their translations to this person # or entity, or to disclaim their copyright. The empty string stands for # the public domain; in this case the translators are expected to disclaim # their copyright. COPYRIGHT_HOLDER = Free Software Foundation, Inc. # This is the email address or URL to which the translators shall report # bugs in the untranslated strings: # - Strings which are not entire sentences, see the maintainer guidelines # in the GNU gettext documentation, section 'Preparing Strings'. # - Strings which use unclear terms or require additional context to be # understood. # - Strings which make invalid assumptions about notation of date, time or # money. # - Pluralisation problems. # - Incorrect English spelling. # - Incorrect formatting. # It can be your email address, or a mailing list address where translators # can write to without being subscribed, or the URL of a web page through # which the translators can contact you. MSGID_BUGS_ADDRESS = pspp-dev@gnu.org # This is the list of locale categories, beyond LC_MESSAGES, for which the # message catalogs shall be used. It is usually empty. EXTRA_LOCALE_CATEGORIES = pspp-1.4.1/po/fr.po0000644000175000017500000117777213725012645013533 0ustar00blpblp00000000000000# Traduction française de PSPP # Copyright (C) 2011 Free Software Foundation, Inc. # This file is distributed under the same licence as the PSPP package. # # John Darrington , 2007. # Jean-Alain Meunier , 2012. # Eric Thivant , 2016. # Stéphane Aulery , 2016, 2017, 2019. # msgid "" msgstr "" "Project-Id-Version: pspp 1.2.0\n" "Report-Msgid-Bugs-To: pspp-dev@gnu.org\n" "PO-Revision-Date: 2019-05-01 11:51+0200\n" "Last-Translator: Stéphane Aulery \n" "Language-Team: French \n" "Language: fr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Bugs: Report translation errors to the Language-Team address.\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" #: src/data/any-reader.c:72 src/data/encrypted-file.c:78 #, c-format msgid "An error occurred while opening `%s': %s." msgstr "Une erreur est survenue en ouvrant « %s » : %s." #: src/data/any-reader.c:93 src/language/lexer/lexer.c:1633 #, c-format msgid "Error reading `%s': %s." msgstr "Erreur de lecture « %s » : %s." #: src/data/any-reader.c:114 #, c-format msgid "`%s' is not a system or portable file." msgstr "« %s » n’est pas un fichier système ou un fichier portable." #: src/data/any-reader.c:123 src/data/any-writer.c:66 msgid "The inline file is not allowed here." msgstr "Le fichier en ligne n’est pas permis ici" #: src/data/any-reader.c:205 #, c-format msgid "" "Cannot read from dataset %s because no dictionary or data has been written " "to it yet." msgstr "" "Ne peut pas lire à partir du jeu de données %s car aucunes variables ou " "données n’ont été définies." #: src/data/any-reader.c:260 src/language/data-io/dataset.c:253 msgid "Dataset" msgstr "Jeu de données" #: src/data/calendar.c:100 #, c-format msgid "Month %d is not in acceptable range of 0 to 13." msgstr "La valeur pour le mois %d doit être comprise entre 0 et 13." #: src/data/calendar.c:110 #, c-format msgid "Day %d is not in acceptable range of 0 to 31." msgstr "La valeur du jour %d doit être comprise entre 0 et 31." #: src/data/calendar.c:119 #, c-format msgid "Date %04d-%d-%d is before the earliest acceptable date of 1582-10-15." msgstr "" "La date saisie %04d-%d-%d est avant la première date acceptable du " "1582-10-15." #: src/data/casereader-filter.c:221 msgid "" "At least one case in the data read had a weight value that was user-missing, " "system-missing, zero, or negative. These case(s) were ignored." msgstr "" "Au moins une observation dans les données contient une valeur erronée, " "provenant d’une mauvaise saisie par l’utilisateur, le système, un zéro ou " "une valeur négative. Ces observations seront ignorées. " #. TRANSLATORS: this fragment will be interpolated into messages in fh_lock() #. that identify types of files. #: src/data/csv-file-writer.c:138 msgid "CSV file" msgstr "fichier au format CSV" #: src/data/csv-file-writer.c:146 #, fuzzy, c-format #| msgid "Error opening `%s' for writing as a system file: %s." msgid "Error opening `%s' for writing as a CSV file: %s." msgstr "" "Erreur d’ouverture « %s » lors de l’écriture en tant que fichier système : " "%s." #: src/data/csv-file-writer.c:453 #, c-format msgid "An I/O error occurred writing CSV file `%s'." msgstr "" "Une erreur d’entrée-sortie (I/O) est survenue lors de l’écriture d’un " "fichier CSV « %s »." #: src/data/data-in.c:175 #, c-format msgid "Data is not valid as format %s: %s" msgstr "La donnée ne correspond pas au format %s : %s " #: src/data/data-in.c:377 src/data/data-in.c:553 msgid "Field contents are not numeric." msgstr "Les valeurs présentes dans ce champ ne sont pas numériques" #: src/data/data-in.c:379 src/data/data-in.c:555 msgid "Number followed by garbage." msgstr "Nombre suivi de données incorrectes" #: src/data/data-in.c:392 msgid "Invalid numeric syntax." msgstr "Syntaxe numérique invalide" #: src/data/data-in.c:400 src/data/data-in.c:571 msgid "Too-large number set to system-missing." msgstr "un nombre trop grand conduit à une erreur systeme." #: src/data/data-in.c:406 src/data/data-in.c:577 msgid "Too-small number set to zero." msgstr "Un nombre trop petit tend vers zéro." #: src/data/data-in.c:426 msgid "All characters in field must be digits." msgstr "Tous les caractères doivent être des chiffres." #: src/data/data-in.c:445 msgid "Unrecognized character in field." msgstr "Caractères inconnus dans le champ." #: src/data/data-in.c:466 src/data/data-in.c:729 msgid "Field must have even length." msgstr "Le champ doit avoir la même longueur" #: src/data/data-in.c:468 src/data/data-in.c:732 msgid "Field must contain only hex digits." msgstr "Le champ doit contenir seulement des chiffres hexadécimaux" #: src/data/data-in.c:544 msgid "Invalid zoned decimal syntax." msgstr "Syntaxe décimale de zone invalide." #: src/data/data-in.c:644 src/data/data-in.c:650 msgid "Invalid syntax for P field." msgstr "Syntaxe invalide pour le champ P. " #: src/data/data-in.c:768 src/data/data-in.c:818 msgid "Syntax error in date field." msgstr "Erreur de syntaxe dans le champ date." #: src/data/data-in.c:783 #, c-format msgid "Day (%ld) must be between 1 and 31." msgstr "La date du jour (%ld) doit être comprise entre 1 et 31." #: src/data/data-in.c:832 msgid "Delimiter expected between fields in date." msgstr "Des limites sont attendues entre les champs pour la date." #: src/data/data-in.c:906 msgid "" "Unrecognized month format. Months may be specified as Arabic or Roman " "numerals or as at least 3 letters of their English names." msgstr "" "Le Format du mois n’est pas reconnu. Les mois peuvent être spécifiés en " "chiffres arabes ou romains ou au moins les trois premières lettres de leurs " "noms en anglais. " #: src/data/data-in.c:933 #, c-format msgid "Year (%ld) must be between 1582 and 19999." msgstr "L’année (%ld) doit être comprise entre 1582 et 19999." # ??? trailing #: src/data/data-in.c:944 #, c-format msgid "Trailing garbage `%.*s' following date." msgstr "Supprimer la partie « %.*s » da la date suivante." #: src/data/data-in.c:958 msgid "Julian day must have exactly three digits." msgstr "Les jours du calendrier Julien doit avoir exactement trois chiffres." #: src/data/data-in.c:960 #, c-format msgid "Julian day (%ld) must be between 1 and 366." msgstr "" "Les jours du calendrier Julien (%ld) doit être compris entre 1 et 366 jours." #: src/data/data-in.c:984 #, c-format msgid "Quarter (%ld) must be between 1 and 4." msgstr "Les trimestres (%ld) doivent être compris entre 1 et 4." #: src/data/data-in.c:1005 #, c-format msgid "Week (%ld) must be between 1 and 53." msgstr "Les semaines (%ld) doivent être comprises entre 1 et 53." #: src/data/data-in.c:1017 msgid "Delimiter expected between fields in time." msgstr "Des limites sont attendues concernant les champs \"temps\"" #: src/data/data-in.c:1037 #, c-format msgid "Minute (%ld) must be between 0 and 59." msgstr "Les minutes (%ld) doivent être comprises entre 0 et 59." #: src/data/data-in.c:1075 msgid "" "Unrecognized weekday name. At least the first two letters of an English " "weekday name must be specified." msgstr "" "Le nom de la semaine est non reconnue. il faut au moins spécifier les deux " "premières lettres du nom de la semaine en anglais." #: src/data/data-in.c:1210 #, c-format msgid "`%c' expected in date field." msgstr "« %c » attendus dans le champ date." #: src/data/data-out.c:580 #, c-format msgid "Weekday number %f is not between 1 and 7." msgstr "Le nombre de semaine %f n’est pas entre 1 et 7." #: src/data/data-out.c:605 #, c-format msgid "Month number %f is not between 1 and 12." msgstr "Le nombre de mois %f n’est pas entre 1 et 12" #. TRANSLATORS: this fragment will be interpolated into #. messages in fh_lock() that identify types of files. #: src/data/dataset-writer.c:66 src/language/data-io/file-handle.c:304 msgid "dataset" msgstr "jeu de données" #: src/data/dict-class.c:52 msgid "ordinary" msgstr "ordinaire" #: src/data/dict-class.c:54 msgid "system" msgstr "système" #: src/data/dict-class.c:56 msgid "scratch" msgstr "effacer" #: src/data/dictionary.c:1523 #, c-format msgid "Truncating document line to %d bytes." msgstr "Reduction des lignes du document à %d bytes." #: src/data/encrypted-file.c:89 #, c-format msgid "An error occurred while reading `%s': %s." msgstr "Une erreur est durnat la lecture de « %s » : %s." #: src/data/encrypted-file.c:430 #, c-format msgid "" "%s: encrypted file corrupted (ends in incomplete %u-byte ciphertext block)" msgstr "" #: src/data/encrypted-file.c:449 #, c-format msgid "%s: encrypted file corrupted (ends with bad padding)" msgstr "" #: src/data/file-handle-def.c:283 src/language/data-io/dataset.c:266 msgid "active dataset" msgstr "active le jeu de données" #: src/data/file-handle-def.c:518 #, c-format msgid "Can't read from %s as a %s because it is already being read as a %s." msgstr "" "Ne peut pas lire à partir de %s comme %s car nous sommes déjà en lecture " "comme %s." #: src/data/file-handle-def.c:522 #, c-format msgid "Can't write to %s as a %s because it is already being written as a %s." msgstr "Ne peut pas écrire sur %s comme %s, car cela a déjà été écris com %s." #: src/data/file-handle-def.c:529 #, c-format msgid "Can't re-open %s as a %s." msgstr "Ne peut pas réouvrir %s comme %s." #: src/data/file-name.c:133 #, c-format msgid "Not opening pipe file `%s' because %s option set." msgstr "Ouverture impossible du fichier « %s » car l’option « %s » est active." #: src/data/format.c:339 msgid "Input format" msgstr "format d’entrée" #: src/data/format.c:339 msgid "Output format" msgstr "format de sortie" #: src/data/format.c:342 #, c-format msgid "Format %s may not be used for input." msgstr "Le format %s peut ne pas être utilisé pour la saisie des données." #: src/data/format.c:349 #, c-format msgid "%s specifies width %d, but %s requires an even width." msgstr "%s spécifie la largeur %d, mais %s nécessite une même largeur." #: src/data/format.c:358 #, c-format msgid "%s %s specifies width %d, but %s requires a width between %d and %d." msgstr "" "%s %s précise une largeur %d, mais %s nécessite une largeur entre %d et %d." #: src/data/format.c:367 #, c-format msgid "%s %s specifies %d decimal place, but %s does not allow any decimals." msgid_plural "" "%s %s specifies %d decimal places, but %s does not allow any decimals." msgstr[0] "" "%s %s spécifie %d position décimale, mais %s ne permet aucune décimale." msgstr[1] "" "%s %s spécifie %d positions décimales, mais %s ne permet aucune décimale." #: src/data/format.c:378 #, c-format msgid "" "%s %s specifies %d decimal place, but the given width allows at most %d " "decimals." msgid_plural "" "%s %s specifies %d decimal places, but the given width allows at most %d " "decimals." msgstr[0] "" "%s %s spécifie %d position décimale, mais la largeur donnée permet au plus " "%d décimales." msgstr[1] "" "%s %s spécifie %d positions décimales, mais la largeur donnée permet au plus " "%d décimales." #: src/data/format.c:385 #, c-format msgid "" "%s %s specifies %d decimal place, but the given width does not allow for any " "decimals." msgid_plural "" "%s %s specifies %d decimal places, but the given width does not allow for " "any decimals." msgstr[0] "" "%s %s spécifie %d position décimale, mais la largeur mentionnée ne permet " "aucune décimale." msgstr[1] "" "%s %s spécifie %d positions décimales, mais la largeur mentionnée ne permet " "aucune décimale." #: src/data/format.c:424 #, c-format msgid "%s variables are not compatible with %s format %s." msgstr "%s variables ne sont pas compatible avec %s format %s." #: src/data/format.c:425 src/data/format.c:1074 #: src/ui/gui/var-type-dialog.ui:167 msgid "String" msgstr "Chaîne" #: src/data/format.c:425 src/data/format.c:1035 #: src/ui/gui/var-type-dialog.ui:48 msgid "Numeric" msgstr "Numérique" #: src/data/format.c:426 src/data/sys-file-reader.c:2212 #: src/data/sys-file-reader.c:2214 src/language/xforms/recode.c:512 #: src/language/xforms/recode.c:513 src/language/xforms/recode.c:525 #: src/language/xforms/recode.c:526 #: src/language/dictionary/apply-dictionary.c:77 #: src/language/dictionary/apply-dictionary.c:78 msgid "numeric" msgstr "numérique" #: src/data/format.c:426 src/data/sys-file-reader.c:2212 #: src/data/sys-file-reader.c:2214 src/language/xforms/recode.c:512 #: src/language/xforms/recode.c:513 src/language/xforms/recode.c:525 #: src/language/xforms/recode.c:526 #: src/language/dictionary/apply-dictionary.c:77 #: src/language/dictionary/apply-dictionary.c:78 msgid "string" msgstr "chaîne" #: src/data/format.c:444 #, c-format msgid "String variable with width %d is not compatible with format %s." msgstr "" "La variable chaîne avec la largeur %d n’est pas compatible avec le format %s." #: src/data/format.c:1038 src/ui/gui/var-type-dialog.ui:65 msgid "Comma" msgstr "Virgule" #: src/data/format.c:1041 src/ui/gui/var-type-dialog.ui:82 msgid "Dot" msgstr "Point" #: src/data/format.c:1044 msgid "Scientific" msgstr "Scientifique" #: src/data/format.c:1061 src/ui/gui/var-type-dialog.ui:116 msgid "Date" msgstr "Date" #: src/data/format.c:1064 src/ui/gui/var-type-dialog.ui:133 msgid "Dollar" msgstr "Dollar" #: src/data/format.c:1071 msgid "Custom" msgstr "Personnalisé" #: src/data/gnumeric-reader.c:478 src/data/ods-reader.c:505 #, c-format msgid "Cannot convert the value in the spreadsheet cell %s to format (%s): %s" msgstr "Ne peut pas convertir la valeur dans la cellule %s au format (%s): %s" #: src/data/gnumeric-reader.c:502 src/data/ods-reader.c:567 #, c-format msgid "" "There was a problem whilst reading the %s file `%s' (near line %d): `%s'" msgstr "" "Il y avait un problème en lisant le dossier %s de « %s » (près de la ligne " "%d) : « %s »" #: src/data/gnumeric-reader.c:597 #, c-format msgid "" "The gnumeric file `%s' is encoded as %s instead of the usual UTF-8 encoding. " "Any non-ascii characters will be incorrectly imported." msgstr "" "Le fichier gnumeric « %s » est codé en %s au lieu de l’habituel encodage " "UTF-8. Tous les caractères non-ASCII seront pas correctement importés." #: src/data/gnumeric-reader.c:641 src/data/ods-reader.c:682 #, c-format msgid "Invalid cell range `%s'" msgstr "Plage de cellule invalide « %s »" #: src/data/gnumeric-reader.c:813 src/data/ods-reader.c:710 #: src/data/ods-reader.c:843 #, c-format msgid "Selected sheet or range of spreadsheet `%s' is empty." msgstr "" "La feuille sélectionnée ou l’ensemble des feuilles sélectionnées « %s » sont " "vides. " #: src/data/identifier2.c:60 #, c-format msgid "Identifier `%s' exceeds %d-byte limit." msgstr "L’identifiant « %s » dépasse la limite %d-byte." #: src/data/identifier2.c:84 msgid "Identifier cannot be empty string." msgstr "L’identifiant ne peut pas être une chaîne vide." #: src/data/identifier2.c:92 #, c-format msgid "`%s' may not be used as an identifier because it is a reserved word." msgstr "" "« %s » ne peut pas être utilisé comme identifiant car c’est un mot réservé." #: src/data/identifier2.c:103 #, c-format msgid "" "`%s' may not be used as an identifier because it contains ill-formed UTF-8 " "at byte offset %tu." msgstr "" "« %s » ne peut pas être utilisé comme identifiant car il contient un " "caractère UTF-8 non conforme au segment %tu." #: src/data/identifier2.c:114 #, c-format msgid "" "Character %s (in `%s') may not appear as the first character in a identifier." msgstr "" "Le caractère %s (en « %s ») ne peut être utilisé comme le premier caractère " "d’un identifiant." #: src/data/identifier2.c:126 #, c-format msgid "Character %s (in `%s') may not appear in an identifier." msgstr "Le caractère %s (en « %s ») ne peut être utilisé dans un identifiant." #: src/data/mdd-writer.c:241 #, c-format msgid "An I/O error occurred writing metadata file `%s'." msgstr "" "Erreur d’entrée-sortie (I/O) survenue à l’écriture du fichier de métadonnées " "%s." #. TRANSLATORS: this fragment will be interpolated into #. messages in fh_lock() that identify types of files. #: src/data/mdd-writer.c:457 msgid "metadata file" msgstr "fichier de métadonnées" #: src/data/mdd-writer.c:465 #, c-format msgid "Error opening `%s' for writing as a metadata file: %s." msgstr "" "Erreur d’ouverture « %s » pour la lecture du fichier de métadonnées : %s." #: src/data/mdd-writer.c:473 #, fuzzy, c-format #| msgid "Internal error creating xmlTextWriter." msgid "Internal error creating xmlTextWriter. Please report this to %s." msgstr "Erreur interne lors de la création xmlTextWriter" #: src/data/make-file.c:217 #, c-format msgid "Opening %s for writing: %s." msgstr "Ouverture de %s pour écriture : %s" #: src/data/make-file.c:228 #, c-format msgid "Opening stream for %s: %s." msgstr "Ouverture d’un flux de données pour %s: %s." #: src/data/make-file.c:260 #, c-format msgid "Creating temporary file to replace %s: %s." msgstr "Création d’un fichier temporaire pour remplacer %s : %s." #: src/data/make-file.c:277 #, c-format msgid "Creating temporary file %s: %s." msgstr "Création du fichier temporaire %s : %s." #: src/data/make-file.c:289 #, c-format msgid "Opening stream for temporary file %s: %s." msgstr "Ouverture d’un flux de données pour un fichier temporaire %s : %s." #: src/data/make-file.c:326 #, c-format msgid "Replacing %s by %s: %s." msgstr "Remplacement %s par %s: %s." #: src/data/make-file.c:354 #, c-format msgid "Removing %s: %s." msgstr "Suppression %s:%s." #: src/data/mrset.c:83 #, c-format msgid "" "%s is not a valid name for a multiple response set. Multiple response set " "names must begin with `$'." msgstr "" "%s n’est pas un nom valide pour un jeu de réponses multiples Le jeu de " "réponses multiples doit commencer par « $ »." #: src/data/ods-reader.c:620 #, c-format msgid "Cannot open %s as a OpenDocument file: %s" msgstr "Impossible d'ouvrir%s en tant que fichier OpenDocument:%s" #. TRANSLATORS: this fragment will be interpolated into #. messages in fh_lock() that identify types of files. #: src/data/pc+-file-reader.c:206 msgid "SPSS/PC+ system file" msgstr "fichier système SPSS/PC+" #: src/data/pc+-file-reader.c:215 #, c-format msgid "Error opening `%s' for reading as an SPSS/PC+ system file: %s." msgstr "" "Erreur d’ouverture de « %s » pour la lecture du fichier système SPSS/PC+ : " "%s." #: src/data/pc+-file-reader.c:224 src/data/sys-file-reader.c:3541 #, c-format msgid "%s: stat failed (%s)." msgstr "%s : échec de l’opération stat (%s)." #: src/data/pc+-file-reader.c:230 #, c-format msgid "%s: file too large." msgstr "%s : fichier trop grand." #: src/data/pc+-file-reader.c:257 #, c-format msgid "" "Directory entry is for a %u-byte record starting at offset %u but file is " "only %u bytes long." msgstr "" "L’entrée d’annuaire est un enregistrement %u-octets en commençant à %u mais " "le fichier est uniquement %u octets." #: src/data/pc+-file-reader.c:275 #, c-format msgid "Directory fields have unexpected values (%u,%u)." msgstr "les champs de répertoire ont des valeurs inattendues (%u,%u)." #: src/data/pc+-file-reader.c:372 src/data/sys-file-reader.c:672 #, c-format msgid "Variable %zu" msgstr "Variable %zu" #: src/data/pc+-file-reader.c:380 src/data/sys-file-reader.c:680 #, c-format msgid "Variable %zu Label" msgstr "Étiquette de variable %zu" #: src/data/pc+-file-reader.c:385 #, c-format msgid "Variable %zu Value Label %zu" msgstr "Valeur %zu de l’étiquette de variable %zu" #: src/data/pc+-file-reader.c:388 src/data/sys-file-reader.c:690 msgid "Creation Date" msgstr "Date de création" #: src/data/pc+-file-reader.c:389 src/data/sys-file-reader.c:691 msgid "Creation Time" msgstr "Heure de création" #: src/data/pc+-file-reader.c:390 src/data/sys-file-reader.c:692 #: src/language/dictionary/sys-file-info.c:200 msgid "Product" msgstr "Produits" #: src/data/pc+-file-reader.c:391 src/data/sys-file-reader.c:693 #: src/language/dictionary/sys-file-info.c:300 msgid "File Label" msgstr "Fichier étiquette" #: src/data/pc+-file-reader.c:427 #, c-format msgid "" "Using default encoding %s to read this SPSS/PC+ system file. For best " "results, specify an encoding explicitly. Use SYSFILE INFO with ENCODING=" "\"DETECT\" to analyze the possible encodings." msgstr "" "Utilisation de l’encodage par défaut %s pour lire ce fichier système SPSS/PC" "+. Pour obtenir de meilleurs résultats, spécifiez un codage explicitement. " "Utilisez SYSFILE INFO avec ENCODING=\"DETECT\" pour analyser les encodages " "possibles." #: src/data/pc+-file-reader.c:483 src/data/sys-file-reader.c:890 #, c-format msgid "Error closing system file `%s': %s." msgstr "Erreur de fermeture du fichier système « %s » : %s." #: src/data/pc+-file-reader.c:544 msgid "This is not an SPSS/PC+ system file." msgstr "Ce n’est pas un fichier système SPSS/PC+." #: src/data/pc+-file-reader.c:548 #, c-format msgid "Record 0 has unexpected length %u." msgstr "L’enregistrement 0 a une longueur inattendue% u." #: src/data/pc+-file-reader.c:572 #, c-format msgid "Record 0 specifies unexpected system missing value %g (%a)." msgstr "L’enregistrement 0 spécifie une valeur manquante %g (%a)." #: src/data/pc+-file-reader.c:577 #, c-format msgid "Record 0 reserved fields have unexpected values (%u,%u,%u,%u,%u,%u)." msgstr "" "Les champs réservés de l’enregistrement 0 ont des valeurs innattendues (%u, " "%u, %u, %u, %u, %u)." #: src/data/pc+-file-reader.c:581 #, c-format msgid "Record 0 case counts differ (%u versus %u)." msgstr "Compteur de cas de l’enregistrement 0 déffirents (%u contre %u)." #: src/data/pc+-file-reader.c:585 #, c-format msgid "Invalid compression type %u." msgstr "Type de compression invalide (%u)." #: src/data/pc+-file-reader.c:596 #, c-format msgid "" "Record 0 claims %u cases with %u values per case (requiring at least %zu " "bytes) but data record is only %u bytes long." msgstr "" "L’enregistrement 0 annnoce %u cas avec %u valeurs par cas (nécessitant au " "moins %zu octets), mais l’enregistrement de données est seulement long de %u " "octets." #: src/data/pc+-file-reader.c:618 #, c-format msgid "" "Value labels claimed to end at offset %u in labels record but labels record " "is only %u bytes." msgstr "" "Les étiquettes de valeur prétendait se terminer à l’offset %u dans " "l’enregistrement des étiquettes mais l’enregistrement des étiquettes mais " "est seulement de %u octets." #: src/data/pc+-file-reader.c:629 #, c-format msgid "" "Value labels claimed to be at offset %u with length %u but file size is only " "%u bytes." msgstr "" "Les étiquettes de valeur prétendait être à l’offset %u avec la longueur de " "%u mais la taille du fichier est seulement de %u octets." #: src/data/pc+-file-reader.c:656 #, c-format msgid "" "Value labels end with partial label (%u bytes left in record, label length " "%)." msgstr "" "Les étiquettes de valeur se terminent par une étiquette partielle (%u octets " "laissés dans l’enregistrement, longueur de l’étiquette %)." #: src/data/pc+-file-reader.c:669 #, c-format msgid "%u leftover bytes following value labels." msgstr "%u octets restants en suivant les étiquettes de valeur." #: src/data/pc+-file-reader.c:685 #, c-format msgid "" "Variable label claimed to start at offset %u in labels record but labels " "record is only %u bytes." msgstr "" "L’étiquette de variable prétendait commencer à l’offset %u dans " "l’enregistrement d’étiquettes, mais l’enregistrement d’étiquettes est " "seulement à %u octets." #: src/data/pc+-file-reader.c:697 #, c-format msgid "" "Variable label with length %u starting at offset %u in labels record " "overruns end of %u-byte labels record." msgstr "" "L’étiquette de variable avec une longueur %u commençant à l’offset %u dans " "les enregistrements dépasse la fin de %u-octet l’enregistrement d’étiquettes." #: src/data/pc+-file-reader.c:719 #, c-format msgid "Record 1 has length %u (expected %u)." msgstr "Enregistrement 1 de taille %u (valeur attendue %u)." #: src/data/pc+-file-reader.c:751 #, c-format msgid "Variable %u has invalid type %." msgstr "La variable %u a un type % invalide." #: src/data/pc+-file-reader.c:787 #, c-format msgid "Invalid weight index %u." msgstr "Poid d’index %u invalide." #: src/data/pc+-file-reader.c:857 #, c-format msgid "Invalid variable name `%s'." msgstr "Nom de variable invalide « %s »." #: src/data/pc+-file-reader.c:865 src/data/sys-file-reader.c:1444 #, c-format msgid "Renaming variable with duplicate name `%s' to `%s'." msgstr "Renommage d’une variable en doublon de « %s » vers « %s »." #: src/data/pc+-file-reader.c:877 #, c-format msgid "Cannot weight by string variable `%s'." msgstr "" "Impossible de pondérer à partir de la variable chaîne de caractères « %s »." #: src/data/pc+-file-reader.c:973 src/data/sys-file-reader.c:2762 msgid "File ends in partial case." msgstr "Le fichier se termine sur une observation incomplète." #: src/data/pc+-file-reader.c:979 #, c-format msgid "" "Case beginning at offset 0x%08x extends past end of data record at offset 0x" "%08x." msgstr "" "Le cas commençant à l’offset 0x%08x s’étend après la fin de l’enregistrement " "de données à l’offset 0x%08x." #: src/data/pc+-file-reader.c:998 src/data/sys-file-reader.c:2770 #, c-format msgid "Error reading case from file %s." msgstr "Erreur de lecture d’une observation à partir du fichier %s." #: src/data/pc+-file-reader.c:1114 src/data/sys-file-reader.c:2933 #, c-format msgid "" "Possible compressed data corruption: string contains compressed integer " "(opcode %d)." msgstr "" "Possible corruption de données compressées : des chaînes contiennent un " "entier compressé (opcode %d)." #: src/data/pc+-file-reader.c:1156 src/data/sys-file-reader.c:3234 #, c-format msgid "`%s' near offset 0x%llx: " msgstr "« %s » près du segment 0x%llx : " #: src/data/pc+-file-reader.c:1159 src/data/sys-file-reader.c:3237 #, c-format msgid "`%s': " msgstr "« %s » : " #: src/data/pc+-file-reader.c:1211 src/data/sys-file-reader.c:3288 #, c-format msgid "System error: %s." msgstr "Erreur système : %s." #: src/data/pc+-file-reader.c:1216 src/data/sys-file-reader.c:3293 msgid "Unexpected end of file." msgstr "Fin inattendue du fichier." #: src/data/pc+-file-reader.c:1301 src/data/sys-file-reader.c:3518 #, c-format msgid "%s: seek failed (%s)." msgstr "%s : opération seek échouée (%s)." #: src/data/pc+-file-reader.c:1351 msgid "SPSS/PC+ System File" msgstr "Fichier système SPSS/PC+" #: src/data/por-file-reader.c:109 #, c-format msgid "portable file %s corrupt at offset 0x%llx: " msgstr "le fichier portable %s est corrompu pour le segment 0x%llx : " #: src/data/por-file-reader.c:136 #, c-format msgid "reading portable file %s at offset 0x%llx: " msgstr "Lecture du fichier portable %s pour le segment 0x%llx : " #: src/data/por-file-reader.c:164 #, c-format msgid "Error closing portable file `%s': %s." msgstr "Erreur de fermeture du fichier portable « %s » : %s." #: src/data/por-file-reader.c:216 msgid "unexpected end of file" msgstr "fin du fichier inattendue" #. TRANSLATORS: this fragment will be interpolated into #. messages in fh_lock() that identify types of files. #: src/data/por-file-reader.c:275 src/data/por-file-writer.c:147 msgid "portable file" msgstr "fichier portable" #: src/data/por-file-reader.c:283 #, c-format msgid "" "An error occurred while opening `%s' for reading as a portable file: %s." msgstr "" "Une erreur est apparue lors de l’ouverture du fichier « %s » pour la lecture " "en tant que fichier portable : %s." #: src/data/por-file-reader.c:304 msgid "Data record expected." msgstr "Données d’enregistrement attendues." #: src/data/por-file-reader.c:402 msgid "Number expected." msgstr "Nombre attendu." #: src/data/por-file-reader.c:430 msgid "Missing numeric terminator." msgstr "Manque une valeur numérique" #: src/data/por-file-reader.c:453 msgid "Invalid integer." msgstr "Nombre entier invalide." #: src/data/por-file-reader.c:464 src/data/por-file-reader.c:484 #, c-format msgid "Bad string length %d." msgstr "Mauvaise longueur de chaîne %d." #: src/data/por-file-reader.c:547 #, c-format msgid "%s: Not a portable file." msgstr "%s : n’est pas un fichier portable" #: src/data/por-file-reader.c:564 #, c-format msgid "Unrecognized version code `%c'." msgstr "Version de code non reconnue « %c »." #: src/data/por-file-reader.c:577 #, c-format msgid "Bad date string length %zu." msgstr "Mauvaise longueur de chaine %zu. " #: src/data/por-file-reader.c:579 #, c-format msgid "Bad time string length %zu." msgstr "Mauvaise longueur de chaine %zu. " #: src/data/por-file-reader.c:630 #, c-format msgid "" "%s: Bad format specifier byte (%d). Variable will be assigned a default " "format." msgstr "" "%s : Format incorrect du caractère spécificateur de format (%d). La variable " "sera affectée au format par défaut." #: src/data/por-file-reader.c:651 #, c-format msgid "Numeric variable %s has invalid format specifier %s." msgstr "" "La variable numérique %s comporte un spécificateur de format invalide %s." #: src/data/por-file-reader.c:655 #, c-format msgid "String variable %s with width %d has invalid format specifier %s." msgstr "" "La variable chaîne %s de largeur %d comporte un spécificateur de format " "invalide %s." #: src/data/por-file-reader.c:679 msgid "Expected variable count record." msgstr "Enregistrement calculé de la variable attendue." #: src/data/por-file-reader.c:683 #, c-format msgid "Invalid number of variables %d." msgstr "Nombre de variables invalide %d." #: src/data/por-file-reader.c:692 #, c-format msgid "Weight variable name (%s) truncated." msgstr "Le poids du nom de variable (%s) tronqué." #: src/data/por-file-reader.c:707 msgid "Expected variable record." msgstr "Enregistrement de la variable attendu." #: src/data/por-file-reader.c:711 #, c-format msgid "Invalid variable width %d." msgstr "Largeur de variable invalide %d." #: src/data/por-file-reader.c:719 #, c-format msgid "Invalid variable name `%s' in position %d." msgstr "Nom de variable invalide « %s » pour la position %d." #: src/data/por-file-reader.c:723 src/data/sys-file-reader.c:1426 #, c-format msgid "Bad width %d for variable %s." msgstr "Mauvaise largeur %d pour la variable %s." #: src/data/por-file-reader.c:737 #, c-format msgid "Duplicate variable name %s in position %d renamed to %s." msgstr "Nom de variable répété %s pour la position %d renommé à %s." #: src/data/por-file-reader.c:786 #, c-format msgid "Weighting variable %s not present in dictionary." msgstr "Pondération de la variable %s n’est pas présent dans le dictionnaire." #: src/data/por-file-reader.c:830 #, c-format msgid "Unknown variable %s while parsing value labels." msgstr "Variable inconnue %s lors de l’analyse des étiquettes de valeurs." #: src/data/por-file-reader.c:833 #, c-format msgid "" "Cannot assign value labels to %s and %s, which have different variable types." msgstr "" "Impossible d’assigner les mêmes étiquettes de valeurs à %s et %s, qui ont " "des types de variables différentes." #: src/data/por-file-reader.c:972 msgid "SPSS Portable File" msgstr "Fichier portable SPSS" #: src/data/por-file-writer.c:139 #, c-format msgid "Invalid decimal digits count %d. Treating as %d." msgstr "Chiffres décimaux invalides %d. traité comme %d." #: src/data/por-file-writer.c:159 #, c-format msgid "Error opening `%s' for writing as a portable file: %s." msgstr "Erreur d’ouverture « %s » pour la lecture du fichier portable : %s." #: src/data/por-file-writer.c:505 #, c-format msgid "An I/O error occurred writing portable file `%s'." msgstr "" "Une erreur d’entrée-sortie (I/O) est apparue lors de l’écriture du fichier " "« %s » en tant que fichier portable." #: src/data/psql-reader.c:48 msgid "" "Support for reading postgres databases was not compiled into this " "installation of PSPP" msgstr "" "Le support pour lire les bases de données postgres n’a pas été compilé dans " "cette version de PSPP" #: src/data/psql-reader.c:242 msgid "Memory error whilst opening psql source" msgstr "Erreur de mémoire lors de l’ouverture de la source psql" #: src/data/psql-reader.c:248 #, c-format msgid "Error opening psql source: %s." msgstr "Erreur d’ouverture de la source psql : %s." #: src/data/psql-reader.c:263 #, c-format msgid "" "Postgres server is version %s. Reading from versions earlier than 8.0 is not " "supported." msgstr "" "Le serveur Postgres est en version %s. Les versions antérieures à 8.0 ne " "sont pas supportées." #: src/data/psql-reader.c:283 msgid "" "Connection is unencrypted, but unencrypted connections have not been " "permitted." msgstr "La connection n’est pas encryptée, ce qui n’est pas autorisé." #: src/data/psql-reader.c:324 src/data/psql-reader.c:349 #: src/data/psql-reader.c:359 #, c-format msgid "Error from psql source: %s." msgstr "Erreur à partir de la source psql : %s." #: src/data/psql-reader.c:454 #, c-format msgid "Unsupported OID %d. SYSMIS values will be inserted." msgstr "OID %d non autorisé. Des valeurs systèmes manquantes seront insérées." #: src/data/settings.c:391 msgid "" "MXWARNS set to zero. No further warnings will be given even when " "potentially problematic situations are encountered." msgstr "" "MXWARNS mis à zéro. Aucun avertissement ne sera signalé, même en cas de " "situation problématique." #: src/data/settings.c:398 #, c-format msgid "" "Warnings re-enabled. %d warnings will be issued before aborting syntax " "processing." msgstr "" "Avertissements à nouveau autorisés. %d avertissements seront rencontrées " "avant le processus d’avortement syntaxique." #: src/data/settings.c:618 #, c-format msgid "" "%s: Custom currency string `%s' does not contain exactly three periods or " "commas (or it contains both)." msgstr "" "%s : La chaîne de devise personnalisée « %s » ne contient pas exactement " "trois points ou virgules (ou bien elle contient les deux)." #. TRANSLATORS: this fragment will be interpolated into #. messages in fh_lock() that identify types of files. #: src/data/sys-file-reader.c:407 src/data/sys-file-writer.c:245 msgid "system file" msgstr "fichier système" #: src/data/sys-file-reader.c:414 #, c-format msgid "Error opening `%s' for reading as a system file: %s." msgstr "Erreur d’ouverture « %s » pour la lecture du fichier système : %s. " #: src/data/sys-file-reader.c:491 msgid "Misplaced type 4 record." msgstr "Enregistrement de type 4 inapproprié." #: src/data/sys-file-reader.c:496 msgid "Duplicate type 6 (document) record." msgstr "L’enregistrement de type 6 (document) est dupliqué." #: src/data/sys-file-reader.c:506 src/data/sys-file-reader.c:1343 #, c-format msgid "" "Unrecognized record type 7, subtype %d. For help, please send this file to " "%s and mention that you were using %s." msgstr "" "L’enregistrement de type 7 et sous-type %d inconnu. Pour recevoir de l’aide, " "veuillez envoyer une copie de ce fichier à %s en mentionnant que vous " "utilisez %s." #: src/data/sys-file-reader.c:526 #, c-format msgid "" "Record type 7, subtype %d found here has the same type as the record found " "near offset 0x%llx. For help, please send this file to %s and mention that " "you were using %s." msgstr "" "L’enregistrement de type 7 et sous-type %d figurant ici a le même type que " "celui trouvé au segment 0x%llx. Pour de l’aide, veuillez envoyer ce fichier " "à %s en mentionnant que vous utilisez %s." #: src/data/sys-file-reader.c:538 #, c-format msgid "Unrecognized record type %d." msgstr "Enregistrement inconnu type %d." #: src/data/sys-file-reader.c:688 #, c-format msgid "Value Label %zu" msgstr "Étiquette de valeur %zu" #: src/data/sys-file-reader.c:697 msgid "Extra Product Info" msgstr "Information supplémentaire produits" #: src/data/sys-file-reader.c:710 #, c-format msgid "Document Line %zu" msgstr "Ligne actuelle %zu" #: src/data/sys-file-reader.c:718 #, c-format msgid "MRSET %zu" msgstr "%zu MRSET" #: src/data/sys-file-reader.c:720 #, c-format msgid "MRSET %zu Label" msgstr "Étiquette du %zu MRSET" #: src/data/sys-file-reader.c:725 #, c-format msgid "MRSET %zu Counted Value" msgstr "Valeur calculée %zu MRSET" #: src/data/sys-file-reader.c:763 #, c-format msgid "" "This system file does not indicate its own character encoding. Using " "default encoding %s. For best results, specify an encoding explicitly. Use " "SYSFILE INFO with ENCODING=\"DETECT\" to analyze the possible encodings." msgstr "" "Ce fichier système n’indique pas son propre encodage de caractères. " "Utilisation de l’encodage par défaut %s. Pour obtenir de meilleurs " "résultats, spécifiez un encodage explicitement. Utilisez SYSFILE INFO avec " "ENCODING=\"DETECT\" pour analyser les encodages possibles." #: src/data/sys-file-reader.c:845 #, c-format msgid "File header claims %d variable positions but %zu were read from file." msgstr "" "L’en tête du fichier demande %d positions de variable, mais %zu ont été lues " "à partir du fichier. " #: src/data/sys-file-reader.c:958 src/data/sys-file-reader.c:972 msgid "This is not an SPSS system file." msgstr "Ce n’est pas un fichier système SPSS." #: src/data/sys-file-reader.c:1027 msgid "" "Compression bias is not the usual value of 100, or system file uses " "unrecognized floating-point format." msgstr "" "Le biais de compression n’est pas la valeur usuelle de 100 ou bien le " "fichier système utilise un format inconnu de virgule flottante." #: src/data/sys-file-reader.c:1102 msgid "Variable label indicator field is not 0 or 1." msgstr "L’indicateur de champ de l’étiquette de variable n’est pas 0 ou 1." #: src/data/sys-file-reader.c:1115 msgid "Numeric missing value indicator field is not -3, -2, 0, 1, 2, or 3." msgstr "" "L’indicateur de champ d’une valeur numérique manquante n’est pas -3, -2, 0, " "1, 2 ou 3." #: src/data/sys-file-reader.c:1125 msgid "String missing value indicator field is not 0, 1, 2, or 3." msgstr "" "L’indicateur de champ d’une valeur chaîne manquante n’est pas 0, 1, 2 ou 3." #: src/data/sys-file-reader.c:1152 #, c-format msgid "Invalid number of labels %u." msgstr "Nombre invalide d’étiquettes %u." #: src/data/sys-file-reader.c:1185 msgid "" "Variable index record (type 4) does not immediately follow value label " "record (type 3) as it should." msgstr "" "L’enregistrement de l’index de la variable (type 4) ne suit pas " "immédiatement l’enregistrement de l’étiquette de valeur (type 3) comme il le " "devrait. " #: src/data/sys-file-reader.c:1197 #, c-format msgid "" "Number of variables associated with a value label (%u) is not between 1 and " "the number of variables (%zu)." msgstr "" "Le numéro de variables associé à l’étiquette de valeur (%u) n’est pas " "compris entre 1 et le nombre de variables (%zu)." #: src/data/sys-file-reader.c:1224 #, c-format msgid "Number of document lines (%d) must be greater than 0 and less than %d." msgstr "" "Le nombre de lignes de ce document (%d) doit être supérieur à 0 et inférieur " "à %d." #: src/data/sys-file-reader.c:1317 #, c-format msgid "Record type 7, subtype %d has bad size %u (expected %d)." msgstr "" "L’enregistrement de type 7 et sous-type %d a une longueur impropre %u " "(valeur attendue %d)." #: src/data/sys-file-reader.c:1321 #, c-format msgid "Record type 7, subtype %d has bad count %u (expected %d)." msgstr "" "L’enregistrement de type 7 et sous-type %d a une valeur calculée %u (valeur " "attendue %d)." #: src/data/sys-file-reader.c:1435 #, fuzzy, c-format #| msgid "Renaming variable with duplicate name `%s' to `%s'." msgid "Renaming variable with invalid name `%s' to `%s'." msgstr "Renommage d’une variable en doublon de « %s » vers « %s »." #: src/data/sys-file-reader.c:1517 msgid "Missing string continuation record." msgstr "Enregistrement de la suite de la chaîne manquante." #: src/data/sys-file-reader.c:1550 #, c-format msgid "Variable %s with width %d has invalid print format 0x%x." msgstr "" "La variable %s de largeur %d présente un format d’impression invalide 0x%x." #: src/data/sys-file-reader.c:1554 #, c-format msgid "Variable %s with width %d has invalid write format 0x%x." msgstr "" "La variable %s de largeur %d présente un format d’écriture invalide 0x%x." #: src/data/sys-file-reader.c:1559 msgid "Suppressing further invalid format warnings." msgstr "Supprimer les avertissements de formats invalides " #: src/data/sys-file-reader.c:1613 #, c-format msgid "" "Floating-point representation indicated by system file (%d) differs from " "expected (%d)." msgstr "" "Le format de nombre flottant indiqué par le fichier système (%d) diffère de " "la valeur attendue (%d)." #: src/data/sys-file-reader.c:1629 #, c-format msgid "" "Integer format indicated by system file (%d) differs from expected (%d)." msgstr "" "Le format de nombre entier indiqué par le fichier système (%d) diffère de la " "valeur attendue (%d)." #: src/data/sys-file-reader.c:1647 src/data/sys-file-reader.c:1653 #, c-format msgid "File specifies unexpected value %g (%a) as %s, instead of %g (%a)." msgstr "" "Le fichier indique une valeur inattendue %g (%a) comme %s, au lieu de %g " "(%a)." #: src/data/sys-file-reader.c:1662 #, c-format msgid "" "File specifies unexpected value %g (%a) as %s, instead of %g (%a) or %g (%a)." msgstr "" "Le fichier indique une valeur inattendue %g (%a) comme %s, au lieu de %g " "(%a) ou %g (%a)." #: src/data/sys-file-reader.c:1714 src/data/sys-file-reader.c:1733 #, c-format msgid "Missing space following `%c' at offset %zu in MRSETS record." msgstr "" "Espace manquant suivant « %c » au décalage %zu dans l’enregistrement MRSETS." #: src/data/sys-file-reader.c:1741 #, c-format msgid "" "Missing label source value following `E' at offset %zu in MRSETS record." msgstr "" "Étiquette manquante de la valeur source suivante « E » au segment %zu dans " "l’enregistrement MRSETS." #: src/data/sys-file-reader.c:1748 #, c-format msgid "" "Unexpected label source value following `E' at offset %zu in MRSETS record." msgstr "" "Étiquette inattendue de la valeur source suivante « E » au segment %zu dans " "l’enregistrement MRSETS." #: src/data/sys-file-reader.c:1755 #, c-format msgid "Missing `C', `D', or `E' at offset %zu in MRSETS record." msgstr "" "Lettres « C », « D » ou « E » manquantes au segment %zu dans " "l’enregistrement MRSETS." #: src/data/sys-file-reader.c:1782 #, c-format msgid "Missing new-line parsing variable names at offset %zu in MRSETS record." msgstr "" "Nom de variable manquante lors de l’analyse syntaxique d’une nouvelle ligne " "au segment %zu dans l’enregistrement MRSETS." #: src/data/sys-file-reader.c:1817 #, c-format msgid "Invalid multiple response set name `%s'." msgstr "Ensemble de réponses multiples invalides nommées %s." #: src/data/sys-file-reader.c:1850 #, c-format msgid "MRSET %s contains duplicate variable name %s." msgstr "MRSET %s contient un nom de variable déjà utilisé %s." #: src/data/sys-file-reader.c:1865 #, c-format msgid "MRSET %s contains both string and numeric variables." msgstr "MRSET %s contient à la fois chaînes et variables numériques." #: src/data/sys-file-reader.c:1877 #, c-format msgid "MRSET %s has no variables." msgstr "MRSET %s ne contient pas de variable." #: src/data/sys-file-reader.c:1879 #, c-format msgid "MRSET %s has only one variable." msgstr "MRSET %s contient seulement une variable." #: src/data/sys-file-reader.c:1923 #, c-format msgid "Extension 11 has bad count %u (for %zu variables)." msgstr "" "L’extension 11 contient une mauvaise valeur calculée %u (pour %zu variables)." #: src/data/sys-file-reader.c:1956 #, c-format msgid "" "Invalid variable display parameters for variable %zu (%s). Default " "parameters substituted." msgstr "" "Paramètres d’affichage de variable invalides pour la variable %zu (%s). " "Remplacé par les paramètres par défaut." #: src/data/sys-file-reader.c:2000 #, c-format msgid "Duplicate long variable name `%s'." msgstr "Nom de variable longue invalide « %s »." # ??? mapping #: src/data/sys-file-reader.c:2053 #, c-format msgid "Long variable mapping from %s to invalid variable name `%s'." msgstr "" "Application de variable longue de %s au nom de variable invalide « %s »." #: src/data/sys-file-reader.c:2088 #, c-format msgid "%s listed as string of invalid length %s in very long string record." msgstr "" "%s affiché comme chaîne de longueur invalide %s dans un enregistrement d’une " "chaîne de grande longueur." #: src/data/sys-file-reader.c:2099 #, c-format msgid "" "%s listed in very long string record with width %s, which requires only one " "segment." msgstr "" "%s affiché avec une longueur %s dans un enregistrement d’une chaîne de " "grande longueur qui ne nécessite qu’un seul segment." #: src/data/sys-file-reader.c:2107 #, c-format msgid "Very long string %s overflows dictionary." msgstr "La chaîne de grande longueur %s outrepasse le dictionnaire." #: src/data/sys-file-reader.c:2125 #, c-format msgid "" "Very long string with width %ld has segment %d of width %d (expected %d)." msgstr "" "La chaîne de grande longueur de taille %ld présente un segment %d de taille " "%d (%d attendu)." #: src/data/sys-file-reader.c:2183 #, fuzzy, c-format #| msgid "Variable index %d not in valid range 1...%zu." msgid "Value label variable index %d not in valid range 1...%zu." msgstr "L’index de la variable %d n’est pas dans l’intervalle entre 1 et %zu. " #: src/data/sys-file-reader.c:2193 #, fuzzy, c-format #| msgid "Variable index %d refers to long string continuation." msgid "Value label variable index %d refers to long string continuation." msgstr "L’index de la variable %d se réfère à la suite d’une longue chaîne." #: src/data/sys-file-reader.c:2208 #, c-format msgid "" "Variables associated with value label are not all of identical type. " "Variable %s is %s, but variable %s is %s." msgstr "" "Les variables associées aux étiquettes de valeur ne sont pas toutes de type " "identique. La variable %s is %s, mais la variable %s est %s." #: src/data/sys-file-reader.c:2226 #, c-format msgid "" "Value labels may not be added to long string variables (e.g. %s) using " "records types 3 and 4." msgstr "" "Les étiquettes de valeur ne peuvent être ajoutées à des variables de chaîne " "longues (par exemple %s) utilisant des enregistrements de type 3 et 4." #: src/data/sys-file-reader.c:2255 #, c-format msgid "Duplicate value label for %g on %s." msgstr "Étiquette de valeur dupliquée pour %g dans %s." #: src/data/sys-file-reader.c:2260 src/data/sys-file-reader.c:2600 #, c-format msgid "Duplicate value label for `%.*s' on %s." msgstr " Étiquette de valeur dupliquée pour « %.*s » sur %s." #: src/data/sys-file-reader.c:2283 #, fuzzy, c-format #| msgid "Suppressed %d additional related warnings." msgid "Suppressed %d additional warnings for value labels." msgstr "Suppression %d des avertissements connexes additionnels." #: src/data/sys-file-reader.c:2297 #, fuzzy, c-format #| msgid "Variable index %d not in valid range 1...%zu." msgid "" "Weight variable index %d not in valid range 1...%zu. Treating file as " "unweighted." msgstr "L’index de la variable %d n’est pas dans l’intervalle entre 1 et %zu. " #: src/data/sys-file-reader.c:2307 #, fuzzy, c-format #| msgid "Variable index %d refers to long string continuation." msgid "" "Weight variable index %d refers to long string continuation. Treating file " "as unweighted." msgstr "L’index de la variable %d se réfère à la suite d’une longue chaîne." #: src/data/sys-file-reader.c:2315 #, c-format msgid "Ignoring string variable `%s' set as weighting variable." msgstr "" "Ignorer la variable de chaîne « %s » définie comme variable de pondération." #: src/data/sys-file-reader.c:2352 #, c-format msgid "Error parsing attribute value %s[%d]." msgstr "Erreur d’évaluation de la valeur attribuée %s[%d]." #: src/data/sys-file-reader.c:2366 #, c-format msgid "Attribute value %s[%d] is not quoted: %s." msgstr "La valeur attribuée %s[%d] n’est pas indexée : %s." #: src/data/sys-file-reader.c:2379 #, c-format msgid "Duplicate attribute %s." msgstr "Nom l'attribut %s dupliqué." #: src/data/sys-file-reader.c:2463 #, c-format msgid "Invalid role for variable %s." msgstr "Rôle de variables %s invalide." #: src/data/sys-file-reader.c:2472 #, c-format msgid "%zu other variables had invalid roles." msgstr "Les autres variables %zu ont des rôles invalides." #: src/data/sys-file-reader.c:2485 #, c-format msgid "Extension record subtype %d ends unexpectedly." msgstr "" "Le sous-type d’enregistrement d’extension %d se termine par de manière " "innattendu." #: src/data/sys-file-reader.c:2531 #, c-format msgid "Ignoring long string value label record for unknown variable %s." msgstr "" "Ignore la valeur de l’enregistrement d’une chaîne longue pour la variable " "inconnue %s." #: src/data/sys-file-reader.c:2536 #, c-format msgid "Ignoring long string value label record for numeric variable %s." msgstr "" "Ignore la valeur de l’enregistrement d’une chaîne longue pour la variable " "numérique %s." #: src/data/sys-file-reader.c:2543 #, c-format msgid "" "Ignoring long string value label record for variable %s because the record's " "width (%d) does not match the variable's width (%d)." msgstr "" "Ignore la valeur de l’enregistrement d’une chaîne longue pour la variable %s " "car la longueur de l’enregistrement (%d) ne correspond pas à la longueur de " "la variable (%d)." #: src/data/sys-file-reader.c:2573 #, c-format msgid "" "Ignoring long string value label %zu for variable %s, with width %d, that " "has bad value width %zu." msgstr "" "Ignore la valeur de l’enregistrement d’une chaîne longue %zu pour la " "variable %s de longueur %d, qui comporte une longueur erronée %zu." #: src/data/sys-file-reader.c:2646 #, c-format msgid "" "Long string missing values record says variable %s has %d missing values, " "but only 1 to 3 missing values are allowed." msgstr "" "Des valeurs de l’enregistrement d’une chaîne longue manquantes signifie que " "la variable %s a %d valeurs manquantes, mais il ne peut en manquer que 1 à 3." #: src/data/sys-file-reader.c:2656 #, c-format msgid "Ignoring long string missing value record for unknown variable %s." msgstr "" "Ignore la valeur de l’enregistrement d’une chaîne longue manquante pour la " "variable inconnue %s." #: src/data/sys-file-reader.c:2661 #, c-format msgid "Ignoring long string missing value record for numeric variable %s." msgstr "" "Ignore la valeur de l’enregistrement d’une chaîne longue manquante pour la " "variable numérique %s." #: src/data/sys-file-reader.c:2686 #, c-format msgid "" "Ignoring long string missing value %zu for variable %s, with width %d, that " "has bad value width %zu." msgstr "" "Ignore la valeur de l’enregistrement d’une chaîne longue manquante %zu pour " "la variable %s de longueur %d, qui comporte une longueur erronée %zu." #: src/data/sys-file-reader.c:2740 msgid "File ends in partial string value." msgstr "Le fichier se termine sur une chaîne tronquée." #: src/data/sys-file-reader.c:2879 msgid "" "Possible compressed data corruption: compressed spaces appear in numeric " "field." msgstr "" "Possible corruption de données compressées : des espaces figurent dans un " "champ numérique." #: src/data/sys-file-reader.c:3030 #, c-format msgid "Suppressed %d additional related warnings." msgstr "Suppression %d des avertissements connexes additionnels." #: src/data/sys-file-reader.c:3076 src/data/sys-file-reader.c:3093 #, c-format msgid "Dictionary record refers to unknown variable %s." msgstr "" "Un enregistrement de dictionnaire se réfère à une variable inconnue %s." #: src/data/sys-file-reader.c:3159 #, c-format msgid "Expecting digit at offset %zu in MRSETS record." msgstr "Chiffre attendu au segment %zu dans l’enregistrement MRSETS." #: src/data/sys-file-reader.c:3167 #, c-format msgid "Expecting space at offset %zu in MRSETS record." msgstr "Espace attendu au segment %zu dans l’enregistrement MRSETS." #: src/data/sys-file-reader.c:3175 #, c-format msgid "%zu-byte string starting at offset %zu exceeds record length %zu." msgstr "" "La chaîne de %zu-caractères commençant au segment %zu dépasse la longueur " "d’enregistrement %zu." #: src/data/sys-file-reader.c:3185 #, c-format msgid "Expecting space at offset %zu following %zu-byte string." msgstr "Espace attendu au segment %zu suivant une chaîne de %zu-caractères." #: src/data/sys-file-reader.c:3476 #, c-format msgid "Wrong ZLIB data header offset %#llx (expected %#llx)." msgstr "Offset %#llx de l’entête ZLIB incorrect (attendu %#llx)." #: src/data/sys-file-reader.c:3484 #, c-format msgid "Impossible ZLIB trailer offset 0x%llx." msgstr "Offset 0x%llx. de la zone de remplissage ZLIB impossible." #: src/data/sys-file-reader.c:3491 #, c-format msgid "Invalid ZLIB trailer length %lld." msgstr "Longueur de la zone de remplissage ZLIB invalide %lld." #: src/data/sys-file-reader.c:3555 #, c-format msgid "End of ZLIB trailer (0x%llx) is not file size (0x%llx)." msgstr "" "La fin de l’enregistrement ZLIB (0x%llx) n’est pas une taille de fichier (0x" "%llx)." #: src/data/sys-file-reader.c:3565 #, c-format msgid "ZLIB trailer bias (%lld) differs from file header bias (%.2f)." msgstr "" "L’enregistrement ZLIB bias (%lld) diffère de l’entête bias du fichier (%.2f)." #: src/data/sys-file-reader.c:3575 #, c-format msgid "ZLIB trailer \"zero\" field has nonzero value %lld." msgstr "L’enregistrement ZLIB « zéro » a la valeur non nulle %lld." #: src/data/sys-file-reader.c:3581 #, c-format msgid "ZLIB trailer specifies unexpected %u-byte block size." msgstr "" "L’enregistrement ZLIB indique une taille de bloc inattendue : %u octets." #: src/data/sys-file-reader.c:3589 #, c-format msgid "%lld-byte ZLIB trailer specifies %u data blocks (expected %lld)." msgstr "" "L’enregistrement ZLIB de %lld-octet spécifie %u blocs de données (%lld " "attendu)." #: src/data/sys-file-reader.c:3614 #, c-format msgid "" "ZLIB block descriptor %u reported uncompressed data offset %#llx, when %#llx " "was expected." msgstr "" "Le descripteur de bloc ZLIB %u rapporte l’offset %#llx de données non-" "compressées, lorsque %#llx était attendu." #: src/data/sys-file-reader.c:3623 #, c-format msgid "" "ZLIB block descriptor %u reported compressed data offset %#llx, when %#llx " "was expected." msgstr "" "Le descripteur de bloc ZLIB %u rapporte l’offset %#llx de données " "compressées, lorsque %#llx était attendu." #: src/data/sys-file-reader.c:3633 #, c-format msgid "" "ZLIB block descriptor %u reported block size %#x, when %#x was expected." msgstr "" "Le descripteur de bloc ZLIB %u rapporte une taille %#x, lorsque %#x était " "attendu." #: src/data/sys-file-reader.c:3641 #, c-format msgid "" "ZLIB block descriptor %u reported block size %#x, when at most %#x was " "expected." msgstr "" "Le descripteur de bloc ZLIB %u rapporte une taille %#x, lorsque au moins %#x " "était attendu." #: src/data/sys-file-reader.c:3653 #, c-format msgid "" "ZLIB block descriptor %u reports compressed size %u and uncompressed size %u." msgstr "" "Le descripteur de bloc ZLIB %u rapporte une taille compressée %u et non " "compressée %u." #: src/data/sys-file-reader.c:3665 #, c-format msgid "" "ZLIB trailer is at offset %#llx but %#llx would be expected from block " "descriptors." msgstr "" "L’enregistrement ZLIB est à l’offset %#llx mais %#llx serait attendu pour " "des descripteurs de blocs." #: src/data/sys-file-reader.c:3684 #, c-format msgid "ZLIB initialization failed (%s)." msgstr "Echec de l’initialisation de ZLIB (%s)." #: src/data/sys-file-reader.c:3699 #, c-format msgid "Inconsistency at end of ZLIB stream (%s)." msgstr "Incohérence à la fin du flux ZLIB (%s)." #: src/data/sys-file-reader.c:3758 #, c-format msgid "ZLIB stream inconsistency (%s)." msgstr "Flux ZLIB incohérent (%s)." #: src/data/sys-file-reader.c:3782 msgid "Unexpected end of ZLIB compressed data." msgstr "Fin des données compressées ZLIB incorrecte." #: src/data/sys-file-reader.c:3820 msgid "SPSS System File" msgstr "Fichier système SPSS" #: src/data/sys-file-writer.c:210 #, c-format msgid "Unknown system file version %d. Treating as version %d." msgstr "" "Version de fichier système inconnue %d. Traitement en tant que version %d." #: src/data/sys-file-writer.c:256 #, c-format msgid "Error opening `%s' for writing as a system file: %s." msgstr "" "Erreur d’ouverture « %s » lors de l’écriture en tant que fichier système : " "%s." #: src/data/sys-file-writer.c:1271 #, c-format msgid "An I/O error occurred writing system file `%s'." msgstr "" "Une erreur d’entrée-sortie (I/O) est apparue lors de l’écriture du fichier " "« %s » en tant que fichier système." #: src/data/sys-file-writer.c:1378 #, c-format msgid "Failed to initialize ZLIB for compression (%s)." msgstr "Impossible d’initialiser la compression ZLIB ’(%s)." #: src/data/sys-file-writer.c:1407 #, c-format msgid "Failed to complete ZLIB stream compression (%s)." msgstr "Impossible de terminer la compression du flux ZLIB (%s)." #: src/data/sys-file-writer.c:1449 #, c-format msgid "ZLIB stream compression failed (%s)." msgstr "Flux de compression ZLIB échoué (%s)" #: src/data/sys-file-writer.c:1491 #, c-format msgid "%s: Seek failed (%s)." msgstr "%s : opération seek échouée (%s)." #: src/data/variable.c:58 msgid "Left" msgstr "Gauche" #: src/data/variable.c:59 msgid "Right" msgstr "Droite" #: src/data/variable.c:60 msgid "Center" msgstr "Centre" #: src/data/variable.c:66 msgid "Nominal" msgstr "Nominale" #: src/data/variable.c:67 msgid "Ordinal" msgstr "Ordinale" #: src/data/variable.c:68 src/language/stats/ks-one-sample.c:300 msgid "Scale" msgstr "Échelle" #: src/data/variable.c:74 msgid "Input" msgstr "format d’entrée" #. TRANSLATORS: This will be part of a filename. Please avoid whitespace. #: src/data/variable.c:75 src/output/spv/spv-writer.c:213 #: src/ui/gui/psppire-output-window.c:547 msgid "Output" msgstr "Sortie" #: src/data/variable.c:76 msgid "Both" msgstr "Tous les deux" #: src/data/variable.c:77 src/language/dictionary/sys-file-info.c:237 #: src/ui/gui/psppire-dialog-action-crosstabs.c:86 #: src/ui/gui/psppire-dialog-action-crosstabs.c:98 #: src/ui/gui/psppire-dialog-action-crosstabs.c:133 #: src/ui/gui/psppire-dialog-action-crosstabs.c:141 #: src/ui/gui/psppire-variable-sheet.c:408 src/ui/gui/var-display.c:34 msgid "None" msgstr "Aucun(e)" #: src/data/variable.c:78 msgid "Partition" msgstr "Partition" #: src/data/variable.c:79 src/ui/gui/reliability.ui:37 msgid "Split" msgstr "_Diviser" #: src/data/variable.c:729 #, c-format msgid "%s (%s)" msgstr "%s (%s)" #: src/data/variable.c:1339 msgid "" "At least one case in the data file had a weight value that was user-missing, " "system-missing, zero, or negative. These case(s) were ignored." msgstr "" "Au moins un cas dans le fichier de données contient une valeur pondérée " "erronée (valeur utilisateur ou système manquante, nulle ou négative). Ces " "cas ont été ignorés." #: src/language/command.c:207 src/language/stats/graph.c:749 #: src/language/stats/graph.c:755 src/language/stats/graph.c:789 #: src/language/stats/graph.c:794 src/language/stats/graph.c:799 #: src/language/stats/graph.c:852 src/language/stats/graph.c:857 #: src/language/stats/graph.c:862 src/language/stats/graph.c:867 #: src/language/stats/graph.c:872 src/language/stats/graph.c:877 #: src/language/stats/graph.c:882 src/language/utilities/set.q:236 #, c-format msgid "%s is not yet implemented." msgstr "%s n’est pas encore mis en œuvre" #: src/language/command.c:212 #, c-format msgid "%s may be used only in testing mode." msgstr "%s peut être utilisé seulement en mode test." #: src/language/command.c:217 #, c-format msgid "%s may be used only in enhanced syntax mode." msgstr "%s ne peut être utilisé qu’au sein du mode de syntaxe étendu." #: src/language/command.c:345 msgid "expecting command name" msgstr "Attend un nom de commande" #: src/language/command.c:347 #, c-format msgid "Unknown command `%s'." msgstr "Commande inconnue « %s »." #: src/language/command.c:380 #, c-format msgid "%s is allowed only before the active dataset has been defined." msgstr "" "%s est permis seulement avant que le jeu de données actif a été défini. " #: src/language/command.c:384 #, c-format msgid "%s is allowed only after the active dataset has been defined." msgstr "" "%s est permis seulement après que le jeu de données actif ait été défini." #: src/language/command.c:388 src/language/command.c:392 #, c-format msgid "%s is allowed only inside %s." msgstr "%s est permis seulement dans %s." #: src/language/command.c:399 src/language/command.c:403 #, c-format msgid "" "%s is allowed only before the active dataset has been defined or inside %s." msgstr "" "%s est permis seulement avant que le jeu de données actif ait été défini ou " "à l’intérieur de %s." #: src/language/command.c:407 src/language/command.c:411 #, c-format msgid "" "%s is allowed only after the active dataset has been defined or inside %s." msgstr "" "%s est permis seulement après que le jeu de données actif ait été défini ou " "à l’intérieur de %s." #: src/language/command.c:415 #, c-format msgid "%s is allowed only inside %s or inside %s." msgstr "%s est permis seulement à l’intérieur de %s ou %s." #: src/language/command.c:421 #, c-format msgid "" "%s is allowed only after the active dataset has been defined, inside INPUT " "PROGRAM, or inside FILE TYPE." msgstr "" "%s est permis seulement après que le jeu de données actif ait été défini à " "l’intérieur de INPUT PROGRAM ou à l’intérieur de FILE TYPE." #: src/language/command.c:426 #, c-format msgid "" "%s is allowed only before the active dataset has been defined, inside INPUT " "PROGRAM, or inside FILE TYPE." msgstr "" "%s est permis seulement avant que le jeu de données ait été défini à " "l’intérieur de INPUT PROGRAM ou à l’intérieur de FILE TYPE." #: src/language/command.c:444 src/language/command.c:447 #, c-format msgid "%s is not allowed inside %s." msgstr "%s n’est pas permis au sein de %s." #: src/language/command.c:529 src/language/utilities/host.c:272 #: src/language/utilities/permissions.c:105 #, c-format msgid "This command not allowed when the %s option is set." msgstr "Cette commande n’est pas permise quand l’option %s est active." #: src/language/command.c:545 #, c-format msgid "Error removing `%s': %s." msgstr "Erreur d’effacement de « %s » : %s." #: src/language/lexer/lexer.c:296 #, c-format msgid "expecting %s" msgstr "%s attendu" #: src/language/lexer/lexer.c:300 #, c-format msgid "expecting %s or %s" msgstr "Attend %s ou %s" #: src/language/lexer/lexer.c:304 #, c-format msgid "expecting %s, %s, or %s" msgstr "en attente de %s, %s ou %s" #: src/language/lexer/lexer.c:309 #, c-format msgid "expecting %s, %s, %s, or %s" msgstr "en attente de %s, %s, %s ou %s" #: src/language/lexer/lexer.c:314 #, c-format msgid "expecting %s, %s, %s, %s, or %s" msgstr "en attente de %s, %s, %s, %s ou %s" #: src/language/lexer/lexer.c:319 #, c-format msgid "expecting %s, %s, %s, %s, %s, or %s" msgstr "en attente de %s, %s, %s, %s, %s ou %s" #: src/language/lexer/lexer.c:325 #, c-format msgid "expecting %s, %s, %s, %s, %s, %s, or %s" msgstr "en attente de %s, %s, %s, %s, %s, %s ou %s" #: src/language/lexer/lexer.c:331 #, c-format msgid "expecting %s, %s, %s, %s, %s, %s, %s, or %s" msgstr "en attente de %s, %s, %s, %s, %s, %s, %s ou %s" #: src/language/lexer/lexer.c:351 #, c-format msgid "Subcommand %s may only be specified once." msgstr "La sous-commande %s ne peut être spécifiée qu’une fois." #: src/language/lexer/lexer.c:363 #, c-format msgid "Required subcommand %s was not specified." msgstr "La sous-commande demandée %s n’est pas spécifiée." #: src/language/lexer/lexer.c:371 #, c-format msgid "%s may only be specified once within subcommand %s" msgstr "" "L’option %s ne peut être spécifiée qu’une fois dans la sous-commande %s." #: src/language/lexer/lexer.c:380 #, c-format msgid "Required %s specification missing from %s subcommand" msgstr "La spécification %s demandée manque dans la sous-commande %s" #: src/language/lexer/lexer.c:399 msgid "Syntax error at end of input" msgstr "Erreur de syntaxe à la fin d’une entrée" #: src/language/lexer/lexer.c:420 src/language/xforms/select-if.c:60 #: src/language/stats/autorecode.c:206 src/language/stats/npar.c:503 #: src/language/data-io/print-space.c:83 msgid "expecting end of command" msgstr "Fin de commande attendu" #: src/language/lexer/lexer.c:631 msgid "expecting string" msgstr "Chaîne de caractères attendue" #: src/language/lexer/lexer.c:660 msgid "expecting integer" msgstr "Nombre entier attendu" #: src/language/lexer/lexer.c:673 msgid "expecting number" msgstr "attend un nombre" #: src/language/lexer/lexer.c:685 msgid "expecting identifier" msgstr "en attente de l’identifiant" #: src/language/lexer/lexer.c:1272 msgid "Syntax error at end of command" msgstr "Erreur de syntaxe à la fin de la commande" #: src/language/lexer/lexer.c:1281 #, c-format msgid "Syntax error at `%s'" msgstr "Erreur de syntaxe dans « %s »" #: src/language/lexer/lexer.c:1284 msgid "Syntax error" msgstr "Erreur de syntaxe" #: src/language/lexer/lexer.c:1470 #, c-format msgid "String of hex digits has %d characters, which is not a multiple of 2" msgstr "" "La chaîne de caractères hexadécimaux comprend %d caractères, ce qui n’est " "pas un multiple de deux" #: src/language/lexer/lexer.c:1477 #, c-format msgid "`%c' is not a valid hex digit" msgstr "« %c » n’est pas un caractère hexadécimal valide" #: src/language/lexer/lexer.c:1482 #, c-format msgid "" "Unicode string contains %d bytes, which is not in the valid range of 1 to 8 " "bytes" msgstr "" "La chaîne Unicode contient %d caractères, ce qui ne figure pas dans " "l’intervalle autorisé de 1 à 8 caractères." #: src/language/lexer/lexer.c:1488 #, c-format msgid "U+%04X is not a valid Unicode code point" msgstr "U+%04X n’est pas un caractère Unicode valide." #: src/language/lexer/lexer.c:1493 msgid "Unterminated string constant" msgstr "Constante de chaîne incomplète" #: src/language/lexer/lexer.c:1497 #, c-format msgid "Missing exponent following `%s'" msgstr "Exposant manquant suivant « %s »" #: src/language/lexer/lexer.c:1502 msgid "Unexpected `.' in middle of command" msgstr "Point « . » inattendu au milieu de la commande" #: src/language/lexer/lexer.c:1508 #, c-format msgid "Bad character %s in input" msgstr "Caractères erroné %s en entrée" #: src/language/lexer/lexer.c:1603 #, c-format msgid "Opening `%s': %s." msgstr "Ouverture « %s » : %s." #: src/language/lexer/lexer.c:1647 #, c-format msgid "Error closing `%s': %s." msgstr "Erreur de fermeture de « %s » : %s." #: src/language/lexer/subcommand-list.c:118 #, c-format msgid "No more than %d %s subcommands allowed." msgstr "Pas plus de %d %s sous-commandes autorisées." #: src/language/lexer/format-parser.c:77 msgid "expecting valid format specifier" msgstr "en attente d’un identifiant de format valide" #: src/language/lexer/format-parser.c:116 #: src/language/lexer/format-parser.c:143 src/language/utilities/output.c:108 #: src/language/data-io/data-list.c:453 src/language/data-io/get-data.c:638 #: src/language/data-io/placement-parser.c:236 #, c-format msgid "Unknown format type `%s'." msgstr "Type de format inconnu « %s »." #: src/language/lexer/format-parser.c:122 #, c-format msgid "Format specifier `%s' lacks required width." msgstr "Il manque la longeur pour le format « %s » indiqué." #: src/language/lexer/format-parser.c:138 msgid "expecting format type" msgstr "en attente d’un type de format" #: src/language/lexer/value-parser.c:66 #, c-format msgid "" "The high end of the range (%.*g) is below the low end (%.*g). The range " "will be treated as if reversed." msgstr "" "La fin d’intervalle (%.*g) est inférieure au début (%.*g). L’intervalle sera " "inversé." #: src/language/lexer/value-parser.c:74 #, c-format msgid "Ends of range are equal (%.*g)." msgstr "Les extrémités de l’intervalle sont égales (%.*g)." #: src/language/lexer/value-parser.c:82 #, c-format msgid "%s or %s must be part of a range." msgstr "%s ou %s doivent faire partie de l’intervalle." #: src/language/lexer/value-parser.c:112 msgid "System-missing value is not valid here." msgstr "La valeur système manquante n’est pas valide ci." #: src/language/lexer/variable-parser.c:86 utilities/pspp-convert.c:83 msgid "expecting variable name" msgstr "attend le nom de la variable" #: src/language/lexer/variable-parser.c:96 #, c-format msgid "%s is not a variable name." msgstr "%s n’est pas un nom de variable" #: src/language/lexer/variable-parser.c:206 #, c-format msgid "" "%s is not a numeric variable. It will not be included in the variable list." msgstr "" "%s n’est pas une variable numérique. Il ne sera pas inclus dans la liste des " "variables" #: src/language/lexer/variable-parser.c:209 #, c-format msgid "" "%s is not a string variable. It will not be included in the variable list." msgstr "" "%s n’est pas une chaine de caractères. Il ne sera pas inclus dans la liste " "des variables " #: src/language/lexer/variable-parser.c:213 #, c-format msgid "Scratch variables (such as %s) are not allowed here." msgstr "Les variables nulles (comme %s) ne sont pas permises ici." #: src/language/lexer/variable-parser.c:217 #, c-format msgid "" "%s and %s are not the same type. All variables in this variable list must " "be of the same type. %s will be omitted from the list." msgstr "" "%s et %s ne sont pas de même type. Toutes les variables dans cette liste " "doivent être de même type. %s seront enlevés de la liste." #: src/language/lexer/variable-parser.c:223 #, c-format msgid "" "%s and %s are string variables with different widths. All variables in this " "variable list must have the same width. %s will be omitted from the list." msgstr "" "%s et %s sont des variables chaînes de longueur différentes. Toutes les " "variables dans cette liste doivent être de même largeur. %s seront enlevés " "de la liste." #: src/language/lexer/variable-parser.c:228 #: src/language/lexer/variable-parser.c:447 #, c-format msgid "Variable %s appears twice in variable list." msgstr "La variable %s apparait deux fois dans la liste de variables." #: src/language/lexer/variable-parser.c:341 #, c-format msgid "%s TO %s is not valid syntax since %s precedes %s in the dictionary." msgstr "" "%s TO %s n’est pas une syntaxe valide car %s précède %s dans le dictionnaire." #: src/language/lexer/variable-parser.c:349 #, c-format msgid "" "When using the TO keyword to specify several variables, both variables must " "be from the same variable dictionaries, of either ordinary, scratch, or " "system variables. %s is a %s variable, whereas %s is %s." msgstr "" "Lors de l’utilisation du mot-clé TO pour spécifier plusieurs variables, les " "deux variables doivent faire partie d’un même dictionnaire de variables " "qu’elles soient ordinaire, nulle ou système. %s est une variable %s, alors " "que %s est %s." #: src/language/lexer/variable-parser.c:424 #, c-format msgid "`%s' cannot be used with TO because it does not end in a digit." msgstr "" "« %s » ne peut pas être utilisé avec TO car elle ne se termine pas par un " "chiffre." #: src/language/lexer/variable-parser.c:432 #, c-format msgid "Numeric suffix on `%s' is larger than supported with TO." msgstr "" "Le suffixe numérique en « %s » is supérieur à la valeur autorisée avec TO." #: src/language/lexer/variable-parser.c:505 msgid "Scratch variables not allowed here." msgstr "Les variables nulles ne sont pas permises ici." #: src/language/lexer/variable-parser.c:529 msgid "Prefixes don't match in use of TO convention." msgstr "" "Les préfixes ne sont pas conformes à l’utilisation de la convention TO. " #: src/language/lexer/variable-parser.c:534 msgid "Bad bounds in use of TO convention." msgstr "Limites incorrectes dans l’utilisation de la convention TO. " #: src/language/xforms/compute.c:150 src/language/xforms/compute.c:205 #, c-format msgid "" "When executing COMPUTE: SYSMIS is not a valid value as an index into vector " "%s." msgstr "" "Lors de l’exécution de COMPUTE : SYSMIS n’est pas une valeur autorisée comme " "index au sein d’un vecteur %s." #: src/language/xforms/compute.c:154 src/language/xforms/compute.c:212 #, c-format msgid "" "When executing COMPUTE: %.*g is not a valid value as an index into vector %s." msgstr "" "Lors de l’exécution de COMPUTE : %.*g n’est pas une valeur autorisée comme " "index au sein d’un vecteur %s." #: src/language/xforms/compute.c:356 #, c-format msgid "There is no vector named %s." msgstr "Il n’y a pas de vecteur nommé %s." #: src/language/xforms/count.c:125 msgid "Destination cannot be a string variable." msgstr "La destination ne peut être une variable chaîne." #: src/language/xforms/sample.c:76 msgid "The sampling factor must be between 0 and 1 exclusive." msgstr "Le facteur d’échantillonnage doit être compris entre 0 et 1 exclusif." #: src/language/xforms/sample.c:96 #, c-format msgid "Cannot sample %d observations from a population of %d." msgstr "Impossible d’échantillonner %d observations d’une population de %d." #: src/language/xforms/recode.c:261 msgid "" "Inconsistent target variable types. Target variables must be all numeric or " "all string." msgstr "" "Types inconsistants des variables cibles. Les variables cibles doivent être " "toutes numériques ou toutes des chaînes." #: src/language/xforms/recode.c:282 msgid "CONVERT requires string input values and numeric output values." msgstr "" "CONVERT exige des valeurs chaîne en entrée et des valeurs numériques en " "sortie." #: src/language/xforms/recode.c:339 #, c-format msgid "%s is not allowed with string variables." msgstr "%s n’est pas permis pour les variables chaînes." #: src/language/xforms/recode.c:422 msgid "expecting output value" msgstr "en attente de valeur de sortie" #: src/language/xforms/recode.c:479 #, c-format msgid "" "%zu variable(s) cannot be recoded into %zu variable(s). Specify the same " "number of variables as source and target variables." msgstr "" "%zu variables(s) ne peu(ven)t pas être recodée(s) en %zu variable(s). " "Spécifier le même nombre de variables comme source et destination." #: src/language/xforms/recode.c:494 #, c-format msgid "" "There is no variable named %s. (All string variables specified on INTO must " "already exist. Use the STRING command to create a string variable.)" msgstr "" "Il n’existe pas de variable nommée %s. (Toutes les variables chaînes " "spécifiée dans INTO doivent avoir été déclarées. Utiliser l’instruction " "STRING pour générer une variable chaîne.)" #: src/language/xforms/recode.c:510 #, c-format msgid "INTO is required with %s input values and %s output values." msgstr "INTO est exigé avec %s valeurs en entrée et %s valeurs en sortie." #: src/language/xforms/recode.c:523 #, c-format msgid "Type mismatch. Cannot store %s data in %s variable %s." msgstr "Erreur de type. Impossible de stocker %s données en %s variable %s." #: src/language/xforms/recode.c:566 #, c-format msgid "" "Cannot recode because the variable %s would require a width of %d bytes or " "greater, but it has a width of only %d bytes." msgstr "" "Impossible de réencoder car la variable %s nécessiterait %d octets ou plus, " "mais elle a seulement %d octets." #: src/language/xforms/select-if.c:100 msgid "Syntax error expecting OFF or BY. Turning off case filtering." msgstr "" "Erreur de syntaxe liée à l’absence de OFF ou BY. Le filtrage d’observations " "a été annulé." #: src/language/xforms/select-if.c:115 msgid "The filter variable must be numeric." msgstr "La variable filtre doit être numérique." #: src/language/xforms/select-if.c:121 msgid "The filter variable may not be scratch." msgstr "Le filtre variable ne peut pas être zéro." #: src/language/control/control-stack.c:49 #, c-format msgid "%s without %s." msgstr "%s sans %s." #: src/language/control/control-stack.c:77 #, c-format msgid "This command must appear inside %s...%s, without intermediate %s...%s." msgstr "" "Cette commande doit apparaître à l’intérieur de %s…%s, sans intermédiaire %s…" "%s." #: src/language/control/control-stack.c:94 #, c-format msgid "This command cannot appear outside %s...%s." msgstr "Cette commande ne peut apparaître en dehors de %s…%s." #: src/language/control/do-if.c:180 #, c-format msgid "This command may not follow %s in %s ... %s." msgstr "Cette commande ne peut suivre %s dans %s … %s." #: src/language/control/loop.c:211 msgid "Only one index clause may be specified." msgstr "Une seule clause d’index peut être spécifiée." #: src/language/control/repeat.c:120 #, c-format msgid "Dummy variable name `%s' hides dictionary variable `%s'." msgstr "" "Le nom de variable erroné « %s » masque la variable du dictionnaire « %s »." #: src/language/control/repeat.c:126 #, c-format msgid "Dummy variable name `%s' is given twice." msgstr "Le nom de variable erroné « %s » est utilisé deux fois." #: src/language/control/repeat.c:170 #, c-format msgid "" "Dummy variable `%s' had %zu substitutions, so `%s' must also, but %zu were " "specified." msgstr "" "La variable nominale « %s » a subi %zu substitutions, donc « %s » le devrait " "aussi, mais %zu a été spécifié." #: src/language/control/repeat.c:379 msgid "Ranges may only have integer bounds." msgstr "Les intervalles ne peuvent avoir que des entiers comme limites." #: src/language/control/repeat.c:393 #, c-format msgid "%ld TO %ld is an invalid range." msgstr "%ld TO %ld est un intervalle invalide." #: src/language/control/repeat.c:443 #, c-format msgid "No matching %s." msgstr "Pas de correspondance avec %s." #: src/language/control/temporary.c:44 msgid "" "This command may only appear once between procedures and procedure-like " "commands." msgstr "" "Cette commande ne peut figurer qu’une seule fois entre les procédures ou " "assimilées." #: src/language/dictionary/attributes.c:104 msgid "Attribute array index must be between 1 and 65535." msgstr "L’index du tableau doit être compris entre 1 et 65535." #: src/language/dictionary/apply-dictionary.c:74 #, c-format msgid "Variable %s is %s in target file, but %s in source file." msgstr "" "La variable %s est %s dans le fichier cible, mais %s dans le fichier source." #: src/language/dictionary/apply-dictionary.c:110 msgid "No matching variables found between the source and target files." msgstr "Aucune variable trouvée ne correspond aux fichiers source et cible." #: src/language/dictionary/delete-variables.c:40 #: src/language/dictionary/modify-variables.c:79 #: src/language/dictionary/rename-variables.c:51 #, c-format msgid "" "%s may not be used after %s. Temporary transformations will be made " "permanent." msgstr "" "%s ne peut être utilisée après %s. Les transformations temporaires " "deviendront permanentes." #: src/language/dictionary/delete-variables.c:48 #: src/language/dictionary/modify-variables.c:312 #, c-format msgid "" "%s may not be used to delete all variables from the active dataset " "dictionary. Use %s instead." msgstr "" "%s ne peut pas être utilisé pour supprimer toutes les variables à partir du " "dictionnaire du jeu de données actif. Utilisez plutôt %s." #: src/language/dictionary/missing-values.c:70 #, c-format msgid "" "Cannot mix numeric variables (e.g. %s) and string variables (e.g. %s) within " "a single list." msgstr "" "Impossible de mélanger les variables numériques (ç.-à-d. %s) et les " "variables chaînes (ç.-à-d. %s) au sein d’une simple liste." #: src/language/dictionary/missing-values.c:91 msgid "" "Too many numeric missing values. At most three individual values or one " "value and one range are allowed." msgstr "" "Trop de valeurs numériques manquantes. Au plus trois valeurs individuelles " "ou une valeur et une plage sont autorisées." #: src/language/dictionary/missing-values.c:126 #, c-format msgid "Truncating missing value to maximum acceptable length (%d bytes)." msgstr "" "Troncature de la valeur manquante au maximum acceptable (%d caractères)." #: src/language/dictionary/missing-values.c:137 msgid "" "Too many string missing values. At most three individual values are allowed." msgstr "" "Trop de chaînes manquantes. Au plus trois valeurs individuelles sont " "autorisées." #: src/language/dictionary/missing-values.c:154 #, c-format msgid "Missing values provided are too long to assign to variable of width %d." msgstr "" "Les valeurs manquantes fournies sont trop longues pour les assigner à la " "variable de largeur %d." #: src/language/dictionary/modify-variables.c:145 msgid "Cannot specify ALL after specifying a set of variables." msgstr "" "Impossible d’utiliser ALL après la spécification d’un ensemble de variables." #: src/language/dictionary/modify-variables.c:221 #: src/language/dictionary/rename-variables.c:76 #, c-format msgid "" "Differing number of variables in old name list (%zu) and in new name list " "(%zu)." msgstr "" "Le nombre de variables est différent entre l’ancienne liste de noms (%zu) et " "la nouvelle liste (%zu)." #: src/language/dictionary/modify-variables.c:244 #: src/language/dictionary/modify-variables.c:294 #, c-format msgid "" "%s subcommand may be given at most once. It may not be given in conjunction " "with the %s subcommand." msgstr "" "La sous-commande %s ne peut être utilisée qu’une fois au plus. Elle ne peut " "être utilisée simultanément avec la sous-commande %s." #: src/language/dictionary/modify-variables.c:331 #, c-format msgid "Unrecognized subcommand name `%s'." msgstr "Nom de sous-commande « %s » inconnue." #: src/language/dictionary/modify-variables.c:334 msgid "Subcommand name expected." msgstr "Nom de la sous-commande attendue." #: src/language/dictionary/mrsets.c:117 #, c-format msgid "" "VARIABLES specified only variable %s on %s, but at least two variables are " "required." msgstr "" "VARIABLES spécifié uniquement la variable %s sur %s, mais au moins deux " "variables sont demandées." #: src/language/dictionary/mrsets.c:150 msgid "Numeric VALUE must be an integer." msgstr "La VALUE numérique oit être un entier." #: src/language/dictionary/mrsets.c:230 src/language/dictionary/mrsets.c:268 #, c-format msgid "" "MDGROUP subcommand for group %s specifies a string VALUE, but the variables " "specified for this group are numeric." msgstr "" "La sous-commande MDGROUP pour le groupe %s spécifie une valeur chaîne, les " "variables spécifiées pour ce groupe sont numériques." #: src/language/dictionary/mrsets.c:254 #, c-format msgid "" "VALUE string on MDGROUP subcommand for group %s is %d bytes long, but it " "must be no longer than the narrowest variable in the group, which is %s with " "a width of %d bytes." msgstr "" "La chaîne VALUE de la sous-commande MDGROUP pour le groupe %s a une longueur " "de %d caractères, mais elle ne doit pas être plus longue que la plus courte " "variable du groupe, c’est-à-dire %s avec une largeur de %d caractères." #: src/language/dictionary/mrsets.c:280 #, c-format msgid "" "MDGROUP subcommand for group %s specifies LABELSOURCE=VARLABEL but not " "CATEGORYLABELS=COUNTEDVALUES. Ignoring LABELSOURCE." msgstr "" "La sous-commande MDGROUP pour le groupe %s spécifie LABELSOURCE=VARLABEL, " "mais non CATEGORYLABELS=COUNTEDVALUES. LABELSOURCE sera ignoré." #: src/language/dictionary/mrsets.c:286 #, c-format msgid "" "MDGROUP subcommand for group %s specifies both LABEL and LABELSOURCE, but " "only one of these subcommands may be used at a time. Ignoring LABELSOURCE." msgstr "" "La sous-commande MDGROUP pour le groupe %s spécifie à la fois LABEL et " "LABELSOURCE, mais une seule de ces sous-commandes peut être utilisée à la " "fois. LABELSOURCE sera ignoré." #: src/language/dictionary/mrsets.c:326 #, c-format msgid "" "Variables %s and %s specified as part of multiple dichotomy group %s have " "the same variable label. Categories represented by these variables will not " "be distinguishable in output." msgstr "" "Les variables %s et %s spécifiées en tant qu’éléments du groupe %s de " "dichotomie multiple ont la même étiquette de variable. Les catégories " "représentées par ces variables ne seront pas différentiables dans la sortie." #: src/language/dictionary/mrsets.c:356 #, c-format msgid "" "Variable %s specified as part of multiple dichotomy group %s (which has " "CATEGORYLABELS=COUNTEDVALUES) has no value label for its counted value. " "This category will not be distinguishable in output." msgstr "" "La variable %s spécifiée en tant que groupe %s de dichotomie multiple (dont " "CATEGORYLABELS=COUNTEDVALUES) n’a pas d’étiquette de valeur pour sa valeur " "calculée. Cette catégorie ne sera pas différentiable dans la sortie." #: src/language/dictionary/mrsets.c:369 #, c-format msgid "" "Variables %s and %s specified as part of multiple dichotomy group %s (which " "has CATEGORYLABELS=COUNTEDVALUES) have the same value label for the group's " "counted value. These categories will not be distinguishable in output." msgstr "" "Les variables %s et %s spécifiées en tant que groupe %s de dichotomie " "multiple (dont CATEGORYLABELS=COUNTEDVALUES) ont la même étiquette de valeur " "pour la valeur calculée des groupes. Ces catégories ne seront pas " "différentiables dans la sortie." #: src/language/dictionary/mrsets.c:426 #, c-format msgid "" "Variables specified on MCGROUP should have the same categories, but %s and " "%s (and possibly others) in multiple category group %s have different value " "labels for value %s." msgstr "" "Les variables spécifiées par MCGROUP devraient être de même catégorie, mais " "%s et %s (et peut-être d’autres) ont des étiquettes de valeurs différentes " "pour la valeur %s dans le groupe à catégorie multiple %s." #: src/language/dictionary/mrsets.c:484 #, c-format msgid "No multiple response set named %s." msgstr "Aucun ensemble de réponses multiples nommé %s." #: src/language/dictionary/mrsets.c:533 msgid "" "The active dataset dictionary does not contain any multiple response sets." msgstr "" "Le dictionnaire du jeu de données actif ne contient pas d’ensembles de " "réponses multiples." #: src/language/dictionary/mrsets.c:540 msgid "Multiple Response Sets" msgstr "Ensembles de réponses multiple" #: src/language/dictionary/mrsets.c:543 #: src/language/dictionary/sys-file-info.c:446 #: src/language/dictionary/sys-file-info.c:733 #: src/language/stats/autorecode.c:375 src/language/data-io/data-parser.c:679 #: src/language/data-io/data-parser.c:725 src/language/data-io/print.c:434 #, fuzzy #| msgid "Attribute" msgid "Attributes" msgstr "Attribuer" #: src/language/dictionary/mrsets.c:544 #: src/language/dictionary/sys-file-info.c:191 #: src/language/dictionary/sys-file-info.c:301 #: src/language/dictionary/sys-file-info.c:302 #: src/language/dictionary/sys-file-info.c:455 #: src/language/dictionary/sys-file-info.c:570 #: src/ui/gui/psppire-var-sheet-header.c:67 src/ui/gui/compute.ui:157 msgid "Label" msgstr "Étiquette" #: src/language/dictionary/mrsets.c:544 #: src/language/dictionary/sys-file-info.c:241 #, fuzzy #| msgid "Encoding:" msgid "Encoding" msgstr "Encodage :" #: src/language/dictionary/mrsets.c:544 #, fuzzy #| msgid "Counted value" msgid "Counted Value" msgstr "Valeur calculée" #: src/language/dictionary/mrsets.c:544 #, fuzzy #| msgid "Cl_ear Variables" msgid "Member Variables" msgstr "_Effacer des variables" #: src/language/dictionary/mrsets.c:547 #: src/language/dictionary/sys-file-info.c:470 #: src/ui/gui/psppire-var-sheet-header.c:55 msgid "Name" msgstr "Nom" #: src/language/dictionary/mrsets.c:564 msgid "Dichotomies" msgstr "" #: src/language/dictionary/mrsets.c:565 src/language/stats/logistic.c:1391 #, fuzzy #| msgid "Category" msgid "Categories" msgstr "Catégorie" #: src/language/dictionary/numeric.c:67 #, c-format msgid "Format type %s may not be used with a numeric variable." msgstr "Le type de format %s ne peut être utilisé avec une variable numérique." #: src/language/dictionary/numeric.c:86 src/language/dictionary/numeric.c:153 #, c-format msgid "There is already a variable named %s." msgstr "Il y a déjà une variable qui s’appelle %s." #: src/language/dictionary/numeric.c:138 #, c-format msgid "Format type %s may not be used with a string variable." msgstr "" "Le type de format %s ne peut être utilisé avec une variable alphanumérique." #: src/language/dictionary/rename-variables.c:92 #, c-format msgid "Renaming would duplicate variable name %s." msgstr "Le renommage dupliquerait le nom de variable %s." #: src/language/dictionary/split-file.c:75 #, fuzzy #| msgid "Split File" msgid "Split Values" msgstr "Scinder le fichier" #: src/language/dictionary/split-file.c:76 #: src/language/dictionary/split-file.c:77 #: src/language/dictionary/sys-file-info.c:696 #: src/language/stats/chisquare.c:195 src/language/stats/cochran.c:156 #: src/language/stats/cochran.c:185 src/language/stats/examine.c:841 #: src/language/stats/reliability.c:648 src/language/stats/reliability.c:651 #: src/language/stats/crosstabs.q:1303 src/language/stats/crosstabs.q:1325 #: src/language/stats/crosstabs.q:1365 src/language/stats/crosstabs.q:1412 msgid "Value" msgstr "Valeur" #: src/language/dictionary/split-file.c:79 #: src/language/dictionary/sys-file-info.c:734 #: src/language/stats/chisquare.c:246 src/language/stats/chisquare.c:328 #: src/language/stats/cochran.c:164 src/language/stats/correlations.c:100 #: src/language/stats/descriptives.c:1004 src/language/stats/friedman.c:226 #: src/language/stats/jonckheere-terpstra.c:377 #: src/language/stats/npar-summary.c:113 src/language/stats/quick-cluster.c:588 #: src/language/stats/runs.c:331 src/language/data-io/data-parser.c:683 #: src/language/data-io/data-parser.c:728 src/language/data-io/print.c:438 #: src/ui/gui/psppire-dictview.c:580 src/ui/gui/psppire-data-editor.c:502 msgid "Variable" msgstr "Variable" #: src/language/dictionary/sys-file-info.c:184 #, fuzzy #| msgid "_Display Data File Information" msgid "File Information" msgstr "Affichage des _informations du fichier de données " #: src/language/dictionary/sys-file-info.c:185 msgid "Attribute" msgstr "Attribuer" #: src/language/dictionary/sys-file-info.c:187 #, fuzzy #| msgid "File:" msgid "File" msgstr "Fichier :" #: src/language/dictionary/sys-file-info.c:194 #, fuzzy #| msgid "Created:" msgid "Created" msgstr "Créé par :" #: src/language/dictionary/sys-file-info.c:203 #, fuzzy #| msgid "Integer Format:" msgid "Integer Format" msgstr "Format Nombre Entier :" #: src/language/dictionary/sys-file-info.c:205 msgid "Big Endian" msgstr "Grand indien" #: src/language/dictionary/sys-file-info.c:206 msgid "Little Endian" msgstr "Petit indien" #: src/language/dictionary/sys-file-info.c:207 #: src/language/dictionary/sys-file-info.c:216 #: src/language/dictionary/sys-file-info.c:223 src/language/utilities/set.q:930 msgid "Unknown" msgstr "Inconnu" #: src/language/dictionary/sys-file-info.c:209 #, fuzzy #| msgid "Real Format:" msgid "Real Format" msgstr "Format réel :" #: src/language/dictionary/sys-file-info.c:211 msgid "IEEE 754 LE." msgstr "IEE 754 LE." #: src/language/dictionary/sys-file-info.c:212 msgid "IEEE 754 BE." msgstr "IEEE 754 BE." #: src/language/dictionary/sys-file-info.c:213 msgid "VAX D." msgstr "VAX D." #: src/language/dictionary/sys-file-info.c:214 msgid "VAX G." msgstr "VAX G." #: src/language/dictionary/sys-file-info.c:215 msgid "IBM 390 Hex Long." msgstr "IBM 390 Hex Long." #: src/language/dictionary/sys-file-info.c:218 #: src/language/dictionary/sys-file-info.c:443 #: src/language/stats/binomial.c:199 src/language/stats/correlations.c:131 #: src/language/stats/correlations.c:159 src/language/stats/descriptives.c:585 #: src/language/stats/factor.c:1658 src/language/stats/factor.c:1701 #: src/language/stats/factor.c:1860 src/language/stats/factor.c:2074 #: src/language/stats/frequencies.c:1583 #: src/language/stats/kruskal-wallis.c:254 #: src/language/stats/kruskal-wallis.c:303 #: src/language/stats/ks-one-sample.c:316 src/language/stats/logistic.c:1187 #: src/language/stats/mann-whitney.c:254 src/language/stats/means.c:718 #: src/language/stats/means.c:800 src/language/stats/median.c:358 #: src/language/stats/oneway.c:985 src/language/stats/oneway.c:1157 #: src/language/stats/reliability.c:591 src/language/stats/regression.c:924 #: src/language/stats/t-test-one-sample.c:132 #: src/language/stats/t-test-paired.c:157 src/language/data-io/list.c:104 #: src/ui/gui/variable-info.ui:25 msgid "Variables" msgstr "Variables" #: src/language/dictionary/sys-file-info.c:221 src/language/stats/examine.c:929 #: src/language/stats/means.c:697 src/language/stats/reliability.c:548 #: src/language/stats/crosstabs.q:930 msgid "Cases" msgstr "Observations" #: src/language/dictionary/sys-file-info.c:226 src/language/stats/oneway.c:980 #: src/ui/gui/psppire-var-sheet-header.c:58 src/ui/gui/compute.ui:303 msgid "Type" msgstr "Type" #: src/language/dictionary/sys-file-info.c:230 #, fuzzy #| msgid "Weight:" msgid "Weight" msgstr "Poids :" #: src/language/dictionary/sys-file-info.c:233 #, fuzzy #| msgid "Not weighted." msgid "Not weighted" msgstr "Non pondéré." #: src/language/dictionary/sys-file-info.c:235 #, fuzzy #| msgid "Compression:" msgid "Compression" msgstr "Compression :" #: src/language/dictionary/sys-file-info.c:245 #: src/language/dictionary/sys-file-info.c:424 #: src/language/dictionary/sys-file-info.c:426 #, fuzzy #| msgid "Comments:" msgid "Documents" msgstr "Commentaires :" #: src/language/dictionary/sys-file-info.c:305 #: src/language/dictionary/sys-file-info.c:430 msgid "(none)" msgstr "" #: src/language/dictionary/sys-file-info.c:393 msgid "No variables to display." msgstr "Aucune variable à afficher." #: src/language/dictionary/sys-file-info.c:404 msgid "Macros not supported." msgstr "Les macros ne sont pas possibles." #: src/language/dictionary/sys-file-info.c:426 #, fuzzy #| msgid "Document Line %zu" msgid "Document" msgstr "Ligne actuelle %zu" #: src/language/dictionary/sys-file-info.c:454 msgid "Position" msgstr "Position" #: src/language/dictionary/sys-file-info.c:456 msgid "Measurement Level" msgstr "" #: src/language/dictionary/sys-file-info.c:457 #: src/ui/gui/psppire-var-sheet-header.c:85 msgid "Role" msgstr "Rôle" #: src/language/dictionary/sys-file-info.c:458 #: src/ui/gui/psppire-var-sheet-header.c:61 src/ui/gui/compute.ui:215 msgid "Width" msgstr "Largeur" #: src/language/dictionary/sys-file-info.c:459 #, fuzzy #| msgid "Align" msgid "Alignment" msgstr "Alignement" #: src/language/dictionary/sys-file-info.c:460 #: src/language/dictionary/sys-file-info.c:734 msgid "Print Format" msgstr "Format d’impression" #: src/language/dictionary/sys-file-info.c:461 #, fuzzy #| msgid "Print Format" msgid "Write Format" msgstr "Format d’impression" #: src/language/dictionary/sys-file-info.c:462 #: src/ui/gui/missing-val-dialog.c:379 src/ui/gui/psppire-var-sheet-header.c:73 #: src/ui/gui/examine.ui:416 src/ui/gui/t-test.ui:105 msgid "Missing Values" msgstr "Valeurs manquantes" #: src/language/dictionary/sys-file-info.c:567 #: src/ui/gui/psppire-var-sheet-header.c:70 src/ui/gui/val-labs-dialog.c:489 #: src/ui/gui/val-labs-dialog.ui:194 msgid "Value Labels" msgstr "Étiquettes de valeur" #: src/language/dictionary/sys-file-info.c:573 #, fuzzy #| msgid "Variable View" msgid "Variable Value" msgstr "Affichage des variables" #: src/language/dictionary/sys-file-info.c:577 #, fuzzy #| msgid "Last non-missing value" msgid "User-missing value" msgstr "Dernière valeur non manquante" #: src/language/dictionary/sys-file-info.c:693 #, fuzzy #| msgid "Variable under test" msgid "Variable and Dataset Attributes" msgstr "Variable testée" #: src/language/dictionary/sys-file-info.c:699 #, fuzzy #| msgid "Variable Name: " msgid "Variable and Name" msgstr "Nom de variable :" #: src/language/dictionary/sys-file-info.c:702 #, fuzzy #| msgid "dataset" msgid "(dataset)" msgstr "jeu de données" #: src/language/dictionary/sys-file-info.c:722 msgid "No vectors defined." msgstr "Aucun vecteur défini." #: src/language/dictionary/sys-file-info.c:732 #, fuzzy #| msgid "Vector" msgid "Vectors" msgstr "Vecteur" #: src/language/dictionary/sys-file-info.c:736 msgid "Vector and Position" msgstr "" #: src/language/dictionary/sys-file-info.c:998 msgid "No valid encodings found." msgstr "Aucune donnée d’encodage valide. " #: src/language/dictionary/sys-file-info.c:1004 #, c-format msgid "Usable encodings for %s." msgstr "Encodages utilisables pour %s." #: src/language/dictionary/sys-file-info.c:1007 #, c-format msgid "" "Encodings that can successfully read %s (by specifying the encoding name on " "the GET command's ENCODING subcommand). Encodings that yield identical text " "are listed together." msgstr "" "Encodages pouvant lire avec succès %s (en spécifiant l’encodage dans la " "commande GET avec la sous-commande ENCODING). Les encodages qui produisent " "un texte identique sont répertoriés ensemble." #: src/language/dictionary/sys-file-info.c:1012 #: src/language/dictionary/sys-file-info.c:1013 msgid "Encodings" msgstr "Encodages" #: src/language/dictionary/sys-file-info.c:1042 #, fuzzy, c-format #| msgid "%s encoded text strings." msgid "%s Encoded Text Strings" msgstr "%s chaînes de caractères encodées." #: src/language/dictionary/sys-file-info.c:1046 msgid "" "Text strings in the file dictionary that the previously listed encodings " "interpret differently, along with the interpretations." msgstr "les chaîres de caractènes du fichiers dictionnaire différent." #: src/language/dictionary/sys-file-info.c:1049 src/output/text-item.c:57 #: src/ui/gui/psppire-import-assistant.c:885 msgid "Text" msgstr "Texte" #: src/language/dictionary/sys-file-info.c:1059 msgid "Purpose" msgstr "Objectif" #: src/language/dictionary/value-labels.c:154 #, c-format msgid "Truncating value label to %d bytes." msgstr "Raccourcissement de l’étiquette de valeur à %d caractères." #: src/language/dictionary/vector.c:66 #, c-format msgid "A vector named %s already exists." msgstr "Un vecteur nommé %s existe déjà." #: src/language/dictionary/vector.c:74 #, c-format msgid "Vector name %s is given twice." msgstr "Le vecteur nommé %s est utilisé deux fois." #: src/language/dictionary/vector.c:98 msgid "A slash must separate each vector specification in VECTOR's long form." msgstr "" "Un caractère de division (/) sépare chaque spécification de vecteur dans la " "form longue de VECTOR." #: src/language/dictionary/vector.c:131 msgid "Vectors must have at least one element." msgstr "Les vecteurs doivent posséder au moins un élément." #: src/language/dictionary/vector.c:151 msgid "expecting vector length" msgstr "en attente de la longueur du vecteur" #: src/language/dictionary/vector.c:170 #, c-format msgid "%s is an existing variable name." msgstr "%s est un nom de variable existant" #: src/language/dictionary/variable-display.c:121 msgid "Variable display width must be a positive integer." msgstr "" "La largeur d’affichage de la variable doit être un nombre entier positif." #: src/language/dictionary/weight.c:49 msgid "The weighting variable must be numeric." msgstr "La variable pondérée doit être numérique." #: src/language/dictionary/weight.c:54 msgid "The weighting variable may not be scratch." msgstr "La variable pondérée ne doit pas être zéro." #: src/language/tests/moments-test.c:50 msgid "expecting weight value" msgstr "valeur pondérée attendue" #: src/language/utilities/cd.c:45 src/language/utilities/include.c:173 #, fuzzy, c-format #| msgid "Cannot change directory to %s: %s " msgid "Cannot change directory to %s: %s" msgstr "Impossible de changer le répertoire de %s: %s " #: src/language/utilities/date.c:33 #, c-format msgid "Only %s is currently implemented." msgstr "Seule %s est actuellement implémentée." #: src/language/utilities/host.c:60 #, fuzzy #| msgid "Command shell not supported on this platform." msgid "Time limit not supported on this platform." msgstr "Interface en ligne de commande non disponible sur cette plateforme." #: src/language/utilities/host.c:74 #, c-format msgid "%s: Command exited with status %d." msgstr "" #: src/language/utilities/host.c:95 #, fuzzy, c-format #| msgid "failed to create temporary file" msgid "Failed to create temporary file (%s)." msgstr "impossible de créer un fichier temporaire" #: src/language/utilities/host.c:102 #, c-format msgid "/dev/null: Failed to open (%s)." msgstr "" #: src/language/utilities/host.c:117 #, c-format msgid "Couldn't fork: %s." msgstr "Impossible de séparer : %s." #: src/language/utilities/host.c:193 #, c-format msgid "While running \"%s\", waiting for child process failed (%s)." msgstr "" #: src/language/utilities/host.c:203 #, c-format msgid "Command \"%s\" timed out." msgstr "" #: src/language/utilities/host.c:205 #, c-format msgid "Command \"%s\" terminated by signal %d." msgstr "" #: src/language/utilities/host.c:212 msgid "Command or shell not found" msgstr "" #: src/language/utilities/host.c:214 msgid "Could not invoke command or shell" msgstr "" #: src/language/utilities/host.c:217 #, c-format msgid "Command \"%s\" exited with status %d (%s)." msgstr "" #: src/language/utilities/host.c:220 #, c-format msgid "Command \"%s\" exited with status %d." msgstr "" #: src/language/utilities/host.c:230 #, c-format msgid "Command \"%s\" output could not be read (%s)." msgstr "" # ??? #: src/language/utilities/title.c:88 #, c-format msgid " (Entered %s)" msgstr " (Saisie %s)" #: src/language/utilities/include.c:73 #, c-format msgid "Can't find `%s' in include file search path." msgstr "" "Impossible de trouver « %s » dans le chemin de recherche de fichier à " "inclure." #: src/language/utilities/output.c:128 #, fuzzy, c-format #| msgid "Unknown command `%s'." msgid "Unknown cell class %s." msgstr "Commande inconnue « %s »." # ??? stat #: src/language/utilities/permissions.c:113 #, c-format msgid "Cannot stat %s: %s" msgstr "Opération stat %s impossible : %s" #: src/language/utilities/permissions.c:127 #, c-format msgid "Cannot change mode of %s: %s" msgstr "Impossible de modifier le mode de %s : %s" #: src/language/stats/aggregate.c:96 msgid "Sum of values" msgstr "Somme des valeurs" # ??? #: src/language/stats/aggregate.c:97 msgid "Mean average" msgstr "Moyenne des moyennes" #: src/language/stats/aggregate.c:98 msgid "Median average" msgstr "Moyenne des médianes" #: src/language/stats/aggregate.c:99 #: src/ui/gui/psppire-dialog-action-descriptives.c:40 #: src/ui/gui/psppire-dialog-action-frequencies.c:41 msgid "Standard deviation" msgstr "Écart-type" #: src/language/stats/aggregate.c:100 #: src/ui/gui/psppire-dialog-action-descriptives.c:42 msgid "Maximum value" msgstr "Valeur maximale" #: src/language/stats/aggregate.c:101 #: src/ui/gui/psppire-dialog-action-descriptives.c:41 msgid "Minimum value" msgstr "Valeur minimale" #: src/language/stats/aggregate.c:102 msgid "Percentage greater than" msgstr "Pourcentage supérieur à " #: src/language/stats/aggregate.c:103 msgid "Percentage less than" msgstr "Pourcentage inférieur à" #: src/language/stats/aggregate.c:104 msgid "Percentage included in range" msgstr "Pourcentage compris dans l’intervalle " #: src/language/stats/aggregate.c:105 msgid "Percentage excluded from range" msgstr "Pourcentage exclu de l’intervalle " #: src/language/stats/aggregate.c:106 msgid "Fraction greater than" msgstr "Fraction supérieure à " #: src/language/stats/aggregate.c:107 msgid "Fraction less than" msgstr "Fraction inférieure à " #: src/language/stats/aggregate.c:108 msgid "Fraction included in range" msgstr "Fraction comprise dans l’intervalle" #: src/language/stats/aggregate.c:109 msgid "Fraction excluded from range" msgstr "Fraction non comprise dans l’intervalle" #: src/language/stats/aggregate.c:110 msgid "Number of cases" msgstr "Nombre d’observations" #: src/language/stats/aggregate.c:111 msgid "Number of cases (unweighted)" msgstr "Nombre d’observations (non pondéré)" #: src/language/stats/aggregate.c:112 msgid "Number of missing values" msgstr "Nombre de valeurs manquantes" #: src/language/stats/aggregate.c:113 msgid "Number of missing values (unweighted)" msgstr "Nombre de valeurs manquantes (non pondéré)" #: src/language/stats/aggregate.c:114 msgid "First non-missing value" msgstr "Premier valeur non manquante" #: src/language/stats/aggregate.c:115 msgid "Last non-missing value" msgstr "Dernière valeur non manquante" #: src/language/stats/aggregate.c:258 msgid "" "When PRESORTED is specified, specifying sorting directions with (A) or (D) " "has no effect. Output data will be sorted the same way as the input data." msgstr "" "Lorsque l’option PRESORTED est spécifiée, l’indication de l’ordre de tri " "avec (A) ou (D) n’a pas d’effet. Les données en sortie seront triées dans le " "même ordre que les données d’entrée." #: src/language/stats/aggregate.c:448 msgid "expecting aggregation function" msgstr "en attente de la fonction d’agrégation" #: src/language/stats/aggregate.c:460 #, c-format msgid "Unknown aggregation function %s." msgstr "Fonction d’agrégation inconnue %s." #: src/language/stats/aggregate.c:513 #, c-format msgid "Missing argument %zu to %s." msgstr "Argument manquant %zu pour %s." #: src/language/stats/aggregate.c:522 #, c-format msgid "Arguments to %s must be of same type as source variables." msgstr "" "Les arguments de %s doivent être du même type que les variables source." #: src/language/stats/aggregate.c:541 #, c-format msgid "" "Number of source variables (%zu) does not match number of target variables " "(%zu)." msgstr "" "Le nombre des variables source (%zu) ne correspond pas au nombre de " "variables cible (%zu)." #: src/language/stats/aggregate.c:557 #, c-format msgid "" "The value arguments passed to the %s function are out-of-order. They will " "be treated as if they had been specified in the correct order." msgstr "" "Les arguments de valeur passés à la fonction %s sont en désordre. Ils seront " "traités comme s’ils avaient été spécifiés dans le bon ordre." # ??? break #: src/language/stats/aggregate.c:631 #, c-format msgid "" "Variable name %s is not unique within the aggregate file dictionary, which " "contains the aggregate variables and the break variables." msgstr "" "Le nom de variable %s n’est pas unique au sein du dictionnaire de fichier " "agrégé, qui contient les variables agrégées et les variables endommagées." #: src/language/stats/autorecode.c:152 #, c-format msgid "Source variable count (%zu) does not match target variable count (%zu)." msgstr "" "Le comptage de la variable source (%zu) ne correspond pas au comptage de la " "variable cible (%zu)." #: src/language/stats/autorecode.c:164 #, c-format msgid "Target variable %s duplicates existing variable %s." msgstr "La variable de la cible %s dupliques une variable existante %s." #: src/language/stats/autorecode.c:221 #, c-format msgid "" "With GROUP, variables may not mix string variables (such as %s) and numeric " "variables (such as %s)." msgstr "" #: src/language/stats/autorecode.c:363 #, fuzzy #| msgid "Recode into Same Variables" msgid "Recoding grouped variables." msgstr "Recode en une même variable" #: src/language/stats/autorecode.c:365 #, fuzzy, c-format #| msgid "Replacing %s by %s: %s." msgid "Recoding %s into %s (%s)." msgstr "Remplacement %s par %s: %s." #: src/language/stats/autorecode.c:369 #, fuzzy, c-format #| msgid "Removing %s: %s." msgid "Recoding %s into %s." msgstr "Suppression %s:%s." #: src/language/stats/autorecode.c:376 src/ui/gui/recode.ui:209 msgid "New Value" msgstr "Nouvelle valeur" #: src/language/stats/autorecode.c:376 msgid "Value Label" msgstr "Étiquette de valeur" #: src/language/stats/autorecode.c:379 #, fuzzy #| msgid "Value" msgid "Old Value" msgstr "Valeur" #: src/language/stats/binomial.c:138 #, c-format msgid "Variable %s is not dichotomous" msgstr "La variable %s n’est pas dichotomique." #: src/language/stats/binomial.c:182 src/ui/gui/binomial.ui:30 msgid "Binomial Test" msgstr "Test binomial" #: src/language/stats/binomial.c:186 src/language/stats/chisquare.c:183 #: src/language/stats/chisquare.c:239 src/language/stats/chisquare.c:322 #: src/language/stats/cochran.c:188 src/language/stats/correlations.c:94 #: src/language/stats/correlations.c:145 src/language/stats/descriptives.c:991 #: src/language/stats/examine.c:602 src/language/stats/examine.c:742 #: src/language/stats/examine.c:836 src/language/stats/examine.c:925 #: src/language/stats/factor.c:1755 src/language/stats/factor.c:1878 #: src/language/stats/factor.c:1908 src/language/stats/factor.c:2068 #: src/language/stats/factor.c:2102 src/language/stats/frequencies.c:302 #: src/language/stats/frequencies.c:1579 src/language/stats/frequencies.c:1586 #: src/language/stats/friedman.c:250 src/language/stats/glm.c:729 #: src/language/stats/kruskal-wallis.c:249 #: src/language/stats/kruskal-wallis.c:297 #: src/language/stats/ks-one-sample.c:278 src/language/stats/logistic.c:1170 #: src/language/stats/logistic.c:1300 src/language/stats/logistic.c:1330 #: src/language/stats/jonckheere-terpstra.c:361 #: src/language/stats/mann-whitney.c:184 src/language/stats/mann-whitney.c:247 #: src/language/stats/means.c:757 src/language/stats/means.c:811 #: src/language/stats/mcnemar.c:222 src/language/stats/median.c:315 #: src/language/stats/median.c:350 src/language/stats/npar-summary.c:106 #: src/language/stats/oneway.c:973 src/language/stats/oneway.c:1051 #: src/language/stats/oneway.c:1150 src/language/stats/oneway.c:1238 #: src/language/stats/oneway.c:1373 src/language/stats/quick-cluster.c:746 #: src/language/stats/reliability.c:543 src/language/stats/reliability.c:584 #: src/language/stats/reliability.c:633 src/language/stats/reliability.c:644 #: src/language/stats/roc.c:969 src/language/stats/roc.c:1067 #: src/language/stats/regression.c:867 src/language/stats/regression.c:899 #: src/language/stats/regression.c:1023 src/language/stats/regression.c:1089 #: src/language/stats/runs.c:318 src/language/stats/sign.c:102 #: src/language/stats/t-test-indep.c:193 src/language/stats/t-test-indep.c:259 #: src/language/stats/t-test-one-sample.c:68 #: src/language/stats/t-test-one-sample.c:125 #: src/language/stats/t-test-paired.c:150 #: src/language/stats/t-test-paired.c:193 #: src/language/stats/t-test-paired.c:238 src/language/stats/wilcoxon.c:243 #: src/language/stats/wilcoxon.c:282 src/language/stats/crosstabs.q:925 #: src/language/stats/crosstabs.q:1253 src/language/stats/crosstabs.q:1293 #: src/language/stats/crosstabs.q:1302 src/language/stats/crosstabs.q:1331 #: src/language/stats/crosstabs.q:1373 src/language/stats/crosstabs.q:1418 #: src/ui/gui/crosstabs.ui:499 src/ui/gui/oneway.ui:615 msgid "Statistics" msgstr "Statistiques" #: src/language/stats/binomial.c:187 src/language/stats/chisquare.c:240 #: src/language/stats/chisquare.c:252 msgid "Category" msgstr "Catégorie" #: src/language/stats/binomial.c:188 src/language/stats/cochran.c:189 #: src/language/stats/correlations.c:97 src/language/stats/correlations.c:155 #: src/language/stats/descriptives.c:993 src/language/stats/examine.c:926 #: src/language/stats/frequencies.c:1588 src/language/stats/friedman.c:251 #: src/language/stats/kruskal-wallis.c:250 #: src/language/stats/ks-one-sample.c:279 src/language/stats/logistic.c:1331 #: src/language/stats/jonckheere-terpstra.c:369 #: src/language/stats/mann-whitney.c:185 src/language/stats/means.c:710 #: src/language/stats/means-calc.c:439 src/language/stats/mcnemar.c:223 #: src/language/stats/median.c:351 src/language/stats/npar-summary.c:107 #: src/language/stats/oneway.c:1052 src/language/stats/reliability.c:544 #: src/language/stats/sign.c:69 src/language/stats/sign.c:70 #: src/language/stats/t-test-indep.c:194 #: src/language/stats/t-test-one-sample.c:126 #: src/language/stats/t-test-paired.c:151 #: src/language/stats/t-test-paired.c:194 src/language/stats/wilcoxon.c:244 #: src/language/stats/crosstabs.q:926 msgid "N" msgstr "N" #: src/language/stats/binomial.c:189 msgid "Observed Prop." msgstr "Proportions observées." #: src/language/stats/binomial.c:190 msgid "Test Prop." msgstr "Proportion de test." #: src/language/stats/binomial.c:192 src/language/stats/mcnemar.c:224 #: src/language/stats/sign.c:103 src/language/stats/wilcoxon.c:288 #: src/language/stats/crosstabs.q:1306 msgid "Exact Sig. (2-tailed)" msgstr "Sig. exacte (bi-variée)" #: src/language/stats/binomial.c:193 src/language/stats/mcnemar.c:225 #: src/language/stats/sign.c:104 src/language/stats/wilcoxon.c:289 #: src/language/stats/crosstabs.q:1307 msgid "Exact Sig. (1-tailed)" msgstr "Sig. exacte (uni-variée)" #: src/language/stats/binomial.c:195 #, fuzzy #| msgid "Group1" msgid "Groups" msgstr "Groupe1" #: src/language/stats/binomial.c:196 #, fuzzy #| msgid "Group1" msgid "Group 1" msgstr "Groupe1" #: src/language/stats/binomial.c:196 #, fuzzy #| msgid "Group2" msgid "Group 2" msgstr "Groupe2" #: src/language/stats/binomial.c:196 src/language/stats/chisquare.c:223 #: src/language/stats/chisquare.c:257 src/language/stats/examine.c:930 #: src/language/stats/factor.c:1756 src/language/stats/frequencies.c:344 #: src/language/stats/glm.c:811 src/language/stats/kruskal-wallis.c:285 #: src/language/stats/logistic.c:1336 src/language/stats/mann-whitney.c:197 #: src/language/stats/means.c:706 src/language/stats/oneway.c:982 #: src/language/stats/oneway.c:1072 src/language/stats/reliability.c:549 #: src/language/stats/regression.c:1031 src/language/stats/sign.c:75 #: src/language/stats/wilcoxon.c:250 #: src/ui/gui/psppire-dialog-action-crosstabs.c:93 #: src/language/stats/crosstabs.q:931 src/language/stats/crosstabs.q:1218 msgid "Total" msgstr "Total" #: src/language/stats/chisquare.c:171 #, fuzzy, c-format #| msgid "" #| "CHISQUARE test specified %d expected values, but %d distinct values were " #| "encountered in variable %s." msgid "" "CHISQUARE test specified %d expected values, but variable %s has %zu " "distinct values." msgstr "" "Le test de CHISQUARE a spécifié %d valeurs attendues, mais %d valeurs " "distinctes figurent dans la variable %s." #: src/language/stats/chisquare.c:184 src/language/stats/chisquare.c:241 msgid "Observed N" msgstr "N observé" #: src/language/stats/chisquare.c:185 src/language/stats/chisquare.c:242 msgid "Expected N" msgstr "N attendu" #: src/language/stats/chisquare.c:186 src/language/stats/chisquare.c:243 #: src/language/stats/regression.c:1031 #: src/ui/gui/psppire-dialog-action-crosstabs.c:95 #: src/language/stats/crosstabs.q:1267 msgid "Residual" msgstr "Residus" #: src/language/stats/chisquare.c:235 src/language/stats/cochran.c:150 #: src/language/stats/median.c:305 src/language/stats/sign.c:66 #: src/ui/gui/frequencies.ui:676 msgid "Frequencies" msgstr "Fréquences" #: src/language/stats/chisquare.c:320 src/language/stats/cochran.c:181 #: src/language/stats/friedman.c:246 src/language/stats/kruskal-wallis.c:295 #: src/language/stats/mann-whitney.c:244 src/language/stats/mcnemar.c:219 #: src/language/stats/median.c:347 src/language/stats/sign.c:100 #: src/language/stats/wilcoxon.c:279 msgid "Test Statistics" msgstr "Tests statistiques" #: src/language/stats/chisquare.c:323 #, fuzzy #| msgid "Chi-Square" msgid "Chi-square" msgstr "Khi-Deux" #: src/language/stats/chisquare.c:324 src/language/stats/cochran.c:191 #: src/language/stats/examine.c:675 src/language/stats/factor.c:2107 #: src/language/stats/friedman.c:257 src/language/stats/glm.c:733 #: src/language/stats/kruskal-wallis.c:299 src/language/stats/logistic.c:1174 #: src/language/stats/median.c:354 src/language/stats/oneway.c:975 #: src/language/stats/oneway.c:1242 src/language/stats/regression.c:1025 #: src/language/stats/t-test-indep.c:267 #: src/language/stats/t-test-one-sample.c:75 #: src/language/stats/t-test-paired.c:253 src/language/stats/crosstabs.q:1304 msgid "df" msgstr "df" #: src/language/stats/chisquare.c:325 src/language/stats/cochran.c:192 #: src/language/stats/friedman.c:258 src/language/stats/kruskal-wallis.c:300 #: src/language/stats/median.c:355 msgid "Asymp. Sig." msgstr "Sig. asymptotique." #: src/language/stats/cochran.c:111 msgid "More than two values encountered. Cochran Q test will not be run." msgstr "" "Plus de deux valeurs utilisées. Le test de Cochran Q ne sera pas exécuté." #: src/language/stats/cochran.c:153 #, c-format msgid "Success (%.*g)" msgstr "Succès (%.*g)" #: src/language/stats/cochran.c:154 #, c-format msgid "Failure (%.*g)" msgstr "Erreur (%.*g)" #: src/language/stats/cochran.c:190 msgid "Cochran's Q" msgstr "Q de Cochran" #: src/language/stats/correlations.c:91 src/language/stats/descriptives.c:987 #: src/language/stats/factor.c:2065 src/language/stats/npar-summary.c:102 msgid "Descriptive Statistics" msgstr "Statistiques descriptives" #: src/language/stats/correlations.c:95 src/language/stats/descriptives.c:108 #: src/language/stats/examine.c:742 src/language/stats/factor.c:2069 #: src/language/stats/frequencies.c:141 src/language/stats/graph.c:211 #: src/language/stats/ks-one-sample.c:290 src/language/stats/means-calc.c:438 #: src/language/stats/npar-summary.c:108 src/language/stats/oneway.c:1052 #: src/language/stats/t-test-indep.c:195 #: src/language/stats/t-test-one-sample.c:127 #: src/language/stats/t-test-paired.c:152 #: src/language/stats/t-test-paired.c:241 #: src/ui/gui/psppire-dialog-action-descriptives.c:39 #: src/ui/gui/psppire-dialog-action-frequencies.c:40 msgid "Mean" msgstr "Moyenne" #: src/language/stats/correlations.c:96 src/language/stats/examine.c:751 #: src/language/stats/factor.c:2070 src/language/stats/ks-one-sample.c:290 #: src/language/stats/means-calc.c:440 src/language/stats/npar-summary.c:109 #: src/language/stats/oneway.c:1052 src/language/stats/t-test-indep.c:196 #: src/language/stats/t-test-one-sample.c:128 #: src/language/stats/t-test-paired.c:153 #: src/language/stats/t-test-paired.c:242 msgid "Std. Deviation" msgstr "Écart-type" #: src/language/stats/correlations.c:126 msgid "Correlations" msgstr "Corrélations" #: src/language/stats/correlations.c:146 msgid "Pearson Correlation" msgstr "Corrélation de Pearson" #: src/language/stats/correlations.c:147 src/language/stats/oneway.c:1243 #: src/language/stats/t-test-indep.c:268 #: src/language/stats/t-test-one-sample.c:76 #: src/language/stats/t-test-paired.c:254 msgid "Sig. (2-tailed)" msgstr "Sig. (bi-variée)" #: src/language/stats/correlations.c:147 src/language/stats/factor.c:1913 msgid "Sig. (1-tailed)" msgstr "Sig. (uni-variée)" #: src/language/stats/correlations.c:151 msgid "Cross-products" msgstr "Produits de croisement" #: src/language/stats/correlations.c:152 msgid "Covariance" msgstr "Covariance" #: src/language/stats/correlations.c:165 msgid "Significant at .05 level" msgstr "" #: src/language/stats/correlations.c:234 msgid "The data for the chosen variables are all missing or empty." msgstr "Les données des variables choisies sont toutes manquantes ou vides." #: src/language/stats/correlations.c:390 src/language/stats/descriptives.c:368 #: src/language/data-io/list.c:166 msgid "No variables specified." msgstr "Aucune variable spécifiée." #: src/language/stats/descriptives.c:109 src/language/stats/frequencies.c:142 #: src/language/stats/means-calc.c:445 src/language/stats/t-test-indep.c:197 #: src/language/stats/t-test-one-sample.c:129 #: src/language/stats/t-test-paired.c:154 #: src/language/stats/t-test-paired.c:243 msgid "S.E. Mean" msgstr "Erreur standard de la moyenne" #: src/language/stats/descriptives.c:110 src/language/stats/frequencies.c:145 msgid "Std Dev" msgstr "Écart-type" #: src/language/stats/descriptives.c:111 src/language/stats/examine.c:750 #: src/language/stats/frequencies.c:146 src/language/stats/means-calc.c:450 #: src/ui/gui/psppire-dialog-action-descriptives.c:46 #: src/ui/gui/psppire-dialog-action-frequencies.c:45 msgid "Variance" msgstr "Variance" #: src/language/stats/descriptives.c:112 src/language/stats/examine.c:752 #: src/language/stats/frequencies.c:147 src/language/stats/means-calc.c:451 #: src/ui/gui/psppire-dialog-action-descriptives.c:47 #: src/ui/gui/psppire-dialog-action-frequencies.c:50 msgid "Kurtosis" msgstr "Aplatissement" #: src/language/stats/descriptives.c:113 src/language/stats/frequencies.c:148 #: src/language/stats/means-calc.c:452 msgid "S.E. Kurt" msgstr "Erreur standard d’aplatissement" #: src/language/stats/descriptives.c:114 src/language/stats/examine.c:752 #: src/language/stats/frequencies.c:149 src/language/stats/means-calc.c:453 #: src/ui/gui/psppire-dialog-action-descriptives.c:48 #: src/ui/gui/psppire-dialog-action-frequencies.c:46 msgid "Skewness" msgstr "Asymétrie" #: src/language/stats/descriptives.c:115 src/language/stats/frequencies.c:150 #: src/language/stats/means-calc.c:454 msgid "S.E. Skew" msgstr "Erreur standard d’asymétrie" #: src/language/stats/descriptives.c:116 src/language/stats/examine.c:751 #: src/language/stats/frequencies.c:151 src/language/stats/means-calc.c:449 #: src/ui/gui/psppire-dialog-action-descriptives.c:43 #: src/ui/gui/psppire-dialog-action-frequencies.c:48 msgid "Range" msgstr "Intervalle" #: src/language/stats/descriptives.c:117 src/language/stats/examine.c:751 #: src/language/stats/frequencies.c:152 src/language/stats/graph.c:214 #: src/language/stats/ks-one-sample.c:285 src/language/stats/means-calc.c:447 #: src/language/stats/npar-summary.c:110 src/language/stats/oneway.c:1061 #: src/ui/gui/psppire-dialog-action-descriptives.c:41 #: src/ui/gui/psppire-dialog-action-frequencies.c:42 msgid "Minimum" msgstr "Minimum" #: src/language/stats/descriptives.c:118 src/language/stats/examine.c:751 #: src/language/stats/frequencies.c:153 src/language/stats/graph.c:213 #: src/language/stats/ks-one-sample.c:285 src/language/stats/means-calc.c:448 #: src/language/stats/npar-summary.c:110 src/language/stats/oneway.c:1061 #: src/ui/gui/psppire-dialog-action-descriptives.c:42 #: src/ui/gui/psppire-dialog-action-frequencies.c:43 msgid "Maximum" msgstr "Maximum" #: src/language/stats/descriptives.c:119 src/language/stats/frequencies.c:154 #: src/language/stats/graph.c:212 src/language/stats/means-calc.c:446 #: src/ui/gui/psppire-dialog-action-descriptives.c:44 #: src/ui/gui/psppire-dialog-action-frequencies.c:53 msgid "Sum" msgstr "Somme" #: src/language/stats/descriptives.c:350 #, c-format msgid "Z-score variable name %s would be a duplicate variable name." msgstr "Le nom %s de la variable score z serait un nom de variable dupliqué." #: src/language/stats/descriptives.c:401 msgid "" "DESCRIPTIVES with Z scores ignores TEMPORARY. Temporary transformations " "will be made permanent." msgstr "" "Les DESCRIPTIONS avec la marque Z ingnorent TEMPORAIRE. Les transformations " "temporaires deviendront permanentes." #: src/language/stats/descriptives.c:478 msgid "expecting statistic name: reverting to default" msgstr "Nom statistique attendu : retour à la valeur par défaut" #: src/language/stats/descriptives.c:561 msgid "" "Ran out of generic names for Z-score variables. There are only 126 generic " "names: ZSC001-ZSC0999, STDZ01-STDZ09, ZZZZ01-ZZZZ09, ZQZQ01-ZQZQ09." msgstr "" "Sortie de l’espace des noms génériques pour les variables e score z. Il " "n’existe que 126 noms génériques : ZSC001-ZSC0999, STDZ01-STDZ09, ZZZZ01-" "ZZZZ09, ZQZQ01-ZQZQ09." #: src/language/stats/descriptives.c:579 #, fuzzy #| msgid "Mapping of variables to corresponding Z-scores." msgid "Mapping of Variables to Z-scores" msgstr "Liste des variables correspondant aux Z-scores." #: src/language/stats/descriptives.c:581 #, fuzzy #| msgid "Name" msgid "Names" msgstr "Nom" #: src/language/stats/descriptives.c:582 src/language/stats/glm.c:739 #: src/language/stats/regression.c:1030 msgid "Source" msgstr "Source" #: src/language/stats/descriptives.c:582 msgid "Target" msgstr "Cible" #: src/language/stats/descriptives.c:659 #, fuzzy, c-format #| msgid "Internal error processing Z scores" msgid "Internal error processing Z scores. Please report this to %s." msgstr "Erreur interne lors du traitement des scores Z" #: src/language/stats/descriptives.c:759 #, c-format msgid "Z-score of %s" msgstr "Sore z de %s" #: src/language/stats/descriptives.c:1028 src/language/stats/roc.c:1029 msgid "Valid N (listwise)" msgstr "Nombre valide (de la liste)" #: src/language/stats/descriptives.c:1028 #, fuzzy #| msgid "Valid N (listwise)" msgid "Missing N (listwise)" msgstr "Nombre valide (de la liste)" #: src/language/stats/examine.c:75 msgid " (missing)" msgstr "(Manquant)" #: src/language/stats/examine.c:225 #, c-format msgid "Boxplot of %s vs. %s" msgstr "Boîte à moustaches de %s contre %s" #: src/language/stats/examine.c:231 src/language/stats/examine.c:338 #, c-format msgid "Boxplot of %s" msgstr "Boîte à moustaches de %s" #: src/language/stats/examine.c:321 msgid "Boxplot" msgstr "Boxplot" #: src/language/stats/examine.c:418 msgid "Not creating NP plot because data set is empty." msgstr "Impossible de créer le tracé NP car le jeu de données est vide." #: src/language/stats/examine.c:478 #, c-format msgid "Not creating spreadlevel chart for %s" msgstr "Pas de diagramme de répartition par niveau créé pour %s" #: src/language/stats/examine.c:585 #, fuzzy #| msgid "Last non-missing value" msgid "User-missing value." msgstr "Dernière valeur non manquante" #: src/language/stats/examine.c:591 src/language/stats/examine.c:595 #: src/language/stats/frequencies.c:1606 msgid "Percentiles" msgstr "Centiles" #: src/language/stats/examine.c:603 src/math/percentiles.c:37 msgid "Weighted Average" msgstr "Moyenne pondérée" #: src/language/stats/examine.c:603 msgid "Tukey's Hinges" msgstr "Hinges de Tukey" #: src/language/stats/examine.c:610 src/language/stats/examine.c:685 #: src/language/stats/examine.c:759 src/language/stats/examine.c:858 #: src/language/stats/examine.c:938 src/language/stats/mann-whitney.c:200 #: src/language/stats/median.c:319 src/language/stats/t-test-indep.c:227 #: src/language/stats/t-test-indep.c:282 #: src/language/stats/t-test-one-sample.c:87 #, fuzzy #| msgid "_Dependent Variable" msgid "Dependent Variables" msgstr "Variable _dépendante" #: src/language/stats/examine.c:669 #, fuzzy #| msgid "Dev from Normal" msgid "Tests of Normality" msgstr "Déviation d’une normale" #: src/language/stats/examine.c:673 msgid "Shapiro-Wilk" msgstr "" #: src/language/stats/examine.c:674 src/language/stats/examine.c:739 #: src/ui/gui/psppire-checkbox-treeview.c:73 msgid "Statistic" msgstr "Statistique" #: src/language/stats/examine.c:676 src/language/stats/factor.c:2108 #: src/language/stats/glm.c:736 src/language/stats/logistic.c:1175 #: src/language/stats/oneway.c:978 src/language/stats/oneway.c:1154 #: src/language/stats/oneway.c:1376 src/language/stats/regression.c:906 #: src/language/stats/regression.c:1028 src/language/stats/t-test-indep.c:263 #: src/language/stats/t-test-paired.c:196 msgid "Sig." msgstr "Sig." #: src/language/stats/examine.c:735 src/language/stats/oneway.c:1045 #: src/ui/gui/descriptives.ui:25 msgid "Descriptives" msgstr "Descriptives" #: src/language/stats/examine.c:738 msgid "Aspect" msgstr "" #: src/language/stats/examine.c:739 src/language/stats/oneway.c:1053 #: src/language/stats/oneway.c:1240 src/language/stats/oneway.c:1375 #: src/language/stats/roc.c:975 src/language/stats/regression.c:902 msgid "Std. Error" msgstr "Erreur standard" #: src/language/stats/examine.c:745 src/language/stats/oneway.c:1056 #, c-format msgid "%g%% Confidence Interval for Mean" msgstr "%g%% intervalle de confiance pour la moyenne" #: src/language/stats/examine.c:747 src/language/stats/oneway.c:1058 #: src/language/stats/oneway.c:1382 src/language/stats/roc.c:982 #: src/language/stats/regression.c:913 msgid "Lower Bound" msgstr "Limite inférieure" #: src/language/stats/examine.c:748 src/language/stats/oneway.c:1059 #: src/language/stats/oneway.c:1383 src/language/stats/roc.c:983 #: src/language/stats/regression.c:914 msgid "Upper Bound" msgstr "Limite supérieure" #: src/language/stats/examine.c:750 msgid "5% Trimmed Mean" msgstr "Moyenne tronquée de 5%" #: src/language/stats/examine.c:750 src/language/stats/frequencies.c:143 #: src/language/stats/means-calc.c:442 src/language/stats/median.c:352 #: src/ui/gui/psppire-dialog-action-frequencies.c:52 msgid "Median" msgstr "Médiane" #: src/language/stats/examine.c:752 msgid "Interquartile Range" msgstr "Intervalle interquartile" #: src/language/stats/examine.c:832 msgid "Extreme Values" msgstr "Valeurs extrêmes" #: src/language/stats/examine.c:840 src/language/stats/quick-cluster.c:664 #: src/language/data-io/list.c:110 msgid "Case Number" msgstr "Nombre d’observations" #: src/language/stats/examine.c:844 #, fuzzy #| msgid "Order by" msgid "Order" msgstr "Trier par" #. TRANSLATORS: This is a noun, not an adjective. #: src/language/stats/examine.c:850 #, fuzzy #| msgid "_Extremes" msgid "Extreme" msgstr "_Extrêmes" #: src/language/stats/examine.c:851 msgid "Highest" msgstr "Le plus élevé" #: src/language/stats/examine.c:851 msgid "Lowest" msgstr "Le plus bas" #: src/language/stats/examine.c:921 src/language/stats/logistic.c:1328 #: src/language/stats/means.c:694 src/language/stats/reliability.c:540 msgid "Case Processing Summary" msgstr "Sommaire d’exécution des observations" #: src/language/stats/examine.c:927 src/language/stats/frequencies.c:304 #: src/language/stats/frequencies.c:1494 src/language/stats/logistic.c:1332 #: src/language/stats/means.c:713 src/language/stats/reliability.c:545 #: src/language/stats/crosstabs.q:927 msgid "Percent" msgstr "%" #: src/language/stats/examine.c:929 src/language/stats/frequencies.c:321 #: src/language/stats/frequencies.c:1590 src/language/stats/quick-cluster.c:766 #: src/language/stats/reliability.c:548 src/language/stats/crosstabs.q:931 msgid "Valid" msgstr "Valide" #: src/language/stats/examine.c:929 src/language/stats/frequencies.c:336 #: src/language/stats/frequencies.c:1591 src/language/stats/crosstabs.q:931 msgid "Missing" msgstr "Manquant(e)" #: src/language/stats/examine.c:1550 #, c-format msgid "%s may not be negative. Using default value (%g)." msgstr "%s ne peut pas être négatif. Utiliser la valeur par défaut (%g)." #: src/language/stats/examine.c:1587 msgid "Percentiles must lie in the range (0, 100)" msgstr "Les pourcentages doivent se situer dans la plage (0, 100)" #: src/language/stats/examine.c:1777 #, c-format msgid "%s and %s are mutually exclusive" msgstr "%s et %s s’excluent mutuellement" #: src/language/stats/factor.c:1121 #, c-format msgid "Matrix input for %s must be either COV or CORR" msgstr "La matrice d’entrée de %s doit être COV ou CORR" #: src/language/stats/factor.c:1519 msgid "Factor analysis on a single variable is not useful." msgstr "L’analyse factorielle n’est pas utile sur une seule variable." #: src/language/stats/factor.c:1523 msgid "Factor analysis without variables is not possible." msgstr "L’analyse factorielle sans variable n’est pas possible." #: src/language/stats/factor.c:1634 msgid "Component Number" msgstr "Nombre d’élément" #: src/language/stats/factor.c:1634 msgid "Factor Number" msgstr "Nombre de facteurs" # ??? #: src/language/stats/factor.c:1648 src/language/stats/factor.c:1651 msgid "Communalities" msgstr "Points communs" #: src/language/stats/factor.c:1653 msgid "Initial" msgstr "Initial" #: src/language/stats/factor.c:1655 msgid "Extraction" msgstr "Extraction" #: src/language/stats/factor.c:1697 src/language/stats/factor.c:1777 #: src/language/stats/factor.c:1839 msgid "Component" msgstr "Elément" #: src/language/stats/factor.c:1697 src/language/stats/factor.c:1777 #: src/language/stats/factor.c:1839 msgid "Factor" msgstr "Facteur" #: src/language/stats/factor.c:1752 msgid "Total Variance Explained" msgstr "Total expliqué de la variance" #: src/language/stats/factor.c:1758 #, no-c-format msgid "% of Variance" msgstr "% de variance" #: src/language/stats/factor.c:1760 #, no-c-format msgid "Cumulative %" msgstr "% cumulé" #: src/language/stats/factor.c:1763 msgid "Phase" msgstr "" #: src/language/stats/factor.c:1765 msgid "Initial Eigenvalues" msgstr "Valeur initiale de Eigen" # ??? loadings #: src/language/stats/factor.c:1769 msgid "Extraction Sums of Squared Loadings" msgstr "Sommes des carrés chargés par extraction" #: src/language/stats/factor.c:1773 msgid "Rotation Sums of Squared Loadings" msgstr "Sommes des carrés chargés par rotation" #: src/language/stats/factor.c:1835 msgid "Factor Correlation Matrix" msgstr "Matrice de corrélation des facteurs" #: src/language/stats/factor.c:1842 #, fuzzy #| msgid "Factor" msgid "Factor 2" msgstr "Facteur" #: src/language/stats/factor.c:1874 msgid "Anti-Image Matrices" msgstr "Matrices anti-image" #: src/language/stats/factor.c:1879 msgid "Anti-image Covariance" msgstr "Covariance anti-image" #: src/language/stats/factor.c:1880 msgid "Anti-image Correlation" msgstr "Corrélations bivariées anti-image" #: src/language/stats/factor.c:1901 msgid "Correlation Matrix" msgstr "Matrice de corrélation" #: src/language/stats/factor.c:1910 src/language/stats/t-test-paired.c:195 msgid "Correlation" msgstr "Corrélation" #: src/language/stats/factor.c:1947 msgid "Determinant" msgstr "Déterminant" #: src/language/stats/factor.c:1958 msgid "Covariance Matrix" msgstr "Matrice de covariance" #: src/language/stats/factor.c:1990 msgid "" "The dataset contains no complete observations. No analysis will be performed." msgstr "" "L’ensemble de données ne contient pas d’observations complètes. Aucune " "analyse ne sera effectuée." #: src/language/stats/factor.c:2014 msgid "The dataset has no complete covariance or correlation matrix." msgstr "" "Le jeu de données n’a pas de covariance complète ou de matrice de " "corrélation." #: src/language/stats/factor.c:2071 msgid "Analysis N" msgstr "Analyse N" #: src/language/stats/factor.c:2099 msgid "KMO and Bartlett's Test" msgstr "Test KMO et Bartlett" #: src/language/stats/factor.c:2103 msgid "Kaiser-Meyer-Olkin Measure of Sampling Adequacy" msgstr "Mesure de Kaiser-Meyer-Olkin d’échantillonnage d’adéquation" #: src/language/stats/factor.c:2105 msgid "Bartlett's Test of Sphericity" msgstr "Test de Bartlett de sphéricité" #: src/language/stats/factor.c:2106 msgid "Approx. Chi-Square" msgstr "Khi-Deux approx." #: src/language/stats/factor.c:2154 #, c-format msgid "" "The %s criteria result in zero factors extracted. Therefore no analysis will " "be performed." msgstr "" "Le critère %s n’a pu extraire aucun facteur. Aucune analyse ne sera donc " "réalisée." #: src/language/stats/factor.c:2161 #, c-format msgid "" "The %s criteria result in more factors than variables, which is not " "meaningful. No analysis will be performed." msgstr "" "Le critère %s a pu extraire plus de facteurs que de variables, ce qui n’est " "pas pertinent. Aucune analyse ne sera donc réalisée." #: src/language/stats/factor.c:2254 msgid "Component Matrix" msgstr "Matrice de composantes avant rotation" #: src/language/stats/factor.c:2254 msgid "Factor Matrix" msgstr "Matrice factorielle" #: src/language/stats/factor.c:2259 msgid "Pattern Matrix" msgstr "Matrice de motif" #: src/language/stats/factor.c:2268 msgid "Structure Matrix" msgstr "Matrice de structure" #: src/language/stats/factor.c:2270 msgid "Rotated Component Matrix" msgstr "Matrice de composantes après rotation" #: src/language/stats/factor.c:2271 msgid "Rotated Factor Matrix" msgstr "Matrice factorielle après rotation" #: src/language/stats/flip.c:100 #, c-format msgid "%s ignores %s. Temporary transformations will be made permanent." msgstr "%s ignore %s. Les transformations temporaires deviendront permanentes." #: src/language/stats/flip.c:153 #, c-format msgid "Could not create temporary file for %s." msgstr "Impossible de créer un fichier temporaire pour %s." #: src/language/stats/flip.c:341 #, c-format msgid "Error rewinding %s file: %s." msgstr "Erreur de réécriture de %s dans le fichier : %s." #: src/language/stats/flip.c:348 #, c-format msgid "Error creating %s source file." msgstr "Erreur de création du fichier source %s." #: src/language/stats/flip.c:361 #, c-format msgid "Error reading %s file: %s." msgstr "Erreur de lecture %s du fichier : %s." #: src/language/stats/flip.c:363 #, c-format msgid "Unexpected end of file reading %s file." msgstr "Fin de fichier inattendue à la lecture du fichier %s." #: src/language/stats/flip.c:379 #, c-format msgid "Error seeking %s source file: %s." msgstr "Erreur lors de la recherche %s du fichier source : %s." #: src/language/stats/flip.c:387 #, c-format msgid "Error writing %s source file: %s." msgstr "Erreur d’écriture %s du fichier source : %s." #: src/language/stats/flip.c:402 #, c-format msgid "Error rewinding %s source file: %s." msgstr "Erreur de réécriture %s du fichier source : %s." #: src/language/stats/flip.c:433 #, c-format msgid "Error reading %s temporary file: %s." msgstr "Erreur de lecture %s du fichier temporaire : %s." #: src/language/stats/flip.c:436 #, c-format msgid "Unexpected end of file reading %s temporary file." msgstr "Fin inattendue lors de la lecture du fichier temporaire %s." #: src/language/stats/frequencies.c:144 #: src/ui/gui/psppire-dialog-action-frequencies.c:49 msgid "Mode" msgstr "Mode" #: src/language/stats/frequencies.c:303 src/language/stats/logistic.c:1381 #: src/output/charts/plot-hist-cairo.c:112 msgid "Frequency" msgstr "Fréquence" #: src/language/stats/frequencies.c:305 msgid "Valid Percent" msgstr "Pourcentage valide" #: src/language/stats/frequencies.c:306 src/language/stats/graph.c:208 msgid "Cumulative Percent" msgstr "Pourcentage cumulé" #: src/language/stats/frequencies.c:905 msgid "Histogram frequency must be greater than zero." msgstr "La fréquence de l’histogramme doit être supérieur à zéro." #: src/language/stats/frequencies.c:923 msgid "Histogram percentage must be greater than zero." msgstr "Le pourcentage de l’histogramme doit être supérieur à zéro." #: src/language/stats/frequencies.c:1139 #, c-format msgid "" "%s for histogram must be greater than or equal to %s, but %s was specified " "as %.15g and %s as %.15g. %s and %s will be ignored." msgstr "" "%s de l’histogramme doit être plus grand ou égal à %s, mais %s était " "spécifié comme %.15g et %s comme %.15g. %s et %s seront ignorés." #: src/language/stats/frequencies.c:1184 #, c-format msgid "" "%s for pie chart must be greater than or equal to %s, but %s was specified " "as %.15g and %s as %.15g. %s and %s will be ignored." msgstr "" "%s pour le camembert doit être plus grand ou égal à %s, mais %s était " "spécifié comme %.15g et %s comme %.15g. %s et %s seront ignorés." #: src/language/stats/frequencies.c:1474 #, c-format msgid "Omitting pie chart for %s, which has only %d unique values." msgstr "" "Suppression du camembert pour %s, qui ne dispose que de %d valeurs uniques." #: src/language/stats/frequencies.c:1477 #, c-format msgid "Omitting pie chart for %s, which has over 50 unique values." msgstr "Suppression des camemberts pour %s, qui dépasse 50 valeurs uniques." #: src/language/stats/frequencies.c:1494 src/language/stats/graph.c:205 #: src/language/stats/quick-cluster.c:747 #: src/ui/gui/psppire-dialog-action-crosstabs.c:90 #: src/language/stats/crosstabs.q:789 src/language/stats/crosstabs.q:1262 msgid "Count" msgstr "Nombre" #: src/language/stats/friedman.c:220 src/language/stats/kruskal-wallis.c:247 #: src/language/stats/mann-whitney.c:182 src/language/stats/wilcoxon.c:240 msgid "Ranks" msgstr "Rangs" #: src/language/stats/friedman.c:222 src/language/stats/friedman.c:223 #: src/language/stats/kruskal-wallis.c:251 #: src/language/stats/mann-whitney.c:186 src/language/stats/wilcoxon.c:245 msgid "Mean Rank" msgstr "Rang moyen" #: src/language/stats/friedman.c:253 msgid "Kendall's W" msgstr "W de Kendall" #: src/language/stats/friedman.c:256 src/language/stats/kruskal-wallis.c:298 #: src/language/stats/median.c:353 msgid "Chi-Square" msgstr "Khi-Deux" #: src/language/stats/glm.c:169 msgid "Multivariate analysis is not yet implemented" msgstr "L’analyse multivariée n’est pas encore mise en œuvre" #: src/language/stats/glm.c:274 msgid "Only types 1, 2 & 3 sums of squares are currently implemented" msgstr "" "Seuls les types 1, 2 et 3 des sommes des carrés sont actuellement installés" #: src/language/stats/glm.c:727 msgid "Tests of Between-Subjects Effects" msgstr "Tests d’effets entre sujets" #: src/language/stats/glm.c:730 #, fuzzy #| msgid "Type %s Sum of Squares" msgid "Type I Sum Of Squares" msgstr "Type %s de somme des carrés" #: src/language/stats/glm.c:731 #, fuzzy #| msgid "Type %s Sum of Squares" msgid "Type II Sum Of Squares" msgstr "Type %s de somme des carrés" #: src/language/stats/glm.c:732 #, fuzzy #| msgid "Type %s Sum of Squares" msgid "Type III Sum Of Squares" msgstr "Type %s de somme des carrés" #: src/language/stats/glm.c:734 src/language/stats/oneway.c:976 #: src/language/stats/regression.c:1026 msgid "Mean Square" msgstr "Carré des moyennes" #: src/language/stats/glm.c:735 src/language/stats/oneway.c:977 #: src/language/stats/regression.c:1027 src/language/stats/t-test-indep.c:262 msgid "F" msgstr "F" #: src/language/stats/glm.c:740 msgid "Corrected Model" msgstr "Modèle corrigé" #: src/language/stats/glm.c:740 msgid "Model" msgstr "Modèle" #: src/language/stats/glm.c:752 msgid "Intercept" msgstr "Interaction" #: src/language/stats/glm.c:802 src/output/pivot-table.c:763 #: src/output/spv/spv.c:867 msgid "Error" msgstr "Erreur" #: src/language/stats/glm.c:819 msgid "Corrected Total" msgstr "Total corrigé" #: src/language/stats/graph.c:206 msgid "Percentage" msgstr "Pourcentage" #: src/language/stats/graph.c:207 msgid "Cumulative Count" msgstr "Cumul" #: src/language/stats/graph.c:296 #, c-format msgid "%s vs. %s by %s" msgstr "%s contre %s par %s" #: src/language/stats/graph.c:303 #, c-format msgid "%s vs. %s" msgstr "%s contre %s" #: src/language/stats/graph.c:322 msgid "" "Maximum number of scatterplot categories reached. Your BY variable has too " "many distinct values. The coloring of the plot will not be correct." msgstr "" "Nombre maximal de catégories de diagrammes de dispersion atteints. Votre " "variable BY a trop de valeurs distinctes. La coloration du diagramme sera " "incorrecte." #: src/language/stats/graph.c:551 src/language/stats/rank.c:636 #, c-format msgid "%s of %s" msgstr "%s de %s" #: src/language/stats/graph.c:698 src/language/stats/graph.c:729 #: src/language/stats/graph.c:777 msgid "Only one chart type is allowed." msgstr "seul un type de diagramme est autorisé." #: src/language/stats/graph.c:721 src/language/stats/graph.c:820 #: src/language/stats/graph.c:834 msgid "Only one variable is allowed." msgstr "Une seule variable est permise." #: src/language/stats/graph.c:843 msgid "Variable expected" msgstr "Variable attendue" #: src/language/stats/graph.c:883 msgid "FOOTNOTE is not implemented yet for GRAPH" msgstr "FOOTNOTE n’est pas encore imlémentée pour GRAPH" #: src/language/stats/ks-one-sample.c:274 src/ui/gui/ks-one-sample.ui:24 msgid "One-Sample Kolmogorov-Smirnov Test" msgstr "Test de Kolmogorov-Smirnov à 1 facteur" #: src/language/stats/ks-one-sample.c:284 msgid "Uniform Parameters" msgstr "Paramètres uniformes" #: src/language/stats/ks-one-sample.c:289 msgid "Normal Parameters" msgstr "Paramètres normaux" #: src/language/stats/ks-one-sample.c:294 msgid "Poisson Parameters" msgstr "Paramètres de Poisson" #: src/language/stats/ks-one-sample.c:295 #: src/ui/gui/psppire-dialog-action-crosstabs.c:76 #: src/language/stats/crosstabs.q:1421 msgid "Lambda" msgstr "Lambda" #: src/language/stats/ks-one-sample.c:300 msgid "Exponential Parameters" msgstr "Paramètres exponentiels" #: src/language/stats/ks-one-sample.c:308 msgid "Most Extreme Differences" msgstr "Différences des extrêmes" #: src/language/stats/ks-one-sample.c:309 msgid "Absolute" msgstr "absolue" #: src/language/stats/ks-one-sample.c:309 src/language/stats/roc.c:1037 msgid "Positive" msgstr "Positive" #: src/language/stats/ks-one-sample.c:309 src/language/stats/roc.c:1037 msgid "Negative" msgstr "Négative" #: src/language/stats/ks-one-sample.c:312 msgid "Kolmogorov-Smirnov Z" msgstr "Z de Kolmogorov-Smirnov" #: src/language/stats/ks-one-sample.c:313 #: src/language/stats/jonckheere-terpstra.c:374 #: src/language/stats/mann-whitney.c:251 src/language/stats/runs.c:328 #: src/language/stats/wilcoxon.c:284 msgid "Asymp. Sig. (2-tailed)" msgstr "Sig. asymptotique (bi-variée)" #: src/language/stats/logistic.c:327 msgid "All predicted values are either 1 or 0" msgstr "Toutes les valeurs prévues sont soit 1 ou 0" #: src/language/stats/logistic.c:525 msgid "Dependent variable's values are not dichotomous." msgstr "Les variables dépendantes ne sont pas dichotomiques." #: src/language/stats/logistic.c:614 #, c-format msgid "" "Category %s does not have at least two distinct values. Logistic regression " "will not be run." msgstr "" "La catégorie %s n’a pas au moins deux valeurs distinctes. La régression " "logistique ne peut pas être effectuée." #: src/language/stats/logistic.c:674 #, c-format msgid "" "Estimation terminated at iteration number %d because parameter estimates " "changed by less than %g" msgstr "" "Estimation terminée en %d itérations (estimations des paramètres ont changé " "de moins de %g)" #: src/language/stats/logistic.c:686 #, c-format msgid "" "Estimation terminated at iteration number %d because Log Likelihood " "decreased by less than %g%%" msgstr "" "Estimation terminée en %d itérations (Probabilité logarithmique a diminué de " "moins de %g%%)" #: src/language/stats/logistic.c:701 #, c-format msgid "" "Estimation terminated at iteration number %d because maximum iterations has " "been reached" msgstr "" "Estimation terminée en %d itérations (nombre d’itérations maximum atteint)" #: src/language/stats/logistic.c:994 msgid "Cut point value must be in the range [0,1]" msgstr "La valeur du point de coupure doit être comprise en être 0 et 1" #: src/language/stats/logistic.c:1139 msgid "Dependent Variable Encoding" msgstr "Encodade de variable dépendante" #: src/language/stats/logistic.c:1141 msgid "Mapping" msgstr "" #: src/language/stats/logistic.c:1142 msgid "Internal Value" msgstr "Valeur interne" #: src/language/stats/logistic.c:1145 msgid "Original Value" msgstr "Valeur initiale" #: src/language/stats/logistic.c:1167 msgid "Variables in the Equation" msgstr "Information de l’équation" #: src/language/stats/logistic.c:1171 src/language/stats/regression.c:902 msgid "B" msgstr "B" #: src/language/stats/logistic.c:1172 msgid "S.E." msgstr "S.E." #: src/language/stats/logistic.c:1173 msgid "Wald" msgstr "Wald" #: src/language/stats/logistic.c:1176 msgid "Exp(B)" msgstr "Exp(B)" #: src/language/stats/logistic.c:1181 #, c-format msgid "%d%% CI for Exp(B)" msgstr "%d%% CI pour Exp(B)" #: src/language/stats/logistic.c:1183 src/language/stats/t-test-indep.c:274 #: src/language/stats/t-test-one-sample.c:83 #: src/language/stats/t-test-paired.c:249 src/language/stats/crosstabs.q:1369 msgid "Lower" msgstr "Minimum" #: src/language/stats/logistic.c:1183 src/language/stats/t-test-indep.c:275 #: src/language/stats/t-test-one-sample.c:84 #: src/language/stats/t-test-paired.c:250 src/language/stats/crosstabs.q:1370 msgid "Upper" msgstr "Maximum" #: src/language/stats/logistic.c:1189 src/language/stats/logistic.c:1470 msgid "Step 1" msgstr "Etape 1" #: src/language/stats/logistic.c:1263 msgid "Constant" msgstr "Constante" #: src/language/stats/logistic.c:1298 msgid "Model Summary" msgstr "Sommaire du modèle" #: src/language/stats/logistic.c:1301 msgid "-2 Log likelihood" msgstr "-2 Log probable" #: src/language/stats/logistic.c:1302 msgid "Cox & Snell R Square" msgstr "Coefficient of determination de Cox & Snell" #: src/language/stats/logistic.c:1303 msgid "Nagelkerke R Square" msgstr "Coefficient of determination de Nagelkerke" #: src/language/stats/logistic.c:1306 src/language/stats/logistic.c:1470 #, fuzzy #| msgid "Step 1" msgid "Step" msgstr "Etape 1" #: src/language/stats/logistic.c:1335 msgid "Unweighted Cases" msgstr "Cas non pondérés" #: src/language/stats/logistic.c:1336 msgid "Included in Analysis" msgstr "Inclure dans l’analyse" #: src/language/stats/logistic.c:1336 msgid "Missing Cases" msgstr "Cas manquants" #: src/language/stats/logistic.c:1365 msgid "Categorical Variables' Codings" msgstr "Codages des variables catégorielles" #: src/language/stats/logistic.c:1380 #, fuzzy #| msgid "Encodings" msgid "Codings" msgstr "Encodages" #: src/language/stats/logistic.c:1383 msgid "Parameter coding" msgstr "Codage des paramètres" #: src/language/stats/logistic.c:1462 msgid "Classification Table" msgstr "Table de classification" #: src/language/stats/logistic.c:1466 msgid "Predicted" msgstr "Prévu" #: src/language/stats/logistic.c:1466 #, fuzzy #| msgid "" #| "Percentage\n" #| "Correct" msgid "Percentage Correct" msgstr "" "Percentage\n" "Correct" #: src/language/stats/logistic.c:1468 msgid "Observed" msgstr "Observé" #: src/language/stats/logistic.c:1468 msgid "Overall Percentage" msgstr "Pourcentage global" #: src/language/stats/jonckheere-terpstra.c:357 msgid "Jonckheere-Terpstra Test" msgstr "Test de Jonckheere-Terpstra" #: src/language/stats/jonckheere-terpstra.c:364 #, c-format msgid "Number of levels in %s" msgstr "Nombre de niveaux dans %s" #: src/language/stats/jonckheere-terpstra.c:370 msgid "Observed J-T Statistic" msgstr "Statistique J-T observée" #: src/language/stats/jonckheere-terpstra.c:371 msgid "Mean J-T Statistic" msgstr "signification de la statistique J-T" #: src/language/stats/jonckheere-terpstra.c:372 msgid "Std. Deviation of J-T Statistic" msgstr "Écart-type standard de la statistique J-T" #: src/language/stats/jonckheere-terpstra.c:373 msgid "Std. J-T Statistic" msgstr "statistiques J-T standard" #: src/language/stats/mann-whitney.c:187 src/language/stats/wilcoxon.c:246 msgid "Sum of Ranks" msgstr "Somme des rangs" #: src/language/stats/mann-whitney.c:248 msgid "Mann-Whitney U" msgstr "U de Mann-Whitney" #: src/language/stats/mann-whitney.c:249 msgid "Wilcoxon W" msgstr "W de Wilcoxon" #: src/language/stats/mann-whitney.c:250 src/language/stats/runs.c:327 #: src/language/stats/wilcoxon.c:283 msgid "Z" msgstr "Z" #: src/language/stats/means.c:702 msgid "Included" msgstr "Inclu(e)" #: src/language/stats/means.c:704 src/language/stats/reliability.c:548 msgid "Excluded" msgstr "Exclu(e)" #: src/language/stats/means.c:753 msgid "Report" msgstr "Rapport" #: src/language/stats/means.c:838 #, fuzzy, c-format #| msgid "" #| "Dependent variable %s has no non-missing values. No analysis for this " #| "variable will be done." msgid "" "The table \"%s\" has no non-empty control variables. No result for this " "table will be displayed." msgstr "" "La variable dépendante %s n’a aucune valeur non-manquante. Aucune analyse ne " "sera effectuée pour cette variable." #: src/language/stats/means-calc.c:443 msgid "Group Median" msgstr "Médiane de groupe" #: src/language/stats/means-calc.c:455 msgid "First" msgstr "Première observation" #: src/language/stats/means-calc.c:456 msgid "Last" msgstr "Dernière observation" #: src/language/stats/means-calc.c:458 msgid "Percent N" msgstr "% N" #: src/language/stats/means-calc.c:459 msgid "Percent Sum" msgstr "Somme des pourcentages" #: src/language/stats/means-calc.c:461 msgid "Harmonic Mean" msgstr "Moyenne harmonique" #: src/language/stats/means-calc.c:462 msgid "Geom. Mean" msgstr "Moyenne géométrique" #: src/language/stats/mcnemar.c:144 msgid "The McNemar test is appropriate only for dichotomous variables" msgstr "Le test de McNemar n’est adéquat que pour les variables dichotomiques." #: src/language/stats/mcnemar.c:226 src/language/stats/sign.c:105 msgid "Point Probability" msgstr "Point de probabilité" #: src/language/stats/mcnemar.c:229 src/language/stats/sign.c:78 #: src/language/stats/sign.c:108 src/language/stats/t-test-paired.c:199 #: src/language/stats/t-test-paired.c:257 src/language/stats/wilcoxon.c:253 #: src/language/stats/wilcoxon.c:292 #, fuzzy #| msgid "Pair %d" msgid "Pairs" msgstr "Paire %d" #: src/language/stats/median.c:316 msgid "> Median" msgstr "> Médiane" #: src/language/stats/median.c:316 msgid "≤ Median" msgstr "≤ Médiane" #: src/language/stats/npar.c:536 #, c-format msgid "%s subcommand not currently implemented." msgstr "La sous-commande %s n’est pas implémentée." #: src/language/stats/npar.c:691 #, c-format msgid "Expecting %s, %s, %s or a number." msgstr "%s, %s, %s ou un nombre sont attendus." #: src/language/stats/npar.c:845 #, c-format msgid "" "The specified value of HI (%d) is lower than the specified value of LO (%d)" msgstr "" "La valeur spécifiée pour HI (%d) est inférieure à la valeur spécifiée pour " "LO (%d)" #: src/language/stats/npar.c:897 #, c-format msgid "" "%d expected values were given, but the specified range (%d-%d) requires " "exactly %d values." msgstr "" "%d valeurs attendues ont été attribuées, mais l’intervalle spécifié (%d-%d) " "exige exactement %d valeurs." #: src/language/stats/npar.c:1118 src/language/stats/t-test-parser.c:173 #, c-format msgid "" "PAIRED was specified but the number of variables preceding WITH (%zu) did " "not match the number following (%zu)." msgstr "" "L’option PAIRED a été indiquée mais le nombre de variables précédant " "l’option WITH (%zu) ne correspond pas au nombre suivant (%zu)." #: src/language/stats/oneway.c:361 msgid "LSD" msgstr "LSD" #: src/language/stats/oneway.c:362 src/ui/gui/oneway.ui:338 msgid "Tukey HSD" msgstr "HSD de Tukey" #: src/language/stats/oneway.c:363 src/ui/gui/oneway.ui:253 msgid "Bonferroni" msgstr "Bonferroni" #: src/language/stats/oneway.c:364 src/ui/gui/oneway.ui:304 msgid "Scheffé" msgstr "Scheffé" #: src/language/stats/oneway.c:365 msgid "Games-Howell" msgstr "Games-Howell" #: src/language/stats/oneway.c:366 src/ui/gui/oneway.ui:321 msgid "Šidák" msgstr "Sidak" #: src/language/stats/oneway.c:519 #, c-format msgid "The post hoc analysis method %s is not supported." msgstr "La méthode d’analyse Post Hoc %s n’est pas supportée." #: src/language/stats/oneway.c:842 #, c-format msgid "" "Dependent variable %s has no non-missing values. No analysis for this " "variable will be done." msgstr "" "La variable dépendante %s n’a aucune valeur non-manquante. Aucune analyse ne " "sera effectuée pour cette variable." #: src/language/stats/oneway.c:924 #, c-format msgid "" "In contrast list %zu, the number of coefficients (%zu) does not equal the " "number of groups (%d). This contrast list will be ignored." msgstr "" "Dans la liste de contraste %zu, le nombre de coefficients (%zu) n’est pas " "égal au nombre de groupes (%d). Cette liste de contraste sera ignorée." #: src/language/stats/oneway.c:936 #, c-format msgid "Coefficients for contrast %zu do not total zero" msgstr "Les coefficients de contraste %zu n’ont pas un total égal à zéro" #: src/language/stats/oneway.c:971 msgid "ANOVA" msgstr "ANOVA" #: src/language/stats/oneway.c:974 src/language/stats/regression.c:1024 msgid "Sum of Squares" msgstr "Somme des carrés" #: src/language/stats/oneway.c:981 msgid "Between Groups" msgstr "Entre les groupes" #: src/language/stats/oneway.c:981 msgid "Within Groups" msgstr "À l’intérieur des groupes" #: src/language/stats/oneway.c:1075 src/language/stats/oneway.c:1257 #, fuzzy #| msgid "_Dependent Variable" msgid "Dependent Variable" msgstr "Variable _dépendante" #: src/language/stats/oneway.c:1148 msgid "Test of Homogeneity of Variances" msgstr "Test d’homogénéité des variances" #: src/language/stats/oneway.c:1151 msgid "Levene Statistic" msgstr "Statistique de Levene" #: src/language/stats/oneway.c:1152 msgid "df1" msgstr "df1" #: src/language/stats/oneway.c:1153 msgid "df2" msgstr "df2" #: src/language/stats/oneway.c:1192 msgid "Contrast Coefficients" msgstr "Coefficient de contraste" #: src/language/stats/oneway.c:1199 src/language/stats/oneway.c:1246 msgid "Contrast" msgstr "Contraste" #: src/language/stats/oneway.c:1236 msgid "Contrast Tests" msgstr "Tests de contraste" #: src/language/stats/oneway.c:1239 msgid "Value of Contrast" msgstr "Valeur de contraste" #: src/language/stats/oneway.c:1241 src/language/stats/regression.c:905 #: src/language/stats/t-test-indep.c:266 #: src/language/stats/t-test-one-sample.c:74 #: src/language/stats/t-test-paired.c:252 msgid "t" msgstr "t" #: src/language/stats/oneway.c:1252 msgid "Assumption" msgstr "" # ??? #: src/language/stats/oneway.c:1253 msgid "Assume equal variances" msgstr "Suppose des variances égales" # ??? #: src/language/stats/oneway.c:1254 #, fuzzy #| msgid "Does not assume equal" msgid "Does not assume equal variances" msgstr "Suppose une inégalité" #: src/language/stats/oneway.c:1367 #, c-format msgid "Multiple Comparisons (%s)" msgstr "Comparaisons multiples (%s)" #: src/language/stats/oneway.c:1374 #, fuzzy #| msgid "Mean Difference" msgid "Mean Difference (I - J)" msgstr "Différence des moyennes" #: src/language/stats/oneway.c:1379 #, c-format msgid "%g%% Confidence Interval" msgstr "%g%% intervalle de confiance" #: src/language/stats/oneway.c:1386 src/language/stats/oneway.c:1390 msgid "(J) Family" msgstr "" #: src/language/stats/oneway.c:1406 #, fuzzy #| msgid "Runs Test" msgid "Test" msgstr "Exécute le test" #: src/language/stats/quick-cluster.c:576 msgid "Initial Cluster Centers" msgstr "Centres de groupe initial" #: src/language/stats/quick-cluster.c:577 msgid "Final Cluster Centers" msgstr "Centres de groupe final" #: src/language/stats/quick-cluster.c:580 #: src/language/stats/quick-cluster.c:660 #: src/language/stats/quick-cluster.c:661 #: src/language/stats/quick-cluster.c:753 msgid "Cluster" msgstr "Groupe" #: src/language/stats/quick-cluster.c:658 msgid "Cluster Membership" msgstr "Membres du cluster" #: src/language/stats/quick-cluster.c:744 msgid "Number of Cases in each Cluster" msgstr "Nombre d’observations dans chaque groupe" #: src/language/stats/quick-cluster.c:750 #, fuzzy #| msgid "Cluster" msgid "Clusters" msgstr "Groupe" #: src/language/stats/quick-cluster.c:867 #: src/language/stats/quick-cluster.c:893 #, fuzzy, c-format #| msgid "Variable %s already exists." msgid "A variable called `%s' already exists." msgstr "La variable %s existe déjà." #: src/language/stats/quick-cluster.c:908 #, fuzzy, c-format #| msgid "expecting %s or %s" msgid "Expecting %s or %s." msgstr "Attend %s ou %s" #: src/language/stats/quick-cluster.c:928 msgid "The number of clusters must be positive" msgstr "Le nombre de cluster doit être positif" #: src/language/stats/quick-cluster.c:944 #, fuzzy #| msgid "The convergence criterium must be positive" msgid "The convergence criterion must be positive" msgstr "Le critère de convergence doit être positif" #: src/language/stats/quick-cluster.c:960 msgid "The number of iterations must be positive" msgstr "Le nombre d’itération doit être positif" #: src/language/stats/rank.c:205 #, c-format msgid "" "Cannot generate variable name for ranking %s with %s. All candidates in use." msgstr "" "Impossible de créer un nom de variable sur l’intervalle %s avec %s. Toutes " "les possibilités sont déjà utilisées. " #: src/language/stats/rank.c:321 #, c-format msgid "Too many variables in %s clause." msgstr "Trop nombreuses variables dans la clause %s." #: src/language/stats/rank.c:323 #, c-format msgid "Variable %s already exists." msgstr "La variable %s existe déjà." #: src/language/stats/rank.c:325 src/language/expressions/evaluate.c:164 #, c-format msgid "Duplicate variable name %s." msgstr "Nom de variable %s dupliqué." #: src/language/stats/rank.c:631 #, c-format msgid "%s of %s by %s" msgstr "%s de %s par %s" #: src/language/stats/rank.c:825 #, fuzzy #| msgid "Variables Created By %s" msgid "Variables Created by RANK" msgstr "Variables crées par %s" #: src/language/stats/rank.c:828 src/language/stats/rank.c:829 #, fuzzy #| msgid "Name Variable:" msgid "New Variable" msgstr "Nom de variable :" #: src/language/stats/rank.c:829 #, fuzzy #| msgid "Function: " msgid "Function" msgstr "Fonction :" #: src/language/stats/rank.c:830 #, fuzzy #| msgid "Extraction" msgid "Fraction" msgstr "Extraction" #: src/language/stats/rank.c:830 #, fuzzy #| msgid "_Grouping Variable:" msgid "Grouping Variables" msgstr "Variable de _regroupement :" #: src/language/stats/rank.c:833 src/language/stats/rank.c:834 #, fuzzy #| msgid "_Test Variable:" msgid "Existing Variable" msgstr "_Variable d’essai :" #: src/language/stats/reliability.c:164 msgid "Reliability on a single variable is not useful." msgstr "Le test de confiance sur une seule variable n’est pas pertinent." #: src/language/stats/reliability.c:281 msgid "" "The STATISTICS subcommand is not yet implemented. No statistics will be " "produced." msgstr "" "La sous-commande STATISTICS n,est pas encore implémentée. Aucune " "statistiques ne sera produite." #: src/language/stats/reliability.c:300 msgid "The split point must be less than the number of variables" msgstr "Le point de séparation doit être inférieur au nombre de variables" #: src/language/stats/reliability.c:525 #, c-format msgid "Scale: %s" msgstr "Échelle : %s" #: src/language/stats/reliability.c:582 msgid "Item-Total Statistics" msgstr "Article-Total statistiques" #: src/language/stats/reliability.c:585 msgid "Scale Mean if Item Deleted" msgstr "Moyenne de l’échelle si l’item est effacé" #: src/language/stats/reliability.c:586 msgid "Scale Variance if Item Deleted" msgstr "Variance de l’échelle si l’item est effacé" #: src/language/stats/reliability.c:587 msgid "Corrected Item-Total Correlation" msgstr "Item corrigé - Corrélation totale" #: src/language/stats/reliability.c:588 msgid "Cronbach's Alpha if Item Deleted" msgstr "Alpha de Cronbach si l’élément est effacé" #: src/language/stats/reliability.c:627 msgid "Reliability Statistics" msgstr "Statistiques de confiance" #: src/language/stats/reliability.c:634 src/language/stats/reliability.c:646 msgid "Cronbach's Alpha" msgstr "Alpha de Cronbach" # ??? Item #: src/language/stats/reliability.c:635 src/language/stats/reliability.c:649 #: src/language/stats/reliability.c:652 msgid "N of Items" msgstr "Nb éléments" #: src/language/stats/reliability.c:647 msgid "Part 1" msgstr "Partie 1" #: src/language/stats/reliability.c:650 msgid "Part 2" msgstr "Partie 2" # ??? Item #: src/language/stats/reliability.c:654 msgid "Total N of Items" msgstr "Nb total d’éléments" #: src/language/stats/reliability.c:656 msgid "Correlation Between Forms" msgstr "Corrélation entre les formules" #: src/language/stats/reliability.c:659 msgid "Spearman-Brown Coefficient" msgstr "Coefficient de Spearman-Brown" #: src/language/stats/reliability.c:660 msgid "Equal Length" msgstr "Longueur égale" #: src/language/stats/reliability.c:661 msgid "Unequal Length" msgstr "Longueur inégale" #: src/language/stats/reliability.c:663 msgid "Guttman Split-Half Coefficient" msgstr "Coefficient de Guttman" #: src/language/stats/roc.c:966 msgid "Area Under the Curve" msgstr "Surface située sous la courbe" #: src/language/stats/roc.c:970 msgid "Area" msgstr "Surface" #: src/language/stats/roc.c:976 msgid "Asymptotic Sig." msgstr "Sig. asymptotique." #: src/language/stats/roc.c:979 #, c-format msgid "Asymp. %g%% Confidence Interval" msgstr "Intervalle de confiance asymp. %g%%" #: src/language/stats/roc.c:987 msgid "Variable under test" msgstr "Variable testée" #: src/language/stats/roc.c:1026 msgid "Case Summary" msgstr "Résumé des observations" #: src/language/stats/roc.c:1030 msgid "Unweighted" msgstr "Non pondéré" #: src/language/stats/roc.c:1031 msgid "Weighted" msgstr "Pondéré" #: src/language/stats/roc.c:1064 msgid "Coordinates of the Curve" msgstr "Coordonnées de la courbe" #: src/language/stats/roc.c:1068 msgid "Positive if greater than or equal to" msgstr "Positif si supérieur ou égal à " #: src/language/stats/roc.c:1069 src/output/charts/roc-chart-cairo.c:38 msgid "Sensitivity" msgstr "Sensibilité" #: src/language/stats/roc.c:1069 src/output/charts/roc-chart-cairo.c:37 msgid "1 - Specificity" msgstr "1 - Spécificité" #: src/language/stats/roc.c:1072 #, fuzzy #| msgid "ordinary" msgid "Coordinates" msgstr "ordinaire" #: src/language/stats/roc.c:1076 msgid "Test variable" msgstr "Variable d’essai" #: src/language/stats/regression.c:224 src/language/stats/regression.c:229 #, c-format msgid "VARIABLES may not appear after %s" msgstr "VARIABLES ne peut figurer après %s." #: src/language/stats/regression.c:412 msgid "" "REGRESSION with SAVE ignores TEMPORARY. Temporary transformations will be " "made permanent." msgstr "" "REGRESSION avec SAVE ignore TEMPORARY. Les transformations temporaires " "seront donc permanentes." #: src/language/stats/regression.c:416 msgid "REGRESSION with SAVE ignores FILTER. All cases will be processed." msgstr "" "REGRESSION avec SAVE ignore TEMPORARY. Tous les cas seront passés en revue." #: src/language/stats/regression.c:569 msgid "" "The dependent variable is equal to the independent variable. The least " "squares line is therefore Y=X. Standard errors and related statistics may be " "meaningless." msgstr "" "La variable dépendante est égale à la variable indépendante. La droite des " "moindres carrés est donc Y=X. Les erreurs standards et les statistiques " "connexes peuvent être sans signification." #: src/language/stats/regression.c:776 msgid "No valid data found. This command was skipped." msgstr "Aucune donnée valide. Cette commande est annulée." #: src/language/stats/regression.c:863 #, c-format msgid "Model Summary (%s)" msgstr "Sommaire du modèle (%s)" #: src/language/stats/regression.c:868 #: src/ui/gui/psppire-dialog-action-regression.c:42 msgid "R" msgstr "R" #: src/language/stats/regression.c:868 msgid "R Square" msgstr "R Carré (R²)" #: src/language/stats/regression.c:868 msgid "Adjusted R Square" msgstr "R carré ajusté" #: src/language/stats/regression.c:869 msgid "Std. Error of the Estimate" msgstr "Erreur standard de l’estimation" #: src/language/stats/regression.c:895 #, c-format msgid "Coefficients (%s)" msgstr "Coefficients (%s)" #: src/language/stats/regression.c:901 msgid "Unstandardized Coefficients" msgstr "Coefficients non normalisés" #: src/language/stats/regression.c:904 msgid "Standardized Coefficients" msgstr "Coefficients normalisés" #: src/language/stats/regression.c:904 msgid "Beta" msgstr "Beta" #: src/language/stats/regression.c:911 #, c-format msgid "%g%% Confidence Interval for B" msgstr "%g%% intervalle de confiance pour B" #: src/language/stats/regression.c:919 #, fuzzy #| msgid "Reliability Statistics" msgid "Collinearity Statistics" msgstr "Statistiques de confiance" #: src/language/stats/regression.c:920 #, fuzzy #| msgid "Covariance" msgid "Tolerance" msgstr "Covariance" #: src/language/stats/regression.c:920 msgid "VIF" msgstr "" #: src/language/stats/regression.c:933 msgid "(Constant)" msgstr "(Constante)" #: src/language/stats/regression.c:1020 #, c-format msgid "ANOVA (%s)" msgstr "ANOVA (%s)" #: src/language/stats/regression.c:1031 src/ui/gui/regression.ui:24 msgid "Regression" msgstr "Régression" #: src/language/stats/regression.c:1075 #, c-format msgid "Coefficient Correlations (%s)" msgstr "Coefficient de corrélation (%s)" #: src/language/stats/regression.c:1082 #, fuzzy #| msgid "Model" msgid "Models" msgstr "Modèle" #: src/language/stats/regression.c:1090 msgid "Covariances" msgstr "Covariances" #: src/language/stats/runs.c:169 #, c-format msgid "" "Multiple modes exist for variable `%s'. Using %.*g as the threshold value." msgstr "" "Les modes multiples existent pour les variables « %s ». Utilisera %.*g comme " "valeur d’objectif." #: src/language/stats/runs.c:314 src/ui/gui/runs.ui:24 msgid "Runs Test" msgstr "Exécute le test" #: src/language/stats/runs.c:319 msgid "Test Value" msgstr "Valeur de test" #: src/language/stats/runs.c:320 msgid "Test Value (mode)" msgstr "Valeur de test (mode)" #: src/language/stats/runs.c:321 msgid "Test Value (mean)" msgstr "Valeur de test (moyenne)" #: src/language/stats/runs.c:322 msgid "Test Value (median)" msgstr "Valeur de test (médiane)" #: src/language/stats/runs.c:323 msgid "Cases < Test Value" msgstr "Observations < Valeur de test" #: src/language/stats/runs.c:324 msgid "Cases ≥ Test Value" msgstr "Observations ≥ Valeur de test" #: src/language/stats/runs.c:325 msgid "Total Cases" msgstr "Total des observations" #: src/language/stats/runs.c:326 msgid "Number of Runs" msgstr "Nombre d’exécutions" #: src/language/stats/sign.c:72 #, fuzzy #| msgid "Mean Difference" msgid "Differences" msgstr "Différence des moyennes" #: src/language/stats/sign.c:73 msgid "Negative Differences" msgstr "Différences négatives" #: src/language/stats/sign.c:74 msgid "Positive Differences" msgstr "Différences positives" #: src/language/stats/sign.c:75 src/language/stats/wilcoxon.c:250 msgid "Ties" msgstr "Relations" # ??? buffer #: src/language/stats/sort-cases.c:63 msgid "Buffer limit must be at least 2." msgstr "La limite du tampon doit être au moins de 2." #: src/language/stats/sort-criteria.c:89 #, c-format msgid "Variable %s specified twice in sort criteria." msgstr "Variable %s spécifiée deux fois dans les critères de tri." #: src/language/stats/t-test-indep.c:190 msgid "Group Statistics" msgstr "Statistiques de groupe" #: src/language/stats/t-test-indep.c:200 #, fuzzy #| msgid "Group1" msgid "Group" msgstr "Groupe1" #: src/language/stats/t-test-indep.c:256 msgid "Independent Samples Test" msgstr "Test d’échantillons indépendants" #: src/language/stats/t-test-indep.c:261 msgid "Levene's Test for Equality of Variances" msgstr "test de Levene pour l’égalité des variances" #: src/language/stats/t-test-indep.c:265 #, fuzzy #| msgid "t-test for Equality of Means" msgid "T-Test for Equality of Means" msgstr "t-test pour l’égalité des moyennes" #: src/language/stats/t-test-indep.c:269 #: src/language/stats/t-test-one-sample.c:77 msgid "Mean Difference" msgstr "Différence des moyennes" #: src/language/stats/t-test-indep.c:270 msgid "Std. Error Difference" msgstr "Différence des erreurs standards" #: src/language/stats/t-test-indep.c:273 #, fuzzy, no-c-format #| msgid "%g%% Confidence Interval of the Difference" msgid "95% Confidence Interval of the Difference" msgstr "%g%% intervalle de confiance de la différence" #: src/language/stats/t-test-indep.c:277 #, fuzzy #| msgid "Options" msgid "Assumptions" msgstr "Options" # ??? #: src/language/stats/t-test-indep.c:278 msgid "Equal variances assumed" msgstr "Suppose des Variances égales" # ??? #: src/language/stats/t-test-indep.c:279 msgid "Equal variances not assumed" msgstr "ne présuppose pas des Variances égales" #: src/language/stats/t-test-one-sample.c:64 msgid "One-Sample Test" msgstr "Test pour uni-échantillon" #: src/language/stats/t-test-one-sample.c:71 #, fuzzy, c-format #| msgid "Test Value = %f" msgid "Test Value = %.*g" msgstr "Valeur de test = %f" #: src/language/stats/t-test-one-sample.c:80 #: src/language/stats/t-test-paired.c:246 #, c-format msgid "%g%% Confidence Interval of the Difference" msgstr "%g%% intervalle de confiance de la différence" #: src/language/stats/t-test-one-sample.c:122 msgid "One-Sample Statistics" msgstr "Statistiques de simple échantillonnage" #: src/language/stats/t-test-paired.c:147 msgid "Paired Sample Statistics" msgstr "Statistiques d’échantillonnages appairées" #: src/language/stats/t-test-paired.c:163 #: src/language/stats/t-test-paired.c:205 #: src/language/stats/t-test-paired.c:263 #, fuzzy, c-format #| msgid "Pair %d" msgid "Pair %zu" msgstr "Paire %d" #: src/language/stats/t-test-paired.c:190 msgid "Paired Samples Correlations" msgstr "Corrélations de paires simples" #: src/language/stats/t-test-paired.c:208 #, c-format msgid "%s & %s" msgstr "%s & %s" #: src/language/stats/t-test-paired.c:234 msgid "Paired Samples Test" msgstr "Test d’échantillonnages appairées" #: src/language/stats/t-test-paired.c:240 msgid "Paired Differences" msgstr "Différences appairées" #: src/language/stats/t-test-paired.c:266 #, c-format msgid "%s - %s" msgstr "%s - %s" #: src/language/stats/t-test-parser.c:133 #, c-format msgid "When applying %s to a string variable, two values must be specified." msgstr "" "Lors de l’application de %s à une variable chaîne, deux valeurs doivent être " "spécifiées." #: src/language/stats/t-test-parser.c:145 #: src/language/stats/t-test-parser.c:241 #, c-format msgid "%s subcommand may not be used with %s." msgstr "La sous-commande %s ne peut être utilisée avec %s." #: src/language/stats/t-test-parser.c:305 msgid "Exactly one of TESTVAL, GROUPS and PAIRS subcommands must be specified." msgstr "" "Une seule des sous-commandes TESTVAL, GROUPS et PAIRS peut être spécifiée." #: src/language/stats/wilcoxon.c:248 #, fuzzy #| msgid "_Sign" msgid "Sign" msgstr "_Signe" #: src/language/stats/wilcoxon.c:249 msgid "Negative Ranks" msgstr "Rangs neagtifs" #: src/language/stats/wilcoxon.c:249 msgid "Positive Ranks" msgstr "Rang positif" #: src/language/stats/wilcoxon.c:296 #, fuzzy #| msgid "Too many pairs to calculate exact significance." msgid "Too many pairs to calculate exact significance" msgstr "Trop de paires pour calculer l’exacte Signification." #: src/language/data-io/combine-files.c:214 msgid "Cannot specify the active dataset since none has been defined." msgstr "" "Impossible de spécifier le jeu de données actif car aucun n’a été défini." #: src/language/data-io/combine-files.c:220 msgid "" "This command may not be used after TEMPORARY when the active dataset is an " "input source. Temporary transformations will be made permanent." msgstr "" "Cette commande ne peut être utilisée après TEMPORARY lorsque le jeu de " "données actif est une source d’entrée. Les transformations obtenues avec " "l’instruction TEMPORARY seront rendues permanentes." #: src/language/data-io/combine-files.c:255 msgid "Multiple IN subcommands for a single FILE or TABLE." msgstr "Multiples sous-commandes IN pour un seul fichier ou une seule table." #: src/language/data-io/combine-files.c:308 #, c-format msgid "File %s lacks BY variable %s." msgstr "Le fichier %s manque de variable BY %s." #: src/language/data-io/combine-files.c:311 #, c-format msgid "Active dataset lacks BY variable %s." msgstr "Jeu de données actif BY manquant en variable %s." #: src/language/data-io/combine-files.c:388 #: src/language/data-io/combine-files.c:393 #, c-format msgid "BY is required when %s is specified." msgstr "BY est nécessaire lorsque %s est spécifié." #: src/language/data-io/combine-files.c:521 msgid "" "Combining files with incompatible encodings. String data may not be " "represented correctly." msgstr "" "Combinaison de fichiers contenant des encodages incompatibles. Les données " "chaînes ne peuvent être représentées correctement." #: src/language/data-io/combine-files.c:564 #, c-format msgid "" "Variable %s in file %s has different type or width from the same variable in " "earlier file." msgstr "" "La variable %s dans le fichier %s présente un type ou une largeur différents " "de la même variable le fichier précédent." #: src/language/data-io/combine-files.c:570 #, c-format msgid "In file %s, %s is numeric." msgstr "En fichier %s, %s est numérique." #: src/language/data-io/combine-files.c:573 #, c-format msgid "In file %s, %s is a string variable with width %d." msgstr "Dans le fichier %s, %s est une variable chaîne de largeur %d." #: src/language/data-io/combine-files.c:578 #, c-format msgid "In an earlier file, %s was numeric." msgstr "Dans un fichier précédent, %s était numérique." #: src/language/data-io/combine-files.c:581 #, c-format msgid "In an earlier file, %s was a string variable with width %d." msgstr "" "Dans un fichier précédent, %s était une variable chaîne de largeur %d.." #: src/language/data-io/combine-files.c:621 #, c-format msgid "" "Variable name %s specified on %s subcommand duplicates an existing variable " "name." msgstr "" "Le nom de variable %s spécifié en sous-commande %s duplique un nom de " "variable existant." #: src/language/data-io/combine-files.c:793 #, c-format msgid "Encountered %zu sets of duplicate cases in the master file." msgstr "" "Ensembles %zu d’observations dupliquées rencontrées dans le fichier maître." #: src/language/data-io/data-list.c:129 src/language/data-io/data-list.c:144 #, fuzzy, c-format #| msgid "The %s value must be nonnegative." msgid "The %s value must be non-negative." msgstr "La valeur %s ne doit pas être négative." #: src/language/data-io/data-list.c:154 #, c-format msgid "The %s subcommand may only be used within %s." msgstr "La sous-commande %s ne peut être utilisée qu’avec %s." #: src/language/data-io/data-list.c:159 #, c-format msgid "The %s subcommand may only be specified once." msgstr "La sous-commande %s ne peut être utilisée qu’une fois." #: src/language/data-io/data-list.c:197 msgid "Only one of FIXED, FREE, or LIST may be specified." msgstr "Une seule option FIXED, FREE ou LIST peut être utilisée à la fois." #: src/language/data-io/data-list.c:260 msgid "Encoding should not be specified for inline data. It will be ignored." msgstr "" "L’encodage ne devrait pas être spécifié pour les données en ligne. Il sera " "ignoré." #: src/language/data-io/data-list.c:269 #, c-format msgid "The %s subcommand may be used only with %s." msgstr "La sous-commande %s ne peut être utilisée qu’avec %s." #: src/language/data-io/data-list.c:284 src/language/data-io/matrix-data.c:578 msgid "At least one variable must be specified." msgstr "Au moins une variable doit être spécifiée" #: src/language/data-io/data-list.c:383 src/language/data-io/data-list.c:491 #: src/language/data-io/get-data.c:662 #, c-format msgid "%s is a duplicate variable name." msgstr "%s est un nom de variable déjà utilisé." #: src/language/data-io/data-list.c:390 #, c-format msgid "There is already a variable %s of a different type." msgstr "Il existe déjà une variable %s d’un type différent." #: src/language/data-io/data-list.c:397 #, c-format msgid "There is already a string variable %s of a different width." msgstr "Il existe déjà une variable chaîne %s d’une largeur différente." #: src/language/data-io/data-list.c:405 #, c-format msgid "Cannot place variable %s on record %d when RECORDS=%d is specified." msgstr "" "Impossible de placer la variable %s dans l’enregistrement %d quand RECORDS=" "%d est spécifié." #: src/language/data-io/data-parser.c:453 #: src/language/data-io/data-parser.c:462 msgid "Quoted string extends beyond end of line." msgstr "La chaîne entre guillemets s’étend au-delà de la fin de ligne." #: src/language/data-io/data-parser.c:488 msgid "Missing delimiter following quoted string." msgstr "guillemet fermant manquant en fin de chaîne." #: src/language/data-io/data-parser.c:506 #, c-format msgid "Data for variable %s is not valid as format %s: %s" msgstr "" "La donnée pour la variable %s n’est pas valide en tant que format %s : %s" #: src/language/data-io/data-parser.c:536 #, c-format msgid "Partial case of %d of %d records discarded." msgstr "L’observation partielle de %d de %d enregistrements a été écartée." #: src/language/data-io/data-parser.c:592 #, c-format msgid "Partial case discarded. The first variable missing was %s." msgstr "" "L’observation partielle a été écartée. La première variable manquante était " "%s." #: src/language/data-io/data-parser.c:634 #, c-format msgid "" "Missing value(s) for all variables from %s onward. These will be filled " "with the system-missing value or blanks, as appropriate." msgstr "" "Les valeurs sont manquantes pour toutes les variables à partir de %s. Elles " "seront remplies de valeurs systèmes manquants ou de blancs selon les cas." #: src/language/data-io/data-parser.c:655 msgid "Record ends in data not part of any field." msgstr "" "L’enregistrement se termine dans une données n’appartenant à aucun champ." #: src/language/data-io/data-parser.c:670 #, c-format msgid "Reading %d record from %s." msgid_plural "Reading %d records from %s." msgstr[0] "Lecture de %d enregistrement à partir de %s." msgstr[1] "Lecture de %d enregistrements à partir de %s." #: src/language/data-io/data-parser.c:680 src/language/data-io/print.c:435 msgid "Record" msgstr "Enregistrement" #: src/language/data-io/data-parser.c:680 src/language/data-io/print.c:435 #: src/ui/gui/psppire-var-sheet-header.c:76 msgid "Columns" msgstr "Colonnes" #: src/language/data-io/data-parser.c:680 #: src/language/data-io/data-parser.c:725 src/language/data-io/print.c:435 msgid "Format" msgstr "Format" #: src/language/data-io/data-parser.c:720 #, c-format msgid "Reading free-form data from %s." msgstr "Lecture de données à format libre à partir de %s." #. TRANSLATORS: this fragment will be interpolated into #. messages in fh_lock() that identify types of files. #: src/language/data-io/data-reader.c:136 src/language/data-io/data-writer.c:79 msgid "data file" msgstr "fichier de données" #: src/language/data-io/data-reader.c:160 #, c-format msgid "Could not open `%s' for reading as a data file: %s." msgstr "" "Impossible d’ouvrir « %s » lors de la lecture du fichier de données : %s." #: src/language/data-io/data-reader.c:174 #, c-format msgid "Could not read `%s' as a text file with encoding `%s': %s." msgstr "Impossible d’ouvrir « %s » en tant que fichier encodé « %s » : %s." #: src/language/data-io/data-reader.c:233 #, c-format msgid "" "Missing %s while reading inline data. This probably indicates a missing or " "incorrectly formatted %s command. %s must appear by itself on a single line " "with exactly one space between words." msgstr "" "%s manquant lors de la lecture de données en ligne. Cela révèle une " "instruction %s manquante ou mal formée. %s doit figurer sur une seule ligne " "et avec un seul espace entre les mots." #: src/language/data-io/data-reader.c:253 #: src/language/data-io/data-reader.c:387 #, c-format msgid "Error reading file %s: %s." msgstr "Erreur de lecture du fichier %s : %s." #: src/language/data-io/data-reader.c:261 #, c-format msgid "Unexpected end of file in partial record reading %s." msgstr "Fin de fichier inattendue à la lecture d’un enregistrement partiel %s." #: src/language/data-io/data-reader.c:321 #, c-format msgid "Corrupt block descriptor word at offset 0x%lx in %s." msgstr "Mot descripteur de bloc corrompu au segment 0x%lx dans %s." #: src/language/data-io/data-reader.c:322 #, c-format msgid "Corrupt record descriptor word at offset 0x%lx in %s." msgstr "Mot descripteur d’enregistrement corrompu au segment 0x%lx dans %s." #: src/language/data-io/data-reader.c:335 #, c-format msgid "Corrupt record size at offset 0x%lx in %s." msgstr "Taille d’enregistrement corrompue au segment 0x%lx dans %s." #: src/language/data-io/data-reader.c:493 msgid "Record exceeds remaining block length." msgstr "L’enregistrement dépasse la longueur du bloc restant." #: src/language/data-io/data-reader.c:567 #, c-format msgid "Attempt to read beyond end-of-file on file %s." msgstr "Tentative de lecture au-delà de la fin du fichier %s." #: src/language/data-io/data-reader.c:570 #, c-format msgid "Attempt to read beyond %s." msgstr "Tentative de lecture au-delà de %s." #: src/language/data-io/data-reader.c:733 msgid "" "This command is not valid here since the current input program does not " "access the inline file." msgstr "" "Cette commande n’est pas valide ici tant que l’actuel module d’entrée " "n’accède pas au fichier en ligne." #: src/language/data-io/data-writer.c:106 #, c-format msgid "An error occurred while opening `%s' for writing as a data file: %s." msgstr "" "Une erreur est apparue lors de l’ouverture de « %s » pour l’écriture en tant " "que fichier de données : %s." #: src/language/data-io/data-writer.c:224 #, c-format msgid "I/O error occurred writing data file `%s'." msgstr "" "Erreur d’entrée-sortie (I/O) survenue à l’écriture du fichier de données %s." #: src/language/data-io/dataset.c:64 #, c-format msgid "There is no dataset named %s." msgstr "Aucun jeu de données nommé %s." #: src/language/data-io/dataset.c:250 #, fuzzy #| msgid "Dataset" msgid "Datasets" msgstr "Jeu de données" #: src/language/data-io/dataset.c:263 msgid "unnamed dataset" msgstr "jeu de données sans nom" #: src/language/data-io/file-handle.c:61 #, c-format msgid "" "File handle %s is already defined. Use %s before redefining a file handle." msgstr "" "L’identifiant de fichier %s est déjà défini. Utiliser %s avant de redéfinir " "un identifiant de fichier." #: src/language/data-io/file-handle.c:241 #, c-format msgid "%s must be specified with %s." msgstr "%s doit être spécifié avec %s." #: src/language/data-io/file-handle.c:252 #, c-format msgid "" "The specified file mode requires LRECL. Assuming %zu-character records." msgstr "" "Le fichier spécifié exige LRECL. Impose des enregistrement de %zu-caractères." #: src/language/data-io/file-handle.c:256 #, c-format msgid "" "Record length (%d) must be between 1 and %lu bytes. Assuming %zu-character " "records." msgstr "" "La longueur d’enregistrement (%d) doit être comprise entre 1 et %lu " "caractères. Fixe les enregistrements à %zu-caractères." #: src/language/data-io/file-handle.c:300 msgid "file" msgstr "fichier" #: src/language/data-io/file-handle.c:302 msgid "inline file" msgstr "fichier en ligne" #: src/language/data-io/file-handle.c:350 msgid "expecting a file name or handle name" msgstr "en attente d’un nom de fichier ou un nom d’identifiant" #: src/language/data-io/file-handle.c:365 #, c-format msgid "Handle for %s not allowed here." msgstr "L’identifiant pour %s n’est pas permis ici." #: src/language/data-io/get-data.c:108 src/output/measure.c:262 #, c-format msgid "error reading file `%s'" msgstr "Erreur de lecture du fichier « %s »" #: src/language/data-io/get-data.c:127 #, c-format msgid "Unsupported TYPE %s." msgstr "TYPE %s non supporté." #: src/language/data-io/get-data.c:278 msgid "The sheet index must be greater than or equal to 1" msgstr "Le numéro de feuille doit être supérieur ou égal à 1" #: src/language/data-io/get-data.c:285 src/language/data-io/get-data.c:308 #: src/language/data-io/get-data.c:327 #, c-format msgid "%s must be followed by either \"%s\" or \"%s\"." msgstr "%s doit être suivi de « %s » ou « %s »." #: src/language/data-io/get-data.c:357 #, c-format msgid "" "%s is allowed only with %s arrangement, but %s arrangement was stated or " "implied earlier in this command." msgstr "" "%s n’est autorisé qu’avec la disposition %s, mais la disposition %s a été " "définie ou utilisée plus tôt dans cette commande." #: src/language/data-io/get-data.c:441 src/language/data-io/get-data.c:479 #, c-format msgid "Value of %s must be 1 or greater." msgstr "La valeur de %s doit être de 1 ou supérieur." #: src/language/data-io/get-data.c:504 msgid "" "Ignoring obsolete IMPORTCASES subcommand. (N OF CASES or SAMPLE may be used " "to substitute.)" msgstr "" "Ignore la sous-commande obsolète IMPORTCASES (N OF CASES ou SAMPLE peuvent " "être utilisées à la place)." #: src/language/data-io/get-data.c:551 msgid "" "In compatible syntax mode, the QUALIFIER string must contain exactly one " "character." msgstr "" "Dans le mode de syntaxe compatible, la chaîne QUALIFIER doit contenir " "strictement un seul caractère." #: src/language/data-io/get-data.c:583 #, c-format msgid "" "The record number specified, %ld, is at or before the previous record, %d. " "Data fields must be listed in order of increasing record number." msgstr "" "Le numéro d’enregistrement spécifié, %ld, est égal ou inférieur au précédent " "enregistrement, %d. Les champs de données doivent être listés dans l’un " "ordre croissant es numéros d’enregistrement." #: src/language/data-io/get-data.c:592 #, c-format msgid "" "The record number specified, %ld, exceeds the number of records per case " "specified on FIXCASE, %d." msgstr "" "Le numéro d’enregistrement spécifié, %ld, dépasse le nombre " "d’enregistrements par observation %d spécifié par FIXCASE." #: src/language/data-io/get.c:132 #, c-format msgid "%s: Data file dictionary has no variables." msgstr "%s : le dicoionnaire de données n’a pas de variables." #: src/language/data-io/inpt-pgm.c:133 #, c-format msgid "Unexpected end-of-file within %s." msgstr "Fin de fichier inattendue dans %s." #: src/language/data-io/inpt-pgm.c:146 #, c-format msgid "Input program must contain %s or %s." msgstr "Le programme en entrée doit contenir %s ou %s." #: src/language/data-io/inpt-pgm.c:152 msgid "Input program did not create any variables." msgstr "Le programme en entrée n’a créé aucune variable." #: src/language/data-io/inpt-pgm.c:365 msgid "" "REREAD: Column numbers must be positive finite numbers. Column set to 1." msgstr "" "REREAD : les nombres des colonnes doivent être positifs. La colonne est " "fixée à 1." #: src/language/data-io/list.c:100 #, fuzzy #| msgid "Dataset" msgid "Data List" msgstr "Jeu de données" #: src/language/data-io/list.c:221 #, c-format msgid "" "The first case (%ld) specified precedes the last case (%ld) specified. The " "values will be swapped." msgstr "" "La première observation (%ld) spécifiée précède la dernière observation " "(%ld) spécifiée. Les valeurs seront inversées." #: src/language/data-io/list.c:230 #, c-format msgid "" "The first case (%ld) to list is numbered less than 1. The value is being " "reset to 1." msgstr "" "La première observation (%ld) à lister est inférieure à 1. La valeur sera " "forcée à 1." #: src/language/data-io/list.c:237 #, c-format msgid "" "The last case (%ld) to list is numbered less than 1. The value is being " "reset to 1." msgstr "" "La dernière observation (%ld) à lister est inférieure à 1. La valeur sera " "forcée à 1." #: src/language/data-io/list.c:244 #, c-format msgid "The step value %ld is less than 1. The value is being reset to 1." msgstr "La valeur du pas %ld est inférieur à 1. La valeur sera redéfinie à 1." #: src/language/data-io/placement-parser.c:96 #, c-format msgid "" "Number of variables specified (%zu) differs from number of variable formats " "(%zu)." msgstr "" "Le nombre de variables spécifié (%zu) diffère du nombre de formats de " "variables (%zu)." #: src/language/data-io/placement-parser.c:106 msgid "" "SPSS-like or Fortran-like format specification expected after variable names." msgstr "" "Un format de type SPSS ou Fortran est attendu après les noms de variables." #: src/language/data-io/placement-parser.c:129 #, c-format msgid "The %d columns %d-%d can't be evenly divided into %zu fields." msgstr "" "Les %d colonnes %d-%d ne peuvent pas être également réparties entre les " "champs %zu." #: src/language/data-io/placement-parser.c:310 msgid "Column positions for fields must be positive." msgstr "Les positions des colonnes pour les champs doivent être positives." #: src/language/data-io/placement-parser.c:312 msgid "Column positions for fields must not be negative." msgstr "" "Les positions des colonnes pour les champs ne doivent pas être négatives." #: src/language/data-io/placement-parser.c:372 msgid "The ending column for a field must be greater than the starting column." msgstr "" "La colonne finale d’un champ doit être supérieure à la colonne initiale." #: src/language/data-io/placement-parser.c:409 #, fuzzy, c-format #| msgid "" #| "The record number specified, %ld, is at or before the previous record, " #| "%d. Data fields must be listed in order of increasing record number." msgid "" "The record number specified, %.0f, is at or before the previous record, %d. " "Data fields must be listed in order of increasing record number." msgstr "" "Le numéro d’enregistrement spécifié, %ld, est égal ou inférieur au précédent " "enregistrement, %d. Les champs de données doivent être listés dans l’un " "ordre croissant es numéros d’enregistrement." #: src/language/data-io/print-space.c:127 #, c-format msgid "The expression on %s evaluated to the system-missing value." msgstr "L’expression dans %s a été évalué à la valeur système manquante." #: src/language/data-io/print-space.c:130 #, c-format msgid "The expression on %s evaluated to %g." msgstr "L’expression dans %s a été évalué à %g." #: src/language/data-io/print.c:189 src/language/data-io/trim.c:58 msgid "expecting a valid subcommand" msgstr "Attend une sous-commande valide" #: src/language/data-io/print.c:219 #, c-format msgid "%s is required when binary formats are specified." msgstr "%s est nécessaire lorsque des formats binaires sons spécifiés." #: src/language/data-io/print.c:302 #, c-format msgid "Output calls for %d records but %zu specified on RECORDS subcommand." msgstr "" "Appels en sortie pour %d enregistrements en dépit de %zu spécifiées par la " "sous-commande RECORDS." #: src/language/data-io/print.c:432 #, fuzzy #| msgid "Case Processing Summary" msgid "Print Summary" msgstr "Sommaire d’exécution des observations" #: src/language/data-io/print.c:462 #, fuzzy #| msgid "Record" msgid "N of Records" msgstr "Enregistrement" #: src/language/data-io/matrix-data.c:191 #, c-format msgid "" "There are %d variable declared but the data has at least %d matrix rows." msgstr "" "%d variables sont déclarées mais les données ont au moins %d lignes de " "matrice." #: src/language/data-io/matrix-data.c:292 msgid "" "The N subcommand was specified, but a N record was also found in the data. " "The N record will be ignored." msgstr "" "La sous-commande N a été spécifiée, mais aucun enregistremnent N n’a été " "trouvé dans les données. Cette enregistrement sera ignoré." #: src/language/data-io/matrix-data.c:488 src/language/utilities/set.q:186 #, c-format msgid "%s must not be negative." msgstr "%s ne doit pas être négatif." #: src/language/data-io/matrix-data.c:568 msgid "FORMAT = FULL and FORMAT = NODIAGONAL are mutually exclusive." msgstr "FORMAT = FULL et FORMAT = NODIAGONAL s’excluent mutuellement." #: src/language/data-io/matrix-reader.c:102 #: src/language/data-io/matrix-reader.c:118 #, c-format msgid "Matrix dataset lacks a variable called %s." msgstr "Il manque une variable appelée %s dans le jeu de données matriciel." #: src/language/data-io/matrix-reader.c:109 #: src/language/data-io/matrix-reader.c:125 #, c-format msgid "Matrix dataset variable %s should be of string type." msgstr "" "La variable de jeu de données matriciel %s devrait être de type chaîne." #: src/language/data-io/save-translate.c:168 #: src/language/data-io/save-translate.c:183 #, c-format msgid "The %s string must contain exactly one character." msgstr "La chaîne %s ne doit comporter qu’un seul caractère." #: src/language/data-io/save-translate.c:249 #, c-format msgid "Output file `%s' exists but %s was not specified." msgstr "Le fichier de sortie « %s » existe mais %s n’a pas été indiqué." #: src/language/data-io/save.c:309 msgid "The OUTFILE or METADATA subcommand is required." msgstr "" #: src/language/data-io/trim.c:69 #, c-format msgid "" "Cannot rename %s as %s because there already exists a variable named %s. To " "rename variables with overlapping names, use a single RENAME subcommand such " "as `/RENAME (A=B)(B=C)(C=A)', or equivalently, `/RENAME (A B C=B C A)'." msgstr "" "Impossible de renommer %sen tant que %s car il existe déjà une variable " "nommée %s. Pour renommer des variables avec des noms redondants, utiliser " "une simple sous-commande RENAME telle que ’/RENAME (A=B)(B=C)(C=A)’ ou sous " "une forme équivalente ’/RENAME (A B C=B C A)’." #: src/language/data-io/trim.c:227 #, c-format msgid "" "Number of variables on left side of `=' (%zu) does not match number of " "variables on right side (%zu), in parenthesized group %d of RENAME " "subcommand." msgstr "" "Le nombre de variables à la gauche de « = » (%zu) ne correspond pas au " "nombre de variables figurant à la droite (%zu) dans le groupe entre " "parenthèses %d de la sous-commande RENAME." #: src/language/data-io/trim.c:242 #, c-format msgid "Requested renaming duplicates variable name %s." msgstr "Le renommage demandé dupliques le nom de variable %s." #: src/language/data-io/trim.c:281 msgid "Cannot DROP all variables from dictionary." msgstr "" "Impossible de supprimer toutes les variables du dictionnaire avec l’option " "DROP." #: src/language/expressions/evaluate.c:151 msgid "expecting number or string" msgstr "en attente d’un nombre ou d’une chaîne" #: src/language/expressions/helpers.c:43 msgid "" "One of the arguments to a DATE function is not an integer. The result will " "be system-missing." msgstr "" "Un des arguments de la fonction DATE n’est pas un entier. Le résultat sera " "considéré comme système manquant. " #: src/language/expressions/helpers.c:71 msgid "" "The week argument to DATE.WKYR is not an integer. The result will be system-" "missing." msgstr "" "L’argument de semaine de la fonction DATE.WKYR ’est pas un entier. Le " "résultat sera considéré comme système manquant. " #: src/language/expressions/helpers.c:77 msgid "" "The week argument to DATE.WKYR is outside the acceptable range of 1 to 53. " "The result will be system-missing." msgstr "" "L’argument de semaine de DATE.WKYR est hors de l’intervalle acceptable de 1 " "à 53. Le résultat sera forcé à système manquant." #: src/language/expressions/helpers.c:99 msgid "" "The day argument to DATE.YRDAY is not an integer. The result will be system-" "missing." msgstr "" "L’argument de jour de la fonction DATE.YRDAY n’est pas un entier. Le " "résultat sera considéré comme système manquant. " #: src/language/expressions/helpers.c:105 msgid "" "The day argument to DATE.YRDAY is outside the acceptable range of 1 to 366. " "The result will be system-missing." msgstr "" "L’argument de jour de DATE.YRDAY est hors de l’intervalle acceptable de 1 à " "366. Le résultat sera forcé à système manquant." #: src/language/expressions/helpers.c:127 msgid "" "The year argument to YRMODA is greater than 47516. The result will be " "system-missing." msgstr "" "L’argument d’année de la fonction YRMODA est supérieur à 47516. Le résultat " "sera considéré comme système manquant." #: src/language/expressions/helpers.c:180 #, c-format msgid "" "Unrecognized date unit `%.*s'. Valid date units are `%s', `%s', `%s', `%s', " "`%s', `%s', `%s', and `%s'." msgstr "" "Élément de date inconnu '%.*s'. Les unités valides sont « %s », « %s », " "« %s », « %s », « %s », « %s », « %s » et « %s »." #: src/language/expressions/helpers.c:333 #, c-format msgid "Invalid DATESUM method. Valid choices are `%s' and `%s'." msgstr "Méthode DATESUM invalide. Les choix valides sont « %s » et « %s »." #: src/language/expressions/parse.c:261 #, c-format msgid "" "Type mismatch: expression has %s type, but a numeric value is required here." msgstr "" "Incompatibilité de type: expression est de type% s, mais une valeur " "numérique est nécessaire ici." #: src/language/expressions/parse.c:274 #, c-format msgid "" "Type mismatch: expression has %s type, but a string value is required here." msgstr "" "Erreur de type : l’expression a le type %s, mais une valeur chaîne est " "exigée ici." #: src/language/expressions/parse.c:436 #, c-format msgid "Type mismatch while applying %s operator: cannot convert %s to %s." msgstr "" "Erreur de type lors de l’utilisation de l’opérateur %s : impossible de " "convertir %s en %s." #: src/language/expressions/parse.c:650 msgid "" "Chaining relational operators (e.g. `a < b < c') will not produce the " "mathematically expected result. Use the AND logical operator to fix the " "problem (e.g. `a < b AND b < c'). If chaining is really intended, " "parentheses will disable this warning (e.g. `(a < b) < c'.)" msgstr "" "L’enchainement des opérateurs relationnels (ç.-à-d. « a) ne donnera " "pas le résultat attendu. Utiliser l’opérateur logique AND pour résoudre le " "problème (ç.-à-d. « a; got %" msgid "%s: corrupt archive at 0x%llx: expected %# but got %#" msgstr "Fichier corrompu à 0x%llx : Attendu %; obtenu %" #: src/libpspp/zip-reader.c:329 src/libpspp/zip-reader.c:449 #, fuzzy, c-format #| msgid "%s: seek failed (%s)." msgid "%s: open failed (%s)" msgstr "%s : opération seek échouée (%s)." # ??? central #: src/libpspp/zip-reader.c:344 #, fuzzy, c-format #| msgid "Cannot find central directory" msgid "%s: cannot find central directory" msgstr "Impossible de trouver le répertoire principal" #: src/libpspp/zip-reader.c:353 src/libpspp/zip-reader.c:384 #: src/libpspp/zip-reader.c:468 #, fuzzy, c-format #| msgid "%s: seek failed (%s)." msgid "%s: seek failed (%s)" msgstr "%s : opération seek échouée (%s)." #: src/libpspp/zip-reader.c:441 #, fuzzy, c-format #| msgid "%s: unknown option `%s'" msgid "%s: unknown member \"%s\"" msgstr "%s : option « %s » inconnue" #: src/libpspp/zip-reader.c:503 #, fuzzy, c-format #| msgid "" #| "Name mismatch in zip archive. Central directory says `%s'; local file " #| "header says `%s'" msgid "" "%s: name mismatch between central directory (%s) and local file header (%s)" msgstr "" "Erreur de nom dans une archive zip. Le répertoire central indique « %s »; " "l’en-tête de fichier local indique « %s »" #: src/libpspp/zip-reader.c:696 #, fuzzy, c-format #| msgid "Cannot initialize inflator: %s" msgid "%s: cannot initialize inflator (%s)" msgstr "Impossible d’utiliser l’inflateur : %s." # ??? inflating #: src/libpspp/zip-reader.c:751 #, fuzzy, c-format #| msgid "Error inflating: %s" msgid "%s: error inflating \"%s\" (%s)" msgstr "Erreur d’inflation : %s" #: src/libpspp/zip-writer.c:97 utilities/pspp-convert.c:346 #, c-format msgid "%s: error opening output file" msgstr "%s : erreur d’ouverture du fichier de sortie" #: src/libpspp/zip-writer.c:169 #, c-format msgid "%s: error seeking in output file" msgstr "%s : erreur de recherche dans le fichier de sortie" #: src/libpspp/zip-writer.c:210 msgid "error creating temporary file" msgstr "erreur de création d’un fichier temporaire" #: src/libpspp/zip-writer.c:279 #, c-format msgid "%s: write failed" msgstr "%s : erreur d’écriture " #. TRANSLATORS: This is a format string which, when presented to #. printf like functions, will create a pango markup string to #. display real number in scientific notation. #. #. In its untranslated form, it will display similar to "1.23 x 10^4". You #. can leave it untranslated if this is how scientific notation is usually #. presented in your language. #. #. Some locales (such as German) prefer the centered dot rather than the #. multiplication sign between the mantissa an exponent. In which #. case, you can change "#215;" to "#8901;" or other unicode code #. point as appropriate. #. #. The . in this string does not and should not be changed, since #. that is taken care of by the stdc library. #. #. For information on Pango markup, see #. http://developer.gnome.org/pango/stable/PangoMarkupFormat.html #. #. For tables of unicode code points, see http://unicode.org/charts #. #: src/math/chart-geometry.c:123 #, c-format msgid "%%.%dlf×10%d" msgstr "%%.%dlf×10%d" #: src/math/histogram.c:145 msgid "" "Not creating histogram because the data contains less than 2 distinct values" msgstr "" "Impossible de créer l’histogramme car le jeu de données contient moins de " "deux valeurs." #: src/math/percentiles.c:36 msgid "HAverage" msgstr "Moyenne H" #: src/math/percentiles.c:38 msgid "Rounded" msgstr "Arrondi" #: src/math/percentiles.c:39 msgid "Empirical" msgstr "Empirique" #: src/math/percentiles.c:40 msgid "Empirical with averaging" msgstr "Empirique avec moyenne" #: src/math/shapiro-wilk.c:84 msgid "" "One or more weight values are non-integer. Fractional parts will be ignored " "when calculating the Shapiro-Wilk statistic." msgstr "" #: src/output/ascii.c:340 #, c-format msgid "ascii: opening output file `%s'" msgstr "ascii : ouverture du fichier de sortie « %s »" #: src/output/ascii.c:371 #, c-format msgid "%s: %s must be positive integer or `auto'" msgstr "%s : %s doit être un entier positif ou « auto »" #: src/output/ascii.c:393 #, fuzzy, c-format #| msgid "" #| "ascii: page excluding margins and headers must be at least %d characters " #| "wide by %d lines long, but as configured is only %d characters by %d lines" msgid "" "ascii: page must be at least %d characters wide, but as configured is only " "%d characters" msgstr "" "ascii : hors marges et en-têtes, la page doit comprendre au moins %d " "caractères en largeur et %d lignes, mais la configuration n’est que de %d " "caractères et de %d lignes" #: src/output/ascii.c:508 #, c-format msgid "See %s for a chart." msgstr "Voir %s pour le diagramme." #: src/output/charts/piechart.c:54 msgid "*MISSING*" msgstr "MANQUANT*" #: src/output/csv.c:100 src/output/html.c:117 src/output/journal.c:166 #: src/output/msglog.c:68 #, c-format msgid "error opening output file `%s'" msgstr "erreur d’ouverture du fichier de sortie « %s »" #: src/output/driver.c:522 #, c-format msgid "%s is not a valid device type (the choices are `%s' and `%s')" msgstr "" "%s n’est pas un type de périphérique valide (les choix sont « %s » et « %s »)" #: src/output/driver.c:536 #, c-format msgid "%s: unknown option `%s'" msgstr "%s : option « %s » inconnue" #: src/output/driver.c:553 #, c-format msgid "%s: output option missing `='" msgstr "%s : option de sortie manquante « = »" #: src/output/driver.c:560 #, c-format msgid "%s: output option specified more than once" msgstr "%s : option de sortie spécifiée plus d’une fois" #: src/output/html.c:129 msgid "PSPP Output" msgstr "Sortie PSPP" #: src/output/html.c:266 msgid "No description" msgstr "Aucune description" #: src/output/journal.c:69 #, c-format msgid "error writing output file `%s'" msgstr "erreur d’écriture du fichier de sortie « %s »" #: src/output/measure.c:68 #, c-format msgid "`%s' is not a valid length." msgstr "« %s » n’est pas une longueur valide." #: src/output/measure.c:96 #, c-format msgid "syntax error in paper size `%s'" msgstr "Erreur de syntaxe dans la taille du papier « %s »" #: src/output/measure.c:233 #, c-format msgid "unknown paper type `%.*s'" msgstr "Type de papier inconnu « %.*s »" #: src/output/measure.c:251 #, c-format msgid "error opening input file `%s'" msgstr "erreur d’ouverture du fichier d’entrée « %s »" #: src/output/measure.c:279 #, c-format msgid "file `%s' does not state a paper size" msgstr "fichier « %s » ne définit pas de taille de papier" #: src/output/options.c:112 #, c-format msgid "%s: `%s' is `%s' but a Boolean value is required" msgstr "%s : « %s » est « %s », mais une valeur booléenne est exigée" #: src/output/options.c:187 #, c-format msgid "%s: `%s' is `%s' but one of the following is required: %s" msgstr "%s : « %s » est « %s », mais une des suivantes est exigée : %s" #: src/output/options.c:231 #, fuzzy, c-format #| msgid "%s: `%s' is `%s' but a nonnegative integer is required" msgid "%s: `%s' is `%s' but a non-negative integer is required" msgstr "%s : « %s » est « %s », mais un entier non négatif est exigé" #: src/output/options.c:235 #, c-format msgid "%s: `%s' is `%s' but a positive integer is required" msgstr "%s : « %s » est « %s », mais un entier positif est exigé" #: src/output/options.c:238 #, c-format msgid "%s: `%s' is `%s' but an integer is required" msgstr "%s : « %s » est « %s », mais un entier est exigé" #: src/output/options.c:241 #, c-format msgid "%s: `%s' is `%s' but an integer greater than %d is required" msgstr "%s : « %s » est « %s », mais un entier supérieur à %d est exigé" #: src/output/options.c:246 #, c-format msgid "%s: `%s' is `%s' but an integer between %d and %d is required" msgstr "" "%s : « %s » est « %s », mais un entier compris entre %d et %d est exigé" #: src/output/options.c:325 #, c-format msgid "%s: `%s' is `%s' but a file name that contains `#' is required." msgstr "" "%s : « %s » est « %s », mais un nom de fichier qui contient « # » est exigé" #. TRANSLATORS: Do not translate this string. If the script of your language #. reads from right to left (eg Persian, Arabic, Hebrew etc), then replace #. this string with "output-direction-rtl". Otherwise either leave it #. untranslated or copy it verbatim. #: src/output/render.c:994 msgid "output-direction-ltr" msgstr "output-direction-ltr" #: src/output/text-item.c:44 msgid "Page Title" msgstr "" #: src/output/text-item.c:47 msgid "Title" msgstr "" #: src/output/text-item.c:51 msgid "Log" msgstr "" #: src/output/text-item.c:54 msgid "Page Break" msgstr "" #: src/output/cairo.c:520 #, c-format msgid "`%s': bad font specification" msgstr "« %s » : spécification de la police incorrecte" #: src/output/cairo.c:744 #, c-format msgid "" "The defined page is not wide enough to hold at least %d characters in the " "default font. In fact, there's only room for %d characters." msgstr "" "La page définie n’est pas assez large pour contenir au moins %d caractères " "avec la police par défaut. En fait, la place est limitée à %d caractères." #: src/output/cairo.c:752 #, c-format msgid "" "The defined page is not long enough to hold at least %d lines in the default " "font. In fact, there's only room for %d lines." msgstr "" "La page définie n’est pas assez longue pour contenir au moins %d lignes avec " "la police par défaut. En fait, la place est limitée à %d lignes." #: src/output/cairo.c:837 #, c-format msgid "error opening output file `%s': %s" msgstr "erreur d’ouverture du fichier de sortie « %s » : %s" #: src/output/cairo.c:892 #, c-format msgid "error drawing output for %s driver: %s" msgstr "Erreur de tracé en sortie pour le pilote %s : %s" #: src/output/cairo.c:2056 #, c-format msgid "error writing output file `%s': %s" msgstr "erreur d’écriture du fichier de sortie « %s » : %s" #: src/output/charts/np-plot-cairo.c:37 #, c-format msgid "Normal Q-Q Plot of %s" msgstr "Tracé Q-Q normal de %s" #: src/output/charts/np-plot-cairo.c:38 src/output/charts/np-plot-cairo.c:68 msgid "Observed Value" msgstr "valeur observée" #: src/output/charts/np-plot-cairo.c:39 msgid "Expected Normal" msgstr "Normal attendu" #: src/output/charts/np-plot-cairo.c:67 #, c-format msgid "Detrended Normal Q-Q Plot of %s" msgstr "Tracé de test normal Q-Q de %s" #: src/output/charts/np-plot-cairo.c:69 msgid "Dev from Normal" msgstr "Déviation d’une normale" #: src/output/charts/barchart-cairo.c:65 msgid "Bar Chart" msgstr "Diagramme en barres" #: src/output/charts/plot-hist-cairo.c:43 #, c-format msgid "N = %.2f" msgstr "N = %.2f" #: src/output/charts/plot-hist-cairo.c:52 #, c-format msgid "Mean = %.1f" msgstr "Signification = %.1f" #: src/output/charts/plot-hist-cairo.c:61 #, c-format msgid "Std. Dev = %.2f" msgstr "Écart-type standard = %.2f" #: src/output/charts/plot-hist-cairo.c:110 msgid "HISTOGRAM" msgstr "HISTOGRAM" #: src/output/charts/roc-chart-cairo.c:36 src/ui/gui/roc.ui:24 msgid "ROC Curve" msgstr "Courbe ROC" #: src/output/charts/scree-cairo.c:36 msgid "Scree Plot" msgstr "Tracé à l’écran" #: src/output/charts/scree-cairo.c:38 msgid "Eigenvalue" msgstr "Valeur de Eigen" #: src/output/charts/spreadlevel-cairo.c:37 #, c-format msgid "Spread vs. Level Plot of %s" msgstr "Propagation / Niveau de point de %s" #: src/output/charts/spreadlevel-cairo.c:38 msgid "Level" msgstr "Niveau" #: src/output/charts/spreadlevel-cairo.c:39 msgid "Spread" msgstr "Propagation" #: src/output/charts/scatterplot-cairo.c:57 #, c-format msgid "Scatterplot %s" msgstr "Nuage de points %s" #: src/output/spv/spv-legacy-decoder.c:2222 msgid "Table lacks cell data." msgstr "" #: src/output/spv/spv-writer.c:68 #, fuzzy, c-format #| msgid "%s: write failed" msgid "%s: create failed" msgstr "%s : erreur d’écriture " #: src/output/spv/spv-writer.c:89 #, fuzzy #| msgid "%s: error writing output file" msgid "I/O error writing SPV file" msgstr "%s : erreur d’écriture du fichier de sortie" #: src/output/spv/spv.c:693 #, fuzzy, c-format #| msgid "failed to create temporary file" msgid "%s: Failed to create XML parser" msgstr "impossible de créer un fichier temporaire" #: src/output/spv/spv.c:718 #, c-format msgid "%s: document is not well-formed" msgstr "" #: src/output/spv/spv.c:726 #, c-format msgid "%s: root node is \"%s\" but \"%s\" was expected" msgstr "" #: src/ui/gui/psppire-acr.c:273 msgid "Add" msgstr "Ajouter" #: src/ui/gui/psppire-acr.c:274 msgid "Edit" msgstr "Édition" #: src/ui/gui/psppire-acr.c:275 msgid "Remove" msgstr "Supprimer" #: src/ui/gui/psppire-buttonbox.c:311 msgid "OK" msgstr "Ok" #: src/ui/gui/psppire-buttonbox.c:319 msgid "Go To" msgstr "Aller à" #: src/ui/gui/psppire-buttonbox.c:327 msgid "Continue" msgstr "Continuer" #: src/ui/gui/psppire-buttonbox.c:339 src/ui/gui/psppire-import-assistant.c:759 msgid "Paste" msgstr "Coller" #: src/ui/gui/psppire-buttonbox.c:345 #: src/ui/gui/psppire-dialog-action-aggregate.c:216 #: src/ui/gui/psppire-data-window.c:496 src/ui/gui/psppire-data-window.c:624 #: src/ui/gui/psppire-output-window.c:353 #: src/ui/gui/psppire-syntax-window.c:594 src/ui/gui/psppire-window.c:445 #: src/ui/gui/psppire-window.c:628 msgid "Cancel" msgstr "Annuler" #: src/ui/gui/psppire-buttonbox.c:351 msgid "Close" msgstr "Fermer" #: src/ui/gui/psppire-buttonbox.c:358 src/ui/gui/psppire-import-assistant.c:760 msgid "Reset" msgstr "Effacer" #: src/ui/gui/psppire-buttonbox.c:365 msgid "Help" msgstr "Aide" #: src/ui/gui/psppire-dialog-action-aggregate.c:213 msgid "Aggregate destination file" msgstr "Agrégation du fichier de destination" #: src/ui/gui/psppire-dialog-action-aggregate.c:217 #: src/ui/gui/psppire-data-window.c:493 src/ui/gui/psppire-data-window.c:497 #: src/ui/gui/psppire-output-window.c:354 #: src/ui/gui/psppire-syntax-window.c:595 src/ui/gui/psppire-window.c:449 #: src/ui/gui/aggregate.ui:565 msgid "Save" msgstr "Enregistrer" #: src/ui/gui/psppire-dialog-action-aggregate.c:226 #: src/ui/gui/psppire-data-window.c:503 msgid "System Files (*.sav)" msgstr "Fichier système (*.sav)" #: src/ui/gui/psppire-dialog-action-aggregate.c:231 #: src/ui/gui/psppire-data-window.c:508 msgid "Compressed System Files (*.zsav)" msgstr "Fichiers système compressés (*.zsav)" #: src/ui/gui/psppire-dialog-action-aggregate.c:236 #: src/ui/gui/psppire-data-window.c:513 src/ui/gui/psppire-window.c:652 msgid "Portable Files (*.por) " msgstr "Fichier portable (*.por)" #: src/ui/gui/psppire-dialog-action-autorecode.c:337 #: src/ui/gui/psppire-dialog-action-recode.c:535 #: src/ui/gui/psppire-dialog-action-recode-different.c:288 msgid "New" msgstr "Nouveau" #: src/ui/gui/psppire-dialog-action-autorecode.c:351 #: src/ui/gui/psppire-dialog-action-recode.c:527 #: src/ui/gui/psppire-dialog-action-recode-different.c:301 msgid "Old" msgstr "Ancien" #: src/ui/gui/psppire-dialog-action-comments.c:142 #, c-format msgid "Column Number: %d" msgstr "Colonne nombre : %d" #: src/ui/gui/psppire-dialog-action-crosstabs.c:71 msgid "Chisq" msgstr "Khi-Deux" #: src/ui/gui/psppire-dialog-action-crosstabs.c:71 msgid "" "Pearson chi-square, likelihood ratio, Fisher’s exact test, continuity " "correction, linear-by-linear association." msgstr "" #: src/ui/gui/psppire-dialog-action-crosstabs.c:74 #: src/language/stats/crosstabs.q:1334 msgid "Phi" msgstr "Phi" #: src/ui/gui/psppire-dialog-action-crosstabs.c:75 msgid "CC" msgstr "CC" #: src/ui/gui/psppire-dialog-action-crosstabs.c:75 #, fuzzy #| msgid "Contingency Coefficient" msgid "Contingency coefficient" msgstr "Coefficient de contingence" #: src/ui/gui/psppire-dialog-action-crosstabs.c:77 msgid "UC" msgstr "UC" #: src/ui/gui/psppire-dialog-action-crosstabs.c:77 #, fuzzy #| msgid "Uncertainty Coefficient" msgid "Uncertainty coefficient" msgstr "Coefficient d’incertitude" #: src/ui/gui/psppire-dialog-action-crosstabs.c:78 msgid "BTau" msgstr "Tau-b" #: src/ui/gui/psppire-dialog-action-crosstabs.c:78 #, fuzzy #| msgid "Kendall's tau-b" msgid "Kendall's Tau-b" msgstr "Tau-b de Kendall" #: src/ui/gui/psppire-dialog-action-crosstabs.c:79 msgid "CTau" msgstr "Tau-c" #: src/ui/gui/psppire-dialog-action-crosstabs.c:79 #, fuzzy #| msgid "Kendall's tau-c" msgid "Kendall's Tau-c" msgstr "Tau-c de Kendall" #: src/ui/gui/psppire-dialog-action-crosstabs.c:80 msgid "Risk" msgstr "Risque" #: src/ui/gui/psppire-dialog-action-crosstabs.c:80 #, fuzzy #| msgid "Risk estimate." msgid "Relative Risk estimate" msgstr "Estimation du risque." #: src/ui/gui/psppire-dialog-action-crosstabs.c:81 #: src/language/stats/crosstabs.q:1338 msgid "Gamma" msgstr "Gamma" #: src/ui/gui/psppire-dialog-action-crosstabs.c:82 msgid "D" msgstr "D" #: src/ui/gui/psppire-dialog-action-crosstabs.c:82 #, fuzzy #| msgid "Somers' d" msgid "Somer's d" msgstr "d de Somer" #: src/ui/gui/psppire-dialog-action-crosstabs.c:83 #: src/language/stats/crosstabs.q:1344 msgid "Kappa" msgstr "Kappa" #: src/ui/gui/psppire-dialog-action-crosstabs.c:83 msgid "Cohen's Kappa" msgstr "" #: src/ui/gui/psppire-dialog-action-crosstabs.c:84 #: src/language/stats/crosstabs.q:1429 msgid "Eta" msgstr "Eta" #: src/ui/gui/psppire-dialog-action-crosstabs.c:85 msgid "Corr" msgstr "Corr" #: src/ui/gui/psppire-dialog-action-crosstabs.c:85 #, fuzzy #| msgid "Spearman Correlation" msgid "Spearman correlation, Pearson's r" msgstr "Correlation de Spearman" #: src/ui/gui/psppire-dialog-action-crosstabs.c:90 #, fuzzy #| msgid "Frequency" msgid "Frequency Count" msgstr "Fréquence" #: src/ui/gui/psppire-dialog-action-crosstabs.c:91 msgid "Row" msgstr "Ligne" #: src/ui/gui/psppire-dialog-action-crosstabs.c:91 #, fuzzy #| msgid "Percent" msgid "Row percent" msgstr "%" #: src/ui/gui/psppire-dialog-action-crosstabs.c:92 msgid "Column" msgstr "Colonne" #: src/ui/gui/psppire-dialog-action-crosstabs.c:92 #, fuzzy #| msgid "Cum Percent" msgid "Column percent" msgstr "Pourcentage cumulé" #: src/ui/gui/psppire-dialog-action-crosstabs.c:93 #, fuzzy #| msgid "Valid Percent" msgid "Total percent" msgstr "Pourcentage valide" #: src/ui/gui/psppire-dialog-action-crosstabs.c:94 #: src/language/stats/crosstabs.q:1266 msgid "Expected" msgstr "Attendu(e)" #: src/ui/gui/psppire-dialog-action-crosstabs.c:94 #, fuzzy #| msgid "Expected Values:" msgid "Expected value" msgstr "Valeurs attendues :" #: src/ui/gui/psppire-dialog-action-crosstabs.c:96 #: src/language/stats/crosstabs.q:1268 msgid "Std. Residual" msgstr "Résidus standardisés" #: src/ui/gui/psppire-dialog-action-crosstabs.c:96 #, fuzzy #| msgid "Std. Residual" msgid "Standardized Residual" msgstr "Résidus standardisés" #: src/ui/gui/psppire-dialog-action-crosstabs.c:97 msgid "Adjusted Std. Residual" msgstr "Résidus standardisés, ajustés" #: src/ui/gui/psppire-dialog-action-descriptives.c:45 msgid "Standard error" msgstr "Erreur standard" #: src/ui/gui/psppire-dialog-action-descriptives.c:45 #, fuzzy #| msgid "Standard error of the mean" msgid "Standard error of mean" msgstr "Erreur standard de la moyenne" #: src/ui/gui/psppire-dialog-action-descriptives.c:47 #, fuzzy #| msgid "Standard error of the kurtosis" msgid "Kurtosis and standard error of kurtosis" msgstr "Erreur standard de l’aplatissement" #: src/ui/gui/psppire-dialog-action-descriptives.c:48 #, fuzzy #| msgid "Standard error of the skewness" msgid "Skewness and standard error of skewness" msgstr "Erreur standard de l’asymétrie" # ??? #: src/ui/gui/psppire-dialog-action-factor.c:323 #, c-format msgid "_Eigenvalues over %4.2f times the mean eigenvalue" msgstr "Les valeurs de _Eigen sont %4.2f fois la valeur moyenne de Eigen" #: src/ui/gui/psppire-dialog-action-frequencies.c:44 msgid "Standard error of the mean" msgstr "Erreur standard de la moyenne" #: src/ui/gui/psppire-dialog-action-frequencies.c:47 msgid "Standard error of the skewness" msgstr "Erreur standard de l’asymétrie" #: src/ui/gui/psppire-dialog-action-frequencies.c:51 msgid "Standard error of the kurtosis" msgstr "Erreur standard de l’aplatissement" #: src/ui/gui/psppire-dialog-action-oneway.c:175 #, c-format msgid "Contrast %d of %d" msgstr "Contraste %d de %d" #: src/ui/gui/psppire-dialog-action-paired.c:162 src/ui/gui/examine.ui:282 #: src/ui/gui/indep-samples.ui:334 src/ui/gui/t-test.ui:296 msgid "O_ptions..." msgstr "O_ptions…" #: src/ui/gui/psppire-dialog-action-paired.c:168 msgid "Paired Samples T Test" msgstr "Test T pour Échantillons Appariés" #: src/ui/gui/psppire-dialog-action-recode-different.c:327 msgid "Recode into Different Variables" msgstr "Recode en différentes variables" #: src/ui/gui/psppire-dialog-action-recode-different.c:330 msgid "Recode into Different Variables: Old and New Values " msgstr "Recode en différentes variables : anciennes et nouvelles valeurs" #: src/ui/gui/psppire-dialog-action-recode-same.c:108 src/ui/gui/recode.ui:391 msgid "Recode into Same Variables" msgstr "Recode en une même variable" #: src/ui/gui/psppire-dialog-action-recode-same.c:114 msgid "Recode into Same Variables: Old and New Values" msgstr "Recode en une même variable : anciennes et nouvelles valeurs" #: src/ui/gui/psppire-dialog-action-regression.c:40 msgid "Coeff" msgstr "Coefficient" #: src/ui/gui/psppire-dialog-action-regression.c:40 msgid "Show the regression coefficients" msgstr "Affiche les coefficients de régression" #: src/ui/gui/psppire-dialog-action-regression.c:41 msgid "Conf. Interval" msgstr "Intervalle de confiance" #: src/ui/gui/psppire-dialog-action-regression.c:41 msgid "Show the confidence interval for the regression coefficients" msgstr "Affiche l’intervalle de confiance pour les coefficients de régression" #: src/ui/gui/psppire-dialog-action-regression.c:42 msgid "Show the correlation between observed and predicted values" msgstr "Affiche la corrélation entre les valeurs observées et prédites" #: src/ui/gui/psppire-dialog-action-regression.c:43 msgid "Anova" msgstr "ANOVA" #: src/ui/gui/psppire-dialog-action-regression.c:43 msgid "Show the analysis of variance table" msgstr "Affiche l’analyse de la table de variance" #: src/ui/gui/psppire-dialog-action-regression.c:44 msgid "Bcov" msgstr "Bcov" #: src/ui/gui/psppire-dialog-action-regression.c:44 msgid "Show the variance coefficient matrix" msgstr "Affiche la matrice de coefficient de variance" #: src/ui/gui/psppire-dialog-action-regression.c:45 #, fuzzy #| msgid "Total" msgid "Tol" msgstr "Total" #: src/ui/gui/psppire-dialog-action-regression.c:45 #, fuzzy #| msgid "Show the variance coefficient matrix" msgid "Show the variance inflation factor and its reciprocal" msgstr "Affiche la matrice de coefficient de variance" #: src/ui/gui/psppire-dialog-action-select.c:88 #, c-format msgid "Approximately %3d%% of all cases." msgstr "Approximativement %3d%% de toutes les observations." #: src/ui/gui/psppire-dialog-action-select.c:89 #, c-format msgid "Exactly %3d cases from the first %3d cases." msgstr "Exactement %3d observations à partir des %3d premières observations." #: src/ui/gui/psppire-dialog-action-select.c:236 #, c-format msgid "%d thru %d" msgstr "%d à %d" #: src/ui/gui/psppire-dialog-action-two-sample.c:180 #: src/ui/gui/k-independent.ui:404 src/ui/gui/k-related.ui:197 msgid "Test Type" msgstr "Type du texte" #: src/ui/gui/psppire-dialog-action-two-sample.c:189 msgid "_Wilcoxon" msgstr "_Wilcoxon" #: src/ui/gui/psppire-dialog-action-two-sample.c:190 msgid "_Sign" msgstr "_Signe" #: src/ui/gui/psppire-dialog-action-two-sample.c:191 msgid "_McNemar" msgstr "_McNemar" #: src/ui/gui/psppire-dialog-action-two-sample.c:209 msgid "Two-Related-Samples Tests" msgstr "Tests de deux échantillons connexes" #: src/ui/gui/psppire-dialog-action-weight.c:74 src/ui/gui/weight.ui:83 #: src/ui/gui/weight.ui:211 msgid "Do not weight cases" msgstr "Ne pas pondérer les observations" #: src/ui/gui/psppire-dialog-action-weight.c:80 #, c-format msgid "Weight cases by %s" msgstr "Pondération des observations par %s" #: src/ui/gui/psppire-dict.c:95 msgid "Var" msgstr "Var" #. TRANSLATORS: This string must be a valid variable name. That means: #. - The string must be at most 64 bytes (not characters) long. #. - The string may not contain whitespace. #. - The first character may not be '$' #. - The first character may not be a digit #. - The final character may not be '.' or '_' #. #: src/ui/gui/psppire-dict.c:385 #, c-format msgid "Var%04d" msgstr "Var%04d" #: src/ui/gui/psppire-dict.c:566 msgid "Duplicate variable name." msgstr "Nom de variable dupliqué." #: src/ui/gui/psppire-dictview.c:617 msgid "Prefer variable labels" msgstr "Choisir les étiquettes de variable" #: src/ui/gui/psppire-dictview.c:631 msgid "Default sort order" msgstr "Ordre de tri pas défaut" #: src/ui/gui/psppire-dictview.c:637 msgid "Unsorted (dictionary order)" msgstr "Trier par" #: src/ui/gui/psppire-dictview.c:642 msgid "Sort by name" msgstr "Tri par noms" #: src/ui/gui/psppire-dictview.c:647 msgid "Sort by label" msgstr "Trier par étiquette" #: src/ui/gui/psppire-means-layer.c:95 #, c-format msgid "Layer %d of %d" msgstr "Couche %d de %d" #: src/ui/gui/psppire-means-layer.c:169 msgid "Forward" msgstr "Avant" #: src/ui/gui/psppire-means-layer.c:170 msgid "Back" msgstr "Arrière" #: src/ui/gui/psppire-text-file.c:55 #, c-format msgid "Could not open `%s'" msgstr "Impossible d’ouvrir « %s »" #: src/ui/gui/psppire-text-file.c:71 #, c-format msgid "Error reading `%s': %s" msgstr "Erreur de lecture de « %s » : %s" #: src/ui/gui/psppire-text-file.c:74 #, c-format msgid "" "Failed to read `%s', because it contains a line over %d bytes long and " "therefore appears not to be a text file." msgstr "" "Impossible de lire « %s », car il contient une ligne dépassant %d caractères " "et semble donc ne pas être un fichier texte." #: src/ui/gui/psppire-text-file.c:96 #, c-format msgid "`%s' is empty." msgstr "%s est vide." #: src/ui/gui/psppire-val-chooser.c:255 msgid "through" msgstr "à" #: src/ui/gui/psppire-val-chooser.c:288 msgid "_Value:" msgstr "_Valeur :" #: src/ui/gui/psppire-val-chooser.c:289 msgid "_System Missing" msgstr "_Système manquant" #: src/ui/gui/psppire-val-chooser.c:290 msgid "System _or User Missing" msgstr "Système _ou utilisateur manquant" #: src/ui/gui/psppire-val-chooser.c:291 msgid "_Range:" msgstr "_Intervalle :" #: src/ui/gui/psppire-val-chooser.c:292 msgid "Range, _LOWEST thru value" msgstr "Intervalle, IN_FÉRIEUR à la valeur" #: src/ui/gui/psppire-val-chooser.c:293 msgid "Range, value thru _HIGHEST" msgstr "Intervalle, _SUPÉRIEUR à la valeur" #: src/ui/gui/psppire-val-chooser.c:294 msgid "_All other values" msgstr "_Toutes les autres valeurs" #: src/ui/gui/psppire-var-view.c:153 #, c-format msgid "Var%d" msgstr "Var%d" #: src/ui/source-init-opts.c:72 #, c-format msgid "Algorithm must be either `%s' or `%s'." msgstr "L’algorithme doit être « %s » ou « %s »." #: src/ui/source-init-opts.c:97 #, c-format msgid "Syntax must be either `%s' or `%s'." msgstr "La syntaxe doit être « %s » ou « %s »." #: src/ui/terminal/main.c:144 msgid "Error encountered while ERROR=STOP is effective." msgstr "L’erreur rencontrée lors d’un ERROR=STOP est effective." #: src/ui/terminal/main.c:150 msgid "" "Stopping syntax file processing here to avoid a cascade of dependent command " "failures." msgstr "" "Abandon de l’analyse syntaxique sur le fichier pour éviter les échecs en " "cascade des commandes ." #: src/ui/terminal/terminal-opts.c:147 #, c-format msgid "" "PSPP, a program for statistical analysis of sampled data.\n" "Usage: %s [OPTION]... FILE...\n" "\n" "Arguments to long options also apply to equivalent short options.\n" "\n" "Output options:\n" " -o, --output=FILE output to FILE, default format from FILE's name\n" " -O format=FORMAT override format for previous -o\n" " -O OPTION=VALUE set output option to customize previous -o\n" " -O device={terminal|listing} override device type for previous -o\n" " -e, --error-file=FILE append errors, warnings, and notes to FILE\n" " --no-output disable default output driver\n" "Supported output formats: %s\n" "\n" "Language options:\n" " -I, --include=DIR append DIR to search path\n" " -I-, --no-include clear search path\n" " -r, --no-statrc disable running rc file at startup\n" " -a, --algorithm={compatible|enhanced}\n" " set to `compatible' if you want output\n" " calculated from broken algorithms\n" " -x, --syntax={compatible|enhanced}\n" " set to `compatible' to disable PSPP extensions\n" " -b, --batch interpret syntax in batch mode\n" " -i, --interactive interpret syntax in interactive mode\n" " --syntax-encoding=ENCODING specify encoding for syntax files\n" " -s, --safer don't allow some unsafe operations\n" "Default search path: %s\n" "\n" "Informative output:\n" " -h, --help display this help and exit\n" " -V, --version output version information and exit\n" "\n" "Non-option arguments are interpreted as syntax files to execute.\n" msgstr "" "PSPP, logiciel d’analyse statistique d’échantillons de données.\n" "Utilisation : %s [OPTION]… FICHIER…\n" "\n" "Les arguments des options longues s’appliquent également aux options " "courtes.\n" "\n" "Options de sortie :\n" " -o, --output=FICHIER fichier de sortie FICHIER, format par défaut " "défini par le nom de FICHIER\n" " -O format=FORMAT force le FORMAT du FICHIER pour -o\n" " -O OPTION=VALEUR définit l’option de sortie pour -o\n" " -O device={terminal|listing} réécrit le type de périphérique précédent " "défini par -o\n" " -e, --error-file=FICHIER ajoute les erreurs, avertissements et notes à " "FICHIER\n" " --no-output désactive le gestionnaire de sortie par " "défaut\n" "Formats de sortie supportés : %s\n" "\n" "Options de la syntaxe :\n" " -I, --include=DIR ajoute DIR au chemin de recherche\n" " -I-, --no-include efface le chemin de recherche\n" " -r, --no-statrc désactive le fichier rc actuel au lancement\n" " -a, --algorithm={compatible|enhanced}\n" " choisir 'compatible' si vous désirez une " "sortie calculée\n" " à partir d’algorithmes endommagés\n" " -x, --syntax={compatible|enhanced}\n" " choisir 'compatible' pour désactiver les " "extensions PSPP\n" " -b, --batch interprète la syntaxe en mode lots\n" " -i, --interactive interprète la syntaxe en mode interactif\n" " --syntax-encoding=ENCODAGE spécifie l’encodage des fichiers de syntaxe\n" " -s, --safer n’autorise pas quelques opérations peu sûres\n" "Chemin de recherche par défaut : %s\n" "\n" "Sortie d’information :\n" " -h, -help affiche cette aide et quitte\n" " -V, --version affiche les informations de version et " "quitte\n" "\n" "Les arguments sans options sont interprétés comme fichiers de syntaxe à " "exécuter.\n" #: src/ui/gui/find-dialog.c:197 msgid "Find" msgstr "Rechercher" #: src/ui/gui/find-dialog.c:662 #, c-format msgid "Bad regular expression: %s" msgstr "Expression régulière incorrecte: %s" #: src/ui/gui/help-menu.c:70 msgid "A program for the analysis of sampled data" msgstr "Un logiciel pour l’analyse d’échantillons de données" #. TRANSLATORS: Do not translate this string. Instead, put the names of the people #. who have helped in the translation. #: src/ui/gui/help-menu.c:80 msgid "translator-credits" msgstr "" "John Darrington , 2007\n" "Jean-Alain Meunier , 2012\n" "Eric Thivant , 2016\n" "Stéphane Aulery , 2016, 2017, 2019" #: src/ui/gui/help-menu.c:170 #, c-format msgid "Help path conversion error: %s" msgstr "Erreur de conversion du chemin d’aide : %s" #: src/ui/gui/help-menu.c:197 #, fuzzy, c-format #| msgid "" #| "Cannot open reference manual via yelp: %s. Cannot open via html: %s with " #| "uri: %s The PSSP manual is also available at %s" msgid "" "Cannot open via html: %s with uri: %s The PSSP manual is also available at %s" msgstr "" "Impossible d’ouvrir le manuel de référence via yelp : %s. Impossible " "d’ouvrir via html : %s avec l’URI %s. Le manuel utilisateur de PSPP est " "aussi disponible à l’adressse %s" #: src/ui/gui/help-menu.c:218 msgid "_Help" msgstr "_Aide" #: src/ui/gui/help-menu.c:221 msgid "_About" msgstr "À _propos…" #: src/ui/gui/help-menu.c:222 msgid "_Reference Manual" msgstr "_Manuel de Référence" #: src/ui/gui/main.c:306 msgid "Show version information and exit" msgstr "Afficher la version et quitter" #: src/ui/gui/main.c:409 msgid "Do not display the splash screen" msgstr "Ne pas afficher l’écran de démarrage" #: src/ui/gui/main.c:411 msgid "Do not attempt single instance negotiation" msgstr "Ne pas négocier une instance unique" #: src/ui/gui/missing-val-dialog.c:217 msgid "" "The maximum length of a missing value for a string variable is 8 in UTF-8." msgstr "" "La longueur maximale d’une valeur manquante pour une de chaîne caractères " "est de 8 en UTF-8." #: src/ui/gui/missing-val-dialog.c:268 msgid "At least one value must be specified" msgstr "Au moins une valeur doit être spécifiée" #: src/ui/gui/missing-val-dialog.c:298 msgid "Incorrect range specification" msgstr "Spécification d’intervalle incorrecte" #: src/ui/gui/psppire-data-editor.c:380 #, c-format msgid "%d : %s" msgstr "%d : %s" #: src/ui/gui/psppire-data-editor.c:391 #, c-format msgid "%'d case" msgid_plural "%'d cases" msgstr[0] "%'d cas" msgstr[1] "%'d cas" #: src/ui/gui/psppire-data-editor.c:396 #, c-format msgid "%'d variable" msgid_plural "%'d variables" msgstr[0] "%'d variable" msgstr[1] "%'d variables" #: src/ui/gui/psppire-data-editor.c:485 msgid "Case" msgstr "Cas" #: src/ui/gui/psppire-data-editor.c:495 msgid "Data View" msgstr "Affichage des données" #: src/ui/gui/psppire-data-editor.c:505 msgid "Variable View" msgstr "Affichage des variables" #: src/ui/gui/psppire-data-sheet.c:171 src/ui/gui/psppire-data-window.c:1338 msgid "_Insert Case" msgstr "Insérer un _cas" #: src/ui/gui/psppire-data-sheet.c:179 src/ui/gui/psppire-data-window.c:1391 msgid "Cl_ear Cases" msgstr "_Supprimer les Observations" #: src/ui/gui/psppire-data-sheet.c:305 src/ui/gui/psppire-data-window.c:1337 #: src/ui/gui/psppire-variable-sheet.c:274 msgid "_Insert Variable" msgstr "Insérer une _variable" #: src/ui/gui/psppire-data-sheet.c:314 src/ui/gui/psppire-variable-sheet.c:283 msgid "Cl_ear Variables" msgstr "_Effacer des variables" #: src/ui/gui/psppire-data-sheet.c:326 msgid "Sort _Ascending" msgstr "Tri _croissante" #: src/ui/gui/psppire-data-sheet.c:333 msgid "Sort _Descending" msgstr "Tri _décroissante" #: src/ui/gui/psppire-data-window.c:175 msgid "Transformations Pending" msgstr "Transformations en cours" #: src/ui/gui/psppire-data-window.c:191 msgid "Filter off" msgstr "Filtre désactivé" #: src/ui/gui/psppire-data-window.c:203 #, c-format msgid "Filter by %s" msgstr "Filtré par %s" #: src/ui/gui/psppire-data-window.c:224 msgid "No Split" msgstr "Aucune scission" #: src/ui/gui/psppire-data-window.c:233 msgid "Split by " msgstr "Scission par " #: src/ui/gui/psppire-data-window.c:261 msgid "Weights off" msgstr "Pondération désactivée" #: src/ui/gui/psppire-data-window.c:273 #, c-format msgid "Weight by %s" msgstr "Pondéré par %s" #: src/ui/gui/psppire-data-window.c:518 #: src/ui/gui/psppire-import-assistant.c:681 #: src/ui/gui/psppire-syntax-window.c:607 src/ui/gui/psppire-window.c:669 msgid "All Files" msgstr "Tous les fichiers" #: src/ui/gui/psppire-data-window.c:535 msgid "System File" msgstr "Fichier système" #: src/ui/gui/psppire-data-window.c:542 msgid "Compressed System File" msgstr "Fichier système compressé" #: src/ui/gui/psppire-data-window.c:548 msgid "Portable File" msgstr "Fichier portable" #: src/ui/gui/psppire-data-window.c:551 msgid "Format:" msgstr "Format :" #: src/ui/gui/psppire-data-window.c:615 msgid "Delete Existing Dataset?" msgstr "Effacer le jeu de données existant ?" #: src/ui/gui/psppire-data-window.c:619 #, c-format msgid "" "Renaming \"%s\" to \"%s\" will destroy the existing dataset named \"%s\". " "Are you sure that you want to do this?" msgstr "" "Renommer « %s » en « %s » supprimera le jeu de données existant nommé " "« %s ». Êtes-vous sûr de vouloir le faire ?" #: src/ui/gui/psppire-data-window.c:625 msgid "Delete" msgstr "Effacé" #: src/ui/gui/psppire-data-window.c:647 #, c-format msgid "Please enter a new name for dataset \"%s\":" msgstr "Veuillez entrer un nouveau nom pour le jeu de données « %s » :" #: src/ui/gui/psppire-data-window.c:649 msgid "Rename Dataset" msgstr "Renommer le jeu de données" #: src/ui/gui/psppire-data-window.c:1199 src/ui/gui/output-window.ui:68 #: src/ui/gui/syntax-editor.ui:22 msgid "_File" msgstr "_Fichier" #: src/ui/gui/psppire-data-window.c:1203 src/ui/gui/syntax-editor.ui:25 msgid "_New" msgstr "_Nouveau" #: src/ui/gui/psppire-data-window.c:1210 msgid "_Syntax" msgstr "_Syntaxe" #: src/ui/gui/psppire-data-window.c:1213 src/ui/gui/data-editor.ui:177 #: src/ui/gui/data-editor.ui:189 msgid "_Data" msgstr "_Données" #: src/ui/gui/psppire-data-window.c:1220 src/ui/gui/syntax-editor.ui:36 msgid "_Open" msgstr "_Ouvrir" #: src/ui/gui/psppire-data-window.c:1223 msgid "_Import Data..." msgstr "_Importer des données textuelles…" #: src/ui/gui/psppire-data-window.c:1231 src/ui/gui/logistic.ui:261 #: src/ui/gui/regression.ui:66 msgid "_Save..." msgstr "Enregi_strer…" #: src/ui/gui/psppire-data-window.c:1234 msgid "Save _As..." msgstr "Enregistrer _sous…" #: src/ui/gui/psppire-data-window.c:1237 msgid "_Rename Dataset..." msgstr "_Renommer le jeu de données…" #: src/ui/gui/psppire-data-window.c:1248 msgid "_Display Data File Information" msgstr "Affichage des _informations du fichier de données " #: src/ui/gui/psppire-data-window.c:1255 msgid "Working File" msgstr "Fichier de _travail" #: src/ui/gui/psppire-data-window.c:1257 msgid "_External File..." msgstr "Fichier e_xterne…" #: src/ui/gui/psppire-data-window.c:1267 msgid "_Recently Used Data" msgstr "_Données récemment utilisées" #: src/ui/gui/psppire-data-window.c:1268 msgid "Recently Used _Files" msgstr "_Fichiers récemment utilisés" #: src/ui/gui/psppire-data-window.c:1315 src/ui/gui/output-window.ui:82 #: src/ui/gui/syntax-editor.ui:59 msgid "_Quit" msgstr "_Quitter" #: src/ui/gui/psppire-data-window.c:1333 src/ui/gui/output-window.ui:89 #: src/ui/gui/syntax-editor.ui:66 msgid "_Edit" msgstr "_Edition" #: src/ui/gui/psppire-data-window.c:1339 msgid "_Go To Variable..." msgstr "A_ller à la variable…" #: src/ui/gui/psppire-data-window.c:1340 msgid "_Go To Case..." msgstr "_Aller à l’observation…" #: src/ui/gui/psppire-data-window.c:1364 src/ui/gui/syntax-editor.ui:69 msgid "Cu_t" msgstr "Co_uper" # _Copier #: src/ui/gui/psppire-data-window.c:1373 src/ui/gui/output-window.ui:96 #: src/ui/gui/syntax-editor.ui:74 msgid "_Copy" msgstr "Co_pier" #: src/ui/gui/psppire-data-window.c:1380 src/ui/gui/syntax-editor.ui:79 msgid "_Paste" msgstr "Co_ller" #: src/ui/gui/psppire-data-window.c:1387 msgid "Clear _Variables" msgstr "_Effacer des variables" #: src/ui/gui/psppire-data-window.c:1401 msgid "_Find..." msgstr "_Rechercher…" #: src/ui/gui/psppire-data-window.c:1407 src/ui/gui/logistic.ui:246 msgid "_Options..." msgstr "_Options…" #: src/ui/gui/psppire-data-window.c:1676 msgid "Jump to variable" msgstr "Aller à la variable " #: src/ui/gui/psppire-data-window.c:1689 msgid "Jump to a case in the data sheet" msgstr "Aller à une observation de la feuille de données " #: src/ui/gui/psppire-data-window.c:1703 msgid "Search for values in the data" msgstr "Rechercher les valeurs dans le jeu de données actif" #: src/ui/gui/psppire-data-window.c:1715 msgid "Create a new case at the current position" msgstr "Création d’une nouvelle observation à la position actuelle" #: src/ui/gui/psppire-data-window.c:1727 msgid "Create a new variable at the current position" msgstr "Création d’une nouvelle variable à la position actuelle" #: src/ui/gui/psppire-data-window.c:1741 msgid "Split the active dataset" msgstr "Scinder le jeu de données actif" #: src/ui/gui/psppire-data-window.c:1753 msgid "Weight cases by variable" msgstr "Pondération des observations par variable" #: src/ui/gui/psppire-data-window.c:1764 msgid "Show/hide value labels" msgstr "Montrer/Cacher les étiquettes des valeurs" #: src/ui/gui/psppire-data-window.c:1904 msgid "Data Editor" msgstr "Éditeur de données" #: src/ui/gui/psppire-encoding-selector.c:140 msgid "Automatically Detect" msgstr "Détecté automatiquement" #: src/ui/gui/psppire-encoding-selector.c:147 msgid "Locale Encoding" msgstr "Encodage local" #: src/ui/gui/psppire-encoding-selector.c:177 msgid "Character Encoding: " msgstr "Encodage de caractères : " #: src/ui/gui/psppire-import-assistant.c:337 msgid "line" msgstr "ligne" #: src/ui/gui/psppire-import-assistant.c:347 msgid "var" msgstr "var" #: src/ui/gui/psppire-import-assistant.c:560 msgid "Importing Spreadsheet Data" msgstr "Importation de données de tableur" #: src/ui/gui/psppire-import-assistant.c:686 msgid "Text Files" msgstr "Fichiers texte" #: src/ui/gui/psppire-import-assistant.c:691 msgid "Text (*.txt) Files" msgstr "Fichiers texte (*.txt)" #: src/ui/gui/psppire-import-assistant.c:697 msgid "Plain Text (ASCII) Files" msgstr "Fichiers texte (ASCII)" #: src/ui/gui/psppire-import-assistant.c:702 msgid "Comma Separated Value Files" msgstr "Fichiers de valeurs séparées par une virgule (*.csv)" #: src/ui/gui/psppire-import-assistant.c:709 msgid "Tab Separated Value Files" msgstr "Fichiers de valeurs séparées par une tabulation (*.csv)" #: src/ui/gui/psppire-import-assistant.c:714 msgid "Gnumeric Spreadsheet Files" msgstr "Fichiers de tableur Gnumeric" #: src/ui/gui/psppire-import-assistant.c:719 msgid "OpenDocument Spreadsheet Files" msgstr "Fichiers de tableur OpenDocument" #: src/ui/gui/psppire-import-assistant.c:724 msgid "All Spreadsheet Files" msgstr "Tous les fichiers de tableur" #: src/ui/gui/psppire-import-assistant.c:733 msgid "Select File to Import" msgstr "Sélection un fichier à importer" #: src/ui/gui/psppire-import-assistant.c:770 msgid "Importing Delimited Text Data" msgstr "Importation des données en texte délimité" #: src/ui/gui/psppire-import-assistant.c:865 msgid "Select the First Line" msgstr "Sélection la première ligne" #: src/ui/gui/psppire-import-assistant.c:877 msgid "Line" msgstr "Ligne" #: src/ui/gui/psppire-import-assistant.c:931 msgid "" "This assistant will guide you through the process of importing data into " "PSPP from a text file with one line per case, in which fields are separated " "by tabs, commas, or other delimiters.\n" "\n" msgstr "" "Cet assistant vous guidera au long du processus d’importation de données " "dans PSPP à partir d’un fichier texte contenant une ligne par observation. " "Les champs sont séparés par des tabulations, des virgules ou d’autres " "délimiteurs.\n" "\n" #: src/ui/gui/psppire-import-assistant.c:941 #, c-format msgid "The selected file contains %'lu line of text. " msgid_plural "The selected file contains %'lu lines of text. " msgstr[0] "Le fichier sélectionné contient %'lu ligne de texte." msgstr[1] "Le fichier sélectionné contient %'lu lignes de texte." #: src/ui/gui/psppire-import-assistant.c:950 #, c-format msgid "The selected file contains approximately %'lu line of text. " msgid_plural "The selected file contains approximately %'lu lines of text. " msgstr[0] "Le fichier sélectionné contient environ %'lu ligne de texte." msgstr[1] "Le fichier sélectionné contient environ %'lu lignes de texte." #: src/ui/gui/psppire-import-assistant.c:956 #, c-format msgid "" "Only the first %zu line of the file will be shown for preview purposes in " "the following screens. " msgid_plural "" "Only the first %zu lines of the file will be shown for preview purposes in " "the following screens. " msgstr[0] "" "Seule la %zu première ligne du fichier sera affichée à des fins de " "prévisualisation dans les écrans suivants. " msgstr[1] "" "Seules les %zu premières lignes du fichier seront affichées à des fins de " "prévisualisation dans les écrans suivants. " #: src/ui/gui/psppire-import-assistant.c:965 msgid "You may choose below how much of the file should actually be imported." msgstr "" "Vous pouvez choisir ci-dessous quelle partie du fichier peut être importée " "maintenant." #: src/ui/gui/psppire-import-assistant.c:974 #, c-format msgid "Only the first %4d cases" msgstr "Seules les %4d premières observations" #: src/ui/gui/psppire-import-assistant.c:985 #, c-format msgid "Only the first %3d %% of file (approximately)" msgstr "Seulement le premier %3d %% de fichier (approximativement)" #: src/ui/gui/psppire-import-assistant.c:1009 msgid "Select the Lines to Import" msgstr "Sélection des lignes à importer" #: src/ui/gui/psppire-import-assistant.c:1151 msgid "Choose Separators" msgstr "Choix des séparateurs" #: src/ui/gui/psppire-import-assistant.c:1438 msgid "Adjust Variable Formats" msgstr "Ajuster le format des variables" #: src/ui/gui/psppire-output-view.c:410 msgid "Message" msgstr "Message" #: src/ui/gui/psppire-output-view.c:543 msgid "failed to create temporary directory during clipboard operation" msgstr "erreur de création de répertoire temporaire pendant le coiper-coller" #: src/ui/gui/psppire-output-window.c:241 msgid "Infer file type from extension" msgstr "Déduit le type de fichier à partir de l’extension" #: src/ui/gui/psppire-output-window.c:242 msgid "SPSS Viewer (*.spv)" msgstr "" #: src/ui/gui/psppire-output-window.c:243 msgid "PDF (*.pdf)" msgstr "PDF (*.pdf)" #: src/ui/gui/psppire-output-window.c:244 msgid "HTML (*.html)" msgstr "HTML (*.html)" #: src/ui/gui/psppire-output-window.c:245 msgid "OpenDocument (*.odt)" msgstr "OpenDocument (*.odt)" #: src/ui/gui/psppire-output-window.c:246 msgid "Text (*.txt)" msgstr "Texte (*.txt)" #: src/ui/gui/psppire-output-window.c:247 msgid "Text [plain] (*.txt)" msgstr "Texte [plain] (*.txt)" #: src/ui/gui/psppire-output-window.c:248 msgid "PostScript (*.ps)" msgstr "Postscript (*.ps)" #: src/ui/gui/psppire-output-window.c:249 msgid "Comma-Separated Values (*.csv)" msgstr "Valeurs séparées par une virgule (*.csv)" #: src/ui/gui/psppire-output-window.c:350 msgid "Export Output" msgstr "Exportation" #: src/ui/gui/psppire-output-window.c:548 msgid "Output Viewer" msgstr "Visualisation en sortie" #: src/ui/gui/psppire-spreadsheet-model.c:237 msgid "(empty)" msgstr "(vide)" #: src/ui/gui/psppire-syntax-window.c:226 msgid "Text Search" msgstr "" #: src/ui/gui/psppire-syntax-window.c:229 #, fuzzy #| msgid "OK" msgid "_OK" msgstr "Ok" #: src/ui/gui/psppire-syntax-window.c:231 #, fuzzy #| msgid "Cancel" msgid "_Cancel" msgstr "Annuler" #: src/ui/gui/psppire-syntax-window.c:239 msgid "Text to search for:" msgstr "" #: src/ui/gui/psppire-syntax-window.c:570 #, c-format msgid "Saved file `%s'" msgstr "Fichier enregistré « %s »" #: src/ui/gui/psppire-syntax-window.c:591 msgid "Save Syntax" msgstr "Enregistre la syntaxe" #: src/ui/gui/psppire-syntax-window.c:601 src/ui/gui/psppire-window.c:657 msgid "Syntax Files (*.sps) " msgstr "Fichier de syntaxe (*.sps)" #: src/ui/gui/psppire-syntax-window.c:970 msgid "Syntax Editor" msgstr "Éditeur de syntaxe" #: src/ui/gui/psppire-syntax-window.c:990 #, c-format msgid "Cannot load syntax file `%s'" msgstr "Impossible de charger le fichier de syntaxe « %s »" #: src/ui/gui/psppire-variable-sheet.c:412 #, c-format msgid "{%s, %s}..." msgstr "{%s, %s}…" #: src/ui/gui/psppire-var-sheet-header.c:64 msgid "Decimal" msgstr "Décimal" #: src/ui/gui/psppire-var-sheet-header.c:79 msgid "Align" msgstr "Alignement" #: src/ui/gui/psppire-var-sheet-header.c:82 msgid "Measure" msgstr "Mesure" #: src/ui/gui/psppire-window.c:430 #, c-format msgid "Save the changes to `%s' before closing?" msgstr "Enregistrer les changements à « %s » avant la fermeture ?" #: src/ui/gui/psppire-window.c:437 #, c-format msgid "" "If you don't save, changes from the last %ld seconds will be permanently " "lost." msgstr "" "Si vous ne sauvegardez pas, les modifications depuis les %ld secondes seront " "définitivement perdues." #: src/ui/gui/psppire-window.c:441 msgid "Close _without saving" msgstr "_Fermer sans enregistrer" #: src/ui/gui/psppire-window.c:625 src/ui/gui/psppire-window.c:629 msgid "Open" msgstr "Ouvrir" #: src/ui/gui/psppire-window.c:634 msgid "Data and Syntax Files" msgstr "Fichiers de données et de syntaxe" #: src/ui/gui/psppire-window.c:646 msgid "System Files (*.sav, *.zsav)" msgstr "Fichiers système (*.sav, *.zsav)" #: src/ui/gui/psppire-window.c:663 #, fuzzy #| msgid "Syntax Files (*.sps) " msgid "Output Files (*.spv) " msgstr "Fichier de syntaxe (*.sps)" #: src/ui/gui/t-test-options.c:65 #, c-format msgid "Con_fidence Interval: %2d %%" msgstr "Intervalle de con_fiance : %2d %%" #: src/ui/gui/val-labs-dialog.c:591 #, c-format msgid "%s = `%s'" msgstr "%s = « %s »" #: src/ui/gui/var-type-dialog.c:541 #, fuzzy #| msgid "Compute Variable: Type and Label" msgid "Variable Type and Format" msgstr "Variable calculée : type et titre" #: src/ui/gui/windows-menu.c:92 msgid "_Minimize all Windows" msgstr "_Icônifier toutes les fenêtres" #: src/ui/gui/windows-menu.c:100 msgid "_Split" msgstr "_Scinder" #: src/ui/gui/windows-menu.c:132 msgid "_Windows" msgstr "_Fenêtres" #: utilities/pspp-convert.c:67 #, c-format msgid "%s argument must be a single character" msgstr "" #: utilities/pspp-convert.c:265 msgid "exactly two non-option arguments are required; use --help for help" msgstr "" "Exactement deux arguments sans option sont requis ; Utiliser --help pour " "l’aide" #: utilities/pspp-convert.c:276 #, c-format msgid "%s: cannot guess output format (use -O option)" msgstr "%s : impossible de deviner le format de sortie (utiliser l’option -O)" #: utilities/pspp-convert.c:341 #, c-format msgid "%s: unknown output format (use -O option)" msgstr "%s : format de sortie inconnu (utiliser l’option -O)" #: utilities/pspp-convert.c:360 #, c-format msgid "%s: error reading input file" msgstr "%s : erreur de lecture du fichier d’entrée" #: utilities/pspp-convert.c:362 #, c-format msgid "%s: error writing output file" msgstr "%s : erreur d’écriture du fichier de sortie" #: utilities/pspp-convert.c:409 #, fuzzy, c-format #| msgid "%s: error opening output file" msgid "%s: error opening password file" msgstr "%s : erreur d’ouverture du fichier de sortie" #: utilities/pspp-convert.c:425 #, fuzzy, c-format #| msgid "%s: error reading input file" msgid "" "\n" "%s: password not in file" msgstr "%s : erreur de lecture du fichier d’entrée" #: utilities/pspp-convert.c:462 #, fuzzy, c-format #| msgid "`%c' is not a valid hex digit" msgid "%s: '%c' is not in alphabet" msgstr "« %c » n’est pas un caractère hexadécimal valide" #: utilities/pspp-convert.c:526 msgid "sorry, wrong password" msgstr "Désolé, mot de passe erroné" #: utilities/pspp-output.c:92 #, c-format msgid "%s and %s:" msgstr "" #: utilities/pspp-output.c:547 #, c-format msgid "%s: invalid XPath expression" msgstr "" #: utilities/pspp-output.c:716 msgid "missing command name (use --help for help)" msgstr "" #: utilities/pspp-output.c:720 #, c-format msgid "unknown command \"%s\" (use --help for help)" msgstr "" #: utilities/pspp-output.c:728 #, c-format msgid "\"%s\" command takes exactly %d argument" msgid_plural "\"%s\" command takes exactly %d arguments" msgstr[0] "" msgstr[1] "" #: utilities/pspp-output.c:735 #, fuzzy, c-format #| msgid "%s requires at least %d valid arguments in list." msgid "\"%s\" command requires at least %d argument" msgid_plural "\"%s\" command requires at least %d arguments" msgstr[0] "%s exige au moins %d arguments valides dans la liste." msgstr[1] "%s exige au moins %d arguments valides dans la liste." #: utilities/pspp-output.c:742 #, fuzzy, c-format #| msgid "%s requires at least %d valid arguments in list." msgid "\"%s\" command requires between %d and %d arguments" msgstr "%s exige au moins %d arguments valides dans la liste." #: utilities/pspp-output.c:782 msgid "The following object classes are supported:" msgstr "" #: utilities/pspp-output.c:791 #, c-format msgid "%s: unknown object class (use --select=help for help" msgstr "" #: src/language/utilities/set.q:162 #, c-format msgid "%s must be between 0 and 20." msgstr "%s doit être dans l’intervalle 0 à 20." #: src/language/utilities/set.q:172 src/language/utilities/set.q:179 #, c-format msgid "%s must be at least 1." msgstr "%s doit être au moins 1." #: src/language/utilities/set.q:205 #, c-format msgid "%s must be at least 1MB" msgstr "%s doit être au moins 1MB." #: src/language/utilities/set.q:207 #, c-format msgid "%s must be positive" msgstr "%s doit être positif" #: src/language/utilities/set.q:213 src/language/utilities/set.q:215 #: src/language/utilities/set.q:217 src/language/utilities/set.q:219 #: src/language/utilities/set.q:221 src/language/utilities/set.q:223 #: src/language/utilities/set.q:225 src/language/utilities/set.q:227 #: src/language/utilities/set.q:229 src/language/utilities/set.q:231 #: src/language/utilities/set.q:233 #, c-format msgid "%s is obsolete." msgstr "%s est obsolète" #: src/language/utilities/set.q:239 msgid "Active file compression is not implemented." msgstr "La compression du fichier actif n’est pas installé." #: src/language/utilities/set.q:403 #, c-format msgid "%s must be 1500 or later." msgstr "%s doit être égal ou supérieur à 1500." #: src/language/utilities/set.q:410 #, c-format msgid "expecting %s or year" msgstr "Attend %s ou year" #: src/language/utilities/set.q:438 src/language/utilities/set.q:535 #, c-format msgid "%s must be at least %d." msgstr "%s doit être au moins %d." #: src/language/utilities/set.q:474 #, c-format msgid "%s is not a recognized encoding or locale name" msgstr "%s n’est pas encodage connu ou un nom local" #: src/language/utilities/set.q:562 #, c-format msgid "" "%s requires numeric output format as an argument. Specified format %s is of " "type string." msgstr "" "%s exige un format de sortie numérique en argument. Le format indiqué %s est " "de type chaîne." #: src/language/utilities/set.q:791 msgid "ISL (32-bit IEEE 754 single, little-endian)" msgstr "ISL (32-bit IEEE 754 simple, little-indien)" #: src/language/utilities/set.q:794 msgid "ISB (32-bit IEEE 754 single, big-endian)" msgstr "ISB (32-bit IEEE 754 simple, grand-indien)" #: src/language/utilities/set.q:797 msgid "IDL (64-bit IEEE 754 double, little-endian)" msgstr "IDL (64-bit IEEE 754 double, petit-indien)" #: src/language/utilities/set.q:800 msgid "IDB (64-bit IEEE 754 double, big-endian)" msgstr "IDB (64-bit IEEE 754 double, grand-indien)" #: src/language/utilities/set.q:804 msgid "VF (32-bit VAX F, VAX-endian)" msgstr "VF (32-bit VAX F, VAX-indien)" #: src/language/utilities/set.q:807 msgid "VD (64-bit VAX D, VAX-endian)" msgstr "VD (64-bit VAX D, VAX-indien)" #: src/language/utilities/set.q:810 msgid "VG (64-bit VAX G, VAX-endian)" msgstr "VG (64-bit VAX G, VAX-indien)" #: src/language/utilities/set.q:814 msgid "ZS (32-bit IBM Z hexadecimal short, big-endian)" msgstr "ZS (32-bit IBM Z hexadécimal court, grand-indien)" #: src/language/utilities/set.q:817 msgid "ZL (64-bit IBM Z hexadecimal long, big-endian)" msgstr "ZL (64-bit IBM Z hexadécimal long, grand-indien)" #: src/language/utilities/set.q:985 #, c-format msgid "%s is %s." msgstr "%s est %s. " #: src/language/utilities/set.q:1089 #, c-format msgid "" "Too many %s commands without a %s: at most %d levels of saved settings are " "allowed." msgstr "" "Trop de commandes %s sans %s : au plus %d niveaux de paramètres sauvegardés " "sont permis." #: src/language/utilities/set.q:1109 #, c-format msgid "%s without matching %s." msgstr "%s sans %s correspondant." #: src/language/stats/crosstabs.q:327 #, c-format msgid "Missing mode %s not allowed in general mode. Assuming %s." msgstr "Mode %s manquant n’est pas permis dans le mode général. Suppose %s." #: src/language/stats/crosstabs.q:444 msgid "Too many cross-tabulation variables or dimensions." msgstr "Il y a trop de variables de tableaux croisés ou de dimensions." #: src/language/stats/crosstabs.q:509 #, c-format msgid "%s must be specified before %s." msgstr "%s doit être spécifié avant %s." #: src/language/stats/crosstabs.q:543 #, c-format msgid "Maximum value (%ld) less than minimum value (%ld)." msgstr "La valeur maximale (%ld) est inférieure à la valeur minimale (%ld)." #: src/language/stats/crosstabs.q:922 #, fuzzy #| msgid "Summary." msgid "Summary" msgstr "Résumé" #: src/language/stats/crosstabs.q:935 #, fuzzy #| msgid "Crosstabs" msgid "Crosstabulation" msgstr "Tableaux Croisés" #. TRANSLATORS: The %s here describes a crosstabulation. It takes the #. form "var1 * var2 * var3 * ...". #: src/language/stats/crosstabs.q:1013 #, c-format msgid "Crosstabulation %s contained no non-missing cases." msgstr "Le tableau croisé %s ne contient aucune observation on-manquante." #: src/language/stats/crosstabs.q:1204 #, fuzzy #| msgid "Missing Values" msgid "Missing value" msgstr "Valeurs manquantes" #: src/language/stats/crosstabs.q:1263 #, fuzzy #| msgid "row %" msgid "Row %" msgstr "ligne %" #: src/language/stats/crosstabs.q:1264 #, fuzzy #| msgid "column %" msgid "Column %" msgstr "colonne %" #: src/language/stats/crosstabs.q:1265 #, fuzzy #| msgid "total %" msgid "Total %" msgstr "total %" #: src/language/stats/crosstabs.q:1269 #, fuzzy #| msgid "Adjusted Std. Residual" msgid "Adjusted Residual" msgstr "Résidus standardisés, ajustés" #: src/language/stats/crosstabs.q:1288 #, fuzzy #| msgid "Chi-Square Test" msgid "Chi-Square Tests" msgstr "Test de Khi-Deux" #: src/language/stats/crosstabs.q:1294 msgid "Pearson Chi-Square" msgstr "Khi-Deux de Pearson" #: src/language/stats/crosstabs.q:1295 msgid "Likelihood Ratio" msgstr "Rapport de vraisemblance" #: src/language/stats/crosstabs.q:1296 msgid "Fisher's Exact Test" msgstr "Test exact de Fisher" #: src/language/stats/crosstabs.q:1297 msgid "Continuity Correction" msgstr "Correction de continuité" #: src/language/stats/crosstabs.q:1298 msgid "Linear-by-Linear Association" msgstr "Association linéaire-par-linéaire" #: src/language/stats/crosstabs.q:1299 src/language/stats/crosstabs.q:1345 #: src/language/stats/crosstabs.q:1854 msgid "N of Valid Cases" msgstr "Nombre d’observations valides" #: src/language/stats/crosstabs.q:1305 #, fuzzy #| msgid "Asymp. Sig. (2-tailed)" msgid "Asymptotic Sig. (2-tailed)" msgstr "Sig. asymptotique (bi-variée)" #: src/language/stats/crosstabs.q:1319 #, fuzzy #| msgid "Symmetric measures." msgid "Symmetric Measures" msgstr "Mesures symétriques." #: src/language/stats/crosstabs.q:1324 src/language/stats/crosstabs.q:1364 #: src/language/stats/crosstabs.q:1411 #, fuzzy #| msgid "_Values" msgid "Values" msgstr "_Valeurs" #: src/language/stats/crosstabs.q:1326 src/language/stats/crosstabs.q:1413 msgid "Asymp. Std. Error" msgstr "Erreur standard asymp." #: src/language/stats/crosstabs.q:1327 src/language/stats/crosstabs.q:1414 msgid "Approx. T" msgstr "Approx. T" #: src/language/stats/crosstabs.q:1328 src/language/stats/crosstabs.q:1415 msgid "Approx. Sig." msgstr "Sig. approx." #: src/language/stats/crosstabs.q:1333 src/language/stats/crosstabs.q:1420 msgid "Nominal by Nominal" msgstr "Valeur Nominale par Valeur Nominale" #: src/language/stats/crosstabs.q:1334 msgid "Cramer's V" msgstr "V de Cramer" #: src/language/stats/crosstabs.q:1334 msgid "Contingency Coefficient" msgstr "Coefficient de contingence" #: src/language/stats/crosstabs.q:1336 src/language/stats/crosstabs.q:1425 msgid "Ordinal by Ordinal" msgstr "Valeur Ordinale par Valeur Ordinale" #: src/language/stats/crosstabs.q:1337 msgid "Kendall's tau-b" msgstr "Tau-b de Kendall" #: src/language/stats/crosstabs.q:1337 msgid "Kendall's tau-c" msgstr "Tau-c de Kendall" #: src/language/stats/crosstabs.q:1338 msgid "Spearman Correlation" msgstr "Correlation de Spearman" #: src/language/stats/crosstabs.q:1340 msgid "Interval by Interval" msgstr "Intervalle par intervalle" #: src/language/stats/crosstabs.q:1341 msgid "Pearson's R" msgstr "R de Pearson" #: src/language/stats/crosstabs.q:1343 msgid "Measure of Agreement" msgstr "Mesure de l’accord" #: src/language/stats/crosstabs.q:1359 #, fuzzy #| msgid "Risk estimate." msgid "Risk Estimate" msgstr "Estimation du risque." #: src/language/stats/crosstabs.q:1368 #, fuzzy, no-c-format #| msgid "95%% Confidence Interval" msgid "95% Confidence Interval" msgstr "95%% de l’intervalle de confiance" #: src/language/stats/crosstabs.q:1389 msgid "Symmetric" msgstr "Symétrique" #: src/language/stats/crosstabs.q:1391 src/language/stats/crosstabs.q:1396 #, c-format msgid "%s Dependent" msgstr "Dépendant %s" #: src/language/stats/crosstabs.q:1406 #, fuzzy #| msgid "Directional measures." msgid "Directional Measures" msgstr "Mesures directionnelles." #: src/language/stats/crosstabs.q:1422 msgid "Goodman and Kruskal tau" msgstr "Tau de Goodman et Kruskal" #: src/language/stats/crosstabs.q:1423 msgid "Uncertainty Coefficient" msgstr "Coefficient d’incertitude" #: src/language/stats/crosstabs.q:1426 msgid "Somers' d" msgstr "d de Somer" #: src/language/stats/crosstabs.q:1428 msgid "Nominal by Interval" msgstr "Nominale par intervalle" #: src/language/stats/crosstabs.q:1826 #, fuzzy, c-format #| msgid "Odds Ratio for %s (%g / %g)" msgid "Odds Ratio for %s" msgstr "Proportion de chances pour %s (%g / %g)" #: src/language/stats/crosstabs.q:1835 #, fuzzy, c-format #| msgid "For cohort %s = %.*g" msgid "For cohort %s = " msgstr "Pour une cohorte %s = %.*g" #: src/ui/gui/aggregate.ui:24 msgid "Aggregate Data" msgstr "Agrégation des données" #: src/ui/gui/aggregate.ui:126 msgid "_Break variable(s)" msgstr "E_ffacement de variable(s)" #: src/ui/gui/aggregate.ui:179 msgid "Variable Name: " msgstr "Nom de variable :" #: src/ui/gui/aggregate.ui:215 msgid "Variable Label: " msgstr "Étiquette de variable :" #: src/ui/gui/aggregate.ui:252 msgid "Function: " msgstr "Fonction :" #: src/ui/gui/aggregate.ui:327 msgid "Argument 1: " msgstr "Argument 1 : " #: src/ui/gui/aggregate.ui:364 msgid "Argument 2: " msgstr "Argument 2 : " #: src/ui/gui/aggregate.ui:428 msgid "Aggregated variables" msgstr "Variables agrégées" #: src/ui/gui/aggregate.ui:469 msgid "_Add aggregated variables to the active dataset" msgstr "_Ajouter les variables agrégées au jeu de données actif" #: src/ui/gui/aggregate.ui:486 msgid "_Replace the current dataset with the aggregated variables" msgstr "_Remplacer le jeu de données actuel avec les variables agrégées" #: src/ui/gui/aggregate.ui:504 msgid "_Write a new data file containing only the aggregated variables" msgstr "" "_Ecrire un nouveau fichier de données ne contenant que des variables agrégées" #: src/ui/gui/aggregate.ui:544 msgid "label" msgstr "étiquette" #: src/ui/gui/aggregate.ui:593 msgid "File is _already sorted on break variable(s)" msgstr "" "Fichier est déjà trié selon les variables ??? Le fichier est déjà trié sur " "la ou les variable(s) de rupture" #: src/ui/gui/aggregate.ui:609 msgid "Sort file before a_ggregating" msgstr "Tri du fichier avant a_grégation" #: src/ui/gui/aggregate.ui:630 msgid "Options for very large datasets" msgstr "Options pour les jeux de données très grands" #: src/ui/gui/autorecode.ui:24 msgid "Automatic Recode" msgstr "Recodification automatique" #: src/ui/gui/autorecode.ui:120 msgid "Variable -> New Name" msgstr "Variable -> Nouveau nom" #: src/ui/gui/autorecode.ui:145 msgid "_Lowest value" msgstr "Plus _basse valeur" #: src/ui/gui/autorecode.ui:163 msgid "_Highest value" msgstr "Plus _haute valeur" #: src/ui/gui/autorecode.ui:185 msgid "Recode starting from" msgstr "Recode à partir de" #: src/ui/gui/autorecode.ui:204 msgid "_New Name" msgstr "_Nouveau nom" #: src/ui/gui/autorecode.ui:227 msgid "_Add New Name" msgstr "_Ajout d’un nouveau nom" #: src/ui/gui/autorecode.ui:285 msgid "_Use the same recoding scheme for all variables" msgstr "_Utiliser le même mode de recodification pour toutes les variables" #: src/ui/gui/autorecode.ui:301 msgid "Treat _blank string values as missing" msgstr "Traiter les valeurs de chaîne _vide comme manquantes" #: src/ui/gui/binomial.ui:86 msgid "_Test Variable List:" msgstr "Liste de variable-_test(s) :" #: src/ui/gui/binomial.ui:160 src/ui/gui/chi-square.ui:281 msgid "_Get from data" msgstr "_Obtenir à partir des données" # ??? cut #: src/ui/gui/binomial.ui:181 src/ui/gui/indep-samples.ui:150 msgid "_Cut point:" msgstr "Point de _coupure :" #: src/ui/gui/binomial.ui:225 msgid "Define Dichotomy" msgstr "Définir la dichotomie" #: src/ui/gui/binomial.ui:245 msgid "Test _Proportion:" msgstr "_Proportion de test :" #: src/ui/gui/compute.ui:32 msgid "Compute Variable: Type and Label" msgstr "Variable calculée : type et titre" #: src/ui/gui/compute.ui:67 msgid "Use _expression as label" msgstr "Utiliser l’_expression comme titre" #: src/ui/gui/compute.ui:90 msgid "_Label:" msgstr "É_tiquette :" #: src/ui/gui/compute.ui:194 msgid "_String" msgstr "_Chaîne" #: src/ui/gui/compute.ui:287 msgid "_Numeric" msgstr "_Numérique" #: src/ui/gui/compute.ui:343 msgid "Compute Variable" msgstr "Variable calculée" #: src/ui/gui/compute.ui:381 msgid "Target _Variable:" msgstr "_Variable cible :" #: src/ui/gui/compute.ui:412 msgid "_Type & Label..." msgstr "Type & Titre…" #: src/ui/gui/compute.ui:469 msgid "=" msgstr "=" #: src/ui/gui/compute.ui:526 msgid "_Numeric Expressions:" msgstr "Expressions _numeriques :" #: src/ui/gui/compute.ui:598 msgid "_Functions:" msgstr "_Fonctions :" #: src/ui/gui/compute.ui:678 msgid "_If..." msgstr "_Si…" #: src/ui/gui/barchart.ui:24 msgid "Barchart" msgstr "Diagremme en barres" #: src/ui/gui/barchart.ui:112 msgid "Category A_xis:" msgstr "Axe des catégories :" #: src/ui/gui/barchart.ui:140 msgid "_N of cases" msgstr "_Nb de cas" #: src/ui/gui/barchart.ui:158 msgid "_Cum. n of cases" msgstr "Nb _cumulé de cas" #: src/ui/gui/barchart.ui:174 msgid "Other _summary function" msgstr "Ater fonction récapitulative" #: src/ui/gui/barchart.ui:191 msgid "% of c_ases" msgstr "% de c_as" #: src/ui/gui/barchart.ui:207 msgid "C_um. % of cases" msgstr "% _cumulé de cas" #: src/ui/gui/barchart.ui:270 src/ui/gui/histogram.ui:100 msgid "_Variable:" msgstr "_Variable :" #: src/ui/gui/barchart.ui:308 msgid "Bars Represent" msgstr "Représentation en barres" #: src/ui/gui/barchart.ui:340 msgid "Category C_luster:" msgstr "Catégorie C_luster :" #: src/ui/gui/correlation.ui:24 msgid "Bivariate Correlations" msgstr "Corrélations bivariées" #: src/ui/gui/correlation.ui:148 msgid "Pearso_n" msgstr "Pearso_n" #: src/ui/gui/correlation.ui:164 msgid "_Kendall's tau-b" msgstr "Tau-b de _Kendall" #: src/ui/gui/correlation.ui:180 msgid "_Spearman" msgstr "_Spearman" #: src/ui/gui/correlation.ui:200 msgid "Correlation Coefficients" msgstr "Coefficient de corrélation" #: src/ui/gui/correlation.ui:224 msgid "_Two-tailed" msgstr "_Bi-variée" #: src/ui/gui/correlation.ui:241 msgid "One-tai_led" msgstr "_Uni-variée" #: src/ui/gui/correlation.ui:262 msgid "Test of Significance" msgstr "Test de signification" #: src/ui/gui/correlation.ui:275 msgid "_Flag significant correlations" msgstr "_Drapeau des corrélations de signification" #: src/ui/gui/count.ui:24 msgid "Count Occurrences of Values within Cases" msgstr "Nombre des occurrences de valeurs dans les observations" #: src/ui/gui/count.ui:117 msgid "Numeric _Variables:" msgstr "_Variables numériques :" #: src/ui/gui/count.ui:147 msgid "_Target Variable:" msgstr "_Variable de la cible :" #: src/ui/gui/count.ui:178 msgid "Target _Label:" msgstr "Étiquette de la cib_le :" #: src/ui/gui/count.ui:192 msgid "_Define Values..." msgstr "_Définir les valeurs…" #: src/ui/gui/count.ui:257 msgid "Count Values within Cases: Values to Count" msgstr "Nombre des valeurs dans les observations: valeurs à compter" #: src/ui/gui/count.ui:305 msgid "Values _to Count:" msgstr "Valeurs à comp_ter :" #: src/ui/gui/comments.ui:25 msgid "Data File Comments" msgstr "Commentaires sur le fichier de données" #: src/ui/gui/comments.ui:49 msgid "Comments:" msgstr "Commentaires :" #: src/ui/gui/comments.ui:106 msgid "Display comments in output" msgstr "Afficher les commentaires en sortie" #: src/ui/gui/comments.ui:127 msgid "Column Number: 0" msgstr "Numéro de la colonne : 0" #: src/ui/gui/crosstabs.ui:25 msgid "Crosstabs: Cells" msgstr "Tableaux croisés : observations" #: src/ui/gui/crosstabs.ui:67 msgid "Cell Display" msgstr "Afficher l’observation" #: src/ui/gui/crosstabs.ui:99 msgid "Crosstabs" msgstr "Tableaux Croisés" #: src/ui/gui/crosstabs.ui:150 msgid "_Rows" msgstr "_Lignes" #: src/ui/gui/crosstabs.ui:195 msgid "_Columns" msgstr "_Colonnes" #: src/ui/gui/crosstabs.ui:242 msgid "_Format..." msgstr "_Format…" #: src/ui/gui/crosstabs.ui:256 src/ui/gui/examine.ui:267 msgid "_Statistics..." msgstr "_Statistiques…" #: src/ui/gui/crosstabs.ui:270 msgid "Ce_lls..." msgstr "Ce_llulles…" #: src/ui/gui/crosstabs.ui:348 msgid "Crosstabs: Format" msgstr "Tableaux croisés : format" #: src/ui/gui/crosstabs.ui:371 msgid "Print tables" msgstr "Tableaux d’impression" #: src/ui/gui/crosstabs.ui:387 msgid "Pivot" msgstr "Pivot" #: src/ui/gui/crosstabs.ui:403 src/ui/gui/sort.ui:157 msgid "Ascending" msgstr "Croissant" #: src/ui/gui/crosstabs.ui:455 msgid "Crosstabs: Statistics" msgstr "Tableaux croisés : statistiques" #: src/ui/gui/chi-square.ui:30 msgid "Chi-Square Test" msgstr "Test de Khi-Deux" #: src/ui/gui/chi-square.ui:82 msgid "All categor_ies equal" msgstr "Toutes catégor_ies égales" #: src/ui/gui/chi-square.ui:103 msgid "_Values" msgstr "_Valeurs" #: src/ui/gui/chi-square.ui:159 msgid "Expected Values:" msgstr "Valeurs attendues :" #: src/ui/gui/chi-square.ui:204 msgid "Test _Variables" msgstr "_Variables d’essai" #: src/ui/gui/chi-square.ui:298 msgid "Use _specified range" msgstr "Utilise un intervalle _spécifique" #: src/ui/gui/chi-square.ui:323 msgid "_Lower:" msgstr "Plus _Bas :" #: src/ui/gui/chi-square.ui:337 msgid "_Upper:" msgstr "_Supérieur :" #: src/ui/gui/chi-square.ui:381 msgid "Expected Range:" msgstr "Intervalle attendu :" #: src/ui/gui/descriptives.ui:131 src/ui/gui/factor.ui:797 #: src/ui/gui/recode.ui:638 msgid "_Variables:" msgstr "_Variables :" #: src/ui/gui/descriptives.ui:176 msgid "S_tatistics:" msgstr "S_tatistiques :" #: src/ui/gui/descriptives.ui:230 msgid "_Exclude entire case if any selected variable is missing" msgstr "" "_Exclure la totalité de l’observation si l’une des variables est manquante" #: src/ui/gui/descriptives.ui:247 msgid "_Include user-missing data in analysis" msgstr "_Inclure des données utilisateurs manquantes dans l’analyse" #: src/ui/gui/descriptives.ui:264 msgid "Save _Z-scores of selected variables as new variables" msgstr "" "Enregistrer les _Z-scores des variables sélectionnées comme nouvelles " "variables" #: src/ui/gui/descriptives.ui:286 msgid "Options:" msgstr "Options :" #: src/ui/gui/examine.ui:25 msgid "Explore" msgstr "Explorer" #: src/ui/gui/examine.ui:69 msgid "_Label Cases by:" msgstr "Étiquette de cas par :" #: src/ui/gui/examine.ui:116 msgid "_Factor List:" msgstr "Liste des _facteurs :" #: src/ui/gui/examine.ui:163 src/ui/gui/means.ui:126 msgid "_Dependent List:" msgstr "Liste _dépendante :" #: src/ui/gui/examine.ui:331 msgid "Explore: Options" msgstr "Explorer : options" #: src/ui/gui/examine.ui:355 src/ui/gui/t-test.ui:81 msgid "Exclude cases _listwise" msgstr "Exclure les observations _listées" #: src/ui/gui/examine.ui:373 msgid "Exclude cases _pairwise" msgstr "Exclure les cas appairés" #: src/ui/gui/examine.ui:392 msgid "_Report values" msgstr "_Rapporter les valeurs" #: src/ui/gui/examine.ui:449 msgid "Explore: Statistics" msgstr "Explorer : statistiques" #: src/ui/gui/examine.ui:468 src/ui/gui/oneway.ui:576 msgid "_Descriptives" msgstr "_Descriptives" #: src/ui/gui/examine.ui:485 msgid "_Extremes" msgstr "_Extrêmes" #: src/ui/gui/examine.ui:502 msgid "_Percentiles" msgstr "_Centiles" #: src/ui/gui/goto-case.ui:31 msgid "Goto Case" msgstr "Aller à l’observation" #: src/ui/gui/goto-case.ui:52 msgid "Goto Case Number:" msgstr "Aller à l’observation numéro :" #: src/ui/gui/factor.ui:39 msgid "Factor Analysis: Rotation" msgstr "Analys de facteur : Rotation" #: src/ui/gui/factor.ui:70 msgid "_None" msgstr "_Aucun" #: src/ui/gui/factor.ui:87 msgid "_Varimax" msgstr "_Varimax" #: src/ui/gui/factor.ui:104 msgid "_Quartimax" msgstr "_Quartimax" #: src/ui/gui/factor.ui:123 msgid "_Equimax" msgstr "_Equimax" #: src/ui/gui/factor.ui:146 msgid "Method" msgstr "Methode" #: src/ui/gui/factor.ui:159 msgid "_Display rotated solution" msgstr "A_ffiche la solution après rotation" #: src/ui/gui/factor.ui:181 src/ui/gui/factor.ui:582 msgid "Ma_ximum iterations for convergence:" msgstr "Nombre d’itérations ma_ximales pour converger :" #: src/ui/gui/factor.ui:241 src/ui/gui/factor.ui:255 msgid "Principal Components Analysis" msgstr "Composantes principales" #: src/ui/gui/factor.ui:246 src/ui/gui/factor.ui:258 msgid "Principal Axis Factoring" msgstr "Axe principal de la factorielle" #: src/ui/gui/factor.ui:264 msgid "Factor Analysis: Extraction" msgstr "Analyse factorielle : Extraction" #: src/ui/gui/factor.ui:290 msgid "_Method: " msgstr "_Méthode : " #: src/ui/gui/factor.ui:345 msgid "Co_rrelation matrix" msgstr "Mat_rice de corrélation" #: src/ui/gui/factor.ui:361 msgid "Co_variance matrix" msgstr "Matrice de co_variance" #: src/ui/gui/factor.ui:382 msgid "Analyze" msgstr "Analyse" #: src/ui/gui/factor.ui:407 msgid "_Unrotated factor solution" msgstr "Structure factorielle _sans rotation." #: src/ui/gui/factor.ui:423 msgid "_Scree plot" msgstr "Graphique des valeurs _propres" #: src/ui/gui/factor.ui:443 src/ui/gui/histogram.ui:146 src/ui/gui/roc.ui:329 msgid "Display" msgstr "Afficher" #: src/ui/gui/factor.ui:526 msgid "_Number of factors:" msgstr "_Nombre de facteurs :" #: src/ui/gui/factor.ui:563 msgid "Extract" msgstr "Extraire" #: src/ui/gui/factor.ui:640 msgid "Factor Analysis" msgstr "Analyse factorielle" #: src/ui/gui/factor.ui:672 src/ui/gui/data-editor.ui:266 msgid "_Descriptives..." msgstr "_Descriptives…" #: src/ui/gui/factor.ui:685 msgid "_Extraction..." msgstr "_Extraction…" #: src/ui/gui/factor.ui:699 msgid "_Rotations..." msgstr "_Rotations…" #: src/ui/gui/find.ui:25 msgid "Find Case" msgstr "Trouver une observation" #: src/ui/gui/find.ui:117 msgid "Variable:" msgstr "Variable :" #: src/ui/gui/find.ui:157 src/ui/gui/val-labs-dialog.ui:113 msgid "Value:" msgstr "Valeur :" #: src/ui/gui/find.ui:180 msgid "Search value labels" msgstr "Chercher des étiquettes de valeurs" #: src/ui/gui/find.ui:210 msgid "Regular expression Match" msgstr "Correspond à l’expression régulière" #: src/ui/gui/find.ui:227 msgid "Search substrings" msgstr "Recherche des sous-chaînes" #: src/ui/gui/find.ui:244 msgid "Wrap around" msgstr "Boucle circulaire" #: src/ui/gui/find.ui:260 msgid "Search backward" msgstr "Recherche arrière" #: src/ui/gui/frequencies.ui:32 msgid "Frequencies: Frequency Tables" msgstr "Fréquences : Tables des fréquences" #: src/ui/gui/frequencies.ui:67 msgid "_Always" msgstr "_Toujours" #: src/ui/gui/frequencies.ui:85 msgid "_Never" msgstr "_Jamais" #: src/ui/gui/frequencies.ui:107 msgid "If no _more than " msgstr "Si pas plus que" #: src/ui/gui/frequencies.ui:129 src/ui/gui/frequencies.ui:454 msgid "100" msgstr "100" #: src/ui/gui/frequencies.ui:145 msgid "values" msgstr "valeurs" #: src/ui/gui/frequencies.ui:167 msgid "Display frequency tables" msgstr "Affiche les tables des fréquences" #: src/ui/gui/frequencies.ui:194 msgid "A_scending value" msgstr "Valeur _croissante" #: src/ui/gui/frequencies.ui:212 msgid "D_escending value" msgstr "Valeur _décroissante" #: src/ui/gui/frequencies.ui:230 msgid "Ascending _frequency" msgstr "_Fréquence croissante" #: src/ui/gui/frequencies.ui:248 msgid "Descending f_requency" msgstr "F_réquence décroissante" #: src/ui/gui/frequencies.ui:271 msgid "Order by" msgstr "Trier par" #: src/ui/gui/frequencies.ui:324 msgid "Frequencies: Charts" msgstr "Fréquences : Diagrammes" #: src/ui/gui/frequencies.ui:356 msgid "Scale:" msgstr "Échelle :" #: src/ui/gui/frequencies.ui:366 msgid "_Frequencies" msgstr "_Fréquences" #: src/ui/gui/frequencies.ui:383 msgid "_Percentages" msgstr "Pourcentages" #: src/ui/gui/frequencies.ui:407 msgid "Exclude values _below " msgstr "Exclure les valeurs au-dess_ous de " #: src/ui/gui/frequencies.ui:422 msgid "Exclude values _above " msgstr "Exclure les valeurs au-dess_us de " #: src/ui/gui/frequencies.ui:441 src/ui/gui/reliability.ui:227 msgid "0" msgstr "0" #: src/ui/gui/frequencies.ui:469 msgid "Chart Formatting" msgstr "Formatage de diagramme" #: src/ui/gui/frequencies.ui:494 msgid "Draw _histograms" msgstr "Dessiner les _histogramme" #: src/ui/gui/frequencies.ui:510 msgid "Superimpose _normal curve" msgstr "Superposer la courbe _normale" #: src/ui/gui/frequencies.ui:530 msgid "Histograms" msgstr "Histogrammes" #: src/ui/gui/frequencies.ui:555 msgid "Draw _bar charts" msgstr "Dessiner des diagrammes en _barres" #: src/ui/gui/frequencies.ui:575 msgid "Bar Charts" msgstr "Diagrammes en barres" #: src/ui/gui/frequencies.ui:600 msgid "Draw _pie charts" msgstr "Dessiner des _camemberts" #: src/ui/gui/frequencies.ui:616 msgid "Include slices for _missing values" msgstr "Inclure les parties pour les valeurs _manquantes" #: src/ui/gui/frequencies.ui:636 msgid "Pie Charts" msgstr "Camemberts" #: src/ui/gui/frequencies.ui:725 src/ui/gui/rank.ui:489 msgid "_Variable(s):" msgstr "_Variables(s) :" #: src/ui/gui/frequencies.ui:769 msgid "_Statistics:" msgstr "_Statistiques :" #: src/ui/gui/frequencies.ui:783 msgid "Include _missing values" msgstr "Inclure les valeurs _manquantes" #: src/ui/gui/frequencies.ui:806 msgid "Ch_arts..." msgstr "_Diagramme…" #: src/ui/gui/frequencies.ui:821 msgid "Frequency _Tables..." msgstr "_Tables des fréquences…" #: src/ui/gui/histogram.ui:24 msgid "Histogram" msgstr "Histogramme" #: src/ui/gui/histogram.ui:126 msgid "_Display normal curve" msgstr "_Afficher la courbe normale" #: src/ui/gui/indep-samples.ui:25 src/ui/gui/k-independent.ui:35 msgid "Define Groups" msgstr "Groupes définis" #: src/ui/gui/indep-samples.ui:75 msgid "Group_2 value:" msgstr "Valeur de Group_2 :" #: src/ui/gui/indep-samples.ui:89 msgid "Group_1 value:" msgstr "Valeur de Group_1 :" #: src/ui/gui/indep-samples.ui:190 msgid "_Use specified values:" msgstr "_Utiliser les valeurs spécifiées :" #: src/ui/gui/indep-samples.ui:259 msgid "Independent-Samples T Test" msgstr "Test T pour Échantillons Indépendants" #: src/ui/gui/indep-samples.ui:319 msgid "_Define Groups..." msgstr "Définir les groupes…" #: src/ui/gui/indep-samples.ui:401 src/ui/gui/t-test.ui:211 msgid "_Test Variable(s):" msgstr "Variable(s) de _Test :" #: src/ui/gui/indep-samples.ui:454 src/ui/gui/k-independent.ui:165 msgid "_Grouping Variable:" msgstr "Variable de _regroupement :" #: src/ui/gui/k-independent.ui:63 msgid "_Upper limit:" msgstr "Limte _supérieure :" #: src/ui/gui/k-independent.ui:77 msgid "_Lower limit:" msgstr "Limite _inférieure :" #: src/ui/gui/k-independent.ui:136 msgid "Tests for Several Independent Samples" msgstr "Tests pour plusieurs échantillons indépendants" #: src/ui/gui/k-independent.ui:208 src/ui/gui/ks-one-sample.ui:131 msgid "Test _Variable List:" msgstr "Liste de variable-test(s) :" #: src/ui/gui/k-independent.ui:320 msgid "_Define Groups" msgstr "Groupes _définis" #: src/ui/gui/k-independent.ui:365 msgid "_Kruskal-Wallis H" msgstr "H de _Kruskal-Wallis" #: src/ui/gui/k-independent.ui:382 src/ui/gui/runs.ui:140 msgid "_Median" msgstr "_Médiane" #: src/ui/gui/k-means.ui:24 msgid "K-Means Cluster Analysis" msgstr "Analyse de groupe de K-Means" #: src/ui/gui/k-means.ui:122 msgid "N_umber of Clusters: " msgstr "Nom_bre de groupes : " #: src/ui/gui/k-related.ui:24 msgid "Tests for Several Related Samples" msgstr "Tests pour plusieurs échantillons connexes" #: src/ui/gui/k-related.ui:113 msgid "_Test Variables:" msgstr "_Variables d’essai :" #: src/ui/gui/k-related.ui:145 msgid "_Friedman" msgstr "_Friedman" #: src/ui/gui/k-related.ui:161 msgid "_Kendall's W" msgstr "W de _Kendall" #: src/ui/gui/k-related.ui:177 msgid "_Cochran's Q" msgstr "Q de _Cochran" #: src/ui/gui/ks-one-sample.ui:163 msgid "_Normal" msgstr "_Normal" #: src/ui/gui/ks-one-sample.ui:181 msgid "_Poisson" msgstr "_Poisson" #: src/ui/gui/ks-one-sample.ui:198 msgid "_Uniform" msgstr "_Homogène" #: src/ui/gui/ks-one-sample.ui:213 msgid "_Exponential" msgstr "_Exponentiel" #: src/ui/gui/ks-one-sample.ui:232 msgid "Test Distribution" msgstr "Test de distribution" #: src/ui/gui/logistic.ui:42 msgid "Logistic Regression: Options" msgstr "Régression logistique : options" #: src/ui/gui/logistic.ui:66 msgid "CI for _exp(B): " msgstr "CI pour l’_exp(B) : " #: src/ui/gui/logistic.ui:97 msgid "%" msgstr "%" #: src/ui/gui/logistic.ui:146 msgid "Classification cu_toff: " msgstr "Classification _binomial : " #: src/ui/gui/logistic.ui:159 msgid "_Maximum Iterations: " msgstr "Nombre _maximum d’itérations : " #: src/ui/gui/logistic.ui:177 msgid "Include _constant in model" msgstr "Inclure la _constante dans le modèle" #: src/ui/gui/logistic.ui:219 msgid "Logistic Regression" msgstr "Régression logistique" #: src/ui/gui/logistic.ui:364 src/ui/gui/regression.ui:185 msgid "_Dependent" msgstr "_Dépendant(e)" #: src/ui/gui/logistic.ui:412 src/ui/gui/regression.ui:232 msgid "_Independent" msgstr "_Indépendant(e)" #: src/ui/gui/means.ui:25 msgid "Means" msgstr "Moyennes" #: src/ui/gui/means.ui:179 msgid "_Independent List:" msgstr "Liste _indépendante :" #: src/ui/gui/missing-val-dialog.ui:48 msgid "_No missing values" msgstr "_Aucune valeur manquante" #: src/ui/gui/missing-val-dialog.ui:136 msgid "_Discrete missing values" msgstr "_Valeur discrete manquante " #: src/ui/gui/missing-val-dialog.ui:172 msgid "_Low:" msgstr "_Bas :" #: src/ui/gui/missing-val-dialog.ui:197 msgid "_High:" msgstr "_Haut :" #: src/ui/gui/missing-val-dialog.ui:221 msgid "Di_screte value:" msgstr "Valeur Di_screte :" #: src/ui/gui/missing-val-dialog.ui:245 msgid "_Range plus one optional discrete missing value" msgstr "_Intervalle plus une valeur manquante discrète optionnelle " #: src/ui/gui/oneway.ui:25 msgid "One-Way ANOVA: Contrasts" msgstr "ANOVA à 1 facteur : contrastes" #: src/ui/gui/oneway.ui:107 msgid "_Coefficients:" msgstr "_Coefficients :" #: src/ui/gui/oneway.ui:161 msgid "Coefficient Total: " msgstr "Coefficient total :" #: src/ui/gui/oneway.ui:198 msgid "Contrast 1 of 1" msgstr "Contraste 1 de 1" #: src/ui/gui/oneway.ui:234 #, fuzzy #| msgid "One-Way ANOVA: Contrasts" msgid "One-Way ANOVA: Post-Hoc" msgstr "ANOVA à 1 facteur : contrastes" #: src/ui/gui/oneway.ui:270 #, fuzzy #| msgid "Games-Howell" msgid "Games Howell" msgstr "Games-Howell" #: src/ui/gui/oneway.ui:287 msgid "Fisher's LSD" msgstr "" #: src/ui/gui/oneway.ui:379 msgid "One-Way ANOVA" msgstr "ANOVA à 1 facteur" #: src/ui/gui/oneway.ui:408 msgid "_Factor:" msgstr "_Facteur :" #: src/ui/gui/oneway.ui:451 msgid "Dependent _Variable(s):" msgstr "Variable(s)_dépendante(s) :" #: src/ui/gui/oneway.ui:593 msgid "_Homogeneity" msgstr "_Homogénéité" #: src/ui/gui/oneway.ui:637 msgid "Post-Hoc..." msgstr "" #: src/ui/gui/oneway.ui:652 msgid "_Contrasts..." msgstr "_Contrasts…" #: src/ui/gui/options.ui:25 msgid "Options Case" msgstr "Options de cas" #: src/ui/gui/options.ui:55 msgid "Display _Labels" msgstr "Afficher les étiqu_ettes" #: src/ui/gui/options.ui:71 msgid "Display _Names" msgstr "Afficher les _noms" #: src/ui/gui/options.ui:99 msgid "Sort by L_abel" msgstr "Trier par é_tiquette" #: src/ui/gui/options.ui:115 msgid "Sort by Na_me" msgstr "Tri par n_oms" #: src/ui/gui/options.ui:131 msgid "Do not S_ort" msgstr "Ne _pas trier" #: src/ui/gui/options.ui:159 msgid "Variable Lists" msgstr "Listes de variables" #: src/ui/gui/options.ui:184 msgid "Ma_ximize" msgstr "Ma_ximiser" #: src/ui/gui/options.ui:199 msgid "_Raise" msgstr "Au_gmenter" #: src/ui/gui/options.ui:214 msgid "Aler_t" msgstr "_Alerte" #: src/ui/gui/options.ui:233 msgid "Output Window Action" msgstr "Action de la fenêtre de sortie" #: src/ui/gui/paired-samples.ui:147 msgid "_Test Pair(s):" msgstr "_Paire(s) d’essai :" #: src/ui/gui/rank.ui:30 msgid "Rank Cases: Types" msgstr "Rang d’observations : types" #: src/ui/gui/rank.ui:57 msgid "Sum of case _weights" msgstr "Somme des cas pondérées" #: src/ui/gui/rank.ui:74 msgid "Fractional rank as _%" msgstr "Rang fractionnel comme _%s" #: src/ui/gui/rank.ui:92 msgid "_Fractional rank" msgstr "Rang _fractionnel" #: src/ui/gui/rank.ui:109 msgid "_Savage score" msgstr "_Enregistrement de score" #: src/ui/gui/rank.ui:125 msgid "_Rank" msgstr "_Rang" # ??? Ntiles #: src/ui/gui/rank.ui:147 msgid "N_tiles" msgstr "N_tiles" #: src/ui/gui/rank.ui:195 msgid "_Proportion Estimates" msgstr "Estimation de la _proportion" #: src/ui/gui/rank.ui:213 msgid "_Normal Scores" msgstr "Scores de la _normale" #: src/ui/gui/rank.ui:251 msgid "_Blom" msgstr "_Blom" #: src/ui/gui/rank.ui:269 msgid "Tuke_y" msgstr "Tuke_y" #: src/ui/gui/rank.ui:287 msgid "Ran_kit" msgstr "Ran_kit" #: src/ui/gui/rank.ui:305 msgid "_Van der Waerden" msgstr "_Van der Wärden" #: src/ui/gui/rank.ui:328 msgid "Proportion Estimation Formula" msgstr "Formule de l’estimation de la proportion" #: src/ui/gui/rank.ui:369 msgid "Rank Cases" msgstr "Rang des observations" #: src/ui/gui/rank.ui:434 msgid "_By:" msgstr "_Par :" #: src/ui/gui/rank.ui:595 msgid "_Smallest Value" msgstr "_La plus petite valeur" #: src/ui/gui/rank.ui:613 msgid "_Largest Value" msgstr "_La plus grande valeur" #: src/ui/gui/rank.ui:637 msgid "Assign rank 1 to:" msgstr "Affecter le rang n°1 à :" #: src/ui/gui/rank.ui:656 msgid "_Display summary tables" msgstr "_Afficher le résumé des tableaux" #: src/ui/gui/rank.ui:679 msgid "Rank T_ypes" msgstr "Rang T_ypes" # ??? Ties #: src/ui/gui/rank.ui:694 msgid "_Ties..." msgstr "_Relations…" # ??? Ties #: src/ui/gui/rank.ui:756 msgid "Rank Cases: Ties" msgstr "Rang des cas : relations" #: src/ui/gui/rank.ui:788 msgid "_Mean" msgstr "_Moyenne" #: src/ui/gui/rank.ui:806 msgid "_Low" msgstr "_Bas" #: src/ui/gui/rank.ui:825 msgid "_High" msgstr "_Haut" #: src/ui/gui/rank.ui:851 msgid "_Sequential ranks to unique values" msgstr "Rangs _séquentiel pour les valeurs uniques" # ??? ties #: src/ui/gui/rank.ui:875 msgid "Rank Assigned to Ties" msgstr "Rang assigné aux relations" #: src/ui/gui/runs.ui:155 msgid "M_ean" msgstr "Mo_yenne" #: src/ui/gui/runs.ui:171 msgid "Mo_de" msgstr "Mo_de" #: src/ui/gui/runs.ui:191 msgid "_Custom:" msgstr "_Personnalisé :" #: src/ui/gui/runs.ui:230 msgid "Cut Point" msgstr "Point de coupure" #: src/ui/gui/sort.ui:25 msgid "Sort Cases" msgstr "Tri des observations" #: src/ui/gui/sort.ui:101 msgid "Sort by:" msgstr "Trier par :" #: src/ui/gui/sort.ui:174 msgid "Descending" msgstr "Décroissant" #: src/ui/gui/sort.ui:196 msgid "Sort Order" msgstr "Ordre de tri" #: src/ui/gui/split-file.ui:25 msgid "Split File" msgstr "Scinder le fichier" #: src/ui/gui/split-file.ui:103 msgid "Anal_yze all cases. Do not create groups." msgstr "Anal_yse de tous les cas. Ne crée pas de groupes." #: src/ui/gui/split-file.ui:121 msgid "Compare _groups." msgstr "Compare les _groupes." #: src/ui/gui/split-file.ui:140 msgid "Organize ou_tput by groups." msgstr "Organise les résul_tats par groupes." #: src/ui/gui/split-file.ui:225 msgid "Groups _based on:" msgstr "Groupes _fondés sur :" #: src/ui/gui/split-file.ui:255 msgid "_Sort the file by grouping variables." msgstr "_Tri du fichier en regroupant les variables" #: src/ui/gui/split-file.ui:273 msgid "_File is already sorted." msgstr "_Fichier déjà trié." #: src/ui/gui/split-file.ui:334 msgid "Current Status : " msgstr "Statut courant : " #: src/ui/gui/split-file.ui:348 msgid "Analysis by groups is off" msgstr "L’analyse par groupes est désactivée" #: src/ui/gui/recode.ui:135 msgid "System _Missing" msgstr "Systeme _manquant" #: src/ui/gui/recode.ui:150 msgid "Co_py old values" msgstr "Co_pier les anciennes valeurs" #: src/ui/gui/recode.ui:172 msgid "Va_lue: " msgstr "Va_leur : " #: src/ui/gui/recode.ui:276 msgid "Conver_t numeric strings to numbers (`5' -> 5)" msgstr "Conver_sion des chaînes de chiffres en nombres ('5' -> 5)" #: src/ui/gui/recode.ui:297 msgid "Output variables are _strings" msgstr "Les variables de sortie sont des _chaînes" #: src/ui/gui/recode.ui:318 msgid "Width: " msgstr "Largeur : " #: src/ui/gui/recode.ui:499 msgid "_Name:" msgstr "_Nom :" #: src/ui/gui/recode.ui:527 msgid "La_bel:" msgstr "_Etiquette :" #: src/ui/gui/recode.ui:556 msgid "Chan_ge" msgstr "Chan_gement" #: src/ui/gui/recode.ui:584 msgid "Output Variable" msgstr "Variable en sortie" #: src/ui/gui/recode.ui:658 msgid "Old and New Va_lues..." msgstr "Anciennes et nouvelles va_leurs_" #: src/ui/gui/regression.ui:51 msgid "S_tatistics..." msgstr "S_tatistiques_" #: src/ui/gui/regression.ui:272 msgid "Regression: Save" msgstr "Régression : Enregistrer" #: src/ui/gui/regression.ui:290 src/ui/gui/univariate.ui:42 msgid "_Predicted values" msgstr "Valeurs _prévisionnelles" #: src/ui/gui/regression.ui:307 src/ui/gui/univariate.ui:59 msgid "_Residuals" msgstr "_Résidus" #: src/ui/gui/regression.ui:351 msgid "Regression: Statistics" msgstr "Régression : Statistiques" #: src/ui/gui/regression.ui:393 src/ui/gui/univariate.ui:143 msgid "S_tatistics" msgstr "S_tatistiques" #: src/ui/gui/reliability.ui:34 msgid "Alpha" msgstr "Alpha" #: src/ui/gui/reliability.ui:43 msgid "Reliability Analysis" msgstr "Analyse de confiance" #: src/ui/gui/reliability.ui:144 msgid "_Items:" msgstr "_Items :" #: src/ui/gui/reliability.ui:166 msgid "_Model: " msgstr "_Modèle :" #: src/ui/gui/reliability.ui:212 msgid "_Variables in first split:" msgstr "_Variables dans la première partie du fichier initial :" #: src/ui/gui/reliability.ui:259 msgid "Show _descriptives for scale if item is deleted" msgstr "Montrer les _descriptives pour l’échelle si l’item est effacé" #: src/ui/gui/roc.ui:145 msgid "_Test Variable:" msgstr "_Variable d’essai :" #: src/ui/gui/roc.ui:175 msgid "_State Variable:" msgstr "Variable d’état :" #: src/ui/gui/roc.ui:202 msgid "_Value of state variable:" msgstr "_Valeur de la variable d’état :" #: src/ui/gui/roc.ui:249 msgid "ROC C_urve" msgstr "_Courbe ROC" #: src/ui/gui/roc.ui:269 msgid "_With diagonal reference line" msgstr "_Avec une ligne de référence diagonale" #: src/ui/gui/roc.ui:293 msgid "Standard _Error and Confidence Interval" msgstr "_Erreur standard et intervalle de confiance" #: src/ui/gui/roc.ui:309 msgid "_Coordinate points of the ROC Curve" msgstr "Points de _coordonnées de la courbe ROC" #: src/ui/gui/scatterplot.ui:25 msgid "Scatterplot" msgstr "Nuage de points" #: src/ui/gui/scatterplot.ui:56 msgid "_X Axis:" msgstr "Axe _X :" #: src/ui/gui/scatterplot.ui:100 msgid "_Y Axis:" msgstr "Axe _Y :" #: src/ui/gui/select-cases.ui:37 msgid "Select Cases: Range" msgstr "Sélection d’observations : Intervalle" #: src/ui/gui/select-cases.ui:87 msgid "First case" msgstr "Première observation" #: src/ui/gui/select-cases.ui:99 msgid "Last case" msgstr "Dernière observation" #: src/ui/gui/select-cases.ui:111 msgid "Observation" msgstr "Observation" #: src/ui/gui/select-cases.ui:161 msgid "Select Cases" msgstr "Sélectionner les observations" #: src/ui/gui/select-cases.ui:313 msgid "Use filter variable" msgstr "Utilise la variable filtre" #: src/ui/gui/select-cases.ui:380 msgid "Based on time or case range" msgstr "Établi sur le temps ou l’intervalle des observations" #: src/ui/gui/select-cases.ui:395 msgid "Range..." msgstr "Intervalle…" #: src/ui/gui/select-cases.ui:444 msgid "Random sample of cases" msgstr "Échantillon aléatoire d’observations" #: src/ui/gui/select-cases.ui:460 msgid "Sample..." msgstr "Exemple…" #: src/ui/gui/select-cases.ui:508 msgid "If condition is satisfied" msgstr "Si la condition est satisfaite" #: src/ui/gui/select-cases.ui:523 msgid "If..." msgstr "Si…" #: src/ui/gui/select-cases.ui:567 msgid "All Cases" msgstr "Toutes les observations" #: src/ui/gui/select-cases.ui:581 msgid "Select" msgstr "Sélectionner" #: src/ui/gui/select-cases.ui:608 msgid "Filtered" msgstr "Filtré" #: src/ui/gui/select-cases.ui:625 msgid "Deleted" msgstr "Effacé" #: src/ui/gui/select-cases.ui:647 msgid "Unselected Cases Are" msgstr "Les observations non sélectionnées sont " #: src/ui/gui/select-cases.ui:694 msgid "Select Cases: Random Sample" msgstr "Sélection d’observations : échantillon aléatoire " #: src/ui/gui/select-cases.ui:756 msgid "Sample Size" msgstr "Taille de l’échantillon" #: src/ui/gui/t-test.ui:25 msgid "Options" msgstr "Options" #: src/ui/gui/t-test.ui:63 msgid "Exclude cases _analysis by analysis" msgstr "Observations exclues _analyse par analyse" #: src/ui/gui/t-test.ui:148 msgid "One - Sample T Test" msgstr "Test T Uni-Échantillon" #: src/ui/gui/t-test.ui:265 msgid "Test _Value: " msgstr "_Valeur de test : " #: src/ui/gui/text-data-import.ui:32 msgid "Select the first line of the data file that contains data." msgstr "Sélectionner la première ligne du fichier qui contient les données." #: src/ui/gui/text-data-import.ui:54 msgid "Line above selected line contains variable names" msgstr "La première ligne sélectionnée contient les noms des variables." #: src/ui/gui/text-data-import.ui:80 msgid "" "Check the data formats displayed below and fix any that are incorrect. You " "may set other variable properties now or later." msgstr "" "Vérifiez le format des données affiché au-dessous et régler le s’il est " "incorrect. Vous pouvez fixer d’autres propriétés de variables maintenant ou " "plus tard." #: src/ui/gui/text-data-import.ui:121 msgid "Variables" msgstr "Variable" #: src/ui/gui/text-data-import.ui:152 msgid "Data Preview" msgstr "Prévisualisation des données" #: src/ui/gui/text-data-import.ui:181 msgid "" "This assistant will guide you through the process of importing data into " "PSPP from a text file with one line per case, in which fields are separated " "by tabs, commas, or other delimiters.\n" "\n" "\tThe selected file contains N lines of text. Only the first M of these " "will be shown for preview purposes in the following screens. You may choose " "below how much of the file should actually be imported." msgstr "" "Cet assistant vous guidera dans l’importation des données dans PSPP à partir " "d’un fichier texte contenant une ligne par observation. Les champs sont " "séparés par des tabulations, des virgules ou d’autres délimiteurs. \n" "\n" "Le fichier sélectionné contient N lignes de texte. Seule les M premières " "lignes seront affichées à des fins de prévisualisation dans les écrans " "suivants. " #: src/ui/gui/text-data-import.ui:252 msgid "All cases" msgstr "Toutes les cas" #: src/ui/gui/text-data-import.ui:272 msgid "Amount to Import" msgstr "Somme à importer" #: src/ui/gui/text-data-import.ui:325 msgid "C_ustom" msgstr "C_ustom" #: src/ui/gui/text-data-import.ui:341 msgid "Slas_h (/)" msgstr "Slas_h (/)" #: src/ui/gui/text-data-import.ui:357 msgid "Semicolo_n (;)" msgstr "Point_virgule(;)" #: src/ui/gui/text-data-import.ui:373 msgid "P_ipe (|)" msgstr "P_ipe (|)" #: src/ui/gui/text-data-import.ui:389 msgid "H_yphen (-)" msgstr "H_yphen (-)" #: src/ui/gui/text-data-import.ui:405 msgid "Co_mma (,)" msgstr "Vi_rgule(,)" #: src/ui/gui/text-data-import.ui:421 msgid "_Colon (:)" msgstr "_Colonne (:)" #: src/ui/gui/text-data-import.ui:437 msgid "Ban_g (!)" msgstr "Ban_g (!)" #: src/ui/gui/text-data-import.ui:453 msgid "Ta_b" msgstr "Ta_b" #: src/ui/gui/text-data-import.ui:469 msgid "_Space" msgstr "_Espace" #: src/ui/gui/text-data-import.ui:490 msgid "Separators" msgstr "Séparateurs" #: src/ui/gui/text-data-import.ui:541 msgid "Quote separator characters with" msgstr "Les guillemets sont des caractères de séparation avec " #: src/ui/gui/text-data-import.ui:561 msgid "Quoting" msgstr "Échappement" #: src/ui/gui/text-data-import.ui:599 msgid "Fields Preview" msgstr "Prévisualisaton des champs" #: src/ui/gui/text-data-import.ui:622 msgid "" "Enter below the sheet number and the cell range which you wish to import." msgstr "" "Entrez ci-dessous le numéro de feuille et la plage de cellules que vous " "souhaitez importer." #: src/ui/gui/text-data-import.ui:670 msgid "_Cells: " msgstr "_cellules : " #: src/ui/gui/text-data-import.ui:684 msgid "_Sheet Index: " msgstr "Index de la _feuille : " #: src/ui/gui/text-data-import.ui:695 msgid "Use first row as _variable names" msgstr "Utiliser la première ligne pour les noms de variable" #: src/ui/gui/text-data-import.ui:717 msgid "Cells to Import" msgstr "celludes à importer" #: src/ui/gui/transpose.ui:24 msgid "Transpose" msgstr "Transpose" #: src/ui/gui/transpose.ui:91 msgid "Name Variable:" msgstr "Nom de variable :" #: src/ui/gui/transpose.ui:127 msgid "Variable(s):" msgstr "Variables(s) :" #: src/ui/gui/univariate.ui:25 msgid "Univariate: Save" msgstr "Univariée : Enregistrer" #: src/ui/gui/univariate.ui:103 msgid "Univariate: Statistics" msgstr "Univariée : Statistiques" #: src/ui/gui/univariate.ui:178 msgid "Univariate" msgstr "Univariée" #: src/ui/gui/univariate.ui:281 msgid "_Dependent Variable" msgstr "Variable _dépendante" #: src/ui/gui/univariate.ui:329 msgid "_Fixed Factors" msgstr "_Facteurs fixes" #: src/ui/gui/val-labs-dialog.ui:101 msgid "Value Label:" msgstr "Valeur de l’étiquette :" #: src/ui/gui/data-editor.ui:33 msgid "Information Area" msgstr "Zone d’Information" #: src/ui/gui/data-editor.ui:55 msgid "Case Counter Area" msgstr "Zone de comptage des observations" #: src/ui/gui/data-editor.ui:80 msgid "Filter Use Status Area" msgstr "Indicatif du statut du filtre utilisé" #: src/ui/gui/data-editor.ui:106 msgid "Weight Status Area" msgstr "Indicatatif du statut du poids" #: src/ui/gui/data-editor.ui:132 msgid "Split File Status Area" msgstr "Zone d’état du fichier scindé" #: src/ui/gui/data-editor.ui:154 msgid "_View" msgstr "Affic_hage" #: src/ui/gui/data-editor.ui:157 msgid "_Status Bar" msgstr "_Barre d’état" #: src/ui/gui/data-editor.ui:163 msgid "_Font..." msgstr "_Polices…" #: src/ui/gui/data-editor.ui:167 msgid "_Grid Lines" msgstr "_Quadrillage" #: src/ui/gui/data-editor.ui:171 msgid "Value _Labels" msgstr "_Étiquettes de valeurs" #: src/ui/gui/data-editor.ui:182 msgid "_Variables" msgstr "_Variables " #: src/ui/gui/data-editor.ui:192 msgid "_Sort Cases..." msgstr "Trier les _observations…" #: src/ui/gui/data-editor.ui:196 msgid "_Transpose..." msgstr "_Transposer…" #: src/ui/gui/data-editor.ui:200 msgid "_Aggregate..." msgstr "_Agréger…" #: src/ui/gui/data-editor.ui:206 msgid "S_plit File..." msgstr "_Scinder le fichier…" #: src/ui/gui/data-editor.ui:210 msgid "Select _Cases..." msgstr "_Sélectionner les observations…" #: src/ui/gui/data-editor.ui:214 msgid "_Weight Cases..." msgstr "_Pondérer les observations…" #: src/ui/gui/data-editor.ui:220 msgid "_Transform" msgstr "_Transformer" #: src/ui/gui/data-editor.ui:223 msgid "_Compute..." msgstr "_Calculer…" #: src/ui/gui/data-editor.ui:227 msgid "Cou_nt..." msgstr "Comp_ter…" #: src/ui/gui/data-editor.ui:231 msgid "Ran_k Cases..." msgstr "Classement des _observations…" #: src/ui/gui/data-editor.ui:235 msgid "Auto_matic Recode..." msgstr "Recoder _automatiquement…" #: src/ui/gui/data-editor.ui:241 msgid "Recode into _Same Variables..." msgstr "Recoder en une _même variable…" #: src/ui/gui/data-editor.ui:245 msgid "Recode into _Different Variables..." msgstr "Recoder en _différentes variables…" #: src/ui/gui/data-editor.ui:251 msgid "_Run Pending Transforms" msgstr "_E_xécution des transformations en suspends" #: src/ui/gui/data-editor.ui:257 msgid "_Analyze" msgstr "_Statistiques" #: src/ui/gui/data-editor.ui:260 msgid "_Descriptive Statistics" msgstr "Statistiques _Descriptives" #: src/ui/gui/data-editor.ui:262 msgid "_Frequencies..." msgstr "_Fréquences…" #: src/ui/gui/data-editor.ui:270 msgid "_Explore..." msgstr "_Explorer…" #: src/ui/gui/data-editor.ui:274 msgid "_Crosstabs..." msgstr "_Tableaux croisés…" #: src/ui/gui/data-editor.ui:279 msgid "Compare _Means" msgstr "Comparaison des _Moyennes" #: src/ui/gui/data-editor.ui:281 msgid "_Means..." msgstr "_Moyennes_" #: src/ui/gui/data-editor.ui:285 msgid "_One Sample T Test..." msgstr "Test T _Un-Échantillon…" #: src/ui/gui/data-editor.ui:289 msgid "_Independent Samples T Test..." msgstr "Test T pour Échantillons _Indépendants…" #: src/ui/gui/data-editor.ui:293 msgid "_Paired Samples T Test..." msgstr "Test T pour Échantillons A_ppariés…" #: src/ui/gui/data-editor.ui:297 msgid "One Way _ANOVA..." msgstr "_ANOVA à _1 facteur…" #: src/ui/gui/data-editor.ui:302 msgid "_Univariate Analysis..." msgstr "Analyse _univariée…" #: src/ui/gui/data-editor.ui:306 msgid "Bivariate _Correlation..." msgstr "Corrélation _bivariée…" #: src/ui/gui/data-editor.ui:310 msgid "_K-Means Cluster..." msgstr "Groupe de _K-Means…" #: src/ui/gui/data-editor.ui:314 msgid "_Factor Analysis..." msgstr "Analyse _Factorielle…" #: src/ui/gui/data-editor.ui:318 msgid "Re_liability..." msgstr "_Reliabilité…" #: src/ui/gui/data-editor.ui:322 msgid "_Regression" msgstr "_Régression" #: src/ui/gui/data-editor.ui:325 msgid "_Linear..." msgstr "_Linéaire_" #: src/ui/gui/data-editor.ui:329 msgid "_Binary Logistic..." msgstr "Logistique _binaire…" #: src/ui/gui/data-editor.ui:335 msgid "_Non-Parametric Statistics" msgstr "Statistiques _Non-parametriques" #: src/ui/gui/data-editor.ui:338 msgid "_Chi Square..." msgstr "Khi _Deux…" #: src/ui/gui/data-editor.ui:342 msgid "_Binomial..." msgstr "_Binomiale…" #: src/ui/gui/data-editor.ui:346 msgid "_Runs..." msgstr "E_xécute…" #: src/ui/gui/data-editor.ui:350 msgid "_1 Sample K-S..." msgstr "_1 Échantillon K-S…" #: src/ui/gui/data-editor.ui:354 msgid "_2 Related Samples..." msgstr "_2 Échantillons connexes_" #: src/ui/gui/data-editor.ui:358 msgid "_K Related Samples..." msgstr "_K Échantillons connexes_" #: src/ui/gui/data-editor.ui:362 msgid "K _Independent Samples..." msgstr "Échantillons K _Indépendants…" #: src/ui/gui/data-editor.ui:368 msgid "ROC Cur_ve..." msgstr "_Courbe ROC_" #: src/ui/gui/data-editor.ui:374 msgid "_Graphs" msgstr "_Graphiques" #: src/ui/gui/data-editor.ui:377 msgid "_Scatterplot" msgstr "_Nuage de points" #: src/ui/gui/data-editor.ui:381 msgid "_Histogram" msgstr "_Histogramme" #: src/ui/gui/data-editor.ui:385 msgid "_Barchart" msgstr "Diagramme en barres" #: src/ui/gui/data-editor.ui:391 msgid "_Utilities" msgstr "_Outils" #: src/ui/gui/data-editor.ui:394 msgid "_Variables..." msgstr "_Variables_" #: src/ui/gui/data-editor.ui:398 msgid "Data File _Comments..." msgstr "_Commentaires sur le fichier de données_" #: src/ui/gui/output-window.ui:71 msgid "_Print..." msgstr "Im_primer_" #: src/ui/gui/output-window.ui:76 msgid "_Export..." msgstr "_Export_" #: src/ui/gui/output-window.ui:92 msgid "Select _All" msgstr "Tout_Sélectionner" #: src/ui/gui/syntax-editor.ui:27 msgid "Syntax" msgstr "Syntaxe" #: src/ui/gui/syntax-editor.ui:31 msgid "Data" msgstr "Données" #: src/ui/gui/syntax-editor.ui:41 msgid "_Save" msgstr "_Enregistrer" #: src/ui/gui/syntax-editor.ui:46 msgid "Save _As" msgstr "Enregistrer _sous" #: src/ui/gui/syntax-editor.ui:53 msgid "_Print" msgstr "Im_primer…" #: src/ui/gui/syntax-editor.ui:84 msgid "_Delete" msgstr "_Effacer" #: src/ui/gui/syntax-editor.ui:90 msgid "_Undo" msgstr "_Annuler" #: src/ui/gui/syntax-editor.ui:94 msgid "_Redo" msgstr "_Refaire" #: src/ui/gui/syntax-editor.ui:100 #, fuzzy #| msgid "Find" msgid "_Find" msgstr "Rechercher" #: src/ui/gui/syntax-editor.ui:106 msgid "_Run" msgstr "E_xécuter" #: src/ui/gui/syntax-editor.ui:109 msgid "_All" msgstr "_Tous" #: src/ui/gui/syntax-editor.ui:113 msgid "_Selection" msgstr "_Sélection" #: src/ui/gui/syntax-editor.ui:117 msgid "_Current Line" msgstr "Ligne _actuelle" #: src/ui/gui/syntax-editor.ui:122 msgid "_To End" msgstr "A la _fin" #: src/ui/gui/var-type-dialog.ui:99 msgid "Scientific notation" msgstr "Notation scientifique" #: src/ui/gui/var-type-dialog.ui:150 msgid "Custom currency" msgstr "Monnaie locale" #: src/ui/gui/var-type-dialog.ui:267 msgid "positive" msgstr "positive" #: src/ui/gui/var-type-dialog.ui:279 msgid "negative" msgstr "négative" #: src/ui/gui/var-type-dialog.ui:293 msgid "Sample" msgstr "Échantillon" #: src/ui/gui/var-type-dialog.ui:350 msgid "Width:" msgstr "Largueur :" #: src/ui/gui/var-type-dialog.ui:396 msgid "Decimal Places:" msgstr "Nombre de décimales :" #: src/ui/gui/weight.ui:24 msgid "Weight Cases" msgstr "Pondération des observations" #: src/ui/gui/weight.ui:100 msgid "Weight cases by" msgstr "Pondération des observations par " #: src/ui/gui/weight.ui:144 msgid "Frequency Variable" msgstr "Fréquence de la variable" #: src/ui/gui/weight.ui:198 msgid "Current Status: " msgstr "État actuel : " #. TRANSLATORS: This is the application name in the desktop file #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:7 #: src/ui/gui/org.fsf.pspp.desktop.in:7 msgid "GNU PSPP" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:8 #, fuzzy #| msgid "A program for the analysis of sampled data" msgid "GNU PSPP is a program for statistical analysis of sampled data" msgstr "Un logiciel pour l’analyse d’échantillons de données" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:10 msgid "" "GNU PSPP is a program for the statistical analysis of sampled data. It is a " "Free replacement for the proprietary program SPSS, and appears very similar " "to it with a few exceptions. The most important of these exceptions are, " "that there are no “time bombs”; your copy of PSPP will not “expire” or " "deliberately stop working in the future. Neither are there any artificial " "limits on the number of cases or variables which you can use. There are no " "additional packages to purchase in order to get “advanced” functions; all " "functionality that PSPP currently supports is in the core package." msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:11 msgid "" "PSPP is a stable and reliable application. It can perform descriptive " "statistics, T-tests, anova, linear and logistic regression, measures of " "association, cluster analysis, reliability and factor analysis, non-" "parametric tests and more. Its backend is designed to perform its analyses " "as fast as possible, regardless of the size of the input data. You can use " "PSPP with its graphical interface or the more traditional syntax commands." msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:12 msgid "A brief list of some of the PSPP's features." msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:14 msgid "Support for over 1 billion cases" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:15 msgid "Support for over 1 billion variables" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:16 msgid "Syntax and data files which are compatible with those of SPSS" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:17 msgid "A choice of terminal or graphical user interface" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:18 msgid "A choice of text, postscript, pdf, opendocument or html output formats" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:19 msgid "" "Inter-operability with: LibreOffice, Apache OpenOffice, Gnumeric and other " "free software" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:20 msgid "Easy data import from spreadsheets, text files and database sources" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:21 msgid "" "The capability to open, analyse and edit two or more datasets concurrently" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:22 msgid "A user interface supporting all common character sets" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:23 msgid "A user interface has been translated to multiple languages" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:24 msgid "Very fast statistical procedures, even on very large data sets" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:25 msgid "No license fees and no expiration period" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:26 msgid "No unethical “end user license agreements”" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:27 msgid "A fully indexed user manual" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:28 msgid "Freedom ensured; It is licensed under the GPLv3 or later" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:29 msgid "" "Portability; Runs on many different computers and many different operating " "systems" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:31 msgid "" "PSPP is particularly aimed at statisticians, social scientists and students " "requiring fast convenient analysis of sampled data." msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:41 #, fuzzy #| msgid "Variable View" msgid "GNU PSPP Variable View" msgstr "Affichage des variables" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:54 msgid "Free Software Foundation" msgstr "" #: src/ui/gui/org.fsf.pspp.desktop.in:8 msgid "Statistical Software" msgstr "Logiciel Statistique" #: src/ui/gui/org.fsf.pspp.desktop.in:9 msgid "Analyze statistical data with a free alternative to SPSS" msgstr "Analyse des données statistiques avec une alternative libre à SPSS" #. TRANSLATORS: Do not translate this string. Keep it as is, verbatim. #: src/ui/gui/org.fsf.pspp.desktop.in:12 msgid "pspp" msgstr "" #. TRANSLATORS: You must keep all ";" - also at the end of line. #: src/ui/gui/org.fsf.pspp.desktop.in:17 msgid "statistics;analysis;spss;" msgstr "" # 2012-02-13 11:30 #~ msgid "Sorry. The help system hasn't yet been implemented." #~ msgstr "Désolé. Le système d’aide n’a pas été installé." #~ msgid "Details" #~ msgstr "Détails" #~ msgid "Multiple dichotomy set" #~ msgstr "Ensemble de dichotomie multiple" # ??? #~ msgid "Multiple category set" #~ msgstr "Ensemble de catégories multiples" #~ msgid "Label source" #~ msgstr "Source de l’étiquette" #~ msgid "First variable label among variables" #~ msgstr "Première étiquette de variable parmi les variables" #~ msgid "Provided by user" #~ msgstr "Fourni par l’utilisateur" #~ msgid "Category label source" #~ msgstr "Source d’étiquette de catégorie" #~ msgid "Variable labels" #~ msgstr "Étiquettes de variable" #~ msgid "Value labels of counted value" #~ msgstr "Étiquette de valeur d’une valeur de comptage" #~ msgid "Label:" #~ msgstr "Étiquette :" #~ msgid "No label." #~ msgstr "Aucune étiquette." #~ msgid "Product:" #~ msgstr "Produits :" #~ msgid "Variables:" #~ msgstr "Variables :" #~ msgid "Cases:" #~ msgstr "Observations :" #~ msgid "Type:" #~ msgstr "Type :" #~ msgid "Description" #~ msgstr "Description" #~ msgid "The active dataset does not have a file label." #~ msgstr "Le jeu de données actif n’a pas de nom de fichier." #~ msgid "File label: %s" #~ msgstr "Étiquette du fichier : %s" #~ msgid "The active dataset dictionary does not contain any documents." #~ msgstr "Le jeu de données actif ne contient aucun document." #~ msgid "Documents in the active dataset:" #~ msgstr "Documents dans le jeu de données actif :" #~ msgid "Custom data file attributes." #~ msgstr "Attributs de fichier personnalisés." #~ msgid "Label: %s\n" #~ msgstr "Titre : %s\n" #~ msgid "Format: %s\n" #~ msgstr "Format : %s\n" #~ msgid "Print Format: %s\n" #~ msgstr "Format d’impression : %s\n" #~ msgid "Write Format: %s\n" #~ msgstr "Format d’écriture : %s\n" #~ msgid "Measure: %s\n" #~ msgstr "Mesure : %s\n" #~ msgid "Role: %s\n" #~ msgstr "Rôle : %s\n" #~ msgid "Display Alignment: %s\n" #~ msgstr "Affiche l’alignement : %s\n" #~ msgid "Display Width: %d\n" #~ msgstr "Affiche la largeur : %d\n" #~ msgid "Missing Values: " #~ msgstr "Valeurs manquantes :" #~ msgid "Interactive shell not supported on this platform." #~ msgstr "Interface interactive non disponible sur cette plateforme." #~ msgid "Error executing command: %s." #~ msgstr "Erreur d’exécution de la commande : %s." #~ msgid "Unknown TABLECELLS class" #~ msgstr "Classe TABLECELLS Inconnue" #~ msgid "Exact Sig. (%d-tailed)" #~ msgstr "Sig. exacte (%d-variée)" #~ msgid "Valid N" #~ msgstr "N valide" #~ msgid "Missing N" #~ msgstr "N manquante" #~ msgid "Valid cases = %.*g; cases with missing value(s) = %.*g." #~ msgstr "Cas valides = %.*g; cas avec valeur(s) manquante(s) = %.*g." #~ msgid "%g" #~ msgstr "%g" #~ msgid "%d" #~ msgstr "%d" #~ msgid "%zu" #~ msgstr "%zu" #~ msgid "50 (Median)" #~ msgstr "50 (médiane)" #~ msgid "(%d)" #~ msgstr "(%d)" #~ msgid "Min" #~ msgstr "Minimum" #~ msgid "Max" #~ msgstr "Maximum" #~ msgid "%g%%" #~ msgstr "%g%%" #~ msgid "25th" #~ msgstr "25ème" #~ msgid "50th (Median)" #~ msgstr "50ème (médiane)" #~ msgid "75th" #~ msgstr "75ème" #~ msgid "(I) %s" #~ msgstr "(I) %s" #~ msgid "(J) %s" #~ msgstr "(J) %s" #~ msgid "(I - J)" #~ msgstr "(I - J)" #~ msgid "%s into %s(%s of %s using %s BY %s)" #~ msgstr "%s dans %s(%s de %s utilisant %s BY %s)" #~ msgid "%s into %s(%s of %s BY %s)" #~ msgstr "%s dans %s(%s de %s BY %s)" #~ msgid "%s into %s(%s of %s using %s)" #~ msgstr "%s dans %s(%s de %s utilisant %s)" #~ msgid "%s into %s(%s of %s)" #~ msgstr "%s dans %s(%s de %s)" #~ msgid "Area Under the Curve (%s)" #~ msgstr "Surface située sous la courbe (%s)" #~ msgid "Coordinates of the Curve (%s)" #~ msgstr "Coordonnées de la courbe (%s)" #~ msgid "Std. Error Mean" #~ msgstr "Erreur standard des moyennes" #~ msgid "(active dataset)" #~ msgstr "(jeu de données actif)" #~ msgid "Writing %zu record to %s." #~ msgid_plural "Writing %zu records to %s." #~ msgstr[0] "Écriture de %zu enregistrement dans %s." #~ msgstr[1] "Écriture de %zu enregistrements dans %s." #~ msgid "Writing %zu record." #~ msgid_plural "Writing %zu records." #~ msgstr[0] "Écriture de %zu enregistrement." #~ msgstr[1] "Écriture de %zu enregistrements." #~ msgid "Unsupported compression type (%d)" #~ msgstr "Type de compression (%d) non supporté)" #~ msgid "Failed to seek to end of central directory record: %s" #~ msgstr "" #~ "Impossible de rechercher à la fin de l’enregistrement du répertoire " #~ "principal : %s" #~ msgid "Failed to seek to central directory: %s" #~ msgstr "Impossible de rechercher jusqu’au répertoire principal : %s" #~ msgid "Failed to seek to start of member `%s': %s" #~ msgstr "Impossible de chercher à lancer %s de membre : %s" #~ msgid "ascii: closing output file `%s'" #~ msgstr "ascii : fermeture du fichier de sortie « %s »" #~ msgid "%s - Page %d" #~ msgstr "%s - Page %d" #~ msgid "bad vline: x=%d+%d=%d y=(%d+%d=%d,%d+%d=%d) in table size (%d,%d)\n" #~ msgstr "" #~ "vline incorrect : x=%d+%d=%d y=(%d+%d=%d,%d+%d=%d) dans la taille du " #~ "tableau (%d,%d)\n" #~ msgid "bad hline: x=(%d+%d=%d,%d+%d=%d) y=%d+%d=%d in table size (%d,%d)\n" #~ msgstr "" #~ "hline incorrect : x=(%d+%d=%d,%d+%d=%d) y=%d+%d=%d dans la taille du " #~ "tableau (%d,%d)\n" #~ msgid "" #~ "bad box: (%d+%d=%d,%d+%d=%d)-(%d+%d=%d,%d+%d=%d) in table size (%d,%d)\n" #~ msgstr "" #~ "box incorrect : (%d+%d=%d,%d+%d=%d)-(%d+%d=%d,%d+%d=%d) dans la taille du " #~ "tableau (%d,%d)\n" #~ msgid "can only convert encrypted data file to sav or sys format" #~ msgstr "" #~ "conversion du fichier de données crypté possible seulement au format sav " #~ "ou sys" #~ msgid "can only convert encrypted syntax file to sps format" #~ msgstr "" #~ "conversion du fichier de syntaxe crypté possible seulement au format sps" #~ msgid "count" #~ msgstr "nombre" #~ msgid "expected" #~ msgstr "attendu" #~ msgid "residual" #~ msgstr "résidus" #~ msgid "std. resid." #~ msgstr "résidus standardisés" #~ msgid "adj. resid." #~ msgstr "résidus ajustés" #~ msgid "Chi-square tests." #~ msgstr "Tests de Khi-Deux." #~ msgid "Odds Ratio for %s (%.*s / %.*s)" #~ msgstr "Proportion de chances pour %s (%.*s / %.*s)" #~ msgid "For cohort %s = %.*s" #~ msgstr "Pour une cohorte %s = %.*s" pspp-1.4.1/po/pl.po0000644000175000017500000117724313725012645013530 0ustar00blpblp00000000000000# Polish translation for PSPP # Copyright (C) 2014 Free Software Foundation, Inc. # This file is distributed under the same license as the pspp package. # Radosław Rogoza , 2014 - # Jan Cieciuch , 2014 msgid "" msgstr "" "Project-Id-Version: pspp 0.8.4\n" "Report-Msgid-Bugs-To: pspp-dev@gnu.org\n" "PO-Revision-Date: 2014-11-16 18:18+0100\n" "Last-Translator: Radosław Rogoza \n" "Language-Team: Polish \n" "Language: pl_PL\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Bugs: Report translation errors to the Language-Team address.\n" "Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " "|| n%100>=20) ? 1 : 2);\n" "X-Generator: Poedit 1.6.10\n" #: src/data/any-reader.c:72 src/data/encrypted-file.c:78 #, c-format msgid "An error occurred while opening `%s': %s." msgstr "Podczas otwierania `%s': %s wystąpił błąd." #: src/data/any-reader.c:93 src/language/lexer/lexer.c:1633 #, c-format msgid "Error reading `%s': %s." msgstr "Błąd otwierania `%s': %s." #: src/data/any-reader.c:114 #, c-format msgid "`%s' is not a system or portable file." msgstr "`%s' nie jest plikiem systemowym lub przenośnym." #: src/data/any-reader.c:123 src/data/any-writer.c:66 msgid "The inline file is not allowed here." msgstr "Pliki wbudowane w pliku nie są tu dopuszczalne." #: src/data/any-reader.c:205 #, c-format msgid "" "Cannot read from dataset %s because no dictionary or data has been written " "to it yet." msgstr "" "Nie można wczytać danych z %s, ponieważ nie zapisano w nim słownika lub " "danych." #: src/data/any-reader.c:260 src/language/data-io/dataset.c:253 msgid "Dataset" msgstr "Zbiór danych" #: src/data/calendar.c:100 #, c-format msgid "Month %d is not in acceptable range of 0 to 13." msgstr "Miesiąc %d nie jest w akceptowanym zasięgu od 0 do 13." #: src/data/calendar.c:110 #, c-format msgid "Day %d is not in acceptable range of 0 to 31." msgstr "Dzień %d nie jest w akceptowanym zasięgu od 0 do 31." #: src/data/calendar.c:119 #, c-format msgid "Date %04d-%d-%d is before the earliest acceptable date of 1582-10-15." msgstr "" "Data %04d-%d-%d jest przed najwcześniejszą akceptowaną datą 1582-10-15." #: src/data/casereader-filter.c:221 msgid "" "At least one case in the data read had a weight value that was user-missing, " "system-missing, zero, or negative. These case(s) were ignored." msgstr "" "Przynajmniej jedna wartość we wczytanym zbiorze danych posiadała brak " "danych, brak systemowy, zero lub była ujemna. Wartość ta będzie ignorowana." #. TRANSLATORS: this fragment will be interpolated into messages in fh_lock() #. that identify types of files. #: src/data/csv-file-writer.c:138 msgid "CSV file" msgstr "Plik CSV" #: src/data/csv-file-writer.c:146 #, fuzzy, c-format #| msgid "Error opening `%s' for writing as a system file: %s." msgid "Error opening `%s' for writing as a CSV file: %s." msgstr "Błąd otwierania `%s' dla zapisu jako plik systemowy: %s." #: src/data/csv-file-writer.c:453 #, c-format msgid "An I/O error occurred writing CSV file `%s'." msgstr "Wystąpił błąd wejścia/wyjścia podczas zapisywania pliku CSV `%s'." #: src/data/data-in.c:175 #, c-format msgid "Data is not valid as format %s: %s" msgstr "Dane posiadają niewłaściwy format jak %s: %s" #: src/data/data-in.c:377 src/data/data-in.c:553 msgid "Field contents are not numeric." msgstr "Zawartość pól nie jest numeryczna." #: src/data/data-in.c:379 src/data/data-in.c:555 msgid "Number followed by garbage." msgstr "Po liczbie następuje niewłaściwy znak." #: src/data/data-in.c:392 msgid "Invalid numeric syntax." msgstr "Nieprawidłowy syntax numeryczny." #: src/data/data-in.c:400 src/data/data-in.c:571 msgid "Too-large number set to system-missing." msgstr "Zbyt duża liczba ustawiona jako brak systemowy." #: src/data/data-in.c:406 src/data/data-in.c:577 msgid "Too-small number set to zero." msgstr "Zbyt mała liczba ustawiona jako zero." #: src/data/data-in.c:426 msgid "All characters in field must be digits." msgstr "Wszystkie znaki w polu muszą być liczbami." #: src/data/data-in.c:445 msgid "Unrecognized character in field." msgstr "Nierozpoznany znak w polu." #: src/data/data-in.c:466 src/data/data-in.c:729 msgid "Field must have even length." msgstr "Pola muszą mieć równą długość." #: src/data/data-in.c:468 src/data/data-in.c:732 msgid "Field must contain only hex digits." msgstr "To pole musi zawierać wyłącznie cyfry szesnastkowe." #: src/data/data-in.c:544 msgid "Invalid zoned decimal syntax." msgstr "Nieprawidłowy syntax w obszarze znaków dziesiętnych." #: src/data/data-in.c:644 src/data/data-in.c:650 msgid "Invalid syntax for P field." msgstr "Nieprawidłowy syntax dla pola P." #: src/data/data-in.c:768 src/data/data-in.c:818 msgid "Syntax error in date field." msgstr "Błąd syntaxu w polu daty." #: src/data/data-in.c:783 #, c-format msgid "Day (%ld) must be between 1 and 31." msgstr "Dzień (%ld) musi przyjmować wartości między 1 a 31." #: src/data/data-in.c:832 msgid "Delimiter expected between fields in date." msgstr "Oczekiwany separator między polami w dacie." #: src/data/data-in.c:906 msgid "" "Unrecognized month format. Months may be specified as Arabic or Roman " "numerals or as at least 3 letters of their English names." msgstr "" "Nierozpoznany format miesięcy. Miesiące mogą być określone jako arabskie lub " "rzymskie cyfry lub przynajmniej 3 pierwsze litery ich angielskiej nazwy." #: src/data/data-in.c:933 #, c-format msgid "Year (%ld) must be between 1582 and 19999." msgstr "Rok (%ld) musi przyjmować wartości między 1582 a 19999." #: src/data/data-in.c:944 #, c-format msgid "Trailing garbage `%.*s' following date." msgstr "Nieprawidłowy znak `%.*s' za datą." #: src/data/data-in.c:958 msgid "Julian day must have exactly three digits." msgstr "Dzieńw skali roku musi zawierać dokładnie trzy cyfry." #: src/data/data-in.c:960 #, c-format msgid "Julian day (%ld) must be between 1 and 366." msgstr "Dzień w skali roku (%ld) musi przyjmować wartości między 1 a 366." #: src/data/data-in.c:984 #, c-format msgid "Quarter (%ld) must be between 1 and 4." msgstr "Kwartał (%ld) musi przyjmować wartości między 1 a 4." #: src/data/data-in.c:1005 #, c-format msgid "Week (%ld) must be between 1 and 53." msgstr "Tydzień (%ld) musi przyjmować wartości między 1 a 53." #: src/data/data-in.c:1017 msgid "Delimiter expected between fields in time." msgstr "Oczekiwany separator między polami w czasie." #: src/data/data-in.c:1037 #, c-format msgid "Minute (%ld) must be between 0 and 59." msgstr "Minuta (%ld) musi przyjmować wartości między 0 a 59." #: src/data/data-in.c:1075 msgid "" "Unrecognized weekday name. At least the first two letters of an English " "weekday name must be specified." msgstr "" "Nierozpoznana nazwa dnia tygodnia. Należy określić przynajmniej pierwsze " "dwie litery angielskiej nazwy dnia tygodnia." #: src/data/data-in.c:1210 #, c-format msgid "`%c' expected in date field." msgstr "`%c' oczekiwany w polu daty." #: src/data/data-out.c:580 #, c-format msgid "Weekday number %f is not between 1 and 7." msgstr "Liczba dnia tygodnia %f nie znajduje się między 1 a 7." #: src/data/data-out.c:605 #, c-format msgid "Month number %f is not between 1 and 12." msgstr "Liczba miesiąca %f nie znajduje się między 1 a 12." #. TRANSLATORS: this fragment will be interpolated into #. messages in fh_lock() that identify types of files. #: src/data/dataset-writer.c:66 src/language/data-io/file-handle.c:304 msgid "dataset" msgstr "zbiór danych" #: src/data/dict-class.c:52 msgid "ordinary" msgstr "porządkowy" #: src/data/dict-class.c:54 msgid "system" msgstr "system" #: src/data/dict-class.c:56 msgid "scratch" msgstr "wykreślenie" #: src/data/dictionary.c:1523 #, c-format msgid "Truncating document line to %d bytes." msgstr "Przycinanie linii dokumentu do %d bajtów." #: src/data/encrypted-file.c:89 #, c-format msgid "An error occurred while reading `%s': %s." msgstr "Wystąpił błąd podczas wczytywania `%s': %s." #: src/data/encrypted-file.c:430 #, c-format msgid "" "%s: encrypted file corrupted (ends in incomplete %u-byte ciphertext block)" msgstr "" #: src/data/encrypted-file.c:449 #, c-format msgid "%s: encrypted file corrupted (ends with bad padding)" msgstr "" #: src/data/file-handle-def.c:283 src/language/data-io/dataset.c:266 msgid "active dataset" msgstr "aktywny zbiór danych" #: src/data/file-handle-def.c:518 #, c-format msgid "Can't read from %s as a %s because it is already being read as a %s." msgstr "Nie można wczytać %s jako %s ponieważ jest już używane jako %s." #: src/data/file-handle-def.c:522 #, c-format msgid "Can't write to %s as a %s because it is already being written as a %s." msgstr "Nie można zapisac %s jako %s ponieważ jest już zapisane jako %s." #: src/data/file-handle-def.c:529 #, c-format msgid "Can't re-open %s as a %s." msgstr "Nie można otworzyć ponownie %s jako %s." #: src/data/file-name.c:133 #, c-format msgid "Not opening pipe file `%s' because %s option set." msgstr "Nie można otworzyć pliku `%s', ponieważ uruchomiona jest opcja %s." #: src/data/format.c:339 msgid "Input format" msgstr "Format wejścia" #: src/data/format.c:339 msgid "Output format" msgstr "Format raportu" #: src/data/format.c:342 #, c-format msgid "Format %s may not be used for input." msgstr "Format %s nie może być użyty jako input." #: src/data/format.c:349 #, c-format msgid "%s specifies width %d, but %s requires an even width." msgstr "%s określa szerokość %d, ale %s wymaga równej szerokości." #: src/data/format.c:358 #, c-format msgid "%s %s specifies width %d, but %s requires a width between %d and %d." msgstr "%s %s określa szerokość %d, ale %s wymaga długości między %d i %d." #: src/data/format.c:367 #, c-format msgid "%s %s specifies %d decimal place, but %s does not allow any decimals." msgid_plural "" "%s %s specifies %d decimal places, but %s does not allow any decimals." msgstr[0] "" "%s %s określa miejsca dziesiętne %d, ale %s nie dopuszcza miejsc po " "przecinku." msgstr[1] "" "%s %s określa miejsca dziesiętne %d, ale %s nie dopuszcza miejsc po " "przecinku." msgstr[2] "" "%s %s określa miejsca dziesiętne %d, ale %s nie dopuszcza miejsc po " "przecinku." #: src/data/format.c:378 #, c-format msgid "" "%s %s specifies %d decimal place, but the given width allows at most %d " "decimals." msgid_plural "" "%s %s specifies %d decimal places, but the given width allows at most %d " "decimals." msgstr[0] "" "%s %s określa miejsca dziesiętne %d, ale podana szerokość dopuszcza " "maksymalnie %d miejsc po przecinku." msgstr[1] "" "%s %s określa miejsca dziesiętne %d, ale podana szerokość dopuszcza " "maksymalnie %d miejsc po przecinku." msgstr[2] "" "%s %s określa miejsca dziesiętne %d, ale podana szerokość dopuszcza " "maksymalnie %d miejsc po przecinku." #: src/data/format.c:385 #, c-format msgid "" "%s %s specifies %d decimal place, but the given width does not allow for any " "decimals." msgid_plural "" "%s %s specifies %d decimal places, but the given width does not allow for " "any decimals." msgstr[0] "" "%s %s określa miejsca dziesiętne %d, ale podana szerokość nie dopuszcza " "żadnych miejsc po przecinku." msgstr[1] "" "%s %s określa miejsca dziesiętne %d, ale podana szerokość nie dopuszcza " "żadnych miejsc po przecinku." msgstr[2] "" "%s %s określa miejsca dziesiętne %d, ale podana szerokość nie dopuszcza " "żadnych miejsc po przecinku." #: src/data/format.c:424 #, c-format msgid "%s variables are not compatible with %s format %s." msgstr "Zmienne %s nie są kompatybilne z %s formatem %s." #: src/data/format.c:425 src/data/format.c:1074 #: src/ui/gui/var-type-dialog.ui:167 msgid "String" msgstr "Łańcuchowa" #: src/data/format.c:425 src/data/format.c:1035 #: src/ui/gui/var-type-dialog.ui:48 msgid "Numeric" msgstr "Numeryczna" #: src/data/format.c:426 src/data/sys-file-reader.c:2212 #: src/data/sys-file-reader.c:2214 src/language/xforms/recode.c:512 #: src/language/xforms/recode.c:513 src/language/xforms/recode.c:525 #: src/language/xforms/recode.c:526 #: src/language/dictionary/apply-dictionary.c:77 #: src/language/dictionary/apply-dictionary.c:78 msgid "numeric" msgstr "numeryczna" #: src/data/format.c:426 src/data/sys-file-reader.c:2212 #: src/data/sys-file-reader.c:2214 src/language/xforms/recode.c:512 #: src/language/xforms/recode.c:513 src/language/xforms/recode.c:525 #: src/language/xforms/recode.c:526 #: src/language/dictionary/apply-dictionary.c:77 #: src/language/dictionary/apply-dictionary.c:78 msgid "string" msgstr "łańcuch znaków" #: src/data/format.c:444 #, c-format msgid "String variable with width %d is not compatible with format %s." msgstr "Zmienna tekstowa z szerokością %d nie jest kompatybilna z formatem %s." #: src/data/format.c:1038 src/ui/gui/var-type-dialog.ui:65 msgid "Comma" msgstr "Przecinkowa" #: src/data/format.c:1041 src/ui/gui/var-type-dialog.ui:82 msgid "Dot" msgstr "Z kropką" #: src/data/format.c:1044 msgid "Scientific" msgstr "Naukowe" #: src/data/format.c:1061 src/ui/gui/var-type-dialog.ui:116 msgid "Date" msgstr "Data" #: src/data/format.c:1064 src/ui/gui/var-type-dialog.ui:133 msgid "Dollar" msgstr "Dolar" #: src/data/format.c:1071 msgid "Custom" msgstr "Format użytkownika" #: src/data/gnumeric-reader.c:478 src/data/ods-reader.c:505 #, c-format msgid "Cannot convert the value in the spreadsheet cell %s to format (%s): %s" msgstr "" "Nie można przekształcić wartości w komórce arkusza %s do formatu (%s): %s" #: src/data/gnumeric-reader.c:502 src/data/ods-reader.c:567 #, c-format msgid "" "There was a problem whilst reading the %s file `%s' (near line %d): `%s'" msgstr "" "Wystąpił problem podczas wczytywania pliku %s `%s' (koło linii %d): `%s'" #: src/data/gnumeric-reader.c:597 #, c-format msgid "" "The gnumeric file `%s' is encoded as %s instead of the usual UTF-8 encoding. " "Any non-ascii characters will be incorrectly imported." msgstr "" "Plik gnumeryczny `%s' jest kodowany jako %s zamiast zwykłego kodowania " "UTF-8. Wszystkie znaki nie-ascii będą nieprawidłowo zaimporotwane." #: src/data/gnumeric-reader.c:641 src/data/ods-reader.c:682 #, c-format msgid "Invalid cell range `%s'" msgstr "Nieprawidłowy zakres komórek `%s'" #: src/data/gnumeric-reader.c:813 src/data/ods-reader.c:710 #: src/data/ods-reader.c:843 #, c-format msgid "Selected sheet or range of spreadsheet `%s' is empty." msgstr "Wybrany arkusz lub zakres z arkusza `%s' jest pusty." #: src/data/identifier2.c:60 #, c-format msgid "Identifier `%s' exceeds %d-byte limit." msgstr "Identyfikator `%s' przekracza limit bajtów %d." #: src/data/identifier2.c:84 msgid "Identifier cannot be empty string." msgstr "Identyfikator nie może być pustym łańcuchem." #: src/data/identifier2.c:92 #, c-format msgid "`%s' may not be used as an identifier because it is a reserved word." msgstr "" "`%s' nie może zostać użyte jako identyfikator, ponieważ jest to odwrócone " "słowo." #: src/data/identifier2.c:103 #, c-format msgid "" "`%s' may not be used as an identifier because it contains ill-formed UTF-8 " "at byte offset %tu." msgstr "" "`%s' nie moze być użyty jako identyfikator, ponieważ zawiera źle zbudowany " "UTF-8 w bajcie gałęzi %tu." #: src/data/identifier2.c:114 #, c-format msgid "" "Character %s (in `%s') may not appear as the first character in a identifier." msgstr "Znak %s (w `%s') nie może być pierwszym znakiem w identyfikatorze." #: src/data/identifier2.c:126 #, c-format msgid "Character %s (in `%s') may not appear in an identifier." msgstr "Znak %s (w `%s') nie może być zawarty w identyfikatorze." #: src/data/mdd-writer.c:241 #, fuzzy, c-format #| msgid "I/O error occurred writing data file `%s'." msgid "An I/O error occurred writing metadata file `%s'." msgstr "Nastąpił bład wejścia/wyjścia podczas zapisywania pliku `%s'." #. TRANSLATORS: this fragment will be interpolated into #. messages in fh_lock() that identify types of files. #: src/data/mdd-writer.c:457 #, fuzzy #| msgid "data file" msgid "metadata file" msgstr "Plik danych" #: src/data/mdd-writer.c:465 #, fuzzy, c-format #| msgid "Error opening `%s' for writing as a portable file: %s." msgid "Error opening `%s' for writing as a metadata file: %s." msgstr "Błąd otwierania `%s' dla zapisywania jako plik przenośny: %s." #: src/data/mdd-writer.c:473 #, c-format msgid "Internal error creating xmlTextWriter. Please report this to %s." msgstr "" #: src/data/make-file.c:217 #, c-format msgid "Opening %s for writing: %s." msgstr "Otwieranie %s dla zapisu: %s." #: src/data/make-file.c:228 #, c-format msgid "Opening stream for %s: %s." msgstr "Otwieranie strumienia dla %s: %s." #: src/data/make-file.c:260 #, c-format msgid "Creating temporary file to replace %s: %s." msgstr "Tworzenie plików tymczasowych w celu zastąpienia %s: %s." #: src/data/make-file.c:277 #, c-format msgid "Creating temporary file %s: %s." msgstr "Tworzenie pliku tymczasowego %s: %s." #: src/data/make-file.c:289 #, c-format msgid "Opening stream for temporary file %s: %s." msgstr "Otwieranie strumienia dla pliku tymczasowego %s: %s." #: src/data/make-file.c:326 #, c-format msgid "Replacing %s by %s: %s." msgstr "Zastępowanie %s przez %s: %s." #: src/data/make-file.c:354 #, c-format msgid "Removing %s: %s." msgstr "Usuwanie %s: %s." #: src/data/mrset.c:83 #, c-format msgid "" "%s is not a valid name for a multiple response set. Multiple response set " "names must begin with `$'." msgstr "" "%s nie jest odpowiednią nazwą dla zbioru wielokrotnych odpowiedzi. Zbiór " "wielokrotnych odpowiedzi musi zaczynać się `$'." #: src/data/ods-reader.c:620 #, c-format msgid "Cannot open %s as a OpenDocument file: %s" msgstr "Nie można otworzyć %s jako pliku OpenDocument: %s" #. TRANSLATORS: this fragment will be interpolated into #. messages in fh_lock() that identify types of files. #: src/data/pc+-file-reader.c:206 #, fuzzy #| msgid "system file" msgid "SPSS/PC+ system file" msgstr "plik systemowy" #: src/data/pc+-file-reader.c:215 #, fuzzy, c-format #| msgid "Error opening `%s' for reading as a system file: %s." msgid "Error opening `%s' for reading as an SPSS/PC+ system file: %s." msgstr "Błąd otwierania `%s' dla wczytywania jako plik systemowy: %s." #: src/data/pc+-file-reader.c:224 src/data/sys-file-reader.c:3541 #, c-format msgid "%s: stat failed (%s)." msgstr "%s: stat nie powiodło się (%s)." #: src/data/pc+-file-reader.c:230 #, c-format msgid "%s: file too large." msgstr "" #: src/data/pc+-file-reader.c:257 #, c-format msgid "" "Directory entry is for a %u-byte record starting at offset %u but file is " "only %u bytes long." msgstr "" #: src/data/pc+-file-reader.c:275 #, c-format msgid "Directory fields have unexpected values (%u,%u)." msgstr "" #: src/data/pc+-file-reader.c:372 src/data/sys-file-reader.c:672 #, c-format msgid "Variable %zu" msgstr "Zmienna %zu" #: src/data/pc+-file-reader.c:380 src/data/sys-file-reader.c:680 #, c-format msgid "Variable %zu Label" msgstr "Etykieta zmiennej %zu" #: src/data/pc+-file-reader.c:385 #, fuzzy, c-format #| msgid "Variable %zu Label" msgid "Variable %zu Value Label %zu" msgstr "Etykieta zmiennej %zu" #: src/data/pc+-file-reader.c:388 src/data/sys-file-reader.c:690 msgid "Creation Date" msgstr "Data utworzenia" #: src/data/pc+-file-reader.c:389 src/data/sys-file-reader.c:691 msgid "Creation Time" msgstr "Czas utworzenia" #: src/data/pc+-file-reader.c:390 src/data/sys-file-reader.c:692 #: src/language/dictionary/sys-file-info.c:200 msgid "Product" msgstr "Produkt" #: src/data/pc+-file-reader.c:391 src/data/sys-file-reader.c:693 #: src/language/dictionary/sys-file-info.c:300 msgid "File Label" msgstr "Etykieta pliku" #: src/data/pc+-file-reader.c:427 #, fuzzy, c-format #| msgid "" #| "This system file does not indicate its own character encoding. Using " #| "default encoding %s. For best results, specify an encoding explicitly. " #| "Use SYSFILE INFO with ENCODING=\"DETECT\" to analyze the possible " #| "encodings." msgid "" "Using default encoding %s to read this SPSS/PC+ system file. For best " "results, specify an encoding explicitly. Use SYSFILE INFO with ENCODING=" "\"DETECT\" to analyze the possible encodings." msgstr "" "Ten plik systemowy nie wskazuje własnego kodowania znaków. Zastosowano " "domyślne kodowanie %s. Dla najlepszych rezultatów, określ dokładnie " "kodowanie. Użyj SYSFILE INFO z ENCODING=\"DETECT\" aby analizować możliwe " "kodowania." #: src/data/pc+-file-reader.c:483 src/data/sys-file-reader.c:890 #, c-format msgid "Error closing system file `%s': %s." msgstr "Błąd podczas zamykania pliku systemowego `%s': %s." #: src/data/pc+-file-reader.c:544 #, fuzzy #| msgid "This is not an SPSS system file." msgid "This is not an SPSS/PC+ system file." msgstr "To nie jest plik systemowy SPSS." #: src/data/pc+-file-reader.c:548 #, c-format msgid "Record 0 has unexpected length %u." msgstr "" #: src/data/pc+-file-reader.c:572 #, fuzzy, c-format #| msgid "File specifies unexpected value %g (%a) as %s, instead of %g (%a)." msgid "Record 0 specifies unexpected system missing value %g (%a)." msgstr "Plik określa nieoczekiwaną wartość %g (%a) jako %s, zamiast %g (%a)." #: src/data/pc+-file-reader.c:577 #, c-format msgid "Record 0 reserved fields have unexpected values (%u,%u,%u,%u,%u,%u)." msgstr "" #: src/data/pc+-file-reader.c:581 #, c-format msgid "Record 0 case counts differ (%u versus %u)." msgstr "" #: src/data/pc+-file-reader.c:585 #, fuzzy, c-format #| msgid "Unsupported compression type (%d)" msgid "Invalid compression type %u." msgstr "Nieobsługiwana kompresja typu (%d)" #: src/data/pc+-file-reader.c:596 #, c-format msgid "" "Record 0 claims %u cases with %u values per case (requiring at least %zu " "bytes) but data record is only %u bytes long." msgstr "" #: src/data/pc+-file-reader.c:618 #, c-format msgid "" "Value labels claimed to end at offset %u in labels record but labels record " "is only %u bytes." msgstr "" #: src/data/pc+-file-reader.c:629 #, c-format msgid "" "Value labels claimed to be at offset %u with length %u but file size is only " "%u bytes." msgstr "" #: src/data/pc+-file-reader.c:656 #, c-format msgid "" "Value labels end with partial label (%u bytes left in record, label length " "%)." msgstr "" #: src/data/pc+-file-reader.c:669 #, c-format msgid "%u leftover bytes following value labels." msgstr "" #: src/data/pc+-file-reader.c:685 #, c-format msgid "" "Variable label claimed to start at offset %u in labels record but labels " "record is only %u bytes." msgstr "" #: src/data/pc+-file-reader.c:697 #, c-format msgid "" "Variable label with length %u starting at offset %u in labels record " "overruns end of %u-byte labels record." msgstr "" #: src/data/pc+-file-reader.c:719 #, fuzzy, c-format #| msgid "Record type 7, subtype %d has bad count %u (expected %d)." msgid "Record 1 has length %u (expected %u)." msgstr "Zapis typu 7, podtyp %d ma zły rachunek %u (oczekiwany %d)." #: src/data/pc+-file-reader.c:751 #, fuzzy, c-format #| msgid "Numeric variable %s has invalid format specifier %s." msgid "Variable %u has invalid type %." msgstr "Zmienna numeryczna %s posiada niewłaściwy format specyfikujący %s." #: src/data/pc+-file-reader.c:787 #, fuzzy, c-format #| msgid "Invalid integer." msgid "Invalid weight index %u." msgstr "Nieprawidłowa liczba całkowita." #: src/data/pc+-file-reader.c:857 #, c-format msgid "Invalid variable name `%s'." msgstr "Nieprawidłowa nazwa zmiennej `%s'." #: src/data/pc+-file-reader.c:865 src/data/sys-file-reader.c:1444 #, c-format msgid "Renaming variable with duplicate name `%s' to `%s'." msgstr "Zmiana nazwy zmiennej z taką samą nazwą z `%s' na `%s'." #: src/data/pc+-file-reader.c:877 #, fuzzy, c-format #| msgid "%s is not allowed with string variables." msgid "Cannot weight by string variable `%s'." msgstr "%s nie jest dopuszczalne w zmiennych tekstowych" #: src/data/pc+-file-reader.c:973 src/data/sys-file-reader.c:2762 msgid "File ends in partial case." msgstr "Plik kończy się na niecałkowitej obserwacji." #: src/data/pc+-file-reader.c:979 #, c-format msgid "" "Case beginning at offset 0x%08x extends past end of data record at offset 0x" "%08x." msgstr "" #: src/data/pc+-file-reader.c:998 src/data/sys-file-reader.c:2770 #, c-format msgid "Error reading case from file %s." msgstr "Błąd wczytywanie obserwacji z pliku %s." #: src/data/pc+-file-reader.c:1114 src/data/sys-file-reader.c:2933 #, c-format msgid "" "Possible compressed data corruption: string contains compressed integer " "(opcode %d)." msgstr "" "Możliwe nieprawidłowo skompresowane dane: tekst zawiera skompresowane liczby " "całkowite (opcode %d)." #: src/data/pc+-file-reader.c:1156 src/data/sys-file-reader.c:3234 #, c-format msgid "`%s' near offset 0x%llx: " msgstr "`%s' blisko gałęzi 0x%llx:" #: src/data/pc+-file-reader.c:1159 src/data/sys-file-reader.c:3237 #, c-format msgid "`%s': " msgstr "`%s': " #: src/data/pc+-file-reader.c:1211 src/data/sys-file-reader.c:3288 #, c-format msgid "System error: %s." msgstr "Błąd systemowy: %s." #: src/data/pc+-file-reader.c:1216 src/data/sys-file-reader.c:3293 msgid "Unexpected end of file." msgstr "Nieoczekiwany koniec pliku." #: src/data/pc+-file-reader.c:1301 src/data/sys-file-reader.c:3518 #, c-format msgid "%s: seek failed (%s)." msgstr "%s: poszukiwanie zakończone niepowodzeniem (%s)." #: src/data/pc+-file-reader.c:1351 #, fuzzy #| msgid "System File" msgid "SPSS/PC+ System File" msgstr "Plik systemowy" #: src/data/por-file-reader.c:109 #, c-format msgid "portable file %s corrupt at offset 0x%llx: " msgstr "Przenośny plik %s jest nieprawidłowy w części 0x%llx: " #: src/data/por-file-reader.c:136 #, c-format msgid "reading portable file %s at offset 0x%llx: " msgstr "Wczytywanie pliku tymczasowego %s jako skompensowanego 0x%llx:" #: src/data/por-file-reader.c:164 #, c-format msgid "Error closing portable file `%s': %s." msgstr "Błąd zamknięcia pliku przenośnego `%s': %s." #: src/data/por-file-reader.c:216 msgid "unexpected end of file" msgstr "nieoczekiwany koniec pliku" #. TRANSLATORS: this fragment will be interpolated into #. messages in fh_lock() that identify types of files. #: src/data/por-file-reader.c:275 src/data/por-file-writer.c:147 msgid "portable file" msgstr "plik przenosny" #: src/data/por-file-reader.c:283 #, c-format msgid "" "An error occurred while opening `%s' for reading as a portable file: %s." msgstr "" "Wystąpił błąd podczas otwierania `%s' dla wczytania jako plik tymczasowy: %s." #: src/data/por-file-reader.c:304 msgid "Data record expected." msgstr "Oczekiwany zapis daty." #: src/data/por-file-reader.c:402 msgid "Number expected." msgstr "Oczekiwana liczba." #: src/data/por-file-reader.c:430 msgid "Missing numeric terminator." msgstr "Brak numerycznego terminatora." #: src/data/por-file-reader.c:453 msgid "Invalid integer." msgstr "Nieprawidłowa liczba całkowita." #: src/data/por-file-reader.c:464 src/data/por-file-reader.c:484 #, c-format msgid "Bad string length %d." msgstr "Nieprawidłowa długość łańcucha %d." #: src/data/por-file-reader.c:547 #, c-format msgid "%s: Not a portable file." msgstr "%s: nie jest plikiem przenośnym." #: src/data/por-file-reader.c:564 #, c-format msgid "Unrecognized version code `%c'." msgstr "Nierozpoznana wersja kodu `%c'." #: src/data/por-file-reader.c:577 #, c-format msgid "Bad date string length %zu." msgstr "Nieprawidłowa długość formatu daty %zu." #: src/data/por-file-reader.c:579 #, c-format msgid "Bad time string length %zu." msgstr "Nieprawidłowa długość formatu czasu %zu." #: src/data/por-file-reader.c:630 #, c-format msgid "" "%s: Bad format specifier byte (%d). Variable will be assigned a default " "format." msgstr "" "%s: Nieprawidłowy specyfikator formatu bajtów (%d). Zmienna zostanie " "przypisana do domyślnego formatu." #: src/data/por-file-reader.c:651 #, c-format msgid "Numeric variable %s has invalid format specifier %s." msgstr "Zmienna numeryczna %s posiada niewłaściwy format specyfikujący %s." #: src/data/por-file-reader.c:655 #, c-format msgid "String variable %s with width %d has invalid format specifier %s." msgstr "" "Zmienna tekstowa %s o szerokości %d posiada niewłaściwy format specyfikujący " "%s." #: src/data/por-file-reader.c:679 msgid "Expected variable count record." msgstr "Oczekiwany zapis obliczonej zmiennej." #: src/data/por-file-reader.c:683 #, c-format msgid "Invalid number of variables %d." msgstr "Nieprawidłowa liczba zmiennych %d." #: src/data/por-file-reader.c:692 #, c-format msgid "Weight variable name (%s) truncated." msgstr "Przycięto nazwę zmiennej ważącej (%s)." #: src/data/por-file-reader.c:707 msgid "Expected variable record." msgstr "Oczekiwany zapis zmiennej." #: src/data/por-file-reader.c:711 #, c-format msgid "Invalid variable width %d." msgstr "Nieprawidłowa szerokość zmiennej %d." #: src/data/por-file-reader.c:719 #, c-format msgid "Invalid variable name `%s' in position %d." msgstr "Nieprawidłowa nazwa zmiennej `%s' w pozycji %d." #: src/data/por-file-reader.c:723 src/data/sys-file-reader.c:1426 #, c-format msgid "Bad width %d for variable %s." msgstr "Nieodpowiednia szerokość %d dla zmiennej %s." #: src/data/por-file-reader.c:737 #, c-format msgid "Duplicate variable name %s in position %d renamed to %s." msgstr "Zduplikowana nazwa zmiennej %s w pozycji %d zmieniona na %s." #: src/data/por-file-reader.c:786 #, c-format msgid "Weighting variable %s not present in dictionary." msgstr "Zmienna ważąca %s jest nieobecna w słowniku danych." #: src/data/por-file-reader.c:830 #, c-format msgid "Unknown variable %s while parsing value labels." msgstr "Nieznana zmienna %s podczas analizy składowej wartości etykiet." #: src/data/por-file-reader.c:833 #, c-format msgid "" "Cannot assign value labels to %s and %s, which have different variable types." msgstr "" "Nie można przypisać etykiety wartości do %s i %s, które są innym typem " "zmiennych." #: src/data/por-file-reader.c:972 #, fuzzy #| msgid "Portable File" msgid "SPSS Portable File" msgstr "Plik przenośny" #: src/data/por-file-writer.c:139 #, c-format msgid "Invalid decimal digits count %d. Treating as %d." msgstr "Nieprawidłowa liczba znaków dziesiętnych %d. Traktuję jako %d." #: src/data/por-file-writer.c:159 #, c-format msgid "Error opening `%s' for writing as a portable file: %s." msgstr "Błąd otwierania `%s' dla zapisywania jako plik przenośny: %s." #: src/data/por-file-writer.c:505 #, c-format msgid "An I/O error occurred writing portable file `%s'." msgstr "" "Wystąpił błąd wejścia/wyjścia podczas zapisywania pliku przenośnego `%s'." #: src/data/psql-reader.c:48 msgid "" "Support for reading postgres databases was not compiled into this " "installation of PSPP" msgstr "" "Wsparcie dla baz danych postgres nie zostało zawarte w tej instalacji PSPP." #: src/data/psql-reader.c:242 msgid "Memory error whilst opening psql source" msgstr "Bład pamięci podczas otwierania źródła psql" #: src/data/psql-reader.c:248 #, c-format msgid "Error opening psql source: %s." msgstr "Błąd otwierania źródła psql: %s." #: src/data/psql-reader.c:263 #, c-format msgid "" "Postgres server is version %s. Reading from versions earlier than 8.0 is not " "supported." msgstr "" "Serwer postgres jest w wersji %s. Wczytywanie z wersji wcześniejszych niż " "8.0 nie jest obsługiwane." #: src/data/psql-reader.c:283 msgid "" "Connection is unencrypted, but unencrypted connections have not been " "permitted." msgstr "" "Połączenie nie jest kodowane. Niekodowane połączenia są niedopuszczalne." #: src/data/psql-reader.c:324 src/data/psql-reader.c:349 #: src/data/psql-reader.c:359 #, c-format msgid "Error from psql source: %s." msgstr "Błąd źródła psql: %s." #: src/data/psql-reader.c:454 #, c-format msgid "Unsupported OID %d. SYSMIS values will be inserted." msgstr "Nieobsługiwane OID %d. Zostaną wstawione wartości SYSMIS." #: src/data/settings.c:391 msgid "" "MXWARNS set to zero. No further warnings will be given even when " "potentially problematic situations are encountered." msgstr "" "MXWARNS ustawione na zero. Dalsze ostrzeżenia nie będą wyświetlane, nawet " "gdy napotkane zostaną potencjalnie problematyczne sytuacje." #: src/data/settings.c:398 #, c-format msgid "" "Warnings re-enabled. %d warnings will be issued before aborting syntax " "processing." msgstr "" "Ostrzeżenia ponownie właczone. %d ostrzeżenia będą raportowane przed " "zamknięciem procesu syntaxu." #: src/data/settings.c:618 #, c-format msgid "" "%s: Custom currency string `%s' does not contain exactly three periods or " "commas (or it contains both)." msgstr "" "%s: Inna zmienna waluty `%s' nie zawiera dokładnie trzech kropek lub " "przecinków (lub zawiera oba)." #. TRANSLATORS: this fragment will be interpolated into #. messages in fh_lock() that identify types of files. #: src/data/sys-file-reader.c:407 src/data/sys-file-writer.c:245 msgid "system file" msgstr "plik systemowy" #: src/data/sys-file-reader.c:414 #, c-format msgid "Error opening `%s' for reading as a system file: %s." msgstr "Błąd otwierania `%s' dla wczytywania jako plik systemowy: %s." #: src/data/sys-file-reader.c:491 msgid "Misplaced type 4 record." msgstr "Zapis typu 4 jest źle ulokowany." #: src/data/sys-file-reader.c:496 msgid "Duplicate type 6 (document) record." msgstr "Duplikacja zapisu typu 6 (dokument)." #: src/data/sys-file-reader.c:506 src/data/sys-file-reader.c:1343 #, fuzzy, c-format #| msgid "" #| "Unrecognized record type 7, subtype %d. Please send a copy of this file, " #| "and the syntax which created it to %s." msgid "" "Unrecognized record type 7, subtype %d. For help, please send this file to " "%s and mention that you were using %s." msgstr "" "Nierozpoznany zapis typu 7m podtyp %d. Proszę wyślij kopię tego pliku i " "syntaxu, który stworzono do %s." #: src/data/sys-file-reader.c:526 #, fuzzy, c-format #| msgid "" #| "Record type 7, subtype %d found here has the same type as the record " #| "found near offset 0x%llx. Please send a copy of this file, and the " #| "syntax which created it to %s." msgid "" "Record type 7, subtype %d found here has the same type as the record found " "near offset 0x%llx. For help, please send this file to %s and mention that " "you were using %s." msgstr "" "Zapis typu 7, podtyp %d, który zawarto tutaj posiada ten sam typ jak zapis " "odnaleziony nieopodal skompensowanego 0x%llx. Proszę wyślij kopię tego pliku " "i syntaxu, który stworzono do %s." #: src/data/sys-file-reader.c:538 #, c-format msgid "Unrecognized record type %d." msgstr "Nierozpoznany zapis typu %d." #: src/data/sys-file-reader.c:688 #, c-format msgid "Value Label %zu" msgstr "Etykieta wartości %zu" #: src/data/sys-file-reader.c:697 msgid "Extra Product Info" msgstr "Dodatkowe informacje o produkcie" #: src/data/sys-file-reader.c:710 #, c-format msgid "Document Line %zu" msgstr "Linia dokumentu %zu" #: src/data/sys-file-reader.c:718 #, c-format msgid "MRSET %zu" msgstr "MRSET %zu" #: src/data/sys-file-reader.c:720 #, c-format msgid "MRSET %zu Label" msgstr "Etykieta MRSET %zu" #: src/data/sys-file-reader.c:725 #, c-format msgid "MRSET %zu Counted Value" msgstr "Obliczona wartość MRSET %zu" #: src/data/sys-file-reader.c:763 #, c-format msgid "" "This system file does not indicate its own character encoding. Using " "default encoding %s. For best results, specify an encoding explicitly. Use " "SYSFILE INFO with ENCODING=\"DETECT\" to analyze the possible encodings." msgstr "" "Ten plik systemowy nie wskazuje własnego kodowania znaków. Zastosowano " "domyślne kodowanie %s. Dla najlepszych rezultatów, określ dokładnie " "kodowanie. Użyj SYSFILE INFO z ENCODING=\"DETECT\" aby analizować możliwe " "kodowania." #: src/data/sys-file-reader.c:845 #, c-format msgid "File header claims %d variable positions but %zu were read from file." msgstr "" "Nagłówek pliku zawiera %d pozycji zmiennych, ale %zu zostały wczytany z " "pliku." #: src/data/sys-file-reader.c:958 src/data/sys-file-reader.c:972 msgid "This is not an SPSS system file." msgstr "To nie jest plik systemowy SPSS." #: src/data/sys-file-reader.c:1027 msgid "" "Compression bias is not the usual value of 100, or system file uses " "unrecognized floating-point format." msgstr "" "Stronniczość kompresji nie posiada zwyczajnej wartości równej 100, lub plik " "systemowy używa nierozpoznanego formatu liczby zmiennoprzecinkowej." #: src/data/sys-file-reader.c:1102 msgid "Variable label indicator field is not 0 or 1." msgstr "Wskaźnik etykiety zmiennej nie jest równy ani 0 ani 1." #: src/data/sys-file-reader.c:1115 msgid "Numeric missing value indicator field is not -3, -2, 0, 1, 2, or 3." msgstr "" "Numeryczny wskaźnik brakujących wartości nie jest równy -3, -2, 0, 1, 2 lub " "3." #: src/data/sys-file-reader.c:1125 msgid "String missing value indicator field is not 0, 1, 2, or 3." msgstr "Tekstowy wskaźnik brakujących wartości nie jest równy 0, 1, 2 lub 3." #: src/data/sys-file-reader.c:1152 #, c-format msgid "Invalid number of labels %u." msgstr "Nieprawdłowa liczba etykiet %u." #: src/data/sys-file-reader.c:1185 msgid "" "Variable index record (type 4) does not immediately follow value label " "record (type 3) as it should." msgstr "" "Katalog zapisu zmiennych (typ 4) nie podąża bezpośrednio za etykierą " "wartości (typ 3) jak powinien." #: src/data/sys-file-reader.c:1197 #, c-format msgid "" "Number of variables associated with a value label (%u) is not between 1 and " "the number of variables (%zu)." msgstr "" "Liczba zmiennych powiązanych z etykietąwartości (%u) nie znajduje się między " "1 a liczbą wszystkich zmiennych (%zu)." #: src/data/sys-file-reader.c:1224 #, c-format msgid "Number of document lines (%d) must be greater than 0 and less than %d." msgstr "" "Liczba linii w dokumencie (%d) musi być większa niż 0 i mniejsza niż %d." #: src/data/sys-file-reader.c:1317 #, c-format msgid "Record type 7, subtype %d has bad size %u (expected %d)." msgstr "Zapis typu 7, podtyp %d ma złą wielkość %u (oczekiwana %d)." #: src/data/sys-file-reader.c:1321 #, c-format msgid "Record type 7, subtype %d has bad count %u (expected %d)." msgstr "Zapis typu 7, podtyp %d ma zły rachunek %u (oczekiwany %d)." #: src/data/sys-file-reader.c:1435 #, fuzzy, c-format #| msgid "Renaming variable with duplicate name `%s' to `%s'." msgid "Renaming variable with invalid name `%s' to `%s'." msgstr "Zmiana nazwy zmiennej z taką samą nazwą z `%s' na `%s'." #: src/data/sys-file-reader.c:1517 msgid "Missing string continuation record." msgstr "Brakująca kontynuacja zapisu tekstowego." #: src/data/sys-file-reader.c:1550 #, c-format msgid "Variable %s with width %d has invalid print format 0x%x." msgstr "Zmienna %s o szerokości %d posiada niewłaściwy format druku 0x%x." #: src/data/sys-file-reader.c:1554 #, c-format msgid "Variable %s with width %d has invalid write format 0x%x." msgstr "Zmienna %s o szerokości %d posiada niewłaściwy format zapisu 0x%x." #: src/data/sys-file-reader.c:1559 msgid "Suppressing further invalid format warnings." msgstr "Tłumienie dalszych komunikatów o nieprawidłowym formacie." #: src/data/sys-file-reader.c:1613 #, c-format msgid "" "Floating-point representation indicated by system file (%d) differs from " "expected (%d)." msgstr "" "Reprezentacja liczby zmiennoprzecinkowej wksazana przez plik systemowy (%d) " "różni się od oczekiwanego (%d)." #: src/data/sys-file-reader.c:1629 #, c-format msgid "" "Integer format indicated by system file (%d) differs from expected (%d)." msgstr "" "Format liczby całkowitej wskazany przez plik systemowy (%d) różni się od " "oczekiwanego (%d)." #: src/data/sys-file-reader.c:1647 src/data/sys-file-reader.c:1653 #, c-format msgid "File specifies unexpected value %g (%a) as %s, instead of %g (%a)." msgstr "Plik określa nieoczekiwaną wartość %g (%a) jako %s, zamiast %g (%a)." #: src/data/sys-file-reader.c:1662 #, c-format msgid "" "File specifies unexpected value %g (%a) as %s, instead of %g (%a) or %g (%a)." msgstr "" "Plik określa nieoczekiwaną wartość %g(%a) jako %s, zamiast %g(%a) lub %g(%a)." #: src/data/sys-file-reader.c:1714 src/data/sys-file-reader.c:1733 #, c-format msgid "Missing space following `%c' at offset %zu in MRSETS record." msgstr "Brakująca spacja następująca `%c' w gałęzi %zu w zapisie MRSETS." #: src/data/sys-file-reader.c:1741 #, fuzzy, c-format #| msgid "" #| "Unexpected label source value following `E' at offset %zu in MRSETS " #| "record." msgid "" "Missing label source value following `E' at offset %zu in MRSETS record." msgstr "Nieoczekiwane źródło etykiety po `E' w gałęzi %zu w zapisie MRSETS." #: src/data/sys-file-reader.c:1748 #, c-format msgid "" "Unexpected label source value following `E' at offset %zu in MRSETS record." msgstr "Nieoczekiwane źródło etykiety po `E' w gałęzi %zu w zapisie MRSETS." #: src/data/sys-file-reader.c:1755 #, c-format msgid "Missing `C', `D', or `E' at offset %zu in MRSETS record." msgstr "Brakujące `C', `D', lub `E' w gałęzi %zu w zapisie MRSETS." #: src/data/sys-file-reader.c:1782 #, c-format msgid "Missing new-line parsing variable names at offset %zu in MRSETS record." msgstr "" "Brakująca analiza składniowa nowej linii nazw zmiennych w gałęzi %zu w " "zapisie MRSETS." #: src/data/sys-file-reader.c:1817 #, fuzzy, c-format #| msgid "No multiple response set named %s." msgid "Invalid multiple response set name `%s'." msgstr "Brak zbioru wielokrotnych odpowiedzi nazwanych %s." #: src/data/sys-file-reader.c:1850 #, c-format msgid "MRSET %s contains duplicate variable name %s." msgstr "MRSET %s zawiera zduplikowaną nazwę zmiennej %s." #: src/data/sys-file-reader.c:1865 #, c-format msgid "MRSET %s contains both string and numeric variables." msgstr "MRSET %s zawiera zarowno zmienne tekstowe i numeryczne." #: src/data/sys-file-reader.c:1877 #, c-format msgid "MRSET %s has no variables." msgstr "MRSET %s nie zawiera zmiennych." #: src/data/sys-file-reader.c:1879 #, c-format msgid "MRSET %s has only one variable." msgstr "MRSET %s zawiera tylko jedną zmienną." #: src/data/sys-file-reader.c:1923 #, c-format msgid "Extension 11 has bad count %u (for %zu variables)." msgstr "Rozszerzenie 11 posiada złą wartość %u (dla %zu zmiennych)." #: src/data/sys-file-reader.c:1956 #, c-format msgid "" "Invalid variable display parameters for variable %zu (%s). Default " "parameters substituted." msgstr "" "Nieprawidłowe wyświetlanie parametrów zmiennych dla zmiennych %zu (%s). " "Zastąpione domyślnymi parametrami." #: src/data/sys-file-reader.c:2000 #, c-format msgid "Duplicate long variable name `%s'." msgstr "Dupliku długą nazwę zmiennej `%s'." #: src/data/sys-file-reader.c:2053 #, c-format msgid "Long variable mapping from %s to invalid variable name `%s'." msgstr "Długie mapowanie zmiennej z %s do niewłaściwej nazwy zmiennej `%s'." #: src/data/sys-file-reader.c:2088 #, c-format msgid "%s listed as string of invalid length %s in very long string record." msgstr "" "%s wskazano jako tekst nieprawidłowej długości %s w bardzo długim zapisie " "tekstowym." #: src/data/sys-file-reader.c:2099 #, c-format msgid "" "%s listed in very long string record with width %s, which requires only one " "segment." msgstr "" "%s znajdujące się w bardzo długim łańcuchu o szerokości %s, wymaga tylko " "jednego segmentu." #: src/data/sys-file-reader.c:2107 #, c-format msgid "Very long string %s overflows dictionary." msgstr "Bardzo długi łańcuch %s przekracza słownik danych." #: src/data/sys-file-reader.c:2125 #, c-format msgid "" "Very long string with width %ld has segment %d of width %d (expected %d)." msgstr "" "Bardzo długi łańcuch o szerokości %ld posiada segment %d o szerokości %d " "(oczekiwana %d)." #: src/data/sys-file-reader.c:2183 #, fuzzy, c-format #| msgid "Variable index %d not in valid range 1...%zu." msgid "Value label variable index %d not in valid range 1...%zu." msgstr "Katalog zmiennych %d nie jest we właściwym zakresie 1...%zu." #: src/data/sys-file-reader.c:2193 #, fuzzy, c-format #| msgid "Variable index %d refers to long string continuation." msgid "Value label variable index %d refers to long string continuation." msgstr "Katalog zmiennych %d odnosi się do kontynuacji długiego łańcucha." #: src/data/sys-file-reader.c:2208 #, c-format msgid "" "Variables associated with value label are not all of identical type. " "Variable %s is %s, but variable %s is %s." msgstr "" "Zmienne powiązane z etykietą wartości nie są identycznego typu. Zmienna %s " "jest %s, ale zmienna %s jest %s." #: src/data/sys-file-reader.c:2226 #, c-format msgid "" "Value labels may not be added to long string variables (e.g. %s) using " "records types 3 and 4." msgstr "" "Etykiety wartości nie mogą zostać dodane do długiego łańcucha zmiennych (np. " "%s) używając zapisów typu 3 i 4." #: src/data/sys-file-reader.c:2255 #, c-format msgid "Duplicate value label for %g on %s." msgstr "Duplikuj etykietę wartości dla %g na %s." #: src/data/sys-file-reader.c:2260 src/data/sys-file-reader.c:2600 #, c-format msgid "Duplicate value label for `%.*s' on %s." msgstr "Duplikuj etykietę wartości dla `%.*s' na %s." #: src/data/sys-file-reader.c:2283 #, fuzzy, c-format #| msgid "Suppressed %d additional related warnings." msgid "Suppressed %d additional warnings for value labels." msgstr "Nie pokazano %d dodatkowych podobnych ostrzeżeń." #: src/data/sys-file-reader.c:2297 #, fuzzy, c-format #| msgid "Variable index %d not in valid range 1...%zu." msgid "" "Weight variable index %d not in valid range 1...%zu. Treating file as " "unweighted." msgstr "Katalog zmiennych %d nie jest we właściwym zakresie 1...%zu." #: src/data/sys-file-reader.c:2307 #, fuzzy, c-format #| msgid "Variable index %d refers to long string continuation." msgid "" "Weight variable index %d refers to long string continuation. Treating file " "as unweighted." msgstr "Katalog zmiennych %d odnosi się do kontynuacji długiego łańcucha." #: src/data/sys-file-reader.c:2315 #, c-format msgid "Ignoring string variable `%s' set as weighting variable." msgstr "Ignorowanie zmiennej `%s' jako zmiennej ważącej." #: src/data/sys-file-reader.c:2352 #, c-format msgid "Error parsing attribute value %s[%d]." msgstr "Błędna analiza składniowa cechy wartości %s[%d]." #: src/data/sys-file-reader.c:2366 #, c-format msgid "Attribute value %s[%d] is not quoted: %s." msgstr "Cecha wartości %s[%d] nie jest wzięta w cudzysłów: %s." #: src/data/sys-file-reader.c:2379 #, fuzzy, c-format #| msgid "Duplicate variable name %s." msgid "Duplicate attribute %s." msgstr "Duplikuj nazwę zmiennej %s." #: src/data/sys-file-reader.c:2463 #, c-format msgid "Invalid role for variable %s." msgstr "Nieprawidłowa rola dla zmiennej %s." #: src/data/sys-file-reader.c:2472 #, c-format msgid "%zu other variables had invalid roles." msgstr "%zu innych zmiennych posiada nieprawidłowe role." #: src/data/sys-file-reader.c:2485 #, c-format msgid "Extension record subtype %d ends unexpectedly." msgstr "Rozszerzenie zapisu subtypu %d nieoczekiwanie się kończy." #: src/data/sys-file-reader.c:2531 #, c-format msgid "Ignoring long string value label record for unknown variable %s." msgstr "" "Ignorowanie długiego tekstu etykiety wartości dla nieznanej zmiennej %s." #: src/data/sys-file-reader.c:2536 #, c-format msgid "Ignoring long string value label record for numeric variable %s." msgstr "" "Ignorowanie długiego tekstu etykiety wartości dla numerycznej zmiennej %s." #: src/data/sys-file-reader.c:2543 #, c-format msgid "" "Ignoring long string value label record for variable %s because the record's " "width (%d) does not match the variable's width (%d)." msgstr "" "Ignorowanie długiego tekstu etykiety wartości dla zmiennej %s, ponieważ " "szerokość zapisu (%d) nie odpowiada szerokości zmiennej (%d)." #: src/data/sys-file-reader.c:2573 #, c-format msgid "" "Ignoring long string value label %zu for variable %s, with width %d, that " "has bad value width %zu." msgstr "" "Ignorowanie długiego tekstu etykiety wartości %zu dla zmiennej %s o " "szerokości %d, która posiada złą wartość szerokości %zu." #: src/data/sys-file-reader.c:2646 #, c-format msgid "" "Long string missing values record says variable %s has %d missing values, " "but only 1 to 3 missing values are allowed." msgstr "" "Brakujące wartości zapisu w długim łańcuchu informują, że zmienna %s ma %d " "brakujących wartości, ale dopuszczalne jest jedynie od 1 do 3." #: src/data/sys-file-reader.c:2656 #, c-format msgid "Ignoring long string missing value record for unknown variable %s." msgstr "" "Ignorowanie długiego łańcucha braków wartości dla nieznanej zmiennej %s." #: src/data/sys-file-reader.c:2661 #, c-format msgid "Ignoring long string missing value record for numeric variable %s." msgstr "" "Ignorowanie długiego łańcucha braków wartości dla numerycznej zmiennej %s." #: src/data/sys-file-reader.c:2686 #, c-format msgid "" "Ignoring long string missing value %zu for variable %s, with width %d, that " "has bad value width %zu." msgstr "" "Ignorowanie długiego łańcucha braków wartości %zu dla zmiennej %s o " "szerokości %d, która byłaby niewłaściwa dla %zu." #: src/data/sys-file-reader.c:2740 msgid "File ends in partial string value." msgstr "Plik kończy się na niecałkowitej wartości tekstowej." #: src/data/sys-file-reader.c:2879 msgid "" "Possible compressed data corruption: compressed spaces appear in numeric " "field." msgstr "" "Możliwe nieprawidłowo skompresowana dane: skompresowane spacje pojawiają się " "w polach numerycznych." #: src/data/sys-file-reader.c:3030 #, c-format msgid "Suppressed %d additional related warnings." msgstr "Nie pokazano %d dodatkowych podobnych ostrzeżeń." #: src/data/sys-file-reader.c:3076 src/data/sys-file-reader.c:3093 #, c-format msgid "Dictionary record refers to unknown variable %s." msgstr "Zapis w słowniku danych odnosi się do nieznanej zmiennej %s." #: src/data/sys-file-reader.c:3159 #, c-format msgid "Expecting digit at offset %zu in MRSETS record." msgstr "Oczekiwanie cyfry w gałęzi %zu w zapisie MRSETS." #: src/data/sys-file-reader.c:3167 #, c-format msgid "Expecting space at offset %zu in MRSETS record." msgstr "Oczekiwane miejsce w gałęzi %zu w zapisie MRSETS." #: src/data/sys-file-reader.c:3175 #, c-format msgid "%zu-byte string starting at offset %zu exceeds record length %zu." msgstr "" "%zu-bajtowy łańcuch zaczynający się w gałęzi %zu przekracza długość zapisu " "%zu." #: src/data/sys-file-reader.c:3185 #, c-format msgid "Expecting space at offset %zu following %zu-byte string." msgstr "Oczekiwanie miejsca po gałęzi %zu po %zu-bajtowym łańcuchu." #: src/data/sys-file-reader.c:3476 #, c-format msgid "Wrong ZLIB data header offset %#llx (expected %#llx)." msgstr "Zły nagłówek ZLIB gałęzi %#llx (oczekiwany %#llx)." #: src/data/sys-file-reader.c:3484 #, c-format msgid "Impossible ZLIB trailer offset 0x%llx." msgstr "Niemożliwe rozszerzenie gałęzi ZLIB 0x%llx." #: src/data/sys-file-reader.c:3491 #, c-format msgid "Invalid ZLIB trailer length %lld." msgstr "Nieprawidłowa długość dopisku ZLIB %lld." #: src/data/sys-file-reader.c:3555 #, c-format msgid "End of ZLIB trailer (0x%llx) is not file size (0x%llx)." msgstr "Koniec dopisku ZLIB (0x%llx) nie jest wielkością pliku (0x%llx)." #: src/data/sys-file-reader.c:3565 #, c-format msgid "ZLIB trailer bias (%lld) differs from file header bias (%.2f)." msgstr "" "Rozszerzenie skośności ZLIB (%lld) różni się od skośności nagłówka (%.2f)." #: src/data/sys-file-reader.c:3575 #, c-format msgid "ZLIB trailer \"zero\" field has nonzero value %lld." msgstr "Dopisek ZLIB \"zero\" posiada wartość nie będącą zerem %lld." #: src/data/sys-file-reader.c:3581 #, c-format msgid "ZLIB trailer specifies unexpected %u-byte block size." msgstr "Rozszerzenie ZLIB określa nieoczekiwany %u-bajtową wielkośc bloku." #: src/data/sys-file-reader.c:3589 #, c-format msgid "%lld-byte ZLIB trailer specifies %u data blocks (expected %lld)." msgstr "" "%lld-bajtowe rozszerzenie ZLIB określa %u bloków danych (oczekiwane %lld)." #: src/data/sys-file-reader.c:3614 #, c-format msgid "" "ZLIB block descriptor %u reported uncompressed data offset %#llx, when %#llx " "was expected." msgstr "" "Deskryptor bloku ZLIB %u raportuje nieskompresowane dane gałęzi %#llx, " "podczas gdy %#llx było oczekiwane." #: src/data/sys-file-reader.c:3623 #, c-format msgid "" "ZLIB block descriptor %u reported compressed data offset %#llx, when %#llx " "was expected." msgstr "" "Deskryptor bloku ZLIB %u raportuje skompresowane dane gałęzi %#llx, podczas " "gdy %#llx było oczekiwane." #: src/data/sys-file-reader.c:3633 #, c-format msgid "" "ZLIB block descriptor %u reported block size %#x, when %#x was expected." msgstr "" "Deskryptor bloku ZLIB %u raportuje wielokość bloku %#x, podczas gdy %#x było " "oczekiwane." #: src/data/sys-file-reader.c:3641 #, c-format msgid "" "ZLIB block descriptor %u reported block size %#x, when at most %#x was " "expected." msgstr "" "Deskryptor bloku ZLIB %u raportuje wielokość bloku %#x, podczas gdy " "maksymalnie %#x było oczekiwane." #: src/data/sys-file-reader.c:3653 #, c-format msgid "" "ZLIB block descriptor %u reports compressed size %u and uncompressed size %u." msgstr "" "Deskryptor bloku ZLIB %u raportuje skompresowaną wielkość %u oraz " "nieskompresowaną wielkość %u." #: src/data/sys-file-reader.c:3665 #, c-format msgid "" "ZLIB trailer is at offset %#llx but %#llx would be expected from block " "descriptors." msgstr "" "Rozszerzenie ZLIB jest w gałęzi %#llx, ale %#llx oczekiwane jest w " "deskryptorach bloków." #: src/data/sys-file-reader.c:3684 #, c-format msgid "ZLIB initialization failed (%s)." msgstr "Uruchomienie ZLIB nie powiodło się (%s)." #: src/data/sys-file-reader.c:3699 #, c-format msgid "Inconsistency at end of ZLIB stream (%s)." msgstr "Niespójnośc na końcu strumienia ZLIB (%s)." #: src/data/sys-file-reader.c:3758 #, c-format msgid "ZLIB stream inconsistency (%s)." msgstr "Niespójność strumienia ZLIB (%s)." #: src/data/sys-file-reader.c:3782 msgid "Unexpected end of ZLIB compressed data." msgstr "Nieoczekiwany koniec ZLIB kompresowanych danych." #: src/data/sys-file-reader.c:3820 #, fuzzy #| msgid "System File" msgid "SPSS System File" msgstr "Plik systemowy" #: src/data/sys-file-writer.c:210 #, c-format msgid "Unknown system file version %d. Treating as version %d." msgstr "Nieznana wersja pliku systemowego %d. Traktuję jako wersję %d." #: src/data/sys-file-writer.c:256 #, c-format msgid "Error opening `%s' for writing as a system file: %s." msgstr "Błąd otwierania `%s' dla zapisu jako plik systemowy: %s." #: src/data/sys-file-writer.c:1271 #, c-format msgid "An I/O error occurred writing system file `%s'." msgstr "" "Wystąpił błąd wejścia/wyjścia podczas zapisywania pliku systemowego `%s'." #: src/data/sys-file-writer.c:1378 #, c-format msgid "Failed to initialize ZLIB for compression (%s)." msgstr "Nie udało się uruchomić ZLIB w celu kompresji (%s)." #: src/data/sys-file-writer.c:1407 #, c-format msgid "Failed to complete ZLIB stream compression (%s)." msgstr "Kompresja strumienia ZLIB (%s) zakończona niepowodzeniem." #: src/data/sys-file-writer.c:1449 #, c-format msgid "ZLIB stream compression failed (%s)." msgstr "Kompresja stromienia ZLIB (%s) zakończona niepowodzeniem." #: src/data/sys-file-writer.c:1491 #, c-format msgid "%s: Seek failed (%s)." msgstr "%s: poszukiwanie zakończone niepowodzeniem (%s)." #: src/data/variable.c:58 msgid "Left" msgstr "Do lewej" #: src/data/variable.c:59 msgid "Right" msgstr "Do prawej" #: src/data/variable.c:60 msgid "Center" msgstr "Wyśrodkowane" #: src/data/variable.c:66 msgid "Nominal" msgstr "Nominalna" #: src/data/variable.c:67 msgid "Ordinal" msgstr "Porządkowa" #: src/data/variable.c:68 src/language/stats/ks-one-sample.c:300 msgid "Scale" msgstr "Ilościowa" #: src/data/variable.c:74 msgid "Input" msgstr "Wejście" #. TRANSLATORS: This will be part of a filename. Please avoid whitespace. #: src/data/variable.c:75 src/output/spv/spv-writer.c:213 #: src/ui/gui/psppire-output-window.c:547 msgid "Output" msgstr "Raport" #: src/data/variable.c:76 msgid "Both" msgstr "Łącznie" #: src/data/variable.c:77 src/language/dictionary/sys-file-info.c:237 #: src/ui/gui/psppire-dialog-action-crosstabs.c:86 #: src/ui/gui/psppire-dialog-action-crosstabs.c:98 #: src/ui/gui/psppire-dialog-action-crosstabs.c:133 #: src/ui/gui/psppire-dialog-action-crosstabs.c:141 #: src/ui/gui/psppire-variable-sheet.c:408 src/ui/gui/var-display.c:34 msgid "None" msgstr "Brak" #: src/data/variable.c:78 msgid "Partition" msgstr "Podział" #: src/data/variable.c:79 src/ui/gui/reliability.ui:37 msgid "Split" msgstr "Separacja" #: src/data/variable.c:729 #, c-format msgid "%s (%s)" msgstr "%s (%s)" #: src/data/variable.c:1339 msgid "" "At least one case in the data file had a weight value that was user-missing, " "system-missing, zero, or negative. These case(s) were ignored." msgstr "" "Co najmniej jedna obserwacja w pliku posiada wartość wagi, która jest " "brakiem danych, brakiem systemowym, zerem, lub jest ujemna. Te przypadki są " "ignorowane." #: src/language/command.c:207 src/language/stats/graph.c:749 #: src/language/stats/graph.c:755 src/language/stats/graph.c:789 #: src/language/stats/graph.c:794 src/language/stats/graph.c:799 #: src/language/stats/graph.c:852 src/language/stats/graph.c:857 #: src/language/stats/graph.c:862 src/language/stats/graph.c:867 #: src/language/stats/graph.c:872 src/language/stats/graph.c:877 #: src/language/stats/graph.c:882 src/language/utilities/set.q:236 #, c-format msgid "%s is not yet implemented." msgstr "%s nie zostało jeszcze zaimplementowane." #: src/language/command.c:212 #, c-format msgid "%s may be used only in testing mode." msgstr "%s może być użyte jedynei w trybie testowym." #: src/language/command.c:217 #, c-format msgid "%s may be used only in enhanced syntax mode." msgstr "%s może być użyte jedynie w rozszerzonym trybie syntaxu." #: src/language/command.c:345 msgid "expecting command name" msgstr "Oczekiwana nazwa polecenia" #: src/language/command.c:347 #, c-format msgid "Unknown command `%s'." msgstr "Nieznane polecenie `%s'." #: src/language/command.c:380 #, c-format msgid "%s is allowed only before the active dataset has been defined." msgstr "%s jest dopuszczalne zanim aktywny zbiór danych zostanie zdefiniowany." #: src/language/command.c:384 #, c-format msgid "%s is allowed only after the active dataset has been defined." msgstr "%s jest dopuszczalne jedynie po zdefiniowaniu aktywnego zbioru." #: src/language/command.c:388 src/language/command.c:392 #, c-format msgid "%s is allowed only inside %s." msgstr "%s jest dopuszczalne jedynie wewnątrz %s." #: src/language/command.c:399 src/language/command.c:403 #, c-format msgid "" "%s is allowed only before the active dataset has been defined or inside %s." msgstr "" "%s jest dopuszczalne zanim aktywny zbiór zostanie zdefiniowany lub wewnątrz " "%s." #: src/language/command.c:407 src/language/command.c:411 #, c-format msgid "" "%s is allowed only after the active dataset has been defined or inside %s." msgstr "" "%s jest dopuszczalne jedynie po zdefiniowaniu aktywnego zbioru danych lub " "wewnątrz %s." #: src/language/command.c:415 #, c-format msgid "%s is allowed only inside %s or inside %s." msgstr "%s jest dopuszczalne jedynie wewnątrz %s lub %s." #: src/language/command.c:421 #, c-format msgid "" "%s is allowed only after the active dataset has been defined, inside INPUT " "PROGRAM, or inside FILE TYPE." msgstr "" "%s jest dopuszczalne jedynie po zdefiniowaniu aktywnego zbioru danych lub " "wewnątrz INPUT PROGRAM lub wewnątrz FILE TYPE." #: src/language/command.c:426 #, c-format msgid "" "%s is allowed only before the active dataset has been defined, inside INPUT " "PROGRAM, or inside FILE TYPE." msgstr "" "%s jest dopuszczalne zanim aktywny zbiór danych zostanie zdefiniowany, " "wewnątrz INPUT PROGRAM lub wewnątrz FILE TYPE." #: src/language/command.c:444 src/language/command.c:447 #, c-format msgid "%s is not allowed inside %s." msgstr "%s nie jest dopuszczalne wewnątrz %s." #: src/language/command.c:529 src/language/utilities/host.c:272 #: src/language/utilities/permissions.c:105 #, c-format msgid "This command not allowed when the %s option is set." msgstr "To polecenie nie jest dopuszczalne kiedy włączona jest opcja %s." #: src/language/command.c:545 #, c-format msgid "Error removing `%s': %s." msgstr "Błąd podczas usuwania `%s': %s." #: src/language/lexer/lexer.c:296 #, c-format msgid "expecting %s" msgstr "Oczekiwane %s" #: src/language/lexer/lexer.c:300 #, c-format msgid "expecting %s or %s" msgstr "Oczekiwane %s lub %s" #: src/language/lexer/lexer.c:304 #, c-format msgid "expecting %s, %s, or %s" msgstr "Oczekiwane %s, %s lub %s" #: src/language/lexer/lexer.c:309 #, c-format msgid "expecting %s, %s, %s, or %s" msgstr "Oczekiwane %s, %s, %s lub %s" #: src/language/lexer/lexer.c:314 #, c-format msgid "expecting %s, %s, %s, %s, or %s" msgstr "Oczekiwane %s, %s, %s, %s lub %s" #: src/language/lexer/lexer.c:319 #, c-format msgid "expecting %s, %s, %s, %s, %s, or %s" msgstr "Oczekiwane %s, %s, %s, %s, %s lub %s" #: src/language/lexer/lexer.c:325 #, c-format msgid "expecting %s, %s, %s, %s, %s, %s, or %s" msgstr "Oczekiwane %s, %s, %s, %s, %s, %s lub %s" #: src/language/lexer/lexer.c:331 #, c-format msgid "expecting %s, %s, %s, %s, %s, %s, %s, or %s" msgstr "Oczekiwane %s, %s, %s, %s, %s, %s, %s lub %s" #: src/language/lexer/lexer.c:351 #, c-format msgid "Subcommand %s may only be specified once." msgstr "Polecenie %s może być określone tylko raz." #: src/language/lexer/lexer.c:363 #, c-format msgid "Required subcommand %s was not specified." msgstr "Wymagane polecenie %s nie zostało określone." #: src/language/lexer/lexer.c:371 #, c-format msgid "%s may only be specified once within subcommand %s" msgstr "%s może być określone jedynie wewnątrz polecenia %s" #: src/language/lexer/lexer.c:380 #, c-format msgid "Required %s specification missing from %s subcommand" msgstr "Wymagane określenie %s brakuje w poleceniu %s." #: src/language/lexer/lexer.c:399 msgid "Syntax error at end of input" msgstr "Błąd syntaxu na końcu inputu" #: src/language/lexer/lexer.c:420 src/language/xforms/select-if.c:60 #: src/language/stats/autorecode.c:206 src/language/stats/npar.c:503 #: src/language/data-io/print-space.c:83 msgid "expecting end of command" msgstr "oczekiwany koniec polecenia" #: src/language/lexer/lexer.c:631 msgid "expecting string" msgstr "oczekiwany łańcuch znaków" #: src/language/lexer/lexer.c:660 msgid "expecting integer" msgstr "oczekiwana liczba całkowita" #: src/language/lexer/lexer.c:673 msgid "expecting number" msgstr "oczekiwana liczba" #: src/language/lexer/lexer.c:685 msgid "expecting identifier" msgstr "oczekiwany identyfikator" #: src/language/lexer/lexer.c:1272 msgid "Syntax error at end of command" msgstr "Błąd syntaxu na końcu polecenia" #: src/language/lexer/lexer.c:1281 #, c-format msgid "Syntax error at `%s'" msgstr "Błąd syntaxu w `%s'" #: src/language/lexer/lexer.c:1284 msgid "Syntax error" msgstr "Błąd syntaxu" #: src/language/lexer/lexer.c:1470 #, c-format msgid "String of hex digits has %d characters, which is not a multiple of 2" msgstr "" "Łańcuch liczb szesnastkowych posiada %d znaków, które nie są wielokrotnością " "2" #: src/language/lexer/lexer.c:1477 #, c-format msgid "`%c' is not a valid hex digit" msgstr "`%c' nie jest odpowiednią liczbą szesnastkową" #: src/language/lexer/lexer.c:1482 #, c-format msgid "" "Unicode string contains %d bytes, which is not in the valid range of 1 to 8 " "bytes" msgstr "" "Łańcuch unicode posiada %d bitów, podczas gdy dopuszczalny zakres to od 1 do " "8 bitów." #: src/language/lexer/lexer.c:1488 #, c-format msgid "U+%04X is not a valid Unicode code point" msgstr "U+%04X nie jest odpowiednim punktem kodu Unicode" #: src/language/lexer/lexer.c:1493 msgid "Unterminated string constant" msgstr "niezakończona stała w łańcuchu" #: src/language/lexer/lexer.c:1497 #, c-format msgid "Missing exponent following `%s'" msgstr "Brakujący wykładnik w `%s'" #: src/language/lexer/lexer.c:1502 msgid "Unexpected `.' in middle of command" msgstr "Nieoczekiwana `.' w środku polecenia" #: src/language/lexer/lexer.c:1508 #, c-format msgid "Bad character %s in input" msgstr "Nieprawidłowy znak %s w inpucie" #: src/language/lexer/lexer.c:1603 #, c-format msgid "Opening `%s': %s." msgstr "Otwieranie `%s': %s." #: src/language/lexer/lexer.c:1647 #, c-format msgid "Error closing `%s': %s." msgstr "Błąd zamknięcia `%s': %s." #: src/language/lexer/subcommand-list.c:118 #, c-format msgid "No more than %d %s subcommands allowed." msgstr "Nie więcej niż %d %s podpoleceń jest dopuszczalnych." #: src/language/lexer/format-parser.c:77 msgid "expecting valid format specifier" msgstr "oczekiwany poprawny specyfikator formatu" #: src/language/lexer/format-parser.c:116 #: src/language/lexer/format-parser.c:143 src/language/utilities/output.c:108 #: src/language/data-io/data-list.c:453 src/language/data-io/get-data.c:638 #: src/language/data-io/placement-parser.c:236 #, c-format msgid "Unknown format type `%s'." msgstr "Nieznany typ formatu `%s'." #: src/language/lexer/format-parser.c:122 #, c-format msgid "Format specifier `%s' lacks required width." msgstr "W specyfikatorze formatu `%s' brakuje wymaganej szerokości." #: src/language/lexer/format-parser.c:138 msgid "expecting format type" msgstr "Oczekiwany typ formatu" #: src/language/lexer/value-parser.c:66 #, c-format msgid "" "The high end of the range (%.*g) is below the low end (%.*g). The range " "will be treated as if reversed." msgstr "" "Górna granica zakresu (%.*g) znajduje się poniżej dolnej granicy (%.*g)> " "Zakres będzie traktowany odwrotnie." #: src/language/lexer/value-parser.c:74 #, c-format msgid "Ends of range are equal (%.*g)." msgstr "Końce zakresu są sobie równe (%.*g)." #: src/language/lexer/value-parser.c:82 #, c-format msgid "%s or %s must be part of a range." msgstr "%s lub %s musi być częścią zakresu." #: src/language/lexer/value-parser.c:112 msgid "System-missing value is not valid here." msgstr "Systemowe braki danych nie są tu dopuszczalną wartością." #: src/language/lexer/variable-parser.c:86 utilities/pspp-convert.c:83 msgid "expecting variable name" msgstr "Oczekiwana nazwa zmiennej." #: src/language/lexer/variable-parser.c:96 #, c-format msgid "%s is not a variable name." msgstr "%s nie jest nazwą zmiennej." #: src/language/lexer/variable-parser.c:206 #, c-format msgid "" "%s is not a numeric variable. It will not be included in the variable list." msgstr "" "%s nie jest zmienną numeryczną. Nie zostanie uwzględniona w liście zmiennych." #: src/language/lexer/variable-parser.c:209 #, c-format msgid "" "%s is not a string variable. It will not be included in the variable list." msgstr "" "%s nie jest zmienną tekstową. Nie zostanie uwzględniona w liście zmiennych." #: src/language/lexer/variable-parser.c:213 #, c-format msgid "Scratch variables (such as %s) are not allowed here." msgstr "Zmienne wykreślone (takie jak %s) nie są tu dopuszczalne." #: src/language/lexer/variable-parser.c:217 #, c-format msgid "" "%s and %s are not the same type. All variables in this variable list must " "be of the same type. %s will be omitted from the list." msgstr "" "%s i %s nie są zmiennymi tego samego typu. Wszystkie zmienne w liście muszą " "być tego samego typu. %s zostanie pominięta." #: src/language/lexer/variable-parser.c:223 #, c-format msgid "" "%s and %s are string variables with different widths. All variables in this " "variable list must have the same width. %s will be omitted from the list." msgstr "" "%s i %s są zmiennymi tekstowymi o różnych szerokościach. Wszystkie zmienne w " "liście muszą mieć taką samą szerokość. %s zostanie pominięta" #: src/language/lexer/variable-parser.c:228 #: src/language/lexer/variable-parser.c:447 #, c-format msgid "Variable %s appears twice in variable list." msgstr "Zmienna %s dwukrotnie pojawia się w liście zmiennych." #: src/language/lexer/variable-parser.c:341 #, c-format msgid "%s TO %s is not valid syntax since %s precedes %s in the dictionary." msgstr "" "%s TO %s nie jest odpowiednim syntaxem, ponieważ %s poprzedza %s w słowniku " "danych." #: src/language/lexer/variable-parser.c:349 #, c-format msgid "" "When using the TO keyword to specify several variables, both variables must " "be from the same variable dictionaries, of either ordinary, scratch, or " "system variables. %s is a %s variable, whereas %s is %s." msgstr "" "Kiedy używane jest słow kluczowe TO, aby określić kilka zmiennych , obie " "zmienne zmienne musza pochodzić z tego samego słownika zmiennych i być tego " "samego typu. %s jest zmienną %s, a %s jest %s." #: src/language/lexer/variable-parser.c:424 #, c-format msgid "`%s' cannot be used with TO because it does not end in a digit." msgstr "`%s' nie może być użyte z TO, ponieważ nie kończy się cyfrą." #: src/language/lexer/variable-parser.c:432 #, c-format msgid "Numeric suffix on `%s' is larger than supported with TO." msgstr "Sufiks numeryczny na `%s' jest większy, niż obsługiwane z TO." #: src/language/lexer/variable-parser.c:505 msgid "Scratch variables not allowed here." msgstr "Zmienne wykreślone nie są tu dopuszczalne." #: src/language/lexer/variable-parser.c:529 msgid "Prefixes don't match in use of TO convention." msgstr "Nie zgadzają się prefiksy w konwencji TO." #: src/language/lexer/variable-parser.c:534 msgid "Bad bounds in use of TO convention." msgstr "Źle wyznaczone granice w konwencji TO." #: src/language/xforms/compute.c:150 src/language/xforms/compute.c:205 #, c-format msgid "" "When executing COMPUTE: SYSMIS is not a valid value as an index into vector " "%s." msgstr "" "Podczas wykonywania COMPUTE:SYSMIS nie jest odpowiednią wartością jako " "indeks do wektora %s." #: src/language/xforms/compute.c:154 src/language/xforms/compute.c:212 #, c-format msgid "" "When executing COMPUTE: %.*g is not a valid value as an index into vector %s." msgstr "" "Podczas wykonywania COMPUTE: %.*g nie jest odpowiednią wartością jako indeks " "do wektora %s." #: src/language/xforms/compute.c:356 #, c-format msgid "There is no vector named %s." msgstr "Nie istnieje wektor o nazwie %s." #: src/language/xforms/count.c:125 msgid "Destination cannot be a string variable." msgstr "Cel nie może być zmienną tekstową." #: src/language/xforms/sample.c:76 msgid "The sampling factor must be between 0 and 1 exclusive." msgstr "Czynnik próbkujący musi znajdować się w przedziale od 0 do 1 włącznie." #: src/language/xforms/sample.c:96 #, c-format msgid "Cannot sample %d observations from a population of %d." msgstr "Nie można wybrać %d obserwacji z populacji %d." #: src/language/xforms/recode.c:261 msgid "" "Inconsistent target variable types. Target variables must be all numeric or " "all string." msgstr "" "Niespójne typy zmiennych wynikowych. Zmienna wynikowe muszą być albo " "numeryczne albo tekstowe." #: src/language/xforms/recode.c:282 msgid "CONVERT requires string input values and numeric output values." msgstr "" "CONVERT wymaga tekstowych wartości wejścia i numerycznych wartości wyjścia." #: src/language/xforms/recode.c:339 #, c-format msgid "%s is not allowed with string variables." msgstr "%s nie jest dopuszczalne w zmiennych tekstowych" #: src/language/xforms/recode.c:422 msgid "expecting output value" msgstr "oczekiwana wartość raportu" #: src/language/xforms/recode.c:479 #, c-format msgid "" "%zu variable(s) cannot be recoded into %zu variable(s). Specify the same " "number of variables as source and target variables." msgstr "" "%zu zmienne nie mogą być rekodowane na %zu zmienne. Określ taką samą liczbę " "zmiennych źródłowych i docelowych." #: src/language/xforms/recode.c:494 #, c-format msgid "" "There is no variable named %s. (All string variables specified on INTO must " "already exist. Use the STRING command to create a string variable.)" msgstr "" "Nie ma zmiennej nazwanej %s. (Wszystkie zmienne tekstowe określone w INTO " "muszą wcześniej istnieć. Użyj komendy STRING, aby stworzyć nową zmienną " "tekstową.)" #: src/language/xforms/recode.c:510 #, c-format msgid "INTO is required with %s input values and %s output values." msgstr "" "INTO jest wymagane przy %s jako wartościach wejścia i %s jako wartościach " "wyjścia." #: src/language/xforms/recode.c:523 #, c-format msgid "Type mismatch. Cannot store %s data in %s variable %s." msgstr "Niedopasowanie typu. Nie można zapisać danych %s w %s zmiennej %s." #: src/language/xforms/recode.c:566 #, c-format msgid "" "Cannot recode because the variable %s would require a width of %d bytes or " "greater, but it has a width of only %d bytes." msgstr "" "Nie można zrekodować, ponieważ zmienna %s wymaga szerokości %d bajtów lub " "większej, a posiada jedynie %d bajtów." #: src/language/xforms/select-if.c:100 msgid "Syntax error expecting OFF or BY. Turning off case filtering." msgstr "" "Błąd syntaxu. Oczekiwane OFF lub BY. Wyłączanie filtrowania obserwacji." #: src/language/xforms/select-if.c:115 msgid "The filter variable must be numeric." msgstr "Zmienna filtrująca musi byc numeryczna." #: src/language/xforms/select-if.c:121 msgid "The filter variable may not be scratch." msgstr "Zmienna filtrująca nie może być wykreślona." #: src/language/control/control-stack.c:49 #, c-format msgid "%s without %s." msgstr "%s bez %s." #: src/language/control/control-stack.c:77 #, c-format msgid "This command must appear inside %s...%s, without intermediate %s...%s." msgstr "" "Ta komenda musi pojawić się wewnątrz %s...%s, bez pośredniczącego %s...%s." #: src/language/control/control-stack.c:94 #, c-format msgid "This command cannot appear outside %s...%s." msgstr "Ta komenda nie może pojawić się poza %s...%s." #: src/language/control/do-if.c:180 #, c-format msgid "This command may not follow %s in %s ... %s." msgstr "Ta komenda nie może następować po %s w %s...%s." #: src/language/control/loop.c:211 msgid "Only one index clause may be specified." msgstr "Można określić tylko jeden warunek katalogu." #: src/language/control/repeat.c:120 #, c-format msgid "Dummy variable name `%s' hides dictionary variable `%s'." msgstr "Nazwa zmiennej imitującej `%s' maskuje zmienną słownika danych `%s'." #: src/language/control/repeat.c:126 #, c-format msgid "Dummy variable name `%s' is given twice." msgstr "Nazwa zmiennej imitującej `%s' podana jest dwukrotnie." #: src/language/control/repeat.c:170 #, c-format msgid "" "Dummy variable `%s' had %zu substitutions, so `%s' must also, but %zu were " "specified." msgstr "" "Zmienna imitująca `%s' posiada %zu zamienników, więc `%s' musi również, ale " "tylko %zu zostało określone." #: src/language/control/repeat.c:379 msgid "Ranges may only have integer bounds." msgstr "Granice zakresu muszą być wyznaczone przez liczby całkowite." #: src/language/control/repeat.c:393 #, c-format msgid "%ld TO %ld is an invalid range." msgstr "%ld TO %ld znajduje się w niewłaściwym zakresie." #: src/language/control/repeat.c:443 #, c-format msgid "No matching %s." msgstr "Brak pasujących %s." #: src/language/control/temporary.c:44 msgid "" "This command may only appear once between procedures and procedure-like " "commands." msgstr "" "Ta komenda może pojawić się jedynie w miejscu pomiędzy komendami " "proceduralnymi i im podobnych." #: src/language/dictionary/attributes.c:104 msgid "Attribute array index must be between 1 and 65535." msgstr "Cecha szyku katalogu musi znajdować się w zakresie między 1 a 65535." #: src/language/dictionary/apply-dictionary.c:74 #, c-format msgid "Variable %s is %s in target file, but %s in source file." msgstr "Zmienna %s jest %s w pliku docelowym, ale %s w pliku źródłowym." #: src/language/dictionary/apply-dictionary.c:110 msgid "No matching variables found between the source and target files." msgstr "" "Nie odnaleziono pasujących zmiennych pomiędzy plikiem źródłowym a docelowym." #: src/language/dictionary/delete-variables.c:40 #: src/language/dictionary/modify-variables.c:79 #: src/language/dictionary/rename-variables.c:51 #, c-format msgid "" "%s may not be used after %s. Temporary transformations will be made " "permanent." msgstr "" "%s nie może być zastosowane po %s. Tumczasowe przekształcenia staną się " "stałe." #: src/language/dictionary/delete-variables.c:48 #: src/language/dictionary/modify-variables.c:312 #, c-format msgid "" "%s may not be used to delete all variables from the active dataset " "dictionary. Use %s instead." msgstr "" "Nie można użyć %s aby usunąć wszystkie zmienne ze słownika danych aktywnego " "zbioru. Zamiast tego użyj %s." #: src/language/dictionary/missing-values.c:70 #, c-format msgid "" "Cannot mix numeric variables (e.g. %s) and string variables (e.g. %s) within " "a single list." msgstr "" "Nie można mieszać zmiennych numerycznych (np. %s) oraz zmiennych tekstowych " "(np. %s) w jednej liście." #: src/language/dictionary/missing-values.c:91 msgid "" "Too many numeric missing values. At most three individual values or one " "value and one range are allowed." msgstr "" #: src/language/dictionary/missing-values.c:126 #, c-format msgid "Truncating missing value to maximum acceptable length (%d bytes)." msgstr "" "Przycinanie brakujących wartości do maksymalnej akceptowalnej długości (%d " "bajtów)." #: src/language/dictionary/missing-values.c:137 msgid "" "Too many string missing values. At most three individual values are allowed." msgstr "" #: src/language/dictionary/missing-values.c:154 #, c-format msgid "Missing values provided are too long to assign to variable of width %d." msgstr "" "Dostarczobe braki danych są zbyt długie, aby przypisać je do zmiennej o " "szerokości %d." #: src/language/dictionary/modify-variables.c:145 msgid "Cannot specify ALL after specifying a set of variables." msgstr "Nie można określać ALL po określeniu zbioru zmiennych." #: src/language/dictionary/modify-variables.c:221 #: src/language/dictionary/rename-variables.c:76 #, c-format msgid "" "Differing number of variables in old name list (%zu) and in new name list " "(%zu)." msgstr "" "Liczba zmiennych w liście starych nazw (%zu) różni się od liczby w liście " "nowych nazw (%zu)." #: src/language/dictionary/modify-variables.c:244 #: src/language/dictionary/modify-variables.c:294 #, c-format msgid "" "%s subcommand may be given at most once. It may not be given in conjunction " "with the %s subcommand." msgstr "" "%s podkomenda może być podana tylko raz. Nie można jej podać w połączeniu z " "podkomendą %s." #: src/language/dictionary/modify-variables.c:331 #, c-format msgid "Unrecognized subcommand name `%s'." msgstr "Nierozpoznana podkomenda o nazwie `%s'." #: src/language/dictionary/modify-variables.c:334 msgid "Subcommand name expected." msgstr "Oczekiwana nazwa subkomendy." #: src/language/dictionary/mrsets.c:117 #, c-format msgid "" "VARIABLES specified only variable %s on %s, but at least two variables are " "required." msgstr "" "VARIABLES określa tylko jedną zmienną %s na %s, ale wymagane jest podanie " "przynajmniej dwóch zmiennych." #: src/language/dictionary/mrsets.c:150 msgid "Numeric VALUE must be an integer." msgstr "Numeryczna VALUE musi być liczbą całkowitą." #: src/language/dictionary/mrsets.c:230 src/language/dictionary/mrsets.c:268 #, c-format msgid "" "MDGROUP subcommand for group %s specifies a string VALUE, but the variables " "specified for this group are numeric." msgstr "" "Podkomenda MDGROUP dla grupy %s określa tekstową VALUE, ale zmienne " "określone w tej grupie są numeryczne." #: src/language/dictionary/mrsets.c:254 #, c-format msgid "" "VALUE string on MDGROUP subcommand for group %s is %d bytes long, but it " "must be no longer than the narrowest variable in the group, which is %s with " "a width of %d bytes." msgstr "" "Tekst VALUE w podkomendzie MDGROUP dla grupy %s jest o %d bajtów za długi. " "Nie może być dłuższy niż najwęższa zmienna w grupie, czyli %s o szrokości %d " "bajtów." #: src/language/dictionary/mrsets.c:280 #, c-format msgid "" "MDGROUP subcommand for group %s specifies LABELSOURCE=VARLABEL but not " "CATEGORYLABELS=COUNTEDVALUES. Ignoring LABELSOURCE." msgstr "" "Podkomenda MDGROUP dla grupy %s określa LABELSOURCE=VARLABEL ale nie " "CATEGORYLABELS=COUNTEDVALUES. Ignorowanie LABELSOURCE." #: src/language/dictionary/mrsets.c:286 #, c-format msgid "" "MDGROUP subcommand for group %s specifies both LABEL and LABELSOURCE, but " "only one of these subcommands may be used at a time. Ignoring LABELSOURCE." msgstr "" "Podkomenda MDGROUP dla grupy %s określa zarówno LABEL i LABELSOURCE, ale " "tylko jedna z nich może być aktywna. Ignorowanie LABELSOURCE." #: src/language/dictionary/mrsets.c:326 #, c-format msgid "" "Variables %s and %s specified as part of multiple dichotomy group %s have " "the same variable label. Categories represented by these variables will not " "be distinguishable in output." msgstr "" "Zmienne %s i %s określone jako część grupy wielokrotnej dychotomii %s " "posiadają tę samą etykietę wartości. Kategorie odzwierciedlanie przez te " "zmienne nie będą możliwe do odróżnienia w raporcie." #: src/language/dictionary/mrsets.c:356 #, c-format msgid "" "Variable %s specified as part of multiple dichotomy group %s (which has " "CATEGORYLABELS=COUNTEDVALUES) has no value label for its counted value. " "This category will not be distinguishable in output." msgstr "" "Zmienna %s określona jako część grupy wielokrotnej dychotomii %s (która " "posiada CATEGORYLABELS=COUNTEDVALUES) nie posiada wartości etykiety dla " "obliczanej wartości. Ta kategoria nie będzie możliwa do odróżnienia w " "raporcie." #: src/language/dictionary/mrsets.c:369 #, c-format msgid "" "Variables %s and %s specified as part of multiple dichotomy group %s (which " "has CATEGORYLABELS=COUNTEDVALUES) have the same value label for the group's " "counted value. These categories will not be distinguishable in output." msgstr "" "Zmienne %s i %s określone jako część grupy wielokrotnej dychotomii %s (która " "posiada CATEGORYLABELS=COUNTEDVALUES) nie posiadają wartości etykiety dla " "obliczanej wartości. Te kategorie nie będą możliwe do odróżnienia w raporcie." #: src/language/dictionary/mrsets.c:426 #, c-format msgid "" "Variables specified on MCGROUP should have the same categories, but %s and " "%s (and possibly others) in multiple category group %s have different value " "labels for value %s." msgstr "" "Zmienne określone w MCGROUP powinny mieć te same kateogrie, jednak %s i %s " "(i prawdopodobnie inne) w grupie wielokrotnych kategorii %s posiadają inne " "etykiety wartości dla wartości %s." #: src/language/dictionary/mrsets.c:484 #, c-format msgid "No multiple response set named %s." msgstr "Brak zbioru wielokrotnych odpowiedzi nazwanych %s." #: src/language/dictionary/mrsets.c:533 msgid "" "The active dataset dictionary does not contain any multiple response sets." msgstr "" "Aktywny zbiór danych nie posiada żadnych zbiorów wielokrotnych odpowiedzi." #: src/language/dictionary/mrsets.c:540 msgid "Multiple Response Sets" msgstr "Zbiór wielokrotnych odpowiedzi" #: src/language/dictionary/mrsets.c:543 #: src/language/dictionary/sys-file-info.c:446 #: src/language/dictionary/sys-file-info.c:733 #: src/language/stats/autorecode.c:375 src/language/data-io/data-parser.c:679 #: src/language/data-io/data-parser.c:725 src/language/data-io/print.c:434 #, fuzzy #| msgid "Attribute" msgid "Attributes" msgstr "Cecha" #: src/language/dictionary/mrsets.c:544 #: src/language/dictionary/sys-file-info.c:191 #: src/language/dictionary/sys-file-info.c:301 #: src/language/dictionary/sys-file-info.c:302 #: src/language/dictionary/sys-file-info.c:455 #: src/language/dictionary/sys-file-info.c:570 #: src/ui/gui/psppire-var-sheet-header.c:67 src/ui/gui/compute.ui:157 msgid "Label" msgstr "Etykieta" #: src/language/dictionary/mrsets.c:544 #: src/language/dictionary/sys-file-info.c:241 #, fuzzy #| msgid "Encoding:" msgid "Encoding" msgstr "Kodowanie:" #: src/language/dictionary/mrsets.c:544 #, fuzzy #| msgid "Counted value" msgid "Counted Value" msgstr "Obliczona wartość" #: src/language/dictionary/mrsets.c:544 #, fuzzy #| msgid "Cl_ear Variables" msgid "Member Variables" msgstr "Wy_czyść zmienne" #: src/language/dictionary/mrsets.c:547 #: src/language/dictionary/sys-file-info.c:470 #: src/ui/gui/psppire-var-sheet-header.c:55 msgid "Name" msgstr "Nazwa" #: src/language/dictionary/mrsets.c:564 msgid "Dichotomies" msgstr "" #: src/language/dictionary/mrsets.c:565 src/language/stats/logistic.c:1391 #, fuzzy #| msgid "Category" msgid "Categories" msgstr "Kategoria" #: src/language/dictionary/numeric.c:67 #, c-format msgid "Format type %s may not be used with a numeric variable." msgstr "Typ formatu %s nie może być zastosowany dla zmiennej numerycznej." #: src/language/dictionary/numeric.c:86 src/language/dictionary/numeric.c:153 #, c-format msgid "There is already a variable named %s." msgstr "W tym zbiorze już znajduje się zmienna nazwana %s." #: src/language/dictionary/numeric.c:138 #, c-format msgid "Format type %s may not be used with a string variable." msgstr "Format typu %s nie może być zastosowany w zmiennej tekstowej." #: src/language/dictionary/rename-variables.c:92 #, c-format msgid "Renaming would duplicate variable name %s." msgstr "Zmiana nazwy spowodowałaby duplikację nazwy zmiennej %s." #: src/language/dictionary/split-file.c:75 #, fuzzy #| msgid "Split File" msgid "Split Values" msgstr "Podziel dane na podzbiory" #: src/language/dictionary/split-file.c:76 #: src/language/dictionary/split-file.c:77 #: src/language/dictionary/sys-file-info.c:696 #: src/language/stats/chisquare.c:195 src/language/stats/cochran.c:156 #: src/language/stats/cochran.c:185 src/language/stats/examine.c:841 #: src/language/stats/reliability.c:648 src/language/stats/reliability.c:651 #: src/language/stats/crosstabs.q:1303 src/language/stats/crosstabs.q:1325 #: src/language/stats/crosstabs.q:1365 src/language/stats/crosstabs.q:1412 msgid "Value" msgstr "Wartość" #: src/language/dictionary/split-file.c:79 #: src/language/dictionary/sys-file-info.c:734 #: src/language/stats/chisquare.c:246 src/language/stats/chisquare.c:328 #: src/language/stats/cochran.c:164 src/language/stats/correlations.c:100 #: src/language/stats/descriptives.c:1004 src/language/stats/friedman.c:226 #: src/language/stats/jonckheere-terpstra.c:377 #: src/language/stats/npar-summary.c:113 src/language/stats/quick-cluster.c:588 #: src/language/stats/runs.c:331 src/language/data-io/data-parser.c:683 #: src/language/data-io/data-parser.c:728 src/language/data-io/print.c:438 #: src/ui/gui/psppire-dictview.c:580 src/ui/gui/psppire-data-editor.c:502 msgid "Variable" msgstr "Zmienna" #: src/language/dictionary/sys-file-info.c:184 #, fuzzy #| msgid "D_isplay Data File Information" msgid "File Information" msgstr "P_okaż opis pliku" #: src/language/dictionary/sys-file-info.c:185 msgid "Attribute" msgstr "Cecha" #: src/language/dictionary/sys-file-info.c:187 #, fuzzy #| msgid "File:" msgid "File" msgstr "Plik:" #: src/language/dictionary/sys-file-info.c:194 #, fuzzy #| msgid "Created:" msgid "Created" msgstr "Utworzono:" #: src/language/dictionary/sys-file-info.c:203 #, fuzzy #| msgid "Integer Format:" msgid "Integer Format" msgstr "Format liczby całkowitej:" #: src/language/dictionary/sys-file-info.c:205 msgid "Big Endian" msgstr "Big Endian" #: src/language/dictionary/sys-file-info.c:206 msgid "Little Endian" msgstr "Little Endian" #: src/language/dictionary/sys-file-info.c:207 #: src/language/dictionary/sys-file-info.c:216 #: src/language/dictionary/sys-file-info.c:223 src/language/utilities/set.q:930 msgid "Unknown" msgstr "Nieznany" #: src/language/dictionary/sys-file-info.c:209 #, fuzzy #| msgid "Real Format:" msgid "Real Format" msgstr "Rzeczywisty format:" #: src/language/dictionary/sys-file-info.c:211 msgid "IEEE 754 LE." msgstr "IEEE 754 LE." #: src/language/dictionary/sys-file-info.c:212 msgid "IEEE 754 BE." msgstr "IEEE 754 BE." #: src/language/dictionary/sys-file-info.c:213 msgid "VAX D." msgstr "VAX D." #: src/language/dictionary/sys-file-info.c:214 msgid "VAX G." msgstr "VAX G." #: src/language/dictionary/sys-file-info.c:215 msgid "IBM 390 Hex Long." msgstr "IBM 390 Hex Long." #: src/language/dictionary/sys-file-info.c:218 #: src/language/dictionary/sys-file-info.c:443 #: src/language/stats/binomial.c:199 src/language/stats/correlations.c:131 #: src/language/stats/correlations.c:159 src/language/stats/descriptives.c:585 #: src/language/stats/factor.c:1658 src/language/stats/factor.c:1701 #: src/language/stats/factor.c:1860 src/language/stats/factor.c:2074 #: src/language/stats/frequencies.c:1583 #: src/language/stats/kruskal-wallis.c:254 #: src/language/stats/kruskal-wallis.c:303 #: src/language/stats/ks-one-sample.c:316 src/language/stats/logistic.c:1187 #: src/language/stats/mann-whitney.c:254 src/language/stats/means.c:718 #: src/language/stats/means.c:800 src/language/stats/median.c:358 #: src/language/stats/oneway.c:985 src/language/stats/oneway.c:1157 #: src/language/stats/reliability.c:591 src/language/stats/regression.c:924 #: src/language/stats/t-test-one-sample.c:132 #: src/language/stats/t-test-paired.c:157 src/language/data-io/list.c:104 #: src/ui/gui/variable-info.ui:25 msgid "Variables" msgstr "Zmienne" #: src/language/dictionary/sys-file-info.c:221 src/language/stats/examine.c:929 #: src/language/stats/means.c:697 src/language/stats/reliability.c:548 #: src/language/stats/crosstabs.q:930 msgid "Cases" msgstr "Obserwacje" #: src/language/dictionary/sys-file-info.c:226 src/language/stats/oneway.c:980 #: src/ui/gui/psppire-var-sheet-header.c:58 src/ui/gui/compute.ui:303 msgid "Type" msgstr "Typ" #: src/language/dictionary/sys-file-info.c:230 #, fuzzy #| msgid "Weight:" msgid "Weight" msgstr "Waga:" #: src/language/dictionary/sys-file-info.c:233 #, fuzzy #| msgid "Not weighted." msgid "Not weighted" msgstr "Nieważone." #: src/language/dictionary/sys-file-info.c:235 #, fuzzy #| msgid "Compression:" msgid "Compression" msgstr "Kompresja:" #: src/language/dictionary/sys-file-info.c:245 #: src/language/dictionary/sys-file-info.c:424 #: src/language/dictionary/sys-file-info.c:426 #, fuzzy #| msgid "Comments:" msgid "Documents" msgstr "Komentarze:" #: src/language/dictionary/sys-file-info.c:305 #: src/language/dictionary/sys-file-info.c:430 msgid "(none)" msgstr "" #: src/language/dictionary/sys-file-info.c:393 msgid "No variables to display." msgstr "Brak zmiennych do wyświetlenia." #: src/language/dictionary/sys-file-info.c:404 msgid "Macros not supported." msgstr "Makra nie są obsługiwane." #: src/language/dictionary/sys-file-info.c:426 #, fuzzy #| msgid "Document Line %zu" msgid "Document" msgstr "Linia dokumentu %zu" #: src/language/dictionary/sys-file-info.c:454 msgid "Position" msgstr "Pozycja" #: src/language/dictionary/sys-file-info.c:456 msgid "Measurement Level" msgstr "" #: src/language/dictionary/sys-file-info.c:457 #: src/ui/gui/psppire-var-sheet-header.c:85 msgid "Role" msgstr "Rola" #: src/language/dictionary/sys-file-info.c:458 #: src/ui/gui/psppire-var-sheet-header.c:61 src/ui/gui/compute.ui:215 msgid "Width" msgstr "Szerokość" #: src/language/dictionary/sys-file-info.c:459 #, fuzzy #| msgid "Align" msgid "Alignment" msgstr "Wyrównanie" #: src/language/dictionary/sys-file-info.c:460 #: src/language/dictionary/sys-file-info.c:734 msgid "Print Format" msgstr "Format druku" #: src/language/dictionary/sys-file-info.c:461 #, fuzzy #| msgid "Print Format" msgid "Write Format" msgstr "Format druku" #: src/language/dictionary/sys-file-info.c:462 #: src/ui/gui/missing-val-dialog.c:379 src/ui/gui/psppire-var-sheet-header.c:73 #: src/ui/gui/examine.ui:416 src/ui/gui/t-test.ui:105 msgid "Missing Values" msgstr "Braki" #: src/language/dictionary/sys-file-info.c:567 #: src/ui/gui/psppire-var-sheet-header.c:70 src/ui/gui/val-labs-dialog.c:489 #: src/ui/gui/val-labs-dialog.ui:194 msgid "Value Labels" msgstr "Wartości" #: src/language/dictionary/sys-file-info.c:573 #, fuzzy #| msgid "Variable View" msgid "Variable Value" msgstr "Zmienne" #: src/language/dictionary/sys-file-info.c:577 #, fuzzy #| msgid "Last non-missing value" msgid "User-missing value" msgstr "Ostatnia wartość nie będąca brakiem danych" #: src/language/dictionary/sys-file-info.c:693 #, fuzzy #| msgid "Variable under test" msgid "Variable and Dataset Attributes" msgstr "Zmienne testowane" #: src/language/dictionary/sys-file-info.c:699 #, fuzzy #| msgid "Variable Name: " msgid "Variable and Name" msgstr "Nazwy zmiennych:" #: src/language/dictionary/sys-file-info.c:702 #, fuzzy #| msgid "dataset" msgid "(dataset)" msgstr "zbiór danych" #: src/language/dictionary/sys-file-info.c:722 msgid "No vectors defined." msgstr "Nie zdefiniowano wektorów." #: src/language/dictionary/sys-file-info.c:732 #, fuzzy #| msgid "Vector" msgid "Vectors" msgstr "Wektor" #: src/language/dictionary/sys-file-info.c:736 msgid "Vector and Position" msgstr "" #: src/language/dictionary/sys-file-info.c:998 msgid "No valid encodings found." msgstr "Nie odnaleziono odpowiedniego kodowania." #: src/language/dictionary/sys-file-info.c:1004 #, c-format msgid "Usable encodings for %s." msgstr "Nadające się do użytku kodowanie dla %s." #: src/language/dictionary/sys-file-info.c:1007 #, c-format msgid "" "Encodings that can successfully read %s (by specifying the encoding name on " "the GET command's ENCODING subcommand). Encodings that yield identical text " "are listed together." msgstr "" "Kodowanie, które może skutecznie wczytać %s (poprzez określenie nazwy " "kodowania w poleceniu GET w subpoleceniu ENCODING). Kodowania, które mają " "identyczny tekst są wyświetlone poniżej." #: src/language/dictionary/sys-file-info.c:1012 #: src/language/dictionary/sys-file-info.c:1013 msgid "Encodings" msgstr "Kodowanie" #: src/language/dictionary/sys-file-info.c:1042 #, fuzzy, c-format #| msgid "%s encoded text strings." msgid "%s Encoded Text Strings" msgstr "%s zakodowane łańcuchy tekstowe." #: src/language/dictionary/sys-file-info.c:1046 msgid "" "Text strings in the file dictionary that the previously listed encodings " "interpret differently, along with the interpretations." msgstr "" "Ciągi tekstowe w pliku słownika, które były wcześniej wymienione były " "kodowane inaczej, wraz z interpretacjami." #: src/language/dictionary/sys-file-info.c:1049 src/output/text-item.c:57 #: src/ui/gui/psppire-import-assistant.c:885 msgid "Text" msgstr "Tekst" #: src/language/dictionary/sys-file-info.c:1059 msgid "Purpose" msgstr "Cel" #: src/language/dictionary/value-labels.c:154 #, c-format msgid "Truncating value label to %d bytes." msgstr "Przyciętno etykietę wartości do %d bajtów." #: src/language/dictionary/vector.c:66 #, c-format msgid "A vector named %s already exists." msgstr "Wektor o nazwie %s już istnieje." #: src/language/dictionary/vector.c:74 #, c-format msgid "Vector name %s is given twice." msgstr "Nazwa wektora %s jest podana dwukrotnie." #: src/language/dictionary/vector.c:98 msgid "A slash must separate each vector specification in VECTOR's long form." msgstr "Ukośnik musi separować każde określenie w długiej formie VECTOR'a." #: src/language/dictionary/vector.c:131 msgid "Vectors must have at least one element." msgstr "Wektory muszą zawierać przynajmniej jeden element." #: src/language/dictionary/vector.c:151 msgid "expecting vector length" msgstr "oczekiwana długość wektora" #: src/language/dictionary/vector.c:170 #, c-format msgid "%s is an existing variable name." msgstr "%s jest istniejącą nazwą zmiennej." #: src/language/dictionary/variable-display.c:121 msgid "Variable display width must be a positive integer." msgstr "Szerokość wyświetlanej zmiennej musi być wartością dodatnią." #: src/language/dictionary/weight.c:49 msgid "The weighting variable must be numeric." msgstr "Zmienna ważąca musi być numeryczna." #: src/language/dictionary/weight.c:54 msgid "The weighting variable may not be scratch." msgstr "Zmienna ważąca nie może być wykreślona." #: src/language/tests/moments-test.c:50 msgid "expecting weight value" msgstr "oczekiwana wartość wagi" #: src/language/utilities/cd.c:45 src/language/utilities/include.c:173 #, fuzzy, c-format #| msgid "Cannot change directory to %s: %s " msgid "Cannot change directory to %s: %s" msgstr "Nie można zmienić katalogu na %s: %s" #: src/language/utilities/date.c:33 #, c-format msgid "Only %s is currently implemented." msgstr "Jedynie %s jest obecnie zaimplementowane." #: src/language/utilities/host.c:60 #, fuzzy #| msgid "Command shell not supported on this platform." msgid "Time limit not supported on this platform." msgstr "Powłoka poleceń nie jest obsługiwana na tej platformie." #: src/language/utilities/host.c:74 #, c-format msgid "%s: Command exited with status %d." msgstr "" #: src/language/utilities/host.c:95 #, fuzzy, c-format #| msgid "failed to create temporary file" msgid "Failed to create temporary file (%s)." msgstr "tworzenie pliku tymczasowego nie powiodło się" #: src/language/utilities/host.c:102 #, c-format msgid "/dev/null: Failed to open (%s)." msgstr "" #: src/language/utilities/host.c:117 #, c-format msgid "Couldn't fork: %s." msgstr "Nie można rozgałęzić: %s." #: src/language/utilities/host.c:193 #, c-format msgid "While running \"%s\", waiting for child process failed (%s)." msgstr "" #: src/language/utilities/host.c:203 #, c-format msgid "Command \"%s\" timed out." msgstr "" #: src/language/utilities/host.c:205 #, c-format msgid "Command \"%s\" terminated by signal %d." msgstr "" #: src/language/utilities/host.c:212 msgid "Command or shell not found" msgstr "" #: src/language/utilities/host.c:214 msgid "Could not invoke command or shell" msgstr "" #: src/language/utilities/host.c:217 #, c-format msgid "Command \"%s\" exited with status %d (%s)." msgstr "" #: src/language/utilities/host.c:220 #, c-format msgid "Command \"%s\" exited with status %d." msgstr "" #: src/language/utilities/host.c:230 #, c-format msgid "Command \"%s\" output could not be read (%s)." msgstr "" #: src/language/utilities/title.c:88 #, c-format msgid " (Entered %s)" msgstr "(Wprowadzono %s)" #: src/language/utilities/include.c:73 #, c-format msgid "Can't find `%s' in include file search path." msgstr "Nie można odnaleźć `%s' w określonej ścieżce pliku." #: src/language/utilities/output.c:128 #, fuzzy, c-format #| msgid "Unknown command `%s'." msgid "Unknown cell class %s." msgstr "Nieznane polecenie `%s'." #: src/language/utilities/permissions.c:113 #, c-format msgid "Cannot stat %s: %s" msgstr "Nie można obliczyć %s: %s" #: src/language/utilities/permissions.c:127 #, c-format msgid "Cannot change mode of %s: %s" msgstr "Nie można zmienić trybu %s: %s" #: src/language/stats/aggregate.c:96 msgid "Sum of values" msgstr "Suma wartości" #: src/language/stats/aggregate.c:97 msgid "Mean average" msgstr "Średnia" #: src/language/stats/aggregate.c:98 msgid "Median average" msgstr "Średnia mediana" #: src/language/stats/aggregate.c:99 #: src/ui/gui/psppire-dialog-action-descriptives.c:40 #: src/ui/gui/psppire-dialog-action-frequencies.c:41 msgid "Standard deviation" msgstr "Odchylenie standardowe" #: src/language/stats/aggregate.c:100 #: src/ui/gui/psppire-dialog-action-descriptives.c:42 msgid "Maximum value" msgstr "Wartość maksymalna" #: src/language/stats/aggregate.c:101 #: src/ui/gui/psppire-dialog-action-descriptives.c:41 msgid "Minimum value" msgstr "Wartość minimalna" #: src/language/stats/aggregate.c:102 msgid "Percentage greater than" msgstr "Procent większy niż" #: src/language/stats/aggregate.c:103 msgid "Percentage less than" msgstr "Procent mniejszy niż" #: src/language/stats/aggregate.c:104 msgid "Percentage included in range" msgstr "Procent zawarty w zakresie" #: src/language/stats/aggregate.c:105 msgid "Percentage excluded from range" msgstr "Procent wykluczony z zakresu" #: src/language/stats/aggregate.c:106 msgid "Fraction greater than" msgstr "Frakcja większa niż" #: src/language/stats/aggregate.c:107 msgid "Fraction less than" msgstr "Frakcja mniejsza niż" #: src/language/stats/aggregate.c:108 msgid "Fraction included in range" msgstr "Frakcja zawarta w zakresie" #: src/language/stats/aggregate.c:109 msgid "Fraction excluded from range" msgstr "Frakcja wykluczona z zakresu" #: src/language/stats/aggregate.c:110 msgid "Number of cases" msgstr "Liczba obserwacji" #: src/language/stats/aggregate.c:111 msgid "Number of cases (unweighted)" msgstr "Liczba obserwacji (nieważona)" #: src/language/stats/aggregate.c:112 msgid "Number of missing values" msgstr "Liczba braków danych" #: src/language/stats/aggregate.c:113 msgid "Number of missing values (unweighted)" msgstr "Liczba braków danych (nieważona)" #: src/language/stats/aggregate.c:114 msgid "First non-missing value" msgstr "Pierwsza wartość nie będąca brakiem danych" #: src/language/stats/aggregate.c:115 msgid "Last non-missing value" msgstr "Ostatnia wartość nie będąca brakiem danych" #: src/language/stats/aggregate.c:258 msgid "" "When PRESORTED is specified, specifying sorting directions with (A) or (D) " "has no effect. Output data will be sorted the same way as the input data." msgstr "" "Kiedy określone jest PRESORTED, określanie kierunków sortowania (A) lub (D) " "nie będzie miało efektu. Dane w raporcie będą posortowane tak jak to jest " "określone w pliku wejścia." #: src/language/stats/aggregate.c:448 msgid "expecting aggregation function" msgstr "oczekiwanie funkcji agregacji" #: src/language/stats/aggregate.c:460 #, c-format msgid "Unknown aggregation function %s." msgstr "Nieznana funkcja agregacji %s." #: src/language/stats/aggregate.c:513 #, c-format msgid "Missing argument %zu to %s." msgstr "Brakujący argument %zu do %s." #: src/language/stats/aggregate.c:522 #, c-format msgid "Arguments to %s must be of same type as source variables." msgstr "Argumenty %s muszą być tego samego typu co zmienne źródłowe." #: src/language/stats/aggregate.c:541 #, c-format msgid "" "Number of source variables (%zu) does not match number of target variables " "(%zu)." msgstr "" "Liczba zmiennych źródłowych (%zu) nie odpowiada liczbie zmeinnych docelowych " "(%zu)." #: src/language/stats/aggregate.c:557 #, c-format msgid "" "The value arguments passed to the %s function are out-of-order. They will " "be treated as if they had been specified in the correct order." msgstr "" "Argumenty wartości przypisane do funkcji %s są w niewłaściwej kolejności. " "Będą traktowane tak, jak gdyby były napisane poprawnie." #: src/language/stats/aggregate.c:631 #, c-format msgid "" "Variable name %s is not unique within the aggregate file dictionary, which " "contains the aggregate variables and the break variables." msgstr "" "Nazwa zmiennej %s nie jest unikalna w zagregowanym słowniku danych, który " "zawiera zmienne agregowane i grupujące." #: src/language/stats/autorecode.c:152 #, c-format msgid "Source variable count (%zu) does not match target variable count (%zu)." msgstr "" "Obliczone zmienna źródłowa (%zu) nie odpowiada obliczonej zmiennej docelowej " "(%zu)." #: src/language/stats/autorecode.c:164 #, c-format msgid "Target variable %s duplicates existing variable %s." msgstr "Zmienna wynikowa %s zduplikuje istniejącą zmienną %s." #: src/language/stats/autorecode.c:221 #, c-format msgid "" "With GROUP, variables may not mix string variables (such as %s) and numeric " "variables (such as %s)." msgstr "" #: src/language/stats/autorecode.c:363 #, fuzzy #| msgid "Recode into Same Variables" msgid "Recoding grouped variables." msgstr "Rekoduj na te same zmienne" #: src/language/stats/autorecode.c:365 #, fuzzy, c-format #| msgid "Replacing %s by %s: %s." msgid "Recoding %s into %s (%s)." msgstr "Zastępowanie %s przez %s: %s." #: src/language/stats/autorecode.c:369 #, fuzzy, c-format #| msgid "Removing %s: %s." msgid "Recoding %s into %s." msgstr "Usuwanie %s: %s." #: src/language/stats/autorecode.c:376 src/ui/gui/recode.ui:209 msgid "New Value" msgstr "Wartość wynikowa" #: src/language/stats/autorecode.c:376 msgid "Value Label" msgstr "Etykieta wartości" #: src/language/stats/autorecode.c:379 msgid "Old Value" msgstr "Wartość źródłowa" #: src/language/stats/binomial.c:138 #, c-format msgid "Variable %s is not dichotomous" msgstr "Zmienna %s nie jest dychotomiczna" #: src/language/stats/binomial.c:182 src/ui/gui/binomial.ui:30 msgid "Binomial Test" msgstr "Test dwumianowy" #: src/language/stats/binomial.c:186 src/language/stats/chisquare.c:183 #: src/language/stats/chisquare.c:239 src/language/stats/chisquare.c:322 #: src/language/stats/cochran.c:188 src/language/stats/correlations.c:94 #: src/language/stats/correlations.c:145 src/language/stats/descriptives.c:991 #: src/language/stats/examine.c:602 src/language/stats/examine.c:742 #: src/language/stats/examine.c:836 src/language/stats/examine.c:925 #: src/language/stats/factor.c:1755 src/language/stats/factor.c:1878 #: src/language/stats/factor.c:1908 src/language/stats/factor.c:2068 #: src/language/stats/factor.c:2102 src/language/stats/frequencies.c:302 #: src/language/stats/frequencies.c:1579 src/language/stats/frequencies.c:1586 #: src/language/stats/friedman.c:250 src/language/stats/glm.c:729 #: src/language/stats/kruskal-wallis.c:249 #: src/language/stats/kruskal-wallis.c:297 #: src/language/stats/ks-one-sample.c:278 src/language/stats/logistic.c:1170 #: src/language/stats/logistic.c:1300 src/language/stats/logistic.c:1330 #: src/language/stats/jonckheere-terpstra.c:361 #: src/language/stats/mann-whitney.c:184 src/language/stats/mann-whitney.c:247 #: src/language/stats/means.c:757 src/language/stats/means.c:811 #: src/language/stats/mcnemar.c:222 src/language/stats/median.c:315 #: src/language/stats/median.c:350 src/language/stats/npar-summary.c:106 #: src/language/stats/oneway.c:973 src/language/stats/oneway.c:1051 #: src/language/stats/oneway.c:1150 src/language/stats/oneway.c:1238 #: src/language/stats/oneway.c:1373 src/language/stats/quick-cluster.c:746 #: src/language/stats/reliability.c:543 src/language/stats/reliability.c:584 #: src/language/stats/reliability.c:633 src/language/stats/reliability.c:644 #: src/language/stats/roc.c:969 src/language/stats/roc.c:1067 #: src/language/stats/regression.c:867 src/language/stats/regression.c:899 #: src/language/stats/regression.c:1023 src/language/stats/regression.c:1089 #: src/language/stats/runs.c:318 src/language/stats/sign.c:102 #: src/language/stats/t-test-indep.c:193 src/language/stats/t-test-indep.c:259 #: src/language/stats/t-test-one-sample.c:68 #: src/language/stats/t-test-one-sample.c:125 #: src/language/stats/t-test-paired.c:150 #: src/language/stats/t-test-paired.c:193 #: src/language/stats/t-test-paired.c:238 src/language/stats/wilcoxon.c:243 #: src/language/stats/wilcoxon.c:282 src/language/stats/crosstabs.q:925 #: src/language/stats/crosstabs.q:1253 src/language/stats/crosstabs.q:1293 #: src/language/stats/crosstabs.q:1302 src/language/stats/crosstabs.q:1331 #: src/language/stats/crosstabs.q:1373 src/language/stats/crosstabs.q:1418 #: src/ui/gui/crosstabs.ui:499 src/ui/gui/oneway.ui:615 msgid "Statistics" msgstr "Statystyki" #: src/language/stats/binomial.c:187 src/language/stats/chisquare.c:240 #: src/language/stats/chisquare.c:252 msgid "Category" msgstr "Kategoria" #: src/language/stats/binomial.c:188 src/language/stats/cochran.c:189 #: src/language/stats/correlations.c:97 src/language/stats/correlations.c:155 #: src/language/stats/descriptives.c:993 src/language/stats/examine.c:926 #: src/language/stats/frequencies.c:1588 src/language/stats/friedman.c:251 #: src/language/stats/kruskal-wallis.c:250 #: src/language/stats/ks-one-sample.c:279 src/language/stats/logistic.c:1331 #: src/language/stats/jonckheere-terpstra.c:369 #: src/language/stats/mann-whitney.c:185 src/language/stats/means.c:710 #: src/language/stats/means-calc.c:439 src/language/stats/mcnemar.c:223 #: src/language/stats/median.c:351 src/language/stats/npar-summary.c:107 #: src/language/stats/oneway.c:1052 src/language/stats/reliability.c:544 #: src/language/stats/sign.c:69 src/language/stats/sign.c:70 #: src/language/stats/t-test-indep.c:194 #: src/language/stats/t-test-one-sample.c:126 #: src/language/stats/t-test-paired.c:151 #: src/language/stats/t-test-paired.c:194 src/language/stats/wilcoxon.c:244 #: src/language/stats/crosstabs.q:926 msgid "N" msgstr "N" #: src/language/stats/binomial.c:189 msgid "Observed Prop." msgstr "Obserwowana proporcja" #: src/language/stats/binomial.c:190 msgid "Test Prop." msgstr "Test proporcji" #: src/language/stats/binomial.c:192 src/language/stats/mcnemar.c:224 #: src/language/stats/sign.c:103 src/language/stats/wilcoxon.c:288 #: src/language/stats/crosstabs.q:1306 msgid "Exact Sig. (2-tailed)" msgstr "Istotność (dwustronna)" #: src/language/stats/binomial.c:193 src/language/stats/mcnemar.c:225 #: src/language/stats/sign.c:104 src/language/stats/wilcoxon.c:289 #: src/language/stats/crosstabs.q:1307 msgid "Exact Sig. (1-tailed)" msgstr "Istotność (jednostronna)" #: src/language/stats/binomial.c:195 #, fuzzy #| msgid "Group1" msgid "Groups" msgstr "Grupa 1" #: src/language/stats/binomial.c:196 #, fuzzy #| msgid "Group1" msgid "Group 1" msgstr "Grupa 1" #: src/language/stats/binomial.c:196 #, fuzzy #| msgid "Group2" msgid "Group 2" msgstr "Grupa 2" #: src/language/stats/binomial.c:196 src/language/stats/chisquare.c:223 #: src/language/stats/chisquare.c:257 src/language/stats/examine.c:930 #: src/language/stats/factor.c:1756 src/language/stats/frequencies.c:344 #: src/language/stats/glm.c:811 src/language/stats/kruskal-wallis.c:285 #: src/language/stats/logistic.c:1336 src/language/stats/mann-whitney.c:197 #: src/language/stats/means.c:706 src/language/stats/oneway.c:982 #: src/language/stats/oneway.c:1072 src/language/stats/reliability.c:549 #: src/language/stats/regression.c:1031 src/language/stats/sign.c:75 #: src/language/stats/wilcoxon.c:250 #: src/ui/gui/psppire-dialog-action-crosstabs.c:93 #: src/language/stats/crosstabs.q:931 src/language/stats/crosstabs.q:1218 msgid "Total" msgstr "Suma" #: src/language/stats/chisquare.c:171 #, fuzzy, c-format #| msgid "" #| "CHISQUARE test specified %d expected values, but %d distinct values were " #| "encountered in variable %s." msgid "" "CHISQUARE test specified %d expected values, but variable %s has %zu " "distinct values." msgstr "" "W teście chi-kwadrat określono %d oczekiwane wartości, ale napotkano " "odmienne wartośc %d w zmiennej %s." #: src/language/stats/chisquare.c:184 src/language/stats/chisquare.c:241 msgid "Observed N" msgstr "Obserwowane N" #: src/language/stats/chisquare.c:185 src/language/stats/chisquare.c:242 msgid "Expected N" msgstr "Oczekiwane N" #: src/language/stats/chisquare.c:186 src/language/stats/chisquare.c:243 #: src/language/stats/regression.c:1031 #: src/ui/gui/psppire-dialog-action-crosstabs.c:95 #: src/language/stats/crosstabs.q:1267 msgid "Residual" msgstr "Reszta" #: src/language/stats/chisquare.c:235 src/language/stats/cochran.c:150 #: src/language/stats/median.c:305 src/language/stats/sign.c:66 #: src/ui/gui/frequencies.ui:676 msgid "Frequencies" msgstr "Częstości" #: src/language/stats/chisquare.c:320 src/language/stats/cochran.c:181 #: src/language/stats/friedman.c:246 src/language/stats/kruskal-wallis.c:295 #: src/language/stats/mann-whitney.c:244 src/language/stats/mcnemar.c:219 #: src/language/stats/median.c:347 src/language/stats/sign.c:100 #: src/language/stats/wilcoxon.c:279 msgid "Test Statistics" msgstr "Wartość testowana" #: src/language/stats/chisquare.c:323 #, fuzzy #| msgid "Chi-Square" msgid "Chi-square" msgstr "Chi-kwadrat" #: src/language/stats/chisquare.c:324 src/language/stats/cochran.c:191 #: src/language/stats/examine.c:675 src/language/stats/factor.c:2107 #: src/language/stats/friedman.c:257 src/language/stats/glm.c:733 #: src/language/stats/kruskal-wallis.c:299 src/language/stats/logistic.c:1174 #: src/language/stats/median.c:354 src/language/stats/oneway.c:975 #: src/language/stats/oneway.c:1242 src/language/stats/regression.c:1025 #: src/language/stats/t-test-indep.c:267 #: src/language/stats/t-test-one-sample.c:75 #: src/language/stats/t-test-paired.c:253 src/language/stats/crosstabs.q:1304 msgid "df" msgstr "df" #: src/language/stats/chisquare.c:325 src/language/stats/cochran.c:192 #: src/language/stats/friedman.c:258 src/language/stats/kruskal-wallis.c:300 #: src/language/stats/median.c:355 msgid "Asymp. Sig." msgstr "Istotność asymptotyczna" #: src/language/stats/cochran.c:111 msgid "More than two values encountered. Cochran Q test will not be run." msgstr "Wykryto więcej niż dwie wartości. Nie wykonano testu Q Cochran'a." #: src/language/stats/cochran.c:153 #, c-format msgid "Success (%.*g)" msgstr "Sukces (%.*g)" #: src/language/stats/cochran.c:154 #, c-format msgid "Failure (%.*g)" msgstr "Porażka(%.*g)" #: src/language/stats/cochran.c:190 msgid "Cochran's Q" msgstr "Q Cochrana" #: src/language/stats/correlations.c:91 src/language/stats/descriptives.c:987 #: src/language/stats/factor.c:2065 src/language/stats/npar-summary.c:102 msgid "Descriptive Statistics" msgstr "Statystyki opisowe" #: src/language/stats/correlations.c:95 src/language/stats/descriptives.c:108 #: src/language/stats/examine.c:742 src/language/stats/factor.c:2069 #: src/language/stats/frequencies.c:141 src/language/stats/graph.c:211 #: src/language/stats/ks-one-sample.c:290 src/language/stats/means-calc.c:438 #: src/language/stats/npar-summary.c:108 src/language/stats/oneway.c:1052 #: src/language/stats/t-test-indep.c:195 #: src/language/stats/t-test-one-sample.c:127 #: src/language/stats/t-test-paired.c:152 #: src/language/stats/t-test-paired.c:241 #: src/ui/gui/psppire-dialog-action-descriptives.c:39 #: src/ui/gui/psppire-dialog-action-frequencies.c:40 msgid "Mean" msgstr "Średnia" #: src/language/stats/correlations.c:96 src/language/stats/examine.c:751 #: src/language/stats/factor.c:2070 src/language/stats/ks-one-sample.c:290 #: src/language/stats/means-calc.c:440 src/language/stats/npar-summary.c:109 #: src/language/stats/oneway.c:1052 src/language/stats/t-test-indep.c:196 #: src/language/stats/t-test-one-sample.c:128 #: src/language/stats/t-test-paired.c:153 #: src/language/stats/t-test-paired.c:242 msgid "Std. Deviation" msgstr "Odchylenie standardowe" #: src/language/stats/correlations.c:126 msgid "Correlations" msgstr "Korelacje" #: src/language/stats/correlations.c:146 msgid "Pearson Correlation" msgstr "Korelacja Pearsona" #: src/language/stats/correlations.c:147 src/language/stats/oneway.c:1243 #: src/language/stats/t-test-indep.c:268 #: src/language/stats/t-test-one-sample.c:76 #: src/language/stats/t-test-paired.c:254 msgid "Sig. (2-tailed)" msgstr "Istotność (2-stronna)" #: src/language/stats/correlations.c:147 src/language/stats/factor.c:1913 msgid "Sig. (1-tailed)" msgstr "Istotność (1-stronna)" #: src/language/stats/correlations.c:151 msgid "Cross-products" msgstr "Iloczyny wektorowe" #: src/language/stats/correlations.c:152 msgid "Covariance" msgstr "Kowariancja" #: src/language/stats/correlations.c:165 msgid "Significant at .05 level" msgstr "" #: src/language/stats/correlations.c:234 msgid "The data for the chosen variables are all missing or empty." msgstr "" #: src/language/stats/correlations.c:390 src/language/stats/descriptives.c:368 #: src/language/data-io/list.c:166 msgid "No variables specified." msgstr "Nie określono zmiennych." #: src/language/stats/descriptives.c:109 src/language/stats/frequencies.c:142 #: src/language/stats/means-calc.c:445 src/language/stats/t-test-indep.c:197 #: src/language/stats/t-test-one-sample.c:129 #: src/language/stats/t-test-paired.c:154 #: src/language/stats/t-test-paired.c:243 msgid "S.E. Mean" msgstr "Błąd standardowy średniej" #: src/language/stats/descriptives.c:110 src/language/stats/frequencies.c:145 msgid "Std Dev" msgstr "Odchylenie standardowe" #: src/language/stats/descriptives.c:111 src/language/stats/examine.c:750 #: src/language/stats/frequencies.c:146 src/language/stats/means-calc.c:450 #: src/ui/gui/psppire-dialog-action-descriptives.c:46 #: src/ui/gui/psppire-dialog-action-frequencies.c:45 msgid "Variance" msgstr "Wariancja" #: src/language/stats/descriptives.c:112 src/language/stats/examine.c:752 #: src/language/stats/frequencies.c:147 src/language/stats/means-calc.c:451 #: src/ui/gui/psppire-dialog-action-descriptives.c:47 #: src/ui/gui/psppire-dialog-action-frequencies.c:50 msgid "Kurtosis" msgstr "Kurtoza" #: src/language/stats/descriptives.c:113 src/language/stats/frequencies.c:148 #: src/language/stats/means-calc.c:452 msgid "S.E. Kurt" msgstr "Bład standardowy kurtozy" #: src/language/stats/descriptives.c:114 src/language/stats/examine.c:752 #: src/language/stats/frequencies.c:149 src/language/stats/means-calc.c:453 #: src/ui/gui/psppire-dialog-action-descriptives.c:48 #: src/ui/gui/psppire-dialog-action-frequencies.c:46 msgid "Skewness" msgstr "Skośność" #: src/language/stats/descriptives.c:115 src/language/stats/frequencies.c:150 #: src/language/stats/means-calc.c:454 msgid "S.E. Skew" msgstr "Błąd standardowy skosności" #: src/language/stats/descriptives.c:116 src/language/stats/examine.c:751 #: src/language/stats/frequencies.c:151 src/language/stats/means-calc.c:449 #: src/ui/gui/psppire-dialog-action-descriptives.c:43 #: src/ui/gui/psppire-dialog-action-frequencies.c:48 msgid "Range" msgstr "Rozstęp" #: src/language/stats/descriptives.c:117 src/language/stats/examine.c:751 #: src/language/stats/frequencies.c:152 src/language/stats/graph.c:214 #: src/language/stats/ks-one-sample.c:285 src/language/stats/means-calc.c:447 #: src/language/stats/npar-summary.c:110 src/language/stats/oneway.c:1061 #: src/ui/gui/psppire-dialog-action-descriptives.c:41 #: src/ui/gui/psppire-dialog-action-frequencies.c:42 msgid "Minimum" msgstr "Minimum" #: src/language/stats/descriptives.c:118 src/language/stats/examine.c:751 #: src/language/stats/frequencies.c:153 src/language/stats/graph.c:213 #: src/language/stats/ks-one-sample.c:285 src/language/stats/means-calc.c:448 #: src/language/stats/npar-summary.c:110 src/language/stats/oneway.c:1061 #: src/ui/gui/psppire-dialog-action-descriptives.c:42 #: src/ui/gui/psppire-dialog-action-frequencies.c:43 msgid "Maximum" msgstr "Maximum" #: src/language/stats/descriptives.c:119 src/language/stats/frequencies.c:154 #: src/language/stats/graph.c:212 src/language/stats/means-calc.c:446 #: src/ui/gui/psppire-dialog-action-descriptives.c:44 #: src/ui/gui/psppire-dialog-action-frequencies.c:53 msgid "Sum" msgstr "Suma" #: src/language/stats/descriptives.c:350 #, c-format msgid "Z-score variable name %s would be a duplicate variable name." msgstr "Nazwa zmiennej standaryzowanej %s będzie taka sama jak nazwa zmiennej." #: src/language/stats/descriptives.c:401 msgid "" "DESCRIPTIVES with Z scores ignores TEMPORARY. Temporary transformations " "will be made permanent." msgstr "" "DESCRIPTIVES dla wyników standaryzowanych ignorują TEMPORARY. Tymczasowe " "przekształcenia staną się stałe." #: src/language/stats/descriptives.c:478 msgid "expecting statistic name: reverting to default" msgstr "oczekiwana nazwa statystyki: przywrócenie ustawień domyślnych" #: src/language/stats/descriptives.c:561 msgid "" "Ran out of generic names for Z-score variables. There are only 126 generic " "names: ZSC001-ZSC0999, STDZ01-STDZ09, ZZZZ01-ZZZZ09, ZQZQ01-ZQZQ09." msgstr "" "Wykorzystano nazwy generyczne dla zmiennych standaryzowanych. Istnieje " "jedynei 126 nazw generycznych: ZSC001-ZSC0999, STDZ01-STDZ09, ZZZZ01-ZZZZ09, " "ZQZQ01-ZQZQ09." #: src/language/stats/descriptives.c:579 #, fuzzy #| msgid "Mapping of variables to corresponding Z-scores." msgid "Mapping of Variables to Z-scores" msgstr "Mapowanie zmiennych odpowiadających wynikom standaryzowanym." #: src/language/stats/descriptives.c:581 #, fuzzy #| msgid "Name" msgid "Names" msgstr "Nazwa" #: src/language/stats/descriptives.c:582 src/language/stats/glm.c:739 #: src/language/stats/regression.c:1030 msgid "Source" msgstr "Źródło" #: src/language/stats/descriptives.c:582 msgid "Target" msgstr "Cel" #: src/language/stats/descriptives.c:659 #, fuzzy, c-format #| msgid "Internal error processing Z scores" msgid "Internal error processing Z scores. Please report this to %s." msgstr "Wewnętrzny błąd przetwarzania wyników standaryzowanych" #: src/language/stats/descriptives.c:759 #, c-format msgid "Z-score of %s" msgstr "Wynik standaryzowany %s" #: src/language/stats/descriptives.c:1028 src/language/stats/roc.c:1029 msgid "Valid N (listwise)" msgstr "N ważnych (usuwanie obserwacjami)" #: src/language/stats/descriptives.c:1028 #, fuzzy #| msgid "Valid N (listwise)" msgid "Missing N (listwise)" msgstr "N ważnych (usuwanie obserwacjami)" #: src/language/stats/examine.c:75 msgid " (missing)" msgstr "(braki)" #: src/language/stats/examine.c:225 #, c-format msgid "Boxplot of %s vs. %s" msgstr "Wykres skrzynkowy %s z %s" #: src/language/stats/examine.c:231 src/language/stats/examine.c:338 #, c-format msgid "Boxplot of %s" msgstr "Wykres skrzynkowy %s" #: src/language/stats/examine.c:321 msgid "Boxplot" msgstr "Wykres skrzynkowy" #: src/language/stats/examine.c:418 msgid "Not creating NP plot because data set is empty." msgstr "Nie utworzono wykresu NP, ponieważ zbiór danych jest pusty." #: src/language/stats/examine.c:478 #, c-format msgid "Not creating spreadlevel chart for %s" msgstr "Nie utworzono wykresu rozrzutu dla %s" #: src/language/stats/examine.c:585 #, fuzzy #| msgid "Last non-missing value" msgid "User-missing value." msgstr "Ostatnia wartość nie będąca brakiem danych" #: src/language/stats/examine.c:591 src/language/stats/examine.c:595 #: src/language/stats/frequencies.c:1606 msgid "Percentiles" msgstr "Percentyle" #: src/language/stats/examine.c:603 src/math/percentiles.c:37 msgid "Weighted Average" msgstr "Średnia ważona" #: src/language/stats/examine.c:603 msgid "Tukey's Hinges" msgstr "Zawiasy Tukey'a" #: src/language/stats/examine.c:610 src/language/stats/examine.c:685 #: src/language/stats/examine.c:759 src/language/stats/examine.c:858 #: src/language/stats/examine.c:938 src/language/stats/mann-whitney.c:200 #: src/language/stats/median.c:319 src/language/stats/t-test-indep.c:227 #: src/language/stats/t-test-indep.c:282 #: src/language/stats/t-test-one-sample.c:87 #, fuzzy #| msgid "_Dependent Variable" msgid "Dependent Variables" msgstr "_Zmienna zależna" #: src/language/stats/examine.c:669 #, fuzzy #| msgid "Dev from Normal" msgid "Tests of Normality" msgstr "Odchylenie od normy" #: src/language/stats/examine.c:673 msgid "Shapiro-Wilk" msgstr "" #: src/language/stats/examine.c:674 src/language/stats/examine.c:739 #: src/ui/gui/psppire-checkbox-treeview.c:73 msgid "Statistic" msgstr "Statystyka" #: src/language/stats/examine.c:676 src/language/stats/factor.c:2108 #: src/language/stats/glm.c:736 src/language/stats/logistic.c:1175 #: src/language/stats/oneway.c:978 src/language/stats/oneway.c:1154 #: src/language/stats/oneway.c:1376 src/language/stats/regression.c:906 #: src/language/stats/regression.c:1028 src/language/stats/t-test-indep.c:263 #: src/language/stats/t-test-paired.c:196 msgid "Sig." msgstr "Istotność" #: src/language/stats/examine.c:735 src/language/stats/oneway.c:1045 #: src/ui/gui/descriptives.ui:25 msgid "Descriptives" msgstr "Statystyki opisowe" #: src/language/stats/examine.c:738 msgid "Aspect" msgstr "" #: src/language/stats/examine.c:739 src/language/stats/oneway.c:1053 #: src/language/stats/oneway.c:1240 src/language/stats/oneway.c:1375 #: src/language/stats/roc.c:975 src/language/stats/regression.c:902 msgid "Std. Error" msgstr "Błąd standardowy" #: src/language/stats/examine.c:745 src/language/stats/oneway.c:1056 #, c-format msgid "%g%% Confidence Interval for Mean" msgstr "%g%% przedział ufności dla średniej" #: src/language/stats/examine.c:747 src/language/stats/oneway.c:1058 #: src/language/stats/oneway.c:1382 src/language/stats/roc.c:982 #: src/language/stats/regression.c:913 msgid "Lower Bound" msgstr "Dolna granica" #: src/language/stats/examine.c:748 src/language/stats/oneway.c:1059 #: src/language/stats/oneway.c:1383 src/language/stats/roc.c:983 #: src/language/stats/regression.c:914 msgid "Upper Bound" msgstr "Górna granica" #: src/language/stats/examine.c:750 msgid "5% Trimmed Mean" msgstr "5% średnia obcięta" #: src/language/stats/examine.c:750 src/language/stats/frequencies.c:143 #: src/language/stats/means-calc.c:442 src/language/stats/median.c:352 #: src/ui/gui/psppire-dialog-action-frequencies.c:52 msgid "Median" msgstr "Mediana" #: src/language/stats/examine.c:752 msgid "Interquartile Range" msgstr "Rozstęp ćwiartkowy" #: src/language/stats/examine.c:832 msgid "Extreme Values" msgstr "Wartości skrajne" #: src/language/stats/examine.c:840 src/language/stats/quick-cluster.c:664 #: src/language/data-io/list.c:110 msgid "Case Number" msgstr "Liczba obserwacji" #: src/language/stats/examine.c:844 #, fuzzy #| msgid "Order by" msgid "Order" msgstr "Kolejność według" #. TRANSLATORS: This is a noun, not an adjective. #: src/language/stats/examine.c:850 #, fuzzy #| msgid "_Extremes" msgid "Extreme" msgstr "_Wartości skrajne" #: src/language/stats/examine.c:851 msgid "Highest" msgstr "Najwyższe" #: src/language/stats/examine.c:851 msgid "Lowest" msgstr "Najniższe" #: src/language/stats/examine.c:921 src/language/stats/logistic.c:1328 #: src/language/stats/means.c:694 src/language/stats/reliability.c:540 msgid "Case Processing Summary" msgstr "Informacja o analizowanych danych" #: src/language/stats/examine.c:927 src/language/stats/frequencies.c:304 #: src/language/stats/frequencies.c:1494 src/language/stats/logistic.c:1332 #: src/language/stats/means.c:713 src/language/stats/reliability.c:545 #: src/language/stats/crosstabs.q:927 msgid "Percent" msgstr "Procent" #: src/language/stats/examine.c:929 src/language/stats/frequencies.c:321 #: src/language/stats/frequencies.c:1590 src/language/stats/quick-cluster.c:766 #: src/language/stats/reliability.c:548 src/language/stats/crosstabs.q:931 msgid "Valid" msgstr "Uwzględnione" #: src/language/stats/examine.c:929 src/language/stats/frequencies.c:336 #: src/language/stats/frequencies.c:1591 src/language/stats/crosstabs.q:931 msgid "Missing" msgstr "Wykluczone" #: src/language/stats/examine.c:1550 #, c-format msgid "%s may not be negative. Using default value (%g)." msgstr "%s nie może być ujemna. Zastosowano wartość domyślną (%g)." #: src/language/stats/examine.c:1587 msgid "Percentiles must lie in the range (0, 100)" msgstr "Percentyle muszą znajdować się w zakresie od 0 do 100" #: src/language/stats/examine.c:1777 #, c-format msgid "%s and %s are mutually exclusive" msgstr "%s i %s wzajemnie się wykluczają" #: src/language/stats/factor.c:1121 #, c-format msgid "Matrix input for %s must be either COV or CORR" msgstr "" #: src/language/stats/factor.c:1519 msgid "Factor analysis on a single variable is not useful." msgstr "" "Analiza czynnikowa przeprowadzona na jednej zmiennej nie jest użyteczna." #: src/language/stats/factor.c:1523 #, fuzzy #| msgid "Factor analysis on a single variable is not useful." msgid "Factor analysis without variables is not possible." msgstr "" "Analiza czynnikowa przeprowadzona na jednej zmiennej nie jest użyteczna." #: src/language/stats/factor.c:1634 msgid "Component Number" msgstr "Numer składowej" #: src/language/stats/factor.c:1634 msgid "Factor Number" msgstr "Liczba czynników" #: src/language/stats/factor.c:1648 src/language/stats/factor.c:1651 msgid "Communalities" msgstr "Zasoby zmienności wspólnej" #: src/language/stats/factor.c:1653 msgid "Initial" msgstr "Początkowe" #: src/language/stats/factor.c:1655 msgid "Extraction" msgstr "Po wyodrębnieniu" #: src/language/stats/factor.c:1697 src/language/stats/factor.c:1777 #: src/language/stats/factor.c:1839 msgid "Component" msgstr "Składowa" #: src/language/stats/factor.c:1697 src/language/stats/factor.c:1777 #: src/language/stats/factor.c:1839 msgid "Factor" msgstr "Czynnik" #: src/language/stats/factor.c:1752 msgid "Total Variance Explained" msgstr "Całkowita wyjaśniona wariancja" #: src/language/stats/factor.c:1758 #, no-c-format msgid "% of Variance" msgstr "% wariancji" #: src/language/stats/factor.c:1760 #, no-c-format msgid "Cumulative %" msgstr "% skumulowany" #: src/language/stats/factor.c:1763 msgid "Phase" msgstr "" #: src/language/stats/factor.c:1765 msgid "Initial Eigenvalues" msgstr "Początkowe wartości własne" #: src/language/stats/factor.c:1769 msgid "Extraction Sums of Squared Loadings" msgstr "Sumy kwadratów ładunków po wyodrębnieniu" #: src/language/stats/factor.c:1773 msgid "Rotation Sums of Squared Loadings" msgstr "Sumy kwadratów ładunków po rotacji" #: src/language/stats/factor.c:1835 #, fuzzy #| msgid "Correlation Matrix" msgid "Factor Correlation Matrix" msgstr "Macierz korelacji" #: src/language/stats/factor.c:1842 #, fuzzy #| msgid "Factor" msgid "Factor 2" msgstr "Czynnik" #: src/language/stats/factor.c:1874 msgid "Anti-Image Matrices" msgstr "" #: src/language/stats/factor.c:1879 #, fuzzy #| msgid "Covariance" msgid "Anti-image Covariance" msgstr "Kowariancja" #: src/language/stats/factor.c:1880 #, fuzzy #| msgid "Bivariate Correlations" msgid "Anti-image Correlation" msgstr "Korelacje parami" #: src/language/stats/factor.c:1901 msgid "Correlation Matrix" msgstr "Macierz korelacji" #: src/language/stats/factor.c:1910 src/language/stats/t-test-paired.c:195 msgid "Correlation" msgstr "Korelacja" #: src/language/stats/factor.c:1947 msgid "Determinant" msgstr "Wyznacznik" #: src/language/stats/factor.c:1958 #, fuzzy #| msgid "Co_variance matrix" msgid "Covariance Matrix" msgstr "Macierz ko_wariancji" #: src/language/stats/factor.c:1990 msgid "" "The dataset contains no complete observations. No analysis will be performed." msgstr "" "Zbiór danych nie posiada kompletnych obserwacji. Analiza nie zostanie " "przeprowadzona." #: src/language/stats/factor.c:2014 msgid "The dataset has no complete covariance or correlation matrix." msgstr "" #: src/language/stats/factor.c:2071 msgid "Analysis N" msgstr "Analizowane N" #: src/language/stats/factor.c:2099 msgid "KMO and Bartlett's Test" msgstr "KMO i test Bartletta" #: src/language/stats/factor.c:2103 msgid "Kaiser-Meyer-Olkin Measure of Sampling Adequacy" msgstr "Miara Kaiser-Meyer-Olkin adekwatności doboru próby" #: src/language/stats/factor.c:2105 msgid "Bartlett's Test of Sphericity" msgstr "Test sferyczności Bartletta" #: src/language/stats/factor.c:2106 msgid "Approx. Chi-Square" msgstr "Przybliżone chi-kwadrat" #: src/language/stats/factor.c:2154 #, c-format msgid "" "The %s criteria result in zero factors extracted. Therefore no analysis will " "be performed." msgstr "" "Wyznaczone kryteria %s skutkują w brak wyodrębnienia czynników. Z tego " "powodu nie przeprowadzono analizy." #: src/language/stats/factor.c:2161 #, c-format msgid "" "The %s criteria result in more factors than variables, which is not " "meaningful. No analysis will be performed." msgstr "" "Wyznaczone kryteria %s skutkują w większej ilości czynników niż zmiennych, " "co nie jest możliwe. Nie przeprowadzono analizy. " #: src/language/stats/factor.c:2254 msgid "Component Matrix" msgstr "Macierz składowych" #: src/language/stats/factor.c:2254 msgid "Factor Matrix" msgstr "Macierz czynników" #: src/language/stats/factor.c:2259 #, fuzzy #| msgid "Factor Matrix" msgid "Pattern Matrix" msgstr "Macierz czynników" #: src/language/stats/factor.c:2268 #, fuzzy #| msgid "Factor Matrix" msgid "Structure Matrix" msgstr "Macierz czynników" #: src/language/stats/factor.c:2270 msgid "Rotated Component Matrix" msgstr "Macierz rotowanych składowych" #: src/language/stats/factor.c:2271 msgid "Rotated Factor Matrix" msgstr "Macierz rotowanych czynników" #: src/language/stats/flip.c:100 #, c-format msgid "%s ignores %s. Temporary transformations will be made permanent." msgstr "%s ignoruje %s. Tymczasowe przekształćenia staną się stałe." #: src/language/stats/flip.c:153 #, c-format msgid "Could not create temporary file for %s." msgstr "Nie udało się utworzyć pliku tymczasowego dla %s." #: src/language/stats/flip.c:341 #, c-format msgid "Error rewinding %s file: %s." msgstr "Błąd cofania %s pliku: %s." #: src/language/stats/flip.c:348 #, c-format msgid "Error creating %s source file." msgstr "Błąd tworzenia pliku źródłowego %s." #: src/language/stats/flip.c:361 #, c-format msgid "Error reading %s file: %s." msgstr "Błąd wczytywanie %s pliku: %s." #: src/language/stats/flip.c:363 #, c-format msgid "Unexpected end of file reading %s file." msgstr "Nieoczekiwany koniec pliku podczas wczytywanie pliku %s." #: src/language/stats/flip.c:379 #, c-format msgid "Error seeking %s source file: %s." msgstr "Błąd poszukiwania %s pliku źródłowego: %s." #: src/language/stats/flip.c:387 #, c-format msgid "Error writing %s source file: %s." msgstr "Błąd zapisywania %s pliku źródłowego: %s." #: src/language/stats/flip.c:402 #, c-format msgid "Error rewinding %s source file: %s." msgstr "Błąd cofania %s pliku źródłowego: %s." #: src/language/stats/flip.c:433 #, c-format msgid "Error reading %s temporary file: %s." msgstr "Błąd wczytywania %s pliku tymczasowego: %s." #: src/language/stats/flip.c:436 #, c-format msgid "Unexpected end of file reading %s temporary file." msgstr "Nieoczekiwany koniec pliku podczas wczytywania pliku tymczasowego %s." #: src/language/stats/frequencies.c:144 #: src/ui/gui/psppire-dialog-action-frequencies.c:49 msgid "Mode" msgstr "Dominanta" #: src/language/stats/frequencies.c:303 src/language/stats/logistic.c:1381 #: src/output/charts/plot-hist-cairo.c:112 msgid "Frequency" msgstr "Częstość" #: src/language/stats/frequencies.c:305 msgid "Valid Percent" msgstr "Procent ważnych" #: src/language/stats/frequencies.c:306 src/language/stats/graph.c:208 #, fuzzy #| msgid "Cum Percent" msgid "Cumulative Percent" msgstr "Procent skumulowany" #: src/language/stats/frequencies.c:905 msgid "Histogram frequency must be greater than zero." msgstr "Częstość histogramu musi być większa niż zero." #: src/language/stats/frequencies.c:923 msgid "Histogram percentage must be greater than zero." msgstr "Procent histogramu musi być większy niż zero." #: src/language/stats/frequencies.c:1139 #, c-format msgid "" "%s for histogram must be greater than or equal to %s, but %s was specified " "as %.15g and %s as %.15g. %s and %s will be ignored." msgstr "" "%s dla histogramu musi być większa bądź równa %s, ale %s zostało określone " "jako %.15g i %s jako %.15g. %s i %s będą ignorowane." #: src/language/stats/frequencies.c:1184 #, c-format msgid "" "%s for pie chart must be greater than or equal to %s, but %s was specified " "as %.15g and %s as %.15g. %s and %s will be ignored." msgstr "" "%s dla wykresu kołowego musi być większa bądź równa %s, ale %s zostało " "określone jako %.15g i %s jako %.15g. %s i %s będą ignorowane." #: src/language/stats/frequencies.c:1474 #, c-format msgid "Omitting pie chart for %s, which has only %d unique values." msgstr "" "Ominięto wykres kołowy dla %s, który posiada jedynie %d unikalnych wartości." #: src/language/stats/frequencies.c:1477 #, c-format msgid "Omitting pie chart for %s, which has over 50 unique values." msgstr "" "Ominięto wykres kołowy dla %s, który posiada ponad 50 unikalnych wartości." #: src/language/stats/frequencies.c:1494 src/language/stats/graph.c:205 #: src/language/stats/quick-cluster.c:747 #: src/ui/gui/psppire-dialog-action-crosstabs.c:90 #: src/language/stats/crosstabs.q:789 src/language/stats/crosstabs.q:1262 msgid "Count" msgstr "Zlicz" #: src/language/stats/friedman.c:220 src/language/stats/kruskal-wallis.c:247 #: src/language/stats/mann-whitney.c:182 src/language/stats/wilcoxon.c:240 msgid "Ranks" msgstr "Rangi" #: src/language/stats/friedman.c:222 src/language/stats/friedman.c:223 #: src/language/stats/kruskal-wallis.c:251 #: src/language/stats/mann-whitney.c:186 src/language/stats/wilcoxon.c:245 msgid "Mean Rank" msgstr "Średnia ranga" #: src/language/stats/friedman.c:253 msgid "Kendall's W" msgstr "W Kendalla" #: src/language/stats/friedman.c:256 src/language/stats/kruskal-wallis.c:298 #: src/language/stats/median.c:353 msgid "Chi-Square" msgstr "Chi-kwadrat" #: src/language/stats/glm.c:169 msgid "Multivariate analysis is not yet implemented" msgstr "Analiza wieloczynnikowa nie jest jeszcze zaimplementowana." #: src/language/stats/glm.c:274 msgid "Only types 1, 2 & 3 sums of squares are currently implemented" msgstr "Jedynie typy 1, 2 i 3 sum kwadratów są obecnie zaimplementowane." #: src/language/stats/glm.c:727 msgid "Tests of Between-Subjects Effects" msgstr "Testy efektów międzyobiektowych" #: src/language/stats/glm.c:730 #, fuzzy #| msgid "Type %s Sum of Squares" msgid "Type I Sum Of Squares" msgstr "Typ %s sumy kwadratów" #: src/language/stats/glm.c:731 #, fuzzy #| msgid "Type %s Sum of Squares" msgid "Type II Sum Of Squares" msgstr "Typ %s sumy kwadratów" #: src/language/stats/glm.c:732 #, fuzzy #| msgid "Type %s Sum of Squares" msgid "Type III Sum Of Squares" msgstr "Typ %s sumy kwadratów" #: src/language/stats/glm.c:734 src/language/stats/oneway.c:976 #: src/language/stats/regression.c:1026 msgid "Mean Square" msgstr "Średni kwadrat" #: src/language/stats/glm.c:735 src/language/stats/oneway.c:977 #: src/language/stats/regression.c:1027 src/language/stats/t-test-indep.c:262 msgid "F" msgstr "F" #: src/language/stats/glm.c:740 msgid "Corrected Model" msgstr "Skorygowany model" #: src/language/stats/glm.c:740 msgid "Model" msgstr "Model" #: src/language/stats/glm.c:752 msgid "Intercept" msgstr "Intercept" #: src/language/stats/glm.c:802 src/output/pivot-table.c:763 #: src/output/spv/spv.c:867 msgid "Error" msgstr "Błąd" #: src/language/stats/glm.c:819 msgid "Corrected Total" msgstr "Ogółem skorygowane" #: src/language/stats/graph.c:206 #, fuzzy #| msgid "_Percentages" msgid "Percentage" msgstr "_Procenty" #: src/language/stats/graph.c:207 #, fuzzy #| msgid "Cumulative %" msgid "Cumulative Count" msgstr "% skumulowany" #: src/language/stats/graph.c:296 #, fuzzy, c-format #| msgid "%s of %s by %s" msgid "%s vs. %s by %s" msgstr "%s z %s według %s" #: src/language/stats/graph.c:303 #, fuzzy, c-format #| msgid "Boxplot of %s vs. %s" msgid "%s vs. %s" msgstr "Wykres skrzynkowy %s z %s" #: src/language/stats/graph.c:322 msgid "" "Maximum number of scatterplot categories reached. Your BY variable has too " "many distinct values. The coloring of the plot will not be correct." msgstr "" #: src/language/stats/graph.c:551 src/language/stats/rank.c:636 #, c-format msgid "%s of %s" msgstr "%s z %s" #: src/language/stats/graph.c:698 src/language/stats/graph.c:729 #: src/language/stats/graph.c:777 msgid "Only one chart type is allowed." msgstr "" #: src/language/stats/graph.c:721 src/language/stats/graph.c:820 #: src/language/stats/graph.c:834 #, fuzzy #| msgid "The inline file is not allowed here." msgid "Only one variable is allowed." msgstr "Pliki wbudowane w pliku nie są tu dopuszczalne." #: src/language/stats/graph.c:843 #, fuzzy #| msgid "Number expected." msgid "Variable expected" msgstr "Oczekiwana liczba." #: src/language/stats/graph.c:883 msgid "FOOTNOTE is not implemented yet for GRAPH" msgstr "" #: src/language/stats/ks-one-sample.c:274 src/ui/gui/ks-one-sample.ui:24 msgid "One-Sample Kolmogorov-Smirnov Test" msgstr "Test Kołmogorowa-Smirnowa dla jednej próby" #: src/language/stats/ks-one-sample.c:284 msgid "Uniform Parameters" msgstr "Parametry rozkładu jednostajnego" #: src/language/stats/ks-one-sample.c:289 msgid "Normal Parameters" msgstr "Paramtery rozkładu normalnego" #: src/language/stats/ks-one-sample.c:294 msgid "Poisson Parameters" msgstr "Parametry rozkładu Poissona" #: src/language/stats/ks-one-sample.c:295 #: src/ui/gui/psppire-dialog-action-crosstabs.c:76 #: src/language/stats/crosstabs.q:1421 msgid "Lambda" msgstr "Lambda" #: src/language/stats/ks-one-sample.c:300 msgid "Exponential Parameters" msgstr "Parametry rozkładu wykładniczego" #: src/language/stats/ks-one-sample.c:308 msgid "Most Extreme Differences" msgstr "Największe różnice" #: src/language/stats/ks-one-sample.c:309 msgid "Absolute" msgstr "Wartość bezwzględna" #: src/language/stats/ks-one-sample.c:309 src/language/stats/roc.c:1037 msgid "Positive" msgstr "Dodatnia" #: src/language/stats/ks-one-sample.c:309 src/language/stats/roc.c:1037 msgid "Negative" msgstr "Ujemna" #: src/language/stats/ks-one-sample.c:312 msgid "Kolmogorov-Smirnov Z" msgstr "Z Kołmogotowa-Smirnova" #: src/language/stats/ks-one-sample.c:313 #: src/language/stats/jonckheere-terpstra.c:374 #: src/language/stats/mann-whitney.c:251 src/language/stats/runs.c:328 #: src/language/stats/wilcoxon.c:284 msgid "Asymp. Sig. (2-tailed)" msgstr "Istotność asymptotyczna (dwustronna)" #: src/language/stats/logistic.c:327 msgid "All predicted values are either 1 or 0" msgstr "Wszystkie przewidywane wartości wynoszą 1 albo 0" #: src/language/stats/logistic.c:525 msgid "Dependent variable's values are not dichotomous." msgstr "Wartości zmiennej zależnej nie są dychotomiczne." #: src/language/stats/logistic.c:614 #, c-format msgid "" "Category %s does not have at least two distinct values. Logistic regression " "will not be run." msgstr "" "Kategoria %s nie posiada przynajmniej dwóch różnych wartości. Regresja " "logistyczna nie została uruchomiona." #: src/language/stats/logistic.c:674 #, c-format msgid "" "Estimation terminated at iteration number %d because parameter estimates " "changed by less than %g" msgstr "" "Estymacja przerwana w iteracji numer %d ponieważ szacowane parametry " "zmieniały się mniej niż %g" #: src/language/stats/logistic.c:686 #, c-format msgid "" "Estimation terminated at iteration number %d because Log Likelihood " "decreased by less than %g%%" msgstr "" "Estymacja przerwana w iteracji numer %d ponieważ log prawdopodobieńśtwo " "zmniejszało się mniej niż %g%%" #: src/language/stats/logistic.c:701 #, c-format msgid "" "Estimation terminated at iteration number %d because maximum iterations has " "been reached" msgstr "" "Estymacja przerwana w iteracji numer %d ponieważ osiągnięta została " "maksymalna liczba iteracji" #: src/language/stats/logistic.c:994 msgid "Cut point value must be in the range [0,1]" msgstr "Wartość punktu odcięcia musi znajdować się w zakresie [0,1]" #: src/language/stats/logistic.c:1139 msgid "Dependent Variable Encoding" msgstr "Kodowanie zmiennej zależnej" #: src/language/stats/logistic.c:1141 msgid "Mapping" msgstr "" #: src/language/stats/logistic.c:1142 msgid "Internal Value" msgstr "Wartość wewnętrzna" #: src/language/stats/logistic.c:1145 msgid "Original Value" msgstr "Oryginalne wartość" #: src/language/stats/logistic.c:1167 msgid "Variables in the Equation" msgstr "Zmienne w modelu" #: src/language/stats/logistic.c:1171 src/language/stats/regression.c:902 msgid "B" msgstr "B" #: src/language/stats/logistic.c:1172 msgid "S.E." msgstr "Błąd standardowy" #: src/language/stats/logistic.c:1173 msgid "Wald" msgstr "Wald" #: src/language/stats/logistic.c:1176 msgid "Exp(B)" msgstr "Exp(B)" #: src/language/stats/logistic.c:1181 #, c-format msgid "%d%% CI for Exp(B)" msgstr "%d%% przedział ufności dla Exp(B)" #: src/language/stats/logistic.c:1183 src/language/stats/t-test-indep.c:274 #: src/language/stats/t-test-one-sample.c:83 #: src/language/stats/t-test-paired.c:249 src/language/stats/crosstabs.q:1369 msgid "Lower" msgstr "Dolna granica" #: src/language/stats/logistic.c:1183 src/language/stats/t-test-indep.c:275 #: src/language/stats/t-test-one-sample.c:84 #: src/language/stats/t-test-paired.c:250 src/language/stats/crosstabs.q:1370 msgid "Upper" msgstr "Górna granica" #: src/language/stats/logistic.c:1189 src/language/stats/logistic.c:1470 msgid "Step 1" msgstr "Krok 1" #: src/language/stats/logistic.c:1263 msgid "Constant" msgstr "Stała" #: src/language/stats/logistic.c:1298 msgid "Model Summary" msgstr "Podsumowanie modelu" #: src/language/stats/logistic.c:1301 msgid "-2 Log likelihood" msgstr "-2 Logarytm wiarygodności" #: src/language/stats/logistic.c:1302 msgid "Cox & Snell R Square" msgstr "R kwadrat Coxa i Snella" #: src/language/stats/logistic.c:1303 msgid "Nagelkerke R Square" msgstr "R kwadrat Nagelkerkego" #: src/language/stats/logistic.c:1306 src/language/stats/logistic.c:1470 #, fuzzy #| msgid "Step 1" msgid "Step" msgstr "Krok 1" #: src/language/stats/logistic.c:1335 msgid "Unweighted Cases" msgstr "Obserwacje nieważone" #: src/language/stats/logistic.c:1336 msgid "Included in Analysis" msgstr "Uwzględnione w analizie" #: src/language/stats/logistic.c:1336 msgid "Missing Cases" msgstr "Brakujące obserwacje" #: src/language/stats/logistic.c:1365 msgid "Categorical Variables' Codings" msgstr "Kodowanie zmiennych porządkowych" #: src/language/stats/logistic.c:1380 #, fuzzy #| msgid "Encodings" msgid "Codings" msgstr "Kodowanie" #: src/language/stats/logistic.c:1383 msgid "Parameter coding" msgstr "Kodowanie parametrów" #: src/language/stats/logistic.c:1462 msgid "Classification Table" msgstr "Tabela klasyfikacji" #: src/language/stats/logistic.c:1466 msgid "Predicted" msgstr "Przewidywane" #: src/language/stats/logistic.c:1466 #, fuzzy #| msgid "" #| "Percentage\n" #| "Correct" msgid "Percentage Correct" msgstr "" "Procent \n" "poprawnych\n" "klasyfikacji" #: src/language/stats/logistic.c:1468 msgid "Observed" msgstr "Obserwowane" #: src/language/stats/logistic.c:1468 msgid "Overall Percentage" msgstr "Procent ogółem" #: src/language/stats/jonckheere-terpstra.c:357 msgid "Jonckheere-Terpstra Test" msgstr "Test Jonckheere-Terpstra" #: src/language/stats/jonckheere-terpstra.c:364 #, c-format msgid "Number of levels in %s" msgstr "Liczba poziomów w %s" #: src/language/stats/jonckheere-terpstra.c:370 msgid "Observed J-T Statistic" msgstr "Obserwowana statystyka J-T" #: src/language/stats/jonckheere-terpstra.c:371 msgid "Mean J-T Statistic" msgstr "Średnia J-T" #: src/language/stats/jonckheere-terpstra.c:372 msgid "Std. Deviation of J-T Statistic" msgstr "Odchylenie standardowe J-T" #: src/language/stats/jonckheere-terpstra.c:373 msgid "Std. J-T Statistic" msgstr "Std. statystyka J-T" #: src/language/stats/mann-whitney.c:187 src/language/stats/wilcoxon.c:246 msgid "Sum of Ranks" msgstr "Suma rang" #: src/language/stats/mann-whitney.c:248 msgid "Mann-Whitney U" msgstr "U Mann'a-Whitney'a" #: src/language/stats/mann-whitney.c:249 msgid "Wilcoxon W" msgstr "W Wilcoxon'a" #: src/language/stats/mann-whitney.c:250 src/language/stats/runs.c:327 #: src/language/stats/wilcoxon.c:283 msgid "Z" msgstr "Z" #: src/language/stats/means.c:702 msgid "Included" msgstr "Uwzględnione" #: src/language/stats/means.c:704 src/language/stats/reliability.c:548 msgid "Excluded" msgstr "Wykluczone" #: src/language/stats/means.c:753 msgid "Report" msgstr "Raport" #: src/language/stats/means.c:838 #, fuzzy, c-format #| msgid "" #| "Dependent variable %s has no non-missing values. No analysis for this " #| "variable will be done." msgid "" "The table \"%s\" has no non-empty control variables. No result for this " "table will be displayed." msgstr "" "Zmienna zależna %s nie posiada nie-brakujących wartości. Nie przeprowadzono " "analiz dla tej zmiennej." #: src/language/stats/means-calc.c:443 msgid "Group Median" msgstr "Mediana grupy" #: src/language/stats/means-calc.c:455 msgid "First" msgstr "Pierwszy" #: src/language/stats/means-calc.c:456 msgid "Last" msgstr "Ostatni" #: src/language/stats/means-calc.c:458 msgid "Percent N" msgstr "Procent N" #: src/language/stats/means-calc.c:459 msgid "Percent Sum" msgstr "Procent zsumowany" #: src/language/stats/means-calc.c:461 msgid "Harmonic Mean" msgstr "Średnia harmoniczna" #: src/language/stats/means-calc.c:462 msgid "Geom. Mean" msgstr "Średnia geometryczna" #: src/language/stats/mcnemar.c:144 msgid "The McNemar test is appropriate only for dichotomous variables" msgstr "Test McNemara jest odpowiedni tylko dla zmiennych dychotomicznych." #: src/language/stats/mcnemar.c:226 src/language/stats/sign.c:105 msgid "Point Probability" msgstr "Prawdopodobieństwo punktowe" #: src/language/stats/mcnemar.c:229 src/language/stats/sign.c:78 #: src/language/stats/sign.c:108 src/language/stats/t-test-paired.c:199 #: src/language/stats/t-test-paired.c:257 src/language/stats/wilcoxon.c:253 #: src/language/stats/wilcoxon.c:292 #, fuzzy #| msgid "Pair %d" msgid "Pairs" msgstr "Para %d" #: src/language/stats/median.c:316 msgid "> Median" msgstr "≤ Mediana" #: src/language/stats/median.c:316 msgid "≤ Median" msgstr "≤ Mediana" #: src/language/stats/npar.c:536 #, c-format msgid "%s subcommand not currently implemented." msgstr "%s podkomenda nie jest obecnie zaimplementowana." #: src/language/stats/npar.c:691 #, c-format msgid "Expecting %s, %s, %s or a number." msgstr "Oczekiwanie %s, %s, %s lub liczby." #: src/language/stats/npar.c:845 #, c-format msgid "" "The specified value of HI (%d) is lower than the specified value of LO (%d)" msgstr "" "Określona wartość górna (%d) jest niższa niż określona wartość dolna (%d)" #: src/language/stats/npar.c:897 #, c-format msgid "" "%d expected values were given, but the specified range (%d-%d) requires " "exactly %d values." msgstr "" "Podano %d oczekiwanych wartości, ale w określonym zakresie (%d-%d) wymaga " "się dokładnie %d wartości." #: src/language/stats/npar.c:1118 src/language/stats/t-test-parser.c:173 #, c-format msgid "" "PAIRED was specified but the number of variables preceding WITH (%zu) did " "not match the number following (%zu)." msgstr "" "PAIRED zostało określone, ale liczba zmiennych z WITH (%zu) nie odpowiada " "liczbie zmiennych nastepujących (%zu)." #: src/language/stats/oneway.c:361 msgid "LSD" msgstr "LSD" #: src/language/stats/oneway.c:362 src/ui/gui/oneway.ui:338 msgid "Tukey HSD" msgstr "Tukey HSD" #: src/language/stats/oneway.c:363 src/ui/gui/oneway.ui:253 msgid "Bonferroni" msgstr "Bonferroni" #: src/language/stats/oneway.c:364 src/ui/gui/oneway.ui:304 msgid "Scheffé" msgstr "Scheffé" #: src/language/stats/oneway.c:365 msgid "Games-Howell" msgstr "Games-Howell" #: src/language/stats/oneway.c:366 src/ui/gui/oneway.ui:321 msgid "Šidák" msgstr "Šidák" #: src/language/stats/oneway.c:519 #, c-format msgid "The post hoc analysis method %s is not supported." msgstr "Metoda przeprowadzania analiz post hoc %s nie jest obsługiwana." #: src/language/stats/oneway.c:842 #, c-format msgid "" "Dependent variable %s has no non-missing values. No analysis for this " "variable will be done." msgstr "" "Zmienna zależna %s nie posiada nie-brakujących wartości. Nie przeprowadzono " "analiz dla tej zmiennej." #: src/language/stats/oneway.c:924 #, c-format msgid "" "In contrast list %zu, the number of coefficients (%zu) does not equal the " "number of groups (%d). This contrast list will be ignored." msgstr "" "W liście kontrastów %zu, liczba współczynników (%zu) nie równa się liczbie " "grup (%d). Lista kontrastów będzie ignorowana." #: src/language/stats/oneway.c:936 #, c-format msgid "Coefficients for contrast %zu do not total zero" msgstr "Współczynniki kontrastu %zu nie sumują się do zera" #: src/language/stats/oneway.c:971 msgid "ANOVA" msgstr "ANOVA" #: src/language/stats/oneway.c:974 src/language/stats/regression.c:1024 msgid "Sum of Squares" msgstr "Suma kwadratów" #: src/language/stats/oneway.c:981 msgid "Between Groups" msgstr "Między grupami" #: src/language/stats/oneway.c:981 msgid "Within Groups" msgstr "Wewnątrz grup" #: src/language/stats/oneway.c:1075 src/language/stats/oneway.c:1257 #, fuzzy #| msgid "_Dependent Variable" msgid "Dependent Variable" msgstr "_Zmienna zależna" #: src/language/stats/oneway.c:1148 msgid "Test of Homogeneity of Variances" msgstr "Test homogeniczności wariancji" #: src/language/stats/oneway.c:1151 msgid "Levene Statistic" msgstr "Statystyka Levene'a" #: src/language/stats/oneway.c:1152 msgid "df1" msgstr "df1" #: src/language/stats/oneway.c:1153 msgid "df2" msgstr "df2" #: src/language/stats/oneway.c:1192 msgid "Contrast Coefficients" msgstr "Współczynniki kontrastu" #: src/language/stats/oneway.c:1199 src/language/stats/oneway.c:1246 msgid "Contrast" msgstr "Kontrast" #: src/language/stats/oneway.c:1236 msgid "Contrast Tests" msgstr "Testy kontrastu" #: src/language/stats/oneway.c:1239 msgid "Value of Contrast" msgstr "Wartość kontrastu" #: src/language/stats/oneway.c:1241 src/language/stats/regression.c:905 #: src/language/stats/t-test-indep.c:266 #: src/language/stats/t-test-one-sample.c:74 #: src/language/stats/t-test-paired.c:252 msgid "t" msgstr "t" #: src/language/stats/oneway.c:1252 msgid "Assumption" msgstr "" #: src/language/stats/oneway.c:1253 msgid "Assume equal variances" msgstr "Założono równość wariancji" #: src/language/stats/oneway.c:1254 #, fuzzy #| msgid "Does not assume equal" msgid "Does not assume equal variances" msgstr "Nie założono równości wariancji" #: src/language/stats/oneway.c:1367 #, c-format msgid "Multiple Comparisons (%s)" msgstr "Wielokrotne porównania (%s)" #: src/language/stats/oneway.c:1374 #, fuzzy #| msgid "Mean Difference" msgid "Mean Difference (I - J)" msgstr "Różnica średnich" #: src/language/stats/oneway.c:1379 #, c-format msgid "%g%% Confidence Interval" msgstr "%g%% Przedział ufności" #: src/language/stats/oneway.c:1386 src/language/stats/oneway.c:1390 msgid "(J) Family" msgstr "" #: src/language/stats/oneway.c:1406 #, fuzzy #| msgid "Runs Test" msgid "Test" msgstr "Test serii" #: src/language/stats/quick-cluster.c:576 msgid "Initial Cluster Centers" msgstr "Wstępne centra skupień" #: src/language/stats/quick-cluster.c:577 msgid "Final Cluster Centers" msgstr "Ostateczne centra skupień" #: src/language/stats/quick-cluster.c:580 #: src/language/stats/quick-cluster.c:660 #: src/language/stats/quick-cluster.c:661 #: src/language/stats/quick-cluster.c:753 msgid "Cluster" msgstr "Skupienie" #: src/language/stats/quick-cluster.c:658 #, fuzzy #| msgid "Final Cluster Centers" msgid "Cluster Membership" msgstr "Ostateczne centra skupień" #: src/language/stats/quick-cluster.c:744 msgid "Number of Cases in each Cluster" msgstr "Liczba pozycji w każdym skupieniu" #: src/language/stats/quick-cluster.c:750 #, fuzzy #| msgid "Cluster" msgid "Clusters" msgstr "Skupienie" #: src/language/stats/quick-cluster.c:867 #: src/language/stats/quick-cluster.c:893 #, fuzzy, c-format #| msgid "Variable %s already exists." msgid "A variable called `%s' already exists." msgstr "Zmienna %s już istnieje." #: src/language/stats/quick-cluster.c:908 #, fuzzy, c-format #| msgid "expecting %s or %s" msgid "Expecting %s or %s." msgstr "Oczekiwane %s lub %s" #: src/language/stats/quick-cluster.c:928 msgid "The number of clusters must be positive" msgstr "Liczba skupień musi być dodatnia" #: src/language/stats/quick-cluster.c:944 #, fuzzy #| msgid "The number of iterations must be positive" msgid "The convergence criterion must be positive" msgstr "Liczba iteracji musi być dodatnia" #: src/language/stats/quick-cluster.c:960 msgid "The number of iterations must be positive" msgstr "Liczba iteracji musi być dodatnia" #: src/language/stats/rank.c:205 #, c-format msgid "" "Cannot generate variable name for ranking %s with %s. All candidates in use." msgstr "" "Nie można wygenerować nazwy zmiennej dla rankingu %s z %s. Wszystkie zmienne " "są w użytku." #: src/language/stats/rank.c:321 #, c-format msgid "Too many variables in %s clause." msgstr "Zbyt wiele zmiennych w warunku %s." #: src/language/stats/rank.c:323 #, c-format msgid "Variable %s already exists." msgstr "Zmienna %s już istnieje." #: src/language/stats/rank.c:325 src/language/expressions/evaluate.c:164 #, c-format msgid "Duplicate variable name %s." msgstr "Duplikuj nazwę zmiennej %s." #: src/language/stats/rank.c:631 #, c-format msgid "%s of %s by %s" msgstr "%s z %s według %s" #: src/language/stats/rank.c:825 #, fuzzy #| msgid "Variables Created By %s" msgid "Variables Created by RANK" msgstr "Zmienne utworzone według %s" #: src/language/stats/rank.c:828 src/language/stats/rank.c:829 #, fuzzy #| msgid "Name Variable:" msgid "New Variable" msgstr "Nazwy zmiennych:" #: src/language/stats/rank.c:829 #, fuzzy #| msgid "Function: " msgid "Function" msgstr "Funkcja:" #: src/language/stats/rank.c:830 #, fuzzy #| msgid "Extraction" msgid "Fraction" msgstr "Po wyodrębnieniu" #: src/language/stats/rank.c:830 #, fuzzy #| msgid "_Grouping Variable:" msgid "Grouping Variables" msgstr "_Zmienna grupująca:" #: src/language/stats/rank.c:833 src/language/stats/rank.c:834 #, fuzzy #| msgid "Insert Variable" msgid "Existing Variable" msgstr "Wstaw zmienną" #: src/language/stats/reliability.c:164 msgid "Reliability on a single variable is not useful." msgstr "Obliczanie rzetelności dla jednej zmiennej nie jest użyteczne." #: src/language/stats/reliability.c:281 msgid "" "The STATISTICS subcommand is not yet implemented. No statistics will be " "produced." msgstr "" #: src/language/stats/reliability.c:300 msgid "The split point must be less than the number of variables" msgstr "Punkt podziału musi być mniejszy niż liczba zmiennych." #: src/language/stats/reliability.c:525 #, c-format msgid "Scale: %s" msgstr "Skala: %s" #: src/language/stats/reliability.c:582 msgid "Item-Total Statistics" msgstr "Statystyki pozycji z ogółem" #: src/language/stats/reliability.c:585 msgid "Scale Mean if Item Deleted" msgstr "Średnia skali jeśli item zostanie usunięty" #: src/language/stats/reliability.c:586 msgid "Scale Variance if Item Deleted" msgstr "Wariancja skali jeśli item zostanie usunięty" #: src/language/stats/reliability.c:587 msgid "Corrected Item-Total Correlation" msgstr "Korelacja pozycji z ogółem" #: src/language/stats/reliability.c:588 msgid "Cronbach's Alpha if Item Deleted" msgstr "Alfa Cronbacha jeśli item zostanie usunięty" #: src/language/stats/reliability.c:627 msgid "Reliability Statistics" msgstr "Statystyka rzetelności" #: src/language/stats/reliability.c:634 src/language/stats/reliability.c:646 msgid "Cronbach's Alpha" msgstr "Alfa Cronbacha" #: src/language/stats/reliability.c:635 src/language/stats/reliability.c:649 #: src/language/stats/reliability.c:652 msgid "N of Items" msgstr "N itemów" #: src/language/stats/reliability.c:647 msgid "Part 1" msgstr "Część 1" #: src/language/stats/reliability.c:650 msgid "Part 2" msgstr "Część 2" #: src/language/stats/reliability.c:654 msgid "Total N of Items" msgstr "Suma N itemów" #: src/language/stats/reliability.c:656 msgid "Correlation Between Forms" msgstr "Korelacje międzypołówkowe" #: src/language/stats/reliability.c:659 msgid "Spearman-Brown Coefficient" msgstr "Współczynnik Spearmana-Browna" #: src/language/stats/reliability.c:660 msgid "Equal Length" msgstr "Równa długość" #: src/language/stats/reliability.c:661 msgid "Unequal Length" msgstr "Nierówna długość" #: src/language/stats/reliability.c:663 msgid "Guttman Split-Half Coefficient" msgstr "Współczynnik połówkowy Guttmana" #: src/language/stats/roc.c:966 msgid "Area Under the Curve" msgstr "Powierzchnia pod krzywą" #: src/language/stats/roc.c:970 msgid "Area" msgstr "Powierzchnia" #: src/language/stats/roc.c:976 msgid "Asymptotic Sig." msgstr "Istotność asymptotyczna" #: src/language/stats/roc.c:979 #, c-format msgid "Asymp. %g%% Confidence Interval" msgstr "Asymptotyczny %g%% przedział ufności" #: src/language/stats/roc.c:987 msgid "Variable under test" msgstr "Zmienne testowane" #: src/language/stats/roc.c:1026 msgid "Case Summary" msgstr "Informacja o analizowanych danych" #: src/language/stats/roc.c:1030 msgid "Unweighted" msgstr "Nieważone" #: src/language/stats/roc.c:1031 msgid "Weighted" msgstr "Ważone" #: src/language/stats/roc.c:1064 msgid "Coordinates of the Curve" msgstr "Współrzędne krzywej" #: src/language/stats/roc.c:1068 msgid "Positive if greater than or equal to" msgstr "Dodatnia, jeśli większa lub równa" #: src/language/stats/roc.c:1069 src/output/charts/roc-chart-cairo.c:38 msgid "Sensitivity" msgstr "Czułość" #: src/language/stats/roc.c:1069 src/output/charts/roc-chart-cairo.c:37 msgid "1 - Specificity" msgstr "1 - Swoistość" #: src/language/stats/roc.c:1072 #, fuzzy #| msgid "ordinary" msgid "Coordinates" msgstr "porządkowy" #: src/language/stats/roc.c:1076 msgid "Test variable" msgstr "Zmienna testowana" #: src/language/stats/regression.c:224 src/language/stats/regression.c:229 #, fuzzy, c-format #| msgid "%s may not appear after %s." msgid "VARIABLES may not appear after %s" msgstr "%s nie może pojawiać się bezpośrednio po %s." #: src/language/stats/regression.c:412 msgid "" "REGRESSION with SAVE ignores TEMPORARY. Temporary transformations will be " "made permanent." msgstr "" "REGRESSION z SAVE ignoruje TEMPORARY. Tymczasowe przekształcenia staną się " "stałe." #: src/language/stats/regression.c:416 #, fuzzy #| msgid "" #| "REGRESSION with SAVE ignores TEMPORARY. Temporary transformations will " #| "be made permanent." msgid "REGRESSION with SAVE ignores FILTER. All cases will be processed." msgstr "" "REGRESSION z SAVE ignoruje TEMPORARY. Tymczasowe przekształcenia staną się " "stałe." #: src/language/stats/regression.c:569 msgid "" "The dependent variable is equal to the independent variable. The least " "squares line is therefore Y=X. Standard errors and related statistics may be " "meaningless." msgstr "" "Zmienna zależna jest równa zmiennej niezależnej. W tym wypadku linia " "najmniejszego kwadratu Y=X. Błędy standardowe i powiązane statystyki mogą " "być bez znaczenia." #: src/language/stats/regression.c:776 msgid "No valid data found. This command was skipped." msgstr "Nie odnaleziono odpowiednich danych. Komenda ta była pominięta." #: src/language/stats/regression.c:863 #, c-format msgid "Model Summary (%s)" msgstr "Podsumowanie modelu (%s)" #: src/language/stats/regression.c:868 #: src/ui/gui/psppire-dialog-action-regression.c:42 msgid "R" msgstr "R" #: src/language/stats/regression.c:868 msgid "R Square" msgstr "R kwadrat" #: src/language/stats/regression.c:868 msgid "Adjusted R Square" msgstr "Skorygowane R kwadrat" #: src/language/stats/regression.c:869 msgid "Std. Error of the Estimate" msgstr "Błąd standardowy oszacowania" #: src/language/stats/regression.c:895 #, c-format msgid "Coefficients (%s)" msgstr "Współczynniki (%s)" #: src/language/stats/regression.c:901 msgid "Unstandardized Coefficients" msgstr "Współczynniki niestandaryzowane" #: src/language/stats/regression.c:904 msgid "Standardized Coefficients" msgstr "Współczynniki standaryzowane" #: src/language/stats/regression.c:904 msgid "Beta" msgstr "Beta" #: src/language/stats/regression.c:911 #, c-format msgid "%g%% Confidence Interval for B" msgstr "%g%% przedział ufności dla B" #: src/language/stats/regression.c:919 #, fuzzy #| msgid "Reliability Statistics" msgid "Collinearity Statistics" msgstr "Statystyka rzetelności" #: src/language/stats/regression.c:920 #, fuzzy #| msgid "Covariance" msgid "Tolerance" msgstr "Kowariancja" #: src/language/stats/regression.c:920 msgid "VIF" msgstr "" #: src/language/stats/regression.c:933 msgid "(Constant)" msgstr "(Stała)" #: src/language/stats/regression.c:1020 #, c-format msgid "ANOVA (%s)" msgstr "ANOVA (%s)" #: src/language/stats/regression.c:1031 src/ui/gui/regression.ui:24 msgid "Regression" msgstr "Regresja" #: src/language/stats/regression.c:1075 #, c-format msgid "Coefficient Correlations (%s)" msgstr "Współczynniki korelacji (Zmienna zależna: %s)" #: src/language/stats/regression.c:1082 #, fuzzy #| msgid "Model" msgid "Models" msgstr "Model" #: src/language/stats/regression.c:1090 msgid "Covariances" msgstr "Kowariancje" #: src/language/stats/runs.c:169 #, c-format msgid "" "Multiple modes exist for variable `%s'. Using %.*g as the threshold value." msgstr "" "Istnieje wiele trybów dla zmiennej `%s'. Stosowanie %.*g jako wartości " "progowej." #: src/language/stats/runs.c:314 src/ui/gui/runs.ui:24 msgid "Runs Test" msgstr "Test serii" #: src/language/stats/runs.c:319 msgid "Test Value" msgstr "Wartość testowana" #: src/language/stats/runs.c:320 msgid "Test Value (mode)" msgstr "Wartość testowana (dominanta)" #: src/language/stats/runs.c:321 msgid "Test Value (mean)" msgstr "Wartość testowana (średnia)" #: src/language/stats/runs.c:322 msgid "Test Value (median)" msgstr "Wartość testowana (mediana)" #: src/language/stats/runs.c:323 msgid "Cases < Test Value" msgstr "Obserwacje < od testowanej wartości" #: src/language/stats/runs.c:324 msgid "Cases ≥ Test Value" msgstr "Obserwacje ≥ od testowanej wartości" #: src/language/stats/runs.c:325 msgid "Total Cases" msgstr "Suma obserwacji" #: src/language/stats/runs.c:326 msgid "Number of Runs" msgstr "Liczba serii" #: src/language/stats/sign.c:72 #, fuzzy #| msgid "Mean Difference" msgid "Differences" msgstr "Różnica średnich" #: src/language/stats/sign.c:73 msgid "Negative Differences" msgstr "Różnice ujemne" #: src/language/stats/sign.c:74 msgid "Positive Differences" msgstr "Różnice dodatnie" #: src/language/stats/sign.c:75 src/language/stats/wilcoxon.c:250 msgid "Ties" msgstr "Wiązania" #: src/language/stats/sort-cases.c:63 msgid "Buffer limit must be at least 2." msgstr "Limit buforów musi wynosić przynajmniej 2." #: src/language/stats/sort-criteria.c:89 #, c-format msgid "Variable %s specified twice in sort criteria." msgstr "Zmienna %s została określona dwukrotnie w kryteriach sortowania." #: src/language/stats/t-test-indep.c:190 msgid "Group Statistics" msgstr "Statystyki dla grup" #: src/language/stats/t-test-indep.c:200 #, fuzzy #| msgid "Group1" msgid "Group" msgstr "Grupa 1" #: src/language/stats/t-test-indep.c:256 msgid "Independent Samples Test" msgstr "Test dla prób niezależnych" #: src/language/stats/t-test-indep.c:261 msgid "Levene's Test for Equality of Variances" msgstr "Test Levene'a jednorodności wariancji" #: src/language/stats/t-test-indep.c:265 #, fuzzy #| msgid "t-test for Equality of Means" msgid "T-Test for Equality of Means" msgstr "Test t równości średnich" #: src/language/stats/t-test-indep.c:269 #: src/language/stats/t-test-one-sample.c:77 msgid "Mean Difference" msgstr "Różnica średnich" #: src/language/stats/t-test-indep.c:270 msgid "Std. Error Difference" msgstr "Błąd standardowy różnicy" #: src/language/stats/t-test-indep.c:273 #, fuzzy, no-c-format #| msgid "%g%% Confidence Interval of the Difference" msgid "95% Confidence Interval of the Difference" msgstr "%g%% przedział ufności dla różnicy średnich" #: src/language/stats/t-test-indep.c:277 #, fuzzy #| msgid "Options" msgid "Assumptions" msgstr "Opcje" #: src/language/stats/t-test-indep.c:278 msgid "Equal variances assumed" msgstr "Założono równość wariancji" #: src/language/stats/t-test-indep.c:279 msgid "Equal variances not assumed" msgstr "Nie założono równości wariancji" #: src/language/stats/t-test-one-sample.c:64 msgid "One-Sample Test" msgstr "Test dla jednej próby" #: src/language/stats/t-test-one-sample.c:71 #, fuzzy, c-format #| msgid "Test Value = %f" msgid "Test Value = %.*g" msgstr "Wartość testu - %f" #: src/language/stats/t-test-one-sample.c:80 #: src/language/stats/t-test-paired.c:246 #, c-format msgid "%g%% Confidence Interval of the Difference" msgstr "%g%% przedział ufności dla różnicy średnich" #: src/language/stats/t-test-one-sample.c:122 msgid "One-Sample Statistics" msgstr "Statystyki dla jednej próby" #: src/language/stats/t-test-paired.c:147 msgid "Paired Sample Statistics" msgstr "Statystyki dla prób zależnych" #: src/language/stats/t-test-paired.c:163 #: src/language/stats/t-test-paired.c:205 #: src/language/stats/t-test-paired.c:263 #, fuzzy, c-format #| msgid "Pair %d" msgid "Pair %zu" msgstr "Para %d" #: src/language/stats/t-test-paired.c:190 msgid "Paired Samples Correlations" msgstr "Korelacje dla prób zależnych" #: src/language/stats/t-test-paired.c:208 #, c-format msgid "%s & %s" msgstr "%s i %s" #: src/language/stats/t-test-paired.c:234 msgid "Paired Samples Test" msgstr "Test dla prób zależnych" #: src/language/stats/t-test-paired.c:240 msgid "Paired Differences" msgstr "Różnice w próbach zależnych" #: src/language/stats/t-test-paired.c:266 #, c-format msgid "%s - %s" msgstr "%s - %s" #: src/language/stats/t-test-parser.c:133 #, c-format msgid "When applying %s to a string variable, two values must be specified." msgstr "" "Kiedy stosuje się %s do zmiennej tekstowej, musza być określone dwie " "wartości." #: src/language/stats/t-test-parser.c:145 #: src/language/stats/t-test-parser.c:241 #, c-format msgid "%s subcommand may not be used with %s." msgstr "Podkomenda %s nie może zostać użyta z %s." #: src/language/stats/t-test-parser.c:305 msgid "Exactly one of TESTVAL, GROUPS and PAIRS subcommands must be specified." msgstr "" "Dokładnie jedna z TESTVAL, GROUPS i PAIRS subkomend musi zostać określona." #: src/language/stats/wilcoxon.c:248 #, fuzzy #| msgid "_Sign" msgid "Sign" msgstr "_Test znaków" #: src/language/stats/wilcoxon.c:249 msgid "Negative Ranks" msgstr "Rangi ujemne" #: src/language/stats/wilcoxon.c:249 msgid "Positive Ranks" msgstr "Rangi dodatnie" #: src/language/stats/wilcoxon.c:296 #, fuzzy #| msgid "Too many pairs to calculate exact significance." msgid "Too many pairs to calculate exact significance" msgstr "Zbyt wiele par, aby obliczyć dokładną istotność." #: src/language/data-io/combine-files.c:214 msgid "Cannot specify the active dataset since none has been defined." msgstr "" "Nie można określić aktywnego zbioru danych, ponieważ żaden nie został " "zdefiniowany." #: src/language/data-io/combine-files.c:220 msgid "" "This command may not be used after TEMPORARY when the active dataset is an " "input source. Temporary transformations will be made permanent." msgstr "" "Ta komenda nie może być użyta po TEMPORARY, kiedy aktywny zbiór danych jest " "źródłem wejścia. Tymczasowe przekształcenia staną się stałe." #: src/language/data-io/combine-files.c:255 msgid "Multiple IN subcommands for a single FILE or TABLE." msgstr "Wielokrotne podkomendy IN dla pojedynczego FILE lub TABLE." #: src/language/data-io/combine-files.c:308 #, c-format msgid "File %s lacks BY variable %s." msgstr "W pliku %s brakuje zmiennej BY %s." #: src/language/data-io/combine-files.c:311 #, c-format msgid "Active dataset lacks BY variable %s." msgstr "W aktywnym zbiorze danych brakuje zmiennej BY %s." #: src/language/data-io/combine-files.c:388 #: src/language/data-io/combine-files.c:393 #, c-format msgid "BY is required when %s is specified." msgstr "Kiedy określone jest %s wymagane jest BY." #: src/language/data-io/combine-files.c:521 msgid "" "Combining files with incompatible encodings. String data may not be " "represented correctly." msgstr "" "Łączenie plików jest niekompatybilne z kodowaniem. Dane tekstowe mogą się " "nie wyświetlać prawidłowo." #: src/language/data-io/combine-files.c:564 #, c-format msgid "" "Variable %s in file %s has different type or width from the same variable in " "earlier file." msgstr "" "Zmienna %s w pliku %s ma inny typ lub szerokość niż ta sama zmienna we " "wcześniejszym pliku." #: src/language/data-io/combine-files.c:570 #, c-format msgid "In file %s, %s is numeric." msgstr "W pliku %s, %s jest numeryczna." #: src/language/data-io/combine-files.c:573 #, c-format msgid "In file %s, %s is a string variable with width %d." msgstr "W pliku %s, %s jest zmienną tekstową o szerokości %d." #: src/language/data-io/combine-files.c:578 #, c-format msgid "In an earlier file, %s was numeric." msgstr "We wcześniejszym pliku, %s była numeryczna." #: src/language/data-io/combine-files.c:581 #, c-format msgid "In an earlier file, %s was a string variable with width %d." msgstr "We wcześniejszym pliku, %s była zmienną tekstową o szerokości %d." #: src/language/data-io/combine-files.c:621 #, c-format msgid "" "Variable name %s specified on %s subcommand duplicates an existing variable " "name." msgstr "" "Nazwa zmiennej %s określona w %s podkomendzie powiela nazwę istniejącej " "zmiennej." #: src/language/data-io/combine-files.c:793 #, c-format msgid "Encountered %zu sets of duplicate cases in the master file." msgstr "Napotkano %zu zbiorów zduplikowanych obserwacji w pliku nadrzędnym." #: src/language/data-io/data-list.c:129 src/language/data-io/data-list.c:144 #, fuzzy, c-format #| msgid "%s must not be negative." msgid "The %s value must be non-negative." msgstr "%s nie może być wartością ujemną" #: src/language/data-io/data-list.c:154 #, c-format msgid "The %s subcommand may only be used within %s." msgstr "Podkomenda %s może być uzyta jedynie wewnątrz %s." #: src/language/data-io/data-list.c:159 #, c-format msgid "The %s subcommand may only be specified once." msgstr "Podkomenda %s może być określona tylko raz." #: src/language/data-io/data-list.c:197 msgid "Only one of FIXED, FREE, or LIST may be specified." msgstr "Jedynie jedno z FIXED, FREE lub LIST może być określone." #: src/language/data-io/data-list.c:260 msgid "Encoding should not be specified for inline data. It will be ignored." msgstr "" "Kodowanie dla pliku wbudowanego w pliku nie powinno być określone. Zostanie " "ignorowane." #: src/language/data-io/data-list.c:269 #, c-format msgid "The %s subcommand may be used only with %s." msgstr "Podkomenda %s może być użyta jedynie wraz z %s." #: src/language/data-io/data-list.c:284 src/language/data-io/matrix-data.c:578 msgid "At least one variable must be specified." msgstr "Przynajmniej jedna zmienna musi być określona." #: src/language/data-io/data-list.c:383 src/language/data-io/data-list.c:491 #: src/language/data-io/get-data.c:662 #, c-format msgid "%s is a duplicate variable name." msgstr "%s ma taką samą nazwę jak inna zmienna." #: src/language/data-io/data-list.c:390 #, c-format msgid "There is already a variable %s of a different type." msgstr "Istnieje już zmienna %s innego typu." #: src/language/data-io/data-list.c:397 #, c-format msgid "There is already a string variable %s of a different width." msgstr "Istnieje już zmienna tekstowa %s o innej szerokości." #: src/language/data-io/data-list.c:405 #, c-format msgid "Cannot place variable %s on record %d when RECORDS=%d is specified." msgstr "" "Nie można podać zmiennej %s w zapisie %d kiedy RECORDS=%d jest określone." #: src/language/data-io/data-parser.c:453 #: src/language/data-io/data-parser.c:462 msgid "Quoted string extends beyond end of line." msgstr "Tekst wzięty w cudzysłów przekracza koniec linii." #: src/language/data-io/data-parser.c:488 msgid "Missing delimiter following quoted string." msgstr "Brakujący separator po tekście w cudzysłowie." #: src/language/data-io/data-parser.c:506 #, c-format msgid "Data for variable %s is not valid as format %s: %s" msgstr "Dane zmiennej %s nie są w prawidłowym formacie %s: %s." #: src/language/data-io/data-parser.c:536 #, c-format msgid "Partial case of %d of %d records discarded." msgstr "Częściowe obserwacje %d z zapisu %d zostały odrzucone." #: src/language/data-io/data-parser.c:592 #, c-format msgid "Partial case discarded. The first variable missing was %s." msgstr "Częściowe obserwacje odrzucone. W pierwszej zmiennej brakowało %s." #: src/language/data-io/data-parser.c:634 #, c-format msgid "" "Missing value(s) for all variables from %s onward. These will be filled " "with the system-missing value or blanks, as appropriate." msgstr "" "Braki danych dla wszystkich zmiennych od %s. Zostaną one uzupełnione jako " "braki systemowe lub puste." #: src/language/data-io/data-parser.c:655 msgid "Record ends in data not part of any field." msgstr "Zapis kończy się w części danych, które nie są polem." #: src/language/data-io/data-parser.c:670 #, c-format msgid "Reading %d record from %s." msgid_plural "Reading %d records from %s." msgstr[0] "Wczytywanie zapisu %d z %s." msgstr[1] "Wczytywanie zapisu %d z %s." msgstr[2] "Wczytywanie zapisu %d z %s." #: src/language/data-io/data-parser.c:680 src/language/data-io/print.c:435 msgid "Record" msgstr "Zapis" #: src/language/data-io/data-parser.c:680 src/language/data-io/print.c:435 #: src/ui/gui/psppire-var-sheet-header.c:76 msgid "Columns" msgstr "Kolumny" #: src/language/data-io/data-parser.c:680 #: src/language/data-io/data-parser.c:725 src/language/data-io/print.c:435 msgid "Format" msgstr "Format" #: src/language/data-io/data-parser.c:720 #, c-format msgid "Reading free-form data from %s." msgstr "Wczytywanie czystego arkusza z %s." #. TRANSLATORS: this fragment will be interpolated into #. messages in fh_lock() that identify types of files. #: src/language/data-io/data-reader.c:136 src/language/data-io/data-writer.c:79 msgid "data file" msgstr "Plik danych" #: src/language/data-io/data-reader.c:160 #, c-format msgid "Could not open `%s' for reading as a data file: %s." msgstr "Nie można otworzyć `%s' dla wczytywania pliku danych: %s." #: src/language/data-io/data-reader.c:174 #, c-format msgid "Could not read `%s' as a text file with encoding `%s': %s." msgstr "Nie można wczytać `%s' jako pliku tekstowego z kodowaniem `%s' : %s." #: src/language/data-io/data-reader.c:233 #, c-format msgid "" "Missing %s while reading inline data. This probably indicates a missing or " "incorrectly formatted %s command. %s must appear by itself on a single line " "with exactly one space between words." msgstr "" "Brak %s podczas wczytywania pliku wbudowanego w pliku. Prawdopodobnie " "wskazuje to na brakującą lub nieprawidłowo sformatowaną komendę %s. %s musi " "pojawić się w osobnej linii dokładnie jedną spację między dwoma słowami." #: src/language/data-io/data-reader.c:253 #: src/language/data-io/data-reader.c:387 #, c-format msgid "Error reading file %s: %s." msgstr "Błąd podczas wczytywania pliku %s: %s." #: src/language/data-io/data-reader.c:261 #, c-format msgid "Unexpected end of file in partial record reading %s." msgstr "Nieoczekiwany koniec pliku w niecałkowitym zapisie wczytywania %s." #: src/language/data-io/data-reader.c:321 #, c-format msgid "Corrupt block descriptor word at offset 0x%lx in %s." msgstr "uszkodzony deskryptor słowa bloku w gałęzi 0x%lx w %s." #: src/language/data-io/data-reader.c:322 #, c-format msgid "Corrupt record descriptor word at offset 0x%lx in %s." msgstr "Uszkodzony deskryptor zapisu słowa w gałęzi 0x%lx w %s." #: src/language/data-io/data-reader.c:335 #, c-format msgid "Corrupt record size at offset 0x%lx in %s." msgstr "Uszkodzona wielkość zapisu w gałęzi 0x%lx w %s." #: src/language/data-io/data-reader.c:493 msgid "Record exceeds remaining block length." msgstr "Zapis przekracze pozostałą długość bloku." #: src/language/data-io/data-reader.c:567 #, c-format msgid "Attempt to read beyond end-of-file on file %s." msgstr "Próba wczytania poza koniec pliku w pliku %s." #: src/language/data-io/data-reader.c:570 #, c-format msgid "Attempt to read beyond %s." msgstr "Próba wczytania poza %s." #: src/language/data-io/data-reader.c:733 msgid "" "This command is not valid here since the current input program does not " "access the inline file." msgstr "" "Ta komenda nie jest tu odpowiednia, ponieważ program wejścia nie ma dostępu " "do pliku wbudowanego w pliku." #: src/language/data-io/data-writer.c:106 #, c-format msgid "An error occurred while opening `%s' for writing as a data file: %s." msgstr "Wystąpił błąd podczas otwierania `%s' do zapisania w pliku: %s." #: src/language/data-io/data-writer.c:224 #, c-format msgid "I/O error occurred writing data file `%s'." msgstr "Nastąpił bład wejścia/wyjścia podczas zapisywania pliku `%s'." #: src/language/data-io/dataset.c:64 #, c-format msgid "There is no dataset named %s." msgstr "Zbiór danych nazwany %s nie istnieje." #: src/language/data-io/dataset.c:250 #, fuzzy #| msgid "Dataset" msgid "Datasets" msgstr "Zbiór danych" #: src/language/data-io/dataset.c:263 msgid "unnamed dataset" msgstr "Nienazwany zbiór danych" #: src/language/data-io/file-handle.c:61 #, c-format msgid "" "File handle %s is already defined. Use %s before redefining a file handle." msgstr "" "Deskryptor pliku %s jest już zdefiniowany. Uzyj %s przed redefiniowaniem " "deskryptora pliku." #: src/language/data-io/file-handle.c:241 #, c-format msgid "%s must be specified with %s." msgstr "%s musi być określone z %s." #: src/language/data-io/file-handle.c:252 #, c-format msgid "" "The specified file mode requires LRECL. Assuming %zu-character records." msgstr "Okreslony tryb pliku wymaga LRCL. Zakładany %zu-charakter wpisów." #: src/language/data-io/file-handle.c:256 #, fuzzy, c-format #| msgid "" #| "Record length (%ld) must be between 1 and %lu bytes. Assuming %zu-" #| "character records." msgid "" "Record length (%d) must be between 1 and %lu bytes. Assuming %zu-character " "records." msgstr "" "Długość wpisu (%ld) musi wynosić między 1 a %lu bajtów. Zakładany %zu-" "charakter wpisów." #: src/language/data-io/file-handle.c:300 msgid "file" msgstr "plik" #: src/language/data-io/file-handle.c:302 msgid "inline file" msgstr "Plik wbudowany w pliku" #: src/language/data-io/file-handle.c:350 msgid "expecting a file name or handle name" msgstr "oczekiwana nazwa pliku lub deskryptor pliku" #: src/language/data-io/file-handle.c:365 #, c-format msgid "Handle for %s not allowed here." msgstr "Deskryptor %s nie jest dopuszczalny." #: src/language/data-io/get-data.c:108 src/output/measure.c:262 #, c-format msgid "error reading file `%s'" msgstr "błąd wczytywania pliku `%s'" #: src/language/data-io/get-data.c:127 #, c-format msgid "Unsupported TYPE %s." msgstr "Nieobsługiwany TYPE %s." #: src/language/data-io/get-data.c:278 msgid "The sheet index must be greater than or equal to 1" msgstr "Arkusz indeksu musi być większy bądź równy 1." #: src/language/data-io/get-data.c:285 src/language/data-io/get-data.c:308 #: src/language/data-io/get-data.c:327 #, c-format msgid "%s must be followed by either \"%s\" or \"%s\"." msgstr "Po %s musi następować albo \"%s\" albo \"%s\"." #: src/language/data-io/get-data.c:357 #, c-format msgid "" "%s is allowed only with %s arrangement, but %s arrangement was stated or " "implied earlier in this command." msgstr "" "%s jest dopuszczalne tylko z argumentem %s, ale układ %s był określony " "wcześniej w tej komendzie." #: src/language/data-io/get-data.c:441 src/language/data-io/get-data.c:479 #, c-format msgid "Value of %s must be 1 or greater." msgstr "Wartość %s musi być równa 1 lub większa." #: src/language/data-io/get-data.c:504 msgid "" "Ignoring obsolete IMPORTCASES subcommand. (N OF CASES or SAMPLE may be used " "to substitute.)" msgstr "" #: src/language/data-io/get-data.c:551 msgid "" "In compatible syntax mode, the QUALIFIER string must contain exactly one " "character." msgstr "" "W kompatybilnym trybie syntaxu, łańcuch QUALIFIER musi zawierać dokładnie " "jeden znak." #: src/language/data-io/get-data.c:583 #, c-format msgid "" "The record number specified, %ld, is at or before the previous record, %d. " "Data fields must be listed in order of increasing record number." msgstr "" "Określona liczba zapisu, %ld, znajduje się w lub przed poprzednim zapisem, " "%d. Pola danych muszą być wypisane w kolejności rosnącej." #: src/language/data-io/get-data.c:592 #, c-format msgid "" "The record number specified, %ld, exceeds the number of records per case " "specified on FIXCASE, %d." msgstr "" "Określona liczba zapisu, %ld, przekracza liczbę zapisów na przypadek " "określonych w FIXCASE, %d." #: src/language/data-io/get.c:132 #, c-format msgid "%s: Data file dictionary has no variables." msgstr "" #: src/language/data-io/inpt-pgm.c:133 #, c-format msgid "Unexpected end-of-file within %s." msgstr "Nieoczekiwany koniec pliku wewnątrz %s." #: src/language/data-io/inpt-pgm.c:146 #, c-format msgid "Input program must contain %s or %s." msgstr "Program wejścia musi zawierać %s lub %s." #: src/language/data-io/inpt-pgm.c:152 msgid "Input program did not create any variables." msgstr "Program wejścia nie tworzy żadnych zmiennych." #: src/language/data-io/inpt-pgm.c:365 msgid "" "REREAD: Column numbers must be positive finite numbers. Column set to 1." msgstr "" "REREAD: Numery kolumn muszą być dodatnimi i skończonymi cyframi. Kolumna " "ustawiona na 1." #: src/language/data-io/list.c:100 #, fuzzy #| msgid "Dataset" msgid "Data List" msgstr "Zbiór danych" #: src/language/data-io/list.c:221 #, c-format msgid "" "The first case (%ld) specified precedes the last case (%ld) specified. The " "values will be swapped." msgstr "" "Pierwsza obserwacja (%ld) określona poprzedza ostanią określoną obserwację " "(%ld). Wartości te będą zamienione." #: src/language/data-io/list.c:230 #, fuzzy, c-format #| msgid "" #| "The first case (%ld) to list is less than 1. The value is being reset to " #| "1." msgid "" "The first case (%ld) to list is numbered less than 1. The value is being " "reset to 1." msgstr "" "Pierwsza obserwacja (%ld) w liście jest mniejsza niż 1. Wartość zresetowana " "do 1." #: src/language/data-io/list.c:237 #, fuzzy, c-format #| msgid "" #| "The last case (%ld) to list is less than 1. The value is being reset to " #| "1." msgid "" "The last case (%ld) to list is numbered less than 1. The value is being " "reset to 1." msgstr "" "Ostatnia obserwacja (%ld) w liście jest mniejsza niż 1. Wartość zresetowana " "do 1." #: src/language/data-io/list.c:244 #, c-format msgid "The step value %ld is less than 1. The value is being reset to 1." msgstr "Wartość krokowa %ld jest mniejsza niż 1. Wartość zresetowana dla 1." #: src/language/data-io/placement-parser.c:96 #, c-format msgid "" "Number of variables specified (%zu) differs from number of variable formats " "(%zu)." msgstr "" "Liczba zmiennych określonych (%zu) różni się od formatów liczby zmiennych " "(%zu)." #: src/language/data-io/placement-parser.c:106 msgid "" "SPSS-like or Fortran-like format specification expected after variable names." msgstr "Oczekiwany format podobny do SPSS lub Fortran po nazwach zmiennych." #: src/language/data-io/placement-parser.c:129 #, c-format msgid "The %d columns %d-%d can't be evenly divided into %zu fields." msgstr "%d kolumn %d-%d nie może być równomiernie podzielone w pola %zu." #: src/language/data-io/placement-parser.c:310 msgid "Column positions for fields must be positive." msgstr "Pozycje kolumn dla pól muszą być dodatnie." #: src/language/data-io/placement-parser.c:312 msgid "Column positions for fields must not be negative." msgstr "Pozycje kolumn dla pól nie mogą być ujemne." #: src/language/data-io/placement-parser.c:372 msgid "The ending column for a field must be greater than the starting column." msgstr "Kolumna kończąca pole musi być większa niż ta rozpoczynająca." #: src/language/data-io/placement-parser.c:409 #, fuzzy, c-format #| msgid "" #| "The record number specified, %ld, is at or before the previous record, " #| "%d. Data fields must be listed in order of increasing record number." msgid "" "The record number specified, %.0f, is at or before the previous record, %d. " "Data fields must be listed in order of increasing record number." msgstr "" "Określona liczba zapisu, %ld, znajduje się w lub przed poprzednim zapisem, " "%d. Pola danych muszą być wypisane w kolejności rosnącej." #: src/language/data-io/print-space.c:127 #, c-format msgid "The expression on %s evaluated to the system-missing value." msgstr "Wyrażenie na %s ocenione jako systemowy brak danych." #: src/language/data-io/print-space.c:130 #, c-format msgid "The expression on %s evaluated to %g." msgstr "Wyrażenie na %s ocenione jako %g." #: src/language/data-io/print.c:189 src/language/data-io/trim.c:58 msgid "expecting a valid subcommand" msgstr "oczekiwanie odpowiedniej podkomendy" #: src/language/data-io/print.c:219 #, c-format msgid "%s is required when binary formats are specified." msgstr "%s jest wymagane kiedy określane są formaty binarne." #: src/language/data-io/print.c:302 #, c-format msgid "Output calls for %d records but %zu specified on RECORDS subcommand." msgstr "Raport wzywa zapisy %d ale w podkomendzie RECORDS określono %zu." #: src/language/data-io/print.c:432 #, fuzzy #| msgid "Case Processing Summary" msgid "Print Summary" msgstr "Informacja o analizowanych danych" #: src/language/data-io/print.c:462 #, fuzzy #| msgid "Record" msgid "N of Records" msgstr "Zapis" #: src/language/data-io/matrix-data.c:191 #, c-format msgid "" "There are %d variable declared but the data has at least %d matrix rows." msgstr "" #: src/language/data-io/matrix-data.c:292 msgid "" "The N subcommand was specified, but a N record was also found in the data. " "The N record will be ignored." msgstr "" #: src/language/data-io/matrix-data.c:488 src/language/utilities/set.q:186 #, c-format msgid "%s must not be negative." msgstr "%s nie może być wartością ujemną" #: src/language/data-io/matrix-data.c:568 #, fuzzy #| msgid "%s and %s are mutually exclusive" msgid "FORMAT = FULL and FORMAT = NODIAGONAL are mutually exclusive." msgstr "%s i %s wzajemnie się wykluczają" #: src/language/data-io/matrix-reader.c:102 #: src/language/data-io/matrix-reader.c:118 #, fuzzy, c-format #| msgid "Active dataset lacks BY variable %s." msgid "Matrix dataset lacks a variable called %s." msgstr "W aktywnym zbiorze danych brakuje zmiennej BY %s." #: src/language/data-io/matrix-reader.c:109 #: src/language/data-io/matrix-reader.c:125 #, c-format msgid "Matrix dataset variable %s should be of string type." msgstr "" #: src/language/data-io/save-translate.c:168 #: src/language/data-io/save-translate.c:183 #, c-format msgid "The %s string must contain exactly one character." msgstr "Łańcuch %s musi zawierać dokładnie jeden znak." #: src/language/data-io/save-translate.c:249 #, c-format msgid "Output file `%s' exists but %s was not specified." msgstr "Plik raportu `%s' istnieje, ale %s nie został określony." #: src/language/data-io/save.c:309 msgid "The OUTFILE or METADATA subcommand is required." msgstr "" #: src/language/data-io/trim.c:69 #, c-format msgid "" "Cannot rename %s as %s because there already exists a variable named %s. To " "rename variables with overlapping names, use a single RENAME subcommand such " "as `/RENAME (A=B)(B=C)(C=A)', or equivalently, `/RENAME (A B C=B C A)'." msgstr "" "Nie można zmienić nazwy %s na %s, ponieważ już istnieje zmienna nazwana %s. " "Aby zmienić nazwę z powtarzającymi się nazwami, zastosuj pojedynczą " "podkomendę RENAME, np. `/RENAME (A=B)(B=C)(C=A)', or equivalently, `/RENAME " "(A B C=B C A)'." #: src/language/data-io/trim.c:227 #, c-format msgid "" "Number of variables on left side of `=' (%zu) does not match number of " "variables on right side (%zu), in parenthesized group %d of RENAME " "subcommand." msgstr "" "Liczba zmiennych po lewej stronie `=' (%zu) nie odpowiada liczbie zmiennych " "po prawej stronie (%zu) , w grupie w nawiasie %d w podkomendzie RENAME." #: src/language/data-io/trim.c:242 #, c-format msgid "Requested renaming duplicates variable name %s." msgstr "Żądanie zmiany nazwy zduplikowanych nazw zmiennych %s." #: src/language/data-io/trim.c:281 msgid "Cannot DROP all variables from dictionary." msgstr "Nie można DROP wszystkich zmiennych ze słownika danych." #: src/language/expressions/evaluate.c:151 msgid "expecting number or string" msgstr "oczekiwana liczba lub tekst" #: src/language/expressions/helpers.c:43 msgid "" "One of the arguments to a DATE function is not an integer. The result will " "be system-missing." msgstr "" "Jeden z argumentów funkcji DATE nie jest liczbą całkowitą. Rezultatem będzie " "brak systemowy." #: src/language/expressions/helpers.c:71 msgid "" "The week argument to DATE.WKYR is not an integer. The result will be system-" "missing." msgstr "" "Argument tygodnia w DATE.WKYR nie jest liczbą całkowitą. Rezultatem będzie " "brak systemowy." #: src/language/expressions/helpers.c:77 msgid "" "The week argument to DATE.WKYR is outside the acceptable range of 1 to 53. " "The result will be system-missing." msgstr "" "Argument tygodnia w DATE.WKYR jest poza dopuszczalnym zakresem od 1 do 53. " "Rezultatem będzie brak systemowy." #: src/language/expressions/helpers.c:99 msgid "" "The day argument to DATE.YRDAY is not an integer. The result will be system-" "missing." msgstr "" "Argument dnia w DATE.YRDAY nie jest liczbą całkowitą. Rezultatem będzie brak " "systemowy." #: src/language/expressions/helpers.c:105 msgid "" "The day argument to DATE.YRDAY is outside the acceptable range of 1 to 366. " "The result will be system-missing." msgstr "" "Argument dnia w DATE.YRDAY jest poza dopuszczalnym zakresem od 1 do 366. " "Rezultatem będzie brak systemowy." #: src/language/expressions/helpers.c:127 msgid "" "The year argument to YRMODA is greater than 47516. The result will be " "system-missing." msgstr "" "Argument roku w YRMODA jest większy niż 47516. Rezultatem będzie brak " "systemowy." #: src/language/expressions/helpers.c:180 #, c-format msgid "" "Unrecognized date unit `%.*s'. Valid date units are `%s', `%s', `%s', `%s', " "`%s', `%s', `%s', and `%s'." msgstr "" "Nierozpoznana jednostka daty `%.*s'. Poprawnymi jednostkami są `%s', `%s', `" "%s', `%s', `%s', `%s', `%s' i `%s'." #: src/language/expressions/helpers.c:333 #, c-format msgid "Invalid DATESUM method. Valid choices are `%s' and `%s'." msgstr "Nieprawidłowa metoda DATESUM. Poprawne wybory to `%s' i `%s'." #: src/language/expressions/parse.c:261 #, c-format msgid "" "Type mismatch: expression has %s type, but a numeric value is required here." msgstr "" "Niedopasowanie typu: wyrażenie posiada typ %s, ale wymagana jest tu wartość " "numeryczna." #: src/language/expressions/parse.c:274 #, c-format msgid "" "Type mismatch: expression has %s type, but a string value is required here." msgstr "" "Niedopasowanie typu: wyrażenie posiada typ %s, ale wymagana jest to wartość " "tekstowa." #: src/language/expressions/parse.c:436 #, c-format msgid "Type mismatch while applying %s operator: cannot convert %s to %s." msgstr "" "Niedopasowanie typu podczas zastosowania operatora %s: nie można konwertować " "%s na %s." #: src/language/expressions/parse.c:650 msgid "" "Chaining relational operators (e.g. `a < b < c') will not produce the " "mathematically expected result. Use the AND logical operator to fix the " "problem (e.g. `a < b AND b < c'). If chaining is really intended, " "parentheses will disable this warning (e.g. `(a < b) < c'.)" msgstr "" "Łączenie operatorów związkowych (np.`a < b < c') nie będzie skutkowało " "matematycznie oczekiwanym rezultatem. Uzyj logicznego operatora AND, aby " "rozwiązać problem (np. `a < b AND b < c'). Jeśli łączenie jest naprawdę " "zamierzone, wzięcie w nawias usunie to ostrzeżenie (np. `(a < b) < c'.)" #: src/language/expressions/parse.c:752 msgid "" "The exponentiation operator (`**') is left-associative, even though right-" "associative semantics are more useful. That is, `a**b**c' equals " "`(a**b)**c', not as `a**(b**c)'. To disable this warning, insert " "parentheses." msgstr "" "Znak potęgowania (`**') jest lewostronny, nawet kiedy prawostronna semantyka " "jest bardziej użyteczna. To znaczy, `a**b**c' jest równe `(a**b)**c', nie " "jak `a**(b**c)'. Aby usunąc to ostrzeżenie, wstaw nawiasy." #: src/language/expressions/parse.c:832 #, c-format msgid "Unknown system variable %s." msgstr "Nieznana zmienna systemowa %s." #: src/language/expressions/parse.c:880 #, c-format msgid "Unknown identifier %s." msgstr "Nieznany identyfikator %s." #: src/language/expressions/parse.c:1102 #, c-format msgid "%s must have at least %d arguments in list." msgstr "%s musi posiadać przynajmniej %d argumentów w liście." #: src/language/expressions/parse.c:1111 #, c-format msgid "%s must have an even number of arguments in list." msgstr "%s musi posiadać równą liczbę argumentó w liście." #: src/language/expressions/parse.c:1114 #, c-format msgid "%s must have multiple of %d arguments in list." msgstr "%s musi posiadać wiele argumentów %d na liście." #: src/language/expressions/parse.c:1124 #, c-format msgid "%s function does not accept a minimum valid argument count." msgstr "Funkcja %s nie akceptuje minimalnej wartości poprawnych argumentów." #: src/language/expressions/parse.c:1133 #, c-format msgid "%s requires at least %d valid arguments in list." msgstr "%s wymaga przynajmniej %d poprawnych argumentów w liście." #: src/language/expressions/parse.c:1139 #, c-format msgid "" "With %s, using minimum valid argument count of %d does not make sense when " "passing only %d arguments in list." msgstr "" "Wraz z %s, używanie minimalnego poprawnego argument obliczenia %d nie ma " "sensu, gdy na liście jest tylko %d argumentów." #: src/language/expressions/parse.c:1193 #, c-format msgid "Type mismatch invoking %s as " msgstr "Niedopasowanie typu wywołania %s jako" #: src/language/expressions/parse.c:1198 msgid "Function invocation " msgstr "Funkcja wywołania" #: src/language/expressions/parse.c:1200 msgid " does not match any known function. Candidates are:" msgstr "nie pasuje do żadnej znanej funkcji: Kandydatami są:" #: src/language/expressions/parse.c:1230 #, c-format msgid "No function or vector named %s." msgstr "Brak funkcji lub wektorów o nazwie %s." #: src/language/expressions/parse.c:1292 #, c-format msgid "%s is a PSPP extension." msgstr "%s jest rozszerzeniem PSPP." #: src/language/expressions/parse.c:1295 #, c-format msgid "%s is not available in this version of PSPP." msgstr "%s nie jest dostepne w tej wersji PSPP." #: src/language/expressions/parse.c:1302 #, c-format msgid "%s may not appear after %s." msgstr "%s nie może pojawiać się bezpośrednio po %s." #: src/libpspp/ext-array.c:66 msgid "failed to create temporary file" msgstr "tworzenie pliku tymczasowego nie powiodło się" #: src/libpspp/ext-array.c:106 msgid "seeking in temporary file" msgstr "poszukiwanie w pliku tymczasowym" #: src/libpspp/ext-array.c:125 msgid "reading temporary file" msgstr "wczytywanie pliku tymczasowego" #: src/libpspp/ext-array.c:127 msgid "unexpected end of file reading temporary file" msgstr "nieoczekiwany koniec pliku podczas wczytywania pliku tymczasowego" #: src/libpspp/ext-array.c:147 msgid "writing to temporary file" msgstr "zapisywanie do pliku tymczasowego" #: src/libpspp/i18n.c:1128 msgid "Arabic" msgstr "Arabski" #: src/libpspp/i18n.c:1130 msgid "Armenian" msgstr "Armeński" #: src/libpspp/i18n.c:1131 msgid "Baltic" msgstr "Bałtycki" #: src/libpspp/i18n.c:1133 msgid "Celtic" msgstr "Celtycki" #: src/libpspp/i18n.c:1134 msgid "Central European" msgstr "Środkowoeuropejski" #: src/libpspp/i18n.c:1136 msgid "Chinese Simplified" msgstr "Chiński Uproszczony" #: src/libpspp/i18n.c:1138 msgid "Chinese Traditional" msgstr "Chiński Tradycyjny" #: src/libpspp/i18n.c:1140 msgid "Croatian" msgstr "Chorwacki" #: src/libpspp/i18n.c:1141 msgid "Cyrillic" msgstr "Cyrylica" #: src/libpspp/i18n.c:1143 msgid "Cyrillic/Russian" msgstr "Cyrylica/Rosyjski" #: src/libpspp/i18n.c:1144 msgid "Cyrillic/Ukrainian" msgstr "Cyrylica/Ukraiński" #: src/libpspp/i18n.c:1146 msgid "Georgian" msgstr "Gruziński" #: src/libpspp/i18n.c:1147 msgid "Greek" msgstr "Grecki" #: src/libpspp/i18n.c:1148 msgid "Gujarati" msgstr "Gujarati" #: src/libpspp/i18n.c:1149 msgid "Gurmukhi" msgstr "Gurmukhi" #: src/libpspp/i18n.c:1150 msgid "Hebrew" msgstr "Hebrajski" #: src/libpspp/i18n.c:1152 msgid "Hebrew Visual" msgstr "Hebrajski wizualny" #: src/libpspp/i18n.c:1153 msgid "Hindi" msgstr "Hinduski" #: src/libpspp/i18n.c:1154 msgid "Icelandic" msgstr "Islandzki" #: src/libpspp/i18n.c:1155 msgid "Japanese" msgstr "Japoński" #: src/libpspp/i18n.c:1157 msgid "Korean" msgstr "Koreański" #: src/libpspp/i18n.c:1159 msgid "Nordic" msgstr "Nordycki" #: src/libpspp/i18n.c:1160 msgid "Romanian" msgstr "Rumuński" #: src/libpspp/i18n.c:1162 msgid "South European" msgstr "Południowoeuropejski" #: src/libpspp/i18n.c:1163 msgid "Thai" msgstr "Tajski" #: src/libpspp/i18n.c:1165 msgid "Turkish" msgstr "Turecki" #: src/libpspp/i18n.c:1167 msgid "Vietnamese" msgstr "Wietnamski" #: src/libpspp/i18n.c:1169 msgid "Western European" msgstr "Zachodnioeuropejski" #: src/libpspp/message.c:89 #, c-format msgid "%s: %s" msgstr "%s: %s" #: src/libpspp/message.c:113 msgid "error" msgstr "błąd" #: src/libpspp/message.c:115 msgid "warning" msgstr "Ostrzeżenie" #: src/libpspp/message.c:118 msgid "note" msgstr "notka" #: src/libpspp/message.c:327 #, c-format msgid "Notes (%d) exceed limit (%d). Suppressing further notes." msgstr "Notatki (%d) przekraczają limit (%d). Tłumienie dalszych notatek." #: src/libpspp/message.c:335 #, c-format msgid "Warnings (%d) exceed limit (%d). Syntax processing will be halted." msgstr "Ostrzeżenia (%d) przekroczyły limit (%d). Operacje zatrzymane." #: src/libpspp/message.c:338 #, c-format msgid "Errors (%d) exceed limit (%d). Syntax processing will be halted." msgstr "Błędy (%d) przekroczyły limit (%d). Operacje zatrzymane." #: src/libpspp/zip-reader.c:202 #, fuzzy, c-format #| msgid "Corrupt file at 0x%llx: Expected %; got %" msgid "%s: corrupt archive at 0x%llx: expected %# but got %#" msgstr "Uszkodzony plik w 0x%llx: Oczekiwane %; otrzymano %" #: src/libpspp/zip-reader.c:329 src/libpspp/zip-reader.c:449 #, fuzzy, c-format #| msgid "%s: seek failed (%s)." msgid "%s: open failed (%s)" msgstr "%s: poszukiwanie zakończone niepowodzeniem (%s)." #: src/libpspp/zip-reader.c:344 #, fuzzy, c-format #| msgid "Cannot find central directory" msgid "%s: cannot find central directory" msgstr "Nie można odnaleźć katalogu centralnego." #: src/libpspp/zip-reader.c:353 src/libpspp/zip-reader.c:384 #: src/libpspp/zip-reader.c:468 #, fuzzy, c-format #| msgid "%s: seek failed (%s)." msgid "%s: seek failed (%s)" msgstr "%s: poszukiwanie zakończone niepowodzeniem (%s)." #: src/libpspp/zip-reader.c:441 #, fuzzy, c-format #| msgid "%s: unknown option `%s'" msgid "%s: unknown member \"%s\"" msgstr "%s: nieznana opcja `%s'" #: src/libpspp/zip-reader.c:503 #, fuzzy, c-format #| msgid "" #| "Name mismatch in zip archive. Central directory says `%s'; local file " #| "header says `%s'" msgid "" "%s: name mismatch between central directory (%s) and local file header (%s)" msgstr "" "Niedopasowanie nazwy w archiwum zip. Katalog centralny zakłada `%s'; " "nagłówek pliku lokalnego zakłada`%s' " #: src/libpspp/zip-reader.c:696 #, fuzzy, c-format #| msgid "Cannot initialize inflator: %s" msgid "%s: cannot initialize inflator (%s)" msgstr "Nie można uruchomić inflatora: %s" #: src/libpspp/zip-reader.c:751 #, fuzzy, c-format #| msgid "Error inflating: %s" msgid "%s: error inflating \"%s\" (%s)" msgstr "Błąd zawyżenia: %s" #: src/libpspp/zip-writer.c:97 utilities/pspp-convert.c:346 #, c-format msgid "%s: error opening output file" msgstr "%s: bład podczas otwierania pliku raportu" #: src/libpspp/zip-writer.c:169 #, c-format msgid "%s: error seeking in output file" msgstr "%s: błąd poszukiwania w pliku raportu" #: src/libpspp/zip-writer.c:210 msgid "error creating temporary file" msgstr "błąd podczas tworzenia pliku tymczasowego" #: src/libpspp/zip-writer.c:279 #, c-format msgid "%s: write failed" msgstr "%s: zapisywanie się nie powiodło" #. TRANSLATORS: This is a format string which, when presented to #. printf like functions, will create a pango markup string to #. display real number in scientific notation. #. #. In its untranslated form, it will display similar to "1.23 x 10^4". You #. can leave it untranslated if this is how scientific notation is usually #. presented in your language. #. #. Some locales (such as German) prefer the centered dot rather than the #. multiplication sign between the mantissa an exponent. In which #. case, you can change "#215;" to "#8901;" or other unicode code #. point as appropriate. #. #. The . in this string does not and should not be changed, since #. that is taken care of by the stdc library. #. #. For information on Pango markup, see #. http://developer.gnome.org/pango/stable/PangoMarkupFormat.html #. #. For tables of unicode code points, see http://unicode.org/charts #. #: src/math/chart-geometry.c:123 #, c-format msgid "%%.%dlf×10%d" msgstr "" #: src/math/histogram.c:145 msgid "" "Not creating histogram because the data contains less than 2 distinct values" msgstr "" "Nie można utworzyć histogramu, poniewaz dane zwierają mniej niż 2 różne " "wartości" #: src/math/percentiles.c:36 msgid "HAverage" msgstr "Średnia harmoniczna" #: src/math/percentiles.c:38 msgid "Rounded" msgstr "Zaokrąglone" #: src/math/percentiles.c:39 msgid "Empirical" msgstr "Empiryczna" #: src/math/percentiles.c:40 msgid "Empirical with averaging" msgstr "Empiryczna z uśrednieniem" #: src/math/shapiro-wilk.c:84 msgid "" "One or more weight values are non-integer. Fractional parts will be ignored " "when calculating the Shapiro-Wilk statistic." msgstr "" #: src/output/ascii.c:340 #, c-format msgid "ascii: opening output file `%s'" msgstr "ascii: otwieranie pliku raportu `%s'" #: src/output/ascii.c:371 #, c-format msgid "%s: %s must be positive integer or `auto'" msgstr "%s: %s musi być całkowitą liczbą dodatnią lub `auto'" #: src/output/ascii.c:393 #, fuzzy, c-format #| msgid "" #| "ascii: page excluding margins and headers must be at least %d characters " #| "wide by %d lines long, but as configured is only %d characters by %d lines" msgid "" "ascii: page must be at least %d characters wide, but as configured is only " "%d characters" msgstr "" "ascii: strona wykluczająca marginesy i nagłówki musi być przynajmniej %d " "znaków szeroka przez %d linii długa, ale obecnie posiada jedynei %d znaków " "przez %d linii." #: src/output/ascii.c:508 #, c-format msgid "See %s for a chart." msgstr "Zobacz %s po wykres." #: src/output/charts/piechart.c:54 msgid "*MISSING*" msgstr "" #: src/output/csv.c:100 src/output/html.c:117 src/output/journal.c:166 #: src/output/msglog.c:68 #, c-format msgid "error opening output file `%s'" msgstr "błąd otwierania pliku raportu `%s'" #: src/output/driver.c:522 #, c-format msgid "%s is not a valid device type (the choices are `%s' and `%s')" msgstr "%s nie jest odpowiednim typem urządzenia (opcje to `%s' i `%s')" #: src/output/driver.c:536 #, c-format msgid "%s: unknown option `%s'" msgstr "%s: nieznana opcja `%s'" #: src/output/driver.c:553 #, c-format msgid "%s: output option missing `='" msgstr "%s: brakująca opcja raportu `='" #: src/output/driver.c:560 #, c-format msgid "%s: output option specified more than once" msgstr "%s: opcja raportu określona więcej niż jeden raz" #: src/output/html.c:129 msgid "PSPP Output" msgstr "Raport PSPP" #: src/output/html.c:266 msgid "No description" msgstr "Brak opisu" #: src/output/journal.c:69 #, c-format msgid "error writing output file `%s'" msgstr "błąd zapisywania pliku raportu `%s'" #: src/output/measure.c:68 #, c-format msgid "`%s' is not a valid length." msgstr "`%s' nie jest odpowiednią długością." #: src/output/measure.c:96 #, c-format msgid "syntax error in paper size `%s'" msgstr "błąd syntazu w wielkości papieru `%s'" #: src/output/measure.c:233 #, c-format msgid "unknown paper type `%.*s'" msgstr "nieznany typ papieru `%.*s'" #: src/output/measure.c:251 #, c-format msgid "error opening input file `%s'" msgstr "błąd otwierania pliku wejścia `%s'" #: src/output/measure.c:279 #, fuzzy, c-format #| msgid "paper size file `%s' does not state a paper size" msgid "file `%s' does not state a paper size" msgstr "plik wielkości papieru `%s' nie określa wielkości papieru" #: src/output/options.c:112 #, c-format msgid "%s: `%s' is `%s' but a Boolean value is required" msgstr "%s: `%s' jest `%s' ale wymagana jest wartość logiczna" #: src/output/options.c:187 #, c-format msgid "%s: `%s' is `%s' but one of the following is required: %s" msgstr "%s: `%s' jest `%s' ale jedna z nich jest wymagana: %s" #: src/output/options.c:231 #, fuzzy, c-format #| msgid "%s: `%s' is `%s' but a nonnegative integer is required" msgid "%s: `%s' is `%s' but a non-negative integer is required" msgstr "%s: `%s' jest `%s' ale wymagana jest nieujemna liczba całkowita" #: src/output/options.c:235 #, c-format msgid "%s: `%s' is `%s' but a positive integer is required" msgstr "%s: `%s' jest `%s' ale wymagana jest dodatnia liczba całkowita" #: src/output/options.c:238 #, c-format msgid "%s: `%s' is `%s' but an integer is required" msgstr "%s: `%s' jest `%s' ale wymagana jest liczba całkowita" #: src/output/options.c:241 #, c-format msgid "%s: `%s' is `%s' but an integer greater than %d is required" msgstr "%s: `%s' jest `%s' ale wymagana jest liczba całkowita większa niż %d" #: src/output/options.c:246 #, c-format msgid "%s: `%s' is `%s' but an integer between %d and %d is required" msgstr "%s: `%s' jest `%s' ale wymagana jest liczba całkowita pomiędzy %d i %d" #: src/output/options.c:325 #, c-format msgid "%s: `%s' is `%s' but a file name that contains `#' is required." msgstr "%s: `%s' jest `%s' ale w nazwie pliku wymagany jest znak `#' " #. TRANSLATORS: Do not translate this string. If the script of your language #. reads from right to left (eg Persian, Arabic, Hebrew etc), then replace #. this string with "output-direction-rtl". Otherwise either leave it #. untranslated or copy it verbatim. #: src/output/render.c:994 msgid "output-direction-ltr" msgstr "" #: src/output/text-item.c:44 msgid "Page Title" msgstr "" #: src/output/text-item.c:47 msgid "Title" msgstr "" #: src/output/text-item.c:51 msgid "Log" msgstr "" #: src/output/text-item.c:54 msgid "Page Break" msgstr "" #: src/output/cairo.c:520 #, c-format msgid "`%s': bad font specification" msgstr "`%s': zła specyfikacja czcionki" #: src/output/cairo.c:744 #, c-format msgid "" "The defined page is not wide enough to hold at least %d characters in the " "default font. In fact, there's only room for %d characters." msgstr "" "Zdefiniowana strona nie jest dostaecznie długa, aby pomieścić przynajmniej " "%d znaków domyślnej czcionki. Znajduje siętu miejsce jedynie na %d znaków." #: src/output/cairo.c:752 #, c-format msgid "" "The defined page is not long enough to hold at least %d lines in the default " "font. In fact, there's only room for %d lines." msgstr "" "Zdefiniowana strona nie jest dostatecznie długa, aby pomieścić %d linii " "domyślnej czcionki. Znajduje się tu miejsce jedynie dla %d linii." #: src/output/cairo.c:837 #, c-format msgid "error opening output file `%s': %s" msgstr "błąd otwierania pliku raportu `%s': %s" #: src/output/cairo.c:892 #, c-format msgid "error drawing output for %s driver: %s" msgstr "Błąd pisania raportu na %s driver: %s" #: src/output/cairo.c:2056 #, c-format msgid "error writing output file `%s': %s" msgstr "błąd zapisywania pliku raportu `%s': %s" #: src/output/charts/np-plot-cairo.c:37 #, c-format msgid "Normal Q-Q Plot of %s" msgstr "Normalny wykres Q-Q %s" #: src/output/charts/np-plot-cairo.c:38 src/output/charts/np-plot-cairo.c:68 msgid "Observed Value" msgstr "Obserwowana wartość" #: src/output/charts/np-plot-cairo.c:39 msgid "Expected Normal" msgstr "Oczekiwana norma" #: src/output/charts/np-plot-cairo.c:67 #, c-format msgid "Detrended Normal Q-Q Plot of %s" msgstr "Detrendowany normalny wykres Q-Q %s" #: src/output/charts/np-plot-cairo.c:69 msgid "Dev from Normal" msgstr "Odchylenie od normy" #: src/output/charts/barchart-cairo.c:65 msgid "Bar Chart" msgstr "" #: src/output/charts/plot-hist-cairo.c:43 #, c-format msgid "N = %.2f" msgstr "N = %.2f" #: src/output/charts/plot-hist-cairo.c:52 #, c-format msgid "Mean = %.1f" msgstr "Średnia - %.1f" #: src/output/charts/plot-hist-cairo.c:61 #, c-format msgid "Std. Dev = %.2f" msgstr "Odchylenie standardowe - %.2f" #: src/output/charts/plot-hist-cairo.c:110 msgid "HISTOGRAM" msgstr "Histogram" #: src/output/charts/roc-chart-cairo.c:36 src/ui/gui/roc.ui:24 msgid "ROC Curve" msgstr "Krzywa ROC" #: src/output/charts/scree-cairo.c:36 msgid "Scree Plot" msgstr "Wykres osypiska" #: src/output/charts/scree-cairo.c:38 msgid "Eigenvalue" msgstr "Wartość własna" #: src/output/charts/spreadlevel-cairo.c:37 #, c-format msgid "Spread vs. Level Plot of %s" msgstr "Rozpiętosć vs. poziom wykresu %s" #: src/output/charts/spreadlevel-cairo.c:38 msgid "Level" msgstr "Poziom" #: src/output/charts/spreadlevel-cairo.c:39 msgid "Spread" msgstr "Rozpiętość" #: src/output/charts/scatterplot-cairo.c:57 #, c-format msgid "Scatterplot %s" msgstr "" #: src/output/spv/spv-legacy-decoder.c:2222 msgid "Table lacks cell data." msgstr "" #: src/output/spv/spv-writer.c:68 #, fuzzy, c-format #| msgid "%s: write failed" msgid "%s: create failed" msgstr "%s: zapisywanie się nie powiodło" #: src/output/spv/spv-writer.c:89 #, fuzzy #| msgid "%s: error writing output file" msgid "I/O error writing SPV file" msgstr "%s: błąd zapisywania pliku raportu" #: src/output/spv/spv.c:693 #, fuzzy, c-format #| msgid "failed to create temporary file" msgid "%s: Failed to create XML parser" msgstr "tworzenie pliku tymczasowego nie powiodło się" #: src/output/spv/spv.c:718 #, c-format msgid "%s: document is not well-formed" msgstr "" #: src/output/spv/spv.c:726 #, c-format msgid "%s: root node is \"%s\" but \"%s\" was expected" msgstr "" #: src/ui/gui/psppire-acr.c:273 msgid "Add" msgstr "" #: src/ui/gui/psppire-acr.c:274 #, fuzzy #| msgid "_Edit" msgid "Edit" msgstr "_Edytuj" #: src/ui/gui/psppire-acr.c:275 msgid "Remove" msgstr "" #: src/ui/gui/psppire-buttonbox.c:311 msgid "OK" msgstr "" #: src/ui/gui/psppire-buttonbox.c:319 msgid "Go To" msgstr "" #: src/ui/gui/psppire-buttonbox.c:327 msgid "Continue" msgstr "Kontynuuj" #: src/ui/gui/psppire-buttonbox.c:339 src/ui/gui/psppire-import-assistant.c:759 msgid "Paste" msgstr "" #: src/ui/gui/psppire-buttonbox.c:345 #: src/ui/gui/psppire-dialog-action-aggregate.c:216 #: src/ui/gui/psppire-data-window.c:496 src/ui/gui/psppire-data-window.c:624 #: src/ui/gui/psppire-output-window.c:353 #: src/ui/gui/psppire-syntax-window.c:594 src/ui/gui/psppire-window.c:445 #: src/ui/gui/psppire-window.c:628 #, fuzzy #| msgid "Covariance" msgid "Cancel" msgstr "Kowariancja" #: src/ui/gui/psppire-buttonbox.c:351 msgid "Close" msgstr "" #: src/ui/gui/psppire-buttonbox.c:358 src/ui/gui/psppire-import-assistant.c:760 #, fuzzy #| msgid "_Reset" msgid "Reset" msgstr "_Resetuj" #: src/ui/gui/psppire-buttonbox.c:365 #, fuzzy #| msgid "_Help" msgid "Help" msgstr "_Pomoc" #: src/ui/gui/psppire-dialog-action-aggregate.c:213 msgid "Aggregate destination file" msgstr "Agreguj plik docelowy" #: src/ui/gui/psppire-dialog-action-aggregate.c:217 #: src/ui/gui/psppire-data-window.c:493 src/ui/gui/psppire-data-window.c:497 #: src/ui/gui/psppire-output-window.c:354 #: src/ui/gui/psppire-syntax-window.c:595 src/ui/gui/psppire-window.c:449 #: src/ui/gui/aggregate.ui:565 msgid "Save" msgstr "Zapisz" #: src/ui/gui/psppire-dialog-action-aggregate.c:226 #: src/ui/gui/psppire-data-window.c:503 msgid "System Files (*.sav)" msgstr "Pliki systemowe (*.sav)" #: src/ui/gui/psppire-dialog-action-aggregate.c:231 #: src/ui/gui/psppire-data-window.c:508 msgid "Compressed System Files (*.zsav)" msgstr "Skompresowane pliki systemowe (*.zsav)" #: src/ui/gui/psppire-dialog-action-aggregate.c:236 #: src/ui/gui/psppire-data-window.c:513 src/ui/gui/psppire-window.c:652 msgid "Portable Files (*.por) " msgstr "Pliki przenośne (*.por)" #: src/ui/gui/psppire-dialog-action-autorecode.c:337 #: src/ui/gui/psppire-dialog-action-recode.c:535 #: src/ui/gui/psppire-dialog-action-recode-different.c:288 msgid "New" msgstr "Wynikowa" #: src/ui/gui/psppire-dialog-action-autorecode.c:351 #: src/ui/gui/psppire-dialog-action-recode.c:527 #: src/ui/gui/psppire-dialog-action-recode-different.c:301 msgid "Old" msgstr "Źródłowa" #: src/ui/gui/psppire-dialog-action-comments.c:142 #, c-format msgid "Column Number: %d" msgstr "Numer kolumny: %d" #: src/ui/gui/psppire-dialog-action-crosstabs.c:71 msgid "Chisq" msgstr "Chi-kwadrat" #: src/ui/gui/psppire-dialog-action-crosstabs.c:71 msgid "" "Pearson chi-square, likelihood ratio, Fisher’s exact test, continuity " "correction, linear-by-linear association." msgstr "" #: src/ui/gui/psppire-dialog-action-crosstabs.c:74 #: src/language/stats/crosstabs.q:1334 msgid "Phi" msgstr "Phi" #: src/ui/gui/psppire-dialog-action-crosstabs.c:75 msgid "CC" msgstr "Współczynnik kontyngencji" #: src/ui/gui/psppire-dialog-action-crosstabs.c:75 #, fuzzy #| msgid "Contingency Coefficient" msgid "Contingency coefficient" msgstr "Współczynnik kontyngencji" #: src/ui/gui/psppire-dialog-action-crosstabs.c:77 msgid "UC" msgstr "Współczynnik niepewności" #: src/ui/gui/psppire-dialog-action-crosstabs.c:77 #, fuzzy #| msgid "Uncertainty Coefficient" msgid "Uncertainty coefficient" msgstr "Współczynnik niepewności" #: src/ui/gui/psppire-dialog-action-crosstabs.c:78 msgid "BTau" msgstr "tau-b Kendalla" #: src/ui/gui/psppire-dialog-action-crosstabs.c:78 #, fuzzy #| msgid "Kendall's tau-b" msgid "Kendall's Tau-b" msgstr "tau-b Kendalla" #: src/ui/gui/psppire-dialog-action-crosstabs.c:79 msgid "CTau" msgstr "tau-c Kendalla" #: src/ui/gui/psppire-dialog-action-crosstabs.c:79 #, fuzzy #| msgid "Kendall's tau-c" msgid "Kendall's Tau-c" msgstr "tau-c Kendalla" #: src/ui/gui/psppire-dialog-action-crosstabs.c:80 msgid "Risk" msgstr "Ryzyko względne" #: src/ui/gui/psppire-dialog-action-crosstabs.c:80 #, fuzzy #| msgid "Risk estimate." msgid "Relative Risk estimate" msgstr "Współczynnik ryzyka." #: src/ui/gui/psppire-dialog-action-crosstabs.c:81 #: src/language/stats/crosstabs.q:1338 msgid "Gamma" msgstr "Gamma" #: src/ui/gui/psppire-dialog-action-crosstabs.c:82 msgid "D" msgstr "d Sommersa" #: src/ui/gui/psppire-dialog-action-crosstabs.c:82 #, fuzzy #| msgid "Somers' d" msgid "Somer's d" msgstr "d Somersa" #: src/ui/gui/psppire-dialog-action-crosstabs.c:83 #: src/language/stats/crosstabs.q:1344 msgid "Kappa" msgstr "Kappa" #: src/ui/gui/psppire-dialog-action-crosstabs.c:83 msgid "Cohen's Kappa" msgstr "" #: src/ui/gui/psppire-dialog-action-crosstabs.c:84 #: src/language/stats/crosstabs.q:1429 msgid "Eta" msgstr "Eta" #: src/ui/gui/psppire-dialog-action-crosstabs.c:85 msgid "Corr" msgstr "Korelacje" #: src/ui/gui/psppire-dialog-action-crosstabs.c:85 #, fuzzy #| msgid "Spearman Correlation" msgid "Spearman correlation, Pearson's r" msgstr "Korelacja Spearmana" #: src/ui/gui/psppire-dialog-action-crosstabs.c:90 #, fuzzy #| msgid "Frequency" msgid "Frequency Count" msgstr "Częstość" #: src/ui/gui/psppire-dialog-action-crosstabs.c:91 msgid "Row" msgstr "Wiersz" #: src/ui/gui/psppire-dialog-action-crosstabs.c:91 #, fuzzy #| msgid "Percent" msgid "Row percent" msgstr "Procent" #: src/ui/gui/psppire-dialog-action-crosstabs.c:92 msgid "Column" msgstr "Kolumna" #: src/ui/gui/psppire-dialog-action-crosstabs.c:92 #, fuzzy #| msgid "Cum Percent" msgid "Column percent" msgstr "Procent skumulowany" #: src/ui/gui/psppire-dialog-action-crosstabs.c:93 #, fuzzy #| msgid "Valid Percent" msgid "Total percent" msgstr "Procent ważnych" #: src/ui/gui/psppire-dialog-action-crosstabs.c:94 #: src/language/stats/crosstabs.q:1266 msgid "Expected" msgstr "Oczekiwana" #: src/ui/gui/psppire-dialog-action-crosstabs.c:94 #, fuzzy #| msgid "Expected Values:" msgid "Expected value" msgstr "Wartości oczekiwane:" #: src/ui/gui/psppire-dialog-action-crosstabs.c:96 #: src/language/stats/crosstabs.q:1268 msgid "Std. Residual" msgstr "Reszta standaryzowana" #: src/ui/gui/psppire-dialog-action-crosstabs.c:96 #, fuzzy #| msgid "Std. Residual" msgid "Standardized Residual" msgstr "Reszta standaryzowana" #: src/ui/gui/psppire-dialog-action-crosstabs.c:97 msgid "Adjusted Std. Residual" msgstr "Reszta skorygowana" #: src/ui/gui/psppire-dialog-action-descriptives.c:45 msgid "Standard error" msgstr "Błąd standardowy" #: src/ui/gui/psppire-dialog-action-descriptives.c:45 #, fuzzy #| msgid "Standard error of the mean" msgid "Standard error of mean" msgstr "Bład standardowy średniej" #: src/ui/gui/psppire-dialog-action-descriptives.c:47 #, fuzzy #| msgid "Standard error of the kurtosis" msgid "Kurtosis and standard error of kurtosis" msgstr "Błąd standardowy kurtozy" #: src/ui/gui/psppire-dialog-action-descriptives.c:48 #, fuzzy #| msgid "Standard error of the skewness" msgid "Skewness and standard error of skewness" msgstr "Błąd standardowy skośności" #: src/ui/gui/psppire-dialog-action-factor.c:323 #, c-format msgid "_Eigenvalues over %4.2f times the mean eigenvalue" msgstr "_Wartości własne ponad %4.2f razy średnia wartość własna" #: src/ui/gui/psppire-dialog-action-frequencies.c:44 msgid "Standard error of the mean" msgstr "Bład standardowy średniej" #: src/ui/gui/psppire-dialog-action-frequencies.c:47 msgid "Standard error of the skewness" msgstr "Błąd standardowy skośności" #: src/ui/gui/psppire-dialog-action-frequencies.c:51 msgid "Standard error of the kurtosis" msgstr "Błąd standardowy kurtozy" #: src/ui/gui/psppire-dialog-action-oneway.c:175 #, c-format msgid "Contrast %d of %d" msgstr "Kontrast %d z %d" #: src/ui/gui/psppire-dialog-action-paired.c:162 src/ui/gui/examine.ui:282 #: src/ui/gui/indep-samples.ui:334 src/ui/gui/t-test.ui:296 msgid "O_ptions..." msgstr "O_pcje..." #: src/ui/gui/psppire-dialog-action-paired.c:168 msgid "Paired Samples T Test" msgstr "Test t dla prób zależnych" #: src/ui/gui/psppire-dialog-action-recode-different.c:327 msgid "Recode into Different Variables" msgstr "Rekoduj na nowe zmienne" #: src/ui/gui/psppire-dialog-action-recode-different.c:330 msgid "Recode into Different Variables: Old and New Values " msgstr "Rekoduj na nowe zmienne: stare i nowe wartości" #: src/ui/gui/psppire-dialog-action-recode-same.c:108 src/ui/gui/recode.ui:391 msgid "Recode into Same Variables" msgstr "Rekoduj na te same zmienne" #: src/ui/gui/psppire-dialog-action-recode-same.c:114 msgid "Recode into Same Variables: Old and New Values" msgstr "Rekoduj na te same zmienne: stare i nowe wartości" #: src/ui/gui/psppire-dialog-action-regression.c:40 msgid "Coeff" msgstr "Oszacowania" #: src/ui/gui/psppire-dialog-action-regression.c:40 msgid "Show the regression coefficients" msgstr "Pokaż współczynniki regresji" #: src/ui/gui/psppire-dialog-action-regression.c:41 msgid "Conf. Interval" msgstr "Przedział ufności" #: src/ui/gui/psppire-dialog-action-regression.c:41 msgid "Show the confidence interval for the regression coefficients" msgstr "Pokaż przedziały ufności dla współczynników regresji." #: src/ui/gui/psppire-dialog-action-regression.c:42 msgid "Show the correlation between observed and predicted values" msgstr "Pokaż korelację pomiędzy wartościami obserwowanymi a oczekiwanymi." #: src/ui/gui/psppire-dialog-action-regression.c:43 msgid "Anova" msgstr "Anova" #: src/ui/gui/psppire-dialog-action-regression.c:43 msgid "Show the analysis of variance table" msgstr "Pokaż tabelę analizy wariancji" #: src/ui/gui/psppire-dialog-action-regression.c:44 msgid "Bcov" msgstr "Bcov" #: src/ui/gui/psppire-dialog-action-regression.c:44 msgid "Show the variance coefficient matrix" msgstr "Pokaż macierz współczynników wariancji" #: src/ui/gui/psppire-dialog-action-regression.c:45 #, fuzzy #| msgid "Total" msgid "Tol" msgstr "Suma" #: src/ui/gui/psppire-dialog-action-regression.c:45 #, fuzzy #| msgid "Show the variance coefficient matrix" msgid "Show the variance inflation factor and its reciprocal" msgstr "Pokaż macierz współczynników wariancji" #: src/ui/gui/psppire-dialog-action-select.c:88 #, c-format msgid "Approximately %3d%% of all cases." msgstr "Około %3d%% wszystkich obserwacji." #: src/ui/gui/psppire-dialog-action-select.c:89 #, c-format msgid "Exactly %3d cases from the first %3d cases." msgstr "Dokładnie %3d obserwacji z pierwszych %3d obserwacji." #: src/ui/gui/psppire-dialog-action-select.c:236 #, c-format msgid "%d thru %d" msgstr "%d poprzez %d" #: src/ui/gui/psppire-dialog-action-two-sample.c:180 #: src/ui/gui/k-independent.ui:404 src/ui/gui/k-related.ui:197 msgid "Test Type" msgstr "Typ testu" #: src/ui/gui/psppire-dialog-action-two-sample.c:189 msgid "_Wilcoxon" msgstr "_Wilcoxon" #: src/ui/gui/psppire-dialog-action-two-sample.c:190 msgid "_Sign" msgstr "_Test znaków" #: src/ui/gui/psppire-dialog-action-two-sample.c:191 msgid "_McNemar" msgstr "_McNemar" #: src/ui/gui/psppire-dialog-action-two-sample.c:209 msgid "Two-Related-Samples Tests" msgstr "Testy dla dwóch prób zależnych" #: src/ui/gui/psppire-dialog-action-weight.c:74 src/ui/gui/weight.ui:83 #: src/ui/gui/weight.ui:211 msgid "Do not weight cases" msgstr "Nie waż obserwacji" #: src/ui/gui/psppire-dialog-action-weight.c:80 #, c-format msgid "Weight cases by %s" msgstr "Zważ obserwacje według %s" #: src/ui/gui/psppire-dict.c:95 #, fuzzy #| msgid "Var%d" msgid "Var" msgstr "Var%d" #. TRANSLATORS: This string must be a valid variable name. That means: #. - The string must be at most 64 bytes (not characters) long. #. - The string may not contain whitespace. #. - The first character may not be '$' #. - The first character may not be a digit #. - The final character may not be '.' or '_' #. #: src/ui/gui/psppire-dict.c:385 #, c-format msgid "Var%04d" msgstr "Var%04d" #: src/ui/gui/psppire-dict.c:566 msgid "Duplicate variable name." msgstr "Duplikuj nazwę zmiennej." #: src/ui/gui/psppire-dictview.c:617 msgid "Prefer variable labels" msgstr "Używaj etykiet zmiennych" #: src/ui/gui/psppire-dictview.c:631 msgid "Default sort order" msgstr "" #: src/ui/gui/psppire-dictview.c:637 msgid "Unsorted (dictionary order)" msgstr "Nieposortowane (kolejność alfabetyczna)" #: src/ui/gui/psppire-dictview.c:642 msgid "Sort by name" msgstr "Sortuj według nazwy" #: src/ui/gui/psppire-dictview.c:647 msgid "Sort by label" msgstr "Sortuj według etykiety" #: src/ui/gui/psppire-means-layer.c:95 #, c-format msgid "Layer %d of %d" msgstr "Warstwa %d z %d" #: src/ui/gui/psppire-means-layer.c:169 msgid "Forward" msgstr "" #: src/ui/gui/psppire-means-layer.c:170 msgid "Back" msgstr "" #: src/ui/gui/psppire-text-file.c:55 #, c-format msgid "Could not open `%s'" msgstr "Nie można otworzyć `%s'" #: src/ui/gui/psppire-text-file.c:71 #, c-format msgid "Error reading `%s': %s" msgstr "Błąd wczytywania `%s': %s" #: src/ui/gui/psppire-text-file.c:74 #, c-format msgid "" "Failed to read `%s', because it contains a line over %d bytes long and " "therefore appears not to be a text file." msgstr "" "Nie udało się wczytać `%s', ponieważ zawiera linie ponad %d bitów i z tego " "powodu nie wydaje się być plikiem tekstowym." #: src/ui/gui/psppire-text-file.c:96 #, c-format msgid "`%s' is empty." msgstr "`%s' jest pusty" #: src/ui/gui/psppire-val-chooser.c:255 msgid "through" msgstr "do" #: src/ui/gui/psppire-val-chooser.c:288 msgid "_Value:" msgstr "_Wartość:" #: src/ui/gui/psppire-val-chooser.c:289 msgid "_System Missing" msgstr "_Systemowy brak danych" #: src/ui/gui/psppire-val-chooser.c:290 msgid "System _or User Missing" msgstr "Systemowy lub _zdefiniowany brak danych" #: src/ui/gui/psppire-val-chooser.c:291 msgid "_Range:" msgstr "_Zakres:" #: src/ui/gui/psppire-val-chooser.c:292 msgid "Range, _LOWEST thru value" msgstr "Zakres wartości, od _najmniejszej do podanej" #: src/ui/gui/psppire-val-chooser.c:293 msgid "Range, value thru _HIGHEST" msgstr "Zakres wartości, od podanej do _największej" #: src/ui/gui/psppire-val-chooser.c:294 msgid "_All other values" msgstr "_Wszystkie pozostałe wartości" #: src/ui/gui/psppire-var-view.c:153 #, c-format msgid "Var%d" msgstr "Var%d" #: src/ui/source-init-opts.c:72 #, c-format msgid "Algorithm must be either `%s' or `%s'." msgstr "Algorytm musi być albo `%s' albo `%s'." #: src/ui/source-init-opts.c:97 #, c-format msgid "Syntax must be either `%s' or `%s'." msgstr "Syntax musi być albo `%s' albo `%s'." #: src/ui/terminal/main.c:144 msgid "Error encountered while ERROR=STOP is effective." msgstr "Błąd napotkany podczas ERROR=STOP jest efektywny." #: src/ui/terminal/main.c:150 msgid "" "Stopping syntax file processing here to avoid a cascade of dependent command " "failures." msgstr "" "Zatrzymywanie pliku syntaxu w celu uniknięcia kaskady zależnych niepowodzeń " "komend." #: src/ui/terminal/terminal-opts.c:147 #, c-format msgid "" "PSPP, a program for statistical analysis of sampled data.\n" "Usage: %s [OPTION]... FILE...\n" "\n" "Arguments to long options also apply to equivalent short options.\n" "\n" "Output options:\n" " -o, --output=FILE output to FILE, default format from FILE's name\n" " -O format=FORMAT override format for previous -o\n" " -O OPTION=VALUE set output option to customize previous -o\n" " -O device={terminal|listing} override device type for previous -o\n" " -e, --error-file=FILE append errors, warnings, and notes to FILE\n" " --no-output disable default output driver\n" "Supported output formats: %s\n" "\n" "Language options:\n" " -I, --include=DIR append DIR to search path\n" " -I-, --no-include clear search path\n" " -r, --no-statrc disable running rc file at startup\n" " -a, --algorithm={compatible|enhanced}\n" " set to `compatible' if you want output\n" " calculated from broken algorithms\n" " -x, --syntax={compatible|enhanced}\n" " set to `compatible' to disable PSPP extensions\n" " -b, --batch interpret syntax in batch mode\n" " -i, --interactive interpret syntax in interactive mode\n" " --syntax-encoding=ENCODING specify encoding for syntax files\n" " -s, --safer don't allow some unsafe operations\n" "Default search path: %s\n" "\n" "Informative output:\n" " -h, --help display this help and exit\n" " -V, --version output version information and exit\n" "\n" "Non-option arguments are interpreted as syntax files to execute.\n" msgstr "" "PSPP, program służący analizie danych.\n" "Zastosowanie: %s[OPTION]...FILE...\n" "\n" "Argumenty w długich formach posiadają również skrócone wersje.\n" "\n" "Opcje raportu:\n" "-o, --output=FILE raport do FILE, domyślny format z nazwy FILE's\n" " -O format=FORMAT nadpisz format do poprzedniego -o\n" " -O OPTION=VALUE ustaw opcje raportu, aby ustawić poprzednie -o\n" " -O device={terminal|listing} nadpisy tzp sprytu dla popryedniego -o\n" " -e, --error-file=FILE dodaj błędy, ostrzeżenia i notatki do FILE\n" " --no-output zablokuj sterownik opcji domyślnych\n" "Obsługiwane formaty raportu: %s\n" "\n" "Opcje językowe:\n" " -I, --include=DIR dodaj DIR do ścieżki szukania\n" " -I-, --no-include wyczyść ścieżkę szukania\n" " -r, --no-statrc uniemożliwia uruchomienie pliku rc przy starcie\n" " -a, --algorithm={compatible|enhanced}\n" " set to `compatible' if you want output\n" " obliczanie z blokowanych algorytmów\n" " -x, --syntax={compatible|enhanced}\n" " ustawione na `compatible' aby zablokować " "rozszerzenia PSPP\n" " -b, --batch interpretuj syntax w trybie wsadowym\n" " -i, --interactive interpretuj syntax w trybie interaktywnym\n" " --syntax-encoding=ENCODING określ kodowanie dla plików syntaxu\n" " -s, --safer nie zezwala na wykonywanie niektórych " "niebezpiecznych operacji\n" "Domyślna ścieżka szukania: %s\n" "\n" "Raport informacji:\n" " -h, --help wyświetla pomoc i wyjście\n" " -V, --version informacje o wersji raportu i wyjście\n" "\n" "Argumenty nie przeznaczone jako opcja są interpretowane jako pliki " "wykonawcze syntaxu.\n" #: src/ui/gui/find-dialog.c:197 #, fuzzy #| msgid "_Find..." msgid "Find" msgstr "_Znajdź..." #: src/ui/gui/find-dialog.c:662 #, c-format msgid "Bad regular expression: %s" msgstr "Złe wyrażenie: %s" #: src/ui/gui/help-menu.c:70 msgid "A program for the analysis of sampled data" msgstr "Program do analizy danych" #. TRANSLATORS: Do not translate this string. Instead, put the names of the people #. who have helped in the translation. #: src/ui/gui/help-menu.c:80 msgid "translator-credits" msgstr "Marta Maćkiewicz, Dominika Karaś, Patrycja Wyszyńska, Ewa Skimina" #: src/ui/gui/help-menu.c:170 #, c-format msgid "Help path conversion error: %s" msgstr "" #: src/ui/gui/help-menu.c:197 #, fuzzy, c-format #| msgid "" #| "Cannot open reference manual: %s. The PSPP user manual is also available " #| "at %s" msgid "" "Cannot open via html: %s with uri: %s The PSSP manual is also available at %s" msgstr "" "Nie można otworzyć instrukcji obsługi: %s. Instrukcja obsługi PSPP dostępna " "jest również na %s" #: src/ui/gui/help-menu.c:218 msgid "_Help" msgstr "_Pomoc" #: src/ui/gui/help-menu.c:221 msgid "_About" msgstr "" #: src/ui/gui/help-menu.c:222 msgid "_Reference Manual" msgstr "_Instrukcja obsługi" #: src/ui/gui/main.c:306 msgid "Show version information and exit" msgstr "" #: src/ui/gui/main.c:409 msgid "Do not display the splash screen" msgstr "" #: src/ui/gui/main.c:411 msgid "Do not attempt single instance negotiation" msgstr "" #: src/ui/gui/missing-val-dialog.c:217 msgid "" "The maximum length of a missing value for a string variable is 8 in UTF-8." msgstr "" #: src/ui/gui/missing-val-dialog.c:268 #, fuzzy #| msgid "At least one variable must be specified." msgid "At least one value must be specified" msgstr "Przynajmniej jedna zmienna musi być określona." #: src/ui/gui/missing-val-dialog.c:298 msgid "Incorrect range specification" msgstr "Nieprawidłowa specyfikacja zakresu" #: src/ui/gui/psppire-data-editor.c:380 #, fuzzy, c-format #| msgid "%s: %s" msgid "%d : %s" msgstr "%s: %s" #: src/ui/gui/psppire-data-editor.c:391 #, c-format msgid "%'d case" msgid_plural "%'d cases" msgstr[0] "%'d obserwacji" msgstr[1] "%'d obserwacji" msgstr[2] "%'d obserwacji" #: src/ui/gui/psppire-data-editor.c:396 #, c-format msgid "%'d variable" msgid_plural "%'d variables" msgstr[0] "%'d zmiennych" msgstr[1] "%'d zmiennych" msgstr[2] "%'d zmiennych" #: src/ui/gui/psppire-data-editor.c:485 msgid "Case" msgstr "Lp." #: src/ui/gui/psppire-data-editor.c:495 msgid "Data View" msgstr "Dane" #: src/ui/gui/psppire-data-editor.c:505 msgid "Variable View" msgstr "Zmienne" #: src/ui/gui/psppire-data-sheet.c:171 src/ui/gui/psppire-data-window.c:1338 #, fuzzy #| msgid "Insert Case" msgid "_Insert Case" msgstr "Wstaw obserwacje" #: src/ui/gui/psppire-data-sheet.c:179 src/ui/gui/psppire-data-window.c:1391 #, fuzzy #| msgid "_Clear Cases" msgid "Cl_ear Cases" msgstr "_Wyczyść" #: src/ui/gui/psppire-data-sheet.c:305 src/ui/gui/psppire-data-window.c:1337 #: src/ui/gui/psppire-variable-sheet.c:274 #, fuzzy #| msgid "Insert Variable" msgid "_Insert Variable" msgstr "Wstaw zmienną" #: src/ui/gui/psppire-data-sheet.c:314 src/ui/gui/psppire-variable-sheet.c:283 msgid "Cl_ear Variables" msgstr "Wy_czyść zmienne" #: src/ui/gui/psppire-data-sheet.c:326 msgid "Sort _Ascending" msgstr "Sortuj_Rosnąco" #: src/ui/gui/psppire-data-sheet.c:333 msgid "Sort _Descending" msgstr "Sortuj_Malejąco" #: src/ui/gui/psppire-data-window.c:175 msgid "Transformations Pending" msgstr "Zawieszone przekształcenia" #: src/ui/gui/psppire-data-window.c:191 msgid "Filter off" msgstr "Nie filtruj" #: src/ui/gui/psppire-data-window.c:203 #, c-format msgid "Filter by %s" msgstr "Filtruj według %s" #: src/ui/gui/psppire-data-window.c:224 msgid "No Split" msgstr "Nie dziel" #: src/ui/gui/psppire-data-window.c:233 msgid "Split by " msgstr "Podziel według" #: src/ui/gui/psppire-data-window.c:261 msgid "Weights off" msgstr "Nie waż" #: src/ui/gui/psppire-data-window.c:273 #, c-format msgid "Weight by %s" msgstr "Zważ według %s" #: src/ui/gui/psppire-data-window.c:518 #: src/ui/gui/psppire-import-assistant.c:681 #: src/ui/gui/psppire-syntax-window.c:607 src/ui/gui/psppire-window.c:669 msgid "All Files" msgstr "Wszystkie pliki" #: src/ui/gui/psppire-data-window.c:535 msgid "System File" msgstr "Plik systemowy" #: src/ui/gui/psppire-data-window.c:542 msgid "Compressed System File" msgstr "Kompresowany plik systemowy" #: src/ui/gui/psppire-data-window.c:548 msgid "Portable File" msgstr "Plik przenośny" #: src/ui/gui/psppire-data-window.c:551 msgid "Format:" msgstr "Format:" #: src/ui/gui/psppire-data-window.c:615 msgid "Delete Existing Dataset?" msgstr "Usunąć istniejący zbiór danych?" #: src/ui/gui/psppire-data-window.c:619 #, c-format msgid "" "Renaming \"%s\" to \"%s\" will destroy the existing dataset named \"%s\". " "Are you sure that you want to do this?" msgstr "" "Zmienienie nazwy \"%s\" to \"%s\" zniszczy obecny zbiór danych nazwany \"%s" "\". Czy jesteś pewny, że chcesz to zrobić?" #: src/ui/gui/psppire-data-window.c:625 #, fuzzy #| msgid "Deleted" msgid "Delete" msgstr "Usunięte" #: src/ui/gui/psppire-data-window.c:647 #, c-format msgid "Please enter a new name for dataset \"%s\":" msgstr "Proszę podaj nową nazwę dla zbioru danych \"%s\":" #: src/ui/gui/psppire-data-window.c:649 msgid "Rename Dataset" msgstr "Zmień nazwę zbioru" #: src/ui/gui/psppire-data-window.c:1199 src/ui/gui/output-window.ui:68 #: src/ui/gui/syntax-editor.ui:22 msgid "_File" msgstr "_Plik" #: src/ui/gui/psppire-data-window.c:1203 src/ui/gui/syntax-editor.ui:25 #, fuzzy #| msgid "_New..." msgid "_New" msgstr "_Nowy..." #: src/ui/gui/psppire-data-window.c:1210 msgid "_Syntax" msgstr "_Skrypt" #: src/ui/gui/psppire-data-window.c:1213 src/ui/gui/data-editor.ui:177 #: src/ui/gui/data-editor.ui:189 msgid "_Data" msgstr "_Dane" #: src/ui/gui/psppire-data-window.c:1220 src/ui/gui/syntax-editor.ui:36 #, fuzzy #| msgid "Open" msgid "_Open" msgstr "Otwórz" #: src/ui/gui/psppire-data-window.c:1223 #, fuzzy #| msgid "I_mport Data..." msgid "_Import Data..." msgstr "I_mportuj dane..." #: src/ui/gui/psppire-data-window.c:1231 src/ui/gui/logistic.ui:261 #: src/ui/gui/regression.ui:66 msgid "_Save..." msgstr "_Zapisz..." #: src/ui/gui/psppire-data-window.c:1234 msgid "Save _As..." msgstr "Zapisz _jako..." #: src/ui/gui/psppire-data-window.c:1237 msgid "_Rename Dataset..." msgstr "_Zmień nazwę zbioru..." #: src/ui/gui/psppire-data-window.c:1248 #, fuzzy #| msgid "D_isplay Data File Information" msgid "_Display Data File Information" msgstr "P_okaż opis pliku" #: src/ui/gui/psppire-data-window.c:1255 msgid "Working File" msgstr "Roboczy plik danych" #: src/ui/gui/psppire-data-window.c:1257 #, fuzzy #| msgid "External File..." msgid "_External File..." msgstr "Plik zewnętrzny..." #: src/ui/gui/psppire-data-window.c:1267 #, fuzzy #| msgid "Recently Used Da_ta" msgid "_Recently Used Data" msgstr "Ostatnio używane da_ne" #: src/ui/gui/psppire-data-window.c:1268 msgid "Recently Used _Files" msgstr "Ostatnio używane _pliki" #: src/ui/gui/psppire-data-window.c:1315 src/ui/gui/output-window.ui:82 #: src/ui/gui/syntax-editor.ui:59 msgid "_Quit" msgstr "" #: src/ui/gui/psppire-data-window.c:1333 src/ui/gui/output-window.ui:89 #: src/ui/gui/syntax-editor.ui:66 msgid "_Edit" msgstr "_Edytuj" #: src/ui/gui/psppire-data-window.c:1339 #, fuzzy #| msgid "Go To Variable..." msgid "_Go To Variable..." msgstr "Przejdź do zmiennej..." #: src/ui/gui/psppire-data-window.c:1340 #, fuzzy #| msgid "Go To Case..." msgid "_Go To Case..." msgstr "Przejdź do obserwacji..." #: src/ui/gui/psppire-data-window.c:1364 src/ui/gui/syntax-editor.ui:69 msgid "Cu_t" msgstr "" #: src/ui/gui/psppire-data-window.c:1373 src/ui/gui/output-window.ui:96 #: src/ui/gui/syntax-editor.ui:74 msgid "_Copy" msgstr "_Kopiuj" #: src/ui/gui/psppire-data-window.c:1380 src/ui/gui/syntax-editor.ui:79 msgid "_Paste" msgstr "" #: src/ui/gui/psppire-data-window.c:1387 #, fuzzy #| msgid "Cl_ear Variables" msgid "Clear _Variables" msgstr "Wy_czyść zmienne" #: src/ui/gui/psppire-data-window.c:1401 msgid "_Find..." msgstr "_Znajdź..." #: src/ui/gui/psppire-data-window.c:1407 src/ui/gui/logistic.ui:246 msgid "_Options..." msgstr "_Opcje..." #: src/ui/gui/psppire-data-window.c:1676 msgid "Jump to variable" msgstr "Przejdź do zmiennej" #: src/ui/gui/psppire-data-window.c:1689 msgid "Jump to a case in the data sheet" msgstr "Przejdź do obserwacji" #: src/ui/gui/psppire-data-window.c:1703 #, fuzzy #| msgid "Sort cases in the active dataset" msgid "Search for values in the data" msgstr "Sortuj zmienne w aktywnym zbiorze danych" #: src/ui/gui/psppire-data-window.c:1715 msgid "Create a new case at the current position" msgstr "Utwórz nową obserwację na obecnej pozycji" #: src/ui/gui/psppire-data-window.c:1727 msgid "Create a new variable at the current position" msgstr "Utwórz nową zmienną na obecnej pozycji" #: src/ui/gui/psppire-data-window.c:1741 msgid "Split the active dataset" msgstr "Podziel aktywny zbiór danych" #: src/ui/gui/psppire-data-window.c:1753 msgid "Weight cases by variable" msgstr "Ważenie obserwacji według zmiennej" #: src/ui/gui/psppire-data-window.c:1764 msgid "Show/hide value labels" msgstr "Pokaż/ukryj etykiety" #: src/ui/gui/psppire-data-window.c:1904 msgid "Data Editor" msgstr "Edytor danych" #: src/ui/gui/psppire-encoding-selector.c:140 msgid "Automatically Detect" msgstr "Wykryj automatycznie" #: src/ui/gui/psppire-encoding-selector.c:147 msgid "Locale Encoding" msgstr "Kodowanie lokalne" #: src/ui/gui/psppire-encoding-selector.c:177 msgid "Character Encoding: " msgstr "Kodowanie znaków:" #: src/ui/gui/psppire-import-assistant.c:337 msgid "line" msgstr "" #: src/ui/gui/psppire-import-assistant.c:347 msgid "var" msgstr "var" #: src/ui/gui/psppire-import-assistant.c:560 msgid "Importing Spreadsheet Data" msgstr "Importowanie danych z arkusza" #: src/ui/gui/psppire-import-assistant.c:686 msgid "Text Files" msgstr "Pliki tekstowe" #: src/ui/gui/psppire-import-assistant.c:691 msgid "Text (*.txt) Files" msgstr "Pliki tekstowe (*.txt)" #: src/ui/gui/psppire-import-assistant.c:697 msgid "Plain Text (ASCII) Files" msgstr "Czysty tekst (Pliki ASCII)" #: src/ui/gui/psppire-import-assistant.c:702 msgid "Comma Separated Value Files" msgstr "Pliki rozdzielane przecinkami" #: src/ui/gui/psppire-import-assistant.c:709 msgid "Tab Separated Value Files" msgstr "Pliki rozdzielane tabulatorami" #: src/ui/gui/psppire-import-assistant.c:714 msgid "Gnumeric Spreadsheet Files" msgstr "Akrusze plików Gnumeric" #: src/ui/gui/psppire-import-assistant.c:719 msgid "OpenDocument Spreadsheet Files" msgstr "Pliki arkuszy OpenDocument" #: src/ui/gui/psppire-import-assistant.c:724 msgid "All Spreadsheet Files" msgstr "Wszystkie pliki arkuszy" #: src/ui/gui/psppire-import-assistant.c:733 #, fuzzy #| msgid "Select Data to Import" msgid "Select File to Import" msgstr "Wybierz dane, które chcesz importować" #: src/ui/gui/psppire-import-assistant.c:770 msgid "Importing Delimited Text Data" msgstr "Importowanie rozdzielanego pliku tekstowego" #: src/ui/gui/psppire-import-assistant.c:865 #, fuzzy #| msgid "Select Cases: Range" msgid "Select the First Line" msgstr "Wybierz obserwacje: Zakres" #: src/ui/gui/psppire-import-assistant.c:877 msgid "Line" msgstr "Linia" #: src/ui/gui/psppire-import-assistant.c:931 msgid "" "This assistant will guide you through the process of importing data into " "PSPP from a text file with one line per case, in which fields are separated " "by tabs, commas, or other delimiters.\n" "\n" msgstr "" "Ten kreator pomoże Ci przebyć proces importowania danych do PSPP z pliku " "tekstowego. Każdy przypadek powinien znajdować się w osobnym wierszu, a " "każda obserwacja powinna być rozdzielona tabulatorami, przecinkami lub " "innymi znakami. \n" "\n" #: src/ui/gui/psppire-import-assistant.c:941 #, fuzzy, c-format #| msgid "The selected file contains %'zu line of text. " #| msgid_plural "The selected file contains %'zu lines of text. " msgid "The selected file contains %'lu line of text. " msgid_plural "The selected file contains %'lu lines of text. " msgstr[0] "Wybrany plik zawiera %'zu linii tekstu." msgstr[1] "Wybrany plik zawiera %'zu linii tekstu." msgstr[2] "Wybrany plik zawiera %'zu linii tekstu." #: src/ui/gui/psppire-import-assistant.c:950 #, c-format msgid "The selected file contains approximately %'lu line of text. " msgid_plural "The selected file contains approximately %'lu lines of text. " msgstr[0] "Wybrany plik zawiera %'lu linii tekstu." msgstr[1] "Wybrany plik zawiera %'lu linie tekstu." msgstr[2] "Wybrany plik zawiera %'lu linii tekstu." #: src/ui/gui/psppire-import-assistant.c:956 #, c-format msgid "" "Only the first %zu line of the file will be shown for preview purposes in " "the following screens. " msgid_plural "" "Only the first %zu lines of the file will be shown for preview purposes in " "the following screens. " msgstr[0] "" "Jedynie pierwsze linie %zu będą pokazane w celu podglądu w nastepnych oknach." msgstr[1] "" "Jedynie pierwsze linie %zu będą pokazane w celu podglądu w nastepnych oknach." msgstr[2] "" "Jedynie pierwsze linie %zu będą pokazane w celu podglądu w nastepnych oknach." #: src/ui/gui/psppire-import-assistant.c:965 msgid "You may choose below how much of the file should actually be imported." msgstr "" "Poniżej możesz wybrać jaka część pliku ma być faktycznie zaimportowana." #: src/ui/gui/psppire-import-assistant.c:974 #, c-format msgid "Only the first %4d cases" msgstr "Jedynie peirwsze %4d obserwacji" #: src/ui/gui/psppire-import-assistant.c:985 #, c-format msgid "Only the first %3d %% of file (approximately)" msgstr "Jedynie pierwsze %3d %% pliku (około)" #: src/ui/gui/psppire-import-assistant.c:1009 #, fuzzy #| msgid "Select Data to Import" msgid "Select the Lines to Import" msgstr "Wybierz dane, które chcesz importować" #: src/ui/gui/psppire-import-assistant.c:1151 msgid "Choose Separators" msgstr "Wybierz separator" #: src/ui/gui/psppire-import-assistant.c:1438 msgid "Adjust Variable Formats" msgstr "Dostosuj format zmiennych" #: src/ui/gui/psppire-output-view.c:410 msgid "Message" msgstr "Wiadomość" #: src/ui/gui/psppire-output-view.c:543 msgid "failed to create temporary directory during clipboard operation" msgstr "" "Tworzenie tymczasowego katalogu podczas operacji na schowku zakończone " "niepowodzeniem" #: src/ui/gui/psppire-output-window.c:241 msgid "Infer file type from extension" msgstr "Plik typu inf z rozszerzenia" #: src/ui/gui/psppire-output-window.c:242 msgid "SPSS Viewer (*.spv)" msgstr "" #: src/ui/gui/psppire-output-window.c:243 msgid "PDF (*.pdf)" msgstr "PDF (*.pdf)" #: src/ui/gui/psppire-output-window.c:244 msgid "HTML (*.html)" msgstr "HTML (*.html)" #: src/ui/gui/psppire-output-window.c:245 msgid "OpenDocument (*.odt)" msgstr "OpenDocument (*.odt)" #: src/ui/gui/psppire-output-window.c:246 msgid "Text (*.txt)" msgstr "Tekst (*.txt)" #: src/ui/gui/psppire-output-window.c:247 #, fuzzy #| msgid "Text (*.txt)" msgid "Text [plain] (*.txt)" msgstr "Tekst (*.txt)" #: src/ui/gui/psppire-output-window.c:248 msgid "PostScript (*.ps)" msgstr "PostScript (*.ps)" #: src/ui/gui/psppire-output-window.c:249 msgid "Comma-Separated Values (*.csv)" msgstr "Wartości dzielone przecinkami (*.csv)" #: src/ui/gui/psppire-output-window.c:350 msgid "Export Output" msgstr "Eksportuj raport" #: src/ui/gui/psppire-output-window.c:548 msgid "Output Viewer" msgstr "Okno raportu" #: src/ui/gui/psppire-spreadsheet-model.c:237 msgid "(empty)" msgstr "(puste)" #: src/ui/gui/psppire-syntax-window.c:226 msgid "Text Search" msgstr "" #: src/ui/gui/psppire-syntax-window.c:229 msgid "_OK" msgstr "" #: src/ui/gui/psppire-syntax-window.c:231 msgid "_Cancel" msgstr "" #: src/ui/gui/psppire-syntax-window.c:239 msgid "Text to search for:" msgstr "" #: src/ui/gui/psppire-syntax-window.c:570 #, c-format msgid "Saved file `%s'" msgstr "Zapisano plik `%s'" #: src/ui/gui/psppire-syntax-window.c:591 msgid "Save Syntax" msgstr "Zapisz sytnax" #: src/ui/gui/psppire-syntax-window.c:601 src/ui/gui/psppire-window.c:657 msgid "Syntax Files (*.sps) " msgstr "Pliki syntax (*.sps)" #: src/ui/gui/psppire-syntax-window.c:970 msgid "Syntax Editor" msgstr "Edytor syntax" #: src/ui/gui/psppire-syntax-window.c:990 #, c-format msgid "Cannot load syntax file `%s'" msgstr "Nie można wczytać pliku syntax `%s'" #: src/ui/gui/psppire-variable-sheet.c:412 #, c-format msgid "{%s, %s}..." msgstr "{%s, %s}..." #: src/ui/gui/psppire-var-sheet-header.c:64 #, fuzzy #| msgid "Decimals" msgid "Decimal" msgstr "Dziesiętne" #: src/ui/gui/psppire-var-sheet-header.c:79 msgid "Align" msgstr "Wyrównanie" #: src/ui/gui/psppire-var-sheet-header.c:82 msgid "Measure" msgstr "Poziom pomiaru" #: src/ui/gui/psppire-window.c:430 #, c-format msgid "Save the changes to `%s' before closing?" msgstr "Zapisać zmiany w `%s' przed zamknięciem?" #: src/ui/gui/psppire-window.c:437 #, c-format msgid "" "If you don't save, changes from the last %ld seconds will be permanently " "lost." msgstr "" "Jeśli nie zapiszesz, zmiany z ostatnich %ld sekund zostaną całkowicie " "utracone." #: src/ui/gui/psppire-window.c:441 msgid "Close _without saving" msgstr "Zamknij _bez zapisywania" #: src/ui/gui/psppire-window.c:625 src/ui/gui/psppire-window.c:629 msgid "Open" msgstr "Otwórz" #: src/ui/gui/psppire-window.c:634 msgid "Data and Syntax Files" msgstr "Pliki danych i syntax" #: src/ui/gui/psppire-window.c:646 msgid "System Files (*.sav, *.zsav)" msgstr "Pliki systemowe (*.sav, *zsav)" #: src/ui/gui/psppire-window.c:663 #, fuzzy #| msgid "Syntax Files (*.sps) " msgid "Output Files (*.spv) " msgstr "Pliki syntax (*.sps)" #: src/ui/gui/t-test-options.c:65 #, c-format msgid "Con_fidence Interval: %2d %%" msgstr "Prze_dział ufności: %2d %%" #: src/ui/gui/val-labs-dialog.c:591 #, c-format msgid "%s = `%s'" msgstr "%s = `%s'" #: src/ui/gui/var-type-dialog.c:541 #, fuzzy #| msgid "Compute Variable: Type and Label" msgid "Variable Type and Format" msgstr "Oblicz zmienną: typ i etykieta" #: src/ui/gui/windows-menu.c:92 #, fuzzy #| msgid "_Minimize All Windows" msgid "_Minimize all Windows" msgstr "_Minimalizuj Wszystkie Okna" #: src/ui/gui/windows-menu.c:100 msgid "_Split" msgstr "_Podział" #: src/ui/gui/windows-menu.c:132 msgid "_Windows" msgstr "_Okna" #: utilities/pspp-convert.c:67 #, c-format msgid "%s argument must be a single character" msgstr "" #: utilities/pspp-convert.c:265 msgid "exactly two non-option arguments are required; use --help for help" msgstr "" "dokładnie dwa argumenty nie będące opcją są wymagane; użyj --help dla pomocy" #: utilities/pspp-convert.c:276 #, c-format msgid "%s: cannot guess output format (use -O option)" msgstr "%s: nie można odczytać formatu raportu (użyj opcji -O)" #: utilities/pspp-convert.c:341 #, c-format msgid "%s: unknown output format (use -O option)" msgstr "%s: nieznany format raportu (użyj opcji -O)" #: utilities/pspp-convert.c:360 #, c-format msgid "%s: error reading input file" msgstr "%s: bład wczytywania pliku inputu" #: utilities/pspp-convert.c:362 #, c-format msgid "%s: error writing output file" msgstr "%s: błąd zapisywania pliku raportu" #: utilities/pspp-convert.c:409 #, fuzzy, c-format #| msgid "%s: error opening output file" msgid "%s: error opening password file" msgstr "%s: bład podczas otwierania pliku raportu" #: utilities/pspp-convert.c:425 #, fuzzy, c-format #| msgid "%s: error reading input file" msgid "" "\n" "%s: password not in file" msgstr "%s: bład wczytywania pliku inputu" #: utilities/pspp-convert.c:462 #, fuzzy, c-format #| msgid "`%c' is not a valid hex digit" msgid "%s: '%c' is not in alphabet" msgstr "`%c' nie jest odpowiednią liczbą szesnastkową" #: utilities/pspp-convert.c:526 msgid "sorry, wrong password" msgstr "Przepraszamy, złe hasło" #: utilities/pspp-output.c:92 #, c-format msgid "%s and %s:" msgstr "" #: utilities/pspp-output.c:547 #, c-format msgid "%s: invalid XPath expression" msgstr "" #: utilities/pspp-output.c:716 msgid "missing command name (use --help for help)" msgstr "" #: utilities/pspp-output.c:720 #, c-format msgid "unknown command \"%s\" (use --help for help)" msgstr "" #: utilities/pspp-output.c:728 #, c-format msgid "\"%s\" command takes exactly %d argument" msgid_plural "\"%s\" command takes exactly %d arguments" msgstr[0] "" msgstr[1] "" msgstr[2] "" #: utilities/pspp-output.c:735 #, fuzzy, c-format #| msgid "%s requires at least %d valid arguments in list." msgid "\"%s\" command requires at least %d argument" msgid_plural "\"%s\" command requires at least %d arguments" msgstr[0] "%s wymaga przynajmniej %d poprawnych argumentów w liście." msgstr[1] "%s wymaga przynajmniej %d poprawnych argumentów w liście." msgstr[2] "%s wymaga przynajmniej %d poprawnych argumentów w liście." #: utilities/pspp-output.c:742 #, fuzzy, c-format #| msgid "%s requires at least %d valid arguments in list." msgid "\"%s\" command requires between %d and %d arguments" msgstr "%s wymaga przynajmniej %d poprawnych argumentów w liście." #: utilities/pspp-output.c:782 msgid "The following object classes are supported:" msgstr "" #: utilities/pspp-output.c:791 #, c-format msgid "%s: unknown object class (use --select=help for help" msgstr "" #: src/language/utilities/set.q:162 #, fuzzy, c-format #| msgid "Value of %s must be between 1 and 100." msgid "%s must be between 0 and 20." msgstr "Wartość %s musi być w przedziale od 1 do 100." #: src/language/utilities/set.q:172 src/language/utilities/set.q:179 #, c-format msgid "%s must be at least 1." msgstr "%s musi wynosić przynajmniej 1" #: src/language/utilities/set.q:205 #, c-format msgid "%s must be at least 1MB" msgstr "%s musi wynosić przynajmniej 1MB" #: src/language/utilities/set.q:207 #, c-format msgid "%s must be positive" msgstr "%s musi być wartością dodatnią" #: src/language/utilities/set.q:213 src/language/utilities/set.q:215 #: src/language/utilities/set.q:217 src/language/utilities/set.q:219 #: src/language/utilities/set.q:221 src/language/utilities/set.q:223 #: src/language/utilities/set.q:225 src/language/utilities/set.q:227 #: src/language/utilities/set.q:229 src/language/utilities/set.q:231 #: src/language/utilities/set.q:233 #, c-format msgid "%s is obsolete." msgstr "%s jest przestarzały." #: src/language/utilities/set.q:239 msgid "Active file compression is not implemented." msgstr "Aktywna kompresja pliku nie jest zaimplementowana." #: src/language/utilities/set.q:403 #, c-format msgid "%s must be 1500 or later." msgstr "%s musi być 1500 lub późniejszy" #: src/language/utilities/set.q:410 #, c-format msgid "expecting %s or year" msgstr "oczekiwany %s lub rok" #: src/language/utilities/set.q:438 src/language/utilities/set.q:535 #, c-format msgid "%s must be at least %d." msgstr "%s musi wynosić przynajmniej %d." #: src/language/utilities/set.q:474 #, c-format msgid "%s is not a recognized encoding or locale name" msgstr "%s nie jest rozpoznanym kodowaniem lub nazwą lokalną" #: src/language/utilities/set.q:562 #, c-format msgid "" "%s requires numeric output format as an argument. Specified format %s is of " "type string." msgstr "" "%s wymaga numerycznego formatu raportu jako argumentu. Określone format %s " "jest tekstowy." #: src/language/utilities/set.q:791 msgid "ISL (32-bit IEEE 754 single, little-endian)" msgstr "ISL (32-bit IEEE 754 single, little-endian)" #: src/language/utilities/set.q:794 msgid "ISB (32-bit IEEE 754 single, big-endian)" msgstr "ISB (32-bit IEEE 754 single, big-endian)" #: src/language/utilities/set.q:797 msgid "IDL (64-bit IEEE 754 double, little-endian)" msgstr "IDL (64-bit IEEE 754 double, little-endian)" #: src/language/utilities/set.q:800 msgid "IDB (64-bit IEEE 754 double, big-endian)" msgstr "IDB (64-bit IEEE 754 double, big-endian)" #: src/language/utilities/set.q:804 msgid "VF (32-bit VAX F, VAX-endian)" msgstr "VF (32-bit VAX F, VAX-endian)" #: src/language/utilities/set.q:807 msgid "VD (64-bit VAX D, VAX-endian)" msgstr "VD (64-bit VAX D, VAX-endian)" #: src/language/utilities/set.q:810 msgid "VG (64-bit VAX G, VAX-endian)" msgstr "VG (64-bit VAX G, VAX-endian)" #: src/language/utilities/set.q:814 msgid "ZS (32-bit IBM Z hexadecimal short, big-endian)" msgstr "ZS (32-bit IBM Z hexadecimal short, big-endian)" #: src/language/utilities/set.q:817 msgid "ZL (64-bit IBM Z hexadecimal long, big-endian)" msgstr "ZL (64-bit IBM Z hexadecimal long, big-endian)" #: src/language/utilities/set.q:985 #, c-format msgid "%s is %s." msgstr "%s to %s." #: src/language/utilities/set.q:1089 #, c-format msgid "" "Too many %s commands without a %s: at most %d levels of saved settings are " "allowed." msgstr "" "Zbyt wiele %s komend bez %s: najwięcej %d poziomów zapisanych ustawień jest " "dopuszczalne." #: src/language/utilities/set.q:1109 #, c-format msgid "%s without matching %s." msgstr "%s bez pasującego %s." #: src/language/stats/crosstabs.q:327 #, c-format msgid "Missing mode %s not allowed in general mode. Assuming %s." msgstr "" "Tryb missing %s nie jest dopuszczalny w ogólnym trybie. Zakłada się %s." #: src/language/stats/crosstabs.q:444 msgid "Too many cross-tabulation variables or dimensions." msgstr "Zbyt wiele zmiennych lub wymiarów w tabeli krzyżowej." #: src/language/stats/crosstabs.q:509 #, c-format msgid "%s must be specified before %s." msgstr "%s musi być określone przed %s." #: src/language/stats/crosstabs.q:543 #, c-format msgid "Maximum value (%ld) less than minimum value (%ld)." msgstr "Maksymalna wartość (%ld) jest mniejsza niż minimalna wartość (%ld)." #: src/language/stats/crosstabs.q:922 #, fuzzy #| msgid "Summary." msgid "Summary" msgstr "Podsumowanie." #: src/language/stats/crosstabs.q:935 #, fuzzy #| msgid "Crosstabs" msgid "Crosstabulation" msgstr "Tabele krzyżowe" #. TRANSLATORS: The %s here describes a crosstabulation. It takes the #. form "var1 * var2 * var3 * ...". #: src/language/stats/crosstabs.q:1013 #, c-format msgid "Crosstabulation %s contained no non-missing cases." msgstr "Tabela krzyżowa %s nie zawierała braków danych." #: src/language/stats/crosstabs.q:1204 #, fuzzy #| msgid "Missing Values" msgid "Missing value" msgstr "Braki" #: src/language/stats/crosstabs.q:1263 #, fuzzy #| msgid "row %" msgid "Row %" msgstr "wiersz %" #: src/language/stats/crosstabs.q:1264 #, fuzzy #| msgid "column %" msgid "Column %" msgstr "kolumna %" #: src/language/stats/crosstabs.q:1265 #, fuzzy #| msgid "total %" msgid "Total %" msgstr "% Ogółem" #: src/language/stats/crosstabs.q:1269 #, fuzzy #| msgid "Adjusted Std. Residual" msgid "Adjusted Residual" msgstr "Reszta skorygowana" #: src/language/stats/crosstabs.q:1288 #, fuzzy #| msgid "Chi-Square Test" msgid "Chi-Square Tests" msgstr "Test chi-kwadrat" #: src/language/stats/crosstabs.q:1294 msgid "Pearson Chi-Square" msgstr "Chi-kwadrat Pearsona" #: src/language/stats/crosstabs.q:1295 msgid "Likelihood Ratio" msgstr "Stosunek prawdopodobieństwa" #: src/language/stats/crosstabs.q:1296 msgid "Fisher's Exact Test" msgstr "Test Fisher'a" #: src/language/stats/crosstabs.q:1297 msgid "Continuity Correction" msgstr "Poprawka na ciągłość" #: src/language/stats/crosstabs.q:1298 msgid "Linear-by-Linear Association" msgstr "Test związku liniowego" #: src/language/stats/crosstabs.q:1299 src/language/stats/crosstabs.q:1345 #: src/language/stats/crosstabs.q:1854 msgid "N of Valid Cases" msgstr "N ważnych obserwacji" #: src/language/stats/crosstabs.q:1305 #, fuzzy #| msgid "Asymp. Sig. (2-tailed)" msgid "Asymptotic Sig. (2-tailed)" msgstr "Istotność asymptotyczna (dwustronna)" #: src/language/stats/crosstabs.q:1319 #, fuzzy #| msgid "Symmetric measures." msgid "Symmetric Measures" msgstr "Miary symetryczne." #: src/language/stats/crosstabs.q:1324 src/language/stats/crosstabs.q:1364 #: src/language/stats/crosstabs.q:1411 #, fuzzy #| msgid "_Values" msgid "Values" msgstr "_Wartości" #: src/language/stats/crosstabs.q:1326 src/language/stats/crosstabs.q:1413 msgid "Asymp. Std. Error" msgstr "Asymptotyczny błąd standardowy" #: src/language/stats/crosstabs.q:1327 src/language/stats/crosstabs.q:1414 msgid "Approx. T" msgstr "Przybliżone t" #: src/language/stats/crosstabs.q:1328 src/language/stats/crosstabs.q:1415 msgid "Approx. Sig." msgstr "Przybliżona istotność" #: src/language/stats/crosstabs.q:1333 src/language/stats/crosstabs.q:1420 msgid "Nominal by Nominal" msgstr "Nominalna przez nominalną" #: src/language/stats/crosstabs.q:1334 msgid "Cramer's V" msgstr "V Cramera" #: src/language/stats/crosstabs.q:1334 msgid "Contingency Coefficient" msgstr "Współczynnik kontyngencji" #: src/language/stats/crosstabs.q:1336 src/language/stats/crosstabs.q:1425 msgid "Ordinal by Ordinal" msgstr "Porządkowa przez porządkową" #: src/language/stats/crosstabs.q:1337 msgid "Kendall's tau-b" msgstr "tau-b Kendalla" #: src/language/stats/crosstabs.q:1337 msgid "Kendall's tau-c" msgstr "tau-c Kendalla" #: src/language/stats/crosstabs.q:1338 msgid "Spearman Correlation" msgstr "Korelacja Spearmana" #: src/language/stats/crosstabs.q:1340 msgid "Interval by Interval" msgstr "Ilościowa przez ilościową" #: src/language/stats/crosstabs.q:1341 msgid "Pearson's R" msgstr "r Pearsona" #: src/language/stats/crosstabs.q:1343 msgid "Measure of Agreement" msgstr "Miara zgodności" #: src/language/stats/crosstabs.q:1359 #, fuzzy #| msgid "Risk estimate." msgid "Risk Estimate" msgstr "Współczynnik ryzyka." #: src/language/stats/crosstabs.q:1368 #, fuzzy, no-c-format #| msgid "95%% Confidence Interval" msgid "95% Confidence Interval" msgstr "95%% przedział ufności" #: src/language/stats/crosstabs.q:1389 msgid "Symmetric" msgstr "Symetryczny" #: src/language/stats/crosstabs.q:1391 src/language/stats/crosstabs.q:1396 #, c-format msgid "%s Dependent" msgstr "%s Zależna" #: src/language/stats/crosstabs.q:1406 #, fuzzy #| msgid "Directional measures." msgid "Directional Measures" msgstr "Miary kierunkowe." #: src/language/stats/crosstabs.q:1422 msgid "Goodman and Kruskal tau" msgstr "Tau Goodmana i Kruskala" #: src/language/stats/crosstabs.q:1423 msgid "Uncertainty Coefficient" msgstr "Współczynnik niepewności" #: src/language/stats/crosstabs.q:1426 msgid "Somers' d" msgstr "d Somersa" #: src/language/stats/crosstabs.q:1428 msgid "Nominal by Interval" msgstr "Nominalna przez ilościową" #: src/language/stats/crosstabs.q:1826 #, fuzzy, c-format #| msgid "Odds Ratio for %s (%g / %g)" msgid "Odds Ratio for %s" msgstr "Współczynnik ryzyka dla %s (%g / %g)" #: src/language/stats/crosstabs.q:1835 #, fuzzy, c-format #| msgid "For cohort %s = %.*g" msgid "For cohort %s = " msgstr "Dla kohorty %s = %.*g" #: src/ui/gui/aggregate.ui:24 msgid "Aggregate Data" msgstr "Agreguj dane" #: src/ui/gui/aggregate.ui:126 msgid "_Break variable(s)" msgstr "_Zmienne grupujące" #: src/ui/gui/aggregate.ui:179 msgid "Variable Name: " msgstr "Nazwy zmiennych:" #: src/ui/gui/aggregate.ui:215 msgid "Variable Label: " msgstr "Etykieta zmiennej:" #: src/ui/gui/aggregate.ui:252 msgid "Function: " msgstr "Funkcja:" #: src/ui/gui/aggregate.ui:327 msgid "Argument 1: " msgstr "Argument 1: " #: src/ui/gui/aggregate.ui:364 msgid "Argument 2: " msgstr "Argument 2: " #: src/ui/gui/aggregate.ui:428 msgid "Aggregated variables" msgstr "Zmienne agregowane" #: src/ui/gui/aggregate.ui:469 msgid "_Add aggregated variables to the active dataset" msgstr "_Dodaj zagregowane zmienne do aktywnego zbioru danych" #: src/ui/gui/aggregate.ui:486 msgid "_Replace the current dataset with the aggregated variables" msgstr "_Zastąp obecny zbiór danych zawierający tylko zagregowane zmienne" #: src/ui/gui/aggregate.ui:504 msgid "_Write a new data file containing only the aggregated variables" msgstr "_Utwórz nowy zbiór danych zawierający tylko agregowane zmienne" #: src/ui/gui/aggregate.ui:544 msgid "label" msgstr "etykieta" #: src/ui/gui/aggregate.ui:593 msgid "File is _already sorted on break variable(s)" msgstr "Zbiór został _już posortowane według zmiennych grupujących" #: src/ui/gui/aggregate.ui:609 msgid "Sort file before a_ggregating" msgstr "_Posortuj plik przed agregacją" #: src/ui/gui/aggregate.ui:630 msgid "Options for very large datasets" msgstr "Opcje dla bardzo dużych zbiorów" #: src/ui/gui/autorecode.ui:24 msgid "Automatic Recode" msgstr "Rekoduj automatycznie" #: src/ui/gui/autorecode.ui:120 msgid "Variable -> New Name" msgstr "Zmienna -> Nowa nazwa" #: src/ui/gui/autorecode.ui:145 msgid "_Lowest value" msgstr "_Najmniejsza wartość" #: src/ui/gui/autorecode.ui:163 msgid "_Highest value" msgstr "_Największa wartość" #: src/ui/gui/autorecode.ui:185 msgid "Recode starting from" msgstr "Rekoduj zaczynając od" #: src/ui/gui/autorecode.ui:204 msgid "_New Name" msgstr "_Nowa nazwa" #: src/ui/gui/autorecode.ui:227 msgid "_Add New Name" msgstr "_Dodaj nową nazwę" #: src/ui/gui/autorecode.ui:285 msgid "_Use the same recoding scheme for all variables" msgstr "_Użyj tego samego schematu rekodowania dla wszystkich zmiennych" #: src/ui/gui/autorecode.ui:301 msgid "Treat _blank string values as missing" msgstr "Traktuj _puste ciągi znaków jako braki danych" #: src/ui/gui/binomial.ui:86 msgid "_Test Variable List:" msgstr "_Zmienne testowane" #: src/ui/gui/binomial.ui:160 src/ui/gui/chi-square.ui:281 msgid "_Get from data" msgstr "_Ustal na podstawie danych" #: src/ui/gui/binomial.ui:181 src/ui/gui/indep-samples.ui:150 msgid "_Cut point:" msgstr "_Punkt podziału:" #: src/ui/gui/binomial.ui:225 msgid "Define Dichotomy" msgstr "Definiuj dychotomię" #: src/ui/gui/binomial.ui:245 msgid "Test _Proportion:" msgstr "Test _podziału" #: src/ui/gui/compute.ui:32 msgid "Compute Variable: Type and Label" msgstr "Oblicz zmienną: typ i etykieta" #: src/ui/gui/compute.ui:67 msgid "Use _expression as label" msgstr "Użyj _wyrażenia jako etykiety" #: src/ui/gui/compute.ui:90 msgid "_Label:" msgstr "_Etykieta:" #: src/ui/gui/compute.ui:194 msgid "_String" msgstr "_Tekstowa" #: src/ui/gui/compute.ui:287 msgid "_Numeric" msgstr "_Numeryczna" #: src/ui/gui/compute.ui:343 msgid "Compute Variable" msgstr "Oblicz zmienne" #: src/ui/gui/compute.ui:381 msgid "Target _Variable:" msgstr "Zmienna _wynikowa" #: src/ui/gui/compute.ui:412 msgid "_Type & Label..." msgstr "_Typ i etykieta" #: src/ui/gui/compute.ui:469 msgid "=" msgstr "=" #: src/ui/gui/compute.ui:526 msgid "_Numeric Expressions:" msgstr "_Wyrażenia numeryczne:" #: src/ui/gui/compute.ui:598 msgid "_Functions:" msgstr "_Funkcje:" #: src/ui/gui/compute.ui:678 msgid "_If..." msgstr "_Jeśli..." #: src/ui/gui/barchart.ui:24 msgid "Barchart" msgstr "" #: src/ui/gui/barchart.ui:112 #, fuzzy #| msgid "Category" msgid "Category A_xis:" msgstr "Kategoria" #: src/ui/gui/barchart.ui:140 #, fuzzy #| msgid "Number of cases" msgid "_N of cases" msgstr "Liczba obserwacji" #: src/ui/gui/barchart.ui:158 #, fuzzy #| msgid "Number of cases" msgid "_Cum. n of cases" msgstr "Liczba obserwacji" #: src/ui/gui/barchart.ui:174 msgid "Other _summary function" msgstr "" #: src/ui/gui/barchart.ui:191 #, fuzzy #| msgid "Number of cases" msgid "% of c_ases" msgstr "Liczba obserwacji" #: src/ui/gui/barchart.ui:207 #, fuzzy #| msgid "Number of cases" msgid "C_um. % of cases" msgstr "Liczba obserwacji" #: src/ui/gui/barchart.ui:270 src/ui/gui/histogram.ui:100 #, fuzzy #| msgid "_Variables:" msgid "_Variable:" msgstr "_Zmienne:" #: src/ui/gui/barchart.ui:308 msgid "Bars Represent" msgstr "" #: src/ui/gui/barchart.ui:340 #, fuzzy #| msgid "Category label source" msgid "Category C_luster:" msgstr "Źródło etykiet kategorii" #: src/ui/gui/correlation.ui:24 msgid "Bivariate Correlations" msgstr "Korelacje parami" #: src/ui/gui/correlation.ui:148 msgid "Pearso_n" msgstr "Pearso_n" #: src/ui/gui/correlation.ui:164 msgid "_Kendall's tau-b" msgstr "_tau Kendalla" #: src/ui/gui/correlation.ui:180 msgid "_Spearman" msgstr "_Spearman" #: src/ui/gui/correlation.ui:200 msgid "Correlation Coefficients" msgstr "Współczynniki korelacji" #: src/ui/gui/correlation.ui:224 msgid "_Two-tailed" msgstr "_Dwustronna" #: src/ui/gui/correlation.ui:241 msgid "One-tai_led" msgstr "Jednostr_onna" #: src/ui/gui/correlation.ui:262 msgid "Test of Significance" msgstr "Test istotności" #: src/ui/gui/correlation.ui:275 msgid "_Flag significant correlations" msgstr "_Oznacz istotne korelacje" #: src/ui/gui/count.ui:24 msgid "Count Occurrences of Values within Cases" msgstr "Zlicz wystąpienia wartości w obrębie obserwacji" #: src/ui/gui/count.ui:117 msgid "Numeric _Variables:" msgstr "Zmienne numeryczne:" #: src/ui/gui/count.ui:147 msgid "_Target Variable:" msgstr "_Zmienna wynikowa" #: src/ui/gui/count.ui:178 msgid "Target _Label:" msgstr "_Etykieta zmiennej wynikowej" #: src/ui/gui/count.ui:192 msgid "_Define Values..." msgstr "_Definiuj wartości..." #: src/ui/gui/count.ui:257 msgid "Count Values within Cases: Values to Count" msgstr "Zlicz wartości w obrębie obserwacji: Wartości do obliczenia" #: src/ui/gui/count.ui:305 msgid "Values _to Count:" msgstr "Wartości _do obliczenia:" #: src/ui/gui/comments.ui:25 msgid "Data File Comments" msgstr "Komentarze do danych" #: src/ui/gui/comments.ui:49 msgid "Comments:" msgstr "Komentarze:" #: src/ui/gui/comments.ui:106 msgid "Display comments in output" msgstr "Wyświetl komentarze w raporcie" #: src/ui/gui/comments.ui:127 msgid "Column Number: 0" msgstr "Numer kolumny: 0" #: src/ui/gui/crosstabs.ui:25 msgid "Crosstabs: Cells" msgstr "Tabele krzyżowe: Komórki" #: src/ui/gui/crosstabs.ui:67 msgid "Cell Display" msgstr "Zawartość komórek" #: src/ui/gui/crosstabs.ui:99 msgid "Crosstabs" msgstr "Tabele krzyżowe" #: src/ui/gui/crosstabs.ui:150 msgid "_Rows" msgstr "_Wiersze" #: src/ui/gui/crosstabs.ui:195 msgid "_Columns" msgstr "_Kolumny" #: src/ui/gui/crosstabs.ui:242 msgid "_Format..." msgstr "_Format..." #: src/ui/gui/crosstabs.ui:256 src/ui/gui/examine.ui:267 msgid "_Statistics..." msgstr "_Statystyki" #: src/ui/gui/crosstabs.ui:270 msgid "Ce_lls..." msgstr "_Komórki" #: src/ui/gui/crosstabs.ui:348 msgid "Crosstabs: Format" msgstr "Tabele krzyżowe: Format" #: src/ui/gui/crosstabs.ui:371 msgid "Print tables" msgstr "Drukuj tabele" #: src/ui/gui/crosstabs.ui:387 msgid "Pivot" msgstr "Oś" #: src/ui/gui/crosstabs.ui:403 src/ui/gui/sort.ui:157 msgid "Ascending" msgstr "Rosnąco" #: src/ui/gui/crosstabs.ui:455 msgid "Crosstabs: Statistics" msgstr "Tabele krzyżowe: Statystyki" #: src/ui/gui/chi-square.ui:30 msgid "Chi-Square Test" msgstr "Test chi-kwadrat" #: src/ui/gui/chi-square.ui:82 msgid "All categor_ies equal" msgstr "Wszystkie kate_gorie są równe" #: src/ui/gui/chi-square.ui:103 msgid "_Values" msgstr "_Wartości" #: src/ui/gui/chi-square.ui:159 msgid "Expected Values:" msgstr "Wartości oczekiwane:" #: src/ui/gui/chi-square.ui:204 msgid "Test _Variables" msgstr "Zmienne _testowane" #: src/ui/gui/chi-square.ui:298 msgid "Use _specified range" msgstr "Użyj _określonego przedziału" #: src/ui/gui/chi-square.ui:323 msgid "_Lower:" msgstr "_Dolna granica:" #: src/ui/gui/chi-square.ui:337 msgid "_Upper:" msgstr "_Górna granica:" #: src/ui/gui/chi-square.ui:381 msgid "Expected Range:" msgstr "Oczekiwany zakres:" #: src/ui/gui/descriptives.ui:131 src/ui/gui/factor.ui:797 #: src/ui/gui/recode.ui:638 msgid "_Variables:" msgstr "_Zmienne:" #: src/ui/gui/descriptives.ui:176 msgid "S_tatistics:" msgstr "S_tatystyki:" #: src/ui/gui/descriptives.ui:230 msgid "_Exclude entire case if any selected variable is missing" msgstr "" "_Wyklucz cały przypadek jeśli którakolwiek wybrana zmienna jest brakiem " "danych" #: src/ui/gui/descriptives.ui:247 msgid "_Include user-missing data in analysis" msgstr "_Uwzględnij braki danych w analizie" #: src/ui/gui/descriptives.ui:264 msgid "Save _Z-scores of selected variables as new variables" msgstr "Zapisz _standaryzowane wartości jako zmienne" #: src/ui/gui/descriptives.ui:286 msgid "Options:" msgstr "Opcje:" #: src/ui/gui/examine.ui:25 msgid "Explore" msgstr "Eksploracja" #: src/ui/gui/examine.ui:69 msgid "_Label Cases by:" msgstr "_Użyj do opisu ob_serwacji:" #: src/ui/gui/examine.ui:116 msgid "_Factor List:" msgstr "Lista _czynników" #: src/ui/gui/examine.ui:163 src/ui/gui/means.ui:126 msgid "_Dependent List:" msgstr "_Zmienne zależne:" #: src/ui/gui/examine.ui:331 msgid "Explore: Options" msgstr "Eksploracja: Opcje" #: src/ui/gui/examine.ui:355 src/ui/gui/t-test.ui:81 msgid "Exclude cases _listwise" msgstr "Wyłączanie wszystkich _obserwacji z brakami" #: src/ui/gui/examine.ui:373 msgid "Exclude cases _pairwise" msgstr "Wyłączanie _obserwacji parami" #: src/ui/gui/examine.ui:392 msgid "_Report values" msgstr "_Raportuj wartości" #: src/ui/gui/examine.ui:449 msgid "Explore: Statistics" msgstr "Eksploracja: Statystyki" #: src/ui/gui/examine.ui:468 src/ui/gui/oneway.ui:576 msgid "_Descriptives" msgstr "_Statystyki opisowe" #: src/ui/gui/examine.ui:485 msgid "_Extremes" msgstr "_Wartości skrajne" #: src/ui/gui/examine.ui:502 msgid "_Percentiles" msgstr "_Percentyle" #: src/ui/gui/goto-case.ui:31 msgid "Goto Case" msgstr "Przejdź do obserwacji" #: src/ui/gui/goto-case.ui:52 msgid "Goto Case Number:" msgstr "Przejdź do obserwacji numer:" #: src/ui/gui/factor.ui:39 msgid "Factor Analysis: Rotation" msgstr "Analiza czynnikowa: Rotacja" #: src/ui/gui/factor.ui:70 msgid "_None" msgstr "_Brak" #: src/ui/gui/factor.ui:87 msgid "_Varimax" msgstr "_Varimax" #: src/ui/gui/factor.ui:104 msgid "_Quartimax" msgstr "_Quartimax" #: src/ui/gui/factor.ui:123 msgid "_Equimax" msgstr "_Equimax" #: src/ui/gui/factor.ui:146 msgid "Method" msgstr "Metoda" #: src/ui/gui/factor.ui:159 msgid "_Display rotated solution" msgstr "_Rozwiązanie rotowane" #: src/ui/gui/factor.ui:181 src/ui/gui/factor.ui:582 msgid "Ma_ximum iterations for convergence:" msgstr "Maksimum iteracji dla uzyskania zbieżności:" #: src/ui/gui/factor.ui:241 src/ui/gui/factor.ui:255 msgid "Principal Components Analysis" msgstr "Analiza głównych składowych" #: src/ui/gui/factor.ui:246 src/ui/gui/factor.ui:258 msgid "Principal Axis Factoring" msgstr "Osi głównych" #: src/ui/gui/factor.ui:264 msgid "Factor Analysis: Extraction" msgstr "Analiza czynnikowa: wyodrębnianie" #: src/ui/gui/factor.ui:290 msgid "_Method: " msgstr "_Metoda:" #: src/ui/gui/factor.ui:345 msgid "Co_rrelation matrix" msgstr "Macierz ko_relacji" #: src/ui/gui/factor.ui:361 msgid "Co_variance matrix" msgstr "Macierz ko_wariancji" #: src/ui/gui/factor.ui:382 msgid "Analyze" msgstr "Analizuj" #: src/ui/gui/factor.ui:407 msgid "_Unrotated factor solution" msgstr "_Nierotowane rozwiązanie czynnikowe" #: src/ui/gui/factor.ui:423 msgid "_Scree plot" msgstr "_Wykres osypiska" #: src/ui/gui/factor.ui:443 src/ui/gui/histogram.ui:146 src/ui/gui/roc.ui:329 msgid "Display" msgstr "Pokaż" #: src/ui/gui/factor.ui:526 msgid "_Number of factors:" msgstr "_Liczba czynników" #: src/ui/gui/factor.ui:563 msgid "Extract" msgstr "Wyodrębnij" #: src/ui/gui/factor.ui:640 msgid "Factor Analysis" msgstr "Analiza czynnikowa" #: src/ui/gui/factor.ui:672 src/ui/gui/data-editor.ui:266 msgid "_Descriptives..." msgstr "_Statystyki opisowe..." #: src/ui/gui/factor.ui:685 msgid "_Extraction..." msgstr "_Wyodrębnianie..." #: src/ui/gui/factor.ui:699 msgid "_Rotations..." msgstr "_Rotacja..." #: src/ui/gui/find.ui:25 msgid "Find Case" msgstr "Znajdź" #: src/ui/gui/find.ui:117 msgid "Variable:" msgstr "Zmienna:" #: src/ui/gui/find.ui:157 src/ui/gui/val-labs-dialog.ui:113 msgid "Value:" msgstr "Wartość:" #: src/ui/gui/find.ui:180 msgid "Search value labels" msgstr "Szukaj wartości etykiet" #: src/ui/gui/find.ui:210 msgid "Regular expression Match" msgstr "Dopasowanie regularnego wyrażenia" #: src/ui/gui/find.ui:227 msgid "Search substrings" msgstr "Przeszukaj łańcuchy tekstowe" #: src/ui/gui/find.ui:244 msgid "Wrap around" msgstr "Owiń wokół" #: src/ui/gui/find.ui:260 msgid "Search backward" msgstr "Szukaj od końca" #: src/ui/gui/frequencies.ui:32 msgid "Frequencies: Frequency Tables" msgstr "Częstości: Tabele częstości" #: src/ui/gui/frequencies.ui:67 msgid "_Always" msgstr "_Zawsze" #: src/ui/gui/frequencies.ui:85 msgid "_Never" msgstr "_Nigdy" #: src/ui/gui/frequencies.ui:107 msgid "If no _more than " msgstr "Jeśli nie _więcej niż" #: src/ui/gui/frequencies.ui:129 src/ui/gui/frequencies.ui:454 msgid "100" msgstr "" #: src/ui/gui/frequencies.ui:145 msgid "values" msgstr "wartości" #: src/ui/gui/frequencies.ui:167 msgid "Display frequency tables" msgstr "Wyświetl tabele częstości" #: src/ui/gui/frequencies.ui:194 msgid "A_scending value" msgstr "Wartość rosnąća" #: src/ui/gui/frequencies.ui:212 msgid "D_escending value" msgstr "Wartość malejąca" #: src/ui/gui/frequencies.ui:230 msgid "Ascending _frequency" msgstr "Częstość rosnąca" #: src/ui/gui/frequencies.ui:248 msgid "Descending f_requency" msgstr "Częstość malejąca" #: src/ui/gui/frequencies.ui:271 msgid "Order by" msgstr "Kolejność według" #: src/ui/gui/frequencies.ui:324 msgid "Frequencies: Charts" msgstr "Częstości: Wykresy" #: src/ui/gui/frequencies.ui:356 msgid "Scale:" msgstr "Skala:" #: src/ui/gui/frequencies.ui:366 msgid "_Frequencies" msgstr "_Częstości" #: src/ui/gui/frequencies.ui:383 msgid "_Percentages" msgstr "_Procenty" #: src/ui/gui/frequencies.ui:407 msgid "Exclude values _below " msgstr "Wyklucz obserwacje _poniżej" #: src/ui/gui/frequencies.ui:422 msgid "Exclude values _above " msgstr "Wyklucz obserwacje _powyżej" #: src/ui/gui/frequencies.ui:441 src/ui/gui/reliability.ui:227 msgid "0" msgstr "" #: src/ui/gui/frequencies.ui:469 msgid "Chart Formatting" msgstr " Formatowanie wykresu " #: src/ui/gui/frequencies.ui:494 msgid "Draw _histograms" msgstr "Rysuj histogramy" #: src/ui/gui/frequencies.ui:510 msgid "Superimpose _normal curve" msgstr "Pokaż krzywą _normalną" #: src/ui/gui/frequencies.ui:530 msgid "Histograms" msgstr " Histogramy " #: src/ui/gui/frequencies.ui:555 #, fuzzy #| msgid "Draw _pie charts" msgid "Draw _bar charts" msgstr "Rysuj _wykresy kołowe" #: src/ui/gui/frequencies.ui:575 #, fuzzy #| msgid "Pie Charts" msgid "Bar Charts" msgstr " Wykresy kołowe " #: src/ui/gui/frequencies.ui:600 msgid "Draw _pie charts" msgstr "Rysuj _wykresy kołowe" #: src/ui/gui/frequencies.ui:616 msgid "Include slices for _missing values" msgstr "Pokaż grupy zdefiniowane przez _braki danych" #: src/ui/gui/frequencies.ui:636 msgid "Pie Charts" msgstr " Wykresy kołowe " #: src/ui/gui/frequencies.ui:725 src/ui/gui/rank.ui:489 msgid "_Variable(s):" msgstr "_Zmienne:" #: src/ui/gui/frequencies.ui:769 msgid "_Statistics:" msgstr "_Statystyki:" #: src/ui/gui/frequencies.ui:783 msgid "Include _missing values" msgstr "Uwzględnij _braki danych" #: src/ui/gui/frequencies.ui:806 msgid "Ch_arts..." msgstr "W_ykresy..." #: src/ui/gui/frequencies.ui:821 msgid "Frequency _Tables..." msgstr "Tabele _częstości..." #: src/ui/gui/histogram.ui:24 #, fuzzy #| msgid "Histograms" msgid "Histogram" msgstr " Histogramy " #: src/ui/gui/histogram.ui:126 #, fuzzy #| msgid "Superimpose _normal curve" msgid "_Display normal curve" msgstr "Pokaż krzywą _normalną" #: src/ui/gui/indep-samples.ui:25 src/ui/gui/k-independent.ui:35 msgid "Define Groups" msgstr "Definiuj grupy" #: src/ui/gui/indep-samples.ui:75 msgid "Group_2 value:" msgstr "Wartość grupy_2:" #: src/ui/gui/indep-samples.ui:89 msgid "Group_1 value:" msgstr "Wartość grupy_ 1:" #: src/ui/gui/indep-samples.ui:190 msgid "_Use specified values:" msgstr "_Użyj określonyc wartości:" #: src/ui/gui/indep-samples.ui:259 msgid "Independent-Samples T Test" msgstr "Test t dla prób niezależnych" #: src/ui/gui/indep-samples.ui:319 msgid "_Define Groups..." msgstr "_Definiuj grupy..." #: src/ui/gui/indep-samples.ui:401 src/ui/gui/t-test.ui:211 msgid "_Test Variable(s):" msgstr "_Zmienne testowane:" #: src/ui/gui/indep-samples.ui:454 src/ui/gui/k-independent.ui:165 msgid "_Grouping Variable:" msgstr "_Zmienna grupująca:" #: src/ui/gui/k-independent.ui:63 #, fuzzy #| msgid "_Upper:" msgid "_Upper limit:" msgstr "_Górna granica:" #: src/ui/gui/k-independent.ui:77 #, fuzzy #| msgid "_Lower:" msgid "_Lower limit:" msgstr "_Dolna granica:" #: src/ui/gui/k-independent.ui:136 #, fuzzy #| msgid "Tests for Several Related Samples" msgid "Tests for Several Independent Samples" msgstr "K prób zależnych" #: src/ui/gui/k-independent.ui:208 src/ui/gui/ks-one-sample.ui:131 msgid "Test _Variable List:" msgstr "Zmienne testowane:" #: src/ui/gui/k-independent.ui:320 #, fuzzy #| msgid "Define Groups" msgid "_Define Groups" msgstr "Definiuj grupy" #: src/ui/gui/k-independent.ui:365 msgid "_Kruskal-Wallis H" msgstr "" #: src/ui/gui/k-independent.ui:382 src/ui/gui/runs.ui:140 msgid "_Median" msgstr "_Mediana" #: src/ui/gui/k-means.ui:24 msgid "K-Means Cluster Analysis" msgstr "Analiza skupień metodą k-średnich" #: src/ui/gui/k-means.ui:122 msgid "N_umber of Clusters: " msgstr "_Liczba skupień:" #: src/ui/gui/k-related.ui:24 msgid "Tests for Several Related Samples" msgstr "K prób zależnych" #: src/ui/gui/k-related.ui:113 msgid "_Test Variables:" msgstr "_Zmienne testowane" #: src/ui/gui/k-related.ui:145 msgid "_Friedman" msgstr "_Friedman" #: src/ui/gui/k-related.ui:161 msgid "_Kendall's W" msgstr "_W Kendalla" #: src/ui/gui/k-related.ui:177 msgid "_Cochran's Q" msgstr "_Q Cochrana" #: src/ui/gui/ks-one-sample.ui:163 msgid "_Normal" msgstr "_Normalny" #: src/ui/gui/ks-one-sample.ui:181 msgid "_Poisson" msgstr "_Poissona" #: src/ui/gui/ks-one-sample.ui:198 msgid "_Uniform" msgstr "_Jednostajny" #: src/ui/gui/ks-one-sample.ui:213 msgid "_Exponential" msgstr "_Wykładniczy" #: src/ui/gui/ks-one-sample.ui:232 msgid "Test Distribution" msgstr "Testowany rozkład" #: src/ui/gui/logistic.ui:42 msgid "Logistic Regression: Options" msgstr "Regresja logistyczna: Opcje" #: src/ui/gui/logistic.ui:66 msgid "CI for _exp(B): " msgstr "Przedziały ufności dla exp(B):" #: src/ui/gui/logistic.ui:97 msgid "%" msgstr "%" #: src/ui/gui/logistic.ui:146 msgid "Classification cu_toff: " msgstr "Punkt po_działu w klasyfikacji:" #: src/ui/gui/logistic.ui:159 msgid "_Maximum Iterations: " msgstr "_Maksymalna liczba iteracji:" #: src/ui/gui/logistic.ui:177 msgid "Include _constant in model" msgstr "Uwzględnij _stałą w modelu" #: src/ui/gui/logistic.ui:219 msgid "Logistic Regression" msgstr "Regresja logistyczna" #: src/ui/gui/logistic.ui:364 src/ui/gui/regression.ui:185 msgid "_Dependent" msgstr "_Zmienna Zależna" #: src/ui/gui/logistic.ui:412 src/ui/gui/regression.ui:232 msgid "_Independent" msgstr "Zmienna _Niezależna" #: src/ui/gui/means.ui:25 msgid "Means" msgstr "Średnie" #: src/ui/gui/means.ui:179 msgid "_Independent List:" msgstr "_Zmienne niezależne:" #: src/ui/gui/missing-val-dialog.ui:48 msgid "_No missing values" msgstr "_Bez braków danych" #: src/ui/gui/missing-val-dialog.ui:136 msgid "_Discrete missing values" msgstr "_Wartości dyskretne braków" #: src/ui/gui/missing-val-dialog.ui:172 msgid "_Low:" msgstr "_Dolna granica:" #: src/ui/gui/missing-val-dialog.ui:197 msgid "_High:" msgstr "_Górna granica:" #: src/ui/gui/missing-val-dialog.ui:221 msgid "Di_screte value:" msgstr "Wartość _dyskretna:" #: src/ui/gui/missing-val-dialog.ui:245 msgid "_Range plus one optional discrete missing value" msgstr "_Przedział wartości plus wartość dyskretna" #: src/ui/gui/oneway.ui:25 msgid "One-Way ANOVA: Contrasts" msgstr "Jednoczynikowa ANOVA: Kontrasty" #: src/ui/gui/oneway.ui:107 msgid "_Coefficients:" msgstr "_Współczynniki:" #: src/ui/gui/oneway.ui:161 msgid "Coefficient Total: " msgstr "Współczynniki ogółem:" #: src/ui/gui/oneway.ui:198 msgid "Contrast 1 of 1" msgstr "Kontrast 1 do 1" #: src/ui/gui/oneway.ui:234 #, fuzzy #| msgid "One-Way ANOVA: Contrasts" msgid "One-Way ANOVA: Post-Hoc" msgstr "Jednoczynikowa ANOVA: Kontrasty" #: src/ui/gui/oneway.ui:270 #, fuzzy #| msgid "Games-Howell" msgid "Games Howell" msgstr "Games-Howell" #: src/ui/gui/oneway.ui:287 msgid "Fisher's LSD" msgstr "" #: src/ui/gui/oneway.ui:379 msgid "One-Way ANOVA" msgstr "Jednoczynnikowa ANOVA" #: src/ui/gui/oneway.ui:408 msgid "_Factor:" msgstr "_Czynnik:" #: src/ui/gui/oneway.ui:451 msgid "Dependent _Variable(s):" msgstr "Zmienne _zależne:" #: src/ui/gui/oneway.ui:593 msgid "_Homogeneity" msgstr "_Homogeniczność" #: src/ui/gui/oneway.ui:637 msgid "Post-Hoc..." msgstr "" #: src/ui/gui/oneway.ui:652 msgid "_Contrasts..." msgstr "_Kontrasty..." #: src/ui/gui/options.ui:25 #, fuzzy #| msgid "Options" msgid "Options Case" msgstr "Opcje" #: src/ui/gui/options.ui:55 #, fuzzy #| msgid "Value _Labels" msgid "Display _Labels" msgstr "_Etykiety" #: src/ui/gui/options.ui:71 #, fuzzy #| msgid "Display" msgid "Display _Names" msgstr "Pokaż" #: src/ui/gui/options.ui:99 #, fuzzy #| msgid "Sort by label" msgid "Sort by L_abel" msgstr "Sortuj według etykiety" #: src/ui/gui/options.ui:115 #, fuzzy #| msgid "Sort by name" msgid "Sort by Na_me" msgstr "Sortuj według nazwy" #: src/ui/gui/options.ui:131 msgid "Do not S_ort" msgstr "" #: src/ui/gui/options.ui:159 #, fuzzy #| msgid "Variables" msgid "Variable Lists" msgstr "Zmienne" #: src/ui/gui/options.ui:184 msgid "Ma_ximize" msgstr "" #: src/ui/gui/options.ui:199 msgid "_Raise" msgstr "" #: src/ui/gui/options.ui:214 msgid "Aler_t" msgstr "" #: src/ui/gui/options.ui:233 msgid "Output Window Action" msgstr "" #: src/ui/gui/paired-samples.ui:147 msgid "_Test Pair(s):" msgstr "_Pary zmiennych:" #: src/ui/gui/rank.ui:30 msgid "Rank Cases: Types" msgstr "Ranguj obserwacje: Typy" #: src/ui/gui/rank.ui:57 msgid "Sum of case _weights" msgstr "Suma wag _obserwacji" #: src/ui/gui/rank.ui:74 msgid "Fractional rank as _%" msgstr "Ranga ułamkowa jako _%" #: src/ui/gui/rank.ui:92 msgid "_Fractional rank" msgstr "Ranga _ułamkowa" #: src/ui/gui/rank.ui:109 msgid "_Savage score" msgstr "Ocena _Savage'a" #: src/ui/gui/rank.ui:125 msgid "_Rank" msgstr "_Ranga" #: src/ui/gui/rank.ui:147 msgid "N_tiles" msgstr "N-_tyle" #: src/ui/gui/rank.ui:195 msgid "_Proportion Estimates" msgstr "_Oceny częstości" #: src/ui/gui/rank.ui:213 msgid "_Normal Scores" msgstr "_Wyniki normalne" #: src/ui/gui/rank.ui:251 msgid "_Blom" msgstr "_Blom" #: src/ui/gui/rank.ui:269 msgid "Tuke_y" msgstr "Tuke_y" #: src/ui/gui/rank.ui:287 msgid "Ran_kit" msgstr "Ran_kit" #: src/ui/gui/rank.ui:305 msgid "_Van der Waerden" msgstr "_Van der Waerden" #: src/ui/gui/rank.ui:328 msgid "Proportion Estimation Formula" msgstr "Formuła estymacji rozkładu" #: src/ui/gui/rank.ui:369 msgid "Rank Cases" msgstr "Ranguj obserwacje" #: src/ui/gui/rank.ui:434 msgid "_By:" msgstr "_Według:" #: src/ui/gui/rank.ui:595 msgid "_Smallest Value" msgstr "_Wartości najmniejszej" #: src/ui/gui/rank.ui:613 msgid "_Largest Value" msgstr "_Wartości największej" #: src/ui/gui/rank.ui:637 msgid "Assign rank 1 to:" msgstr "Przypisz rangę 1 do:" #: src/ui/gui/rank.ui:656 msgid "_Display summary tables" msgstr "_Wyświetl tabele podsumowujące" #: src/ui/gui/rank.ui:679 msgid "Rank T_ypes" msgstr "_Typy rang" #: src/ui/gui/rank.ui:694 msgid "_Ties..." msgstr "_Wiązania" #: src/ui/gui/rank.ui:756 msgid "Rank Cases: Ties" msgstr "Ranguj obserwacje: Wiązania" #: src/ui/gui/rank.ui:788 msgid "_Mean" msgstr "_Średnia" #: src/ui/gui/rank.ui:806 msgid "_Low" msgstr "_Najmniejsza" #: src/ui/gui/rank.ui:825 msgid "_High" msgstr "_Największa" #: src/ui/gui/rank.ui:851 msgid "_Sequential ranks to unique values" msgstr "_Kolejne rangi dla niepowtarzalnych wartości" #: src/ui/gui/rank.ui:875 msgid "Rank Assigned to Ties" msgstr "Rangi przypisane do wiązań" #: src/ui/gui/runs.ui:155 msgid "M_ean" msgstr "Ś_rednia" #: src/ui/gui/runs.ui:171 msgid "Mo_de" msgstr "D_ominanta" #: src/ui/gui/runs.ui:191 msgid "_Custom:" msgstr "_Użytkownika:" #: src/ui/gui/runs.ui:230 msgid "Cut Point" msgstr "Punkt podziału" #: src/ui/gui/sort.ui:25 msgid "Sort Cases" msgstr "Sortuj obserwacje" #: src/ui/gui/sort.ui:101 msgid "Sort by:" msgstr "Sortuj według:" #: src/ui/gui/sort.ui:174 msgid "Descending" msgstr "Malejąca" #: src/ui/gui/sort.ui:196 msgid "Sort Order" msgstr "Kolejność sortowania" #: src/ui/gui/split-file.ui:25 msgid "Split File" msgstr "Podziel dane na podzbiory" #: src/ui/gui/split-file.ui:103 msgid "Anal_yze all cases. Do not create groups." msgstr "Anal_izuj wszystkie obserwacje. Nie twórz grup." #: src/ui/gui/split-file.ui:121 msgid "Compare _groups." msgstr "Porównaj _grupy." #: src/ui/gui/split-file.ui:140 msgid "Organize ou_tput by groups." msgstr "Przedstaw _wyniki w podziale na grupy." #: src/ui/gui/split-file.ui:225 msgid "Groups _based on:" msgstr "Grupy _wyróżnione na podstawie:" #: src/ui/gui/split-file.ui:255 msgid "_Sort the file by grouping variables." msgstr "_Sortuj plik według zmiennych grupujących." #: src/ui/gui/split-file.ui:273 msgid "_File is already sorted." msgstr "_Plik jest już posortowany." #: src/ui/gui/split-file.ui:334 msgid "Current Status : " msgstr "Obecny stan :" #: src/ui/gui/split-file.ui:348 msgid "Analysis by groups is off" msgstr "Analiza w grupach jest wyłączona" #: src/ui/gui/recode.ui:135 msgid "System _Missing" msgstr "Brak _systemowy" #: src/ui/gui/recode.ui:150 msgid "Co_py old values" msgstr "Ko_piuj stare wartości" #: src/ui/gui/recode.ui:172 msgid "Va_lue: " msgstr "Wa_rtość:" #: src/ui/gui/recode.ui:276 msgid "Conver_t numeric strings to numbers (`5' -> 5)" msgstr "Przekształć wyrażenia numeryczne na liczby (`5' -> 5)" #: src/ui/gui/recode.ui:297 msgid "Output variables are _strings" msgstr "Raportowane zmienne są _tekstowe" #: src/ui/gui/recode.ui:318 msgid "Width: " msgstr "Szerokość:" #: src/ui/gui/recode.ui:499 msgid "_Name:" msgstr "_Nazwa:" #: src/ui/gui/recode.ui:527 msgid "La_bel:" msgstr "Et_ykieta:" #: src/ui/gui/recode.ui:556 msgid "Chan_ge" msgstr "Zmia_na" #: src/ui/gui/recode.ui:584 msgid "Output Variable" msgstr "Zmienna wynikowa" #: src/ui/gui/recode.ui:658 msgid "Old and New Va_lues..." msgstr "W_artości źródłowe i wynikowe..." #: src/ui/gui/regression.ui:51 msgid "S_tatistics..." msgstr "S_tatystyki..." #: src/ui/gui/regression.ui:272 msgid "Regression: Save" msgstr "Regresja: Zapisz" #: src/ui/gui/regression.ui:290 src/ui/gui/univariate.ui:42 msgid "_Predicted values" msgstr "Wartości _oczekiwane" #: src/ui/gui/regression.ui:307 src/ui/gui/univariate.ui:59 msgid "_Residuals" msgstr "_Błędy aproksymacji (Residuals)" #: src/ui/gui/regression.ui:351 msgid "Regression: Statistics" msgstr "Regresja: Statystyki" #: src/ui/gui/regression.ui:393 src/ui/gui/univariate.ui:143 msgid "S_tatistics" msgstr "S_tatystyki" #: src/ui/gui/reliability.ui:34 msgid "Alpha" msgstr "Alfa" #: src/ui/gui/reliability.ui:43 msgid "Reliability Analysis" msgstr "Analiza rzetelności" #: src/ui/gui/reliability.ui:144 msgid "_Items:" msgstr "_Elementy:" #: src/ui/gui/reliability.ui:166 msgid "_Model: " msgstr "_Model:" #: src/ui/gui/reliability.ui:212 msgid "_Variables in first split:" msgstr "_Zmienne w pierwszym podziale:" #: src/ui/gui/reliability.ui:259 msgid "Show _descriptives for scale if item is deleted" msgstr "Pokaż _statystyki dla skali po usunięciu pozycji" #: src/ui/gui/roc.ui:145 msgid "_Test Variable:" msgstr "_Zmienna testowane" #: src/ui/gui/roc.ui:175 msgid "_State Variable:" msgstr "_Zmienna stanu" #: src/ui/gui/roc.ui:202 msgid "_Value of state variable:" msgstr "_Wartość zmiennej stanu:" #: src/ui/gui/roc.ui:249 msgid "ROC C_urve" msgstr "K_rzywa ROC" #: src/ui/gui/roc.ui:269 msgid "_With diagonal reference line" msgstr "_Z przekątną linią referencyjną" #: src/ui/gui/roc.ui:293 msgid "Standard _Error and Confidence Interval" msgstr "_Błąd standardowy oraz przedział ufności" #: src/ui/gui/roc.ui:309 msgid "_Coordinate points of the ROC Curve" msgstr "_Współrzędne punktów krzywej ROC" #: src/ui/gui/scatterplot.ui:25 #, fuzzy #| msgid "_Scree plot" msgid "Scatterplot" msgstr "_Wykres osypiska" #: src/ui/gui/scatterplot.ui:56 msgid "_X Axis:" msgstr "" #: src/ui/gui/scatterplot.ui:100 msgid "_Y Axis:" msgstr "" #: src/ui/gui/select-cases.ui:37 msgid "Select Cases: Range" msgstr "Wybierz obserwacje: Zakres" #: src/ui/gui/select-cases.ui:87 msgid "First case" msgstr "Pierwsza obserwacja" #: src/ui/gui/select-cases.ui:99 msgid "Last case" msgstr "Ostatnia obserwacja" #: src/ui/gui/select-cases.ui:111 msgid "Observation" msgstr "Obserwacja" #: src/ui/gui/select-cases.ui:161 msgid "Select Cases" msgstr "Wybierz obserwacje" #: src/ui/gui/select-cases.ui:313 msgid "Use filter variable" msgstr "Użyj zmiennej filtrującej" #: src/ui/gui/select-cases.ui:380 msgid "Based on time or case range" msgstr "Na podstawie czasu lub zakresu obserwacji" #: src/ui/gui/select-cases.ui:395 msgid "Range..." msgstr "Zakres..." #: src/ui/gui/select-cases.ui:444 msgid "Random sample of cases" msgstr "Próba losowa obserwacji" #: src/ui/gui/select-cases.ui:460 msgid "Sample..." msgstr "Próba..." #: src/ui/gui/select-cases.ui:508 msgid "If condition is satisfied" msgstr "Jeśli spełniony jest warunek" #: src/ui/gui/select-cases.ui:523 msgid "If..." msgstr "Jeśli..." #: src/ui/gui/select-cases.ui:567 msgid "All Cases" msgstr "Wszystkie obserwacje" #: src/ui/gui/select-cases.ui:581 msgid "Select" msgstr "Wybierz" #: src/ui/gui/select-cases.ui:608 msgid "Filtered" msgstr "Filtrowane" #: src/ui/gui/select-cases.ui:625 msgid "Deleted" msgstr "Usunięte" #: src/ui/gui/select-cases.ui:647 msgid "Unselected Cases Are" msgstr "Niezaznaczone obserwacje są" #: src/ui/gui/select-cases.ui:694 msgid "Select Cases: Random Sample" msgstr "Wybierz obserwacje: Losowe obserwacje" #: src/ui/gui/select-cases.ui:756 msgid "Sample Size" msgstr "Wielkość próby" #: src/ui/gui/t-test.ui:25 msgid "Options" msgstr "Opcje" #: src/ui/gui/t-test.ui:63 msgid "Exclude cases _analysis by analysis" msgstr "Wyklucz obserwacje _analiza po analizie" #: src/ui/gui/t-test.ui:148 msgid "One - Sample T Test" msgstr "Test t dla jednej próby" #: src/ui/gui/t-test.ui:265 msgid "Test _Value: " msgstr "Wartość _testowana:" #: src/ui/gui/text-data-import.ui:32 msgid "Select the first line of the data file that contains data." msgstr "Zaznacz pierwszy wiersz, który zawiera obserwacje" #: src/ui/gui/text-data-import.ui:54 msgid "Line above selected line contains variable names" msgstr "Nazwy zmiennych znajdują się wiersz powyżej wybranego" #: src/ui/gui/text-data-import.ui:80 msgid "" "Check the data formats displayed below and fix any that are incorrect. You " "may set other variable properties now or later." msgstr "" "Sprawdź, czy format danych wyświetlonych poniżej jest poprawny oraz popraw " "te, które są nieprawidłowe. Możesz ustalić właściwości innych zmiennych " "teraz lub później." #: src/ui/gui/text-data-import.ui:121 msgid "Variables" msgstr "Zmienne" #: src/ui/gui/text-data-import.ui:152 msgid "Data Preview" msgstr "Podgląd danych" #: src/ui/gui/text-data-import.ui:181 #, fuzzy #| msgid "" #| "This assistant will guide you through the process of importing data into " #| "PSPP from a text file with one line per case, in which fields are " #| "separated by tabs, commas, or other delimiters.\n" #| "\n" #| "The selected file contains N lines of text. Only the first M of these " #| "will be shown for preview purposes in the following screens. You may " #| "choose below how much of the file should actually be imported." msgid "" "This assistant will guide you through the process of importing data into " "PSPP from a text file with one line per case, in which fields are separated " "by tabs, commas, or other delimiters.\n" "\n" "\tThe selected file contains N lines of text. Only the first M of these " "will be shown for preview purposes in the following screens. You may choose " "below how much of the file should actually be imported." msgstr "" "Ten kreator pomoże Ci przejść proces importowania danych do PSPP z pliku " "tekstowego. Każda przypadek powinien być zapisany w oddzielnym wierszu, a " "kolejne obserwacja powinny być oddzielone tabulatorami, przecinkami lub " "innymi znakami.\n" "\n" "Wybrany plik zawiera N wierszy tekstu. Tylko pierwsze M z nich będzie " "wyświetlone w celu podglądu. Poniżej możesz wybrać jak duża część pliku " "faktycznie będzie zaimportowana." #: src/ui/gui/text-data-import.ui:252 msgid "All cases" msgstr "Wszystkie obserwacje" #: src/ui/gui/text-data-import.ui:272 msgid "Amount to Import" msgstr "Ilość do zaimportowania" #: src/ui/gui/text-data-import.ui:325 msgid "C_ustom" msgstr "_Inny znak" #: src/ui/gui/text-data-import.ui:341 msgid "Slas_h (/)" msgstr "Ukośni_k(/)" #: src/ui/gui/text-data-import.ui:357 msgid "Semicolo_n (;)" msgstr "Średni_k(;)" #: src/ui/gui/text-data-import.ui:373 msgid "P_ipe (|)" msgstr "K_reska pionowa (|)" #: src/ui/gui/text-data-import.ui:389 msgid "H_yphen (-)" msgstr "M_yślnik(-)" #: src/ui/gui/text-data-import.ui:405 msgid "Co_mma (,)" msgstr "Prze_cinek(,)" #: src/ui/gui/text-data-import.ui:421 msgid "_Colon (:)" msgstr "_Dwukropek(:)" #: src/ui/gui/text-data-import.ui:437 msgid "Ban_g (!)" msgstr "Wykrzykni_k(!)" #: src/ui/gui/text-data-import.ui:453 msgid "Ta_b" msgstr "Ta_b" #: src/ui/gui/text-data-import.ui:469 msgid "_Space" msgstr "_Spacja" #: src/ui/gui/text-data-import.ui:490 msgid "Separators" msgstr ">b>Separatory" #: src/ui/gui/text-data-import.ui:541 msgid "Quote separator characters with" msgstr "Separator biorący znaki w cudzysłów z" #: src/ui/gui/text-data-import.ui:561 msgid "Quoting" msgstr "Cytowanie" #: src/ui/gui/text-data-import.ui:599 msgid "Fields Preview" msgstr "Podgląd" #: src/ui/gui/text-data-import.ui:622 msgid "" "Enter below the sheet number and the cell range which you wish to import." msgstr "" "Wprowadź poniżej liczbę arkuszy i zakres komórek, które chcesz zaimportować." #: src/ui/gui/text-data-import.ui:670 msgid "_Cells: " msgstr "_Komórki:" #: src/ui/gui/text-data-import.ui:684 msgid "_Sheet Index: " msgstr "_Wskaźnik arkusza" #: src/ui/gui/text-data-import.ui:695 msgid "Use first row as _variable names" msgstr "Użyj pierwszego wiersza jako _nazwy zmiennych" #: src/ui/gui/text-data-import.ui:717 msgid "Cells to Import" msgstr "Komórki do zaimporotwania" #: src/ui/gui/transpose.ui:24 msgid "Transpose" msgstr "Transponuj" #: src/ui/gui/transpose.ui:91 msgid "Name Variable:" msgstr "Nazwy zmiennych:" #: src/ui/gui/transpose.ui:127 msgid "Variable(s):" msgstr "Zmienne:" #: src/ui/gui/univariate.ui:25 msgid "Univariate: Save" msgstr "Jednoczynnikowa: Zapisz" #: src/ui/gui/univariate.ui:103 msgid "Univariate: Statistics" msgstr "Jednoczynnikowa: Statystyki" #: src/ui/gui/univariate.ui:178 msgid "Univariate" msgstr "Jednoczynnikowa" #: src/ui/gui/univariate.ui:281 msgid "_Dependent Variable" msgstr "_Zmienna zależna" #: src/ui/gui/univariate.ui:329 msgid "_Fixed Factors" msgstr "_Czynniki stałe" #: src/ui/gui/val-labs-dialog.ui:101 msgid "Value Label:" msgstr "Etykieta:" #: src/ui/gui/data-editor.ui:33 msgid "Information Area" msgstr "Obszar informacji" #: src/ui/gui/data-editor.ui:55 msgid "Case Counter Area" msgstr "Obszar liczenia obserwacji" #: src/ui/gui/data-editor.ui:80 msgid "Filter Use Status Area" msgstr "Obszar pozycji filtrowania" #: src/ui/gui/data-editor.ui:106 msgid "Weight Status Area" msgstr "Obszar pozycji ważenia obserwacji" #: src/ui/gui/data-editor.ui:132 msgid "Split File Status Area" msgstr "Obszar pozycji podziału pliku" #: src/ui/gui/data-editor.ui:154 msgid "_View" msgstr "_Widok" #: src/ui/gui/data-editor.ui:157 msgid "_Status Bar" msgstr "_Pasek stanu" #: src/ui/gui/data-editor.ui:163 msgid "_Font..." msgstr "_Czcionka..." #: src/ui/gui/data-editor.ui:167 msgid "_Grid Lines" msgstr "_Linie siatki" #: src/ui/gui/data-editor.ui:171 msgid "Value _Labels" msgstr "_Etykiety" #: src/ui/gui/data-editor.ui:182 msgid "_Variables" msgstr "_Zmienne" #: src/ui/gui/data-editor.ui:192 msgid "_Sort Cases..." msgstr "_Sortuj zmienne" #: src/ui/gui/data-editor.ui:196 msgid "_Transpose..." msgstr "_Transponuj..." #: src/ui/gui/data-editor.ui:200 msgid "_Aggregate..." msgstr "_Agreguj..." #: src/ui/gui/data-editor.ui:206 msgid "S_plit File..." msgstr "P_odziel dane na podzbiory..." #: src/ui/gui/data-editor.ui:210 msgid "Select _Cases..." msgstr "Wybierz _obserwacje..." #: src/ui/gui/data-editor.ui:214 msgid "_Weight Cases..." msgstr "_Ważenie obserwacji" #: src/ui/gui/data-editor.ui:220 msgid "_Transform" msgstr "_Przekształcenia" #: src/ui/gui/data-editor.ui:223 msgid "_Compute..." msgstr "_Oblicz..." #: src/ui/gui/data-editor.ui:227 msgid "Cou_nt..." msgstr "Zlicz wys_tąpienia..." #: src/ui/gui/data-editor.ui:231 msgid "Ran_k Cases..." msgstr "Ran_guj obserwacje..." #: src/ui/gui/data-editor.ui:235 msgid "Auto_matic Recode..." msgstr "Rekodowanie auto_matyczne..." #: src/ui/gui/data-editor.ui:241 msgid "Recode into _Same Variables..." msgstr "Rekoduj na te _same zmienne..." #: src/ui/gui/data-editor.ui:245 msgid "Recode into _Different Variables..." msgstr "Rekoduj na _inne zmienne..." #: src/ui/gui/data-editor.ui:251 msgid "_Run Pending Transforms" msgstr "_Wykonaj zawieszone" #: src/ui/gui/data-editor.ui:257 msgid "_Analyze" msgstr "_Analiza" #: src/ui/gui/data-editor.ui:260 msgid "_Descriptive Statistics" msgstr "_Opis statystyczny" #: src/ui/gui/data-editor.ui:262 msgid "_Frequencies..." msgstr "_Częstości..." #: src/ui/gui/data-editor.ui:270 msgid "_Explore..." msgstr "_Eksploracja..." #: src/ui/gui/data-editor.ui:274 msgid "_Crosstabs..." msgstr "_Tabele krzyżowe..." #: src/ui/gui/data-editor.ui:279 msgid "Compare _Means" msgstr "Porównywanie _średnich" #: src/ui/gui/data-editor.ui:281 msgid "_Means..." msgstr "_Średnie..." #: src/ui/gui/data-editor.ui:285 msgid "_One Sample T Test..." msgstr "_Test t dla jednej próby" #: src/ui/gui/data-editor.ui:289 msgid "_Independent Samples T Test..." msgstr "_Test t dla prób niezależnych" #: src/ui/gui/data-editor.ui:293 msgid "_Paired Samples T Test..." msgstr "_Test t dla prób zależnych" #: src/ui/gui/data-editor.ui:297 msgid "One Way _ANOVA..." msgstr "Jednoczynnikowa _ANOVA..." #: src/ui/gui/data-editor.ui:302 msgid "_Univariate Analysis..." msgstr "_Analiza jednoczynnikowa..." #: src/ui/gui/data-editor.ui:306 msgid "Bivariate _Correlation..." msgstr "Korelacje _parami..." #: src/ui/gui/data-editor.ui:310 msgid "_K-Means Cluster..." msgstr "_Analiza skupień metodą k-średnich" #: src/ui/gui/data-editor.ui:314 #, fuzzy #| msgid "Factor _Analysis..." msgid "_Factor Analysis..." msgstr "Analiza _czynnikowa..." #: src/ui/gui/data-editor.ui:318 msgid "Re_liability..." msgstr "_Rzetelność..." #: src/ui/gui/data-editor.ui:322 msgid "_Regression" msgstr "_Regresja" #: src/ui/gui/data-editor.ui:325 msgid "_Linear..." msgstr "_Liniowa..." #: src/ui/gui/data-editor.ui:329 msgid "_Binary Logistic..." msgstr "_Logistyczna..." #: src/ui/gui/data-editor.ui:335 msgid "_Non-Parametric Statistics" msgstr "_Statystyki nieparametryczne" #: src/ui/gui/data-editor.ui:338 #, fuzzy #| msgid "_Chi-Square..." msgid "_Chi Square..." msgstr "_Chi-Kwadrat" #: src/ui/gui/data-editor.ui:342 msgid "_Binomial..." msgstr "_Dwumianowy..." #: src/ui/gui/data-editor.ui:346 #, fuzzy #| msgid "R_uns..." msgid "_Runs..." msgstr "S_erii.." #: src/ui/gui/data-editor.ui:350 #, fuzzy #| msgid "1-Sample _K-S..." msgid "_1 Sample K-S..." msgstr "K-S _Dla jednej próby" #: src/ui/gui/data-editor.ui:354 #, fuzzy #| msgid "2 _Related Samples..." msgid "_2 Related Samples..." msgstr "Dwie _Próby zależne" #: src/ui/gui/data-editor.ui:358 #, fuzzy #| msgid "K Related _Samples..." msgid "_K Related Samples..." msgstr "K Prób _zależnych" #: src/ui/gui/data-editor.ui:362 #, fuzzy #| msgid "_Independent Samples T Test..." msgid "K _Independent Samples..." msgstr "_Test t dla prób niezależnych" #: src/ui/gui/data-editor.ui:368 msgid "ROC Cur_ve..." msgstr "Krz_ywa ROC" #: src/ui/gui/data-editor.ui:374 msgid "_Graphs" msgstr "" #: src/ui/gui/data-editor.ui:377 #, fuzzy #| msgid "_Scree plot" msgid "_Scatterplot" msgstr "_Wykres osypiska" #: src/ui/gui/data-editor.ui:381 #, fuzzy #| msgid "Draw _histograms" msgid "_Histogram" msgstr "Rysuj histogramy" #: src/ui/gui/data-editor.ui:385 msgid "_Barchart" msgstr "" #: src/ui/gui/data-editor.ui:391 msgid "_Utilities" msgstr "_Narzędzia" #: src/ui/gui/data-editor.ui:394 msgid "_Variables..." msgstr "_Zmienne..." #: src/ui/gui/data-editor.ui:398 msgid "Data File _Comments..." msgstr "_Komentarze do danych..." #: src/ui/gui/output-window.ui:71 msgid "_Print..." msgstr "_Drukuj..." #: src/ui/gui/output-window.ui:76 msgid "_Export..." msgstr "_Eksportuj..." #: src/ui/gui/output-window.ui:92 msgid "Select _All" msgstr "Zaznacz _Wszystkie" #: src/ui/gui/syntax-editor.ui:27 #, fuzzy #| msgid "_Syntax" msgid "Syntax" msgstr "_Skrypt" #: src/ui/gui/syntax-editor.ui:31 #, fuzzy #| msgid "_Data" msgid "Data" msgstr "_Dane" #: src/ui/gui/syntax-editor.ui:41 msgid "_Save" msgstr "_Zapisz" #: src/ui/gui/syntax-editor.ui:46 #, fuzzy #| msgid "Save _As..." msgid "Save _As" msgstr "Zapisz _jako..." #: src/ui/gui/syntax-editor.ui:53 #, fuzzy #| msgid "_Print..." msgid "_Print" msgstr "_Drukuj..." #: src/ui/gui/syntax-editor.ui:84 #, fuzzy #| msgid "Deleted" msgid "_Delete" msgstr "Usunięte" #: src/ui/gui/syntax-editor.ui:90 msgid "_Undo" msgstr "" #: src/ui/gui/syntax-editor.ui:94 msgid "_Redo" msgstr "" #: src/ui/gui/syntax-editor.ui:100 #, fuzzy #| msgid "_Find..." msgid "_Find" msgstr "_Znajdź..." #: src/ui/gui/syntax-editor.ui:106 msgid "_Run" msgstr "_Uruchom" #: src/ui/gui/syntax-editor.ui:109 msgid "_All" msgstr "" #: src/ui/gui/syntax-editor.ui:113 #, fuzzy #| msgid "Selection" msgid "_Selection" msgstr "Wybór" #: src/ui/gui/syntax-editor.ui:117 #, fuzzy #| msgid "Current Line" msgid "_Current Line" msgstr "Bieżąca linia" #: src/ui/gui/syntax-editor.ui:122 #, fuzzy #| msgid "To End" msgid "_To End" msgstr "Do końca" #: src/ui/gui/var-type-dialog.ui:99 msgid "Scientific notation" msgstr "Notacja naukowa" #: src/ui/gui/var-type-dialog.ui:150 msgid "Custom currency" msgstr "Inna waluta" #: src/ui/gui/var-type-dialog.ui:267 msgid "positive" msgstr "dodatnie" #: src/ui/gui/var-type-dialog.ui:279 msgid "negative" msgstr "ujemne" #: src/ui/gui/var-type-dialog.ui:293 msgid "Sample" msgstr "Próba" #: src/ui/gui/var-type-dialog.ui:350 msgid "Width:" msgstr "Szerokość:" #: src/ui/gui/var-type-dialog.ui:396 msgid "Decimal Places:" msgstr "Miejsca dziesiętne:" #: src/ui/gui/weight.ui:24 msgid "Weight Cases" msgstr "Ważenie obserwacji" #: src/ui/gui/weight.ui:100 msgid "Weight cases by" msgstr "Zważ obserwacje" #: src/ui/gui/weight.ui:144 msgid "Frequency Variable" msgstr "Zmienna ważąca" #: src/ui/gui/weight.ui:198 msgid "Current Status: " msgstr "Obecny stan: " #. TRANSLATORS: This is the application name in the desktop file #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:7 #: src/ui/gui/org.fsf.pspp.desktop.in:7 msgid "GNU PSPP" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:8 #, fuzzy #| msgid "A program for the analysis of sampled data" msgid "GNU PSPP is a program for statistical analysis of sampled data" msgstr "Program do analizy danych" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:10 msgid "" "GNU PSPP is a program for the statistical analysis of sampled data. It is a " "Free replacement for the proprietary program SPSS, and appears very similar " "to it with a few exceptions. The most important of these exceptions are, " "that there are no “time bombs”; your copy of PSPP will not “expire” or " "deliberately stop working in the future. Neither are there any artificial " "limits on the number of cases or variables which you can use. There are no " "additional packages to purchase in order to get “advanced” functions; all " "functionality that PSPP currently supports is in the core package." msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:11 msgid "" "PSPP is a stable and reliable application. It can perform descriptive " "statistics, T-tests, anova, linear and logistic regression, measures of " "association, cluster analysis, reliability and factor analysis, non-" "parametric tests and more. Its backend is designed to perform its analyses " "as fast as possible, regardless of the size of the input data. You can use " "PSPP with its graphical interface or the more traditional syntax commands." msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:12 msgid "A brief list of some of the PSPP's features." msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:14 msgid "Support for over 1 billion cases" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:15 msgid "Support for over 1 billion variables" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:16 msgid "Syntax and data files which are compatible with those of SPSS" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:17 msgid "A choice of terminal or graphical user interface" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:18 msgid "A choice of text, postscript, pdf, opendocument or html output formats" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:19 msgid "" "Inter-operability with: LibreOffice, Apache OpenOffice, Gnumeric and other " "free software" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:20 msgid "Easy data import from spreadsheets, text files and database sources" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:21 msgid "" "The capability to open, analyse and edit two or more datasets concurrently" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:22 msgid "A user interface supporting all common character sets" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:23 msgid "A user interface has been translated to multiple languages" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:24 msgid "Very fast statistical procedures, even on very large data sets" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:25 msgid "No license fees and no expiration period" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:26 msgid "No unethical “end user license agreements”" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:27 msgid "A fully indexed user manual" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:28 msgid "Freedom ensured; It is licensed under the GPLv3 or later" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:29 msgid "" "Portability; Runs on many different computers and many different operating " "systems" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:31 msgid "" "PSPP is particularly aimed at statisticians, social scientists and students " "requiring fast convenient analysis of sampled data." msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:41 #, fuzzy #| msgid "Variable View" msgid "GNU PSPP Variable View" msgstr "Zmienne" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:54 msgid "Free Software Foundation" msgstr "" #: src/ui/gui/org.fsf.pspp.desktop.in:8 msgid "Statistical Software" msgstr "Oprogramowanie Statystyczne" #: src/ui/gui/org.fsf.pspp.desktop.in:9 msgid "Analyze statistical data with a free alternative to SPSS" msgstr "" "Wykonuj analizy statystyczny na swoich danych za pomocą darmowej alternatywy " "dla SPSS" #. TRANSLATORS: Do not translate this string. Keep it as is, verbatim. #: src/ui/gui/org.fsf.pspp.desktop.in:12 msgid "pspp" msgstr "" #. TRANSLATORS: You must keep all ";" - also at the end of line. #: src/ui/gui/org.fsf.pspp.desktop.in:17 msgid "statistics;analysis;spss;" msgstr "" #~ msgid "Sorry. The help system hasn't yet been implemented." #~ msgstr "Przepraszamy. System pomocy nie został jeszcze zaimplementowany." #~ msgid "Support for %s files was not compiled into this installation of PSPP" #~ msgstr "Wsparcie dla plików %s nie zostało zawarte w tej instalacji PSPP" #~ msgid "Multiple response set name `%s' does not begin with `$'." #~ msgstr "" #~ "Nazwa zbioru wielokrotnych odpowiedzi `%s' nie rozpoczyna się od `$'." #~ msgid "expecting number or data string" #~ msgstr "Oczekiwana liczba lub łańuch danych." #~ msgid "Details" #~ msgstr "Szczegóły" #~ msgid "Multiple dichotomy set" #~ msgstr "Zbiór wielokrotnej dychotomii" #~ msgid "Multiple category set" #~ msgstr "Zbiór wielokrotnych kategorii" #~ msgid "Label source" #~ msgstr "Źródło etykiety" #~ msgid "First variable label among variables" #~ msgstr "Pierwsza etykieta zmiennej pośród zmiennych" #~ msgid "Provided by user" #~ msgstr "Dostarczone przez użytkownika" #~ msgid "Variable labels" #~ msgstr "Etykiety zmiennych" #~ msgid "Value labels of counted value" #~ msgstr "Etykiety wartości dla obliczonych wartości" #~ msgid "Label:" #~ msgstr "Etykieta:" #~ msgid "No label." #~ msgstr "Brak etykiety." #~ msgid "Product:" #~ msgstr "Produkt:" #~ msgid "Variables:" #~ msgstr "Zmienne:" #~ msgid "Cases:" #~ msgstr "Obserwacje:" #~ msgid "Type:" #~ msgstr "Typ:" #~ msgid "Description" #~ msgstr "Opis" #~ msgid "The active dataset does not have a file label." #~ msgstr "Aktywny zbiór danych nie posiada etykiety pliku." #~ msgid "File label: %s" #~ msgstr "Etykieta pliku: %s" #~ msgid "The active dataset dictionary does not contain any documents." #~ msgstr "" #~ "W słowniku danych aktywnego zbioru nie odnaleziono żadnych dokumentów." #~ msgid "Documents in the active dataset:" #~ msgstr "Dokumenty w aktywnym zbiorze danych:" #~ msgid "Custom data file attributes." #~ msgstr "Cechy innych baz danych." #~ msgid "Label: %s\n" #~ msgstr "Etykieta: %s\n" #~ msgid "Format: %s\n" #~ msgstr "Format: %s\n" #~ msgid "Print Format: %s\n" #~ msgstr "Format druku: %s\n" #~ msgid "Write Format: %s\n" #~ msgstr "Format zapisu: %s\n" #~ msgid "Measure: %s\n" #~ msgstr "Pomiar: %s\n" #~ msgid "Role: %s\n" #~ msgstr "Rola: %s\n" #~ msgid "Display Alignment: %s\n" #~ msgstr "Wyświetl wyrównanie: %s\n" #~ msgid "Display Width: %d\n" #~ msgstr "Wyświetl szerokość: %d\n" #~ msgid "Missing Values: " #~ msgstr "Braki danych:" #~ msgid "Interactive shell not supported on this platform." #~ msgstr "Powłoka interaktywna nie jest obslugiwana na tej platformie." #~ msgid "Error executing command: %s." #~ msgstr "Błąd wykonywania komendy: %s." #~ msgid "Unknown TABLECELLS class" #~ msgstr "Nieznana klasa TABLECELLS" #~ msgid "Exact Sig. (%d-tailed)" #~ msgstr "Dokładna istotność (%d-stronna" #~ msgid "Valid N" #~ msgstr "Ważne N" #~ msgid "Missing N" #~ msgstr "Braki N" #~ msgid "Valid cases = %.*g; cases with missing value(s) = %.*g." #~ msgstr "Ważne obserwacja = %.*g; obserwacja z brakami danych = %.*g." #~ msgid "%g" #~ msgstr "%g" #~ msgid "%d" #~ msgstr "%d" #~ msgid "%zu" #~ msgstr "%zu" #~ msgid "Bar charts are not implemented." #~ msgstr "Wykresy słupkowe nie są jeszcze zaimplementowane." #~ msgid "No valid data for variable %s; statistics not displayed." #~ msgstr "" #~ "Brak ważnych obserwacji dla zmiennej %s; statystyki nie zostaną " #~ "wyświetlone." #~ msgid "50 (Median)" #~ msgstr "50 (Mediana)" #~ msgid "(%d)" #~ msgstr "(%d)" #~ msgid "Min" #~ msgstr "Min" #~ msgid "Max" #~ msgstr "Max" #~ msgid "%g%%" #~ msgstr "%g%%" #~ msgid "25th" #~ msgstr "25ty" #~ msgid "50th (Median)" #~ msgstr "50ty (mediana)" #~ msgid "75th" #~ msgstr "75ty" #~ msgid "(I) %s" #~ msgstr "(I) %s" #~ msgid "(J) %s" #~ msgstr "(J) %s" #~ msgid "(I - J)" #~ msgstr "(I - J)" #~ msgid "Number of clusters may not be larger than the number of cases." #~ msgstr "Liczba skupień nie może być większa niż liczba przypadków." #~ msgid "%s into %s(%s of %s using %s BY %s)" #~ msgstr "%s na %s(%s z %s używając %s BY %s)" #~ msgid "%s into %s(%s of %s BY %s)" #~ msgstr "%s na %s(%s z %s BY %s)" #~ msgid "%s into %s(%s of %s using %s)" #~ msgstr "%s na %s(%s z %s używając %s)" #~ msgid "%s into %s(%s of %s)" #~ msgstr "%s na %s(%s z %s)" #~ msgid "Area Under the Curve (%s)" #~ msgstr "Powierzchnia pod krzywą (%s)" #~ msgid "Coordinates of the Curve (%s)" #~ msgstr "Współrzędna krzywej (%s)" #~ msgid "Std. Error Mean" #~ msgstr "Błąd standardowy średniej" #~ msgid "(active dataset)" #~ msgstr "(aktywny zbiór danych)" #~ msgid "Writing %zu record to %s." #~ msgid_plural "Writing %zu records to %s." #~ msgstr[0] "Zapisywanie pozycji %zu do %s." #~ msgstr[1] "Zapisywanie pozycji %zu do %s." #~ msgstr[2] "Zapisywanie pozycji %zu do %s." #~ msgid "Writing %zu record." #~ msgid_plural "Writing %zu records." #~ msgstr[0] "Zapisywanie pozycji %zu." #~ msgstr[1] "Zapisywanie pozycji %zu." #~ msgstr[2] "Zapisywanie pozycji %zu." #~ msgid "Failed to seek to end of central directory record: %s" #~ msgstr "" #~ "Poszukiwanie końca pliku katalogu centralnego zakończyło się " #~ "niepowodzeniem: %s" #~ msgid "Failed to seek to central directory: %s" #~ msgstr "Nie udało się odnaleźć katalogu centralnego: %s" #~ msgid "Failed to seek to start of member `%s': %s" #~ msgstr "Nie udało się wyszukać poczatku członka `%s': %s" #~ msgid "ascii: closing output file `%s'" #~ msgstr "ascii: zamykanie pliku raportu `%s'" #~ msgid "%s - Page %d" #~ msgstr "%s - Strona %d" #~ msgid "bad vline: x=%d+%d=%d y=(%d+%d=%d,%d+%d=%d) in table size (%d,%d)\n" #~ msgstr "" #~ "zła vline: x=%d+%d=%d y=(%d+%d=%d,%d+%d=%d) w rozmiarze tabeli (%d,%d)\n" #~ msgid "bad hline: x=(%d+%d=%d,%d+%d=%d) y=%d+%d=%d in table size (%d,%d)\n" #~ msgstr "" #~ "zła hline: x=(%d+%d=%d,%d+%d=%d) y=%d+%d=%d w rozmiarze tabeli (%d,%d)\n" #~ msgid "" #~ "bad box: (%d+%d=%d,%d+%d=%d)-(%d+%d=%d,%d+%d=%d) in table size (%d,%d)\n" #~ msgstr "" #~ "złe box: (%d+%d=%d,%d+%d=%d)-(%d+%d=%d,%d+%d=%d) w rozmiarze tabeli (%d," #~ "%d)\n" #~ msgid "could not access definition for terminal `%s'" #~ msgstr "nie można uzyskać dostępu do definicji dla terminala `%s'" #~ msgid "TreeView path" #~ msgstr "Widok ścieżki drzewa" #~ msgid "The path to the row in the GtkTreeView, as a string" #~ msgstr "Ścieżka do wiersza w GtkTreeView, jako tekst" #~ msgid "Diagonal slash" #~ msgstr "Ukośnik" #~ msgid "Whether to draw a diagonal slash across the button." #~ msgstr "Czy napisać ukośnik pomiędzy przyciskiem." #~ msgid "" #~ "PSPPIRE, a GUI for PSPP, a program for statistical analysis of sampled " #~ "data.\n" #~ "Usage: %s [OPTION]... FILE\n" #~ "\n" #~ "Arguments to long options also apply to equivalent short options.\n" #~ "\n" #~ "GUI options:\n" #~ " -q, --no-splash don't show splash screen during startup\n" #~ "\n" #~ "%sLanguage options:\n" #~ " -I, --include=DIR append DIR to search path\n" #~ " -I-, --no-include clear search path\n" #~ " -a, --algorithm={compatible|enhanced}\n" #~ " set to `compatible' if you want output\n" #~ " calculated from broken algorithms\n" #~ " -x, --syntax={compatible|enhanced}\n" #~ " set to `compatible' to disable PSPP " #~ "extensions\n" #~ " -i, --interactive interpret syntax in interactive mode\n" #~ " -s, --safer don't allow some unsafe operations\n" #~ "Default search path: %s\n" #~ "\n" #~ "Informative output:\n" #~ " -h, --help display this help and exit\n" #~ " -V, --version output version information and exit\n" #~ "\n" #~ "A non-option argument is interpreted as a data file in .sav or .zsav or ." #~ "por\n" #~ "format or a syntax file to load.\n" #~ msgstr "" #~ "PSPPIRE, GUI dla PSPP, program służący analizie danych.\n" #~ "Zastosowanie: %s [OPTION]...FILE...\n" #~ "\n" #~ "Argumenty w długich formach posiadają również skrócone wersje.\n" #~ "\n" #~ "Opcje GUI:\n" #~ "-q, --no-splash nie pokazuj ekranu ładującego podczas " #~ "uruchamiania\n" #~ "\n" #~ "%sOpcje językowe:\n" #~ " -I, --include=DIR dodaj DIR do ścieżki szukania\n" #~ " -I-, --no-include wyczyść ścieżkę szukania\n" #~ " -a, --algorithm={compatible|enhanced}\n" #~ " set to `compatible' if you want output\n" #~ " obliczanie z blokowanych algorytmów\n" #~ " -x, --syntax={compatible|enhanced}\n" #~ " ustawione na `compatible' aby zablokować " #~ "rozszerzenia PSPP\n" #~ " -i, --interactive interpretuj syntax w trybie interaktywnym\n" #~ " -s, --safer nie zezwala na wykonywanie niektórych " #~ "niebezpiecznych operacji\n" #~ "Domyślna ścieżka szukania: %s\n" #~ "\n" #~ "Raport informacji:\n" #~ " -h, --help wyświetla pomoc i wyjście\n" #~ " -V, --version informacje o wersji raportu i wyjście\n" #~ "\n" #~ "Argumenty nie przeznaczone jako opcja są interpretowane jako pliki " #~ "wykonawcze syntaxu.\n" #~ "plik syntaxu lub formatu do wczytania.\n" #~ msgid "Incorrect value for variable type" #~ msgstr "Nieodpowiednia wartośc dla zmiennej tego typu" #~ msgid "_Select" #~ msgstr "_Wybierz" #~ msgid "Enter a number to add a new variable." #~ msgstr "Wpisz liczbę, aby dodać nową zmienną." #~ msgid "Enter a number to add a new case." #~ msgstr "Wpisz liczbę, aby dodać nową obserwację." #~ msgid "Font Selection" #~ msgstr "Wybór czcionki" #~ msgid "Cannot create variable." #~ msgstr "Nie można utworzyć zmiennej." #~ msgid "\"%s\" is not a valid variable name." #~ msgstr "\"%s\" nie jest odpowiednią nazwą zmiennej." #~ msgid "This dictionary already contains a variable named \"%s\"." #~ msgstr "Słownik już zawiera zmienną o nazwie \"%s\"." #~ msgid "Cannot rename variable." #~ msgstr "Nie można zmienić nazwy zmiennej." #~ msgid "Enter a variable name to add a new variable." #~ msgstr "Wpisz nazwę zmiennej, aby dodać nową zmienną." #~ msgid "{%s, %s}\n" #~ msgstr "{%s, %s}\n" #~ msgid "Import Delimited Text Data" #~ msgstr "Importuj dane z rozdzielanego pliku tekstowego." #~ msgid "An error occurred reading the spreadsheet file." #~ msgstr "Wystąpił bład podczas wczytywania pliku arkusza." #~ msgid "This input line has too few separators to fill in this field." #~ msgstr "" #~ "Ta linia wejścia posiada zbyt mało separatorów, aby uzupełnić to pole" #~ msgid "Cannot parse field content `%.*s' as format %s: %s" #~ msgstr "Nie można analizować zawartości pola `%.*s' jako formatu %s: %s" #~ msgid "can only convert encrypted data file to sav or sys format" #~ msgstr "" #~ "konwersji można dokonać jedynie na kodowanych danych do formatu sav lub " #~ "sys" #~ msgid "count" #~ msgstr "zlicz" #~ msgid "expected" #~ msgstr "oczekiwane" #~ msgid "residual" #~ msgstr "Reszta" #~ msgid "std. resid." #~ msgstr "std. resid." #~ msgid "adj. resid." #~ msgstr "skorygowane resid." #~ msgid "Chi-square tests." #~ msgstr "Testy chi-kwadrat." #~ msgid "Odds Ratio for %s (%.*s / %.*s)" #~ msgstr "Współczynnik ryzyka dla %s (%.*s / %.*s)" #~ msgid "For cohort %s = %.*s" #~ msgstr "Dla kohorty %s = %.*s" #~ msgid "Delete the variables at the selected position(s)" #~ msgstr "Usuń wybrane zmienne" #~ msgid "Delete the cases at the selected position(s)" #~ msgstr "Usuń wybrane obserwacje" #~ msgid "(optional case selection condition)" #~ msgstr "(opcjonany warunek doboru obserwacji)" #~ msgid "Importing Textual Data" #~ msgstr "Importowanie pliku tekstowego" #~ msgid "Doubled quote mark treated as escape" #~ msgstr "Podwójny cudzysłów traktowany jest jako znak wyjścia" #~ msgid "_Open..." #~ msgstr "_Otwórz..." #~ msgid "Transpose the cases with the variables" #~ msgstr "Transponuj obserwacje ze zmiennymi" #~ msgid "Choose a subset of cases for analysis" #~ msgstr "Wybierz zbiór obserwacji do analizy" #~ msgid "All" #~ msgstr "Wszystko" pspp-1.4.1/po/lt.po0000644000175000017500000117342213725012645013527 0ustar00blpblp00000000000000# translation of pspp to Lithuanian # Copyright (C) 2007, 2008, 2009 Free Software Foundation, Inc. # This file is distributed under the same licence as the PSPP package.# # # Mindaugas Baranauskas , 2010-2016, 2017, 2020. msgid "" msgstr "" "Project-Id-Version: pspp-1.4.0\n" "Report-Msgid-Bugs-To: pspp-dev@gnu.org\n" "PO-Revision-Date: 2020-08-21 13:55+0300\n" "Last-Translator: Mindaugas Baranauskas \n" "Language-Team: Lithuanian \n" "Language: lt\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Bugs: Report translation errors to the Language-Team address.\n" "X-Generator: Lokalize 20.04.2\n" "Plural-Forms: nplurals=4; plural=(n%10==1 ? 0 : n%10==1 && n%100!=11 ? 1 : n" "%10>=2 && (n%100<10 || n%100>=20) ? 2 : 3);\n" "X-Poedit-Language: Lithuanian\n" "X-Poedit-Country: LITHUANIA\n" #: src/data/any-reader.c:72 src/data/encrypted-file.c:78 #, c-format msgid "An error occurred while opening `%s': %s." msgstr "Klaida bandant atverti „%s“: %s." #: src/data/any-reader.c:93 src/language/lexer/lexer.c:1633 #, c-format msgid "Error reading `%s': %s." msgstr "Klaida skaitant „%s“: %s." #: src/data/any-reader.c:114 #, c-format msgid "`%s' is not a system or portable file." msgstr "„%s“ nėra nei sisteminė, nei perkeliama rinkmena" #: src/data/any-reader.c:123 src/data/any-writer.c:66 msgid "The inline file is not allowed here." msgstr "Į vidų įterpti rinkmeną neleidžiama." #: src/data/any-reader.c:205 #, c-format msgid "" "Cannot read from dataset %s because no dictionary or data has been written " "to it yet." msgstr "" "Negalima skaityti iš duomenų rinkinio %s, nes į jame dar nėra įrašyto žodyno " "arba duomenų." #: src/data/any-reader.c:260 src/language/data-io/dataset.c:253 msgid "Dataset" msgstr "Duomenų rinkinys" #: src/data/calendar.c:100 #, c-format msgid "Month %d is not in acceptable range of 0 to 13." msgstr "Mėnuo %d nėra priimtiname intervale nuo 0 iki 13." #: src/data/calendar.c:110 #, c-format msgid "Day %d is not in acceptable range of 0 to 31." msgstr "Diena %d nėra priimtiname intervale nuo 0 iki 31." #: src/data/calendar.c:119 #, c-format msgid "Date %04d-%d-%d is before the earliest acceptable date of 1582-10-15." msgstr " Data %04d-%d-%d yra anksčiau nei anksčiausia priimtina 1582-10-15." #: src/data/casereader-filter.c:221 msgid "" "At least one case in the data read had a weight value that was user-missing, " "system-missing, zero, or negative. These case(s) were ignored." msgstr "" "Nuskaitytuose duomenyse bent vienas atvejis turi svorio reikšmę, kuri yra " "naudotojo apibrėžta kaip praleista, sisteminė praleista, nulis arba " "neigiamas skaičius. Šie atvejai ignoruojami." #. TRANSLATORS: this fragment will be interpolated into messages in fh_lock() #. that identify types of files. #: src/data/csv-file-writer.c:138 msgid "CSV file" msgstr "CSV rinkmena" #: src/data/csv-file-writer.c:146 #, fuzzy, c-format #| msgid "Error opening `%s' for writing as a system file: %s." msgid "Error opening `%s' for writing as a CSV file: %s." msgstr "Klaida atveriant „%s“ rašymui į sisteminę rinkmeną: %s." #: src/data/csv-file-writer.c:453 #, c-format msgid "An I/O error occurred writing CSV file `%s'." msgstr "Įvedimo/išvedimo klaida įrašant CSV rinkmeną „%s“." #: src/data/data-in.c:175 #, c-format msgid "Data is not valid as format %s: %s" msgstr "duomenys neatitinka %s formato: %s" #: src/data/data-in.c:377 src/data/data-in.c:553 msgid "Field contents are not numeric." msgstr "lauko turinys nėra skaitmeninis." #: src/data/data-in.c:379 src/data/data-in.c:555 msgid "Number followed by garbage." msgstr "Už skaičiaus yra šiukšlių." #: src/data/data-in.c:392 msgid "Invalid numeric syntax." msgstr "Neteisinga skaitmeninė sintaksė." #: src/data/data-in.c:400 src/data/data-in.c:571 msgid "Too-large number set to system-missing." msgstr "Per didelis skaičius nustatytas kaip „sisteminė praleista“ reikšmė." #: src/data/data-in.c:406 src/data/data-in.c:577 msgid "Too-small number set to zero." msgstr "Per mažas skaičius nustatytas kaip nulis." #: src/data/data-in.c:426 msgid "All characters in field must be digits." msgstr "Visi lauko rašmenys turi būti skaitmenys." #: src/data/data-in.c:445 msgid "Unrecognized character in field." msgstr "Lauke yra neatpažintas rašmuo." #: src/data/data-in.c:466 src/data/data-in.c:729 msgid "Field must have even length." msgstr "Laukas privalo būti pakankamo ilgio." #: src/data/data-in.c:468 src/data/data-in.c:732 msgid "Field must contain only hex digits." msgstr "Lauke gali būti tik šešioliktainiai skaitmenys." #: src/data/data-in.c:544 msgid "Invalid zoned decimal syntax." msgstr "Netinkama zonos dešimtainė sintaksė" #: src/data/data-in.c:644 src/data/data-in.c:650 msgid "Invalid syntax for P field." msgstr "Neteisinga P lauko sintaksė." #: src/data/data-in.c:768 src/data/data-in.c:818 msgid "Syntax error in date field." msgstr "Sintaksės klaida datos lauke." #: src/data/data-in.c:783 #, c-format msgid "Day (%ld) must be between 1 and 31." msgstr "Diena (%ld) turi būti skaičius nuo 1 iki 31." #: src/data/data-in.c:832 msgid "Delimiter expected between fields in date." msgstr "Tarp datos laukų tikėtasi rasti skirtuką." #: src/data/data-in.c:906 msgid "" "Unrecognized month format. Months may be specified as Arabic or Roman " "numerals or as at least 3 letters of their English names." msgstr "" "Mėnesio formatas neatpažintas. Mėnesį galite nurodyti arabiškais arba " "romėniškais skaitmenimis arba angliškų mėnesių pavadinimų bent trimis " "pirmosiomis raidėmis." #: src/data/data-in.c:933 #, c-format msgid "Year (%ld) must be between 1582 and 19999." msgstr "Metai (%ld) turi būti iš intervalo nuo 1582 iki 19999." #: src/data/data-in.c:944 #, c-format msgid "Trailing garbage `%.*s' following date." msgstr "Už datos yra šiukšlė „%.*s“." #: src/data/data-in.c:958 msgid "Julian day must have exactly three digits." msgstr "Julijaus dieną turi sudaryti būtent trys skaitmenys" #: src/data/data-in.c:960 #, c-format msgid "Julian day (%ld) must be between 1 and 366." msgstr "Julijaus diena (%ld) turi būti skaičius nuo 1 iki 366." #: src/data/data-in.c:984 #, c-format msgid "Quarter (%ld) must be between 1 and 4." msgstr "Kvartilis (%ld) turi būti skaičius nuo 1 iki 4." #: src/data/data-in.c:1005 #, c-format msgid "Week (%ld) must be between 1 and 53." msgstr "Savaitė (%ld) turi būti iš intervalo tarp 1 ir 53." #: src/data/data-in.c:1017 msgid "Delimiter expected between fields in time." msgstr "Tarp laiko laukų tikėtasi rasti skirtuką." #: src/data/data-in.c:1037 #, c-format msgid "Minute (%ld) must be between 0 and 59." msgstr "Minutė (%ld) turi būti iš intervalo nuo 0 iki 59." #: src/data/data-in.c:1075 msgid "" "Unrecognized weekday name. At least the first two letters of an English " "weekday name must be specified." msgstr "" "Savaitės diena neatpažinta. Turi būti nurodytos angliško pavadinimo bent dvi " "pirmosios raidės (mo, tu, we, th, fr, sa, su)." #: src/data/data-in.c:1210 #, c-format msgid "`%c' expected in date field." msgstr "Datos laukelyje tikėtasi „%c“." #: src/data/data-out.c:580 #, c-format msgid "Weekday number %f is not between 1 and 7." msgstr "Savaitės dienos numeris %f nėra tarp 1 ir 7." #: src/data/data-out.c:605 #, c-format msgid "Month number %f is not between 1 and 12." msgstr "Mėnesio numeris %f nėra tarp 1 ir 12." #. TRANSLATORS: this fragment will be interpolated into #. messages in fh_lock() that identify types of files. #: src/data/dataset-writer.c:66 src/language/data-io/file-handle.c:304 msgid "dataset" msgstr "duomenų rinkinys" #: src/data/dict-class.c:52 msgid "ordinary" msgstr "paprasta" #: src/data/dict-class.c:54 msgid "system" msgstr "sisteminė" #: src/data/dict-class.c:56 msgid "scratch" msgstr "tuščia" #: src/data/dictionary.c:1523 #, c-format msgid "Truncating document line to %d bytes." msgstr "Dokumento eilutė sutrumpinta iki %d bitų(-o)." #: src/data/encrypted-file.c:89 #, c-format msgid "An error occurred while reading `%s': %s." msgstr "Klaida bandant atverti „%s“: %s." #: src/data/encrypted-file.c:430 #, c-format msgid "" "%s: encrypted file corrupted (ends in incomplete %u-byte ciphertext block)" msgstr "" "%s užšifruotoji rinkmena yra sugadinta (baigiasi nepilnu %u-bitų ciphertext " "bloku)" #: src/data/encrypted-file.c:449 #, c-format msgid "%s: encrypted file corrupted (ends with bad padding)" msgstr "%s užšifruotoji rinkmena yra sugadinta (baigiasi netinkamu užpildu)" #: src/data/file-handle-def.c:283 src/language/data-io/dataset.c:266 msgid "active dataset" msgstr "veikiamasis duomenų rinkinys" #: src/data/file-handle-def.c:518 #, c-format msgid "Can't read from %s as a %s because it is already being read as a %s." msgstr "Negalima skaityti iš %s kaip %s, nes jau skaitoma kaip %s." #: src/data/file-handle-def.c:522 #, c-format msgid "Can't write to %s as a %s because it is already being written as a %s." msgstr "Negalima rašyti į %s kaip %s, nes jau rašoma kaip %s." #: src/data/file-handle-def.c:529 #, c-format msgid "Can't re-open %s as a %s." msgstr "Negalima iš naujo atverti %s kaip %s." #: src/data/file-name.c:133 #, c-format msgid "Not opening pipe file `%s' because %s option set." msgstr "Kanalo failas „%s“ nėra atveriamas, nes naudojama „%s“ parinktis." #: src/data/format.c:339 msgid "Input format" msgstr "Įvedimo formatas" #: src/data/format.c:339 msgid "Output format" msgstr "Išvedimo formatas" #: src/data/format.c:342 #, c-format msgid "Format %s may not be used for input." msgstr "Formato %s negalima naudoti įvedimui." #: src/data/format.c:349 #, c-format msgid "%s specifies width %d, but %s requires an even width." msgstr "%s nurodo %d plotį, bet %s turėtų būti lyginio pločio." #: src/data/format.c:358 #, c-format msgid "%s %s specifies width %d, but %s requires a width between %d and %d." msgstr "%s %s nurodo %d plotį, bet %s turėtų būti nuo %d iki %d pločio." #: src/data/format.c:367 #, c-format msgid "%s %s specifies %d decimal place, but %s does not allow any decimals." msgid_plural "" "%s %s specifies %d decimal places, but %s does not allow any decimals." msgstr[0] "" "%s %s nurodo %d dešimtainę skiltį, bet %s neleidžia naudoti dešimtainių " "skilčių." msgstr[1] "" "%s %s nurodo %d dešimtainę skiltį, bet %s neleidžia naudoti dešimtainių " "skilčių." msgstr[2] "" "%s %s nurodo %d dešimtaines skiltis, bet %s neleidžia naudoti dešimtainių " "skilčių." msgstr[3] "" "%s %s nurodo %d dešimtainių skilčių, bet %s neleidžia naudoti dešimtainių " "skilčių." #: src/data/format.c:378 #, c-format msgid "" "%s %s specifies %d decimal place, but the given width allows at most %d " "decimals." msgid_plural "" "%s %s specifies %d decimal places, but the given width allows at most %d " "decimals." msgstr[0] "" "%s %s nurodo %d dešimtainę skiltį, bet nurodytas plotis leistų iki %d " "skaitmenų po kablelio." msgstr[1] "" "%s %s nurodo %d dešimtainę skiltį, bet nurodytas plotis leistų iki %d " "skaitmenų po kablelio." msgstr[2] "" "%s %s nurodo %d dešimtaines skiltis, bet nurodytas plotis leistų iki %d " "skaitmenų po kablelio." msgstr[3] "" "%s %s nurodo %d dešimtainių skilčių, bet nurodytas plotis leistų iki %d " "skaitmenų po kablelio." #: src/data/format.c:385 #, c-format msgid "" "%s %s specifies %d decimal place, but the given width does not allow for any " "decimals." msgid_plural "" "%s %s specifies %d decimal places, but the given width does not allow for " "any decimals." msgstr[0] "" "%s %s nurodo %d dešimtainę skiltį, bet nurodytas plotis neleistų naudoti " "dešimtainių skilčių." msgstr[1] "" "%s %s nurodo %d dešimtainę skiltį, bet nurodytas plotis neleistų naudoti " "dešimtainių skilčių." msgstr[2] "" "%s %s nurodo %d dešimtaines skiltis, bet nurodytas plotis neleistų naudoti " "dešimtainių skilčių." msgstr[3] "" "%s %s nurodo %d dešimtainių skilčių, bet nurodytas plotis neleistų naudoti " "dešimtainių skilčių." #: src/data/format.c:424 #, c-format msgid "%s variables are not compatible with %s format %s." msgstr "%s kintamieji nesuderinami su %s formatu %s." #: src/data/format.c:425 src/data/format.c:1074 #: src/ui/gui/var-type-dialog.ui:167 msgid "String" msgstr "Teksto eilutė" #: src/data/format.c:425 src/data/format.c:1035 #: src/ui/gui/var-type-dialog.ui:48 msgid "Numeric" msgstr "Skaitmeninis" #: src/data/format.c:426 src/data/sys-file-reader.c:2212 #: src/data/sys-file-reader.c:2214 src/language/xforms/recode.c:512 #: src/language/xforms/recode.c:513 src/language/xforms/recode.c:525 #: src/language/xforms/recode.c:526 #: src/language/dictionary/apply-dictionary.c:77 #: src/language/dictionary/apply-dictionary.c:78 msgid "numeric" msgstr "skaitmeninis" #: src/data/format.c:426 src/data/sys-file-reader.c:2212 #: src/data/sys-file-reader.c:2214 src/language/xforms/recode.c:512 #: src/language/xforms/recode.c:513 src/language/xforms/recode.c:525 #: src/language/xforms/recode.c:526 #: src/language/dictionary/apply-dictionary.c:77 #: src/language/dictionary/apply-dictionary.c:78 msgid "string" msgstr "teksto eilutė " #: src/data/format.c:444 #, c-format msgid "String variable with width %d is not compatible with format %s." msgstr "" "Teksto eilutės kintamasis, kurio plotis %d, yra nesuderinamas su %s formatu." #: src/data/format.c:1038 src/ui/gui/var-type-dialog.ui:65 msgid "Comma" msgstr "Su kableliu" #: src/data/format.c:1041 src/ui/gui/var-type-dialog.ui:82 msgid "Dot" msgstr "Su tašku" #: src/data/format.c:1044 msgid "Scientific" msgstr "Mokslinis" #: src/data/format.c:1061 src/ui/gui/var-type-dialog.ui:116 msgid "Date" msgstr "Data" #: src/data/format.c:1064 src/ui/gui/var-type-dialog.ui:133 msgid "Dollar" msgstr "Doleriai" #: src/data/format.c:1071 msgid "Custom" msgstr "Savitas" #: src/data/gnumeric-reader.c:478 src/data/ods-reader.c:505 #, c-format msgid "Cannot convert the value in the spreadsheet cell %s to format (%s): %s" msgstr "Nepavyksta lakšto %s langelio reikšmės konvertuoti formatu (%s): %s" #: src/data/gnumeric-reader.c:502 src/data/ods-reader.c:567 #, c-format msgid "" "There was a problem whilst reading the %s file `%s' (near line %d): `%s'" msgstr "Nesklandumai nuskaitant %s rinkmeną „%s“ (ties %d eilute): „%s“" #: src/data/gnumeric-reader.c:597 #, c-format msgid "" "The gnumeric file `%s' is encoded as %s instead of the usual UTF-8 encoding. " "Any non-ascii characters will be incorrectly imported." msgstr "" "Gnumeric rinkmenos „%s“ koduotė yra %s, o ne įprasta UTF-8. Visi ne ascii " "simboliai importuosimi neteisingai." #: src/data/gnumeric-reader.c:641 src/data/ods-reader.c:682 #, c-format msgid "Invalid cell range `%s'" msgstr "Netinkama langelių sritis „%s“" #: src/data/gnumeric-reader.c:813 src/data/ods-reader.c:710 #: src/data/ods-reader.c:843 #, c-format msgid "Selected sheet or range of spreadsheet `%s' is empty." msgstr "Pasirinktas lakštas arba skaičialentės sritis „%s“ yra tuščia." #: src/data/identifier2.c:60 #, c-format msgid "Identifier `%s' exceeds %d-byte limit." msgstr "Identifikatorius „%s“ viršija %d bitų ribą." #: src/data/identifier2.c:84 msgid "Identifier cannot be empty string." msgstr "Identifikatorius negali būti tuščia eilutė." #: src/data/identifier2.c:92 #, c-format msgid "`%s' may not be used as an identifier because it is a reserved word." msgstr "" "„%s“ negali būti naudojamas kaip identifikatorius, nes šis žodis rezervuotas." #: src/data/identifier2.c:103 #, c-format msgid "" "`%s' may not be used as an identifier because it contains ill-formed UTF-8 " "at byte offset %tu." msgstr "" "„%s“ negali būti identifikatoriumi, nes jame yra blogai suformuotas UTF-8 " "ties baitų poslinkiu %tu." #: src/data/identifier2.c:114 #, c-format msgid "" "Character %s (in `%s') may not appear as the first character in a identifier." msgstr "" "Pirmuoju identifikatoriaus simboliu negali būti %s simbolis (ties „%s“)." #: src/data/identifier2.c:126 #, c-format msgid "Character %s (in `%s') may not appear in an identifier." msgstr "Identifikatoriuje negali būti %s simbolis (ties „%s“)." #: src/data/mdd-writer.c:241 #, c-format msgid "An I/O error occurred writing metadata file `%s'." msgstr "Įvedimo/išvedimo klaida įrašant meta duomenų rinkmeną „%s“." #. TRANSLATORS: this fragment will be interpolated into #. messages in fh_lock() that identify types of files. #: src/data/mdd-writer.c:457 msgid "metadata file" msgstr "metaduomenų rinkmena" #: src/data/mdd-writer.c:465 #, c-format msgid "Error opening `%s' for writing as a metadata file: %s." msgstr "Klaida atveriant rašymui „%s“ kaip meta duomenų rinkmeną: %s." #: src/data/mdd-writer.c:473 #, c-format msgid "Internal error creating xmlTextWriter. Please report this to %s." msgstr "Kuriant xmlTextWriter įvyko vidinė klaida. Praneškite apie tai %s." #: src/data/make-file.c:217 #, c-format msgid "Opening %s for writing: %s." msgstr "Atveriama %s įrašymui: %s." #: src/data/make-file.c:228 #, c-format msgid "Opening stream for %s: %s." msgstr "Atveriamas %s srautas: %s." #: src/data/make-file.c:260 #, c-format msgid "Creating temporary file to replace %s: %s." msgstr "%s pakeitimui kuriama laikinoji rinkmena: %s." #: src/data/make-file.c:277 #, c-format msgid "Creating temporary file %s: %s." msgstr "Kuriama laikinoji rinkmena %s: %s." #: src/data/make-file.c:289 #, c-format msgid "Opening stream for temporary file %s: %s." msgstr "Laikinajai rinkmenai %s atveriamas srautas: %s." #: src/data/make-file.c:326 #, c-format msgid "Replacing %s by %s: %s." msgstr "%s pakeičiamas į %s: %s." #: src/data/make-file.c:354 #, c-format msgid "Removing %s: %s." msgstr "Pašalinama %s: %s." #: src/data/mrset.c:83 #, c-format msgid "" "%s is not a valid name for a multiple response set. Multiple response set " "names must begin with `$'." msgstr "" "%s nėra tinkamas pavadinimas daugialypių atsakų rinkiniui. Daugialypių " "atsakų rinkinio pavadinimas turi prasidėti simboliu „$“." #: src/data/ods-reader.c:620 #, c-format msgid "Cannot open %s as a OpenDocument file: %s" msgstr "Nepavyksta atverti „%s“ tarsi OpenDocument rinkmenos: %s" #. TRANSLATORS: this fragment will be interpolated into #. messages in fh_lock() that identify types of files. #: src/data/pc+-file-reader.c:206 msgid "SPSS/PC+ system file" msgstr "SPSS/PC+ sisteminė rinkmena" #: src/data/pc+-file-reader.c:215 #, c-format msgid "Error opening `%s' for reading as an SPSS/PC+ system file: %s." msgstr "Klaida atveriant „%s“ skaitymui iš SPSS/PC+ sisteminės rinkmenos: %s." #: src/data/pc+-file-reader.c:224 src/data/sys-file-reader.c:3541 #, c-format msgid "%s: stat failed (%s)." msgstr "%s: nepavyko nustatyti (%s)." #: src/data/pc+-file-reader.c:230 #, c-format msgid "%s: file too large." msgstr "%s: rinkmena pernelyg didelė." #: src/data/pc+-file-reader.c:257 #, c-format msgid "" "Directory entry is for a %u-byte record starting at offset %u but file is " "only %u bytes long." msgstr "" "%u-bitų įraše katalogo vieta nurodyta ties %u, bet rinkmena tėra tik %u bitų " "dydžio." #: src/data/pc+-file-reader.c:275 #, c-format msgid "Directory fields have unexpected values (%u,%u)." msgstr "Katalogo lauke yra netikėtų reikšmių (%u,%u)." #: src/data/pc+-file-reader.c:372 src/data/sys-file-reader.c:672 #, c-format msgid "Variable %zu" msgstr "Kintamasis „%zu“" #: src/data/pc+-file-reader.c:380 src/data/sys-file-reader.c:680 #, c-format msgid "Variable %zu Label" msgstr "Kintamojo „%zu“ etiketė: " #: src/data/pc+-file-reader.c:385 #, c-format msgid "Variable %zu Value Label %zu" msgstr "Kintamojo „%zu“ reikšmės etiketė „%zu“" #: src/data/pc+-file-reader.c:388 src/data/sys-file-reader.c:690 msgid "Creation Date" msgstr "Sukūrimo data" #: src/data/pc+-file-reader.c:389 src/data/sys-file-reader.c:691 msgid "Creation Time" msgstr "Sukūrimo laikas" #: src/data/pc+-file-reader.c:390 src/data/sys-file-reader.c:692 #: src/language/dictionary/sys-file-info.c:200 msgid "Product" msgstr "Produktas" #: src/data/pc+-file-reader.c:391 src/data/sys-file-reader.c:693 #: src/language/dictionary/sys-file-info.c:300 msgid "File Label" msgstr "Rinkmenos etiketė" #: src/data/pc+-file-reader.c:427 #, c-format msgid "" "Using default encoding %s to read this SPSS/PC+ system file. For best " "results, specify an encoding explicitly. Use SYSFILE INFO with ENCODING=" "\"DETECT\" to analyze the possible encodings." msgstr "" "SPSS/PC+ sisteminei rinkmenai nuskaityti naudojama numatytoji %s koduotė. " "Siūlome patiems nurodyti tikslesnę koduotę. Norėdami peržiūrėti galimas " "koduotes, naudokite funkciją SYSFILE INFO su ENCODING=\"DETECT\"." #: src/data/pc+-file-reader.c:483 src/data/sys-file-reader.c:890 #, c-format msgid "Error closing system file `%s': %s." msgstr "Sisteminės rinkmenos „%s“ užvėrimo klaida: %s." #: src/data/pc+-file-reader.c:544 msgid "This is not an SPSS/PC+ system file." msgstr "Tai ne SPSS/PC+ sisteminė rinkmena." #: src/data/pc+-file-reader.c:548 #, c-format msgid "Record 0 has unexpected length %u." msgstr "0 įrašas yra netikėto ilgumo %u." #: src/data/pc+-file-reader.c:572 #, c-format msgid "Record 0 specifies unexpected system missing value %g (%a)." msgstr "0 įrašas nurodo netikėtą sisteminę praleistą reikšmę %g (%a)." #: src/data/pc+-file-reader.c:577 #, c-format msgid "Record 0 reserved fields have unexpected values (%u,%u,%u,%u,%u,%u)." msgstr "" "0 įraše rezervuotuose laukuose yra netikėtos reikšmės (%u,%u,%u,%u,%u,%u)." #: src/data/pc+-file-reader.c:581 #, c-format msgid "Record 0 case counts differ (%u versus %u)." msgstr "0 įrašo atvejų skaičius skiriasi (%u ir %u)." #: src/data/pc+-file-reader.c:585 #, c-format msgid "Invalid compression type %u." msgstr "Netinkamas glaudinimo tipas %u." #: src/data/pc+-file-reader.c:596 #, c-format msgid "" "Record 0 claims %u cases with %u values per case (requiring at least %zu " "bytes) but data record is only %u bytes long." msgstr "" #: src/data/pc+-file-reader.c:618 #, c-format msgid "" "Value labels claimed to end at offset %u in labels record but labels record " "is only %u bytes." msgstr "" #: src/data/pc+-file-reader.c:629 #, c-format msgid "" "Value labels claimed to be at offset %u with length %u but file size is only " "%u bytes." msgstr "" #: src/data/pc+-file-reader.c:656 #, c-format msgid "" "Value labels end with partial label (%u bytes left in record, label length " "%)." msgstr "" #: src/data/pc+-file-reader.c:669 #, c-format msgid "%u leftover bytes following value labels." msgstr "" #: src/data/pc+-file-reader.c:685 #, c-format msgid "" "Variable label claimed to start at offset %u in labels record but labels " "record is only %u bytes." msgstr "" #: src/data/pc+-file-reader.c:697 #, c-format msgid "" "Variable label with length %u starting at offset %u in labels record " "overruns end of %u-byte labels record." msgstr "" #: src/data/pc+-file-reader.c:719 #, c-format msgid "Record 1 has length %u (expected %u)." msgstr "1 įrašas yra %u ilgio (tikėtasi %u)." #: src/data/pc+-file-reader.c:751 #, c-format msgid "Variable %u has invalid type %." msgstr "Kintamasis %u yra neleistino tipo %." #: src/data/pc+-file-reader.c:787 #, c-format msgid "Invalid weight index %u." msgstr "Netinkamas svorio indeksas %u." #: src/data/pc+-file-reader.c:857 #, c-format msgid "Invalid variable name `%s'." msgstr "Netinkamas kintamojo vardas „%s“." #: src/data/pc+-file-reader.c:865 src/data/sys-file-reader.c:1444 #, c-format msgid "Renaming variable with duplicate name `%s' to `%s'." msgstr "Kintamasis besidubliuojančiu vardu „%s“ pervadinamas į „%s“." #: src/data/pc+-file-reader.c:877 #, c-format msgid "Cannot weight by string variable `%s'." msgstr "Svėrimui negalima rinktis tekstinės eilutės kintamojo „%s“." #: src/data/pc+-file-reader.c:973 src/data/sys-file-reader.c:2762 msgid "File ends in partial case." msgstr "Rinkmena baigiasi nepilname atvejyje." #: src/data/pc+-file-reader.c:979 #, c-format msgid "" "Case beginning at offset 0x%08x extends past end of data record at offset 0x" "%08x." msgstr "" #: src/data/pc+-file-reader.c:998 src/data/sys-file-reader.c:2770 #, c-format msgid "Error reading case from file %s." msgstr "klaida bandant nuskaityti atvejį iš rinkmenos „%s“." #: src/data/pc+-file-reader.c:1114 src/data/sys-file-reader.c:2933 #, c-format msgid "" "Possible compressed data corruption: string contains compressed integer " "(opcode %d)." msgstr "" #: src/data/pc+-file-reader.c:1156 src/data/sys-file-reader.c:3234 #, c-format msgid "`%s' near offset 0x%llx: " msgstr "„%s“ šalia 0x%llx poslinkio: " #: src/data/pc+-file-reader.c:1159 src/data/sys-file-reader.c:3237 #, c-format msgid "`%s': " msgstr "„%s“: " #: src/data/pc+-file-reader.c:1211 src/data/sys-file-reader.c:3288 #, c-format msgid "System error: %s." msgstr "Sistemos klaida: %s." #: src/data/pc+-file-reader.c:1216 src/data/sys-file-reader.c:3293 msgid "Unexpected end of file." msgstr "Netikėta rinkmenos pabaiga." #: src/data/pc+-file-reader.c:1301 src/data/sys-file-reader.c:3518 #, c-format msgid "%s: seek failed (%s)." msgstr "%s: nepavyko rasti (%s)." #: src/data/pc+-file-reader.c:1351 msgid "SPSS/PC+ System File" msgstr "SPSS/PC+ sisteminė rinkmena" #: src/data/por-file-reader.c:109 #, c-format msgid "portable file %s corrupt at offset 0x%llx: " msgstr "perkeliama rinkmena %s sugadinta ties 0x%llx poslinkiu: " #: src/data/por-file-reader.c:136 #, c-format msgid "reading portable file %s at offset 0x%llx: " msgstr "skaitoma perkeliama rinkmena %s ties 0x%llx poslinkiu: " #: src/data/por-file-reader.c:164 #, c-format msgid "Error closing portable file `%s': %s." msgstr "Perkeliamos rinkmenos „%s“ užvėrimo klaida: %s." #: src/data/por-file-reader.c:216 msgid "unexpected end of file" msgstr "netikėta rinkmenos pabaiga" #. TRANSLATORS: this fragment will be interpolated into #. messages in fh_lock() that identify types of files. #: src/data/por-file-reader.c:275 src/data/por-file-writer.c:147 msgid "portable file" msgstr "perkeliama rinkmena" #: src/data/por-file-reader.c:283 #, c-format msgid "" "An error occurred while opening `%s' for reading as a portable file: %s." msgstr "Klaida atveriant „%s“ skaitymui kaip perkeliamą rinkmeną: %s" #: src/data/por-file-reader.c:304 msgid "Data record expected." msgstr "Tikėtasi duomenų įrašo." #: src/data/por-file-reader.c:402 msgid "Number expected." msgstr "Tikėtasi skaičiaus." #: src/data/por-file-reader.c:430 msgid "Missing numeric terminator." msgstr "Trūksta skaitmeninio terminatoriaus." #: src/data/por-file-reader.c:453 msgid "Invalid integer." msgstr "Netinkamas sveikasis skaičius." #: src/data/por-file-reader.c:464 src/data/por-file-reader.c:484 #, c-format msgid "Bad string length %d." msgstr "Teksto eilutės ilgis %d yra netinkamas." #: src/data/por-file-reader.c:547 #, c-format msgid "%s: Not a portable file." msgstr "%s: Nėra perkeliama rinkmena." #: src/data/por-file-reader.c:564 #, c-format msgid "Unrecognized version code `%c'." msgstr "neatpažintas versijos kodas „%c“." #: src/data/por-file-reader.c:577 #, c-format msgid "Bad date string length %zu." msgstr "Netinkamas tekstinės eilutės ilgis %zu." #: src/data/por-file-reader.c:579 #, c-format msgid "Bad time string length %zu." msgstr "Netinkamas laiko ilgis %zu." #: src/data/por-file-reader.c:630 #, c-format msgid "" "%s: Bad format specifier byte (%d). Variable will be assigned a default " "format." msgstr "" "%s: Blogas formatą nurodantis baitas (%d). Kintamajam bus priskirtas " "numatytasis formatas." #: src/data/por-file-reader.c:651 #, c-format msgid "Numeric variable %s has invalid format specifier %s." msgstr "Skaitmeniniam kintamajam %s nurodytas netinkamas formatas %s." #: src/data/por-file-reader.c:655 #, c-format msgid "String variable %s with width %d has invalid format specifier %s." msgstr "" "Tekstiniam kintamajam %s, kurio plotis %d, nurodytas netinkamas formatas %s." #: src/data/por-file-reader.c:679 msgid "Expected variable count record." msgstr "Tikėtasi kintamųjų skaičiaus įrašo." #: src/data/por-file-reader.c:683 #, c-format msgid "Invalid number of variables %d." msgstr "Netinkamas kintamųjų skaičius %d." #: src/data/por-file-reader.c:692 #, c-format msgid "Weight variable name (%s) truncated." msgstr "Svertinio kintamojo vardas (%s) sutrumpintas." #: src/data/por-file-reader.c:707 msgid "Expected variable record." msgstr "Tikėtasi kintamojo įrašo." #: src/data/por-file-reader.c:711 #, c-format msgid "Invalid variable width %d." msgstr "Netinkamas kintamojo plotis %d." #: src/data/por-file-reader.c:719 #, c-format msgid "Invalid variable name `%s' in position %d." msgstr "Netinkamas kintamojo vardas „%s“ ties %d padėtimi." #: src/data/por-file-reader.c:723 src/data/sys-file-reader.c:1426 #, c-format msgid "Bad width %d for variable %s." msgstr "Plotis %d yra netinkamas kintamajam %s." #: src/data/por-file-reader.c:737 #, c-format msgid "Duplicate variable name %s in position %d renamed to %s." msgstr "Besikartojantis kintamojo vardas %s ties %d padėtimi pakeistas į %s." #: src/data/por-file-reader.c:786 #, c-format msgid "Weighting variable %s not present in dictionary." msgstr "Svėrimo kintamojo %s žodyne nėra." #: src/data/por-file-reader.c:830 #, c-format msgid "Unknown variable %s while parsing value labels." msgstr "Nežinomas kintamasis %s analizuojant reikšmių etiketes." #: src/data/por-file-reader.c:833 #, c-format msgid "" "Cannot assign value labels to %s and %s, which have different variable types." msgstr "" "Negalima priskirti reikšmių etikečių prie %s ir %s, kurie turi skirtingus " "kintamųjų tipus." #: src/data/por-file-reader.c:972 msgid "SPSS Portable File" msgstr "SPSS perkeliama rinkmena" #: src/data/por-file-writer.c:139 #, c-format msgid "Invalid decimal digits count %d. Treating as %d." msgstr "%d yra netinkamas dešimtainių skaitmenų kiekis. Tebūnie %d." #: src/data/por-file-writer.c:159 #, c-format msgid "Error opening `%s' for writing as a portable file: %s." msgstr "Klaida atveriant rašymui „%s“ kaip perkeliamą rinkmeną: %s." #: src/data/por-file-writer.c:505 #, c-format msgid "An I/O error occurred writing portable file `%s'." msgstr "Įvedimo/išvedimo klaida rašant perkeliamą rinkmeną „%s“." #: src/data/psql-reader.c:48 msgid "" "Support for reading postgres databases was not compiled into this " "installation of PSPP" msgstr "" "Postgres duomenų bazių skaitymo palaikymas nebuvo sukonfigūruotas šioje PSPP " "kompiliacijoje" #: src/data/psql-reader.c:242 msgid "Memory error whilst opening psql source" msgstr "Atminties klaida atveriant psql šaltinį" #: src/data/psql-reader.c:248 #, c-format msgid "Error opening psql source: %s." msgstr "Klaida bandant atverti psql šaltinį: %s." #: src/data/psql-reader.c:263 #, c-format msgid "" "Postgres server is version %s. Reading from versions earlier than 8.0 is not " "supported." msgstr "" "Postgres serverio versija yra %s. Skaitymas iš senesnių nei 8.0 versijos " "nepalaikomas." #: src/data/psql-reader.c:283 msgid "" "Connection is unencrypted, but unencrypted connections have not been " "permitted." msgstr "Ryšys nešifruotas, bet nešifruotasis ryšys neleidžiamas." #: src/data/psql-reader.c:324 src/data/psql-reader.c:349 #: src/data/psql-reader.c:359 #, c-format msgid "Error from psql source: %s." msgstr "psql šaltinio klaida: %s." #: src/data/psql-reader.c:454 #, c-format msgid "Unsupported OID %d. SYSMIS values will be inserted." msgstr "Nepalaikomas OID %d. Bus įterptos SYSMIS reikšmės." #: src/data/settings.c:391 msgid "" "MXWARNS set to zero. No further warnings will be given even when " "potentially problematic situations are encountered." msgstr "" "MXWARNS reikšmė yra 0. Daugiau neberodysim jokių įspėjimų, net išties " "kebliais atvejais." #: src/data/settings.c:398 #, c-format msgid "" "Warnings re-enabled. %d warnings will be issued before aborting syntax " "processing." msgstr "" "Įspėjimai vėl rodomi. Prieš nutraukiant sintaksės apdorojimą, parodysim %d " "įspėjimus." #: src/data/settings.c:618 #, c-format msgid "" "%s: Custom currency string `%s' does not contain exactly three periods or " "commas (or it contains both)." msgstr "" #. TRANSLATORS: this fragment will be interpolated into #. messages in fh_lock() that identify types of files. #: src/data/sys-file-reader.c:407 src/data/sys-file-writer.c:245 msgid "system file" msgstr "sisteminė rinkmena" #: src/data/sys-file-reader.c:414 #, c-format msgid "Error opening `%s' for reading as a system file: %s." msgstr "Klaida atveriant „%s“ skaitymui iš sisteminės rinkmenos: %s." #: src/data/sys-file-reader.c:491 msgid "Misplaced type 4 record." msgstr "4-to tipo įrašas padėtas ne vietoje." #: src/data/sys-file-reader.c:496 msgid "Duplicate type 6 (document) record." msgstr "6-to tipo (dokumento) besikartojantis įrašas." #: src/data/sys-file-reader.c:506 src/data/sys-file-reader.c:1343 #, c-format msgid "" "Unrecognized record type 7, subtype %d. For help, please send this file to " "%s and mention that you were using %s." msgstr "" "Įrašo 7-tas tipas, %d potipis neatpažintas. Jei reikia pagalbos, šią " "rinkmeną siųskite adresu %s ir paminėkite, kad naudojote %s." #: src/data/sys-file-reader.c:526 #, c-format msgid "" "Record type 7, subtype %d found here has the same type as the record found " "near offset 0x%llx. For help, please send this file to %s and mention that " "you were using %s." msgstr "" "Įrašo 7-tas tipas, %d potipis yra to paties tipo kaip kaip įrašas ties 0x" "%llx poslinkiu. Jei reikia pagalbos, šią rinkmeną siųskite adresu %s ir " "paminėkite, kad naudojote %s." #: src/data/sys-file-reader.c:538 #, c-format msgid "Unrecognized record type %d." msgstr "Neatpažintas įrašo %d tipas." #: src/data/sys-file-reader.c:688 #, c-format msgid "Value Label %zu" msgstr "Reikšmės „%zu“ etiketė" #: src/data/sys-file-reader.c:697 msgid "Extra Product Info" msgstr "Papildoma informacija apie produktą" #: src/data/sys-file-reader.c:710 #, c-format msgid "Document Line %zu" msgstr "Dokumento %zu eilutė" #: src/data/sys-file-reader.c:718 #, c-format msgid "MRSET %zu" msgstr "MRSET %zu" #: src/data/sys-file-reader.c:720 #, c-format msgid "MRSET %zu Label" msgstr "MRSET %zu etiketė" #: src/data/sys-file-reader.c:725 #, c-format msgid "MRSET %zu Counted Value" msgstr "MRSET %zu apskaičiuota reikšmė" #: src/data/sys-file-reader.c:763 #, c-format msgid "" "This system file does not indicate its own character encoding. Using " "default encoding %s. For best results, specify an encoding explicitly. Use " "SYSFILE INFO with ENCODING=\"DETECT\" to analyze the possible encodings." msgstr "" "Rinkmena nenurodo savo rašmenų koduotės. Naudojama numatytoji %s koduotė. " "Siūlome patiems nurodyti tikslesnę koduotę. Norėdami peržiūrėti galimas " "koduotes, naudokite funkciją SYSFILE INFO su ENCODING=\"DETECT\"." #: src/data/sys-file-reader.c:845 #, c-format msgid "File header claims %d variable positions but %zu were read from file." msgstr "" "Rinkmenos antraštė nurodo %d kintamųjų padėtis, bet iš rinkmenos nuskaitytos " "%zu." #: src/data/sys-file-reader.c:958 src/data/sys-file-reader.c:972 msgid "This is not an SPSS system file." msgstr "Tai ne SPSS sisteminė rinkmena." #: src/data/sys-file-reader.c:1027 msgid "" "Compression bias is not the usual value of 100, or system file uses " "unrecognized floating-point format." msgstr "" #: src/data/sys-file-reader.c:1102 msgid "Variable label indicator field is not 0 or 1." msgstr "Kintamojo etiketės indikatoriaus laukas nėra 0 arba 1." #: src/data/sys-file-reader.c:1115 msgid "Numeric missing value indicator field is not -3, -2, 0, 1, 2, or 3." msgstr "" "Skaitmeninis praleistos reikšmės indikatoriaus laukas nėra -3, -2, 0, 1, 2 " "arba 3." #: src/data/sys-file-reader.c:1125 msgid "String missing value indicator field is not 0, 1, 2, or 3." msgstr "" "Teksto eilutės praleistos reikšmės indikatoriaus laukas nėra 0, 1, 2 arba 3." #: src/data/sys-file-reader.c:1152 #, c-format msgid "Invalid number of labels %u." msgstr "Netinkamas etikečių skaičius %u." #: src/data/sys-file-reader.c:1185 msgid "" "Variable index record (type 4) does not immediately follow value label " "record (type 3) as it should." msgstr "" #: src/data/sys-file-reader.c:1197 #, c-format msgid "" "Number of variables associated with a value label (%u) is not between 1 and " "the number of variables (%zu)." msgstr "" "Su reikšmės etikete (%u) susietų kintamųjų skaičius nėra tarp 1 ir kintamųjų " "skaičiumi (%zu)" #: src/data/sys-file-reader.c:1224 #, c-format msgid "Number of document lines (%d) must be greater than 0 and less than %d." msgstr "" "Dokumento eilučių kiekis (%d) turi būti tarp teigiamas skaičius, bet " "mažesnis kaip %d." #: src/data/sys-file-reader.c:1317 #, c-format msgid "Record type 7, subtype %d has bad size %u (expected %d)." msgstr "7-to tipo įrašo, %d potipio dydis %u yra blogas (tikėtasi %d)." #: src/data/sys-file-reader.c:1321 #, c-format msgid "Record type 7, subtype %d has bad count %u (expected %d)." msgstr "7-to tipo įrašo, %d potipio skaičius %u yra blogas (tikėtasi %d)." #: src/data/sys-file-reader.c:1435 #, fuzzy, c-format #| msgid "Renaming variable with duplicate name `%s' to `%s'." msgid "Renaming variable with invalid name `%s' to `%s'." msgstr "Kintamasis besidubliuojančiu vardu „%s“ pervadinamas į „%s“." #: src/data/sys-file-reader.c:1517 msgid "Missing string continuation record." msgstr "Trūksta eilutės pratęsimo įrašo." #: src/data/sys-file-reader.c:1550 #, c-format msgid "Variable %s with width %d has invalid print format 0x%x." msgstr "" "%s kintamasis, kurio plotis %d, turi netinkamą spausdinimo formatą 0x%x." #: src/data/sys-file-reader.c:1554 #, c-format msgid "Variable %s with width %d has invalid write format 0x%x." msgstr "%s kintamasis, kurio plotis %d, turi netinkamą rašymo formatą 0x%x." #: src/data/sys-file-reader.c:1559 msgid "Suppressing further invalid format warnings." msgstr "Tolesni įspėjimai apie netinkamą formatą nerodomi." #: src/data/sys-file-reader.c:1613 #, c-format msgid "" "Floating-point representation indicated by system file (%d) differs from " "expected (%d)." msgstr "" "Slankiojo kablelio vaizdavimas, kuris nurodytas sisteminėje rinkmenoje (%d), " "skiriasi nuo to, kurio tikėtasi (%d)." #: src/data/sys-file-reader.c:1629 #, c-format msgid "" "Integer format indicated by system file (%d) differs from expected (%d)." msgstr "" "Sveikojo skaičiaus formatas, kuris nurodytas sisteminę rinkmeną (%d), " "skiriasi nuo to, kurio tikėtasi (%d)." #: src/data/sys-file-reader.c:1647 src/data/sys-file-reader.c:1653 #, c-format msgid "File specifies unexpected value %g (%a) as %s, instead of %g (%a)." msgstr "" "Rinkmena netikėtai nurodo reikšmę %g (%a) kaip „%s“, bet ne kaip %g (%a)." #: src/data/sys-file-reader.c:1662 #, c-format msgid "" "File specifies unexpected value %g (%a) as %s, instead of %g (%a) or %g (%a)." msgstr "" "Rinkmena netikėtai nurodo reikšmę %g (%a) kaip „%s“, bet ne kaip %g (%a) ar " "%g (%a)." #: src/data/sys-file-reader.c:1714 src/data/sys-file-reader.c:1733 #, c-format msgid "Missing space following `%c' at offset %zu in MRSETS record." msgstr "" #: src/data/sys-file-reader.c:1741 #, c-format msgid "" "Missing label source value following `E' at offset %zu in MRSETS record." msgstr "" #: src/data/sys-file-reader.c:1748 #, c-format msgid "" "Unexpected label source value following `E' at offset %zu in MRSETS record." msgstr "" #: src/data/sys-file-reader.c:1755 #, c-format msgid "Missing `C', `D', or `E' at offset %zu in MRSETS record." msgstr "" #: src/data/sys-file-reader.c:1782 #, c-format msgid "Missing new-line parsing variable names at offset %zu in MRSETS record." msgstr "" #: src/data/sys-file-reader.c:1817 #, c-format msgid "Invalid multiple response set name `%s'." msgstr "" #: src/data/sys-file-reader.c:1850 #, c-format msgid "MRSET %s contains duplicate variable name %s." msgstr "MRSET %s turi kintamojo vardą „%s“, kuris kartojasi." #: src/data/sys-file-reader.c:1865 #, c-format msgid "MRSET %s contains both string and numeric variables." msgstr "MRSET %s turi ir tekstinės eilutės, ir skaitmeninius kintamuosius." #: src/data/sys-file-reader.c:1877 #, c-format msgid "MRSET %s has no variables." msgstr "MRSET %s neturi kintamųjų." #: src/data/sys-file-reader.c:1879 #, c-format msgid "MRSET %s has only one variable." msgstr "MRSET %s turi tik vieną kintamąjį." #: src/data/sys-file-reader.c:1923 #, c-format msgid "Extension 11 has bad count %u (for %zu variables)." msgstr "" #: src/data/sys-file-reader.c:1956 #, c-format msgid "" "Invalid variable display parameters for variable %zu (%s). Default " "parameters substituted." msgstr "" #: src/data/sys-file-reader.c:2000 #, c-format msgid "Duplicate long variable name `%s'." msgstr "Ilgas kintamojo vardas „%s“ kartojasi." #: src/data/sys-file-reader.c:2053 #, c-format msgid "Long variable mapping from %s to invalid variable name `%s'." msgstr "" #: src/data/sys-file-reader.c:2088 #, c-format msgid "%s listed as string of invalid length %s in very long string record." msgstr "" "%s pateiktas kaip netinkamo ilgio %s teksto eilutė labai ilgame teksto " "eilutės įraše." #: src/data/sys-file-reader.c:2099 #, c-format msgid "" "%s listed in very long string record with width %s, which requires only one " "segment." msgstr "" "%s pateiktas labai ilgame teksto eilutės įraše, kurio plotis %s, ir kuris " "reikalauja tik vieno segmento." #: src/data/sys-file-reader.c:2107 #, c-format msgid "Very long string %s overflows dictionary." msgstr "Labai ilga teksto eilutė %s netelpa žodyne." #: src/data/sys-file-reader.c:2125 #, c-format msgid "" "Very long string with width %ld has segment %d of width %d (expected %d)." msgstr "" "Labai ilga tekstinė eilutė, kurios plotis %ld, turi segmentą %d, kurio " "plotis %d (tikėtasi %d)." #: src/data/sys-file-reader.c:2183 #, fuzzy, c-format #| msgid "Variable index %d not in valid range 1...%zu." msgid "Value label variable index %d not in valid range 1...%zu." msgstr "Kintamojo indeksas %d nepriklauso tinkamam intervalui nuo 1 iki %zu." #: src/data/sys-file-reader.c:2193 #, fuzzy, c-format #| msgid "Weight variable index %d refers to long string continuation." msgid "Value label variable index %d refers to long string continuation." msgstr "" "Svertinio kintamojo indeksas (%d) nurodo į ilgos tekstinės eilutės tęsinį." #: src/data/sys-file-reader.c:2208 #, c-format msgid "" "Variables associated with value label are not all of identical type. " "Variable %s is %s, but variable %s is %s." msgstr "" #: src/data/sys-file-reader.c:2226 #, c-format msgid "" "Value labels may not be added to long string variables (e.g. %s) using " "records types 3 and 4." msgstr "" "Kintamųjų etiketės negali būti priskiriamos ilgų tekstinių eilučių " "kintamiesiems (pvz., %s), jei įrašo tipas yra 3 arba 4." #: src/data/sys-file-reader.c:2255 #, c-format msgid "Duplicate value label for %g on %s." msgstr "Besikartojanti „%g“ reikšmės etiketė „%s“ kintamojame." #: src/data/sys-file-reader.c:2260 src/data/sys-file-reader.c:2600 #, c-format msgid "Duplicate value label for `%.*s' on %s." msgstr "Besikartojanti „%.*s“ reikšmės etiketė „%s“ kintamajame." #: src/data/sys-file-reader.c:2283 #, fuzzy, c-format #| msgid "Suppressed %d additional related warnings." msgid "Suppressed %d additional warnings for value labels." msgstr "Neparodyti %d papildomi susiję įspėjimai." #: src/data/sys-file-reader.c:2297 #, fuzzy, c-format #| msgid "Weight variable index %d not in valid range 1...%zu." msgid "" "Weight variable index %d not in valid range 1...%zu. Treating file as " "unweighted." msgstr "" "Svertinio kintamojo indeksas %d nepriklauso tinkamam intervalui nuo 1 iki " "%zu." #: src/data/sys-file-reader.c:2307 #, fuzzy, c-format #| msgid "Weight variable index %d refers to long string continuation." msgid "" "Weight variable index %d refers to long string continuation. Treating file " "as unweighted." msgstr "" "Svertinio kintamojo indeksas (%d) nurodo į ilgos tekstinės eilutės tęsinį." #: src/data/sys-file-reader.c:2315 #, c-format msgid "Ignoring string variable `%s' set as weighting variable." msgstr "" "Tekstinės eilutės tipo kintamasis „%s“ nebus naudojamas kaip svėrimo " "kintamasis." #: src/data/sys-file-reader.c:2352 #, c-format msgid "Error parsing attribute value %s[%d]." msgstr "Klaida nagrinėjant atributo reikšmę %s[%d]." #: src/data/sys-file-reader.c:2366 #, c-format msgid "Attribute value %s[%d] is not quoted: %s." msgstr "Atributo reikšmė %s[%d] be kabučių: %s." #: src/data/sys-file-reader.c:2379 #, c-format msgid "Duplicate attribute %s." msgstr "Požymis %s kartojasi." #: src/data/sys-file-reader.c:2463 #, c-format msgid "Invalid role for variable %s." msgstr "Kintamajam %s netinka toks vaidmuo." #: src/data/sys-file-reader.c:2472 #, c-format msgid "%zu other variables had invalid roles." msgstr "Yra ir daugiau kintamųjų (%zu), kurių vaidmuo yra netinkamas." #: src/data/sys-file-reader.c:2485 #, c-format msgid "Extension record subtype %d ends unexpectedly." msgstr "" #: src/data/sys-file-reader.c:2531 #, c-format msgid "Ignoring long string value label record for unknown variable %s." msgstr "" "Nepaisoma nežinomo kintamojo %s ilgos tekstinės eilutės reikšmės etiketės " "įrašo." #: src/data/sys-file-reader.c:2536 #, c-format msgid "Ignoring long string value label record for numeric variable %s." msgstr "" "Nepaisoma skaitmeninio kintamojo %s ilgos tekstinės eilutės reikšmės " "etiketės įrašo." #: src/data/sys-file-reader.c:2543 #, c-format msgid "" "Ignoring long string value label record for variable %s because the record's " "width (%d) does not match the variable's width (%d)." msgstr "" #: src/data/sys-file-reader.c:2573 #, c-format msgid "" "Ignoring long string value label %zu for variable %s, with width %d, that " "has bad value width %zu." msgstr "" #: src/data/sys-file-reader.c:2646 #, c-format msgid "" "Long string missing values record says variable %s has %d missing values, " "but only 1 to 3 missing values are allowed." msgstr "" #: src/data/sys-file-reader.c:2656 #, c-format msgid "Ignoring long string missing value record for unknown variable %s." msgstr "" "Nepaisoma nežinomo kintamojo %s ilgos tekstinės eilutės trūkstamos reikšmės " "įrašo." #: src/data/sys-file-reader.c:2661 #, c-format msgid "Ignoring long string missing value record for numeric variable %s." msgstr "" "Nepaisoma skaitmeninio kintamojo %s ilgos tekstinės eilutės trūkstamos " "reikšmės įrašo." #: src/data/sys-file-reader.c:2686 #, c-format msgid "" "Ignoring long string missing value %zu for variable %s, with width %d, that " "has bad value width %zu." msgstr "" #: src/data/sys-file-reader.c:2740 msgid "File ends in partial string value." msgstr "Rinkmena baigiasi tekstinės eilutės kintamojo viduryje." #: src/data/sys-file-reader.c:2879 msgid "" "Possible compressed data corruption: compressed spaces appear in numeric " "field." msgstr "" "Tikėtina, kad suglaudinti duomenys yra sugadinti: skaitmeniniuose laukuose " "yra suglaudintų tarpų." #: src/data/sys-file-reader.c:3030 #, c-format msgid "Suppressed %d additional related warnings." msgstr "Neparodyti %d papildomi susiję įspėjimai." #: src/data/sys-file-reader.c:3076 src/data/sys-file-reader.c:3093 #, c-format msgid "Dictionary record refers to unknown variable %s." msgstr "Žodyno įrašas nurodo į nežinomą kintamąjį %s." #: src/data/sys-file-reader.c:3159 #, c-format msgid "Expecting digit at offset %zu in MRSETS record." msgstr "MRSETS įraše ties %zu poslinkiu tikimasi rasti skaičių." #: src/data/sys-file-reader.c:3167 #, c-format msgid "Expecting space at offset %zu in MRSETS record." msgstr "MRSETS įraše ties %zu poslinkiu tikimasi rasti tarpą." #: src/data/sys-file-reader.c:3175 #, c-format msgid "%zu-byte string starting at offset %zu exceeds record length %zu." msgstr "" #: src/data/sys-file-reader.c:3185 #, c-format msgid "Expecting space at offset %zu following %zu-byte string." msgstr "" #: src/data/sys-file-reader.c:3476 #, c-format msgid "Wrong ZLIB data header offset %#llx (expected %#llx)." msgstr "" #: src/data/sys-file-reader.c:3484 #, c-format msgid "Impossible ZLIB trailer offset 0x%llx." msgstr "" #: src/data/sys-file-reader.c:3491 #, c-format msgid "Invalid ZLIB trailer length %lld." msgstr "" #: src/data/sys-file-reader.c:3555 #, c-format msgid "End of ZLIB trailer (0x%llx) is not file size (0x%llx)." msgstr "" #: src/data/sys-file-reader.c:3565 #, c-format msgid "ZLIB trailer bias (%lld) differs from file header bias (%.2f)." msgstr "" #: src/data/sys-file-reader.c:3575 #, c-format msgid "ZLIB trailer \"zero\" field has nonzero value %lld." msgstr "" #: src/data/sys-file-reader.c:3581 #, c-format msgid "ZLIB trailer specifies unexpected %u-byte block size." msgstr "" #: src/data/sys-file-reader.c:3589 #, c-format msgid "%lld-byte ZLIB trailer specifies %u data blocks (expected %lld)." msgstr "" #: src/data/sys-file-reader.c:3614 #, c-format msgid "" "ZLIB block descriptor %u reported uncompressed data offset %#llx, when %#llx " "was expected." msgstr "" #: src/data/sys-file-reader.c:3623 #, c-format msgid "" "ZLIB block descriptor %u reported compressed data offset %#llx, when %#llx " "was expected." msgstr "" #: src/data/sys-file-reader.c:3633 #, c-format msgid "" "ZLIB block descriptor %u reported block size %#x, when %#x was expected." msgstr "" #: src/data/sys-file-reader.c:3641 #, c-format msgid "" "ZLIB block descriptor %u reported block size %#x, when at most %#x was " "expected." msgstr "" #: src/data/sys-file-reader.c:3653 #, c-format msgid "" "ZLIB block descriptor %u reports compressed size %u and uncompressed size %u." msgstr "" #: src/data/sys-file-reader.c:3665 #, c-format msgid "" "ZLIB trailer is at offset %#llx but %#llx would be expected from block " "descriptors." msgstr "" #: src/data/sys-file-reader.c:3684 #, c-format msgid "ZLIB initialization failed (%s)." msgstr "Nepavyko paruošti ZLIB (%s). " #: src/data/sys-file-reader.c:3699 #, c-format msgid "Inconsistency at end of ZLIB stream (%s)." msgstr "ZLIB srauto gale yra nenuoseklumų (%s)." #: src/data/sys-file-reader.c:3758 #, c-format msgid "ZLIB stream inconsistency (%s)." msgstr "ZLIB srautas yra nenuoseklus (%s)" #: src/data/sys-file-reader.c:3782 msgid "Unexpected end of ZLIB compressed data." msgstr "Netikėta su ZLIB suglaudintų duomenų pabaiga." #: src/data/sys-file-reader.c:3820 msgid "SPSS System File" msgstr "SPSS sisteminė rinkmena" #: src/data/sys-file-writer.c:210 #, c-format msgid "Unknown system file version %d. Treating as version %d." msgstr "Nežinoma sisteminės rinkmenos versija %d. Laikysima, kad tai yra %d." #: src/data/sys-file-writer.c:256 #, c-format msgid "Error opening `%s' for writing as a system file: %s." msgstr "Klaida atveriant „%s“ rašymui į sisteminę rinkmeną: %s." #: src/data/sys-file-writer.c:1271 #, c-format msgid "An I/O error occurred writing system file `%s'." msgstr "Įvedimo/išvedimo klaida įrašant sisteminę rinkmeną „%s“." #: src/data/sys-file-writer.c:1378 #, c-format msgid "Failed to initialize ZLIB for compression (%s)." msgstr "Glaudinant nepavyko paleisti ZLIB (%s)." #: src/data/sys-file-writer.c:1407 #, c-format msgid "Failed to complete ZLIB stream compression (%s)." msgstr "Nepavyko užbaigti ZLIB glaudinimo srauto (%s)." #: src/data/sys-file-writer.c:1449 #, c-format msgid "ZLIB stream compression failed (%s)." msgstr "ZLIB glaudinimo srauto klaida (%s)." #: src/data/sys-file-writer.c:1491 #, c-format msgid "%s: Seek failed (%s)." msgstr "%s: nepavyko rasti (%s)." #: src/data/variable.c:58 msgid "Left" msgstr "Kairinė" #: src/data/variable.c:59 msgid "Right" msgstr "Dešininė" #: src/data/variable.c:60 msgid "Center" msgstr "Centrinė" #: src/data/variable.c:66 msgid "Nominal" msgstr "Pavadinimų" #: src/data/variable.c:67 msgid "Ordinal" msgstr "Rangų" #: src/data/variable.c:68 src/language/stats/ks-one-sample.c:300 msgid "Scale" msgstr "Intervalų" #: src/data/variable.c:74 msgid "Input" msgstr "Įvedimas" #. TRANSLATORS: This will be part of a filename. Please avoid whitespace. #: src/data/variable.c:75 src/output/spv/spv-writer.c:213 #: src/ui/gui/psppire-output-window.c:547 msgid "Output" msgstr "Rezultatai" #: src/data/variable.c:76 msgid "Both" msgstr "Abu" #: src/data/variable.c:77 src/language/dictionary/sys-file-info.c:237 #: src/ui/gui/psppire-dialog-action-crosstabs.c:86 #: src/ui/gui/psppire-dialog-action-crosstabs.c:98 #: src/ui/gui/psppire-dialog-action-crosstabs.c:133 #: src/ui/gui/psppire-dialog-action-crosstabs.c:141 #: src/ui/gui/psppire-variable-sheet.c:408 src/ui/gui/var-display.c:34 msgid "None" msgstr "Nieko" #: src/data/variable.c:78 msgid "Partition" msgstr "Skirstymas" #: src/data/variable.c:79 src/ui/gui/reliability.ui:37 msgid "Split" msgstr "padalijimas" #: src/data/variable.c:729 #, c-format msgid "%s (%s)" msgstr "%s (%s)" #: src/data/variable.c:1339 msgid "" "At least one case in the data file had a weight value that was user-missing, " "system-missing, zero, or negative. These case(s) were ignored." msgstr "" "Nuskaitytoje rinkmenoje bent vienas atvejis turi svorio reikšmę, kuri yra " "naudotojo apibrėžta kaip praleista, sisteminė praleista, nulis arba " "neigiamas skaičius. Šie atvejai ignoruojami." #: src/language/command.c:207 src/language/stats/graph.c:749 #: src/language/stats/graph.c:755 src/language/stats/graph.c:789 #: src/language/stats/graph.c:794 src/language/stats/graph.c:799 #: src/language/stats/graph.c:852 src/language/stats/graph.c:857 #: src/language/stats/graph.c:862 src/language/stats/graph.c:867 #: src/language/stats/graph.c:872 src/language/stats/graph.c:877 #: src/language/stats/graph.c:882 src/language/utilities/set.q:236 #, c-format msgid "%s is not yet implemented." msgstr "%s dar nėra realizuota." #: src/language/command.c:212 #, c-format msgid "%s may be used only in testing mode." msgstr "%s gali būti naudojamas tik išbandymo veiksenoje." #: src/language/command.c:217 #, c-format msgid "%s may be used only in enhanced syntax mode." msgstr "%s gali būti naudojamas tik išplėstoje sintaksės veiksenoje." #: src/language/command.c:345 msgid "expecting command name" msgstr "tikėtasi komandos vardo" #: src/language/command.c:347 #, c-format msgid "Unknown command `%s'." msgstr "Nežinoma komanda „%s“." #: src/language/command.c:380 #, c-format msgid "%s is allowed only before the active dataset has been defined." msgstr "%s leidžiama tik prieš nurodant veikiamąjį duomenų rinkinį." #: src/language/command.c:384 #, c-format msgid "%s is allowed only after the active dataset has been defined." msgstr "%s leidžiama tik nurodžius veikiamąjį duomenų rinkinį." #: src/language/command.c:388 src/language/command.c:392 #, c-format msgid "%s is allowed only inside %s." msgstr "%s gali būti tik %s viduje." #: src/language/command.c:399 src/language/command.c:403 #, c-format msgid "" "%s is allowed only before the active dataset has been defined or inside %s." msgstr "" "%s leidžiama tik prieš nurodant veikiamąjį duomenų rinkinį arba %s viduje." #: src/language/command.c:407 src/language/command.c:411 #, c-format msgid "" "%s is allowed only after the active dataset has been defined or inside %s." msgstr "%s leidžiama tik nurodžius veikiamąjį duomenų rinkinį arba %s viduje." #: src/language/command.c:415 #, c-format msgid "%s is allowed only inside %s or inside %s." msgstr "%s gali būti tik %s viduje arba %s viduje." #: src/language/command.c:421 #, c-format msgid "" "%s is allowed only after the active dataset has been defined, inside INPUT " "PROGRAM, or inside FILE TYPE." msgstr "" "%s leidžiama tik nurodžius veikiamąjį duomenų rinkinį, INPUT PROGRAM viduje " "arba FILE TYPE viduje." #: src/language/command.c:426 #, c-format msgid "" "%s is allowed only before the active dataset has been defined, inside INPUT " "PROGRAM, or inside FILE TYPE." msgstr "" "%s leidžiama tik prieš nurodant veikiamąjį duomenų rinkinį, INPUT PROGRAM " "viduje arba FILE TYPE viduje." #: src/language/command.c:444 src/language/command.c:447 #, c-format msgid "%s is not allowed inside %s." msgstr "%s neleidžiama %s viduje." #: src/language/command.c:529 src/language/utilities/host.c:272 #: src/language/utilities/permissions.c:105 #, c-format msgid "This command not allowed when the %s option is set." msgstr "Ši komanda neleidžiama, jei naudojama parinktis „%s“." #: src/language/command.c:545 #, c-format msgid "Error removing `%s': %s." msgstr "Nepavyko pašalinti „%s“: %s." #: src/language/lexer/lexer.c:296 #, c-format msgid "expecting %s" msgstr "tikėtasi %s" #: src/language/lexer/lexer.c:300 #, c-format msgid "expecting %s or %s" msgstr "tikėtasi %s arba %s" #: src/language/lexer/lexer.c:304 #, c-format msgid "expecting %s, %s, or %s" msgstr "tikėtasi %s, %s arba %s" #: src/language/lexer/lexer.c:309 #, c-format msgid "expecting %s, %s, %s, or %s" msgstr "tikėtasi %s, %s, %s arba %s" #: src/language/lexer/lexer.c:314 #, c-format msgid "expecting %s, %s, %s, %s, or %s" msgstr "tikėtasi %s, %s, %s, %s arba %s" #: src/language/lexer/lexer.c:319 #, c-format msgid "expecting %s, %s, %s, %s, %s, or %s" msgstr "tikėtasi %s, %s, %s, %s, %s arba %s" #: src/language/lexer/lexer.c:325 #, c-format msgid "expecting %s, %s, %s, %s, %s, %s, or %s" msgstr "tikėtasi %s, %s, %s, %s, %s, %s arba %s" #: src/language/lexer/lexer.c:331 #, c-format msgid "expecting %s, %s, %s, %s, %s, %s, %s, or %s" msgstr "tikėtasi %s, %s, %s, %s, %s, %s, %s arba %s" #: src/language/lexer/lexer.c:351 #, c-format msgid "Subcommand %s may only be specified once." msgstr "Pokomandis %s gali būti nurodomas tik vieną kartą." #: src/language/lexer/lexer.c:363 #, c-format msgid "Required subcommand %s was not specified." msgstr "Pokomandis %s nenurodytas." #: src/language/lexer/lexer.c:371 #, c-format msgid "%s may only be specified once within subcommand %s" msgstr "%s gali būti nurodomas tik vieną kartą pokomandyje %s." #: src/language/lexer/lexer.c:380 #, c-format msgid "Required %s specification missing from %s subcommand" msgstr "Trūksta reikiamos %s specifikacijos iš pokomandžio %s." #: src/language/lexer/lexer.c:399 msgid "Syntax error at end of input" msgstr "Sintaksės klaida įvedimo pabaigoje" #: src/language/lexer/lexer.c:420 src/language/xforms/select-if.c:60 #: src/language/stats/autorecode.c:206 src/language/stats/npar.c:503 #: src/language/data-io/print-space.c:83 msgid "expecting end of command" msgstr "tikėtasi komandos pabaigos" #: src/language/lexer/lexer.c:631 msgid "expecting string" msgstr "tikėtasi teksto eilutės" #: src/language/lexer/lexer.c:660 msgid "expecting integer" msgstr "tikėtasi sveikojo skaičiaus" #: src/language/lexer/lexer.c:673 msgid "expecting number" msgstr "tikėtasi skaičiaus" #: src/language/lexer/lexer.c:685 msgid "expecting identifier" msgstr "tikėtasi identifikatoriaus" #: src/language/lexer/lexer.c:1272 msgid "Syntax error at end of command" msgstr "Sintaksės klaida komandos pabaigoje" #: src/language/lexer/lexer.c:1281 #, c-format msgid "Syntax error at `%s'" msgstr "Sintaksės klaida ties %s." #: src/language/lexer/lexer.c:1284 msgid "Syntax error" msgstr "Sintaksės klaida" #: src/language/lexer/lexer.c:1470 #, c-format msgid "String of hex digits has %d characters, which is not a multiple of 2" msgstr "" "Šešioliktainių skaitmenų eilutė turi %d rašmenis, bet šis skaičius " "nesidalina iš 2" #: src/language/lexer/lexer.c:1477 #, c-format msgid "`%c' is not a valid hex digit" msgstr "„%c“ nėra tinkamas šešioliktainis skaitmuo" #: src/language/lexer/lexer.c:1482 #, c-format msgid "" "Unicode string contains %d bytes, which is not in the valid range of 1 to 8 " "bytes" msgstr "" "Unikodo eilutė turi %d bitus, bet tai nepatenka į tinkamą intervalą nuo 1 " "iki 8 bitų" #: src/language/lexer/lexer.c:1488 #, c-format msgid "U+%04X is not a valid Unicode code point" msgstr "U+%04X nėra tinkamas unikodo kodo taškas" #: src/language/lexer/lexer.c:1493 msgid "Unterminated string constant" msgstr "Nebaigta eilutės konstanta" #: src/language/lexer/lexer.c:1497 #, c-format msgid "Missing exponent following `%s'" msgstr "Trūksta eksponentės po „%s“" #: src/language/lexer/lexer.c:1502 msgid "Unexpected `.' in middle of command" msgstr "Komandos viduryje netikėtai rastas „.“" #: src/language/lexer/lexer.c:1508 #, c-format msgid "Bad character %s in input" msgstr "Įvestyje yra neleistinas rašmuo %s" #: src/language/lexer/lexer.c:1603 #, c-format msgid "Opening `%s': %s." msgstr "Atveriama „%s“: %s." #: src/language/lexer/lexer.c:1647 #, c-format msgid "Error closing `%s': %s." msgstr "Klaida užveriant „%s“: %s." #: src/language/lexer/subcommand-list.c:118 #, c-format msgid "No more than %d %s subcommands allowed." msgstr "Leidžiama ne daugiau kaip %d %s pokomandžių." #: src/language/lexer/format-parser.c:77 msgid "expecting valid format specifier" msgstr "tikėtasi tinkamo formato nurodymo" #: src/language/lexer/format-parser.c:116 #: src/language/lexer/format-parser.c:143 src/language/utilities/output.c:108 #: src/language/data-io/data-list.c:453 src/language/data-io/get-data.c:638 #: src/language/data-io/placement-parser.c:236 #, c-format msgid "Unknown format type `%s'." msgstr "Nežinomas formato tipas „%s“." #: src/language/lexer/format-parser.c:122 #, c-format msgid "Format specifier `%s' lacks required width." msgstr "" #: src/language/lexer/format-parser.c:138 msgid "expecting format type" msgstr "tikėtasi formato tipo" #: src/language/lexer/value-parser.c:66 #, c-format msgid "" "The high end of the range (%.*g) is below the low end (%.*g). The range " "will be treated as if reversed." msgstr "" #: src/language/lexer/value-parser.c:74 #, c-format msgid "Ends of range are equal (%.*g)." msgstr "Srities galai yra vienodi (%.*g)." #: src/language/lexer/value-parser.c:82 #, c-format msgid "%s or %s must be part of a range." msgstr "%s arba %s turi būti srities dalis." #: src/language/lexer/value-parser.c:112 msgid "System-missing value is not valid here." msgstr "Sisteminė praleista reikšmė čia negalioja." #: src/language/lexer/variable-parser.c:86 utilities/pspp-convert.c:83 msgid "expecting variable name" msgstr "tikimasi kintamojo vardo" #: src/language/lexer/variable-parser.c:96 #, c-format msgid "%s is not a variable name." msgstr "%s nėra kintamojo vardas." #: src/language/lexer/variable-parser.c:206 #, c-format msgid "" "%s is not a numeric variable. It will not be included in the variable list." msgstr "" "%s nėra skaitmeninis kintamasis. Jis nebus įtrauktas į kintamųjų sąrašą." #: src/language/lexer/variable-parser.c:209 #, c-format msgid "" "%s is not a string variable. It will not be included in the variable list." msgstr "" "%s nėra teksto eilutės kintamasis. Jis nebus įtrauktas į kintamųjų sąrašą." #: src/language/lexer/variable-parser.c:213 #, c-format msgid "Scratch variables (such as %s) are not allowed here." msgstr "" #: src/language/lexer/variable-parser.c:217 #, c-format msgid "" "%s and %s are not the same type. All variables in this variable list must " "be of the same type. %s will be omitted from the list." msgstr "" "%s ir %s nėra tas pats tipas. Visi šio sąrašo kintamieji turi būti to paties " "tipo. %s bus neįtrauktas į sąrašą." #: src/language/lexer/variable-parser.c:223 #, c-format msgid "" "%s and %s are string variables with different widths. All variables in this " "variable list must have the same width. %s will be omitted from the list." msgstr "" #: src/language/lexer/variable-parser.c:228 #: src/language/lexer/variable-parser.c:447 #, c-format msgid "Variable %s appears twice in variable list." msgstr "Kintamasis %s kintamųjų sąraše pasikartoja du kartus." #: src/language/lexer/variable-parser.c:341 #, c-format msgid "%s TO %s is not valid syntax since %s precedes %s in the dictionary." msgstr "" #: src/language/lexer/variable-parser.c:349 #, c-format msgid "" "When using the TO keyword to specify several variables, both variables must " "be from the same variable dictionaries, of either ordinary, scratch, or " "system variables. %s is a %s variable, whereas %s is %s." msgstr "" #: src/language/lexer/variable-parser.c:424 #, c-format msgid "`%s' cannot be used with TO because it does not end in a digit." msgstr "" #: src/language/lexer/variable-parser.c:432 #, c-format msgid "Numeric suffix on `%s' is larger than supported with TO." msgstr "" #: src/language/lexer/variable-parser.c:505 msgid "Scratch variables not allowed here." msgstr "" #: src/language/lexer/variable-parser.c:529 msgid "Prefixes don't match in use of TO convention." msgstr "" #: src/language/lexer/variable-parser.c:534 msgid "Bad bounds in use of TO convention." msgstr "" #: src/language/xforms/compute.c:150 src/language/xforms/compute.c:205 #, c-format msgid "" "When executing COMPUTE: SYSMIS is not a valid value as an index into vector " "%s." msgstr "" #: src/language/xforms/compute.c:154 src/language/xforms/compute.c:212 #, c-format msgid "" "When executing COMPUTE: %.*g is not a valid value as an index into vector %s." msgstr "" #: src/language/xforms/compute.c:356 #, c-format msgid "There is no vector named %s." msgstr "Tokio vektoriaus vardu %s nėra" #: src/language/xforms/count.c:125 msgid "Destination cannot be a string variable." msgstr "Paskirtis negali būti teksto eilutės kintamasis." #: src/language/xforms/sample.c:76 msgid "The sampling factor must be between 0 and 1 exclusive." msgstr "" #: src/language/xforms/sample.c:96 #, c-format msgid "Cannot sample %d observations from a population of %d." msgstr "" #: src/language/xforms/recode.c:261 msgid "" "Inconsistent target variable types. Target variables must be all numeric or " "all string." msgstr "" #: src/language/xforms/recode.c:282 msgid "CONVERT requires string input values and numeric output values." msgstr "" "CONVERT komandai reikia tekstinių reikšmių įvestyje ir skaitmeninių reikšmių " "išvestyje." #: src/language/xforms/recode.c:339 #, c-format msgid "%s is not allowed with string variables." msgstr "%s: negalima su tekstinės eilutės kintamaisiais." #: src/language/xforms/recode.c:422 msgid "expecting output value" msgstr "tikėtasi išvedimo reikšmės" #: src/language/xforms/recode.c:479 #, c-format msgid "" "%zu variable(s) cannot be recoded into %zu variable(s). Specify the same " "number of variables as source and target variables." msgstr "" #: src/language/xforms/recode.c:494 #, c-format msgid "" "There is no variable named %s. (All string variables specified on INTO must " "already exist. Use the STRING command to create a string variable.)" msgstr "" #: src/language/xforms/recode.c:510 #, c-format msgid "INTO is required with %s input values and %s output values." msgstr "" #: src/language/xforms/recode.c:523 #, c-format msgid "Type mismatch. Cannot store %s data in %s variable %s." msgstr "Netinka tipas. Negalima saugoti %s duomenų %s kintamajame %s." #: src/language/xforms/recode.c:566 #, c-format msgid "" "Cannot recode because the variable %s would require a width of %d bytes or " "greater, but it has a width of only %d bytes." msgstr "" #: src/language/xforms/select-if.c:100 msgid "Syntax error expecting OFF or BY. Turning off case filtering." msgstr "Sintaksės klaida. Tikėtasi OFF arba BY. Atvejų atranka išjungiama." #: src/language/xforms/select-if.c:115 msgid "The filter variable must be numeric." msgstr "Kintamasis filtravimui privalo būti skaitmeninis." #: src/language/xforms/select-if.c:121 msgid "The filter variable may not be scratch." msgstr "" #: src/language/control/control-stack.c:49 #, c-format msgid "%s without %s." msgstr "%s be %s." #: src/language/control/control-stack.c:77 #, c-format msgid "This command must appear inside %s...%s, without intermediate %s...%s." msgstr "" #: src/language/control/control-stack.c:94 #, c-format msgid "This command cannot appear outside %s...%s." msgstr "Ši komanda negali būti naudojama už %s... %s." #: src/language/control/do-if.c:180 #, c-format msgid "This command may not follow %s in %s ... %s." msgstr "Ši komanda negali eiti po %s, kai yra %s viduje... %s." #: src/language/control/loop.c:211 msgid "Only one index clause may be specified." msgstr "" #: src/language/control/repeat.c:120 #, c-format msgid "Dummy variable name `%s' hides dictionary variable `%s'." msgstr "Fiktyvusis kintamojo vardas „%s“ slepia žodyno kintamąjį „%s“." #: src/language/control/repeat.c:126 #, c-format msgid "Dummy variable name `%s' is given twice." msgstr "Fiktyvusis kintamasis vardas „%s“ pateiktas du kartus." #: src/language/control/repeat.c:170 #, c-format msgid "" "Dummy variable `%s' had %zu substitutions, so `%s' must also, but %zu were " "specified." msgstr "" #: src/language/control/repeat.c:379 msgid "Ranges may only have integer bounds." msgstr "Sričių ribos gali būti tik sveikieji skaičiai." #: src/language/control/repeat.c:393 #, c-format msgid "%ld TO %ld is an invalid range." msgstr "Netinkama sritis %ld TO %ld." #: src/language/control/repeat.c:443 #, c-format msgid "No matching %s." msgstr "Nėra, kas atitiktų %s." #: src/language/control/temporary.c:44 msgid "" "This command may only appear once between procedures and procedure-like " "commands." msgstr "" #: src/language/dictionary/attributes.c:104 msgid "Attribute array index must be between 1 and 65535." msgstr "Atributo masyvo rodyklė turi būti tarp 1 ir 65535." #: src/language/dictionary/apply-dictionary.c:74 #, c-format msgid "Variable %s is %s in target file, but %s in source file." msgstr "" #: src/language/dictionary/apply-dictionary.c:110 msgid "No matching variables found between the source and target files." msgstr "Tarp šaltinio ir paskirties rinkmenų nerasta atitinkančių kintamųjų." #: src/language/dictionary/delete-variables.c:40 #: src/language/dictionary/modify-variables.c:79 #: src/language/dictionary/rename-variables.c:51 #, c-format msgid "" "%s may not be used after %s. Temporary transformations will be made " "permanent." msgstr "" "%s negali būti po %s. Laikinos transformacijos bus atliekamos kaip " "ilgalaikės." #: src/language/dictionary/delete-variables.c:48 #: src/language/dictionary/modify-variables.c:312 #, c-format msgid "" "%s may not be used to delete all variables from the active dataset " "dictionary. Use %s instead." msgstr "" "%s komandos negalima naudoti visų kintamųjų šalinimui iš veikiamojo duomenų " "rinkinio. Verčiau naudokite %s." #: src/language/dictionary/missing-values.c:70 #, c-format msgid "" "Cannot mix numeric variables (e.g. %s) and string variables (e.g. %s) within " "a single list." msgstr "" "Tame pačiame sąraše negali būti kartu skaitmeninių kintamųjų (pvz., %s) ir " "teksto eilučių (pvz., %s)." #: src/language/dictionary/missing-values.c:91 msgid "" "Too many numeric missing values. At most three individual values or one " "value and one range are allowed." msgstr "" #: src/language/dictionary/missing-values.c:126 #, c-format msgid "Truncating missing value to maximum acceptable length (%d bytes)." msgstr "" #: src/language/dictionary/missing-values.c:137 msgid "" "Too many string missing values. At most three individual values are allowed." msgstr "" #: src/language/dictionary/missing-values.c:154 #, c-format msgid "Missing values provided are too long to assign to variable of width %d." msgstr "" "Pateiktos trūkstamos reikšmės yra per ilgos, tad negalima jų priskirti prie " "kintamojo, kurio plotis %d." #: src/language/dictionary/modify-variables.c:145 msgid "Cannot specify ALL after specifying a set of variables." msgstr "Nurodžius kintamųjų rinkinį, negalima nurodyti ALL (visų)." #: src/language/dictionary/modify-variables.c:221 #: src/language/dictionary/rename-variables.c:76 #, c-format msgid "" "Differing number of variables in old name list (%zu) and in new name list " "(%zu)." msgstr "" #: src/language/dictionary/modify-variables.c:244 #: src/language/dictionary/modify-variables.c:294 #, c-format msgid "" "%s subcommand may be given at most once. It may not be given in conjunction " "with the %s subcommand." msgstr "" "Pokomandis %s gali būti pateikiamas tik vieną kartą. Jis negali būti " "pateikiamas kartu su pokomandžiu %s." #: src/language/dictionary/modify-variables.c:331 #, c-format msgid "Unrecognized subcommand name `%s'." msgstr "Neatpažintas pokomandžio vardas „%s“." #: src/language/dictionary/modify-variables.c:334 msgid "Subcommand name expected." msgstr "Tikėtasi pokomandžio vardo." #: src/language/dictionary/mrsets.c:117 #, c-format msgid "" "VARIABLES specified only variable %s on %s, but at least two variables are " "required." msgstr "" #: src/language/dictionary/mrsets.c:150 msgid "Numeric VALUE must be an integer." msgstr "Skaitmeninė reikšmė (VALUE) turi būti sveikasis skaičius." #: src/language/dictionary/mrsets.c:230 src/language/dictionary/mrsets.c:268 #, c-format msgid "" "MDGROUP subcommand for group %s specifies a string VALUE, but the variables " "specified for this group are numeric." msgstr "" #: src/language/dictionary/mrsets.c:254 #, c-format msgid "" "VALUE string on MDGROUP subcommand for group %s is %d bytes long, but it " "must be no longer than the narrowest variable in the group, which is %s with " "a width of %d bytes." msgstr "" #: src/language/dictionary/mrsets.c:280 #, c-format msgid "" "MDGROUP subcommand for group %s specifies LABELSOURCE=VARLABEL but not " "CATEGORYLABELS=COUNTEDVALUES. Ignoring LABELSOURCE." msgstr "" #: src/language/dictionary/mrsets.c:286 #, c-format msgid "" "MDGROUP subcommand for group %s specifies both LABEL and LABELSOURCE, but " "only one of these subcommands may be used at a time. Ignoring LABELSOURCE." msgstr "" #: src/language/dictionary/mrsets.c:326 #, c-format msgid "" "Variables %s and %s specified as part of multiple dichotomy group %s have " "the same variable label. Categories represented by these variables will not " "be distinguishable in output." msgstr "" #: src/language/dictionary/mrsets.c:356 #, c-format msgid "" "Variable %s specified as part of multiple dichotomy group %s (which has " "CATEGORYLABELS=COUNTEDVALUES) has no value label for its counted value. " "This category will not be distinguishable in output." msgstr "" #: src/language/dictionary/mrsets.c:369 #, c-format msgid "" "Variables %s and %s specified as part of multiple dichotomy group %s (which " "has CATEGORYLABELS=COUNTEDVALUES) have the same value label for the group's " "counted value. These categories will not be distinguishable in output." msgstr "" #: src/language/dictionary/mrsets.c:426 #, c-format msgid "" "Variables specified on MCGROUP should have the same categories, but %s and " "%s (and possibly others) in multiple category group %s have different value " "labels for value %s." msgstr "" #: src/language/dictionary/mrsets.c:484 #, c-format msgid "No multiple response set named %s." msgstr "" #: src/language/dictionary/mrsets.c:533 msgid "" "The active dataset dictionary does not contain any multiple response sets." msgstr "" #: src/language/dictionary/mrsets.c:540 msgid "Multiple Response Sets" msgstr "Daugialypių atsakų rinkinys" #: src/language/dictionary/mrsets.c:543 #: src/language/dictionary/sys-file-info.c:446 #: src/language/dictionary/sys-file-info.c:733 #: src/language/stats/autorecode.c:375 src/language/data-io/data-parser.c:679 #: src/language/data-io/data-parser.c:725 src/language/data-io/print.c:434 msgid "Attributes" msgstr "Atributai" #: src/language/dictionary/mrsets.c:544 #: src/language/dictionary/sys-file-info.c:191 #: src/language/dictionary/sys-file-info.c:301 #: src/language/dictionary/sys-file-info.c:302 #: src/language/dictionary/sys-file-info.c:455 #: src/language/dictionary/sys-file-info.c:570 #: src/ui/gui/psppire-var-sheet-header.c:67 src/ui/gui/compute.ui:157 msgid "Label" msgstr "Etiketė" #: src/language/dictionary/mrsets.c:544 #: src/language/dictionary/sys-file-info.c:241 msgid "Encoding" msgstr "Koduotė" #: src/language/dictionary/mrsets.c:544 msgid "Counted Value" msgstr "Apskaičiuota reikšmė" #: src/language/dictionary/mrsets.c:544 msgid "Member Variables" msgstr "Nario kintamieji" #: src/language/dictionary/mrsets.c:547 #: src/language/dictionary/sys-file-info.c:470 #: src/ui/gui/psppire-var-sheet-header.c:55 msgid "Name" msgstr "Vardas" #: src/language/dictionary/mrsets.c:564 msgid "Dichotomies" msgstr "Dichotomija" #: src/language/dictionary/mrsets.c:565 src/language/stats/logistic.c:1391 msgid "Categories" msgstr "Kategorijos" #: src/language/dictionary/numeric.c:67 #, c-format msgid "Format type %s may not be used with a numeric variable." msgstr "Formato %s tipas negali būti naudojamas su skaitmeniniu kintamuoju." #: src/language/dictionary/numeric.c:86 src/language/dictionary/numeric.c:153 #, c-format msgid "There is already a variable named %s." msgstr "Kintamasis tokiu vardu %s jau yra." #: src/language/dictionary/numeric.c:138 #, c-format msgid "Format type %s may not be used with a string variable." msgstr "Formato %s tipas negali būti naudojamas su teksto eilutės kintamuoju." #: src/language/dictionary/rename-variables.c:92 #, c-format msgid "Renaming would duplicate variable name %s." msgstr "Pervadinama nekartojant kintamojo vardo %s." #: src/language/dictionary/split-file.c:75 msgid "Split Values" msgstr "Skaidyti reikšmes" #: src/language/dictionary/split-file.c:76 #: src/language/dictionary/split-file.c:77 #: src/language/dictionary/sys-file-info.c:696 #: src/language/stats/chisquare.c:195 src/language/stats/cochran.c:156 #: src/language/stats/cochran.c:185 src/language/stats/examine.c:841 #: src/language/stats/reliability.c:648 src/language/stats/reliability.c:651 #: src/language/stats/crosstabs.q:1303 src/language/stats/crosstabs.q:1325 #: src/language/stats/crosstabs.q:1365 src/language/stats/crosstabs.q:1412 msgid "Value" msgstr "Reikšmė" #: src/language/dictionary/split-file.c:79 #: src/language/dictionary/sys-file-info.c:734 #: src/language/stats/chisquare.c:246 src/language/stats/chisquare.c:328 #: src/language/stats/cochran.c:164 src/language/stats/correlations.c:100 #: src/language/stats/descriptives.c:1004 src/language/stats/friedman.c:226 #: src/language/stats/jonckheere-terpstra.c:377 #: src/language/stats/npar-summary.c:113 src/language/stats/quick-cluster.c:588 #: src/language/stats/runs.c:331 src/language/data-io/data-parser.c:683 #: src/language/data-io/data-parser.c:728 src/language/data-io/print.c:438 #: src/ui/gui/psppire-dictview.c:580 src/ui/gui/psppire-data-editor.c:502 msgid "Variable" msgstr "Kintamasis" #: src/language/dictionary/sys-file-info.c:184 msgid "File Information" msgstr "Informacija apie rinkmeną" #: src/language/dictionary/sys-file-info.c:185 msgid "Attribute" msgstr "Atributas" #: src/language/dictionary/sys-file-info.c:187 msgid "File" msgstr "Rinkmena" #: src/language/dictionary/sys-file-info.c:194 msgid "Created" msgstr "Sukurta" #: src/language/dictionary/sys-file-info.c:203 msgid "Integer Format" msgstr "Sveikojo skaičiaus formatas" #: src/language/dictionary/sys-file-info.c:205 msgid "Big Endian" msgstr "Mažėjantys baitai" #: src/language/dictionary/sys-file-info.c:206 msgid "Little Endian" msgstr "Didėjantys baitai" #: src/language/dictionary/sys-file-info.c:207 #: src/language/dictionary/sys-file-info.c:216 #: src/language/dictionary/sys-file-info.c:223 src/language/utilities/set.q:930 msgid "Unknown" msgstr "Nežinoma" #: src/language/dictionary/sys-file-info.c:209 msgid "Real Format" msgstr "Realus formatas" #: src/language/dictionary/sys-file-info.c:211 msgid "IEEE 754 LE." msgstr "IEEE 754 didėjantys baitai." #: src/language/dictionary/sys-file-info.c:212 msgid "IEEE 754 BE." msgstr "IEEE 754 mažėjantys baitai." #: src/language/dictionary/sys-file-info.c:213 msgid "VAX D." msgstr "VAX D." #: src/language/dictionary/sys-file-info.c:214 msgid "VAX G." msgstr "VAX G." #: src/language/dictionary/sys-file-info.c:215 msgid "IBM 390 Hex Long." msgstr "IBM 390 ilgas šešioliktainis" #: src/language/dictionary/sys-file-info.c:218 #: src/language/dictionary/sys-file-info.c:443 #: src/language/stats/binomial.c:199 src/language/stats/correlations.c:131 #: src/language/stats/correlations.c:159 src/language/stats/descriptives.c:585 #: src/language/stats/factor.c:1658 src/language/stats/factor.c:1701 #: src/language/stats/factor.c:1860 src/language/stats/factor.c:2074 #: src/language/stats/frequencies.c:1583 #: src/language/stats/kruskal-wallis.c:254 #: src/language/stats/kruskal-wallis.c:303 #: src/language/stats/ks-one-sample.c:316 src/language/stats/logistic.c:1187 #: src/language/stats/mann-whitney.c:254 src/language/stats/means.c:718 #: src/language/stats/means.c:800 src/language/stats/median.c:358 #: src/language/stats/oneway.c:985 src/language/stats/oneway.c:1157 #: src/language/stats/reliability.c:591 src/language/stats/regression.c:924 #: src/language/stats/t-test-one-sample.c:132 #: src/language/stats/t-test-paired.c:157 src/language/data-io/list.c:104 #: src/ui/gui/variable-info.ui:25 msgid "Variables" msgstr "Kintamieji" #: src/language/dictionary/sys-file-info.c:221 src/language/stats/examine.c:929 #: src/language/stats/means.c:697 src/language/stats/reliability.c:548 #: src/language/stats/crosstabs.q:930 msgid "Cases" msgstr "Atvejų" #: src/language/dictionary/sys-file-info.c:226 src/language/stats/oneway.c:980 #: src/ui/gui/psppire-var-sheet-header.c:58 src/ui/gui/compute.ui:303 msgid "Type" msgstr "Tipas" #: src/language/dictionary/sys-file-info.c:230 msgid "Weight" msgstr "Svėrimas" #: src/language/dictionary/sys-file-info.c:233 msgid "Not weighted" msgstr "Nesveriama" #: src/language/dictionary/sys-file-info.c:235 msgid "Compression" msgstr "Glaudinimas" #: src/language/dictionary/sys-file-info.c:245 #: src/language/dictionary/sys-file-info.c:424 #: src/language/dictionary/sys-file-info.c:426 msgid "Documents" msgstr "Dokumentai" #: src/language/dictionary/sys-file-info.c:305 #: src/language/dictionary/sys-file-info.c:430 msgid "(none)" msgstr "(nėra)" #: src/language/dictionary/sys-file-info.c:393 msgid "No variables to display." msgstr "Nėra rodytinų kintamųjų." #: src/language/dictionary/sys-file-info.c:404 msgid "Macros not supported." msgstr "Makrokomandos nepalaikomos." #: src/language/dictionary/sys-file-info.c:426 msgid "Document" msgstr "Dokumentas" #: src/language/dictionary/sys-file-info.c:454 msgid "Position" msgstr "Padėtis" #: src/language/dictionary/sys-file-info.c:456 msgid "Measurement Level" msgstr "Matavimo skalė" #: src/language/dictionary/sys-file-info.c:457 #: src/ui/gui/psppire-var-sheet-header.c:85 msgid "Role" msgstr "Vaidmuo" #: src/language/dictionary/sys-file-info.c:458 #: src/ui/gui/psppire-var-sheet-header.c:61 src/ui/gui/compute.ui:215 msgid "Width" msgstr "Plotis" #: src/language/dictionary/sys-file-info.c:459 msgid "Alignment" msgstr "Lygiuotė" #: src/language/dictionary/sys-file-info.c:460 #: src/language/dictionary/sys-file-info.c:734 msgid "Print Format" msgstr "Spausdinimo formatas" #: src/language/dictionary/sys-file-info.c:461 msgid "Write Format" msgstr "Rašymo formatas" #: src/language/dictionary/sys-file-info.c:462 #: src/ui/gui/missing-val-dialog.c:379 src/ui/gui/psppire-var-sheet-header.c:73 #: src/ui/gui/examine.ui:416 src/ui/gui/t-test.ui:105 msgid "Missing Values" msgstr "Praleistos reikšmės" #: src/language/dictionary/sys-file-info.c:567 #: src/ui/gui/psppire-var-sheet-header.c:70 src/ui/gui/val-labs-dialog.c:489 #: src/ui/gui/val-labs-dialog.ui:194 msgid "Value Labels" msgstr "Reikšmių etiketės" #: src/language/dictionary/sys-file-info.c:573 msgid "Variable Value" msgstr "Kintamojo reikšmė" #: src/language/dictionary/sys-file-info.c:577 msgid "User-missing value" msgstr "Naudotojo nepraleista reikšmė" #: src/language/dictionary/sys-file-info.c:693 msgid "Variable and Dataset Attributes" msgstr "Kintamųjų ir duomenų rinkinio atributai" #: src/language/dictionary/sys-file-info.c:699 msgid "Variable and Name" msgstr "Kintamasis ir vardas" #: src/language/dictionary/sys-file-info.c:702 msgid "(dataset)" msgstr "(duomenų rinkinys)" #: src/language/dictionary/sys-file-info.c:722 msgid "No vectors defined." msgstr "Neapibrėžtas joks vektorius" #: src/language/dictionary/sys-file-info.c:732 msgid "Vectors" msgstr "Vektoriai" #: src/language/dictionary/sys-file-info.c:736 msgid "Vector and Position" msgstr "Vektorius ir padėtis" #: src/language/dictionary/sys-file-info.c:998 msgid "No valid encodings found." msgstr "Tinkamų koduočių nerasta." #: src/language/dictionary/sys-file-info.c:1004 #, c-format msgid "Usable encodings for %s." msgstr "Su %s tinkamos koduotės." #: src/language/dictionary/sys-file-info.c:1007 #, c-format msgid "" "Encodings that can successfully read %s (by specifying the encoding name on " "the GET command's ENCODING subcommand). Encodings that yield identical text " "are listed together." msgstr "" "Lentelėje pateikiamas sąrašas koduočių, kuriomis galima sėkmingai nuskaityti " "%s, kai ta koduotė nurodoma GET komandos pokomandyje ENCODING. Koduotės, " "kurios grąžintų tą patį tekstą, pateiktos kartu." #: src/language/dictionary/sys-file-info.c:1012 #: src/language/dictionary/sys-file-info.c:1013 msgid "Encodings" msgstr "Koduotės" #: src/language/dictionary/sys-file-info.c:1042 #, c-format msgid "%s Encoded Text Strings" msgstr "Tekstas užkoduotas su %s." #: src/language/dictionary/sys-file-info.c:1046 msgid "" "Text strings in the file dictionary that the previously listed encodings " "interpret differently, along with the interpretations." msgstr "" "Lentelėje pateikiamos teksto eilutės, kurias koduotės interpretuoja " "skirtingai." #: src/language/dictionary/sys-file-info.c:1049 src/output/text-item.c:57 #: src/ui/gui/psppire-import-assistant.c:885 msgid "Text" msgstr "Tekstas" #: src/language/dictionary/sys-file-info.c:1059 msgid "Purpose" msgstr "Paskirtis" #: src/language/dictionary/value-labels.c:154 #, c-format msgid "Truncating value label to %d bytes." msgstr "Reikmės etiketė sutrumpinama iki %d bitų." #: src/language/dictionary/vector.c:66 #, c-format msgid "A vector named %s already exists." msgstr "Vektorius tokiu vardu %s jau yra." #: src/language/dictionary/vector.c:74 #, c-format msgid "Vector name %s is given twice." msgstr "Vektoriaus vardas %s pateiktas du kartus." #: src/language/dictionary/vector.c:98 msgid "A slash must separate each vector specification in VECTOR's long form." msgstr "" #: src/language/dictionary/vector.c:131 msgid "Vectors must have at least one element." msgstr "Vektoriai privalo turėti bent vieną elementą." #: src/language/dictionary/vector.c:151 msgid "expecting vector length" msgstr "tikimasi vektoriaus ilgio" #: src/language/dictionary/vector.c:170 #, c-format msgid "%s is an existing variable name." msgstr "%s yra jau esamo kintamojo vardas." #: src/language/dictionary/variable-display.c:121 msgid "Variable display width must be a positive integer." msgstr "Kintamojo rodomas plotis turi būti sveikasis teigiamas skaičius." #: src/language/dictionary/weight.c:49 msgid "The weighting variable must be numeric." msgstr "Svėrimo kintamasis turi būti skaitmeninis." #: src/language/dictionary/weight.c:54 msgid "The weighting variable may not be scratch." msgstr "Svėrimo kintamasis negali būti tuščias." #: src/language/tests/moments-test.c:50 msgid "expecting weight value" msgstr "tikėtasi svorio reikšmės" #: src/language/utilities/cd.c:45 src/language/utilities/include.c:173 #, fuzzy, c-format #| msgid "Cannot change directory to %s: %s " msgid "Cannot change directory to %s: %s" msgstr "Nepavyksta pakeisti katalogo į %s: %s " #: src/language/utilities/date.c:33 #, c-format msgid "Only %s is currently implemented." msgstr "Šiuo metu realizuota tik %s." #: src/language/utilities/host.c:60 #, fuzzy #| msgid "Command shell not supported on this platform." msgid "Time limit not supported on this platform." msgstr "Komandų apvalkalas šioje platformoje nėra palaikomas." #: src/language/utilities/host.c:74 #, c-format msgid "%s: Command exited with status %d." msgstr "" #: src/language/utilities/host.c:95 #, fuzzy, c-format #| msgid "failed to create temporary file" msgid "Failed to create temporary file (%s)." msgstr "nepavyko sukurti laikinos rinkmenos" #: src/language/utilities/host.c:102 #, c-format msgid "/dev/null: Failed to open (%s)." msgstr "" #: src/language/utilities/host.c:117 #, c-format msgid "Couldn't fork: %s." msgstr "" #: src/language/utilities/host.c:193 #, c-format msgid "While running \"%s\", waiting for child process failed (%s)." msgstr "" #: src/language/utilities/host.c:203 #, c-format msgid "Command \"%s\" timed out." msgstr "" #: src/language/utilities/host.c:205 #, c-format msgid "Command \"%s\" terminated by signal %d." msgstr "" #: src/language/utilities/host.c:212 msgid "Command or shell not found" msgstr "" #: src/language/utilities/host.c:214 msgid "Could not invoke command or shell" msgstr "" #: src/language/utilities/host.c:217 #, c-format msgid "Command \"%s\" exited with status %d (%s)." msgstr "" #: src/language/utilities/host.c:220 #, c-format msgid "Command \"%s\" exited with status %d." msgstr "" #: src/language/utilities/host.c:230 #, c-format msgid "Command \"%s\" output could not be read (%s)." msgstr "" #: src/language/utilities/title.c:88 #, c-format msgid " (Entered %s)" msgstr " (įvesta %s)" #: src/language/utilities/include.c:73 #, c-format msgid "Can't find `%s' in include file search path." msgstr "Nurodytame failų paieškos kelyje nepavyksta rasti „%s“." #: src/language/utilities/output.c:128 #, c-format msgid "Unknown cell class %s." msgstr "Nežinoma langelio klasė „%s“." #: src/language/utilities/permissions.c:113 #, c-format msgid "Cannot stat %s: %s" msgstr "Nepavyksta nustatyti %s: %s" #: src/language/utilities/permissions.c:127 #, c-format msgid "Cannot change mode of %s: %s" msgstr "Nepavyksta pakeisti %s veiksenos: %s" #: src/language/stats/aggregate.c:96 msgid "Sum of values" msgstr "Reikšmių suma" #: src/language/stats/aggregate.c:97 msgid "Mean average" msgstr "Bendras vidurkis" #: src/language/stats/aggregate.c:98 msgid "Median average" msgstr "Medianos vidurkis" #: src/language/stats/aggregate.c:99 #: src/ui/gui/psppire-dialog-action-descriptives.c:40 #: src/ui/gui/psppire-dialog-action-frequencies.c:41 msgid "Standard deviation" msgstr "Standartinis nuokrypis" #: src/language/stats/aggregate.c:100 #: src/ui/gui/psppire-dialog-action-descriptives.c:42 msgid "Maximum value" msgstr "Didžiausia reikšmė" #: src/language/stats/aggregate.c:101 #: src/ui/gui/psppire-dialog-action-descriptives.c:41 msgid "Minimum value" msgstr "Mažiausia reikšmė" #: src/language/stats/aggregate.c:102 msgid "Percentage greater than" msgstr "Procentinė dalis didesnė už" #: src/language/stats/aggregate.c:103 msgid "Percentage less than" msgstr "Procentinė dalis mažesnė už" #: src/language/stats/aggregate.c:104 msgid "Percentage included in range" msgstr "Procentinė dalis įtraukta į sritį" #: src/language/stats/aggregate.c:105 msgid "Percentage excluded from range" msgstr "Procentinė dalis neįtraukta į sritį" #: src/language/stats/aggregate.c:106 msgid "Fraction greater than" msgstr "Trupmeninė dalis didesnė už" #: src/language/stats/aggregate.c:107 msgid "Fraction less than" msgstr "Trupmeninė dalis mažesnė už " #: src/language/stats/aggregate.c:108 msgid "Fraction included in range" msgstr "Trupmeninė dalis įtraukta į sritį" #: src/language/stats/aggregate.c:109 msgid "Fraction excluded from range" msgstr "Trupmeninė dalis neįtraukta į sritį" #: src/language/stats/aggregate.c:110 msgid "Number of cases" msgstr "Atvejų skaičius" #: src/language/stats/aggregate.c:111 msgid "Number of cases (unweighted)" msgstr "Atvejų skaičius (nesveriant)" #: src/language/stats/aggregate.c:112 msgid "Number of missing values" msgstr "Praleistų reikšmių skaičius" #: src/language/stats/aggregate.c:113 msgid "Number of missing values (unweighted)" msgstr "Praleistų reikšmių skaičius (nesveriant)" #: src/language/stats/aggregate.c:114 msgid "First non-missing value" msgstr "Pirmoji nepraleista reikšmė" #: src/language/stats/aggregate.c:115 msgid "Last non-missing value" msgstr "Paskutinė nepraleista reikšmė" #: src/language/stats/aggregate.c:258 msgid "" "When PRESORTED is specified, specifying sorting directions with (A) or (D) " "has no effect. Output data will be sorted the same way as the input data." msgstr "" #: src/language/stats/aggregate.c:448 msgid "expecting aggregation function" msgstr "tikimasi duomenų agregavimo funkcijos" #: src/language/stats/aggregate.c:460 #, c-format msgid "Unknown aggregation function %s." msgstr "Nežinoma agregavimo funkcija %s" #: src/language/stats/aggregate.c:513 #, c-format msgid "Missing argument %zu to %s." msgstr "Argumento %zu reikalauja %s." #: src/language/stats/aggregate.c:522 #, c-format msgid "Arguments to %s must be of same type as source variables." msgstr "%s argumentas turi būti to paties tipo kaip ir šaltinio kintamasis." #: src/language/stats/aggregate.c:541 #, c-format msgid "" "Number of source variables (%zu) does not match number of target variables " "(%zu)." msgstr "" "Šaltinio kintamųjų skaičius (%zu) neatitinka paskirties kintamųjų skaičiaus " "(%zu)." #: src/language/stats/aggregate.c:557 #, c-format msgid "" "The value arguments passed to the %s function are out-of-order. They will " "be treated as if they had been specified in the correct order." msgstr "" #: src/language/stats/aggregate.c:631 #, c-format msgid "" "Variable name %s is not unique within the aggregate file dictionary, which " "contains the aggregate variables and the break variables." msgstr "" #: src/language/stats/autorecode.c:152 #, c-format msgid "Source variable count (%zu) does not match target variable count (%zu)." msgstr "" "Šaltinio kintamųjų kiekis (%zu) neatitinka paskirties kintamojo kiekio (%zu)." #: src/language/stats/autorecode.c:164 #, c-format msgid "Target variable %s duplicates existing variable %s." msgstr "Paskirties kintamasis %s dubliuoja esamą kintamąjį %s." #: src/language/stats/autorecode.c:221 #, c-format msgid "" "With GROUP, variables may not mix string variables (such as %s) and numeric " "variables (such as %s)." msgstr "" #: src/language/stats/autorecode.c:363 msgid "Recoding grouped variables." msgstr "Perkoduojami sugrupuoti kintamieji." #: src/language/stats/autorecode.c:365 #, c-format msgid "Recoding %s into %s (%s)." msgstr "%s perkoduojamas į %s (%s)." #: src/language/stats/autorecode.c:369 #, c-format msgid "Recoding %s into %s." msgstr "%s perkoduojamas į %s." #: src/language/stats/autorecode.c:376 src/ui/gui/recode.ui:209 msgid "New Value" msgstr "Nauja reikšmė" #: src/language/stats/autorecode.c:376 msgid "Value Label" msgstr "Reikšmės etiketė" #: src/language/stats/autorecode.c:379 msgid "Old Value" msgstr "Sena reikšmė" #: src/language/stats/binomial.c:138 #, c-format msgid "Variable %s is not dichotomous" msgstr "Kintamasis %s nėra dvireikšmis" #: src/language/stats/binomial.c:182 src/ui/gui/binomial.ui:30 msgid "Binomial Test" msgstr "Binominis kriterijus" #: src/language/stats/binomial.c:186 src/language/stats/chisquare.c:183 #: src/language/stats/chisquare.c:239 src/language/stats/chisquare.c:322 #: src/language/stats/cochran.c:188 src/language/stats/correlations.c:94 #: src/language/stats/correlations.c:145 src/language/stats/descriptives.c:991 #: src/language/stats/examine.c:602 src/language/stats/examine.c:742 #: src/language/stats/examine.c:836 src/language/stats/examine.c:925 #: src/language/stats/factor.c:1755 src/language/stats/factor.c:1878 #: src/language/stats/factor.c:1908 src/language/stats/factor.c:2068 #: src/language/stats/factor.c:2102 src/language/stats/frequencies.c:302 #: src/language/stats/frequencies.c:1579 src/language/stats/frequencies.c:1586 #: src/language/stats/friedman.c:250 src/language/stats/glm.c:729 #: src/language/stats/kruskal-wallis.c:249 #: src/language/stats/kruskal-wallis.c:297 #: src/language/stats/ks-one-sample.c:278 src/language/stats/logistic.c:1170 #: src/language/stats/logistic.c:1300 src/language/stats/logistic.c:1330 #: src/language/stats/jonckheere-terpstra.c:361 #: src/language/stats/mann-whitney.c:184 src/language/stats/mann-whitney.c:247 #: src/language/stats/means.c:757 src/language/stats/means.c:811 #: src/language/stats/mcnemar.c:222 src/language/stats/median.c:315 #: src/language/stats/median.c:350 src/language/stats/npar-summary.c:106 #: src/language/stats/oneway.c:973 src/language/stats/oneway.c:1051 #: src/language/stats/oneway.c:1150 src/language/stats/oneway.c:1238 #: src/language/stats/oneway.c:1373 src/language/stats/quick-cluster.c:746 #: src/language/stats/reliability.c:543 src/language/stats/reliability.c:584 #: src/language/stats/reliability.c:633 src/language/stats/reliability.c:644 #: src/language/stats/roc.c:969 src/language/stats/roc.c:1067 #: src/language/stats/regression.c:867 src/language/stats/regression.c:899 #: src/language/stats/regression.c:1023 src/language/stats/regression.c:1089 #: src/language/stats/runs.c:318 src/language/stats/sign.c:102 #: src/language/stats/t-test-indep.c:193 src/language/stats/t-test-indep.c:259 #: src/language/stats/t-test-one-sample.c:68 #: src/language/stats/t-test-one-sample.c:125 #: src/language/stats/t-test-paired.c:150 #: src/language/stats/t-test-paired.c:193 #: src/language/stats/t-test-paired.c:238 src/language/stats/wilcoxon.c:243 #: src/language/stats/wilcoxon.c:282 src/language/stats/crosstabs.q:925 #: src/language/stats/crosstabs.q:1253 src/language/stats/crosstabs.q:1293 #: src/language/stats/crosstabs.q:1302 src/language/stats/crosstabs.q:1331 #: src/language/stats/crosstabs.q:1373 src/language/stats/crosstabs.q:1418 #: src/ui/gui/crosstabs.ui:499 src/ui/gui/oneway.ui:615 msgid "Statistics" msgstr "Statistika" #: src/language/stats/binomial.c:187 src/language/stats/chisquare.c:240 #: src/language/stats/chisquare.c:252 msgid "Category" msgstr "Kategorija" #: src/language/stats/binomial.c:188 src/language/stats/cochran.c:189 #: src/language/stats/correlations.c:97 src/language/stats/correlations.c:155 #: src/language/stats/descriptives.c:993 src/language/stats/examine.c:926 #: src/language/stats/frequencies.c:1588 src/language/stats/friedman.c:251 #: src/language/stats/kruskal-wallis.c:250 #: src/language/stats/ks-one-sample.c:279 src/language/stats/logistic.c:1331 #: src/language/stats/jonckheere-terpstra.c:369 #: src/language/stats/mann-whitney.c:185 src/language/stats/means.c:710 #: src/language/stats/means-calc.c:439 src/language/stats/mcnemar.c:223 #: src/language/stats/median.c:351 src/language/stats/npar-summary.c:107 #: src/language/stats/oneway.c:1052 src/language/stats/reliability.c:544 #: src/language/stats/sign.c:69 src/language/stats/sign.c:70 #: src/language/stats/t-test-indep.c:194 #: src/language/stats/t-test-one-sample.c:126 #: src/language/stats/t-test-paired.c:151 #: src/language/stats/t-test-paired.c:194 src/language/stats/wilcoxon.c:244 #: src/language/stats/crosstabs.q:926 msgid "N" msgstr "N" #: src/language/stats/binomial.c:189 msgid "Observed Prop." msgstr "Stebėta prop." #: src/language/stats/binomial.c:190 msgid "Test Prop." msgstr "Kriter. prop." #: src/language/stats/binomial.c:192 src/language/stats/mcnemar.c:224 #: src/language/stats/sign.c:103 src/language/stats/wilcoxon.c:288 #: src/language/stats/crosstabs.q:1306 msgid "Exact Sig. (2-tailed)" msgstr "Tiksli p reikšmė (2-pusė)" #: src/language/stats/binomial.c:193 src/language/stats/mcnemar.c:225 #: src/language/stats/sign.c:104 src/language/stats/wilcoxon.c:289 #: src/language/stats/crosstabs.q:1307 msgid "Exact Sig. (1-tailed)" msgstr "Tiksli p reikšmė (1-pusė)" #: src/language/stats/binomial.c:195 msgid "Groups" msgstr "Grupės" #: src/language/stats/binomial.c:196 msgid "Group 1" msgstr "Pirma grupė" #: src/language/stats/binomial.c:196 msgid "Group 2" msgstr "Antra grupė" #: src/language/stats/binomial.c:196 src/language/stats/chisquare.c:223 #: src/language/stats/chisquare.c:257 src/language/stats/examine.c:930 #: src/language/stats/factor.c:1756 src/language/stats/frequencies.c:344 #: src/language/stats/glm.c:811 src/language/stats/kruskal-wallis.c:285 #: src/language/stats/logistic.c:1336 src/language/stats/mann-whitney.c:197 #: src/language/stats/means.c:706 src/language/stats/oneway.c:982 #: src/language/stats/oneway.c:1072 src/language/stats/reliability.c:549 #: src/language/stats/regression.c:1031 src/language/stats/sign.c:75 #: src/language/stats/wilcoxon.c:250 #: src/ui/gui/psppire-dialog-action-crosstabs.c:93 #: src/language/stats/crosstabs.q:931 src/language/stats/crosstabs.q:1218 msgid "Total" msgstr "Iš viso" #: src/language/stats/chisquare.c:171 #, c-format msgid "" "CHISQUARE test specified %d expected values, but variable %s has %zu " "distinct values." msgstr "" #: src/language/stats/chisquare.c:184 src/language/stats/chisquare.c:241 msgid "Observed N" msgstr "Stebėtų N" #: src/language/stats/chisquare.c:185 src/language/stats/chisquare.c:242 msgid "Expected N" msgstr "Tikėtinų N" #: src/language/stats/chisquare.c:186 src/language/stats/chisquare.c:243 #: src/language/stats/regression.c:1031 #: src/ui/gui/psppire-dialog-action-crosstabs.c:95 #: src/language/stats/crosstabs.q:1267 msgid "Residual" msgstr "Liekana" #: src/language/stats/chisquare.c:235 src/language/stats/cochran.c:150 #: src/language/stats/median.c:305 src/language/stats/sign.c:66 #: src/ui/gui/frequencies.ui:676 msgid "Frequencies" msgstr "Dažniai" #: src/language/stats/chisquare.c:320 src/language/stats/cochran.c:181 #: src/language/stats/friedman.c:246 src/language/stats/kruskal-wallis.c:295 #: src/language/stats/mann-whitney.c:244 src/language/stats/mcnemar.c:219 #: src/language/stats/median.c:347 src/language/stats/sign.c:100 #: src/language/stats/wilcoxon.c:279 msgid "Test Statistics" msgstr "Kriterijaus statistika" #: src/language/stats/chisquare.c:323 msgid "Chi-square" msgstr "Chi kvadratas" #: src/language/stats/chisquare.c:324 src/language/stats/cochran.c:191 #: src/language/stats/examine.c:675 src/language/stats/factor.c:2107 #: src/language/stats/friedman.c:257 src/language/stats/glm.c:733 #: src/language/stats/kruskal-wallis.c:299 src/language/stats/logistic.c:1174 #: src/language/stats/median.c:354 src/language/stats/oneway.c:975 #: src/language/stats/oneway.c:1242 src/language/stats/regression.c:1025 #: src/language/stats/t-test-indep.c:267 #: src/language/stats/t-test-one-sample.c:75 #: src/language/stats/t-test-paired.c:253 src/language/stats/crosstabs.q:1304 msgid "df" msgstr "laisv. l." #: src/language/stats/chisquare.c:325 src/language/stats/cochran.c:192 #: src/language/stats/friedman.c:258 src/language/stats/kruskal-wallis.c:300 #: src/language/stats/median.c:355 msgid "Asymp. Sig." msgstr "Asimt. p reikšmė" #: src/language/stats/cochran.c:111 msgid "More than two values encountered. Cochran Q test will not be run." msgstr "Turimi daugiau nei du kintamieji. Cochran Q nebus skaičiuojamas." #: src/language/stats/cochran.c:153 #, c-format msgid "Success (%.*g)" msgstr "Sėkmė (%.*g)" #: src/language/stats/cochran.c:154 #, c-format msgid "Failure (%.*g)" msgstr "Nesėkmė (%.*g)" #: src/language/stats/cochran.c:190 msgid "Cochran's Q" msgstr "Kokrano Q" #: src/language/stats/correlations.c:91 src/language/stats/descriptives.c:987 #: src/language/stats/factor.c:2065 src/language/stats/npar-summary.c:102 msgid "Descriptive Statistics" msgstr "Aprašomoji statistika" #: src/language/stats/correlations.c:95 src/language/stats/descriptives.c:108 #: src/language/stats/examine.c:742 src/language/stats/factor.c:2069 #: src/language/stats/frequencies.c:141 src/language/stats/graph.c:211 #: src/language/stats/ks-one-sample.c:290 src/language/stats/means-calc.c:438 #: src/language/stats/npar-summary.c:108 src/language/stats/oneway.c:1052 #: src/language/stats/t-test-indep.c:195 #: src/language/stats/t-test-one-sample.c:127 #: src/language/stats/t-test-paired.c:152 #: src/language/stats/t-test-paired.c:241 #: src/ui/gui/psppire-dialog-action-descriptives.c:39 #: src/ui/gui/psppire-dialog-action-frequencies.c:40 msgid "Mean" msgstr "Vidurkis" #: src/language/stats/correlations.c:96 src/language/stats/examine.c:751 #: src/language/stats/factor.c:2070 src/language/stats/ks-one-sample.c:290 #: src/language/stats/means-calc.c:440 src/language/stats/npar-summary.c:109 #: src/language/stats/oneway.c:1052 src/language/stats/t-test-indep.c:196 #: src/language/stats/t-test-one-sample.c:128 #: src/language/stats/t-test-paired.c:153 #: src/language/stats/t-test-paired.c:242 msgid "Std. Deviation" msgstr "St. nuokrypis" #: src/language/stats/correlations.c:126 msgid "Correlations" msgstr "Koreliacijos" #: src/language/stats/correlations.c:146 msgid "Pearson Correlation" msgstr "Pirsono koreliacija" #: src/language/stats/correlations.c:147 src/language/stats/oneway.c:1243 #: src/language/stats/t-test-indep.c:268 #: src/language/stats/t-test-one-sample.c:76 #: src/language/stats/t-test-paired.c:254 msgid "Sig. (2-tailed)" msgstr "p reikšmė (dvipusė)" #: src/language/stats/correlations.c:147 src/language/stats/factor.c:1913 msgid "Sig. (1-tailed)" msgstr "p reikšmė (vienpusė)" #: src/language/stats/correlations.c:151 msgid "Cross-products" msgstr "Vektorinė sandauga" #: src/language/stats/correlations.c:152 msgid "Covariance" msgstr "Kovariacija" #: src/language/stats/correlations.c:165 msgid "Significant at .05 level" msgstr "Reikšminga ties 0,05 lygmeniu" #: src/language/stats/correlations.c:234 msgid "The data for the chosen variables are all missing or empty." msgstr "Pasirinktų kintamųjų duomenys yra tušti arba praleistos reikšmės." #: src/language/stats/correlations.c:390 src/language/stats/descriptives.c:368 #: src/language/data-io/list.c:166 msgid "No variables specified." msgstr "Nenurodytas joks kintamasis." #: src/language/stats/descriptives.c:109 src/language/stats/frequencies.c:142 #: src/language/stats/means-calc.c:445 src/language/stats/t-test-indep.c:197 #: src/language/stats/t-test-one-sample.c:129 #: src/language/stats/t-test-paired.c:154 #: src/language/stats/t-test-paired.c:243 msgid "S.E. Mean" msgstr "Vidurk. st. pakl." #: src/language/stats/descriptives.c:110 src/language/stats/frequencies.c:145 msgid "Std Dev" msgstr "St. nuokrypis" #: src/language/stats/descriptives.c:111 src/language/stats/examine.c:750 #: src/language/stats/frequencies.c:146 src/language/stats/means-calc.c:450 #: src/ui/gui/psppire-dialog-action-descriptives.c:46 #: src/ui/gui/psppire-dialog-action-frequencies.c:45 msgid "Variance" msgstr "Dispersija" #: src/language/stats/descriptives.c:112 src/language/stats/examine.c:752 #: src/language/stats/frequencies.c:147 src/language/stats/means-calc.c:451 #: src/ui/gui/psppire-dialog-action-descriptives.c:47 #: src/ui/gui/psppire-dialog-action-frequencies.c:50 msgid "Kurtosis" msgstr "Ekscesas" #: src/language/stats/descriptives.c:113 src/language/stats/frequencies.c:148 #: src/language/stats/means-calc.c:452 msgid "S.E. Kurt" msgstr "Eksc. st.pakl." #: src/language/stats/descriptives.c:114 src/language/stats/examine.c:752 #: src/language/stats/frequencies.c:149 src/language/stats/means-calc.c:453 #: src/ui/gui/psppire-dialog-action-descriptives.c:48 #: src/ui/gui/psppire-dialog-action-frequencies.c:46 msgid "Skewness" msgstr "Asimetrija" #: src/language/stats/descriptives.c:115 src/language/stats/frequencies.c:150 #: src/language/stats/means-calc.c:454 msgid "S.E. Skew" msgstr "Asim. st.pakl." #: src/language/stats/descriptives.c:116 src/language/stats/examine.c:751 #: src/language/stats/frequencies.c:151 src/language/stats/means-calc.c:449 #: src/ui/gui/psppire-dialog-action-descriptives.c:43 #: src/ui/gui/psppire-dialog-action-frequencies.c:48 msgid "Range" msgstr "Sklaidos plotis" #: src/language/stats/descriptives.c:117 src/language/stats/examine.c:751 #: src/language/stats/frequencies.c:152 src/language/stats/graph.c:214 #: src/language/stats/ks-one-sample.c:285 src/language/stats/means-calc.c:447 #: src/language/stats/npar-summary.c:110 src/language/stats/oneway.c:1061 #: src/ui/gui/psppire-dialog-action-descriptives.c:41 #: src/ui/gui/psppire-dialog-action-frequencies.c:42 msgid "Minimum" msgstr "Mažiausia" #: src/language/stats/descriptives.c:118 src/language/stats/examine.c:751 #: src/language/stats/frequencies.c:153 src/language/stats/graph.c:213 #: src/language/stats/ks-one-sample.c:285 src/language/stats/means-calc.c:448 #: src/language/stats/npar-summary.c:110 src/language/stats/oneway.c:1061 #: src/ui/gui/psppire-dialog-action-descriptives.c:42 #: src/ui/gui/psppire-dialog-action-frequencies.c:43 msgid "Maximum" msgstr "Didžiausia" #: src/language/stats/descriptives.c:119 src/language/stats/frequencies.c:154 #: src/language/stats/graph.c:212 src/language/stats/means-calc.c:446 #: src/ui/gui/psppire-dialog-action-descriptives.c:44 #: src/ui/gui/psppire-dialog-action-frequencies.c:53 msgid "Sum" msgstr "Suma" #: src/language/stats/descriptives.c:350 #, c-format msgid "Z-score variable name %s would be a duplicate variable name." msgstr "" "Z įverčių kintamojo vardas %s turi skirtis nuo jau esamų kintamųjų vardų" #: src/language/stats/descriptives.c:401 msgid "" "DESCRIPTIVES with Z scores ignores TEMPORARY. Temporary transformations " "will be made permanent." msgstr "" "DESCRIPTIVES su Z įverčiais nepaiso TEMPORARY. Laikinos transformacijos bus " "atliekamos kaip ilgalaikės." #: src/language/stats/descriptives.c:478 msgid "expecting statistic name: reverting to default" msgstr "tikėtasi statistinio vardo: grįžtama prie numatytojo" #: src/language/stats/descriptives.c:561 msgid "" "Ran out of generic names for Z-score variables. There are only 126 generic " "names: ZSC001-ZSC0999, STDZ01-STDZ09, ZZZZ01-ZZZZ09, ZQZQ01-ZQZQ09." msgstr "" "Nepakanka įprastų Z įverčių kintamųjų vardų. Šiems kintamiesiems numatyta " "skirti tik 126 vardus: ZSC001-ZSC0999, STDZ01-STDZ09, ZZZZ01-ZZZZ09, ZQZQ01-" "ZQZQ09." #: src/language/stats/descriptives.c:579 msgid "Mapping of Variables to Z-scores" msgstr "Kintamųjų susiejimas su Z įverčiais" #: src/language/stats/descriptives.c:581 msgid "Names" msgstr "Vardai" #: src/language/stats/descriptives.c:582 src/language/stats/glm.c:739 #: src/language/stats/regression.c:1030 msgid "Source" msgstr "Šaltinis" #: src/language/stats/descriptives.c:582 msgid "Target" msgstr "Paskirtis" #: src/language/stats/descriptives.c:659 #, c-format msgid "Internal error processing Z scores. Please report this to %s." msgstr "Apdorojant Z įverčius įvyko vidinė klaida. Praneškite apie tai %s." #: src/language/stats/descriptives.c:759 #, c-format msgid "Z-score of %s" msgstr "%s Z įvertis" #: src/language/stats/descriptives.c:1028 src/language/stats/roc.c:1029 msgid "Valid N (listwise)" msgstr "Galiojančių N (visuose)" #: src/language/stats/descriptives.c:1028 msgid "Missing N (listwise)" msgstr "Praleistų N (visuose)" #: src/language/stats/examine.c:75 msgid " (missing)" msgstr " (praleista)" #: src/language/stats/examine.c:225 #, c-format msgid "Boxplot of %s vs. %s" msgstr "%s ir %s stačiakampės sklaidos diagrama" #: src/language/stats/examine.c:231 src/language/stats/examine.c:338 #, c-format msgid "Boxplot of %s" msgstr "%s stačiakampė sklaidos diagrama" #: src/language/stats/examine.c:321 msgid "Boxplot" msgstr "Stačiakampė sklaidos diagrama" #: src/language/stats/examine.c:418 msgid "Not creating NP plot because data set is empty." msgstr "" #: src/language/stats/examine.c:478 #, c-format msgid "Not creating spreadlevel chart for %s" msgstr "" #: src/language/stats/examine.c:585 msgid "User-missing value." msgstr "Naudotojo nepraleista reikšmė." #: src/language/stats/examine.c:591 src/language/stats/examine.c:595 #: src/language/stats/frequencies.c:1606 msgid "Percentiles" msgstr "Procentiliai" #: src/language/stats/examine.c:603 src/math/percentiles.c:37 msgid "Weighted Average" msgstr "Svertinis vidurkis" #: src/language/stats/examine.c:603 msgid "Tukey's Hinges" msgstr "Tjukio kvartiliai" #: src/language/stats/examine.c:610 src/language/stats/examine.c:685 #: src/language/stats/examine.c:759 src/language/stats/examine.c:858 #: src/language/stats/examine.c:938 src/language/stats/mann-whitney.c:200 #: src/language/stats/median.c:319 src/language/stats/t-test-indep.c:227 #: src/language/stats/t-test-indep.c:282 #: src/language/stats/t-test-one-sample.c:87 msgid "Dependent Variables" msgstr "Priklausomi kintamieji" #: src/language/stats/examine.c:669 msgid "Tests of Normality" msgstr "Normalumo kriterijus" #: src/language/stats/examine.c:673 msgid "Shapiro-Wilk" msgstr "Šapiro ir Vilko" #: src/language/stats/examine.c:674 src/language/stats/examine.c:739 #: src/ui/gui/psppire-checkbox-treeview.c:73 msgid "Statistic" msgstr "Statistika" #: src/language/stats/examine.c:676 src/language/stats/factor.c:2108 #: src/language/stats/glm.c:736 src/language/stats/logistic.c:1175 #: src/language/stats/oneway.c:978 src/language/stats/oneway.c:1154 #: src/language/stats/oneway.c:1376 src/language/stats/regression.c:906 #: src/language/stats/regression.c:1028 src/language/stats/t-test-indep.c:263 #: src/language/stats/t-test-paired.c:196 msgid "Sig." msgstr "p reikšmė" #: src/language/stats/examine.c:735 src/language/stats/oneway.c:1045 #: src/ui/gui/descriptives.ui:25 msgid "Descriptives" msgstr "Aprašomoji" #: src/language/stats/examine.c:738 msgid "Aspect" msgstr "Proporcija" #: src/language/stats/examine.c:739 src/language/stats/oneway.c:1053 #: src/language/stats/oneway.c:1240 src/language/stats/oneway.c:1375 #: src/language/stats/roc.c:975 src/language/stats/regression.c:902 msgid "Std. Error" msgstr "St. paklaida" #: src/language/stats/examine.c:745 src/language/stats/oneway.c:1056 #, c-format msgid "%g%% Confidence Interval for Mean" msgstr "%g%% pasikliovimo intervalas vidurkiams" #: src/language/stats/examine.c:747 src/language/stats/oneway.c:1058 #: src/language/stats/oneway.c:1382 src/language/stats/roc.c:982 #: src/language/stats/regression.c:913 msgid "Lower Bound" msgstr "Apačia" #: src/language/stats/examine.c:748 src/language/stats/oneway.c:1059 #: src/language/stats/oneway.c:1383 src/language/stats/roc.c:983 #: src/language/stats/regression.c:914 msgid "Upper Bound" msgstr "Viršus" #: src/language/stats/examine.c:750 msgid "5% Trimmed Mean" msgstr "5% nupjautasis vidurkis" #: src/language/stats/examine.c:750 src/language/stats/frequencies.c:143 #: src/language/stats/means-calc.c:442 src/language/stats/median.c:352 #: src/ui/gui/psppire-dialog-action-frequencies.c:52 msgid "Median" msgstr "Mediana" #: src/language/stats/examine.c:752 msgid "Interquartile Range" msgstr "Intervalas tarp kvartilių" #: src/language/stats/examine.c:832 msgid "Extreme Values" msgstr "Išskirčių reikšmės" #: src/language/stats/examine.c:840 src/language/stats/quick-cluster.c:664 #: src/language/data-io/list.c:110 msgid "Case Number" msgstr "Atvejo numeris" #: src/language/stats/examine.c:844 msgid "Order" msgstr "Eiliškumas" #. TRANSLATORS: This is a noun, not an adjective. #: src/language/stats/examine.c:850 msgid "Extreme" msgstr "Ekstremumas" #: src/language/stats/examine.c:851 msgid "Highest" msgstr "Didžiausia" #: src/language/stats/examine.c:851 msgid "Lowest" msgstr "Mažiausia" #: src/language/stats/examine.c:921 src/language/stats/logistic.c:1328 #: src/language/stats/means.c:694 src/language/stats/reliability.c:540 msgid "Case Processing Summary" msgstr "Atvejų apdorojimo santrauka" #: src/language/stats/examine.c:927 src/language/stats/frequencies.c:304 #: src/language/stats/frequencies.c:1494 src/language/stats/logistic.c:1332 #: src/language/stats/means.c:713 src/language/stats/reliability.c:545 #: src/language/stats/crosstabs.q:927 msgid "Percent" msgstr "Procentais" #: src/language/stats/examine.c:929 src/language/stats/frequencies.c:321 #: src/language/stats/frequencies.c:1590 src/language/stats/quick-cluster.c:766 #: src/language/stats/reliability.c:548 src/language/stats/crosstabs.q:931 msgid "Valid" msgstr "Galiojančių" #: src/language/stats/examine.c:929 src/language/stats/frequencies.c:336 #: src/language/stats/frequencies.c:1591 src/language/stats/crosstabs.q:931 msgid "Missing" msgstr "Praleistų" #: src/language/stats/examine.c:1550 #, c-format msgid "%s may not be negative. Using default value (%g)." msgstr "%s negali būti neigiamas. Naudosima numatytoji reikšmė (%g)." #: src/language/stats/examine.c:1587 msgid "Percentiles must lie in the range (0, 100)" msgstr "Procentiliai turi būti (0, 100) intervale" #: src/language/stats/examine.c:1777 #, c-format msgid "%s and %s are mutually exclusive" msgstr "%s ir %s yra bendrai išsiskiriantys" #: src/language/stats/factor.c:1121 #, c-format msgid "Matrix input for %s must be either COV or CORR" msgstr "" #: src/language/stats/factor.c:1519 msgid "Factor analysis on a single variable is not useful." msgstr "Faktorinė analizė remiantis vienu kintamuoju nėra naudinga." #: src/language/stats/factor.c:1523 msgid "Factor analysis without variables is not possible." msgstr "Faktorinei analizei reikia kintamųjų." #: src/language/stats/factor.c:1634 msgid "Component Number" msgstr "Komponentės numeris" #: src/language/stats/factor.c:1634 msgid "Factor Number" msgstr "Faktoriaus numeris" #: src/language/stats/factor.c:1648 src/language/stats/factor.c:1651 msgid "Communalities" msgstr "Bendrumai" #: src/language/stats/factor.c:1653 msgid "Initial" msgstr "Pradinė" #: src/language/stats/factor.c:1655 msgid "Extraction" msgstr "Išskirta" #: src/language/stats/factor.c:1697 src/language/stats/factor.c:1777 #: src/language/stats/factor.c:1839 msgid "Component" msgstr "Komponentė" #: src/language/stats/factor.c:1697 src/language/stats/factor.c:1777 #: src/language/stats/factor.c:1839 msgid "Factor" msgstr "Faktorius" #: src/language/stats/factor.c:1752 msgid "Total Variance Explained" msgstr "Visa paaiškinama dispersija" #: src/language/stats/factor.c:1758 #, fuzzy, no-c-format #| msgid "%% of Variance" msgid "% of Variance" msgstr "Dispersijos dalis, %%" #: src/language/stats/factor.c:1760 #, no-c-format msgid "Cumulative %" msgstr "Sukauptoji dalis, %" #: src/language/stats/factor.c:1763 msgid "Phase" msgstr "Fazė" #: src/language/stats/factor.c:1765 msgid "Initial Eigenvalues" msgstr "Pradinės tikrinės reikšmės" #: src/language/stats/factor.c:1769 msgid "Extraction Sums of Squared Loadings" msgstr "Pradinė svorių kvadratų suma" #: src/language/stats/factor.c:1773 msgid "Rotation Sums of Squared Loadings" msgstr "Svorių kvadratų suma po sukimo" #: src/language/stats/factor.c:1835 msgid "Factor Correlation Matrix" msgstr "Faktorių koreliacijų matrica" #: src/language/stats/factor.c:1842 msgid "Factor 2" msgstr "Antrasis faktorius" #: src/language/stats/factor.c:1874 msgid "Anti-Image Matrices" msgstr "" #: src/language/stats/factor.c:1879 msgid "Anti-image Covariance" msgstr "" #: src/language/stats/factor.c:1880 msgid "Anti-image Correlation" msgstr "" #: src/language/stats/factor.c:1901 msgid "Correlation Matrix" msgstr "Koreliacijų matrica" #: src/language/stats/factor.c:1910 src/language/stats/t-test-paired.c:195 msgid "Correlation" msgstr "Koreliacija" #: src/language/stats/factor.c:1947 msgid "Determinant" msgstr "Determinantas" #: src/language/stats/factor.c:1958 msgid "Covariance Matrix" msgstr "Kovariacijų matrica" #: src/language/stats/factor.c:1990 msgid "" "The dataset contains no complete observations. No analysis will be performed." msgstr "Duomenų rinkinyje nėra užbaigtų stebėjimų. Analizė nevykdysima." #: src/language/stats/factor.c:2014 msgid "The dataset has no complete covariance or correlation matrix." msgstr "" #: src/language/stats/factor.c:2071 msgid "Analysis N" msgstr "N analizė" #: src/language/stats/factor.c:2099 msgid "KMO and Bartlett's Test" msgstr "KMO ir Bartleto kriterijus" #: src/language/stats/factor.c:2103 msgid "Kaiser-Meyer-Olkin Measure of Sampling Adequacy" msgstr "Kaizerio, Mejerio ir Olkino atrankos pakankamumo matas" #: src/language/stats/factor.c:2105 msgid "Bartlett's Test of Sphericity" msgstr "Bartleto sferiškumo kriterijus" #: src/language/stats/factor.c:2106 msgid "Approx. Chi-Square" msgstr "Apytiksl. chi kvadratas" #: src/language/stats/factor.c:2154 #, c-format msgid "" "The %s criteria result in zero factors extracted. Therefore no analysis will " "be performed." msgstr "" "%s testas negrąžino nė vieno išskirto faktoriaus. Todėl analizė nebus " "atlikta." #: src/language/stats/factor.c:2161 #, c-format msgid "" "The %s criteria result in more factors than variables, which is not " "meaningful. No analysis will be performed." msgstr "" "%s testas negrąžino daugiau faktorių nei yra kintamųjų, o tai neturi " "prasmės. Analizė nebus atlikta." #: src/language/stats/factor.c:2254 msgid "Component Matrix" msgstr "Komponenčių (faktorių svorių) matrica" #: src/language/stats/factor.c:2254 msgid "Factor Matrix" msgstr "Faktorių matrica" #: src/language/stats/factor.c:2259 msgid "Pattern Matrix" msgstr "Šablonų matrica" #: src/language/stats/factor.c:2268 msgid "Structure Matrix" msgstr "Struktūrų matrica" #: src/language/stats/factor.c:2270 msgid "Rotated Component Matrix" msgstr "Pasukta komponenčių matrica" #: src/language/stats/factor.c:2271 msgid "Rotated Factor Matrix" msgstr "Pasukta faktorių matrica" #: src/language/stats/flip.c:100 #, c-format msgid "%s ignores %s. Temporary transformations will be made permanent." msgstr "" "%s nepaiso %s. Laikinos transformacijos bus atliekamos kaip ilgalaikės." #: src/language/stats/flip.c:153 #, c-format msgid "Could not create temporary file for %s." msgstr "%s komandai nepavyksta sukurti laikinosios rinkmenos." #: src/language/stats/flip.c:341 #, c-format msgid "Error rewinding %s file: %s." msgstr "Klaida atgal atsukant %s rinkmeną: %s." #: src/language/stats/flip.c:348 #, c-format msgid "Error creating %s source file." msgstr "Klaida kuriant %s šaltinio rinkmeną." #: src/language/stats/flip.c:361 #, c-format msgid "Error reading %s file: %s." msgstr "klaida skaitant %s rinkmeną: %s." #: src/language/stats/flip.c:363 #, c-format msgid "Unexpected end of file reading %s file." msgstr "Netikėta skaitomos %s rinkmenos pabaiga." #: src/language/stats/flip.c:379 #, c-format msgid "Error seeking %s source file: %s." msgstr "Klaida ieškant %s šaltinio rinkmenos: %s." #: src/language/stats/flip.c:387 #, c-format msgid "Error writing %s source file: %s." msgstr "Klaida rašant %s šaltinio rinkmenos: %s." #: src/language/stats/flip.c:402 #, c-format msgid "Error rewinding %s source file: %s." msgstr "Klaida atsukant atgal %s šaltinio rinkmeną: %s." #: src/language/stats/flip.c:433 #, c-format msgid "Error reading %s temporary file: %s." msgstr "Klaida skaitant %s laikinąją rinkmeną: %s." #: src/language/stats/flip.c:436 #, c-format msgid "Unexpected end of file reading %s temporary file." msgstr "netikėta skaitomos %s laikinosios rinkmenos pabaiga." #: src/language/stats/frequencies.c:144 #: src/ui/gui/psppire-dialog-action-frequencies.c:49 msgid "Mode" msgstr "Moda" #: src/language/stats/frequencies.c:303 src/language/stats/logistic.c:1381 #: src/output/charts/plot-hist-cairo.c:112 msgid "Frequency" msgstr "Dažnis" #: src/language/stats/frequencies.c:305 msgid "Valid Percent" msgstr "Galiojanti procentinė dalis" #: src/language/stats/frequencies.c:306 src/language/stats/graph.c:208 msgid "Cumulative Percent" msgstr "Sukauptoji procentinė dalis" #: src/language/stats/frequencies.c:905 msgid "Histogram frequency must be greater than zero." msgstr "Histogramos dažnis turi būti teigiamas skaičius." #: src/language/stats/frequencies.c:923 msgid "Histogram percentage must be greater than zero." msgstr "Historgamos procentinė dalis turi būti teigiama." #: src/language/stats/frequencies.c:1139 #, c-format msgid "" "%s for histogram must be greater than or equal to %s, but %s was specified " "as %.15g and %s as %.15g. %s and %s will be ignored." msgstr "" #: src/language/stats/frequencies.c:1184 #, c-format msgid "" "%s for pie chart must be greater than or equal to %s, but %s was specified " "as %.15g and %s as %.15g. %s and %s will be ignored." msgstr "" #: src/language/stats/frequencies.c:1474 #, c-format msgid "Omitting pie chart for %s, which has only %d unique values." msgstr "" "Skritulinė diagrama „%s“ praleidžiama, nes ji turi tik %d reikšmę(-ių)." #: src/language/stats/frequencies.c:1477 #, c-format msgid "Omitting pie chart for %s, which has over 50 unique values." msgstr "" "Skritulinė diagrama „%s“ praleidžiama, nes ji turi daugiau kaip 50 unikalių " "reikšmių." #: src/language/stats/frequencies.c:1494 src/language/stats/graph.c:205 #: src/language/stats/quick-cluster.c:747 #: src/ui/gui/psppire-dialog-action-crosstabs.c:90 #: src/language/stats/crosstabs.q:789 src/language/stats/crosstabs.q:1262 msgid "Count" msgstr "Kiekis" #: src/language/stats/friedman.c:220 src/language/stats/kruskal-wallis.c:247 #: src/language/stats/mann-whitney.c:182 src/language/stats/wilcoxon.c:240 msgid "Ranks" msgstr "Rangai" #: src/language/stats/friedman.c:222 src/language/stats/friedman.c:223 #: src/language/stats/kruskal-wallis.c:251 #: src/language/stats/mann-whitney.c:186 src/language/stats/wilcoxon.c:245 msgid "Mean Rank" msgstr "Vidutinis rangas" #: src/language/stats/friedman.c:253 msgid "Kendall's W" msgstr "Kendalo W" #: src/language/stats/friedman.c:256 src/language/stats/kruskal-wallis.c:298 #: src/language/stats/median.c:353 msgid "Chi-Square" msgstr "Chi kvadratas" #: src/language/stats/glm.c:169 msgid "Multivariate analysis is not yet implemented" msgstr "Daugiamatė analizė dar nėra realizuota." #: src/language/stats/glm.c:274 msgid "Only types 1, 2 & 3 sums of squares are currently implemented" msgstr "Šiuo metu realizuota tik 1, 2 ir 3 tipo kvadratų suma" #: src/language/stats/glm.c:727 msgid "Tests of Between-Subjects Effects" msgstr "Tarpindividinio poveikio kriterijus" #: src/language/stats/glm.c:730 msgid "Type I Sum Of Squares" msgstr "I tipo kvadratų suma" #: src/language/stats/glm.c:731 msgid "Type II Sum Of Squares" msgstr "II tipo kvadratų suma" #: src/language/stats/glm.c:732 msgid "Type III Sum Of Squares" msgstr "III tipo kvadratų suma" #: src/language/stats/glm.c:734 src/language/stats/oneway.c:976 #: src/language/stats/regression.c:1026 msgid "Mean Square" msgstr "Vidutinis kvadratas" #: src/language/stats/glm.c:735 src/language/stats/oneway.c:977 #: src/language/stats/regression.c:1027 src/language/stats/t-test-indep.c:262 msgid "F" msgstr "F" #: src/language/stats/glm.c:740 msgid "Corrected Model" msgstr "Koreguotas modelis" #: src/language/stats/glm.c:740 msgid "Model" msgstr "Modelis" #: src/language/stats/glm.c:752 msgid "Intercept" msgstr "Bendrasis vidurkis" #: src/language/stats/glm.c:802 src/output/pivot-table.c:763 #: src/output/spv/spv.c:867 msgid "Error" msgstr "Klaida" #: src/language/stats/glm.c:819 msgid "Corrected Total" msgstr "Viso, koreguota" #: src/language/stats/graph.c:206 msgid "Percentage" msgstr "Procentinė dalis" #: src/language/stats/graph.c:207 msgid "Cumulative Count" msgstr "Sukauptas kiekis" #: src/language/stats/graph.c:296 #, c-format msgid "%s vs. %s by %s" msgstr "%s ir %s pagal %s" #: src/language/stats/graph.c:303 #, c-format msgid "%s vs. %s" msgstr "%s ir %s" #: src/language/stats/graph.c:322 msgid "" "Maximum number of scatterplot categories reached. Your BY variable has too " "many distinct values. The coloring of the plot will not be correct." msgstr "" "Sklaidos diagramoje pasiektas didžiausias galimas kategorijų skaičius. Po BY " "nurodytas kintamasis turi per daug skirtingų reikšmių. Diagramos spalvos " "nebus teisingos." #: src/language/stats/graph.c:551 src/language/stats/rank.c:636 #, c-format msgid "%s of %s" msgstr "%s iš %s" #: src/language/stats/graph.c:698 src/language/stats/graph.c:729 #: src/language/stats/graph.c:777 msgid "Only one chart type is allowed." msgstr "Leidžiamas tik vienas grafiko tipas." #: src/language/stats/graph.c:721 src/language/stats/graph.c:820 #: src/language/stats/graph.c:834 msgid "Only one variable is allowed." msgstr "Leidžiamas tik vienas kintamasis." #: src/language/stats/graph.c:843 msgid "Variable expected" msgstr "Tikėtasi kintamojo" #: src/language/stats/graph.c:883 msgid "FOOTNOTE is not implemented yet for GRAPH" msgstr "FOOTNOTE dar nėra realizuota GRAPH komandai" #: src/language/stats/ks-one-sample.c:274 src/ui/gui/ks-one-sample.ui:24 msgid "One-Sample Kolmogorov-Smirnov Test" msgstr "Kolmogorovo ir Smirnovo kriterijus vienai imčiai" #: src/language/stats/ks-one-sample.c:284 msgid "Uniform Parameters" msgstr "Tolydžiojo skirstinio parametrai" #: src/language/stats/ks-one-sample.c:289 msgid "Normal Parameters" msgstr "Normaliojo skirstinio parametrai" #: src/language/stats/ks-one-sample.c:294 msgid "Poisson Parameters" msgstr "Puasono skirstinio parametrai" #: src/language/stats/ks-one-sample.c:295 #: src/ui/gui/psppire-dialog-action-crosstabs.c:76 #: src/language/stats/crosstabs.q:1421 msgid "Lambda" msgstr "Liambda" #: src/language/stats/ks-one-sample.c:300 msgid "Exponential Parameters" msgstr "Eksponentinio skirstinio parametrai" #: src/language/stats/ks-one-sample.c:308 msgid "Most Extreme Differences" msgstr "Didžiausi skirtumai" #: src/language/stats/ks-one-sample.c:309 msgid "Absolute" msgstr "Absoliutus" #: src/language/stats/ks-one-sample.c:309 src/language/stats/roc.c:1037 msgid "Positive" msgstr "Teigiamų" #: src/language/stats/ks-one-sample.c:309 src/language/stats/roc.c:1037 msgid "Negative" msgstr "Neigiamų" #: src/language/stats/ks-one-sample.c:312 msgid "Kolmogorov-Smirnov Z" msgstr "Kolmogorovo ir Smirnovo Z" #: src/language/stats/ks-one-sample.c:313 #: src/language/stats/jonckheere-terpstra.c:374 #: src/language/stats/mann-whitney.c:251 src/language/stats/runs.c:328 #: src/language/stats/wilcoxon.c:284 msgid "Asymp. Sig. (2-tailed)" msgstr "Asimp. p reikšmė (2-pusė)" #: src/language/stats/logistic.c:327 msgid "All predicted values are either 1 or 0" msgstr "Visos prognozuojamos reikšmės lygios 1 ar 0" #: src/language/stats/logistic.c:525 msgid "Dependent variable's values are not dichotomous." msgstr "Priklausomo kintamojo reikšmės nėra dvireikšmės" #: src/language/stats/logistic.c:614 #, c-format msgid "" "Category %s does not have at least two distinct values. Logistic regression " "will not be run." msgstr "" "%s kategorijai reikia bent dviejų skirtingų reikšmių. Logistinė regresija " "nebus atliekama." #: src/language/stats/logistic.c:674 #, c-format msgid "" "Estimation terminated at iteration number %d because parameter estimates " "changed by less than %g" msgstr "" "Skaičiavimai baigti ties %d-a iteracija, nes parametrų įverčiai pasikeitė " "mažiau kaip per %g" #: src/language/stats/logistic.c:686 #, c-format msgid "" "Estimation terminated at iteration number %d because Log Likelihood " "decreased by less than %g%%" msgstr "" "Skaičiavimai baigti ties %d-a iteracija, nes tikėtinumo log sumažėjo mažiau " "kaip per %g%%" #: src/language/stats/logistic.c:701 #, c-format msgid "" "Estimation terminated at iteration number %d because maximum iterations has " "been reached" msgstr "" "Skaičiavimai baigti ties %d-a iteracija, nes pasiektas didžiausias iteracijų " "skaičius" #: src/language/stats/logistic.c:994 msgid "Cut point value must be in the range [0,1]" msgstr "Reikšmė, ties kuria perskiriama, turi priklausyti [0,1] intervalui" #: src/language/stats/logistic.c:1139 msgid "Dependent Variable Encoding" msgstr "Priklausomo kintamojo kodavimas" #: src/language/stats/logistic.c:1141 msgid "Mapping" msgstr "Susiejimas" #: src/language/stats/logistic.c:1142 msgid "Internal Value" msgstr "Vidinė reikšmė" #: src/language/stats/logistic.c:1145 msgid "Original Value" msgstr "Pradinė reikšmė" #: src/language/stats/logistic.c:1167 msgid "Variables in the Equation" msgstr "Lygties kintamieji" #: src/language/stats/logistic.c:1171 src/language/stats/regression.c:902 msgid "B" msgstr "B" #: src/language/stats/logistic.c:1172 msgid "S.E." msgstr "SP" #: src/language/stats/logistic.c:1173 msgid "Wald" msgstr "Voldo" #: src/language/stats/logistic.c:1176 msgid "Exp(B)" msgstr "Exp(B)" #: src/language/stats/logistic.c:1181 #, c-format msgid "%d%% CI for Exp(B)" msgstr "Exp(B) %d%% PI" #: src/language/stats/logistic.c:1183 src/language/stats/t-test-indep.c:274 #: src/language/stats/t-test-one-sample.c:83 #: src/language/stats/t-test-paired.c:249 src/language/stats/crosstabs.q:1369 msgid "Lower" msgstr "apačia" #: src/language/stats/logistic.c:1183 src/language/stats/t-test-indep.c:275 #: src/language/stats/t-test-one-sample.c:84 #: src/language/stats/t-test-paired.c:250 src/language/stats/crosstabs.q:1370 msgid "Upper" msgstr "viršus" #: src/language/stats/logistic.c:1189 src/language/stats/logistic.c:1470 msgid "Step 1" msgstr "1-as žingsnis" #: src/language/stats/logistic.c:1263 msgid "Constant" msgstr "Konstanta" #: src/language/stats/logistic.c:1298 msgid "Model Summary" msgstr "Modelio santrauka" #: src/language/stats/logistic.c:1301 msgid "-2 Log likelihood" msgstr "-2 log tikėtinumas" #: src/language/stats/logistic.c:1302 msgid "Cox & Snell R Square" msgstr "Kokso ir Snelo R kvadratas" #: src/language/stats/logistic.c:1303 msgid "Nagelkerke R Square" msgstr "Nagelkerkės R kvadratas" #: src/language/stats/logistic.c:1306 src/language/stats/logistic.c:1470 msgid "Step" msgstr "Žingsnis" #: src/language/stats/logistic.c:1335 msgid "Unweighted Cases" msgstr "Nesveriami atvejai" #: src/language/stats/logistic.c:1336 msgid "Included in Analysis" msgstr "Į analizę įtraukta" #: src/language/stats/logistic.c:1336 msgid "Missing Cases" msgstr "Praleisti atvejai" #: src/language/stats/logistic.c:1365 msgid "Categorical Variables' Codings" msgstr "Kategorinių kintamųjų kodavimas" #: src/language/stats/logistic.c:1380 msgid "Codings" msgstr "Kodavimas" #: src/language/stats/logistic.c:1383 msgid "Parameter coding" msgstr "Parametrų kodavimas" #: src/language/stats/logistic.c:1462 msgid "Classification Table" msgstr "Klasifikacinė lentelė" #: src/language/stats/logistic.c:1466 msgid "Predicted" msgstr "Prognozuota" #: src/language/stats/logistic.c:1466 msgid "Percentage Correct" msgstr "Teisingai suklasifikuota" #: src/language/stats/logistic.c:1468 msgid "Observed" msgstr "Stebėtų" #: src/language/stats/logistic.c:1468 msgid "Overall Percentage" msgstr "Bendrai" #: src/language/stats/jonckheere-terpstra.c:357 msgid "Jonckheere-Terpstra Test" msgstr "Džonkerės ir Terpstra kriterijus" #: src/language/stats/jonckheere-terpstra.c:364 #, c-format msgid "Number of levels in %s" msgstr "%s lygių skaičius" #: src/language/stats/jonckheere-terpstra.c:370 msgid "Observed J-T Statistic" msgstr "Stebėta Dž-T statistika" #: src/language/stats/jonckheere-terpstra.c:371 msgid "Mean J-T Statistic" msgstr "Vidutinė Dž-T statistika" #: src/language/stats/jonckheere-terpstra.c:372 msgid "Std. Deviation of J-T Statistic" msgstr "Dž-T statistikos st. nuokrypis" #: src/language/stats/jonckheere-terpstra.c:373 msgid "Std. J-T Statistic" msgstr "St. Dž-T statistika" #: src/language/stats/mann-whitney.c:187 src/language/stats/wilcoxon.c:246 msgid "Sum of Ranks" msgstr "Rangų suma" #: src/language/stats/mann-whitney.c:248 msgid "Mann-Whitney U" msgstr "Mano ir Vitnio U" #: src/language/stats/mann-whitney.c:249 msgid "Wilcoxon W" msgstr "Vilkoksono W" #: src/language/stats/mann-whitney.c:250 src/language/stats/runs.c:327 #: src/language/stats/wilcoxon.c:283 msgid "Z" msgstr "Z" #: src/language/stats/means.c:702 msgid "Included" msgstr "Įtrauktų" #: src/language/stats/means.c:704 src/language/stats/reliability.c:548 msgid "Excluded" msgstr "Atmestų" #: src/language/stats/means.c:753 msgid "Report" msgstr "Ataskaita" #: src/language/stats/means.c:838 #, c-format msgid "" "The table \"%s\" has no non-empty control variables. No result for this " "table will be displayed." msgstr "" #: src/language/stats/means-calc.c:443 msgid "Group Median" msgstr "Grupės mediana" #: src/language/stats/means-calc.c:455 msgid "First" msgstr "Pirmas" #: src/language/stats/means-calc.c:456 msgid "Last" msgstr "Paskutinis" #: src/language/stats/means-calc.c:458 msgid "Percent N" msgstr "% N" #: src/language/stats/means-calc.c:459 msgid "Percent Sum" msgstr "Procentinė suma" #: src/language/stats/means-calc.c:461 msgid "Harmonic Mean" msgstr "Harmoninis vidurkis" #: src/language/stats/means-calc.c:462 msgid "Geom. Mean" msgstr "Geom. vidurkis" #: src/language/stats/mcnemar.c:144 msgid "The McNemar test is appropriate only for dichotomous variables" msgstr "Maknemaros kriterijus skirtas tik dichotominiams kintamiesiems" #: src/language/stats/mcnemar.c:226 src/language/stats/sign.c:105 msgid "Point Probability" msgstr "Taško tikimybė" #: src/language/stats/mcnemar.c:229 src/language/stats/sign.c:78 #: src/language/stats/sign.c:108 src/language/stats/t-test-paired.c:199 #: src/language/stats/t-test-paired.c:257 src/language/stats/wilcoxon.c:253 #: src/language/stats/wilcoxon.c:292 msgid "Pairs" msgstr "Poros" #: src/language/stats/median.c:316 msgid "> Median" msgstr "> Mediana" #: src/language/stats/median.c:316 msgid "≤ Median" msgstr "≤ Mediana" #: src/language/stats/npar.c:536 #, c-format msgid "%s subcommand not currently implemented." msgstr "%s pokomandis dar nerealizuotas." #: src/language/stats/npar.c:691 #, c-format msgid "Expecting %s, %s, %s or a number." msgstr "Tikėtasi %s, %s, %s arba skaičiaus." #: src/language/stats/npar.c:845 #, c-format msgid "" "The specified value of HI (%d) is lower than the specified value of LO (%d)" msgstr "" "Nurodyta didžiausia (HI) reikšmė (%d) yra mažesnė nei nurodyta mažiausia " "(LO) reikšmė (%d)" #: src/language/stats/npar.c:897 #, c-format msgid "" "%d expected values were given, but the specified range (%d-%d) requires " "exactly %d values." msgstr "" #: src/language/stats/npar.c:1118 src/language/stats/t-test-parser.c:173 #, c-format msgid "" "PAIRED was specified but the number of variables preceding WITH (%zu) did " "not match the number following (%zu)." msgstr "" #: src/language/stats/oneway.c:361 msgid "LSD" msgstr "LSD" #: src/language/stats/oneway.c:362 src/ui/gui/oneway.ui:338 msgid "Tukey HSD" msgstr "Tjukio kriterijus" #: src/language/stats/oneway.c:363 src/ui/gui/oneway.ui:253 msgid "Bonferroni" msgstr "Bonferonio" #: src/language/stats/oneway.c:364 src/ui/gui/oneway.ui:304 msgid "Scheffé" msgstr "Šefė" #: src/language/stats/oneway.c:365 msgid "Games-Howell" msgstr "Games-Howell" #: src/language/stats/oneway.c:366 src/ui/gui/oneway.ui:321 msgid "Šidák" msgstr "Šidák" #: src/language/stats/oneway.c:519 #, c-format msgid "The post hoc analysis method %s is not supported." msgstr "Aposteriorinis (post hoc) analizės medotas %s nepalaikomas." #: src/language/stats/oneway.c:842 #, c-format msgid "" "Dependent variable %s has no non-missing values. No analysis for this " "variable will be done." msgstr "" "Priklausomame kintamajame %s nėra nepraleistų reikšmių. Tolesnė analizė " "negalima." #: src/language/stats/oneway.c:924 #, c-format msgid "" "In contrast list %zu, the number of coefficients (%zu) does not equal the " "number of groups (%d). This contrast list will be ignored." msgstr "" "Kontrastų sąraše %zu koeficientų skaičius (%zu) nelygus grupių skaičiui " "(%d). Todėl šio kontrastų sąrašo nepaisoma." #: src/language/stats/oneway.c:936 #, c-format msgid "Coefficients for contrast %zu do not total zero" msgstr "Kontrastų sąrašo Nr. %zu suma koeficientų suma nelygi nuliui" #: src/language/stats/oneway.c:971 msgid "ANOVA" msgstr "ANOVA" #: src/language/stats/oneway.c:974 src/language/stats/regression.c:1024 msgid "Sum of Squares" msgstr "Kvadratų suma" #: src/language/stats/oneway.c:981 msgid "Between Groups" msgstr "Tarp grupių" #: src/language/stats/oneway.c:981 msgid "Within Groups" msgstr "Vidinė" #: src/language/stats/oneway.c:1075 src/language/stats/oneway.c:1257 msgid "Dependent Variable" msgstr "Priklausomas kintamasis" #: src/language/stats/oneway.c:1148 msgid "Test of Homogeneity of Variances" msgstr "Dispersijų homogeniškumo kriterijus" #: src/language/stats/oneway.c:1151 msgid "Levene Statistic" msgstr "Livyno kriterijus" #: src/language/stats/oneway.c:1152 msgid "df1" msgstr "laisv.l.1" #: src/language/stats/oneway.c:1153 msgid "df2" msgstr "laisv.l.2" #: src/language/stats/oneway.c:1192 msgid "Contrast Coefficients" msgstr "Kontrastų koeficientai" #: src/language/stats/oneway.c:1199 src/language/stats/oneway.c:1246 msgid "Contrast" msgstr "Kontrastas" #: src/language/stats/oneway.c:1236 msgid "Contrast Tests" msgstr "Kontrastų kriterijus" #: src/language/stats/oneway.c:1239 msgid "Value of Contrast" msgstr "Kontrasto reikšmė" #: src/language/stats/oneway.c:1241 src/language/stats/regression.c:905 #: src/language/stats/t-test-indep.c:266 #: src/language/stats/t-test-one-sample.c:74 #: src/language/stats/t-test-paired.c:252 msgid "t" msgstr "t" #: src/language/stats/oneway.c:1252 msgid "Assumption" msgstr "Prielaida" #: src/language/stats/oneway.c:1253 msgid "Assume equal variances" msgstr "Jei dispersijos lygios" #: src/language/stats/oneway.c:1254 msgid "Does not assume equal variances" msgstr "Jei dispersijos skiriasi" #: src/language/stats/oneway.c:1367 #, c-format msgid "Multiple Comparisons (%s)" msgstr "Kartotiniai palyginimai (%s)" #: src/language/stats/oneway.c:1374 msgid "Mean Difference (I - J)" msgstr "Vidurkių skirtumas (I - J)" #: src/language/stats/oneway.c:1379 #, c-format msgid "%g%% Confidence Interval" msgstr "%g%% pasikliovimo intervalas" #: src/language/stats/oneway.c:1386 src/language/stats/oneway.c:1390 msgid "(J) Family" msgstr "(J) Šeima" #: src/language/stats/oneway.c:1406 msgid "Test" msgstr "Kriterijus" #: src/language/stats/quick-cluster.c:576 msgid "Initial Cluster Centers" msgstr "Pradiniai klasterių centrai" #: src/language/stats/quick-cluster.c:577 msgid "Final Cluster Centers" msgstr "Galutiniai klasterių centrai" #: src/language/stats/quick-cluster.c:580 #: src/language/stats/quick-cluster.c:660 #: src/language/stats/quick-cluster.c:661 #: src/language/stats/quick-cluster.c:753 msgid "Cluster" msgstr "Klasteris" #: src/language/stats/quick-cluster.c:658 msgid "Cluster Membership" msgstr "Priklausymas klasteriams" #: src/language/stats/quick-cluster.c:744 msgid "Number of Cases in each Cluster" msgstr "Atvejų skaičius kiekviename klasteryje" #: src/language/stats/quick-cluster.c:750 msgid "Clusters" msgstr "Klasteriai" #: src/language/stats/quick-cluster.c:867 #: src/language/stats/quick-cluster.c:893 #, c-format msgid "A variable called `%s' already exists." msgstr "Kintamasis vardu „%s“ jau yra." #: src/language/stats/quick-cluster.c:908 #, c-format msgid "Expecting %s or %s." msgstr "Tikimasi %s arba %s." #: src/language/stats/quick-cluster.c:928 msgid "The number of clusters must be positive" msgstr "Klasterių skaičius turi būti teigiamas" #: src/language/stats/quick-cluster.c:944 msgid "The convergence criterion must be positive" msgstr "Konvergencijos kriterijus turi būti teigiamas" #: src/language/stats/quick-cluster.c:960 msgid "The number of iterations must be positive" msgstr "Iteracijų skaičius turi būti teigiamas" #: src/language/stats/rank.c:205 #, c-format msgid "" "Cannot generate variable name for ranking %s with %s. All candidates in use." msgstr "" "Nepavyksta sukurti naujo rangų kintamojo %s su %s. Visi kandidatai panaudoti." #: src/language/stats/rank.c:321 #, c-format msgid "Too many variables in %s clause." msgstr "%s sąlygoje per daug kintamųjų." #: src/language/stats/rank.c:323 #, c-format msgid "Variable %s already exists." msgstr "Toks kintamasis %s jau yra." #: src/language/stats/rank.c:325 src/language/expressions/evaluate.c:164 #, c-format msgid "Duplicate variable name %s." msgstr "Kintamojo vardas %s kartojasi." #: src/language/stats/rank.c:631 #, c-format msgid "%s of %s by %s" msgstr "%s iš %s pagal %s" #: src/language/stats/rank.c:825 msgid "Variables Created by RANK" msgstr "RANK komandos sukurti kintamieji" #: src/language/stats/rank.c:828 src/language/stats/rank.c:829 msgid "New Variable" msgstr "Naujas kintamasis" #: src/language/stats/rank.c:829 msgid "Function" msgstr "Funkcija" #: src/language/stats/rank.c:830 msgid "Fraction" msgstr "Dalis" #: src/language/stats/rank.c:830 msgid "Grouping Variables" msgstr "Grupavimo kintamieji" #: src/language/stats/rank.c:833 src/language/stats/rank.c:834 msgid "Existing Variable" msgstr "Esami kintamieji" #: src/language/stats/reliability.c:164 msgid "Reliability on a single variable is not useful." msgstr "" "Klausimynų patikimumo skaičiavimas remiantis vienu kintamuoju nėra naudingas." #: src/language/stats/reliability.c:281 msgid "" "The STATISTICS subcommand is not yet implemented. No statistics will be " "produced." msgstr "Pokomandis STATISTICS dar neįgyvendintas. Statistika nepateiksima." #: src/language/stats/reliability.c:300 msgid "The split point must be less than the number of variables" msgstr "" "Skaidant kintamųjų skaičius pirmoje dalyje negali būti didesnis nei visų " "kintamųjų skaičius" #: src/language/stats/reliability.c:525 #, c-format msgid "Scale: %s" msgstr "Skalė: %s" #: src/language/stats/reliability.c:582 msgid "Item-Total Statistics" msgstr "„Elementas-visuma“ statistika" #: src/language/stats/reliability.c:585 msgid "Scale Mean if Item Deleted" msgstr "Klausimyno vidurkis, jei elementas pašalintas" #: src/language/stats/reliability.c:586 msgid "Scale Variance if Item Deleted" msgstr "Klausimyno dispersija, jei elementas pašalintas" #: src/language/stats/reliability.c:587 msgid "Corrected Item-Total Correlation" msgstr "Koreguota „elementas-visuma“ koreliacija" #: src/language/stats/reliability.c:588 msgid "Cronbach's Alpha if Item Deleted" msgstr "Kronbacho alfa, jei elementas pašalintas" #: src/language/stats/reliability.c:627 msgid "Reliability Statistics" msgstr "Klausimynų patikimumo statistika" #: src/language/stats/reliability.c:634 src/language/stats/reliability.c:646 msgid "Cronbach's Alpha" msgstr "Kronbacho alfa" #: src/language/stats/reliability.c:635 src/language/stats/reliability.c:649 #: src/language/stats/reliability.c:652 msgid "N of Items" msgstr "N elementų" #: src/language/stats/reliability.c:647 msgid "Part 1" msgstr "1 dalis" #: src/language/stats/reliability.c:650 msgid "Part 2" msgstr "2 dalis" #: src/language/stats/reliability.c:654 msgid "Total N of Items" msgstr "Iš viso N elementų" #: src/language/stats/reliability.c:656 msgid "Correlation Between Forms" msgstr "Koreliacija tarp formų" #: src/language/stats/reliability.c:659 msgid "Spearman-Brown Coefficient" msgstr "Spirmeno ir Brauno koeficientas" #: src/language/stats/reliability.c:660 msgid "Equal Length" msgstr "Vienodas ilgis" #: src/language/stats/reliability.c:661 msgid "Unequal Length" msgstr "Nevienodas ilgis" #: src/language/stats/reliability.c:663 msgid "Guttman Split-Half Coefficient" msgstr "Gutmano dalinimo pusiau koeficientas" #: src/language/stats/roc.c:966 msgid "Area Under the Curve" msgstr "Plotas po kreive" #: src/language/stats/roc.c:970 msgid "Area" msgstr "Plotas" #: src/language/stats/roc.c:976 msgid "Asymptotic Sig." msgstr "Asimptotinė p reikšmė" #: src/language/stats/roc.c:979 #, c-format msgid "Asymp. %g%% Confidence Interval" msgstr "Asimp. %g%% pasikliovimo intervalas" #: src/language/stats/roc.c:987 msgid "Variable under test" msgstr "Kriterijaus kintamasis" #: src/language/stats/roc.c:1026 msgid "Case Summary" msgstr "Atvejų suvestinė" #: src/language/stats/roc.c:1030 msgid "Unweighted" msgstr "Nesverta" #: src/language/stats/roc.c:1031 msgid "Weighted" msgstr "Sverta" #: src/language/stats/roc.c:1064 msgid "Coordinates of the Curve" msgstr "Kreivės koordinatės" #: src/language/stats/roc.c:1068 msgid "Positive if greater than or equal to" msgstr "Teigiamas, jei didesnis arba lygus" #: src/language/stats/roc.c:1069 src/output/charts/roc-chart-cairo.c:38 msgid "Sensitivity" msgstr "Jautrumas" #: src/language/stats/roc.c:1069 src/output/charts/roc-chart-cairo.c:37 msgid "1 - Specificity" msgstr "1 - specifiškumas" #: src/language/stats/roc.c:1072 msgid "Coordinates" msgstr "Koordinatės" #: src/language/stats/roc.c:1076 msgid "Test variable" msgstr "Kriterijaus kintamasis" #: src/language/stats/regression.c:224 src/language/stats/regression.c:229 #, c-format msgid "VARIABLES may not appear after %s" msgstr "VARIABLES gali nebūti po %s." #: src/language/stats/regression.c:412 msgid "" "REGRESSION with SAVE ignores TEMPORARY. Temporary transformations will be " "made permanent." msgstr "" "REGRESSION su SAVE nepaiso TEMPORARY. Laikinos transformacijos bus " "atliekamos kaip ilgalaikės." #: src/language/stats/regression.c:416 msgid "REGRESSION with SAVE ignores FILTER. All cases will be processed." msgstr "REGRESSION su SAVE nepaiso FILTER. Apdorosimi visi atvejai." #: src/language/stats/regression.c:569 msgid "" "The dependent variable is equal to the independent variable. The least " "squares line is therefore Y=X. Standard errors and related statistics may be " "meaningless." msgstr "" "Priklausomas kintamasis lygus nepriklausomam kintamajam. Todėl mažiausiųjų " "kvadratų linija yra Y=X. Standartinė paklaida ir kita statistika gali būti " "beprasmiška." #: src/language/stats/regression.c:776 msgid "No valid data found. This command was skipped." msgstr "Nerasta tinkamų duomenų. Ši komanda buvo praleista." #: src/language/stats/regression.c:863 #, c-format msgid "Model Summary (%s)" msgstr "Modelio santrauka (%s)" #: src/language/stats/regression.c:868 #: src/ui/gui/psppire-dialog-action-regression.c:42 msgid "R" msgstr "R" #: src/language/stats/regression.c:868 msgid "R Square" msgstr "R kvadratas" #: src/language/stats/regression.c:868 msgid "Adjusted R Square" msgstr "Koreguotas R kvadratas" #: src/language/stats/regression.c:869 msgid "Std. Error of the Estimate" msgstr "Įverčio st. paklaida" #: src/language/stats/regression.c:895 #, c-format msgid "Coefficients (%s)" msgstr "Koeficientai (%s)" #: src/language/stats/regression.c:901 msgid "Unstandardized Coefficients" msgstr "Nestandartizuoti koeficientai" #: src/language/stats/regression.c:904 msgid "Standardized Coefficients" msgstr "Standartizuoti koeficientai" #: src/language/stats/regression.c:904 msgid "Beta" msgstr "Beta" #: src/language/stats/regression.c:911 #, c-format msgid "%g%% Confidence Interval for B" msgstr "B %g%% pasikliovimo intervalas" #: src/language/stats/regression.c:919 msgid "Collinearity Statistics" msgstr "Kolinearumo statistika" #: src/language/stats/regression.c:920 msgid "Tolerance" msgstr "Leistinumas" #: src/language/stats/regression.c:920 msgid "VIF" msgstr "" #: src/language/stats/regression.c:933 msgid "(Constant)" msgstr "(Konstanta)" #: src/language/stats/regression.c:1020 #, c-format msgid "ANOVA (%s)" msgstr "ANOVA (%s)" #: src/language/stats/regression.c:1031 src/ui/gui/regression.ui:24 msgid "Regression" msgstr "Regresija" #: src/language/stats/regression.c:1075 #, c-format msgid "Coefficient Correlations (%s)" msgstr "Koeficientų koreliacijos (%s)" #: src/language/stats/regression.c:1082 msgid "Models" msgstr "Modeliai" #: src/language/stats/regression.c:1090 msgid "Covariances" msgstr "Kovariacija" #: src/language/stats/runs.c:169 #, c-format msgid "" "Multiple modes exist for variable `%s'. Using %.*g as the threshold value." msgstr "" "Kintamasis „%s“ turi daug veiksenų. Naudojama %.*g kaip slenkstinė reikšmė." #: src/language/stats/runs.c:314 src/ui/gui/runs.ui:24 msgid "Runs Test" msgstr "Serijų kriterijus" #: src/language/stats/runs.c:319 msgid "Test Value" msgstr "Kriterijaus reikšmė" #: src/language/stats/runs.c:320 msgid "Test Value (mode)" msgstr "Kriterijaus reikšmė (moda)" #: src/language/stats/runs.c:321 msgid "Test Value (mean)" msgstr "Kriterijaus reikšmė (vidurkis)" #: src/language/stats/runs.c:322 msgid "Test Value (median)" msgstr "Kriterijaus reikšmė (mediana)" #: src/language/stats/runs.c:323 msgid "Cases < Test Value" msgstr "Atvejai < kriterijaus reikšmė" #: src/language/stats/runs.c:324 msgid "Cases ≥ Test Value" msgstr "Atvejai ≥ kriterijaus reikšmė" #: src/language/stats/runs.c:325 msgid "Total Cases" msgstr "Iš viso atvejų" #: src/language/stats/runs.c:326 msgid "Number of Runs" msgstr "Serijų skaičius" #: src/language/stats/sign.c:72 msgid "Differences" msgstr "Skirtumai" #: src/language/stats/sign.c:73 msgid "Negative Differences" msgstr "Neigiami skirtumai" #: src/language/stats/sign.c:74 msgid "Positive Differences" msgstr "Teigiami skirtumai" #: src/language/stats/sign.c:75 src/language/stats/wilcoxon.c:250 msgid "Ties" msgstr "Ryšiai" #: src/language/stats/sort-cases.c:63 msgid "Buffer limit must be at least 2." msgstr "Buferio riba privalo būti bent 2." #: src/language/stats/sort-criteria.c:89 #, c-format msgid "Variable %s specified twice in sort criteria." msgstr "Rikiavimo kriterijui kintamasis %s nurodytas du kartus." #: src/language/stats/t-test-indep.c:190 msgid "Group Statistics" msgstr "Grupių statistika" #: src/language/stats/t-test-indep.c:200 msgid "Group" msgstr "Grupė" #: src/language/stats/t-test-indep.c:256 msgid "Independent Samples Test" msgstr "Kriterijus nepriklausomoms imtims" #: src/language/stats/t-test-indep.c:261 msgid "Levene's Test for Equality of Variances" msgstr "Livyno kriterijus dispersijų lygybei" #: src/language/stats/t-test-indep.c:265 msgid "T-Test for Equality of Means" msgstr "t kriterijus vidurkių lygybei" #: src/language/stats/t-test-indep.c:269 #: src/language/stats/t-test-one-sample.c:77 msgid "Mean Difference" msgstr "Vidurkių skirtumas" #: src/language/stats/t-test-indep.c:270 msgid "Std. Error Difference" msgstr "Vidurkių skirtumo st. paklaida" #: src/language/stats/t-test-indep.c:273 #, fuzzy, no-c-format #| msgid "95%% Confidence Interval of the Difference" msgid "95% Confidence Interval of the Difference" msgstr "Skirtumo 95%% pasikliovimo intervalas" #: src/language/stats/t-test-indep.c:277 msgid "Assumptions" msgstr "Prielaidos" #: src/language/stats/t-test-indep.c:278 msgid "Equal variances assumed" msgstr "Jei dispersijos būtų lygios" #: src/language/stats/t-test-indep.c:279 msgid "Equal variances not assumed" msgstr "Jei dispersijos skirtųsi" #: src/language/stats/t-test-one-sample.c:64 msgid "One-Sample Test" msgstr "Kriterijus vienai imčiai" #: src/language/stats/t-test-one-sample.c:71 #, c-format msgid "Test Value = %.*g" msgstr "Kriterijaus reikšmė = %.*g" #: src/language/stats/t-test-one-sample.c:80 #: src/language/stats/t-test-paired.c:246 #, c-format msgid "%g%% Confidence Interval of the Difference" msgstr "Skirtumo %g%% pasikliovimo intervalas" #: src/language/stats/t-test-one-sample.c:122 msgid "One-Sample Statistics" msgstr "Vienos imties statistika" #: src/language/stats/t-test-paired.c:147 msgid "Paired Sample Statistics" msgstr "Priklausomų (porinių) imčių statistika" #: src/language/stats/t-test-paired.c:163 #: src/language/stats/t-test-paired.c:205 #: src/language/stats/t-test-paired.c:263 #, c-format msgid "Pair %zu" msgstr "%zu pora " #: src/language/stats/t-test-paired.c:190 msgid "Paired Samples Correlations" msgstr "Priklausomų (porinių) imčių koreliacija" #: src/language/stats/t-test-paired.c:208 #, c-format msgid "%s & %s" msgstr "%s ir %s" #: src/language/stats/t-test-paired.c:234 msgid "Paired Samples Test" msgstr "Kriterijus priklausomoms (porinėms) imtims" #: src/language/stats/t-test-paired.c:240 msgid "Paired Differences" msgstr "Porinių imčių skirtumai" #: src/language/stats/t-test-paired.c:266 #, c-format msgid "%s - %s" msgstr "%s - %s" #: src/language/stats/t-test-parser.c:133 #, c-format msgid "When applying %s to a string variable, two values must be specified." msgstr "" "%s taikant tekstinės eilutės tipo kintamajam, reikia nurodyti dvi reikšmes." #: src/language/stats/t-test-parser.c:145 #: src/language/stats/t-test-parser.c:241 #, c-format msgid "%s subcommand may not be used with %s." msgstr "Pokomandžio %s negalima naudoti su %s." #: src/language/stats/t-test-parser.c:305 msgid "Exactly one of TESTVAL, GROUPS and PAIRS subcommands must be specified." msgstr "" "Būtina nurodyti kurią nors vienintelę iš šių pokomandžių: TESTVAL, GROUPS, " "PAIRS." #: src/language/stats/wilcoxon.c:248 msgid "Sign" msgstr "Ženklas" #: src/language/stats/wilcoxon.c:249 msgid "Negative Ranks" msgstr "Neigiami rangai" #: src/language/stats/wilcoxon.c:249 msgid "Positive Ranks" msgstr "Teigiami rangai" #: src/language/stats/wilcoxon.c:296 msgid "Too many pairs to calculate exact significance" msgstr "Pernelyg daug porų tikslaus reikšmingumo skaičiavimui" #: src/language/data-io/combine-files.c:214 msgid "Cannot specify the active dataset since none has been defined." msgstr "" "Nepavyksta nurodyti aktyvaus duomenų rinkinio, nes toks nebuvo apibrėžtas." #: src/language/data-io/combine-files.c:220 msgid "" "This command may not be used after TEMPORARY when the active dataset is an " "input source. Temporary transformations will be made permanent." msgstr "" "Ši komanda negali būti naudojama po TEMPORARY, jei veikiamasis duomenų " "rinkinys yra įvedimo šaltinis. Laikinos transformacijos bus nuolat." #: src/language/data-io/combine-files.c:255 msgid "Multiple IN subcommands for a single FILE or TABLE." msgstr "Keletas IN pokomandžių vienai rinkmenai (FILE) ar lentelei (TABLE)." #: src/language/data-io/combine-files.c:308 #, c-format msgid "File %s lacks BY variable %s." msgstr "Rinkmenai %s trūksta BY kintamojo %s." #: src/language/data-io/combine-files.c:311 #, c-format msgid "Active dataset lacks BY variable %s." msgstr "Aktyviam duomenų rinkiniui trūksta BY kintamojo %s." #: src/language/data-io/combine-files.c:388 #: src/language/data-io/combine-files.c:393 #, c-format msgid "BY is required when %s is specified." msgstr "Kai nurodomas %s, reikalinga BY komanda." #: src/language/data-io/combine-files.c:521 msgid "" "Combining files with incompatible encodings. String data may not be " "represented correctly." msgstr "" "Derinamos rinkmenos su nesuderinamomis koduotėmis. Tekstinių eilučių " "duomenys gali būti pateikti netinkamai." #: src/language/data-io/combine-files.c:564 #, c-format msgid "" "Variable %s in file %s has different type or width from the same variable in " "earlier file." msgstr "" "Kintamasis %s rinkmenoje %s yra kitokio tipo arba kitokio pločio negu tas " "pats kintamasis ankstesnėje rinkmenoje." #: src/language/data-io/combine-files.c:570 #, c-format msgid "In file %s, %s is numeric." msgstr "%s rinkmenoje: %s yra skaitmeninis." #: src/language/data-io/combine-files.c:573 #, c-format msgid "In file %s, %s is a string variable with width %d." msgstr "%s rinkmenoje: %s yra teksto eilutės kintamasis, kurio plotis %d." #: src/language/data-io/combine-files.c:578 #, c-format msgid "In an earlier file, %s was numeric." msgstr "Ankstesnėje rinkmenoje: %s buvo skaitmeninis." #: src/language/data-io/combine-files.c:581 #, c-format msgid "In an earlier file, %s was a string variable with width %d." msgstr "" "Ankstesnėje rinkmenoje: %s buvo teksto eilutės kintamasis, kurio plotis %d." #: src/language/data-io/combine-files.c:621 #, c-format msgid "" "Variable name %s specified on %s subcommand duplicates an existing variable " "name." msgstr "" "Kintamojo vardas %s, kuris nurodytas %s pokomandyje, dubliuoja esamą " "kintamojo vardą." #: src/language/data-io/combine-files.c:793 #, c-format msgid "Encountered %zu sets of duplicate cases in the master file." msgstr "" #: src/language/data-io/data-list.c:129 src/language/data-io/data-list.c:144 #, c-format msgid "The %s value must be non-negative." msgstr "„%s“ reikšmė negali būti neigiama." #: src/language/data-io/data-list.c:154 #, c-format msgid "The %s subcommand may only be used within %s." msgstr "Pokomandis %s gali būti naudojamas tik %s viduje." #: src/language/data-io/data-list.c:159 #, c-format msgid "The %s subcommand may only be specified once." msgstr "Pokomandis %s gali būti nurodytas tik vieną kartą." #: src/language/data-io/data-list.c:197 msgid "Only one of FIXED, FREE, or LIST may be specified." msgstr "Gali būti nurodytas tik kuris nors vienas: FIXED, FREE arba LIST." #: src/language/data-io/data-list.c:260 msgid "Encoding should not be specified for inline data. It will be ignored." msgstr "Kodavimas neturėtų būti nurodomas duomenų viduje. Ignoruojama." #: src/language/data-io/data-list.c:269 #, c-format msgid "The %s subcommand may be used only with %s." msgstr "Pokomandis %s gali būti nurodomas tik su %s." #: src/language/data-io/data-list.c:284 src/language/data-io/matrix-data.c:578 msgid "At least one variable must be specified." msgstr "Turi būti nurodytas bent vienas kintamasis." #: src/language/data-io/data-list.c:383 src/language/data-io/data-list.c:491 #: src/language/data-io/get-data.c:662 #, c-format msgid "%s is a duplicate variable name." msgstr "Kintamojo vardas „%s“ kartojasi." #: src/language/data-io/data-list.c:390 #, c-format msgid "There is already a variable %s of a different type." msgstr "Toks kintamasis %s jau yra kitokio tipo." #: src/language/data-io/data-list.c:397 #, c-format msgid "There is already a string variable %s of a different width." msgstr "Toks teksto eilutės kintamasis %s jau yra, bet kitokio pločio." #: src/language/data-io/data-list.c:405 #, c-format msgid "Cannot place variable %s on record %d when RECORDS=%d is specified." msgstr "" "Kintamojo %s negalima patalpinti %d įraše, jeigu naudojama parinktis RECORDS=" "%d." #: src/language/data-io/data-parser.c:453 #: src/language/data-io/data-parser.c:462 msgid "Quoted string extends beyond end of line." msgstr "Tekste tarp kabučių yra nauja eilutė." #: src/language/data-io/data-parser.c:488 msgid "Missing delimiter following quoted string." msgstr "Po eilutės tarp kabučių reikia skirtuko." #: src/language/data-io/data-parser.c:506 #, c-format msgid "Data for variable %s is not valid as format %s: %s" msgstr "Kintamojo %s duomenys neatitinka %s formato: %s" #: src/language/data-io/data-parser.c:536 #, c-format msgid "Partial case of %d of %d records discarded." msgstr "" #: src/language/data-io/data-parser.c:592 #, c-format msgid "Partial case discarded. The first variable missing was %s." msgstr "" #: src/language/data-io/data-parser.c:634 #, c-format msgid "" "Missing value(s) for all variables from %s onward. These will be filled " "with the system-missing value or blanks, as appropriate." msgstr "" #: src/language/data-io/data-parser.c:655 msgid "Record ends in data not part of any field." msgstr "" #: src/language/data-io/data-parser.c:670 #, c-format msgid "Reading %d record from %s." msgid_plural "Reading %d records from %s." msgstr[0] "Skaitomas %d įrašas iš %s." msgstr[1] "Skaitomas %d įrašas iš %s." msgstr[2] "Skaitomi %d įrašai iš %s." msgstr[3] "Skaitoma %d įrašų iš %s." #: src/language/data-io/data-parser.c:680 src/language/data-io/print.c:435 msgid "Record" msgstr "Įrašas" #: src/language/data-io/data-parser.c:680 src/language/data-io/print.c:435 #: src/ui/gui/psppire-var-sheet-header.c:76 msgid "Columns" msgstr "Stulpeliai" #: src/language/data-io/data-parser.c:680 #: src/language/data-io/data-parser.c:725 src/language/data-io/print.c:435 msgid "Format" msgstr "Formatas" #: src/language/data-io/data-parser.c:720 #, c-format msgid "Reading free-form data from %s." msgstr "Skaitomi laisvo formato duomenys iš %s." #. TRANSLATORS: this fragment will be interpolated into #. messages in fh_lock() that identify types of files. #: src/language/data-io/data-reader.c:136 src/language/data-io/data-writer.c:79 msgid "data file" msgstr "duomenų rinkmena" #: src/language/data-io/data-reader.c:160 #, c-format msgid "Could not open `%s' for reading as a data file: %s." msgstr "Nepavyksta atverti „%s“ nuskaitymui duomenų rinkmenos formatu: %s." #: src/language/data-io/data-reader.c:174 #, c-format msgid "Could not read `%s' as a text file with encoding `%s': %s." msgstr "" "Nepavyksta atverti „%s“ kaip tekstinės rinkmenos naudojant „%s“ koduotę: %s." #: src/language/data-io/data-reader.c:233 #, c-format msgid "" "Missing %s while reading inline data. This probably indicates a missing or " "incorrectly formatted %s command. %s must appear by itself on a single line " "with exactly one space between words." msgstr "" #: src/language/data-io/data-reader.c:253 #: src/language/data-io/data-reader.c:387 #, c-format msgid "Error reading file %s: %s." msgstr "Rinkmenos %s skaitymo klaida: %s." #: src/language/data-io/data-reader.c:261 #, c-format msgid "Unexpected end of file in partial record reading %s." msgstr "Netikėta rinkmenos pabaiga daliniame įraše skaitant %s." #: src/language/data-io/data-reader.c:321 #, c-format msgid "Corrupt block descriptor word at offset 0x%lx in %s." msgstr "" #: src/language/data-io/data-reader.c:322 #, c-format msgid "Corrupt record descriptor word at offset 0x%lx in %s." msgstr "" #: src/language/data-io/data-reader.c:335 #, c-format msgid "Corrupt record size at offset 0x%lx in %s." msgstr "Sugadintas įrašo dydis ties 0x%lx poslinkiu (%s)." #: src/language/data-io/data-reader.c:493 msgid "Record exceeds remaining block length." msgstr "" #: src/language/data-io/data-reader.c:567 #, c-format msgid "Attempt to read beyond end-of-file on file %s." msgstr "Bandoma skaityti už rinkmenos %s pabaigos." #: src/language/data-io/data-reader.c:570 #, c-format msgid "Attempt to read beyond %s." msgstr "Bandoma skaityti už %s." #: src/language/data-io/data-reader.c:733 msgid "" "This command is not valid here since the current input program does not " "access the inline file." msgstr "" #: src/language/data-io/data-writer.c:106 #, c-format msgid "An error occurred while opening `%s' for writing as a data file: %s." msgstr "Klaida atveriant „%s“ įrašymui kaip duomenų rinkmeną: %s" #: src/language/data-io/data-writer.c:224 #, c-format msgid "I/O error occurred writing data file `%s'." msgstr "Įvedimo/išvedimo klaida įrašant duomenų rinkmeną „%s“." #: src/language/data-io/dataset.c:64 #, c-format msgid "There is no dataset named %s." msgstr "Tokio duomenų rinkinio vardu %s nėra" #: src/language/data-io/dataset.c:250 msgid "Datasets" msgstr "Duomenų rinkiniai" #: src/language/data-io/dataset.c:263 msgid "unnamed dataset" msgstr "nepavadintas duomenų rinkinys" #: src/language/data-io/file-handle.c:61 #, c-format msgid "" "File handle %s is already defined. Use %s before redefining a file handle." msgstr "" "Rinkmenos identifikatorius %s jau yra. Prieš iš naujo apibrėždami rinkmenos " "identifikatorių, panaudokite %s." #: src/language/data-io/file-handle.c:241 #, c-format msgid "%s must be specified with %s." msgstr "%s turi būti nurodytas su %s." #: src/language/data-io/file-handle.c:252 #, c-format msgid "" "The specified file mode requires LRECL. Assuming %zu-character records." msgstr "" "Nurodytai rinkmenos veiksenai reikia LRECL. Tariama, kad tai %zu simb. " "įrašas." #: src/language/data-io/file-handle.c:256 #, c-format msgid "" "Record length (%d) must be between 1 and %lu bytes. Assuming %zu-character " "records." msgstr "" "Įrašo ilgis (%d) turi būti tarp 1 ir %lu baitų. Tariama, kad tai %zu rašmenų " "įrašas." #: src/language/data-io/file-handle.c:300 msgid "file" msgstr "rinkmena" #: src/language/data-io/file-handle.c:302 msgid "inline file" msgstr "įterptoji rinkmena" #: src/language/data-io/file-handle.c:350 msgid "expecting a file name or handle name" msgstr "tikėtasi rinkmenos ar identifikacinio vardo" #: src/language/data-io/file-handle.c:365 #, c-format msgid "Handle for %s not allowed here." msgstr "%s identifikatorius čia neleidžiamas." #: src/language/data-io/get-data.c:108 src/output/measure.c:262 #, c-format msgid "error reading file `%s'" msgstr "klaida bandant nuskaityti rinkmeną „%s“" #: src/language/data-io/get-data.c:127 #, c-format msgid "Unsupported TYPE %s." msgstr "Nepalaikomas TYPE (tipas) %s." #: src/language/data-io/get-data.c:278 msgid "The sheet index must be greater than or equal to 1" msgstr "Lakšto indeksas turi būti ne mažesnis kaip 1" #: src/language/data-io/get-data.c:285 src/language/data-io/get-data.c:308 #: src/language/data-io/get-data.c:327 #, c-format msgid "%s must be followed by either \"%s\" or \"%s\"." msgstr "prieš %s turi eiti „%s“ arba „%s“." #: src/language/data-io/get-data.c:357 #, c-format msgid "" "%s is allowed only with %s arrangement, but %s arrangement was stated or " "implied earlier in this command." msgstr "" #: src/language/data-io/get-data.c:441 src/language/data-io/get-data.c:479 #, c-format msgid "Value of %s must be 1 or greater." msgstr "%s reikšmė turi būti 1 arba didesnė." #: src/language/data-io/get-data.c:504 msgid "" "Ignoring obsolete IMPORTCASES subcommand. (N OF CASES or SAMPLE may be used " "to substitute.)" msgstr "" #: src/language/data-io/get-data.c:551 msgid "" "In compatible syntax mode, the QUALIFIER string must contain exactly one " "character." msgstr "" #: src/language/data-io/get-data.c:583 #, c-format msgid "" "The record number specified, %ld, is at or before the previous record, %d. " "Data fields must be listed in order of increasing record number." msgstr "" #: src/language/data-io/get-data.c:592 #, c-format msgid "" "The record number specified, %ld, exceeds the number of records per case " "specified on FIXCASE, %d." msgstr "" #: src/language/data-io/get.c:132 #, c-format msgid "%s: Data file dictionary has no variables." msgstr "" #: src/language/data-io/inpt-pgm.c:133 #, c-format msgid "Unexpected end-of-file within %s." msgstr "%s netikėta rinkmenos pabaiga." #: src/language/data-io/inpt-pgm.c:146 #, c-format msgid "Input program must contain %s or %s." msgstr "Įvedimo programa privalo turėti %s arba %s." #: src/language/data-io/inpt-pgm.c:152 msgid "Input program did not create any variables." msgstr "Įvedimo programa nesukūrė jokių kintamųjų." #: src/language/data-io/inpt-pgm.c:365 msgid "" "REREAD: Column numbers must be positive finite numbers. Column set to 1." msgstr "" "REREAD: stulpelių numeriai turi būti teigiami baigtiniai skaičiai. Stulpelis " "nustatomas į 1." #: src/language/data-io/list.c:100 msgid "Data List" msgstr "Duomenys" #: src/language/data-io/list.c:221 #, c-format msgid "" "The first case (%ld) specified precedes the last case (%ld) specified. The " "values will be swapped." msgstr "" #: src/language/data-io/list.c:230 #, c-format msgid "" "The first case (%ld) to list is numbered less than 1. The value is being " "reset to 1." msgstr "" #: src/language/data-io/list.c:237 #, c-format msgid "" "The last case (%ld) to list is numbered less than 1. The value is being " "reset to 1." msgstr "" #: src/language/data-io/list.c:244 #, c-format msgid "The step value %ld is less than 1. The value is being reset to 1." msgstr "Žingsnio reikšmė %ld mažesnė nei 1. Reikšmė atstatyta į 1." #: src/language/data-io/placement-parser.c:96 #, c-format msgid "" "Number of variables specified (%zu) differs from number of variable formats " "(%zu)." msgstr "" #: src/language/data-io/placement-parser.c:106 msgid "" "SPSS-like or Fortran-like format specification expected after variable names." msgstr "" "Po kintamųjų vardų tikėtasi SPSS ar Fortran tipo formato specifikacijos." #: src/language/data-io/placement-parser.c:129 #, c-format msgid "The %d columns %d-%d can't be evenly divided into %zu fields." msgstr "" #: src/language/data-io/placement-parser.c:310 msgid "Column positions for fields must be positive." msgstr "Stulpelių padėtis turi būti teigiama." #: src/language/data-io/placement-parser.c:312 msgid "Column positions for fields must not be negative." msgstr "Stulpelių padėtis negali būti neigiama." #: src/language/data-io/placement-parser.c:372 msgid "The ending column for a field must be greater than the starting column." msgstr "" #: src/language/data-io/placement-parser.c:409 #, c-format msgid "" "The record number specified, %.0f, is at or before the previous record, %d. " "Data fields must be listed in order of increasing record number." msgstr "" #: src/language/data-io/print-space.c:127 #, c-format msgid "The expression on %s evaluated to the system-missing value." msgstr "" #: src/language/data-io/print-space.c:130 #, c-format msgid "The expression on %s evaluated to %g." msgstr "" #: src/language/data-io/print.c:189 src/language/data-io/trim.c:58 msgid "expecting a valid subcommand" msgstr "tikimasi tinkamo pokomandžio" #: src/language/data-io/print.c:219 #, c-format msgid "%s is required when binary formats are specified." msgstr "Pasirinkus naudoti dvejetainį formatą, reikia nurodyti %s." #: src/language/data-io/print.c:302 #, c-format msgid "Output calls for %d records but %zu specified on RECORDS subcommand." msgstr "" #: src/language/data-io/print.c:432 msgid "Print Summary" msgstr "Santrauka" #: src/language/data-io/print.c:462 msgid "N of Records" msgstr "Įrašų N" #: src/language/data-io/matrix-data.c:191 #, c-format msgid "" "There are %d variable declared but the data has at least %d matrix rows." msgstr "" #: src/language/data-io/matrix-data.c:292 msgid "" "The N subcommand was specified, but a N record was also found in the data. " "The N record will be ignored." msgstr "" #: src/language/data-io/matrix-data.c:488 src/language/utilities/set.q:186 #, c-format msgid "%s must not be negative." msgstr "%s negali būti neigiamas." #: src/language/data-io/matrix-data.c:568 msgid "FORMAT = FULL and FORMAT = NODIAGONAL are mutually exclusive." msgstr "" #: src/language/data-io/matrix-reader.c:102 #: src/language/data-io/matrix-reader.c:118 #, c-format msgid "Matrix dataset lacks a variable called %s." msgstr "Matricos duomenų rinkiniui trūksta kintamojo %s." #: src/language/data-io/matrix-reader.c:109 #: src/language/data-io/matrix-reader.c:125 #, c-format msgid "Matrix dataset variable %s should be of string type." msgstr "" #: src/language/data-io/save-translate.c:168 #: src/language/data-io/save-translate.c:183 #, c-format msgid "The %s string must contain exactly one character." msgstr "%s teksto eilutė privalo turėti būtent vieną simbolį." #: src/language/data-io/save-translate.c:249 #, c-format msgid "Output file `%s' exists but %s was not specified." msgstr "Išvedimo rinkmena „%s“ jau yra, bet nenurodyta komanda %s." #: src/language/data-io/save.c:309 msgid "The OUTFILE or METADATA subcommand is required." msgstr "" #: src/language/data-io/trim.c:69 #, c-format msgid "" "Cannot rename %s as %s because there already exists a variable named %s. To " "rename variables with overlapping names, use a single RENAME subcommand such " "as `/RENAME (A=B)(B=C)(C=A)', or equivalently, `/RENAME (A B C=B C A)'." msgstr "" #: src/language/data-io/trim.c:227 #, c-format msgid "" "Number of variables on left side of `=' (%zu) does not match number of " "variables on right side (%zu), in parenthesized group %d of RENAME " "subcommand." msgstr "" #: src/language/data-io/trim.c:242 #, c-format msgid "Requested renaming duplicates variable name %s." msgstr "Paprašyta pervadinti besikartojančius kintamuosius vardu %s." #: src/language/data-io/trim.c:281 msgid "Cannot DROP all variables from dictionary." msgstr "Negalima iš žodyno išmesti (DROP) visų kintamųjų." #: src/language/expressions/evaluate.c:151 msgid "expecting number or string" msgstr "tikėtasi skaičiaus arba teksto eilutės" #: src/language/expressions/helpers.c:43 msgid "" "One of the arguments to a DATE function is not an integer. The result will " "be system-missing." msgstr "" "Vienas iš DATE funkcijos argumentų nėra sveikasis skaičius. Skaičiavimo " "rezultatas bus sisteminė praleista reikšmė." #: src/language/expressions/helpers.c:71 msgid "" "The week argument to DATE.WKYR is not an integer. The result will be system-" "missing." msgstr "" "DATE.WKYR funkcijos savaitės argumentas nėra sveikasis skaičius. Skaičiavimo " "rezultatas bus sisteminė praleista reikšmė." #: src/language/expressions/helpers.c:77 msgid "" "The week argument to DATE.WKYR is outside the acceptable range of 1 to 53. " "The result will be system-missing." msgstr "" "DATE.WKYR funkcijos savaitės argumentas nepatenka į intervalą tarp 1 ir 53. " "Skaičiavimo rezultatas bus sisteminė praleista reikšmė." #: src/language/expressions/helpers.c:99 msgid "" "The day argument to DATE.YRDAY is not an integer. The result will be system-" "missing." msgstr "" "DATE.YRDAY funkcijos dienos argumentas nėra sveikasis skaičius. Skaičiavimo " "rezultatas bus sisteminė praleista reikšmė." #: src/language/expressions/helpers.c:105 msgid "" "The day argument to DATE.YRDAY is outside the acceptable range of 1 to 366. " "The result will be system-missing." msgstr "" "DATE.YRDAY funkcijos savaitės argumentas nepatenka į intervalą tarp 1 ir " "366. Skaičiavimo rezultatas bus sisteminė praleista reikšmė." #: src/language/expressions/helpers.c:127 msgid "" "The year argument to YRMODA is greater than 47516. The result will be " "system-missing." msgstr "" "YRMODA funkcijos argumentas didesnis kaip 47516. Skaičiavimo rezultatas bus " "sisteminė praleista reikšmė." #: src/language/expressions/helpers.c:180 #, c-format msgid "" "Unrecognized date unit `%.*s'. Valid date units are `%s', `%s', `%s', `%s', " "`%s', `%s', `%s', and `%s'." msgstr "" "Neatpažinta datos dalis „%.*s“. Leidžiamos datos dalys: „%s“, „%s“, „%s“, " "„%s“, „%s“, „%s“, „%s“ ir „%s“." #: src/language/expressions/helpers.c:333 #, c-format msgid "Invalid DATESUM method. Valid choices are `%s' and `%s'." msgstr "Netinkamas DATESUM metodas. Tinkami metodai yra „%s“ ir „%s“." #: src/language/expressions/parse.c:261 #, c-format msgid "" "Type mismatch: expression has %s type, but a numeric value is required here." msgstr "" "Neatitinka tipai: išraiška yra %s tipo, bet reikia skaitmeninio kintamojo." #: src/language/expressions/parse.c:274 #, c-format msgid "" "Type mismatch: expression has %s type, but a string value is required here." msgstr "" "Neatitinka tipai: išraiška yra %s tipo, bet reikia teksto eilutės kintamojo." #: src/language/expressions/parse.c:436 #, c-format msgid "Type mismatch while applying %s operator: cannot convert %s to %s." msgstr "" "Neatitinka tipai pritaikant %s operatorių: negalima konvertuoti iš %s į %s." #: src/language/expressions/parse.c:650 msgid "" "Chaining relational operators (e.g. `a < b < c') will not produce the " "mathematically expected result. Use the AND logical operator to fix the " "problem (e.g. `a < b AND b < c'). If chaining is really intended, " "parentheses will disable this warning (e.g. `(a < b) < c'.)" msgstr "" #: src/language/expressions/parse.c:752 msgid "" "The exponentiation operator (`**') is left-associative, even though right-" "associative semantics are more useful. That is, `a**b**c' equals " "`(a**b)**c', not as `a**(b**c)'. To disable this warning, insert " "parentheses." msgstr "" #: src/language/expressions/parse.c:832 #, c-format msgid "Unknown system variable %s." msgstr "Nežinomas sisteminis kintamasis %s." #: src/language/expressions/parse.c:880 #, c-format msgid "Unknown identifier %s." msgstr "Nežinomas identifikatorius %s." #: src/language/expressions/parse.c:1102 #, c-format msgid "%s must have at least %d arguments in list." msgstr "%s privalo turėti bent %d argumentų." #: src/language/expressions/parse.c:1111 #, c-format msgid "%s must have an even number of arguments in list." msgstr "%s privalo turėti lyginį argumentų skaičių." #: src/language/expressions/parse.c:1114 #, c-format msgid "%s must have multiple of %d arguments in list." msgstr "%s privalo turėti keletą %d argumentų." #: src/language/expressions/parse.c:1124 #, c-format msgid "%s function does not accept a minimum valid argument count." msgstr "%s funkcija nepriima mažiausio galimo argumentų kiekio." #: src/language/expressions/parse.c:1133 #, c-format msgid "%s requires at least %d valid arguments in list." msgstr "%s reikalauja, kad sąraše būtų bent %d galiojančių argumentų." #: src/language/expressions/parse.c:1139 #, c-format msgid "" "With %s, using minimum valid argument count of %d does not make sense when " "passing only %d arguments in list." msgstr "" #: src/language/expressions/parse.c:1193 #, c-format msgid "Type mismatch invoking %s as " msgstr "" #: src/language/expressions/parse.c:1198 msgid "Function invocation " msgstr "Kviečiama funkcija " #: src/language/expressions/parse.c:1200 msgid " does not match any known function. Candidates are:" msgstr " neatitinka jokios žinomos funkcijos. Pasiūlymai:" #: src/language/expressions/parse.c:1230 #, c-format msgid "No function or vector named %s." msgstr "Tokios „%s“ funkcijos arba vektoriaus nėra." #: src/language/expressions/parse.c:1292 #, c-format msgid "%s is a PSPP extension." msgstr "%s yra PSPP plėtinys." #: src/language/expressions/parse.c:1295 #, c-format msgid "%s is not available in this version of PSPP." msgstr "%s neprieinama(s) šioje PSPP versijoje." #: src/language/expressions/parse.c:1302 #, c-format msgid "%s may not appear after %s." msgstr "%s gali nebūti po %s." #: src/libpspp/ext-array.c:66 msgid "failed to create temporary file" msgstr "nepavyko sukurti laikinos rinkmenos" #: src/libpspp/ext-array.c:106 msgid "seeking in temporary file" msgstr "ieškoma laikinojoje rinkmenoje" #: src/libpspp/ext-array.c:125 msgid "reading temporary file" msgstr "skaitoma laikinoji rinkmena" #: src/libpspp/ext-array.c:127 msgid "unexpected end of file reading temporary file" msgstr "netikėta skaitomos laikinosios rinkmenos pabaiga" #: src/libpspp/ext-array.c:147 msgid "writing to temporary file" msgstr "rašoma į laikinąją rinkmeną" #: src/libpspp/i18n.c:1128 msgid "Arabic" msgstr "Arabų" #: src/libpspp/i18n.c:1130 msgid "Armenian" msgstr "Armėnų" #: src/libpspp/i18n.c:1131 msgid "Baltic" msgstr "Baltų" #: src/libpspp/i18n.c:1133 msgid "Celtic" msgstr "Keltų" #: src/libpspp/i18n.c:1134 msgid "Central European" msgstr "Centrinės Europos" #: src/libpspp/i18n.c:1136 msgid "Chinese Simplified" msgstr "Supaprastinta kinų" #: src/libpspp/i18n.c:1138 msgid "Chinese Traditional" msgstr "Tradicinė kinų" #: src/libpspp/i18n.c:1140 msgid "Croatian" msgstr "Kroatų" #: src/libpspp/i18n.c:1141 msgid "Cyrillic" msgstr "Kirilica" #: src/libpspp/i18n.c:1143 msgid "Cyrillic/Russian" msgstr "Kirilica / rusų" #: src/libpspp/i18n.c:1144 msgid "Cyrillic/Ukrainian" msgstr "Kirilica / ukrainiečių" #: src/libpspp/i18n.c:1146 msgid "Georgian" msgstr "Gruzinų" #: src/libpspp/i18n.c:1147 msgid "Greek" msgstr "Graikų" #: src/libpspp/i18n.c:1148 msgid "Gujarati" msgstr "Gudžarati" #: src/libpspp/i18n.c:1149 msgid "Gurmukhi" msgstr "Gurmukhi" #: src/libpspp/i18n.c:1150 msgid "Hebrew" msgstr "Hebrajų" #: src/libpspp/i18n.c:1152 msgid "Hebrew Visual" msgstr "Hebrajų regimoji" #: src/libpspp/i18n.c:1153 msgid "Hindi" msgstr "Hindi" #: src/libpspp/i18n.c:1154 msgid "Icelandic" msgstr "Islandų" #: src/libpspp/i18n.c:1155 msgid "Japanese" msgstr "Japonų" #: src/libpspp/i18n.c:1157 msgid "Korean" msgstr "Korėjiečių" #: src/libpspp/i18n.c:1159 msgid "Nordic" msgstr "Šiaurės" #: src/libpspp/i18n.c:1160 msgid "Romanian" msgstr "Rumunų" #: src/libpspp/i18n.c:1162 msgid "South European" msgstr "Pietų Europos" #: src/libpspp/i18n.c:1163 msgid "Thai" msgstr "Tajų" #: src/libpspp/i18n.c:1165 msgid "Turkish" msgstr "Turkų" #: src/libpspp/i18n.c:1167 msgid "Vietnamese" msgstr "Vietnamiečių" #: src/libpspp/i18n.c:1169 msgid "Western European" msgstr "Vakarų Europos" #: src/libpspp/message.c:89 #, c-format msgid "%s: %s" msgstr "%s: %s" #: src/libpspp/message.c:113 msgid "error" msgstr "klaida" #: src/libpspp/message.c:115 msgid "warning" msgstr "įspėjimas" #: src/libpspp/message.c:118 msgid "note" msgstr "pastaba" #: src/libpspp/message.c:327 #, c-format msgid "Notes (%d) exceed limit (%d). Suppressing further notes." msgstr "Pastabų kiekis (%d) pasiekė ribą (%d). Daugiau pastabų nebus." #: src/libpspp/message.c:335 #, c-format msgid "Warnings (%d) exceed limit (%d). Syntax processing will be halted." msgstr "" "Įspėjimų kiekis (%d) pasiekė ribą (%d). Sintaksės apdorojimas nutraukiamas." #: src/libpspp/message.c:338 #, c-format msgid "Errors (%d) exceed limit (%d). Syntax processing will be halted." msgstr "" "Klaidų kiekis (%d) pasiekė ribą (%d). Sintaksės apdorojimas nutraukiamas." #: src/libpspp/zip-reader.c:202 #, c-format msgid "%s: corrupt archive at 0x%llx: expected %# but got %#" msgstr "" "%s: archyvas sugadintas ties 0x%llx: tikėtasi %#; yra %#" #: src/libpspp/zip-reader.c:329 src/libpspp/zip-reader.c:449 #, c-format msgid "%s: open failed (%s)" msgstr "%s: nepavyko atverti (%s)." #: src/libpspp/zip-reader.c:344 #, c-format msgid "%s: cannot find central directory" msgstr "%s: nepavyksta rasti centrinio katalogo" #: src/libpspp/zip-reader.c:353 src/libpspp/zip-reader.c:384 #: src/libpspp/zip-reader.c:468 #, c-format msgid "%s: seek failed (%s)" msgstr "%s: nepavyko pasiekti (%s)." #: src/libpspp/zip-reader.c:441 #, c-format msgid "%s: unknown member \"%s\"" msgstr "%s: nežinomas narys „%s“" #: src/libpspp/zip-reader.c:503 #, fuzzy, c-format #| msgid "" #| "%s: name mismatch betwen central directory (%s) and local file header (%s)" msgid "" "%s: name mismatch between central directory (%s) and local file header (%s)" msgstr "" "%s: neatitinka vardai tarp centrinio katalogo (%s) ir vietinės rinkmenos " "antraštės (%s)" #: src/libpspp/zip-reader.c:696 #, c-format msgid "%s: cannot initialize inflator (%s)" msgstr "" #: src/libpspp/zip-reader.c:751 #, c-format msgid "%s: error inflating \"%s\" (%s)" msgstr "" #: src/libpspp/zip-writer.c:97 utilities/pspp-convert.c:346 #, c-format msgid "%s: error opening output file" msgstr "%s: klaida bandant atverti išvesties rinkmeną" #: src/libpspp/zip-writer.c:169 #, c-format msgid "%s: error seeking in output file" msgstr "%s: klaida ieškant išvesties rinkmenos" #: src/libpspp/zip-writer.c:210 msgid "error creating temporary file" msgstr "klaida bandant sukurti laikinąją rinkmeną" #: src/libpspp/zip-writer.c:279 #, c-format msgid "%s: write failed" msgstr "%s: nepavyko rašyti" #. TRANSLATORS: This is a format string which, when presented to #. printf like functions, will create a pango markup string to #. display real number in scientific notation. #. #. In its untranslated form, it will display similar to "1.23 x 10^4". You #. can leave it untranslated if this is how scientific notation is usually #. presented in your language. #. #. Some locales (such as German) prefer the centered dot rather than the #. multiplication sign between the mantissa an exponent. In which #. case, you can change "#215;" to "#8901;" or other unicode code #. point as appropriate. #. #. The . in this string does not and should not be changed, since #. that is taken care of by the stdc library. #. #. For information on Pango markup, see #. http://developer.gnome.org/pango/stable/PangoMarkupFormat.html #. #. For tables of unicode code points, see http://unicode.org/charts #. #: src/math/chart-geometry.c:123 #, c-format msgid "%%.%dlf×10%d" msgstr "%%.%dlf×10%d" #: src/math/histogram.c:145 msgid "" "Not creating histogram because the data contains less than 2 distinct values" msgstr "Histograma nebraižoma, nes duomenyse mažiau nei 2 skirtingos reikšmės" #: src/math/percentiles.c:36 msgid "HAverage" msgstr "Svertinis vidurk." #: src/math/percentiles.c:38 msgid "Rounded" msgstr "Suapvalintas" #: src/math/percentiles.c:39 msgid "Empirical" msgstr "Empirinis" #: src/math/percentiles.c:40 msgid "Empirical with averaging" msgstr "Empirinis su vidurkinimu" #: src/math/shapiro-wilk.c:84 msgid "" "One or more weight values are non-integer. Fractional parts will be ignored " "when calculating the Shapiro-Wilk statistic." msgstr "" #: src/output/ascii.c:340 #, c-format msgid "ascii: opening output file `%s'" msgstr "ascii: atveriama rezultatų rinkmena „%s“" #: src/output/ascii.c:371 #, c-format msgid "%s: %s must be positive integer or `auto'" msgstr "%s: %s turi būti teigiamas sveikasis skaičius arba „auto“" #: src/output/ascii.c:393 #, c-format msgid "" "ascii: page must be at least %d characters wide, but as configured is only " "%d characters" msgstr "" #: src/output/ascii.c:508 #, c-format msgid "See %s for a chart." msgstr "Diagrama: %s." #: src/output/charts/piechart.c:54 msgid "*MISSING*" msgstr "*TRŪKSTA*" #: src/output/csv.c:100 src/output/html.c:117 src/output/journal.c:166 #: src/output/msglog.c:68 #, c-format msgid "error opening output file `%s'" msgstr "klaida bandant atverti išvesties rinkmeną „%s“" #: src/output/driver.c:522 #, c-format msgid "%s is not a valid device type (the choices are `%s' and `%s')" msgstr "%s nėra tinkamas įrenginio tipas (tinka „%s“ ir „%s“)" #: src/output/driver.c:536 #, c-format msgid "%s: unknown option `%s'" msgstr "%s: nežinoma parinktis „%s“" #: src/output/driver.c:553 #, c-format msgid "%s: output option missing `='" msgstr "%s: išvedimo parinkčiai trūksta „=“" #: src/output/driver.c:560 #, c-format msgid "%s: output option specified more than once" msgstr "%s: išvedimo parinktis nurodyta daugiau nei vieną kartą" #: src/output/html.c:129 msgid "PSPP Output" msgstr "PSPP rezultatai" #: src/output/html.c:266 msgid "No description" msgstr "Aprašo nėra" #: src/output/journal.c:69 #, c-format msgid "error writing output file `%s'" msgstr "klaida bandant rašyti į rezultatų rinkmeną „%s“" #: src/output/measure.c:68 #, c-format msgid "`%s' is not a valid length." msgstr "„%s“ nėra tinkamas ilgis." #: src/output/measure.c:96 #, c-format msgid "syntax error in paper size `%s'" msgstr "sintaksės klaida ties popieriaus matmenimis „%s“" #: src/output/measure.c:233 #, c-format msgid "unknown paper type `%.*s'" msgstr "nežinomas popieriaus tipas „%.*s“" #: src/output/measure.c:251 #, c-format msgid "error opening input file `%s'" msgstr "klaida bandant atverti įvesties rinkmeną „%s“" #: src/output/measure.c:279 #, c-format msgid "file `%s' does not state a paper size" msgstr "rinkmena „%s“ nenurodo popieriaus dydžio" #: src/output/options.c:112 #, c-format msgid "%s: `%s' is `%s' but a Boolean value is required" msgstr "%s: „%s“ yra „%s“, reikia loginės reikšmės" #: src/output/options.c:187 #, c-format msgid "%s: `%s' is `%s' but one of the following is required: %s" msgstr "%s: „%s“ yra „%s“, bet reikia vieno iš šių: %s" #: src/output/options.c:231 #, c-format msgid "%s: `%s' is `%s' but a non-negative integer is required" msgstr "%s: „%s“ yra „%s“, bet reikia neneigiamo sveikojo skaičiaus" #: src/output/options.c:235 #, c-format msgid "%s: `%s' is `%s' but a positive integer is required" msgstr "%s: „%s“ yra „%s“, bet reikia teigiamo sveikojo skaičiaus" #: src/output/options.c:238 #, c-format msgid "%s: `%s' is `%s' but an integer is required" msgstr "%s: „%s“ yra „%s“, bet reikia sveikojo skaičiaus" #: src/output/options.c:241 #, c-format msgid "%s: `%s' is `%s' but an integer greater than %d is required" msgstr "%s: „%s“ yra „%s“, bet reikia sveikojo skaičiaus, didesnio už %d" #: src/output/options.c:246 #, c-format msgid "%s: `%s' is `%s' but an integer between %d and %d is required" msgstr "" "%s: „%s“ yra „%s“, bet reikia sveikojo skaičiaus iš intervalo nuo %d iki %d" #: src/output/options.c:325 #, c-format msgid "%s: `%s' is `%s' but a file name that contains `#' is required." msgstr "%s: „%s“ yra „%s“, bet reikia rinkmenos pavadinimo, turinčio „#“." #. TRANSLATORS: Do not translate this string. If the script of your language #. reads from right to left (eg Persian, Arabic, Hebrew etc), then replace #. this string with "output-direction-rtl". Otherwise either leave it #. untranslated or copy it verbatim. #: src/output/render.c:994 msgid "output-direction-ltr" msgstr "" #: src/output/text-item.c:44 msgid "Page Title" msgstr "Puslapio antraštė" #: src/output/text-item.c:47 msgid "Title" msgstr "Antraštė" #: src/output/text-item.c:51 msgid "Log" msgstr "" #: src/output/text-item.c:54 msgid "Page Break" msgstr "Puslapio lūžis" #: src/output/cairo.c:520 #, c-format msgid "`%s': bad font specification" msgstr "„%s“: netinkama šrifto specifikacija" #: src/output/cairo.c:744 #, c-format msgid "" "The defined page is not wide enough to hold at least %d characters in the " "default font. In fact, there's only room for %d characters." msgstr "" "Nurodytas puslapis nėra pakankamai platus sutalpinti %d ar daugiau rašmenų " "numatytuoju šriftu. Iš tikrųjų telpa tik %d rašmenys." #: src/output/cairo.c:752 #, c-format msgid "" "The defined page is not long enough to hold at least %d lines in the default " "font. In fact, there's only room for %d lines." msgstr "" "Nurodytas puslapis nėra pakankamai ilgas sutalpinti %d ar daugiau eilučių " "numatytuoju šriftu. Iš tikrųjų telpa tik %d eilutės." #: src/output/cairo.c:837 #, c-format msgid "error opening output file `%s': %s" msgstr "klaida bandant atverti rezultatų rinkmeną „%s“: %s" #: src/output/cairo.c:892 #, c-format msgid "error drawing output for %s driver: %s" msgstr "klaida braižant su %s tvarkykle: %s" #: src/output/cairo.c:2056 #, c-format msgid "error writing output file `%s': %s" msgstr "klaida bandant rašyti į rezultatų rinkmeną „%s“: %s" #: src/output/charts/np-plot-cairo.c:37 #, c-format msgid "Normal Q-Q Plot of %s" msgstr "%s: kvantilių grafikas" #: src/output/charts/np-plot-cairo.c:38 src/output/charts/np-plot-cairo.c:68 msgid "Observed Value" msgstr "Empirinė reikšmė" #: src/output/charts/np-plot-cairo.c:39 msgid "Expected Normal" msgstr "Teorinis pagal normalųjį" #: src/output/charts/np-plot-cairo.c:67 #, c-format msgid "Detrended Normal Q-Q Plot of %s" msgstr "%s: kvantilių grafikas be trendo" #: src/output/charts/np-plot-cairo.c:69 msgid "Dev from Normal" msgstr "Nuokrypis nuo normaliojo" #: src/output/charts/barchart-cairo.c:65 msgid "Bar Chart" msgstr "Stulpelinė diagrama" #: src/output/charts/plot-hist-cairo.c:43 #, c-format msgid "N = %.2f" msgstr "N = %.2f" #: src/output/charts/plot-hist-cairo.c:52 #, c-format msgid "Mean = %.1f" msgstr "Vidurkis = %.1f" #: src/output/charts/plot-hist-cairo.c:61 #, c-format msgid "Std. Dev = %.2f" msgstr "St. nuokrypis = %.2f" #: src/output/charts/plot-hist-cairo.c:110 msgid "HISTOGRAM" msgstr "HISTOGRAMA" #: src/output/charts/roc-chart-cairo.c:36 src/ui/gui/roc.ui:24 msgid "ROC Curve" msgstr "Sprendimus priimančiojo ypatybių kreivė" #: src/output/charts/scree-cairo.c:36 msgid "Scree Plot" msgstr "Tikrinių reikšmių grafikas" #: src/output/charts/scree-cairo.c:38 msgid "Eigenvalue" msgstr "Tikrinė reikšmė" #: src/output/charts/spreadlevel-cairo.c:37 #, c-format msgid "Spread vs. Level Plot of %s" msgstr "%s: sklaidos ir lygio grafikas" #: src/output/charts/spreadlevel-cairo.c:38 msgid "Level" msgstr "Lygis" #: src/output/charts/spreadlevel-cairo.c:39 msgid "Spread" msgstr "Sklaida" #: src/output/charts/scatterplot-cairo.c:57 #, c-format msgid "Scatterplot %s" msgstr "„%s“ sklaidos diagrama" #: src/output/spv/spv-legacy-decoder.c:2222 msgid "Table lacks cell data." msgstr "Lentelėje trūksta langelių duomenų." #: src/output/spv/spv-writer.c:68 #, c-format msgid "%s: create failed" msgstr "%s: nepavyko sukurti" #: src/output/spv/spv-writer.c:89 msgid "I/O error writing SPV file" msgstr "Klaida rašant į SPV rinkmeną" #: src/output/spv/spv.c:693 #, c-format msgid "%s: Failed to create XML parser" msgstr "%s: nepavyko sukurti XML analizatoriaus" #: src/output/spv/spv.c:718 #, c-format msgid "%s: document is not well-formed" msgstr "%s: dokumentas nėra gerai suformuotas" #: src/output/spv/spv.c:726 #, c-format msgid "%s: root node is \"%s\" but \"%s\" was expected" msgstr "%s: šakninis mazgas yra „%s“, bet tikėtasi „%s“" #: src/ui/gui/psppire-acr.c:273 msgid "Add" msgstr "Pridėti" #: src/ui/gui/psppire-acr.c:274 msgid "Edit" msgstr "Keisti" #: src/ui/gui/psppire-acr.c:275 msgid "Remove" msgstr "Pašalinti" #: src/ui/gui/psppire-buttonbox.c:311 msgid "OK" msgstr "Gerai" #: src/ui/gui/psppire-buttonbox.c:319 msgid "Go To" msgstr "Šokti į" #: src/ui/gui/psppire-buttonbox.c:327 msgid "Continue" msgstr "_Tęsti" #: src/ui/gui/psppire-buttonbox.c:339 src/ui/gui/psppire-import-assistant.c:759 msgid "Paste" msgstr "Įdėti" #: src/ui/gui/psppire-buttonbox.c:345 #: src/ui/gui/psppire-dialog-action-aggregate.c:216 #: src/ui/gui/psppire-data-window.c:496 src/ui/gui/psppire-data-window.c:624 #: src/ui/gui/psppire-output-window.c:353 #: src/ui/gui/psppire-syntax-window.c:594 src/ui/gui/psppire-window.c:445 #: src/ui/gui/psppire-window.c:628 msgid "Cancel" msgstr "Atsisakyti" #: src/ui/gui/psppire-buttonbox.c:351 msgid "Close" msgstr "Užverti" #: src/ui/gui/psppire-buttonbox.c:358 src/ui/gui/psppire-import-assistant.c:760 msgid "Reset" msgstr "Atstatyti" #: src/ui/gui/psppire-buttonbox.c:365 msgid "Help" msgstr "Pagalba" #: src/ui/gui/psppire-dialog-action-aggregate.c:213 msgid "Aggregate destination file" msgstr "Agregavimo paskirties rinkmena" #: src/ui/gui/psppire-dialog-action-aggregate.c:217 #: src/ui/gui/psppire-data-window.c:493 src/ui/gui/psppire-data-window.c:497 #: src/ui/gui/psppire-output-window.c:354 #: src/ui/gui/psppire-syntax-window.c:595 src/ui/gui/psppire-window.c:449 #: src/ui/gui/aggregate.ui:565 msgid "Save" msgstr "Įrašyti" #: src/ui/gui/psppire-dialog-action-aggregate.c:226 #: src/ui/gui/psppire-data-window.c:503 msgid "System Files (*.sav)" msgstr "Sisteminės rinkmenos (*.sav)" #: src/ui/gui/psppire-dialog-action-aggregate.c:231 #: src/ui/gui/psppire-data-window.c:508 msgid "Compressed System Files (*.zsav)" msgstr "Suglaudintos sisteminės rinkmenos (*.zsav)" #: src/ui/gui/psppire-dialog-action-aggregate.c:236 #: src/ui/gui/psppire-data-window.c:513 src/ui/gui/psppire-window.c:652 msgid "Portable Files (*.por) " msgstr "Perkeliamos (Portable) rinkmenos (*.por)" #: src/ui/gui/psppire-dialog-action-autorecode.c:337 #: src/ui/gui/psppire-dialog-action-recode.c:535 #: src/ui/gui/psppire-dialog-action-recode-different.c:288 msgid "New" msgstr "Naujas" #: src/ui/gui/psppire-dialog-action-autorecode.c:351 #: src/ui/gui/psppire-dialog-action-recode.c:527 #: src/ui/gui/psppire-dialog-action-recode-different.c:301 msgid "Old" msgstr "Senas" #: src/ui/gui/psppire-dialog-action-comments.c:142 #, c-format msgid "Column Number: %d" msgstr "Stulpelio numeris: %d" #: src/ui/gui/psppire-dialog-action-crosstabs.c:71 msgid "Chisq" msgstr "Chi kvadr." #: src/ui/gui/psppire-dialog-action-crosstabs.c:71 msgid "" "Pearson chi-square, likelihood ratio, Fisher’s exact test, continuity " "correction, linear-by-linear association." msgstr "" #: src/ui/gui/psppire-dialog-action-crosstabs.c:74 #: src/language/stats/crosstabs.q:1334 msgid "Phi" msgstr "Phi" #: src/ui/gui/psppire-dialog-action-crosstabs.c:75 msgid "CC" msgstr "Konting.k." #: src/ui/gui/psppire-dialog-action-crosstabs.c:75 #, fuzzy #| msgid "Contingency Coefficient" msgid "Contingency coefficient" msgstr "Kontingencijos koeficientas" #: src/ui/gui/psppire-dialog-action-crosstabs.c:77 msgid "UC" msgstr "Neapibr.k." #: src/ui/gui/psppire-dialog-action-crosstabs.c:77 #, fuzzy #| msgid "Uncertainty Coefficient" msgid "Uncertainty coefficient" msgstr "Neapibrėžtumo koeficientas" #: src/ui/gui/psppire-dialog-action-crosstabs.c:78 msgid "BTau" msgstr "Kendalo tau-b" #: src/ui/gui/psppire-dialog-action-crosstabs.c:78 #, fuzzy #| msgid "Kendall's tau-b" msgid "Kendall's Tau-b" msgstr "Kendalo tau-b" #: src/ui/gui/psppire-dialog-action-crosstabs.c:79 msgid "CTau" msgstr "Kendalo tau-c" #: src/ui/gui/psppire-dialog-action-crosstabs.c:79 #, fuzzy #| msgid "Kendall's tau-c" msgid "Kendall's Tau-c" msgstr "Kendalo tau-c" #: src/ui/gui/psppire-dialog-action-crosstabs.c:80 msgid "Risk" msgstr "Rizikos laipsnis" #: src/ui/gui/psppire-dialog-action-crosstabs.c:80 #, fuzzy #| msgid "Risk Estimate" msgid "Relative Risk estimate" msgstr "Rizikos įvertinimas" #: src/ui/gui/psppire-dialog-action-crosstabs.c:81 #: src/language/stats/crosstabs.q:1338 msgid "Gamma" msgstr "Gama" #: src/ui/gui/psppire-dialog-action-crosstabs.c:82 msgid "D" msgstr "Somerso d" #: src/ui/gui/psppire-dialog-action-crosstabs.c:82 #, fuzzy #| msgid "Somers' d" msgid "Somer's d" msgstr "Somerso d" #: src/ui/gui/psppire-dialog-action-crosstabs.c:83 #: src/language/stats/crosstabs.q:1344 msgid "Kappa" msgstr "Kapa" #: src/ui/gui/psppire-dialog-action-crosstabs.c:83 msgid "Cohen's Kappa" msgstr "" #: src/ui/gui/psppire-dialog-action-crosstabs.c:84 #: src/language/stats/crosstabs.q:1429 msgid "Eta" msgstr "Eta" #: src/ui/gui/psppire-dialog-action-crosstabs.c:85 msgid "Corr" msgstr "Koreliac." #: src/ui/gui/psppire-dialog-action-crosstabs.c:85 #, fuzzy #| msgid "Spearman Correlation" msgid "Spearman correlation, Pearson's r" msgstr "Spirmeno koreliacija" #: src/ui/gui/psppire-dialog-action-crosstabs.c:90 #, fuzzy #| msgid "Frequency" msgid "Frequency Count" msgstr "Dažnis" #: src/ui/gui/psppire-dialog-action-crosstabs.c:91 msgid "Row" msgstr "Eilutė" #: src/ui/gui/psppire-dialog-action-crosstabs.c:91 #, fuzzy #| msgid "Percent" msgid "Row percent" msgstr "Procentais" #: src/ui/gui/psppire-dialog-action-crosstabs.c:92 msgid "Column" msgstr "Stulpelis" #: src/ui/gui/psppire-dialog-action-crosstabs.c:92 #, fuzzy #| msgid "Cum Percent" msgid "Column percent" msgstr "Sukauptoji procentinė dalis" #: src/ui/gui/psppire-dialog-action-crosstabs.c:93 #, fuzzy #| msgid "Valid Percent" msgid "Total percent" msgstr "Galiojanti procentinė dalis" #: src/ui/gui/psppire-dialog-action-crosstabs.c:94 #: src/language/stats/crosstabs.q:1266 msgid "Expected" msgstr "Spėjama" #: src/ui/gui/psppire-dialog-action-crosstabs.c:94 #, fuzzy #| msgid "Expected Values:" msgid "Expected value" msgstr "Tikėtinos reikšmės:" #: src/ui/gui/psppire-dialog-action-crosstabs.c:96 #: src/language/stats/crosstabs.q:1268 msgid "Std. Residual" msgstr "Normuota liekana" #: src/ui/gui/psppire-dialog-action-crosstabs.c:96 #, fuzzy #| msgid "Std. Residual" msgid "Standardized Residual" msgstr "Normuota liekana" #: src/ui/gui/psppire-dialog-action-crosstabs.c:97 msgid "Adjusted Std. Residual" msgstr "Patikslinta normuota liekana" #: src/ui/gui/psppire-dialog-action-descriptives.c:45 msgid "Standard error" msgstr "Standartinė paklaida" #: src/ui/gui/psppire-dialog-action-descriptives.c:45 #, fuzzy #| msgid "Standard error of the mean" msgid "Standard error of mean" msgstr "Standartinė vidurkio paklaida" #: src/ui/gui/psppire-dialog-action-descriptives.c:47 #, fuzzy #| msgid "Standard error of the kurtosis" msgid "Kurtosis and standard error of kurtosis" msgstr "Standartinė eksceso paklaida" #: src/ui/gui/psppire-dialog-action-descriptives.c:48 #, fuzzy #| msgid "Standard error of the skewness" msgid "Skewness and standard error of skewness" msgstr "Standartinė asimetrijos paklaida" #: src/ui/gui/psppire-dialog-action-factor.c:323 #, c-format msgid "_Eigenvalues over %4.2f times the mean eigenvalue" msgstr "_Pagal tikrines reikšmes viršija %4.2f" #: src/ui/gui/psppire-dialog-action-frequencies.c:44 msgid "Standard error of the mean" msgstr "Standartinė vidurkio paklaida" #: src/ui/gui/psppire-dialog-action-frequencies.c:47 msgid "Standard error of the skewness" msgstr "Standartinė asimetrijos paklaida" #: src/ui/gui/psppire-dialog-action-frequencies.c:51 msgid "Standard error of the kurtosis" msgstr "Standartinė eksceso paklaida" #: src/ui/gui/psppire-dialog-action-oneway.c:175 #, c-format msgid "Contrast %d of %d" msgstr "%d kontrastas iš %d" #: src/ui/gui/psppire-dialog-action-paired.c:162 src/ui/gui/examine.ui:282 #: src/ui/gui/indep-samples.ui:334 src/ui/gui/t-test.ui:296 msgid "O_ptions..." msgstr "_Parinktys..." #: src/ui/gui/psppire-dialog-action-paired.c:168 msgid "Paired Samples T Test" msgstr "T kriterijus priklausomoms (porinėms) imtims" #: src/ui/gui/psppire-dialog-action-recode-different.c:327 msgid "Recode into Different Variables" msgstr "Perkoduoti į kitus kintamuosius" #: src/ui/gui/psppire-dialog-action-recode-different.c:330 msgid "Recode into Different Variables: Old and New Values " msgstr "Perkoduoti į kitus kintamuosius senos ir naujos reikšmės " #: src/ui/gui/psppire-dialog-action-recode-same.c:108 src/ui/gui/recode.ui:391 msgid "Recode into Same Variables" msgstr "Perkoduoti į tuos pačius kintamuosius" #: src/ui/gui/psppire-dialog-action-recode-same.c:114 msgid "Recode into Same Variables: Old and New Values" msgstr "Perkoduoti į tuos pačius kintamuosius: senos ir naujos reikšmės" #: src/ui/gui/psppire-dialog-action-regression.c:40 msgid "Coeff" msgstr "Koef." #: src/ui/gui/psppire-dialog-action-regression.c:40 msgid "Show the regression coefficients" msgstr "Parodyti regresijos koeficientus" #: src/ui/gui/psppire-dialog-action-regression.c:41 msgid "Conf. Interval" msgstr "Pasikl. intervalas" #: src/ui/gui/psppire-dialog-action-regression.c:41 msgid "Show the confidence interval for the regression coefficients" msgstr "Parodyti regresijos koeficientų pasikliovimo intervalus" #: src/ui/gui/psppire-dialog-action-regression.c:42 msgid "Show the correlation between observed and predicted values" msgstr "Parodyti koreliacijas tarp stebėtų ir prognozuotų reikšmių" #: src/ui/gui/psppire-dialog-action-regression.c:43 msgid "Anova" msgstr "Anova" #: src/ui/gui/psppire-dialog-action-regression.c:43 msgid "Show the analysis of variance table" msgstr "Parodyti dispersinės analizės lentelę" #: src/ui/gui/psppire-dialog-action-regression.c:44 msgid "Bcov" msgstr "Bcov" #: src/ui/gui/psppire-dialog-action-regression.c:44 msgid "Show the variance coefficient matrix" msgstr "Parodyti dispersijos koeficientų matricą" #: src/ui/gui/psppire-dialog-action-regression.c:45 msgid "Tol" msgstr "Leistinumas" #: src/ui/gui/psppire-dialog-action-regression.c:45 msgid "Show the variance inflation factor and its reciprocal" msgstr "" #: src/ui/gui/psppire-dialog-action-select.c:88 #, c-format msgid "Approximately %3d%% of all cases." msgstr "Maždaug %3d%% visų atvejų." #: src/ui/gui/psppire-dialog-action-select.c:89 #, c-format msgid "Exactly %3d cases from the first %3d cases." msgstr "Tiksliai %3d atvejų iš %3d." #: src/ui/gui/psppire-dialog-action-select.c:236 #, c-format msgid "%d thru %d" msgstr "nuo %d iki %d" #: src/ui/gui/psppire-dialog-action-two-sample.c:180 #: src/ui/gui/k-independent.ui:404 src/ui/gui/k-related.ui:197 msgid "Test Type" msgstr "Kriterijaus tipas" #: src/ui/gui/psppire-dialog-action-two-sample.c:189 msgid "_Wilcoxon" msgstr "_Vilkoksono" #: src/ui/gui/psppire-dialog-action-two-sample.c:190 msgid "_Sign" msgstr "_Ženklų" #: src/ui/gui/psppire-dialog-action-two-sample.c:191 msgid "_McNemar" msgstr "_Maknemaros" #: src/ui/gui/psppire-dialog-action-two-sample.c:209 msgid "Two-Related-Samples Tests" msgstr "Kriterijai dvejoms priklausomoms imtims" #: src/ui/gui/psppire-dialog-action-weight.c:74 src/ui/gui/weight.ui:83 #: src/ui/gui/weight.ui:211 msgid "Do not weight cases" msgstr "Nesverti atvejų" #: src/ui/gui/psppire-dialog-action-weight.c:80 #, c-format msgid "Weight cases by %s" msgstr "Atvejus sverti pagal %s" #: src/ui/gui/psppire-dict.c:95 msgid "Var" msgstr "Kint" #. TRANSLATORS: This string must be a valid variable name. That means: #. - The string must be at most 64 bytes (not characters) long. #. - The string may not contain whitespace. #. - The first character may not be '$' #. - The first character may not be a digit #. - The final character may not be '.' or '_' #. #: src/ui/gui/psppire-dict.c:385 #, c-format msgid "Var%04d" msgstr "Kint%04d" #: src/ui/gui/psppire-dict.c:566 msgid "Duplicate variable name." msgstr "Kintamojo vardas kartojasi." #: src/ui/gui/psppire-dictview.c:617 msgid "Prefer variable labels" msgstr "Jei įmanoma, naudoti kintamųjų etiketes" #: src/ui/gui/psppire-dictview.c:631 msgid "Default sort order" msgstr "Numatytoji rikiavimo tvarka" #: src/ui/gui/psppire-dictview.c:637 msgid "Unsorted (dictionary order)" msgstr "Nesurikiuota (tvarka kaip žodyne)" #: src/ui/gui/psppire-dictview.c:642 msgid "Sort by name" msgstr "Rikiuoti pagal vardą" #: src/ui/gui/psppire-dictview.c:647 msgid "Sort by label" msgstr "Rikiuoti pagal etiketę" #: src/ui/gui/psppire-means-layer.c:95 #, c-format msgid "Layer %d of %d" msgstr "%d sluoksnis iš %d" #: src/ui/gui/psppire-means-layer.c:169 msgid "Forward" msgstr "Tolesnis" #: src/ui/gui/psppire-means-layer.c:170 msgid "Back" msgstr "Ankstesnis" #: src/ui/gui/psppire-text-file.c:55 #, c-format msgid "Could not open `%s'" msgstr "Nepavyksta atverti „%s“" #: src/ui/gui/psppire-text-file.c:71 #, c-format msgid "Error reading `%s': %s" msgstr "Klaida bandant nuskaityti „%s“: %s" #: src/ui/gui/psppire-text-file.c:74 #, c-format msgid "" "Failed to read `%s', because it contains a line over %d bytes long and " "therefore appears not to be a text file." msgstr "" "Nepavyko nuskaityti „%s“, nes joje bent viena linija yra ilgesnė kaip %d " "bit. Galbūt tai nėra tekstinė rinkmena." #: src/ui/gui/psppire-text-file.c:96 #, c-format msgid "`%s' is empty." msgstr "„%s“ yra tuščias." #: src/ui/gui/psppire-val-chooser.c:255 msgid "through" msgstr "iki" #: src/ui/gui/psppire-val-chooser.c:288 msgid "_Value:" msgstr "_Reikšmė:" #: src/ui/gui/psppire-val-chooser.c:289 msgid "_System Missing" msgstr "_Sisteminė praleista" #: src/ui/gui/psppire-val-chooser.c:290 msgid "System _or User Missing" msgstr "Sisteminė ar_ba naudotojo praleista" #: src/ui/gui/psppire-val-chooser.c:291 msgid "_Range:" msgstr "_Sritis: nuo" #: src/ui/gui/psppire-val-chooser.c:292 msgid "Range, _LOWEST thru value" msgstr "Sritis, nuo _MAŽIAUSIOS iki ... reikšmės" #: src/ui/gui/psppire-val-chooser.c:293 msgid "Range, value thru _HIGHEST" msgstr "Sritis, nuo ... iki _DIDŽIAUSIOS reikšmės" #: src/ui/gui/psppire-val-chooser.c:294 msgid "_All other values" msgstr "_Visos kitos reikšmės" #: src/ui/gui/psppire-var-view.c:153 #, c-format msgid "Var%d" msgstr "Kint%d" #: src/ui/source-init-opts.c:72 #, c-format msgid "Algorithm must be either `%s' or `%s'." msgstr "Algoritmas turi būti „%s“ arba „%s“." #: src/ui/source-init-opts.c:97 #, c-format msgid "Syntax must be either `%s' or `%s'." msgstr "Sintaksė turi būti „%s“ arba „%s“." #: src/ui/terminal/main.c:144 msgid "Error encountered while ERROR=STOP is effective." msgstr "Klaida įvyko esant aktyviam ERROR=STOP." #: src/ui/terminal/main.c:150 msgid "" "Stopping syntax file processing here to avoid a cascade of dependent command " "failures." msgstr "" "Sintaksės rinkmenos apdorojimas stabdomas tam, kad būtų išvengta klaidų " "susijusiose komandose." #: src/ui/terminal/terminal-opts.c:147 #, c-format msgid "" "PSPP, a program for statistical analysis of sampled data.\n" "Usage: %s [OPTION]... FILE...\n" "\n" "Arguments to long options also apply to equivalent short options.\n" "\n" "Output options:\n" " -o, --output=FILE output to FILE, default format from FILE's name\n" " -O format=FORMAT override format for previous -o\n" " -O OPTION=VALUE set output option to customize previous -o\n" " -O device={terminal|listing} override device type for previous -o\n" " -e, --error-file=FILE append errors, warnings, and notes to FILE\n" " --no-output disable default output driver\n" "Supported output formats: %s\n" "\n" "Language options:\n" " -I, --include=DIR append DIR to search path\n" " -I-, --no-include clear search path\n" " -r, --no-statrc disable running rc file at startup\n" " -a, --algorithm={compatible|enhanced}\n" " set to `compatible' if you want output\n" " calculated from broken algorithms\n" " -x, --syntax={compatible|enhanced}\n" " set to `compatible' to disable PSPP extensions\n" " -b, --batch interpret syntax in batch mode\n" " -i, --interactive interpret syntax in interactive mode\n" " --syntax-encoding=ENCODING specify encoding for syntax files\n" " -s, --safer don't allow some unsafe operations\n" "Default search path: %s\n" "\n" "Informative output:\n" " -h, --help display this help and exit\n" " -V, --version output version information and exit\n" "\n" "Non-option arguments are interpreted as syntax files to execute.\n" msgstr "" "PSPP, programa imties duomenų statistinei analizei.\n" "Naudojimas: %s [PARINKTIS]... RINKMENA...\n" "\n" "Ilgosioms parinktims skirti argumentai tinka ir atitinkamoms trumposioms " "parinktims.\n" "\n" "Išvedimo parinktys:\n" " -o, --output=RINKMENA rezultatus rašyti į RINKMENĄ, formatas pagal jos " "pavadinimą\n" " -O format=FORMATAS naudoti formatą, nepaisant -o parinkties\n" " -O PARINKTIS=REIKŠMĖ nustatyti rezultatų išvedimo parinktį\n" " -O device={terminal|listing} naudoti įrenginio tipą aukščiau nurodytai -" "o\n" " -e, --error-file=RINKMENA klaidas, įspėjimus, pastabas rašyti papildant " "RINKMENĄ\n" " --no-output uždrausti numatytąją rezultatų išvedimo " "tvarkyklę\n" "Palaikomi išvedimo formatai: %s\n" "\n" "Kalbos parinktys:\n" " -I, --include=KATALOGAS į paieškos kelią įtraukti KATALOGĄ\n" " -I-, --no-include išvalyti paieškos kelią\n" " -r, --no-statrc paleidžiant uždrausti veikiančią rc rinkmeną\n" " -a, --algorithm={compatible|enhanced}\n" " nustatykite „compatible“, jei norite rezultatų,\n" " apskaičiuotų naudojant prastesnius algoritmus\n" " -x, --syntax={compatible|enhanced}\n" " rinkdamiesi „compatible“ uždrausite PSPP " "papildinius\n" " -b, --batch sintaksę interpretuoti grupinėje veiksenoje\n" " -i, --interactive sintaksę interpretuoti interaktyvioje " "veiksenoje\n" " --syntax-encoding=KODUOTĖ nurodyti sintaksės failų koduotę\n" " -s, --safer neleisti nesaugių operacijų\n" "Numatytasis paieškos kelias:%s\n" "\n" "Informacijos išvedimas:\n" " -h, --help parodyti šį pagalbos pranešimą ir išeiti\n" " -V, --version parodyti versijos informaciją ir išeiti\n" "\n" "Argumentai, jei jie nėra parinktys, interpretuojami kaip vykdytinos " "sintaksės rinkmenos.\n" #: src/ui/gui/find-dialog.c:197 msgid "Find" msgstr "Ieškoti" #: src/ui/gui/find-dialog.c:662 #, c-format msgid "Bad regular expression: %s" msgstr "Netinkama reguliarioji išraiška: %s" #: src/ui/gui/help-menu.c:70 msgid "A program for the analysis of sampled data" msgstr "Programa imties duomenų analizavimui" #. TRANSLATORS: Do not translate this string. Instead, put the names of the people #. who have helped in the translation. #: src/ui/gui/help-menu.c:80 msgid "translator-credits" msgstr "Mindaugas Baranauskas , 2010-2014" #: src/ui/gui/help-menu.c:170 #, c-format msgid "Help path conversion error: %s" msgstr "Žinyno kelio konvertavimo klaida: %s" #: src/ui/gui/help-menu.c:197 #, fuzzy, c-format #| msgid "" #| "Cannot open reference manual via yelp: %s. Cannot open via html: %s with " #| "uri: %s The PSSP manual is also available at %s" msgid "" "Cannot open via html: %s with uri: %s The PSSP manual is also available at %s" msgstr "" "Nepavyksta atverti žinyno: %s. Nepavyksta atverti kaip html: %s %s. PSPP " "žinyną taip pat galite rasti %s" #: src/ui/gui/help-menu.c:218 msgid "_Help" msgstr "_Pagalba" #: src/ui/gui/help-menu.c:221 msgid "_About" msgstr "_Apie" #: src/ui/gui/help-menu.c:222 msgid "_Reference Manual" msgstr "Ž_inynas" #: src/ui/gui/main.c:306 msgid "Show version information and exit" msgstr "Parodyti versiją ir išeiti" #: src/ui/gui/main.c:409 msgid "Do not display the splash screen" msgstr "Nerodyti pasveikinimo lango" #: src/ui/gui/main.c:411 msgid "Do not attempt single instance negotiation" msgstr "" #: src/ui/gui/missing-val-dialog.c:217 msgid "" "The maximum length of a missing value for a string variable is 8 in UTF-8." msgstr "" "UTF-8 leidžia praleistoms reikšmėms naudoti tekstą, kurio ilgis iki 8 ženklų." #: src/ui/gui/missing-val-dialog.c:268 msgid "At least one value must be specified" msgstr "Turi būti nurodyta bent viena reikšmė." #: src/ui/gui/missing-val-dialog.c:298 msgid "Incorrect range specification" msgstr "Klaidinga srities specifikacija" #: src/ui/gui/psppire-data-editor.c:380 #, c-format msgid "%d : %s" msgstr "%d : %s" #: src/ui/gui/psppire-data-editor.c:391 #, c-format msgid "%'d case" msgid_plural "%'d cases" msgstr[0] "%'d atvejis" msgstr[1] "%'d atvejis" msgstr[2] "%'d atvejai" msgstr[3] "%'d atvejų" #: src/ui/gui/psppire-data-editor.c:396 #, c-format msgid "%'d variable" msgid_plural "%'d variables" msgstr[0] "%'d kintamasis" msgstr[1] "%'d kintamasis" msgstr[2] "%'d kintamieji" msgstr[3] "%'d kintamųjų" #: src/ui/gui/psppire-data-editor.c:485 msgid "Case" msgstr "Atvejis" #: src/ui/gui/psppire-data-editor.c:495 msgid "Data View" msgstr "Duomenų rodinys" #: src/ui/gui/psppire-data-editor.c:505 msgid "Variable View" msgstr "Kintamųjų rodinys" #: src/ui/gui/psppire-data-sheet.c:171 src/ui/gui/psppire-data-window.c:1338 msgid "_Insert Case" msgstr "Įterpti _atvejį" #: src/ui/gui/psppire-data-sheet.c:179 src/ui/gui/psppire-data-window.c:1391 msgid "Cl_ear Cases" msgstr "Išva_lyti atvejus" #: src/ui/gui/psppire-data-sheet.c:305 src/ui/gui/psppire-data-window.c:1337 #: src/ui/gui/psppire-variable-sheet.c:274 msgid "_Insert Variable" msgstr "Į_terpti kintamąjį" #: src/ui/gui/psppire-data-sheet.c:314 src/ui/gui/psppire-variable-sheet.c:283 msgid "Cl_ear Variables" msgstr "Iš_valyti kintamuosius" #: src/ui/gui/psppire-data-sheet.c:326 msgid "Sort _Ascending" msgstr "Rikiuoti _didėjančia tvarka" #: src/ui/gui/psppire-data-sheet.c:333 msgid "Sort _Descending" msgstr "Rikiuoti _mažėjančia tvarka" #: src/ui/gui/psppire-data-window.c:175 msgid "Transformations Pending" msgstr "Laukiama transformacijos" #: src/ui/gui/psppire-data-window.c:191 msgid "Filter off" msgstr "Nefiltr." #: src/ui/gui/psppire-data-window.c:203 #, c-format msgid "Filter by %s" msgstr "Filtr. pg. %s" #: src/ui/gui/psppire-data-window.c:224 msgid "No Split" msgstr "Neskaidoma" #: src/ui/gui/psppire-data-window.c:233 msgid "Split by " msgstr "Skaid. pg. " #: src/ui/gui/psppire-data-window.c:261 msgid "Weights off" msgstr "Nesveriama" #: src/ui/gui/psppire-data-window.c:273 #, c-format msgid "Weight by %s" msgstr "Sverti pagal %s" #: src/ui/gui/psppire-data-window.c:518 #: src/ui/gui/psppire-import-assistant.c:681 #: src/ui/gui/psppire-syntax-window.c:607 src/ui/gui/psppire-window.c:669 msgid "All Files" msgstr "Visos rinkmenos" #: src/ui/gui/psppire-data-window.c:535 msgid "System File" msgstr "Sisteminė rinkmena" #: src/ui/gui/psppire-data-window.c:542 msgid "Compressed System File" msgstr "Suglaudinta sisteminė rinkmena" #: src/ui/gui/psppire-data-window.c:548 msgid "Portable File" msgstr "Perkeliama rinkmena" #: src/ui/gui/psppire-data-window.c:551 msgid "Format:" msgstr "Formatas:" #: src/ui/gui/psppire-data-window.c:615 msgid "Delete Existing Dataset?" msgstr "Pašalinti esamą duomenų rinkinį?" #: src/ui/gui/psppire-data-window.c:619 #, c-format msgid "" "Renaming \"%s\" to \"%s\" will destroy the existing dataset named \"%s\". " "Are you sure that you want to do this?" msgstr "" "„%s“ pervadinant į „%s“, bus pašalintas esamas duomenų rinkinys vardu „%s“. " "Tikrai tęsti?" #: src/ui/gui/psppire-data-window.c:625 msgid "Delete" msgstr "Pašalinti" #: src/ui/gui/psppire-data-window.c:647 #, c-format msgid "Please enter a new name for dataset \"%s\":" msgstr "Duomenų rinkiniui „%s“ suteikite kitą vardą:" #: src/ui/gui/psppire-data-window.c:649 msgid "Rename Dataset" msgstr "Duomenų rinkinio pervadinimas" #: src/ui/gui/psppire-data-window.c:1199 src/ui/gui/output-window.ui:68 #: src/ui/gui/syntax-editor.ui:22 msgid "_File" msgstr "_Rinkmena" #: src/ui/gui/psppire-data-window.c:1203 src/ui/gui/syntax-editor.ui:25 msgid "_New" msgstr "_Nauja" #: src/ui/gui/psppire-data-window.c:1210 msgid "_Syntax" msgstr "_Sintaksė" #: src/ui/gui/psppire-data-window.c:1213 src/ui/gui/data-editor.ui:177 #: src/ui/gui/data-editor.ui:189 msgid "_Data" msgstr "_Duomenys" #: src/ui/gui/psppire-data-window.c:1220 src/ui/gui/syntax-editor.ui:36 msgid "_Open" msgstr "_Atverti" #: src/ui/gui/psppire-data-window.c:1223 msgid "_Import Data..." msgstr "I_mportuoti duomenis..." #: src/ui/gui/psppire-data-window.c:1231 src/ui/gui/logistic.ui:261 #: src/ui/gui/regression.ui:66 msgid "_Save..." msgstr "Į_rašyti..." #: src/ui/gui/psppire-data-window.c:1234 msgid "Save _As..." msgstr "Įrašyti _kaip..." #: src/ui/gui/psppire-data-window.c:1237 msgid "_Rename Dataset..." msgstr "_Pervadinti duomenų rinkinį..." #: src/ui/gui/psppire-data-window.c:1248 msgid "_Display Data File Information" msgstr "Rodyti duomenų rinkmenos _informaciją" #: src/ui/gui/psppire-data-window.c:1255 msgid "Working File" msgstr "apie veikiamąją rinkmeną" #: src/ui/gui/psppire-data-window.c:1257 msgid "_External File..." msgstr "apie išorinę rinkmeną..." #: src/ui/gui/psppire-data-window.c:1267 msgid "_Recently Used Data" msgstr "Paskiausi _duomenys" #: src/ui/gui/psppire-data-window.c:1268 msgid "Recently Used _Files" msgstr "Paskiausios _rinkmenos" #: src/ui/gui/psppire-data-window.c:1315 src/ui/gui/output-window.ui:82 #: src/ui/gui/syntax-editor.ui:59 msgid "_Quit" msgstr "_Baigti" #: src/ui/gui/psppire-data-window.c:1333 src/ui/gui/output-window.ui:89 #: src/ui/gui/syntax-editor.ui:66 msgid "_Edit" msgstr "_Taisa" #: src/ui/gui/psppire-data-window.c:1339 msgid "_Go To Variable..." msgstr "P_ereiti prie kintamojo..." #: src/ui/gui/psppire-data-window.c:1340 msgid "_Go To Case..." msgstr "Pe_reiti prie atvejo..." #: src/ui/gui/psppire-data-window.c:1364 src/ui/gui/syntax-editor.ui:69 msgid "Cu_t" msgstr "_Iškirpti" #: src/ui/gui/psppire-data-window.c:1373 src/ui/gui/output-window.ui:96 #: src/ui/gui/syntax-editor.ui:74 msgid "_Copy" msgstr "_Kopijuoti" #: src/ui/gui/psppire-data-window.c:1380 src/ui/gui/syntax-editor.ui:79 msgid "_Paste" msgstr "Į_dėti" #: src/ui/gui/psppire-data-window.c:1387 msgid "Clear _Variables" msgstr "Iš_valyti kintamuosius" #: src/ui/gui/psppire-data-window.c:1401 msgid "_Find..." msgstr "_Ieškoti..." #: src/ui/gui/psppire-data-window.c:1407 src/ui/gui/logistic.ui:246 msgid "_Options..." msgstr "_Parinktys..." #: src/ui/gui/psppire-data-window.c:1676 msgid "Jump to variable" msgstr "Šokti į kintamąjį" #: src/ui/gui/psppire-data-window.c:1689 msgid "Jump to a case in the data sheet" msgstr "Šokti į atvejį duomenų lakšte" #: src/ui/gui/psppire-data-window.c:1703 msgid "Search for values in the data" msgstr "Ieškoti reikšmės duomenų rinkinyje" #: src/ui/gui/psppire-data-window.c:1715 msgid "Create a new case at the current position" msgstr "Sukurti naują atvejį šioje vietoje" #: src/ui/gui/psppire-data-window.c:1727 msgid "Create a new variable at the current position" msgstr "Sukurti naują kintamąjį šioje vietoje" #: src/ui/gui/psppire-data-window.c:1741 msgid "Split the active dataset" msgstr "Skaidyti veikiamąjį duomenų rinkinį" #: src/ui/gui/psppire-data-window.c:1753 msgid "Weight cases by variable" msgstr "Atvejus sverti pagal kintamąjį" #: src/ui/gui/psppire-data-window.c:1764 msgid "Show/hide value labels" msgstr "Rodyti / slėpti reikšmių etiketes" #: src/ui/gui/psppire-data-window.c:1904 msgid "Data Editor" msgstr "duomenų redaktorius" #: src/ui/gui/psppire-encoding-selector.c:140 msgid "Automatically Detect" msgstr "Aptikti automatiškai" #: src/ui/gui/psppire-encoding-selector.c:147 msgid "Locale Encoding" msgstr "Lokalės koduotė" #: src/ui/gui/psppire-encoding-selector.c:177 msgid "Character Encoding: " msgstr "Ženklų kodavimas: " #: src/ui/gui/psppire-import-assistant.c:337 msgid "line" msgstr "eilutė" #: src/ui/gui/psppire-import-assistant.c:347 msgid "var" msgstr "kint" #: src/ui/gui/psppire-import-assistant.c:560 msgid "Importing Spreadsheet Data" msgstr "Duomenų importavimas iš skaičialentės" #: src/ui/gui/psppire-import-assistant.c:686 msgid "Text Files" msgstr "Tekstinės rinkmenos" #: src/ui/gui/psppire-import-assistant.c:691 msgid "Text (*.txt) Files" msgstr "Tekstinės (*.txt) rinkmenos" #: src/ui/gui/psppire-import-assistant.c:697 msgid "Plain Text (ASCII) Files" msgstr "Grynojo teksto (ASCII) rinkmenos" #: src/ui/gui/psppire-import-assistant.c:702 msgid "Comma Separated Value Files" msgstr "Kableliais atskirtų reikšmių rinkmenos" #: src/ui/gui/psppire-import-assistant.c:709 msgid "Tab Separated Value Files" msgstr "Tabuliavimo žyme atskirtų reikšmių rinkmenos" #: src/ui/gui/psppire-import-assistant.c:714 msgid "Gnumeric Spreadsheet Files" msgstr "Gnumeric skaičialenčių rinkmenos" #: src/ui/gui/psppire-import-assistant.c:719 msgid "OpenDocument Spreadsheet Files" msgstr "OpenDocument skaičialenčių rinkmenos" #: src/ui/gui/psppire-import-assistant.c:724 msgid "All Spreadsheet Files" msgstr "Visos skaičialenčių rinkmenos" #: src/ui/gui/psppire-import-assistant.c:733 msgid "Select File to Import" msgstr "Pasirinkite importuotiną rinkmeną" #: src/ui/gui/psppire-import-assistant.c:770 msgid "Importing Delimited Text Data" msgstr "Bet kokių tekstinių duomenų importavimas" #: src/ui/gui/psppire-import-assistant.c:865 msgid "Select the First Line" msgstr "Pasirinkite pirmąją eilutę" #: src/ui/gui/psppire-import-assistant.c:877 msgid "Line" msgstr "Eilutė" #: src/ui/gui/psppire-import-assistant.c:931 msgid "" "This assistant will guide you through the process of importing data into " "PSPP from a text file with one line per case, in which fields are separated " "by tabs, commas, or other delimiters.\n" "\n" msgstr "" "Šis vediklis padės į PSPP importuoti duomenis iš tekstinės rinkmenos, " "kurioje viena eilutė atitinka vieną atvejį, o laukai (būsimi kintamieji) " "atskirtitabuliacija, kableliu ar kitu pasirinktu simboliu.\n" "\n" #: src/ui/gui/psppire-import-assistant.c:941 #, c-format msgid "The selected file contains %'lu line of text. " msgid_plural "The selected file contains %'lu lines of text. " msgstr[0] "Pasirinkta rinkmena turi %'lu eilutę teksto. " msgstr[1] "Pasirinkta rinkmena turi %'lu eilutę teksto. " msgstr[2] "Pasirinkta rinkmena turi %'lu eilutes teksto. " msgstr[3] "Pasirinkta rinkmena turi %'lu eilučių teksto. " #: src/ui/gui/psppire-import-assistant.c:950 #, c-format msgid "The selected file contains approximately %'lu line of text. " msgid_plural "The selected file contains approximately %'lu lines of text. " msgstr[0] "Pasirinkta rinkmena turi maždaug %'lu eilutę teksto. " msgstr[1] "Pasirinkta rinkmena turi maždaug %'lu eilutę teksto. " msgstr[2] "Pasirinkta rinkmena turi maždaug %'lu eilutes teksto. " msgstr[3] "Pasirinkta rinkmena turi maždaug %'lu eilučių teksto. " #: src/ui/gui/psppire-import-assistant.c:956 #, c-format msgid "" "Only the first %zu line of the file will be shown for preview purposes in " "the following screens. " msgid_plural "" "Only the first %zu lines of the file will be shown for preview purposes in " "the following screens. " msgstr[0] "Sekančiame lange galėsite peržiūrėti tik pirmąją %zu eilutę." msgstr[1] "Sekančiame lange galėsite peržiūrėti tik pirmąsias %zu eilutes. " msgstr[2] "Sekančiame lange galėsite peržiūrėti tik pirmąsias %zu eilutes. " msgstr[3] "Sekančiame lange galėsite peržiūrėti tik pirmąsias %zu eilučių. " #: src/ui/gui/psppire-import-assistant.c:965 msgid "You may choose below how much of the file should actually be imported." msgstr "Žemiau galite nurodyti, kiek importuoti rinkmenos duomenų." #: src/ui/gui/psppire-import-assistant.c:974 #, c-format msgid "Only the first %4d cases" msgstr "Tik pirmuosius %4d" #: src/ui/gui/psppire-import-assistant.c:985 #, c-format msgid "Only the first %3d %% of file (approximately)" msgstr "Tik %3d %% rinkmenos nuo pradžių (apytiksliai)" #: src/ui/gui/psppire-import-assistant.c:1009 msgid "Select the Lines to Import" msgstr "Pasirinkite importuotinas eilutes" #: src/ui/gui/psppire-import-assistant.c:1151 msgid "Choose Separators" msgstr "Pasirinkite skirtukus" #: src/ui/gui/psppire-import-assistant.c:1438 msgid "Adjust Variable Formats" msgstr "Priderinkite kintamųjų formatus" #: src/ui/gui/psppire-output-view.c:410 msgid "Message" msgstr "Pranešimas" #: src/ui/gui/psppire-output-view.c:543 msgid "failed to create temporary directory during clipboard operation" msgstr "iškarpinės veiksmui nepavyko sukurti laikinojo aplanko" #: src/ui/gui/psppire-output-window.c:241 msgid "Infer file type from extension" msgstr "rinkmenos tipą nuspėti pagal prievardį" #: src/ui/gui/psppire-output-window.c:242 msgid "SPSS Viewer (*.spv)" msgstr "SPSS žiūryklė (*.spv)" #: src/ui/gui/psppire-output-window.c:243 msgid "PDF (*.pdf)" msgstr "PDF (*.pdf)" #: src/ui/gui/psppire-output-window.c:244 msgid "HTML (*.html)" msgstr "HTML (*.html)" #: src/ui/gui/psppire-output-window.c:245 msgid "OpenDocument (*.odt)" msgstr "OpenDocument (*.odt)" #: src/ui/gui/psppire-output-window.c:246 msgid "Text (*.txt)" msgstr "tekstinės rinkmenos (*.txt)" #: src/ui/gui/psppire-output-window.c:247 msgid "Text [plain] (*.txt)" msgstr "grynojo teksto rinkmenos (*.txt)" #: src/ui/gui/psppire-output-window.c:248 msgid "PostScript (*.ps)" msgstr "postskriptinės rinkmenos (*.ps)" #: src/ui/gui/psppire-output-window.c:249 msgid "Comma-Separated Values (*.csv)" msgstr "Kableliais atskirtų reikšmių rinkmena (*.csv)" #: src/ui/gui/psppire-output-window.c:350 msgid "Export Output" msgstr "Eksportuoti rezultatus" #: src/ui/gui/psppire-output-window.c:548 msgid "Output Viewer" msgstr "rezultatų peržiūra" #: src/ui/gui/psppire-spreadsheet-model.c:237 msgid "(empty)" msgstr "(tuščia)" #: src/ui/gui/psppire-syntax-window.c:226 msgid "Text Search" msgstr "Teksto paieška" #: src/ui/gui/psppire-syntax-window.c:229 msgid "_OK" msgstr "_Gerai" #: src/ui/gui/psppire-syntax-window.c:231 msgid "_Cancel" msgstr "_Atsisakyti" #: src/ui/gui/psppire-syntax-window.c:239 msgid "Text to search for:" msgstr "Ieškomas tekstas:" #: src/ui/gui/psppire-syntax-window.c:570 #, c-format msgid "Saved file `%s'" msgstr "Rinkmena „%s“ įrašyta" #: src/ui/gui/psppire-syntax-window.c:591 msgid "Save Syntax" msgstr "Įrašyti sintaksę" #: src/ui/gui/psppire-syntax-window.c:601 src/ui/gui/psppire-window.c:657 msgid "Syntax Files (*.sps) " msgstr "sintaksės rinkmenos (*.sps)" #: src/ui/gui/psppire-syntax-window.c:970 msgid "Syntax Editor" msgstr "sintaksės redaktorius" #: src/ui/gui/psppire-syntax-window.c:990 #, c-format msgid "Cannot load syntax file `%s'" msgstr "Nepavyksta įkelti sintaksės rinkmenos „%s“" #: src/ui/gui/psppire-variable-sheet.c:412 #, c-format msgid "{%s, %s}..." msgstr "{%s, %s}..." #: src/ui/gui/psppire-var-sheet-header.c:64 msgid "Decimal" msgstr "10-tainė skiltis" #: src/ui/gui/psppire-var-sheet-header.c:79 msgid "Align" msgstr "Lygiuotė" #: src/ui/gui/psppire-var-sheet-header.c:82 msgid "Measure" msgstr "Matavimo skalė" #: src/ui/gui/psppire-window.c:430 #, c-format msgid "Save the changes to `%s' before closing?" msgstr "Prieš užveriant įrašyti pakeitimus į „%s“?" #: src/ui/gui/psppire-window.c:437 #, c-format msgid "" "If you don't save, changes from the last %ld seconds will be permanently " "lost." msgstr "" "Jei neįrašysite, visiškai prarasite pakeitimus, kuriuos atlikote per " "pastarąsias %ld sekundes." #: src/ui/gui/psppire-window.c:441 msgid "Close _without saving" msgstr "Užverti _neįrašant" #: src/ui/gui/psppire-window.c:625 src/ui/gui/psppire-window.c:629 msgid "Open" msgstr "Atverti" #: src/ui/gui/psppire-window.c:634 msgid "Data and Syntax Files" msgstr "Duomenų ir sintaksės rinkmenos" #: src/ui/gui/psppire-window.c:646 msgid "System Files (*.sav, *.zsav)" msgstr "Sisteminės rinkmenos (*.sav, *.zsav)" #: src/ui/gui/psppire-window.c:663 msgid "Output Files (*.spv) " msgstr "išvedimo rinkmenos (*.spv) " #: src/ui/gui/t-test-options.c:65 #, c-format msgid "Con_fidence Interval: %2d %%" msgstr "_Pasikliovimo intervalas: %2d %%" #: src/ui/gui/val-labs-dialog.c:591 #, c-format msgid "%s = `%s'" msgstr "%s = „%s“" #: src/ui/gui/var-type-dialog.c:541 #, fuzzy #| msgid "Variable and Name" msgid "Variable Type and Format" msgstr "Kintamasis ir vardas" #: src/ui/gui/windows-menu.c:92 msgid "_Minimize all Windows" msgstr "_Suskleisti visus langus" #: src/ui/gui/windows-menu.c:100 msgid "_Split" msgstr "_Skaidyti" #: src/ui/gui/windows-menu.c:132 msgid "_Windows" msgstr "_Langas" #: utilities/pspp-convert.c:67 #, c-format msgid "%s argument must be a single character" msgstr "%s argumentas turi būti vienas simbolis" #: utilities/pspp-convert.c:265 msgid "exactly two non-option arguments are required; use --help for help" msgstr "" "būtinai reikia dviejų argumentų, kurie nebūtų parinktys; daugiau " "informacijos užklausus --help" #: utilities/pspp-convert.c:276 #, c-format msgid "%s: cannot guess output format (use -O option)" msgstr "%s: nepavyksta nuspėti išvedimo formato (naudokite parinktį -O)" #: utilities/pspp-convert.c:341 #, c-format msgid "%s: unknown output format (use -O option)" msgstr "%s: nežinomas išvedimo formatas (naudokite parinktį -O)" #: utilities/pspp-convert.c:360 #, c-format msgid "%s: error reading input file" msgstr "%s: klaida skaitant iš rinkmenos" #: utilities/pspp-convert.c:362 #, c-format msgid "%s: error writing output file" msgstr "%s: klaida rašant į rinkmeną" #: utilities/pspp-convert.c:409 #, c-format msgid "%s: error opening password file" msgstr "%s: klaida bandant atverti slaptažodžio rinkmeną" #: utilities/pspp-convert.c:425 #, c-format msgid "" "\n" "%s: password not in file" msgstr "" "\n" "%s: slaptažodis ne rinkmenoje" #: utilities/pspp-convert.c:462 #, c-format msgid "%s: '%c' is not in alphabet" msgstr "%s: abėcėlėje nėra „%c“" #: utilities/pspp-convert.c:526 msgid "sorry, wrong password" msgstr "atleiskite, neteisingas slaptažodis" #: utilities/pspp-output.c:92 #, c-format msgid "%s and %s:" msgstr "%s ir %s:" #: utilities/pspp-output.c:547 #, c-format msgid "%s: invalid XPath expression" msgstr "%s: netinkamas XPath reiškinys" #: utilities/pspp-output.c:716 msgid "missing command name (use --help for help)" msgstr "trūksta komandos vardo (pagalbai naudokite --help)" #: utilities/pspp-output.c:720 #, c-format msgid "unknown command \"%s\" (use --help for help)" msgstr "nežinoma komanda „%s“ (pagalbai naudokite --help)" #: utilities/pspp-output.c:728 #, fuzzy, c-format #| msgid "\"%s\" command takes exactly %d argument%s" msgid "\"%s\" command takes exactly %d argument" msgid_plural "\"%s\" command takes exactly %d arguments" msgstr[0] "„%s“ komandai reikia lygiai %d argumentų %s" msgstr[1] "„%s“ komandai reikia lygiai %d argumentų %s" msgstr[2] "„%s“ komandai reikia lygiai %d argumentų %s" msgstr[3] "„%s“ komandai reikia lygiai %d argumentų %s" #: utilities/pspp-output.c:735 #, fuzzy, c-format #| msgid "\"%s\" command requires at least %d argument%s" msgid "\"%s\" command requires at least %d argument" msgid_plural "\"%s\" command requires at least %d arguments" msgstr[0] "„%s“ komandai reikia bent %d argumentų %s." msgstr[1] "„%s“ komandai reikia bent %d argumentų %s." msgstr[2] "„%s“ komandai reikia bent %d argumentų %s." msgstr[3] "„%s“ komandai reikia bent %d argumentų %s." #: utilities/pspp-output.c:742 #, c-format msgid "\"%s\" command requires between %d and %d arguments" msgstr "„%s“ komandai reikia nuo %d iki %d argumentų" #: utilities/pspp-output.c:782 msgid "The following object classes are supported:" msgstr "Palaikomos šios objektų klasės:" #: utilities/pspp-output.c:791 #, c-format msgid "%s: unknown object class (use --select=help for help" msgstr "" "%s: nežinoma objekto klasė (norėdami gauti pagalbą, naudokite --select=help" #: src/language/utilities/set.q:162 #, c-format msgid "%s must be between 0 and 20." msgstr "%s turi būti intervale tarp 0 ir 20." #: src/language/utilities/set.q:172 src/language/utilities/set.q:179 #, c-format msgid "%s must be at least 1." msgstr "%s turi būti bent 1." #: src/language/utilities/set.q:205 #, c-format msgid "%s must be at least 1MB" msgstr "%s turi būti bent 1MB." #: src/language/utilities/set.q:207 #, c-format msgid "%s must be positive" msgstr "%s turi būti teigiamas" #: src/language/utilities/set.q:213 src/language/utilities/set.q:215 #: src/language/utilities/set.q:217 src/language/utilities/set.q:219 #: src/language/utilities/set.q:221 src/language/utilities/set.q:223 #: src/language/utilities/set.q:225 src/language/utilities/set.q:227 #: src/language/utilities/set.q:229 src/language/utilities/set.q:231 #: src/language/utilities/set.q:233 #, c-format msgid "%s is obsolete." msgstr "%s yra pasenęs." #: src/language/utilities/set.q:239 msgid "Active file compression is not implemented." msgstr "Veikiamosios rinkmenos glaudinimas dar nerealizuotas." #: src/language/utilities/set.q:403 #, c-format msgid "%s must be 1500 or later." msgstr "%s turi būti 1500 arba didesnis." #: src/language/utilities/set.q:410 #, c-format msgid "expecting %s or year" msgstr "tikėtasi %s arba metų" #: src/language/utilities/set.q:438 src/language/utilities/set.q:535 #, c-format msgid "%s must be at least %d." msgstr "%s turi būti bent %d." #: src/language/utilities/set.q:474 #, c-format msgid "%s is not a recognized encoding or locale name" msgstr "%s neatpažinta kaip koduotė ar lokalė" #: src/language/utilities/set.q:562 #, c-format msgid "" "%s requires numeric output format as an argument. Specified format %s is of " "type string." msgstr "" "%s reikalauja skaitmeninio išvedimo formato kaip argumento. Nurodytas " "formato %s tipas yra teksto eilutė." #: src/language/utilities/set.q:791 msgid "ISL (32-bit IEEE 754 single, little-endian)" msgstr "ISL (32 bitų IEEE 754 viengubas, didėjantys baitai)" #: src/language/utilities/set.q:794 msgid "ISB (32-bit IEEE 754 single, big-endian)" msgstr "ISB (32 bitų IEEE 754 viengubas, mažėjantys baitai)" #: src/language/utilities/set.q:797 msgid "IDL (64-bit IEEE 754 double, little-endian)" msgstr "IDL (64 bitų IEEE 754 dvigubas, didėjantys baitai)" #: src/language/utilities/set.q:800 msgid "IDB (64-bit IEEE 754 double, big-endian)" msgstr "IDB (64 bitų IEEE 754 dvigubas, mažėjantys baitai)" #: src/language/utilities/set.q:804 msgid "VF (32-bit VAX F, VAX-endian)" msgstr "VF (32 bitų VAX F, VAX baitų eiliškumas)" #: src/language/utilities/set.q:807 msgid "VD (64-bit VAX D, VAX-endian)" msgstr "VD (64 bitų VAX D, VAX baitų eiliškumas)" #: src/language/utilities/set.q:810 msgid "VG (64-bit VAX G, VAX-endian)" msgstr "VG (64 bitų VAX G, VAX baitų eiliškumas)" #: src/language/utilities/set.q:814 msgid "ZS (32-bit IBM Z hexadecimal short, big-endian)" msgstr "ZS (32 bitų IBM Z šešioliktainis trumpasis, mažėjantys baitai)" #: src/language/utilities/set.q:817 msgid "ZL (64-bit IBM Z hexadecimal long, big-endian)" msgstr "ZL (64 bitų IBM Z šešioliktainis ilgasis, mažėjantys baitai)" #: src/language/utilities/set.q:985 #, c-format msgid "%s is %s." msgstr "%s yra %s." #: src/language/utilities/set.q:1089 #, c-format msgid "" "Too many %s commands without a %s: at most %d levels of saved settings are " "allowed." msgstr "" "Per daug %s komandų neturi %s: įrašomos nuostatos gali turėti iki %d lygių." #: src/language/utilities/set.q:1109 #, c-format msgid "%s without matching %s." msgstr "%s be atitinkamo %s." #: src/language/stats/crosstabs.q:327 #, c-format msgid "Missing mode %s not allowed in general mode. Assuming %s." msgstr "" #: src/language/stats/crosstabs.q:444 msgid "Too many cross-tabulation variables or dimensions." msgstr "Požymių dažnių lentelėms yra per daug kintamųjų arba dimensijų." #: src/language/stats/crosstabs.q:509 #, c-format msgid "%s must be specified before %s." msgstr "%s turi būti nurodytas pirmiau nei %s." #: src/language/stats/crosstabs.q:543 #, c-format msgid "Maximum value (%ld) less than minimum value (%ld)." msgstr "Didžiausia reikšmė (%ld) yra mažesnė mažiausiąją (%ld)." #: src/language/stats/crosstabs.q:922 msgid "Summary" msgstr "Santrauka" #: src/language/stats/crosstabs.q:935 msgid "Crosstabulation" msgstr "Požymių priklausomumo lentelės" #. TRANSLATORS: The %s here describes a crosstabulation. It takes the #. form "var1 * var2 * var3 * ...". #: src/language/stats/crosstabs.q:1013 #, c-format msgid "Crosstabulation %s contained no non-missing cases." msgstr "" "Požymių priklausomumo lentelėje „%s“ visi atvejai turi praleistas reikšmes." #: src/language/stats/crosstabs.q:1204 msgid "Missing value" msgstr "Praleista reikšmė" #: src/language/stats/crosstabs.q:1263 msgid "Row %" msgstr "% eilutėje" #: src/language/stats/crosstabs.q:1264 msgid "Column %" msgstr "% stulpelyje" #: src/language/stats/crosstabs.q:1265 msgid "Total %" msgstr "% iš visų" #: src/language/stats/crosstabs.q:1269 msgid "Adjusted Residual" msgstr "Patikslinta liekana" #: src/language/stats/crosstabs.q:1288 msgid "Chi-Square Tests" msgstr "Chi kvadrato kriterijus" #: src/language/stats/crosstabs.q:1294 msgid "Pearson Chi-Square" msgstr "Pirsono chi kvadratas" #: src/language/stats/crosstabs.q:1295 msgid "Likelihood Ratio" msgstr "Tikėtinumo santykis" #: src/language/stats/crosstabs.q:1296 msgid "Fisher's Exact Test" msgstr "Tikslus Fišerio kriterijus" #: src/language/stats/crosstabs.q:1297 msgid "Continuity Correction" msgstr "Tolydumo pataisa" #: src/language/stats/crosstabs.q:1298 msgid "Linear-by-Linear Association" msgstr "Dvitiesinė priklausomybė" #: src/language/stats/crosstabs.q:1299 src/language/stats/crosstabs.q:1345 #: src/language/stats/crosstabs.q:1854 msgid "N of Valid Cases" msgstr "N galiojančių atvejų" #: src/language/stats/crosstabs.q:1305 msgid "Asymptotic Sig. (2-tailed)" msgstr "Asimpt. p reikšmė (2-pusė)" #: src/language/stats/crosstabs.q:1319 msgid "Symmetric Measures" msgstr "Simetriniai matavimai" #: src/language/stats/crosstabs.q:1324 src/language/stats/crosstabs.q:1364 #: src/language/stats/crosstabs.q:1411 msgid "Values" msgstr "Reikšmės" #: src/language/stats/crosstabs.q:1326 src/language/stats/crosstabs.q:1413 msgid "Asymp. Std. Error" msgstr "Asimpt. st. paklaida" #: src/language/stats/crosstabs.q:1327 src/language/stats/crosstabs.q:1414 msgid "Approx. T" msgstr "Apytiksl. T" #: src/language/stats/crosstabs.q:1328 src/language/stats/crosstabs.q:1415 msgid "Approx. Sig." msgstr "Apytiksl. p reikšmė" #: src/language/stats/crosstabs.q:1333 src/language/stats/crosstabs.q:1420 msgid "Nominal by Nominal" msgstr "Pavadinimų x pavadinimų" #: src/language/stats/crosstabs.q:1334 msgid "Cramer's V" msgstr "Kramerio V" #: src/language/stats/crosstabs.q:1334 msgid "Contingency Coefficient" msgstr "Kontingencijos koeficientas" #: src/language/stats/crosstabs.q:1336 src/language/stats/crosstabs.q:1425 msgid "Ordinal by Ordinal" msgstr "Rangų x rangų" #: src/language/stats/crosstabs.q:1337 msgid "Kendall's tau-b" msgstr "Kendalo tau-b" #: src/language/stats/crosstabs.q:1337 msgid "Kendall's tau-c" msgstr "Kendalo tau-c" #: src/language/stats/crosstabs.q:1338 msgid "Spearman Correlation" msgstr "Spirmeno koreliacija" #: src/language/stats/crosstabs.q:1340 msgid "Interval by Interval" msgstr "Intervalų x intervalų" #: src/language/stats/crosstabs.q:1341 msgid "Pearson's R" msgstr "Pirsono R" #: src/language/stats/crosstabs.q:1343 msgid "Measure of Agreement" msgstr "Sutarimas" #: src/language/stats/crosstabs.q:1359 msgid "Risk Estimate" msgstr "Rizikos įvertinimas" #: src/language/stats/crosstabs.q:1368 #, fuzzy, no-c-format #| msgid "95%% Confidence Interval" msgid "95% Confidence Interval" msgstr "95%% pasikliovimo intervalas" #: src/language/stats/crosstabs.q:1389 msgid "Symmetric" msgstr "Simetrinis" #: src/language/stats/crosstabs.q:1391 src/language/stats/crosstabs.q:1396 #, c-format msgid "%s Dependent" msgstr "%s (priklausomas)" #: src/language/stats/crosstabs.q:1406 msgid "Directional Measures" msgstr "Kryptingi matavimai" #: src/language/stats/crosstabs.q:1422 msgid "Goodman and Kruskal tau" msgstr "Gudmano-Kruskalio tau" #: src/language/stats/crosstabs.q:1423 msgid "Uncertainty Coefficient" msgstr "Neapibrėžtumo koeficientas" #: src/language/stats/crosstabs.q:1426 msgid "Somers' d" msgstr "Somerso d" #: src/language/stats/crosstabs.q:1428 msgid "Nominal by Interval" msgstr "Pavadinimų x intervalų" #: src/language/stats/crosstabs.q:1826 #, c-format msgid "Odds Ratio for %s" msgstr "Galimybių santykis: %s" #: src/language/stats/crosstabs.q:1835 #, c-format msgid "For cohort %s = " msgstr "Kohortai %s = " #: src/ui/gui/aggregate.ui:24 msgid "Aggregate Data" msgstr "Duomenų agregavimas" #: src/ui/gui/aggregate.ui:126 msgid "_Break variable(s)" msgstr "_Skaidantieji kintamieji" #: src/ui/gui/aggregate.ui:179 msgid "Variable Name: " msgstr "Kint. vardas: " #: src/ui/gui/aggregate.ui:215 msgid "Variable Label: " msgstr "Kint. etiketė: " #: src/ui/gui/aggregate.ui:252 msgid "Function: " msgstr "Funkcija: " #: src/ui/gui/aggregate.ui:327 msgid "Argument 1: " msgstr "1 argumentas: " #: src/ui/gui/aggregate.ui:364 msgid "Argument 2: " msgstr "2 argumentas: " #: src/ui/gui/aggregate.ui:428 msgid "Aggregated variables" msgstr "Agreguoti kintamieji" #: src/ui/gui/aggregate.ui:469 msgid "_Add aggregated variables to the active dataset" msgstr "Agreguotus kintamuosius pridėti prie _veikiamojo duomenų rinkinio" #: src/ui/gui/aggregate.ui:486 msgid "_Replace the current dataset with the aggregated variables" msgstr "Pa_keisti veikiamąjį duomenų rinkinį agreguotaisiais kintamaisiais" #: src/ui/gui/aggregate.ui:504 msgid "_Write a new data file containing only the aggregated variables" msgstr "" "Sukurti _naują duomenų rinkmeną, turinčią tik agreguotuosius kintamuosius" #: src/ui/gui/aggregate.ui:544 msgid "label" msgstr "etiketė" #: src/ui/gui/aggregate.ui:593 msgid "File is _already sorted on break variable(s)" msgstr "" "R_inkmena jau surikiuota pagal skaidantįjį kintamąjį (skaidančiuosius " "kintamuosius)" #: src/ui/gui/aggregate.ui:609 msgid "Sort file before a_ggregating" msgstr "Rikiuoti rinkmeną prieš agr_egavimą" #: src/ui/gui/aggregate.ui:630 msgid "Options for very large datasets" msgstr "Parinktys labai dideliems duomenų rinkiniams" #: src/ui/gui/autorecode.ui:24 msgid "Automatic Recode" msgstr "Automatinis perkodavimas" #: src/ui/gui/autorecode.ui:120 msgid "Variable -> New Name" msgstr "Kintamasis -> Naujas vardas" #: src/ui/gui/autorecode.ui:145 msgid "_Lowest value" msgstr "_Mažiausios reikšmės" #: src/ui/gui/autorecode.ui:163 msgid "_Highest value" msgstr "_Didžiausios reikšmės" #: src/ui/gui/autorecode.ui:185 msgid "Recode starting from" msgstr "Perkodavimą pradėti nuo" #: src/ui/gui/autorecode.ui:204 msgid "_New Name" msgstr "_Naujas vardas" #: src/ui/gui/autorecode.ui:227 msgid "_Add New Name" msgstr "Pri_dėti naują vardą" #: src/ui/gui/autorecode.ui:285 msgid "_Use the same recoding scheme for all variables" msgstr "_Visiems kintamiesiems naudoti tą pačią perkodavimo schemą" #: src/ui/gui/autorecode.ui:301 msgid "Treat _blank string values as missing" msgstr "_Tuščias reikšmes laikyti praleistomis" #: src/ui/gui/binomial.ui:86 msgid "_Test Variable List:" msgstr "_Kriterijaus kintamųjų sąrašas:" #: src/ui/gui/binomial.ui:160 src/ui/gui/chi-square.ui:281 msgid "_Get from data" msgstr "_Imti iš duomenų" #: src/ui/gui/binomial.ui:181 src/ui/gui/indep-samples.ui:150 msgid "_Cut point:" msgstr "_Perskirti ties:" #: src/ui/gui/binomial.ui:225 msgid "Define Dichotomy" msgstr "Perskyrimas" #: src/ui/gui/binomial.ui:245 msgid "Test _Proportion:" msgstr "Kriterijaus proporcija" #: src/ui/gui/compute.ui:32 msgid "Compute Variable: Type and Label" msgstr "Kintamojo apskaičiavimas: tipas ir etiketė" #: src/ui/gui/compute.ui:67 msgid "Use _expression as label" msgstr "R_eiškinį naudoti kaip etiketę" #: src/ui/gui/compute.ui:90 msgid "_Label:" msgstr "_Etiketė:" #: src/ui/gui/compute.ui:194 msgid "_String" msgstr "_Teksto eilutė" #: src/ui/gui/compute.ui:287 msgid "_Numeric" msgstr "_Skaitmeninis" #: src/ui/gui/compute.ui:343 msgid "Compute Variable" msgstr "Kintamojo apskaičiavimas" #: src/ui/gui/compute.ui:381 msgid "Target _Variable:" msgstr "Paskirties _kintamasis:" #: src/ui/gui/compute.ui:412 msgid "_Type & Label..." msgstr "_Tipas ir etiketė" #: src/ui/gui/compute.ui:469 msgid "=" msgstr "=" #: src/ui/gui/compute.ui:526 msgid "_Numeric Expressions:" msgstr "_Skaičiuojamas reiškinys:" #: src/ui/gui/compute.ui:598 msgid "_Functions:" msgstr "_Funkcijos:" #: src/ui/gui/compute.ui:678 msgid "_If..." msgstr "_Jeigu..." #: src/ui/gui/barchart.ui:24 msgid "Barchart" msgstr "Stulpelinė diagrama" #: src/ui/gui/barchart.ui:112 msgid "Category A_xis:" msgstr "Kategorijų a_šis" #: src/ui/gui/barchart.ui:140 msgid "_N of cases" msgstr "Atvejų _skaičius" #: src/ui/gui/barchart.ui:158 msgid "_Cum. n of cases" msgstr "Sukaupt. atvejų skaičius" #: src/ui/gui/barchart.ui:174 msgid "Other _summary function" msgstr "Kita suvestinės _funkcija" #: src/ui/gui/barchart.ui:191 msgid "% of c_ases" msgstr "Atvejų _dalis, %" #: src/ui/gui/barchart.ui:207 msgid "C_um. % of cases" msgstr "S_ukaupt. atvejų, %" #: src/ui/gui/barchart.ui:270 src/ui/gui/histogram.ui:100 msgid "_Variable:" msgstr "_Kintamasis:" #: src/ui/gui/barchart.ui:308 msgid "Bars Represent" msgstr "Stulpeliuose" #: src/ui/gui/barchart.ui:340 msgid "Category C_luster:" msgstr "Kategorijų ša_ltinis:" #: src/ui/gui/correlation.ui:24 msgid "Bivariate Correlations" msgstr "Dviejų kintamųjų koreliacijos" #: src/ui/gui/correlation.ui:148 msgid "Pearso_n" msgstr "Pirso_no" #: src/ui/gui/correlation.ui:164 msgid "_Kendall's tau-b" msgstr "_Kendalo tau-b" #: src/ui/gui/correlation.ui:180 msgid "_Spearman" msgstr "_Spirmeno" #: src/ui/gui/correlation.ui:200 msgid "Correlation Coefficients" msgstr "Koreliacijos koeficientai" #: src/ui/gui/correlation.ui:224 msgid "_Two-tailed" msgstr "_Dvipusis" #: src/ui/gui/correlation.ui:241 msgid "One-tai_led" msgstr "_Vienpusis" #: src/ui/gui/correlation.ui:262 msgid "Test of Significance" msgstr "Reikšmingumo kriterijus" #: src/ui/gui/correlation.ui:275 msgid "_Flag significant correlations" msgstr "_Pažymėti reikšmingas koreliacijas" #: src/ui/gui/count.ui:24 msgid "Count Occurrences of Values within Cases" msgstr "Suskaičiuoti atvejuose pasitaikančias reikšmes" #: src/ui/gui/count.ui:117 msgid "Numeric _Variables:" msgstr "Skaitmeniniai _kintamieji:" #: src/ui/gui/count.ui:147 msgid "_Target Variable:" msgstr "Pa_skirties kintamasis:" #: src/ui/gui/count.ui:178 msgid "Target _Label:" msgstr "Paskirties _etiketė:" #: src/ui/gui/count.ui:192 msgid "_Define Values..." msgstr "Apibrėžti _reikšmes..." #: src/ui/gui/count.ui:257 msgid "Count Values within Cases: Values to Count" msgstr "Suskaičiuoti reikšmes atvejuose: suskaičiuotinos reikšmės" #: src/ui/gui/count.ui:305 msgid "Values _to Count:" msgstr "Suskaičiuotinos reikšmės" #: src/ui/gui/comments.ui:25 msgid "Data File Comments" msgstr "Duomenų rinkmenos komentarai" #: src/ui/gui/comments.ui:49 msgid "Comments:" msgstr "Komentarai:" #: src/ui/gui/comments.ui:106 msgid "Display comments in output" msgstr "Rezultatuose rodyti komentarus" #: src/ui/gui/comments.ui:127 msgid "Column Number: 0" msgstr "Stulpelio numeris: 0" #: src/ui/gui/crosstabs.ui:25 msgid "Crosstabs: Cells" msgstr "Požymių priklausomumo lentelės: langeliai" #: src/ui/gui/crosstabs.ui:67 msgid "Cell Display" msgstr "Rodytini langeliai" #: src/ui/gui/crosstabs.ui:99 msgid "Crosstabs" msgstr "Požymių priklausomumo lentelės" #: src/ui/gui/crosstabs.ui:150 msgid "_Rows" msgstr "_Eilutės" #: src/ui/gui/crosstabs.ui:195 msgid "_Columns" msgstr "Stulpelia_i" #: src/ui/gui/crosstabs.ui:242 msgid "_Format..." msgstr "_Formatas..." #: src/ui/gui/crosstabs.ui:256 src/ui/gui/examine.ui:267 msgid "_Statistics..." msgstr "S_tatistika..." #: src/ui/gui/crosstabs.ui:270 msgid "Ce_lls..." msgstr "_Langeliai..." #: src/ui/gui/crosstabs.ui:348 msgid "Crosstabs: Format" msgstr "Požymių priklausomumo lentelės: formatas" #: src/ui/gui/crosstabs.ui:371 msgid "Print tables" msgstr "Spausdinti lenteles" #: src/ui/gui/crosstabs.ui:387 msgid "Pivot" msgstr "Dinaminės lentelės" #: src/ui/gui/crosstabs.ui:403 src/ui/gui/sort.ui:157 msgid "Ascending" msgstr "Didėjančiai" #: src/ui/gui/crosstabs.ui:455 msgid "Crosstabs: Statistics" msgstr "Požymių priklausomumo lentelės: statistika" #: src/ui/gui/chi-square.ui:30 msgid "Chi-Square Test" msgstr "Chi kvadrato kriterijus" #: src/ui/gui/chi-square.ui:82 msgid "All categor_ies equal" msgstr "_Visose kategorijose po lygiai" #: src/ui/gui/chi-square.ui:103 msgid "_Values" msgstr "_Reikšmės" #: src/ui/gui/chi-square.ui:159 msgid "Expected Values:" msgstr "Tikėtinos reikšmės:" #: src/ui/gui/chi-square.ui:204 msgid "Test _Variables" msgstr "_Kriterijaus kintamieji" #: src/ui/gui/chi-square.ui:298 msgid "Use _specified range" msgstr "Naudoti nurodytą sritį" #: src/ui/gui/chi-square.ui:323 msgid "_Lower:" msgstr "_Apačia:" #: src/ui/gui/chi-square.ui:337 msgid "_Upper:" msgstr "_Viršus:" #: src/ui/gui/chi-square.ui:381 msgid "Expected Range:" msgstr "Tikėtina sritis:" #: src/ui/gui/descriptives.ui:131 src/ui/gui/factor.ui:797 #: src/ui/gui/recode.ui:638 msgid "_Variables:" msgstr "_Kintamieji:" #: src/ui/gui/descriptives.ui:176 msgid "S_tatistics:" msgstr "S_tatistika:" #: src/ui/gui/descriptives.ui:230 msgid "_Exclude entire case if any selected variable is missing" msgstr "" "At_mesti visą atvejį, jei bent viename pasirinktame kintamajame jo reikšmė " "yra praleista" #: src/ui/gui/descriptives.ui:247 msgid "_Include user-missing data in analysis" msgstr "Į analizę įtraukti „_naudotojo praleistus“ duomenis" #: src/ui/gui/descriptives.ui:264 msgid "Save _Z-scores of selected variables as new variables" msgstr "" "Įrašyti pasirinktų kintamųjų standartizuotas _Z įverčius kaip naujus " "kintamuosius" #: src/ui/gui/descriptives.ui:286 msgid "Options:" msgstr "Parinktys:" #: src/ui/gui/examine.ui:25 msgid "Explore" msgstr "Tyrinėti" #: src/ui/gui/examine.ui:69 msgid "_Label Cases by:" msgstr "Atvejams suteikti _etiketes pagal:" #: src/ui/gui/examine.ui:116 msgid "_Factor List:" msgstr "_Faktorių sąrašas:" #: src/ui/gui/examine.ui:163 src/ui/gui/means.ui:126 msgid "_Dependent List:" msgstr "_Priklausomi kintamieji:" #: src/ui/gui/examine.ui:331 msgid "Explore: Options" msgstr "Tyrinėti: parinktys" #: src/ui/gui/examine.ui:355 src/ui/gui/t-test.ui:81 msgid "Exclude cases _listwise" msgstr "Atvejai neįtraukiami _visose analizėse" #: src/ui/gui/examine.ui:373 msgid "Exclude cases _pairwise" msgstr "Atvejai neįtraukiami _porų analizėse" #: src/ui/gui/examine.ui:392 msgid "_Report values" msgstr "_Pateikti reikšmes" #: src/ui/gui/examine.ui:449 msgid "Explore: Statistics" msgstr "Tyrinėti: statistika" #: src/ui/gui/examine.ui:468 src/ui/gui/oneway.ui:576 msgid "_Descriptives" msgstr "_Aprašomoji" #: src/ui/gui/examine.ui:485 msgid "_Extremes" msgstr "_Išskirtys" #: src/ui/gui/examine.ui:502 msgid "_Percentiles" msgstr "_Procentiliai" #: src/ui/gui/goto-case.ui:31 msgid "Goto Case" msgstr "Šokti į atvejį" #: src/ui/gui/goto-case.ui:52 msgid "Goto Case Number:" msgstr "Atvejo, į kurį šoksima, numeris:" #: src/ui/gui/factor.ui:39 msgid "Factor Analysis: Rotation" msgstr "Faktorinė analizė: sukimas" #: src/ui/gui/factor.ui:70 msgid "_None" msgstr "_Nieko" #: src/ui/gui/factor.ui:87 msgid "_Varimax" msgstr "_Varimax" #: src/ui/gui/factor.ui:104 msgid "_Quartimax" msgstr "_Quartimax" #: src/ui/gui/factor.ui:123 msgid "_Equimax" msgstr "_Equimax" #: src/ui/gui/factor.ui:146 msgid "Method" msgstr "Metodas" #: src/ui/gui/factor.ui:159 msgid "_Display rotated solution" msgstr "_Rodyti pasuktą sprendimą" #: src/ui/gui/factor.ui:181 src/ui/gui/factor.ui:582 msgid "Ma_ximum iterations for convergence:" msgstr "_Didžiausias iteracijų skaičius:" #: src/ui/gui/factor.ui:241 src/ui/gui/factor.ui:255 msgid "Principal Components Analysis" msgstr "Pagrindinių komponenčių analizė" #: src/ui/gui/factor.ui:246 src/ui/gui/factor.ui:258 msgid "Principal Axis Factoring" msgstr "Pagrindinių ašių faktorizacija" #: src/ui/gui/factor.ui:264 msgid "Factor Analysis: Extraction" msgstr "Faktorinė analizė: išskyrimas" #: src/ui/gui/factor.ui:290 msgid "_Method: " msgstr "_Metodas: " #: src/ui/gui/factor.ui:345 msgid "Co_rrelation matrix" msgstr "Ko_reliacijų matrica" #: src/ui/gui/factor.ui:361 msgid "Co_variance matrix" msgstr "Ko_variacijų matrica" #: src/ui/gui/factor.ui:382 msgid "Analyze" msgstr "Analizuoti" #: src/ui/gui/factor.ui:407 msgid "_Unrotated factor solution" msgstr "Faktorių išskyrimas _be sukimo" #: src/ui/gui/factor.ui:423 msgid "_Scree plot" msgstr "Tikrinių reikšmių _grafikas" #: src/ui/gui/factor.ui:443 src/ui/gui/histogram.ui:146 src/ui/gui/roc.ui:329 msgid "Display" msgstr "Rodyti" #: src/ui/gui/factor.ui:526 msgid "_Number of factors:" msgstr "_Faktorių skaičius:" #: src/ui/gui/factor.ui:563 msgid "Extract" msgstr "Išskirti" #: src/ui/gui/factor.ui:640 msgid "Factor Analysis" msgstr "Faktorinė analizė" #: src/ui/gui/factor.ui:672 src/ui/gui/data-editor.ui:266 msgid "_Descriptives..." msgstr "_Aprašomoji..." #: src/ui/gui/factor.ui:685 msgid "_Extraction..." msgstr "_Išskyrimas" #: src/ui/gui/factor.ui:699 msgid "_Rotations..." msgstr "_Sukimas..." #: src/ui/gui/find.ui:25 msgid "Find Case" msgstr "Ieškoti atvejo" #: src/ui/gui/find.ui:117 msgid "Variable:" msgstr "Kintamasis:" #: src/ui/gui/find.ui:157 src/ui/gui/val-labs-dialog.ui:113 msgid "Value:" msgstr "Reikšmė:" #: src/ui/gui/find.ui:180 msgid "Search value labels" msgstr "Ieškoti reikšmių etikečių" #: src/ui/gui/find.ui:210 msgid "Regular expression Match" msgstr "Naudoti reguliarųjį reiškinį" #: src/ui/gui/find.ui:227 msgid "Search substrings" msgstr "Ieškoti teksto poeilučių (nepilnų žodžių)" #: src/ui/gui/find.ui:244 msgid "Wrap around" msgstr "Visame lakšte" #: src/ui/gui/find.ui:260 msgid "Search backward" msgstr "Ieškoti atgal" #: src/ui/gui/frequencies.ui:32 msgid "Frequencies: Frequency Tables" msgstr "Dažniai: dažnių lentelės" #: src/ui/gui/frequencies.ui:67 msgid "_Always" msgstr "_Visada" #: src/ui/gui/frequencies.ui:85 msgid "_Never" msgstr "_Niekada" #: src/ui/gui/frequencies.ui:107 msgid "If no _more than " msgstr "_Jei reikšmių ne daugiau kaip " #: src/ui/gui/frequencies.ui:129 src/ui/gui/frequencies.ui:454 msgid "100" msgstr "100" #: src/ui/gui/frequencies.ui:145 msgid "values" msgstr "reikšmės" #: src/ui/gui/frequencies.ui:167 msgid "Display frequency tables" msgstr "Rodyti dažnių lenteles" #: src/ui/gui/frequencies.ui:194 msgid "A_scending value" msgstr "_Didėjančia reikšme" #: src/ui/gui/frequencies.ui:212 msgid "D_escending value" msgstr "_Mažėjančia reikšme" #: src/ui/gui/frequencies.ui:230 msgid "Ascending _frequency" msgstr "Didėjančiu dažn_umu" #: src/ui/gui/frequencies.ui:248 msgid "Descending f_requency" msgstr "Mažėjančiu dažnu_mu" #: src/ui/gui/frequencies.ui:271 msgid "Order by" msgstr "Rikiuojama" #: src/ui/gui/frequencies.ui:324 msgid "Frequencies: Charts" msgstr "Dažniai: diagramos" #: src/ui/gui/frequencies.ui:356 msgid "Scale:" msgstr "Skalė:" #: src/ui/gui/frequencies.ui:366 msgid "_Frequencies" msgstr "Daž_niai" #: src/ui/gui/frequencies.ui:383 msgid "_Percentages" msgstr "_Procentiniai santykiai" #: src/ui/gui/frequencies.ui:407 msgid "Exclude values _below " msgstr "Atmesti reikšmes _mažesnes nei " #: src/ui/gui/frequencies.ui:422 msgid "Exclude values _above " msgstr "Atmesti reikšmes _didesnes nei " #: src/ui/gui/frequencies.ui:441 src/ui/gui/reliability.ui:227 msgid "0" msgstr "0" #: src/ui/gui/frequencies.ui:469 msgid "Chart Formatting" msgstr "Diagramų formatas" #: src/ui/gui/frequencies.ui:494 msgid "Draw _histograms" msgstr "Braižyti _histogramas" #: src/ui/gui/frequencies.ui:510 msgid "Superimpose _normal curve" msgstr "Uždėti _normaliąją kreivę" #: src/ui/gui/frequencies.ui:530 msgid "Histograms" msgstr "Histogramos" #: src/ui/gui/frequencies.ui:555 msgid "Draw _bar charts" msgstr "Braižyti s_tulpelines diagramas" #: src/ui/gui/frequencies.ui:575 msgid "Bar Charts" msgstr "Stulpelinės diagramos" #: src/ui/gui/frequencies.ui:600 msgid "Draw _pie charts" msgstr "Braižyti _skritulines diagramas" #: src/ui/gui/frequencies.ui:616 msgid "Include slices for _missing values" msgstr "Įtraukti pra_leistų reikšmių skiltis" #: src/ui/gui/frequencies.ui:636 msgid "Pie Charts" msgstr "Skritulinė diagrama" #: src/ui/gui/frequencies.ui:725 src/ui/gui/rank.ui:489 msgid "_Variable(s):" msgstr "_Kintamasis(-ieji):" #: src/ui/gui/frequencies.ui:769 msgid "_Statistics:" msgstr "S_tatistika:" #: src/ui/gui/frequencies.ui:783 msgid "Include _missing values" msgstr "Įtraukti praleistas _reikšmes" #: src/ui/gui/frequencies.ui:806 msgid "Ch_arts..." msgstr "_Diagramos..." #: src/ui/gui/frequencies.ui:821 msgid "Frequency _Tables..." msgstr "Dažnių _lentelės..." #: src/ui/gui/histogram.ui:24 msgid "Histogram" msgstr "Histograma" #: src/ui/gui/histogram.ui:126 msgid "_Display normal curve" msgstr "Braižyti _normaliąją kreivę" #: src/ui/gui/indep-samples.ui:25 src/ui/gui/k-independent.ui:35 msgid "Define Groups" msgstr "Apibrėžti grupes" #: src/ui/gui/indep-samples.ui:75 msgid "Group_2 value:" msgstr "_2 grupės reikšmė:" #: src/ui/gui/indep-samples.ui:89 msgid "Group_1 value:" msgstr "_1 grupės reikšmė:" #: src/ui/gui/indep-samples.ui:190 msgid "_Use specified values:" msgstr "_Naudoti nurodytas reikšmes:" #: src/ui/gui/indep-samples.ui:259 msgid "Independent-Samples T Test" msgstr "T kriterijus nepriklausomoms imtims" #: src/ui/gui/indep-samples.ui:319 msgid "_Define Groups..." msgstr "_Apibrėžti grupes..." #: src/ui/gui/indep-samples.ui:401 src/ui/gui/t-test.ui:211 msgid "_Test Variable(s):" msgstr "_Kriterijaus kintamasis(-ieji):" #: src/ui/gui/indep-samples.ui:454 src/ui/gui/k-independent.ui:165 msgid "_Grouping Variable:" msgstr "_Grupavimo kintamasis:" #: src/ui/gui/k-independent.ui:63 msgid "_Upper limit:" msgstr "_Viršutinė riba:" #: src/ui/gui/k-independent.ui:77 msgid "_Lower limit:" msgstr "_Apatinė riba:" #: src/ui/gui/k-independent.ui:136 msgid "Tests for Several Independent Samples" msgstr "Kriterijai kelioms nepriklausomoms imtims" #: src/ui/gui/k-independent.ui:208 src/ui/gui/ks-one-sample.ui:131 msgid "Test _Variable List:" msgstr "_Kriterijaus kintamųjų sąrašas:" #: src/ui/gui/k-independent.ui:320 msgid "_Define Groups" msgstr "Api_brėžti grupes" #: src/ui/gui/k-independent.ui:365 msgid "_Kruskal-Wallis H" msgstr "Kruskalo ir Voliso H" #: src/ui/gui/k-independent.ui:382 src/ui/gui/runs.ui:140 msgid "_Median" msgstr "_Mediana" #: src/ui/gui/k-means.ui:24 msgid "K-Means Cluster Analysis" msgstr "Kvidurkių reikšmės klasterinė analizė" #: src/ui/gui/k-means.ui:122 msgid "N_umber of Clusters: " msgstr "Klasterių skaičius" #: src/ui/gui/k-related.ui:24 msgid "Tests for Several Related Samples" msgstr "Kriterijai kelioms priklausomoms (porinėms) imtims" #: src/ui/gui/k-related.ui:113 msgid "_Test Variables:" msgstr "_Kriterijaus kintamieji:" #: src/ui/gui/k-related.ui:145 msgid "_Friedman" msgstr "_Fridmano" #: src/ui/gui/k-related.ui:161 msgid "_Kendall's W" msgstr "_Kendalo W" #: src/ui/gui/k-related.ui:177 msgid "_Cochran's Q" msgstr "_Kokrano Q" #: src/ui/gui/ks-one-sample.ui:163 msgid "_Normal" msgstr "_Normalusis" #: src/ui/gui/ks-one-sample.ui:181 msgid "_Poisson" msgstr "_Puasono" #: src/ui/gui/ks-one-sample.ui:198 msgid "_Uniform" msgstr "_Tolygusis" #: src/ui/gui/ks-one-sample.ui:213 msgid "_Exponential" msgstr "_Eksponentinis" #: src/ui/gui/ks-one-sample.ui:232 msgid "Test Distribution" msgstr "Kriterijaus skirstinys" #: src/ui/gui/logistic.ui:42 msgid "Logistic Regression: Options" msgstr "Logistinė regresija: parinktys" #: src/ui/gui/logistic.ui:66 msgid "CI for _exp(B): " msgstr "_exp(B) PI: " #: src/ui/gui/logistic.ui:97 msgid "%" msgstr "%" #: src/ui/gui/logistic.ui:146 msgid "Classification cu_toff: " msgstr "Klasifikavimo ki_rpinys: " #: src/ui/gui/logistic.ui:159 msgid "_Maximum Iterations: " msgstr "_Didžiausias iteracijų skaičius: " #: src/ui/gui/logistic.ui:177 msgid "Include _constant in model" msgstr "Į modelį įtraukti _konstantą" #: src/ui/gui/logistic.ui:219 msgid "Logistic Regression" msgstr "Logistinė regresija" #: src/ui/gui/logistic.ui:364 src/ui/gui/regression.ui:185 msgid "_Dependent" msgstr "_Priklausomas" #: src/ui/gui/logistic.ui:412 src/ui/gui/regression.ui:232 msgid "_Independent" msgstr "_Nepriklausomas" #: src/ui/gui/means.ui:25 msgid "Means" msgstr "Vidurkiai" #: src/ui/gui/means.ui:179 msgid "_Independent List:" msgstr "_Nepriklausomi kintamieji:" #: src/ui/gui/missing-val-dialog.ui:48 msgid "_No missing values" msgstr "_Nėra praleistų reikšmių" #: src/ui/gui/missing-val-dialog.ui:136 msgid "_Discrete missing values" msgstr "_Diskrečios praleistos reikšmės" #: src/ui/gui/missing-val-dialog.ui:172 msgid "_Low:" msgstr "_Apačia:" #: src/ui/gui/missing-val-dialog.ui:197 msgid "_High:" msgstr "_Viršus:" #: src/ui/gui/missing-val-dialog.ui:221 msgid "Di_screte value:" msgstr "Di_skreti reikšmė:" #: src/ui/gui/missing-val-dialog.ui:245 msgid "_Range plus one optional discrete missing value" msgstr "_Sritis ir viena diskreti praleista reikšmė" #: src/ui/gui/oneway.ui:25 msgid "One-Way ANOVA: Contrasts" msgstr "Vienfaktorinė ANOVA: kontrastai" #: src/ui/gui/oneway.ui:107 msgid "_Coefficients:" msgstr "_Koeficientai:" #: src/ui/gui/oneway.ui:161 msgid "Coefficient Total: " msgstr "Koeficientų suma: " #: src/ui/gui/oneway.ui:198 msgid "Contrast 1 of 1" msgstr "1 kontrastas iš 1" #: src/ui/gui/oneway.ui:234 msgid "One-Way ANOVA: Post-Hoc" msgstr "Vienfaktorinė ANOVA: post hoc" #: src/ui/gui/oneway.ui:270 msgid "Games Howell" msgstr "" #: src/ui/gui/oneway.ui:287 msgid "Fisher's LSD" msgstr "Fišerio LSD" #: src/ui/gui/oneway.ui:379 msgid "One-Way ANOVA" msgstr "Vienfaktorinė ANOVA" #: src/ui/gui/oneway.ui:408 msgid "_Factor:" msgstr "_Faktorius:" #: src/ui/gui/oneway.ui:451 msgid "Dependent _Variable(s):" msgstr "Priklausomas(-i) _kintamasis(-ieji):" #: src/ui/gui/oneway.ui:593 msgid "_Homogeneity" msgstr "_Homogeniškumas" #: src/ui/gui/oneway.ui:637 msgid "Post-Hoc..." msgstr "Post hoc..." #: src/ui/gui/oneway.ui:652 msgid "_Contrasts..." msgstr "Kon_trastai..." #: src/ui/gui/options.ui:25 msgid "Options Case" msgstr "Parinktys" #: src/ui/gui/options.ui:55 msgid "Display _Labels" msgstr "Rodyti _etiketes" #: src/ui/gui/options.ui:71 msgid "Display _Names" msgstr "Rodyti _vardus" #: src/ui/gui/options.ui:99 msgid "Sort by L_abel" msgstr "_Rikiuoti pagal etiketę" #: src/ui/gui/options.ui:115 msgid "Sort by Na_me" msgstr "R_ikiuoti pagal vardą" #: src/ui/gui/options.ui:131 msgid "Do not S_ort" msgstr "_Nerikiuoti" #: src/ui/gui/options.ui:159 msgid "Variable Lists" msgstr "Kintamųjų sąrašai" #: src/ui/gui/options.ui:184 msgid "Ma_ximize" msgstr "Iš_skleisti langą" #: src/ui/gui/options.ui:199 msgid "_Raise" msgstr "Iškelti _langą" #: src/ui/gui/options.ui:214 msgid "Aler_t" msgstr "Prašyti _dėmesio" #: src/ui/gui/options.ui:233 msgid "Output Window Action" msgstr "Rezultatų lango veiksmai" #: src/ui/gui/paired-samples.ui:147 msgid "_Test Pair(s):" msgstr "Kriterijaus _pora(-os):" #: src/ui/gui/rank.ui:30 msgid "Rank Cases: Types" msgstr "Ranguoti atvejus: tipai" #: src/ui/gui/rank.ui:57 msgid "Sum of case _weights" msgstr "Kintamųjų s_vorių suma" #: src/ui/gui/rank.ui:74 msgid "Fractional rank as _%" msgstr "Santykinis rangas p_rocentais" #: src/ui/gui/rank.ui:92 msgid "_Fractional rank" msgstr "_Santykinis rangas" #: src/ui/gui/rank.ui:109 msgid "_Savage score" msgstr "_Savage taškas" #: src/ui/gui/rank.ui:125 msgid "_Rank" msgstr "_Rangas" #: src/ui/gui/rank.ui:147 msgid "N_tiles" msgstr "_N-procentilės" #: src/ui/gui/rank.ui:195 msgid "_Proportion Estimates" msgstr "_Dalies įverčiai" #: src/ui/gui/rank.ui:213 msgid "_Normal Scores" msgstr "_Normalieji taškai" #: src/ui/gui/rank.ui:251 msgid "_Blom" msgstr "_Blom" #: src/ui/gui/rank.ui:269 msgid "Tuke_y" msgstr "_Tjukio" #: src/ui/gui/rank.ui:287 msgid "Ran_kit" msgstr "" #: src/ui/gui/rank.ui:305 msgid "_Van der Waerden" msgstr "_Van der Vardeno" #: src/ui/gui/rank.ui:328 msgid "Proportion Estimation Formula" msgstr "Dalies įverčių formulė" #: src/ui/gui/rank.ui:369 msgid "Rank Cases" msgstr "Ranguoti atvejus" #: src/ui/gui/rank.ui:434 msgid "_By:" msgstr "_Pagal:" #: src/ui/gui/rank.ui:595 msgid "_Smallest Value" msgstr "_Mažiausia reikšmė" #: src/ui/gui/rank.ui:613 msgid "_Largest Value" msgstr "_Didžiausia reikšmė" #: src/ui/gui/rank.ui:637 msgid "Assign rank 1 to:" msgstr "Pirmą rangą priskirti:" #: src/ui/gui/rank.ui:656 msgid "_Display summary tables" msgstr "Rodyti _santraukos lenteles" #: src/ui/gui/rank.ui:679 msgid "Rank T_ypes" msgstr "Rangų _tipai" #: src/ui/gui/rank.ui:694 msgid "_Ties..." msgstr "_Ryšiai" #: src/ui/gui/rank.ui:756 msgid "Rank Cases: Ties" msgstr "Ranguoti atvejus: ryšiai" #: src/ui/gui/rank.ui:788 msgid "_Mean" msgstr "_Vidurkis" #: src/ui/gui/rank.ui:806 msgid "_Low" msgstr "_Mažiausiasis" #: src/ui/gui/rank.ui:825 msgid "_High" msgstr "_Didžiausiasis" #: src/ui/gui/rank.ui:851 msgid "_Sequential ranks to unique values" msgstr "" "_Nuosekliai didėjantys rangai (didžiausias rangas lygus skirtingų reikšmių " "skaičiui)" #: src/ui/gui/rank.ui:875 msgid "Rank Assigned to Ties" msgstr "Rangas, priskiriamas esant vienodoms reikšmėms, yra rangų:" #: src/ui/gui/runs.ui:155 msgid "M_ean" msgstr "_Vidurkis" #: src/ui/gui/runs.ui:171 msgid "Mo_de" msgstr "Mo_da" #: src/ui/gui/runs.ui:191 msgid "_Custom:" msgstr "Savi_tas:" #: src/ui/gui/runs.ui:230 msgid "Cut Point" msgstr "Perskirti ties" #: src/ui/gui/sort.ui:25 msgid "Sort Cases" msgstr "Rikiuoti atvejus" #: src/ui/gui/sort.ui:101 msgid "Sort by:" msgstr "Rikiuoti pagal:" #: src/ui/gui/sort.ui:174 msgid "Descending" msgstr "Mažėjančiai" #: src/ui/gui/sort.ui:196 msgid "Sort Order" msgstr "Rikiavimo tvarka" #: src/ui/gui/split-file.ui:25 msgid "Split File" msgstr "Skaidyti rinkmeną" #: src/ui/gui/split-file.ui:103 msgid "Anal_yze all cases. Do not create groups." msgstr "Anali_zuoti visus atvejus. Nekurti grupių." #: src/ui/gui/split-file.ui:121 msgid "Compare _groups." msgstr "Pa_lyginti grupes." #: src/ui/gui/split-file.ui:140 msgid "Organize ou_tput by groups." msgstr "Rezultatus pateikti pagal g_rupes." #: src/ui/gui/split-file.ui:225 msgid "Groups _based on:" msgstr "_Grupuoti pagal:" #: src/ui/gui/split-file.ui:255 msgid "_Sort the file by grouping variables." msgstr "Rinkmeną rikiuoti pagal grupa_vimo kintamąjį" #: src/ui/gui/split-file.ui:273 msgid "_File is already sorted." msgstr "Rink_mena jau surikiuota." #: src/ui/gui/split-file.ui:334 msgid "Current Status : " msgstr "Dabartinė būsena: " #: src/ui/gui/split-file.ui:348 msgid "Analysis by groups is off" msgstr "Analizė pagal grupes yra išjungta" #: src/ui/gui/recode.ui:135 msgid "System _Missing" msgstr "_Sisteminė praleista" #: src/ui/gui/recode.ui:150 msgid "Co_py old values" msgstr "_Kopijuoti senas reikšmes" #: src/ui/gui/recode.ui:172 msgid "Va_lue: " msgstr "Reikš_mė: " #: src/ui/gui/recode.ui:276 msgid "Conver_t numeric strings to numbers (`5' -> 5)" msgstr "_Konvertuoti skaitmenines eilutes į skaičius („5“ -> 5)" #: src/ui/gui/recode.ui:297 msgid "Output variables are _strings" msgstr "Išvedami kintamieji yra _teksto eilutės. " #: src/ui/gui/recode.ui:318 msgid "Width: " msgstr "Plotis: " #: src/ui/gui/recode.ui:499 msgid "_Name:" msgstr "_Vardas:" #: src/ui/gui/recode.ui:527 msgid "La_bel:" msgstr "_Etiketė:" #: src/ui/gui/recode.ui:556 msgid "Chan_ge" msgstr "Pa_keisti" #: src/ui/gui/recode.ui:584 msgid "Output Variable" msgstr "Išvedamas kintamasis" #: src/ui/gui/recode.ui:658 msgid "Old and New Va_lues..." msgstr "Senos ir naujos reikš_mės" #: src/ui/gui/regression.ui:51 msgid "S_tatistics..." msgstr "S_tatistika..." #: src/ui/gui/regression.ui:272 msgid "Regression: Save" msgstr "Regresija: įrašyti" #: src/ui/gui/regression.ui:290 src/ui/gui/univariate.ui:42 msgid "_Predicted values" msgstr "_Tikėtinos reikšmes" #: src/ui/gui/regression.ui:307 src/ui/gui/univariate.ui:59 msgid "_Residuals" msgstr "_Liekanas" #: src/ui/gui/regression.ui:351 msgid "Regression: Statistics" msgstr "Regresija: statistika" #: src/ui/gui/regression.ui:393 src/ui/gui/univariate.ui:143 msgid "S_tatistics" msgstr "S_tatistika" #: src/ui/gui/reliability.ui:34 msgid "Alpha" msgstr "alfa" #: src/ui/gui/reliability.ui:43 msgid "Reliability Analysis" msgstr "Klausimynų patikimumo analizė" #: src/ui/gui/reliability.ui:144 msgid "_Items:" msgstr "_Elementai:" #: src/ui/gui/reliability.ui:166 msgid "_Model: " msgstr "_Modelis: " #: src/ui/gui/reliability.ui:212 msgid "_Variables in first split:" msgstr "_Kintamieji pirmoje dalyje:" #: src/ui/gui/reliability.ui:259 msgid "Show _descriptives for scale if item is deleted" msgstr "Aprašomoji statistika, jei elementas _būtų pašalintas" #: src/ui/gui/roc.ui:145 msgid "_Test Variable:" msgstr "_Kriterijaus kintamasis:" #: src/ui/gui/roc.ui:175 msgid "_State Variable:" msgstr "_Būsenos kintamasis" #: src/ui/gui/roc.ui:202 msgid "_Value of state variable:" msgstr "Būsenos kintamojo _reikšmė:" #: src/ui/gui/roc.ui:249 msgid "ROC C_urve" msgstr "Sprendimus priimančiojo ypatybių kreivė" #: src/ui/gui/roc.ui:269 msgid "_With diagonal reference line" msgstr "_Brėžti įstrižainę" #: src/ui/gui/roc.ui:293 msgid "Standard _Error and Confidence Interval" msgstr "_Standartinė paklaida ir pasikliovimo intervalas" #: src/ui/gui/roc.ui:309 msgid "_Coordinate points of the ROC Curve" msgstr "SPY kreivės koordinačių taškų lentelė" #: src/ui/gui/scatterplot.ui:25 msgid "Scatterplot" msgstr "Sklaidos diagrama" #: src/ui/gui/scatterplot.ui:56 msgid "_X Axis:" msgstr "_X ašis:" #: src/ui/gui/scatterplot.ui:100 msgid "_Y Axis:" msgstr "_Y ašis:" #: src/ui/gui/select-cases.ui:37 msgid "Select Cases: Range" msgstr "Atvejų atranka: sritis" #: src/ui/gui/select-cases.ui:87 msgid "First case" msgstr "Pirmas atvejis" #: src/ui/gui/select-cases.ui:99 msgid "Last case" msgstr "Paskutinis atvejis" #: src/ui/gui/select-cases.ui:111 msgid "Observation" msgstr "Stebėjimas" #: src/ui/gui/select-cases.ui:161 msgid "Select Cases" msgstr "Atvejų atranka" #: src/ui/gui/select-cases.ui:313 msgid "Use filter variable" msgstr "Naudoti filtro kintamąjį" #: src/ui/gui/select-cases.ui:380 msgid "Based on time or case range" msgstr "Pagal laiką arba atvejų sritį" #: src/ui/gui/select-cases.ui:395 msgid "Range..." msgstr "Sritis..." #: src/ui/gui/select-cases.ui:444 msgid "Random sample of cases" msgstr "Atsitiktinė atvejų imtis" #: src/ui/gui/select-cases.ui:460 msgid "Sample..." msgstr "Imtis..." #: src/ui/gui/select-cases.ui:508 msgid "If condition is satisfied" msgstr "Jeigu tenkinama sąlyga" #: src/ui/gui/select-cases.ui:523 msgid "If..." msgstr "Jeigu..." #: src/ui/gui/select-cases.ui:567 msgid "All Cases" msgstr "Visi atvejai" #: src/ui/gui/select-cases.ui:581 msgid "Select" msgstr "Pasirinkti" #: src/ui/gui/select-cases.ui:608 msgid "Filtered" msgstr "Filtruojami" #: src/ui/gui/select-cases.ui:625 msgid "Deleted" msgstr "Pašalinami" #: src/ui/gui/select-cases.ui:647 msgid "Unselected Cases Are" msgstr "Nepasirinkti atvejai yra" #: src/ui/gui/select-cases.ui:694 msgid "Select Cases: Random Sample" msgstr "Atvejų atranka: atsitiktinė imtis" #: src/ui/gui/select-cases.ui:756 msgid "Sample Size" msgstr "Imties dydis" #: src/ui/gui/t-test.ui:25 msgid "Options" msgstr "Parinktys" #: src/ui/gui/t-test.ui:63 msgid "Exclude cases _analysis by analysis" msgstr "Neįtraukiamos konkrečioje _analizėje" #: src/ui/gui/t-test.ui:148 msgid "One - Sample T Test" msgstr "T kriterijus vienai imčiai" #: src/ui/gui/t-test.ui:265 msgid "Test _Value: " msgstr "Kriterijaus _reikšmė: " #: src/ui/gui/text-data-import.ui:32 msgid "Select the first line of the data file that contains data." msgstr "Pasirinkite pirmąją importuotinų duomenų eilutę." #: src/ui/gui/text-data-import.ui:54 msgid "Line above selected line contains variable names" msgstr "Virš pasirinktosios eilutės yra kintamųjų vardai" #: src/ui/gui/text-data-import.ui:80 msgid "" "Check the data formats displayed below and fix any that are incorrect. You " "may set other variable properties now or later." msgstr "" "Peržiūrėkite žemiau pateiktą duomenų formatą ir, jei reikia, jį pataisykite. " "Kitas kintamųjų savybes galite nustatyti tiek dabar, tiek vėliau." #: src/ui/gui/text-data-import.ui:121 msgid "Variables" msgstr "Kintamieji" #: src/ui/gui/text-data-import.ui:152 msgid "Data Preview" msgstr "Duomenų peržiūra" #: src/ui/gui/text-data-import.ui:181 msgid "" "This assistant will guide you through the process of importing data into " "PSPP from a text file with one line per case, in which fields are separated " "by tabs, commas, or other delimiters.\n" "\n" "\tThe selected file contains N lines of text. Only the first M of these " "will be shown for preview purposes in the following screens. You may choose " "below how much of the file should actually be imported." msgstr "" "Šis vediklis padės į PSPP importuoti duomenis iš tekstinės rinkmenos, kur " "viena eilutė atitiks vieną atvejį, o laukai (būsimi kintamieji) atskiriami " "tabuliacija, kableliu ar kitu pasirinktu simboliu.\n" "\n" "\tPasirinkta rinkmena turi N eilučių teksto. Sekančiame lange galėsite " "peržiūrėti tik pirmąsias M eilučių. Žemiau galite nurodyti, kiek importuoti " "rinkmenos duomenų." #: src/ui/gui/text-data-import.ui:252 msgid "All cases" msgstr "Visi atvejai" #: src/ui/gui/text-data-import.ui:272 msgid "Amount to Import" msgstr "Importuojamas kiekis" #: src/ui/gui/text-data-import.ui:325 msgid "C_ustom" msgstr "Sa_viti" #: src/ui/gui/text-data-import.ui:341 msgid "Slas_h (/)" msgstr "D_ešininis brūkšnys (/)" #: src/ui/gui/text-data-import.ui:357 msgid "Semicolo_n (;)" msgstr "Kab_liataškis (;)" #: src/ui/gui/text-data-import.ui:373 msgid "P_ipe (|)" msgstr "Status brūkš_nys (|)" #: src/ui/gui/text-data-import.ui:389 msgid "H_yphen (-)" msgstr "B_rūkšnelis (-)" #: src/ui/gui/text-data-import.ui:405 msgid "Co_mma (,)" msgstr "_Kablelis (,)" #: src/ui/gui/text-data-import.ui:421 msgid "_Colon (:)" msgstr "_Dvitaškis (:)" #: src/ui/gui/text-data-import.ui:437 msgid "Ban_g (!)" msgstr "Ša_uktukas (!)" #: src/ui/gui/text-data-import.ui:453 msgid "Ta_b" msgstr "Ta_buliacija" #: src/ui/gui/text-data-import.ui:469 msgid "_Space" msgstr "_Tarpas" #: src/ui/gui/text-data-import.ui:490 msgid "Separators" msgstr "Skirtukai" #: src/ui/gui/text-data-import.ui:541 msgid "Quote separator characters with" msgstr "Teksto skirtukai pažymėti kabutėmis" #: src/ui/gui/text-data-import.ui:561 msgid "Quoting" msgstr "Kabutės" #: src/ui/gui/text-data-import.ui:599 msgid "Fields Preview" msgstr "Laukų peržiūra" #: src/ui/gui/text-data-import.ui:622 msgid "" "Enter below the sheet number and the cell range which you wish to import." msgstr "Nurodykite importuotino lakšto numerį ir langelių sritį." #: src/ui/gui/text-data-import.ui:670 msgid "_Cells: " msgstr "_Langeliai: " #: src/ui/gui/text-data-import.ui:684 msgid "_Sheet Index: " msgstr "_Lakštas: " #: src/ui/gui/text-data-import.ui:695 msgid "Use first row as _variable names" msgstr "Pirmoje eilutė yra _kintamųjų vardai" #: src/ui/gui/text-data-import.ui:717 msgid "Cells to Import" msgstr "Importuotini langeliai" #: src/ui/gui/transpose.ui:24 msgid "Transpose" msgstr "Transponuoti" #: src/ui/gui/transpose.ui:91 msgid "Name Variable:" msgstr "Vardų kintamasis:" #: src/ui/gui/transpose.ui:127 msgid "Variable(s):" msgstr "Kintamasis(-ieji):" #: src/ui/gui/univariate.ui:25 msgid "Univariate: Save" msgstr "Vienmatė dispersinė analizė: įrašyti" #: src/ui/gui/univariate.ui:103 msgid "Univariate: Statistics" msgstr "Vienmatė dispersinė analizė: statistika" #: src/ui/gui/univariate.ui:178 msgid "Univariate" msgstr "Vienmatė dispersinė analizė" #: src/ui/gui/univariate.ui:281 msgid "_Dependent Variable" msgstr "_Priklausomas _kintamasis" #: src/ui/gui/univariate.ui:329 msgid "_Fixed Factors" msgstr "_Fiksuoti faktoriai:" #: src/ui/gui/val-labs-dialog.ui:101 msgid "Value Label:" msgstr "Reikšmės etiketė:" #: src/ui/gui/data-editor.ui:33 msgid "Information Area" msgstr "Informacijos sritis" #: src/ui/gui/data-editor.ui:55 msgid "Case Counter Area" msgstr "Atvejų skaičiavimo sritis" #: src/ui/gui/data-editor.ui:80 msgid "Filter Use Status Area" msgstr "Filtro naudojimo būsenos sritis" #: src/ui/gui/data-editor.ui:106 msgid "Weight Status Area" msgstr "Svėrimo būsenos sritis" #: src/ui/gui/data-editor.ui:132 msgid "Split File Status Area" msgstr "Rinkmenos skaidymo sritis" #: src/ui/gui/data-editor.ui:154 msgid "_View" msgstr "Ro_dymas" #: src/ui/gui/data-editor.ui:157 msgid "_Status Bar" msgstr "_Būsenos juosta" #: src/ui/gui/data-editor.ui:163 msgid "_Font..." msgstr "Šri_ftai..." #: src/ui/gui/data-editor.ui:167 msgid "_Grid Lines" msgstr "_Tinklelis" #: src/ui/gui/data-editor.ui:171 msgid "Value _Labels" msgstr "Reikšmių _etiketės" #: src/ui/gui/data-editor.ui:182 msgid "_Variables" msgstr "_Kintamieji" #: src/ui/gui/data-editor.ui:192 msgid "_Sort Cases..." msgstr "_Rikiuoti atvejus..." #: src/ui/gui/data-editor.ui:196 msgid "_Transpose..." msgstr "_Transponuoti..." #: src/ui/gui/data-editor.ui:200 msgid "_Aggregate..." msgstr "Agreg_uoti..." #: src/ui/gui/data-editor.ui:206 msgid "S_plit File..." msgstr "_Skaidyti rinkmeną..." #: src/ui/gui/data-editor.ui:210 msgid "Select _Cases..." msgstr "_Atvejų atranka..." #: src/ui/gui/data-editor.ui:214 msgid "_Weight Cases..." msgstr "S_verti atvejus..." #: src/ui/gui/data-editor.ui:220 msgid "_Transform" msgstr "Trans_formuoti" #: src/ui/gui/data-editor.ui:223 msgid "_Compute..." msgstr "_Apskaičiuoti..." #: src/ui/gui/data-editor.ui:227 msgid "Cou_nt..." msgstr "_Suskaičiuoti reikšmių pasikartojimą..." #: src/ui/gui/data-editor.ui:231 msgid "Ran_k Cases..." msgstr "_Ranguoti atvejus..." #: src/ui/gui/data-editor.ui:235 msgid "Auto_matic Recode..." msgstr "Auto_matiškai perkoduoti..." #: src/ui/gui/data-editor.ui:241 msgid "Recode into _Same Variables..." msgstr "Perkoduoti į _tuos pačius kintamuosius..." #: src/ui/gui/data-editor.ui:245 msgid "Recode into _Different Variables..." msgstr "Perkoduoti į _kitus kintamuosius..." #: src/ui/gui/data-editor.ui:251 msgid "_Run Pending Transforms" msgstr "_Vykdyti laukiančias transformacijas" #: src/ui/gui/data-editor.ui:257 msgid "_Analyze" msgstr "_Analizuoti" #: src/ui/gui/data-editor.ui:260 msgid "_Descriptive Statistics" msgstr "_Aprašomoji statistika" #: src/ui/gui/data-editor.ui:262 msgid "_Frequencies..." msgstr "_Dažniai..." #: src/ui/gui/data-editor.ui:270 msgid "_Explore..." msgstr "_Tyrinėti..." #: src/ui/gui/data-editor.ui:274 msgid "_Crosstabs..." msgstr "_Požymių priklausomumo lentelės..." #: src/ui/gui/data-editor.ui:279 msgid "Compare _Means" msgstr "Palyginti _vidurkius" #: src/ui/gui/data-editor.ui:281 msgid "_Means..." msgstr "_Vidurkiai..." #: src/ui/gui/data-editor.ui:285 msgid "_One Sample T Test..." msgstr "T kriterijus _vienai imčiai..." #: src/ui/gui/data-editor.ui:289 msgid "_Independent Samples T Test..." msgstr "T kriterijus _nepriklausomoms imtims..." #: src/ui/gui/data-editor.ui:293 msgid "_Paired Samples T Test..." msgstr "_T kriterijus porinėms imtims..." #: src/ui/gui/data-editor.ui:297 msgid "One Way _ANOVA..." msgstr "Vienfaktorinė _ANOVA..." #: src/ui/gui/data-editor.ui:302 msgid "_Univariate Analysis..." msgstr "_Vienmatė dispersinė analizė..." #: src/ui/gui/data-editor.ui:306 msgid "Bivariate _Correlation..." msgstr "_Dviejų kintamųjų koreliacijos..." #: src/ui/gui/data-editor.ui:310 msgid "_K-Means Cluster..." msgstr "K-vidurkių _reikšm. klaster. analizė..." #: src/ui/gui/data-editor.ui:314 msgid "_Factor Analysis..." msgstr "_Faktorinė analizė..." #: src/ui/gui/data-editor.ui:318 msgid "Re_liability..." msgstr "_Klausimynų patikimumas..." #: src/ui/gui/data-editor.ui:322 msgid "_Regression" msgstr "_Regresija" #: src/ui/gui/data-editor.ui:325 msgid "_Linear..." msgstr "_Tiesinė regresija..." #: src/ui/gui/data-editor.ui:329 msgid "_Binary Logistic..." msgstr "_Dvireikšmė logistinė regresija..." #: src/ui/gui/data-editor.ui:335 msgid "_Non-Parametric Statistics" msgstr "_Neparametrinė statistika" #: src/ui/gui/data-editor.ui:338 msgid "_Chi Square..." msgstr "_Chi kvadratas..." #: src/ui/gui/data-editor.ui:342 msgid "_Binomial..." msgstr "_Binominis..." #: src/ui/gui/data-editor.ui:346 msgid "_Runs..." msgstr "_Serijų kriterijus..." #: src/ui/gui/data-editor.ui:350 msgid "_1 Sample K-S..." msgstr "K-S kriterijus _1 imčiai..." #: src/ui/gui/data-editor.ui:354 msgid "_2 Related Samples..." msgstr "_2 priklausomos imtys..." #: src/ui/gui/data-editor.ui:358 msgid "_K Related Samples..." msgstr "_K priklausomų imčių..." #: src/ui/gui/data-editor.ui:362 msgid "K _Independent Samples..." msgstr "K _nepriklausomų imčių..." #: src/ui/gui/data-editor.ui:368 msgid "ROC Cur_ve..." msgstr "_Sprendimus priimančiojo ypatybių kreivė..." #: src/ui/gui/data-editor.ui:374 msgid "_Graphs" msgstr "_Grafikai" #: src/ui/gui/data-editor.ui:377 msgid "_Scatterplot" msgstr "_Sklaidos diagrama" #: src/ui/gui/data-editor.ui:381 msgid "_Histogram" msgstr "_Histograma" #: src/ui/gui/data-editor.ui:385 msgid "_Barchart" msgstr "_Stulpelinė diagrama" #: src/ui/gui/data-editor.ui:391 msgid "_Utilities" msgstr "Įra_nkiai" #: src/ui/gui/data-editor.ui:394 msgid "_Variables..." msgstr "_Kintamieji..." #: src/ui/gui/data-editor.ui:398 msgid "Data File _Comments..." msgstr "Duomenų rinkmenos _komentarai..." #: src/ui/gui/output-window.ui:71 msgid "_Print..." msgstr "Spausdinti..." #: src/ui/gui/output-window.ui:76 msgid "_Export..." msgstr "_Eksportuoti..." #: src/ui/gui/output-window.ui:92 msgid "Select _All" msgstr "Viską p_ažymėti" #: src/ui/gui/syntax-editor.ui:27 msgid "Syntax" msgstr "Sintaksė" #: src/ui/gui/syntax-editor.ui:31 msgid "Data" msgstr "Duomenys" #: src/ui/gui/syntax-editor.ui:41 msgid "_Save" msgstr "Į_rašyti" #: src/ui/gui/syntax-editor.ui:46 msgid "Save _As" msgstr "Įrašyti _kaip" #: src/ui/gui/syntax-editor.ui:53 msgid "_Print" msgstr "_Spausdinti" #: src/ui/gui/syntax-editor.ui:84 msgid "_Delete" msgstr "_Šalinti" #: src/ui/gui/syntax-editor.ui:90 msgid "_Undo" msgstr "_Atšaukti" #: src/ui/gui/syntax-editor.ui:94 msgid "_Redo" msgstr "_Grąžinti" #: src/ui/gui/syntax-editor.ui:100 msgid "_Find" msgstr "_Ieškoti" #: src/ui/gui/syntax-editor.ui:106 msgid "_Run" msgstr "_Vykdyti" #: src/ui/gui/syntax-editor.ui:109 msgid "_All" msgstr "_Viską" #: src/ui/gui/syntax-editor.ui:113 msgid "_Selection" msgstr "_Pažymėtą sritį" #: src/ui/gui/syntax-editor.ui:117 msgid "_Current Line" msgstr "Veikiamąją _eilutę" #: src/ui/gui/syntax-editor.ui:122 msgid "_To End" msgstr "_Iki pabaigos" #: src/ui/gui/var-type-dialog.ui:99 msgid "Scientific notation" msgstr "Mokslinis užrašas" #: src/ui/gui/var-type-dialog.ui:150 msgid "Custom currency" msgstr "Savita valiuta" #: src/ui/gui/var-type-dialog.ui:267 msgid "positive" msgstr "teigiamas" #: src/ui/gui/var-type-dialog.ui:279 msgid "negative" msgstr "neigiamas" #: src/ui/gui/var-type-dialog.ui:293 msgid "Sample" msgstr "Imtis" #: src/ui/gui/var-type-dialog.ui:350 msgid "Width:" msgstr "Plotis:" #: src/ui/gui/var-type-dialog.ui:396 msgid "Decimal Places:" msgstr "Dešimtainė skiltis:" #: src/ui/gui/weight.ui:24 msgid "Weight Cases" msgstr "Sverti atvejus" #: src/ui/gui/weight.ui:100 msgid "Weight cases by" msgstr "Atvejus sverti pagal" #: src/ui/gui/weight.ui:144 msgid "Frequency Variable" msgstr "dažnių kintamąjį" #: src/ui/gui/weight.ui:198 msgid "Current Status: " msgstr "Dabartinė būsena: " #. TRANSLATORS: This is the application name in the desktop file #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:7 #: src/ui/gui/org.fsf.pspp.desktop.in:7 msgid "GNU PSPP" msgstr "GNU PSPP" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:8 #, fuzzy #| msgid "A program for the analysis of sampled data" msgid "GNU PSPP is a program for statistical analysis of sampled data" msgstr "Programa imties duomenų analizavimui" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:10 msgid "" "GNU PSPP is a program for the statistical analysis of sampled data. It is a " "Free replacement for the proprietary program SPSS, and appears very similar " "to it with a few exceptions. The most important of these exceptions are, " "that there are no “time bombs”; your copy of PSPP will not “expire” or " "deliberately stop working in the future. Neither are there any artificial " "limits on the number of cases or variables which you can use. There are no " "additional packages to purchase in order to get “advanced” functions; all " "functionality that PSPP currently supports is in the core package." msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:11 msgid "" "PSPP is a stable and reliable application. It can perform descriptive " "statistics, T-tests, anova, linear and logistic regression, measures of " "association, cluster analysis, reliability and factor analysis, non-" "parametric tests and more. Its backend is designed to perform its analyses " "as fast as possible, regardless of the size of the input data. You can use " "PSPP with its graphical interface or the more traditional syntax commands." msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:12 msgid "A brief list of some of the PSPP's features." msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:14 msgid "Support for over 1 billion cases" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:15 msgid "Support for over 1 billion variables" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:16 msgid "Syntax and data files which are compatible with those of SPSS" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:17 msgid "A choice of terminal or graphical user interface" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:18 msgid "A choice of text, postscript, pdf, opendocument or html output formats" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:19 msgid "" "Inter-operability with: LibreOffice, Apache OpenOffice, Gnumeric and other " "free software" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:20 msgid "Easy data import from spreadsheets, text files and database sources" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:21 msgid "" "The capability to open, analyse and edit two or more datasets concurrently" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:22 msgid "A user interface supporting all common character sets" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:23 msgid "A user interface has been translated to multiple languages" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:24 msgid "Very fast statistical procedures, even on very large data sets" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:25 msgid "No license fees and no expiration period" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:26 msgid "No unethical “end user license agreements”" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:27 msgid "A fully indexed user manual" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:28 msgid "Freedom ensured; It is licensed under the GPLv3 or later" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:29 msgid "" "Portability; Runs on many different computers and many different operating " "systems" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:31 msgid "" "PSPP is particularly aimed at statisticians, social scientists and students " "requiring fast convenient analysis of sampled data." msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:41 #, fuzzy #| msgid "Variable View" msgid "GNU PSPP Variable View" msgstr "Kintamųjų rodinys" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:54 msgid "Free Software Foundation" msgstr "" #: src/ui/gui/org.fsf.pspp.desktop.in:8 msgid "Statistical Software" msgstr "Statistinė programinė įranga" #: src/ui/gui/org.fsf.pspp.desktop.in:9 msgid "Analyze statistical data with a free alternative to SPSS" msgstr "Statistinių duomenų analizavimas su nemokama SPSS alternatyva" #. TRANSLATORS: Do not translate this string. Keep it as is, verbatim. #: src/ui/gui/org.fsf.pspp.desktop.in:12 msgid "pspp" msgstr "pspp" #. TRANSLATORS: You must keep all ";" - also at the end of line. #: src/ui/gui/org.fsf.pspp.desktop.in:17 msgid "statistics;analysis;spss;" msgstr "statistika;analizė;spss;" #~ msgid "Sorry. The help system hasn't yet been implemented." #~ msgstr "Atleiskite, žinynas dar nerealizuotas." #~ msgid "Interactive shell not supported on this platform." #~ msgstr "Šioje platformoje interaktyvus apvalkalas nepalaikomas." #~ msgid "Error executing command: %s." #~ msgstr "Komandos vykdymo klaida: %s." #~ msgid "Details" #~ msgstr "išsamiau" #~ msgid "Multiple dichotomy set" #~ msgstr "Daugialypių suskirstymų rinkinys" #~ msgid "Multiple category set" #~ msgstr "Daugialypių kategorijų rinkinys" #~ msgid "Label source" #~ msgstr "Etikečių šaltinis" #~ msgid "First variable label among variables" #~ msgstr "Pirmoji kintamojo etiketė tarp kintamųjų" #~ msgid "Provided by user" #~ msgstr "Naudotojo pateiktas" #~ msgid "Category label source" #~ msgstr "Kategorijos etiketės šaltinis" #~ msgid "Variable labels" #~ msgstr "Kintamųjų etiketės" #~ msgid "Value labels of counted value" #~ msgstr "Apskaičiuotų reikšmių etiketės" #~ msgid "Label:" #~ msgstr "Etiketė:" #~ msgid "No label." #~ msgstr "Be etiketės." #~ msgid "Product:" #~ msgstr "Produktas:" #~ msgid "Variables:" #~ msgstr "Kintamieji:" #~ msgid "Cases:" #~ msgstr "Atvejai:" #~ msgid "Type:" #~ msgstr "Tipas:" #~ msgid "Description" #~ msgstr "Aprašas" #~ msgid "The active dataset does not have a file label." #~ msgstr "Veikiamasis duomenų rinkinys neturi rinkmenos etiketės." #~ msgid "File label: %s" #~ msgstr "Rinkmenos etiketė: %s" #~ msgid "The active dataset dictionary does not contain any documents." #~ msgstr "Veikiamojo duomenų rinkinio žodynas neturi jokių dokumentų." #~ msgid "Documents in the active dataset:" #~ msgstr "Veikiamojo duomenų rinkinio dokumentai:" #~ msgid "Custom data file attributes." #~ msgstr "Duomenų rinkmenos saviti atributai." #~ msgid "Label: %s\n" #~ msgstr "Etiketė: %s\n" #~ msgid "Format: %s\n" #~ msgstr "Formatas: %s\n" #~ msgid "Print Format: %s\n" #~ msgstr "Spausdinimo formatas: %s\n" #~ msgid "Write Format: %s\n" #~ msgstr "Rašymo formatas: %s\n" #~ msgid "Measure: %s\n" #~ msgstr "Matavimo skalė: %s\n" #~ msgid "Role: %s\n" #~ msgstr "Vaidmuo: %s\n" #~ msgid "Display Alignment: %s\n" #~ msgstr "Rodoma lygiuotė: %s\n" #~ msgid "Display Width: %d\n" #~ msgstr "Rodomas plotis: %d\n" #~ msgid "Missing Values: " #~ msgstr "Praleistos reikšmės: " #~ msgid "Unknown TABLECELLS class" #~ msgstr "Nežinoma TABLECELLS klasė" #~ msgid "Exact Sig. (%d-tailed)" #~ msgstr "Tiksli p reikšmė (%d-pusė)" #~ msgid "Valid N" #~ msgstr "Galiojančių N" #~ msgid "Missing N" #~ msgstr "Praleistų N" #~ msgid "Valid cases = %.*g; cases with missing value(s) = %.*g." #~ msgstr "" #~ "Galiojančių atvejų = %.*g; atvejų su praleistomis reikšmėmis = %.*g." #~ msgid "%g" #~ msgstr "%g" #~ msgid "%d" #~ msgstr "%d" #~ msgid "%zu" #~ msgstr "%zu" #~ msgid "50 (Median)" #~ msgstr "50 (mediana)" #~ msgid "(%d)" #~ msgstr "(%d)" #~ msgid "Min" #~ msgstr "Mažiausia" #~ msgid "Max" #~ msgstr "Didžiausia" #~ msgid "%g%%" #~ msgstr "%g%%" #~ msgid "25th" #~ msgstr "25-asis" #~ msgid "50th (Median)" #~ msgstr "50-asis (mediana)" #~ msgid "75th" #~ msgstr "75-asis" #~ msgid "(I) %s" #~ msgstr "(I) %s" #~ msgid "(J) %s" #~ msgstr "(J) %s" #~ msgid "(I - J)" #~ msgstr "(I - J)" #~ msgid "%s into %s(%s of %s using %s BY %s)" #~ msgstr "%s į %s (%s iš %s naudojant %s pagal %s)" #~ msgid "%s into %s(%s of %s BY %s)" #~ msgstr "%s į %s (%s iš %s pagal %s)" #~ msgid "%s into %s(%s of %s using %s)" #~ msgstr "%s į %s (%s iš %s naudojant %s)" #~ msgid "%s into %s(%s of %s)" #~ msgstr "%s į %s (%s iš %s)" #~ msgid "Area Under the Curve (%s)" #~ msgstr "Plotas po kreive (%s)" #~ msgid "Coordinates of the Curve (%s)" #~ msgstr "Kreivės (%s) koordinatės" #~ msgid "Std. Error Mean" #~ msgstr "st. vidurkio paklaida" #~ msgid "(active dataset)" #~ msgstr "(veikiamasis duomenų rinkinys)" #~ msgid "Writing %zu record to %s." #~ msgid_plural "Writing %zu records to %s." #~ msgstr[0] "%zu įrašas įrašomas į %s." #~ msgstr[1] "%zu įrašas įrašomas į %s." #~ msgstr[2] "%zu įrašai įrašomi į %s." #~ msgstr[3] "%zu įrašų įrašoma į %s." #~ msgid "Writing %zu record." #~ msgid_plural "Writing %zu records." #~ msgstr[0] "Įrašomas %zu įrašas." #~ msgstr[1] "Įrašomas %zu įrašas." #~ msgstr[2] "Įrašomi %zu įrašai." #~ msgstr[3] "Įrašoma %zu įrašų." #~ msgid "Unsupported compression type (%d)" #~ msgstr "Nepalaikomas glaudinimo tipas (%d)" #~ msgid "Failed to seek to end of central directory record: %s" #~ msgstr "Nepavyko rasti centrinio katalogo įrašo pabaigos: %s" #~ msgid "Failed to seek to central directory: %s" #~ msgstr "Nepavyko rasti centrinio katalogo: %s" #~ msgid "Failed to seek to start of member `%s': %s" #~ msgstr "Nepavyko rasti „%s“ nario pradžios: %s" #~ msgid "ascii: closing output file `%s'" #~ msgstr "ascii: užveriama rezultatų rinkmena „%s“" #~ msgid "%s - Page %d" #~ msgstr "%s - %d puslapis" #~ msgid "" #~ "bad box: (%d+%d=%d,%d+%d=%d)-(%d+%d=%d,%d+%d=%d) in table size (%d,%d)\n" #~ msgstr "" #~ "netinkama lentelė (%d+%d=%d,%d+%d=%d)-(%d+%d=%d,%d+%d=%d), nes lentelės " #~ "dydis (%d,%d)\n" #~ msgid "can only convert encrypted data file to sav or sys format" #~ msgstr "užšifruotus duomenis gali konvertuoti tik į SAV ar SYS formatą" #~ msgid "can only convert encrypted syntax file to sps format" #~ msgstr "užšifruotus duomenis gali konvertuoti tik į SPS formatą" #~ msgid "count" #~ msgstr "kiekis" #~ msgid "expected" #~ msgstr "tikėtasi" #~ msgid "residual" #~ msgstr "liekana" #~ msgid "std. resid." #~ msgstr "norm. liekana" #~ msgid "adj. resid." #~ msgstr "patiksl. norm. liekana" #~ msgid "Chi-square tests." #~ msgstr "Chi kvadrato kriterijai." #~ msgid "Odds Ratio for %s (%.*s / %.*s)" #~ msgstr "Galimybių santykis: %s (%.*s / %.*s)" #~ msgid "For cohort %s = %.*g" #~ msgstr "Kohortai %s = %.*g" #~ msgid "For cohort %s = %.*s" #~ msgstr "Kohortai %s = %.*s" #~ msgid "Support for %s files was not compiled into this installation of PSPP" #~ msgstr "%s rinkmenų palaikymas nebuvo sukonfigūruotas kompiliuojant PSPP" #~ msgid "Cannot parse field content `%.*s' as format %s: %s" #~ msgstr "Nepavyksta lauko turinio „%.*s“ išnagrinėti %s formatu: %s" #~ msgid "This input line has too few separators to fill in this field." #~ msgstr "" #~ "Įvedimo eilutė turi per mažai skyriklių, tad šis laukas neužpildytas" #~ msgid "An error occurred reading the spreadsheet file." #~ msgstr "Klaida skaitant skaičialentės rinkmeną." #~ msgid "Enter a number to add a new variable." #~ msgstr "Norėdami sukurti naują kintamąjį, įveskite skaičių." #~ msgid "Enter a number to add a new case." #~ msgstr "Norėdami sukurti naują atvejį, įveskite skaičių." #~ msgid "Cannot create variable." #~ msgstr "Nepavyksta sukurti kintamojo." #~ msgid "\"%s\" is not a valid variable name." #~ msgstr "%s nėra tinkamas kintamojo vardas." #~ msgid "This dictionary already contains a variable named \"%s\"." #~ msgstr "Kintamasis vardu %s jau yra." #~ msgid "Cannot rename variable." #~ msgstr "Nepavyksta pervadinti kintamojo." #~ msgid "Enter a variable name to add a new variable." #~ msgstr "Norėdami įtraukti naują kintamąjį, įrašykite jo vardą." #~ msgid "{%s, %s}\n" #~ msgstr "{%s, %s}\n" #~ msgid "expecting number or data string" #~ msgstr "tikėtasi skaičiaus arba duomenų eilutės" #~ msgid "could not access definition for terminal `%s'" #~ msgstr "nepavyksta pasiekti „%s“ terminalo apibrėžties" #~ msgid "" #~ "PSPPIRE, a GUI for PSPP, a program for statistical analysis of sampled " #~ "data.\n" #~ "Usage: %s [OPTION]... FILE\n" #~ "\n" #~ "Arguments to long options also apply to equivalent short options.\n" #~ "\n" #~ "GUI options:\n" #~ " -q, --no-splash don't show splash screen during startup\n" #~ "\n" #~ "%sLanguage options:\n" #~ " -I, --include=DIR append DIR to search path\n" #~ " -I-, --no-include clear search path\n" #~ " -a, --algorithm={compatible|enhanced}\n" #~ " set to `compatible' if you want output\n" #~ " calculated from broken algorithms\n" #~ " -x, --syntax={compatible|enhanced}\n" #~ " set to `compatible' to disable PSPP " #~ "extensions\n" #~ " -i, --interactive interpret syntax in interactive mode\n" #~ " -s, --safer don't allow some unsafe operations\n" #~ "Default search path: %s\n" #~ "\n" #~ "Informative output:\n" #~ " -h, --help display this help and exit\n" #~ " -V, --version output version information and exit\n" #~ "\n" #~ "A non-option argument is interpreted as a data file in .sav or .zsav or ." #~ "por\n" #~ "format or a syntax file to load.\n" #~ msgstr "" #~ "PSPPIRE, PSPP grafinė sąsaja, programa imties duomenų statistinei " #~ "analizei.\n" #~ "Naudojimas: %s [PARINKTIS]... RINKMENA...\n" #~ "\n" #~ "Ilgosioms parinktims skirti argumentai tinka ir atitinkamoms trumposioms " #~ "parinktims.\n" #~ "\n" #~ "Grafinės naudotojo sąsajos parinktys:\n" #~ " -q, --no-splash paleidžiant nerodyti pristatymo lango\n" #~ "\n" #~ "%sKalbos parinktys:\n" #~ " -I, --include=KATALOGAS į paieškos kelią įtraukti KATALOGĄ\n" #~ " -I-, --no-include išvalyti paieškos kelią\n" #~ " -a, --algorithm={compatible|enhanced}\n" #~ " nustatykite „compatible“, jei norite " #~ "rezultatų,\n" #~ " apskaičiuotų naudojant prastesnius " #~ "algoritmus\n" #~ " -x, --syntax={compatible|enhanced}\n" #~ " rinkdamiesi „compatible“ uždrausite PSPP " #~ "papildinius\n" #~ " -i, --interactive sintaksę interpretuoti interaktyvioje " #~ "veiksenoje\n" #~ " -s, --safer neleisti nesaugių operacijų\n" #~ "Numatytasis paieškos kelias:%s\n" #~ "\n" #~ "Informacijos išvedimas:\n" #~ " -h, --help parodyti šį pagalbos pranešimą ir išeiti\n" #~ " -V, --version parodyti versijos informaciją ir išeiti\n" #~ "\n" #~ "Argumentai, jei jie nėra parinktys, interpretuojami kaip vykdytinos ." #~ "sav, .zsav ar .por duomenų rinkmenos arba kaip įkeltinos sintaksės " #~ "rinkmenos.\n" #~ msgid "_Reset" #~ msgstr "At_statyti" #~ msgid "_Select" #~ msgstr "_Pasirinkti" #~ msgid "Delete the variables at the selected position(s)" #~ msgstr "Pašalinti pasirinktų pozicijų kintamuosius" #~ msgid "Delete the cases at the selected position(s)" #~ msgstr "Pašalinti pasirinktų pozicijų atvejus" #~ msgid "_Open..." #~ msgstr "_Atverti..." #~ msgid "Transpose the cases with the variables" #~ msgstr "Transponuoti atvejus ir kintamuosius" #~ msgid "Aggregate the case values into a new variable" #~ msgstr "Agreguoti atvejų reikšmes į naują kintamąjį" #~ msgid "Choose a subset of cases for analysis" #~ msgstr "Pasirinkite analizuotinų atvejų poaibį" #~ msgid "All" #~ msgstr "Viską" #~ msgid "Number of clusters may not be larger than the number of cases." #~ msgstr "Klasterių skaičius negali būti didesnis nei atvejų skaičius." #~ msgid "Value of %s must be between 1 and 100." #~ msgstr "%s reikšmė turi būti iš intervalo tarp 1 ir 100." #~ msgid "TreeView path" #~ msgstr "TreeView kelias" #~ msgid "The path to the row in the GtkTreeView, as a string" #~ msgstr "Kelias iki GtkTreeView eilutės, kelias tekstinės eilutės formatu" #~ msgid "Diagonal slash" #~ msgstr "Įstrižainės brūkšnys" #~ msgid "Whether to draw a diagonal slash across the button." #~ msgstr "Ar mygtuke nubrėžti įstrižainę." #~ msgid "Incorrect value for variable type" #~ msgstr "Reikšmė netinka kintamojo tipui" #~ msgid "Font Selection" #~ msgstr "Šrifto pasirinkimas" #~ msgid "Import Delimited Text Data" #~ msgstr "Importuoti bet kokius tekstinius duomenis" #~ msgid "(optional case selection condition)" #~ msgstr "(atvejų atrankos sąlyga, nebūtina)" #~ msgid "Importing Textual Data" #~ msgstr "Tekstinių duomenų importavimas" #~ msgid "Doubled quote mark treated as escape" #~ msgstr "Dvi kabutės iš eilės - grįžtis" #~ msgid "Bar charts are not implemented." #~ msgstr "Stulpelinės diagramos dar nerealizuotos." #~ msgid "No valid data for variable %s; statistics not displayed." #~ msgstr "Kintamasis %s neturi tinkamų duomenų; statistika nerodoma." #~ msgid "Label: %s" #~ msgstr "Etiketė: %s" #~ msgid "Type: %s\n" #~ msgstr "Tipas: %s\n" #~ msgid "Missing Values: %s\n" #~ msgstr "Praleistos reikšmės: %s\n" #~ msgid "Value Labels:\n" #~ msgstr "Reikšmių etiketės:\n" #~ msgid "%s %s\n" #~ msgstr "%s %s\n" #~ msgid "Variables %s specified multiple times on %s subcommand." #~ msgstr "Kintamasis %s nurodytas daugybę kartų pokomandyje %s." #~ msgid "Variables %s specified on %s but not on %s." #~ msgstr "Kintamieji %s nurodyti ties %s, bet ne ties %s." #~ msgid "Weighting variable must be numeric (not string variable `%s')." #~ msgstr "" #~ "Svėrimo kintamasis turi būti skaitmeninis (ne teksto eilutės kintamasis " #~ "„%s“)." #~ msgid "Duplicate variable name `%s'." #~ msgstr "Kintamojo vardas „%s“ kartojasi." #~ msgid "Truncating variable label for variable `%s' to %d bytes." #~ msgstr "Kintamojo „%s“ etiketė sutrumpinama iki %d baitų." #~ msgid "%s is allowed only inside INPUT PROGRAM." #~ msgstr "%s leidžiama tik INPUT PROGRAM viduje." #~ msgid "%s is allowed only inside FILE TYPE." #~ msgstr "%s leidžiama tik FILE TYPE viduje." #~ msgid "" #~ "DELETE VARIABLES may not be used after TEMPORARY. Temporary " #~ "transformations will be made permanent." #~ msgstr "" #~ "DELETE VARIABLES negali būti po TEMPORARY. Laikinos transformacijos bus " #~ "atliekamos kaip ilgalaikės." #~ msgid "" #~ "DROP subcommand may be given at most once. It may not be given in " #~ "conjunction with the KEEP subcommand." #~ msgstr "" #~ "Pokomandis DROP gali būti pateikiamas tik vieną kartą. Jis negali būti " #~ "pateikiamas kartu su pokomandžiu KEEP." #~ msgid "" #~ "RENAME VARS may not be used after TEMPORARY. Temporary transformations " #~ "will be made permanent." #~ msgstr "" #~ "RENAME VARS negali būti po TEMPORARY. Laikinos transformacijos bus " #~ "atliekamos kaip ilgalaikės." #~ msgid "Charset:" #~ msgstr "Ženklų rinkinys:" #~ msgid "Expecting MEAN, MEDIAN, MODE or number" #~ msgstr "Tikimasi MEAN, MEDIAN, MODE arba skaičiaus" #~ msgid "The END subcommand may be used only with DATA LIST FIXED." #~ msgstr "Pokomandis END gali būti naudojamas tik su DATA LIST FIXED." #~ msgid "Value of FIXCASE must be at least 1." #~ msgstr "FIXCASE reikšmė turi būti bent 1." #~ msgid "Value of FIRST must be at least 1." #~ msgstr "FIRST reikšmė turi būti bent 1." #~ msgid "WORKSPACE must be at least 1MB" #~ msgstr "WORKSPACE turi būti bent 1MB" #~ msgid "expecting AUTOMATIC or year" #~ msgstr "tikėtasi AUTOMATIC arba metų" #~ msgid "LENGTH must be at least 1." #~ msgstr "LENGTH (ilgis) turi būti bent 1." #~ msgid "WIDTH must be at least 40." #~ msgstr "WIDTH (plotis) turi būti bent 40." #~ msgid "RESTORE without matching PRESERVE." #~ msgstr "RESTORE be atitinkamo PRESERVE." #~ msgid "Mode:" #~ msgstr "Veiksena:" #~ msgid "on" #~ msgstr "įjungta" #~ msgid "off" #~ msgstr "išjungta" #~ msgid "Insert Cases" #~ msgstr "Įterpti atvejus" #~ msgid "Processor Area" #~ msgstr "Doroklės sritis" #~ msgid "Error opening `%s' for reading as a Gnumeric file: %s." #~ msgstr "Klaida skaitymui atveriant „%s“ kaip Gnumeric rinkmeną: %s." #~ msgid "_Import Delimited Text Data..." #~ msgstr "_Importuoti tekstinius duomenis..." #~ msgid "VAR%05d" #~ msgstr "Kint%05d" #~ msgid "_Options" #~ msgstr "Pa_rinktys" #~ msgid "REGRESSION requires numeric variables." #~ msgstr "REGRESSION reikalauja skaitmeninių kintamųjų." #~ msgid "Dependent List:" #~ msgstr "Analizuotini kintamieji:" #~ msgid "Statistics..." #~ msgstr "Statistika..." #~ msgid "Exclude cases listwise" #~ msgstr "Atvejai neįtraukiami visose analizėse" #~ msgid "By:" #~ msgstr "Pagal:" #~ msgid "Rankit" #~ msgstr "Rankit" #~ msgid "Linear _Regression..." #~ msgstr "_Tiesinė regresija..." #~ msgid "" #~ "%s is allowed only before the active dataset has been defined or inside " #~ "INPUT PROGRAM." #~ msgstr "" #~ "%s leidžiama tik prieš nurodant veikiamąjį duomenų rinkinį arba INPUT " #~ "PROGRAM viduje." #~ msgid "" #~ "%s is allowed only after the active dataset has been defined or inside " #~ "INPUT PROGRAM." #~ msgstr "" #~ "%s leidžiama tik nurodžius veikiamąjį duomenų rinkinį arba INPUT PROGRAM " #~ "viduje." #~ msgid "missing required subcommand %s" #~ msgstr "trūksta reikalingo pokomandžio %s" #~ msgid "expecting `%s'" #~ msgstr "tikėtasi „%s“" #~ msgid "String expected." #~ msgstr "Tikėtasi teksto eilutės." #~ msgid "`(' expected after variable list." #~ msgstr "už kintamųjų sąrašo tikėtasi „(“." #~ msgid "`)' expected after output format." #~ msgstr "prieš rezultatų formatą tikėtasi „)“." #~ msgid "%s subcommand may be given at most once." #~ msgstr "Pokomandį %s galima pateikti ne daugiau kaip vieną kartą." #~ msgid "`(' expected on %s subcommand." #~ msgstr "pokomandyje %s tikėtasi „(“." #~ msgid "`)' expected after variable lists on RENAME subcommand." #~ msgstr "RENAME pokomandyje po kintamųjų sąrašo tikėtasi „)“." #~ msgid "`/' or `.' expected." #~ msgstr "Tikėtasi „/“ arba „.“." #~ msgid "`(' expected." #~ msgstr "tikėtasi „(“." #~ msgid "`=' expected between lists of new and old variable names." #~ msgstr "Tarp senų ir naujų kintamųjų vardų sąrašų tikėtasi „=“." #~ msgid "`)' expected after variable names." #~ msgstr "Po kintamųjų vardų tikėtasi „)“." #~ msgid "expecting file name" #~ msgstr "tikimasi rinkmenos vardo" #~ msgid "expecting %s or %s after %s" #~ msgstr "tikėtasi %s arba %s po %s" #~ msgid "/DESIGN is mandatory in GLM" #~ msgstr "/DESIGN būtinas komandai GLM" #~ msgid "`A' or `D' expected inside parentheses." #~ msgstr "„A“ arba „D“ tikimasi rasti tarp skliaustų." #~ msgid "`)' expected." #~ msgstr "tikėtasi „)“." #~ msgid "One or more VARIABLES must be specified." #~ msgstr "Turi būti nurodytas bent vienas kintamasis ties VARIABLES." #~ msgid "`=' expected after variable list." #~ msgstr "už kintamųjų sąrašo tikėtasi „=“." #~ msgid "No label" #~ msgstr "Be etikečių" #~ msgid "Suppress value labels" #~ msgstr "Nerodyti reikšmių etikečių" #~ msgid "Labeling" #~ msgstr "Etikečių uždėjimas" #~ msgid "Unknown variable format %." #~ msgstr "Nežinomas kintamojo formatas %." #~ msgid "print" #~ msgstr "spausdinti" #~ msgid "write" #~ msgstr "įrašyti" #~ msgid "Number of contrast coefficients must equal the number of groups" #~ msgstr "Kontrastų koeficientų skaičius turi būti lygus grupių skaičiui" #~ msgid "Variables cannot be parsed" #~ msgstr "Kintamųjų išnagrinėti negalima" #~ msgid "Cases >= Test Value" #~ msgstr "Atvejai >= kriterijaus reikšmė" #~ msgid "Unrecognized record type 7, subtype %d." #~ msgstr "Įrašo tipas 7, potipis %d neatpažintas." #~ msgid "Bad size %zu on extension 11." #~ msgstr "11-to plėtinio blogas dydis %zu." #~ msgid "%s: Error parsing attribute value %s[%d]" #~ msgstr "%s: klaida nagrinėjant atributo reikšmę %s[%d]" #~ msgid "%s: Attribute value %s[%d] is not quoted: %s" #~ msgstr "%s: Atributo reikšmė %s[%d] be kabučių: %s" #~ msgid "At least two variables must be specified on PAIRS." #~ msgstr "Naudojant PAIRS, reikia nurodyti bent du kintamuosius." #~ msgid "PSPP-data" #~ msgstr "PSPP-duomenys" #~ msgid "%s %s PSPPIRE %s" #~ msgstr "%s %s PSPPIRE %s" #~ msgid "" #~ "Recoded variable name duplicates an existing `%s' within system file." #~ msgstr "" #~ "Kintamojo, į kurį ketinama perkoduoti, vardas jau yra „%s“ sistemos " #~ "rinkmenoje." #~ msgid "Variable name begins with invalid character `%c'." #~ msgstr "Kintamojo vardas prasideda netinkamu rašmeniu „%c“." #~ msgid "Reading `%s': %s." #~ msgstr "Skaitoma „%s“: %s." #~ msgid "Closing `%s': %s." #~ msgstr "Užveriama „%s“: %s." #~ msgid "binary" #~ msgstr "dvejetainis" #~ msgid "octal" #~ msgstr "aštuntainis" #~ msgid "hex" #~ msgstr "šešioliktainis" #~ msgid "DO REPEAT without END REPEAT." #~ msgstr "DO REPEAT be END REPEAT." #~ msgid "%s is too long for a variable name." #~ msgstr "%s yra per ilgas kad būtų kintamojo vardu." #~ msgid "Too many values in single command." #~ msgstr "Vienoje komandoje yra per daug reikšmių." #~ msgid "Unexpected token: `%s'." #~ msgstr "Netikėta leksema: „%s“." #~ msgid "Unable to open `%s': %s." #~ msgstr "Nepavyksta atverti „%s“: %s." #~ msgid "Analyse" #~ msgstr "Analizuoti" #~ msgid "Sig. 1-tailed" #~ msgstr "p-reikšmė (1-pusė)" #~ msgid "column %d" #~ msgstr "%d stulpelis" #~ msgid "columns %d-%d" #~ msgstr "%d-%d stulpeliai" #~ msgid "Syntax error %s at %s." #~ msgstr "Sintaksės klaida %s ties %s." #~ msgid "expecting `('" #~ msgstr "tikėtasi „(“" #~ msgid "String expected for variable label." #~ msgstr "Kintamojo etiketėje tikėtasi teksto eilutės." #~ msgid "expecting `)'" #~ msgstr "tikimasi „)“" #~ msgid "" #~ "Alpha\n" #~ "Split" #~ msgstr "" #~ "alfa\n" #~ "padalijimas" #~ msgid "Asymp. Sig. (2-sided)" #~ msgstr "Asimp. p-reikšmė (2-pusė)" #~ msgid "Exact Sig. (2-sided)" #~ msgstr "Tiksli p-reikšmė (2-pusė)" #~ msgid "Exact Sig. (1-sided)" #~ msgstr "Tiksli p-reikšmė (1-pusė)" #~ msgid "`%s' is not a variable name" #~ msgstr "„%s“ nėra kintamojo vardas" #~ msgid "%s: Creating temporary file: %s." #~ msgstr "%s: Kuriama laikinoji rinkmena: %s." #~ msgid "little-endian" #~ msgstr "didėjantys baitai" #~ msgid "big-endian" #~ msgstr "mažėjantys baitai" #~ msgid "S E Mean" #~ msgstr "Vid st pakl" #~ msgid "S E Kurt" #~ msgstr "Eksc st pakl" #~ msgid "S E Skew" #~ msgstr "Asim st pakl" #~ msgid "PSPP --- A program for statistical analysis" #~ msgstr "PSPP --- statistinės analizės programa" #~ msgid "FILE1, FILE2 ... FILEn" #~ msgstr "RINKMENA1, RINKMENA2 ... RINKMENAn" #~ msgid "PSPPIRE --- A user interface for PSPP" #~ msgstr "PSPPIRE --- grafinė PSPP naudotojo sąsaja" #~ msgid "Miscellaneous options:" #~ msgstr "Kitos parinktys:" #~ msgid "Recode values into different variables" #~ msgstr "Perkoduoti reikšmes į kitus kintamuosius" #~ msgid "Split the window vertically and horizontally" #~ msgstr "Skaidyti langą vertikaliai ir horizontaliai" #~ msgid "Open Syntax" #~ msgstr "Atverti sintaksę" #~ msgid "Var 1" #~ msgstr "Pirmasis kintamasis" #~ msgid "Var 2" #~ msgstr "Antrasis kintamasis" #~ msgid "N of items" #~ msgstr "N elementų" #~ msgid "Buttons" #~ msgstr "Mygtukai" #~ msgid "...found \"%s\"" #~ msgstr "...rastas „%s“" #~ msgid "...not found" #~ msgstr "...nerasta" #~ msgid "Unknown." #~ msgstr "Nežinoma." #~ msgid "System File." #~ msgstr "Sisteminė rinkmena." #~ msgid "unexpected end of line" #~ msgstr "netikėta eilutės pabaiga" #~ msgid "reading \"%s\"" #~ msgstr "skaitoma „%s“" #~ msgid "reading font file \"%s\"" #~ msgstr "skaitoma šrifto rinkmena „%s“" #~ msgid "creating \"%s\"" #~ msgstr "Kuriama „%s“" #~ msgid "data file error" #~ msgstr "duomenų rinkmenos klaida" #~ msgid "PSPP error" #~ msgstr "PSPP klaida" #~ msgid "syntax warning" #~ msgstr "sintaksės įspėjimas" #~ msgid "data file warning" #~ msgstr "duomenų rinkmenos įspėjimas" #~ msgid "PSPP warning" #~ msgstr "PSPP įspėjimas" #~ msgid "syntax information" #~ msgstr "sintaksės informacija" #~ msgid "data file information" #~ msgstr "duomenų rinkmenos informacija" #~ msgid "PSPP information" #~ msgstr "PSPP informacija" #~ msgid "The PSPP processing engine reported the following message:" #~ msgid_plural "The PSPP processing engine reported the following messages:" #~ msgstr[0] "PSPP apdorojimo variklis pateikė šį pranešimą:" #~ msgstr[1] "PSPP apdorojimo variklis pateikė šiuos pranešimus:" #~ msgstr[2] "PSPP apdorojimo variklis pateikė šiuos pranešimus:" #~ msgstr[3] "PSPP apdorojimo variklis pateikė šiuos pranešimus:" #~ msgid "The PSPP processing engine reported %d message." #~ msgid_plural "The PSPP processing engine reported %d messages." #~ msgstr[0] "PSPP apdorojimo variklis pateikė vieną pranešimą." #~ msgstr[1] "PSPP apdorojimo variklis pateikė %d pranešimą." #~ msgstr[2] "PSPP apdorojimo variklis pateikė %d pranešimus." #~ msgstr[3] "PSPP apdorojimo variklis pateikė %d pranešimų." #~ msgid "%d of these messages are displayed below." #~ msgid_plural "%d of these messages are displayed below." #~ msgstr[0] "Viena iš šių žinučių pateikta žemiau." #~ msgstr[1] "%d iš šių žinučių pateikta žemiau." #~ msgstr[2] "%d iš šių žinučių pateikta žemiau." #~ msgstr[3] "%d iš šių žinučių pateikta žemiau." #~ msgid "Clear" #~ msgstr "Išvalyti" #~ msgid "Open a data file" #~ msgstr "Atverti duomenų rinkmeną" #~ msgid "New data file" #~ msgstr "Nauja duomenų rinkmena" #~ msgid "Import text data file" #~ msgstr "Importuoti tekstinių duomenų rinkmeną" #~ msgid "Select cases from the active file" #~ msgstr "Atrinkti atvejus iš veikiamosios rinkmenos" #~ msgid "Use Sets" #~ msgstr "Naudoti rinkinius" #~ msgid "Messages Reported" #~ msgstr "Gauti pranešimai" #~ msgid "" #~ "The PSPP processor reported # errors. The first # and last # are shown " #~ "below:" #~ msgstr "" #~ "PSPP apdorojimo variklis pranešė apie # klaidas. Pirmoji # ir " #~ "paskutinioji # pateiktos žemiau:" #~ msgid "Freq" #~ msgstr "Dažnis" #~ msgid "%s --- PSPP Data Editor" #~ msgstr "%s --- PSPP duomenų redaktorius" #~ msgid "%s --- PSPP Output" #~ msgstr "%s --- PSPP rezultatai" #~ msgid "%s --- PSPP Syntax Editor" #~ msgstr "u%s --- PSPP sintaksės redaktorius" #~ msgid "%s is not currently supported." #~ msgstr "%s šiuo metu nepalaikoma." #~ msgid "%s is unimplemented." #~ msgstr "%s nerealizuota." #~ msgid "Ascending Order" #~ msgstr "Didėjančia tvarka" #~ msgid "Bad variable width %d." #~ msgstr "Kintamojo ilgis %d yra netinkmas." #~ msgid "Descending Order" #~ msgstr "Mažėjančia tvarka" #~ msgid "Display Frequency Table" #~ msgstr "Rodyti dažnių lentelę" #~ msgid "Insert Ca_se" #~ msgstr "Įterpti _atvejį" #~ msgid "Insert _Variable" #~ msgstr "Įterpti _kintamąjį" #~ msgid "Jump to Variable" #~ msgstr "Šokti į kintamąjį" #~ msgid "Psppire Syntax Editor" #~ msgstr "Psppire sintaksės redaktorius" #~ msgid "Recode values into different Variables" #~ msgstr "Perkoduoti reikšmes į kitus kintamuosius" #~ msgid "Recode values into the same Variables" #~ msgstr "Perkoduoti reikšmes į tuos pačius kintamuosius" #~ msgid "S_plit" #~ msgstr "_Skaidyti" #~ msgid "" #~ "This is beta status software. Please report bugs to bug-gnu-pspp@gnu.org" #~ msgstr "" #~ "Tai tik bandomoji programinė įranga. Apie rastas klaidas praneškite el. " #~ "pašto adresu bug-gnu-pspp@gnu.org" #~ msgid "WEIGHT is off." #~ msgstr "SVĖRIMAS išjungtas." #~ msgid "_Goto Case" #~ msgstr "Š_okti į atvejį" #~ msgid "_Labels" #~ msgstr "_Etiketės" #~ msgid "_Sort" #~ msgstr "_Rikiuoti" #~ msgid "_Weights" #~ msgstr "S_voriai" #~ msgid "cases" #~ msgstr "atvejai" #~ msgid "error opening \"%s\"" #~ msgstr "atvėrimo klaida „%s“" #~ msgid "error opening \"%s\" for writing" #~ msgstr "„%s“ atvėrimo rašymui klaida" #~ msgid "error reading \"%s\"" #~ msgstr "skaitymo klaida „%s“" #~ msgid "Regresion: Statistics" #~ msgstr "Regresija: statistika" #~ msgid "One _Sample T Test" #~ msgstr "T kriterijus _vienai imčiai" #~ msgid "Oneway _ANOVA" #~ msgstr "Vienfaktorinė _ANOVA" pspp-1.4.1/po/uk.po0000644000175000017500000132361613725012645013531 0ustar00blpblp00000000000000# Ukrainian translation of PSPP # Copyright (C) 2013 Free Software Foundation, Inc. # This file is distributed under the same license as the pspp package. # # Yuri Chornoivan , 2013, 2014, 2015, 2016, 2017, 2018, 2020. msgid "" msgstr "" "Project-Id-Version: pspp 1.4.0\n" "Report-Msgid-Bugs-To: pspp-dev@gnu.org\n" "PO-Revision-Date: 2020-08-16 11:39+0300\n" "Last-Translator: Yuri Chornoivan \n" "Language-Team: Ukrainian \n" "Language: uk\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Bugs: Report translation errors to the Language-Team address.\n" "Plural-Forms: nplurals=4; plural=n==1 ? 3 : n%10==1 && n%100!=11 ? 0 : n" "%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" "X-Generator: Lokalize 20.11.70\n" #: src/data/any-reader.c:72 src/data/encrypted-file.c:78 #, c-format msgid "An error occurred while opening `%s': %s." msgstr "Під час спроби відкрити «%s» сталася помилка: %s." #: src/data/any-reader.c:93 src/language/lexer/lexer.c:1633 #, c-format msgid "Error reading `%s': %s." msgstr "Помилка під час читання «%s»: %s." #: src/data/any-reader.c:114 #, c-format msgid "`%s' is not a system or portable file." msgstr "«%s» не є системним або портативним файлом." #: src/data/any-reader.c:123 src/data/any-writer.c:66 msgid "The inline file is not allowed here." msgstr "Тут не можна використовувати вбудовані файли." #: src/data/any-reader.c:205 #, c-format msgid "" "Cannot read from dataset %s because no dictionary or data has been written " "to it yet." msgstr "" "Читання набору даних %s неможливе, оскільки до набору даних ще не записано " "словника або даних." #: src/data/any-reader.c:260 src/language/data-io/dataset.c:253 msgid "Dataset" msgstr "Набір даних" #: src/data/calendar.c:100 #, c-format msgid "Month %d is not in acceptable range of 0 to 13." msgstr "Місяць %d не належить до прийнятного діапазону від 0 до 13." #: src/data/calendar.c:110 #, c-format msgid "Day %d is not in acceptable range of 0 to 31." msgstr "День %d не належить до прийнятного діапазону від 0 до 31." #: src/data/calendar.c:119 #, c-format msgid "Date %04d-%d-%d is before the earliest acceptable date of 1582-10-15." msgstr "Дата %04d-%d-%d передує найдавнішій прийнятній даті, 1582-10-15." #: src/data/casereader-filter.c:221 msgid "" "At least one case in the data read had a weight value that was user-missing, " "system-missing, zero, or negative. These case(s) were ignored." msgstr "" "Значення ваги принаймні одного зі спостережень у отриманих даних є " "пропущеним користувачем, пропущеним системою, нулем або від'ємним значенням. " "Такі спостереження буде проігноровано." #. TRANSLATORS: this fragment will be interpolated into messages in fh_lock() #. that identify types of files. #: src/data/csv-file-writer.c:138 msgid "CSV file" msgstr "файл CSV" #: src/data/csv-file-writer.c:146 #, fuzzy, c-format #| msgid "Error opening `%s' for writing as a system file: %s." msgid "Error opening `%s' for writing as a CSV file: %s." msgstr "" "Помилка під час спроби відкрити «%s» для запису у форматі системного файла: " "%s." #: src/data/csv-file-writer.c:453 #, c-format msgid "An I/O error occurred writing CSV file `%s'." msgstr "Під час спроби записати файл CSV «%s» сталася помилка." #: src/data/data-in.c:175 #, c-format msgid "Data is not valid as format %s: %s" msgstr "Дані у форматі %s є некоректними: %s" #: src/data/data-in.c:377 src/data/data-in.c:553 msgid "Field contents are not numeric." msgstr "Вміст поля не є числом." #: src/data/data-in.c:379 src/data/data-in.c:555 msgid "Number followed by garbage." msgstr "Після запису числа виявлено зайві символи." #: src/data/data-in.c:392 msgid "Invalid numeric syntax." msgstr "Некоректний синтаксис числового значення." #: src/data/data-in.c:400 src/data/data-in.c:571 msgid "Too-large number set to system-missing." msgstr "Надто велике число вважається пропущеним системою." #: src/data/data-in.c:406 src/data/data-in.c:577 msgid "Too-small number set to zero." msgstr "Надто мале число замінено на нуль." #: src/data/data-in.c:426 msgid "All characters in field must be digits." msgstr "Усі символи у полі мають бути цифрами." #: src/data/data-in.c:445 msgid "Unrecognized character in field." msgstr "Невідомий символ у полі." #: src/data/data-in.c:466 src/data/data-in.c:729 msgid "Field must have even length." msgstr "Довжина поля має бути парною величиною." #: src/data/data-in.c:468 src/data/data-in.c:732 msgid "Field must contain only hex digits." msgstr "Вміст поля має складатися лише з шістнадцяткових цифр." #: src/data/data-in.c:544 msgid "Invalid zoned decimal syntax." msgstr "Некоректний синтаксичний запис зонованого десяткового числа." #: src/data/data-in.c:644 src/data/data-in.c:650 msgid "Invalid syntax for P field." msgstr "Некоректний синтаксис поля P." #: src/data/data-in.c:768 src/data/data-in.c:818 msgid "Syntax error in date field." msgstr "Синтаксична помилка у полі даних." #: src/data/data-in.c:783 #, c-format msgid "Day (%ld) must be between 1 and 31." msgstr "День (%ld) має бути цілим числом від 1 до 31." #: src/data/data-in.c:832 msgid "Delimiter expected between fields in date." msgstr "Між полями у даті мало бути вказано роздільник." #: src/data/data-in.c:906 msgid "" "Unrecognized month format. Months may be specified as Arabic or Roman " "numerals or as at least 3 letters of their English names." msgstr "" "Невідомий формат запису місяця. Місяці слід вказувати або у форматі " "арабських чи римських цифр або за допомогою перших трьох літер англійської " "назви місяця." #: src/data/data-in.c:933 #, c-format msgid "Year (%ld) must be between 1582 and 19999." msgstr "Рік (%ld) має бути цілим числом від 1582 до 19999." #: src/data/data-in.c:944 #, c-format msgid "Trailing garbage `%.*s' following date." msgstr "Зайві дані «%.*s» після дати." #: src/data/data-in.c:958 msgid "Julian day must have exactly three digits." msgstr "Запис юліанського дня має складатися точно з трьох цифр." #: src/data/data-in.c:960 #, c-format msgid "Julian day (%ld) must be between 1 and 366." msgstr "Юліанський день (%ld) має бути цілим числом від 1 до 366." #: src/data/data-in.c:984 #, c-format msgid "Quarter (%ld) must be between 1 and 4." msgstr "Квартал (%ld) має бути цілим числом від 1 до 4." #: src/data/data-in.c:1005 #, c-format msgid "Week (%ld) must be between 1 and 53." msgstr "Тиждень (%ld) має бути цілим числом від 1 до 53." #: src/data/data-in.c:1017 msgid "Delimiter expected between fields in time." msgstr "Між полями у записі часу мало бути вказано роздільник." #: src/data/data-in.c:1037 #, c-format msgid "Minute (%ld) must be between 0 and 59." msgstr "Хвилини (%ld) мають бути цілим числом від 0 до 59." #: src/data/data-in.c:1075 msgid "" "Unrecognized weekday name. At least the first two letters of an English " "weekday name must be specified." msgstr "" "Нерозпізнана назва дня тижня. Слід вказати принаймні дві перших літери назви " "дня тижня англійською." #: src/data/data-in.c:1210 #, c-format msgid "`%c' expected in date field." msgstr "У полі дати мав бути символ «%c»." #: src/data/data-out.c:580 #, c-format msgid "Weekday number %f is not between 1 and 7." msgstr "День тижня %f не є цілими числом від 1 до 7." #: src/data/data-out.c:605 #, c-format msgid "Month number %f is not between 1 and 12." msgstr "Місяць %f не є цілими числом від 1 до 12." #. TRANSLATORS: this fragment will be interpolated into #. messages in fh_lock() that identify types of files. #: src/data/dataset-writer.c:66 src/language/data-io/file-handle.c:304 msgid "dataset" msgstr "набір даних" #: src/data/dict-class.c:52 msgid "ordinary" msgstr "порядковий" #: src/data/dict-class.c:54 msgid "system" msgstr "системний" #: src/data/dict-class.c:56 msgid "scratch" msgstr "октоторпні" #: src/data/dictionary.c:1523 #, c-format msgid "Truncating document line to %d bytes." msgstr "Обрізаємо рядок документа до %d байтів." #: src/data/encrypted-file.c:89 #, c-format msgid "An error occurred while reading `%s': %s." msgstr "Під час спроби читання «%s» сталася помилка: %s." #: src/data/encrypted-file.c:430 #, c-format msgid "" "%s: encrypted file corrupted (ends in incomplete %u-byte ciphertext block)" msgstr "" "%s: зашифрований файл пошкоджено (він завершується неповним %u-байтовим " "блоком шифрованого тексту)" #: src/data/encrypted-file.c:449 #, c-format msgid "%s: encrypted file corrupted (ends with bad padding)" msgstr "" "%s: зашифрований файл пошкоджено (він завершується помилковим доповненням)" #: src/data/file-handle-def.c:283 src/language/data-io/dataset.c:266 msgid "active dataset" msgstr "активний набір даних" #: src/data/file-handle-def.c:518 #, c-format msgid "Can't read from %s as a %s because it is already being read as a %s." msgstr "" "Не вдалося прочитати %s як %s, оскільки це значення вже було прочитано як %s." #: src/data/file-handle-def.c:522 #, c-format msgid "Can't write to %s as a %s because it is already being written as a %s." msgstr "" "Не вдалося записати %s як %s, оскільки це значення вже було записано як %s." #: src/data/file-handle-def.c:529 #, c-format msgid "Can't re-open %s as a %s." msgstr "Не вдалося повторно відкрити %s як %s." #: src/data/file-name.c:133 #, c-format msgid "Not opening pipe file `%s' because %s option set." msgstr "Файл каналу «%s» не відкрито, оскільки встановлено параметр %s." #: src/data/format.c:339 msgid "Input format" msgstr "Вхідний формат" #: src/data/format.c:339 msgid "Output format" msgstr "Вихідний формат" #: src/data/format.c:342 #, c-format msgid "Format %s may not be used for input." msgstr "Формат %s не можна використовувати для вхідних даних." #: src/data/format.c:349 #, c-format msgid "%s specifies width %d, but %s requires an even width." msgstr "%s визначає ширину %d, але для %s потрібне парне значення ширини." #: src/data/format.c:358 #, c-format msgid "%s %s specifies width %d, but %s requires a width between %d and %d." msgstr "" "%s %s визначає ширину %d, але для %s потрібна ширина у межах від %d до %d." #: src/data/format.c:367 #, c-format msgid "%s %s specifies %d decimal place, but %s does not allow any decimals." msgid_plural "" "%s %s specifies %d decimal places, but %s does not allow any decimals." msgstr[0] "" "%s %s визначає %d десяткову позицію, але %s забороняє будь-які десяткові " "позиції." msgstr[1] "" "%s %s визначає %d десяткові позиції, але %s забороняє будь-які десяткові " "позиції." msgstr[2] "" "%s %s визначає %d десяткових позицій, але %s забороняє будь-які десяткові " "позиції." msgstr[3] "" "%s %s визначає %d десяткову позицію, але %s забороняє будь-які десяткові " "позиції." #: src/data/format.c:378 #, c-format msgid "" "%s %s specifies %d decimal place, but the given width allows at most %d " "decimals." msgid_plural "" "%s %s specifies %d decimal places, but the given width allows at most %d " "decimals." msgstr[0] "" "%s %s визначає %d десяткову позицію, але за вказаного значення ширини можна " "використовувати не більше %d десяткових позицій." msgstr[1] "" "%s %s визначає %d десяткові позиції, але за вказаного значення ширини можна " "використовувати не більше %d десяткових позицій." msgstr[2] "" "%s %s визначає %d десяткових позицій, але за вказаного значення ширини можна " "використовувати не більше %d десяткових позицій." msgstr[3] "" "%s %s визначає %d десяткову позицію, але за вказаного значення ширини можна " "використовувати не більше %d десяткових позицій." #: src/data/format.c:385 #, c-format msgid "" "%s %s specifies %d decimal place, but the given width does not allow for any " "decimals." msgid_plural "" "%s %s specifies %d decimal places, but the given width does not allow for " "any decimals." msgstr[0] "" "%s %s визначає %d десяткову позицію, але за вказаного значення ширини не " "можна використовувати жодної." msgstr[1] "" "%s %s визначає %d десяткові позиції, але за вказаного значення ширини не " "можна використовувати жодної." msgstr[2] "" "%s %s визначає %d десяткових позицій, але за вказаного значення ширини не " "можна використовувати жодної." msgstr[3] "" "%s %s визначає %d десяткову позицію, але за вказаного значення ширини не " "можна використовувати жодної." #: src/data/format.c:424 #, c-format msgid "%s variables are not compatible with %s format %s." msgstr "Змінні %s несумісні з форматом %s %s." #: src/data/format.c:425 src/data/format.c:1074 #: src/ui/gui/var-type-dialog.ui:167 msgid "String" msgstr "Рядок" #: src/data/format.c:425 src/data/format.c:1035 #: src/ui/gui/var-type-dialog.ui:48 msgid "Numeric" msgstr "Число" #: src/data/format.c:426 src/data/sys-file-reader.c:2212 #: src/data/sys-file-reader.c:2214 src/language/xforms/recode.c:512 #: src/language/xforms/recode.c:513 src/language/xforms/recode.c:525 #: src/language/xforms/recode.c:526 #: src/language/dictionary/apply-dictionary.c:77 #: src/language/dictionary/apply-dictionary.c:78 msgid "numeric" msgstr "число" #: src/data/format.c:426 src/data/sys-file-reader.c:2212 #: src/data/sys-file-reader.c:2214 src/language/xforms/recode.c:512 #: src/language/xforms/recode.c:513 src/language/xforms/recode.c:525 #: src/language/xforms/recode.c:526 #: src/language/dictionary/apply-dictionary.c:77 #: src/language/dictionary/apply-dictionary.c:78 msgid "string" msgstr "рядок" #: src/data/format.c:444 #, c-format msgid "String variable with width %d is not compatible with format %s." msgstr "Рядкова змінна з шириною %d є несумісною з форматом %s." #: src/data/format.c:1038 src/ui/gui/var-type-dialog.ui:65 msgid "Comma" msgstr "Кома" #: src/data/format.c:1041 src/ui/gui/var-type-dialog.ui:82 msgid "Dot" msgstr "Крапка" #: src/data/format.c:1044 msgid "Scientific" msgstr "Інженерний" #: src/data/format.c:1061 src/ui/gui/var-type-dialog.ui:116 msgid "Date" msgstr "Дата" #: src/data/format.c:1064 src/ui/gui/var-type-dialog.ui:133 msgid "Dollar" msgstr "Долар" #: src/data/format.c:1071 msgid "Custom" msgstr "Нетиповий" #: src/data/gnumeric-reader.c:478 src/data/ods-reader.c:505 #, c-format msgid "Cannot convert the value in the spreadsheet cell %s to format (%s): %s" msgstr "" "Не вдалося перетворити значення у комірці електронної таблиці %s до формату " "(%s): %s" #: src/data/gnumeric-reader.c:502 src/data/ods-reader.c:567 #, c-format msgid "" "There was a problem whilst reading the %s file `%s' (near line %d): `%s'" msgstr "" "Під час читання файла %s «%s» виникли проблеми (у околі рядка %d): «%s»" #: src/data/gnumeric-reader.c:597 #, c-format msgid "" "The gnumeric file `%s' is encoded as %s instead of the usual UTF-8 encoding. " "Any non-ascii characters will be incorrectly imported." msgstr "" "Кодуванням даних у файлі gnumeric «%s» є %s замість звичного кодування " "UTF-8. Усі символи, які не належать до набору ASCII, буде імпортовано з " "помилками." #: src/data/gnumeric-reader.c:641 src/data/ods-reader.c:682 #, c-format msgid "Invalid cell range `%s'" msgstr "Некоректний діапазон комірок «%s»" #: src/data/gnumeric-reader.c:813 src/data/ods-reader.c:710 #: src/data/ods-reader.c:843 #, c-format msgid "Selected sheet or range of spreadsheet `%s' is empty." msgstr "" "Вибраний аркуш або діапазон комірок електронної таблиці «%s» є порожнім." #: src/data/identifier2.c:60 #, c-format msgid "Identifier `%s' exceeds %d-byte limit." msgstr "Розміри ідентифікатора «%s» перевищують %d-байтове обмеження." #: src/data/identifier2.c:84 msgid "Identifier cannot be empty string." msgstr "Ідентифікатор не може бути порожнім рядком." #: src/data/identifier2.c:92 #, c-format msgid "`%s' may not be used as an identifier because it is a reserved word." msgstr "" "«%s» не можна використовувати як назву ідентифікатора, оскільки це слово " "зарезервовано." #: src/data/identifier2.c:103 #, c-format msgid "" "`%s' may not be used as an identifier because it contains ill-formed UTF-8 " "at byte offset %tu." msgstr "" "Назву «%s» не можна використовувати як ідентифікатор, оскільки у ній " "міститься помилковий символ UTF-8 на позиції байта %tu." #: src/data/identifier2.c:114 #, c-format msgid "" "Character %s (in `%s') may not appear as the first character in a identifier." msgstr "" "Символ %s (у «%s») не можна використовувати як першу літеру ідентифікатора." #: src/data/identifier2.c:126 #, c-format msgid "Character %s (in `%s') may not appear in an identifier." msgstr "Символ %s (у «%s») не можна використовувати у ідентифікаторі." #: src/data/mdd-writer.c:241 #, c-format msgid "An I/O error occurred writing metadata file `%s'." msgstr "" "Під час запису файла метаданих «%s» сталася помилка введення-виведення." #. TRANSLATORS: this fragment will be interpolated into #. messages in fh_lock() that identify types of files. #: src/data/mdd-writer.c:457 msgid "metadata file" msgstr "файл метаданих" #: src/data/mdd-writer.c:465 #, c-format msgid "Error opening `%s' for writing as a metadata file: %s." msgstr "" "Помилка під час спроби відкрити «%s» для запису у форматі файла метаданих: " "%s." #: src/data/mdd-writer.c:473 #, c-format msgid "Internal error creating xmlTextWriter. Please report this to %s." msgstr "" "Внутрішня помилка під час спроби створити xmlTextWriter. Будь ласка, " "повідомте про помилку сюди: %s." #: src/data/make-file.c:217 #, c-format msgid "Opening %s for writing: %s." msgstr "Відкриваємо %s для запису: %s." #: src/data/make-file.c:228 #, c-format msgid "Opening stream for %s: %s." msgstr "Відкриваємо потік для %s: %s." #: src/data/make-file.c:260 #, c-format msgid "Creating temporary file to replace %s: %s." msgstr "Створюємо тимчасовий файл на заміну %s: %s." #: src/data/make-file.c:277 #, c-format msgid "Creating temporary file %s: %s." msgstr "Створюємо тимчасовий файл %s: %s." #: src/data/make-file.c:289 #, c-format msgid "Opening stream for temporary file %s: %s." msgstr "Відкриваємо потік для тимчасового файла %s: %s." #: src/data/make-file.c:326 #, c-format msgid "Replacing %s by %s: %s." msgstr "Замінюємо %s на %s: %s." #: src/data/make-file.c:354 #, c-format msgid "Removing %s: %s." msgstr "Вилучаємо %s: %s." #: src/data/mrset.c:83 #, c-format msgid "" "%s is not a valid name for a multiple response set. Multiple response set " "names must begin with `$'." msgstr "" "%s не є коректною назвою для набору множини відповідей. Назви наборів множин " "відповідей мають починатися з «$»." #: src/data/ods-reader.c:620 #, c-format msgid "Cannot open %s as a OpenDocument file: %s" msgstr "Не вдалося відкрити %s як файл OpenDocument: %s" #. TRANSLATORS: this fragment will be interpolated into #. messages in fh_lock() that identify types of files. #: src/data/pc+-file-reader.c:206 msgid "SPSS/PC+ system file" msgstr "системний файл SPSS/PC+" #: src/data/pc+-file-reader.c:215 #, c-format msgid "Error opening `%s' for reading as an SPSS/PC+ system file: %s." msgstr "" "Помилка під час відкриття «%s» для читання у форматі системного файла SPSS/PC" "+: %s." #: src/data/pc+-file-reader.c:224 src/data/sys-file-reader.c:3541 #, c-format msgid "%s: stat failed (%s)." msgstr "%s: помилка stat (%s)." #: src/data/pc+-file-reader.c:230 #, c-format msgid "%s: file too large." msgstr "%s: файл є надто великим." #: src/data/pc+-file-reader.c:257 #, c-format msgid "" "Directory entry is for a %u-byte record starting at offset %u but file is " "only %u bytes long." msgstr "" "Запис каталогу призначено для %u-байтового запису зі зміщенням %u, але у " "файлі лише %u байтів." #: src/data/pc+-file-reader.c:275 #, c-format msgid "Directory fields have unexpected values (%u,%u)." msgstr "Поля каталогу мають неочікувані значення (%u,%u)." #: src/data/pc+-file-reader.c:372 src/data/sys-file-reader.c:672 #, c-format msgid "Variable %zu" msgstr "Змінна %zu" #: src/data/pc+-file-reader.c:380 src/data/sys-file-reader.c:680 #, c-format msgid "Variable %zu Label" msgstr "Мітка змінної %zu" #: src/data/pc+-file-reader.c:385 #, c-format msgid "Variable %zu Value Label %zu" msgstr "Змінна %zu, мітка значення %zu" #: src/data/pc+-file-reader.c:388 src/data/sys-file-reader.c:690 msgid "Creation Date" msgstr "Дата створення" #: src/data/pc+-file-reader.c:389 src/data/sys-file-reader.c:691 msgid "Creation Time" msgstr "Час створення" #: src/data/pc+-file-reader.c:390 src/data/sys-file-reader.c:692 #: src/language/dictionary/sys-file-info.c:200 msgid "Product" msgstr "Продукт" #: src/data/pc+-file-reader.c:391 src/data/sys-file-reader.c:693 #: src/language/dictionary/sys-file-info.c:300 msgid "File Label" msgstr "Мітка файла" #: src/data/pc+-file-reader.c:427 #, c-format msgid "" "Using default encoding %s to read this SPSS/PC+ system file. For best " "results, specify an encoding explicitly. Use SYSFILE INFO with ENCODING=" "\"DETECT\" to analyze the possible encodings." msgstr "" "Для читання цього системного файла SPSS/PC+ використовуємо типове кодування " "%s. Щоб покращити результати, вкажіть кодування явним чином. Проаналізувати " "можливі результати застосування різних кодувань можна за допомогою команди " "SYSFILE INFO з ENCODING=\"DETECT\"." #: src/data/pc+-file-reader.c:483 src/data/sys-file-reader.c:890 #, c-format msgid "Error closing system file `%s': %s." msgstr "Помилка під час спроби закрити системний файл «%s»: %s." #: src/data/pc+-file-reader.c:544 msgid "This is not an SPSS/PC+ system file." msgstr "Це не системний файл SPSS/PC+." #: src/data/pc+-file-reader.c:548 #, c-format msgid "Record 0 has unexpected length %u." msgstr "Запис 0 має неочікувану довжину, %u." #: src/data/pc+-file-reader.c:572 #, c-format msgid "Record 0 specifies unexpected system missing value %g (%a)." msgstr "Запис 0 визначає неочікуване системне пропущене значення %g (%a)." #: src/data/pc+-file-reader.c:577 #, c-format msgid "Record 0 reserved fields have unexpected values (%u,%u,%u,%u,%u,%u)." msgstr "" "Обернені поля запису 0 містять неочікувані значення (%u,%u,%u,%u,%u,%u)." #: src/data/pc+-file-reader.c:581 #, c-format msgid "Record 0 case counts differ (%u versus %u)." msgstr "Спостереження запису 0 має іншу розмірність (%u замість %u)." #: src/data/pc+-file-reader.c:585 #, c-format msgid "Invalid compression type %u." msgstr "Непідтримуваний тип стискання %u." #: src/data/pc+-file-reader.c:596 #, c-format msgid "" "Record 0 claims %u cases with %u values per case (requiring at least %zu " "bytes) but data record is only %u bytes long." msgstr "" "Для запису 0 визначено %u спостережень із %u значеннями на спостереження " "(потрібно принаймні %zu байтів), але запис даних складається лише з %u " "байтів." #: src/data/pc+-file-reader.c:618 #, c-format msgid "" "Value labels claimed to end at offset %u in labels record but labels record " "is only %u bytes." msgstr "" "Мітки значень мали завершуватися із відступом %u у запису міток, але запис " "міток складається лише з %u байтів." #: src/data/pc+-file-reader.c:629 #, c-format msgid "" "Value labels claimed to be at offset %u with length %u but file size is only " "%u bytes." msgstr "" "Мітки значень мали починатися із відступом %u і мати довжину %u, але файл " "має розмір лише у %u байтів." #: src/data/pc+-file-reader.c:656 #, c-format msgid "" "Value labels end with partial label (%u bytes left in record, label length " "%)." msgstr "" "Мітки значень завершуються частковою міткою (у записі лишається %u байтів, " "довжина мітки — %)." #: src/data/pc+-file-reader.c:669 #, c-format msgid "%u leftover bytes following value labels." msgstr "%u залишкових байтів за мітками значень." #: src/data/pc+-file-reader.c:685 #, c-format msgid "" "Variable label claimed to start at offset %u in labels record but labels " "record is only %u bytes." msgstr "" "Мітка змінної мала починатися із відступом %u у запису міток, але запис " "міток складається лише з %u байтів." #: src/data/pc+-file-reader.c:697 #, c-format msgid "" "Variable label with length %u starting at offset %u in labels record " "overruns end of %u-byte labels record." msgstr "" "Мітка змінної із довжиною %u починаючи із відступу %u у записі міток " "перекриває кінець %u-байтового запису міток." #: src/data/pc+-file-reader.c:719 #, c-format msgid "Record 1 has length %u (expected %u)." msgstr "Запис 1 має довжину %u (мало бути %u)." #: src/data/pc+-file-reader.c:751 #, c-format msgid "Variable %u has invalid type %." msgstr "Змінна %u належить до некоректного типу %." #: src/data/pc+-file-reader.c:787 #, c-format msgid "Invalid weight index %u." msgstr "Некоректний індекс ваги, %u." #: src/data/pc+-file-reader.c:857 #, c-format msgid "Invalid variable name `%s'." msgstr "Некоректна назва змінної, «%s»." #: src/data/pc+-file-reader.c:865 src/data/sys-file-reader.c:1444 #, c-format msgid "Renaming variable with duplicate name `%s' to `%s'." msgstr "Перейменовуємо зміну з дубльованою назвою, «%s», на «%s»." #: src/data/pc+-file-reader.c:877 #, c-format msgid "Cannot weight by string variable `%s'." msgstr "Зважування за рядковою змінною «%s» неможливе." #: src/data/pc+-file-reader.c:973 src/data/sys-file-reader.c:2762 msgid "File ends in partial case." msgstr "Файл завершено на незавершеному записі спостереження." #: src/data/pc+-file-reader.c:979 #, c-format msgid "" "Case beginning at offset 0x%08x extends past end of data record at offset 0x" "%08x." msgstr "" "Спостереження, що починається із відступом 0x%08x, продовжується за кінцем " "запису даних із відступом 0x%08x." #: src/data/pc+-file-reader.c:998 src/data/sys-file-reader.c:2770 #, c-format msgid "Error reading case from file %s." msgstr "Помилка під час читання спостереження з файла %s." #: src/data/pc+-file-reader.c:1114 src/data/sys-file-reader.c:2933 #, c-format msgid "" "Possible compressed data corruption: string contains compressed integer " "(opcode %d)." msgstr "" "Ймовірне пошкодження стиснених даних: рядок містить стиснене ціле значення " "(код операції %d)." #: src/data/pc+-file-reader.c:1156 src/data/sys-file-reader.c:3234 #, c-format msgid "`%s' near offset 0x%llx: " msgstr "«%s» поряд з позицією 0x%llx: " #: src/data/pc+-file-reader.c:1159 src/data/sys-file-reader.c:3237 #, c-format msgid "`%s': " msgstr "«%s»: " #: src/data/pc+-file-reader.c:1211 src/data/sys-file-reader.c:3288 #, c-format msgid "System error: %s." msgstr "Системна помилка: %s." #: src/data/pc+-file-reader.c:1216 src/data/sys-file-reader.c:3293 msgid "Unexpected end of file." msgstr "Неочікуваний символ кінця файла." #: src/data/pc+-file-reader.c:1301 src/data/sys-file-reader.c:3518 #, c-format msgid "%s: seek failed (%s)." msgstr "%s: помилка позиціювання (%s)." #: src/data/pc+-file-reader.c:1351 msgid "SPSS/PC+ System File" msgstr "системний файл SPSS/PC+" #: src/data/por-file-reader.c:109 #, c-format msgid "portable file %s corrupt at offset 0x%llx: " msgstr "портативний файл %s пошкоджено з позиції 0x%llx: " #: src/data/por-file-reader.c:136 #, c-format msgid "reading portable file %s at offset 0x%llx: " msgstr "читання портативного файла %s на позиції 0x%llx: " #: src/data/por-file-reader.c:164 #, c-format msgid "Error closing portable file `%s': %s." msgstr "Помилка під час спроби закрити портативний файл «%s»: %s." #: src/data/por-file-reader.c:216 msgid "unexpected end of file" msgstr "неочікуваний символ кінця файла" #. TRANSLATORS: this fragment will be interpolated into #. messages in fh_lock() that identify types of files. #: src/data/por-file-reader.c:275 src/data/por-file-writer.c:147 msgid "portable file" msgstr "портативний файл" #: src/data/por-file-reader.c:283 #, c-format msgid "" "An error occurred while opening `%s' for reading as a portable file: %s." msgstr "" "Під час спроби відкрити файл «%s» для читання у форматі портативного файла " "сталася помилка: %s." #: src/data/por-file-reader.c:304 msgid "Data record expected." msgstr "Мало бути вказано запис даних." #: src/data/por-file-reader.c:402 msgid "Number expected." msgstr "Слід було використати число." #: src/data/por-file-reader.c:430 msgid "Missing numeric terminator." msgstr "Пропущено позначку кінця числа." #: src/data/por-file-reader.c:453 msgid "Invalid integer." msgstr "Некоректне ціле число." #: src/data/por-file-reader.c:464 src/data/por-file-reader.c:484 #, c-format msgid "Bad string length %d." msgstr "Помилкова довжина рядка, %d." #: src/data/por-file-reader.c:547 #, c-format msgid "%s: Not a portable file." msgstr "%s: не є портативним файлом." #: src/data/por-file-reader.c:564 #, c-format msgid "Unrecognized version code `%c'." msgstr "Нерозпізнаний код версії, «%c»." #: src/data/por-file-reader.c:577 #, c-format msgid "Bad date string length %zu." msgstr "Помилкова довжина рядка дати, %zu." #: src/data/por-file-reader.c:579 #, c-format msgid "Bad time string length %zu." msgstr "Помилкова довжина рядка часу, %zu." #: src/data/por-file-reader.c:630 #, c-format msgid "" "%s: Bad format specifier byte (%d). Variable will be assigned a default " "format." msgstr "" "%s: помилковий байт специфікатора формату (%d). Для змінної буде визначено " "типовий формат." #: src/data/por-file-reader.c:651 #, c-format msgid "Numeric variable %s has invalid format specifier %s." msgstr "" "Для числової змінної %s використано некоректний специфікатор формату %s." #: src/data/por-file-reader.c:655 #, c-format msgid "String variable %s with width %d has invalid format specifier %s." msgstr "" "Для рядкової змінної %s з шириною %d вказано некоректний специфікатор " "формату, %s." #: src/data/por-file-reader.c:679 msgid "Expected variable count record." msgstr "Мало бути вказано запис кількості змінних." #: src/data/por-file-reader.c:683 #, c-format msgid "Invalid number of variables %d." msgstr "Некоректна кількість змінних, %d." #: src/data/por-file-reader.c:692 #, c-format msgid "Weight variable name (%s) truncated." msgstr "Назву змінної зважування (%s) обрізано." #: src/data/por-file-reader.c:707 msgid "Expected variable record." msgstr "Мало бути вказано запис змінної." #: src/data/por-file-reader.c:711 #, c-format msgid "Invalid variable width %d." msgstr "Некоректна ширина змінної, %d." #: src/data/por-file-reader.c:719 #, c-format msgid "Invalid variable name `%s' in position %d." msgstr "Некоректна назва змінної «%s» у позиції %d." #: src/data/por-file-reader.c:723 src/data/sys-file-reader.c:1426 #, c-format msgid "Bad width %d for variable %s." msgstr "Помилкова ширина %d змінної %s." #: src/data/por-file-reader.c:737 #, c-format msgid "Duplicate variable name %s in position %d renamed to %s." msgstr "Дублікат назви змінної %s на позиції %d перейменовано на %s." #: src/data/por-file-reader.c:786 #, c-format msgid "Weighting variable %s not present in dictionary." msgstr "У словнику немає змінної зважування %s." #: src/data/por-file-reader.c:830 #, c-format msgid "Unknown variable %s while parsing value labels." msgstr "Невідома змінна %s під час обробки міток значень." #: src/data/por-file-reader.c:833 #, c-format msgid "" "Cannot assign value labels to %s and %s, which have different variable types." msgstr "" "Не вдалося призначити мітки значень до %s і %s, які належать до різних типів " "змінних." #: src/data/por-file-reader.c:972 msgid "SPSS Portable File" msgstr "портативний файл SPSS" #: src/data/por-file-writer.c:139 #, c-format msgid "Invalid decimal digits count %d. Treating as %d." msgstr "" "Некоректна кількість десяткових знаків, %d. Буде використано кількість %d." #: src/data/por-file-writer.c:159 #, c-format msgid "Error opening `%s' for writing as a portable file: %s." msgstr "" "Помилка під час спроби відкрити «%s» для запису у форматі портативного " "файла: %s." #: src/data/por-file-writer.c:505 #, c-format msgid "An I/O error occurred writing portable file `%s'." msgstr "Під час спроби записати портативний файл «%s» сталася помилка." #: src/data/psql-reader.c:48 msgid "" "Support for reading postgres databases was not compiled into this " "installation of PSPP" msgstr "" "У цьому екземплярі PSPP не зібрано підтримки читання баз даних postgres" #: src/data/psql-reader.c:242 msgid "Memory error whilst opening psql source" msgstr "Помилка у роботі з пам'яттю під час спроби відкрити код psql" #: src/data/psql-reader.c:248 #, c-format msgid "Error opening psql source: %s." msgstr "Помилка під час спроби відкрити джерело psql: %s." #: src/data/psql-reader.c:263 #, c-format msgid "" "Postgres server is version %s. Reading from versions earlier than 8.0 is not " "supported." msgstr "" "Версія сервера Postgres — %s. Підтримки читання даних серверів з версією, що " "передує 8.0, не передбачено." #: src/data/psql-reader.c:283 msgid "" "Connection is unencrypted, but unencrypted connections have not been " "permitted." msgstr "" "Дані з'єднання не зашифровано. Передавання даних незашифрованими з'єднаннями " "заборонено." #: src/data/psql-reader.c:324 src/data/psql-reader.c:349 #: src/data/psql-reader.c:359 #, c-format msgid "Error from psql source: %s." msgstr "Помилка від джерела psql: %s." #: src/data/psql-reader.c:454 #, c-format msgid "Unsupported OID %d. SYSMIS values will be inserted." msgstr "Непідтримуване OID %d. Слід вставити значення SYSMIS." #: src/data/settings.c:391 msgid "" "MXWARNS set to zero. No further warnings will be given even when " "potentially problematic situations are encountered." msgstr "" "Для MXWARNS встановлено нульове значення. Програма більше не попереджатиме " "вас, навіть якщо буде виявлено потенційно проблемні речі." #: src/data/settings.c:398 #, c-format msgid "" "Warnings re-enabled. %d warnings will be issued before aborting syntax " "processing." msgstr "" "Показ попереджено повторно увімкнено. До автоматичного переривання обробки " "синтаксичних конструкцій буде показано %d попереджень." #: src/data/settings.c:618 #, c-format msgid "" "%s: Custom currency string `%s' does not contain exactly three periods or " "commas (or it contains both)." msgstr "" "%s: у рядку нетипової валюти, «%s» не міститься точно трьох крапок або ком " "(або містяться і крапки, і коми)." #. TRANSLATORS: this fragment will be interpolated into #. messages in fh_lock() that identify types of files. #: src/data/sys-file-reader.c:407 src/data/sys-file-writer.c:245 msgid "system file" msgstr "системний файл" #: src/data/sys-file-reader.c:414 #, c-format msgid "Error opening `%s' for reading as a system file: %s." msgstr "" "Помилка під час відкриття «%s» для читання у форматі системного файла: %s." #: src/data/sys-file-reader.c:491 msgid "Misplaced type 4 record." msgstr "Помилкове розташування запису типу 4." #: src/data/sys-file-reader.c:496 msgid "Duplicate type 6 (document) record." msgstr "Дублювання запису типу 6 (документа)." #: src/data/sys-file-reader.c:506 src/data/sys-file-reader.c:1343 #, c-format msgid "" "Unrecognized record type 7, subtype %d. For help, please send this file to " "%s and mention that you were using %s." msgstr "" "Нерозпізнаний запис типу 7, підтип %d. Будь ласка, надішліть копію цього " "файла на адресу %s і вкажіть, що ви користуєтеся %s." #: src/data/sys-file-reader.c:526 #, c-format msgid "" "Record type 7, subtype %d found here has the same type as the record found " "near offset 0x%llx. For help, please send this file to %s and mention that " "you were using %s." msgstr "" "Запис типу 7, підтип %d, виявлений тут належить до того самого типу, що і " "запису за адресою 0x%llx. Будь ласка, надішліть копію цього файла на адресу " "%s і вкажіть, що ви користуєтеся %s." #: src/data/sys-file-reader.c:538 #, c-format msgid "Unrecognized record type %d." msgstr "Нерозпізнаний тип запису %d." #: src/data/sys-file-reader.c:688 #, c-format msgid "Value Label %zu" msgstr "Мітка значення %zu" #: src/data/sys-file-reader.c:697 msgid "Extra Product Info" msgstr "Додаткові відомості щодо продукту" #: src/data/sys-file-reader.c:710 #, c-format msgid "Document Line %zu" msgstr "Рядок документа %zu" #: src/data/sys-file-reader.c:718 #, c-format msgid "MRSET %zu" msgstr "MRSET %zu" #: src/data/sys-file-reader.c:720 #, c-format msgid "MRSET %zu Label" msgstr "Мітка MRSET %zu" #: src/data/sys-file-reader.c:725 #, c-format msgid "MRSET %zu Counted Value" msgstr "Раховане значення MRSET %zu" #: src/data/sys-file-reader.c:763 #, c-format msgid "" "This system file does not indicate its own character encoding. Using " "default encoding %s. For best results, specify an encoding explicitly. Use " "SYSFILE INFO with ENCODING=\"DETECT\" to analyze the possible encodings." msgstr "" "У системному файлі не вказано даних щодо кодування. Використовуємо типове " "кодування %s. Щоб покращити результати, вкажіть кодування явним чином. " "Проаналізувати можливі результати застосування різних кодувань можна за " "допомогою команди SYSFILE INFO з ENCODING=\"DETECT\"." #: src/data/sys-file-reader.c:845 #, c-format msgid "File header claims %d variable positions but %zu were read from file." msgstr "" "У заголовку файла оголошено про %d позицій змінних, але з файла було " "прочитано лише %zu." #: src/data/sys-file-reader.c:958 src/data/sys-file-reader.c:972 msgid "This is not an SPSS system file." msgstr "Це не системний файл SPSS." #: src/data/sys-file-reader.c:1027 msgid "" "Compression bias is not the usual value of 100, or system file uses " "unrecognized floating-point format." msgstr "" "Рівень стискання не є звичним значенням у 100 або у системному файлі " "містяться дані у невідомому форматі значень з рухомою комою." #: src/data/sys-file-reader.c:1102 msgid "Variable label indicator field is not 0 or 1." msgstr "Поле індикатора мітки змінної не містить 0 або 1." #: src/data/sys-file-reader.c:1115 msgid "Numeric missing value indicator field is not -3, -2, 0, 1, 2, or 3." msgstr "" "Значенням поля індикатора пропущеного числа не є -3, -2, 0, 1, 2 або 3." #: src/data/sys-file-reader.c:1125 msgid "String missing value indicator field is not 0, 1, 2, or 3." msgstr "Значенням поля індикатора пропущеного рядка не є 0, 1, 2 або 3." #: src/data/sys-file-reader.c:1152 #, c-format msgid "Invalid number of labels %u." msgstr "Некоректна кількість міток, %u." #: src/data/sys-file-reader.c:1185 msgid "" "Variable index record (type 4) does not immediately follow value label " "record (type 3) as it should." msgstr "" "Запис індексу змінної (тип 4) не слідує за значенням мітки запису (тип 3), " "як це має бути." #: src/data/sys-file-reader.c:1197 #, c-format msgid "" "Number of variables associated with a value label (%u) is not between 1 and " "the number of variables (%zu)." msgstr "" "Кількість змінних, пов'язаних з міткою значення (%u), не лежить між 1 " "значенням кількості змінних (%zu)." #: src/data/sys-file-reader.c:1224 #, c-format msgid "Number of document lines (%d) must be greater than 0 and less than %d." msgstr "" "Кількість рядків у документі (%d) має перевищувати 0 і бути меншою за %d." #: src/data/sys-file-reader.c:1317 #, c-format msgid "Record type 7, subtype %d has bad size %u (expected %d)." msgstr "Запис типу 7, підтип %d, має розмірність %u (мало бути %d)." #: src/data/sys-file-reader.c:1321 #, c-format msgid "Record type 7, subtype %d has bad count %u (expected %d)." msgstr "Запис типу 7, підтип %d has bad count %u (expected %d)." #: src/data/sys-file-reader.c:1435 #, fuzzy, c-format #| msgid "Renaming variable with duplicate name `%s' to `%s'." msgid "Renaming variable with invalid name `%s' to `%s'." msgstr "Перейменовуємо зміну з дубльованою назвою, «%s», на «%s»." #: src/data/sys-file-reader.c:1517 msgid "Missing string continuation record." msgstr "Пропущено запис продовження рядка." #: src/data/sys-file-reader.c:1550 #, c-format msgid "Variable %s with width %d has invalid print format 0x%x." msgstr "Змінна %s з шириною %d має некоректний формат друку 0x%x." #: src/data/sys-file-reader.c:1554 #, c-format msgid "Variable %s with width %d has invalid write format 0x%x." msgstr "Змінна %s з шириною %d має некоректний формат запису 0x%x." #: src/data/sys-file-reader.c:1559 msgid "Suppressing further invalid format warnings." msgstr "Подальші попередження щодо некоректного форматування придушено." #: src/data/sys-file-reader.c:1613 #, c-format msgid "" "Floating-point representation indicated by system file (%d) differs from " "expected (%d)." msgstr "" "Представлення чисел з рухомою крапкою, визначене у системному файлі, (%d) " "відрізняється від очікуваного (%d)." #: src/data/sys-file-reader.c:1629 #, c-format msgid "" "Integer format indicated by system file (%d) differs from expected (%d)." msgstr "" "Формат запису цілого числа, визначений у системному файлі, (%d) " "відрізняється від очікуваного (%d)." #: src/data/sys-file-reader.c:1647 src/data/sys-file-reader.c:1653 #, c-format msgid "File specifies unexpected value %g (%a) as %s, instead of %g (%a)." msgstr "Файл визначає неочікуване значення %g (%a) як %s замість %g (%a)." #: src/data/sys-file-reader.c:1662 #, c-format msgid "" "File specifies unexpected value %g (%a) as %s, instead of %g (%a) or %g (%a)." msgstr "" "Файл визначає неочікуване значення %g (%a) як %s замість %g (%a) або %g (%a)." #: src/data/sys-file-reader.c:1714 src/data/sys-file-reader.c:1733 #, c-format msgid "Missing space following `%c' at offset %zu in MRSETS record." msgstr "Пропущено пробіл з наступним «%c» на позиції %zu у записі MRSETS." #: src/data/sys-file-reader.c:1741 #, c-format msgid "" "Missing label source value following `E' at offset %zu in MRSETS record." msgstr "" "Не вказано значення джерела мітки з наступним «E» на позиції %zu у записі " "MRSETS." #: src/data/sys-file-reader.c:1748 #, c-format msgid "" "Unexpected label source value following `E' at offset %zu in MRSETS record." msgstr "" "Неочікуване значення джерела мітки з наступним «E» на позиції %zu у записі " "MRSETS." #: src/data/sys-file-reader.c:1755 #, c-format msgid "Missing `C', `D', or `E' at offset %zu in MRSETS record." msgstr "Пропущено «C», «D» або «E» на позиції %zu у записі MRSETS." #: src/data/sys-file-reader.c:1782 #, c-format msgid "Missing new-line parsing variable names at offset %zu in MRSETS record." msgstr "" "Пропущено назви змінних відокремлених символами розриву рядків на позиції " "%zu у записі MRSETS." #: src/data/sys-file-reader.c:1817 #, c-format msgid "Invalid multiple response set name `%s'." msgstr "Некоректна назва набору множини відповідей, «%s»." #: src/data/sys-file-reader.c:1850 #, c-format msgid "MRSET %s contains duplicate variable name %s." msgstr "MRSET %s містить дублювання назви змінної, %s." #: src/data/sys-file-reader.c:1865 #, c-format msgid "MRSET %s contains both string and numeric variables." msgstr "MRSET %s містить одразу рядкові і числові змінні." #: src/data/sys-file-reader.c:1877 #, c-format msgid "MRSET %s has no variables." msgstr "MRSET %s не містить змінних." #: src/data/sys-file-reader.c:1879 #, c-format msgid "MRSET %s has only one variable." msgstr "MRSET %s містить лише одну змінну." #: src/data/sys-file-reader.c:1923 #, c-format msgid "Extension 11 has bad count %u (for %zu variables)." msgstr "Розширення 11 містило значення лічильника %u (для %zu змінних)." #: src/data/sys-file-reader.c:1956 #, c-format msgid "" "Invalid variable display parameters for variable %zu (%s). Default " "parameters substituted." msgstr "" "Некоректні параметри показу змінної %zu (%s). Буде використано типові " "параметри." #: src/data/sys-file-reader.c:2000 #, c-format msgid "Duplicate long variable name `%s'." msgstr "Дублювання довгої назви змінної, «%s»." #: src/data/sys-file-reader.c:2053 #, c-format msgid "Long variable mapping from %s to invalid variable name `%s'." msgstr "Довга прив'язка змінної з %s до назви некоректної змінної, «%s»." #: src/data/sys-file-reader.c:2088 #, c-format msgid "%s listed as string of invalid length %s in very long string record." msgstr "" "%s показано у списку як рядок некоректної довжини %s у записі дуже довгого " "рядка." #: src/data/sys-file-reader.c:2099 #, c-format msgid "" "%s listed in very long string record with width %s, which requires only one " "segment." msgstr "" "%s використано у записі дуже довгого рядка з шириною %s, який потребує лише " "одного сегмента." #: src/data/sys-file-reader.c:2107 #, c-format msgid "Very long string %s overflows dictionary." msgstr "Дуже довгий рядок %s виходить за межі словника." #: src/data/sys-file-reader.c:2125 #, c-format msgid "" "Very long string with width %ld has segment %d of width %d (expected %d)." msgstr "" "Дуже довгий рядок з шириною %ld містить сегмент %d довжини %d (мало бути %d)." #: src/data/sys-file-reader.c:2183 #, fuzzy, c-format #| msgid "Variable index %d not in valid range 1...%zu." msgid "Value label variable index %d not in valid range 1...%zu." msgstr "Індекс змінної %d не належить коректному діапазону 1...%zu." #: src/data/sys-file-reader.c:2193 #, fuzzy, c-format #| msgid "Variable index %d refers to long string continuation." msgid "Value label variable index %d refers to long string continuation." msgstr "Індекс змінної %d вказує на продовження довгого рядка." #: src/data/sys-file-reader.c:2208 #, c-format msgid "" "Variables associated with value label are not all of identical type. " "Variable %s is %s, but variable %s is %s." msgstr "" "Змінні, пов'язані з міткою значення, не усі належать до того самого типу. " "Змінна %s належить до типу %s, а змінна %s — до типу %s." #: src/data/sys-file-reader.c:2226 #, c-format msgid "" "Value labels may not be added to long string variables (e.g. %s) using " "records types 3 and 4." msgstr "" "Мітки значень не можна додавати до змінних довгих рядків (наприклад %s) за " "допомогою записів типів 3 і 4." #: src/data/sys-file-reader.c:2255 #, c-format msgid "Duplicate value label for %g on %s." msgstr "Дублювання мітки значення для %g у %s." #: src/data/sys-file-reader.c:2260 src/data/sys-file-reader.c:2600 #, c-format msgid "Duplicate value label for `%.*s' on %s." msgstr "Дублювання мітки значення для «%.*s» у %s." #: src/data/sys-file-reader.c:2283 #, fuzzy, c-format #| msgid "Suppressed %d additional related warnings." msgid "Suppressed %d additional warnings for value labels." msgstr "Придушено %d додаткових пов'язаних попереджень." #: src/data/sys-file-reader.c:2297 #, fuzzy, c-format #| msgid "Weight variable index %d not in valid range 1...%zu." msgid "" "Weight variable index %d not in valid range 1...%zu. Treating file as " "unweighted." msgstr "Індекс змінної ваги %d не належить коректному діапазону 1...%zu." #: src/data/sys-file-reader.c:2307 #, fuzzy, c-format #| msgid "Weight variable index %d refers to long string continuation." msgid "" "Weight variable index %d refers to long string continuation. Treating file " "as unweighted." msgstr "Індекс змінної ваги %d вказує на продовження довгого рядка." #: src/data/sys-file-reader.c:2315 #, c-format msgid "Ignoring string variable `%s' set as weighting variable." msgstr "Ігноруємо рядкову змінну «%s», встановлену як змінну для зважування." #: src/data/sys-file-reader.c:2352 #, c-format msgid "Error parsing attribute value %s[%d]." msgstr "Помилка під час спроби обробити значення атрибута %s[%d]." #: src/data/sys-file-reader.c:2366 #, c-format msgid "Attribute value %s[%d] is not quoted: %s." msgstr "Значення атрибута %s[%d] вказано не у лапках: %s." #: src/data/sys-file-reader.c:2379 #, c-format msgid "Duplicate attribute %s." msgstr "Дублювання атрибута, %s." #: src/data/sys-file-reader.c:2463 #, c-format msgid "Invalid role for variable %s." msgstr "Некоректна роль змінної %s." #: src/data/sys-file-reader.c:2472 #, c-format msgid "%zu other variables had invalid roles." msgstr "%zu інші змінні належать до некоректних ролей." #: src/data/sys-file-reader.c:2485 #, c-format msgid "Extension record subtype %d ends unexpectedly." msgstr "Неочікуване завершення запису розширення, підтип %d." #: src/data/sys-file-reader.c:2531 #, c-format msgid "Ignoring long string value label record for unknown variable %s." msgstr "" "Ігноруємо запис мітки довгого рядкового значення для невідомої змінної %s." #: src/data/sys-file-reader.c:2536 #, c-format msgid "Ignoring long string value label record for numeric variable %s." msgstr "" "Ігноруємо запис мітки довгого рядкового значення для числової змінної %s." #: src/data/sys-file-reader.c:2543 #, c-format msgid "" "Ignoring long string value label record for variable %s because the record's " "width (%d) does not match the variable's width (%d)." msgstr "" "Ігноруємо запис мітки довгого рядкового значення для змінної %s, оскільки " "довжина запису (%d) не відповідає ширині змінної (%d)." #: src/data/sys-file-reader.c:2573 #, c-format msgid "" "Ignoring long string value label %zu for variable %s, with width %d, that " "has bad value width %zu." msgstr "" "Ігноруємо мітку значення довгого рядка %zu для змінної %s з шириною %d, " "оскільки значення має помилкову ширину %zu." #: src/data/sys-file-reader.c:2646 #, c-format msgid "" "Long string missing values record says variable %s has %d missing values, " "but only 1 to 3 missing values are allowed." msgstr "" "Запис щодо пропущених значень довгого рядка повідомляє, що змінна %s має %d " "пропущених значень, втім, дозволено використовувати лише від 1 до 3 " "пропущених значень." #: src/data/sys-file-reader.c:2656 #, c-format msgid "Ignoring long string missing value record for unknown variable %s." msgstr "" "Ігноруємо запис довгого рядкового пропущеного значення для невідомої змінної " "%s." #: src/data/sys-file-reader.c:2661 #, c-format msgid "Ignoring long string missing value record for numeric variable %s." msgstr "" "Ігноруємо запис довгого рядкового пропущеного значення для числової змінної " "%s." #: src/data/sys-file-reader.c:2686 #, c-format msgid "" "Ignoring long string missing value %zu for variable %s, with width %d, that " "has bad value width %zu." msgstr "" "Ігноруємо пропущене значення довгого рядка %zu для змінної %s з шириною %d, " "оскільки значення має помилкову ширину %zu." #: src/data/sys-file-reader.c:2740 msgid "File ends in partial string value." msgstr "Файл завершено на незавершеному рядковому значенні." #: src/data/sys-file-reader.c:2879 msgid "" "Possible compressed data corruption: compressed spaces appear in numeric " "field." msgstr "" "Ймовірне пошкодження стиснених даних: стиснені пробіли у числовому полі." #: src/data/sys-file-reader.c:3030 #, c-format msgid "Suppressed %d additional related warnings." msgstr "Придушено %d додаткових пов'язаних попереджень." #: src/data/sys-file-reader.c:3076 src/data/sys-file-reader.c:3093 #, c-format msgid "Dictionary record refers to unknown variable %s." msgstr "Запис словника посилається на невідому змінну %s." #: src/data/sys-file-reader.c:3159 #, c-format msgid "Expecting digit at offset %zu in MRSETS record." msgstr "На позиції %zu у записі MRSETS мало бути використано цифру." #: src/data/sys-file-reader.c:3167 #, c-format msgid "Expecting space at offset %zu in MRSETS record." msgstr "На позиції %zu у записі MRSETS мало бути використано пробіл." #: src/data/sys-file-reader.c:3175 #, c-format msgid "%zu-byte string starting at offset %zu exceeds record length %zu." msgstr "" "%zu-байтове рядкове значення, що починається з позиції %zu, виходить за межі " "довжини запису, %zu." #: src/data/sys-file-reader.c:3185 #, c-format msgid "Expecting space at offset %zu following %zu-byte string." msgstr "" "На позиції %zu мало бути використано пробіл з наступним %zu-байтовим рядком." #: src/data/sys-file-reader.c:3476 #, c-format msgid "Wrong ZLIB data header offset %#llx (expected %#llx)." msgstr "Помилковий заголовок даних ZLIB на позиції %#llx (мало бути %#llx)." #: src/data/sys-file-reader.c:3484 #, c-format msgid "Impossible ZLIB trailer offset 0x%llx." msgstr "Некоректна кінцівка ZLIB на позиції 0x%llx." #: src/data/sys-file-reader.c:3491 #, c-format msgid "Invalid ZLIB trailer length %lld." msgstr "Некоректна довжина закінчення ZLIB, %lld." #: src/data/sys-file-reader.c:3555 #, c-format msgid "End of ZLIB trailer (0x%llx) is not file size (0x%llx)." msgstr "" "Завершення кінцівки ZLIB (0x%llx) перебуває за межами розміру файла (0x%llx)." #: src/data/sys-file-reader.c:3565 #, c-format msgid "ZLIB trailer bias (%lld) differs from file header bias (%.2f)." msgstr "" "Рівень кінцівки ZLIB (%lld) відрізняється від рівня заголовка файла (%.2f)." #: src/data/sys-file-reader.c:3575 #, c-format msgid "ZLIB trailer \"zero\" field has nonzero value %lld." msgstr "Поле «zero» кінцівки ZLIB містить ненульове значення %lld." #: src/data/sys-file-reader.c:3581 #, c-format msgid "ZLIB trailer specifies unexpected %u-byte block size." msgstr "У кінцівці ZLIB вказано неочікуваний розмір блоку у %u байтів." #: src/data/sys-file-reader.c:3589 #, c-format msgid "%lld-byte ZLIB trailer specifies %u data blocks (expected %lld)." msgstr "%lld-байтова кінцівка ZLIB визначає %u блоків даних (мало бути %lld)." #: src/data/sys-file-reader.c:3614 #, c-format msgid "" "ZLIB block descriptor %u reported uncompressed data offset %#llx, when %#llx " "was expected." msgstr "" "У дескрипторі блоку ZLIB %u повідомляється про позицію нестиснених даних " "%#llx, але мало бути вказано позицію %#llx." #: src/data/sys-file-reader.c:3623 #, c-format msgid "" "ZLIB block descriptor %u reported compressed data offset %#llx, when %#llx " "was expected." msgstr "" "У дескрипторі блоку ZLIB %u повідомляється про позицію стиснених даних " "%#llx, але мало бути вказано позицію %#llx." #: src/data/sys-file-reader.c:3633 #, c-format msgid "" "ZLIB block descriptor %u reported block size %#x, when %#x was expected." msgstr "" "У дескрипторі блоку ZLIB %u повідомляється про розмір блоку %#x, але мало " "бути вказано розмір %#x." #: src/data/sys-file-reader.c:3641 #, c-format msgid "" "ZLIB block descriptor %u reported block size %#x, when at most %#x was " "expected." msgstr "" "У дескрипторі блоку ZLIB %u повідомляється про розмір блоку %#x, але мало " "бути вказано розмір, що не перевищує %#x." #: src/data/sys-file-reader.c:3653 #, c-format msgid "" "ZLIB block descriptor %u reports compressed size %u and uncompressed size %u." msgstr "" "У дескрипторі блоку ZLIB %u повідомляється про розмір стиснених даних %u та " "розмір нестиснених даних %u." #: src/data/sys-file-reader.c:3665 #, c-format msgid "" "ZLIB trailer is at offset %#llx but %#llx would be expected from block " "descriptors." msgstr "" "Кінцівку ZLIB розташовано на позиції %#llx, але якщо брати до уваги " "дескриптори блоків, мало бути %#llx." #: src/data/sys-file-reader.c:3684 #, c-format msgid "ZLIB initialization failed (%s)." msgstr "Помилка під час спроби ініціалізувати ZLIB (%s)." #: src/data/sys-file-reader.c:3699 #, c-format msgid "Inconsistency at end of ZLIB stream (%s)." msgstr "Непослідовність наприкінці потоку даних ZLIB (%s)." #: src/data/sys-file-reader.c:3758 #, c-format msgid "ZLIB stream inconsistency (%s)." msgstr "Непослідовність у потоці даних ZLIB (%s)." #: src/data/sys-file-reader.c:3782 msgid "Unexpected end of ZLIB compressed data." msgstr "Неочікуване завершення стиснених даних ZLIB." #: src/data/sys-file-reader.c:3820 msgid "SPSS System File" msgstr "системний файл SPSS" #: src/data/sys-file-writer.c:210 #, c-format msgid "Unknown system file version %d. Treating as version %d." msgstr "Невідома версія системного файла, %d. Вважаємо версію рівною %d." #: src/data/sys-file-writer.c:256 #, c-format msgid "Error opening `%s' for writing as a system file: %s." msgstr "" "Помилка під час спроби відкрити «%s» для запису у форматі системного файла: " "%s." #: src/data/sys-file-writer.c:1271 #, c-format msgid "An I/O error occurred writing system file `%s'." msgstr "Під час спроби записати системний файл «%s» сталася помилка." #: src/data/sys-file-writer.c:1378 #, c-format msgid "Failed to initialize ZLIB for compression (%s)." msgstr "Не вдалося ініціалізувати ZLIB для стискання (%s)." #: src/data/sys-file-writer.c:1407 #, c-format msgid "Failed to complete ZLIB stream compression (%s)." msgstr "Не вдалося завершити стискання потоку даних ZLIB (%s)." #: src/data/sys-file-writer.c:1449 #, c-format msgid "ZLIB stream compression failed (%s)." msgstr "Помилка під час спроби стискання потоку даних ZLIB (%s)." #: src/data/sys-file-writer.c:1491 #, c-format msgid "%s: Seek failed (%s)." msgstr "%s: помилка позиціювання (%s)." #: src/data/variable.c:58 msgid "Left" msgstr "Ліворуч" #: src/data/variable.c:59 msgid "Right" msgstr "Праворуч" #: src/data/variable.c:60 msgid "Center" msgstr "За центром" #: src/data/variable.c:66 msgid "Nominal" msgstr "Іменна" #: src/data/variable.c:67 msgid "Ordinal" msgstr "Порядкова" #: src/data/variable.c:68 src/language/stats/ks-one-sample.c:300 msgid "Scale" msgstr "Масштаб" #: src/data/variable.c:74 msgid "Input" msgstr "Ввід" #. TRANSLATORS: This will be part of a filename. Please avoid whitespace. #: src/data/variable.c:75 src/output/spv/spv-writer.c:213 #: src/ui/gui/psppire-output-window.c:547 msgid "Output" msgstr "Вивід" #: src/data/variable.c:76 msgid "Both" msgstr "Обидва" #: src/data/variable.c:77 src/language/dictionary/sys-file-info.c:237 #: src/ui/gui/psppire-dialog-action-crosstabs.c:86 #: src/ui/gui/psppire-dialog-action-crosstabs.c:98 #: src/ui/gui/psppire-dialog-action-crosstabs.c:133 #: src/ui/gui/psppire-dialog-action-crosstabs.c:141 #: src/ui/gui/psppire-variable-sheet.c:408 src/ui/gui/var-display.c:34 msgid "None" msgstr "Немає" #: src/data/variable.c:78 msgid "Partition" msgstr "Поділ" #: src/data/variable.c:79 src/ui/gui/reliability.ui:37 msgid "Split" msgstr "Поділ" #: src/data/variable.c:729 #, c-format msgid "%s (%s)" msgstr "%s (%s)" #: src/data/variable.c:1339 msgid "" "At least one case in the data file had a weight value that was user-missing, " "system-missing, zero, or negative. These case(s) were ignored." msgstr "" "Значення ваги принаймні одного зі спостережень у файлі даних є пропущеним " "користувачем, пропущеним системою, нулем або від'ємним значенням. Такі " "спостереження буде проігноровано." #: src/language/command.c:207 src/language/stats/graph.c:749 #: src/language/stats/graph.c:755 src/language/stats/graph.c:789 #: src/language/stats/graph.c:794 src/language/stats/graph.c:799 #: src/language/stats/graph.c:852 src/language/stats/graph.c:857 #: src/language/stats/graph.c:862 src/language/stats/graph.c:867 #: src/language/stats/graph.c:872 src/language/stats/graph.c:877 #: src/language/stats/graph.c:882 src/language/utilities/set.q:236 #, c-format msgid "%s is not yet implemented." msgstr "%s ще не реалізовано." #: src/language/command.c:212 #, c-format msgid "%s may be used only in testing mode." msgstr "%s можна використовувати лише у режимі тестування." #: src/language/command.c:217 #, c-format msgid "%s may be used only in enhanced syntax mode." msgstr "%s можна використовувати лише у розширеному синтаксичному режимі." #: src/language/command.c:345 msgid "expecting command name" msgstr "мало бути вказано назву команди" #: src/language/command.c:347 #, c-format msgid "Unknown command `%s'." msgstr "Невідома команда: «%s»." #: src/language/command.c:380 #, c-format msgid "%s is allowed only before the active dataset has been defined." msgstr "" "%s можна використовувати лише перед визначенням активного набору даних." #: src/language/command.c:384 #, c-format msgid "%s is allowed only after the active dataset has been defined." msgstr "%s можна використовувати лише після визначення активного набору даних." #: src/language/command.c:388 src/language/command.c:392 #, c-format msgid "%s is allowed only inside %s." msgstr "%s можна використовувати лише всередині %s." #: src/language/command.c:399 src/language/command.c:403 #, c-format msgid "" "%s is allowed only before the active dataset has been defined or inside %s." msgstr "" "%s можна використовувати лише перед визначенням активного набору даних або " "всередині %s." #: src/language/command.c:407 src/language/command.c:411 #, c-format msgid "" "%s is allowed only after the active dataset has been defined or inside %s." msgstr "" "%s можна використовувати лише після визначення активного набору даних або " "всередині %s." #: src/language/command.c:415 #, c-format msgid "%s is allowed only inside %s or inside %s." msgstr "%s можна використовувати лише всередині %s або всередині %s." #: src/language/command.c:421 #, c-format msgid "" "%s is allowed only after the active dataset has been defined, inside INPUT " "PROGRAM, or inside FILE TYPE." msgstr "" "%s можна використовувати лише після визначення активного набору даних, у " "межах INPUT PROGRAM або у межах FILE TYPE." #: src/language/command.c:426 #, c-format msgid "" "%s is allowed only before the active dataset has been defined, inside INPUT " "PROGRAM, or inside FILE TYPE." msgstr "" "%s можна використовувати лише перед визначенням активного набору даних, у " "межах INPUT PROGRAM або у межах FILE TYPE." #: src/language/command.c:444 src/language/command.c:447 #, c-format msgid "%s is not allowed inside %s." msgstr "%s не можна використовувати всередині %s." #: src/language/command.c:529 src/language/utilities/host.c:272 #: src/language/utilities/permissions.c:105 #, c-format msgid "This command not allowed when the %s option is set." msgstr "Цю команду не можна використовувати, якщо встановлено параметр %s." #: src/language/command.c:545 #, c-format msgid "Error removing `%s': %s." msgstr "Помилка під час спроби вилучити «%s»: %s." #: src/language/lexer/lexer.c:296 #, c-format msgid "expecting %s" msgstr "мало бути %s" #: src/language/lexer/lexer.c:300 #, c-format msgid "expecting %s or %s" msgstr "мало бути %s або %s" #: src/language/lexer/lexer.c:304 #, c-format msgid "expecting %s, %s, or %s" msgstr "мало бути %s, %s або %s" #: src/language/lexer/lexer.c:309 #, c-format msgid "expecting %s, %s, %s, or %s" msgstr "мало бути %s, %s, %s або %s" #: src/language/lexer/lexer.c:314 #, c-format msgid "expecting %s, %s, %s, %s, or %s" msgstr "мало бути %s, %s, %s, %s або %s" #: src/language/lexer/lexer.c:319 #, c-format msgid "expecting %s, %s, %s, %s, %s, or %s" msgstr "мало бути %s, %s, %s, %s, %s або %s" #: src/language/lexer/lexer.c:325 #, c-format msgid "expecting %s, %s, %s, %s, %s, %s, or %s" msgstr "мало бути %s, %s, %s, %s, %s, %s або %s" #: src/language/lexer/lexer.c:331 #, c-format msgid "expecting %s, %s, %s, %s, %s, %s, %s, or %s" msgstr "мало бути %s, %s, %s, %s, %s, %s, %s або %s" #: src/language/lexer/lexer.c:351 #, c-format msgid "Subcommand %s may only be specified once." msgstr "Підкоманду %s можна вказувати лише раз." #: src/language/lexer/lexer.c:363 #, c-format msgid "Required subcommand %s was not specified." msgstr "Обов'язкову підкоманду %s не було вказано." #: src/language/lexer/lexer.c:371 #, c-format msgid "%s may only be specified once within subcommand %s" msgstr "%s можна вказувати лише один раз у межах підкоманди %s" #: src/language/lexer/lexer.c:380 #, c-format msgid "Required %s specification missing from %s subcommand" msgstr "У підкоманді %2$s пропущено специфікацію %1$s" #: src/language/lexer/lexer.c:399 msgid "Syntax error at end of input" msgstr "Синтаксична помилка наприкінці вхідних даних" #: src/language/lexer/lexer.c:420 src/language/xforms/select-if.c:60 #: src/language/stats/autorecode.c:206 src/language/stats/npar.c:503 #: src/language/data-io/print-space.c:83 msgid "expecting end of command" msgstr "команду мало бути завершено" #: src/language/lexer/lexer.c:631 msgid "expecting string" msgstr "мало бути вказано рядок" #: src/language/lexer/lexer.c:660 msgid "expecting integer" msgstr "мало бути вказано ціле число" #: src/language/lexer/lexer.c:673 msgid "expecting number" msgstr "мало бути вказано число" #: src/language/lexer/lexer.c:685 msgid "expecting identifier" msgstr "мало бути вказано ідентифікатор" #: src/language/lexer/lexer.c:1272 msgid "Syntax error at end of command" msgstr "Синтаксична помилка наприкінці команди" #: src/language/lexer/lexer.c:1281 #, c-format msgid "Syntax error at `%s'" msgstr "Синтаксична помилка у «%s»" #: src/language/lexer/lexer.c:1284 msgid "Syntax error" msgstr "Синтаксична помилка" #: src/language/lexer/lexer.c:1470 #, c-format msgid "String of hex digits has %d characters, which is not a multiple of 2" msgstr "" "Рядок шістнадцяткових цифр складається з %d символів. Кількість символів не " "є кратною до 2." #: src/language/lexer/lexer.c:1477 #, c-format msgid "`%c' is not a valid hex digit" msgstr "«%c» не є коректною шістнадцятковою цифрою" #: src/language/lexer/lexer.c:1482 #, c-format msgid "" "Unicode string contains %d bytes, which is not in the valid range of 1 to 8 " "bytes" msgstr "" "У рядку Unicode міститься %d байтів, що не є коректним діапазоном від 1 до 8 " "байтів" #: src/language/lexer/lexer.c:1488 #, c-format msgid "U+%04X is not a valid Unicode code point" msgstr "U+%04X не є коректним пунктом у таблиці Unicode" #: src/language/lexer/lexer.c:1493 msgid "Unterminated string constant" msgstr "Незавершена рядкова константа" #: src/language/lexer/lexer.c:1497 #, c-format msgid "Missing exponent following `%s'" msgstr "Пропущено E з наступним «%s»" #: src/language/lexer/lexer.c:1502 msgid "Unexpected `.' in middle of command" msgstr "Посеред команди мало бути вказано «.»" #: src/language/lexer/lexer.c:1508 #, c-format msgid "Bad character %s in input" msgstr "Помилковий символ %s у вхідних даних" #: src/language/lexer/lexer.c:1603 #, c-format msgid "Opening `%s': %s." msgstr "Відкриваємо «%s»: %s." #: src/language/lexer/lexer.c:1647 #, c-format msgid "Error closing `%s': %s." msgstr "Помилка під час спроби закрити «%s»: %s." #: src/language/lexer/subcommand-list.c:118 #, c-format msgid "No more than %d %s subcommands allowed." msgstr "Можна використовувати не більше %d підкоманд %s." #: src/language/lexer/format-parser.c:77 msgid "expecting valid format specifier" msgstr "мало бути вказано коректний специфікатор формату" #: src/language/lexer/format-parser.c:116 #: src/language/lexer/format-parser.c:143 src/language/utilities/output.c:108 #: src/language/data-io/data-list.c:453 src/language/data-io/get-data.c:638 #: src/language/data-io/placement-parser.c:236 #, c-format msgid "Unknown format type `%s'." msgstr "Невідомий тип формату, «%s»." #: src/language/lexer/format-parser.c:122 #, c-format msgid "Format specifier `%s' lacks required width." msgstr "У специфікаторі формату «%s» пропущено обов'язкове значення ширини." #: src/language/lexer/format-parser.c:138 msgid "expecting format type" msgstr "мало бути вказано тип форматування" #: src/language/lexer/value-parser.c:66 #, c-format msgid "" "The high end of the range (%.*g) is below the low end (%.*g). The range " "will be treated as if reversed." msgstr "" "Верхня межа діапазону (%.*g) є нижчою за нижню межу (%.*g). Межі буде " "переставлено місцями." #: src/language/lexer/value-parser.c:74 #, c-format msgid "Ends of range are equal (%.*g)." msgstr "Кінці діапазону є рівними (%.*g)." #: src/language/lexer/value-parser.c:82 #, c-format msgid "%s or %s must be part of a range." msgstr "%s або %s має бути частиною діапазону." #: src/language/lexer/value-parser.c:112 msgid "System-missing value is not valid here." msgstr "Тут не можна використовувати пропущене системою значення." #: src/language/lexer/variable-parser.c:86 utilities/pspp-convert.c:83 msgid "expecting variable name" msgstr "мало бути вказано назву змінної" #: src/language/lexer/variable-parser.c:96 #, c-format msgid "%s is not a variable name." msgstr "%s не є назвою змінної." #: src/language/lexer/variable-parser.c:206 #, c-format msgid "" "%s is not a numeric variable. It will not be included in the variable list." msgstr "%s не є числовою змінною. Її не буде включено до списку змінних." #: src/language/lexer/variable-parser.c:209 #, c-format msgid "" "%s is not a string variable. It will not be included in the variable list." msgstr "%s не є рядковою змінною. Її не буде включено до списку змінних." #: src/language/lexer/variable-parser.c:213 #, c-format msgid "Scratch variables (such as %s) are not allowed here." msgstr "Тут не можна використовувати ортоторпні змінні (зокрема %s)." #: src/language/lexer/variable-parser.c:217 #, c-format msgid "" "%s and %s are not the same type. All variables in this variable list must " "be of the same type. %s will be omitted from the list." msgstr "" "%s і %s не належать до одного типу. Усі змінні у цьому списку змінних мають " "належати до одного типу. %s буде вилучено зі списку." #: src/language/lexer/variable-parser.c:223 #, c-format msgid "" "%s and %s are string variables with different widths. All variables in this " "variable list must have the same width. %s will be omitted from the list." msgstr "" "Рядкові змінні %s і %s мають різну довжину. Довжина усіх змінних у списку " "змінних має бути рівною. %s буде викинуто зі списку." #: src/language/lexer/variable-parser.c:228 #: src/language/lexer/variable-parser.c:447 #, c-format msgid "Variable %s appears twice in variable list." msgstr "Змінну %s вказано у списку змінних двічі." #: src/language/lexer/variable-parser.c:341 #, c-format msgid "%s TO %s is not valid syntax since %s precedes %s in the dictionary." msgstr "" "%s TO %s є некоректною синтаксичною конструкцією, оскільки %s передує %s у " "словнику." #: src/language/lexer/variable-parser.c:349 #, c-format msgid "" "When using the TO keyword to specify several variables, both variables must " "be from the same variable dictionaries, of either ordinary, scratch, or " "system variables. %s is a %s variable, whereas %s is %s." msgstr "" "Якщо використовується ключове слово TO для визначення декількох змінних, " "обидві змінні мають належати до одного словника порядкових, октоторпних або " "системних змінних. %s є змінною %s, а %s — %s." #: src/language/lexer/variable-parser.c:424 #, c-format msgid "`%s' cannot be used with TO because it does not end in a digit." msgstr "" "«%s» не можна використовувати з TO, оскільки назва змінної не завершується " "на цифру." #: src/language/lexer/variable-parser.c:432 #, c-format msgid "Numeric suffix on `%s' is larger than supported with TO." msgstr "Числовий суфікс «%s» перевищує підтримуваний для TO." #: src/language/lexer/variable-parser.c:505 msgid "Scratch variables not allowed here." msgstr "Тут не можна використовувати октоторпні змінні." #: src/language/lexer/variable-parser.c:529 msgid "Prefixes don't match in use of TO convention." msgstr "Префікси не узгоджуються з синтаксисом TO." #: src/language/lexer/variable-parser.c:534 msgid "Bad bounds in use of TO convention." msgstr "У TO використано помилкові межі." #: src/language/xforms/compute.c:150 src/language/xforms/compute.c:205 #, c-format msgid "" "When executing COMPUTE: SYSMIS is not a valid value as an index into vector " "%s." msgstr "" "Під час виконання COMPUTE: SYSMIS не є коректним значенням індексу у векторі " "%s." #: src/language/xforms/compute.c:154 src/language/xforms/compute.c:212 #, c-format msgid "" "When executing COMPUTE: %.*g is not a valid value as an index into vector %s." msgstr "" "Під час виконання COMPUTE: %.*g не є коректним значенням індексу у векторі " "%s." #: src/language/xforms/compute.c:356 #, c-format msgid "There is no vector named %s." msgstr "Немає вектора з назвою %s." #: src/language/xforms/count.c:125 msgid "Destination cannot be a string variable." msgstr "Призначення не може бути рядковою змінною." #: src/language/xforms/sample.c:76 msgid "The sampling factor must be between 0 and 1 exclusive." msgstr "" "Коефіцієнт поділу на вибірки має належати проміжку від 0 до 1 не включаючи " "кінців." #: src/language/xforms/sample.c:96 #, c-format msgid "Cannot sample %d observations from a population of %d." msgstr "" "Не вдалося призначити до вибірки %d спостережень з сукупності у %d " "спостережень." #: src/language/xforms/recode.c:261 msgid "" "Inconsistent target variable types. Target variables must be all numeric or " "all string." msgstr "" "Несумісні типи змінних призначення. Змінні призначення мають бути або усі " "числові, або усі рядкові." #: src/language/xforms/recode.c:282 msgid "CONVERT requires string input values and numeric output values." msgstr "" "Для виконання CONVERT потрібен рядок вхідних значень і числові значення " "виведених результатів." #: src/language/xforms/recode.c:339 #, c-format msgid "%s is not allowed with string variables." msgstr "%s не можна використовувати з рядковими змінними." #: src/language/xforms/recode.c:422 msgid "expecting output value" msgstr "мало бути отримано вихідне значення" #: src/language/xforms/recode.c:479 #, c-format msgid "" "%zu variable(s) cannot be recoded into %zu variable(s). Specify the same " "number of variables as source and target variables." msgstr "" "%zu змінних неможливо перекодувати у %zu змінних. Вам слід використовувати " "однакову кількість початкових змінних і змінних призначення." #: src/language/xforms/recode.c:494 #, c-format msgid "" "There is no variable named %s. (All string variables specified on INTO must " "already exist. Use the STRING command to create a string variable.)" msgstr "" "Не існує змінної з назвою %s. (Усі рядкові змінні вказані у INTO мають вже " "існувати. Скористайтеся командою STRING для створення рядкової змінної.)" #: src/language/xforms/recode.c:510 #, c-format msgid "INTO is required with %s input values and %s output values." msgstr "" "З вхідними значеннями %s та вихідними значеннями %s слід використовувати " "INTO." #: src/language/xforms/recode.c:523 #, c-format msgid "Type mismatch. Cannot store %s data in %s variable %s." msgstr "" "Невідповідність типів. Не вдалося зберегти дані %s data у змінній %s %s." #: src/language/xforms/recode.c:566 #, c-format msgid "" "Cannot recode because the variable %s would require a width of %d bytes or " "greater, but it has a width of only %d bytes." msgstr "" "Перекодування неможливе, оскільки для змінної %s потрібна ширина %d байтів " "або більше, але маємо ширину лише у %d байтів." #: src/language/xforms/select-if.c:100 msgid "Syntax error expecting OFF or BY. Turning off case filtering." msgstr "" "Синтаксична помилка. Мало бути використано OFF або BY. Вимикаємо " "фільтрування спостережень." #: src/language/xforms/select-if.c:115 msgid "The filter variable must be numeric." msgstr "Змінна фільтрування має бути числовою." #: src/language/xforms/select-if.c:121 msgid "The filter variable may not be scratch." msgstr "Змінна фільтрування не може бути октоторпною." #: src/language/control/control-stack.c:49 #, c-format msgid "%s without %s." msgstr "%s без %s." #: src/language/control/control-stack.c:77 #, c-format msgid "This command must appear inside %s...%s, without intermediate %s...%s." msgstr "" "Цю команду можна використовувати лише у %s...%s, без проміжних %s...%s." #: src/language/control/control-stack.c:94 #, c-format msgid "This command cannot appear outside %s...%s." msgstr "Цю команду не можна використовувати поза межами %s...%s." #: src/language/control/do-if.c:180 #, c-format msgid "This command may not follow %s in %s ... %s." msgstr "Після цієї команди у %2$s...%3$s не може бути ніякого %1$s." #: src/language/control/loop.c:211 msgid "Only one index clause may be specified." msgstr "Можна використовувати лише один вираз індексу." #: src/language/control/repeat.c:120 #, c-format msgid "Dummy variable name `%s' hides dictionary variable `%s'." msgstr "Назва фіктивною змінної, «%s», маскує змінну зі словника, «%s»." #: src/language/control/repeat.c:126 #, c-format msgid "Dummy variable name `%s' is given twice." msgstr "Назву фіктивної змінної «%s» вказано двічі." #: src/language/control/repeat.c:170 #, c-format msgid "" "Dummy variable `%s' had %zu substitutions, so `%s' must also, but %zu were " "specified." msgstr "" "Фіктивна змінна «%s» мала %zu підставлянь, отже «%s» повинна мати стільки ж, " "але було вказано лише %zu." #: src/language/control/repeat.c:379 msgid "Ranges may only have integer bounds." msgstr "Межами діапазону можуть бути лише цілі числа." #: src/language/control/repeat.c:393 #, c-format msgid "%ld TO %ld is an invalid range." msgstr "%ld TO %ld не є коректним визначенням діапазону." #: src/language/control/repeat.c:443 #, c-format msgid "No matching %s." msgstr "Немає відповідного %s." #: src/language/control/temporary.c:44 msgid "" "This command may only appear once between procedures and procedure-like " "commands." msgstr "" "Цю команду можна використовувати лише один раз між процедурами і " "процедуроподібними командами." #: src/language/dictionary/attributes.c:104 msgid "Attribute array index must be between 1 and 65535." msgstr "Індекс у масиві атрибутів має належати діапазону від 1 до 65535." #: src/language/dictionary/apply-dictionary.c:74 #, c-format msgid "Variable %s is %s in target file, but %s in source file." msgstr "" "Змінна %s дорівнює %s у файлі призначення, але дорівнює %s у файлі джерела." #: src/language/dictionary/apply-dictionary.c:110 msgid "No matching variables found between the source and target files." msgstr "Не знайдено відповідних змінних між файлами джерела і призначення." #: src/language/dictionary/delete-variables.c:40 #: src/language/dictionary/modify-variables.c:79 #: src/language/dictionary/rename-variables.c:51 #, c-format msgid "" "%s may not be used after %s. Temporary transformations will be made " "permanent." msgstr "" "%s не можна використовувати після %s. Тимчасові перетворення буде зроблено " "постійними." #: src/language/dictionary/delete-variables.c:48 #: src/language/dictionary/modify-variables.c:312 #, c-format msgid "" "%s may not be used to delete all variables from the active dataset " "dictionary. Use %s instead." msgstr "" "%s не можна використовувати усі змінні з активного словника набору даних. " "Скористайтеся краще %s." #: src/language/dictionary/missing-values.c:70 #, c-format msgid "" "Cannot mix numeric variables (e.g. %s) and string variables (e.g. %s) within " "a single list." msgstr "" "Не можна поєднувати числові змінні (наприклад %s) і рядкові змінні " "(наприклад %s) у межах одного списку." #: src/language/dictionary/missing-values.c:91 msgid "" "Too many numeric missing values. At most three individual values or one " "value and one range are allowed." msgstr "" "Занадто багато пропущених числових значень. Можна пропускати не більше трьох " "окремих значень або одного значення і одного діапазону значень." #: src/language/dictionary/missing-values.c:126 #, c-format msgid "Truncating missing value to maximum acceptable length (%d bytes)." msgstr "" "Обрізаємо пропущене значення до максимальної доступних довжини (%d байтів)." #: src/language/dictionary/missing-values.c:137 msgid "" "Too many string missing values. At most three individual values are allowed." msgstr "" "Занадто багато пропущених рядкових значень. Можна пропускати не більше трьох " "окремих значень." #: src/language/dictionary/missing-values.c:154 #, c-format msgid "Missing values provided are too long to assign to variable of width %d." msgstr "" "Надані пропущені значення є надто довгими для призначення змінним ширини %d." #: src/language/dictionary/modify-variables.c:145 msgid "Cannot specify ALL after specifying a set of variables." msgstr "Не можна вказувати ALL після визначення набору змінних." #: src/language/dictionary/modify-variables.c:221 #: src/language/dictionary/rename-variables.c:76 #, c-format msgid "" "Differing number of variables in old name list (%zu) and in new name list " "(%zu)." msgstr "" "Різні кількості змінних у списку старих назв (%zu) і у списку нових назв " "(%zu)." #: src/language/dictionary/modify-variables.c:244 #: src/language/dictionary/modify-variables.c:294 #, c-format msgid "" "%s subcommand may be given at most once. It may not be given in conjunction " "with the %s subcommand." msgstr "" "Підкоманду %s можна використовувати не більше одного разу. Її не можна " "використовувати у поєднанні з підкомандою %s." #: src/language/dictionary/modify-variables.c:331 #, c-format msgid "Unrecognized subcommand name `%s'." msgstr "Невідома назва підкоманди, «%s»." #: src/language/dictionary/modify-variables.c:334 msgid "Subcommand name expected." msgstr "Мало бути вказано підкоманду." #: src/language/dictionary/mrsets.c:117 #, c-format msgid "" "VARIABLES specified only variable %s on %s, but at least two variables are " "required." msgstr "" "VARIABLES визначено лише змінну %s на %s, але потрібні принаймні дві змінні." #: src/language/dictionary/mrsets.c:150 msgid "Numeric VALUE must be an integer." msgstr "Числове значення VALUE має бути цілим." #: src/language/dictionary/mrsets.c:230 src/language/dictionary/mrsets.c:268 #, c-format msgid "" "MDGROUP subcommand for group %s specifies a string VALUE, but the variables " "specified for this group are numeric." msgstr "" "Підкоманда MDGROUP для групи %s визначає значення рядка VALUE, але змінні, " "вказані для цієї групи, є числовими." #: src/language/dictionary/mrsets.c:254 #, c-format msgid "" "VALUE string on MDGROUP subcommand for group %s is %d bytes long, but it " "must be no longer than the narrowest variable in the group, which is %s with " "a width of %d bytes." msgstr "" "Рядок VALUE у підкоманді MDGROUP для групи %s має довжину %d байтів, але " "його довжина не повинна перевищувати найкоротшу змінну у групі, тобто %s з " "довжиною %d." #: src/language/dictionary/mrsets.c:280 #, c-format msgid "" "MDGROUP subcommand for group %s specifies LABELSOURCE=VARLABEL but not " "CATEGORYLABELS=COUNTEDVALUES. Ignoring LABELSOURCE." msgstr "" "Підкоманда MDGROUP для групи %s визначає LABELSOURCE=VARLABEL, але не " "CATEGORYLABELS=COUNTEDVALUES. Ігноруємо LABELSOURCE." #: src/language/dictionary/mrsets.c:286 #, c-format msgid "" "MDGROUP subcommand for group %s specifies both LABEL and LABELSOURCE, but " "only one of these subcommands may be used at a time. Ignoring LABELSOURCE." msgstr "" "Підкоманда MDGROUP для групи %s визначає LABEL і LABELSOURCE, але одночасно " "можна використовувати лише одну з цих підкоманд. Ігноруємо LABELSOURCE." #: src/language/dictionary/mrsets.c:326 #, c-format msgid "" "Variables %s and %s specified as part of multiple dichotomy group %s have " "the same variable label. Categories represented by these variables will not " "be distinguishable in output." msgstr "" "Змінні %s і %s, вказані як частина групи кратною дихотомією %s, мають " "однакову мітку змінної. Категорії, які визначаються цими змінними, у " "виведених даних не можна буде розрізнити." #: src/language/dictionary/mrsets.c:356 #, c-format msgid "" "Variable %s specified as part of multiple dichotomy group %s (which has " "CATEGORYLABELS=COUNTEDVALUES) has no value label for its counted value. " "This category will not be distinguishable in output." msgstr "" "Змінна %s, вказана як частина групи кратної дихотомії %s (де " "CATEGORYLABELS=COUNTEDVALUES), не має мітки значення для підрахованого " "значення. У виведених даних цю категорію буде об'єднано з іншими." #: src/language/dictionary/mrsets.c:369 #, c-format msgid "" "Variables %s and %s specified as part of multiple dichotomy group %s (which " "has CATEGORYLABELS=COUNTEDVALUES) have the same value label for the group's " "counted value. These categories will not be distinguishable in output." msgstr "" "Змінні %s та %s, вказані як частина групи кратної дихотомії %s (де " "CATEGORYLABELS=COUNTEDVALUES), мають однакову мітку значення для " "підрахованого значення у групі. У виведених даних відповідні категорії буде " "об'єднано." #: src/language/dictionary/mrsets.c:426 #, c-format msgid "" "Variables specified on MCGROUP should have the same categories, but %s and " "%s (and possibly others) in multiple category group %s have different value " "labels for value %s." msgstr "" "Змінні, вказані у MCGROUP мають належати до тих самих категорій. Втім, %s та " "%s (та, ймовірно, інші) змінні у групі з декількох категорій %s мають різні " "мітки значення для значення %s." #: src/language/dictionary/mrsets.c:484 #, c-format msgid "No multiple response set named %s." msgstr "Немає набору множини відповідей з назвою %s." #: src/language/dictionary/mrsets.c:533 msgid "" "The active dataset dictionary does not contain any multiple response sets." msgstr "" "У активному словнику набору даних не міститься жодних наборів множин " "відповідей." #: src/language/dictionary/mrsets.c:540 msgid "Multiple Response Sets" msgstr "Набори множин відповідей" #: src/language/dictionary/mrsets.c:543 #: src/language/dictionary/sys-file-info.c:446 #: src/language/dictionary/sys-file-info.c:733 #: src/language/stats/autorecode.c:375 src/language/data-io/data-parser.c:679 #: src/language/data-io/data-parser.c:725 src/language/data-io/print.c:434 msgid "Attributes" msgstr "Атрибути" #: src/language/dictionary/mrsets.c:544 #: src/language/dictionary/sys-file-info.c:191 #: src/language/dictionary/sys-file-info.c:301 #: src/language/dictionary/sys-file-info.c:302 #: src/language/dictionary/sys-file-info.c:455 #: src/language/dictionary/sys-file-info.c:570 #: src/ui/gui/psppire-var-sheet-header.c:67 src/ui/gui/compute.ui:157 msgid "Label" msgstr "Мітка" #: src/language/dictionary/mrsets.c:544 #: src/language/dictionary/sys-file-info.c:241 msgid "Encoding" msgstr "Кодування" #: src/language/dictionary/mrsets.c:544 msgid "Counted Value" msgstr "Раховане значення" #: src/language/dictionary/mrsets.c:544 msgid "Member Variables" msgstr "Змінні-учасники" #: src/language/dictionary/mrsets.c:547 #: src/language/dictionary/sys-file-info.c:470 #: src/ui/gui/psppire-var-sheet-header.c:55 msgid "Name" msgstr "Назва" #: src/language/dictionary/mrsets.c:564 msgid "Dichotomies" msgstr "Дихотомія" #: src/language/dictionary/mrsets.c:565 src/language/stats/logistic.c:1391 msgid "Categories" msgstr "Категорії" #: src/language/dictionary/numeric.c:67 #, c-format msgid "Format type %s may not be used with a numeric variable." msgstr "Тип форматування %s не можна застосовувати до числової змінної." #: src/language/dictionary/numeric.c:86 src/language/dictionary/numeric.c:153 #, c-format msgid "There is already a variable named %s." msgstr "Змінна з назвою %s вже існує." #: src/language/dictionary/numeric.c:138 #, c-format msgid "Format type %s may not be used with a string variable." msgstr "Тип форматування %s не можна застосовувати до рядкової змінної." #: src/language/dictionary/rename-variables.c:92 #, c-format msgid "Renaming would duplicate variable name %s." msgstr "Перейменування призведе до дублювання назви змінної %s." #: src/language/dictionary/split-file.c:75 msgid "Split Values" msgstr "Розділити значення" #: src/language/dictionary/split-file.c:76 #: src/language/dictionary/split-file.c:77 #: src/language/dictionary/sys-file-info.c:696 #: src/language/stats/chisquare.c:195 src/language/stats/cochran.c:156 #: src/language/stats/cochran.c:185 src/language/stats/examine.c:841 #: src/language/stats/reliability.c:648 src/language/stats/reliability.c:651 #: src/language/stats/crosstabs.q:1303 src/language/stats/crosstabs.q:1325 #: src/language/stats/crosstabs.q:1365 src/language/stats/crosstabs.q:1412 msgid "Value" msgstr "Значення" #: src/language/dictionary/split-file.c:79 #: src/language/dictionary/sys-file-info.c:734 #: src/language/stats/chisquare.c:246 src/language/stats/chisquare.c:328 #: src/language/stats/cochran.c:164 src/language/stats/correlations.c:100 #: src/language/stats/descriptives.c:1004 src/language/stats/friedman.c:226 #: src/language/stats/jonckheere-terpstra.c:377 #: src/language/stats/npar-summary.c:113 src/language/stats/quick-cluster.c:588 #: src/language/stats/runs.c:331 src/language/data-io/data-parser.c:683 #: src/language/data-io/data-parser.c:728 src/language/data-io/print.c:438 #: src/ui/gui/psppire-dictview.c:580 src/ui/gui/psppire-data-editor.c:502 msgid "Variable" msgstr "Змінна" #: src/language/dictionary/sys-file-info.c:184 msgid "File Information" msgstr "Інформація про файл" #: src/language/dictionary/sys-file-info.c:185 msgid "Attribute" msgstr "Атрибут" #: src/language/dictionary/sys-file-info.c:187 msgid "File" msgstr "Файл" #: src/language/dictionary/sys-file-info.c:194 msgid "Created" msgstr "Створено" #: src/language/dictionary/sys-file-info.c:203 msgid "Integer Format" msgstr "Цілочисельний формат" #: src/language/dictionary/sys-file-info.c:205 msgid "Big Endian" msgstr "Зворотний порядок" #: src/language/dictionary/sys-file-info.c:206 msgid "Little Endian" msgstr "Прямий порядок" #: src/language/dictionary/sys-file-info.c:207 #: src/language/dictionary/sys-file-info.c:216 #: src/language/dictionary/sys-file-info.c:223 src/language/utilities/set.q:930 msgid "Unknown" msgstr "Невідомо" #: src/language/dictionary/sys-file-info.c:209 msgid "Real Format" msgstr "Формат дійсних значень" #: src/language/dictionary/sys-file-info.c:211 msgid "IEEE 754 LE." msgstr "IEEE 754 LE." #: src/language/dictionary/sys-file-info.c:212 msgid "IEEE 754 BE." msgstr "IEEE 754 BE." #: src/language/dictionary/sys-file-info.c:213 msgid "VAX D." msgstr "VAX D." #: src/language/dictionary/sys-file-info.c:214 msgid "VAX G." msgstr "VAX G." #: src/language/dictionary/sys-file-info.c:215 msgid "IBM 390 Hex Long." msgstr "IBM 390 шіст. довгі." #: src/language/dictionary/sys-file-info.c:218 #: src/language/dictionary/sys-file-info.c:443 #: src/language/stats/binomial.c:199 src/language/stats/correlations.c:131 #: src/language/stats/correlations.c:159 src/language/stats/descriptives.c:585 #: src/language/stats/factor.c:1658 src/language/stats/factor.c:1701 #: src/language/stats/factor.c:1860 src/language/stats/factor.c:2074 #: src/language/stats/frequencies.c:1583 #: src/language/stats/kruskal-wallis.c:254 #: src/language/stats/kruskal-wallis.c:303 #: src/language/stats/ks-one-sample.c:316 src/language/stats/logistic.c:1187 #: src/language/stats/mann-whitney.c:254 src/language/stats/means.c:718 #: src/language/stats/means.c:800 src/language/stats/median.c:358 #: src/language/stats/oneway.c:985 src/language/stats/oneway.c:1157 #: src/language/stats/reliability.c:591 src/language/stats/regression.c:924 #: src/language/stats/t-test-one-sample.c:132 #: src/language/stats/t-test-paired.c:157 src/language/data-io/list.c:104 #: src/ui/gui/variable-info.ui:25 msgid "Variables" msgstr "Змінні" #: src/language/dictionary/sys-file-info.c:221 src/language/stats/examine.c:929 #: src/language/stats/means.c:697 src/language/stats/reliability.c:548 #: src/language/stats/crosstabs.q:930 msgid "Cases" msgstr "Спостереження" #: src/language/dictionary/sys-file-info.c:226 src/language/stats/oneway.c:980 #: src/ui/gui/psppire-var-sheet-header.c:58 src/ui/gui/compute.ui:303 msgid "Type" msgstr "Тип" #: src/language/dictionary/sys-file-info.c:230 msgid "Weight" msgstr "Вага" #: src/language/dictionary/sys-file-info.c:233 msgid "Not weighted" msgstr "Не зважено" #: src/language/dictionary/sys-file-info.c:235 msgid "Compression" msgstr "Стиснення" #: src/language/dictionary/sys-file-info.c:245 #: src/language/dictionary/sys-file-info.c:424 #: src/language/dictionary/sys-file-info.c:426 msgid "Documents" msgstr "Документи" #: src/language/dictionary/sys-file-info.c:305 #: src/language/dictionary/sys-file-info.c:430 msgid "(none)" msgstr "(немає)" #: src/language/dictionary/sys-file-info.c:393 msgid "No variables to display." msgstr "Немає змінних для показу." #: src/language/dictionary/sys-file-info.c:404 msgid "Macros not supported." msgstr "Підтримки макросів не передбачено." #: src/language/dictionary/sys-file-info.c:426 msgid "Document" msgstr "Документ" #: src/language/dictionary/sys-file-info.c:454 msgid "Position" msgstr "Розташування" #: src/language/dictionary/sys-file-info.c:456 msgid "Measurement Level" msgstr "Рівень вимірювання" #: src/language/dictionary/sys-file-info.c:457 #: src/ui/gui/psppire-var-sheet-header.c:85 msgid "Role" msgstr "Роль" #: src/language/dictionary/sys-file-info.c:458 #: src/ui/gui/psppire-var-sheet-header.c:61 src/ui/gui/compute.ui:215 msgid "Width" msgstr "Ширина" #: src/language/dictionary/sys-file-info.c:459 msgid "Alignment" msgstr "Вирівнювання" #: src/language/dictionary/sys-file-info.c:460 #: src/language/dictionary/sys-file-info.c:734 msgid "Print Format" msgstr "Формат друку" #: src/language/dictionary/sys-file-info.c:461 msgid "Write Format" msgstr "Формат запису" #: src/language/dictionary/sys-file-info.c:462 #: src/ui/gui/missing-val-dialog.c:379 src/ui/gui/psppire-var-sheet-header.c:73 #: src/ui/gui/examine.ui:416 src/ui/gui/t-test.ui:105 msgid "Missing Values" msgstr "Пропущені значення" #: src/language/dictionary/sys-file-info.c:567 #: src/ui/gui/psppire-var-sheet-header.c:70 src/ui/gui/val-labs-dialog.c:489 #: src/ui/gui/val-labs-dialog.ui:194 msgid "Value Labels" msgstr "Мітки значень" #: src/language/dictionary/sys-file-info.c:573 msgid "Variable Value" msgstr "Значення змінної" #: src/language/dictionary/sys-file-info.c:577 msgid "User-missing value" msgstr "Пропущене користувачем значення" #: src/language/dictionary/sys-file-info.c:693 msgid "Variable and Dataset Attributes" msgstr "Атрибути змінних і набору даних" #: src/language/dictionary/sys-file-info.c:699 msgid "Variable and Name" msgstr "Змінна і назва" #: src/language/dictionary/sys-file-info.c:702 msgid "(dataset)" msgstr "(набір даних)" #: src/language/dictionary/sys-file-info.c:722 msgid "No vectors defined." msgstr "Векторів не визначено." #: src/language/dictionary/sys-file-info.c:732 msgid "Vectors" msgstr "Вектори" #: src/language/dictionary/sys-file-info.c:736 msgid "Vector and Position" msgstr "Вектор і позиція" #: src/language/dictionary/sys-file-info.c:998 msgid "No valid encodings found." msgstr "Коректних кодувань не знайдено." #: src/language/dictionary/sys-file-info.c:1004 #, c-format msgid "Usable encodings for %s." msgstr "Придатні кодування для %s." #: src/language/dictionary/sys-file-info.c:1007 #, c-format msgid "" "Encodings that can successfully read %s (by specifying the encoding name on " "the GET command's ENCODING subcommand). Encodings that yield identical text " "are listed together." msgstr "" "Кодування, дані у яких може бути успішно використано для читання %s, якщо " "підкоманді ENCODING команди GET буде вказано назву кодування. Кодування, " "результати застосування яких є однаковими, показано разом." #: src/language/dictionary/sys-file-info.c:1012 #: src/language/dictionary/sys-file-info.c:1013 msgid "Encodings" msgstr "Кодування" #: src/language/dictionary/sys-file-info.c:1042 #, c-format msgid "%s Encoded Text Strings" msgstr "Текстові рядки у кодуванні %s" #: src/language/dictionary/sys-file-info.c:1046 msgid "" "Text strings in the file dictionary that the previously listed encodings " "interpret differently, along with the interpretations." msgstr "" "Текстові рядки у словнику з файла з різною інтерпретацією, відповідно до " "наведеного вище списку кодувань, та отримані інтерпретації." #: src/language/dictionary/sys-file-info.c:1049 src/output/text-item.c:57 #: src/ui/gui/psppire-import-assistant.c:885 msgid "Text" msgstr "Текст" #: src/language/dictionary/sys-file-info.c:1059 msgid "Purpose" msgstr "Призначення" #: src/language/dictionary/value-labels.c:154 #, c-format msgid "Truncating value label to %d bytes." msgstr "Обрізаємо мітку значення до %d байтів." #: src/language/dictionary/vector.c:66 #, c-format msgid "A vector named %s already exists." msgstr "Вектор з назвою %s вже існує." #: src/language/dictionary/vector.c:74 #, c-format msgid "Vector name %s is given twice." msgstr "Назву вектора %s вказано двічі." #: src/language/dictionary/vector.c:98 msgid "A slash must separate each vector specification in VECTOR's long form." msgstr "" "У розширеній формі запису VECTOR специфікації окремих векторів слід " "розділяти символом похилої риски." #: src/language/dictionary/vector.c:131 msgid "Vectors must have at least one element." msgstr "Вектори мають складатися принаймні з одного елемента." #: src/language/dictionary/vector.c:151 msgid "expecting vector length" msgstr "мало бути вказано довжину вектора" #: src/language/dictionary/vector.c:170 #, c-format msgid "%s is an existing variable name." msgstr "%s є назвою змінної, яка вже існує." #: src/language/dictionary/variable-display.c:121 msgid "Variable display width must be a positive integer." msgstr "Значення ширини показу змінної має бути додатним і цілим." #: src/language/dictionary/weight.c:49 msgid "The weighting variable must be numeric." msgstr "Зважувана змінна має бути числовою." #: src/language/dictionary/weight.c:54 msgid "The weighting variable may not be scratch." msgstr "Змінна зважування не може бути октоторпною." #: src/language/tests/moments-test.c:50 msgid "expecting weight value" msgstr "мало бути використано значення ваги" #: src/language/utilities/cd.c:45 src/language/utilities/include.c:173 #, fuzzy, c-format #| msgid "Cannot change directory to %s: %s " msgid "Cannot change directory to %s: %s" msgstr "Не вдалося змінити каталог на %s: %s " #: src/language/utilities/date.c:33 #, c-format msgid "Only %s is currently implemented." msgstr "У поточній версії реалізовано лише %s." #: src/language/utilities/host.c:60 #, fuzzy #| msgid "Command shell not supported on this platform." msgid "Time limit not supported on this platform." msgstr "На цій платформі не передбачено підтримки командної оболонки." #: src/language/utilities/host.c:74 #, c-format msgid "%s: Command exited with status %d." msgstr "" #: src/language/utilities/host.c:95 #, fuzzy, c-format #| msgid "failed to create temporary file" msgid "Failed to create temporary file (%s)." msgstr "не вдалося створити тимчасовий файл" #: src/language/utilities/host.c:102 #, c-format msgid "/dev/null: Failed to open (%s)." msgstr "" #: src/language/utilities/host.c:117 #, c-format msgid "Couldn't fork: %s." msgstr "Не вдалося виконати розгалуження: %s." #: src/language/utilities/host.c:193 #, c-format msgid "While running \"%s\", waiting for child process failed (%s)." msgstr "" #: src/language/utilities/host.c:203 #, c-format msgid "Command \"%s\" timed out." msgstr "" #: src/language/utilities/host.c:205 #, c-format msgid "Command \"%s\" terminated by signal %d." msgstr "" #: src/language/utilities/host.c:212 msgid "Command or shell not found" msgstr "" #: src/language/utilities/host.c:214 msgid "Could not invoke command or shell" msgstr "" #: src/language/utilities/host.c:217 #, c-format msgid "Command \"%s\" exited with status %d (%s)." msgstr "" #: src/language/utilities/host.c:220 #, c-format msgid "Command \"%s\" exited with status %d." msgstr "" #: src/language/utilities/host.c:230 #, c-format msgid "Command \"%s\" output could not be read (%s)." msgstr "" #: src/language/utilities/title.c:88 #, c-format msgid " (Entered %s)" msgstr " (Введено %s)" #: src/language/utilities/include.c:73 #, c-format msgid "Can't find `%s' in include file search path." msgstr "Не вдалося знайти «%s» у каталогах включених файлів." #: src/language/utilities/output.c:128 #, c-format msgid "Unknown cell class %s." msgstr "Невідомий клас комірок %s." #: src/language/utilities/permissions.c:113 #, c-format msgid "Cannot stat %s: %s" msgstr "Не вдалося виконати статистичну обробку %s: %s" #: src/language/utilities/permissions.c:127 #, c-format msgid "Cannot change mode of %s: %s" msgstr "Не вдалося змінити режим доступу до %s: %s" #: src/language/stats/aggregate.c:96 msgid "Sum of values" msgstr "Сума значень" #: src/language/stats/aggregate.c:97 msgid "Mean average" msgstr "Середнє" #: src/language/stats/aggregate.c:98 msgid "Median average" msgstr "Медіана" #: src/language/stats/aggregate.c:99 #: src/ui/gui/psppire-dialog-action-descriptives.c:40 #: src/ui/gui/psppire-dialog-action-frequencies.c:41 msgid "Standard deviation" msgstr "Стандартне відхилення" #: src/language/stats/aggregate.c:100 #: src/ui/gui/psppire-dialog-action-descriptives.c:42 msgid "Maximum value" msgstr "Максимальне значення" #: src/language/stats/aggregate.c:101 #: src/ui/gui/psppire-dialog-action-descriptives.c:41 msgid "Minimum value" msgstr "Мінімальне значення" #: src/language/stats/aggregate.c:102 msgid "Percentage greater than" msgstr "Відсоток, що є вищим за" #: src/language/stats/aggregate.c:103 msgid "Percentage less than" msgstr "Відсоток, що є нижчим за" #: src/language/stats/aggregate.c:104 msgid "Percentage included in range" msgstr "Відсоток для включення до діапазону" #: src/language/stats/aggregate.c:105 msgid "Percentage excluded from range" msgstr "Відсоток для виключення до діапазону" #: src/language/stats/aggregate.c:106 msgid "Fraction greater than" msgstr "Частка, більша за" #: src/language/stats/aggregate.c:107 msgid "Fraction less than" msgstr "Частка, менша за" #: src/language/stats/aggregate.c:108 msgid "Fraction included in range" msgstr "Частка включення до діапазону" #: src/language/stats/aggregate.c:109 msgid "Fraction excluded from range" msgstr "Частка виключення з діапазону" #: src/language/stats/aggregate.c:110 msgid "Number of cases" msgstr "Кількість спостережень" #: src/language/stats/aggregate.c:111 msgid "Number of cases (unweighted)" msgstr "Кількість спостережень (незважена)" #: src/language/stats/aggregate.c:112 msgid "Number of missing values" msgstr "Кількість пропущених значень" #: src/language/stats/aggregate.c:113 msgid "Number of missing values (unweighted)" msgstr "Кількість пропущених значень (незважена)" #: src/language/stats/aggregate.c:114 msgid "First non-missing value" msgstr "Перше непропущене значення" #: src/language/stats/aggregate.c:115 msgid "Last non-missing value" msgstr "Останнє непропущене значення" #: src/language/stats/aggregate.c:258 msgid "" "When PRESORTED is specified, specifying sorting directions with (A) or (D) " "has no effect. Output data will be sorted the same way as the input data." msgstr "" "Якщо вказано PRESORTED, визначення порядку за допомогою (A) або (D) не " "призведе ні до яких наслідків. Виведені дані буде упорядковано у той самий " "спосіб, що і вхідні дані." #: src/language/stats/aggregate.c:448 msgid "expecting aggregation function" msgstr "мало бути вказано функцію агрегування" #: src/language/stats/aggregate.c:460 #, c-format msgid "Unknown aggregation function %s." msgstr "Невідома функція агрегування %s." #: src/language/stats/aggregate.c:513 #, c-format msgid "Missing argument %zu to %s." msgstr "Пропущено аргумент %zu функції %s." #: src/language/stats/aggregate.c:522 #, c-format msgid "Arguments to %s must be of same type as source variables." msgstr "" "Аргументи %s повинні належати до того самого типу, що і початкові змінні." #: src/language/stats/aggregate.c:541 #, c-format msgid "" "Number of source variables (%zu) does not match number of target variables " "(%zu)." msgstr "" "Кількість змінних у джерелі (%zu) не збігається з кількість змінних " "призначення (%zu)." #: src/language/stats/aggregate.c:557 #, c-format msgid "" "The value arguments passed to the %s function are out-of-order. They will " "be treated as if they had been specified in the correct order." msgstr "" "Значення-аргументи, передані функції %s, не впорядковано. Обробку буде " "здійснено так, наче аргументи було вказано у належному порядку." #: src/language/stats/aggregate.c:631 #, c-format msgid "" "Variable name %s is not unique within the aggregate file dictionary, which " "contains the aggregate variables and the break variables." msgstr "" "Назва змінної, %s, не є унікальною у межах словника файла для агрегування, у " "якому містяться змінні для агрегування та змінні розбиття." #: src/language/stats/autorecode.c:152 #, c-format msgid "Source variable count (%zu) does not match target variable count (%zu)." msgstr "" "Кількість початкових змінних (%zu) не збігається з кількістю змінних " "призначення (%zu)." #: src/language/stats/autorecode.c:164 #, c-format msgid "Target variable %s duplicates existing variable %s." msgstr "Змінна призначення %s дублює вже створену змінну %s." #: src/language/stats/autorecode.c:221 #, c-format msgid "" "With GROUP, variables may not mix string variables (such as %s) and numeric " "variables (such as %s)." msgstr "" "У GROUP не може бути суміші рядкових змінних (зокрема %s) та числових " "змінних (зокрема %s)." #: src/language/stats/autorecode.c:363 msgid "Recoding grouped variables." msgstr "Записування групованих змінних." #: src/language/stats/autorecode.c:365 #, c-format msgid "Recoding %s into %s (%s)." msgstr "Записуємо %s до %s (%s)." #: src/language/stats/autorecode.c:369 #, c-format msgid "Recoding %s into %s." msgstr "Записуємо %s до %s." #: src/language/stats/autorecode.c:376 src/ui/gui/recode.ui:209 msgid "New Value" msgstr "Нове значення" #: src/language/stats/autorecode.c:376 msgid "Value Label" msgstr "Мітка значення" #: src/language/stats/autorecode.c:379 msgid "Old Value" msgstr "Попереднє значення" #: src/language/stats/binomial.c:138 #, c-format msgid "Variable %s is not dichotomous" msgstr "Змінна %s не є дихотомічною" #: src/language/stats/binomial.c:182 src/ui/gui/binomial.ui:30 msgid "Binomial Test" msgstr "Біноміальна перевірка" #: src/language/stats/binomial.c:186 src/language/stats/chisquare.c:183 #: src/language/stats/chisquare.c:239 src/language/stats/chisquare.c:322 #: src/language/stats/cochran.c:188 src/language/stats/correlations.c:94 #: src/language/stats/correlations.c:145 src/language/stats/descriptives.c:991 #: src/language/stats/examine.c:602 src/language/stats/examine.c:742 #: src/language/stats/examine.c:836 src/language/stats/examine.c:925 #: src/language/stats/factor.c:1755 src/language/stats/factor.c:1878 #: src/language/stats/factor.c:1908 src/language/stats/factor.c:2068 #: src/language/stats/factor.c:2102 src/language/stats/frequencies.c:302 #: src/language/stats/frequencies.c:1579 src/language/stats/frequencies.c:1586 #: src/language/stats/friedman.c:250 src/language/stats/glm.c:729 #: src/language/stats/kruskal-wallis.c:249 #: src/language/stats/kruskal-wallis.c:297 #: src/language/stats/ks-one-sample.c:278 src/language/stats/logistic.c:1170 #: src/language/stats/logistic.c:1300 src/language/stats/logistic.c:1330 #: src/language/stats/jonckheere-terpstra.c:361 #: src/language/stats/mann-whitney.c:184 src/language/stats/mann-whitney.c:247 #: src/language/stats/means.c:757 src/language/stats/means.c:811 #: src/language/stats/mcnemar.c:222 src/language/stats/median.c:315 #: src/language/stats/median.c:350 src/language/stats/npar-summary.c:106 #: src/language/stats/oneway.c:973 src/language/stats/oneway.c:1051 #: src/language/stats/oneway.c:1150 src/language/stats/oneway.c:1238 #: src/language/stats/oneway.c:1373 src/language/stats/quick-cluster.c:746 #: src/language/stats/reliability.c:543 src/language/stats/reliability.c:584 #: src/language/stats/reliability.c:633 src/language/stats/reliability.c:644 #: src/language/stats/roc.c:969 src/language/stats/roc.c:1067 #: src/language/stats/regression.c:867 src/language/stats/regression.c:899 #: src/language/stats/regression.c:1023 src/language/stats/regression.c:1089 #: src/language/stats/runs.c:318 src/language/stats/sign.c:102 #: src/language/stats/t-test-indep.c:193 src/language/stats/t-test-indep.c:259 #: src/language/stats/t-test-one-sample.c:68 #: src/language/stats/t-test-one-sample.c:125 #: src/language/stats/t-test-paired.c:150 #: src/language/stats/t-test-paired.c:193 #: src/language/stats/t-test-paired.c:238 src/language/stats/wilcoxon.c:243 #: src/language/stats/wilcoxon.c:282 src/language/stats/crosstabs.q:925 #: src/language/stats/crosstabs.q:1253 src/language/stats/crosstabs.q:1293 #: src/language/stats/crosstabs.q:1302 src/language/stats/crosstabs.q:1331 #: src/language/stats/crosstabs.q:1373 src/language/stats/crosstabs.q:1418 #: src/ui/gui/crosstabs.ui:499 src/ui/gui/oneway.ui:615 msgid "Statistics" msgstr "Статистика" #: src/language/stats/binomial.c:187 src/language/stats/chisquare.c:240 #: src/language/stats/chisquare.c:252 msgid "Category" msgstr "Категорія" #: src/language/stats/binomial.c:188 src/language/stats/cochran.c:189 #: src/language/stats/correlations.c:97 src/language/stats/correlations.c:155 #: src/language/stats/descriptives.c:993 src/language/stats/examine.c:926 #: src/language/stats/frequencies.c:1588 src/language/stats/friedman.c:251 #: src/language/stats/kruskal-wallis.c:250 #: src/language/stats/ks-one-sample.c:279 src/language/stats/logistic.c:1331 #: src/language/stats/jonckheere-terpstra.c:369 #: src/language/stats/mann-whitney.c:185 src/language/stats/means.c:710 #: src/language/stats/means-calc.c:439 src/language/stats/mcnemar.c:223 #: src/language/stats/median.c:351 src/language/stats/npar-summary.c:107 #: src/language/stats/oneway.c:1052 src/language/stats/reliability.c:544 #: src/language/stats/sign.c:69 src/language/stats/sign.c:70 #: src/language/stats/t-test-indep.c:194 #: src/language/stats/t-test-one-sample.c:126 #: src/language/stats/t-test-paired.c:151 #: src/language/stats/t-test-paired.c:194 src/language/stats/wilcoxon.c:244 #: src/language/stats/crosstabs.q:926 msgid "N" msgstr "N" #: src/language/stats/binomial.c:189 msgid "Observed Prop." msgstr "Спост. співв." #: src/language/stats/binomial.c:190 msgid "Test Prop." msgstr "Тест. співв." #: src/language/stats/binomial.c:192 src/language/stats/mcnemar.c:224 #: src/language/stats/sign.c:103 src/language/stats/wilcoxon.c:288 #: src/language/stats/crosstabs.q:1306 msgid "Exact Sig. (2-tailed)" msgstr "Точна значущість (двобічна)" #: src/language/stats/binomial.c:193 src/language/stats/mcnemar.c:225 #: src/language/stats/sign.c:104 src/language/stats/wilcoxon.c:289 #: src/language/stats/crosstabs.q:1307 msgid "Exact Sig. (1-tailed)" msgstr "Точна значущість (однобічна)" #: src/language/stats/binomial.c:195 msgid "Groups" msgstr "Групи" #: src/language/stats/binomial.c:196 msgid "Group 1" msgstr "Група 1" #: src/language/stats/binomial.c:196 msgid "Group 2" msgstr "Група 2" #: src/language/stats/binomial.c:196 src/language/stats/chisquare.c:223 #: src/language/stats/chisquare.c:257 src/language/stats/examine.c:930 #: src/language/stats/factor.c:1756 src/language/stats/frequencies.c:344 #: src/language/stats/glm.c:811 src/language/stats/kruskal-wallis.c:285 #: src/language/stats/logistic.c:1336 src/language/stats/mann-whitney.c:197 #: src/language/stats/means.c:706 src/language/stats/oneway.c:982 #: src/language/stats/oneway.c:1072 src/language/stats/reliability.c:549 #: src/language/stats/regression.c:1031 src/language/stats/sign.c:75 #: src/language/stats/wilcoxon.c:250 #: src/ui/gui/psppire-dialog-action-crosstabs.c:93 #: src/language/stats/crosstabs.q:931 src/language/stats/crosstabs.q:1218 msgid "Total" msgstr "Загалом" #: src/language/stats/chisquare.c:171 #, c-format msgid "" "CHISQUARE test specified %d expected values, but variable %s has %zu " "distinct values." msgstr "" "У перевірці CHISQUARE задано %d очікуваних значення, але у змінній %s " "виявлено лише %zu різних значення." #: src/language/stats/chisquare.c:184 src/language/stats/chisquare.c:241 msgid "Observed N" msgstr "N зі спостережень" #: src/language/stats/chisquare.c:185 src/language/stats/chisquare.c:242 msgid "Expected N" msgstr "Очікуване N" #: src/language/stats/chisquare.c:186 src/language/stats/chisquare.c:243 #: src/language/stats/regression.c:1031 #: src/ui/gui/psppire-dialog-action-crosstabs.c:95 #: src/language/stats/crosstabs.q:1267 msgid "Residual" msgstr "Залишки" #: src/language/stats/chisquare.c:235 src/language/stats/cochran.c:150 #: src/language/stats/median.c:305 src/language/stats/sign.c:66 #: src/ui/gui/frequencies.ui:676 msgid "Frequencies" msgstr "Частоти" #: src/language/stats/chisquare.c:320 src/language/stats/cochran.c:181 #: src/language/stats/friedman.c:246 src/language/stats/kruskal-wallis.c:295 #: src/language/stats/mann-whitney.c:244 src/language/stats/mcnemar.c:219 #: src/language/stats/median.c:347 src/language/stats/sign.c:100 #: src/language/stats/wilcoxon.c:279 msgid "Test Statistics" msgstr "Критерії перевірки" #: src/language/stats/chisquare.c:323 msgid "Chi-square" msgstr "χ-квадрат" #: src/language/stats/chisquare.c:324 src/language/stats/cochran.c:191 #: src/language/stats/examine.c:675 src/language/stats/factor.c:2107 #: src/language/stats/friedman.c:257 src/language/stats/glm.c:733 #: src/language/stats/kruskal-wallis.c:299 src/language/stats/logistic.c:1174 #: src/language/stats/median.c:354 src/language/stats/oneway.c:975 #: src/language/stats/oneway.c:1242 src/language/stats/regression.c:1025 #: src/language/stats/t-test-indep.c:267 #: src/language/stats/t-test-one-sample.c:75 #: src/language/stats/t-test-paired.c:253 src/language/stats/crosstabs.q:1304 msgid "df" msgstr "df" #: src/language/stats/chisquare.c:325 src/language/stats/cochran.c:192 #: src/language/stats/friedman.c:258 src/language/stats/kruskal-wallis.c:300 #: src/language/stats/median.c:355 msgid "Asymp. Sig." msgstr "Асимпт. знач." #: src/language/stats/cochran.c:111 msgid "More than two values encountered. Cochran Q test will not be run." msgstr "Виявлено понад два значення. Буде виконано перевірку Q Кохрена." #: src/language/stats/cochran.c:153 #, c-format msgid "Success (%.*g)" msgstr "Успіх (%.*g)" #: src/language/stats/cochran.c:154 #, c-format msgid "Failure (%.*g)" msgstr "Помилка (%.*g)" #: src/language/stats/cochran.c:190 msgid "Cochran's Q" msgstr "Q Кохрена" #: src/language/stats/correlations.c:91 src/language/stats/descriptives.c:987 #: src/language/stats/factor.c:2065 src/language/stats/npar-summary.c:102 msgid "Descriptive Statistics" msgstr "Описова статистика" #: src/language/stats/correlations.c:95 src/language/stats/descriptives.c:108 #: src/language/stats/examine.c:742 src/language/stats/factor.c:2069 #: src/language/stats/frequencies.c:141 src/language/stats/graph.c:211 #: src/language/stats/ks-one-sample.c:290 src/language/stats/means-calc.c:438 #: src/language/stats/npar-summary.c:108 src/language/stats/oneway.c:1052 #: src/language/stats/t-test-indep.c:195 #: src/language/stats/t-test-one-sample.c:127 #: src/language/stats/t-test-paired.c:152 #: src/language/stats/t-test-paired.c:241 #: src/ui/gui/psppire-dialog-action-descriptives.c:39 #: src/ui/gui/psppire-dialog-action-frequencies.c:40 msgid "Mean" msgstr "Середнє" #: src/language/stats/correlations.c:96 src/language/stats/examine.c:751 #: src/language/stats/factor.c:2070 src/language/stats/ks-one-sample.c:290 #: src/language/stats/means-calc.c:440 src/language/stats/npar-summary.c:109 #: src/language/stats/oneway.c:1052 src/language/stats/t-test-indep.c:196 #: src/language/stats/t-test-one-sample.c:128 #: src/language/stats/t-test-paired.c:153 #: src/language/stats/t-test-paired.c:242 msgid "Std. Deviation" msgstr "Стд. відхилення" #: src/language/stats/correlations.c:126 msgid "Correlations" msgstr "Кореляції" #: src/language/stats/correlations.c:146 msgid "Pearson Correlation" msgstr "Кореляція Пірсона" #: src/language/stats/correlations.c:147 src/language/stats/oneway.c:1243 #: src/language/stats/t-test-indep.c:268 #: src/language/stats/t-test-one-sample.c:76 #: src/language/stats/t-test-paired.c:254 msgid "Sig. (2-tailed)" msgstr "Знач. (двобічна)" #: src/language/stats/correlations.c:147 src/language/stats/factor.c:1913 msgid "Sig. (1-tailed)" msgstr "Знач. (однобічна)" #: src/language/stats/correlations.c:151 msgid "Cross-products" msgstr "Добутки" #: src/language/stats/correlations.c:152 msgid "Covariance" msgstr "Коваріація" #: src/language/stats/correlations.c:165 msgid "Significant at .05 level" msgstr "Значущість на рівні .05" #: src/language/stats/correlations.c:234 msgid "The data for the chosen variables are all missing or empty." msgstr "Немає даних для вибраних змінних або змінні не містять даних" #: src/language/stats/correlations.c:390 src/language/stats/descriptives.c:368 #: src/language/data-io/list.c:166 msgid "No variables specified." msgstr "Не вказано змінних." #: src/language/stats/descriptives.c:109 src/language/stats/frequencies.c:142 #: src/language/stats/means-calc.c:445 src/language/stats/t-test-indep.c:197 #: src/language/stats/t-test-one-sample.c:129 #: src/language/stats/t-test-paired.c:154 #: src/language/stats/t-test-paired.c:243 msgid "S.E. Mean" msgstr "Ст. похибка" #: src/language/stats/descriptives.c:110 src/language/stats/frequencies.c:145 msgid "Std Dev" msgstr "Стд. відхил." #: src/language/stats/descriptives.c:111 src/language/stats/examine.c:750 #: src/language/stats/frequencies.c:146 src/language/stats/means-calc.c:450 #: src/ui/gui/psppire-dialog-action-descriptives.c:46 #: src/ui/gui/psppire-dialog-action-frequencies.c:45 msgid "Variance" msgstr "Розсіювання" #: src/language/stats/descriptives.c:112 src/language/stats/examine.c:752 #: src/language/stats/frequencies.c:147 src/language/stats/means-calc.c:451 #: src/ui/gui/psppire-dialog-action-descriptives.c:47 #: src/ui/gui/psppire-dialog-action-frequencies.c:50 msgid "Kurtosis" msgstr "Ексцес" #: src/language/stats/descriptives.c:113 src/language/stats/frequencies.c:148 #: src/language/stats/means-calc.c:452 msgid "S.E. Kurt" msgstr "Ексц. ст. похибки" #: src/language/stats/descriptives.c:114 src/language/stats/examine.c:752 #: src/language/stats/frequencies.c:149 src/language/stats/means-calc.c:453 #: src/ui/gui/psppire-dialog-action-descriptives.c:48 #: src/ui/gui/psppire-dialog-action-frequencies.c:46 msgid "Skewness" msgstr "Асиметрія" #: src/language/stats/descriptives.c:115 src/language/stats/frequencies.c:150 #: src/language/stats/means-calc.c:454 msgid "S.E. Skew" msgstr "Нах. ст. похибки" #: src/language/stats/descriptives.c:116 src/language/stats/examine.c:751 #: src/language/stats/frequencies.c:151 src/language/stats/means-calc.c:449 #: src/ui/gui/psppire-dialog-action-descriptives.c:43 #: src/ui/gui/psppire-dialog-action-frequencies.c:48 msgid "Range" msgstr "Діапазон" #: src/language/stats/descriptives.c:117 src/language/stats/examine.c:751 #: src/language/stats/frequencies.c:152 src/language/stats/graph.c:214 #: src/language/stats/ks-one-sample.c:285 src/language/stats/means-calc.c:447 #: src/language/stats/npar-summary.c:110 src/language/stats/oneway.c:1061 #: src/ui/gui/psppire-dialog-action-descriptives.c:41 #: src/ui/gui/psppire-dialog-action-frequencies.c:42 msgid "Minimum" msgstr "Мінімум" #: src/language/stats/descriptives.c:118 src/language/stats/examine.c:751 #: src/language/stats/frequencies.c:153 src/language/stats/graph.c:213 #: src/language/stats/ks-one-sample.c:285 src/language/stats/means-calc.c:448 #: src/language/stats/npar-summary.c:110 src/language/stats/oneway.c:1061 #: src/ui/gui/psppire-dialog-action-descriptives.c:42 #: src/ui/gui/psppire-dialog-action-frequencies.c:43 msgid "Maximum" msgstr "Максимум" #: src/language/stats/descriptives.c:119 src/language/stats/frequencies.c:154 #: src/language/stats/graph.c:212 src/language/stats/means-calc.c:446 #: src/ui/gui/psppire-dialog-action-descriptives.c:44 #: src/ui/gui/psppire-dialog-action-frequencies.c:53 msgid "Sum" msgstr "Сума" #: src/language/stats/descriptives.c:350 #, c-format msgid "Z-score variable name %s would be a duplicate variable name." msgstr "Назва змінної Z-оцінки %s буде дублікатом назви змінної." #: src/language/stats/descriptives.c:401 msgid "" "DESCRIPTIVES with Z scores ignores TEMPORARY. Temporary transformations " "will be made permanent." msgstr "" "DESCRIPTIVES з Z-оцінками ігнорує TEMPORARY. Тимчасові перетворення буде " "перетворено на остаточні." #: src/language/stats/descriptives.c:478 msgid "expecting statistic name: reverting to default" msgstr "неочікувана назва статистики: повертаємося до типової назви" #: src/language/stats/descriptives.c:561 msgid "" "Ran out of generic names for Z-score variables. There are only 126 generic " "names: ZSC001-ZSC0999, STDZ01-STDZ09, ZZZZ01-ZZZZ09, ZQZQ01-ZQZQ09." msgstr "" "Вичерпано діапазон типових назв для змінних Z-оцінок. Передбачено лише 126 " "типових назв: ZSC001-ZSC0999, STDZ01-STDZ09, ZZZZ01-ZZZZ09, ZQZQ01-ZQZQ09." #: src/language/stats/descriptives.c:579 msgid "Mapping of Variables to Z-scores" msgstr "Прив'язка змінних до Z-оцінок." #: src/language/stats/descriptives.c:581 msgid "Names" msgstr "Назва" #: src/language/stats/descriptives.c:582 src/language/stats/glm.c:739 #: src/language/stats/regression.c:1030 msgid "Source" msgstr "Джерело" #: src/language/stats/descriptives.c:582 msgid "Target" msgstr "Призначення" #: src/language/stats/descriptives.c:659 #, c-format msgid "Internal error processing Z scores. Please report this to %s." msgstr "" "Внутрішня помилка під час обробки Z-оцінок. Будь ласка, повідомте про неї на " "%s." #: src/language/stats/descriptives.c:759 #, c-format msgid "Z-score of %s" msgstr "Z-оцінка %s" #: src/language/stats/descriptives.c:1028 src/language/stats/roc.c:1029 msgid "Valid N (listwise)" msgstr "К-ть коректних (загалом)" #: src/language/stats/descriptives.c:1028 msgid "Missing N (listwise)" msgstr "К-ть пропущених (загалом)" #: src/language/stats/examine.c:75 msgid " (missing)" msgstr " (не вистачає)" #: src/language/stats/examine.c:225 #, c-format msgid "Boxplot of %s vs. %s" msgstr "Скринькова діаграма залежності %s від %s" #: src/language/stats/examine.c:231 src/language/stats/examine.c:338 #, c-format msgid "Boxplot of %s" msgstr "Скринькова діаграма %s" #: src/language/stats/examine.c:321 msgid "Boxplot" msgstr "Скринькова діаграма" #: src/language/stats/examine.c:418 msgid "Not creating NP plot because data set is empty." msgstr "Креслення NP не створено, оскільки набір даних є порожнім." #: src/language/stats/examine.c:478 #, c-format msgid "Not creating spreadlevel chart for %s" msgstr "Діаграму розсіювання за рівнями для %s не створюємо" #: src/language/stats/examine.c:585 msgid "User-missing value." msgstr "Пропущене користувачем значення." #: src/language/stats/examine.c:591 src/language/stats/examine.c:595 #: src/language/stats/frequencies.c:1606 msgid "Percentiles" msgstr "Процентилі" #: src/language/stats/examine.c:603 src/math/percentiles.c:37 msgid "Weighted Average" msgstr "Зважене середнє" #: src/language/stats/examine.c:603 msgid "Tukey's Hinges" msgstr "Кутові точки Тукі" #: src/language/stats/examine.c:610 src/language/stats/examine.c:685 #: src/language/stats/examine.c:759 src/language/stats/examine.c:858 #: src/language/stats/examine.c:938 src/language/stats/mann-whitney.c:200 #: src/language/stats/median.c:319 src/language/stats/t-test-indep.c:227 #: src/language/stats/t-test-indep.c:282 #: src/language/stats/t-test-one-sample.c:87 msgid "Dependent Variables" msgstr "Залежні змінні" #: src/language/stats/examine.c:669 msgid "Tests of Normality" msgstr "Тести нормальності" #: src/language/stats/examine.c:673 msgid "Shapiro-Wilk" msgstr "Шапіро-Вілк" #: src/language/stats/examine.c:674 src/language/stats/examine.c:739 #: src/ui/gui/psppire-checkbox-treeview.c:73 msgid "Statistic" msgstr "Статистика" #: src/language/stats/examine.c:676 src/language/stats/factor.c:2108 #: src/language/stats/glm.c:736 src/language/stats/logistic.c:1175 #: src/language/stats/oneway.c:978 src/language/stats/oneway.c:1154 #: src/language/stats/oneway.c:1376 src/language/stats/regression.c:906 #: src/language/stats/regression.c:1028 src/language/stats/t-test-indep.c:263 #: src/language/stats/t-test-paired.c:196 msgid "Sig." msgstr "Знач." #: src/language/stats/examine.c:735 src/language/stats/oneway.c:1045 #: src/ui/gui/descriptives.ui:25 msgid "Descriptives" msgstr "Описова статистика" #: src/language/stats/examine.c:738 msgid "Aspect" msgstr "Аспект" #: src/language/stats/examine.c:739 src/language/stats/oneway.c:1053 #: src/language/stats/oneway.c:1240 src/language/stats/oneway.c:1375 #: src/language/stats/roc.c:975 src/language/stats/regression.c:902 msgid "Std. Error" msgstr "Станд. похибка" #: src/language/stats/examine.c:745 src/language/stats/oneway.c:1056 #, c-format msgid "%g%% Confidence Interval for Mean" msgstr "%g%%-ий довірчий інтервал для середнього" #: src/language/stats/examine.c:747 src/language/stats/oneway.c:1058 #: src/language/stats/oneway.c:1382 src/language/stats/roc.c:982 #: src/language/stats/regression.c:913 msgid "Lower Bound" msgstr "Нижня межа" #: src/language/stats/examine.c:748 src/language/stats/oneway.c:1059 #: src/language/stats/oneway.c:1383 src/language/stats/roc.c:983 #: src/language/stats/regression.c:914 msgid "Upper Bound" msgstr "Верхня межа" #: src/language/stats/examine.c:750 msgid "5% Trimmed Mean" msgstr "5% обрізане середнє" #: src/language/stats/examine.c:750 src/language/stats/frequencies.c:143 #: src/language/stats/means-calc.c:442 src/language/stats/median.c:352 #: src/ui/gui/psppire-dialog-action-frequencies.c:52 msgid "Median" msgstr "Медіана" #: src/language/stats/examine.c:752 msgid "Interquartile Range" msgstr "Міжквартильний діапазон" #: src/language/stats/examine.c:832 msgid "Extreme Values" msgstr "Екстремуми" #: src/language/stats/examine.c:840 src/language/stats/quick-cluster.c:664 #: src/language/data-io/list.c:110 msgid "Case Number" msgstr "Номер спостереження" #: src/language/stats/examine.c:844 msgid "Order" msgstr "Порядок" #. TRANSLATORS: This is a noun, not an adjective. #: src/language/stats/examine.c:850 msgid "Extreme" msgstr "Екстремум" #: src/language/stats/examine.c:851 msgid "Highest" msgstr "Найвищий" #: src/language/stats/examine.c:851 msgid "Lowest" msgstr "Найнижчий" #: src/language/stats/examine.c:921 src/language/stats/logistic.c:1328 #: src/language/stats/means.c:694 src/language/stats/reliability.c:540 msgid "Case Processing Summary" msgstr "Резюме обробки спостережень" #: src/language/stats/examine.c:927 src/language/stats/frequencies.c:304 #: src/language/stats/frequencies.c:1494 src/language/stats/logistic.c:1332 #: src/language/stats/means.c:713 src/language/stats/reliability.c:545 #: src/language/stats/crosstabs.q:927 msgid "Percent" msgstr "Відсоток" #: src/language/stats/examine.c:929 src/language/stats/frequencies.c:321 #: src/language/stats/frequencies.c:1590 src/language/stats/quick-cluster.c:766 #: src/language/stats/reliability.c:548 src/language/stats/crosstabs.q:931 msgid "Valid" msgstr "Чинний" #: src/language/stats/examine.c:929 src/language/stats/frequencies.c:336 #: src/language/stats/frequencies.c:1591 src/language/stats/crosstabs.q:931 msgid "Missing" msgstr "Не вистачає" #: src/language/stats/examine.c:1550 #, c-format msgid "%s may not be negative. Using default value (%g)." msgstr "%s не може бути від'ємним. Використовуємо типове значення (%g)." #: src/language/stats/examine.c:1587 msgid "Percentiles must lie in the range (0, 100)" msgstr "Процентилі мають належати діапазону (0, 100)" #: src/language/stats/examine.c:1777 #, c-format msgid "%s and %s are mutually exclusive" msgstr "%s та %s є взаємовиключними" #: src/language/stats/factor.c:1121 #, c-format msgid "Matrix input for %s must be either COV or CORR" msgstr "Вхідною матрицею для %s має бути або COV, або CORR" #: src/language/stats/factor.c:1519 msgid "Factor analysis on a single variable is not useful." msgstr "Факторний аналіз однієї змінної позбавлено сенсу." #: src/language/stats/factor.c:1523 msgid "Factor analysis without variables is not possible." msgstr "Факторний аналіз без змінних неможливий." #: src/language/stats/factor.c:1634 msgid "Component Number" msgstr "Кількість компонент" #: src/language/stats/factor.c:1634 msgid "Factor Number" msgstr "Номер фактора" #: src/language/stats/factor.c:1648 src/language/stats/factor.c:1651 msgid "Communalities" msgstr "Спільності" #: src/language/stats/factor.c:1653 msgid "Initial" msgstr "Початковий" #: src/language/stats/factor.c:1655 msgid "Extraction" msgstr "Видобування" #: src/language/stats/factor.c:1697 src/language/stats/factor.c:1777 #: src/language/stats/factor.c:1839 msgid "Component" msgstr "Компонент" #: src/language/stats/factor.c:1697 src/language/stats/factor.c:1777 #: src/language/stats/factor.c:1839 msgid "Factor" msgstr "Фактор" #: src/language/stats/factor.c:1752 msgid "Total Variance Explained" msgstr "Розподіл сукупної дисперсії" #: src/language/stats/factor.c:1758 #, no-c-format msgid "% of Variance" msgstr "%o дисперсії" #: src/language/stats/factor.c:1760 #, no-c-format msgid "Cumulative %" msgstr "Накопичуваний відсоток" #: src/language/stats/factor.c:1763 msgid "Phase" msgstr "Фаза" #: src/language/stats/factor.c:1765 msgid "Initial Eigenvalues" msgstr "Початкові власні значення" #: src/language/stats/factor.c:1769 msgid "Extraction Sums of Squared Loadings" msgstr "Видобуті суми піднесених до квадрата навантажень" #: src/language/stats/factor.c:1773 msgid "Rotation Sums of Squared Loadings" msgstr "Обернуті суми піднесених до квадрата навантажень" #: src/language/stats/factor.c:1835 msgid "Factor Correlation Matrix" msgstr "Матриця кореляцій факторів" #: src/language/stats/factor.c:1842 msgid "Factor 2" msgstr "Фактор 2" #: src/language/stats/factor.c:1874 msgid "Anti-Image Matrices" msgstr "Антиобразні матриці" #: src/language/stats/factor.c:1879 msgid "Anti-image Covariance" msgstr "Антиобразна коваріація" #: src/language/stats/factor.c:1880 msgid "Anti-image Correlation" msgstr "Антиобразна кореляція" #: src/language/stats/factor.c:1901 msgid "Correlation Matrix" msgstr "Матриця кореляцій" #: src/language/stats/factor.c:1910 src/language/stats/t-test-paired.c:195 msgid "Correlation" msgstr "Кореляція" #: src/language/stats/factor.c:1947 msgid "Determinant" msgstr "Визначник" #: src/language/stats/factor.c:1958 msgid "Covariance Matrix" msgstr "Коваріаційна матриця" #: src/language/stats/factor.c:1990 msgid "" "The dataset contains no complete observations. No analysis will be performed." msgstr "" "У наборі даних не міститься повних спостережень. Аналіз виконано не буде." #: src/language/stats/factor.c:2014 msgid "The dataset has no complete covariance or correlation matrix." msgstr "У наборі даних немає повної матриці коваріації або кореляції." #: src/language/stats/factor.c:2071 msgid "Analysis N" msgstr "N у аналізі" #: src/language/stats/factor.c:2099 msgid "KMO and Bartlett's Test" msgstr "Перевірка КМО і Бартлета" #: src/language/stats/factor.c:2103 msgid "Kaiser-Meyer-Olkin Measure of Sampling Adequacy" msgstr "Міра Кайзера-Меєра-Олкіна адекватності поділу на вибірки" #: src/language/stats/factor.c:2105 msgid "Bartlett's Test of Sphericity" msgstr "Перевірка сферичності Бартлета" #: src/language/stats/factor.c:2106 msgid "Approx. Chi-Square" msgstr "Приблизне χ-квадрат" #: src/language/stats/factor.c:2154 #, c-format msgid "" "The %s criteria result in zero factors extracted. Therefore no analysis will " "be performed." msgstr "" "Критерій, використаний у %s, призвів до видобування нульової кількості " "факторів. Отже, виконувати аналіз немає сенсу." #: src/language/stats/factor.c:2161 #, c-format msgid "" "The %s criteria result in more factors than variables, which is not " "meaningful. No analysis will be performed." msgstr "" "Критерій, використаний у %s, призвів до видобування кількості факторів, що " "перевищує кількість змінних. Отже, виконувати аналіз немає сенсу." #: src/language/stats/factor.c:2254 msgid "Component Matrix" msgstr "Матриця компонентів" #: src/language/stats/factor.c:2254 msgid "Factor Matrix" msgstr "Матриця факторів" #: src/language/stats/factor.c:2259 msgid "Pattern Matrix" msgstr "Матриця взірців" #: src/language/stats/factor.c:2268 msgid "Structure Matrix" msgstr "Матриця структури" #: src/language/stats/factor.c:2270 msgid "Rotated Component Matrix" msgstr "Обернута матриця компонентів" #: src/language/stats/factor.c:2271 msgid "Rotated Factor Matrix" msgstr "Обернута матриця факторів" #: src/language/stats/flip.c:100 #, c-format msgid "%s ignores %s. Temporary transformations will be made permanent." msgstr "%s ігнорує %s. Тимчасові перетворення буде перетворено на остаточні." #: src/language/stats/flip.c:153 #, c-format msgid "Could not create temporary file for %s." msgstr "Не вдалося створити тимчасовий файл для %s." #: src/language/stats/flip.c:341 #, c-format msgid "Error rewinding %s file: %s." msgstr "Помилка під час спроби повернутися до початку файла %s: %s." #: src/language/stats/flip.c:348 #, c-format msgid "Error creating %s source file." msgstr "Помилка під час спроби створити файл початкових даних %s." #: src/language/stats/flip.c:361 #, c-format msgid "Error reading %s file: %s." msgstr "Помилка під час читання файла %s: %s." #: src/language/stats/flip.c:363 #, c-format msgid "Unexpected end of file reading %s file." msgstr "Неочікуване завершення файла під час читання файла %s." #: src/language/stats/flip.c:379 #, c-format msgid "Error seeking %s source file: %s." msgstr "Помилка під час позиціювання у файлі початкових даних %s: %s." #: src/language/stats/flip.c:387 #, c-format msgid "Error writing %s source file: %s." msgstr "Помилка під час запису файла початкових даних %s: %s." #: src/language/stats/flip.c:402 #, c-format msgid "Error rewinding %s source file: %s." msgstr "Помилка під час спроби повернутися до початку файла даних %s: %s." #: src/language/stats/flip.c:433 #, c-format msgid "Error reading %s temporary file: %s." msgstr "Помилка під час спроби читання тимчасового файла %s: %s." #: src/language/stats/flip.c:436 #, c-format msgid "Unexpected end of file reading %s temporary file." msgstr "Неочікуваний кінець файла під час читання файла тимчасових даних %s." #: src/language/stats/frequencies.c:144 #: src/ui/gui/psppire-dialog-action-frequencies.c:49 msgid "Mode" msgstr "Режим" #: src/language/stats/frequencies.c:303 src/language/stats/logistic.c:1381 #: src/output/charts/plot-hist-cairo.c:112 msgid "Frequency" msgstr "Частота" #: src/language/stats/frequencies.c:305 msgid "Valid Percent" msgstr "Коректний процент" #: src/language/stats/frequencies.c:306 src/language/stats/graph.c:208 msgid "Cumulative Percent" msgstr "Накоп. відсоток" #: src/language/stats/frequencies.c:905 msgid "Histogram frequency must be greater than zero." msgstr "Частота гістограми має перевищувати нуль." #: src/language/stats/frequencies.c:923 msgid "Histogram percentage must be greater than zero." msgstr "Відсоток у гістограмі має перевищувати нуль." #: src/language/stats/frequencies.c:1139 #, c-format msgid "" "%s for histogram must be greater than or equal to %s, but %s was specified " "as %.15g and %s as %.15g. %s and %s will be ignored." msgstr "" "%s для гістограми має бути не меншим за %s, втім, було вказано %s %.15g і %s " "%.15g. %s і %s буде проігноровано." #: src/language/stats/frequencies.c:1184 #, c-format msgid "" "%s for pie chart must be greater than or equal to %s, but %s was specified " "as %.15g and %s as %.15g. %s and %s will be ignored." msgstr "" "%s для кругової діаграми має бути не меншим за %s, втім, було вказано %s " "%.15g і %s %.15g. %s і %s буде проігноровано." #: src/language/stats/frequencies.c:1474 #, c-format msgid "Omitting pie chart for %s, which has only %d unique values." msgstr "Пропускаємо кругову діаграму %s, у якій лише %d унікальних значень." #: src/language/stats/frequencies.c:1477 #, c-format msgid "Omitting pie chart for %s, which has over 50 unique values." msgstr "Пропускаємо кругову діаграму %s, у якій понад 50 унікальних значень." #: src/language/stats/frequencies.c:1494 src/language/stats/graph.c:205 #: src/language/stats/quick-cluster.c:747 #: src/ui/gui/psppire-dialog-action-crosstabs.c:90 #: src/language/stats/crosstabs.q:789 src/language/stats/crosstabs.q:1262 msgid "Count" msgstr "Кількість" #: src/language/stats/friedman.c:220 src/language/stats/kruskal-wallis.c:247 #: src/language/stats/mann-whitney.c:182 src/language/stats/wilcoxon.c:240 msgid "Ranks" msgstr "Ранги" #: src/language/stats/friedman.c:222 src/language/stats/friedman.c:223 #: src/language/stats/kruskal-wallis.c:251 #: src/language/stats/mann-whitney.c:186 src/language/stats/wilcoxon.c:245 msgid "Mean Rank" msgstr "Середній ранг" #: src/language/stats/friedman.c:253 msgid "Kendall's W" msgstr "W Кендала" #: src/language/stats/friedman.c:256 src/language/stats/kruskal-wallis.c:298 #: src/language/stats/median.c:353 msgid "Chi-Square" msgstr "χ-квадрат" #: src/language/stats/glm.c:169 msgid "Multivariate analysis is not yet implemented" msgstr "Багатовимірний аналіз ще не реалізовано" #: src/language/stats/glm.c:274 msgid "Only types 1, 2 & 3 sums of squares are currently implemented" msgstr "У поточній версії реалізовано лише типи 1, 2 та 3 сум квадратів" #: src/language/stats/glm.c:727 msgid "Tests of Between-Subjects Effects" msgstr "Перевірки міжсуб'єктних ефектів" #: src/language/stats/glm.c:730 msgid "Type I Sum Of Squares" msgstr "Сума квадратів для типу I" #: src/language/stats/glm.c:731 msgid "Type II Sum Of Squares" msgstr "Сума квадратів для типу II" #: src/language/stats/glm.c:732 msgid "Type III Sum Of Squares" msgstr "Сума квадратів для типу III" #: src/language/stats/glm.c:734 src/language/stats/oneway.c:976 #: src/language/stats/regression.c:1026 msgid "Mean Square" msgstr "Середнє за квадратами" #: src/language/stats/glm.c:735 src/language/stats/oneway.c:977 #: src/language/stats/regression.c:1027 src/language/stats/t-test-indep.c:262 msgid "F" msgstr "F" #: src/language/stats/glm.c:740 msgid "Corrected Model" msgstr "Виправлена модель" #: src/language/stats/glm.c:740 msgid "Model" msgstr "Модель" #: src/language/stats/glm.c:752 msgid "Intercept" msgstr "Відрізок" #: src/language/stats/glm.c:802 src/output/pivot-table.c:763 #: src/output/spv/spv.c:867 msgid "Error" msgstr "Помилка" #: src/language/stats/glm.c:819 msgid "Corrected Total" msgstr "Сума виправлених" #: src/language/stats/graph.c:206 msgid "Percentage" msgstr "Відсотки" #: src/language/stats/graph.c:207 msgid "Cumulative Count" msgstr "Накопичуваний облік" #: src/language/stats/graph.c:296 #, c-format msgid "%s vs. %s by %s" msgstr "%s від %s за %s" #: src/language/stats/graph.c:303 #, c-format msgid "%s vs. %s" msgstr "%s від %s" #: src/language/stats/graph.c:322 msgid "" "Maximum number of scatterplot categories reached. Your BY variable has too " "many distinct values. The coloring of the plot will not be correct." msgstr "" "Перевищено максимальну кількість категорій у точковій діаграмі. Ваша змінна " "BY має надто багато різних значень. Розфарбовування діаграми буде помилковим." #: src/language/stats/graph.c:551 src/language/stats/rank.c:636 #, c-format msgid "%s of %s" msgstr "%s з %s" #: src/language/stats/graph.c:698 src/language/stats/graph.c:729 #: src/language/stats/graph.c:777 msgid "Only one chart type is allowed." msgstr "Можна використовувати лише один тип діаграми." #: src/language/stats/graph.c:721 src/language/stats/graph.c:820 #: src/language/stats/graph.c:834 msgid "Only one variable is allowed." msgstr "Можна використовувати лише одну змінну." #: src/language/stats/graph.c:843 msgid "Variable expected" msgstr "Мало бути вказано змінну" #: src/language/stats/graph.c:883 msgid "FOOTNOTE is not implemented yet for GRAPH" msgstr "FOOTNOTE ще не реалізовано для GRAPH" #: src/language/stats/ks-one-sample.c:274 src/ui/gui/ks-one-sample.ui:24 msgid "One-Sample Kolmogorov-Smirnov Test" msgstr "Одновибіркова перевірка Колмогорова-Смірнова" #: src/language/stats/ks-one-sample.c:284 msgid "Uniform Parameters" msgstr "Параметри однорідного розподілу" #: src/language/stats/ks-one-sample.c:289 msgid "Normal Parameters" msgstr "Параметри нормального розподілу" #: src/language/stats/ks-one-sample.c:294 msgid "Poisson Parameters" msgstr "Параметри розподілу Пуассона" #: src/language/stats/ks-one-sample.c:295 #: src/ui/gui/psppire-dialog-action-crosstabs.c:76 #: src/language/stats/crosstabs.q:1421 msgid "Lambda" msgstr "λ" #: src/language/stats/ks-one-sample.c:300 msgid "Exponential Parameters" msgstr "Параметри експоненційного розподілу" #: src/language/stats/ks-one-sample.c:308 msgid "Most Extreme Differences" msgstr "Найбільші різниці" #: src/language/stats/ks-one-sample.c:309 msgid "Absolute" msgstr "Абсолютна" #: src/language/stats/ks-one-sample.c:309 src/language/stats/roc.c:1037 msgid "Positive" msgstr "Додатна" #: src/language/stats/ks-one-sample.c:309 src/language/stats/roc.c:1037 msgid "Negative" msgstr "Від'ємна" #: src/language/stats/ks-one-sample.c:312 msgid "Kolmogorov-Smirnov Z" msgstr "Колмогорова-Смірнова (Z)" #: src/language/stats/ks-one-sample.c:313 #: src/language/stats/jonckheere-terpstra.c:374 #: src/language/stats/mann-whitney.c:251 src/language/stats/runs.c:328 #: src/language/stats/wilcoxon.c:284 msgid "Asymp. Sig. (2-tailed)" msgstr "Асимпт. знач. (двобічна)" #: src/language/stats/logistic.c:327 msgid "All predicted values are either 1 or 0" msgstr "Всі передбачені значення є 1 або 0" #: src/language/stats/logistic.c:525 msgid "Dependent variable's values are not dichotomous." msgstr "Значення залежної змінної не є дихотомічними." #: src/language/stats/logistic.c:614 #, c-format msgid "" "Category %s does not have at least two distinct values. Logistic regression " "will not be run." msgstr "" "У категорії %s не міститься принаймні два різних значення. Логістичну " "регресію не буде виконано." #: src/language/stats/logistic.c:674 #, c-format msgid "" "Estimation terminated at iteration number %d because parameter estimates " "changed by less than %g" msgstr "" "Оцінювання перервано на ітерації %d, оскільки оцінка параметра змінилася " "менше, ніж на %g" #: src/language/stats/logistic.c:686 #, c-format msgid "" "Estimation terminated at iteration number %d because Log Likelihood " "decreased by less than %g%%" msgstr "" "Оцінювання перервано на ітерації %d, оскільки log-правдоподібність " "зменшилася менше, ніж на %g%%" #: src/language/stats/logistic.c:701 #, c-format msgid "" "Estimation terminated at iteration number %d because maximum iterations has " "been reached" msgstr "" "Оцінювання було перервано на ітерації %d, оскільки було досягнуто " "максимальної кількості ітерацій" #: src/language/stats/logistic.c:994 msgid "Cut point value must be in the range [0,1]" msgstr "Порогове значення має належати діапазону [0,1]" #: src/language/stats/logistic.c:1139 msgid "Dependent Variable Encoding" msgstr "Кодування залежної змінної" #: src/language/stats/logistic.c:1141 msgid "Mapping" msgstr "Прив'язка" #: src/language/stats/logistic.c:1142 msgid "Internal Value" msgstr "Внутрішнє значення" #: src/language/stats/logistic.c:1145 msgid "Original Value" msgstr "Початкове значення" #: src/language/stats/logistic.c:1167 msgid "Variables in the Equation" msgstr "Змінні у рівнянні" #: src/language/stats/logistic.c:1171 src/language/stats/regression.c:902 msgid "B" msgstr "B" #: src/language/stats/logistic.c:1172 msgid "S.E." msgstr "Ст. пох." #: src/language/stats/logistic.c:1173 msgid "Wald" msgstr "Вальда" #: src/language/stats/logistic.c:1176 msgid "Exp(B)" msgstr "Exp(B)" #: src/language/stats/logistic.c:1181 #, c-format msgid "%d%% CI for Exp(B)" msgstr "%d%% коеф. спряж. для Exp(B)" #: src/language/stats/logistic.c:1183 src/language/stats/t-test-indep.c:274 #: src/language/stats/t-test-one-sample.c:83 #: src/language/stats/t-test-paired.c:249 src/language/stats/crosstabs.q:1369 msgid "Lower" msgstr "Нижня" #: src/language/stats/logistic.c:1183 src/language/stats/t-test-indep.c:275 #: src/language/stats/t-test-one-sample.c:84 #: src/language/stats/t-test-paired.c:250 src/language/stats/crosstabs.q:1370 msgid "Upper" msgstr "Верхня" #: src/language/stats/logistic.c:1189 src/language/stats/logistic.c:1470 msgid "Step 1" msgstr "Крок 1" #: src/language/stats/logistic.c:1263 msgid "Constant" msgstr "Стала" #: src/language/stats/logistic.c:1298 msgid "Model Summary" msgstr "Резюме моделі" #: src/language/stats/logistic.c:1301 msgid "-2 Log likelihood" msgstr "-2 log-правдоподібності" #: src/language/stats/logistic.c:1302 msgid "Cox & Snell R Square" msgstr "R² Кокса і Снела" #: src/language/stats/logistic.c:1303 msgid "Nagelkerke R Square" msgstr "R² Наґелькерке" #: src/language/stats/logistic.c:1306 src/language/stats/logistic.c:1470 msgid "Step" msgstr "Крок" #: src/language/stats/logistic.c:1335 msgid "Unweighted Cases" msgstr "Незважені спостереження" #: src/language/stats/logistic.c:1336 msgid "Included in Analysis" msgstr "Включено у аналіз" #: src/language/stats/logistic.c:1336 msgid "Missing Cases" msgstr "Пропущені спостереження" #: src/language/stats/logistic.c:1365 msgid "Categorical Variables' Codings" msgstr "Кодування змінних категорій" #: src/language/stats/logistic.c:1380 msgid "Codings" msgstr "Кодування" #: src/language/stats/logistic.c:1383 msgid "Parameter coding" msgstr "Кодування параметра" #: src/language/stats/logistic.c:1462 msgid "Classification Table" msgstr "Таблиця класифікації" #: src/language/stats/logistic.c:1466 msgid "Predicted" msgstr "Передбачене" #: src/language/stats/logistic.c:1466 msgid "Percentage Correct" msgstr "Виправлений відсоток" #: src/language/stats/logistic.c:1468 msgid "Observed" msgstr "Спостережне" #: src/language/stats/logistic.c:1468 msgid "Overall Percentage" msgstr "Загальний відсоток" #: src/language/stats/jonckheere-terpstra.c:357 msgid "Jonckheere-Terpstra Test" msgstr "Тест Джонкієра-Терпстра" #: src/language/stats/jonckheere-terpstra.c:364 #, c-format msgid "Number of levels in %s" msgstr "Кількість рівнів у %s" #: src/language/stats/jonckheere-terpstra.c:370 msgid "Observed J-T Statistic" msgstr "Спостережна статистика Дж.-Т." #: src/language/stats/jonckheere-terpstra.c:371 msgid "Mean J-T Statistic" msgstr "Середня статистика Дж.-Т." #: src/language/stats/jonckheere-terpstra.c:372 msgid "Std. Deviation of J-T Statistic" msgstr "Станд. відхилення статистики Дж.-Т." #: src/language/stats/jonckheere-terpstra.c:373 msgid "Std. J-T Statistic" msgstr "Станд. статистика Дж.-Т." #: src/language/stats/mann-whitney.c:187 src/language/stats/wilcoxon.c:246 msgid "Sum of Ranks" msgstr "Сума рангів" #: src/language/stats/mann-whitney.c:248 msgid "Mann-Whitney U" msgstr "U Мана-Вітні" #: src/language/stats/mann-whitney.c:249 msgid "Wilcoxon W" msgstr "W Вілкоксона" #: src/language/stats/mann-whitney.c:250 src/language/stats/runs.c:327 #: src/language/stats/wilcoxon.c:283 msgid "Z" msgstr "Z" #: src/language/stats/means.c:702 msgid "Included" msgstr "Включені" #: src/language/stats/means.c:704 src/language/stats/reliability.c:548 msgid "Excluded" msgstr "Виключені" #: src/language/stats/means.c:753 msgid "Report" msgstr "Звіт" #: src/language/stats/means.c:838 #, c-format msgid "" "The table \"%s\" has no non-empty control variables. No result for this " "table will be displayed." msgstr "" "У таблиці «%s» немає непорожніх контрольних змінних. Результатів для цієї " "таблиці не буде." #: src/language/stats/means-calc.c:443 msgid "Group Median" msgstr "Медіана групи" #: src/language/stats/means-calc.c:455 msgid "First" msgstr "Перший" #: src/language/stats/means-calc.c:456 msgid "Last" msgstr "Останній" #: src/language/stats/means-calc.c:458 msgid "Percent N" msgstr "N відсотків" #: src/language/stats/means-calc.c:459 msgid "Percent Sum" msgstr "Сума відсотків" #: src/language/stats/means-calc.c:461 msgid "Harmonic Mean" msgstr "Середнє гармонійне" #: src/language/stats/means-calc.c:462 msgid "Geom. Mean" msgstr "Середнє геометричне" #: src/language/stats/mcnemar.c:144 msgid "The McNemar test is appropriate only for dichotomous variables" msgstr "Перевірку МакНемара можна застосовувати лише до дихотомічних змінних" #: src/language/stats/mcnemar.c:226 src/language/stats/sign.c:105 msgid "Point Probability" msgstr "Точкова ймовірність" #: src/language/stats/mcnemar.c:229 src/language/stats/sign.c:78 #: src/language/stats/sign.c:108 src/language/stats/t-test-paired.c:199 #: src/language/stats/t-test-paired.c:257 src/language/stats/wilcoxon.c:253 #: src/language/stats/wilcoxon.c:292 msgid "Pairs" msgstr "Пари" #: src/language/stats/median.c:316 msgid "> Median" msgstr "> медіани" #: src/language/stats/median.c:316 msgid "≤ Median" msgstr "≤ медіани" #: src/language/stats/npar.c:536 #, c-format msgid "%s subcommand not currently implemented." msgstr "Підкоманду %s у поточній версії ще не реалізовано." #: src/language/stats/npar.c:691 #, c-format msgid "Expecting %s, %s, %s or a number." msgstr "Мало бути %s, %s, %s або число." #: src/language/stats/npar.c:845 #, c-format msgid "" "The specified value of HI (%d) is lower than the specified value of LO (%d)" msgstr "Вказане значення HI (%d) є меншим за вказане значення LO (%d)" #: src/language/stats/npar.c:897 #, c-format msgid "" "%d expected values were given, but the specified range (%d-%d) requires " "exactly %d values." msgstr "" "Було надано %d очікуваних значень, але для вказаного діапазону (%d-%d) " "потрібно точно %d значень." #: src/language/stats/npar.c:1118 src/language/stats/t-test-parser.c:173 #, c-format msgid "" "PAIRED was specified but the number of variables preceding WITH (%zu) did " "not match the number following (%zu)." msgstr "" "Було вказано PAIRED, але кількість змінних, що передують WITH (%zu), не " "відповідала кількості, що слідували за ним (%zu)." #: src/language/stats/oneway.c:361 msgid "LSD" msgstr "НЗР" #: src/language/stats/oneway.c:362 src/ui/gui/oneway.ui:338 msgid "Tukey HSD" msgstr "ДЗР Тукі" #: src/language/stats/oneway.c:363 src/ui/gui/oneway.ui:253 msgid "Bonferroni" msgstr "Бонфероні" #: src/language/stats/oneway.c:364 src/ui/gui/oneway.ui:304 msgid "Scheffé" msgstr "Шеффе" #: src/language/stats/oneway.c:365 msgid "Games-Howell" msgstr "Ґеймс-Гауел" #: src/language/stats/oneway.c:366 src/ui/gui/oneway.ui:321 msgid "Šidák" msgstr "Шидяк" #: src/language/stats/oneway.c:519 #, c-format msgid "The post hoc analysis method %s is not supported." msgstr "Підтримки додаткового методу аналізу %s не передбачено." #: src/language/stats/oneway.c:842 #, c-format msgid "" "Dependent variable %s has no non-missing values. No analysis for this " "variable will be done." msgstr "" "У залежній змінній %s немає непропущених значень. Аналіз для цієї змінної не " "виконуватиметься." #: src/language/stats/oneway.c:924 #, c-format msgid "" "In contrast list %zu, the number of coefficients (%zu) does not equal the " "number of groups (%d). This contrast list will be ignored." msgstr "" "У списку контрастів %zu кількість коефіцієнтів (%zu) не дорівнює кількості " "груп (%d). Цей список контрастів буде проігноровано." #: src/language/stats/oneway.c:936 #, c-format msgid "Coefficients for contrast %zu do not total zero" msgstr "Сума коефіцієнтів контрасту %zu не дорівнює нулеві" #: src/language/stats/oneway.c:971 msgid "ANOVA" msgstr "ANOVA" #: src/language/stats/oneway.c:974 src/language/stats/regression.c:1024 msgid "Sum of Squares" msgstr "Сума квадратів" #: src/language/stats/oneway.c:981 msgid "Between Groups" msgstr "Між групами" #: src/language/stats/oneway.c:981 msgid "Within Groups" msgstr "Всередині груп" #: src/language/stats/oneway.c:1075 src/language/stats/oneway.c:1257 msgid "Dependent Variable" msgstr "Залежна змінна" #: src/language/stats/oneway.c:1148 msgid "Test of Homogeneity of Variances" msgstr "Тест однорідності дисперсій" #: src/language/stats/oneway.c:1151 msgid "Levene Statistic" msgstr "Статистика Лівіня" #: src/language/stats/oneway.c:1152 msgid "df1" msgstr "df1" #: src/language/stats/oneway.c:1153 msgid "df2" msgstr "df2" #: src/language/stats/oneway.c:1192 msgid "Contrast Coefficients" msgstr "Коефіцієнти контрастності" #: src/language/stats/oneway.c:1199 src/language/stats/oneway.c:1246 msgid "Contrast" msgstr "Контраст" #: src/language/stats/oneway.c:1236 msgid "Contrast Tests" msgstr "Тести контрастності" #: src/language/stats/oneway.c:1239 msgid "Value of Contrast" msgstr "Значення контрастності" #: src/language/stats/oneway.c:1241 src/language/stats/regression.c:905 #: src/language/stats/t-test-indep.c:266 #: src/language/stats/t-test-one-sample.c:74 #: src/language/stats/t-test-paired.c:252 msgid "t" msgstr "t" #: src/language/stats/oneway.c:1252 msgid "Assumption" msgstr "Припущення" #: src/language/stats/oneway.c:1253 msgid "Assume equal variances" msgstr "Припускати рівність дисперсій" #: src/language/stats/oneway.c:1254 msgid "Does not assume equal variances" msgstr "Не припускати рівності дисперсій" #: src/language/stats/oneway.c:1367 #, c-format msgid "Multiple Comparisons (%s)" msgstr "Декілька порівнянь (%s)" #: src/language/stats/oneway.c:1374 msgid "Mean Difference (I - J)" msgstr "Середня різниця (I - J)" #: src/language/stats/oneway.c:1379 #, c-format msgid "%g%% Confidence Interval" msgstr "%g%%-ий довірчий інтервал" #: src/language/stats/oneway.c:1386 src/language/stats/oneway.c:1390 msgid "(J) Family" msgstr "(J) Сімейство" #: src/language/stats/oneway.c:1406 msgid "Test" msgstr "Тест" #: src/language/stats/quick-cluster.c:576 msgid "Initial Cluster Centers" msgstr "Початкові центри кластерів" #: src/language/stats/quick-cluster.c:577 msgid "Final Cluster Centers" msgstr "Центри остаточних кластерів" #: src/language/stats/quick-cluster.c:580 #: src/language/stats/quick-cluster.c:660 #: src/language/stats/quick-cluster.c:661 #: src/language/stats/quick-cluster.c:753 msgid "Cluster" msgstr "Кластер" #: src/language/stats/quick-cluster.c:658 msgid "Cluster Membership" msgstr "Членство у кластері" #: src/language/stats/quick-cluster.c:744 msgid "Number of Cases in each Cluster" msgstr "Кількість спостережень у кожному з кластерів" #: src/language/stats/quick-cluster.c:750 msgid "Clusters" msgstr "Скупчення" #: src/language/stats/quick-cluster.c:867 #: src/language/stats/quick-cluster.c:893 #, c-format msgid "A variable called `%s' already exists." msgstr "Змінна із назвою «%s» вже існує." #: src/language/stats/quick-cluster.c:908 #, c-format msgid "Expecting %s or %s." msgstr "Мало бути %s або %s." #: src/language/stats/quick-cluster.c:928 msgid "The number of clusters must be positive" msgstr "Кількість кластерів має бути додатною" #: src/language/stats/quick-cluster.c:944 msgid "The convergence criterion must be positive" msgstr "Критерій збіжності має бути додатним" #: src/language/stats/quick-cluster.c:960 msgid "The number of iterations must be positive" msgstr "Кількість ітерацій має бути додатною" #: src/language/stats/rank.c:205 #, c-format msgid "" "Cannot generate variable name for ranking %s with %s. All candidates in use." msgstr "" "Не вдалося створити назву змінної для ранжування %s за допомогою %s. Усі " "можливі варіанти уже використано." #: src/language/stats/rank.c:321 #, c-format msgid "Too many variables in %s clause." msgstr "Забагато змінних у інструкції %s." #: src/language/stats/rank.c:323 #, c-format msgid "Variable %s already exists." msgstr "Змінна %s вже існує." #: src/language/stats/rank.c:325 src/language/expressions/evaluate.c:164 #, c-format msgid "Duplicate variable name %s." msgstr "Дублювання назви змінної, %s." #: src/language/stats/rank.c:631 #, c-format msgid "%s of %s by %s" msgstr "%s з %s за %s" #: src/language/stats/rank.c:825 msgid "Variables Created by RANK" msgstr "Змінні, створені RANK" #: src/language/stats/rank.c:828 src/language/stats/rank.c:829 msgid "New Variable" msgstr "Нова змінна" #: src/language/stats/rank.c:829 msgid "Function" msgstr "Функція" #: src/language/stats/rank.c:830 msgid "Fraction" msgstr "Частка" #: src/language/stats/rank.c:830 msgid "Grouping Variables" msgstr "Групування змінних" #: src/language/stats/rank.c:833 src/language/stats/rank.c:834 msgid "Existing Variable" msgstr "Наявна змінна" #: src/language/stats/reliability.c:164 msgid "Reliability on a single variable is not useful." msgstr "Оцінка придатності для однієї змінної позбавлена сенсу." #: src/language/stats/reliability.c:281 msgid "" "The STATISTICS subcommand is not yet implemented. No statistics will be " "produced." msgstr "" "Підкоманду STATISTICS ще не реалізовано. Статистична обробка не " "виконуватиметься." #: src/language/stats/reliability.c:300 msgid "The split point must be less than the number of variables" msgstr "Порогове значення має бути меншим за кількість змінних" #: src/language/stats/reliability.c:525 #, c-format msgid "Scale: %s" msgstr "Шкала: %s" #: src/language/stats/reliability.c:582 msgid "Item-Total Statistics" msgstr "Статистика пункт-сумарне" #: src/language/stats/reliability.c:585 msgid "Scale Mean if Item Deleted" msgstr "Масштабоване середнє, якщо пункт вилучено" #: src/language/stats/reliability.c:586 msgid "Scale Variance if Item Deleted" msgstr "Масштабована дисперсія, якщо пункт вилучено" #: src/language/stats/reliability.c:587 msgid "Corrected Item-Total Correlation" msgstr "Скоригований пункт – сумарна кореляція" #: src/language/stats/reliability.c:588 msgid "Cronbach's Alpha if Item Deleted" msgstr "Альфа (Кронбаха), якщо пункт вилучено" #: src/language/stats/reliability.c:627 msgid "Reliability Statistics" msgstr "Статистика придатності" #: src/language/stats/reliability.c:634 src/language/stats/reliability.c:646 msgid "Cronbach's Alpha" msgstr "Альфа (Кронбаха)" #: src/language/stats/reliability.c:635 src/language/stats/reliability.c:649 #: src/language/stats/reliability.c:652 msgid "N of Items" msgstr "К-ть пунктів" #: src/language/stats/reliability.c:647 msgid "Part 1" msgstr "Частина 1" #: src/language/stats/reliability.c:650 msgid "Part 2" msgstr "Частина 2" #: src/language/stats/reliability.c:654 msgid "Total N of Items" msgstr "Загальна к-ть пунктів" #: src/language/stats/reliability.c:656 msgid "Correlation Between Forms" msgstr "Кореляція між формами" #: src/language/stats/reliability.c:659 msgid "Spearman-Brown Coefficient" msgstr "Коефіцієнт Спірмена-Брауна" #: src/language/stats/reliability.c:660 msgid "Equal Length" msgstr "Однакова довжина" #: src/language/stats/reliability.c:661 msgid "Unequal Length" msgstr "Неоднакова довжина" #: src/language/stats/reliability.c:663 msgid "Guttman Split-Half Coefficient" msgstr "Коефіцієнт розщеплення навпіл Ґутмана" #: src/language/stats/roc.c:966 msgid "Area Under the Curve" msgstr "Площа під кривою" #: src/language/stats/roc.c:970 msgid "Area" msgstr "Площа" #: src/language/stats/roc.c:976 msgid "Asymptotic Sig." msgstr "Асимптотична знач." #: src/language/stats/roc.c:979 #, c-format msgid "Asymp. %g%% Confidence Interval" msgstr "Асимпт. %g%%-ий довірчий інтервал" #: src/language/stats/roc.c:987 msgid "Variable under test" msgstr "Змінна, перевірка якої виконується" #: src/language/stats/roc.c:1026 msgid "Case Summary" msgstr "Резюме спостережень" #: src/language/stats/roc.c:1030 msgid "Unweighted" msgstr "Незважена" #: src/language/stats/roc.c:1031 msgid "Weighted" msgstr "Зважена" #: src/language/stats/roc.c:1064 msgid "Coordinates of the Curve" msgstr "Координати кривої" #: src/language/stats/roc.c:1068 msgid "Positive if greater than or equal to" msgstr "Позитивне, якщо більше або рівне" #: src/language/stats/roc.c:1069 src/output/charts/roc-chart-cairo.c:38 msgid "Sensitivity" msgstr "Чутливість" #: src/language/stats/roc.c:1069 src/output/charts/roc-chart-cairo.c:37 msgid "1 - Specificity" msgstr "1 - специфічність" #: src/language/stats/roc.c:1072 msgid "Coordinates" msgstr "Координати" #: src/language/stats/roc.c:1076 msgid "Test variable" msgstr "Змінна для перевірки" #: src/language/stats/regression.c:224 src/language/stats/regression.c:229 #, c-format msgid "VARIABLES may not appear after %s" msgstr "VARIABLES не можна використовувати після %s" #: src/language/stats/regression.c:412 msgid "" "REGRESSION with SAVE ignores TEMPORARY. Temporary transformations will be " "made permanent." msgstr "" "REGRESSION з SAVE ігнорує TEMPORARY. Тимчасові перетворення буде перетворено " "на остаточні." #: src/language/stats/regression.c:416 msgid "REGRESSION with SAVE ignores FILTER. All cases will be processed." msgstr "REGRESSION з SAVE ігнорує FILTER. Оброблено буде усі спостереження." #: src/language/stats/regression.c:569 msgid "" "The dependent variable is equal to the independent variable. The least " "squares line is therefore Y=X. Standard errors and related statistics may be " "meaningless." msgstr "" "Залежна змінна дорівнює незалежній змінній. Тому прямою лінійної регресії " "буде Y=X. Значення стандартної похибки і пов'язані статистики, ймовірно " "позбавлені сенсу." #: src/language/stats/regression.c:776 msgid "No valid data found. This command was skipped." msgstr "Не знайдено коректних даних. Команду пропущено." #: src/language/stats/regression.c:863 #, c-format msgid "Model Summary (%s)" msgstr "Резюме моделі (%s)" #: src/language/stats/regression.c:868 #: src/ui/gui/psppire-dialog-action-regression.c:42 msgid "R" msgstr "R" #: src/language/stats/regression.c:868 msgid "R Square" msgstr "R²" #: src/language/stats/regression.c:868 msgid "Adjusted R Square" msgstr "Скориговане R²" #: src/language/stats/regression.c:869 msgid "Std. Error of the Estimate" msgstr "Ст. похибка оцінки" #: src/language/stats/regression.c:895 #, c-format msgid "Coefficients (%s)" msgstr "Коефіцієнти (%s)" #: src/language/stats/regression.c:901 msgid "Unstandardized Coefficients" msgstr "Нестандартизовані коефіцієнти" #: src/language/stats/regression.c:904 msgid "Standardized Coefficients" msgstr "Стандартизовані коефіцієнти" #: src/language/stats/regression.c:904 msgid "Beta" msgstr "β" #: src/language/stats/regression.c:911 #, c-format msgid "%g%% Confidence Interval for B" msgstr "%g%%-ий довірчий інтервал для B" #: src/language/stats/regression.c:919 msgid "Collinearity Statistics" msgstr "Статистика колінеарності" #: src/language/stats/regression.c:920 msgid "Tolerance" msgstr "Допуск" #: src/language/stats/regression.c:920 msgid "VIF" msgstr "VIF" #: src/language/stats/regression.c:933 msgid "(Constant)" msgstr "(Стала)" #: src/language/stats/regression.c:1020 #, c-format msgid "ANOVA (%s)" msgstr "ANOVA (%s)" #: src/language/stats/regression.c:1031 src/ui/gui/regression.ui:24 msgid "Regression" msgstr "Регресія" #: src/language/stats/regression.c:1075 #, c-format msgid "Coefficient Correlations (%s)" msgstr "Кореляції коефіцієнтів (%s)" #: src/language/stats/regression.c:1082 msgid "Models" msgstr "Моделі" #: src/language/stats/regression.c:1090 msgid "Covariances" msgstr "Коваріації" #: src/language/stats/runs.c:169 #, c-format msgid "" "Multiple modes exist for variable `%s'. Using %.*g as the threshold value." msgstr "" "Для змінної «%s» існує декілька мод. Використовуємо %.*g як порогове " "значення." #: src/language/stats/runs.c:314 src/ui/gui/runs.ui:24 msgid "Runs Test" msgstr "Перевірка серій" #: src/language/stats/runs.c:319 msgid "Test Value" msgstr "Значення для перевірки" #: src/language/stats/runs.c:320 msgid "Test Value (mode)" msgstr "Значення для перевірки (мода)" #: src/language/stats/runs.c:321 msgid "Test Value (mean)" msgstr "Значення для перевірки (середнє)" #: src/language/stats/runs.c:322 msgid "Test Value (median)" msgstr "Значення для перевірки (медіана)" #: src/language/stats/runs.c:323 msgid "Cases < Test Value" msgstr "Спостережень < Значення для перевірки" #: src/language/stats/runs.c:324 msgid "Cases ≥ Test Value" msgstr "Спостережень ≥ Значення для перевірки" #: src/language/stats/runs.c:325 msgid "Total Cases" msgstr "Сума спостережень" #: src/language/stats/runs.c:326 msgid "Number of Runs" msgstr "Кількість серій" #: src/language/stats/sign.c:72 msgid "Differences" msgstr "Відмінності" #: src/language/stats/sign.c:73 msgid "Negative Differences" msgstr "Від'ємні різниці" #: src/language/stats/sign.c:74 msgid "Positive Differences" msgstr "Додатні різниці" #: src/language/stats/sign.c:75 src/language/stats/wilcoxon.c:250 msgid "Ties" msgstr "Збіги" #: src/language/stats/sort-cases.c:63 msgid "Buffer limit must be at least 2." msgstr "Значенням обмеження буфера має бути принаймні число 2." #: src/language/stats/sort-criteria.c:89 #, c-format msgid "Variable %s specified twice in sort criteria." msgstr "Змінну %s у критерії впорядковування вказано двічі." #: src/language/stats/t-test-indep.c:190 msgid "Group Statistics" msgstr "Статистика групи" #: src/language/stats/t-test-indep.c:200 msgid "Group" msgstr "Група" #: src/language/stats/t-test-indep.c:256 msgid "Independent Samples Test" msgstr "Перевірка незалежних вибірок" #: src/language/stats/t-test-indep.c:261 msgid "Levene's Test for Equality of Variances" msgstr "Перевірка Лівіня рівності дисперсій" #: src/language/stats/t-test-indep.c:265 msgid "T-Test for Equality of Means" msgstr "t-перевірка рівності середніх" #: src/language/stats/t-test-indep.c:269 #: src/language/stats/t-test-one-sample.c:77 msgid "Mean Difference" msgstr "Середня різниця" #: src/language/stats/t-test-indep.c:270 msgid "Std. Error Difference" msgstr "Різниця стандратних похибок" #: src/language/stats/t-test-indep.c:273 #, no-c-format msgid "95% Confidence Interval of the Difference" msgstr "95%C-ий довірчий інтервал різниці" #: src/language/stats/t-test-indep.c:277 msgid "Assumptions" msgstr "Припущення" #: src/language/stats/t-test-indep.c:278 msgid "Equal variances assumed" msgstr "Припускаємо рівність дисперсій" #: src/language/stats/t-test-indep.c:279 msgid "Equal variances not assumed" msgstr "Не припускаємо рівності дисперсій" #: src/language/stats/t-test-one-sample.c:64 msgid "One-Sample Test" msgstr "Одновибіркова перевірка" #: src/language/stats/t-test-one-sample.c:71 #, c-format msgid "Test Value = %.*g" msgstr "Значення перевірки = %.*g" #: src/language/stats/t-test-one-sample.c:80 #: src/language/stats/t-test-paired.c:246 #, c-format msgid "%g%% Confidence Interval of the Difference" msgstr "%g%%-ий довірчий інтервал різниці" #: src/language/stats/t-test-one-sample.c:122 msgid "One-Sample Statistics" msgstr "Одновибіркова статистика" #: src/language/stats/t-test-paired.c:147 msgid "Paired Sample Statistics" msgstr "Статистика парних вибірок" #: src/language/stats/t-test-paired.c:163 #: src/language/stats/t-test-paired.c:205 #: src/language/stats/t-test-paired.c:263 #, c-format msgid "Pair %zu" msgstr "Пара %zu" #: src/language/stats/t-test-paired.c:190 msgid "Paired Samples Correlations" msgstr "Кореляції парних вибірок" #: src/language/stats/t-test-paired.c:208 #, c-format msgid "%s & %s" msgstr "%s і %s" #: src/language/stats/t-test-paired.c:234 msgid "Paired Samples Test" msgstr "Перевірка парних вибірок" #: src/language/stats/t-test-paired.c:240 msgid "Paired Differences" msgstr "Парні різниці" #: src/language/stats/t-test-paired.c:266 #, c-format msgid "%s - %s" msgstr "%s - %s" #: src/language/stats/t-test-parser.c:133 #, c-format msgid "When applying %s to a string variable, two values must be specified." msgstr "Якщо %s застосовується до рядкової змінної, слід вказати два значення." #: src/language/stats/t-test-parser.c:145 #: src/language/stats/t-test-parser.c:241 #, c-format msgid "%s subcommand may not be used with %s." msgstr "Підкоманду %s не можна використовувати разом з %s." #: src/language/stats/t-test-parser.c:305 msgid "Exactly one of TESTVAL, GROUPS and PAIRS subcommands must be specified." msgstr "Мало бути вказано точно одну підкоманду TESTVAL, GROUPS і PAIRS." #: src/language/stats/wilcoxon.c:248 msgid "Sign" msgstr "Знак" #: src/language/stats/wilcoxon.c:249 msgid "Negative Ranks" msgstr "Від'ємні ранги" #: src/language/stats/wilcoxon.c:249 msgid "Positive Ranks" msgstr "Додатні ранги" #: src/language/stats/wilcoxon.c:296 msgid "Too many pairs to calculate exact significance" msgstr "Занадто багато пар для обчислення точної значущості" #: src/language/data-io/combine-files.c:214 msgid "Cannot specify the active dataset since none has been defined." msgstr "" "Не можна вказувати активний набір даних, оскільки ще не було визначено " "жодного набору даних." #: src/language/data-io/combine-files.c:220 msgid "" "This command may not be used after TEMPORARY when the active dataset is an " "input source. Temporary transformations will be made permanent." msgstr "" "Цю команду не можна використовувати після TEMPORARY, якщо джерелом вхідних " "даних є активний набір даних. Тимчасові перетворення буде зроблено " "постійними." #: src/language/data-io/combine-files.c:255 msgid "Multiple IN subcommands for a single FILE or TABLE." msgstr "Декілька підкоманд IN для одного файла (FILE) або таблиці (TABLE)." #: src/language/data-io/combine-files.c:308 #, c-format msgid "File %s lacks BY variable %s." msgstr "У файлі %s не вистачає BY за змінною %s." #: src/language/data-io/combine-files.c:311 #, c-format msgid "Active dataset lacks BY variable %s." msgstr "У активному наборі даних не вистачає BY за змінною %s." #: src/language/data-io/combine-files.c:388 #: src/language/data-io/combine-files.c:393 #, c-format msgid "BY is required when %s is specified." msgstr "Слід вказати BY, якщо вказано %s." #: src/language/data-io/combine-files.c:521 msgid "" "Combining files with incompatible encodings. String data may not be " "represented correctly." msgstr "" "Поєднання файлів з несумісними кодуванням. Рядкові дані може бути показано " "некоректно." #: src/language/data-io/combine-files.c:564 #, c-format msgid "" "Variable %s in file %s has different type or width from the same variable in " "earlier file." msgstr "" "Змінна %s у файлі %s належить до іншого типу або має іншу ширину, ніж та " "сама змінна у попередньому файлі." #: src/language/data-io/combine-files.c:570 #, c-format msgid "In file %s, %s is numeric." msgstr "У файлі %s %s була числом." #: src/language/data-io/combine-files.c:573 #, c-format msgid "In file %s, %s is a string variable with width %d." msgstr "У файлі %s %s є рядковою змінною з шириною %d." #: src/language/data-io/combine-files.c:578 #, c-format msgid "In an earlier file, %s was numeric." msgstr "У попередньому файлі %s була числовою змінною." #: src/language/data-io/combine-files.c:581 #, c-format msgid "In an earlier file, %s was a string variable with width %d." msgstr "У попередньому файлі %s була рядковою змінною з шириною %d." #: src/language/data-io/combine-files.c:621 #, c-format msgid "" "Variable name %s specified on %s subcommand duplicates an existing variable " "name." msgstr "" "Назва змінної %s, вказаної у підкоманді %s, дублює назву наявної змінної." #: src/language/data-io/combine-files.c:793 #, c-format msgid "Encountered %zu sets of duplicate cases in the master file." msgstr "У основному файлі виявлено %zu наборів повторюваних спостережень." #: src/language/data-io/data-list.c:129 src/language/data-io/data-list.c:144 #, c-format msgid "The %s value must be non-negative." msgstr "Значення %s має бути невід'ємним." #: src/language/data-io/data-list.c:154 #, c-format msgid "The %s subcommand may only be used within %s." msgstr "Підкоманду %s можна використовувати лише у межах %s." #: src/language/data-io/data-list.c:159 #, c-format msgid "The %s subcommand may only be specified once." msgstr "Підкоманду %s можна використовувати лише один раз." #: src/language/data-io/data-list.c:197 msgid "Only one of FIXED, FREE, or LIST may be specified." msgstr "Можна вказувати лише одну з команд, FIXED, FREE або LIST." #: src/language/data-io/data-list.c:260 msgid "Encoding should not be specified for inline data. It will be ignored." msgstr "" "У вбудованих даних не слід вказувати кодування. Команду зміни кодування буде " "проігноровано." #: src/language/data-io/data-list.c:269 #, c-format msgid "The %s subcommand may be used only with %s." msgstr "Підкоманду %s можна використовувати лише з %s." #: src/language/data-io/data-list.c:284 src/language/data-io/matrix-data.c:578 msgid "At least one variable must be specified." msgstr "Має бути вказано принаймні одну змінну." #: src/language/data-io/data-list.c:383 src/language/data-io/data-list.c:491 #: src/language/data-io/get-data.c:662 #, c-format msgid "%s is a duplicate variable name." msgstr "%s дублює назву наявної змінної." #: src/language/data-io/data-list.c:390 #, c-format msgid "There is already a variable %s of a different type." msgstr "Вже існує змінна %s іншого типу." #: src/language/data-io/data-list.c:397 #, c-format msgid "There is already a string variable %s of a different width." msgstr "Вже існує рядкова змінна %s іншої ширини." #: src/language/data-io/data-list.c:405 #, c-format msgid "Cannot place variable %s on record %d when RECORDS=%d is specified." msgstr "Не можна розташовувати змінну %s у записі %d, якщо вказано RECORDS=%d." #: src/language/data-io/data-parser.c:453 #: src/language/data-io/data-parser.c:462 msgid "Quoted string extends beyond end of line." msgstr "Рядок у лапках завершується за кінцем рядка у файлі." #: src/language/data-io/data-parser.c:488 msgid "Missing delimiter following quoted string." msgstr "Не вистачає роздільника з наступним рядком у лапках." #: src/language/data-io/data-parser.c:506 #, c-format msgid "Data for variable %s is not valid as format %s: %s" msgstr "Дані змінної %s є некоректними для формату %s: %s" #: src/language/data-io/data-parser.c:536 #, c-format msgid "Partial case of %d of %d records discarded." msgstr "Часткове спостереження %d з %d записів відкинуто." #: src/language/data-io/data-parser.c:592 #, c-format msgid "Partial case discarded. The first variable missing was %s." msgstr "" "Дані неповного спостереження відкинуто. Першою пропущеною змінною була %s." #: src/language/data-io/data-parser.c:634 #, c-format msgid "" "Missing value(s) for all variables from %s onward. These will be filled " "with the system-missing value or blanks, as appropriate." msgstr "" "Немає значень для усіх змінних, починаючи з %s. Змінні буде заповнено " "значенням «пропущено системою» або не заповнено, відповідно." #: src/language/data-io/data-parser.c:655 msgid "Record ends in data not part of any field." msgstr "Запис завершується у даних, які не є частиною жодного поля." #: src/language/data-io/data-parser.c:670 #, c-format msgid "Reading %d record from %s." msgid_plural "Reading %d records from %s." msgstr[0] "Читаємо %d запис з %s." msgstr[1] "Читаємо %d записи з %s." msgstr[2] "Читаємо %d записів з %s." msgstr[3] "Читаємо %d запис з %s." #: src/language/data-io/data-parser.c:680 src/language/data-io/print.c:435 msgid "Record" msgstr "Запис" #: src/language/data-io/data-parser.c:680 src/language/data-io/print.c:435 #: src/ui/gui/psppire-var-sheet-header.c:76 msgid "Columns" msgstr "Стовпчики" #: src/language/data-io/data-parser.c:680 #: src/language/data-io/data-parser.c:725 src/language/data-io/print.c:435 msgid "Format" msgstr "Формат" #: src/language/data-io/data-parser.c:720 #, c-format msgid "Reading free-form data from %s." msgstr "Читаємо дані у довільній формі з %s." #. TRANSLATORS: this fragment will be interpolated into #. messages in fh_lock() that identify types of files. #: src/language/data-io/data-reader.c:136 src/language/data-io/data-writer.c:79 msgid "data file" msgstr "файл даних" #: src/language/data-io/data-reader.c:160 #, c-format msgid "Could not open `%s' for reading as a data file: %s." msgstr "Не вдалося відкрити «%s» для читання у форматі файла даних: %s." #: src/language/data-io/data-reader.c:174 #, c-format msgid "Could not read `%s' as a text file with encoding `%s': %s." msgstr "Не вдалося прочитати «%s» як текстовий файл у кодуванні «%s»: %s." #: src/language/data-io/data-reader.c:233 #, c-format msgid "" "Missing %s while reading inline data. This probably indicates a missing or " "incorrectly formatted %s command. %s must appear by itself on a single line " "with exactly one space between words." msgstr "" "Під час читання вбудованих даних не було виявлено команди %s. Ймовірно, це " "означає, що команду %s пропущено або неправильно форматовано. %s має бути " "вказано у окремому рядку з одним пробілом між словами." #: src/language/data-io/data-reader.c:253 #: src/language/data-io/data-reader.c:387 #, c-format msgid "Error reading file %s: %s." msgstr "Помилка під час читання файла %s: %s." #: src/language/data-io/data-reader.c:261 #, c-format msgid "Unexpected end of file in partial record reading %s." msgstr "" "Неочікуване завершення файла на позиції, коли не було завершено читання " "запису %s." #: src/language/data-io/data-reader.c:321 #, c-format msgid "Corrupt block descriptor word at offset 0x%lx in %s." msgstr "Пошкоджене слово дескриптора блоку на позиції 0x%lx у %s." #: src/language/data-io/data-reader.c:322 #, c-format msgid "Corrupt record descriptor word at offset 0x%lx in %s." msgstr "Пошкоджене слово дескриптора на позиції 0x%lx у %s." #: src/language/data-io/data-reader.c:335 #, c-format msgid "Corrupt record size at offset 0x%lx in %s." msgstr "Помилковий розмір запису на позиції 0x%lx у %s." #: src/language/data-io/data-reader.c:493 msgid "Record exceeds remaining block length." msgstr "Запис виходить за межі залишку довжини блоку." #: src/language/data-io/data-reader.c:567 #, c-format msgid "Attempt to read beyond end-of-file on file %s." msgstr "Спроба виходу за межі файла %s під час читання." #: src/language/data-io/data-reader.c:570 #, c-format msgid "Attempt to read beyond %s." msgstr "Спроба виходу за межі %s під час читання." #: src/language/data-io/data-reader.c:733 msgid "" "This command is not valid here since the current input program does not " "access the inline file." msgstr "" "Тут не можна використовувати цю команду, оскільки поточна програма отримання " "вхідних даних не має доступу до вбудованого файла." #: src/language/data-io/data-writer.c:106 #, c-format msgid "An error occurred while opening `%s' for writing as a data file: %s." msgstr "" "Помилка під час спроби відкрити «%s» для запису у форматі файла даних: %s." #: src/language/data-io/data-writer.c:224 #, c-format msgid "I/O error occurred writing data file `%s'." msgstr "Під час запису файла даних «%s» сталася помилка введення-виведення." #: src/language/data-io/dataset.c:64 #, c-format msgid "There is no dataset named %s." msgstr "Немає набору даних з назвою %s." #: src/language/data-io/dataset.c:250 msgid "Datasets" msgstr "Бази даних" #: src/language/data-io/dataset.c:263 msgid "unnamed dataset" msgstr "набір даних без назви" #: src/language/data-io/file-handle.c:61 #, c-format msgid "" "File handle %s is already defined. Use %s before redefining a file handle." msgstr "" "Дескриптор файла %s вже визначено. Скористайтеся %s до перевизначення " "дескриптора файла." #: src/language/data-io/file-handle.c:241 #, c-format msgid "%s must be specified with %s." msgstr "%s має бути вказано з %s." #: src/language/data-io/file-handle.c:252 #, c-format msgid "" "The specified file mode requires LRECL. Assuming %zu-character records." msgstr "" "Для вказаного режиму доступу до файлів потрібен LRECL. Припускаємо розмір " "запису у %zu символів." #: src/language/data-io/file-handle.c:256 #, c-format msgid "" "Record length (%d) must be between 1 and %lu bytes. Assuming %zu-character " "records." msgstr "" "Довжина запису (%d) має бути значенням від 1 до %lu байтів. Припускаємо " "розміри запису у %zu символів." #: src/language/data-io/file-handle.c:300 msgid "file" msgstr "файл" #: src/language/data-io/file-handle.c:302 msgid "inline file" msgstr "вбудований файл" #: src/language/data-io/file-handle.c:350 msgid "expecting a file name or handle name" msgstr "мало бути вказано назву файла або дескриптор" #: src/language/data-io/file-handle.c:365 #, c-format msgid "Handle for %s not allowed here." msgstr "Дескриптор файла %s тут не можна використовувати." #: src/language/data-io/get-data.c:108 src/output/measure.c:262 #, c-format msgid "error reading file `%s'" msgstr "помилка під час спроби прочитати файл «%s»" #: src/language/data-io/get-data.c:127 #, c-format msgid "Unsupported TYPE %s." msgstr "Непідтримуване значення TYPE %s." #: src/language/data-io/get-data.c:278 msgid "The sheet index must be greater than or equal to 1" msgstr "Індекс аркуша має бути не меншим за 1" #: src/language/data-io/get-data.c:285 src/language/data-io/get-data.c:308 #: src/language/data-io/get-data.c:327 #, c-format msgid "%s must be followed by either \"%s\" or \"%s\"." msgstr "Після %s має бути «%s» або «%s»." #: src/language/data-io/get-data.c:357 #, c-format msgid "" "%s is allowed only with %s arrangement, but %s arrangement was stated or " "implied earlier in this command." msgstr "" "%s можна використовувати лише упорядкуванням %s, але раніше у цій команді " "було вказано або малося на увазі упорядкування %s." #: src/language/data-io/get-data.c:441 src/language/data-io/get-data.c:479 #, c-format msgid "Value of %s must be 1 or greater." msgstr "Значення %s має бути не меншим за 1." #: src/language/data-io/get-data.c:504 msgid "" "Ignoring obsolete IMPORTCASES subcommand. (N OF CASES or SAMPLE may be used " "to substitute.)" msgstr "" "Ігноруємо застарілу підкоманду IMPORTCASES. (Слід використовувати N OF " "CASES або SAMPLE.)" #: src/language/data-io/get-data.c:551 msgid "" "In compatible syntax mode, the QUALIFIER string must contain exactly one " "character." msgstr "" "У режимі сумісності синтаксису рядок QUALIFIER має містити точно один символ." #: src/language/data-io/get-data.c:583 #, c-format msgid "" "The record number specified, %ld, is at or before the previous record, %d. " "Data fields must be listed in order of increasing record number." msgstr "" "Вказаний номер запису, %ld, є номером попереднього запису, %d, або передує " "йому. Поля даних у списку має бути вказано у порядку зростання номерів." #: src/language/data-io/get-data.c:592 #, c-format msgid "" "The record number specified, %ld, exceeds the number of records per case " "specified on FIXCASE, %d." msgstr "" "Вказаний номер запису, %ld, перевищує значення кількості записів на " "спостереження, вказане у FIXCASE, %d." #: src/language/data-io/get.c:132 #, c-format msgid "%s: Data file dictionary has no variables." msgstr "%s: словник файла даних не містить змінних." #: src/language/data-io/inpt-pgm.c:133 #, c-format msgid "Unexpected end-of-file within %s." msgstr "Неочікуване завершення файла у %s." #: src/language/data-io/inpt-pgm.c:146 #, c-format msgid "Input program must contain %s or %s." msgstr "Вхідна програма має містити інструкцію %s або %s." #: src/language/data-io/inpt-pgm.c:152 msgid "Input program did not create any variables." msgstr "Вхідна програма не створила жодних змінних." #: src/language/data-io/inpt-pgm.c:365 msgid "" "REREAD: Column numbers must be positive finite numbers. Column set to 1." msgstr "" "REREAD: номери стовпчиків мають бути додатними скінченними числами. Буде " "використано типове значення номера стовпчика, 1." #: src/language/data-io/list.c:100 msgid "Data List" msgstr "Список даних" #: src/language/data-io/list.c:221 #, c-format msgid "" "The first case (%ld) specified precedes the last case (%ld) specified. The " "values will be swapped." msgstr "" "Перше вказане спостереження (%ld) передує останньому вказаному спостереженню " "(%ld). Буде виконано відповідне переставляння значень." #: src/language/data-io/list.c:230 #, c-format msgid "" "The first case (%ld) to list is numbered less than 1. The value is being " "reset to 1." msgstr "" "Номер першого спостереження у списку (%ld) є меншим за 1. Значення замінено " "на 1." #: src/language/data-io/list.c:237 #, c-format msgid "" "The last case (%ld) to list is numbered less than 1. The value is being " "reset to 1." msgstr "" "Номер останнього спостереження у списку (%ld) є меншим за 1. Значення " "замінено на 1." #: src/language/data-io/list.c:244 #, c-format msgid "The step value %ld is less than 1. The value is being reset to 1." msgstr "Значення кроку %ld є меншим за 1. Відновлено типове значення кроку, 1." #: src/language/data-io/placement-parser.c:96 #, c-format msgid "" "Number of variables specified (%zu) differs from number of variable formats " "(%zu)." msgstr "" "Вказана кількість змінних (%zu) відрізняється від кількості форматів змінних " "(%zu)." #: src/language/data-io/placement-parser.c:106 msgid "" "SPSS-like or Fortran-like format specification expected after variable names." msgstr "" "Після назв змінних слід вказувати специфікації форматів у стилі SPSS або " "Fortran." #: src/language/data-io/placement-parser.c:129 #, c-format msgid "The %d columns %d-%d can't be evenly divided into %zu fields." msgstr "%d стовпчиків, %d-%d, не можна рівномірно поділити на %zu полів." #: src/language/data-io/placement-parser.c:310 msgid "Column positions for fields must be positive." msgstr "Розташування стовпчиків для полів має бути додатним." #: src/language/data-io/placement-parser.c:312 msgid "Column positions for fields must not be negative." msgstr "Розташування стовпчиків для полів не повинне бути від'ємним." #: src/language/data-io/placement-parser.c:372 msgid "The ending column for a field must be greater than the starting column." msgstr "" "Значення завершального стовпчика поля має перевищувати значення початкового " "стовпчика." #: src/language/data-io/placement-parser.c:409 #, fuzzy, c-format #| msgid "" #| "The record number specified, %ld, is at or before the previous record, " #| "%d. Data fields must be listed in order of increasing record number." msgid "" "The record number specified, %.0f, is at or before the previous record, %d. " "Data fields must be listed in order of increasing record number." msgstr "" "Вказаний номер запису, %ld, є номером попереднього запису, %d, або передує " "йому. Поля даних у списку має бути вказано у порядку зростання номерів." #: src/language/data-io/print-space.c:127 #, c-format msgid "The expression on %s evaluated to the system-missing value." msgstr "" "Результатом обчислення виразу %s є значення, яке буде пропущено системою." #: src/language/data-io/print-space.c:130 #, c-format msgid "The expression on %s evaluated to %g." msgstr "Обчислене значення виразу для %s: %g." #: src/language/data-io/print.c:189 src/language/data-io/trim.c:58 msgid "expecting a valid subcommand" msgstr "мало бути вказано коректну підкоманду." #: src/language/data-io/print.c:219 #, c-format msgid "%s is required when binary formats are specified." msgstr "Слід використовувати %s, якщо вказано бінарні формати." #: src/language/data-io/print.c:302 #, c-format msgid "Output calls for %d records but %zu specified on RECORDS subcommand." msgstr "" "Для виведення даних потрібно %d записів, але у підкоманді RECORDS вказано " "кількість записів %zu." #: src/language/data-io/print.c:432 msgid "Print Summary" msgstr "Надрукувати резюме" #: src/language/data-io/print.c:462 msgid "N of Records" msgstr "К-ть записів" #: src/language/data-io/matrix-data.c:191 #, c-format msgid "" "There are %d variable declared but the data has at least %d matrix rows." msgstr "Оголошено %d змінних, але у даних є принаймні %d рядків матриці." #: src/language/data-io/matrix-data.c:292 msgid "" "The N subcommand was specified, but a N record was also found in the data. " "The N record will be ignored." msgstr "" "Було вказано підкоманду N, але у даних знайдено і запис N. Запис N буде " "проігноровано." #: src/language/data-io/matrix-data.c:488 src/language/utilities/set.q:186 #, c-format msgid "%s must not be negative." msgstr "%s має бути невід'ємним." #: src/language/data-io/matrix-data.c:568 msgid "FORMAT = FULL and FORMAT = NODIAGONAL are mutually exclusive." msgstr "FORMAT = FULL та FORMAT = NODIAGONAL є взаємно виключними." #: src/language/data-io/matrix-reader.c:102 #: src/language/data-io/matrix-reader.c:118 #, c-format msgid "Matrix dataset lacks a variable called %s." msgstr "У матричному наборі даних немає змінної з назвою %s." #: src/language/data-io/matrix-reader.c:109 #: src/language/data-io/matrix-reader.c:125 #, c-format msgid "Matrix dataset variable %s should be of string type." msgstr "" "Змінна матричного набору даних %s має належати до рядкового типу даних." #: src/language/data-io/save-translate.c:168 #: src/language/data-io/save-translate.c:183 #, c-format msgid "The %s string must contain exactly one character." msgstr "Рядок %s має містити точно один символ." #: src/language/data-io/save-translate.c:249 #, c-format msgid "Output file `%s' exists but %s was not specified." msgstr "Файл виведених даних «%s» вже існує, але %s не вказано." #: src/language/data-io/save.c:309 msgid "The OUTFILE or METADATA subcommand is required." msgstr "Потрібна підкоманда OUTFILE або METADATA." #: src/language/data-io/trim.c:69 #, c-format msgid "" "Cannot rename %s as %s because there already exists a variable named %s. To " "rename variables with overlapping names, use a single RENAME subcommand such " "as `/RENAME (A=B)(B=C)(C=A)', or equivalently, `/RENAME (A B C=B C A)'." msgstr "" "Перейменування %s на %s неможливе, оскільки змінна з назвою %s вже існує. " "Щоб перейменувати змінні без конфліктів назв, скористайтеся окремою " "підкомандою RENAME так: /RENAME (A=B)(B=C)(C=A) або так: /RENAME (A B C=B C " "A)." #: src/language/data-io/trim.c:227 #, c-format msgid "" "Number of variables on left side of `=' (%zu) does not match number of " "variables on right side (%zu), in parenthesized group %d of RENAME " "subcommand." msgstr "" "Кількість змінних ліворуч від «=» (%zu) не збігається з кількістю змінних " "праворуч від знаку рівності (%zu) (група %d у дужках підкоманди RENAME)." #: src/language/data-io/trim.c:242 #, c-format msgid "Requested renaming duplicates variable name %s." msgstr "Під час бажаного перейменування буде здубльовано назву змінної %s." #: src/language/data-io/trim.c:281 msgid "Cannot DROP all variables from dictionary." msgstr "Неможливо виконати DROP для усіх змінних зі словника." #: src/language/expressions/evaluate.c:151 msgid "expecting number or string" msgstr "мало бути вказано число або рядок" #: src/language/expressions/helpers.c:43 msgid "" "One of the arguments to a DATE function is not an integer. The result will " "be system-missing." msgstr "" "Один з аргументів функції DATE не є цілим числом. Результат буде пропущено " "системою." #: src/language/expressions/helpers.c:71 msgid "" "The week argument to DATE.WKYR is not an integer. The result will be system-" "missing." msgstr "" "Аргумент тижня DATE.WKYR не є цілим числом. Результат буде пропущено " "системою." #: src/language/expressions/helpers.c:77 msgid "" "The week argument to DATE.WKYR is outside the acceptable range of 1 to 53. " "The result will be system-missing." msgstr "" "Аргумент тижня DATE.WKYR лежить поза межами припустимого діапазону від 1 до " "53. Результат буде пропущено системою." #: src/language/expressions/helpers.c:99 msgid "" "The day argument to DATE.YRDAY is not an integer. The result will be system-" "missing." msgstr "" "Аргумент дня DATE.YRDAY не є цілим числом. Результат буде пропущено системою." #: src/language/expressions/helpers.c:105 msgid "" "The day argument to DATE.YRDAY is outside the acceptable range of 1 to 366. " "The result will be system-missing." msgstr "" "Аргумент дня DATE.YRDAY лежить поза межами припустимого діапазону від 1 до " "366. Результат буде пропущено системою." #: src/language/expressions/helpers.c:127 msgid "" "The year argument to YRMODA is greater than 47516. The result will be " "system-missing." msgstr "" "Аргумент року YRMODA перевищує 47516. Результат буде пропущено системою." #: src/language/expressions/helpers.c:180 #, c-format msgid "" "Unrecognized date unit `%.*s'. Valid date units are `%s', `%s', `%s', `%s', " "`%s', `%s', `%s', and `%s'." msgstr "" "Невідома одиниця дати, «%.*s». Коректними одиницями дати є «%s», «%s», «%s», " "«%s», «%s», «%s», «%s» та «%s»." #: src/language/expressions/helpers.c:333 #, c-format msgid "Invalid DATESUM method. Valid choices are `%s' and `%s'." msgstr "Некоректний метод DATESUM. Коректними варіантами є «%s» і «%s»." #: src/language/expressions/parse.c:261 #, c-format msgid "" "Type mismatch: expression has %s type, but a numeric value is required here." msgstr "" "Невідповідність типів: вираз належить до типу %s, але потрібне числове " "значення." #: src/language/expressions/parse.c:274 #, c-format msgid "" "Type mismatch: expression has %s type, but a string value is required here." msgstr "" "Невідповідність типів: вираз належить до типу %s, але потрібне рядкове " "значення." #: src/language/expressions/parse.c:436 #, c-format msgid "Type mismatch while applying %s operator: cannot convert %s to %s." msgstr "" "Невідповідність типів під час застосування оператора %s: не вдалося " "перетворити %s на %s." #: src/language/expressions/parse.c:650 msgid "" "Chaining relational operators (e.g. `a < b < c') will not produce the " "mathematically expected result. Use the AND logical operator to fix the " "problem (e.g. `a < b AND b < c'). If chaining is really intended, " "parentheses will disable this warning (e.g. `(a < b) < c'.)" msgstr "" "Використання ланцюжків нерівностей (наприклад a < b < c) не призведе до " "отримання бажаного математичного коректного результату. Для виправлення " "проблеми скористайтеся логічним оператором AND (наприклад a < b AND b < c). " "Якщо без ланцюжка нерівностей не обійтися, скористайтеся дужками, щоб " "програма більше не показувала цього попередження (наприклад (a < b) < c)." #: src/language/expressions/parse.c:752 msgid "" "The exponentiation operator (`**') is left-associative, even though right-" "associative semantics are more useful. That is, `a**b**c' equals " "`(a**b)**c', not as `a**(b**c)'. To disable this warning, insert " "parentheses." msgstr "" "Послідовні оператори піднесення до степеня («**») обчислюються у напрямку " "зліва праворуч, хоча іноді бажанішим могло б бути обчислення справа ліворуч. " "Це означає, що a**b**c дорівнюватиме (a**b)**c, а не «a**(b**c)». Щоб " "уникнути цього попередження, вставте дужки." #: src/language/expressions/parse.c:832 #, c-format msgid "Unknown system variable %s." msgstr "Невідома системна змінна %s." #: src/language/expressions/parse.c:880 #, c-format msgid "Unknown identifier %s." msgstr "Невідомий ідентифікатор %s." #: src/language/expressions/parse.c:1102 #, c-format msgid "%s must have at least %d arguments in list." msgstr "%s повинен мати принаймні %d аргументів у списку." #: src/language/expressions/parse.c:1111 #, c-format msgid "%s must have an even number of arguments in list." msgstr "%s повинна приймати парну кількість аргументів у списку." #: src/language/expressions/parse.c:1114 #, c-format msgid "%s must have multiple of %d arguments in list." msgstr "Кількість аргументів %s має бути кратною до %d." #: src/language/expressions/parse.c:1124 #, c-format msgid "%s function does not accept a minimum valid argument count." msgstr "%s не приймає мінімальної коректної кількості аргументів." #: src/language/expressions/parse.c:1133 #, c-format msgid "%s requires at least %d valid arguments in list." msgstr "%s потребує принаймні %d коректних аргументів у списку." #: src/language/expressions/parse.c:1139 #, c-format msgid "" "With %s, using minimum valid argument count of %d does not make sense when " "passing only %d arguments in list." msgstr "" "Якщо використовується %s, використання мінімальної коректної кількості " "аргументів, %d, позбавлене сенсу, якщо до списку передається лише %d " "аргументів." #: src/language/expressions/parse.c:1193 #, c-format msgid "Type mismatch invoking %s as " msgstr "Невідповідність типів під час спроби викликати %s як " #: src/language/expressions/parse.c:1198 msgid "Function invocation " msgstr "Виклик функції " #: src/language/expressions/parse.c:1200 msgid " does not match any known function. Candidates are:" msgstr " не відповідає жодній з відомих функцій. Кандидати:" #: src/language/expressions/parse.c:1230 #, c-format msgid "No function or vector named %s." msgstr "Немає функції або вектора з назвою %s." #: src/language/expressions/parse.c:1292 #, c-format msgid "%s is a PSPP extension." msgstr "%s є розширенням PSPP." #: src/language/expressions/parse.c:1295 #, c-format msgid "%s is not available in this version of PSPP." msgstr "%s не можна скористатися у цій версії PSPP." #: src/language/expressions/parse.c:1302 #, c-format msgid "%s may not appear after %s." msgstr "%s не може використовуватися після %s." #: src/libpspp/ext-array.c:66 msgid "failed to create temporary file" msgstr "не вдалося створити тимчасовий файл" #: src/libpspp/ext-array.c:106 msgid "seeking in temporary file" msgstr "виконуємо позиціювання у тимчасовому файлі" #: src/libpspp/ext-array.c:125 msgid "reading temporary file" msgstr "читаємо тимчасовий файл" #: src/libpspp/ext-array.c:127 msgid "unexpected end of file reading temporary file" msgstr "неочікуваний кінець файла під час читання файла тимчасових даних" #: src/libpspp/ext-array.c:147 msgid "writing to temporary file" msgstr "записуємо дані до тимчасового файла" #: src/libpspp/i18n.c:1128 msgid "Arabic" msgstr "арабська" #: src/libpspp/i18n.c:1130 msgid "Armenian" msgstr "вірменська" #: src/libpspp/i18n.c:1131 msgid "Baltic" msgstr "балтійська" #: src/libpspp/i18n.c:1133 msgid "Celtic" msgstr "кельтська" #: src/libpspp/i18n.c:1134 msgid "Central European" msgstr "центральноєвропейська" #: src/libpspp/i18n.c:1136 msgid "Chinese Simplified" msgstr "китайська (спрощена)" #: src/libpspp/i18n.c:1138 msgid "Chinese Traditional" msgstr "китайська (традиційна)" #: src/libpspp/i18n.c:1140 msgid "Croatian" msgstr "хорватська" #: src/libpspp/i18n.c:1141 msgid "Cyrillic" msgstr "кирилиця" #: src/libpspp/i18n.c:1143 msgid "Cyrillic/Russian" msgstr "кирилиця/російська" #: src/libpspp/i18n.c:1144 msgid "Cyrillic/Ukrainian" msgstr "кирилиця/українська" #: src/libpspp/i18n.c:1146 msgid "Georgian" msgstr "грузинська" #: src/libpspp/i18n.c:1147 msgid "Greek" msgstr "грецька" #: src/libpspp/i18n.c:1148 msgid "Gujarati" msgstr "гуджараті" #: src/libpspp/i18n.c:1149 msgid "Gurmukhi" msgstr "гурмухі" #: src/libpspp/i18n.c:1150 msgid "Hebrew" msgstr "іврит" #: src/libpspp/i18n.c:1152 msgid "Hebrew Visual" msgstr "іврит (візуальний)" #: src/libpspp/i18n.c:1153 msgid "Hindi" msgstr "хінді" #: src/libpspp/i18n.c:1154 msgid "Icelandic" msgstr "ісландська" #: src/libpspp/i18n.c:1155 msgid "Japanese" msgstr "японська" #: src/libpspp/i18n.c:1157 msgid "Korean" msgstr "корейська" #: src/libpspp/i18n.c:1159 msgid "Nordic" msgstr "нордична" #: src/libpspp/i18n.c:1160 msgid "Romanian" msgstr "румунська" #: src/libpspp/i18n.c:1162 msgid "South European" msgstr "південноєвропейська" #: src/libpspp/i18n.c:1163 msgid "Thai" msgstr "тайська" #: src/libpspp/i18n.c:1165 msgid "Turkish" msgstr "турецька" #: src/libpspp/i18n.c:1167 msgid "Vietnamese" msgstr "в'єтнамська" #: src/libpspp/i18n.c:1169 msgid "Western European" msgstr "західноєвропейська" #: src/libpspp/message.c:89 #, c-format msgid "%s: %s" msgstr "%s: %s" #: src/libpspp/message.c:113 msgid "error" msgstr "помилка" #: src/libpspp/message.c:115 msgid "warning" msgstr "попередження" #: src/libpspp/message.c:118 msgid "note" msgstr "нотатка" #: src/libpspp/message.c:327 #, c-format msgid "Notes (%d) exceed limit (%d). Suppressing further notes." msgstr "" "Кількість нотаток (%d) перевищує обмеження (%d). Виведення подальших нотаток " "придушено." #: src/libpspp/message.c:335 #, c-format msgid "Warnings (%d) exceed limit (%d). Syntax processing will be halted." msgstr "" "Кількість попереджень (%d) перевищує обмеження (%d). Обробку синтаксичних " "конструкцій буде перервано." #: src/libpspp/message.c:338 #, c-format msgid "Errors (%d) exceed limit (%d). Syntax processing will be halted." msgstr "" "Кількість помилок (%d) перевищує обмеження (%d). Обробку синтаксичних " "конструкцій буде перервано." #: src/libpspp/zip-reader.c:202 #, c-format msgid "%s: corrupt archive at 0x%llx: expected %# but got %#" msgstr "" "%s: пошкодження архіву на позиції 0x%llx: мало бути %#, але маємо " "%#" #: src/libpspp/zip-reader.c:329 src/libpspp/zip-reader.c:449 #, c-format msgid "%s: open failed (%s)" msgstr "%s: помилка відкриття (%s)." #: src/libpspp/zip-reader.c:344 #, c-format msgid "%s: cannot find central directory" msgstr "%s: не вдалося знайти центральний каталог" #: src/libpspp/zip-reader.c:353 src/libpspp/zip-reader.c:384 #: src/libpspp/zip-reader.c:468 #, c-format msgid "%s: seek failed (%s)" msgstr "%s: помилка позиціювання (%s)" #: src/libpspp/zip-reader.c:441 #, c-format msgid "%s: unknown member \"%s\"" msgstr "%s: невідомий учасник «%s»" #: src/libpspp/zip-reader.c:503 #, fuzzy, c-format #| msgid "" #| "%s: name mismatch betwen central directory (%s) and local file header (%s)" msgid "" "%s: name mismatch between central directory (%s) and local file header (%s)" msgstr "" "%s: невідповідність назв між центральним каталогом (%s) і заголовком " "локального файла (%s)" #: src/libpspp/zip-reader.c:696 #, c-format msgid "%s: cannot initialize inflator (%s)" msgstr "%s: не вдалося ініціалізувати засіб стискання (%s)" #: src/libpspp/zip-reader.c:751 #, c-format msgid "%s: error inflating \"%s\" (%s)" msgstr "%s: помилка стискання «%s» (%s)" #: src/libpspp/zip-writer.c:97 utilities/pspp-convert.c:346 #, c-format msgid "%s: error opening output file" msgstr "%s: помилка під час спроби відкрити файл результатів" #: src/libpspp/zip-writer.c:169 #, c-format msgid "%s: error seeking in output file" msgstr "%s: помилка під час спроби виконати позиціювання у файлі результатів" #: src/libpspp/zip-writer.c:210 msgid "error creating temporary file" msgstr "помилка під час створення тимчасового файла" #: src/libpspp/zip-writer.c:279 #, c-format msgid "%s: write failed" msgstr "%s: помилка під час спроби запису" #. TRANSLATORS: This is a format string which, when presented to #. printf like functions, will create a pango markup string to #. display real number in scientific notation. #. #. In its untranslated form, it will display similar to "1.23 x 10^4". You #. can leave it untranslated if this is how scientific notation is usually #. presented in your language. #. #. Some locales (such as German) prefer the centered dot rather than the #. multiplication sign between the mantissa an exponent. In which #. case, you can change "#215;" to "#8901;" or other unicode code #. point as appropriate. #. #. The . in this string does not and should not be changed, since #. that is taken care of by the stdc library. #. #. For information on Pango markup, see #. http://developer.gnome.org/pango/stable/PangoMarkupFormat.html #. #. For tables of unicode code points, see http://unicode.org/charts #. #: src/math/chart-geometry.c:123 #, c-format msgid "%%.%dlf×10%d" msgstr "%%.%dlf×10%d" #: src/math/histogram.c:145 msgid "" "Not creating histogram because the data contains less than 2 distinct values" msgstr "" "Гістограму не створено, оскільки дані містять менше за 2 різні значення" #: src/math/percentiles.c:36 msgid "HAverage" msgstr "Зваж. середнє" #: src/math/percentiles.c:38 msgid "Rounded" msgstr "Округлене" #: src/math/percentiles.c:39 msgid "Empirical" msgstr "Емпіричне" #: src/math/percentiles.c:40 msgid "Empirical with averaging" msgstr "Емпіричне з усередненням" #: src/math/shapiro-wilk.c:84 msgid "" "One or more weight values are non-integer. Fractional parts will be ignored " "when calculating the Shapiro-Wilk statistic." msgstr "" "Одне або декілька значень ваги не є цілими. Дробові частини буде " "проігноровано при обчисленні статистики Шапіро-Вілка." #: src/output/ascii.c:340 #, c-format msgid "ascii: opening output file `%s'" msgstr "ascii: відкриваємо файл виведених результатів «%s»" #: src/output/ascii.c:371 #, c-format msgid "%s: %s must be positive integer or `auto'" msgstr "%s: %s має бути додатним цілим числом або «auto»" #: src/output/ascii.c:393 #, c-format msgid "" "ascii: page must be at least %d characters wide, but as configured is only " "%d characters" msgstr "" "ascii: на сторінці має бути принаймні %d символів у рядку, але сторінку " "налаштовано так, що на ній лише %d символів у рядку." #: src/output/ascii.c:508 #, c-format msgid "See %s for a chart." msgstr "Діаграму збережено до %s." #: src/output/charts/piechart.c:54 msgid "*MISSING*" msgstr "*НЕМАЄ*" #: src/output/csv.c:100 src/output/html.c:117 src/output/journal.c:166 #: src/output/msglog.c:68 #, c-format msgid "error opening output file `%s'" msgstr "помилка під час спроби відкрити файл виведених даних «%s»" #: src/output/driver.c:522 #, c-format msgid "%s is not a valid device type (the choices are `%s' and `%s')" msgstr "%s не є коректним типом пристрою (можливі варіанти: «%s» і «%s»)" #: src/output/driver.c:536 #, c-format msgid "%s: unknown option `%s'" msgstr "%s: невідомий параметр «%s»" #: src/output/driver.c:553 #, c-format msgid "%s: output option missing `='" msgstr "%s: у параметрі виведення результатів пропущено «=»" #: src/output/driver.c:560 #, c-format msgid "%s: output option specified more than once" msgstr "%s: параметр виведення результатів вказано декілька разів" #: src/output/html.c:129 msgid "PSPP Output" msgstr "Виведення PSPP" #: src/output/html.c:266 msgid "No description" msgstr "Немає опису" #: src/output/journal.c:69 #, c-format msgid "error writing output file `%s'" msgstr "помилка під час запису файла результатів «%s»" #: src/output/measure.c:68 #, c-format msgid "`%s' is not a valid length." msgstr "«%s» не є коректним значенням довжини." #: src/output/measure.c:96 #, c-format msgid "syntax error in paper size `%s'" msgstr "синтаксична помилка у розмірі аркуша «%s»" #: src/output/measure.c:233 #, c-format msgid "unknown paper type `%.*s'" msgstr "невідомий тип аркуша, «%.*s»" #: src/output/measure.c:251 #, c-format msgid "error opening input file `%s'" msgstr "помилка під час спроби відкрити файл вхідних даних «%s»" #: src/output/measure.c:279 #, c-format msgid "file `%s' does not state a paper size" msgstr "файл «%s» не визначає розміру аркуша" #: src/output/options.c:112 #, c-format msgid "%s: `%s' is `%s' but a Boolean value is required" msgstr "%s: «%s» дорівнює «%s», але мало бути використано булеве значення" #: src/output/options.c:187 #, c-format msgid "%s: `%s' is `%s' but one of the following is required: %s" msgstr "" "%s: «%s» дорівнює «%s», але мало бути використано одне з таких значень: %s" #: src/output/options.c:231 #, c-format msgid "%s: `%s' is `%s' but a non-negative integer is required" msgstr "" "%s: «%s» дорівнює «%s», але мало бути використано невід'ємне ціле число" #: src/output/options.c:235 #, c-format msgid "%s: `%s' is `%s' but a positive integer is required" msgstr "%s: «%s» дорівнює «%s», але мало бути використано додатне ціле число" #: src/output/options.c:238 #, c-format msgid "%s: `%s' is `%s' but an integer is required" msgstr "%s: «%s» дорівнює «%s», але мало бути вказано ціле число" #: src/output/options.c:241 #, c-format msgid "%s: `%s' is `%s' but an integer greater than %d is required" msgstr "" "%s: «%s» дорівнює «%s», але мало бути вказано ціле число, що перевищує %d" #: src/output/options.c:246 #, c-format msgid "%s: `%s' is `%s' but an integer between %d and %d is required" msgstr "%s: «%s» дорівнює «%s», але мало бути вказано ціле число від %d до %d" #: src/output/options.c:325 #, c-format msgid "%s: `%s' is `%s' but a file name that contains `#' is required." msgstr "" "%s: «%s» дорівнює «%s, але мало бути вказано назву файла, що містить «#»." #. TRANSLATORS: Do not translate this string. If the script of your language #. reads from right to left (eg Persian, Arabic, Hebrew etc), then replace #. this string with "output-direction-rtl". Otherwise either leave it #. untranslated or copy it verbatim. #: src/output/render.c:994 msgid "output-direction-ltr" msgstr "output-direction-ltr" #: src/output/text-item.c:44 msgid "Page Title" msgstr "Заголовок сторінки" #: src/output/text-item.c:47 msgid "Title" msgstr "Заголовок" #: src/output/text-item.c:51 msgid "Log" msgstr "Журнал" #: src/output/text-item.c:54 msgid "Page Break" msgstr "Розрив сторінки" #: src/output/cairo.c:520 #, c-format msgid "`%s': bad font specification" msgstr "«%s»: помилкова специфікація шрифту" #: src/output/cairo.c:744 #, c-format msgid "" "The defined page is not wide enough to hold at least %d characters in the " "default font. In fact, there's only room for %d characters." msgstr "" "Визначений розмір сторінки є надто малим для того, щоб умістити принаймні %d " "символів тексту типовим шрифтом. Фактично, на ньому є місце лише для %d " "символів." #: src/output/cairo.c:752 #, c-format msgid "" "The defined page is not long enough to hold at least %d lines in the default " "font. In fact, there's only room for %d lines." msgstr "" "Визначений розмір сторінки є надто малим для того, щоб умістити принаймні %d " "рядків тексту типовим шрифтом. Фактично, на ньому є місце лише для %d рядків." #: src/output/cairo.c:837 #, c-format msgid "error opening output file `%s': %s" msgstr "помилка під час спроби відкрити файл результатів «%s»: %s" #: src/output/cairo.c:892 #, c-format msgid "error drawing output for %s driver: %s" msgstr "помилка під час малювання для драйвера %s: %s" #: src/output/cairo.c:2056 #, c-format msgid "error writing output file `%s': %s" msgstr "помилка під час запису файла результатів «%s»: %s" #: src/output/charts/np-plot-cairo.c:37 #, c-format msgid "Normal Q-Q Plot of %s" msgstr "Нормальна діаграма Q-Q %s" #: src/output/charts/np-plot-cairo.c:38 src/output/charts/np-plot-cairo.c:68 msgid "Observed Value" msgstr "Спостережне значення" #: src/output/charts/np-plot-cairo.c:39 msgid "Expected Normal" msgstr "Очікуваний нормальний" #: src/output/charts/np-plot-cairo.c:67 #, c-format msgid "Detrended Normal Q-Q Plot of %s" msgstr "Нормальна діаграма Q-Q без тренду для %s" #: src/output/charts/np-plot-cairo.c:69 msgid "Dev from Normal" msgstr "Відх. від норм." #: src/output/charts/barchart-cairo.c:65 msgid "Bar Chart" msgstr "Стовпчикова діаграма" #: src/output/charts/plot-hist-cairo.c:43 #, c-format msgid "N = %.2f" msgstr "N = %.2f" #: src/output/charts/plot-hist-cairo.c:52 #, c-format msgid "Mean = %.1f" msgstr "Середнє = %.1f" #: src/output/charts/plot-hist-cairo.c:61 #, c-format msgid "Std. Dev = %.2f" msgstr "Стд. відх. = %.2f" #: src/output/charts/plot-hist-cairo.c:110 msgid "HISTOGRAM" msgstr "ГІСТОГРАМА" #: src/output/charts/roc-chart-cairo.c:36 src/ui/gui/roc.ui:24 msgid "ROC Curve" msgstr "ROC-крива" #: src/output/charts/scree-cairo.c:36 msgid "Scree Plot" msgstr "Графік власних значень" #: src/output/charts/scree-cairo.c:38 msgid "Eigenvalue" msgstr "Власне значення" #: src/output/charts/spreadlevel-cairo.c:37 #, c-format msgid "Spread vs. Level Plot of %s" msgstr "Залежність розсіювання від середнього рівня %s" #: src/output/charts/spreadlevel-cairo.c:38 msgid "Level" msgstr "Рівень" #: src/output/charts/spreadlevel-cairo.c:39 msgid "Spread" msgstr "Розсіювання" #: src/output/charts/scatterplot-cairo.c:57 #, c-format msgid "Scatterplot %s" msgstr "Точкова діаграма %s" #: src/output/spv/spv-legacy-decoder.c:2222 msgid "Table lacks cell data." msgstr "У таблиці не вистачає даних комірок." #: src/output/spv/spv-writer.c:68 #, c-format msgid "%s: create failed" msgstr "%s: помилка під час спроби створення" #: src/output/spv/spv-writer.c:89 msgid "I/O error writing SPV file" msgstr "Помилка введення-виведення під час запису файла SPV" #: src/output/spv/spv.c:693 #, c-format msgid "%s: Failed to create XML parser" msgstr "%s: не вдалося створити обробник XML" #: src/output/spv/spv.c:718 #, c-format msgid "%s: document is not well-formed" msgstr "%s: помилкове форматування документа" #: src/output/spv/spv.c:726 #, c-format msgid "%s: root node is \"%s\" but \"%s\" was expected" msgstr "%s: кореневим вузлом є «%s», а мав бути «%s»" #: src/ui/gui/psppire-acr.c:273 msgid "Add" msgstr "Додати" #: src/ui/gui/psppire-acr.c:274 msgid "Edit" msgstr "Змінити" #: src/ui/gui/psppire-acr.c:275 msgid "Remove" msgstr "Вилучити" #: src/ui/gui/psppire-buttonbox.c:311 msgid "OK" msgstr "Гаразд" #: src/ui/gui/psppire-buttonbox.c:319 msgid "Go To" msgstr "Перейти" #: src/ui/gui/psppire-buttonbox.c:327 msgid "Continue" msgstr "Продовжити" #: src/ui/gui/psppire-buttonbox.c:339 src/ui/gui/psppire-import-assistant.c:759 msgid "Paste" msgstr "Вставити" #: src/ui/gui/psppire-buttonbox.c:345 #: src/ui/gui/psppire-dialog-action-aggregate.c:216 #: src/ui/gui/psppire-data-window.c:496 src/ui/gui/psppire-data-window.c:624 #: src/ui/gui/psppire-output-window.c:353 #: src/ui/gui/psppire-syntax-window.c:594 src/ui/gui/psppire-window.c:445 #: src/ui/gui/psppire-window.c:628 msgid "Cancel" msgstr "Скасувати" #: src/ui/gui/psppire-buttonbox.c:351 msgid "Close" msgstr "Закрити" #: src/ui/gui/psppire-buttonbox.c:358 src/ui/gui/psppire-import-assistant.c:760 msgid "Reset" msgstr "Скинути" #: src/ui/gui/psppire-buttonbox.c:365 msgid "Help" msgstr "Довідка" #: src/ui/gui/psppire-dialog-action-aggregate.c:213 msgid "Aggregate destination file" msgstr "Агрегувати файл призначення" #: src/ui/gui/psppire-dialog-action-aggregate.c:217 #: src/ui/gui/psppire-data-window.c:493 src/ui/gui/psppire-data-window.c:497 #: src/ui/gui/psppire-output-window.c:354 #: src/ui/gui/psppire-syntax-window.c:595 src/ui/gui/psppire-window.c:449 #: src/ui/gui/aggregate.ui:565 msgid "Save" msgstr "Зберегти" #: src/ui/gui/psppire-dialog-action-aggregate.c:226 #: src/ui/gui/psppire-data-window.c:503 msgid "System Files (*.sav)" msgstr "системні файли (*.sav)" #: src/ui/gui/psppire-dialog-action-aggregate.c:231 #: src/ui/gui/psppire-data-window.c:508 msgid "Compressed System Files (*.zsav)" msgstr "стиснені системні файли (*.zsav)" #: src/ui/gui/psppire-dialog-action-aggregate.c:236 #: src/ui/gui/psppire-data-window.c:513 src/ui/gui/psppire-window.c:652 msgid "Portable Files (*.por) " msgstr "портативні файли (*.por) " #: src/ui/gui/psppire-dialog-action-autorecode.c:337 #: src/ui/gui/psppire-dialog-action-recode.c:535 #: src/ui/gui/psppire-dialog-action-recode-different.c:288 msgid "New" msgstr "Нове" #: src/ui/gui/psppire-dialog-action-autorecode.c:351 #: src/ui/gui/psppire-dialog-action-recode.c:527 #: src/ui/gui/psppire-dialog-action-recode-different.c:301 msgid "Old" msgstr "Попереднє" #: src/ui/gui/psppire-dialog-action-comments.c:142 #, c-format msgid "Column Number: %d" msgstr "Номер стовпчика: %d" #: src/ui/gui/psppire-dialog-action-crosstabs.c:71 msgid "Chisq" msgstr "χ²" #: src/ui/gui/psppire-dialog-action-crosstabs.c:71 msgid "" "Pearson chi-square, likelihood ratio, Fisher’s exact test, continuity " "correction, linear-by-linear association." msgstr "" #: src/ui/gui/psppire-dialog-action-crosstabs.c:74 #: src/language/stats/crosstabs.q:1334 msgid "Phi" msgstr "φ" #: src/ui/gui/psppire-dialog-action-crosstabs.c:75 msgid "CC" msgstr "Коеф. спряж." #: src/ui/gui/psppire-dialog-action-crosstabs.c:75 #, fuzzy #| msgid "Contingency Coefficient" msgid "Contingency coefficient" msgstr "Коефіцієнт непередбачуваності" #: src/ui/gui/psppire-dialog-action-crosstabs.c:77 msgid "UC" msgstr "Коеф. невизн." #: src/ui/gui/psppire-dialog-action-crosstabs.c:77 #, fuzzy #| msgid "Uncertainty Coefficient" msgid "Uncertainty coefficient" msgstr "Коефіцієнт невизначеності" #: src/ui/gui/psppire-dialog-action-crosstabs.c:78 msgid "BTau" msgstr "τ-b Кендала" #: src/ui/gui/psppire-dialog-action-crosstabs.c:78 #, fuzzy #| msgid "Kendall's tau-b" msgid "Kendall's Tau-b" msgstr "τ-b Кендала" #: src/ui/gui/psppire-dialog-action-crosstabs.c:79 msgid "CTau" msgstr "τ-c Кендала" #: src/ui/gui/psppire-dialog-action-crosstabs.c:79 #, fuzzy #| msgid "Kendall's tau-c" msgid "Kendall's Tau-c" msgstr "τ-c Кендала" #: src/ui/gui/psppire-dialog-action-crosstabs.c:80 msgid "Risk" msgstr "Ризик" #: src/ui/gui/psppire-dialog-action-crosstabs.c:80 #, fuzzy #| msgid "Risk Estimate" msgid "Relative Risk estimate" msgstr "Оцінка ризику" #: src/ui/gui/psppire-dialog-action-crosstabs.c:81 #: src/language/stats/crosstabs.q:1338 msgid "Gamma" msgstr "γ" #: src/ui/gui/psppire-dialog-action-crosstabs.c:82 msgid "D" msgstr "d Сомерса" #: src/ui/gui/psppire-dialog-action-crosstabs.c:82 #, fuzzy #| msgid "Somers' d" msgid "Somer's d" msgstr "d Сомерса" #: src/ui/gui/psppire-dialog-action-crosstabs.c:83 #: src/language/stats/crosstabs.q:1344 msgid "Kappa" msgstr "ϰ" #: src/ui/gui/psppire-dialog-action-crosstabs.c:83 msgid "Cohen's Kappa" msgstr "" #: src/ui/gui/psppire-dialog-action-crosstabs.c:84 #: src/language/stats/crosstabs.q:1429 msgid "Eta" msgstr "η" #: src/ui/gui/psppire-dialog-action-crosstabs.c:85 msgid "Corr" msgstr "Кореляції" #: src/ui/gui/psppire-dialog-action-crosstabs.c:85 #, fuzzy #| msgid "Spearman Correlation" msgid "Spearman correlation, Pearson's r" msgstr "Кореляція Спірмена" #: src/ui/gui/psppire-dialog-action-crosstabs.c:90 #, fuzzy #| msgid "Frequency" msgid "Frequency Count" msgstr "Частота" #: src/ui/gui/psppire-dialog-action-crosstabs.c:91 msgid "Row" msgstr "Рядок" #: src/ui/gui/psppire-dialog-action-crosstabs.c:91 #, fuzzy #| msgid "Percent" msgid "Row percent" msgstr "Відсоток" #: src/ui/gui/psppire-dialog-action-crosstabs.c:92 msgid "Column" msgstr "Стовпчик" #: src/ui/gui/psppire-dialog-action-crosstabs.c:92 #, fuzzy #| msgid "Column %" msgid "Column percent" msgstr "Частка стовпчиків" #: src/ui/gui/psppire-dialog-action-crosstabs.c:93 #, fuzzy #| msgid "Valid Percent" msgid "Total percent" msgstr "Коректний процент" #: src/ui/gui/psppire-dialog-action-crosstabs.c:94 #: src/language/stats/crosstabs.q:1266 msgid "Expected" msgstr "Очікувані" #: src/ui/gui/psppire-dialog-action-crosstabs.c:94 #, fuzzy #| msgid "Expected Values:" msgid "Expected value" msgstr "Очікувані значення:" #: src/ui/gui/psppire-dialog-action-crosstabs.c:96 #: src/language/stats/crosstabs.q:1268 msgid "Std. Residual" msgstr "Станд. залишки" #: src/ui/gui/psppire-dialog-action-crosstabs.c:96 #, fuzzy #| msgid "Std. Residual" msgid "Standardized Residual" msgstr "Станд. залишки" #: src/ui/gui/psppire-dialog-action-crosstabs.c:97 msgid "Adjusted Std. Residual" msgstr "Кориговані станд. залишки" #: src/ui/gui/psppire-dialog-action-descriptives.c:45 msgid "Standard error" msgstr "Стандартна похибка" #: src/ui/gui/psppire-dialog-action-descriptives.c:45 #, fuzzy #| msgid "Standard error of the mean" msgid "Standard error of mean" msgstr "Стандартна похибка середнього" #: src/ui/gui/psppire-dialog-action-descriptives.c:47 #, fuzzy #| msgid "Standard error of the kurtosis" msgid "Kurtosis and standard error of kurtosis" msgstr "Стандартна похибка ексцесу" #: src/ui/gui/psppire-dialog-action-descriptives.c:48 #, fuzzy #| msgid "Standard error of the skewness" msgid "Skewness and standard error of skewness" msgstr "Стандартна похибка нахилу" #: src/ui/gui/psppire-dialog-action-factor.c:323 #, c-format msgid "_Eigenvalues over %4.2f times the mean eigenvalue" msgstr "_Власні значення, що перевищують середнє у понад %4.2f разів" #: src/ui/gui/psppire-dialog-action-frequencies.c:44 msgid "Standard error of the mean" msgstr "Стандартна похибка середнього" #: src/ui/gui/psppire-dialog-action-frequencies.c:47 msgid "Standard error of the skewness" msgstr "Стандартна похибка нахилу" #: src/ui/gui/psppire-dialog-action-frequencies.c:51 msgid "Standard error of the kurtosis" msgstr "Стандартна похибка ексцесу" #: src/ui/gui/psppire-dialog-action-oneway.c:175 #, c-format msgid "Contrast %d of %d" msgstr "Контраст %d з %d" #: src/ui/gui/psppire-dialog-action-paired.c:162 src/ui/gui/examine.ui:282 #: src/ui/gui/indep-samples.ui:334 src/ui/gui/t-test.ui:296 msgid "O_ptions..." msgstr "П_араметри…" #: src/ui/gui/psppire-dialog-action-paired.c:168 msgid "Paired Samples T Test" msgstr "T-перевірка парних вибірок" #: src/ui/gui/psppire-dialog-action-recode-different.c:327 msgid "Recode into Different Variables" msgstr "Перекодувати до інших змінних" #: src/ui/gui/psppire-dialog-action-recode-different.c:330 msgid "Recode into Different Variables: Old and New Values " msgstr "Перекодування у інші змінні: попередні і нові значення " #: src/ui/gui/psppire-dialog-action-recode-same.c:108 src/ui/gui/recode.ui:391 msgid "Recode into Same Variables" msgstr "Перекодувати до тих самих змінних" #: src/ui/gui/psppire-dialog-action-recode-same.c:114 msgid "Recode into Same Variables: Old and New Values" msgstr "Перекодування у ті самі змінні: попередні і нові значення" #: src/ui/gui/psppire-dialog-action-regression.c:40 msgid "Coeff" msgstr "Коефіцієнти" #: src/ui/gui/psppire-dialog-action-regression.c:40 msgid "Show the regression coefficients" msgstr "Показати коефіцієнти регресії" #: src/ui/gui/psppire-dialog-action-regression.c:41 msgid "Conf. Interval" msgstr "Довірчий інтервал" #: src/ui/gui/psppire-dialog-action-regression.c:41 msgid "Show the confidence interval for the regression coefficients" msgstr "Показати довірчий інтервал для коефіцієнтів регресії" #: src/ui/gui/psppire-dialog-action-regression.c:42 msgid "Show the correlation between observed and predicted values" msgstr "" "Показати кореляцію між значеннями у спостереженнях та очікуваними значеннями" #: src/ui/gui/psppire-dialog-action-regression.c:43 msgid "Anova" msgstr "ANOVA" #: src/ui/gui/psppire-dialog-action-regression.c:43 msgid "Show the analysis of variance table" msgstr "Показати аналіз дисперсійної таблиці" #: src/ui/gui/psppire-dialog-action-regression.c:44 msgid "Bcov" msgstr "Ковар. матриця" #: src/ui/gui/psppire-dialog-action-regression.c:44 msgid "Show the variance coefficient matrix" msgstr "Показати матрицю коефіцієнтів дисперсії" #: src/ui/gui/psppire-dialog-action-regression.c:45 msgid "Tol" msgstr "тол" #: src/ui/gui/psppire-dialog-action-regression.c:45 msgid "Show the variance inflation factor and its reciprocal" msgstr "Показати фактор стискання дисперсії та обернену до нього величину" #: src/ui/gui/psppire-dialog-action-select.c:88 #, c-format msgid "Approximately %3d%% of all cases." msgstr "Приблизно %3d%% усіх спостережень." #: src/ui/gui/psppire-dialog-action-select.c:89 #, c-format msgid "Exactly %3d cases from the first %3d cases." msgstr "Точно %3d спостережень з перших %3d спостережень." #: src/ui/gui/psppire-dialog-action-select.c:236 #, c-format msgid "%d thru %d" msgstr "від %d до %d" #: src/ui/gui/psppire-dialog-action-two-sample.c:180 #: src/ui/gui/k-independent.ui:404 src/ui/gui/k-related.ui:197 msgid "Test Type" msgstr "Тип тесту" #: src/ui/gui/psppire-dialog-action-two-sample.c:189 msgid "_Wilcoxon" msgstr "_Уїлкоксона" #: src/ui/gui/psppire-dialog-action-two-sample.c:190 msgid "_Sign" msgstr "З_наків" #: src/ui/gui/psppire-dialog-action-two-sample.c:191 msgid "_McNemar" msgstr "_МакНемара" #: src/ui/gui/psppire-dialog-action-two-sample.c:209 msgid "Two-Related-Samples Tests" msgstr "Перевірки двох пов'язаних вибірок" #: src/ui/gui/psppire-dialog-action-weight.c:74 src/ui/gui/weight.ui:83 #: src/ui/gui/weight.ui:211 msgid "Do not weight cases" msgstr "Не зважувати спостереження" #: src/ui/gui/psppire-dialog-action-weight.c:80 #, c-format msgid "Weight cases by %s" msgstr "Зважити спостереження за %s" #: src/ui/gui/psppire-dict.c:95 msgid "Var" msgstr "Змін" #. TRANSLATORS: This string must be a valid variable name. That means: #. - The string must be at most 64 bytes (not characters) long. #. - The string may not contain whitespace. #. - The first character may not be '$' #. - The first character may not be a digit #. - The final character may not be '.' or '_' #. #: src/ui/gui/psppire-dict.c:385 #, c-format msgid "Var%04d" msgstr "Змін%04d" #: src/ui/gui/psppire-dict.c:566 msgid "Duplicate variable name." msgstr "Дублювання назви змінної." #: src/ui/gui/psppire-dictview.c:617 msgid "Prefer variable labels" msgstr "Перевага змінних міток" #: src/ui/gui/psppire-dictview.c:631 msgid "Default sort order" msgstr "Типове упорядкування" #: src/ui/gui/psppire-dictview.c:637 msgid "Unsorted (dictionary order)" msgstr "Без впорядковування (порядок словника)" #: src/ui/gui/psppire-dictview.c:642 msgid "Sort by name" msgstr "Упорядкувати за назвою" #: src/ui/gui/psppire-dictview.c:647 msgid "Sort by label" msgstr "Упорядкувати за міткою" #: src/ui/gui/psppire-means-layer.c:95 #, c-format msgid "Layer %d of %d" msgstr "Шар %d з %d" #: src/ui/gui/psppire-means-layer.c:169 msgid "Forward" msgstr "Вперед" #: src/ui/gui/psppire-means-layer.c:170 msgid "Back" msgstr "Назад" #: src/ui/gui/psppire-text-file.c:55 #, c-format msgid "Could not open `%s'" msgstr "Не вдалося відкрити «%s»" #: src/ui/gui/psppire-text-file.c:71 #, c-format msgid "Error reading `%s': %s" msgstr "Помилка під час читання «%s»: %s" #: src/ui/gui/psppire-text-file.c:74 #, c-format msgid "" "Failed to read `%s', because it contains a line over %d bytes long and " "therefore appears not to be a text file." msgstr "" "Не вдалося прочитати дані з «%s», оскільки у файлі міститься рядок об'ємом у " "понад %d байтів, тому, ймовірно, цей файл не є текстовим." #: src/ui/gui/psppire-text-file.c:96 #, c-format msgid "`%s' is empty." msgstr "«%s» є порожнім." #: src/ui/gui/psppire-val-chooser.c:255 msgid "through" msgstr "до" #: src/ui/gui/psppire-val-chooser.c:288 msgid "_Value:" msgstr "_Значення:" #: src/ui/gui/psppire-val-chooser.c:289 msgid "_System Missing" msgstr "С_истемне пропущене" #: src/ui/gui/psppire-val-chooser.c:290 msgid "System _or User Missing" msgstr "Системне _або користувацьке пропущене" #: src/ui/gui/psppire-val-chooser.c:291 msgid "_Range:" msgstr "_Діапазон від:" #: src/ui/gui/psppire-val-chooser.c:292 msgid "Range, _LOWEST thru value" msgstr "Діапазон, з_начення від найменшого до вказаного" #: src/ui/gui/psppire-val-chooser.c:293 msgid "Range, value thru _HIGHEST" msgstr "Діапазон, значення від вказаного _до найбільшого" #: src/ui/gui/psppire-val-chooser.c:294 msgid "_All other values" msgstr "_Усі інші значення" #: src/ui/gui/psppire-var-view.c:153 #, c-format msgid "Var%d" msgstr "Змін%d" #: src/ui/source-init-opts.c:72 #, c-format msgid "Algorithm must be either `%s' or `%s'." msgstr "Алгоритмом має бути «%s» або «%s»." #: src/ui/source-init-opts.c:97 #, c-format msgid "Syntax must be either `%s' or `%s'." msgstr "Синтаксичною конструкцією має бути «%s» або «%s»." #: src/ui/terminal/main.c:144 msgid "Error encountered while ERROR=STOP is effective." msgstr "Сталася помилка, коли було задіяно ERROR=STOP." #: src/ui/terminal/main.c:150 msgid "" "Stopping syntax file processing here to avoid a cascade of dependent command " "failures." msgstr "" "На цьому місці обробку синтаксичного файла припинено, щоб запобігти показу " "подальших повідомлень про помилки під час виконання наступних команд." #: src/ui/terminal/terminal-opts.c:147 #, c-format msgid "" "PSPP, a program for statistical analysis of sampled data.\n" "Usage: %s [OPTION]... FILE...\n" "\n" "Arguments to long options also apply to equivalent short options.\n" "\n" "Output options:\n" " -o, --output=FILE output to FILE, default format from FILE's name\n" " -O format=FORMAT override format for previous -o\n" " -O OPTION=VALUE set output option to customize previous -o\n" " -O device={terminal|listing} override device type for previous -o\n" " -e, --error-file=FILE append errors, warnings, and notes to FILE\n" " --no-output disable default output driver\n" "Supported output formats: %s\n" "\n" "Language options:\n" " -I, --include=DIR append DIR to search path\n" " -I-, --no-include clear search path\n" " -r, --no-statrc disable running rc file at startup\n" " -a, --algorithm={compatible|enhanced}\n" " set to `compatible' if you want output\n" " calculated from broken algorithms\n" " -x, --syntax={compatible|enhanced}\n" " set to `compatible' to disable PSPP extensions\n" " -b, --batch interpret syntax in batch mode\n" " -i, --interactive interpret syntax in interactive mode\n" " --syntax-encoding=ENCODING specify encoding for syntax files\n" " -s, --safer don't allow some unsafe operations\n" "Default search path: %s\n" "\n" "Informative output:\n" " -h, --help display this help and exit\n" " -V, --version output version information and exit\n" "\n" "Non-option arguments are interpreted as syntax files to execute.\n" msgstr "" "PSPP, програма для статистичного аналізу даних вибірок.\n" "Користування: %s [ПАРАМЕТР]... ФАЙЛ...\n" "\n" "Аргументи довгих версій запису параметрів також стосуються і скорочених\n" " версій запису.\n" "\n" "Параметри виведення даних:\n" " -o, --output=ФАЙЛ вивести дані до ФАЙЛа, типово формат " "визначається\n" " за назвою\n" " -O format=ФОРМАТ перевизначити формат для попереднього -o\n" " -O ПАРАМЕТР=ЗНАЧЕННЯ встановити значення параметра виведення з метою\n" " коригування попереднього -o\n" " -O device={terminal|listing} перевизначити тип пристрою для попереднього -" "o\n" " -e, --error-file=ФАЙЛ дописувати повідомлення щодо помилок, " "попереджень\n" " та нотаток до ФАЙЛа\n" " --no-output вимкнути типовий драйвер виведення\n" "Підтримувані формати виведення даних: %s\n" "\n" "Параметри мови:\n" " -I, --include=КАТАЛОГ дописати КАТАЛОГ до списку каталогів пошуку " "даних\n" " -I-, --no-include спорожнити список каталогів пошуку даних\n" " -r, --no-statrc вимкнути виконання файла rc під час запуску\n" " -a, --algorithm={compatible|enhanced}\n" " встановіть значення «compatible», якщо виведені " "дані\n" " слід обчислювати на основі сумісних зі старими\n" " версіями алгоритмів, які містять помилки\n" " -x, --syntax={compatible|enhanced}\n" " встановіть значення «compatible», щоб вимкнути\n" " розширення PSPP\n" " -b, --batch обробляти синтаксичні конструкції у пакетному " "режимі\n" " -i, --interactive обробляти синтаксичні конструкції у " "інтерактивному режимі\n" " --syntax-encoding=КОДУВАННЯ вказати кодування файлів синтаксичних " "конструкцій\n" " -s, --safer заборонити усі дії, окрім безпечних\n" "Типовий шлях пошуку даних: %s\n" "\n" "Виведення інформаційних даних:\n" " -h, --help показати це довідкове повідомлення і завершити " "роботу\n" " -V, --version вивести дані щодо версії і завершити роботу\n" "\n" "Аргументи, які не є параметрами, вважаються файлами синтаксичних " "конструкцій, які\n" "слід виконати.\n" #: src/ui/gui/find-dialog.c:197 msgid "Find" msgstr "Знайти" #: src/ui/gui/find-dialog.c:662 #, c-format msgid "Bad regular expression: %s" msgstr "Помилковий формальний вираз: %s" #: src/ui/gui/help-menu.c:70 msgid "A program for the analysis of sampled data" msgstr "Програма для аналізу даних вибірок" #. TRANSLATORS: Do not translate this string. Instead, put the names of the people #. who have helped in the translation. #: src/ui/gui/help-menu.c:80 msgid "translator-credits" msgstr "Юрій Чорноіван " #: src/ui/gui/help-menu.c:170 #, c-format msgid "Help path conversion error: %s" msgstr "Помилка перетворення шляхів до довідкових даних: %s" #: src/ui/gui/help-menu.c:197 #, fuzzy, c-format #| msgid "" #| "Cannot open reference manual via yelp: %s. Cannot open via html: %s with " #| "uri: %s The PSSP manual is also available at %s" msgid "" "Cannot open via html: %s with uri: %s The PSSP manual is also available at %s" msgstr "" "Не вдалося відкрити довідковий підручник за допомогою yelp: %s. Не вдалося " "відкрити HTML: %s із адресою %s. З підручником для користувачів PSPP можна " "ознайомитися за адресою %s" #: src/ui/gui/help-menu.c:218 msgid "_Help" msgstr "_Довідка" #: src/ui/gui/help-menu.c:221 msgid "_About" msgstr "_Про програму" #: src/ui/gui/help-menu.c:222 msgid "_Reference Manual" msgstr "_Довідковий підручник" #: src/ui/gui/main.c:306 msgid "Show version information and exit" msgstr "Показати інформацію щодо версії і завершити роботу" #: src/ui/gui/main.c:409 msgid "Do not display the splash screen" msgstr "Не показувати вікно вітання" #: src/ui/gui/main.c:411 msgid "Do not attempt single instance negotiation" msgstr "Не намагатися виконати узгодження для єдиності екземпляра програми" #: src/ui/gui/missing-val-dialog.c:217 msgid "" "The maximum length of a missing value for a string variable is 8 in UTF-8." msgstr "" "Максимальною довжиною пропущеного значення для рядкової змінної є 8 у " "кодуванні UTF-8." #: src/ui/gui/missing-val-dialog.c:268 msgid "At least one value must be specified" msgstr "Слід вказати принаймні одне значення" #: src/ui/gui/missing-val-dialog.c:298 msgid "Incorrect range specification" msgstr "Некоректне визначення діапазону" #: src/ui/gui/psppire-data-editor.c:380 #, c-format msgid "%d : %s" msgstr "%d: %s" #: src/ui/gui/psppire-data-editor.c:391 #, c-format msgid "%'d case" msgid_plural "%'d cases" msgstr[0] "%'d спостереження" msgstr[1] "%'d спостереження" msgstr[2] "%'d спостережень" msgstr[3] "%'d спостереження" #: src/ui/gui/psppire-data-editor.c:396 #, c-format msgid "%'d variable" msgid_plural "%'d variables" msgstr[0] "%'d змінна" msgstr[1] "%'d змінні" msgstr[2] "%'d змінних" msgstr[3] "%'d змінна" #: src/ui/gui/psppire-data-editor.c:485 msgid "Case" msgstr "Спостереження" #: src/ui/gui/psppire-data-editor.c:495 msgid "Data View" msgstr "Перегляд даних" #: src/ui/gui/psppire-data-editor.c:505 msgid "Variable View" msgstr "Перегляд змінних" #: src/ui/gui/psppire-data-sheet.c:171 src/ui/gui/psppire-data-window.c:1338 msgid "_Insert Case" msgstr "Вс_тавити спостереження" #: src/ui/gui/psppire-data-sheet.c:179 src/ui/gui/psppire-data-window.c:1391 msgid "Cl_ear Cases" msgstr "С_порожнити спостереження" #: src/ui/gui/psppire-data-sheet.c:305 src/ui/gui/psppire-data-window.c:1337 #: src/ui/gui/psppire-variable-sheet.c:274 msgid "_Insert Variable" msgstr "Вс_тавити змінну" #: src/ui/gui/psppire-data-sheet.c:314 src/ui/gui/psppire-variable-sheet.c:283 msgid "Cl_ear Variables" msgstr "Споро_жнити змінні" #: src/ui/gui/psppire-data-sheet.c:326 msgid "Sort _Ascending" msgstr "Впорядкувати за з_ростанням" #: src/ui/gui/psppire-data-sheet.c:333 msgid "Sort _Descending" msgstr "Впорядкувати за сп_аданням" #: src/ui/gui/psppire-data-window.c:175 msgid "Transformations Pending" msgstr "Перетворення у черзі" #: src/ui/gui/psppire-data-window.c:191 msgid "Filter off" msgstr "Фільтр. вимкн." #: src/ui/gui/psppire-data-window.c:203 #, c-format msgid "Filter by %s" msgstr "Фільтрування за %s" #: src/ui/gui/psppire-data-window.c:224 msgid "No Split" msgstr "Без поділу" #: src/ui/gui/psppire-data-window.c:233 msgid "Split by " msgstr "Критерій поділу: " #: src/ui/gui/psppire-data-window.c:261 msgid "Weights off" msgstr "Зваж. вимкн." #: src/ui/gui/psppire-data-window.c:273 #, c-format msgid "Weight by %s" msgstr "Вага за %s" #: src/ui/gui/psppire-data-window.c:518 #: src/ui/gui/psppire-import-assistant.c:681 #: src/ui/gui/psppire-syntax-window.c:607 src/ui/gui/psppire-window.c:669 msgid "All Files" msgstr "усі файли" #: src/ui/gui/psppire-data-window.c:535 msgid "System File" msgstr "Системний файл" #: src/ui/gui/psppire-data-window.c:542 msgid "Compressed System File" msgstr "Стиснений системний файл" #: src/ui/gui/psppire-data-window.c:548 msgid "Portable File" msgstr "Портативний файл" #: src/ui/gui/psppire-data-window.c:551 msgid "Format:" msgstr "Формат:" #: src/ui/gui/psppire-data-window.c:615 msgid "Delete Existing Dataset?" msgstr "Вилучити наявний набір даних?" #: src/ui/gui/psppire-data-window.c:619 #, c-format msgid "" "Renaming \"%s\" to \"%s\" will destroy the existing dataset named \"%s\". " "Are you sure that you want to do this?" msgstr "" "Перейменування «%s» на «%s» призведе до знищення наявного набору даних з " "назвою «%s». Ви справді цього хочете?" #: src/ui/gui/psppire-data-window.c:625 msgid "Delete" msgstr "Вилучити" #: src/ui/gui/psppire-data-window.c:647 #, c-format msgid "Please enter a new name for dataset \"%s\":" msgstr "Вкажіть нову назву набору даних «%s»:" #: src/ui/gui/psppire-data-window.c:649 msgid "Rename Dataset" msgstr "Перейменувати набір даних" #: src/ui/gui/psppire-data-window.c:1199 src/ui/gui/output-window.ui:68 #: src/ui/gui/syntax-editor.ui:22 msgid "_File" msgstr "_Файл" #: src/ui/gui/psppire-data-window.c:1203 src/ui/gui/syntax-editor.ui:25 msgid "_New" msgstr "С_творити" #: src/ui/gui/psppire-data-window.c:1210 msgid "_Syntax" msgstr "Си_нтаксис" #: src/ui/gui/psppire-data-window.c:1213 src/ui/gui/data-editor.ui:177 #: src/ui/gui/data-editor.ui:189 msgid "_Data" msgstr "_Дані" #: src/ui/gui/psppire-data-window.c:1220 src/ui/gui/syntax-editor.ui:36 msgid "_Open" msgstr "_Відкрити" #: src/ui/gui/psppire-data-window.c:1223 msgid "_Import Data..." msgstr "І_мпортувати дані…" #: src/ui/gui/psppire-data-window.c:1231 src/ui/gui/logistic.ui:261 #: src/ui/gui/regression.ui:66 msgid "_Save..." msgstr "З_берегти…" #: src/ui/gui/psppire-data-window.c:1234 msgid "Save _As..." msgstr "Зберегти _як…" #: src/ui/gui/psppire-data-window.c:1237 msgid "_Rename Dataset..." msgstr "П_ерейменувати набір даних…" #: src/ui/gui/psppire-data-window.c:1248 msgid "_Display Data File Information" msgstr "_Показати відомості щодо файла даних" #: src/ui/gui/psppire-data-window.c:1255 msgid "Working File" msgstr "Поточного файла" #: src/ui/gui/psppire-data-window.c:1257 msgid "_External File..." msgstr "Зов_нішнього файла…" #: src/ui/gui/psppire-data-window.c:1267 msgid "_Recently Used Data" msgstr "Не_щодавно використані дані" #: src/ui/gui/psppire-data-window.c:1268 msgid "Recently Used _Files" msgstr "Нещодавно використані _файли" #: src/ui/gui/psppire-data-window.c:1315 src/ui/gui/output-window.ui:82 #: src/ui/gui/syntax-editor.ui:59 msgid "_Quit" msgstr "Ви_йти" #: src/ui/gui/psppire-data-window.c:1333 src/ui/gui/output-window.ui:89 #: src/ui/gui/syntax-editor.ui:66 msgid "_Edit" msgstr "З_міни" #: src/ui/gui/psppire-data-window.c:1339 msgid "_Go To Variable..." msgstr "Пере_йти до змінної…" #: src/ui/gui/psppire-data-window.c:1340 msgid "_Go To Case..." msgstr "П_ерейти до спостереження…" #: src/ui/gui/psppire-data-window.c:1364 src/ui/gui/syntax-editor.ui:69 msgid "Cu_t" msgstr "Ви_різати" #: src/ui/gui/psppire-data-window.c:1373 src/ui/gui/output-window.ui:96 #: src/ui/gui/syntax-editor.ui:74 msgid "_Copy" msgstr "_Копіювати" #: src/ui/gui/psppire-data-window.c:1380 src/ui/gui/syntax-editor.ui:79 msgid "_Paste" msgstr "Вст_авити" #: src/ui/gui/psppire-data-window.c:1387 msgid "Clear _Variables" msgstr "Споро_жнити змінні" #: src/ui/gui/psppire-data-window.c:1401 msgid "_Find..." msgstr "З_найти…" #: src/ui/gui/psppire-data-window.c:1407 src/ui/gui/logistic.ui:246 msgid "_Options..." msgstr "П_араметри…" #: src/ui/gui/psppire-data-window.c:1676 msgid "Jump to variable" msgstr "Перейти до змінної" #: src/ui/gui/psppire-data-window.c:1689 msgid "Jump to a case in the data sheet" msgstr "Перейти до спостереження у таблиці даних" #: src/ui/gui/psppire-data-window.c:1703 msgid "Search for values in the data" msgstr "Шукати значення у даних" #: src/ui/gui/psppire-data-window.c:1715 msgid "Create a new case at the current position" msgstr "Створити запис спостереження у поточній позиції" #: src/ui/gui/psppire-data-window.c:1727 msgid "Create a new variable at the current position" msgstr "Створити запис нової змінної у поточній позиції" #: src/ui/gui/psppire-data-window.c:1741 msgid "Split the active dataset" msgstr "Поділити поточний набір даних" #: src/ui/gui/psppire-data-window.c:1753 msgid "Weight cases by variable" msgstr "Зважити спостереження за змінною" #: src/ui/gui/psppire-data-window.c:1764 msgid "Show/hide value labels" msgstr "Показати або сховати мітки значень" #: src/ui/gui/psppire-data-window.c:1904 msgid "Data Editor" msgstr "Редактор даних" #: src/ui/gui/psppire-encoding-selector.c:140 msgid "Automatically Detect" msgstr "Визначити автоматично" #: src/ui/gui/psppire-encoding-selector.c:147 msgid "Locale Encoding" msgstr "Локальне кодування" #: src/ui/gui/psppire-encoding-selector.c:177 msgid "Character Encoding: " msgstr "Кодування символів: " #: src/ui/gui/psppire-import-assistant.c:337 msgid "line" msgstr "рядок" #: src/ui/gui/psppire-import-assistant.c:347 msgid "var" msgstr "змін" #: src/ui/gui/psppire-import-assistant.c:560 msgid "Importing Spreadsheet Data" msgstr "Імпортування даних з електронної таблиці" #: src/ui/gui/psppire-import-assistant.c:686 msgid "Text Files" msgstr "текстові файли" #: src/ui/gui/psppire-import-assistant.c:691 msgid "Text (*.txt) Files" msgstr "текстові файли (*.txt)" #: src/ui/gui/psppire-import-assistant.c:697 msgid "Plain Text (ASCII) Files" msgstr "звичайні текстові файли (ASCII)" #: src/ui/gui/psppire-import-assistant.c:702 msgid "Comma Separated Value Files" msgstr "файли значень, відокремлених комами" #: src/ui/gui/psppire-import-assistant.c:709 msgid "Tab Separated Value Files" msgstr "файли значень, відокремлених табуляціями" #: src/ui/gui/psppire-import-assistant.c:714 msgid "Gnumeric Spreadsheet Files" msgstr "файли електронних таблиць Gnumeric" #: src/ui/gui/psppire-import-assistant.c:719 msgid "OpenDocument Spreadsheet Files" msgstr "файли електронних таблиць OpenDocument" #: src/ui/gui/psppire-import-assistant.c:724 msgid "All Spreadsheet Files" msgstr "усі файли електронних таблиць" #: src/ui/gui/psppire-import-assistant.c:733 msgid "Select File to Import" msgstr "Виберіть файл для імпортування" #: src/ui/gui/psppire-import-assistant.c:770 msgid "Importing Delimited Text Data" msgstr "Імпортуємо розділені текстові дані" #: src/ui/gui/psppire-import-assistant.c:865 msgid "Select the First Line" msgstr "Виберіть перший рядок" #: src/ui/gui/psppire-import-assistant.c:877 msgid "Line" msgstr "Рядок" #: src/ui/gui/psppire-import-assistant.c:931 msgid "" "This assistant will guide you through the process of importing data into " "PSPP from a text file with one line per case, in which fields are separated " "by tabs, commas, or other delimiters.\n" "\n" msgstr "" "За допомогою цієї допоміжної програми ви зможете виконати процедуру " "імпортування до PSPP даних з текстового файла, у якому кожне спостереження " "записано у окремому рядку, а поля відокремлено символами табуляції, комами " "або іншими роздільниками.\n" "\n" #: src/ui/gui/psppire-import-assistant.c:941 #, c-format msgid "The selected file contains %'lu line of text. " msgid_plural "The selected file contains %'lu lines of text. " msgstr[0] "У позначеному файлі міститься %'lu рядок тексту. " msgstr[1] "У позначеному файлі міститься %'lu рядки тексту. " msgstr[2] "У позначеному файлі міститься %'lu рядків тексту. " msgstr[3] "У позначеному файлі міститься %'lu рядок тексту. " #: src/ui/gui/psppire-import-assistant.c:950 #, c-format msgid "The selected file contains approximately %'lu line of text. " msgid_plural "The selected file contains approximately %'lu lines of text. " msgstr[0] "У позначеному файлі міститься приблизно %'lu рядок тексту. " msgstr[1] "У позначеному файлі міститься приблизно %'lu рядки тексту. " msgstr[2] "У позначеному файлі міститься приблизно %'lu рядків тексту. " msgstr[3] "У позначеному файлі міститься приблизно %'lu рядок тексту. " #: src/ui/gui/psppire-import-assistant.c:956 #, c-format msgid "" "Only the first %zu line of the file will be shown for preview purposes in " "the following screens. " msgid_plural "" "Only the first %zu lines of the file will be shown for preview purposes in " "the following screens. " msgstr[0] "" "На наступних сторінках, з метою попереднього перегляду, буде показано лише " "перший %zu рядок файла. " msgstr[1] "" "На наступних сторінках, з метою попереднього перегляду, буде показано лише " "перші %zu рядки файла. " msgstr[2] "" "На наступних сторінках, з метою попереднього перегляду, буде показано лише " "перші %zu рядків файла. " msgstr[3] "" "На наступних сторінках, з метою попереднього перегляду, буде показано лише " "перший %zu рядок файла. " #: src/ui/gui/psppire-import-assistant.c:965 msgid "You may choose below how much of the file should actually be imported." msgstr "Нижче ви можете вказати частину файла, яку слід імпортувати." #: src/ui/gui/psppire-import-assistant.c:974 #, c-format msgid "Only the first %4d cases" msgstr "Лише перші %4d спостережень" #: src/ui/gui/psppire-import-assistant.c:985 #, c-format msgid "Only the first %3d %% of file (approximately)" msgstr "Лише перші %3d%% файла (приблизно)" #: src/ui/gui/psppire-import-assistant.c:1009 msgid "Select the Lines to Import" msgstr "Виберіть рядки для імпортування" #: src/ui/gui/psppire-import-assistant.c:1151 msgid "Choose Separators" msgstr "Виберіть роздільник" #: src/ui/gui/psppire-import-assistant.c:1438 msgid "Adjust Variable Formats" msgstr "Коригування форматів змінних" #: src/ui/gui/psppire-output-view.c:410 msgid "Message" msgstr "Повідомлення" #: src/ui/gui/psppire-output-view.c:543 msgid "failed to create temporary directory during clipboard operation" msgstr "" "не вдалося створити каталог тимчасових даних під час дій з буфером обміну " "даними" #: src/ui/gui/psppire-output-window.c:241 msgid "Infer file type from extension" msgstr "Визначити тип файла за суфіксом назви" #: src/ui/gui/psppire-output-window.c:242 msgid "SPSS Viewer (*.spv)" msgstr "переглядач SPSS (*.spv)" #: src/ui/gui/psppire-output-window.c:243 msgid "PDF (*.pdf)" msgstr "PDF (*.pdf)" #: src/ui/gui/psppire-output-window.c:244 msgid "HTML (*.html)" msgstr "HTML (*.html)" #: src/ui/gui/psppire-output-window.c:245 msgid "OpenDocument (*.odt)" msgstr "OpenDocument (*.odt)" #: src/ui/gui/psppire-output-window.c:246 msgid "Text (*.txt)" msgstr "текст (*.txt)" #: src/ui/gui/psppire-output-window.c:247 msgid "Text [plain] (*.txt)" msgstr "текст [звичайний] (*.txt)" #: src/ui/gui/psppire-output-window.c:248 msgid "PostScript (*.ps)" msgstr "PostScript (*.ps)" #: src/ui/gui/psppire-output-window.c:249 msgid "Comma-Separated Values (*.csv)" msgstr "відокремлені комами значення (*.csv)" #: src/ui/gui/psppire-output-window.c:350 msgid "Export Output" msgstr "Експортувати виведені дані" #: src/ui/gui/psppire-output-window.c:548 msgid "Output Viewer" msgstr "Перегляд виведених даних" #: src/ui/gui/psppire-spreadsheet-model.c:237 msgid "(empty)" msgstr "(порожньо)" #: src/ui/gui/psppire-syntax-window.c:226 msgid "Text Search" msgstr "Пошук тексту" #: src/ui/gui/psppire-syntax-window.c:229 msgid "_OK" msgstr "_Гаразд" #: src/ui/gui/psppire-syntax-window.c:231 msgid "_Cancel" msgstr "_Скасувати" #: src/ui/gui/psppire-syntax-window.c:239 msgid "Text to search for:" msgstr "Текст, який слід шукати:" #: src/ui/gui/psppire-syntax-window.c:570 #, c-format msgid "Saved file `%s'" msgstr "Збережено файл «%s»" #: src/ui/gui/psppire-syntax-window.c:591 msgid "Save Syntax" msgstr "Зберегти синтаксис" #: src/ui/gui/psppire-syntax-window.c:601 src/ui/gui/psppire-window.c:657 msgid "Syntax Files (*.sps) " msgstr "файли синтаксису (*.sps) " #: src/ui/gui/psppire-syntax-window.c:970 msgid "Syntax Editor" msgstr "Редактор синтаксису" #: src/ui/gui/psppire-syntax-window.c:990 #, c-format msgid "Cannot load syntax file `%s'" msgstr "Не вдалося завантажити файл синтаксису «%s»" #: src/ui/gui/psppire-variable-sheet.c:412 #, c-format msgid "{%s, %s}..." msgstr "{%s, %s}…" #: src/ui/gui/psppire-var-sheet-header.c:64 msgid "Decimal" msgstr "Знаків після коми" #: src/ui/gui/psppire-var-sheet-header.c:79 msgid "Align" msgstr "Вирівняти" #: src/ui/gui/psppire-var-sheet-header.c:82 msgid "Measure" msgstr "Міра" #: src/ui/gui/psppire-window.c:430 #, c-format msgid "Save the changes to `%s' before closing?" msgstr "Зберегти зміни до «%s», перш ніж закривати?" #: src/ui/gui/psppire-window.c:437 #, c-format msgid "" "If you don't save, changes from the last %ld seconds will be permanently " "lost." msgstr "" "Якщо ви не збережете дані, зміни, внесені протягом останніх %ld секунд, буде " "втрачено." #: src/ui/gui/psppire-window.c:441 msgid "Close _without saving" msgstr "Закрити _без збереження" #: src/ui/gui/psppire-window.c:625 src/ui/gui/psppire-window.c:629 msgid "Open" msgstr "Відкрити" #: src/ui/gui/psppire-window.c:634 msgid "Data and Syntax Files" msgstr "Файли даних і синтаксису" #: src/ui/gui/psppire-window.c:646 msgid "System Files (*.sav, *.zsav)" msgstr "системні файли (*.sav, *.zsav)" #: src/ui/gui/psppire-window.c:663 msgid "Output Files (*.spv) " msgstr "файли результатів (*.spv) " #: src/ui/gui/t-test-options.c:65 #, c-format msgid "Con_fidence Interval: %2d %%" msgstr "_Довірчий інтервал: %2d %%" #: src/ui/gui/val-labs-dialog.c:591 #, c-format msgid "%s = `%s'" msgstr "%s = «%s»" #: src/ui/gui/var-type-dialog.c:541 #, fuzzy #| msgid "Variable and Name" msgid "Variable Type and Format" msgstr "Змінна і назва" #: src/ui/gui/windows-menu.c:92 msgid "_Minimize all Windows" msgstr "_Мінімізувати усі вікна" #: src/ui/gui/windows-menu.c:100 msgid "_Split" msgstr "_Розділити" #: src/ui/gui/windows-menu.c:132 msgid "_Windows" msgstr "_Вікна" #: utilities/pspp-convert.c:67 #, c-format msgid "%s argument must be a single character" msgstr "Аргументом %s має бути одинарний символ" #: utilities/pspp-convert.c:265 msgid "exactly two non-option arguments are required; use --help for help" msgstr "" "має бути вказано точно два аргументи, які не є параметрами; скористайтеся " "параметром --help, щоб отримати довідку" #: utilities/pspp-convert.c:276 #, c-format msgid "%s: cannot guess output format (use -O option)" msgstr "" "%s: не далося визначити формат виведення даних (скористайтеся параметром -O)" #: utilities/pspp-convert.c:341 #, c-format msgid "%s: unknown output format (use -O option)" msgstr "%s: невідомий формат виведення даних (скористайтеся параметром -O)" #: utilities/pspp-convert.c:360 #, c-format msgid "%s: error reading input file" msgstr "%s: помилка під час спроби читання файла вхідних даних" #: utilities/pspp-convert.c:362 #, c-format msgid "%s: error writing output file" msgstr "%s: помилка під час спроби запису файла результатів" #: utilities/pspp-convert.c:409 #, c-format msgid "%s: error opening password file" msgstr "%s: помилка під час спроби відкрити файл паролів" #: utilities/pspp-convert.c:425 #, c-format msgid "" "\n" "%s: password not in file" msgstr "" "\n" "%s: у файлі немає пароля" #: utilities/pspp-convert.c:462 #, c-format msgid "%s: '%c' is not in alphabet" msgstr "%s: «%c» немає в абетці" #: utilities/pspp-convert.c:526 msgid "sorry, wrong password" msgstr "вибачте, помилковий пароль" #: utilities/pspp-output.c:92 #, c-format msgid "%s and %s:" msgstr "%s і %s:" #: utilities/pspp-output.c:547 #, c-format msgid "%s: invalid XPath expression" msgstr "%s: некоректний вираз XPath" #: utilities/pspp-output.c:716 msgid "missing command name (use --help for help)" msgstr "не вказано назви команди (скористайтеся --help, щоб отримати довідку)" #: utilities/pspp-output.c:720 #, c-format msgid "unknown command \"%s\" (use --help for help)" msgstr "невідома команда «%s» (скористайтеся --help, щоб отримати довідку)" #: utilities/pspp-output.c:728 #, fuzzy, c-format #| msgid "\"%s\" command takes exactly %d argument%s" msgid "\"%s\" command takes exactly %d argument" msgid_plural "\"%s\" command takes exactly %d arguments" msgstr[0] "Команді «%s» має бути передано точно %d аргумент%s" msgstr[1] "Команді «%s» має бути передано точно %d аргумент%s" msgstr[2] "Команді «%s» має бути передано точно %d аргумент%s" msgstr[3] "Команді «%s» має бути передано точно %d аргумент%s" #: utilities/pspp-output.c:735 #, fuzzy, c-format #| msgid "\"%s\" command requires at least %d argument%s" msgid "\"%s\" command requires at least %d argument" msgid_plural "\"%s\" command requires at least %d arguments" msgstr[0] "Команда «%s» потребує принаймні %d аргумент%s" msgstr[1] "Команда «%s» потребує принаймні %d аргумент%s" msgstr[2] "Команда «%s» потребує принаймні %d аргумент%s" msgstr[3] "Команда «%s» потребує принаймні %d аргумент%s" #: utilities/pspp-output.c:742 #, c-format msgid "\"%s\" command requires between %d and %d arguments" msgstr "«%s» потребує від %d до %d аргументів" #: utilities/pspp-output.c:782 msgid "The following object classes are supported:" msgstr "Передбачено підтримку таких класів об'єктів:" #: utilities/pspp-output.c:791 #, c-format msgid "%s: unknown object class (use --select=help for help" msgstr "" "%s: невідомий клас об'єктів (скористайтеся --select=help, щоб отримати " "довідку" #: src/language/utilities/set.q:162 #, c-format msgid "%s must be between 0 and 20." msgstr "Значення %s має належати діапазону від 0 до 20." #: src/language/utilities/set.q:172 src/language/utilities/set.q:179 #, c-format msgid "%s must be at least 1." msgstr "%s має бути не меншим за 1." #: src/language/utilities/set.q:205 #, c-format msgid "%s must be at least 1MB" msgstr "%s має бути не меншим за 1 МБ" #: src/language/utilities/set.q:207 #, c-format msgid "%s must be positive" msgstr "%s має бути додатним" #: src/language/utilities/set.q:213 src/language/utilities/set.q:215 #: src/language/utilities/set.q:217 src/language/utilities/set.q:219 #: src/language/utilities/set.q:221 src/language/utilities/set.q:223 #: src/language/utilities/set.q:225 src/language/utilities/set.q:227 #: src/language/utilities/set.q:229 src/language/utilities/set.q:231 #: src/language/utilities/set.q:233 #, c-format msgid "%s is obsolete." msgstr "%s є зайвим." #: src/language/utilities/set.q:239 msgid "Active file compression is not implemented." msgstr "Стискання активного файла не реалізовано." #: src/language/utilities/set.q:403 #, c-format msgid "%s must be 1500 or later." msgstr "Значенням %s має бути пізніше за 1500 значення." #: src/language/utilities/set.q:410 #, c-format msgid "expecting %s or year" msgstr "мало бути %s або рік" #: src/language/utilities/set.q:438 src/language/utilities/set.q:535 #, c-format msgid "%s must be at least %d." msgstr "%s має бути не меншим за %d." #: src/language/utilities/set.q:474 #, c-format msgid "%s is not a recognized encoding or locale name" msgstr "%s не є відомою програмі назвою кодування або локалі" #: src/language/utilities/set.q:562 #, c-format msgid "" "%s requires numeric output format as an argument. Specified format %s is of " "type string." msgstr "" "У команді %s слід вказувати аргумент формату виведення числових даних. " "Вказаним форматом %s є рядковий." #: src/language/utilities/set.q:791 msgid "ISL (32-bit IEEE 754 single, little-endian)" msgstr "ISL (32-бітове одинарної точності, IEEE 754, прямий порядок байтів)" #: src/language/utilities/set.q:794 msgid "ISB (32-bit IEEE 754 single, big-endian)" msgstr "ISB (32-бітове одинарної точності, IEEE 754, зворотний порядок байтів)" #: src/language/utilities/set.q:797 msgid "IDL (64-bit IEEE 754 double, little-endian)" msgstr "IDL (32-бітове подвійної точності, IEEE 754, прямий порядок байтів)" #: src/language/utilities/set.q:800 msgid "IDB (64-bit IEEE 754 double, big-endian)" msgstr "IDB (64-бітове подвійної точності, IEEE 754, зворотний порядок байтів)" #: src/language/utilities/set.q:804 msgid "VF (32-bit VAX F, VAX-endian)" msgstr "VF (32-бітове, VAX F, порядок байтів VAX)" #: src/language/utilities/set.q:807 msgid "VD (64-bit VAX D, VAX-endian)" msgstr "VD (64-бітове, VAX D, порядок байтів VAX)" #: src/language/utilities/set.q:810 msgid "VG (64-bit VAX G, VAX-endian)" msgstr "VG (64-бітове, VAX G, порядок байтів VAX)" #: src/language/utilities/set.q:814 msgid "ZS (32-bit IBM Z hexadecimal short, big-endian)" msgstr "" "ZS (32-бітове, IBM Z, шістнадцяткове коротке, зворотний порядок байтів)" #: src/language/utilities/set.q:817 msgid "ZL (64-bit IBM Z hexadecimal long, big-endian)" msgstr "ZL (64-бітове, IBM Z, шістнадцяткове довге, зворотний порядок байтів)" #: src/language/utilities/set.q:985 #, c-format msgid "%s is %s." msgstr "%s є %s." #: src/language/utilities/set.q:1089 #, c-format msgid "" "Too many %s commands without a %s: at most %d levels of saved settings are " "allowed." msgstr "" "Забагато команд %s без %s: можна використовувати не більше %d рівнів " "збережених параметрів." #: src/language/utilities/set.q:1109 #, c-format msgid "%s without matching %s." msgstr "%s без відповідника, %s." #: src/language/stats/crosstabs.q:327 #, c-format msgid "Missing mode %s not allowed in general mode. Assuming %s." msgstr "" "Не вказано режим %s. Так не можна робити у загальному режимі. Припускаємо, " "що %s." #: src/language/stats/crosstabs.q:444 msgid "Too many cross-tabulation variables or dimensions." msgstr "Забагато змінних або вимірів таблиць спряженості." #: src/language/stats/crosstabs.q:509 #, c-format msgid "%s must be specified before %s." msgstr "%s має бути вказано до %s." #: src/language/stats/crosstabs.q:543 #, c-format msgid "Maximum value (%ld) less than minimum value (%ld)." msgstr "Максимальне значення (%ld) є меншим за мінімальне значення (%ld)." #: src/language/stats/crosstabs.q:922 msgid "Summary" msgstr "Резюме" #: src/language/stats/crosstabs.q:935 msgid "Crosstabulation" msgstr "Таблиці спряженості" #. TRANSLATORS: The %s here describes a crosstabulation. It takes the #. form "var1 * var2 * var3 * ...". #: src/language/stats/crosstabs.q:1013 #, c-format msgid "Crosstabulation %s contained no non-missing cases." msgstr "Таблиця спряженості %s не містить непропущених спостережень." #: src/language/stats/crosstabs.q:1204 msgid "Missing value" msgstr "Не вистачає значення" #: src/language/stats/crosstabs.q:1263 msgid "Row %" msgstr "Частка рядків" #: src/language/stats/crosstabs.q:1264 msgid "Column %" msgstr "Частка стовпчиків" #: src/language/stats/crosstabs.q:1265 msgid "Total %" msgstr "Загальна частка" #: src/language/stats/crosstabs.q:1269 msgid "Adjusted Residual" msgstr "Кориговані залишки" #: src/language/stats/crosstabs.q:1288 msgid "Chi-Square Tests" msgstr "Перевірки χ²" #: src/language/stats/crosstabs.q:1294 msgid "Pearson Chi-Square" msgstr "χ² Пірсона" #: src/language/stats/crosstabs.q:1295 msgid "Likelihood Ratio" msgstr "Коефіцієнт правдоподібності" #: src/language/stats/crosstabs.q:1296 msgid "Fisher's Exact Test" msgstr "Точна перевірка Фішера" #: src/language/stats/crosstabs.q:1297 msgid "Continuity Correction" msgstr "Виправлення для неперервності" #: src/language/stats/crosstabs.q:1298 msgid "Linear-by-Linear Association" msgstr "Критерій лінійної залежності" #: src/language/stats/crosstabs.q:1299 src/language/stats/crosstabs.q:1345 #: src/language/stats/crosstabs.q:1854 msgid "N of Valid Cases" msgstr "К-ть коректних спостережень" #: src/language/stats/crosstabs.q:1305 msgid "Asymptotic Sig. (2-tailed)" msgstr "Асимпт. знач. (двобічна)" #: src/language/stats/crosstabs.q:1319 msgid "Symmetric Measures" msgstr "Симетричні міри" #: src/language/stats/crosstabs.q:1324 src/language/stats/crosstabs.q:1364 #: src/language/stats/crosstabs.q:1411 msgid "Values" msgstr "Значення" #: src/language/stats/crosstabs.q:1326 src/language/stats/crosstabs.q:1413 msgid "Asymp. Std. Error" msgstr "Асимпт. ст. похибка" #: src/language/stats/crosstabs.q:1327 src/language/stats/crosstabs.q:1414 msgid "Approx. T" msgstr "Прибл. T" #: src/language/stats/crosstabs.q:1328 src/language/stats/crosstabs.q:1415 msgid "Approx. Sig." msgstr "Прибл. знач." #: src/language/stats/crosstabs.q:1333 src/language/stats/crosstabs.q:1420 msgid "Nominal by Nominal" msgstr "Номінальна за номінальною" #: src/language/stats/crosstabs.q:1334 msgid "Cramer's V" msgstr "V Крамера" #: src/language/stats/crosstabs.q:1334 msgid "Contingency Coefficient" msgstr "Коефіцієнт непередбачуваності" #: src/language/stats/crosstabs.q:1336 src/language/stats/crosstabs.q:1425 msgid "Ordinal by Ordinal" msgstr "Порядкове за порядковим" #: src/language/stats/crosstabs.q:1337 msgid "Kendall's tau-b" msgstr "τ-b Кендала" #: src/language/stats/crosstabs.q:1337 msgid "Kendall's tau-c" msgstr "τ-c Кендала" #: src/language/stats/crosstabs.q:1338 msgid "Spearman Correlation" msgstr "Кореляція Спірмена" #: src/language/stats/crosstabs.q:1340 msgid "Interval by Interval" msgstr "Інтервал за інтервалом" #: src/language/stats/crosstabs.q:1341 msgid "Pearson's R" msgstr "R Пірсона" #: src/language/stats/crosstabs.q:1343 msgid "Measure of Agreement" msgstr "Міра узгодженості" #: src/language/stats/crosstabs.q:1359 msgid "Risk Estimate" msgstr "Оцінка ризику" #: src/language/stats/crosstabs.q:1368 #, no-c-format msgid "95% Confidence Interval" msgstr "Довірчий інтервал 95%C" #: src/language/stats/crosstabs.q:1389 msgid "Symmetric" msgstr "Симетрична" #: src/language/stats/crosstabs.q:1391 src/language/stats/crosstabs.q:1396 #, c-format msgid "%s Dependent" msgstr "Залежна %s" #: src/language/stats/crosstabs.q:1406 msgid "Directional Measures" msgstr "Спрямовані міри" #: src/language/stats/crosstabs.q:1422 msgid "Goodman and Kruskal tau" msgstr "τ Ґудмена і Краскала" #: src/language/stats/crosstabs.q:1423 msgid "Uncertainty Coefficient" msgstr "Коефіцієнт невизначеності" #: src/language/stats/crosstabs.q:1426 msgid "Somers' d" msgstr "d Сомерса" #: src/language/stats/crosstabs.q:1428 msgid "Nominal by Interval" msgstr "Номінальне за інтервалом" #: src/language/stats/crosstabs.q:1826 #, c-format msgid "Odds Ratio for %s" msgstr "Відношення шансів для %s" #: src/language/stats/crosstabs.q:1835 #, c-format msgid "For cohort %s = " msgstr "Для когорти %s = " #: src/ui/gui/aggregate.ui:24 msgid "Aggregate Data" msgstr "Агрегування даних" #: src/ui/gui/aggregate.ui:126 msgid "_Break variable(s)" msgstr "Змінні _групування" #: src/ui/gui/aggregate.ui:179 msgid "Variable Name: " msgstr "Назва змінної: " #: src/ui/gui/aggregate.ui:215 msgid "Variable Label: " msgstr "Мітка змінної: " #: src/ui/gui/aggregate.ui:252 msgid "Function: " msgstr "Функція: " #: src/ui/gui/aggregate.ui:327 msgid "Argument 1: " msgstr "Аргумент 1:" #: src/ui/gui/aggregate.ui:364 msgid "Argument 2: " msgstr "Аргумент 2:" #: src/ui/gui/aggregate.ui:428 msgid "Aggregated variables" msgstr "Агрегування змінних" #: src/ui/gui/aggregate.ui:469 msgid "_Add aggregated variables to the active dataset" msgstr "_Додати агреговані змінні до активного набору даних" #: src/ui/gui/aggregate.ui:486 msgid "_Replace the current dataset with the aggregated variables" msgstr "_Замінити поточний набір даних агрегованими змінними" #: src/ui/gui/aggregate.ui:504 msgid "_Write a new data file containing only the aggregated variables" msgstr "З_аписати новий файл даних, що міститиме лише агреговані змінні" #: src/ui/gui/aggregate.ui:544 msgid "label" msgstr "мітка" #: src/ui/gui/aggregate.ui:593 msgid "File is _already sorted on break variable(s)" msgstr "Файл у_же впорядковано за змінними групування" #: src/ui/gui/aggregate.ui:609 msgid "Sort file before a_ggregating" msgstr "Упорядкувати файл до _агрегування" #: src/ui/gui/aggregate.ui:630 msgid "Options for very large datasets" msgstr "Параметри для даних дуже великого об'єму" #: src/ui/gui/autorecode.ui:24 msgid "Automatic Recode" msgstr "Автоматичне перекодування" #: src/ui/gui/autorecode.ui:120 msgid "Variable -> New Name" msgstr "Змінна -> Нова назва" #: src/ui/gui/autorecode.ui:145 msgid "_Lowest value" msgstr "_Найнижче значення" #: src/ui/gui/autorecode.ui:163 msgid "_Highest value" msgstr "Най_вище значення" #: src/ui/gui/autorecode.ui:185 msgid "Recode starting from" msgstr "Перекодувати, починаючи з" #: src/ui/gui/autorecode.ui:204 msgid "_New Name" msgstr "_Нова назва" #: src/ui/gui/autorecode.ui:227 msgid "_Add New Name" msgstr "_Додати нову назву" #: src/ui/gui/autorecode.ui:285 msgid "_Use the same recoding scheme for all variables" msgstr "_Та сама схема перекодування для усіх змінних" #: src/ui/gui/autorecode.ui:301 msgid "Treat _blank string values as missing" msgstr "Вва_жати порожні рядки значень пропущеними" #: src/ui/gui/binomial.ui:86 msgid "_Test Variable List:" msgstr "Список з_мінних для перевірки:" #: src/ui/gui/binomial.ui:160 src/ui/gui/chi-square.ui:281 msgid "_Get from data" msgstr "_Отримати з даних" #: src/ui/gui/binomial.ui:181 src/ui/gui/indep-samples.ui:150 msgid "_Cut point:" msgstr "_Порогове значення:" #: src/ui/gui/binomial.ui:225 msgid "Define Dichotomy" msgstr "Визначення дихотомії" #: src/ui/gui/binomial.ui:245 msgid "Test _Proportion:" msgstr "_Частка, що перевіряється:" #: src/ui/gui/compute.ui:32 msgid "Compute Variable: Type and Label" msgstr "Обчислення змінної: тип і мітка" #: src/ui/gui/compute.ui:67 msgid "Use _expression as label" msgstr "Використовувати _вираз як мітку" #: src/ui/gui/compute.ui:90 msgid "_Label:" msgstr "_Мітка:" #: src/ui/gui/compute.ui:194 msgid "_String" msgstr "_Рядок" #: src/ui/gui/compute.ui:287 msgid "_Numeric" msgstr "_Число" #: src/ui/gui/compute.ui:343 msgid "Compute Variable" msgstr "Обчислити змінну" #: src/ui/gui/compute.ui:381 msgid "Target _Variable:" msgstr "З_мінна для обробки:" #: src/ui/gui/compute.ui:412 msgid "_Type & Label..." msgstr "_Тип і мітка…" #: src/ui/gui/compute.ui:469 msgid "=" msgstr "=" #: src/ui/gui/compute.ui:526 msgid "_Numeric Expressions:" msgstr "_Числові вирази:" #: src/ui/gui/compute.ui:598 msgid "_Functions:" msgstr "_Функції:" #: src/ui/gui/compute.ui:678 msgid "_If..." msgstr "_Якщо…" #: src/ui/gui/barchart.ui:24 msgid "Barchart" msgstr "Стовпчикова діаграма" #: src/ui/gui/barchart.ui:112 msgid "Category A_xis:" msgstr "В_ісь категорій:" #: src/ui/gui/barchart.ui:140 msgid "_N of cases" msgstr "_К-ть спостережень" #: src/ui/gui/barchart.ui:158 msgid "_Cum. n of cases" msgstr "_Накоп. к-ть спостережень" #: src/ui/gui/barchart.ui:174 msgid "Other _summary function" msgstr "Інша функція підс_умовування" #: src/ui/gui/barchart.ui:191 msgid "% of c_ases" msgstr "Відсоток с_постережень" #: src/ui/gui/barchart.ui:207 msgid "C_um. % of cases" msgstr "Н_акоп. % спостережень" #: src/ui/gui/barchart.ui:270 src/ui/gui/histogram.ui:100 msgid "_Variable:" msgstr "_Змінна:" #: src/ui/gui/barchart.ui:308 msgid "Bars Represent" msgstr "Стовпчикам відповідає" #: src/ui/gui/barchart.ui:340 msgid "Category C_luster:" msgstr "К_ластер категорій:" #: src/ui/gui/correlation.ui:24 msgid "Bivariate Correlations" msgstr "Двовимірна кореляція" #: src/ui/gui/correlation.ui:148 msgid "Pearso_n" msgstr "П_ірсон" #: src/ui/gui/correlation.ui:164 msgid "_Kendall's tau-b" msgstr "τ-b Кендала" #: src/ui/gui/correlation.ui:180 msgid "_Spearman" msgstr "_Спірмен" #: src/ui/gui/correlation.ui:200 msgid "Correlation Coefficients" msgstr "Коефіцієнти кореляції" #: src/ui/gui/correlation.ui:224 msgid "_Two-tailed" msgstr "_Двобічна" #: src/ui/gui/correlation.ui:241 msgid "One-tai_led" msgstr "_Однобічна" #: src/ui/gui/correlation.ui:262 msgid "Test of Significance" msgstr "Перевірка значущості" #: src/ui/gui/correlation.ui:275 msgid "_Flag significant correlations" msgstr "_Позначити значущі кореляції" #: src/ui/gui/count.ui:24 msgid "Count Occurrences of Values within Cases" msgstr "Підрахунок появи значень у спостереженнях" #: src/ui/gui/count.ui:117 msgid "Numeric _Variables:" msgstr "Ч_ислові змінні:" #: src/ui/gui/count.ui:147 msgid "_Target Variable:" msgstr "З_мінна для обробки:" #: src/ui/gui/count.ui:178 msgid "Target _Label:" msgstr "_Мітка результату:" #: src/ui/gui/count.ui:192 msgid "_Define Values..." msgstr "_Визначити значення…" #: src/ui/gui/count.ui:257 msgid "Count Values within Cases: Values to Count" msgstr "Підрахунок кількості значень у спостереженнях: значення для підрахунку" #: src/ui/gui/count.ui:305 msgid "Values _to Count:" msgstr "Значення д_ля підрахунку:" #: src/ui/gui/comments.ui:25 msgid "Data File Comments" msgstr "Коментарі до файла даних" #: src/ui/gui/comments.ui:49 msgid "Comments:" msgstr "Коментарі:" #: src/ui/gui/comments.ui:106 msgid "Display comments in output" msgstr "Показувати коментарі у виведених даних" #: src/ui/gui/comments.ui:127 msgid "Column Number: 0" msgstr "Номер стовпчика: 0" #: src/ui/gui/crosstabs.ui:25 msgid "Crosstabs: Cells" msgstr "Таблиці спряженості: комірки" #: src/ui/gui/crosstabs.ui:67 msgid "Cell Display" msgstr "Показ комірки" #: src/ui/gui/crosstabs.ui:99 msgid "Crosstabs" msgstr "Таблиці спряженості" #: src/ui/gui/crosstabs.ui:150 msgid "_Rows" msgstr "_Рядки" #: src/ui/gui/crosstabs.ui:195 msgid "_Columns" msgstr "Ст_овпчики" #: src/ui/gui/crosstabs.ui:242 msgid "_Format..." msgstr "_Формат…" #: src/ui/gui/crosstabs.ui:256 src/ui/gui/examine.ui:267 msgid "_Statistics..." msgstr "_Статистика…" #: src/ui/gui/crosstabs.ui:270 msgid "Ce_lls..." msgstr "_Комірки…" #: src/ui/gui/crosstabs.ui:348 msgid "Crosstabs: Format" msgstr "Таблиці спряженості: формат" #: src/ui/gui/crosstabs.ui:371 msgid "Print tables" msgstr "Надрукувати таблиці" #: src/ui/gui/crosstabs.ui:387 msgid "Pivot" msgstr "Зведена таблиця" #: src/ui/gui/crosstabs.ui:403 src/ui/gui/sort.ui:157 msgid "Ascending" msgstr "за зростанням" #: src/ui/gui/crosstabs.ui:455 msgid "Crosstabs: Statistics" msgstr "Таблиці спряженості: статистика" #: src/ui/gui/chi-square.ui:30 msgid "Chi-Square Test" msgstr "Перевірка χ²" #: src/ui/gui/chi-square.ui:82 msgid "All categor_ies equal" msgstr "Усі _категорії рівні" #: src/ui/gui/chi-square.ui:103 msgid "_Values" msgstr "З_начення" #: src/ui/gui/chi-square.ui:159 msgid "Expected Values:" msgstr "Очікувані значення:" #: src/ui/gui/chi-square.ui:204 msgid "Test _Variables" msgstr "Тест з_мінних" #: src/ui/gui/chi-square.ui:298 msgid "Use _specified range" msgstr "Використовувати _вказаний діапазон" #: src/ui/gui/chi-square.ui:323 msgid "_Lower:" msgstr "_Від:" #: src/ui/gui/chi-square.ui:337 msgid "_Upper:" msgstr "_До:" #: src/ui/gui/chi-square.ui:381 msgid "Expected Range:" msgstr "Очікуваний діапазон:" #: src/ui/gui/descriptives.ui:131 src/ui/gui/factor.ui:797 #: src/ui/gui/recode.ui:638 msgid "_Variables:" msgstr "_Змінні:" #: src/ui/gui/descriptives.ui:176 msgid "S_tatistics:" msgstr "С_татистика:" #: src/ui/gui/descriptives.ui:230 msgid "_Exclude entire case if any selected variable is missing" msgstr "" "Ви_ключити усе спостереження, якщо не вистачає хоч одної позначеної змінної" #: src/ui/gui/descriptives.ui:247 msgid "_Include user-missing data in analysis" msgstr "_Включити дані з пропущеними позиціями до аналізу" #: src/ui/gui/descriptives.ui:264 msgid "Save _Z-scores of selected variables as new variables" msgstr "Зберегти Z-_оцінки позначених змінних як нові змінні" #: src/ui/gui/descriptives.ui:286 msgid "Options:" msgstr "Параметри:" #: src/ui/gui/examine.ui:25 msgid "Explore" msgstr "Дослідження" #: src/ui/gui/examine.ui:69 msgid "_Label Cases by:" msgstr "_Позначити спостереження:" #: src/ui/gui/examine.ui:116 msgid "_Factor List:" msgstr "Список _факторів:" #: src/ui/gui/examine.ui:163 src/ui/gui/means.ui:126 msgid "_Dependent List:" msgstr "Список з_алежних:" #: src/ui/gui/examine.ui:331 msgid "Explore: Options" msgstr "Дослідження: параметри" #: src/ui/gui/examine.ui:355 src/ui/gui/t-test.ui:81 msgid "Exclude cases _listwise" msgstr "Виключати спостереження _цілком" #: src/ui/gui/examine.ui:373 msgid "Exclude cases _pairwise" msgstr "Виключити спостереження п_арно" #: src/ui/gui/examine.ui:392 msgid "_Report values" msgstr "_Звітувати значення" #: src/ui/gui/examine.ui:449 msgid "Explore: Statistics" msgstr "Дослідження: статистика" #: src/ui/gui/examine.ui:468 src/ui/gui/oneway.ui:576 msgid "_Descriptives" msgstr "_Описова статистика" #: src/ui/gui/examine.ui:485 msgid "_Extremes" msgstr "_Екстремальні значення" #: src/ui/gui/examine.ui:502 msgid "_Percentiles" msgstr "_Процентилі" #: src/ui/gui/goto-case.ui:31 msgid "Goto Case" msgstr "Перехід до спостереження" #: src/ui/gui/goto-case.ui:52 msgid "Goto Case Number:" msgstr "Номер спостереження для переходу:" #: src/ui/gui/factor.ui:39 msgid "Factor Analysis: Rotation" msgstr "Факторний аналіз: обертання" #: src/ui/gui/factor.ui:70 msgid "_None" msgstr "_Немає" #: src/ui/gui/factor.ui:87 msgid "_Varimax" msgstr "_Варімакс" #: src/ui/gui/factor.ui:104 msgid "_Quartimax" msgstr "_Квартімакс" #: src/ui/gui/factor.ui:123 msgid "_Equimax" msgstr "_Еквімакс" #: src/ui/gui/factor.ui:146 msgid "Method" msgstr "Метод" #: src/ui/gui/factor.ui:159 msgid "_Display rotated solution" msgstr "_Показати обернутий розв'язок" #: src/ui/gui/factor.ui:181 src/ui/gui/factor.ui:582 msgid "Ma_ximum iterations for convergence:" msgstr "Макс. к-_ть ітерацій для збіжності:" #: src/ui/gui/factor.ui:241 src/ui/gui/factor.ui:255 msgid "Principal Components Analysis" msgstr "Аналіз основних компонентів" #: src/ui/gui/factor.ui:246 src/ui/gui/factor.ui:258 msgid "Principal Axis Factoring" msgstr "Факторизація головних осей" #: src/ui/gui/factor.ui:264 msgid "Factor Analysis: Extraction" msgstr "Факторний аналіз: видобування" #: src/ui/gui/factor.ui:290 msgid "_Method: " msgstr "_Метод: " #: src/ui/gui/factor.ui:345 msgid "Co_rrelation matrix" msgstr "_Матриця кореляцій" #: src/ui/gui/factor.ui:361 msgid "Co_variance matrix" msgstr "_Коваріаційна матриця" #: src/ui/gui/factor.ui:382 msgid "Analyze" msgstr "Проаналізувати" #: src/ui/gui/factor.ui:407 msgid "_Unrotated factor solution" msgstr "_Необернутий факторний розв'язок" #: src/ui/gui/factor.ui:423 msgid "_Scree plot" msgstr "_Графік власних значень" #: src/ui/gui/factor.ui:443 src/ui/gui/histogram.ui:146 src/ui/gui/roc.ui:329 msgid "Display" msgstr "Показати" #: src/ui/gui/factor.ui:526 msgid "_Number of factors:" msgstr "_Кількість факторів:" #: src/ui/gui/factor.ui:563 msgid "Extract" msgstr "Видобути" #: src/ui/gui/factor.ui:640 msgid "Factor Analysis" msgstr "Факторний аналіз" #: src/ui/gui/factor.ui:672 src/ui/gui/data-editor.ui:266 msgid "_Descriptives..." msgstr "_Описова статистика…" #: src/ui/gui/factor.ui:685 msgid "_Extraction..." msgstr "_Видобування…" #: src/ui/gui/factor.ui:699 msgid "_Rotations..." msgstr "_Обертання…" #: src/ui/gui/find.ui:25 msgid "Find Case" msgstr "Пошук спостереження" #: src/ui/gui/find.ui:117 msgid "Variable:" msgstr "Змінна:" #: src/ui/gui/find.ui:157 src/ui/gui/val-labs-dialog.ui:113 msgid "Value:" msgstr "Значення:" #: src/ui/gui/find.ui:180 msgid "Search value labels" msgstr "Шукати позначки змінних" #: src/ui/gui/find.ui:210 msgid "Regular expression Match" msgstr "Відповідність за формальним виразом" #: src/ui/gui/find.ui:227 msgid "Search substrings" msgstr "Шукати підрядки" #: src/ui/gui/find.ui:244 msgid "Wrap around" msgstr "Циклічно" #: src/ui/gui/find.ui:260 msgid "Search backward" msgstr "Пошук назад" #: src/ui/gui/frequencies.ui:32 msgid "Frequencies: Frequency Tables" msgstr "Частоти: таблиці частот" #: src/ui/gui/frequencies.ui:67 msgid "_Always" msgstr "З_авжди" #: src/ui/gui/frequencies.ui:85 msgid "_Never" msgstr "_Ніколи" #: src/ui/gui/frequencies.ui:107 msgid "If no _more than " msgstr "Якщо маємо не _більше за " #: src/ui/gui/frequencies.ui:129 src/ui/gui/frequencies.ui:454 msgid "100" msgstr "100" #: src/ui/gui/frequencies.ui:145 msgid "values" msgstr "значення" #: src/ui/gui/frequencies.ui:167 msgid "Display frequency tables" msgstr "Показ таблиць частот" #: src/ui/gui/frequencies.ui:194 msgid "A_scending value" msgstr "За з_ростанням значення" #: src/ui/gui/frequencies.ui:212 msgid "D_escending value" msgstr "За с_паданням значення" #: src/ui/gui/frequencies.ui:230 msgid "Ascending _frequency" msgstr "За зр_останням частоти" #: src/ui/gui/frequencies.ui:248 msgid "Descending f_requency" msgstr "За спаданням _частоти" #: src/ui/gui/frequencies.ui:271 msgid "Order by" msgstr "Критерій впорядковування" #: src/ui/gui/frequencies.ui:324 msgid "Frequencies: Charts" msgstr "Частоти: діаграми" #: src/ui/gui/frequencies.ui:356 msgid "Scale:" msgstr "Шкала:" #: src/ui/gui/frequencies.ui:366 msgid "_Frequencies" msgstr "_Частоти" #: src/ui/gui/frequencies.ui:383 msgid "_Percentages" msgstr "_Відсотки" #: src/ui/gui/frequencies.ui:407 msgid "Exclude values _below " msgstr "Виключити значення, _менші за " #: src/ui/gui/frequencies.ui:422 msgid "Exclude values _above " msgstr "Виключити значення, _більші за " #: src/ui/gui/frequencies.ui:441 src/ui/gui/reliability.ui:227 msgid "0" msgstr "0" #: src/ui/gui/frequencies.ui:469 msgid "Chart Formatting" msgstr "Форматування діаграми" #: src/ui/gui/frequencies.ui:494 msgid "Draw _histograms" msgstr "Малювати _гістограми" #: src/ui/gui/frequencies.ui:510 msgid "Superimpose _normal curve" msgstr "Накласти _криву нормального розподілу" #: src/ui/gui/frequencies.ui:530 msgid "Histograms" msgstr "Гістограми" #: src/ui/gui/frequencies.ui:555 msgid "Draw _bar charts" msgstr "Малювати _стовпчикові діаграми" #: src/ui/gui/frequencies.ui:575 msgid "Bar Charts" msgstr "Стовпчикові діаграми" #: src/ui/gui/frequencies.ui:600 msgid "Draw _pie charts" msgstr "Малювати _кругові діаграми" #: src/ui/gui/frequencies.ui:616 msgid "Include slices for _missing values" msgstr "В_ключити сектори для пропущених значень" #: src/ui/gui/frequencies.ui:636 msgid "Pie Charts" msgstr "Кругові діаграми" #: src/ui/gui/frequencies.ui:725 src/ui/gui/rank.ui:489 msgid "_Variable(s):" msgstr "_Змінні:" #: src/ui/gui/frequencies.ui:769 msgid "_Statistics:" msgstr "_Статистика:" #: src/ui/gui/frequencies.ui:783 msgid "Include _missing values" msgstr "В_ключити пропущені значення" #: src/ui/gui/frequencies.ui:806 msgid "Ch_arts..." msgstr "_Діаграми…" #: src/ui/gui/frequencies.ui:821 msgid "Frequency _Tables..." msgstr "_Таблиці частот…" #: src/ui/gui/histogram.ui:24 msgid "Histogram" msgstr "Гістограма" #: src/ui/gui/histogram.ui:126 msgid "_Display normal curve" msgstr "_Показати криву нормального розподілу" #: src/ui/gui/indep-samples.ui:25 src/ui/gui/k-independent.ui:35 msgid "Define Groups" msgstr "Визначення груп" #: src/ui/gui/indep-samples.ui:75 msgid "Group_2 value:" msgstr "Значення групи_2:" #: src/ui/gui/indep-samples.ui:89 msgid "Group_1 value:" msgstr "Значення групи_1:" #: src/ui/gui/indep-samples.ui:190 msgid "_Use specified values:" msgstr "В_казані значення:" #: src/ui/gui/indep-samples.ui:259 msgid "Independent-Samples T Test" msgstr "T-перевірка незалежних вибірок" #: src/ui/gui/indep-samples.ui:319 msgid "_Define Groups..." msgstr "_Визначити групи…" #: src/ui/gui/indep-samples.ui:401 src/ui/gui/t-test.ui:211 msgid "_Test Variable(s):" msgstr "З_мінні для перевірки:" #: src/ui/gui/indep-samples.ui:454 src/ui/gui/k-independent.ui:165 msgid "_Grouping Variable:" msgstr "Змінна _групування:" #: src/ui/gui/k-independent.ui:63 msgid "_Upper limit:" msgstr "В_ерхнє обмеження:" #: src/ui/gui/k-independent.ui:77 msgid "_Lower limit:" msgstr "_Нижнє обмеження:" #: src/ui/gui/k-independent.ui:136 msgid "Tests for Several Independent Samples" msgstr "Тести для декількох незалежних вибірок" #: src/ui/gui/k-independent.ui:208 src/ui/gui/ks-one-sample.ui:131 msgid "Test _Variable List:" msgstr "Список з_мінних для тестування:" #: src/ui/gui/k-independent.ui:320 msgid "_Define Groups" msgstr "_Визначити групи" #: src/ui/gui/k-independent.ui:365 msgid "_Kruskal-Wallis H" msgstr "H _Крускала-Волліса" #: src/ui/gui/k-independent.ui:382 src/ui/gui/runs.ui:140 msgid "_Median" msgstr "Ме_діана" #: src/ui/gui/k-means.ui:24 msgid "K-Means Cluster Analysis" msgstr "Кластерний аналіз методом k-середніх" #: src/ui/gui/k-means.ui:122 msgid "N_umber of Clusters: " msgstr "_Кількість кластерів: " #: src/ui/gui/k-related.ui:24 msgid "Tests for Several Related Samples" msgstr "Тести для декількох пов'язаних вибірок" #: src/ui/gui/k-related.ui:113 msgid "_Test Variables:" msgstr "З_мінні для перевірки:" #: src/ui/gui/k-related.ui:145 msgid "_Friedman" msgstr "_Фрідмана" #: src/ui/gui/k-related.ui:161 msgid "_Kendall's W" msgstr "W _Кендала" #: src/ui/gui/k-related.ui:177 msgid "_Cochran's Q" msgstr "К_ритерій Кохрена" #: src/ui/gui/ks-one-sample.ui:163 msgid "_Normal" msgstr "_Нормальний" #: src/ui/gui/ks-one-sample.ui:181 msgid "_Poisson" msgstr "_Пуассона" #: src/ui/gui/ks-one-sample.ui:198 msgid "_Uniform" msgstr "_Однорідний" #: src/ui/gui/ks-one-sample.ui:213 msgid "_Exponential" msgstr "_Експоненційний" #: src/ui/gui/ks-one-sample.ui:232 msgid "Test Distribution" msgstr "Перевірка розподілу" #: src/ui/gui/logistic.ui:42 msgid "Logistic Regression: Options" msgstr "Логістична регресія: параметри" #: src/ui/gui/logistic.ui:66 msgid "CI for _exp(B): " msgstr "Довірчий інтервал дл_я exp(B): " #: src/ui/gui/logistic.ui:97 msgid "%" msgstr "%" #: src/ui/gui/logistic.ui:146 msgid "Classification cu_toff: " msgstr "Порі_г класифікації: " #: src/ui/gui/logistic.ui:159 msgid "_Maximum Iterations: " msgstr "_Макс. к-ть ітерацій: " #: src/ui/gui/logistic.ui:177 msgid "Include _constant in model" msgstr "Включити _константу до моделі" #: src/ui/gui/logistic.ui:219 msgid "Logistic Regression" msgstr "Логістична регресія" #: src/ui/gui/logistic.ui:364 src/ui/gui/regression.ui:185 msgid "_Dependent" msgstr "_Залежні" #: src/ui/gui/logistic.ui:412 src/ui/gui/regression.ui:232 msgid "_Independent" msgstr "_Незалежні" #: src/ui/gui/means.ui:25 msgid "Means" msgstr "Середні" #: src/ui/gui/means.ui:179 msgid "_Independent List:" msgstr "Список _незалежних:" #: src/ui/gui/missing-val-dialog.ui:48 msgid "_No missing values" msgstr "_Без пропущених значень" #: src/ui/gui/missing-val-dialog.ui:136 msgid "_Discrete missing values" msgstr "_Дискретні пропущені значення" #: src/ui/gui/missing-val-dialog.ui:172 msgid "_Low:" msgstr "Най_менший:" #: src/ui/gui/missing-val-dialog.ui:197 msgid "_High:" msgstr "Най_більший:" #: src/ui/gui/missing-val-dialog.ui:221 msgid "Di_screte value:" msgstr "Д_искретне значення:" #: src/ui/gui/missing-val-dialog.ui:245 msgid "_Range plus one optional discrete missing value" msgstr "_Діапазон плюс одне необов'язкове дискретне пропущене значення" #: src/ui/gui/oneway.ui:25 msgid "One-Way ANOVA: Contrasts" msgstr "Однофакторний ANOVA: контрасти" #: src/ui/gui/oneway.ui:107 msgid "_Coefficients:" msgstr "_Коефіцієнти:" #: src/ui/gui/oneway.ui:161 msgid "Coefficient Total: " msgstr "Сума коефіцієнтів: " #: src/ui/gui/oneway.ui:198 msgid "Contrast 1 of 1" msgstr "Контраст 1 з 1" #: src/ui/gui/oneway.ui:234 msgid "One-Way ANOVA: Post-Hoc" msgstr "Однофакторний ANOVA: апостеріорний аналіз" #: src/ui/gui/oneway.ui:270 msgid "Games Howell" msgstr "Ґеймс-Гауел" #: src/ui/gui/oneway.ui:287 msgid "Fisher's LSD" msgstr "НЗР Фішера" #: src/ui/gui/oneway.ui:379 msgid "One-Way ANOVA" msgstr "Однофакторний ANOVA" #: src/ui/gui/oneway.ui:408 msgid "_Factor:" msgstr "_Фактор:" #: src/ui/gui/oneway.ui:451 msgid "Dependent _Variable(s):" msgstr "Залежні з_мінні:" #: src/ui/gui/oneway.ui:593 msgid "_Homogeneity" msgstr "_Гомогенність" #: src/ui/gui/oneway.ui:637 msgid "Post-Hoc..." msgstr "Апостеріорний…" #: src/ui/gui/oneway.ui:652 msgid "_Contrasts..." msgstr "_Контрасти…" #: src/ui/gui/options.ui:25 msgid "Options Case" msgstr "Регістр параметрів" #: src/ui/gui/options.ui:55 msgid "Display _Labels" msgstr "Показувати _мітки" #: src/ui/gui/options.ui:71 msgid "Display _Names" msgstr "Показувати _назви" #: src/ui/gui/options.ui:99 msgid "Sort by L_abel" msgstr "Упорядкувати за мі_ткою" #: src/ui/gui/options.ui:115 msgid "Sort by Na_me" msgstr "Упорядкувати за н_азвою" #: src/ui/gui/options.ui:131 msgid "Do not S_ort" msgstr "Не _упорядковувати" #: src/ui/gui/options.ui:159 msgid "Variable Lists" msgstr "Списки змінних" #: src/ui/gui/options.ui:184 msgid "Ma_ximize" msgstr "Ма_ксимізувати" #: src/ui/gui/options.ui:199 msgid "_Raise" msgstr "_Підняти" #: src/ui/gui/options.ui:214 msgid "Aler_t" msgstr "П_овідомити" #: src/ui/gui/options.ui:233 msgid "Output Window Action" msgstr "Дія з вікном виведення" #: src/ui/gui/paired-samples.ui:147 msgid "_Test Pair(s):" msgstr "_Перевірити такі пари:" #: src/ui/gui/rank.ui:30 msgid "Rank Cases: Types" msgstr "Ранжування спостережень: типи" #: src/ui/gui/rank.ui:57 msgid "Sum of case _weights" msgstr "Сума значень _ваги спостережень" #: src/ui/gui/rank.ui:74 msgid "Fractional rank as _%" msgstr "Дробовий ранг _у %" #: src/ui/gui/rank.ui:92 msgid "_Fractional rank" msgstr "_Дробовий ранг" #: src/ui/gui/rank.ui:109 msgid "_Savage score" msgstr "Бали _Севеджа" #: src/ui/gui/rank.ui:125 msgid "_Rank" msgstr "_Ранг" #: src/ui/gui/rank.ui:147 msgid "N_tiles" msgstr "N-р_озбиття" #: src/ui/gui/rank.ui:195 msgid "_Proportion Estimates" msgstr "О_цінки частин" #: src/ui/gui/rank.ui:213 msgid "_Normal Scores" msgstr "_Нормальні значення" #: src/ui/gui/rank.ui:251 msgid "_Blom" msgstr "Блома" #: src/ui/gui/rank.ui:269 msgid "Tuke_y" msgstr "Ту_кі" #: src/ui/gui/rank.ui:287 msgid "Ran_kit" msgstr "Р_анкіт" #: src/ui/gui/rank.ui:305 msgid "_Van der Waerden" msgstr "_Ван-дер-Вардена" #: src/ui/gui/rank.ui:328 msgid "Proportion Estimation Formula" msgstr "Формула оцінки частин" #: src/ui/gui/rank.ui:369 msgid "Rank Cases" msgstr "Ранжування спостережень" #: src/ui/gui/rank.ui:434 msgid "_By:" msgstr "_Критерій:" #: src/ui/gui/rank.ui:595 msgid "_Smallest Value" msgstr "_найменшому значенню" #: src/ui/gui/rank.ui:613 msgid "_Largest Value" msgstr "най_більшому значенню" #: src/ui/gui/rank.ui:637 msgid "Assign rank 1 to:" msgstr "Надати ранг 1:" #: src/ui/gui/rank.ui:656 msgid "_Display summary tables" msgstr "_Показувати таблиці резюме" #: src/ui/gui/rank.ui:679 msgid "Rank T_ypes" msgstr "_Типи рангів" #: src/ui/gui/rank.ui:694 msgid "_Ties..." msgstr "_Збіги…" #: src/ui/gui/rank.ui:756 msgid "Rank Cases: Ties" msgstr "Ранжування спостережень: збіги" #: src/ui/gui/rank.ui:788 msgid "_Mean" msgstr "С_ередній" #: src/ui/gui/rank.ui:806 msgid "_Low" msgstr "Най_менший" #: src/ui/gui/rank.ui:825 msgid "_High" msgstr "Най_більший" #: src/ui/gui/rank.ui:851 msgid "_Sequential ranks to unique values" msgstr "_Послідовні ранги для унікальних значень" #: src/ui/gui/rank.ui:875 msgid "Rank Assigned to Ties" msgstr "Ранги збігів у спостереженнях" #: src/ui/gui/runs.ui:155 msgid "M_ean" msgstr "С_ереднє значення" #: src/ui/gui/runs.ui:171 msgid "Mo_de" msgstr "_Мода" #: src/ui/gui/runs.ui:191 msgid "_Custom:" msgstr "_Нетипове:" #: src/ui/gui/runs.ui:230 msgid "Cut Point" msgstr "Порогове значення" #: src/ui/gui/sort.ui:25 msgid "Sort Cases" msgstr "Упорядковування спостережень" #: src/ui/gui/sort.ui:101 msgid "Sort by:" msgstr "Критерій впорядковування:" #: src/ui/gui/sort.ui:174 msgid "Descending" msgstr "за спаданням" #: src/ui/gui/sort.ui:196 msgid "Sort Order" msgstr "Порядок" #: src/ui/gui/split-file.ui:25 msgid "Split File" msgstr "Розділити файл" #: src/ui/gui/split-file.ui:103 msgid "Anal_yze all cases. Do not create groups." msgstr "Ана_лізувати усі спостереження. Не створювати груп." #: src/ui/gui/split-file.ui:121 msgid "Compare _groups." msgstr "Порівняти _групи." #: src/ui/gui/split-file.ui:140 msgid "Organize ou_tput by groups." msgstr "Упорядкувати _результати за групами." #: src/ui/gui/split-file.ui:225 msgid "Groups _based on:" msgstr "_Основа групування:" #: src/ui/gui/split-file.ui:255 msgid "_Sort the file by grouping variables." msgstr "_Упорядкувати файл за змінними групування." #: src/ui/gui/split-file.ui:273 msgid "_File is already sorted." msgstr "_Файл уже упорядковано." #: src/ui/gui/split-file.ui:334 msgid "Current Status : " msgstr "Поточний стан: " #: src/ui/gui/split-file.ui:348 msgid "Analysis by groups is off" msgstr "Аналіз за групами вимкнено" #: src/ui/gui/recode.ui:135 msgid "System _Missing" msgstr "Системні _пропущені" #: src/ui/gui/recode.ui:150 msgid "Co_py old values" msgstr "Ко_піювати попередні значення" #: src/ui/gui/recode.ui:172 msgid "Va_lue: " msgstr "З_начення: " #: src/ui/gui/recode.ui:276 msgid "Conver_t numeric strings to numbers (`5' -> 5)" msgstr "Пе_ретворити числові рядки на числа («5» -> 5)" #: src/ui/gui/recode.ui:297 msgid "Output variables are _strings" msgstr "Виведені змінні є р_ядками" #: src/ui/gui/recode.ui:318 msgid "Width: " msgstr "Ширина: " #: src/ui/gui/recode.ui:499 msgid "_Name:" msgstr "_Назва:" #: src/ui/gui/recode.ui:527 msgid "La_bel:" msgstr "Мі_тка:" #: src/ui/gui/recode.ui:556 msgid "Chan_ge" msgstr "З_міна" #: src/ui/gui/recode.ui:584 msgid "Output Variable" msgstr "Виведена змінна" #: src/ui/gui/recode.ui:658 msgid "Old and New Va_lues..." msgstr "Попередні і нові з_начення…" #: src/ui/gui/regression.ui:51 msgid "S_tatistics..." msgstr "С_татистика…" #: src/ui/gui/regression.ui:272 msgid "Regression: Save" msgstr "Регресія: збереження" #: src/ui/gui/regression.ui:290 src/ui/gui/univariate.ui:42 msgid "_Predicted values" msgstr "_Передбачені значення" #: src/ui/gui/regression.ui:307 src/ui/gui/univariate.ui:59 msgid "_Residuals" msgstr "_Лишки" #: src/ui/gui/regression.ui:351 msgid "Regression: Statistics" msgstr "Регресія: статистика" #: src/ui/gui/regression.ui:393 src/ui/gui/univariate.ui:143 msgid "S_tatistics" msgstr "С_татистика" #: src/ui/gui/reliability.ui:34 msgid "Alpha" msgstr "α" #: src/ui/gui/reliability.ui:43 msgid "Reliability Analysis" msgstr "Аналіз придатності" #: src/ui/gui/reliability.ui:144 msgid "_Items:" msgstr "_Пункти:" #: src/ui/gui/reliability.ui:166 msgid "_Model: " msgstr "_Модель: " #: src/ui/gui/reliability.ui:212 msgid "_Variables in first split:" msgstr "З_мінні у першому поділі:" #: src/ui/gui/reliability.ui:259 msgid "Show _descriptives for scale if item is deleted" msgstr "Показати _описові статистики для шкали, якщо пункт вилучено" #: src/ui/gui/roc.ui:145 msgid "_Test Variable:" msgstr "З_мінна для перевірки:" #: src/ui/gui/roc.ui:175 msgid "_State Variable:" msgstr "Змінна с_тану:" #: src/ui/gui/roc.ui:202 msgid "_Value of state variable:" msgstr "Зн_ачення змінної стану:" #: src/ui/gui/roc.ui:249 msgid "ROC C_urve" msgstr "ROC-_криву" #: src/ui/gui/roc.ui:269 msgid "_With diagonal reference line" msgstr "_З діагональною опорною лінією" #: src/ui/gui/roc.ui:293 msgid "Standard _Error and Confidence Interval" msgstr "Стандартну по_хибку і довірчий інтервал" #: src/ui/gui/roc.ui:309 msgid "_Coordinate points of the ROC Curve" msgstr "К_оординатні точки ROC-кривої" #: src/ui/gui/scatterplot.ui:25 msgid "Scatterplot" msgstr "Точкова діаграма" #: src/ui/gui/scatterplot.ui:56 msgid "_X Axis:" msgstr "_Вісь X:" #: src/ui/gui/scatterplot.ui:100 msgid "_Y Axis:" msgstr "В_ісь Y:" #: src/ui/gui/select-cases.ui:37 msgid "Select Cases: Range" msgstr "Вибір спостережень: діапазон" #: src/ui/gui/select-cases.ui:87 msgid "First case" msgstr "Перше спостереження" #: src/ui/gui/select-cases.ui:99 msgid "Last case" msgstr "Останнє спостереження" #: src/ui/gui/select-cases.ui:111 msgid "Observation" msgstr "Спостереження" #: src/ui/gui/select-cases.ui:161 msgid "Select Cases" msgstr "Вибір спостережень" #: src/ui/gui/select-cases.ui:313 msgid "Use filter variable" msgstr "Використовувати змінну для фільтрування" #: src/ui/gui/select-cases.ui:380 msgid "Based on time or case range" msgstr "На основі часу або діапазону спостережень" #: src/ui/gui/select-cases.ui:395 msgid "Range..." msgstr "Діапазон…" #: src/ui/gui/select-cases.ui:444 msgid "Random sample of cases" msgstr "Випадкова вибірка спостережень" #: src/ui/gui/select-cases.ui:460 msgid "Sample..." msgstr "Вибірка…" #: src/ui/gui/select-cases.ui:508 msgid "If condition is satisfied" msgstr "Якщо виконується умова" #: src/ui/gui/select-cases.ui:523 msgid "If..." msgstr "Якщо…" #: src/ui/gui/select-cases.ui:567 msgid "All Cases" msgstr "Усі спостереження" #: src/ui/gui/select-cases.ui:581 msgid "Select" msgstr "Вибрати" #: src/ui/gui/select-cases.ui:608 msgid "Filtered" msgstr "Фільтровані" #: src/ui/gui/select-cases.ui:625 msgid "Deleted" msgstr "Вилучені" #: src/ui/gui/select-cases.ui:647 msgid "Unselected Cases Are" msgstr "Непозначеними спостереженнями є" #: src/ui/gui/select-cases.ui:694 msgid "Select Cases: Random Sample" msgstr "Вибір спостережень: випадкова вибірка" #: src/ui/gui/select-cases.ui:756 msgid "Sample Size" msgstr "Розмір вибірки" #: src/ui/gui/t-test.ui:25 msgid "Options" msgstr "Параметри" #: src/ui/gui/t-test.ui:63 msgid "Exclude cases _analysis by analysis" msgstr "Виключати спостереження _окремо" #: src/ui/gui/t-test.ui:148 msgid "One - Sample T Test" msgstr "Одновибіркова t-перевірка" #: src/ui/gui/t-test.ui:265 msgid "Test _Value: " msgstr "З_начення для перевірки: " #: src/ui/gui/text-data-import.ui:32 msgid "Select the first line of the data file that contains data." msgstr "Виберіть перший рядок файла даних, у якому містяться дані." #: src/ui/gui/text-data-import.ui:54 msgid "Line above selected line contains variable names" msgstr "У рядку над вибраним рядком містяться назви змінних" #: src/ui/gui/text-data-import.ui:80 msgid "" "Check the data formats displayed below and fix any that are incorrect. You " "may set other variable properties now or later." msgstr "" "Ознайомтеся з переліком форматів даних, наведеним нижче, і виправте помилки " "у форматуванні, якщо вони є. Ви можете визначити властивості інших змінних " "зараз або пізніше." #: src/ui/gui/text-data-import.ui:121 msgid "Variables" msgstr "Змінні" #: src/ui/gui/text-data-import.ui:152 msgid "Data Preview" msgstr "Попередній перегляд даних" #: src/ui/gui/text-data-import.ui:181 msgid "" "This assistant will guide you through the process of importing data into " "PSPP from a text file with one line per case, in which fields are separated " "by tabs, commas, or other delimiters.\n" "\n" "\tThe selected file contains N lines of text. Only the first M of these " "will be shown for preview purposes in the following screens. You may choose " "below how much of the file should actually be imported." msgstr "" "За допомогою цієї допоміжної програми ви зможете виконати кроки процедури з " "імпортування даних до PSPP з текстового файла, кожен з записів якого " "розташовано у окремому рядку, а поля відокремлено символами табуляції, " "комами або іншими роздільниками.\n" "\n" "\tУ позначеному файлі міститься N рядків тексту. На наступних сторінках " "майстра буде показано лише перші M записів з метою попереднього перегляду. " "Нижче ви можете вибрати об'єм даних, які буде імпортовано." #: src/ui/gui/text-data-import.ui:252 msgid "All cases" msgstr "Усі спостереження" #: src/ui/gui/text-data-import.ui:272 msgid "Amount to Import" msgstr "Величина, яку слід імпортувати" #: src/ui/gui/text-data-import.ui:325 msgid "C_ustom" msgstr "Н_етиповий" #: src/ui/gui/text-data-import.ui:341 msgid "Slas_h (/)" msgstr "По_хила риска (/)" #: src/ui/gui/text-data-import.ui:357 msgid "Semicolo_n (;)" msgstr "К_рапка з комою (;)" #: src/ui/gui/text-data-import.ui:373 msgid "P_ipe (|)" msgstr "_Риска (|)" #: src/ui/gui/text-data-import.ui:389 msgid "H_yphen (-)" msgstr "_Дефіс (-)" #: src/ui/gui/text-data-import.ui:405 msgid "Co_mma (,)" msgstr "К_ома (,)" #: src/ui/gui/text-data-import.ui:421 msgid "_Colon (:)" msgstr "Д_вокрапка (:)" #: src/ui/gui/text-data-import.ui:437 msgid "Ban_g (!)" msgstr "З_нак оклику (!)" #: src/ui/gui/text-data-import.ui:453 msgid "Ta_b" msgstr "_Табуляція" #: src/ui/gui/text-data-import.ui:469 msgid "_Space" msgstr "_Пробіл" #: src/ui/gui/text-data-import.ui:490 msgid "Separators" msgstr "Роздільники" #: src/ui/gui/text-data-import.ui:541 msgid "Quote separator characters with" msgstr "Позначати символи роздільника" #: src/ui/gui/text-data-import.ui:561 msgid "Quoting" msgstr "Лапки" #: src/ui/gui/text-data-import.ui:599 msgid "Fields Preview" msgstr "Попередній перегляд полів" #: src/ui/gui/text-data-import.ui:622 msgid "" "Enter below the sheet number and the cell range which you wish to import." msgstr "" "Нижче вкажіть номер аркуша та діапазон комірок, дані з яких слід імпортувати." #: src/ui/gui/text-data-import.ui:670 msgid "_Cells: " msgstr "_Комірки: " #: src/ui/gui/text-data-import.ui:684 msgid "_Sheet Index: " msgstr "Індекс _аркуша: " #: src/ui/gui/text-data-import.ui:695 msgid "Use first row as _variable names" msgstr "Вважати перший рядок рядком _назв змінних" #: src/ui/gui/text-data-import.ui:717 msgid "Cells to Import" msgstr "Комірки для імпортування" #: src/ui/gui/transpose.ui:24 msgid "Transpose" msgstr "Транспонування" #: src/ui/gui/transpose.ui:91 msgid "Name Variable:" msgstr "Змінна назв:" #: src/ui/gui/transpose.ui:127 msgid "Variable(s):" msgstr "Змінні:" #: src/ui/gui/univariate.ui:25 msgid "Univariate: Save" msgstr "Одновимірний: зберегти" #: src/ui/gui/univariate.ui:103 msgid "Univariate: Statistics" msgstr "Одновимірний: статистика" #: src/ui/gui/univariate.ui:178 msgid "Univariate" msgstr "Одновимірний" #: src/ui/gui/univariate.ui:281 msgid "_Dependent Variable" msgstr "З_алежна змінна" #: src/ui/gui/univariate.ui:329 msgid "_Fixed Factors" msgstr "_Фіксовані фактори" #: src/ui/gui/val-labs-dialog.ui:101 msgid "Value Label:" msgstr "Мітка значення:" #: src/ui/gui/data-editor.ui:33 msgid "Information Area" msgstr "Область інформації" #: src/ui/gui/data-editor.ui:55 msgid "Case Counter Area" msgstr "Область лічильника спостережень" #: src/ui/gui/data-editor.ui:80 msgid "Filter Use Status Area" msgstr "Область показу стану фільтрування" #: src/ui/gui/data-editor.ui:106 msgid "Weight Status Area" msgstr "Область стану зважування" #: src/ui/gui/data-editor.ui:132 msgid "Split File Status Area" msgstr "Область стану поділу файла" #: src/ui/gui/data-editor.ui:154 msgid "_View" msgstr "П_ерегляд" #: src/ui/gui/data-editor.ui:157 msgid "_Status Bar" msgstr "Пан_ель стану" #: src/ui/gui/data-editor.ui:163 msgid "_Font..." msgstr "_Шрифт…" #: src/ui/gui/data-editor.ui:167 msgid "_Grid Lines" msgstr "_Лінії ґратки" #: src/ui/gui/data-editor.ui:171 msgid "Value _Labels" msgstr "_Мітки значень" #: src/ui/gui/data-editor.ui:182 msgid "_Variables" msgstr "_Змінні" #: src/ui/gui/data-editor.ui:192 msgid "_Sort Cases..." msgstr "_Упорядкувати спостереження…" #: src/ui/gui/data-editor.ui:196 msgid "_Transpose..." msgstr "_Транспонувати…" #: src/ui/gui/data-editor.ui:200 msgid "_Aggregate..." msgstr "_Агрегувати…" #: src/ui/gui/data-editor.ui:206 msgid "S_plit File..." msgstr "По_ділити файл…" #: src/ui/gui/data-editor.ui:210 msgid "Select _Cases..." msgstr "Вибрати сп_остереження…" #: src/ui/gui/data-editor.ui:214 msgid "_Weight Cases..." msgstr "З_важити спостереження…" #: src/ui/gui/data-editor.ui:220 msgid "_Transform" msgstr "Пе_ретворення" #: src/ui/gui/data-editor.ui:223 msgid "_Compute..." msgstr "_Обчислити…" #: src/ui/gui/data-editor.ui:227 msgid "Cou_nt..." msgstr "Під_рахувати…" #: src/ui/gui/data-editor.ui:231 msgid "Ran_k Cases..." msgstr "_Ранжувати спостереження…" #: src/ui/gui/data-editor.ui:235 msgid "Auto_matic Recode..." msgstr "_Автоматично перекодувати…" #: src/ui/gui/data-editor.ui:241 msgid "Recode into _Same Variables..." msgstr "Перекодувати до _тих самих змінних…" #: src/ui/gui/data-editor.ui:245 msgid "Recode into _Different Variables..." msgstr "Перекодувати до і_нших змінних…" #: src/ui/gui/data-editor.ui:251 msgid "_Run Pending Transforms" msgstr "_Виконати перетворення з черги" #: src/ui/gui/data-editor.ui:257 msgid "_Analyze" msgstr "_Аналіз" #: src/ui/gui/data-editor.ui:260 msgid "_Descriptive Statistics" msgstr "_Описова статистика" #: src/ui/gui/data-editor.ui:262 msgid "_Frequencies..." msgstr "_Частоти…" #: src/ui/gui/data-editor.ui:270 msgid "_Explore..." msgstr "_Дослідити…" #: src/ui/gui/data-editor.ui:274 msgid "_Crosstabs..." msgstr "_Таблиці спряженості…" #: src/ui/gui/data-editor.ui:279 msgid "Compare _Means" msgstr "Порівняти _середні" #: src/ui/gui/data-editor.ui:281 msgid "_Means..." msgstr "_Середні…" #: src/ui/gui/data-editor.ui:285 msgid "_One Sample T Test..." msgstr "_Одновибіркова t-перевірка…" #: src/ui/gui/data-editor.ui:289 msgid "_Independent Samples T Test..." msgstr "T-перевірка незалежних вибірок…" #: src/ui/gui/data-editor.ui:293 msgid "_Paired Samples T Test..." msgstr "T-перевірка парних вибірок…" #: src/ui/gui/data-editor.ui:297 msgid "One Way _ANOVA..." msgstr "Одно_факторний ANOVA…" #: src/ui/gui/data-editor.ui:302 msgid "_Univariate Analysis..." msgstr "_Одновимірний аналіз…" #: src/ui/gui/data-editor.ui:306 msgid "Bivariate _Correlation..." msgstr "Двовимірна _кореляція…" #: src/ui/gui/data-editor.ui:310 msgid "_K-Means Cluster..." msgstr "_Кластер k-середніх…" #: src/ui/gui/data-editor.ui:314 msgid "_Factor Analysis..." msgstr "Факторний _аналіз…" #: src/ui/gui/data-editor.ui:318 msgid "Re_liability..." msgstr "_Вірогідність…" #: src/ui/gui/data-editor.ui:322 msgid "_Regression" msgstr "_Регресія" #: src/ui/gui/data-editor.ui:325 msgid "_Linear..." msgstr "_Лінійна…" #: src/ui/gui/data-editor.ui:329 msgid "_Binary Logistic..." msgstr "_Бінарна логістична…" #: src/ui/gui/data-editor.ui:335 msgid "_Non-Parametric Statistics" msgstr "_Непараметричні критерії" #: src/ui/gui/data-editor.ui:338 msgid "_Chi Square..." msgstr "χ-_квадрат…" #: src/ui/gui/data-editor.ui:342 msgid "_Binomial..." msgstr "_Біноміальний…" #: src/ui/gui/data-editor.ui:346 msgid "_Runs..." msgstr "С_ерій…" #: src/ui/gui/data-editor.ui:350 msgid "_1 Sample K-S..." msgstr "Одновибірковий _Колмогорова-Смірнова…" #: src/ui/gui/data-editor.ui:354 msgid "_2 Related Samples..." msgstr "2 _пов'язані вибірки…" #: src/ui/gui/data-editor.ui:358 msgid "_K Related Samples..." msgstr "K п_ов'язаних вибірок…" #: src/ui/gui/data-editor.ui:362 msgid "K _Independent Samples..." msgstr "K _незалежних вибірок…" #: src/ui/gui/data-editor.ui:368 msgid "ROC Cur_ve..." msgstr "ROC-к_рива…" #: src/ui/gui/data-editor.ui:374 msgid "_Graphs" msgstr "_Графіки" #: src/ui/gui/data-editor.ui:377 msgid "_Scatterplot" msgstr "_Точкова діаграма" #: src/ui/gui/data-editor.ui:381 msgid "_Histogram" msgstr "_Гістограма" #: src/ui/gui/data-editor.ui:385 msgid "_Barchart" msgstr "_Стовпчикова діаграма" #: src/ui/gui/data-editor.ui:391 msgid "_Utilities" msgstr "_Сервіс" #: src/ui/gui/data-editor.ui:394 msgid "_Variables..." msgstr "_Змінні…" #: src/ui/gui/data-editor.ui:398 msgid "Data File _Comments..." msgstr "_Коментарі файла даних…" #: src/ui/gui/output-window.ui:71 msgid "_Print..." msgstr "Над_рукувати…" #: src/ui/gui/output-window.ui:76 msgid "_Export..." msgstr "_Експортувати…" #: src/ui/gui/output-window.ui:92 msgid "Select _All" msgstr "Позначити _всі" #: src/ui/gui/syntax-editor.ui:27 msgid "Syntax" msgstr "Синтаксис" #: src/ui/gui/syntax-editor.ui:31 msgid "Data" msgstr "Дані" #: src/ui/gui/syntax-editor.ui:41 msgid "_Save" msgstr "З_берегти" #: src/ui/gui/syntax-editor.ui:46 msgid "Save _As" msgstr "Зберегти _як" #: src/ui/gui/syntax-editor.ui:53 msgid "_Print" msgstr "_Надрукувати" #: src/ui/gui/syntax-editor.ui:84 msgid "_Delete" msgstr "Ви_лучити" #: src/ui/gui/syntax-editor.ui:90 msgid "_Undo" msgstr "В_ернути" #: src/ui/gui/syntax-editor.ui:94 msgid "_Redo" msgstr "Повт_орити" #: src/ui/gui/syntax-editor.ui:100 msgid "_Find" msgstr "З_найти" #: src/ui/gui/syntax-editor.ui:106 msgid "_Run" msgstr "З_апустити" #: src/ui/gui/syntax-editor.ui:109 msgid "_All" msgstr "_Всі" #: src/ui/gui/syntax-editor.ui:113 msgid "_Selection" msgstr "Поз_начене" #: src/ui/gui/syntax-editor.ui:117 msgid "_Current Line" msgstr "По_точний рядок" #: src/ui/gui/syntax-editor.ui:122 msgid "_To End" msgstr "_До кінця" #: src/ui/gui/var-type-dialog.ui:99 msgid "Scientific notation" msgstr "Інженерний запис" #: src/ui/gui/var-type-dialog.ui:150 msgid "Custom currency" msgstr "Нетипова валюта" #: src/ui/gui/var-type-dialog.ui:267 msgid "positive" msgstr "додатна" #: src/ui/gui/var-type-dialog.ui:279 msgid "negative" msgstr "від'ємна" #: src/ui/gui/var-type-dialog.ui:293 msgid "Sample" msgstr "Вибірка" #: src/ui/gui/var-type-dialog.ui:350 msgid "Width:" msgstr "Ширина:" #: src/ui/gui/var-type-dialog.ui:396 msgid "Decimal Places:" msgstr "Десяткові знаки:" #: src/ui/gui/weight.ui:24 msgid "Weight Cases" msgstr "Зважування спостережень" #: src/ui/gui/weight.ui:100 msgid "Weight cases by" msgstr "Зважити спостереження за" #: src/ui/gui/weight.ui:144 msgid "Frequency Variable" msgstr "Змінна частоти" #: src/ui/gui/weight.ui:198 msgid "Current Status: " msgstr "Поточний стан: " #. TRANSLATORS: This is the application name in the desktop file #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:7 #: src/ui/gui/org.fsf.pspp.desktop.in:7 msgid "GNU PSPP" msgstr "GNU PSPP" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:8 #, fuzzy #| msgid "A program for the analysis of sampled data" msgid "GNU PSPP is a program for statistical analysis of sampled data" msgstr "Програма для аналізу даних вибірок" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:10 msgid "" "GNU PSPP is a program for the statistical analysis of sampled data. It is a " "Free replacement for the proprietary program SPSS, and appears very similar " "to it with a few exceptions. The most important of these exceptions are, " "that there are no “time bombs”; your copy of PSPP will not “expire” or " "deliberately stop working in the future. Neither are there any artificial " "limits on the number of cases or variables which you can use. There are no " "additional packages to purchase in order to get “advanced” functions; all " "functionality that PSPP currently supports is in the core package." msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:11 msgid "" "PSPP is a stable and reliable application. It can perform descriptive " "statistics, T-tests, anova, linear and logistic regression, measures of " "association, cluster analysis, reliability and factor analysis, non-" "parametric tests and more. Its backend is designed to perform its analyses " "as fast as possible, regardless of the size of the input data. You can use " "PSPP with its graphical interface or the more traditional syntax commands." msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:12 msgid "A brief list of some of the PSPP's features." msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:14 msgid "Support for over 1 billion cases" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:15 msgid "Support for over 1 billion variables" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:16 msgid "Syntax and data files which are compatible with those of SPSS" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:17 msgid "A choice of terminal or graphical user interface" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:18 msgid "A choice of text, postscript, pdf, opendocument or html output formats" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:19 msgid "" "Inter-operability with: LibreOffice, Apache OpenOffice, Gnumeric and other " "free software" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:20 msgid "Easy data import from spreadsheets, text files and database sources" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:21 msgid "" "The capability to open, analyse and edit two or more datasets concurrently" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:22 msgid "A user interface supporting all common character sets" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:23 msgid "A user interface has been translated to multiple languages" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:24 msgid "Very fast statistical procedures, even on very large data sets" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:25 msgid "No license fees and no expiration period" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:26 msgid "No unethical “end user license agreements”" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:27 msgid "A fully indexed user manual" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:28 msgid "Freedom ensured; It is licensed under the GPLv3 or later" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:29 msgid "" "Portability; Runs on many different computers and many different operating " "systems" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:31 msgid "" "PSPP is particularly aimed at statisticians, social scientists and students " "requiring fast convenient analysis of sampled data." msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:41 #, fuzzy #| msgid "Variable View" msgid "GNU PSPP Variable View" msgstr "Перегляд змінних" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:54 msgid "Free Software Foundation" msgstr "" #: src/ui/gui/org.fsf.pspp.desktop.in:8 msgid "Statistical Software" msgstr "Статистичне програмне забезпечення" #: src/ui/gui/org.fsf.pspp.desktop.in:9 msgid "Analyze statistical data with a free alternative to SPSS" msgstr "Аналіз статистичних даних у вільній альтернативі SPSS" #. TRANSLATORS: Do not translate this string. Keep it as is, verbatim. #: src/ui/gui/org.fsf.pspp.desktop.in:12 msgid "pspp" msgstr "pspp" #. TRANSLATORS: You must keep all ";" - also at the end of line. #: src/ui/gui/org.fsf.pspp.desktop.in:17 msgid "statistics;analysis;spss;" msgstr "statistics;analysis;spss;статистика;аналіз;спсс;" #~ msgid "Sorry. The help system hasn't yet been implemented." #~ msgstr "Вибачте. Систему довідки ще не реалізовано." #~ msgid "Interactive shell not supported on this platform." #~ msgstr "" #~ "На цій платформі не передбачено підтримки інтерактивної командної " #~ "оболонки." #~ msgid "Error executing command: %s." #~ msgstr "Помилка під час спроби виконати команду: %s." pspp-1.4.1/po/cs.po,aux0000644000175000017500000000112513320146056014267 0ustar00blpblp00000000000000# Auxilliary translation of pspp to Czech # msgid "" msgstr "" "Project-Id-Version: pspp-0.7.9\n" "Report-Msgid-Bugs-To: pspp-dev@gnu.org\n" "PO-Revision-Date: 2011-07-20 21:10+0300\n" "Language: cs\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Lokalize 1.2\n" #: src/ui/gui/gen-dot-desktop.sh:12 msgid "Statistical Software" msgstr "Statistický program" #: src/ui/gui/gen-dot-desktop.sh:21 msgid "Analyze statistical data with a free alternative to SPSS" msgstr "Analyzuj statistická data se svobodnou variantou SPSS" pspp-1.4.1/po/Makefile.in0000644000175000017500000000053113320146056014575 0ustar00blpblp00000000000000# This is a dummy Makefile to reassure Automake. TARGETS = all distdir install install-data install-exec uninstall \ install-dvi install-html install-info install-ps install-pdf \ installdirs check installcheck mostlyclean clean distclean \ maintainer-clean dvi pdf ps info html tags ctags $(TARGETS): @# Nothing to do. .PHONY: $(TARGETS) pspp-1.4.1/po/gl.po0000644000175000017500000120531213725012645013504 0ustar00blpblp00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) 2014 Free Software Foundation, Inc. # This file is distributed under the same license as the pspp package. # Antón Méixome para osl , 2014. msgid "" msgstr "" "Project-Id-Version: pspp 0.8.4\n" "Report-Msgid-Bugs-To: pspp-dev@gnu.org\n" "PO-Revision-Date: 2014-10-15 13:48+0200\n" "Last-Translator: Antón Méixome \n" "Language-Team: Galician \n" "Language: gl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Bugs: Report translation errors to the Language-Team address.\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Virtaal 0.7.0\n" #: src/data/any-reader.c:72 src/data/encrypted-file.c:78 #, c-format msgid "An error occurred while opening `%s': %s." msgstr "Produciuse un erro ao abrir `%s': %s." #: src/data/any-reader.c:93 src/language/lexer/lexer.c:1633 #, c-format msgid "Error reading `%s': %s." msgstr "Produciuse un erro ao ler «%s»: %s." #: src/data/any-reader.c:114 #, c-format msgid "`%s' is not a system or portable file." msgstr "`%s' non é nin un sistema nin un ficheiro portábel." #: src/data/any-reader.c:123 src/data/any-writer.c:66 msgid "The inline file is not allowed here." msgstr "Non se permite o ficheiro en liña aquí." #: src/data/any-reader.c:205 #, c-format msgid "" "Cannot read from dataset %s because no dictionary or data has been written " "to it yet." msgstr "" "Non se pode ler no conxunto %s porque aínda non se escribiu nin dicionario " "nin datos nel." #: src/data/any-reader.c:260 src/language/data-io/dataset.c:253 msgid "Dataset" msgstr "Conxunto de datos" #: src/data/calendar.c:100 #, c-format msgid "Month %d is not in acceptable range of 0 to 13." msgstr "O mes %d non está nun rango aceptábel entre 0 e 13." #: src/data/calendar.c:110 #, c-format msgid "Day %d is not in acceptable range of 0 to 31." msgstr "O día %d non está nun rango aceptábel entre 0 e 31." #: src/data/calendar.c:119 #, c-format msgid "Date %04d-%d-%d is before the earliest acceptable date of 1582-10-15." msgstr "" "A data %04d-%d-%d é anterior á máis temperá data aceptábel de 1582-10-15." #: src/data/casereader-filter.c:221 msgid "" "At least one case in the data read had a weight value that was user-missing, " "system-missing, zero, or negative. These case(s) were ignored." msgstr "" "Cando menos un caso nos datos lidos tiña un valor de ponderación de usuario " "perdido, sistema perdido, cero ou negativo. Ese caso(s) ignoráronse." #. TRANSLATORS: this fragment will be interpolated into messages in fh_lock() #. that identify types of files. #: src/data/csv-file-writer.c:138 msgid "CSV file" msgstr "Ficheiro CSV" #: src/data/csv-file-writer.c:146 #, fuzzy, c-format #| msgid "Error opening `%s' for writing as a system file: %s." msgid "Error opening `%s' for writing as a CSV file: %s." msgstr "" "Produciuse un erro ao abrir «%s» para escribir nel como ficheiro de sistema: " "%s." #: src/data/csv-file-writer.c:453 #, c-format msgid "An I/O error occurred writing CSV file `%s'." msgstr "Produciuse un erro E/S ao escribir o ficheiro CSV «%s»." #: src/data/data-in.c:175 #, c-format msgid "Data is not valid as format %s: %s" msgstr "A data non é correcta co formato %s: %s" #: src/data/data-in.c:377 src/data/data-in.c:553 msgid "Field contents are not numeric." msgstr "O contido do campo non é numérico." #: src/data/data-in.c:379 src/data/data-in.c:555 msgid "Number followed by garbage." msgstr "Número seguido de lixo." #: src/data/data-in.c:392 msgid "Invalid numeric syntax." msgstr "Sintaxe de número incorrecta." #: src/data/data-in.c:400 src/data/data-in.c:571 msgid "Too-large number set to system-missing." msgstr "Estabeleceuse un número largo de máis como sistema perdido." #: src/data/data-in.c:406 src/data/data-in.c:577 msgid "Too-small number set to zero." msgstr "Estabeleceuse un número pequeno de máis como cero." #: src/data/data-in.c:426 msgid "All characters in field must be digits." msgstr "Todos os caracteres do campo deben ser díxitos." #: src/data/data-in.c:445 msgid "Unrecognized character in field." msgstr "Carácter irrecoñecíbel no campo." #: src/data/data-in.c:466 src/data/data-in.c:729 msgid "Field must have even length." msgstr "O campo debe ter tamaño par." #: src/data/data-in.c:468 src/data/data-in.c:732 msgid "Field must contain only hex digits." msgstr "O campo debe conter soamente díxitos hexadecimais." #: src/data/data-in.c:544 msgid "Invalid zoned decimal syntax." msgstr "Incorrecta sintaxe decimal zonificada." #: src/data/data-in.c:644 src/data/data-in.c:650 msgid "Invalid syntax for P field." msgstr "Incorrecta sintaxe do campo P." #: src/data/data-in.c:768 src/data/data-in.c:818 msgid "Syntax error in date field." msgstr "Erro de sintaxe no campo da data." #: src/data/data-in.c:783 #, c-format msgid "Day (%ld) must be between 1 and 31." msgstr "O día (%ld) debe estar entre 1 e 31." #: src/data/data-in.c:832 msgid "Delimiter expected between fields in date." msgstr "Agardábase un delimitador entre campos na data." #: src/data/data-in.c:906 msgid "" "Unrecognized month format. Months may be specified as Arabic or Roman " "numerals or as at least 3 letters of their English names." msgstr "" "Non se recoñeceu o formato de mes. Os meses débense especificar en numerais " "arábigos ou romanos ou cando menos con 3 letras do seu nome en inglés." #: src/data/data-in.c:933 #, c-format msgid "Year (%ld) must be between 1582 and 19999." msgstr "O ano (%ld) debe estar entre 1582 e 19999." #: src/data/data-in.c:944 #, c-format msgid "Trailing garbage `%.*s' following date." msgstr "Sacando o lixo «%.*s» da data seguinte." #: src/data/data-in.c:958 msgid "Julian day must have exactly three digits." msgstr "O día xuliano debe ter exactamente tres díxitos." #: src/data/data-in.c:960 #, c-format msgid "Julian day (%ld) must be between 1 and 366." msgstr "O día xuliano (%ld) debe estar entre 1 e 366." #: src/data/data-in.c:984 #, c-format msgid "Quarter (%ld) must be between 1 and 4." msgstr "O cuarto (%ld) debe estar entre 1 e 4." #: src/data/data-in.c:1005 #, c-format msgid "Week (%ld) must be between 1 and 53." msgstr "A semana (%ld) debe estar entre 1 e 53." #: src/data/data-in.c:1017 msgid "Delimiter expected between fields in time." msgstr "Agardábase un delimitador entre campos na hora." #: src/data/data-in.c:1037 #, c-format msgid "Minute (%ld) must be between 0 and 59." msgstr "O minuto (%ld) debe estar entre 0 e 59." #: src/data/data-in.c:1075 msgid "" "Unrecognized weekday name. At least the first two letters of an English " "weekday name must be specified." msgstr "" "Nome de día de semana irrecoñecíbel. Débese especificar, cando menos, as " "dúas primeiras letras dun día da semana en inglés." #: src/data/data-in.c:1210 #, c-format msgid "`%c' expected in date field." msgstr "Agardábase «%c» no campo da data." #: src/data/data-out.c:580 #, c-format msgid "Weekday number %f is not between 1 and 7." msgstr "O número %f do día de semana non está entre 1 e 7." #: src/data/data-out.c:605 #, c-format msgid "Month number %f is not between 1 and 12." msgstr "O número %f do mes non está entre 1 e 12." #. TRANSLATORS: this fragment will be interpolated into #. messages in fh_lock() that identify types of files. #: src/data/dataset-writer.c:66 src/language/data-io/file-handle.c:304 msgid "dataset" msgstr "conxunto de datos" #: src/data/dict-class.c:52 msgid "ordinary" msgstr "ordinario" #: src/data/dict-class.c:54 msgid "system" msgstr "sistema" #: src/data/dict-class.c:56 msgid "scratch" msgstr "de cero" #: src/data/dictionary.c:1523 #, c-format msgid "Truncating document line to %d bytes." msgstr "Truncado de liña de documento aos %d bytes." #: src/data/encrypted-file.c:89 #, c-format msgid "An error occurred while reading `%s': %s." msgstr "Produciuse un erro ao ler «%s»: %s." #: src/data/encrypted-file.c:430 #, c-format msgid "" "%s: encrypted file corrupted (ends in incomplete %u-byte ciphertext block)" msgstr "" #: src/data/encrypted-file.c:449 #, c-format msgid "%s: encrypted file corrupted (ends with bad padding)" msgstr "" #: src/data/file-handle-def.c:283 src/language/data-io/dataset.c:266 msgid "active dataset" msgstr "conxunto de datos activo" #: src/data/file-handle-def.c:518 #, c-format msgid "Can't read from %s as a %s because it is already being read as a %s." msgstr "Non se pode ler de %s como un %s porque xa se está a ler como un %s." #: src/data/file-handle-def.c:522 #, c-format msgid "Can't write to %s as a %s because it is already being written as a %s." msgstr "" "Non se pode escribir en %s como un %s porque xa se está a ler como un %s." #: src/data/file-handle-def.c:529 #, c-format msgid "Can't re-open %s as a %s." msgstr "Non se pode reabrir %s como un %s." #: src/data/file-name.c:133 #, c-format msgid "Not opening pipe file `%s' because %s option set." msgstr "" "Non se abre o ficheiro tubaría «%s» porque está seleccionada a opción %s." #: src/data/format.c:339 msgid "Input format" msgstr "Formato de entrada" #: src/data/format.c:339 msgid "Output format" msgstr "Formato de saída" #: src/data/format.c:342 #, c-format msgid "Format %s may not be used for input." msgstr "Poida que non se use o formato %s para a entrada." #: src/data/format.c:349 #, c-format msgid "%s specifies width %d, but %s requires an even width." msgstr "%s especifica o largo %d pero %s require un largo parello." #: src/data/format.c:358 #, c-format msgid "%s %s specifies width %d, but %s requires a width between %d and %d." msgstr "" "%s %s especifica unha largura de %d pero %s require unha largura entre %d e " "%d." #: src/data/format.c:367 #, c-format msgid "%s %s specifies %d decimal place, but %s does not allow any decimals." msgid_plural "" "%s %s specifies %d decimal places, but %s does not allow any decimals." msgstr[0] "" "%s %s especifica %d posición decimal pero %s non permite ningún decimal." msgstr[1] "" "%s %s especifica %d posicións decimais pero %s non permite ningún decimal." #: src/data/format.c:378 #, c-format msgid "" "%s %s specifies %d decimal place, but the given width allows at most %d " "decimals." msgid_plural "" "%s %s specifies %d decimal places, but the given width allows at most %d " "decimals." msgstr[0] "" "%s %s especifica %d posición decimal pero a largura dada permite como moito " "%d decimais." msgstr[1] "" "%s %s especifica %d posicións decimais pero a largura dada permite como " "moito %d decimais." #: src/data/format.c:385 #, c-format msgid "" "%s %s specifies %d decimal place, but the given width does not allow for any " "decimals." msgid_plural "" "%s %s specifies %d decimal places, but the given width does not allow for " "any decimals." msgstr[0] "" "%s %s especifica a %d posición decimal pero a largura dada non permite " "ningún decimal." msgstr[1] "" "%s %s especifica a %d posicións decimais pero a largura dada non permite " "ningún decimal." #: src/data/format.c:424 #, c-format msgid "%s variables are not compatible with %s format %s." msgstr "%s variábeis non son compatíbeis con %s no formato %s." #: src/data/format.c:425 src/data/format.c:1074 #: src/ui/gui/var-type-dialog.ui:167 msgid "String" msgstr "Cadea" #: src/data/format.c:425 src/data/format.c:1035 #: src/ui/gui/var-type-dialog.ui:48 msgid "Numeric" msgstr "Numérico" #: src/data/format.c:426 src/data/sys-file-reader.c:2212 #: src/data/sys-file-reader.c:2214 src/language/xforms/recode.c:512 #: src/language/xforms/recode.c:513 src/language/xforms/recode.c:525 #: src/language/xforms/recode.c:526 #: src/language/dictionary/apply-dictionary.c:77 #: src/language/dictionary/apply-dictionary.c:78 msgid "numeric" msgstr "numérico" #: src/data/format.c:426 src/data/sys-file-reader.c:2212 #: src/data/sys-file-reader.c:2214 src/language/xforms/recode.c:512 #: src/language/xforms/recode.c:513 src/language/xforms/recode.c:525 #: src/language/xforms/recode.c:526 #: src/language/dictionary/apply-dictionary.c:77 #: src/language/dictionary/apply-dictionary.c:78 msgid "string" msgstr "cadea" #: src/data/format.c:444 #, c-format msgid "String variable with width %d is not compatible with format %s." msgstr "A variábel de cadea co largo %d non é compatíbel co formato %s." #: src/data/format.c:1038 src/ui/gui/var-type-dialog.ui:65 msgid "Comma" msgstr "Coma" #: src/data/format.c:1041 src/ui/gui/var-type-dialog.ui:82 msgid "Dot" msgstr "Punto" #: src/data/format.c:1044 msgid "Scientific" msgstr "Científico" #: src/data/format.c:1061 src/ui/gui/var-type-dialog.ui:116 msgid "Date" msgstr "Data" #: src/data/format.c:1064 src/ui/gui/var-type-dialog.ui:133 msgid "Dollar" msgstr "Dólar" #: src/data/format.c:1071 msgid "Custom" msgstr "Personalizar" #: src/data/gnumeric-reader.c:478 src/data/ods-reader.c:505 #, c-format msgid "Cannot convert the value in the spreadsheet cell %s to format (%s): %s" msgstr "" "Non se pode converter o valor da cela da folla de cálculo %s ao formato " "(%s): %s" #: src/data/gnumeric-reader.c:502 src/data/ods-reader.c:567 #, c-format msgid "" "There was a problem whilst reading the %s file `%s' (near line %d): `%s'" msgstr "" "Produciuse un problema ao ler o ficheiro %s «%s» (arredor da liña %d): «%s»" #: src/data/gnumeric-reader.c:597 #, c-format msgid "" "The gnumeric file `%s' is encoded as %s instead of the usual UTF-8 encoding. " "Any non-ascii characters will be incorrectly imported." msgstr "" "O ficheiro gnumeric «%s» está codificado como %s en lugar da acostumada " "codificación UTF-8. Calquera carácter non-ascii importarase incorrectamente." #: src/data/gnumeric-reader.c:641 src/data/ods-reader.c:682 #, c-format msgid "Invalid cell range `%s'" msgstr "O intervalo de cela «%s» é incorrecto" #: src/data/gnumeric-reader.c:813 src/data/ods-reader.c:710 #: src/data/ods-reader.c:843 #, c-format msgid "Selected sheet or range of spreadsheet `%s' is empty." msgstr "" "A folla seleccionada ou o intervalo da folla de cálulo «%s» está baleiro." #: src/data/identifier2.c:60 #, c-format msgid "Identifier `%s' exceeds %d-byte limit." msgstr "O identificador «%s» excede o límite %d-byte." #: src/data/identifier2.c:84 msgid "Identifier cannot be empty string." msgstr "O identificador non pode ser unha cadea baleira." #: src/data/identifier2.c:92 #, c-format msgid "`%s' may not be used as an identifier because it is a reserved word." msgstr "" "poida que non se utilice «%s» como identificador porque é unha palabra " "reservada." #: src/data/identifier2.c:103 #, c-format msgid "" "`%s' may not be used as an identifier because it contains ill-formed UTF-8 " "at byte offset %tu." msgstr "" "poida que non se utilice «%s» como identificador porque contén UTF-8 " "malformado no desprazamento do byte %tu." #: src/data/identifier2.c:114 #, c-format msgid "" "Character %s (in `%s') may not appear as the first character in a identifier." msgstr "" "O carácter %s (en «%s») non pode aparecer como primeiro carácter nun " "identificador." #: src/data/identifier2.c:126 #, c-format msgid "Character %s (in `%s') may not appear in an identifier." msgstr "O carácter %s (en «%s») non pode nun identificador." #: src/data/mdd-writer.c:241 #, fuzzy, c-format #| msgid "I/O error occurred writing data file `%s'." msgid "An I/O error occurred writing metadata file `%s'." msgstr "Produciuse un erro E/S ao escribir o ficheiro de datos «%s»." #. TRANSLATORS: this fragment will be interpolated into #. messages in fh_lock() that identify types of files. #: src/data/mdd-writer.c:457 #, fuzzy #| msgid "data file" msgid "metadata file" msgstr "ficheiro de datos" #: src/data/mdd-writer.c:465 #, fuzzy, c-format #| msgid "Error opening `%s' for writing as a portable file: %s." msgid "Error opening `%s' for writing as a metadata file: %s." msgstr "" "Produciuse un erro ao abrir «%s» para escribir nel ficheiro portábel: %s." #: src/data/mdd-writer.c:473 #, c-format msgid "Internal error creating xmlTextWriter. Please report this to %s." msgstr "" #: src/data/make-file.c:217 #, c-format msgid "Opening %s for writing: %s." msgstr "Abrindo %s para escritura: %s." #: src/data/make-file.c:228 #, c-format msgid "Opening stream for %s: %s." msgstr "Abrindo un fluxo para %s: %s." #: src/data/make-file.c:260 #, c-format msgid "Creating temporary file to replace %s: %s." msgstr "Crear un ficheiro temporal para substituír %s: %s." #: src/data/make-file.c:277 #, c-format msgid "Creating temporary file %s: %s." msgstr "Crear un ficheiro temporal %s: %s." #: src/data/make-file.c:289 #, c-format msgid "Opening stream for temporary file %s: %s." msgstr "Abrir un fluxo para o ficheiro temporal %s: %s." #: src/data/make-file.c:326 #, c-format msgid "Replacing %s by %s: %s." msgstr "Substitución de %s por %s: %s." #: src/data/make-file.c:354 #, c-format msgid "Removing %s: %s." msgstr "Retirando %s: %s." #: src/data/mrset.c:83 #, c-format msgid "" "%s is not a valid name for a multiple response set. Multiple response set " "names must begin with `$'." msgstr "" "%s non é un nome válido para un conxunto de resposta múltipla. Os nomes dun " "conxunto de resposta múltipla deben comezar con «$»." #: src/data/ods-reader.c:620 #, c-format msgid "Cannot open %s as a OpenDocument file: %s" msgstr "Non foi posíbel abrir %s como ficheiro OpenDocument: %s" #. TRANSLATORS: this fragment will be interpolated into #. messages in fh_lock() that identify types of files. #: src/data/pc+-file-reader.c:206 #, fuzzy #| msgid "system file" msgid "SPSS/PC+ system file" msgstr "ficheiro de sistema" #: src/data/pc+-file-reader.c:215 #, fuzzy, c-format #| msgid "Error opening `%s' for reading as a system file: %s." msgid "Error opening `%s' for reading as an SPSS/PC+ system file: %s." msgstr "" "Produciuse un erro ao abrir «%s» para ler como ficheiro de sistema: %s." #: src/data/pc+-file-reader.c:224 src/data/sys-file-reader.c:3541 #, c-format msgid "%s: stat failed (%s)." msgstr "%s: fallou a procura (%s)." #: src/data/pc+-file-reader.c:230 #, c-format msgid "%s: file too large." msgstr "" #: src/data/pc+-file-reader.c:257 #, c-format msgid "" "Directory entry is for a %u-byte record starting at offset %u but file is " "only %u bytes long." msgstr "" #: src/data/pc+-file-reader.c:275 #, c-format msgid "Directory fields have unexpected values (%u,%u)." msgstr "" #: src/data/pc+-file-reader.c:372 src/data/sys-file-reader.c:672 #, c-format msgid "Variable %zu" msgstr "Variábel %zu" #: src/data/pc+-file-reader.c:380 src/data/sys-file-reader.c:680 #, c-format msgid "Variable %zu Label" msgstr "Etiqueta de variábel %zu" #: src/data/pc+-file-reader.c:385 #, fuzzy, c-format #| msgid "Variable %zu Label" msgid "Variable %zu Value Label %zu" msgstr "Etiqueta de variábel %zu" #: src/data/pc+-file-reader.c:388 src/data/sys-file-reader.c:690 msgid "Creation Date" msgstr "Data de creación" #: src/data/pc+-file-reader.c:389 src/data/sys-file-reader.c:691 msgid "Creation Time" msgstr "Hora de creación" #: src/data/pc+-file-reader.c:390 src/data/sys-file-reader.c:692 #: src/language/dictionary/sys-file-info.c:200 msgid "Product" msgstr "Produto" #: src/data/pc+-file-reader.c:391 src/data/sys-file-reader.c:693 #: src/language/dictionary/sys-file-info.c:300 msgid "File Label" msgstr "Etiqueta do ficheiro" #: src/data/pc+-file-reader.c:427 #, fuzzy, c-format #| msgid "" #| "This system file does not indicate its own character encoding. Using " #| "default encoding %s. For best results, specify an encoding explicitly. " #| "Use SYSFILE INFO with ENCODING=\"DETECT\" to analyze the possible " #| "encodings." msgid "" "Using default encoding %s to read this SPSS/PC+ system file. For best " "results, specify an encoding explicitly. Use SYSFILE INFO with ENCODING=" "\"DETECT\" to analyze the possible encodings." msgstr "" "Este ficheiro de sistema non indica a súa propia codificación de caracteres. " "Utilízase a codificación predeterminada %s. Para obter os mellores " "resultados, especifique a codificación explicitamente. Utilice SYSFILE INFO " "con ENCODING=«DETECT» para analizar as codificacións dispoñíbeis." #: src/data/pc+-file-reader.c:483 src/data/sys-file-reader.c:890 #, c-format msgid "Error closing system file `%s': %s." msgstr "Produciuse un erro ao pechar o ficheiro de sistema «%s»: %s." #: src/data/pc+-file-reader.c:544 #, fuzzy #| msgid "This is not an SPSS system file." msgid "This is not an SPSS/PC+ system file." msgstr "Este non é un ficheiro do sistema SPSS." #: src/data/pc+-file-reader.c:548 #, c-format msgid "Record 0 has unexpected length %u." msgstr "" #: src/data/pc+-file-reader.c:572 #, fuzzy, c-format #| msgid "File specifies unexpected value %g (%a) as %s, instead of %g (%a)." msgid "Record 0 specifies unexpected system missing value %g (%a)." msgstr "" "O ficheiro especifica un valor inesperado %g (%a) como %s, en lugar de %g " "(%a)." #: src/data/pc+-file-reader.c:577 #, c-format msgid "Record 0 reserved fields have unexpected values (%u,%u,%u,%u,%u,%u)." msgstr "" #: src/data/pc+-file-reader.c:581 #, c-format msgid "Record 0 case counts differ (%u versus %u)." msgstr "" #: src/data/pc+-file-reader.c:585 #, fuzzy, c-format #| msgid "Unsupported compression type (%d)" msgid "Invalid compression type %u." msgstr "Non é compatíbel o tipo de compresión (%d)" #: src/data/pc+-file-reader.c:596 #, c-format msgid "" "Record 0 claims %u cases with %u values per case (requiring at least %zu " "bytes) but data record is only %u bytes long." msgstr "" #: src/data/pc+-file-reader.c:618 #, c-format msgid "" "Value labels claimed to end at offset %u in labels record but labels record " "is only %u bytes." msgstr "" #: src/data/pc+-file-reader.c:629 #, c-format msgid "" "Value labels claimed to be at offset %u with length %u but file size is only " "%u bytes." msgstr "" #: src/data/pc+-file-reader.c:656 #, c-format msgid "" "Value labels end with partial label (%u bytes left in record, label length " "%)." msgstr "" #: src/data/pc+-file-reader.c:669 #, c-format msgid "%u leftover bytes following value labels." msgstr "" #: src/data/pc+-file-reader.c:685 #, c-format msgid "" "Variable label claimed to start at offset %u in labels record but labels " "record is only %u bytes." msgstr "" #: src/data/pc+-file-reader.c:697 #, c-format msgid "" "Variable label with length %u starting at offset %u in labels record " "overruns end of %u-byte labels record." msgstr "" #: src/data/pc+-file-reader.c:719 #, fuzzy, c-format #| msgid "Record type 7, subtype %d has bad count %u (expected %d)." msgid "Record 1 has length %u (expected %u)." msgstr "" "O rexistro de tipo 7, subtipo %d ten unha conta inadecuada %u (agardábase " "%d)." #: src/data/pc+-file-reader.c:751 #, fuzzy, c-format #| msgid "Numeric variable %s has invalid format specifier %s." msgid "Variable %u has invalid type %." msgstr "A variábel numérica %s ten un especificador de formato %s incorrecto." #: src/data/pc+-file-reader.c:787 #, fuzzy, c-format #| msgid "Invalid integer." msgid "Invalid weight index %u." msgstr "Enteiro incorrecto." #: src/data/pc+-file-reader.c:857 #, c-format msgid "Invalid variable name `%s'." msgstr "Nome de variábel «%s» incorrecta." #: src/data/pc+-file-reader.c:865 src/data/sys-file-reader.c:1444 #, c-format msgid "Renaming variable with duplicate name `%s' to `%s'." msgstr "Renomeando a variábel con nome duplicado de «%s» a «%s»." #: src/data/pc+-file-reader.c:877 #, fuzzy, c-format #| msgid "%s is not allowed with string variables." msgid "Cannot weight by string variable `%s'." msgstr "Non se admite %s con variábeis de cadea." #: src/data/pc+-file-reader.c:973 src/data/sys-file-reader.c:2762 msgid "File ends in partial case." msgstr "O ficheiro finaliza nun caso parcial." #: src/data/pc+-file-reader.c:979 #, c-format msgid "" "Case beginning at offset 0x%08x extends past end of data record at offset 0x" "%08x." msgstr "" #: src/data/pc+-file-reader.c:998 src/data/sys-file-reader.c:2770 #, c-format msgid "Error reading case from file %s." msgstr "Produciuse un erro ao ler o caso do ficheiro %s." #: src/data/pc+-file-reader.c:1114 src/data/sys-file-reader.c:2933 #, c-format msgid "" "Possible compressed data corruption: string contains compressed integer " "(opcode %d)." msgstr "" "Existe a posibilidade de que os datos comprimidos estean corruptos: a cadea " "contén enteiros comprimidos (opcode %d)." #: src/data/pc+-file-reader.c:1156 src/data/sys-file-reader.c:3234 #, c-format msgid "`%s' near offset 0x%llx: " msgstr "«%s» preto do desprazamento 0x%llx: " #: src/data/pc+-file-reader.c:1159 src/data/sys-file-reader.c:3237 #, c-format msgid "`%s': " msgstr "«%s»: " #: src/data/pc+-file-reader.c:1211 src/data/sys-file-reader.c:3288 #, c-format msgid "System error: %s." msgstr "Erro do sistema: %s." #: src/data/pc+-file-reader.c:1216 src/data/sys-file-reader.c:3293 msgid "Unexpected end of file." msgstr "Inesperada fin do ficheiro." #: src/data/pc+-file-reader.c:1301 src/data/sys-file-reader.c:3518 #, c-format msgid "%s: seek failed (%s)." msgstr "%s: fallou a pesquisa (%s)." #: src/data/pc+-file-reader.c:1351 #, fuzzy #| msgid "System File" msgid "SPSS/PC+ System File" msgstr "Ficheiro de sistema" #: src/data/por-file-reader.c:109 #, c-format msgid "portable file %s corrupt at offset 0x%llx: " msgstr "o ficheiro portábel %s corrompeuse no desprazamento 0x%llx: " #: src/data/por-file-reader.c:136 #, c-format msgid "reading portable file %s at offset 0x%llx: " msgstr "lendo o ficheiro portábel %s no desprazamento 0x%llx: " #: src/data/por-file-reader.c:164 #, c-format msgid "Error closing portable file `%s': %s." msgstr "Produciuse un erro ao pechar o ficheiro «%s»: %s." #: src/data/por-file-reader.c:216 msgid "unexpected end of file" msgstr "remate de ficheiro inesperado" #. TRANSLATORS: this fragment will be interpolated into #. messages in fh_lock() that identify types of files. #: src/data/por-file-reader.c:275 src/data/por-file-writer.c:147 msgid "portable file" msgstr "ficheiro portábel" #: src/data/por-file-reader.c:283 #, c-format msgid "" "An error occurred while opening `%s' for reading as a portable file: %s." msgstr "" "Produciuse un erro ao abrir «%s» para a súa lectura como ficheiro portábel: " "%s." #: src/data/por-file-reader.c:304 msgid "Data record expected." msgstr "Esperábase un rexistro de datos." #: src/data/por-file-reader.c:402 msgid "Number expected." msgstr "Esperábase un número." #: src/data/por-file-reader.c:430 msgid "Missing numeric terminator." msgstr "Falta o terminador numérico." #: src/data/por-file-reader.c:453 msgid "Invalid integer." msgstr "Enteiro incorrecto." #: src/data/por-file-reader.c:464 src/data/por-file-reader.c:484 #, c-format msgid "Bad string length %d." msgstr "Non vale a lonxitude da cadea %d." #: src/data/por-file-reader.c:547 #, c-format msgid "%s: Not a portable file." msgstr "%s: Non é un ficheiro portábel." #: src/data/por-file-reader.c:564 #, c-format msgid "Unrecognized version code `%c'." msgstr "Non se recoñeceu o código da versión «%c»." #: src/data/por-file-reader.c:577 #, c-format msgid "Bad date string length %zu." msgstr "Non vale a lonxitude da cadea de data %zu." #: src/data/por-file-reader.c:579 #, c-format msgid "Bad time string length %zu." msgstr "Non vale a lonxitude da cadea %zu." #: src/data/por-file-reader.c:630 #, c-format msgid "" "%s: Bad format specifier byte (%d). Variable will be assigned a default " "format." msgstr "" "%s: Non vale o byte especificador de formato (%d). Asignaráselle á variábel " "un formato predeterminado." #: src/data/por-file-reader.c:651 #, c-format msgid "Numeric variable %s has invalid format specifier %s." msgstr "A variábel numérica %s ten un especificador de formato %s incorrecto." #: src/data/por-file-reader.c:655 #, c-format msgid "String variable %s with width %d has invalid format specifier %s." msgstr "" "A variábel de cadea %s coa largura %d ten un especificador de formato %s " "incorrecto." #: src/data/por-file-reader.c:679 msgid "Expected variable count record." msgstr "Esperábase un rexistro de conta da variábel." #: src/data/por-file-reader.c:683 #, c-format msgid "Invalid number of variables %d." msgstr "Número de variábeis %d incorrecto." #: src/data/por-file-reader.c:692 #, c-format msgid "Weight variable name (%s) truncated." msgstr "Nome da variábel de ponderación (%s) truncada." #: src/data/por-file-reader.c:707 msgid "Expected variable record." msgstr "Esperábase un rexistro da variábel." #: src/data/por-file-reader.c:711 #, c-format msgid "Invalid variable width %d." msgstr "Largura de variábel %d incorrecta." #: src/data/por-file-reader.c:719 #, c-format msgid "Invalid variable name `%s' in position %d." msgstr "Nome de variábel incorrecta «%s» na posición %d." #: src/data/por-file-reader.c:723 src/data/sys-file-reader.c:1426 #, c-format msgid "Bad width %d for variable %s." msgstr "Non vale a largura %d para a variábel %s." #: src/data/por-file-reader.c:737 #, c-format msgid "Duplicate variable name %s in position %d renamed to %s." msgstr "O nome de variábel duplicada %s na posición %d renomeada como %s." #: src/data/por-file-reader.c:786 #, c-format msgid "Weighting variable %s not present in dictionary." msgstr "A variábel de ponderación %s non está presente no dicionario." #: src/data/por-file-reader.c:830 #, c-format msgid "Unknown variable %s while parsing value labels." msgstr "Variábel descoñecida %s ao procesar as etiquetas de valor." #: src/data/por-file-reader.c:833 #, c-format msgid "" "Cannot assign value labels to %s and %s, which have different variable types." msgstr "" "Non se poden asignar etiquetas de valor a %s e a %s, que teñen diferentes " "tipos de variábeis." #: src/data/por-file-reader.c:972 #, fuzzy #| msgid "Portable File" msgid "SPSS Portable File" msgstr "Ficheiro portábel" #: src/data/por-file-writer.c:139 #, c-format msgid "Invalid decimal digits count %d. Treating as %d." msgstr "Conta de díxitos decimais incorrecta %d. Trátanse como %d." #: src/data/por-file-writer.c:159 #, c-format msgid "Error opening `%s' for writing as a portable file: %s." msgstr "" "Produciuse un erro ao abrir «%s» para escribir nel ficheiro portábel: %s." #: src/data/por-file-writer.c:505 #, c-format msgid "An I/O error occurred writing portable file `%s'." msgstr "Produciuse un erro E/S ao escribir o ficheiro portábel «%s»." #: src/data/psql-reader.c:48 msgid "" "Support for reading postgres databases was not compiled into this " "installation of PSPP" msgstr "" "A capacidade de ler bases de daos postgres non se compilou nesta instalación " "de PSPP" #: src/data/psql-reader.c:242 msgid "Memory error whilst opening psql source" msgstr "Erro de memoria ao abrir a orixe psql" #: src/data/psql-reader.c:248 #, c-format msgid "Error opening psql source: %s." msgstr "Erro ao abrir a orixe psql: %s." #: src/data/psql-reader.c:263 #, c-format msgid "" "Postgres server is version %s. Reading from versions earlier than 8.0 is not " "supported." msgstr "" "O servidor ten a versión %s. Non é compatíbel coa lectura de versións " "anteriores á 8.0." #: src/data/psql-reader.c:283 msgid "" "Connection is unencrypted, but unencrypted connections have not been " "permitted." msgstr "" "A conexión está sen cifrar aínda que non se permitiron as conexións sen " "cifrado." #: src/data/psql-reader.c:324 src/data/psql-reader.c:349 #: src/data/psql-reader.c:359 #, c-format msgid "Error from psql source: %s." msgstr "Produciuse un erro na orixe psql: %s." #: src/data/psql-reader.c:454 #, c-format msgid "Unsupported OID %d. SYSMIS values will be inserted." msgstr "Non se admite OID %d. Inseriranse os valores SYSMIS." #: src/data/settings.c:391 msgid "" "MXWARNS set to zero. No further warnings will be given even when " "potentially problematic situations are encountered." msgstr "" "Estabeleceuse MXWARNS a cero. Non se darán avisos posteriores incluso aínda " "que se dean situacións potencialmente problemáticas." #: src/data/settings.c:398 #, c-format msgid "" "Warnings re-enabled. %d warnings will be issued before aborting syntax " "processing." msgstr "" "Reactiváronse os avisos. Emitiranse os avisos %d antes de interromper o " "procesamento da sintaxe." #: src/data/settings.c:618 #, c-format msgid "" "%s: Custom currency string `%s' does not contain exactly three periods or " "commas (or it contains both)." msgstr "" "%s: A cadea de moeda personalizada «%s» non contén exactamente tres períodos " "ou comas (ou contén ambas)." #. TRANSLATORS: this fragment will be interpolated into #. messages in fh_lock() that identify types of files. #: src/data/sys-file-reader.c:407 src/data/sys-file-writer.c:245 msgid "system file" msgstr "ficheiro de sistema" #: src/data/sys-file-reader.c:414 #, c-format msgid "Error opening `%s' for reading as a system file: %s." msgstr "" "Produciuse un erro ao abrir «%s» para ler como ficheiro de sistema: %s." #: src/data/sys-file-reader.c:491 msgid "Misplaced type 4 record." msgstr "Rexistro inapropiado de tipo 4." #: src/data/sys-file-reader.c:496 msgid "Duplicate type 6 (document) record." msgstr "Rexistro duplicado de tipo 6 (documento)." #: src/data/sys-file-reader.c:506 src/data/sys-file-reader.c:1343 #, fuzzy, c-format #| msgid "" #| "Unrecognized record type 7, subtype %d. Please send a copy of this file, " #| "and the syntax which created it to %s." msgid "" "Unrecognized record type 7, subtype %d. For help, please send this file to " "%s and mention that you were using %s." msgstr "" "Rexistro de tipo 7 irrecoñecíbel, subtipo %d. Envíe unha copia deste " "ficheiro, e a sintaxe para crealo a %s." #: src/data/sys-file-reader.c:526 #, fuzzy, c-format #| msgid "" #| "Record type 7, subtype %d found here has the same type as the record " #| "found near offset 0x%llx. Please send a copy of this file, and the " #| "syntax which created it to %s." msgid "" "Record type 7, subtype %d found here has the same type as the record found " "near offset 0x%llx. For help, please send this file to %s and mention that " "you were using %s." msgstr "" "O rexistro de tipo 7, subtipo %d atopado aquí ten o mesmo tipo ca o rexistro " "atopado preto do desprazamento 0x%llx. Envíe unha copia deste ficheiro e a " "sintaxe coa que o creou a %s." #: src/data/sys-file-reader.c:538 #, c-format msgid "Unrecognized record type %d." msgstr "Tipo de rexistro %d irrecoñecíbel." #: src/data/sys-file-reader.c:688 #, c-format msgid "Value Label %zu" msgstr "Valor de etiqueta %zu" #: src/data/sys-file-reader.c:697 msgid "Extra Product Info" msgstr "Información extra do produto" #: src/data/sys-file-reader.c:710 #, c-format msgid "Document Line %zu" msgstr "Liña do documento %zu" #: src/data/sys-file-reader.c:718 #, c-format msgid "MRSET %zu" msgstr "MRSET %zu" #: src/data/sys-file-reader.c:720 #, c-format msgid "MRSET %zu Label" msgstr "Etiqueta MRSET %zu" #: src/data/sys-file-reader.c:725 #, c-format msgid "MRSET %zu Counted Value" msgstr "Valor conta MRSET %zu" #: src/data/sys-file-reader.c:763 #, c-format msgid "" "This system file does not indicate its own character encoding. Using " "default encoding %s. For best results, specify an encoding explicitly. Use " "SYSFILE INFO with ENCODING=\"DETECT\" to analyze the possible encodings." msgstr "" "Este ficheiro de sistema non indica a súa propia codificación de caracteres. " "Utilízase a codificación predeterminada %s. Para obter os mellores " "resultados, especifique a codificación explicitamente. Utilice SYSFILE INFO " "con ENCODING=«DETECT» para analizar as codificacións dispoñíbeis." #: src/data/sys-file-reader.c:845 #, c-format msgid "File header claims %d variable positions but %zu were read from file." msgstr "" "A cabeceira do ficheiro declara %d posicións da variábel pero %zu " "obtivéronse dun ficheiro." #: src/data/sys-file-reader.c:958 src/data/sys-file-reader.c:972 msgid "This is not an SPSS system file." msgstr "Este non é un ficheiro do sistema SPSS." #: src/data/sys-file-reader.c:1027 msgid "" "Compression bias is not the usual value of 100, or system file uses " "unrecognized floating-point format." msgstr "" "A marxe de erro na compresión non ten o valor habitual de 100, ou o ficheiro " "de sistema utiliza un formato de punto flotante non recoñecido." #: src/data/sys-file-reader.c:1102 msgid "Variable label indicator field is not 0 or 1." msgstr "O campo do indicador da etiqueta de variábel non é 0 nin 1." #: src/data/sys-file-reader.c:1115 msgid "Numeric missing value indicator field is not -3, -2, 0, 1, 2, or 3." msgstr "" "O campo do indicador do valor numérico faltante non é -3, -2, 0, 1, 2, nin 3." #: src/data/sys-file-reader.c:1125 msgid "String missing value indicator field is not 0, 1, 2, or 3." msgstr "O campo do indicador do valor da cadea faltante non é 0, 1, 2, nin 3." #: src/data/sys-file-reader.c:1152 #, c-format msgid "Invalid number of labels %u." msgstr "Número de etiquetas incorrecto %u." #: src/data/sys-file-reader.c:1185 msgid "" "Variable index record (type 4) does not immediately follow value label " "record (type 3) as it should." msgstr "" "O rexistro (tipo 4) do índice da variábel non segue o rexistro (tipo 3) do " "valor da etiqueta como debería." #: src/data/sys-file-reader.c:1197 #, c-format msgid "" "Number of variables associated with a value label (%u) is not between 1 and " "the number of variables (%zu)." msgstr "" "O número de variábeis asociado co valor da etiqueta (%u) non está entre 1 e " "o número de variábeis (%zu)." #: src/data/sys-file-reader.c:1224 #, c-format msgid "Number of document lines (%d) must be greater than 0 and less than %d." msgstr "O número de liñas de documento (%d) debe ser maior ca 0 e menor ca %d." #: src/data/sys-file-reader.c:1317 #, c-format msgid "Record type 7, subtype %d has bad size %u (expected %d)." msgstr "" "O rexistro de tipo 7, subtipo %d ten un tamaño inadecuado %u (agardábase %d)." #: src/data/sys-file-reader.c:1321 #, c-format msgid "Record type 7, subtype %d has bad count %u (expected %d)." msgstr "" "O rexistro de tipo 7, subtipo %d ten unha conta inadecuada %u (agardábase " "%d)." #: src/data/sys-file-reader.c:1435 #, fuzzy, c-format #| msgid "Renaming variable with duplicate name `%s' to `%s'." msgid "Renaming variable with invalid name `%s' to `%s'." msgstr "Renomeando a variábel con nome duplicado de «%s» a «%s»." #: src/data/sys-file-reader.c:1517 msgid "Missing string continuation record." msgstr "Falta o rexistro de continuación da cadea." #: src/data/sys-file-reader.c:1550 #, c-format msgid "Variable %s with width %d has invalid print format 0x%x." msgstr "" "A variábel %s coa largura %d ten un formato de impresión incorrecto 0x%x." #: src/data/sys-file-reader.c:1554 #, c-format msgid "Variable %s with width %d has invalid write format 0x%x." msgstr "" "A variábel %s coa largura %d ten un formato de escritura incorrecto 0x%x." #: src/data/sys-file-reader.c:1559 msgid "Suppressing further invalid format warnings." msgstr "Supresión de posteriores avisos sobre formato incorrecto." #: src/data/sys-file-reader.c:1613 #, c-format msgid "" "Floating-point representation indicated by system file (%d) differs from " "expected (%d)." msgstr "" "A representación do punto flotante indicado polo ficheiro de sistema (%d) " "difire da esperada (%d)." #: src/data/sys-file-reader.c:1629 #, c-format msgid "" "Integer format indicated by system file (%d) differs from expected (%d)." msgstr "" "O formato de enteiro indicado polo ficheiro de sistema (%d) difire da " "esperada (%d)." #: src/data/sys-file-reader.c:1647 src/data/sys-file-reader.c:1653 #, c-format msgid "File specifies unexpected value %g (%a) as %s, instead of %g (%a)." msgstr "" "O ficheiro especifica un valor inesperado %g (%a) como %s, en lugar de %g " "(%a)." #: src/data/sys-file-reader.c:1662 #, c-format msgid "" "File specifies unexpected value %g (%a) as %s, instead of %g (%a) or %g (%a)." msgstr "" "O ficheiro especifica un valor inesperado %g (%a) como %s, en lugar de %g " "(%a) ou %g (%a)." #: src/data/sys-file-reader.c:1714 src/data/sys-file-reader.c:1733 #, c-format msgid "Missing space following `%c' at offset %zu in MRSETS record." msgstr "" "Falta o espazo despois de «%c» no desprazamento de %zu dentro do rexistro " "MRSETS." #: src/data/sys-file-reader.c:1741 #, fuzzy, c-format #| msgid "" #| "Unexpected label source value following `E' at offset %zu in MRSETS " #| "record." msgid "" "Missing label source value following `E' at offset %zu in MRSETS record." msgstr "" "Valor inesperado da etiqueta de orixe despois de «E» no desprazamento de %zu " "dentro do rexistro MRSETS." #: src/data/sys-file-reader.c:1748 #, c-format msgid "" "Unexpected label source value following `E' at offset %zu in MRSETS record." msgstr "" "Valor inesperado da etiqueta de orixe despois de «E» no desprazamento de %zu " "dentro do rexistro MRSETS." #: src/data/sys-file-reader.c:1755 #, c-format msgid "Missing `C', `D', or `E' at offset %zu in MRSETS record." msgstr "" "Falta «C», «D», ou «E» no desprazamento de %zu dentro do rexistro MRSETS." #: src/data/sys-file-reader.c:1782 #, c-format msgid "Missing new-line parsing variable names at offset %zu in MRSETS record." msgstr "" "Falta os nomes na nova liña ao procesar a variábel no desprazamento %zu " "dentro do rexistro MRSSETS." #: src/data/sys-file-reader.c:1817 #, fuzzy, c-format #| msgid "No multiple response set named %s." msgid "Invalid multiple response set name `%s'." msgstr "Ningún conxunto de respostas múltiplas nomeado %s." #: src/data/sys-file-reader.c:1850 #, c-format msgid "MRSET %s contains duplicate variable name %s." msgstr "MRSET %s contén un nome de variábel duplicada %s." #: src/data/sys-file-reader.c:1865 #, c-format msgid "MRSET %s contains both string and numeric variables." msgstr "MRSET %s contén variábeis tanto de cadea como numéricas." #: src/data/sys-file-reader.c:1877 #, c-format msgid "MRSET %s has no variables." msgstr "MRSET %s non ten variábeis." #: src/data/sys-file-reader.c:1879 #, c-format msgid "MRSET %s has only one variable." msgstr "MRSET %s ten soamente unha variábel." #: src/data/sys-file-reader.c:1923 #, c-format msgid "Extension 11 has bad count %u (for %zu variables)." msgstr "A extensión 11 ten unha conta inadecuada %u (para as variábeis %zu)." #: src/data/sys-file-reader.c:1956 #, c-format msgid "" "Invalid variable display parameters for variable %zu (%s). Default " "parameters substituted." msgstr "" "Parámetros de presentación da variábel incorrectos para a variábel %zu (%s). " "Substituídos os parámetros predeterminados." #: src/data/sys-file-reader.c:2000 #, c-format msgid "Duplicate long variable name `%s'." msgstr "Duplicar o nome longo da variábel «%s»." #: src/data/sys-file-reader.c:2053 #, c-format msgid "Long variable mapping from %s to invalid variable name `%s'." msgstr "" "Identificación de variábel longa desde %s ata o nome incorrecto da variábel " "«%s»." #: src/data/sys-file-reader.c:2088 #, c-format msgid "%s listed as string of invalid length %s in very long string record." msgstr "" "%s listada como cadea con largura incorrecta %s nun rexistro de cadea moi " "longo." #: src/data/sys-file-reader.c:2099 #, c-format msgid "" "%s listed in very long string record with width %s, which requires only one " "segment." msgstr "" "%s listada nun rexistro de cadea moi longo con %s, o que require soamente un " "segmento." #: src/data/sys-file-reader.c:2107 #, c-format msgid "Very long string %s overflows dictionary." msgstr "A moi longa cadea %s desborda o dicionario." #: src/data/sys-file-reader.c:2125 #, c-format msgid "" "Very long string with width %ld has segment %d of width %d (expected %d)." msgstr "" "A moi longa cadea cunha largura %ld ten un segmento %d con largura %d " "(agardábase %d)." #: src/data/sys-file-reader.c:2183 #, fuzzy, c-format #| msgid "Variable index %d not in valid range 1...%zu." msgid "Value label variable index %d not in valid range 1...%zu." msgstr "O índice %d da variábel non está no rango válido 1... %zu." #: src/data/sys-file-reader.c:2193 #, fuzzy, c-format #| msgid "Variable index %d refers to long string continuation." msgid "Value label variable index %d refers to long string continuation." msgstr "O índice da variábel %d refírese á continuación da cadea longa." #: src/data/sys-file-reader.c:2208 #, c-format msgid "" "Variables associated with value label are not all of identical type. " "Variable %s is %s, but variable %s is %s." msgstr "" "As variábeis asociadas co valor da etiqueta non son todas do mesmo tipo. A " "variábel %s é %s pero a variábel %s é %s." #: src/data/sys-file-reader.c:2226 #, c-format msgid "" "Value labels may not be added to long string variables (e.g. %s) using " "records types 3 and 4." msgstr "" "As etiquetas de valor non poden ser engadidas a variábeis de cadea longa (i." "e. %s) utilizando os tipos de rexistro 3 e 4." #: src/data/sys-file-reader.c:2255 #, c-format msgid "Duplicate value label for %g on %s." msgstr "Etiqueta de valor duplicada para %g en %s." #: src/data/sys-file-reader.c:2260 src/data/sys-file-reader.c:2600 #, c-format msgid "Duplicate value label for `%.*s' on %s." msgstr "Etiqueta de valor duplicada para «%.*s» en %s." #: src/data/sys-file-reader.c:2283 #, fuzzy, c-format #| msgid "Suppressed %d additional related warnings." msgid "Suppressed %d additional warnings for value labels." msgstr "Suprimidos %d avisos adicionais relacionados." #: src/data/sys-file-reader.c:2297 #, fuzzy, c-format #| msgid "Variable index %d not in valid range 1...%zu." msgid "" "Weight variable index %d not in valid range 1...%zu. Treating file as " "unweighted." msgstr "O índice %d da variábel non está no rango válido 1... %zu." #: src/data/sys-file-reader.c:2307 #, fuzzy, c-format #| msgid "Variable index %d refers to long string continuation." msgid "" "Weight variable index %d refers to long string continuation. Treating file " "as unweighted." msgstr "O índice da variábel %d refírese á continuación da cadea longa." #: src/data/sys-file-reader.c:2315 #, c-format msgid "Ignoring string variable `%s' set as weighting variable." msgstr "" "Ignorar a variábel de cadea «%s» estabelecida como variábel de ponderación." #: src/data/sys-file-reader.c:2352 #, c-format msgid "Error parsing attribute value %s[%d]." msgstr "Produciuse un erro ao procesar o valor de atributo %s[%d]." #: src/data/sys-file-reader.c:2366 #, c-format msgid "Attribute value %s[%d] is not quoted: %s." msgstr "O valor de atributo %s[%d] non está entecomiñado: %s." #: src/data/sys-file-reader.c:2379 #, fuzzy, c-format #| msgid "Duplicate variable name %s." msgid "Duplicate attribute %s." msgstr "Nome duplicado da variábel %s." #: src/data/sys-file-reader.c:2463 #, c-format msgid "Invalid role for variable %s." msgstr "Rol de variábel %s incorrecto." #: src/data/sys-file-reader.c:2472 #, c-format msgid "%zu other variables had invalid roles." msgstr "%zu outras variábeis tiñan roles incorrectos." #: src/data/sys-file-reader.c:2485 #, c-format msgid "Extension record subtype %d ends unexpectedly." msgstr "O subtipo de rexistro da extensión %d finaliza inesperadamente." #: src/data/sys-file-reader.c:2531 #, c-format msgid "Ignoring long string value label record for unknown variable %s." msgstr "" "Ignorando o rexistro do valor da cadea longa para a variábel %s descoñecida." #: src/data/sys-file-reader.c:2536 #, c-format msgid "Ignoring long string value label record for numeric variable %s." msgstr "" "Ignorando o rexistro do valor da cadea longa para a variábel numérica %s." #: src/data/sys-file-reader.c:2543 #, c-format msgid "" "Ignoring long string value label record for variable %s because the record's " "width (%d) does not match the variable's width (%d)." msgstr "" "Ignorando o rexistro da etiqueta do valor da cadea longa para a variábel %s " "debido a que a largura (%d) do rexistro non coincide coa variábel de largura " "(%d)." #: src/data/sys-file-reader.c:2573 #, c-format msgid "" "Ignoring long string value label %zu for variable %s, with width %d, that " "has bad value width %zu." msgstr "" "Ignorando a etiqueta %zu do valor da cadea longa para a variábel %s, con " "largura %d, que ten un inadecuado valor de largura %zu." #: src/data/sys-file-reader.c:2646 #, c-format msgid "" "Long string missing values record says variable %s has %d missing values, " "but only 1 to 3 missing values are allowed." msgstr "" "O rexistro da cadea longa na que faltan valores di que a variábel %s carece " "de %d valores pero só se permite 1 de 3 valores que faltan." #: src/data/sys-file-reader.c:2656 #, c-format msgid "Ignoring long string missing value record for unknown variable %s." msgstr "" "Ignorando o rexistro do valor que falta da cadea longa para a variábel " "descoñecida %s." #: src/data/sys-file-reader.c:2661 #, c-format msgid "Ignoring long string missing value record for numeric variable %s." msgstr "" "Ignorando o rexistro do valor que falta da cadea longa para a variábel " "numérica %s." #: src/data/sys-file-reader.c:2686 #, c-format msgid "" "Ignoring long string missing value %zu for variable %s, with width %d, that " "has bad value width %zu." msgstr "" "Ignorando o valor %zu faltante da cadea longa para a variábel %s, con " "largura %d, que ten un inadecuado valor de largura %zu." #: src/data/sys-file-reader.c:2740 msgid "File ends in partial string value." msgstr "O ficheiro finaliza nun valor de cadea parcial." #: src/data/sys-file-reader.c:2879 msgid "" "Possible compressed data corruption: compressed spaces appear in numeric " "field." msgstr "" "Existe a posibilidade de que os datos comprimidos estean corruptos: aparecen " "espazos comprimidos no campo numérico." #: src/data/sys-file-reader.c:3030 #, c-format msgid "Suppressed %d additional related warnings." msgstr "Suprimidos %d avisos adicionais relacionados." #: src/data/sys-file-reader.c:3076 src/data/sys-file-reader.c:3093 #, c-format msgid "Dictionary record refers to unknown variable %s." msgstr "O rexistro do dicionario refírese á variábel descoñecida %s." #: src/data/sys-file-reader.c:3159 #, c-format msgid "Expecting digit at offset %zu in MRSETS record." msgstr "Agardando díxito no desprazamento de %zu dentro do rexistro MRSETS." #: src/data/sys-file-reader.c:3167 #, c-format msgid "Expecting space at offset %zu in MRSETS record." msgstr "Agardando espazo no desprazamento de %zu dentro do rexistro MRSETS." #: src/data/sys-file-reader.c:3175 #, c-format msgid "%zu-byte string starting at offset %zu exceeds record length %zu." msgstr "" "A cadea %zu-byte que comeza no desprazamento %zu excede a largura do " "rexistro %zu." #: src/data/sys-file-reader.c:3185 #, c-format msgid "Expecting space at offset %zu following %zu-byte string." msgstr "Agardando espazo no desprazamento de %zu despois da cadea do byte %zu." #: src/data/sys-file-reader.c:3476 #, c-format msgid "Wrong ZLIB data header offset %#llx (expected %#llx)." msgstr "" "Cabeceira de datos incorrecta no desprazamento %#llx (agardábase %#llx)." #: src/data/sys-file-reader.c:3484 #, c-format msgid "Impossible ZLIB trailer offset 0x%llx." msgstr "Cola ZLIB imposíbel no desprazamento 0x%llx." #: src/data/sys-file-reader.c:3491 #, c-format msgid "Invalid ZLIB trailer length %lld." msgstr "Lonxitude incorrecta de cola ZLIB %lld." #: src/data/sys-file-reader.c:3555 #, c-format msgid "End of ZLIB trailer (0x%llx) is not file size (0x%llx)." msgstr "O remate da cola ZLIB (0x%llx) non é o tamaño do ficheiro (0x%llx)." #: src/data/sys-file-reader.c:3565 #, c-format msgid "ZLIB trailer bias (%lld) differs from file header bias (%.2f)." msgstr "" "A tendencia da cola ZLIB (%lld) difire da tendencia da cabeceira do ficheiro " "(%.2f)." #: src/data/sys-file-reader.c:3575 #, c-format msgid "ZLIB trailer \"zero\" field has nonzero value %lld." msgstr "O campo «cero» da cola ZLIB ten o valor non cero %lld." #: src/data/sys-file-reader.c:3581 #, c-format msgid "ZLIB trailer specifies unexpected %u-byte block size." msgstr "A cola ZLIB especifica un inesperado tamaño de bloque de byte %u." #: src/data/sys-file-reader.c:3589 #, c-format msgid "%lld-byte ZLIB trailer specifies %u data blocks (expected %lld)." msgstr "" "A cola ZLIB %lld-byte especifica %u bloques de datos (agardábase %lld)." #: src/data/sys-file-reader.c:3614 #, c-format msgid "" "ZLIB block descriptor %u reported uncompressed data offset %#llx, when %#llx " "was expected." msgstr "" "O descritor do bloque ZLIB %u informa dun desprazamento de datos %#llx " "descomprimido, cando se agardaba %#llx." #: src/data/sys-file-reader.c:3623 #, c-format msgid "" "ZLIB block descriptor %u reported compressed data offset %#llx, when %#llx " "was expected." msgstr "" "O descritor do bloque ZLIB %u informa dun desprazamento de datos %#llx " "comprimido, cando se agardaba %#llx." #: src/data/sys-file-reader.c:3633 #, c-format msgid "" "ZLIB block descriptor %u reported block size %#x, when %#x was expected." msgstr "" "O descritor do bloque ZLIB %u informa dun tamaño de bloque de %#x, cando se " "agardaba de %#x." #: src/data/sys-file-reader.c:3641 #, c-format msgid "" "ZLIB block descriptor %u reported block size %#x, when at most %#x was " "expected." msgstr "" "O descritor do bloque ZLIB %u informa dun tamaño de bloque de %#x, cando se " "agardaba cando menos de %#x." #: src/data/sys-file-reader.c:3653 #, c-format msgid "" "ZLIB block descriptor %u reports compressed size %u and uncompressed size %u." msgstr "" "O descritor de bloque %u informa dun tamaño comprimido de %u e un tamaño " "descomprimido de %u." #: src/data/sys-file-reader.c:3665 #, c-format msgid "" "ZLIB trailer is at offset %#llx but %#llx would be expected from block " "descriptors." msgstr "" "A cola ZLIB está no desprazamento %#llx pero en %#llx esperariamos os " "descritores do bloque." #: src/data/sys-file-reader.c:3684 #, c-format msgid "ZLIB initialization failed (%s)." msgstr "Produciuse un fallo (%s) na inicialización de ZLIB." #: src/data/sys-file-reader.c:3699 #, c-format msgid "Inconsistency at end of ZLIB stream (%s)." msgstr "Inconsistencia no remate do fluxo (%s) de ZLIB." #: src/data/sys-file-reader.c:3758 #, c-format msgid "ZLIB stream inconsistency (%s)." msgstr "Inconsistencia (%s) no fluxo de ZLIB." #: src/data/sys-file-reader.c:3782 msgid "Unexpected end of ZLIB compressed data." msgstr "Agardábase o remate dos datos comprimidos de ZLIB." #: src/data/sys-file-reader.c:3820 #, fuzzy #| msgid "System File" msgid "SPSS System File" msgstr "Ficheiro de sistema" #: src/data/sys-file-writer.c:210 #, c-format msgid "Unknown system file version %d. Treating as version %d." msgstr "" "Versión %d descoñecida do ficheiro de sistema. Trátase como de versión %d." #: src/data/sys-file-writer.c:256 #, c-format msgid "Error opening `%s' for writing as a system file: %s." msgstr "" "Produciuse un erro ao abrir «%s» para escribir nel como ficheiro de sistema: " "%s." #: src/data/sys-file-writer.c:1271 #, c-format msgid "An I/O error occurred writing system file `%s'." msgstr "Produciuse un erro E/S ao escribir o ficheiro de sistema «%s»." #: src/data/sys-file-writer.c:1378 #, c-format msgid "Failed to initialize ZLIB for compression (%s)." msgstr "Produciuse un fallo ao inicializar ZLIB para compresión (%s)." #: src/data/sys-file-writer.c:1407 #, c-format msgid "Failed to complete ZLIB stream compression (%s)." msgstr "Produciuse un fallo ao completar a compresión (%s) do fluxo ZLIB." #: src/data/sys-file-writer.c:1449 #, c-format msgid "ZLIB stream compression failed (%s)." msgstr "Fallou a compresión (%s) do fluxo ZLIB." #: src/data/sys-file-writer.c:1491 #, c-format msgid "%s: Seek failed (%s)." msgstr "%s: Fallou a procura (%s)." #: src/data/variable.c:58 msgid "Left" msgstr "Esquerda" #: src/data/variable.c:59 msgid "Right" msgstr "Dereita" #: src/data/variable.c:60 msgid "Center" msgstr "Centro" #: src/data/variable.c:66 msgid "Nominal" msgstr "Nominal" #: src/data/variable.c:67 msgid "Ordinal" msgstr "Ordinal" #: src/data/variable.c:68 src/language/stats/ks-one-sample.c:300 msgid "Scale" msgstr "Escala" #: src/data/variable.c:74 msgid "Input" msgstr "Entrada" #. TRANSLATORS: This will be part of a filename. Please avoid whitespace. #: src/data/variable.c:75 src/output/spv/spv-writer.c:213 #: src/ui/gui/psppire-output-window.c:547 msgid "Output" msgstr "Saída" #: src/data/variable.c:76 msgid "Both" msgstr "Ambas" #: src/data/variable.c:77 src/language/dictionary/sys-file-info.c:237 #: src/ui/gui/psppire-dialog-action-crosstabs.c:86 #: src/ui/gui/psppire-dialog-action-crosstabs.c:98 #: src/ui/gui/psppire-dialog-action-crosstabs.c:133 #: src/ui/gui/psppire-dialog-action-crosstabs.c:141 #: src/ui/gui/psppire-variable-sheet.c:408 src/ui/gui/var-display.c:34 msgid "None" msgstr "Ningunha" #: src/data/variable.c:78 msgid "Partition" msgstr "Partición" #: src/data/variable.c:79 src/ui/gui/reliability.ui:37 msgid "Split" msgstr "División" #: src/data/variable.c:729 #, c-format msgid "%s (%s)" msgstr "%s (%s)" #: src/data/variable.c:1339 msgid "" "At least one case in the data file had a weight value that was user-missing, " "system-missing, zero, or negative. These case(s) were ignored." msgstr "" "Cando menos un caso no ficheiro de datos tiña un valor de ponderación de " "usuario perdido, de sistema perdido, cero ou negativo. Eses caso(s) " "ignoráronse." #: src/language/command.c:207 src/language/stats/graph.c:749 #: src/language/stats/graph.c:755 src/language/stats/graph.c:789 #: src/language/stats/graph.c:794 src/language/stats/graph.c:799 #: src/language/stats/graph.c:852 src/language/stats/graph.c:857 #: src/language/stats/graph.c:862 src/language/stats/graph.c:867 #: src/language/stats/graph.c:872 src/language/stats/graph.c:877 #: src/language/stats/graph.c:882 src/language/utilities/set.q:236 #, c-format msgid "%s is not yet implemented." msgstr "Aínda non está implementado %s." #: src/language/command.c:212 #, c-format msgid "%s may be used only in testing mode." msgstr "%s soamente pode utilizarse no modo de proba." #: src/language/command.c:217 #, c-format msgid "%s may be used only in enhanced syntax mode." msgstr "%s soamente pode utilizarse no modo sintaxe ampliada." #: src/language/command.c:345 msgid "expecting command name" msgstr "agardábase o nome de orde" #: src/language/command.c:347 #, c-format msgid "Unknown command `%s'." msgstr "A orde «%s» resulta descoñecida." #: src/language/command.c:380 #, c-format msgid "%s is allowed only before the active dataset has been defined." msgstr "Permítese %s soamente antes de definir o conxunto de datos activo." #: src/language/command.c:384 #, c-format msgid "%s is allowed only after the active dataset has been defined." msgstr "Permítese %s soamente despois de definir o conxunto de datos activo." #: src/language/command.c:388 src/language/command.c:392 #, c-format msgid "%s is allowed only inside %s." msgstr "Permítese %s soamente dentro de %s." #: src/language/command.c:399 src/language/command.c:403 #, c-format msgid "" "%s is allowed only before the active dataset has been defined or inside %s." msgstr "" "Permítese %s soamente antes de definir o conxunto de datos activo ou estea " "dentro de %s." #: src/language/command.c:407 src/language/command.c:411 #, c-format msgid "" "%s is allowed only after the active dataset has been defined or inside %s." msgstr "" "Permítese %s soamente despois de definir o conxunto de datos activo ou estea " "dentro de %s." #: src/language/command.c:415 #, c-format msgid "%s is allowed only inside %s or inside %s." msgstr "Permítese %s soamente dentro de %s ou dentro de %s." #: src/language/command.c:421 #, c-format msgid "" "%s is allowed only after the active dataset has been defined, inside INPUT " "PROGRAM, or inside FILE TYPE." msgstr "" "Permítese %s soamente despois de definir o conxunto de datos activo, dentro " "de IMPUT PROGRAM, ou dentro de FILE TYPE." #: src/language/command.c:426 #, c-format msgid "" "%s is allowed only before the active dataset has been defined, inside INPUT " "PROGRAM, or inside FILE TYPE." msgstr "" "Permítese %s soamente antes de definir o conxunto de datos activo, dentro de " "IMPUT PROGRAM, ou dentro de FILE TYPE." #: src/language/command.c:444 src/language/command.c:447 #, c-format msgid "%s is not allowed inside %s." msgstr "Non se permite %s dentro de %s." #: src/language/command.c:529 src/language/utilities/host.c:272 #: src/language/utilities/permissions.c:105 #, c-format msgid "This command not allowed when the %s option is set." msgstr "Esta orde non está permitida cando se estabelece a opción %s." #: src/language/command.c:545 #, c-format msgid "Error removing `%s': %s." msgstr "Produciuse un erro ao retirar «%s»: %s." #: src/language/lexer/lexer.c:296 #, c-format msgid "expecting %s" msgstr "agardábase %s" #: src/language/lexer/lexer.c:300 #, c-format msgid "expecting %s or %s" msgstr "agardábase %s ou %s" #: src/language/lexer/lexer.c:304 #, c-format msgid "expecting %s, %s, or %s" msgstr "agardábase %s, %s ou %s" #: src/language/lexer/lexer.c:309 #, c-format msgid "expecting %s, %s, %s, or %s" msgstr "agardábase %s, %s, %s ou %s" #: src/language/lexer/lexer.c:314 #, c-format msgid "expecting %s, %s, %s, %s, or %s" msgstr "agardábase %s, %s, %s, %s ou %s" #: src/language/lexer/lexer.c:319 #, c-format msgid "expecting %s, %s, %s, %s, %s, or %s" msgstr "agardábase %s, %s, %s, %s, %s ou %s" #: src/language/lexer/lexer.c:325 #, c-format msgid "expecting %s, %s, %s, %s, %s, %s, or %s" msgstr "agardábase %s, %s, %s, %s, %s, %s ou %s" #: src/language/lexer/lexer.c:331 #, c-format msgid "expecting %s, %s, %s, %s, %s, %s, %s, or %s" msgstr "agardábase %s, %s, %s, %s, %s, %s, %s ou %s" #: src/language/lexer/lexer.c:351 #, c-format msgid "Subcommand %s may only be specified once." msgstr "A suborde %s soamente pode especificarse unha vez." #: src/language/lexer/lexer.c:363 #, c-format msgid "Required subcommand %s was not specified." msgstr "A suborde %s non se especificou." #: src/language/lexer/lexer.c:371 #, c-format msgid "%s may only be specified once within subcommand %s" msgstr "%s soamente pode especificarse unha vez dentro da suborde %s" #: src/language/lexer/lexer.c:380 #, c-format msgid "Required %s specification missing from %s subcommand" msgstr "A especificación requirida %s falta da suborde %s" #: src/language/lexer/lexer.c:399 msgid "Syntax error at end of input" msgstr "Erro de sintaxe no remate da entrada" #: src/language/lexer/lexer.c:420 src/language/xforms/select-if.c:60 #: src/language/stats/autorecode.c:206 src/language/stats/npar.c:503 #: src/language/data-io/print-space.c:83 msgid "expecting end of command" msgstr "agardando o remate da orde" #: src/language/lexer/lexer.c:631 msgid "expecting string" msgstr "agardando unha cadea" #: src/language/lexer/lexer.c:660 msgid "expecting integer" msgstr "agardando un enteiro" #: src/language/lexer/lexer.c:673 msgid "expecting number" msgstr "agardando un número" #: src/language/lexer/lexer.c:685 msgid "expecting identifier" msgstr "agardando un identificador" #: src/language/lexer/lexer.c:1272 msgid "Syntax error at end of command" msgstr "Erro de sintaxe no remate da orde" #: src/language/lexer/lexer.c:1281 #, c-format msgid "Syntax error at `%s'" msgstr "Erro de sintaxe en «%s»" #: src/language/lexer/lexer.c:1284 msgid "Syntax error" msgstr "Erro de sintaxe" #: src/language/lexer/lexer.c:1470 #, c-format msgid "String of hex digits has %d characters, which is not a multiple of 2" msgstr "" "A cadea de díxitos hexadecimais ten %d caracteres, que non é múltiplo de 2" #: src/language/lexer/lexer.c:1477 #, c-format msgid "`%c' is not a valid hex digit" msgstr "«%c» non é un díxito hexadecimal válido" #: src/language/lexer/lexer.c:1482 #, c-format msgid "" "Unicode string contains %d bytes, which is not in the valid range of 1 to 8 " "bytes" msgstr "" "A cadea unicode contén %d bytes, que non é o rango válido de 1 a 8 bytes" #: src/language/lexer/lexer.c:1488 #, c-format msgid "U+%04X is not a valid Unicode code point" msgstr "U+%04X non é un punto de código Unicode válido" #: src/language/lexer/lexer.c:1493 msgid "Unterminated string constant" msgstr "Constante de cadea sen terminar" #: src/language/lexer/lexer.c:1497 #, c-format msgid "Missing exponent following `%s'" msgstr "Falta o expoñente despois de «%s»" #: src/language/lexer/lexer.c:1502 msgid "Unexpected `.' in middle of command" msgstr "Un inesperado «.» no medio da orde" #: src/language/lexer/lexer.c:1508 #, c-format msgid "Bad character %s in input" msgstr "Un carácter inapropiado %s na entrada" #: src/language/lexer/lexer.c:1603 #, c-format msgid "Opening `%s': %s." msgstr "Abrindo «%s» : %s." #: src/language/lexer/lexer.c:1647 #, c-format msgid "Error closing `%s': %s." msgstr "Produciuse un erro ao pechar «%s»: %s." #: src/language/lexer/subcommand-list.c:118 #, c-format msgid "No more than %d %s subcommands allowed." msgstr "Non se permiten máis de %d %s subordes." #: src/language/lexer/format-parser.c:77 msgid "expecting valid format specifier" msgstr "agárdase un especificador de formato válido" #: src/language/lexer/format-parser.c:116 #: src/language/lexer/format-parser.c:143 src/language/utilities/output.c:108 #: src/language/data-io/data-list.c:453 src/language/data-io/get-data.c:638 #: src/language/data-io/placement-parser.c:236 #, c-format msgid "Unknown format type `%s'." msgstr "O tipo de formato «%s» resulta descoñecido." #: src/language/lexer/format-parser.c:122 #, c-format msgid "Format specifier `%s' lacks required width." msgstr "O especificador de formato «%s» carece da largura requirida." #: src/language/lexer/format-parser.c:138 msgid "expecting format type" msgstr "Agárdase o tipo de formato" #: src/language/lexer/value-parser.c:66 #, c-format msgid "" "The high end of the range (%.*g) is below the low end (%.*g). The range " "will be treated as if reversed." msgstr "" "O remate por alto do rango (%.*g) e inferior ao remate por baixo (%.*g). O " "rango tratarase como se estiver invertido." #: src/language/lexer/value-parser.c:74 #, c-format msgid "Ends of range are equal (%.*g)." msgstr "Os remates do rango son iguais (%.*g)." #: src/language/lexer/value-parser.c:82 #, c-format msgid "%s or %s must be part of a range." msgstr "%s ou %s deben ser parte dun rango." #: src/language/lexer/value-parser.c:112 msgid "System-missing value is not valid here." msgstr "Non é válido aquí o valor sistema faltante." #: src/language/lexer/variable-parser.c:86 utilities/pspp-convert.c:83 msgid "expecting variable name" msgstr "agárdase un nome de variábel" #: src/language/lexer/variable-parser.c:96 #, c-format msgid "%s is not a variable name." msgstr "%s non é un nome de variábel." #: src/language/lexer/variable-parser.c:206 #, c-format msgid "" "%s is not a numeric variable. It will not be included in the variable list." msgstr "" "%s non é unha variábel numérica. Non se incluirá na lista de variábeis." #: src/language/lexer/variable-parser.c:209 #, c-format msgid "" "%s is not a string variable. It will not be included in the variable list." msgstr "" "%s non é unha variábel de cadea. Non se incluirá na lista de variábeis." #: src/language/lexer/variable-parser.c:213 #, c-format msgid "Scratch variables (such as %s) are not allowed here." msgstr "Non se admiten aquí variábeis temporais scratch (tales como %s)." #: src/language/lexer/variable-parser.c:217 #, c-format msgid "" "%s and %s are not the same type. All variables in this variable list must " "be of the same type. %s will be omitted from the list." msgstr "" "%s e %s non son o mesmo tipo. Todas as variábeis nesta lista de variábeis " "deben deben ser do mesmo tipo. %s omitirase na lista." #: src/language/lexer/variable-parser.c:223 #, c-format msgid "" "%s and %s are string variables with different widths. All variables in this " "variable list must have the same width. %s will be omitted from the list." msgstr "" "%s e %s son variábeis de cadea co diferentes larguras. Todas as variábeis " "nesta lista de variábeis deben deben ser do mesmo tipo. %s omitirase na " "lista." #: src/language/lexer/variable-parser.c:228 #: src/language/lexer/variable-parser.c:447 #, c-format msgid "Variable %s appears twice in variable list." msgstr "A variábel %s aparece dúas veces na lista de variábeis." #: src/language/lexer/variable-parser.c:341 #, c-format msgid "%s TO %s is not valid syntax since %s precedes %s in the dictionary." msgstr "" "%s TO %s non é unha sintaxe correcta porque %s precede %s no dicionario." #: src/language/lexer/variable-parser.c:349 #, c-format msgid "" "When using the TO keyword to specify several variables, both variables must " "be from the same variable dictionaries, of either ordinary, scratch, or " "system variables. %s is a %s variable, whereas %s is %s." msgstr "" "Ao utilizar a palabra clave TO para especificar varias variábeis, ambas " "deben provir dos mesmos dicionarios de variábeis, ben das ordinarias, " "temporais -scratch- ou ben variábeis de sistema. %s é un unha variábel %s, " "mentres que %s é %s." #: src/language/lexer/variable-parser.c:424 #, c-format msgid "`%s' cannot be used with TO because it does not end in a digit." msgstr "«%s» non se pode utilizar con TO porque non remata nun díxito." #: src/language/lexer/variable-parser.c:432 #, c-format msgid "Numeric suffix on `%s' is larger than supported with TO." msgstr "O sufixo numérico en «%s» é maior ca o admitido con TO." #: src/language/lexer/variable-parser.c:505 msgid "Scratch variables not allowed here." msgstr "Non se permiten aquí as variábeis temporais scratch." #: src/language/lexer/variable-parser.c:529 msgid "Prefixes don't match in use of TO convention." msgstr "Os prefixos non coinciden na utilización da convención TO." #: src/language/lexer/variable-parser.c:534 msgid "Bad bounds in use of TO convention." msgstr "Límites inapropiados na utilización da convención TO." #: src/language/xforms/compute.c:150 src/language/xforms/compute.c:205 #, c-format msgid "" "When executing COMPUTE: SYSMIS is not a valid value as an index into vector " "%s." msgstr "" "Ao executar COMPUTE: SYSMIS non é un valor válido como índice dentro do " "vector %s." #: src/language/xforms/compute.c:154 src/language/xforms/compute.c:212 #, c-format msgid "" "When executing COMPUTE: %.*g is not a valid value as an index into vector %s." msgstr "" "Ao executar COMPUTE: %.*g non é un valor válido como índice dentro do vector " "%s." #: src/language/xforms/compute.c:356 #, c-format msgid "There is no vector named %s." msgstr "Non hai ningún vector chamado %s." #: src/language/xforms/count.c:125 msgid "Destination cannot be a string variable." msgstr "O destino non pode ser unha variábel de cadea." #: src/language/xforms/sample.c:76 msgid "The sampling factor must be between 0 and 1 exclusive." msgstr "O factor de mostraxe debe estar entre 0 e 1 exclusivamente." #: src/language/xforms/sample.c:96 #, c-format msgid "Cannot sample %d observations from a population of %d." msgstr "Non se pode mostrar %d observacións dunha poboación de %d." #: src/language/xforms/recode.c:261 msgid "" "Inconsistent target variable types. Target variables must be all numeric or " "all string." msgstr "" "Tipos de variábeis obxectivo inconsistentes. As variábeis obxectivo deben " "ser todas numéricas todas cadeas." #: src/language/xforms/recode.c:282 msgid "CONVERT requires string input values and numeric output values." msgstr "" "CONVERT require valores de cadea de entrada e valores numéricos de saída." #: src/language/xforms/recode.c:339 #, c-format msgid "%s is not allowed with string variables." msgstr "Non se admite %s con variábeis de cadea." #: src/language/xforms/recode.c:422 msgid "expecting output value" msgstr "agárdase valor de saída" #: src/language/xforms/recode.c:479 #, c-format msgid "" "%zu variable(s) cannot be recoded into %zu variable(s). Specify the same " "number of variables as source and target variables." msgstr "" "A(s) variábeis %zu non se poden recodificar en variábei(s) %zu. Especifique " "o mesmo número de variábeis como variábeis de orixe e de obxectivo." #: src/language/xforms/recode.c:494 #, c-format msgid "" "There is no variable named %s. (All string variables specified on INTO must " "already exist. Use the STRING command to create a string variable.)" msgstr "" "Non hai variábel chamada %s. (Todas as variábeis de cadea especificadas en " "INTO xa deben existir). Utilice a orde STRING para crear unha variábel de " "cadea)." #: src/language/xforms/recode.c:510 #, c-format msgid "INTO is required with %s input values and %s output values." msgstr "Requírese INTO con valores de entrada %s e valores de saída %s." #: src/language/xforms/recode.c:523 #, c-format msgid "Type mismatch. Cannot store %s data in %s variable %s." msgstr "O tipo non coincide. Non se pode almacenar %s datos en %s variábel %s." #: src/language/xforms/recode.c:566 #, c-format msgid "" "Cannot recode because the variable %s would require a width of %d bytes or " "greater, but it has a width of only %d bytes." msgstr "" "Non se pode recodificar porque a variábel %s podería requirir un largo de %d " "bytes ou maior pero ten un largo de %d bytes soamente." #: src/language/xforms/select-if.c:100 msgid "Syntax error expecting OFF or BY. Turning off case filtering." msgstr "" "Erro de sintaxe por agardarse OFF ou BY. Desactívase do filtrado de casos." #: src/language/xforms/select-if.c:115 msgid "The filter variable must be numeric." msgstr "A variábel de filtro debe ser numérica." #: src/language/xforms/select-if.c:121 msgid "The filter variable may not be scratch." msgstr "A variábel de filtro non pode ser unha scratch temporal." #: src/language/control/control-stack.c:49 #, c-format msgid "%s without %s." msgstr "%s sen %s." #: src/language/control/control-stack.c:77 #, c-format msgid "This command must appear inside %s...%s, without intermediate %s...%s." msgstr "Esta orde debe aparecer dentro de %s...%s, sen intermediar %s...%s." #: src/language/control/control-stack.c:94 #, c-format msgid "This command cannot appear outside %s...%s." msgstr "Esta orde non pode aparecer fóra de %s...%s." #: src/language/control/do-if.c:180 #, c-format msgid "This command may not follow %s in %s ... %s." msgstr "Esta orde non pode seguir a %s en %s ... %s." #: src/language/control/loop.c:211 msgid "Only one index clause may be specified." msgstr "Só se pode especificar cláusula de índice." #: src/language/control/repeat.c:120 #, c-format msgid "Dummy variable name `%s' hides dictionary variable `%s'." msgstr "O nome «%s» da variábel muda agocha a variábel de dicionario «%s»." #: src/language/control/repeat.c:126 #, c-format msgid "Dummy variable name `%s' is given twice." msgstr "O nome «%s» da variábel muda aparece dúas veces." #: src/language/control/repeat.c:170 #, c-format msgid "" "Dummy variable `%s' had %zu substitutions, so `%s' must also, but %zu were " "specified." msgstr "" "A variábel muda «%s» tivo %zu substitucións, de modo que «%s» tamén debería " "pero especificáronse %zu." #: src/language/control/repeat.c:379 msgid "Ranges may only have integer bounds." msgstr "Os rangos só poden ter límites enteiros." #: src/language/control/repeat.c:393 #, c-format msgid "%ld TO %ld is an invalid range." msgstr "%ld TO %ld é un rango incorrecto." #: src/language/control/repeat.c:443 #, c-format msgid "No matching %s." msgstr "Non coinciden con %s." #: src/language/control/temporary.c:44 msgid "" "This command may only appear once between procedures and procedure-like " "commands." msgstr "" "Esta orde só pode aparecer unha vez entre ordes de procedementos e casemente " "procedementos." #: src/language/dictionary/attributes.c:104 msgid "Attribute array index must be between 1 and 65535." msgstr "O índice da matriz de atributos debe estar entre 1 e 65535." #: src/language/dictionary/apply-dictionary.c:74 #, c-format msgid "Variable %s is %s in target file, but %s in source file." msgstr "A variábel %s está %s no ficheiro obxectivo pero %s no ficheiro orixe." #: src/language/dictionary/apply-dictionary.c:110 msgid "No matching variables found between the source and target files." msgstr "" "Non se atoparon variábeis coincidentes entre a orixe os ficheiros obxectivo." #: src/language/dictionary/delete-variables.c:40 #: src/language/dictionary/modify-variables.c:79 #: src/language/dictionary/rename-variables.c:51 #, c-format msgid "" "%s may not be used after %s. Temporary transformations will be made " "permanent." msgstr "" "%s non se pode utilizar tras %s. As transformación temporais faranse " "permanentes." #: src/language/dictionary/delete-variables.c:48 #: src/language/dictionary/modify-variables.c:312 #, c-format msgid "" "%s may not be used to delete all variables from the active dataset " "dictionary. Use %s instead." msgstr "" "%s non se pode utilizar para eliminar todas as variábeis do dicionario do " "conxunto de datos. Utilice %s no seu lugar." #: src/language/dictionary/missing-values.c:70 #, c-format msgid "" "Cannot mix numeric variables (e.g. %s) and string variables (e.g. %s) within " "a single list." msgstr "" "Non se poden mesturar variábeis numéricas (i.e. %s) e variábeis de cadea (i." "e. %s) dentro dunha única lista." #: src/language/dictionary/missing-values.c:91 msgid "" "Too many numeric missing values. At most three individual values or one " "value and one range are allowed." msgstr "" #: src/language/dictionary/missing-values.c:126 #, c-format msgid "Truncating missing value to maximum acceptable length (%d bytes)." msgstr "Truncando o valor faltante á largura máxima aceptábel (%d bytes)." #: src/language/dictionary/missing-values.c:137 msgid "" "Too many string missing values. At most three individual values are allowed." msgstr "" #: src/language/dictionary/missing-values.c:154 #, c-format msgid "Missing values provided are too long to assign to variable of width %d." msgstr "" "Os valores ausentes fornecidos son demasiado longos para asignarllos á " "variábel de largura %d." #: src/language/dictionary/modify-variables.c:145 msgid "Cannot specify ALL after specifying a set of variables." msgstr "" "Non se pode especificar ALL despois de especificar un conxunto de variábeis." #: src/language/dictionary/modify-variables.c:221 #: src/language/dictionary/rename-variables.c:76 #, c-format msgid "" "Differing number of variables in old name list (%zu) and in new name list " "(%zu)." msgstr "" "Número de variábeis diferente na lista de nomes antiga (%zu) e na nova lista " "de nomes (%zu)." #: src/language/dictionary/modify-variables.c:244 #: src/language/dictionary/modify-variables.c:294 #, c-format msgid "" "%s subcommand may be given at most once. It may not be given in conjunction " "with the %s subcommand." msgstr "" "A suborde %s pode darse cando moito unha vez. Non se pode dar xunto coa " "suborde %s." #: src/language/dictionary/modify-variables.c:331 #, c-format msgid "Unrecognized subcommand name `%s'." msgstr "Nome de suborde descoñecida «%s»." #: src/language/dictionary/modify-variables.c:334 msgid "Subcommand name expected." msgstr "Agardábase o nome da suborde." #: src/language/dictionary/mrsets.c:117 #, c-format msgid "" "VARIABLES specified only variable %s on %s, but at least two variables are " "required." msgstr "" "VARIABLES especificou soamente a variábel %s en %s pero requírense cando " "menos dúas variábeis." #: src/language/dictionary/mrsets.c:150 msgid "Numeric VALUE must be an integer." msgstr "O VALUE númerico debe ser un enteiro." #: src/language/dictionary/mrsets.c:230 src/language/dictionary/mrsets.c:268 #, c-format msgid "" "MDGROUP subcommand for group %s specifies a string VALUE, but the variables " "specified for this group are numeric." msgstr "" "A suborde MDGROUP do grupo %s especifica unha cadea VALUE pero as variábeis " "especificadas para este grupo son numéricas." #: src/language/dictionary/mrsets.c:254 #, c-format msgid "" "VALUE string on MDGROUP subcommand for group %s is %d bytes long, but it " "must be no longer than the narrowest variable in the group, which is %s with " "a width of %d bytes." msgstr "" "A cade VALUE na suborde MDGROUP do grupo %s ten %d bytes de longo pero non " "debe ter máis longo que a máis curta variábel do grupo, que é %s cunha " "largura de %d bytes." #: src/language/dictionary/mrsets.c:280 #, c-format msgid "" "MDGROUP subcommand for group %s specifies LABELSOURCE=VARLABEL but not " "CATEGORYLABELS=COUNTEDVALUES. Ignoring LABELSOURCE." msgstr "" "A suborde MDGROUP do grupo %s especifica LABELSOURCE=VARLABEL pero non " "CATEGORYLABELS=COUNTEDVALUES. Ignórase LABELSOURCE." #: src/language/dictionary/mrsets.c:286 #, c-format msgid "" "MDGROUP subcommand for group %s specifies both LABEL and LABELSOURCE, but " "only one of these subcommands may be used at a time. Ignoring LABELSOURCE." msgstr "" "A suborde MDGROUP do grupo %s especifica tanto LABEL e LABELSOURCE pero " "soamente unha desas subordes se pode utilizar de cada vez. Ignórase " "LABELSOURCE." #: src/language/dictionary/mrsets.c:326 #, c-format msgid "" "Variables %s and %s specified as part of multiple dichotomy group %s have " "the same variable label. Categories represented by these variables will not " "be distinguishable in output." msgstr "" "As variábeis %s e %s especificadas como parte do grupo de dicotomía múltipla " "%s teñen a mesma etiqueta de variábel. As categorías representadas por estas " "variábeis non se distinguirán na saída." #: src/language/dictionary/mrsets.c:356 #, c-format msgid "" "Variable %s specified as part of multiple dichotomy group %s (which has " "CATEGORYLABELS=COUNTEDVALUES) has no value label for its counted value. " "This category will not be distinguishable in output." msgstr "" "A variábel %s especificada como parte do grupo de dicotomía múltipla %s (que " "ten CATEGORYLABELS=COUNTEDVALUES) non ten a etiqueta de valor para o seu " "valor calculado. Esta categoría non se distinguirá na saída." #: src/language/dictionary/mrsets.c:369 #, c-format msgid "" "Variables %s and %s specified as part of multiple dichotomy group %s (which " "has CATEGORYLABELS=COUNTEDVALUES) have the same value label for the group's " "counted value. These categories will not be distinguishable in output." msgstr "" "As variábeis %s e %s especificadas como parte do grupo de dicotomía múltipla " "%s (que ten CATEGORYLABELS=COUNTEDVALUES) ten a mesma etiqueta de valor para " "o valor calculado do grupo. Estas categorías non se distinguirán na saída." #: src/language/dictionary/mrsets.c:426 #, c-format msgid "" "Variables specified on MCGROUP should have the same categories, but %s and " "%s (and possibly others) in multiple category group %s have different value " "labels for value %s." msgstr "" "As variábeis especificadas en MCGROUP deberían deberían ter as mesmas " "categorías pero %s e %s (posibelmente outras tamén) no grupo de categoría " "múltipla %s teñen diferentes etiquetas de valor para o valor %s)." #: src/language/dictionary/mrsets.c:484 #, c-format msgid "No multiple response set named %s." msgstr "Ningún conxunto de respostas múltiplas nomeado %s." #: src/language/dictionary/mrsets.c:533 msgid "" "The active dataset dictionary does not contain any multiple response sets." msgstr "" "O dicionario do conxunto de datos activo non contén ningún conxunto de " "respostas múltiplas." #: src/language/dictionary/mrsets.c:540 msgid "Multiple Response Sets" msgstr "Conxuntos de respostas múltiplas" #: src/language/dictionary/mrsets.c:543 #: src/language/dictionary/sys-file-info.c:446 #: src/language/dictionary/sys-file-info.c:733 #: src/language/stats/autorecode.c:375 src/language/data-io/data-parser.c:679 #: src/language/data-io/data-parser.c:725 src/language/data-io/print.c:434 #, fuzzy #| msgid "Attribute" msgid "Attributes" msgstr "Atributo" #: src/language/dictionary/mrsets.c:544 #: src/language/dictionary/sys-file-info.c:191 #: src/language/dictionary/sys-file-info.c:301 #: src/language/dictionary/sys-file-info.c:302 #: src/language/dictionary/sys-file-info.c:455 #: src/language/dictionary/sys-file-info.c:570 #: src/ui/gui/psppire-var-sheet-header.c:67 src/ui/gui/compute.ui:157 msgid "Label" msgstr "Etiqueta" #: src/language/dictionary/mrsets.c:544 #: src/language/dictionary/sys-file-info.c:241 #, fuzzy #| msgid "Encoding:" msgid "Encoding" msgstr "Codificación:" #: src/language/dictionary/mrsets.c:544 #, fuzzy #| msgid "Counted value" msgid "Counted Value" msgstr "Valor contado" #: src/language/dictionary/mrsets.c:544 #, fuzzy #| msgid "Cl_ear Variables" msgid "Member Variables" msgstr "Limp_ar variábeis" #: src/language/dictionary/mrsets.c:547 #: src/language/dictionary/sys-file-info.c:470 #: src/ui/gui/psppire-var-sheet-header.c:55 msgid "Name" msgstr "Nome" #: src/language/dictionary/mrsets.c:564 msgid "Dichotomies" msgstr "" #: src/language/dictionary/mrsets.c:565 src/language/stats/logistic.c:1391 #, fuzzy #| msgid "Category" msgid "Categories" msgstr "Categoría" #: src/language/dictionary/numeric.c:67 #, c-format msgid "Format type %s may not be used with a numeric variable." msgstr "O tipo de formato %s non pode utilizarse cunha variábel numérica." #: src/language/dictionary/numeric.c:86 src/language/dictionary/numeric.c:153 #, c-format msgid "There is already a variable named %s." msgstr "Xa hai unha variábel nomeada %s." #: src/language/dictionary/numeric.c:138 #, c-format msgid "Format type %s may not be used with a string variable." msgstr "O tipo de formato %s non pode utilizarse cunha variábel de cadea." #: src/language/dictionary/rename-variables.c:92 #, c-format msgid "Renaming would duplicate variable name %s." msgstr "O cambio de nome podería duplicar o nome da variábel %s." #: src/language/dictionary/split-file.c:75 #, fuzzy #| msgid "Split File" msgid "Split Values" msgstr "Dividir ficheiro" #: src/language/dictionary/split-file.c:76 #: src/language/dictionary/split-file.c:77 #: src/language/dictionary/sys-file-info.c:696 #: src/language/stats/chisquare.c:195 src/language/stats/cochran.c:156 #: src/language/stats/cochran.c:185 src/language/stats/examine.c:841 #: src/language/stats/reliability.c:648 src/language/stats/reliability.c:651 #: src/language/stats/crosstabs.q:1303 src/language/stats/crosstabs.q:1325 #: src/language/stats/crosstabs.q:1365 src/language/stats/crosstabs.q:1412 msgid "Value" msgstr "Valor" #: src/language/dictionary/split-file.c:79 #: src/language/dictionary/sys-file-info.c:734 #: src/language/stats/chisquare.c:246 src/language/stats/chisquare.c:328 #: src/language/stats/cochran.c:164 src/language/stats/correlations.c:100 #: src/language/stats/descriptives.c:1004 src/language/stats/friedman.c:226 #: src/language/stats/jonckheere-terpstra.c:377 #: src/language/stats/npar-summary.c:113 src/language/stats/quick-cluster.c:588 #: src/language/stats/runs.c:331 src/language/data-io/data-parser.c:683 #: src/language/data-io/data-parser.c:728 src/language/data-io/print.c:438 #: src/ui/gui/psppire-dictview.c:580 src/ui/gui/psppire-data-editor.c:502 msgid "Variable" msgstr "Variábel" #: src/language/dictionary/sys-file-info.c:184 #, fuzzy #| msgid "Variable Information:" msgid "File Information" msgstr "Información da variábel:" #: src/language/dictionary/sys-file-info.c:185 msgid "Attribute" msgstr "Atributo" #: src/language/dictionary/sys-file-info.c:187 #, fuzzy #| msgid "File:" msgid "File" msgstr "Ficheiro:" #: src/language/dictionary/sys-file-info.c:194 #, fuzzy #| msgid "Created:" msgid "Created" msgstr "Creada:" #: src/language/dictionary/sys-file-info.c:203 #, fuzzy #| msgid "Integer Format:" msgid "Integer Format" msgstr "Formato de enteiro:" #: src/language/dictionary/sys-file-info.c:205 msgid "Big Endian" msgstr "Formato Big Endian" #: src/language/dictionary/sys-file-info.c:206 msgid "Little Endian" msgstr "Formato Little Endian" #: src/language/dictionary/sys-file-info.c:207 #: src/language/dictionary/sys-file-info.c:216 #: src/language/dictionary/sys-file-info.c:223 src/language/utilities/set.q:930 msgid "Unknown" msgstr "Descoñecido" #: src/language/dictionary/sys-file-info.c:209 #, fuzzy #| msgid "Real Format:" msgid "Real Format" msgstr "Formato real:" #: src/language/dictionary/sys-file-info.c:211 msgid "IEEE 754 LE." msgstr "IEEE 754 LE." #: src/language/dictionary/sys-file-info.c:212 msgid "IEEE 754 BE." msgstr "IEEE 754 BE." #: src/language/dictionary/sys-file-info.c:213 msgid "VAX D." msgstr "VAX D." #: src/language/dictionary/sys-file-info.c:214 msgid "VAX G." msgstr "VAX G." #: src/language/dictionary/sys-file-info.c:215 msgid "IBM 390 Hex Long." msgstr "IBM 390 Hex Long." #: src/language/dictionary/sys-file-info.c:218 #: src/language/dictionary/sys-file-info.c:443 #: src/language/stats/binomial.c:199 src/language/stats/correlations.c:131 #: src/language/stats/correlations.c:159 src/language/stats/descriptives.c:585 #: src/language/stats/factor.c:1658 src/language/stats/factor.c:1701 #: src/language/stats/factor.c:1860 src/language/stats/factor.c:2074 #: src/language/stats/frequencies.c:1583 #: src/language/stats/kruskal-wallis.c:254 #: src/language/stats/kruskal-wallis.c:303 #: src/language/stats/ks-one-sample.c:316 src/language/stats/logistic.c:1187 #: src/language/stats/mann-whitney.c:254 src/language/stats/means.c:718 #: src/language/stats/means.c:800 src/language/stats/median.c:358 #: src/language/stats/oneway.c:985 src/language/stats/oneway.c:1157 #: src/language/stats/reliability.c:591 src/language/stats/regression.c:924 #: src/language/stats/t-test-one-sample.c:132 #: src/language/stats/t-test-paired.c:157 src/language/data-io/list.c:104 #: src/ui/gui/variable-info.ui:25 msgid "Variables" msgstr "Variábeis" #: src/language/dictionary/sys-file-info.c:221 src/language/stats/examine.c:929 #: src/language/stats/means.c:697 src/language/stats/reliability.c:548 #: src/language/stats/crosstabs.q:930 msgid "Cases" msgstr "Casos" #: src/language/dictionary/sys-file-info.c:226 src/language/stats/oneway.c:980 #: src/ui/gui/psppire-var-sheet-header.c:58 src/ui/gui/compute.ui:303 msgid "Type" msgstr "Tipo" #: src/language/dictionary/sys-file-info.c:230 #, fuzzy #| msgid "Weight:" msgid "Weight" msgstr "Ponderación:" #: src/language/dictionary/sys-file-info.c:233 #, fuzzy #| msgid "Not weighted." msgid "Not weighted" msgstr "Sen ponderación." #: src/language/dictionary/sys-file-info.c:235 #, fuzzy #| msgid "Compression:" msgid "Compression" msgstr "Compresión:" #: src/language/dictionary/sys-file-info.c:245 #: src/language/dictionary/sys-file-info.c:424 #: src/language/dictionary/sys-file-info.c:426 #, fuzzy #| msgid "Comments:" msgid "Documents" msgstr "Comentarios:" #: src/language/dictionary/sys-file-info.c:305 #: src/language/dictionary/sys-file-info.c:430 msgid "(none)" msgstr "" #: src/language/dictionary/sys-file-info.c:393 msgid "No variables to display." msgstr "Sen variábeis que amosar." #: src/language/dictionary/sys-file-info.c:404 msgid "Macros not supported." msgstr "Macros non compatíbeis." #: src/language/dictionary/sys-file-info.c:426 #, fuzzy #| msgid "Document Line %zu" msgid "Document" msgstr "Liña do documento %zu" #: src/language/dictionary/sys-file-info.c:454 msgid "Position" msgstr "Posición" #: src/language/dictionary/sys-file-info.c:456 #, fuzzy #| msgid "Measurement Level: %s\n" msgid "Measurement Level" msgstr "Nivel de medición: %s\n" #: src/language/dictionary/sys-file-info.c:457 #: src/ui/gui/psppire-var-sheet-header.c:85 msgid "Role" msgstr "Rol" #: src/language/dictionary/sys-file-info.c:458 #: src/ui/gui/psppire-var-sheet-header.c:61 src/ui/gui/compute.ui:215 msgid "Width" msgstr "Largura" #: src/language/dictionary/sys-file-info.c:459 #, fuzzy #| msgid "Align" msgid "Alignment" msgstr "Aliñar" #: src/language/dictionary/sys-file-info.c:460 #: src/language/dictionary/sys-file-info.c:734 msgid "Print Format" msgstr "Imprimir formato" #: src/language/dictionary/sys-file-info.c:461 #, fuzzy #| msgid "Write Format: %s" msgid "Write Format" msgstr "Escribir formato: %s" #: src/language/dictionary/sys-file-info.c:462 #: src/ui/gui/missing-val-dialog.c:379 src/ui/gui/psppire-var-sheet-header.c:73 #: src/ui/gui/examine.ui:416 src/ui/gui/t-test.ui:105 msgid "Missing Values" msgstr "Valores que faltan" #: src/language/dictionary/sys-file-info.c:567 #: src/ui/gui/psppire-var-sheet-header.c:70 src/ui/gui/val-labs-dialog.c:489 #: src/ui/gui/val-labs-dialog.ui:194 msgid "Value Labels" msgstr "Etiquetas dos valores" #: src/language/dictionary/sys-file-info.c:573 #, fuzzy #| msgid "Variable View" msgid "Variable Value" msgstr "Vista de variábel" #: src/language/dictionary/sys-file-info.c:577 #, fuzzy #| msgid "Last non-missing value" msgid "User-missing value" msgstr "Derradeiro valor non ausente" #: src/language/dictionary/sys-file-info.c:693 #, fuzzy #| msgid "Variable under test" msgid "Variable and Dataset Attributes" msgstr "Variábel baixo test" #: src/language/dictionary/sys-file-info.c:699 #, fuzzy #| msgid "Variable Name: " msgid "Variable and Name" msgstr "Nome de variábel: " #: src/language/dictionary/sys-file-info.c:702 #, fuzzy #| msgid "dataset" msgid "(dataset)" msgstr "conxunto de datos" #: src/language/dictionary/sys-file-info.c:722 msgid "No vectors defined." msgstr "Non se definiron vectores." #: src/language/dictionary/sys-file-info.c:732 #, fuzzy #| msgid "Vector" msgid "Vectors" msgstr "Vector" #: src/language/dictionary/sys-file-info.c:736 msgid "Vector and Position" msgstr "" #: src/language/dictionary/sys-file-info.c:998 msgid "No valid encodings found." msgstr "Non se atoparon codificacións válidas." #: src/language/dictionary/sys-file-info.c:1004 #, c-format msgid "Usable encodings for %s." msgstr "Codificacións utilizábeis con %s." #: src/language/dictionary/sys-file-info.c:1007 #, c-format msgid "" "Encodings that can successfully read %s (by specifying the encoding name on " "the GET command's ENCODING subcommand). Encodings that yield identical text " "are listed together." msgstr "" "Codificacións que poden ler correctamente %s (ao especificar o nome da " "codificación na orde GET na suborde ENCODING). As codificacións que producen " "texto idéntico lístanse xuntas." #: src/language/dictionary/sys-file-info.c:1012 #: src/language/dictionary/sys-file-info.c:1013 msgid "Encodings" msgstr "Codificacións" #: src/language/dictionary/sys-file-info.c:1042 #, fuzzy, c-format #| msgid "%s encoded text strings." msgid "%s Encoded Text Strings" msgstr "%s cadeas de texto codificado." #: src/language/dictionary/sys-file-info.c:1046 msgid "" "Text strings in the file dictionary that the previously listed encodings " "interpret differently, along with the interpretations." msgstr "" "As cadeas de texto do ficheiro de dicionario que as codificacións listadas " "anteriormente interpretan de forma diferente, xunto coas súas " "interpretacións." #: src/language/dictionary/sys-file-info.c:1049 src/output/text-item.c:57 #: src/ui/gui/psppire-import-assistant.c:885 msgid "Text" msgstr "Texto" #: src/language/dictionary/sys-file-info.c:1059 msgid "Purpose" msgstr "Propósito" #: src/language/dictionary/value-labels.c:154 #, c-format msgid "Truncating value label to %d bytes." msgstr "Truncado de valor da etiqueta aos %d bytes." #: src/language/dictionary/vector.c:66 #, c-format msgid "A vector named %s already exists." msgstr "Xa existe un vector nomeado %s." #: src/language/dictionary/vector.c:74 #, c-format msgid "Vector name %s is given twice." msgstr "O nome de vector %s dáse dúas veces." #: src/language/dictionary/vector.c:98 msgid "A slash must separate each vector specification in VECTOR's long form." msgstr "" "Cada vector debe estar separado por unha barra oblicua no formulario longo " "VECTOR." #: src/language/dictionary/vector.c:131 msgid "Vectors must have at least one element." msgstr "Os vectores deben ter cando menos un elemento." #: src/language/dictionary/vector.c:151 msgid "expecting vector length" msgstr "agardando a largura do vector" #: src/language/dictionary/vector.c:170 #, c-format msgid "%s is an existing variable name." msgstr "%s é un nome de variábel que xa existe." #: src/language/dictionary/variable-display.c:121 msgid "Variable display width must be a positive integer." msgstr "A largura da presentación variábel debe ser un enteiro positivo." #: src/language/dictionary/weight.c:49 msgid "The weighting variable must be numeric." msgstr "A variábel de ponderación debe ser numérica." #: src/language/dictionary/weight.c:54 msgid "The weighting variable may not be scratch." msgstr "A variábel de ponderación non debe ser temporal." #: src/language/tests/moments-test.c:50 msgid "expecting weight value" msgstr "agárdase valor de ponderación" #: src/language/utilities/cd.c:45 src/language/utilities/include.c:173 #, fuzzy, c-format #| msgid "Cannot change directory to %s: %s " msgid "Cannot change directory to %s: %s" msgstr "Non se pode cambiar o cartafol a %s: %s " #: src/language/utilities/date.c:33 #, c-format msgid "Only %s is currently implemented." msgstr "Soamente %s está xa implementado actualmente." #: src/language/utilities/host.c:60 #, fuzzy #| msgid "Command shell not supported on this platform." msgid "Time limit not supported on this platform." msgstr "A shell de ordes non é compatíbel con esta plataforma." #: src/language/utilities/host.c:74 #, c-format msgid "%s: Command exited with status %d." msgstr "" #: src/language/utilities/host.c:95 #, fuzzy, c-format #| msgid "failed to create temporary file" msgid "Failed to create temporary file (%s)." msgstr "fallou ao crear un ficheiro temporal" #: src/language/utilities/host.c:102 #, c-format msgid "/dev/null: Failed to open (%s)." msgstr "" #: src/language/utilities/host.c:117 #, c-format msgid "Couldn't fork: %s." msgstr "Non se podería ramificar: %s." #: src/language/utilities/host.c:193 #, c-format msgid "While running \"%s\", waiting for child process failed (%s)." msgstr "" #: src/language/utilities/host.c:203 #, c-format msgid "Command \"%s\" timed out." msgstr "" #: src/language/utilities/host.c:205 #, c-format msgid "Command \"%s\" terminated by signal %d." msgstr "" #: src/language/utilities/host.c:212 msgid "Command or shell not found" msgstr "" #: src/language/utilities/host.c:214 msgid "Could not invoke command or shell" msgstr "" #: src/language/utilities/host.c:217 #, c-format msgid "Command \"%s\" exited with status %d (%s)." msgstr "" #: src/language/utilities/host.c:220 #, c-format msgid "Command \"%s\" exited with status %d." msgstr "" #: src/language/utilities/host.c:230 #, c-format msgid "Command \"%s\" output could not be read (%s)." msgstr "" #: src/language/utilities/title.c:88 #, c-format msgid " (Entered %s)" msgstr " (Introducido %s)" #: src/language/utilities/include.c:73 #, c-format msgid "Can't find `%s' in include file search path." msgstr "Non se pode atopar «%s» na ruta de busca do ficheiro include." #: src/language/utilities/output.c:128 #, fuzzy, c-format #| msgid "Unknown command `%s'." msgid "Unknown cell class %s." msgstr "A orde «%s» resulta descoñecida." #: src/language/utilities/permissions.c:113 #, c-format msgid "Cannot stat %s: %s" msgstr "Non se pode fixar %s: %s" #: src/language/utilities/permissions.c:127 #, c-format msgid "Cannot change mode of %s: %s" msgstr "Non se pode cambiar o modo de %s: %s" #: src/language/stats/aggregate.c:96 msgid "Sum of values" msgstr "Suma de valores" #: src/language/stats/aggregate.c:97 msgid "Mean average" msgstr "Media" #: src/language/stats/aggregate.c:98 msgid "Median average" msgstr "Mediana" #: src/language/stats/aggregate.c:99 #: src/ui/gui/psppire-dialog-action-descriptives.c:40 #: src/ui/gui/psppire-dialog-action-frequencies.c:41 msgid "Standard deviation" msgstr "Desviación estándar" #: src/language/stats/aggregate.c:100 #: src/ui/gui/psppire-dialog-action-descriptives.c:42 msgid "Maximum value" msgstr "Valor máximo" #: src/language/stats/aggregate.c:101 #: src/ui/gui/psppire-dialog-action-descriptives.c:41 msgid "Minimum value" msgstr "Valor mínimo" #: src/language/stats/aggregate.c:102 msgid "Percentage greater than" msgstr "Porcentaxe maior ca" #: src/language/stats/aggregate.c:103 msgid "Percentage less than" msgstr "Porcentaxe menor ca" #: src/language/stats/aggregate.c:104 msgid "Percentage included in range" msgstr "Porcentaxe incluído no rango" #: src/language/stats/aggregate.c:105 msgid "Percentage excluded from range" msgstr "Porcentaxe excluído do rango" #: src/language/stats/aggregate.c:106 msgid "Fraction greater than" msgstr "Fracción maior ca" #: src/language/stats/aggregate.c:107 msgid "Fraction less than" msgstr "Fracción menor ca" #: src/language/stats/aggregate.c:108 msgid "Fraction included in range" msgstr "Fracción incluída no rango" #: src/language/stats/aggregate.c:109 msgid "Fraction excluded from range" msgstr "Fracción excluída no rango" #: src/language/stats/aggregate.c:110 msgid "Number of cases" msgstr "Número de casos" #: src/language/stats/aggregate.c:111 msgid "Number of cases (unweighted)" msgstr "Número de casos (sen ponderación)" #: src/language/stats/aggregate.c:112 msgid "Number of missing values" msgstr "Número de valores que faltan" #: src/language/stats/aggregate.c:113 msgid "Number of missing values (unweighted)" msgstr "Número de valores que faltan (sen ponderación)" #: src/language/stats/aggregate.c:114 msgid "First non-missing value" msgstr "Primeiro valor non ausente" #: src/language/stats/aggregate.c:115 msgid "Last non-missing value" msgstr "Derradeiro valor non ausente" #: src/language/stats/aggregate.c:258 msgid "" "When PRESORTED is specified, specifying sorting directions with (A) or (D) " "has no effect. Output data will be sorted the same way as the input data." msgstr "" "Ao especificar PRESORTED, as direccións de ordenación especificadas con (A) " "ou (D) non teñen efecto. Os datos de saída ordenaranse da mesma maneira que " "os datos de entrada." #: src/language/stats/aggregate.c:448 msgid "expecting aggregation function" msgstr "Agárdase a función de agregación" #: src/language/stats/aggregate.c:460 #, c-format msgid "Unknown aggregation function %s." msgstr "A función de agregación %s resulta descoñecida." #: src/language/stats/aggregate.c:513 #, c-format msgid "Missing argument %zu to %s." msgstr "Falta o argumento %zu de %s." #: src/language/stats/aggregate.c:522 #, c-format msgid "Arguments to %s must be of same type as source variables." msgstr "" "Os argumentos para %s deben ser do mesmo tipo que o das variábeis de orixe." #: src/language/stats/aggregate.c:541 #, c-format msgid "" "Number of source variables (%zu) does not match number of target variables " "(%zu)." msgstr "" "O número de variábeis de orixe (%zu) non coincide co número de variábeis " "obxectivo (%zu)." #: src/language/stats/aggregate.c:557 #, c-format msgid "" "The value arguments passed to the %s function are out-of-order. They will " "be treated as if they had been specified in the correct order." msgstr "" "Os argumento de valor pasados á función %s están desordenados. Trataranse " "como se tivesen sido especificados na orde correcta." #: src/language/stats/aggregate.c:631 #, c-format msgid "" "Variable name %s is not unique within the aggregate file dictionary, which " "contains the aggregate variables and the break variables." msgstr "" "O nome da variábel %s non é única dentro do dicionario do ficheiro agregado, " "que contén as variábeis agregadas e as variábeis de ruptura." #: src/language/stats/autorecode.c:152 #, c-format msgid "Source variable count (%zu) does not match target variable count (%zu)." msgstr "" "A conta da variábel de orixe (%zu) non coincide coa conta da variábel " "obxectivo (%zu)." #: src/language/stats/autorecode.c:164 #, c-format msgid "Target variable %s duplicates existing variable %s." msgstr "A variábel obxectivo %s duplica a variábel existente %s." #: src/language/stats/autorecode.c:221 #, c-format msgid "" "With GROUP, variables may not mix string variables (such as %s) and numeric " "variables (such as %s)." msgstr "" #: src/language/stats/autorecode.c:363 #, fuzzy #| msgid "Recode into Same Variables" msgid "Recoding grouped variables." msgstr "Recodificar coas mesmas variábeis" #: src/language/stats/autorecode.c:365 #, fuzzy, c-format #| msgid "Replacing %s by %s: %s." msgid "Recoding %s into %s (%s)." msgstr "Substitución de %s por %s: %s." #: src/language/stats/autorecode.c:369 #, fuzzy, c-format #| msgid "Removing %s: %s." msgid "Recoding %s into %s." msgstr "Retirando %s: %s." #: src/language/stats/autorecode.c:376 src/ui/gui/recode.ui:209 msgid "New Value" msgstr "Novo valor" #: src/language/stats/autorecode.c:376 msgid "Value Label" msgstr "Etiqueta de valor" #: src/language/stats/autorecode.c:379 msgid "Old Value" msgstr "Valor antigo" #: src/language/stats/binomial.c:138 #, c-format msgid "Variable %s is not dichotomous" msgstr "A variábel %s non é dicotómica" #: src/language/stats/binomial.c:182 src/ui/gui/binomial.ui:30 msgid "Binomial Test" msgstr "Test binomial" #: src/language/stats/binomial.c:186 src/language/stats/chisquare.c:183 #: src/language/stats/chisquare.c:239 src/language/stats/chisquare.c:322 #: src/language/stats/cochran.c:188 src/language/stats/correlations.c:94 #: src/language/stats/correlations.c:145 src/language/stats/descriptives.c:991 #: src/language/stats/examine.c:602 src/language/stats/examine.c:742 #: src/language/stats/examine.c:836 src/language/stats/examine.c:925 #: src/language/stats/factor.c:1755 src/language/stats/factor.c:1878 #: src/language/stats/factor.c:1908 src/language/stats/factor.c:2068 #: src/language/stats/factor.c:2102 src/language/stats/frequencies.c:302 #: src/language/stats/frequencies.c:1579 src/language/stats/frequencies.c:1586 #: src/language/stats/friedman.c:250 src/language/stats/glm.c:729 #: src/language/stats/kruskal-wallis.c:249 #: src/language/stats/kruskal-wallis.c:297 #: src/language/stats/ks-one-sample.c:278 src/language/stats/logistic.c:1170 #: src/language/stats/logistic.c:1300 src/language/stats/logistic.c:1330 #: src/language/stats/jonckheere-terpstra.c:361 #: src/language/stats/mann-whitney.c:184 src/language/stats/mann-whitney.c:247 #: src/language/stats/means.c:757 src/language/stats/means.c:811 #: src/language/stats/mcnemar.c:222 src/language/stats/median.c:315 #: src/language/stats/median.c:350 src/language/stats/npar-summary.c:106 #: src/language/stats/oneway.c:973 src/language/stats/oneway.c:1051 #: src/language/stats/oneway.c:1150 src/language/stats/oneway.c:1238 #: src/language/stats/oneway.c:1373 src/language/stats/quick-cluster.c:746 #: src/language/stats/reliability.c:543 src/language/stats/reliability.c:584 #: src/language/stats/reliability.c:633 src/language/stats/reliability.c:644 #: src/language/stats/roc.c:969 src/language/stats/roc.c:1067 #: src/language/stats/regression.c:867 src/language/stats/regression.c:899 #: src/language/stats/regression.c:1023 src/language/stats/regression.c:1089 #: src/language/stats/runs.c:318 src/language/stats/sign.c:102 #: src/language/stats/t-test-indep.c:193 src/language/stats/t-test-indep.c:259 #: src/language/stats/t-test-one-sample.c:68 #: src/language/stats/t-test-one-sample.c:125 #: src/language/stats/t-test-paired.c:150 #: src/language/stats/t-test-paired.c:193 #: src/language/stats/t-test-paired.c:238 src/language/stats/wilcoxon.c:243 #: src/language/stats/wilcoxon.c:282 src/language/stats/crosstabs.q:925 #: src/language/stats/crosstabs.q:1253 src/language/stats/crosstabs.q:1293 #: src/language/stats/crosstabs.q:1302 src/language/stats/crosstabs.q:1331 #: src/language/stats/crosstabs.q:1373 src/language/stats/crosstabs.q:1418 #: src/ui/gui/crosstabs.ui:499 src/ui/gui/oneway.ui:615 msgid "Statistics" msgstr "Estatísticas" #: src/language/stats/binomial.c:187 src/language/stats/chisquare.c:240 #: src/language/stats/chisquare.c:252 msgid "Category" msgstr "Categoría" #: src/language/stats/binomial.c:188 src/language/stats/cochran.c:189 #: src/language/stats/correlations.c:97 src/language/stats/correlations.c:155 #: src/language/stats/descriptives.c:993 src/language/stats/examine.c:926 #: src/language/stats/frequencies.c:1588 src/language/stats/friedman.c:251 #: src/language/stats/kruskal-wallis.c:250 #: src/language/stats/ks-one-sample.c:279 src/language/stats/logistic.c:1331 #: src/language/stats/jonckheere-terpstra.c:369 #: src/language/stats/mann-whitney.c:185 src/language/stats/means.c:710 #: src/language/stats/means-calc.c:439 src/language/stats/mcnemar.c:223 #: src/language/stats/median.c:351 src/language/stats/npar-summary.c:107 #: src/language/stats/oneway.c:1052 src/language/stats/reliability.c:544 #: src/language/stats/sign.c:69 src/language/stats/sign.c:70 #: src/language/stats/t-test-indep.c:194 #: src/language/stats/t-test-one-sample.c:126 #: src/language/stats/t-test-paired.c:151 #: src/language/stats/t-test-paired.c:194 src/language/stats/wilcoxon.c:244 #: src/language/stats/crosstabs.q:926 msgid "N" msgstr "N" #: src/language/stats/binomial.c:189 msgid "Observed Prop." msgstr "Prop. observada" #: src/language/stats/binomial.c:190 msgid "Test Prop." msgstr "Probar prop." #: src/language/stats/binomial.c:192 src/language/stats/mcnemar.c:224 #: src/language/stats/sign.c:103 src/language/stats/wilcoxon.c:288 #: src/language/stats/crosstabs.q:1306 msgid "Exact Sig. (2-tailed)" msgstr "Sign. exacta (2-colas)" #: src/language/stats/binomial.c:193 src/language/stats/mcnemar.c:225 #: src/language/stats/sign.c:104 src/language/stats/wilcoxon.c:289 #: src/language/stats/crosstabs.q:1307 msgid "Exact Sig. (1-tailed)" msgstr "Sign. exacta (1-cola)" #: src/language/stats/binomial.c:195 #, fuzzy #| msgid "Group1" msgid "Groups" msgstr "Grupo1" #: src/language/stats/binomial.c:196 #, fuzzy #| msgid "Group1" msgid "Group 1" msgstr "Grupo1" #: src/language/stats/binomial.c:196 #, fuzzy #| msgid "Group2" msgid "Group 2" msgstr "Grupo2" #: src/language/stats/binomial.c:196 src/language/stats/chisquare.c:223 #: src/language/stats/chisquare.c:257 src/language/stats/examine.c:930 #: src/language/stats/factor.c:1756 src/language/stats/frequencies.c:344 #: src/language/stats/glm.c:811 src/language/stats/kruskal-wallis.c:285 #: src/language/stats/logistic.c:1336 src/language/stats/mann-whitney.c:197 #: src/language/stats/means.c:706 src/language/stats/oneway.c:982 #: src/language/stats/oneway.c:1072 src/language/stats/reliability.c:549 #: src/language/stats/regression.c:1031 src/language/stats/sign.c:75 #: src/language/stats/wilcoxon.c:250 #: src/ui/gui/psppire-dialog-action-crosstabs.c:93 #: src/language/stats/crosstabs.q:931 src/language/stats/crosstabs.q:1218 msgid "Total" msgstr "Total" #: src/language/stats/chisquare.c:171 #, fuzzy, c-format #| msgid "" #| "CHISQUARE test specified %d expected values, but %d distinct values were " #| "encountered in variable %s." msgid "" "CHISQUARE test specified %d expected values, but variable %s has %zu " "distinct values." msgstr "" "O test CHISQUARE especificou que se agardaban %d valores pero atopáronse %d " "valores distintos na variábel %s." #: src/language/stats/chisquare.c:184 src/language/stats/chisquare.c:241 msgid "Observed N" msgstr "N observado" #: src/language/stats/chisquare.c:185 src/language/stats/chisquare.c:242 msgid "Expected N" msgstr "Agardábase N" #: src/language/stats/chisquare.c:186 src/language/stats/chisquare.c:243 #: src/language/stats/regression.c:1031 #: src/ui/gui/psppire-dialog-action-crosstabs.c:95 #: src/language/stats/crosstabs.q:1267 msgid "Residual" msgstr "Residual" #: src/language/stats/chisquare.c:235 src/language/stats/cochran.c:150 #: src/language/stats/median.c:305 src/language/stats/sign.c:66 #: src/ui/gui/frequencies.ui:676 msgid "Frequencies" msgstr "Frecuencias" #: src/language/stats/chisquare.c:320 src/language/stats/cochran.c:181 #: src/language/stats/friedman.c:246 src/language/stats/kruskal-wallis.c:295 #: src/language/stats/mann-whitney.c:244 src/language/stats/mcnemar.c:219 #: src/language/stats/median.c:347 src/language/stats/sign.c:100 #: src/language/stats/wilcoxon.c:279 msgid "Test Statistics" msgstr "Estatísticas de test" #: src/language/stats/chisquare.c:323 #, fuzzy #| msgid "Chi-Square" msgid "Chi-square" msgstr "Khi cadrado" #: src/language/stats/chisquare.c:324 src/language/stats/cochran.c:191 #: src/language/stats/examine.c:675 src/language/stats/factor.c:2107 #: src/language/stats/friedman.c:257 src/language/stats/glm.c:733 #: src/language/stats/kruskal-wallis.c:299 src/language/stats/logistic.c:1174 #: src/language/stats/median.c:354 src/language/stats/oneway.c:975 #: src/language/stats/oneway.c:1242 src/language/stats/regression.c:1025 #: src/language/stats/t-test-indep.c:267 #: src/language/stats/t-test-one-sample.c:75 #: src/language/stats/t-test-paired.c:253 src/language/stats/crosstabs.q:1304 msgid "df" msgstr "df" #: src/language/stats/chisquare.c:325 src/language/stats/cochran.c:192 #: src/language/stats/friedman.c:258 src/language/stats/kruskal-wallis.c:300 #: src/language/stats/median.c:355 msgid "Asymp. Sig." msgstr "Sign. Asint." #: src/language/stats/cochran.c:111 msgid "More than two values encountered. Cochran Q test will not be run." msgstr "Atopáronse máis de dous valores. O test Q de Cochran non se executará." #: src/language/stats/cochran.c:153 #, c-format msgid "Success (%.*g)" msgstr "Éxito (%.*g)" #: src/language/stats/cochran.c:154 #, c-format msgid "Failure (%.*g)" msgstr "Fallo (%.*g)" #: src/language/stats/cochran.c:190 msgid "Cochran's Q" msgstr "Q de Cochran" #: src/language/stats/correlations.c:91 src/language/stats/descriptives.c:987 #: src/language/stats/factor.c:2065 src/language/stats/npar-summary.c:102 msgid "Descriptive Statistics" msgstr "Estatísticas descritivas" #: src/language/stats/correlations.c:95 src/language/stats/descriptives.c:108 #: src/language/stats/examine.c:742 src/language/stats/factor.c:2069 #: src/language/stats/frequencies.c:141 src/language/stats/graph.c:211 #: src/language/stats/ks-one-sample.c:290 src/language/stats/means-calc.c:438 #: src/language/stats/npar-summary.c:108 src/language/stats/oneway.c:1052 #: src/language/stats/t-test-indep.c:195 #: src/language/stats/t-test-one-sample.c:127 #: src/language/stats/t-test-paired.c:152 #: src/language/stats/t-test-paired.c:241 #: src/ui/gui/psppire-dialog-action-descriptives.c:39 #: src/ui/gui/psppire-dialog-action-frequencies.c:40 msgid "Mean" msgstr "Media" #: src/language/stats/correlations.c:96 src/language/stats/examine.c:751 #: src/language/stats/factor.c:2070 src/language/stats/ks-one-sample.c:290 #: src/language/stats/means-calc.c:440 src/language/stats/npar-summary.c:109 #: src/language/stats/oneway.c:1052 src/language/stats/t-test-indep.c:196 #: src/language/stats/t-test-one-sample.c:128 #: src/language/stats/t-test-paired.c:153 #: src/language/stats/t-test-paired.c:242 msgid "Std. Deviation" msgstr "Desv. estándar" #: src/language/stats/correlations.c:126 msgid "Correlations" msgstr "Correlacións" #: src/language/stats/correlations.c:146 msgid "Pearson Correlation" msgstr "Correlación de Pearson" #: src/language/stats/correlations.c:147 src/language/stats/oneway.c:1243 #: src/language/stats/t-test-indep.c:268 #: src/language/stats/t-test-one-sample.c:76 #: src/language/stats/t-test-paired.c:254 msgid "Sig. (2-tailed)" msgstr "Sign. (2-colas)" #: src/language/stats/correlations.c:147 src/language/stats/factor.c:1913 msgid "Sig. (1-tailed)" msgstr "Sign. (1-cola)" #: src/language/stats/correlations.c:151 msgid "Cross-products" msgstr "Produtos cruzados" #: src/language/stats/correlations.c:152 msgid "Covariance" msgstr "Covarianza" #: src/language/stats/correlations.c:165 msgid "Significant at .05 level" msgstr "" #: src/language/stats/correlations.c:234 msgid "The data for the chosen variables are all missing or empty." msgstr "" #: src/language/stats/correlations.c:390 src/language/stats/descriptives.c:368 #: src/language/data-io/list.c:166 msgid "No variables specified." msgstr "Sen especificar variábeis." #: src/language/stats/descriptives.c:109 src/language/stats/frequencies.c:142 #: src/language/stats/means-calc.c:445 src/language/stats/t-test-indep.c:197 #: src/language/stats/t-test-one-sample.c:129 #: src/language/stats/t-test-paired.c:154 #: src/language/stats/t-test-paired.c:243 msgid "S.E. Mean" msgstr "Erro estándar da media" #: src/language/stats/descriptives.c:110 src/language/stats/frequencies.c:145 msgid "Std Dev" msgstr "Desv Est" #: src/language/stats/descriptives.c:111 src/language/stats/examine.c:750 #: src/language/stats/frequencies.c:146 src/language/stats/means-calc.c:450 #: src/ui/gui/psppire-dialog-action-descriptives.c:46 #: src/ui/gui/psppire-dialog-action-frequencies.c:45 msgid "Variance" msgstr "Varianza" #: src/language/stats/descriptives.c:112 src/language/stats/examine.c:752 #: src/language/stats/frequencies.c:147 src/language/stats/means-calc.c:451 #: src/ui/gui/psppire-dialog-action-descriptives.c:47 #: src/ui/gui/psppire-dialog-action-frequencies.c:50 msgid "Kurtosis" msgstr "Curtose" #: src/language/stats/descriptives.c:113 src/language/stats/frequencies.c:148 #: src/language/stats/means-calc.c:452 msgid "S.E. Kurt" msgstr "Erro estándar de Kurt" #: src/language/stats/descriptives.c:114 src/language/stats/examine.c:752 #: src/language/stats/frequencies.c:149 src/language/stats/means-calc.c:453 #: src/ui/gui/psppire-dialog-action-descriptives.c:48 #: src/ui/gui/psppire-dialog-action-frequencies.c:46 msgid "Skewness" msgstr "Asimetría" #: src/language/stats/descriptives.c:115 src/language/stats/frequencies.c:150 #: src/language/stats/means-calc.c:454 msgid "S.E. Skew" msgstr "Erro estándar da asimetría" #: src/language/stats/descriptives.c:116 src/language/stats/examine.c:751 #: src/language/stats/frequencies.c:151 src/language/stats/means-calc.c:449 #: src/ui/gui/psppire-dialog-action-descriptives.c:43 #: src/ui/gui/psppire-dialog-action-frequencies.c:48 msgid "Range" msgstr "Rango" #: src/language/stats/descriptives.c:117 src/language/stats/examine.c:751 #: src/language/stats/frequencies.c:152 src/language/stats/graph.c:214 #: src/language/stats/ks-one-sample.c:285 src/language/stats/means-calc.c:447 #: src/language/stats/npar-summary.c:110 src/language/stats/oneway.c:1061 #: src/ui/gui/psppire-dialog-action-descriptives.c:41 #: src/ui/gui/psppire-dialog-action-frequencies.c:42 msgid "Minimum" msgstr "Mínimo" #: src/language/stats/descriptives.c:118 src/language/stats/examine.c:751 #: src/language/stats/frequencies.c:153 src/language/stats/graph.c:213 #: src/language/stats/ks-one-sample.c:285 src/language/stats/means-calc.c:448 #: src/language/stats/npar-summary.c:110 src/language/stats/oneway.c:1061 #: src/ui/gui/psppire-dialog-action-descriptives.c:42 #: src/ui/gui/psppire-dialog-action-frequencies.c:43 msgid "Maximum" msgstr "Máximo" #: src/language/stats/descriptives.c:119 src/language/stats/frequencies.c:154 #: src/language/stats/graph.c:212 src/language/stats/means-calc.c:446 #: src/ui/gui/psppire-dialog-action-descriptives.c:44 #: src/ui/gui/psppire-dialog-action-frequencies.c:53 msgid "Sum" msgstr "Sum" #: src/language/stats/descriptives.c:350 #, c-format msgid "Z-score variable name %s would be a duplicate variable name." msgstr "O nome da variábel z-score %s será un nome de variábel duplicado." #: src/language/stats/descriptives.c:401 msgid "" "DESCRIPTIVES with Z scores ignores TEMPORARY. Temporary transformations " "will be made permanent." msgstr "" "DESCRIPTIVES con puntuacións Z ignora TEMPORARY. As transformacións " "temporais faranse permanentes." #: src/language/stats/descriptives.c:478 msgid "expecting statistic name: reverting to default" msgstr "Agárdase un nome estatístico: volvendo ao predeterminado" #: src/language/stats/descriptives.c:561 msgid "" "Ran out of generic names for Z-score variables. There are only 126 generic " "names: ZSC001-ZSC0999, STDZ01-STDZ09, ZZZZ01-ZZZZ09, ZQZQ01-ZQZQ09." msgstr "" "Esgotáronse os nomes xenéricos para as variábeis de puntuación Z. Soamente " "hai 126 nomes xenéricos: ZSC001-ZSC0999, STDZ01-STDZ09, ZZZZ01-ZZZZ09, " "ZQZQ01-ZQZQ09." #: src/language/stats/descriptives.c:579 #, fuzzy #| msgid "Mapping of variables to corresponding Z-scores." msgid "Mapping of Variables to Z-scores" msgstr "Mapeo de variábeis que corresponden coas puntuacións Z." #: src/language/stats/descriptives.c:581 #, fuzzy #| msgid "Name" msgid "Names" msgstr "Nome" #: src/language/stats/descriptives.c:582 src/language/stats/glm.c:739 #: src/language/stats/regression.c:1030 msgid "Source" msgstr "Orixe" #: src/language/stats/descriptives.c:582 msgid "Target" msgstr "Obxectivo" #: src/language/stats/descriptives.c:659 #, fuzzy, c-format #| msgid "Internal error processing Z scores" msgid "Internal error processing Z scores. Please report this to %s." msgstr "Produciuse un erro interno ao procesar as puntuacións Z" #: src/language/stats/descriptives.c:759 #, c-format msgid "Z-score of %s" msgstr "Puntuación Z de %s" #: src/language/stats/descriptives.c:1028 src/language/stats/roc.c:1029 msgid "Valid N (listwise)" msgstr "N válido (da lista)" #: src/language/stats/descriptives.c:1028 #, fuzzy #| msgid "Valid N (listwise)" msgid "Missing N (listwise)" msgstr "N válido (da lista)" #: src/language/stats/examine.c:75 msgid " (missing)" msgstr " (falta)" #: src/language/stats/examine.c:225 #, c-format msgid "Boxplot of %s vs. %s" msgstr "Diagrama de caixa de %s fronte a %s" #: src/language/stats/examine.c:231 src/language/stats/examine.c:338 #, c-format msgid "Boxplot of %s" msgstr "Diagrama de caixa de %s" #: src/language/stats/examine.c:321 msgid "Boxplot" msgstr "Diagrama de caixa" #: src/language/stats/examine.c:418 msgid "Not creating NP plot because data set is empty." msgstr "Non se crea o diagrama NP porque o conxunto de datos está baleiro." #: src/language/stats/examine.c:478 #, c-format msgid "Not creating spreadlevel chart for %s" msgstr "Non se crea a gráfica de nivel de dispersión para %s" #: src/language/stats/examine.c:585 #, fuzzy #| msgid "Last non-missing value" msgid "User-missing value." msgstr "Derradeiro valor non ausente" #: src/language/stats/examine.c:591 src/language/stats/examine.c:595 #: src/language/stats/frequencies.c:1606 msgid "Percentiles" msgstr "Percentís" #: src/language/stats/examine.c:603 src/math/percentiles.c:37 msgid "Weighted Average" msgstr "Media ponderada" #: src/language/stats/examine.c:603 msgid "Tukey's Hinges" msgstr "Dependencias de Tukey" #: src/language/stats/examine.c:610 src/language/stats/examine.c:685 #: src/language/stats/examine.c:759 src/language/stats/examine.c:858 #: src/language/stats/examine.c:938 src/language/stats/mann-whitney.c:200 #: src/language/stats/median.c:319 src/language/stats/t-test-indep.c:227 #: src/language/stats/t-test-indep.c:282 #: src/language/stats/t-test-one-sample.c:87 #, fuzzy #| msgid "_Dependent Variable" msgid "Dependent Variables" msgstr "Variábel _dependente" #: src/language/stats/examine.c:669 #, fuzzy #| msgid "Dev from Normal" msgid "Tests of Normality" msgstr "Desv. de normal" #: src/language/stats/examine.c:673 msgid "Shapiro-Wilk" msgstr "" #: src/language/stats/examine.c:674 src/language/stats/examine.c:739 #: src/ui/gui/psppire-checkbox-treeview.c:73 msgid "Statistic" msgstr "Estatística" #: src/language/stats/examine.c:676 src/language/stats/factor.c:2108 #: src/language/stats/glm.c:736 src/language/stats/logistic.c:1175 #: src/language/stats/oneway.c:978 src/language/stats/oneway.c:1154 #: src/language/stats/oneway.c:1376 src/language/stats/regression.c:906 #: src/language/stats/regression.c:1028 src/language/stats/t-test-indep.c:263 #: src/language/stats/t-test-paired.c:196 msgid "Sig." msgstr "Seg." #: src/language/stats/examine.c:735 src/language/stats/oneway.c:1045 #: src/ui/gui/descriptives.ui:25 msgid "Descriptives" msgstr "Descritivas" #: src/language/stats/examine.c:738 msgid "Aspect" msgstr "" #: src/language/stats/examine.c:739 src/language/stats/oneway.c:1053 #: src/language/stats/oneway.c:1240 src/language/stats/oneway.c:1375 #: src/language/stats/roc.c:975 src/language/stats/regression.c:902 msgid "Std. Error" msgstr "Erro estándar" #: src/language/stats/examine.c:745 src/language/stats/oneway.c:1056 #, c-format msgid "%g%% Confidence Interval for Mean" msgstr "Intervalo de confianza para media %g%%" #: src/language/stats/examine.c:747 src/language/stats/oneway.c:1058 #: src/language/stats/oneway.c:1382 src/language/stats/roc.c:982 #: src/language/stats/regression.c:913 msgid "Lower Bound" msgstr "Límite inferior" #: src/language/stats/examine.c:748 src/language/stats/oneway.c:1059 #: src/language/stats/oneway.c:1383 src/language/stats/roc.c:983 #: src/language/stats/regression.c:914 msgid "Upper Bound" msgstr "Límite superior" #: src/language/stats/examine.c:750 msgid "5% Trimmed Mean" msgstr "Media recortada 5%" #: src/language/stats/examine.c:750 src/language/stats/frequencies.c:143 #: src/language/stats/means-calc.c:442 src/language/stats/median.c:352 #: src/ui/gui/psppire-dialog-action-frequencies.c:52 msgid "Median" msgstr "Mediana" #: src/language/stats/examine.c:752 msgid "Interquartile Range" msgstr "Rango intercuartil" #: src/language/stats/examine.c:832 msgid "Extreme Values" msgstr "Valores estremeiros" #: src/language/stats/examine.c:840 src/language/stats/quick-cluster.c:664 #: src/language/data-io/list.c:110 msgid "Case Number" msgstr "Número de caso" #: src/language/stats/examine.c:844 #, fuzzy #| msgid "Order by" msgid "Order" msgstr "Ordenar por" #. TRANSLATORS: This is a noun, not an adjective. #: src/language/stats/examine.c:850 #, fuzzy #| msgid "_Extremes" msgid "Extreme" msgstr "_Extremos" #: src/language/stats/examine.c:851 msgid "Highest" msgstr "O máis alto" #: src/language/stats/examine.c:851 msgid "Lowest" msgstr "O máis baixo" #: src/language/stats/examine.c:921 src/language/stats/logistic.c:1328 #: src/language/stats/means.c:694 src/language/stats/reliability.c:540 msgid "Case Processing Summary" msgstr "Resumo de procesamento do caso" #: src/language/stats/examine.c:927 src/language/stats/frequencies.c:304 #: src/language/stats/frequencies.c:1494 src/language/stats/logistic.c:1332 #: src/language/stats/means.c:713 src/language/stats/reliability.c:545 #: src/language/stats/crosstabs.q:927 msgid "Percent" msgstr "Porcentual" #: src/language/stats/examine.c:929 src/language/stats/frequencies.c:321 #: src/language/stats/frequencies.c:1590 src/language/stats/quick-cluster.c:766 #: src/language/stats/reliability.c:548 src/language/stats/crosstabs.q:931 msgid "Valid" msgstr "Válido" #: src/language/stats/examine.c:929 src/language/stats/frequencies.c:336 #: src/language/stats/frequencies.c:1591 src/language/stats/crosstabs.q:931 msgid "Missing" msgstr "Ausente" #: src/language/stats/examine.c:1550 #, c-format msgid "%s may not be negative. Using default value (%g)." msgstr "%s non pode ser negativo. Utilización do valor predeterminado (%g)." #: src/language/stats/examine.c:1587 msgid "Percentiles must lie in the range (0, 100)" msgstr "Os percentís deben mentir no rango (0, 100)" #: src/language/stats/examine.c:1777 #, c-format msgid "%s and %s are mutually exclusive" msgstr "%s e %s son mutuamente exclusivos" #: src/language/stats/factor.c:1121 #, c-format msgid "Matrix input for %s must be either COV or CORR" msgstr "" #: src/language/stats/factor.c:1519 msgid "Factor analysis on a single variable is not useful." msgstr "O factor de análise dunha soa variábel non é práctico." #: src/language/stats/factor.c:1523 #, fuzzy #| msgid "Factor analysis on a single variable is not useful." msgid "Factor analysis without variables is not possible." msgstr "O factor de análise dunha soa variábel non é práctico." #: src/language/stats/factor.c:1634 msgid "Component Number" msgstr "Número de compoñente" #: src/language/stats/factor.c:1634 msgid "Factor Number" msgstr "Número de factor" #: src/language/stats/factor.c:1648 src/language/stats/factor.c:1651 msgid "Communalities" msgstr "Comunalidades" #: src/language/stats/factor.c:1653 msgid "Initial" msgstr "Inicial" #: src/language/stats/factor.c:1655 msgid "Extraction" msgstr "Extracción" #: src/language/stats/factor.c:1697 src/language/stats/factor.c:1777 #: src/language/stats/factor.c:1839 msgid "Component" msgstr "Compoñente" #: src/language/stats/factor.c:1697 src/language/stats/factor.c:1777 #: src/language/stats/factor.c:1839 msgid "Factor" msgstr "Factor" #: src/language/stats/factor.c:1752 msgid "Total Variance Explained" msgstr "Varianza total explicada" #: src/language/stats/factor.c:1758 #, no-c-format msgid "% of Variance" msgstr "% de varianza" #: src/language/stats/factor.c:1760 #, no-c-format msgid "Cumulative %" msgstr "Acumulado %" #: src/language/stats/factor.c:1763 msgid "Phase" msgstr "" #: src/language/stats/factor.c:1765 msgid "Initial Eigenvalues" msgstr "Raíces características iniciais" #: src/language/stats/factor.c:1769 msgid "Extraction Sums of Squared Loadings" msgstr "Sumas de cargas ao cadrado na extracción" #: src/language/stats/factor.c:1773 msgid "Rotation Sums of Squared Loadings" msgstr "Sumas de cargas ao cadrado na rotación" #: src/language/stats/factor.c:1835 #, fuzzy #| msgid "Correlation Matrix" msgid "Factor Correlation Matrix" msgstr "Matriz de correlación" #: src/language/stats/factor.c:1842 #, fuzzy #| msgid "Factor" msgid "Factor 2" msgstr "Factor" #: src/language/stats/factor.c:1874 msgid "Anti-Image Matrices" msgstr "" #: src/language/stats/factor.c:1879 #, fuzzy #| msgid "Covariance" msgid "Anti-image Covariance" msgstr "Covarianza" #: src/language/stats/factor.c:1880 #, fuzzy #| msgid "Bivariate Correlations" msgid "Anti-image Correlation" msgstr "Correlacións bivariantes" #: src/language/stats/factor.c:1901 msgid "Correlation Matrix" msgstr "Matriz de correlación" #: src/language/stats/factor.c:1910 src/language/stats/t-test-paired.c:195 msgid "Correlation" msgstr "Correlación" #: src/language/stats/factor.c:1947 msgid "Determinant" msgstr "Determinante" #: src/language/stats/factor.c:1958 #, fuzzy #| msgid "Co_variance matrix" msgid "Covariance Matrix" msgstr "Matriz de co_varianza" #: src/language/stats/factor.c:1990 msgid "" "The dataset contains no complete observations. No analysis will be performed." msgstr "" "O conxunto de datos non contén observacións completas. Non se realizará " "ningunha análise." #: src/language/stats/factor.c:2014 msgid "The dataset has no complete covariance or correlation matrix." msgstr "" #: src/language/stats/factor.c:2071 msgid "Analysis N" msgstr "Análise N" #: src/language/stats/factor.c:2099 msgid "KMO and Bartlett's Test" msgstr "Test de Bartlett e KMO" #: src/language/stats/factor.c:2103 msgid "Kaiser-Meyer-Olkin Measure of Sampling Adequacy" msgstr "Medida de adecuación da mostraxe de Kaiser-Meyer-Olkin" #: src/language/stats/factor.c:2105 msgid "Bartlett's Test of Sphericity" msgstr "Test de esfericidade de Bartlett" #: src/language/stats/factor.c:2106 msgid "Approx. Chi-Square" msgstr "Aprox. Khi cadrado" #: src/language/stats/factor.c:2154 #, c-format msgid "" "The %s criteria result in zero factors extracted. Therefore no analysis will " "be performed." msgstr "" "O criterio %s dá como resultado cero factores extraídos. De todas maneiras, " "non se realizarán análises." #: src/language/stats/factor.c:2161 #, c-format msgid "" "The %s criteria result in more factors than variables, which is not " "meaningful. No analysis will be performed." msgstr "" "O criterio %s dá como resultado máis factores ca variábeis, o que non ten " "xeito. Non se realizarán análises." #: src/language/stats/factor.c:2254 msgid "Component Matrix" msgstr "Matriz de compoñentes" #: src/language/stats/factor.c:2254 msgid "Factor Matrix" msgstr "Matriz de factores" #: src/language/stats/factor.c:2259 #, fuzzy #| msgid "Factor Matrix" msgid "Pattern Matrix" msgstr "Matriz de factores" #: src/language/stats/factor.c:2268 #, fuzzy #| msgid "Factor Matrix" msgid "Structure Matrix" msgstr "Matriz de factores" #: src/language/stats/factor.c:2270 msgid "Rotated Component Matrix" msgstr "Matriz rotada de compoñentes" #: src/language/stats/factor.c:2271 msgid "Rotated Factor Matrix" msgstr "Matriz rotada de factores" #: src/language/stats/flip.c:100 #, c-format msgid "%s ignores %s. Temporary transformations will be made permanent." msgstr "%s ignora %s. As transformacións temporais faranse permanentes." #: src/language/stats/flip.c:153 #, c-format msgid "Could not create temporary file for %s." msgstr "Non foi posíbel crear un ficheiro temporal para %s." #: src/language/stats/flip.c:341 #, c-format msgid "Error rewinding %s file: %s." msgstr "Produciuse un erro ao recrear o ficheiro %s: %s." #: src/language/stats/flip.c:348 #, c-format msgid "Error creating %s source file." msgstr "Produciuse un erro ao crear o ficheiro de orixe %s." #: src/language/stats/flip.c:361 #, c-format msgid "Error reading %s file: %s." msgstr "Produciuse un erro ao ler o ficheiro %s: %s." #: src/language/stats/flip.c:363 #, c-format msgid "Unexpected end of file reading %s file." msgstr "Atopouse un remate inesperado ao ler o ficheiro %s." #: src/language/stats/flip.c:379 #, c-format msgid "Error seeking %s source file: %s." msgstr "Produciuse un erro ao buscar o ficheiro de orixe %s: %s." #: src/language/stats/flip.c:387 #, c-format msgid "Error writing %s source file: %s." msgstr "Produciuse un erro ao escribir o ficheiro de orixe %s: %s." #: src/language/stats/flip.c:402 #, c-format msgid "Error rewinding %s source file: %s." msgstr "Produciuse un erro ao recrear o ficheiro de orixe %s: %s." #: src/language/stats/flip.c:433 #, c-format msgid "Error reading %s temporary file: %s." msgstr "Produciuse un erro o ficheiro temporal %s: %s." #: src/language/stats/flip.c:436 #, c-format msgid "Unexpected end of file reading %s temporary file." msgstr "Atopouse un remate inesperado ao ler o ficheiro temporal %s." #: src/language/stats/frequencies.c:144 #: src/ui/gui/psppire-dialog-action-frequencies.c:49 msgid "Mode" msgstr "Modo" #: src/language/stats/frequencies.c:303 src/language/stats/logistic.c:1381 #: src/output/charts/plot-hist-cairo.c:112 msgid "Frequency" msgstr "Frecuencia" #: src/language/stats/frequencies.c:305 msgid "Valid Percent" msgstr "Porcentaxe válida" #: src/language/stats/frequencies.c:306 src/language/stats/graph.c:208 #, fuzzy #| msgid "Cum Percent" msgid "Cumulative Percent" msgstr "Por. acumulada" #: src/language/stats/frequencies.c:905 msgid "Histogram frequency must be greater than zero." msgstr "A frecuencia do histograma debe ser maior que cero." #: src/language/stats/frequencies.c:923 msgid "Histogram percentage must be greater than zero." msgstr "A porcentaxe do histograma debe ser maior que cero." #: src/language/stats/frequencies.c:1139 #, c-format msgid "" "%s for histogram must be greater than or equal to %s, but %s was specified " "as %.15g and %s as %.15g. %s and %s will be ignored." msgstr "" "%s para o histograma debe ser maior ca ou igual a %s pero %s estaba " "especificado como %.15g e %s como %.15g. %s e %s ignorarase." #: src/language/stats/frequencies.c:1184 #, c-format msgid "" "%s for pie chart must be greater than or equal to %s, but %s was specified " "as %.15g and %s as %.15g. %s and %s will be ignored." msgstr "" "%s para unha gráfica de sectores debe ser maior ou igual ca %s pero %s " "estaba especificado %.15g e %s como %.15g. %s e %s ignorarase." #: src/language/stats/frequencies.c:1474 #, c-format msgid "Omitting pie chart for %s, which has only %d unique values." msgstr "Omítese a gráfica de sectores para %s, que só ten %d valores únicos." #: src/language/stats/frequencies.c:1477 #, c-format msgid "Omitting pie chart for %s, which has over 50 unique values." msgstr "" "Omítese a gráfica de sectores para %s, que ten máis de 50 valores únicos." #: src/language/stats/frequencies.c:1494 src/language/stats/graph.c:205 #: src/language/stats/quick-cluster.c:747 #: src/ui/gui/psppire-dialog-action-crosstabs.c:90 #: src/language/stats/crosstabs.q:789 src/language/stats/crosstabs.q:1262 msgid "Count" msgstr "Contar" #: src/language/stats/friedman.c:220 src/language/stats/kruskal-wallis.c:247 #: src/language/stats/mann-whitney.c:182 src/language/stats/wilcoxon.c:240 msgid "Ranks" msgstr "Posicións" #: src/language/stats/friedman.c:222 src/language/stats/friedman.c:223 #: src/language/stats/kruskal-wallis.c:251 #: src/language/stats/mann-whitney.c:186 src/language/stats/wilcoxon.c:245 msgid "Mean Rank" msgstr "Posición media" #: src/language/stats/friedman.c:253 msgid "Kendall's W" msgstr "W de Kendall" #: src/language/stats/friedman.c:256 src/language/stats/kruskal-wallis.c:298 #: src/language/stats/median.c:353 msgid "Chi-Square" msgstr "Khi cadrado" #: src/language/stats/glm.c:169 msgid "Multivariate analysis is not yet implemented" msgstr "A análise multivariante aínda non está implementada" #: src/language/stats/glm.c:274 msgid "Only types 1, 2 & 3 sums of squares are currently implemented" msgstr "Soamente están implementadas as sumas de cadrados dos tipos 1, 2 e 3" #: src/language/stats/glm.c:727 msgid "Tests of Between-Subjects Effects" msgstr "Tests de efectos entre suxeitos" #: src/language/stats/glm.c:730 #, fuzzy #| msgid "Type %s Sum of Squares" msgid "Type I Sum Of Squares" msgstr "Tipo %s de suma de cadrados" #: src/language/stats/glm.c:731 #, fuzzy #| msgid "Type %s Sum of Squares" msgid "Type II Sum Of Squares" msgstr "Tipo %s de suma de cadrados" #: src/language/stats/glm.c:732 #, fuzzy #| msgid "Type %s Sum of Squares" msgid "Type III Sum Of Squares" msgstr "Tipo %s de suma de cadrados" #: src/language/stats/glm.c:734 src/language/stats/oneway.c:976 #: src/language/stats/regression.c:1026 msgid "Mean Square" msgstr "Media de cadrados" #: src/language/stats/glm.c:735 src/language/stats/oneway.c:977 #: src/language/stats/regression.c:1027 src/language/stats/t-test-indep.c:262 msgid "F" msgstr "F" #: src/language/stats/glm.c:740 msgid "Corrected Model" msgstr "Modelos corrixido" #: src/language/stats/glm.c:740 msgid "Model" msgstr "Modelo" #: src/language/stats/glm.c:752 msgid "Intercept" msgstr "Ordenada na orixe" #: src/language/stats/glm.c:802 src/output/pivot-table.c:763 #: src/output/spv/spv.c:867 msgid "Error" msgstr "Erro" #: src/language/stats/glm.c:819 msgid "Corrected Total" msgstr "Total corrixido" #: src/language/stats/graph.c:206 #, fuzzy #| msgid "_Percentages" msgid "Percentage" msgstr "_Porcentaxes" #: src/language/stats/graph.c:207 #, fuzzy #| msgid "Cumulative %" msgid "Cumulative Count" msgstr "Acumulado %" #: src/language/stats/graph.c:296 #, fuzzy, c-format #| msgid "%s of %s by %s" msgid "%s vs. %s by %s" msgstr "%s de %s por %s" #: src/language/stats/graph.c:303 #, fuzzy, c-format #| msgid "Boxplot of %s vs. %s" msgid "%s vs. %s" msgstr "Diagrama de caixa de %s fronte a %s" #: src/language/stats/graph.c:322 msgid "" "Maximum number of scatterplot categories reached. Your BY variable has too " "many distinct values. The coloring of the plot will not be correct." msgstr "" #: src/language/stats/graph.c:551 src/language/stats/rank.c:636 #, c-format msgid "%s of %s" msgstr "%s de %s" #: src/language/stats/graph.c:698 src/language/stats/graph.c:729 #: src/language/stats/graph.c:777 msgid "Only one chart type is allowed." msgstr "" #: src/language/stats/graph.c:721 src/language/stats/graph.c:820 #: src/language/stats/graph.c:834 #, fuzzy #| msgid "The inline file is not allowed here." msgid "Only one variable is allowed." msgstr "Non se permite o ficheiro en liña aquí." #: src/language/stats/graph.c:843 #, fuzzy #| msgid "Number expected." msgid "Variable expected" msgstr "Esperábase un número." #: src/language/stats/graph.c:883 msgid "FOOTNOTE is not implemented yet for GRAPH" msgstr "" #: src/language/stats/ks-one-sample.c:274 src/ui/gui/ks-one-sample.ui:24 msgid "One-Sample Kolmogorov-Smirnov Test" msgstr "Test Kolmogorov-Smirnov dunha mostra" #: src/language/stats/ks-one-sample.c:284 msgid "Uniform Parameters" msgstr "Parámetros uniformes" #: src/language/stats/ks-one-sample.c:289 msgid "Normal Parameters" msgstr "Parámetros normais" #: src/language/stats/ks-one-sample.c:294 msgid "Poisson Parameters" msgstr "Parámetros de Poisson" #: src/language/stats/ks-one-sample.c:295 #: src/ui/gui/psppire-dialog-action-crosstabs.c:76 #: src/language/stats/crosstabs.q:1421 msgid "Lambda" msgstr "Lambda" #: src/language/stats/ks-one-sample.c:300 msgid "Exponential Parameters" msgstr "Parámetros exponenciais" #: src/language/stats/ks-one-sample.c:308 msgid "Most Extreme Differences" msgstr "As máis extremas diferenzas" #: src/language/stats/ks-one-sample.c:309 msgid "Absolute" msgstr "Absoluto" #: src/language/stats/ks-one-sample.c:309 src/language/stats/roc.c:1037 msgid "Positive" msgstr "Positivo" #: src/language/stats/ks-one-sample.c:309 src/language/stats/roc.c:1037 msgid "Negative" msgstr "Negativo" #: src/language/stats/ks-one-sample.c:312 msgid "Kolmogorov-Smirnov Z" msgstr "Z de Kolmogorov-Smirnov" #: src/language/stats/ks-one-sample.c:313 #: src/language/stats/jonckheere-terpstra.c:374 #: src/language/stats/mann-whitney.c:251 src/language/stats/runs.c:328 #: src/language/stats/wilcoxon.c:284 msgid "Asymp. Sig. (2-tailed)" msgstr "Sign. Asint (2-colas)" #: src/language/stats/logistic.c:327 msgid "All predicted values are either 1 or 0" msgstr "Todos os valores preditos ou ben son 1 ou 0" #: src/language/stats/logistic.c:525 msgid "Dependent variable's values are not dichotomous." msgstr "Os valores dependentes de variábeis non son dicotómicos." #: src/language/stats/logistic.c:614 #, c-format msgid "" "Category %s does not have at least two distinct values. Logistic regression " "will not be run." msgstr "" "A categoría %s non ten cando menos dous valores distintos. A regresión " "loxística non se executará." #: src/language/stats/logistic.c:674 #, c-format msgid "" "Estimation terminated at iteration number %d because parameter estimates " "changed by less than %g" msgstr "" "A estimación terminou na iteración número %d porque o parámetro estimado " "cambiou a menor que %g" #: src/language/stats/logistic.c:686 #, c-format msgid "" "Estimation terminated at iteration number %d because Log Likelihood " "decreased by less than %g%%" msgstr "" "A estimación terminou na iteración número %d porque a log-verosimilitude " "diminuíu a menor que %g%%" #: src/language/stats/logistic.c:701 #, c-format msgid "" "Estimation terminated at iteration number %d because maximum iterations has " "been reached" msgstr "" "A estimación terminou na iteración número %d porque se acadou o máximo de " "iteracións" #: src/language/stats/logistic.c:994 msgid "Cut point value must be in the range [0,1]" msgstr "O valor do punto de corte debe estar no rango [0,1]" #: src/language/stats/logistic.c:1139 msgid "Dependent Variable Encoding" msgstr "Codificación dependente da variábel" #: src/language/stats/logistic.c:1141 msgid "Mapping" msgstr "" #: src/language/stats/logistic.c:1142 msgid "Internal Value" msgstr "Valor interno" #: src/language/stats/logistic.c:1145 msgid "Original Value" msgstr "Valor orixinal" #: src/language/stats/logistic.c:1167 msgid "Variables in the Equation" msgstr "Variábeis na ecuación" #: src/language/stats/logistic.c:1171 src/language/stats/regression.c:902 msgid "B" msgstr "B" #: src/language/stats/logistic.c:1172 msgid "S.E." msgstr "Erro estándar" #: src/language/stats/logistic.c:1173 msgid "Wald" msgstr "Wald" #: src/language/stats/logistic.c:1176 msgid "Exp(B)" msgstr "Exp(B)" #: src/language/stats/logistic.c:1181 #, c-format msgid "%d%% CI for Exp(B)" msgstr "%d%% CI para Exp(B)" #: src/language/stats/logistic.c:1183 src/language/stats/t-test-indep.c:274 #: src/language/stats/t-test-one-sample.c:83 #: src/language/stats/t-test-paired.c:249 src/language/stats/crosstabs.q:1369 msgid "Lower" msgstr "Inferior" #: src/language/stats/logistic.c:1183 src/language/stats/t-test-indep.c:275 #: src/language/stats/t-test-one-sample.c:84 #: src/language/stats/t-test-paired.c:250 src/language/stats/crosstabs.q:1370 msgid "Upper" msgstr "Superior" #: src/language/stats/logistic.c:1189 src/language/stats/logistic.c:1470 msgid "Step 1" msgstr "Paso 1" #: src/language/stats/logistic.c:1263 msgid "Constant" msgstr "Constante" #: src/language/stats/logistic.c:1298 msgid "Model Summary" msgstr "Resumo do modelo" #: src/language/stats/logistic.c:1301 msgid "-2 Log likelihood" msgstr "-2 log-verosimilitude" #: src/language/stats/logistic.c:1302 msgid "Cox & Snell R Square" msgstr "Cadrado R de Cox e Snell" #: src/language/stats/logistic.c:1303 msgid "Nagelkerke R Square" msgstr "Cadrado R de Nagelkerke" #: src/language/stats/logistic.c:1306 src/language/stats/logistic.c:1470 #, fuzzy #| msgid "Step 1" msgid "Step" msgstr "Paso 1" #: src/language/stats/logistic.c:1335 msgid "Unweighted Cases" msgstr "Casos sen ponderar" #: src/language/stats/logistic.c:1336 msgid "Included in Analysis" msgstr "Incluídos na análise" #: src/language/stats/logistic.c:1336 msgid "Missing Cases" msgstr "Casos que faltan" #: src/language/stats/logistic.c:1365 msgid "Categorical Variables' Codings" msgstr "Codificacións de variábeis categóricas" #: src/language/stats/logistic.c:1380 #, fuzzy #| msgid "Encodings" msgid "Codings" msgstr "Codificacións" #: src/language/stats/logistic.c:1383 msgid "Parameter coding" msgstr "Codificación do parámetro" #: src/language/stats/logistic.c:1462 msgid "Classification Table" msgstr "Táboa de clasificación" #: src/language/stats/logistic.c:1466 msgid "Predicted" msgstr "Predito" #: src/language/stats/logistic.c:1466 #, fuzzy #| msgid "" #| "Percentage\n" #| "Correct" msgid "Percentage Correct" msgstr "" "Porcentaxe\n" "Correcta" #: src/language/stats/logistic.c:1468 msgid "Observed" msgstr "Observado" #: src/language/stats/logistic.c:1468 msgid "Overall Percentage" msgstr "Porcentaxe ao incluílo todo" #: src/language/stats/jonckheere-terpstra.c:357 msgid "Jonckheere-Terpstra Test" msgstr "Test de Jonckheere-Terpstra" #: src/language/stats/jonckheere-terpstra.c:364 #, c-format msgid "Number of levels in %s" msgstr "Número de niveis en %s" #: src/language/stats/jonckheere-terpstra.c:370 msgid "Observed J-T Statistic" msgstr "Estatística J-T observada" #: src/language/stats/jonckheere-terpstra.c:371 msgid "Mean J-T Statistic" msgstr "Estatística de media J-T" #: src/language/stats/jonckheere-terpstra.c:372 msgid "Std. Deviation of J-T Statistic" msgstr "Desviación estándar da estatística J-T" #: src/language/stats/jonckheere-terpstra.c:373 msgid "Std. J-T Statistic" msgstr "Estándar da estatística J-T" #: src/language/stats/mann-whitney.c:187 src/language/stats/wilcoxon.c:246 msgid "Sum of Ranks" msgstr "Suma de posicións" #: src/language/stats/mann-whitney.c:248 msgid "Mann-Whitney U" msgstr "U de Mann-Whitney" #: src/language/stats/mann-whitney.c:249 msgid "Wilcoxon W" msgstr "W de Wilcoxon" #: src/language/stats/mann-whitney.c:250 src/language/stats/runs.c:327 #: src/language/stats/wilcoxon.c:283 msgid "Z" msgstr "Z" #: src/language/stats/means.c:702 msgid "Included" msgstr "Incluído" #: src/language/stats/means.c:704 src/language/stats/reliability.c:548 msgid "Excluded" msgstr "Excluído" #: src/language/stats/means.c:753 msgid "Report" msgstr "Informe" #: src/language/stats/means.c:838 #, fuzzy, c-format #| msgid "" #| "Dependent variable %s has no non-missing values. No analysis for this " #| "variable will be done." msgid "" "The table \"%s\" has no non-empty control variables. No result for this " "table will be displayed." msgstr "" "A variábel dependente %s non ten valores perdidos. Non se fará ningunha " "análise para esta variábel." #: src/language/stats/means-calc.c:443 msgid "Group Median" msgstr "Mediana de grupo" #: src/language/stats/means-calc.c:455 msgid "First" msgstr "Primeiro" #: src/language/stats/means-calc.c:456 msgid "Last" msgstr "Derradeiro" #: src/language/stats/means-calc.c:458 msgid "Percent N" msgstr "Porcentaxe N" #: src/language/stats/means-calc.c:459 msgid "Percent Sum" msgstr "Suma de porcentaxe" #: src/language/stats/means-calc.c:461 msgid "Harmonic Mean" msgstr "Media harmónica" #: src/language/stats/means-calc.c:462 msgid "Geom. Mean" msgstr "Media xeométrica" #: src/language/stats/mcnemar.c:144 msgid "The McNemar test is appropriate only for dichotomous variables" msgstr "O test McNemar é apropiado soamente para variábeis dicotómicas" #: src/language/stats/mcnemar.c:226 src/language/stats/sign.c:105 msgid "Point Probability" msgstr "Probabilidade de punto" #: src/language/stats/mcnemar.c:229 src/language/stats/sign.c:78 #: src/language/stats/sign.c:108 src/language/stats/t-test-paired.c:199 #: src/language/stats/t-test-paired.c:257 src/language/stats/wilcoxon.c:253 #: src/language/stats/wilcoxon.c:292 #, fuzzy #| msgid "Pair %d" msgid "Pairs" msgstr "Par %d" #: src/language/stats/median.c:316 msgid "> Median" msgstr "> Mediana" #: src/language/stats/median.c:316 msgid "≤ Median" msgstr "≤ Mediana" #: src/language/stats/npar.c:536 #, c-format msgid "%s subcommand not currently implemented." msgstr "A suborde %s non está implementada neste intre." #: src/language/stats/npar.c:691 #, c-format msgid "Expecting %s, %s, %s or a number." msgstr "Agardábase %s, %s %s ou un número." #: src/language/stats/npar.c:845 #, c-format msgid "" "The specified value of HI (%d) is lower than the specified value of LO (%d)" msgstr "" "O valor especificado de HI (%d) é máis baixo que o valor especificado de LO " "(%d)" #: src/language/stats/npar.c:897 #, c-format msgid "" "%d expected values were given, but the specified range (%d-%d) requires " "exactly %d values." msgstr "" "Producíronse os %d valores esperados pero o rango especificado (%d-%d) " "require exactamente %d valores." #: src/language/stats/npar.c:1118 src/language/stats/t-test-parser.c:173 #, c-format msgid "" "PAIRED was specified but the number of variables preceding WITH (%zu) did " "not match the number following (%zu)." msgstr "" "Especificouse PAIRED pero o número de variábeis precedidas de WITH (%zu) non " "coinciden co seguinte número (%zu)." #: src/language/stats/oneway.c:361 msgid "LSD" msgstr "LSD" #: src/language/stats/oneway.c:362 src/ui/gui/oneway.ui:338 msgid "Tukey HSD" msgstr "HSD Tukey" #: src/language/stats/oneway.c:363 src/ui/gui/oneway.ui:253 msgid "Bonferroni" msgstr "Bonferroni" #: src/language/stats/oneway.c:364 src/ui/gui/oneway.ui:304 msgid "Scheffé" msgstr "Scheffé" #: src/language/stats/oneway.c:365 msgid "Games-Howell" msgstr "Games-Howell" #: src/language/stats/oneway.c:366 src/ui/gui/oneway.ui:321 msgid "Šidák" msgstr "Šidák" #: src/language/stats/oneway.c:519 #, c-format msgid "The post hoc analysis method %s is not supported." msgstr "O método de análise post hoc %s non é compatíbel." #: src/language/stats/oneway.c:842 #, c-format msgid "" "Dependent variable %s has no non-missing values. No analysis for this " "variable will be done." msgstr "" "A variábel dependente %s non ten valores perdidos. Non se fará ningunha " "análise para esta variábel." #: src/language/stats/oneway.c:924 #, c-format msgid "" "In contrast list %zu, the number of coefficients (%zu) does not equal the " "number of groups (%d). This contrast list will be ignored." msgstr "" "En contraste coa lista %zu, o número de coeficientes (%zu) non é igual ao " "número de grupos (%d). Esta lista de contraste ignorarase." #: src/language/stats/oneway.c:936 #, c-format msgid "Coefficients for contrast %zu do not total zero" msgstr "Os coeficientes por contraste (%zu) non son igual a zero" #: src/language/stats/oneway.c:971 msgid "ANOVA" msgstr "ANOVA" #: src/language/stats/oneway.c:974 src/language/stats/regression.c:1024 msgid "Sum of Squares" msgstr "Suma de cadrados" #: src/language/stats/oneway.c:981 msgid "Between Groups" msgstr "Entre grupos" #: src/language/stats/oneway.c:981 msgid "Within Groups" msgstr "Dentro de grupos" #: src/language/stats/oneway.c:1075 src/language/stats/oneway.c:1257 #, fuzzy #| msgid "_Dependent Variable" msgid "Dependent Variable" msgstr "Variábel _dependente" #: src/language/stats/oneway.c:1148 msgid "Test of Homogeneity of Variances" msgstr "Test de homoxeneidade de varianzas" #: src/language/stats/oneway.c:1151 msgid "Levene Statistic" msgstr "Estatística Levene" #: src/language/stats/oneway.c:1152 msgid "df1" msgstr "df1" #: src/language/stats/oneway.c:1153 msgid "df2" msgstr "df2" #: src/language/stats/oneway.c:1192 msgid "Contrast Coefficients" msgstr "Coeficientes de contraste" #: src/language/stats/oneway.c:1199 src/language/stats/oneway.c:1246 msgid "Contrast" msgstr "Contraste" #: src/language/stats/oneway.c:1236 msgid "Contrast Tests" msgstr "Test de contraste" #: src/language/stats/oneway.c:1239 msgid "Value of Contrast" msgstr "Valor de contraste" #: src/language/stats/oneway.c:1241 src/language/stats/regression.c:905 #: src/language/stats/t-test-indep.c:266 #: src/language/stats/t-test-one-sample.c:74 #: src/language/stats/t-test-paired.c:252 msgid "t" msgstr "t" #: src/language/stats/oneway.c:1252 msgid "Assumption" msgstr "" #: src/language/stats/oneway.c:1253 msgid "Assume equal variances" msgstr "Asumir varianzas iguais" #: src/language/stats/oneway.c:1254 #, fuzzy #| msgid "Does not assume equal" msgid "Does not assume equal variances" msgstr "Non se asumen iguais" #: src/language/stats/oneway.c:1367 #, c-format msgid "Multiple Comparisons (%s)" msgstr "Comparacións múltiplas (%s)" #: src/language/stats/oneway.c:1374 #, fuzzy #| msgid "Mean Difference" msgid "Mean Difference (I - J)" msgstr "Diferenza media" #: src/language/stats/oneway.c:1379 #, c-format msgid "%g%% Confidence Interval" msgstr "Intervalo de confianza %g%%" #: src/language/stats/oneway.c:1386 src/language/stats/oneway.c:1390 msgid "(J) Family" msgstr "" #: src/language/stats/oneway.c:1406 #, fuzzy #| msgid "Runs Test" msgid "Test" msgstr "Executa o test" #: src/language/stats/quick-cluster.c:576 msgid "Initial Cluster Centers" msgstr "Centros iniciais de agrupación" #: src/language/stats/quick-cluster.c:577 msgid "Final Cluster Centers" msgstr "Centros finais de agrupación" #: src/language/stats/quick-cluster.c:580 #: src/language/stats/quick-cluster.c:660 #: src/language/stats/quick-cluster.c:661 #: src/language/stats/quick-cluster.c:753 msgid "Cluster" msgstr "Agrupación" #: src/language/stats/quick-cluster.c:658 #, fuzzy #| msgid "Final Cluster Centers" msgid "Cluster Membership" msgstr "Centros finais de agrupación" #: src/language/stats/quick-cluster.c:744 msgid "Number of Cases in each Cluster" msgstr "Número de casos en cada agrupación" #: src/language/stats/quick-cluster.c:750 #, fuzzy #| msgid "Cluster" msgid "Clusters" msgstr "Agrupación" #: src/language/stats/quick-cluster.c:867 #: src/language/stats/quick-cluster.c:893 #, fuzzy, c-format #| msgid "Variable %s already exists." msgid "A variable called `%s' already exists." msgstr "A variábel %s xa existe." #: src/language/stats/quick-cluster.c:908 #, fuzzy, c-format #| msgid "expecting %s or %s" msgid "Expecting %s or %s." msgstr "agardábase %s ou %s" #: src/language/stats/quick-cluster.c:928 msgid "The number of clusters must be positive" msgstr "O número de agrupacións debe ser positivo" #: src/language/stats/quick-cluster.c:944 #, fuzzy #| msgid "The number of iterations must be positive" msgid "The convergence criterion must be positive" msgstr "O número de iteracións debe ser positivo" #: src/language/stats/quick-cluster.c:960 msgid "The number of iterations must be positive" msgstr "O número de iteracións debe ser positivo" #: src/language/stats/rank.c:205 #, c-format msgid "" "Cannot generate variable name for ranking %s with %s. All candidates in use." msgstr "" "Non se pode xerar o nome da variábel para clasificar %s con %s. Todas as " "candidatas xa están utilizadas." #: src/language/stats/rank.c:321 #, c-format msgid "Too many variables in %s clause." msgstr "Demasiadas variábeis na cláusula %s." #: src/language/stats/rank.c:323 #, c-format msgid "Variable %s already exists." msgstr "A variábel %s xa existe." #: src/language/stats/rank.c:325 src/language/expressions/evaluate.c:164 #, c-format msgid "Duplicate variable name %s." msgstr "Nome duplicado da variábel %s." #: src/language/stats/rank.c:631 #, c-format msgid "%s of %s by %s" msgstr "%s de %s por %s" #: src/language/stats/rank.c:825 #, fuzzy #| msgid "Variables Created By %s" msgid "Variables Created by RANK" msgstr "Variábeis creadas por %s" #: src/language/stats/rank.c:828 src/language/stats/rank.c:829 #, fuzzy #| msgid "Name Variable:" msgid "New Variable" msgstr "Nome de variábel:" #: src/language/stats/rank.c:829 #, fuzzy #| msgid "Function: " msgid "Function" msgstr "Función: " #: src/language/stats/rank.c:830 #, fuzzy #| msgid "Extraction" msgid "Fraction" msgstr "Extracción" #: src/language/stats/rank.c:830 #, fuzzy #| msgid "_Grouping Variable:" msgid "Grouping Variables" msgstr "A_grupación de variábeis:" #: src/language/stats/rank.c:833 src/language/stats/rank.c:834 #, fuzzy #| msgid "Insert Variable" msgid "Existing Variable" msgstr "Inserir unha variábel" #: src/language/stats/reliability.c:164 msgid "Reliability on a single variable is not useful." msgstr "O factor de análise dunha soa variábel non é práctico." #: src/language/stats/reliability.c:281 msgid "" "The STATISTICS subcommand is not yet implemented. No statistics will be " "produced." msgstr "" #: src/language/stats/reliability.c:300 msgid "The split point must be less than the number of variables" msgstr "O punto de división debe ser menor ca o número de variábeis" #: src/language/stats/reliability.c:525 #, c-format msgid "Scale: %s" msgstr "Escala: %s" #: src/language/stats/reliability.c:582 msgid "Item-Total Statistics" msgstr "Estatísticas elemento-Total" #: src/language/stats/reliability.c:585 msgid "Scale Mean if Item Deleted" msgstr "Media de escala ao eliminar o elemento" #: src/language/stats/reliability.c:586 msgid "Scale Variance if Item Deleted" msgstr "Varianza de escala ao eliminar o elemento" #: src/language/stats/reliability.c:587 msgid "Corrected Item-Total Correlation" msgstr "Elemento corrixido-Correlación total" #: src/language/stats/reliability.c:588 msgid "Cronbach's Alpha if Item Deleted" msgstr "Alfa de Cronbach ao estaŕ o elemento eliminado" #: src/language/stats/reliability.c:627 msgid "Reliability Statistics" msgstr "Estatísticas de solvencia" #: src/language/stats/reliability.c:634 src/language/stats/reliability.c:646 msgid "Cronbach's Alpha" msgstr "Alfa de Cronbach" #: src/language/stats/reliability.c:635 src/language/stats/reliability.c:649 #: src/language/stats/reliability.c:652 msgid "N of Items" msgstr "N de elementos" #: src/language/stats/reliability.c:647 msgid "Part 1" msgstr "Part 1" #: src/language/stats/reliability.c:650 msgid "Part 2" msgstr "Part 2" #: src/language/stats/reliability.c:654 msgid "Total N of Items" msgstr "N total de elementos" #: src/language/stats/reliability.c:656 msgid "Correlation Between Forms" msgstr "Correlación entre formas" #: src/language/stats/reliability.c:659 msgid "Spearman-Brown Coefficient" msgstr "Coeficiente Spearman-Brown" #: src/language/stats/reliability.c:660 msgid "Equal Length" msgstr "Lonxitude igual" #: src/language/stats/reliability.c:661 msgid "Unequal Length" msgstr "Lonxitude desigual" #: src/language/stats/reliability.c:663 msgid "Guttman Split-Half Coefficient" msgstr "Coeficiente de subdivisión das metades de Guttman" #: src/language/stats/roc.c:966 msgid "Area Under the Curve" msgstr "Área baixo a curva" #: src/language/stats/roc.c:970 msgid "Area" msgstr "Área" #: src/language/stats/roc.c:976 msgid "Asymptotic Sig." msgstr "Sign. asintótica" #: src/language/stats/roc.c:979 #, c-format msgid "Asymp. %g%% Confidence Interval" msgstr "Asint. %g%% Intervalo de confianza" #: src/language/stats/roc.c:987 msgid "Variable under test" msgstr "Variábel baixo test" #: src/language/stats/roc.c:1026 msgid "Case Summary" msgstr "Resumo do casao" #: src/language/stats/roc.c:1030 msgid "Unweighted" msgstr "Sen ponderación" #: src/language/stats/roc.c:1031 msgid "Weighted" msgstr "Ponderado" #: src/language/stats/roc.c:1064 msgid "Coordinates of the Curve" msgstr "Coordinadas da curva" #: src/language/stats/roc.c:1068 msgid "Positive if greater than or equal to" msgstr "Positivo se é superior ou igual ca" #: src/language/stats/roc.c:1069 src/output/charts/roc-chart-cairo.c:38 msgid "Sensitivity" msgstr "Sensibilidade" #: src/language/stats/roc.c:1069 src/output/charts/roc-chart-cairo.c:37 msgid "1 - Specificity" msgstr "1 - Especificidade" #: src/language/stats/roc.c:1072 #, fuzzy #| msgid "ordinary" msgid "Coordinates" msgstr "ordinario" #: src/language/stats/roc.c:1076 msgid "Test variable" msgstr "Variábel de test" #: src/language/stats/regression.c:224 src/language/stats/regression.c:229 #, fuzzy, c-format #| msgid "%s may not appear after %s." msgid "VARIABLES may not appear after %s" msgstr "%s pode non aparecer tras %s." #: src/language/stats/regression.c:412 msgid "" "REGRESSION with SAVE ignores TEMPORARY. Temporary transformations will be " "made permanent." msgstr "" "REGRESSION con SAVE ignora TEMPORARY. As transformacións temporais faranse " "permanentes." #: src/language/stats/regression.c:416 #, fuzzy #| msgid "" #| "REGRESSION with SAVE ignores TEMPORARY. Temporary transformations will " #| "be made permanent." msgid "REGRESSION with SAVE ignores FILTER. All cases will be processed." msgstr "" "REGRESSION con SAVE ignora TEMPORARY. As transformacións temporais faranse " "permanentes." #: src/language/stats/regression.c:569 msgid "" "The dependent variable is equal to the independent variable. The least " "squares line is therefore Y=X. Standard errors and related statistics may be " "meaningless." msgstr "" "A variábel dependente é igual á variábel independente. A liña de cadrados " "mínimos é pois Y=X. Os erros estándar e as estatísticas relacionadas poida " "que non teñan sentido." #: src/language/stats/regression.c:776 msgid "No valid data found. This command was skipped." msgstr "Non se atoparon datos válidos. Omitiuse esta orde." #: src/language/stats/regression.c:863 #, c-format msgid "Model Summary (%s)" msgstr "Resumo do modelo (%s)" #: src/language/stats/regression.c:868 #: src/ui/gui/psppire-dialog-action-regression.c:42 msgid "R" msgstr "R" #: src/language/stats/regression.c:868 msgid "R Square" msgstr "Cadrado R" #: src/language/stats/regression.c:868 msgid "Adjusted R Square" msgstr "Cadrado R axustado" #: src/language/stats/regression.c:869 msgid "Std. Error of the Estimate" msgstr "Erro estánd. do estimado" #: src/language/stats/regression.c:895 #, c-format msgid "Coefficients (%s)" msgstr "Coeficientes (%s)" #: src/language/stats/regression.c:901 msgid "Unstandardized Coefficients" msgstr "Coeficientes non estandarizados" #: src/language/stats/regression.c:904 msgid "Standardized Coefficients" msgstr "Coeficientes estandarizados" #: src/language/stats/regression.c:904 msgid "Beta" msgstr "Beta" #: src/language/stats/regression.c:911 #, c-format msgid "%g%% Confidence Interval for B" msgstr "%g%% Intervalo de confianza para B" #: src/language/stats/regression.c:919 #, fuzzy #| msgid "Reliability Statistics" msgid "Collinearity Statistics" msgstr "Estatísticas de solvencia" #: src/language/stats/regression.c:920 #, fuzzy #| msgid "Covariance" msgid "Tolerance" msgstr "Covarianza" #: src/language/stats/regression.c:920 msgid "VIF" msgstr "" #: src/language/stats/regression.c:933 msgid "(Constant)" msgstr "(Constante)" #: src/language/stats/regression.c:1020 #, c-format msgid "ANOVA (%s)" msgstr "ANOVA (%s)" #: src/language/stats/regression.c:1031 src/ui/gui/regression.ui:24 msgid "Regression" msgstr "Regresión" #: src/language/stats/regression.c:1075 #, c-format msgid "Coefficient Correlations (%s)" msgstr "Correlacións de coeficiente (%s)" #: src/language/stats/regression.c:1082 #, fuzzy #| msgid "Model" msgid "Models" msgstr "Modelo" #: src/language/stats/regression.c:1090 msgid "Covariances" msgstr "Covarianzas" #: src/language/stats/runs.c:169 #, c-format msgid "" "Multiple modes exist for variable `%s'. Using %.*g as the threshold value." msgstr "" "Existen múltiplos modos da variábel «%s». Utilízase %.*g como valor limiar." #: src/language/stats/runs.c:314 src/ui/gui/runs.ui:24 msgid "Runs Test" msgstr "Executa o test" #: src/language/stats/runs.c:319 msgid "Test Value" msgstr "Valor do test" #: src/language/stats/runs.c:320 msgid "Test Value (mode)" msgstr "Valor do test (modo)" #: src/language/stats/runs.c:321 msgid "Test Value (mean)" msgstr "Valor do test (media)" #: src/language/stats/runs.c:322 msgid "Test Value (median)" msgstr "Valor do test (media)" #: src/language/stats/runs.c:323 msgid "Cases < Test Value" msgstr "Casos < Valor do test" #: src/language/stats/runs.c:324 msgid "Cases ≥ Test Value" msgstr "Casos ≥ Valor do test" #: src/language/stats/runs.c:325 msgid "Total Cases" msgstr "Total de casos" #: src/language/stats/runs.c:326 msgid "Number of Runs" msgstr "Número de execucións" #: src/language/stats/sign.c:72 #, fuzzy #| msgid "Mean Difference" msgid "Differences" msgstr "Diferenza media" #: src/language/stats/sign.c:73 msgid "Negative Differences" msgstr "Diferenzas negativas" #: src/language/stats/sign.c:74 msgid "Positive Differences" msgstr "Diferenzas positivas" #: src/language/stats/sign.c:75 src/language/stats/wilcoxon.c:250 msgid "Ties" msgstr "Vínculos" #: src/language/stats/sort-cases.c:63 msgid "Buffer limit must be at least 2." msgstr "O límite do búfer debe ser cando menos 2." #: src/language/stats/sort-criteria.c:89 #, c-format msgid "Variable %s specified twice in sort criteria." msgstr "Especificouse a variábel %s dúas veces como criterio de ordenación." #: src/language/stats/t-test-indep.c:190 msgid "Group Statistics" msgstr "Estatísticas de grupo" #: src/language/stats/t-test-indep.c:200 #, fuzzy #| msgid "Group1" msgid "Group" msgstr "Grupo1" #: src/language/stats/t-test-indep.c:256 msgid "Independent Samples Test" msgstr "Test de mostras independentes" #: src/language/stats/t-test-indep.c:261 msgid "Levene's Test for Equality of Variances" msgstr "Test de Levene sobre igualdade de varianzas" #: src/language/stats/t-test-indep.c:265 #, fuzzy #| msgid "t-test for Equality of Means" msgid "T-Test for Equality of Means" msgstr "Test t sobre igualdade de medias" #: src/language/stats/t-test-indep.c:269 #: src/language/stats/t-test-one-sample.c:77 msgid "Mean Difference" msgstr "Diferenza media" #: src/language/stats/t-test-indep.c:270 msgid "Std. Error Difference" msgstr "Diferenza de erro estándar" #: src/language/stats/t-test-indep.c:273 #, fuzzy, no-c-format #| msgid "%g%% Confidence Interval of the Difference" msgid "95% Confidence Interval of the Difference" msgstr "%g%% Intervalo de confianza da diferenza" #: src/language/stats/t-test-indep.c:277 #, fuzzy #| msgid "Options" msgid "Assumptions" msgstr "Opcións" #: src/language/stats/t-test-indep.c:278 msgid "Equal variances assumed" msgstr "Igualdade de varianzas asumida" #: src/language/stats/t-test-indep.c:279 msgid "Equal variances not assumed" msgstr "Igualdade de varianzas non asumida" #: src/language/stats/t-test-one-sample.c:64 msgid "One-Sample Test" msgstr "Test dunha soa mostra" #: src/language/stats/t-test-one-sample.c:71 #, fuzzy, c-format #| msgid "Test Value = %f" msgid "Test Value = %.*g" msgstr "Valor do test = %f" #: src/language/stats/t-test-one-sample.c:80 #: src/language/stats/t-test-paired.c:246 #, c-format msgid "%g%% Confidence Interval of the Difference" msgstr "%g%% Intervalo de confianza da diferenza" #: src/language/stats/t-test-one-sample.c:122 msgid "One-Sample Statistics" msgstr "Estatísticas dunha soa mostra" #: src/language/stats/t-test-paired.c:147 msgid "Paired Sample Statistics" msgstr "Estatísticas dunha mostra emparellada" #: src/language/stats/t-test-paired.c:163 #: src/language/stats/t-test-paired.c:205 #: src/language/stats/t-test-paired.c:263 #, fuzzy, c-format #| msgid "Pair %d" msgid "Pair %zu" msgstr "Par %d" #: src/language/stats/t-test-paired.c:190 msgid "Paired Samples Correlations" msgstr "Correlacións de mostras emparelladas" #: src/language/stats/t-test-paired.c:208 #, c-format msgid "%s & %s" msgstr "%s e %s" #: src/language/stats/t-test-paired.c:234 msgid "Paired Samples Test" msgstr "Test de mostras emparelladas" #: src/language/stats/t-test-paired.c:240 msgid "Paired Differences" msgstr "Diferenzas emparelladas" #: src/language/stats/t-test-paired.c:266 #, c-format msgid "%s - %s" msgstr "%s - %s" #: src/language/stats/t-test-parser.c:133 #, c-format msgid "When applying %s to a string variable, two values must be specified." msgstr "" "Ao aplicar %s a unha variábel de cadea, deben especificarse dous valores." #: src/language/stats/t-test-parser.c:145 #: src/language/stats/t-test-parser.c:241 #, c-format msgid "%s subcommand may not be used with %s." msgstr "A suborde %s non se debe utilizar con %s." #: src/language/stats/t-test-parser.c:305 msgid "Exactly one of TESTVAL, GROUPS and PAIRS subcommands must be specified." msgstr "" "Deben especificarse exactamente unha das ordes TESTVAL, GROUPS e PAIRS." #: src/language/stats/wilcoxon.c:248 #, fuzzy #| msgid "_Sign" msgid "Sign" msgstr "A_sinar" #: src/language/stats/wilcoxon.c:249 msgid "Negative Ranks" msgstr "Posicións negativas" #: src/language/stats/wilcoxon.c:249 msgid "Positive Ranks" msgstr "Posicións positivas" #: src/language/stats/wilcoxon.c:296 #, fuzzy #| msgid "Too many pairs to calculate exact significance." msgid "Too many pairs to calculate exact significance" msgstr "Demasiados pares para calcular unha significancia exacta." #: src/language/data-io/combine-files.c:214 msgid "Cannot specify the active dataset since none has been defined." msgstr "" "Non se pode especificar o conxunto de datos activo xa que non se definiu " "ningún." #: src/language/data-io/combine-files.c:220 msgid "" "This command may not be used after TEMPORARY when the active dataset is an " "input source. Temporary transformations will be made permanent." msgstr "" "Esta orde non se debe utilizar despois de TEMPORARY cando o conxunto de " "datos activo é unha fonte de entrada. As transformacións temporais faranse " "permanentes." #: src/language/data-io/combine-files.c:255 msgid "Multiple IN subcommands for a single FILE or TABLE." msgstr "Múltiplas subordes IN para un só FILE ou TABLE." #: src/language/data-io/combine-files.c:308 #, c-format msgid "File %s lacks BY variable %s." msgstr "O ficheiro %s carece da variábel BY %s." #: src/language/data-io/combine-files.c:311 #, c-format msgid "Active dataset lacks BY variable %s." msgstr "O conxunto de datos activo carece de variábel BY %s." #: src/language/data-io/combine-files.c:388 #: src/language/data-io/combine-files.c:393 #, c-format msgid "BY is required when %s is specified." msgstr "Requírese BY cando se especifica %s." #: src/language/data-io/combine-files.c:521 msgid "" "Combining files with incompatible encodings. String data may not be " "represented correctly." msgstr "" "A combinación de ficheiros con codificacións incompatíbeis. Os datos da " "cadea non se poden representar correctamente." #: src/language/data-io/combine-files.c:564 #, c-format msgid "" "Variable %s in file %s has different type or width from the same variable in " "earlier file." msgstr "" "A variábel %s do ficheiro %s ten un tipo ou largo diferentes respecto da " "mesma variábel no ficheiro anterior." #: src/language/data-io/combine-files.c:570 #, c-format msgid "In file %s, %s is numeric." msgstr "No ficheiro %s, %s é numérico." #: src/language/data-io/combine-files.c:573 #, c-format msgid "In file %s, %s is a string variable with width %d." msgstr "No ficheiro %s, %s é unha variábel de cadea con largura %d." #: src/language/data-io/combine-files.c:578 #, c-format msgid "In an earlier file, %s was numeric." msgstr "Nun ficheiro anterior, %s era numérica." #: src/language/data-io/combine-files.c:581 #, c-format msgid "In an earlier file, %s was a string variable with width %d." msgstr "Nun ficheiro anterior, %s era unha variábel de cadea con largura %d." #: src/language/data-io/combine-files.c:621 #, c-format msgid "" "Variable name %s specified on %s subcommand duplicates an existing variable " "name." msgstr "" "O nome de variábel %s especificada na suborde %s duplica un nome de variábel " "existente." #: src/language/data-io/combine-files.c:793 #, c-format msgid "Encountered %zu sets of duplicate cases in the master file." msgstr "Atopáronse %zu conxuntos de casos duplicados no ficheiro mestre." #: src/language/data-io/data-list.c:129 src/language/data-io/data-list.c:144 #, fuzzy, c-format #| msgid "%s must not be negative." msgid "The %s value must be non-negative." msgstr "%s debe non ser negativo." #: src/language/data-io/data-list.c:154 #, c-format msgid "The %s subcommand may only be used within %s." msgstr "A suborde %s soamente pode utilizarse dentro de %s." #: src/language/data-io/data-list.c:159 #, c-format msgid "The %s subcommand may only be specified once." msgstr "A suborde %s soamente pode especificarse unha vez." #: src/language/data-io/data-list.c:197 msgid "Only one of FIXED, FREE, or LIST may be specified." msgstr "Soamente pode especificarse unha, ben FIXED, FREE ou LIST." #: src/language/data-io/data-list.c:260 msgid "Encoding should not be specified for inline data. It will be ignored." msgstr "" "A codificación non debería especificarse para datos en liña. Ignorarase." #: src/language/data-io/data-list.c:269 #, c-format msgid "The %s subcommand may be used only with %s." msgstr "A suborde %s soamente pode utilizarse con %s." #: src/language/data-io/data-list.c:284 src/language/data-io/matrix-data.c:578 msgid "At least one variable must be specified." msgstr "Debe especificarse como mínimo unha variábel." #: src/language/data-io/data-list.c:383 src/language/data-io/data-list.c:491 #: src/language/data-io/get-data.c:662 #, c-format msgid "%s is a duplicate variable name." msgstr "%s é un nome de variábel duplicado." #: src/language/data-io/data-list.c:390 #, c-format msgid "There is already a variable %s of a different type." msgstr "Xa existe unha variábel %s dun tipo diferente." #: src/language/data-io/data-list.c:397 #, c-format msgid "There is already a string variable %s of a different width." msgstr "Xa existe unha variábel de cadea %s dunha largura diferente." #: src/language/data-io/data-list.c:405 #, c-format msgid "Cannot place variable %s on record %d when RECORDS=%d is specified." msgstr "" "Non se pode situar a variábel %s no rexistro %d cando se especifica RECORDS=" "%d." #: src/language/data-io/data-parser.c:453 #: src/language/data-io/data-parser.c:462 msgid "Quoted string extends beyond end of line." msgstr "A cadea delimitada por comiñas esténdese alén do remate de liña." #: src/language/data-io/data-parser.c:488 msgid "Missing delimiter following quoted string." msgstr "Falta o delimitador tras a cadea con comiñas." #: src/language/data-io/data-parser.c:506 #, c-format msgid "Data for variable %s is not valid as format %s: %s" msgstr "Os datos para a variábel %s non son válidos como formato %s: %s" #: src/language/data-io/data-parser.c:536 #, c-format msgid "Partial case of %d of %d records discarded." msgstr "Caso parcial de %d de %d rexistros desbotados." #: src/language/data-io/data-parser.c:592 #, c-format msgid "Partial case discarded. The first variable missing was %s." msgstr "Caso parcial desbotado. A primeira variábel que faltou era %s." #: src/language/data-io/data-parser.c:634 #, c-format msgid "" "Missing value(s) for all variables from %s onward. These will be filled " "with the system-missing value or blanks, as appropriate." msgstr "" "Valor(es) que falta para todas as variábeis desde %s en diante. Estas " "cubriranse co valor de sistema que falta ou están en branco, como apropiado." #: src/language/data-io/data-parser.c:655 msgid "Record ends in data not part of any field." msgstr "O rexistro remata en datos que non son parte de ningún campo." #: src/language/data-io/data-parser.c:670 #, c-format msgid "Reading %d record from %s." msgid_plural "Reading %d records from %s." msgstr[0] "Lendo o rexistro %d de %s." msgstr[1] "Lendo %d rexistros de %s." #: src/language/data-io/data-parser.c:680 src/language/data-io/print.c:435 msgid "Record" msgstr "Rexistro" #: src/language/data-io/data-parser.c:680 src/language/data-io/print.c:435 #: src/ui/gui/psppire-var-sheet-header.c:76 msgid "Columns" msgstr "Columnas" #: src/language/data-io/data-parser.c:680 #: src/language/data-io/data-parser.c:725 src/language/data-io/print.c:435 msgid "Format" msgstr "Formato" #: src/language/data-io/data-parser.c:720 #, c-format msgid "Reading free-form data from %s." msgstr "Lendo os datos sen forma de %s." #. TRANSLATORS: this fragment will be interpolated into #. messages in fh_lock() that identify types of files. #: src/language/data-io/data-reader.c:136 src/language/data-io/data-writer.c:79 msgid "data file" msgstr "ficheiro de datos" #: src/language/data-io/data-reader.c:160 #, c-format msgid "Could not open `%s' for reading as a data file: %s." msgstr "Non se pode abrir «%s» para ler como ficheiro de datos: %s." #: src/language/data-io/data-reader.c:174 #, c-format msgid "Could not read `%s' as a text file with encoding `%s': %s." msgstr "" "Non foi posíbel ler «%s» como ficheiro de texto con codificación «%s»:%s." #: src/language/data-io/data-reader.c:233 #, c-format msgid "" "Missing %s while reading inline data. This probably indicates a missing or " "incorrectly formatted %s command. %s must appear by itself on a single line " "with exactly one space between words." msgstr "" "Perdeuse %s mentres se lían datos ligados en liña. Isto indica seguramente " "unha orde %s que falta ou que está incorrectamente formatada: %s debe " "aparecer por si mesma nunha única liña con exactamente un espazo entre " "palabras." #: src/language/data-io/data-reader.c:253 #: src/language/data-io/data-reader.c:387 #, c-format msgid "Error reading file %s: %s." msgstr "Produciuse un erro ao ler o ficheiro %s: %s." #: src/language/data-io/data-reader.c:261 #, c-format msgid "Unexpected end of file in partial record reading %s." msgstr "" "Ao ler %s atopouse un inesperado final de ficheiro no rexistro parcial." #: src/language/data-io/data-reader.c:321 #, c-format msgid "Corrupt block descriptor word at offset 0x%lx in %s." msgstr "Hai un palabra descritora de bloque corrupto na posición 0x%lx en %s." #: src/language/data-io/data-reader.c:322 #, c-format msgid "Corrupt record descriptor word at offset 0x%lx in %s." msgstr "" "Hai un palabra descritora de rexistro corrupto na posición 0x%lx en %s." #: src/language/data-io/data-reader.c:335 #, c-format msgid "Corrupt record size at offset 0x%lx in %s." msgstr "Hai un tamaño de rexistro corrupto na posición 0x%lx en %s." #: src/language/data-io/data-reader.c:493 msgid "Record exceeds remaining block length." msgstr "O rexistro sobarda a largura remanente do bloque." #: src/language/data-io/data-reader.c:567 #, c-format msgid "Attempt to read beyond end-of-file on file %s." msgstr "Tentar ler alén do final da liña no ficheiro %s." #: src/language/data-io/data-reader.c:570 #, c-format msgid "Attempt to read beyond %s." msgstr "Tentar ler alén de %s." #: src/language/data-io/data-reader.c:733 msgid "" "This command is not valid here since the current input program does not " "access the inline file." msgstr "" "Esta orde non é válida aquí xa que o actual programa de entrada non accede " "ao ficheiro ligado (inline)." #: src/language/data-io/data-writer.c:106 #, c-format msgid "An error occurred while opening `%s' for writing as a data file: %s." msgstr "" "Produciuse un erro ao abrir «%s» para a súa escritura como ficheiro de " "datos: %s." #: src/language/data-io/data-writer.c:224 #, c-format msgid "I/O error occurred writing data file `%s'." msgstr "Produciuse un erro E/S ao escribir o ficheiro de datos «%s»." #: src/language/data-io/dataset.c:64 #, c-format msgid "There is no dataset named %s." msgstr "Non hai ningún conxunto de datos chamado %s." #: src/language/data-io/dataset.c:250 #, fuzzy #| msgid "Dataset" msgid "Datasets" msgstr "Conxunto de datos" #: src/language/data-io/dataset.c:263 msgid "unnamed dataset" msgstr "conxunto de datos sen nome" #: src/language/data-io/file-handle.c:61 #, c-format msgid "" "File handle %s is already defined. Use %s before redefining a file handle." msgstr "" "O ficheiro que manipula %s xa está definido. Utilice %s antes de redefinir o " "ficheiro de manipulación." #: src/language/data-io/file-handle.c:241 #, c-format msgid "%s must be specified with %s." msgstr "%s debe especificarse con %s." #: src/language/data-io/file-handle.c:252 #, c-format msgid "" "The specified file mode requires LRECL. Assuming %zu-character records." msgstr "" "O modo de ficheiro especificado requires LRECL. Asúmense os rexistros co " "carácter %zu." #: src/language/data-io/file-handle.c:256 #, fuzzy, c-format #| msgid "" #| "Record length (%ld) must be between 1 and %lu bytes. Assuming %zu-" #| "character records." msgid "" "Record length (%d) must be between 1 and %lu bytes. Assuming %zu-character " "records." msgstr "" "A largura do rexistro (%ld) debe estar entre 1 e %lu bytes. Asúmense os " "rexistros co carácter %zu." #: src/language/data-io/file-handle.c:300 msgid "file" msgstr "ficheiro" #: src/language/data-io/file-handle.c:302 msgid "inline file" msgstr "ficheiro enlazado" #: src/language/data-io/file-handle.c:350 msgid "expecting a file name or handle name" msgstr "agardando un nome de ficheiro ou de manexador" #: src/language/data-io/file-handle.c:365 #, c-format msgid "Handle for %s not allowed here." msgstr "Aquí non se permite o manexador de %s." #: src/language/data-io/get-data.c:108 src/output/measure.c:262 #, c-format msgid "error reading file `%s'" msgstr "produciuse un erro ao ler o ficheiro «%s»" #: src/language/data-io/get-data.c:127 #, c-format msgid "Unsupported TYPE %s." msgstr "O TYPE %s non é compatíbel." #: src/language/data-io/get-data.c:278 msgid "The sheet index must be greater than or equal to 1" msgstr "O índice da folla debe ser maior ca ou igual a 1" #: src/language/data-io/get-data.c:285 src/language/data-io/get-data.c:308 #: src/language/data-io/get-data.c:327 #, c-format msgid "%s must be followed by either \"%s\" or \"%s\"." msgstr "%s debe ir seguido ben de «%s» ou de «%s»." #: src/language/data-io/get-data.c:357 #, c-format msgid "" "%s is allowed only with %s arrangement, but %s arrangement was stated or " "implied earlier in this command." msgstr "" "Soamente se permite %s co axuste %s pero, previamente, fixouse o axuste %s " "nesta orde." #: src/language/data-io/get-data.c:441 src/language/data-io/get-data.c:479 #, c-format msgid "Value of %s must be 1 or greater." msgstr "O valor de %s debe ser 1 ou maior." #: src/language/data-io/get-data.c:504 msgid "" "Ignoring obsolete IMPORTCASES subcommand. (N OF CASES or SAMPLE may be used " "to substitute.)" msgstr "" #: src/language/data-io/get-data.c:551 msgid "" "In compatible syntax mode, the QUALIFIER string must contain exactly one " "character." msgstr "" "No modo de sintaxe compatíbel, a cadea QUALIFIER debe conter exactamente un " "carácter." #: src/language/data-io/get-data.c:583 #, c-format msgid "" "The record number specified, %ld, is at or before the previous record, %d. " "Data fields must be listed in order of increasing record number." msgstr "" "O número de rexistro especificado, %ld, está en ou antes do rexistro previo, " "%d. Os campos de datos deben listarse en orde crecente de número de rexistro." #: src/language/data-io/get-data.c:592 #, c-format msgid "" "The record number specified, %ld, exceeds the number of records per case " "specified on FIXCASE, %d." msgstr "" "O número de rexistro especificado, %ld excede o número de rexistros por caso " "especificado en FIXCASE, %d." #: src/language/data-io/get.c:132 #, c-format msgid "%s: Data file dictionary has no variables." msgstr "" #: src/language/data-io/inpt-pgm.c:133 #, c-format msgid "Unexpected end-of-file within %s." msgstr "Final de ficheiro inesperado dentro de %s." #: src/language/data-io/inpt-pgm.c:146 #, c-format msgid "Input program must contain %s or %s." msgstr "O programa de entrada debe conter %s ou %s." #: src/language/data-io/inpt-pgm.c:152 msgid "Input program did not create any variables." msgstr "O programa de entrada non creou ningunha variábel." #: src/language/data-io/inpt-pgm.c:365 msgid "" "REREAD: Column numbers must be positive finite numbers. Column set to 1." msgstr "" "REREAD: Os número de columna deben ser números finitos positivos. O axuste " "da columna está como 1." #: src/language/data-io/list.c:100 #, fuzzy #| msgid "Dataset" msgid "Data List" msgstr "Conxunto de datos" #: src/language/data-io/list.c:221 #, c-format msgid "" "The first case (%ld) specified precedes the last case (%ld) specified. The " "values will be swapped." msgstr "" "O primeiro caso (%ld) especificado precede ao último caso (%ld) " "especificado. Trocaranse os valores." #: src/language/data-io/list.c:230 #, fuzzy, c-format #| msgid "" #| "The first case (%ld) to list is less than 1. The value is being reset to " #| "1." msgid "" "The first case (%ld) to list is numbered less than 1. The value is being " "reset to 1." msgstr "" "O primeiro caso (%ld) na listaxe é menor ca 1. O valor restabelecerase a 1." #: src/language/data-io/list.c:237 #, fuzzy, c-format #| msgid "" #| "The last case (%ld) to list is less than 1. The value is being reset to " #| "1." msgid "" "The last case (%ld) to list is numbered less than 1. The value is being " "reset to 1." msgstr "" "O último caso (%ld) na listaxe é menor ca 1. O valor restabelecerase a 1." #: src/language/data-io/list.c:244 #, c-format msgid "The step value %ld is less than 1. The value is being reset to 1." msgstr "" "O valor de paso %ld e menor ca 1. O valor está sendo restabelecido a 1." #: src/language/data-io/placement-parser.c:96 #, c-format msgid "" "Number of variables specified (%zu) differs from number of variable formats " "(%zu)." msgstr "" "O número de variábeis especificado (%zu) difire do número de formatos de " "variábel (%zu)." #: src/language/data-io/placement-parser.c:106 msgid "" "SPSS-like or Fortran-like format specification expected after variable names." msgstr "" "Agardábase unha especificación de formato tipo SPSS ou tipo Fortran tras os " "nomes das variábeis." #: src/language/data-io/placement-parser.c:129 #, c-format msgid "The %d columns %d-%d can't be evenly divided into %zu fields." msgstr "As %d columnas %d-%d non se poden dividir por igual en %zu campos." #: src/language/data-io/placement-parser.c:310 msgid "Column positions for fields must be positive." msgstr "As posicións das columnas para os campos deben ser positivas." #: src/language/data-io/placement-parser.c:312 msgid "Column positions for fields must not be negative." msgstr "As posicións das columnas para os campos non deben ser negativas." #: src/language/data-io/placement-parser.c:372 msgid "The ending column for a field must be greater than the starting column." msgstr "" "A columna de remate para un campo debe ser maior que a columna de inicio." #: src/language/data-io/placement-parser.c:409 #, fuzzy, c-format #| msgid "" #| "The record number specified, %ld, is at or before the previous record, " #| "%d. Data fields must be listed in order of increasing record number." msgid "" "The record number specified, %.0f, is at or before the previous record, %d. " "Data fields must be listed in order of increasing record number." msgstr "" "O número de rexistro especificado, %ld, está en ou antes do rexistro previo, " "%d. Os campos de datos deben listarse en orde crecente de número de rexistro." #: src/language/data-io/print-space.c:127 #, c-format msgid "The expression on %s evaluated to the system-missing value." msgstr "A expresión %s avaliada para o valor do sistema que falta." #: src/language/data-io/print-space.c:130 #, c-format msgid "The expression on %s evaluated to %g." msgstr "A expresión %s avaliada para %g." #: src/language/data-io/print.c:189 src/language/data-io/trim.c:58 msgid "expecting a valid subcommand" msgstr "agardábase unha suborde válida" #: src/language/data-io/print.c:219 #, c-format msgid "%s is required when binary formats are specified." msgstr "Requírese %s cando se especifican os formatos binarios." #: src/language/data-io/print.c:302 #, c-format msgid "Output calls for %d records but %zu specified on RECORDS subcommand." msgstr "" "Chamadas de saída para %d rexistros pero especificouse %zu na suborde " "RECORDS." #: src/language/data-io/print.c:432 #, fuzzy #| msgid "Case Processing Summary" msgid "Print Summary" msgstr "Resumo de procesamento do caso" #: src/language/data-io/print.c:462 #, fuzzy #| msgid "Record" msgid "N of Records" msgstr "Rexistro" #: src/language/data-io/matrix-data.c:191 #, c-format msgid "" "There are %d variable declared but the data has at least %d matrix rows." msgstr "" #: src/language/data-io/matrix-data.c:292 msgid "" "The N subcommand was specified, but a N record was also found in the data. " "The N record will be ignored." msgstr "" #: src/language/data-io/matrix-data.c:488 src/language/utilities/set.q:186 #, c-format msgid "%s must not be negative." msgstr "%s debe non ser negativo." #: src/language/data-io/matrix-data.c:568 #, fuzzy #| msgid "%s and %s are mutually exclusive" msgid "FORMAT = FULL and FORMAT = NODIAGONAL are mutually exclusive." msgstr "%s e %s son mutuamente exclusivos" #: src/language/data-io/matrix-reader.c:102 #: src/language/data-io/matrix-reader.c:118 #, fuzzy, c-format #| msgid "Active dataset lacks BY variable %s." msgid "Matrix dataset lacks a variable called %s." msgstr "O conxunto de datos activo carece de variábel BY %s." #: src/language/data-io/matrix-reader.c:109 #: src/language/data-io/matrix-reader.c:125 #, c-format msgid "Matrix dataset variable %s should be of string type." msgstr "" #: src/language/data-io/save-translate.c:168 #: src/language/data-io/save-translate.c:183 #, c-format msgid "The %s string must contain exactly one character." msgstr "A cadea %s debe conter exactamente un carácter." #: src/language/data-io/save-translate.c:249 #, c-format msgid "Output file `%s' exists but %s was not specified." msgstr "O ficheiro de saída «%s» existe pero non se especificou %s." #: src/language/data-io/save.c:309 msgid "The OUTFILE or METADATA subcommand is required." msgstr "" #: src/language/data-io/trim.c:69 #, c-format msgid "" "Cannot rename %s as %s because there already exists a variable named %s. To " "rename variables with overlapping names, use a single RENAME subcommand such " "as `/RENAME (A=B)(B=C)(C=A)', or equivalently, `/RENAME (A B C=B C A)'." msgstr "" "Non se pode renomear %s como %s porque xa existe unha variábel nomeada %s. " "Para renomear variábeis con nomes sobrepostos, utilice unha única orde " "RENAME como «/RENAME (A=B)(B=C)(C=A)», ou equivalentemente «/RENAME (A B C=B " "C A)»." #: src/language/data-io/trim.c:227 #, c-format msgid "" "Number of variables on left side of `=' (%zu) does not match number of " "variables on right side (%zu), in parenthesized group %d of RENAME " "subcommand." msgstr "" "O número de variábeis á esquerda de «=» (%zu) non coincide co número de " "variábeis á dereita (%zu), no grupo entre parénteses %d da suborde RENAME." #: src/language/data-io/trim.c:242 #, c-format msgid "Requested renaming duplicates variable name %s." msgstr "Solicitouse o renomeamento de nomes de variábel %s duplicados." #: src/language/data-io/trim.c:281 msgid "Cannot DROP all variables from dictionary." msgstr "Non se pode DROP todas as variábeis do dicionario." #: src/language/expressions/evaluate.c:151 msgid "expecting number or string" msgstr "agárdase o número ou a cadea" #: src/language/expressions/helpers.c:43 msgid "" "One of the arguments to a DATE function is not an integer. The result will " "be system-missing." msgstr "" "Un dos argumentos para unha función DATE non é un enteiro. O resultado será " "que falta o sistema." #: src/language/expressions/helpers.c:71 msgid "" "The week argument to DATE.WKYR is not an integer. The result will be system-" "missing." msgstr "" "O argumento semana para unha función DATE.WKYR non é un enteiro. O resultado " "será que falta o sistema." #: src/language/expressions/helpers.c:77 msgid "" "The week argument to DATE.WKYR is outside the acceptable range of 1 to 53. " "The result will be system-missing." msgstr "" "O argumento semana para unha función DATE.WKYR está fóra do rango aceptado " "de 1 a 53. O resultado será que falta o sistema." #: src/language/expressions/helpers.c:99 msgid "" "The day argument to DATE.YRDAY is not an integer. The result will be system-" "missing." msgstr "" "O argumento día para DATE.YRDAY non é un enteiro. O resultado será que falta " "o sistema." #: src/language/expressions/helpers.c:105 msgid "" "The day argument to DATE.YRDAY is outside the acceptable range of 1 to 366. " "The result will be system-missing." msgstr "" "O argumento día para DATE.YRDAY está fóra do rango aceptábel entre 1 e 366. " "O resultado será que falta o sistema." #: src/language/expressions/helpers.c:127 msgid "" "The year argument to YRMODA is greater than 47516. The result will be " "system-missing." msgstr "" "O argumento ano para YRMODA é maior de 47516. O resultado será que falta o " "sistema." #: src/language/expressions/helpers.c:180 #, c-format msgid "" "Unrecognized date unit `%.*s'. Valid date units are `%s', `%s', `%s', `%s', " "`%s', `%s', `%s', and `%s'." msgstr "" "Unidade descoñecida de data «%.*s». As unidades válidas para unha data son " "«%s», «%s», «%s», «%s», «%s», «%s», «%s» e «%s»." #: src/language/expressions/helpers.c:333 #, c-format msgid "Invalid DATESUM method. Valid choices are `%s' and `%s'." msgstr "Método DATESUM incorrecto. As escollas válidas son «%s» e «%s»." #: src/language/expressions/parse.c:261 #, c-format msgid "" "Type mismatch: expression has %s type, but a numeric value is required here." msgstr "" "Non coincide o tipo: a expresión ten o tipo %s pero aquí requírese un valor " "numérico." #: src/language/expressions/parse.c:274 #, c-format msgid "" "Type mismatch: expression has %s type, but a string value is required here." msgstr "" "Non coincide o tipo: a expresión ten o tipo %s pero aquí requírese un valor " "de cadea." #: src/language/expressions/parse.c:436 #, c-format msgid "Type mismatch while applying %s operator: cannot convert %s to %s." msgstr "" "O tipo non coincide ao aplicar o operador %s: non se pode converter %s en %s." #: src/language/expressions/parse.c:650 msgid "" "Chaining relational operators (e.g. `a < b < c') will not produce the " "mathematically expected result. Use the AND logical operator to fix the " "problem (e.g. `a < b AND b < c'). If chaining is really intended, " "parentheses will disable this warning (e.g. `(a < b) < c'.)" msgstr "" "Ensarillar operadores relacionais (i.e. «a < b < c») non producirá o " "resultado matematicamente agardado. Utilice o operador lóxico AND para " "arranxar o problema (i.e. «a < b AND b < c»). Se o ensarillamento é " "realmente o pretendido, poden desactivarse estes avisos (i.e. «(a < b) < c»)." #: src/language/expressions/parse.c:752 msgid "" "The exponentiation operator (`**') is left-associative, even though right-" "associative semantics are more useful. That is, `a**b**c' equals " "`(a**b)**c', not as `a**(b**c)'. To disable this warning, insert " "parentheses." msgstr "" "O operador exponencial (`**') asóciase cara á esquerda malia que a semántica " "de asociación á súa dereita é mesmo máis práctica. Isto é, `a**b**c' " "equivale a `(a**b)**c', non a `a**(b**c)'. Para desactivar este aviso, " "insira paréntese." #: src/language/expressions/parse.c:832 #, c-format msgid "Unknown system variable %s." msgstr "Variábel de sistema %s descoñecida." #: src/language/expressions/parse.c:880 #, c-format msgid "Unknown identifier %s." msgstr "Identificador descoñecido %s." #: src/language/expressions/parse.c:1102 #, c-format msgid "%s must have at least %d arguments in list." msgstr "%s debe ter cando menos %d argumentos na lista." #: src/language/expressions/parse.c:1111 #, c-format msgid "%s must have an even number of arguments in list." msgstr "%s debe ter igual número de argumentos na lista." #: src/language/expressions/parse.c:1114 #, c-format msgid "%s must have multiple of %d arguments in list." msgstr "%s debe ter %d argumentos múltiplos na lista." #: src/language/expressions/parse.c:1124 #, c-format msgid "%s function does not accept a minimum valid argument count." msgstr "A función %s non acepta unha conta como argumento mínimo válido." #: src/language/expressions/parse.c:1133 #, c-format msgid "%s requires at least %d valid arguments in list." msgstr "%s require cando menos %d argumentos válidos na lista." #: src/language/expressions/parse.c:1139 #, c-format msgid "" "With %s, using minimum valid argument count of %d does not make sense when " "passing only %d arguments in list." msgstr "" "Con %s, a utilización dunha conta como argumento mínimo válido de %d non ten " "sentido ao pasar soamente %d argumentos na lista." #: src/language/expressions/parse.c:1193 #, c-format msgid "Type mismatch invoking %s as " msgstr "O tipo non coincide ao invocar %s como " #: src/language/expressions/parse.c:1198 msgid "Function invocation " msgstr "Función de invocación " #: src/language/expressions/parse.c:1200 msgid " does not match any known function. Candidates are:" msgstr " non coincide con ningunha función coñecida. As candidatas son:" #: src/language/expressions/parse.c:1230 #, c-format msgid "No function or vector named %s." msgstr "Non hai ningunha función nin vector nomeado %s." #: src/language/expressions/parse.c:1292 #, c-format msgid "%s is a PSPP extension." msgstr "%s é unha extensión de PSPP." #: src/language/expressions/parse.c:1295 #, c-format msgid "%s is not available in this version of PSPP." msgstr "%s non está dispoñíbel nesta versión de PSPP." #: src/language/expressions/parse.c:1302 #, c-format msgid "%s may not appear after %s." msgstr "%s pode non aparecer tras %s." #: src/libpspp/ext-array.c:66 msgid "failed to create temporary file" msgstr "fallou ao crear un ficheiro temporal" #: src/libpspp/ext-array.c:106 msgid "seeking in temporary file" msgstr "buscando no ficheiro temporal" #: src/libpspp/ext-array.c:125 msgid "reading temporary file" msgstr "lendo o ficheiro temporal" #: src/libpspp/ext-array.c:127 msgid "unexpected end of file reading temporary file" msgstr "" "Atopouse inesperadamente o remate do ficheiro ao ler o ficheiro temporal" #: src/libpspp/ext-array.c:147 msgid "writing to temporary file" msgstr "escribindo no ficheiro temporal" #: src/libpspp/i18n.c:1128 msgid "Arabic" msgstr "Árabe" #: src/libpspp/i18n.c:1130 msgid "Armenian" msgstr "Armenio" #: src/libpspp/i18n.c:1131 msgid "Baltic" msgstr "Báltico" #: src/libpspp/i18n.c:1133 msgid "Celtic" msgstr "Céltico" #: src/libpspp/i18n.c:1134 msgid "Central European" msgstr "Europeo central" #: src/libpspp/i18n.c:1136 msgid "Chinese Simplified" msgstr "Chinés" #: src/libpspp/i18n.c:1138 msgid "Chinese Traditional" msgstr "Chinés tradicional" #: src/libpspp/i18n.c:1140 msgid "Croatian" msgstr "Croata" #: src/libpspp/i18n.c:1141 msgid "Cyrillic" msgstr "Cirílico" #: src/libpspp/i18n.c:1143 msgid "Cyrillic/Russian" msgstr "Cirílico/Ruso" #: src/libpspp/i18n.c:1144 msgid "Cyrillic/Ukrainian" msgstr "Cirílico/Ucraíno" #: src/libpspp/i18n.c:1146 msgid "Georgian" msgstr "Xeorxiano" #: src/libpspp/i18n.c:1147 msgid "Greek" msgstr "Grego" #: src/libpspp/i18n.c:1148 msgid "Gujarati" msgstr "Guxaratí" #: src/libpspp/i18n.c:1149 msgid "Gurmukhi" msgstr "Gurmukhi" #: src/libpspp/i18n.c:1150 msgid "Hebrew" msgstr "Hebreo" #: src/libpspp/i18n.c:1152 msgid "Hebrew Visual" msgstr "Hebreo visual" #: src/libpspp/i18n.c:1153 msgid "Hindi" msgstr "Hindi" #: src/libpspp/i18n.c:1154 msgid "Icelandic" msgstr "Islandés" #: src/libpspp/i18n.c:1155 msgid "Japanese" msgstr "Xaponés" #: src/libpspp/i18n.c:1157 msgid "Korean" msgstr "Coreano" #: src/libpspp/i18n.c:1159 msgid "Nordic" msgstr "Nórdico" #: src/libpspp/i18n.c:1160 msgid "Romanian" msgstr "Romanés" #: src/libpspp/i18n.c:1162 msgid "South European" msgstr "Europeo do Sur" #: src/libpspp/i18n.c:1163 msgid "Thai" msgstr "Tailandés" #: src/libpspp/i18n.c:1165 msgid "Turkish" msgstr "Turco" #: src/libpspp/i18n.c:1167 msgid "Vietnamese" msgstr "Vietnamita" #: src/libpspp/i18n.c:1169 msgid "Western European" msgstr "Europeo occidental" #: src/libpspp/message.c:89 #, c-format msgid "%s: %s" msgstr "%s: %s" #: src/libpspp/message.c:113 msgid "error" msgstr "erro" #: src/libpspp/message.c:115 msgid "warning" msgstr "aviso" #: src/libpspp/message.c:118 msgid "note" msgstr "nota" #: src/libpspp/message.c:327 #, c-format msgid "Notes (%d) exceed limit (%d). Suppressing further notes." msgstr "As notas (%d) exceden o límite (%d). Suprimiranse notas posteriores." #: src/libpspp/message.c:335 #, c-format msgid "Warnings (%d) exceed limit (%d). Syntax processing will be halted." msgstr "(%d) avisos excede o límite (%d). Deterase a sintaxe de procesamento." #: src/libpspp/message.c:338 #, c-format msgid "Errors (%d) exceed limit (%d). Syntax processing will be halted." msgstr "(%d) erros excede o límite (%d). Deterase a sintaxe de procesamento." #: src/libpspp/zip-reader.c:202 #, fuzzy, c-format #| msgid "Corrupt file at 0x%llx: Expected %; got %" msgid "%s: corrupt archive at 0x%llx: expected %# but got %#" msgstr "Ficheiro corrupto en 0x%llx: Agardábase %; obtívose %" #: src/libpspp/zip-reader.c:329 src/libpspp/zip-reader.c:449 #, fuzzy, c-format #| msgid "%s: seek failed (%s)." msgid "%s: open failed (%s)" msgstr "%s: fallou a pesquisa (%s)." #: src/libpspp/zip-reader.c:344 #, fuzzy, c-format #| msgid "Cannot find central directory" msgid "%s: cannot find central directory" msgstr "Non se pode atopar o directorio central" #: src/libpspp/zip-reader.c:353 src/libpspp/zip-reader.c:384 #: src/libpspp/zip-reader.c:468 #, fuzzy, c-format #| msgid "%s: seek failed (%s)." msgid "%s: seek failed (%s)" msgstr "%s: fallou a pesquisa (%s)." #: src/libpspp/zip-reader.c:441 #, fuzzy, c-format #| msgid "%s: unknown option `%s'" msgid "%s: unknown member \"%s\"" msgstr "%s: a opción «%s» é descoñecida" #: src/libpspp/zip-reader.c:503 #, fuzzy, c-format #| msgid "" #| "Name mismatch in zip archive. Central directory says `%s'; local file " #| "header says `%s'" msgid "" "%s: name mismatch between central directory (%s) and local file header (%s)" msgstr "" "O nome non coincide no arquivo zip. O directorio central di «%s»; a " "cabeceira do ficheiro local di «%s»" #: src/libpspp/zip-reader.c:696 #, fuzzy, c-format #| msgid "Cannot initialize inflator: %s" msgid "%s: cannot initialize inflator (%s)" msgstr "Non se pode inicializar o inchador: %s" #: src/libpspp/zip-reader.c:751 #, fuzzy, c-format #| msgid "Error inflating: %s" msgid "%s: error inflating \"%s\" (%s)" msgstr "Produciuse un erro ao inchar: %s" #: src/libpspp/zip-writer.c:97 utilities/pspp-convert.c:346 #, c-format msgid "%s: error opening output file" msgstr "%s: produciuse un erro ao abrir o ficheiro de resultado" #: src/libpspp/zip-writer.c:169 #, c-format msgid "%s: error seeking in output file" msgstr "%s: produciuse un erro ao buscar no ficheiro de resultado" #: src/libpspp/zip-writer.c:210 msgid "error creating temporary file" msgstr "Produciuse un erro ao crear o ficheiro temporal" #: src/libpspp/zip-writer.c:279 #, c-format msgid "%s: write failed" msgstr "%s: fallou a escrita" #. TRANSLATORS: This is a format string which, when presented to #. printf like functions, will create a pango markup string to #. display real number in scientific notation. #. #. In its untranslated form, it will display similar to "1.23 x 10^4". You #. can leave it untranslated if this is how scientific notation is usually #. presented in your language. #. #. Some locales (such as German) prefer the centered dot rather than the #. multiplication sign between the mantissa an exponent. In which #. case, you can change "#215;" to "#8901;" or other unicode code #. point as appropriate. #. #. The . in this string does not and should not be changed, since #. that is taken care of by the stdc library. #. #. For information on Pango markup, see #. http://developer.gnome.org/pango/stable/PangoMarkupFormat.html #. #. For tables of unicode code points, see http://unicode.org/charts #. #: src/math/chart-geometry.c:123 #, c-format msgid "%%.%dlf×10%d" msgstr "" #: src/math/histogram.c:145 msgid "" "Not creating histogram because the data contains less than 2 distinct values" msgstr "" "Non se creou o histograma porque os datos conteñen menos de 2 valores " "distintos" #: src/math/percentiles.c:36 msgid "HAverage" msgstr "MediaH" #: src/math/percentiles.c:38 msgid "Rounded" msgstr "Arredondeada" #: src/math/percentiles.c:39 msgid "Empirical" msgstr "Empírica" #: src/math/percentiles.c:40 msgid "Empirical with averaging" msgstr "Empírica con cálculo de media" #: src/math/shapiro-wilk.c:84 msgid "" "One or more weight values are non-integer. Fractional parts will be ignored " "when calculating the Shapiro-Wilk statistic." msgstr "" #: src/output/ascii.c:340 #, c-format msgid "ascii: opening output file `%s'" msgstr "ascii: abrindo o ficheiro de resultado «%s»" #: src/output/ascii.c:371 #, c-format msgid "%s: %s must be positive integer or `auto'" msgstr "%s: %s debe ser un enteiro positivo ou «auto»" #: src/output/ascii.c:393 #, fuzzy, c-format #| msgid "" #| "ascii: page excluding margins and headers must be at least %d characters " #| "wide by %d lines long, but as configured is only %d characters by %d lines" msgid "" "ascii: page must be at least %d characters wide, but as configured is only " "%d characters" msgstr "" "ascii: a páxina sacando marxes e cabeceiras debe ter cando menos %d " "caracteres de largura por %d liñas de lonxitude pero actualmente está " "configurada con %d caracteres por %d liñas soamente" #: src/output/ascii.c:508 #, c-format msgid "See %s for a chart." msgstr "Vexa %s para unha gráfica." #: src/output/charts/piechart.c:54 msgid "*MISSING*" msgstr "" #: src/output/csv.c:100 src/output/html.c:117 src/output/journal.c:166 #: src/output/msglog.c:68 #, c-format msgid "error opening output file `%s'" msgstr "produciuse un erro ao abrir o ficheiro de resultado «%s»" #: src/output/driver.c:522 #, c-format msgid "%s is not a valid device type (the choices are `%s' and `%s')" msgstr "" "%s non é un tipo de dispositivo válido (as posibilidades son «%s» e «%s»)" #: src/output/driver.c:536 #, c-format msgid "%s: unknown option `%s'" msgstr "%s: a opción «%s» é descoñecida" #: src/output/driver.c:553 #, c-format msgid "%s: output option missing `='" msgstr "%s: falta a opción de saída «=»" #: src/output/driver.c:560 #, c-format msgid "%s: output option specified more than once" msgstr "%s: especificouse a opción de saída máis dunha vez" #: src/output/html.c:129 msgid "PSPP Output" msgstr "Resultado PSPP" #: src/output/html.c:266 msgid "No description" msgstr "Sen descrición" #: src/output/journal.c:69 #, c-format msgid "error writing output file `%s'" msgstr "produciuse un erro ao escribir o ficheiros de resultado «%s»" #: src/output/measure.c:68 #, c-format msgid "`%s' is not a valid length." msgstr "«%s» é unha largura incorrecta." #: src/output/measure.c:96 #, c-format msgid "syntax error in paper size `%s'" msgstr "erro de sintaxe no tamaño do papel «%s»" #: src/output/measure.c:233 #, c-format msgid "unknown paper type `%.*s'" msgstr "O tipo de papel «%.*s» resulta descoñecido" #: src/output/measure.c:251 #, c-format msgid "error opening input file `%s'" msgstr "produciuse un erro ao abrir un ficheiro de entrada «%s»" #: src/output/measure.c:279 #, fuzzy, c-format #| msgid "paper size file `%s' does not state a paper size" msgid "file `%s' does not state a paper size" msgstr "o ficheiro de tamaño de papel «%s» non fixa ningún tamaño de papel" #: src/output/options.c:112 #, c-format msgid "%s: `%s' is `%s' but a Boolean value is required" msgstr "%s: «%s» é «%s» pero requírese un valor booleano" #: src/output/options.c:187 #, c-format msgid "%s: `%s' is `%s' but one of the following is required: %s" msgstr "%s: «%s» é «%s» pero requírese un dos seguintes: %s" #: src/output/options.c:231 #, fuzzy, c-format #| msgid "%s: `%s' is `%s' but a nonnegative integer is required" msgid "%s: `%s' is `%s' but a non-negative integer is required" msgstr "%s: «%s» é «%s» pero requírese un enteiro non negativo" #: src/output/options.c:235 #, c-format msgid "%s: `%s' is `%s' but a positive integer is required" msgstr "%s: «%s» é «%s» pero requírese un enteiro positivo" #: src/output/options.c:238 #, c-format msgid "%s: `%s' is `%s' but an integer is required" msgstr "%s: «%s» é «%s» pero requírese un enteiro" #: src/output/options.c:241 #, c-format msgid "%s: `%s' is `%s' but an integer greater than %d is required" msgstr "%s: «%s» é «%s» pero requírese un enteiro máis grande ca %d" #: src/output/options.c:246 #, c-format msgid "%s: `%s' is `%s' but an integer between %d and %d is required" msgstr "%s: «%s» é «%s» pero requírese un enteiro entre %d e %d" #: src/output/options.c:325 #, c-format msgid "%s: `%s' is `%s' but a file name that contains `#' is required." msgstr "%s: «%s» é «%s» pero requírese un nome de ficheiro que conteña «#»." #. TRANSLATORS: Do not translate this string. If the script of your language #. reads from right to left (eg Persian, Arabic, Hebrew etc), then replace #. this string with "output-direction-rtl". Otherwise either leave it #. untranslated or copy it verbatim. #: src/output/render.c:994 msgid "output-direction-ltr" msgstr "" #: src/output/text-item.c:44 msgid "Page Title" msgstr "" #: src/output/text-item.c:47 msgid "Title" msgstr "" #: src/output/text-item.c:51 msgid "Log" msgstr "" #: src/output/text-item.c:54 msgid "Page Break" msgstr "" #: src/output/cairo.c:520 #, c-format msgid "`%s': bad font specification" msgstr "«%s»: mala especificación de letra" #: src/output/cairo.c:744 #, c-format msgid "" "The defined page is not wide enough to hold at least %d characters in the " "default font. In fact, there's only room for %d characters." msgstr "" "A páxina fixada non é abondo larga para conter cando menos %d caracteres no " "tipo de letra predeterminado. De feito, só hai sitio para %d caracteres." #: src/output/cairo.c:752 #, c-format msgid "" "The defined page is not long enough to hold at least %d lines in the default " "font. In fact, there's only room for %d lines." msgstr "" "A páxina fixada non é abondo longa para conter cando menos %d liñas no tipo " "de letra predeterminado. De feito, só hai sitio para %d liñas." #: src/output/cairo.c:837 #, c-format msgid "error opening output file `%s': %s" msgstr "produciuse un erro ao abrir o ficheiro de resultado «%s»: %s" #: src/output/cairo.c:892 #, c-format msgid "error drawing output for %s driver: %s" msgstr "produciuse un erro ao debuxar o resultado co controlador %s: %s" #: src/output/cairo.c:2056 #, c-format msgid "error writing output file `%s': %s" msgstr "produciuse un erro ao escribir no ficheiro de resultado «%s»: %s" #: src/output/charts/np-plot-cairo.c:37 #, c-format msgid "Normal Q-Q Plot of %s" msgstr "Debuxo normal Q-Q de %s" #: src/output/charts/np-plot-cairo.c:38 src/output/charts/np-plot-cairo.c:68 msgid "Observed Value" msgstr "Valor observado" #: src/output/charts/np-plot-cairo.c:39 msgid "Expected Normal" msgstr "Agardábase o normal" #: src/output/charts/np-plot-cairo.c:67 #, c-format msgid "Detrended Normal Q-Q Plot of %s" msgstr "Debuxo normal Q-Q sen tendencias de %s" #: src/output/charts/np-plot-cairo.c:69 msgid "Dev from Normal" msgstr "Desv. de normal" #: src/output/charts/barchart-cairo.c:65 msgid "Bar Chart" msgstr "" #: src/output/charts/plot-hist-cairo.c:43 #, c-format msgid "N = %.2f" msgstr "N = %.2f" #: src/output/charts/plot-hist-cairo.c:52 #, c-format msgid "Mean = %.1f" msgstr "Media = %.1f" #: src/output/charts/plot-hist-cairo.c:61 #, c-format msgid "Std. Dev = %.2f" msgstr "Desv. Est. = %.2f" #: src/output/charts/plot-hist-cairo.c:110 msgid "HISTOGRAM" msgstr "HISTOGRAMA" #: src/output/charts/roc-chart-cairo.c:36 src/ui/gui/roc.ui:24 msgid "ROC Curve" msgstr "Curva ROC" #: src/output/charts/scree-cairo.c:36 msgid "Scree Plot" msgstr "Diagrama de sedimentación" #: src/output/charts/scree-cairo.c:38 msgid "Eigenvalue" msgstr "Raíz característica" #: src/output/charts/spreadlevel-cairo.c:37 #, c-format msgid "Spread vs. Level Plot of %s" msgstr "Diagrama de dispersión contra o de nivel de %s" #: src/output/charts/spreadlevel-cairo.c:38 msgid "Level" msgstr "Nivel" #: src/output/charts/spreadlevel-cairo.c:39 msgid "Spread" msgstr "Dispersión" #: src/output/charts/scatterplot-cairo.c:57 #, c-format msgid "Scatterplot %s" msgstr "" #: src/output/spv/spv-legacy-decoder.c:2222 msgid "Table lacks cell data." msgstr "" #: src/output/spv/spv-writer.c:68 #, fuzzy, c-format #| msgid "%s: write failed" msgid "%s: create failed" msgstr "%s: fallou a escrita" #: src/output/spv/spv-writer.c:89 #, fuzzy #| msgid "%s: error writing output file" msgid "I/O error writing SPV file" msgstr "%s: produciuse un erro ao escribir o ficheiro de resultado" #: src/output/spv/spv.c:693 #, fuzzy, c-format #| msgid "failed to create temporary file" msgid "%s: Failed to create XML parser" msgstr "fallou ao crear un ficheiro temporal" #: src/output/spv/spv.c:718 #, c-format msgid "%s: document is not well-formed" msgstr "" #: src/output/spv/spv.c:726 #, c-format msgid "%s: root node is \"%s\" but \"%s\" was expected" msgstr "" #: src/ui/gui/psppire-acr.c:273 msgid "Add" msgstr "" #: src/ui/gui/psppire-acr.c:274 #, fuzzy #| msgid "_Edit" msgid "Edit" msgstr "_Editar" #: src/ui/gui/psppire-acr.c:275 msgid "Remove" msgstr "" #: src/ui/gui/psppire-buttonbox.c:311 msgid "OK" msgstr "" #: src/ui/gui/psppire-buttonbox.c:319 msgid "Go To" msgstr "" #: src/ui/gui/psppire-buttonbox.c:327 msgid "Continue" msgstr "Continuar" #: src/ui/gui/psppire-buttonbox.c:339 src/ui/gui/psppire-import-assistant.c:759 msgid "Paste" msgstr "" #: src/ui/gui/psppire-buttonbox.c:345 #: src/ui/gui/psppire-dialog-action-aggregate.c:216 #: src/ui/gui/psppire-data-window.c:496 src/ui/gui/psppire-data-window.c:624 #: src/ui/gui/psppire-output-window.c:353 #: src/ui/gui/psppire-syntax-window.c:594 src/ui/gui/psppire-window.c:445 #: src/ui/gui/psppire-window.c:628 #, fuzzy #| msgid "Covariance" msgid "Cancel" msgstr "Covarianza" #: src/ui/gui/psppire-buttonbox.c:351 msgid "Close" msgstr "" #: src/ui/gui/psppire-buttonbox.c:358 src/ui/gui/psppire-import-assistant.c:760 #, fuzzy #| msgid "_Reset" msgid "Reset" msgstr "_Reiniciar" #: src/ui/gui/psppire-buttonbox.c:365 #, fuzzy #| msgid "_Help" msgid "Help" msgstr "A_xuda" #: src/ui/gui/psppire-dialog-action-aggregate.c:213 msgid "Aggregate destination file" msgstr "Agregar o ficheiro de destino" #: src/ui/gui/psppire-dialog-action-aggregate.c:217 #: src/ui/gui/psppire-data-window.c:493 src/ui/gui/psppire-data-window.c:497 #: src/ui/gui/psppire-output-window.c:354 #: src/ui/gui/psppire-syntax-window.c:595 src/ui/gui/psppire-window.c:449 #: src/ui/gui/aggregate.ui:565 msgid "Save" msgstr "Gardar" #: src/ui/gui/psppire-dialog-action-aggregate.c:226 #: src/ui/gui/psppire-data-window.c:503 msgid "System Files (*.sav)" msgstr "Ficheiros de sistema (*.sav)" #: src/ui/gui/psppire-dialog-action-aggregate.c:231 #: src/ui/gui/psppire-data-window.c:508 msgid "Compressed System Files (*.zsav)" msgstr "Ficheiros de sistema comprimidos (*.zsav)" #: src/ui/gui/psppire-dialog-action-aggregate.c:236 #: src/ui/gui/psppire-data-window.c:513 src/ui/gui/psppire-window.c:652 msgid "Portable Files (*.por) " msgstr "Ficheiros portábeis (*.por) " #: src/ui/gui/psppire-dialog-action-autorecode.c:337 #: src/ui/gui/psppire-dialog-action-recode.c:535 #: src/ui/gui/psppire-dialog-action-recode-different.c:288 msgid "New" msgstr "Nova" #: src/ui/gui/psppire-dialog-action-autorecode.c:351 #: src/ui/gui/psppire-dialog-action-recode.c:527 #: src/ui/gui/psppire-dialog-action-recode-different.c:301 msgid "Old" msgstr "Vella" #: src/ui/gui/psppire-dialog-action-comments.c:142 #, c-format msgid "Column Number: %d" msgstr "Número de columna: %d" #: src/ui/gui/psppire-dialog-action-crosstabs.c:71 msgid "Chisq" msgstr "Khicadrado" #: src/ui/gui/psppire-dialog-action-crosstabs.c:71 msgid "" "Pearson chi-square, likelihood ratio, Fisher’s exact test, continuity " "correction, linear-by-linear association." msgstr "" #: src/ui/gui/psppire-dialog-action-crosstabs.c:74 #: src/language/stats/crosstabs.q:1334 msgid "Phi" msgstr "Phi" #: src/ui/gui/psppire-dialog-action-crosstabs.c:75 msgid "CC" msgstr "CC" #: src/ui/gui/psppire-dialog-action-crosstabs.c:75 #, fuzzy #| msgid "Contingency Coefficient" msgid "Contingency coefficient" msgstr "Coeficiente de continxencia" #: src/ui/gui/psppire-dialog-action-crosstabs.c:77 msgid "UC" msgstr "UC" #: src/ui/gui/psppire-dialog-action-crosstabs.c:77 #, fuzzy #| msgid "Uncertainty Coefficient" msgid "Uncertainty coefficient" msgstr "Coeficiente de incerteza" #: src/ui/gui/psppire-dialog-action-crosstabs.c:78 msgid "BTau" msgstr "BTau" #: src/ui/gui/psppire-dialog-action-crosstabs.c:78 #, fuzzy #| msgid "Kendall's tau-b" msgid "Kendall's Tau-b" msgstr "Tau b de Kendall" #: src/ui/gui/psppire-dialog-action-crosstabs.c:79 msgid "CTau" msgstr "CTau" #: src/ui/gui/psppire-dialog-action-crosstabs.c:79 #, fuzzy #| msgid "Kendall's tau-c" msgid "Kendall's Tau-c" msgstr "Tau c de Kendall" #: src/ui/gui/psppire-dialog-action-crosstabs.c:80 msgid "Risk" msgstr "Riscos" #: src/ui/gui/psppire-dialog-action-crosstabs.c:80 #, fuzzy #| msgid "Risk estimate." msgid "Relative Risk estimate" msgstr "Estimar risco." #: src/ui/gui/psppire-dialog-action-crosstabs.c:81 #: src/language/stats/crosstabs.q:1338 msgid "Gamma" msgstr "Gamma" #: src/ui/gui/psppire-dialog-action-crosstabs.c:82 msgid "D" msgstr "D" #: src/ui/gui/psppire-dialog-action-crosstabs.c:82 #, fuzzy #| msgid "Somers' d" msgid "Somer's d" msgstr "d de Somers" #: src/ui/gui/psppire-dialog-action-crosstabs.c:83 #: src/language/stats/crosstabs.q:1344 msgid "Kappa" msgstr "Kappa" #: src/ui/gui/psppire-dialog-action-crosstabs.c:83 msgid "Cohen's Kappa" msgstr "" #: src/ui/gui/psppire-dialog-action-crosstabs.c:84 #: src/language/stats/crosstabs.q:1429 msgid "Eta" msgstr "Eta" #: src/ui/gui/psppire-dialog-action-crosstabs.c:85 msgid "Corr" msgstr "Corr" #: src/ui/gui/psppire-dialog-action-crosstabs.c:85 #, fuzzy #| msgid "Spearman Correlation" msgid "Spearman correlation, Pearson's r" msgstr "Correlación de Spearman" #: src/ui/gui/psppire-dialog-action-crosstabs.c:90 #, fuzzy #| msgid "Frequency" msgid "Frequency Count" msgstr "Frecuencia" #: src/ui/gui/psppire-dialog-action-crosstabs.c:91 msgid "Row" msgstr "Fila" #: src/ui/gui/psppire-dialog-action-crosstabs.c:91 #, fuzzy #| msgid "Percent" msgid "Row percent" msgstr "Porcentual" #: src/ui/gui/psppire-dialog-action-crosstabs.c:92 msgid "Column" msgstr "Columna" #: src/ui/gui/psppire-dialog-action-crosstabs.c:92 #, fuzzy #| msgid "Cum Percent" msgid "Column percent" msgstr "Por. acumulada" #: src/ui/gui/psppire-dialog-action-crosstabs.c:93 #, fuzzy #| msgid "Valid Percent" msgid "Total percent" msgstr "Porcentaxe válida" #: src/ui/gui/psppire-dialog-action-crosstabs.c:94 #: src/language/stats/crosstabs.q:1266 msgid "Expected" msgstr "Agardábase" #: src/ui/gui/psppire-dialog-action-crosstabs.c:94 #, fuzzy #| msgid "Expected Values:" msgid "Expected value" msgstr "Valores agardados:" #: src/ui/gui/psppire-dialog-action-crosstabs.c:96 #: src/language/stats/crosstabs.q:1268 msgid "Std. Residual" msgstr "Residual estándar" #: src/ui/gui/psppire-dialog-action-crosstabs.c:96 #, fuzzy #| msgid "Std. Residual" msgid "Standardized Residual" msgstr "Residual estándar" #: src/ui/gui/psppire-dialog-action-crosstabs.c:97 msgid "Adjusted Std. Residual" msgstr "Residual estándar axustado" #: src/ui/gui/psppire-dialog-action-descriptives.c:45 msgid "Standard error" msgstr "Erro estándar" #: src/ui/gui/psppire-dialog-action-descriptives.c:45 #, fuzzy #| msgid "Standard error of the mean" msgid "Standard error of mean" msgstr "Erro estándar da media" #: src/ui/gui/psppire-dialog-action-descriptives.c:47 #, fuzzy #| msgid "Standard error of the kurtosis" msgid "Kurtosis and standard error of kurtosis" msgstr "Desviación estándar da curtose" #: src/ui/gui/psppire-dialog-action-descriptives.c:48 #, fuzzy #| msgid "Standard error of the skewness" msgid "Skewness and standard error of skewness" msgstr "Desviación típica da asimetría" #: src/ui/gui/psppire-dialog-action-factor.c:323 #, c-format msgid "_Eigenvalues over %4.2f times the mean eigenvalue" msgstr "" "As raíc_es características están unhas %4.2f veces por riba da media das " "raíces características" #: src/ui/gui/psppire-dialog-action-frequencies.c:44 msgid "Standard error of the mean" msgstr "Erro estándar da media" #: src/ui/gui/psppire-dialog-action-frequencies.c:47 msgid "Standard error of the skewness" msgstr "Desviación típica da asimetría" #: src/ui/gui/psppire-dialog-action-frequencies.c:51 msgid "Standard error of the kurtosis" msgstr "Desviación estándar da curtose" #: src/ui/gui/psppire-dialog-action-oneway.c:175 #, c-format msgid "Contrast %d of %d" msgstr "Contraste %d de %d" #: src/ui/gui/psppire-dialog-action-paired.c:162 src/ui/gui/examine.ui:282 #: src/ui/gui/indep-samples.ui:334 src/ui/gui/t-test.ui:296 msgid "O_ptions..." msgstr "O_pcións..." #: src/ui/gui/psppire-dialog-action-paired.c:168 msgid "Paired Samples T Test" msgstr "Test T de mostras emparelladas" #: src/ui/gui/psppire-dialog-action-recode-different.c:327 msgid "Recode into Different Variables" msgstr "Recodificar en variábeis diferentes" #: src/ui/gui/psppire-dialog-action-recode-different.c:330 msgid "Recode into Different Variables: Old and New Values " msgstr "Recodificar con variábeis diferentes: antigos e novos valores " #: src/ui/gui/psppire-dialog-action-recode-same.c:108 src/ui/gui/recode.ui:391 msgid "Recode into Same Variables" msgstr "Recodificar coas mesmas variábeis" #: src/ui/gui/psppire-dialog-action-recode-same.c:114 msgid "Recode into Same Variables: Old and New Values" msgstr "Recodificar coas mesmas variábeis diferentes: antigos e novos valores" #: src/ui/gui/psppire-dialog-action-regression.c:40 msgid "Coeff" msgstr "Coef" #: src/ui/gui/psppire-dialog-action-regression.c:40 msgid "Show the regression coefficients" msgstr "Amosar os coeficientes de regresión" #: src/ui/gui/psppire-dialog-action-regression.c:41 msgid "Conf. Interval" msgstr "Conf. de intervalo" #: src/ui/gui/psppire-dialog-action-regression.c:41 msgid "Show the confidence interval for the regression coefficients" msgstr "Amosar o intervalo de confianza para os coeficientes de regresión" #: src/ui/gui/psppire-dialog-action-regression.c:42 msgid "Show the correlation between observed and predicted values" msgstr "Amosar a correlación entre os valores observador e os preditos" #: src/ui/gui/psppire-dialog-action-regression.c:43 msgid "Anova" msgstr "Anova" #: src/ui/gui/psppire-dialog-action-regression.c:43 msgid "Show the analysis of variance table" msgstr "Amosar a análise da táboa de varianza" #: src/ui/gui/psppire-dialog-action-regression.c:44 msgid "Bcov" msgstr "Bcov" #: src/ui/gui/psppire-dialog-action-regression.c:44 msgid "Show the variance coefficient matrix" msgstr "Amosar a matriz do coeficiente de varianza" #: src/ui/gui/psppire-dialog-action-regression.c:45 #, fuzzy #| msgid "Total" msgid "Tol" msgstr "Total" #: src/ui/gui/psppire-dialog-action-regression.c:45 #, fuzzy #| msgid "Show the variance coefficient matrix" msgid "Show the variance inflation factor and its reciprocal" msgstr "Amosar a matriz do coeficiente de varianza" #: src/ui/gui/psppire-dialog-action-select.c:88 #, c-format msgid "Approximately %3d%% of all cases." msgstr "Aproximadamente %3d%% de todos os casos." #: src/ui/gui/psppire-dialog-action-select.c:89 #, c-format msgid "Exactly %3d cases from the first %3d cases." msgstr "Exactamente %3d casos dos primeiros %3d casos." #: src/ui/gui/psppire-dialog-action-select.c:236 #, c-format msgid "%d thru %d" msgstr "%d por medio de %d" #: src/ui/gui/psppire-dialog-action-two-sample.c:180 #: src/ui/gui/k-independent.ui:404 src/ui/gui/k-related.ui:197 msgid "Test Type" msgstr "Tipo de test" #: src/ui/gui/psppire-dialog-action-two-sample.c:189 msgid "_Wilcoxon" msgstr "_Wilcoxon" #: src/ui/gui/psppire-dialog-action-two-sample.c:190 msgid "_Sign" msgstr "A_sinar" #: src/ui/gui/psppire-dialog-action-two-sample.c:191 msgid "_McNemar" msgstr "_McNemar" #: src/ui/gui/psppire-dialog-action-two-sample.c:209 msgid "Two-Related-Samples Tests" msgstr "Test de dúas mostras relacionadas" #: src/ui/gui/psppire-dialog-action-weight.c:74 src/ui/gui/weight.ui:83 #: src/ui/gui/weight.ui:211 msgid "Do not weight cases" msgstr "Non ponderar casos" #: src/ui/gui/psppire-dialog-action-weight.c:80 #, c-format msgid "Weight cases by %s" msgstr "Ponderar casos por %s" #: src/ui/gui/psppire-dict.c:95 #, fuzzy #| msgid "Var%d" msgid "Var" msgstr "Var%d" #. TRANSLATORS: This string must be a valid variable name. That means: #. - The string must be at most 64 bytes (not characters) long. #. - The string may not contain whitespace. #. - The first character may not be '$' #. - The first character may not be a digit #. - The final character may not be '.' or '_' #. #: src/ui/gui/psppire-dict.c:385 #, c-format msgid "Var%04d" msgstr "Var%04d" #: src/ui/gui/psppire-dict.c:566 msgid "Duplicate variable name." msgstr "Nome duplicado da variábel." #: src/ui/gui/psppire-dictview.c:617 msgid "Prefer variable labels" msgstr "Etiquetas preferentes de variábeis" #: src/ui/gui/psppire-dictview.c:631 msgid "Default sort order" msgstr "" #: src/ui/gui/psppire-dictview.c:637 msgid "Unsorted (dictionary order)" msgstr "Desordenado (orde de dicionario)" #: src/ui/gui/psppire-dictview.c:642 msgid "Sort by name" msgstr "Ordenar por nome" #: src/ui/gui/psppire-dictview.c:647 msgid "Sort by label" msgstr "Ordenar por etiqueta" #: src/ui/gui/psppire-means-layer.c:95 #, c-format msgid "Layer %d of %d" msgstr "Capa %d de %d" #: src/ui/gui/psppire-means-layer.c:169 msgid "Forward" msgstr "" #: src/ui/gui/psppire-means-layer.c:170 msgid "Back" msgstr "" #: src/ui/gui/psppire-text-file.c:55 #, c-format msgid "Could not open `%s'" msgstr "Non se puido abrir «%s»" #: src/ui/gui/psppire-text-file.c:71 #, c-format msgid "Error reading `%s': %s" msgstr "Produciuse un erro ao ler «%s»: %s" #: src/ui/gui/psppire-text-file.c:74 #, c-format msgid "" "Failed to read `%s', because it contains a line over %d bytes long and " "therefore appears not to be a text file." msgstr "" "Produciuse un fallo ao ler «%s» porque contén unha liña de %d bytes de longo " "e, daquela, parece que non é un ficheiro de texto." #: src/ui/gui/psppire-text-file.c:96 #, c-format msgid "`%s' is empty." msgstr "«%s» está baleira." #: src/ui/gui/psppire-val-chooser.c:255 msgid "through" msgstr "a través" #: src/ui/gui/psppire-val-chooser.c:288 msgid "_Value:" msgstr "_Valor:" #: src/ui/gui/psppire-val-chooser.c:289 msgid "_System Missing" msgstr "Falta o _sistema" #: src/ui/gui/psppire-val-chooser.c:290 msgid "System _or User Missing" msgstr "Falta sistema ou _usuario" #: src/ui/gui/psppire-val-chooser.c:291 msgid "_Range:" msgstr "_Rango:" #: src/ui/gui/psppire-val-chooser.c:292 msgid "Range, _LOWEST thru value" msgstr "Rango, _LOWEST con valor verdadeiro" #: src/ui/gui/psppire-val-chooser.c:293 msgid "Range, value thru _HIGHEST" msgstr "Rango, _HIGHEST co valor verdadeiro" #: src/ui/gui/psppire-val-chooser.c:294 msgid "_All other values" msgstr "_Todos os demais valores" #: src/ui/gui/psppire-var-view.c:153 #, c-format msgid "Var%d" msgstr "Var%d" #: src/ui/source-init-opts.c:72 #, c-format msgid "Algorithm must be either `%s' or `%s'." msgstr "O algoritmo debe estar entre «%s» ou «%s»." #: src/ui/source-init-opts.c:97 #, c-format msgid "Syntax must be either `%s' or `%s'." msgstr "A sintaxe debe estar entre «%s» ou «%s»." #: src/ui/terminal/main.c:144 msgid "Error encountered while ERROR=STOP is effective." msgstr "Atopouse un erro mentres ERROR=STOP é efecttivo." #: src/ui/terminal/main.c:150 msgid "" "Stopping syntax file processing here to avoid a cascade of dependent command " "failures." msgstr "" "Deter aquí o procesamento da sintaxe do ficheiro para evitar unha serie de " "fallos de ordes dependentes." #: src/ui/terminal/terminal-opts.c:147 #, c-format msgid "" "PSPP, a program for statistical analysis of sampled data.\n" "Usage: %s [OPTION]... FILE...\n" "\n" "Arguments to long options also apply to equivalent short options.\n" "\n" "Output options:\n" " -o, --output=FILE output to FILE, default format from FILE's name\n" " -O format=FORMAT override format for previous -o\n" " -O OPTION=VALUE set output option to customize previous -o\n" " -O device={terminal|listing} override device type for previous -o\n" " -e, --error-file=FILE append errors, warnings, and notes to FILE\n" " --no-output disable default output driver\n" "Supported output formats: %s\n" "\n" "Language options:\n" " -I, --include=DIR append DIR to search path\n" " -I-, --no-include clear search path\n" " -r, --no-statrc disable running rc file at startup\n" " -a, --algorithm={compatible|enhanced}\n" " set to `compatible' if you want output\n" " calculated from broken algorithms\n" " -x, --syntax={compatible|enhanced}\n" " set to `compatible' to disable PSPP extensions\n" " -b, --batch interpret syntax in batch mode\n" " -i, --interactive interpret syntax in interactive mode\n" " --syntax-encoding=ENCODING specify encoding for syntax files\n" " -s, --safer don't allow some unsafe operations\n" "Default search path: %s\n" "\n" "Informative output:\n" " -h, --help display this help and exit\n" " -V, --version output version information and exit\n" "\n" "Non-option arguments are interpreted as syntax files to execute.\n" msgstr "" "PSPP, un programa para análise estatística de datos dunha mostra.\n" "Utilización: %s [OPCIÓN]... FICHEIRO...\n" "\n" "Os argumentos das opcións longas tamén son aplicábeis nas equivalentes " "opcións curtas.\n" "\n" "Opcións de saída:\n" " -o, --output=FICHEIRO saída a FICHEIRO, formato predeterminado do nome " "do FICHEIRO\n" " -O format=FORMATO sobrescribe o formato coa opción previa -o\n" " -O OPCIÓN=VALOR estabelece a opción de saída para personalizar a " "opción previa -o\n" " -O device={terminal|listing} sobrescribe o tipo de dispositivo ao da " "opción previa -o\n" " -e, --error-file=FICHEIRO anexar erros, avisos e notas ao FICHEIRO \n" " --no-output desactivar o controlador de saída " "predeterminado\n" "Formatos de saída admitidos: %s\n" "\n" "Opción de idioma:\n" " -I, --include=DIR engadir DIR á ruta de busca\n" " -I-, --no-include limpar a ruta de busca\n" " -r, --no-statrc desactivar o ficheiro en execución rc no " "arranque\n" " -a, --algorithm={compatible|enhanced}\n" " escolla «compatible» se quere unha saída " "calculada a partir de algoritmos rotos\n" " -x, --syntax={compatible|enhanced}\n" " escolla «compatible» para desactivar as " "extensións PSPP\n" " -b, --batch interpretar a sintaxe en lotes (modo batch)\n" " -i, --interactive interpretar a sintaxe en modo interactivo\n" " --syntax-encoding=ENCODING especificar a codificación para ficheiros de " "sintaxe\n" " -s, --safer non permitir ningunha operación insegura\n" "Ruta de busca predeterminada: %s\n" "\n" "Saída informativa:\n" " -h, --help presentar esta axuda e saída\n" " -V, --version ofrece información sobre a versión e saída\n" "\n" "Os argumentos non opcionais interprétanse como ficheiros de sintaxe que " "executar.\n" #: src/ui/gui/find-dialog.c:197 #, fuzzy #| msgid "_Find..." msgid "Find" msgstr "_Atopar..." #: src/ui/gui/find-dialog.c:662 #, c-format msgid "Bad regular expression: %s" msgstr "Mala expresión regular: %s" #: src/ui/gui/help-menu.c:70 msgid "A program for the analysis of sampled data" msgstr "Un programa para a análise de datos de mostras" #. TRANSLATORS: Do not translate this string. Instead, put the names of the people #. who have helped in the translation. #: src/ui/gui/help-menu.c:80 msgid "translator-credits" msgstr "Antón Méixome -para OSL do CIXUG- , 2014" #: src/ui/gui/help-menu.c:170 #, c-format msgid "Help path conversion error: %s" msgstr "" #: src/ui/gui/help-menu.c:197 #, fuzzy, c-format #| msgid "" #| "Cannot open reference manual: %s. The PSPP user manual is also available " #| "at %s" msgid "" "Cannot open via html: %s with uri: %s The PSSP manual is also available at %s" msgstr "" "Non se pode abrir o manual de referencia: %s. O manual do usuario de PSPP " "tamén está dispoñíbel en %s" #: src/ui/gui/help-menu.c:218 msgid "_Help" msgstr "A_xuda" #: src/ui/gui/help-menu.c:221 msgid "_About" msgstr "" #: src/ui/gui/help-menu.c:222 msgid "_Reference Manual" msgstr "Manual de _referencia" #: src/ui/gui/main.c:306 msgid "Show version information and exit" msgstr "" #: src/ui/gui/main.c:409 msgid "Do not display the splash screen" msgstr "" #: src/ui/gui/main.c:411 msgid "Do not attempt single instance negotiation" msgstr "" #: src/ui/gui/missing-val-dialog.c:217 msgid "" "The maximum length of a missing value for a string variable is 8 in UTF-8." msgstr "" #: src/ui/gui/missing-val-dialog.c:268 #, fuzzy #| msgid "At least one variable must be specified." msgid "At least one value must be specified" msgstr "Debe especificarse como mínimo unha variábel." #: src/ui/gui/missing-val-dialog.c:298 msgid "Incorrect range specification" msgstr "Especificación de rango incorrecto" #: src/ui/gui/psppire-data-editor.c:380 #, fuzzy, c-format #| msgid "%s: %s" msgid "%d : %s" msgstr "%s: %s" #: src/ui/gui/psppire-data-editor.c:391 #, c-format msgid "%'d case" msgid_plural "%'d cases" msgstr[0] "caso %'d" msgstr[1] "casos %'d" #: src/ui/gui/psppire-data-editor.c:396 #, c-format msgid "%'d variable" msgid_plural "%'d variables" msgstr[0] "variábel %'d" msgstr[1] "variabeis %'d" #: src/ui/gui/psppire-data-editor.c:485 msgid "Case" msgstr "Caso" #: src/ui/gui/psppire-data-editor.c:495 msgid "Data View" msgstr "Vista de datos" #: src/ui/gui/psppire-data-editor.c:505 msgid "Variable View" msgstr "Vista de variábel" #: src/ui/gui/psppire-data-sheet.c:171 src/ui/gui/psppire-data-window.c:1338 #, fuzzy #| msgid "Insert Case" msgid "_Insert Case" msgstr "Inserir un caso" #: src/ui/gui/psppire-data-sheet.c:179 src/ui/gui/psppire-data-window.c:1391 #, fuzzy #| msgid "_Clear Cases" msgid "Cl_ear Cases" msgstr "_Limpar casos" #: src/ui/gui/psppire-data-sheet.c:305 src/ui/gui/psppire-data-window.c:1337 #: src/ui/gui/psppire-variable-sheet.c:274 #, fuzzy #| msgid "Insert Variable" msgid "_Insert Variable" msgstr "Inserir unha variábel" #: src/ui/gui/psppire-data-sheet.c:314 src/ui/gui/psppire-variable-sheet.c:283 msgid "Cl_ear Variables" msgstr "Limp_ar variábeis" #: src/ui/gui/psppire-data-sheet.c:326 msgid "Sort _Ascending" msgstr "Ordenación _ascendente" #: src/ui/gui/psppire-data-sheet.c:333 msgid "Sort _Descending" msgstr "Ordenación _descendente" #: src/ui/gui/psppire-data-window.c:175 msgid "Transformations Pending" msgstr "Transformacións pendentes" #: src/ui/gui/psppire-data-window.c:191 msgid "Filter off" msgstr "Retirar filtro" #: src/ui/gui/psppire-data-window.c:203 #, c-format msgid "Filter by %s" msgstr "Filtrar con %s" #: src/ui/gui/psppire-data-window.c:224 msgid "No Split" msgstr "Sen división" #: src/ui/gui/psppire-data-window.c:233 msgid "Split by " msgstr "Dividido con " #: src/ui/gui/psppire-data-window.c:261 msgid "Weights off" msgstr "Sen ponderación" #: src/ui/gui/psppire-data-window.c:273 #, c-format msgid "Weight by %s" msgstr "Ponderado con %s" #: src/ui/gui/psppire-data-window.c:518 #: src/ui/gui/psppire-import-assistant.c:681 #: src/ui/gui/psppire-syntax-window.c:607 src/ui/gui/psppire-window.c:669 msgid "All Files" msgstr "Todos os ficheiros" #: src/ui/gui/psppire-data-window.c:535 msgid "System File" msgstr "Ficheiro de sistema" #: src/ui/gui/psppire-data-window.c:542 msgid "Compressed System File" msgstr "Ficheiro de sistema comprimido" #: src/ui/gui/psppire-data-window.c:548 msgid "Portable File" msgstr "Ficheiro portábel" #: src/ui/gui/psppire-data-window.c:551 msgid "Format:" msgstr "Formato:" #: src/ui/gui/psppire-data-window.c:615 msgid "Delete Existing Dataset?" msgstr "Eliminar o conxunto de datos actual?" #: src/ui/gui/psppire-data-window.c:619 #, c-format msgid "" "Renaming \"%s\" to \"%s\" will destroy the existing dataset named \"%s\". " "Are you sure that you want to do this?" msgstr "" "Ao renomear «%s» como «%s» destruirase o actual conxunto de datos chamado " "«%s». Confirma que quere facelo?" #: src/ui/gui/psppire-data-window.c:625 #, fuzzy #| msgid "Deleted" msgid "Delete" msgstr "Eliminado" #: src/ui/gui/psppire-data-window.c:647 #, c-format msgid "Please enter a new name for dataset \"%s\":" msgstr "Escriba un novo nome para o conxunto de datos «%s»:" #: src/ui/gui/psppire-data-window.c:649 msgid "Rename Dataset" msgstr "Renomear o conxunto de datos" #: src/ui/gui/psppire-data-window.c:1199 src/ui/gui/output-window.ui:68 #: src/ui/gui/syntax-editor.ui:22 msgid "_File" msgstr "_Ficheiro" #: src/ui/gui/psppire-data-window.c:1203 src/ui/gui/syntax-editor.ui:25 #, fuzzy #| msgid "_New..." msgid "_New" msgstr "_Nova..." #: src/ui/gui/psppire-data-window.c:1210 msgid "_Syntax" msgstr "_Sintaxe" #: src/ui/gui/psppire-data-window.c:1213 src/ui/gui/data-editor.ui:177 #: src/ui/gui/data-editor.ui:189 msgid "_Data" msgstr "_Datos" #: src/ui/gui/psppire-data-window.c:1220 src/ui/gui/syntax-editor.ui:36 #, fuzzy #| msgid "Open" msgid "_Open" msgstr "Abrir" #: src/ui/gui/psppire-data-window.c:1223 #, fuzzy #| msgid "I_mport Data..." msgid "_Import Data..." msgstr "I_mportar datos..." #: src/ui/gui/psppire-data-window.c:1231 src/ui/gui/logistic.ui:261 #: src/ui/gui/regression.ui:66 msgid "_Save..." msgstr "_Gardar..." #: src/ui/gui/psppire-data-window.c:1234 msgid "Save _As..." msgstr "Gardar _como..." #: src/ui/gui/psppire-data-window.c:1237 msgid "_Rename Dataset..." msgstr "_Renomear o conxunto de datos..." #: src/ui/gui/psppire-data-window.c:1248 #, fuzzy #| msgid "D_isplay Data File Information" msgid "_Display Data File Information" msgstr "Pr_esentar información do ficheiro de datos" #: src/ui/gui/psppire-data-window.c:1255 msgid "Working File" msgstr "Ficheiro de traballo" #: src/ui/gui/psppire-data-window.c:1257 #, fuzzy #| msgid "External File..." msgid "_External File..." msgstr "Ficheiro externo..." #: src/ui/gui/psppire-data-window.c:1267 #, fuzzy #| msgid "Recently Used Da_ta" msgid "_Recently Used Data" msgstr "_Datos utilizados recentemente" #: src/ui/gui/psppire-data-window.c:1268 msgid "Recently Used _Files" msgstr "_Ficheiros utilizados recentemente" #: src/ui/gui/psppire-data-window.c:1315 src/ui/gui/output-window.ui:82 #: src/ui/gui/syntax-editor.ui:59 msgid "_Quit" msgstr "" #: src/ui/gui/psppire-data-window.c:1333 src/ui/gui/output-window.ui:89 #: src/ui/gui/syntax-editor.ui:66 msgid "_Edit" msgstr "_Editar" #: src/ui/gui/psppire-data-window.c:1339 #, fuzzy #| msgid "Go To Variable..." msgid "_Go To Variable..." msgstr "Ir á variábel..." #: src/ui/gui/psppire-data-window.c:1340 #, fuzzy #| msgid "Go To Case..." msgid "_Go To Case..." msgstr "Ir ao caso..." #: src/ui/gui/psppire-data-window.c:1364 src/ui/gui/syntax-editor.ui:69 msgid "Cu_t" msgstr "" #: src/ui/gui/psppire-data-window.c:1373 src/ui/gui/output-window.ui:96 #: src/ui/gui/syntax-editor.ui:74 msgid "_Copy" msgstr "_Copiar" #: src/ui/gui/psppire-data-window.c:1380 src/ui/gui/syntax-editor.ui:79 msgid "_Paste" msgstr "" #: src/ui/gui/psppire-data-window.c:1387 #, fuzzy #| msgid "Cl_ear Variables" msgid "Clear _Variables" msgstr "Limp_ar variábeis" #: src/ui/gui/psppire-data-window.c:1401 msgid "_Find..." msgstr "_Atopar..." #: src/ui/gui/psppire-data-window.c:1407 src/ui/gui/logistic.ui:246 msgid "_Options..." msgstr "_Opcións..." #: src/ui/gui/psppire-data-window.c:1676 msgid "Jump to variable" msgstr "Salta á variábel" #: src/ui/gui/psppire-data-window.c:1689 msgid "Jump to a case in the data sheet" msgstr "Saltar cara un caso na folla de datos" #: src/ui/gui/psppire-data-window.c:1703 #, fuzzy #| msgid "Sort cases in the active dataset" msgid "Search for values in the data" msgstr "Ordenar os casos no conxunto de datos activos" #: src/ui/gui/psppire-data-window.c:1715 msgid "Create a new case at the current position" msgstr "Crear un novo caso na posición actual" #: src/ui/gui/psppire-data-window.c:1727 msgid "Create a new variable at the current position" msgstr "Crear unha nova variábel na posición actual" #: src/ui/gui/psppire-data-window.c:1741 msgid "Split the active dataset" msgstr "Dividir o conxunto de datos activo" #: src/ui/gui/psppire-data-window.c:1753 msgid "Weight cases by variable" msgstr "Ponderar casos por variábel" #: src/ui/gui/psppire-data-window.c:1764 msgid "Show/hide value labels" msgstr "Amosar/agochar as etiquetas de valores" #: src/ui/gui/psppire-data-window.c:1904 msgid "Data Editor" msgstr "Editor de datos" #: src/ui/gui/psppire-encoding-selector.c:140 msgid "Automatically Detect" msgstr "Detectar automaticamente" #: src/ui/gui/psppire-encoding-selector.c:147 msgid "Locale Encoding" msgstr "Codificación local" #: src/ui/gui/psppire-encoding-selector.c:177 msgid "Character Encoding: " msgstr "Codificación de carácter: " #: src/ui/gui/psppire-import-assistant.c:337 msgid "line" msgstr "" #: src/ui/gui/psppire-import-assistant.c:347 msgid "var" msgstr "var" #: src/ui/gui/psppire-import-assistant.c:560 msgid "Importing Spreadsheet Data" msgstr "Importación de datos de folla de cálculo" #: src/ui/gui/psppire-import-assistant.c:686 msgid "Text Files" msgstr "Ficheiros de texto" #: src/ui/gui/psppire-import-assistant.c:691 msgid "Text (*.txt) Files" msgstr "Ficheiros de texto (*.txt)" #: src/ui/gui/psppire-import-assistant.c:697 msgid "Plain Text (ASCII) Files" msgstr "Ficheiros de texto simple (ASCII)" #: src/ui/gui/psppire-import-assistant.c:702 msgid "Comma Separated Value Files" msgstr "Ficheiros de valores separados por comas" #: src/ui/gui/psppire-import-assistant.c:709 msgid "Tab Separated Value Files" msgstr "Ficheiros de valores separados por tabulacións" #: src/ui/gui/psppire-import-assistant.c:714 msgid "Gnumeric Spreadsheet Files" msgstr "Ficheiros da folla de cálculo Gnumeric" #: src/ui/gui/psppire-import-assistant.c:719 msgid "OpenDocument Spreadsheet Files" msgstr "Ficheiros da folla de cálculo OpenDocument" #: src/ui/gui/psppire-import-assistant.c:724 msgid "All Spreadsheet Files" msgstr "Todas as follas de cálculo" #: src/ui/gui/psppire-import-assistant.c:733 #, fuzzy #| msgid "Select Data to Import" msgid "Select File to Import" msgstr "Seleccionar datos para importar" #: src/ui/gui/psppire-import-assistant.c:770 msgid "Importing Delimited Text Data" msgstr "Importando datos en texto delimitado" #: src/ui/gui/psppire-import-assistant.c:865 #, fuzzy #| msgid "Select Cases: Range" msgid "Select the First Line" msgstr "Seleccionar casos: rango" #: src/ui/gui/psppire-import-assistant.c:877 msgid "Line" msgstr "Liña" #: src/ui/gui/psppire-import-assistant.c:931 msgid "" "This assistant will guide you through the process of importing data into " "PSPP from a text file with one line per case, in which fields are separated " "by tabs, commas, or other delimiters.\n" "\n" msgstr "" "Este asistente fará de guía o proceso de importación de datos dentro de PSPP " "a partir dun ficheiro de texto cunha liña por caso, no cal os campos están " "separados por tabuladores, comas ou outros delimitadores.\n" "\n" #: src/ui/gui/psppire-import-assistant.c:941 #, fuzzy, c-format #| msgid "The selected file contains %'zu line of text. " #| msgid_plural "The selected file contains %'zu lines of text. " msgid "The selected file contains %'lu line of text. " msgid_plural "The selected file contains %'lu lines of text. " msgstr[0] "O ficheiro seleccionado contén %'zu liña de texto. " msgstr[1] "O ficheiro seleccionado contén %'zu liñas de texto. " #: src/ui/gui/psppire-import-assistant.c:950 #, c-format msgid "The selected file contains approximately %'lu line of text. " msgid_plural "The selected file contains approximately %'lu lines of text. " msgstr[0] "" "O ficheiro seleccionado contén aproximadamente %'lu liña de texto. " msgstr[1] "" "O ficheiro seleccionado contén aproximadamente %'lu liñas de texto. " #: src/ui/gui/psppire-import-assistant.c:956 #, c-format msgid "" "Only the first %zu line of the file will be shown for preview purposes in " "the following screens. " msgid_plural "" "Only the first %zu lines of the file will be shown for preview purposes in " "the following screens. " msgstr[0] "" "Soamente a primeira %zu liña do ficheiro se amosará co fin de visualizar nas " "seguintes pantallas. " msgstr[1] "" "Soamente as primeiras %zu liñas do ficheiro se amosarán co fin de visualizar " "nas seguintes pantallas. " #: src/ui/gui/psppire-import-assistant.c:965 msgid "You may choose below how much of the file should actually be imported." msgstr "" "Pode escolle agora canta parte do ficheiro debería importarse neste intre." #: src/ui/gui/psppire-import-assistant.c:974 #, c-format msgid "Only the first %4d cases" msgstr "Soamente os primeiros %4d casos" #: src/ui/gui/psppire-import-assistant.c:985 #, c-format msgid "Only the first %3d %% of file (approximately)" msgstr "Soamente o primeiro %3d %% da fila (aproximadamente)" #: src/ui/gui/psppire-import-assistant.c:1009 #, fuzzy #| msgid "Select Data to Import" msgid "Select the Lines to Import" msgstr "Seleccionar datos para importar" #: src/ui/gui/psppire-import-assistant.c:1151 msgid "Choose Separators" msgstr "Escoller separadores" #: src/ui/gui/psppire-import-assistant.c:1438 msgid "Adjust Variable Formats" msgstr "Axustar formatos de variábel" #: src/ui/gui/psppire-output-view.c:410 msgid "Message" msgstr "Mensaxe" #: src/ui/gui/psppire-output-view.c:543 msgid "failed to create temporary directory during clipboard operation" msgstr "" "produciuse un fallo ao crear o cartafol temporal durante a operación co " "portapapeis" #: src/ui/gui/psppire-output-window.c:241 msgid "Infer file type from extension" msgstr "Inferir o tipo de ficheiro a partir da extensión" #: src/ui/gui/psppire-output-window.c:242 msgid "SPSS Viewer (*.spv)" msgstr "" #: src/ui/gui/psppire-output-window.c:243 msgid "PDF (*.pdf)" msgstr "PDF (*.pdf)" #: src/ui/gui/psppire-output-window.c:244 msgid "HTML (*.html)" msgstr "HTML (*.html)" #: src/ui/gui/psppire-output-window.c:245 msgid "OpenDocument (*.odt)" msgstr "OpenDocument (*.odt)" #: src/ui/gui/psppire-output-window.c:246 msgid "Text (*.txt)" msgstr "Texto (*.txt)" #: src/ui/gui/psppire-output-window.c:247 #, fuzzy #| msgid "Text (*.txt)" msgid "Text [plain] (*.txt)" msgstr "Texto (*.txt)" #: src/ui/gui/psppire-output-window.c:248 msgid "PostScript (*.ps)" msgstr "PostScript (*.ps)" #: src/ui/gui/psppire-output-window.c:249 msgid "Comma-Separated Values (*.csv)" msgstr "Valores separados por comas (*.csv)" #: src/ui/gui/psppire-output-window.c:350 msgid "Export Output" msgstr "Exportar resultado" #: src/ui/gui/psppire-output-window.c:548 msgid "Output Viewer" msgstr "Visualizador de saída" #: src/ui/gui/psppire-spreadsheet-model.c:237 msgid "(empty)" msgstr "(baleiro)" #: src/ui/gui/psppire-syntax-window.c:226 msgid "Text Search" msgstr "" #: src/ui/gui/psppire-syntax-window.c:229 msgid "_OK" msgstr "" #: src/ui/gui/psppire-syntax-window.c:231 msgid "_Cancel" msgstr "" #: src/ui/gui/psppire-syntax-window.c:239 msgid "Text to search for:" msgstr "" #: src/ui/gui/psppire-syntax-window.c:570 #, c-format msgid "Saved file `%s'" msgstr "Gardouse o ficheiro «%s»" #: src/ui/gui/psppire-syntax-window.c:591 msgid "Save Syntax" msgstr "Gardar sintaxe" #: src/ui/gui/psppire-syntax-window.c:601 src/ui/gui/psppire-window.c:657 msgid "Syntax Files (*.sps) " msgstr "Ficheiros de sintaxe (*.sps) " #: src/ui/gui/psppire-syntax-window.c:970 msgid "Syntax Editor" msgstr "Editor de sintaxe" #: src/ui/gui/psppire-syntax-window.c:990 #, c-format msgid "Cannot load syntax file `%s'" msgstr "Non é posíbel cargar o ficheiro de sintaxe «%s»" #: src/ui/gui/psppire-variable-sheet.c:412 #, c-format msgid "{%s, %s}..." msgstr "{%s, %s}..." #: src/ui/gui/psppire-var-sheet-header.c:64 #, fuzzy #| msgid "Decimals" msgid "Decimal" msgstr "Decimais" #: src/ui/gui/psppire-var-sheet-header.c:79 msgid "Align" msgstr "Aliñar" #: src/ui/gui/psppire-var-sheet-header.c:82 msgid "Measure" msgstr "Medida" #: src/ui/gui/psppire-window.c:430 #, c-format msgid "Save the changes to `%s' before closing?" msgstr "Gardar as modificacións en «%s» antes de pechar?" #: src/ui/gui/psppire-window.c:437 #, c-format msgid "" "If you don't save, changes from the last %ld seconds will be permanently " "lost." msgstr "" "Se non o garda, as modificacións feitas desde hai %ld segundos perderanse " "para sempre." #: src/ui/gui/psppire-window.c:441 msgid "Close _without saving" msgstr "Pechar _sen gardar" #: src/ui/gui/psppire-window.c:625 src/ui/gui/psppire-window.c:629 msgid "Open" msgstr "Abrir" #: src/ui/gui/psppire-window.c:634 msgid "Data and Syntax Files" msgstr "Ficheiros de datos e sintaxe" #: src/ui/gui/psppire-window.c:646 msgid "System Files (*.sav, *.zsav)" msgstr "Ficheiros de sistema (*.sav, *.zsav)" #: src/ui/gui/psppire-window.c:663 #, fuzzy #| msgid "Syntax Files (*.sps) " msgid "Output Files (*.spv) " msgstr "Ficheiros de sintaxe (*.sps) " #: src/ui/gui/t-test-options.c:65 #, c-format msgid "Con_fidence Interval: %2d %%" msgstr "Intervalo de con_fianza: %2d %%" #: src/ui/gui/val-labs-dialog.c:591 #, c-format msgid "%s = `%s'" msgstr "%s = «%s»" #: src/ui/gui/var-type-dialog.c:541 #, fuzzy #| msgid "Compute Variable: Type and Label" msgid "Variable Type and Format" msgstr "Computar unha variábel: Tipo e etiqueta" #: src/ui/gui/windows-menu.c:92 #, fuzzy #| msgid "_Minimize All Windows" msgid "_Minimize all Windows" msgstr "_Minimizar todas as xanelas" #: src/ui/gui/windows-menu.c:100 msgid "_Split" msgstr "_Dividir" #: src/ui/gui/windows-menu.c:132 msgid "_Windows" msgstr "_Xanelas" #: utilities/pspp-convert.c:67 #, c-format msgid "%s argument must be a single character" msgstr "" #: utilities/pspp-convert.c:265 msgid "exactly two non-option arguments are required; use --help for help" msgstr "" "Requírense exactamente dous argumentos non opcionais; utilice --help para " "obter axuda" #: utilities/pspp-convert.c:276 #, c-format msgid "%s: cannot guess output format (use -O option)" msgstr "%s: non se pode adiviñar o formato de saída (utilice a opción -O)" #: utilities/pspp-convert.c:341 #, c-format msgid "%s: unknown output format (use -O option)" msgstr "%s: formato de saída descoñecido (utilice a opción -O" #: utilities/pspp-convert.c:360 #, c-format msgid "%s: error reading input file" msgstr "%s: produciuse un erro ao ler o ficheiro de entrada" #: utilities/pspp-convert.c:362 #, c-format msgid "%s: error writing output file" msgstr "%s: produciuse un erro ao escribir o ficheiro de resultado" #: utilities/pspp-convert.c:409 #, fuzzy, c-format #| msgid "%s: error opening output file" msgid "%s: error opening password file" msgstr "%s: produciuse un erro ao abrir o ficheiro de resultado" #: utilities/pspp-convert.c:425 #, fuzzy, c-format #| msgid "%s: error reading input file" msgid "" "\n" "%s: password not in file" msgstr "%s: produciuse un erro ao ler o ficheiro de entrada" #: utilities/pspp-convert.c:462 #, fuzzy, c-format #| msgid "`%c' is not a valid hex digit" msgid "%s: '%c' is not in alphabet" msgstr "«%c» non é un díxito hexadecimal válido" #: utilities/pspp-convert.c:526 msgid "sorry, wrong password" msgstr "desculpe, o contrasinal é incorrecto" #: utilities/pspp-output.c:92 #, c-format msgid "%s and %s:" msgstr "" #: utilities/pspp-output.c:547 #, c-format msgid "%s: invalid XPath expression" msgstr "" #: utilities/pspp-output.c:716 msgid "missing command name (use --help for help)" msgstr "" #: utilities/pspp-output.c:720 #, c-format msgid "unknown command \"%s\" (use --help for help)" msgstr "" #: utilities/pspp-output.c:728 #, c-format msgid "\"%s\" command takes exactly %d argument" msgid_plural "\"%s\" command takes exactly %d arguments" msgstr[0] "" msgstr[1] "" #: utilities/pspp-output.c:735 #, fuzzy, c-format #| msgid "%s requires at least %d valid arguments in list." msgid "\"%s\" command requires at least %d argument" msgid_plural "\"%s\" command requires at least %d arguments" msgstr[0] "%s require cando menos %d argumentos válidos na lista." msgstr[1] "%s require cando menos %d argumentos válidos na lista." #: utilities/pspp-output.c:742 #, fuzzy, c-format #| msgid "%s requires at least %d valid arguments in list." msgid "\"%s\" command requires between %d and %d arguments" msgstr "%s require cando menos %d argumentos válidos na lista." #: utilities/pspp-output.c:782 msgid "The following object classes are supported:" msgstr "" #: utilities/pspp-output.c:791 #, c-format msgid "%s: unknown object class (use --select=help for help" msgstr "" #: src/language/utilities/set.q:162 #, fuzzy, c-format #| msgid "Value of %s must be between 1 and 100." msgid "%s must be between 0 and 20." msgstr "O valor de %s debe estar entre 1 e 100." #: src/language/utilities/set.q:172 src/language/utilities/set.q:179 #, c-format msgid "%s must be at least 1." msgstr "%s debe ser cando menos 1." #: src/language/utilities/set.q:205 #, c-format msgid "%s must be at least 1MB" msgstr "%s debe ser cando menos 1MB" #: src/language/utilities/set.q:207 #, c-format msgid "%s must be positive" msgstr "%s debe ser positivo" #: src/language/utilities/set.q:213 src/language/utilities/set.q:215 #: src/language/utilities/set.q:217 src/language/utilities/set.q:219 #: src/language/utilities/set.q:221 src/language/utilities/set.q:223 #: src/language/utilities/set.q:225 src/language/utilities/set.q:227 #: src/language/utilities/set.q:229 src/language/utilities/set.q:231 #: src/language/utilities/set.q:233 #, c-format msgid "%s is obsolete." msgstr "%s é obsoleto." #: src/language/utilities/set.q:239 msgid "Active file compression is not implemented." msgstr "A compresión activa de ficheiro non está implementada." #: src/language/utilities/set.q:403 #, c-format msgid "%s must be 1500 or later." msgstr "%s debe ser 1500 ou posterior." #: src/language/utilities/set.q:410 #, c-format msgid "expecting %s or year" msgstr "agardando %s ou ano" #: src/language/utilities/set.q:438 src/language/utilities/set.q:535 #, c-format msgid "%s must be at least %d." msgstr "%s debe ser cando menos %d." #: src/language/utilities/set.q:474 #, c-format msgid "%s is not a recognized encoding or locale name" msgstr "%s non é nin unha codificación recoñecida nin un nome de local" #: src/language/utilities/set.q:562 #, c-format msgid "" "%s requires numeric output format as an argument. Specified format %s is of " "type string." msgstr "" "%s require un formato de saída numérico como argumento. O formato " "especificado %s é de tipo cadea." #: src/language/utilities/set.q:791 msgid "ISL (32-bit IEEE 754 single, little-endian)" msgstr "ISL (32-bit IEEE 754 único, little-endian)" #: src/language/utilities/set.q:794 msgid "ISB (32-bit IEEE 754 single, big-endian)" msgstr "ISB (32-bit IEEE 754 único, big-endian)" #: src/language/utilities/set.q:797 msgid "IDL (64-bit IEEE 754 double, little-endian)" msgstr "IDL (64-bit IEEE 754 dobre, little-endian)" #: src/language/utilities/set.q:800 msgid "IDB (64-bit IEEE 754 double, big-endian)" msgstr "IDB (64-bit IEEE 754 dobre, big-endian)" #: src/language/utilities/set.q:804 msgid "VF (32-bit VAX F, VAX-endian)" msgstr "VF (32-bit VAX F, VAX-endian)" #: src/language/utilities/set.q:807 msgid "VD (64-bit VAX D, VAX-endian)" msgstr "VD (64-bit VAX D, VAX-endian)" #: src/language/utilities/set.q:810 msgid "VG (64-bit VAX G, VAX-endian)" msgstr "VG (64-bit VAX G, VAX-endian)" #: src/language/utilities/set.q:814 msgid "ZS (32-bit IBM Z hexadecimal short, big-endian)" msgstr "ZS (32-bit IBM Z hexadecimal curto, big-endian)" #: src/language/utilities/set.q:817 msgid "ZL (64-bit IBM Z hexadecimal long, big-endian)" msgstr "ZL (64-bit IBM Z hexadecimal longo, big-endian)" #: src/language/utilities/set.q:985 #, c-format msgid "%s is %s." msgstr "%s é %s." #: src/language/utilities/set.q:1089 #, c-format msgid "" "Too many %s commands without a %s: at most %d levels of saved settings are " "allowed." msgstr "" "Demasiadas ordes %s sen un %s: permítese cando menos %d niveis de opcións " "gardadas." #: src/language/utilities/set.q:1109 #, c-format msgid "%s without matching %s." msgstr "%s sen coincidencia con %s." #: src/language/stats/crosstabs.q:327 #, c-format msgid "Missing mode %s not allowed in general mode. Assuming %s." msgstr "Falta o modo %s non permitido en modo xeral. Asúmese que sexa %s." #: src/language/stats/crosstabs.q:444 msgid "Too many cross-tabulation variables or dimensions." msgstr "Demasiadas variábeis cruzadas ou dimensións." #: src/language/stats/crosstabs.q:509 #, c-format msgid "%s must be specified before %s." msgstr "%s debe especificarse antes de %s." #: src/language/stats/crosstabs.q:543 #, c-format msgid "Maximum value (%ld) less than minimum value (%ld)." msgstr "O valor máximo (%ld) é menos que o valor mínimo (%ld)." #: src/language/stats/crosstabs.q:922 #, fuzzy #| msgid "Summary." msgid "Summary" msgstr "Resumo." #: src/language/stats/crosstabs.q:935 #, fuzzy #| msgid "Crosstabs" msgid "Crosstabulation" msgstr "Cruzados" #. TRANSLATORS: The %s here describes a crosstabulation. It takes the #. form "var1 * var2 * var3 * ...". #: src/language/stats/crosstabs.q:1013 #, c-format msgid "Crosstabulation %s contained no non-missing cases." msgstr "A táboa cruzada %s non contén ningún caso non faltante." #: src/language/stats/crosstabs.q:1204 #, fuzzy #| msgid "Missing Values" msgid "Missing value" msgstr "Valores que faltan" #: src/language/stats/crosstabs.q:1263 #, fuzzy #| msgid "row %" msgid "Row %" msgstr "fila %" #: src/language/stats/crosstabs.q:1264 #, fuzzy #| msgid "column %" msgid "Column %" msgstr "columna %" #: src/language/stats/crosstabs.q:1265 #, fuzzy #| msgid "total %" msgid "Total %" msgstr "total %" #: src/language/stats/crosstabs.q:1269 #, fuzzy #| msgid "Adjusted Std. Residual" msgid "Adjusted Residual" msgstr "Residual estándar axustado" #: src/language/stats/crosstabs.q:1288 #, fuzzy #| msgid "Chi-Square Test" msgid "Chi-Square Tests" msgstr "Test khi cadrado" #: src/language/stats/crosstabs.q:1294 msgid "Pearson Chi-Square" msgstr "Khi cadrado de Pearson" #: src/language/stats/crosstabs.q:1295 msgid "Likelihood Ratio" msgstr "Razón de verosimilitude" #: src/language/stats/crosstabs.q:1296 msgid "Fisher's Exact Test" msgstr "Test exacto de Fisher" #: src/language/stats/crosstabs.q:1297 msgid "Continuity Correction" msgstr "Corrección de continuidade" #: src/language/stats/crosstabs.q:1298 msgid "Linear-by-Linear Association" msgstr "Asociación liña-a-liña" #: src/language/stats/crosstabs.q:1299 src/language/stats/crosstabs.q:1345 #: src/language/stats/crosstabs.q:1854 msgid "N of Valid Cases" msgstr "N de casos válidos" #: src/language/stats/crosstabs.q:1305 #, fuzzy #| msgid "Asymp. Sig. (2-tailed)" msgid "Asymptotic Sig. (2-tailed)" msgstr "Sign. Asint (2-colas)" #: src/language/stats/crosstabs.q:1319 #, fuzzy #| msgid "Symmetric measures." msgid "Symmetric Measures" msgstr "Medidas simétricas." #: src/language/stats/crosstabs.q:1324 src/language/stats/crosstabs.q:1364 #: src/language/stats/crosstabs.q:1411 #, fuzzy #| msgid "_Values" msgid "Values" msgstr "_Valores" #: src/language/stats/crosstabs.q:1326 src/language/stats/crosstabs.q:1413 msgid "Asymp. Std. Error" msgstr "Erro est. asintótico" #: src/language/stats/crosstabs.q:1327 src/language/stats/crosstabs.q:1414 msgid "Approx. T" msgstr "T aproximado" #: src/language/stats/crosstabs.q:1328 src/language/stats/crosstabs.q:1415 msgid "Approx. Sig." msgstr "Sig. aprox." #: src/language/stats/crosstabs.q:1333 src/language/stats/crosstabs.q:1420 msgid "Nominal by Nominal" msgstr "Valor nominal por nominal" #: src/language/stats/crosstabs.q:1334 msgid "Cramer's V" msgstr "V de Cramer" #: src/language/stats/crosstabs.q:1334 msgid "Contingency Coefficient" msgstr "Coeficiente de continxencia" #: src/language/stats/crosstabs.q:1336 src/language/stats/crosstabs.q:1425 msgid "Ordinal by Ordinal" msgstr "Valor ordinal por ordinal" #: src/language/stats/crosstabs.q:1337 msgid "Kendall's tau-b" msgstr "Tau b de Kendall" #: src/language/stats/crosstabs.q:1337 msgid "Kendall's tau-c" msgstr "Tau c de Kendall" #: src/language/stats/crosstabs.q:1338 msgid "Spearman Correlation" msgstr "Correlación de Spearman" #: src/language/stats/crosstabs.q:1340 msgid "Interval by Interval" msgstr "Intervalo por intervalo" #: src/language/stats/crosstabs.q:1341 msgid "Pearson's R" msgstr "R de Pearson" #: src/language/stats/crosstabs.q:1343 msgid "Measure of Agreement" msgstr "Media de acordo" #: src/language/stats/crosstabs.q:1359 #, fuzzy #| msgid "Risk estimate." msgid "Risk Estimate" msgstr "Estimar risco." #: src/language/stats/crosstabs.q:1368 #, fuzzy, no-c-format #| msgid "95%% Confidence Interval" msgid "95% Confidence Interval" msgstr "Intervalo de confianza do 95%%" #: src/language/stats/crosstabs.q:1389 msgid "Symmetric" msgstr "Simétrico" #: src/language/stats/crosstabs.q:1391 src/language/stats/crosstabs.q:1396 #, c-format msgid "%s Dependent" msgstr "%s Dependente" #: src/language/stats/crosstabs.q:1406 #, fuzzy #| msgid "Directional measures." msgid "Directional Measures" msgstr "Medidas direccionais." #: src/language/stats/crosstabs.q:1422 msgid "Goodman and Kruskal tau" msgstr "Tau de Goodman e Kruskal" #: src/language/stats/crosstabs.q:1423 msgid "Uncertainty Coefficient" msgstr "Coeficiente de incerteza" #: src/language/stats/crosstabs.q:1426 msgid "Somers' d" msgstr "d de Somers" #: src/language/stats/crosstabs.q:1428 msgid "Nominal by Interval" msgstr "Valor nominal por intervalo" #: src/language/stats/crosstabs.q:1826 #, fuzzy, c-format #| msgid "Odds Ratio for %s (%g / %g)" msgid "Odds Ratio for %s" msgstr "Razón de probabilidades para %s (%g / %g)" #: src/language/stats/crosstabs.q:1835 #, fuzzy, c-format #| msgid "For cohort %s = %.*g" msgid "For cohort %s = " msgstr "Por cohorte %s = %.*g" #: src/ui/gui/aggregate.ui:24 msgid "Aggregate Data" msgstr "Agregar datos" #: src/ui/gui/aggregate.ui:126 msgid "_Break variable(s)" msgstr "_Romper variábel(eis)" #: src/ui/gui/aggregate.ui:179 msgid "Variable Name: " msgstr "Nome de variábel: " #: src/ui/gui/aggregate.ui:215 msgid "Variable Label: " msgstr "Etiqueta de variábel: " #: src/ui/gui/aggregate.ui:252 msgid "Function: " msgstr "Función: " #: src/ui/gui/aggregate.ui:327 msgid "Argument 1: " msgstr "Argumento 1: " #: src/ui/gui/aggregate.ui:364 msgid "Argument 2: " msgstr "Argumento 2: " #: src/ui/gui/aggregate.ui:428 msgid "Aggregated variables" msgstr "Variábeis agregadas" #: src/ui/gui/aggregate.ui:469 msgid "_Add aggregated variables to the active dataset" msgstr "Eng_adir variábeis agregadas ao conxunto de datos activo" #: src/ui/gui/aggregate.ui:486 msgid "_Replace the current dataset with the aggregated variables" msgstr "Substituí_r o conxunto de datos actual coas variábeis agregadas" #: src/ui/gui/aggregate.ui:504 msgid "_Write a new data file containing only the aggregated variables" msgstr "" "Escri_bir un novo ficheiros de datos que conteña soamente as variábeis " "agregadas" #: src/ui/gui/aggregate.ui:544 msgid "label" msgstr "etiqueta" #: src/ui/gui/aggregate.ui:593 msgid "File is _already sorted on break variable(s)" msgstr "O ficheiro x_a está ordenado por a(s) variábeis rotas" #: src/ui/gui/aggregate.ui:609 msgid "Sort file before a_ggregating" msgstr "Ordenar o ficheiro antes da a_gregación" #: src/ui/gui/aggregate.ui:630 msgid "Options for very large datasets" msgstr "Opcións para conxuntos de datos moi grandes" #: src/ui/gui/autorecode.ui:24 msgid "Automatic Recode" msgstr "Recodificación automática" #: src/ui/gui/autorecode.ui:120 msgid "Variable -> New Name" msgstr "Variábel -> Novo nome" #: src/ui/gui/autorecode.ui:145 msgid "_Lowest value" msgstr "O va_lor máis baixo" #: src/ui/gui/autorecode.ui:163 msgid "_Highest value" msgstr "O valor máis al_to" #: src/ui/gui/autorecode.ui:185 msgid "Recode starting from" msgstr "A recodificación comeza en" #: src/ui/gui/autorecode.ui:204 msgid "_New Name" msgstr "_Novo nome" #: src/ui/gui/autorecode.ui:227 msgid "_Add New Name" msgstr "Eng_adir un novo nome" #: src/ui/gui/autorecode.ui:285 msgid "_Use the same recoding scheme for all variables" msgstr "_Utilizar o mesmo esquema de recodificación para todas as variábeis" #: src/ui/gui/autorecode.ui:301 msgid "Treat _blank string values as missing" msgstr "Tratar a cadea en _branco como ausente" #: src/ui/gui/binomial.ui:86 msgid "_Test Variable List:" msgstr "Co_mprobar a lista de variábel:" #: src/ui/gui/binomial.ui:160 src/ui/gui/chi-square.ui:281 msgid "_Get from data" msgstr "_Obter dos datos" #: src/ui/gui/binomial.ui:181 src/ui/gui/indep-samples.ui:150 msgid "_Cut point:" msgstr "_Cortar o punto:" #: src/ui/gui/binomial.ui:225 msgid "Define Dichotomy" msgstr "Definir dicotomía" #: src/ui/gui/binomial.ui:245 msgid "Test _Proportion:" msgstr "Probar a _proporción:" #: src/ui/gui/compute.ui:32 msgid "Compute Variable: Type and Label" msgstr "Computar unha variábel: Tipo e etiqueta" #: src/ui/gui/compute.ui:67 msgid "Use _expression as label" msgstr "Utilizar unha _expresión como etiqueta" #: src/ui/gui/compute.ui:90 msgid "_Label:" msgstr "_Etiqueta:" #: src/ui/gui/compute.ui:194 msgid "_String" msgstr "_Cadea" #: src/ui/gui/compute.ui:287 msgid "_Numeric" msgstr "_Numérico" #: src/ui/gui/compute.ui:343 msgid "Compute Variable" msgstr "Computar unha variábel" #: src/ui/gui/compute.ui:381 msgid "Target _Variable:" msgstr "Variábel _obxectivo:" #: src/ui/gui/compute.ui:412 msgid "_Type & Label..." msgstr "_Tipo e etiqueta..." #: src/ui/gui/compute.ui:469 msgid "=" msgstr "=" #: src/ui/gui/compute.ui:526 msgid "_Numeric Expressions:" msgstr "Expresións _numéricas:" #: src/ui/gui/compute.ui:598 msgid "_Functions:" msgstr "_Funcións:" #: src/ui/gui/compute.ui:678 msgid "_If..." msgstr "_Se..." #: src/ui/gui/barchart.ui:24 msgid "Barchart" msgstr "" #: src/ui/gui/barchart.ui:112 #, fuzzy #| msgid "Category" msgid "Category A_xis:" msgstr "Categoría" #: src/ui/gui/barchart.ui:140 #, fuzzy #| msgid "Number of cases" msgid "_N of cases" msgstr "Número de casos" #: src/ui/gui/barchart.ui:158 #, fuzzy #| msgid "Number of cases" msgid "_Cum. n of cases" msgstr "Número de casos" #: src/ui/gui/barchart.ui:174 msgid "Other _summary function" msgstr "" #: src/ui/gui/barchart.ui:191 #, fuzzy #| msgid "Number of cases" msgid "% of c_ases" msgstr "Número de casos" #: src/ui/gui/barchart.ui:207 #, fuzzy #| msgid "Number of cases" msgid "C_um. % of cases" msgstr "Número de casos" #: src/ui/gui/barchart.ui:270 src/ui/gui/histogram.ui:100 #, fuzzy #| msgid "_Variables:" msgid "_Variable:" msgstr "_Variábeis:" #: src/ui/gui/barchart.ui:308 msgid "Bars Represent" msgstr "" #: src/ui/gui/barchart.ui:340 #, fuzzy #| msgid "Category label source" msgid "Category C_luster:" msgstr "Orixe da categoría de etiqueta" #: src/ui/gui/correlation.ui:24 msgid "Bivariate Correlations" msgstr "Correlacións bivariantes" #: src/ui/gui/correlation.ui:148 msgid "Pearso_n" msgstr "Pearso_on" #: src/ui/gui/correlation.ui:164 msgid "_Kendall's tau-b" msgstr "Tau b de _Kendall" #: src/ui/gui/correlation.ui:180 msgid "_Spearman" msgstr "_Spearman" #: src/ui/gui/correlation.ui:200 msgid "Correlation Coefficients" msgstr "Coeficientes de correlación" #: src/ui/gui/correlation.ui:224 msgid "_Two-tailed" msgstr "_Dobre cola" #: src/ui/gui/correlation.ui:241 msgid "One-tai_led" msgstr "Unha cola" #: src/ui/gui/correlation.ui:262 msgid "Test of Significance" msgstr "Test de significancia" #: src/ui/gui/correlation.ui:275 msgid "_Flag significant correlations" msgstr "_Marca de correlacións significantes" #: src/ui/gui/count.ui:24 msgid "Count Occurrences of Values within Cases" msgstr "Contar as ocorrencias de valores dentro dos casos" #: src/ui/gui/count.ui:117 msgid "Numeric _Variables:" msgstr "_Variábeis numéricas:" #: src/ui/gui/count.ui:147 msgid "_Target Variable:" msgstr "Variábel _obxectivo:" #: src/ui/gui/count.ui:178 msgid "Target _Label:" msgstr "_Etiqueta obxectivo:" #: src/ui/gui/count.ui:192 msgid "_Define Values..." msgstr "_Definir valores..." #: src/ui/gui/count.ui:257 msgid "Count Values within Cases: Values to Count" msgstr "Contar valores dentro dos casos: Valores que contar" #: src/ui/gui/count.ui:305 msgid "Values _to Count:" msgstr "Valores _que contar:" #: src/ui/gui/comments.ui:25 msgid "Data File Comments" msgstr "Comentarios de ficheiro de datos" #: src/ui/gui/comments.ui:49 msgid "Comments:" msgstr "Comentarios:" #: src/ui/gui/comments.ui:106 msgid "Display comments in output" msgstr "Presentar comentarios na saída" #: src/ui/gui/comments.ui:127 msgid "Column Number: 0" msgstr "Número de columna: 0" #: src/ui/gui/crosstabs.ui:25 msgid "Crosstabs: Cells" msgstr "Cruzadas: Celas" #: src/ui/gui/crosstabs.ui:67 msgid "Cell Display" msgstr "Presentación de cela" #: src/ui/gui/crosstabs.ui:99 msgid "Crosstabs" msgstr "Cruzados" #: src/ui/gui/crosstabs.ui:150 msgid "_Rows" msgstr "_Filas" #: src/ui/gui/crosstabs.ui:195 msgid "_Columns" msgstr "_Columnas" #: src/ui/gui/crosstabs.ui:242 msgid "_Format..." msgstr "_Formato..." #: src/ui/gui/crosstabs.ui:256 src/ui/gui/examine.ui:267 msgid "_Statistics..." msgstr "_Estatísticas..." #: src/ui/gui/crosstabs.ui:270 msgid "Ce_lls..." msgstr "Ce_las..." #: src/ui/gui/crosstabs.ui:348 msgid "Crosstabs: Format" msgstr "Cruzadas: Formato" #: src/ui/gui/crosstabs.ui:371 msgid "Print tables" msgstr "Imprimir táboas" #: src/ui/gui/crosstabs.ui:387 msgid "Pivot" msgstr "Dinámica" #: src/ui/gui/crosstabs.ui:403 src/ui/gui/sort.ui:157 msgid "Ascending" msgstr "Ascendente" #: src/ui/gui/crosstabs.ui:455 msgid "Crosstabs: Statistics" msgstr "Cruzadas: Estatísticas" #: src/ui/gui/chi-square.ui:30 msgid "Chi-Square Test" msgstr "Test khi cadrado" #: src/ui/gui/chi-square.ui:82 msgid "All categor_ies equal" msgstr "Todas as categor_ías igual" #: src/ui/gui/chi-square.ui:103 msgid "_Values" msgstr "_Valores" #: src/ui/gui/chi-square.ui:159 msgid "Expected Values:" msgstr "Valores agardados:" #: src/ui/gui/chi-square.ui:204 msgid "Test _Variables" msgstr "Probar _variábeis" #: src/ui/gui/chi-square.ui:298 msgid "Use _specified range" msgstr "Utilizar un rango _especificado" #: src/ui/gui/chi-square.ui:323 msgid "_Lower:" msgstr "_Inferior:" #: src/ui/gui/chi-square.ui:337 msgid "_Upper:" msgstr "_Superior:" #: src/ui/gui/chi-square.ui:381 msgid "Expected Range:" msgstr "Rango agardado:" #: src/ui/gui/descriptives.ui:131 src/ui/gui/factor.ui:797 #: src/ui/gui/recode.ui:638 msgid "_Variables:" msgstr "_Variábeis:" #: src/ui/gui/descriptives.ui:176 msgid "S_tatistics:" msgstr "Es_tatísticas:" #: src/ui/gui/descriptives.ui:230 msgid "_Exclude entire case if any selected variable is missing" msgstr "_Excluír o caso enteiro se falta calquera variábel seleccionada" #: src/ui/gui/descriptives.ui:247 msgid "_Include user-missing data in analysis" msgstr "_Incluír os datos de usuario que faltan na análise" #: src/ui/gui/descriptives.ui:264 msgid "Save _Z-scores of selected variables as new variables" msgstr "" "Gardar as puntuacións _Z das variábeis seleccionadas como novas variábeis" #: src/ui/gui/descriptives.ui:286 msgid "Options:" msgstr "Opcións:" #: src/ui/gui/examine.ui:25 msgid "Explore" msgstr "Explorar" #: src/ui/gui/examine.ui:69 msgid "_Label Cases by:" msgstr "_Etiquetas de casos de:" #: src/ui/gui/examine.ui:116 msgid "_Factor List:" msgstr "Lista de _factor:" #: src/ui/gui/examine.ui:163 src/ui/gui/means.ui:126 msgid "_Dependent List:" msgstr "Lista _dependente:" #: src/ui/gui/examine.ui:331 msgid "Explore: Options" msgstr "Explorar: Opcións" #: src/ui/gui/examine.ui:355 src/ui/gui/t-test.ui:81 msgid "Exclude cases _listwise" msgstr "Excluír casos da _lista de parellas" #: src/ui/gui/examine.ui:373 msgid "Exclude cases _pairwise" msgstr "Excluír casos da _lista de parellas" #: src/ui/gui/examine.ui:392 msgid "_Report values" msgstr "Informa_r de valores" #: src/ui/gui/examine.ui:449 msgid "Explore: Statistics" msgstr "Explorar: Estatísticas" #: src/ui/gui/examine.ui:468 src/ui/gui/oneway.ui:576 msgid "_Descriptives" msgstr "_Descritivos" #: src/ui/gui/examine.ui:485 msgid "_Extremes" msgstr "_Extremos" #: src/ui/gui/examine.ui:502 msgid "_Percentiles" msgstr "_Percentís" #: src/ui/gui/goto-case.ui:31 msgid "Goto Case" msgstr "Ir ao caso" #: src/ui/gui/goto-case.ui:52 msgid "Goto Case Number:" msgstr "Ir ao caso número:" #: src/ui/gui/factor.ui:39 msgid "Factor Analysis: Rotation" msgstr "Análise de factor: Rotación" #: src/ui/gui/factor.ui:70 msgid "_None" msgstr "_Ningún" #: src/ui/gui/factor.ui:87 msgid "_Varimax" msgstr "_Varimax" #: src/ui/gui/factor.ui:104 msgid "_Quartimax" msgstr "_Cuartimax" #: src/ui/gui/factor.ui:123 msgid "_Equimax" msgstr "_Equimax" #: src/ui/gui/factor.ui:146 msgid "Method" msgstr "Método" #: src/ui/gui/factor.ui:159 msgid "_Display rotated solution" msgstr "_Presentar a solución rotada" #: src/ui/gui/factor.ui:181 src/ui/gui/factor.ui:582 msgid "Ma_ximum iterations for convergence:" msgstr "Iteracións má_ximas para converxencia:" #: src/ui/gui/factor.ui:241 src/ui/gui/factor.ui:255 msgid "Principal Components Analysis" msgstr "Análise de compoñentes principais" #: src/ui/gui/factor.ui:246 src/ui/gui/factor.ui:258 msgid "Principal Axis Factoring" msgstr "Factorización do eixe principal" #: src/ui/gui/factor.ui:264 msgid "Factor Analysis: Extraction" msgstr "Análise de factor: Extracción" #: src/ui/gui/factor.ui:290 msgid "_Method: " msgstr "_Método: " #: src/ui/gui/factor.ui:345 msgid "Co_rrelation matrix" msgstr "Matriz de correlación" #: src/ui/gui/factor.ui:361 msgid "Co_variance matrix" msgstr "Matriz de co_varianza" #: src/ui/gui/factor.ui:382 msgid "Analyze" msgstr "Analizar" #: src/ui/gui/factor.ui:407 msgid "_Unrotated factor solution" msgstr "Factor de solución _sen rotación" #: src/ui/gui/factor.ui:423 msgid "_Scree plot" msgstr "Diagrama de _sedimentación" #: src/ui/gui/factor.ui:443 src/ui/gui/histogram.ui:146 src/ui/gui/roc.ui:329 msgid "Display" msgstr "Presentar" #: src/ui/gui/factor.ui:526 msgid "_Number of factors:" msgstr "_Número de factores:" #: src/ui/gui/factor.ui:563 msgid "Extract" msgstr "Extraer" #: src/ui/gui/factor.ui:640 msgid "Factor Analysis" msgstr "Análise de factor" #: src/ui/gui/factor.ui:672 src/ui/gui/data-editor.ui:266 msgid "_Descriptives..." msgstr "_Descritivos..." #: src/ui/gui/factor.ui:685 msgid "_Extraction..." msgstr "_Extracción..." #: src/ui/gui/factor.ui:699 msgid "_Rotations..." msgstr "_Rotacións..." #: src/ui/gui/find.ui:25 msgid "Find Case" msgstr "Atopar o caso" #: src/ui/gui/find.ui:117 msgid "Variable:" msgstr "Variábel:" #: src/ui/gui/find.ui:157 src/ui/gui/val-labs-dialog.ui:113 msgid "Value:" msgstr "Valor:" #: src/ui/gui/find.ui:180 msgid "Search value labels" msgstr "Buscar etiquetas de valor" #: src/ui/gui/find.ui:210 msgid "Regular expression Match" msgstr "Coincidencias de expresións regulares" #: src/ui/gui/find.ui:227 msgid "Search substrings" msgstr "Buscar subcadeas" #: src/ui/gui/find.ui:244 msgid "Wrap around" msgstr "Busca cíclica" #: src/ui/gui/find.ui:260 msgid "Search backward" msgstr "Busca cara atrás" #: src/ui/gui/frequencies.ui:32 msgid "Frequencies: Frequency Tables" msgstr "Frecuencias: Táboas de frecuencia" #: src/ui/gui/frequencies.ui:67 msgid "_Always" msgstr "_Sempre" #: src/ui/gui/frequencies.ui:85 msgid "_Never" msgstr "_Nunca" #: src/ui/gui/frequencies.ui:107 msgid "If no _more than " msgstr "Se non _máis de " #: src/ui/gui/frequencies.ui:129 src/ui/gui/frequencies.ui:454 msgid "100" msgstr "" #: src/ui/gui/frequencies.ui:145 msgid "values" msgstr "valores" #: src/ui/gui/frequencies.ui:167 msgid "Display frequency tables" msgstr "Presentar as táboas de frecuencia" #: src/ui/gui/frequencies.ui:194 msgid "A_scending value" msgstr "Valor a_scendente" #: src/ui/gui/frequencies.ui:212 msgid "D_escending value" msgstr "Valor d_escendente" #: src/ui/gui/frequencies.ui:230 msgid "Ascending _frequency" msgstr "_Frecuencia ascendente" #: src/ui/gui/frequencies.ui:248 msgid "Descending f_requency" msgstr "F_recuencia descendente" #: src/ui/gui/frequencies.ui:271 msgid "Order by" msgstr "Ordenar por" #: src/ui/gui/frequencies.ui:324 msgid "Frequencies: Charts" msgstr "Frecuencias: Gráficas" #: src/ui/gui/frequencies.ui:356 msgid "Scale:" msgstr "Escala:" #: src/ui/gui/frequencies.ui:366 msgid "_Frequencies" msgstr "_Frecuencias" #: src/ui/gui/frequencies.ui:383 msgid "_Percentages" msgstr "_Porcentaxes" #: src/ui/gui/frequencies.ui:407 msgid "Exclude values _below " msgstr "Excluír valores _seguintes " #: src/ui/gui/frequencies.ui:422 msgid "Exclude values _above " msgstr "Ecluír valores _anteriores " #: src/ui/gui/frequencies.ui:441 src/ui/gui/reliability.ui:227 msgid "0" msgstr "" #: src/ui/gui/frequencies.ui:469 msgid "Chart Formatting" msgstr "Formatado de gráfica" #: src/ui/gui/frequencies.ui:494 msgid "Draw _histograms" msgstr "Debuxar _histogramas" #: src/ui/gui/frequencies.ui:510 msgid "Superimpose _normal curve" msgstr "Superpoñer a curva _normal" #: src/ui/gui/frequencies.ui:530 msgid "Histograms" msgstr "Histogramas" #: src/ui/gui/frequencies.ui:555 #, fuzzy #| msgid "Draw _pie charts" msgid "Draw _bar charts" msgstr "Debuxar gráficas de _tarta" #: src/ui/gui/frequencies.ui:575 #, fuzzy #| msgid "Pie Charts" msgid "Bar Charts" msgstr "Gráficas de sectores" #: src/ui/gui/frequencies.ui:600 msgid "Draw _pie charts" msgstr "Debuxar gráficas de _tarta" #: src/ui/gui/frequencies.ui:616 msgid "Include slices for _missing values" msgstr "Incluír sectores dos valores que _faltan" #: src/ui/gui/frequencies.ui:636 msgid "Pie Charts" msgstr "Gráficas de sectores" #: src/ui/gui/frequencies.ui:725 src/ui/gui/rank.ui:489 msgid "_Variable(s):" msgstr "_Variábel(eis):" #: src/ui/gui/frequencies.ui:769 msgid "_Statistics:" msgstr "_Estatísticas:" #: src/ui/gui/frequencies.ui:783 msgid "Include _missing values" msgstr "Incluír valores que _faltan" #: src/ui/gui/frequencies.ui:806 msgid "Ch_arts..." msgstr "Gr_áficas..." #: src/ui/gui/frequencies.ui:821 msgid "Frequency _Tables..." msgstr "_Táboas de frecuencia..." #: src/ui/gui/histogram.ui:24 #, fuzzy #| msgid "Histograms" msgid "Histogram" msgstr "Histogramas" #: src/ui/gui/histogram.ui:126 #, fuzzy #| msgid "Superimpose _normal curve" msgid "_Display normal curve" msgstr "Superpoñer a curva _normal" #: src/ui/gui/indep-samples.ui:25 src/ui/gui/k-independent.ui:35 msgid "Define Groups" msgstr "Definir grupos" #: src/ui/gui/indep-samples.ui:75 msgid "Group_2 value:" msgstr "Valor do grupo_2:" #: src/ui/gui/indep-samples.ui:89 msgid "Group_1 value:" msgstr "Valore do grupo_1:" #: src/ui/gui/indep-samples.ui:190 msgid "_Use specified values:" msgstr "_Utilizar valores específicos:" #: src/ui/gui/indep-samples.ui:259 msgid "Independent-Samples T Test" msgstr "Test T de mostras independentes" #: src/ui/gui/indep-samples.ui:319 msgid "_Define Groups..." msgstr "_Definir grupos..." #: src/ui/gui/indep-samples.ui:401 src/ui/gui/t-test.ui:211 msgid "_Test Variable(s):" msgstr "Pro_bar variábel(eis):" #: src/ui/gui/indep-samples.ui:454 src/ui/gui/k-independent.ui:165 msgid "_Grouping Variable:" msgstr "A_grupación de variábeis:" #: src/ui/gui/k-independent.ui:63 #, fuzzy #| msgid "_Upper:" msgid "_Upper limit:" msgstr "_Superior:" #: src/ui/gui/k-independent.ui:77 #, fuzzy #| msgid "_Lower:" msgid "_Lower limit:" msgstr "_Inferior:" #: src/ui/gui/k-independent.ui:136 #, fuzzy #| msgid "Tests for Several Related Samples" msgid "Tests for Several Independent Samples" msgstr "Tests por varios exemplos relacionados" #: src/ui/gui/k-independent.ui:208 src/ui/gui/ks-one-sample.ui:131 msgid "Test _Variable List:" msgstr "Probar a lista de _variábeis:" #: src/ui/gui/k-independent.ui:320 #, fuzzy #| msgid "Define Groups" msgid "_Define Groups" msgstr "Definir grupos" #: src/ui/gui/k-independent.ui:365 msgid "_Kruskal-Wallis H" msgstr "" #: src/ui/gui/k-independent.ui:382 src/ui/gui/runs.ui:140 msgid "_Median" msgstr "_Mediana" #: src/ui/gui/k-means.ui:24 msgid "K-Means Cluster Analysis" msgstr "Análise de clúster por medias K" #: src/ui/gui/k-means.ui:122 msgid "N_umber of Clusters: " msgstr "N_úmero de agrupacións: " #: src/ui/gui/k-related.ui:24 msgid "Tests for Several Related Samples" msgstr "Tests por varios exemplos relacionados" #: src/ui/gui/k-related.ui:113 msgid "_Test Variables:" msgstr "Probar _variábeis:" #: src/ui/gui/k-related.ui:145 msgid "_Friedman" msgstr "_Friedman" #: src/ui/gui/k-related.ui:161 msgid "_Kendall's W" msgstr "W de _Kendall" #: src/ui/gui/k-related.ui:177 msgid "_Cochran's Q" msgstr "Q de _Cochran" #: src/ui/gui/ks-one-sample.ui:163 msgid "_Normal" msgstr "_Normal" #: src/ui/gui/ks-one-sample.ui:181 msgid "_Poisson" msgstr "_Poisson" #: src/ui/gui/ks-one-sample.ui:198 msgid "_Uniform" msgstr "_Uniform" #: src/ui/gui/ks-one-sample.ui:213 msgid "_Exponential" msgstr "_Exponencial" #: src/ui/gui/ks-one-sample.ui:232 msgid "Test Distribution" msgstr "Probar distribución" #: src/ui/gui/logistic.ui:42 msgid "Logistic Regression: Options" msgstr "Regresión loxística: opcións" #: src/ui/gui/logistic.ui:66 msgid "CI for _exp(B): " msgstr "CI para _exp(B): " #: src/ui/gui/logistic.ui:97 msgid "%" msgstr "%" #: src/ui/gui/logistic.ui:146 msgid "Classification cu_toff: " msgstr "Cor_te de clasificación: " #: src/ui/gui/logistic.ui:159 msgid "_Maximum Iterations: " msgstr "Iteracións _máximas: " #: src/ui/gui/logistic.ui:177 msgid "Include _constant in model" msgstr "Incluír _constante no modelo" #: src/ui/gui/logistic.ui:219 msgid "Logistic Regression" msgstr "Regresión loxística" #: src/ui/gui/logistic.ui:364 src/ui/gui/regression.ui:185 msgid "_Dependent" msgstr "_Dependente" #: src/ui/gui/logistic.ui:412 src/ui/gui/regression.ui:232 msgid "_Independent" msgstr "_Independente" #: src/ui/gui/means.ui:25 msgid "Means" msgstr "Medias" #: src/ui/gui/means.ui:179 msgid "_Independent List:" msgstr "Lista _independente:" #: src/ui/gui/missing-val-dialog.ui:48 msgid "_No missing values" msgstr "_Sen valores perdidos" #: src/ui/gui/missing-val-dialog.ui:136 msgid "_Discrete missing values" msgstr "Valores _discretos perdidos" #: src/ui/gui/missing-val-dialog.ui:172 msgid "_Low:" msgstr "_Baixo:" #: src/ui/gui/missing-val-dialog.ui:197 msgid "_High:" msgstr "_Alto:" #: src/ui/gui/missing-val-dialog.ui:221 msgid "Di_screte value:" msgstr "Valor di_screto:" #: src/ui/gui/missing-val-dialog.ui:245 msgid "_Range plus one optional discrete missing value" msgstr "_Rango e máis un valor discreto perdido opcional" #: src/ui/gui/oneway.ui:25 msgid "One-Way ANOVA: Contrasts" msgstr "ANOVA dun factor: contrastes" #: src/ui/gui/oneway.ui:107 msgid "_Coefficients:" msgstr "_Coeficientes:" #: src/ui/gui/oneway.ui:161 msgid "Coefficient Total: " msgstr "Coeficiente total: " #: src/ui/gui/oneway.ui:198 msgid "Contrast 1 of 1" msgstr "Contraste 1 de 1" #: src/ui/gui/oneway.ui:234 #, fuzzy #| msgid "One-Way ANOVA: Contrasts" msgid "One-Way ANOVA: Post-Hoc" msgstr "ANOVA dun factor: contrastes" #: src/ui/gui/oneway.ui:270 #, fuzzy #| msgid "Games-Howell" msgid "Games Howell" msgstr "Games-Howell" #: src/ui/gui/oneway.ui:287 msgid "Fisher's LSD" msgstr "" #: src/ui/gui/oneway.ui:379 msgid "One-Way ANOVA" msgstr "ANOVA dun factor" #: src/ui/gui/oneway.ui:408 msgid "_Factor:" msgstr "_Factor:" #: src/ui/gui/oneway.ui:451 msgid "Dependent _Variable(s):" msgstr "_Variábel dependente(s):" #: src/ui/gui/oneway.ui:593 msgid "_Homogeneity" msgstr "_Homoxeneidade" #: src/ui/gui/oneway.ui:637 msgid "Post-Hoc..." msgstr "" #: src/ui/gui/oneway.ui:652 msgid "_Contrasts..." msgstr "_Contrastes..." #: src/ui/gui/options.ui:25 #, fuzzy #| msgid "Options" msgid "Options Case" msgstr "Opcións" #: src/ui/gui/options.ui:55 #, fuzzy #| msgid "Value _Labels" msgid "Display _Labels" msgstr "Etiquetas dos va_lores" #: src/ui/gui/options.ui:71 #, fuzzy #| msgid "Display" msgid "Display _Names" msgstr "Presentar" #: src/ui/gui/options.ui:99 #, fuzzy #| msgid "Sort by label" msgid "Sort by L_abel" msgstr "Ordenar por etiqueta" #: src/ui/gui/options.ui:115 #, fuzzy #| msgid "Sort by name" msgid "Sort by Na_me" msgstr "Ordenar por nome" #: src/ui/gui/options.ui:131 msgid "Do not S_ort" msgstr "" #: src/ui/gui/options.ui:159 #, fuzzy #| msgid "Variables" msgid "Variable Lists" msgstr "Variábeis" #: src/ui/gui/options.ui:184 msgid "Ma_ximize" msgstr "" #: src/ui/gui/options.ui:199 msgid "_Raise" msgstr "" #: src/ui/gui/options.ui:214 msgid "Aler_t" msgstr "" #: src/ui/gui/options.ui:233 msgid "Output Window Action" msgstr "" #: src/ui/gui/paired-samples.ui:147 msgid "_Test Pair(s):" msgstr "Par(es) de _test:" #: src/ui/gui/rank.ui:30 msgid "Rank Cases: Types" msgstr "Clasificar casos: tipos" #: src/ui/gui/rank.ui:57 msgid "Sum of case _weights" msgstr "Suma de _ponderacións do caso" #: src/ui/gui/rank.ui:74 msgid "Fractional rank as _%" msgstr "Clasificación fraccional como _%" #: src/ui/gui/rank.ui:92 msgid "_Fractional rank" msgstr "Clasificación _fraccional" #: src/ui/gui/rank.ui:109 msgid "_Savage score" msgstr "Puntuación _Savage" #: src/ui/gui/rank.ui:125 msgid "_Rank" msgstr "_Posición" #: src/ui/gui/rank.ui:147 msgid "N_tiles" msgstr "Mosaico_N" #: src/ui/gui/rank.ui:195 msgid "_Proportion Estimates" msgstr "_Proporción estimada" #: src/ui/gui/rank.ui:213 msgid "_Normal Scores" msgstr "Puntuación _normal" #: src/ui/gui/rank.ui:251 msgid "_Blom" msgstr "_Blom" #: src/ui/gui/rank.ui:269 msgid "Tuke_y" msgstr "Tuke_y" #: src/ui/gui/rank.ui:287 msgid "Ran_kit" msgstr "Ran_kit" #: src/ui/gui/rank.ui:305 msgid "_Van der Waerden" msgstr "_Van der Waerden" #: src/ui/gui/rank.ui:328 msgid "Proportion Estimation Formula" msgstr "Fórmula de proporción estimada" #: src/ui/gui/rank.ui:369 msgid "Rank Cases" msgstr "Clasificar casos" #: src/ui/gui/rank.ui:434 msgid "_By:" msgstr "_De:" #: src/ui/gui/rank.ui:595 msgid "_Smallest Value" msgstr "O valor máis pe_queno" #: src/ui/gui/rank.ui:613 msgid "_Largest Value" msgstr "O valor máis _longo" #: src/ui/gui/rank.ui:637 msgid "Assign rank 1 to:" msgstr "Asignar a posición 1 a:" #: src/ui/gui/rank.ui:656 msgid "_Display summary tables" msgstr "Presen_tar táboa de resumo" #: src/ui/gui/rank.ui:679 msgid "Rank T_ypes" msgstr "Clasificar t_ipos" #: src/ui/gui/rank.ui:694 msgid "_Ties..." msgstr "_Mosaico..." #: src/ui/gui/rank.ui:756 msgid "Rank Cases: Ties" msgstr "Clasificar casos: vínculos" #: src/ui/gui/rank.ui:788 msgid "_Mean" msgstr "_Media" #: src/ui/gui/rank.ui:806 msgid "_Low" msgstr "_Baixa" #: src/ui/gui/rank.ui:825 msgid "_High" msgstr "_Alta" #: src/ui/gui/rank.ui:851 msgid "_Sequential ranks to unique values" msgstr "Posicións _secuenciais para valores únicos" #: src/ui/gui/rank.ui:875 msgid "Rank Assigned to Ties" msgstr "Posición asignada a vínculos" #: src/ui/gui/runs.ui:155 msgid "M_ean" msgstr "M_edia" #: src/ui/gui/runs.ui:171 msgid "Mo_de" msgstr "Mo_do" #: src/ui/gui/runs.ui:191 msgid "_Custom:" msgstr "_Personalizar:" #: src/ui/gui/runs.ui:230 msgid "Cut Point" msgstr "Punto de corte" #: src/ui/gui/sort.ui:25 msgid "Sort Cases" msgstr "Ordenar casos" #: src/ui/gui/sort.ui:101 msgid "Sort by:" msgstr "Ordenar por:" #: src/ui/gui/sort.ui:174 msgid "Descending" msgstr "Descendente" #: src/ui/gui/sort.ui:196 msgid "Sort Order" msgstr "Orde de clasificación" #: src/ui/gui/split-file.ui:25 msgid "Split File" msgstr "Dividir ficheiro" #: src/ui/gui/split-file.ui:103 msgid "Anal_yze all cases. Do not create groups." msgstr "Anal_izar todos os casos. Non crear grupos." #: src/ui/gui/split-file.ui:121 msgid "Compare _groups." msgstr "Comparar _grupos." #: src/ui/gui/split-file.ui:140 msgid "Organize ou_tput by groups." msgstr "Organizar sai_da por grupos." #: src/ui/gui/split-file.ui:225 msgid "Groups _based on:" msgstr "Grupos _baseados en:" #: src/ui/gui/split-file.ui:255 msgid "_Sort the file by grouping variables." msgstr "_Ordenar o ficheiro agrupando variábeis." #: src/ui/gui/split-file.ui:273 msgid "_File is already sorted." msgstr "O _ficheiro xa está ordenado." #: src/ui/gui/split-file.ui:334 msgid "Current Status : " msgstr "Estado actual: " #: src/ui/gui/split-file.ui:348 msgid "Analysis by groups is off" msgstr "A análise por grupos está apagado" #: src/ui/gui/recode.ui:135 msgid "System _Missing" msgstr "Falta o siste_ma" #: src/ui/gui/recode.ui:150 msgid "Co_py old values" msgstr "Co_piar valores antigos" #: src/ui/gui/recode.ui:172 msgid "Va_lue: " msgstr "Va_lor: " #: src/ui/gui/recode.ui:276 msgid "Conver_t numeric strings to numbers (`5' -> 5)" msgstr "Conver_ter as cadeas numéricas en números (`5' -> 5)" #: src/ui/gui/recode.ui:297 msgid "Output variables are _strings" msgstr "As variábeis de saída son cadea_s" #: src/ui/gui/recode.ui:318 msgid "Width: " msgstr "Largura: " #: src/ui/gui/recode.ui:499 msgid "_Name:" msgstr "_Nome:" #: src/ui/gui/recode.ui:527 msgid "La_bel:" msgstr "Eti_queta:" #: src/ui/gui/recode.ui:556 msgid "Chan_ge" msgstr "Cam_biar" #: src/ui/gui/recode.ui:584 msgid "Output Variable" msgstr "Variábel e saída" #: src/ui/gui/recode.ui:658 msgid "Old and New Va_lues..." msgstr "Va_lores antigos e novos..." #: src/ui/gui/regression.ui:51 msgid "S_tatistics..." msgstr "Es_tatísticas..." #: src/ui/gui/regression.ui:272 msgid "Regression: Save" msgstr "Regresión: gardar" #: src/ui/gui/regression.ui:290 src/ui/gui/univariate.ui:42 msgid "_Predicted values" msgstr "Valores _preditos" #: src/ui/gui/regression.ui:307 src/ui/gui/univariate.ui:59 msgid "_Residuals" msgstr "_Residuais" #: src/ui/gui/regression.ui:351 msgid "Regression: Statistics" msgstr "Regresión: estatísticas" #: src/ui/gui/regression.ui:393 src/ui/gui/univariate.ui:143 msgid "S_tatistics" msgstr "Es_tatísticas" #: src/ui/gui/reliability.ui:34 msgid "Alpha" msgstr "Alfa" #: src/ui/gui/reliability.ui:43 msgid "Reliability Analysis" msgstr "Análise de solvencia" #: src/ui/gui/reliability.ui:144 msgid "_Items:" msgstr "_Elementos:" #: src/ui/gui/reliability.ui:166 msgid "_Model: " msgstr "_Modelo: " #: src/ui/gui/reliability.ui:212 msgid "_Variables in first split:" msgstr "_Variábeis na primeira división:" #: src/ui/gui/reliability.ui:259 msgid "Show _descriptives for scale if item is deleted" msgstr "Amosar _descritivos para a escala de se eliminar o elemento" #: src/ui/gui/roc.ui:145 msgid "_Test Variable:" msgstr "Pro_bar variábel:" #: src/ui/gui/roc.ui:175 msgid "_State Variable:" msgstr "De_finir variábel:" #: src/ui/gui/roc.ui:202 msgid "_Value of state variable:" msgstr "_Valor da variábel definida:" #: src/ui/gui/roc.ui:249 msgid "ROC C_urve" msgstr "C_urva ROC" #: src/ui/gui/roc.ui:269 msgid "_With diagonal reference line" msgstr "_Con liña de referencia diagonal" #: src/ui/gui/roc.ui:293 msgid "Standard _Error and Confidence Interval" msgstr "Erro _estándar e intervalo de confianza" #: src/ui/gui/roc.ui:309 msgid "_Coordinate points of the ROC Curve" msgstr "_Coordinar puntos da curva ROC" #: src/ui/gui/scatterplot.ui:25 #, fuzzy #| msgid "_Scree plot" msgid "Scatterplot" msgstr "Diagrama de _sedimentación" #: src/ui/gui/scatterplot.ui:56 msgid "_X Axis:" msgstr "" #: src/ui/gui/scatterplot.ui:100 msgid "_Y Axis:" msgstr "" #: src/ui/gui/select-cases.ui:37 msgid "Select Cases: Range" msgstr "Seleccionar casos: rango" #: src/ui/gui/select-cases.ui:87 msgid "First case" msgstr "Primeiro caso" #: src/ui/gui/select-cases.ui:99 msgid "Last case" msgstr "Derradeiro caso" #: src/ui/gui/select-cases.ui:111 msgid "Observation" msgstr "Observación" #: src/ui/gui/select-cases.ui:161 msgid "Select Cases" msgstr "Seleccionar casos" #: src/ui/gui/select-cases.ui:313 msgid "Use filter variable" msgstr "Utilizar a variábel de filtro" #: src/ui/gui/select-cases.ui:380 msgid "Based on time or case range" msgstr "Baseado en tempo ou no rango do caso" #: src/ui/gui/select-cases.ui:395 msgid "Range..." msgstr "Rango..." #: src/ui/gui/select-cases.ui:444 msgid "Random sample of cases" msgstr "Mostra aleatoria de casos" #: src/ui/gui/select-cases.ui:460 msgid "Sample..." msgstr "Mostra..." #: src/ui/gui/select-cases.ui:508 msgid "If condition is satisfied" msgstr "Se a condición se satisfai" #: src/ui/gui/select-cases.ui:523 msgid "If..." msgstr "Se..." #: src/ui/gui/select-cases.ui:567 msgid "All Cases" msgstr "Todos os casos" #: src/ui/gui/select-cases.ui:581 msgid "Select" msgstr "Seleccionar" #: src/ui/gui/select-cases.ui:608 msgid "Filtered" msgstr "Filtrado" #: src/ui/gui/select-cases.ui:625 msgid "Deleted" msgstr "Eliminado" #: src/ui/gui/select-cases.ui:647 msgid "Unselected Cases Are" msgstr "Os casos deseleccionados son" #: src/ui/gui/select-cases.ui:694 msgid "Select Cases: Random Sample" msgstr "Seleccionar casos: mostra aleatoria" #: src/ui/gui/select-cases.ui:756 msgid "Sample Size" msgstr "Tamaño da mostra" #: src/ui/gui/t-test.ui:25 msgid "Options" msgstr "Opcións" #: src/ui/gui/t-test.ui:63 msgid "Exclude cases _analysis by analysis" msgstr "Excluír casos _análise a análise" #: src/ui/gui/t-test.ui:148 msgid "One - Sample T Test" msgstr "Un - Mostra de test T" #: src/ui/gui/t-test.ui:265 msgid "Test _Value: " msgstr "_Valor de test: " #: src/ui/gui/text-data-import.ui:32 msgid "Select the first line of the data file that contains data." msgstr "Seleccionar a primeira liña do ficheiro de datos que conteña datos." #: src/ui/gui/text-data-import.ui:54 msgid "Line above selected line contains variable names" msgstr "A liña sobre a liña seleccionada contén nomes de variábeis" #: src/ui/gui/text-data-import.ui:80 msgid "" "Check the data formats displayed below and fix any that are incorrect. You " "may set other variable properties now or later." msgstr "" "Comprobar os formatos dos datos presentados a seguir e arranxar calquera que " "for incorrecto. Pode fixar agora outras propiedades da variábel ou máis " "tarde." #: src/ui/gui/text-data-import.ui:121 msgid "Variables" msgstr "Variábeis" #: src/ui/gui/text-data-import.ui:152 msgid "Data Preview" msgstr "Visualización de datos" #: src/ui/gui/text-data-import.ui:181 #, fuzzy #| msgid "" #| "This assistant will guide you through the process of importing data into " #| "PSPP from a text file with one line per case, in which fields are " #| "separated by tabs, commas, or other delimiters.\n" #| "\n" #| "The selected file contains N lines of text. Only the first M of these " #| "will be shown for preview purposes in the following screens. You may " #| "choose below how much of the file should actually be imported." msgid "" "This assistant will guide you through the process of importing data into " "PSPP from a text file with one line per case, in which fields are separated " "by tabs, commas, or other delimiters.\n" "\n" "\tThe selected file contains N lines of text. Only the first M of these " "will be shown for preview purposes in the following screens. You may choose " "below how much of the file should actually be imported." msgstr "" "Este asistente fará de guía a través do proceso de importación de datos " "dentro de PSPP a partir dun ficheiro de texto cunha liña por caso, na cal os " "campos están separados por tabuladores, comas ou outros delimitadores.\n" "\n" "O ficheiro seleccionado contén N liñas de texto. Soamente a primeira M " "destas se amosará como visualización nas seguintes pantallas. Pode escoller " "agora que parte do ficheiro debería importarse neste intre." #: src/ui/gui/text-data-import.ui:252 msgid "All cases" msgstr "Todos os casos" #: src/ui/gui/text-data-import.ui:272 msgid "Amount to Import" msgstr "Cantidade que importar" #: src/ui/gui/text-data-import.ui:325 msgid "C_ustom" msgstr "Pe_rsonalizar" #: src/ui/gui/text-data-import.ui:341 msgid "Slas_h (/)" msgstr "Barra dia_gonal (/)" #: src/ui/gui/text-data-import.ui:357 msgid "Semicolo_n (;)" msgstr "Punto e coma (;)" #: src/ui/gui/text-data-import.ui:373 msgid "P_ipe (|)" msgstr "_Canalización (|)" #: src/ui/gui/text-data-import.ui:389 msgid "H_yphen (-)" msgstr "Gu_ión (-)" #: src/ui/gui/text-data-import.ui:405 msgid "Co_mma (,)" msgstr "Co_ma (,)" #: src/ui/gui/text-data-import.ui:421 msgid "_Colon (:)" msgstr "_Dous puntos (:)" #: src/ui/gui/text-data-import.ui:437 msgid "Ban_g (!)" msgstr "A_dmiración (!)" #: src/ui/gui/text-data-import.ui:453 msgid "Ta_b" msgstr "Ta_bulador" #: src/ui/gui/text-data-import.ui:469 msgid "_Space" msgstr "_Espazo" #: src/ui/gui/text-data-import.ui:490 msgid "Separators" msgstr "Separadores" #: src/ui/gui/text-data-import.ui:541 msgid "Quote separator characters with" msgstr "Coma separadora de caracteres con" #: src/ui/gui/text-data-import.ui:561 msgid "Quoting" msgstr "Enrecomiñado" #: src/ui/gui/text-data-import.ui:599 msgid "Fields Preview" msgstr "Visualización de campos" #: src/ui/gui/text-data-import.ui:622 msgid "" "Enter below the sheet number and the cell range which you wish to import." msgstr "" "Introducir a seguir o número de folla e o rango de cela que quere importar." #: src/ui/gui/text-data-import.ui:670 msgid "_Cells: " msgstr "_Celas: " #: src/ui/gui/text-data-import.ui:684 msgid "_Sheet Index: " msgstr "Índice de _folla: " #: src/ui/gui/text-data-import.ui:695 msgid "Use first row as _variable names" msgstr "Utilice a primeira fila para os nomes de _variábeis" #: src/ui/gui/text-data-import.ui:717 msgid "Cells to Import" msgstr "Celas que importar" #: src/ui/gui/transpose.ui:24 msgid "Transpose" msgstr "Transpoñer" #: src/ui/gui/transpose.ui:91 msgid "Name Variable:" msgstr "Nome de variábel:" #: src/ui/gui/transpose.ui:127 msgid "Variable(s):" msgstr "Variábel(s):" #: src/ui/gui/univariate.ui:25 msgid "Univariate: Save" msgstr "Univariante: Gardar" #: src/ui/gui/univariate.ui:103 msgid "Univariate: Statistics" msgstr "Univariante: Estatísticas" #: src/ui/gui/univariate.ui:178 msgid "Univariate" msgstr "Univariante" #: src/ui/gui/univariate.ui:281 msgid "_Dependent Variable" msgstr "Variábel _dependente" #: src/ui/gui/univariate.ui:329 msgid "_Fixed Factors" msgstr "Factores _fixados" #: src/ui/gui/val-labs-dialog.ui:101 msgid "Value Label:" msgstr "Etiqueta do valor:" #: src/ui/gui/data-editor.ui:33 msgid "Information Area" msgstr "Área de información" #: src/ui/gui/data-editor.ui:55 msgid "Case Counter Area" msgstr "Área de contador do caso" #: src/ui/gui/data-editor.ui:80 msgid "Filter Use Status Area" msgstr "Área de estado no uso do filtro" #: src/ui/gui/data-editor.ui:106 msgid "Weight Status Area" msgstr "Área de estado da ponderación" #: src/ui/gui/data-editor.ui:132 msgid "Split File Status Area" msgstr "Dividir a área de estado do ficheiro" #: src/ui/gui/data-editor.ui:154 msgid "_View" msgstr "_Ver" #: src/ui/gui/data-editor.ui:157 msgid "_Status Bar" msgstr "Barra de e_stado" #: src/ui/gui/data-editor.ui:163 msgid "_Font..." msgstr "_Tipo de letra..." #: src/ui/gui/data-editor.ui:167 msgid "_Grid Lines" msgstr "Liñas da _grade" #: src/ui/gui/data-editor.ui:171 msgid "Value _Labels" msgstr "Etiquetas dos va_lores" #: src/ui/gui/data-editor.ui:182 msgid "_Variables" msgstr "_Variábeis" #: src/ui/gui/data-editor.ui:192 msgid "_Sort Cases..." msgstr "Ordenar os ca_sos..." #: src/ui/gui/data-editor.ui:196 msgid "_Transpose..." msgstr "_Transpoñer..." #: src/ui/gui/data-editor.ui:200 msgid "_Aggregate..." msgstr "_Agregar..." #: src/ui/gui/data-editor.ui:206 msgid "S_plit File..." msgstr "Di_vidir ficheiro..." #: src/ui/gui/data-editor.ui:210 msgid "Select _Cases..." msgstr "Seleccionar _casos..." #: src/ui/gui/data-editor.ui:214 msgid "_Weight Cases..." msgstr "_Ponderar casos..." #: src/ui/gui/data-editor.ui:220 msgid "_Transform" msgstr "_Transformar" #: src/ui/gui/data-editor.ui:223 msgid "_Compute..." msgstr "_Computar..." #: src/ui/gui/data-editor.ui:227 msgid "Cou_nt..." msgstr "Co_ntar..." #: src/ui/gui/data-editor.ui:231 msgid "Ran_k Cases..." msgstr "Clasifi_car casos..." #: src/ui/gui/data-editor.ui:235 msgid "Auto_matic Recode..." msgstr "Recodificación auto_mática..." #: src/ui/gui/data-editor.ui:241 msgid "Recode into _Same Variables..." msgstr "Recodificar coas me_smas variábeis..." #: src/ui/gui/data-editor.ui:245 msgid "Recode into _Different Variables..." msgstr "Recodificar con _diferentes variábeis..." #: src/ui/gui/data-editor.ui:251 msgid "_Run Pending Transforms" msgstr "_Executar transformacións pendentes" #: src/ui/gui/data-editor.ui:257 msgid "_Analyze" msgstr "_Analizar" #: src/ui/gui/data-editor.ui:260 msgid "_Descriptive Statistics" msgstr "Estatística _descritivas" #: src/ui/gui/data-editor.ui:262 msgid "_Frequencies..." msgstr "_Frecuencias..." #: src/ui/gui/data-editor.ui:270 msgid "_Explore..." msgstr "_Explorar..." #: src/ui/gui/data-editor.ui:274 msgid "_Crosstabs..." msgstr "Táboas _cruzadas..." #: src/ui/gui/data-editor.ui:279 msgid "Compare _Means" msgstr "Comparar _medias" #: src/ui/gui/data-editor.ui:281 msgid "_Means..." msgstr "_Medias..." #: src/ui/gui/data-editor.ui:285 msgid "_One Sample T Test..." msgstr "Test t de exemplo únic_o..." #: src/ui/gui/data-editor.ui:289 msgid "_Independent Samples T Test..." msgstr "Test T de mostras _independentes..." #: src/ui/gui/data-editor.ui:293 msgid "_Paired Samples T Test..." msgstr "Test t de mostras em_parelladas..." #: src/ui/gui/data-editor.ui:297 msgid "One Way _ANOVA..." msgstr "_ANOVA dun factor..." #: src/ui/gui/data-editor.ui:302 msgid "_Univariate Analysis..." msgstr "Análise _univariante..." #: src/ui/gui/data-editor.ui:306 msgid "Bivariate _Correlation..." msgstr "_Correlación bivariante..." #: src/ui/gui/data-editor.ui:310 msgid "_K-Means Cluster..." msgstr "Agrupación de medias _K..." #: src/ui/gui/data-editor.ui:314 #, fuzzy #| msgid "Factor _Analysis..." msgid "_Factor Analysis..." msgstr "_Análise factorial..." #: src/ui/gui/data-editor.ui:318 msgid "Re_liability..." msgstr "Fiabi_lidade..." #: src/ui/gui/data-editor.ui:322 msgid "_Regression" msgstr "_Regresión" #: src/ui/gui/data-editor.ui:325 msgid "_Linear..." msgstr "_Lineal..." #: src/ui/gui/data-editor.ui:329 msgid "_Binary Logistic..." msgstr "Loxística binaria..." #: src/ui/gui/data-editor.ui:335 msgid "_Non-Parametric Statistics" msgstr "Estatísticas _non paramétricas" #: src/ui/gui/data-editor.ui:338 #, fuzzy #| msgid "_Chi-Square..." msgid "_Chi Square..." msgstr "_Khi cadrado..." #: src/ui/gui/data-editor.ui:342 msgid "_Binomial..." msgstr "_Binomial..." #: src/ui/gui/data-editor.ui:346 #, fuzzy #| msgid "R_uns..." msgid "_Runs..." msgstr "Exec_ucións..." #: src/ui/gui/data-editor.ui:350 #, fuzzy #| msgid "1-Sample _K-S..." msgid "_1 Sample K-S..." msgstr "1-Mostra _K-S..." #: src/ui/gui/data-editor.ui:354 #, fuzzy #| msgid "2 _Related Samples..." msgid "_2 Related Samples..." msgstr "2 Mostras _relacionadas..." #: src/ui/gui/data-editor.ui:358 #, fuzzy #| msgid "K Related _Samples..." msgid "_K Related Samples..." msgstr "K Mo_stras relacionadas..." #: src/ui/gui/data-editor.ui:362 #, fuzzy #| msgid "_Independent Samples T Test..." msgid "K _Independent Samples..." msgstr "Test T de mostras _independentes..." #: src/ui/gui/data-editor.ui:368 msgid "ROC Cur_ve..." msgstr "Cur_va ROC..." #: src/ui/gui/data-editor.ui:374 msgid "_Graphs" msgstr "" #: src/ui/gui/data-editor.ui:377 #, fuzzy #| msgid "_Scree plot" msgid "_Scatterplot" msgstr "Diagrama de _sedimentación" #: src/ui/gui/data-editor.ui:381 #, fuzzy #| msgid "Draw _histograms" msgid "_Histogram" msgstr "Debuxar _histogramas" #: src/ui/gui/data-editor.ui:385 msgid "_Barchart" msgstr "" #: src/ui/gui/data-editor.ui:391 msgid "_Utilities" msgstr "_Utilidades" #: src/ui/gui/data-editor.ui:394 msgid "_Variables..." msgstr "_Variábeis..." #: src/ui/gui/data-editor.ui:398 msgid "Data File _Comments..." msgstr "_Comentarios de ficheiro de datos..." #: src/ui/gui/output-window.ui:71 msgid "_Print..." msgstr "Im_primir..." #: src/ui/gui/output-window.ui:76 msgid "_Export..." msgstr "_Exportar..." #: src/ui/gui/output-window.ui:92 msgid "Select _All" msgstr "Seleccionar _todo" #: src/ui/gui/syntax-editor.ui:27 #, fuzzy #| msgid "_Syntax" msgid "Syntax" msgstr "_Sintaxe" #: src/ui/gui/syntax-editor.ui:31 #, fuzzy #| msgid "_Data" msgid "Data" msgstr "_Datos" #: src/ui/gui/syntax-editor.ui:41 msgid "_Save" msgstr "_Gardar" #: src/ui/gui/syntax-editor.ui:46 #, fuzzy #| msgid "Save _As..." msgid "Save _As" msgstr "Gardar _como..." #: src/ui/gui/syntax-editor.ui:53 #, fuzzy #| msgid "_Print..." msgid "_Print" msgstr "Im_primir..." #: src/ui/gui/syntax-editor.ui:84 #, fuzzy #| msgid "Deleted" msgid "_Delete" msgstr "Eliminado" #: src/ui/gui/syntax-editor.ui:90 msgid "_Undo" msgstr "" #: src/ui/gui/syntax-editor.ui:94 msgid "_Redo" msgstr "" #: src/ui/gui/syntax-editor.ui:100 #, fuzzy #| msgid "_Find..." msgid "_Find" msgstr "_Atopar..." #: src/ui/gui/syntax-editor.ui:106 msgid "_Run" msgstr "_Executar" #: src/ui/gui/syntax-editor.ui:109 msgid "_All" msgstr "" #: src/ui/gui/syntax-editor.ui:113 #, fuzzy #| msgid "Selection" msgid "_Selection" msgstr "Selección" #: src/ui/gui/syntax-editor.ui:117 #, fuzzy #| msgid "Current Line" msgid "_Current Line" msgstr "Liña actual" #: src/ui/gui/syntax-editor.ui:122 #, fuzzy #| msgid "To End" msgid "_To End" msgstr "Ata o remate" #: src/ui/gui/var-type-dialog.ui:99 msgid "Scientific notation" msgstr "Notación científica" #: src/ui/gui/var-type-dialog.ui:150 msgid "Custom currency" msgstr "Moeda personalizada" #: src/ui/gui/var-type-dialog.ui:267 msgid "positive" msgstr "positivo" #: src/ui/gui/var-type-dialog.ui:279 msgid "negative" msgstr "negativo" #: src/ui/gui/var-type-dialog.ui:293 msgid "Sample" msgstr "Mostra" #: src/ui/gui/var-type-dialog.ui:350 msgid "Width:" msgstr "Largura:" #: src/ui/gui/var-type-dialog.ui:396 msgid "Decimal Places:" msgstr "Posicións decimais:" #: src/ui/gui/weight.ui:24 msgid "Weight Cases" msgstr "Ponderar casos" #: src/ui/gui/weight.ui:100 msgid "Weight cases by" msgstr "Ponderar casos por" #: src/ui/gui/weight.ui:144 msgid "Frequency Variable" msgstr "Variábel de frecuencia" #: src/ui/gui/weight.ui:198 msgid "Current Status: " msgstr "Estado actual: " #. TRANSLATORS: This is the application name in the desktop file #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:7 #: src/ui/gui/org.fsf.pspp.desktop.in:7 msgid "GNU PSPP" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:8 #, fuzzy #| msgid "A program for the analysis of sampled data" msgid "GNU PSPP is a program for statistical analysis of sampled data" msgstr "Un programa para a análise de datos de mostras" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:10 msgid "" "GNU PSPP is a program for the statistical analysis of sampled data. It is a " "Free replacement for the proprietary program SPSS, and appears very similar " "to it with a few exceptions. The most important of these exceptions are, " "that there are no “time bombs”; your copy of PSPP will not “expire” or " "deliberately stop working in the future. Neither are there any artificial " "limits on the number of cases or variables which you can use. There are no " "additional packages to purchase in order to get “advanced” functions; all " "functionality that PSPP currently supports is in the core package." msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:11 msgid "" "PSPP is a stable and reliable application. It can perform descriptive " "statistics, T-tests, anova, linear and logistic regression, measures of " "association, cluster analysis, reliability and factor analysis, non-" "parametric tests and more. Its backend is designed to perform its analyses " "as fast as possible, regardless of the size of the input data. You can use " "PSPP with its graphical interface or the more traditional syntax commands." msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:12 msgid "A brief list of some of the PSPP's features." msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:14 msgid "Support for over 1 billion cases" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:15 msgid "Support for over 1 billion variables" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:16 msgid "Syntax and data files which are compatible with those of SPSS" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:17 msgid "A choice of terminal or graphical user interface" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:18 msgid "A choice of text, postscript, pdf, opendocument or html output formats" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:19 msgid "" "Inter-operability with: LibreOffice, Apache OpenOffice, Gnumeric and other " "free software" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:20 msgid "Easy data import from spreadsheets, text files and database sources" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:21 msgid "" "The capability to open, analyse and edit two or more datasets concurrently" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:22 msgid "A user interface supporting all common character sets" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:23 msgid "A user interface has been translated to multiple languages" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:24 msgid "Very fast statistical procedures, even on very large data sets" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:25 msgid "No license fees and no expiration period" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:26 msgid "No unethical “end user license agreements”" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:27 msgid "A fully indexed user manual" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:28 msgid "Freedom ensured; It is licensed under the GPLv3 or later" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:29 msgid "" "Portability; Runs on many different computers and many different operating " "systems" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:31 msgid "" "PSPP is particularly aimed at statisticians, social scientists and students " "requiring fast convenient analysis of sampled data." msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:41 #, fuzzy #| msgid "Variable View" msgid "GNU PSPP Variable View" msgstr "Vista de variábel" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:54 msgid "Free Software Foundation" msgstr "" #: src/ui/gui/org.fsf.pspp.desktop.in:8 msgid "Statistical Software" msgstr "Software estatístico" #: src/ui/gui/org.fsf.pspp.desktop.in:9 msgid "Analyze statistical data with a free alternative to SPSS" msgstr "Analizar datos estatísticos cunha alternativa libre a SPSS" #. TRANSLATORS: Do not translate this string. Keep it as is, verbatim. #: src/ui/gui/org.fsf.pspp.desktop.in:12 msgid "pspp" msgstr "" #. TRANSLATORS: You must keep all ";" - also at the end of line. #: src/ui/gui/org.fsf.pspp.desktop.in:17 msgid "statistics;analysis;spss;" msgstr "" #~ msgid "Sorry. The help system hasn't yet been implemented." #~ msgstr "Desculpe. O sistema de axuda aínda non foi incluído." #~ msgid "Support for %s files was not compiled into this installation of PSPP" #~ msgstr "" #~ "A compatibilidade cos ficheiros %s non se compilou nesta instalación de " #~ "PSPP" #~ msgid "Multiple response set name `%s' does not begin with `$'." #~ msgstr "Nome do conxunto de resposta múltipla «%s» non comeza con «$»." #~ msgid "expecting number or data string" #~ msgstr "agárdase un número ou unha cadea de datos" #~ msgid "Details" #~ msgstr "Detalles" #~ msgid "Multiple dichotomy set" #~ msgstr "Conxunto de dicotomía múltipla" #~ msgid "Multiple category set" #~ msgstr "Conxunto de categorías múltiplas" #~ msgid "Label source" #~ msgstr "Orixe da etiqueta" #~ msgid "First variable label among variables" #~ msgstr "Primeira etiqueta de variábel entre variábeis" #~ msgid "Provided by user" #~ msgstr "Fornecida polo usuario" #~ msgid "Variable labels" #~ msgstr "Etiquetas de variábeis" #~ msgid "Value labels of counted value" #~ msgstr "Etiquetas de valor do valor calculado" #~ msgid "Label:" #~ msgstr "Etiqueta:" #~ msgid "No label." #~ msgstr "Sen etiqueta." #~ msgid "Product:" #~ msgstr "Produto:" #~ msgid "Variables:" #~ msgstr "Variábeis:" #~ msgid "Cases:" #~ msgstr "Casos:" #~ msgid "Type:" #~ msgstr "Tipo:" #~ msgid "Description" #~ msgstr "Descrición" #~ msgid "The active dataset does not have a file label." #~ msgstr "O conxunto de datos activo non ten unha etiqueta de ficheiro." #~ msgid "File label: %s" #~ msgstr "Etiqueta de ficheiro: %s" #~ msgid "The active dataset dictionary does not contain any documents." #~ msgstr "" #~ "O dicionario do conxunto de datos activo non contén ningún documento." #~ msgid "Documents in the active dataset:" #~ msgstr "Documentos no conxunto de datos activo:" #~ msgid "Custom data file attributes." #~ msgstr "Atributos do ficheiro de datos personalizado." #~ msgid "Label: %s\n" #~ msgstr "Etiqueta: %s\n" #~ msgid "Format: %s\n" #~ msgstr "Formato: %s\n" #~ msgid "Print Format: %s\n" #~ msgstr "Imprimir formato: %s\n" #~ msgid "Write Format: %s\n" #~ msgstr "Escribir formato: %s\n" #~ msgid "Measure: %s\n" #~ msgstr "Medida: %s\n" #~ msgid "Role: %s\n" #~ msgstr "Rol: %s\n" #~ msgid "Display Alignment: %s\n" #~ msgstr "Presentar aliñamento: %s\n" #~ msgid "Display Width: %d\n" #~ msgstr "Presentar largura: %d\n" #~ msgid "Missing Values: " #~ msgstr "Valores que faltan: " #~ msgid "Interactive shell not supported on this platform." #~ msgstr "A shell interactiva non é compatíbel con esta plataforma." #~ msgid "Error executing command: %s." #~ msgstr "Produciuse un erro ao executar a orde: %s." #~ msgid "Unknown TABLECELLS class" #~ msgstr "A clase TABLECELLS resulta descoñecida" #~ msgid "Exact Sig. (%d-tailed)" #~ msgstr "Sign. exacta (%d-colas)" #~ msgid "Valid N" #~ msgstr "N válido" #~ msgid "Missing N" #~ msgstr "N ausente" #~ msgid "Valid cases = %.*g; cases with missing value(s) = %.*g." #~ msgstr "Casos válidos = %.*g; casos no que falta o valor(es) = %.*g." #~ msgid "%g" #~ msgstr "%g" #~ msgid "%d" #~ msgstr "%d" #~ msgid "%zu" #~ msgstr "%zu" #~ msgid "Bar charts are not implemented." #~ msgstr "As gráficas de barra non están implementadas." #~ msgid "No valid data for variable %s; statistics not displayed." #~ msgstr "" #~ "Non hai datos válidos para a variábel %s; non se amosan as estatísticas." #~ msgid "50 (Median)" #~ msgstr "50 (Mediana)" #~ msgid "(%d)" #~ msgstr "(%d)" #~ msgid "Min" #~ msgstr "Mín." #~ msgid "Max" #~ msgstr "Máx." #~ msgid "%g%%" #~ msgstr "%g%%" #~ msgid "25th" #~ msgstr "25º" #~ msgid "50th (Median)" #~ msgstr "50º (Media)" #~ msgid "75th" #~ msgstr "75º" #~ msgid "(I) %s" #~ msgstr "(I) %s" #~ msgid "(J) %s" #~ msgstr "(J) %s" #~ msgid "(I - J)" #~ msgstr "(I - J)" #~ msgid "Number of clusters may not be larger than the number of cases." #~ msgstr "O número de agrupacións non pode ser maior que o número de casos." #~ msgid "%s into %s(%s of %s using %s BY %s)" #~ msgstr "%s dentro de %s(%s de %s utilizando %s por %s)" #~ msgid "%s into %s(%s of %s BY %s)" #~ msgstr "%s dentro de %s(%s de %s por %s)" #~ msgid "%s into %s(%s of %s using %s)" #~ msgstr "%s dentro de %s(%s de %s utilizando %s)" #~ msgid "%s into %s(%s of %s)" #~ msgstr "%s dentro de %s(%s de %s)" #~ msgid "Area Under the Curve (%s)" #~ msgstr "Área baixo a curva (%s)" #~ msgid "Coordinates of the Curve (%s)" #~ msgstr "Coordinadas da curva (%s)" #~ msgid "Std. Error Mean" #~ msgstr "Media de erro estándar" #~ msgid "(active dataset)" #~ msgstr "(conxunto de datos activo)" #~ msgid "Writing %zu record to %s." #~ msgid_plural "Writing %zu records to %s." #~ msgstr[0] "Escribindo o rexistro %zu para %s." #~ msgstr[1] "Escribindo os rexistros %zu para %s." #~ msgid "Writing %zu record." #~ msgid_plural "Writing %zu records." #~ msgstr[0] "Escribindo o rexistro %zu." #~ msgstr[1] "Escribindo os rexistros %zu." #~ msgid "Failed to seek to end of central directory record: %s" #~ msgstr "Fallu a busca no remate do rexistro do directorio central: %s" #~ msgid "Failed to seek to central directory: %s" #~ msgstr "Fallou a busca no directorio central: %s" #~ msgid "Failed to seek to start of member `%s': %s" #~ msgstr "Fallou a busca para comezar a partir do membro «%s»: %s" #~ msgid "ascii: closing output file `%s'" #~ msgstr "ascii: pechando o ficheiro de resultado «%s»" #~ msgid "%s - Page %d" #~ msgstr "%s - Páxina %d" #~ msgid "bad vline: x=%d+%d=%d y=(%d+%d=%d,%d+%d=%d) in table size (%d,%d)\n" #~ msgstr "" #~ "mala liña v: x=%d+%d=%d y=(%d+%d=%d,%d+%d=%d) no tamaño da táboa (%d,%d)\n" #~ msgid "bad hline: x=(%d+%d=%d,%d+%d=%d) y=%d+%d=%d in table size (%d,%d)\n" #~ msgstr "" #~ "mala liña h: x=%d+%d=%d y=(%d+%d=%d,%d+%d=%d) no tamaño da táboa (%d,%d)\n" #~ msgid "" #~ "bad box: (%d+%d=%d,%d+%d=%d)-(%d+%d=%d,%d+%d=%d) in table size (%d,%d)\n" #~ msgstr "" #~ "mala caixa: (%d+%d=%d,%d+%d=%d)-(%d+%d=%d,%d+%d=%d) no tamaño da táboa " #~ "(%d,%d)\n" #~ msgid "could not access definition for terminal `%s'" #~ msgstr "non foi posíbel acceder á definición por terminal «%s»" #~ msgid "TreeView path" #~ msgstr "Ruta de vista en árbore" #~ msgid "The path to the row in the GtkTreeView, as a string" #~ msgstr "A ruta á fila en GtkTreeView, como unha cadea" #~ msgid "Diagonal slash" #~ msgstr "Barra diagonal" #~ msgid "Whether to draw a diagonal slash across the button." #~ msgstr "Cando debuxar unha barra diagonal a través do botón." #~ msgid "" #~ "PSPPIRE, a GUI for PSPP, a program for statistical analysis of sampled " #~ "data.\n" #~ "Usage: %s [OPTION]... FILE\n" #~ "\n" #~ "Arguments to long options also apply to equivalent short options.\n" #~ "\n" #~ "GUI options:\n" #~ " -q, --no-splash don't show splash screen during startup\n" #~ "\n" #~ "%sLanguage options:\n" #~ " -I, --include=DIR append DIR to search path\n" #~ " -I-, --no-include clear search path\n" #~ " -a, --algorithm={compatible|enhanced}\n" #~ " set to `compatible' if you want output\n" #~ " calculated from broken algorithms\n" #~ " -x, --syntax={compatible|enhanced}\n" #~ " set to `compatible' to disable PSPP " #~ "extensions\n" #~ " -i, --interactive interpret syntax in interactive mode\n" #~ " -s, --safer don't allow some unsafe operations\n" #~ "Default search path: %s\n" #~ "\n" #~ "Informative output:\n" #~ " -h, --help display this help and exit\n" #~ " -V, --version output version information and exit\n" #~ "\n" #~ "A non-option argument is interpreted as a data file in .sav or .zsav or ." #~ "por\n" #~ "format or a syntax file to load.\n" #~ msgstr "" #~ "PSPPIRE, unha interface gráfica para usuario (IGU) de PSPP, programa de " #~ "análise estatística de datos de mostras.\n" #~ "Utilización: %s [OPCIÓN]... FICHEIRO\n" #~ "\n" #~ "Os argumentos para opcións longas tamén son aplicábeis ás opcións curtas " #~ "equivalentes.\n" #~ "\n" #~ "Opcións da IGU:\n" #~ " -q, --no-splash non amosar a pantalla animada durante o " #~ "arranque\n" #~ "\n" #~ "%sOpcións de idioma:\n" #~ " -I, --include=DIR engadir DIR á ruta de busca\n" #~ " -I-, --no-include limpara ruta de busca\n" #~ " -a, --algorithm={compatible|enhanced}\n" #~ " estabelecer como «compatíbel» se que un " #~ "resultado\n" #~ " calculado a partir de algoritmos estragados\n" #~ " -x, --syntax={compatible|enhanced}\n" #~ " estabelecer como «compatíbel» para desactivar " #~ "as extensións de PSPP\n" #~ " -i, --interactive interpretar sintaxe en modo interactivo\n" #~ " -s, --safer non permitir ningunha operación insegura\n" #~ "Ruta de busca predeterminada: %s\n" #~ "\n" #~ "Saída de información:\n" #~ " -h, --help presenta esta axuda e a saída\n" #~ " -V, --version ofrece información sobre a versión e sae\n" #~ "\n" #~ "Un argumento non opcional interprétase como un ficheiro de data en " #~ "formato .sav ou .zsav \n" #~ "ou .por ou un ficheiro de sintaxe que cargar.\n" #~ msgid "Incorrect value for variable type" #~ msgstr "Valor incorrecto para o tipo de variábel" #~ msgid "_Select" #~ msgstr "_Seleccionar" #~ msgid "Enter a number to add a new variable." #~ msgstr "Escriba un número ao que engadir unha nova variábel." #~ msgid "Enter a number to add a new case." #~ msgstr "Escriba un número ao que engadir un novo caso." #~ msgid "Font Selection" #~ msgstr "Selección do tipo de letra" #~ msgid "Cannot create variable." #~ msgstr "Non se pode crear a variábel." #~ msgid "\"%s\" is not a valid variable name." #~ msgstr "«%s» non é un nome de variábel correcto." #~ msgid "This dictionary already contains a variable named \"%s\"." #~ msgstr "Este dicionario xa contén unha variábel nomeada «%s»." #~ msgid "Cannot rename variable." #~ msgstr "Non se pode renomear a variábel." #~ msgid "Enter a variable name to add a new variable." #~ msgstr "Escriba un nome de variábel para engadila como nova." #~ msgid "{%s, %s}\n" #~ msgstr "{%s, %s}\n" #~ msgid "Import Delimited Text Data" #~ msgstr "Importar datos en texto delimitado" #~ msgid "An error occurred reading the spreadsheet file." #~ msgstr "Produciuse un erro ao ler o ficheiro da folla de cálculo." #~ msgid "This input line has too few separators to fill in this field." #~ msgstr "" #~ "Esta liña de entrada ten demasiado poucos separadores para encher este " #~ "campo." #~ msgid "Cannot parse field content `%.*s' as format %s: %s" #~ msgstr "Non se pode procesar o contido «%.*s» do campo como formato %s: %s" #~ msgid "can only convert encrypted data file to sav or sys format" #~ msgstr "" #~ "soamente se poden converter os datos cifrados como sav ou formato sys" #~ msgid "count" #~ msgstr "contar" #~ msgid "expected" #~ msgstr "agardábase" #~ msgid "residual" #~ msgstr "residual" #~ msgid "std. resid." #~ msgstr "residuo est." #~ msgid "adj. resid." #~ msgstr "residuo axus." #~ msgid "Chi-square tests." #~ msgstr "Tests khi cadrado." #~ msgid "Odds Ratio for %s (%.*s / %.*s)" #~ msgstr "Razón de probabilidades para %s (%.*s / %.*s)" #~ msgid "For cohort %s = %.*s" #~ msgstr "Por cohorte %s = %.*s" #~ msgid "Delete the variables at the selected position(s)" #~ msgstr "Eliminar as variábeis na posición(s) seleccionada" #~ msgid "Delete the cases at the selected position(s)" #~ msgstr "Eliminar os casos na posición(s) seleccionada" #~ msgid "(optional case selection condition)" #~ msgstr "(condición opcional de selección de caso)" #~ msgid "Importing Textual Data" #~ msgstr "Importación de datos textuais" #~ msgid "Doubled quote mark treated as escape" #~ msgstr "A marca de dobres comiñas tratada como de escape" #~ msgid "_Open..." #~ msgstr "_Abrir..." #~ msgid "Transpose the cases with the variables" #~ msgstr "Transpoñer os casos coas variábeis" #~ msgid "Choose a subset of cases for analysis" #~ msgstr "Escoller un subconxunto de casos para a súa análise" #~ msgid "All" #~ msgstr "Todo" #~ msgid "Label: %s" #~ msgstr "Etiqueta: %s" #~ msgid "Format: %s" #~ msgstr "Formato: %s" #~ msgid "Print Format: %s" #~ msgstr "Imprimir formato: %s" #~ msgid "Measure: %s" #~ msgstr "Medida: %s" #~ msgid "Role: %s" #~ msgstr "Rol: %s" #~ msgid "Display Alignment: %s" #~ msgstr "Presentar aliñamento: %s" #~ msgid "Display Width: %d" #~ msgstr "Presentar largura: %d" #~ msgid "" #~ "The following table lists the encodings that can successfully read %s, by " #~ "specifying the encoding name on the GET command's ENCODING subcommand. " #~ "Encodings that yield identical text are listed together." #~ msgstr "" #~ "A seguinte táboa lista as codificacións que poden ler sucesivamente %s, " #~ "ao especificar o nome da codificación na orde GET na suborde ENCODING.\n" #~ "As codificacións que producen texto idéntico lístanse xuntas." #~ msgid "" #~ "The following table lists text strings in the file dictionary that the " #~ "encodings above interpret differently, along with those interpretations." #~ msgstr "" #~ "A seguinte táboa lista as cadeas de texto no ficheiro de dicionario que " #~ "as codificacións anteriores interpretan diferentemente, xunto coas súas " #~ "interpretacións." #~ msgid "Type: %s\n" #~ msgstr "Tipo: %s\n" #~ msgid "Missing Values: %s\n" #~ msgstr "Valores que faltan: %s\n" #~ msgid "Value Labels:\n" #~ msgstr "Etiquetas de valor:\n" #~ msgid "%s %s\n" #~ msgstr "%s %s\n" #~ msgid "Variables %s specified multiple times on %s subcommand." #~ msgstr "%s variábeis especificadas múltiplas veces na suborde %s." #~ msgid "Variables %s specified on %s but not on %s." #~ msgstr "%s variábeis especificadas en %s pero non en %s." pspp-1.4.1/po/ChangeLog0000644000175000017500000000026113320146056014302 0ustar00blpblp00000000000000Sat May 27 16:31:29 WST 2006 John Darrington * Makevars, POTFILES.in: Added glade file to the list of translatable files. * de.po: Added. pspp-1.4.1/po/pspp.pot0000644000175000017500000067557613725012645014276 0ustar00blpblp00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR Free Software Foundation, Inc. # This file is distributed under the same license as the pspp package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: pspp 1.4.1\n" "Report-Msgid-Bugs-To: pspp-dev@gnu.org\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n" #: src/data/any-reader.c:72 src/data/encrypted-file.c:78 #, c-format msgid "An error occurred while opening `%s': %s." msgstr "" #: src/data/any-reader.c:93 src/language/lexer/lexer.c:1633 #, c-format msgid "Error reading `%s': %s." msgstr "" #: src/data/any-reader.c:114 #, c-format msgid "`%s' is not a system or portable file." msgstr "" #: src/data/any-reader.c:123 src/data/any-writer.c:66 msgid "The inline file is not allowed here." msgstr "" #: src/data/any-reader.c:205 #, c-format msgid "" "Cannot read from dataset %s because no dictionary or data has been written " "to it yet." msgstr "" #: src/data/any-reader.c:260 src/language/data-io/dataset.c:253 msgid "Dataset" msgstr "" #: src/data/calendar.c:100 #, c-format msgid "Month %d is not in acceptable range of 0 to 13." msgstr "" #: src/data/calendar.c:110 #, c-format msgid "Day %d is not in acceptable range of 0 to 31." msgstr "" #: src/data/calendar.c:119 #, c-format msgid "Date %04d-%d-%d is before the earliest acceptable date of 1582-10-15." msgstr "" #: src/data/casereader-filter.c:221 msgid "" "At least one case in the data read had a weight value that was user-missing, " "system-missing, zero, or negative. These case(s) were ignored." msgstr "" #. TRANSLATORS: this fragment will be interpolated into messages in fh_lock() #. that identify types of files. #: src/data/csv-file-writer.c:138 msgid "CSV file" msgstr "" #: src/data/csv-file-writer.c:146 #, c-format msgid "Error opening `%s' for writing as a CSV file: %s." msgstr "" #: src/data/csv-file-writer.c:453 #, c-format msgid "An I/O error occurred writing CSV file `%s'." msgstr "" #: src/data/data-in.c:175 #, c-format msgid "Data is not valid as format %s: %s" msgstr "" #: src/data/data-in.c:377 src/data/data-in.c:553 msgid "Field contents are not numeric." msgstr "" #: src/data/data-in.c:379 src/data/data-in.c:555 msgid "Number followed by garbage." msgstr "" #: src/data/data-in.c:392 msgid "Invalid numeric syntax." msgstr "" #: src/data/data-in.c:400 src/data/data-in.c:571 msgid "Too-large number set to system-missing." msgstr "" #: src/data/data-in.c:406 src/data/data-in.c:577 msgid "Too-small number set to zero." msgstr "" #: src/data/data-in.c:426 msgid "All characters in field must be digits." msgstr "" #: src/data/data-in.c:445 msgid "Unrecognized character in field." msgstr "" #: src/data/data-in.c:466 src/data/data-in.c:729 msgid "Field must have even length." msgstr "" #: src/data/data-in.c:468 src/data/data-in.c:732 msgid "Field must contain only hex digits." msgstr "" #: src/data/data-in.c:544 msgid "Invalid zoned decimal syntax." msgstr "" #: src/data/data-in.c:644 src/data/data-in.c:650 msgid "Invalid syntax for P field." msgstr "" #: src/data/data-in.c:768 src/data/data-in.c:818 msgid "Syntax error in date field." msgstr "" #: src/data/data-in.c:783 #, c-format msgid "Day (%ld) must be between 1 and 31." msgstr "" #: src/data/data-in.c:832 msgid "Delimiter expected between fields in date." msgstr "" #: src/data/data-in.c:906 msgid "" "Unrecognized month format. Months may be specified as Arabic or Roman " "numerals or as at least 3 letters of their English names." msgstr "" #: src/data/data-in.c:933 #, c-format msgid "Year (%ld) must be between 1582 and 19999." msgstr "" #: src/data/data-in.c:944 #, c-format msgid "Trailing garbage `%.*s' following date." msgstr "" #: src/data/data-in.c:958 msgid "Julian day must have exactly three digits." msgstr "" #: src/data/data-in.c:960 #, c-format msgid "Julian day (%ld) must be between 1 and 366." msgstr "" #: src/data/data-in.c:984 #, c-format msgid "Quarter (%ld) must be between 1 and 4." msgstr "" #: src/data/data-in.c:1005 #, c-format msgid "Week (%ld) must be between 1 and 53." msgstr "" #: src/data/data-in.c:1017 msgid "Delimiter expected between fields in time." msgstr "" #: src/data/data-in.c:1037 #, c-format msgid "Minute (%ld) must be between 0 and 59." msgstr "" #: src/data/data-in.c:1075 msgid "" "Unrecognized weekday name. At least the first two letters of an English " "weekday name must be specified." msgstr "" #: src/data/data-in.c:1210 #, c-format msgid "`%c' expected in date field." msgstr "" #: src/data/data-out.c:580 #, c-format msgid "Weekday number %f is not between 1 and 7." msgstr "" #: src/data/data-out.c:605 #, c-format msgid "Month number %f is not between 1 and 12." msgstr "" #. TRANSLATORS: this fragment will be interpolated into #. messages in fh_lock() that identify types of files. #: src/data/dataset-writer.c:66 src/language/data-io/file-handle.c:304 msgid "dataset" msgstr "" #: src/data/dict-class.c:52 msgid "ordinary" msgstr "" #: src/data/dict-class.c:54 msgid "system" msgstr "" #: src/data/dict-class.c:56 msgid "scratch" msgstr "" #: src/data/dictionary.c:1523 #, c-format msgid "Truncating document line to %d bytes." msgstr "" #: src/data/encrypted-file.c:89 #, c-format msgid "An error occurred while reading `%s': %s." msgstr "" #: src/data/encrypted-file.c:430 #, c-format msgid "" "%s: encrypted file corrupted (ends in incomplete %u-byte ciphertext block)" msgstr "" #: src/data/encrypted-file.c:449 #, c-format msgid "%s: encrypted file corrupted (ends with bad padding)" msgstr "" #: src/data/file-handle-def.c:283 src/language/data-io/dataset.c:266 msgid "active dataset" msgstr "" #: src/data/file-handle-def.c:518 #, c-format msgid "Can't read from %s as a %s because it is already being read as a %s." msgstr "" #: src/data/file-handle-def.c:522 #, c-format msgid "Can't write to %s as a %s because it is already being written as a %s." msgstr "" #: src/data/file-handle-def.c:529 #, c-format msgid "Can't re-open %s as a %s." msgstr "" #: src/data/file-name.c:133 #, c-format msgid "Not opening pipe file `%s' because %s option set." msgstr "" #: src/data/format.c:339 msgid "Input format" msgstr "" #: src/data/format.c:339 msgid "Output format" msgstr "" #: src/data/format.c:342 #, c-format msgid "Format %s may not be used for input." msgstr "" #: src/data/format.c:349 #, c-format msgid "%s specifies width %d, but %s requires an even width." msgstr "" #: src/data/format.c:358 #, c-format msgid "%s %s specifies width %d, but %s requires a width between %d and %d." msgstr "" #: src/data/format.c:367 #, c-format msgid "%s %s specifies %d decimal place, but %s does not allow any decimals." msgid_plural "" "%s %s specifies %d decimal places, but %s does not allow any decimals." msgstr[0] "" msgstr[1] "" #: src/data/format.c:378 #, c-format msgid "" "%s %s specifies %d decimal place, but the given width allows at most %d " "decimals." msgid_plural "" "%s %s specifies %d decimal places, but the given width allows at most %d " "decimals." msgstr[0] "" msgstr[1] "" #: src/data/format.c:385 #, c-format msgid "" "%s %s specifies %d decimal place, but the given width does not allow for any " "decimals." msgid_plural "" "%s %s specifies %d decimal places, but the given width does not allow for " "any decimals." msgstr[0] "" msgstr[1] "" #: src/data/format.c:424 #, c-format msgid "%s variables are not compatible with %s format %s." msgstr "" #: src/data/format.c:425 src/data/format.c:1074 #: src/ui/gui/var-type-dialog.ui:167 msgid "String" msgstr "" #: src/data/format.c:425 src/data/format.c:1035 #: src/ui/gui/var-type-dialog.ui:48 msgid "Numeric" msgstr "" #: src/data/format.c:426 src/data/sys-file-reader.c:2212 #: src/data/sys-file-reader.c:2214 src/language/xforms/recode.c:512 #: src/language/xforms/recode.c:513 src/language/xforms/recode.c:525 #: src/language/xforms/recode.c:526 #: src/language/dictionary/apply-dictionary.c:77 #: src/language/dictionary/apply-dictionary.c:78 msgid "numeric" msgstr "" #: src/data/format.c:426 src/data/sys-file-reader.c:2212 #: src/data/sys-file-reader.c:2214 src/language/xforms/recode.c:512 #: src/language/xforms/recode.c:513 src/language/xforms/recode.c:525 #: src/language/xforms/recode.c:526 #: src/language/dictionary/apply-dictionary.c:77 #: src/language/dictionary/apply-dictionary.c:78 msgid "string" msgstr "" #: src/data/format.c:444 #, c-format msgid "String variable with width %d is not compatible with format %s." msgstr "" #: src/data/format.c:1038 src/ui/gui/var-type-dialog.ui:65 msgid "Comma" msgstr "" #: src/data/format.c:1041 src/ui/gui/var-type-dialog.ui:82 msgid "Dot" msgstr "" #: src/data/format.c:1044 msgid "Scientific" msgstr "" #: src/data/format.c:1061 src/ui/gui/var-type-dialog.ui:116 msgid "Date" msgstr "" #: src/data/format.c:1064 src/ui/gui/var-type-dialog.ui:133 msgid "Dollar" msgstr "" #: src/data/format.c:1071 msgid "Custom" msgstr "" #: src/data/gnumeric-reader.c:478 src/data/ods-reader.c:505 #, c-format msgid "Cannot convert the value in the spreadsheet cell %s to format (%s): %s" msgstr "" #: src/data/gnumeric-reader.c:502 src/data/ods-reader.c:567 #, c-format msgid "" "There was a problem whilst reading the %s file `%s' (near line %d): `%s'" msgstr "" #: src/data/gnumeric-reader.c:597 #, c-format msgid "" "The gnumeric file `%s' is encoded as %s instead of the usual UTF-8 encoding. " "Any non-ascii characters will be incorrectly imported." msgstr "" #: src/data/gnumeric-reader.c:641 src/data/ods-reader.c:682 #, c-format msgid "Invalid cell range `%s'" msgstr "" #: src/data/gnumeric-reader.c:813 src/data/ods-reader.c:710 #: src/data/ods-reader.c:843 #, c-format msgid "Selected sheet or range of spreadsheet `%s' is empty." msgstr "" #: src/data/identifier2.c:60 #, c-format msgid "Identifier `%s' exceeds %d-byte limit." msgstr "" #: src/data/identifier2.c:84 msgid "Identifier cannot be empty string." msgstr "" #: src/data/identifier2.c:92 #, c-format msgid "`%s' may not be used as an identifier because it is a reserved word." msgstr "" #: src/data/identifier2.c:103 #, c-format msgid "" "`%s' may not be used as an identifier because it contains ill-formed UTF-8 " "at byte offset %tu." msgstr "" #: src/data/identifier2.c:114 #, c-format msgid "" "Character %s (in `%s') may not appear as the first character in a identifier." msgstr "" #: src/data/identifier2.c:126 #, c-format msgid "Character %s (in `%s') may not appear in an identifier." msgstr "" #: src/data/mdd-writer.c:241 #, c-format msgid "An I/O error occurred writing metadata file `%s'." msgstr "" #. TRANSLATORS: this fragment will be interpolated into #. messages in fh_lock() that identify types of files. #: src/data/mdd-writer.c:457 msgid "metadata file" msgstr "" #: src/data/mdd-writer.c:465 #, c-format msgid "Error opening `%s' for writing as a metadata file: %s." msgstr "" #: src/data/mdd-writer.c:473 #, c-format msgid "Internal error creating xmlTextWriter. Please report this to %s." msgstr "" #: src/data/make-file.c:217 #, c-format msgid "Opening %s for writing: %s." msgstr "" #: src/data/make-file.c:228 #, c-format msgid "Opening stream for %s: %s." msgstr "" #: src/data/make-file.c:260 #, c-format msgid "Creating temporary file to replace %s: %s." msgstr "" #: src/data/make-file.c:277 #, c-format msgid "Creating temporary file %s: %s." msgstr "" #: src/data/make-file.c:289 #, c-format msgid "Opening stream for temporary file %s: %s." msgstr "" #: src/data/make-file.c:326 #, c-format msgid "Replacing %s by %s: %s." msgstr "" #: src/data/make-file.c:354 #, c-format msgid "Removing %s: %s." msgstr "" #: src/data/mrset.c:83 #, c-format msgid "" "%s is not a valid name for a multiple response set. Multiple response set " "names must begin with `$'." msgstr "" #: src/data/ods-reader.c:620 #, c-format msgid "Cannot open %s as a OpenDocument file: %s" msgstr "" #. TRANSLATORS: this fragment will be interpolated into #. messages in fh_lock() that identify types of files. #: src/data/pc+-file-reader.c:206 msgid "SPSS/PC+ system file" msgstr "" #: src/data/pc+-file-reader.c:215 #, c-format msgid "Error opening `%s' for reading as an SPSS/PC+ system file: %s." msgstr "" #: src/data/pc+-file-reader.c:224 src/data/sys-file-reader.c:3541 #, c-format msgid "%s: stat failed (%s)." msgstr "" #: src/data/pc+-file-reader.c:230 #, c-format msgid "%s: file too large." msgstr "" #: src/data/pc+-file-reader.c:257 #, c-format msgid "" "Directory entry is for a %u-byte record starting at offset %u but file is " "only %u bytes long." msgstr "" #: src/data/pc+-file-reader.c:275 #, c-format msgid "Directory fields have unexpected values (%u,%u)." msgstr "" #: src/data/pc+-file-reader.c:372 src/data/sys-file-reader.c:672 #, c-format msgid "Variable %zu" msgstr "" #: src/data/pc+-file-reader.c:380 src/data/sys-file-reader.c:680 #, c-format msgid "Variable %zu Label" msgstr "" #: src/data/pc+-file-reader.c:385 #, c-format msgid "Variable %zu Value Label %zu" msgstr "" #: src/data/pc+-file-reader.c:388 src/data/sys-file-reader.c:690 msgid "Creation Date" msgstr "" #: src/data/pc+-file-reader.c:389 src/data/sys-file-reader.c:691 msgid "Creation Time" msgstr "" #: src/data/pc+-file-reader.c:390 src/data/sys-file-reader.c:692 #: src/language/dictionary/sys-file-info.c:200 msgid "Product" msgstr "" #: src/data/pc+-file-reader.c:391 src/data/sys-file-reader.c:693 #: src/language/dictionary/sys-file-info.c:300 msgid "File Label" msgstr "" #: src/data/pc+-file-reader.c:427 #, c-format msgid "" "Using default encoding %s to read this SPSS/PC+ system file. For best " "results, specify an encoding explicitly. Use SYSFILE INFO with ENCODING=" "\"DETECT\" to analyze the possible encodings." msgstr "" #: src/data/pc+-file-reader.c:483 src/data/sys-file-reader.c:890 #, c-format msgid "Error closing system file `%s': %s." msgstr "" #: src/data/pc+-file-reader.c:544 msgid "This is not an SPSS/PC+ system file." msgstr "" #: src/data/pc+-file-reader.c:548 #, c-format msgid "Record 0 has unexpected length %u." msgstr "" #: src/data/pc+-file-reader.c:572 #, c-format msgid "Record 0 specifies unexpected system missing value %g (%a)." msgstr "" #: src/data/pc+-file-reader.c:577 #, c-format msgid "Record 0 reserved fields have unexpected values (%u,%u,%u,%u,%u,%u)." msgstr "" #: src/data/pc+-file-reader.c:581 #, c-format msgid "Record 0 case counts differ (%u versus %u)." msgstr "" #: src/data/pc+-file-reader.c:585 #, c-format msgid "Invalid compression type %u." msgstr "" #: src/data/pc+-file-reader.c:596 #, c-format msgid "" "Record 0 claims %u cases with %u values per case (requiring at least %zu " "bytes) but data record is only %u bytes long." msgstr "" #: src/data/pc+-file-reader.c:618 #, c-format msgid "" "Value labels claimed to end at offset %u in labels record but labels record " "is only %u bytes." msgstr "" #: src/data/pc+-file-reader.c:629 #, c-format msgid "" "Value labels claimed to be at offset %u with length %u but file size is only " "%u bytes." msgstr "" #: src/data/pc+-file-reader.c:656 #, c-format msgid "" "Value labels end with partial label (%u bytes left in record, label length " "%)." msgstr "" #: src/data/pc+-file-reader.c:669 #, c-format msgid "%u leftover bytes following value labels." msgstr "" #: src/data/pc+-file-reader.c:685 #, c-format msgid "" "Variable label claimed to start at offset %u in labels record but labels " "record is only %u bytes." msgstr "" #: src/data/pc+-file-reader.c:697 #, c-format msgid "" "Variable label with length %u starting at offset %u in labels record " "overruns end of %u-byte labels record." msgstr "" #: src/data/pc+-file-reader.c:719 #, c-format msgid "Record 1 has length %u (expected %u)." msgstr "" #: src/data/pc+-file-reader.c:751 #, c-format msgid "Variable %u has invalid type %." msgstr "" #: src/data/pc+-file-reader.c:787 #, c-format msgid "Invalid weight index %u." msgstr "" #: src/data/pc+-file-reader.c:857 #, c-format msgid "Invalid variable name `%s'." msgstr "" #: src/data/pc+-file-reader.c:865 src/data/sys-file-reader.c:1444 #, c-format msgid "Renaming variable with duplicate name `%s' to `%s'." msgstr "" #: src/data/pc+-file-reader.c:877 #, c-format msgid "Cannot weight by string variable `%s'." msgstr "" #: src/data/pc+-file-reader.c:973 src/data/sys-file-reader.c:2762 msgid "File ends in partial case." msgstr "" #: src/data/pc+-file-reader.c:979 #, c-format msgid "" "Case beginning at offset 0x%08x extends past end of data record at offset 0x" "%08x." msgstr "" #: src/data/pc+-file-reader.c:998 src/data/sys-file-reader.c:2770 #, c-format msgid "Error reading case from file %s." msgstr "" #: src/data/pc+-file-reader.c:1114 src/data/sys-file-reader.c:2933 #, c-format msgid "" "Possible compressed data corruption: string contains compressed integer " "(opcode %d)." msgstr "" #: src/data/pc+-file-reader.c:1156 src/data/sys-file-reader.c:3234 #, c-format msgid "`%s' near offset 0x%llx: " msgstr "" #: src/data/pc+-file-reader.c:1159 src/data/sys-file-reader.c:3237 #, c-format msgid "`%s': " msgstr "" #: src/data/pc+-file-reader.c:1211 src/data/sys-file-reader.c:3288 #, c-format msgid "System error: %s." msgstr "" #: src/data/pc+-file-reader.c:1216 src/data/sys-file-reader.c:3293 msgid "Unexpected end of file." msgstr "" #: src/data/pc+-file-reader.c:1301 src/data/sys-file-reader.c:3518 #, c-format msgid "%s: seek failed (%s)." msgstr "" #: src/data/pc+-file-reader.c:1351 msgid "SPSS/PC+ System File" msgstr "" #: src/data/por-file-reader.c:109 #, c-format msgid "portable file %s corrupt at offset 0x%llx: " msgstr "" #: src/data/por-file-reader.c:136 #, c-format msgid "reading portable file %s at offset 0x%llx: " msgstr "" #: src/data/por-file-reader.c:164 #, c-format msgid "Error closing portable file `%s': %s." msgstr "" #: src/data/por-file-reader.c:216 msgid "unexpected end of file" msgstr "" #. TRANSLATORS: this fragment will be interpolated into #. messages in fh_lock() that identify types of files. #: src/data/por-file-reader.c:275 src/data/por-file-writer.c:147 msgid "portable file" msgstr "" #: src/data/por-file-reader.c:283 #, c-format msgid "" "An error occurred while opening `%s' for reading as a portable file: %s." msgstr "" #: src/data/por-file-reader.c:304 msgid "Data record expected." msgstr "" #: src/data/por-file-reader.c:402 msgid "Number expected." msgstr "" #: src/data/por-file-reader.c:430 msgid "Missing numeric terminator." msgstr "" #: src/data/por-file-reader.c:453 msgid "Invalid integer." msgstr "" #: src/data/por-file-reader.c:464 src/data/por-file-reader.c:484 #, c-format msgid "Bad string length %d." msgstr "" #: src/data/por-file-reader.c:547 #, c-format msgid "%s: Not a portable file." msgstr "" #: src/data/por-file-reader.c:564 #, c-format msgid "Unrecognized version code `%c'." msgstr "" #: src/data/por-file-reader.c:577 #, c-format msgid "Bad date string length %zu." msgstr "" #: src/data/por-file-reader.c:579 #, c-format msgid "Bad time string length %zu." msgstr "" #: src/data/por-file-reader.c:630 #, c-format msgid "" "%s: Bad format specifier byte (%d). Variable will be assigned a default " "format." msgstr "" #: src/data/por-file-reader.c:651 #, c-format msgid "Numeric variable %s has invalid format specifier %s." msgstr "" #: src/data/por-file-reader.c:655 #, c-format msgid "String variable %s with width %d has invalid format specifier %s." msgstr "" #: src/data/por-file-reader.c:679 msgid "Expected variable count record." msgstr "" #: src/data/por-file-reader.c:683 #, c-format msgid "Invalid number of variables %d." msgstr "" #: src/data/por-file-reader.c:692 #, c-format msgid "Weight variable name (%s) truncated." msgstr "" #: src/data/por-file-reader.c:707 msgid "Expected variable record." msgstr "" #: src/data/por-file-reader.c:711 #, c-format msgid "Invalid variable width %d." msgstr "" #: src/data/por-file-reader.c:719 #, c-format msgid "Invalid variable name `%s' in position %d." msgstr "" #: src/data/por-file-reader.c:723 src/data/sys-file-reader.c:1426 #, c-format msgid "Bad width %d for variable %s." msgstr "" #: src/data/por-file-reader.c:737 #, c-format msgid "Duplicate variable name %s in position %d renamed to %s." msgstr "" #: src/data/por-file-reader.c:786 #, c-format msgid "Weighting variable %s not present in dictionary." msgstr "" #: src/data/por-file-reader.c:830 #, c-format msgid "Unknown variable %s while parsing value labels." msgstr "" #: src/data/por-file-reader.c:833 #, c-format msgid "" "Cannot assign value labels to %s and %s, which have different variable types." msgstr "" #: src/data/por-file-reader.c:972 msgid "SPSS Portable File" msgstr "" #: src/data/por-file-writer.c:139 #, c-format msgid "Invalid decimal digits count %d. Treating as %d." msgstr "" #: src/data/por-file-writer.c:159 #, c-format msgid "Error opening `%s' for writing as a portable file: %s." msgstr "" #: src/data/por-file-writer.c:505 #, c-format msgid "An I/O error occurred writing portable file `%s'." msgstr "" #: src/data/psql-reader.c:48 msgid "" "Support for reading postgres databases was not compiled into this " "installation of PSPP" msgstr "" #: src/data/psql-reader.c:242 msgid "Memory error whilst opening psql source" msgstr "" #: src/data/psql-reader.c:248 #, c-format msgid "Error opening psql source: %s." msgstr "" #: src/data/psql-reader.c:263 #, c-format msgid "" "Postgres server is version %s. Reading from versions earlier than 8.0 is not " "supported." msgstr "" #: src/data/psql-reader.c:283 msgid "" "Connection is unencrypted, but unencrypted connections have not been " "permitted." msgstr "" #: src/data/psql-reader.c:324 src/data/psql-reader.c:349 #: src/data/psql-reader.c:359 #, c-format msgid "Error from psql source: %s." msgstr "" #: src/data/psql-reader.c:454 #, c-format msgid "Unsupported OID %d. SYSMIS values will be inserted." msgstr "" #: src/data/settings.c:391 msgid "" "MXWARNS set to zero. No further warnings will be given even when " "potentially problematic situations are encountered." msgstr "" #: src/data/settings.c:398 #, c-format msgid "" "Warnings re-enabled. %d warnings will be issued before aborting syntax " "processing." msgstr "" #: src/data/settings.c:618 #, c-format msgid "" "%s: Custom currency string `%s' does not contain exactly three periods or " "commas (or it contains both)." msgstr "" #. TRANSLATORS: this fragment will be interpolated into #. messages in fh_lock() that identify types of files. #: src/data/sys-file-reader.c:407 src/data/sys-file-writer.c:245 msgid "system file" msgstr "" #: src/data/sys-file-reader.c:414 #, c-format msgid "Error opening `%s' for reading as a system file: %s." msgstr "" #: src/data/sys-file-reader.c:491 msgid "Misplaced type 4 record." msgstr "" #: src/data/sys-file-reader.c:496 msgid "Duplicate type 6 (document) record." msgstr "" #: src/data/sys-file-reader.c:506 src/data/sys-file-reader.c:1343 #, c-format msgid "" "Unrecognized record type 7, subtype %d. For help, please send this file to " "%s and mention that you were using %s." msgstr "" #: src/data/sys-file-reader.c:526 #, c-format msgid "" "Record type 7, subtype %d found here has the same type as the record found " "near offset 0x%llx. For help, please send this file to %s and mention that " "you were using %s." msgstr "" #: src/data/sys-file-reader.c:538 #, c-format msgid "Unrecognized record type %d." msgstr "" #: src/data/sys-file-reader.c:688 #, c-format msgid "Value Label %zu" msgstr "" #: src/data/sys-file-reader.c:697 msgid "Extra Product Info" msgstr "" #: src/data/sys-file-reader.c:710 #, c-format msgid "Document Line %zu" msgstr "" #: src/data/sys-file-reader.c:718 #, c-format msgid "MRSET %zu" msgstr "" #: src/data/sys-file-reader.c:720 #, c-format msgid "MRSET %zu Label" msgstr "" #: src/data/sys-file-reader.c:725 #, c-format msgid "MRSET %zu Counted Value" msgstr "" #: src/data/sys-file-reader.c:763 #, c-format msgid "" "This system file does not indicate its own character encoding. Using " "default encoding %s. For best results, specify an encoding explicitly. Use " "SYSFILE INFO with ENCODING=\"DETECT\" to analyze the possible encodings." msgstr "" #: src/data/sys-file-reader.c:845 #, c-format msgid "File header claims %d variable positions but %zu were read from file." msgstr "" #: src/data/sys-file-reader.c:958 src/data/sys-file-reader.c:972 msgid "This is not an SPSS system file." msgstr "" #: src/data/sys-file-reader.c:1027 msgid "" "Compression bias is not the usual value of 100, or system file uses " "unrecognized floating-point format." msgstr "" #: src/data/sys-file-reader.c:1102 msgid "Variable label indicator field is not 0 or 1." msgstr "" #: src/data/sys-file-reader.c:1115 msgid "Numeric missing value indicator field is not -3, -2, 0, 1, 2, or 3." msgstr "" #: src/data/sys-file-reader.c:1125 msgid "String missing value indicator field is not 0, 1, 2, or 3." msgstr "" #: src/data/sys-file-reader.c:1152 #, c-format msgid "Invalid number of labels %u." msgstr "" #: src/data/sys-file-reader.c:1185 msgid "" "Variable index record (type 4) does not immediately follow value label " "record (type 3) as it should." msgstr "" #: src/data/sys-file-reader.c:1197 #, c-format msgid "" "Number of variables associated with a value label (%u) is not between 1 and " "the number of variables (%zu)." msgstr "" #: src/data/sys-file-reader.c:1224 #, c-format msgid "Number of document lines (%d) must be greater than 0 and less than %d." msgstr "" #: src/data/sys-file-reader.c:1317 #, c-format msgid "Record type 7, subtype %d has bad size %u (expected %d)." msgstr "" #: src/data/sys-file-reader.c:1321 #, c-format msgid "Record type 7, subtype %d has bad count %u (expected %d)." msgstr "" #: src/data/sys-file-reader.c:1435 #, c-format msgid "Renaming variable with invalid name `%s' to `%s'." msgstr "" #: src/data/sys-file-reader.c:1517 msgid "Missing string continuation record." msgstr "" #: src/data/sys-file-reader.c:1550 #, c-format msgid "Variable %s with width %d has invalid print format 0x%x." msgstr "" #: src/data/sys-file-reader.c:1554 #, c-format msgid "Variable %s with width %d has invalid write format 0x%x." msgstr "" #: src/data/sys-file-reader.c:1559 msgid "Suppressing further invalid format warnings." msgstr "" #: src/data/sys-file-reader.c:1613 #, c-format msgid "" "Floating-point representation indicated by system file (%d) differs from " "expected (%d)." msgstr "" #: src/data/sys-file-reader.c:1629 #, c-format msgid "" "Integer format indicated by system file (%d) differs from expected (%d)." msgstr "" #: src/data/sys-file-reader.c:1647 src/data/sys-file-reader.c:1653 #, c-format msgid "File specifies unexpected value %g (%a) as %s, instead of %g (%a)." msgstr "" #: src/data/sys-file-reader.c:1662 #, c-format msgid "" "File specifies unexpected value %g (%a) as %s, instead of %g (%a) or %g (%a)." msgstr "" #: src/data/sys-file-reader.c:1714 src/data/sys-file-reader.c:1733 #, c-format msgid "Missing space following `%c' at offset %zu in MRSETS record." msgstr "" #: src/data/sys-file-reader.c:1741 #, c-format msgid "" "Missing label source value following `E' at offset %zu in MRSETS record." msgstr "" #: src/data/sys-file-reader.c:1748 #, c-format msgid "" "Unexpected label source value following `E' at offset %zu in MRSETS record." msgstr "" #: src/data/sys-file-reader.c:1755 #, c-format msgid "Missing `C', `D', or `E' at offset %zu in MRSETS record." msgstr "" #: src/data/sys-file-reader.c:1782 #, c-format msgid "Missing new-line parsing variable names at offset %zu in MRSETS record." msgstr "" #: src/data/sys-file-reader.c:1817 #, c-format msgid "Invalid multiple response set name `%s'." msgstr "" #: src/data/sys-file-reader.c:1850 #, c-format msgid "MRSET %s contains duplicate variable name %s." msgstr "" #: src/data/sys-file-reader.c:1865 #, c-format msgid "MRSET %s contains both string and numeric variables." msgstr "" #: src/data/sys-file-reader.c:1877 #, c-format msgid "MRSET %s has no variables." msgstr "" #: src/data/sys-file-reader.c:1879 #, c-format msgid "MRSET %s has only one variable." msgstr "" #: src/data/sys-file-reader.c:1923 #, c-format msgid "Extension 11 has bad count %u (for %zu variables)." msgstr "" #: src/data/sys-file-reader.c:1956 #, c-format msgid "" "Invalid variable display parameters for variable %zu (%s). Default " "parameters substituted." msgstr "" #: src/data/sys-file-reader.c:2000 #, c-format msgid "Duplicate long variable name `%s'." msgstr "" #: src/data/sys-file-reader.c:2053 #, c-format msgid "Long variable mapping from %s to invalid variable name `%s'." msgstr "" #: src/data/sys-file-reader.c:2088 #, c-format msgid "%s listed as string of invalid length %s in very long string record." msgstr "" #: src/data/sys-file-reader.c:2099 #, c-format msgid "" "%s listed in very long string record with width %s, which requires only one " "segment." msgstr "" #: src/data/sys-file-reader.c:2107 #, c-format msgid "Very long string %s overflows dictionary." msgstr "" #: src/data/sys-file-reader.c:2125 #, c-format msgid "" "Very long string with width %ld has segment %d of width %d (expected %d)." msgstr "" #: src/data/sys-file-reader.c:2183 #, c-format msgid "Value label variable index %d not in valid range 1...%zu." msgstr "" #: src/data/sys-file-reader.c:2193 #, c-format msgid "Value label variable index %d refers to long string continuation." msgstr "" #: src/data/sys-file-reader.c:2208 #, c-format msgid "" "Variables associated with value label are not all of identical type. " "Variable %s is %s, but variable %s is %s." msgstr "" #: src/data/sys-file-reader.c:2226 #, c-format msgid "" "Value labels may not be added to long string variables (e.g. %s) using " "records types 3 and 4." msgstr "" #: src/data/sys-file-reader.c:2255 #, c-format msgid "Duplicate value label for %g on %s." msgstr "" #: src/data/sys-file-reader.c:2260 src/data/sys-file-reader.c:2600 #, c-format msgid "Duplicate value label for `%.*s' on %s." msgstr "" #: src/data/sys-file-reader.c:2283 #, c-format msgid "Suppressed %d additional warnings for value labels." msgstr "" #: src/data/sys-file-reader.c:2297 #, c-format msgid "" "Weight variable index %d not in valid range 1...%zu. Treating file as " "unweighted." msgstr "" #: src/data/sys-file-reader.c:2307 #, c-format msgid "" "Weight variable index %d refers to long string continuation. Treating file " "as unweighted." msgstr "" #: src/data/sys-file-reader.c:2315 #, c-format msgid "Ignoring string variable `%s' set as weighting variable." msgstr "" #: src/data/sys-file-reader.c:2352 #, c-format msgid "Error parsing attribute value %s[%d]." msgstr "" #: src/data/sys-file-reader.c:2366 #, c-format msgid "Attribute value %s[%d] is not quoted: %s." msgstr "" #: src/data/sys-file-reader.c:2379 #, c-format msgid "Duplicate attribute %s." msgstr "" #: src/data/sys-file-reader.c:2463 #, c-format msgid "Invalid role for variable %s." msgstr "" #: src/data/sys-file-reader.c:2472 #, c-format msgid "%zu other variables had invalid roles." msgstr "" #: src/data/sys-file-reader.c:2485 #, c-format msgid "Extension record subtype %d ends unexpectedly." msgstr "" #: src/data/sys-file-reader.c:2531 #, c-format msgid "Ignoring long string value label record for unknown variable %s." msgstr "" #: src/data/sys-file-reader.c:2536 #, c-format msgid "Ignoring long string value label record for numeric variable %s." msgstr "" #: src/data/sys-file-reader.c:2543 #, c-format msgid "" "Ignoring long string value label record for variable %s because the record's " "width (%d) does not match the variable's width (%d)." msgstr "" #: src/data/sys-file-reader.c:2573 #, c-format msgid "" "Ignoring long string value label %zu for variable %s, with width %d, that " "has bad value width %zu." msgstr "" #: src/data/sys-file-reader.c:2646 #, c-format msgid "" "Long string missing values record says variable %s has %d missing values, " "but only 1 to 3 missing values are allowed." msgstr "" #: src/data/sys-file-reader.c:2656 #, c-format msgid "Ignoring long string missing value record for unknown variable %s." msgstr "" #: src/data/sys-file-reader.c:2661 #, c-format msgid "Ignoring long string missing value record for numeric variable %s." msgstr "" #: src/data/sys-file-reader.c:2686 #, c-format msgid "" "Ignoring long string missing value %zu for variable %s, with width %d, that " "has bad value width %zu." msgstr "" #: src/data/sys-file-reader.c:2740 msgid "File ends in partial string value." msgstr "" #: src/data/sys-file-reader.c:2879 msgid "" "Possible compressed data corruption: compressed spaces appear in numeric " "field." msgstr "" #: src/data/sys-file-reader.c:3030 #, c-format msgid "Suppressed %d additional related warnings." msgstr "" #: src/data/sys-file-reader.c:3076 src/data/sys-file-reader.c:3093 #, c-format msgid "Dictionary record refers to unknown variable %s." msgstr "" #: src/data/sys-file-reader.c:3159 #, c-format msgid "Expecting digit at offset %zu in MRSETS record." msgstr "" #: src/data/sys-file-reader.c:3167 #, c-format msgid "Expecting space at offset %zu in MRSETS record." msgstr "" #: src/data/sys-file-reader.c:3175 #, c-format msgid "%zu-byte string starting at offset %zu exceeds record length %zu." msgstr "" #: src/data/sys-file-reader.c:3185 #, c-format msgid "Expecting space at offset %zu following %zu-byte string." msgstr "" #: src/data/sys-file-reader.c:3476 #, c-format msgid "Wrong ZLIB data header offset %#llx (expected %#llx)." msgstr "" #: src/data/sys-file-reader.c:3484 #, c-format msgid "Impossible ZLIB trailer offset 0x%llx." msgstr "" #: src/data/sys-file-reader.c:3491 #, c-format msgid "Invalid ZLIB trailer length %lld." msgstr "" #: src/data/sys-file-reader.c:3555 #, c-format msgid "End of ZLIB trailer (0x%llx) is not file size (0x%llx)." msgstr "" #: src/data/sys-file-reader.c:3565 #, c-format msgid "ZLIB trailer bias (%lld) differs from file header bias (%.2f)." msgstr "" #: src/data/sys-file-reader.c:3575 #, c-format msgid "ZLIB trailer \"zero\" field has nonzero value %lld." msgstr "" #: src/data/sys-file-reader.c:3581 #, c-format msgid "ZLIB trailer specifies unexpected %u-byte block size." msgstr "" #: src/data/sys-file-reader.c:3589 #, c-format msgid "%lld-byte ZLIB trailer specifies %u data blocks (expected %lld)." msgstr "" #: src/data/sys-file-reader.c:3614 #, c-format msgid "" "ZLIB block descriptor %u reported uncompressed data offset %#llx, when %#llx " "was expected." msgstr "" #: src/data/sys-file-reader.c:3623 #, c-format msgid "" "ZLIB block descriptor %u reported compressed data offset %#llx, when %#llx " "was expected." msgstr "" #: src/data/sys-file-reader.c:3633 #, c-format msgid "" "ZLIB block descriptor %u reported block size %#x, when %#x was expected." msgstr "" #: src/data/sys-file-reader.c:3641 #, c-format msgid "" "ZLIB block descriptor %u reported block size %#x, when at most %#x was " "expected." msgstr "" #: src/data/sys-file-reader.c:3653 #, c-format msgid "" "ZLIB block descriptor %u reports compressed size %u and uncompressed size %u." msgstr "" #: src/data/sys-file-reader.c:3665 #, c-format msgid "" "ZLIB trailer is at offset %#llx but %#llx would be expected from block " "descriptors." msgstr "" #: src/data/sys-file-reader.c:3684 #, c-format msgid "ZLIB initialization failed (%s)." msgstr "" #: src/data/sys-file-reader.c:3699 #, c-format msgid "Inconsistency at end of ZLIB stream (%s)." msgstr "" #: src/data/sys-file-reader.c:3758 #, c-format msgid "ZLIB stream inconsistency (%s)." msgstr "" #: src/data/sys-file-reader.c:3782 msgid "Unexpected end of ZLIB compressed data." msgstr "" #: src/data/sys-file-reader.c:3820 msgid "SPSS System File" msgstr "" #: src/data/sys-file-writer.c:210 #, c-format msgid "Unknown system file version %d. Treating as version %d." msgstr "" #: src/data/sys-file-writer.c:256 #, c-format msgid "Error opening `%s' for writing as a system file: %s." msgstr "" #: src/data/sys-file-writer.c:1271 #, c-format msgid "An I/O error occurred writing system file `%s'." msgstr "" #: src/data/sys-file-writer.c:1378 #, c-format msgid "Failed to initialize ZLIB for compression (%s)." msgstr "" #: src/data/sys-file-writer.c:1407 #, c-format msgid "Failed to complete ZLIB stream compression (%s)." msgstr "" #: src/data/sys-file-writer.c:1449 #, c-format msgid "ZLIB stream compression failed (%s)." msgstr "" #: src/data/sys-file-writer.c:1491 #, c-format msgid "%s: Seek failed (%s)." msgstr "" #: src/data/variable.c:58 msgid "Left" msgstr "" #: src/data/variable.c:59 msgid "Right" msgstr "" #: src/data/variable.c:60 msgid "Center" msgstr "" #: src/data/variable.c:66 msgid "Nominal" msgstr "" #: src/data/variable.c:67 msgid "Ordinal" msgstr "" #: src/data/variable.c:68 src/language/stats/ks-one-sample.c:300 msgid "Scale" msgstr "" #: src/data/variable.c:74 msgid "Input" msgstr "" #. TRANSLATORS: This will be part of a filename. Please avoid whitespace. #: src/data/variable.c:75 src/output/spv/spv-writer.c:213 #: src/ui/gui/psppire-output-window.c:547 msgid "Output" msgstr "" #: src/data/variable.c:76 msgid "Both" msgstr "" #: src/data/variable.c:77 src/language/dictionary/sys-file-info.c:237 #: src/ui/gui/psppire-dialog-action-crosstabs.c:86 #: src/ui/gui/psppire-dialog-action-crosstabs.c:98 #: src/ui/gui/psppire-dialog-action-crosstabs.c:133 #: src/ui/gui/psppire-dialog-action-crosstabs.c:141 #: src/ui/gui/psppire-variable-sheet.c:408 src/ui/gui/var-display.c:34 msgid "None" msgstr "" #: src/data/variable.c:78 msgid "Partition" msgstr "" #: src/data/variable.c:79 src/ui/gui/reliability.ui:37 msgid "Split" msgstr "" #: src/data/variable.c:729 #, c-format msgid "%s (%s)" msgstr "" #: src/data/variable.c:1339 msgid "" "At least one case in the data file had a weight value that was user-missing, " "system-missing, zero, or negative. These case(s) were ignored." msgstr "" #: src/language/command.c:207 src/language/stats/graph.c:749 #: src/language/stats/graph.c:755 src/language/stats/graph.c:789 #: src/language/stats/graph.c:794 src/language/stats/graph.c:799 #: src/language/stats/graph.c:852 src/language/stats/graph.c:857 #: src/language/stats/graph.c:862 src/language/stats/graph.c:867 #: src/language/stats/graph.c:872 src/language/stats/graph.c:877 #: src/language/stats/graph.c:882 src/language/utilities/set.q:236 #, c-format msgid "%s is not yet implemented." msgstr "" #: src/language/command.c:212 #, c-format msgid "%s may be used only in testing mode." msgstr "" #: src/language/command.c:217 #, c-format msgid "%s may be used only in enhanced syntax mode." msgstr "" #: src/language/command.c:345 msgid "expecting command name" msgstr "" #: src/language/command.c:347 #, c-format msgid "Unknown command `%s'." msgstr "" #: src/language/command.c:380 #, c-format msgid "%s is allowed only before the active dataset has been defined." msgstr "" #: src/language/command.c:384 #, c-format msgid "%s is allowed only after the active dataset has been defined." msgstr "" #: src/language/command.c:388 src/language/command.c:392 #, c-format msgid "%s is allowed only inside %s." msgstr "" #: src/language/command.c:399 src/language/command.c:403 #, c-format msgid "" "%s is allowed only before the active dataset has been defined or inside %s." msgstr "" #: src/language/command.c:407 src/language/command.c:411 #, c-format msgid "" "%s is allowed only after the active dataset has been defined or inside %s." msgstr "" #: src/language/command.c:415 #, c-format msgid "%s is allowed only inside %s or inside %s." msgstr "" #: src/language/command.c:421 #, c-format msgid "" "%s is allowed only after the active dataset has been defined, inside INPUT " "PROGRAM, or inside FILE TYPE." msgstr "" #: src/language/command.c:426 #, c-format msgid "" "%s is allowed only before the active dataset has been defined, inside INPUT " "PROGRAM, or inside FILE TYPE." msgstr "" #: src/language/command.c:444 src/language/command.c:447 #, c-format msgid "%s is not allowed inside %s." msgstr "" #: src/language/command.c:529 src/language/utilities/host.c:272 #: src/language/utilities/permissions.c:105 #, c-format msgid "This command not allowed when the %s option is set." msgstr "" #: src/language/command.c:545 #, c-format msgid "Error removing `%s': %s." msgstr "" #: src/language/lexer/lexer.c:296 #, c-format msgid "expecting %s" msgstr "" #: src/language/lexer/lexer.c:300 #, c-format msgid "expecting %s or %s" msgstr "" #: src/language/lexer/lexer.c:304 #, c-format msgid "expecting %s, %s, or %s" msgstr "" #: src/language/lexer/lexer.c:309 #, c-format msgid "expecting %s, %s, %s, or %s" msgstr "" #: src/language/lexer/lexer.c:314 #, c-format msgid "expecting %s, %s, %s, %s, or %s" msgstr "" #: src/language/lexer/lexer.c:319 #, c-format msgid "expecting %s, %s, %s, %s, %s, or %s" msgstr "" #: src/language/lexer/lexer.c:325 #, c-format msgid "expecting %s, %s, %s, %s, %s, %s, or %s" msgstr "" #: src/language/lexer/lexer.c:331 #, c-format msgid "expecting %s, %s, %s, %s, %s, %s, %s, or %s" msgstr "" #: src/language/lexer/lexer.c:351 #, c-format msgid "Subcommand %s may only be specified once." msgstr "" #: src/language/lexer/lexer.c:363 #, c-format msgid "Required subcommand %s was not specified." msgstr "" #: src/language/lexer/lexer.c:371 #, c-format msgid "%s may only be specified once within subcommand %s" msgstr "" #: src/language/lexer/lexer.c:380 #, c-format msgid "Required %s specification missing from %s subcommand" msgstr "" #: src/language/lexer/lexer.c:399 msgid "Syntax error at end of input" msgstr "" #: src/language/lexer/lexer.c:420 src/language/xforms/select-if.c:60 #: src/language/stats/autorecode.c:206 src/language/stats/npar.c:503 #: src/language/data-io/print-space.c:83 msgid "expecting end of command" msgstr "" #: src/language/lexer/lexer.c:631 msgid "expecting string" msgstr "" #: src/language/lexer/lexer.c:660 msgid "expecting integer" msgstr "" #: src/language/lexer/lexer.c:673 msgid "expecting number" msgstr "" #: src/language/lexer/lexer.c:685 msgid "expecting identifier" msgstr "" #: src/language/lexer/lexer.c:1272 msgid "Syntax error at end of command" msgstr "" #: src/language/lexer/lexer.c:1281 #, c-format msgid "Syntax error at `%s'" msgstr "" #: src/language/lexer/lexer.c:1284 msgid "Syntax error" msgstr "" #: src/language/lexer/lexer.c:1470 #, c-format msgid "String of hex digits has %d characters, which is not a multiple of 2" msgstr "" #: src/language/lexer/lexer.c:1477 #, c-format msgid "`%c' is not a valid hex digit" msgstr "" #: src/language/lexer/lexer.c:1482 #, c-format msgid "" "Unicode string contains %d bytes, which is not in the valid range of 1 to 8 " "bytes" msgstr "" #: src/language/lexer/lexer.c:1488 #, c-format msgid "U+%04X is not a valid Unicode code point" msgstr "" #: src/language/lexer/lexer.c:1493 msgid "Unterminated string constant" msgstr "" #: src/language/lexer/lexer.c:1497 #, c-format msgid "Missing exponent following `%s'" msgstr "" #: src/language/lexer/lexer.c:1502 msgid "Unexpected `.' in middle of command" msgstr "" #: src/language/lexer/lexer.c:1508 #, c-format msgid "Bad character %s in input" msgstr "" #: src/language/lexer/lexer.c:1603 #, c-format msgid "Opening `%s': %s." msgstr "" #: src/language/lexer/lexer.c:1647 #, c-format msgid "Error closing `%s': %s." msgstr "" #: src/language/lexer/subcommand-list.c:118 #, c-format msgid "No more than %d %s subcommands allowed." msgstr "" #: src/language/lexer/format-parser.c:77 msgid "expecting valid format specifier" msgstr "" #: src/language/lexer/format-parser.c:116 #: src/language/lexer/format-parser.c:143 src/language/utilities/output.c:108 #: src/language/data-io/data-list.c:453 src/language/data-io/get-data.c:638 #: src/language/data-io/placement-parser.c:236 #, c-format msgid "Unknown format type `%s'." msgstr "" #: src/language/lexer/format-parser.c:122 #, c-format msgid "Format specifier `%s' lacks required width." msgstr "" #: src/language/lexer/format-parser.c:138 msgid "expecting format type" msgstr "" #: src/language/lexer/value-parser.c:66 #, c-format msgid "" "The high end of the range (%.*g) is below the low end (%.*g). The range " "will be treated as if reversed." msgstr "" #: src/language/lexer/value-parser.c:74 #, c-format msgid "Ends of range are equal (%.*g)." msgstr "" #: src/language/lexer/value-parser.c:82 #, c-format msgid "%s or %s must be part of a range." msgstr "" #: src/language/lexer/value-parser.c:112 msgid "System-missing value is not valid here." msgstr "" #: src/language/lexer/variable-parser.c:86 utilities/pspp-convert.c:83 msgid "expecting variable name" msgstr "" #: src/language/lexer/variable-parser.c:96 #, c-format msgid "%s is not a variable name." msgstr "" #: src/language/lexer/variable-parser.c:206 #, c-format msgid "" "%s is not a numeric variable. It will not be included in the variable list." msgstr "" #: src/language/lexer/variable-parser.c:209 #, c-format msgid "" "%s is not a string variable. It will not be included in the variable list." msgstr "" #: src/language/lexer/variable-parser.c:213 #, c-format msgid "Scratch variables (such as %s) are not allowed here." msgstr "" #: src/language/lexer/variable-parser.c:217 #, c-format msgid "" "%s and %s are not the same type. All variables in this variable list must " "be of the same type. %s will be omitted from the list." msgstr "" #: src/language/lexer/variable-parser.c:223 #, c-format msgid "" "%s and %s are string variables with different widths. All variables in this " "variable list must have the same width. %s will be omitted from the list." msgstr "" #: src/language/lexer/variable-parser.c:228 #: src/language/lexer/variable-parser.c:447 #, c-format msgid "Variable %s appears twice in variable list." msgstr "" #: src/language/lexer/variable-parser.c:341 #, c-format msgid "%s TO %s is not valid syntax since %s precedes %s in the dictionary." msgstr "" #: src/language/lexer/variable-parser.c:349 #, c-format msgid "" "When using the TO keyword to specify several variables, both variables must " "be from the same variable dictionaries, of either ordinary, scratch, or " "system variables. %s is a %s variable, whereas %s is %s." msgstr "" #: src/language/lexer/variable-parser.c:424 #, c-format msgid "`%s' cannot be used with TO because it does not end in a digit." msgstr "" #: src/language/lexer/variable-parser.c:432 #, c-format msgid "Numeric suffix on `%s' is larger than supported with TO." msgstr "" #: src/language/lexer/variable-parser.c:505 msgid "Scratch variables not allowed here." msgstr "" #: src/language/lexer/variable-parser.c:529 msgid "Prefixes don't match in use of TO convention." msgstr "" #: src/language/lexer/variable-parser.c:534 msgid "Bad bounds in use of TO convention." msgstr "" #: src/language/xforms/compute.c:150 src/language/xforms/compute.c:205 #, c-format msgid "" "When executing COMPUTE: SYSMIS is not a valid value as an index into vector " "%s." msgstr "" #: src/language/xforms/compute.c:154 src/language/xforms/compute.c:212 #, c-format msgid "" "When executing COMPUTE: %.*g is not a valid value as an index into vector %s." msgstr "" #: src/language/xforms/compute.c:356 #, c-format msgid "There is no vector named %s." msgstr "" #: src/language/xforms/count.c:125 msgid "Destination cannot be a string variable." msgstr "" #: src/language/xforms/sample.c:76 msgid "The sampling factor must be between 0 and 1 exclusive." msgstr "" #: src/language/xforms/sample.c:96 #, c-format msgid "Cannot sample %d observations from a population of %d." msgstr "" #: src/language/xforms/recode.c:261 msgid "" "Inconsistent target variable types. Target variables must be all numeric or " "all string." msgstr "" #: src/language/xforms/recode.c:282 msgid "CONVERT requires string input values and numeric output values." msgstr "" #: src/language/xforms/recode.c:339 #, c-format msgid "%s is not allowed with string variables." msgstr "" #: src/language/xforms/recode.c:422 msgid "expecting output value" msgstr "" #: src/language/xforms/recode.c:479 #, c-format msgid "" "%zu variable(s) cannot be recoded into %zu variable(s). Specify the same " "number of variables as source and target variables." msgstr "" #: src/language/xforms/recode.c:494 #, c-format msgid "" "There is no variable named %s. (All string variables specified on INTO must " "already exist. Use the STRING command to create a string variable.)" msgstr "" #: src/language/xforms/recode.c:510 #, c-format msgid "INTO is required with %s input values and %s output values." msgstr "" #: src/language/xforms/recode.c:523 #, c-format msgid "Type mismatch. Cannot store %s data in %s variable %s." msgstr "" #: src/language/xforms/recode.c:566 #, c-format msgid "" "Cannot recode because the variable %s would require a width of %d bytes or " "greater, but it has a width of only %d bytes." msgstr "" #: src/language/xforms/select-if.c:100 msgid "Syntax error expecting OFF or BY. Turning off case filtering." msgstr "" #: src/language/xforms/select-if.c:115 msgid "The filter variable must be numeric." msgstr "" #: src/language/xforms/select-if.c:121 msgid "The filter variable may not be scratch." msgstr "" #: src/language/control/control-stack.c:49 #, c-format msgid "%s without %s." msgstr "" #: src/language/control/control-stack.c:77 #, c-format msgid "This command must appear inside %s...%s, without intermediate %s...%s." msgstr "" #: src/language/control/control-stack.c:94 #, c-format msgid "This command cannot appear outside %s...%s." msgstr "" #: src/language/control/do-if.c:180 #, c-format msgid "This command may not follow %s in %s ... %s." msgstr "" #: src/language/control/loop.c:211 msgid "Only one index clause may be specified." msgstr "" #: src/language/control/repeat.c:120 #, c-format msgid "Dummy variable name `%s' hides dictionary variable `%s'." msgstr "" #: src/language/control/repeat.c:126 #, c-format msgid "Dummy variable name `%s' is given twice." msgstr "" #: src/language/control/repeat.c:170 #, c-format msgid "" "Dummy variable `%s' had %zu substitutions, so `%s' must also, but %zu were " "specified." msgstr "" #: src/language/control/repeat.c:379 msgid "Ranges may only have integer bounds." msgstr "" #: src/language/control/repeat.c:393 #, c-format msgid "%ld TO %ld is an invalid range." msgstr "" #: src/language/control/repeat.c:443 #, c-format msgid "No matching %s." msgstr "" #: src/language/control/temporary.c:44 msgid "" "This command may only appear once between procedures and procedure-like " "commands." msgstr "" #: src/language/dictionary/attributes.c:104 msgid "Attribute array index must be between 1 and 65535." msgstr "" #: src/language/dictionary/apply-dictionary.c:74 #, c-format msgid "Variable %s is %s in target file, but %s in source file." msgstr "" #: src/language/dictionary/apply-dictionary.c:110 msgid "No matching variables found between the source and target files." msgstr "" #: src/language/dictionary/delete-variables.c:40 #: src/language/dictionary/modify-variables.c:79 #: src/language/dictionary/rename-variables.c:51 #, c-format msgid "" "%s may not be used after %s. Temporary transformations will be made " "permanent." msgstr "" #: src/language/dictionary/delete-variables.c:48 #: src/language/dictionary/modify-variables.c:312 #, c-format msgid "" "%s may not be used to delete all variables from the active dataset " "dictionary. Use %s instead." msgstr "" #: src/language/dictionary/missing-values.c:70 #, c-format msgid "" "Cannot mix numeric variables (e.g. %s) and string variables (e.g. %s) within " "a single list." msgstr "" #: src/language/dictionary/missing-values.c:91 msgid "" "Too many numeric missing values. At most three individual values or one " "value and one range are allowed." msgstr "" #: src/language/dictionary/missing-values.c:126 #, c-format msgid "Truncating missing value to maximum acceptable length (%d bytes)." msgstr "" #: src/language/dictionary/missing-values.c:137 msgid "" "Too many string missing values. At most three individual values are allowed." msgstr "" #: src/language/dictionary/missing-values.c:154 #, c-format msgid "Missing values provided are too long to assign to variable of width %d." msgstr "" #: src/language/dictionary/modify-variables.c:145 msgid "Cannot specify ALL after specifying a set of variables." msgstr "" #: src/language/dictionary/modify-variables.c:221 #: src/language/dictionary/rename-variables.c:76 #, c-format msgid "" "Differing number of variables in old name list (%zu) and in new name list " "(%zu)." msgstr "" #: src/language/dictionary/modify-variables.c:244 #: src/language/dictionary/modify-variables.c:294 #, c-format msgid "" "%s subcommand may be given at most once. It may not be given in conjunction " "with the %s subcommand." msgstr "" #: src/language/dictionary/modify-variables.c:331 #, c-format msgid "Unrecognized subcommand name `%s'." msgstr "" #: src/language/dictionary/modify-variables.c:334 msgid "Subcommand name expected." msgstr "" #: src/language/dictionary/mrsets.c:117 #, c-format msgid "" "VARIABLES specified only variable %s on %s, but at least two variables are " "required." msgstr "" #: src/language/dictionary/mrsets.c:150 msgid "Numeric VALUE must be an integer." msgstr "" #: src/language/dictionary/mrsets.c:230 src/language/dictionary/mrsets.c:268 #, c-format msgid "" "MDGROUP subcommand for group %s specifies a string VALUE, but the variables " "specified for this group are numeric." msgstr "" #: src/language/dictionary/mrsets.c:254 #, c-format msgid "" "VALUE string on MDGROUP subcommand for group %s is %d bytes long, but it " "must be no longer than the narrowest variable in the group, which is %s with " "a width of %d bytes." msgstr "" #: src/language/dictionary/mrsets.c:280 #, c-format msgid "" "MDGROUP subcommand for group %s specifies LABELSOURCE=VARLABEL but not " "CATEGORYLABELS=COUNTEDVALUES. Ignoring LABELSOURCE." msgstr "" #: src/language/dictionary/mrsets.c:286 #, c-format msgid "" "MDGROUP subcommand for group %s specifies both LABEL and LABELSOURCE, but " "only one of these subcommands may be used at a time. Ignoring LABELSOURCE." msgstr "" #: src/language/dictionary/mrsets.c:326 #, c-format msgid "" "Variables %s and %s specified as part of multiple dichotomy group %s have " "the same variable label. Categories represented by these variables will not " "be distinguishable in output." msgstr "" #: src/language/dictionary/mrsets.c:356 #, c-format msgid "" "Variable %s specified as part of multiple dichotomy group %s (which has " "CATEGORYLABELS=COUNTEDVALUES) has no value label for its counted value. " "This category will not be distinguishable in output." msgstr "" #: src/language/dictionary/mrsets.c:369 #, c-format msgid "" "Variables %s and %s specified as part of multiple dichotomy group %s (which " "has CATEGORYLABELS=COUNTEDVALUES) have the same value label for the group's " "counted value. These categories will not be distinguishable in output." msgstr "" #: src/language/dictionary/mrsets.c:426 #, c-format msgid "" "Variables specified on MCGROUP should have the same categories, but %s and " "%s (and possibly others) in multiple category group %s have different value " "labels for value %s." msgstr "" #: src/language/dictionary/mrsets.c:484 #, c-format msgid "No multiple response set named %s." msgstr "" #: src/language/dictionary/mrsets.c:533 msgid "" "The active dataset dictionary does not contain any multiple response sets." msgstr "" #: src/language/dictionary/mrsets.c:540 msgid "Multiple Response Sets" msgstr "" #: src/language/dictionary/mrsets.c:543 #: src/language/dictionary/sys-file-info.c:446 #: src/language/dictionary/sys-file-info.c:733 #: src/language/stats/autorecode.c:375 src/language/data-io/data-parser.c:679 #: src/language/data-io/data-parser.c:725 src/language/data-io/print.c:434 msgid "Attributes" msgstr "" #: src/language/dictionary/mrsets.c:544 #: src/language/dictionary/sys-file-info.c:191 #: src/language/dictionary/sys-file-info.c:301 #: src/language/dictionary/sys-file-info.c:302 #: src/language/dictionary/sys-file-info.c:455 #: src/language/dictionary/sys-file-info.c:570 #: src/ui/gui/psppire-var-sheet-header.c:67 src/ui/gui/compute.ui:157 msgid "Label" msgstr "" #: src/language/dictionary/mrsets.c:544 #: src/language/dictionary/sys-file-info.c:241 msgid "Encoding" msgstr "" #: src/language/dictionary/mrsets.c:544 msgid "Counted Value" msgstr "" #: src/language/dictionary/mrsets.c:544 msgid "Member Variables" msgstr "" #: src/language/dictionary/mrsets.c:547 #: src/language/dictionary/sys-file-info.c:470 #: src/ui/gui/psppire-var-sheet-header.c:55 msgid "Name" msgstr "" #: src/language/dictionary/mrsets.c:564 msgid "Dichotomies" msgstr "" #: src/language/dictionary/mrsets.c:565 src/language/stats/logistic.c:1391 msgid "Categories" msgstr "" #: src/language/dictionary/numeric.c:67 #, c-format msgid "Format type %s may not be used with a numeric variable." msgstr "" #: src/language/dictionary/numeric.c:86 src/language/dictionary/numeric.c:153 #, c-format msgid "There is already a variable named %s." msgstr "" #: src/language/dictionary/numeric.c:138 #, c-format msgid "Format type %s may not be used with a string variable." msgstr "" #: src/language/dictionary/rename-variables.c:92 #, c-format msgid "Renaming would duplicate variable name %s." msgstr "" #: src/language/dictionary/split-file.c:75 msgid "Split Values" msgstr "" #: src/language/dictionary/split-file.c:76 #: src/language/dictionary/split-file.c:77 #: src/language/dictionary/sys-file-info.c:696 #: src/language/stats/chisquare.c:195 src/language/stats/cochran.c:156 #: src/language/stats/cochran.c:185 src/language/stats/examine.c:841 #: src/language/stats/reliability.c:648 src/language/stats/reliability.c:651 #: src/language/stats/crosstabs.q:1303 src/language/stats/crosstabs.q:1325 #: src/language/stats/crosstabs.q:1365 src/language/stats/crosstabs.q:1412 msgid "Value" msgstr "" #: src/language/dictionary/split-file.c:79 #: src/language/dictionary/sys-file-info.c:734 #: src/language/stats/chisquare.c:246 src/language/stats/chisquare.c:328 #: src/language/stats/cochran.c:164 src/language/stats/correlations.c:100 #: src/language/stats/descriptives.c:1004 src/language/stats/friedman.c:226 #: src/language/stats/jonckheere-terpstra.c:377 #: src/language/stats/npar-summary.c:113 src/language/stats/quick-cluster.c:588 #: src/language/stats/runs.c:331 src/language/data-io/data-parser.c:683 #: src/language/data-io/data-parser.c:728 src/language/data-io/print.c:438 #: src/ui/gui/psppire-dictview.c:580 src/ui/gui/psppire-data-editor.c:502 msgid "Variable" msgstr "" #: src/language/dictionary/sys-file-info.c:184 msgid "File Information" msgstr "" #: src/language/dictionary/sys-file-info.c:185 msgid "Attribute" msgstr "" #: src/language/dictionary/sys-file-info.c:187 msgid "File" msgstr "" #: src/language/dictionary/sys-file-info.c:194 msgid "Created" msgstr "" #: src/language/dictionary/sys-file-info.c:203 msgid "Integer Format" msgstr "" #: src/language/dictionary/sys-file-info.c:205 msgid "Big Endian" msgstr "" #: src/language/dictionary/sys-file-info.c:206 msgid "Little Endian" msgstr "" #: src/language/dictionary/sys-file-info.c:207 #: src/language/dictionary/sys-file-info.c:216 #: src/language/dictionary/sys-file-info.c:223 src/language/utilities/set.q:930 msgid "Unknown" msgstr "" #: src/language/dictionary/sys-file-info.c:209 msgid "Real Format" msgstr "" #: src/language/dictionary/sys-file-info.c:211 msgid "IEEE 754 LE." msgstr "" #: src/language/dictionary/sys-file-info.c:212 msgid "IEEE 754 BE." msgstr "" #: src/language/dictionary/sys-file-info.c:213 msgid "VAX D." msgstr "" #: src/language/dictionary/sys-file-info.c:214 msgid "VAX G." msgstr "" #: src/language/dictionary/sys-file-info.c:215 msgid "IBM 390 Hex Long." msgstr "" #: src/language/dictionary/sys-file-info.c:218 #: src/language/dictionary/sys-file-info.c:443 #: src/language/stats/binomial.c:199 src/language/stats/correlations.c:131 #: src/language/stats/correlations.c:159 src/language/stats/descriptives.c:585 #: src/language/stats/factor.c:1658 src/language/stats/factor.c:1701 #: src/language/stats/factor.c:1860 src/language/stats/factor.c:2074 #: src/language/stats/frequencies.c:1583 #: src/language/stats/kruskal-wallis.c:254 #: src/language/stats/kruskal-wallis.c:303 #: src/language/stats/ks-one-sample.c:316 src/language/stats/logistic.c:1187 #: src/language/stats/mann-whitney.c:254 src/language/stats/means.c:718 #: src/language/stats/means.c:800 src/language/stats/median.c:358 #: src/language/stats/oneway.c:985 src/language/stats/oneway.c:1157 #: src/language/stats/reliability.c:591 src/language/stats/regression.c:924 #: src/language/stats/t-test-one-sample.c:132 #: src/language/stats/t-test-paired.c:157 src/language/data-io/list.c:104 #: src/ui/gui/variable-info.ui:25 msgid "Variables" msgstr "" #: src/language/dictionary/sys-file-info.c:221 src/language/stats/examine.c:929 #: src/language/stats/means.c:697 src/language/stats/reliability.c:548 #: src/language/stats/crosstabs.q:930 msgid "Cases" msgstr "" #: src/language/dictionary/sys-file-info.c:226 src/language/stats/oneway.c:980 #: src/ui/gui/psppire-var-sheet-header.c:58 src/ui/gui/compute.ui:303 msgid "Type" msgstr "" #: src/language/dictionary/sys-file-info.c:230 msgid "Weight" msgstr "" #: src/language/dictionary/sys-file-info.c:233 msgid "Not weighted" msgstr "" #: src/language/dictionary/sys-file-info.c:235 msgid "Compression" msgstr "" #: src/language/dictionary/sys-file-info.c:245 #: src/language/dictionary/sys-file-info.c:424 #: src/language/dictionary/sys-file-info.c:426 msgid "Documents" msgstr "" #: src/language/dictionary/sys-file-info.c:305 #: src/language/dictionary/sys-file-info.c:430 msgid "(none)" msgstr "" #: src/language/dictionary/sys-file-info.c:393 msgid "No variables to display." msgstr "" #: src/language/dictionary/sys-file-info.c:404 msgid "Macros not supported." msgstr "" #: src/language/dictionary/sys-file-info.c:426 msgid "Document" msgstr "" #: src/language/dictionary/sys-file-info.c:454 msgid "Position" msgstr "" #: src/language/dictionary/sys-file-info.c:456 msgid "Measurement Level" msgstr "" #: src/language/dictionary/sys-file-info.c:457 #: src/ui/gui/psppire-var-sheet-header.c:85 msgid "Role" msgstr "" #: src/language/dictionary/sys-file-info.c:458 #: src/ui/gui/psppire-var-sheet-header.c:61 src/ui/gui/compute.ui:215 msgid "Width" msgstr "" #: src/language/dictionary/sys-file-info.c:459 msgid "Alignment" msgstr "" #: src/language/dictionary/sys-file-info.c:460 #: src/language/dictionary/sys-file-info.c:734 msgid "Print Format" msgstr "" #: src/language/dictionary/sys-file-info.c:461 msgid "Write Format" msgstr "" #: src/language/dictionary/sys-file-info.c:462 #: src/ui/gui/missing-val-dialog.c:379 src/ui/gui/psppire-var-sheet-header.c:73 #: src/ui/gui/examine.ui:416 src/ui/gui/t-test.ui:105 msgid "Missing Values" msgstr "" #: src/language/dictionary/sys-file-info.c:567 #: src/ui/gui/psppire-var-sheet-header.c:70 src/ui/gui/val-labs-dialog.c:489 #: src/ui/gui/val-labs-dialog.ui:194 msgid "Value Labels" msgstr "" #: src/language/dictionary/sys-file-info.c:573 msgid "Variable Value" msgstr "" #: src/language/dictionary/sys-file-info.c:577 msgid "User-missing value" msgstr "" #: src/language/dictionary/sys-file-info.c:693 msgid "Variable and Dataset Attributes" msgstr "" #: src/language/dictionary/sys-file-info.c:699 msgid "Variable and Name" msgstr "" #: src/language/dictionary/sys-file-info.c:702 msgid "(dataset)" msgstr "" #: src/language/dictionary/sys-file-info.c:722 msgid "No vectors defined." msgstr "" #: src/language/dictionary/sys-file-info.c:732 msgid "Vectors" msgstr "" #: src/language/dictionary/sys-file-info.c:736 msgid "Vector and Position" msgstr "" #: src/language/dictionary/sys-file-info.c:998 msgid "No valid encodings found." msgstr "" #: src/language/dictionary/sys-file-info.c:1004 #, c-format msgid "Usable encodings for %s." msgstr "" #: src/language/dictionary/sys-file-info.c:1007 #, c-format msgid "" "Encodings that can successfully read %s (by specifying the encoding name on " "the GET command's ENCODING subcommand). Encodings that yield identical text " "are listed together." msgstr "" #: src/language/dictionary/sys-file-info.c:1012 #: src/language/dictionary/sys-file-info.c:1013 msgid "Encodings" msgstr "" #: src/language/dictionary/sys-file-info.c:1042 #, c-format msgid "%s Encoded Text Strings" msgstr "" #: src/language/dictionary/sys-file-info.c:1046 msgid "" "Text strings in the file dictionary that the previously listed encodings " "interpret differently, along with the interpretations." msgstr "" #: src/language/dictionary/sys-file-info.c:1049 src/output/text-item.c:57 #: src/ui/gui/psppire-import-assistant.c:885 msgid "Text" msgstr "" #: src/language/dictionary/sys-file-info.c:1059 msgid "Purpose" msgstr "" #: src/language/dictionary/value-labels.c:154 #, c-format msgid "Truncating value label to %d bytes." msgstr "" #: src/language/dictionary/vector.c:66 #, c-format msgid "A vector named %s already exists." msgstr "" #: src/language/dictionary/vector.c:74 #, c-format msgid "Vector name %s is given twice." msgstr "" #: src/language/dictionary/vector.c:98 msgid "A slash must separate each vector specification in VECTOR's long form." msgstr "" #: src/language/dictionary/vector.c:131 msgid "Vectors must have at least one element." msgstr "" #: src/language/dictionary/vector.c:151 msgid "expecting vector length" msgstr "" #: src/language/dictionary/vector.c:170 #, c-format msgid "%s is an existing variable name." msgstr "" #: src/language/dictionary/variable-display.c:121 msgid "Variable display width must be a positive integer." msgstr "" #: src/language/dictionary/weight.c:49 msgid "The weighting variable must be numeric." msgstr "" #: src/language/dictionary/weight.c:54 msgid "The weighting variable may not be scratch." msgstr "" #: src/language/tests/moments-test.c:50 msgid "expecting weight value" msgstr "" #: src/language/utilities/cd.c:45 src/language/utilities/include.c:173 #, c-format msgid "Cannot change directory to %s: %s" msgstr "" #: src/language/utilities/date.c:33 #, c-format msgid "Only %s is currently implemented." msgstr "" #: src/language/utilities/host.c:60 msgid "Time limit not supported on this platform." msgstr "" #: src/language/utilities/host.c:74 #, c-format msgid "%s: Command exited with status %d." msgstr "" #: src/language/utilities/host.c:95 #, c-format msgid "Failed to create temporary file (%s)." msgstr "" #: src/language/utilities/host.c:102 #, c-format msgid "/dev/null: Failed to open (%s)." msgstr "" #: src/language/utilities/host.c:117 #, c-format msgid "Couldn't fork: %s." msgstr "" #: src/language/utilities/host.c:193 #, c-format msgid "While running \"%s\", waiting for child process failed (%s)." msgstr "" #: src/language/utilities/host.c:203 #, c-format msgid "Command \"%s\" timed out." msgstr "" #: src/language/utilities/host.c:205 #, c-format msgid "Command \"%s\" terminated by signal %d." msgstr "" #: src/language/utilities/host.c:212 msgid "Command or shell not found" msgstr "" #: src/language/utilities/host.c:214 msgid "Could not invoke command or shell" msgstr "" #: src/language/utilities/host.c:217 #, c-format msgid "Command \"%s\" exited with status %d (%s)." msgstr "" #: src/language/utilities/host.c:220 #, c-format msgid "Command \"%s\" exited with status %d." msgstr "" #: src/language/utilities/host.c:230 #, c-format msgid "Command \"%s\" output could not be read (%s)." msgstr "" #: src/language/utilities/title.c:88 #, c-format msgid " (Entered %s)" msgstr "" #: src/language/utilities/include.c:73 #, c-format msgid "Can't find `%s' in include file search path." msgstr "" #: src/language/utilities/output.c:128 #, c-format msgid "Unknown cell class %s." msgstr "" #: src/language/utilities/permissions.c:113 #, c-format msgid "Cannot stat %s: %s" msgstr "" #: src/language/utilities/permissions.c:127 #, c-format msgid "Cannot change mode of %s: %s" msgstr "" #: src/language/stats/aggregate.c:96 msgid "Sum of values" msgstr "" #: src/language/stats/aggregate.c:97 msgid "Mean average" msgstr "" #: src/language/stats/aggregate.c:98 msgid "Median average" msgstr "" #: src/language/stats/aggregate.c:99 #: src/ui/gui/psppire-dialog-action-descriptives.c:40 #: src/ui/gui/psppire-dialog-action-frequencies.c:41 msgid "Standard deviation" msgstr "" #: src/language/stats/aggregate.c:100 #: src/ui/gui/psppire-dialog-action-descriptives.c:42 msgid "Maximum value" msgstr "" #: src/language/stats/aggregate.c:101 #: src/ui/gui/psppire-dialog-action-descriptives.c:41 msgid "Minimum value" msgstr "" #: src/language/stats/aggregate.c:102 msgid "Percentage greater than" msgstr "" #: src/language/stats/aggregate.c:103 msgid "Percentage less than" msgstr "" #: src/language/stats/aggregate.c:104 msgid "Percentage included in range" msgstr "" #: src/language/stats/aggregate.c:105 msgid "Percentage excluded from range" msgstr "" #: src/language/stats/aggregate.c:106 msgid "Fraction greater than" msgstr "" #: src/language/stats/aggregate.c:107 msgid "Fraction less than" msgstr "" #: src/language/stats/aggregate.c:108 msgid "Fraction included in range" msgstr "" #: src/language/stats/aggregate.c:109 msgid "Fraction excluded from range" msgstr "" #: src/language/stats/aggregate.c:110 msgid "Number of cases" msgstr "" #: src/language/stats/aggregate.c:111 msgid "Number of cases (unweighted)" msgstr "" #: src/language/stats/aggregate.c:112 msgid "Number of missing values" msgstr "" #: src/language/stats/aggregate.c:113 msgid "Number of missing values (unweighted)" msgstr "" #: src/language/stats/aggregate.c:114 msgid "First non-missing value" msgstr "" #: src/language/stats/aggregate.c:115 msgid "Last non-missing value" msgstr "" #: src/language/stats/aggregate.c:258 msgid "" "When PRESORTED is specified, specifying sorting directions with (A) or (D) " "has no effect. Output data will be sorted the same way as the input data." msgstr "" #: src/language/stats/aggregate.c:448 msgid "expecting aggregation function" msgstr "" #: src/language/stats/aggregate.c:460 #, c-format msgid "Unknown aggregation function %s." msgstr "" #: src/language/stats/aggregate.c:513 #, c-format msgid "Missing argument %zu to %s." msgstr "" #: src/language/stats/aggregate.c:522 #, c-format msgid "Arguments to %s must be of same type as source variables." msgstr "" #: src/language/stats/aggregate.c:541 #, c-format msgid "" "Number of source variables (%zu) does not match number of target variables " "(%zu)." msgstr "" #: src/language/stats/aggregate.c:557 #, c-format msgid "" "The value arguments passed to the %s function are out-of-order. They will " "be treated as if they had been specified in the correct order." msgstr "" #: src/language/stats/aggregate.c:631 #, c-format msgid "" "Variable name %s is not unique within the aggregate file dictionary, which " "contains the aggregate variables and the break variables." msgstr "" #: src/language/stats/autorecode.c:152 #, c-format msgid "Source variable count (%zu) does not match target variable count (%zu)." msgstr "" #: src/language/stats/autorecode.c:164 #, c-format msgid "Target variable %s duplicates existing variable %s." msgstr "" #: src/language/stats/autorecode.c:221 #, c-format msgid "" "With GROUP, variables may not mix string variables (such as %s) and numeric " "variables (such as %s)." msgstr "" #: src/language/stats/autorecode.c:363 msgid "Recoding grouped variables." msgstr "" #: src/language/stats/autorecode.c:365 #, c-format msgid "Recoding %s into %s (%s)." msgstr "" #: src/language/stats/autorecode.c:369 #, c-format msgid "Recoding %s into %s." msgstr "" #: src/language/stats/autorecode.c:376 src/ui/gui/recode.ui:209 msgid "New Value" msgstr "" #: src/language/stats/autorecode.c:376 msgid "Value Label" msgstr "" #: src/language/stats/autorecode.c:379 msgid "Old Value" msgstr "" #: src/language/stats/binomial.c:138 #, c-format msgid "Variable %s is not dichotomous" msgstr "" #: src/language/stats/binomial.c:182 src/ui/gui/binomial.ui:30 msgid "Binomial Test" msgstr "" #: src/language/stats/binomial.c:186 src/language/stats/chisquare.c:183 #: src/language/stats/chisquare.c:239 src/language/stats/chisquare.c:322 #: src/language/stats/cochran.c:188 src/language/stats/correlations.c:94 #: src/language/stats/correlations.c:145 src/language/stats/descriptives.c:991 #: src/language/stats/examine.c:602 src/language/stats/examine.c:742 #: src/language/stats/examine.c:836 src/language/stats/examine.c:925 #: src/language/stats/factor.c:1755 src/language/stats/factor.c:1878 #: src/language/stats/factor.c:1908 src/language/stats/factor.c:2068 #: src/language/stats/factor.c:2102 src/language/stats/frequencies.c:302 #: src/language/stats/frequencies.c:1579 src/language/stats/frequencies.c:1586 #: src/language/stats/friedman.c:250 src/language/stats/glm.c:729 #: src/language/stats/kruskal-wallis.c:249 #: src/language/stats/kruskal-wallis.c:297 #: src/language/stats/ks-one-sample.c:278 src/language/stats/logistic.c:1170 #: src/language/stats/logistic.c:1300 src/language/stats/logistic.c:1330 #: src/language/stats/jonckheere-terpstra.c:361 #: src/language/stats/mann-whitney.c:184 src/language/stats/mann-whitney.c:247 #: src/language/stats/means.c:757 src/language/stats/means.c:811 #: src/language/stats/mcnemar.c:222 src/language/stats/median.c:315 #: src/language/stats/median.c:350 src/language/stats/npar-summary.c:106 #: src/language/stats/oneway.c:973 src/language/stats/oneway.c:1051 #: src/language/stats/oneway.c:1150 src/language/stats/oneway.c:1238 #: src/language/stats/oneway.c:1373 src/language/stats/quick-cluster.c:746 #: src/language/stats/reliability.c:543 src/language/stats/reliability.c:584 #: src/language/stats/reliability.c:633 src/language/stats/reliability.c:644 #: src/language/stats/roc.c:969 src/language/stats/roc.c:1067 #: src/language/stats/regression.c:867 src/language/stats/regression.c:899 #: src/language/stats/regression.c:1023 src/language/stats/regression.c:1089 #: src/language/stats/runs.c:318 src/language/stats/sign.c:102 #: src/language/stats/t-test-indep.c:193 src/language/stats/t-test-indep.c:259 #: src/language/stats/t-test-one-sample.c:68 #: src/language/stats/t-test-one-sample.c:125 #: src/language/stats/t-test-paired.c:150 #: src/language/stats/t-test-paired.c:193 #: src/language/stats/t-test-paired.c:238 src/language/stats/wilcoxon.c:243 #: src/language/stats/wilcoxon.c:282 src/language/stats/crosstabs.q:925 #: src/language/stats/crosstabs.q:1253 src/language/stats/crosstabs.q:1293 #: src/language/stats/crosstabs.q:1302 src/language/stats/crosstabs.q:1331 #: src/language/stats/crosstabs.q:1373 src/language/stats/crosstabs.q:1418 #: src/ui/gui/crosstabs.ui:499 src/ui/gui/oneway.ui:615 msgid "Statistics" msgstr "" #: src/language/stats/binomial.c:187 src/language/stats/chisquare.c:240 #: src/language/stats/chisquare.c:252 msgid "Category" msgstr "" #: src/language/stats/binomial.c:188 src/language/stats/cochran.c:189 #: src/language/stats/correlations.c:97 src/language/stats/correlations.c:155 #: src/language/stats/descriptives.c:993 src/language/stats/examine.c:926 #: src/language/stats/frequencies.c:1588 src/language/stats/friedman.c:251 #: src/language/stats/kruskal-wallis.c:250 #: src/language/stats/ks-one-sample.c:279 src/language/stats/logistic.c:1331 #: src/language/stats/jonckheere-terpstra.c:369 #: src/language/stats/mann-whitney.c:185 src/language/stats/means.c:710 #: src/language/stats/means-calc.c:439 src/language/stats/mcnemar.c:223 #: src/language/stats/median.c:351 src/language/stats/npar-summary.c:107 #: src/language/stats/oneway.c:1052 src/language/stats/reliability.c:544 #: src/language/stats/sign.c:69 src/language/stats/sign.c:70 #: src/language/stats/t-test-indep.c:194 #: src/language/stats/t-test-one-sample.c:126 #: src/language/stats/t-test-paired.c:151 #: src/language/stats/t-test-paired.c:194 src/language/stats/wilcoxon.c:244 #: src/language/stats/crosstabs.q:926 msgid "N" msgstr "" #: src/language/stats/binomial.c:189 msgid "Observed Prop." msgstr "" #: src/language/stats/binomial.c:190 msgid "Test Prop." msgstr "" #: src/language/stats/binomial.c:192 src/language/stats/mcnemar.c:224 #: src/language/stats/sign.c:103 src/language/stats/wilcoxon.c:288 #: src/language/stats/crosstabs.q:1306 msgid "Exact Sig. (2-tailed)" msgstr "" #: src/language/stats/binomial.c:193 src/language/stats/mcnemar.c:225 #: src/language/stats/sign.c:104 src/language/stats/wilcoxon.c:289 #: src/language/stats/crosstabs.q:1307 msgid "Exact Sig. (1-tailed)" msgstr "" #: src/language/stats/binomial.c:195 msgid "Groups" msgstr "" #: src/language/stats/binomial.c:196 msgid "Group 1" msgstr "" #: src/language/stats/binomial.c:196 msgid "Group 2" msgstr "" #: src/language/stats/binomial.c:196 src/language/stats/chisquare.c:223 #: src/language/stats/chisquare.c:257 src/language/stats/examine.c:930 #: src/language/stats/factor.c:1756 src/language/stats/frequencies.c:344 #: src/language/stats/glm.c:811 src/language/stats/kruskal-wallis.c:285 #: src/language/stats/logistic.c:1336 src/language/stats/mann-whitney.c:197 #: src/language/stats/means.c:706 src/language/stats/oneway.c:982 #: src/language/stats/oneway.c:1072 src/language/stats/reliability.c:549 #: src/language/stats/regression.c:1031 src/language/stats/sign.c:75 #: src/language/stats/wilcoxon.c:250 #: src/ui/gui/psppire-dialog-action-crosstabs.c:93 #: src/language/stats/crosstabs.q:931 src/language/stats/crosstabs.q:1218 msgid "Total" msgstr "" #: src/language/stats/chisquare.c:171 #, c-format msgid "" "CHISQUARE test specified %d expected values, but variable %s has %zu " "distinct values." msgstr "" #: src/language/stats/chisquare.c:184 src/language/stats/chisquare.c:241 msgid "Observed N" msgstr "" #: src/language/stats/chisquare.c:185 src/language/stats/chisquare.c:242 msgid "Expected N" msgstr "" #: src/language/stats/chisquare.c:186 src/language/stats/chisquare.c:243 #: src/language/stats/regression.c:1031 #: src/ui/gui/psppire-dialog-action-crosstabs.c:95 #: src/language/stats/crosstabs.q:1267 msgid "Residual" msgstr "" #: src/language/stats/chisquare.c:235 src/language/stats/cochran.c:150 #: src/language/stats/median.c:305 src/language/stats/sign.c:66 #: src/ui/gui/frequencies.ui:676 msgid "Frequencies" msgstr "" #: src/language/stats/chisquare.c:320 src/language/stats/cochran.c:181 #: src/language/stats/friedman.c:246 src/language/stats/kruskal-wallis.c:295 #: src/language/stats/mann-whitney.c:244 src/language/stats/mcnemar.c:219 #: src/language/stats/median.c:347 src/language/stats/sign.c:100 #: src/language/stats/wilcoxon.c:279 msgid "Test Statistics" msgstr "" #: src/language/stats/chisquare.c:323 msgid "Chi-square" msgstr "" #: src/language/stats/chisquare.c:324 src/language/stats/cochran.c:191 #: src/language/stats/examine.c:675 src/language/stats/factor.c:2107 #: src/language/stats/friedman.c:257 src/language/stats/glm.c:733 #: src/language/stats/kruskal-wallis.c:299 src/language/stats/logistic.c:1174 #: src/language/stats/median.c:354 src/language/stats/oneway.c:975 #: src/language/stats/oneway.c:1242 src/language/stats/regression.c:1025 #: src/language/stats/t-test-indep.c:267 #: src/language/stats/t-test-one-sample.c:75 #: src/language/stats/t-test-paired.c:253 src/language/stats/crosstabs.q:1304 msgid "df" msgstr "" #: src/language/stats/chisquare.c:325 src/language/stats/cochran.c:192 #: src/language/stats/friedman.c:258 src/language/stats/kruskal-wallis.c:300 #: src/language/stats/median.c:355 msgid "Asymp. Sig." msgstr "" #: src/language/stats/cochran.c:111 msgid "More than two values encountered. Cochran Q test will not be run." msgstr "" #: src/language/stats/cochran.c:153 #, c-format msgid "Success (%.*g)" msgstr "" #: src/language/stats/cochran.c:154 #, c-format msgid "Failure (%.*g)" msgstr "" #: src/language/stats/cochran.c:190 msgid "Cochran's Q" msgstr "" #: src/language/stats/correlations.c:91 src/language/stats/descriptives.c:987 #: src/language/stats/factor.c:2065 src/language/stats/npar-summary.c:102 msgid "Descriptive Statistics" msgstr "" #: src/language/stats/correlations.c:95 src/language/stats/descriptives.c:108 #: src/language/stats/examine.c:742 src/language/stats/factor.c:2069 #: src/language/stats/frequencies.c:141 src/language/stats/graph.c:211 #: src/language/stats/ks-one-sample.c:290 src/language/stats/means-calc.c:438 #: src/language/stats/npar-summary.c:108 src/language/stats/oneway.c:1052 #: src/language/stats/t-test-indep.c:195 #: src/language/stats/t-test-one-sample.c:127 #: src/language/stats/t-test-paired.c:152 #: src/language/stats/t-test-paired.c:241 #: src/ui/gui/psppire-dialog-action-descriptives.c:39 #: src/ui/gui/psppire-dialog-action-frequencies.c:40 msgid "Mean" msgstr "" #: src/language/stats/correlations.c:96 src/language/stats/examine.c:751 #: src/language/stats/factor.c:2070 src/language/stats/ks-one-sample.c:290 #: src/language/stats/means-calc.c:440 src/language/stats/npar-summary.c:109 #: src/language/stats/oneway.c:1052 src/language/stats/t-test-indep.c:196 #: src/language/stats/t-test-one-sample.c:128 #: src/language/stats/t-test-paired.c:153 #: src/language/stats/t-test-paired.c:242 msgid "Std. Deviation" msgstr "" #: src/language/stats/correlations.c:126 msgid "Correlations" msgstr "" #: src/language/stats/correlations.c:146 msgid "Pearson Correlation" msgstr "" #: src/language/stats/correlations.c:147 src/language/stats/oneway.c:1243 #: src/language/stats/t-test-indep.c:268 #: src/language/stats/t-test-one-sample.c:76 #: src/language/stats/t-test-paired.c:254 msgid "Sig. (2-tailed)" msgstr "" #: src/language/stats/correlations.c:147 src/language/stats/factor.c:1913 msgid "Sig. (1-tailed)" msgstr "" #: src/language/stats/correlations.c:151 msgid "Cross-products" msgstr "" #: src/language/stats/correlations.c:152 msgid "Covariance" msgstr "" #: src/language/stats/correlations.c:165 msgid "Significant at .05 level" msgstr "" #: src/language/stats/correlations.c:234 msgid "The data for the chosen variables are all missing or empty." msgstr "" #: src/language/stats/correlations.c:390 src/language/stats/descriptives.c:368 #: src/language/data-io/list.c:166 msgid "No variables specified." msgstr "" #: src/language/stats/descriptives.c:109 src/language/stats/frequencies.c:142 #: src/language/stats/means-calc.c:445 src/language/stats/t-test-indep.c:197 #: src/language/stats/t-test-one-sample.c:129 #: src/language/stats/t-test-paired.c:154 #: src/language/stats/t-test-paired.c:243 msgid "S.E. Mean" msgstr "" #: src/language/stats/descriptives.c:110 src/language/stats/frequencies.c:145 msgid "Std Dev" msgstr "" #: src/language/stats/descriptives.c:111 src/language/stats/examine.c:750 #: src/language/stats/frequencies.c:146 src/language/stats/means-calc.c:450 #: src/ui/gui/psppire-dialog-action-descriptives.c:46 #: src/ui/gui/psppire-dialog-action-frequencies.c:45 msgid "Variance" msgstr "" #: src/language/stats/descriptives.c:112 src/language/stats/examine.c:752 #: src/language/stats/frequencies.c:147 src/language/stats/means-calc.c:451 #: src/ui/gui/psppire-dialog-action-descriptives.c:47 #: src/ui/gui/psppire-dialog-action-frequencies.c:50 msgid "Kurtosis" msgstr "" #: src/language/stats/descriptives.c:113 src/language/stats/frequencies.c:148 #: src/language/stats/means-calc.c:452 msgid "S.E. Kurt" msgstr "" #: src/language/stats/descriptives.c:114 src/language/stats/examine.c:752 #: src/language/stats/frequencies.c:149 src/language/stats/means-calc.c:453 #: src/ui/gui/psppire-dialog-action-descriptives.c:48 #: src/ui/gui/psppire-dialog-action-frequencies.c:46 msgid "Skewness" msgstr "" #: src/language/stats/descriptives.c:115 src/language/stats/frequencies.c:150 #: src/language/stats/means-calc.c:454 msgid "S.E. Skew" msgstr "" #: src/language/stats/descriptives.c:116 src/language/stats/examine.c:751 #: src/language/stats/frequencies.c:151 src/language/stats/means-calc.c:449 #: src/ui/gui/psppire-dialog-action-descriptives.c:43 #: src/ui/gui/psppire-dialog-action-frequencies.c:48 msgid "Range" msgstr "" #: src/language/stats/descriptives.c:117 src/language/stats/examine.c:751 #: src/language/stats/frequencies.c:152 src/language/stats/graph.c:214 #: src/language/stats/ks-one-sample.c:285 src/language/stats/means-calc.c:447 #: src/language/stats/npar-summary.c:110 src/language/stats/oneway.c:1061 #: src/ui/gui/psppire-dialog-action-descriptives.c:41 #: src/ui/gui/psppire-dialog-action-frequencies.c:42 msgid "Minimum" msgstr "" #: src/language/stats/descriptives.c:118 src/language/stats/examine.c:751 #: src/language/stats/frequencies.c:153 src/language/stats/graph.c:213 #: src/language/stats/ks-one-sample.c:285 src/language/stats/means-calc.c:448 #: src/language/stats/npar-summary.c:110 src/language/stats/oneway.c:1061 #: src/ui/gui/psppire-dialog-action-descriptives.c:42 #: src/ui/gui/psppire-dialog-action-frequencies.c:43 msgid "Maximum" msgstr "" #: src/language/stats/descriptives.c:119 src/language/stats/frequencies.c:154 #: src/language/stats/graph.c:212 src/language/stats/means-calc.c:446 #: src/ui/gui/psppire-dialog-action-descriptives.c:44 #: src/ui/gui/psppire-dialog-action-frequencies.c:53 msgid "Sum" msgstr "" #: src/language/stats/descriptives.c:350 #, c-format msgid "Z-score variable name %s would be a duplicate variable name." msgstr "" #: src/language/stats/descriptives.c:401 msgid "" "DESCRIPTIVES with Z scores ignores TEMPORARY. Temporary transformations " "will be made permanent." msgstr "" #: src/language/stats/descriptives.c:478 msgid "expecting statistic name: reverting to default" msgstr "" #: src/language/stats/descriptives.c:561 msgid "" "Ran out of generic names for Z-score variables. There are only 126 generic " "names: ZSC001-ZSC0999, STDZ01-STDZ09, ZZZZ01-ZZZZ09, ZQZQ01-ZQZQ09." msgstr "" #: src/language/stats/descriptives.c:579 msgid "Mapping of Variables to Z-scores" msgstr "" #: src/language/stats/descriptives.c:581 msgid "Names" msgstr "" #: src/language/stats/descriptives.c:582 src/language/stats/glm.c:739 #: src/language/stats/regression.c:1030 msgid "Source" msgstr "" #: src/language/stats/descriptives.c:582 msgid "Target" msgstr "" #: src/language/stats/descriptives.c:659 #, c-format msgid "Internal error processing Z scores. Please report this to %s." msgstr "" #: src/language/stats/descriptives.c:759 #, c-format msgid "Z-score of %s" msgstr "" #: src/language/stats/descriptives.c:1028 src/language/stats/roc.c:1029 msgid "Valid N (listwise)" msgstr "" #: src/language/stats/descriptives.c:1028 msgid "Missing N (listwise)" msgstr "" #: src/language/stats/examine.c:75 msgid " (missing)" msgstr "" #: src/language/stats/examine.c:225 #, c-format msgid "Boxplot of %s vs. %s" msgstr "" #: src/language/stats/examine.c:231 src/language/stats/examine.c:338 #, c-format msgid "Boxplot of %s" msgstr "" #: src/language/stats/examine.c:321 msgid "Boxplot" msgstr "" #: src/language/stats/examine.c:418 msgid "Not creating NP plot because data set is empty." msgstr "" #: src/language/stats/examine.c:478 #, c-format msgid "Not creating spreadlevel chart for %s" msgstr "" #: src/language/stats/examine.c:585 msgid "User-missing value." msgstr "" #: src/language/stats/examine.c:591 src/language/stats/examine.c:595 #: src/language/stats/frequencies.c:1606 msgid "Percentiles" msgstr "" #: src/language/stats/examine.c:603 src/math/percentiles.c:37 msgid "Weighted Average" msgstr "" #: src/language/stats/examine.c:603 msgid "Tukey's Hinges" msgstr "" #: src/language/stats/examine.c:610 src/language/stats/examine.c:685 #: src/language/stats/examine.c:759 src/language/stats/examine.c:858 #: src/language/stats/examine.c:938 src/language/stats/mann-whitney.c:200 #: src/language/stats/median.c:319 src/language/stats/t-test-indep.c:227 #: src/language/stats/t-test-indep.c:282 #: src/language/stats/t-test-one-sample.c:87 msgid "Dependent Variables" msgstr "" #: src/language/stats/examine.c:669 msgid "Tests of Normality" msgstr "" #: src/language/stats/examine.c:673 msgid "Shapiro-Wilk" msgstr "" #: src/language/stats/examine.c:674 src/language/stats/examine.c:739 #: src/ui/gui/psppire-checkbox-treeview.c:73 msgid "Statistic" msgstr "" #: src/language/stats/examine.c:676 src/language/stats/factor.c:2108 #: src/language/stats/glm.c:736 src/language/stats/logistic.c:1175 #: src/language/stats/oneway.c:978 src/language/stats/oneway.c:1154 #: src/language/stats/oneway.c:1376 src/language/stats/regression.c:906 #: src/language/stats/regression.c:1028 src/language/stats/t-test-indep.c:263 #: src/language/stats/t-test-paired.c:196 msgid "Sig." msgstr "" #: src/language/stats/examine.c:735 src/language/stats/oneway.c:1045 #: src/ui/gui/descriptives.ui:25 msgid "Descriptives" msgstr "" #: src/language/stats/examine.c:738 msgid "Aspect" msgstr "" #: src/language/stats/examine.c:739 src/language/stats/oneway.c:1053 #: src/language/stats/oneway.c:1240 src/language/stats/oneway.c:1375 #: src/language/stats/roc.c:975 src/language/stats/regression.c:902 msgid "Std. Error" msgstr "" #: src/language/stats/examine.c:745 src/language/stats/oneway.c:1056 #, c-format msgid "%g%% Confidence Interval for Mean" msgstr "" #: src/language/stats/examine.c:747 src/language/stats/oneway.c:1058 #: src/language/stats/oneway.c:1382 src/language/stats/roc.c:982 #: src/language/stats/regression.c:913 msgid "Lower Bound" msgstr "" #: src/language/stats/examine.c:748 src/language/stats/oneway.c:1059 #: src/language/stats/oneway.c:1383 src/language/stats/roc.c:983 #: src/language/stats/regression.c:914 msgid "Upper Bound" msgstr "" #: src/language/stats/examine.c:750 msgid "5% Trimmed Mean" msgstr "" #: src/language/stats/examine.c:750 src/language/stats/frequencies.c:143 #: src/language/stats/means-calc.c:442 src/language/stats/median.c:352 #: src/ui/gui/psppire-dialog-action-frequencies.c:52 msgid "Median" msgstr "" #: src/language/stats/examine.c:752 msgid "Interquartile Range" msgstr "" #: src/language/stats/examine.c:832 msgid "Extreme Values" msgstr "" #: src/language/stats/examine.c:840 src/language/stats/quick-cluster.c:664 #: src/language/data-io/list.c:110 msgid "Case Number" msgstr "" #: src/language/stats/examine.c:844 msgid "Order" msgstr "" #. TRANSLATORS: This is a noun, not an adjective. #: src/language/stats/examine.c:850 msgid "Extreme" msgstr "" #: src/language/stats/examine.c:851 msgid "Highest" msgstr "" #: src/language/stats/examine.c:851 msgid "Lowest" msgstr "" #: src/language/stats/examine.c:921 src/language/stats/logistic.c:1328 #: src/language/stats/means.c:694 src/language/stats/reliability.c:540 msgid "Case Processing Summary" msgstr "" #: src/language/stats/examine.c:927 src/language/stats/frequencies.c:304 #: src/language/stats/frequencies.c:1494 src/language/stats/logistic.c:1332 #: src/language/stats/means.c:713 src/language/stats/reliability.c:545 #: src/language/stats/crosstabs.q:927 msgid "Percent" msgstr "" #: src/language/stats/examine.c:929 src/language/stats/frequencies.c:321 #: src/language/stats/frequencies.c:1590 src/language/stats/quick-cluster.c:766 #: src/language/stats/reliability.c:548 src/language/stats/crosstabs.q:931 msgid "Valid" msgstr "" #: src/language/stats/examine.c:929 src/language/stats/frequencies.c:336 #: src/language/stats/frequencies.c:1591 src/language/stats/crosstabs.q:931 msgid "Missing" msgstr "" #: src/language/stats/examine.c:1550 #, c-format msgid "%s may not be negative. Using default value (%g)." msgstr "" #: src/language/stats/examine.c:1587 msgid "Percentiles must lie in the range (0, 100)" msgstr "" #: src/language/stats/examine.c:1777 #, c-format msgid "%s and %s are mutually exclusive" msgstr "" #: src/language/stats/factor.c:1121 #, c-format msgid "Matrix input for %s must be either COV or CORR" msgstr "" #: src/language/stats/factor.c:1519 msgid "Factor analysis on a single variable is not useful." msgstr "" #: src/language/stats/factor.c:1523 msgid "Factor analysis without variables is not possible." msgstr "" #: src/language/stats/factor.c:1634 msgid "Component Number" msgstr "" #: src/language/stats/factor.c:1634 msgid "Factor Number" msgstr "" #: src/language/stats/factor.c:1648 src/language/stats/factor.c:1651 msgid "Communalities" msgstr "" #: src/language/stats/factor.c:1653 msgid "Initial" msgstr "" #: src/language/stats/factor.c:1655 msgid "Extraction" msgstr "" #: src/language/stats/factor.c:1697 src/language/stats/factor.c:1777 #: src/language/stats/factor.c:1839 msgid "Component" msgstr "" #: src/language/stats/factor.c:1697 src/language/stats/factor.c:1777 #: src/language/stats/factor.c:1839 msgid "Factor" msgstr "" #: src/language/stats/factor.c:1752 msgid "Total Variance Explained" msgstr "" #: src/language/stats/factor.c:1758 #, no-c-format msgid "% of Variance" msgstr "" #: src/language/stats/factor.c:1760 #, no-c-format msgid "Cumulative %" msgstr "" #: src/language/stats/factor.c:1763 msgid "Phase" msgstr "" #: src/language/stats/factor.c:1765 msgid "Initial Eigenvalues" msgstr "" #: src/language/stats/factor.c:1769 msgid "Extraction Sums of Squared Loadings" msgstr "" #: src/language/stats/factor.c:1773 msgid "Rotation Sums of Squared Loadings" msgstr "" #: src/language/stats/factor.c:1835 msgid "Factor Correlation Matrix" msgstr "" #: src/language/stats/factor.c:1842 msgid "Factor 2" msgstr "" #: src/language/stats/factor.c:1874 msgid "Anti-Image Matrices" msgstr "" #: src/language/stats/factor.c:1879 msgid "Anti-image Covariance" msgstr "" #: src/language/stats/factor.c:1880 msgid "Anti-image Correlation" msgstr "" #: src/language/stats/factor.c:1901 msgid "Correlation Matrix" msgstr "" #: src/language/stats/factor.c:1910 src/language/stats/t-test-paired.c:195 msgid "Correlation" msgstr "" #: src/language/stats/factor.c:1947 msgid "Determinant" msgstr "" #: src/language/stats/factor.c:1958 msgid "Covariance Matrix" msgstr "" #: src/language/stats/factor.c:1990 msgid "" "The dataset contains no complete observations. No analysis will be performed." msgstr "" #: src/language/stats/factor.c:2014 msgid "The dataset has no complete covariance or correlation matrix." msgstr "" #: src/language/stats/factor.c:2071 msgid "Analysis N" msgstr "" #: src/language/stats/factor.c:2099 msgid "KMO and Bartlett's Test" msgstr "" #: src/language/stats/factor.c:2103 msgid "Kaiser-Meyer-Olkin Measure of Sampling Adequacy" msgstr "" #: src/language/stats/factor.c:2105 msgid "Bartlett's Test of Sphericity" msgstr "" #: src/language/stats/factor.c:2106 msgid "Approx. Chi-Square" msgstr "" #: src/language/stats/factor.c:2154 #, c-format msgid "" "The %s criteria result in zero factors extracted. Therefore no analysis will " "be performed." msgstr "" #: src/language/stats/factor.c:2161 #, c-format msgid "" "The %s criteria result in more factors than variables, which is not " "meaningful. No analysis will be performed." msgstr "" #: src/language/stats/factor.c:2254 msgid "Component Matrix" msgstr "" #: src/language/stats/factor.c:2254 msgid "Factor Matrix" msgstr "" #: src/language/stats/factor.c:2259 msgid "Pattern Matrix" msgstr "" #: src/language/stats/factor.c:2268 msgid "Structure Matrix" msgstr "" #: src/language/stats/factor.c:2270 msgid "Rotated Component Matrix" msgstr "" #: src/language/stats/factor.c:2271 msgid "Rotated Factor Matrix" msgstr "" #: src/language/stats/flip.c:100 #, c-format msgid "%s ignores %s. Temporary transformations will be made permanent." msgstr "" #: src/language/stats/flip.c:153 #, c-format msgid "Could not create temporary file for %s." msgstr "" #: src/language/stats/flip.c:341 #, c-format msgid "Error rewinding %s file: %s." msgstr "" #: src/language/stats/flip.c:348 #, c-format msgid "Error creating %s source file." msgstr "" #: src/language/stats/flip.c:361 #, c-format msgid "Error reading %s file: %s." msgstr "" #: src/language/stats/flip.c:363 #, c-format msgid "Unexpected end of file reading %s file." msgstr "" #: src/language/stats/flip.c:379 #, c-format msgid "Error seeking %s source file: %s." msgstr "" #: src/language/stats/flip.c:387 #, c-format msgid "Error writing %s source file: %s." msgstr "" #: src/language/stats/flip.c:402 #, c-format msgid "Error rewinding %s source file: %s." msgstr "" #: src/language/stats/flip.c:433 #, c-format msgid "Error reading %s temporary file: %s." msgstr "" #: src/language/stats/flip.c:436 #, c-format msgid "Unexpected end of file reading %s temporary file." msgstr "" #: src/language/stats/frequencies.c:144 #: src/ui/gui/psppire-dialog-action-frequencies.c:49 msgid "Mode" msgstr "" #: src/language/stats/frequencies.c:303 src/language/stats/logistic.c:1381 #: src/output/charts/plot-hist-cairo.c:112 msgid "Frequency" msgstr "" #: src/language/stats/frequencies.c:305 msgid "Valid Percent" msgstr "" #: src/language/stats/frequencies.c:306 src/language/stats/graph.c:208 msgid "Cumulative Percent" msgstr "" #: src/language/stats/frequencies.c:905 msgid "Histogram frequency must be greater than zero." msgstr "" #: src/language/stats/frequencies.c:923 msgid "Histogram percentage must be greater than zero." msgstr "" #: src/language/stats/frequencies.c:1139 #, c-format msgid "" "%s for histogram must be greater than or equal to %s, but %s was specified " "as %.15g and %s as %.15g. %s and %s will be ignored." msgstr "" #: src/language/stats/frequencies.c:1184 #, c-format msgid "" "%s for pie chart must be greater than or equal to %s, but %s was specified " "as %.15g and %s as %.15g. %s and %s will be ignored." msgstr "" #: src/language/stats/frequencies.c:1474 #, c-format msgid "Omitting pie chart for %s, which has only %d unique values." msgstr "" #: src/language/stats/frequencies.c:1477 #, c-format msgid "Omitting pie chart for %s, which has over 50 unique values." msgstr "" #: src/language/stats/frequencies.c:1494 src/language/stats/graph.c:205 #: src/language/stats/quick-cluster.c:747 #: src/ui/gui/psppire-dialog-action-crosstabs.c:90 #: src/language/stats/crosstabs.q:789 src/language/stats/crosstabs.q:1262 msgid "Count" msgstr "" #: src/language/stats/friedman.c:220 src/language/stats/kruskal-wallis.c:247 #: src/language/stats/mann-whitney.c:182 src/language/stats/wilcoxon.c:240 msgid "Ranks" msgstr "" #: src/language/stats/friedman.c:222 src/language/stats/friedman.c:223 #: src/language/stats/kruskal-wallis.c:251 #: src/language/stats/mann-whitney.c:186 src/language/stats/wilcoxon.c:245 msgid "Mean Rank" msgstr "" #: src/language/stats/friedman.c:253 msgid "Kendall's W" msgstr "" #: src/language/stats/friedman.c:256 src/language/stats/kruskal-wallis.c:298 #: src/language/stats/median.c:353 msgid "Chi-Square" msgstr "" #: src/language/stats/glm.c:169 msgid "Multivariate analysis is not yet implemented" msgstr "" #: src/language/stats/glm.c:274 msgid "Only types 1, 2 & 3 sums of squares are currently implemented" msgstr "" #: src/language/stats/glm.c:727 msgid "Tests of Between-Subjects Effects" msgstr "" #: src/language/stats/glm.c:730 msgid "Type I Sum Of Squares" msgstr "" #: src/language/stats/glm.c:731 msgid "Type II Sum Of Squares" msgstr "" #: src/language/stats/glm.c:732 msgid "Type III Sum Of Squares" msgstr "" #: src/language/stats/glm.c:734 src/language/stats/oneway.c:976 #: src/language/stats/regression.c:1026 msgid "Mean Square" msgstr "" #: src/language/stats/glm.c:735 src/language/stats/oneway.c:977 #: src/language/stats/regression.c:1027 src/language/stats/t-test-indep.c:262 msgid "F" msgstr "" #: src/language/stats/glm.c:740 msgid "Corrected Model" msgstr "" #: src/language/stats/glm.c:740 msgid "Model" msgstr "" #: src/language/stats/glm.c:752 msgid "Intercept" msgstr "" #: src/language/stats/glm.c:802 src/output/pivot-table.c:763 #: src/output/spv/spv.c:867 msgid "Error" msgstr "" #: src/language/stats/glm.c:819 msgid "Corrected Total" msgstr "" #: src/language/stats/graph.c:206 msgid "Percentage" msgstr "" #: src/language/stats/graph.c:207 msgid "Cumulative Count" msgstr "" #: src/language/stats/graph.c:296 #, c-format msgid "%s vs. %s by %s" msgstr "" #: src/language/stats/graph.c:303 #, c-format msgid "%s vs. %s" msgstr "" #: src/language/stats/graph.c:322 msgid "" "Maximum number of scatterplot categories reached. Your BY variable has too " "many distinct values. The coloring of the plot will not be correct." msgstr "" #: src/language/stats/graph.c:551 src/language/stats/rank.c:636 #, c-format msgid "%s of %s" msgstr "" #: src/language/stats/graph.c:698 src/language/stats/graph.c:729 #: src/language/stats/graph.c:777 msgid "Only one chart type is allowed." msgstr "" #: src/language/stats/graph.c:721 src/language/stats/graph.c:820 #: src/language/stats/graph.c:834 msgid "Only one variable is allowed." msgstr "" #: src/language/stats/graph.c:843 msgid "Variable expected" msgstr "" #: src/language/stats/graph.c:883 msgid "FOOTNOTE is not implemented yet for GRAPH" msgstr "" #: src/language/stats/ks-one-sample.c:274 src/ui/gui/ks-one-sample.ui:24 msgid "One-Sample Kolmogorov-Smirnov Test" msgstr "" #: src/language/stats/ks-one-sample.c:284 msgid "Uniform Parameters" msgstr "" #: src/language/stats/ks-one-sample.c:289 msgid "Normal Parameters" msgstr "" #: src/language/stats/ks-one-sample.c:294 msgid "Poisson Parameters" msgstr "" #: src/language/stats/ks-one-sample.c:295 #: src/ui/gui/psppire-dialog-action-crosstabs.c:76 #: src/language/stats/crosstabs.q:1421 msgid "Lambda" msgstr "" #: src/language/stats/ks-one-sample.c:300 msgid "Exponential Parameters" msgstr "" #: src/language/stats/ks-one-sample.c:308 msgid "Most Extreme Differences" msgstr "" #: src/language/stats/ks-one-sample.c:309 msgid "Absolute" msgstr "" #: src/language/stats/ks-one-sample.c:309 src/language/stats/roc.c:1037 msgid "Positive" msgstr "" #: src/language/stats/ks-one-sample.c:309 src/language/stats/roc.c:1037 msgid "Negative" msgstr "" #: src/language/stats/ks-one-sample.c:312 msgid "Kolmogorov-Smirnov Z" msgstr "" #: src/language/stats/ks-one-sample.c:313 #: src/language/stats/jonckheere-terpstra.c:374 #: src/language/stats/mann-whitney.c:251 src/language/stats/runs.c:328 #: src/language/stats/wilcoxon.c:284 msgid "Asymp. Sig. (2-tailed)" msgstr "" #: src/language/stats/logistic.c:327 msgid "All predicted values are either 1 or 0" msgstr "" #: src/language/stats/logistic.c:525 msgid "Dependent variable's values are not dichotomous." msgstr "" #: src/language/stats/logistic.c:614 #, c-format msgid "" "Category %s does not have at least two distinct values. Logistic regression " "will not be run." msgstr "" #: src/language/stats/logistic.c:674 #, c-format msgid "" "Estimation terminated at iteration number %d because parameter estimates " "changed by less than %g" msgstr "" #: src/language/stats/logistic.c:686 #, c-format msgid "" "Estimation terminated at iteration number %d because Log Likelihood " "decreased by less than %g%%" msgstr "" #: src/language/stats/logistic.c:701 #, c-format msgid "" "Estimation terminated at iteration number %d because maximum iterations has " "been reached" msgstr "" #: src/language/stats/logistic.c:994 msgid "Cut point value must be in the range [0,1]" msgstr "" #: src/language/stats/logistic.c:1139 msgid "Dependent Variable Encoding" msgstr "" #: src/language/stats/logistic.c:1141 msgid "Mapping" msgstr "" #: src/language/stats/logistic.c:1142 msgid "Internal Value" msgstr "" #: src/language/stats/logistic.c:1145 msgid "Original Value" msgstr "" #: src/language/stats/logistic.c:1167 msgid "Variables in the Equation" msgstr "" #: src/language/stats/logistic.c:1171 src/language/stats/regression.c:902 msgid "B" msgstr "" #: src/language/stats/logistic.c:1172 msgid "S.E." msgstr "" #: src/language/stats/logistic.c:1173 msgid "Wald" msgstr "" #: src/language/stats/logistic.c:1176 msgid "Exp(B)" msgstr "" #: src/language/stats/logistic.c:1181 #, c-format msgid "%d%% CI for Exp(B)" msgstr "" #: src/language/stats/logistic.c:1183 src/language/stats/t-test-indep.c:274 #: src/language/stats/t-test-one-sample.c:83 #: src/language/stats/t-test-paired.c:249 src/language/stats/crosstabs.q:1369 msgid "Lower" msgstr "" #: src/language/stats/logistic.c:1183 src/language/stats/t-test-indep.c:275 #: src/language/stats/t-test-one-sample.c:84 #: src/language/stats/t-test-paired.c:250 src/language/stats/crosstabs.q:1370 msgid "Upper" msgstr "" #: src/language/stats/logistic.c:1189 src/language/stats/logistic.c:1470 msgid "Step 1" msgstr "" #: src/language/stats/logistic.c:1263 msgid "Constant" msgstr "" #: src/language/stats/logistic.c:1298 msgid "Model Summary" msgstr "" #: src/language/stats/logistic.c:1301 msgid "-2 Log likelihood" msgstr "" #: src/language/stats/logistic.c:1302 msgid "Cox & Snell R Square" msgstr "" #: src/language/stats/logistic.c:1303 msgid "Nagelkerke R Square" msgstr "" #: src/language/stats/logistic.c:1306 src/language/stats/logistic.c:1470 msgid "Step" msgstr "" #: src/language/stats/logistic.c:1335 msgid "Unweighted Cases" msgstr "" #: src/language/stats/logistic.c:1336 msgid "Included in Analysis" msgstr "" #: src/language/stats/logistic.c:1336 msgid "Missing Cases" msgstr "" #: src/language/stats/logistic.c:1365 msgid "Categorical Variables' Codings" msgstr "" #: src/language/stats/logistic.c:1380 msgid "Codings" msgstr "" #: src/language/stats/logistic.c:1383 msgid "Parameter coding" msgstr "" #: src/language/stats/logistic.c:1462 msgid "Classification Table" msgstr "" #: src/language/stats/logistic.c:1466 msgid "Predicted" msgstr "" #: src/language/stats/logistic.c:1466 msgid "Percentage Correct" msgstr "" #: src/language/stats/logistic.c:1468 msgid "Observed" msgstr "" #: src/language/stats/logistic.c:1468 msgid "Overall Percentage" msgstr "" #: src/language/stats/jonckheere-terpstra.c:357 msgid "Jonckheere-Terpstra Test" msgstr "" #: src/language/stats/jonckheere-terpstra.c:364 #, c-format msgid "Number of levels in %s" msgstr "" #: src/language/stats/jonckheere-terpstra.c:370 msgid "Observed J-T Statistic" msgstr "" #: src/language/stats/jonckheere-terpstra.c:371 msgid "Mean J-T Statistic" msgstr "" #: src/language/stats/jonckheere-terpstra.c:372 msgid "Std. Deviation of J-T Statistic" msgstr "" #: src/language/stats/jonckheere-terpstra.c:373 msgid "Std. J-T Statistic" msgstr "" #: src/language/stats/mann-whitney.c:187 src/language/stats/wilcoxon.c:246 msgid "Sum of Ranks" msgstr "" #: src/language/stats/mann-whitney.c:248 msgid "Mann-Whitney U" msgstr "" #: src/language/stats/mann-whitney.c:249 msgid "Wilcoxon W" msgstr "" #: src/language/stats/mann-whitney.c:250 src/language/stats/runs.c:327 #: src/language/stats/wilcoxon.c:283 msgid "Z" msgstr "" #: src/language/stats/means.c:702 msgid "Included" msgstr "" #: src/language/stats/means.c:704 src/language/stats/reliability.c:548 msgid "Excluded" msgstr "" #: src/language/stats/means.c:753 msgid "Report" msgstr "" #: src/language/stats/means.c:838 #, c-format msgid "" "The table \"%s\" has no non-empty control variables. No result for this " "table will be displayed." msgstr "" #: src/language/stats/means-calc.c:443 msgid "Group Median" msgstr "" #: src/language/stats/means-calc.c:455 msgid "First" msgstr "" #: src/language/stats/means-calc.c:456 msgid "Last" msgstr "" #: src/language/stats/means-calc.c:458 msgid "Percent N" msgstr "" #: src/language/stats/means-calc.c:459 msgid "Percent Sum" msgstr "" #: src/language/stats/means-calc.c:461 msgid "Harmonic Mean" msgstr "" #: src/language/stats/means-calc.c:462 msgid "Geom. Mean" msgstr "" #: src/language/stats/mcnemar.c:144 msgid "The McNemar test is appropriate only for dichotomous variables" msgstr "" #: src/language/stats/mcnemar.c:226 src/language/stats/sign.c:105 msgid "Point Probability" msgstr "" #: src/language/stats/mcnemar.c:229 src/language/stats/sign.c:78 #: src/language/stats/sign.c:108 src/language/stats/t-test-paired.c:199 #: src/language/stats/t-test-paired.c:257 src/language/stats/wilcoxon.c:253 #: src/language/stats/wilcoxon.c:292 msgid "Pairs" msgstr "" #: src/language/stats/median.c:316 msgid "> Median" msgstr "" #: src/language/stats/median.c:316 msgid "≤ Median" msgstr "" #: src/language/stats/npar.c:536 #, c-format msgid "%s subcommand not currently implemented." msgstr "" #: src/language/stats/npar.c:691 #, c-format msgid "Expecting %s, %s, %s or a number." msgstr "" #: src/language/stats/npar.c:845 #, c-format msgid "" "The specified value of HI (%d) is lower than the specified value of LO (%d)" msgstr "" #: src/language/stats/npar.c:897 #, c-format msgid "" "%d expected values were given, but the specified range (%d-%d) requires " "exactly %d values." msgstr "" #: src/language/stats/npar.c:1118 src/language/stats/t-test-parser.c:173 #, c-format msgid "" "PAIRED was specified but the number of variables preceding WITH (%zu) did " "not match the number following (%zu)." msgstr "" #: src/language/stats/oneway.c:361 msgid "LSD" msgstr "" #: src/language/stats/oneway.c:362 src/ui/gui/oneway.ui:338 msgid "Tukey HSD" msgstr "" #: src/language/stats/oneway.c:363 src/ui/gui/oneway.ui:253 msgid "Bonferroni" msgstr "" #: src/language/stats/oneway.c:364 src/ui/gui/oneway.ui:304 msgid "Scheffé" msgstr "" #: src/language/stats/oneway.c:365 msgid "Games-Howell" msgstr "" #: src/language/stats/oneway.c:366 src/ui/gui/oneway.ui:321 msgid "Šidák" msgstr "" #: src/language/stats/oneway.c:519 #, c-format msgid "The post hoc analysis method %s is not supported." msgstr "" #: src/language/stats/oneway.c:842 #, c-format msgid "" "Dependent variable %s has no non-missing values. No analysis for this " "variable will be done." msgstr "" #: src/language/stats/oneway.c:924 #, c-format msgid "" "In contrast list %zu, the number of coefficients (%zu) does not equal the " "number of groups (%d). This contrast list will be ignored." msgstr "" #: src/language/stats/oneway.c:936 #, c-format msgid "Coefficients for contrast %zu do not total zero" msgstr "" #: src/language/stats/oneway.c:971 msgid "ANOVA" msgstr "" #: src/language/stats/oneway.c:974 src/language/stats/regression.c:1024 msgid "Sum of Squares" msgstr "" #: src/language/stats/oneway.c:981 msgid "Between Groups" msgstr "" #: src/language/stats/oneway.c:981 msgid "Within Groups" msgstr "" #: src/language/stats/oneway.c:1075 src/language/stats/oneway.c:1257 msgid "Dependent Variable" msgstr "" #: src/language/stats/oneway.c:1148 msgid "Test of Homogeneity of Variances" msgstr "" #: src/language/stats/oneway.c:1151 msgid "Levene Statistic" msgstr "" #: src/language/stats/oneway.c:1152 msgid "df1" msgstr "" #: src/language/stats/oneway.c:1153 msgid "df2" msgstr "" #: src/language/stats/oneway.c:1192 msgid "Contrast Coefficients" msgstr "" #: src/language/stats/oneway.c:1199 src/language/stats/oneway.c:1246 msgid "Contrast" msgstr "" #: src/language/stats/oneway.c:1236 msgid "Contrast Tests" msgstr "" #: src/language/stats/oneway.c:1239 msgid "Value of Contrast" msgstr "" #: src/language/stats/oneway.c:1241 src/language/stats/regression.c:905 #: src/language/stats/t-test-indep.c:266 #: src/language/stats/t-test-one-sample.c:74 #: src/language/stats/t-test-paired.c:252 msgid "t" msgstr "" #: src/language/stats/oneway.c:1252 msgid "Assumption" msgstr "" #: src/language/stats/oneway.c:1253 msgid "Assume equal variances" msgstr "" #: src/language/stats/oneway.c:1254 msgid "Does not assume equal variances" msgstr "" #: src/language/stats/oneway.c:1367 #, c-format msgid "Multiple Comparisons (%s)" msgstr "" #: src/language/stats/oneway.c:1374 msgid "Mean Difference (I - J)" msgstr "" #: src/language/stats/oneway.c:1379 #, c-format msgid "%g%% Confidence Interval" msgstr "" #: src/language/stats/oneway.c:1386 src/language/stats/oneway.c:1390 msgid "(J) Family" msgstr "" #: src/language/stats/oneway.c:1406 msgid "Test" msgstr "" #: src/language/stats/quick-cluster.c:576 msgid "Initial Cluster Centers" msgstr "" #: src/language/stats/quick-cluster.c:577 msgid "Final Cluster Centers" msgstr "" #: src/language/stats/quick-cluster.c:580 #: src/language/stats/quick-cluster.c:660 #: src/language/stats/quick-cluster.c:661 #: src/language/stats/quick-cluster.c:753 msgid "Cluster" msgstr "" #: src/language/stats/quick-cluster.c:658 msgid "Cluster Membership" msgstr "" #: src/language/stats/quick-cluster.c:744 msgid "Number of Cases in each Cluster" msgstr "" #: src/language/stats/quick-cluster.c:750 msgid "Clusters" msgstr "" #: src/language/stats/quick-cluster.c:867 #: src/language/stats/quick-cluster.c:893 #, c-format msgid "A variable called `%s' already exists." msgstr "" #: src/language/stats/quick-cluster.c:908 #, c-format msgid "Expecting %s or %s." msgstr "" #: src/language/stats/quick-cluster.c:928 msgid "The number of clusters must be positive" msgstr "" #: src/language/stats/quick-cluster.c:944 msgid "The convergence criterion must be positive" msgstr "" #: src/language/stats/quick-cluster.c:960 msgid "The number of iterations must be positive" msgstr "" #: src/language/stats/rank.c:205 #, c-format msgid "" "Cannot generate variable name for ranking %s with %s. All candidates in use." msgstr "" #: src/language/stats/rank.c:321 #, c-format msgid "Too many variables in %s clause." msgstr "" #: src/language/stats/rank.c:323 #, c-format msgid "Variable %s already exists." msgstr "" #: src/language/stats/rank.c:325 src/language/expressions/evaluate.c:164 #, c-format msgid "Duplicate variable name %s." msgstr "" #: src/language/stats/rank.c:631 #, c-format msgid "%s of %s by %s" msgstr "" #: src/language/stats/rank.c:825 msgid "Variables Created by RANK" msgstr "" #: src/language/stats/rank.c:828 src/language/stats/rank.c:829 msgid "New Variable" msgstr "" #: src/language/stats/rank.c:829 msgid "Function" msgstr "" #: src/language/stats/rank.c:830 msgid "Fraction" msgstr "" #: src/language/stats/rank.c:830 msgid "Grouping Variables" msgstr "" #: src/language/stats/rank.c:833 src/language/stats/rank.c:834 msgid "Existing Variable" msgstr "" #: src/language/stats/reliability.c:164 msgid "Reliability on a single variable is not useful." msgstr "" #: src/language/stats/reliability.c:281 msgid "" "The STATISTICS subcommand is not yet implemented. No statistics will be " "produced." msgstr "" #: src/language/stats/reliability.c:300 msgid "The split point must be less than the number of variables" msgstr "" #: src/language/stats/reliability.c:525 #, c-format msgid "Scale: %s" msgstr "" #: src/language/stats/reliability.c:582 msgid "Item-Total Statistics" msgstr "" #: src/language/stats/reliability.c:585 msgid "Scale Mean if Item Deleted" msgstr "" #: src/language/stats/reliability.c:586 msgid "Scale Variance if Item Deleted" msgstr "" #: src/language/stats/reliability.c:587 msgid "Corrected Item-Total Correlation" msgstr "" #: src/language/stats/reliability.c:588 msgid "Cronbach's Alpha if Item Deleted" msgstr "" #: src/language/stats/reliability.c:627 msgid "Reliability Statistics" msgstr "" #: src/language/stats/reliability.c:634 src/language/stats/reliability.c:646 msgid "Cronbach's Alpha" msgstr "" #: src/language/stats/reliability.c:635 src/language/stats/reliability.c:649 #: src/language/stats/reliability.c:652 msgid "N of Items" msgstr "" #: src/language/stats/reliability.c:647 msgid "Part 1" msgstr "" #: src/language/stats/reliability.c:650 msgid "Part 2" msgstr "" #: src/language/stats/reliability.c:654 msgid "Total N of Items" msgstr "" #: src/language/stats/reliability.c:656 msgid "Correlation Between Forms" msgstr "" #: src/language/stats/reliability.c:659 msgid "Spearman-Brown Coefficient" msgstr "" #: src/language/stats/reliability.c:660 msgid "Equal Length" msgstr "" #: src/language/stats/reliability.c:661 msgid "Unequal Length" msgstr "" #: src/language/stats/reliability.c:663 msgid "Guttman Split-Half Coefficient" msgstr "" #: src/language/stats/roc.c:966 msgid "Area Under the Curve" msgstr "" #: src/language/stats/roc.c:970 msgid "Area" msgstr "" #: src/language/stats/roc.c:976 msgid "Asymptotic Sig." msgstr "" #: src/language/stats/roc.c:979 #, c-format msgid "Asymp. %g%% Confidence Interval" msgstr "" #: src/language/stats/roc.c:987 msgid "Variable under test" msgstr "" #: src/language/stats/roc.c:1026 msgid "Case Summary" msgstr "" #: src/language/stats/roc.c:1030 msgid "Unweighted" msgstr "" #: src/language/stats/roc.c:1031 msgid "Weighted" msgstr "" #: src/language/stats/roc.c:1064 msgid "Coordinates of the Curve" msgstr "" #: src/language/stats/roc.c:1068 msgid "Positive if greater than or equal to" msgstr "" #: src/language/stats/roc.c:1069 src/output/charts/roc-chart-cairo.c:38 msgid "Sensitivity" msgstr "" #: src/language/stats/roc.c:1069 src/output/charts/roc-chart-cairo.c:37 msgid "1 - Specificity" msgstr "" #: src/language/stats/roc.c:1072 msgid "Coordinates" msgstr "" #: src/language/stats/roc.c:1076 msgid "Test variable" msgstr "" #: src/language/stats/regression.c:224 src/language/stats/regression.c:229 #, c-format msgid "VARIABLES may not appear after %s" msgstr "" #: src/language/stats/regression.c:412 msgid "" "REGRESSION with SAVE ignores TEMPORARY. Temporary transformations will be " "made permanent." msgstr "" #: src/language/stats/regression.c:416 msgid "REGRESSION with SAVE ignores FILTER. All cases will be processed." msgstr "" #: src/language/stats/regression.c:569 msgid "" "The dependent variable is equal to the independent variable. The least " "squares line is therefore Y=X. Standard errors and related statistics may be " "meaningless." msgstr "" #: src/language/stats/regression.c:776 msgid "No valid data found. This command was skipped." msgstr "" #: src/language/stats/regression.c:863 #, c-format msgid "Model Summary (%s)" msgstr "" #: src/language/stats/regression.c:868 #: src/ui/gui/psppire-dialog-action-regression.c:42 msgid "R" msgstr "" #: src/language/stats/regression.c:868 msgid "R Square" msgstr "" #: src/language/stats/regression.c:868 msgid "Adjusted R Square" msgstr "" #: src/language/stats/regression.c:869 msgid "Std. Error of the Estimate" msgstr "" #: src/language/stats/regression.c:895 #, c-format msgid "Coefficients (%s)" msgstr "" #: src/language/stats/regression.c:901 msgid "Unstandardized Coefficients" msgstr "" #: src/language/stats/regression.c:904 msgid "Standardized Coefficients" msgstr "" #: src/language/stats/regression.c:904 msgid "Beta" msgstr "" #: src/language/stats/regression.c:911 #, c-format msgid "%g%% Confidence Interval for B" msgstr "" #: src/language/stats/regression.c:919 msgid "Collinearity Statistics" msgstr "" #: src/language/stats/regression.c:920 msgid "Tolerance" msgstr "" #: src/language/stats/regression.c:920 msgid "VIF" msgstr "" #: src/language/stats/regression.c:933 msgid "(Constant)" msgstr "" #: src/language/stats/regression.c:1020 #, c-format msgid "ANOVA (%s)" msgstr "" #: src/language/stats/regression.c:1031 src/ui/gui/regression.ui:24 msgid "Regression" msgstr "" #: src/language/stats/regression.c:1075 #, c-format msgid "Coefficient Correlations (%s)" msgstr "" #: src/language/stats/regression.c:1082 msgid "Models" msgstr "" #: src/language/stats/regression.c:1090 msgid "Covariances" msgstr "" #: src/language/stats/runs.c:169 #, c-format msgid "" "Multiple modes exist for variable `%s'. Using %.*g as the threshold value." msgstr "" #: src/language/stats/runs.c:314 src/ui/gui/runs.ui:24 msgid "Runs Test" msgstr "" #: src/language/stats/runs.c:319 msgid "Test Value" msgstr "" #: src/language/stats/runs.c:320 msgid "Test Value (mode)" msgstr "" #: src/language/stats/runs.c:321 msgid "Test Value (mean)" msgstr "" #: src/language/stats/runs.c:322 msgid "Test Value (median)" msgstr "" #: src/language/stats/runs.c:323 msgid "Cases < Test Value" msgstr "" #: src/language/stats/runs.c:324 msgid "Cases ≥ Test Value" msgstr "" #: src/language/stats/runs.c:325 msgid "Total Cases" msgstr "" #: src/language/stats/runs.c:326 msgid "Number of Runs" msgstr "" #: src/language/stats/sign.c:72 msgid "Differences" msgstr "" #: src/language/stats/sign.c:73 msgid "Negative Differences" msgstr "" #: src/language/stats/sign.c:74 msgid "Positive Differences" msgstr "" #: src/language/stats/sign.c:75 src/language/stats/wilcoxon.c:250 msgid "Ties" msgstr "" #: src/language/stats/sort-cases.c:63 msgid "Buffer limit must be at least 2." msgstr "" #: src/language/stats/sort-criteria.c:89 #, c-format msgid "Variable %s specified twice in sort criteria." msgstr "" #: src/language/stats/t-test-indep.c:190 msgid "Group Statistics" msgstr "" #: src/language/stats/t-test-indep.c:200 msgid "Group" msgstr "" #: src/language/stats/t-test-indep.c:256 msgid "Independent Samples Test" msgstr "" #: src/language/stats/t-test-indep.c:261 msgid "Levene's Test for Equality of Variances" msgstr "" #: src/language/stats/t-test-indep.c:265 msgid "T-Test for Equality of Means" msgstr "" #: src/language/stats/t-test-indep.c:269 #: src/language/stats/t-test-one-sample.c:77 msgid "Mean Difference" msgstr "" #: src/language/stats/t-test-indep.c:270 msgid "Std. Error Difference" msgstr "" #: src/language/stats/t-test-indep.c:273 #, no-c-format msgid "95% Confidence Interval of the Difference" msgstr "" #: src/language/stats/t-test-indep.c:277 msgid "Assumptions" msgstr "" #: src/language/stats/t-test-indep.c:278 msgid "Equal variances assumed" msgstr "" #: src/language/stats/t-test-indep.c:279 msgid "Equal variances not assumed" msgstr "" #: src/language/stats/t-test-one-sample.c:64 msgid "One-Sample Test" msgstr "" #: src/language/stats/t-test-one-sample.c:71 #, c-format msgid "Test Value = %.*g" msgstr "" #: src/language/stats/t-test-one-sample.c:80 #: src/language/stats/t-test-paired.c:246 #, c-format msgid "%g%% Confidence Interval of the Difference" msgstr "" #: src/language/stats/t-test-one-sample.c:122 msgid "One-Sample Statistics" msgstr "" #: src/language/stats/t-test-paired.c:147 msgid "Paired Sample Statistics" msgstr "" #: src/language/stats/t-test-paired.c:163 #: src/language/stats/t-test-paired.c:205 #: src/language/stats/t-test-paired.c:263 #, c-format msgid "Pair %zu" msgstr "" #: src/language/stats/t-test-paired.c:190 msgid "Paired Samples Correlations" msgstr "" #: src/language/stats/t-test-paired.c:208 #, c-format msgid "%s & %s" msgstr "" #: src/language/stats/t-test-paired.c:234 msgid "Paired Samples Test" msgstr "" #: src/language/stats/t-test-paired.c:240 msgid "Paired Differences" msgstr "" #: src/language/stats/t-test-paired.c:266 #, c-format msgid "%s - %s" msgstr "" #: src/language/stats/t-test-parser.c:133 #, c-format msgid "When applying %s to a string variable, two values must be specified." msgstr "" #: src/language/stats/t-test-parser.c:145 #: src/language/stats/t-test-parser.c:241 #, c-format msgid "%s subcommand may not be used with %s." msgstr "" #: src/language/stats/t-test-parser.c:305 msgid "Exactly one of TESTVAL, GROUPS and PAIRS subcommands must be specified." msgstr "" #: src/language/stats/wilcoxon.c:248 msgid "Sign" msgstr "" #: src/language/stats/wilcoxon.c:249 msgid "Negative Ranks" msgstr "" #: src/language/stats/wilcoxon.c:249 msgid "Positive Ranks" msgstr "" #: src/language/stats/wilcoxon.c:296 msgid "Too many pairs to calculate exact significance" msgstr "" #: src/language/data-io/combine-files.c:214 msgid "Cannot specify the active dataset since none has been defined." msgstr "" #: src/language/data-io/combine-files.c:220 msgid "" "This command may not be used after TEMPORARY when the active dataset is an " "input source. Temporary transformations will be made permanent." msgstr "" #: src/language/data-io/combine-files.c:255 msgid "Multiple IN subcommands for a single FILE or TABLE." msgstr "" #: src/language/data-io/combine-files.c:308 #, c-format msgid "File %s lacks BY variable %s." msgstr "" #: src/language/data-io/combine-files.c:311 #, c-format msgid "Active dataset lacks BY variable %s." msgstr "" #: src/language/data-io/combine-files.c:388 #: src/language/data-io/combine-files.c:393 #, c-format msgid "BY is required when %s is specified." msgstr "" #: src/language/data-io/combine-files.c:521 msgid "" "Combining files with incompatible encodings. String data may not be " "represented correctly." msgstr "" #: src/language/data-io/combine-files.c:564 #, c-format msgid "" "Variable %s in file %s has different type or width from the same variable in " "earlier file." msgstr "" #: src/language/data-io/combine-files.c:570 #, c-format msgid "In file %s, %s is numeric." msgstr "" #: src/language/data-io/combine-files.c:573 #, c-format msgid "In file %s, %s is a string variable with width %d." msgstr "" #: src/language/data-io/combine-files.c:578 #, c-format msgid "In an earlier file, %s was numeric." msgstr "" #: src/language/data-io/combine-files.c:581 #, c-format msgid "In an earlier file, %s was a string variable with width %d." msgstr "" #: src/language/data-io/combine-files.c:621 #, c-format msgid "" "Variable name %s specified on %s subcommand duplicates an existing variable " "name." msgstr "" #: src/language/data-io/combine-files.c:793 #, c-format msgid "Encountered %zu sets of duplicate cases in the master file." msgstr "" #: src/language/data-io/data-list.c:129 src/language/data-io/data-list.c:144 #, c-format msgid "The %s value must be non-negative." msgstr "" #: src/language/data-io/data-list.c:154 #, c-format msgid "The %s subcommand may only be used within %s." msgstr "" #: src/language/data-io/data-list.c:159 #, c-format msgid "The %s subcommand may only be specified once." msgstr "" #: src/language/data-io/data-list.c:197 msgid "Only one of FIXED, FREE, or LIST may be specified." msgstr "" #: src/language/data-io/data-list.c:260 msgid "Encoding should not be specified for inline data. It will be ignored." msgstr "" #: src/language/data-io/data-list.c:269 #, c-format msgid "The %s subcommand may be used only with %s." msgstr "" #: src/language/data-io/data-list.c:284 src/language/data-io/matrix-data.c:578 msgid "At least one variable must be specified." msgstr "" #: src/language/data-io/data-list.c:383 src/language/data-io/data-list.c:491 #: src/language/data-io/get-data.c:662 #, c-format msgid "%s is a duplicate variable name." msgstr "" #: src/language/data-io/data-list.c:390 #, c-format msgid "There is already a variable %s of a different type." msgstr "" #: src/language/data-io/data-list.c:397 #, c-format msgid "There is already a string variable %s of a different width." msgstr "" #: src/language/data-io/data-list.c:405 #, c-format msgid "Cannot place variable %s on record %d when RECORDS=%d is specified." msgstr "" #: src/language/data-io/data-parser.c:453 #: src/language/data-io/data-parser.c:462 msgid "Quoted string extends beyond end of line." msgstr "" #: src/language/data-io/data-parser.c:488 msgid "Missing delimiter following quoted string." msgstr "" #: src/language/data-io/data-parser.c:506 #, c-format msgid "Data for variable %s is not valid as format %s: %s" msgstr "" #: src/language/data-io/data-parser.c:536 #, c-format msgid "Partial case of %d of %d records discarded." msgstr "" #: src/language/data-io/data-parser.c:592 #, c-format msgid "Partial case discarded. The first variable missing was %s." msgstr "" #: src/language/data-io/data-parser.c:634 #, c-format msgid "" "Missing value(s) for all variables from %s onward. These will be filled " "with the system-missing value or blanks, as appropriate." msgstr "" #: src/language/data-io/data-parser.c:655 msgid "Record ends in data not part of any field." msgstr "" #: src/language/data-io/data-parser.c:670 #, c-format msgid "Reading %d record from %s." msgid_plural "Reading %d records from %s." msgstr[0] "" msgstr[1] "" #: src/language/data-io/data-parser.c:680 src/language/data-io/print.c:435 msgid "Record" msgstr "" #: src/language/data-io/data-parser.c:680 src/language/data-io/print.c:435 #: src/ui/gui/psppire-var-sheet-header.c:76 msgid "Columns" msgstr "" #: src/language/data-io/data-parser.c:680 #: src/language/data-io/data-parser.c:725 src/language/data-io/print.c:435 msgid "Format" msgstr "" #: src/language/data-io/data-parser.c:720 #, c-format msgid "Reading free-form data from %s." msgstr "" #. TRANSLATORS: this fragment will be interpolated into #. messages in fh_lock() that identify types of files. #: src/language/data-io/data-reader.c:136 src/language/data-io/data-writer.c:79 msgid "data file" msgstr "" #: src/language/data-io/data-reader.c:160 #, c-format msgid "Could not open `%s' for reading as a data file: %s." msgstr "" #: src/language/data-io/data-reader.c:174 #, c-format msgid "Could not read `%s' as a text file with encoding `%s': %s." msgstr "" #: src/language/data-io/data-reader.c:233 #, c-format msgid "" "Missing %s while reading inline data. This probably indicates a missing or " "incorrectly formatted %s command. %s must appear by itself on a single line " "with exactly one space between words." msgstr "" #: src/language/data-io/data-reader.c:253 #: src/language/data-io/data-reader.c:387 #, c-format msgid "Error reading file %s: %s." msgstr "" #: src/language/data-io/data-reader.c:261 #, c-format msgid "Unexpected end of file in partial record reading %s." msgstr "" #: src/language/data-io/data-reader.c:321 #, c-format msgid "Corrupt block descriptor word at offset 0x%lx in %s." msgstr "" #: src/language/data-io/data-reader.c:322 #, c-format msgid "Corrupt record descriptor word at offset 0x%lx in %s." msgstr "" #: src/language/data-io/data-reader.c:335 #, c-format msgid "Corrupt record size at offset 0x%lx in %s." msgstr "" #: src/language/data-io/data-reader.c:493 msgid "Record exceeds remaining block length." msgstr "" #: src/language/data-io/data-reader.c:567 #, c-format msgid "Attempt to read beyond end-of-file on file %s." msgstr "" #: src/language/data-io/data-reader.c:570 #, c-format msgid "Attempt to read beyond %s." msgstr "" #: src/language/data-io/data-reader.c:733 msgid "" "This command is not valid here since the current input program does not " "access the inline file." msgstr "" #: src/language/data-io/data-writer.c:106 #, c-format msgid "An error occurred while opening `%s' for writing as a data file: %s." msgstr "" #: src/language/data-io/data-writer.c:224 #, c-format msgid "I/O error occurred writing data file `%s'." msgstr "" #: src/language/data-io/dataset.c:64 #, c-format msgid "There is no dataset named %s." msgstr "" #: src/language/data-io/dataset.c:250 msgid "Datasets" msgstr "" #: src/language/data-io/dataset.c:263 msgid "unnamed dataset" msgstr "" #: src/language/data-io/file-handle.c:61 #, c-format msgid "" "File handle %s is already defined. Use %s before redefining a file handle." msgstr "" #: src/language/data-io/file-handle.c:241 #, c-format msgid "%s must be specified with %s." msgstr "" #: src/language/data-io/file-handle.c:252 #, c-format msgid "" "The specified file mode requires LRECL. Assuming %zu-character records." msgstr "" #: src/language/data-io/file-handle.c:256 #, c-format msgid "" "Record length (%d) must be between 1 and %lu bytes. Assuming %zu-character " "records." msgstr "" #: src/language/data-io/file-handle.c:300 msgid "file" msgstr "" #: src/language/data-io/file-handle.c:302 msgid "inline file" msgstr "" #: src/language/data-io/file-handle.c:350 msgid "expecting a file name or handle name" msgstr "" #: src/language/data-io/file-handle.c:365 #, c-format msgid "Handle for %s not allowed here." msgstr "" #: src/language/data-io/get-data.c:108 src/output/measure.c:262 #, c-format msgid "error reading file `%s'" msgstr "" #: src/language/data-io/get-data.c:127 #, c-format msgid "Unsupported TYPE %s." msgstr "" #: src/language/data-io/get-data.c:278 msgid "The sheet index must be greater than or equal to 1" msgstr "" #: src/language/data-io/get-data.c:285 src/language/data-io/get-data.c:308 #: src/language/data-io/get-data.c:327 #, c-format msgid "%s must be followed by either \"%s\" or \"%s\"." msgstr "" #: src/language/data-io/get-data.c:357 #, c-format msgid "" "%s is allowed only with %s arrangement, but %s arrangement was stated or " "implied earlier in this command." msgstr "" #: src/language/data-io/get-data.c:441 src/language/data-io/get-data.c:479 #, c-format msgid "Value of %s must be 1 or greater." msgstr "" #: src/language/data-io/get-data.c:504 msgid "" "Ignoring obsolete IMPORTCASES subcommand. (N OF CASES or SAMPLE may be used " "to substitute.)" msgstr "" #: src/language/data-io/get-data.c:551 msgid "" "In compatible syntax mode, the QUALIFIER string must contain exactly one " "character." msgstr "" #: src/language/data-io/get-data.c:583 #, c-format msgid "" "The record number specified, %ld, is at or before the previous record, %d. " "Data fields must be listed in order of increasing record number." msgstr "" #: src/language/data-io/get-data.c:592 #, c-format msgid "" "The record number specified, %ld, exceeds the number of records per case " "specified on FIXCASE, %d." msgstr "" #: src/language/data-io/get.c:132 #, c-format msgid "%s: Data file dictionary has no variables." msgstr "" #: src/language/data-io/inpt-pgm.c:133 #, c-format msgid "Unexpected end-of-file within %s." msgstr "" #: src/language/data-io/inpt-pgm.c:146 #, c-format msgid "Input program must contain %s or %s." msgstr "" #: src/language/data-io/inpt-pgm.c:152 msgid "Input program did not create any variables." msgstr "" #: src/language/data-io/inpt-pgm.c:365 msgid "" "REREAD: Column numbers must be positive finite numbers. Column set to 1." msgstr "" #: src/language/data-io/list.c:100 msgid "Data List" msgstr "" #: src/language/data-io/list.c:221 #, c-format msgid "" "The first case (%ld) specified precedes the last case (%ld) specified. The " "values will be swapped." msgstr "" #: src/language/data-io/list.c:230 #, c-format msgid "" "The first case (%ld) to list is numbered less than 1. The value is being " "reset to 1." msgstr "" #: src/language/data-io/list.c:237 #, c-format msgid "" "The last case (%ld) to list is numbered less than 1. The value is being " "reset to 1." msgstr "" #: src/language/data-io/list.c:244 #, c-format msgid "The step value %ld is less than 1. The value is being reset to 1." msgstr "" #: src/language/data-io/placement-parser.c:96 #, c-format msgid "" "Number of variables specified (%zu) differs from number of variable formats " "(%zu)." msgstr "" #: src/language/data-io/placement-parser.c:106 msgid "" "SPSS-like or Fortran-like format specification expected after variable names." msgstr "" #: src/language/data-io/placement-parser.c:129 #, c-format msgid "The %d columns %d-%d can't be evenly divided into %zu fields." msgstr "" #: src/language/data-io/placement-parser.c:310 msgid "Column positions for fields must be positive." msgstr "" #: src/language/data-io/placement-parser.c:312 msgid "Column positions for fields must not be negative." msgstr "" #: src/language/data-io/placement-parser.c:372 msgid "The ending column for a field must be greater than the starting column." msgstr "" #: src/language/data-io/placement-parser.c:409 #, c-format msgid "" "The record number specified, %.0f, is at or before the previous record, %d. " "Data fields must be listed in order of increasing record number." msgstr "" #: src/language/data-io/print-space.c:127 #, c-format msgid "The expression on %s evaluated to the system-missing value." msgstr "" #: src/language/data-io/print-space.c:130 #, c-format msgid "The expression on %s evaluated to %g." msgstr "" #: src/language/data-io/print.c:189 src/language/data-io/trim.c:58 msgid "expecting a valid subcommand" msgstr "" #: src/language/data-io/print.c:219 #, c-format msgid "%s is required when binary formats are specified." msgstr "" #: src/language/data-io/print.c:302 #, c-format msgid "Output calls for %d records but %zu specified on RECORDS subcommand." msgstr "" #: src/language/data-io/print.c:432 msgid "Print Summary" msgstr "" #: src/language/data-io/print.c:462 msgid "N of Records" msgstr "" #: src/language/data-io/matrix-data.c:191 #, c-format msgid "" "There are %d variable declared but the data has at least %d matrix rows." msgstr "" #: src/language/data-io/matrix-data.c:292 msgid "" "The N subcommand was specified, but a N record was also found in the data. " "The N record will be ignored." msgstr "" #: src/language/data-io/matrix-data.c:488 src/language/utilities/set.q:186 #, c-format msgid "%s must not be negative." msgstr "" #: src/language/data-io/matrix-data.c:568 msgid "FORMAT = FULL and FORMAT = NODIAGONAL are mutually exclusive." msgstr "" #: src/language/data-io/matrix-reader.c:102 #: src/language/data-io/matrix-reader.c:118 #, c-format msgid "Matrix dataset lacks a variable called %s." msgstr "" #: src/language/data-io/matrix-reader.c:109 #: src/language/data-io/matrix-reader.c:125 #, c-format msgid "Matrix dataset variable %s should be of string type." msgstr "" #: src/language/data-io/save-translate.c:168 #: src/language/data-io/save-translate.c:183 #, c-format msgid "The %s string must contain exactly one character." msgstr "" #: src/language/data-io/save-translate.c:249 #, c-format msgid "Output file `%s' exists but %s was not specified." msgstr "" #: src/language/data-io/save.c:309 msgid "The OUTFILE or METADATA subcommand is required." msgstr "" #: src/language/data-io/trim.c:69 #, c-format msgid "" "Cannot rename %s as %s because there already exists a variable named %s. To " "rename variables with overlapping names, use a single RENAME subcommand such " "as `/RENAME (A=B)(B=C)(C=A)', or equivalently, `/RENAME (A B C=B C A)'." msgstr "" #: src/language/data-io/trim.c:227 #, c-format msgid "" "Number of variables on left side of `=' (%zu) does not match number of " "variables on right side (%zu), in parenthesized group %d of RENAME " "subcommand." msgstr "" #: src/language/data-io/trim.c:242 #, c-format msgid "Requested renaming duplicates variable name %s." msgstr "" #: src/language/data-io/trim.c:281 msgid "Cannot DROP all variables from dictionary." msgstr "" #: src/language/expressions/evaluate.c:151 msgid "expecting number or string" msgstr "" #: src/language/expressions/helpers.c:43 msgid "" "One of the arguments to a DATE function is not an integer. The result will " "be system-missing." msgstr "" #: src/language/expressions/helpers.c:71 msgid "" "The week argument to DATE.WKYR is not an integer. The result will be system-" "missing." msgstr "" #: src/language/expressions/helpers.c:77 msgid "" "The week argument to DATE.WKYR is outside the acceptable range of 1 to 53. " "The result will be system-missing." msgstr "" #: src/language/expressions/helpers.c:99 msgid "" "The day argument to DATE.YRDAY is not an integer. The result will be system-" "missing." msgstr "" #: src/language/expressions/helpers.c:105 msgid "" "The day argument to DATE.YRDAY is outside the acceptable range of 1 to 366. " "The result will be system-missing." msgstr "" #: src/language/expressions/helpers.c:127 msgid "" "The year argument to YRMODA is greater than 47516. The result will be " "system-missing." msgstr "" #: src/language/expressions/helpers.c:180 #, c-format msgid "" "Unrecognized date unit `%.*s'. Valid date units are `%s', `%s', `%s', `%s', " "`%s', `%s', `%s', and `%s'." msgstr "" #: src/language/expressions/helpers.c:333 #, c-format msgid "Invalid DATESUM method. Valid choices are `%s' and `%s'." msgstr "" #: src/language/expressions/parse.c:261 #, c-format msgid "" "Type mismatch: expression has %s type, but a numeric value is required here." msgstr "" #: src/language/expressions/parse.c:274 #, c-format msgid "" "Type mismatch: expression has %s type, but a string value is required here." msgstr "" #: src/language/expressions/parse.c:436 #, c-format msgid "Type mismatch while applying %s operator: cannot convert %s to %s." msgstr "" #: src/language/expressions/parse.c:650 msgid "" "Chaining relational operators (e.g. `a < b < c') will not produce the " "mathematically expected result. Use the AND logical operator to fix the " "problem (e.g. `a < b AND b < c'). If chaining is really intended, " "parentheses will disable this warning (e.g. `(a < b) < c'.)" msgstr "" #: src/language/expressions/parse.c:752 msgid "" "The exponentiation operator (`**') is left-associative, even though right-" "associative semantics are more useful. That is, `a**b**c' equals " "`(a**b)**c', not as `a**(b**c)'. To disable this warning, insert " "parentheses." msgstr "" #: src/language/expressions/parse.c:832 #, c-format msgid "Unknown system variable %s." msgstr "" #: src/language/expressions/parse.c:880 #, c-format msgid "Unknown identifier %s." msgstr "" #: src/language/expressions/parse.c:1102 #, c-format msgid "%s must have at least %d arguments in list." msgstr "" #: src/language/expressions/parse.c:1111 #, c-format msgid "%s must have an even number of arguments in list." msgstr "" #: src/language/expressions/parse.c:1114 #, c-format msgid "%s must have multiple of %d arguments in list." msgstr "" #: src/language/expressions/parse.c:1124 #, c-format msgid "%s function does not accept a minimum valid argument count." msgstr "" #: src/language/expressions/parse.c:1133 #, c-format msgid "%s requires at least %d valid arguments in list." msgstr "" #: src/language/expressions/parse.c:1139 #, c-format msgid "" "With %s, using minimum valid argument count of %d does not make sense when " "passing only %d arguments in list." msgstr "" #: src/language/expressions/parse.c:1193 #, c-format msgid "Type mismatch invoking %s as " msgstr "" #: src/language/expressions/parse.c:1198 msgid "Function invocation " msgstr "" #: src/language/expressions/parse.c:1200 msgid " does not match any known function. Candidates are:" msgstr "" #: src/language/expressions/parse.c:1230 #, c-format msgid "No function or vector named %s." msgstr "" #: src/language/expressions/parse.c:1292 #, c-format msgid "%s is a PSPP extension." msgstr "" #: src/language/expressions/parse.c:1295 #, c-format msgid "%s is not available in this version of PSPP." msgstr "" #: src/language/expressions/parse.c:1302 #, c-format msgid "%s may not appear after %s." msgstr "" #: src/libpspp/ext-array.c:66 msgid "failed to create temporary file" msgstr "" #: src/libpspp/ext-array.c:106 msgid "seeking in temporary file" msgstr "" #: src/libpspp/ext-array.c:125 msgid "reading temporary file" msgstr "" #: src/libpspp/ext-array.c:127 msgid "unexpected end of file reading temporary file" msgstr "" #: src/libpspp/ext-array.c:147 msgid "writing to temporary file" msgstr "" #: src/libpspp/i18n.c:1128 msgid "Arabic" msgstr "" #: src/libpspp/i18n.c:1130 msgid "Armenian" msgstr "" #: src/libpspp/i18n.c:1131 msgid "Baltic" msgstr "" #: src/libpspp/i18n.c:1133 msgid "Celtic" msgstr "" #: src/libpspp/i18n.c:1134 msgid "Central European" msgstr "" #: src/libpspp/i18n.c:1136 msgid "Chinese Simplified" msgstr "" #: src/libpspp/i18n.c:1138 msgid "Chinese Traditional" msgstr "" #: src/libpspp/i18n.c:1140 msgid "Croatian" msgstr "" #: src/libpspp/i18n.c:1141 msgid "Cyrillic" msgstr "" #: src/libpspp/i18n.c:1143 msgid "Cyrillic/Russian" msgstr "" #: src/libpspp/i18n.c:1144 msgid "Cyrillic/Ukrainian" msgstr "" #: src/libpspp/i18n.c:1146 msgid "Georgian" msgstr "" #: src/libpspp/i18n.c:1147 msgid "Greek" msgstr "" #: src/libpspp/i18n.c:1148 msgid "Gujarati" msgstr "" #: src/libpspp/i18n.c:1149 msgid "Gurmukhi" msgstr "" #: src/libpspp/i18n.c:1150 msgid "Hebrew" msgstr "" #: src/libpspp/i18n.c:1152 msgid "Hebrew Visual" msgstr "" #: src/libpspp/i18n.c:1153 msgid "Hindi" msgstr "" #: src/libpspp/i18n.c:1154 msgid "Icelandic" msgstr "" #: src/libpspp/i18n.c:1155 msgid "Japanese" msgstr "" #: src/libpspp/i18n.c:1157 msgid "Korean" msgstr "" #: src/libpspp/i18n.c:1159 msgid "Nordic" msgstr "" #: src/libpspp/i18n.c:1160 msgid "Romanian" msgstr "" #: src/libpspp/i18n.c:1162 msgid "South European" msgstr "" #: src/libpspp/i18n.c:1163 msgid "Thai" msgstr "" #: src/libpspp/i18n.c:1165 msgid "Turkish" msgstr "" #: src/libpspp/i18n.c:1167 msgid "Vietnamese" msgstr "" #: src/libpspp/i18n.c:1169 msgid "Western European" msgstr "" #: src/libpspp/message.c:89 #, c-format msgid "%s: %s" msgstr "" #: src/libpspp/message.c:113 msgid "error" msgstr "" #: src/libpspp/message.c:115 msgid "warning" msgstr "" #: src/libpspp/message.c:118 msgid "note" msgstr "" #: src/libpspp/message.c:327 #, c-format msgid "Notes (%d) exceed limit (%d). Suppressing further notes." msgstr "" #: src/libpspp/message.c:335 #, c-format msgid "Warnings (%d) exceed limit (%d). Syntax processing will be halted." msgstr "" #: src/libpspp/message.c:338 #, c-format msgid "Errors (%d) exceed limit (%d). Syntax processing will be halted." msgstr "" #: src/libpspp/zip-reader.c:202 #, c-format msgid "%s: corrupt archive at 0x%llx: expected %# but got %#" msgstr "" #: src/libpspp/zip-reader.c:329 src/libpspp/zip-reader.c:449 #, c-format msgid "%s: open failed (%s)" msgstr "" #: src/libpspp/zip-reader.c:344 #, c-format msgid "%s: cannot find central directory" msgstr "" #: src/libpspp/zip-reader.c:353 src/libpspp/zip-reader.c:384 #: src/libpspp/zip-reader.c:468 #, c-format msgid "%s: seek failed (%s)" msgstr "" #: src/libpspp/zip-reader.c:441 #, c-format msgid "%s: unknown member \"%s\"" msgstr "" #: src/libpspp/zip-reader.c:503 #, c-format msgid "" "%s: name mismatch between central directory (%s) and local file header (%s)" msgstr "" #: src/libpspp/zip-reader.c:696 #, c-format msgid "%s: cannot initialize inflator (%s)" msgstr "" #: src/libpspp/zip-reader.c:751 #, c-format msgid "%s: error inflating \"%s\" (%s)" msgstr "" #: src/libpspp/zip-writer.c:97 utilities/pspp-convert.c:346 #, c-format msgid "%s: error opening output file" msgstr "" #: src/libpspp/zip-writer.c:169 #, c-format msgid "%s: error seeking in output file" msgstr "" #: src/libpspp/zip-writer.c:210 msgid "error creating temporary file" msgstr "" #: src/libpspp/zip-writer.c:279 #, c-format msgid "%s: write failed" msgstr "" #. TRANSLATORS: This is a format string which, when presented to #. printf like functions, will create a pango markup string to #. display real number in scientific notation. #. #. In its untranslated form, it will display similar to "1.23 x 10^4". You #. can leave it untranslated if this is how scientific notation is usually #. presented in your language. #. #. Some locales (such as German) prefer the centered dot rather than the #. multiplication sign between the mantissa an exponent. In which #. case, you can change "#215;" to "#8901;" or other unicode code #. point as appropriate. #. #. The . in this string does not and should not be changed, since #. that is taken care of by the stdc library. #. #. For information on Pango markup, see #. http://developer.gnome.org/pango/stable/PangoMarkupFormat.html #. #. For tables of unicode code points, see http://unicode.org/charts #. #: src/math/chart-geometry.c:123 #, c-format msgid "%%.%dlf×10%d" msgstr "" #: src/math/histogram.c:145 msgid "" "Not creating histogram because the data contains less than 2 distinct values" msgstr "" #: src/math/percentiles.c:36 msgid "HAverage" msgstr "" #: src/math/percentiles.c:38 msgid "Rounded" msgstr "" #: src/math/percentiles.c:39 msgid "Empirical" msgstr "" #: src/math/percentiles.c:40 msgid "Empirical with averaging" msgstr "" #: src/math/shapiro-wilk.c:84 msgid "" "One or more weight values are non-integer. Fractional parts will be ignored " "when calculating the Shapiro-Wilk statistic." msgstr "" #: src/output/ascii.c:340 #, c-format msgid "ascii: opening output file `%s'" msgstr "" #: src/output/ascii.c:371 #, c-format msgid "%s: %s must be positive integer or `auto'" msgstr "" #: src/output/ascii.c:393 #, c-format msgid "" "ascii: page must be at least %d characters wide, but as configured is only " "%d characters" msgstr "" #: src/output/ascii.c:508 #, c-format msgid "See %s for a chart." msgstr "" #: src/output/charts/piechart.c:54 msgid "*MISSING*" msgstr "" #: src/output/csv.c:100 src/output/html.c:117 src/output/journal.c:166 #: src/output/msglog.c:68 #, c-format msgid "error opening output file `%s'" msgstr "" #: src/output/driver.c:522 #, c-format msgid "%s is not a valid device type (the choices are `%s' and `%s')" msgstr "" #: src/output/driver.c:536 #, c-format msgid "%s: unknown option `%s'" msgstr "" #: src/output/driver.c:553 #, c-format msgid "%s: output option missing `='" msgstr "" #: src/output/driver.c:560 #, c-format msgid "%s: output option specified more than once" msgstr "" #: src/output/html.c:129 msgid "PSPP Output" msgstr "" #: src/output/html.c:266 msgid "No description" msgstr "" #: src/output/journal.c:69 #, c-format msgid "error writing output file `%s'" msgstr "" #: src/output/measure.c:68 #, c-format msgid "`%s' is not a valid length." msgstr "" #: src/output/measure.c:96 #, c-format msgid "syntax error in paper size `%s'" msgstr "" #: src/output/measure.c:233 #, c-format msgid "unknown paper type `%.*s'" msgstr "" #: src/output/measure.c:251 #, c-format msgid "error opening input file `%s'" msgstr "" #: src/output/measure.c:279 #, c-format msgid "file `%s' does not state a paper size" msgstr "" #: src/output/options.c:112 #, c-format msgid "%s: `%s' is `%s' but a Boolean value is required" msgstr "" #: src/output/options.c:187 #, c-format msgid "%s: `%s' is `%s' but one of the following is required: %s" msgstr "" #: src/output/options.c:231 #, c-format msgid "%s: `%s' is `%s' but a non-negative integer is required" msgstr "" #: src/output/options.c:235 #, c-format msgid "%s: `%s' is `%s' but a positive integer is required" msgstr "" #: src/output/options.c:238 #, c-format msgid "%s: `%s' is `%s' but an integer is required" msgstr "" #: src/output/options.c:241 #, c-format msgid "%s: `%s' is `%s' but an integer greater than %d is required" msgstr "" #: src/output/options.c:246 #, c-format msgid "%s: `%s' is `%s' but an integer between %d and %d is required" msgstr "" #: src/output/options.c:325 #, c-format msgid "%s: `%s' is `%s' but a file name that contains `#' is required." msgstr "" #. TRANSLATORS: Do not translate this string. If the script of your language #. reads from right to left (eg Persian, Arabic, Hebrew etc), then replace #. this string with "output-direction-rtl". Otherwise either leave it #. untranslated or copy it verbatim. #: src/output/render.c:994 msgid "output-direction-ltr" msgstr "" #: src/output/text-item.c:44 msgid "Page Title" msgstr "" #: src/output/text-item.c:47 msgid "Title" msgstr "" #: src/output/text-item.c:51 msgid "Log" msgstr "" #: src/output/text-item.c:54 msgid "Page Break" msgstr "" #: src/output/cairo.c:520 #, c-format msgid "`%s': bad font specification" msgstr "" #: src/output/cairo.c:744 #, c-format msgid "" "The defined page is not wide enough to hold at least %d characters in the " "default font. In fact, there's only room for %d characters." msgstr "" #: src/output/cairo.c:752 #, c-format msgid "" "The defined page is not long enough to hold at least %d lines in the default " "font. In fact, there's only room for %d lines." msgstr "" #: src/output/cairo.c:837 #, c-format msgid "error opening output file `%s': %s" msgstr "" #: src/output/cairo.c:892 #, c-format msgid "error drawing output for %s driver: %s" msgstr "" #: src/output/cairo.c:2056 #, c-format msgid "error writing output file `%s': %s" msgstr "" #: src/output/charts/np-plot-cairo.c:37 #, c-format msgid "Normal Q-Q Plot of %s" msgstr "" #: src/output/charts/np-plot-cairo.c:38 src/output/charts/np-plot-cairo.c:68 msgid "Observed Value" msgstr "" #: src/output/charts/np-plot-cairo.c:39 msgid "Expected Normal" msgstr "" #: src/output/charts/np-plot-cairo.c:67 #, c-format msgid "Detrended Normal Q-Q Plot of %s" msgstr "" #: src/output/charts/np-plot-cairo.c:69 msgid "Dev from Normal" msgstr "" #: src/output/charts/barchart-cairo.c:65 msgid "Bar Chart" msgstr "" #: src/output/charts/plot-hist-cairo.c:43 #, c-format msgid "N = %.2f" msgstr "" #: src/output/charts/plot-hist-cairo.c:52 #, c-format msgid "Mean = %.1f" msgstr "" #: src/output/charts/plot-hist-cairo.c:61 #, c-format msgid "Std. Dev = %.2f" msgstr "" #: src/output/charts/plot-hist-cairo.c:110 msgid "HISTOGRAM" msgstr "" #: src/output/charts/roc-chart-cairo.c:36 src/ui/gui/roc.ui:24 msgid "ROC Curve" msgstr "" #: src/output/charts/scree-cairo.c:36 msgid "Scree Plot" msgstr "" #: src/output/charts/scree-cairo.c:38 msgid "Eigenvalue" msgstr "" #: src/output/charts/spreadlevel-cairo.c:37 #, c-format msgid "Spread vs. Level Plot of %s" msgstr "" #: src/output/charts/spreadlevel-cairo.c:38 msgid "Level" msgstr "" #: src/output/charts/spreadlevel-cairo.c:39 msgid "Spread" msgstr "" #: src/output/charts/scatterplot-cairo.c:57 #, c-format msgid "Scatterplot %s" msgstr "" #: src/output/spv/spv-legacy-decoder.c:2222 msgid "Table lacks cell data." msgstr "" #: src/output/spv/spv-writer.c:68 #, c-format msgid "%s: create failed" msgstr "" #: src/output/spv/spv-writer.c:89 msgid "I/O error writing SPV file" msgstr "" #: src/output/spv/spv.c:693 #, c-format msgid "%s: Failed to create XML parser" msgstr "" #: src/output/spv/spv.c:718 #, c-format msgid "%s: document is not well-formed" msgstr "" #: src/output/spv/spv.c:726 #, c-format msgid "%s: root node is \"%s\" but \"%s\" was expected" msgstr "" #: src/ui/gui/psppire-acr.c:273 msgid "Add" msgstr "" #: src/ui/gui/psppire-acr.c:274 msgid "Edit" msgstr "" #: src/ui/gui/psppire-acr.c:275 msgid "Remove" msgstr "" #: src/ui/gui/psppire-buttonbox.c:311 msgid "OK" msgstr "" #: src/ui/gui/psppire-buttonbox.c:319 msgid "Go To" msgstr "" #: src/ui/gui/psppire-buttonbox.c:327 msgid "Continue" msgstr "" #: src/ui/gui/psppire-buttonbox.c:339 src/ui/gui/psppire-import-assistant.c:759 msgid "Paste" msgstr "" #: src/ui/gui/psppire-buttonbox.c:345 #: src/ui/gui/psppire-dialog-action-aggregate.c:216 #: src/ui/gui/psppire-data-window.c:496 src/ui/gui/psppire-data-window.c:624 #: src/ui/gui/psppire-output-window.c:353 #: src/ui/gui/psppire-syntax-window.c:594 src/ui/gui/psppire-window.c:445 #: src/ui/gui/psppire-window.c:628 msgid "Cancel" msgstr "" #: src/ui/gui/psppire-buttonbox.c:351 msgid "Close" msgstr "" #: src/ui/gui/psppire-buttonbox.c:358 src/ui/gui/psppire-import-assistant.c:760 msgid "Reset" msgstr "" #: src/ui/gui/psppire-buttonbox.c:365 msgid "Help" msgstr "" #: src/ui/gui/psppire-dialog-action-aggregate.c:213 msgid "Aggregate destination file" msgstr "" #: src/ui/gui/psppire-dialog-action-aggregate.c:217 #: src/ui/gui/psppire-data-window.c:493 src/ui/gui/psppire-data-window.c:497 #: src/ui/gui/psppire-output-window.c:354 #: src/ui/gui/psppire-syntax-window.c:595 src/ui/gui/psppire-window.c:449 #: src/ui/gui/aggregate.ui:565 msgid "Save" msgstr "" #: src/ui/gui/psppire-dialog-action-aggregate.c:226 #: src/ui/gui/psppire-data-window.c:503 msgid "System Files (*.sav)" msgstr "" #: src/ui/gui/psppire-dialog-action-aggregate.c:231 #: src/ui/gui/psppire-data-window.c:508 msgid "Compressed System Files (*.zsav)" msgstr "" #: src/ui/gui/psppire-dialog-action-aggregate.c:236 #: src/ui/gui/psppire-data-window.c:513 src/ui/gui/psppire-window.c:652 msgid "Portable Files (*.por) " msgstr "" #: src/ui/gui/psppire-dialog-action-autorecode.c:337 #: src/ui/gui/psppire-dialog-action-recode.c:535 #: src/ui/gui/psppire-dialog-action-recode-different.c:288 msgid "New" msgstr "" #: src/ui/gui/psppire-dialog-action-autorecode.c:351 #: src/ui/gui/psppire-dialog-action-recode.c:527 #: src/ui/gui/psppire-dialog-action-recode-different.c:301 msgid "Old" msgstr "" #: src/ui/gui/psppire-dialog-action-comments.c:142 #, c-format msgid "Column Number: %d" msgstr "" #: src/ui/gui/psppire-dialog-action-crosstabs.c:71 msgid "Chisq" msgstr "" #: src/ui/gui/psppire-dialog-action-crosstabs.c:71 msgid "" "Pearson chi-square, likelihood ratio, Fisher’s exact test, continuity " "correction, linear-by-linear association." msgstr "" #: src/ui/gui/psppire-dialog-action-crosstabs.c:74 #: src/language/stats/crosstabs.q:1334 msgid "Phi" msgstr "" #: src/ui/gui/psppire-dialog-action-crosstabs.c:75 msgid "CC" msgstr "" #: src/ui/gui/psppire-dialog-action-crosstabs.c:75 msgid "Contingency coefficient" msgstr "" #: src/ui/gui/psppire-dialog-action-crosstabs.c:77 msgid "UC" msgstr "" #: src/ui/gui/psppire-dialog-action-crosstabs.c:77 msgid "Uncertainty coefficient" msgstr "" #: src/ui/gui/psppire-dialog-action-crosstabs.c:78 msgid "BTau" msgstr "" #: src/ui/gui/psppire-dialog-action-crosstabs.c:78 msgid "Kendall's Tau-b" msgstr "" #: src/ui/gui/psppire-dialog-action-crosstabs.c:79 msgid "CTau" msgstr "" #: src/ui/gui/psppire-dialog-action-crosstabs.c:79 msgid "Kendall's Tau-c" msgstr "" #: src/ui/gui/psppire-dialog-action-crosstabs.c:80 msgid "Risk" msgstr "" #: src/ui/gui/psppire-dialog-action-crosstabs.c:80 msgid "Relative Risk estimate" msgstr "" #: src/ui/gui/psppire-dialog-action-crosstabs.c:81 #: src/language/stats/crosstabs.q:1338 msgid "Gamma" msgstr "" #: src/ui/gui/psppire-dialog-action-crosstabs.c:82 msgid "D" msgstr "" #: src/ui/gui/psppire-dialog-action-crosstabs.c:82 msgid "Somer's d" msgstr "" #: src/ui/gui/psppire-dialog-action-crosstabs.c:83 #: src/language/stats/crosstabs.q:1344 msgid "Kappa" msgstr "" #: src/ui/gui/psppire-dialog-action-crosstabs.c:83 msgid "Cohen's Kappa" msgstr "" #: src/ui/gui/psppire-dialog-action-crosstabs.c:84 #: src/language/stats/crosstabs.q:1429 msgid "Eta" msgstr "" #: src/ui/gui/psppire-dialog-action-crosstabs.c:85 msgid "Corr" msgstr "" #: src/ui/gui/psppire-dialog-action-crosstabs.c:85 msgid "Spearman correlation, Pearson's r" msgstr "" #: src/ui/gui/psppire-dialog-action-crosstabs.c:90 msgid "Frequency Count" msgstr "" #: src/ui/gui/psppire-dialog-action-crosstabs.c:91 msgid "Row" msgstr "" #: src/ui/gui/psppire-dialog-action-crosstabs.c:91 msgid "Row percent" msgstr "" #: src/ui/gui/psppire-dialog-action-crosstabs.c:92 msgid "Column" msgstr "" #: src/ui/gui/psppire-dialog-action-crosstabs.c:92 msgid "Column percent" msgstr "" #: src/ui/gui/psppire-dialog-action-crosstabs.c:93 msgid "Total percent" msgstr "" #: src/ui/gui/psppire-dialog-action-crosstabs.c:94 #: src/language/stats/crosstabs.q:1266 msgid "Expected" msgstr "" #: src/ui/gui/psppire-dialog-action-crosstabs.c:94 msgid "Expected value" msgstr "" #: src/ui/gui/psppire-dialog-action-crosstabs.c:96 #: src/language/stats/crosstabs.q:1268 msgid "Std. Residual" msgstr "" #: src/ui/gui/psppire-dialog-action-crosstabs.c:96 msgid "Standardized Residual" msgstr "" #: src/ui/gui/psppire-dialog-action-crosstabs.c:97 msgid "Adjusted Std. Residual" msgstr "" #: src/ui/gui/psppire-dialog-action-descriptives.c:45 msgid "Standard error" msgstr "" #: src/ui/gui/psppire-dialog-action-descriptives.c:45 msgid "Standard error of mean" msgstr "" #: src/ui/gui/psppire-dialog-action-descriptives.c:47 msgid "Kurtosis and standard error of kurtosis" msgstr "" #: src/ui/gui/psppire-dialog-action-descriptives.c:48 msgid "Skewness and standard error of skewness" msgstr "" #: src/ui/gui/psppire-dialog-action-factor.c:323 #, c-format msgid "_Eigenvalues over %4.2f times the mean eigenvalue" msgstr "" #: src/ui/gui/psppire-dialog-action-frequencies.c:44 msgid "Standard error of the mean" msgstr "" #: src/ui/gui/psppire-dialog-action-frequencies.c:47 msgid "Standard error of the skewness" msgstr "" #: src/ui/gui/psppire-dialog-action-frequencies.c:51 msgid "Standard error of the kurtosis" msgstr "" #: src/ui/gui/psppire-dialog-action-oneway.c:175 #, c-format msgid "Contrast %d of %d" msgstr "" #: src/ui/gui/psppire-dialog-action-paired.c:162 src/ui/gui/examine.ui:282 #: src/ui/gui/indep-samples.ui:334 src/ui/gui/t-test.ui:296 msgid "O_ptions..." msgstr "" #: src/ui/gui/psppire-dialog-action-paired.c:168 msgid "Paired Samples T Test" msgstr "" #: src/ui/gui/psppire-dialog-action-recode-different.c:327 msgid "Recode into Different Variables" msgstr "" #: src/ui/gui/psppire-dialog-action-recode-different.c:330 msgid "Recode into Different Variables: Old and New Values " msgstr "" #: src/ui/gui/psppire-dialog-action-recode-same.c:108 src/ui/gui/recode.ui:391 msgid "Recode into Same Variables" msgstr "" #: src/ui/gui/psppire-dialog-action-recode-same.c:114 msgid "Recode into Same Variables: Old and New Values" msgstr "" #: src/ui/gui/psppire-dialog-action-regression.c:40 msgid "Coeff" msgstr "" #: src/ui/gui/psppire-dialog-action-regression.c:40 msgid "Show the regression coefficients" msgstr "" #: src/ui/gui/psppire-dialog-action-regression.c:41 msgid "Conf. Interval" msgstr "" #: src/ui/gui/psppire-dialog-action-regression.c:41 msgid "Show the confidence interval for the regression coefficients" msgstr "" #: src/ui/gui/psppire-dialog-action-regression.c:42 msgid "Show the correlation between observed and predicted values" msgstr "" #: src/ui/gui/psppire-dialog-action-regression.c:43 msgid "Anova" msgstr "" #: src/ui/gui/psppire-dialog-action-regression.c:43 msgid "Show the analysis of variance table" msgstr "" #: src/ui/gui/psppire-dialog-action-regression.c:44 msgid "Bcov" msgstr "" #: src/ui/gui/psppire-dialog-action-regression.c:44 msgid "Show the variance coefficient matrix" msgstr "" #: src/ui/gui/psppire-dialog-action-regression.c:45 msgid "Tol" msgstr "" #: src/ui/gui/psppire-dialog-action-regression.c:45 msgid "Show the variance inflation factor and its reciprocal" msgstr "" #: src/ui/gui/psppire-dialog-action-select.c:88 #, c-format msgid "Approximately %3d%% of all cases." msgstr "" #: src/ui/gui/psppire-dialog-action-select.c:89 #, c-format msgid "Exactly %3d cases from the first %3d cases." msgstr "" #: src/ui/gui/psppire-dialog-action-select.c:236 #, c-format msgid "%d thru %d" msgstr "" #: src/ui/gui/psppire-dialog-action-two-sample.c:180 #: src/ui/gui/k-independent.ui:404 src/ui/gui/k-related.ui:197 msgid "Test Type" msgstr "" #: src/ui/gui/psppire-dialog-action-two-sample.c:189 msgid "_Wilcoxon" msgstr "" #: src/ui/gui/psppire-dialog-action-two-sample.c:190 msgid "_Sign" msgstr "" #: src/ui/gui/psppire-dialog-action-two-sample.c:191 msgid "_McNemar" msgstr "" #: src/ui/gui/psppire-dialog-action-two-sample.c:209 msgid "Two-Related-Samples Tests" msgstr "" #: src/ui/gui/psppire-dialog-action-weight.c:74 src/ui/gui/weight.ui:83 #: src/ui/gui/weight.ui:211 msgid "Do not weight cases" msgstr "" #: src/ui/gui/psppire-dialog-action-weight.c:80 #, c-format msgid "Weight cases by %s" msgstr "" #: src/ui/gui/psppire-dict.c:95 msgid "Var" msgstr "" #. TRANSLATORS: This string must be a valid variable name. That means: #. - The string must be at most 64 bytes (not characters) long. #. - The string may not contain whitespace. #. - The first character may not be '$' #. - The first character may not be a digit #. - The final character may not be '.' or '_' #. #: src/ui/gui/psppire-dict.c:385 #, c-format msgid "Var%04d" msgstr "" #: src/ui/gui/psppire-dict.c:566 msgid "Duplicate variable name." msgstr "" #: src/ui/gui/psppire-dictview.c:617 msgid "Prefer variable labels" msgstr "" #: src/ui/gui/psppire-dictview.c:631 msgid "Default sort order" msgstr "" #: src/ui/gui/psppire-dictview.c:637 msgid "Unsorted (dictionary order)" msgstr "" #: src/ui/gui/psppire-dictview.c:642 msgid "Sort by name" msgstr "" #: src/ui/gui/psppire-dictview.c:647 msgid "Sort by label" msgstr "" #: src/ui/gui/psppire-means-layer.c:95 #, c-format msgid "Layer %d of %d" msgstr "" #: src/ui/gui/psppire-means-layer.c:169 msgid "Forward" msgstr "" #: src/ui/gui/psppire-means-layer.c:170 msgid "Back" msgstr "" #: src/ui/gui/psppire-text-file.c:55 #, c-format msgid "Could not open `%s'" msgstr "" #: src/ui/gui/psppire-text-file.c:71 #, c-format msgid "Error reading `%s': %s" msgstr "" #: src/ui/gui/psppire-text-file.c:74 #, c-format msgid "" "Failed to read `%s', because it contains a line over %d bytes long and " "therefore appears not to be a text file." msgstr "" #: src/ui/gui/psppire-text-file.c:96 #, c-format msgid "`%s' is empty." msgstr "" #: src/ui/gui/psppire-val-chooser.c:255 msgid "through" msgstr "" #: src/ui/gui/psppire-val-chooser.c:288 msgid "_Value:" msgstr "" #: src/ui/gui/psppire-val-chooser.c:289 msgid "_System Missing" msgstr "" #: src/ui/gui/psppire-val-chooser.c:290 msgid "System _or User Missing" msgstr "" #: src/ui/gui/psppire-val-chooser.c:291 msgid "_Range:" msgstr "" #: src/ui/gui/psppire-val-chooser.c:292 msgid "Range, _LOWEST thru value" msgstr "" #: src/ui/gui/psppire-val-chooser.c:293 msgid "Range, value thru _HIGHEST" msgstr "" #: src/ui/gui/psppire-val-chooser.c:294 msgid "_All other values" msgstr "" #: src/ui/gui/psppire-var-view.c:153 #, c-format msgid "Var%d" msgstr "" #: src/ui/source-init-opts.c:72 #, c-format msgid "Algorithm must be either `%s' or `%s'." msgstr "" #: src/ui/source-init-opts.c:97 #, c-format msgid "Syntax must be either `%s' or `%s'." msgstr "" #: src/ui/terminal/main.c:144 msgid "Error encountered while ERROR=STOP is effective." msgstr "" #: src/ui/terminal/main.c:150 msgid "" "Stopping syntax file processing here to avoid a cascade of dependent command " "failures." msgstr "" #: src/ui/terminal/terminal-opts.c:147 #, c-format msgid "" "PSPP, a program for statistical analysis of sampled data.\n" "Usage: %s [OPTION]... FILE...\n" "\n" "Arguments to long options also apply to equivalent short options.\n" "\n" "Output options:\n" " -o, --output=FILE output to FILE, default format from FILE's name\n" " -O format=FORMAT override format for previous -o\n" " -O OPTION=VALUE set output option to customize previous -o\n" " -O device={terminal|listing} override device type for previous -o\n" " -e, --error-file=FILE append errors, warnings, and notes to FILE\n" " --no-output disable default output driver\n" "Supported output formats: %s\n" "\n" "Language options:\n" " -I, --include=DIR append DIR to search path\n" " -I-, --no-include clear search path\n" " -r, --no-statrc disable running rc file at startup\n" " -a, --algorithm={compatible|enhanced}\n" " set to `compatible' if you want output\n" " calculated from broken algorithms\n" " -x, --syntax={compatible|enhanced}\n" " set to `compatible' to disable PSPP extensions\n" " -b, --batch interpret syntax in batch mode\n" " -i, --interactive interpret syntax in interactive mode\n" " --syntax-encoding=ENCODING specify encoding for syntax files\n" " -s, --safer don't allow some unsafe operations\n" "Default search path: %s\n" "\n" "Informative output:\n" " -h, --help display this help and exit\n" " -V, --version output version information and exit\n" "\n" "Non-option arguments are interpreted as syntax files to execute.\n" msgstr "" #: src/ui/gui/find-dialog.c:197 msgid "Find" msgstr "" #: src/ui/gui/find-dialog.c:662 #, c-format msgid "Bad regular expression: %s" msgstr "" #: src/ui/gui/help-menu.c:70 msgid "A program for the analysis of sampled data" msgstr "" #. TRANSLATORS: Do not translate this string. Instead, put the names of the people #. who have helped in the translation. #: src/ui/gui/help-menu.c:80 msgid "translator-credits" msgstr "" #: src/ui/gui/help-menu.c:170 #, c-format msgid "Help path conversion error: %s" msgstr "" #: src/ui/gui/help-menu.c:197 #, c-format msgid "" "Cannot open via html: %s with uri: %s The PSSP manual is also available at %s" msgstr "" #: src/ui/gui/help-menu.c:218 msgid "_Help" msgstr "" #: src/ui/gui/help-menu.c:221 msgid "_About" msgstr "" #: src/ui/gui/help-menu.c:222 msgid "_Reference Manual" msgstr "" #: src/ui/gui/main.c:306 msgid "Show version information and exit" msgstr "" #: src/ui/gui/main.c:409 msgid "Do not display the splash screen" msgstr "" #: src/ui/gui/main.c:411 msgid "Do not attempt single instance negotiation" msgstr "" #: src/ui/gui/missing-val-dialog.c:217 msgid "" "The maximum length of a missing value for a string variable is 8 in UTF-8." msgstr "" #: src/ui/gui/missing-val-dialog.c:268 msgid "At least one value must be specified" msgstr "" #: src/ui/gui/missing-val-dialog.c:298 msgid "Incorrect range specification" msgstr "" #: src/ui/gui/psppire-data-editor.c:380 #, c-format msgid "%d : %s" msgstr "" #: src/ui/gui/psppire-data-editor.c:391 #, c-format msgid "%'d case" msgid_plural "%'d cases" msgstr[0] "" msgstr[1] "" #: src/ui/gui/psppire-data-editor.c:396 #, c-format msgid "%'d variable" msgid_plural "%'d variables" msgstr[0] "" msgstr[1] "" #: src/ui/gui/psppire-data-editor.c:485 msgid "Case" msgstr "" #: src/ui/gui/psppire-data-editor.c:495 msgid "Data View" msgstr "" #: src/ui/gui/psppire-data-editor.c:505 msgid "Variable View" msgstr "" #: src/ui/gui/psppire-data-sheet.c:171 src/ui/gui/psppire-data-window.c:1338 msgid "_Insert Case" msgstr "" #: src/ui/gui/psppire-data-sheet.c:179 src/ui/gui/psppire-data-window.c:1391 msgid "Cl_ear Cases" msgstr "" #: src/ui/gui/psppire-data-sheet.c:305 src/ui/gui/psppire-data-window.c:1337 #: src/ui/gui/psppire-variable-sheet.c:274 msgid "_Insert Variable" msgstr "" #: src/ui/gui/psppire-data-sheet.c:314 src/ui/gui/psppire-variable-sheet.c:283 msgid "Cl_ear Variables" msgstr "" #: src/ui/gui/psppire-data-sheet.c:326 msgid "Sort _Ascending" msgstr "" #: src/ui/gui/psppire-data-sheet.c:333 msgid "Sort _Descending" msgstr "" #: src/ui/gui/psppire-data-window.c:175 msgid "Transformations Pending" msgstr "" #: src/ui/gui/psppire-data-window.c:191 msgid "Filter off" msgstr "" #: src/ui/gui/psppire-data-window.c:203 #, c-format msgid "Filter by %s" msgstr "" #: src/ui/gui/psppire-data-window.c:224 msgid "No Split" msgstr "" #: src/ui/gui/psppire-data-window.c:233 msgid "Split by " msgstr "" #: src/ui/gui/psppire-data-window.c:261 msgid "Weights off" msgstr "" #: src/ui/gui/psppire-data-window.c:273 #, c-format msgid "Weight by %s" msgstr "" #: src/ui/gui/psppire-data-window.c:518 #: src/ui/gui/psppire-import-assistant.c:681 #: src/ui/gui/psppire-syntax-window.c:607 src/ui/gui/psppire-window.c:669 msgid "All Files" msgstr "" #: src/ui/gui/psppire-data-window.c:535 msgid "System File" msgstr "" #: src/ui/gui/psppire-data-window.c:542 msgid "Compressed System File" msgstr "" #: src/ui/gui/psppire-data-window.c:548 msgid "Portable File" msgstr "" #: src/ui/gui/psppire-data-window.c:551 msgid "Format:" msgstr "" #: src/ui/gui/psppire-data-window.c:615 msgid "Delete Existing Dataset?" msgstr "" #: src/ui/gui/psppire-data-window.c:619 #, c-format msgid "" "Renaming \"%s\" to \"%s\" will destroy the existing dataset named \"%s\". " "Are you sure that you want to do this?" msgstr "" #: src/ui/gui/psppire-data-window.c:625 msgid "Delete" msgstr "" #: src/ui/gui/psppire-data-window.c:647 #, c-format msgid "Please enter a new name for dataset \"%s\":" msgstr "" #: src/ui/gui/psppire-data-window.c:649 msgid "Rename Dataset" msgstr "" #: src/ui/gui/psppire-data-window.c:1199 src/ui/gui/output-window.ui:68 #: src/ui/gui/syntax-editor.ui:22 msgid "_File" msgstr "" #: src/ui/gui/psppire-data-window.c:1203 src/ui/gui/syntax-editor.ui:25 msgid "_New" msgstr "" #: src/ui/gui/psppire-data-window.c:1210 msgid "_Syntax" msgstr "" #: src/ui/gui/psppire-data-window.c:1213 src/ui/gui/data-editor.ui:177 #: src/ui/gui/data-editor.ui:189 msgid "_Data" msgstr "" #: src/ui/gui/psppire-data-window.c:1220 src/ui/gui/syntax-editor.ui:36 msgid "_Open" msgstr "" #: src/ui/gui/psppire-data-window.c:1223 msgid "_Import Data..." msgstr "" #: src/ui/gui/psppire-data-window.c:1231 src/ui/gui/logistic.ui:261 #: src/ui/gui/regression.ui:66 msgid "_Save..." msgstr "" #: src/ui/gui/psppire-data-window.c:1234 msgid "Save _As..." msgstr "" #: src/ui/gui/psppire-data-window.c:1237 msgid "_Rename Dataset..." msgstr "" #: src/ui/gui/psppire-data-window.c:1248 msgid "_Display Data File Information" msgstr "" #: src/ui/gui/psppire-data-window.c:1255 msgid "Working File" msgstr "" #: src/ui/gui/psppire-data-window.c:1257 msgid "_External File..." msgstr "" #: src/ui/gui/psppire-data-window.c:1267 msgid "_Recently Used Data" msgstr "" #: src/ui/gui/psppire-data-window.c:1268 msgid "Recently Used _Files" msgstr "" #: src/ui/gui/psppire-data-window.c:1315 src/ui/gui/output-window.ui:82 #: src/ui/gui/syntax-editor.ui:59 msgid "_Quit" msgstr "" #: src/ui/gui/psppire-data-window.c:1333 src/ui/gui/output-window.ui:89 #: src/ui/gui/syntax-editor.ui:66 msgid "_Edit" msgstr "" #: src/ui/gui/psppire-data-window.c:1339 msgid "_Go To Variable..." msgstr "" #: src/ui/gui/psppire-data-window.c:1340 msgid "_Go To Case..." msgstr "" #: src/ui/gui/psppire-data-window.c:1364 src/ui/gui/syntax-editor.ui:69 msgid "Cu_t" msgstr "" #: src/ui/gui/psppire-data-window.c:1373 src/ui/gui/output-window.ui:96 #: src/ui/gui/syntax-editor.ui:74 msgid "_Copy" msgstr "" #: src/ui/gui/psppire-data-window.c:1380 src/ui/gui/syntax-editor.ui:79 msgid "_Paste" msgstr "" #: src/ui/gui/psppire-data-window.c:1387 msgid "Clear _Variables" msgstr "" #: src/ui/gui/psppire-data-window.c:1401 msgid "_Find..." msgstr "" #: src/ui/gui/psppire-data-window.c:1407 src/ui/gui/logistic.ui:246 msgid "_Options..." msgstr "" #: src/ui/gui/psppire-data-window.c:1676 msgid "Jump to variable" msgstr "" #: src/ui/gui/psppire-data-window.c:1689 msgid "Jump to a case in the data sheet" msgstr "" #: src/ui/gui/psppire-data-window.c:1703 msgid "Search for values in the data" msgstr "" #: src/ui/gui/psppire-data-window.c:1715 msgid "Create a new case at the current position" msgstr "" #: src/ui/gui/psppire-data-window.c:1727 msgid "Create a new variable at the current position" msgstr "" #: src/ui/gui/psppire-data-window.c:1741 msgid "Split the active dataset" msgstr "" #: src/ui/gui/psppire-data-window.c:1753 msgid "Weight cases by variable" msgstr "" #: src/ui/gui/psppire-data-window.c:1764 msgid "Show/hide value labels" msgstr "" #: src/ui/gui/psppire-data-window.c:1904 msgid "Data Editor" msgstr "" #: src/ui/gui/psppire-encoding-selector.c:140 msgid "Automatically Detect" msgstr "" #: src/ui/gui/psppire-encoding-selector.c:147 msgid "Locale Encoding" msgstr "" #: src/ui/gui/psppire-encoding-selector.c:177 msgid "Character Encoding: " msgstr "" #: src/ui/gui/psppire-import-assistant.c:337 msgid "line" msgstr "" #: src/ui/gui/psppire-import-assistant.c:347 msgid "var" msgstr "" #: src/ui/gui/psppire-import-assistant.c:560 msgid "Importing Spreadsheet Data" msgstr "" #: src/ui/gui/psppire-import-assistant.c:686 msgid "Text Files" msgstr "" #: src/ui/gui/psppire-import-assistant.c:691 msgid "Text (*.txt) Files" msgstr "" #: src/ui/gui/psppire-import-assistant.c:697 msgid "Plain Text (ASCII) Files" msgstr "" #: src/ui/gui/psppire-import-assistant.c:702 msgid "Comma Separated Value Files" msgstr "" #: src/ui/gui/psppire-import-assistant.c:709 msgid "Tab Separated Value Files" msgstr "" #: src/ui/gui/psppire-import-assistant.c:714 msgid "Gnumeric Spreadsheet Files" msgstr "" #: src/ui/gui/psppire-import-assistant.c:719 msgid "OpenDocument Spreadsheet Files" msgstr "" #: src/ui/gui/psppire-import-assistant.c:724 msgid "All Spreadsheet Files" msgstr "" #: src/ui/gui/psppire-import-assistant.c:733 msgid "Select File to Import" msgstr "" #: src/ui/gui/psppire-import-assistant.c:770 msgid "Importing Delimited Text Data" msgstr "" #: src/ui/gui/psppire-import-assistant.c:865 msgid "Select the First Line" msgstr "" #: src/ui/gui/psppire-import-assistant.c:877 msgid "Line" msgstr "" #: src/ui/gui/psppire-import-assistant.c:931 msgid "" "This assistant will guide you through the process of importing data into " "PSPP from a text file with one line per case, in which fields are separated " "by tabs, commas, or other delimiters.\n" "\n" msgstr "" #: src/ui/gui/psppire-import-assistant.c:941 #, c-format msgid "The selected file contains %'lu line of text. " msgid_plural "The selected file contains %'lu lines of text. " msgstr[0] "" msgstr[1] "" #: src/ui/gui/psppire-import-assistant.c:950 #, c-format msgid "The selected file contains approximately %'lu line of text. " msgid_plural "The selected file contains approximately %'lu lines of text. " msgstr[0] "" msgstr[1] "" #: src/ui/gui/psppire-import-assistant.c:956 #, c-format msgid "" "Only the first %zu line of the file will be shown for preview purposes in " "the following screens. " msgid_plural "" "Only the first %zu lines of the file will be shown for preview purposes in " "the following screens. " msgstr[0] "" msgstr[1] "" #: src/ui/gui/psppire-import-assistant.c:965 msgid "You may choose below how much of the file should actually be imported." msgstr "" #: src/ui/gui/psppire-import-assistant.c:974 #, c-format msgid "Only the first %4d cases" msgstr "" #: src/ui/gui/psppire-import-assistant.c:985 #, c-format msgid "Only the first %3d %% of file (approximately)" msgstr "" #: src/ui/gui/psppire-import-assistant.c:1009 msgid "Select the Lines to Import" msgstr "" #: src/ui/gui/psppire-import-assistant.c:1151 msgid "Choose Separators" msgstr "" #: src/ui/gui/psppire-import-assistant.c:1438 msgid "Adjust Variable Formats" msgstr "" #: src/ui/gui/psppire-output-view.c:410 msgid "Message" msgstr "" #: src/ui/gui/psppire-output-view.c:543 msgid "failed to create temporary directory during clipboard operation" msgstr "" #: src/ui/gui/psppire-output-window.c:241 msgid "Infer file type from extension" msgstr "" #: src/ui/gui/psppire-output-window.c:242 msgid "SPSS Viewer (*.spv)" msgstr "" #: src/ui/gui/psppire-output-window.c:243 msgid "PDF (*.pdf)" msgstr "" #: src/ui/gui/psppire-output-window.c:244 msgid "HTML (*.html)" msgstr "" #: src/ui/gui/psppire-output-window.c:245 msgid "OpenDocument (*.odt)" msgstr "" #: src/ui/gui/psppire-output-window.c:246 msgid "Text (*.txt)" msgstr "" #: src/ui/gui/psppire-output-window.c:247 msgid "Text [plain] (*.txt)" msgstr "" #: src/ui/gui/psppire-output-window.c:248 msgid "PostScript (*.ps)" msgstr "" #: src/ui/gui/psppire-output-window.c:249 msgid "Comma-Separated Values (*.csv)" msgstr "" #: src/ui/gui/psppire-output-window.c:350 msgid "Export Output" msgstr "" #: src/ui/gui/psppire-output-window.c:548 msgid "Output Viewer" msgstr "" #: src/ui/gui/psppire-spreadsheet-model.c:237 msgid "(empty)" msgstr "" #: src/ui/gui/psppire-syntax-window.c:226 msgid "Text Search" msgstr "" #: src/ui/gui/psppire-syntax-window.c:229 msgid "_OK" msgstr "" #: src/ui/gui/psppire-syntax-window.c:231 msgid "_Cancel" msgstr "" #: src/ui/gui/psppire-syntax-window.c:239 msgid "Text to search for:" msgstr "" #: src/ui/gui/psppire-syntax-window.c:570 #, c-format msgid "Saved file `%s'" msgstr "" #: src/ui/gui/psppire-syntax-window.c:591 msgid "Save Syntax" msgstr "" #: src/ui/gui/psppire-syntax-window.c:601 src/ui/gui/psppire-window.c:657 msgid "Syntax Files (*.sps) " msgstr "" #: src/ui/gui/psppire-syntax-window.c:970 msgid "Syntax Editor" msgstr "" #: src/ui/gui/psppire-syntax-window.c:990 #, c-format msgid "Cannot load syntax file `%s'" msgstr "" #: src/ui/gui/psppire-variable-sheet.c:412 #, c-format msgid "{%s, %s}..." msgstr "" #: src/ui/gui/psppire-var-sheet-header.c:64 msgid "Decimal" msgstr "" #: src/ui/gui/psppire-var-sheet-header.c:79 msgid "Align" msgstr "" #: src/ui/gui/psppire-var-sheet-header.c:82 msgid "Measure" msgstr "" #: src/ui/gui/psppire-window.c:430 #, c-format msgid "Save the changes to `%s' before closing?" msgstr "" #: src/ui/gui/psppire-window.c:437 #, c-format msgid "" "If you don't save, changes from the last %ld seconds will be permanently " "lost." msgstr "" #: src/ui/gui/psppire-window.c:441 msgid "Close _without saving" msgstr "" #: src/ui/gui/psppire-window.c:625 src/ui/gui/psppire-window.c:629 msgid "Open" msgstr "" #: src/ui/gui/psppire-window.c:634 msgid "Data and Syntax Files" msgstr "" #: src/ui/gui/psppire-window.c:646 msgid "System Files (*.sav, *.zsav)" msgstr "" #: src/ui/gui/psppire-window.c:663 msgid "Output Files (*.spv) " msgstr "" #: src/ui/gui/t-test-options.c:65 #, c-format msgid "Con_fidence Interval: %2d %%" msgstr "" #: src/ui/gui/val-labs-dialog.c:591 #, c-format msgid "%s = `%s'" msgstr "" #: src/ui/gui/var-type-dialog.c:541 msgid "Variable Type and Format" msgstr "" #: src/ui/gui/windows-menu.c:92 msgid "_Minimize all Windows" msgstr "" #: src/ui/gui/windows-menu.c:100 msgid "_Split" msgstr "" #: src/ui/gui/windows-menu.c:132 msgid "_Windows" msgstr "" #: utilities/pspp-convert.c:67 #, c-format msgid "%s argument must be a single character" msgstr "" #: utilities/pspp-convert.c:265 msgid "exactly two non-option arguments are required; use --help for help" msgstr "" #: utilities/pspp-convert.c:276 #, c-format msgid "%s: cannot guess output format (use -O option)" msgstr "" #: utilities/pspp-convert.c:341 #, c-format msgid "%s: unknown output format (use -O option)" msgstr "" #: utilities/pspp-convert.c:360 #, c-format msgid "%s: error reading input file" msgstr "" #: utilities/pspp-convert.c:362 #, c-format msgid "%s: error writing output file" msgstr "" #: utilities/pspp-convert.c:409 #, c-format msgid "%s: error opening password file" msgstr "" #: utilities/pspp-convert.c:425 #, c-format msgid "" "\n" "%s: password not in file" msgstr "" #: utilities/pspp-convert.c:462 #, c-format msgid "%s: '%c' is not in alphabet" msgstr "" #: utilities/pspp-convert.c:526 msgid "sorry, wrong password" msgstr "" #: utilities/pspp-output.c:92 #, c-format msgid "%s and %s:" msgstr "" #: utilities/pspp-output.c:547 #, c-format msgid "%s: invalid XPath expression" msgstr "" #: utilities/pspp-output.c:716 msgid "missing command name (use --help for help)" msgstr "" #: utilities/pspp-output.c:720 #, c-format msgid "unknown command \"%s\" (use --help for help)" msgstr "" #: utilities/pspp-output.c:728 #, c-format msgid "\"%s\" command takes exactly %d argument" msgid_plural "\"%s\" command takes exactly %d arguments" msgstr[0] "" msgstr[1] "" #: utilities/pspp-output.c:735 #, c-format msgid "\"%s\" command requires at least %d argument" msgid_plural "\"%s\" command requires at least %d arguments" msgstr[0] "" msgstr[1] "" #: utilities/pspp-output.c:742 #, c-format msgid "\"%s\" command requires between %d and %d arguments" msgstr "" #: utilities/pspp-output.c:782 msgid "The following object classes are supported:" msgstr "" #: utilities/pspp-output.c:791 #, c-format msgid "%s: unknown object class (use --select=help for help" msgstr "" #: src/language/utilities/set.q:162 #, c-format msgid "%s must be between 0 and 20." msgstr "" #: src/language/utilities/set.q:172 src/language/utilities/set.q:179 #, c-format msgid "%s must be at least 1." msgstr "" #: src/language/utilities/set.q:205 #, c-format msgid "%s must be at least 1MB" msgstr "" #: src/language/utilities/set.q:207 #, c-format msgid "%s must be positive" msgstr "" #: src/language/utilities/set.q:213 src/language/utilities/set.q:215 #: src/language/utilities/set.q:217 src/language/utilities/set.q:219 #: src/language/utilities/set.q:221 src/language/utilities/set.q:223 #: src/language/utilities/set.q:225 src/language/utilities/set.q:227 #: src/language/utilities/set.q:229 src/language/utilities/set.q:231 #: src/language/utilities/set.q:233 #, c-format msgid "%s is obsolete." msgstr "" #: src/language/utilities/set.q:239 msgid "Active file compression is not implemented." msgstr "" #: src/language/utilities/set.q:403 #, c-format msgid "%s must be 1500 or later." msgstr "" #: src/language/utilities/set.q:410 #, c-format msgid "expecting %s or year" msgstr "" #: src/language/utilities/set.q:438 src/language/utilities/set.q:535 #, c-format msgid "%s must be at least %d." msgstr "" #: src/language/utilities/set.q:474 #, c-format msgid "%s is not a recognized encoding or locale name" msgstr "" #: src/language/utilities/set.q:562 #, c-format msgid "" "%s requires numeric output format as an argument. Specified format %s is of " "type string." msgstr "" #: src/language/utilities/set.q:791 msgid "ISL (32-bit IEEE 754 single, little-endian)" msgstr "" #: src/language/utilities/set.q:794 msgid "ISB (32-bit IEEE 754 single, big-endian)" msgstr "" #: src/language/utilities/set.q:797 msgid "IDL (64-bit IEEE 754 double, little-endian)" msgstr "" #: src/language/utilities/set.q:800 msgid "IDB (64-bit IEEE 754 double, big-endian)" msgstr "" #: src/language/utilities/set.q:804 msgid "VF (32-bit VAX F, VAX-endian)" msgstr "" #: src/language/utilities/set.q:807 msgid "VD (64-bit VAX D, VAX-endian)" msgstr "" #: src/language/utilities/set.q:810 msgid "VG (64-bit VAX G, VAX-endian)" msgstr "" #: src/language/utilities/set.q:814 msgid "ZS (32-bit IBM Z hexadecimal short, big-endian)" msgstr "" #: src/language/utilities/set.q:817 msgid "ZL (64-bit IBM Z hexadecimal long, big-endian)" msgstr "" #: src/language/utilities/set.q:985 #, c-format msgid "%s is %s." msgstr "" #: src/language/utilities/set.q:1089 #, c-format msgid "" "Too many %s commands without a %s: at most %d levels of saved settings are " "allowed." msgstr "" #: src/language/utilities/set.q:1109 #, c-format msgid "%s without matching %s." msgstr "" #: src/language/stats/crosstabs.q:327 #, c-format msgid "Missing mode %s not allowed in general mode. Assuming %s." msgstr "" #: src/language/stats/crosstabs.q:444 msgid "Too many cross-tabulation variables or dimensions." msgstr "" #: src/language/stats/crosstabs.q:509 #, c-format msgid "%s must be specified before %s." msgstr "" #: src/language/stats/crosstabs.q:543 #, c-format msgid "Maximum value (%ld) less than minimum value (%ld)." msgstr "" #: src/language/stats/crosstabs.q:922 msgid "Summary" msgstr "" #: src/language/stats/crosstabs.q:935 msgid "Crosstabulation" msgstr "" #. TRANSLATORS: The %s here describes a crosstabulation. It takes the #. form "var1 * var2 * var3 * ...". #: src/language/stats/crosstabs.q:1013 #, c-format msgid "Crosstabulation %s contained no non-missing cases." msgstr "" #: src/language/stats/crosstabs.q:1204 msgid "Missing value" msgstr "" #: src/language/stats/crosstabs.q:1263 msgid "Row %" msgstr "" #: src/language/stats/crosstabs.q:1264 msgid "Column %" msgstr "" #: src/language/stats/crosstabs.q:1265 msgid "Total %" msgstr "" #: src/language/stats/crosstabs.q:1269 msgid "Adjusted Residual" msgstr "" #: src/language/stats/crosstabs.q:1288 msgid "Chi-Square Tests" msgstr "" #: src/language/stats/crosstabs.q:1294 msgid "Pearson Chi-Square" msgstr "" #: src/language/stats/crosstabs.q:1295 msgid "Likelihood Ratio" msgstr "" #: src/language/stats/crosstabs.q:1296 msgid "Fisher's Exact Test" msgstr "" #: src/language/stats/crosstabs.q:1297 msgid "Continuity Correction" msgstr "" #: src/language/stats/crosstabs.q:1298 msgid "Linear-by-Linear Association" msgstr "" #: src/language/stats/crosstabs.q:1299 src/language/stats/crosstabs.q:1345 #: src/language/stats/crosstabs.q:1854 msgid "N of Valid Cases" msgstr "" #: src/language/stats/crosstabs.q:1305 msgid "Asymptotic Sig. (2-tailed)" msgstr "" #: src/language/stats/crosstabs.q:1319 msgid "Symmetric Measures" msgstr "" #: src/language/stats/crosstabs.q:1324 src/language/stats/crosstabs.q:1364 #: src/language/stats/crosstabs.q:1411 msgid "Values" msgstr "" #: src/language/stats/crosstabs.q:1326 src/language/stats/crosstabs.q:1413 msgid "Asymp. Std. Error" msgstr "" #: src/language/stats/crosstabs.q:1327 src/language/stats/crosstabs.q:1414 msgid "Approx. T" msgstr "" #: src/language/stats/crosstabs.q:1328 src/language/stats/crosstabs.q:1415 msgid "Approx. Sig." msgstr "" #: src/language/stats/crosstabs.q:1333 src/language/stats/crosstabs.q:1420 msgid "Nominal by Nominal" msgstr "" #: src/language/stats/crosstabs.q:1334 msgid "Cramer's V" msgstr "" #: src/language/stats/crosstabs.q:1334 msgid "Contingency Coefficient" msgstr "" #: src/language/stats/crosstabs.q:1336 src/language/stats/crosstabs.q:1425 msgid "Ordinal by Ordinal" msgstr "" #: src/language/stats/crosstabs.q:1337 msgid "Kendall's tau-b" msgstr "" #: src/language/stats/crosstabs.q:1337 msgid "Kendall's tau-c" msgstr "" #: src/language/stats/crosstabs.q:1338 msgid "Spearman Correlation" msgstr "" #: src/language/stats/crosstabs.q:1340 msgid "Interval by Interval" msgstr "" #: src/language/stats/crosstabs.q:1341 msgid "Pearson's R" msgstr "" #: src/language/stats/crosstabs.q:1343 msgid "Measure of Agreement" msgstr "" #: src/language/stats/crosstabs.q:1359 msgid "Risk Estimate" msgstr "" #: src/language/stats/crosstabs.q:1368 #, no-c-format msgid "95% Confidence Interval" msgstr "" #: src/language/stats/crosstabs.q:1389 msgid "Symmetric" msgstr "" #: src/language/stats/crosstabs.q:1391 src/language/stats/crosstabs.q:1396 #, c-format msgid "%s Dependent" msgstr "" #: src/language/stats/crosstabs.q:1406 msgid "Directional Measures" msgstr "" #: src/language/stats/crosstabs.q:1422 msgid "Goodman and Kruskal tau" msgstr "" #: src/language/stats/crosstabs.q:1423 msgid "Uncertainty Coefficient" msgstr "" #: src/language/stats/crosstabs.q:1426 msgid "Somers' d" msgstr "" #: src/language/stats/crosstabs.q:1428 msgid "Nominal by Interval" msgstr "" #: src/language/stats/crosstabs.q:1826 #, c-format msgid "Odds Ratio for %s" msgstr "" #: src/language/stats/crosstabs.q:1835 #, c-format msgid "For cohort %s = " msgstr "" #: src/ui/gui/aggregate.ui:24 msgid "Aggregate Data" msgstr "" #: src/ui/gui/aggregate.ui:126 msgid "_Break variable(s)" msgstr "" #: src/ui/gui/aggregate.ui:179 msgid "Variable Name: " msgstr "" #: src/ui/gui/aggregate.ui:215 msgid "Variable Label: " msgstr "" #: src/ui/gui/aggregate.ui:252 msgid "Function: " msgstr "" #: src/ui/gui/aggregate.ui:327 msgid "Argument 1: " msgstr "" #: src/ui/gui/aggregate.ui:364 msgid "Argument 2: " msgstr "" #: src/ui/gui/aggregate.ui:428 msgid "Aggregated variables" msgstr "" #: src/ui/gui/aggregate.ui:469 msgid "_Add aggregated variables to the active dataset" msgstr "" #: src/ui/gui/aggregate.ui:486 msgid "_Replace the current dataset with the aggregated variables" msgstr "" #: src/ui/gui/aggregate.ui:504 msgid "_Write a new data file containing only the aggregated variables" msgstr "" #: src/ui/gui/aggregate.ui:544 msgid "label" msgstr "" #: src/ui/gui/aggregate.ui:593 msgid "File is _already sorted on break variable(s)" msgstr "" #: src/ui/gui/aggregate.ui:609 msgid "Sort file before a_ggregating" msgstr "" #: src/ui/gui/aggregate.ui:630 msgid "Options for very large datasets" msgstr "" #: src/ui/gui/autorecode.ui:24 msgid "Automatic Recode" msgstr "" #: src/ui/gui/autorecode.ui:120 msgid "Variable -> New Name" msgstr "" #: src/ui/gui/autorecode.ui:145 msgid "_Lowest value" msgstr "" #: src/ui/gui/autorecode.ui:163 msgid "_Highest value" msgstr "" #: src/ui/gui/autorecode.ui:185 msgid "Recode starting from" msgstr "" #: src/ui/gui/autorecode.ui:204 msgid "_New Name" msgstr "" #: src/ui/gui/autorecode.ui:227 msgid "_Add New Name" msgstr "" #: src/ui/gui/autorecode.ui:285 msgid "_Use the same recoding scheme for all variables" msgstr "" #: src/ui/gui/autorecode.ui:301 msgid "Treat _blank string values as missing" msgstr "" #: src/ui/gui/binomial.ui:86 msgid "_Test Variable List:" msgstr "" #: src/ui/gui/binomial.ui:160 src/ui/gui/chi-square.ui:281 msgid "_Get from data" msgstr "" #: src/ui/gui/binomial.ui:181 src/ui/gui/indep-samples.ui:150 msgid "_Cut point:" msgstr "" #: src/ui/gui/binomial.ui:225 msgid "Define Dichotomy" msgstr "" #: src/ui/gui/binomial.ui:245 msgid "Test _Proportion:" msgstr "" #: src/ui/gui/compute.ui:32 msgid "Compute Variable: Type and Label" msgstr "" #: src/ui/gui/compute.ui:67 msgid "Use _expression as label" msgstr "" #: src/ui/gui/compute.ui:90 msgid "_Label:" msgstr "" #: src/ui/gui/compute.ui:194 msgid "_String" msgstr "" #: src/ui/gui/compute.ui:287 msgid "_Numeric" msgstr "" #: src/ui/gui/compute.ui:343 msgid "Compute Variable" msgstr "" #: src/ui/gui/compute.ui:381 msgid "Target _Variable:" msgstr "" #: src/ui/gui/compute.ui:412 msgid "_Type & Label..." msgstr "" #: src/ui/gui/compute.ui:469 msgid "=" msgstr "" #: src/ui/gui/compute.ui:526 msgid "_Numeric Expressions:" msgstr "" #: src/ui/gui/compute.ui:598 msgid "_Functions:" msgstr "" #: src/ui/gui/compute.ui:678 msgid "_If..." msgstr "" #: src/ui/gui/barchart.ui:24 msgid "Barchart" msgstr "" #: src/ui/gui/barchart.ui:112 msgid "Category A_xis:" msgstr "" #: src/ui/gui/barchart.ui:140 msgid "_N of cases" msgstr "" #: src/ui/gui/barchart.ui:158 msgid "_Cum. n of cases" msgstr "" #: src/ui/gui/barchart.ui:174 msgid "Other _summary function" msgstr "" #: src/ui/gui/barchart.ui:191 msgid "% of c_ases" msgstr "" #: src/ui/gui/barchart.ui:207 msgid "C_um. % of cases" msgstr "" #: src/ui/gui/barchart.ui:270 src/ui/gui/histogram.ui:100 msgid "_Variable:" msgstr "" #: src/ui/gui/barchart.ui:308 msgid "Bars Represent" msgstr "" #: src/ui/gui/barchart.ui:340 msgid "Category C_luster:" msgstr "" #: src/ui/gui/correlation.ui:24 msgid "Bivariate Correlations" msgstr "" #: src/ui/gui/correlation.ui:148 msgid "Pearso_n" msgstr "" #: src/ui/gui/correlation.ui:164 msgid "_Kendall's tau-b" msgstr "" #: src/ui/gui/correlation.ui:180 msgid "_Spearman" msgstr "" #: src/ui/gui/correlation.ui:200 msgid "Correlation Coefficients" msgstr "" #: src/ui/gui/correlation.ui:224 msgid "_Two-tailed" msgstr "" #: src/ui/gui/correlation.ui:241 msgid "One-tai_led" msgstr "" #: src/ui/gui/correlation.ui:262 msgid "Test of Significance" msgstr "" #: src/ui/gui/correlation.ui:275 msgid "_Flag significant correlations" msgstr "" #: src/ui/gui/count.ui:24 msgid "Count Occurrences of Values within Cases" msgstr "" #: src/ui/gui/count.ui:117 msgid "Numeric _Variables:" msgstr "" #: src/ui/gui/count.ui:147 msgid "_Target Variable:" msgstr "" #: src/ui/gui/count.ui:178 msgid "Target _Label:" msgstr "" #: src/ui/gui/count.ui:192 msgid "_Define Values..." msgstr "" #: src/ui/gui/count.ui:257 msgid "Count Values within Cases: Values to Count" msgstr "" #: src/ui/gui/count.ui:305 msgid "Values _to Count:" msgstr "" #: src/ui/gui/comments.ui:25 msgid "Data File Comments" msgstr "" #: src/ui/gui/comments.ui:49 msgid "Comments:" msgstr "" #: src/ui/gui/comments.ui:106 msgid "Display comments in output" msgstr "" #: src/ui/gui/comments.ui:127 msgid "Column Number: 0" msgstr "" #: src/ui/gui/crosstabs.ui:25 msgid "Crosstabs: Cells" msgstr "" #: src/ui/gui/crosstabs.ui:67 msgid "Cell Display" msgstr "" #: src/ui/gui/crosstabs.ui:99 msgid "Crosstabs" msgstr "" #: src/ui/gui/crosstabs.ui:150 msgid "_Rows" msgstr "" #: src/ui/gui/crosstabs.ui:195 msgid "_Columns" msgstr "" #: src/ui/gui/crosstabs.ui:242 msgid "_Format..." msgstr "" #: src/ui/gui/crosstabs.ui:256 src/ui/gui/examine.ui:267 msgid "_Statistics..." msgstr "" #: src/ui/gui/crosstabs.ui:270 msgid "Ce_lls..." msgstr "" #: src/ui/gui/crosstabs.ui:348 msgid "Crosstabs: Format" msgstr "" #: src/ui/gui/crosstabs.ui:371 msgid "Print tables" msgstr "" #: src/ui/gui/crosstabs.ui:387 msgid "Pivot" msgstr "" #: src/ui/gui/crosstabs.ui:403 src/ui/gui/sort.ui:157 msgid "Ascending" msgstr "" #: src/ui/gui/crosstabs.ui:455 msgid "Crosstabs: Statistics" msgstr "" #: src/ui/gui/chi-square.ui:30 msgid "Chi-Square Test" msgstr "" #: src/ui/gui/chi-square.ui:82 msgid "All categor_ies equal" msgstr "" #: src/ui/gui/chi-square.ui:103 msgid "_Values" msgstr "" #: src/ui/gui/chi-square.ui:159 msgid "Expected Values:" msgstr "" #: src/ui/gui/chi-square.ui:204 msgid "Test _Variables" msgstr "" #: src/ui/gui/chi-square.ui:298 msgid "Use _specified range" msgstr "" #: src/ui/gui/chi-square.ui:323 msgid "_Lower:" msgstr "" #: src/ui/gui/chi-square.ui:337 msgid "_Upper:" msgstr "" #: src/ui/gui/chi-square.ui:381 msgid "Expected Range:" msgstr "" #: src/ui/gui/descriptives.ui:131 src/ui/gui/factor.ui:797 #: src/ui/gui/recode.ui:638 msgid "_Variables:" msgstr "" #: src/ui/gui/descriptives.ui:176 msgid "S_tatistics:" msgstr "" #: src/ui/gui/descriptives.ui:230 msgid "_Exclude entire case if any selected variable is missing" msgstr "" #: src/ui/gui/descriptives.ui:247 msgid "_Include user-missing data in analysis" msgstr "" #: src/ui/gui/descriptives.ui:264 msgid "Save _Z-scores of selected variables as new variables" msgstr "" #: src/ui/gui/descriptives.ui:286 msgid "Options:" msgstr "" #: src/ui/gui/examine.ui:25 msgid "Explore" msgstr "" #: src/ui/gui/examine.ui:69 msgid "_Label Cases by:" msgstr "" #: src/ui/gui/examine.ui:116 msgid "_Factor List:" msgstr "" #: src/ui/gui/examine.ui:163 src/ui/gui/means.ui:126 msgid "_Dependent List:" msgstr "" #: src/ui/gui/examine.ui:331 msgid "Explore: Options" msgstr "" #: src/ui/gui/examine.ui:355 src/ui/gui/t-test.ui:81 msgid "Exclude cases _listwise" msgstr "" #: src/ui/gui/examine.ui:373 msgid "Exclude cases _pairwise" msgstr "" #: src/ui/gui/examine.ui:392 msgid "_Report values" msgstr "" #: src/ui/gui/examine.ui:449 msgid "Explore: Statistics" msgstr "" #: src/ui/gui/examine.ui:468 src/ui/gui/oneway.ui:576 msgid "_Descriptives" msgstr "" #: src/ui/gui/examine.ui:485 msgid "_Extremes" msgstr "" #: src/ui/gui/examine.ui:502 msgid "_Percentiles" msgstr "" #: src/ui/gui/goto-case.ui:31 msgid "Goto Case" msgstr "" #: src/ui/gui/goto-case.ui:52 msgid "Goto Case Number:" msgstr "" #: src/ui/gui/factor.ui:39 msgid "Factor Analysis: Rotation" msgstr "" #: src/ui/gui/factor.ui:70 msgid "_None" msgstr "" #: src/ui/gui/factor.ui:87 msgid "_Varimax" msgstr "" #: src/ui/gui/factor.ui:104 msgid "_Quartimax" msgstr "" #: src/ui/gui/factor.ui:123 msgid "_Equimax" msgstr "" #: src/ui/gui/factor.ui:146 msgid "Method" msgstr "" #: src/ui/gui/factor.ui:159 msgid "_Display rotated solution" msgstr "" #: src/ui/gui/factor.ui:181 src/ui/gui/factor.ui:582 msgid "Ma_ximum iterations for convergence:" msgstr "" #: src/ui/gui/factor.ui:241 src/ui/gui/factor.ui:255 msgid "Principal Components Analysis" msgstr "" #: src/ui/gui/factor.ui:246 src/ui/gui/factor.ui:258 msgid "Principal Axis Factoring" msgstr "" #: src/ui/gui/factor.ui:264 msgid "Factor Analysis: Extraction" msgstr "" #: src/ui/gui/factor.ui:290 msgid "_Method: " msgstr "" #: src/ui/gui/factor.ui:345 msgid "Co_rrelation matrix" msgstr "" #: src/ui/gui/factor.ui:361 msgid "Co_variance matrix" msgstr "" #: src/ui/gui/factor.ui:382 msgid "Analyze" msgstr "" #: src/ui/gui/factor.ui:407 msgid "_Unrotated factor solution" msgstr "" #: src/ui/gui/factor.ui:423 msgid "_Scree plot" msgstr "" #: src/ui/gui/factor.ui:443 src/ui/gui/histogram.ui:146 src/ui/gui/roc.ui:329 msgid "Display" msgstr "" #: src/ui/gui/factor.ui:526 msgid "_Number of factors:" msgstr "" #: src/ui/gui/factor.ui:563 msgid "Extract" msgstr "" #: src/ui/gui/factor.ui:640 msgid "Factor Analysis" msgstr "" #: src/ui/gui/factor.ui:672 src/ui/gui/data-editor.ui:266 msgid "_Descriptives..." msgstr "" #: src/ui/gui/factor.ui:685 msgid "_Extraction..." msgstr "" #: src/ui/gui/factor.ui:699 msgid "_Rotations..." msgstr "" #: src/ui/gui/find.ui:25 msgid "Find Case" msgstr "" #: src/ui/gui/find.ui:117 msgid "Variable:" msgstr "" #: src/ui/gui/find.ui:157 src/ui/gui/val-labs-dialog.ui:113 msgid "Value:" msgstr "" #: src/ui/gui/find.ui:180 msgid "Search value labels" msgstr "" #: src/ui/gui/find.ui:210 msgid "Regular expression Match" msgstr "" #: src/ui/gui/find.ui:227 msgid "Search substrings" msgstr "" #: src/ui/gui/find.ui:244 msgid "Wrap around" msgstr "" #: src/ui/gui/find.ui:260 msgid "Search backward" msgstr "" #: src/ui/gui/frequencies.ui:32 msgid "Frequencies: Frequency Tables" msgstr "" #: src/ui/gui/frequencies.ui:67 msgid "_Always" msgstr "" #: src/ui/gui/frequencies.ui:85 msgid "_Never" msgstr "" #: src/ui/gui/frequencies.ui:107 msgid "If no _more than " msgstr "" #: src/ui/gui/frequencies.ui:129 src/ui/gui/frequencies.ui:454 msgid "100" msgstr "" #: src/ui/gui/frequencies.ui:145 msgid "values" msgstr "" #: src/ui/gui/frequencies.ui:167 msgid "Display frequency tables" msgstr "" #: src/ui/gui/frequencies.ui:194 msgid "A_scending value" msgstr "" #: src/ui/gui/frequencies.ui:212 msgid "D_escending value" msgstr "" #: src/ui/gui/frequencies.ui:230 msgid "Ascending _frequency" msgstr "" #: src/ui/gui/frequencies.ui:248 msgid "Descending f_requency" msgstr "" #: src/ui/gui/frequencies.ui:271 msgid "Order by" msgstr "" #: src/ui/gui/frequencies.ui:324 msgid "Frequencies: Charts" msgstr "" #: src/ui/gui/frequencies.ui:356 msgid "Scale:" msgstr "" #: src/ui/gui/frequencies.ui:366 msgid "_Frequencies" msgstr "" #: src/ui/gui/frequencies.ui:383 msgid "_Percentages" msgstr "" #: src/ui/gui/frequencies.ui:407 msgid "Exclude values _below " msgstr "" #: src/ui/gui/frequencies.ui:422 msgid "Exclude values _above " msgstr "" #: src/ui/gui/frequencies.ui:441 src/ui/gui/reliability.ui:227 msgid "0" msgstr "" #: src/ui/gui/frequencies.ui:469 msgid "Chart Formatting" msgstr "" #: src/ui/gui/frequencies.ui:494 msgid "Draw _histograms" msgstr "" #: src/ui/gui/frequencies.ui:510 msgid "Superimpose _normal curve" msgstr "" #: src/ui/gui/frequencies.ui:530 msgid "Histograms" msgstr "" #: src/ui/gui/frequencies.ui:555 msgid "Draw _bar charts" msgstr "" #: src/ui/gui/frequencies.ui:575 msgid "Bar Charts" msgstr "" #: src/ui/gui/frequencies.ui:600 msgid "Draw _pie charts" msgstr "" #: src/ui/gui/frequencies.ui:616 msgid "Include slices for _missing values" msgstr "" #: src/ui/gui/frequencies.ui:636 msgid "Pie Charts" msgstr "" #: src/ui/gui/frequencies.ui:725 src/ui/gui/rank.ui:489 msgid "_Variable(s):" msgstr "" #: src/ui/gui/frequencies.ui:769 msgid "_Statistics:" msgstr "" #: src/ui/gui/frequencies.ui:783 msgid "Include _missing values" msgstr "" #: src/ui/gui/frequencies.ui:806 msgid "Ch_arts..." msgstr "" #: src/ui/gui/frequencies.ui:821 msgid "Frequency _Tables..." msgstr "" #: src/ui/gui/histogram.ui:24 msgid "Histogram" msgstr "" #: src/ui/gui/histogram.ui:126 msgid "_Display normal curve" msgstr "" #: src/ui/gui/indep-samples.ui:25 src/ui/gui/k-independent.ui:35 msgid "Define Groups" msgstr "" #: src/ui/gui/indep-samples.ui:75 msgid "Group_2 value:" msgstr "" #: src/ui/gui/indep-samples.ui:89 msgid "Group_1 value:" msgstr "" #: src/ui/gui/indep-samples.ui:190 msgid "_Use specified values:" msgstr "" #: src/ui/gui/indep-samples.ui:259 msgid "Independent-Samples T Test" msgstr "" #: src/ui/gui/indep-samples.ui:319 msgid "_Define Groups..." msgstr "" #: src/ui/gui/indep-samples.ui:401 src/ui/gui/t-test.ui:211 msgid "_Test Variable(s):" msgstr "" #: src/ui/gui/indep-samples.ui:454 src/ui/gui/k-independent.ui:165 msgid "_Grouping Variable:" msgstr "" #: src/ui/gui/k-independent.ui:63 msgid "_Upper limit:" msgstr "" #: src/ui/gui/k-independent.ui:77 msgid "_Lower limit:" msgstr "" #: src/ui/gui/k-independent.ui:136 msgid "Tests for Several Independent Samples" msgstr "" #: src/ui/gui/k-independent.ui:208 src/ui/gui/ks-one-sample.ui:131 msgid "Test _Variable List:" msgstr "" #: src/ui/gui/k-independent.ui:320 msgid "_Define Groups" msgstr "" #: src/ui/gui/k-independent.ui:365 msgid "_Kruskal-Wallis H" msgstr "" #: src/ui/gui/k-independent.ui:382 src/ui/gui/runs.ui:140 msgid "_Median" msgstr "" #: src/ui/gui/k-means.ui:24 msgid "K-Means Cluster Analysis" msgstr "" #: src/ui/gui/k-means.ui:122 msgid "N_umber of Clusters: " msgstr "" #: src/ui/gui/k-related.ui:24 msgid "Tests for Several Related Samples" msgstr "" #: src/ui/gui/k-related.ui:113 msgid "_Test Variables:" msgstr "" #: src/ui/gui/k-related.ui:145 msgid "_Friedman" msgstr "" #: src/ui/gui/k-related.ui:161 msgid "_Kendall's W" msgstr "" #: src/ui/gui/k-related.ui:177 msgid "_Cochran's Q" msgstr "" #: src/ui/gui/ks-one-sample.ui:163 msgid "_Normal" msgstr "" #: src/ui/gui/ks-one-sample.ui:181 msgid "_Poisson" msgstr "" #: src/ui/gui/ks-one-sample.ui:198 msgid "_Uniform" msgstr "" #: src/ui/gui/ks-one-sample.ui:213 msgid "_Exponential" msgstr "" #: src/ui/gui/ks-one-sample.ui:232 msgid "Test Distribution" msgstr "" #: src/ui/gui/logistic.ui:42 msgid "Logistic Regression: Options" msgstr "" #: src/ui/gui/logistic.ui:66 msgid "CI for _exp(B): " msgstr "" #: src/ui/gui/logistic.ui:97 msgid "%" msgstr "" #: src/ui/gui/logistic.ui:146 msgid "Classification cu_toff: " msgstr "" #: src/ui/gui/logistic.ui:159 msgid "_Maximum Iterations: " msgstr "" #: src/ui/gui/logistic.ui:177 msgid "Include _constant in model" msgstr "" #: src/ui/gui/logistic.ui:219 msgid "Logistic Regression" msgstr "" #: src/ui/gui/logistic.ui:364 src/ui/gui/regression.ui:185 msgid "_Dependent" msgstr "" #: src/ui/gui/logistic.ui:412 src/ui/gui/regression.ui:232 msgid "_Independent" msgstr "" #: src/ui/gui/means.ui:25 msgid "Means" msgstr "" #: src/ui/gui/means.ui:179 msgid "_Independent List:" msgstr "" #: src/ui/gui/missing-val-dialog.ui:48 msgid "_No missing values" msgstr "" #: src/ui/gui/missing-val-dialog.ui:136 msgid "_Discrete missing values" msgstr "" #: src/ui/gui/missing-val-dialog.ui:172 msgid "_Low:" msgstr "" #: src/ui/gui/missing-val-dialog.ui:197 msgid "_High:" msgstr "" #: src/ui/gui/missing-val-dialog.ui:221 msgid "Di_screte value:" msgstr "" #: src/ui/gui/missing-val-dialog.ui:245 msgid "_Range plus one optional discrete missing value" msgstr "" #: src/ui/gui/oneway.ui:25 msgid "One-Way ANOVA: Contrasts" msgstr "" #: src/ui/gui/oneway.ui:107 msgid "_Coefficients:" msgstr "" #: src/ui/gui/oneway.ui:161 msgid "Coefficient Total: " msgstr "" #: src/ui/gui/oneway.ui:198 msgid "Contrast 1 of 1" msgstr "" #: src/ui/gui/oneway.ui:234 msgid "One-Way ANOVA: Post-Hoc" msgstr "" #: src/ui/gui/oneway.ui:270 msgid "Games Howell" msgstr "" #: src/ui/gui/oneway.ui:287 msgid "Fisher's LSD" msgstr "" #: src/ui/gui/oneway.ui:379 msgid "One-Way ANOVA" msgstr "" #: src/ui/gui/oneway.ui:408 msgid "_Factor:" msgstr "" #: src/ui/gui/oneway.ui:451 msgid "Dependent _Variable(s):" msgstr "" #: src/ui/gui/oneway.ui:593 msgid "_Homogeneity" msgstr "" #: src/ui/gui/oneway.ui:637 msgid "Post-Hoc..." msgstr "" #: src/ui/gui/oneway.ui:652 msgid "_Contrasts..." msgstr "" #: src/ui/gui/options.ui:25 msgid "Options Case" msgstr "" #: src/ui/gui/options.ui:55 msgid "Display _Labels" msgstr "" #: src/ui/gui/options.ui:71 msgid "Display _Names" msgstr "" #: src/ui/gui/options.ui:99 msgid "Sort by L_abel" msgstr "" #: src/ui/gui/options.ui:115 msgid "Sort by Na_me" msgstr "" #: src/ui/gui/options.ui:131 msgid "Do not S_ort" msgstr "" #: src/ui/gui/options.ui:159 msgid "Variable Lists" msgstr "" #: src/ui/gui/options.ui:184 msgid "Ma_ximize" msgstr "" #: src/ui/gui/options.ui:199 msgid "_Raise" msgstr "" #: src/ui/gui/options.ui:214 msgid "Aler_t" msgstr "" #: src/ui/gui/options.ui:233 msgid "Output Window Action" msgstr "" #: src/ui/gui/paired-samples.ui:147 msgid "_Test Pair(s):" msgstr "" #: src/ui/gui/rank.ui:30 msgid "Rank Cases: Types" msgstr "" #: src/ui/gui/rank.ui:57 msgid "Sum of case _weights" msgstr "" #: src/ui/gui/rank.ui:74 msgid "Fractional rank as _%" msgstr "" #: src/ui/gui/rank.ui:92 msgid "_Fractional rank" msgstr "" #: src/ui/gui/rank.ui:109 msgid "_Savage score" msgstr "" #: src/ui/gui/rank.ui:125 msgid "_Rank" msgstr "" #: src/ui/gui/rank.ui:147 msgid "N_tiles" msgstr "" #: src/ui/gui/rank.ui:195 msgid "_Proportion Estimates" msgstr "" #: src/ui/gui/rank.ui:213 msgid "_Normal Scores" msgstr "" #: src/ui/gui/rank.ui:251 msgid "_Blom" msgstr "" #: src/ui/gui/rank.ui:269 msgid "Tuke_y" msgstr "" #: src/ui/gui/rank.ui:287 msgid "Ran_kit" msgstr "" #: src/ui/gui/rank.ui:305 msgid "_Van der Waerden" msgstr "" #: src/ui/gui/rank.ui:328 msgid "Proportion Estimation Formula" msgstr "" #: src/ui/gui/rank.ui:369 msgid "Rank Cases" msgstr "" #: src/ui/gui/rank.ui:434 msgid "_By:" msgstr "" #: src/ui/gui/rank.ui:595 msgid "_Smallest Value" msgstr "" #: src/ui/gui/rank.ui:613 msgid "_Largest Value" msgstr "" #: src/ui/gui/rank.ui:637 msgid "Assign rank 1 to:" msgstr "" #: src/ui/gui/rank.ui:656 msgid "_Display summary tables" msgstr "" #: src/ui/gui/rank.ui:679 msgid "Rank T_ypes" msgstr "" #: src/ui/gui/rank.ui:694 msgid "_Ties..." msgstr "" #: src/ui/gui/rank.ui:756 msgid "Rank Cases: Ties" msgstr "" #: src/ui/gui/rank.ui:788 msgid "_Mean" msgstr "" #: src/ui/gui/rank.ui:806 msgid "_Low" msgstr "" #: src/ui/gui/rank.ui:825 msgid "_High" msgstr "" #: src/ui/gui/rank.ui:851 msgid "_Sequential ranks to unique values" msgstr "" #: src/ui/gui/rank.ui:875 msgid "Rank Assigned to Ties" msgstr "" #: src/ui/gui/runs.ui:155 msgid "M_ean" msgstr "" #: src/ui/gui/runs.ui:171 msgid "Mo_de" msgstr "" #: src/ui/gui/runs.ui:191 msgid "_Custom:" msgstr "" #: src/ui/gui/runs.ui:230 msgid "Cut Point" msgstr "" #: src/ui/gui/sort.ui:25 msgid "Sort Cases" msgstr "" #: src/ui/gui/sort.ui:101 msgid "Sort by:" msgstr "" #: src/ui/gui/sort.ui:174 msgid "Descending" msgstr "" #: src/ui/gui/sort.ui:196 msgid "Sort Order" msgstr "" #: src/ui/gui/split-file.ui:25 msgid "Split File" msgstr "" #: src/ui/gui/split-file.ui:103 msgid "Anal_yze all cases. Do not create groups." msgstr "" #: src/ui/gui/split-file.ui:121 msgid "Compare _groups." msgstr "" #: src/ui/gui/split-file.ui:140 msgid "Organize ou_tput by groups." msgstr "" #: src/ui/gui/split-file.ui:225 msgid "Groups _based on:" msgstr "" #: src/ui/gui/split-file.ui:255 msgid "_Sort the file by grouping variables." msgstr "" #: src/ui/gui/split-file.ui:273 msgid "_File is already sorted." msgstr "" #: src/ui/gui/split-file.ui:334 msgid "Current Status : " msgstr "" #: src/ui/gui/split-file.ui:348 msgid "Analysis by groups is off" msgstr "" #: src/ui/gui/recode.ui:135 msgid "System _Missing" msgstr "" #: src/ui/gui/recode.ui:150 msgid "Co_py old values" msgstr "" #: src/ui/gui/recode.ui:172 msgid "Va_lue: " msgstr "" #: src/ui/gui/recode.ui:276 msgid "Conver_t numeric strings to numbers (`5' -> 5)" msgstr "" #: src/ui/gui/recode.ui:297 msgid "Output variables are _strings" msgstr "" #: src/ui/gui/recode.ui:318 msgid "Width: " msgstr "" #: src/ui/gui/recode.ui:499 msgid "_Name:" msgstr "" #: src/ui/gui/recode.ui:527 msgid "La_bel:" msgstr "" #: src/ui/gui/recode.ui:556 msgid "Chan_ge" msgstr "" #: src/ui/gui/recode.ui:584 msgid "Output Variable" msgstr "" #: src/ui/gui/recode.ui:658 msgid "Old and New Va_lues..." msgstr "" #: src/ui/gui/regression.ui:51 msgid "S_tatistics..." msgstr "" #: src/ui/gui/regression.ui:272 msgid "Regression: Save" msgstr "" #: src/ui/gui/regression.ui:290 src/ui/gui/univariate.ui:42 msgid "_Predicted values" msgstr "" #: src/ui/gui/regression.ui:307 src/ui/gui/univariate.ui:59 msgid "_Residuals" msgstr "" #: src/ui/gui/regression.ui:351 msgid "Regression: Statistics" msgstr "" #: src/ui/gui/regression.ui:393 src/ui/gui/univariate.ui:143 msgid "S_tatistics" msgstr "" #: src/ui/gui/reliability.ui:34 msgid "Alpha" msgstr "" #: src/ui/gui/reliability.ui:43 msgid "Reliability Analysis" msgstr "" #: src/ui/gui/reliability.ui:144 msgid "_Items:" msgstr "" #: src/ui/gui/reliability.ui:166 msgid "_Model: " msgstr "" #: src/ui/gui/reliability.ui:212 msgid "_Variables in first split:" msgstr "" #: src/ui/gui/reliability.ui:259 msgid "Show _descriptives for scale if item is deleted" msgstr "" #: src/ui/gui/roc.ui:145 msgid "_Test Variable:" msgstr "" #: src/ui/gui/roc.ui:175 msgid "_State Variable:" msgstr "" #: src/ui/gui/roc.ui:202 msgid "_Value of state variable:" msgstr "" #: src/ui/gui/roc.ui:249 msgid "ROC C_urve" msgstr "" #: src/ui/gui/roc.ui:269 msgid "_With diagonal reference line" msgstr "" #: src/ui/gui/roc.ui:293 msgid "Standard _Error and Confidence Interval" msgstr "" #: src/ui/gui/roc.ui:309 msgid "_Coordinate points of the ROC Curve" msgstr "" #: src/ui/gui/scatterplot.ui:25 msgid "Scatterplot" msgstr "" #: src/ui/gui/scatterplot.ui:56 msgid "_X Axis:" msgstr "" #: src/ui/gui/scatterplot.ui:100 msgid "_Y Axis:" msgstr "" #: src/ui/gui/select-cases.ui:37 msgid "Select Cases: Range" msgstr "" #: src/ui/gui/select-cases.ui:87 msgid "First case" msgstr "" #: src/ui/gui/select-cases.ui:99 msgid "Last case" msgstr "" #: src/ui/gui/select-cases.ui:111 msgid "Observation" msgstr "" #: src/ui/gui/select-cases.ui:161 msgid "Select Cases" msgstr "" #: src/ui/gui/select-cases.ui:313 msgid "Use filter variable" msgstr "" #: src/ui/gui/select-cases.ui:380 msgid "Based on time or case range" msgstr "" #: src/ui/gui/select-cases.ui:395 msgid "Range..." msgstr "" #: src/ui/gui/select-cases.ui:444 msgid "Random sample of cases" msgstr "" #: src/ui/gui/select-cases.ui:460 msgid "Sample..." msgstr "" #: src/ui/gui/select-cases.ui:508 msgid "If condition is satisfied" msgstr "" #: src/ui/gui/select-cases.ui:523 msgid "If..." msgstr "" #: src/ui/gui/select-cases.ui:567 msgid "All Cases" msgstr "" #: src/ui/gui/select-cases.ui:581 msgid "Select" msgstr "" #: src/ui/gui/select-cases.ui:608 msgid "Filtered" msgstr "" #: src/ui/gui/select-cases.ui:625 msgid "Deleted" msgstr "" #: src/ui/gui/select-cases.ui:647 msgid "Unselected Cases Are" msgstr "" #: src/ui/gui/select-cases.ui:694 msgid "Select Cases: Random Sample" msgstr "" #: src/ui/gui/select-cases.ui:756 msgid "Sample Size" msgstr "" #: src/ui/gui/t-test.ui:25 msgid "Options" msgstr "" #: src/ui/gui/t-test.ui:63 msgid "Exclude cases _analysis by analysis" msgstr "" #: src/ui/gui/t-test.ui:148 msgid "One - Sample T Test" msgstr "" #: src/ui/gui/t-test.ui:265 msgid "Test _Value: " msgstr "" #: src/ui/gui/text-data-import.ui:32 msgid "Select the first line of the data file that contains data." msgstr "" #: src/ui/gui/text-data-import.ui:54 msgid "Line above selected line contains variable names" msgstr "" #: src/ui/gui/text-data-import.ui:80 msgid "" "Check the data formats displayed below and fix any that are incorrect. You " "may set other variable properties now or later." msgstr "" #: src/ui/gui/text-data-import.ui:121 msgid "Variables" msgstr "" #: src/ui/gui/text-data-import.ui:152 msgid "Data Preview" msgstr "" #: src/ui/gui/text-data-import.ui:181 msgid "" "This assistant will guide you through the process of importing data into " "PSPP from a text file with one line per case, in which fields are separated " "by tabs, commas, or other delimiters.\n" "\n" "\tThe selected file contains N lines of text. Only the first M of these " "will be shown for preview purposes in the following screens. You may choose " "below how much of the file should actually be imported." msgstr "" #: src/ui/gui/text-data-import.ui:252 msgid "All cases" msgstr "" #: src/ui/gui/text-data-import.ui:272 msgid "Amount to Import" msgstr "" #: src/ui/gui/text-data-import.ui:325 msgid "C_ustom" msgstr "" #: src/ui/gui/text-data-import.ui:341 msgid "Slas_h (/)" msgstr "" #: src/ui/gui/text-data-import.ui:357 msgid "Semicolo_n (;)" msgstr "" #: src/ui/gui/text-data-import.ui:373 msgid "P_ipe (|)" msgstr "" #: src/ui/gui/text-data-import.ui:389 msgid "H_yphen (-)" msgstr "" #: src/ui/gui/text-data-import.ui:405 msgid "Co_mma (,)" msgstr "" #: src/ui/gui/text-data-import.ui:421 msgid "_Colon (:)" msgstr "" #: src/ui/gui/text-data-import.ui:437 msgid "Ban_g (!)" msgstr "" #: src/ui/gui/text-data-import.ui:453 msgid "Ta_b" msgstr "" #: src/ui/gui/text-data-import.ui:469 msgid "_Space" msgstr "" #: src/ui/gui/text-data-import.ui:490 msgid "Separators" msgstr "" #: src/ui/gui/text-data-import.ui:541 msgid "Quote separator characters with" msgstr "" #: src/ui/gui/text-data-import.ui:561 msgid "Quoting" msgstr "" #: src/ui/gui/text-data-import.ui:599 msgid "Fields Preview" msgstr "" #: src/ui/gui/text-data-import.ui:622 msgid "" "Enter below the sheet number and the cell range which you wish to import." msgstr "" #: src/ui/gui/text-data-import.ui:670 msgid "_Cells: " msgstr "" #: src/ui/gui/text-data-import.ui:684 msgid "_Sheet Index: " msgstr "" #: src/ui/gui/text-data-import.ui:695 msgid "Use first row as _variable names" msgstr "" #: src/ui/gui/text-data-import.ui:717 msgid "Cells to Import" msgstr "" #: src/ui/gui/transpose.ui:24 msgid "Transpose" msgstr "" #: src/ui/gui/transpose.ui:91 msgid "Name Variable:" msgstr "" #: src/ui/gui/transpose.ui:127 msgid "Variable(s):" msgstr "" #: src/ui/gui/univariate.ui:25 msgid "Univariate: Save" msgstr "" #: src/ui/gui/univariate.ui:103 msgid "Univariate: Statistics" msgstr "" #: src/ui/gui/univariate.ui:178 msgid "Univariate" msgstr "" #: src/ui/gui/univariate.ui:281 msgid "_Dependent Variable" msgstr "" #: src/ui/gui/univariate.ui:329 msgid "_Fixed Factors" msgstr "" #: src/ui/gui/val-labs-dialog.ui:101 msgid "Value Label:" msgstr "" #: src/ui/gui/data-editor.ui:33 msgid "Information Area" msgstr "" #: src/ui/gui/data-editor.ui:55 msgid "Case Counter Area" msgstr "" #: src/ui/gui/data-editor.ui:80 msgid "Filter Use Status Area" msgstr "" #: src/ui/gui/data-editor.ui:106 msgid "Weight Status Area" msgstr "" #: src/ui/gui/data-editor.ui:132 msgid "Split File Status Area" msgstr "" #: src/ui/gui/data-editor.ui:154 msgid "_View" msgstr "" #: src/ui/gui/data-editor.ui:157 msgid "_Status Bar" msgstr "" #: src/ui/gui/data-editor.ui:163 msgid "_Font..." msgstr "" #: src/ui/gui/data-editor.ui:167 msgid "_Grid Lines" msgstr "" #: src/ui/gui/data-editor.ui:171 msgid "Value _Labels" msgstr "" #: src/ui/gui/data-editor.ui:182 msgid "_Variables" msgstr "" #: src/ui/gui/data-editor.ui:192 msgid "_Sort Cases..." msgstr "" #: src/ui/gui/data-editor.ui:196 msgid "_Transpose..." msgstr "" #: src/ui/gui/data-editor.ui:200 msgid "_Aggregate..." msgstr "" #: src/ui/gui/data-editor.ui:206 msgid "S_plit File..." msgstr "" #: src/ui/gui/data-editor.ui:210 msgid "Select _Cases..." msgstr "" #: src/ui/gui/data-editor.ui:214 msgid "_Weight Cases..." msgstr "" #: src/ui/gui/data-editor.ui:220 msgid "_Transform" msgstr "" #: src/ui/gui/data-editor.ui:223 msgid "_Compute..." msgstr "" #: src/ui/gui/data-editor.ui:227 msgid "Cou_nt..." msgstr "" #: src/ui/gui/data-editor.ui:231 msgid "Ran_k Cases..." msgstr "" #: src/ui/gui/data-editor.ui:235 msgid "Auto_matic Recode..." msgstr "" #: src/ui/gui/data-editor.ui:241 msgid "Recode into _Same Variables..." msgstr "" #: src/ui/gui/data-editor.ui:245 msgid "Recode into _Different Variables..." msgstr "" #: src/ui/gui/data-editor.ui:251 msgid "_Run Pending Transforms" msgstr "" #: src/ui/gui/data-editor.ui:257 msgid "_Analyze" msgstr "" #: src/ui/gui/data-editor.ui:260 msgid "_Descriptive Statistics" msgstr "" #: src/ui/gui/data-editor.ui:262 msgid "_Frequencies..." msgstr "" #: src/ui/gui/data-editor.ui:270 msgid "_Explore..." msgstr "" #: src/ui/gui/data-editor.ui:274 msgid "_Crosstabs..." msgstr "" #: src/ui/gui/data-editor.ui:279 msgid "Compare _Means" msgstr "" #: src/ui/gui/data-editor.ui:281 msgid "_Means..." msgstr "" #: src/ui/gui/data-editor.ui:285 msgid "_One Sample T Test..." msgstr "" #: src/ui/gui/data-editor.ui:289 msgid "_Independent Samples T Test..." msgstr "" #: src/ui/gui/data-editor.ui:293 msgid "_Paired Samples T Test..." msgstr "" #: src/ui/gui/data-editor.ui:297 msgid "One Way _ANOVA..." msgstr "" #: src/ui/gui/data-editor.ui:302 msgid "_Univariate Analysis..." msgstr "" #: src/ui/gui/data-editor.ui:306 msgid "Bivariate _Correlation..." msgstr "" #: src/ui/gui/data-editor.ui:310 msgid "_K-Means Cluster..." msgstr "" #: src/ui/gui/data-editor.ui:314 msgid "_Factor Analysis..." msgstr "" #: src/ui/gui/data-editor.ui:318 msgid "Re_liability..." msgstr "" #: src/ui/gui/data-editor.ui:322 msgid "_Regression" msgstr "" #: src/ui/gui/data-editor.ui:325 msgid "_Linear..." msgstr "" #: src/ui/gui/data-editor.ui:329 msgid "_Binary Logistic..." msgstr "" #: src/ui/gui/data-editor.ui:335 msgid "_Non-Parametric Statistics" msgstr "" #: src/ui/gui/data-editor.ui:338 msgid "_Chi Square..." msgstr "" #: src/ui/gui/data-editor.ui:342 msgid "_Binomial..." msgstr "" #: src/ui/gui/data-editor.ui:346 msgid "_Runs..." msgstr "" #: src/ui/gui/data-editor.ui:350 msgid "_1 Sample K-S..." msgstr "" #: src/ui/gui/data-editor.ui:354 msgid "_2 Related Samples..." msgstr "" #: src/ui/gui/data-editor.ui:358 msgid "_K Related Samples..." msgstr "" #: src/ui/gui/data-editor.ui:362 msgid "K _Independent Samples..." msgstr "" #: src/ui/gui/data-editor.ui:368 msgid "ROC Cur_ve..." msgstr "" #: src/ui/gui/data-editor.ui:374 msgid "_Graphs" msgstr "" #: src/ui/gui/data-editor.ui:377 msgid "_Scatterplot" msgstr "" #: src/ui/gui/data-editor.ui:381 msgid "_Histogram" msgstr "" #: src/ui/gui/data-editor.ui:385 msgid "_Barchart" msgstr "" #: src/ui/gui/data-editor.ui:391 msgid "_Utilities" msgstr "" #: src/ui/gui/data-editor.ui:394 msgid "_Variables..." msgstr "" #: src/ui/gui/data-editor.ui:398 msgid "Data File _Comments..." msgstr "" #: src/ui/gui/output-window.ui:71 msgid "_Print..." msgstr "" #: src/ui/gui/output-window.ui:76 msgid "_Export..." msgstr "" #: src/ui/gui/output-window.ui:92 msgid "Select _All" msgstr "" #: src/ui/gui/syntax-editor.ui:27 msgid "Syntax" msgstr "" #: src/ui/gui/syntax-editor.ui:31 msgid "Data" msgstr "" #: src/ui/gui/syntax-editor.ui:41 msgid "_Save" msgstr "" #: src/ui/gui/syntax-editor.ui:46 msgid "Save _As" msgstr "" #: src/ui/gui/syntax-editor.ui:53 msgid "_Print" msgstr "" #: src/ui/gui/syntax-editor.ui:84 msgid "_Delete" msgstr "" #: src/ui/gui/syntax-editor.ui:90 msgid "_Undo" msgstr "" #: src/ui/gui/syntax-editor.ui:94 msgid "_Redo" msgstr "" #: src/ui/gui/syntax-editor.ui:100 msgid "_Find" msgstr "" #: src/ui/gui/syntax-editor.ui:106 msgid "_Run" msgstr "" #: src/ui/gui/syntax-editor.ui:109 msgid "_All" msgstr "" #: src/ui/gui/syntax-editor.ui:113 msgid "_Selection" msgstr "" #: src/ui/gui/syntax-editor.ui:117 msgid "_Current Line" msgstr "" #: src/ui/gui/syntax-editor.ui:122 msgid "_To End" msgstr "" #: src/ui/gui/var-type-dialog.ui:99 msgid "Scientific notation" msgstr "" #: src/ui/gui/var-type-dialog.ui:150 msgid "Custom currency" msgstr "" #: src/ui/gui/var-type-dialog.ui:267 msgid "positive" msgstr "" #: src/ui/gui/var-type-dialog.ui:279 msgid "negative" msgstr "" #: src/ui/gui/var-type-dialog.ui:293 msgid "Sample" msgstr "" #: src/ui/gui/var-type-dialog.ui:350 msgid "Width:" msgstr "" #: src/ui/gui/var-type-dialog.ui:396 msgid "Decimal Places:" msgstr "" #: src/ui/gui/weight.ui:24 msgid "Weight Cases" msgstr "" #: src/ui/gui/weight.ui:100 msgid "Weight cases by" msgstr "" #: src/ui/gui/weight.ui:144 msgid "Frequency Variable" msgstr "" #: src/ui/gui/weight.ui:198 msgid "Current Status: " msgstr "" #. TRANSLATORS: This is the application name in the desktop file #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:7 #: src/ui/gui/org.fsf.pspp.desktop.in:7 msgid "GNU PSPP" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:8 msgid "GNU PSPP is a program for statistical analysis of sampled data" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:10 msgid "" "GNU PSPP is a program for the statistical analysis of sampled data. It is a " "Free replacement for the proprietary program SPSS, and appears very similar " "to it with a few exceptions. The most important of these exceptions are, " "that there are no “time bombs”; your copy of PSPP will not “expire” or " "deliberately stop working in the future. Neither are there any artificial " "limits on the number of cases or variables which you can use. There are no " "additional packages to purchase in order to get “advanced” functions; all " "functionality that PSPP currently supports is in the core package." msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:11 msgid "" "PSPP is a stable and reliable application. It can perform descriptive " "statistics, T-tests, anova, linear and logistic regression, measures of " "association, cluster analysis, reliability and factor analysis, non-" "parametric tests and more. Its backend is designed to perform its analyses " "as fast as possible, regardless of the size of the input data. You can use " "PSPP with its graphical interface or the more traditional syntax commands." msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:12 msgid "A brief list of some of the PSPP's features." msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:14 msgid "Support for over 1 billion cases" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:15 msgid "Support for over 1 billion variables" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:16 msgid "Syntax and data files which are compatible with those of SPSS" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:17 msgid "A choice of terminal or graphical user interface" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:18 msgid "A choice of text, postscript, pdf, opendocument or html output formats" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:19 msgid "" "Inter-operability with: LibreOffice, Apache OpenOffice, Gnumeric and other " "free software" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:20 msgid "Easy data import from spreadsheets, text files and database sources" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:21 msgid "" "The capability to open, analyse and edit two or more datasets concurrently" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:22 msgid "A user interface supporting all common character sets" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:23 msgid "A user interface has been translated to multiple languages" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:24 msgid "Very fast statistical procedures, even on very large data sets" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:25 msgid "No license fees and no expiration period" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:26 msgid "No unethical “end user license agreements”" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:27 msgid "A fully indexed user manual" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:28 msgid "Freedom ensured; It is licensed under the GPLv3 or later" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:29 msgid "" "Portability; Runs on many different computers and many different operating " "systems" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:31 msgid "" "PSPP is particularly aimed at statisticians, social scientists and students " "requiring fast convenient analysis of sampled data." msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:41 msgid "GNU PSPP Variable View" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:54 msgid "Free Software Foundation" msgstr "" #: src/ui/gui/org.fsf.pspp.desktop.in:8 msgid "Statistical Software" msgstr "" #: src/ui/gui/org.fsf.pspp.desktop.in:9 msgid "Analyze statistical data with a free alternative to SPSS" msgstr "" #. TRANSLATORS: Do not translate this string. Keep it as is, verbatim. #: src/ui/gui/org.fsf.pspp.desktop.in:12 msgid "pspp" msgstr "" #. TRANSLATORS: You must keep all ";" - also at the end of line. #: src/ui/gui/org.fsf.pspp.desktop.in:17 msgid "statistics;analysis;spss;" msgstr "" pspp-1.4.1/po/LINGUAS0000644000175000017500000000007613673465023013572 0ustar00blpblp00000000000000ca cs de el es fr gl hu ja lt nl pl pt_BR ru sl tr uk zh_CN pspp-1.4.1/po/ca.po0000644000175000017500000126763313725012645013503 0ustar00blpblp00000000000000# Catalan messages for PSPP # Copyright (C) 2009 Free Software Foundation, Inc. # This file is distributed under the same licence as the pspp package. # Francesc Josep Miguel Quesada, 2009. # Palmira Payá Sanchez, 2009. # Javier Gómez Serrano, 2009. # Francesc Josep Miguel Quesada , 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017. msgid "" msgstr "" "Project-Id-Version: pspp-1.0.1\n" "Report-Msgid-Bugs-To: pspp-dev@gnu.org\n" "PO-Revision-Date: 2017-09-22 22:35+0200\n" "Last-Translator: Francesc Josep Miguel Quesada \n" "Language-Team: Catalan \n" "Language: ca\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Bugs: Report translation errors to the Language-Team address.\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Lokalize 1.5\n" #: src/data/any-reader.c:72 src/data/encrypted-file.c:78 #, c-format msgid "An error occurred while opening `%s': %s." msgstr "S'ha produït un error en obrir `%s': %s." #: src/data/any-reader.c:93 src/language/lexer/lexer.c:1633 #, c-format msgid "Error reading `%s': %s." msgstr "Error leyendo `%s': %s." #: src/data/any-reader.c:114 #, c-format msgid "`%s' is not a system or portable file." msgstr "`%s' no és un arxiu del sistema o portàtil." #: src/data/any-reader.c:123 src/data/any-writer.c:66 msgid "The inline file is not allowed here." msgstr "L'arxiu en línia no està permès aquí." #: src/data/any-reader.c:205 #, c-format msgid "" "Cannot read from dataset %s because no dictionary or data has been written " "to it yet." msgstr "" "No es pot llegir de l'arxius de dades actiu %s perquè no s'ha omplert encara " "amb cap diccionari o dades." #: src/data/any-reader.c:260 src/language/data-io/dataset.c:253 msgid "Dataset" msgstr "Arxiu de dades" #: src/data/calendar.c:100 #, c-format msgid "Month %d is not in acceptable range of 0 to 13." msgstr "El mes %d no està a l'interval acceptable de 0 a 13." #: src/data/calendar.c:110 #, c-format msgid "Day %d is not in acceptable range of 0 to 31." msgstr "El dia %d no hi és a l'interval acceptable de 0 a 31." #: src/data/calendar.c:119 #, c-format msgid "Date %04d-%d-%d is before the earliest acceptable date of 1582-10-15." msgstr "" "La data %04d-%d-%d és anterior de la data acceptada més antiga, 1582-10-15." #: src/data/casereader-filter.c:221 msgid "" "At least one case in the data read had a weight value that was user-missing, " "system-missing, zero, or negative. These case(s) were ignored." msgstr "" "Almenys un cas a la lectura de dades tenia un valor de ponderació que és " "perdut d'usuari, de sistema, zero o negatiu. Aquest(s) cas(os) van ser " "ignorat(s)." #. TRANSLATORS: this fragment will be interpolated into messages in fh_lock() #. that identify types of files. #: src/data/csv-file-writer.c:138 msgid "CSV file" msgstr "arxiu CSV" #: src/data/csv-file-writer.c:146 #, fuzzy, c-format #| msgid "Error opening `%s' for writing as a system file: %s." msgid "Error opening `%s' for writing as a CSV file: %s." msgstr "Error en obrir `%s' per gravar com arxiu de sistema: %s." #: src/data/csv-file-writer.c:453 #, c-format msgid "An I/O error occurred writing CSV file `%s'." msgstr "S'ha produït un error de E/S al desar l'arxiu de sistema `%s'." #: src/data/data-in.c:175 #, c-format msgid "Data is not valid as format %s: %s" msgstr "Dades no vàlides com a format %s: %s." #: src/data/data-in.c:377 src/data/data-in.c:553 msgid "Field contents are not numeric." msgstr "El contingut del camp no és numèric." #: src/data/data-in.c:379 src/data/data-in.c:555 msgid "Number followed by garbage." msgstr "Nombre seguit per escombraria." #: src/data/data-in.c:392 msgid "Invalid numeric syntax." msgstr "Sintaxi numèrica no vàlida." #: src/data/data-in.c:400 src/data/data-in.c:571 msgid "Too-large number set to system-missing." msgstr "Nombre massa gran definit com a perdut del sistema." #: src/data/data-in.c:406 src/data/data-in.c:577 msgid "Too-small number set to zero." msgstr "Nombre massa petit definit com a zero. " #: src/data/data-in.c:426 msgid "All characters in field must be digits." msgstr "Tots els caràcters del camp han de ser dígits." #: src/data/data-in.c:445 msgid "Unrecognized character in field." msgstr "Caràcter no reconegut en el camp." #: src/data/data-in.c:466 src/data/data-in.c:729 msgid "Field must have even length." msgstr "Camp ha de tenir l'amplada divisible per 2 (parell)." #: src/data/data-in.c:468 src/data/data-in.c:732 msgid "Field must contain only hex digits." msgstr "Camp ha de contenir només dígits hexadecimals." #: src/data/data-in.c:544 msgid "Invalid zoned decimal syntax." msgstr "Sintaxi decimal no vàlida." #: src/data/data-in.c:644 src/data/data-in.c:650 msgid "Invalid syntax for P field." msgstr "Sintaxi no vàlida per un camp P." #: src/data/data-in.c:768 src/data/data-in.c:818 msgid "Syntax error in date field." msgstr "Error sintàctic en el camp de dades." #: src/data/data-in.c:783 #, c-format msgid "Day (%ld) must be between 1 and 31." msgstr "Dia (%ld) ha de ser entre 1 i 31." #: src/data/data-in.c:832 msgid "Delimiter expected between fields in date." msgstr "A la data s'espera un delimitador entre els camps." #: src/data/data-in.c:906 msgid "" "Unrecognized month format. Months may be specified as Arabic or Roman " "numerals or as at least 3 letters of their English names." msgstr "" "Format de mes no reconegut. Els mesos poden ser especificats com a números " "Aràbics o Romans, o com a mínim 3 lletres dels seus noms en Anglès." #: src/data/data-in.c:933 #, c-format msgid "Year (%ld) must be between 1582 and 19999." msgstr "Any (%ld) ha de ser entre 1582 i 19999." #: src/data/data-in.c:944 #, c-format msgid "Trailing garbage `%.*s' following date." msgstr "Escombraria `%.*s' darrera de la data." #: src/data/data-in.c:958 msgid "Julian day must have exactly three digits." msgstr "Dia Julià ha de tenir exactament tres dígits." #: src/data/data-in.c:960 #, c-format msgid "Julian day (%ld) must be between 1 and 366." msgstr "Dia Julià (%ld) ha de ser entre 1 i 366." #: src/data/data-in.c:984 #, c-format msgid "Quarter (%ld) must be between 1 and 4." msgstr "Trimestre (%ld) ha de ser entre 1 i 4." #: src/data/data-in.c:1005 #, c-format msgid "Week (%ld) must be between 1 and 53." msgstr "Setmana (%ld) ha de ser entre 1 i 53." #: src/data/data-in.c:1017 msgid "Delimiter expected between fields in time." msgstr "Delimitador esperat entre camps de temps." #: src/data/data-in.c:1037 #, c-format msgid "Minute (%ld) must be between 0 and 59." msgstr "Minut (%ld) ha de ser entre 0 i 59." #: src/data/data-in.c:1075 msgid "" "Unrecognized weekday name. At least the first two letters of an English " "weekday name must be specified." msgstr "" "Dia de la setmana no reconegut. Al menys s'han d'especificar les dues " "primeres lletres del nom en anglès." #: src/data/data-in.c:1210 #, c-format msgid "`%c' expected in date field." msgstr "S'espera `%c' en un camp de dades." #: src/data/data-out.c:580 #, c-format msgid "Weekday number %f is not between 1 and 7." msgstr "Nombre de dia de la setmana%f no està entre 1 i 7." #: src/data/data-out.c:605 #, c-format msgid "Month number %f is not between 1 and 12." msgstr "Nombre de mes %f no està entre 1 i 12." #. TRANSLATORS: this fragment will be interpolated into #. messages in fh_lock() that identify types of files. #: src/data/dataset-writer.c:66 src/language/data-io/file-handle.c:304 msgid "dataset" msgstr "arxiu de dades" #: src/data/dict-class.c:52 msgid "ordinary" msgstr "ordinàri/a" #: src/data/dict-class.c:54 msgid "system" msgstr "sistema" #: src/data/dict-class.c:56 msgid "scratch" msgstr "zero" #: src/data/dictionary.c:1523 #, c-format msgid "Truncating document line to %d bytes." msgstr "Línia de document tallada a %d bytes." #: src/data/encrypted-file.c:89 #, c-format msgid "An error occurred while reading `%s': %s." msgstr "S'ha produït un error en obrir `%s': %s." #: src/data/encrypted-file.c:430 #, c-format msgid "" "%s: encrypted file corrupted (ends in incomplete %u-byte ciphertext block)" msgstr "" #: src/data/encrypted-file.c:449 #, c-format msgid "%s: encrypted file corrupted (ends with bad padding)" msgstr "" #: src/data/file-handle-def.c:283 src/language/data-io/dataset.c:266 msgid "active dataset" msgstr "arxiu de dades actiu" #: src/data/file-handle-def.c:518 #, c-format msgid "Can't read from %s as a %s because it is already being read as a %s." msgstr "" "No es pot llegir de %s com una %s perquè ja està sent llegit com una %s." #: src/data/file-handle-def.c:522 #, c-format msgid "Can't write to %s as a %s because it is already being written as a %s." msgstr "No es pot escriure en %s com un %s perquè ja està escrit com un %s." #: src/data/file-handle-def.c:529 #, c-format msgid "Can't re-open %s as a %s." msgstr "No es pot tornar a obrir %s com a %s." #: src/data/file-name.c:133 #, c-format msgid "Not opening pipe file `%s' because %s option set." msgstr "" "No obrir l'arxiu de transferència '%s' perquè l'opció %s està activada." #: src/data/format.c:339 msgid "Input format" msgstr "Format d'entrada" #: src/data/format.c:339 msgid "Output format" msgstr "Format de sortida" #: src/data/format.c:342 #, c-format msgid "Format %s may not be used for input." msgstr "Format %s no pot ser utilitzat com entrada." #: src/data/format.c:349 #, c-format msgid "%s specifies width %d, but %s requires an even width." msgstr "%s especifica amplada %d, però %s requereix una amplada parell." #: src/data/format.c:358 #, c-format msgid "%s %s specifies width %d, but %s requires a width between %d and %d." msgstr "" "%s %s especifica amplada %d, però %s requereix una amplada entre %d i %d." #: src/data/format.c:367 #, c-format msgid "%s %s specifies %d decimal place, but %s does not allow any decimals." msgid_plural "" "%s %s specifies %d decimal places, but %s does not allow any decimals." msgstr[0] "%s %s especifica %d lloc decimal, però %s no en permet cap." msgstr[1] "%s %s especifica %d llocs decimals, però %s no en permet cap." #: src/data/format.c:378 #, c-format msgid "" "%s %s specifies %d decimal place, but the given width allows at most %d " "decimals." msgid_plural "" "%s %s specifies %d decimal places, but the given width allows at most %d " "decimals." msgstr[0] "" "%s %s especifica %d lloc decimal, però l'amplada donada permet com a molt %d " "decimals." msgstr[1] "" "%s %s especifica %d llocs decimals, però l'amplada donada permet com a molt " "%d decimals." #: src/data/format.c:385 #, c-format msgid "" "%s %s specifies %d decimal place, but the given width does not allow for any " "decimals." msgid_plural "" "%s %s specifies %d decimal places, but the given width does not allow for " "any decimals." msgstr[0] "" "%s %s especifica %d lloc decimal, però l'amplada donada no en permet cap." msgstr[1] "" "%s %s especifica %d llocs decimals, però l'amplada donada no en permet cap." #: src/data/format.c:424 #, c-format msgid "%s variables are not compatible with %s format %s." msgstr "Les variables %s no són compatibles amb %s format %s." #: src/data/format.c:425 src/data/format.c:1074 #: src/ui/gui/var-type-dialog.ui:167 msgid "String" msgstr "Cadena" #: src/data/format.c:425 src/data/format.c:1035 #: src/ui/gui/var-type-dialog.ui:48 msgid "Numeric" msgstr "Numèric" #: src/data/format.c:426 src/data/sys-file-reader.c:2212 #: src/data/sys-file-reader.c:2214 src/language/xforms/recode.c:512 #: src/language/xforms/recode.c:513 src/language/xforms/recode.c:525 #: src/language/xforms/recode.c:526 #: src/language/dictionary/apply-dictionary.c:77 #: src/language/dictionary/apply-dictionary.c:78 msgid "numeric" msgstr "numèric" #: src/data/format.c:426 src/data/sys-file-reader.c:2212 #: src/data/sys-file-reader.c:2214 src/language/xforms/recode.c:512 #: src/language/xforms/recode.c:513 src/language/xforms/recode.c:525 #: src/language/xforms/recode.c:526 #: src/language/dictionary/apply-dictionary.c:77 #: src/language/dictionary/apply-dictionary.c:78 msgid "string" msgstr "cadena" #: src/data/format.c:444 #, c-format msgid "String variable with width %d is not compatible with format %s." msgstr "Variable de cadena amb amplada %d no és compatible amb el format %s." #: src/data/format.c:1038 src/ui/gui/var-type-dialog.ui:65 msgid "Comma" msgstr "Coma" #: src/data/format.c:1041 src/ui/gui/var-type-dialog.ui:82 msgid "Dot" msgstr "Punt" #: src/data/format.c:1044 msgid "Scientific" msgstr "Científic" #: src/data/format.c:1061 src/ui/gui/var-type-dialog.ui:116 msgid "Date" msgstr "Data" #: src/data/format.c:1064 src/ui/gui/var-type-dialog.ui:133 msgid "Dollar" msgstr "Dolar" #: src/data/format.c:1071 msgid "Custom" msgstr "Usuari" #: src/data/gnumeric-reader.c:478 src/data/ods-reader.c:505 #, c-format msgid "Cannot convert the value in the spreadsheet cell %s to format (%s): %s" msgstr "" "Imposible convertir el valor a la cel.la %s del full de càlcul al format " "(%s): %s" #: src/data/gnumeric-reader.c:502 src/data/ods-reader.c:567 #, c-format msgid "" "There was a problem whilst reading the %s file `%s' (near line %d): `%s'" msgstr "" "Hi ha hagut un problema mentre es llegia l'arxiu %s `%s' (a prop de la linia " "%d): `%s'" #: src/data/gnumeric-reader.c:597 #, c-format msgid "" "The gnumeric file `%s' is encoded as %s instead of the usual UTF-8 encoding. " "Any non-ascii characters will be incorrectly imported." msgstr "" "L'arxiu gnumeric `%s' és codificat com a %s contrariament a la codfifació " "habitual UTF-8. Qulasevol caracter no-ascii serà incorrectament importat." #: src/data/gnumeric-reader.c:641 src/data/ods-reader.c:682 #, c-format msgid "Invalid cell range `%s'" msgstr "Interval de cel·la `%s' invàlid" #: src/data/gnumeric-reader.c:813 src/data/ods-reader.c:710 #: src/data/ods-reader.c:843 #, c-format msgid "Selected sheet or range of spreadsheet `%s' is empty." msgstr "El full o fulls de càlcul seleccionats `%s' és buit." #: src/data/identifier2.c:60 #, c-format msgid "Identifier `%s' exceeds %d-byte limit." msgstr "L'identificador `%s' supera el límit de %d caràcters." #: src/data/identifier2.c:84 msgid "Identifier cannot be empty string." msgstr "L'identificador no pot ser una cadena buida. " #: src/data/identifier2.c:92 #, c-format msgid "`%s' may not be used as an identifier because it is a reserved word." msgstr "" "'%s' no pot ser utilitzat com a identificador perquè es una paraula " "reservada." #: src/data/identifier2.c:103 #, c-format msgid "" "`%s' may not be used as an identifier because it contains ill-formed UTF-8 " "at byte offset %tu." msgstr "" "'%s' no pot ser utilitzat com a identificador perquè conté malformació UTF-8 " "al byte en posició %tu." #: src/data/identifier2.c:114 #, c-format msgid "" "Character %s (in `%s') may not appear as the first character in a identifier." msgstr "" "El caracter %s (a `%s') no pot aparèixer com a primer caracter a un " "identificador." #: src/data/identifier2.c:126 #, c-format msgid "Character %s (in `%s') may not appear in an identifier." msgstr "El caracter %s (a `%s') no pot aparèixer a un identificador." #: src/data/mdd-writer.c:241 #, fuzzy, c-format #| msgid "I/O error occurred writing data file `%s'." msgid "An I/O error occurred writing metadata file `%s'." msgstr "Error E/S en escriure les dades de l'arxiu `%s'." #. TRANSLATORS: this fragment will be interpolated into #. messages in fh_lock() that identify types of files. #: src/data/mdd-writer.c:457 #, fuzzy #| msgid "data file" msgid "metadata file" msgstr "arxiu de dades" #: src/data/mdd-writer.c:465 #, fuzzy, c-format #| msgid "Error opening `%s' for writing as a portable file: %s." msgid "Error opening `%s' for writing as a metadata file: %s." msgstr "Error al obrir `%s' per a escriure com a arxiu portàtil: %s." #: src/data/mdd-writer.c:473 #, c-format msgid "Internal error creating xmlTextWriter. Please report this to %s." msgstr "" #: src/data/make-file.c:217 #, c-format msgid "Opening %s for writing: %s." msgstr "Obrint %s per a escriure: %s." #: src/data/make-file.c:228 #, c-format msgid "Opening stream for %s: %s." msgstr "Obrint flux per a %s: %s." #: src/data/make-file.c:260 #, c-format msgid "Creating temporary file to replace %s: %s." msgstr "Creant arxiu temporal per a substituir %s: %s." #: src/data/make-file.c:277 #, c-format msgid "Creating temporary file %s: %s." msgstr "Creant arxiu temporal %s: %s." #: src/data/make-file.c:289 #, c-format msgid "Opening stream for temporary file %s: %s." msgstr "Obrint flux per a l'arxiu temporal %s: %s." #: src/data/make-file.c:326 #, c-format msgid "Replacing %s by %s: %s." msgstr "Substituint %s per %s: %s." #: src/data/make-file.c:354 #, c-format msgid "Removing %s: %s." msgstr "Eliminant %s: %s." #: src/data/mrset.c:83 #, c-format msgid "" "%s is not a valid name for a multiple response set. Multiple response set " "names must begin with `$'." msgstr "" "%s no és un nom vàlid de variable per a un conjunt de resposta múltiple. Els " "conjunts de resposta múltiple han de començar amb `$'." #: src/data/ods-reader.c:620 #, c-format msgid "Cannot open %s as a OpenDocument file: %s" msgstr "No es pot obrir %s com a arxiu OpenDocument: %s" #. TRANSLATORS: this fragment will be interpolated into #. messages in fh_lock() that identify types of files. #: src/data/pc+-file-reader.c:206 msgid "SPSS/PC+ system file" msgstr "arxiu de sistema SPSS/PC+" #: src/data/pc+-file-reader.c:215 #, c-format msgid "Error opening `%s' for reading as an SPSS/PC+ system file: %s." msgstr "" "Error en obrir `%s' per a la lectura com arxiu de sistema SPSS/PS+: %s." #: src/data/pc+-file-reader.c:224 src/data/sys-file-reader.c:3541 #, c-format msgid "%s: stat failed (%s)." msgstr "%s: stat fallida (%s)." #: src/data/pc+-file-reader.c:230 #, c-format msgid "%s: file too large." msgstr "%s: arxiu massa gran." #: src/data/pc+-file-reader.c:257 #, c-format msgid "" "Directory entry is for a %u-byte record starting at offset %u but file is " "only %u bytes long." msgstr "" "La esntrada del directori es per a un registre %u-byte començant a la " "posició %u pero l'arxius només te %u bytes de llarg." #: src/data/pc+-file-reader.c:275 #, c-format msgid "Directory fields have unexpected values (%u,%u)." msgstr "Els camps de directori tenen valors no esperats (%u,%u)." #: src/data/pc+-file-reader.c:372 src/data/sys-file-reader.c:672 #, c-format msgid "Variable %zu" msgstr "Variable %zu" #: src/data/pc+-file-reader.c:380 src/data/sys-file-reader.c:680 #, c-format msgid "Variable %zu Label" msgstr "Etiqueta de variable %zu" #: src/data/pc+-file-reader.c:385 #, c-format msgid "Variable %zu Value Label %zu" msgstr "Variable %zu Etiqueta de Valor %zu" #: src/data/pc+-file-reader.c:388 src/data/sys-file-reader.c:690 msgid "Creation Date" msgstr "Data de creació" #: src/data/pc+-file-reader.c:389 src/data/sys-file-reader.c:691 msgid "Creation Time" msgstr "Hora de creació" #: src/data/pc+-file-reader.c:390 src/data/sys-file-reader.c:692 #: src/language/dictionary/sys-file-info.c:200 msgid "Product" msgstr "Producte" #: src/data/pc+-file-reader.c:391 src/data/sys-file-reader.c:693 #: src/language/dictionary/sys-file-info.c:300 msgid "File Label" msgstr "Etiqueta de l'arxiu" #: src/data/pc+-file-reader.c:427 #, c-format msgid "" "Using default encoding %s to read this SPSS/PC+ system file. For best " "results, specify an encoding explicitly. Use SYSFILE INFO with ENCODING=" "\"DETECT\" to analyze the possible encodings." msgstr "" "S'utilitzarà la codificació per defecte %s per llegir aquest arxiu de " "sistema SPSSS/PC+. Per millorar el resultat, especifiqueu explícitament un " "tipus de codificació. Utilitzeu SYSFILE INFO amb ENCODING=\"DETECT\" per a " "analitzar les codificacions posibles." #: src/data/pc+-file-reader.c:483 src/data/sys-file-reader.c:890 #, c-format msgid "Error closing system file `%s': %s." msgstr "Error en tancar l'arxiu de sistema `%s': %s." #: src/data/pc+-file-reader.c:544 msgid "This is not an SPSS/PC+ system file." msgstr "Això no és un arxiu de sistema de SPSS/PC+." #: src/data/pc+-file-reader.c:548 #, c-format msgid "Record 0 has unexpected length %u." msgstr "El registre 0 te llargada no esperada %u." #: src/data/pc+-file-reader.c:572 #, c-format msgid "Record 0 specifies unexpected system missing value %g (%a)." msgstr "El registre 0 especifica un valor perdut inesperat %g (%a)." #: src/data/pc+-file-reader.c:577 #, c-format msgid "Record 0 reserved fields have unexpected values (%u,%u,%u,%u,%u,%u)." msgstr "" "Els camps reservats del registre 0 tenen valors no esperats (%u,%u,%u,%u,%u," "%u)." #: src/data/pc+-file-reader.c:581 #, c-format msgid "Record 0 case counts differ (%u versus %u)." msgstr "El recompte de casos del registre 0 és diferent (%u versus %u)." #: src/data/pc+-file-reader.c:585 #, c-format msgid "Invalid compression type %u." msgstr "Tipus de compressió invalid %u" #: src/data/pc+-file-reader.c:596 #, c-format msgid "" "Record 0 claims %u cases with %u values per case (requiring at least %zu " "bytes) but data record is only %u bytes long." msgstr "" "El registre 0 demana %u casos amb %u valors per cas (requerint al menys %zu " "bytes) però el registre de dades té només %u bytes de llarg." #: src/data/pc+-file-reader.c:618 #, c-format msgid "" "Value labels claimed to end at offset %u in labels record but labels record " "is only %u bytes." msgstr "" "Les etiquetes de valor demanen acabar a la posició %u al registre " "d'etiquetes però aquest només té %u bytes." #: src/data/pc+-file-reader.c:629 #, c-format msgid "" "Value labels claimed to be at offset %u with length %u but file size is only " "%u bytes." msgstr "" "Les etiquetes de valor demanen ser a la posició %u amb llargaria %u però " "l'arxiu només té %u bytes." #: src/data/pc+-file-reader.c:656 #, c-format msgid "" "Value labels end with partial label (%u bytes left in record, label length " "%)." msgstr "" "Les etiquetes de valor acaben amb una etiqueta parcial (queden %u bytes al " "registre, la llargada d'etiqueta %)." #: src/data/pc+-file-reader.c:669 #, c-format msgid "%u leftover bytes following value labels." msgstr "%u bytes sobrantes a continuació de les etiquetes de valor." #: src/data/pc+-file-reader.c:685 #, c-format msgid "" "Variable label claimed to start at offset %u in labels record but labels " "record is only %u bytes." msgstr "" "La etiqueta de variable demana començar a la posició %u al registre " "d'etiquetes pero el registre d'etiquetes té només %u bytes." #: src/data/pc+-file-reader.c:697 #, c-format msgid "" "Variable label with length %u starting at offset %u in labels record " "overruns end of %u-byte labels record." msgstr "" "Etiqueta de variable amb llargada %u que comença a la posició %u al registre " "d'etiquetes envaeix el final del registre d'etiquetes %u-byte." #: src/data/pc+-file-reader.c:719 #, c-format msgid "Record 1 has length %u (expected %u)." msgstr "El registre 1 té llargada %u (s'espera %u)." #: src/data/pc+-file-reader.c:751 #, c-format msgid "Variable %u has invalid type %." msgstr "La variable %u té un tipus no vàlid %." #: src/data/pc+-file-reader.c:787 #, c-format msgid "Invalid weight index %u." msgstr "Index de ponderació %u no vàlid." #: src/data/pc+-file-reader.c:857 #, c-format msgid "Invalid variable name `%s'." msgstr "Nom de variable '%s' no vàlid." #: src/data/pc+-file-reader.c:865 src/data/sys-file-reader.c:1444 #, c-format msgid "Renaming variable with duplicate name `%s' to `%s'." msgstr "Es canviarà el nom duplicat de variable `%s' per `%s'." #: src/data/pc+-file-reader.c:877 #, c-format msgid "Cannot weight by string variable `%s'." msgstr "No es pot ponderar per la variable de cadena `%s'." #: src/data/pc+-file-reader.c:973 src/data/sys-file-reader.c:2762 msgid "File ends in partial case." msgstr "L'arxiu acaba en un cas parcial." #: src/data/pc+-file-reader.c:979 #, c-format msgid "" "Case beginning at offset 0x%08x extends past end of data record at offset 0x" "%08x." msgstr "" "El cas que comença a la posició 0x%08x s'exten més enllà del final del " "registre de dades a la posició 0x%08x." #: src/data/pc+-file-reader.c:998 src/data/sys-file-reader.c:2770 #, c-format msgid "Error reading case from file %s." msgstr "Error llegint un cas de l'arxiu %s." #: src/data/pc+-file-reader.c:1114 src/data/sys-file-reader.c:2933 #, c-format msgid "" "Possible compressed data corruption: string contains compressed integer " "(opcode %d)." msgstr "" "Possible corrupció de dades comprimides: una cadena textual contè un enter " "comprimit (opcode %d)." #: src/data/pc+-file-reader.c:1156 src/data/sys-file-reader.c:3234 #, c-format msgid "`%s' near offset 0x%llx: " msgstr "`%s' prop de la posició 0x%llx: " #: src/data/pc+-file-reader.c:1159 src/data/sys-file-reader.c:3237 #, c-format msgid "`%s': " msgstr "`%s': " #: src/data/pc+-file-reader.c:1211 src/data/sys-file-reader.c:3288 #, c-format msgid "System error: %s." msgstr "Error de sistema: %s." #: src/data/pc+-file-reader.c:1216 src/data/sys-file-reader.c:3293 msgid "Unexpected end of file." msgstr "Final d'arxiu inesperat." #: src/data/pc+-file-reader.c:1301 src/data/sys-file-reader.c:3518 #, c-format msgid "%s: seek failed (%s)." msgstr "%s: cerca fallida (%s)." #: src/data/pc+-file-reader.c:1351 msgid "SPSS/PC+ System File" msgstr "Arxiu de Sistema SPSS/PC+" #: src/data/por-file-reader.c:109 #, c-format msgid "portable file %s corrupt at offset 0x%llx: " msgstr "l'arxiu portàtil %s és trencat a la posició 0x%llx: " #: src/data/por-file-reader.c:136 #, c-format msgid "reading portable file %s at offset 0x%llx: " msgstr "Llegint l'arxiu portàtil %s en la posició 0x%llx: " #: src/data/por-file-reader.c:164 #, c-format msgid "Error closing portable file `%s': %s." msgstr "Error en tancar l'arxiu portàtil `%s': %s." #: src/data/por-file-reader.c:216 msgid "unexpected end of file" msgstr "fi d'arxiu inesperat" #. TRANSLATORS: this fragment will be interpolated into #. messages in fh_lock() that identify types of files. #: src/data/por-file-reader.c:275 src/data/por-file-writer.c:147 msgid "portable file" msgstr "arxiu portàtil" #: src/data/por-file-reader.c:283 #, c-format msgid "" "An error occurred while opening `%s' for reading as a portable file: %s." msgstr "Error en obrir `%s' per a la lectura com a arxiu portàtil: %s." #: src/data/por-file-reader.c:304 msgid "Data record expected." msgstr "Registre de dades esperat." #: src/data/por-file-reader.c:402 msgid "Number expected." msgstr "Nombre esperat." #: src/data/por-file-reader.c:430 msgid "Missing numeric terminator." msgstr "Manca de terminació numèrica." #: src/data/por-file-reader.c:453 msgid "Invalid integer." msgstr "Nombre enter invàlid." #: src/data/por-file-reader.c:464 src/data/por-file-reader.c:484 #, c-format msgid "Bad string length %d." msgstr "Longitud de cadena %d invàlida." #: src/data/por-file-reader.c:547 #, c-format msgid "%s: Not a portable file." msgstr "%s: No és un arxiu portàtil." #: src/data/por-file-reader.c:564 #, c-format msgid "Unrecognized version code `%c'." msgstr "Codi de versió `%c' no reconegut." #: src/data/por-file-reader.c:577 #, c-format msgid "Bad date string length %zu." msgstr "Longitud de cadena de dades %zu invàlida." #: src/data/por-file-reader.c:579 #, c-format msgid "Bad time string length %zu." msgstr "Longitud de cadena de temps %zu invàlida." #: src/data/por-file-reader.c:630 #, c-format msgid "" "%s: Bad format specifier byte (%d). Variable will be assigned a default " "format." msgstr "" "%s: Byte especificador de format invàlid (%d). S'assignarà el format " "predeterminat a la variable." #: src/data/por-file-reader.c:651 #, c-format msgid "Numeric variable %s has invalid format specifier %s." msgstr "La variable numèrica %s té una especificació de format invàlida %s." #: src/data/por-file-reader.c:655 #, c-format msgid "String variable %s with width %d has invalid format specifier %s." msgstr "" "La variable en cadena %s amb longitud %d té una especificació de format " "invàlida %s." #: src/data/por-file-reader.c:679 msgid "Expected variable count record." msgstr "Registre de recompte de variables esperat." #: src/data/por-file-reader.c:683 #, c-format msgid "Invalid number of variables %d." msgstr "Número invàlid de variables: %d." #: src/data/por-file-reader.c:692 #, c-format msgid "Weight variable name (%s) truncated." msgstr "Nom de la variable ponderada (%s) truncat." #: src/data/por-file-reader.c:707 msgid "Expected variable record." msgstr "Registre de variable esperat." #: src/data/por-file-reader.c:711 #, c-format msgid "Invalid variable width %d." msgstr "Amplada de la variable invàlida %d." #: src/data/por-file-reader.c:719 #, c-format msgid "Invalid variable name `%s' in position %d." msgstr "Nom de la variable invàlid `%s' en la posició %d." #: src/data/por-file-reader.c:723 src/data/sys-file-reader.c:1426 #, c-format msgid "Bad width %d for variable %s." msgstr "Amplada %d incorrecte per a la variable %s." #: src/data/por-file-reader.c:737 #, c-format msgid "Duplicate variable name %s in position %d renamed to %s." msgstr "Nom de la variable %s duplicat en la posició %d s'ha reanomenat a %s." #: src/data/por-file-reader.c:786 #, c-format msgid "Weighting variable %s not present in dictionary." msgstr "La variable de ponderació %s no està al diccionari." #: src/data/por-file-reader.c:830 #, c-format msgid "Unknown variable %s while parsing value labels." msgstr "Variable %s desconeguda mentre s'analitzaven les etiquetes de valor." #: src/data/por-file-reader.c:833 #, c-format msgid "" "Cannot assign value labels to %s and %s, which have different variable types." msgstr "" "No es pot assignar etiquetes de valor a %s i %s, que tenen diferent tipus de " "variables." #: src/data/por-file-reader.c:972 msgid "SPSS Portable File" msgstr "Arxiu SPSS Portable" #: src/data/por-file-writer.c:139 #, c-format msgid "Invalid decimal digits count %d. Treating as %d." msgstr "Recompte de dígits decimals %d invàlid. Es tractarà com a %d." #: src/data/por-file-writer.c:159 #, c-format msgid "Error opening `%s' for writing as a portable file: %s." msgstr "Error al obrir `%s' per a escriure com a arxiu portàtil: %s." #: src/data/por-file-writer.c:505 #, c-format msgid "An I/O error occurred writing portable file `%s'." msgstr "Error E/S en escriure l'arxiu portàtil `%s'." #: src/data/psql-reader.c:48 msgid "" "Support for reading postgres databases was not compiled into this " "installation of PSPP" msgstr "" "El suport per a la lectura de les bases de dades postgres no va ser compilat " "en aquesta instal·lació de PSPP" #: src/data/psql-reader.c:242 msgid "Memory error whilst opening psql source" msgstr "Error de memòria al obrir la font psql" #: src/data/psql-reader.c:248 #, c-format msgid "Error opening psql source: %s." msgstr "Error obrint la font psql: %s." #: src/data/psql-reader.c:263 #, c-format msgid "" "Postgres server is version %s. Reading from versions earlier than 8.0 is not " "supported." msgstr "" "La versió del servidor Postgres és la %s. No es possible la lectura des de " "versions anteriors a la 8.0." #: src/data/psql-reader.c:283 msgid "" "Connection is unencrypted, but unencrypted connections have not been " "permitted." msgstr "" "La connexió no està xifrada, però les connexions sense xifrar no estan " "permeses." #: src/data/psql-reader.c:324 src/data/psql-reader.c:349 #: src/data/psql-reader.c:359 #, c-format msgid "Error from psql source: %s." msgstr "Error des de la font psql: %s." #: src/data/psql-reader.c:454 #, c-format msgid "Unsupported OID %d. SYSMIS values will be inserted." msgstr "OID %d no admès. Valors SYSMIS seran inserits." #: src/data/settings.c:391 msgid "" "MXWARNS set to zero. No further warnings will be given even when " "potentially problematic situations are encountered." msgstr "" "S'assigna zero a MXWARNS. No es proporcionaran més avisos tot, i que " "podrien trobar-se situacions problemàtiques posteriors." #: src/data/settings.c:398 #, c-format msgid "" "Warnings re-enabled. %d warnings will be issued before aborting syntax " "processing." msgstr "" "Avisos activats de nou. Es tindran en compte %d avisos abans d'abortar el " "procés." #: src/data/settings.c:618 #, c-format msgid "" "%s: Custom currency string `%s' does not contain exactly three periods or " "commas (or it contains both)." msgstr "" "%s: Cadena de moneda personalitzada '%s' no conté exactament tres punts o " "comes (o els conté ambdós)." #. TRANSLATORS: this fragment will be interpolated into #. messages in fh_lock() that identify types of files. #: src/data/sys-file-reader.c:407 src/data/sys-file-writer.c:245 msgid "system file" msgstr "arxiu de sistema" #: src/data/sys-file-reader.c:414 #, c-format msgid "Error opening `%s' for reading as a system file: %s." msgstr "Error en obrir `%s' per a la lectura com arxiu de sistema: %s." #: src/data/sys-file-reader.c:491 msgid "Misplaced type 4 record." msgstr "Registre de tipus 4 fora de lloc." #: src/data/sys-file-reader.c:496 msgid "Duplicate type 6 (document) record." msgstr "Registre de tipus 6 (document) duplicat." #: src/data/sys-file-reader.c:506 src/data/sys-file-reader.c:1343 #, c-format msgid "" "Unrecognized record type 7, subtype %d. For help, please send this file to " "%s and mention that you were using %s." msgstr "" "Registre de tipus 7, subtipus %d no reconegut. Si us plau envieu una còpia " "d'aquest arxiu a %s i comnteu que estaveu utilitzant %s." #: src/data/sys-file-reader.c:526 #, c-format msgid "" "Record type 7, subtype %d found here has the same type as the record found " "near offset 0x%llx. For help, please send this file to %s and mention that " "you were using %s." msgstr "" "Registre de tipus 7, subtipus %d que s'ha trobat aquí té el mateix tipus que " "el registre trobat prop de la posició 0x%llx. Si us plau envieu una còpia " "d'aquest arxiu a %s i esmenteu que estaveu fent servir %s." #: src/data/sys-file-reader.c:538 #, c-format msgid "Unrecognized record type %d." msgstr "Tipus de registre %d no reconegut." #: src/data/sys-file-reader.c:688 #, c-format msgid "Value Label %zu" msgstr "Etiqueta de Valor %zu" #: src/data/sys-file-reader.c:697 msgid "Extra Product Info" msgstr "Informació extra del Producte" #: src/data/sys-file-reader.c:710 #, c-format msgid "Document Line %zu" msgstr "Linia del document %zu" #: src/data/sys-file-reader.c:718 #, c-format msgid "MRSET %zu" msgstr "MRSET %zu" #: src/data/sys-file-reader.c:720 #, c-format msgid "MRSET %zu Label" msgstr "Etiqueta MRSET %zu" #: src/data/sys-file-reader.c:725 #, c-format msgid "MRSET %zu Counted Value" msgstr "Valor de recompte de MRSET %zu" #: src/data/sys-file-reader.c:763 #, c-format msgid "" "This system file does not indicate its own character encoding. Using " "default encoding %s. For best results, specify an encoding explicitly. Use " "SYSFILE INFO with ENCODING=\"DETECT\" to analyze the possible encodings." msgstr "" "L'arxiu de sistema no especifica la codificació de caracters. S'utilitzarà " "la codificació per defecte %s. Per a millors resultats, especifiqueu " "explícitament un tipus de codificació. Utilitzeu SYSFILE INFO amb ENCODING=" "\"DETECT\" per a analitzar les codificacions posibles." #: src/data/sys-file-reader.c:845 #, c-format msgid "File header claims %d variable positions but %zu were read from file." msgstr "" "Capçalera de l'arxiu requereix %d posicions de variable, però s'han llegit " "%zu des de l'arxiu." #: src/data/sys-file-reader.c:958 src/data/sys-file-reader.c:972 msgid "This is not an SPSS system file." msgstr "Això no és un arxiu de sistema de SPSS." #: src/data/sys-file-reader.c:1027 msgid "" "Compression bias is not the usual value of 100, or system file uses " "unrecognized floating-point format." msgstr "" "El biaix de compressió no és el valor habitual de 100, o l'arxiu de sistema " "utilitza un format de punt flotant no reconegut." #: src/data/sys-file-reader.c:1102 msgid "Variable label indicator field is not 0 or 1." msgstr "Camp indicador d'etiqueta de variable no és 0 o 1." #: src/data/sys-file-reader.c:1115 msgid "Numeric missing value indicator field is not -3, -2, 0, 1, 2, or 3." msgstr "" "Camp d'indicador de valors perduts numèrics no és -3, -2, 0, 1, 2 o 3." #: src/data/sys-file-reader.c:1125 msgid "String missing value indicator field is not 0, 1, 2, or 3." msgstr "Camp d'indicador de valors perduts de cadena no és 0, 1, 2 o 3." #: src/data/sys-file-reader.c:1152 #, c-format msgid "Invalid number of labels %u." msgstr "Nombre invàlid d'etiquetes %u." #: src/data/sys-file-reader.c:1185 msgid "" "Variable index record (type 4) does not immediately follow value label " "record (type 3) as it should." msgstr "" "Registre d'índex de variable (tipus 4) no és seguit immediatament pel " "registre d'etiquetes de valors (tipus 3) com hauria." #: src/data/sys-file-reader.c:1197 #, c-format msgid "" "Number of variables associated with a value label (%u) is not between 1 and " "the number of variables (%zu)." msgstr "" "Nombre de variables associades amb una etiqueta de valor (%u) no està entre " "1 i el nombre de variables (%zu)." #: src/data/sys-file-reader.c:1224 #, c-format msgid "Number of document lines (%d) must be greater than 0 and less than %d." msgstr "" "Nombre de línies de document (%d) ha de ser més gran que 0 i més petit que " "%d." #: src/data/sys-file-reader.c:1317 #, c-format msgid "Record type 7, subtype %d has bad size %u (expected %d)." msgstr "" "Registre de tipus 7, subtipus %d te una mida incorrecta %u (s'espera %d)." #: src/data/sys-file-reader.c:1321 #, c-format msgid "Record type 7, subtype %d has bad count %u (expected %d)." msgstr "" "Registre de tipus 7, subtipus %d te un recompte incorrecte %u (s'espera %d)." #: src/data/sys-file-reader.c:1435 #, fuzzy, c-format #| msgid "Renaming variable with duplicate name `%s' to `%s'." msgid "Renaming variable with invalid name `%s' to `%s'." msgstr "Es canviarà el nom duplicat de variable `%s' per `%s'." #: src/data/sys-file-reader.c:1517 msgid "Missing string continuation record." msgstr "Manca de registre de continuació de cadena." #: src/data/sys-file-reader.c:1550 #, c-format msgid "Variable %s with width %d has invalid print format 0x%x." msgstr "" "La variable %s amb longitud %d té una especificació de format invàlida 0x%x." #: src/data/sys-file-reader.c:1554 #, c-format msgid "Variable %s with width %d has invalid write format 0x%x." msgstr "" "La variable %s amb longitud %d té una especificació de format invàlida 0x%x." #: src/data/sys-file-reader.c:1559 msgid "Suppressing further invalid format warnings." msgstr "Es desactiven les alertes posteriors de format no vàlid." #: src/data/sys-file-reader.c:1613 #, c-format msgid "" "Floating-point representation indicated by system file (%d) differs from " "expected (%d)." msgstr "" "Representació del punt flotant indicat per l'arxiu de sistema (%d) difereix " "de l'esperat (%d)." #: src/data/sys-file-reader.c:1629 #, c-format msgid "" "Integer format indicated by system file (%d) differs from expected (%d)." msgstr "" "Format enter indicat per l'arxiu de sistema (%d) difereix de l'esperat (%d)." #: src/data/sys-file-reader.c:1647 src/data/sys-file-reader.c:1653 #, c-format msgid "File specifies unexpected value %g (%a) as %s, instead of %g (%a)." msgstr "L'arxiu especifica un valor inesperat %g (%a) com a %s, i no %g (%a)." #: src/data/sys-file-reader.c:1662 #, c-format msgid "" "File specifies unexpected value %g (%a) as %s, instead of %g (%a) or %g (%a)." msgstr "" "L'arxiu especifica un valor inesperat %g (%a) com a %s, i no %g (%a) o %g " "(%a)." #: src/data/sys-file-reader.c:1714 src/data/sys-file-reader.c:1733 #, c-format msgid "Missing space following `%c' at offset %zu in MRSETS record." msgstr "Espai perdut darrera `%c' a la posició %zu al registre MRSETS." #: src/data/sys-file-reader.c:1741 #, fuzzy, c-format #| msgid "" #| "Unexpected label source value following `E' at offset %zu in MRSETS " #| "record." msgid "" "Missing label source value following `E' at offset %zu in MRSETS record." msgstr "" "Valor d'etiqueta no esperat darrera `E' a la posició %zu d'un registre " "MRSETS." #: src/data/sys-file-reader.c:1748 #, c-format msgid "" "Unexpected label source value following `E' at offset %zu in MRSETS record." msgstr "" "Valor d'etiqueta no esperat darrera `E' a la posició %zu d'un registre " "MRSETS." #: src/data/sys-file-reader.c:1755 #, c-format msgid "Missing `C', `D', or `E' at offset %zu in MRSETS record." msgstr "Manca `C', `D' o `E' a la posició %zu d'un registre MRSETS." #: src/data/sys-file-reader.c:1782 #, c-format msgid "Missing new-line parsing variable names at offset %zu in MRSETS record." msgstr "" "Manquen noms de variable de nova línia en la posició %zu d'un registre " "MRSETS." #: src/data/sys-file-reader.c:1817 #, c-format msgid "Invalid multiple response set name `%s'." msgstr "Nom invàlid del conjunt multiresposta %s." #: src/data/sys-file-reader.c:1850 #, c-format msgid "MRSET %s contains duplicate variable name %s." msgstr "L' MRSET %s conté el nom de variable duplicat %s." #: src/data/sys-file-reader.c:1865 #, c-format msgid "MRSET %s contains both string and numeric variables." msgstr "MRSET %s contè variables textuals i numeriques." #: src/data/sys-file-reader.c:1877 #, c-format msgid "MRSET %s has no variables." msgstr "MRSET %s no te variables." #: src/data/sys-file-reader.c:1879 #, c-format msgid "MRSET %s has only one variable." msgstr "MRSET %s te només una variable." #: src/data/sys-file-reader.c:1923 #, c-format msgid "Extension 11 has bad count %u (for %zu variables)." msgstr "Extensió 11 té un recompte invàlid %u (per a %zu variables)." #: src/data/sys-file-reader.c:1956 #, c-format msgid "" "Invalid variable display parameters for variable %zu (%s). Default " "parameters substituted." msgstr "" "Paràmetres de visualització de variable no vàlids per a la variable %zu " "(%s). Substitució pels paràmetres per defecte." #: src/data/sys-file-reader.c:2000 #, c-format msgid "Duplicate long variable name `%s'." msgstr "Nom de la variable llarga `%s' duplicat." #: src/data/sys-file-reader.c:2053 #, c-format msgid "Long variable mapping from %s to invalid variable name `%s'." msgstr "" "Identificació de variable llarga des de %s cap a un nom de variable invàlid " "'%s'." #: src/data/sys-file-reader.c:2088 #, c-format msgid "%s listed as string of invalid length %s in very long string record." msgstr "" "%s figura com a cadena de longitud no vàlida %s a un registre de cadena molt " "llarg." #: src/data/sys-file-reader.c:2099 #, c-format msgid "" "%s listed in very long string record with width %s, which requires only one " "segment." msgstr "" "%s figura en el registre de cadena molt llarga amb longitud %s, que " "requereix només un segment." #: src/data/sys-file-reader.c:2107 #, c-format msgid "Very long string %s overflows dictionary." msgstr "Cadena molt llarga %s desborda el diccionari." #: src/data/sys-file-reader.c:2125 #, c-format msgid "" "Very long string with width %ld has segment %d of width %d (expected %d)." msgstr "" "Cadena molt llarga amb una mida de %ld conté segment %d de longitud %d " "(s'espera %d)." #: src/data/sys-file-reader.c:2183 #, fuzzy, c-format #| msgid "Variable index %d not in valid range 1...%zu." msgid "Value label variable index %d not in valid range 1...%zu." msgstr "Índex de la variable %d fora de l'interval vàlid de 1...%zu." #: src/data/sys-file-reader.c:2193 #, fuzzy, c-format #| msgid "Variable index %d refers to long string continuation." msgid "Value label variable index %d refers to long string continuation." msgstr "" "Índex de la variable %d es refereix a una continuació de cadena llarga." #: src/data/sys-file-reader.c:2208 #, c-format msgid "" "Variables associated with value label are not all of identical type. " "Variable %s is %s, but variable %s is %s." msgstr "" "Les variables associades amb etiqueta de valors no són totes del mateix " "tipus. La variable %s és %s, però la variable %s és %s." #: src/data/sys-file-reader.c:2226 #, c-format msgid "" "Value labels may not be added to long string variables (e.g. %s) using " "records types 3 and 4." msgstr "" "No es pot afegir etiquetes dels valors a les variables de cadena llarga (e." "g. %s) utilitzant els tipus de registres 3 i 4." #: src/data/sys-file-reader.c:2255 #, c-format msgid "Duplicate value label for %g on %s." msgstr "Etiqueta de valors duplicats per %g en %s." #: src/data/sys-file-reader.c:2260 src/data/sys-file-reader.c:2600 #, c-format msgid "Duplicate value label for `%.*s' on %s." msgstr "Etiqueta de valor duplicat per a `%.*s' a %s." #: src/data/sys-file-reader.c:2283 #, fuzzy, c-format #| msgid "Suppressed %d additional related warnings." msgid "Suppressed %d additional warnings for value labels." msgstr "Suprimides %d advertències addicionals." #: src/data/sys-file-reader.c:2297 #, fuzzy, c-format #| msgid "Variable index %d not in valid range 1...%zu." msgid "" "Weight variable index %d not in valid range 1...%zu. Treating file as " "unweighted." msgstr "Índex de la variable %d fora de l'interval vàlid de 1...%zu." #: src/data/sys-file-reader.c:2307 #, fuzzy, c-format #| msgid "Variable index %d refers to long string continuation." msgid "" "Weight variable index %d refers to long string continuation. Treating file " "as unweighted." msgstr "" "Índex de la variable %d es refereix a una continuació de cadena llarga." #: src/data/sys-file-reader.c:2315 #, c-format msgid "Ignoring string variable `%s' set as weighting variable." msgstr "" "Ignorant variable de texto destí `%s' especificada como variable ponderada." #: src/data/sys-file-reader.c:2352 #, c-format msgid "Error parsing attribute value %s[%d]." msgstr "Error en analitzar el valor de l'atribut %s[%d]." #: src/data/sys-file-reader.c:2366 #, c-format msgid "Attribute value %s[%d] is not quoted: %s." msgstr "El valor de l'atribut %s[%d] no esta entre cometes: %s." #: src/data/sys-file-reader.c:2379 #, c-format msgid "Duplicate attribute %s." msgstr "Atribut %s duplicat." #: src/data/sys-file-reader.c:2463 #, c-format msgid "Invalid role for variable %s." msgstr "Rol no vàlid per a la variable %s." #: src/data/sys-file-reader.c:2472 #, c-format msgid "%zu other variables had invalid roles." msgstr "altres %zu variables tenen rols no vàlids." #: src/data/sys-file-reader.c:2485 #, c-format msgid "Extension record subtype %d ends unexpectedly." msgstr "Subtipus %d d'extensión de registre finalitza inesperadament." #: src/data/sys-file-reader.c:2531 #, c-format msgid "Ignoring long string value label record for unknown variable %s." msgstr "" "Ignorant el registre del valor de cadena llarga per a la variable " "desconeguda %s." #: src/data/sys-file-reader.c:2536 #, c-format msgid "Ignoring long string value label record for numeric variable %s." msgstr "" "Ignorant el registre del valor de cadena llarga per a la variable numèrica " "%s." #: src/data/sys-file-reader.c:2543 #, c-format msgid "" "Ignoring long string value label record for variable %s because the record's " "width (%d) does not match the variable's width (%d)." msgstr "" "Ignorant el registre del valor de cadena llarga %s donat que la mida del " "registre (%d) no coincideix amb la mida de la variable (%d)." #: src/data/sys-file-reader.c:2573 #, c-format msgid "" "Ignoring long string value label %zu for variable %s, with width %d, that " "has bad value width %zu." msgstr "" "Ignorant el valor de cadena llarga %zu per a la variable %s, d'amplada %d, " "que té una amplada de valor incorrecta %zu." #: src/data/sys-file-reader.c:2646 #, c-format msgid "" "Long string missing values record says variable %s has %d missing values, " "but only 1 to 3 missing values are allowed." msgstr "" "Registre de valors perduts d'una variable literal llarga indica que la " "variable %s te %d valors perduts, però només son permesos d'1 a 3 valors " "perduts." #: src/data/sys-file-reader.c:2656 #, c-format msgid "Ignoring long string missing value record for unknown variable %s." msgstr "" "Ignorant el registre del valor perdut de cadena llarga per a la variable " "desconeguda %s." #: src/data/sys-file-reader.c:2661 #, c-format msgid "Ignoring long string missing value record for numeric variable %s." msgstr "" "Ignorant el registre del valor perdut de cadena llarga per a la variable " "numèrica %s." #: src/data/sys-file-reader.c:2686 #, c-format msgid "" "Ignoring long string missing value %zu for variable %s, with width %d, that " "has bad value width %zu." msgstr "" "Ignorant el valor de cadena llarga %zu per a la variable %s, d'amplada %d, " "que té una amplada de valor incorrecta %zu." #: src/data/sys-file-reader.c:2740 msgid "File ends in partial string value." msgstr "L'arxiu acaba en un valor de text parcial." #: src/data/sys-file-reader.c:2879 msgid "" "Possible compressed data corruption: compressed spaces appear in numeric " "field." msgstr "" "Possible corrupció de dades comprimides: apareixen espais comprimits a un " "camp numeric." #: src/data/sys-file-reader.c:3030 #, c-format msgid "Suppressed %d additional related warnings." msgstr "Suprimides %d advertències addicionals." #: src/data/sys-file-reader.c:3076 src/data/sys-file-reader.c:3093 #, c-format msgid "Dictionary record refers to unknown variable %s." msgstr "El registre diccionari es refereix a la variable desconeguda %s." #: src/data/sys-file-reader.c:3159 #, c-format msgid "Expecting digit at offset %zu in MRSETS record." msgstr "S'espera un dígit a la posició %zu d'un registre MRSETS." #: src/data/sys-file-reader.c:3167 #, c-format msgid "Expecting space at offset %zu in MRSETS record." msgstr "S'espera un espai a la posició %zu d'un registre MRSETS." #: src/data/sys-file-reader.c:3175 #, c-format msgid "%zu-byte string starting at offset %zu exceeds record length %zu." msgstr "" "El text de %zu-bytes que comença en la posició %zu excedeix la mida del " "registre %zu." #: src/data/sys-file-reader.c:3185 #, c-format msgid "Expecting space at offset %zu following %zu-byte string." msgstr "S'espera un espai en la posició %zu darrera d'un text de %zu-bytes." #: src/data/sys-file-reader.c:3476 #, c-format msgid "Wrong ZLIB data header offset %#llx (expected %#llx)." msgstr "Capçalera de dades ZLIB incorrecta amb offset %#llx (s'espera %#llx)." #: src/data/sys-file-reader.c:3484 #, c-format msgid "Impossible ZLIB trailer offset 0x%llx." msgstr "Impossible ZLIB trailer offset 0x%llx." #: src/data/sys-file-reader.c:3491 #, c-format msgid "Invalid ZLIB trailer length %lld." msgstr "Amplada no vàlida %lld pel ZLIB trailer." #: src/data/sys-file-reader.c:3555 #, c-format msgid "End of ZLIB trailer (0x%llx) is not file size (0x%llx)." msgstr "Final de ZLIB trailer (0x%llx) no és longitud d'arxiu (0x%llx)." #: src/data/sys-file-reader.c:3565 #, c-format msgid "ZLIB trailer bias (%lld) differs from file header bias (%.2f)." msgstr "" "Esbiaix de ZLIB trailer (%lld) és diferent del biaix de capçalera d'arxiu " "(%.2f)." #: src/data/sys-file-reader.c:3575 #, c-format msgid "ZLIB trailer \"zero\" field has nonzero value %lld." msgstr "El camp \"zero\" del ZLIB trailer té un valor diferent a zero %lld." #: src/data/sys-file-reader.c:3581 #, c-format msgid "ZLIB trailer specifies unexpected %u-byte block size." msgstr "El ZLIB trailer especifica una amplada de block %u-byte no esperat." #: src/data/sys-file-reader.c:3589 #, c-format msgid "%lld-byte ZLIB trailer specifies %u data blocks (expected %lld)." msgstr "" "El ZLIB trailer %lld-byte especifica %u blocs de dades (s'espera %lld)." #: src/data/sys-file-reader.c:3614 #, c-format msgid "" "ZLIB block descriptor %u reported uncompressed data offset %#llx, when %#llx " "was expected." msgstr "" "El descriptor de blocs ZLIB %u informa d'un offset de dades no comprimides " "%#llx, quan s'espera %#llx." #: src/data/sys-file-reader.c:3623 #, c-format msgid "" "ZLIB block descriptor %u reported compressed data offset %#llx, when %#llx " "was expected." msgstr "" "El descriptor de bloc ZLIB %u informa d'un offset de dades comprimides " "%#llx, quan s'espera %#llx." #: src/data/sys-file-reader.c:3633 #, c-format msgid "" "ZLIB block descriptor %u reported block size %#x, when %#x was expected." msgstr "" "El descriptor de bloc ZLIB %u informa d'una amplada de bloc %#x, quan " "s'espera %#x." #: src/data/sys-file-reader.c:3641 #, c-format msgid "" "ZLIB block descriptor %u reported block size %#x, when at most %#x was " "expected." msgstr "" "El descriptor de bloc ZLIB %u informa d'una amplada de bloc %#x, quan " "s'espera com a màxim %#x." #: src/data/sys-file-reader.c:3653 #, c-format msgid "" "ZLIB block descriptor %u reports compressed size %u and uncompressed size %u." msgstr "" "El descriptor de bloc ZLIB %u informa d'una amplada comprimida %u i " "descomprimida %u." #: src/data/sys-file-reader.c:3665 #, c-format msgid "" "ZLIB trailer is at offset %#llx but %#llx would be expected from block " "descriptors." msgstr "" "El ZLIB trailer està a la posició %#llx però %#llx s'espera pels descriptors " "de bloc." #: src/data/sys-file-reader.c:3684 #, c-format msgid "ZLIB initialization failed (%s)." msgstr "Inicialització de ZLIB fallida (%s)." #: src/data/sys-file-reader.c:3699 #, c-format msgid "Inconsistency at end of ZLIB stream (%s)." msgstr "Inconsistencia al final del fluxe ZLIB (%s)." #: src/data/sys-file-reader.c:3758 #, c-format msgid "ZLIB stream inconsistency (%s)." msgstr "Inconsistencia al fluxe ZLIB (%s)." #: src/data/sys-file-reader.c:3782 msgid "Unexpected end of ZLIB compressed data." msgstr "Final inesperat de dades comprimides ZLIB." #: src/data/sys-file-reader.c:3820 msgid "SPSS System File" msgstr "Arxiu de Sistema SPSS" #: src/data/sys-file-writer.c:210 #, c-format msgid "Unknown system file version %d. Treating as version %d." msgstr "Versió d'arxiu de sistema %d desconeguda. Es tractarà com a versió %d." #: src/data/sys-file-writer.c:256 #, c-format msgid "Error opening `%s' for writing as a system file: %s." msgstr "Error en obrir `%s' per gravar com arxiu de sistema: %s." #: src/data/sys-file-writer.c:1271 #, c-format msgid "An I/O error occurred writing system file `%s'." msgstr "S'ha produït un error de E/S en desar l'arxiu de sistema `%s'." #: src/data/sys-file-writer.c:1378 #, c-format msgid "Failed to initialize ZLIB for compression (%s)." msgstr "Inicialització fallida de compressió per a ZLIB (%s)." #: src/data/sys-file-writer.c:1407 #, c-format msgid "Failed to complete ZLIB stream compression (%s)." msgstr "Compressió completa fallida pel fluxe ZLIB (%s)." #: src/data/sys-file-writer.c:1449 #, c-format msgid "ZLIB stream compression failed (%s)." msgstr "Compressió fallida del fluxe ZLIB (%s)." #: src/data/sys-file-writer.c:1491 #, c-format msgid "%s: Seek failed (%s)." msgstr "%s: Cerca fallida (%s)." #: src/data/variable.c:58 msgid "Left" msgstr "Esquerra" #: src/data/variable.c:59 msgid "Right" msgstr "Dreta" #: src/data/variable.c:60 msgid "Center" msgstr "Centre" #: src/data/variable.c:66 msgid "Nominal" msgstr "Nominal" #: src/data/variable.c:67 msgid "Ordinal" msgstr "Ordinal" #: src/data/variable.c:68 src/language/stats/ks-one-sample.c:300 msgid "Scale" msgstr "Escala" #: src/data/variable.c:74 msgid "Input" msgstr "Entrada" #. TRANSLATORS: This will be part of a filename. Please avoid whitespace. #: src/data/variable.c:75 src/output/spv/spv-writer.c:213 #: src/ui/gui/psppire-output-window.c:547 msgid "Output" msgstr "Objectiu" #: src/data/variable.c:76 msgid "Both" msgstr "Indiferent" #: src/data/variable.c:77 src/language/dictionary/sys-file-info.c:237 #: src/ui/gui/psppire-dialog-action-crosstabs.c:86 #: src/ui/gui/psppire-dialog-action-crosstabs.c:98 #: src/ui/gui/psppire-dialog-action-crosstabs.c:133 #: src/ui/gui/psppire-dialog-action-crosstabs.c:141 #: src/ui/gui/psppire-variable-sheet.c:408 src/ui/gui/var-display.c:34 msgid "None" msgstr "Cap" #: src/data/variable.c:78 msgid "Partition" msgstr "Partició" #: src/data/variable.c:79 src/ui/gui/reliability.ui:37 msgid "Split" msgstr "Divisió" #: src/data/variable.c:729 #, c-format msgid "%s (%s)" msgstr "%s (%s)" #: src/data/variable.c:1339 msgid "" "At least one case in the data file had a weight value that was user-missing, " "system-missing, zero, or negative. These case(s) were ignored." msgstr "" "Almenys un cas a l'arxiu de dades tenia un valor de ponderació que és perdut " "d'usuari, de sistema, zero o negatiu. Aquest(s) cas(os) van ser ignorat(s)." #: src/language/command.c:207 src/language/stats/graph.c:749 #: src/language/stats/graph.c:755 src/language/stats/graph.c:789 #: src/language/stats/graph.c:794 src/language/stats/graph.c:799 #: src/language/stats/graph.c:852 src/language/stats/graph.c:857 #: src/language/stats/graph.c:862 src/language/stats/graph.c:867 #: src/language/stats/graph.c:872 src/language/stats/graph.c:877 #: src/language/stats/graph.c:882 src/language/utilities/set.q:236 #, c-format msgid "%s is not yet implemented." msgstr "%s encara no està implementat." #: src/language/command.c:212 #, c-format msgid "%s may be used only in testing mode." msgstr "%s només pot ser utilitzat en el mode de prova." #: src/language/command.c:217 #, c-format msgid "%s may be used only in enhanced syntax mode." msgstr "%s només pot ser utilitzat en el mode de sintaxi ampliat." #: src/language/command.c:345 msgid "expecting command name" msgstr "esperant nom de comando" #: src/language/command.c:347 #, c-format msgid "Unknown command `%s'." msgstr "Comando `%s' desconegut." #: src/language/command.c:380 #, c-format msgid "%s is allowed only before the active dataset has been defined." msgstr "%s només es permet abans que l'arxiu de dades actiu s'ha definit." #: src/language/command.c:384 #, c-format msgid "%s is allowed only after the active dataset has been defined." msgstr "%s només es permet després que l'arxiu de dades actiu s'ha definit." #: src/language/command.c:388 src/language/command.c:392 #, c-format msgid "%s is allowed only inside %s." msgstr "%s és permes només dins de %s." #: src/language/command.c:399 src/language/command.c:403 #, c-format msgid "" "%s is allowed only before the active dataset has been defined or inside %s." msgstr "" "%s només es permet abans que l'arxiu de dades actiu s'ha definit o dins de " "%s." #: src/language/command.c:407 src/language/command.c:411 #, c-format msgid "" "%s is allowed only after the active dataset has been defined or inside %s." msgstr "" "%s només es permet després que l'arxiu de dades actiu s'ha definit, o dins " "de %s." #: src/language/command.c:415 #, c-format msgid "%s is allowed only inside %s or inside %s." msgstr "%s només es permet dins de %s o de %s." #: src/language/command.c:421 #, c-format msgid "" "%s is allowed only after the active dataset has been defined, inside INPUT " "PROGRAM, or inside FILE TYPE." msgstr "" "%s només es permet després que l'arxiu de dades actiu s'ha definit, dins de " "INPUT PROGRAM, o FILE TYPE." #: src/language/command.c:426 #, c-format msgid "" "%s is allowed only before the active dataset has been defined, inside INPUT " "PROGRAM, or inside FILE TYPE." msgstr "" "%s només es permet abans que l'arxiu de dades actiu s'ha definit, dins de " "INPUT PROGRAM, o FILE TYPE." #: src/language/command.c:444 src/language/command.c:447 #, c-format msgid "%s is not allowed inside %s." msgstr "%s no és permes dins de %s." #: src/language/command.c:529 src/language/utilities/host.c:272 #: src/language/utilities/permissions.c:105 #, c-format msgid "This command not allowed when the %s option is set." msgstr "Aquesta ordre no està permesa quan l'opció %s està activada." #: src/language/command.c:545 #, c-format msgid "Error removing `%s': %s." msgstr "Error d'eliminació de '%s' : %s." #: src/language/lexer/lexer.c:296 #, c-format msgid "expecting %s" msgstr "s'espera %s" #: src/language/lexer/lexer.c:300 #, c-format msgid "expecting %s or %s" msgstr "esperant %s o %s" #: src/language/lexer/lexer.c:304 #, c-format msgid "expecting %s, %s, or %s" msgstr "esperant %s, %s o %s" #: src/language/lexer/lexer.c:309 #, c-format msgid "expecting %s, %s, %s, or %s" msgstr "s'espera %s, %s, %s o %s" #: src/language/lexer/lexer.c:314 #, c-format msgid "expecting %s, %s, %s, %s, or %s" msgstr "s'espera %s, %s, %s, %s o %s" #: src/language/lexer/lexer.c:319 #, c-format msgid "expecting %s, %s, %s, %s, %s, or %s" msgstr "s'espera %s, %s, %s, %s, %s o %s" #: src/language/lexer/lexer.c:325 #, c-format msgid "expecting %s, %s, %s, %s, %s, %s, or %s" msgstr "s'espera %s, %s, %s, %s, %s, %s o %s" #: src/language/lexer/lexer.c:331 #, c-format msgid "expecting %s, %s, %s, %s, %s, %s, %s, or %s" msgstr "s'espera %s, %s, %s, %s, %s, %s, %s o %s" #: src/language/lexer/lexer.c:351 #, c-format msgid "Subcommand %s may only be specified once." msgstr "Subcomando %s només es pot especificar un cop." #: src/language/lexer/lexer.c:363 #, c-format msgid "Required subcommand %s was not specified." msgstr "El subcomando %s requerit no s'ha especificat." #: src/language/lexer/lexer.c:371 #, c-format msgid "%s may only be specified once within subcommand %s" msgstr "%s només es pot especificar un cop dins del subcomando %s" #: src/language/lexer/lexer.c:380 #, c-format msgid "Required %s specification missing from %s subcommand" msgstr "Manca la especificació %s requerida pel subcomando %s" #: src/language/lexer/lexer.c:399 msgid "Syntax error at end of input" msgstr "Error de sintaxi al final de l'entrada" #: src/language/lexer/lexer.c:420 src/language/xforms/select-if.c:60 #: src/language/stats/autorecode.c:206 src/language/stats/npar.c:503 #: src/language/data-io/print-space.c:83 msgid "expecting end of command" msgstr "s'espera el final de l'ordre" #: src/language/lexer/lexer.c:631 msgid "expecting string" msgstr "esperant cadena" #: src/language/lexer/lexer.c:660 msgid "expecting integer" msgstr "esperant sencer" #: src/language/lexer/lexer.c:673 msgid "expecting number" msgstr "esperant número" #: src/language/lexer/lexer.c:685 msgid "expecting identifier" msgstr "esperant identificador" #: src/language/lexer/lexer.c:1272 msgid "Syntax error at end of command" msgstr "Error de sintaxi al final del comando" #: src/language/lexer/lexer.c:1281 #, c-format msgid "Syntax error at `%s'" msgstr "Error de sintaxi a `%s'" #: src/language/lexer/lexer.c:1284 msgid "Syntax error" msgstr "Error de sintaxi" #: src/language/lexer/lexer.c:1470 #, c-format msgid "String of hex digits has %d characters, which is not a multiple of 2" msgstr "" "La cadena de dígits hexadecimals té %d caràcters, que no és un múltiple de 2." #: src/language/lexer/lexer.c:1477 #, c-format msgid "`%c' is not a valid hex digit" msgstr "'%c' no és un dígit hexadecimal vàlid." #: src/language/lexer/lexer.c:1482 #, c-format msgid "" "Unicode string contains %d bytes, which is not in the valid range of 1 to 8 " "bytes" msgstr "" "Cadena Unicode conté %d bytes, que está fora del rang vàlid entre 1 y 8 bytes" #: src/language/lexer/lexer.c:1488 #, c-format msgid "U+%04X is not a valid Unicode code point" msgstr "U+%04X no és un punt de codi Unicode vàlid" #: src/language/lexer/lexer.c:1493 msgid "Unterminated string constant" msgstr "Constante de cadena inacabada" #: src/language/lexer/lexer.c:1497 #, c-format msgid "Missing exponent following `%s'" msgstr "Manca l'exponent a continuació de `%s'" #: src/language/lexer/lexer.c:1502 msgid "Unexpected `.' in middle of command" msgstr "`.' inesperat al mig d'un comand" #: src/language/lexer/lexer.c:1508 #, c-format msgid "Bad character %s in input" msgstr "Caràcter erroni `%s' a l'entrada" #: src/language/lexer/lexer.c:1603 #, c-format msgid "Opening `%s': %s." msgstr "Obrint `%s': %s." #: src/language/lexer/lexer.c:1647 #, c-format msgid "Error closing `%s': %s." msgstr "Error tancant '%s' : %s." #: src/language/lexer/subcommand-list.c:118 #, c-format msgid "No more than %d %s subcommands allowed." msgstr "No es permet més de %d subcomandos %s." #: src/language/lexer/format-parser.c:77 msgid "expecting valid format specifier" msgstr "esperant especificador de format vàlid" #: src/language/lexer/format-parser.c:116 #: src/language/lexer/format-parser.c:143 src/language/utilities/output.c:108 #: src/language/data-io/data-list.c:453 src/language/data-io/get-data.c:638 #: src/language/data-io/placement-parser.c:236 #, c-format msgid "Unknown format type `%s'." msgstr "Tipus de format `%s' desconegut." #: src/language/lexer/format-parser.c:122 #, c-format msgid "Format specifier `%s' lacks required width." msgstr "L'especicador de format `%s' no te l'amplada adient." #: src/language/lexer/format-parser.c:138 msgid "expecting format type" msgstr "esperant el tipus de format" #: src/language/lexer/value-parser.c:66 #, c-format msgid "" "The high end of the range (%.*g) is below the low end (%.*g). The range " "will be treated as if reversed." msgstr "" "El límit superior de l'interval (%.*g) està per sota del límit inferior " "(%.*g). L' interval serà tractat com invertit." #: src/language/lexer/value-parser.c:74 #, c-format msgid "Ends of range are equal (%.*g)." msgstr "*Els límits de l'interval són iguals (%.*g)." #: src/language/lexer/value-parser.c:82 #, c-format msgid "%s or %s must be part of a range." msgstr "%s o %s han de ser part de l'interval." #: src/language/lexer/value-parser.c:112 msgid "System-missing value is not valid here." msgstr "Valor perdut del sistema no és vàlid aquí." #: src/language/lexer/variable-parser.c:86 utilities/pspp-convert.c:83 msgid "expecting variable name" msgstr "esperant nom de la variable" #: src/language/lexer/variable-parser.c:96 #, c-format msgid "%s is not a variable name." msgstr "%s no és un nom de variable." #: src/language/lexer/variable-parser.c:206 #, c-format msgid "" "%s is not a numeric variable. It will not be included in the variable list." msgstr "" "%s no és una variable numèrica. No serà inclosa a la llista de variables." #: src/language/lexer/variable-parser.c:209 #, c-format msgid "" "%s is not a string variable. It will not be included in the variable list." msgstr "" "%s no és una variable de cadena. No serà inclosa a la llista de variables." #: src/language/lexer/variable-parser.c:213 #, c-format msgid "Scratch variables (such as %s) are not allowed here." msgstr "Les variables de treball (com ara %s) no estan permeses aquí." #: src/language/lexer/variable-parser.c:217 #, c-format msgid "" "%s and %s are not the same type. All variables in this variable list must " "be of the same type. %s will be omitted from the list." msgstr "" "%s i %s no són del mateix tipus. Totes les variables d'aquesta llista han de " "ser del mateix tipus. %s serà omesa de la llista." #: src/language/lexer/variable-parser.c:223 #, c-format msgid "" "%s and %s are string variables with different widths. All variables in this " "variable list must have the same width. %s will be omitted from the list." msgstr "" "%s i %s són variables de cadena amb tamanys diferents. Totes les variables " "d'aquesta llista han de tenir la mateixa amplada. %s serà omesa de la llista." #: src/language/lexer/variable-parser.c:228 #: src/language/lexer/variable-parser.c:447 #, c-format msgid "Variable %s appears twice in variable list." msgstr "La variable %s apareix dues vegades en la llista de variables." #: src/language/lexer/variable-parser.c:341 #, c-format msgid "%s TO %s is not valid syntax since %s precedes %s in the dictionary." msgstr "" "%s TO %s no és una sintaxi vàlida atès que %s precedeix %s en el diccionari." #: src/language/lexer/variable-parser.c:349 #, c-format msgid "" "When using the TO keyword to specify several variables, both variables must " "be from the same variable dictionaries, of either ordinary, scratch, or " "system variables. %s is a %s variable, whereas %s is %s." msgstr "" "Quan s'utilitza la paraula clau TO per especificar diverses variables, " "ambdues han de ser del mateix diccionari de variables, ja siguin ordinals, " "scratch, o variables de sistema. %s és una variable %s, atès que %s és %s." #: src/language/lexer/variable-parser.c:424 #, c-format msgid "`%s' cannot be used with TO because it does not end in a digit." msgstr "`%s' no pot ser utilitzat amb TO perquè no acaba amb un dígit." #: src/language/lexer/variable-parser.c:432 #, c-format msgid "Numeric suffix on `%s' is larger than supported with TO." msgstr "Sufix numèric a `%s' és més llarg del que és suportat amb TO." #: src/language/lexer/variable-parser.c:505 msgid "Scratch variables not allowed here." msgstr "Les variables de treball no estan permès aquí." #: src/language/lexer/variable-parser.c:529 msgid "Prefixes don't match in use of TO convention." msgstr "Els prefixos no coincideixen en l'ús de la convenció TO." #: src/language/lexer/variable-parser.c:534 msgid "Bad bounds in use of TO convention." msgstr "Límits incorrectes en l'ús de la convenció TO." #: src/language/xforms/compute.c:150 src/language/xforms/compute.c:205 #, c-format msgid "" "When executing COMPUTE: SYSMIS is not a valid value as an index into vector " "%s." msgstr "" "Quan s'executa COMPUTE: SYSMIS no és un valor vàlid com a índex en el vector " "%s." #: src/language/xforms/compute.c:154 src/language/xforms/compute.c:212 #, c-format msgid "" "When executing COMPUTE: %.*g is not a valid value as an index into vector %s." msgstr "" "Quan s'executa COMPUTE: %.*g no és un valor vàlid com a índex en el vector " "%s." #: src/language/xforms/compute.c:356 #, c-format msgid "There is no vector named %s." msgstr "No hi ha cap vector anomenat %s." #: src/language/xforms/count.c:125 msgid "Destination cannot be a string variable." msgstr "El destí no pot ser una variable de cadena." #: src/language/xforms/sample.c:76 msgid "The sampling factor must be between 0 and 1 exclusive." msgstr "El factor de mostratge ha d'estar exclusivament entre 0 i 1." #: src/language/xforms/sample.c:96 #, c-format msgid "Cannot sample %d observations from a population of %d." msgstr "No es pot fer una mostra de %d observacions d'una població de %d." #: src/language/xforms/recode.c:261 msgid "" "Inconsistent target variable types. Target variables must be all numeric or " "all string." msgstr "" "Tipus inconsistent de variables objectiu. Les variables objectiu han de ser " "totes, o bé de cadena o bé numèriques." #: src/language/xforms/recode.c:282 msgid "CONVERT requires string input values and numeric output values." msgstr "" "CONVERT requereix valors d'entrada de cadena i valors de sortida numèrics. " #: src/language/xforms/recode.c:339 #, c-format msgid "%s is not allowed with string variables." msgstr "%s no es permet amb variables de cadena." #: src/language/xforms/recode.c:422 msgid "expecting output value" msgstr "esperant el valor de sortida" #: src/language/xforms/recode.c:479 #, c-format msgid "" "%zu variable(s) cannot be recoded into %zu variable(s). Specify the same " "number of variables as source and target variables." msgstr "" "%zu variable(s) no poden ser recodificades a %zu variable(s). Especifiqueu " "el mateix nombre de variables com a origen i destinació." #: src/language/xforms/recode.c:494 #, c-format msgid "" "There is no variable named %s. (All string variables specified on INTO must " "already exist. Use the STRING command to create a string variable.)" msgstr "" "No existeix cap variable anomenada %s. (Totes les variables de cadena " "especificades a INTO ja han d'existir. Utilitzeu el comandament STRING per " "crear una variable de cadena.)" #: src/language/xforms/recode.c:510 #, c-format msgid "INTO is required with %s input values and %s output values." msgstr "INTO és necessari amb %s valors d'entrada i %s valors de sortida." #: src/language/xforms/recode.c:523 #, c-format msgid "Type mismatch. Cannot store %s data in %s variable %s." msgstr "Desajust de tipus. No es pot emmagatzemar %s dades a %s variable %s." #: src/language/xforms/recode.c:566 #, c-format msgid "" "Cannot recode because the variable %s would require a width of %d bytes or " "greater, but it has a width of only %d bytes." msgstr "" "Impossible recodificar perquè la variable %s requereix una amplada de %d " "bytes o més, però té una amplada de només %d bytes." #: src/language/xforms/select-if.c:100 msgid "Syntax error expecting OFF or BY. Turning off case filtering." msgstr "Error de sintaxi esperant OFF o BY. Desactivant el filtratge de casos." #: src/language/xforms/select-if.c:115 msgid "The filter variable must be numeric." msgstr "La variable de filtre ha de ser numèrica." #: src/language/xforms/select-if.c:121 msgid "The filter variable may not be scratch." msgstr "La variable de filtre no pot ser zero." #: src/language/control/control-stack.c:49 #, c-format msgid "%s without %s." msgstr "%s sense %s." #: src/language/control/control-stack.c:77 #, c-format msgid "This command must appear inside %s...%s, without intermediate %s...%s." msgstr "" "Aquesta ordre ha d'aparèixer dins de %s...%s, sense intermediaris %s...%s." #: src/language/control/control-stack.c:94 #, c-format msgid "This command cannot appear outside %s...%s." msgstr "Aquest comandament no pot aparèixer fora de %s...%s." #: src/language/control/do-if.c:180 #, c-format msgid "This command may not follow %s in %s ... %s." msgstr "Aquest comandament no pot seguir %s en %s ... %s." #: src/language/control/loop.c:211 msgid "Only one index clause may be specified." msgstr "Només pot ser especificada una clàusula d'índex." #: src/language/control/repeat.c:120 #, c-format msgid "Dummy variable name `%s' hides dictionary variable `%s'." msgstr "" "El nom de la variable fictícia `%s' oculta la variable de diccionari `%s'." #: src/language/control/repeat.c:126 #, c-format msgid "Dummy variable name `%s' is given twice." msgstr "El nom de la variable fictícia `%s' es dóna dues vegades." #: src/language/control/repeat.c:170 #, c-format msgid "" "Dummy variable `%s' had %zu substitutions, so `%s' must also, but %zu were " "specified." msgstr "" "La variable fictícia `%.s' té %zu substitucions, així que `%s' també " "n'hauria de tenir-les, però es van especificar %zu." #: src/language/control/repeat.c:379 msgid "Ranges may only have integer bounds." msgstr "Els intervals només poden tenir límits sencers." #: src/language/control/repeat.c:393 #, c-format msgid "%ld TO %ld is an invalid range." msgstr "%ld TO %ld és un interval invalid." #: src/language/control/repeat.c:443 #, c-format msgid "No matching %s." msgstr "%s no coincideix." #: src/language/control/temporary.c:44 msgid "" "This command may only appear once between procedures and procedure-like " "commands." msgstr "" "Aquesta ordre només pot aparèixer una vegada entre les ordres de " "procediments i quasi-procediments." #: src/language/dictionary/attributes.c:104 msgid "Attribute array index must be between 1 and 65535." msgstr "L'índex de la taula d'atributs ha d'estar entre 1 i 65535." #: src/language/dictionary/apply-dictionary.c:74 #, c-format msgid "Variable %s is %s in target file, but %s in source file." msgstr "" "La variable %s és %s en l'arxiu de destinació, però %s en l'arxiu d'origen." #: src/language/dictionary/apply-dictionary.c:110 msgid "No matching variables found between the source and target files." msgstr "" "No s'han trobat coincidències de variables entre els arxius d'origen i de " "destinació." #: src/language/dictionary/delete-variables.c:40 #: src/language/dictionary/modify-variables.c:79 #: src/language/dictionary/rename-variables.c:51 #, c-format msgid "" "%s may not be used after %s. Temporary transformations will be made " "permanent." msgstr "" "%s no pot ser utilitzar després de %s. Les transformacions temporals seran " "permanents." #: src/language/dictionary/delete-variables.c:48 #: src/language/dictionary/modify-variables.c:312 #, c-format msgid "" "%s may not be used to delete all variables from the active dataset " "dictionary. Use %s instead." msgstr "" "%s no pot ser utilitzar per esborrar totes les variables de l'arxiu de dades " "de diccionari actiu. Utilitzeu %s al seu lloc." #: src/language/dictionary/missing-values.c:70 #, c-format msgid "" "Cannot mix numeric variables (e.g. %s) and string variables (e.g. %s) within " "a single list." msgstr "" "No es poden barrejar les variables numèriques (e.g. %s) i les variables de " "cadena (e.g. %s) dins d'una llista única." #: src/language/dictionary/missing-values.c:91 msgid "" "Too many numeric missing values. At most three individual values or one " "value and one range are allowed." msgstr "" "Massa valors perduts numérics. Es permet com a màxim tres valors individuals " "i un rang de valors." #: src/language/dictionary/missing-values.c:126 #, c-format msgid "Truncating missing value to maximum acceptable length (%d bytes)." msgstr "Truncant el valor perdut a la longitud màxima acceptable (%d bytes)." #: src/language/dictionary/missing-values.c:137 msgid "" "Too many string missing values. At most three individual values are allowed." msgstr "" "Massa valors perduts alfanumèrics. Es permet com a màxim tres valors " "individuals." #: src/language/dictionary/missing-values.c:154 #, c-format msgid "Missing values provided are too long to assign to variable of width %d." msgstr "" "Els valors perduts donats són massa llargs per assignar a la variable " "d'amplada %d." #: src/language/dictionary/modify-variables.c:145 msgid "Cannot specify ALL after specifying a set of variables." msgstr "" "No es pot especificar ALL després de l'especificació d'un conjunt de " "variables." #: src/language/dictionary/modify-variables.c:221 #: src/language/dictionary/rename-variables.c:76 #, c-format msgid "" "Differing number of variables in old name list (%zu) and in new name list " "(%zu)." msgstr "" "Diferent nombre de variables en la llista de noms antiga (%zu) i en la " "llista de noms nova (%zu)." #: src/language/dictionary/modify-variables.c:244 #: src/language/dictionary/modify-variables.c:294 #, c-format msgid "" "%s subcommand may be given at most once. It may not be given in conjunction " "with the %s subcommand." msgstr "" "El subcomando %s pot ser utilitzat només una vegada. No pot ser utilitzat " "conjuntament amb el subcomando %s." #: src/language/dictionary/modify-variables.c:331 #, c-format msgid "Unrecognized subcommand name `%s'." msgstr "Nom del subcomando no reconegut '%s'." #: src/language/dictionary/modify-variables.c:334 msgid "Subcommand name expected." msgstr "Nom del subcomando esperat." #: src/language/dictionary/mrsets.c:117 #, c-format msgid "" "VARIABLES specified only variable %s on %s, but at least two variables are " "required." msgstr "" "VARIABLES especifica només la variable %s a %s, però es requereixen al menys " "dues variables." #: src/language/dictionary/mrsets.c:150 msgid "Numeric VALUE must be an integer." msgstr "VALUE numèric ha de ser un enter." #: src/language/dictionary/mrsets.c:230 src/language/dictionary/mrsets.c:268 #, c-format msgid "" "MDGROUP subcommand for group %s specifies a string VALUE, but the variables " "specified for this group are numeric." msgstr "" "El subcomando MDGROUPS pel grup %s especifica un VALUE textual, però les " "variables especificades per aquest grup son numèriques." #: src/language/dictionary/mrsets.c:254 #, c-format msgid "" "VALUE string on MDGROUP subcommand for group %s is %d bytes long, but it " "must be no longer than the narrowest variable in the group, which is %s with " "a width of %d bytes." msgstr "" "El VALUE textual al subcomando MDGROUP pel grup %s té %d bytes, però no pot " "ser més llarg que la variable més curta al grup, que és %s amb llargada %d " "bytes." #: src/language/dictionary/mrsets.c:280 #, c-format msgid "" "MDGROUP subcommand for group %s specifies LABELSOURCE=VARLABEL but not " "CATEGORYLABELS=COUNTEDVALUES. Ignoring LABELSOURCE." msgstr "" "El subcomando MDGROUP pel grup %s espeficifica LABELSOURCE=VARLABEL però no " "CATEGORYLABELS=COUNTEDVALUES. S'ignorarà LABELSOURCE." #: src/language/dictionary/mrsets.c:286 #, c-format msgid "" "MDGROUP subcommand for group %s specifies both LABEL and LABELSOURCE, but " "only one of these subcommands may be used at a time. Ignoring LABELSOURCE." msgstr "" "El subcomando MDGROUP pel grup %s espeficifica LABEL i LABELSOURCE, però " "només un d'aquests subcomandos pot ser utilitzat alhora. S'ignorarà " "LABELSOURCE." #: src/language/dictionary/mrsets.c:326 #, c-format msgid "" "Variables %s and %s specified as part of multiple dichotomy group %s have " "the same variable label. Categories represented by these variables will not " "be distinguishable in output." msgstr "" "Les variables %s i %s especificades com a part del grup dicotòmic múltiple " "%s tenen la mateixa etiqueta de variable. Les categories representades per " "aquestes variables no seran distingibles als resultats." #: src/language/dictionary/mrsets.c:356 #, c-format msgid "" "Variable %s specified as part of multiple dichotomy group %s (which has " "CATEGORYLABELS=COUNTEDVALUES) has no value label for its counted value. " "This category will not be distinguishable in output." msgstr "" "La variable %s especificada com a part del grup dicotòmic múltiple %s (que " "té CATEGORYLABELS=COUNTEDVALUES) no en té etiqueta de valor pel seu valor de " "recompte. Aquesta categoria no serà distingible als resultats." #: src/language/dictionary/mrsets.c:369 #, c-format msgid "" "Variables %s and %s specified as part of multiple dichotomy group %s (which " "has CATEGORYLABELS=COUNTEDVALUES) have the same value label for the group's " "counted value. These categories will not be distinguishable in output." msgstr "" "Les variables %s i %s especificades com a part del grup dicotòmic múltiple " "%s (que té CATEGORYLABELS=COUNTEDVALUES) té la mateixa etiqueta de valor pel " "valor de recompte del grup. Aquestes categories no seran distingible als " "resultats." #: src/language/dictionary/mrsets.c:426 #, c-format msgid "" "Variables specified on MCGROUP should have the same categories, but %s and " "%s (and possibly others) in multiple category group %s have different value " "labels for value %s." msgstr "" "Variables especificades a MDGROUP han de tenir les mateixes categories, però " "%s i %s (i posiblement d'altres) al grup de caterories múltiple %s té " "diferents etiquetes de valors pel valor %s." #: src/language/dictionary/mrsets.c:484 #, c-format msgid "No multiple response set named %s." msgstr "Cap conjunt multiresposta anomenat %s." #: src/language/dictionary/mrsets.c:533 msgid "" "The active dataset dictionary does not contain any multiple response sets." msgstr "" "El diccionari de l'arxiu de dades actiu no conté cap conjunt de multi-" "resposta. " #: src/language/dictionary/mrsets.c:540 msgid "Multiple Response Sets" msgstr "Conjunts Multi-Resposta" #: src/language/dictionary/mrsets.c:543 #: src/language/dictionary/sys-file-info.c:446 #: src/language/dictionary/sys-file-info.c:733 #: src/language/stats/autorecode.c:375 src/language/data-io/data-parser.c:679 #: src/language/data-io/data-parser.c:725 src/language/data-io/print.c:434 #, fuzzy #| msgid "Attribute" msgid "Attributes" msgstr "Atribut" #: src/language/dictionary/mrsets.c:544 #: src/language/dictionary/sys-file-info.c:191 #: src/language/dictionary/sys-file-info.c:301 #: src/language/dictionary/sys-file-info.c:302 #: src/language/dictionary/sys-file-info.c:455 #: src/language/dictionary/sys-file-info.c:570 #: src/ui/gui/psppire-var-sheet-header.c:67 src/ui/gui/compute.ui:157 msgid "Label" msgstr "Etiqueta" #: src/language/dictionary/mrsets.c:544 #: src/language/dictionary/sys-file-info.c:241 #, fuzzy #| msgid "Encoding:" msgid "Encoding" msgstr "Codificació:l" #: src/language/dictionary/mrsets.c:544 #, fuzzy #| msgid "Counted value" msgid "Counted Value" msgstr "Valor de recompte" #: src/language/dictionary/mrsets.c:544 #, fuzzy #| msgid "Cl_ear Variables" msgid "Member Variables" msgstr "_Eliminar Variables:" #: src/language/dictionary/mrsets.c:547 #: src/language/dictionary/sys-file-info.c:470 #: src/ui/gui/psppire-var-sheet-header.c:55 msgid "Name" msgstr "Nom" #: src/language/dictionary/mrsets.c:564 msgid "Dichotomies" msgstr "" #: src/language/dictionary/mrsets.c:565 src/language/stats/logistic.c:1391 #, fuzzy #| msgid "Category" msgid "Categories" msgstr "Categoria" #: src/language/dictionary/numeric.c:67 #, c-format msgid "Format type %s may not be used with a numeric variable." msgstr "Tipus de format %s no pot ser utilitzat amb una variable numèrica." #: src/language/dictionary/numeric.c:86 src/language/dictionary/numeric.c:153 #, c-format msgid "There is already a variable named %s." msgstr "Ja existeix una variable amb el nom %s." #: src/language/dictionary/numeric.c:138 #, c-format msgid "Format type %s may not be used with a string variable." msgstr "Tipus de format %s no pot ser utilitzat amb una variable de cadena. " #: src/language/dictionary/rename-variables.c:92 #, c-format msgid "Renaming would duplicate variable name %s." msgstr "Canviar el nom duplicaria el nom de la variable %s." #: src/language/dictionary/split-file.c:75 #, fuzzy #| msgid "Split File" msgid "Split Values" msgstr "Divideix Arxiu" #: src/language/dictionary/split-file.c:76 #: src/language/dictionary/split-file.c:77 #: src/language/dictionary/sys-file-info.c:696 #: src/language/stats/chisquare.c:195 src/language/stats/cochran.c:156 #: src/language/stats/cochran.c:185 src/language/stats/examine.c:841 #: src/language/stats/reliability.c:648 src/language/stats/reliability.c:651 #: src/language/stats/crosstabs.q:1303 src/language/stats/crosstabs.q:1325 #: src/language/stats/crosstabs.q:1365 src/language/stats/crosstabs.q:1412 msgid "Value" msgstr "Valor" #: src/language/dictionary/split-file.c:79 #: src/language/dictionary/sys-file-info.c:734 #: src/language/stats/chisquare.c:246 src/language/stats/chisquare.c:328 #: src/language/stats/cochran.c:164 src/language/stats/correlations.c:100 #: src/language/stats/descriptives.c:1004 src/language/stats/friedman.c:226 #: src/language/stats/jonckheere-terpstra.c:377 #: src/language/stats/npar-summary.c:113 src/language/stats/quick-cluster.c:588 #: src/language/stats/runs.c:331 src/language/data-io/data-parser.c:683 #: src/language/data-io/data-parser.c:728 src/language/data-io/print.c:438 #: src/ui/gui/psppire-dictview.c:580 src/ui/gui/psppire-data-editor.c:502 msgid "Variable" msgstr "Variable" #: src/language/dictionary/sys-file-info.c:184 #, fuzzy #| msgid "Variable Information:" msgid "File Information" msgstr "Informació de la Variable" #: src/language/dictionary/sys-file-info.c:185 msgid "Attribute" msgstr "Atribut" #: src/language/dictionary/sys-file-info.c:187 #, fuzzy #| msgid "File:" msgid "File" msgstr "Arxiu:" #: src/language/dictionary/sys-file-info.c:194 #, fuzzy #| msgid "Created:" msgid "Created" msgstr "Creat:" #: src/language/dictionary/sys-file-info.c:203 #, fuzzy #| msgid "Integer Format:" msgid "Integer Format" msgstr "Format Sencer:" #: src/language/dictionary/sys-file-info.c:205 msgid "Big Endian" msgstr "Tipus Big-Endian." #: src/language/dictionary/sys-file-info.c:206 msgid "Little Endian" msgstr "Tipus Little-Endian." #: src/language/dictionary/sys-file-info.c:207 #: src/language/dictionary/sys-file-info.c:216 #: src/language/dictionary/sys-file-info.c:223 src/language/utilities/set.q:930 msgid "Unknown" msgstr "Desconegut" #: src/language/dictionary/sys-file-info.c:209 #, fuzzy #| msgid "Real Format:" msgid "Real Format" msgstr "Format Real:" #: src/language/dictionary/sys-file-info.c:211 msgid "IEEE 754 LE." msgstr "IEEE 754 LE." #: src/language/dictionary/sys-file-info.c:212 msgid "IEEE 754 BE." msgstr "IEE 754 BE." #: src/language/dictionary/sys-file-info.c:213 msgid "VAX D." msgstr "VAX D." #: src/language/dictionary/sys-file-info.c:214 msgid "VAX G." msgstr "VAX G." #: src/language/dictionary/sys-file-info.c:215 msgid "IBM 390 Hex Long." msgstr "IBM 390 Hex Long." #: src/language/dictionary/sys-file-info.c:218 #: src/language/dictionary/sys-file-info.c:443 #: src/language/stats/binomial.c:199 src/language/stats/correlations.c:131 #: src/language/stats/correlations.c:159 src/language/stats/descriptives.c:585 #: src/language/stats/factor.c:1658 src/language/stats/factor.c:1701 #: src/language/stats/factor.c:1860 src/language/stats/factor.c:2074 #: src/language/stats/frequencies.c:1583 #: src/language/stats/kruskal-wallis.c:254 #: src/language/stats/kruskal-wallis.c:303 #: src/language/stats/ks-one-sample.c:316 src/language/stats/logistic.c:1187 #: src/language/stats/mann-whitney.c:254 src/language/stats/means.c:718 #: src/language/stats/means.c:800 src/language/stats/median.c:358 #: src/language/stats/oneway.c:985 src/language/stats/oneway.c:1157 #: src/language/stats/reliability.c:591 src/language/stats/regression.c:924 #: src/language/stats/t-test-one-sample.c:132 #: src/language/stats/t-test-paired.c:157 src/language/data-io/list.c:104 #: src/ui/gui/variable-info.ui:25 msgid "Variables" msgstr "Variables:" #: src/language/dictionary/sys-file-info.c:221 src/language/stats/examine.c:929 #: src/language/stats/means.c:697 src/language/stats/reliability.c:548 #: src/language/stats/crosstabs.q:930 msgid "Cases" msgstr "Casos" #: src/language/dictionary/sys-file-info.c:226 src/language/stats/oneway.c:980 #: src/ui/gui/psppire-var-sheet-header.c:58 src/ui/gui/compute.ui:303 msgid "Type" msgstr "Tipus:" #: src/language/dictionary/sys-file-info.c:230 #, fuzzy #| msgid "Weight:" msgid "Weight" msgstr "Pes:" #: src/language/dictionary/sys-file-info.c:233 #, fuzzy #| msgid "Not weighted." msgid "Not weighted" msgstr "No ponderat." #: src/language/dictionary/sys-file-info.c:235 #, fuzzy #| msgid "Compression:" msgid "Compression" msgstr "Compressió:" #: src/language/dictionary/sys-file-info.c:245 #: src/language/dictionary/sys-file-info.c:424 #: src/language/dictionary/sys-file-info.c:426 #, fuzzy #| msgid "Comments:" msgid "Documents" msgstr "Comentaris:" #: src/language/dictionary/sys-file-info.c:305 #: src/language/dictionary/sys-file-info.c:430 msgid "(none)" msgstr "" #: src/language/dictionary/sys-file-info.c:393 msgid "No variables to display." msgstr "Cap variable per mostrar." #: src/language/dictionary/sys-file-info.c:404 msgid "Macros not supported." msgstr "Macros no disponibles." #: src/language/dictionary/sys-file-info.c:426 #, fuzzy #| msgid "Document Line %zu" msgid "Document" msgstr "Linia del document %zu" #: src/language/dictionary/sys-file-info.c:454 msgid "Position" msgstr "Posició" #: src/language/dictionary/sys-file-info.c:456 #, fuzzy #| msgid "Measurement Level: %s\n" msgid "Measurement Level" msgstr "Nivel de Mesura: %s\n" #: src/language/dictionary/sys-file-info.c:457 #: src/ui/gui/psppire-var-sheet-header.c:85 msgid "Role" msgstr "Rol" #: src/language/dictionary/sys-file-info.c:458 #: src/ui/gui/psppire-var-sheet-header.c:61 src/ui/gui/compute.ui:215 msgid "Width" msgstr "Ample" #: src/language/dictionary/sys-file-info.c:459 #, fuzzy #| msgid "Align" msgid "Alignment" msgstr "Aliniament" #: src/language/dictionary/sys-file-info.c:460 #: src/language/dictionary/sys-file-info.c:734 msgid "Print Format" msgstr "Format d'Impressió" #: src/language/dictionary/sys-file-info.c:461 #, fuzzy #| msgid "Print Format" msgid "Write Format" msgstr "Format d'Impressió" #: src/language/dictionary/sys-file-info.c:462 #: src/ui/gui/missing-val-dialog.c:379 src/ui/gui/psppire-var-sheet-header.c:73 #: src/ui/gui/examine.ui:416 src/ui/gui/t-test.ui:105 msgid "Missing Values" msgstr "Valors perduts" #: src/language/dictionary/sys-file-info.c:567 #: src/ui/gui/psppire-var-sheet-header.c:70 src/ui/gui/val-labs-dialog.c:489 #: src/ui/gui/val-labs-dialog.ui:194 msgid "Value Labels" msgstr "Etiquetes de Valor" #: src/language/dictionary/sys-file-info.c:573 #, fuzzy #| msgid "Variable View" msgid "Variable Value" msgstr "Vista de Variables" #: src/language/dictionary/sys-file-info.c:577 #, fuzzy #| msgid "Last non-missing value" msgid "User-missing value" msgstr "Darrer valor no-perdut" #: src/language/dictionary/sys-file-info.c:693 #, fuzzy #| msgid "Variable under test" msgid "Variable and Dataset Attributes" msgstr "Variable sota prova" #: src/language/dictionary/sys-file-info.c:699 #, fuzzy #| msgid "Variable Name: " msgid "Variable and Name" msgstr " Variable:" #: src/language/dictionary/sys-file-info.c:702 #, fuzzy #| msgid "dataset" msgid "(dataset)" msgstr "arxiu de dades" #: src/language/dictionary/sys-file-info.c:722 msgid "No vectors defined." msgstr "Vectors no definits." #: src/language/dictionary/sys-file-info.c:732 #, fuzzy #| msgid "Vector" msgid "Vectors" msgstr "Vector" #: src/language/dictionary/sys-file-info.c:736 msgid "Vector and Position" msgstr "" #: src/language/dictionary/sys-file-info.c:998 msgid "No valid encodings found." msgstr "No s'ha trobat codificació vàlida." #: src/language/dictionary/sys-file-info.c:1004 #, c-format msgid "Usable encodings for %s." msgstr "Codificacions disponibles per a %s." #: src/language/dictionary/sys-file-info.c:1007 #, c-format msgid "" "Encodings that can successfully read %s (by specifying the encoding name on " "the GET command's ENCODING subcommand). Encodings that yield identical text " "are listed together." msgstr "" "Codificacions que poden llegir %s correctament (especificant el nom de " "codificació a l'ordre GET amb el subcomando ENCODING). Les codificacions que " "proporcionen text identic apareixen llistades juntes." #: src/language/dictionary/sys-file-info.c:1012 #: src/language/dictionary/sys-file-info.c:1013 msgid "Encodings" msgstr "Codificacions" #: src/language/dictionary/sys-file-info.c:1042 #, fuzzy, c-format #| msgid "%s encoded text strings." msgid "%s Encoded Text Strings" msgstr "%s cadenes de text codificades." #: src/language/dictionary/sys-file-info.c:1046 msgid "" "Text strings in the file dictionary that the previously listed encodings " "interpret differently, along with the interpretations." msgstr "" "Cadenes de text al diccionari de l'arxiu que les codificacions prèviament " "llistades interpreten de forma diferent, amb les seves interpretacions." #: src/language/dictionary/sys-file-info.c:1049 src/output/text-item.c:57 #: src/ui/gui/psppire-import-assistant.c:885 msgid "Text" msgstr "Text" #: src/language/dictionary/sys-file-info.c:1059 msgid "Purpose" msgstr "Propòsit" #: src/language/dictionary/value-labels.c:154 #, c-format msgid "Truncating value label to %d bytes." msgstr "Truncant etiqueta de valor a %d caràcters." #: src/language/dictionary/vector.c:66 #, c-format msgid "A vector named %s already exists." msgstr "Un vector anomenat %s ja existeix." #: src/language/dictionary/vector.c:74 #, c-format msgid "Vector name %s is given twice." msgstr "El nom del vector %s es dóna dues vegades." #: src/language/dictionary/vector.c:98 msgid "A slash must separate each vector specification in VECTOR's long form." msgstr "" "Una barra ha de separar cada especificació de vector en la forma llarga de " "VECTOR." #: src/language/dictionary/vector.c:131 msgid "Vectors must have at least one element." msgstr "Els vectors han de tenir almenys un element." #: src/language/dictionary/vector.c:151 msgid "expecting vector length" msgstr "esperant longitud del vector" #: src/language/dictionary/vector.c:170 #, c-format msgid "%s is an existing variable name." msgstr "%s és un nom de variable existent." #: src/language/dictionary/variable-display.c:121 msgid "Variable display width must be a positive integer." msgstr "La amplada de la mostra de la variable ha de ser un enter positiu." #: src/language/dictionary/weight.c:49 msgid "The weighting variable must be numeric." msgstr "La variable de ponderació ha de ser numèrica." #: src/language/dictionary/weight.c:54 msgid "The weighting variable may not be scratch." msgstr "La variable de ponderació no pot ser zero." #: src/language/tests/moments-test.c:50 msgid "expecting weight value" msgstr "esperant el valor de ponderació" #: src/language/utilities/cd.c:45 src/language/utilities/include.c:173 #, fuzzy, c-format #| msgid "Cannot change directory to %s: %s " msgid "Cannot change directory to %s: %s" msgstr "No es pot canviar el directori per %s: %s" #: src/language/utilities/date.c:33 #, c-format msgid "Only %s is currently implemented." msgstr "Només %s està implementat actualment." #: src/language/utilities/host.c:60 #, fuzzy #| msgid "Command shell not supported on this platform." msgid "Time limit not supported on this platform." msgstr "Intèrpret d'ordres no disponible per aquesta plataforma." #: src/language/utilities/host.c:74 #, c-format msgid "%s: Command exited with status %d." msgstr "" #: src/language/utilities/host.c:95 #, fuzzy, c-format #| msgid "failed to create temporary file" msgid "Failed to create temporary file (%s)." msgstr "error en crear l'arxiu temporal" #: src/language/utilities/host.c:102 #, c-format msgid "/dev/null: Failed to open (%s)." msgstr "" #: src/language/utilities/host.c:117 #, c-format msgid "Couldn't fork: %s." msgstr "Impossible crear forquilla: %s." #: src/language/utilities/host.c:193 #, c-format msgid "While running \"%s\", waiting for child process failed (%s)." msgstr "" #: src/language/utilities/host.c:203 #, c-format msgid "Command \"%s\" timed out." msgstr "" #: src/language/utilities/host.c:205 #, c-format msgid "Command \"%s\" terminated by signal %d." msgstr "" #: src/language/utilities/host.c:212 msgid "Command or shell not found" msgstr "" #: src/language/utilities/host.c:214 msgid "Could not invoke command or shell" msgstr "" #: src/language/utilities/host.c:217 #, c-format msgid "Command \"%s\" exited with status %d (%s)." msgstr "" #: src/language/utilities/host.c:220 #, c-format msgid "Command \"%s\" exited with status %d." msgstr "" #: src/language/utilities/host.c:230 #, c-format msgid "Command \"%s\" output could not be read (%s)." msgstr "" #: src/language/utilities/title.c:88 #, c-format msgid " (Entered %s)" msgstr " (Introduït %s)" #: src/language/utilities/include.c:73 #, c-format msgid "Can't find `%s' in include file search path." msgstr "No es pot trobar `%s' en la ruta de cerca de l'arxiu d'inclusió." #: src/language/utilities/output.c:128 #, fuzzy, c-format #| msgid "Unknown command `%s'." msgid "Unknown cell class %s." msgstr "Comando `%s' desconegut." #: src/language/utilities/permissions.c:113 #, c-format msgid "Cannot stat %s: %s" msgstr "No es pot dir que %s: %s" #: src/language/utilities/permissions.c:127 #, c-format msgid "Cannot change mode of %s: %s" msgstr "No es pot canviar el mode ed %s: %s" #: src/language/stats/aggregate.c:96 msgid "Sum of values" msgstr "Suma de valors" #: src/language/stats/aggregate.c:97 msgid "Mean average" msgstr "Mitjana promig" #: src/language/stats/aggregate.c:98 msgid "Median average" msgstr "Mediana promig" #: src/language/stats/aggregate.c:99 #: src/ui/gui/psppire-dialog-action-descriptives.c:40 #: src/ui/gui/psppire-dialog-action-frequencies.c:41 msgid "Standard deviation" msgstr "Desviació Estàndard" #: src/language/stats/aggregate.c:100 #: src/ui/gui/psppire-dialog-action-descriptives.c:42 msgid "Maximum value" msgstr "Valor màxim" #: src/language/stats/aggregate.c:101 #: src/ui/gui/psppire-dialog-action-descriptives.c:41 msgid "Minimum value" msgstr "Valor mínim" #: src/language/stats/aggregate.c:102 msgid "Percentage greater than" msgstr "Percentatge mes gran que" #: src/language/stats/aggregate.c:103 msgid "Percentage less than" msgstr "Percentatge mes petit que" #: src/language/stats/aggregate.c:104 msgid "Percentage included in range" msgstr "Percentatge inclos a l'interval" #: src/language/stats/aggregate.c:105 msgid "Percentage excluded from range" msgstr "Percentatge exclos de l'interval" #: src/language/stats/aggregate.c:106 msgid "Fraction greater than" msgstr "Fracció més gran que" #: src/language/stats/aggregate.c:107 msgid "Fraction less than" msgstr "Fracció més petit que" #: src/language/stats/aggregate.c:108 msgid "Fraction included in range" msgstr "Fracció inclosa a l'interval" #: src/language/stats/aggregate.c:109 msgid "Fraction excluded from range" msgstr "Fracció exclosa de l'nterval" #: src/language/stats/aggregate.c:110 msgid "Number of cases" msgstr "Nombre de casos" #: src/language/stats/aggregate.c:111 msgid "Number of cases (unweighted)" msgstr "Nombre de casos (sense ponderar)" #: src/language/stats/aggregate.c:112 msgid "Number of missing values" msgstr "Nombre de valors perduts" #: src/language/stats/aggregate.c:113 msgid "Number of missing values (unweighted)" msgstr "Nombre de valors perduts (sense ponderar)" #: src/language/stats/aggregate.c:114 msgid "First non-missing value" msgstr "Primer valor no-perdut" #: src/language/stats/aggregate.c:115 msgid "Last non-missing value" msgstr "Darrer valor no-perdut" #: src/language/stats/aggregate.c:258 msgid "" "When PRESORTED is specified, specifying sorting directions with (A) or (D) " "has no effect. Output data will be sorted the same way as the input data." msgstr "" "Quan s'especifica PRESORTED, donar directives d'ordenació amb (A) o (D) no " "té efecte. Les dades de sortida seran ordenades de la mateixa manera que les " "d'entrada." #: src/language/stats/aggregate.c:448 msgid "expecting aggregation function" msgstr "esperant un funció agregadora" #: src/language/stats/aggregate.c:460 #, c-format msgid "Unknown aggregation function %s." msgstr "Funció desconeguda %s." #: src/language/stats/aggregate.c:513 #, c-format msgid "Missing argument %zu to %s." msgstr "Argument perdut %zu per a %s." #: src/language/stats/aggregate.c:522 #, c-format msgid "Arguments to %s must be of same type as source variables." msgstr "" "Els arguments per a %s han de ser del mateix tipus que les variables " "d'origen." #: src/language/stats/aggregate.c:541 #, c-format msgid "" "Number of source variables (%zu) does not match number of target variables " "(%zu)." msgstr "" "Nombre de variables d'origen (%zu) no coincideix amb el nombre de variables " "de destinació (%zu)." #: src/language/stats/aggregate.c:557 #, c-format msgid "" "The value arguments passed to the %s function are out-of-order. They will " "be treated as if they had been specified in the correct order." msgstr "" "El valor dels arguments passats a la funció %s estan fora d'ordre. Seran " "tractats com si haguessin estat especificats en l'ordre correcte." #: src/language/stats/aggregate.c:631 #, c-format msgid "" "Variable name %s is not unique within the aggregate file dictionary, which " "contains the aggregate variables and the break variables." msgstr "" "El nom de variable %s no és únic dins l'arxiu de diccionari agregat, que " "conté les variables agregades i les variables de tall." #: src/language/stats/autorecode.c:152 #, c-format msgid "Source variable count (%zu) does not match target variable count (%zu)." msgstr "" "El recompte de la variable d'origen (%zu) no coincideix amb el recompte de " "la variable de destí (%zu)." #: src/language/stats/autorecode.c:164 #, c-format msgid "Target variable %s duplicates existing variable %s." msgstr "Variable de destí %s duplica una variable existent %s." #: src/language/stats/autorecode.c:221 #, c-format msgid "" "With GROUP, variables may not mix string variables (such as %s) and numeric " "variables (such as %s)." msgstr "" #: src/language/stats/autorecode.c:363 #, fuzzy #| msgid "Recode into Same Variables" msgid "Recoding grouped variables." msgstr "Recodifica en les Mateixes variables" #: src/language/stats/autorecode.c:365 #, fuzzy, c-format #| msgid "Replacing %s by %s: %s." msgid "Recoding %s into %s (%s)." msgstr "Substituint %s per %s: %s." #: src/language/stats/autorecode.c:369 #, fuzzy, c-format #| msgid "Removing %s: %s." msgid "Recoding %s into %s." msgstr "Eliminant %s: %s." #: src/language/stats/autorecode.c:376 src/ui/gui/recode.ui:209 msgid "New Value" msgstr "Nou Valor" #: src/language/stats/autorecode.c:376 msgid "Value Label" msgstr "Etiqueta de Valor" #: src/language/stats/autorecode.c:379 msgid "Old Value" msgstr "Valor antic" #: src/language/stats/binomial.c:138 #, c-format msgid "Variable %s is not dichotomous" msgstr "La variable %s no és dicotòmica" #: src/language/stats/binomial.c:182 src/ui/gui/binomial.ui:30 msgid "Binomial Test" msgstr "Prova Binomial" #: src/language/stats/binomial.c:186 src/language/stats/chisquare.c:183 #: src/language/stats/chisquare.c:239 src/language/stats/chisquare.c:322 #: src/language/stats/cochran.c:188 src/language/stats/correlations.c:94 #: src/language/stats/correlations.c:145 src/language/stats/descriptives.c:991 #: src/language/stats/examine.c:602 src/language/stats/examine.c:742 #: src/language/stats/examine.c:836 src/language/stats/examine.c:925 #: src/language/stats/factor.c:1755 src/language/stats/factor.c:1878 #: src/language/stats/factor.c:1908 src/language/stats/factor.c:2068 #: src/language/stats/factor.c:2102 src/language/stats/frequencies.c:302 #: src/language/stats/frequencies.c:1579 src/language/stats/frequencies.c:1586 #: src/language/stats/friedman.c:250 src/language/stats/glm.c:729 #: src/language/stats/kruskal-wallis.c:249 #: src/language/stats/kruskal-wallis.c:297 #: src/language/stats/ks-one-sample.c:278 src/language/stats/logistic.c:1170 #: src/language/stats/logistic.c:1300 src/language/stats/logistic.c:1330 #: src/language/stats/jonckheere-terpstra.c:361 #: src/language/stats/mann-whitney.c:184 src/language/stats/mann-whitney.c:247 #: src/language/stats/means.c:757 src/language/stats/means.c:811 #: src/language/stats/mcnemar.c:222 src/language/stats/median.c:315 #: src/language/stats/median.c:350 src/language/stats/npar-summary.c:106 #: src/language/stats/oneway.c:973 src/language/stats/oneway.c:1051 #: src/language/stats/oneway.c:1150 src/language/stats/oneway.c:1238 #: src/language/stats/oneway.c:1373 src/language/stats/quick-cluster.c:746 #: src/language/stats/reliability.c:543 src/language/stats/reliability.c:584 #: src/language/stats/reliability.c:633 src/language/stats/reliability.c:644 #: src/language/stats/roc.c:969 src/language/stats/roc.c:1067 #: src/language/stats/regression.c:867 src/language/stats/regression.c:899 #: src/language/stats/regression.c:1023 src/language/stats/regression.c:1089 #: src/language/stats/runs.c:318 src/language/stats/sign.c:102 #: src/language/stats/t-test-indep.c:193 src/language/stats/t-test-indep.c:259 #: src/language/stats/t-test-one-sample.c:68 #: src/language/stats/t-test-one-sample.c:125 #: src/language/stats/t-test-paired.c:150 #: src/language/stats/t-test-paired.c:193 #: src/language/stats/t-test-paired.c:238 src/language/stats/wilcoxon.c:243 #: src/language/stats/wilcoxon.c:282 src/language/stats/crosstabs.q:925 #: src/language/stats/crosstabs.q:1253 src/language/stats/crosstabs.q:1293 #: src/language/stats/crosstabs.q:1302 src/language/stats/crosstabs.q:1331 #: src/language/stats/crosstabs.q:1373 src/language/stats/crosstabs.q:1418 #: src/ui/gui/crosstabs.ui:499 src/ui/gui/oneway.ui:615 msgid "Statistics" msgstr "Estatísticas" #: src/language/stats/binomial.c:187 src/language/stats/chisquare.c:240 #: src/language/stats/chisquare.c:252 msgid "Category" msgstr "Categoria" #: src/language/stats/binomial.c:188 src/language/stats/cochran.c:189 #: src/language/stats/correlations.c:97 src/language/stats/correlations.c:155 #: src/language/stats/descriptives.c:993 src/language/stats/examine.c:926 #: src/language/stats/frequencies.c:1588 src/language/stats/friedman.c:251 #: src/language/stats/kruskal-wallis.c:250 #: src/language/stats/ks-one-sample.c:279 src/language/stats/logistic.c:1331 #: src/language/stats/jonckheere-terpstra.c:369 #: src/language/stats/mann-whitney.c:185 src/language/stats/means.c:710 #: src/language/stats/means-calc.c:439 src/language/stats/mcnemar.c:223 #: src/language/stats/median.c:351 src/language/stats/npar-summary.c:107 #: src/language/stats/oneway.c:1052 src/language/stats/reliability.c:544 #: src/language/stats/sign.c:69 src/language/stats/sign.c:70 #: src/language/stats/t-test-indep.c:194 #: src/language/stats/t-test-one-sample.c:126 #: src/language/stats/t-test-paired.c:151 #: src/language/stats/t-test-paired.c:194 src/language/stats/wilcoxon.c:244 #: src/language/stats/crosstabs.q:926 msgid "N" msgstr "N" #: src/language/stats/binomial.c:189 msgid "Observed Prop." msgstr "Prop. Observat" #: src/language/stats/binomial.c:190 msgid "Test Prop." msgstr "Test Prop." #: src/language/stats/binomial.c:192 src/language/stats/mcnemar.c:224 #: src/language/stats/sign.c:103 src/language/stats/wilcoxon.c:288 #: src/language/stats/crosstabs.q:1306 msgid "Exact Sig. (2-tailed)" msgstr "Sig. Exacta (2-cues)" #: src/language/stats/binomial.c:193 src/language/stats/mcnemar.c:225 #: src/language/stats/sign.c:104 src/language/stats/wilcoxon.c:289 #: src/language/stats/crosstabs.q:1307 msgid "Exact Sig. (1-tailed)" msgstr "Sig. Exacta (1-cua)" #: src/language/stats/binomial.c:195 #, fuzzy #| msgid "Group1" msgid "Groups" msgstr "Grup 1" #: src/language/stats/binomial.c:196 #, fuzzy #| msgid "Group1" msgid "Group 1" msgstr "Grup 1" #: src/language/stats/binomial.c:196 #, fuzzy #| msgid "Group2" msgid "Group 2" msgstr "Grup 2" #: src/language/stats/binomial.c:196 src/language/stats/chisquare.c:223 #: src/language/stats/chisquare.c:257 src/language/stats/examine.c:930 #: src/language/stats/factor.c:1756 src/language/stats/frequencies.c:344 #: src/language/stats/glm.c:811 src/language/stats/kruskal-wallis.c:285 #: src/language/stats/logistic.c:1336 src/language/stats/mann-whitney.c:197 #: src/language/stats/means.c:706 src/language/stats/oneway.c:982 #: src/language/stats/oneway.c:1072 src/language/stats/reliability.c:549 #: src/language/stats/regression.c:1031 src/language/stats/sign.c:75 #: src/language/stats/wilcoxon.c:250 #: src/ui/gui/psppire-dialog-action-crosstabs.c:93 #: src/language/stats/crosstabs.q:931 src/language/stats/crosstabs.q:1218 msgid "Total" msgstr "Total" #: src/language/stats/chisquare.c:171 #, fuzzy, c-format #| msgid "" #| "CHISQUARE test specified %d expected values, but %d distinct values were " #| "encountered in variable %s." msgid "" "CHISQUARE test specified %d expected values, but variable %s has %zu " "distinct values." msgstr "" "Prova CHISQUARE especifica %d valors esperats, però %d diferents valors es " "van trobar a la variable %s." #: src/language/stats/chisquare.c:184 src/language/stats/chisquare.c:241 msgid "Observed N" msgstr "N observat" #: src/language/stats/chisquare.c:185 src/language/stats/chisquare.c:242 msgid "Expected N" msgstr "N esperat" #: src/language/stats/chisquare.c:186 src/language/stats/chisquare.c:243 #: src/language/stats/regression.c:1031 #: src/ui/gui/psppire-dialog-action-crosstabs.c:95 #: src/language/stats/crosstabs.q:1267 msgid "Residual" msgstr "Residual" #: src/language/stats/chisquare.c:235 src/language/stats/cochran.c:150 #: src/language/stats/median.c:305 src/language/stats/sign.c:66 #: src/ui/gui/frequencies.ui:676 msgid "Frequencies" msgstr "Freqüències" #: src/language/stats/chisquare.c:320 src/language/stats/cochran.c:181 #: src/language/stats/friedman.c:246 src/language/stats/kruskal-wallis.c:295 #: src/language/stats/mann-whitney.c:244 src/language/stats/mcnemar.c:219 #: src/language/stats/median.c:347 src/language/stats/sign.c:100 #: src/language/stats/wilcoxon.c:279 msgid "Test Statistics" msgstr "Proves Estad." #: src/language/stats/chisquare.c:323 #, fuzzy #| msgid "Chi-Square" msgid "Chi-square" msgstr "Chi-quadrat" #: src/language/stats/chisquare.c:324 src/language/stats/cochran.c:191 #: src/language/stats/examine.c:675 src/language/stats/factor.c:2107 #: src/language/stats/friedman.c:257 src/language/stats/glm.c:733 #: src/language/stats/kruskal-wallis.c:299 src/language/stats/logistic.c:1174 #: src/language/stats/median.c:354 src/language/stats/oneway.c:975 #: src/language/stats/oneway.c:1242 src/language/stats/regression.c:1025 #: src/language/stats/t-test-indep.c:267 #: src/language/stats/t-test-one-sample.c:75 #: src/language/stats/t-test-paired.c:253 src/language/stats/crosstabs.q:1304 msgid "df" msgstr "df" #: src/language/stats/chisquare.c:325 src/language/stats/cochran.c:192 #: src/language/stats/friedman.c:258 src/language/stats/kruskal-wallis.c:300 #: src/language/stats/median.c:355 msgid "Asymp. Sig." msgstr "Sig. Asimpt." #: src/language/stats/cochran.c:111 msgid "More than two values encountered. Cochran Q test will not be run." msgstr "" "S'han trobat més de dos valors. El Test Q de Cochran no es pot executar." #: src/language/stats/cochran.c:153 #, c-format msgid "Success (%.*g)" msgstr "Èxit (%.*g)" #: src/language/stats/cochran.c:154 #, c-format msgid "Failure (%.*g)" msgstr "Fracàs (%.*g)" #: src/language/stats/cochran.c:190 msgid "Cochran's Q" msgstr "Q de Cochran" #: src/language/stats/correlations.c:91 src/language/stats/descriptives.c:987 #: src/language/stats/factor.c:2065 src/language/stats/npar-summary.c:102 msgid "Descriptive Statistics" msgstr "Estadístiques Descriptives" #: src/language/stats/correlations.c:95 src/language/stats/descriptives.c:108 #: src/language/stats/examine.c:742 src/language/stats/factor.c:2069 #: src/language/stats/frequencies.c:141 src/language/stats/graph.c:211 #: src/language/stats/ks-one-sample.c:290 src/language/stats/means-calc.c:438 #: src/language/stats/npar-summary.c:108 src/language/stats/oneway.c:1052 #: src/language/stats/t-test-indep.c:195 #: src/language/stats/t-test-one-sample.c:127 #: src/language/stats/t-test-paired.c:152 #: src/language/stats/t-test-paired.c:241 #: src/ui/gui/psppire-dialog-action-descriptives.c:39 #: src/ui/gui/psppire-dialog-action-frequencies.c:40 msgid "Mean" msgstr "Mitjana" #: src/language/stats/correlations.c:96 src/language/stats/examine.c:751 #: src/language/stats/factor.c:2070 src/language/stats/ks-one-sample.c:290 #: src/language/stats/means-calc.c:440 src/language/stats/npar-summary.c:109 #: src/language/stats/oneway.c:1052 src/language/stats/t-test-indep.c:196 #: src/language/stats/t-test-one-sample.c:128 #: src/language/stats/t-test-paired.c:153 #: src/language/stats/t-test-paired.c:242 msgid "Std. Deviation" msgstr "Desviació Est." #: src/language/stats/correlations.c:126 msgid "Correlations" msgstr "Correlacions" #: src/language/stats/correlations.c:146 msgid "Pearson Correlation" msgstr "Correlació de Pearson" #: src/language/stats/correlations.c:147 src/language/stats/oneway.c:1243 #: src/language/stats/t-test-indep.c:268 #: src/language/stats/t-test-one-sample.c:76 #: src/language/stats/t-test-paired.c:254 msgid "Sig. (2-tailed)" msgstr "Sig. (2-cues)" #: src/language/stats/correlations.c:147 src/language/stats/factor.c:1913 msgid "Sig. (1-tailed)" msgstr "Sig. (1-cua)" #: src/language/stats/correlations.c:151 msgid "Cross-products" msgstr "Productes-creuats" #: src/language/stats/correlations.c:152 msgid "Covariance" msgstr "Covariància" #: src/language/stats/correlations.c:165 #, fuzzy #| msgid "Significance" msgid "Significant at .05 level" msgstr "Significativitat" #: src/language/stats/correlations.c:234 msgid "The data for the chosen variables are all missing or empty." msgstr "Les dades per a les variables triades son tots perduts o buits." #: src/language/stats/correlations.c:390 src/language/stats/descriptives.c:368 #: src/language/data-io/list.c:166 msgid "No variables specified." msgstr "Variables no especificades." #: src/language/stats/descriptives.c:109 src/language/stats/frequencies.c:142 #: src/language/stats/means-calc.c:445 src/language/stats/t-test-indep.c:197 #: src/language/stats/t-test-one-sample.c:129 #: src/language/stats/t-test-paired.c:154 #: src/language/stats/t-test-paired.c:243 msgid "S.E. Mean" msgstr "E.E. Mitj." #: src/language/stats/descriptives.c:110 src/language/stats/frequencies.c:145 msgid "Std Dev" msgstr "Desv.Std." #: src/language/stats/descriptives.c:111 src/language/stats/examine.c:750 #: src/language/stats/frequencies.c:146 src/language/stats/means-calc.c:450 #: src/ui/gui/psppire-dialog-action-descriptives.c:46 #: src/ui/gui/psppire-dialog-action-frequencies.c:45 msgid "Variance" msgstr "Variància" #: src/language/stats/descriptives.c:112 src/language/stats/examine.c:752 #: src/language/stats/frequencies.c:147 src/language/stats/means-calc.c:451 #: src/ui/gui/psppire-dialog-action-descriptives.c:47 #: src/ui/gui/psppire-dialog-action-frequencies.c:50 msgid "Kurtosis" msgstr "Curtosi" #: src/language/stats/descriptives.c:113 src/language/stats/frequencies.c:148 #: src/language/stats/means-calc.c:452 msgid "S.E. Kurt" msgstr "E.E. Curt." #: src/language/stats/descriptives.c:114 src/language/stats/examine.c:752 #: src/language/stats/frequencies.c:149 src/language/stats/means-calc.c:453 #: src/ui/gui/psppire-dialog-action-descriptives.c:48 #: src/ui/gui/psppire-dialog-action-frequencies.c:46 msgid "Skewness" msgstr "Asimetria" #: src/language/stats/descriptives.c:115 src/language/stats/frequencies.c:150 #: src/language/stats/means-calc.c:454 msgid "S.E. Skew" msgstr "E.E. Asim." #: src/language/stats/descriptives.c:116 src/language/stats/examine.c:751 #: src/language/stats/frequencies.c:151 src/language/stats/means-calc.c:449 #: src/ui/gui/psppire-dialog-action-descriptives.c:43 #: src/ui/gui/psppire-dialog-action-frequencies.c:48 msgid "Range" msgstr "Interval" #: src/language/stats/descriptives.c:117 src/language/stats/examine.c:751 #: src/language/stats/frequencies.c:152 src/language/stats/graph.c:214 #: src/language/stats/ks-one-sample.c:285 src/language/stats/means-calc.c:447 #: src/language/stats/npar-summary.c:110 src/language/stats/oneway.c:1061 #: src/ui/gui/psppire-dialog-action-descriptives.c:41 #: src/ui/gui/psppire-dialog-action-frequencies.c:42 msgid "Minimum" msgstr "Mínim" #: src/language/stats/descriptives.c:118 src/language/stats/examine.c:751 #: src/language/stats/frequencies.c:153 src/language/stats/graph.c:213 #: src/language/stats/ks-one-sample.c:285 src/language/stats/means-calc.c:448 #: src/language/stats/npar-summary.c:110 src/language/stats/oneway.c:1061 #: src/ui/gui/psppire-dialog-action-descriptives.c:42 #: src/ui/gui/psppire-dialog-action-frequencies.c:43 msgid "Maximum" msgstr "Màxim" #: src/language/stats/descriptives.c:119 src/language/stats/frequencies.c:154 #: src/language/stats/graph.c:212 src/language/stats/means-calc.c:446 #: src/ui/gui/psppire-dialog-action-descriptives.c:44 #: src/ui/gui/psppire-dialog-action-frequencies.c:53 msgid "Sum" msgstr "Suma" #: src/language/stats/descriptives.c:350 #, c-format msgid "Z-score variable name %s would be a duplicate variable name." msgstr "el nom de variable puntuació-Z %s seria un nom de variable duplicat." #: src/language/stats/descriptives.c:401 msgid "" "DESCRIPTIVES with Z scores ignores TEMPORARY. Temporary transformations " "will be made permanent." msgstr "" "DESCRIPTIVES amb puntuacions Z ignora TEMPORARY. Les transformacions " "temporals seran permanents." #: src/language/stats/descriptives.c:478 msgid "expecting statistic name: reverting to default" msgstr "esperant nom de l'estadístic: torna a aplicar el defecte" #: src/language/stats/descriptives.c:561 msgid "" "Ran out of generic names for Z-score variables. There are only 126 generic " "names: ZSC001-ZSC0999, STDZ01-STDZ09, ZZZZ01-ZZZZ09, ZQZQ01-ZQZQ09." msgstr "" "S'han esgotat els noms genèrics per les variables Z. Només hi ha 126 noms " "genèrics: ZSC001-ZSC0999, STDZ01-STDZ09, ZZZZ01-ZZZZ09, ZQZQ01-ZQZQ09." #: src/language/stats/descriptives.c:579 #, fuzzy #| msgid "Mapping of variables to corresponding Z-scores." msgid "Mapping of Variables to Z-scores" msgstr "Convertint variables a les puntuacions-Z corresponents." #: src/language/stats/descriptives.c:581 #, fuzzy #| msgid "Name" msgid "Names" msgstr "Nom" #: src/language/stats/descriptives.c:582 src/language/stats/glm.c:739 #: src/language/stats/regression.c:1030 msgid "Source" msgstr "Font" #: src/language/stats/descriptives.c:582 msgid "Target" msgstr "Destí" #: src/language/stats/descriptives.c:659 #, fuzzy, c-format #| msgid "Internal error processing Z scores" msgid "Internal error processing Z scores. Please report this to %s." msgstr "Error intern procesant puntuacions Z" #: src/language/stats/descriptives.c:759 #, c-format msgid "Z-score of %s" msgstr "puntuació-Z de %s" #: src/language/stats/descriptives.c:1028 src/language/stats/roc.c:1029 msgid "Valid N (listwise)" msgstr "N Valid (listwise)" #: src/language/stats/descriptives.c:1028 #, fuzzy #| msgid "Valid N (listwise)" msgid "Missing N (listwise)" msgstr "N Valid (listwise)" #: src/language/stats/examine.c:75 msgid " (missing)" msgstr "(perduts)" #: src/language/stats/examine.c:225 #, c-format msgid "Boxplot of %s vs. %s" msgstr "Diagrama de caixa de %s vs. %s" #: src/language/stats/examine.c:231 src/language/stats/examine.c:338 #, c-format msgid "Boxplot of %s" msgstr "Diagrama de caixa de %s" #: src/language/stats/examine.c:321 msgid "Boxplot" msgstr "Diagrama de caixa" #: src/language/stats/examine.c:418 msgid "Not creating NP plot because data set is empty." msgstr "No es crearà el gràfic NP perquè el conjunt de dades es buit." #: src/language/stats/examine.c:478 #, c-format msgid "Not creating spreadlevel chart for %s" msgstr "" "No s'ha generat el diagrama d'Heteroscedasticitat (spreadlevel) per a %s" #: src/language/stats/examine.c:585 #, fuzzy #| msgid "Last non-missing value" msgid "User-missing value." msgstr "Darrer valor no-perdut" #: src/language/stats/examine.c:591 src/language/stats/examine.c:595 #: src/language/stats/frequencies.c:1606 msgid "Percentiles" msgstr "Percentils" #: src/language/stats/examine.c:603 src/math/percentiles.c:37 msgid "Weighted Average" msgstr "Mitjana Ponderada" #: src/language/stats/examine.c:603 msgid "Tukey's Hinges" msgstr "Bisagras de Tukey" #: src/language/stats/examine.c:610 src/language/stats/examine.c:685 #: src/language/stats/examine.c:759 src/language/stats/examine.c:858 #: src/language/stats/examine.c:938 src/language/stats/mann-whitney.c:200 #: src/language/stats/median.c:319 src/language/stats/t-test-indep.c:227 #: src/language/stats/t-test-indep.c:282 #: src/language/stats/t-test-one-sample.c:87 #, fuzzy #| msgid "_Dependent Variable" msgid "Dependent Variables" msgstr "Variable(s) _Dependent(s):" #: src/language/stats/examine.c:669 #, fuzzy #| msgid "Dev from Normal" msgid "Tests of Normality" msgstr "Desviació de la Normal" #: src/language/stats/examine.c:673 msgid "Shapiro-Wilk" msgstr "" #: src/language/stats/examine.c:674 src/language/stats/examine.c:739 #: src/ui/gui/psppire-checkbox-treeview.c:73 msgid "Statistic" msgstr "Estatístic" #: src/language/stats/examine.c:676 src/language/stats/factor.c:2108 #: src/language/stats/glm.c:736 src/language/stats/logistic.c:1175 #: src/language/stats/oneway.c:978 src/language/stats/oneway.c:1154 #: src/language/stats/oneway.c:1376 src/language/stats/regression.c:906 #: src/language/stats/regression.c:1028 src/language/stats/t-test-indep.c:263 #: src/language/stats/t-test-paired.c:196 msgid "Sig." msgstr "Sig." #: src/language/stats/examine.c:735 src/language/stats/oneway.c:1045 #: src/ui/gui/descriptives.ui:25 msgid "Descriptives" msgstr "Descriptives" #: src/language/stats/examine.c:738 msgid "Aspect" msgstr "" #: src/language/stats/examine.c:739 src/language/stats/oneway.c:1053 #: src/language/stats/oneway.c:1240 src/language/stats/oneway.c:1375 #: src/language/stats/roc.c:975 src/language/stats/regression.c:902 msgid "Std. Error" msgstr "Error Est." #: src/language/stats/examine.c:745 src/language/stats/oneway.c:1056 #, c-format msgid "%g%% Confidence Interval for Mean" msgstr "Interval de Confiança de Miitjana %g%%" #: src/language/stats/examine.c:747 src/language/stats/oneway.c:1058 #: src/language/stats/oneway.c:1382 src/language/stats/roc.c:982 #: src/language/stats/regression.c:913 msgid "Lower Bound" msgstr "Límit Inferior" #: src/language/stats/examine.c:748 src/language/stats/oneway.c:1059 #: src/language/stats/oneway.c:1383 src/language/stats/roc.c:983 #: src/language/stats/regression.c:914 msgid "Upper Bound" msgstr "Límit Superior" #: src/language/stats/examine.c:750 msgid "5% Trimmed Mean" msgstr "Mitjana retallada al 5%" #: src/language/stats/examine.c:750 src/language/stats/frequencies.c:143 #: src/language/stats/means-calc.c:442 src/language/stats/median.c:352 #: src/ui/gui/psppire-dialog-action-frequencies.c:52 msgid "Median" msgstr "Mediana" #: src/language/stats/examine.c:752 msgid "Interquartile Range" msgstr "Interval inter-quartilic" #: src/language/stats/examine.c:832 msgid "Extreme Values" msgstr "Valor extrems" #: src/language/stats/examine.c:840 src/language/stats/quick-cluster.c:664 #: src/language/data-io/list.c:110 msgid "Case Number" msgstr "Número de Cas" #: src/language/stats/examine.c:844 #, fuzzy #| msgid "Order by" msgid "Order" msgstr "Ordenat per" #. TRANSLATORS: This is a noun, not an adjective. #: src/language/stats/examine.c:850 #, fuzzy #| msgid "_Extremes" msgid "Extreme" msgstr "_Extrems" #: src/language/stats/examine.c:851 msgid "Highest" msgstr "Superior" #: src/language/stats/examine.c:851 msgid "Lowest" msgstr "Inferior" #: src/language/stats/examine.c:921 src/language/stats/logistic.c:1328 #: src/language/stats/means.c:694 src/language/stats/reliability.c:540 msgid "Case Processing Summary" msgstr "Resum de processament del Casos" #: src/language/stats/examine.c:927 src/language/stats/frequencies.c:304 #: src/language/stats/frequencies.c:1494 src/language/stats/logistic.c:1332 #: src/language/stats/means.c:713 src/language/stats/reliability.c:545 #: src/language/stats/crosstabs.q:927 msgid "Percent" msgstr "Percentatge" #: src/language/stats/examine.c:929 src/language/stats/frequencies.c:321 #: src/language/stats/frequencies.c:1590 src/language/stats/quick-cluster.c:766 #: src/language/stats/reliability.c:548 src/language/stats/crosstabs.q:931 msgid "Valid" msgstr "Vàlid" #: src/language/stats/examine.c:929 src/language/stats/frequencies.c:336 #: src/language/stats/frequencies.c:1591 src/language/stats/crosstabs.q:931 msgid "Missing" msgstr "Perduts" #: src/language/stats/examine.c:1550 #, c-format msgid "%s may not be negative. Using default value (%g)." msgstr "%s no pot ser negatiu. Es farà servir un valor per defecte (%g)." #: src/language/stats/examine.c:1587 msgid "Percentiles must lie in the range (0, 100)" msgstr "Els percentils han d'estar dins de l'interval (0,100)" #: src/language/stats/examine.c:1777 #, c-format msgid "%s and %s are mutually exclusive" msgstr "%s i %s son mutuament excloents" #: src/language/stats/factor.c:1121 #, c-format msgid "Matrix input for %s must be either COV or CORR" msgstr "La matriu d'entrada per a %s ha de ser COV o CORR" #: src/language/stats/factor.c:1519 msgid "Factor analysis on a single variable is not useful." msgstr "L'anàlisi factorial per a una única variable és inútil." #: src/language/stats/factor.c:1523 msgid "Factor analysis without variables is not possible." msgstr "L'anàlisi factorial sense variables no és possible." #: src/language/stats/factor.c:1634 msgid "Component Number" msgstr "Número de Component" #: src/language/stats/factor.c:1634 msgid "Factor Number" msgstr "Número de Factor" #: src/language/stats/factor.c:1648 src/language/stats/factor.c:1651 msgid "Communalities" msgstr "Comunalitats" #: src/language/stats/factor.c:1653 msgid "Initial" msgstr "Inicial" #: src/language/stats/factor.c:1655 msgid "Extraction" msgstr "Extracció" #: src/language/stats/factor.c:1697 src/language/stats/factor.c:1777 #: src/language/stats/factor.c:1839 msgid "Component" msgstr "Component" #: src/language/stats/factor.c:1697 src/language/stats/factor.c:1777 #: src/language/stats/factor.c:1839 msgid "Factor" msgstr "Factor" #: src/language/stats/factor.c:1752 msgid "Total Variance Explained" msgstr "Variancia Total Explicada" #: src/language/stats/factor.c:1758 #, no-c-format msgid "% of Variance" msgstr "% de Variància" #: src/language/stats/factor.c:1760 #, no-c-format msgid "Cumulative %" msgstr "% Acumulat" #: src/language/stats/factor.c:1763 msgid "Phase" msgstr "" #: src/language/stats/factor.c:1765 msgid "Initial Eigenvalues" msgstr "Valors propis Inicials" #: src/language/stats/factor.c:1769 msgid "Extraction Sums of Squared Loadings" msgstr "Extracció: Sumes de Carregues al Quadrat" #: src/language/stats/factor.c:1773 msgid "Rotation Sums of Squared Loadings" msgstr "Rotació: Sumes de Carregues al Quadrat " #: src/language/stats/factor.c:1835 msgid "Factor Correlation Matrix" msgstr "Matriu de Correlació Factorial" #: src/language/stats/factor.c:1842 #, fuzzy #| msgid "Factor" msgid "Factor 2" msgstr "Factor" #: src/language/stats/factor.c:1874 msgid "Anti-Image Matrices" msgstr "Matrius Anti-Imatge" #: src/language/stats/factor.c:1879 msgid "Anti-image Covariance" msgstr "Covariància Anti-Imatge" #: src/language/stats/factor.c:1880 msgid "Anti-image Correlation" msgstr "Correlació Anti-Imatge" #: src/language/stats/factor.c:1901 msgid "Correlation Matrix" msgstr "Matriu de Correlació" #: src/language/stats/factor.c:1910 src/language/stats/t-test-paired.c:195 msgid "Correlation" msgstr "Correlació" #: src/language/stats/factor.c:1947 msgid "Determinant" msgstr "Determinant" #: src/language/stats/factor.c:1958 msgid "Covariance Matrix" msgstr "Co_variància Anti-Imatge" #: src/language/stats/factor.c:1990 msgid "" "The dataset contains no complete observations. No analysis will be performed." msgstr "" "La matriu de dades conté observacions incompletes. No es pot realitzar cap " "anàlisi." #: src/language/stats/factor.c:2014 msgid "The dataset has no complete covariance or correlation matrix." msgstr "El conjunt de dades no en te matriu de covariància o correlació." #: src/language/stats/factor.c:2071 msgid "Analysis N" msgstr "N Anàlisis" #: src/language/stats/factor.c:2099 msgid "KMO and Bartlett's Test" msgstr "KMO i Prova de Bartlett" #: src/language/stats/factor.c:2103 msgid "Kaiser-Meyer-Olkin Measure of Sampling Adequacy" msgstr "Mesura Kaiser-Meyer-Olkin d'Adequació de mostreig" #: src/language/stats/factor.c:2105 msgid "Bartlett's Test of Sphericity" msgstr "Prova d'Esfericitat de Bartlett" #: src/language/stats/factor.c:2106 msgid "Approx. Chi-Square" msgstr "Chi-quadrada Aprox." #: src/language/stats/factor.c:2154 #, c-format msgid "" "The %s criteria result in zero factors extracted. Therefore no analysis will " "be performed." msgstr "" "El criteri %s te com a resultat l'extracció de zero factors. No es pot " "realitzar cap anàlisi." #: src/language/stats/factor.c:2161 #, c-format msgid "" "The %s criteria result in more factors than variables, which is not " "meaningful. No analysis will be performed." msgstr "" "El criteri %s te com a resultat més factors que variables, i això no té cap " "sentit. No es realitza cap anàlisi." #: src/language/stats/factor.c:2254 msgid "Component Matrix" msgstr "Matriu de Components" #: src/language/stats/factor.c:2254 msgid "Factor Matrix" msgstr "Matriu de Factors" #: src/language/stats/factor.c:2259 msgid "Pattern Matrix" msgstr "Matriu de Patrons" #: src/language/stats/factor.c:2268 msgid "Structure Matrix" msgstr "Matriu d'Estructura" #: src/language/stats/factor.c:2270 msgid "Rotated Component Matrix" msgstr "Matriu Rotada de Components" #: src/language/stats/factor.c:2271 msgid "Rotated Factor Matrix" msgstr "Matriu Rotada de Factors" #: src/language/stats/flip.c:100 #, c-format msgid "%s ignores %s. Temporary transformations will be made permanent." msgstr "%s ignora %s. Les transformacions temporals seran permanents." #: src/language/stats/flip.c:153 #, c-format msgid "Could not create temporary file for %s." msgstr "No s'ha pogut crear l'arxiu temporal per a %s." #: src/language/stats/flip.c:341 #, c-format msgid "Error rewinding %s file: %s." msgstr "Error reconstruint l'arxiu %s: %s." #: src/language/stats/flip.c:348 #, c-format msgid "Error creating %s source file." msgstr "Error en crear l'arxiu d'origen %s." #: src/language/stats/flip.c:361 #, c-format msgid "Error reading %s file: %s." msgstr "Error de lectura de l'arxiu %s: %s." #: src/language/stats/flip.c:363 #, c-format msgid "Unexpected end of file reading %s file." msgstr "Final inesperat de la lectura d'arxiu %s." #: src/language/stats/flip.c:379 #, c-format msgid "Error seeking %s source file: %s." msgstr "Error cercant l'arxiu font %s: %s." #: src/language/stats/flip.c:387 #, c-format msgid "Error writing %s source file: %s." msgstr "Error d'escriptura de l'arxiu font %s: %s." #: src/language/stats/flip.c:402 #, c-format msgid "Error rewinding %s source file: %s." msgstr "Error reconstruint d'arxiu font %s: %s." #: src/language/stats/flip.c:433 #, c-format msgid "Error reading %s temporary file: %s." msgstr "Error de lectura de l'arxiu temporal %s: %s." #: src/language/stats/flip.c:436 #, c-format msgid "Unexpected end of file reading %s temporary file." msgstr "Final inesperat de la lectura d'arxiu temporal %s." #: src/language/stats/frequencies.c:144 #: src/ui/gui/psppire-dialog-action-frequencies.c:49 msgid "Mode" msgstr "Mode" #: src/language/stats/frequencies.c:303 src/language/stats/logistic.c:1381 #: src/output/charts/plot-hist-cairo.c:112 msgid "Frequency" msgstr "Freqüència" #: src/language/stats/frequencies.c:305 msgid "Valid Percent" msgstr "Percentatge Vàlid" #: src/language/stats/frequencies.c:306 src/language/stats/graph.c:208 msgid "Cumulative Percent" msgstr "Percentatge Acumulat" #: src/language/stats/frequencies.c:905 msgid "Histogram frequency must be greater than zero." msgstr "La freqüència d'histograma ha de ser més gran que zero." #: src/language/stats/frequencies.c:923 msgid "Histogram percentage must be greater than zero." msgstr "El percentatge d'histograma ha de ser més gran que zero." #: src/language/stats/frequencies.c:1139 #, c-format msgid "" "%s for histogram must be greater than or equal to %s, but %s was specified " "as %.15g and %s as %.15g. %s and %s will be ignored." msgstr "" "Per a l'histograma, %s ha de ser major o igual que %s, però %s s'ha " "especificat com a %.15g i %s com a %.15g. %s i %s seran ignorats." #: src/language/stats/frequencies.c:1184 #, c-format msgid "" "%s for pie chart must be greater than or equal to %s, but %s was specified " "as %.15g and %s as %.15g. %s and %s will be ignored." msgstr "" "Per a la gràfica de sectors, %s ha de ser major o igual que %s, però %s s'ha " "especificat com a %.15g i %s com a %.15g. %s i %s seran ignorats." #: src/language/stats/frequencies.c:1474 #, c-format msgid "Omitting pie chart for %s, which has only %d unique values." msgstr "S'omet grafic de sectors per a %s, que només té %d valors únics. " #: src/language/stats/frequencies.c:1477 #, c-format msgid "Omitting pie chart for %s, which has over 50 unique values." msgstr "S'omet grafic de sectors per a %s, que té més de 50 valors únics. " #: src/language/stats/frequencies.c:1494 src/language/stats/graph.c:205 #: src/language/stats/quick-cluster.c:747 #: src/ui/gui/psppire-dialog-action-crosstabs.c:90 #: src/language/stats/crosstabs.q:789 src/language/stats/crosstabs.q:1262 msgid "Count" msgstr "Recompte" #: src/language/stats/friedman.c:220 src/language/stats/kruskal-wallis.c:247 #: src/language/stats/mann-whitney.c:182 src/language/stats/wilcoxon.c:240 msgid "Ranks" msgstr "Rankings" #: src/language/stats/friedman.c:222 src/language/stats/friedman.c:223 #: src/language/stats/kruskal-wallis.c:251 #: src/language/stats/mann-whitney.c:186 src/language/stats/wilcoxon.c:245 msgid "Mean Rank" msgstr "Ranking mitjà" #: src/language/stats/friedman.c:253 msgid "Kendall's W" msgstr "W de Kendall" #: src/language/stats/friedman.c:256 src/language/stats/kruskal-wallis.c:298 #: src/language/stats/median.c:353 msgid "Chi-Square" msgstr "Chi-quadrat" #: src/language/stats/glm.c:169 msgid "Multivariate analysis is not yet implemented" msgstr "L'analisi multivariat encara no està implementat." #: src/language/stats/glm.c:274 msgid "Only types 1, 2 & 3 sums of squares are currently implemented" msgstr "" "Només estan actualment implementades sumes quadratiques de tipus 1, 2 & 3" #: src/language/stats/glm.c:727 msgid "Tests of Between-Subjects Effects" msgstr "Contraste de Efectos Inter-Sujetos" #: src/language/stats/glm.c:730 #, fuzzy #| msgid "Type %s Sum of Squares" msgid "Type I Sum Of Squares" msgstr "Suma de Quadrats tipus %s" #: src/language/stats/glm.c:731 #, fuzzy #| msgid "Type %s Sum of Squares" msgid "Type II Sum Of Squares" msgstr "Suma de Quadrats tipus %s" #: src/language/stats/glm.c:732 #, fuzzy #| msgid "Type %s Sum of Squares" msgid "Type III Sum Of Squares" msgstr "Suma de Quadrats tipus %s" #: src/language/stats/glm.c:734 src/language/stats/oneway.c:976 #: src/language/stats/regression.c:1026 msgid "Mean Square" msgstr "Rang mitjà" #: src/language/stats/glm.c:735 src/language/stats/oneway.c:977 #: src/language/stats/regression.c:1027 src/language/stats/t-test-indep.c:262 msgid "F" msgstr "F" #: src/language/stats/glm.c:740 msgid "Corrected Model" msgstr "Model corregit" #: src/language/stats/glm.c:740 msgid "Model" msgstr "Model" #: src/language/stats/glm.c:752 msgid "Intercept" msgstr "Constant" #: src/language/stats/glm.c:802 src/output/pivot-table.c:763 #: src/output/spv/spv.c:867 msgid "Error" msgstr "Error" #: src/language/stats/glm.c:819 msgid "Corrected Total" msgstr "Total Corregit" #: src/language/stats/graph.c:206 msgid "Percentage" msgstr "_Percentatge" #: src/language/stats/graph.c:207 msgid "Cumulative Count" msgstr "Recompte Acumulat" #: src/language/stats/graph.c:296 #, c-format msgid "%s vs. %s by %s" msgstr "%s vs. %s per %s" #: src/language/stats/graph.c:303 #, c-format msgid "%s vs. %s" msgstr "%s vs. %s" #: src/language/stats/graph.c:322 msgid "" "Maximum number of scatterplot categories reached. Your BY variable has too " "many distinct values. The coloring of the plot will not be correct." msgstr "" "S'ha assolit el màxim nombre de categories de la gràfica. La teva variable " "BY té massa valors diferents. La coloració de la gràfica no serà corecta" #: src/language/stats/graph.c:551 src/language/stats/rank.c:636 #, c-format msgid "%s of %s" msgstr "%s de %s" #: src/language/stats/graph.c:698 src/language/stats/graph.c:729 #: src/language/stats/graph.c:777 msgid "Only one chart type is allowed." msgstr "Només es permet un tipus de gràfica." #: src/language/stats/graph.c:721 src/language/stats/graph.c:820 #: src/language/stats/graph.c:834 msgid "Only one variable is allowed." msgstr "Només es permet una variable." #: src/language/stats/graph.c:843 msgid "Variable expected" msgstr "Variable esperada" #: src/language/stats/graph.c:883 msgid "FOOTNOTE is not implemented yet for GRAPH" msgstr "FOOTNOTE no està encara implementada per a GRAPH" #: src/language/stats/ks-one-sample.c:274 src/ui/gui/ks-one-sample.ui:24 msgid "One-Sample Kolmogorov-Smirnov Test" msgstr "Prova Kolmogorov-Smirnov per a Una mostra" #: src/language/stats/ks-one-sample.c:284 msgid "Uniform Parameters" msgstr "Paràmetres Uniforme" #: src/language/stats/ks-one-sample.c:289 msgid "Normal Parameters" msgstr "Paràmetres Normal" #: src/language/stats/ks-one-sample.c:294 msgid "Poisson Parameters" msgstr "Paràmetres Poisson" #: src/language/stats/ks-one-sample.c:295 #: src/ui/gui/psppire-dialog-action-crosstabs.c:76 #: src/language/stats/crosstabs.q:1421 msgid "Lambda" msgstr "Lambda" #: src/language/stats/ks-one-sample.c:300 msgid "Exponential Parameters" msgstr "Paràmetres Exponencial" #: src/language/stats/ks-one-sample.c:308 msgid "Most Extreme Differences" msgstr "Diferències Mes Extremes" #: src/language/stats/ks-one-sample.c:309 msgid "Absolute" msgstr "Absolut" #: src/language/stats/ks-one-sample.c:309 src/language/stats/roc.c:1037 msgid "Positive" msgstr "Positiu" #: src/language/stats/ks-one-sample.c:309 src/language/stats/roc.c:1037 msgid "Negative" msgstr "Negatiu" #: src/language/stats/ks-one-sample.c:312 msgid "Kolmogorov-Smirnov Z" msgstr "Z de Kolmogorov-Smirnov" #: src/language/stats/ks-one-sample.c:313 #: src/language/stats/jonckheere-terpstra.c:374 #: src/language/stats/mann-whitney.c:251 src/language/stats/runs.c:328 #: src/language/stats/wilcoxon.c:284 msgid "Asymp. Sig. (2-tailed)" msgstr "Sig. Asimp. (2-cues)" #: src/language/stats/logistic.c:327 msgid "All predicted values are either 1 or 0" msgstr "Tots els valors predits son 1 o 0" #: src/language/stats/logistic.c:525 msgid "Dependent variable's values are not dichotomous." msgstr "Els valors de la variable dependent no son dicotómics." #: src/language/stats/logistic.c:614 #, c-format msgid "" "Category %s does not have at least two distinct values. Logistic regression " "will not be run." msgstr "" "La categoria %s no té com a mímin dos valors diferents. No s'executa la " "regressió logística." #: src/language/stats/logistic.c:674 #, c-format msgid "" "Estimation terminated at iteration number %d because parameter estimates " "changed by less than %g" msgstr "" "La estimació ha finalitzat a la iteració numero %d perquè els estimadors de " "paràmetres han canviat en menys de %g" #: src/language/stats/logistic.c:686 #, c-format msgid "" "Estimation terminated at iteration number %d because Log Likelihood " "decreased by less than %g%%" msgstr "" "Estimation terminated at iteration number %d because Log Likelihood " "decreased by less than %g%%" #: src/language/stats/logistic.c:701 #, c-format msgid "" "Estimation terminated at iteration number %d because maximum iterations has " "been reached" msgstr "" "La estimació ha finalitzat a la iteració numero %d perquè s'ha assolit el " "màxim d'iteracions" #: src/language/stats/logistic.c:994 msgid "Cut point value must be in the range [0,1]" msgstr "El valor del punt de tall he de ser dins de l'interval (0,1)" #: src/language/stats/logistic.c:1139 msgid "Dependent Variable Encoding" msgstr "Codificació de la Variable Depenent" #: src/language/stats/logistic.c:1141 msgid "Mapping" msgstr "" #: src/language/stats/logistic.c:1142 msgid "Internal Value" msgstr "Valor intern" #: src/language/stats/logistic.c:1145 msgid "Original Value" msgstr "Valor original" #: src/language/stats/logistic.c:1167 msgid "Variables in the Equation" msgstr "Variables a l'equació" #: src/language/stats/logistic.c:1171 src/language/stats/regression.c:902 msgid "B" msgstr "B" #: src/language/stats/logistic.c:1172 msgid "S.E." msgstr "Err.Est." #: src/language/stats/logistic.c:1173 msgid "Wald" msgstr "Wald" #: src/language/stats/logistic.c:1176 msgid "Exp(B)" msgstr "Exp(B)" #: src/language/stats/logistic.c:1181 #, c-format msgid "%d%% CI for Exp(B)" msgstr "IC %d%% per a Exp(B)" #: src/language/stats/logistic.c:1183 src/language/stats/t-test-indep.c:274 #: src/language/stats/t-test-one-sample.c:83 #: src/language/stats/t-test-paired.c:249 src/language/stats/crosstabs.q:1369 msgid "Lower" msgstr "Inferior" #: src/language/stats/logistic.c:1183 src/language/stats/t-test-indep.c:275 #: src/language/stats/t-test-one-sample.c:84 #: src/language/stats/t-test-paired.c:250 src/language/stats/crosstabs.q:1370 msgid "Upper" msgstr "Superior" #: src/language/stats/logistic.c:1189 src/language/stats/logistic.c:1470 msgid "Step 1" msgstr "Pas 1" #: src/language/stats/logistic.c:1263 msgid "Constant" msgstr "Constant" #: src/language/stats/logistic.c:1298 msgid "Model Summary" msgstr "Resum del model" #: src/language/stats/logistic.c:1301 msgid "-2 Log likelihood" msgstr "-2 Log-Versemblança" #: src/language/stats/logistic.c:1302 msgid "Cox & Snell R Square" msgstr "R quadrat de Cox & Snell" #: src/language/stats/logistic.c:1303 msgid "Nagelkerke R Square" msgstr "R quadrat de Nagelkerke" #: src/language/stats/logistic.c:1306 src/language/stats/logistic.c:1470 #, fuzzy #| msgid "Step 1" msgid "Step" msgstr "Pas 1" #: src/language/stats/logistic.c:1335 msgid "Unweighted Cases" msgstr "Casos no ponderats" #: src/language/stats/logistic.c:1336 msgid "Included in Analysis" msgstr "Inclós a l'anàlisi" #: src/language/stats/logistic.c:1336 msgid "Missing Cases" msgstr "Casos perduts" #: src/language/stats/logistic.c:1365 msgid "Categorical Variables' Codings" msgstr "Codificació de Variables Categóriques" #: src/language/stats/logistic.c:1380 #, fuzzy #| msgid "Encodings" msgid "Codings" msgstr "Codificacions" #: src/language/stats/logistic.c:1383 msgid "Parameter coding" msgstr "Codificació de Paràmetres" #: src/language/stats/logistic.c:1462 msgid "Classification Table" msgstr "Taula de Classificació" #: src/language/stats/logistic.c:1466 msgid "Predicted" msgstr "Predicció" #: src/language/stats/logistic.c:1466 #, fuzzy #| msgid "" #| "Percentage\n" #| "Correct" msgid "Percentage Correct" msgstr "" "Percentatge\n" "Correcte" #: src/language/stats/logistic.c:1468 msgid "Observed" msgstr "Observat" #: src/language/stats/logistic.c:1468 msgid "Overall Percentage" msgstr "Percentatge Global" #: src/language/stats/jonckheere-terpstra.c:357 msgid "Jonckheere-Terpstra Test" msgstr "Contrast Jonckheere-Terpstra" #: src/language/stats/jonckheere-terpstra.c:364 #, c-format msgid "Number of levels in %s" msgstr "Nombre de nivells a %s" #: src/language/stats/jonckheere-terpstra.c:370 msgid "Observed J-T Statistic" msgstr "Estatístic J-T observat" #: src/language/stats/jonckheere-terpstra.c:371 msgid "Mean J-T Statistic" msgstr "Estatístic J-T mitjana" #: src/language/stats/jonckheere-terpstra.c:372 msgid "Std. Deviation of J-T Statistic" msgstr "Desviació Est. d'estadístic J-T" #: src/language/stats/jonckheere-terpstra.c:373 msgid "Std. J-T Statistic" msgstr "Estadístic J-T Est." #: src/language/stats/mann-whitney.c:187 src/language/stats/wilcoxon.c:246 msgid "Sum of Ranks" msgstr "Suma de Rangs" #: src/language/stats/mann-whitney.c:248 msgid "Mann-Whitney U" msgstr "U de Mann-Whitney" #: src/language/stats/mann-whitney.c:249 msgid "Wilcoxon W" msgstr "W de Wilcoxon" #: src/language/stats/mann-whitney.c:250 src/language/stats/runs.c:327 #: src/language/stats/wilcoxon.c:283 msgid "Z" msgstr "Z" #: src/language/stats/means.c:702 msgid "Included" msgstr "Inclós" #: src/language/stats/means.c:704 src/language/stats/reliability.c:548 msgid "Excluded" msgstr "Exclós" #: src/language/stats/means.c:753 msgid "Report" msgstr "Informe" #: src/language/stats/means.c:838 #, fuzzy, c-format #| msgid "" #| "Dependent variable %s has no non-missing values. No analysis for this " #| "variable will be done." msgid "" "The table \"%s\" has no non-empty control variables. No result for this " "table will be displayed." msgstr "" "La variable dependent %s no en te cap valor no-perdut. No es realitza cap " "anàlisi per aquesta variable." #: src/language/stats/means-calc.c:443 msgid "Group Median" msgstr "Mediana de Grup" #: src/language/stats/means-calc.c:455 msgid "First" msgstr "Primer" #: src/language/stats/means-calc.c:456 msgid "Last" msgstr "Últim" #: src/language/stats/means-calc.c:458 msgid "Percent N" msgstr "Percentatge N" #: src/language/stats/means-calc.c:459 msgid "Percent Sum" msgstr "Suma de Percentatge" #: src/language/stats/means-calc.c:461 msgid "Harmonic Mean" msgstr "Mitjana Harmònica" #: src/language/stats/means-calc.c:462 msgid "Geom. Mean" msgstr "Mitjana Geom." #: src/language/stats/mcnemar.c:144 msgid "The McNemar test is appropriate only for dichotomous variables" msgstr "La prova McNemar nomès es adequada per a variables dicotòmiques " #: src/language/stats/mcnemar.c:226 src/language/stats/sign.c:105 msgid "Point Probability" msgstr "Punt de Probabilitat" #: src/language/stats/mcnemar.c:229 src/language/stats/sign.c:78 #: src/language/stats/sign.c:108 src/language/stats/t-test-paired.c:199 #: src/language/stats/t-test-paired.c:257 src/language/stats/wilcoxon.c:253 #: src/language/stats/wilcoxon.c:292 #, fuzzy #| msgid "Pair %d" msgid "Pairs" msgstr "Parell %d" #: src/language/stats/median.c:316 msgid "> Median" msgstr "> Mediana" #: src/language/stats/median.c:316 msgid "≤ Median" msgstr "≤ Mediana" #: src/language/stats/npar.c:536 #, c-format msgid "%s subcommand not currently implemented." msgstr "Actualment no està implementat el subcomandament %s." #: src/language/stats/npar.c:691 #, c-format msgid "Expecting %s, %s, %s or a number." msgstr "S'espera %s, %s, %s o un nombre." #: src/language/stats/npar.c:845 #, c-format msgid "" "The specified value of HI (%d) is lower than the specified value of LO (%d)" msgstr "" "El valor especificatper a HI (%d) és menor que l'especificat per a LO (%d)" #: src/language/stats/npar.c:897 #, c-format msgid "" "%d expected values were given, but the specified range (%d-%d) requires " "exactly %d values." msgstr "" "S'han proporcionat %d valors esperats, però l'interval especificat (%d-%d) " "requereix exactament %d valors." #: src/language/stats/npar.c:1118 src/language/stats/t-test-parser.c:173 #, c-format msgid "" "PAIRED was specified but the number of variables preceding WITH (%zu) did " "not match the number following (%zu)." msgstr "" "S'ha especificat PAIRED però el nombre de variables abans de WITH (%zu) not " "conicideixen amb en nombre de variables seguents (%zu)." #: src/language/stats/oneway.c:361 msgid "LSD" msgstr "LSD" #: src/language/stats/oneway.c:362 src/ui/gui/oneway.ui:338 msgid "Tukey HSD" msgstr "HSD de Tukey" #: src/language/stats/oneway.c:363 src/ui/gui/oneway.ui:253 msgid "Bonferroni" msgstr "Bonferroni" #: src/language/stats/oneway.c:364 src/ui/gui/oneway.ui:304 msgid "Scheffé" msgstr "Scheffé" #: src/language/stats/oneway.c:365 msgid "Games-Howell" msgstr "Games-Howell" #: src/language/stats/oneway.c:366 src/ui/gui/oneway.ui:321 msgid "Šidák" msgstr "Šidák" #: src/language/stats/oneway.c:519 #, c-format msgid "The post hoc analysis method %s is not supported." msgstr "El mètode d'anàlisi post-hoc %s no està implementat encara." #: src/language/stats/oneway.c:842 #, c-format msgid "" "Dependent variable %s has no non-missing values. No analysis for this " "variable will be done." msgstr "" "La variable dependent %s no en te cap valor no-perdut. No es realitza cap " "anàlisi per aquesta variable." #: src/language/stats/oneway.c:924 #, c-format msgid "" "In contrast list %zu, the number of coefficients (%zu) does not equal the " "number of groups (%d). This contrast list will be ignored." msgstr "" "A la llista de contrast %zu, el nombre de coeficients (%zu) no equival al " "nombre de grups (%d). Aquesta llista de contrast serà ignorada." #: src/language/stats/oneway.c:936 #, c-format msgid "Coefficients for contrast %zu do not total zero" msgstr "Els coeficients per contrastar %zu no sumen cero." #: src/language/stats/oneway.c:971 msgid "ANOVA" msgstr "ANOVA" #: src/language/stats/oneway.c:974 src/language/stats/regression.c:1024 msgid "Sum of Squares" msgstr "Suma de Quadrats" #: src/language/stats/oneway.c:981 msgid "Between Groups" msgstr "Entre Grups" #: src/language/stats/oneway.c:981 msgid "Within Groups" msgstr "Intra Grups" #: src/language/stats/oneway.c:1075 src/language/stats/oneway.c:1257 #, fuzzy #| msgid "_Dependent Variable" msgid "Dependent Variable" msgstr "Variable(s) _Dependent(s):" #: src/language/stats/oneway.c:1148 msgid "Test of Homogeneity of Variances" msgstr "Prova de Homogeneitat de variances" #: src/language/stats/oneway.c:1151 msgid "Levene Statistic" msgstr "Estatístic de Levene" #: src/language/stats/oneway.c:1152 msgid "df1" msgstr "df1" #: src/language/stats/oneway.c:1153 msgid "df2" msgstr "df2" #: src/language/stats/oneway.c:1192 msgid "Contrast Coefficients" msgstr "Coeficinents de Contrast" #: src/language/stats/oneway.c:1199 src/language/stats/oneway.c:1246 msgid "Contrast" msgstr "Contrast" #: src/language/stats/oneway.c:1236 msgid "Contrast Tests" msgstr "Proves de contrats" #: src/language/stats/oneway.c:1239 msgid "Value of Contrast" msgstr "Valor de constrast" #: src/language/stats/oneway.c:1241 src/language/stats/regression.c:905 #: src/language/stats/t-test-indep.c:266 #: src/language/stats/t-test-one-sample.c:74 #: src/language/stats/t-test-paired.c:252 msgid "t" msgstr "t" #: src/language/stats/oneway.c:1252 msgid "Assumption" msgstr "" #: src/language/stats/oneway.c:1253 msgid "Assume equal variances" msgstr "S'assumeix igualtat de variances" #: src/language/stats/oneway.c:1254 #, fuzzy #| msgid "Does not assume equal" msgid "Does not assume equal variances" msgstr "No s'assumeix igualtat" #: src/language/stats/oneway.c:1367 #, c-format msgid "Multiple Comparisons (%s)" msgstr "Comparacions Múltiples (%s)" #: src/language/stats/oneway.c:1374 #, fuzzy #| msgid "Mean Difference" msgid "Mean Difference (I - J)" msgstr "Diferència Mitjana" #: src/language/stats/oneway.c:1379 #, c-format msgid "%g%% Confidence Interval" msgstr "Interval de Confiança del %g%%" #: src/language/stats/oneway.c:1386 src/language/stats/oneway.c:1390 msgid "(J) Family" msgstr "" #: src/language/stats/oneway.c:1406 #, fuzzy #| msgid "Runs Test" msgid "Test" msgstr "Executa prova" #: src/language/stats/quick-cluster.c:576 msgid "Initial Cluster Centers" msgstr "Centres d'Agrupaments Inicials" #: src/language/stats/quick-cluster.c:577 msgid "Final Cluster Centers" msgstr "Centres d'Agrupaments Finals" #: src/language/stats/quick-cluster.c:580 #: src/language/stats/quick-cluster.c:660 #: src/language/stats/quick-cluster.c:661 #: src/language/stats/quick-cluster.c:753 msgid "Cluster" msgstr "Agrupament" #: src/language/stats/quick-cluster.c:658 msgid "Cluster Membership" msgstr "Pertinença d'Agrupament" #: src/language/stats/quick-cluster.c:744 msgid "Number of Cases in each Cluster" msgstr "Nombre de casos a cada Agrupament" #: src/language/stats/quick-cluster.c:750 #, fuzzy #| msgid "Cluster" msgid "Clusters" msgstr "Agrupament" #: src/language/stats/quick-cluster.c:867 #: src/language/stats/quick-cluster.c:893 #, fuzzy, c-format #| msgid "Variable %s already exists." msgid "A variable called `%s' already exists." msgstr "La variable %s ja existeix." #: src/language/stats/quick-cluster.c:908 #, c-format msgid "Expecting %s or %s." msgstr "Esperant %s o bé %s." #: src/language/stats/quick-cluster.c:928 msgid "The number of clusters must be positive" msgstr "El nombre d'aglomerats ha de ser positiu." #: src/language/stats/quick-cluster.c:944 #, fuzzy #| msgid "The convergence criterium must be positive" msgid "The convergence criterion must be positive" msgstr "El criteri de convergencia ha de ser positiu." #: src/language/stats/quick-cluster.c:960 msgid "The number of iterations must be positive" msgstr "El nombre d'iteracions ha de ser positiu." #: src/language/stats/rank.c:205 #, c-format msgid "" "Cannot generate variable name for ranking %s with %s. All candidates in use." msgstr "" "No es pot crear el nom de la variable de ranking %s amb %s. Tots els " "candidats estan en ús." #: src/language/stats/rank.c:321 #, c-format msgid "Too many variables in %s clause." msgstr "Massa variables a la clausula %s." #: src/language/stats/rank.c:323 #, c-format msgid "Variable %s already exists." msgstr "La variable %s ja existeix." #: src/language/stats/rank.c:325 src/language/expressions/evaluate.c:164 #, c-format msgid "Duplicate variable name %s." msgstr "Nom de la variable %s duplicat." #: src/language/stats/rank.c:631 #, c-format msgid "%s of %s by %s" msgstr "%s de %s per %s" #: src/language/stats/rank.c:825 #, fuzzy #| msgid "Variables Created By %s" msgid "Variables Created by RANK" msgstr "Variables creades per %s" #: src/language/stats/rank.c:828 src/language/stats/rank.c:829 #, fuzzy #| msgid "Name Variable:" msgid "New Variable" msgstr "Nom de Variable:" #: src/language/stats/rank.c:829 #, fuzzy #| msgid "Function: " msgid "Function" msgstr "Funció: " #: src/language/stats/rank.c:830 #, fuzzy #| msgid "Extraction" msgid "Fraction" msgstr "Extracció" #: src/language/stats/rank.c:830 #, fuzzy #| msgid "_Grouping Variable:" msgid "Grouping Variables" msgstr "Variable d'A_grupament:" #: src/language/stats/rank.c:833 src/language/stats/rank.c:834 #, fuzzy #| msgid "_Test Variable:" msgid "Existing Variable" msgstr "Variable de prova:" #: src/language/stats/reliability.c:164 msgid "Reliability on a single variable is not useful." msgstr "L'anàlisi de fiabilitat d'una única variable és inútil." #: src/language/stats/reliability.c:281 msgid "" "The STATISTICS subcommand is not yet implemented. No statistics will be " "produced." msgstr "" "La subordre STATISTICS encara no està implementada. No es produirà cap " "estatística." #: src/language/stats/reliability.c:300 msgid "The split point must be less than the number of variables" msgstr "El punt de segmentació ha de ser inferior al nombre de variables" #: src/language/stats/reliability.c:525 #, c-format msgid "Scale: %s" msgstr "Escala: %s" #: src/language/stats/reliability.c:582 msgid "Item-Total Statistics" msgstr "Estadístiques de total d'Items" #: src/language/stats/reliability.c:585 msgid "Scale Mean if Item Deleted" msgstr "Escalar la mitjana si s'esborra l'element" #: src/language/stats/reliability.c:586 msgid "Scale Variance if Item Deleted" msgstr "Escalar la variança si s'esborra l'element" #: src/language/stats/reliability.c:587 msgid "Corrected Item-Total Correlation" msgstr "Correlació total-item corregida" #: src/language/stats/reliability.c:588 msgid "Cronbach's Alpha if Item Deleted" msgstr "Cronbach's Alpha si s'esborra l'element" #: src/language/stats/reliability.c:627 msgid "Reliability Statistics" msgstr "Estadístiques de fiabilitat" #: src/language/stats/reliability.c:634 src/language/stats/reliability.c:646 msgid "Cronbach's Alpha" msgstr "Alfa de Cronbach" #: src/language/stats/reliability.c:635 src/language/stats/reliability.c:649 #: src/language/stats/reliability.c:652 msgid "N of Items" msgstr "N d'elements" #: src/language/stats/reliability.c:647 msgid "Part 1" msgstr "Part 1" #: src/language/stats/reliability.c:650 msgid "Part 2" msgstr "Part 2" #: src/language/stats/reliability.c:654 msgid "Total N of Items" msgstr "N total d'elements" #: src/language/stats/reliability.c:656 msgid "Correlation Between Forms" msgstr "Correlación entre formes" #: src/language/stats/reliability.c:659 msgid "Spearman-Brown Coefficient" msgstr "Coeficient d'Spearman-Brown" #: src/language/stats/reliability.c:660 msgid "Equal Length" msgstr "Ample igual" #: src/language/stats/reliability.c:661 msgid "Unequal Length" msgstr "Ample desigual" #: src/language/stats/reliability.c:663 msgid "Guttman Split-Half Coefficient" msgstr "Coeficient Gutman de DIvisió pel mig" #: src/language/stats/roc.c:966 msgid "Area Under the Curve" msgstr "Àrea Sota la Corba" #: src/language/stats/roc.c:970 msgid "Area" msgstr "Àrea" #: src/language/stats/roc.c:976 msgid "Asymptotic Sig." msgstr "Signif. Asimpt." #: src/language/stats/roc.c:979 #, c-format msgid "Asymp. %g%% Confidence Interval" msgstr " Interval de Confiança Asimp. %g%%" #: src/language/stats/roc.c:987 msgid "Variable under test" msgstr "Variable sota prova" #: src/language/stats/roc.c:1026 msgid "Case Summary" msgstr "Resum del Cas" #: src/language/stats/roc.c:1030 msgid "Unweighted" msgstr "No ponderat" #: src/language/stats/roc.c:1031 msgid "Weighted" msgstr "Ponderat" #: src/language/stats/roc.c:1064 msgid "Coordinates of the Curve" msgstr "Coordenades de la Corba" #: src/language/stats/roc.c:1068 msgid "Positive if greater than or equal to" msgstr "Positiu si és major o igual a" #: src/language/stats/roc.c:1069 src/output/charts/roc-chart-cairo.c:38 msgid "Sensitivity" msgstr "Sensibilitat" #: src/language/stats/roc.c:1069 src/output/charts/roc-chart-cairo.c:37 msgid "1 - Specificity" msgstr "1 - Especificitat" #: src/language/stats/roc.c:1072 #, fuzzy #| msgid "ordinary" msgid "Coordinates" msgstr "ordinàri/a" #: src/language/stats/roc.c:1076 msgid "Test variable" msgstr "Variable de prova" #: src/language/stats/regression.c:224 src/language/stats/regression.c:229 #, c-format msgid "VARIABLES may not appear after %s" msgstr "VARIABLES no pot aparèixer desprès de %s." #: src/language/stats/regression.c:412 msgid "" "REGRESSION with SAVE ignores TEMPORARY. Temporary transformations will be " "made permanent." msgstr "" "REGRESSION amb SAVE ignora TEMPORARY. Les transformacions temporals seran " "permanents." #: src/language/stats/regression.c:416 msgid "REGRESSION with SAVE ignores FILTER. All cases will be processed." msgstr "REGRESSION amb SAVE ignora FILTER. Tots els casos seran processats." #: src/language/stats/regression.c:569 msgid "" "The dependent variable is equal to the independent variable. The least " "squares line is therefore Y=X. Standard errors and related statistics may be " "meaningless." msgstr "" "La variable dependent és igual a la variable independent. La línia de mínims " "quadrats és doncs Y=X. Els errors estàndard i els estadistics relacionats " "podríen ser irrellevants." #: src/language/stats/regression.c:776 msgid "No valid data found. This command was skipped." msgstr "No s'han trobat dades vàlides. S'gnora aquesta ordre." #: src/language/stats/regression.c:863 #, c-format msgid "Model Summary (%s)" msgstr "Resum del model (%s)" #: src/language/stats/regression.c:868 #: src/ui/gui/psppire-dialog-action-regression.c:42 msgid "R" msgstr "R" #: src/language/stats/regression.c:868 msgid "R Square" msgstr "R Quadrada" #: src/language/stats/regression.c:868 msgid "Adjusted R Square" msgstr "R Quadrada Ajustada" #: src/language/stats/regression.c:869 msgid "Std. Error of the Estimate" msgstr "Error estàndard de l'Estimador" #: src/language/stats/regression.c:895 #, c-format msgid "Coefficients (%s)" msgstr "Coeficients (%s)" #: src/language/stats/regression.c:901 msgid "Unstandardized Coefficients" msgstr "Coeficients no estandaritzats" #: src/language/stats/regression.c:904 msgid "Standardized Coefficients" msgstr "Coeficients Estandaritzats" #: src/language/stats/regression.c:904 msgid "Beta" msgstr "Beta" #: src/language/stats/regression.c:911 #, c-format msgid "%g%% Confidence Interval for B" msgstr "Interval de Confiança per B %g%%" #: src/language/stats/regression.c:919 #, fuzzy #| msgid "Reliability Statistics" msgid "Collinearity Statistics" msgstr "Estadístiques de fiabilitat" #: src/language/stats/regression.c:920 #, fuzzy #| msgid "Covariance" msgid "Tolerance" msgstr "Covariància" #: src/language/stats/regression.c:920 msgid "VIF" msgstr "" #: src/language/stats/regression.c:933 msgid "(Constant)" msgstr "(Constant)" #: src/language/stats/regression.c:1020 #, c-format msgid "ANOVA (%s)" msgstr "ANOVA (%s)" #: src/language/stats/regression.c:1031 src/ui/gui/regression.ui:24 msgid "Regression" msgstr "Regressió" #: src/language/stats/regression.c:1075 #, c-format msgid "Coefficient Correlations (%s)" msgstr "Correlacions de Coeficients (%s)" #: src/language/stats/regression.c:1082 #, fuzzy #| msgid "Model" msgid "Models" msgstr "Model" #: src/language/stats/regression.c:1090 msgid "Covariances" msgstr "Covariància" #: src/language/stats/runs.c:169 #, c-format msgid "" "Multiple modes exist for variable `%s'. Using %.*g as the threshold value." msgstr "" "Existeixen múltiples modes per a la variable `%s'. S'utilitza %.*g com a " "valor límit." #: src/language/stats/runs.c:314 src/ui/gui/runs.ui:24 msgid "Runs Test" msgstr "Executa prova" #: src/language/stats/runs.c:319 msgid "Test Value" msgstr "Valor de prova" #: src/language/stats/runs.c:320 msgid "Test Value (mode)" msgstr "Valor de prova (moda)" #: src/language/stats/runs.c:321 msgid "Test Value (mean)" msgstr "Valor de prova (mitjana)" #: src/language/stats/runs.c:322 msgid "Test Value (median)" msgstr "Valor de prova (mediana)" #: src/language/stats/runs.c:323 msgid "Cases < Test Value" msgstr "Casos < Valor de prova" #: src/language/stats/runs.c:324 msgid "Cases ≥ Test Value" msgstr "Casos ≥ Valor de la Prova" #: src/language/stats/runs.c:325 msgid "Total Cases" msgstr "Casos Totals" #: src/language/stats/runs.c:326 msgid "Number of Runs" msgstr "Nombre d'execucions" #: src/language/stats/sign.c:72 #, fuzzy #| msgid "Mean Difference" msgid "Differences" msgstr "Diferència Mitjana" #: src/language/stats/sign.c:73 msgid "Negative Differences" msgstr "Diferències Negatives" #: src/language/stats/sign.c:74 msgid "Positive Differences" msgstr "Diferències Positives" #: src/language/stats/sign.c:75 src/language/stats/wilcoxon.c:250 msgid "Ties" msgstr "Lligams" #: src/language/stats/sort-cases.c:63 msgid "Buffer limit must be at least 2." msgstr "El límit de la memòria intermitja ha de ser almenys de 2." #: src/language/stats/sort-criteria.c:89 #, c-format msgid "Variable %s specified twice in sort criteria." msgstr "La variable %s s'especifica dues vegades als criteris d'ordenació." #: src/language/stats/t-test-indep.c:190 msgid "Group Statistics" msgstr "Estadístiques de grup" #: src/language/stats/t-test-indep.c:200 #, fuzzy #| msgid "Group1" msgid "Group" msgstr "Grup 1" #: src/language/stats/t-test-indep.c:256 msgid "Independent Samples Test" msgstr "Prova per mostres independents" #: src/language/stats/t-test-indep.c:261 msgid "Levene's Test for Equality of Variances" msgstr "Prova de Levene per a l'igualtat de variancies" #: src/language/stats/t-test-indep.c:265 #, fuzzy #| msgid "t-test for Equality of Means" msgid "T-Test for Equality of Means" msgstr "Prova T per l'igualtat de Mitjanes" #: src/language/stats/t-test-indep.c:269 #: src/language/stats/t-test-one-sample.c:77 msgid "Mean Difference" msgstr "Diferència Mitjana" #: src/language/stats/t-test-indep.c:270 msgid "Std. Error Difference" msgstr "Err.Est. de la Diferència" #: src/language/stats/t-test-indep.c:273 #, fuzzy, no-c-format #| msgid "%g%% Confidence Interval of the Difference" msgid "95% Confidence Interval of the Difference" msgstr "Interval de confiança de la Diferència %g%%" #: src/language/stats/t-test-indep.c:277 #, fuzzy #| msgid "Options" msgid "Assumptions" msgstr "Opcions" #: src/language/stats/t-test-indep.c:278 msgid "Equal variances assumed" msgstr "S'asumeix igualtat de variancies" #: src/language/stats/t-test-indep.c:279 msgid "Equal variances not assumed" msgstr "Igualtat de variancies no asumida" #: src/language/stats/t-test-one-sample.c:64 msgid "One-Sample Test" msgstr "Prova d'una mostra" #: src/language/stats/t-test-one-sample.c:71 #, fuzzy, c-format #| msgid "Test Value = %f" msgid "Test Value = %.*g" msgstr "Valor de prova = %f" #: src/language/stats/t-test-one-sample.c:80 #: src/language/stats/t-test-paired.c:246 #, c-format msgid "%g%% Confidence Interval of the Difference" msgstr "Interval de confiança de la Diferència %g%%" #: src/language/stats/t-test-one-sample.c:122 msgid "One-Sample Statistics" msgstr "Estadisticas d'una mostra" #: src/language/stats/t-test-paired.c:147 msgid "Paired Sample Statistics" msgstr "Estadistiques de mostres aparellades" #: src/language/stats/t-test-paired.c:163 #: src/language/stats/t-test-paired.c:205 #: src/language/stats/t-test-paired.c:263 #, fuzzy, c-format #| msgid "Pair %d" msgid "Pair %zu" msgstr "Parell %d" #: src/language/stats/t-test-paired.c:190 msgid "Paired Samples Correlations" msgstr "Correlacions de mostres aparellades" #: src/language/stats/t-test-paired.c:208 #, c-format msgid "%s & %s" msgstr "%s & %s" #: src/language/stats/t-test-paired.c:234 msgid "Paired Samples Test" msgstr "Prova de mostres aparellades" #: src/language/stats/t-test-paired.c:240 msgid "Paired Differences" msgstr "Diferències aparellades" #: src/language/stats/t-test-paired.c:266 #, c-format msgid "%s - %s" msgstr "%s - %s" #: src/language/stats/t-test-parser.c:133 #, c-format msgid "When applying %s to a string variable, two values must be specified." msgstr "" "Quan s'aplica %s a una variable de text, s'han d'especificar dos valors." #: src/language/stats/t-test-parser.c:145 #: src/language/stats/t-test-parser.c:241 #, c-format msgid "%s subcommand may not be used with %s." msgstr "La subordre %s no pot ser utilitzada amb %s<." #: src/language/stats/t-test-parser.c:305 msgid "Exactly one of TESTVAL, GROUPS and PAIRS subcommands must be specified." msgstr "" "Exactamente un dels subcomanaments TESTVAL, GROUPS y PAIRS ha d'especificar-" "se." #: src/language/stats/wilcoxon.c:248 #, fuzzy #| msgid "_Sign" msgid "Sign" msgstr "_Signe" #: src/language/stats/wilcoxon.c:249 msgid "Negative Ranks" msgstr "Rangs Negatius" #: src/language/stats/wilcoxon.c:249 msgid "Positive Ranks" msgstr "Rangs Positius" #: src/language/stats/wilcoxon.c:296 #, fuzzy #| msgid "Too many pairs to calculate exact significance." msgid "Too many pairs to calculate exact significance" msgstr "Massa parelles per calcular la significativitat exacta." #: src/language/data-io/combine-files.c:214 msgid "Cannot specify the active dataset since none has been defined." msgstr "" "No es pot especificar l'arxiu de dades actiu ja que cap no ha estat definit." #: src/language/data-io/combine-files.c:220 msgid "" "This command may not be used after TEMPORARY when the active dataset is an " "input source. Temporary transformations will be made permanent." msgstr "" "Aquest comando no pot ser utilitzat després de TEMPORARY quan l'arxiu de " "dades actiu és una font d'entrada. Les transformacions temporals seran " "permanents." #: src/language/data-io/combine-files.c:255 msgid "Multiple IN subcommands for a single FILE or TABLE." msgstr "Múltiples subcomandos IN per a un únic FILE o TABLE." #: src/language/data-io/combine-files.c:308 #, c-format msgid "File %s lacks BY variable %s." msgstr "L'arxiu %s no té variable BY %s." #: src/language/data-io/combine-files.c:311 #, c-format msgid "Active dataset lacks BY variable %s." msgstr "Arxiu de dades actiu no té BY variable %s." #: src/language/data-io/combine-files.c:388 #: src/language/data-io/combine-files.c:393 #, c-format msgid "BY is required when %s is specified." msgstr "BY és necessari quan s'especifica %s." #: src/language/data-io/combine-files.c:521 msgid "" "Combining files with incompatible encodings. String data may not be " "represented correctly." msgstr "" "Combinant arxius amb codificacions incompatibles. Les dades de la cadena no " "podran estar representades correctament." #: src/language/data-io/combine-files.c:564 #, c-format msgid "" "Variable %s in file %s has different type or width from the same variable in " "earlier file." msgstr "" "La variable %s a l'arxiu %s és de tipus o amplada diferent respecte de la " "mateixa variable en l'arxiu anterior. " #: src/language/data-io/combine-files.c:570 #, c-format msgid "In file %s, %s is numeric." msgstr "A l'arxiu %s, %s és numèric." #: src/language/data-io/combine-files.c:573 #, c-format msgid "In file %s, %s is a string variable with width %d." msgstr "A l'arxiu %s, %s és una variable de cadena amb una amplada de %d." #: src/language/data-io/combine-files.c:578 #, c-format msgid "In an earlier file, %s was numeric." msgstr "En un arxiu anterior, %s era numèric." #: src/language/data-io/combine-files.c:581 #, c-format msgid "In an earlier file, %s was a string variable with width %d." msgstr "" "En un arxiu anterior, %s era una variable cadena amb una amplada de %d." #: src/language/data-io/combine-files.c:621 #, c-format msgid "" "Variable name %s specified on %s subcommand duplicates an existing variable " "name." msgstr "" "Nom de la variable %s especificat al subcomando %s duplica el nom de la " "variable existent." #: src/language/data-io/combine-files.c:793 #, c-format msgid "Encountered %zu sets of duplicate cases in the master file." msgstr "Trobats %zu conjunts de casos duplicats a l'arxiu principal." #: src/language/data-io/data-list.c:129 src/language/data-io/data-list.c:144 #, fuzzy, c-format #| msgid "The %s value must be nonnegative." msgid "The %s value must be non-negative." msgstr "El valor %s ha de ser no-negatiu." #: src/language/data-io/data-list.c:154 #, c-format msgid "The %s subcommand may only be used within %s." msgstr "El subcomandament %s només pot ser utilitzat dins de %s." #: src/language/data-io/data-list.c:159 #, c-format msgid "The %s subcommand may only be specified once." msgstr "El subcomandament %s només pot ser especificat una vegada." #: src/language/data-io/data-list.c:197 msgid "Only one of FIXED, FREE, or LIST may be specified." msgstr "Només un de FIXED, FREE, o LIST pot ser especificat." #: src/language/data-io/data-list.c:260 msgid "Encoding should not be specified for inline data. It will be ignored." msgstr "" "La codificació no ha de ser especificada per les dades en línia. Serà " "ignorada." #: src/language/data-io/data-list.c:269 #, c-format msgid "The %s subcommand may be used only with %s." msgstr "El subcomandament %s només pot ser utilitzat només amb %s." #: src/language/data-io/data-list.c:284 src/language/data-io/matrix-data.c:578 msgid "At least one variable must be specified." msgstr "Al menys una variable ha de ser especificada." #: src/language/data-io/data-list.c:383 src/language/data-io/data-list.c:491 #: src/language/data-io/get-data.c:662 #, c-format msgid "%s is a duplicate variable name." msgstr "%s és un nom de variable duplicat." #: src/language/data-io/data-list.c:390 #, c-format msgid "There is already a variable %s of a different type." msgstr "Ja existeix una variable %s de diferent tipus." #: src/language/data-io/data-list.c:397 #, c-format msgid "There is already a string variable %s of a different width." msgstr "Ja existeix una cadena de la variable %s d'amplada diferent." #: src/language/data-io/data-list.c:405 #, c-format msgid "Cannot place variable %s on record %d when RECORDS=%d is specified." msgstr "" "No es pot posar la variable %s en el registre %d quan RECORDS=%d està " "especificat." #: src/language/data-io/data-parser.c:453 #: src/language/data-io/data-parser.c:462 msgid "Quoted string extends beyond end of line." msgstr "La cadena entre cometes s'estén més enllà del final de línia." #: src/language/data-io/data-parser.c:488 msgid "Missing delimiter following quoted string." msgstr "Manca el delimitador darrera de la cadena entre cometes." #: src/language/data-io/data-parser.c:506 #, c-format msgid "Data for variable %s is not valid as format %s: %s" msgstr "Les dades per a la variable %s no son vàlides com a format %s: %s" #: src/language/data-io/data-parser.c:536 #, c-format msgid "Partial case of %d of %d records discarded." msgstr "Casos parcials de %d de %d registres descartats." #: src/language/data-io/data-parser.c:592 #, c-format msgid "Partial case discarded. The first variable missing was %s." msgstr "Cas parcial descartat. La primera variable que faltava era %s." #: src/language/data-io/data-parser.c:634 #, c-format msgid "" "Missing value(s) for all variables from %s onward. These will be filled " "with the system-missing value or blanks, as appropriate." msgstr "" "Valor(s) perdut(s) per a totes les variables des de %st. Aquests s'omplen " "amb el valor perdut del sistema o espais en blanc, segons correspongui." #: src/language/data-io/data-parser.c:655 msgid "Record ends in data not part of any field." msgstr "El registre termina amb dades que no formen part de cap camp." #: src/language/data-io/data-parser.c:670 #, c-format msgid "Reading %d record from %s." msgid_plural "Reading %d records from %s." msgstr[0] "Llegint %d registre de %s." msgstr[1] "Llegint %d registres de %s." #: src/language/data-io/data-parser.c:680 src/language/data-io/print.c:435 msgid "Record" msgstr "Registre" #: src/language/data-io/data-parser.c:680 src/language/data-io/print.c:435 #: src/ui/gui/psppire-var-sheet-header.c:76 msgid "Columns" msgstr "Columnes" #: src/language/data-io/data-parser.c:680 #: src/language/data-io/data-parser.c:725 src/language/data-io/print.c:435 msgid "Format" msgstr "Format" #: src/language/data-io/data-parser.c:720 #, c-format msgid "Reading free-form data from %s." msgstr "Llegint dades amb format lliure de %s." #. TRANSLATORS: this fragment will be interpolated into #. messages in fh_lock() that identify types of files. #: src/language/data-io/data-reader.c:136 src/language/data-io/data-writer.c:79 msgid "data file" msgstr "arxiu de dades" #: src/language/data-io/data-reader.c:160 #, c-format msgid "Could not open `%s' for reading as a data file: %s." msgstr "No s'ha pogut obrir `%s' per a la lectura com a arxiu de dades: %s." #: src/language/data-io/data-reader.c:174 #, c-format msgid "Could not read `%s' as a text file with encoding `%s': %s." msgstr "" "No s'ha pogut llegir `%s' com a arxiu de text amb codificació `%s': %s." #: src/language/data-io/data-reader.c:233 #, c-format msgid "" "Missing %s while reading inline data. This probably indicates a missing or " "incorrectly formatted %s command. %s must appear by itself on a single line " "with exactly one space between words." msgstr "" "Manca %s quan es llegien dades en línia. Això probablement indica una " "pèrdua o format erroni del comandament %s. %s ha d'aparèixer per si mateix " "en una sola línia amb, exactament, un espai entre les paraules." #: src/language/data-io/data-reader.c:253 #: src/language/data-io/data-reader.c:387 #, c-format msgid "Error reading file %s: %s." msgstr "S'ha produït un error en llegir l'arxiu %s: %s." #: src/language/data-io/data-reader.c:261 #, c-format msgid "Unexpected end of file in partial record reading %s." msgstr "Fi d'arxiu inesperat en la lectura del registre parcial %s." #: src/language/data-io/data-reader.c:321 #, c-format msgid "Corrupt block descriptor word at offset 0x%lx in %s." msgstr "Paraula descriptora de bloc malmesa en localització 0x%lx en %s." #: src/language/data-io/data-reader.c:322 #, c-format msgid "Corrupt record descriptor word at offset 0x%lx in %s." msgstr "Paraula descriptora de registre malmesa en localització 0x%lx en %s." #: src/language/data-io/data-reader.c:335 #, c-format msgid "Corrupt record size at offset 0x%lx in %s." msgstr "Longitud de registre malmesa en localització 0x%lx en %s." #: src/language/data-io/data-reader.c:493 msgid "Record exceeds remaining block length." msgstr "El registre excedeix la longitud de blocs restants." #: src/language/data-io/data-reader.c:567 #, c-format msgid "Attempt to read beyond end-of-file on file %s." msgstr "Intent llegir més enllà de la fi de l'arxiu a %s." #: src/language/data-io/data-reader.c:570 #, c-format msgid "Attempt to read beyond %s." msgstr "Intent de llegir més enllà de %s." #: src/language/data-io/data-reader.c:733 msgid "" "This command is not valid here since the current input program does not " "access the inline file." msgstr "" "Aquesta ordre no es vàlida ja que el programa d'entrada actual no té accés a " "l'arxiu en línia." #: src/language/data-io/data-writer.c:106 #, c-format msgid "An error occurred while opening `%s' for writing as a data file: %s." msgstr "" "S'ha produït un error en obrir `%s' per a escriure'l com a arxiu de dades: " "%s." #: src/language/data-io/data-writer.c:224 #, c-format msgid "I/O error occurred writing data file `%s'." msgstr "Error E/S en escriure les dades de l'arxiu `%s'." #: src/language/data-io/dataset.c:64 #, c-format msgid "There is no dataset named %s." msgstr "No hi ha cap arxiu de dades anomenat %s." #: src/language/data-io/dataset.c:250 #, fuzzy #| msgid "Dataset" msgid "Datasets" msgstr "Arxiu de dades" #: src/language/data-io/dataset.c:263 msgid "unnamed dataset" msgstr "Arxiu de dades sense nom" #: src/language/data-io/file-handle.c:61 #, c-format msgid "" "File handle %s is already defined. Use %s before redefining a file handle." msgstr "" "El manipulador d'arxiu %s ja ha esta definit. Utilitzar %s abans de " "redefinir un manipulador d'arxius." #: src/language/data-io/file-handle.c:241 #, c-format msgid "%s must be specified with %s." msgstr "%s ha de ser especificat amb %s." #: src/language/data-io/file-handle.c:252 #, c-format msgid "" "The specified file mode requires LRECL. Assuming %zu-character records." msgstr "" "El mode d'arxiu especificat requereix LRECL. S'asumeix registres de %zu " "caracters." #: src/language/data-io/file-handle.c:256 #, c-format msgid "" "Record length (%d) must be between 1 and %lu bytes. Assuming %zu-character " "records." msgstr "" "L'amplada de registre (%d) ha d'estar entre 1 i %lu bytes. S'asumeix %zu-" "registres de caracter." #: src/language/data-io/file-handle.c:300 msgid "file" msgstr "arxiu" #: src/language/data-io/file-handle.c:302 msgid "inline file" msgstr "arxiu en linia" #: src/language/data-io/file-handle.c:350 msgid "expecting a file name or handle name" msgstr "experant un nom d'arxiu o un manipulador" #: src/language/data-io/file-handle.c:365 #, c-format msgid "Handle for %s not allowed here." msgstr "Aquí no està permès un manipulador per a %s." #: src/language/data-io/get-data.c:108 src/output/measure.c:262 #, c-format msgid "error reading file `%s'" msgstr "error llegint l'arxiu `%s'" #: src/language/data-io/get-data.c:127 #, c-format msgid "Unsupported TYPE %s." msgstr "TYPE %s no admès." #: src/language/data-io/get-data.c:278 msgid "The sheet index must be greater than or equal to 1" msgstr "L'index de capa ha de ser superior o igual a 1" #: src/language/data-io/get-data.c:285 src/language/data-io/get-data.c:308 #: src/language/data-io/get-data.c:327 #, c-format msgid "%s must be followed by either \"%s\" or \"%s\"." msgstr "%s ha d'anar seguit per \"%s\" o be \"%s\"." #: src/language/data-io/get-data.c:357 #, c-format msgid "" "%s is allowed only with %s arrangement, but %s arrangement was stated or " "implied earlier in this command." msgstr "" "%s només es permet amb configuració %s, però prèviament en aquest comando " "s'ha establit la configuració %s." #: src/language/data-io/get-data.c:441 src/language/data-io/get-data.c:479 #, c-format msgid "Value of %s must be 1 or greater." msgstr "El valor de %s ha de ser major o igual a 1." #: src/language/data-io/get-data.c:504 msgid "" "Ignoring obsolete IMPORTCASES subcommand. (N OF CASES or SAMPLE may be used " "to substitute.)" msgstr "" "S'ignorarà la subordre obsoleta IMPORTCASES. (N OF CASES o SAMPLE ha de ser " "utilitzada com a subtitut.)" #: src/language/data-io/get-data.c:551 msgid "" "In compatible syntax mode, the QUALIFIER string must contain exactly one " "character." msgstr "" "En el mode de sintaxi compatible, la cadena QUALIFIER ha de contenir " "exactament un caràcter." #: src/language/data-io/get-data.c:583 #, c-format msgid "" "The record number specified, %ld, is at or before the previous record, %d. " "Data fields must be listed in order of increasing record number." msgstr "" "El nombre de registre especificat, %ld, és a o abans del registre anterior, " "%d. Els camps de dades han de ser llistats en ordre incremental del número " "de registre." #: src/language/data-io/get-data.c:592 #, c-format msgid "" "The record number specified, %ld, exceeds the number of records per case " "specified on FIXCASE, %d." msgstr "" "El nombre de registre especificat , %ld, excedeix el nombre de registres per " "cas especificats a FIXCASE, %d." #: src/language/data-io/get.c:132 #, c-format msgid "%s: Data file dictionary has no variables." msgstr "%s: El diccionari de dades de l'arxiu no te variables." #: src/language/data-io/inpt-pgm.c:133 #, c-format msgid "Unexpected end-of-file within %s." msgstr "Final d'arxiu inesperat dins %s." #: src/language/data-io/inpt-pgm.c:146 #, c-format msgid "Input program must contain %s or %s." msgstr "El programa d'entrada de dades ha de contenir %s o %s." #: src/language/data-io/inpt-pgm.c:152 msgid "Input program did not create any variables." msgstr "El programa d'entrada no va crear cap variable." #: src/language/data-io/inpt-pgm.c:365 msgid "" "REREAD: Column numbers must be positive finite numbers. Column set to 1." msgstr "" "REREAD: Els nombres de columna han de ser nombres positius finits. La " "columna s'estableix en 1." #: src/language/data-io/list.c:100 #, fuzzy #| msgid "Dataset" msgid "Data List" msgstr "Arxiu de dades" #: src/language/data-io/list.c:221 #, c-format msgid "" "The first case (%ld) specified precedes the last case (%ld) specified. The " "values will be swapped." msgstr "" "El primer cas (%ld) especificat precedeix a l'ultim cas (%ld) especificat. " "Els valors s'intercanviaran." #: src/language/data-io/list.c:230 #, c-format msgid "" "The first case (%ld) to list is numbered less than 1. The value is being " "reset to 1." msgstr "" "El primer cas a llistar (%ld) es numerat menor que 1. El valor es deixa a 1." #: src/language/data-io/list.c:237 #, c-format msgid "" "The last case (%ld) to list is numbered less than 1. The value is being " "reset to 1." msgstr "" "L'últim cas a llistar (%ld) es numerat menor que 1. El valor es deixa a 1." #: src/language/data-io/list.c:244 #, c-format msgid "The step value %ld is less than 1. The value is being reset to 1." msgstr "El valor del pas %ld es menor que 1. el valor es retorna a 1." #: src/language/data-io/placement-parser.c:96 #, c-format msgid "" "Number of variables specified (%zu) differs from number of variable formats " "(%zu)." msgstr "" "Nombre de variables especificades (%zu) difereix del nombre de formats de la " "variable (%zu)." #: src/language/data-io/placement-parser.c:106 msgid "" "SPSS-like or Fortran-like format specification expected after variable names." msgstr "" "Després del nom de les variables s'esperen especificacions en format tipus-" "SPSS o tipus-Fortran." #: src/language/data-io/placement-parser.c:129 #, c-format msgid "The %d columns %d-%d can't be evenly divided into %zu fields." msgstr "" "Les %d columnes %d-%d no poden ser uniformement dividides entre els camps " "%zu." #: src/language/data-io/placement-parser.c:310 msgid "Column positions for fields must be positive." msgstr "Les posicions de columna pels camps han de ser positives." #: src/language/data-io/placement-parser.c:312 msgid "Column positions for fields must not be negative." msgstr "Les posicions de columnes pels camps no poden ser negatives." #: src/language/data-io/placement-parser.c:372 msgid "The ending column for a field must be greater than the starting column." msgstr "La columna final d'un camp ha de ser major que la columna d'inici." #: src/language/data-io/placement-parser.c:409 #, fuzzy, c-format #| msgid "" #| "The record number specified, %ld, is at or before the previous record, " #| "%d. Data fields must be listed in order of increasing record number." msgid "" "The record number specified, %.0f, is at or before the previous record, %d. " "Data fields must be listed in order of increasing record number." msgstr "" "El nombre de registre especificat, %ld, és a o abans del registre anterior, " "%d. Els camps de dades han de ser llistats en ordre incremental del número " "de registre." #: src/language/data-io/print-space.c:127 #, c-format msgid "The expression on %s evaluated to the system-missing value." msgstr "L'expressió a %s s'avalua pel sistema de valors perduts." #: src/language/data-io/print-space.c:130 #, c-format msgid "The expression on %s evaluated to %g." msgstr "L'expressió a %s s'avalua a %g." #: src/language/data-io/print.c:189 src/language/data-io/trim.c:58 msgid "expecting a valid subcommand" msgstr "esperant un subcomando vàlid" #: src/language/data-io/print.c:219 #, c-format msgid "%s is required when binary formats are specified." msgstr "%s és necessari quan s'especifiquen formats binaris." #: src/language/data-io/print.c:302 #, c-format msgid "Output calls for %d records but %zu specified on RECORDS subcommand." msgstr "" "Resultats obtinguts per a %d registres, però %zu especificats al subcomando " "RECORDS." #: src/language/data-io/print.c:432 #, fuzzy #| msgid "Case Processing Summary" msgid "Print Summary" msgstr "Resum de processament del Casos" #: src/language/data-io/print.c:462 #, fuzzy #| msgid "Record" msgid "N of Records" msgstr "Registre" #: src/language/data-io/matrix-data.c:191 #, c-format msgid "" "There are %d variable declared but the data has at least %d matrix rows." msgstr "" "Hi ha %d variables declarades però les dades tenen com a mínim %d files de " "matriu." #: src/language/data-io/matrix-data.c:292 msgid "" "The N subcommand was specified, but a N record was also found in the data. " "The N record will be ignored." msgstr "" "S'ha especificat el subcomando N, però també s'ha trobat un registre N a les " "dades. S'ignorarà el registre N." #: src/language/data-io/matrix-data.c:488 src/language/utilities/set.q:186 #, c-format msgid "%s must not be negative." msgstr "%s no pot ser negatiu." #: src/language/data-io/matrix-data.c:568 msgid "FORMAT = FULL and FORMAT = NODIAGONAL are mutually exclusive." msgstr "FORMAT = FULL i FORMAT = NODIAGONAL son mútuament excloents" #: src/language/data-io/matrix-reader.c:102 #: src/language/data-io/matrix-reader.c:118 #, c-format msgid "Matrix dataset lacks a variable called %s." msgstr "L'arxiu de dades no en té cap variable anomenada %s." #: src/language/data-io/matrix-reader.c:109 #: src/language/data-io/matrix-reader.c:125 #, c-format msgid "Matrix dataset variable %s should be of string type." msgstr "La variable %s de la matriu de dades he de ser de tipus alfabètic." #: src/language/data-io/save-translate.c:168 #: src/language/data-io/save-translate.c:183 #, c-format msgid "The %s string must contain exactly one character." msgstr "La cadena %s hauria de contenir exactament un caràcter." #: src/language/data-io/save-translate.c:249 #, c-format msgid "Output file `%s' exists but %s was not specified." msgstr "Existeix un arxiu de sortida `%s' tot i que no s'ha especificat %s." #: src/language/data-io/save.c:309 #, fuzzy #| msgid "The BY subcommand is required." msgid "The OUTFILE or METADATA subcommand is required." msgstr "Es necessita el subcomando BY." #: src/language/data-io/trim.c:69 #, c-format msgid "" "Cannot rename %s as %s because there already exists a variable named %s. To " "rename variables with overlapping names, use a single RENAME subcommand such " "as `/RENAME (A=B)(B=C)(C=A)', or equivalently, `/RENAME (A B C=B C A)'." msgstr "" "No es pot canviar el nom %s per %s perquè ja existeix una variable anomenada " "%s. Per canviar el nom de les variables amb noms superposats, utilitzeu un " "únic subcomando RENAME com per exemple `/RENAME (A=B)(B=C)(C=A)', o " "equivalentment, `/RENAME (A B C=B C A)'." #: src/language/data-io/trim.c:227 #, c-format msgid "" "Number of variables on left side of `=' (%zu) does not match number of " "variables on right side (%zu), in parenthesized group %d of RENAME " "subcommand." msgstr "" "El nombre de variables en el costat esquerre de `=' (%zu) no coincideix amb " "el nombre de variables al costat dret (%zu), en el grup entre parèntesi %d " "del subcomando RENAME." #: src/language/data-io/trim.c:242 #, c-format msgid "Requested renaming duplicates variable name %s." msgstr "El reanomenament demanat duplica el nom de la variable %s." #: src/language/data-io/trim.c:281 msgid "Cannot DROP all variables from dictionary." msgstr "Impossible DROP totes les variables del diccionari." #: src/language/expressions/evaluate.c:151 msgid "expecting number or string" msgstr "esperant nombre o cadena" #: src/language/expressions/helpers.c:43 msgid "" "One of the arguments to a DATE function is not an integer. The result will " "be system-missing." msgstr "" "Un dels arguments per a funció DATE no és un enter. El resultat serà perdut " "del sistema." #: src/language/expressions/helpers.c:71 msgid "" "The week argument to DATE.WKYR is not an integer. The result will be system-" "missing." msgstr "" "L'argument de setmana per DATE.WKYR no és un enter. El resultat serà perdut " "pel sistema." #: src/language/expressions/helpers.c:77 msgid "" "The week argument to DATE.WKYR is outside the acceptable range of 1 to 53. " "The result will be system-missing." msgstr "" "L'argument de setmana per DATE.WKYR és fora de l'interval acceptable entre 1 " "i 53. El resultat serà perdut pel sistema." #: src/language/expressions/helpers.c:99 msgid "" "The day argument to DATE.YRDAY is not an integer. The result will be system-" "missing." msgstr "" "L'argument de dia per DATE.YRDAY no és un enter. El resultat serà perdut " "pel sistema." #: src/language/expressions/helpers.c:105 msgid "" "The day argument to DATE.YRDAY is outside the acceptable range of 1 to 366. " "The result will be system-missing." msgstr "" "L'argument de dia per DATE.YRDAY és fora de l'interval acceptable entre 1 i " "366. El resultat serà perdut al sistema." #: src/language/expressions/helpers.c:127 msgid "" "The year argument to YRMODA is greater than 47516. The result will be " "system-missing." msgstr "" "L'argument d'any per YRMODA és més gran que 47516. El resultat será perdut " "al sistema." #: src/language/expressions/helpers.c:180 #, c-format msgid "" "Unrecognized date unit `%.*s'. Valid date units are `%s', `%s', `%s', `%s', " "`%s', `%s', `%s', and `%s'." msgstr "" "Unitat de data `%.*s' no reconeguda. Les unitats de dates vàlides són `%s', `" "%s', `%s', `%s', `%s', `%s', `%s', and `%s'." #: src/language/expressions/helpers.c:333 #, c-format msgid "Invalid DATESUM method. Valid choices are `%s' and `%s'." msgstr "Mètode DATESUM invàlid. Les opcions vàlides són `%s' i `%s'." #: src/language/expressions/parse.c:261 #, c-format msgid "" "Type mismatch: expression has %s type, but a numeric value is required here." msgstr "" "Incompatibilitat de tipus: l'expressió té tipus %s, però aquí es demana un " "valor numèric." #: src/language/expressions/parse.c:274 #, c-format msgid "" "Type mismatch: expression has %s type, but a string value is required here." msgstr "" "Incompatibilitat de tipus: l'expressió té tipus %s, però aquí es demana un " "valor de cadena." #: src/language/expressions/parse.c:436 #, c-format msgid "Type mismatch while applying %s operator: cannot convert %s to %s." msgstr "" "Incompatibilitat dels tipus mentre que s'aplica l'operador %s: no es pot " "convertir %s a %s." #: src/language/expressions/parse.c:650 msgid "" "Chaining relational operators (e.g. `a < b < c') will not produce the " "mathematically expected result. Use the AND logical operator to fix the " "problem (e.g. `a < b AND b < c'). If chaining is really intended, " "parentheses will disable this warning (e.g. `(a < b) < c'.)" msgstr "" "L'encadenament d'operadors relacionals (p.e. `a < b < c') no produirà el " "resultat esperat matemàticament. Utilitzeu l'operador lògic AND per " "solucionar el problema (p.e. `a < b AND b < c'). Si l'encadenament és " "realment intencionat, l'ús de parèntesis desactivarà aquesta alerta (p.e. " "`(a < b) < c'.)" #: src/language/expressions/parse.c:752 msgid "" "The exponentiation operator (`**') is left-associative, even though right-" "associative semantics are more useful. That is, `a**b**c' equals " "`(a**b)**c', not as `a**(b**c)'. To disable this warning, insert " "parentheses." msgstr "" "L'operador d'exponenciació (`**') apareix a l'esquerra, tot i que si apareix " "a la dreta és més útil. Es a dir, `a**b**c' és igual a `(a**b)**c', i no " "`a**(b**c)'. Per desactivar aquesta alerta, insereix uns parèntesis." #: src/language/expressions/parse.c:832 #, c-format msgid "Unknown system variable %s." msgstr "Variable de sistema desconeguda %s." #: src/language/expressions/parse.c:880 #, c-format msgid "Unknown identifier %s." msgstr "Identificador desconegut %s." #: src/language/expressions/parse.c:1102 #, c-format msgid "%s must have at least %d arguments in list." msgstr "%s ha de tenir com a mínim %d arguments a la llista." #: src/language/expressions/parse.c:1111 #, c-format msgid "%s must have an even number of arguments in list." msgstr "%s ha de tenir un nombre parell d'arguments a la llista." #: src/language/expressions/parse.c:1114 #, c-format msgid "%s must have multiple of %d arguments in list." msgstr "%s ha de tenir un múltiple de %d arguments a la llista." #: src/language/expressions/parse.c:1124 #, c-format msgid "%s function does not accept a minimum valid argument count." msgstr "la funció %s no accepta un mínim recompte d'arguments vàlids." #: src/language/expressions/parse.c:1133 #, c-format msgid "%s requires at least %d valid arguments in list." msgstr "%s requereix com a mínim %d arguments vàlids en la llista." #: src/language/expressions/parse.c:1139 #, c-format msgid "" "With %s, using minimum valid argument count of %d does not make sense when " "passing only %d arguments in list." msgstr "" "Amb %s, utilitzar el mínim recompte d'argument vàlid %d no té sentit quan es " "passen només %d arguments en la llista." #: src/language/expressions/parse.c:1193 #, c-format msgid "Type mismatch invoking %s as " msgstr "Incompatibilitats de tipus invocant %s com a" #: src/language/expressions/parse.c:1198 msgid "Function invocation " msgstr "Invocació de funció" #: src/language/expressions/parse.c:1200 msgid " does not match any known function. Candidates are:" msgstr "no coincideix amb cap funció coneguda. Els candidats són:" #: src/language/expressions/parse.c:1230 #, c-format msgid "No function or vector named %s." msgstr "Cap funció o vector anomenat %s." #: src/language/expressions/parse.c:1292 #, c-format msgid "%s is a PSPP extension." msgstr "%s és una extensió de PSPP." #: src/language/expressions/parse.c:1295 #, c-format msgid "%s is not available in this version of PSPP." msgstr "%s no és disponible a aquesta versió de PSPP." #: src/language/expressions/parse.c:1302 #, c-format msgid "%s may not appear after %s." msgstr "%s no pot aparèixer desprès de %s." #: src/libpspp/ext-array.c:66 msgid "failed to create temporary file" msgstr "error en crear l'arxiu temporal" #: src/libpspp/ext-array.c:106 msgid "seeking in temporary file" msgstr "cercant en l'arxiu temporal" #: src/libpspp/ext-array.c:125 msgid "reading temporary file" msgstr "llegint arxiu temporal" #: src/libpspp/ext-array.c:127 msgid "unexpected end of file reading temporary file" msgstr "final de fitxer inesperat en llegir l'arxiu temporal" #: src/libpspp/ext-array.c:147 msgid "writing to temporary file" msgstr "escrivint a un arxiu temporal" #: src/libpspp/i18n.c:1128 msgid "Arabic" msgstr "Aràbic" #: src/libpspp/i18n.c:1130 msgid "Armenian" msgstr "Armeni" #: src/libpspp/i18n.c:1131 msgid "Baltic" msgstr "Baltic" #: src/libpspp/i18n.c:1133 msgid "Celtic" msgstr "Celtic" #: src/libpspp/i18n.c:1134 msgid "Central European" msgstr "Centre Europeu" #: src/libpspp/i18n.c:1136 msgid "Chinese Simplified" msgstr "Xinès Simplificat" #: src/libpspp/i18n.c:1138 msgid "Chinese Traditional" msgstr "Xinès Tradicional" #: src/libpspp/i18n.c:1140 msgid "Croatian" msgstr "Croata" #: src/libpspp/i18n.c:1141 msgid "Cyrillic" msgstr "Ciril·lic" #: src/libpspp/i18n.c:1143 msgid "Cyrillic/Russian" msgstr "Ciril·lic/Rus" #: src/libpspp/i18n.c:1144 msgid "Cyrillic/Ukrainian" msgstr "Ciril·lic/Ucranià" #: src/libpspp/i18n.c:1146 msgid "Georgian" msgstr "Georgià" #: src/libpspp/i18n.c:1147 msgid "Greek" msgstr "Grec" #: src/libpspp/i18n.c:1148 msgid "Gujarati" msgstr "Gujarati" #: src/libpspp/i18n.c:1149 msgid "Gurmukhi" msgstr "Gurmukhi" #: src/libpspp/i18n.c:1150 msgid "Hebrew" msgstr "Hebreu" #: src/libpspp/i18n.c:1152 msgid "Hebrew Visual" msgstr "Hebreu Visual" #: src/libpspp/i18n.c:1153 msgid "Hindi" msgstr "Hindi" #: src/libpspp/i18n.c:1154 msgid "Icelandic" msgstr "Islandès" #: src/libpspp/i18n.c:1155 msgid "Japanese" msgstr "Japonès" #: src/libpspp/i18n.c:1157 msgid "Korean" msgstr "Coreà" #: src/libpspp/i18n.c:1159 msgid "Nordic" msgstr "Nórdic" #: src/libpspp/i18n.c:1160 msgid "Romanian" msgstr "Rumanès" #: src/libpspp/i18n.c:1162 msgid "South European" msgstr "Sud Europeu" #: src/libpspp/i18n.c:1163 msgid "Thai" msgstr "Tailandès" #: src/libpspp/i18n.c:1165 msgid "Turkish" msgstr "Turc" #: src/libpspp/i18n.c:1167 msgid "Vietnamese" msgstr "Vietnamita" #: src/libpspp/i18n.c:1169 msgid "Western European" msgstr "Europeu Occidental" #: src/libpspp/message.c:89 #, c-format msgid "%s: %s" msgstr "%s: %s" #: src/libpspp/message.c:113 msgid "error" msgstr "error" #: src/libpspp/message.c:115 msgid "warning" msgstr "avís" #: src/libpspp/message.c:118 msgid "note" msgstr "anotació" #: src/libpspp/message.c:327 #, c-format msgid "Notes (%d) exceed limit (%d). Suppressing further notes." msgstr "" "Les anotacions (%d) han superat el límit (%d). Es suprimeixen les " "posteriors." #: src/libpspp/message.c:335 #, c-format msgid "Warnings (%d) exceed limit (%d). Syntax processing will be halted." msgstr "" "Les alertes (%d) han superat el límit (%d). S'atura el processament de " "sintaxi." #: src/libpspp/message.c:338 #, c-format msgid "Errors (%d) exceed limit (%d). Syntax processing will be halted." msgstr "" "Els errors (%d) han superat el límit (%d). S'atura el processament de " "sintaxi." #: src/libpspp/zip-reader.c:202 #, fuzzy, c-format #| msgid "Corrupt file at 0x%llx: Expected %; got %" msgid "%s: corrupt archive at 0x%llx: expected %# but got %#" msgstr "Arxiu corrupte a 0x%llx: S'esparaba %; s'obte %" #: src/libpspp/zip-reader.c:329 src/libpspp/zip-reader.c:449 #, fuzzy, c-format #| msgid "%s: seek failed (%s)." msgid "%s: open failed (%s)" msgstr "%s: cerca fallida (%s)." #: src/libpspp/zip-reader.c:344 #, fuzzy, c-format #| msgid "Cannot find central directory" msgid "%s: cannot find central directory" msgstr "No es pot trobar el directori central" #: src/libpspp/zip-reader.c:353 src/libpspp/zip-reader.c:384 #: src/libpspp/zip-reader.c:468 #, fuzzy, c-format #| msgid "%s: seek failed (%s)." msgid "%s: seek failed (%s)" msgstr "%s: cerca fallida (%s)." #: src/libpspp/zip-reader.c:441 #, fuzzy, c-format #| msgid "%s: unknown option `%s'" msgid "%s: unknown member \"%s\"" msgstr "%s: opció desconeguda `%s'" #: src/libpspp/zip-reader.c:503 #, fuzzy, c-format #| msgid "" #| "Name mismatch in zip archive. Central directory says `%s'; local file " #| "header says `%s'" msgid "" "%s: name mismatch between central directory (%s) and local file header (%s)" msgstr "" "Nom incorrecte en arxiu zip. El directori central diu `%s'; l'encapçalament " "de l'arxiu local diu `%s'" #: src/libpspp/zip-reader.c:696 #, fuzzy, c-format #| msgid "Cannot initialize inflator: %s" msgid "%s: cannot initialize inflator (%s)" msgstr "No es pot inicialitzar el descompressor: %s" #: src/libpspp/zip-reader.c:751 #, fuzzy, c-format #| msgid "Error inflating: %s" msgid "%s: error inflating \"%s\" (%s)" msgstr "Error en descomprimir: %s" #: src/libpspp/zip-writer.c:97 utilities/pspp-convert.c:346 #, c-format msgid "%s: error opening output file" msgstr "%s: error obrint l'arxiu de resultats" #: src/libpspp/zip-writer.c:169 #, c-format msgid "%s: error seeking in output file" msgstr "%s: error cercant a l'arxiu de resultats" #: src/libpspp/zip-writer.c:210 msgid "error creating temporary file" msgstr "error creant arxiu temporal" #: src/libpspp/zip-writer.c:279 #, c-format msgid "%s: write failed" msgstr "%s: error en escriure" #. TRANSLATORS: This is a format string which, when presented to #. printf like functions, will create a pango markup string to #. display real number in scientific notation. #. #. In its untranslated form, it will display similar to "1.23 x 10^4". You #. can leave it untranslated if this is how scientific notation is usually #. presented in your language. #. #. Some locales (such as German) prefer the centered dot rather than the #. multiplication sign between the mantissa an exponent. In which #. case, you can change "#215;" to "#8901;" or other unicode code #. point as appropriate. #. #. The . in this string does not and should not be changed, since #. that is taken care of by the stdc library. #. #. For information on Pango markup, see #. http://developer.gnome.org/pango/stable/PangoMarkupFormat.html #. #. For tables of unicode code points, see http://unicode.org/charts #. #: src/math/chart-geometry.c:123 #, c-format msgid "%%.%dlf×10%d" msgstr "%%.%dlf×10%d" #: src/math/histogram.c:145 msgid "" "Not creating histogram because the data contains less than 2 distinct values" msgstr "" "No es crea l'histograma perquè les dades contenen menys de 2 valors " "diferents." #: src/math/percentiles.c:36 msgid "HAverage" msgstr "HAverage" #: src/math/percentiles.c:38 msgid "Rounded" msgstr "Arrodonit" #: src/math/percentiles.c:39 msgid "Empirical" msgstr "Empíric" #: src/math/percentiles.c:40 msgid "Empirical with averaging" msgstr "Empíric amb mitjanes" #: src/math/shapiro-wilk.c:84 msgid "" "One or more weight values are non-integer. Fractional parts will be ignored " "when calculating the Shapiro-Wilk statistic." msgstr "" #: src/output/ascii.c:340 #, c-format msgid "ascii: opening output file `%s'" msgstr "ascii: obrint l'arxiu de resultats `%s'" #: src/output/ascii.c:371 #, c-format msgid "%s: %s must be positive integer or `auto'" msgstr "%s: %s ha de ser enter positiu o `auto'" #: src/output/ascii.c:393 #, fuzzy, c-format #| msgid "" #| "ascii: page excluding margins and headers must be at least %d characters " #| "wide by %d lines long, but as configured is only %d characters by %d lines" msgid "" "ascii: page must be at least %d characters wide, but as configured is only " "%d characters" msgstr "" "ascii: excloent els marges i encapçalaments la pàgina ha de tenir com a " "mínim %d caràcters d'ample per %d línies de llarg, però tal com està " "configurada, només n'hi ha %d caràcters i %d línies" #: src/output/ascii.c:508 #, c-format msgid "See %s for a chart." msgstr "Veure %s per a gràfica." #: src/output/charts/piechart.c:54 msgid "*MISSING*" msgstr "*MISSING*" #: src/output/csv.c:100 src/output/html.c:117 src/output/journal.c:166 #: src/output/msglog.c:68 #, c-format msgid "error opening output file `%s'" msgstr "error obrint l'arxiu de resultats `%s'" #: src/output/driver.c:522 #, c-format msgid "%s is not a valid device type (the choices are `%s' and `%s')" msgstr "%s no és un tipus de dispositiu vàlid (les opcions son `%s' i `%s')" #: src/output/driver.c:536 #, c-format msgid "%s: unknown option `%s'" msgstr "%s: opció desconeguda `%s'" #: src/output/driver.c:553 #, c-format msgid "%s: output option missing `='" msgstr "%s: manca opció de resultat `='" #: src/output/driver.c:560 #, c-format msgid "%s: output option specified more than once" msgstr "%s: opció de resultat especificada més d'una vegada" #: src/output/html.c:129 msgid "PSPP Output" msgstr "Resultat de PSPP" #: src/output/html.c:266 msgid "No description" msgstr "Sense descripció" #: src/output/journal.c:69 #, c-format msgid "error writing output file `%s'" msgstr "error en escriure l'arxiu de resultats `%s'" #: src/output/measure.c:68 #, c-format msgid "`%s' is not a valid length." msgstr "`%s' no és una longitud vàlida." #: src/output/measure.c:96 #, c-format msgid "syntax error in paper size `%s'" msgstr "error de sintaxi en la mida de paper `%s'" #: src/output/measure.c:233 #, c-format msgid "unknown paper type `%.*s'" msgstr "tipus de paper desconegut `%.*s'" #: src/output/measure.c:251 #, c-format msgid "error opening input file `%s'" msgstr "error en obrir l'arxiu de dades `%s'" #: src/output/measure.c:279 #, c-format msgid "file `%s' does not state a paper size" msgstr "l'arxiu `%s' no indica una mida de paper" #: src/output/options.c:112 #, c-format msgid "%s: `%s' is `%s' but a Boolean value is required" msgstr "%s: `%s' és `%s', però es requereix un valor Booleà" #: src/output/options.c:187 #, c-format msgid "%s: `%s' is `%s' but one of the following is required: %s" msgstr "%s: `%s' és `%s', però es requereix un del sequents: %s " #: src/output/options.c:231 #, fuzzy, c-format #| msgid "%s: `%s' is `%s' but a nonnegative integer is required" msgid "%s: `%s' is `%s' but a non-negative integer is required" msgstr "%s: `%s' és `%s', però es requereix un enter no negatiu" #: src/output/options.c:235 #, c-format msgid "%s: `%s' is `%s' but a positive integer is required" msgstr "%s: `%s' és `%s', però es requereix un enter positiu" #: src/output/options.c:238 #, c-format msgid "%s: `%s' is `%s' but an integer is required" msgstr "%s: `%s' és `%s', però es requereix un enter" #: src/output/options.c:241 #, c-format msgid "%s: `%s' is `%s' but an integer greater than %d is required" msgstr "%s: `%s' és `%s', però es requereix un enter més gran que %d" #: src/output/options.c:246 #, c-format msgid "%s: `%s' is `%s' but an integer between %d and %d is required" msgstr "%s: `%s' és `%s', però es requereix un enter entre %d i %d" #: src/output/options.c:325 #, c-format msgid "%s: `%s' is `%s' but a file name that contains `#' is required." msgstr "%s: `%s' és `%s', però es requereix un nom d'arxiu que contingui `#'." #. TRANSLATORS: Do not translate this string. If the script of your language #. reads from right to left (eg Persian, Arabic, Hebrew etc), then replace #. this string with "output-direction-rtl". Otherwise either leave it #. untranslated or copy it verbatim. #: src/output/render.c:994 msgid "output-direction-ltr" msgstr "output-direction-ltr" #: src/output/text-item.c:44 msgid "Page Title" msgstr "" #: src/output/text-item.c:47 #, fuzzy #| msgid "Untitled" msgid "Title" msgstr "Sense titol" #: src/output/text-item.c:51 msgid "Log" msgstr "" #: src/output/text-item.c:54 msgid "Page Break" msgstr "" #: src/output/cairo.c:520 #, c-format msgid "`%s': bad font specification" msgstr "`%s': especificació de caràcter no vàlida" #: src/output/cairo.c:744 #, c-format msgid "" "The defined page is not wide enough to hold at least %d characters in the " "default font. In fact, there's only room for %d characters." msgstr "" "La pàgina definida no és prou ampla com per contenir al més d'almenys %d " "caracters en la font per defecte. De fet, només n'hi ha espai per %d " "caracters." #: src/output/cairo.c:752 #, c-format msgid "" "The defined page is not long enough to hold at least %d lines in the default " "font. In fact, there's only room for %d lines." msgstr "" "La pàgina definida no és prou llarga com per contenir almenys %d línies amb " "les fonts per defecte. De fet, només n'hi ha espai per %d línies." #: src/output/cairo.c:837 #, c-format msgid "error opening output file `%s': %s" msgstr "error obrint l'arxiu de resultats `%s': %s" #: src/output/cairo.c:892 #, c-format msgid "error drawing output for %s driver: %s" msgstr "error dibuixant resultats pel controlador %s: %s" #: src/output/cairo.c:2056 #, c-format msgid "error writing output file `%s': %s" msgstr "Error escribint l'arxiu de resultats `%s': %s." #: src/output/charts/np-plot-cairo.c:37 #, c-format msgid "Normal Q-Q Plot of %s" msgstr "Gràfica Normal Q-Q de %s" #: src/output/charts/np-plot-cairo.c:38 src/output/charts/np-plot-cairo.c:68 msgid "Observed Value" msgstr "Valor observat" #: src/output/charts/np-plot-cairo.c:39 msgid "Expected Normal" msgstr "Normal esperada" #: src/output/charts/np-plot-cairo.c:67 #, c-format msgid "Detrended Normal Q-Q Plot of %s" msgstr "Gràfica Normal Detrended Q-Q de %s" #: src/output/charts/np-plot-cairo.c:69 msgid "Dev from Normal" msgstr "Desviació de la Normal" #: src/output/charts/barchart-cairo.c:65 msgid "Bar Chart" msgstr "Gràfica de Barres" #: src/output/charts/plot-hist-cairo.c:43 #, c-format msgid "N = %.2f" msgstr "N = %.2f" #: src/output/charts/plot-hist-cairo.c:52 #, c-format msgid "Mean = %.1f" msgstr "Mitjana = %.1f" #: src/output/charts/plot-hist-cairo.c:61 #, c-format msgid "Std. Dev = %.2f" msgstr "Desv.Estd. = %2f" #: src/output/charts/plot-hist-cairo.c:110 msgid "HISTOGRAM" msgstr "HISTOGRAM" #: src/output/charts/roc-chart-cairo.c:36 src/ui/gui/roc.ui:24 msgid "ROC Curve" msgstr "Corba ROC" #: src/output/charts/scree-cairo.c:36 msgid "Scree Plot" msgstr "Grafic de Sedimentació" #: src/output/charts/scree-cairo.c:38 msgid "Eigenvalue" msgstr "Valor-propi" #: src/output/charts/spreadlevel-cairo.c:37 #, c-format msgid "Spread vs. Level Plot of %s" msgstr "Gràfic de Dispersió per nivell (Spread-Level) de %s" #: src/output/charts/spreadlevel-cairo.c:38 msgid "Level" msgstr "NIvell" #: src/output/charts/spreadlevel-cairo.c:39 msgid "Spread" msgstr "Dispersió" #: src/output/charts/scatterplot-cairo.c:57 #, c-format msgid "Scatterplot %s" msgstr "Gràfica %s" #: src/output/spv/spv-legacy-decoder.c:2222 msgid "Table lacks cell data." msgstr "" #: src/output/spv/spv-writer.c:68 #, fuzzy, c-format #| msgid "%s: write failed" msgid "%s: create failed" msgstr "%s: error en escriure" #: src/output/spv/spv-writer.c:89 #, fuzzy #| msgid "%s: error writing output file" msgid "I/O error writing SPV file" msgstr "%s: error escribint l'arxiu de resultats" #: src/output/spv/spv.c:693 #, fuzzy, c-format #| msgid "failed to create temporary file" msgid "%s: Failed to create XML parser" msgstr "error en crear l'arxiu temporal" #: src/output/spv/spv.c:718 #, c-format msgid "%s: document is not well-formed" msgstr "" #: src/output/spv/spv.c:726 #, c-format msgid "%s: root node is \"%s\" but \"%s\" was expected" msgstr "" #: src/ui/gui/psppire-acr.c:273 msgid "Add" msgstr "Afegir" #: src/ui/gui/psppire-acr.c:274 msgid "Edit" msgstr "_Editar" #: src/ui/gui/psppire-acr.c:275 msgid "Remove" msgstr "Eliminar" #: src/ui/gui/psppire-buttonbox.c:311 msgid "OK" msgstr "OK" #: src/ui/gui/psppire-buttonbox.c:319 msgid "Go To" msgstr "Anar a" #: src/ui/gui/psppire-buttonbox.c:327 msgid "Continue" msgstr "Continuar" #: src/ui/gui/psppire-buttonbox.c:339 src/ui/gui/psppire-import-assistant.c:759 msgid "Paste" msgstr "Enganxa" #: src/ui/gui/psppire-buttonbox.c:345 #: src/ui/gui/psppire-dialog-action-aggregate.c:216 #: src/ui/gui/psppire-data-window.c:496 src/ui/gui/psppire-data-window.c:624 #: src/ui/gui/psppire-output-window.c:353 #: src/ui/gui/psppire-syntax-window.c:594 src/ui/gui/psppire-window.c:445 #: src/ui/gui/psppire-window.c:628 msgid "Cancel" msgstr "Cancel·lar" #: src/ui/gui/psppire-buttonbox.c:351 msgid "Close" msgstr "Tancar" #: src/ui/gui/psppire-buttonbox.c:358 src/ui/gui/psppire-import-assistant.c:760 msgid "Reset" msgstr "Reiniciar" #: src/ui/gui/psppire-buttonbox.c:365 msgid "Help" msgstr "Ajuda" #: src/ui/gui/psppire-dialog-action-aggregate.c:213 msgid "Aggregate destination file" msgstr "Arxiu destinació de l'agregació" #: src/ui/gui/psppire-dialog-action-aggregate.c:217 #: src/ui/gui/psppire-data-window.c:493 src/ui/gui/psppire-data-window.c:497 #: src/ui/gui/psppire-output-window.c:354 #: src/ui/gui/psppire-syntax-window.c:595 src/ui/gui/psppire-window.c:449 #: src/ui/gui/aggregate.ui:565 msgid "Save" msgstr "Desar" #: src/ui/gui/psppire-dialog-action-aggregate.c:226 #: src/ui/gui/psppire-data-window.c:503 msgid "System Files (*.sav)" msgstr "Arxius de Sistema (*.sav)" #: src/ui/gui/psppire-dialog-action-aggregate.c:231 #: src/ui/gui/psppire-data-window.c:508 msgid "Compressed System Files (*.zsav)" msgstr "Arxius Comprimits de Sistema (*.zsav)" #: src/ui/gui/psppire-dialog-action-aggregate.c:236 #: src/ui/gui/psppire-data-window.c:513 src/ui/gui/psppire-window.c:652 msgid "Portable Files (*.por) " msgstr "Arxius Portables (*.por)" #: src/ui/gui/psppire-dialog-action-autorecode.c:337 #: src/ui/gui/psppire-dialog-action-recode.c:535 #: src/ui/gui/psppire-dialog-action-recode-different.c:288 msgid "New" msgstr "Nou" #: src/ui/gui/psppire-dialog-action-autorecode.c:351 #: src/ui/gui/psppire-dialog-action-recode.c:527 #: src/ui/gui/psppire-dialog-action-recode-different.c:301 msgid "Old" msgstr "Antic" #: src/ui/gui/psppire-dialog-action-comments.c:142 #, c-format msgid "Column Number: %d" msgstr "Número de columna: %d" #: src/ui/gui/psppire-dialog-action-crosstabs.c:71 msgid "Chisq" msgstr "Chisq" #: src/ui/gui/psppire-dialog-action-crosstabs.c:71 msgid "" "Pearson chi-square, likelihood ratio, Fisher’s exact test, continuity " "correction, linear-by-linear association." msgstr "" #: src/ui/gui/psppire-dialog-action-crosstabs.c:74 #: src/language/stats/crosstabs.q:1334 msgid "Phi" msgstr "Phi" #: src/ui/gui/psppire-dialog-action-crosstabs.c:75 msgid "CC" msgstr "CC" #: src/ui/gui/psppire-dialog-action-crosstabs.c:75 #, fuzzy #| msgid "Contingency Coefficient" msgid "Contingency coefficient" msgstr "Coeficient de Contingencia" #: src/ui/gui/psppire-dialog-action-crosstabs.c:77 msgid "UC" msgstr "UC" #: src/ui/gui/psppire-dialog-action-crosstabs.c:77 #, fuzzy #| msgid "Uncertainty Coefficient" msgid "Uncertainty coefficient" msgstr "Coeficient d'Incertessa" #: src/ui/gui/psppire-dialog-action-crosstabs.c:78 msgid "BTau" msgstr "BTau" #: src/ui/gui/psppire-dialog-action-crosstabs.c:78 #, fuzzy #| msgid "Kendall's tau-b" msgid "Kendall's Tau-b" msgstr "Tau-B de Kendall" #: src/ui/gui/psppire-dialog-action-crosstabs.c:79 msgid "CTau" msgstr "CTau" #: src/ui/gui/psppire-dialog-action-crosstabs.c:79 #, fuzzy #| msgid "Kendall's tau-c" msgid "Kendall's Tau-c" msgstr "Tau-C de Kendall" #: src/ui/gui/psppire-dialog-action-crosstabs.c:80 msgid "Risk" msgstr "Risc" #: src/ui/gui/psppire-dialog-action-crosstabs.c:80 #, fuzzy #| msgid "Risk estimate." msgid "Relative Risk estimate" msgstr "Estimador de Risc." #: src/ui/gui/psppire-dialog-action-crosstabs.c:81 #: src/language/stats/crosstabs.q:1338 msgid "Gamma" msgstr "Gamma" #: src/ui/gui/psppire-dialog-action-crosstabs.c:82 msgid "D" msgstr "D" #: src/ui/gui/psppire-dialog-action-crosstabs.c:82 #, fuzzy #| msgid "Somers' d" msgid "Somer's d" msgstr "D de Somers" #: src/ui/gui/psppire-dialog-action-crosstabs.c:83 #: src/language/stats/crosstabs.q:1344 msgid "Kappa" msgstr "Kappa" #: src/ui/gui/psppire-dialog-action-crosstabs.c:83 msgid "Cohen's Kappa" msgstr "" #: src/ui/gui/psppire-dialog-action-crosstabs.c:84 #: src/language/stats/crosstabs.q:1429 msgid "Eta" msgstr "Eta" #: src/ui/gui/psppire-dialog-action-crosstabs.c:85 msgid "Corr" msgstr "Corr." #: src/ui/gui/psppire-dialog-action-crosstabs.c:85 #, fuzzy #| msgid "Spearman Correlation" msgid "Spearman correlation, Pearson's r" msgstr "Correlació de Spearman" #: src/ui/gui/psppire-dialog-action-crosstabs.c:90 #, fuzzy #| msgid "Frequency" msgid "Frequency Count" msgstr "Freqüència" #: src/ui/gui/psppire-dialog-action-crosstabs.c:91 msgid "Row" msgstr "Fila" #: src/ui/gui/psppire-dialog-action-crosstabs.c:91 #, fuzzy #| msgid "Percent" msgid "Row percent" msgstr "Percentatge" #: src/ui/gui/psppire-dialog-action-crosstabs.c:92 msgid "Column" msgstr "Columna" #: src/ui/gui/psppire-dialog-action-crosstabs.c:92 #, fuzzy #| msgid "Cum Percent" msgid "Column percent" msgstr "Percentatge Acumulat" #: src/ui/gui/psppire-dialog-action-crosstabs.c:93 #, fuzzy #| msgid "Valid Percent" msgid "Total percent" msgstr "Percentatge Vàlid" #: src/ui/gui/psppire-dialog-action-crosstabs.c:94 #: src/language/stats/crosstabs.q:1266 msgid "Expected" msgstr "Esperat" #: src/ui/gui/psppire-dialog-action-crosstabs.c:94 #, fuzzy #| msgid "Expected Values:" msgid "Expected value" msgstr "Valors Esperats:" #: src/ui/gui/psppire-dialog-action-crosstabs.c:96 #: src/language/stats/crosstabs.q:1268 msgid "Std. Residual" msgstr "Residu Tipificat" #: src/ui/gui/psppire-dialog-action-crosstabs.c:96 #, fuzzy #| msgid "Std. Residual" msgid "Standardized Residual" msgstr "Residu Tipificat" #: src/ui/gui/psppire-dialog-action-crosstabs.c:97 msgid "Adjusted Std. Residual" msgstr "Residu Tipificat Ajustat" #: src/ui/gui/psppire-dialog-action-descriptives.c:45 msgid "Standard error" msgstr "Error Estàndard" #: src/ui/gui/psppire-dialog-action-descriptives.c:45 #, fuzzy #| msgid "Standard error of the mean" msgid "Standard error of mean" msgstr "Error estàndard en la mitjana" #: src/ui/gui/psppire-dialog-action-descriptives.c:47 #, fuzzy #| msgid "Standard error of the kurtosis" msgid "Kurtosis and standard error of kurtosis" msgstr "Error estàndard en la curtosi" #: src/ui/gui/psppire-dialog-action-descriptives.c:48 #, fuzzy #| msgid "Standard error of the skewness" msgid "Skewness and standard error of skewness" msgstr "Error estàndard de l'asimetria" #: src/ui/gui/psppire-dialog-action-factor.c:323 #, c-format msgid "_Eigenvalues over %4.2f times the mean eigenvalue" msgstr "_Valors-propis per sobre de %4.2f vegades el valor-propi mitjà" #: src/ui/gui/psppire-dialog-action-frequencies.c:44 msgid "Standard error of the mean" msgstr "Error estàndard en la mitjana" #: src/ui/gui/psppire-dialog-action-frequencies.c:47 msgid "Standard error of the skewness" msgstr "Error estàndard de l'asimetria" #: src/ui/gui/psppire-dialog-action-frequencies.c:51 msgid "Standard error of the kurtosis" msgstr "Error estàndard en la curtosi" #: src/ui/gui/psppire-dialog-action-oneway.c:175 #, c-format msgid "Contrast %d of %d" msgstr "Contrast %d de %d" #: src/ui/gui/psppire-dialog-action-paired.c:162 src/ui/gui/examine.ui:282 #: src/ui/gui/indep-samples.ui:334 src/ui/gui/t-test.ui:296 msgid "O_ptions..." msgstr "O_pcions..." #: src/ui/gui/psppire-dialog-action-paired.c:168 msgid "Paired Samples T Test" msgstr "Prova T per mostres Aparellades" #: src/ui/gui/psppire-dialog-action-recode-different.c:327 msgid "Recode into Different Variables" msgstr "Recodifica en variables Diferents" #: src/ui/gui/psppire-dialog-action-recode-different.c:330 msgid "Recode into Different Variables: Old and New Values " msgstr "Recodifica en variables Diferents: Antcs y Nous valors " #: src/ui/gui/psppire-dialog-action-recode-same.c:108 src/ui/gui/recode.ui:391 msgid "Recode into Same Variables" msgstr "Recodifica en les Mateixes variables" #: src/ui/gui/psppire-dialog-action-recode-same.c:114 msgid "Recode into Same Variables: Old and New Values" msgstr "Recodifica en les mateixes variables: Antics y Nous valors" #: src/ui/gui/psppire-dialog-action-regression.c:40 msgid "Coeff" msgstr "Coef." #: src/ui/gui/psppire-dialog-action-regression.c:40 msgid "Show the regression coefficients" msgstr "Veure els coeficients de correlació" #: src/ui/gui/psppire-dialog-action-regression.c:41 msgid "Conf. Interval" msgstr "Interval de Confiança" #: src/ui/gui/psppire-dialog-action-regression.c:41 msgid "Show the confidence interval for the regression coefficients" msgstr "Veure l'interval de confiança pels coeficients de regressió" #: src/ui/gui/psppire-dialog-action-regression.c:42 msgid "Show the correlation between observed and predicted values" msgstr "Veure la correlació entre els valors predits i observats" #: src/ui/gui/psppire-dialog-action-regression.c:43 msgid "Anova" msgstr "Anova" #: src/ui/gui/psppire-dialog-action-regression.c:43 msgid "Show the analysis of variance table" msgstr "Veure la taula d'anàlisi de la variancia" #: src/ui/gui/psppire-dialog-action-regression.c:44 msgid "Bcov" msgstr "Bcov" #: src/ui/gui/psppire-dialog-action-regression.c:44 msgid "Show the variance coefficient matrix" msgstr "Veure la matriu de coeficients de variancia" #: src/ui/gui/psppire-dialog-action-regression.c:45 #, fuzzy #| msgid "Total" msgid "Tol" msgstr "Total" #: src/ui/gui/psppire-dialog-action-regression.c:45 #, fuzzy #| msgid "Show the variance coefficient matrix" msgid "Show the variance inflation factor and its reciprocal" msgstr "Veure la matriu de coeficients de variancia" #: src/ui/gui/psppire-dialog-action-select.c:88 #, c-format msgid "Approximately %3d%% of all cases." msgstr "Aproximadament %3d%% de tots els casos." #: src/ui/gui/psppire-dialog-action-select.c:89 #, c-format msgid "Exactly %3d cases from the first %3d cases." msgstr "Exactament %3d casos dels primers %3d casos." #: src/ui/gui/psppire-dialog-action-select.c:236 #, c-format msgid "%d thru %d" msgstr "%d fisn a %d" #: src/ui/gui/psppire-dialog-action-two-sample.c:180 #: src/ui/gui/k-independent.ui:404 src/ui/gui/k-related.ui:197 msgid "Test Type" msgstr "Tipus de Test" #: src/ui/gui/psppire-dialog-action-two-sample.c:189 msgid "_Wilcoxon" msgstr "_Wilcoxon" #: src/ui/gui/psppire-dialog-action-two-sample.c:190 msgid "_Sign" msgstr "_Signe" #: src/ui/gui/psppire-dialog-action-two-sample.c:191 msgid "_McNemar" msgstr "_McNemar" #: src/ui/gui/psppire-dialog-action-two-sample.c:209 msgid "Two-Related-Samples Tests" msgstr "Prova de Dues mostres aparellades" #: src/ui/gui/psppire-dialog-action-weight.c:74 src/ui/gui/weight.ui:83 #: src/ui/gui/weight.ui:211 msgid "Do not weight cases" msgstr "No ponderar casos." #: src/ui/gui/psppire-dialog-action-weight.c:80 #, c-format msgid "Weight cases by %s" msgstr "Pondera casos per %s" #: src/ui/gui/psppire-dict.c:95 #, fuzzy #| msgid "Var%d" msgid "Var" msgstr "Var%d" #. TRANSLATORS: This string must be a valid variable name. That means: #. - The string must be at most 64 bytes (not characters) long. #. - The string may not contain whitespace. #. - The first character may not be '$' #. - The first character may not be a digit #. - The final character may not be '.' or '_' #. #: src/ui/gui/psppire-dict.c:385 #, c-format msgid "Var%04d" msgstr "Var%04d" #: src/ui/gui/psppire-dict.c:566 msgid "Duplicate variable name." msgstr "Nom de variable duplicat." #: src/ui/gui/psppire-dictview.c:617 msgid "Prefer variable labels" msgstr "Prefereixo les etiquetes de variable" #: src/ui/gui/psppire-dictview.c:631 msgid "Default sort order" msgstr "Ordenació per defecte" #: src/ui/gui/psppire-dictview.c:637 msgid "Unsorted (dictionary order)" msgstr "No ordenat (segons diccionari)" #: src/ui/gui/psppire-dictview.c:642 msgid "Sort by name" msgstr "Ordenat per nom" #: src/ui/gui/psppire-dictview.c:647 msgid "Sort by label" msgstr "Ordenat per etiqueta" #: src/ui/gui/psppire-means-layer.c:95 #, c-format msgid "Layer %d of %d" msgstr "Capa %d de %d" #: src/ui/gui/psppire-means-layer.c:169 msgid "Forward" msgstr "Endavant" #: src/ui/gui/psppire-means-layer.c:170 msgid "Back" msgstr "Enrrera" #: src/ui/gui/psppire-text-file.c:55 #, c-format msgid "Could not open `%s'" msgstr "No es pot obrir `%s'" #: src/ui/gui/psppire-text-file.c:71 #, c-format msgid "Error reading `%s': %s" msgstr "Error leyendo `%s': %s" #: src/ui/gui/psppire-text-file.c:74 #, c-format msgid "" "Failed to read `%s', because it contains a line over %d bytes long and " "therefore appears not to be a text file." msgstr "" "Error en llegir `%s', per què conté una linia per sobre dels %d bytes de " "llarg i, per tant, sembla que no és un arxiu de text." #: src/ui/gui/psppire-text-file.c:96 #, c-format msgid "`%s' is empty." msgstr "`%s' és buit." #: src/ui/gui/psppire-val-chooser.c:255 msgid "through" msgstr "fins a" #: src/ui/gui/psppire-val-chooser.c:288 msgid "_Value:" msgstr "_Valor:" #: src/ui/gui/psppire-val-chooser.c:289 msgid "_System Missing" msgstr "Perdut del _Sistema" #: src/ui/gui/psppire-val-chooser.c:290 msgid "System _or User Missing" msgstr "Perdut del sistema _o d'usuari" #: src/ui/gui/psppire-val-chooser.c:291 msgid "_Range:" msgstr "Inte_rval:" #: src/ui/gui/psppire-val-chooser.c:292 msgid "Range, _LOWEST thru value" msgstr "Interval, MENOR fins al va_lor" #: src/ui/gui/psppire-val-chooser.c:293 msgid "Range, value thru _HIGHEST" msgstr "Interval, valor fins al SUPERIOR" #: src/ui/gui/psppire-val-chooser.c:294 msgid "_All other values" msgstr "Tota la rest_a de valors" #: src/ui/gui/psppire-var-view.c:153 #, c-format msgid "Var%d" msgstr "Var%d" #: src/ui/source-init-opts.c:72 #, c-format msgid "Algorithm must be either `%s' or `%s'." msgstr "L'algoritme ha de ser o `%s' or `%s'." #: src/ui/source-init-opts.c:97 #, c-format msgid "Syntax must be either `%s' or `%s'." msgstr "La sintaxi ha de ser o `%s' or `%s'." #: src/ui/terminal/main.c:144 msgid "Error encountered while ERROR=STOP is effective." msgstr "Detectat un error mentre està actiu ERROR=STOP." #: src/ui/terminal/main.c:150 msgid "" "Stopping syntax file processing here to avoid a cascade of dependent command " "failures." msgstr "" "Aturant el processament de l'arxiu de sintaxi aquí per evitar una cascada " "d'errors derivats." #: src/ui/terminal/terminal-opts.c:147 #, c-format msgid "" "PSPP, a program for statistical analysis of sampled data.\n" "Usage: %s [OPTION]... FILE...\n" "\n" "Arguments to long options also apply to equivalent short options.\n" "\n" "Output options:\n" " -o, --output=FILE output to FILE, default format from FILE's name\n" " -O format=FORMAT override format for previous -o\n" " -O OPTION=VALUE set output option to customize previous -o\n" " -O device={terminal|listing} override device type for previous -o\n" " -e, --error-file=FILE append errors, warnings, and notes to FILE\n" " --no-output disable default output driver\n" "Supported output formats: %s\n" "\n" "Language options:\n" " -I, --include=DIR append DIR to search path\n" " -I-, --no-include clear search path\n" " -r, --no-statrc disable running rc file at startup\n" " -a, --algorithm={compatible|enhanced}\n" " set to `compatible' if you want output\n" " calculated from broken algorithms\n" " -x, --syntax={compatible|enhanced}\n" " set to `compatible' to disable PSPP extensions\n" " -b, --batch interpret syntax in batch mode\n" " -i, --interactive interpret syntax in interactive mode\n" " --syntax-encoding=ENCODING specify encoding for syntax files\n" " -s, --safer don't allow some unsafe operations\n" "Default search path: %s\n" "\n" "Informative output:\n" " -h, --help display this help and exit\n" " -V, --version output version information and exit\n" "\n" "Non-option arguments are interpreted as syntax files to execute.\n" msgstr "" "PSPP, un programa per l'anàlisi estadistic de dades mostrals.\n" "Ús: %s [OPTION]... FILE...\n" "\n" "Els arguments per a opcions llargues també s'apliquen a les opcions curtes " "equivalents.\n" "\n" "Opcions de Sortida:\n" " -o, --output=FILE sortida cap a FILE, amb format per defecte " "segons el nom de FILE\n" " -O format=FORMAT sobreescritura del format previ de -o\n" " -O OPTION=VALUE estableix opcions de sortida personalitzades per " "a -o\n" " -O device={terminal|listing} canvia el tipus de dispositivo per a -o\n" " -e, --error-file=FILE afegeix errors, alertes i notes a FILE\n" " --no-output desactiva el dispositiu de sortida per defecte\n" "Formats de sortida disponibles: %s\n" "\n" "Opcions de llenguatge:\n" " -I, --include=DIR afegeix DIR a la ruta de cerca\n" " -I-, --no-include netejar la ruta de cerca\n" " -r, --no-statrc desactiva arxiu rc executant-se a l'inici\n" " -a, --algorithm={compatible|enhanced}\n" " marcar com `compatible' si es prefereix la " "sortida\n" " calculada a partir d'algoritmes trencats\n" " -x, --syntax={compatible|enhanced}\n" " marcar com `compatible' per desactivar les " "extensions de PSPP\n" " -b, --batch interpretar la sintaxi en mode paquet\n" " -i, --interactive interpretar la sintaxi en mode interactiu\n" " --syntax-encoding=ENCODING specifica la codificació pels arxius de " "sintaxi\n" " -s, --safer no permet algunes operacions poc segures\n" "Ruta de cerca per defecte:%s\n" "\n" "Sortida Informativa:\n" " -h, --help mostra aquesta ajuda i surt\n" " -V, --version mostra informació sobre la versió i surt\n" "\n" "Els arguments sense opcions son interpretats com a arxius de sintaxis per " "executar.\n" #: src/ui/gui/find-dialog.c:197 msgid "Find" msgstr "Cerca" #: src/ui/gui/find-dialog.c:662 #, c-format msgid "Bad regular expression: %s" msgstr "Expressió regular incorrecta: %s" #: src/ui/gui/help-menu.c:70 msgid "A program for the analysis of sampled data" msgstr "Un programa per a l'anàlisi de dades de mostreig" #. TRANSLATORS: Do not translate this string. Instead, put the names of the people #. who have helped in the translation. #: src/ui/gui/help-menu.c:80 msgid "translator-credits" msgstr "F.J. Miguel, J. Gómez, P. Payà" #: src/ui/gui/help-menu.c:170 #, c-format msgid "Help path conversion error: %s" msgstr "Error de conversió de la ruta d'ajut: %s" #: src/ui/gui/help-menu.c:197 #, fuzzy, c-format #| msgid "" #| "Cannot open reference manual via yelp: %s. Cannot open via html: %s with " #| "uri: %s The PSSP manual is also available at %s" msgid "" "Cannot open via html: %s with uri: %s The PSSP manual is also available at %s" msgstr "" "No es pot obrir el manual de referència utilitzant yelp: %s. Co es pot obrir " "utilitzant html: %s amb uri: %s. El manual d'usuari de PSPP es troba tambè " "disponible a %s" #: src/ui/gui/help-menu.c:218 msgid "_Help" msgstr "Ajut" #: src/ui/gui/help-menu.c:221 msgid "_About" msgstr "Qu_ant a..." #: src/ui/gui/help-menu.c:222 msgid "_Reference Manual" msgstr "Manual de _Referencia" #: src/ui/gui/main.c:306 msgid "Show version information and exit" msgstr "Mostrar informació de la versió i tancar." #: src/ui/gui/main.c:409 msgid "Do not display the splash screen" msgstr "No mostrar la pantalla de benvinguda" #: src/ui/gui/main.c:411 msgid "Do not attempt single instance negotiation" msgstr "No provar de fer negociació d'instància única" #: src/ui/gui/missing-val-dialog.c:217 msgid "" "The maximum length of a missing value for a string variable is 8 in UTF-8." msgstr "" "La llargada maxima d'un valor perdut per a una variable alfanumerica es 8 a " "UTF-8." #: src/ui/gui/missing-val-dialog.c:268 msgid "At least one value must be specified" msgstr "Al menys un valor ha de ser especificat." #: src/ui/gui/missing-val-dialog.c:298 msgid "Incorrect range specification" msgstr "Especificació d'interval incorrecte" #: src/ui/gui/psppire-data-editor.c:380 #, fuzzy, c-format #| msgid "%s: %s" msgid "%d : %s" msgstr "%s: %s" #: src/ui/gui/psppire-data-editor.c:391 #, c-format msgid "%'d case" msgid_plural "%'d cases" msgstr[0] "%'d cas" msgstr[1] "%'d casos" #: src/ui/gui/psppire-data-editor.c:396 #, c-format msgid "%'d variable" msgid_plural "%'d variables" msgstr[0] "Variable %'d" msgstr[1] "Variables %'d" #: src/ui/gui/psppire-data-editor.c:485 msgid "Case" msgstr "Cas" #: src/ui/gui/psppire-data-editor.c:495 msgid "Data View" msgstr "Vista de dades" #: src/ui/gui/psppire-data-editor.c:505 msgid "Variable View" msgstr "Vista de Variables" #: src/ui/gui/psppire-data-sheet.c:171 src/ui/gui/psppire-data-window.c:1338 msgid "_Insert Case" msgstr "_Inserir Cas" #: src/ui/gui/psppire-data-sheet.c:179 src/ui/gui/psppire-data-window.c:1391 msgid "Cl_ear Cases" msgstr "Eliminar _Casos" #: src/ui/gui/psppire-data-sheet.c:305 src/ui/gui/psppire-data-window.c:1337 #: src/ui/gui/psppire-variable-sheet.c:274 msgid "_Insert Variable" msgstr "_Inserir Variable" #: src/ui/gui/psppire-data-sheet.c:314 src/ui/gui/psppire-variable-sheet.c:283 msgid "Cl_ear Variables" msgstr "_Eliminar Variables:" #: src/ui/gui/psppire-data-sheet.c:326 msgid "Sort _Ascending" msgstr "Ordenació _Ascendent" #: src/ui/gui/psppire-data-sheet.c:333 msgid "Sort _Descending" msgstr "Ordenació _Descendent" #: src/ui/gui/psppire-data-window.c:175 msgid "Transformations Pending" msgstr "Transformacions pendents" #: src/ui/gui/psppire-data-window.c:191 msgid "Filter off" msgstr "Filtre desactivat" #: src/ui/gui/psppire-data-window.c:203 #, c-format msgid "Filter by %s" msgstr "Filtrat per %s" #: src/ui/gui/psppire-data-window.c:224 msgid "No Split" msgstr "No dividit" #: src/ui/gui/psppire-data-window.c:233 msgid "Split by " msgstr "Dividit per " #: src/ui/gui/psppire-data-window.c:261 msgid "Weights off" msgstr "Sense Ponderar:" #: src/ui/gui/psppire-data-window.c:273 #, c-format msgid "Weight by %s" msgstr "Ponderat per %s" #: src/ui/gui/psppire-data-window.c:518 #: src/ui/gui/psppire-import-assistant.c:681 #: src/ui/gui/psppire-syntax-window.c:607 src/ui/gui/psppire-window.c:669 msgid "All Files" msgstr "Tots els arxius" #: src/ui/gui/psppire-data-window.c:535 msgid "System File" msgstr "Arxiu de Sistema" #: src/ui/gui/psppire-data-window.c:542 msgid "Compressed System File" msgstr "Arxiu Comprimit de Sistema" #: src/ui/gui/psppire-data-window.c:548 msgid "Portable File" msgstr "Arxiu Portable" #: src/ui/gui/psppire-data-window.c:551 msgid "Format:" msgstr "Format:" #: src/ui/gui/psppire-data-window.c:615 msgid "Delete Existing Dataset?" msgstr "Eliminar arxiu de dades existent?" #: src/ui/gui/psppire-data-window.c:619 #, c-format msgid "" "Renaming \"%s\" to \"%s\" will destroy the existing dataset named \"%s\". " "Are you sure that you want to do this?" msgstr "" "Re-anomenar \"%s\" com a \"%s\" eliminarà les dades existents anomenades \"%s" "\". Segur que vol fer aixó?" #: src/ui/gui/psppire-data-window.c:625 msgid "Delete" msgstr "Elimina" #: src/ui/gui/psppire-data-window.c:647 #, c-format msgid "Please enter a new name for dataset \"%s\":" msgstr "Si us plau, introdueixi un nou nom per l'arxiu de dades \"%s\":" #: src/ui/gui/psppire-data-window.c:649 msgid "Rename Dataset" msgstr "Reanomena l'Arxiu de dades" #: src/ui/gui/psppire-data-window.c:1199 src/ui/gui/output-window.ui:68 #: src/ui/gui/syntax-editor.ui:22 msgid "_File" msgstr "_Arxiu" #: src/ui/gui/psppire-data-window.c:1203 src/ui/gui/syntax-editor.ui:25 msgid "_New" msgstr "_Nou" #: src/ui/gui/psppire-data-window.c:1210 msgid "_Syntax" msgstr "_Sintaxi" #: src/ui/gui/psppire-data-window.c:1213 src/ui/gui/data-editor.ui:177 #: src/ui/gui/data-editor.ui:189 msgid "_Data" msgstr "_Dades" #: src/ui/gui/psppire-data-window.c:1220 src/ui/gui/syntax-editor.ui:36 msgid "_Open" msgstr "_Obert" #: src/ui/gui/psppire-data-window.c:1223 msgid "_Import Data..." msgstr "_Importar Dades..." #: src/ui/gui/psppire-data-window.c:1231 src/ui/gui/logistic.ui:261 #: src/ui/gui/regression.ui:66 msgid "_Save..." msgstr "De_sar..." #: src/ui/gui/psppire-data-window.c:1234 msgid "Save _As..." msgstr "Desar Com _A..." #: src/ui/gui/psppire-data-window.c:1237 msgid "_Rename Dataset..." msgstr "_Reanomenar l'arxiu de dades..." #: src/ui/gui/psppire-data-window.c:1248 msgid "_Display Data File Information" msgstr "Mostrar informació de l'Arxiu de _Dades" #: src/ui/gui/psppire-data-window.c:1255 msgid "Working File" msgstr "Arxius de treball" #: src/ui/gui/psppire-data-window.c:1257 msgid "_External File..." msgstr "Arxiu _Extern..." #: src/ui/gui/psppire-data-window.c:1267 msgid "_Recently Used Data" msgstr "Dades usades _Recentment" #: src/ui/gui/psppire-data-window.c:1268 msgid "Recently Used _Files" msgstr "Arxius utilitzats recentment" #: src/ui/gui/psppire-data-window.c:1315 src/ui/gui/output-window.ui:82 #: src/ui/gui/syntax-editor.ui:59 msgid "_Quit" msgstr "Sortir" #: src/ui/gui/psppire-data-window.c:1333 src/ui/gui/output-window.ui:89 #: src/ui/gui/syntax-editor.ui:66 msgid "_Edit" msgstr "_Editar" #: src/ui/gui/psppire-data-window.c:1339 msgid "_Go To Variable..." msgstr "Anar a la Variable..." #: src/ui/gui/psppire-data-window.c:1340 msgid "_Go To Case..." msgstr "Anar al Cas..." #: src/ui/gui/psppire-data-window.c:1364 src/ui/gui/syntax-editor.ui:69 msgid "Cu_t" msgstr "Re_talla" #: src/ui/gui/psppire-data-window.c:1373 src/ui/gui/output-window.ui:96 #: src/ui/gui/syntax-editor.ui:74 msgid "_Copy" msgstr "_Copia" #: src/ui/gui/psppire-data-window.c:1380 src/ui/gui/syntax-editor.ui:79 msgid "_Paste" msgstr "Enganxa" #: src/ui/gui/psppire-data-window.c:1387 msgid "Clear _Variables" msgstr "Eliminar _Variables" #: src/ui/gui/psppire-data-window.c:1401 msgid "_Find..." msgstr "Cercar..." #: src/ui/gui/psppire-data-window.c:1407 src/ui/gui/logistic.ui:246 msgid "_Options..." msgstr "_Opcions..." #: src/ui/gui/psppire-data-window.c:1676 msgid "Jump to variable" msgstr "Anar a la variable" #: src/ui/gui/psppire-data-window.c:1689 msgid "Jump to a case in the data sheet" msgstr "Anar a un cas a la matriu de Dades" #: src/ui/gui/psppire-data-window.c:1703 msgid "Search for values in the data" msgstr "Cerca valors dins les dades" #: src/ui/gui/psppire-data-window.c:1715 msgid "Create a new case at the current position" msgstr "Crear un nou cas a la posició actual" #: src/ui/gui/psppire-data-window.c:1727 msgid "Create a new variable at the current position" msgstr "Crear una nova variable a la posició seleccionada" #: src/ui/gui/psppire-data-window.c:1741 msgid "Split the active dataset" msgstr "Dividir l'arxiu de dades actiu" #: src/ui/gui/psppire-data-window.c:1753 msgid "Weight cases by variable" msgstr "Pondera casos per la variable" #: src/ui/gui/psppire-data-window.c:1764 msgid "Show/hide value labels" msgstr "Mostra/Oculta etiquetes de valor" #: src/ui/gui/psppire-data-window.c:1904 msgid "Data Editor" msgstr "Editor de Dades" #: src/ui/gui/psppire-encoding-selector.c:140 msgid "Automatically Detect" msgstr "Detecció Automàtica" #: src/ui/gui/psppire-encoding-selector.c:147 msgid "Locale Encoding" msgstr "Codificació Local" #: src/ui/gui/psppire-encoding-selector.c:177 msgid "Character Encoding: " msgstr "Codificació de caràcters: " #: src/ui/gui/psppire-import-assistant.c:337 msgid "line" msgstr "" #: src/ui/gui/psppire-import-assistant.c:347 msgid "var" msgstr "var" #: src/ui/gui/psppire-import-assistant.c:560 msgid "Importing Spreadsheet Data" msgstr "Important dades de full de càlcul" #: src/ui/gui/psppire-import-assistant.c:686 msgid "Text Files" msgstr "Arxius de text" #: src/ui/gui/psppire-import-assistant.c:691 msgid "Text (*.txt) Files" msgstr "Arxius de Text (*.txt)" #: src/ui/gui/psppire-import-assistant.c:697 msgid "Plain Text (ASCII) Files" msgstr "Arxius de Text Pla (ASCII)" #: src/ui/gui/psppire-import-assistant.c:702 msgid "Comma Separated Value Files" msgstr "Arxius de Valors Separats per Comes" #: src/ui/gui/psppire-import-assistant.c:709 msgid "Tab Separated Value Files" msgstr "Arxius de Valors Separats per Tabuladors" #: src/ui/gui/psppire-import-assistant.c:714 msgid "Gnumeric Spreadsheet Files" msgstr "Arxius de full de càlcul Gnumeric" #: src/ui/gui/psppire-import-assistant.c:719 msgid "OpenDocument Spreadsheet Files" msgstr "Arxius de full de càlcul OpenDocument" #: src/ui/gui/psppire-import-assistant.c:724 msgid "All Spreadsheet Files" msgstr "Tots els arxius de full de càlcul" #: src/ui/gui/psppire-import-assistant.c:733 msgid "Select File to Import" msgstr "Selecionar Arxiu per a Importar" #: src/ui/gui/psppire-import-assistant.c:770 msgid "Importing Delimited Text Data" msgstr "Important dades de text deliminatat" #: src/ui/gui/psppire-import-assistant.c:865 msgid "Select the First Line" msgstr "Seleccionar la Primera Línia" #: src/ui/gui/psppire-import-assistant.c:877 msgid "Line" msgstr "Linia" #: src/ui/gui/psppire-import-assistant.c:931 msgid "" "This assistant will guide you through the process of importing data into " "PSPP from a text file with one line per case, in which fields are separated " "by tabs, commas, or other delimiters.\n" "\n" msgstr "" "Aquest asistent t'acompanyarà per tot el procés d'importar dades cap al PSPP " "a partir d'un arxiu de text amb una linia per cas, al qual els camps estan " "separats per tabuladors, comes, o altres delimitadors.\n" "\n" #: src/ui/gui/psppire-import-assistant.c:941 #, c-format msgid "The selected file contains %'lu line of text. " msgid_plural "The selected file contains %'lu lines of text. " msgstr[0] "L'arxiu seleccionat conté %'lu línia de text. " msgstr[1] "L'arxiu seleccionat conté %'lu línies de text. " #: src/ui/gui/psppire-import-assistant.c:950 #, c-format msgid "The selected file contains approximately %'lu line of text. " msgid_plural "The selected file contains approximately %'lu lines of text. " msgstr[0] "L'arxiu seleccionat conté aproximadament %'lu línia de text. " msgstr[1] "L'arxiu seleccionat conté aproximadament %'lu línies de text. " #: src/ui/gui/psppire-import-assistant.c:956 #, c-format msgid "" "Only the first %zu line of the file will be shown for preview purposes in " "the following screens. " msgid_plural "" "Only the first %zu lines of the file will be shown for preview purposes in " "the following screens. " msgstr[0] "" "Només les primeres %zu linies de l'arxiu es previsualitzaran a les seguents " "pantalles. " msgstr[1] "" "Només les primeres %zu linies de l'arxiu es previsualitzaran a les seguents " "pantalles. " #: src/ui/gui/psppire-import-assistant.c:965 msgid "You may choose below how much of the file should actually be imported." msgstr "Pots triar a continuació quina part de l'arxiu ha de ser importat." #: src/ui/gui/psppire-import-assistant.c:974 #, c-format msgid "Only the first %4d cases" msgstr "Només els primers %4d casos" #: src/ui/gui/psppire-import-assistant.c:985 #, c-format msgid "Only the first %3d %% of file (approximately)" msgstr "Només els primers %3ds %% de l'arxiu (aproximadament)" #: src/ui/gui/psppire-import-assistant.c:1009 msgid "Select the Lines to Import" msgstr "Selecionar les Línies a Importar" #: src/ui/gui/psppire-import-assistant.c:1151 msgid "Choose Separators" msgstr "Triar els separadors" #: src/ui/gui/psppire-import-assistant.c:1438 msgid "Adjust Variable Formats" msgstr "Ajustar formats de variables" #: src/ui/gui/psppire-output-view.c:410 msgid "Message" msgstr "Missatje" #: src/ui/gui/psppire-output-view.c:543 msgid "failed to create temporary directory during clipboard operation" msgstr "error en crear el directori temporal en una operació de porta-papers" #: src/ui/gui/psppire-output-window.c:241 msgid "Infer file type from extension" msgstr "Inferir tipus d'arxiu a partir de l'extensió" #: src/ui/gui/psppire-output-window.c:242 msgid "SPSS Viewer (*.spv)" msgstr "" #: src/ui/gui/psppire-output-window.c:243 msgid "PDF (*.pdf)" msgstr "PDF (*.pdf)" #: src/ui/gui/psppire-output-window.c:244 msgid "HTML (*.html)" msgstr "HTML (*.html)" #: src/ui/gui/psppire-output-window.c:245 msgid "OpenDocument (*.odt)" msgstr "OpenDocument (*.odt)" #: src/ui/gui/psppire-output-window.c:246 msgid "Text (*.txt)" msgstr "Text (*.txt)" #: src/ui/gui/psppire-output-window.c:247 msgid "Text [plain] (*.txt)" msgstr "Text [pla] (*.txt)" #: src/ui/gui/psppire-output-window.c:248 msgid "PostScript (*.ps)" msgstr "PostScript (*.ps)" #: src/ui/gui/psppire-output-window.c:249 msgid "Comma-Separated Values (*.csv)" msgstr "Valors Separats per Comes (*.csv)" #: src/ui/gui/psppire-output-window.c:350 msgid "Export Output" msgstr "Exporta Resultats" #: src/ui/gui/psppire-output-window.c:548 msgid "Output Viewer" msgstr "Vista de resultats" #: src/ui/gui/psppire-spreadsheet-model.c:237 msgid "(empty)" msgstr "(buit)" #: src/ui/gui/psppire-syntax-window.c:226 msgid "Text Search" msgstr "" #: src/ui/gui/psppire-syntax-window.c:229 #, fuzzy #| msgid "OK" msgid "_OK" msgstr "OK" #: src/ui/gui/psppire-syntax-window.c:231 #, fuzzy #| msgid "Cancel" msgid "_Cancel" msgstr "Cancel·lar" #: src/ui/gui/psppire-syntax-window.c:239 msgid "Text to search for:" msgstr "" #: src/ui/gui/psppire-syntax-window.c:570 #, c-format msgid "Saved file `%s'" msgstr "Desat com a arxiu `%s'" #: src/ui/gui/psppire-syntax-window.c:591 msgid "Save Syntax" msgstr "Desar sintaxi" #: src/ui/gui/psppire-syntax-window.c:601 src/ui/gui/psppire-window.c:657 msgid "Syntax Files (*.sps) " msgstr "Arxius de Sintàxi (*.sps) " #: src/ui/gui/psppire-syntax-window.c:970 msgid "Syntax Editor" msgstr "Editor de sintaxi" #: src/ui/gui/psppire-syntax-window.c:990 #, c-format msgid "Cannot load syntax file `%s'" msgstr "No es pot obrir l'arxiu de sintaxi `%s'" #: src/ui/gui/psppire-variable-sheet.c:412 #, c-format msgid "{%s, %s}..." msgstr "{%s, %s}..." #: src/ui/gui/psppire-var-sheet-header.c:64 #, fuzzy #| msgid "Decimals" msgid "Decimal" msgstr "Decimals" #: src/ui/gui/psppire-var-sheet-header.c:79 msgid "Align" msgstr "Aliniament" #: src/ui/gui/psppire-var-sheet-header.c:82 msgid "Measure" msgstr "Mesura" #: src/ui/gui/psppire-window.c:430 #, c-format msgid "Save the changes to `%s' before closing?" msgstr "Desa el canvis a `%s' abans de sortir?" #: src/ui/gui/psppire-window.c:437 #, c-format msgid "" "If you don't save, changes from the last %ld seconds will be permanently " "lost." msgstr "" "Si no es desa, els canvis dels darrers %ld segons es perdran permanentment." #: src/ui/gui/psppire-window.c:441 msgid "Close _without saving" msgstr "Tancar sense desar" #: src/ui/gui/psppire-window.c:625 src/ui/gui/psppire-window.c:629 msgid "Open" msgstr "Obert" #: src/ui/gui/psppire-window.c:634 msgid "Data and Syntax Files" msgstr "Arxius de Dades i Sintaxi" #: src/ui/gui/psppire-window.c:646 msgid "System Files (*.sav, *.zsav)" msgstr "Arxius de Sistema (*.sav, *.zsav)" #: src/ui/gui/psppire-window.c:663 #, fuzzy #| msgid "Syntax Files (*.sps) " msgid "Output Files (*.spv) " msgstr "Arxius de Sintàxi (*.sps) " #: src/ui/gui/t-test-options.c:65 #, c-format msgid "Con_fidence Interval: %2d %%" msgstr "Interval de Con_fiança: %2d %%" #: src/ui/gui/val-labs-dialog.c:591 #, c-format msgid "%s = `%s'" msgstr "%s = `%s'" #: src/ui/gui/var-type-dialog.c:541 #, fuzzy #| msgid "Compute Variable: Type and Label" msgid "Variable Type and Format" msgstr "Calcular Variable: Tipus i Etiqueta" #: src/ui/gui/windows-menu.c:92 msgid "_Minimize all Windows" msgstr "_Minimitza totes les finestres" #: src/ui/gui/windows-menu.c:100 msgid "_Split" msgstr "Divideix" #: src/ui/gui/windows-menu.c:132 msgid "_Windows" msgstr "Finestres" #: utilities/pspp-convert.c:67 #, c-format msgid "%s argument must be a single character" msgstr "" #: utilities/pspp-convert.c:265 msgid "exactly two non-option arguments are required; use --help for help" msgstr "" "son requerits exactament dos arguments sense opció; consultar --help per " "ajuda" #: utilities/pspp-convert.c:276 #, c-format msgid "%s: cannot guess output format (use -O option)" msgstr "" "%s: no s'ha pogut determinar el format de sortida (utilitzeu l'opció -O)" #: utilities/pspp-convert.c:341 #, c-format msgid "%s: unknown output format (use -O option)" msgstr "%s: format de sortida desconegut (utilitzeu l'opció -O)" #: utilities/pspp-convert.c:360 #, c-format msgid "%s: error reading input file" msgstr "%s: error llegint l'arxiu d'entrada" #: utilities/pspp-convert.c:362 #, c-format msgid "%s: error writing output file" msgstr "%s: error escribint l'arxiu de resultats" #: utilities/pspp-convert.c:409 #, fuzzy, c-format #| msgid "%s: error opening output file" msgid "%s: error opening password file" msgstr "%s: error obrint l'arxiu de resultats" #: utilities/pspp-convert.c:425 #, fuzzy, c-format #| msgid "%s: error reading input file" msgid "" "\n" "%s: password not in file" msgstr "%s: error llegint l'arxiu d'entrada" #: utilities/pspp-convert.c:462 #, fuzzy, c-format #| msgid "`%c' is not a valid hex digit" msgid "%s: '%c' is not in alphabet" msgstr "'%c' no és un dígit hexadecimal vàlid." #: utilities/pspp-convert.c:526 msgid "sorry, wrong password" msgstr "Sap greu, la contrasenya és invàlida" #: utilities/pspp-output.c:92 #, c-format msgid "%s and %s:" msgstr "" #: utilities/pspp-output.c:547 #, fuzzy, c-format #| msgid "in expression" msgid "%s: invalid XPath expression" msgstr "en l'expressió" #: utilities/pspp-output.c:716 msgid "missing command name (use --help for help)" msgstr "" #: utilities/pspp-output.c:720 #, c-format msgid "unknown command \"%s\" (use --help for help)" msgstr "" #: utilities/pspp-output.c:728 #, c-format msgid "\"%s\" command takes exactly %d argument" msgid_plural "\"%s\" command takes exactly %d arguments" msgstr[0] "" msgstr[1] "" #: utilities/pspp-output.c:735 #, fuzzy, c-format #| msgid "%s requires at least %d valid arguments in list." msgid "\"%s\" command requires at least %d argument" msgid_plural "\"%s\" command requires at least %d arguments" msgstr[0] "%s requereix com a mínim %d arguments vàlids en la llista." msgstr[1] "%s requereix com a mínim %d arguments vàlids en la llista." #: utilities/pspp-output.c:742 #, fuzzy, c-format #| msgid "%s requires at least %d valid arguments in list." msgid "\"%s\" command requires between %d and %d arguments" msgstr "%s requereix com a mínim %d arguments vàlids en la llista." #: utilities/pspp-output.c:782 msgid "The following object classes are supported:" msgstr "" #: utilities/pspp-output.c:791 #, c-format msgid "%s: unknown object class (use --select=help for help" msgstr "" #: src/language/utilities/set.q:162 #, c-format msgid "%s must be between 0 and 20." msgstr "%s ha d'estar entre 0 i 20." #: src/language/utilities/set.q:172 src/language/utilities/set.q:179 #, c-format msgid "%s must be at least 1." msgstr "%s ha de ser com a mínim 1." #: src/language/utilities/set.q:205 #, c-format msgid "%s must be at least 1MB" msgstr "%s ha de ser com a mínim 1MB" #: src/language/utilities/set.q:207 #, c-format msgid "%s must be positive" msgstr "%s ha de ser positiu" #: src/language/utilities/set.q:213 src/language/utilities/set.q:215 #: src/language/utilities/set.q:217 src/language/utilities/set.q:219 #: src/language/utilities/set.q:221 src/language/utilities/set.q:223 #: src/language/utilities/set.q:225 src/language/utilities/set.q:227 #: src/language/utilities/set.q:229 src/language/utilities/set.q:231 #: src/language/utilities/set.q:233 #, c-format msgid "%s is obsolete." msgstr "%s és obsolet." #: src/language/utilities/set.q:239 msgid "Active file compression is not implemented." msgstr "La compressió d'arxius no està implementada." #: src/language/utilities/set.q:403 #, c-format msgid "%s must be 1500 or later." msgstr "%s ha de ser 1500 o més tard." #: src/language/utilities/set.q:410 #, c-format msgid "expecting %s or year" msgstr "s'espera %s o un any" #: src/language/utilities/set.q:438 src/language/utilities/set.q:535 #, c-format msgid "%s must be at least %d." msgstr "%s ha de ser com a mínim %d." #: src/language/utilities/set.q:474 #, c-format msgid "%s is not a recognized encoding or locale name" msgstr "%s no és una codificació o un nom local reconegut" #: src/language/utilities/set.q:562 #, c-format msgid "" "%s requires numeric output format as an argument. Specified format %s is of " "type string." msgstr "" "%s requereix format de resultat numeric com a argument. El format %s " "especificat es de tipus cadena textual." #: src/language/utilities/set.q:791 msgid "ISL (32-bit IEEE 754 single, little-endian)" msgstr "ISL (32-bit IEEE 754 single, little-endian)" #: src/language/utilities/set.q:794 msgid "ISB (32-bit IEEE 754 single, big-endian)" msgstr "ISB (32-bit IEEE 754 single, big-endian)" #: src/language/utilities/set.q:797 msgid "IDL (64-bit IEEE 754 double, little-endian)" msgstr "IDL (64-bit IEEE 754 double, little-endian)" #: src/language/utilities/set.q:800 msgid "IDB (64-bit IEEE 754 double, big-endian)" msgstr "IDB (64-bit IEEE 754 double, big-endian)" #: src/language/utilities/set.q:804 msgid "VF (32-bit VAX F, VAX-endian)" msgstr "VF (32-bit VAX F, VAX-endian)" #: src/language/utilities/set.q:807 msgid "VD (64-bit VAX D, VAX-endian)" msgstr "VD (64-bit VAX D, VAX-endian)" #: src/language/utilities/set.q:810 msgid "VG (64-bit VAX G, VAX-endian)" msgstr "VG (64-bit VAX G, VAX-endian)" #: src/language/utilities/set.q:814 msgid "ZS (32-bit IBM Z hexadecimal short, big-endian)" msgstr "ZS (32-bit IBM Z hexadecimal short, big-endian)" #: src/language/utilities/set.q:817 msgid "ZL (64-bit IBM Z hexadecimal long, big-endian)" msgstr "ZL (64-bit IBM Z hexadecimal long, big-endian)" #: src/language/utilities/set.q:985 #, c-format msgid "%s is %s." msgstr "%s és %s." #: src/language/utilities/set.q:1089 #, c-format msgid "" "Too many %s commands without a %s: at most %d levels of saved settings are " "allowed." msgstr "" "Massa comandaments %s sense un %s: es permet, com a màxim, %d nivells de " "configuracions desades." #: src/language/utilities/set.q:1109 #, c-format msgid "%s without matching %s." msgstr "%s sense el corresponent %s." #: src/language/stats/crosstabs.q:327 #, c-format msgid "Missing mode %s not allowed in general mode. Assuming %s." msgstr "El mode perdut %s no està disponible al mode general. S'assumeix %s." #: src/language/stats/crosstabs.q:444 msgid "Too many cross-tabulation variables or dimensions." msgstr "Massa variables o dimensions per a l'encreuament tabulat." #: src/language/stats/crosstabs.q:509 #, c-format msgid "%s must be specified before %s." msgstr "%s han de ser especificades abans que %s." #: src/language/stats/crosstabs.q:543 #, c-format msgid "Maximum value (%ld) less than minimum value (%ld)." msgstr "El valor màxim (%ld) en menor que el valor mínim (%ld)." #: src/language/stats/crosstabs.q:922 #, fuzzy #| msgid "Summary." msgid "Summary" msgstr "Resum." #: src/language/stats/crosstabs.q:935 #, fuzzy #| msgid "Generate crosstabulations" msgid "Crosstabulation" msgstr "Generar tabulació encreuada" #. TRANSLATORS: The %s here describes a crosstabulation. It takes the #. form "var1 * var2 * var3 * ...". #: src/language/stats/crosstabs.q:1013 #, c-format msgid "Crosstabulation %s contained no non-missing cases." msgstr "La taula de contingencia %s no conté cap cas no-perdut." #: src/language/stats/crosstabs.q:1204 #, fuzzy #| msgid "Missing Values" msgid "Missing value" msgstr "Valors perduts" #: src/language/stats/crosstabs.q:1263 #, fuzzy #| msgid "row %" msgid "Row %" msgstr "fila %" #: src/language/stats/crosstabs.q:1264 #, fuzzy #| msgid "column %" msgid "Column %" msgstr "columna %" #: src/language/stats/crosstabs.q:1265 #, fuzzy #| msgid "total %" msgid "Total %" msgstr "total %" #: src/language/stats/crosstabs.q:1269 #, fuzzy #| msgid "Adjusted Std. Residual" msgid "Adjusted Residual" msgstr "Residu Tipificat Ajustat" #: src/language/stats/crosstabs.q:1288 #, fuzzy #| msgid "Chi-Square Test" msgid "Chi-Square Tests" msgstr "Test Chi-quadrat." #: src/language/stats/crosstabs.q:1294 msgid "Pearson Chi-Square" msgstr "Chi-quadrat de Pearson" #: src/language/stats/crosstabs.q:1295 msgid "Likelihood Ratio" msgstr "Raó de Similitut" #: src/language/stats/crosstabs.q:1296 msgid "Fisher's Exact Test" msgstr "Prova exacta de Fisher" #: src/language/stats/crosstabs.q:1297 msgid "Continuity Correction" msgstr "Correcció per continuitat" #: src/language/stats/crosstabs.q:1298 msgid "Linear-by-Linear Association" msgstr "Asociació linear per linear" #: src/language/stats/crosstabs.q:1299 src/language/stats/crosstabs.q:1345 #: src/language/stats/crosstabs.q:1854 msgid "N of Valid Cases" msgstr "N de casos vàlids" #: src/language/stats/crosstabs.q:1305 #, fuzzy #| msgid "Asymp. Sig. (2-tailed)" msgid "Asymptotic Sig. (2-tailed)" msgstr "Sig. Asimp. (2-cues)" #: src/language/stats/crosstabs.q:1319 #, fuzzy #| msgid "Symmetric measures." msgid "Symmetric Measures" msgstr "Mesures simètriques." #: src/language/stats/crosstabs.q:1324 src/language/stats/crosstabs.q:1364 #: src/language/stats/crosstabs.q:1411 msgid "Values" msgstr "Valores" #: src/language/stats/crosstabs.q:1326 src/language/stats/crosstabs.q:1413 msgid "Asymp. Std. Error" msgstr "Error Est. Asimp." #: src/language/stats/crosstabs.q:1327 src/language/stats/crosstabs.q:1414 msgid "Approx. T" msgstr "Aprox. T" #: src/language/stats/crosstabs.q:1328 src/language/stats/crosstabs.q:1415 msgid "Approx. Sig." msgstr "Sig. Aproxim." #: src/language/stats/crosstabs.q:1333 src/language/stats/crosstabs.q:1420 msgid "Nominal by Nominal" msgstr "Nominal segons Nominal" #: src/language/stats/crosstabs.q:1334 msgid "Cramer's V" msgstr "V de Cramer" #: src/language/stats/crosstabs.q:1334 msgid "Contingency Coefficient" msgstr "Coeficient de Contingencia" #: src/language/stats/crosstabs.q:1336 src/language/stats/crosstabs.q:1425 msgid "Ordinal by Ordinal" msgstr "Ordinal segons Ordinal" #: src/language/stats/crosstabs.q:1337 msgid "Kendall's tau-b" msgstr "Tau-B de Kendall" #: src/language/stats/crosstabs.q:1337 msgid "Kendall's tau-c" msgstr "Tau-C de Kendall" #: src/language/stats/crosstabs.q:1338 msgid "Spearman Correlation" msgstr "Correlació de Spearman" #: src/language/stats/crosstabs.q:1340 msgid "Interval by Interval" msgstr "Interval segons Interval" #: src/language/stats/crosstabs.q:1341 msgid "Pearson's R" msgstr "R de Pearson" #: src/language/stats/crosstabs.q:1343 msgid "Measure of Agreement" msgstr "Mesura d'Acord" #: src/language/stats/crosstabs.q:1359 #, fuzzy #| msgid "Risk estimate." msgid "Risk Estimate" msgstr "Estimador de Risc." #: src/language/stats/crosstabs.q:1368 #, fuzzy, no-c-format #| msgid "95%% Confidence Interval" msgid "95% Confidence Interval" msgstr "Interval de Confiança del 95%%" #: src/language/stats/crosstabs.q:1389 msgid "Symmetric" msgstr "Simètric" #: src/language/stats/crosstabs.q:1391 src/language/stats/crosstabs.q:1396 #, c-format msgid "%s Dependent" msgstr "%s Dependent" #: src/language/stats/crosstabs.q:1406 #, fuzzy #| msgid "Directional measures." msgid "Directional Measures" msgstr "Mesures direccionals." #: src/language/stats/crosstabs.q:1422 msgid "Goodman and Kruskal tau" msgstr "Tau de Kruskal i Goodman" #: src/language/stats/crosstabs.q:1423 msgid "Uncertainty Coefficient" msgstr "Coeficient d'Incertessa" #: src/language/stats/crosstabs.q:1426 msgid "Somers' d" msgstr "D de Somers" #: src/language/stats/crosstabs.q:1428 msgid "Nominal by Interval" msgstr "Nominal segons Interval" #: src/language/stats/crosstabs.q:1826 #, fuzzy, c-format #| msgid "Odds Ratio for %s (%g / %g)" msgid "Odds Ratio for %s" msgstr "Raó de diferencies per a %s (%g / %g)" #: src/language/stats/crosstabs.q:1835 #, fuzzy, c-format #| msgid "For cohort %s = %g" msgid "For cohort %s = " msgstr "Per cohort %s = %g" #: src/ui/gui/aggregate.ui:24 msgid "Aggregate Data" msgstr "Dades Agregades" #: src/ui/gui/aggregate.ui:126 msgid "_Break variable(s)" msgstr "Variable(s) de Tall" #: src/ui/gui/aggregate.ui:179 msgid "Variable Name: " msgstr " Variable:" #: src/ui/gui/aggregate.ui:215 msgid "Variable Label: " msgstr "Etiqueta de variable: " #: src/ui/gui/aggregate.ui:252 msgid "Function: " msgstr "Funció: " #: src/ui/gui/aggregate.ui:327 msgid "Argument 1: " msgstr "Argument 1: " #: src/ui/gui/aggregate.ui:364 msgid "Argument 2: " msgstr "Argument 2: " #: src/ui/gui/aggregate.ui:428 msgid "Aggregated variables" msgstr "Variables agregades" #: src/ui/gui/aggregate.ui:469 msgid "_Add aggregated variables to the active dataset" msgstr "_Afegeix variables agregades al conjunt de dades actiu" #: src/ui/gui/aggregate.ui:486 msgid "_Replace the current dataset with the aggregated variables" msgstr "_Reemplaça el conjunt de dades actual amb les variables agregades" #: src/ui/gui/aggregate.ui:504 msgid "_Write a new data file containing only the aggregated variables" msgstr "" "Escriu un nou arxiu de dades que contingui només les variables agregades" #: src/ui/gui/aggregate.ui:544 msgid "label" msgstr "etiqueta" #: src/ui/gui/aggregate.ui:593 msgid "File is _already sorted on break variable(s)" msgstr "L'arxiu j_a está ordenat per le(s) variable(s) de tall" #: src/ui/gui/aggregate.ui:609 msgid "Sort file before a_ggregating" msgstr "Ordenar l'arxiu abans de l'a_gregació" #: src/ui/gui/aggregate.ui:630 msgid "Options for very large datasets" msgstr "Opcions per conjunts de dades grans" #: src/ui/gui/autorecode.ui:24 msgid "Automatic Recode" msgstr "Recodificació Automàtica" #: src/ui/gui/autorecode.ui:120 msgid "Variable -> New Name" msgstr "Variable -> Nom Nou" #: src/ui/gui/autorecode.ui:145 msgid "_Lowest value" msgstr "_Valor Inferior" #: src/ui/gui/autorecode.ui:163 msgid "_Highest value" msgstr "_Valor Superior" #: src/ui/gui/autorecode.ui:185 msgid "Recode starting from" msgstr "Recodificació comença des de" #: src/ui/gui/autorecode.ui:204 msgid "_New Name" msgstr "_Nou Valor" #: src/ui/gui/autorecode.ui:227 msgid "_Add New Name" msgstr "_Afegir Nou Nom" #: src/ui/gui/autorecode.ui:285 msgid "_Use the same recoding scheme for all variables" msgstr "_Utilitzar el mateix esquema de codificació per a totes les variables" #: src/ui/gui/autorecode.ui:301 msgid "Treat _blank string values as missing" msgstr "Tractar els valors de cadena en _blanc com a perduts" #: src/ui/gui/binomial.ui:86 msgid "_Test Variable List:" msgstr "Lista de Variable _Test:" #: src/ui/gui/binomial.ui:160 src/ui/gui/chi-square.ui:281 msgid "_Get from data" msgstr "Obtenció des de dades" #: src/ui/gui/binomial.ui:181 src/ui/gui/indep-samples.ui:150 msgid "_Cut point:" msgstr "Punt de tall:" #: src/ui/gui/binomial.ui:225 msgid "Define Dichotomy" msgstr "Defineix Dicotomia" #: src/ui/gui/binomial.ui:245 msgid "Test _Proportion:" msgstr "Test _Proporció:" #: src/ui/gui/compute.ui:32 msgid "Compute Variable: Type and Label" msgstr "Calcular Variable: Tipus i Etiqueta" #: src/ui/gui/compute.ui:67 msgid "Use _expression as label" msgstr "Utilitza l'_expressió com a etiqueta" #: src/ui/gui/compute.ui:90 msgid "_Label:" msgstr "Etiqueta:" #: src/ui/gui/compute.ui:194 msgid "_String" msgstr "Cadena" #: src/ui/gui/compute.ui:287 msgid "_Numeric" msgstr "_Numèric" #: src/ui/gui/compute.ui:343 msgid "Compute Variable" msgstr "Calcular Variable" #: src/ui/gui/compute.ui:381 msgid "Target _Variable:" msgstr "_Variable objectiu:" #: src/ui/gui/compute.ui:412 msgid "_Type & Label..." msgstr "_Tipus y Etiquetes" #: src/ui/gui/compute.ui:469 msgid "=" msgstr "=" #: src/ui/gui/compute.ui:526 msgid "_Numeric Expressions:" msgstr "Expressions _Numèriques:" #: src/ui/gui/compute.ui:598 msgid "_Functions:" msgstr "_Funcions:" #: src/ui/gui/compute.ui:678 msgid "_If..." msgstr "S_i..." #: src/ui/gui/barchart.ui:24 msgid "Barchart" msgstr "Gràfica de Barres" #: src/ui/gui/barchart.ui:112 msgid "Category A_xis:" msgstr "Eix de CA_tegories" #: src/ui/gui/barchart.ui:140 msgid "_N of cases" msgstr "_Nombre de casos" #: src/ui/gui/barchart.ui:158 msgid "_Cum. n of cases" msgstr "Nombre de _Casos Acumulat" #: src/ui/gui/barchart.ui:174 msgid "Other _summary function" msgstr "Altra funcio de re_sum" #: src/ui/gui/barchart.ui:191 msgid "% of c_ases" msgstr "% de c_asos" #: src/ui/gui/barchart.ui:207 msgid "C_um. % of cases" msgstr "% de C_asos Acumulats" #: src/ui/gui/barchart.ui:270 src/ui/gui/histogram.ui:100 msgid "_Variable:" msgstr "_Variable:" #: src/ui/gui/barchart.ui:308 msgid "Bars Represent" msgstr "Les barres representen" #: src/ui/gui/barchart.ui:340 msgid "Category C_luster:" msgstr " C_ategoria d'Agrupament" #: src/ui/gui/correlation.ui:24 msgid "Bivariate Correlations" msgstr "Correlacions Bivariades" #: src/ui/gui/correlation.ui:148 msgid "Pearso_n" msgstr "Pearso_n" #: src/ui/gui/correlation.ui:164 msgid "_Kendall's tau-b" msgstr "Tau-b de _Kendall" #: src/ui/gui/correlation.ui:180 msgid "_Spearman" msgstr "_Spearman" #: src/ui/gui/correlation.ui:200 msgid "Correlation Coefficients" msgstr "Coeficients de Correlació" #: src/ui/gui/correlation.ui:224 msgid "_Two-tailed" msgstr "Dues cues" #: src/ui/gui/correlation.ui:241 msgid "One-tai_led" msgstr "Una cua" #: src/ui/gui/correlation.ui:262 msgid "Test of Significance" msgstr "Test de Significativitat" #: src/ui/gui/correlation.ui:275 msgid "_Flag significant correlations" msgstr "Marca correlacions significants" #: src/ui/gui/count.ui:24 msgid "Count Occurrences of Values within Cases" msgstr "Recomptar Ocurrencies de Valors dins de Casos" #: src/ui/gui/count.ui:117 msgid "Numeric _Variables:" msgstr "_Variables Numèriques:" #: src/ui/gui/count.ui:147 msgid "_Target Variable:" msgstr "Variable Objec_tiu:" #: src/ui/gui/count.ui:178 msgid "Target _Label:" msgstr "_Etiqueta d'Objetiu:" #: src/ui/gui/count.ui:192 msgid "_Define Values..." msgstr "_Definir Valors..." #: src/ui/gui/count.ui:257 msgid "Count Values within Cases: Values to Count" msgstr "Recomptar Valors en Casos: Valors a Comptar" #: src/ui/gui/count.ui:305 msgid "Values _to Count:" msgstr "Valors a Comp_tar:" #: src/ui/gui/comments.ui:25 msgid "Data File Comments" msgstr "Comentaris de l'arxiu de dades" #: src/ui/gui/comments.ui:49 msgid "Comments:" msgstr "Comentaris:" #: src/ui/gui/comments.ui:106 msgid "Display comments in output" msgstr "Mostra comentaris al resultat" #: src/ui/gui/comments.ui:127 msgid "Column Number: 0" msgstr "Columna Numero: 0" #: src/ui/gui/crosstabs.ui:25 msgid "Crosstabs: Cells" msgstr "Taules Creuades: Cel·les" #: src/ui/gui/crosstabs.ui:67 msgid "Cell Display" msgstr "Contingut de cel.la" #: src/ui/gui/crosstabs.ui:99 msgid "Crosstabs" msgstr "Taules _Creuades" #: src/ui/gui/crosstabs.ui:150 msgid "_Rows" msgstr "_Files" #: src/ui/gui/crosstabs.ui:195 msgid "_Columns" msgstr "_Columnes" #: src/ui/gui/crosstabs.ui:242 msgid "_Format..." msgstr "_Format..." #: src/ui/gui/crosstabs.ui:256 src/ui/gui/examine.ui:267 msgid "_Statistics..." msgstr "_Estadístics..." #: src/ui/gui/crosstabs.ui:270 msgid "Ce_lls..." msgstr "Ce_l.les..." #: src/ui/gui/crosstabs.ui:348 msgid "Crosstabs: Format" msgstr "Taules Creuades: Format" #: src/ui/gui/crosstabs.ui:371 msgid "Print tables" msgstr "Imprimir tablas:" #: src/ui/gui/crosstabs.ui:387 msgid "Pivot" msgstr "Pivot" #: src/ui/gui/crosstabs.ui:403 src/ui/gui/sort.ui:157 msgid "Ascending" msgstr "Ascendent" #: src/ui/gui/crosstabs.ui:455 msgid "Crosstabs: Statistics" msgstr "Taules Creuades: Estadístics" #: src/ui/gui/chi-square.ui:30 msgid "Chi-Square Test" msgstr "Test Chi-quadrat." #: src/ui/gui/chi-square.ui:82 msgid "All categor_ies equal" msgstr "Igual totes categories" #: src/ui/gui/chi-square.ui:103 msgid "_Values" msgstr "_Valors" #: src/ui/gui/chi-square.ui:159 msgid "Expected Values:" msgstr "Valors Esperats:" #: src/ui/gui/chi-square.ui:204 msgid "Test _Variables" msgstr "Variables de prova" #: src/ui/gui/chi-square.ui:298 msgid "Use _specified range" msgstr "Utilitza rang e_specificat" #: src/ui/gui/chi-square.ui:323 msgid "_Lower:" msgstr "Mínim:" #: src/ui/gui/chi-square.ui:337 msgid "_Upper:" msgstr "Màxim:" #: src/ui/gui/chi-square.ui:381 msgid "Expected Range:" msgstr "Rang esperat:" #: src/ui/gui/descriptives.ui:131 src/ui/gui/factor.ui:797 #: src/ui/gui/recode.ui:638 msgid "_Variables:" msgstr "_Variables:" #: src/ui/gui/descriptives.ui:176 msgid "S_tatistics:" msgstr "Es_tadístiques:" #: src/ui/gui/descriptives.ui:230 msgid "_Exclude entire case if any selected variable is missing" msgstr "" "_Exclou el cas sencer si qualsevol variable seleccionada te valor perdut" #: src/ui/gui/descriptives.ui:247 msgid "_Include user-missing data in analysis" msgstr "_Incloure els valors perduts d'usuari a l'anàlisi" #: src/ui/gui/descriptives.ui:264 msgid "Save _Z-scores of selected variables as new variables" msgstr "" "Desar puntuacions-_Z de les variables seleccionades com a noves variables" #: src/ui/gui/descriptives.ui:286 msgid "Options:" msgstr "Opcions:" #: src/ui/gui/examine.ui:25 msgid "Explore" msgstr "Explorar" #: src/ui/gui/examine.ui:69 msgid "_Label Cases by:" msgstr "Etiqueta casos per:" #: src/ui/gui/examine.ui:116 msgid "_Factor List:" msgstr "Llistat de _Factors:" #: src/ui/gui/examine.ui:163 src/ui/gui/means.ui:126 msgid "_Dependent List:" msgstr "Llistat de Dependents:" #: src/ui/gui/examine.ui:331 msgid "Explore: Options" msgstr "Explorar: Opcions" #: src/ui/gui/examine.ui:355 src/ui/gui/t-test.ui:81 msgid "Exclude cases _listwise" msgstr "Exclure casos per _llista" #: src/ui/gui/examine.ui:373 msgid "Exclude cases _pairwise" msgstr "Excloure casos per _parelles" #: src/ui/gui/examine.ui:392 msgid "_Report values" msgstr "_Reporta valors" #: src/ui/gui/examine.ui:449 msgid "Explore: Statistics" msgstr "Explorar: Estadístics" #: src/ui/gui/examine.ui:468 src/ui/gui/oneway.ui:576 msgid "_Descriptives" msgstr "_Descriptives" #: src/ui/gui/examine.ui:485 msgid "_Extremes" msgstr "_Extrems" #: src/ui/gui/examine.ui:502 msgid "_Percentiles" msgstr "_Percentils" #: src/ui/gui/goto-case.ui:31 msgid "Goto Case" msgstr "Anar a Cas" #: src/ui/gui/goto-case.ui:52 msgid "Goto Case Number:" msgstr "Anar al cas número:" #: src/ui/gui/factor.ui:39 msgid "Factor Analysis: Rotation" msgstr "Anàlisi Factorial: Rotació" #: src/ui/gui/factor.ui:70 msgid "_None" msgstr "_No res" #: src/ui/gui/factor.ui:87 msgid "_Varimax" msgstr "_Varimax" #: src/ui/gui/factor.ui:104 msgid "_Quartimax" msgstr "_Quartimax" #: src/ui/gui/factor.ui:123 msgid "_Equimax" msgstr "_Equimax" #: src/ui/gui/factor.ui:146 msgid "Method" msgstr "Mètode" #: src/ui/gui/factor.ui:159 msgid "_Display rotated solution" msgstr "Mostra solució rotada" #: src/ui/gui/factor.ui:181 src/ui/gui/factor.ui:582 msgid "Ma_ximum iterations for convergence:" msgstr "Iteracions mà_ximes per convergència:" #: src/ui/gui/factor.ui:241 src/ui/gui/factor.ui:255 msgid "Principal Components Analysis" msgstr "Anàlisi de Components Principals" #: src/ui/gui/factor.ui:246 src/ui/gui/factor.ui:258 msgid "Principal Axis Factoring" msgstr "Factors pels eixos principals" #: src/ui/gui/factor.ui:264 msgid "Factor Analysis: Extraction" msgstr "Anàlisi Factorial: Extracció" #: src/ui/gui/factor.ui:290 msgid "_Method: " msgstr "_Mètode: " #: src/ui/gui/factor.ui:345 msgid "Co_rrelation matrix" msgstr "Matriu de Co_rrelació" #: src/ui/gui/factor.ui:361 msgid "Co_variance matrix" msgstr "Matriu de Co_variància" #: src/ui/gui/factor.ui:382 msgid "Analyze" msgstr "Analitzar" #: src/ui/gui/factor.ui:407 msgid "_Unrotated factor solution" msgstr "Sol·l_ució factorial sense rotació" #: src/ui/gui/factor.ui:423 msgid "_Scree plot" msgstr "Gràfic de _sedimentació" #: src/ui/gui/factor.ui:443 src/ui/gui/histogram.ui:146 src/ui/gui/roc.ui:329 msgid "Display" msgstr "Contingut" #: src/ui/gui/factor.ui:526 msgid "_Number of factors:" msgstr "_Nombre de factors:" #: src/ui/gui/factor.ui:563 msgid "Extract" msgstr "Extracció" #: src/ui/gui/factor.ui:640 msgid "Factor Analysis" msgstr "Anàlisi Factorial" #: src/ui/gui/factor.ui:672 src/ui/gui/data-editor.ui:266 msgid "_Descriptives..." msgstr "_Descriptius..." #: src/ui/gui/factor.ui:685 msgid "_Extraction..." msgstr "_Extracció..." #: src/ui/gui/factor.ui:699 msgid "_Rotations..." msgstr "Rotacions..." #: src/ui/gui/find.ui:25 msgid "Find Case" msgstr "Cerca cas" #: src/ui/gui/find.ui:117 msgid "Variable:" msgstr "Variable:" #: src/ui/gui/find.ui:157 src/ui/gui/val-labs-dialog.ui:113 msgid "Value:" msgstr "Valor:" #: src/ui/gui/find.ui:180 msgid "Search value labels" msgstr "Cerca etiquetes de valor" #: src/ui/gui/find.ui:210 msgid "Regular expression Match" msgstr "Expressió regular coincident" #: src/ui/gui/find.ui:227 msgid "Search substrings" msgstr "Cercar subcadenes" #: src/ui/gui/find.ui:244 msgid "Wrap around" msgstr "Envolcallar" #: src/ui/gui/find.ui:260 msgid "Search backward" msgstr "Cerca cap enrrera" #: src/ui/gui/frequencies.ui:32 msgid "Frequencies: Frequency Tables" msgstr "Freqüències: Taules de freqüències" #: src/ui/gui/frequencies.ui:67 msgid "_Always" msgstr "Sempre" #: src/ui/gui/frequencies.ui:85 msgid "_Never" msgstr "Mai" #: src/ui/gui/frequencies.ui:107 msgid "If no _more than " msgstr "Si no _més de " #: src/ui/gui/frequencies.ui:129 src/ui/gui/frequencies.ui:454 msgid "100" msgstr "100" #: src/ui/gui/frequencies.ui:145 msgid "values" msgstr "Valors" #: src/ui/gui/frequencies.ui:167 msgid "Display frequency tables" msgstr "Mostra taula de freqüències" #: src/ui/gui/frequencies.ui:194 msgid "A_scending value" msgstr "Valor _Ascendent" #: src/ui/gui/frequencies.ui:212 msgid "D_escending value" msgstr "Valor _Descendent" #: src/ui/gui/frequencies.ui:230 msgid "Ascending _frequency" msgstr "Freqüència _ascendent" #: src/ui/gui/frequencies.ui:248 msgid "Descending f_requency" msgstr "Freqüència _descendent" #: src/ui/gui/frequencies.ui:271 msgid "Order by" msgstr "Ordenat per" #: src/ui/gui/frequencies.ui:324 msgid "Frequencies: Charts" msgstr "Freqüències: Gràfics" #: src/ui/gui/frequencies.ui:356 msgid "Scale:" msgstr "Escala:" #: src/ui/gui/frequencies.ui:366 msgid "_Frequencies" msgstr "_Freqüències" #: src/ui/gui/frequencies.ui:383 msgid "_Percentages" msgstr "_Percentatges" #: src/ui/gui/frequencies.ui:407 msgid "Exclude values _below " msgstr "Excloure valors per sota " #: src/ui/gui/frequencies.ui:422 msgid "Exclude values _above " msgstr "Excloure valors per sobre " #: src/ui/gui/frequencies.ui:441 src/ui/gui/reliability.ui:227 msgid "0" msgstr "0" #: src/ui/gui/frequencies.ui:469 msgid "Chart Formatting" msgstr "Format de Gràfics" #: src/ui/gui/frequencies.ui:494 msgid "Draw _histograms" msgstr "Dibuixa _histogrames" #: src/ui/gui/frequencies.ui:510 msgid "Superimpose _normal curve" msgstr "Sobreimposa curva _normal" #: src/ui/gui/frequencies.ui:530 msgid "Histograms" msgstr "Histogrames" #: src/ui/gui/frequencies.ui:555 msgid "Draw _bar charts" msgstr "Dibuixa gràfiques de _barres" #: src/ui/gui/frequencies.ui:575 msgid "Bar Charts" msgstr "Gràfiques de Barres" #: src/ui/gui/frequencies.ui:600 msgid "Draw _pie charts" msgstr "Dibuixa gràfiques de sectors" #: src/ui/gui/frequencies.ui:616 msgid "Include slices for _missing values" msgstr "Incloure sectors pels valors perduts" #: src/ui/gui/frequencies.ui:636 msgid "Pie Charts" msgstr "Gràfiques de Sectors" #: src/ui/gui/frequencies.ui:725 src/ui/gui/rank.ui:489 msgid "_Variable(s):" msgstr "_Variable(s):" #: src/ui/gui/frequencies.ui:769 msgid "_Statistics:" msgstr "E_stadístics:" #: src/ui/gui/frequencies.ui:783 msgid "Include _missing values" msgstr "Inclou valors _perduts" #: src/ui/gui/frequencies.ui:806 msgid "Ch_arts..." msgstr "Gr_afics..." #: src/ui/gui/frequencies.ui:821 msgid "Frequency _Tables..." msgstr "_Taules de Freqüències..." #: src/ui/gui/histogram.ui:24 msgid "Histogram" msgstr "Histograma " #: src/ui/gui/histogram.ui:126 msgid "_Display normal curve" msgstr "Mostra corva normal" #: src/ui/gui/indep-samples.ui:25 src/ui/gui/k-independent.ui:35 msgid "Define Groups" msgstr "Definir grups" #: src/ui/gui/indep-samples.ui:75 msgid "Group_2 value:" msgstr "Valor del grup 2:" #: src/ui/gui/indep-samples.ui:89 msgid "Group_1 value:" msgstr "Valor del Grup 1:" #: src/ui/gui/indep-samples.ui:190 msgid "_Use specified values:" msgstr "Utilitza valors especificats:" #: src/ui/gui/indep-samples.ui:259 msgid "Independent-Samples T Test" msgstr "Prova T per mostres Independents" #: src/ui/gui/indep-samples.ui:319 msgid "_Define Groups..." msgstr "_Definir grups" #: src/ui/gui/indep-samples.ui:401 src/ui/gui/t-test.ui:211 msgid "_Test Variable(s):" msgstr "Variable(s) de _test:" #: src/ui/gui/indep-samples.ui:454 src/ui/gui/k-independent.ui:165 msgid "_Grouping Variable:" msgstr "Variable d'A_grupament:" #: src/ui/gui/k-independent.ui:63 msgid "_Upper limit:" msgstr "Límit Superior:" #: src/ui/gui/k-independent.ui:77 msgid "_Lower limit:" msgstr "_Límit Inferior:" #: src/ui/gui/k-independent.ui:136 msgid "Tests for Several Independent Samples" msgstr "Contrast per a Múltiples Mostres Aparellades" #: src/ui/gui/k-independent.ui:208 src/ui/gui/ks-one-sample.ui:131 msgid "Test _Variable List:" msgstr "Llista de Variables de _Prova:" #: src/ui/gui/k-independent.ui:320 msgid "_Define Groups" msgstr "_Definir grups" #: src/ui/gui/k-independent.ui:365 msgid "_Kruskal-Wallis H" msgstr "H de _Kruskal-Wallis" #: src/ui/gui/k-independent.ui:382 src/ui/gui/runs.ui:140 msgid "_Median" msgstr "_Mediana" #: src/ui/gui/k-means.ui:24 msgid "K-Means Cluster Analysis" msgstr "Anàlisi de Conglometars K-Mitjanes" #: src/ui/gui/k-means.ui:122 msgid "N_umber of Clusters: " msgstr "_Nombre de conglomerats: " #: src/ui/gui/k-related.ui:24 msgid "Tests for Several Related Samples" msgstr "Prova per Múltiples Mostres Aparellades" #: src/ui/gui/k-related.ui:113 msgid "_Test Variables:" msgstr "Variables de prova:" #: src/ui/gui/k-related.ui:145 msgid "_Friedman" msgstr "_Friedman" #: src/ui/gui/k-related.ui:161 msgid "_Kendall's W" msgstr " W de Kendall" #: src/ui/gui/k-related.ui:177 msgid "_Cochran's Q" msgstr "Q de Cochran" #: src/ui/gui/ks-one-sample.ui:163 msgid "_Normal" msgstr "_Normal" #: src/ui/gui/ks-one-sample.ui:181 msgid "_Poisson" msgstr "_Poisson" #: src/ui/gui/ks-one-sample.ui:198 msgid "_Uniform" msgstr "_Uniforme" #: src/ui/gui/ks-one-sample.ui:213 msgid "_Exponential" msgstr "_Exponencial" #: src/ui/gui/ks-one-sample.ui:232 msgid "Test Distribution" msgstr "Distribució de Prova" #: src/ui/gui/logistic.ui:42 msgid "Logistic Regression: Options" msgstr "Regressió Logística: Opcions" #: src/ui/gui/logistic.ui:66 msgid "CI for _exp(B): " msgstr "IC per a _exp(B): " #: src/ui/gui/logistic.ui:97 msgid "%" msgstr "%" #: src/ui/gui/logistic.ui:146 msgid "Classification cu_toff: " msgstr "_Tall de Classificació: " #: src/ui/gui/logistic.ui:159 msgid "_Maximum Iterations: " msgstr "Iteracions _màximes:" #: src/ui/gui/logistic.ui:177 msgid "Include _constant in model" msgstr "Incloure la _constant al model" #: src/ui/gui/logistic.ui:219 msgid "Logistic Regression" msgstr "Regressió Logística" #: src/ui/gui/logistic.ui:364 src/ui/gui/regression.ui:185 msgid "_Dependent" msgstr "_Dependent" #: src/ui/gui/logistic.ui:412 src/ui/gui/regression.ui:232 msgid "_Independent" msgstr "_Independent" #: src/ui/gui/means.ui:25 msgid "Means" msgstr "Mitjanes" #: src/ui/gui/means.ui:179 msgid "_Independent List:" msgstr "Llistat de _Independents:" #: src/ui/gui/missing-val-dialog.ui:48 msgid "_No missing values" msgstr "Sense valors perduts" #: src/ui/gui/missing-val-dialog.ui:136 msgid "_Discrete missing values" msgstr "Valors perduts _Discrets" #: src/ui/gui/missing-val-dialog.ui:172 msgid "_Low:" msgstr "Baix:" #: src/ui/gui/missing-val-dialog.ui:197 msgid "_High:" msgstr "Superior:" #: src/ui/gui/missing-val-dialog.ui:221 msgid "Di_screte value:" msgstr "Valor Di_scret:" #: src/ui/gui/missing-val-dialog.ui:245 msgid "_Range plus one optional discrete missing value" msgstr "Valor perdut discreto ocpional d'interval més un" #: src/ui/gui/oneway.ui:25 msgid "One-Way ANOVA: Contrasts" msgstr "ANOVA d'un factor: Contrasts" #: src/ui/gui/oneway.ui:107 msgid "_Coefficients:" msgstr "_Coeficients:" #: src/ui/gui/oneway.ui:161 msgid "Coefficient Total: " msgstr "Coeficient Total: " #: src/ui/gui/oneway.ui:198 msgid "Contrast 1 of 1" msgstr "Contrast 1 de 1" #: src/ui/gui/oneway.ui:234 #, fuzzy #| msgid "One-Way ANOVA: Contrasts" msgid "One-Way ANOVA: Post-Hoc" msgstr "ANOVA d'un factor: Contrasts" #: src/ui/gui/oneway.ui:270 #, fuzzy #| msgid "Games-Howell" msgid "Games Howell" msgstr "Games-Howell" #: src/ui/gui/oneway.ui:287 msgid "Fisher's LSD" msgstr "" #: src/ui/gui/oneway.ui:379 msgid "One-Way ANOVA" msgstr "ANOVA d'un factor" #: src/ui/gui/oneway.ui:408 msgid "_Factor:" msgstr "_Factor:" #: src/ui/gui/oneway.ui:451 msgid "Dependent _Variable(s):" msgstr "_Variable(s) Depenents:" #: src/ui/gui/oneway.ui:593 msgid "_Homogeneity" msgstr "_Homogeneitat" #: src/ui/gui/oneway.ui:637 msgid "Post-Hoc..." msgstr "" #: src/ui/gui/oneway.ui:652 msgid "_Contrasts..." msgstr "_Contrasts..." #: src/ui/gui/options.ui:25 msgid "Options Case" msgstr "Opcions de Cas" #: src/ui/gui/options.ui:55 msgid "Display _Labels" msgstr "Mostrar Etiquetes" #: src/ui/gui/options.ui:71 msgid "Display _Names" msgstr "Mostrar _Noms" #: src/ui/gui/options.ui:99 msgid "Sort by L_abel" msgstr "Ordenar per etiqueta" #: src/ui/gui/options.ui:115 msgid "Sort by Na_me" msgstr "Ordenar per No_m" #: src/ui/gui/options.ui:131 msgid "Do not S_ort" msgstr "No ordenar" #: src/ui/gui/options.ui:159 msgid "Variable Lists" msgstr "Llista de Variables" #: src/ui/gui/options.ui:184 msgid "Ma_ximize" msgstr "Ma_ximitzar" #: src/ui/gui/options.ui:199 msgid "_Raise" msgstr "Eleva_r" #: src/ui/gui/options.ui:214 msgid "Aler_t" msgstr "Aler_ta" #: src/ui/gui/options.ui:233 msgid "Output Window Action" msgstr "Acció de Finestra de Resultats" #: src/ui/gui/paired-samples.ui:147 msgid "_Test Pair(s):" msgstr "Parella(es) de Prova:" #: src/ui/gui/rank.ui:30 msgid "Rank Cases: Types" msgstr "Rang de casos: Tipus" #: src/ui/gui/rank.ui:57 msgid "Sum of case _weights" msgstr "Suma de ponderacions de cas" #: src/ui/gui/rank.ui:74 msgid "Fractional rank as _%" msgstr "Ranking fracional com a _%" #: src/ui/gui/rank.ui:92 msgid "_Fractional rank" msgstr "Ranking _fraccional" #: src/ui/gui/rank.ui:109 msgid "_Savage score" msgstr "Puntuació de _Savage" #: src/ui/gui/rank.ui:125 msgid "_Rank" msgstr "Ranking" #: src/ui/gui/rank.ui:147 msgid "N_tiles" msgstr "N_tiles" #: src/ui/gui/rank.ui:195 msgid "_Proportion Estimates" msgstr "Estimació de _Proporcions" #: src/ui/gui/rank.ui:213 msgid "_Normal Scores" msgstr "Puntuacions _Normals" #: src/ui/gui/rank.ui:251 msgid "_Blom" msgstr "_Blom" #: src/ui/gui/rank.ui:269 msgid "Tuke_y" msgstr "Tuke_y" #: src/ui/gui/rank.ui:287 msgid "Ran_kit" msgstr "Ran_kit" #: src/ui/gui/rank.ui:305 msgid "_Van der Waerden" msgstr "_Van der Wärden" #: src/ui/gui/rank.ui:328 msgid "Proportion Estimation Formula" msgstr "Formula d'estimació de Porporcións" #: src/ui/gui/rank.ui:369 msgid "Rank Cases" msgstr "Rang de casos" #: src/ui/gui/rank.ui:434 msgid "_By:" msgstr "Segons:" #: src/ui/gui/rank.ui:595 msgid "_Smallest Value" msgstr "Valor Inferior" #: src/ui/gui/rank.ui:613 msgid "_Largest Value" msgstr "Valor Superior" #: src/ui/gui/rank.ui:637 msgid "Assign rank 1 to:" msgstr "Assigna rang 1 a:" #: src/ui/gui/rank.ui:656 msgid "_Display summary tables" msgstr "Mostra taules resum" #: src/ui/gui/rank.ui:679 msgid "Rank T_ypes" msgstr "Tipus de Rangs" #: src/ui/gui/rank.ui:694 msgid "_Ties..." msgstr "Vincles..." #: src/ui/gui/rank.ui:756 msgid "Rank Cases: Ties" msgstr "Rang de casos: Vincles" #: src/ui/gui/rank.ui:788 msgid "_Mean" msgstr "_Mitjana" #: src/ui/gui/rank.ui:806 msgid "_Low" msgstr "Baix" #: src/ui/gui/rank.ui:825 msgid "_High" msgstr "Superior" #: src/ui/gui/rank.ui:851 msgid "_Sequential ranks to unique values" msgstr "Rangs _Sequencials per a valors únics" #: src/ui/gui/rank.ui:875 msgid "Rank Assigned to Ties" msgstr "Rang assignat a empats" #: src/ui/gui/runs.ui:155 msgid "M_ean" msgstr "M_itjana" #: src/ui/gui/runs.ui:171 msgid "Mo_de" msgstr "M_oda" #: src/ui/gui/runs.ui:191 msgid "_Custom:" msgstr "_Personalitzat:" #: src/ui/gui/runs.ui:230 msgid "Cut Point" msgstr "Punt de tall" #: src/ui/gui/sort.ui:25 msgid "Sort Cases" msgstr "Ordenar Casos" #: src/ui/gui/sort.ui:101 msgid "Sort by:" msgstr "Ordenat per:" #: src/ui/gui/sort.ui:174 msgid "Descending" msgstr "Descendent" #: src/ui/gui/sort.ui:196 msgid "Sort Order" msgstr "Ordre" #: src/ui/gui/split-file.ui:25 msgid "Split File" msgstr "Divideix Arxiu" #: src/ui/gui/split-file.ui:103 msgid "Anal_yze all cases. Do not create groups." msgstr "Analitzar tots els casos. No crear grups." #: src/ui/gui/split-file.ui:121 msgid "Compare _groups." msgstr "Comparar grups." #: src/ui/gui/split-file.ui:140 msgid "Organize ou_tput by groups." msgstr "Organitzar els resultats per grups." #: src/ui/gui/split-file.ui:225 msgid "Groups _based on:" msgstr "Grups _basats en:" #: src/ui/gui/split-file.ui:255 msgid "_Sort the file by grouping variables." msgstr "Ordena l'arxiu segons les variables d'agrupació." #: src/ui/gui/split-file.ui:273 msgid "_File is already sorted." msgstr "L'arxiu ja está ordenat." #: src/ui/gui/split-file.ui:334 msgid "Current Status : " msgstr "Estatus actual : " #: src/ui/gui/split-file.ui:348 msgid "Analysis by groups is off" msgstr "L'anàlisi per grups està activat" #: src/ui/gui/recode.ui:135 msgid "System _Missing" msgstr "Perdut del Sistema" #: src/ui/gui/recode.ui:150 msgid "Co_py old values" msgstr "Co_piar els valors antics" #: src/ui/gui/recode.ui:172 msgid "Va_lue: " msgstr "Va_lor:" #: src/ui/gui/recode.ui:276 msgid "Conver_t numeric strings to numbers (`5' -> 5)" msgstr "Conver_tir cadenes alfanumèriques en números (`5' -> 5)" #: src/ui/gui/recode.ui:297 msgid "Output variables are _strings" msgstr "Les variables de sortida son alfabètique_s" #: src/ui/gui/recode.ui:318 msgid "Width: " msgstr "Ample:" #: src/ui/gui/recode.ui:499 msgid "_Name:" msgstr "_Nom:" #: src/ui/gui/recode.ui:527 msgid "La_bel:" msgstr "Etiqueta:" #: src/ui/gui/recode.ui:556 msgid "Chan_ge" msgstr "Canvi" #: src/ui/gui/recode.ui:584 msgid "Output Variable" msgstr "Variables de sortida" #: src/ui/gui/recode.ui:658 msgid "Old and New Va_lues..." msgstr "Va_lors antics i nous..." #: src/ui/gui/regression.ui:51 msgid "S_tatistics..." msgstr "E_stadístics..." #: src/ui/gui/regression.ui:272 msgid "Regression: Save" msgstr "Regresió: Desar" #: src/ui/gui/regression.ui:290 src/ui/gui/univariate.ui:42 msgid "_Predicted values" msgstr "Valors _Predits" #: src/ui/gui/regression.ui:307 src/ui/gui/univariate.ui:59 msgid "_Residuals" msgstr "_Residuals" #: src/ui/gui/regression.ui:351 msgid "Regression: Statistics" msgstr "Regresió: Estadìstics" #: src/ui/gui/regression.ui:393 src/ui/gui/univariate.ui:143 msgid "S_tatistics" msgstr "E_statístics" #: src/ui/gui/reliability.ui:34 msgid "Alpha" msgstr "Alpha" #: src/ui/gui/reliability.ui:43 msgid "Reliability Analysis" msgstr "Anàlsisi de fiabilitat" #: src/ui/gui/reliability.ui:144 msgid "_Items:" msgstr "_Items:" #: src/ui/gui/reliability.ui:166 msgid "_Model: " msgstr "_Model: " #: src/ui/gui/reliability.ui:212 msgid "_Variables in first split:" msgstr "_Variables a la primera divisió:" #: src/ui/gui/reliability.ui:259 msgid "Show _descriptives for scale if item is deleted" msgstr "Mostrar _descriptius per escala si l'item és esborrat" #: src/ui/gui/roc.ui:145 msgid "_Test Variable:" msgstr "Variable de prova:" #: src/ui/gui/roc.ui:175 msgid "_State Variable:" msgstr "Variable d'Estat:" #: src/ui/gui/roc.ui:202 msgid "_Value of state variable:" msgstr "_Valor de la variable d'estat:" #: src/ui/gui/roc.ui:249 msgid "ROC C_urve" msgstr "Corba ROC" #: src/ui/gui/roc.ui:269 msgid "_With diagonal reference line" msgstr "Amb línia de referència diagonal" #: src/ui/gui/roc.ui:293 msgid "Standard _Error and Confidence Interval" msgstr "_Error típic i Interval de Confiança" #: src/ui/gui/roc.ui:309 msgid "_Coordinate points of the ROC Curve" msgstr "_Coordenades de la Corba ROC" #: src/ui/gui/scatterplot.ui:25 msgid "Scatterplot" msgstr "Gràfica de punts" #: src/ui/gui/scatterplot.ui:56 msgid "_X Axis:" msgstr "Eix _X:" #: src/ui/gui/scatterplot.ui:100 msgid "_Y Axis:" msgstr "Eix _Y:" #: src/ui/gui/select-cases.ui:37 msgid "Select Cases: Range" msgstr "Seleccionar casos: Rang" #: src/ui/gui/select-cases.ui:87 msgid "First case" msgstr "Primer cas" #: src/ui/gui/select-cases.ui:99 msgid "Last case" msgstr "Últim cas" #: src/ui/gui/select-cases.ui:111 msgid "Observation" msgstr "Observació" #: src/ui/gui/select-cases.ui:161 msgid "Select Cases" msgstr "Seleccionar casos" #: src/ui/gui/select-cases.ui:313 msgid "Use filter variable" msgstr "Utilitzar variable de filtre" #: src/ui/gui/select-cases.ui:380 msgid "Based on time or case range" msgstr "Basat en interval de temps o casos" #: src/ui/gui/select-cases.ui:395 msgid "Range..." msgstr "Interval..." #: src/ui/gui/select-cases.ui:444 msgid "Random sample of cases" msgstr "Mostra aleatoria de casos" #: src/ui/gui/select-cases.ui:460 msgid "Sample..." msgstr "Mostra..." #: src/ui/gui/select-cases.ui:508 msgid "If condition is satisfied" msgstr "si la condició es satisfà" #: src/ui/gui/select-cases.ui:523 msgid "If..." msgstr "si..." #: src/ui/gui/select-cases.ui:567 msgid "All Cases" msgstr "Tots els Casos:" #: src/ui/gui/select-cases.ui:581 msgid "Select" msgstr "Selecciona" #: src/ui/gui/select-cases.ui:608 msgid "Filtered" msgstr "Filtrat" #: src/ui/gui/select-cases.ui:625 msgid "Deleted" msgstr "Eliminat" #: src/ui/gui/select-cases.ui:647 msgid "Unselected Cases Are" msgstr "Els casos no seleccionats son" #: src/ui/gui/select-cases.ui:694 msgid "Select Cases: Random Sample" msgstr "Seleccionar casos: Mostra aleatoria" #: src/ui/gui/select-cases.ui:756 msgid "Sample Size" msgstr "Grandaria de mostra" #: src/ui/gui/t-test.ui:25 msgid "Options" msgstr "Opcions" #: src/ui/gui/t-test.ui:63 msgid "Exclude cases _analysis by analysis" msgstr "Excloure casos _anàlisi per analìsi" #: src/ui/gui/t-test.ui:148 msgid "One - Sample T Test" msgstr "Prova T per una mostra" #: src/ui/gui/t-test.ui:265 msgid "Test _Value: " msgstr "_Valor de Prova: " #: src/ui/gui/text-data-import.ui:32 msgid "Select the first line of the data file that contains data." msgstr "Seleccionar la primera linia del'arxiu que conté dades." #: src/ui/gui/text-data-import.ui:54 msgid "Line above selected line contains variable names" msgstr "La linia sobre la linia seleccionada contè els noms de les variables" #: src/ui/gui/text-data-import.ui:80 msgid "" "Check the data formats displayed below and fix any that are incorrect. You " "may set other variable properties now or later." msgstr "" "Comprovar les formats de les dades mostrades a continuació i corregir els " "problemes. Es pot asignar altres propietats de les variables ara o més tard." #: src/ui/gui/text-data-import.ui:121 msgid "Variables" msgstr "Variables" #: src/ui/gui/text-data-import.ui:152 msgid "Data Preview" msgstr "Previsualització de dades" #: src/ui/gui/text-data-import.ui:181 msgid "" "This assistant will guide you through the process of importing data into " "PSPP from a text file with one line per case, in which fields are separated " "by tabs, commas, or other delimiters.\n" "\n" "\tThe selected file contains N lines of text. Only the first M of these " "will be shown for preview purposes in the following screens. You may choose " "below how much of the file should actually be imported." msgstr "" "Aquest assitent t'acompanyarà per tot el procés d'importar dades al PSPP des " "d'un arxiu de text amb una linia per cas, al qual els camps estan separats " "per tabuladors, comas, o altres delimitadors.\n" "\n" "\tL'arxiu seleccionat conté N linies de text. Només les primeres M seran " "mostrades per previsualització a les pantalles seguents. Pots triar a " "continuació quina part de l'arxiu ha de ser importat." #: src/ui/gui/text-data-import.ui:252 msgid "All cases" msgstr "Tots els casos" #: src/ui/gui/text-data-import.ui:272 msgid "Amount to Import" msgstr "Quantitat a importar" #: src/ui/gui/text-data-import.ui:325 msgid "C_ustom" msgstr "_Usuari" #: src/ui/gui/text-data-import.ui:341 msgid "Slas_h (/)" msgstr "Barra (/)" #: src/ui/gui/text-data-import.ui:357 msgid "Semicolo_n (;)" msgstr "Punt i coma (;)" #: src/ui/gui/text-data-import.ui:373 msgid "P_ipe (|)" msgstr "Tub (|)" #: src/ui/gui/text-data-import.ui:389 msgid "H_yphen (-)" msgstr "Guionet (-)" #: src/ui/gui/text-data-import.ui:405 msgid "Co_mma (,)" msgstr "Coma (,)" #: src/ui/gui/text-data-import.ui:421 msgid "_Colon (:)" msgstr "Dos punts (:)" #: src/ui/gui/text-data-import.ui:437 msgid "Ban_g (!)" msgstr "Exclamació (!)" #: src/ui/gui/text-data-import.ui:453 msgid "Ta_b" msgstr "Tabulador" #: src/ui/gui/text-data-import.ui:469 msgid "_Space" msgstr "E-spai" #: src/ui/gui/text-data-import.ui:490 msgid "Separators" msgstr "Separadors" #: src/ui/gui/text-data-import.ui:541 msgid "Quote separator characters with" msgstr "Separar caracters amb comilla" #: src/ui/gui/text-data-import.ui:561 msgid "Quoting" msgstr "Comilles" #: src/ui/gui/text-data-import.ui:599 msgid "Fields Preview" msgstr "Previsualitza camps" #: src/ui/gui/text-data-import.ui:622 msgid "" "Enter below the sheet number and the cell range which you wish to import." msgstr "" "Introdueix a continuació el número de full i el rang de cel.les que es vol " "importar." #: src/ui/gui/text-data-import.ui:670 msgid "_Cells: " msgstr "_Cel.les: " #: src/ui/gui/text-data-import.ui:684 msgid "_Sheet Index: " msgstr "Index de full de càlcul: " #: src/ui/gui/text-data-import.ui:695 msgid "Use first row as _variable names" msgstr "Utilitzar la primera fila com a noms de _variables" #: src/ui/gui/text-data-import.ui:717 msgid "Cells to Import" msgstr "Cel.les a importar" #: src/ui/gui/transpose.ui:24 msgid "Transpose" msgstr "Trasposar" #: src/ui/gui/transpose.ui:91 msgid "Name Variable:" msgstr "Nom de Variable:" #: src/ui/gui/transpose.ui:127 msgid "Variable(s):" msgstr "Variable(s):" #: src/ui/gui/univariate.ui:25 msgid "Univariate: Save" msgstr "Univariat: Desar" #: src/ui/gui/univariate.ui:103 msgid "Univariate: Statistics" msgstr "Univariat: Estadístics" #: src/ui/gui/univariate.ui:178 msgid "Univariate" msgstr "Univariat" #: src/ui/gui/univariate.ui:281 msgid "_Dependent Variable" msgstr "Variable(s) _Dependent(s):" #: src/ui/gui/univariate.ui:329 msgid "_Fixed Factors" msgstr "_Factors Fixes:" #: src/ui/gui/val-labs-dialog.ui:101 msgid "Value Label:" msgstr "Etiqueta de Valor:" #: src/ui/gui/data-editor.ui:33 msgid "Information Area" msgstr "Àrea d'Informació" #: src/ui/gui/data-editor.ui:55 msgid "Case Counter Area" msgstr "Area del Recompte" #: src/ui/gui/data-editor.ui:80 msgid "Filter Use Status Area" msgstr "Area del Filtre" #: src/ui/gui/data-editor.ui:106 msgid "Weight Status Area" msgstr "Area de Ponderació" #: src/ui/gui/data-editor.ui:132 msgid "Split File Status Area" msgstr "Area de Divisió" #: src/ui/gui/data-editor.ui:154 msgid "_View" msgstr "_Veure" #: src/ui/gui/data-editor.ui:157 msgid "_Status Bar" msgstr "Barra d'E_stat" #: src/ui/gui/data-editor.ui:163 msgid "_Font..." msgstr "_Font..." #: src/ui/gui/data-editor.ui:167 msgid "_Grid Lines" msgstr "_Linies divisories" #: src/ui/gui/data-editor.ui:171 msgid "Value _Labels" msgstr "Etiquetes de _Valors" #: src/ui/gui/data-editor.ui:182 msgid "_Variables" msgstr "_Variables:" #: src/ui/gui/data-editor.ui:192 msgid "_Sort Cases..." msgstr "Ordenar Casos..." #: src/ui/gui/data-editor.ui:196 msgid "_Transpose..." msgstr "_Transposar..." #: src/ui/gui/data-editor.ui:200 msgid "_Aggregate..." msgstr "_Agregar..." #: src/ui/gui/data-editor.ui:206 msgid "S_plit File..." msgstr "Divideix Arxiu..." #: src/ui/gui/data-editor.ui:210 msgid "Select _Cases..." msgstr "Seleccionar _Casos..." #: src/ui/gui/data-editor.ui:214 msgid "_Weight Cases..." msgstr "Ponderar Casos..." #: src/ui/gui/data-editor.ui:220 msgid "_Transform" msgstr "_Transformar" #: src/ui/gui/data-editor.ui:223 msgid "_Compute..." msgstr "_Calcular..." #: src/ui/gui/data-editor.ui:227 msgid "Cou_nt..." msgstr "Reco_mpte..." #: src/ui/gui/data-editor.ui:231 msgid "Ran_k Cases..." msgstr "Rang de Casos..." #: src/ui/gui/data-editor.ui:235 msgid "Auto_matic Recode..." msgstr "Recodificació Auto_màtica..." #: src/ui/gui/data-editor.ui:241 msgid "Recode into _Same Variables..." msgstr "Recodificar a les Mateixe_s Variables..." #: src/ui/gui/data-editor.ui:245 msgid "Recode into _Different Variables..." msgstr "Recodificar a Variables _Diferents..." #: src/ui/gui/data-editor.ui:251 msgid "_Run Pending Transforms" msgstr "Executa_r Transformacions pendents" #: src/ui/gui/data-editor.ui:257 msgid "_Analyze" msgstr "_Analitzar" #: src/ui/gui/data-editor.ui:260 msgid "_Descriptive Statistics" msgstr "Estadística _Descriptiva" #: src/ui/gui/data-editor.ui:262 msgid "_Frequencies..." msgstr "_Freqüències..." #: src/ui/gui/data-editor.ui:270 msgid "_Explore..." msgstr "_Explorar..." #: src/ui/gui/data-editor.ui:274 msgid "_Crosstabs..." msgstr "Taules _Creuades..." #: src/ui/gui/data-editor.ui:279 msgid "Compare _Means" msgstr "Comparar _Mitjanes" #: src/ui/gui/data-editor.ui:281 msgid "_Means..." msgstr "_Mitjanes..." #: src/ui/gui/data-editor.ui:285 msgid "_One Sample T Test..." msgstr "Prova T per una mostra..." #: src/ui/gui/data-editor.ui:289 msgid "_Independent Samples T Test..." msgstr "Prova T per a Mostres _Independents..." #: src/ui/gui/data-editor.ui:293 msgid "_Paired Samples T Test..." msgstr "Prova T per a Mostres A_parellades..." #: src/ui/gui/data-editor.ui:297 msgid "One Way _ANOVA..." msgstr "_ANOVA d'un factor..." #: src/ui/gui/data-editor.ui:302 msgid "_Univariate Analysis..." msgstr "Anàlisi Univariada..." #: src/ui/gui/data-editor.ui:306 msgid "Bivariate _Correlation..." msgstr "_Correlació Bivariada..." #: src/ui/gui/data-editor.ui:310 msgid "_K-Means Cluster..." msgstr "Conglomerat K-Mitjanes..." #: src/ui/gui/data-editor.ui:314 msgid "_Factor Analysis..." msgstr "Anàlisi _Factorial..." #: src/ui/gui/data-editor.ui:318 msgid "Re_liability..." msgstr "Fiabi_litat..." #: src/ui/gui/data-editor.ui:322 msgid "_Regression" msgstr "_Regressió" #: src/ui/gui/data-editor.ui:325 msgid "_Linear..." msgstr "_Lineal..." #: src/ui/gui/data-editor.ui:329 msgid "_Binary Logistic..." msgstr "_Binaria Logística..." #: src/ui/gui/data-editor.ui:335 msgid "_Non-Parametric Statistics" msgstr "Proves _No-Paramétriques" #: src/ui/gui/data-editor.ui:338 msgid "_Chi Square..." msgstr "_Chi Quadrada..." #: src/ui/gui/data-editor.ui:342 msgid "_Binomial..." msgstr "_Binomial..." #: src/ui/gui/data-editor.ui:346 msgid "_Runs..." msgstr "Execucions..." #: src/ui/gui/data-editor.ui:350 msgid "_1 Sample K-S..." msgstr "_1 Mostra K-S..." #: src/ui/gui/data-editor.ui:354 msgid "_2 Related Samples..." msgstr "_2 Mostres Aparellades..." #: src/ui/gui/data-editor.ui:358 msgid "_K Related Samples..." msgstr "_K Mostres Aparellades..." #: src/ui/gui/data-editor.ui:362 msgid "K _Independent Samples..." msgstr "K Mostres _Independents..." #: src/ui/gui/data-editor.ui:368 msgid "ROC Cur_ve..." msgstr "Corba ROC..." #: src/ui/gui/data-editor.ui:374 msgid "_Graphs" msgstr "_Grafiques" #: src/ui/gui/data-editor.ui:377 msgid "_Scatterplot" msgstr "Gràfica de punt_s" #: src/ui/gui/data-editor.ui:381 msgid "_Histogram" msgstr "_Histograma" #: src/ui/gui/data-editor.ui:385 msgid "_Barchart" msgstr "Gràfica de _Barres" #: src/ui/gui/data-editor.ui:391 msgid "_Utilities" msgstr "_Utilitats" #: src/ui/gui/data-editor.ui:394 msgid "_Variables..." msgstr "_Variables..." #: src/ui/gui/data-editor.ui:398 msgid "Data File _Comments..." msgstr "_Comentaris arxiu de dades..." #: src/ui/gui/output-window.ui:71 msgid "_Print..." msgstr "Im_primir..." #: src/ui/gui/output-window.ui:76 msgid "_Export..." msgstr "_Exportar..." #: src/ui/gui/output-window.ui:92 msgid "Select _All" msgstr "Seleccion_a Tot" #: src/ui/gui/syntax-editor.ui:27 msgid "Syntax" msgstr "Sintaxi" #: src/ui/gui/syntax-editor.ui:31 msgid "Data" msgstr "Dades" #: src/ui/gui/syntax-editor.ui:41 msgid "_Save" msgstr "De_sar" #: src/ui/gui/syntax-editor.ui:46 msgid "Save _As" msgstr "Desar com _A" #: src/ui/gui/syntax-editor.ui:53 msgid "_Print" msgstr "Im_primir" #: src/ui/gui/syntax-editor.ui:84 msgid "_Delete" msgstr "Elimina" #: src/ui/gui/syntax-editor.ui:90 msgid "_Undo" msgstr "Desfer" #: src/ui/gui/syntax-editor.ui:94 msgid "_Redo" msgstr "Refer" #: src/ui/gui/syntax-editor.ui:100 #, fuzzy #| msgid "Find" msgid "_Find" msgstr "Cerca" #: src/ui/gui/syntax-editor.ui:106 msgid "_Run" msgstr "Executa_r" #: src/ui/gui/syntax-editor.ui:109 msgid "_All" msgstr "Tot" #: src/ui/gui/syntax-editor.ui:113 msgid "_Selection" msgstr "_Selecció" #: src/ui/gui/syntax-editor.ui:117 msgid "_Current Line" msgstr "Línia A_ctual" #: src/ui/gui/syntax-editor.ui:122 msgid "_To End" msgstr "Fins al final" #: src/ui/gui/var-type-dialog.ui:99 msgid "Scientific notation" msgstr "Notació científica" #: src/ui/gui/var-type-dialog.ui:150 msgid "Custom currency" msgstr "Moneda propia" #: src/ui/gui/var-type-dialog.ui:267 msgid "positive" msgstr "positiu" #: src/ui/gui/var-type-dialog.ui:279 msgid "negative" msgstr "negatiu" #: src/ui/gui/var-type-dialog.ui:293 msgid "Sample" msgstr "Mostra" #: src/ui/gui/var-type-dialog.ui:350 msgid "Width:" msgstr "Ample:" #: src/ui/gui/var-type-dialog.ui:396 msgid "Decimal Places:" msgstr "Llocs decimals:" #: src/ui/gui/weight.ui:24 msgid "Weight Cases" msgstr "Ponderar Casos" #: src/ui/gui/weight.ui:100 msgid "Weight cases by" msgstr "Pondera casos per" #: src/ui/gui/weight.ui:144 msgid "Frequency Variable" msgstr "Variable de Freqüència" #: src/ui/gui/weight.ui:198 msgid "Current Status: " msgstr "Estatus actual: " #. TRANSLATORS: This is the application name in the desktop file #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:7 #: src/ui/gui/org.fsf.pspp.desktop.in:7 msgid "GNU PSPP" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:8 #, fuzzy #| msgid "A program for the analysis of sampled data" msgid "GNU PSPP is a program for statistical analysis of sampled data" msgstr "Un programa per a l'anàlisi de dades de mostreig" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:10 msgid "" "GNU PSPP is a program for the statistical analysis of sampled data. It is a " "Free replacement for the proprietary program SPSS, and appears very similar " "to it with a few exceptions. The most important of these exceptions are, " "that there are no “time bombs”; your copy of PSPP will not “expire” or " "deliberately stop working in the future. Neither are there any artificial " "limits on the number of cases or variables which you can use. There are no " "additional packages to purchase in order to get “advanced” functions; all " "functionality that PSPP currently supports is in the core package." msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:11 msgid "" "PSPP is a stable and reliable application. It can perform descriptive " "statistics, T-tests, anova, linear and logistic regression, measures of " "association, cluster analysis, reliability and factor analysis, non-" "parametric tests and more. Its backend is designed to perform its analyses " "as fast as possible, regardless of the size of the input data. You can use " "PSPP with its graphical interface or the more traditional syntax commands." msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:12 msgid "A brief list of some of the PSPP's features." msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:14 msgid "Support for over 1 billion cases" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:15 msgid "Support for over 1 billion variables" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:16 msgid "Syntax and data files which are compatible with those of SPSS" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:17 msgid "A choice of terminal or graphical user interface" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:18 msgid "A choice of text, postscript, pdf, opendocument or html output formats" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:19 msgid "" "Inter-operability with: LibreOffice, Apache OpenOffice, Gnumeric and other " "free software" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:20 msgid "Easy data import from spreadsheets, text files and database sources" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:21 msgid "" "The capability to open, analyse and edit two or more datasets concurrently" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:22 msgid "A user interface supporting all common character sets" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:23 msgid "A user interface has been translated to multiple languages" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:24 msgid "Very fast statistical procedures, even on very large data sets" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:25 msgid "No license fees and no expiration period" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:26 msgid "No unethical “end user license agreements”" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:27 msgid "A fully indexed user manual" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:28 msgid "Freedom ensured; It is licensed under the GPLv3 or later" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:29 msgid "" "Portability; Runs on many different computers and many different operating " "systems" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:31 msgid "" "PSPP is particularly aimed at statisticians, social scientists and students " "requiring fast convenient analysis of sampled data." msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:41 #, fuzzy #| msgid "Variable View" msgid "GNU PSPP Variable View" msgstr "Vista de Variables" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:54 msgid "Free Software Foundation" msgstr "" #: src/ui/gui/org.fsf.pspp.desktop.in:8 msgid "Statistical Software" msgstr "Programari estadístic" #: src/ui/gui/org.fsf.pspp.desktop.in:9 msgid "Analyze statistical data with a free alternative to SPSS" msgstr "Analitza dades estadístiques amb una alternativa lliure a SPSS" #. TRANSLATORS: Do not translate this string. Keep it as is, verbatim. #: src/ui/gui/org.fsf.pspp.desktop.in:12 msgid "pspp" msgstr "" #. TRANSLATORS: You must keep all ";" - also at the end of line. #: src/ui/gui/org.fsf.pspp.desktop.in:17 msgid "statistics;analysis;spss;" msgstr "" #~ msgid "Sorry. The help system hasn't yet been implemented." #~ msgstr "Disculpeu. El sistema d'ajuda encara no ha estat implementat." #~ msgid "Support for %s files was not compiled into this installation of PSPP" #~ msgstr "" #~ "Aquesta instal·lació de PSPP no s'ha compilat amb suport per a arxius %s " #~ msgid "Details" #~ msgstr "Detalls" #~ msgid "Multiple dichotomy set" #~ msgstr "Conjunt de Dicotomies Múltiples" #~ msgid "Multiple category set" #~ msgstr "Conjunt de Categories Múltiples" #~ msgid "Label source" #~ msgstr "Font d'etiqueta" #~ msgid "First variable label among variables" #~ msgstr "Primera etiqueta de variable entre les variables" #~ msgid "Provided by user" #~ msgstr "Proporcionat per l'usuari" #~ msgid "Category label source" #~ msgstr "Font d'etiquetes de categoria" #~ msgid "Variable labels" #~ msgstr "Etiquetes de variable" #~ msgid "Value labels of counted value" #~ msgstr "Etiquetes de valor del valor de recompte" #~ msgid "Label:" #~ msgstr "Etiqueta:" #~ msgid "No label." #~ msgstr "Sense etiqueta." #~ msgid "Product:" #~ msgstr "Producte:" #~ msgid "Variables:" #~ msgstr "Variables:" #~ msgid "Cases:" #~ msgstr "Casos:" #~ msgid "Type:" #~ msgstr "Tipus:" #~ msgid "Description" #~ msgstr "Descripció" #~ msgid "The active dataset does not have a file label." #~ msgstr "L'arxiu de dades actiu no té etiqueta d'arxiu." #~ msgid "File label: %s" #~ msgstr "Etiqueta d'arxiu: %s" #~ msgid "The active dataset dictionary does not contain any documents." #~ msgstr "El diccionari de l'arxiu de dades actiu no conté cap document. " #~ msgid "Documents in the active dataset:" #~ msgstr "Documents a l'arxiu de dades actiu:" #~ msgid "Custom data file attributes." #~ msgstr "Atributs personalitzats d'arxiu de dades." #~ msgid "Label: %s\n" #~ msgstr "Etiqueta: %s\n" #~ msgid "Format: %s\n" #~ msgstr "Format: %s\n" #~ msgid "Print Format: %s\n" #~ msgstr "Format d'Impressió: %s\n" #~ msgid "Write Format: %s\n" #~ msgstr "Format d'Escriptura: %s\n" #~ msgid "Measure: %s\n" #~ msgstr "Mesura: %s\n" #~ msgid "Role: %s\n" #~ msgstr "Rol: %s\n" #~ msgid "Display Alignment: %s\n" #~ msgstr "Alineació mostrada: %s\n" #~ msgid "Display Width: %d\n" #~ msgstr "Amplada mostrada: %d\n" #~ msgid "Missing Values: " #~ msgstr "Valors perduts:" #~ msgid "Interactive shell not supported on this platform." #~ msgstr "" #~ "Interpret d'ordres interactiu no disponible per a aquesta plataforma." #~ msgid "Error executing command: %s." #~ msgstr "Error d'execució del comandament: %s." #~ msgid "Unknown TABLECELLS class" #~ msgstr "Clase TABLECELLS desconeguda" #~ msgid "Exact Sig. (%d-tailed)" #~ msgstr "Sig. Exact.(%d-tailed)" #~ msgid "Valid N" #~ msgstr "N vàlids" #~ msgid "Missing N" #~ msgstr "Perduts N" #~ msgid "Valid cases = %.*g; cases with missing value(s) = %.*g." #~ msgstr "Casos vàlids = %.*g; casos amb valor(s) perdut(s) = %.*g." #~ msgid "%g" #~ msgstr "%g" #~ msgid "%d" #~ msgstr "%d" #~ msgid "%zu" #~ msgstr "%zu" #~ msgid "50 (Median)" #~ msgstr "50 (Mediana)" #~ msgid "(%d)" #~ msgstr "(%d)" #~ msgid "Min" #~ msgstr "Min." #~ msgid "Max" #~ msgstr "Màx." #~ msgid "%g%%" #~ msgstr "%g%%" #~ msgid "25th" #~ msgstr "25è" #~ msgid "50th (Median)" #~ msgstr "50è (Mediana)" #~ msgid "75th" #~ msgstr "75è" #~ msgid "(I) %s" #~ msgstr "(I) %s" #~ msgid "(J) %s" #~ msgstr "(J) %s" #~ msgid "(I - J)" #~ msgstr "(I - J)" #~ msgid "%s into %s(%s of %s using %s BY %s)" #~ msgstr "%s en %s(%s de %s utilitzant %s BY %s)" #~ msgid "%s into %s(%s of %s BY %s)" #~ msgstr "%s en %s(%s de %s BY %s)" #~ msgid "%s into %s(%s of %s using %s)" #~ msgstr "%s en %s(%s de %s utilitzant %s)" #~ msgid "%s into %s(%s of %s)" #~ msgstr "%s en %s(%s de %s)" #~ msgid "Area Under the Curve (%s)" #~ msgstr "Àrea Sota la Corba (%s)" #~ msgid "Coordinates of the Curve (%s)" #~ msgstr "Coordenades de la Corba (%s)" #~ msgid "Std. Error Mean" #~ msgstr "Error Est. Mitjana" #~ msgid "(active dataset)" #~ msgstr "(arxiu de dades actiu)" #~ msgid "Writing %zu record to %s." #~ msgid_plural "Writing %zu records to %s." #~ msgstr[0] "Escribint el registre %zu a %s." #~ msgstr[1] "Escribint %zu registres a %s." #~ msgid "Writing %zu record." #~ msgid_plural "Writing %zu records." #~ msgstr[0] "Escribint el registre %zu." #~ msgstr[1] "Escrivint %zu registres." #~ msgid "Unsupported compression type (%d)" #~ msgstr "Tipus de compressió no suportada (%d)" #~ msgid "Failed to seek to end of central directory record: %s" #~ msgstr "Falla en cercar el registre al final del directori central: %s" #~ msgid "Failed to seek to central directory: %s" #~ msgstr "Falla en cercar el directori central: %s" #~ msgid "Failed to seek to start of member `%s': %s" #~ msgstr "Falla en cercar l'inicio del membre `%s': %s" #~ msgid "ascii: closing output file `%s'" #~ msgstr "ascii: tancant l'arxiu de sortida `%s'" #~ msgid "%s - Page %d" #~ msgstr "%s - Pàgina %d" #~ msgid "bad vline: x=%d+%d=%d y=(%d+%d=%d,%d+%d=%d) in table size (%d,%d)\n" #~ msgstr "" #~ "bad vline: x=%d+%d=%d y=(%d+%d=%d,%d+%d=%d) a taula de mida (%d,%d)\n" #~ msgid "bad hline: x=(%d+%d=%d,%d+%d=%d) y=%d+%d=%d in table size (%d,%d)\n" #~ msgstr "" #~ "incorrecta hline: x=(%d+%d=%d,%d+%d=%d) y=%d+%d=%d a taula de mida (%d," #~ "%d)\n" #~ msgid "" #~ "bad box: (%d+%d=%d,%d+%d=%d)-(%d+%d=%d,%d+%d=%d) in table size (%d,%d)\n" #~ msgstr "" #~ "bad box: (%d+%d=%d,%d+%d=%d)-(%d+%d=%d,%d+%d=%d) en taula amb mida (%d," #~ "%d)\n" #~ msgid "Cannot parse field content `%.*s' as format %s: %s" #~ msgstr "" #~ "No es possible construïr l'arxiu de contingut `%.*s' com a format %s: %s" #~ msgid "This input line has too few separators to fill in this field." #~ msgstr "" #~ "Aquesta linia d'entrada no en te prou separadors per emplenar el camp" #~ msgid "An error occurred reading the spreadsheet file." #~ msgstr "Error llegint un arxiu de full de càlcul." #~ msgid "Enter a number to add a new variable." #~ msgstr "Introdueix un número per afegir una variable nova." #~ msgid "Enter a number to add a new case." #~ msgstr "Introdueix un número per afegir un nou cas." #~ msgid "Cannot create variable." #~ msgstr "Impossible crear la variable." #~ msgid "\"%s\" is not a valid variable name." #~ msgstr "\"%s\" no és un nom de variable vàlid." #~ msgid "This dictionary already contains a variable named \"%s\"." #~ msgstr "Ja existeix una variable anomenada \"%s\" a aquest diccionary." #~ msgid "Cannot rename variable." #~ msgstr "Impossible re-anomenar la variable." #~ msgid "Enter a variable name to add a new variable." #~ msgstr "Introdueix un nom de variable per afegir una nova variable." #~ msgid "{%s, %s}\n" #~ msgstr "{%s, %s}\n" #~ msgid "can only convert encrypted data file to sav or sys format" #~ msgstr "" #~ "només es poden convertir arxius de dades codificats al format sav o sys" #~ msgid "can only convert encrypted syntax file to sps format" #~ msgstr "només es poden convertir arxius de dades codificats al format sps" #~ msgid "count" #~ msgstr "recompte" #~ msgid "expected" #~ msgstr "esperat" #~ msgid "residual" #~ msgstr "residual" #~ msgid "std. resid." #~ msgstr "residu tipificat" #~ msgid "adj. resid." #~ msgstr "resid.ajust." #~ msgid "Chi-square tests." #~ msgstr "Proves Chi-quadrat." #~ msgid "Odds Ratio for %s (%.*s / %.*s)" #~ msgstr "Raó de diferències per a %s (%.*s / %.*s)" #~ msgid "For cohort %s = %.*g" #~ msgstr "Per a la cohort %s = %.*g" #~ msgid "For cohort %s = %.*s" #~ msgstr "Per cohort %s = %.*s" #~ msgid "Multiple response set name `%s' does not begin with `$'." #~ msgstr "El nom de conjunt multiresposta anomenat `%s' no comença amb `$'." #~ msgid "could not access definition for terminal `%s'" #~ msgstr "no es pot accedir a la definició per a terminal `%s'" #~ msgid "" #~ "PSPPIRE, a GUI for PSPP, a program for statistical analysis of sampled " #~ "data.\n" #~ "Usage: %s [OPTION]... FILE\n" #~ "\n" #~ "Arguments to long options also apply to equivalent short options.\n" #~ "\n" #~ "GUI options:\n" #~ " -q, --no-splash don't show splash screen during startup\n" #~ "\n" #~ "%sLanguage options:\n" #~ " -I, --include=DIR append DIR to search path\n" #~ " -I-, --no-include clear search path\n" #~ " -a, --algorithm={compatible|enhanced}\n" #~ " set to `compatible' if you want output\n" #~ " calculated from broken algorithms\n" #~ " -x, --syntax={compatible|enhanced}\n" #~ " set to `compatible' to disable PSPP " #~ "extensions\n" #~ " -i, --interactive interpret syntax in interactive mode\n" #~ " -s, --safer don't allow some unsafe operations\n" #~ "Default search path: %s\n" #~ "\n" #~ "Informative output:\n" #~ " -h, --help display this help and exit\n" #~ " -V, --version output version information and exit\n" #~ "\n" #~ "A non-option argument is interpreted as a data file in .sav or .zsav or ." #~ "por\n" #~ "format or a syntax file to load.\n" #~ msgstr "" #~ "PSPPIRE, un entorn gràfic (GUI) per PSPP, programa per l'anàlisi " #~ "estatistic de dades mostrals.\n" #~ "Ús: %s [OPTION]... FILE\n" #~ "\n" #~ "Els arguments per a opcions llargues s'apliquen també a opcions curtes " #~ "equivalents.\n" #~ "\n" #~ "Opcions de GUI:\n" #~ " -q, --no-splash no mostrar la pantalla inicial \n" #~ "\n" #~ "Opcions de llenguatge %s:\n" #~ " -I, --include=DIR afegeix DIR a la ruta de cerca\n" #~ " -I-, --no-include netejar la ruta de cerca\n" #~ " -a, --algorithm={compatible|enhanced}\n" #~ " marcar com `compatible' si es prefereix la " #~ "sortida\n" #~ " calculada a partir d'algoritmes trencats\n" #~ " -x, --syntax={compatible|enhanced}\n" #~ " maracar com `compatible' per desactivar les " #~ "extensions de PSPP\n" #~ " -i, --interactive interpretar la sintaxis en mode interactiu\n" #~ " -s, --safer no permet algunes operacions poc segures\n" #~ "Ruta de cerca per defecte:%s\n" #~ "\n" #~ "Informació:\n" #~ " -h, --help mostra aquesta ajuda i surt\n" #~ " -V, --version mostra informació sobre la versió i surt\n" #~ "\n" #~ "Arguments sense opcions son interpretats com arxius .sav, .zsav, .por\n" #~ "o arxius de sintaxis per executar.\n" #~ msgid "_Reset" #~ msgstr "_Reiniciar" #~ msgid "_Select" #~ msgstr "_Selecionar" #~ msgid "Delete the variables at the selected position(s)" #~ msgstr "Esborra les variables a la posició(ns) selecconada(es)" #~ msgid "Delete the cases at the selected position(s)" #~ msgstr "Esborra els casos a la(es) posició(ns) seleccionada(es)" #~ msgid "_Open..." #~ msgstr "_Obert..." #~ msgid "Transpose the cases with the variables" #~ msgstr "Transposar casos i variables" #~ msgid "Aggregate the case values into a new variable" #~ msgstr "Agregarar els valors de cas sobre una altra variable" #~ msgid "Choose a subset of cases for analysis" #~ msgstr "Selecciona un subconjunt de casos per analitzar" #~ msgid "All" #~ msgstr "Tots" #~ msgid "expecting number or data string" #~ msgstr "esperant nombre o cadena de dades" #~ msgid "Number of clusters may not be larger than the number of cases." #~ msgstr "El nombre d'agrupament no pot ser més gran que el nombre de casos." #~ msgid "Value of %s must be between 1 and 100." #~ msgstr "El valor de %s ha de ser entre 1 i 100." #~ msgid "TreeView path" #~ msgstr "Ruta a Vista Jeràrquica" #~ msgid "The path to the row in the GtkTreeView, as a string" #~ msgstr "" #~ "La ruta a la fila a la Vista Jeràrquica GTK, com a cadena alfabética" #~ msgid "Diagonal slash" #~ msgstr "Barra diagonal" #~ msgid "Whether to draw a diagonal slash across the button." #~ msgstr "Si s'ha de fer una barra diagonal creuant el butó." #~ msgid "Incorrect value for variable type" #~ msgstr "Valor incorrecte pel tipus de variable" #~ msgid "Font Selection" #~ msgstr "Selecció de font" #~ msgid "Import Delimited Text Data" #~ msgstr "Importar dades de text delimitat" #~ msgid "(optional case selection condition)" #~ msgstr "(condició opcional de selecció de casos)" #~ msgid "Importing Textual Data" #~ msgstr "Important dades textuals" #~ msgid "Doubled quote mark treated as escape" #~ msgstr "La marca \" es tractada con a ESCAPE" #~ msgid "Bar charts are not implemented." #~ msgstr "El gràfic de barres no està implementat." #~ msgid "No valid data for variable %s; statistics not displayed." #~ msgstr "" #~ "No hi ha dades vàlides per a la variable %s; not es mostren estadístiques." #~ msgid "Weighting variable must be numeric (not string variable `%s')." #~ msgstr "" #~ "Variable de ponderació ha de ser numèrica (no la variable de text `%s')." #~ msgid "Duplicate variable name `%s'." #~ msgstr "Nom de la variable `%s' duplicat." #~ msgid "`%s' does not begin with `$' at offset %zu in MRSETS record." #~ msgstr "`%s' not comença amb `$' a la posició %zu d'un registre MRSETS." #~ msgid "Duplicate variable name %s at offset %zu in MRSETS record." #~ msgstr "" #~ "Nom de la variable %s duplicat a la posició %zu d'un registre MRSETS." #~ msgid "Truncating variable label for variable `%s' to %d bytes." #~ msgstr "Truncant la etiqueta de variable `%s' a %d caràcters." #~ msgid "%s is allowed only inside INPUT PROGRAM." #~ msgstr "%s només es permet dins de INPUT PROGRAM." #~ msgid "%s is allowed only inside FILE TYPE." #~ msgstr "%s només es permet dins de FILE TYPE." #~ msgid "" #~ "DELETE VARIABLES may not be used after TEMPORARY. Temporary " #~ "transformations will be made permanent." #~ msgstr "" #~ "DELETE VARIABLES no pot ser utilitzat després de TEMPORARY. Les " #~ "transformacions temporals seran permanents." #~ msgid "" #~ "DROP subcommand may be given at most once. It may not be given in " #~ "conjunction with the KEEP subcommand." #~ msgstr "" #~ "El subcomando DROP pot ser utilitzat només una vegada. No pot ser " #~ "utilitzat conjuntament amb el subcomando KEEP." #~ msgid "" #~ "RENAME VARS may not be used after TEMPORARY. Temporary transformations " #~ "will be made permanent." #~ msgstr "" #~ "RENAME VARS no pot ser utilitzat després de TEMPORARY. Les " #~ "transformacions temporals seran permanents." #~ msgid "Charset:" #~ msgstr "Conjunt de caràcters:" #~ msgid "Expecting MEAN, MEDIAN, MODE or number" #~ msgstr "S'espera MEAN, MEDIAN, MODE o un nombre" #~ msgid "The END subcommand may be used only with DATA LIST FIXED." #~ msgstr "El subcomando END només potser utilitzat amb DATA LIST FIXED." #~ msgid "Value of FIXCASE must be at least 1." #~ msgstr "Valor de FIXCASE ha de ser com a mínim 1." #~ msgid "Value of FIRST must be at least 1." #~ msgstr "Valor de FIRST ha de ser com a mínim 1." #~ msgid "Type: %s\n" #~ msgstr "Tipus: %s\n" #~ msgid "Missing Values: %s\n" #~ msgstr "Valors perduts: %s\n" #~ msgid "Value Labels:\n" #~ msgstr "Etiqueteas de valor:\n" #~ msgid "%s %s\n" #~ msgstr "%s %s\n" #~ msgid "WORKSPACE must be at least 1MB" #~ msgstr "WORKSPACE ha de ser com a mínim 1 Mb" #~ msgid "expecting AUTOMATIC or year" #~ msgstr "esperant AUTOMATICA o any" #~ msgid "LENGTH must be at least 1." #~ msgstr "LENGTH ha de ser com a mínim 1." #~ msgid "WIDTH must be at least 40." #~ msgstr "WIDTH ha de ser com a mínim 40." #~ msgid "RESTORE without matching PRESERVE." #~ msgstr "RESTORE sense el corresponent PRESERVE." #~ msgid "Variables %s specified multiple times on GROUPED subcommand." #~ msgstr "La variable %s s'ha especificat més d'una vegada a l'ordre GROUPED." #~ msgid "Variables %s specified on GROUPED but not on VARIABLES." #~ msgstr "Variables %s especificades a GROUPED però no a VARIABLES." #~ msgid "Mode:" #~ msgstr "Mode:" #~ msgid "on" #~ msgstr "activat" #~ msgid "off" #~ msgstr "desactivat" #~ msgid "Insert Cases" #~ msgstr "Insertar Casos" #~ msgid "Processor Area" #~ msgstr "Area del processador" #~ msgid "Error opening `%s' for reading as a Gnumeric file: %s." #~ msgstr "Error en obrir `%s' per a la lectura com a arxiu Gnumeric: %s." #~ msgid "" #~ "Error opening `%s' for reading as a OpenDocument spreadsheet file: %s." #~ msgstr "" #~ "Error en obrir `%s' per a la lectura com a arxiu full de càlcul " #~ "OpenDocument: %s." #~ msgid "VAR%05d" #~ msgstr "VAR%05d" #~ msgid "_Options" #~ msgstr "_Opcions" #~ msgid "REGRESSION requires numeric variables." #~ msgstr "REGRESSION requereix variables numèriques." #~ msgid "Statistics..." #~ msgstr "Estatística" #~ msgid "Exclude cases listwise" #~ msgstr "Exclou casos segons llista" #~ msgid "By:" #~ msgstr "Per:" #~ msgid "Rankit" #~ msgstr "Rankit" #~ msgid "_Import Delimited Text Data..." #~ msgstr "_Importar Dades de Text Delimitat..." #~ msgid "Linear _Regression..." #~ msgstr "_Regressió Lineal..." #~ msgid "Unknown variable format %." #~ msgstr "Format de variable % desconegut." #~ msgid "print" #~ msgstr "imprimir" #~ msgid "write" #~ msgstr "escriure" #~ msgid "" #~ "%s is allowed only before the active dataset has been defined or inside " #~ "INPUT PROGRAM." #~ msgstr "" #~ "%s només es permet abans que l'arxiu de dades actiu s'ha definit o dins " #~ "de INPUT PROGRAM." #~ msgid "" #~ "%s is allowed only after the active dataset has been defined or inside " #~ "INPUT PROGRAM." #~ msgstr "" #~ "%s només es permet després que l'arxiu de dades actiu s'ha definit, o " #~ "dins de INPUT PROGRAM." #~ msgid "missing required subcommand %s" #~ msgstr "subordre requerida %s absent" #~ msgid "expecting `%s'" #~ msgstr "esperant '%s'" #~ msgid "String expected." #~ msgstr "Cadena esperada." #~ msgid "`(' expected after variable list." #~ msgstr "`(' esperat després de la llista de variables." #~ msgid "`)' expected after output format." #~ msgstr "`)' esperat després del format de resultats." #~ msgid "%s subcommand may be given at most once." #~ msgstr "El subcomando %s pot ser utilitzat només una vegada." #~ msgid "`(' expected on %s subcommand." #~ msgstr "S'espera `(' al subcomando %s." #~ msgid "`)' expected following variable names on REORDER subcommand." #~ msgstr "" #~ "`)' s'esperava seguit dels noms de la variable en el subcomando REORDER." #~ msgid "" #~ "`=' expected between lists of new and old variable names on RENAME " #~ "subcommand." #~ msgstr "" #~ "`=' esperat entre les llistes de noms de variables noves i velles en el " #~ "subcomando RENAME." #~ msgid "`)' expected after variable lists on RENAME subcommand." #~ msgstr "" #~ "`)' esperat després de les llistes de variables en el subcomando RENAME." #~ msgid "`/' or `.' expected." #~ msgstr "'/' o '.' esperat." #~ msgid "`(' expected." #~ msgstr "'(' esperat." #~ msgid "`=' expected between lists of new and old variable names." #~ msgstr "`=' esperat entre llistes de nous i antics noms de la variable." #~ msgid "`)' expected after variable names." #~ msgstr "`)' esperat després dels noms de variables." #~ msgid "expecting file name" #~ msgstr "esperant nom d'arxiu" #~ msgid "expecting %s or %s after %s" #~ msgstr "s'espera %s o %s darrera %s" #~ msgid "Number of contrast coefficients must equal the number of groups" #~ msgstr "" #~ "El nombre de coeficients de contrast ha de ser igual al nombre de grups." #~ msgid "Variables cannot be parsed" #~ msgstr "No es poden generar les variables" #~ msgid "Cases >= Test Value" #~ msgstr "Casos >= Valor de prova" #~ msgid "`A' or `D' expected inside parentheses." #~ msgstr "S'espera `A' or `D' dins del parèntesis." #~ msgid "`)' expected." #~ msgstr "`)' esperat." #~ msgid "`=' expected after variable list." #~ msgstr "`=' esperat després de llista de variables." #~ msgid "expecting `,' or `)' invoking %s function" #~ msgstr "esperant `,' o `)' invocant la funció %s" #~ msgid "Unrecognized record type 7, subtype %d." #~ msgstr "Tipus de registre 7 no reconegut, subtipe %d." #~ msgid "Bad size (%zu) or count (%zu) field on record type 7, subtype 3." #~ msgstr "" #~ "Camp de longitud (%zu) o quantitat (%zu) invàlids en el registre tipus 7, " #~ "subtipus 3." #~ msgid "Bad size (%zu) or count (%zu) on extension 4." #~ msgstr "Longitud (%zu) o quantitat (%zu) de l'extensió 4 no vàlid." #~ msgid "Missing space following `%c' at offset %zu in MRSETS record" #~ msgstr "Espai perdut darrera `%c' a la posició %zu al registre MRSETS" #~ msgid "" #~ "Unexpected label source value `%s' following `E' at offset %zu in MRSETS " #~ "record" #~ msgstr "" #~ "Valor d'etiqueta no esperat `%s' darrera `E' a la posició %zu del " #~ "registre MRSETS" #~ msgid "Bad size %zu on extension 11." #~ msgstr "Amplada no vàlida %zu en l'extensió 11." #~ msgid "%s: Error parsing attribute value %s[%d]" #~ msgstr "%s: Error en analitzar valor de l'atribut %s[%d]" #~ msgid "%s: Attribute value %s[%d] is not quoted: %s" #~ msgstr "%s: El valor de l'atribut %s[%d] no esta entre cometes: %s" #~ msgid "Bad size %zu for extended number of cases." #~ msgstr "Longitud no vàlid %zu per nombre extens de casos." #~ msgid "Bad count %zu for extended number of cases." #~ msgstr "Recompte incorrecte %zu per nombre extens de casos." #~ msgid "" #~ "Variable name length in long string value label record (%d) exceeds %d-" #~ "byte limit." #~ msgstr "" #~ "La longitud del nom de la variable al registre de l'etiqueta del valor de " #~ "cadena llarga (%d) supera el límit %d-byte." #~ msgid "`)' expected after GROUPED interval list." #~ msgstr "`)' esperat després de la llista de variables GRUPED." #~ msgid "" #~ "FRACTION has been specified, but NORMAL and PROPORTION rank functions " #~ "have not been requested. The FRACTION subcommand will be ignored." #~ msgstr "" #~ "S'ha especificat FRACTION, però no s'ahn demanat funcions de rang NORMAL " #~ "o PROPORTION. La subordre FRACTION será ignorada." #~ msgid "One or more VARIABLES must be specified." #~ msgstr "Una o més VARIABLES han de ser especificades." #~ msgid "At least two variables must be specified on PAIRS." #~ msgstr "Al menys dos variables s'han d'especificar a PAIRS." #~ msgid "No label" #~ msgstr "Sense etiqueta" #~ msgid "Suppress value labels" #~ msgstr "Suprimides les etiquetes de variable" #~ msgid "Labeling" #~ msgstr "Etiquetant" #~ msgid "" #~ "Scratch file handle %s has not yet been written, using SAVE or another " #~ "procedure, so it cannot yet be used for reading." #~ msgstr "" #~ "El manipulador de l'arxius de treball %s encara no s'ha escrit, " #~ "utilitzant SAVE o altre procediment, de manera que encara no es pot " #~ "llegir." #~ msgid "scratch file" #~ msgstr "arxiu de treball" #~ msgid "Missing space following `%c' at UTF-8 offset %zu in MRSETS record." #~ msgstr "" #~ "Espai perdut darrera `%c' a la posició UTF-8 %zu d'un registre MRSETS." #~ msgid "" #~ "Unexpected label source value `%s' following `E' at UTF-8 offset %zu in " #~ "MRSETS record." #~ msgstr "" #~ "Valor d'etiqueta no esperat `%s' darrera `E' a la posició UTF-8 %zu d'un " #~ "registre MRSETS." #~ msgid "PSPP-data" #~ msgstr "datos-PSPP" #~ msgid "%s %s PSPPIRE %s" #~ msgstr "%s %s PSPPIRE %s" #~ msgid "Duplicate variable name %s in position %d." #~ msgstr "Nom de la variable %s duplicat en la posició %d." #~ msgid "" #~ "Recoded variable name duplicates an existing `%s' within system file." #~ msgstr "" #~ "El nom de la variable recodificada duplica `%s' existent dins de l'arxiu " #~ "de sistema." #~ msgid "Variable name begins with invalid character `%c'." #~ msgstr "El nom de la variable comença amb el caràctar invàlid `%c'." #~ msgid "Duplicate variable name `%s' within system file." #~ msgstr "Nom de variable '%s' duplicat dins de l'arxiu de sistema." #~ msgid "Document line contains null byte." #~ msgstr "Una línia del document conté un byte nul." #~ msgid "Duplicate long variable name `%s' within system file." #~ msgstr "Nom de la variable llarga '%s' duplicat dins de l'arxiu de sistema." #~ msgid "Invalid number of labels: %d. Ignoring labels." #~ msgstr "Nombre d'etiquetes invàlid: %d. Ignorant etiquetes." #~ msgid "Reading `%s': %s." #~ msgstr "Llegint `%s': %s." #~ msgid "Closing `%s': %s." #~ msgstr "Tancant `%s': %s." #~ msgid "%s does not form a valid number." #~ msgstr "%s no constitueix un número vàlid." #~ msgid "binary" #~ msgstr "binari" #~ msgid "octal" #~ msgstr "octal" #~ msgid "hex" #~ msgstr "hexadecimal" #~ msgid "Unexpected end of file in string concatenation." #~ msgstr "Final d'arxiu inesperat a la concatenació de cadenes." #~ msgid "incorrect use of TO convention" #~ msgstr "ús incorrecte de la convenció TO" #~ msgid "DO REPEAT without END REPEAT." #~ msgstr "DO REPEAT sense END REPEAT." #~ msgid "DO REPEAT may not nest in compatibility mode." #~ msgstr "DO REPEAT no pot usar-se recursivament en mode de comptabilitat." #~ msgid "%s is too long for a variable name." #~ msgstr "%s és massa llarg per un nom de variable." #~ msgid "%zu-byte string needed but %zu-byte string supplied." #~ msgstr "" #~ "Es necessita cadena de %zu-byte però s'han subministrat de %zu-byte." #~ msgid "Hexadecimal floating constant too long." #~ msgstr "Constant hexadecimal flotant massa llarga." #~ msgid "" #~ "%s conversion of %s from %s to %s should have produced %s but actually " #~ "produced %s." #~ msgstr "" #~ "conversió %s de %s desde %s a %s s'hauria d'haver produït %s però " #~ "actualment ha produït %s." #~ msgid "Too many values in single command." #~ msgstr "Massa valors en el comandament únic." #~ msgid "Unexpected token: `%s'." #~ msgstr "Testimoni inesperat: `%s'." #~ msgid "Unable to open `%s': %s." #~ msgstr "No es pot obrir `%s': %s." #~ msgid "Analyse" #~ msgstr "Analitzar" #~ msgid "column %d" #~ msgstr "columna %d" #~ msgid "columns %d-%d" #~ msgstr "columnes %d-%d" #~ msgid "%s field) " #~ msgstr "%s camp)" #~ msgid "%s: Creating temporary file: %s." #~ msgstr "%s: Creant arxiu temporal: %s" #~ msgid "Missing space following 'E' at offset %zu in MRSETS record" #~ msgstr "Espai perdut darrera 'E' en la possició %zu a registre MRSETS" #~ msgid "Syntax error %s at %s." #~ msgstr "Error de sintaxi %s a %s." #~ msgid "String exceeds 255 characters in length (%zu characters)." #~ msgstr "La cadena supera els 255 caràcters de longitud (%zu caràcters)." #~ msgid "expecting ATTRIBUTE= or DELETE=" #~ msgstr "esperant ATTRIBUTE= o DELETE=" #~ msgid "expecting `('" #~ msgstr "esperant `('" #~ msgid "String expected for variable label." #~ msgstr "S'espera una cadena com a etiqueta de variable." #~ msgid "Expecting BATCH or INTERACTIVE after SYNTAX." #~ msgstr "Esperant BATCH o INTERACTIVE després de SYNTAX." #~ msgid "Expecting YES or NO after CD." #~ msgstr "Esperant YES o NO després del CD." #~ msgid "Expecting CONTINUE or STOP after ERROR." #~ msgstr "Esperant CONTINUE o bé STOP després de l'ERROR." #~ msgid "while expecting COLUMNWISE" #~ msgstr "mentrestant esperant COLUMNWISE" #~ msgid "expecting BREAK" #~ msgstr "esperant BREAK" #~ msgid "expecting `)'" #~ msgstr "esperant `)'" #~ msgid "Sig. 1-tailed" #~ msgstr "Sig. (1-cua)" #~ msgid "Error closing FLIP source file: %s." #~ msgstr "Error de tancament de l'arxiu de font FLIP: %s." #~ msgid "expecting FIXED or DELIMITED" #~ msgstr "esperant FIXED o DELIMITED" #~ msgid "expecting LINE or VARIABLES" #~ msgstr "esperant LINE o VARIABLES" #~ msgid "expecting VARIABLES" #~ msgstr "esperant VARIABLES" #~ msgid "expecting COMM or TAPE" #~ msgstr "esperant COMM o TAPE" #~ msgid "COLUMN subcommand multiply specified." #~ msgstr "subcomando COLUMN especificat múltiples vegades." #~ msgid "hash table:" #~ msgstr "taula hash:" #~ msgid "Warnings (%d) exceed limit (%d)." #~ msgstr "Avisos (%d) excedeixen el límit (%d)." #~ msgid "Errors (%d) exceed limit (%d)." #~ msgstr "Els errors (%d) excedeixen el límit (%d)." #~ msgid "Field content \"%.*s\" cannot be parsed in format %s." #~ msgstr "El contingut del camp \"%.*s\" no pot ser analitzat en format %s." #~ msgid "expecting BY" #~ msgstr "esperant BY" #~ msgid "Asymp. Sig. (2-sided)" #~ msgstr "Sig. Asimp. (2-cues)" #~ msgid "Exact Sig. (2-sided)" #~ msgstr "Sig. Exacta (2-cues)" #~ msgid "Exact Sig. (1-sided)" #~ msgstr "Sig. Exacta (1-cua)" #~ msgid "Multivariate GLM not yet supported" #~ msgstr "GLM multivariable encara no disponible" #~ msgid "Missing required subcommand TABLES." #~ msgstr "Falta subordre requerida TABLES" #~ msgid "TABLES subcommand may not appear more than once." #~ msgstr "El subcomando TABLES no pot apareixer més d'una vegada." #~ msgid "`%s' is not a variable name" #~ msgstr "`%s' no és un nom de variable" #~ msgid "Buttons" #~ msgstr "Botons" #~ msgid "The mask that decides what buttons appear in the button box" #~ msgstr "La màscara que decideix quins botons apareixen a la caixa de botons" #~ msgid "The dictionary to be displayed by this widget" #~ msgstr "El diccionari que es mostrarà amb aquest widget" #~ msgid "A predicate function" #~ msgstr "Una funció de predicat" #~ msgid "How many things can be selected" #~ msgstr "Quantes coses es poden seleccionar" #~ msgid "searching for \"%s\" in path \"%s\"" #~ msgstr "cercant \"%s\" dins la carpeta \"%s\"" #~ msgid "...found \"%s\"" #~ msgstr "...\"%s\" trobat" #~ msgid "...not found" #~ msgstr "...no es troba" #~ msgid "little-endian" #~ msgstr "little-endian" #~ msgid "big-endian" #~ msgstr "big-endian" #~ msgid "Compressed data is corrupt." #~ msgstr "Les dades comprimides estan malmeses." #~ msgid "opening \"%s\" as syntax file" #~ msgstr "obrint \"%s\" com a arxiu de sintaxi" #~ msgid "%s is not allowed inside INPUT PROGRAM." #~ msgstr "%s no es permet dins de INPUT PROGRAM." #~ msgid "REORDER subcommand may be given at most once." #~ msgstr "El subcomando REORDER pot ser emès més d'un cop." #~ msgid "`(' expected on REORDER subcommand." #~ msgstr "`(' esperat en el subcomando REORDER." #~ msgid "Unknown." #~ msgstr "Desconegut." #~ msgid "System File." #~ msgstr "Arxiu de Sistema." #~ msgid "S E Mean" #~ msgstr "Mitj. E.E." #~ msgid "S E Kurt" #~ msgstr "Curt.E.E." #~ msgid "S E Skew" #~ msgstr "Asim.E.E." #~ msgid "BY is required when TABLE is specified." #~ msgstr "BY és necessari quan TABLE és especificat." #~ msgid "opening font metrics file \"%s\"" #~ msgstr "obrint arxiu de mètriques d'origen \"%s\"" #~ msgid "first line must be StartFontMetrics" #~ msgstr "la primera línia ha de ser StarFontMetrics" #~ msgid "unsupported MappingScheme %d" #~ msgstr "MappingScheme %d no suportat" #~ msgid "required FontName is missing" #~ msgstr "Manca el FontName requerit" #~ msgid "CharMetrics line must start with C or CH" #~ msgstr "La línia CharMetrics ha de començar amb C o H" #~ msgid "reference to unknown character \"%s\"" #~ msgstr "referència al caràcter desconegut \"%s\"" #~ msgid "expected end of file" #~ msgstr "fi d'arxiu esperat" #~ msgid "number out of valid range" #~ msgstr "número fora de l'interval vàlid" #~ msgid "invalid numeric syntax" #~ msgstr "sintaxi numèrica invàlida" #~ msgid "syntax error expecting integer" #~ msgstr "error de sintaxi tot esperant un sencer" #~ msgid "syntax error expecting number" #~ msgstr "error de sintaxi tot esperant un número" #~ msgid "syntax error in hex constant" #~ msgstr "error de sintaxi en constant hexadecimal" #~ msgid "syntax error expecting hex constant" #~ msgstr "error de sintaxi quan s'esperava un hexadecimal" #~ msgid "unexpected end of line" #~ msgstr "final de línia inesperat" #~ msgid "unexpected end of line expecting string" #~ msgstr "final de línia inesperat quan s'esperava una cadena" #~ msgid "" #~ "ascii: bad index value for `box' key: syntax is box[INDEX], 0 <= INDEX < " #~ "%d decimal, with INDEX expressed in base 4" #~ msgstr "" #~ "ascii: índex de valor defectuós per a la clau `box' : la sintaxi és la " #~ "box[INDEX], 0 <= INDEX < %d decimal, amb INDEX expressat en base 4" #~ msgid "ascii: multiple values for %s" #~ msgstr "ascii: valors múltiples per a %s" #~ msgid "ascii: only screen devices may have `auto' length or width" #~ msgstr "" #~ "ascii: només els dispositius de pantalla poden tenir longitud o amplada " #~ "`auto'" #~ msgid "ascii: positive integer required as `%s' value" #~ msgstr "ascii: enter positiu requerit com a valor `%s'" #~ msgid "ascii: `emphasis' value must be `bold', `underline', or `none'" #~ msgstr "" #~ "ascii: el valor d' `emphasis' ha de ser `bold', `underline', o `none'" #~ msgid "ascii: zero or positive integer required as `%s' value" #~ msgstr "ascii: zero o enter positiu requerit com a valor `%s'" #~ msgid "ascii: boolean value expected for `%s'" #~ msgstr "ascii: valor booleà esperat per a `%s'" #~ msgid "`chart-files' value must contain `#'" #~ msgstr "`chart-files' ha de contenir el valor `#'" #~ msgid "ascii: bad line (%d,%d)-(%d,%d) out of (%d,%d)\n" #~ msgstr "ascii: línia defectuosa (%d,%d)-(%d,%d) de (%d,%d)\n" #~ msgid "opening HTML output file: %s" #~ msgstr "obrint arxiu de resultat HTML: %s" #~ msgid "unknown configuration parameter `%s' for HTML device driver" #~ msgstr "" #~ "paràmetre de configuració `%s' desconegut per al dispositiu controlador " #~ "HTML" #~ msgid "unknown output driver `%s'" #~ msgstr " controlador de sortida desconegut `%s'" #~ msgid "output driver `%s' referenced but never defined" #~ msgstr "controlador de sortida `%s' referenciat però mai definit" #~ msgid "using default output driver configuration" #~ msgstr "utilitzant controlador de configuració de resultats per defecte" #~ msgid "" #~ "cannot find output initialization file (use `-vv' to view search path)" #~ msgstr "" #~ "no es pot trobar l'arxiu d'inicialització de resultats (utilitzar `-vv' " #~ "per a veure la ruta de cerca)" #~ msgid "cannot open \"%s\"" #~ msgstr "no es pot obrir \"%s\"" #~ msgid "reading \"%s\"" #~ msgstr "llegint \"%s\"" #~ msgid "error closing \"%s\"" #~ msgstr "error en tancar \"%s\"" #~ msgid "no active output drivers" #~ msgstr "no hi ha controladors de sortida actius" #~ msgid "error reading device definition file" #~ msgstr "error llegint l'arxiu de definició del dispositiu" #~ msgid "" #~ "Driver classes:\n" #~ "\t" #~ msgstr "" #~ "Clases de controlador:\n" #~ "\t" #~ msgid "" #~ "reached end of options inside quoted string parsing options for \"%s\" " #~ "driver" #~ msgstr "" #~ "Arribat al final d'opcions dins de la cadena entre cometes tot analitzant " #~ "opcions pel controlador \"%s\"" #~ msgid "syntax error in string constant parsing options for \"%s\" driver" #~ msgstr "" #~ "error de sintaxi en una constant de cadena analitzant opcions pel " #~ "controlador \"%s\"" #~ msgid "syntax error expecting `=' parsing options for driver \"%s\"" #~ msgstr "" #~ "error de sintaxi quan s'esperava `=' analitzant les opcions pel " #~ "controlador \"%s\"" #~ msgid "unknown output driver class `%.*s'" #~ msgstr "controlador de sortida de classe desconeguda `%.*s'" #~ msgid "unknown device type `%.*s'" #~ msgstr "tipus de dispositiu desconegut `%.*s'" #~ msgid "driver definition line missing driver name or class name" #~ msgstr "" #~ "línia de definició del controlador sense nom del controlador o nom de la " #~ "classe" #~ msgid "opening PostScript output file \"%s\"" #~ msgstr "obrir l'arxiu de sortida PostScript \"%s\"" #~ msgid "closing PostScript output file \"%s\"" #~ msgstr "tanqui l'arxiu de sortida PostScript \"%s\"" #~ msgid "unknown configuration parameter `%s' for PostScript device driver" #~ msgstr "" #~ "paràmetre de configuració desconegut`%s' pel controlador del dispositiu " #~ "PostScript" #~ msgid "" #~ "unknown orientation `%s' (valid orientations are `portrait' and " #~ "`landscape')" #~ msgstr "" #~ "orientació desconeguda `%s' (les orientacions vàlides són `retrat' i " #~ "`paisatge')" #~ msgid "boolean value expected for %s" #~ msgstr "valor booleà esperat per a %s" #~ msgid "positive integer value required for `%s'" #~ msgstr "valor enter positiu necessari per a `%s'" #~ msgid "" #~ "default font size must be at least 1 point (value of 1000 for key `%s')" #~ msgstr "" #~ "la mida de caràcter per defecte ha de ser com a mínim 1 punt (valor de " #~ "1000 per la clau `%s')" #~ msgid "could not find AFM file \"%s\"" #~ msgstr "no es pot trobar l'arxiu AFM \"%s\"" #~ msgid "could not find font \"%s\"" #~ msgstr "no es pot trobar el caràcter \"%s\"" #~ msgid "could not find encoding \"%s\"" #~ msgstr "no es pot trobar la codificació \"%s\"" #~ msgid "reading font file \"%s\"" #~ msgstr "llegint l'arxiu de caràcter \"%s\"" #~ msgid "cannot open font encoding file \"%s\"" #~ msgstr "no es pot obrir el fitxer de codificació del caràcter \"%s\"" #~ msgid "invalid numeric format" #~ msgstr "format numèric no vàlid" #~ msgid "closing Postscript encoding \"%s\"" #~ msgstr "tancament de codificació Postscript \"%s\"" #~ msgid "creating \"%s\"" #~ msgstr "creant \"%s\"" #~ msgid "" #~ "set to `compatible' if you want output calculated from broken algorithms" #~ msgstr "" #~ "activeu `compatible' si voleu obtenir resultats calculat a partir " #~ "d'algorismes trencats" #~ msgid "Append DIR to include path" #~ msgstr "Adjuntar DIR a la ruta d'inclusió" #~ msgid "Clear include path" #~ msgstr "Esborrar la ruta d'inclusió" #~ msgid "Disable execution of .pspp/rc at startup" #~ msgstr "Deshabilitar l'execució de .pspp/rc a l'inici" #~ msgid "Set configuration directory to DIR" #~ msgstr "Establir DIR com a directori de configuració" #~ msgid "Don't allow some unsafe operations" #~ msgstr "No permet algunes operacions insegures" #~ msgid "" #~ "Set to `compatible' if you want only to accept SPSS compatible syntax" #~ msgstr "" #~ "Activeu `compatible' si només voleu acceptar la sintaxi compatible de " #~ "l'SPSS" #~ msgid "PSPP --- A program for statistical analysis" #~ msgstr "PSPP ---Un programa d'anàlisi estadística" #~ msgid "FILE1, FILE2 ... FILEn" #~ msgstr "FILE1, FILE2 ... FILEn" #~ msgid "Options affecting input and output locations:" #~ msgstr "Opcions que afecten a ubicacions d'entrada i sortida:" #~ msgid "Diagnostic options:" #~ msgstr "Opcions de diagnòstic:" #~ msgid "Options affecting syntax and behavior:" #~ msgstr "Opcions que afecten a la sintaxi i al comportament:" #~ msgid "Cannot open %s (%s). Writing errors to stdout instead.\n" #~ msgstr "" #~ "No es pot obrir %s (%s). Alternativament, escrivint errors a stdout.\n" #~ msgid "Terminating execution of syntax file due to error." #~ msgstr "Finalitzant l'execució de l'arxiu de sintaxi degut a un error." #~ msgid "Increase diagnostic verbosity level" #~ msgstr "Augmentar el nivell de verbositat del diagnòstic" #~ msgid "Send error messages to FILE (appended)" #~ msgstr "Enviar missatges d'error a FILE (annexa)" #~ msgid "Select output driver DEVICE and disable defaults" #~ msgstr "" #~ "Seleccionar el controlador de sortida DEVICE i desactivar els valors per " #~ "defecte" #~ msgid "Print a list of known driver classes, then exit" #~ msgstr "" #~ "Imprimir una llista de classes de controladors coneguts, després sortir" #~ msgid "Start an interactive session" #~ msgstr "Inici d'una sessió interactiva" #~ msgid "Style of bevel around the custom entry button" #~ msgstr "Estil de bisell al voltant del botó d'entrada personalitzada" #~ msgid "Cannot open reference manual: %s" #~ msgstr "No es pot obrir el manual de referència: %s" #~ msgid "PSPPIRE --- A user interface for PSPP" #~ msgstr "PSPPIRE --- Una interfície d'usuari per a PSPP" #~ msgid "Miscellaneous options:" #~ msgstr "Diverses opcions:" #~ msgid "data file error" #~ msgstr "Error en l'arxiu de dades" #~ msgid "PSPP error" #~ msgstr "Error de PSPP" #~ msgid "syntax warning" #~ msgstr "avís de sintaxi" #~ msgid "data file warning" #~ msgstr "avís de l'arxiu de dades" #~ msgid "PSPP warning" #~ msgstr "avís de PSPP" #~ msgid "syntax information" #~ msgstr "informació de sintaxi" #~ msgid "data file information" #~ msgstr "informació de l'arxiu de dades" #~ msgid "PSPP information" #~ msgstr "Informació del PSPP" #~ msgid "The PSPP processing engine reported the following message:" #~ msgid_plural "The PSPP processing engine reported the following messages:" #~ msgstr[0] "El processador de PSPP ha donat el seguent missatge:" #~ msgstr[1] "El processador de PSPP ha donat el seguent missatge:" #~ msgid "The PSPP processing engine reported %d message." #~ msgid_plural "The PSPP processing engine reported %d messages." #~ msgstr[0] "El processador de PSPP ha donat el missatge %d." #~ msgstr[1] "El processador de PSPP ha donat el missatge %d." #~ msgid "%d of these messages are displayed below." #~ msgid_plural "%d of these messages are displayed below." #~ msgstr[0] "%d d'aquests missatges es mostren a continuació." #~ msgstr[1] "%d d'aquests missatges es mostren a continuació." #~ msgid "Clear" #~ msgstr "Eliminar" #~ msgid "Open a data file" #~ msgstr "Obrir un arxiu de dades" #~ msgid "New data file" #~ msgstr "Nou arxiu de dades" #~ msgid "Import text data file" #~ msgstr "Importar arxiu de text" #~ msgid "Select cases from the active file" #~ msgstr "Seleccionar cassos de l'arxiu actiu" #~ msgid "Compute new values for a variable" #~ msgstr "Calcular nous valors per a la variable" #~ msgid "Calculate T Test for samples from independent groups" #~ msgstr "Calcula proves T per a mostres de grups independents" #~ msgid "Calculate T Test for paired samples" #~ msgstr "Calcula proves T per a mostres aparellades" #~ msgid "Calculate T Test for sample from a single distribution" #~ msgstr "Calcula proves T per a mostra d'una distribució única" #~ msgid "Commentary text for the data file" #~ msgstr "Comentario textual per a l'arxiu de dades" #~ msgid "Recode values into different variables" #~ msgstr "Recodificar valors a diferents variables" #~ msgid "Calculate descriptive statistics (mean, variance, ...)" #~ msgstr "Calcular estadístques descriptives (mitjana, variancia,...)" #~ msgid "Generate frequency statistics" #~ msgstr "Generar estadístiques de freqüències" #~ msgid "Examine Data by Factors" #~ msgstr "Examinar les dades segons Factors" #~ msgid "Estimate parameters of the linear model" #~ msgstr "Estimar parámetres del model lineal" #~ msgid "Split the window vertically and horizontally" #~ msgstr "Dividir la finestra verticalment i horizontalment" #~ msgid "Open Syntax" #~ msgstr "Obrir sintaxi" #~ msgid "Var 1" #~ msgstr "Var 1" #~ msgid "Var 2" #~ msgstr "Var 2" #~ msgid "gtk-find" #~ msgstr "gtk-find" #~ msgid "Recall" #~ msgstr "Refer" #~ msgid "Use Sets" #~ msgstr "Utilitzar conjunts" #~ msgid "Ascending Counts" #~ msgstr "Recompte Ascendent" #~ msgid "Descending Counts" #~ msgstr "Recompte Descendent" #~ msgid "Supress tables with more than N categories" #~ msgstr "Suprimir les taules amb més de N categories" #~ msgid "Maximum no of categories" #~ msgstr "Màxim nombre de categories" #~ msgid "Messages Reported" #~ msgstr "S'han generat missatges" #~ msgid "" #~ "The PSPP processor reported # errors. The first # and last # are shown " #~ "below:" #~ msgstr "" #~ "El processador d'PSPP ha genrat # errors. Els primers # y els darrers # " #~ "es mostren a continuació:" #~ msgid "gtk-close" #~ msgstr "tanca-gtk" #~ msgid "gtk-go-back" #~ msgstr "gtk-go-back" #~ msgid "gtk-go-forward" #~ msgstr "gtk-go-forward" #~ msgid "gtk-save" #~ msgstr "gtk-save" #~ msgid "gtk-save-as" #~ msgstr "gtk-save-as" #~ msgid "gtk-copy" #~ msgstr "gtk-copy" #~ msgid "System-Missing" #~ msgstr "Perduts del sistema" #~ msgid "" #~ "At most one of BARCHART, HISTOGRAM, or HBAR should be given. HBAR will " #~ "be assumed. Argument values will be given precedence increasing along " #~ "the order given." #~ msgstr "" #~ "Al menys s'ha de donar algun BARCHART, HISTOGRAM o HBAR. S'assumeix " #~ "HBAR. Els valors d'arguments Argument tindrán preferencia creixent en " #~ "aquest mateix ordre)." #~ msgid "Variable %s specified multiple times on VARIABLES subcommand." #~ msgstr "" #~ "La variable %s s'ha especificat més d'una vegada a l'ordre VARIABLES." #~ msgid "Cum" #~ msgstr "Acumulat" #~ msgid "Freq" #~ msgstr "Freq" #~ msgid "Pct" #~ msgstr "Pct" #~ msgid "N of items" #~ msgstr "N d'elements" #~ msgid "`/FORMAT WEIGHT' specified, but weighting is not on." #~ msgstr "`/FORMAT WEIGHT' especificat, però la ponderació no està activada." pspp-1.4.1/po/sl.po0000644000175000017500000115376513725012645013536 0ustar00blpblp00000000000000# Slovenian translations for pspp. # Copyright (C) 2012, 2013 Free Software Foundation, Inc. # This file is distributed under the same license as the pspp package. # # Matej Kovačič , 2012. # Primož Peterlin , 2013. # Matej Urbančič , 2011–2012, 2018–2019. # # $Id: pspp-0.8.1.1.sl.po,v 1.3 2013/12/14 21:31:27 peterlin Exp $ msgid "" msgstr "" "Project-Id-Version: pspp 1.2.0\n" "Report-Msgid-Bugs-To: pspp-dev@gnu.org\n" "PO-Revision-Date: 2019-04-16 21:27+0200\n" "Last-Translator: Matej Urban \n" "Language-Team: Slovenian \n" "Language: sl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Bugs: Report translation errors to the Language-Team address.\n" "Plural-Forms: nplurals=4; plural=(n%100==1 ? 1 : n%100==2 ? 2 : n%100==3 || n" "%100==4 ? 3 : 0);\n" "X-Poedit-SourceCharset: utf-8\n" "X-Generator: Poedit 2.2.1\n" #: src/data/any-reader.c:72 src/data/encrypted-file.c:78 #, c-format msgid "An error occurred while opening `%s': %s." msgstr "prišlo je do napake med odpiranjem »%s«: %s." #: src/data/any-reader.c:93 src/language/lexer/lexer.c:1633 #, c-format msgid "Error reading `%s': %s." msgstr "Napaka med branjem »%s«: %s." #: src/data/any-reader.c:114 #, c-format msgid "`%s' is not a system or portable file." msgstr "»%s« ni sistemska ali prenosna datoteka." #: src/data/any-reader.c:123 src/data/any-writer.c:66 msgid "The inline file is not allowed here." msgstr "Uporaba medvrstične (inline) datoteke ni dovoljena." #: src/data/any-reader.c:205 #, c-format msgid "" "Cannot read from dataset %s because no dictionary or data has been written " "to it yet." msgstr "" "Vsebine podatkovne zbirke %s ni mogoče prebrati, ker ne vsebuje slovarja " "spremenljivk ali podatkov." #: src/data/any-reader.c:260 src/language/data-io/dataset.c:253 msgid "Dataset" msgstr "Podatkovna zbirka" #: src/data/calendar.c:100 #, c-format msgid "Month %d is not in acceptable range of 0 to 13." msgstr "Mesec %d ni znotraj sprejemljivih vrednosti med 0 in 13." #: src/data/calendar.c:110 #, c-format msgid "Day %d is not in acceptable range of 0 to 31." msgstr "Dan %d ni znotraj sprejemljivih vrednosti med 0 in 31." #: src/data/calendar.c:119 #, c-format msgid "Date %04d-%d-%d is before the earliest acceptable date of 1582-10-15." msgstr "" "Datum %04d-%d-%d je pred najstarejšim sprejemljivim datumom 1582-10-15." #: src/data/casereader-filter.c:221 msgid "" "At least one case in the data read had a weight value that was user-missing, " "system-missing, zero, or negative. These case(s) were ignored." msgstr "" "Vsaj en primer v podatkih ima vrednost uteži, ki je uporabniško določena " "oziroma sistemska manjkajoča vrednost, vrednost enaka nič ali negativna " "vrednost. Ti primeri so bili prezrti." #. TRANSLATORS: this fragment will be interpolated into messages in fh_lock() #. that identify types of files. #: src/data/csv-file-writer.c:138 msgid "CSV file" msgstr "Datoteka CSV" #: src/data/csv-file-writer.c:146 #, fuzzy, c-format #| msgid "Error opening `%s' for writing as a system file: %s." msgid "Error opening `%s' for writing as a CSV file: %s." msgstr "" "prišlo je do napake pri odpiranju datoteke »%s« za pisanje kot sistemske " "datoteke: %s." #: src/data/csv-file-writer.c:453 #, c-format msgid "An I/O error occurred writing CSV file `%s'." msgstr "prišlo je do V/I napake med zapisovanjem datoteke CSV » %s «." #: src/data/data-in.c:175 #, c-format msgid "Data is not valid as format %s: %s" msgstr "podatki niso v veljavnem zapisu %s: %s" #: src/data/data-in.c:377 src/data/data-in.c:553 msgid "Field contents are not numeric." msgstr "vrednost, zapisana v polju, ni številčna." #: src/data/data-in.c:379 src/data/data-in.c:555 msgid "Number followed by garbage." msgstr "številu sledijo neštevilski znaki." #: src/data/data-in.c:392 msgid "Invalid numeric syntax." msgstr "Neveljavna številska skladnja." #: src/data/data-in.c:400 src/data/data-in.c:571 msgid "Too-large number set to system-missing." msgstr "za sistemsko manjkajočo vrednost je nastavljeno preveliko število." #: src/data/data-in.c:406 src/data/data-in.c:577 msgid "Too-small number set to zero." msgstr "premajhno število je nastavljeno na nič." #: src/data/data-in.c:426 msgid "All characters in field must be digits." msgstr "vsi znaki v polju morajo biti števila." #: src/data/data-in.c:445 msgid "Unrecognized character in field." msgstr "neprepoznan znak v polju." #: src/data/data-in.c:466 src/data/data-in.c:729 msgid "Field must have even length." msgstr "polje mora imeti celo dolžino." #: src/data/data-in.c:468 src/data/data-in.c:732 msgid "Field must contain only hex digits." msgstr "polje lahko vsebuje le šestnajstiška števila." #: src/data/data-in.c:544 msgid "Invalid zoned decimal syntax." msgstr "neveljavna skladnja decimalnega območja." #: src/data/data-in.c:644 src/data/data-in.c:650 msgid "Invalid syntax for P field." msgstr "neveljavna skladnja polja P." #: src/data/data-in.c:768 src/data/data-in.c:818 msgid "Syntax error in date field." msgstr "napaka skladnje v polju datuma." #: src/data/data-in.c:783 #, c-format msgid "Day (%ld) must be between 1 and 31." msgstr "dan (%ld) mora biti med 1 in 31." #: src/data/data-in.c:832 msgid "Delimiter expected between fields in date." msgstr "med polji datuma je pričakovan ločilni znak." #: src/data/data-in.c:906 msgid "" "Unrecognized month format. Months may be specified as Arabic or Roman " "numerals or as at least 3 letters of their English names." msgstr "" "neprepoznan zapis meseca. Mesece je mogoče določiti z arabskimi ali rimskimi " "števili ali pa vsaj s tremi črkami angleških imen." #: src/data/data-in.c:933 #, c-format msgid "Year (%ld) must be between 1582 and 19999." msgstr "leto (%ld) mora biti med 1582 in 19999." #: src/data/data-in.c:944 #, c-format msgid "Trailing garbage `%.*s' following date." msgstr "zapisu datuma sledi smetje »%.*s«." #: src/data/data-in.c:958 msgid "Julian day must have exactly three digits." msgstr "Po julijanskem koledarju je dan zapisan kot trimestno število." #: src/data/data-in.c:960 #, c-format msgid "Julian day (%ld) must be between 1 and 366." msgstr "" "Po julijanskem koledarju je dan (%ld) zapisan kot trimestno število med 1 in " "366." #: src/data/data-in.c:984 #, c-format msgid "Quarter (%ld) must be between 1 and 4." msgstr "Četrtletje (%ld) ima lahko le vrednosti od 1 do 4." #: src/data/data-in.c:1005 #, c-format msgid "Week (%ld) must be between 1 and 53." msgstr "Teden (%ld) mora biti med 1 in 53." #: src/data/data-in.c:1017 msgid "Delimiter expected between fields in time." msgstr "Ločilni znak med polji časa." #: src/data/data-in.c:1037 #, c-format msgid "Minute (%ld) must be between 0 and 59." msgstr "Minuta (%ld) mora biti med 0 in 59." #: src/data/data-in.c:1075 msgid "" "Unrecognized weekday name. At least the first two letters of an English " "weekday name must be specified." msgstr "" "Neprepoznano ime dneva v tednu. Določiti je potrebno vsaj prva dva znaka " "angleškega imena dneva." #: src/data/data-in.c:1210 #, c-format msgid "`%c' expected in date field." msgstr "V datumskem polju je pričakovan »%c«." #: src/data/data-out.c:580 #, c-format msgid "Weekday number %f is not between 1 and 7." msgstr "Številka dneva v tednu %f ni med 1 in 7." #: src/data/data-out.c:605 #, c-format msgid "Month number %f is not between 1 and 12." msgstr "Številka meseca (%f) ni med 1 in 12." #. TRANSLATORS: this fragment will be interpolated into #. messages in fh_lock() that identify types of files. #: src/data/dataset-writer.c:66 src/language/data-io/file-handle.c:304 msgid "dataset" msgstr "podatkovna zbirka" #: src/data/dict-class.c:52 msgid "ordinary" msgstr "običajna" #: src/data/dict-class.c:54 msgid "system" msgstr "sistemska" #: src/data/dict-class.c:56 msgid "scratch" msgstr "začasna" #: src/data/dictionary.c:1523 #, c-format msgid "Truncating document line to %d bytes." msgstr "Vrstica dokumenta je prirezana na %d bajtov." #: src/data/encrypted-file.c:89 #, c-format msgid "An error occurred while reading `%s': %s." msgstr "Prišlo je do napake med branjem »%s«: %s." #: src/data/encrypted-file.c:430 #, c-format msgid "" "%s: encrypted file corrupted (ends in incomplete %u-byte ciphertext block)" msgstr "" #: src/data/encrypted-file.c:449 #, c-format msgid "%s: encrypted file corrupted (ends with bad padding)" msgstr "" #: src/data/file-handle-def.c:283 src/language/data-io/dataset.c:266 msgid "active dataset" msgstr "aktivna podatkovna zbirka" #: src/data/file-handle-def.c:518 #, c-format msgid "Can't read from %s as a %s because it is already being read as a %s." msgstr "Ni mogoče prebrati iz %s kot %s, ker je že prebrano kot %s." #: src/data/file-handle-def.c:522 #, c-format msgid "Can't write to %s as a %s because it is already being written as a %s." msgstr "Ni mogoče zapisati v %s kot %s, ker je že zapisano kot %s." #: src/data/file-handle-def.c:529 #, c-format msgid "Can't re-open %s as a %s." msgstr "Ni mogoče odpreti %s kot %s." #: src/data/file-name.c:133 #, c-format msgid "Not opening pipe file `%s' because %s option set." msgstr "ni mogoče odpreti datoteke »%s« zaradi izbrane možnosti %s." #: src/data/format.c:339 msgid "Input format" msgstr "Zapis dovoda" #: src/data/format.c:339 msgid "Output format" msgstr "Zapis odvoda" #: src/data/format.c:342 #, c-format msgid "Format %s may not be used for input." msgstr "Zapisa %s ni dovoljeno uporabiti za vhodne podatke." #: src/data/format.c:349 #, c-format msgid "%s specifies width %d, but %s requires an even width." msgstr "%s določa širino %d, vendar zahteva %s sodo širino." #: src/data/format.c:358 #, c-format msgid "%s %s specifies width %d, but %s requires a width between %d and %d." msgstr "%s %s določa širino %d, vendar zahteva %s širino med %d in %d." #: src/data/format.c:367 #, c-format msgid "%s %s specifies %d decimal place, but %s does not allow any decimals." msgid_plural "" "%s %s specifies %d decimal places, but %s does not allow any decimals." msgstr[0] "%s %s določa %d decimalnih mest, %s pa jih ne dovoljuje." msgstr[1] "%s %s določa %d decimalno mesto, %s pa jih ne dovoljuje." msgstr[2] "%s %s določa %d decimalni mesti, %s pa jih ne dovoljuje." msgstr[3] "%s %s določa %d decimalna mesta, %s pa jih ne dovoljuje." #: src/data/format.c:378 #, c-format msgid "" "%s %s specifies %d decimal place, but the given width allows at most %d " "decimals." msgid_plural "" "%s %s specifies %d decimal places, but the given width allows at most %d " "decimals." msgstr[0] "" "%s %s določa %d decimalnih mest, podana širina pa dovoljuje največ %d." msgstr[1] "" "%s %s določa %d decimalno mesto, podana širina pa dovoljuje največ %d." msgstr[2] "" "%s %s določa %d decimalni mesti, podana širina pa dovoljuje največ %d." msgstr[3] "" "%s %s določa %d decimalna mesta, podana širina pa dovoljuje največ %d." #: src/data/format.c:385 #, c-format msgid "" "%s %s specifies %d decimal place, but the given width does not allow for any " "decimals." msgid_plural "" "%s %s specifies %d decimal places, but the given width does not allow for " "any decimals." msgstr[0] "%s %s določa %d decimalnih mest, podana širina pa jih ne dovoljuje." msgstr[1] "%s %s določa %d decimalno mesto, podana širina pa jih ne dovoljuje." msgstr[2] "%s %s določa %d decimalni mesti, podana širina pa jih ne dovoljuje." msgstr[3] "%s %s določa %d decimalna mesta, podana širina pa jih ne dovoljuje." #: src/data/format.c:424 #, c-format msgid "%s variables are not compatible with %s format %s." msgstr "Spremenljivke vrste %s niso združljive z %s formatom %s." #: src/data/format.c:425 src/data/format.c:1074 #: src/ui/gui/var-type-dialog.ui:167 msgid "String" msgstr "Niz znakov" #: src/data/format.c:425 src/data/format.c:1035 #: src/ui/gui/var-type-dialog.ui:48 msgid "Numeric" msgstr "Števila" #: src/data/format.c:426 src/data/sys-file-reader.c:2212 #: src/data/sys-file-reader.c:2214 src/language/xforms/recode.c:512 #: src/language/xforms/recode.c:513 src/language/xforms/recode.c:525 #: src/language/xforms/recode.c:526 #: src/language/dictionary/apply-dictionary.c:77 #: src/language/dictionary/apply-dictionary.c:78 msgid "numeric" msgstr "števila" #: src/data/format.c:426 src/data/sys-file-reader.c:2212 #: src/data/sys-file-reader.c:2214 src/language/xforms/recode.c:512 #: src/language/xforms/recode.c:513 src/language/xforms/recode.c:525 #: src/language/xforms/recode.c:526 #: src/language/dictionary/apply-dictionary.c:77 #: src/language/dictionary/apply-dictionary.c:78 msgid "string" msgstr "niz znakov" #: src/data/format.c:444 #, c-format msgid "String variable with width %d is not compatible with format %s." msgstr "Spremenljivka niza s širino %d ni združljiva z zapisom %s." #: src/data/format.c:1038 src/ui/gui/var-type-dialog.ui:65 msgid "Comma" msgstr "Decimalna števila, ločena z vejico" #: src/data/format.c:1041 src/ui/gui/var-type-dialog.ui:82 msgid "Dot" msgstr "Decimalna števila, ločena s piko" #: src/data/format.c:1044 msgid "Scientific" msgstr "Znanstveni zapis števil" #: src/data/format.c:1061 src/ui/gui/var-type-dialog.ui:116 msgid "Date" msgstr "Datumi" #: src/data/format.c:1064 src/ui/gui/var-type-dialog.ui:133 msgid "Dollar" msgstr "Vrednost v dolarjih" #: src/data/format.c:1071 msgid "Custom" msgstr "Po meri" #: src/data/gnumeric-reader.c:478 src/data/ods-reader.c:505 #, c-format msgid "Cannot convert the value in the spreadsheet cell %s to format (%s): %s" msgstr "" "Vrednosti v celici preglednice %s ni mogoče pretvoriti v zapis (%s): %s" #: src/data/gnumeric-reader.c:502 src/data/ods-reader.c:567 #, c-format msgid "" "There was a problem whilst reading the %s file `%s' (near line %d): `%s'" msgstr "" "Prišlo je do težav med branjem %s datoteke »%s« (blizu vrstice %d): »%s«" #: src/data/gnumeric-reader.c:597 #, c-format msgid "" "The gnumeric file `%s' is encoded as %s instead of the usual UTF-8 encoding. " "Any non-ascii characters will be incorrectly imported." msgstr "" "Preglednica Gnumeric »%s« je kodirana kot %s namesto pričakovanega kodiranja " "UTF-8. Vsak znak, ki ni del nabora ASCII, bo najverjetneje uvožen napačno." #: src/data/gnumeric-reader.c:641 src/data/ods-reader.c:682 #, c-format msgid "Invalid cell range `%s'" msgstr "Neveljaven obseg celic »%s«" #: src/data/gnumeric-reader.c:813 src/data/ods-reader.c:710 #: src/data/ods-reader.c:843 #, c-format msgid "Selected sheet or range of spreadsheet `%s' is empty." msgstr "Izbran delovni list oziroma obseg podatkov preglednice »%s« je prazen." #: src/data/identifier2.c:60 #, c-format msgid "Identifier `%s' exceeds %d-byte limit." msgstr "Določilo »%s« je preseglo %d-bajtno omejitev." #: src/data/identifier2.c:84 msgid "Identifier cannot be empty string." msgstr "Določilo ne more biti prazen niz." #: src/data/identifier2.c:92 #, c-format msgid "`%s' may not be used as an identifier because it is a reserved word." msgstr "" "»%s« ni mogoče uporabiti kot določilo, ker je to sistemsko rezervirana " "beseda." #: src/data/identifier2.c:103 #, c-format msgid "" "`%s' may not be used as an identifier because it contains ill-formed UTF-8 " "at byte offset %tu." msgstr "" "»%s« ni mogoče uporabiti kot določilo, ker vsebuje neustrezno zapisan znak " "UTF-8 pri bajtnem odmiku %tu." #: src/data/identifier2.c:114 #, c-format msgid "" "Character %s (in `%s') may not appear as the first character in a identifier." msgstr "Znaka %s (v »%s«) ni mogoče uporabiti kot prvi znak določila." #: src/data/identifier2.c:126 #, c-format msgid "Character %s (in `%s') may not appear in an identifier." msgstr "Znaka %s (v »%s«) ni mogoče uporabiti kot prvi znak določila." #: src/data/mdd-writer.c:241 #, c-format msgid "An I/O error occurred writing metadata file `%s'." msgstr "Prišlo je do V/I napake med zapisovanjem datoteke metapodatkov »%s«." #. TRANSLATORS: this fragment will be interpolated into #. messages in fh_lock() that identify types of files. #: src/data/mdd-writer.c:457 msgid "metadata file" msgstr "metapodatkovna datoteka" #: src/data/mdd-writer.c:465 #, c-format msgid "Error opening `%s' for writing as a metadata file: %s." msgstr "Napaka med odpiranjem »%s« za pisanje kot sistemske datoteke: %s." #: src/data/mdd-writer.c:473 #, fuzzy, c-format #| msgid "Internal error creating xmlTextWriter." msgid "Internal error creating xmlTextWriter. Please report this to %s." msgstr "notranja napaka ustvarjanja vsebine z zapisovalnikom xmlTextWriter." #: src/data/make-file.c:217 #, c-format msgid "Opening %s for writing: %s." msgstr "Odpiranje %s za pisanje: %s." #: src/data/make-file.c:228 #, c-format msgid "Opening stream for %s: %s." msgstr "Odpiranje pretoka za %s: %s." #: src/data/make-file.c:260 #, c-format msgid "Creating temporary file to replace %s: %s." msgstr "Ustvarjanje začasne datoteke za zamenjavo %s: %s." #: src/data/make-file.c:277 #, c-format msgid "Creating temporary file %s: %s." msgstr "Ustvarjanje začasne datoteke %s: %s." #: src/data/make-file.c:289 #, c-format msgid "Opening stream for temporary file %s: %s." msgstr "Odpiranje toka podatkov za začasno datoteko %s: %s." #: src/data/make-file.c:326 #, c-format msgid "Replacing %s by %s: %s." msgstr "Zamenjava %s z %s: %s." #: src/data/make-file.c:354 #, c-format msgid "Removing %s: %s." msgstr "Odstranjevanje %s: %s." #: src/data/mrset.c:83 #, c-format msgid "" "%s is not a valid name for a multiple response set. Multiple response set " "names must begin with `$'." msgstr "" "%s ni veljavno ime za skupino spremenljivk. Ime skupine se mora začeti z " "znakom » $ «." #: src/data/ods-reader.c:620 #, c-format msgid "Cannot open %s as a OpenDocument file: %s" msgstr "Ni mogoče odpreti »%s« kot datoteko OpenDocument: %s." #. TRANSLATORS: this fragment will be interpolated into #. messages in fh_lock() that identify types of files. #: src/data/pc+-file-reader.c:206 msgid "SPSS/PC+ system file" msgstr "sistemska datoteka SPSS/PC+" #: src/data/pc+-file-reader.c:215 #, c-format msgid "Error opening `%s' for reading as an SPSS/PC+ system file: %s." msgstr "" "Napaka med odpiranju »%s« za pisanje kot sistemske datoteke SPSS/PC+: %s." #: src/data/pc+-file-reader.c:224 src/data/sys-file-reader.c:3541 #, c-format msgid "%s: stat failed (%s)." msgstr "%s: stat je spodletel (%s)." #: src/data/pc+-file-reader.c:230 #, c-format msgid "%s: file too large." msgstr "%s: datoteka je prevelika" #: src/data/pc+-file-reader.c:257 #, c-format msgid "" "Directory entry is for a %u-byte record starting at offset %u but file is " "only %u bytes long." msgstr "" "slovarski vpis je za %u-bajtni zapis, z začetkom pri odmiku %u, skupna " "velikost datoteke pa je le %u bajtov." #: src/data/pc+-file-reader.c:275 #, c-format msgid "Directory fields have unexpected values (%u,%u)." msgstr "slovarsko polje ima nepričakovane vrednosti (%u, %u)." #: src/data/pc+-file-reader.c:372 src/data/sys-file-reader.c:672 #, c-format msgid "Variable %zu" msgstr "Spremenljivka %zu" #: src/data/pc+-file-reader.c:380 src/data/sys-file-reader.c:680 #, c-format msgid "Variable %zu Label" msgstr "Oznaka spremenljivke %zu" #: src/data/pc+-file-reader.c:385 #, c-format msgid "Variable %zu Value Label %zu" msgstr "Spremenljivka %zu vrednost oznake %zu" #: src/data/pc+-file-reader.c:388 src/data/sys-file-reader.c:690 msgid "Creation Date" msgstr "Datum ustvarjanja" #: src/data/pc+-file-reader.c:389 src/data/sys-file-reader.c:691 msgid "Creation Time" msgstr "Čas ustvarjanja" #: src/data/pc+-file-reader.c:390 src/data/sys-file-reader.c:692 #: src/language/dictionary/sys-file-info.c:200 msgid "Product" msgstr "" #: src/data/pc+-file-reader.c:391 src/data/sys-file-reader.c:693 #: src/language/dictionary/sys-file-info.c:300 msgid "File Label" msgstr "Oznaka datoteke" #: src/data/pc+-file-reader.c:427 #, c-format msgid "" "Using default encoding %s to read this SPSS/PC+ system file. For best " "results, specify an encoding explicitly. Use SYSFILE INFO with ENCODING=" "\"DETECT\" to analyze the possible encodings." msgstr "" "za branje sistemske datoteke SPSS/PC+ bo uporabljeno privzeto znakovno " "kodiranje %s. Priporočljivo je izrecno določiti nabor znakov. Z uporabo " "ukaza SYSFILE INFO z možnostjo ENCODING=\"DETECT\" je mogoče določiti možne " "ustrezne nabore." #: src/data/pc+-file-reader.c:483 src/data/sys-file-reader.c:890 #, c-format msgid "Error closing system file `%s': %s." msgstr "Napaka med zapiranjem sistemske datoteke »%s«: %s." #: src/data/pc+-file-reader.c:544 msgid "This is not an SPSS/PC+ system file." msgstr "Datoteka ni sistemska datoteka SPSS/PC+." #: src/data/pc+-file-reader.c:548 #, c-format msgid "Record 0 has unexpected length %u." msgstr "Zapis primera 0 je nepričakovane dolžine %u." #: src/data/pc+-file-reader.c:572 #, c-format msgid "Record 0 specifies unexpected system missing value %g (%a)." msgstr "" "Zapis primera 0 določa nepričakovano sistemsko manjkajočo vrednost %g (%a)." #: src/data/pc+-file-reader.c:577 #, c-format msgid "Record 0 reserved fields have unexpected values (%u,%u,%u,%u,%u,%u)." msgstr "" "Rezervirana polja zapisa primera 0 imajo nepričakovane vrednosti (%u,%u,%u," "%u,%u,%u)." #: src/data/pc+-file-reader.c:581 #, c-format msgid "Record 0 case counts differ (%u versus %u)." msgstr "Števci primerov v zapisu primera 0 se razlikujejo (%u proti %u)" #: src/data/pc+-file-reader.c:585 #, c-format msgid "Invalid compression type %u." msgstr "Neveljavna vrsta stiskanja %u" #: src/data/pc+-file-reader.c:596 #, c-format msgid "" "Record 0 claims %u cases with %u values per case (requiring at least %zu " "bytes) but data record is only %u bytes long." msgstr "" "Zapis 0 opredeljuje %u primerov s skupno %u vrednosti na primer (kar zahteva " "%zu bajtov), zapis podatkov pa je dolg le %u bajtov." #: src/data/pc+-file-reader.c:618 #, c-format msgid "" "Value labels claimed to end at offset %u in labels record but labels record " "is only %u bytes." msgstr "" "oznaka vrednosti naj bi se končala pri odmiku %u v zapisu oznake, vendar pa " "je ta le %u bajtov." #: src/data/pc+-file-reader.c:629 #, c-format msgid "" "Value labels claimed to be at offset %u with length %u but file size is only " "%u bytes." msgstr "" "oznaka vrednosti naj bi bila pri odmiku %u z dolžino %u, vendar pa je ta le " "%u bajtov." #: src/data/pc+-file-reader.c:656 #, c-format msgid "" "Value labels end with partial label (%u bytes left in record, label length " "%)." msgstr "" "oznake vrednosti se končajo z nepopolno vrednostjo (preostaja %u bajtov v " "zapisu, dolžina oznake %." #: src/data/pc+-file-reader.c:669 #, c-format msgid "%u leftover bytes following value labels." msgstr "%u bajtov preostanka za oznakami vrednosti." #: src/data/pc+-file-reader.c:685 #, c-format msgid "" "Variable label claimed to start at offset %u in labels record but labels " "record is only %u bytes." msgstr "" "oznaka vrednosti naj bi se začela pri odmiku %u v zapisu oznake, vendar pa " "je ta le %u bajtov." #: src/data/pc+-file-reader.c:697 #, c-format msgid "" "Variable label with length %u starting at offset %u in labels record " "overruns end of %u-byte labels record." msgstr "" "oznaka vrednosti z dolžino %u, ki se začne pri odmiku %u v zapisu oznake, " "prekriva konec %u-bitnega zapisa oznake." #: src/data/pc+-file-reader.c:719 #, c-format msgid "Record 1 has length %u (expected %u)." msgstr "Zapis 1 je dolžine %u (pričakovana je %u)." #: src/data/pc+-file-reader.c:751 #, c-format msgid "Variable %u has invalid type %." msgstr "spremenljivka %u ima navedeno neveljavno vrsto %." #: src/data/pc+-file-reader.c:787 #, c-format msgid "Invalid weight index %u." msgstr "Neveljavna vrednost uteži %u." #: src/data/pc+-file-reader.c:857 #, c-format msgid "Invalid variable name `%s'." msgstr "Neveljavno ime spremenljivke »%s«." #: src/data/pc+-file-reader.c:865 src/data/sys-file-reader.c:1444 #, c-format msgid "Renaming variable with duplicate name `%s' to `%s'." msgstr "Podvojeno ime spremenljivke »%s« je preimenovano v »%s«." #: src/data/pc+-file-reader.c:877 #, c-format msgid "Cannot weight by string variable `%s'." msgstr "vrednosti ni mogoče utežiti s spremenljivko niza »%s«" #: src/data/pc+-file-reader.c:973 src/data/sys-file-reader.c:2762 msgid "File ends in partial case." msgstr "datoteka se konča z nepopolnim primerom" #: src/data/pc+-file-reader.c:979 #, c-format msgid "" "Case beginning at offset 0x%08x extends past end of data record at offset 0x" "%08x." msgstr "" "Primer, ki se začne pri odmiku 0x%08x, se razteza prek konca zapisa podatkov " "pri odmiku 0x%08x." #: src/data/pc+-file-reader.c:998 src/data/sys-file-reader.c:2770 #, c-format msgid "Error reading case from file %s." msgstr "Napaka med branjem primera iz datoteke %s." #: src/data/pc+-file-reader.c:1114 src/data/sys-file-reader.c:2933 #, c-format msgid "" "Possible compressed data corruption: string contains compressed integer " "(opcode %d)." msgstr "" "zaznana je možnost okvare stisnjenih podatkov: niz vsebuje stisnjeno celo " "število (opcode %d)." #: src/data/pc+-file-reader.c:1156 src/data/sys-file-reader.c:3234 #, c-format msgid "`%s' near offset 0x%llx: " msgstr "»%s«\" pri odmiku 0x%llx: " #: src/data/pc+-file-reader.c:1159 src/data/sys-file-reader.c:3237 #, c-format msgid "`%s': " msgstr "»%s«: " #: src/data/pc+-file-reader.c:1211 src/data/sys-file-reader.c:3288 #, c-format msgid "System error: %s." msgstr "Sistemska napaka: %s." #: src/data/pc+-file-reader.c:1216 src/data/sys-file-reader.c:3293 msgid "Unexpected end of file." msgstr "Dosežen je nepričakovan konec datoteke." #: src/data/pc+-file-reader.c:1301 src/data/sys-file-reader.c:3518 #, c-format msgid "%s: seek failed (%s)." msgstr "%s: ukaz seek() je spodletel (%s)." #: src/data/pc+-file-reader.c:1351 msgid "SPSS/PC+ System File" msgstr "Sistemska datoteka SPSS/PC+" #: src/data/por-file-reader.c:109 #, c-format msgid "portable file %s corrupt at offset 0x%llx: " msgstr "prenosna datoteka %s je okvarjena pri odmiku 0x%llx: " #: src/data/por-file-reader.c:136 #, c-format msgid "reading portable file %s at offset 0x%llx: " msgstr "poteka branje prenosne datoteke %s pri odmiku 0x%llx: " #: src/data/por-file-reader.c:164 #, c-format msgid "Error closing portable file `%s': %s." msgstr "Napaka med zapiranjem prenosne datoteke »%s«: %s." #: src/data/por-file-reader.c:216 msgid "unexpected end of file" msgstr "nepričakovan konec datoteke" #. TRANSLATORS: this fragment will be interpolated into #. messages in fh_lock() that identify types of files. #: src/data/por-file-reader.c:275 src/data/por-file-writer.c:147 msgid "portable file" msgstr "prenosna datoteka" #: src/data/por-file-reader.c:283 #, c-format msgid "" "An error occurred while opening `%s' for reading as a portable file: %s." msgstr "" "Prišlo je do napake med odpiranjem »%s« za branje kot prenosne datoteke: %s." #: src/data/por-file-reader.c:304 msgid "Data record expected." msgstr "Pričakovan je podatkovni zapis." #: src/data/por-file-reader.c:402 msgid "Number expected." msgstr "Pričakovan je vnos števila." #: src/data/por-file-reader.c:430 msgid "Missing numeric terminator." msgstr "Manjka številski zaključni znak." #: src/data/por-file-reader.c:453 msgid "Invalid integer." msgstr "Neveljavno celo število." #: src/data/por-file-reader.c:464 src/data/por-file-reader.c:484 #, c-format msgid "Bad string length %d." msgstr "Neveljavna dolžina niza %d." #: src/data/por-file-reader.c:547 #, c-format msgid "%s: Not a portable file." msgstr "%s: datoteka ni prenosna datoteka." #: src/data/por-file-reader.c:564 #, c-format msgid "Unrecognized version code `%c'." msgstr "Neprepoznana različica kode »%c«." #: src/data/por-file-reader.c:577 #, c-format msgid "Bad date string length %zu." msgstr "Napačna dolžina datumskega niza %zu." #: src/data/por-file-reader.c:579 #, c-format msgid "Bad time string length %zu." msgstr "Napačna dolžina časovnega niza %zu." #: src/data/por-file-reader.c:630 #, c-format msgid "" "%s: Bad format specifier byte (%d). Variable will be assigned a default " "format." msgstr "" "%s: neustrezno določilo zapisa (%d). Spremenljivki bo dodeljen privzet zapis." #: src/data/por-file-reader.c:651 #, c-format msgid "Numeric variable %s has invalid format specifier %s." msgstr "Številčna spremenljivka %s ima neveljavno določilo zapisa %s." #: src/data/por-file-reader.c:655 #, c-format msgid "String variable %s with width %d has invalid format specifier %s." msgstr "Spremenljivka niza %s širine %d ima neveljavno določilo zapisa %s." #: src/data/por-file-reader.c:679 msgid "Expected variable count record." msgstr "Pričakovan je zapis števila spremenljivke." #: src/data/por-file-reader.c:683 #, c-format msgid "Invalid number of variables %d." msgstr "Neveljavno število spremenljivk %d." #: src/data/por-file-reader.c:692 #, c-format msgid "Weight variable name (%s) truncated." msgstr "Ime spremenljivke uteži (%s) je bilo prirezano." #: src/data/por-file-reader.c:707 msgid "Expected variable record." msgstr "Pričakovan je zapis spremenljivke." #: src/data/por-file-reader.c:711 #, c-format msgid "Invalid variable width %d." msgstr "Neveljavna širina spremenljivke %d." #: src/data/por-file-reader.c:719 #, c-format msgid "Invalid variable name `%s' in position %d." msgstr "Neveljavno ime spremenljivke »%s« na mestu %d." #: src/data/por-file-reader.c:723 src/data/sys-file-reader.c:1426 #, c-format msgid "Bad width %d for variable %s." msgstr "Neustrezna širina %d za spremenljivko %s." #: src/data/por-file-reader.c:737 #, c-format msgid "Duplicate variable name %s in position %d renamed to %s." msgstr "Podvojeno ime spremenljivke %s na mestu %d je preimenovano v %s." #: src/data/por-file-reader.c:786 #, c-format msgid "Weighting variable %s not present in dictionary." msgstr "spremenljivke uteži »%s« ni v slovarju spremenljivk." #: src/data/por-file-reader.c:830 #, c-format msgid "Unknown variable %s while parsing value labels." msgstr "neznana spremenljivka %s med razčlenjevanjem oznak vrednosti." #: src/data/por-file-reader.c:833 #, c-format msgid "" "Cannot assign value labels to %s and %s, which have different variable types." msgstr "" "Ni mogoče določiti oznak vrednosti na %s in %s, ker imajo različne vrste " "spremenljivk." #: src/data/por-file-reader.c:972 msgid "SPSS Portable File" msgstr "Prenosna datoteka SPSS" #: src/data/por-file-writer.c:139 #, c-format msgid "Invalid decimal digits count %d. Treating as %d." msgstr "Neveljavno število decimalnih mest %d. Vrednost bo obravnavana kot %d." #: src/data/por-file-writer.c:159 #, c-format msgid "Error opening `%s' for writing as a portable file: %s." msgstr "Napaka med odpiranjem »%s« za pisanje kot prenosne datoteke: %s." #: src/data/por-file-writer.c:505 #, c-format msgid "An I/O error occurred writing portable file `%s'." msgstr "Prišlo je do V/I napake ob zapisovanju v prenosno datoteko »%s«." #: src/data/psql-reader.c:48 msgid "" "Support for reading postgres databases was not compiled into this " "installation of PSPP" msgstr "" "Podpora za branje podatkovnih zbirk PostgreS v tej namestitvi programa PSPP " "ni vključena." #: src/data/psql-reader.c:242 msgid "Memory error whilst opening psql source" msgstr "Napaka pomnilnika med odpiranjem vira psql" #: src/data/psql-reader.c:248 #, c-format msgid "Error opening psql source: %s." msgstr "Napaka med odpiranjem vira psql: %s." #: src/data/psql-reader.c:263 #, c-format msgid "" "Postgres server is version %s. Reading from versions earlier than 8.0 is not " "supported." msgstr "" "Strežnik PostgreS je različice %s. Različice, starejše od 8.0 niso več " "podprte za branje." #: src/data/psql-reader.c:283 msgid "" "Connection is unencrypted, but unencrypted connections have not been " "permitted." msgstr "Povezava ni šifrirana in kot taka ni dovoljena." #: src/data/psql-reader.c:324 src/data/psql-reader.c:349 #: src/data/psql-reader.c:359 #, c-format msgid "Error from psql source: %s." msgstr "Napaka iz vira psql: %s." #: src/data/psql-reader.c:454 #, c-format msgid "Unsupported OID %d. SYSMIS values will be inserted." msgstr "" "Nepodprto določilo OID %d. Z ukazom SYSMIS bodo vstavljene sistemske " "manjkajoče vrednosti." #: src/data/settings.c:391 #, fuzzy #| msgid "" #| "MXWARNS set to zero. No further warnings will be given even when " #| "potentially problematic situations are encountered." msgid "" "MXWARNS set to zero. No further warnings will be given even when " "potentially problematic situations are encountered." msgstr "" "vrednost ukaza MXWARNS je nastavljena na nič – nadaljnja opozorila ne bodo " "izpisana niti v primerih, ko bodo zaznane potencialno problematične " "situacije." #: src/data/settings.c:398 #, c-format msgid "" "Warnings re-enabled. %d warnings will be issued before aborting syntax " "processing." msgstr "" "opozorila so omogočena. Izpisanih bo %d opozoril, preden bo prekinjena " "obdelava skladnje." #: src/data/settings.c:618 #, c-format msgid "" "%s: Custom currency string `%s' does not contain exactly three periods or " "commas (or it contains both)." msgstr "" "%s: niz denarne enote po meri »%s« nima natanko treh pik ali vejic (ali pa " "vsebuje obe ločili)." #. TRANSLATORS: this fragment will be interpolated into #. messages in fh_lock() that identify types of files. #: src/data/sys-file-reader.c:407 src/data/sys-file-writer.c:245 msgid "system file" msgstr "sistemska datoteka" #: src/data/sys-file-reader.c:414 #, c-format msgid "Error opening `%s' for reading as a system file: %s." msgstr "Napaka med odpiranjem »%s« za pisanje kot sistemske datoteke: %s." #: src/data/sys-file-reader.c:491 msgid "Misplaced type 4 record." msgstr "napačno mesto zapisa tipa 4." #: src/data/sys-file-reader.c:496 msgid "Duplicate type 6 (document) record." msgstr "podvojen zapis tipa 6 (dokument)." #: src/data/sys-file-reader.c:506 src/data/sys-file-reader.c:1343 #, c-format msgid "" "Unrecognized record type 7, subtype %d. For help, please send this file to " "%s and mention that you were using %s." msgstr "" "Neprepoznan zapis tipa 7, podtipa %d. Za pomoč pošljite datoteko za %s in " "omenite, da ste uporabljali %s." #: src/data/sys-file-reader.c:526 #, c-format msgid "" "Record type 7, subtype %d found here has the same type as the record found " "near offset 0x%llx. For help, please send this file to %s and mention that " "you were using %s." msgstr "" "zaznan zapis tip 7, podtip %d je enake vrste kot zapis, zaznan ob odmiku 0x" "%llx. Za pomoč pošljite datoteko za %s in omenite, da ste uporabljali %s." #: src/data/sys-file-reader.c:538 #, c-format msgid "Unrecognized record type %d." msgstr "Neprepoznana vrsta zapisa %d." #: src/data/sys-file-reader.c:688 #, c-format msgid "Value Label %zu" msgstr "Oznaka vrednosti %zu" #: src/data/sys-file-reader.c:697 msgid "Extra Product Info" msgstr "" #: src/data/sys-file-reader.c:710 #, c-format msgid "Document Line %zu" msgstr "Vrstica dokumenta %zu" #: src/data/sys-file-reader.c:718 #, c-format msgid "MRSET %zu" msgstr "MRSET %zu" #: src/data/sys-file-reader.c:720 #, c-format msgid "MRSET %zu Label" msgstr "Oznaka MRSET %zu" #: src/data/sys-file-reader.c:725 #, c-format msgid "MRSET %zu Counted Value" msgstr "Šteta vrednost MRSET %zu" #: src/data/sys-file-reader.c:763 #, c-format msgid "" "This system file does not indicate its own character encoding. Using " "default encoding %s. For best results, specify an encoding explicitly. Use " "SYSFILE INFO with ENCODING=\"DETECT\" to analyze the possible encodings." msgstr "" "V sistemski datoteki ni navedenega določila za prednostno uporabljeni " "jezikovni nabor znakov. Uporabljen bo privzeti nabor %s, priporočljivo pa je " "določiti nabor, ki je značilen za jezikovno področje. Z uporabo ukazov " "SYSFILE INFO in ENCODING=\"DETECT\" je mogoče analizirati možne izbire." #: src/data/sys-file-reader.c:845 #, c-format msgid "File header claims %d variable positions but %zu were read from file." msgstr "glava datoteke navaja %d mest spremenljivk, prebranih pa je le %zu." #: src/data/sys-file-reader.c:958 src/data/sys-file-reader.c:972 msgid "This is not an SPSS system file." msgstr "Datoteka ni sistemska datoteka SPSS." #: src/data/sys-file-reader.c:1027 msgid "" "Compression bias is not the usual value of 100, or system file uses " "unrecognized floating-point format." msgstr "" "vodilo stiskanja ni običajne vrednosti 100, ali pa je v sistemski datoteki " "določen neprepoznan zapis s plavajočo vejico." #: src/data/sys-file-reader.c:1102 msgid "Variable label indicator field is not 0 or 1." msgstr "Polje določila oznake spremenljivke ni 0 oziroma 1." #: src/data/sys-file-reader.c:1115 msgid "Numeric missing value indicator field is not -3, -2, 0, 1, 2, or 3." msgstr "" "Polje določila številske manjkajoče vrednosti ni -3, -2, 0, 1, 2 oziroma 3." #: src/data/sys-file-reader.c:1125 msgid "String missing value indicator field is not 0, 1, 2, or 3." msgstr "Polje določila manjkajoče vrednosti ni 1, 2 oziroma 3." #: src/data/sys-file-reader.c:1152 #, c-format msgid "Invalid number of labels %u." msgstr "Neveljavno število oznak %u." #: src/data/sys-file-reader.c:1185 msgid "" "Variable index record (type 4) does not immediately follow value label " "record (type 3) as it should." msgstr "" "indeks zapisa spremenljivke (tip 4) ne sledi takoj zapisu oznake " "spremenljivke (tip 4), kot bi morala." #: src/data/sys-file-reader.c:1197 #, c-format msgid "" "Number of variables associated with a value label (%u) is not between 1 and " "the number of variables (%zu)." msgstr "" "Število spremenljivk, povezanih z oznako (%u) ni med 1 in številom " "spremenljivk (%zu)." #: src/data/sys-file-reader.c:1224 #, c-format msgid "Number of document lines (%d) must be greater than 0 and less than %d." msgstr "Število vrstic dokumenta (%d) mora biti večje od 0 in manjše od %d." #: src/data/sys-file-reader.c:1317 #, c-format msgid "Record type 7, subtype %d has bad size %u (expected %d)." msgstr "" "zapis tipa 7, podtipa %d je neustrezne velikosti %u (pričakovana je velikost " "%d)." #: src/data/sys-file-reader.c:1321 #, c-format msgid "Record type 7, subtype %d has bad count %u (expected %d)." msgstr "zapis tip 7, podtip %d ima ustrezno oštevilčenje %u (pričakovano %d)." #: src/data/sys-file-reader.c:1435 #, fuzzy, c-format #| msgid "Renaming variable with duplicate name `%s' to `%s'." msgid "Renaming variable with invalid name `%s' to `%s'." msgstr "Podvojeno ime spremenljivke »%s« je preimenovano v »%s«." #: src/data/sys-file-reader.c:1517 msgid "Missing string continuation record." msgstr "" #: src/data/sys-file-reader.c:1550 #, fuzzy, c-format msgid "Variable %s with width %d has invalid print format 0x%x." msgstr "" "Spremenljivka %s s širino %d ima določen neveljaven zapis za tisk 0x%x." #: src/data/sys-file-reader.c:1554 #, fuzzy, c-format msgid "Variable %s with width %d has invalid write format 0x%x." msgstr "Spremenljivka %s s širino %d ima določen neveljaven zapis 0x%x." #: src/data/sys-file-reader.c:1559 msgid "Suppressing further invalid format warnings." msgstr "Nadaljnja opozorila o neveljavnem formatu ne bodo izpisana." #: src/data/sys-file-reader.c:1613 #, c-format msgid "" "Floating-point representation indicated by system file (%d) differs from " "expected (%d)." msgstr "" "zapis s plavajočo vejico, določen v sistemski datoteki (%d), se razlikuje od " "pričakovanega (%d)." #: src/data/sys-file-reader.c:1629 #, c-format msgid "" "Integer format indicated by system file (%d) differs from expected (%d)." msgstr "" "zapis števila, določen v sistemski datoteki (%d), se razlikuje od " "pričakovanega (%d)." #: src/data/sys-file-reader.c:1647 src/data/sys-file-reader.c:1653 #, c-format msgid "File specifies unexpected value %g (%a) as %s, instead of %g (%a)." msgstr "Datoteka določa nepričakovano vrednost %g (%a) kot %s namesto %g (%a)." #: src/data/sys-file-reader.c:1662 #, c-format msgid "" "File specifies unexpected value %g (%a) as %s, instead of %g (%a) or %g (%a)." msgstr "" "Datoteka določa nepričakovano vrednost %g (%a) kot %s namesto %g (%a) " "oziroma %g (%a)." #: src/data/sys-file-reader.c:1714 src/data/sys-file-reader.c:1733 #, c-format msgid "Missing space following `%c' at offset %zu in MRSETS record." msgstr "manjka presledek za »%c« pri odmiku %zu v zapisu skupine MRSETS." #: src/data/sys-file-reader.c:1741 #, c-format msgid "" "Missing label source value following `E' at offset %zu in MRSETS record." msgstr "" "manjka izvorna vrednost oznake za »E« pri odmiku %zu v zapisu skupine MRSETS." #: src/data/sys-file-reader.c:1748 #, c-format msgid "" "Unexpected label source value following `E' at offset %zu in MRSETS record." msgstr "" "nepričakovana izvorna vrednost oznake za »E« pri odmiku %zu v zapisu skupine " "MRSETS." #: src/data/sys-file-reader.c:1755 #, c-format msgid "Missing `C', `D', or `E' at offset %zu in MRSETS record." msgstr "manjka »C«, »D« ali »E« pri odmiku %zu v zapisu skupine MRSETS." #: src/data/sys-file-reader.c:1782 #, c-format msgid "Missing new-line parsing variable names at offset %zu in MRSETS record." msgstr "" "manjka nova vrstica za razčlenjevanje imen spremenljivk pri odmiku %zu v " "zapisu skupine MRSETS." #: src/data/sys-file-reader.c:1817 #, c-format msgid "Invalid multiple response set name `%s'." msgstr "Neveljavno ime skupine spremenljivk » %s «." #: src/data/sys-file-reader.c:1850 #, c-format msgid "MRSET %s contains duplicate variable name %s." msgstr "skupina MRSET %s vsebuje podvojeno ime spremenljivke %s." #: src/data/sys-file-reader.c:1865 #, c-format msgid "MRSET %s contains both string and numeric variables." msgstr "" "skupina MRSET %s vsebuje spremenljivke vrste niz in številske spremenljivke." #: src/data/sys-file-reader.c:1877 #, c-format msgid "MRSET %s has no variables." msgstr "skupina MRSET %s nima določenih spremenljivk." #: src/data/sys-file-reader.c:1879 #, c-format msgid "MRSET %s has only one variable." msgstr "skupina MRSET %s ima določeno le eno spremenljivko." #: src/data/sys-file-reader.c:1923 #, c-format msgid "Extension 11 has bad count %u (for %zu variables)." msgstr "" #: src/data/sys-file-reader.c:1956 #, c-format msgid "" "Invalid variable display parameters for variable %zu (%s). Default " "parameters substituted." msgstr "" "neveljavni parametri za prikaz spremenljivke %zu (%s). Parametri so " "zamenjani s privzetim naborom." #: src/data/sys-file-reader.c:2000 #, c-format msgid "Duplicate long variable name `%s'." msgstr "Podvojeno dolgo ime spremenljivke » %s «." #: src/data/sys-file-reader.c:2053 #, c-format msgid "Long variable mapping from %s to invalid variable name `%s'." msgstr "preslikava dolgega imena spremenljivke %s v neveljavno ime » %s «." #: src/data/sys-file-reader.c:2088 #, c-format msgid "%s listed as string of invalid length %s in very long string record." msgstr "" "vrednost %s, zapisana kot niz neustrezne dolžine %s v zelo dolgem zapisu " "niza." #: src/data/sys-file-reader.c:2099 #, c-format msgid "" "%s listed in very long string record with width %s, which requires only one " "segment." msgstr "" "vrednost %s, zapisana kot zelo dolg zapis s širino %s, ki zahteva le en " "segment." #: src/data/sys-file-reader.c:2107 #, c-format msgid "Very long string %s overflows dictionary." msgstr "zelo dolg niz %s je prekoračil omejitve slovarja spremenljivk." #: src/data/sys-file-reader.c:2125 #, c-format msgid "" "Very long string with width %ld has segment %d of width %d (expected %d)." msgstr "" "zelo dolg niz širine %ld vključuje obseg %d s širino %d (pričakovana pa je " "%d)." #: src/data/sys-file-reader.c:2183 #, fuzzy, c-format #| msgid "Variable index %d not in valid range 1...%zu." msgid "Value label variable index %d not in valid range 1...%zu." msgstr "indeks spremenljivke %d ni v veljavnem obsegu 1 ... %zu." #: src/data/sys-file-reader.c:2193 #, fuzzy, c-format #| msgid "Variable index %d refers to long string continuation." msgid "Value label variable index %d refers to long string continuation." msgstr "index spremenljivke %d določa nadaljevanje dolgega niza" #: src/data/sys-file-reader.c:2208 #, c-format msgid "" "Variables associated with value label are not all of identical type. " "Variable %s is %s, but variable %s is %s." msgstr "" "Spremenljivke, povezane z oznako vrednosti, niso iste vrste. Spremenljivka " "%s je %s, spremenljivka %s pa %s." #: src/data/sys-file-reader.c:2226 #, c-format msgid "" "Value labels may not be added to long string variables (e.g. %s) using " "records types 3 and 4." msgstr "" #: src/data/sys-file-reader.c:2255 #, c-format msgid "Duplicate value label for %g on %s." msgstr "Podvojena oznaka vrednosti za %g na %s." #: src/data/sys-file-reader.c:2260 src/data/sys-file-reader.c:2600 #, c-format msgid "Duplicate value label for `%.*s' on %s." msgstr "Podvojena oznaka vrednosti za »%.*s« na %s." #: src/data/sys-file-reader.c:2283 #, fuzzy, c-format #| msgid "Suppressed %d additional related warnings." msgid "Suppressed %d additional warnings for value labels." msgstr "Zadržanih je %d dodatnih podobnih opozoril." #: src/data/sys-file-reader.c:2297 #, fuzzy, c-format #| msgid "Variable index %d not in valid range 1...%zu." msgid "" "Weight variable index %d not in valid range 1...%zu. Treating file as " "unweighted." msgstr "indeks spremenljivke %d ni v veljavnem obsegu 1 ... %zu." #: src/data/sys-file-reader.c:2307 #, fuzzy, c-format #| msgid "Variable index %d refers to long string continuation." msgid "" "Weight variable index %d refers to long string continuation. Treating file " "as unweighted." msgstr "index spremenljivke %d določa nadaljevanje dolgega niza" #: src/data/sys-file-reader.c:2315 #, c-format msgid "Ignoring string variable `%s' set as weighting variable." msgstr "" "besedilna spremenljivka »%s«, določena kot utež spremenljivke, bo prezrta." #: src/data/sys-file-reader.c:2352 #, c-format msgid "Error parsing attribute value %s[%d]." msgstr "Napaka razčlenjevanja vrednosti atributa %s[%d]." #: src/data/sys-file-reader.c:2366 #, c-format msgid "Attribute value %s[%d] is not quoted: %s." msgstr "Vrednost atributa %s[%d] ni v navednicah: %s." #: src/data/sys-file-reader.c:2379 #, c-format msgid "Duplicate attribute %s." msgstr "Podvojen atribut %s." #: src/data/sys-file-reader.c:2463 #, c-format msgid "Invalid role for variable %s." msgstr "Neveljavna vloga spremenljivke %s." #: src/data/sys-file-reader.c:2472 #, c-format msgid "%zu other variables had invalid roles." msgstr "%zu drugih spremenljivk ima neveljavne vloge." #: src/data/sys-file-reader.c:2485 #, c-format msgid "Extension record subtype %d ends unexpectedly." msgstr "Podvrsta razširjenega zapisa %d je nepričakovano končana." #: src/data/sys-file-reader.c:2531 #, c-format msgid "Ignoring long string value label record for unknown variable %s." msgstr "" "zapis oznake vrednosti dolgega niza za neznano spremenljivko %s bo prezrt." #: src/data/sys-file-reader.c:2536 #, c-format msgid "Ignoring long string value label record for numeric variable %s." msgstr "" "zapis oznake vrednosti dolgega niza za številsko spremenljivko %s bo prezrt." #: src/data/sys-file-reader.c:2543 #, c-format msgid "" "Ignoring long string value label record for variable %s because the record's " "width (%d) does not match the variable's width (%d)." msgstr "" "zapis oznake vrednosti dolgega niza znakov spremenljivke %s bo prezrt, ker " "širina zapisa (%d) ni skladna širini spremenljivke (%d)." #: src/data/sys-file-reader.c:2573 #, c-format msgid "" "Ignoring long string value label %zu for variable %s, with width %d, that " "has bad value width %zu." msgstr "" "oznaka vrednosti dolgega niza spremenljivke %zu spremenljivke %s s širino %d " "bo prezrta, ker širina zapisa %zu ni ustrezna." #: src/data/sys-file-reader.c:2646 #, c-format msgid "" "Long string missing values record says variable %s has %d missing values, " "but only 1 to 3 missing values are allowed." msgstr "" "zapis manjkajoče vrednosti dolgega niza kaže, da ima spremenljivka %s %d " "manjkajočih vrednosti, dovoljenih pa jih je od 1 do 3." #: src/data/sys-file-reader.c:2656 #, c-format msgid "Ignoring long string missing value record for unknown variable %s." msgstr "zapis manjkajoče vrednosti za neznano spremenljivko %s bo prezrt." #: src/data/sys-file-reader.c:2661 #, c-format msgid "Ignoring long string missing value record for numeric variable %s." msgstr "" "zapis manjkajoče vrednosti dolgega niza za številsko spremenljivko %s bo " "prezrt." #: src/data/sys-file-reader.c:2686 #, c-format msgid "" "Ignoring long string missing value %zu for variable %s, with width %d, that " "has bad value width %zu." msgstr "" "manjkajoča vrednost dolgega niza %zu spremenljivke %s s širino %d bo " "prezrta, ker širina zapisa %zu ni ustrezna." #: src/data/sys-file-reader.c:2740 msgid "File ends in partial string value." msgstr "Podatki v datoteki se končajo na nepopolni vrednosti niza." #: src/data/sys-file-reader.c:2879 msgid "" "Possible compressed data corruption: compressed spaces appear in numeric " "field." msgstr "" #: src/data/sys-file-reader.c:3030 #, c-format msgid "Suppressed %d additional related warnings." msgstr "Zadržanih je %d dodatnih podobnih opozoril." #: src/data/sys-file-reader.c:3076 src/data/sys-file-reader.c:3093 #, c-format msgid "Dictionary record refers to unknown variable %s." msgstr "Slovarski zapis vključuje sklic na neznano spremenljivko %s." #: src/data/sys-file-reader.c:3159 #, c-format msgid "Expecting digit at offset %zu in MRSETS record." msgstr "pričakovana je številka pri odmiku %zu v zapisu skupine MRSETS." #: src/data/sys-file-reader.c:3167 #, c-format msgid "Expecting space at offset %zu in MRSETS record." msgstr "pričakovan je presledek pri odmiku %zu v zapisu skupine MRSETS." #: src/data/sys-file-reader.c:3175 #, c-format msgid "%zu-byte string starting at offset %zu exceeds record length %zu." msgstr "" "%zu-bajtni znakovni niz z začetkom pri odmiku %zu presega dolžino zapisa %zu." #: src/data/sys-file-reader.c:3185 #, c-format msgid "Expecting space at offset %zu following %zu-byte string." msgstr "pričakovan je presledek pri odmiku %zu za %zu-bajtnim nizom." #: src/data/sys-file-reader.c:3476 #, c-format msgid "Wrong ZLIB data header offset %#llx (expected %#llx)." msgstr "napačen odmik podatkovne glave ZLIB %#llx (pričakovan je %#llx)." #: src/data/sys-file-reader.c:3484 #, c-format msgid "Impossible ZLIB trailer offset 0x%llx." msgstr "nemogoč odmik repa ZLIB 0x%llx." #: src/data/sys-file-reader.c:3491 #, c-format msgid "Invalid ZLIB trailer length %lld." msgstr "neveljavna vrednost repa ZLIB %lld." #: src/data/sys-file-reader.c:3555 #, c-format msgid "End of ZLIB trailer (0x%llx) is not file size (0x%llx)." msgstr "konec repa ZLIB (0x%llx) ni velikost datoteke (0x%llx)." #: src/data/sys-file-reader.c:3565 #, c-format msgid "ZLIB trailer bias (%lld) differs from file header bias (%.2f)." msgstr "vodilo repa ZLIB (%lld) se razlikuje od vodila glave datoteke (%.2f)." #: src/data/sys-file-reader.c:3575 #, c-format msgid "ZLIB trailer \"zero\" field has nonzero value %lld." msgstr "»ničti« rep ZLIB ima neničto vrednost %lld." #: src/data/sys-file-reader.c:3581 #, c-format msgid "ZLIB trailer specifies unexpected %u-byte block size." msgstr "rep ZLIB določa nepričakovano %u-bajtno velikost bloka." #: src/data/sys-file-reader.c:3589 #, c-format msgid "%lld-byte ZLIB trailer specifies %u data blocks (expected %lld)." msgstr "%lld-bajtni rep ZLIB določa %u podatkovnih blokov (pričakovano %lld)." #: src/data/sys-file-reader.c:3614 #, c-format msgid "" "ZLIB block descriptor %u reported uncompressed data offset %#llx, when %#llx " "was expected." msgstr "" "opisnik bloka ZLIB %u najavlja nestisnjen odmik podatkov %#llx, pričakovan " "pa je %#llx." #: src/data/sys-file-reader.c:3623 #, c-format msgid "" "ZLIB block descriptor %u reported compressed data offset %#llx, when %#llx " "was expected." msgstr "" "opisnik bloka ZLIB %u najavlja stisnjen odmik podatkov %#llx, pričakovan p " "aje %#llx." #: src/data/sys-file-reader.c:3633 #, c-format msgid "" "ZLIB block descriptor %u reported block size %#x, when %#x was expected." msgstr "" "opisnik bloka ZLIB %u najavlja velikost bloka %#x, pričakovana pa je " "velikost %#x." #: src/data/sys-file-reader.c:3641 #, c-format msgid "" "ZLIB block descriptor %u reported block size %#x, when at most %#x was " "expected." msgstr "" "Opisnik bloka ZLIB %u najavlja velikost bloka %#x, pričakovana pa je največ " "%#x." #: src/data/sys-file-reader.c:3653 #, c-format msgid "" "ZLIB block descriptor %u reports compressed size %u and uncompressed size %u." msgstr "Opisnik bloka ZLIB %u najavlja stisnjeno velikost %u in razširjeno %u." #: src/data/sys-file-reader.c:3665 #, c-format msgid "" "ZLIB trailer is at offset %#llx but %#llx would be expected from block " "descriptors." msgstr "" "rep ZLIB je pri odmiku %#llx, iz opisnikov bloka pa je pričakovan %#llx." #: src/data/sys-file-reader.c:3684 #, c-format msgid "ZLIB initialization failed (%s)." msgstr "začenjanje ukaza ZLIB je spodletelo (%s)." #: src/data/sys-file-reader.c:3699 #, c-format msgid "Inconsistency at end of ZLIB stream (%s)." msgstr "Zaznana je neskladnost na koncu toka ZLIB (%s)." #: src/data/sys-file-reader.c:3758 #, c-format msgid "ZLIB stream inconsistency (%s)." msgstr "Zaznana je neskladnost toka ZLIB (%s)." #: src/data/sys-file-reader.c:3782 msgid "Unexpected end of ZLIB compressed data." msgstr "Nepričakovan zaključek stisnjenih podatkov ZLIB." #: src/data/sys-file-reader.c:3820 msgid "SPSS System File" msgstr "Sistemska datoteka SPSS" #: src/data/sys-file-writer.c:210 #, c-format msgid "Unknown system file version %d. Treating as version %d." msgstr "" "Neznana različica sistemske datoteke %d. Obravnavana bo kot različica %d." #: src/data/sys-file-writer.c:256 #, c-format msgid "Error opening `%s' for writing as a system file: %s." msgstr "" "prišlo je do napake pri odpiranju datoteke »%s« za pisanje kot sistemske " "datoteke: %s." #: src/data/sys-file-writer.c:1271 #, c-format msgid "An I/O error occurred writing system file `%s'." msgstr "V/I napaka med zapisovanjem sistemske datoteke »%s«." #: src/data/sys-file-writer.c:1378 #, c-format msgid "Failed to initialize ZLIB for compression (%s)." msgstr "Začenjanje ZLIB za stiskanje je spodletela (%s)." #: src/data/sys-file-writer.c:1407 #, c-format msgid "Failed to complete ZLIB stream compression (%s)." msgstr "Zaključevanje stiskanja toka ZLIB je spodletelo (%s)." #: src/data/sys-file-writer.c:1449 #, c-format msgid "ZLIB stream compression failed (%s)." msgstr "Stiskanje toka ZLIB je spodletelo (%s)." #: src/data/sys-file-writer.c:1491 #, c-format msgid "%s: Seek failed (%s)." msgstr "%s: iskanje je spodletelo (%s)." #: src/data/variable.c:58 msgid "Left" msgstr "Levo" #: src/data/variable.c:59 msgid "Right" msgstr "Desno" #: src/data/variable.c:60 msgid "Center" msgstr "Sredinsko" #: src/data/variable.c:66 msgid "Nominal" msgstr "Nominalna (imenska)" #: src/data/variable.c:67 msgid "Ordinal" msgstr "Ordinalna (urejenostna)" #: src/data/variable.c:68 src/language/stats/ks-one-sample.c:300 msgid "Scale" msgstr "Numerična (številska)" #: src/data/variable.c:74 msgid "Input" msgstr "Vhodna spremenljivka" #. TRANSLATORS: This will be part of a filename. Please avoid whitespace. #: src/data/variable.c:75 src/output/spv/spv-writer.c:213 #: src/ui/gui/psppire-output-window.c:547 msgid "Output" msgstr "Izhodna spremenljivka" #: src/data/variable.c:76 msgid "Both" msgstr "Vhodno-izhodna spremenljivka" #: src/data/variable.c:77 src/language/dictionary/sys-file-info.c:237 #: src/ui/gui/psppire-dialog-action-crosstabs.c:86 #: src/ui/gui/psppire-dialog-action-crosstabs.c:98 #: src/ui/gui/psppire-dialog-action-crosstabs.c:133 #: src/ui/gui/psppire-dialog-action-crosstabs.c:141 #: src/ui/gui/psppire-variable-sheet.c:408 src/ui/gui/var-display.c:34 msgid "None" msgstr "Neopredeljeno" #: src/data/variable.c:78 msgid "Partition" msgstr "Razdelitveni filter" #: src/data/variable.c:79 src/ui/gui/reliability.ui:37 msgid "Split" msgstr "Programski ročnik +" #: src/data/variable.c:729 #, c-format msgid "%s (%s)" msgstr "%s (%s)" #: src/data/variable.c:1339 msgid "" "At least one case in the data file had a weight value that was user-missing, " "system-missing, zero, or negative. These case(s) were ignored." msgstr "" "Vsaj en primer v podatkih ima vrednost uteži, ki je uporabniško oziroma " "sistemsko določena manjkajoča vrednost, vrednost enaka nič ali negativna " "vrednost. Ti primeri so prezrti." #: src/language/command.c:207 src/language/stats/graph.c:749 #: src/language/stats/graph.c:755 src/language/stats/graph.c:789 #: src/language/stats/graph.c:794 src/language/stats/graph.c:799 #: src/language/stats/graph.c:852 src/language/stats/graph.c:857 #: src/language/stats/graph.c:862 src/language/stats/graph.c:867 #: src/language/stats/graph.c:872 src/language/stats/graph.c:877 #: src/language/stats/graph.c:882 src/language/utilities/set.q:236 #, c-format msgid "%s is not yet implemented." msgstr "možnost %s še ni podprta." #: src/language/command.c:212 #, c-format msgid "%s may be used only in testing mode." msgstr "ukaz %s je mogoče uporabiti le v preizkusnem načinu." #: src/language/command.c:217 #, c-format msgid "%s may be used only in enhanced syntax mode." msgstr "ukaz %s je mogoče uporabiti le v načinu skladnje." #: src/language/command.c:345 msgid "expecting command name" msgstr "pričakovano je ime ukaza" #: src/language/command.c:347 #, c-format msgid "Unknown command `%s'." msgstr "neznan ukaz » %s «." #: src/language/command.c:380 #, c-format msgid "%s is allowed only before the active dataset has been defined." msgstr "" "ukaz » %s « je mogoče uporabiti le pred določitvijo dejavne podatkovne " "zbirke." #: src/language/command.c:384 #, c-format msgid "%s is allowed only after the active dataset has been defined." msgstr "" "ukaz » %s « je mogoče uporabiti le po določitvi dejavne podatkovne zbirke." #: src/language/command.c:388 src/language/command.c:392 #, c-format msgid "%s is allowed only inside %s." msgstr "ukaz » %s « je mogoče uporabiti le znotraj %s." #: src/language/command.c:399 src/language/command.c:403 #, c-format msgid "" "%s is allowed only before the active dataset has been defined or inside %s." msgstr "" "ukaz » %s « je mogoče uporabiti le pred določitvijo dejavne podatkovne " "zbirke oziroma znotraj %s." #: src/language/command.c:407 src/language/command.c:411 #, c-format msgid "" "%s is allowed only after the active dataset has been defined or inside %s." msgstr "" "ukaz » %s « je mogoče uporabiti le po določitvi dejavne podatkovne zbirke " "oziroma znotraj ukaza %s." #: src/language/command.c:415 #, c-format msgid "%s is allowed only inside %s or inside %s." msgstr "ukaz » %s « je mogoče uporabiti le znotraj %s oziroma %s." #: src/language/command.c:421 #, c-format msgid "" "%s is allowed only after the active dataset has been defined, inside INPUT " "PROGRAM, or inside FILE TYPE." msgstr "" "ukaz » %s « je mogoče uporabiti le po določitvi dejavne podatkovne zbirke in " "znotraj ukazov INPUT PROGRAM oziroma FILE TYPE." #: src/language/command.c:426 #, c-format msgid "" "%s is allowed only before the active dataset has been defined, inside INPUT " "PROGRAM, or inside FILE TYPE." msgstr "" "ukaz » %s « je mogoče uporabiti je pred določitvijo dejavne podatkovne " "zbirke in znotraj ukazov INPUT PROGRAM oziroma FILE TYPE." #: src/language/command.c:444 src/language/command.c:447 #, c-format msgid "%s is not allowed inside %s." msgstr "ukaza » %s « ni mogoče uporabiti znotraj %s." #: src/language/command.c:529 src/language/utilities/host.c:272 #: src/language/utilities/permissions.c:105 #, c-format msgid "This command not allowed when the %s option is set." msgstr "ukaza ni mogoče uporabiti z omogočeno možnostjo %s." #: src/language/command.c:545 #, c-format msgid "Error removing `%s': %s." msgstr "Napaka odstranjevanja »%s«: %s." #: src/language/lexer/lexer.c:296 #, c-format msgid "expecting %s" msgstr "pričakovana je vrednost %s" #: src/language/lexer/lexer.c:300 #, c-format msgid "expecting %s or %s" msgstr "pričakovana je vrednost %s ali %s" #: src/language/lexer/lexer.c:304 #, c-format msgid "expecting %s, %s, or %s" msgstr "pričakovana je vrednost %s, %s ali %s" #: src/language/lexer/lexer.c:309 #, c-format msgid "expecting %s, %s, %s, or %s" msgstr "pričakovana je vrednost %s, %s, %s ali %s" #: src/language/lexer/lexer.c:314 #, c-format msgid "expecting %s, %s, %s, %s, or %s" msgstr "pričakovana je vrednost %s, %s, %s, %s ali %s" #: src/language/lexer/lexer.c:319 #, c-format msgid "expecting %s, %s, %s, %s, %s, or %s" msgstr "pričakovana je vrednost %s, %s, %s, %s, %s ali %s" #: src/language/lexer/lexer.c:325 #, c-format msgid "expecting %s, %s, %s, %s, %s, %s, or %s" msgstr "pričakovana je vrednost %s, %s, %s, %s, %s, %s ali %s" #: src/language/lexer/lexer.c:331 #, c-format msgid "expecting %s, %s, %s, %s, %s, %s, %s, or %s" msgstr "pričakovana je vrednost %s, %s, %s, %s, %s, %s, %s ali %s" #: src/language/lexer/lexer.c:351 #, c-format msgid "Subcommand %s may only be specified once." msgstr "Podrejen ukaz %s je lahko naveden le enkrat." #: src/language/lexer/lexer.c:363 #, c-format msgid "Required subcommand %s was not specified." msgstr "Zahtevani podrejeni ukaz %s ni določen." #: src/language/lexer/lexer.c:371 #, c-format msgid "%s may only be specified once within subcommand %s" msgstr "%s je lahko določen le enkrat znotraj podukaza %s." #: src/language/lexer/lexer.c:380 #, c-format msgid "Required %s specification missing from %s subcommand" msgstr "Zahtevano določilo %s manjka med argumenti podukaza %s" #: src/language/lexer/lexer.c:399 msgid "Syntax error at end of input" msgstr "napaka v skladnji na koncu dovoda" #: src/language/lexer/lexer.c:420 src/language/xforms/select-if.c:60 #: src/language/stats/autorecode.c:206 src/language/stats/npar.c:503 #: src/language/data-io/print-space.c:83 msgid "expecting end of command" msgstr "pričakovan je konec ukaza" #: src/language/lexer/lexer.c:631 msgid "expecting string" msgstr "pričakovan je niz" #: src/language/lexer/lexer.c:660 msgid "expecting integer" msgstr "pričakovano je celo število" #: src/language/lexer/lexer.c:673 msgid "expecting number" msgstr "pričakovano je število" #: src/language/lexer/lexer.c:685 msgid "expecting identifier" msgstr "pričakovano je določilo" #: src/language/lexer/lexer.c:1272 msgid "Syntax error at end of command" msgstr "napaka v skladnji na koncu ukaza" #: src/language/lexer/lexer.c:1281 #, c-format msgid "Syntax error at `%s'" msgstr "napaka v skladnji »%s«" #: src/language/lexer/lexer.c:1284 msgid "Syntax error" msgstr "napaka v skladnji" #: src/language/lexer/lexer.c:1470 #, c-format msgid "String of hex digits has %d characters, which is not a multiple of 2" msgstr "niz šestnajstiških števk ima %d znakov, kar ni večkratnik števila 2" #: src/language/lexer/lexer.c:1477 #, c-format msgid "`%c' is not a valid hex digit" msgstr "»%c« ni veljavna šestnajstiška števka" #: src/language/lexer/lexer.c:1482 #, c-format msgid "" "Unicode string contains %d bytes, which is not in the valid range of 1 to 8 " "bytes" msgstr "" "niz unikod vsebuje %d bajtov, kar ni v veljavnem obsegu med 1 in 8 bajti." #: src/language/lexer/lexer.c:1488 #, c-format msgid "U+%04X is not a valid Unicode code point" msgstr "U+%04X ni veljavna kodna točka nabora Unikod" #: src/language/lexer/lexer.c:1493 msgid "Unterminated string constant" msgstr "Nedoločena konstanta niza" #: src/language/lexer/lexer.c:1497 #, c-format msgid "Missing exponent following `%s'" msgstr "Manjkaj eksponent, ki sledi »%s«" #: src/language/lexer/lexer.c:1502 msgid "Unexpected `.' in middle of command" msgstr "nepričakovana pika » . « sredi ukaza" #: src/language/lexer/lexer.c:1508 #, c-format msgid "Bad character %s in input" msgstr "neveljaven znak %s v dovodu" #: src/language/lexer/lexer.c:1603 #, c-format msgid "Opening `%s': %s." msgstr "Poteka odpiranje »%s«: %s." #: src/language/lexer/lexer.c:1647 #, c-format msgid "Error closing `%s': %s." msgstr "Napaka med zapiranjem »%s«: %s." #: src/language/lexer/subcommand-list.c:118 #, c-format msgid "No more than %d %s subcommands allowed." msgstr "dovoljenih je največ %d %s podrejenih ukazov." #: src/language/lexer/format-parser.c:77 msgid "expecting valid format specifier" msgstr "pričakovano je veljavno določilo zapisa" #: src/language/lexer/format-parser.c:116 #: src/language/lexer/format-parser.c:143 src/language/utilities/output.c:108 #: src/language/data-io/data-list.c:453 src/language/data-io/get-data.c:638 #: src/language/data-io/placement-parser.c:236 #, c-format msgid "Unknown format type `%s'." msgstr "neznana vrsta zapisa »%s«." #: src/language/lexer/format-parser.c:122 #, c-format msgid "Format specifier `%s' lacks required width." msgstr "določilu zapisa »%s« manjka zahtevana širina." #: src/language/lexer/format-parser.c:138 msgid "expecting format type" msgstr "pričakovana je vrsta oblike" #: src/language/lexer/value-parser.c:66 #, c-format msgid "" "The high end of the range (%.*g) is below the low end (%.*g). The range " "will be treated as if reversed." msgstr "" "Zgornja meja obsega (%.*g) je pod spodnjim (%.*g). Obseg bo obravnavan kot " "obrnjen." #: src/language/lexer/value-parser.c:74 #, c-format msgid "Ends of range are equal (%.*g)." msgstr "Meji obsega sta enaki (%.*g)." #: src/language/lexer/value-parser.c:82 #, c-format msgid "%s or %s must be part of a range." msgstr "%s oziroma %s mora biti del obsega." #: src/language/lexer/value-parser.c:112 msgid "System-missing value is not valid here." msgstr "Sistemsko manjkajoča vrednost na tem mestu ni veljavna." #: src/language/lexer/variable-parser.c:86 utilities/pspp-convert.c:83 msgid "expecting variable name" msgstr "pričakovano je ime spremenljivke" #: src/language/lexer/variable-parser.c:96 #, c-format msgid "%s is not a variable name." msgstr "%s ni ime spremenljivke." #: src/language/lexer/variable-parser.c:206 #, c-format msgid "" "%s is not a numeric variable. It will not be included in the variable list." msgstr "spremenljivka » %s « ni številske vrednosti, zato ne bo upoštevana." #: src/language/lexer/variable-parser.c:209 #, c-format msgid "" "%s is not a string variable. It will not be included in the variable list." msgstr "spremenljivka » %s « ni niz, zato ne bo upoštevana." #: src/language/lexer/variable-parser.c:213 #, c-format msgid "Scratch variables (such as %s) are not allowed here." msgstr "" "Začasne spremenljivke (kot je na primer %s) ne tem mestu niso dovoljene." #: src/language/lexer/variable-parser.c:217 #, c-format msgid "" "%s and %s are not the same type. All variables in this variable list must " "be of the same type. %s will be omitted from the list." msgstr "" "spremenljivki » %s « in » %s « nista iste vrste, vendar taki morata biti. " "Spremenljivka » %s « bo odstranjena s seznama." #: src/language/lexer/variable-parser.c:223 #, c-format msgid "" "%s and %s are string variables with different widths. All variables in this " "variable list must have the same width. %s will be omitted from the list." msgstr "" "spremenljivki » %s « in » %s « imata različni širini. Vse spremenljivke na " "tem seznamu morajo biti enake širine. Spremenljivka » %s « bo odstranjena s " "seznama." #: src/language/lexer/variable-parser.c:228 #: src/language/lexer/variable-parser.c:447 #, c-format msgid "Variable %s appears twice in variable list." msgstr "Spremenljivka » %s « se pojavi dvakrat na seznamu spremenljivk." #: src/language/lexer/variable-parser.c:341 #, c-format msgid "%s TO %s is not valid syntax since %s precedes %s in the dictionary." msgstr "" "%s TO %s ni veljaven skladenjski zapis, ker je %s pred %s v slovarju " "spremenljivk." #: src/language/lexer/variable-parser.c:349 #, c-format msgid "" "When using the TO keyword to specify several variables, both variables must " "be from the same variable dictionaries, of either ordinary, scratch, or " "system variables. %s is a %s variable, whereas %s is %s." msgstr "" "pri uporabi ključne besede TO za določitev več spremenljivk, morata biti obe " "spremenljivki iz iste slovarske skupine, običajne, začasne ali sistemske. " "Spremenljivka %s je » %s «, spremenljivka %s pa je » %s «." #: src/language/lexer/variable-parser.c:424 #, c-format msgid "`%s' cannot be used with TO because it does not end in a digit." msgstr "»%s« ni mogoče uporabiti z ukazom TO, ker se ne konča s številko." #: src/language/lexer/variable-parser.c:432 #, c-format msgid "Numeric suffix on `%s' is larger than supported with TO." msgstr "številska pripona na »%s« je večja od podprte z ukazom TO." #: src/language/lexer/variable-parser.c:505 msgid "Scratch variables not allowed here." msgstr "Začasne spremenljivke na tem mestu niso dovoljene." #: src/language/lexer/variable-parser.c:529 msgid "Prefixes don't match in use of TO convention." msgstr "predpona ni skladna z določilo ukaza TO." #: src/language/lexer/variable-parser.c:534 msgid "Bad bounds in use of TO convention." msgstr "neustrezne vrednosti za uporabo z določili ukaza TO." #: src/language/xforms/compute.c:150 src/language/xforms/compute.c:205 #, c-format msgid "" "When executing COMPUTE: SYSMIS is not a valid value as an index into vector " "%s." msgstr "" "pri ukazu COMPUTE SYSMIS ni veljavna vrednost kot število za vektor %s." #: src/language/xforms/compute.c:154 src/language/xforms/compute.c:212 #, c-format msgid "" "When executing COMPUTE: %.*g is not a valid value as an index into vector %s." msgstr "pri ukazu COMPUTE %.*g ni veljavna vrednost kot število za vektor %s." #: src/language/xforms/compute.c:356 #, c-format msgid "There is no vector named %s." msgstr "Ni vektorja, imenovanega %s." #: src/language/xforms/count.c:125 msgid "Destination cannot be a string variable." msgstr "cilj ne more biti spremenljivka niza." #: src/language/xforms/sample.c:76 msgid "The sampling factor must be between 0 and 1 exclusive." msgstr "faktor vzorčenja mora biti med izključno 0 in 1." #: src/language/xforms/sample.c:96 #, c-format msgid "Cannot sample %d observations from a population of %d." msgstr "Ni mogoče vzorčiti %d opazovanj na vzorcu populacije %d." #: src/language/xforms/recode.c:261 msgid "" "Inconsistent target variable types. Target variables must be all numeric or " "all string." msgstr "" "zaznana je nestalna vrsta ciljne spremenljivke. Ciljna spremenljivka mora " "biti v celoti ali številska ali niz znakov." #: src/language/xforms/recode.c:282 msgid "CONVERT requires string input values and numeric output values." msgstr "" "ukaz CONVERT zahteva vhodne vrednosti niza in številske vrednosti odvoda." #: src/language/xforms/recode.c:339 #, c-format msgid "%s is not allowed with string variables." msgstr "vrednost %s ni dovoljena za analizo spremenljivk niza" #: src/language/xforms/recode.c:422 msgid "expecting output value" msgstr "pričakovana je vrednost odvoda" #: src/language/xforms/recode.c:479 #, c-format msgid "" "%zu variable(s) cannot be recoded into %zu variable(s). Specify the same " "number of variables as source and target variables." msgstr "" "navesti je treba enako število izvornih in ciljnih spremenljivk. Trenutno je " "stanje %zu : %zu." #: src/language/xforms/recode.c:494 #, c-format msgid "" "There is no variable named %s. (All string variables specified on INTO must " "already exist. Use the STRING command to create a string variable.)" msgstr "" "ni spremenljivke z imenom %s (vse spremenljivke nizov, določene za ukaz INTO " "morajo že obstajati. Mogoče je uporabiti ukaz STRING za ustvarjanje tovrstne " "spremenljivke)." #: src/language/xforms/recode.c:510 #, c-format msgid "INTO is required with %s input values and %s output values." msgstr "ukaz INTO je zahtevan pri uporabi vhodih vrednosti %s in izhodnih %s." #: src/language/xforms/recode.c:523 #, c-format msgid "Type mismatch. Cannot store %s data in %s variable %s." msgstr "" "neskladje vrste. Ni mogoče shraniti podatkov vrste » %s « v vrsto » %s « " "spremenljivke %s." #: src/language/xforms/recode.c:566 #, c-format msgid "" "Cannot recode because the variable %s would require a width of %d bytes or " "greater, but it has a width of only %d bytes." msgstr "" "prekodiranje ni mogoče ker zahteva spremenljivka » %s « širino %d ali več " "bajtov, širina pa je le %d." #: src/language/xforms/select-if.c:100 msgid "Syntax error expecting OFF or BY. Turning off case filtering." msgstr "" "napaka skladnje pričakovanja ukazov OFF ali BY. Filtriranje primerov bo " "onemogočeno." #: src/language/xforms/select-if.c:115 msgid "The filter variable must be numeric." msgstr "Spremenljivka filtra mora biti številčna vrednost." #: src/language/xforms/select-if.c:121 msgid "The filter variable may not be scratch." msgstr "Spremenljivka filtra ne sme biti začasna spremenljivka." #: src/language/control/control-stack.c:49 #, c-format msgid "%s without %s." msgstr "%s brez %s." #: src/language/control/control-stack.c:77 #, c-format msgid "This command must appear inside %s...%s, without intermediate %s...%s." msgstr "ta ukaz se mora pojaviti znotraj %s...%s, brez vmesnega %s...%s." #: src/language/control/control-stack.c:94 #, c-format msgid "This command cannot appear outside %s...%s." msgstr "Ukaz se ne sme pojaviti izven%s...%s." #: src/language/control/do-if.c:180 #, c-format msgid "This command may not follow %s in %s ... %s." msgstr "Ukaz ne sme slediti %s v %s ... %s." #: src/language/control/loop.c:211 msgid "Only one index clause may be specified." msgstr "določiti je mogoče le en stavek ukaza INDEX." #: src/language/control/repeat.c:120 #, c-format msgid "Dummy variable name `%s' hides dictionary variable `%s'." msgstr "ime slepe spremenljivke »%s« prekrije spremenljivko slovarja »%s«." #: src/language/control/repeat.c:126 #, c-format msgid "Dummy variable name `%s' is given twice." msgstr "slepa spremenljivka »%s« je podana dvakrat." #: src/language/control/repeat.c:170 #, c-format msgid "" "Dummy variable `%s' had %zu substitutions, so `%s' must also, but %zu were " "specified." msgstr "" "slepa spremenljivka »%s« ima %zu zamenjav, enako velja za »%s«, določenih pa " "jih je le %zu." #: src/language/control/repeat.c:379 msgid "Ranges may only have integer bounds." msgstr "obsegi morajo imeti celoštevilčni meji." #: src/language/control/repeat.c:393 #, c-format msgid "%ld TO %ld is an invalid range." msgstr "%ld TO %ld je neveljaven obseg." #: src/language/control/repeat.c:443 #, c-format msgid "No matching %s." msgstr "ni skladne vrednosti %s." #: src/language/control/temporary.c:44 msgid "" "This command may only appear once between procedures and procedure-like " "commands." msgstr "ta ukaz se lahko pojavi le enkrat med opravilom oziroma ukazi opravil." #: src/language/dictionary/attributes.c:104 msgid "Attribute array index must be between 1 and 65535." msgstr "Indeks polja atributa mora biti med 1 in 65535." #: src/language/dictionary/apply-dictionary.c:74 #, c-format msgid "Variable %s is %s in target file, but %s in source file." msgstr "Spremenljivka %s je %s v ciljni datoteki, a %s v izvorni." #: src/language/dictionary/apply-dictionary.c:110 msgid "No matching variables found between the source and target files." msgstr "ni najdenih skladnih spremenljivk med izvorno in ciljno datoteko." #: src/language/dictionary/delete-variables.c:40 #: src/language/dictionary/modify-variables.c:79 #: src/language/dictionary/rename-variables.c:51 #, c-format msgid "" "%s may not be used after %s. Temporary transformations will be made " "permanent." msgstr "" "ukaza %s ni mogoče uporabiti za %s. Začasne pretvorbe bodo uveljavljene " "trajno." #: src/language/dictionary/delete-variables.c:48 #: src/language/dictionary/modify-variables.c:312 #, c-format msgid "" "%s may not be used to delete all variables from the active dataset " "dictionary. Use %s instead." msgstr "" "ukaza %s ni mogoče uporabiti za izbris vseh spremenljivk iz trenutnega " "slovarja podatkovne zbirke. Priporočljivo je uporabiti ukaz %s." #: src/language/dictionary/missing-values.c:70 #, c-format msgid "" "Cannot mix numeric variables (e.g. %s) and string variables (e.g. %s) within " "a single list." msgstr "" "ni mogoče mešati številskih spremenljivk (npr. %s) in besedilnih nizov (npr. " "%s) znotraj enega seznama." #: src/language/dictionary/missing-values.c:91 msgid "" "Too many numeric missing values. At most three individual values or one " "value and one range are allowed." msgstr "" "Preveč je številskih manjkajočih vrednosti. Dovoljene so največ tri " "samostojne vrednosti ali pa ena vrednost in en obseg." #: src/language/dictionary/missing-values.c:126 #, c-format msgid "Truncating missing value to maximum acceptable length (%d bytes)." msgstr "" "manjkajoče vrednosti so prirezane na največjo sprejemljivo dolžino (%d-" "bajtov)" #: src/language/dictionary/missing-values.c:137 msgid "" "Too many string missing values. At most three individual values are allowed." msgstr "" "zaznanih je preveč manjkajočih vrednosti niza. Dovoljene so največ tri " "samostojne vrednosti." #: src/language/dictionary/missing-values.c:154 #, c-format msgid "Missing values provided are too long to assign to variable of width %d." msgstr "" "podane manjkajoče vrednosti so predolge za dodelitev k spremenljivki širine " "%d." #: src/language/dictionary/modify-variables.c:145 msgid "Cannot specify ALL after specifying a set of variables." msgstr "ni mogoče določiti ukaza ALL po določiti nabora spremenljivk." #: src/language/dictionary/modify-variables.c:221 #: src/language/dictionary/rename-variables.c:76 #, c-format msgid "" "Differing number of variables in old name list (%zu) and in new name list " "(%zu)." msgstr "" "število spremenljivk v starem (%zu) in novem seznamu (%zu) se razlikuje." #: src/language/dictionary/modify-variables.c:244 #: src/language/dictionary/modify-variables.c:294 #, c-format msgid "" "%s subcommand may be given at most once. It may not be given in conjunction " "with the %s subcommand." msgstr "" "podukaz %s je mogoče podatki največ enkrat, ni pa ga mogoče podati skupaj s " "podukazom %s." #: src/language/dictionary/modify-variables.c:331 #, c-format msgid "Unrecognized subcommand name `%s'." msgstr "Neprepoznano ime podukaza »%s«." #: src/language/dictionary/modify-variables.c:334 msgid "Subcommand name expected." msgstr "pročakovano je ime podukaza." #: src/language/dictionary/mrsets.c:117 #, c-format msgid "" "VARIABLES specified only variable %s on %s, but at least two variables are " "required." msgstr "" "ukaz VARIABLES določa le spremenljivko %s na %s, zahtevani pa sta vsaj dve " "spremenljivki." #: src/language/dictionary/mrsets.c:150 msgid "Numeric VALUE must be an integer." msgstr "Numerična vrednost mora biti celo število." #: src/language/dictionary/mrsets.c:230 src/language/dictionary/mrsets.c:268 #, c-format msgid "" "MDGROUP subcommand for group %s specifies a string VALUE, but the variables " "specified for this group are numeric." msgstr "" #: src/language/dictionary/mrsets.c:254 #, c-format msgid "" "VALUE string on MDGROUP subcommand for group %s is %d bytes long, but it " "must be no longer than the narrowest variable in the group, which is %s with " "a width of %d bytes." msgstr "" #: src/language/dictionary/mrsets.c:280 #, c-format msgid "" "MDGROUP subcommand for group %s specifies LABELSOURCE=VARLABEL but not " "CATEGORYLABELS=COUNTEDVALUES. Ignoring LABELSOURCE." msgstr "" #: src/language/dictionary/mrsets.c:286 #, c-format msgid "" "MDGROUP subcommand for group %s specifies both LABEL and LABELSOURCE, but " "only one of these subcommands may be used at a time. Ignoring LABELSOURCE." msgstr "" #: src/language/dictionary/mrsets.c:326 #, c-format msgid "" "Variables %s and %s specified as part of multiple dichotomy group %s have " "the same variable label. Categories represented by these variables will not " "be distinguishable in output." msgstr "" "Spremenljivki %s in %s, določeni kot del dihotomne skupine %s imata enako " "oznako. Kategorij, predstavljenih s tema spremenljivkama, v izpisu ne bo " "mogoče razlikovati." #: src/language/dictionary/mrsets.c:356 #, c-format msgid "" "Variable %s specified as part of multiple dichotomy group %s (which has " "CATEGORYLABELS=COUNTEDVALUES) has no value label for its counted value. " "This category will not be distinguishable in output." msgstr "" "Spremenljivka %s, določena kot del dihotomne skupine %s (z določilom " "CATEGORYLABELS=COUNTEDVALUES), nima oznake za štete vrednosti. Kategorije v " "izpisu ne bo mogoče razlikovati." #: src/language/dictionary/mrsets.c:369 #, c-format msgid "" "Variables %s and %s specified as part of multiple dichotomy group %s (which " "has CATEGORYLABELS=COUNTEDVALUES) have the same value label for the group's " "counted value. These categories will not be distinguishable in output." msgstr "" "Spremenljivki %s in %s, določeni kot del dihotomne skupine %s (z določilom " "CATEGORYLABELS=COUNTEDVALUES), imata enake oznake za štete vrednosti. " "Kategorije v izpisu ne bo mogoče razlikovati." #: src/language/dictionary/mrsets.c:426 #, c-format msgid "" "Variables specified on MCGROUP should have the same categories, but %s and " "%s (and possibly others) in multiple category group %s have different value " "labels for value %s." msgstr "" #: src/language/dictionary/mrsets.c:484 #, c-format msgid "No multiple response set named %s." msgstr "ni skupine spremenljivk z imenom %s" #: src/language/dictionary/mrsets.c:533 msgid "" "The active dataset dictionary does not contain any multiple response sets." msgstr "" "trenutni slovar podatkovne zbirke ne vsebuje nobenih skupin spremenljivk." #: src/language/dictionary/mrsets.c:540 msgid "Multiple Response Sets" msgstr "Skupina spremenljivk" #: src/language/dictionary/mrsets.c:543 #: src/language/dictionary/sys-file-info.c:446 #: src/language/dictionary/sys-file-info.c:733 #: src/language/stats/autorecode.c:375 src/language/data-io/data-parser.c:679 #: src/language/data-io/data-parser.c:725 src/language/data-io/print.c:434 #, fuzzy #| msgid "Attribute" msgid "Attributes" msgstr "Atribut" #: src/language/dictionary/mrsets.c:544 #: src/language/dictionary/sys-file-info.c:191 #: src/language/dictionary/sys-file-info.c:301 #: src/language/dictionary/sys-file-info.c:302 #: src/language/dictionary/sys-file-info.c:455 #: src/language/dictionary/sys-file-info.c:570 #: src/ui/gui/psppire-var-sheet-header.c:67 src/ui/gui/compute.ui:157 msgid "Label" msgstr "Oznaka" #: src/language/dictionary/mrsets.c:544 #: src/language/dictionary/sys-file-info.c:241 #, fuzzy #| msgid "Encoding:" msgid "Encoding" msgstr "Kodiranje:" #: src/language/dictionary/mrsets.c:544 #, fuzzy #| msgid "Counted value" msgid "Counted Value" msgstr "Šteta vrednost" #: src/language/dictionary/mrsets.c:544 #, fuzzy #| msgid "Cl_ear Variables" msgid "Member Variables" msgstr "Poč_isti spremenljivke" #: src/language/dictionary/mrsets.c:547 #: src/language/dictionary/sys-file-info.c:470 #: src/ui/gui/psppire-var-sheet-header.c:55 msgid "Name" msgstr "Ime" #: src/language/dictionary/mrsets.c:564 msgid "Dichotomies" msgstr "" #: src/language/dictionary/mrsets.c:565 src/language/stats/logistic.c:1391 #, fuzzy #| msgid "Category" msgid "Categories" msgstr "Kategorija" #: src/language/dictionary/numeric.c:67 #, c-format msgid "Format type %s may not be used with a numeric variable." msgstr "vrste zapisa %s ni mogoče uporabiti s številsko spremenljivko." #: src/language/dictionary/numeric.c:86 src/language/dictionary/numeric.c:153 #, c-format msgid "There is already a variable named %s." msgstr "Spremenljivka z imenom %s že obstaja." #: src/language/dictionary/numeric.c:138 #, c-format msgid "Format type %s may not be used with a string variable." msgstr "vrste zapisa %s ni mogoče uporabiti za spremenljivke nizov." #: src/language/dictionary/rename-variables.c:92 #, c-format msgid "Renaming would duplicate variable name %s." msgstr "preimenovanje bi podvojilo ime spremenljivke %s." #: src/language/dictionary/split-file.c:75 #, fuzzy #| msgid "Split File" msgid "Split Values" msgstr "Razdeli datoteko" #: src/language/dictionary/split-file.c:76 #: src/language/dictionary/split-file.c:77 #: src/language/dictionary/sys-file-info.c:696 #: src/language/stats/chisquare.c:195 src/language/stats/cochran.c:156 #: src/language/stats/cochran.c:185 src/language/stats/examine.c:841 #: src/language/stats/reliability.c:648 src/language/stats/reliability.c:651 #: src/language/stats/crosstabs.q:1303 src/language/stats/crosstabs.q:1325 #: src/language/stats/crosstabs.q:1365 src/language/stats/crosstabs.q:1412 msgid "Value" msgstr "Vrednost" #: src/language/dictionary/split-file.c:79 #: src/language/dictionary/sys-file-info.c:734 #: src/language/stats/chisquare.c:246 src/language/stats/chisquare.c:328 #: src/language/stats/cochran.c:164 src/language/stats/correlations.c:100 #: src/language/stats/descriptives.c:1004 src/language/stats/friedman.c:226 #: src/language/stats/jonckheere-terpstra.c:377 #: src/language/stats/npar-summary.c:113 src/language/stats/quick-cluster.c:588 #: src/language/stats/runs.c:331 src/language/data-io/data-parser.c:683 #: src/language/data-io/data-parser.c:728 src/language/data-io/print.c:438 #: src/ui/gui/psppire-dictview.c:580 src/ui/gui/psppire-data-editor.c:502 msgid "Variable" msgstr "Spremenljivka" #: src/language/dictionary/sys-file-info.c:184 #, fuzzy #| msgid "_Display Data File Information" msgid "File Information" msgstr "_Pokaži podrobnosti podatkovne datoteke" #: src/language/dictionary/sys-file-info.c:185 msgid "Attribute" msgstr "Atribut" #: src/language/dictionary/sys-file-info.c:187 #, fuzzy #| msgid "File:" msgid "File" msgstr "Datoteka:" #: src/language/dictionary/sys-file-info.c:194 #, fuzzy #| msgid "Created:" msgid "Created" msgstr "Ustvarjeno:" #: src/language/dictionary/sys-file-info.c:203 #, fuzzy #| msgid "Integer Format:" msgid "Integer Format" msgstr "Zapis celega števila:" #: src/language/dictionary/sys-file-info.c:205 msgid "Big Endian" msgstr "Big Endian" #: src/language/dictionary/sys-file-info.c:206 msgid "Little Endian" msgstr "Little Endian" #: src/language/dictionary/sys-file-info.c:207 #: src/language/dictionary/sys-file-info.c:216 #: src/language/dictionary/sys-file-info.c:223 src/language/utilities/set.q:930 msgid "Unknown" msgstr "Neznano" #: src/language/dictionary/sys-file-info.c:209 #, fuzzy #| msgid "Real Format:" msgid "Real Format" msgstr "Zapis realnega števila:" #: src/language/dictionary/sys-file-info.c:211 msgid "IEEE 754 LE." msgstr "IEEE 754 LE." #: src/language/dictionary/sys-file-info.c:212 msgid "IEEE 754 BE." msgstr "IEEE 754 BE." #: src/language/dictionary/sys-file-info.c:213 msgid "VAX D." msgstr "VAX D." #: src/language/dictionary/sys-file-info.c:214 msgid "VAX G." msgstr "VAX G." #: src/language/dictionary/sys-file-info.c:215 msgid "IBM 390 Hex Long." msgstr "IBM 390 dolgi šestnajstiški." #: src/language/dictionary/sys-file-info.c:218 #: src/language/dictionary/sys-file-info.c:443 #: src/language/stats/binomial.c:199 src/language/stats/correlations.c:131 #: src/language/stats/correlations.c:159 src/language/stats/descriptives.c:585 #: src/language/stats/factor.c:1658 src/language/stats/factor.c:1701 #: src/language/stats/factor.c:1860 src/language/stats/factor.c:2074 #: src/language/stats/frequencies.c:1583 #: src/language/stats/kruskal-wallis.c:254 #: src/language/stats/kruskal-wallis.c:303 #: src/language/stats/ks-one-sample.c:316 src/language/stats/logistic.c:1187 #: src/language/stats/mann-whitney.c:254 src/language/stats/means.c:718 #: src/language/stats/means.c:800 src/language/stats/median.c:358 #: src/language/stats/oneway.c:985 src/language/stats/oneway.c:1157 #: src/language/stats/reliability.c:591 src/language/stats/regression.c:924 #: src/language/stats/t-test-one-sample.c:132 #: src/language/stats/t-test-paired.c:157 src/language/data-io/list.c:104 #: src/ui/gui/variable-info.ui:25 msgid "Variables" msgstr "Spremenljivke" #: src/language/dictionary/sys-file-info.c:221 src/language/stats/examine.c:929 #: src/language/stats/means.c:697 src/language/stats/reliability.c:548 #: src/language/stats/crosstabs.q:930 msgid "Cases" msgstr "Primeri" #: src/language/dictionary/sys-file-info.c:226 src/language/stats/oneway.c:980 #: src/ui/gui/psppire-var-sheet-header.c:58 src/ui/gui/compute.ui:303 msgid "Type" msgstr "Vrsta" #: src/language/dictionary/sys-file-info.c:230 #, fuzzy #| msgid "Weight:" msgid "Weight" msgstr "Utež:" #: src/language/dictionary/sys-file-info.c:233 #, fuzzy #| msgid "Not weighted." msgid "Not weighted" msgstr "Ni uteženo." #: src/language/dictionary/sys-file-info.c:235 #, fuzzy #| msgid "Compression:" msgid "Compression" msgstr "Stiskanje:" #: src/language/dictionary/sys-file-info.c:245 #: src/language/dictionary/sys-file-info.c:424 #: src/language/dictionary/sys-file-info.c:426 #, fuzzy #| msgid "Comments:" msgid "Documents" msgstr "Opombe:" #: src/language/dictionary/sys-file-info.c:305 #: src/language/dictionary/sys-file-info.c:430 msgid "(none)" msgstr "" #: src/language/dictionary/sys-file-info.c:393 msgid "No variables to display." msgstr "Ni spremenljivk za prikaz!" #: src/language/dictionary/sys-file-info.c:404 msgid "Macros not supported." msgstr "Makri niso podprti." #: src/language/dictionary/sys-file-info.c:426 #, fuzzy #| msgid "Document Line %zu" msgid "Document" msgstr "Vrstica dokumenta %zu" #: src/language/dictionary/sys-file-info.c:454 msgid "Position" msgstr "Vrstica" #: src/language/dictionary/sys-file-info.c:456 msgid "Measurement Level" msgstr "" #: src/language/dictionary/sys-file-info.c:457 #: src/ui/gui/psppire-var-sheet-header.c:85 msgid "Role" msgstr "Vloga" #: src/language/dictionary/sys-file-info.c:458 #: src/ui/gui/psppire-var-sheet-header.c:61 src/ui/gui/compute.ui:215 msgid "Width" msgstr "Širina" #: src/language/dictionary/sys-file-info.c:459 #, fuzzy #| msgid "Align" msgid "Alignment" msgstr "Poravnava" #: src/language/dictionary/sys-file-info.c:460 #: src/language/dictionary/sys-file-info.c:734 msgid "Print Format" msgstr "" #: src/language/dictionary/sys-file-info.c:461 #, fuzzy #| msgid "Integer Format:" msgid "Write Format" msgstr "Zapis celega števila:" #: src/language/dictionary/sys-file-info.c:462 #: src/ui/gui/missing-val-dialog.c:379 src/ui/gui/psppire-var-sheet-header.c:73 #: src/ui/gui/examine.ui:416 src/ui/gui/t-test.ui:105 msgid "Missing Values" msgstr "Manjkajoče vrednosti" #: src/language/dictionary/sys-file-info.c:567 #: src/ui/gui/psppire-var-sheet-header.c:70 src/ui/gui/val-labs-dialog.c:489 #: src/ui/gui/val-labs-dialog.ui:194 msgid "Value Labels" msgstr "Vrednosti oznake" #: src/language/dictionary/sys-file-info.c:573 #, fuzzy #| msgid "Variable View" msgid "Variable Value" msgstr "Pregled spremenljivk" #: src/language/dictionary/sys-file-info.c:577 #, fuzzy #| msgid "Last non-missing value" msgid "User-missing value" msgstr "Zadnja ne-manjkajoča vrednost" #: src/language/dictionary/sys-file-info.c:693 #, fuzzy #| msgid "Variable under test" msgid "Variable and Dataset Attributes" msgstr "Spremenljivka" #: src/language/dictionary/sys-file-info.c:699 #, fuzzy #| msgid "Variable Name: " msgid "Variable and Name" msgstr "Ime spremenljivke: " #: src/language/dictionary/sys-file-info.c:702 #, fuzzy #| msgid "dataset" msgid "(dataset)" msgstr "podatkovna zbirka" #: src/language/dictionary/sys-file-info.c:722 msgid "No vectors defined." msgstr "Ni določenih vektorjev." #: src/language/dictionary/sys-file-info.c:732 #, fuzzy #| msgid "Vector" msgid "Vectors" msgstr "Vektor" #: src/language/dictionary/sys-file-info.c:736 msgid "Vector and Position" msgstr "" #: src/language/dictionary/sys-file-info.c:998 msgid "No valid encodings found." msgstr "Ni zaznanega veljavnega znakovnega kodiranja." #: src/language/dictionary/sys-file-info.c:1004 #, c-format msgid "Usable encodings for %s." msgstr "Uporabna kodiranja za %s." #: src/language/dictionary/sys-file-info.c:1007 #, c-format msgid "" "Encodings that can successfully read %s (by specifying the encoding name on " "the GET command's ENCODING subcommand). Encodings that yield identical text " "are listed together." msgstr "" "Znakovni nabori, ki uspešno kodirajo %s (z določilom imena kodnega nabora z " "ukazom GET in podukazom ENCODING). Nabori, katerih izpis je enak, so " "navedeni skupaj." #: src/language/dictionary/sys-file-info.c:1012 #: src/language/dictionary/sys-file-info.c:1013 msgid "Encodings" msgstr "Kodiranja" #: src/language/dictionary/sys-file-info.c:1042 #, fuzzy, c-format #| msgid "%s encoded text strings." msgid "%s Encoded Text Strings" msgstr "%s kodirani besedilni nizi" #: src/language/dictionary/sys-file-info.c:1046 msgid "" "Text strings in the file dictionary that the previously listed encodings " "interpret differently, along with the interpretations." msgstr "" "Besedilni nizi v slovarju datoteke, ki so v predhodnem seznamu kodiranj " "tolmačeni različno, skupaj s tolmačenjem." #: src/language/dictionary/sys-file-info.c:1049 src/output/text-item.c:57 #: src/ui/gui/psppire-import-assistant.c:885 msgid "Text" msgstr "Besedilo" #: src/language/dictionary/sys-file-info.c:1059 msgid "Purpose" msgstr "Namen" #: src/language/dictionary/value-labels.c:154 #, c-format msgid "Truncating value label to %d bytes." msgstr "Oznaka vrednosti je prirezana na %d bajtno dolžino." #: src/language/dictionary/vector.c:66 #, c-format msgid "A vector named %s already exists." msgstr "Vektor z imenom %s že obstaja." #: src/language/dictionary/vector.c:74 #, c-format msgid "Vector name %s is given twice." msgstr "Ime vektorja %s je podano dvakrat." #: src/language/dictionary/vector.c:98 msgid "A slash must separate each vector specification in VECTOR's long form." msgstr "" "vsako določilo vektorja v dolgem zapisu ukaza VECTOR mora ločevati poševnica" #: src/language/dictionary/vector.c:131 msgid "Vectors must have at least one element." msgstr "Vektorji morajo imeti določen vsaj en element." #: src/language/dictionary/vector.c:151 msgid "expecting vector length" msgstr "pričakovana je dolžina vektorja" #: src/language/dictionary/vector.c:170 #, c-format msgid "%s is an existing variable name." msgstr "%s je že obstoječe ime spremenljivke." #: src/language/dictionary/variable-display.c:121 msgid "Variable display width must be a positive integer." msgstr "Širina spremenljivke mora biti pozitivno celo število." #: src/language/dictionary/weight.c:49 msgid "The weighting variable must be numeric." msgstr "Spremenljivka uteži mora biti številčna vrednost." #: src/language/dictionary/weight.c:54 msgid "The weighting variable may not be scratch." msgstr "Spremenljivka za uteževanje ne sme biti začasna spremenljivka." #: src/language/tests/moments-test.c:50 msgid "expecting weight value" msgstr "pričakovana je vrednost uteži" #: src/language/utilities/cd.c:45 src/language/utilities/include.c:173 #, fuzzy, c-format #| msgid "Cannot change directory to %s: %s " msgid "Cannot change directory to %s: %s" msgstr "Ni mogoče zamenjati mape v %s: %s" #: src/language/utilities/date.c:33 #, c-format msgid "Only %s is currently implemented." msgstr "Trenutno je podprta le funkcija %s." #: src/language/utilities/host.c:60 #, fuzzy #| msgid "Command shell not supported on this platform." msgid "Time limit not supported on this platform." msgstr "Ukazna lupina na tem sistemu ni podprta." #: src/language/utilities/host.c:74 #, c-format msgid "%s: Command exited with status %d." msgstr "" #: src/language/utilities/host.c:95 #, fuzzy, c-format #| msgid "failed to create temporary file" msgid "Failed to create temporary file (%s)." msgstr "ustvarjanje začasne datoteke je spodletelo" #: src/language/utilities/host.c:102 #, c-format msgid "/dev/null: Failed to open (%s)." msgstr "" #: src/language/utilities/host.c:117 #, c-format msgid "Couldn't fork: %s." msgstr "Ni mogoče ustvariti veje: %s." #: src/language/utilities/host.c:193 #, c-format msgid "While running \"%s\", waiting for child process failed (%s)." msgstr "" #: src/language/utilities/host.c:203 #, c-format msgid "Command \"%s\" timed out." msgstr "" #: src/language/utilities/host.c:205 #, c-format msgid "Command \"%s\" terminated by signal %d." msgstr "" #: src/language/utilities/host.c:212 msgid "Command or shell not found" msgstr "" #: src/language/utilities/host.c:214 msgid "Could not invoke command or shell" msgstr "" #: src/language/utilities/host.c:217 #, c-format msgid "Command \"%s\" exited with status %d (%s)." msgstr "" #: src/language/utilities/host.c:220 #, c-format msgid "Command \"%s\" exited with status %d." msgstr "" #: src/language/utilities/host.c:230 #, c-format msgid "Command \"%s\" output could not be read (%s)." msgstr "" #: src/language/utilities/title.c:88 #, c-format msgid " (Entered %s)" msgstr " (vpisano %s)." #: src/language/utilities/include.c:73 #, c-format msgid "Can't find `%s' in include file search path." msgstr "datoteke »%s« ni mogoče najti v vključeni poti." #: src/language/utilities/output.c:128 #, fuzzy, c-format #| msgid "Unknown command `%s'." msgid "Unknown cell class %s." msgstr "neznan ukaz » %s «." #: src/language/utilities/permissions.c:113 #, c-format msgid "Cannot stat %s: %s" msgstr "" #: src/language/utilities/permissions.c:127 #, c-format msgid "Cannot change mode of %s: %s" msgstr "Ni mogoče spremeniti načina %s: %s" #: src/language/stats/aggregate.c:96 msgid "Sum of values" msgstr "Vsota vrednosti" #: src/language/stats/aggregate.c:97 msgid "Mean average" msgstr "Aritmetična sredina" #: src/language/stats/aggregate.c:98 msgid "Median average" msgstr "Mediana sredina" #: src/language/stats/aggregate.c:99 #: src/ui/gui/psppire-dialog-action-descriptives.c:40 #: src/ui/gui/psppire-dialog-action-frequencies.c:41 msgid "Standard deviation" msgstr "Standardni odklon (SD)" #: src/language/stats/aggregate.c:100 #: src/ui/gui/psppire-dialog-action-descriptives.c:42 msgid "Maximum value" msgstr "Največja vrednost" #: src/language/stats/aggregate.c:101 #: src/ui/gui/psppire-dialog-action-descriptives.c:41 msgid "Minimum value" msgstr "Najmanjša vrednost" #: src/language/stats/aggregate.c:102 msgid "Percentage greater than" msgstr "Odstotek večjih kot" #: src/language/stats/aggregate.c:103 msgid "Percentage less than" msgstr "Odstotek manjših kot" #: src/language/stats/aggregate.c:104 msgid "Percentage included in range" msgstr "Odstotek upoštevan v obsegu" #: src/language/stats/aggregate.c:105 msgid "Percentage excluded from range" msgstr "Odstotek izločen iz obsega" #: src/language/stats/aggregate.c:106 msgid "Fraction greater than" msgstr "Delež večjih kot" #: src/language/stats/aggregate.c:107 msgid "Fraction less than" msgstr "Delež manjših kot" #: src/language/stats/aggregate.c:108 msgid "Fraction included in range" msgstr "Delež upoštevan v obsegu" #: src/language/stats/aggregate.c:109 msgid "Fraction excluded from range" msgstr "Delež izločen iz obsega" #: src/language/stats/aggregate.c:110 msgid "Number of cases" msgstr "Število primerov" #: src/language/stats/aggregate.c:111 msgid "Number of cases (unweighted)" msgstr "Število primerov (neuteženo)" #: src/language/stats/aggregate.c:112 msgid "Number of missing values" msgstr "Število manjkajočih vrednosti" #: src/language/stats/aggregate.c:113 msgid "Number of missing values (unweighted)" msgstr "Število manjkajočih vrednosti (neuteženo)" #: src/language/stats/aggregate.c:114 msgid "First non-missing value" msgstr "Prva ne-manjkajoča vrednost" #: src/language/stats/aggregate.c:115 msgid "Last non-missing value" msgstr "Zadnja ne-manjkajoča vrednost" #: src/language/stats/aggregate.c:258 msgid "" "When PRESORTED is specified, specifying sorting directions with (A) or (D) " "has no effect. Output data will be sorted the same way as the input data." msgstr "" "kadar je določen ukaz PRESORTED, določilo smeri razvrščanja (A, naraščajoče) " "oziroma (D, padajoče) nima učinka. Izpis bo razvrščen enako kot vhodni " "podatki." #: src/language/stats/aggregate.c:448 msgid "expecting aggregation function" msgstr "pričakovana je funkcija združevanja podatkov" #: src/language/stats/aggregate.c:460 #, c-format msgid "Unknown aggregation function %s." msgstr "Neznana funkcija združevanja %s." #: src/language/stats/aggregate.c:513 #, c-format msgid "Missing argument %zu to %s." msgstr "Manjka argument %zu za %s" #: src/language/stats/aggregate.c:522 #, c-format msgid "Arguments to %s must be of same type as source variables." msgstr "argumenti za %s morajo biti enake vrste kot izvorne spremenljivke." #: src/language/stats/aggregate.c:541 #, c-format msgid "" "Number of source variables (%zu) does not match number of target variables " "(%zu)." msgstr "" "število izvornih spremenljivk (%zu) ni skladno s številom ciljnih (%zu)." #: src/language/stats/aggregate.c:557 #, c-format msgid "" "The value arguments passed to the %s function are out-of-order. They will " "be treated as if they had been specified in the correct order." msgstr "" "Argumenti vrednosti, določeni za funkcijo %s so v napačnem zaporedju. " "Obravnavani bodo v ustreznem zaporedju." #: src/language/stats/aggregate.c:631 #, c-format msgid "" "Variable name %s is not unique within the aggregate file dictionary, which " "contains the aggregate variables and the break variables." msgstr "" "Ime spremenljivke %s ni enoznačno znotraj slovarja združene datoteke, ki " "vsebuje združene in razdelitvene spremenljivke." #: src/language/stats/autorecode.c:152 #, c-format msgid "Source variable count (%zu) does not match target variable count (%zu)." msgstr "" "število primerov izvorne spremenljivke (%zu) ni skladno s številom ciljne " "(%zu)." #: src/language/stats/autorecode.c:164 #, c-format msgid "Target variable %s duplicates existing variable %s." msgstr "Ciljna spremenljivka %s podvoji obstoječo spremenljivko %s." #: src/language/stats/autorecode.c:221 #, c-format msgid "" "With GROUP, variables may not mix string variables (such as %s) and numeric " "variables (such as %s)." msgstr "" #: src/language/stats/autorecode.c:363 #, fuzzy #| msgid "Recode into Same Variables" msgid "Recoding grouped variables." msgstr "Prekodiraj v iste spremenljivke" #: src/language/stats/autorecode.c:365 #, fuzzy, c-format #| msgid "Replacing %s by %s: %s." msgid "Recoding %s into %s (%s)." msgstr "Zamenjava %s z %s: %s." #: src/language/stats/autorecode.c:369 #, fuzzy, c-format #| msgid "Removing %s: %s." msgid "Recoding %s into %s." msgstr "Odstranjevanje %s: %s." #: src/language/stats/autorecode.c:376 src/ui/gui/recode.ui:209 msgid "New Value" msgstr "Nova vrednost" #: src/language/stats/autorecode.c:376 msgid "Value Label" msgstr "Oznaka vrednosti" #: src/language/stats/autorecode.c:379 #, fuzzy #| msgid "Value" msgid "Old Value" msgstr "Vrednost" #: src/language/stats/binomial.c:138 #, c-format msgid "Variable %s is not dichotomous" msgstr "Vrednosti spremenljivke %s niso dihotomne" #: src/language/stats/binomial.c:182 src/ui/gui/binomial.ui:30 msgid "Binomial Test" msgstr "Binomski test" #: src/language/stats/binomial.c:186 src/language/stats/chisquare.c:183 #: src/language/stats/chisquare.c:239 src/language/stats/chisquare.c:322 #: src/language/stats/cochran.c:188 src/language/stats/correlations.c:94 #: src/language/stats/correlations.c:145 src/language/stats/descriptives.c:991 #: src/language/stats/examine.c:602 src/language/stats/examine.c:742 #: src/language/stats/examine.c:836 src/language/stats/examine.c:925 #: src/language/stats/factor.c:1755 src/language/stats/factor.c:1878 #: src/language/stats/factor.c:1908 src/language/stats/factor.c:2068 #: src/language/stats/factor.c:2102 src/language/stats/frequencies.c:302 #: src/language/stats/frequencies.c:1579 src/language/stats/frequencies.c:1586 #: src/language/stats/friedman.c:250 src/language/stats/glm.c:729 #: src/language/stats/kruskal-wallis.c:249 #: src/language/stats/kruskal-wallis.c:297 #: src/language/stats/ks-one-sample.c:278 src/language/stats/logistic.c:1170 #: src/language/stats/logistic.c:1300 src/language/stats/logistic.c:1330 #: src/language/stats/jonckheere-terpstra.c:361 #: src/language/stats/mann-whitney.c:184 src/language/stats/mann-whitney.c:247 #: src/language/stats/means.c:757 src/language/stats/means.c:811 #: src/language/stats/mcnemar.c:222 src/language/stats/median.c:315 #: src/language/stats/median.c:350 src/language/stats/npar-summary.c:106 #: src/language/stats/oneway.c:973 src/language/stats/oneway.c:1051 #: src/language/stats/oneway.c:1150 src/language/stats/oneway.c:1238 #: src/language/stats/oneway.c:1373 src/language/stats/quick-cluster.c:746 #: src/language/stats/reliability.c:543 src/language/stats/reliability.c:584 #: src/language/stats/reliability.c:633 src/language/stats/reliability.c:644 #: src/language/stats/roc.c:969 src/language/stats/roc.c:1067 #: src/language/stats/regression.c:867 src/language/stats/regression.c:899 #: src/language/stats/regression.c:1023 src/language/stats/regression.c:1089 #: src/language/stats/runs.c:318 src/language/stats/sign.c:102 #: src/language/stats/t-test-indep.c:193 src/language/stats/t-test-indep.c:259 #: src/language/stats/t-test-one-sample.c:68 #: src/language/stats/t-test-one-sample.c:125 #: src/language/stats/t-test-paired.c:150 #: src/language/stats/t-test-paired.c:193 #: src/language/stats/t-test-paired.c:238 src/language/stats/wilcoxon.c:243 #: src/language/stats/wilcoxon.c:282 src/language/stats/crosstabs.q:925 #: src/language/stats/crosstabs.q:1253 src/language/stats/crosstabs.q:1293 #: src/language/stats/crosstabs.q:1302 src/language/stats/crosstabs.q:1331 #: src/language/stats/crosstabs.q:1373 src/language/stats/crosstabs.q:1418 #: src/ui/gui/crosstabs.ui:499 src/ui/gui/oneway.ui:615 msgid "Statistics" msgstr "Statistika" #: src/language/stats/binomial.c:187 src/language/stats/chisquare.c:240 #: src/language/stats/chisquare.c:252 msgid "Category" msgstr "Kategorija" #: src/language/stats/binomial.c:188 src/language/stats/cochran.c:189 #: src/language/stats/correlations.c:97 src/language/stats/correlations.c:155 #: src/language/stats/descriptives.c:993 src/language/stats/examine.c:926 #: src/language/stats/frequencies.c:1588 src/language/stats/friedman.c:251 #: src/language/stats/kruskal-wallis.c:250 #: src/language/stats/ks-one-sample.c:279 src/language/stats/logistic.c:1331 #: src/language/stats/jonckheere-terpstra.c:369 #: src/language/stats/mann-whitney.c:185 src/language/stats/means.c:710 #: src/language/stats/means-calc.c:439 src/language/stats/mcnemar.c:223 #: src/language/stats/median.c:351 src/language/stats/npar-summary.c:107 #: src/language/stats/oneway.c:1052 src/language/stats/reliability.c:544 #: src/language/stats/sign.c:69 src/language/stats/sign.c:70 #: src/language/stats/t-test-indep.c:194 #: src/language/stats/t-test-one-sample.c:126 #: src/language/stats/t-test-paired.c:151 #: src/language/stats/t-test-paired.c:194 src/language/stats/wilcoxon.c:244 #: src/language/stats/crosstabs.q:926 msgid "N" msgstr "N" #: src/language/stats/binomial.c:189 msgid "Observed Prop." msgstr "Opazovana lastnost" #: src/language/stats/binomial.c:190 msgid "Test Prop." msgstr "Preizkusna lastnost" #: src/language/stats/binomial.c:192 src/language/stats/mcnemar.c:224 #: src/language/stats/sign.c:103 src/language/stats/wilcoxon.c:288 #: src/language/stats/crosstabs.q:1306 msgid "Exact Sig. (2-tailed)" msgstr "" "Natančna stat. znač.\n" "(2-smerni test)" #: src/language/stats/binomial.c:193 src/language/stats/mcnemar.c:225 #: src/language/stats/sign.c:104 src/language/stats/wilcoxon.c:289 #: src/language/stats/crosstabs.q:1307 msgid "Exact Sig. (1-tailed)" msgstr "" "Natančna stat. znač.\n" "(1-smerni test)" #: src/language/stats/binomial.c:195 #, fuzzy #| msgid "Group1" msgid "Groups" msgstr "Skupina 1" #: src/language/stats/binomial.c:196 #, fuzzy #| msgid "Group1" msgid "Group 1" msgstr "Skupina 1" #: src/language/stats/binomial.c:196 #, fuzzy #| msgid "Group2" msgid "Group 2" msgstr "Skupina 2" #: src/language/stats/binomial.c:196 src/language/stats/chisquare.c:223 #: src/language/stats/chisquare.c:257 src/language/stats/examine.c:930 #: src/language/stats/factor.c:1756 src/language/stats/frequencies.c:344 #: src/language/stats/glm.c:811 src/language/stats/kruskal-wallis.c:285 #: src/language/stats/logistic.c:1336 src/language/stats/mann-whitney.c:197 #: src/language/stats/means.c:706 src/language/stats/oneway.c:982 #: src/language/stats/oneway.c:1072 src/language/stats/reliability.c:549 #: src/language/stats/regression.c:1031 src/language/stats/sign.c:75 #: src/language/stats/wilcoxon.c:250 #: src/ui/gui/psppire-dialog-action-crosstabs.c:93 #: src/language/stats/crosstabs.q:931 src/language/stats/crosstabs.q:1218 msgid "Total" msgstr "Skupaj" #: src/language/stats/chisquare.c:171 #, fuzzy, c-format #| msgid "" #| "CHISQUARE test specified %d expected values, but %d distinct values were " #| "encountered in variable %s." msgid "" "CHISQUARE test specified %d expected values, but variable %s has %zu " "distinct values." msgstr "" "test CHISQUARE določa %d pričakovanih vrednosti, zaznanih pa je le %d " "enoznačnih vrednosti v spremenljivki %s." #: src/language/stats/chisquare.c:184 src/language/stats/chisquare.c:241 msgid "Observed N" msgstr "Opazovani N" #: src/language/stats/chisquare.c:185 src/language/stats/chisquare.c:242 msgid "Expected N" msgstr "Pričakovani N" #: src/language/stats/chisquare.c:186 src/language/stats/chisquare.c:243 #: src/language/stats/regression.c:1031 #: src/ui/gui/psppire-dialog-action-crosstabs.c:95 #: src/language/stats/crosstabs.q:1267 msgid "Residual" msgstr "Ostanek" #: src/language/stats/chisquare.c:235 src/language/stats/cochran.c:150 #: src/language/stats/median.c:305 src/language/stats/sign.c:66 #: src/ui/gui/frequencies.ui:676 msgid "Frequencies" msgstr "Frekvence" #: src/language/stats/chisquare.c:320 src/language/stats/cochran.c:181 #: src/language/stats/friedman.c:246 src/language/stats/kruskal-wallis.c:295 #: src/language/stats/mann-whitney.c:244 src/language/stats/mcnemar.c:219 #: src/language/stats/median.c:347 src/language/stats/sign.c:100 #: src/language/stats/wilcoxon.c:279 msgid "Test Statistics" msgstr "Statistika preizkusa" #: src/language/stats/chisquare.c:323 #, fuzzy #| msgid "Chi-Square" msgid "Chi-square" msgstr "Hi-kvadrat" #: src/language/stats/chisquare.c:324 src/language/stats/cochran.c:191 #: src/language/stats/examine.c:675 src/language/stats/factor.c:2107 #: src/language/stats/friedman.c:257 src/language/stats/glm.c:733 #: src/language/stats/kruskal-wallis.c:299 src/language/stats/logistic.c:1174 #: src/language/stats/median.c:354 src/language/stats/oneway.c:975 #: src/language/stats/oneway.c:1242 src/language/stats/regression.c:1025 #: src/language/stats/t-test-indep.c:267 #: src/language/stats/t-test-one-sample.c:75 #: src/language/stats/t-test-paired.c:253 src/language/stats/crosstabs.q:1304 msgid "df" msgstr "df" #: src/language/stats/chisquare.c:325 src/language/stats/cochran.c:192 #: src/language/stats/friedman.c:258 src/language/stats/kruskal-wallis.c:300 #: src/language/stats/median.c:355 msgid "Asymp. Sig." msgstr "Asimp. značilnost *" #: src/language/stats/cochran.c:111 msgid "More than two values encountered. Cochran Q test will not be run." msgstr "Zaznanih je več kot le dve vrednosti. Cochranov Q test ne bo izveden." #: src/language/stats/cochran.c:153 #, c-format msgid "Success (%.*g)" msgstr "Uspešno zaključeno (%.*g)" #: src/language/stats/cochran.c:154 #, c-format msgid "Failure (%.*g)" msgstr "Spodletelo opravilo (%.*g)" #: src/language/stats/cochran.c:190 msgid "Cochran's Q" msgstr "Cochranov Q" #: src/language/stats/correlations.c:91 src/language/stats/descriptives.c:987 #: src/language/stats/factor.c:2065 src/language/stats/npar-summary.c:102 msgid "Descriptive Statistics" msgstr "Opisna statistika" #: src/language/stats/correlations.c:95 src/language/stats/descriptives.c:108 #: src/language/stats/examine.c:742 src/language/stats/factor.c:2069 #: src/language/stats/frequencies.c:141 src/language/stats/graph.c:211 #: src/language/stats/ks-one-sample.c:290 src/language/stats/means-calc.c:438 #: src/language/stats/npar-summary.c:108 src/language/stats/oneway.c:1052 #: src/language/stats/t-test-indep.c:195 #: src/language/stats/t-test-one-sample.c:127 #: src/language/stats/t-test-paired.c:152 #: src/language/stats/t-test-paired.c:241 #: src/ui/gui/psppire-dialog-action-descriptives.c:39 #: src/ui/gui/psppire-dialog-action-frequencies.c:40 msgid "Mean" msgstr "Povprečje" #: src/language/stats/correlations.c:96 src/language/stats/examine.c:751 #: src/language/stats/factor.c:2070 src/language/stats/ks-one-sample.c:290 #: src/language/stats/means-calc.c:440 src/language/stats/npar-summary.c:109 #: src/language/stats/oneway.c:1052 src/language/stats/t-test-indep.c:196 #: src/language/stats/t-test-one-sample.c:128 #: src/language/stats/t-test-paired.c:153 #: src/language/stats/t-test-paired.c:242 msgid "Std. Deviation" msgstr "Standardni odklon (SD)" #: src/language/stats/correlations.c:126 msgid "Correlations" msgstr "Korelacije" #: src/language/stats/correlations.c:146 msgid "Pearson Correlation" msgstr "Pearsonova korelacija" #: src/language/stats/correlations.c:147 src/language/stats/oneway.c:1243 #: src/language/stats/t-test-indep.c:268 #: src/language/stats/t-test-one-sample.c:76 #: src/language/stats/t-test-paired.c:254 msgid "Sig. (2-tailed)" msgstr "" "Stat. znač.\n" "(2-smerni test)" #: src/language/stats/correlations.c:147 src/language/stats/factor.c:1913 msgid "Sig. (1-tailed)" msgstr "" "Stat. znač.\n" "(1-smerni test)" #: src/language/stats/correlations.c:151 msgid "Cross-products" msgstr "" #: src/language/stats/correlations.c:152 msgid "Covariance" msgstr "Kovarianca" #: src/language/stats/correlations.c:165 msgid "Significant at .05 level" msgstr "" #: src/language/stats/correlations.c:234 msgid "The data for the chosen variables are all missing or empty." msgstr "" "Podatki izbrane spremenljivke so vse ali manjkajoče ali pa prazne vrednosti." #: src/language/stats/correlations.c:390 src/language/stats/descriptives.c:368 #: src/language/data-io/list.c:166 msgid "No variables specified." msgstr "ni določenih spremenljivk za analizo." #: src/language/stats/descriptives.c:109 src/language/stats/frequencies.c:142 #: src/language/stats/means-calc.c:445 src/language/stats/t-test-indep.c:197 #: src/language/stats/t-test-one-sample.c:129 #: src/language/stats/t-test-paired.c:154 #: src/language/stats/t-test-paired.c:243 msgid "S.E. Mean" msgstr "Povprečje SN" #: src/language/stats/descriptives.c:110 src/language/stats/frequencies.c:145 msgid "Std Dev" msgstr "Std. odklon" #: src/language/stats/descriptives.c:111 src/language/stats/examine.c:750 #: src/language/stats/frequencies.c:146 src/language/stats/means-calc.c:450 #: src/ui/gui/psppire-dialog-action-descriptives.c:46 #: src/ui/gui/psppire-dialog-action-frequencies.c:45 msgid "Variance" msgstr "Varianca" #: src/language/stats/descriptives.c:112 src/language/stats/examine.c:752 #: src/language/stats/frequencies.c:147 src/language/stats/means-calc.c:451 #: src/ui/gui/psppire-dialog-action-descriptives.c:47 #: src/ui/gui/psppire-dialog-action-frequencies.c:50 msgid "Kurtosis" msgstr "Sploščenost" #: src/language/stats/descriptives.c:113 src/language/stats/frequencies.c:148 #: src/language/stats/means-calc.c:452 msgid "S.E. Kurt" msgstr "Sploščenost SN" #: src/language/stats/descriptives.c:114 src/language/stats/examine.c:752 #: src/language/stats/frequencies.c:149 src/language/stats/means-calc.c:453 #: src/ui/gui/psppire-dialog-action-descriptives.c:48 #: src/ui/gui/psppire-dialog-action-frequencies.c:46 msgid "Skewness" msgstr "Asimetrija" #: src/language/stats/descriptives.c:115 src/language/stats/frequencies.c:150 #: src/language/stats/means-calc.c:454 msgid "S.E. Skew" msgstr "Asimetrija SN" #: src/language/stats/descriptives.c:116 src/language/stats/examine.c:751 #: src/language/stats/frequencies.c:151 src/language/stats/means-calc.c:449 #: src/ui/gui/psppire-dialog-action-descriptives.c:43 #: src/ui/gui/psppire-dialog-action-frequencies.c:48 msgid "Range" msgstr "Obseg" #: src/language/stats/descriptives.c:117 src/language/stats/examine.c:751 #: src/language/stats/frequencies.c:152 src/language/stats/graph.c:214 #: src/language/stats/ks-one-sample.c:285 src/language/stats/means-calc.c:447 #: src/language/stats/npar-summary.c:110 src/language/stats/oneway.c:1061 #: src/ui/gui/psppire-dialog-action-descriptives.c:41 #: src/ui/gui/psppire-dialog-action-frequencies.c:42 msgid "Minimum" msgstr "Min" #: src/language/stats/descriptives.c:118 src/language/stats/examine.c:751 #: src/language/stats/frequencies.c:153 src/language/stats/graph.c:213 #: src/language/stats/ks-one-sample.c:285 src/language/stats/means-calc.c:448 #: src/language/stats/npar-summary.c:110 src/language/stats/oneway.c:1061 #: src/ui/gui/psppire-dialog-action-descriptives.c:42 #: src/ui/gui/psppire-dialog-action-frequencies.c:43 msgid "Maximum" msgstr "Maks" #: src/language/stats/descriptives.c:119 src/language/stats/frequencies.c:154 #: src/language/stats/graph.c:212 src/language/stats/means-calc.c:446 #: src/ui/gui/psppire-dialog-action-descriptives.c:44 #: src/ui/gui/psppire-dialog-action-frequencies.c:53 msgid "Sum" msgstr "Vsota" #: src/language/stats/descriptives.c:350 #, c-format msgid "Z-score variable name %s would be a duplicate variable name." msgstr "Ime spremenljivke vrednosti Z %s bi podvojilo ime spremenljivke." #: src/language/stats/descriptives.c:401 msgid "" "DESCRIPTIVES with Z scores ignores TEMPORARY. Temporary transformations " "will be made permanent." msgstr "" "ukaz DESCRIPTIVES, izveden z ukazom Z, prezre ukaz TEMPORARY. Začasne " "pretvorbe bodo uveljavljene trajno." #: src/language/stats/descriptives.c:478 msgid "expecting statistic name: reverting to default" msgstr "" "pričakovano je ime statistične analize: opravilo je povrnjeno na privzeto " "vrednost." #: src/language/stats/descriptives.c:561 msgid "" "Ran out of generic names for Z-score variables. There are only 126 generic " "names: ZSC001-ZSC0999, STDZ01-STDZ09, ZZZZ01-ZZZZ09, ZQZQ01-ZQZQ09." msgstr "" "Dosežena je omejitev privzetih imen za vrednosti Z. Na voljo je le 126 imen: " "ZSC001–ZSC0999, STDZ01–STDZ09, ZZZZ01–ZZZZ09, ZQZQ01–ZQZQ09." #: src/language/stats/descriptives.c:579 #, fuzzy #| msgid "Mapping of variables to corresponding Z-scores." msgid "Mapping of Variables to Z-scores" msgstr "Preslikava spremenljivk v ustrezno vrednost Z." #: src/language/stats/descriptives.c:581 #, fuzzy #| msgid "Name" msgid "Names" msgstr "Ime" #: src/language/stats/descriptives.c:582 src/language/stats/glm.c:739 #: src/language/stats/regression.c:1030 msgid "Source" msgstr "Izvorno" #: src/language/stats/descriptives.c:582 msgid "Target" msgstr "Ciljno" #: src/language/stats/descriptives.c:659 #, fuzzy, c-format #| msgid "Internal error processing Z scores" msgid "Internal error processing Z scores. Please report this to %s." msgstr "Notranja napaka obdelave vrednosti Z" #: src/language/stats/descriptives.c:759 #, c-format msgid "Z-score of %s" msgstr "Vrednost Z spremenljivke %s" #: src/language/stats/descriptives.c:1028 src/language/stats/roc.c:1029 #, fuzzy #| msgid "Valid N (seznamsko)" msgid "Valid N (listwise)" msgstr "Veljavni N (brez nepopolnih)" #: src/language/stats/descriptives.c:1028 #, fuzzy #| msgid "Valid N (seznamsko)" msgid "Missing N (listwise)" msgstr "Veljavni N (brez nepopolnih)" #: src/language/stats/examine.c:75 msgid " (missing)" msgstr "(manjkajoče)" #: src/language/stats/examine.c:225 #, c-format msgid "Boxplot of %s vs. %s" msgstr "Diagram kvartilov %s po %s" #: src/language/stats/examine.c:231 src/language/stats/examine.c:338 #, c-format msgid "Boxplot of %s" msgstr "Diagram kvartilov %s" #: src/language/stats/examine.c:321 msgid "Boxplot" msgstr "Diagram kvartilov" #: src/language/stats/examine.c:418 msgid "Not creating NP plot because data set is empty." msgstr "" #: src/language/stats/examine.c:478 #, c-format msgid "Not creating spreadlevel chart for %s" msgstr "" #: src/language/stats/examine.c:585 #, fuzzy #| msgid "Last non-missing value" msgid "User-missing value." msgstr "Zadnja ne-manjkajoča vrednost" #: src/language/stats/examine.c:591 src/language/stats/examine.c:595 #: src/language/stats/frequencies.c:1606 msgid "Percentiles" msgstr "Percentili" #: src/language/stats/examine.c:603 src/math/percentiles.c:37 msgid "Weighted Average" msgstr "Uteženo povprečje" #: src/language/stats/examine.c:603 msgid "Tukey's Hinges" msgstr "Tukeyevi kvartili" #: src/language/stats/examine.c:610 src/language/stats/examine.c:685 #: src/language/stats/examine.c:759 src/language/stats/examine.c:858 #: src/language/stats/examine.c:938 src/language/stats/mann-whitney.c:200 #: src/language/stats/median.c:319 src/language/stats/t-test-indep.c:227 #: src/language/stats/t-test-indep.c:282 #: src/language/stats/t-test-one-sample.c:87 #, fuzzy #| msgid "_Dependent Variable" msgid "Dependent Variables" msgstr "_Odvisna spremenljivka" #: src/language/stats/examine.c:669 #, fuzzy #| msgid "Dev from Normal" msgid "Tests of Normality" msgstr "Odklon od normalne porazdelitve" #: src/language/stats/examine.c:673 msgid "Shapiro-Wilk" msgstr "" #: src/language/stats/examine.c:674 src/language/stats/examine.c:739 #: src/ui/gui/psppire-checkbox-treeview.c:73 msgid "Statistic" msgstr "Statistika" #: src/language/stats/examine.c:676 src/language/stats/factor.c:2108 #: src/language/stats/glm.c:736 src/language/stats/logistic.c:1175 #: src/language/stats/oneway.c:978 src/language/stats/oneway.c:1154 #: src/language/stats/oneway.c:1376 src/language/stats/regression.c:906 #: src/language/stats/regression.c:1028 src/language/stats/t-test-indep.c:263 #: src/language/stats/t-test-paired.c:196 msgid "Sig." msgstr "Stat. značilnost" #: src/language/stats/examine.c:735 src/language/stats/oneway.c:1045 #: src/ui/gui/descriptives.ui:25 msgid "Descriptives" msgstr "Opisne statistike" #: src/language/stats/examine.c:738 msgid "Aspect" msgstr "" #: src/language/stats/examine.c:739 src/language/stats/oneway.c:1053 #: src/language/stats/oneway.c:1240 src/language/stats/oneway.c:1375 #: src/language/stats/roc.c:975 src/language/stats/regression.c:902 msgid "Std. Error" msgstr "Std. napaka" #: src/language/stats/examine.c:745 src/language/stats/oneway.c:1056 #, c-format msgid "%g%% Confidence Interval for Mean" msgstr "%g%% interval zaupanja za povprečje" #: src/language/stats/examine.c:747 src/language/stats/oneway.c:1058 #: src/language/stats/oneway.c:1382 src/language/stats/roc.c:982 #: src/language/stats/regression.c:913 msgid "Lower Bound" msgstr "Spodnja meja" #: src/language/stats/examine.c:748 src/language/stats/oneway.c:1059 #: src/language/stats/oneway.c:1383 src/language/stats/roc.c:983 #: src/language/stats/regression.c:914 msgid "Upper Bound" msgstr "Zgornja meja" #: src/language/stats/examine.c:750 msgid "5% Trimmed Mean" msgstr "5% obrezana srednja vrednost" #: src/language/stats/examine.c:750 src/language/stats/frequencies.c:143 #: src/language/stats/means-calc.c:442 src/language/stats/median.c:352 #: src/ui/gui/psppire-dialog-action-frequencies.c:52 msgid "Median" msgstr "Mediana" #: src/language/stats/examine.c:752 msgid "Interquartile Range" msgstr "Medkvartilni obseg" #: src/language/stats/examine.c:832 msgid "Extreme Values" msgstr "Skrajne vrednosti" #: src/language/stats/examine.c:840 src/language/stats/quick-cluster.c:664 #: src/language/data-io/list.c:110 msgid "Case Number" msgstr "Številka primera" #: src/language/stats/examine.c:844 #, fuzzy #| msgid "Order by" msgid "Order" msgstr "Razvrsti" #. TRANSLATORS: This is a noun, not an adjective. #: src/language/stats/examine.c:850 #, fuzzy #| msgid "_Extremes" msgid "Extreme" msgstr "_Skrajne vrednosti" #: src/language/stats/examine.c:851 msgid "Highest" msgstr "Najvišja" #: src/language/stats/examine.c:851 msgid "Lowest" msgstr "Najnižja" #: src/language/stats/examine.c:921 src/language/stats/logistic.c:1328 #: src/language/stats/means.c:694 src/language/stats/reliability.c:540 msgid "Case Processing Summary" msgstr "Povzetek obdelave primerov" #: src/language/stats/examine.c:927 src/language/stats/frequencies.c:304 #: src/language/stats/frequencies.c:1494 src/language/stats/logistic.c:1332 #: src/language/stats/means.c:713 src/language/stats/reliability.c:545 #: src/language/stats/crosstabs.q:927 msgid "Percent" msgstr "Odstotek" #: src/language/stats/examine.c:929 src/language/stats/frequencies.c:321 #: src/language/stats/frequencies.c:1590 src/language/stats/quick-cluster.c:766 #: src/language/stats/reliability.c:548 src/language/stats/crosstabs.q:931 msgid "Valid" msgstr "Veljavno" #: src/language/stats/examine.c:929 src/language/stats/frequencies.c:336 #: src/language/stats/frequencies.c:1591 src/language/stats/crosstabs.q:931 msgid "Missing" msgstr "Manjkajoče" #: src/language/stats/examine.c:1550 #, c-format msgid "%s may not be negative. Using default value (%g)." msgstr "vrednost %s ne sme biti negativna, zato bo uporabljena privzeta (%g)." #: src/language/stats/examine.c:1587 msgid "Percentiles must lie in the range (0, 100)" msgstr "Percentili morajo biti znotraj obsega (0, 100)" #: src/language/stats/examine.c:1777 #, c-format msgid "%s and %s are mutually exclusive" msgstr "%s in %s se medsebojno izključujeta" #: src/language/stats/factor.c:1121 #, c-format msgid "Matrix input for %s must be either COV or CORR" msgstr "Dovod matrice za %s mora biti ali kovarianca COV ali korelacija CORR." #: src/language/stats/factor.c:1519 msgid "Factor analysis on a single variable is not useful." msgstr "Faktorska analiza na eni spremenljivki ne vrne uporabnih izračunov." #: src/language/stats/factor.c:1523 msgid "Factor analysis without variables is not possible." msgstr "Faktorska analiza brez določenih spremenljivk ni mogoča." #: src/language/stats/factor.c:1634 msgid "Component Number" msgstr "Številka komponente" #: src/language/stats/factor.c:1634 msgid "Factor Number" msgstr "Številka faktorja" #: src/language/stats/factor.c:1648 src/language/stats/factor.c:1651 msgid "Communalities" msgstr "Komunalitete" #: src/language/stats/factor.c:1653 msgid "Initial" msgstr "Začetno" #: src/language/stats/factor.c:1655 msgid "Extraction" msgstr "Ekstrakcija" #: src/language/stats/factor.c:1697 src/language/stats/factor.c:1777 #: src/language/stats/factor.c:1839 msgid "Component" msgstr "Komponenta" #: src/language/stats/factor.c:1697 src/language/stats/factor.c:1777 #: src/language/stats/factor.c:1839 msgid "Factor" msgstr "Faktor" #: src/language/stats/factor.c:1752 msgid "Total Variance Explained" msgstr "Pojasnjena celotna varianca" #: src/language/stats/factor.c:1758 #, no-c-format msgid "% of Variance" msgstr "% variance" #: src/language/stats/factor.c:1760 #, no-c-format msgid "Cumulative %" msgstr "Zbirni %" #: src/language/stats/factor.c:1763 msgid "Phase" msgstr "" #: src/language/stats/factor.c:1765 msgid "Initial Eigenvalues" msgstr "Začetne lastne vrednosti" #: src/language/stats/factor.c:1769 msgid "Extraction Sums of Squared Loadings" msgstr "Ekstrahirane vsote kvadratov faktorskih korelacij" #: src/language/stats/factor.c:1773 msgid "Rotation Sums of Squared Loadings" msgstr "Rotirane vsote faktorskih korelacij" #: src/language/stats/factor.c:1835 msgid "Factor Correlation Matrix" msgstr "Matrika korelacij faktorjev" #: src/language/stats/factor.c:1842 #, fuzzy #| msgid "Factor" msgid "Factor 2" msgstr "Faktor" #: src/language/stats/factor.c:1874 msgid "Anti-Image Matrices" msgstr "Matrika »Anti-Image«" #: src/language/stats/factor.c:1879 msgid "Anti-image Covariance" msgstr "Kovarianca »Anti-Image«" #: src/language/stats/factor.c:1880 msgid "Anti-image Correlation" msgstr "Korelacija »Anti-Image«" #: src/language/stats/factor.c:1901 msgid "Correlation Matrix" msgstr "Korelacijska matrika" #: src/language/stats/factor.c:1910 src/language/stats/t-test-paired.c:195 msgid "Correlation" msgstr "Korelacija" #: src/language/stats/factor.c:1947 msgid "Determinant" msgstr "Determinanta" #: src/language/stats/factor.c:1958 msgid "Covariance Matrix" msgstr "Kovariančna matrika" #: src/language/stats/factor.c:1990 msgid "" "The dataset contains no complete observations. No analysis will be performed." msgstr "" "v podatkovni zbirki ni nobenega popolnega primera, zato analiza ne bo " "izvedena." #: src/language/stats/factor.c:2014 msgid "The dataset has no complete covariance or correlation matrix." msgstr "podatkovna zbirka nima popolnih kovarianc oziroma matrike korelacij." #: src/language/stats/factor.c:2071 msgid "Analysis N" msgstr "Analiza N" #: src/language/stats/factor.c:2099 msgid "KMO and Bartlett's Test" msgstr "Ustreznost vzorca KMO in Bartlettov test sferičnosti" #: src/language/stats/factor.c:2103 msgid "Kaiser-Meyer-Olkin Measure of Sampling Adequacy" msgstr "Kaiser-Meyer-Olkinova mera za primernost vzorčenja" #: src/language/stats/factor.c:2105 msgid "Bartlett's Test of Sphericity" msgstr "Bartlettov test sferičnosti" #: src/language/stats/factor.c:2106 msgid "Approx. Chi-Square" msgstr "Pribl. Hi-kvadrat" #: src/language/stats/factor.c:2154 #, c-format msgid "" "The %s criteria result in zero factors extracted. Therefore no analysis will " "be performed." msgstr "" #: src/language/stats/factor.c:2161 #, c-format msgid "" "The %s criteria result in more factors than variables, which is not " "meaningful. No analysis will be performed." msgstr "" #: src/language/stats/factor.c:2254 msgid "Component Matrix" msgstr "Matrika komponent" #: src/language/stats/factor.c:2254 msgid "Factor Matrix" msgstr "Faktorska matrika" #: src/language/stats/factor.c:2259 msgid "Pattern Matrix" msgstr "Matrica vzorca" #: src/language/stats/factor.c:2268 msgid "Structure Matrix" msgstr "Matrica zgradba" #: src/language/stats/factor.c:2270 msgid "Rotated Component Matrix" msgstr "Rotirana matrika komponent" #: src/language/stats/factor.c:2271 msgid "Rotated Factor Matrix" msgstr "Rotirana faktorska matrika" #: src/language/stats/flip.c:100 #, c-format msgid "%s ignores %s. Temporary transformations will be made permanent." msgstr "ukaza %s prezre %s. Začasne pretvorbe bodo uveljavljene trajno." #: src/language/stats/flip.c:153 #, c-format msgid "Could not create temporary file for %s." msgstr "Ni mogoče ustvariti začasne datoteke za »%s«." #: src/language/stats/flip.c:341 #, c-format msgid "Error rewinding %s file: %s." msgstr "" #: src/language/stats/flip.c:348 #, c-format msgid "Error creating %s source file." msgstr "Napaka med ustvarjanjem izvorne datoteke %s." #: src/language/stats/flip.c:361 #, c-format msgid "Error reading %s file: %s." msgstr "Napaka med branjem datoteke %s: %s." #: src/language/stats/flip.c:363 #, c-format msgid "Unexpected end of file reading %s file." msgstr "Nepričakovan konec datoteke med branjem podatkov v %s." #: src/language/stats/flip.c:379 #, c-format msgid "Error seeking %s source file: %s." msgstr "Napaka iskanja v izvorni datoteki %s: %s." #: src/language/stats/flip.c:387 #, c-format msgid "Error writing %s source file: %s." msgstr "Napaka med zapisovanjem izvorne datoteke %s: %s." #: src/language/stats/flip.c:402 #, c-format msgid "Error rewinding %s source file: %s." msgstr "" #: src/language/stats/flip.c:433 #, c-format msgid "Error reading %s temporary file: %s." msgstr "Napaka med branjem začasne datoteke %s: %s." #: src/language/stats/flip.c:436 #, c-format msgid "Unexpected end of file reading %s temporary file." msgstr "Nepričakovan konec datoteke med branjem začasne datoteke %s." #: src/language/stats/frequencies.c:144 #: src/ui/gui/psppire-dialog-action-frequencies.c:49 msgid "Mode" msgstr "Modus" #: src/language/stats/frequencies.c:303 src/language/stats/logistic.c:1381 #: src/output/charts/plot-hist-cairo.c:112 msgid "Frequency" msgstr "Frekvenca" #: src/language/stats/frequencies.c:305 msgid "Valid Percent" msgstr "Odstotek veljavnih" #: src/language/stats/frequencies.c:306 src/language/stats/graph.c:208 msgid "Cumulative Percent" msgstr "Zbirni odstotek" #: src/language/stats/frequencies.c:905 msgid "Histogram frequency must be greater than zero." msgstr "Frekvenca histograma mora biti večja od nič." #: src/language/stats/frequencies.c:923 msgid "Histogram percentage must be greater than zero." msgstr "odstotek v histogramu mora biti večji od nič." #: src/language/stats/frequencies.c:1139 #, c-format msgid "" "%s for histogram must be greater than or equal to %s, but %s was specified " "as %.15g and %s as %.15g. %s and %s will be ignored." msgstr "" #: src/language/stats/frequencies.c:1184 #, c-format msgid "" "%s for pie chart must be greater than or equal to %s, but %s was specified " "as %.15g and %s as %.15g. %s and %s will be ignored." msgstr "" #: src/language/stats/frequencies.c:1474 #, c-format msgid "Omitting pie chart for %s, which has only %d unique values." msgstr "" "tortni diagram za %s bo izpuščen, ker ima ta le %d enoznačnih vrednosti." #: src/language/stats/frequencies.c:1477 #, c-format msgid "Omitting pie chart for %s, which has over 50 unique values." msgstr "" "tortni diagram za %s bo izpuščen, ker ima ta prek 50 enoznačnih vrednosti." #: src/language/stats/frequencies.c:1494 src/language/stats/graph.c:205 #: src/language/stats/quick-cluster.c:747 #: src/ui/gui/psppire-dialog-action-crosstabs.c:90 #: src/language/stats/crosstabs.q:789 src/language/stats/crosstabs.q:1262 msgid "Count" msgstr "Števec" #: src/language/stats/friedman.c:220 src/language/stats/kruskal-wallis.c:247 #: src/language/stats/mann-whitney.c:182 src/language/stats/wilcoxon.c:240 msgid "Ranks" msgstr "Rangi" #: src/language/stats/friedman.c:222 src/language/stats/friedman.c:223 #: src/language/stats/kruskal-wallis.c:251 #: src/language/stats/mann-whitney.c:186 src/language/stats/wilcoxon.c:245 msgid "Mean Rank" msgstr "Povprečni rang" #: src/language/stats/friedman.c:253 msgid "Kendall's W" msgstr "Kendallov W" #: src/language/stats/friedman.c:256 src/language/stats/kruskal-wallis.c:298 #: src/language/stats/median.c:353 msgid "Chi-Square" msgstr "Hi-kvadrat" #: src/language/stats/glm.c:169 msgid "Multivariate analysis is not yet implemented" msgstr "Multivariatna analiza še ni podprta." #: src/language/stats/glm.c:274 msgid "Only types 1, 2 & 3 sums of squares are currently implemented" msgstr "Trenutno so podprte le vrste 1, 2 in 3 vsot kvadratov." #: src/language/stats/glm.c:727 msgid "Tests of Between-Subjects Effects" msgstr "Preizkus učinkov med primeri" #: src/language/stats/glm.c:730 #, fuzzy #| msgid "Type %s Sum of Squares" msgid "Type I Sum Of Squares" msgstr "Vsota kvadratov vrste %s" #: src/language/stats/glm.c:731 #, fuzzy #| msgid "Type %s Sum of Squares" msgid "Type II Sum Of Squares" msgstr "Vsota kvadratov vrste %s" #: src/language/stats/glm.c:732 #, fuzzy #| msgid "Type %s Sum of Squares" msgid "Type III Sum Of Squares" msgstr "Vsota kvadratov vrste %s" #: src/language/stats/glm.c:734 src/language/stats/oneway.c:976 #: src/language/stats/regression.c:1026 msgid "Mean Square" msgstr "Kvadrat povprečja" #: src/language/stats/glm.c:735 src/language/stats/oneway.c:977 #: src/language/stats/regression.c:1027 src/language/stats/t-test-indep.c:262 msgid "F" msgstr "F" #: src/language/stats/glm.c:740 msgid "Corrected Model" msgstr "Popravljen model" #: src/language/stats/glm.c:740 msgid "Model" msgstr "Model" #: src/language/stats/glm.c:752 msgid "Intercept" msgstr "Prestrezek" #: src/language/stats/glm.c:802 src/output/pivot-table.c:763 #: src/output/spv/spv.c:867 msgid "Error" msgstr "Napaka" #: src/language/stats/glm.c:819 msgid "Corrected Total" msgstr "Popravljeno skupaj" #: src/language/stats/graph.c:206 msgid "Percentage" msgstr "Odstotek" #: src/language/stats/graph.c:207 msgid "Cumulative Count" msgstr "Zbirni seštevek" #: src/language/stats/graph.c:296 #, fuzzy, c-format msgid "%s vs. %s by %s" msgstr "%s proti %s po %s" #: src/language/stats/graph.c:303 #, c-format msgid "%s vs. %s" msgstr "%s po %s" #: src/language/stats/graph.c:322 msgid "" "Maximum number of scatterplot categories reached. Your BY variable has too " "many distinct values. The coloring of the plot will not be correct." msgstr "" "Doseženo je največje število kategorij razsevnega diagrama. Spremenljivka, " "določen z ukazom BY ima preveč različnih vrednosti, zato obarvanje izrisa ne " "bo pravilno." #: src/language/stats/graph.c:551 src/language/stats/rank.c:636 #, c-format msgid "%s of %s" msgstr "%s od %s" #: src/language/stats/graph.c:698 src/language/stats/graph.c:729 #: src/language/stats/graph.c:777 msgid "Only one chart type is allowed." msgstr "Dovoljena je le ena vrsta diagrama." #: src/language/stats/graph.c:721 src/language/stats/graph.c:820 #: src/language/stats/graph.c:834 msgid "Only one variable is allowed." msgstr "Dovoljena je le ena spremenljivka." #: src/language/stats/graph.c:843 msgid "Variable expected" msgstr "Pričakovana spremenljivka" #: src/language/stats/graph.c:883 msgid "FOOTNOTE is not implemented yet for GRAPH" msgstr "za GRAPH podukaz FOOTNOTE še ni podprt." #: src/language/stats/ks-one-sample.c:274 src/ui/gui/ks-one-sample.ui:24 msgid "One-Sample Kolmogorov-Smirnov Test" msgstr "Kolmogorov-Smirnov preizkus enega vzorca" #: src/language/stats/ks-one-sample.c:284 msgid "Uniform Parameters" msgstr "Parametri enakomerne porazdelitve" #: src/language/stats/ks-one-sample.c:289 msgid "Normal Parameters" msgstr "Parametri normalne porazdelitve" #: src/language/stats/ks-one-sample.c:294 msgid "Poisson Parameters" msgstr "Parametri Poissonove porazdelitve" #: src/language/stats/ks-one-sample.c:295 #: src/ui/gui/psppire-dialog-action-crosstabs.c:76 #: src/language/stats/crosstabs.q:1421 msgid "Lambda" msgstr "Lambda" #: src/language/stats/ks-one-sample.c:300 msgid "Exponential Parameters" msgstr "Parametri potenc" #: src/language/stats/ks-one-sample.c:308 msgid "Most Extreme Differences" msgstr "Najskrajnejše razlike" #: src/language/stats/ks-one-sample.c:309 msgid "Absolute" msgstr "Absolutno" #: src/language/stats/ks-one-sample.c:309 src/language/stats/roc.c:1037 msgid "Positive" msgstr "Pozitivno" #: src/language/stats/ks-one-sample.c:309 src/language/stats/roc.c:1037 msgid "Negative" msgstr "Negativno" #: src/language/stats/ks-one-sample.c:312 msgid "Kolmogorov-Smirnov Z" msgstr "Kolmogorov-Smirnov Z" #: src/language/stats/ks-one-sample.c:313 #: src/language/stats/jonckheere-terpstra.c:374 #: src/language/stats/mann-whitney.c:251 src/language/stats/runs.c:328 #: src/language/stats/wilcoxon.c:284 msgid "Asymp. Sig. (2-tailed)" msgstr "" "Asimp. stat. znač.\n" "(2-smerni test)" #: src/language/stats/logistic.c:327 msgid "All predicted values are either 1 or 0" msgstr "vse napovedane vrednosti so ali 1 ali 0." #: src/language/stats/logistic.c:525 msgid "Dependent variable's values are not dichotomous." msgstr "vrednosti odvisne spremenljivke niso dihotomne" #: src/language/stats/logistic.c:614 #, c-format msgid "" "Category %s does not have at least two distinct values. Logistic regression " "will not be run." msgstr "" "kategorija %s nima vsaj dveh razločnih vrednosti. Logistična regresija ne bo " "izvedena." #: src/language/stats/logistic.c:674 #, c-format msgid "" "Estimation terminated at iteration number %d because parameter estimates " "changed by less than %g" msgstr "" "ocenjevanje se je zaključilo pri %d. ponovitvi, ker so se ocene parametrov " "spremenile za manj kot %g." #: src/language/stats/logistic.c:686 #, c-format msgid "" "Estimation terminated at iteration number %d because Log Likelihood " "decreased by less than %g%%" msgstr "" "ocenjevanje se je zaključilo pri %d. ponovitvi, ker se je logaritem verjetij " "zmanjšal za manj kot %g%%." #: src/language/stats/logistic.c:701 #, c-format msgid "" "Estimation terminated at iteration number %d because maximum iterations has " "been reached" msgstr "" "ocenjevanje se je zaključilo pri %d. ponovitvi (določena meja ponovitev)." #: src/language/stats/logistic.c:994 msgid "Cut point value must be in the range [0,1]" msgstr "točka prereza mora biti v obsegu [0,1]" #: src/language/stats/logistic.c:1139 msgid "Dependent Variable Encoding" msgstr "Kodiranje odvisne spremenljivke" #: src/language/stats/logistic.c:1141 msgid "Mapping" msgstr "" #: src/language/stats/logistic.c:1142 msgid "Internal Value" msgstr "Notranja vrednost" #: src/language/stats/logistic.c:1145 msgid "Original Value" msgstr "Izvorna vrednost" #: src/language/stats/logistic.c:1167 msgid "Variables in the Equation" msgstr "Spremenljivke v izrazu" #: src/language/stats/logistic.c:1171 src/language/stats/regression.c:902 msgid "B" msgstr "B" #: src/language/stats/logistic.c:1172 msgid "S.E." msgstr "SN" #: src/language/stats/logistic.c:1173 msgid "Wald" msgstr "" "Waldov\n" "preizkus" #: src/language/stats/logistic.c:1176 msgid "Exp(B)" msgstr "Exp(B)" #: src/language/stats/logistic.c:1181 #, c-format msgid "%d%% CI for Exp(B)" msgstr "%d%% interval zaupanja za Exp(B)" #: src/language/stats/logistic.c:1183 src/language/stats/t-test-indep.c:274 #: src/language/stats/t-test-one-sample.c:83 #: src/language/stats/t-test-paired.c:249 src/language/stats/crosstabs.q:1369 msgid "Lower" msgstr "Spodnja" #: src/language/stats/logistic.c:1183 src/language/stats/t-test-indep.c:275 #: src/language/stats/t-test-one-sample.c:84 #: src/language/stats/t-test-paired.c:250 src/language/stats/crosstabs.q:1370 msgid "Upper" msgstr "Zgornja" #: src/language/stats/logistic.c:1189 src/language/stats/logistic.c:1470 msgid "Step 1" msgstr "Korak 1" #: src/language/stats/logistic.c:1263 msgid "Constant" msgstr "Konstanta" #: src/language/stats/logistic.c:1298 msgid "Model Summary" msgstr "Povzetek modela" #: src/language/stats/logistic.c:1301 #, fuzzy msgid "-2 Log likelihood" msgstr "-2 Log razmerje verjetij" #: src/language/stats/logistic.c:1302 msgid "Cox & Snell R Square" msgstr "Cox-Snellov R-kvadrat" #: src/language/stats/logistic.c:1303 msgid "Nagelkerke R Square" msgstr "Nagelkerkejev R-kvadrat" #: src/language/stats/logistic.c:1306 src/language/stats/logistic.c:1470 #, fuzzy #| msgid "Step 1" msgid "Step" msgstr "Korak 1" #: src/language/stats/logistic.c:1335 msgid "Unweighted Cases" msgstr "Neuteženi primeri" #: src/language/stats/logistic.c:1336 msgid "Included in Analysis" msgstr "Upoštevano pri analizi" #: src/language/stats/logistic.c:1336 msgid "Missing Cases" msgstr "Manjkajoči primeri" #: src/language/stats/logistic.c:1365 msgid "Categorical Variables' Codings" msgstr "Kodiranje spremenljivk kategorij" #: src/language/stats/logistic.c:1380 #, fuzzy #| msgid "Encodings" msgid "Codings" msgstr "Kodiranja" #: src/language/stats/logistic.c:1383 msgid "Parameter coding" msgstr "Kodiranje parametra" #: src/language/stats/logistic.c:1462 msgid "Classification Table" msgstr "Klasifikacijska razpredelnica" #: src/language/stats/logistic.c:1466 msgid "Predicted" msgstr "Napovedano" #: src/language/stats/logistic.c:1466 #, fuzzy #| msgid "" #| "Percentage\n" #| "Correct" msgid "Percentage Correct" msgstr "" "Odstotek\n" "pravih" #: src/language/stats/logistic.c:1468 msgid "Observed" msgstr "Opazovano" #: src/language/stats/logistic.c:1468 msgid "Overall Percentage" msgstr "Skupni odstotek" #: src/language/stats/jonckheere-terpstra.c:357 msgid "Jonckheere-Terpstra Test" msgstr "Test Jonckheere-Terpstra (J-T)" #: src/language/stats/jonckheere-terpstra.c:364 #, c-format msgid "Number of levels in %s" msgstr "Število ravni v %s" #: src/language/stats/jonckheere-terpstra.c:370 msgid "Observed J-T Statistic" msgstr "Opazovana statistika J-T" #: src/language/stats/jonckheere-terpstra.c:371 msgid "Mean J-T Statistic" msgstr "Statistika povprečja J-T" #: src/language/stats/jonckheere-terpstra.c:372 msgid "Std. Deviation of J-T Statistic" msgstr "Std. odklon statistike J-T" #: src/language/stats/jonckheere-terpstra.c:373 msgid "Std. J-T Statistic" msgstr "Standardna statistika J-T" #: src/language/stats/mann-whitney.c:187 src/language/stats/wilcoxon.c:246 msgid "Sum of Ranks" msgstr "Vsota rangov" #: src/language/stats/mann-whitney.c:248 msgid "Mann-Whitney U" msgstr "Mann-Whitneyev U" #: src/language/stats/mann-whitney.c:249 msgid "Wilcoxon W" msgstr "Wilcoxonov W" #: src/language/stats/mann-whitney.c:250 src/language/stats/runs.c:327 #: src/language/stats/wilcoxon.c:283 msgid "Z" msgstr "Z" #: src/language/stats/means.c:702 msgid "Included" msgstr "Upoštevano" #: src/language/stats/means.c:704 src/language/stats/reliability.c:548 msgid "Excluded" msgstr "Izločeno" #: src/language/stats/means.c:753 msgid "Report" msgstr "Poročilo" #: src/language/stats/means.c:838 #, fuzzy, c-format #| msgid "" #| "Dependent variable %s has no non-missing values. No analysis for this " #| "variable will be done." msgid "" "The table \"%s\" has no non-empty control variables. No result for this " "table will be displayed." msgstr "" "Odvisna spremenljivka %s je brez ne-manjkajočih vrednosti. Za to " "spremenljivko analiza ne bo izvedena." #: src/language/stats/means-calc.c:443 msgid "Group Median" msgstr "Mediana skupine" #: src/language/stats/means-calc.c:455 msgid "First" msgstr "Prvi" #: src/language/stats/means-calc.c:456 msgid "Last" msgstr "Zadnji" #: src/language/stats/means-calc.c:458 msgid "Percent N" msgstr "Odstotek N" #: src/language/stats/means-calc.c:459 msgid "Percent Sum" msgstr "Vsota odstotkov" #: src/language/stats/means-calc.c:461 msgid "Harmonic Mean" msgstr "Harmonično povprečje" #: src/language/stats/means-calc.c:462 msgid "Geom. Mean" msgstr "Geometrijsko povprečje" #: src/language/stats/mcnemar.c:144 msgid "The McNemar test is appropriate only for dichotomous variables" msgstr "McNemarjev test je ustrezen le za dihotomne spremenljivke" #: src/language/stats/mcnemar.c:226 src/language/stats/sign.c:105 msgid "Point Probability" msgstr "Točkovna verjetnost" #: src/language/stats/mcnemar.c:229 src/language/stats/sign.c:78 #: src/language/stats/sign.c:108 src/language/stats/t-test-paired.c:199 #: src/language/stats/t-test-paired.c:257 src/language/stats/wilcoxon.c:253 #: src/language/stats/wilcoxon.c:292 #, fuzzy #| msgid "Pair %d" msgid "Pairs" msgstr "Par %d" #: src/language/stats/median.c:316 msgid "> Median" msgstr "> mediane" #: src/language/stats/median.c:316 msgid "≤ Median" msgstr "≤ mediane" #: src/language/stats/npar.c:536 #, c-format msgid "%s subcommand not currently implemented." msgstr "podukaz %s še ni podprt." #: src/language/stats/npar.c:691 #, c-format msgid "Expecting %s, %s, %s or a number." msgstr "pričakovana je vrednost %s, %s, %s ali število." #: src/language/stats/npar.c:845 #, c-format msgid "" "The specified value of HI (%d) is lower than the specified value of LO (%d)" msgstr "določena NAJVIŠJA (%d) vrednost je nižja od določene NAJNIŽJE (%d)" #: src/language/stats/npar.c:897 #, c-format msgid "" "%d expected values were given, but the specified range (%d-%d) requires " "exactly %d values." msgstr "" "podanih je %d pričakovanih vrednosti, določen obseg (%d–%d) pa zahteva " "natanko %d vrednosti." #: src/language/stats/npar.c:1118 src/language/stats/t-test-parser.c:173 #, c-format msgid "" "PAIRED was specified but the number of variables preceding WITH (%zu) did " "not match the number following (%zu)." msgstr "" #: src/language/stats/oneway.c:361 msgid "LSD" msgstr "LSD" #: src/language/stats/oneway.c:362 src/ui/gui/oneway.ui:338 msgid "Tukey HSD" msgstr "Tukeyev HSD" #: src/language/stats/oneway.c:363 src/ui/gui/oneway.ui:253 msgid "Bonferroni" msgstr "Bonferronijev popravek" #: src/language/stats/oneway.c:364 src/ui/gui/oneway.ui:304 msgid "Scheffé" msgstr "Schefféjeva primerjava" #: src/language/stats/oneway.c:365 msgid "Games-Howell" msgstr "Games-Howell" #: src/language/stats/oneway.c:366 src/ui/gui/oneway.ui:321 msgid "Šidák" msgstr "Šidákov popravek" #: src/language/stats/oneway.c:519 #, c-format msgid "The post hoc analysis method %s is not supported." msgstr "Metoda analize post hoc %s ni podprta." #: src/language/stats/oneway.c:842 #, c-format msgid "" "Dependent variable %s has no non-missing values. No analysis for this " "variable will be done." msgstr "" "Odvisna spremenljivka %s je brez ne-manjkajočih vrednosti. Za to " "spremenljivko analiza ne bo izvedena." #: src/language/stats/oneway.c:924 #, c-format msgid "" "In contrast list %zu, the number of coefficients (%zu) does not equal the " "number of groups (%d). This contrast list will be ignored." msgstr "" "na seznamu kontrastov %zu število koeficientov (%zu) ni enako številu skupin " "(%d). Ta seznam bo prezrt." #: src/language/stats/oneway.c:936 #, c-format msgid "Coefficients for contrast %zu do not total zero" msgstr "končna vrednost koeficientov kontrasta %zu ni enaka nič" #: src/language/stats/oneway.c:971 msgid "ANOVA" msgstr "ANOVA" #: src/language/stats/oneway.c:974 src/language/stats/regression.c:1024 msgid "Sum of Squares" msgstr "Vsota kvadratov" #: src/language/stats/oneway.c:981 msgid "Between Groups" msgstr "Med skupinami" #: src/language/stats/oneway.c:981 msgid "Within Groups" msgstr "Znotraj skupin" #: src/language/stats/oneway.c:1075 src/language/stats/oneway.c:1257 #, fuzzy #| msgid "_Dependent Variable" msgid "Dependent Variable" msgstr "_Odvisna spremenljivka" #: src/language/stats/oneway.c:1148 msgid "Test of Homogeneity of Variances" msgstr "Test homogenosti varianc" #: src/language/stats/oneway.c:1151 msgid "Levene Statistic" msgstr "Levenova statistika" #: src/language/stats/oneway.c:1152 msgid "df1" msgstr "df1" #: src/language/stats/oneway.c:1153 msgid "df2" msgstr "df2" #: src/language/stats/oneway.c:1192 msgid "Contrast Coefficients" msgstr "Koeficienti kontrasta" #: src/language/stats/oneway.c:1199 src/language/stats/oneway.c:1246 msgid "Contrast" msgstr "Kontrast" #: src/language/stats/oneway.c:1236 msgid "Contrast Tests" msgstr "Testi kontrastov" #: src/language/stats/oneway.c:1239 msgid "Value of Contrast" msgstr "Vrednost kontrasta" #: src/language/stats/oneway.c:1241 src/language/stats/regression.c:905 #: src/language/stats/t-test-indep.c:266 #: src/language/stats/t-test-one-sample.c:74 #: src/language/stats/t-test-paired.c:252 msgid "t" msgstr "t" #: src/language/stats/oneway.c:1252 msgid "Assumption" msgstr "" #: src/language/stats/oneway.c:1253 msgid "Assume equal variances" msgstr "Privzemi enakost varianc" #: src/language/stats/oneway.c:1254 #, fuzzy #| msgid "Does not assume equal" msgid "Does not assume equal variances" msgstr "Ne privzemi enakosti" #: src/language/stats/oneway.c:1367 #, c-format msgid "Multiple Comparisons (%s)" msgstr "Večkratne primerjave (%s)" #: src/language/stats/oneway.c:1374 #, fuzzy #| msgid "Mean Difference" msgid "Mean Difference (I - J)" msgstr "Povprečna razlika" #: src/language/stats/oneway.c:1379 #, c-format msgid "%g%% Confidence Interval" msgstr "%g%% interval zaupanja" #: src/language/stats/oneway.c:1386 src/language/stats/oneway.c:1390 msgid "(J) Family" msgstr "" #: src/language/stats/oneway.c:1406 #, fuzzy #| msgid "Runs Test" msgid "Test" msgstr "Izvedi analizo" #: src/language/stats/quick-cluster.c:576 msgid "Initial Cluster Centers" msgstr "Začetka središča gruče" #: src/language/stats/quick-cluster.c:577 msgid "Final Cluster Centers" msgstr "Končna središča gruče" #: src/language/stats/quick-cluster.c:580 #: src/language/stats/quick-cluster.c:660 #: src/language/stats/quick-cluster.c:661 #: src/language/stats/quick-cluster.c:753 msgid "Cluster" msgstr "Gruča" #: src/language/stats/quick-cluster.c:658 msgid "Cluster Membership" msgstr "Članstvo gruče" #: src/language/stats/quick-cluster.c:744 msgid "Number of Cases in each Cluster" msgstr "Število primerov v vsaki gruči." #: src/language/stats/quick-cluster.c:750 #, fuzzy #| msgid "Cluster" msgid "Clusters" msgstr "Gruča" #: src/language/stats/quick-cluster.c:867 #: src/language/stats/quick-cluster.c:893 #, fuzzy, c-format #| msgid "Variable %s already exists." msgid "A variable called `%s' already exists." msgstr "spremenljivka %s že obstaja." #: src/language/stats/quick-cluster.c:908 #, fuzzy, c-format #| msgid "expecting %s or %s" msgid "Expecting %s or %s." msgstr "pričakovana je vrednost %s ali %s" #: src/language/stats/quick-cluster.c:928 msgid "The number of clusters must be positive" msgstr "Število gruč mora biti pozitivna vrednost" #: src/language/stats/quick-cluster.c:944 #, fuzzy #| msgid "The convergence criterium must be positive" msgid "The convergence criterion must be positive" msgstr "Kriterij konvergence mora biti pozitivna vrednost" #: src/language/stats/quick-cluster.c:960 msgid "The number of iterations must be positive" msgstr "Število ponovitev mora biti pozitivna vrednost" #: src/language/stats/rank.c:205 #, c-format msgid "" "Cannot generate variable name for ranking %s with %s. All candidates in use." msgstr "" "ni mogoče ustvariti imena spremenljivke za rangiranje %s z %s. Uporabljeni " "bodo vsi ustrezni primeri." #: src/language/stats/rank.c:321 #, c-format msgid "Too many variables in %s clause." msgstr "določenih je preveč spremenljivk v izrazu %s." #: src/language/stats/rank.c:323 #, c-format msgid "Variable %s already exists." msgstr "spremenljivka %s že obstaja." #: src/language/stats/rank.c:325 src/language/expressions/evaluate.c:164 #, c-format msgid "Duplicate variable name %s." msgstr "podvojeno ime spremenljivke %s." #: src/language/stats/rank.c:631 #, fuzzy, c-format msgid "%s of %s by %s" msgstr "%s od %s po %s" #: src/language/stats/rank.c:825 #, fuzzy #| msgid "Variables Created By %s" msgid "Variables Created by RANK" msgstr "Spremenljivke ustvarjene z ukazom %s." #: src/language/stats/rank.c:828 src/language/stats/rank.c:829 #, fuzzy #| msgid "Name Variable:" msgid "New Variable" msgstr "Ime spremenljivke:" #: src/language/stats/rank.c:829 #, fuzzy #| msgid "Function: " msgid "Function" msgstr "Funkcija: " #: src/language/stats/rank.c:830 #, fuzzy #| msgid "Extraction" msgid "Fraction" msgstr "Ekstrakcija" #: src/language/stats/rank.c:830 #, fuzzy #| msgid "_Grouping Variable:" msgid "Grouping Variables" msgstr "Spremenljivka skupin:" #: src/language/stats/rank.c:833 src/language/stats/rank.c:834 #, fuzzy #| msgid "_Test Variable:" msgid "Existing Variable" msgstr "_Preizkusna spremenljivka:" #: src/language/stats/reliability.c:164 msgid "Reliability on a single variable is not useful." msgstr "analiza zanesljivosti, podana ne eni spremenljivki, ni uporabna." #: src/language/stats/reliability.c:281 msgid "" "The STATISTICS subcommand is not yet implemented. No statistics will be " "produced." msgstr "podukaz STATISTICS še ni podprt, zato analiza ne bo izvedena." #: src/language/stats/reliability.c:300 msgid "The split point must be less than the number of variables" msgstr "točka razdelitve mora biti manjša od števila spremenljivk." #: src/language/stats/reliability.c:525 #, c-format msgid "Scale: %s" msgstr "Merilo: %s" #: src/language/stats/reliability.c:582 msgid "Item-Total Statistics" msgstr "Diskriminativnost postavk" #: src/language/stats/reliability.c:585 msgid "Scale Mean if Item Deleted" msgstr "" "Povprečje,\n" "če je postavka izbrisana" #: src/language/stats/reliability.c:586 msgid "Scale Variance if Item Deleted" msgstr "" "Varianca,\n" "če je postavka izbrisana" #: src/language/stats/reliability.c:587 msgid "Corrected Item-Total Correlation" msgstr "" "Popravljena\n" "diskriminativnost postavk" #: src/language/stats/reliability.c:588 msgid "Cronbach's Alpha if Item Deleted" msgstr "" "Cronbachov alfa,\n" "če je predmet izbrisan" #: src/language/stats/reliability.c:627 msgid "Reliability Statistics" msgstr "Analiza zanesljivosti" #: src/language/stats/reliability.c:634 src/language/stats/reliability.c:646 msgid "Cronbach's Alpha" msgstr "Cronbachov alfa" #: src/language/stats/reliability.c:635 src/language/stats/reliability.c:649 #: src/language/stats/reliability.c:652 msgid "N of Items" msgstr "N postavk" #: src/language/stats/reliability.c:647 msgid "Part 1" msgstr "Del 1" #: src/language/stats/reliability.c:650 msgid "Part 2" msgstr "Del 2" #: src/language/stats/reliability.c:654 msgid "Total N of Items" msgstr "Skupno N postavk" #: src/language/stats/reliability.c:656 msgid "Correlation Between Forms" msgstr "Korelacija med oblikami" #: src/language/stats/reliability.c:659 msgid "Spearman-Brown Coefficient" msgstr "Spearman-Brownov koeficient" #: src/language/stats/reliability.c:660 msgid "Equal Length" msgstr "Enake dolžine" #: src/language/stats/reliability.c:661 msgid "Unequal Length" msgstr "Neenake dolžine" #: src/language/stats/reliability.c:663 msgid "Guttman Split-Half Coefficient" msgstr "Guttmanov razpolovitveni koeficient" #: src/language/stats/roc.c:966 msgid "Area Under the Curve" msgstr "Površina pod krivuljo" #: src/language/stats/roc.c:970 msgid "Area" msgstr "Površina" #: src/language/stats/roc.c:976 msgid "Asymptotic Sig." msgstr "Asimp. značilnost -" #: src/language/stats/roc.c:979 #, c-format msgid "Asymp. %g%% Confidence Interval" msgstr "Asimp. %g%% interval zaupanja" #: src/language/stats/roc.c:987 msgid "Variable under test" msgstr "Spremenljivka" #: src/language/stats/roc.c:1026 msgid "Case Summary" msgstr "Povzetek primera" #: src/language/stats/roc.c:1030 msgid "Unweighted" msgstr "Neuteženo" #: src/language/stats/roc.c:1031 msgid "Weighted" msgstr "Uteženo" #: src/language/stats/roc.c:1064 msgid "Coordinates of the Curve" msgstr "Koordinate krivulje" #: src/language/stats/roc.c:1068 msgid "Positive if greater than or equal to" msgstr "Pozitivno, če je večje ali enako" #: src/language/stats/roc.c:1069 src/output/charts/roc-chart-cairo.c:38 msgid "Sensitivity" msgstr "Občutljivost" #: src/language/stats/roc.c:1069 src/output/charts/roc-chart-cairo.c:37 msgid "1 - Specificity" msgstr "1 - Specifičnost" #: src/language/stats/roc.c:1072 #, fuzzy #| msgid "ordinary" msgid "Coordinates" msgstr "običajna" #: src/language/stats/roc.c:1076 msgid "Test variable" msgstr "Spremenljivka" #: src/language/stats/regression.c:224 src/language/stats/regression.c:229 #, c-format msgid "VARIABLES may not appear after %s" msgstr "ukaz VARIABLES se ne sme pojaviti za %s" #: src/language/stats/regression.c:412 msgid "" "REGRESSION with SAVE ignores TEMPORARY. Temporary transformations will be " "made permanent." msgstr "" "ukaz REGRESON, izveden z ukazom SAVE, onemogoči ukaz TEMPORARY. Začasne " "pretvorbe bodo uveljavljene trajno." #: src/language/stats/regression.c:416 msgid "REGRESSION with SAVE ignores FILTER. All cases will be processed." msgstr "" "ukaz REGRESSION z ukazom SAVE onemogoči filtriranje z ukazom FILTER. " "Obdelani bodo vsi primeri v podatkovni zbirki." #: src/language/stats/regression.c:569 msgid "" "The dependent variable is equal to the independent variable. The least " "squares line is therefore Y=X. Standard errors and related statistics may be " "meaningless." msgstr "" "odvisna spremenljivka je enaka neodvisni, zato je izračun najmanjših " "kvadratov Y = X. Standardne napake in sorodne statistike so najverjetneje " "brez pomena." #: src/language/stats/regression.c:776 msgid "No valid data found. This command was skipped." msgstr "ni veljavnih podatkov, zato analiza ni izvedena." #: src/language/stats/regression.c:863 #, c-format msgid "Model Summary (%s)" msgstr "Povzetek modela (%s)" #: src/language/stats/regression.c:868 #: src/ui/gui/psppire-dialog-action-regression.c:42 msgid "R" msgstr "Preizkus R" #: src/language/stats/regression.c:868 msgid "R Square" msgstr "R-kvadrat" #: src/language/stats/regression.c:868 msgid "Adjusted R Square" msgstr "Prilagojeni R-kvadrat" #: src/language/stats/regression.c:869 msgid "Std. Error of the Estimate" msgstr "SN ocene" #: src/language/stats/regression.c:895 #, c-format msgid "Coefficients (%s)" msgstr "Koeficienti (%s)" #: src/language/stats/regression.c:901 msgid "Unstandardized Coefficients" msgstr "Nestandardizirani koeficienti" #: src/language/stats/regression.c:904 msgid "Standardized Coefficients" msgstr "Standardizirani koeficienti" #: src/language/stats/regression.c:904 msgid "Beta" msgstr "Beta" #: src/language/stats/regression.c:911 #, c-format msgid "%g%% Confidence Interval for B" msgstr "%g%% interval zaupanja za B" #: src/language/stats/regression.c:919 #, fuzzy #| msgid "Reliability Statistics" msgid "Collinearity Statistics" msgstr "Analiza zanesljivosti" #: src/language/stats/regression.c:920 #, fuzzy #| msgid "Covariance" msgid "Tolerance" msgstr "Kovarianca" #: src/language/stats/regression.c:920 msgid "VIF" msgstr "" #: src/language/stats/regression.c:933 msgid "(Constant)" msgstr "(Konstanta)" #: src/language/stats/regression.c:1020 #, c-format msgid "ANOVA (%s)" msgstr "ANOVA (%s)" #: src/language/stats/regression.c:1031 src/ui/gui/regression.ui:24 msgid "Regression" msgstr "Regresija" #: src/language/stats/regression.c:1075 #, c-format msgid "Coefficient Correlations (%s)" msgstr "Korelacije koeficientov (%s)" #: src/language/stats/regression.c:1082 #, fuzzy #| msgid "Model" msgid "Models" msgstr "Model" #: src/language/stats/regression.c:1090 msgid "Covariances" msgstr "Kovariance" #: src/language/stats/runs.c:169 #, c-format msgid "" "Multiple modes exist for variable `%s'. Using %.*g as the threshold value." msgstr "" "za spremenljivko » %s « obstaja več modusov. Uporabljen bo %.*g kot mejna " "vrednost." #: src/language/stats/runs.c:314 src/ui/gui/runs.ui:24 msgid "Runs Test" msgstr "Izvedi analizo" #: src/language/stats/runs.c:319 msgid "Test Value" msgstr "Preizkusna vrednost" #: src/language/stats/runs.c:320 msgid "Test Value (mode)" msgstr "Preizkusna vrednost (modus)" #: src/language/stats/runs.c:321 msgid "Test Value (mean)" msgstr "Preizkusna vrednost (povprečje)" #: src/language/stats/runs.c:322 msgid "Test Value (median)" msgstr "Preizkusna vrednost (mediana)" #: src/language/stats/runs.c:323 msgid "Cases < Test Value" msgstr "Primeri < Preizkusna vrednost" #: src/language/stats/runs.c:324 msgid "Cases ≥ Test Value" msgstr "Primeri ≥ Preizkusna vrednost" #: src/language/stats/runs.c:325 msgid "Total Cases" msgstr "Skupno primerov" #: src/language/stats/runs.c:326 msgid "Number of Runs" msgstr "Število sekvenc" #: src/language/stats/sign.c:72 #, fuzzy #| msgid "Mean Difference" msgid "Differences" msgstr "Povprečna razlika" #: src/language/stats/sign.c:73 msgid "Negative Differences" msgstr "Negativne razlike" #: src/language/stats/sign.c:74 msgid "Positive Differences" msgstr "Pozitivne razlike" #: src/language/stats/sign.c:75 src/language/stats/wilcoxon.c:250 msgid "Ties" msgstr "Vezi" #: src/language/stats/sort-cases.c:63 msgid "Buffer limit must be at least 2." msgstr "Omejitev medpomnilnika mora biti vsaj 2." #: src/language/stats/sort-criteria.c:89 #, c-format msgid "Variable %s specified twice in sort criteria." msgstr "spremenljivka %s je določena dvakrat med kriteriji razvrščanja." #: src/language/stats/t-test-indep.c:190 msgid "Group Statistics" msgstr "Statistika skupine" #: src/language/stats/t-test-indep.c:200 #, fuzzy #| msgid "Group1" msgid "Group" msgstr "Skupina 1" #: src/language/stats/t-test-indep.c:256 msgid "Independent Samples Test" msgstr "Test neodvisnih vzorcev" #: src/language/stats/t-test-indep.c:261 msgid "Levene's Test for Equality of Variances" msgstr "Levenov test enakosti varianc" #: src/language/stats/t-test-indep.c:265 #, fuzzy #| msgid "t-test for Equality of Means" msgid "T-Test for Equality of Means" msgstr "T-test enakosti povprečij" #: src/language/stats/t-test-indep.c:269 #: src/language/stats/t-test-one-sample.c:77 msgid "Mean Difference" msgstr "Povprečna razlika" #: src/language/stats/t-test-indep.c:270 msgid "Std. Error Difference" msgstr "Razlika SN" #: src/language/stats/t-test-indep.c:273 #, fuzzy, no-c-format #| msgid "%g%% Confidence Interval of the Difference" msgid "95% Confidence Interval of the Difference" msgstr "%g%% interval zaupanja razlike" #: src/language/stats/t-test-indep.c:277 #, fuzzy #| msgid "Options" msgid "Assumptions" msgstr "Možnosti" #: src/language/stats/t-test-indep.c:278 msgid "Equal variances assumed" msgstr "Predpostavljena enakost varianc" #: src/language/stats/t-test-indep.c:279 msgid "Equal variances not assumed" msgstr "Brez predpostavljene enakosti varianc" #: src/language/stats/t-test-one-sample.c:64 msgid "One-Sample Test" msgstr "T-test enega vzorca" #: src/language/stats/t-test-one-sample.c:71 #, fuzzy, c-format #| msgid "Test Value = %f" msgid "Test Value = %.*g" msgstr "Preizkusna vrednost = %f" #: src/language/stats/t-test-one-sample.c:80 #: src/language/stats/t-test-paired.c:246 #, c-format msgid "%g%% Confidence Interval of the Difference" msgstr "%g%% interval zaupanja razlike" #: src/language/stats/t-test-one-sample.c:122 msgid "One-Sample Statistics" msgstr "Statistika enega vzorca" #: src/language/stats/t-test-paired.c:147 msgid "Paired Sample Statistics" msgstr "Statistika odvisnih parov vzorcev" #: src/language/stats/t-test-paired.c:163 #: src/language/stats/t-test-paired.c:205 #: src/language/stats/t-test-paired.c:263 #, fuzzy, c-format #| msgid "Pair %d" msgid "Pair %zu" msgstr "Par %d" #: src/language/stats/t-test-paired.c:190 msgid "Paired Samples Correlations" msgstr "Korelacije odvisnih parov vzorcev" #: src/language/stats/t-test-paired.c:208 #, c-format msgid "%s & %s" msgstr "%s in %s" #: src/language/stats/t-test-paired.c:234 msgid "Paired Samples Test" msgstr "Test odvisnih parov vzorcev" #: src/language/stats/t-test-paired.c:240 msgid "Paired Differences" msgstr "Razlike odvisnih parov vzorcev" #: src/language/stats/t-test-paired.c:266 #, c-format msgid "%s - %s" msgstr "%s – %s" #: src/language/stats/t-test-parser.c:133 #, c-format msgid "When applying %s to a string variable, two values must be specified." msgstr "" "pri uporabi %s za spremenljivko vrste niz je treba določiti dve vrednosti." #: src/language/stats/t-test-parser.c:145 #: src/language/stats/t-test-parser.c:241 #, c-format msgid "%s subcommand may not be used with %s." msgstr "podrejenega ukaza %s ni mogoče uporabiti z ukazom %s." #: src/language/stats/t-test-parser.c:305 msgid "Exactly one of TESTVAL, GROUPS and PAIRS subcommands must be specified." msgstr "Določen mora biti natančno en od podukazov TESTVAL, GROUPS ali PAIRS." #: src/language/stats/wilcoxon.c:248 #, fuzzy #| msgid "_Sign" msgid "Sign" msgstr "_Preizkus z znaki" #: src/language/stats/wilcoxon.c:249 msgid "Negative Ranks" msgstr "Negativni rangi" #: src/language/stats/wilcoxon.c:249 msgid "Positive Ranks" msgstr "Pozitivni rangi" #: src/language/stats/wilcoxon.c:296 #, fuzzy #| msgid "Too many pairs to calculate exact significance." msgid "Too many pairs to calculate exact significance" msgstr "Izbranih je preveč parov za izračun natančne statistične značilnosti." #: src/language/data-io/combine-files.c:214 msgid "Cannot specify the active dataset since none has been defined." msgstr "" "Ni mogoče opredeliti dejavne podatkovne zbirke, ker nobena ni določena." #: src/language/data-io/combine-files.c:220 msgid "" "This command may not be used after TEMPORARY when the active dataset is an " "input source. Temporary transformations will be made permanent." msgstr "" "tega ukaza za ukazom TEMPORARY ni mogoče uporabiti, če je dejavna podatkovna " "zbirka vhodni vir. Začasne pretvorbe bodo uveljavljene trajno." #: src/language/data-io/combine-files.c:255 msgid "Multiple IN subcommands for a single FILE or TABLE." msgstr "" #: src/language/data-io/combine-files.c:308 #, c-format msgid "File %s lacks BY variable %s." msgstr "datoteki %s manjka spremenljivka z ukazom BY %s." #: src/language/data-io/combine-files.c:311 #, c-format msgid "Active dataset lacks BY variable %s." msgstr "Trenutni podatkovni zbirki manjka spremenljivka ukaza BY %s." #: src/language/data-io/combine-files.c:388 #: src/language/data-io/combine-files.c:393 #, c-format msgid "BY is required when %s is specified." msgstr "ukaz BY je zahteven, kadar je določena spremenljivka %s." #: src/language/data-io/combine-files.c:521 msgid "" "Combining files with incompatible encodings. String data may not be " "represented correctly." msgstr "" "poteka združevanje datotek z neskladnim znakovnim naborom. Besedilni nizi " "morda ne bodo prikazani pravilno." #: src/language/data-io/combine-files.c:564 #, c-format msgid "" "Variable %s in file %s has different type or width from the same variable in " "earlier file." msgstr "" "spremenljivka %s v datoteki %s je drugačne vrste kot ista spremenljivka v " "predhodni datoteki." #: src/language/data-io/combine-files.c:570 #, c-format msgid "In file %s, %s is numeric." msgstr "v datoteki %s je » %s « številske vrednosti." #: src/language/data-io/combine-files.c:573 #, c-format msgid "In file %s, %s is a string variable with width %d." msgstr "V datoteki %s je spremenljivka %s vrste niz s širino %d." #: src/language/data-io/combine-files.c:578 #, c-format msgid "In an earlier file, %s was numeric." msgstr "v starejši različici datoteke je bila spremenljivka » %s « številska." #: src/language/data-io/combine-files.c:581 #, c-format msgid "In an earlier file, %s was a string variable with width %d." msgstr "" "v starejši različici datoteke je bila spremenljivka » %s « niz s širino %d." #: src/language/data-io/combine-files.c:621 #, c-format msgid "" "Variable name %s specified on %s subcommand duplicates an existing variable " "name." msgstr "" #: src/language/data-io/combine-files.c:793 #, c-format msgid "Encountered %zu sets of duplicate cases in the master file." msgstr "zaznanih je %zu nizov podvojenih primerov v glavni datoteki." #: src/language/data-io/data-list.c:129 src/language/data-io/data-list.c:144 #, fuzzy, c-format #| msgid "The %s value must be nonnegative." msgid "The %s value must be non-negative." msgstr "vrednost %s ne sme biti negativna." #: src/language/data-io/data-list.c:154 #, c-format msgid "The %s subcommand may only be used within %s." msgstr "podukaz %s je mogoče uporabiti le znotraj %s." #: src/language/data-io/data-list.c:159 #, c-format msgid "The %s subcommand may only be specified once." msgstr "podrejen ukaz %s je lahko naveden le enkrat." #: src/language/data-io/data-list.c:197 msgid "Only one of FIXED, FREE, or LIST may be specified." msgstr "" #: src/language/data-io/data-list.c:260 msgid "Encoding should not be specified for inline data. It will be ignored." msgstr "" #: src/language/data-io/data-list.c:269 #, c-format msgid "The %s subcommand may be used only with %s." msgstr "podrejen ukaz %s je lahko naveden le hkrati z %s." #: src/language/data-io/data-list.c:284 src/language/data-io/matrix-data.c:578 msgid "At least one variable must be specified." msgstr "Določiti je treba vsaj eno spremenljivko." #: src/language/data-io/data-list.c:383 src/language/data-io/data-list.c:491 #: src/language/data-io/get-data.c:662 #, c-format msgid "%s is a duplicate variable name." msgstr "ime spremenljivke %s je podvojeno." #: src/language/data-io/data-list.c:390 #, c-format msgid "There is already a variable %s of a different type." msgstr "Spremenljivka %s že obstaja, vendar je druge vrste." #: src/language/data-io/data-list.c:397 #, c-format msgid "There is already a string variable %s of a different width." msgstr "Spremenljivka %s že obstaja, vendar je drugačne podatkovne širine." #: src/language/data-io/data-list.c:405 #, c-format msgid "Cannot place variable %s on record %d when RECORDS=%d is specified." msgstr "" "ni mogoče določiti spremenljivke %s za zapis %d, če je določen ukaz RECORDS=" "%d." #: src/language/data-io/data-parser.c:453 #: src/language/data-io/data-parser.c:462 msgid "Quoted string extends beyond end of line." msgstr "Niz z navedkom sega čez konec vrstice." #: src/language/data-io/data-parser.c:488 msgid "Missing delimiter following quoted string." msgstr "manjka ločilnik, ki sledi navedku niza." #: src/language/data-io/data-parser.c:506 #, c-format msgid "Data for variable %s is not valid as format %s: %s" msgstr "podatki spremenljivke » %s « niso v veljavnem zapisu %s : %s" #: src/language/data-io/data-parser.c:536 #, c-format msgid "Partial case of %d of %d records discarded." msgstr "Delni podatki zapisa primera %d od %d bodo izpuščeni." #: src/language/data-io/data-parser.c:592 #, c-format msgid "Partial case discarded. The first variable missing was %s." msgstr "" "Delni podatki zapisa primera so izpuščeni. Prva manjkajoča spremenljivka je " "%s." #: src/language/data-io/data-parser.c:634 #, c-format msgid "" "Missing value(s) for all variables from %s onward. These will be filled " "with the system-missing value or blanks, as appropriate." msgstr "" "zaznane so manjkajoče vrednosti za vse spremenljivke od %s naprej. " "Zapolnjene bodo s sistemsko manjkajočo vrednostjo oziroma s praznim poljem." #: src/language/data-io/data-parser.c:655 msgid "Record ends in data not part of any field." msgstr "zapis primera se konča s podatki, ki niso vključeni v nobeno polje." #: src/language/data-io/data-parser.c:670 #, c-format msgid "Reading %d record from %s." msgid_plural "Reading %d records from %s." msgstr[0] "Branje %d zapisov primerov iz %s." msgstr[1] "Branje %d zapisa primera iz %s." msgstr[2] "Branje %d zapisov primerov iz %s." msgstr[3] "Branje %d zapisov primerov iz %s." #: src/language/data-io/data-parser.c:680 src/language/data-io/print.c:435 msgid "Record" msgstr "Zapis primera" #: src/language/data-io/data-parser.c:680 src/language/data-io/print.c:435 #: src/ui/gui/psppire-var-sheet-header.c:76 msgid "Columns" msgstr "Stolpci" #: src/language/data-io/data-parser.c:680 #: src/language/data-io/data-parser.c:725 src/language/data-io/print.c:435 msgid "Format" msgstr "_Formatiraj" #: src/language/data-io/data-parser.c:720 #, c-format msgid "Reading free-form data from %s." msgstr "poteka branje neoblikovanih podatkov iz %s." #. TRANSLATORS: this fragment will be interpolated into #. messages in fh_lock() that identify types of files. #: src/language/data-io/data-reader.c:136 src/language/data-io/data-writer.c:79 msgid "data file" msgstr "podatkovna datoteka" #: src/language/data-io/data-reader.c:160 #, c-format msgid "Could not open `%s' for reading as a data file: %s." msgstr "Ni mogoče odpreti »%s« za branje kot podatkovno datoteko: %s." #: src/language/data-io/data-reader.c:174 #, c-format msgid "Could not read `%s' as a text file with encoding `%s': %s." msgstr "Ni mogoče odpreti datoteke »%s« za branje kot »%s«: %s." #: src/language/data-io/data-reader.c:233 #, c-format msgid "" "Missing %s while reading inline data. This probably indicates a missing or " "incorrectly formatted %s command. %s must appear by itself on a single line " "with exactly one space between words." msgstr "" #: src/language/data-io/data-reader.c:253 #: src/language/data-io/data-reader.c:387 #, c-format msgid "Error reading file %s: %s." msgstr "Napaka med branjem datoteke %s: %s" #: src/language/data-io/data-reader.c:261 #, c-format msgid "Unexpected end of file in partial record reading %s." msgstr "nepričakovan konec datoteke med branjem delnega zapisa primera %s." #: src/language/data-io/data-reader.c:321 #, c-format msgid "Corrupt block descriptor word at offset 0x%lx in %s." msgstr "zaznan je okvarjen opisnik bloka pri odmiku 0x%lx v %s." #: src/language/data-io/data-reader.c:322 #, c-format msgid "Corrupt record descriptor word at offset 0x%lx in %s." msgstr "zaznan je okvarjen opisnik zapisa pri odmiku 0x%lx v %s." #: src/language/data-io/data-reader.c:335 #, c-format msgid "Corrupt record size at offset 0x%lx in %s." msgstr "zaznana je neustrezna velikost zapisa pri odmiku 0x%lx v %s." #: src/language/data-io/data-reader.c:493 msgid "Record exceeds remaining block length." msgstr "zapis primera presega dolžino preostalega bloka podatkov." #: src/language/data-io/data-reader.c:567 #, c-format msgid "Attempt to read beyond end-of-file on file %s." msgstr "Izveden je poskus branja po koncu datoteke v datoteki %s." #: src/language/data-io/data-reader.c:570 #, c-format msgid "Attempt to read beyond %s." msgstr "Izveden je poskus branja po oznaki %s." #: src/language/data-io/data-reader.c:733 msgid "" "This command is not valid here since the current input program does not " "access the inline file." msgstr "" "ukaz na tem mestu ni veljaven, ker trenutni vhodni program ne dostopa do " "medvrstične datoteke." #: src/language/data-io/data-writer.c:106 #, c-format msgid "An error occurred while opening `%s' for writing as a data file: %s." msgstr "Prišlo je do napake med odpiranjem »%s« za pisanje podatkov: %s." #: src/language/data-io/data-writer.c:224 #, c-format msgid "I/O error occurred writing data file `%s'." msgstr "Prišlo je do V/I napake med zapisovanjem podatkovne datoteke »%s«." #: src/language/data-io/dataset.c:64 #, c-format msgid "There is no dataset named %s." msgstr "Ni mogoče najti podatkovne zbirke z imenom %s." #: src/language/data-io/dataset.c:250 #, fuzzy #| msgid "Dataset" msgid "Datasets" msgstr "Podatkovna zbirka" #: src/language/data-io/dataset.c:263 msgid "unnamed dataset" msgstr "neimenovana podatkovna množica" #: src/language/data-io/file-handle.c:61 #, c-format msgid "" "File handle %s is already defined. Use %s before redefining a file handle." msgstr "" "ročnik datoteke %s je že določen. Uporabite ukaz %s pred ponovnim določanjem " "ročnika." #: src/language/data-io/file-handle.c:241 #, c-format msgid "%s must be specified with %s." msgstr "spremenljivka » %s « mora biti določena z možnostjo %s." #: src/language/data-io/file-handle.c:252 #, c-format msgid "" "The specified file mode requires LRECL. Assuming %zu-character records." msgstr "" "določen datotečni način zahteva ukaz LRECL. Predviden je %zu-znakovni zapis." #: src/language/data-io/file-handle.c:256 #, c-format msgid "" "Record length (%d) must be between 1 and %lu bytes. Assuming %zu-character " "records." msgstr "" "Dolžina zapisa primera (%d) mora biti med 1 in %lu bajtov. Predviden je %zu-" "znakovni zapis." #: src/language/data-io/file-handle.c:300 msgid "file" msgstr "datoteka" #: src/language/data-io/file-handle.c:302 msgid "inline file" msgstr "medvrstična datoteka" #: src/language/data-io/file-handle.c:350 msgid "expecting a file name or handle name" msgstr "pričakovano je ime datoteke ali ročnika ukaza" #: src/language/data-io/file-handle.c:365 #, c-format msgid "Handle for %s not allowed here." msgstr "ročnik ukaza %s na tem mestu ni dovoljen." #: src/language/data-io/get-data.c:108 src/output/measure.c:262 #, c-format msgid "error reading file `%s'" msgstr "napaka med branjem datoteke »%s«" #: src/language/data-io/get-data.c:127 #, c-format msgid "Unsupported TYPE %s." msgstr "Nepodprt tip TYPE %s." #: src/language/data-io/get-data.c:278 msgid "The sheet index must be greater than or equal to 1" msgstr "Številka delovnega lista preglednice mora biti večja od 1." #: src/language/data-io/get-data.c:285 src/language/data-io/get-data.c:308 #: src/language/data-io/get-data.c:327 #, c-format msgid "%s must be followed by either \"%s\" or \"%s\"." msgstr "ukazu %s lahko sledita le »%s« ali »%s«." #: src/language/data-io/get-data.c:357 #, c-format msgid "" "%s is allowed only with %s arrangement, but %s arrangement was stated or " "implied earlier in this command." msgstr "" "uporaba %s je mogoča le z določilom %s, vendar pa je določilo %s podano " "oziroma nakazano prej v ukazu." #: src/language/data-io/get-data.c:441 src/language/data-io/get-data.c:479 #, c-format msgid "Value of %s must be 1 or greater." msgstr "vrednost %s mora biti enaka ali večja od 1." #: src/language/data-io/get-data.c:504 #, fuzzy #| msgid "" #| "Ignoring obsolete IMPORTCASES subcommand. (N OF CASES or SAMPLE may be " #| "used to substitute.)" msgid "" "Ignoring obsolete IMPORTCASES subcommand. (N OF CASES or SAMPLE may be used " "to substitute.)" msgstr "" "prezrt bo opuščen podukaz za uvoz podatkov IMPORTCASES (za zamenjavo je " "uporabljen ali ukaz N OF CASES ali SAMPLE)." #: src/language/data-io/get-data.c:551 msgid "" "In compatible syntax mode, the QUALIFIER string must contain exactly one " "character." msgstr "" "v združljivem načinu skladnje mora niz QUALIFIER vsebovati natanko en znak." #: src/language/data-io/get-data.c:583 #, c-format msgid "" "The record number specified, %ld, is at or before the previous record, %d. " "Data fields must be listed in order of increasing record number." msgstr "" "določeno število zapisa %ld je na istem mestu oziroma za predhodnim zapisom " "%d. Podatkovna polja morajo biti navedena urejeno po naraščajoči številki " "zapisa." #: src/language/data-io/get-data.c:592 #, c-format msgid "" "The record number specified, %ld, exceeds the number of records per case " "specified on FIXCASE, %d." msgstr "" "določeno število zapisa %ld presega skupno število zapisov primerov, kot je " "določeno z ukazom FIXCASE %d." #: src/language/data-io/get.c:132 #, c-format msgid "%s: Data file dictionary has no variables." msgstr "%s: slovar podatkovne datoteke je brez spremenljivk." #: src/language/data-io/inpt-pgm.c:133 #, c-format msgid "Unexpected end-of-file within %s." msgstr "zaznan je nepričakovan konec datoteke znotraj %s." #: src/language/data-io/inpt-pgm.c:146 #, c-format msgid "Input program must contain %s or %s." msgstr "dovodni program ne sme vključevati %s ali %s." #: src/language/data-io/inpt-pgm.c:152 msgid "Input program did not create any variables." msgstr "Vhodni program ni ustvaril nobene spremenljivke." #: src/language/data-io/inpt-pgm.c:365 msgid "" "REREAD: Column numbers must be positive finite numbers. Column set to 1." msgstr "" "REREAD: številke stolpcev morajo biti pozitivna končna števila. Stolpcu je " "dodeljena vrednost 1." #: src/language/data-io/list.c:100 #, fuzzy #| msgid "Dataset" msgid "Data List" msgstr "Podatkovna zbirka" #: src/language/data-io/list.c:221 #, c-format msgid "" "The first case (%ld) specified precedes the last case (%ld) specified. The " "values will be swapped." msgstr "" "prvi primer v seznamu (%ld) je pred zadnjim navedenim primerom (%ld). " "Vrednosti bosta zamenjani." #: src/language/data-io/list.c:230 #, c-format msgid "" "The first case (%ld) to list is numbered less than 1. The value is being " "reset to 1." msgstr "" "prvi primer v seznamu (%ld) je oštevilčen z vrednostjo manj kot 1, zato bo " "preštevilčen." #: src/language/data-io/list.c:237 #, c-format msgid "" "The last case (%ld) to list is numbered less than 1. The value is being " "reset to 1." msgstr "" "zadnji primer v seznamu (%ld) je oštevilčen z vrednostjo manj kot 1, zato bo " "preštevilčen." #: src/language/data-io/list.c:244 #, c-format msgid "The step value %ld is less than 1. The value is being reset to 1." msgstr "" "Vrednost koraka %ld ima določeno vrednost manjšo od 1, zato je spremenjena v " "1." #: src/language/data-io/placement-parser.c:96 #, c-format msgid "" "Number of variables specified (%zu) differs from number of variable formats " "(%zu)." msgstr "" "Število določenih spremenljivk (%zu) se ne sklada s številom zapisov " "spremenljivke (%zu)." #: src/language/data-io/placement-parser.c:106 msgid "" "SPSS-like or Fortran-like format specification expected after variable names." msgstr "" "za imeni spremenljivk je pričakovano določilo zapisa, podobno zapisu SPSS " "ali Fortran." #: src/language/data-io/placement-parser.c:129 #, c-format msgid "The %d columns %d-%d can't be evenly divided into %zu fields." msgstr "Stolpcev %d %d–%d ni mogoče enakomerno razdeliti na %zu polj." #: src/language/data-io/placement-parser.c:310 msgid "Column positions for fields must be positive." msgstr "Položaj stolpca za polja mora biti pozitivna vrednost." #: src/language/data-io/placement-parser.c:312 msgid "Column positions for fields must not be negative." msgstr "Položaj stolpca za polja ne sme biti negativna vrednost." #: src/language/data-io/placement-parser.c:372 msgid "The ending column for a field must be greater than the starting column." msgstr "Končni stolpec polja mora biti večji od začetnega." #: src/language/data-io/placement-parser.c:409 #, fuzzy, c-format #| msgid "" #| "The record number specified, %ld, is at or before the previous record, " #| "%d. Data fields must be listed in order of increasing record number." msgid "" "The record number specified, %.0f, is at or before the previous record, %d. " "Data fields must be listed in order of increasing record number." msgstr "" "določeno število zapisa %ld je na istem mestu oziroma za predhodnim zapisom " "%d. Podatkovna polja morajo biti navedena urejeno po naraščajoči številki " "zapisa." #: src/language/data-io/print-space.c:127 #, c-format msgid "The expression on %s evaluated to the system-missing value." msgstr "" #: src/language/data-io/print-space.c:130 #, c-format msgid "The expression on %s evaluated to %g." msgstr "izraz na %s je ocenjen na %g." #: src/language/data-io/print.c:189 src/language/data-io/trim.c:58 msgid "expecting a valid subcommand" msgstr "pričakovan je veljaven podukaz" #: src/language/data-io/print.c:219 #, c-format msgid "%s is required when binary formats are specified." msgstr "ukaz %s je zahteven, kadar so določeni binarni zapisi." #: src/language/data-io/print.c:302 #, c-format msgid "Output calls for %d records but %zu specified on RECORDS subcommand." msgstr "" #: src/language/data-io/print.c:432 #, fuzzy #| msgid "Case Processing Summary" msgid "Print Summary" msgstr "Povzetek obdelave primerov" #: src/language/data-io/print.c:462 #, fuzzy #| msgid "Record" msgid "N of Records" msgstr "Zapis primera" #: src/language/data-io/matrix-data.c:191 #, c-format msgid "" "There are %d variable declared but the data has at least %d matrix rows." msgstr "" #: src/language/data-io/matrix-data.c:292 msgid "" "The N subcommand was specified, but a N record was also found in the data. " "The N record will be ignored." msgstr "" "določen je podukaz N, vendar pa je zapis N prav tako del podatkov. Zapis N " "bo izpuščen." #: src/language/data-io/matrix-data.c:488 src/language/utilities/set.q:186 #, c-format msgid "%s must not be negative." msgstr "%s ne sme biti negativna." #: src/language/data-io/matrix-data.c:568 msgid "FORMAT = FULL and FORMAT = NODIAGONAL are mutually exclusive." msgstr "" "ukaz FORMAT = FULL in ukaz FORMAT = NODIAGONAL se medsebojno izključujeta." #: src/language/data-io/matrix-reader.c:102 #: src/language/data-io/matrix-reader.c:118 #, c-format msgid "Matrix dataset lacks a variable called %s." msgstr "Podatkovni zbirki matrike manjka spremenljivka, imenovana %s." #: src/language/data-io/matrix-reader.c:109 #: src/language/data-io/matrix-reader.c:125 #, c-format msgid "Matrix dataset variable %s should be of string type." msgstr "Spremenljivka matrike podatkovne zbirke %s mora biti niz." #: src/language/data-io/save-translate.c:168 #: src/language/data-io/save-translate.c:183 #, c-format msgid "The %s string must contain exactly one character." msgstr "Niz %s mora vsebovati natančno en znak." #: src/language/data-io/save-translate.c:249 #, c-format msgid "Output file `%s' exists but %s was not specified." msgstr "Odvodna datoteka »%s« obstaja, vendar pa %s ni določen." #: src/language/data-io/save.c:309 msgid "The OUTFILE or METADATA subcommand is required." msgstr "" #: src/language/data-io/trim.c:69 #, c-format msgid "" "Cannot rename %s as %s because there already exists a variable named %s. To " "rename variables with overlapping names, use a single RENAME subcommand such " "as `/RENAME (A=B)(B=C)(C=A)', or equivalently, `/RENAME (A B C=B C A)'." msgstr "" "Ni mogoče preimenovati %s v %s, ker spremenljivka z imenom %s že obstaja. Za " "preimenovanje spremenljivk s prekrivajočimi se imeni, je priporočljivo " "uporabiti zapis podukaza /RENAME (A=B)(B=C)(C=A) oziroma okrajšano /RENAME " "(A B C=B C A)." #: src/language/data-io/trim.c:227 #, c-format msgid "" "Number of variables on left side of `=' (%zu) does not match number of " "variables on right side (%zu), in parenthesized group %d of RENAME " "subcommand." msgstr "" "Število spremenljivk na levi strani » = « (%zu) se ne sklada s številom " "spremenljivk na desni (%zu), v skupini %d pri podukazu za preimenovanje " "RENAME." #: src/language/data-io/trim.c:242 #, c-format msgid "Requested renaming duplicates variable name %s." msgstr "zahtevano preimenovanje podvoji ime spremenljivke %s." #: src/language/data-io/trim.c:281 msgid "Cannot DROP all variables from dictionary." msgstr "z ukazom DROP ni mogoče spustiti vseh spremenljivk iz slovarja." #: src/language/expressions/evaluate.c:151 msgid "expecting number or string" msgstr "pričakovana je bila številka ali niz znakov" #: src/language/expressions/helpers.c:43 msgid "" "One of the arguments to a DATE function is not an integer. The result will " "be system-missing." msgstr "" "eden izmed argumentov funkcije DATE ni celo število. Vrednost bo obravnavana " "kot sistemsko manjkajoča." #: src/language/expressions/helpers.c:71 msgid "" "The week argument to DATE.WKYR is not an integer. The result will be system-" "missing." msgstr "" "argument tedna funkcije DATE.WKYR ni celo število. Vrednost bo obravnavana " "kot sistemsko manjkajoča." #: src/language/expressions/helpers.c:77 msgid "" "The week argument to DATE.WKYR is outside the acceptable range of 1 to 53. " "The result will be system-missing." msgstr "" "argument tedna funkcije DATE.WKYR je izven sprejemljivega obsega med 1 in " "53. Vrednost bo obravnavana kot sistemsko manjkajoča." #: src/language/expressions/helpers.c:99 msgid "" "The day argument to DATE.YRDAY is not an integer. The result will be system-" "missing." msgstr "" "argument dneva funkcije DATE.YRDAY ni celo število. Vrednost bo obravnavana " "kot sistemsko manjkajoča." #: src/language/expressions/helpers.c:105 msgid "" "The day argument to DATE.YRDAY is outside the acceptable range of 1 to 366. " "The result will be system-missing." msgstr "" "argument dneva funkcije DATE.YRDAY je izven sprejemljivega obsega med 1 in " "366. Vrednost bo obravnavana kot sistemsko manjkajoča." #: src/language/expressions/helpers.c:127 msgid "" "The year argument to YRMODA is greater than 47516. The result will be " "system-missing." msgstr "" "argument leta funkcije YRMODA je večji od 47516. Vrednost bo obravnavana kot " "sistemsko manjkajoča." #: src/language/expressions/helpers.c:180 #, c-format msgid "" "Unrecognized date unit `%.*s'. Valid date units are `%s', `%s', `%s', `%s', " "`%s', `%s', `%s', and `%s'." msgstr "" "neprepoznana enota datuma »%.*s«. Veljavne enote so »%s«, »%s«, »%s«, »%s«, " "»%s«, »%s«, »%s«, in »%s«." #: src/language/expressions/helpers.c:333 #, c-format msgid "Invalid DATESUM method. Valid choices are `%s' and `%s'." msgstr "neveljavna metoda DATESUM. veljavni izbiri sta »%s« in »%s«." #: src/language/expressions/parse.c:261 #, c-format msgid "" "Type mismatch: expression has %s type, but a numeric value is required here." msgstr "" "neskladje vrste: izraz vključuje vrsto %s, zahtevana pa je številčna " "vrednost." #: src/language/expressions/parse.c:274 #, c-format msgid "" "Type mismatch: expression has %s type, but a string value is required here." msgstr "" "neskladje vrste: izraz vključuje vrsto %s, zahtevana pa je vrednost niz." #: src/language/expressions/parse.c:436 #, c-format msgid "Type mismatch while applying %s operator: cannot convert %s to %s." msgstr "" "zaznano je neskladje vrste spremenljivke med uporabo operaterja %s: ni " "mogoče pretvoriti %s v %s." #: src/language/expressions/parse.c:650 msgid "" "Chaining relational operators (e.g. `a < b < c') will not produce the " "mathematically expected result. Use the AND logical operator to fix the " "problem (e.g. `a < b AND b < c'). If chaining is really intended, " "parentheses will disable this warning (e.g. `(a < b) < c'.)" msgstr "" "veriženje operaterjev (na primer » a < b < c «) ne izraža matematično " "pričakovanega rezultata. Priporočljivo je uporabiti logični operater AND (na " "primer » a < b AND b < c «). V primeru, ko je veriženje zares namensko, " "uporaba oklepajev onemogoči prikaz tega opozorila (torej, » (a < b) < c «)." #: src/language/expressions/parse.c:752 msgid "" "The exponentiation operator (`**') is left-associative, even though right-" "associative semantics are more useful. That is, `a**b**c' equals " "`(a**b)**c', not as `a**(b**c)'. To disable this warning, insert " "parentheses." msgstr "" "operater potenciranja (» ** «) je skladenjsko vezan na levo vrednost, čeprav " "je lahko tudi desna povezava uporabna. Zapis » a**b**c« pomeni torej " "» (a**b)**c« in ne » a**(b**c) «. Temu opozorilu se je mogoče izogniti z " "uporabo oklepajev." #: src/language/expressions/parse.c:832 #, c-format msgid "Unknown system variable %s." msgstr "Neznana sistemska spremenljivka »%s«." #: src/language/expressions/parse.c:880 #, c-format msgid "Unknown identifier %s." msgstr "Neznano določilo %s." #: src/language/expressions/parse.c:1102 #, c-format msgid "%s must have at least %d arguments in list." msgstr "funkcija %s mora imeti vsaj %d argumentov na seznamu." #: src/language/expressions/parse.c:1111 #, c-format msgid "%s must have an even number of arguments in list." msgstr "%s zahteva sodo število argumentov na seznamu." #: src/language/expressions/parse.c:1114 #, c-format msgid "%s must have multiple of %d arguments in list." msgstr "funkcija %s zahteva večkratnik %d argumentov na seznamu." #: src/language/expressions/parse.c:1124 #, c-format msgid "%s function does not accept a minimum valid argument count." msgstr "funkcija %s ne sprejme najmanjšega števila veljavnih argumentov." #: src/language/expressions/parse.c:1133 #, c-format msgid "%s requires at least %d valid arguments in list." msgstr "%s zahteva vsaj %d veljavnih argumentov v seznamu." #: src/language/expressions/parse.c:1139 #, c-format msgid "" "With %s, using minimum valid argument count of %d does not make sense when " "passing only %d arguments in list." msgstr "" #: src/language/expressions/parse.c:1193 #, c-format msgid "Type mismatch invoking %s as " msgstr "Zaznana je neskladnost vrste pri priklicu %s kot" #: src/language/expressions/parse.c:1198 msgid "Function invocation " msgstr "Priklic funkcije" #: src/language/expressions/parse.c:1200 msgid " does not match any known function. Candidates are:" msgstr "ni znana funkcija; možnosti so:" #: src/language/expressions/parse.c:1230 #, c-format msgid "No function or vector named %s." msgstr "Ni funkcije oziroma vektorja z imenom %s." #: src/language/expressions/parse.c:1292 #, c-format msgid "%s is a PSPP extension." msgstr "%s je razširitev PSPP." #: src/language/expressions/parse.c:1295 #, c-format msgid "%s is not available in this version of PSPP." msgstr "%s v nameščeni različici programa PSPP ni na voljo." #: src/language/expressions/parse.c:1302 #, c-format msgid "%s may not appear after %s." msgstr "ukaz %s se ne sme pojaviti za %s." #: src/libpspp/ext-array.c:66 msgid "failed to create temporary file" msgstr "ustvarjanje začasne datoteke je spodletelo" #: src/libpspp/ext-array.c:106 msgid "seeking in temporary file" msgstr "iskanje po začasni datoteki" #: src/libpspp/ext-array.c:125 msgid "reading temporary file" msgstr "branje začasne datoteke" #: src/libpspp/ext-array.c:127 msgid "unexpected end of file reading temporary file" msgstr "nepričakovan konec med branjem začasne datoteke" #: src/libpspp/ext-array.c:147 msgid "writing to temporary file" msgstr "zapisovanje v začasno datoteko" #: src/libpspp/i18n.c:1128 msgid "Arabic" msgstr "arabski" #: src/libpspp/i18n.c:1130 msgid "Armenian" msgstr "armenski" #: src/libpspp/i18n.c:1131 msgid "Baltic" msgstr "baltski" #: src/libpspp/i18n.c:1133 msgid "Celtic" msgstr "keltski" #: src/libpspp/i18n.c:1134 msgid "Central European" msgstr "srednjeevropski" #: src/libpspp/i18n.c:1136 msgid "Chinese Simplified" msgstr "kitajski poenostavljeni" #: src/libpspp/i18n.c:1138 msgid "Chinese Traditional" msgstr "kitajski tradicionalni" #: src/libpspp/i18n.c:1140 msgid "Croatian" msgstr "hrvaški" #: src/libpspp/i18n.c:1141 msgid "Cyrillic" msgstr "cirilica" #: src/libpspp/i18n.c:1143 msgid "Cyrillic/Russian" msgstr "cirilica/ruski" #: src/libpspp/i18n.c:1144 msgid "Cyrillic/Ukrainian" msgstr "cirilica/ukrajinski" #: src/libpspp/i18n.c:1146 msgid "Georgian" msgstr "gruzijski" #: src/libpspp/i18n.c:1147 msgid "Greek" msgstr "grški" #: src/libpspp/i18n.c:1148 msgid "Gujarati" msgstr "gudžaratski" #: src/libpspp/i18n.c:1149 msgid "Gurmukhi" msgstr "gurmuki" #: src/libpspp/i18n.c:1150 msgid "Hebrew" msgstr "hebrejski" #: src/libpspp/i18n.c:1152 msgid "Hebrew Visual" msgstr "hebrejski predočeni" #: src/libpspp/i18n.c:1153 msgid "Hindi" msgstr "hindujski" #: src/libpspp/i18n.c:1154 msgid "Icelandic" msgstr "islandski" #: src/libpspp/i18n.c:1155 msgid "Japanese" msgstr "japonski" #: src/libpspp/i18n.c:1157 msgid "Korean" msgstr "korejski" #: src/libpspp/i18n.c:1159 msgid "Nordic" msgstr "nordijski" #: src/libpspp/i18n.c:1160 msgid "Romanian" msgstr "romunski" #: src/libpspp/i18n.c:1162 msgid "South European" msgstr "južnoevropski" #: src/libpspp/i18n.c:1163 msgid "Thai" msgstr "tajski" #: src/libpspp/i18n.c:1165 msgid "Turkish" msgstr "turški" #: src/libpspp/i18n.c:1167 msgid "Vietnamese" msgstr "vietnamski" #: src/libpspp/i18n.c:1169 msgid "Western European" msgstr "Zahodnoevropski" #: src/libpspp/message.c:89 #, c-format msgid "%s: %s" msgstr "%s: %s" #: src/libpspp/message.c:113 msgid "error" msgstr "napaka" #: src/libpspp/message.c:115 msgid "warning" msgstr "opozorilo" #: src/libpspp/message.c:118 msgid "note" msgstr "opomba" #: src/libpspp/message.c:327 #, c-format msgid "Notes (%d) exceed limit (%d). Suppressing further notes." msgstr "" "število opomb (%d) presega omejitev (%d). Nadaljnji izpis opozoril je " "ustavljen." #: src/libpspp/message.c:335 #, c-format msgid "Warnings (%d) exceed limit (%d). Syntax processing will be halted." msgstr "" "število opozoril (%d) presega omejitev (%d). Obdelava skladnje je ustavljena." #: src/libpspp/message.c:338 #, c-format msgid "Errors (%d) exceed limit (%d). Syntax processing will be halted." msgstr "" "število napak (%d) presega omejitev (%d). Obdelava skladnje je ustavljena." #: src/libpspp/zip-reader.c:202 #, fuzzy, c-format #| msgid "Corrupt file at 0x%llx: Expected %; got %" msgid "%s: corrupt archive at 0x%llx: expected %# but got %#" msgstr "" "Okvarjena datoteka pri 0x%llx: Pričakovano je %; pridobljeno pa " "%" #: src/libpspp/zip-reader.c:329 src/libpspp/zip-reader.c:449 #, fuzzy, c-format #| msgid "%s: seek failed (%s)." msgid "%s: open failed (%s)" msgstr "%s: ukaz seek() je spodletel (%s)." #: src/libpspp/zip-reader.c:344 #, fuzzy, c-format msgid "%s: cannot find central directory" msgstr "Ni mogoče najti osrednje mape" #: src/libpspp/zip-reader.c:353 src/libpspp/zip-reader.c:384 #: src/libpspp/zip-reader.c:468 #, fuzzy, c-format #| msgid "%s: seek failed (%s)." msgid "%s: seek failed (%s)" msgstr "%s: ukaz seek() je spodletel (%s)." #: src/libpspp/zip-reader.c:441 #, fuzzy, c-format #| msgid "%s: unknown option `%s'" msgid "%s: unknown member \"%s\"" msgstr "%s: neznana možnost »%s«" #: src/libpspp/zip-reader.c:503 #, c-format msgid "" "%s: name mismatch between central directory (%s) and local file header (%s)" msgstr "" #: src/libpspp/zip-reader.c:696 #, fuzzy, c-format #| msgid "Cannot initialize inflator: %s" msgid "%s: cannot initialize inflator (%s)" msgstr "ni mogoče začeti razširjevalnika: %s" #: src/libpspp/zip-reader.c:751 #, fuzzy, c-format #| msgid "Error inflating: %s" msgid "%s: error inflating \"%s\" (%s)" msgstr "Napaka razširjanja: %s" #: src/libpspp/zip-writer.c:97 utilities/pspp-convert.c:346 #, c-format msgid "%s: error opening output file" msgstr "%s: napaka odpiranja odvodne datoteke" #: src/libpspp/zip-writer.c:169 #, c-format msgid "%s: error seeking in output file" msgstr "%s: napaka iskanja v odvodni datoteki" #: src/libpspp/zip-writer.c:210 msgid "error creating temporary file" msgstr "napaka pri ustvarjanju začasne datoteke" #: src/libpspp/zip-writer.c:279 #, c-format msgid "%s: write failed" msgstr "%s: zapisovanje je spodletelo" #. TRANSLATORS: This is a format string which, when presented to #. printf like functions, will create a pango markup string to #. display real number in scientific notation. #. #. In its untranslated form, it will display similar to "1.23 x 10^4". You #. can leave it untranslated if this is how scientific notation is usually #. presented in your language. #. #. Some locales (such as German) prefer the centered dot rather than the #. multiplication sign between the mantissa an exponent. In which #. case, you can change "#215;" to "#8901;" or other unicode code #. point as appropriate. #. #. The . in this string does not and should not be changed, since #. that is taken care of by the stdc library. #. #. For information on Pango markup, see #. http://developer.gnome.org/pango/stable/PangoMarkupFormat.html #. #. For tables of unicode code points, see http://unicode.org/charts #. #: src/math/chart-geometry.c:123 #, c-format msgid "%%.%dlf×10%d" msgstr "%%.%dlf#8901;10%d" #: src/math/histogram.c:145 msgid "" "Not creating histogram because the data contains less than 2 distinct values" msgstr "" "Histogram ne bo izrisan, ker vsebujejo podatki manj kot 2 različni vrednosti" #: src/math/percentiles.c:36 msgid "HAverage" msgstr "" #: src/math/percentiles.c:38 msgid "Rounded" msgstr "Zaokroženo" #: src/math/percentiles.c:39 msgid "Empirical" msgstr "Empirično" #: src/math/percentiles.c:40 msgid "Empirical with averaging" msgstr "Empirično s povprečenjem" #: src/math/shapiro-wilk.c:84 msgid "" "One or more weight values are non-integer. Fractional parts will be ignored " "when calculating the Shapiro-Wilk statistic." msgstr "" #: src/output/ascii.c:340 #, c-format msgid "ascii: opening output file `%s'" msgstr "ascii: poteka odpiranje datoteke odvoda »%s«" #: src/output/ascii.c:371 #, c-format msgid "%s: %s must be positive integer or `auto'" msgstr "" "%s: `%s mora biti pozitivno celo število ali pa določeno kot »samodejno«" #: src/output/ascii.c:393 #, fuzzy, c-format #| msgid "" #| "ascii: page excluding margins and headers must be at least %d characters " #| "wide by %d lines long, but as configured is only %d characters by %d lines" msgid "" "ascii: page must be at least %d characters wide, but as configured is only " "%d characters" msgstr "" "ascii: stran brez robov in glave mora biti široka za vsaj %d znakov in dolga " "za %d vrstic, nastavljena pa je vrednost %d znakov in %d vrstic" #: src/output/ascii.c:508 #, c-format msgid "See %s for a chart." msgstr "" #: src/output/charts/piechart.c:54 msgid "*MISSING*" msgstr "*MANJKAJOČE*" #: src/output/csv.c:100 src/output/html.c:117 src/output/journal.c:166 #: src/output/msglog.c:68 #, c-format msgid "error opening output file `%s'" msgstr "napaka med odpiranjem datoteke odvoda »%s«" #: src/output/driver.c:522 #, c-format msgid "%s is not a valid device type (the choices are `%s' and `%s')" msgstr "%s ni veljavna vrsta naprave (možnosti sta »%s« in »%s«)" #: src/output/driver.c:536 #, c-format msgid "%s: unknown option `%s'" msgstr "%s: neznana možnost »%s«" #: src/output/driver.c:553 #, c-format msgid "%s: output option missing `='" msgstr "%s: manjka možnost odvoda » = «" #: src/output/driver.c:560 #, c-format msgid "%s: output option specified more than once" msgstr "%s: možnost odvoda je navedena več kot enkrat" #: src/output/html.c:129 msgid "PSPP Output" msgstr "Izpis PSPP" #: src/output/html.c:266 msgid "No description" msgstr "Brez opisa" #: src/output/journal.c:69 #, c-format msgid "error writing output file `%s'" msgstr "napaka med zapisovanjem odvodne odvoda »%s«" #: src/output/measure.c:68 #, c-format msgid "`%s' is not a valid length." msgstr "»%s« ni veljavna dolžina." #: src/output/measure.c:96 #, c-format msgid "syntax error in paper size `%s'" msgstr "napaka skladnje v velikosti papirja »%s«" #: src/output/measure.c:233 #, c-format msgid "unknown paper type `%.*s'" msgstr "neznana vrsta papirja `%.*s'" #: src/output/measure.c:251 #, c-format msgid "error opening input file `%s'" msgstr "napaka med odpiranjem dovodne datoteke »%s«" #: src/output/measure.c:279 #, c-format msgid "file `%s' does not state a paper size" msgstr "datoteka »%s« nima podatkov navedbe velikosti papirja" #: src/output/options.c:112 #, c-format msgid "%s: `%s' is `%s' but a Boolean value is required" msgstr "%s: »%s« je »%s«, zahtevana pa je logična vrednost." #: src/output/options.c:187 #, c-format msgid "%s: `%s' is `%s' but one of the following is required: %s" msgstr "%s: »%s« je »%s«, zahtevana pa je eden izmed: %s." #: src/output/options.c:231 #, fuzzy, c-format #| msgid "%s: `%s' is `%s' but a nonnegative integer is required" msgid "%s: `%s' is `%s' but a non-negative integer is required" msgstr "%s: »%s« je »%s«, zahtevano pa je ne-negativno celo število." #: src/output/options.c:235 #, c-format msgid "%s: `%s' is `%s' but a positive integer is required" msgstr "%s: »%s« je »%s«, zahtevano pa je pozitivno celo število." #: src/output/options.c:238 #, c-format msgid "%s: `%s' is `%s' but an integer is required" msgstr "%s: »%s« je »%s«, zahtevano pa je celo število." #: src/output/options.c:241 #, c-format msgid "%s: `%s' is `%s' but an integer greater than %d is required" msgstr "%s: »%s« je »%s«, zahtevano pa je celo število, večje od %d." #: src/output/options.c:246 #, c-format msgid "%s: `%s' is `%s' but an integer between %d and %d is required" msgstr "%s: »%s« je »%s«, zahtevano pa je celo število med %d in %d." #: src/output/options.c:325 #, c-format msgid "%s: `%s' is `%s' but a file name that contains `#' is required." msgstr "%s: »%s« je »%s«, zahtevana pa je datoteka, ki vsebuje »#«." #. TRANSLATORS: Do not translate this string. If the script of your language #. reads from right to left (eg Persian, Arabic, Hebrew etc), then replace #. this string with "output-direction-rtl". Otherwise either leave it #. untranslated or copy it verbatim. #: src/output/render.c:994 msgid "output-direction-ltr" msgstr "output-direction-ltr" #: src/output/text-item.c:44 msgid "Page Title" msgstr "" #: src/output/text-item.c:47 msgid "Title" msgstr "" #: src/output/text-item.c:51 msgid "Log" msgstr "" #: src/output/text-item.c:54 msgid "Page Break" msgstr "" #: src/output/cairo.c:520 #, c-format msgid "`%s': bad font specification" msgstr "»%s«: napačno določilo pisave" #: src/output/cairo.c:744 #, c-format msgid "" "The defined page is not wide enough to hold at least %d characters in the " "default font. In fact, there's only room for %d characters." msgstr "" "Po trenutnem določilu stran ni dovolj široka niti za %d znakov v vrstici v " "privzeti pisavi. Prostora je le za %d znakov." #: src/output/cairo.c:752 #, c-format msgid "" "The defined page is not long enough to hold at least %d lines in the default " "font. In fact, there's only room for %d lines." msgstr "" "Po trenutnem določilu stran ni dovolj dolga niti za %d vrstic vsebine v " "privzeti pisavi. Prostora je le za %d vrstic." #: src/output/cairo.c:837 #, c-format msgid "error opening output file `%s': %s" msgstr "napaka med odpiranjem odvodne datoteke »%s«: %s" #: src/output/cairo.c:892 #, c-format msgid "error drawing output for %s driver: %s" msgstr "" #: src/output/cairo.c:2056 #, c-format msgid "error writing output file `%s': %s" msgstr "napaka med zapisovanjem v odvodno datoteko »%s«: %s" #: src/output/charts/np-plot-cairo.c:37 #, c-format msgid "Normal Q-Q Plot of %s" msgstr "Diagram normale Q-Q od %s" #: src/output/charts/np-plot-cairo.c:38 src/output/charts/np-plot-cairo.c:68 msgid "Observed Value" msgstr "Opazovana vrednost" #: src/output/charts/np-plot-cairo.c:39 #, fuzzy msgid "Expected Normal" msgstr "Pričakovana normalna porazdelitev" #: src/output/charts/np-plot-cairo.c:67 #, c-format msgid "Detrended Normal Q-Q Plot of %s" msgstr "Netrendni diagram normale Q-Q od %s" #: src/output/charts/np-plot-cairo.c:69 msgid "Dev from Normal" msgstr "Odklon od normalne porazdelitve" #: src/output/charts/barchart-cairo.c:65 msgid "Bar Chart" msgstr "Palčni diagram" #: src/output/charts/plot-hist-cairo.c:43 #, c-format msgid "N = %.2f" msgstr "N = %.2f" #: src/output/charts/plot-hist-cairo.c:52 #, c-format msgid "Mean = %.1f" msgstr "Povprečje = %.1f" #: src/output/charts/plot-hist-cairo.c:61 #, c-format msgid "Std. Dev = %.2f" msgstr "Std. odklon = %.2f" #: src/output/charts/plot-hist-cairo.c:110 msgid "HISTOGRAM" msgstr "Histogram" #: src/output/charts/roc-chart-cairo.c:36 src/ui/gui/roc.ui:24 msgid "ROC Curve" msgstr "Krivulja ROC" #: src/output/charts/scree-cairo.c:36 msgid "Scree Plot" msgstr "Diagram komponent (Scree)" #: src/output/charts/scree-cairo.c:38 msgid "Eigenvalue" msgstr "Lastna vrednost" #: src/output/charts/spreadlevel-cairo.c:37 #, c-format msgid "Spread vs. Level Plot of %s" msgstr "Diagram razpršenosti v odvisnosti od ravni %s" #: src/output/charts/spreadlevel-cairo.c:38 msgid "Level" msgstr "Raven" #: src/output/charts/spreadlevel-cairo.c:39 msgid "Spread" msgstr "Razpršenost" #: src/output/charts/scatterplot-cairo.c:57 #, c-format msgid "Scatterplot %s" msgstr "Raztreseni diagram %s" #: src/output/spv/spv-legacy-decoder.c:2222 msgid "Table lacks cell data." msgstr "" #: src/output/spv/spv-writer.c:68 #, fuzzy, c-format #| msgid "%s: write failed" msgid "%s: create failed" msgstr "%s: zapisovanje je spodletelo" #: src/output/spv/spv-writer.c:89 #, fuzzy #| msgid "%s: error writing output file" msgid "I/O error writing SPV file" msgstr "%s: napaka med zapisovanjem odvodne datoteke" #: src/output/spv/spv.c:693 #, fuzzy, c-format #| msgid "failed to create temporary file" msgid "%s: Failed to create XML parser" msgstr "ustvarjanje začasne datoteke je spodletelo" #: src/output/spv/spv.c:718 #, c-format msgid "%s: document is not well-formed" msgstr "" #: src/output/spv/spv.c:726 #, c-format msgid "%s: root node is \"%s\" but \"%s\" was expected" msgstr "" #: src/ui/gui/psppire-acr.c:273 msgid "Add" msgstr "Dodaj" #: src/ui/gui/psppire-acr.c:274 msgid "Edit" msgstr "Uredi" #: src/ui/gui/psppire-acr.c:275 msgid "Remove" msgstr "Odstrani" #: src/ui/gui/psppire-buttonbox.c:311 msgid "OK" msgstr "V redu" #: src/ui/gui/psppire-buttonbox.c:319 msgid "Go To" msgstr "Pojdi na" #: src/ui/gui/psppire-buttonbox.c:327 msgid "Continue" msgstr "Naprej" #: src/ui/gui/psppire-buttonbox.c:339 src/ui/gui/psppire-import-assistant.c:759 msgid "Paste" msgstr "Prilepi" #: src/ui/gui/psppire-buttonbox.c:345 #: src/ui/gui/psppire-dialog-action-aggregate.c:216 #: src/ui/gui/psppire-data-window.c:496 src/ui/gui/psppire-data-window.c:624 #: src/ui/gui/psppire-output-window.c:353 #: src/ui/gui/psppire-syntax-window.c:594 src/ui/gui/psppire-window.c:445 #: src/ui/gui/psppire-window.c:628 msgid "Cancel" msgstr "Prekliči" #: src/ui/gui/psppire-buttonbox.c:351 msgid "Close" msgstr "Zapri" #: src/ui/gui/psppire-buttonbox.c:358 src/ui/gui/psppire-import-assistant.c:760 msgid "Reset" msgstr "Ponastavi" #: src/ui/gui/psppire-buttonbox.c:365 msgid "Help" msgstr "Pomoč" #: src/ui/gui/psppire-dialog-action-aggregate.c:213 msgid "Aggregate destination file" msgstr "Združi ciljno datoteko" #: src/ui/gui/psppire-dialog-action-aggregate.c:217 #: src/ui/gui/psppire-data-window.c:493 src/ui/gui/psppire-data-window.c:497 #: src/ui/gui/psppire-output-window.c:354 #: src/ui/gui/psppire-syntax-window.c:595 src/ui/gui/psppire-window.c:449 #: src/ui/gui/aggregate.ui:565 msgid "Save" msgstr "Shrani" #: src/ui/gui/psppire-dialog-action-aggregate.c:226 #: src/ui/gui/psppire-data-window.c:503 msgid "System Files (*.sav)" msgstr "Sistemske datoteke (*.sav)" #: src/ui/gui/psppire-dialog-action-aggregate.c:231 #: src/ui/gui/psppire-data-window.c:508 msgid "Compressed System Files (*.zsav)" msgstr "Stisnjene sistemske datoteke (*.zsav)" #: src/ui/gui/psppire-dialog-action-aggregate.c:236 #: src/ui/gui/psppire-data-window.c:513 src/ui/gui/psppire-window.c:652 msgid "Portable Files (*.por) " msgstr "Prenosne datoteke (*.por)" #: src/ui/gui/psppire-dialog-action-autorecode.c:337 #: src/ui/gui/psppire-dialog-action-recode.c:535 #: src/ui/gui/psppire-dialog-action-recode-different.c:288 msgid "New" msgstr "Novo" #: src/ui/gui/psppire-dialog-action-autorecode.c:351 #: src/ui/gui/psppire-dialog-action-recode.c:527 #: src/ui/gui/psppire-dialog-action-recode-different.c:301 msgid "Old" msgstr "Staro" #: src/ui/gui/psppire-dialog-action-comments.c:142 #, c-format msgid "Column Number: %d" msgstr "Številka stolpca: %d" #: src/ui/gui/psppire-dialog-action-crosstabs.c:71 msgid "Chisq" msgstr "Pearsonov Hi-kvadrat" #: src/ui/gui/psppire-dialog-action-crosstabs.c:71 msgid "" "Pearson chi-square, likelihood ratio, Fisher’s exact test, continuity " "correction, linear-by-linear association." msgstr "" #: src/ui/gui/psppire-dialog-action-crosstabs.c:74 #: src/language/stats/crosstabs.q:1334 msgid "Phi" msgstr "Koeficient Fi (φ)" #: src/ui/gui/psppire-dialog-action-crosstabs.c:75 msgid "CC" msgstr "Kontingenči koeficient CC" #: src/ui/gui/psppire-dialog-action-crosstabs.c:75 #, fuzzy #| msgid "Contingency Coefficient" msgid "Contingency coefficient" msgstr "Kontingenčni koeficient" #: src/ui/gui/psppire-dialog-action-crosstabs.c:77 msgid "UC" msgstr "Koeficient enakomernosti UC" #: src/ui/gui/psppire-dialog-action-crosstabs.c:77 #, fuzzy #| msgid "Uncertainty Coefficient" msgid "Uncertainty coefficient" msgstr "Koeficient negotovosti" #: src/ui/gui/psppire-dialog-action-crosstabs.c:78 msgid "BTau" msgstr "Koeficient BTau (Bτ)" #: src/ui/gui/psppire-dialog-action-crosstabs.c:78 #, fuzzy #| msgid "Kendall's tau-b" msgid "Kendall's Tau-b" msgstr "Kendallov tau-b" #: src/ui/gui/psppire-dialog-action-crosstabs.c:79 msgid "CTau" msgstr "Koeficient CTau (Cτ)" #: src/ui/gui/psppire-dialog-action-crosstabs.c:79 #, fuzzy #| msgid "Kendall's tau-c" msgid "Kendall's Tau-c" msgstr "Kendallov tau-c" #: src/ui/gui/psppire-dialog-action-crosstabs.c:80 msgid "Risk" msgstr "Ocena tveganja" #: src/ui/gui/psppire-dialog-action-crosstabs.c:80 #, fuzzy #| msgid "Risk estimate." msgid "Relative Risk estimate" msgstr "Ocena tveganja." #: src/ui/gui/psppire-dialog-action-crosstabs.c:81 #: src/language/stats/crosstabs.q:1338 msgid "Gamma" msgstr "Goodman-Kruskalova gama (γ)" #: src/ui/gui/psppire-dialog-action-crosstabs.c:82 msgid "D" msgstr "Somersov D" #: src/ui/gui/psppire-dialog-action-crosstabs.c:82 #, fuzzy #| msgid "Somers' d" msgid "Somer's d" msgstr "Somersov D" #: src/ui/gui/psppire-dialog-action-crosstabs.c:83 #: src/language/stats/crosstabs.q:1344 msgid "Kappa" msgstr "Cohenova kapa (κ)" #: src/ui/gui/psppire-dialog-action-crosstabs.c:83 msgid "Cohen's Kappa" msgstr "" #: src/ui/gui/psppire-dialog-action-crosstabs.c:84 #: src/language/stats/crosstabs.q:1429 msgid "Eta" msgstr "Razmerje korelacije Eta (η)" #: src/ui/gui/psppire-dialog-action-crosstabs.c:85 msgid "Corr" msgstr "Spearmanov R" #: src/ui/gui/psppire-dialog-action-crosstabs.c:85 #, fuzzy #| msgid "Spearman Correlation" msgid "Spearman correlation, Pearson's r" msgstr "Spearmanova korelacija" #: src/ui/gui/psppire-dialog-action-crosstabs.c:90 #, fuzzy #| msgid "Frequency" msgid "Frequency Count" msgstr "Frekvenca" #: src/ui/gui/psppire-dialog-action-crosstabs.c:91 msgid "Row" msgstr "Vrstica" #: src/ui/gui/psppire-dialog-action-crosstabs.c:91 #, fuzzy #| msgid "Percent" msgid "Row percent" msgstr "Odstotek" #: src/ui/gui/psppire-dialog-action-crosstabs.c:92 msgid "Column" msgstr "Stolpec" #: src/ui/gui/psppire-dialog-action-crosstabs.c:92 #, fuzzy #| msgid "Cum Percent" msgid "Column percent" msgstr "Zbirni odstotek" #: src/ui/gui/psppire-dialog-action-crosstabs.c:93 #, fuzzy #| msgid "Valid Percent" msgid "Total percent" msgstr "Odstotek veljavnih" #: src/ui/gui/psppire-dialog-action-crosstabs.c:94 #: src/language/stats/crosstabs.q:1266 msgid "Expected" msgstr "Pričakovano" #: src/ui/gui/psppire-dialog-action-crosstabs.c:94 #, fuzzy #| msgid "Expected Values:" msgid "Expected value" msgstr "Pričakovane vrednosti" #: src/ui/gui/psppire-dialog-action-crosstabs.c:96 #: src/language/stats/crosstabs.q:1268 msgid "Std. Residual" msgstr "Std. ostanek" #: src/ui/gui/psppire-dialog-action-crosstabs.c:96 #, fuzzy #| msgid "Std. Residual" msgid "Standardized Residual" msgstr "Std. ostanek" #: src/ui/gui/psppire-dialog-action-crosstabs.c:97 msgid "Adjusted Std. Residual" msgstr "Prilagojen std. ostanek" #: src/ui/gui/psppire-dialog-action-descriptives.c:45 msgid "Standard error" msgstr "Standardna napaka (SN)" #: src/ui/gui/psppire-dialog-action-descriptives.c:45 #, fuzzy #| msgid "Standard error of the mean" msgid "Standard error of mean" msgstr "SN povprečja" #: src/ui/gui/psppire-dialog-action-descriptives.c:47 #, fuzzy #| msgid "Standard error of the kurtosis" msgid "Kurtosis and standard error of kurtosis" msgstr "SN koeficienta sploščenosti" #: src/ui/gui/psppire-dialog-action-descriptives.c:48 #, fuzzy #| msgid "Standard error of the skewness" msgid "Skewness and standard error of skewness" msgstr "SN koeficienta asimetrije" #: src/ui/gui/psppire-dialog-action-factor.c:323 #, c-format msgid "_Eigenvalues over %4.2f times the mean eigenvalue" msgstr " _Lastne vrednosti nad %4.2f-krat povprečne lastne vrednosti " #: src/ui/gui/psppire-dialog-action-frequencies.c:44 msgid "Standard error of the mean" msgstr "SN povprečja" #: src/ui/gui/psppire-dialog-action-frequencies.c:47 msgid "Standard error of the skewness" msgstr "SN koeficienta asimetrije" #: src/ui/gui/psppire-dialog-action-frequencies.c:51 msgid "Standard error of the kurtosis" msgstr "SN koeficienta sploščenosti" #: src/ui/gui/psppire-dialog-action-oneway.c:175 #, c-format msgid "Contrast %d of %d" msgstr "Kontrast %d od %d" #: src/ui/gui/psppire-dialog-action-paired.c:162 src/ui/gui/examine.ui:282 #: src/ui/gui/indep-samples.ui:334 src/ui/gui/t-test.ui:296 msgid "O_ptions..." msgstr "_Možnosti ..." #: src/ui/gui/psppire-dialog-action-paired.c:168 msgid "Paired Samples T Test" msgstr "T-test _odvisnih parov vzorcev" #: src/ui/gui/psppire-dialog-action-recode-different.c:327 msgid "Recode into Different Variables" msgstr "Prekodiraj v nove spremenljivke" #: src/ui/gui/psppire-dialog-action-recode-different.c:330 msgid "Recode into Different Variables: Old and New Values " msgstr "Prekodiraj v nove spremenljivke: stare in nove vrednosti" #: src/ui/gui/psppire-dialog-action-recode-same.c:108 src/ui/gui/recode.ui:391 msgid "Recode into Same Variables" msgstr "Prekodiraj v iste spremenljivke" #: src/ui/gui/psppire-dialog-action-recode-same.c:114 msgid "Recode into Same Variables: Old and New Values" msgstr "Prekodiraj v iste spremenljivke: stare in nove vrednosti" #: src/ui/gui/psppire-dialog-action-regression.c:40 msgid "Coeff" msgstr "Koeficient" #: src/ui/gui/psppire-dialog-action-regression.c:40 msgid "Show the regression coefficients" msgstr "Pokaži koeficiente regresije" #: src/ui/gui/psppire-dialog-action-regression.c:41 msgid "Conf. Interval" msgstr "Interval zaupanja" #: src/ui/gui/psppire-dialog-action-regression.c:41 msgid "Show the confidence interval for the regression coefficients" msgstr "Pokaži interval zaupanja za koeficiente regresije" #: src/ui/gui/psppire-dialog-action-regression.c:42 msgid "Show the correlation between observed and predicted values" msgstr "Pokaži korelacije med opazovanimi in napovedanimi vrednostmi" #: src/ui/gui/psppire-dialog-action-regression.c:43 msgid "Anova" msgstr "Preizkus ANOVA" #: src/ui/gui/psppire-dialog-action-regression.c:43 msgid "Show the analysis of variance table" msgstr "Pokaži analizo razpredelnice variance" #: src/ui/gui/psppire-dialog-action-regression.c:44 msgid "Bcov" msgstr "Matrika variance-kovariance Bcov" #: src/ui/gui/psppire-dialog-action-regression.c:44 msgid "Show the variance coefficient matrix" msgstr "Pokaži matriko koeficientov variance" #: src/ui/gui/psppire-dialog-action-regression.c:45 #, fuzzy #| msgid "Total" msgid "Tol" msgstr "Skupaj" #: src/ui/gui/psppire-dialog-action-regression.c:45 #, fuzzy #| msgid "Show the variance coefficient matrix" msgid "Show the variance inflation factor and its reciprocal" msgstr "Pokaži matriko koeficientov variance" #: src/ui/gui/psppire-dialog-action-select.c:88 #, c-format msgid "Approximately %3d%% of all cases." msgstr "Približno %3d%% vseh primerov." #: src/ui/gui/psppire-dialog-action-select.c:89 #, c-format msgid "Exactly %3d cases from the first %3d cases." msgstr "Natanko %3d izmed prvih %3d primerov." #: src/ui/gui/psppire-dialog-action-select.c:236 #, c-format msgid "%d thru %d" msgstr "%d skozi %d" #: src/ui/gui/psppire-dialog-action-two-sample.c:180 #: src/ui/gui/k-independent.ui:404 src/ui/gui/k-related.ui:197 msgid "Test Type" msgstr "Vrsta preizkusa" #: src/ui/gui/psppire-dialog-action-two-sample.c:189 msgid "_Wilcoxon" msgstr "_Wilcoxonov W" #: src/ui/gui/psppire-dialog-action-two-sample.c:190 msgid "_Sign" msgstr "_Preizkus z znaki" #: src/ui/gui/psppire-dialog-action-two-sample.c:191 msgid "_McNemar" msgstr "_McNemarjev test" #: src/ui/gui/psppire-dialog-action-two-sample.c:209 msgid "Two-Related-Samples Tests" msgstr "Preizkus dveh povezanih vzorcev" #: src/ui/gui/psppire-dialog-action-weight.c:74 src/ui/gui/weight.ui:83 #: src/ui/gui/weight.ui:211 msgid "Do not weight cases" msgstr "Ne uteži primerov" #: src/ui/gui/psppire-dialog-action-weight.c:80 #, c-format msgid "Weight cases by %s" msgstr "Uteži primere s spremenljivko %s" #: src/ui/gui/psppire-dict.c:95 msgid "Var" msgstr "Spr" #. TRANSLATORS: This string must be a valid variable name. That means: #. - The string must be at most 64 bytes (not characters) long. #. - The string may not contain whitespace. #. - The first character may not be '$' #. - The first character may not be a digit #. - The final character may not be '.' or '_' #. #: src/ui/gui/psppire-dict.c:385 #, c-format msgid "Var%04d" msgstr "Spr%04d" #: src/ui/gui/psppire-dict.c:566 msgid "Duplicate variable name." msgstr "Podvojeno ime spremenljivke." #: src/ui/gui/psppire-dictview.c:617 msgid "Prefer variable labels" msgstr "Prednostne oznake spremenljivk" #: src/ui/gui/psppire-dictview.c:631 msgid "Default sort order" msgstr "Privzeti vrstni red razvrščanja" #: src/ui/gui/psppire-dictview.c:637 msgid "Unsorted (dictionary order)" msgstr "Nerazvrščeno (vpisna razvrstitev)" #: src/ui/gui/psppire-dictview.c:642 msgid "Sort by name" msgstr "Razvrsti po imenu" #: src/ui/gui/psppire-dictview.c:647 msgid "Sort by label" msgstr "Razvrsti po oznaki" #: src/ui/gui/psppire-means-layer.c:95 #, c-format msgid "Layer %d of %d" msgstr "Plast %d od %d" #: src/ui/gui/psppire-means-layer.c:169 msgid "Forward" msgstr "Naprej" #: src/ui/gui/psppire-means-layer.c:170 msgid "Back" msgstr "Nazaj" #: src/ui/gui/psppire-text-file.c:55 #, c-format msgid "Could not open `%s'" msgstr "Ni mogoče odpreti »%s«" #: src/ui/gui/psppire-text-file.c:71 #, c-format msgid "Error reading `%s': %s" msgstr "Napaka med branjem »%s«: %s" #: src/ui/gui/psppire-text-file.c:74 #, c-format msgid "" "Failed to read `%s', because it contains a line over %d bytes long and " "therefore appears not to be a text file." msgstr "" "Branje datoteke »%s« je zaradi vrstice, daljše od %d-bajtov, spodletelo. " "Datoteka ni videti kot običajna besedilna datoteka." #: src/ui/gui/psppire-text-file.c:96 #, c-format msgid "`%s' is empty." msgstr "»%s« je prazen." #: src/ui/gui/psppire-val-chooser.c:255 msgid "through" msgstr "" #: src/ui/gui/psppire-val-chooser.c:288 msgid "_Value:" msgstr "_Vrednost:" #: src/ui/gui/psppire-val-chooser.c:289 msgid "_System Missing" msgstr "_Sistemske manjkajoče" #: src/ui/gui/psppire-val-chooser.c:290 msgid "System _or User Missing" msgstr "Sistemska ali uporabniška manjkajoča vrednost" #: src/ui/gui/psppire-val-chooser.c:291 msgid "_Range:" msgstr "_Obseg:" #: src/ui/gui/psppire-val-chooser.c:292 msgid "Range, _LOWEST thru value" msgstr "Rang, NAJNIŽJA do vrednosti" #: src/ui/gui/psppire-val-chooser.c:293 msgid "Range, value thru _HIGHEST" msgstr "Rang, vrednost do NAJVIŠJE" #: src/ui/gui/psppire-val-chooser.c:294 msgid "_All other values" msgstr "_Vse druge vrednosti" #: src/ui/gui/psppire-var-view.c:153 #, c-format msgid "Var%d" msgstr "Spr%d" #: src/ui/source-init-opts.c:72 #, c-format msgid "Algorithm must be either `%s' or `%s'." msgstr "Algoritem mora biti ali »%s« ali »%s«." #: src/ui/source-init-opts.c:97 #, c-format msgid "Syntax must be either `%s' or `%s'." msgstr "Skladnja mora biti ali »%s« ali »%s«." #: src/ui/terminal/main.c:144 msgid "Error encountered while ERROR=STOP is effective." msgstr "Zaznana je napaka pri omogočeni možnosti ERROR=STOP." #: src/ui/terminal/main.c:150 msgid "" "Stopping syntax file processing here to avoid a cascade of dependent command " "failures." msgstr "" "obdelava datoteke skladnje bo zaustavljena zaradi nalaganja opozoril " "odvisnih ukazov." #: src/ui/terminal/terminal-opts.c:147 #, c-format msgid "" "PSPP, a program for statistical analysis of sampled data.\n" "Usage: %s [OPTION]... FILE...\n" "\n" "Arguments to long options also apply to equivalent short options.\n" "\n" "Output options:\n" " -o, --output=FILE output to FILE, default format from FILE's name\n" " -O format=FORMAT override format for previous -o\n" " -O OPTION=VALUE set output option to customize previous -o\n" " -O device={terminal|listing} override device type for previous -o\n" " -e, --error-file=FILE append errors, warnings, and notes to FILE\n" " --no-output disable default output driver\n" "Supported output formats: %s\n" "\n" "Language options:\n" " -I, --include=DIR append DIR to search path\n" " -I-, --no-include clear search path\n" " -r, --no-statrc disable running rc file at startup\n" " -a, --algorithm={compatible|enhanced}\n" " set to `compatible' if you want output\n" " calculated from broken algorithms\n" " -x, --syntax={compatible|enhanced}\n" " set to `compatible' to disable PSPP extensions\n" " -b, --batch interpret syntax in batch mode\n" " -i, --interactive interpret syntax in interactive mode\n" " --syntax-encoding=ENCODING specify encoding for syntax files\n" " -s, --safer don't allow some unsafe operations\n" "Default search path: %s\n" "\n" "Informative output:\n" " -h, --help display this help and exit\n" " -V, --version output version information and exit\n" "\n" "Non-option arguments are interpreted as syntax files to execute.\n" msgstr "" "Program PSPP za statistično analizo podatkov.\n" "Uporaba: %s [MOŽNOST]... DATOTEKA\n" "\n" "Ukazni parametri dolge oblike so na voljo tudi za kratke.\n" "\n" "Možnosti odvoda:\n" " -o, --output=DATOTEKA zapiše odvod v DATOTEKO v privzetem zapisu imena " "DATOTEKE\n" " -O format=ZAPIS prepiše zapis predhodno določene datoteke z -o\n" " -O OPTION=VREDNOST nastavi možnost odvoda za prilagajanje zapisa z -" "o\n" " -O device={terminal|listing} prepiše vrsto naprave za predhodno določilo -" "o\n" " -e, --error-file=DATOTEKA doda seznam napak, obvestil in sporočil v " "DATOTEKO\n" " --no-output onemogoči privzeti gonilnik odvoda\n" "Podprti zapisi odvoda: %s\n" "\n" "Jezikovne možnosti:\n" " -I, --include=DIR iskalni poti doda naslov DIR\n" " -I-, --no-include počisti iskalno pot\n" " -r, --no-statrc onemogoči začenjanje datoteke rc ob zagonu\n" " -a, --algorithm={compatible|enhanced}\n" " možnost » compatible «, omogoča izračun analiz\n" " na neustrezno definiranih algoritmih\n" " -x, --syntax={compatible|enhanced}\n" " možnost » compatible « onemogoči zagon " "razširitev PSPP\n" " -i, --interactive skladnjo tolmači v interaktivnem načinu\n" " --syntax-encoding=KODNI NABOR\n" " določi kodni nabor datotek skladnje\n" " -s, --safer ne dovoli izvajanja nekaterih ne-varnih opravil\n" "Privzeta iskalna pot: %s\n" "\n" "Izpis podrobnosti:\n" " -h, --help pokaže pomoč in konča program\n" " -V, --version pokaže podrobnosti različice in konča program\n" "\n" "Drugi parametri so tolmačeni kot ukazi za nalaganje datotek skladnje.\n" #: src/ui/gui/find-dialog.c:197 msgid "Find" msgstr "Najdi" #: src/ui/gui/find-dialog.c:662 #, c-format msgid "Bad regular expression: %s" msgstr "Neustrezen logični izraz: %s" #: src/ui/gui/help-menu.c:70 msgid "A program for the analysis of sampled data" msgstr "Program za statistično analizo podatkov" #. TRANSLATORS: Do not translate this string. Instead, put the names of the people #. who have helped in the translation. #: src/ui/gui/help-menu.c:80 msgid "translator-credits" msgstr "" "Matej Urbančič \n" "Matej Kovačič\n" "Primož Peterlin" #: src/ui/gui/help-menu.c:170 #, c-format msgid "Help path conversion error: %s" msgstr "Napaka pretvorbe poti pomoči: %s" #: src/ui/gui/help-menu.c:197 #, fuzzy, c-format #| msgid "" #| "Cannot open reference manual via yelp: %s. Cannot open via html: %s with " #| "uri: %s The PSSP manual is also available at %s" msgid "" "Cannot open via html: %s with uri: %s The PSSP manual is also available at %s" msgstr "" "Priročnika s programom Yalp ni mogoče odpreti: %s. Ni ga mogoče odpreti niti " "kot HTML: %s z naslovom URI: %s. Priročnik PSPP je na voljo tudi na %s." #: src/ui/gui/help-menu.c:218 msgid "_Help" msgstr "Pomo_č" #: src/ui/gui/help-menu.c:221 msgid "_About" msgstr "_O programu" #: src/ui/gui/help-menu.c:222 msgid "_Reference Manual" msgstr "_Priročnik" #: src/ui/gui/main.c:306 msgid "Show version information and exit" msgstr "Pokaži podatke različice in končaj" #: src/ui/gui/main.c:409 msgid "Do not display the splash screen" msgstr "Ne prikaži pozdravnega pojavnega okna" #: src/ui/gui/main.c:411 #, fuzzy msgid "Do not attempt single instance negotiation" msgstr "Ne izvajaj pogajanj za zagon enojnega primerka programa" #: src/ui/gui/missing-val-dialog.c:217 msgid "" "The maximum length of a missing value for a string variable is 8 in UTF-8." msgstr "" "omejitev dolžine manjkajoče vrednosti za vrsto niza je 8 pri uporabi UTF-8." #: src/ui/gui/missing-val-dialog.c:268 msgid "At least one value must be specified" msgstr "Določiti je treba vsaj eno vrednost." #: src/ui/gui/missing-val-dialog.c:298 msgid "Incorrect range specification" msgstr "Nepravilno določilo obsega" #: src/ui/gui/psppire-data-editor.c:380 #, c-format msgid "%d : %s" msgstr "%d : %s" #: src/ui/gui/psppire-data-editor.c:391 #, c-format msgid "%'d case" msgid_plural "%'d cases" msgstr[0] "%'d primerov" msgstr[1] "%'d primer" msgstr[2] "%'d primera" msgstr[3] "%'d primeri" #: src/ui/gui/psppire-data-editor.c:396 #, c-format msgid "%'d variable" msgid_plural "%'d variables" msgstr[0] "%'d spremenljivk" msgstr[1] "%'d spremenljivka" msgstr[2] "%'d spremenljivki" msgstr[3] "%'d spremenljivke" #: src/ui/gui/psppire-data-editor.c:485 msgid "Case" msgstr "Primer" #: src/ui/gui/psppire-data-editor.c:495 msgid "Data View" msgstr "Pregled podatkov" #: src/ui/gui/psppire-data-editor.c:505 msgid "Variable View" msgstr "Pregled spremenljivk" #: src/ui/gui/psppire-data-sheet.c:171 src/ui/gui/psppire-data-window.c:1338 msgid "_Insert Case" msgstr "Vstavi _primer" #: src/ui/gui/psppire-data-sheet.c:179 src/ui/gui/psppire-data-window.c:1391 msgid "Cl_ear Cases" msgstr "_Počisti primere" #: src/ui/gui/psppire-data-sheet.c:305 src/ui/gui/psppire-data-window.c:1337 #: src/ui/gui/psppire-variable-sheet.c:274 msgid "_Insert Variable" msgstr "Vstavi _spremenljivko" #: src/ui/gui/psppire-data-sheet.c:314 src/ui/gui/psppire-variable-sheet.c:283 msgid "Cl_ear Variables" msgstr "Poč_isti spremenljivke" #: src/ui/gui/psppire-data-sheet.c:326 msgid "Sort _Ascending" msgstr "Razvrsti _naraščajoče" #: src/ui/gui/psppire-data-sheet.c:333 msgid "Sort _Descending" msgstr "Razvrsti _padajoče" #: src/ui/gui/psppire-data-window.c:175 msgid "Transformations Pending" msgstr "Čakajoče obdelave" #: src/ui/gui/psppire-data-window.c:191 msgid "Filter off" msgstr "Nefiltrirano" #: src/ui/gui/psppire-data-window.c:203 #, c-format msgid "Filter by %s" msgstr "Filtriranje po %s" #: src/ui/gui/psppire-data-window.c:224 msgid "No Split" msgstr "Nerazdeljeno" #: src/ui/gui/psppire-data-window.c:233 msgid "Split by " msgstr "Razdeli po" #: src/ui/gui/psppire-data-window.c:261 msgid "Weights off" msgstr "Neuteženo" #: src/ui/gui/psppire-data-window.c:273 #, c-format msgid "Weight by %s" msgstr "Uteženo po %s" #: src/ui/gui/psppire-data-window.c:518 #: src/ui/gui/psppire-import-assistant.c:681 #: src/ui/gui/psppire-syntax-window.c:607 src/ui/gui/psppire-window.c:669 msgid "All Files" msgstr "Vse datoteke" #: src/ui/gui/psppire-data-window.c:535 msgid "System File" msgstr "Sistemska datoteka" #: src/ui/gui/psppire-data-window.c:542 msgid "Compressed System File" msgstr "Stisnjena sistemska datoteka" #: src/ui/gui/psppire-data-window.c:548 msgid "Portable File" msgstr "Prenosna datoteka" #: src/ui/gui/psppire-data-window.c:551 #, fuzzy msgid "Format:" msgstr "Zapis:" #: src/ui/gui/psppire-data-window.c:615 msgid "Delete Existing Dataset?" msgstr "Ali želite izbrisati obstoječo podatkovno zbirko?" #: src/ui/gui/psppire-data-window.c:619 #, c-format msgid "" "Renaming \"%s\" to \"%s\" will destroy the existing dataset named \"%s\". " "Are you sure that you want to do this?" msgstr "" "Preimenovanje »%s« v »%s« bo uničilo trenutno podatkovno zbirko z imenom " "»%s«. Ali ste prepričani, da želite nadaljevati?" #: src/ui/gui/psppire-data-window.c:625 msgid "Delete" msgstr "Izbriši" #: src/ui/gui/psppire-data-window.c:647 #, c-format msgid "Please enter a new name for dataset \"%s\":" msgstr "Vpis novega imena za podatkovno zbirko »%s«" #: src/ui/gui/psppire-data-window.c:649 msgid "Rename Dataset" msgstr "Preimenovanje podatkovne zbirke" #: src/ui/gui/psppire-data-window.c:1199 src/ui/gui/output-window.ui:68 #: src/ui/gui/syntax-editor.ui:22 msgid "_File" msgstr "_Datoteka" #: src/ui/gui/psppire-data-window.c:1203 src/ui/gui/syntax-editor.ui:25 msgid "_New" msgstr "_Nova" #: src/ui/gui/psppire-data-window.c:1210 msgid "_Syntax" msgstr "Datoteka _skladnje" #: src/ui/gui/psppire-data-window.c:1213 src/ui/gui/data-editor.ui:177 #: src/ui/gui/data-editor.ui:189 msgid "_Data" msgstr "Datoteka s _podatki" #: src/ui/gui/psppire-data-window.c:1220 src/ui/gui/syntax-editor.ui:36 msgid "_Open" msgstr "_Odpri" #: src/ui/gui/psppire-data-window.c:1223 msgid "_Import Data..." msgstr "_Uvozi podatke ..." #: src/ui/gui/psppire-data-window.c:1231 src/ui/gui/logistic.ui:261 #: src/ui/gui/regression.ui:66 msgid "_Save..." msgstr "_Shrani ..." #: src/ui/gui/psppire-data-window.c:1234 msgid "Save _As..." msgstr "Shrani _kot ..." #: src/ui/gui/psppire-data-window.c:1237 msgid "_Rename Dataset..." msgstr "_Preimenuj podatkovno zbirko ..." #: src/ui/gui/psppire-data-window.c:1248 msgid "_Display Data File Information" msgstr "_Pokaži podrobnosti podatkovne datoteke" #: src/ui/gui/psppire-data-window.c:1255 msgid "Working File" msgstr "Delovna datoteka" #: src/ui/gui/psppire-data-window.c:1257 msgid "_External File..." msgstr "_Zunanja datoteka ..." #: src/ui/gui/psppire-data-window.c:1267 msgid "_Recently Used Data" msgstr "Nedavno uporabljeni _podatki" #: src/ui/gui/psppire-data-window.c:1268 msgid "Recently Used _Files" msgstr "Nedavno uporabljene _datoteke" #: src/ui/gui/psppire-data-window.c:1315 src/ui/gui/output-window.ui:82 #: src/ui/gui/syntax-editor.ui:59 msgid "_Quit" msgstr "_Končaj" #: src/ui/gui/psppire-data-window.c:1333 src/ui/gui/output-window.ui:89 #: src/ui/gui/syntax-editor.ui:66 msgid "_Edit" msgstr "_Uredi" #: src/ui/gui/psppire-data-window.c:1339 msgid "_Go To Variable..." msgstr "_Skoči na spremenljivko ..." #: src/ui/gui/psppire-data-window.c:1340 msgid "_Go To Case..." msgstr "_Skoči na primer ..." #: src/ui/gui/psppire-data-window.c:1364 src/ui/gui/syntax-editor.ui:69 msgid "Cu_t" msgstr "_Izreži" #: src/ui/gui/psppire-data-window.c:1373 src/ui/gui/output-window.ui:96 #: src/ui/gui/syntax-editor.ui:74 msgid "_Copy" msgstr "_Kopiraj" #: src/ui/gui/psppire-data-window.c:1380 src/ui/gui/syntax-editor.ui:79 msgid "_Paste" msgstr "_Prilepi" #: src/ui/gui/psppire-data-window.c:1387 msgid "Clear _Variables" msgstr "Poč_isti spremenljivke" #: src/ui/gui/psppire-data-window.c:1401 msgid "_Find..." msgstr "_Najdi ..." #: src/ui/gui/psppire-data-window.c:1407 src/ui/gui/logistic.ui:246 msgid "_Options..." msgstr "_Možnosti ..." #: src/ui/gui/psppire-data-window.c:1676 msgid "Jump to variable" msgstr "Skoči na spremenljivko" #: src/ui/gui/psppire-data-window.c:1689 msgid "Jump to a case in the data sheet" msgstr "Skoči na primer na podatkovnem listu" #: src/ui/gui/psppire-data-window.c:1703 msgid "Search for values in the data" msgstr "Poišči spremenljivke med podatki" #: src/ui/gui/psppire-data-window.c:1715 msgid "Create a new case at the current position" msgstr "Ustvari nov primer na trenutnem mestu" #: src/ui/gui/psppire-data-window.c:1727 msgid "Create a new variable at the current position" msgstr "Ustvari novo spremenljivko na trenutnem mestu" #: src/ui/gui/psppire-data-window.c:1741 msgid "Split the active dataset" msgstr "Razdeli izbrano podatkovno zbirko" #: src/ui/gui/psppire-data-window.c:1753 msgid "Weight cases by variable" msgstr "Uteži primere s spremenljivko" #: src/ui/gui/psppire-data-window.c:1764 msgid "Show/hide value labels" msgstr "Pokaži/Skrij oznake vrednosti" #: src/ui/gui/psppire-data-window.c:1904 msgid "Data Editor" msgstr "Urejevalnik podatkov" #: src/ui/gui/psppire-encoding-selector.c:140 msgid "Automatically Detect" msgstr "samodejno zaznaj" #: src/ui/gui/psppire-encoding-selector.c:147 msgid "Locale Encoding" msgstr "sistemsko kodiranje" #: src/ui/gui/psppire-encoding-selector.c:177 msgid "Character Encoding: " msgstr "Znakovni nabor: " #: src/ui/gui/psppire-import-assistant.c:337 msgid "line" msgstr "vrstica" #: src/ui/gui/psppire-import-assistant.c:347 msgid "var" msgstr "spr" #: src/ui/gui/psppire-import-assistant.c:560 msgid "Importing Spreadsheet Data" msgstr "Uvažanje podatkov iz preglednice" #: src/ui/gui/psppire-import-assistant.c:686 msgid "Text Files" msgstr "Besedilne datoteke" #: src/ui/gui/psppire-import-assistant.c:691 msgid "Text (*.txt) Files" msgstr "Besedilne datoteke (*.txt)" #: src/ui/gui/psppire-import-assistant.c:697 msgid "Plain Text (ASCII) Files" msgstr "Besedilne datoteke (ASCII)" #: src/ui/gui/psppire-import-assistant.c:702 msgid "Comma Separated Value Files" msgstr "Datoteke s podatki, ločenimi z vejico" #: src/ui/gui/psppire-import-assistant.c:709 msgid "Tab Separated Value Files" msgstr "Datoteke s podatki, ločenimi s tabulatorji" #: src/ui/gui/psppire-import-assistant.c:714 msgid "Gnumeric Spreadsheet Files" msgstr "Datoteke preglednic Gnumeric" #: src/ui/gui/psppire-import-assistant.c:719 msgid "OpenDocument Spreadsheet Files" msgstr "Datoteke preglednic OpenDocument" #: src/ui/gui/psppire-import-assistant.c:724 msgid "All Spreadsheet Files" msgstr "Vse preglednične datoteke" #: src/ui/gui/psppire-import-assistant.c:733 msgid "Select File to Import" msgstr "Izbor datoteke za uvoz ..." #: src/ui/gui/psppire-import-assistant.c:770 msgid "Importing Delimited Text Data" msgstr "Uvažanje podatkov iz besedilne datoteke" #: src/ui/gui/psppire-import-assistant.c:865 msgid "Select the First Line" msgstr "Izbor prve vrstice" #: src/ui/gui/psppire-import-assistant.c:877 msgid "Line" msgstr "Črta" #: src/ui/gui/psppire-import-assistant.c:931 #, fuzzy #| msgid "" #| "This assistant will guide you through the process of importing data into " #| "PSPP from a text file with one line per case, in which fields are " #| "separated by tabs, commas, or other delimiters.\n" #| "\n" msgid "" "This assistant will guide you through the process of importing data into " "PSPP from a text file with one line per case, in which fields are separated " "by tabs, commas, or other delimiters.\n" "\n" msgstr "" "Pomočnik omogoča vodenje skozi postopek uvoza podatkov v program PSPP iz " "besedilne podatkovne datoteke, v kateri je vsak primer zapisan v eni " "vrstici, polja pa so ločena z ločili.\n" "\n" #: src/ui/gui/psppire-import-assistant.c:941 #, fuzzy, c-format #| msgid "The selected file contains %'lu line of text." #| msgid_plural "The selected file contains %'lu lines of text." msgid "The selected file contains %'lu line of text. " msgid_plural "The selected file contains %'lu lines of text. " msgstr[0] "Izbrana datoteka vsebuje %'lu vrstic besedilnih podatkov." msgstr[1] "Izbrana datoteka vsebuje %'lu vrstico besedilnih podatkov." msgstr[2] "Izbrana datoteka vsebuje %'lu vrstici besedilnih podatkov." msgstr[3] "Izbrana datoteka vsebuje %'lu vrstice besedilnih podatkov." #: src/ui/gui/psppire-import-assistant.c:950 #, c-format msgid "The selected file contains approximately %'lu line of text. " msgid_plural "The selected file contains approximately %'lu lines of text. " msgstr[0] "Izbrana datoteka vsebuje približno %'lu vrstic besedila." msgstr[1] "Izbrana datoteka vsebuje približno %'lu vrstico besedila." msgstr[2] "Izbrana datoteka vsebuje približno %'lu vrstici besedila." msgstr[3] "Izbrana datoteka vsebuje približno %'lu vrstice besedila." #: src/ui/gui/psppire-import-assistant.c:956 #, fuzzy, c-format #| msgid "" #| "Only the first %zu line of the file will be shown for preview purposes in " #| "the following screens. " #| msgid_plural "" #| "Only the first %zu lines of the file will be shown for preview purposes " #| "in the following screens." msgid "" "Only the first %zu line of the file will be shown for preview purposes in " "the following screens. " msgid_plural "" "Only the first %zu lines of the file will be shown for preview purposes in " "the following screens. " msgstr[0] "Za prikaz uvoza bo izpisanih le prvih %zu vrstic datoteke." msgstr[1] "Za prikaz uvoza bo izpisana le prva %zu vrstica datoteke." msgstr[2] "Za prikaz uvoza bosta izpisani le prvi %zu vrstici datoteke." msgstr[3] "Za prikaz uvoza bodo izpisane le prve %zu vrstice datoteke." #: src/ui/gui/psppire-import-assistant.c:965 msgid "You may choose below how much of the file should actually be imported." msgstr "" "Izbrati je mogoče tudi obseg podatkov, ki naj tudi bodo uvoženi v program." #: src/ui/gui/psppire-import-assistant.c:974 #, c-format msgid "Only the first %4d cases" msgstr "Uvozi prvih %4d primerov" #: src/ui/gui/psppire-import-assistant.c:985 #, c-format msgid "Only the first %3d %% of file (approximately)" msgstr "Uvozi %3d %% podatkov v datoteki (okvirno)" #: src/ui/gui/psppire-import-assistant.c:1009 msgid "Select the Lines to Import" msgstr "Izbor podatkov za uvoz" #: src/ui/gui/psppire-import-assistant.c:1151 msgid "Choose Separators" msgstr "Izbor ločilnikov" #: src/ui/gui/psppire-import-assistant.c:1438 msgid "Adjust Variable Formats" msgstr "Pregled lastnosti spremenljivk" #: src/ui/gui/psppire-output-view.c:410 msgid "Message" msgstr "Sporočilo" #: src/ui/gui/psppire-output-view.c:543 msgid "failed to create temporary directory during clipboard operation" msgstr "ustvarjanje začasne mape med obdelavo odložišča ja spodletelo" #: src/ui/gui/psppire-output-window.c:241 msgid "Infer file type from extension" msgstr "Vrsta datoteke po priponi" #: src/ui/gui/psppire-output-window.c:242 msgid "SPSS Viewer (*.spv)" msgstr "" #: src/ui/gui/psppire-output-window.c:243 msgid "PDF (*.pdf)" msgstr "Dokument PDF (*.pdf)" #: src/ui/gui/psppire-output-window.c:244 msgid "HTML (*.html)" msgstr "Dokument HTML (*.html)" #: src/ui/gui/psppire-output-window.c:245 msgid "OpenDocument (*.odt)" msgstr "OpenDocument (*.odt)" #: src/ui/gui/psppire-output-window.c:246 msgid "Text (*.txt)" msgstr "Besedilo [razširjeno] (*.txt)" #: src/ui/gui/psppire-output-window.c:247 msgid "Text [plain] (*.txt)" msgstr "Besedilo [poenostavljeno] (*.txt)" #: src/ui/gui/psppire-output-window.c:248 msgid "PostScript (*.ps)" msgstr "PostScript (*.ps)" #: src/ui/gui/psppire-output-window.c:249 msgid "Comma-Separated Values (*.csv)" msgstr "Z vejico ločene vrednosti (*.csv)" #: src/ui/gui/psppire-output-window.c:350 msgid "Export Output" msgstr "Izvozi odvod" #: src/ui/gui/psppire-output-window.c:548 msgid "Output Viewer" msgstr "Pregledovalnik rezultatov analize" #: src/ui/gui/psppire-spreadsheet-model.c:237 msgid "(empty)" msgstr "(prazno)" #: src/ui/gui/psppire-syntax-window.c:226 msgid "Text Search" msgstr "" #: src/ui/gui/psppire-syntax-window.c:229 #, fuzzy #| msgid "OK" msgid "_OK" msgstr "V redu" #: src/ui/gui/psppire-syntax-window.c:231 #, fuzzy #| msgid "Cancel" msgid "_Cancel" msgstr "Prekliči" #: src/ui/gui/psppire-syntax-window.c:239 msgid "Text to search for:" msgstr "" #: src/ui/gui/psppire-syntax-window.c:570 #, c-format msgid "Saved file `%s'" msgstr "Shranjena datoteka »%s«" #: src/ui/gui/psppire-syntax-window.c:591 msgid "Save Syntax" msgstr "Shrani skladnjo" #: src/ui/gui/psppire-syntax-window.c:601 src/ui/gui/psppire-window.c:657 msgid "Syntax Files (*.sps) " msgstr "Datoteka s skladnjo (*.sps)" #: src/ui/gui/psppire-syntax-window.c:970 msgid "Syntax Editor" msgstr "Urejevalnik skladnje" #: src/ui/gui/psppire-syntax-window.c:990 #, c-format msgid "Cannot load syntax file `%s'" msgstr "Ni mogoče naložiti datoteke skladnje »%s«." #: src/ui/gui/psppire-variable-sheet.c:412 #, c-format msgid "{%s, %s}..." msgstr "{%s, %s}..." #: src/ui/gui/psppire-var-sheet-header.c:64 msgid "Decimal" msgstr "Decimalke" #: src/ui/gui/psppire-var-sheet-header.c:79 msgid "Align" msgstr "Poravnava" #: src/ui/gui/psppire-var-sheet-header.c:82 msgid "Measure" msgstr "Mera" #: src/ui/gui/psppire-window.c:430 #, c-format msgid "Save the changes to `%s' before closing?" msgstr "Ali želite pred zapiranjem shraniti spremembe v »%s«?" #: src/ui/gui/psppire-window.c:437 #, c-format msgid "" "If you don't save, changes from the last %ld seconds will be permanently " "lost." msgstr "" "V kolikor sprememb ne shranite, bodo podatki %ld sekund dela trajno " "izgubljeni." #: src/ui/gui/psppire-window.c:441 msgid "Close _without saving" msgstr "Zapri _brez shranjevanja" #: src/ui/gui/psppire-window.c:625 src/ui/gui/psppire-window.c:629 msgid "Open" msgstr "Odpri" #: src/ui/gui/psppire-window.c:634 msgid "Data and Syntax Files" msgstr "Datoteke s podatki in s skladnjo" #: src/ui/gui/psppire-window.c:646 msgid "System Files (*.sav, *.zsav)" msgstr "Sistemske datoteke (*.sav)" #: src/ui/gui/psppire-window.c:663 #, fuzzy #| msgid "Syntax Files (*.sps) " msgid "Output Files (*.spv) " msgstr "Datoteka s skladnjo (*.sps)" #: src/ui/gui/t-test-options.c:65 #, c-format msgid "Con_fidence Interval: %2d %%" msgstr "Interval _zaupanja: %2d %%" #: src/ui/gui/val-labs-dialog.c:591 #, c-format msgid "%s = `%s'" msgstr "%s = »%s«" #: src/ui/gui/var-type-dialog.c:541 #, fuzzy #| msgid "Compute Variable: Type and Label" msgid "Variable Type and Format" msgstr "Spremenljivka izračuna: vrsta in oznaka" #: src/ui/gui/windows-menu.c:92 msgid "_Minimize all Windows" msgstr "_Skrči vsa okna" #: src/ui/gui/windows-menu.c:100 msgid "_Split" msgstr "_Razdeli" #: src/ui/gui/windows-menu.c:132 msgid "_Windows" msgstr "_Okna" #: utilities/pspp-convert.c:67 #, c-format msgid "%s argument must be a single character" msgstr "" #: utilities/pspp-convert.c:265 msgid "exactly two non-option arguments are required; use --help for help" msgstr "" "zahtevana sta natanko 2 ne-izbirna argumenta; uporabite --help za pomoč o " "ukazih." #: utilities/pspp-convert.c:276 #, c-format msgid "%s: cannot guess output format (use -O option)" msgstr "%s: ni mogoče določiti zapisa odvoda (uporabiti je treba zastavico -O)" #: utilities/pspp-convert.c:341 #, c-format msgid "%s: unknown output format (use -O option)" msgstr "%s: neznan zapis odvoda (uporabiti je treba zastavico -O)" #: utilities/pspp-convert.c:360 #, c-format msgid "%s: error reading input file" msgstr "%s: napaka med branjem dovodne datoteke" #: utilities/pspp-convert.c:362 #, c-format msgid "%s: error writing output file" msgstr "%s: napaka med zapisovanjem odvodne datoteke" #: utilities/pspp-convert.c:409 #, fuzzy, c-format #| msgid "%s: error opening output file" msgid "%s: error opening password file" msgstr "%s: napaka odpiranja odvodne datoteke" #: utilities/pspp-convert.c:425 #, fuzzy, c-format #| msgid "%s: error reading input file" msgid "" "\n" "%s: password not in file" msgstr "%s: napaka med branjem dovodne datoteke" #: utilities/pspp-convert.c:462 #, fuzzy, c-format #| msgid "`%c' is not a valid hex digit" msgid "%s: '%c' is not in alphabet" msgstr "»%c« ni veljavna šestnajstiška števka" #: utilities/pspp-convert.c:526 msgid "sorry, wrong password" msgstr "napačno geslo" #: utilities/pspp-output.c:92 #, c-format msgid "%s and %s:" msgstr "" #: utilities/pspp-output.c:547 #, c-format msgid "%s: invalid XPath expression" msgstr "" #: utilities/pspp-output.c:716 msgid "missing command name (use --help for help)" msgstr "" #: utilities/pspp-output.c:720 #, c-format msgid "unknown command \"%s\" (use --help for help)" msgstr "" #: utilities/pspp-output.c:728 #, c-format msgid "\"%s\" command takes exactly %d argument" msgid_plural "\"%s\" command takes exactly %d arguments" msgstr[0] "" msgstr[1] "" msgstr[2] "" msgstr[3] "" #: utilities/pspp-output.c:735 #, fuzzy, c-format #| msgid "%s requires at least %d valid arguments in list." msgid "\"%s\" command requires at least %d argument" msgid_plural "\"%s\" command requires at least %d arguments" msgstr[0] "%s zahteva vsaj %d veljavnih argumentov v seznamu." msgstr[1] "%s zahteva vsaj %d veljavnih argumentov v seznamu." msgstr[2] "%s zahteva vsaj %d veljavnih argumentov v seznamu." msgstr[3] "%s zahteva vsaj %d veljavnih argumentov v seznamu." #: utilities/pspp-output.c:742 #, fuzzy, c-format #| msgid "%s requires at least %d valid arguments in list." msgid "\"%s\" command requires between %d and %d arguments" msgstr "%s zahteva vsaj %d veljavnih argumentov v seznamu." #: utilities/pspp-output.c:782 msgid "The following object classes are supported:" msgstr "" #: utilities/pspp-output.c:791 #, c-format msgid "%s: unknown object class (use --select=help for help" msgstr "" #: src/language/utilities/set.q:162 #, c-format msgid "%s must be between 0 and 20." msgstr "%s mora biti med 1 in 20." #: src/language/utilities/set.q:172 src/language/utilities/set.q:179 #, c-format msgid "%s must be at least 1." msgstr "%s mora biti vsaj 1." #: src/language/utilities/set.q:205 #, c-format msgid "%s must be at least 1MB" msgstr "%s mora biti vsaj 1MB." #: src/language/utilities/set.q:207 #, c-format msgid "%s must be positive" msgstr "%s mora biti pozitivna vrednost." #: src/language/utilities/set.q:213 src/language/utilities/set.q:215 #: src/language/utilities/set.q:217 src/language/utilities/set.q:219 #: src/language/utilities/set.q:221 src/language/utilities/set.q:223 #: src/language/utilities/set.q:225 src/language/utilities/set.q:227 #: src/language/utilities/set.q:229 src/language/utilities/set.q:231 #: src/language/utilities/set.q:233 #, c-format msgid "%s is obsolete." msgstr "%s je zastarela zmožnost." #: src/language/utilities/set.q:239 msgid "Active file compression is not implemented." msgstr "Dejavno stiskanje datoteke ni podprto." #: src/language/utilities/set.q:403 #, c-format msgid "%s must be 1500 or later." msgstr "%s mora biti 1500 ali kasneje." #: src/language/utilities/set.q:410 #, c-format msgid "expecting %s or year" msgstr "pričakovana je vrednost %s ali leto." #: src/language/utilities/set.q:438 src/language/utilities/set.q:535 #, c-format msgid "%s must be at least %d." msgstr "%s mora biti vsaj %d." #: src/language/utilities/set.q:474 #, c-format msgid "%s is not a recognized encoding or locale name" msgstr "%s ni prepoznana jezikovna koda oziroma krajevno ime" #: src/language/utilities/set.q:562 #, c-format msgid "" "%s requires numeric output format as an argument. Specified format %s is of " "type string." msgstr "%s zahteva številski odvod kot argument. Določen zapis %s je niz." #: src/language/utilities/set.q:791 msgid "ISL (32-bit IEEE 754 single, little-endian)" msgstr "ISL (32-bitni IEEE 754 enojni, little-endian)" #: src/language/utilities/set.q:794 msgid "ISB (32-bit IEEE 754 single, big-endian)" msgstr "ISB (32-bitni IEEE 754 enojni, big-endian)" #: src/language/utilities/set.q:797 msgid "IDL (64-bit IEEE 754 double, little-endian)" msgstr "IDL (64-bitni IEEE 754 dvojni, little-endian)" #: src/language/utilities/set.q:800 msgid "IDB (64-bit IEEE 754 double, big-endian)" msgstr "IDB (64-bitni IEEE 754 dvojni, big-endian)" #: src/language/utilities/set.q:804 msgid "VF (32-bit VAX F, VAX-endian)" msgstr "VF (32-bitni VAX F, VAX-endian)" #: src/language/utilities/set.q:807 msgid "VD (64-bit VAX D, VAX-endian)" msgstr "VD (64-binit VAX D, VAX-endian)" #: src/language/utilities/set.q:810 msgid "VG (64-bit VAX G, VAX-endian)" msgstr "VG (64-bitni VAX G, VAX-endian)" #: src/language/utilities/set.q:814 msgid "ZS (32-bit IBM Z hexadecimal short, big-endian)" msgstr "ZS (32-bitni IBM Z kratek šestnajstiški, big-endian)" #: src/language/utilities/set.q:817 msgid "ZL (64-bit IBM Z hexadecimal long, big-endian)" msgstr "ZL (64-bit IBM Z dolgi šestnajstiški, big-endian)" #: src/language/utilities/set.q:985 #, c-format msgid "%s is %s." msgstr "%s je %s." #: src/language/utilities/set.q:1089 #, c-format msgid "" "Too many %s commands without a %s: at most %d levels of saved settings are " "allowed." msgstr "" "določenih je preveč ukazov %s brez %s: dovoljenih je največ %d ravni " "shranjenih nastavitev." #: src/language/utilities/set.q:1109 #, c-format msgid "%s without matching %s." msgstr "" #: src/language/stats/crosstabs.q:327 #, fuzzy, c-format msgid "Missing mode %s not allowed in general mode. Assuming %s." msgstr "" "v splošnem načinu, način manjkajočih vrednosti %s ni dovoljen. Predivdena je " "uporaba %s." #: src/language/stats/crosstabs.q:444 msgid "Too many cross-tabulation variables or dimensions." msgstr "podanih je preveč spremenljivk za kontingenčno razpredelnico." #: src/language/stats/crosstabs.q:509 #, c-format msgid "%s must be specified before %s." msgstr "ukaz %s mora biti določen pred %s." #: src/language/stats/crosstabs.q:543 #, c-format msgid "Maximum value (%ld) less than minimum value (%ld)." msgstr "Največja vrednost (%ld) je manjša od najmanjše vrednosti (%ld)." #: src/language/stats/crosstabs.q:922 #, fuzzy #| msgid "Summary." msgid "Summary" msgstr "Povzetek." #: src/language/stats/crosstabs.q:935 #, fuzzy #| msgid "Crosstabs" msgid "Crosstabulation" msgstr "Kontingenčne tabele" #. TRANSLATORS: The %s here describes a crosstabulation. It takes the #. form "var1 * var2 * var3 * ...". #: src/language/stats/crosstabs.q:1013 #, c-format msgid "Crosstabulation %s contained no non-missing cases." msgstr "v kontingenčni tabeli %s ni ne-manjkajočih primerov." #: src/language/stats/crosstabs.q:1204 #, fuzzy #| msgid "Missing Values" msgid "Missing value" msgstr "Manjkajoče vrednosti" #: src/language/stats/crosstabs.q:1263 #, fuzzy #| msgid "row %" msgid "Row %" msgstr "vrstica %" #: src/language/stats/crosstabs.q:1264 #, fuzzy #| msgid "column %" msgid "Column %" msgstr "stolpec %" #: src/language/stats/crosstabs.q:1265 #, fuzzy #| msgid "total %" msgid "Total %" msgstr "skupno %" #: src/language/stats/crosstabs.q:1269 #, fuzzy #| msgid "Adjusted Std. Residual" msgid "Adjusted Residual" msgstr "Prilagojen std. ostanek" #: src/language/stats/crosstabs.q:1288 #, fuzzy #| msgid "Chi-Square Test" msgid "Chi-Square Tests" msgstr "Hi-kvadrat preizkus" #: src/language/stats/crosstabs.q:1294 msgid "Pearson Chi-Square" msgstr "Pearsonov Hi-kvadrat" #: src/language/stats/crosstabs.q:1295 msgid "Likelihood Ratio" msgstr "Razmerje verjetij" #: src/language/stats/crosstabs.q:1296 msgid "Fisher's Exact Test" msgstr "Fisherjev natančni test" #: src/language/stats/crosstabs.q:1297 msgid "Continuity Correction" msgstr "" #: src/language/stats/crosstabs.q:1298 #, fuzzy msgid "Linear-by-Linear Association" msgstr "Linearno po linearni povezav" #: src/language/stats/crosstabs.q:1299 src/language/stats/crosstabs.q:1345 #: src/language/stats/crosstabs.q:1854 msgid "N of Valid Cases" msgstr "N veljavnih primerov" #: src/language/stats/crosstabs.q:1305 #, fuzzy #| msgid "Asymp. Sig. (2-tailed)" msgid "Asymptotic Sig. (2-tailed)" msgstr "" "Asimp. stat. znač.\n" "(2-smerni test)" #: src/language/stats/crosstabs.q:1319 #, fuzzy #| msgid "Symmetric measures." msgid "Symmetric Measures" msgstr "Simetrične mere" #: src/language/stats/crosstabs.q:1324 src/language/stats/crosstabs.q:1364 #: src/language/stats/crosstabs.q:1411 #, fuzzy #| msgid "_Values" msgid "Values" msgstr "_Vrednosti" #: src/language/stats/crosstabs.q:1326 src/language/stats/crosstabs.q:1413 msgid "Asymp. Std. Error" msgstr "Asimp. SN" #: src/language/stats/crosstabs.q:1327 src/language/stats/crosstabs.q:1414 msgid "Approx. T" msgstr "Pribl. T" #: src/language/stats/crosstabs.q:1328 src/language/stats/crosstabs.q:1415 msgid "Approx. Sig." msgstr "Pribl. stat. zn." #: src/language/stats/crosstabs.q:1333 src/language/stats/crosstabs.q:1420 msgid "Nominal by Nominal" msgstr "Nominalna po nominalni" #: src/language/stats/crosstabs.q:1334 msgid "Cramer's V" msgstr "Cramerjev V" #: src/language/stats/crosstabs.q:1334 msgid "Contingency Coefficient" msgstr "Kontingenčni koeficient" #: src/language/stats/crosstabs.q:1336 src/language/stats/crosstabs.q:1425 msgid "Ordinal by Ordinal" msgstr "Ordinalna po ordinalni" #: src/language/stats/crosstabs.q:1337 msgid "Kendall's tau-b" msgstr "Kendallov tau-b" #: src/language/stats/crosstabs.q:1337 msgid "Kendall's tau-c" msgstr "Kendallov tau-c" #: src/language/stats/crosstabs.q:1338 msgid "Spearman Correlation" msgstr "Spearmanova korelacija" #: src/language/stats/crosstabs.q:1340 msgid "Interval by Interval" msgstr "Intervalna po intervalni" #: src/language/stats/crosstabs.q:1341 msgid "Pearson's R" msgstr "Pearsonov R" #: src/language/stats/crosstabs.q:1343 msgid "Measure of Agreement" msgstr "Mera skladnosti" #: src/language/stats/crosstabs.q:1359 #, fuzzy #| msgid "Risk estimate." msgid "Risk Estimate" msgstr "Ocena tveganja." #: src/language/stats/crosstabs.q:1368 #, fuzzy, no-c-format #| msgid "95%% Confidence Interval" msgid "95% Confidence Interval" msgstr "95%% interval zaupanja" #: src/language/stats/crosstabs.q:1389 msgid "Symmetric" msgstr "Simetrično" #: src/language/stats/crosstabs.q:1391 src/language/stats/crosstabs.q:1396 #, fuzzy, c-format msgid "%s Dependent" msgstr "%s Odvisna" #: src/language/stats/crosstabs.q:1406 #, fuzzy msgid "Directional Measures" msgstr "Merila usmeritve" #: src/language/stats/crosstabs.q:1422 msgid "Goodman and Kruskal tau" msgstr "Goodman-Kruskalov tau" #: src/language/stats/crosstabs.q:1423 msgid "Uncertainty Coefficient" msgstr "Koeficient negotovosti" #: src/language/stats/crosstabs.q:1426 msgid "Somers' d" msgstr "Somersov D" #: src/language/stats/crosstabs.q:1428 msgid "Nominal by Interval" msgstr "Nominalna po intervalni" #: src/language/stats/crosstabs.q:1826 #, fuzzy, c-format #| msgid "Odds Ratio for %s (%g / %g)" msgid "Odds Ratio for %s" msgstr "Razmerje verjetnosti za %s (%g / %g)" #: src/language/stats/crosstabs.q:1835 #, fuzzy, c-format #| msgid "For cohort %s = %.*g" msgid "For cohort %s = " msgstr "Za kohorto %s = %.*g" #: src/ui/gui/aggregate.ui:24 msgid "Aggregate Data" msgstr "Združevanje podatkov" #: src/ui/gui/aggregate.ui:126 msgid "_Break variable(s)" msgstr "_Razdelitvene spremenljivke" #: src/ui/gui/aggregate.ui:179 msgid "Variable Name: " msgstr "Ime spremenljivke: " #: src/ui/gui/aggregate.ui:215 msgid "Variable Label: " msgstr "Oznaka spremenljivke: " #: src/ui/gui/aggregate.ui:252 msgid "Function: " msgstr "Funkcija: " #: src/ui/gui/aggregate.ui:327 msgid "Argument 1: " msgstr "Argument 1: " #: src/ui/gui/aggregate.ui:364 msgid "Argument 2: " msgstr "Argument 2: " #: src/ui/gui/aggregate.ui:428 msgid "Aggregated variables" msgstr " Združene spremenljivke" #: src/ui/gui/aggregate.ui:469 msgid "_Add aggregated variables to the active dataset" msgstr "_Dodaj združene spremenljivke v podatkovno zbirko" #: src/ui/gui/aggregate.ui:486 msgid "_Replace the current dataset with the aggregated variables" msgstr "_Zamenjaj trenutno podatkovno zbirko z združenimi spremenljivkami" #: src/ui/gui/aggregate.ui:504 msgid "_Write a new data file containing only the aggregated variables" msgstr "_Zapiši novo podatkovno datoteko z le združenimi spremenljivkami" #: src/ui/gui/aggregate.ui:544 msgid "label" msgstr "oznaka" #: src/ui/gui/aggregate.ui:593 msgid "File is _already sorted on break variable(s)" msgstr "Datoteka je že _razvrščena po razdelitvenih spremenljivkah" #: src/ui/gui/aggregate.ui:609 msgid "Sort file before a_ggregating" msgstr "Razvrsti datoteke pred _združevanjem" #: src/ui/gui/aggregate.ui:630 msgid "Options for very large datasets" msgstr " Možnosti za zelo velike podatkovne zbirke " #: src/ui/gui/autorecode.ui:24 msgid "Automatic Recode" msgstr "Samodejno prekodiranje" #: src/ui/gui/autorecode.ui:120 msgid "Variable -> New Name" msgstr "Spremenljivka → Novo ime" #: src/ui/gui/autorecode.ui:145 msgid "_Lowest value" msgstr "_najnižjo vrednostjo" #: src/ui/gui/autorecode.ui:163 msgid "_Highest value" msgstr "_najvišjo vrednostjo" #: src/ui/gui/autorecode.ui:185 msgid "Recode starting from" msgstr "Prekodiraj, začenši z" #: src/ui/gui/autorecode.ui:204 msgid "_New Name" msgstr "_Novo ime" #: src/ui/gui/autorecode.ui:227 msgid "_Add New Name" msgstr "_Dodaj novo ime" #: src/ui/gui/autorecode.ui:285 msgid "_Use the same recoding scheme for all variables" msgstr "_Uporabi enako shemo prekodiranja za vse spremenljivke" #: src/ui/gui/autorecode.ui:301 msgid "Treat _blank string values as missing" msgstr "_Prazna polja obravnavaj kot manjkajoče vrednosti" #: src/ui/gui/binomial.ui:86 msgid "_Test Variable List:" msgstr "Seznam _preizkusnih spremenljivk" #: src/ui/gui/binomial.ui:160 src/ui/gui/chi-square.ui:281 msgid "_Get from data" msgstr "_Pridobi iz podatkov" #: src/ui/gui/binomial.ui:181 src/ui/gui/indep-samples.ui:150 msgid "_Cut point:" msgstr "Točka _prereza" #: src/ui/gui/binomial.ui:225 msgid "Define Dichotomy" msgstr "Določi dihotomnost" #: src/ui/gui/binomial.ui:245 msgid "Test _Proportion:" msgstr "Sorazmerni _delež:" #: src/ui/gui/compute.ui:32 msgid "Compute Variable: Type and Label" msgstr "Spremenljivka izračuna: vrsta in oznaka" #: src/ui/gui/compute.ui:67 msgid "Use _expression as label" msgstr "Uporabi _izraz kot oznako" #: src/ui/gui/compute.ui:90 msgid "_Label:" msgstr "_Oznaka:" #: src/ui/gui/compute.ui:194 msgid "_String" msgstr "_Niz znakov" #: src/ui/gui/compute.ui:287 msgid "_Numeric" msgstr "_Številska" #: src/ui/gui/compute.ui:343 msgid "Compute Variable" msgstr "Izračun spremenljivke" #: src/ui/gui/compute.ui:381 msgid "Target _Variable:" msgstr "_Ciljna spremenljivka" #: src/ui/gui/compute.ui:412 msgid "_Type & Label..." msgstr "_Vrsta in oznaka" #: src/ui/gui/compute.ui:469 msgid "=" msgstr "=" #: src/ui/gui/compute.ui:526 msgid "_Numeric Expressions:" msgstr "_Enačba za izračun" #: src/ui/gui/compute.ui:598 msgid "_Functions:" msgstr "_Funkcije:" #: src/ui/gui/compute.ui:678 msgid "_If..." msgstr "_Če ..." #: src/ui/gui/barchart.ui:24 msgid "Barchart" msgstr "Palčni diagram" #: src/ui/gui/barchart.ui:112 msgid "Category A_xis:" msgstr "Kategorija _osi:" #: src/ui/gui/barchart.ui:140 msgid "_N of cases" msgstr "_N primerov" #: src/ui/gui/barchart.ui:158 msgid "_Cum. n of cases" msgstr "Zbirni n primerov" #: src/ui/gui/barchart.ui:174 msgid "Other _summary function" msgstr "Druga funkcija _povzetka" #: src/ui/gui/barchart.ui:191 msgid "% of c_ases" msgstr "Celotni % primerov" #: src/ui/gui/barchart.ui:207 msgid "C_um. % of cases" msgstr "Združeni % primerov" #: src/ui/gui/barchart.ui:270 src/ui/gui/histogram.ui:100 msgid "_Variable:" msgstr "_Spremenljivka:" #: src/ui/gui/barchart.ui:308 msgid "Bars Represent" msgstr "Paličice predstavljajo" #: src/ui/gui/barchart.ui:340 msgid "Category C_luster:" msgstr "Gruča _kategorije:" #: src/ui/gui/correlation.ui:24 msgid "Bivariate Correlations" msgstr "Bivariatne analize" #: src/ui/gui/correlation.ui:148 msgid "Pearso_n" msgstr "Pearso_n" #: src/ui/gui/correlation.ui:164 msgid "_Kendall's tau-b" msgstr "_Kendallov tau-b" #: src/ui/gui/correlation.ui:180 msgid "_Spearman" msgstr "_Spearman" #: src/ui/gui/correlation.ui:200 msgid "Correlation Coefficients" msgstr "Korelacijski koeficienti" #: src/ui/gui/correlation.ui:224 msgid "_Two-tailed" msgstr "_Dvosmerni test" #: src/ui/gui/correlation.ui:241 msgid "One-tai_led" msgstr "_Enosmerni test" #: src/ui/gui/correlation.ui:262 msgid "Test of Significance" msgstr "Preizkus statistične značilnosti" #: src/ui/gui/correlation.ui:275 msgid "_Flag significant correlations" msgstr "_Označi statistično značilne korelacije" #: src/ui/gui/count.ui:24 msgid "Count Occurrences of Values within Cases" msgstr "Število pojavljanj vrednosti med primeri" #: src/ui/gui/count.ui:117 msgid "Numeric _Variables:" msgstr "Številske _spremenljivke:" #: src/ui/gui/count.ui:147 msgid "_Target Variable:" msgstr "_Ciljna spremenljivka:" #: src/ui/gui/count.ui:178 msgid "Target _Label:" msgstr "Ciljna _oznaka:" #: src/ui/gui/count.ui:192 msgid "_Define Values..." msgstr "_Določi vrednosti ..." #: src/ui/gui/count.ui:257 msgid "Count Values within Cases: Values to Count" msgstr "Preštej vrednosti znotraj primerov: vrednosti za štetje" #: src/ui/gui/count.ui:305 msgid "Values _to Count:" msgstr "Vrednosti _za štetje:" #: src/ui/gui/comments.ui:25 msgid "Data File Comments" msgstr "Opombe podatkovne datoteke" #: src/ui/gui/comments.ui:49 msgid "Comments:" msgstr "Opombe:" #: src/ui/gui/comments.ui:106 msgid "Display comments in output" msgstr "Pokaži opombe v odvodu analize" #: src/ui/gui/comments.ui:127 msgid "Column Number: 0" msgstr "Številka stolpca: 0" #: src/ui/gui/crosstabs.ui:25 msgid "Crosstabs: Cells" msgstr "Kontingenčne tabele: celice" #: src/ui/gui/crosstabs.ui:67 msgid "Cell Display" msgstr " Izbor celic" #: src/ui/gui/crosstabs.ui:99 msgid "Crosstabs" msgstr "Kontingenčne tabele" #: src/ui/gui/crosstabs.ui:150 msgid "_Rows" msgstr "_Vrstice" #: src/ui/gui/crosstabs.ui:195 msgid "_Columns" msgstr "_Stolpci" #: src/ui/gui/crosstabs.ui:242 msgid "_Format..." msgstr "_Zapis ..." #: src/ui/gui/crosstabs.ui:256 src/ui/gui/examine.ui:267 msgid "_Statistics..." msgstr "_Statistika ..." #: src/ui/gui/crosstabs.ui:270 msgid "Ce_lls..." msgstr "_Celice ..." #: src/ui/gui/crosstabs.ui:348 msgid "Crosstabs: Format" msgstr "Kontingenčne tabele: zapis" #: src/ui/gui/crosstabs.ui:371 msgid "Print tables" msgstr "Natisni razpredelnice" #: src/ui/gui/crosstabs.ui:387 msgid "Pivot" msgstr "Vrtilne razpredelnice" #: src/ui/gui/crosstabs.ui:403 src/ui/gui/sort.ui:157 msgid "Ascending" msgstr "Naraščajoče" #: src/ui/gui/crosstabs.ui:455 msgid "Crosstabs: Statistics" msgstr "Kontingenčne tabele: statistika" #: src/ui/gui/chi-square.ui:30 msgid "Chi-Square Test" msgstr "Hi-kvadrat preizkus" #: src/ui/gui/chi-square.ui:82 msgid "All categor_ies equal" msgstr "Vse kategorije so enake" #: src/ui/gui/chi-square.ui:103 msgid "_Values" msgstr "_Vrednosti" #: src/ui/gui/chi-square.ui:159 msgid "Expected Values:" msgstr "Pričakovane vrednosti" #: src/ui/gui/chi-square.ui:204 msgid "Test _Variables" msgstr "_Spremenljivke preizkusa" #: src/ui/gui/chi-square.ui:298 msgid "Use _specified range" msgstr "Uporabi _določen obseg" #: src/ui/gui/chi-square.ui:323 msgid "_Lower:" msgstr "_Spodnja meja:" #: src/ui/gui/chi-square.ui:337 msgid "_Upper:" msgstr "_Zgornja meja:" #: src/ui/gui/chi-square.ui:381 msgid "Expected Range:" msgstr "Pričakovan obseg:" #: src/ui/gui/descriptives.ui:131 src/ui/gui/factor.ui:797 #: src/ui/gui/recode.ui:638 msgid "_Variables:" msgstr "_Spremenljivke:" #: src/ui/gui/descriptives.ui:176 msgid "S_tatistics:" msgstr "S_tatistika:" #: src/ui/gui/descriptives.ui:230 msgid "_Exclude entire case if any selected variable is missing" msgstr "_Izloči celoten primer, če manjka katerakoli spremenljivka" #: src/ui/gui/descriptives.ui:247 msgid "_Include user-missing data in analysis" msgstr "Upoštevaj tudi _manjkajoče podatke" #: src/ui/gui/descriptives.ui:264 msgid "Save _Z-scores of selected variables as new variables" msgstr "" "Shrani standardno vrednost (_Z) izbranih spremenljivk kot nove spremenljivke" #: src/ui/gui/descriptives.ui:286 msgid "Options:" msgstr "Možnosti" #: src/ui/gui/examine.ui:25 msgid "Explore" msgstr "Razišči" #: src/ui/gui/examine.ui:69 msgid "_Label Cases by:" msgstr "_Označi primere s spremenljivko:" #: src/ui/gui/examine.ui:116 msgid "_Factor List:" msgstr "Seznam _faktorjev:" #: src/ui/gui/examine.ui:163 src/ui/gui/means.ui:126 msgid "_Dependent List:" msgstr "Seznam _odvisnih spremenljivk:" #: src/ui/gui/examine.ui:331 msgid "Explore: Options" msgstr "Razišči: možnosti" #: src/ui/gui/examine.ui:355 src/ui/gui/t-test.ui:81 msgid "Exclude cases _listwise" msgstr "Izloči nepopolne _primere" #: src/ui/gui/examine.ui:373 msgid "Exclude cases _pairwise" msgstr "Izloči nepopolne _pare" #: src/ui/gui/examine.ui:392 msgid "_Report values" msgstr "_Izpiši vrednosti" #: src/ui/gui/examine.ui:449 msgid "Explore: Statistics" msgstr "Razišči: statistika" #: src/ui/gui/examine.ui:468 src/ui/gui/oneway.ui:576 msgid "_Descriptives" msgstr "_Opisna statistika" #: src/ui/gui/examine.ui:485 msgid "_Extremes" msgstr "_Skrajne vrednosti" #: src/ui/gui/examine.ui:502 msgid "_Percentiles" msgstr "_Percentili" #: src/ui/gui/goto-case.ui:31 msgid "Goto Case" msgstr "Skok na primer" #: src/ui/gui/goto-case.ui:52 msgid "Goto Case Number:" msgstr " Skoči na primer številka:" #: src/ui/gui/factor.ui:39 msgid "Factor Analysis: Rotation" msgstr "Faktorska analiza: rotacija" #: src/ui/gui/factor.ui:70 msgid "_None" msgstr "_Brez rotacije" #: src/ui/gui/factor.ui:87 msgid "_Varimax" msgstr "_Varimax (variance uteži)" #: src/ui/gui/factor.ui:104 msgid "_Quartimax" msgstr "_Quartimax (faktorske uteži)" #: src/ui/gui/factor.ui:123 msgid "_Equimax" msgstr "_Equimax (poenostavitev)" #: src/ui/gui/factor.ui:146 msgid "Method" msgstr " Metoda " #: src/ui/gui/factor.ui:159 msgid "_Display rotated solution" msgstr "Pokaži _rotirano rešitev" #: src/ui/gui/factor.ui:181 src/ui/gui/factor.ui:582 msgid "Ma_ximum iterations for convergence:" msgstr "Zgornja _mejna ponovitev za konvergenco: " #: src/ui/gui/factor.ui:241 src/ui/gui/factor.ui:255 msgid "Principal Components Analysis" msgstr "Analiza glavnih komponent (PCA)" #: src/ui/gui/factor.ui:246 src/ui/gui/factor.ui:258 msgid "Principal Axis Factoring" msgstr "Metoda glavnih osi (PAF)" #: src/ui/gui/factor.ui:264 msgid "Factor Analysis: Extraction" msgstr "Faktorska analiza: ekstrakcija" #: src/ui/gui/factor.ui:290 msgid "_Method: " msgstr "_Metoda: " #: src/ui/gui/factor.ui:345 msgid "Co_rrelation matrix" msgstr "Ko_relacijska matrika" #: src/ui/gui/factor.ui:361 msgid "Co_variance matrix" msgstr "Matrika ko_varianc" #: src/ui/gui/factor.ui:382 msgid "Analyze" msgstr " Analiza " #: src/ui/gui/factor.ui:407 msgid "_Unrotated factor solution" msgstr "_Nerotirana faktorska rešitev" #: src/ui/gui/factor.ui:423 msgid "_Scree plot" msgstr "Diagram komponent (Scree plot)" #: src/ui/gui/factor.ui:443 src/ui/gui/histogram.ui:146 src/ui/gui/roc.ui:329 msgid "Display" msgstr "Prikaz *" #: src/ui/gui/factor.ui:526 msgid "_Number of factors:" msgstr "_Število faktorjev: " #: src/ui/gui/factor.ui:563 msgid "Extract" msgstr " Ekstrakcija " #: src/ui/gui/factor.ui:640 msgid "Factor Analysis" msgstr "Faktorska analiza" #: src/ui/gui/factor.ui:672 src/ui/gui/data-editor.ui:266 msgid "_Descriptives..." msgstr "_Opisne statistike ..." #: src/ui/gui/factor.ui:685 msgid "_Extraction..." msgstr "_Ekstrakcije ..." #: src/ui/gui/factor.ui:699 msgid "_Rotations..." msgstr "_Rotacije ..." #: src/ui/gui/find.ui:25 msgid "Find Case" msgstr "Poišči primer" #: src/ui/gui/find.ui:117 msgid "Variable:" msgstr "Spremenljivka:" #: src/ui/gui/find.ui:157 src/ui/gui/val-labs-dialog.ui:113 msgid "Value:" msgstr "Vrednost:" #: src/ui/gui/find.ui:180 msgid "Search value labels" msgstr "Išči med vrednostmi oznake" #: src/ui/gui/find.ui:210 msgid "Regular expression Match" msgstr "Upoštevaj logični izraz za iskanje" #: src/ui/gui/find.ui:227 msgid "Search substrings" msgstr "Išči med podrejenimi nizi" #: src/ui/gui/find.ui:244 msgid "Wrap around" msgstr "Prelomi besedilo zadetkov" #: src/ui/gui/find.ui:260 msgid "Search backward" msgstr "Išči v obratni smeri" #: src/ui/gui/frequencies.ui:32 msgid "Frequencies: Frequency Tables" msgstr "Frekvence: frekvenčne razpredelnice" #: src/ui/gui/frequencies.ui:67 msgid "_Always" msgstr "_Vedno" #: src/ui/gui/frequencies.ui:85 msgid "_Never" msgstr "_Nikoli" #: src/ui/gui/frequencies.ui:107 msgid "If no _more than " msgstr "Če ni _več kot" #: src/ui/gui/frequencies.ui:129 src/ui/gui/frequencies.ui:454 msgid "100" msgstr "100" #: src/ui/gui/frequencies.ui:145 msgid "values" msgstr "vrednosti " #: src/ui/gui/frequencies.ui:167 msgid "Display frequency tables" msgstr "Izriši frekvenčne razpredelnice" #: src/ui/gui/frequencies.ui:194 msgid "A_scending value" msgstr "naraščajoče po _vrednosti" #: src/ui/gui/frequencies.ui:212 msgid "D_escending value" msgstr "padajoče po _vrednost" #: src/ui/gui/frequencies.ui:230 msgid "Ascending _frequency" msgstr "naraščajoče po _frekvenci" #: src/ui/gui/frequencies.ui:248 msgid "Descending f_requency" msgstr "padajoče po _frekvenci" #: src/ui/gui/frequencies.ui:271 msgid "Order by" msgstr "Razvrsti" #: src/ui/gui/frequencies.ui:324 msgid "Frequencies: Charts" msgstr "Frekvence: diagrami" #: src/ui/gui/frequencies.ui:356 msgid "Scale:" msgstr "Merilo:" #: src/ui/gui/frequencies.ui:366 msgid "_Frequencies" msgstr "_Frekvence" #: src/ui/gui/frequencies.ui:383 msgid "_Percentages" msgstr "_Odstotki" #: src/ui/gui/frequencies.ui:407 msgid "Exclude values _below " msgstr "Izloči vrednosti _pod " #: src/ui/gui/frequencies.ui:422 msgid "Exclude values _above " msgstr "Izloči vrednosti _nad " #: src/ui/gui/frequencies.ui:441 src/ui/gui/reliability.ui:227 msgid "0" msgstr "0" #: src/ui/gui/frequencies.ui:469 msgid "Chart Formatting" msgstr " Oblikovanje diagrama " #: src/ui/gui/frequencies.ui:494 msgid "Draw _histograms" msgstr "Izriši _histograme" #: src/ui/gui/frequencies.ui:510 msgid "Superimpose _normal curve" msgstr "Nariši _krivuljo normale" #: src/ui/gui/frequencies.ui:530 msgid "Histograms" msgstr " Histogrami" #: src/ui/gui/frequencies.ui:555 msgid "Draw _bar charts" msgstr "Izriši _palčne diagrame" #: src/ui/gui/frequencies.ui:575 msgid "Bar Charts" msgstr " Palčni diagrami" #: src/ui/gui/frequencies.ui:600 msgid "Draw _pie charts" msgstr "Izriši _tortne diagrame" #: src/ui/gui/frequencies.ui:616 msgid "Include slices for _missing values" msgstr "Vključi rezine _manjkajočih vrednosti" #: src/ui/gui/frequencies.ui:636 msgid "Pie Charts" msgstr " Tortni diagrami" #: src/ui/gui/frequencies.ui:725 src/ui/gui/rank.ui:489 msgid "_Variable(s):" msgstr "_Spremenljivke:" #: src/ui/gui/frequencies.ui:769 msgid "_Statistics:" msgstr "_Statistika:" #: src/ui/gui/frequencies.ui:783 msgid "Include _missing values" msgstr "Vključi _manjkajoče vrednosti" #: src/ui/gui/frequencies.ui:806 msgid "Ch_arts..." msgstr "_Diagrami ..." #: src/ui/gui/frequencies.ui:821 msgid "Frequency _Tables..." msgstr "_Frekvenčne razpredelnice ..." #: src/ui/gui/histogram.ui:24 msgid "Histogram" msgstr "Histogram" #: src/ui/gui/histogram.ui:126 msgid "_Display normal curve" msgstr "_Izriši krivuljo normale" #: src/ui/gui/indep-samples.ui:25 src/ui/gui/k-independent.ui:35 msgid "Define Groups" msgstr "Določi skupine" #: src/ui/gui/indep-samples.ui:75 msgid "Group_2 value:" msgstr "Vrednost Skupine _2:" #: src/ui/gui/indep-samples.ui:89 msgid "Group_1 value:" msgstr "Vrednost Skupine _1:" #: src/ui/gui/indep-samples.ui:190 msgid "_Use specified values:" msgstr "_Uporabi določene vrednosti:" #: src/ui/gui/indep-samples.ui:259 msgid "Independent-Samples T Test" msgstr "T-test _neodvisnih vzorcev" #: src/ui/gui/indep-samples.ui:319 msgid "_Define Groups..." msgstr "_Določi skupine ..." #: src/ui/gui/indep-samples.ui:401 src/ui/gui/t-test.ui:211 msgid "_Test Variable(s):" msgstr "_Preizkusne spremenljivke:" #: src/ui/gui/indep-samples.ui:454 src/ui/gui/k-independent.ui:165 msgid "_Grouping Variable:" msgstr "Spremenljivka skupin:" #: src/ui/gui/k-independent.ui:63 msgid "_Upper limit:" msgstr "_Zgornja meja:" #: src/ui/gui/k-independent.ui:77 msgid "_Lower limit:" msgstr "_Spodnja meja:" #: src/ui/gui/k-independent.ui:136 msgid "Tests for Several Independent Samples" msgstr "Preizkus več neodvisnih vzorcev" #: src/ui/gui/k-independent.ui:208 src/ui/gui/ks-one-sample.ui:131 msgid "Test _Variable List:" msgstr "Seznam _spremenljivk:" #: src/ui/gui/k-independent.ui:320 msgid "_Define Groups" msgstr "Določi _skupine" #: src/ui/gui/k-independent.ui:365 msgid "_Kruskal-Wallis H" msgstr "_Kruskal-Wallisov H" #: src/ui/gui/k-independent.ui:382 src/ui/gui/runs.ui:140 msgid "_Median" msgstr "_Mediana" #: src/ui/gui/k-means.ui:24 msgid "K-Means Cluster Analysis" msgstr "Analiza voditeljev gruče (K-Means)" #: src/ui/gui/k-means.ui:122 msgid "N_umber of Clusters: " msgstr "Š_tevilo gruč:" #: src/ui/gui/k-related.ui:24 msgid "Tests for Several Related Samples" msgstr "Preizkusi za več povezanih vzorcev" #: src/ui/gui/k-related.ui:113 msgid "_Test Variables:" msgstr "_Preizkusne spremenljivke:" #: src/ui/gui/k-related.ui:145 msgid "_Friedman" msgstr "_Friedmanov test" #: src/ui/gui/k-related.ui:161 msgid "_Kendall's W" msgstr "_Kendallov W-test" #: src/ui/gui/k-related.ui:177 msgid "_Cochran's Q" msgstr "_Cochranov Q-test" #: src/ui/gui/ks-one-sample.ui:163 msgid "_Normal" msgstr "_Normalna" #: src/ui/gui/ks-one-sample.ui:181 msgid "_Poisson" msgstr "_Poissonova" #: src/ui/gui/ks-one-sample.ui:198 msgid "_Uniform" msgstr "_Enakomerna" #: src/ui/gui/ks-one-sample.ui:213 msgid "_Exponential" msgstr "_Eksponentna" #: src/ui/gui/ks-one-sample.ui:232 msgid "Test Distribution" msgstr "Predvidena porazdelitev" #: src/ui/gui/logistic.ui:42 msgid "Logistic Regression: Options" msgstr "Logistična regresija: možnosti" #: src/ui/gui/logistic.ui:66 msgid "CI for _exp(B): " msgstr "Interval zaupanja za _exp(B): " #: src/ui/gui/logistic.ui:97 msgid "%" msgstr "%" #: src/ui/gui/logistic.ui:146 msgid "Classification cu_toff: " msgstr "Klasifikacijska točka _prereza: " #: src/ui/gui/logistic.ui:159 msgid "_Maximum Iterations: " msgstr "_Največje število ponovitev: " #: src/ui/gui/logistic.ui:177 msgid "Include _constant in model" msgstr "V model vključi _konstanto" #: src/ui/gui/logistic.ui:219 msgid "Logistic Regression" msgstr "Logistična regresija" #: src/ui/gui/logistic.ui:364 src/ui/gui/regression.ui:185 msgid "_Dependent" msgstr "_Odvisna" #: src/ui/gui/logistic.ui:412 src/ui/gui/regression.ui:232 msgid "_Independent" msgstr "_Neodvisna" #: src/ui/gui/means.ui:25 msgid "Means" msgstr "Srednje vrednosti" #: src/ui/gui/means.ui:179 msgid "_Independent List:" msgstr "_Seznam neodvisnih spremenljivk:" #: src/ui/gui/missing-val-dialog.ui:48 msgid "_No missing values" msgstr "_Ni manjkajočih vrednosti" #: src/ui/gui/missing-val-dialog.ui:136 msgid "_Discrete missing values" msgstr "_Diskretne manjkajoče vrednosti" #: src/ui/gui/missing-val-dialog.ui:172 msgid "_Low:" msgstr "_Najnižja:" #: src/ui/gui/missing-val-dialog.ui:197 msgid "_High:" msgstr "N_ajvišja:" #: src/ui/gui/missing-val-dialog.ui:221 msgid "Di_screte value:" msgstr "Di_skretna vrednost:" #: src/ui/gui/missing-val-dialog.ui:245 msgid "_Range plus one optional discrete missing value" msgstr "_Obseg in ena izbirna diskretna manjkajoča vrednost" #: src/ui/gui/oneway.ui:25 msgid "One-Way ANOVA: Contrasts" msgstr "Enosmerna ANOVA: kontrasti" #: src/ui/gui/oneway.ui:107 msgid "_Coefficients:" msgstr "_Koeficienti:" #: src/ui/gui/oneway.ui:161 msgid "Coefficient Total: " msgstr "Skupaj koeficienti: " #: src/ui/gui/oneway.ui:198 msgid "Contrast 1 of 1" msgstr "Kontrast 1 od 1" #: src/ui/gui/oneway.ui:234 #, fuzzy #| msgid "One-Way ANOVA: Contrasts" msgid "One-Way ANOVA: Post-Hoc" msgstr "Enosmerna ANOVA: kontrasti" #: src/ui/gui/oneway.ui:270 #, fuzzy #| msgid "Games-Howell" msgid "Games Howell" msgstr "Games-Howell" #: src/ui/gui/oneway.ui:287 msgid "Fisher's LSD" msgstr "" #: src/ui/gui/oneway.ui:379 msgid "One-Way ANOVA" msgstr "Enosmerna ANOVA" #: src/ui/gui/oneway.ui:408 msgid "_Factor:" msgstr "_Faktor:" #: src/ui/gui/oneway.ui:451 msgid "Dependent _Variable(s):" msgstr "Od_visne spremenljivke:" #: src/ui/gui/oneway.ui:593 msgid "_Homogeneity" msgstr "_Homogenost" #: src/ui/gui/oneway.ui:637 msgid "Post-Hoc..." msgstr "" #: src/ui/gui/oneway.ui:652 msgid "_Contrasts..." msgstr "_Kontrasti ..." #: src/ui/gui/options.ui:25 msgid "Options Case" msgstr "Možnosti" #: src/ui/gui/options.ui:55 msgid "Display _Labels" msgstr "Pokaži _oznake spremenljivk" #: src/ui/gui/options.ui:71 msgid "Display _Names" msgstr "Pokaži _imena spremenljivk" #: src/ui/gui/options.ui:99 msgid "Sort by L_abel" msgstr "Razvrščaj po o_znaki" #: src/ui/gui/options.ui:115 msgid "Sort by Na_me" msgstr "Razvrščaj po i_menu" #: src/ui/gui/options.ui:131 msgid "Do not S_ort" msgstr "_Ne razvrščaj" #: src/ui/gui/options.ui:159 msgid "Variable Lists" msgstr "Seznami spremenljivk" #: src/ui/gui/options.ui:184 msgid "Ma_ximize" msgstr "_Razpni na zaslon" #: src/ui/gui/options.ui:199 msgid "_Raise" msgstr "_Postavi v ospredje" #: src/ui/gui/options.ui:214 msgid "Aler_t" msgstr "Pokaži _obvestilo" #: src/ui/gui/options.ui:233 msgid "Output Window Action" msgstr "Okno odvoda analize" #: src/ui/gui/paired-samples.ui:147 msgid "_Test Pair(s):" msgstr "Preizkusni pari:" #: src/ui/gui/rank.ui:30 msgid "Rank Cases: Types" msgstr "Rangiranje primerov: vrste" #: src/ui/gui/rank.ui:57 msgid "Sum of case _weights" msgstr "Vsota _uteži primerov" #: src/ui/gui/rank.ui:74 #, fuzzy msgid "Fractional rank as _%" msgstr "Delež ranga kot _%" #: src/ui/gui/rank.ui:92 #, fuzzy msgid "_Fractional rank" msgstr "_Delež ranga" #: src/ui/gui/rank.ui:109 msgid "_Savage score" msgstr "_Savage *" #: src/ui/gui/rank.ui:125 msgid "_Rank" msgstr "_Rang" #: src/ui/gui/rank.ui:147 msgid "N_tiles" msgstr "N_tili" #: src/ui/gui/rank.ui:195 msgid "_Proportion Estimates" msgstr "Ocenjevanje _sorazmernosti" #: src/ui/gui/rank.ui:213 msgid "_Normal Scores" msgstr "_Točke normale" #: src/ui/gui/rank.ui:251 msgid "_Blom" msgstr "_Blom *" #: src/ui/gui/rank.ui:269 msgid "Tuke_y" msgstr "Tuke_yev test" #: src/ui/gui/rank.ui:287 msgid "Ran_kit" msgstr "Ran_kit" #: src/ui/gui/rank.ui:305 msgid "_Van der Waerden" msgstr "_Van der Waerdenova števila" #: src/ui/gui/rank.ui:328 msgid "Proportion Estimation Formula" msgstr "Formula ocenjevanja sorazmernosti" #: src/ui/gui/rank.ui:369 msgid "Rank Cases" msgstr "Rangiranje primerov" #: src/ui/gui/rank.ui:434 msgid "_By:" msgstr "_Po:" #: src/ui/gui/rank.ui:595 msgid "_Smallest Value" msgstr "Naj_manjša vrednost" #: src/ui/gui/rank.ui:613 msgid "_Largest Value" msgstr "Naj_večja vrednost" #: src/ui/gui/rank.ui:637 msgid "Assign rank 1 to:" msgstr "Dodeli rang 1 za:" #: src/ui/gui/rank.ui:656 msgid "_Display summary tables" msgstr "Pokaži razpredelnice _povzetkov" #: src/ui/gui/rank.ui:679 msgid "Rank T_ypes" msgstr "Vrste _rangov" #: src/ui/gui/rank.ui:694 msgid "_Ties..." msgstr "_Vezi ..." #: src/ui/gui/rank.ui:756 msgid "Rank Cases: Ties" msgstr "Rangiranje primerov: vezi" #: src/ui/gui/rank.ui:788 msgid "_Mean" msgstr "_Povprečje" #: src/ui/gui/rank.ui:806 msgid "_Low" msgstr "_Nizka" #: src/ui/gui/rank.ui:825 msgid "_High" msgstr "_Visoka" #: src/ui/gui/rank.ui:851 msgid "_Sequential ranks to unique values" msgstr "" #: src/ui/gui/rank.ui:875 msgid "Rank Assigned to Ties" msgstr "Rang, dodeljen vezem" #: src/ui/gui/runs.ui:155 msgid "M_ean" msgstr "_Povprečje" #: src/ui/gui/runs.ui:171 msgid "Mo_de" msgstr "Modu_s" #: src/ui/gui/runs.ui:191 msgid "_Custom:" msgstr "_Po meri:" #: src/ui/gui/runs.ui:230 msgid "Cut Point" msgstr "Točka prereza" #: src/ui/gui/sort.ui:25 msgid "Sort Cases" msgstr "Razvrsti primere" #: src/ui/gui/sort.ui:101 msgid "Sort by:" msgstr "Razvrsti po:" #: src/ui/gui/sort.ui:174 msgid "Descending" msgstr "Padajoče" #: src/ui/gui/sort.ui:196 msgid "Sort Order" msgstr "Vrstni red" #: src/ui/gui/split-file.ui:25 msgid "Split File" msgstr "Razdeli datoteko" #: src/ui/gui/split-file.ui:103 msgid "Anal_yze all cases. Do not create groups." msgstr "_Analiziraj vse primere in ne ustvari skupin" #: src/ui/gui/split-file.ui:121 msgid "Compare _groups." msgstr "Primerjaj _skupine" #: src/ui/gui/split-file.ui:140 msgid "Organize ou_tput by groups." msgstr "Uredi _odvod po skupinah" #: src/ui/gui/split-file.ui:225 msgid "Groups _based on:" msgstr "Skupine, ki _temeljijo na:" #: src/ui/gui/split-file.ui:255 msgid "_Sort the file by grouping variables." msgstr "_Razvrsti datoteko s skupinjenjem spremenljivk" #: src/ui/gui/split-file.ui:273 msgid "_File is already sorted." msgstr "Datoteka je že _razvrščena" #: src/ui/gui/split-file.ui:334 msgid "Current Status : " msgstr "Trenutno stanje : " #: src/ui/gui/split-file.ui:348 msgid "Analysis by groups is off" msgstr "analiza po skupinah je izključena" #: src/ui/gui/recode.ui:135 msgid "System _Missing" msgstr "_Sistemske manjkajoče" #: src/ui/gui/recode.ui:150 msgid "Co_py old values" msgstr "Ko_piraj stare vrednosti" #: src/ui/gui/recode.ui:172 msgid "Va_lue: " msgstr "_Vrednost: " #: src/ui/gui/recode.ui:276 msgid "Conver_t numeric strings to numbers (`5' -> 5)" msgstr "_Pretvori številski niz v številko ('5 → 5)" #: src/ui/gui/recode.ui:297 msgid "Output variables are _strings" msgstr "Prekodiraj v _nize" #: src/ui/gui/recode.ui:318 msgid "Width: " msgstr "Širina: " #: src/ui/gui/recode.ui:499 msgid "_Name:" msgstr "_Ime:" #: src/ui/gui/recode.ui:527 msgid "La_bel:" msgstr "_Oznaka:" #: src/ui/gui/recode.ui:556 msgid "Chan_ge" msgstr "_Spremeni" #: src/ui/gui/recode.ui:584 msgid "Output Variable" msgstr "Izhodna spremenljivka" #: src/ui/gui/recode.ui:658 msgid "Old and New Va_lues..." msgstr "Stare in nove _vrednosti ..." #: src/ui/gui/regression.ui:51 msgid "S_tatistics..." msgstr "S_tatistika ..." #: src/ui/gui/regression.ui:272 msgid "Regression: Save" msgstr "Regresija: shrani" #: src/ui/gui/regression.ui:290 src/ui/gui/univariate.ui:42 msgid "_Predicted values" msgstr "_Napovedane vrednosti" #: src/ui/gui/regression.ui:307 src/ui/gui/univariate.ui:59 msgid "_Residuals" msgstr "_Ostanki" #: src/ui/gui/regression.ui:351 msgid "Regression: Statistics" msgstr "Regresija: statistika" #: src/ui/gui/regression.ui:393 src/ui/gui/univariate.ui:143 msgid "S_tatistics" msgstr "S_tatistika" #: src/ui/gui/reliability.ui:34 msgid "Alpha" msgstr "Alfa" #: src/ui/gui/reliability.ui:43 msgid "Reliability Analysis" msgstr "Analiza zanesljivosti" #: src/ui/gui/reliability.ui:144 msgid "_Items:" msgstr "_Postavke:" #: src/ui/gui/reliability.ui:166 msgid "_Model: " msgstr "_Model: " #: src/ui/gui/reliability.ui:212 msgid "_Variables in first split:" msgstr "_Spremenljivke prvega razdelka" #: src/ui/gui/reliability.ui:259 msgid "Show _descriptives for scale if item is deleted" msgstr "Izpiši _opisno statistiko, če je postavka izbrisana" #: src/ui/gui/roc.ui:145 msgid "_Test Variable:" msgstr "_Preizkusna spremenljivka:" #: src/ui/gui/roc.ui:175 msgid "_State Variable:" msgstr "Spremenljivka _stanja:" #: src/ui/gui/roc.ui:202 msgid "_Value of state variable:" msgstr "_Vrednost spremenljivke stanja:" #: src/ui/gui/roc.ui:249 msgid "ROC C_urve" msgstr "Kriv_ulja ROC" #: src/ui/gui/roc.ui:269 msgid "_With diagonal reference line" msgstr "_Izriši referenčno diagonalo" #: src/ui/gui/roc.ui:293 msgid "Standard _Error and Confidence Interval" msgstr "Standardna napaka in interval zaupanja" #: src/ui/gui/roc.ui:309 msgid "_Coordinate points of the ROC Curve" msgstr "_Koordinatne točke krivulje ROC" #: src/ui/gui/scatterplot.ui:25 msgid "Scatterplot" msgstr "Raztreseni diagram" #: src/ui/gui/scatterplot.ui:56 msgid "_X Axis:" msgstr "Os _X diagrama:" #: src/ui/gui/scatterplot.ui:100 msgid "_Y Axis:" msgstr "Os _Y diagrama:" #: src/ui/gui/select-cases.ui:37 msgid "Select Cases: Range" msgstr "Izbor primerov: obseg" #: src/ui/gui/select-cases.ui:87 msgid "First case" msgstr "začetni primer" #: src/ui/gui/select-cases.ui:99 msgid "Last case" msgstr "končni primer" #: src/ui/gui/select-cases.ui:111 msgid "Observation" msgstr "Opazovani" #: src/ui/gui/select-cases.ui:161 msgid "Select Cases" msgstr "Izbor primerov" #: src/ui/gui/select-cases.ui:313 msgid "Use filter variable" msgstr "Uporabi spremenljivko kot filter" #: src/ui/gui/select-cases.ui:380 msgid "Based on time or case range" msgstr "Na osnovi časa ali obsega primerov" #: src/ui/gui/select-cases.ui:395 msgid "Range..." msgstr "Obseg ..." #: src/ui/gui/select-cases.ui:444 msgid "Random sample of cases" msgstr "Naključni vzorec primerov" #: src/ui/gui/select-cases.ui:460 msgid "Sample..." msgstr "Vzorec ..." #: src/ui/gui/select-cases.ui:508 msgid "If condition is satisfied" msgstr "Če je zadoščeno pogoju" #: src/ui/gui/select-cases.ui:523 msgid "If..." msgstr "Če ..." #: src/ui/gui/select-cases.ui:567 msgid "All Cases" msgstr "Vsi primeri" #: src/ui/gui/select-cases.ui:581 msgid "Select" msgstr "Izbor" #: src/ui/gui/select-cases.ui:608 msgid "Filtered" msgstr "naj bodo filtrirani" #: src/ui/gui/select-cases.ui:625 msgid "Deleted" msgstr "naj bodo izbrisani" #: src/ui/gui/select-cases.ui:647 msgid "Unselected Cases Are" msgstr "Neizbrani primeri" #: src/ui/gui/select-cases.ui:694 msgid "Select Cases: Random Sample" msgstr "Izbor enot: naključni vzorec" #: src/ui/gui/select-cases.ui:756 msgid "Sample Size" msgstr "Velikost vzorca" #: src/ui/gui/t-test.ui:25 msgid "Options" msgstr "Možnosti" #: src/ui/gui/t-test.ui:63 msgid "Exclude cases _analysis by analysis" msgstr "Izloči primere _analizo po analizo" #: src/ui/gui/t-test.ui:148 msgid "One - Sample T Test" msgstr "T-test enega vzorca" #: src/ui/gui/t-test.ui:265 msgid "Test _Value: " msgstr "Preizkusna _vrednost: " #: src/ui/gui/text-data-import.ui:32 msgid "Select the first line of the data file that contains data." msgstr "" "Izberite prvo vrstico v podatkovni datoteki, ki vsebuje podatke primera." #: src/ui/gui/text-data-import.ui:54 msgid "Line above selected line contains variable names" msgstr "Vrstica nad izbrano vrstico vsebuje imena spremenljivk" #: src/ui/gui/text-data-import.ui:80 msgid "" "Check the data formats displayed below and fix any that are incorrect. You " "may set other variable properties now or later." msgstr "" "Lastnosti podatkov in spremenljivk je mogoče pred uvozom prilagoditi, " "spreminjanje nastavitev je mogoče narediti tudi kasneje." #: src/ui/gui/text-data-import.ui:121 msgid "Variables" msgstr "Spremenljivke" #: src/ui/gui/text-data-import.ui:152 msgid "Data Preview" msgstr "Predogled podatkov" #: src/ui/gui/text-data-import.ui:181 msgid "" "This assistant will guide you through the process of importing data into " "PSPP from a text file with one line per case, in which fields are separated " "by tabs, commas, or other delimiters.\n" "\n" "\tThe selected file contains N lines of text. Only the first M of these " "will be shown for preview purposes in the following screens. You may choose " "below how much of the file should actually be imported." msgstr "" "Pomočnik olajša postopek uvažanja podatkov v program PSPP. Podatki " "posameznega primera morajo biti zbrani v vrstici, polja pa morajo biti " "ločena z vejico, tabulatorjem oziroma drugim ločilnikom.\n" "\n" "\tV izbrani datoteki je N vrstic besedila. Prvih M vrstic bo pokazanih kot " "predogled podatkov. Spodnje izbire omogočajo določitev količine uvoženih " "podatkov." #: src/ui/gui/text-data-import.ui:252 msgid "All cases" msgstr "Uvozi vse primere" #: src/ui/gui/text-data-import.ui:272 msgid "Amount to Import" msgstr " Število podatkov za uvoz" #: src/ui/gui/text-data-import.ui:325 msgid "C_ustom" msgstr "Po _meri" #: src/ui/gui/text-data-import.ui:341 msgid "Slas_h (/)" msgstr "Po_ševnica ( / )" #: src/ui/gui/text-data-import.ui:357 msgid "Semicolo_n (;)" msgstr "Pod_pičje ( ; )" #: src/ui/gui/text-data-import.ui:373 msgid "P_ipe (|)" msgstr "_Cev ( | )" #: src/ui/gui/text-data-import.ui:389 msgid "H_yphen (-)" msgstr "_Vezaj ( - )" #: src/ui/gui/text-data-import.ui:405 msgid "Co_mma (,)" msgstr "_Vejica ( , )" #: src/ui/gui/text-data-import.ui:421 msgid "_Colon (:)" msgstr "_Dvopičje ( : )" #: src/ui/gui/text-data-import.ui:437 msgid "Ban_g (!)" msgstr "_Klicaj ( ! )" #: src/ui/gui/text-data-import.ui:453 msgid "Ta_b" msgstr "_Tabulator" #: src/ui/gui/text-data-import.ui:469 msgid "_Space" msgstr "_Presledek" #: src/ui/gui/text-data-import.ui:490 msgid "Separators" msgstr "Ločilniki" #: src/ui/gui/text-data-import.ui:541 msgid "Quote separator characters with" msgstr "Navedi znak ločilnika z" #: src/ui/gui/text-data-import.ui:561 msgid "Quoting" msgstr "Navajanje" #: src/ui/gui/text-data-import.ui:599 msgid "Fields Preview" msgstr "Predogled polj" #: src/ui/gui/text-data-import.ui:622 msgid "" "Enter below the sheet number and the cell range which you wish to import." msgstr "" "Vpisati je treba številko delovnega lista preglednice in obseg celic, ki " "vsebujejo podatke za uvoz." #: src/ui/gui/text-data-import.ui:670 msgid "_Cells: " msgstr "_Celice: " #: src/ui/gui/text-data-import.ui:684 msgid "_Sheet Index: " msgstr "_Številka delovnega lista preglednice: " #: src/ui/gui/text-data-import.ui:695 msgid "Use first row as _variable names" msgstr "Uporabi prvo vrstico kot _imena spremenljivk" #: src/ui/gui/text-data-import.ui:717 msgid "Cells to Import" msgstr "Celice za uvoz" #: src/ui/gui/transpose.ui:24 msgid "Transpose" msgstr "Transponiraj" #: src/ui/gui/transpose.ui:91 msgid "Name Variable:" msgstr "Ime spremenljivke:" #: src/ui/gui/transpose.ui:127 msgid "Variable(s):" msgstr "Spremenljivke:" #: src/ui/gui/univariate.ui:25 msgid "Univariate: Save" msgstr "Univariatna analiza: Shrani" #: src/ui/gui/univariate.ui:103 msgid "Univariate: Statistics" msgstr "Univariatna analiza: statistika" #: src/ui/gui/univariate.ui:178 msgid "Univariate" msgstr "Univariatna analiza" #: src/ui/gui/univariate.ui:281 msgid "_Dependent Variable" msgstr "_Odvisna spremenljivka" #: src/ui/gui/univariate.ui:329 msgid "_Fixed Factors" msgstr "_Določeni faktorji" #: src/ui/gui/val-labs-dialog.ui:101 msgid "Value Label:" msgstr "Oznaka vrednosti:" #: src/ui/gui/data-editor.ui:33 msgid "Information Area" msgstr "Polje podrobnosti" #: src/ui/gui/data-editor.ui:55 msgid "Case Counter Area" msgstr "Polje števca primerov" #: src/ui/gui/data-editor.ui:80 msgid "Filter Use Status Area" msgstr "Polje stanja uporabe filtrov" #: src/ui/gui/data-editor.ui:106 msgid "Weight Status Area" msgstr "Polje stanja uteževanja" #: src/ui/gui/data-editor.ui:132 msgid "Split File Status Area" msgstr "Polje stanja razdelitve datoteke" #: src/ui/gui/data-editor.ui:154 msgid "_View" msgstr "_Pogled" #: src/ui/gui/data-editor.ui:157 msgid "_Status Bar" msgstr "Pokaži vrstico _stanja" #: src/ui/gui/data-editor.ui:163 msgid "_Font..." msgstr "Izbor _pisave ..." #: src/ui/gui/data-editor.ui:167 msgid "_Grid Lines" msgstr "Izriši črte _razpredelnice" #: src/ui/gui/data-editor.ui:171 msgid "Value _Labels" msgstr "Pokaži _oznake vrednosti" #: src/ui/gui/data-editor.ui:182 msgid "_Variables" msgstr "_Spremenljivke" #: src/ui/gui/data-editor.ui:192 msgid "_Sort Cases..." msgstr "_Razvrščanje ..." #: src/ui/gui/data-editor.ui:196 msgid "_Transpose..." msgstr "_Transponiranje ..." #: src/ui/gui/data-editor.ui:200 msgid "_Aggregate..." msgstr "_Združevanje ..." #: src/ui/gui/data-editor.ui:206 msgid "S_plit File..." msgstr "_Razdeli datoteko ..." #: src/ui/gui/data-editor.ui:210 msgid "Select _Cases..." msgstr "Izbor _primerov ..." #: src/ui/gui/data-editor.ui:214 msgid "_Weight Cases..." msgstr "_Uteževanje primerov ..." #: src/ui/gui/data-editor.ui:220 msgid "_Transform" msgstr "_Preoblikovanje" #: src/ui/gui/data-editor.ui:223 msgid "_Compute..." msgstr "_Preračunavanje ..." #: src/ui/gui/data-editor.ui:227 msgid "Cou_nt..." msgstr "_Preštevanje ..." #: src/ui/gui/data-editor.ui:231 msgid "Ran_k Cases..." msgstr "Ran_giranje primerov ..." #: src/ui/gui/data-editor.ui:235 msgid "Auto_matic Recode..." msgstr "_Samodejno prekodiranje ..." #: src/ui/gui/data-editor.ui:241 msgid "Recode into _Same Variables..." msgstr "Prekodiranje v _iste spremenljivke ..." #: src/ui/gui/data-editor.ui:245 msgid "Recode into _Different Variables..." msgstr "Prekodiranje v _nove spremenljivke ..." #: src/ui/gui/data-editor.ui:251 msgid "_Run Pending Transforms" msgstr "_Izvedi pripravljena preoblikovanja" #: src/ui/gui/data-editor.ui:257 msgid "_Analyze" msgstr "_Analiza" #: src/ui/gui/data-editor.ui:260 msgid "_Descriptive Statistics" msgstr "_Opisna statistika" #: src/ui/gui/data-editor.ui:262 msgid "_Frequencies..." msgstr "_Frekvence ..." #: src/ui/gui/data-editor.ui:270 msgid "_Explore..." msgstr "_Razišči ..." #: src/ui/gui/data-editor.ui:274 msgid "_Crosstabs..." msgstr "_Kontingenčne tabele ..." #: src/ui/gui/data-editor.ui:279 msgid "Compare _Means" msgstr "Primerjava _srednjih vrednosti" #: src/ui/gui/data-editor.ui:281 msgid "_Means..." msgstr "_Srednje vrednosti ..." #: src/ui/gui/data-editor.ui:285 msgid "_One Sample T Test..." msgstr "T-test _enega vzorca ..." #: src/ui/gui/data-editor.ui:289 msgid "_Independent Samples T Test..." msgstr "T-test _neodvisnih vzorcev ..." #: src/ui/gui/data-editor.ui:293 msgid "_Paired Samples T Test..." msgstr "T-test _odvisnih parov vzorcev ..." #: src/ui/gui/data-editor.ui:297 msgid "One Way _ANOVA..." msgstr "Enosmerna _ANOVA ..." #: src/ui/gui/data-editor.ui:302 msgid "_Univariate Analysis..." msgstr "_Univariatna analiza ..." #: src/ui/gui/data-editor.ui:306 msgid "Bivariate _Correlation..." msgstr "Bivariatna _korelacija ..." #: src/ui/gui/data-editor.ui:310 msgid "_K-Means Cluster..." msgstr "Analiza _voditeljev gruče ..." #: src/ui/gui/data-editor.ui:314 msgid "_Factor Analysis..." msgstr "Faktorska _analiza ..." #: src/ui/gui/data-editor.ui:318 msgid "Re_liability..." msgstr "_Zanesljivost ..." #: src/ui/gui/data-editor.ui:322 msgid "_Regression" msgstr "_Regresija" #: src/ui/gui/data-editor.ui:325 msgid "_Linear..." msgstr "_Linearna ..." #: src/ui/gui/data-editor.ui:329 msgid "_Binary Logistic..." msgstr "_Binarna logistična ..." #: src/ui/gui/data-editor.ui:335 msgid "_Non-Parametric Statistics" msgstr "_Neparametrična statistika" #: src/ui/gui/data-editor.ui:338 msgid "_Chi Square..." msgstr "_Hi-kvadrat ..." #: src/ui/gui/data-editor.ui:342 msgid "_Binomial..." msgstr "_Binomska statistika ..." #: src/ui/gui/data-editor.ui:346 msgid "_Runs..." msgstr "Število _sekvenc ..." #: src/ui/gui/data-editor.ui:350 msgid "_1 Sample K-S..." msgstr "_1 vzorec K–S ..." #: src/ui/gui/data-editor.ui:354 msgid "_2 Related Samples..." msgstr "2 povezana vzorca ..." #: src/ui/gui/data-editor.ui:358 msgid "_K Related Samples..." msgstr "K _povezanih vzorcev ..." #: src/ui/gui/data-editor.ui:362 msgid "K _Independent Samples..." msgstr "K _neodvisnih vzorcev ..." #: src/ui/gui/data-editor.ui:368 msgid "ROC Cur_ve..." msgstr "Kri_vulja ROC ..." #: src/ui/gui/data-editor.ui:374 msgid "_Graphs" msgstr "_Grafi" #: src/ui/gui/data-editor.ui:377 msgid "_Scatterplot" msgstr "_Raztreseni diagram" #: src/ui/gui/data-editor.ui:381 msgid "_Histogram" msgstr "_Histogram" #: src/ui/gui/data-editor.ui:385 msgid "_Barchart" msgstr "_Palčni diagram" #: src/ui/gui/data-editor.ui:391 msgid "_Utilities" msgstr "_Orodja" #: src/ui/gui/data-editor.ui:394 msgid "_Variables..." msgstr "_Seznam spremenljivk ..." #: src/ui/gui/data-editor.ui:398 msgid "Data File _Comments..." msgstr "Opombe k _podatkovni datoteki ..." #: src/ui/gui/output-window.ui:71 msgid "_Print..." msgstr "_Natisni ..." #: src/ui/gui/output-window.ui:76 msgid "_Export..." msgstr "Iz_vozi ..." #: src/ui/gui/output-window.ui:92 msgid "Select _All" msgstr "Izberi _vse" #: src/ui/gui/syntax-editor.ui:27 msgid "Syntax" msgstr "Skladnja" #: src/ui/gui/syntax-editor.ui:31 msgid "Data" msgstr "_Podatki +" #: src/ui/gui/syntax-editor.ui:41 msgid "_Save" msgstr "_Shrani" #: src/ui/gui/syntax-editor.ui:46 msgid "Save _As" msgstr "Shrani _kot" #: src/ui/gui/syntax-editor.ui:53 msgid "_Print" msgstr "_Natisni" #: src/ui/gui/syntax-editor.ui:84 msgid "_Delete" msgstr "_Izbriši" #: src/ui/gui/syntax-editor.ui:90 msgid "_Undo" msgstr "_Razveljavi" #: src/ui/gui/syntax-editor.ui:94 msgid "_Redo" msgstr "_Ponovno uveljavi" #: src/ui/gui/syntax-editor.ui:100 #, fuzzy #| msgid "Find" msgid "_Find" msgstr "Najdi" #: src/ui/gui/syntax-editor.ui:106 msgid "_Run" msgstr "_Zaženi" #: src/ui/gui/syntax-editor.ui:109 msgid "_All" msgstr "_Vse ukaze" #: src/ui/gui/syntax-editor.ui:113 msgid "_Selection" msgstr "_Izbrane vrstice" #: src/ui/gui/syntax-editor.ui:117 msgid "_Current Line" msgstr "_Trenutno vrstico" #: src/ui/gui/syntax-editor.ui:122 msgid "_To End" msgstr "_Do konca ukazov" #: src/ui/gui/var-type-dialog.ui:99 msgid "Scientific notation" msgstr "Znanstven zapis števil" #: src/ui/gui/var-type-dialog.ui:150 msgid "Custom currency" msgstr "Denarna enota po meri" #: src/ui/gui/var-type-dialog.ui:267 msgid "positive" msgstr "pozitivno" #: src/ui/gui/var-type-dialog.ui:279 msgid "negative" msgstr "negativno" #: src/ui/gui/var-type-dialog.ui:293 msgid "Sample" msgstr "Vzorec" #: src/ui/gui/var-type-dialog.ui:350 msgid "Width:" msgstr "Širina:" #: src/ui/gui/var-type-dialog.ui:396 msgid "Decimal Places:" msgstr "Decimalna mesta:" #: src/ui/gui/weight.ui:24 msgid "Weight Cases" msgstr "Uteževanje primerov" #: src/ui/gui/weight.ui:100 msgid "Weight cases by" msgstr "Uteži primere s spremenljivko" #: src/ui/gui/weight.ui:144 msgid "Frequency Variable" msgstr "Spremenljivka frekvence" #: src/ui/gui/weight.ui:198 msgid "Current Status: " msgstr "Trenutno stanje: " #. TRANSLATORS: This is the application name in the desktop file #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:7 #: src/ui/gui/org.fsf.pspp.desktop.in:7 msgid "GNU PSPP" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:8 #, fuzzy #| msgid "A program for the analysis of sampled data" msgid "GNU PSPP is a program for statistical analysis of sampled data" msgstr "Program za statistično analizo podatkov" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:10 msgid "" "GNU PSPP is a program for the statistical analysis of sampled data. It is a " "Free replacement for the proprietary program SPSS, and appears very similar " "to it with a few exceptions. The most important of these exceptions are, " "that there are no “time bombs”; your copy of PSPP will not “expire” or " "deliberately stop working in the future. Neither are there any artificial " "limits on the number of cases or variables which you can use. There are no " "additional packages to purchase in order to get “advanced” functions; all " "functionality that PSPP currently supports is in the core package." msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:11 msgid "" "PSPP is a stable and reliable application. It can perform descriptive " "statistics, T-tests, anova, linear and logistic regression, measures of " "association, cluster analysis, reliability and factor analysis, non-" "parametric tests and more. Its backend is designed to perform its analyses " "as fast as possible, regardless of the size of the input data. You can use " "PSPP with its graphical interface or the more traditional syntax commands." msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:12 msgid "A brief list of some of the PSPP's features." msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:14 msgid "Support for over 1 billion cases" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:15 msgid "Support for over 1 billion variables" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:16 msgid "Syntax and data files which are compatible with those of SPSS" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:17 msgid "A choice of terminal or graphical user interface" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:18 msgid "A choice of text, postscript, pdf, opendocument or html output formats" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:19 msgid "" "Inter-operability with: LibreOffice, Apache OpenOffice, Gnumeric and other " "free software" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:20 msgid "Easy data import from spreadsheets, text files and database sources" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:21 msgid "" "The capability to open, analyse and edit two or more datasets concurrently" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:22 msgid "A user interface supporting all common character sets" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:23 msgid "A user interface has been translated to multiple languages" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:24 msgid "Very fast statistical procedures, even on very large data sets" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:25 msgid "No license fees and no expiration period" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:26 msgid "No unethical “end user license agreements”" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:27 msgid "A fully indexed user manual" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:28 msgid "Freedom ensured; It is licensed under the GPLv3 or later" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:29 msgid "" "Portability; Runs on many different computers and many different operating " "systems" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:31 msgid "" "PSPP is particularly aimed at statisticians, social scientists and students " "requiring fast convenient analysis of sampled data." msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:41 #, fuzzy #| msgid "Variable View" msgid "GNU PSPP Variable View" msgstr "Pregled spremenljivk" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:54 msgid "Free Software Foundation" msgstr "" #: src/ui/gui/org.fsf.pspp.desktop.in:8 msgid "Statistical Software" msgstr "Statistika" #: src/ui/gui/org.fsf.pspp.desktop.in:9 msgid "Analyze statistical data with a free alternative to SPSS" msgstr "Odprtokodni program za analizo statističnih podatkov po vzoru SPSS." #. TRANSLATORS: Do not translate this string. Keep it as is, verbatim. #: src/ui/gui/org.fsf.pspp.desktop.in:12 msgid "pspp" msgstr "" #. TRANSLATORS: You must keep all ";" - also at the end of line. #: src/ui/gui/org.fsf.pspp.desktop.in:17 msgid "statistics;analysis;spss;" msgstr "" #~ msgid "Sorry. The help system hasn't yet been implemented." #~ msgstr "Sistem pomoči v tej različici programa še ni podprt." #~ msgid "Details" #~ msgstr "Podrobnosti" #~ msgid "Multiple dichotomy set" #~ msgstr "Določitev več dihotomnosti" #~ msgid "Multiple category set" #~ msgstr "Nastavitev več kategorij" #~ msgid "Label source" #~ msgstr "Vir oznake" #~ msgid "First variable label among variables" #~ msgstr "Prva oznaka spremenljivke med spremenljivkami" #~ msgid "Provided by user" #~ msgstr "Uporabniško določeno" #~ msgid "Category label source" #~ msgstr "Vir oznake kategorije" #~ msgid "Variable labels" #~ msgstr "Oznake spremenljivk" #~ msgid "Value labels of counted value" #~ msgstr "Oznake štetih vrednosti" #~ msgid "Label:" #~ msgstr "Oznaka:" #~ msgid "No label." #~ msgstr "Brez oznake." #~ msgid "Product:" #~ msgstr "Izdelek:" #~ msgid "Variables:" #~ msgstr "Spremenljivke:" #~ msgid "Cases:" #~ msgstr "Primeri:" #~ msgid "Type:" #~ msgstr "Vrsta:" #~ msgid "Description" #~ msgstr "Opis" #~ msgid "The active dataset does not have a file label." #~ msgstr "Izbrana podatkovna zbirka nima oznake datoteke." #~ msgid "File label: %s" #~ msgstr "Oznaka datoteke: %s" #~ msgid "The active dataset dictionary does not contain any documents." #~ msgstr "" #~ "Trenutni slovarski zapis podatkovne zbirne ne vključuje nobenih podatkov." #~ msgid "Documents in the active dataset:" #~ msgstr "Dokumenti v izbrani podatkovni zbirki:" #~ msgid "Custom data file attributes." #~ msgstr "Atributi podatkovne datoteke po meri." #~ msgid "Label: %s\n" #~ msgstr "Oznaka: %s\n" #~ msgid "Format: %s\n" #~ msgstr "Zapis: %s\n" #~ msgid "Measure: %s\n" #~ msgstr "Mera: %s\n" #~ msgid "Role: %s\n" #~ msgstr "Vloga: %s\n" #~ msgid "Display Alignment: %s\n" #~ msgstr "Poravnava prikaza: %s\n" #~ msgid "Display Width: %d\n" #~ msgstr "Širina prikaza: %d\n" #~ msgid "Missing Values: " #~ msgstr "Manjkajoče vrednosti: " #~ msgid "Interactive shell not supported on this platform." #~ msgstr "Interaktivna lupina na tem sistemu ni podprta." #~ msgid "Error executing command: %s." #~ msgstr "Prišlo je do napake pri izvajanju ukaza: %s." #~ msgid "Unknown TABLECELLS class" #~ msgstr "Neznan razred TABLECELLS" #~ msgid "Exact Sig. (%d-tailed)" #~ msgstr "" #~ "Natančna stat. znač.\n" #~ "(%d-smerni test)" #~ msgid "Valid N" #~ msgstr "N Veljavnih" #~ msgid "Missing N" #~ msgstr "N Manjkajočih" #~ msgid "Valid cases = %.*g; cases with missing value(s) = %.*g." #~ msgstr "Veljavni primeri = %.*g; primeri z manjkajočimi vrednostmi = %.*g." #~ msgid "%g" #~ msgstr "%g" #~ msgid "%d" #~ msgstr "%d" #~ msgid "%zu" #~ msgstr "%zu" #~ msgid "50 (Median)" #~ msgstr "50 (mediana)" #~ msgid "(%d)" #~ msgstr "(%d)" #~ msgid "Min" #~ msgstr "Najmanj" #~ msgid "Max" #~ msgstr "Največ" #~ msgid "%g%%" #~ msgstr "%g%%" #~ msgid "25th" #~ msgstr "25." #~ msgid "50th (Median)" #~ msgstr "50. (mediana)" #~ msgid "75th" #~ msgstr "75." #~ msgid "(I) %s" #~ msgstr "(I) %s" #~ msgid "(J) %s" #~ msgstr "(J) %s" #~ msgid "(I - J)" #~ msgstr "(I - J)" #~ msgid "%s into %s(%s of %s using %s BY %s)" #~ msgstr "%s v %s (%s od %s z uporabo %s z %s) +" #~ msgid "%s into %s(%s of %s BY %s)" #~ msgstr "%s v %s (%s od %s z %s) +" #~ msgid "%s into %s(%s of %s using %s)" #~ msgstr "%s v %s (%s od %s z uporabo %s) +" #~ msgid "%s into %s(%s of %s)" #~ msgstr "%s v %s (%s od %s) +" #~ msgid "Area Under the Curve (%s)" #~ msgstr "Površina pod krivuljo (%s)" #~ msgid "Coordinates of the Curve (%s)" #~ msgstr "Koordinate krivulje (%s)" #~ msgid "Std. Error Mean" #~ msgstr "Povprečje SN" #~ msgid "(active dataset)" #~ msgstr "(dejavna podatkovna množica)" #~ msgid "Writing %zu record to %s." #~ msgid_plural "Writing %zu records to %s." #~ msgstr[0] "Zapisovanje %zu zapisov primerov v %s." #~ msgstr[1] "Zapisovanje %zu zapisa primera v %s." #~ msgstr[2] "Zapisovanje %zu zapisov primerov v %s." #~ msgstr[3] "Zapisovanje %zu zapisov primerov v %s." #~ msgid "Writing %zu record." #~ msgid_plural "Writing %zu records." #~ msgstr[0] "Zapisovanje %zu zapisov primerov." #~ msgstr[1] "Zapisovanje %zu zapisa primera." #~ msgstr[2] "Zapisovanje %zu zapisov primerov." #~ msgstr[3] "Zapisovanje %zu zapisov primerov." #~ msgid "Unsupported compression type (%d)" #~ msgstr "nepodprt način stiskanja (%d)" #, fuzzy #~ msgid "Failed to seek to end of central directory record: %s" #~ msgstr "iskanje konca zapisa osrednje mape je spodletelo: %s" #, fuzzy #~ msgid "Failed to seek to central directory: %s" #~ msgstr "iskanje osrednje mape je spodletelo: %s" #, fuzzy #~ msgid "Failed to seek to start of member `%s': %s" #~ msgstr "iskanje začetka člana »%s« je spodletelo: %s" #~ msgid "ascii: closing output file `%s'" #~ msgstr "ascii: poteka zapiranje datoteke odvoda »%s«" #~ msgid "%s - Page %d" #~ msgstr "%s – stran %d" #~ msgid "bad vline: x=%d+%d=%d y=(%d+%d=%d,%d+%d=%d) in table size (%d,%d)\n" #~ msgstr "" #~ "neustrezna vodoravna črta: x=%d+%d=%d y=(%d+%d=%d,%d+%d=%d) v " #~ "razpredelnici velikosti (%d,%d)\n" #~ msgid "bad hline: x=(%d+%d=%d,%d+%d=%d) y=%d+%d=%d in table size (%d,%d)\n" #~ msgstr "" #~ "neustrezna vodoravna črta: x=%d+%d=%d y=(%d+%d=%d,%d+%d=%d) v " #~ "razpredelnici velikosti (%d,%d)\n" #~ msgid "" #~ "bad box: (%d+%d=%d,%d+%d=%d)-(%d+%d=%d,%d+%d=%d) in table size (%d,%d)\n" #~ msgstr "" #~ "napačno polje: (%d+%d=%d,%d+%d=%d)-(%d+%d=%d,%d+%d=%d) v velikosti " #~ "razpredelnice (%d,%d)\n" #~ msgid "can only convert encrypted data file to sav or sys format" #~ msgstr "" #~ "šifrirane podatkovne datoteke je mogoče pretvoriti le v zapis *.sav in *." #~ "sys." #~ msgid "can only convert encrypted syntax file to sps format" #~ msgstr "šifrirane datoteke skladnje je mogoče pretvoriti le v zapis *.sps." #~ msgid "count" #~ msgstr "števec" #~ msgid "expected" #~ msgstr "pričakovano" #~ msgid "residual" #~ msgstr "ostanek" #~ msgid "std. resid." #~ msgstr "std. ostanek" #~ msgid "adj. resid." #~ msgstr "prilagojen ostanek" #~ msgid "Chi-square tests." #~ msgstr "Hi-kvadrat preizkusi." #~ msgid "Odds Ratio for %s (%.*s / %.*s)" #~ msgstr "Razmerje verjetnosti za %s (%.*s / %.*s)" #~ msgid "For cohort %s = %.*s" #~ msgstr "Za kohorto %s = %.*s" pspp-1.4.1/po/hu.po0000644000175000017500000117757713725012645013543 0ustar00blpblp00000000000000# Hungarian translation for pspp. # Copyright (C) 2016, 2017, 2019 Free Software Foundation, Inc. # This file is distributed under the same license as the pspp package. # # Balázs Meskó , 2016, 2017, 2019. msgid "" msgstr "" "Project-Id-Version: pspp 1.2.0\n" "Report-Msgid-Bugs-To: pspp-dev@gnu.org\n" "PO-Revision-Date: 2019-11-14 20:04+0100\n" "Last-Translator: Meskó Balázs \n" "Language-Team: Hungarian \n" "Language: hu\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Bugs: Report translation errors to the Language-Team address.\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 2.2.4\n" #: src/data/any-reader.c:72 src/data/encrypted-file.c:78 #, c-format msgid "An error occurred while opening `%s': %s." msgstr "Hiba történt a(z) „%s” fájl megnyitása közben: %s." #: src/data/any-reader.c:93 src/language/lexer/lexer.c:1633 #, c-format msgid "Error reading `%s': %s." msgstr "Hiba a(z) „%s” olvasásakor: %s." #: src/data/any-reader.c:114 #, c-format msgid "`%s' is not a system or portable file." msgstr "A(z) „%s” nem rendszer vagy hordozható fájl." #: src/data/any-reader.c:123 src/data/any-writer.c:66 msgid "The inline file is not allowed here." msgstr "A beágyazott fájl itt nem engedélyezett." #: src/data/any-reader.c:205 #, c-format msgid "" "Cannot read from dataset %s because no dictionary or data has been written " "to it yet." msgstr "" "Nem lehet olvasni a(z) %s adathalmazból, mert sem szótár, sam adat nem lett " "még beleírva." #: src/data/any-reader.c:260 src/language/data-io/dataset.c:253 msgid "Dataset" msgstr "Adathalmaz" #: src/data/calendar.c:100 #, c-format msgid "Month %d is not in acceptable range of 0 to 13." msgstr "A(z) %d. hónap nem az elfogadott 0-13 tartományban van." #: src/data/calendar.c:110 #, c-format msgid "Day %d is not in acceptable range of 0 to 31." msgstr "A(z) %d. nap nem az elfogadott 0-31 tartományban van." #: src/data/calendar.c:119 #, c-format msgid "Date %04d-%d-%d is before the earliest acceptable date of 1582-10-15." msgstr "" "A(z) %04d-%d-%d dátum korábbi, mint a legkorábbi elfogadható dátum: " "1582-10-15." #: src/data/casereader-filter.c:221 msgid "" "At least one case in the data read had a weight value that was user-missing, " "system-missing, zero, or negative. These case(s) were ignored." msgstr "" "Legalább egy esetben, a beolvasott adat súlyértéke hiányzónak lett jelölve, " "hiányzott, zérus vagy negatív volt. Ezek az esetek figyelmen kívül lesznek " "hagyva." #. TRANSLATORS: this fragment will be interpolated into messages in fh_lock() #. that identify types of files. #: src/data/csv-file-writer.c:138 msgid "CSV file" msgstr "CSV fájl" #: src/data/csv-file-writer.c:146 #, fuzzy, c-format #| msgid "Error opening `%s' for writing as a system file: %s." msgid "Error opening `%s' for writing as a CSV file: %s." msgstr "Hiba a(z) „%s” fájl rendszerfájlként, írásra megnyitása közben: %s." #: src/data/csv-file-writer.c:453 #, c-format msgid "An I/O error occurred writing CSV file `%s'." msgstr "Ki-/bemeneti hiba történt a(z) „%s” CSV fájl írása közben." #: src/data/data-in.c:175 #, c-format msgid "Data is not valid as format %s: %s" msgstr "Az adat nem érvényes a(z) „%s” formátum szerint: %s" #: src/data/data-in.c:377 src/data/data-in.c:553 msgid "Field contents are not numeric." msgstr "A mező tartalma nem numerikus." #: src/data/data-in.c:379 src/data/data-in.c:555 msgid "Number followed by garbage." msgstr "Szám, amelyet szemét követ." #: src/data/data-in.c:392 msgid "Invalid numeric syntax." msgstr "Érvénytelen numerikus szintaxis." #: src/data/data-in.c:400 src/data/data-in.c:571 msgid "Too-large number set to system-missing." msgstr "Túl nagy szám beállítva hiányzónak." #: src/data/data-in.c:406 src/data/data-in.c:577 msgid "Too-small number set to zero." msgstr "Túl kicsi száma beállítva zérusnak." #: src/data/data-in.c:426 msgid "All characters in field must be digits." msgstr "A mező minden karakterének számjegynek kell lennie." #: src/data/data-in.c:445 msgid "Unrecognized character in field." msgstr "Nem felismert karakter a mezőben." #: src/data/data-in.c:466 src/data/data-in.c:729 msgid "Field must have even length." msgstr "A mezőnek páros hosszúságúnak kell lennie." #: src/data/data-in.c:468 src/data/data-in.c:732 msgid "Field must contain only hex digits." msgstr "A mező csak hexadecimális számjegyeket tartalmazhat." #: src/data/data-in.c:544 msgid "Invalid zoned decimal syntax." msgstr "Érvénytelen tizedes tört szintaxis." #: src/data/data-in.c:644 src/data/data-in.c:650 msgid "Invalid syntax for P field." msgstr "Érvénytelen szintaxis a P mezőhöz." #: src/data/data-in.c:768 src/data/data-in.c:818 msgid "Syntax error in date field." msgstr "Szintaktikai hiba a dátum mezőben." #: src/data/data-in.c:783 #, c-format msgid "Day (%ld) must be between 1 and 31." msgstr "A nap (%ld) 1 és 31 között kell legyen." #: src/data/data-in.c:832 msgid "Delimiter expected between fields in date." msgstr "Elválasztó karakter várt a dátum mezői között." #: src/data/data-in.c:906 msgid "" "Unrecognized month format. Months may be specified as Arabic or Roman " "numerals or as at least 3 letters of their English names." msgstr "" "Nem felismert hónapformátum. A hónapokat arab vagy római számokkal lehet " "megadni, vagy az angol nevük legalább 3 betűjével." #: src/data/data-in.c:933 #, c-format msgid "Year (%ld) must be between 1582 and 19999." msgstr "Az évnek (%ld) 1582 és 19999 között kell lennie." #: src/data/data-in.c:944 #, c-format msgid "Trailing garbage `%.*s' following date." msgstr "„%.*s” záró szemét a dátum után." #: src/data/data-in.c:958 msgid "Julian day must have exactly three digits." msgstr "A julián napnak pontosan 3 számjegye kell legyen." #: src/data/data-in.c:960 #, c-format msgid "Julian day (%ld) must be between 1 and 366." msgstr "A julián napnak (%ld) 1 és 366 között kell lennie." #: src/data/data-in.c:984 #, c-format msgid "Quarter (%ld) must be between 1 and 4." msgstr "A negyedévnek (%ld) 1 és 4 között kell lennie." #: src/data/data-in.c:1005 #, c-format msgid "Week (%ld) must be between 1 and 53." msgstr "A hétnek (%ld) 1 és 53 között kell lennie." #: src/data/data-in.c:1017 msgid "Delimiter expected between fields in time." msgstr "Elválasztó karakter várt az idő mezői között." #: src/data/data-in.c:1037 #, c-format msgid "Minute (%ld) must be between 0 and 59." msgstr "A percnek (%ld) 0 és 59 között kell lennie." #: src/data/data-in.c:1075 msgid "" "Unrecognized weekday name. At least the first two letters of an English " "weekday name must be specified." msgstr "" "Nem felismert nap név. Legalább az angol nevük első két betűjét meg kell " "adni." #: src/data/data-in.c:1210 #, c-format msgid "`%c' expected in date field." msgstr "„%c” várt a dátum mezőben." #: src/data/data-out.c:580 #, c-format msgid "Weekday number %f is not between 1 and 7." msgstr "A hét napjának száma, %f, nem 1 és 7 között van." #: src/data/data-out.c:605 #, c-format msgid "Month number %f is not between 1 and 12." msgstr "A hónap száma, %f, nem 1 és 12 között van." #. TRANSLATORS: this fragment will be interpolated into #. messages in fh_lock() that identify types of files. #: src/data/dataset-writer.c:66 src/language/data-io/file-handle.c:304 msgid "dataset" msgstr "adathalmaz" #: src/data/dict-class.c:52 msgid "ordinary" msgstr "szokványos" #: src/data/dict-class.c:54 msgid "system" msgstr "rendszer" #: src/data/dict-class.c:56 msgid "scratch" msgstr "segéd" #: src/data/dictionary.c:1523 #, c-format msgid "Truncating document line to %d bytes." msgstr "Dokumentum sor csonkolása %d bájtra." #: src/data/encrypted-file.c:89 #, c-format msgid "An error occurred while reading `%s': %s." msgstr "Hiba történt a(z) „%s” olvasásakor: %s." #: src/data/encrypted-file.c:430 #, c-format msgid "" "%s: encrypted file corrupted (ends in incomplete %u-byte ciphertext block)" msgstr "" #: src/data/encrypted-file.c:449 #, c-format msgid "%s: encrypted file corrupted (ends with bad padding)" msgstr "" #: src/data/file-handle-def.c:283 src/language/data-io/dataset.c:266 msgid "active dataset" msgstr "aktív adathalmaz" #: src/data/file-handle-def.c:518 #, c-format msgid "Can't read from %s as a %s because it is already being read as a %s." msgstr "A(z) %s nem olvasható ekként: %s, mert már ekként olvasott: %s." #: src/data/file-handle-def.c:522 #, c-format msgid "Can't write to %s as a %s because it is already being written as a %s." msgstr "A(z) %s nem írható ekként: %s, mert már ekként írt: %s." #: src/data/file-handle-def.c:529 #, c-format msgid "Can't re-open %s as a %s." msgstr "Nem nyitható meg újra a(z) „%s” a következőként: %s." #: src/data/file-name.c:133 #, c-format msgid "Not opening pipe file `%s' because %s option set." msgstr "" "A(z) „%s” csővezeték fájl nem kerül megnyitásra, mert a(z) %s lehetőség be " "van kapcsolva." #: src/data/format.c:339 msgid "Input format" msgstr "Bemeneti formátum" #: src/data/format.c:339 msgid "Output format" msgstr "Kimeneti formátum" #: src/data/format.c:342 #, c-format msgid "Format %s may not be used for input." msgstr "A(z) %s formátum nem használható bemenethez." #: src/data/format.c:349 #, c-format msgid "%s specifies width %d, but %s requires an even width." msgstr "" "%s a %d szélességet határozza meg, de a(z) %s egyenlő szélességet vár el." #: src/data/format.c:358 #, c-format msgid "%s %s specifies width %d, but %s requires a width between %d and %d." msgstr "" "%s %s a %d szélességet határozza meg, de a(z) %s %d és %d közti szélességet " "vár el." #: src/data/format.c:367 #, c-format msgid "%s %s specifies %d decimal place, but %s does not allow any decimals." msgid_plural "" "%s %s specifies %d decimal places, but %s does not allow any decimals." msgstr[0] "" "%s %s %d decimális helyet határoz meg, de a(z) %s egyet sem engedélyez." msgstr[1] "" "%s %s %d decimális helyet határoz meg, de a(z) %s egyet sem engedélyez." #: src/data/format.c:378 #, c-format msgid "" "%s %s specifies %d decimal place, but the given width allows at most %d " "decimals." msgid_plural "" "%s %s specifies %d decimal places, but the given width allows at most %d " "decimals." msgstr[0] "" "%s %s %d decimális helyet határoz meg, de a megadott szélesség legfeljebb %d " "decimálist engedélyez." msgstr[1] "" "%s %s %d decimális helyet határoz meg, de a megadott szélesség legfeljebb %d " "decimálist engedélyez." #: src/data/format.c:385 #, c-format msgid "" "%s %s specifies %d decimal place, but the given width does not allow for any " "decimals." msgid_plural "" "%s %s specifies %d decimal places, but the given width does not allow for " "any decimals." msgstr[0] "" "%s %s %d decimális helyet határoz meg, de a megadott szélesség egyetlen " "decimálist sem engedélyez." msgstr[1] "" "%s %s %d decimális helyet határoz meg, de a megadott szélesség egyetlen " "decimálist sem engedélyez." #: src/data/format.c:424 #, c-format msgid "%s variables are not compatible with %s format %s." msgstr "A(z) %1$s változók nem kompatibilisek a(z) %3$s %2$s formátummal." #: src/data/format.c:425 src/data/format.c:1074 #: src/ui/gui/var-type-dialog.ui:167 msgid "String" msgstr "Karakterlánc" #: src/data/format.c:425 src/data/format.c:1035 #: src/ui/gui/var-type-dialog.ui:48 msgid "Numeric" msgstr "Numerikus" #: src/data/format.c:426 src/data/sys-file-reader.c:2212 #: src/data/sys-file-reader.c:2214 src/language/xforms/recode.c:512 #: src/language/xforms/recode.c:513 src/language/xforms/recode.c:525 #: src/language/xforms/recode.c:526 #: src/language/dictionary/apply-dictionary.c:77 #: src/language/dictionary/apply-dictionary.c:78 msgid "numeric" msgstr "numerikus" #: src/data/format.c:426 src/data/sys-file-reader.c:2212 #: src/data/sys-file-reader.c:2214 src/language/xforms/recode.c:512 #: src/language/xforms/recode.c:513 src/language/xforms/recode.c:525 #: src/language/xforms/recode.c:526 #: src/language/dictionary/apply-dictionary.c:77 #: src/language/dictionary/apply-dictionary.c:78 msgid "string" msgstr "karakterlánc" #: src/data/format.c:444 #, c-format msgid "String variable with width %d is not compatible with format %s." msgstr "A(z) %d szélességű karakterlánc nem kompatibilis a(z) %s formátummal." #: src/data/format.c:1038 src/ui/gui/var-type-dialog.ui:65 msgid "Comma" msgstr "Vessző" #: src/data/format.c:1041 src/ui/gui/var-type-dialog.ui:82 msgid "Dot" msgstr "Pont" #: src/data/format.c:1044 msgid "Scientific" msgstr "Tudományos" #: src/data/format.c:1061 src/ui/gui/var-type-dialog.ui:116 msgid "Date" msgstr "Dátum" #: src/data/format.c:1064 src/ui/gui/var-type-dialog.ui:133 msgid "Dollar" msgstr "Dollár" #: src/data/format.c:1071 msgid "Custom" msgstr "Egyéni" #: src/data/gnumeric-reader.c:478 src/data/ods-reader.c:505 #, c-format msgid "Cannot convert the value in the spreadsheet cell %s to format (%s): %s" msgstr "A(z) %s táblázatcella értéke nem alakítható át a formátumra (%s): %s" #: src/data/gnumeric-reader.c:502 src/data/ods-reader.c:567 #, c-format msgid "" "There was a problem whilst reading the %s file `%s' (near line %d): `%s'" msgstr "Probléma volt a(z) „%s” %s fájl olvasásakor (a(z) %d. sor körül): „%s”" #: src/data/gnumeric-reader.c:597 #, c-format msgid "" "The gnumeric file `%s' is encoded as %s instead of the usual UTF-8 encoding. " "Any non-ascii characters will be incorrectly imported." msgstr "" "A(z) „%s” gnumeric fájl %s karakterkódolású, a szokásos UTF-8 kódolás " "helyett. Minden nem ASCII karakter helytelenül lesz importálva." #: src/data/gnumeric-reader.c:641 src/data/ods-reader.c:682 #, c-format msgid "Invalid cell range `%s'" msgstr "Érvénytelen cellatartomány: „%s”" #: src/data/gnumeric-reader.c:813 src/data/ods-reader.c:710 #: src/data/ods-reader.c:843 #, c-format msgid "Selected sheet or range of spreadsheet `%s' is empty." msgstr "A kiválasztott munkalap vagy táblázattartomány („%s”) üres." #: src/data/identifier2.c:60 #, c-format msgid "Identifier `%s' exceeds %d-byte limit." msgstr "A(z) „%s” azonosító meghaladja a %d bájtos határt." #: src/data/identifier2.c:84 msgid "Identifier cannot be empty string." msgstr "Az azonosító nem lehet üres karakterlánc." #: src/data/identifier2.c:92 #, c-format msgid "`%s' may not be used as an identifier because it is a reserved word." msgstr "A(z) „%s” nem használható azonosítóként, mert egy kulcsszó." #: src/data/identifier2.c:103 #, c-format msgid "" "`%s' may not be used as an identifier because it contains ill-formed UTF-8 " "at byte offset %tu." msgstr "" "A(z) „%s” nem használható azonosítóként, mert helytelenül formázott UTF-8 " "értéket tartalmaz a(z) %tu bájt eltolásnál." #: src/data/identifier2.c:114 #, c-format msgid "" "Character %s (in `%s') may not appear as the first character in a identifier." msgstr "A(z) %s karakter (itt: „%s”) nem lehet egy azonosító első karaktere." #: src/data/identifier2.c:126 #, c-format msgid "Character %s (in `%s') may not appear in an identifier." msgstr "A(z) %s karakter (itt: „%s”) nem szerepelhet azonosítóban." #: src/data/mdd-writer.c:241 #, c-format msgid "An I/O error occurred writing metadata file `%s'." msgstr "Ki-/bemeneti hiba történt a(z) „%s” adatfájl írásakor." #. TRANSLATORS: this fragment will be interpolated into #. messages in fh_lock() that identify types of files. #: src/data/mdd-writer.c:457 msgid "metadata file" msgstr "metaadatfájl" #: src/data/mdd-writer.c:465 #, c-format msgid "Error opening `%s' for writing as a metadata file: %s." msgstr "Hiba a(z) „%s” metaadatfájlként, írásra megnyitása közben: %s." #: src/data/mdd-writer.c:473 #, fuzzy, c-format #| msgid "Internal error creating xmlTextWriter." msgid "Internal error creating xmlTextWriter. Please report this to %s." msgstr "Belső hiba az xmlTextWriter létrehozásakor." #: src/data/make-file.c:217 #, c-format msgid "Opening %s for writing: %s." msgstr "A(z) %s megnyitása írásra: %s." #: src/data/make-file.c:228 #, c-format msgid "Opening stream for %s: %s." msgstr "Az adatfolyam megnyitása ehhez: %s: %s." #: src/data/make-file.c:260 #, c-format msgid "Creating temporary file to replace %s: %s." msgstr "Átmeneti fájl létrehozása a(z) %s cseréjére: %s." #: src/data/make-file.c:277 #, c-format msgid "Creating temporary file %s: %s." msgstr "%s átmeneti fájl létrehozása: %s." #: src/data/make-file.c:289 #, c-format msgid "Opening stream for temporary file %s: %s." msgstr "Adatfolyam megnyitása a(z) %s átmeneti fájlhoz: %s." #: src/data/make-file.c:326 #, c-format msgid "Replacing %s by %s: %s." msgstr "A(z) %s cseréje erre: %s: %s." #: src/data/make-file.c:354 #, c-format msgid "Removing %s: %s." msgstr "A(z) „%s” eltávolítása: %s." #: src/data/mrset.c:83 #, c-format msgid "" "%s is not a valid name for a multiple response set. Multiple response set " "names must begin with `$'." msgstr "" "A(z) %s nem érvényes név egy többértékű válaszhalmazhoz. A többértékű " "válaszhalmazok neveinek „$” jellel kell kezdődniük." #: src/data/ods-reader.c:620 #, c-format msgid "Cannot open %s as a OpenDocument file: %s" msgstr "A(z) %s nem nyitható meg OpenDocument fájlként: %s" #. TRANSLATORS: this fragment will be interpolated into #. messages in fh_lock() that identify types of files. #: src/data/pc+-file-reader.c:206 msgid "SPSS/PC+ system file" msgstr "SPSS/PC+ rendszerfájl" #: src/data/pc+-file-reader.c:215 #, c-format msgid "Error opening `%s' for reading as an SPSS/PC+ system file: %s." msgstr "Hiba a(z) „%s” SPSS/PC+ rendszerfájlként megnyitásakor: %s." #: src/data/pc+-file-reader.c:224 src/data/sys-file-reader.c:3541 #, c-format msgid "%s: stat failed (%s)." msgstr "%s: statisztika sikertelen (%s)." #: src/data/pc+-file-reader.c:230 #, c-format msgid "%s: file too large." msgstr "%s: a fájl túl nagy." #: src/data/pc+-file-reader.c:257 #, c-format msgid "" "Directory entry is for a %u-byte record starting at offset %u but file is " "only %u bytes long." msgstr "" "A mappabejegyzés egy %u bájtos, %u eltolásnál kezdődő rekordról szól, de a " "fájl csak %u bájt hosszú." #: src/data/pc+-file-reader.c:275 #, c-format msgid "Directory fields have unexpected values (%u,%u)." msgstr "A mappa mezői váratlan értékeket tartalmaznak (%u,%u)." #: src/data/pc+-file-reader.c:372 src/data/sys-file-reader.c:672 #, c-format msgid "Variable %zu" msgstr "%zu. változó" #: src/data/pc+-file-reader.c:380 src/data/sys-file-reader.c:680 #, c-format msgid "Variable %zu Label" msgstr "%zu. változó címke" #: src/data/pc+-file-reader.c:385 #, c-format msgid "Variable %zu Value Label %zu" msgstr "%zu. változó %zu. értékcímke" #: src/data/pc+-file-reader.c:388 src/data/sys-file-reader.c:690 msgid "Creation Date" msgstr "Létrehozás dátuma" #: src/data/pc+-file-reader.c:389 src/data/sys-file-reader.c:691 msgid "Creation Time" msgstr "Létrehozás ideje" #: src/data/pc+-file-reader.c:390 src/data/sys-file-reader.c:692 #: src/language/dictionary/sys-file-info.c:200 msgid "Product" msgstr "Termék" #: src/data/pc+-file-reader.c:391 src/data/sys-file-reader.c:693 #: src/language/dictionary/sys-file-info.c:300 msgid "File Label" msgstr "Fájlcímke" #: src/data/pc+-file-reader.c:427 #, c-format msgid "" "Using default encoding %s to read this SPSS/PC+ system file. For best " "results, specify an encoding explicitly. Use SYSFILE INFO with ENCODING=" "\"DETECT\" to analyze the possible encodings." msgstr "" "A(z) %s alapértelmezett kódolás használata a SPSS/PC+ rendszerfájl " "olvasásához. A legjobb eredmény érdekében, adjon meg egy konkrét kódolást. " "Használja a SYSFILE INFO parancsot az ENCODING=\"DETECT\" kapcsolóval a " "lehetséges kódolások elemzéséhez." #: src/data/pc+-file-reader.c:483 src/data/sys-file-reader.c:890 #, c-format msgid "Error closing system file `%s': %s." msgstr "Hiba a(z) „%s” rendszerfájl bezárásakor: %s." #: src/data/pc+-file-reader.c:544 msgid "This is not an SPSS/PC+ system file." msgstr "Ez nem egy SPSS/PC+ rendszerfájl." #: src/data/pc+-file-reader.c:548 #, c-format msgid "Record 0 has unexpected length %u." msgstr "A 0. rekordnak nem várt hossza van: %u." #: src/data/pc+-file-reader.c:572 #, c-format msgid "Record 0 specifies unexpected system missing value %g (%a)." msgstr "" "A 0. rekord nem várt rendszer által hiányzó értéket határoz meg: %g (%a)." #: src/data/pc+-file-reader.c:577 #, c-format msgid "Record 0 reserved fields have unexpected values (%u,%u,%u,%u,%u,%u)." msgstr "A 0. rekord foglalt mezőinek váratlan értéke van: (%u,%u,%u,%u,%u,%u)." #: src/data/pc+-file-reader.c:581 #, c-format msgid "Record 0 case counts differ (%u versus %u)." msgstr "A 0. rekord esetszámai eltérnek (%u - %u)." #: src/data/pc+-file-reader.c:585 #, c-format msgid "Invalid compression type %u." msgstr "Érvénytelen tömörítési típus: %u." #: src/data/pc+-file-reader.c:596 #, c-format msgid "" "Record 0 claims %u cases with %u values per case (requiring at least %zu " "bytes) but data record is only %u bytes long." msgstr "" "A 0. rekord azt állítja, hogy %u esete van, %u értékkel esetenként (amely " "legalább %zu bájtot igényel), de az adatrekord csak %u bájt hosszú." #: src/data/pc+-file-reader.c:618 #, c-format msgid "" "Value labels claimed to end at offset %u in labels record but labels record " "is only %u bytes." msgstr "" "A címkerekordban az értékcímkék a(z) %u. eltolásnál végződnek, de a " "címkerekord csak %u bájt." #: src/data/pc+-file-reader.c:629 #, c-format msgid "" "Value labels claimed to be at offset %u with length %u but file size is only " "%u bytes." msgstr "" "Az értékcímkék a(z) %u. eltolásnál vannak %u hosszan, de a fájlméret csak %u " "bájt." #: src/data/pc+-file-reader.c:656 #, c-format msgid "" "Value labels end with partial label (%u bytes left in record, label length " "%)." msgstr "" "Az értékcímkék részleges címkével érnek véget (%u bájt maradt a rekordban, " "címkehossz: %)." #: src/data/pc+-file-reader.c:669 #, c-format msgid "%u leftover bytes following value labels." msgstr "%u hátramaradt bájt az értékcímkék után." #: src/data/pc+-file-reader.c:685 #, c-format msgid "" "Variable label claimed to start at offset %u in labels record but labels " "record is only %u bytes." msgstr "" "A címkerekordban a változócímke a(z) %u. eltolásnál kezdődik, de a " "címkerekord csak %u bájt." #: src/data/pc+-file-reader.c:697 #, c-format msgid "" "Variable label with length %u starting at offset %u in labels record " "overruns end of %u-byte labels record." msgstr "" "A címkerekordban a(z) %2$u eltolásnál kezdődő %1$u hosszú változócímke " "túlfut a(z) %3$u bájtos címkerekord végén." #: src/data/pc+-file-reader.c:719 #, c-format msgid "Record 1 has length %u (expected %u)." msgstr "A 1. rekord hossza %u (várt: %u)." #: src/data/pc+-file-reader.c:751 #, c-format msgid "Variable %u has invalid type %." msgstr "A(z) %u. változó típusa érvénytelen: %." #: src/data/pc+-file-reader.c:787 #, c-format msgid "Invalid weight index %u." msgstr "Érvénytelen súlyindex: %u." #: src/data/pc+-file-reader.c:857 #, c-format msgid "Invalid variable name `%s'." msgstr "Érvénytelen változónév: „%s”." #: src/data/pc+-file-reader.c:865 src/data/sys-file-reader.c:1444 #, c-format msgid "Renaming variable with duplicate name `%s' to `%s'." msgstr "Ismétlődő nevű változó átnevezése, erről: „%s”, erre: „%s”." #: src/data/pc+-file-reader.c:877 #, c-format msgid "Cannot weight by string variable `%s'." msgstr "Nem lehet a(z) „%s” karakterlánc változó szerint súlyozni." #: src/data/pc+-file-reader.c:973 src/data/sys-file-reader.c:2762 msgid "File ends in partial case." msgstr "A fájl részleges esettel ér véget." #: src/data/pc+-file-reader.c:979 #, c-format msgid "" "Case beginning at offset 0x%08x extends past end of data record at offset 0x" "%08x." msgstr "" "A 0x%08x eltolásnál kezdődő eset túlnyúlik a 0x%08x eltolásnál lévő " "adatrekordon." #: src/data/pc+-file-reader.c:998 src/data/sys-file-reader.c:2770 #, c-format msgid "Error reading case from file %s." msgstr "Hiba az eset olvasásakor a(z) %s fájlból." #: src/data/pc+-file-reader.c:1114 src/data/sys-file-reader.c:2933 #, c-format msgid "" "Possible compressed data corruption: string contains compressed integer " "(opcode %d)." msgstr "" "Lehetséges tömörített adat sérülés: a karakterlánc tömörített egészt " "tartalmaz (%d opkód)." #: src/data/pc+-file-reader.c:1156 src/data/sys-file-reader.c:3234 #, c-format msgid "`%s' near offset 0x%llx: " msgstr "„%s” a 0x%llx eltolásnál: " #: src/data/pc+-file-reader.c:1159 src/data/sys-file-reader.c:3237 #, c-format msgid "`%s': " msgstr "„%s”: " #: src/data/pc+-file-reader.c:1211 src/data/sys-file-reader.c:3288 #, c-format msgid "System error: %s." msgstr "Rendszerhiba: %s." #: src/data/pc+-file-reader.c:1216 src/data/sys-file-reader.c:3293 msgid "Unexpected end of file." msgstr "Váratlan fájlvég." #: src/data/pc+-file-reader.c:1301 src/data/sys-file-reader.c:3518 #, c-format msgid "%s: seek failed (%s)." msgstr "%s: pozicionálás sikertelen (%s)." #: src/data/pc+-file-reader.c:1351 msgid "SPSS/PC+ System File" msgstr "SPSS/PC+ rendszerfájl" #: src/data/por-file-reader.c:109 #, c-format msgid "portable file %s corrupt at offset 0x%llx: " msgstr "A(z) %s hordozható fájl megsérült a 0x%llx eltolásnál: " #: src/data/por-file-reader.c:136 #, c-format msgid "reading portable file %s at offset 0x%llx: " msgstr "A(z) %s hordozható fájl olvasása a 0x%llx eltolásnál: " #: src/data/por-file-reader.c:164 #, c-format msgid "Error closing portable file `%s': %s." msgstr "Hiba a(z) „%s” hordozható fájl szerkesztésekor: %s." #: src/data/por-file-reader.c:216 msgid "unexpected end of file" msgstr "váratlan fájlvég" #. TRANSLATORS: this fragment will be interpolated into #. messages in fh_lock() that identify types of files. #: src/data/por-file-reader.c:275 src/data/por-file-writer.c:147 msgid "portable file" msgstr "hordozható fájl" #: src/data/por-file-reader.c:283 #, c-format msgid "" "An error occurred while opening `%s' for reading as a portable file: %s." msgstr "Hiba történt a(z) „%s” hordozható fájlként megnyitásakor: %s." #: src/data/por-file-reader.c:304 msgid "Data record expected." msgstr "Adatrekord várt." #: src/data/por-file-reader.c:402 msgid "Number expected." msgstr "Szám várt." #: src/data/por-file-reader.c:430 msgid "Missing numeric terminator." msgstr "Hiányzó numerikus lezáró." #: src/data/por-file-reader.c:453 msgid "Invalid integer." msgstr "Érvénytelen egész." #: src/data/por-file-reader.c:464 src/data/por-file-reader.c:484 #, c-format msgid "Bad string length %d." msgstr "Hibás karakterlánc hossz: %d." #: src/data/por-file-reader.c:547 #, c-format msgid "%s: Not a portable file." msgstr "%s: nem hordozható fájl." #: src/data/por-file-reader.c:564 #, c-format msgid "Unrecognized version code `%c'." msgstr "Nem felismert verziókód „%c”." #: src/data/por-file-reader.c:577 #, c-format msgid "Bad date string length %zu." msgstr "Hibás dátum karakterlánc hossz: %zu." #: src/data/por-file-reader.c:579 #, c-format msgid "Bad time string length %zu." msgstr "Hibás idő karakterlánc hossz: %zu." #: src/data/por-file-reader.c:630 #, c-format msgid "" "%s: Bad format specifier byte (%d). Variable will be assigned a default " "format." msgstr "" "%s: hibás formátum megadó bájt (%d). A változóhoz az alapértelmezett " "formátum lesz rendelve." #: src/data/por-file-reader.c:651 #, c-format msgid "Numeric variable %s has invalid format specifier %s." msgstr "A(z) %s numerikus változó %s formátum megadója érvénytelen." #: src/data/por-file-reader.c:655 #, c-format msgid "String variable %s with width %d has invalid format specifier %s." msgstr "A(z) %s, %d szélességű változó, %s formátum megadója érvénytelen." #: src/data/por-file-reader.c:679 msgid "Expected variable count record." msgstr "Változószám rekord várt." #: src/data/por-file-reader.c:683 #, c-format msgid "Invalid number of variables %d." msgstr "Érvénytelen számú változó: %d." #: src/data/por-file-reader.c:692 #, c-format msgid "Weight variable name (%s) truncated." msgstr "A súlyváltozó neve (%s) csonkolva." #: src/data/por-file-reader.c:707 msgid "Expected variable record." msgstr "Változórekord várt." #: src/data/por-file-reader.c:711 #, c-format msgid "Invalid variable width %d." msgstr "Érvénytelen változószélesség: %d." #: src/data/por-file-reader.c:719 #, c-format msgid "Invalid variable name `%s' in position %d." msgstr "Érvénytelen változónév: „%s”, a(z) %d. pozícióban." #: src/data/por-file-reader.c:723 src/data/sys-file-reader.c:1426 #, c-format msgid "Bad width %d for variable %s." msgstr "Érvénytelen szélesség a(z) %2$s változóhoz: %1$d." #: src/data/por-file-reader.c:737 #, c-format msgid "Duplicate variable name %s in position %d renamed to %s." msgstr "Ismételt változónév a(z) %2$d. pozícióban: %1$s, átnevezve erre: %3$s." #: src/data/por-file-reader.c:786 #, c-format msgid "Weighting variable %s not present in dictionary." msgstr "A(z) %s súlyváltozó nem szerepel a szótárban." #: src/data/por-file-reader.c:830 #, c-format msgid "Unknown variable %s while parsing value labels." msgstr "„%s” ismeretlen változó az értékcímkék feldolgozása során." #: src/data/por-file-reader.c:833 #, c-format msgid "" "Cannot assign value labels to %s and %s, which have different variable types." msgstr "" "Nem adhatóak értékcímkék a következőkhöz: %s és %s, melyek különböző " "típusúak." #: src/data/por-file-reader.c:972 msgid "SPSS Portable File" msgstr "SPSS hordozható fájl" #: src/data/por-file-writer.c:139 #, c-format msgid "Invalid decimal digits count %d. Treating as %d." msgstr "Érvénytelen decimális számjegyszám: %d. Kezelés %d-ként." #: src/data/por-file-writer.c:159 #, c-format msgid "Error opening `%s' for writing as a portable file: %s." msgstr "Hiba a(z) „%s” hordozható fájlként, írásra megnyitása közben: %s." #: src/data/por-file-writer.c:505 #, c-format msgid "An I/O error occurred writing portable file `%s'." msgstr "Ki-/bemeneti hiba történt a(z) „%s” hordozható fájl írása közben." #: src/data/psql-reader.c:48 msgid "" "Support for reading postgres databases was not compiled into this " "installation of PSPP" msgstr "" "A postgres adatbázisok támogatása nem lett belefordítva ebbe a PSPP " "telepítésbe" #: src/data/psql-reader.c:242 msgid "Memory error whilst opening psql source" msgstr "Memóriahiba a psql forrás megnyitásakor" #: src/data/psql-reader.c:248 #, c-format msgid "Error opening psql source: %s." msgstr "Hiba a psql forrás megnyitásakor: %s." #: src/data/psql-reader.c:263 #, c-format msgid "" "Postgres server is version %s. Reading from versions earlier than 8.0 is not " "supported." msgstr "" "A Postgres kiszolgálójának verziója %s. A 8.0 verziónál korábbiakban, az " "olvasás nem támogatott." #: src/data/psql-reader.c:283 msgid "" "Connection is unencrypted, but unencrypted connections have not been " "permitted." msgstr "" "A kapcsolat nem titkosított, de a nem titkosított kapcsolat nem megengedett." #: src/data/psql-reader.c:324 src/data/psql-reader.c:349 #: src/data/psql-reader.c:359 #, c-format msgid "Error from psql source: %s." msgstr "Hiba a psql forrástól: %s." #: src/data/psql-reader.c:454 #, c-format msgid "Unsupported OID %d. SYSMIS values will be inserted." msgstr "Nem támogatott %d OID. SYSMIS értékek lesznek beszúrva." #: src/data/settings.c:391 msgid "" "MXWARNS set to zero. No further warnings will be given even when " "potentially problematic situations are encountered." msgstr "" "MXWARNS nullára állítva. További figyelmeztetések nem lesznek, még akkor " "sem, ha potenciálisan problémás helyzetek merülnek fel." #: src/data/settings.c:398 #, c-format msgid "" "Warnings re-enabled. %d warnings will be issued before aborting syntax " "processing." msgstr "" "Figyelmeztetések újra engedélyezve. %d figyelmeztetés lesz kiadva, mielőtt a " "szintaktikai feldolgozás megszakad." #: src/data/settings.c:618 #, c-format msgid "" "%s: Custom currency string `%s' does not contain exactly three periods or " "commas (or it contains both)." msgstr "" "%s: a(z) „%s” egyedi pénznem karakterlánc nem pontosan három pontot vagy " "vesszőt tartalmaz (vagy mindkettőt tartalmaz)." #. TRANSLATORS: this fragment will be interpolated into #. messages in fh_lock() that identify types of files. #: src/data/sys-file-reader.c:407 src/data/sys-file-writer.c:245 msgid "system file" msgstr "rendszerfájl" #: src/data/sys-file-reader.c:414 #, c-format msgid "Error opening `%s' for reading as a system file: %s." msgstr "Hiba a(z) „%s” rendszerfájlként megnyitásakor: %s." #: src/data/sys-file-reader.c:491 msgid "Misplaced type 4 record." msgstr "Rosszul elhelyezett 4. típusú rekord." #: src/data/sys-file-reader.c:496 msgid "Duplicate type 6 (document) record." msgstr "Ismételt 6. típusú (dokumentum) rekord." #: src/data/sys-file-reader.c:506 src/data/sys-file-reader.c:1343 #, c-format msgid "" "Unrecognized record type 7, subtype %d. For help, please send this file to " "%s and mention that you were using %s." msgstr "" "Ismeretlen 7. típusú, %d. altípusú rekord. Segítséghez kérjük küldje el a " "fájlt ide: %s, és említse meg, hogy a(z) %s funkciót használta." #: src/data/sys-file-reader.c:526 #, c-format msgid "" "Record type 7, subtype %d found here has the same type as the record found " "near offset 0x%llx. For help, please send this file to %s and mention that " "you were using %s." msgstr "" "Az itt található 7. típusú, %d. altípusú rekord típusa ugyanaz, mint a 0x" "%llx eltolásnál található rekordé. Segítséghez kérjük küldje el ezt a fájlt " "ide: %s, és említse meg, hogy a(z) %s funkciót használta." #: src/data/sys-file-reader.c:538 #, c-format msgid "Unrecognized record type %d." msgstr "Ismeretlen, %d. típusú rekord." #: src/data/sys-file-reader.c:688 #, c-format msgid "Value Label %zu" msgstr "%zu. értékcímke" #: src/data/sys-file-reader.c:697 msgid "Extra Product Info" msgstr "További termékinformáció" #: src/data/sys-file-reader.c:710 #, c-format msgid "Document Line %zu" msgstr "%zu. dokumentumsor" #: src/data/sys-file-reader.c:718 #, c-format msgid "MRSET %zu" msgstr "%zu. MRSET" #: src/data/sys-file-reader.c:720 #, c-format msgid "MRSET %zu Label" msgstr "%zu. MRSET címke" #: src/data/sys-file-reader.c:725 #, c-format msgid "MRSET %zu Counted Value" msgstr "%zu. MRSET számított érték" #: src/data/sys-file-reader.c:763 #, c-format msgid "" "This system file does not indicate its own character encoding. Using " "default encoding %s. For best results, specify an encoding explicitly. Use " "SYSFILE INFO with ENCODING=\"DETECT\" to analyze the possible encodings." msgstr "" "Ez a rendszerfájl nem jelzi a saját karakterkódolását. Az alapértelmezett %s " "kódolás használata. A legjobb eredményhez explicite adja meg a kódolást. " "Használja a SYSFILE INFO parancsot, az ENCODING=\"DETECT\" lehetőséggel, a " "lehetséges kódolások elemzéséhez." #: src/data/sys-file-reader.c:845 #, c-format msgid "File header claims %d variable positions but %zu were read from file." msgstr "" "A fájl fejléce %d változópozíciót jelöl, de %zu lett kiolvasva fájlból." #: src/data/sys-file-reader.c:958 src/data/sys-file-reader.c:972 msgid "This is not an SPSS system file." msgstr "Ez nem egy SPSS rendszerfájl." #: src/data/sys-file-reader.c:1027 msgid "" "Compression bias is not the usual value of 100, or system file uses " "unrecognized floating-point format." msgstr "" "A tömörítési eltérés nem a szokásos 100 érték, vagy a rendszerfájl " "ismeretlen lebegőpontos formátumot használ." #: src/data/sys-file-reader.c:1102 msgid "Variable label indicator field is not 0 or 1." msgstr "A változócímke jelölőmező nem 0 vagy 1." #: src/data/sys-file-reader.c:1115 msgid "Numeric missing value indicator field is not -3, -2, 0, 1, 2, or 3." msgstr "A numerikus hiányzó adat jelölőmező nem -3, -2, 0, 1, 2 vagy 3." #: src/data/sys-file-reader.c:1125 msgid "String missing value indicator field is not 0, 1, 2, or 3." msgstr "A karakterlánc hiányzó adat jelölőmező nem 0, 1, 2 vagy 3." #: src/data/sys-file-reader.c:1152 #, c-format msgid "Invalid number of labels %u." msgstr "Érvénytelen számú címke: %u." #: src/data/sys-file-reader.c:1185 msgid "" "Variable index record (type 4) does not immediately follow value label " "record (type 3) as it should." msgstr "" "A változó indexrekord (4. típus) nem rögtön követi az értékcímke rekordot " "(3. típus), ahogy azt kellene." #: src/data/sys-file-reader.c:1197 #, c-format msgid "" "Number of variables associated with a value label (%u) is not between 1 and " "the number of variables (%zu)." msgstr "" "Az értékcímkével (%u) kapcsolatos változók száma nem az 1 és a változók " "száma (%zu) között található." #: src/data/sys-file-reader.c:1224 #, c-format msgid "Number of document lines (%d) must be greater than 0 and less than %d." msgstr "" "A dokumentumsorok számának (%d) nagyobbnak kell lennie, mint 0, és " "kisebbnek, mint %d." #: src/data/sys-file-reader.c:1317 #, c-format msgid "Record type 7, subtype %d has bad size %u (expected %d)." msgstr "A 7. típusú, %d. altípusú rekord mérete hibás: %u (%d várt)." #: src/data/sys-file-reader.c:1321 #, c-format msgid "Record type 7, subtype %d has bad count %u (expected %d)." msgstr "A 7. típusú, %d. altípusú rekord számossága hibás: %u (%d várt)." #: src/data/sys-file-reader.c:1435 #, fuzzy, c-format #| msgid "Renaming variable with duplicate name `%s' to `%s'." msgid "Renaming variable with invalid name `%s' to `%s'." msgstr "Ismétlődő nevű változó átnevezése, erről: „%s”, erre: „%s”." #: src/data/sys-file-reader.c:1517 msgid "Missing string continuation record." msgstr "Hiányzó karakterlánc folytatási rekord." #: src/data/sys-file-reader.c:1550 #, c-format msgid "Variable %s with width %d has invalid print format 0x%x." msgstr "A(z) %s, %d szélességű változó nyomtatási formátuma érvénytelen: 0x%x." #: src/data/sys-file-reader.c:1554 #, c-format msgid "Variable %s with width %d has invalid write format 0x%x." msgstr "A(z) %s, %d szélességű változó kiíratási formátuma érvénytelen: 0x%x." #: src/data/sys-file-reader.c:1559 msgid "Suppressing further invalid format warnings." msgstr "További érvénytelen formátum figyelmeztetések elvetése." #: src/data/sys-file-reader.c:1613 #, c-format msgid "" "Floating-point representation indicated by system file (%d) differs from " "expected (%d)." msgstr "" "A rendszerfájl által jelölt lebegőpontos ábrázolás (%d) eltér a várttól (%d)." #: src/data/sys-file-reader.c:1629 #, c-format msgid "" "Integer format indicated by system file (%d) differs from expected (%d)." msgstr "A rendszerfájl által jelölt egész ábrázolás (%d) eltér a várttól (%d)." #: src/data/sys-file-reader.c:1647 src/data/sys-file-reader.c:1653 #, c-format msgid "File specifies unexpected value %g (%a) as %s, instead of %g (%a)." msgstr "A fájl váratlan értéket ad meg: %g (%a) mint %s, ehelyett: %g (%a)." #: src/data/sys-file-reader.c:1662 #, c-format msgid "" "File specifies unexpected value %g (%a) as %s, instead of %g (%a) or %g (%a)." msgstr "" "A fájl váratlan értéket ad meg: %g (%a) mint %s, ehelyett: %g (%a) vagy %g " "(%a)." #: src/data/sys-file-reader.c:1714 src/data/sys-file-reader.c:1733 #, c-format msgid "Missing space following `%c' at offset %zu in MRSETS record." msgstr "" "Hiányzó szóköz a(z) „%c” után, a(z) %zu eltolásnál, az MRSETS rekordban." #: src/data/sys-file-reader.c:1741 #, c-format msgid "" "Missing label source value following `E' at offset %zu in MRSETS record." msgstr "" "Hiányzó címke forrásérték az „E” után, a(z) %zu eltolásnál, az MRSETS " "rekordban." #: src/data/sys-file-reader.c:1748 #, c-format msgid "" "Unexpected label source value following `E' at offset %zu in MRSETS record." msgstr "" "Váratlan címke forrásérték az „E” után, a(z) %zu eltolásnál, az MRSETS " "rekordban." #: src/data/sys-file-reader.c:1755 #, c-format msgid "Missing `C', `D', or `E' at offset %zu in MRSETS record." msgstr "Hiányzó „C”, „D” vagy „E” a(z) %zu eltolásnál, az MRSETS rekordban." #: src/data/sys-file-reader.c:1782 #, c-format msgid "Missing new-line parsing variable names at offset %zu in MRSETS record." msgstr "" "Hiányzó újsor feldolgozási változónevek a(z) %zu eltolásnál, az MRSETS " "rekordban." #: src/data/sys-file-reader.c:1817 #, c-format msgid "Invalid multiple response set name `%s'." msgstr "Érvénytelen nevű többértékű válaszhalmaz név: „%s”." #: src/data/sys-file-reader.c:1850 #, c-format msgid "MRSET %s contains duplicate variable name %s." msgstr "A(z) %s MRSET ismételt változónevet tartalmaz: %s." #: src/data/sys-file-reader.c:1865 #, c-format msgid "MRSET %s contains both string and numeric variables." msgstr "A(z) %s MRSET karakterlánc és numerikus változókat is tartalmaz." #: src/data/sys-file-reader.c:1877 #, c-format msgid "MRSET %s has no variables." msgstr "A(z) %s MRSET nem tartalmaz változókat." #: src/data/sys-file-reader.c:1879 #, c-format msgid "MRSET %s has only one variable." msgstr "A(z) %s MRSET csak egy változót tartalmaz." #: src/data/sys-file-reader.c:1923 #, c-format msgid "Extension 11 has bad count %u (for %zu variables)." msgstr "A 11. kiegészítőnek hibás darabszáma van: %u (%zu változónál)." #: src/data/sys-file-reader.c:1956 #, c-format msgid "" "Invalid variable display parameters for variable %zu (%s). Default " "parameters substituted." msgstr "" "Érvénytelen változómegjelenítési paraméterek a(z) %zu változóhoz (%s). " "Alapértelmezett paraméterek behelyettesítve." #: src/data/sys-file-reader.c:2000 #, c-format msgid "Duplicate long variable name `%s'." msgstr "Ismételt hosszú változónév: „%s”." #: src/data/sys-file-reader.c:2053 #, c-format msgid "Long variable mapping from %s to invalid variable name `%s'." msgstr "A(z) %s hosszú változónév leképezése az érvénytelen „%s” változónévre." #: src/data/sys-file-reader.c:2088 #, c-format msgid "%s listed as string of invalid length %s in very long string record." msgstr "" "Érvénytelen %2$s hosszú karakterláncaként felsorolt %1$s egy nagyon hosszú " "karakterláncrekordban." #: src/data/sys-file-reader.c:2099 #, c-format msgid "" "%s listed in very long string record with width %s, which requires only one " "segment." msgstr "" "%s szélességű nagyon hosszú karakterláncrekordban felsorolt %s, amely csak " "egyetlen szakaszt igényel." #: src/data/sys-file-reader.c:2107 #, c-format msgid "Very long string %s overflows dictionary." msgstr "A(z) %s nagyon hosszú karakterlánc túlcsordulást okoz." #: src/data/sys-file-reader.c:2125 #, c-format msgid "" "Very long string with width %ld has segment %d of width %d (expected %d)." msgstr "" "A(z) %ld hosszúságú nagyon hosszú karakterlánc %d. szegmense %d széles " "(várt: %d)." #: src/data/sys-file-reader.c:2183 #, fuzzy, c-format #| msgid "Variable index %d not in valid range 1...%zu." msgid "Value label variable index %d not in valid range 1...%zu." msgstr "A(z) %d változóindex nincs az érvényes 1..%zu tartományban." #: src/data/sys-file-reader.c:2193 #, fuzzy, c-format #| msgid "Variable index %d refers to long string continuation." msgid "Value label variable index %d refers to long string continuation." msgstr "A(z) %d változóindex egy hosszú karakterlánc folytatására hivatkozik." #: src/data/sys-file-reader.c:2208 #, c-format msgid "" "Variables associated with value label are not all of identical type. " "Variable %s is %s, but variable %s is %s." msgstr "" "Az értékcímkével kapcsolatos változók nem azonos típusúak. A(z) %s változó " "%s, de a(z) %s változó %s." #: src/data/sys-file-reader.c:2226 #, c-format msgid "" "Value labels may not be added to long string variables (e.g. %s) using " "records types 3 and 4." msgstr "" "Értékcímkék nem adhatóak a nagyon hosszú karakterláncokhoz (pl. %s) 3. vagy " "4. típusú rekordok használatával." #: src/data/sys-file-reader.c:2255 #, c-format msgid "Duplicate value label for %g on %s." msgstr "Ismételt értékcímke ehhez: %g, itt: %s." #: src/data/sys-file-reader.c:2260 src/data/sys-file-reader.c:2600 #, c-format msgid "Duplicate value label for `%.*s' on %s." msgstr "Ismételt értékcímke ehhez: „%.*s”, itt: %s." #: src/data/sys-file-reader.c:2283 #, fuzzy, c-format #| msgid "Suppressed %d additional related warnings." msgid "Suppressed %d additional warnings for value labels." msgstr "%d további kapcsolódó figyelmeztetés elrejtve." #: src/data/sys-file-reader.c:2297 #, fuzzy, c-format #| msgid "Variable index %d not in valid range 1...%zu." msgid "" "Weight variable index %d not in valid range 1...%zu. Treating file as " "unweighted." msgstr "A(z) %d változóindex nincs az érvényes 1..%zu tartományban." #: src/data/sys-file-reader.c:2307 #, fuzzy, c-format #| msgid "Variable index %d refers to long string continuation." msgid "" "Weight variable index %d refers to long string continuation. Treating file " "as unweighted." msgstr "A(z) %d változóindex egy hosszú karakterlánc folytatására hivatkozik." #: src/data/sys-file-reader.c:2315 #, c-format msgid "Ignoring string variable `%s' set as weighting variable." msgstr "" "A(z) „%s” súlyként beállított karakterlánc változó figyelmen kívül hagyása." #: src/data/sys-file-reader.c:2352 #, c-format msgid "Error parsing attribute value %s[%d]." msgstr "Hiba a(z) %s[%d] attribútumérték feldolgozásakor." #: src/data/sys-file-reader.c:2366 #, c-format msgid "Attribute value %s[%d] is not quoted: %s." msgstr "A(z) %s[%d] attribútumérték nincs idézőjelekben: %s." #: src/data/sys-file-reader.c:2379 #, c-format msgid "Duplicate attribute %s." msgstr "Ismételt attribútum: %s." #: src/data/sys-file-reader.c:2463 #, c-format msgid "Invalid role for variable %s." msgstr "Érvénytelen szerep a(z) %s változóhoz." #: src/data/sys-file-reader.c:2472 #, c-format msgid "%zu other variables had invalid roles." msgstr "%zu más változónak volt érvénytelen szerepe." #: src/data/sys-file-reader.c:2485 #, c-format msgid "Extension record subtype %d ends unexpectedly." msgstr "A(z) %d. kiegészítő rekord altípus váratlanul véget ér." #: src/data/sys-file-reader.c:2531 #, c-format msgid "Ignoring long string value label record for unknown variable %s." msgstr "" "Hosszú karakterlánc értékcímke rekordjának figyelmen kívül hagyása a(z) %s " "ismeretlen változónál." #: src/data/sys-file-reader.c:2536 #, c-format msgid "Ignoring long string value label record for numeric variable %s." msgstr "" "Hosszú karakterlánc értékcímke rekordjának figyelmen kívül hagyása a(z) %s " "numerikus változónál." #: src/data/sys-file-reader.c:2543 #, c-format msgid "" "Ignoring long string value label record for variable %s because the record's " "width (%d) does not match the variable's width (%d)." msgstr "" "Hosszú karakterlánc értékcímke rekordjának figyelmen kívül hagyása a(z) %s " "változónál, mert a rekord szélessége (%d) nem egyezik a változó " "szélességével (%d)." #: src/data/sys-file-reader.c:2573 #, c-format msgid "" "Ignoring long string value label %zu for variable %s, with width %d, that " "has bad value width %zu." msgstr "" "A hibás, %4$zu szélességű hosszú karakterlánc %1$zu. értékcímkéjének " "figyelmen kívül hagyása a(z) %2$s, %3$d szélességű változónál." #: src/data/sys-file-reader.c:2646 #, c-format msgid "" "Long string missing values record says variable %s has %d missing values, " "but only 1 to 3 missing values are allowed." msgstr "" "A hosszú karakterlánc hiányzó érték rekordja azt mondja, hogy a(z) %s " "változónak %d hiányzó értéke van, de csak 1 és 3 közti hiányzó érték " "megengedett." #: src/data/sys-file-reader.c:2656 #, c-format msgid "Ignoring long string missing value record for unknown variable %s." msgstr "" "A hosszú karakterlánc hiányzó érték rekordja figyelmen kívül hagyva a(z) %s " "ismeretlen változónál." #: src/data/sys-file-reader.c:2661 #, c-format msgid "Ignoring long string missing value record for numeric variable %s." msgstr "" "A hosszú karakterlánc hiányzó érték rekordja figyelmen kívül hagyva a(z) %s " "numerikus változónál." #: src/data/sys-file-reader.c:2686 #, c-format msgid "" "Ignoring long string missing value %zu for variable %s, with width %d, that " "has bad value width %zu." msgstr "" "A hibás, %4$zu szélességű hosszú karakterlánc %1$zu. hiányzó értéke " "figyelmen kívül hagyása a(z) %2$s, %3$d szélességű változónál." #: src/data/sys-file-reader.c:2740 msgid "File ends in partial string value." msgstr "A fájl részleges karakterlánc értékkel ér véget." #: src/data/sys-file-reader.c:2879 msgid "" "Possible compressed data corruption: compressed spaces appear in numeric " "field." msgstr "" "Lehetséges tömörített adatsérülés: tömörített szóközök egy numerikus mezőben." #: src/data/sys-file-reader.c:3030 #, c-format msgid "Suppressed %d additional related warnings." msgstr "%d további kapcsolódó figyelmeztetés elrejtve." #: src/data/sys-file-reader.c:3076 src/data/sys-file-reader.c:3093 #, c-format msgid "Dictionary record refers to unknown variable %s." msgstr "A szótárbejegyzés a(z) %s ismeretlen változóra hivatkozik." #: src/data/sys-file-reader.c:3159 #, c-format msgid "Expecting digit at offset %zu in MRSETS record." msgstr "Számjegy várt a(z) %zu eltolásnál, az MRSETS rekordban." #: src/data/sys-file-reader.c:3167 #, c-format msgid "Expecting space at offset %zu in MRSETS record." msgstr "Szóköz várt a(z) %zu eltolásnál az MRSETS rekordban." #: src/data/sys-file-reader.c:3175 #, c-format msgid "%zu-byte string starting at offset %zu exceeds record length %zu." msgstr "" "A(z) %2$zu eltolásnál kezdődő %1$zu bájtos karakterlánc meghaladja a(z) " "%3$zu rekordhosszt." #: src/data/sys-file-reader.c:3185 #, c-format msgid "Expecting space at offset %zu following %zu-byte string." msgstr "Szóköz várt a(z) %zu eltolásnál, a %zu bájtos karakterláncot követve." #: src/data/sys-file-reader.c:3476 #, c-format msgid "Wrong ZLIB data header offset %#llx (expected %#llx)." msgstr "Hibás ZLIB adatfejléc eltolás: %#llx (várt? %#llx)." #: src/data/sys-file-reader.c:3484 #, c-format msgid "Impossible ZLIB trailer offset 0x%llx." msgstr "Lehetetlen ZLIB záró eltolás: 0x%llx." #: src/data/sys-file-reader.c:3491 #, c-format msgid "Invalid ZLIB trailer length %lld." msgstr "Érvénytelen ZLIB záró hossz: %lld." #: src/data/sys-file-reader.c:3555 #, c-format msgid "End of ZLIB trailer (0x%llx) is not file size (0x%llx)." msgstr "A ZLIB záró vége (0x%llx) nem a fájl mérete (0x%llx)." #: src/data/sys-file-reader.c:3565 #, c-format msgid "ZLIB trailer bias (%lld) differs from file header bias (%.2f)." msgstr "A ZLIB záró eltolása (%lld) eltér a fájlfejléc eltolásától (%.2f)." #: src/data/sys-file-reader.c:3575 #, c-format msgid "ZLIB trailer \"zero\" field has nonzero value %lld." msgstr "A ZLIB záró „zero” mező nemzérus értéket tartalmaz: %lld." #: src/data/sys-file-reader.c:3581 #, c-format msgid "ZLIB trailer specifies unexpected %u-byte block size." msgstr "A ZLIB záró váratlan, %u bájtos blokkméretet határoz meg." #: src/data/sys-file-reader.c:3589 #, c-format msgid "%lld-byte ZLIB trailer specifies %u data blocks (expected %lld)." msgstr "A(z) %lld bájtos ZLIB záró %u adatblokkot határoz meg (várt: %lld)." #: src/data/sys-file-reader.c:3614 #, c-format msgid "" "ZLIB block descriptor %u reported uncompressed data offset %#llx, when %#llx " "was expected." msgstr "" "A(z) %u. ZLIB blokkleíró %#llx tömörítetlen adateltolást jelentett, amikor " "%#llx érték várt." #: src/data/sys-file-reader.c:3623 #, c-format msgid "" "ZLIB block descriptor %u reported compressed data offset %#llx, when %#llx " "was expected." msgstr "" "A(z) %u. ZLIB blokkleíró %#llx tömörített adateltolást jelentett, amikor " "%#llx érték várt." #: src/data/sys-file-reader.c:3633 #, c-format msgid "" "ZLIB block descriptor %u reported block size %#x, when %#x was expected." msgstr "" "A(z) %u. ZLIB blokkleíró %#x blokkméretet jelentett, amikor %#x érték várt." #: src/data/sys-file-reader.c:3641 #, c-format msgid "" "ZLIB block descriptor %u reported block size %#x, when at most %#x was " "expected." msgstr "" "A(z) %u. ZLIB blokkleíró %#x blokkméretet jelentett, amikor legfeljebb %#x " "érték várt." #: src/data/sys-file-reader.c:3653 #, c-format msgid "" "ZLIB block descriptor %u reports compressed size %u and uncompressed size %u." msgstr "" "A(z) %u. ZLIB blokkleíró %u tömörített méretet és %u tömörítetlen méretet " "jelentett." #: src/data/sys-file-reader.c:3665 #, c-format msgid "" "ZLIB trailer is at offset %#llx but %#llx would be expected from block " "descriptors." msgstr "" "A ZLIB záró a(z) %#llx eltolásnál van, de %#llx lenne várt a blokkleírókból." #: src/data/sys-file-reader.c:3684 #, c-format msgid "ZLIB initialization failed (%s)." msgstr "A ZLIB előkészítés sikertelen (%s)." #: src/data/sys-file-reader.c:3699 #, c-format msgid "Inconsistency at end of ZLIB stream (%s)." msgstr "Inkonzisztencia a ZLIB adatfolyam végén (%s)." #: src/data/sys-file-reader.c:3758 #, c-format msgid "ZLIB stream inconsistency (%s)." msgstr "ZLIB adatfolyam inkonzisztencia (%s)." #: src/data/sys-file-reader.c:3782 msgid "Unexpected end of ZLIB compressed data." msgstr "A ZLIB tömörített adat váratlanul véget ért." #: src/data/sys-file-reader.c:3820 msgid "SPSS System File" msgstr "SPSS rendszerfájl" #: src/data/sys-file-writer.c:210 #, c-format msgid "Unknown system file version %d. Treating as version %d." msgstr "Ismeretlen rendszerfájl verzió: %d. Kezelése, mint %d. verzió." #: src/data/sys-file-writer.c:256 #, c-format msgid "Error opening `%s' for writing as a system file: %s." msgstr "Hiba a(z) „%s” fájl rendszerfájlként, írásra megnyitása közben: %s." #: src/data/sys-file-writer.c:1271 #, c-format msgid "An I/O error occurred writing system file `%s'." msgstr "Ki-/bemeneti hiba történt a(z) „%s” rendszerfájl írásakor." #: src/data/sys-file-writer.c:1378 #, c-format msgid "Failed to initialize ZLIB for compression (%s)." msgstr "A ZLIB előkészítése a tömörítéshez sikertelen (%s)." #: src/data/sys-file-writer.c:1407 #, c-format msgid "Failed to complete ZLIB stream compression (%s)." msgstr "A ZLIB adatfolyam tömörítés befejezése sikertelen (%s)." #: src/data/sys-file-writer.c:1449 #, c-format msgid "ZLIB stream compression failed (%s)." msgstr "ZLIB adatfolyam tömörítés sikertelen (%s)." #: src/data/sys-file-writer.c:1491 #, c-format msgid "%s: Seek failed (%s)." msgstr "%s: pozicionálás sikertelen (%s)." #: src/data/variable.c:58 msgid "Left" msgstr "Bal" #: src/data/variable.c:59 msgid "Right" msgstr "Jobb" #: src/data/variable.c:60 msgid "Center" msgstr "Közép" #: src/data/variable.c:66 msgid "Nominal" msgstr "Nominális" #: src/data/variable.c:67 msgid "Ordinal" msgstr "Ordinális" #: src/data/variable.c:68 src/language/stats/ks-one-sample.c:300 msgid "Scale" msgstr "Arány" #: src/data/variable.c:74 msgid "Input" msgstr "Bemenet" #. TRANSLATORS: This will be part of a filename. Please avoid whitespace. #: src/data/variable.c:75 src/output/spv/spv-writer.c:213 #: src/ui/gui/psppire-output-window.c:547 msgid "Output" msgstr "Kimenet" #: src/data/variable.c:76 msgid "Both" msgstr "Mindkettő" #: src/data/variable.c:77 src/language/dictionary/sys-file-info.c:237 #: src/ui/gui/psppire-dialog-action-crosstabs.c:86 #: src/ui/gui/psppire-dialog-action-crosstabs.c:98 #: src/ui/gui/psppire-dialog-action-crosstabs.c:133 #: src/ui/gui/psppire-dialog-action-crosstabs.c:141 #: src/ui/gui/psppire-variable-sheet.c:408 src/ui/gui/var-display.c:34 msgid "None" msgstr "Nincs" #: src/data/variable.c:78 msgid "Partition" msgstr "Partíció" #: src/data/variable.c:79 src/ui/gui/reliability.ui:37 msgid "Split" msgstr "Felosztás" #: src/data/variable.c:729 #, c-format msgid "%s (%s)" msgstr "%s (%s)" #: src/data/variable.c:1339 msgid "" "At least one case in the data file had a weight value that was user-missing, " "system-missing, zero, or negative. These case(s) were ignored." msgstr "" "Az adatfájlban legalább egy értéknek van olyan súlyértéke, amely hiányzó, " "nulla vagy negatív. Ezek az esetek figyelmen kívül lettek hagyva." #: src/language/command.c:207 src/language/stats/graph.c:749 #: src/language/stats/graph.c:755 src/language/stats/graph.c:789 #: src/language/stats/graph.c:794 src/language/stats/graph.c:799 #: src/language/stats/graph.c:852 src/language/stats/graph.c:857 #: src/language/stats/graph.c:862 src/language/stats/graph.c:867 #: src/language/stats/graph.c:872 src/language/stats/graph.c:877 #: src/language/stats/graph.c:882 src/language/utilities/set.q:236 #, c-format msgid "%s is not yet implemented." msgstr "%s még nem megvalósított." #: src/language/command.c:212 #, c-format msgid "%s may be used only in testing mode." msgstr "%s csak tesztelési módban használható." #: src/language/command.c:217 #, c-format msgid "%s may be used only in enhanced syntax mode." msgstr "%s csak fejlett szintaktikai módban használható." #: src/language/command.c:345 msgid "expecting command name" msgstr "parancsnév várt" #: src/language/command.c:347 #, c-format msgid "Unknown command `%s'." msgstr "Ismeretlen parancs: „%s”." #: src/language/command.c:380 #, c-format msgid "%s is allowed only before the active dataset has been defined." msgstr "%s csak az aktív adathalmaz megadása előtt engedélyezett." #: src/language/command.c:384 #, c-format msgid "%s is allowed only after the active dataset has been defined." msgstr "%s csak az aktív adathalmaz megadása után engedélyezett." #: src/language/command.c:388 src/language/command.c:392 #, c-format msgid "%s is allowed only inside %s." msgstr "%s csak ezen belül engedélyezett: %s." #: src/language/command.c:399 src/language/command.c:403 #, c-format msgid "" "%s is allowed only before the active dataset has been defined or inside %s." msgstr "" "%s csak az aktív adathalmaz megadása előtt vagy a következőn belül " "engedélyezett: %s." #: src/language/command.c:407 src/language/command.c:411 #, c-format msgid "" "%s is allowed only after the active dataset has been defined or inside %s." msgstr "" "%s csak az aktív adathalmaz megadása után vagy a következőn belül " "engedélyezett: %s." #: src/language/command.c:415 #, c-format msgid "%s is allowed only inside %s or inside %s." msgstr "%s csak ezeken belül engedélyezett: %s vagy %s." #: src/language/command.c:421 #, c-format msgid "" "%s is allowed only after the active dataset has been defined, inside INPUT " "PROGRAM, or inside FILE TYPE." msgstr "" "%s csak az aktív adathalmaz megadása után engedélyezett, az INPUT PROGRAM, " "vagy a FILE TYPE parancson belül." #: src/language/command.c:426 #, c-format msgid "" "%s is allowed only before the active dataset has been defined, inside INPUT " "PROGRAM, or inside FILE TYPE." msgstr "" "%s csak az aktív adathalmaz megadása előtt engedélyezett, az INPUT PROGRAM, " "vagy a FILE TYPE parancson belül." #: src/language/command.c:444 src/language/command.c:447 #, c-format msgid "%s is not allowed inside %s." msgstr "%s ezen belül nem engedélyezett: %s." #: src/language/command.c:529 src/language/utilities/host.c:272 #: src/language/utilities/permissions.c:105 #, c-format msgid "This command not allowed when the %s option is set." msgstr "Ez a parancs nem engedélyezett, ha a(z) %s opció be van állítva." #: src/language/command.c:545 #, c-format msgid "Error removing `%s': %s." msgstr "Hiba a(z) „%s” eltávolításakor: %s." #: src/language/lexer/lexer.c:296 #, c-format msgid "expecting %s" msgstr "%s várt" #: src/language/lexer/lexer.c:300 #, c-format msgid "expecting %s or %s" msgstr "%s vagy %s várt" #: src/language/lexer/lexer.c:304 #, c-format msgid "expecting %s, %s, or %s" msgstr "%s, %s vagy %s várt" #: src/language/lexer/lexer.c:309 #, c-format msgid "expecting %s, %s, %s, or %s" msgstr "%s, %s, %s vagy %s várt" #: src/language/lexer/lexer.c:314 #, c-format msgid "expecting %s, %s, %s, %s, or %s" msgstr "%s, %s, %s, %s vagy %s várt" #: src/language/lexer/lexer.c:319 #, c-format msgid "expecting %s, %s, %s, %s, %s, or %s" msgstr "%s, %s, %s, %s, %s vagy %s várt" #: src/language/lexer/lexer.c:325 #, c-format msgid "expecting %s, %s, %s, %s, %s, %s, or %s" msgstr "%s, %s, %s, %s, %s, %s vagy %s várt" #: src/language/lexer/lexer.c:331 #, c-format msgid "expecting %s, %s, %s, %s, %s, %s, %s, or %s" msgstr "%s, %s, %s, %s, %s, %s, %s vagy %s várt" #: src/language/lexer/lexer.c:351 #, c-format msgid "Subcommand %s may only be specified once." msgstr "A(z) %s alparancs csak egyszer adható meg." #: src/language/lexer/lexer.c:363 #, c-format msgid "Required subcommand %s was not specified." msgstr "A szükséges %s alparancs nem lett megadva." #: src/language/lexer/lexer.c:371 #, c-format msgid "%s may only be specified once within subcommand %s" msgstr "a(z) %s csak egyszer adható meg a(z) %s alparancson belül" #: src/language/lexer/lexer.c:380 #, c-format msgid "Required %s specification missing from %s subcommand" msgstr "A szükséges %s megadás hiányzik a(z) %s alparancsból" #: src/language/lexer/lexer.c:399 msgid "Syntax error at end of input" msgstr "Szintaktikai hiba a bemenet végén" #: src/language/lexer/lexer.c:420 src/language/xforms/select-if.c:60 #: src/language/stats/autorecode.c:206 src/language/stats/npar.c:503 #: src/language/data-io/print-space.c:83 msgid "expecting end of command" msgstr "parancs vége várt" #: src/language/lexer/lexer.c:631 msgid "expecting string" msgstr "karakterlánc várt" #: src/language/lexer/lexer.c:660 msgid "expecting integer" msgstr "egész várt" #: src/language/lexer/lexer.c:673 msgid "expecting number" msgstr "szám várt" #: src/language/lexer/lexer.c:685 msgid "expecting identifier" msgstr "azonosító várt" #: src/language/lexer/lexer.c:1272 msgid "Syntax error at end of command" msgstr "Szintaktikai hiba a parancs végén" #: src/language/lexer/lexer.c:1281 #, c-format msgid "Syntax error at `%s'" msgstr "Szintaktikai hiba itt: „%s”" #: src/language/lexer/lexer.c:1284 msgid "Syntax error" msgstr "Szintaktikai hiba" #: src/language/lexer/lexer.c:1470 #, c-format msgid "String of hex digits has %d characters, which is not a multiple of 2" msgstr "" "A hexadecimális számjegyekből álló karakterlánc %d karakter hosszú, amely " "nem a 2 többszöröse" #: src/language/lexer/lexer.c:1477 #, c-format msgid "`%c' is not a valid hex digit" msgstr "a(z) „%c” nem érvényes hexadecimális számjegy" #: src/language/lexer/lexer.c:1482 #, c-format msgid "" "Unicode string contains %d bytes, which is not in the valid range of 1 to 8 " "bytes" msgstr "" "A Unicode karakterlánc %d bájtot tartalmaz, amely nem esik bele az érvényes " "1-8 bájtos tartományba" #: src/language/lexer/lexer.c:1488 #, c-format msgid "U+%04X is not a valid Unicode code point" msgstr "U+%04X nem érvényes Unicode kódpont" #: src/language/lexer/lexer.c:1493 msgid "Unterminated string constant" msgstr "Nem lezárt karakterlánc állandó" #: src/language/lexer/lexer.c:1497 #, c-format msgid "Missing exponent following `%s'" msgstr "Hiányzó exponens a(z) „%s” után" #: src/language/lexer/lexer.c:1502 msgid "Unexpected `.' in middle of command" msgstr "Váratlan „.” a parancs közben" #: src/language/lexer/lexer.c:1508 #, c-format msgid "Bad character %s in input" msgstr "Hibás karakter a bemenetben: %s" #: src/language/lexer/lexer.c:1603 #, c-format msgid "Opening `%s': %s." msgstr "A(z) „%s” megnyitása: %s." #: src/language/lexer/lexer.c:1647 #, c-format msgid "Error closing `%s': %s." msgstr "Hiba a(z) „%s” lezárásakor: %s." #: src/language/lexer/subcommand-list.c:118 #, c-format msgid "No more than %d %s subcommands allowed." msgstr "Nem több, mint %d %s alparancs megengedett." #: src/language/lexer/format-parser.c:77 msgid "expecting valid format specifier" msgstr "érvényes formátummegadó várt" #: src/language/lexer/format-parser.c:116 #: src/language/lexer/format-parser.c:143 src/language/utilities/output.c:108 #: src/language/data-io/data-list.c:453 src/language/data-io/get-data.c:638 #: src/language/data-io/placement-parser.c:236 #, c-format msgid "Unknown format type `%s'." msgstr "Ismeretlen formátumtípus: „%s”." #: src/language/lexer/format-parser.c:122 #, c-format msgid "Format specifier `%s' lacks required width." msgstr "A(z) „%s” formátummegadóban hiányzik a szükséges szélesség." #: src/language/lexer/format-parser.c:138 msgid "expecting format type" msgstr "formátumtípus várt" #: src/language/lexer/value-parser.c:66 #, c-format msgid "" "The high end of the range (%.*g) is below the low end (%.*g). The range " "will be treated as if reversed." msgstr "" "A tartomány vége (%.*g) az eleje (%.*g) előtt található. A tartomány " "fordítva lesz kezelve." #: src/language/lexer/value-parser.c:74 #, c-format msgid "Ends of range are equal (%.*g)." msgstr "A tartomány végei megegyeznek (%.*g)." #: src/language/lexer/value-parser.c:82 #, c-format msgid "%s or %s must be part of a range." msgstr "%s vagy %s egy tartományon belül kell legyen." #: src/language/lexer/value-parser.c:112 msgid "System-missing value is not valid here." msgstr "A hiányzó érték itt nem érvényes." #: src/language/lexer/variable-parser.c:86 utilities/pspp-convert.c:83 msgid "expecting variable name" msgstr "változónév várt" #: src/language/lexer/variable-parser.c:96 #, c-format msgid "%s is not a variable name." msgstr "%s nem egy változónév." #: src/language/lexer/variable-parser.c:206 #, c-format msgid "" "%s is not a numeric variable. It will not be included in the variable list." msgstr "%s nem egy numerikus változó. Nem fog bekerülni a változólistába." #: src/language/lexer/variable-parser.c:209 #, c-format msgid "" "%s is not a string variable. It will not be included in the variable list." msgstr "%s nem egy karakterlánc változó. Nem fog bekerülni a változólistába." #: src/language/lexer/variable-parser.c:213 #, c-format msgid "Scratch variables (such as %s) are not allowed here." msgstr "A segédváltozók (mint a(z) %s) itt nem megengedettek." #: src/language/lexer/variable-parser.c:217 #, c-format msgid "" "%s and %s are not the same type. All variables in this variable list must " "be of the same type. %s will be omitted from the list." msgstr "" "A(z) %s és %s nem azonos típusú. Minden változónak azonos típusúnak kell " "lennie. A(z) %s ki lesz hagyva a listából." #: src/language/lexer/variable-parser.c:223 #, c-format msgid "" "%s and %s are string variables with different widths. All variables in this " "variable list must have the same width. %s will be omitted from the list." msgstr "" "A(z) %s és %s különböző szélességű karakterlánc változók. Minden változónak " "azonos típusúnak kell lennie. A(z) %s ki lesz hagyva a listából." #: src/language/lexer/variable-parser.c:228 #: src/language/lexer/variable-parser.c:447 #, c-format msgid "Variable %s appears twice in variable list." msgstr "A(z) %s változó kétszer szerepel a változólistában." #: src/language/lexer/variable-parser.c:341 #, c-format msgid "%s TO %s is not valid syntax since %s precedes %s in the dictionary." msgstr "" "A(z) „%s TO %s” érvénytelen szintaxis, mert a(z) %s megelőzi a(z) %s-t a " "szótárban." #: src/language/lexer/variable-parser.c:349 #, c-format msgid "" "When using the TO keyword to specify several variables, both variables must " "be from the same variable dictionaries, of either ordinary, scratch, or " "system variables. %s is a %s variable, whereas %s is %s." msgstr "" "Amikor a TO kulcsszót több változó megadására használja, akkor mindkettő " "ugyanabban a szótárban kell legyen, a szokásos, segéd vagy rendszerváltozók " "között. A(z) %s egy %s változó, de a(z) %s egy %s." #: src/language/lexer/variable-parser.c:424 #, c-format msgid "`%s' cannot be used with TO because it does not end in a digit." msgstr "A(z) „%s” nem használható a TO-val, mert nem számjegyre végződik." #: src/language/lexer/variable-parser.c:432 #, c-format msgid "Numeric suffix on `%s' is larger than supported with TO." msgstr "A(z) „%s” numerikus szuffixuma nagyobb, mint amit a TO támogat." #: src/language/lexer/variable-parser.c:505 msgid "Scratch variables not allowed here." msgstr "A segédváltozók itt nem megengedettek." #: src/language/lexer/variable-parser.c:529 msgid "Prefixes don't match in use of TO convention." msgstr "A prefixek nem egyeznek a TO konvencióban." #: src/language/lexer/variable-parser.c:534 msgid "Bad bounds in use of TO convention." msgstr "Hibás korlátok a TO konvencióban." #: src/language/xforms/compute.c:150 src/language/xforms/compute.c:205 #, c-format msgid "" "When executing COMPUTE: SYSMIS is not a valid value as an index into vector " "%s." msgstr "" "A COMPUTE végrehajtásakor: a SYSMIS érvénytelen érték indexként a(z) %s " "vektorhoz." #: src/language/xforms/compute.c:154 src/language/xforms/compute.c:212 #, c-format msgid "" "When executing COMPUTE: %.*g is not a valid value as an index into vector %s." msgstr "" "A COMPUTE végrehajtásakor: a %.*g érvénytelen érték indexként a(z) %s " "vektorhoz." #: src/language/xforms/compute.c:356 #, c-format msgid "There is no vector named %s." msgstr "Nincs %s nevű vektor." #: src/language/xforms/count.c:125 msgid "Destination cannot be a string variable." msgstr "A cél nem lehet egy karakterlánc változó." #: src/language/xforms/sample.c:76 msgid "The sampling factor must be between 0 and 1 exclusive." msgstr "A mintavételi faktor 0 és 1 között (nyílt intervallum) kell legyen." #: src/language/xforms/sample.c:96 #, c-format msgid "Cannot sample %d observations from a population of %d." msgstr "Nem vételezhető %d megfigyelés egy %d-elemű populációból." #: src/language/xforms/recode.c:261 msgid "" "Inconsistent target variable types. Target variables must be all numeric or " "all string." msgstr "" "Inkonzisztens célváltozó típus. A célváltozóknak mind numerikusnak vagy " "karakterláncnak kell lenniük." #: src/language/xforms/recode.c:282 msgid "CONVERT requires string input values and numeric output values." msgstr "" "A CONVERT karakterlánc bemeneti értékeket és numerikus kimeneti értékeket " "vár." #: src/language/xforms/recode.c:339 #, c-format msgid "%s is not allowed with string variables." msgstr "%s nem megengedett karakterlánc változókkal." #: src/language/xforms/recode.c:422 msgid "expecting output value" msgstr "kimeneti érték várt" #: src/language/xforms/recode.c:479 #, c-format msgid "" "%zu variable(s) cannot be recoded into %zu variable(s). Specify the same " "number of variables as source and target variables." msgstr "" "%zu változó nem kódolható át %zu változóba. Adjon meg ugyanannyi változót " "forrás és célváltozóként." #: src/language/xforms/recode.c:494 #, c-format msgid "" "There is no variable named %s. (All string variables specified on INTO must " "already exist. Use the STRING command to create a string variable.)" msgstr "" "Nincs %s nevű változó. (Minden az INTO-ban megadott karakterlánc változónak " "léteznie kell. Használja a STRING parancsot egy karakterlánc változó " "létrehozásához.)" #: src/language/xforms/recode.c:510 #, c-format msgid "INTO is required with %s input values and %s output values." msgstr "INTO szükséges %s bemeneti és %s kimeneti értékkel." #: src/language/xforms/recode.c:523 #, c-format msgid "Type mismatch. Cannot store %s data in %s variable %s." msgstr "Típuseltérés. Nem tárolható %s adat az %s, %s változóban." #: src/language/xforms/recode.c:566 #, c-format msgid "" "Cannot recode because the variable %s would require a width of %d bytes or " "greater, but it has a width of only %d bytes." msgstr "" "Nem lehet átkódolni, mert a(z) %s változóhoz %d vagy több bájt szélesség " "szükséges, de csak %d bájt széles." #: src/language/xforms/select-if.c:100 msgid "Syntax error expecting OFF or BY. Turning off case filtering." msgstr "Szintaktikai hiba: OFF vagy BY várt. Az esetszűrés kikapcsolása." #: src/language/xforms/select-if.c:115 msgid "The filter variable must be numeric." msgstr "A szűrőváltozónak numerikusnak kell lennie." #: src/language/xforms/select-if.c:121 msgid "The filter variable may not be scratch." msgstr "A szűrőváltozó nem lehet segédváltozó." #: src/language/control/control-stack.c:49 #, c-format msgid "%s without %s." msgstr "%s %s nélkül." #: src/language/control/control-stack.c:77 #, c-format msgid "This command must appear inside %s...%s, without intermediate %s...%s." msgstr "Ez a parancs ezen belül kell legyen: %s…%s, köztes %s…%s nélkül." #: src/language/control/control-stack.c:94 #, c-format msgid "This command cannot appear outside %s...%s." msgstr "Ez a parancs nem használható ezen kívül: %s...%s." #: src/language/control/do-if.c:180 #, c-format msgid "This command may not follow %s in %s ... %s." msgstr "Ez a parancs nem követheti ezt: %s, itt: %s ... %s." #: src/language/control/loop.c:211 msgid "Only one index clause may be specified." msgstr "Csak egy index tagmondat adható meg." #: src/language/control/repeat.c:120 #, c-format msgid "Dummy variable name `%s' hides dictionary variable `%s'." msgstr "" "Az előállított „%s” nevű változó elrejti a szótárban szereplő „%s” változót." #: src/language/control/repeat.c:126 #, c-format msgid "Dummy variable name `%s' is given twice." msgstr "Az előállított „%s” nevű változó kétszer van megadva." #: src/language/control/repeat.c:170 #, c-format msgid "" "Dummy variable `%s' had %zu substitutions, so `%s' must also, but %zu were " "specified." msgstr "" "A(z) „%s” előállított változónak %zu helyettesítése van, így „%s” változónak " "is annyival kell rendelkeznie, de %zu lett megadva." #: src/language/control/repeat.c:379 msgid "Ranges may only have integer bounds." msgstr "A tartományoknak csak egész korlátja lehet." #: src/language/control/repeat.c:393 #, c-format msgid "%ld TO %ld is an invalid range." msgstr "%ld TO %ld egy érvénytelen tartomány." #: src/language/control/repeat.c:443 #, c-format msgid "No matching %s." msgstr "Nincs illeszkedő %s." #: src/language/control/temporary.c:44 msgid "" "This command may only appear once between procedures and procedure-like " "commands." msgstr "" "Ez a parancs csak egyszer adható meg procedúrák és procedúra-szerű parancsok " "között." #: src/language/dictionary/attributes.c:104 msgid "Attribute array index must be between 1 and 65535." msgstr "Az attribútum tömb indexe 1 és 65535 között kell legyen." #: src/language/dictionary/apply-dictionary.c:74 #, c-format msgid "Variable %s is %s in target file, but %s in source file." msgstr "A(z) %s változó %s a célfájlban, de %s a forrásfájlban." #: src/language/dictionary/apply-dictionary.c:110 msgid "No matching variables found between the source and target files." msgstr "Nem találhatóak illeszkedő változók a forrás és a célfájlban." #: src/language/dictionary/delete-variables.c:40 #: src/language/dictionary/modify-variables.c:79 #: src/language/dictionary/rename-variables.c:51 #, c-format msgid "" "%s may not be used after %s. Temporary transformations will be made " "permanent." msgstr "" "A(z) %s nem használható %s után. Az átmeneti transzformációk véglegesek " "lesznek." #: src/language/dictionary/delete-variables.c:48 #: src/language/dictionary/modify-variables.c:312 #, c-format msgid "" "%s may not be used to delete all variables from the active dataset " "dictionary. Use %s instead." msgstr "" "A(z) %s nem használható az aktív adathalmazkönyvtár összes változójának " "törlésére. Használja inkább ezt: %s." #: src/language/dictionary/missing-values.c:70 #, c-format msgid "" "Cannot mix numeric variables (e.g. %s) and string variables (e.g. %s) within " "a single list." msgstr "" "A numerikus (pl. %s) és karakterlánc változók (pl. %s) nem keverhetőek " "egyetlen listán belül." #: src/language/dictionary/missing-values.c:91 msgid "" "Too many numeric missing values. At most three individual values or one " "value and one range are allowed." msgstr "" "Túl sok hiányzó numerikus érték. Legfeljebb három egyedi érték, egy érték " "vagy egy tartomány megengedett." #: src/language/dictionary/missing-values.c:126 #, c-format msgid "Truncating missing value to maximum acceptable length (%d bytes)." msgstr "Hiányzó érték csonkolása a legnagyobb elfogadható hosszra (%d bájt)." #: src/language/dictionary/missing-values.c:137 msgid "" "Too many string missing values. At most three individual values are allowed." msgstr "" "Túl sok hiányzó karakterlánc érték. Legfeljebb három egyedi érték " "megengedett." #: src/language/dictionary/missing-values.c:154 #, c-format msgid "Missing values provided are too long to assign to variable of width %d." msgstr "" "A megadott hiányzó értékek túl hosszúak a(z) %d széles változóhoz " "rendeléshez." #: src/language/dictionary/modify-variables.c:145 msgid "Cannot specify ALL after specifying a set of variables." msgstr "Nem adható meg ALL egy változókészlet megadása után." #: src/language/dictionary/modify-variables.c:221 #: src/language/dictionary/rename-variables.c:76 #, c-format msgid "" "Differing number of variables in old name list (%zu) and in new name list " "(%zu)." msgstr "" "A változók száma eltér a régi névlistában (%zu) és az új névlistában (%zu)." #: src/language/dictionary/modify-variables.c:244 #: src/language/dictionary/modify-variables.c:294 #, c-format msgid "" "%s subcommand may be given at most once. It may not be given in conjunction " "with the %s subcommand." msgstr "" "A(z) %s alparancsot legfeljebb egyszer lehet megadni. Nem adható meg a(z) %s " "alparanccsal együtt." #: src/language/dictionary/modify-variables.c:331 #, c-format msgid "Unrecognized subcommand name `%s'." msgstr "Ismeretlen alparancsnév: „%s”." #: src/language/dictionary/modify-variables.c:334 msgid "Subcommand name expected." msgstr "Alparancsnév várt." #: src/language/dictionary/mrsets.c:117 #, c-format msgid "" "VARIABLES specified only variable %s on %s, but at least two variables are " "required." msgstr "" "A VARIABLES csak %s változót határozott meg itt: %s, de legalább két változó " "várt." #: src/language/dictionary/mrsets.c:150 msgid "Numeric VALUE must be an integer." msgstr "A numerikus VALUE csak egész lehet." #: src/language/dictionary/mrsets.c:230 src/language/dictionary/mrsets.c:268 #, c-format msgid "" "MDGROUP subcommand for group %s specifies a string VALUE, but the variables " "specified for this group are numeric." msgstr "" "Az MDGROUP alparancs a(z) %s csoportnál egy karakterlánc VALUE-t határoz " "meg, de az ehhez a csoporthoz meghatározott változók numerikusak." #: src/language/dictionary/mrsets.c:254 #, c-format msgid "" "VALUE string on MDGROUP subcommand for group %s is %d bytes long, but it " "must be no longer than the narrowest variable in the group, which is %s with " "a width of %d bytes." msgstr "" "A VALUE karakterlánc az MDGROUP alparancsban a(z) %s csoportnál %d bájt " "hosszú, de nem lehet hosszabb a csoport legkeskenyebb változójánál, amely " "%s, %d bájt szélességel." #: src/language/dictionary/mrsets.c:280 #, c-format msgid "" "MDGROUP subcommand for group %s specifies LABELSOURCE=VARLABEL but not " "CATEGORYLABELS=COUNTEDVALUES. Ignoring LABELSOURCE." msgstr "" "Az MDGROUP alparancs a(z) %s csoportnál a LABELSOURCE=VARLABEL értéket " "határozza meg, és nem a CATEGORYLABELS=COUNTEDVALUES értéket. A LABELSOURCE " "figyelmen kívül hagyása." #: src/language/dictionary/mrsets.c:286 #, c-format msgid "" "MDGROUP subcommand for group %s specifies both LABEL and LABELSOURCE, but " "only one of these subcommands may be used at a time. Ignoring LABELSOURCE." msgstr "" "Az MDGROUP alparancs a(z) %s csoportnál a LABEL és a LABELSOURCE alparancsot " "is meghatározza, de ezen alparancsok közül egyszerre csak az egyik " "használható. A LABELSOURCE figyelmen kívül hagyása." #: src/language/dictionary/mrsets.c:326 #, c-format msgid "" "Variables %s and %s specified as part of multiple dichotomy group %s have " "the same variable label. Categories represented by these variables will not " "be distinguishable in output." msgstr "" "A(z) %s többértékű dichotóm csoport részeként meghatározott %s és %s " "változónak ugyanolyan változócímkéje van. Az ezen változók által ábrázolt " "kategóriák nem lesznek megkülönböztethetők a kimeneten." #: src/language/dictionary/mrsets.c:356 #, c-format msgid "" "Variable %s specified as part of multiple dichotomy group %s (which has " "CATEGORYLABELS=COUNTEDVALUES) has no value label for its counted value. " "This category will not be distinguishable in output." msgstr "" "A(z) %s többértékű dichotóm csoport (amelynek CATEGORYLABELS=COUNTEDVALUES " "értéke van) részeként meghatározott %s változónak nincs változócímkéje a " "számolt értékénél. Ez a kategória nem lesz megkülönböztethető a kimeneten." #: src/language/dictionary/mrsets.c:369 #, c-format msgid "" "Variables %s and %s specified as part of multiple dichotomy group %s (which " "has CATEGORYLABELS=COUNTEDVALUES) have the same value label for the group's " "counted value. These categories will not be distinguishable in output." msgstr "" "A(z) %s többértékű dichotóm csoport (amelynek CATEGORYLABELS=COUNTEDVALUES " "értéke van) részeként meghatározott %s és %s változónak ugyanolyan " "értékcímkéje van a csoport számolt értékénél. Ezek a kategóriák nem lesznek " "megkülönböztethetők a kimeneten." #: src/language/dictionary/mrsets.c:426 #, c-format msgid "" "Variables specified on MCGROUP should have the same categories, but %s and " "%s (and possibly others) in multiple category group %s have different value " "labels for value %s." msgstr "" "Az MCGROUP alparancsban meghatározott változóknak ugyanolyan kategóriával " "kell rendelkezniük, de a(z) %s többértékű kategóriacsoportban lévő %s és %s " "(és esetleg továbbiak) különböző értékcímkékkel rendelkeznek a(z) %s " "értéknél." #: src/language/dictionary/mrsets.c:484 #, c-format msgid "No multiple response set named %s." msgstr "Nincs %s nevű többértékű válaszhalmaz." #: src/language/dictionary/mrsets.c:533 msgid "" "The active dataset dictionary does not contain any multiple response sets." msgstr "" "Az aktív adathalmazszótár nem tartalmaz egyetlen többértékű válaszhalmazt " "sem." #: src/language/dictionary/mrsets.c:540 msgid "Multiple Response Sets" msgstr "Többértékű válaszhalmazok" #: src/language/dictionary/mrsets.c:543 #: src/language/dictionary/sys-file-info.c:446 #: src/language/dictionary/sys-file-info.c:733 #: src/language/stats/autorecode.c:375 src/language/data-io/data-parser.c:679 #: src/language/data-io/data-parser.c:725 src/language/data-io/print.c:434 #, fuzzy #| msgid "Attribute" msgid "Attributes" msgstr "Attribútum" #: src/language/dictionary/mrsets.c:544 #: src/language/dictionary/sys-file-info.c:191 #: src/language/dictionary/sys-file-info.c:301 #: src/language/dictionary/sys-file-info.c:302 #: src/language/dictionary/sys-file-info.c:455 #: src/language/dictionary/sys-file-info.c:570 #: src/ui/gui/psppire-var-sheet-header.c:67 src/ui/gui/compute.ui:157 msgid "Label" msgstr "Címke" #: src/language/dictionary/mrsets.c:544 #: src/language/dictionary/sys-file-info.c:241 #, fuzzy #| msgid "Encoding:" msgid "Encoding" msgstr "Kódolás:" #: src/language/dictionary/mrsets.c:544 #, fuzzy #| msgid "Counted value" msgid "Counted Value" msgstr "Számolt érték" #: src/language/dictionary/mrsets.c:544 #, fuzzy #| msgid "Cl_ear Variables" msgid "Member Variables" msgstr "Változók tö_rlése" #: src/language/dictionary/mrsets.c:547 #: src/language/dictionary/sys-file-info.c:470 #: src/ui/gui/psppire-var-sheet-header.c:55 msgid "Name" msgstr "Név" #: src/language/dictionary/mrsets.c:564 msgid "Dichotomies" msgstr "" #: src/language/dictionary/mrsets.c:565 src/language/stats/logistic.c:1391 #, fuzzy #| msgid "Category" msgid "Categories" msgstr "Kategória" #: src/language/dictionary/numeric.c:67 #, c-format msgid "Format type %s may not be used with a numeric variable." msgstr "A(z) %s formátumtípus nem használható numerikus változóval." #: src/language/dictionary/numeric.c:86 src/language/dictionary/numeric.c:153 #, c-format msgid "There is already a variable named %s." msgstr "Már van egy %s nevű változó." #: src/language/dictionary/numeric.c:138 #, c-format msgid "Format type %s may not be used with a string variable." msgstr "A(z) %s formátumtípus nem használható karakterlánc változóval." #: src/language/dictionary/rename-variables.c:92 #, c-format msgid "Renaming would duplicate variable name %s." msgstr "Az átnevezés megismételné a(z) %s változónevet." #: src/language/dictionary/split-file.c:75 #, fuzzy #| msgid "Split File" msgid "Split Values" msgstr "Fájl felosztása" #: src/language/dictionary/split-file.c:76 #: src/language/dictionary/split-file.c:77 #: src/language/dictionary/sys-file-info.c:696 #: src/language/stats/chisquare.c:195 src/language/stats/cochran.c:156 #: src/language/stats/cochran.c:185 src/language/stats/examine.c:841 #: src/language/stats/reliability.c:648 src/language/stats/reliability.c:651 #: src/language/stats/crosstabs.q:1303 src/language/stats/crosstabs.q:1325 #: src/language/stats/crosstabs.q:1365 src/language/stats/crosstabs.q:1412 msgid "Value" msgstr "Érték" #: src/language/dictionary/split-file.c:79 #: src/language/dictionary/sys-file-info.c:734 #: src/language/stats/chisquare.c:246 src/language/stats/chisquare.c:328 #: src/language/stats/cochran.c:164 src/language/stats/correlations.c:100 #: src/language/stats/descriptives.c:1004 src/language/stats/friedman.c:226 #: src/language/stats/jonckheere-terpstra.c:377 #: src/language/stats/npar-summary.c:113 src/language/stats/quick-cluster.c:588 #: src/language/stats/runs.c:331 src/language/data-io/data-parser.c:683 #: src/language/data-io/data-parser.c:728 src/language/data-io/print.c:438 #: src/ui/gui/psppire-dictview.c:580 src/ui/gui/psppire-data-editor.c:502 msgid "Variable" msgstr "Változó" #: src/language/dictionary/sys-file-info.c:184 #, fuzzy #| msgid "_Display Data File Information" msgid "File Information" msgstr "_Adatfájl információk megjelenítése" #: src/language/dictionary/sys-file-info.c:185 msgid "Attribute" msgstr "Attribútum" #: src/language/dictionary/sys-file-info.c:187 #, fuzzy #| msgid "File:" msgid "File" msgstr "Fájl:" #: src/language/dictionary/sys-file-info.c:194 #, fuzzy #| msgid "Created:" msgid "Created" msgstr "Létrehozva:" #: src/language/dictionary/sys-file-info.c:203 #, fuzzy #| msgid "Integer Format:" msgid "Integer Format" msgstr "Egész formátum:" #: src/language/dictionary/sys-file-info.c:205 msgid "Big Endian" msgstr "Big Endian" #: src/language/dictionary/sys-file-info.c:206 msgid "Little Endian" msgstr "Little Endian" #: src/language/dictionary/sys-file-info.c:207 #: src/language/dictionary/sys-file-info.c:216 #: src/language/dictionary/sys-file-info.c:223 src/language/utilities/set.q:930 msgid "Unknown" msgstr "Ismeretlen" #: src/language/dictionary/sys-file-info.c:209 #, fuzzy #| msgid "Real Format:" msgid "Real Format" msgstr "Valós szám formátum:" #: src/language/dictionary/sys-file-info.c:211 msgid "IEEE 754 LE." msgstr "IEEE 754 LE." #: src/language/dictionary/sys-file-info.c:212 msgid "IEEE 754 BE." msgstr "IEEE 754 BE." #: src/language/dictionary/sys-file-info.c:213 msgid "VAX D." msgstr "VAX D." #: src/language/dictionary/sys-file-info.c:214 msgid "VAX G." msgstr "VAX G." #: src/language/dictionary/sys-file-info.c:215 msgid "IBM 390 Hex Long." msgstr "IBM 390 Hex Long." #: src/language/dictionary/sys-file-info.c:218 #: src/language/dictionary/sys-file-info.c:443 #: src/language/stats/binomial.c:199 src/language/stats/correlations.c:131 #: src/language/stats/correlations.c:159 src/language/stats/descriptives.c:585 #: src/language/stats/factor.c:1658 src/language/stats/factor.c:1701 #: src/language/stats/factor.c:1860 src/language/stats/factor.c:2074 #: src/language/stats/frequencies.c:1583 #: src/language/stats/kruskal-wallis.c:254 #: src/language/stats/kruskal-wallis.c:303 #: src/language/stats/ks-one-sample.c:316 src/language/stats/logistic.c:1187 #: src/language/stats/mann-whitney.c:254 src/language/stats/means.c:718 #: src/language/stats/means.c:800 src/language/stats/median.c:358 #: src/language/stats/oneway.c:985 src/language/stats/oneway.c:1157 #: src/language/stats/reliability.c:591 src/language/stats/regression.c:924 #: src/language/stats/t-test-one-sample.c:132 #: src/language/stats/t-test-paired.c:157 src/language/data-io/list.c:104 #: src/ui/gui/variable-info.ui:25 msgid "Variables" msgstr "Változók" #: src/language/dictionary/sys-file-info.c:221 src/language/stats/examine.c:929 #: src/language/stats/means.c:697 src/language/stats/reliability.c:548 #: src/language/stats/crosstabs.q:930 msgid "Cases" msgstr "Esetek" #: src/language/dictionary/sys-file-info.c:226 src/language/stats/oneway.c:980 #: src/ui/gui/psppire-var-sheet-header.c:58 src/ui/gui/compute.ui:303 msgid "Type" msgstr "Típus" #: src/language/dictionary/sys-file-info.c:230 #, fuzzy #| msgid "Weight:" msgid "Weight" msgstr "Súly:" #: src/language/dictionary/sys-file-info.c:233 #, fuzzy #| msgid "Not weighted." msgid "Not weighted" msgstr "Nem súlyozott." #: src/language/dictionary/sys-file-info.c:235 #, fuzzy #| msgid "Compression:" msgid "Compression" msgstr "Tömörítés:" #: src/language/dictionary/sys-file-info.c:245 #: src/language/dictionary/sys-file-info.c:424 #: src/language/dictionary/sys-file-info.c:426 #, fuzzy #| msgid "Comments:" msgid "Documents" msgstr "Megjegyzések:" #: src/language/dictionary/sys-file-info.c:305 #: src/language/dictionary/sys-file-info.c:430 msgid "(none)" msgstr "" #: src/language/dictionary/sys-file-info.c:393 msgid "No variables to display." msgstr "Nincsenek megjeleníthető változók." #: src/language/dictionary/sys-file-info.c:404 msgid "Macros not supported." msgstr "A makrók nem támogatottak." #: src/language/dictionary/sys-file-info.c:426 #, fuzzy #| msgid "Document Line %zu" msgid "Document" msgstr "%zu. dokumentumsor" #: src/language/dictionary/sys-file-info.c:454 msgid "Position" msgstr "Pozíció" #: src/language/dictionary/sys-file-info.c:456 msgid "Measurement Level" msgstr "" #: src/language/dictionary/sys-file-info.c:457 #: src/ui/gui/psppire-var-sheet-header.c:85 msgid "Role" msgstr "Szerep" #: src/language/dictionary/sys-file-info.c:458 #: src/ui/gui/psppire-var-sheet-header.c:61 src/ui/gui/compute.ui:215 msgid "Width" msgstr "Szélesség" #: src/language/dictionary/sys-file-info.c:459 #, fuzzy #| msgid "Align" msgid "Alignment" msgstr "Igazítás" #: src/language/dictionary/sys-file-info.c:460 #: src/language/dictionary/sys-file-info.c:734 msgid "Print Format" msgstr "Nyomtatási formátum" #: src/language/dictionary/sys-file-info.c:461 #, fuzzy #| msgid "Print Format" msgid "Write Format" msgstr "Nyomtatási formátum" #: src/language/dictionary/sys-file-info.c:462 #: src/ui/gui/missing-val-dialog.c:379 src/ui/gui/psppire-var-sheet-header.c:73 #: src/ui/gui/examine.ui:416 src/ui/gui/t-test.ui:105 msgid "Missing Values" msgstr "Hiányzó értékek" #: src/language/dictionary/sys-file-info.c:567 #: src/ui/gui/psppire-var-sheet-header.c:70 src/ui/gui/val-labs-dialog.c:489 #: src/ui/gui/val-labs-dialog.ui:194 msgid "Value Labels" msgstr "Értékcímkék" #: src/language/dictionary/sys-file-info.c:573 #, fuzzy #| msgid "Variable View" msgid "Variable Value" msgstr "Változónézet" #: src/language/dictionary/sys-file-info.c:577 #, fuzzy #| msgid "Last non-missing value" msgid "User-missing value" msgstr "Utolsó nem hiányzó érték" #: src/language/dictionary/sys-file-info.c:693 #, fuzzy #| msgid "Variable under test" msgid "Variable and Dataset Attributes" msgstr "Próba alatti változó" #: src/language/dictionary/sys-file-info.c:699 #, fuzzy #| msgid "Variable Name: " msgid "Variable and Name" msgstr "Változónév: " #: src/language/dictionary/sys-file-info.c:702 #, fuzzy #| msgid "dataset" msgid "(dataset)" msgstr "adathalmaz" #: src/language/dictionary/sys-file-info.c:722 msgid "No vectors defined." msgstr "Nincsenek vektorok meghatározva." #: src/language/dictionary/sys-file-info.c:732 #, fuzzy #| msgid "Vector" msgid "Vectors" msgstr "Vektor" #: src/language/dictionary/sys-file-info.c:736 msgid "Vector and Position" msgstr "" #: src/language/dictionary/sys-file-info.c:998 msgid "No valid encodings found." msgstr "Nem található érvényes kódolás." #: src/language/dictionary/sys-file-info.c:1004 #, c-format msgid "Usable encodings for %s." msgstr "Használható kódolások ehhez: %s." #: src/language/dictionary/sys-file-info.c:1007 #, c-format msgid "" "Encodings that can successfully read %s (by specifying the encoding name on " "the GET command's ENCODING subcommand). Encodings that yield identical text " "are listed together." msgstr "" "Karakterkódolások, amelyek sikeresen olvashatják ezt: %s (megadva a kódolás " "nevét a GET parancs ENCODING alparancsában). Azok a kódolások, amelyek " "azonos szöveget eredményeznek együtt felsoroltak." #: src/language/dictionary/sys-file-info.c:1012 #: src/language/dictionary/sys-file-info.c:1013 msgid "Encodings" msgstr "Kódolások" #: src/language/dictionary/sys-file-info.c:1042 #, fuzzy, c-format #| msgid "%s encoded text strings." msgid "%s Encoded Text Strings" msgstr "%s kódolású karakterláncok." #: src/language/dictionary/sys-file-info.c:1046 msgid "" "Text strings in the file dictionary that the previously listed encodings " "interpret differently, along with the interpretations." msgstr "" "Olyan szöveg karakterláncok a fájlszótárban, amelyeket a korábban felsorolt " "kódolások eltérően értelmeztek, valamint ezek értelmezései." #: src/language/dictionary/sys-file-info.c:1049 src/output/text-item.c:57 #: src/ui/gui/psppire-import-assistant.c:885 msgid "Text" msgstr "Szöveg" #: src/language/dictionary/sys-file-info.c:1059 msgid "Purpose" msgstr "Cél" #: src/language/dictionary/value-labels.c:154 #, c-format msgid "Truncating value label to %d bytes." msgstr "Értékcímke csonkolása %d bájtra." #: src/language/dictionary/vector.c:66 #, c-format msgid "A vector named %s already exists." msgstr "Már létezik %s nevű vektor." #: src/language/dictionary/vector.c:74 #, c-format msgid "Vector name %s is given twice." msgstr "A(z) %s vektornév kétszer lett megadva." #: src/language/dictionary/vector.c:98 msgid "A slash must separate each vector specification in VECTOR's long form." msgstr "" "Egy ferde vonal kell elválasszon minden egyes vektormegadást a VECTOR hosszú " "formájában." #: src/language/dictionary/vector.c:131 msgid "Vectors must have at least one element." msgstr "A vektoroknak legalább egy elemük kell legyen." #: src/language/dictionary/vector.c:151 msgid "expecting vector length" msgstr "vektorhossz várt" #: src/language/dictionary/vector.c:170 #, c-format msgid "%s is an existing variable name." msgstr "%s egy létező változónév." #: src/language/dictionary/variable-display.c:121 msgid "Variable display width must be a positive integer." msgstr "A megjelenítési szélesség változónak pozitív egésznek kell lennie." #: src/language/dictionary/weight.c:49 msgid "The weighting variable must be numeric." msgstr "A súlyozási változónak numerikusnak kell lennie." #: src/language/dictionary/weight.c:54 msgid "The weighting variable may not be scratch." msgstr "A súlyváltozó nem lehet segédváltozó." #: src/language/tests/moments-test.c:50 msgid "expecting weight value" msgstr "súlyérték várt" #: src/language/utilities/cd.c:45 src/language/utilities/include.c:173 #, fuzzy, c-format #| msgid "Cannot change directory to %s: %s " msgid "Cannot change directory to %s: %s" msgstr "Nem lehet átváltani a(z) %s mappára: %s " #: src/language/utilities/date.c:33 #, c-format msgid "Only %s is currently implemented." msgstr "Csak a(z) %s megvalósított jelenleg." #: src/language/utilities/host.c:60 #, fuzzy #| msgid "Command shell not supported on this platform." msgid "Time limit not supported on this platform." msgstr "A parancshéj nem támogatott ezen a platformon." #: src/language/utilities/host.c:74 #, c-format msgid "%s: Command exited with status %d." msgstr "" #: src/language/utilities/host.c:95 #, fuzzy, c-format #| msgid "failed to create temporary file" msgid "Failed to create temporary file (%s)." msgstr "átmeneti fájl létrehozása sikertelen" #: src/language/utilities/host.c:102 #, c-format msgid "/dev/null: Failed to open (%s)." msgstr "" #: src/language/utilities/host.c:117 #, c-format msgid "Couldn't fork: %s." msgstr "Nem sikerült elágaztatni: %s." #: src/language/utilities/host.c:193 #, c-format msgid "While running \"%s\", waiting for child process failed (%s)." msgstr "" #: src/language/utilities/host.c:203 #, c-format msgid "Command \"%s\" timed out." msgstr "" #: src/language/utilities/host.c:205 #, c-format msgid "Command \"%s\" terminated by signal %d." msgstr "" #: src/language/utilities/host.c:212 msgid "Command or shell not found" msgstr "" #: src/language/utilities/host.c:214 msgid "Could not invoke command or shell" msgstr "" #: src/language/utilities/host.c:217 #, c-format msgid "Command \"%s\" exited with status %d (%s)." msgstr "" #: src/language/utilities/host.c:220 #, c-format msgid "Command \"%s\" exited with status %d." msgstr "" #: src/language/utilities/host.c:230 #, c-format msgid "Command \"%s\" output could not be read (%s)." msgstr "" #: src/language/utilities/title.c:88 #, c-format msgid " (Entered %s)" msgstr " (Beírva: %s)" #: src/language/utilities/include.c:73 #, c-format msgid "Can't find `%s' in include file search path." msgstr "A(z) „%s” nem található a beágyazandó fájl keresési útvonalán." #: src/language/utilities/output.c:128 #, fuzzy, c-format #| msgid "Unknown command `%s'." msgid "Unknown cell class %s." msgstr "Ismeretlen parancs: „%s”." #: src/language/utilities/permissions.c:113 #, c-format msgid "Cannot stat %s: %s" msgstr "Nem lehet elérni: %s: %s" #: src/language/utilities/permissions.c:127 #, c-format msgid "Cannot change mode of %s: %s" msgstr "Nem lehet átváltani a(z) %s módját: %s" #: src/language/stats/aggregate.c:96 msgid "Sum of values" msgstr "Értékek összege" #: src/language/stats/aggregate.c:97 msgid "Mean average" msgstr "Mintaátlag" #: src/language/stats/aggregate.c:98 msgid "Median average" msgstr "Medián középérték" #: src/language/stats/aggregate.c:99 #: src/ui/gui/psppire-dialog-action-descriptives.c:40 #: src/ui/gui/psppire-dialog-action-frequencies.c:41 msgid "Standard deviation" msgstr "Szórás" #: src/language/stats/aggregate.c:100 #: src/ui/gui/psppire-dialog-action-descriptives.c:42 msgid "Maximum value" msgstr "Legnagyobb érték" #: src/language/stats/aggregate.c:101 #: src/ui/gui/psppire-dialog-action-descriptives.c:41 msgid "Minimum value" msgstr "Legkisebb érték" #: src/language/stats/aggregate.c:102 msgid "Percentage greater than" msgstr "Százalék nagyobb mint" #: src/language/stats/aggregate.c:103 msgid "Percentage less than" msgstr "Százelék kisebb mint" #: src/language/stats/aggregate.c:104 msgid "Percentage included in range" msgstr "Százalék a tartományon belül" #: src/language/stats/aggregate.c:105 msgid "Percentage excluded from range" msgstr "Százalék a tartományon kívül" #: src/language/stats/aggregate.c:106 msgid "Fraction greater than" msgstr "Tört nagyobb mint" #: src/language/stats/aggregate.c:107 msgid "Fraction less than" msgstr "Tört kisebb mint" #: src/language/stats/aggregate.c:108 msgid "Fraction included in range" msgstr "Tört a tartományon belül" #: src/language/stats/aggregate.c:109 msgid "Fraction excluded from range" msgstr "Tört a tartományon kívül" #: src/language/stats/aggregate.c:110 msgid "Number of cases" msgstr "Esetek száma" #: src/language/stats/aggregate.c:111 msgid "Number of cases (unweighted)" msgstr "Esetek száma (súlyozatlan)" #: src/language/stats/aggregate.c:112 msgid "Number of missing values" msgstr "Hiányzó értékek száma" #: src/language/stats/aggregate.c:113 msgid "Number of missing values (unweighted)" msgstr "Hiányzó értékek száma (súlyozatlan)" #: src/language/stats/aggregate.c:114 msgid "First non-missing value" msgstr "Első nem hiányzó érték" #: src/language/stats/aggregate.c:115 msgid "Last non-missing value" msgstr "Utolsó nem hiányzó érték" #: src/language/stats/aggregate.c:258 msgid "" "When PRESORTED is specified, specifying sorting directions with (A) or (D) " "has no effect. Output data will be sorted the same way as the input data." msgstr "" "Amikor a PRESORTED megadott, akkor az (A)-val vagy (D)-vel megadott " "rendezési irányok hatástalanok. A kimeneti adatok ugyanúgy lesznek rendezve, " "mint a bemeneti adatok." #: src/language/stats/aggregate.c:448 msgid "expecting aggregation function" msgstr "aggregációs függvény várt" #: src/language/stats/aggregate.c:460 #, c-format msgid "Unknown aggregation function %s." msgstr "Ismeretlen aggregációs függvény: %s." #: src/language/stats/aggregate.c:513 #, c-format msgid "Missing argument %zu to %s." msgstr "Hiányzó %zu. argumentum ehhez: %s." #: src/language/stats/aggregate.c:522 #, c-format msgid "Arguments to %s must be of same type as source variables." msgstr "" "A(z) %s argumentumainak ugyanolyan típusúnak kell lennie, mint a " "forrásváltozók." #: src/language/stats/aggregate.c:541 #, c-format msgid "" "Number of source variables (%zu) does not match number of target variables " "(%zu)." msgstr "A forrásváltozók száma (%zu) nem egyezik a célváltozók számával (%zu)." #: src/language/stats/aggregate.c:557 #, c-format msgid "" "The value arguments passed to the %s function are out-of-order. They will " "be treated as if they had been specified in the correct order." msgstr "" "A(z) %s függvénynek átadott értékargumentumok rossz sorrendben vannak. Úgy " "lesznek kezelve, mintha jó sorrendben lettek volna megadva." #: src/language/stats/aggregate.c:631 #, c-format msgid "" "Variable name %s is not unique within the aggregate file dictionary, which " "contains the aggregate variables and the break variables." msgstr "" "A(z) %s változónév nem egyedi abban az aggregált fájlszótárban, amely az " "aggregált változókat és a törésváltozókat tartalmazza." #: src/language/stats/autorecode.c:152 #, c-format msgid "Source variable count (%zu) does not match target variable count (%zu)." msgstr "A forrásváltozók száma (%zu) nem egyezik a célváltozók számával (%zu)." #: src/language/stats/autorecode.c:164 #, c-format msgid "Target variable %s duplicates existing variable %s." msgstr "A(z) %s célváltozó megismétli a létező %s változót." #: src/language/stats/autorecode.c:221 #, c-format msgid "" "With GROUP, variables may not mix string variables (such as %s) and numeric " "variables (such as %s)." msgstr "" #: src/language/stats/autorecode.c:363 #, fuzzy #| msgid "Recode into Same Variables" msgid "Recoding grouped variables." msgstr "Átkódolás ugyanazon változókba" #: src/language/stats/autorecode.c:365 #, fuzzy, c-format #| msgid "Replacing %s by %s: %s." msgid "Recoding %s into %s (%s)." msgstr "A(z) %s cseréje erre: %s: %s." #: src/language/stats/autorecode.c:369 #, fuzzy, c-format #| msgid "Removing %s: %s." msgid "Recoding %s into %s." msgstr "A(z) „%s” eltávolítása: %s." #: src/language/stats/autorecode.c:376 src/ui/gui/recode.ui:209 msgid "New Value" msgstr "Új érték" #: src/language/stats/autorecode.c:376 msgid "Value Label" msgstr "Értékcímke" #: src/language/stats/autorecode.c:379 #, fuzzy #| msgid "Value" msgid "Old Value" msgstr "Érték" #: src/language/stats/binomial.c:138 #, c-format msgid "Variable %s is not dichotomous" msgstr "A(z) %s változó nem dichotóm" #: src/language/stats/binomial.c:182 src/ui/gui/binomial.ui:30 msgid "Binomial Test" msgstr "Binomiális próba" #: src/language/stats/binomial.c:186 src/language/stats/chisquare.c:183 #: src/language/stats/chisquare.c:239 src/language/stats/chisquare.c:322 #: src/language/stats/cochran.c:188 src/language/stats/correlations.c:94 #: src/language/stats/correlations.c:145 src/language/stats/descriptives.c:991 #: src/language/stats/examine.c:602 src/language/stats/examine.c:742 #: src/language/stats/examine.c:836 src/language/stats/examine.c:925 #: src/language/stats/factor.c:1755 src/language/stats/factor.c:1878 #: src/language/stats/factor.c:1908 src/language/stats/factor.c:2068 #: src/language/stats/factor.c:2102 src/language/stats/frequencies.c:302 #: src/language/stats/frequencies.c:1579 src/language/stats/frequencies.c:1586 #: src/language/stats/friedman.c:250 src/language/stats/glm.c:729 #: src/language/stats/kruskal-wallis.c:249 #: src/language/stats/kruskal-wallis.c:297 #: src/language/stats/ks-one-sample.c:278 src/language/stats/logistic.c:1170 #: src/language/stats/logistic.c:1300 src/language/stats/logistic.c:1330 #: src/language/stats/jonckheere-terpstra.c:361 #: src/language/stats/mann-whitney.c:184 src/language/stats/mann-whitney.c:247 #: src/language/stats/means.c:757 src/language/stats/means.c:811 #: src/language/stats/mcnemar.c:222 src/language/stats/median.c:315 #: src/language/stats/median.c:350 src/language/stats/npar-summary.c:106 #: src/language/stats/oneway.c:973 src/language/stats/oneway.c:1051 #: src/language/stats/oneway.c:1150 src/language/stats/oneway.c:1238 #: src/language/stats/oneway.c:1373 src/language/stats/quick-cluster.c:746 #: src/language/stats/reliability.c:543 src/language/stats/reliability.c:584 #: src/language/stats/reliability.c:633 src/language/stats/reliability.c:644 #: src/language/stats/roc.c:969 src/language/stats/roc.c:1067 #: src/language/stats/regression.c:867 src/language/stats/regression.c:899 #: src/language/stats/regression.c:1023 src/language/stats/regression.c:1089 #: src/language/stats/runs.c:318 src/language/stats/sign.c:102 #: src/language/stats/t-test-indep.c:193 src/language/stats/t-test-indep.c:259 #: src/language/stats/t-test-one-sample.c:68 #: src/language/stats/t-test-one-sample.c:125 #: src/language/stats/t-test-paired.c:150 #: src/language/stats/t-test-paired.c:193 #: src/language/stats/t-test-paired.c:238 src/language/stats/wilcoxon.c:243 #: src/language/stats/wilcoxon.c:282 src/language/stats/crosstabs.q:925 #: src/language/stats/crosstabs.q:1253 src/language/stats/crosstabs.q:1293 #: src/language/stats/crosstabs.q:1302 src/language/stats/crosstabs.q:1331 #: src/language/stats/crosstabs.q:1373 src/language/stats/crosstabs.q:1418 #: src/ui/gui/crosstabs.ui:499 src/ui/gui/oneway.ui:615 msgid "Statistics" msgstr "Statisztika" #: src/language/stats/binomial.c:187 src/language/stats/chisquare.c:240 #: src/language/stats/chisquare.c:252 msgid "Category" msgstr "Kategória" #: src/language/stats/binomial.c:188 src/language/stats/cochran.c:189 #: src/language/stats/correlations.c:97 src/language/stats/correlations.c:155 #: src/language/stats/descriptives.c:993 src/language/stats/examine.c:926 #: src/language/stats/frequencies.c:1588 src/language/stats/friedman.c:251 #: src/language/stats/kruskal-wallis.c:250 #: src/language/stats/ks-one-sample.c:279 src/language/stats/logistic.c:1331 #: src/language/stats/jonckheere-terpstra.c:369 #: src/language/stats/mann-whitney.c:185 src/language/stats/means.c:710 #: src/language/stats/means-calc.c:439 src/language/stats/mcnemar.c:223 #: src/language/stats/median.c:351 src/language/stats/npar-summary.c:107 #: src/language/stats/oneway.c:1052 src/language/stats/reliability.c:544 #: src/language/stats/sign.c:69 src/language/stats/sign.c:70 #: src/language/stats/t-test-indep.c:194 #: src/language/stats/t-test-one-sample.c:126 #: src/language/stats/t-test-paired.c:151 #: src/language/stats/t-test-paired.c:194 src/language/stats/wilcoxon.c:244 #: src/language/stats/crosstabs.q:926 msgid "N" msgstr "N" #: src/language/stats/binomial.c:189 msgid "Observed Prop." msgstr "Megfigyelt tul." #: src/language/stats/binomial.c:190 msgid "Test Prop." msgstr "Próba tul." #: src/language/stats/binomial.c:192 src/language/stats/mcnemar.c:224 #: src/language/stats/sign.c:103 src/language/stats/wilcoxon.c:288 #: src/language/stats/crosstabs.q:1306 msgid "Exact Sig. (2-tailed)" msgstr "Pontos szig. (2-farkú)" #: src/language/stats/binomial.c:193 src/language/stats/mcnemar.c:225 #: src/language/stats/sign.c:104 src/language/stats/wilcoxon.c:289 #: src/language/stats/crosstabs.q:1307 msgid "Exact Sig. (1-tailed)" msgstr "Pontos szig. (1-farkú)" #: src/language/stats/binomial.c:195 #, fuzzy #| msgid "Group1" msgid "Groups" msgstr "1. csoport" #: src/language/stats/binomial.c:196 #, fuzzy #| msgid "Group1" msgid "Group 1" msgstr "1. csoport" #: src/language/stats/binomial.c:196 #, fuzzy #| msgid "Group2" msgid "Group 2" msgstr "2. csoport" #: src/language/stats/binomial.c:196 src/language/stats/chisquare.c:223 #: src/language/stats/chisquare.c:257 src/language/stats/examine.c:930 #: src/language/stats/factor.c:1756 src/language/stats/frequencies.c:344 #: src/language/stats/glm.c:811 src/language/stats/kruskal-wallis.c:285 #: src/language/stats/logistic.c:1336 src/language/stats/mann-whitney.c:197 #: src/language/stats/means.c:706 src/language/stats/oneway.c:982 #: src/language/stats/oneway.c:1072 src/language/stats/reliability.c:549 #: src/language/stats/regression.c:1031 src/language/stats/sign.c:75 #: src/language/stats/wilcoxon.c:250 #: src/ui/gui/psppire-dialog-action-crosstabs.c:93 #: src/language/stats/crosstabs.q:931 src/language/stats/crosstabs.q:1218 msgid "Total" msgstr "Összesen" #: src/language/stats/chisquare.c:171 #, fuzzy, c-format #| msgid "" #| "CHISQUARE test specified %d expected values, but %d distinct values were " #| "encountered in variable %s." msgid "" "CHISQUARE test specified %d expected values, but variable %s has %zu " "distinct values." msgstr "" "A CHISQUARE próba %d várt értéket adott meg, de %d különböző érték fordult " "elő a(z) %s változóban." #: src/language/stats/chisquare.c:184 src/language/stats/chisquare.c:241 msgid "Observed N" msgstr "Megfigyelt N" #: src/language/stats/chisquare.c:185 src/language/stats/chisquare.c:242 msgid "Expected N" msgstr "Várt N" #: src/language/stats/chisquare.c:186 src/language/stats/chisquare.c:243 #: src/language/stats/regression.c:1031 #: src/ui/gui/psppire-dialog-action-crosstabs.c:95 #: src/language/stats/crosstabs.q:1267 msgid "Residual" msgstr "Reziduális" #: src/language/stats/chisquare.c:235 src/language/stats/cochran.c:150 #: src/language/stats/median.c:305 src/language/stats/sign.c:66 #: src/ui/gui/frequencies.ui:676 msgid "Frequencies" msgstr "Gyakoriságok" #: src/language/stats/chisquare.c:320 src/language/stats/cochran.c:181 #: src/language/stats/friedman.c:246 src/language/stats/kruskal-wallis.c:295 #: src/language/stats/mann-whitney.c:244 src/language/stats/mcnemar.c:219 #: src/language/stats/median.c:347 src/language/stats/sign.c:100 #: src/language/stats/wilcoxon.c:279 msgid "Test Statistics" msgstr "Próbastatisztika" #: src/language/stats/chisquare.c:323 #, fuzzy #| msgid "Chi-Square" msgid "Chi-square" msgstr "Khí-négyzet" #: src/language/stats/chisquare.c:324 src/language/stats/cochran.c:191 #: src/language/stats/examine.c:675 src/language/stats/factor.c:2107 #: src/language/stats/friedman.c:257 src/language/stats/glm.c:733 #: src/language/stats/kruskal-wallis.c:299 src/language/stats/logistic.c:1174 #: src/language/stats/median.c:354 src/language/stats/oneway.c:975 #: src/language/stats/oneway.c:1242 src/language/stats/regression.c:1025 #: src/language/stats/t-test-indep.c:267 #: src/language/stats/t-test-one-sample.c:75 #: src/language/stats/t-test-paired.c:253 src/language/stats/crosstabs.q:1304 msgid "df" msgstr "df" #: src/language/stats/chisquare.c:325 src/language/stats/cochran.c:192 #: src/language/stats/friedman.c:258 src/language/stats/kruskal-wallis.c:300 #: src/language/stats/median.c:355 msgid "Asymp. Sig." msgstr "Aszimp. szig." #: src/language/stats/cochran.c:111 msgid "More than two values encountered. Cochran Q test will not be run." msgstr "Több mint két érték találva. A Cochran-féle Q-próba nem lesz futtatva." #: src/language/stats/cochran.c:153 #, c-format msgid "Success (%.*g)" msgstr "Sikeres (%.*g)" #: src/language/stats/cochran.c:154 #, c-format msgid "Failure (%.*g)" msgstr "Sikertelen (%.*g)" #: src/language/stats/cochran.c:190 msgid "Cochran's Q" msgstr "Cochran-féle Q" #: src/language/stats/correlations.c:91 src/language/stats/descriptives.c:987 #: src/language/stats/factor.c:2065 src/language/stats/npar-summary.c:102 msgid "Descriptive Statistics" msgstr "Leíróstatisztika" #: src/language/stats/correlations.c:95 src/language/stats/descriptives.c:108 #: src/language/stats/examine.c:742 src/language/stats/factor.c:2069 #: src/language/stats/frequencies.c:141 src/language/stats/graph.c:211 #: src/language/stats/ks-one-sample.c:290 src/language/stats/means-calc.c:438 #: src/language/stats/npar-summary.c:108 src/language/stats/oneway.c:1052 #: src/language/stats/t-test-indep.c:195 #: src/language/stats/t-test-one-sample.c:127 #: src/language/stats/t-test-paired.c:152 #: src/language/stats/t-test-paired.c:241 #: src/ui/gui/psppire-dialog-action-descriptives.c:39 #: src/ui/gui/psppire-dialog-action-frequencies.c:40 msgid "Mean" msgstr "Mintaátlag" #: src/language/stats/correlations.c:96 src/language/stats/examine.c:751 #: src/language/stats/factor.c:2070 src/language/stats/ks-one-sample.c:290 #: src/language/stats/means-calc.c:440 src/language/stats/npar-summary.c:109 #: src/language/stats/oneway.c:1052 src/language/stats/t-test-indep.c:196 #: src/language/stats/t-test-one-sample.c:128 #: src/language/stats/t-test-paired.c:153 #: src/language/stats/t-test-paired.c:242 msgid "Std. Deviation" msgstr "Szórás" #: src/language/stats/correlations.c:126 msgid "Correlations" msgstr "Korrelációk" #: src/language/stats/correlations.c:146 msgid "Pearson Correlation" msgstr "Pearson korreláció" #: src/language/stats/correlations.c:147 src/language/stats/oneway.c:1243 #: src/language/stats/t-test-indep.c:268 #: src/language/stats/t-test-one-sample.c:76 #: src/language/stats/t-test-paired.c:254 msgid "Sig. (2-tailed)" msgstr "Szig. (2-farkú)" #: src/language/stats/correlations.c:147 src/language/stats/factor.c:1913 msgid "Sig. (1-tailed)" msgstr "Szig. (1-farkú)" #: src/language/stats/correlations.c:151 msgid "Cross-products" msgstr "Keresztszorzatok" #: src/language/stats/correlations.c:152 msgid "Covariance" msgstr "Kovariancia" #: src/language/stats/correlations.c:165 msgid "Significant at .05 level" msgstr "" #: src/language/stats/correlations.c:234 msgid "The data for the chosen variables are all missing or empty." msgstr "A kiválasztott változók minden adat hiányzó vagy üres." #: src/language/stats/correlations.c:390 src/language/stats/descriptives.c:368 #: src/language/data-io/list.c:166 msgid "No variables specified." msgstr "Nincs változó megadva." #: src/language/stats/descriptives.c:109 src/language/stats/frequencies.c:142 #: src/language/stats/means-calc.c:445 src/language/stats/t-test-indep.c:197 #: src/language/stats/t-test-one-sample.c:129 #: src/language/stats/t-test-paired.c:154 #: src/language/stats/t-test-paired.c:243 msgid "S.E. Mean" msgstr "Középérték közepes hibája" #: src/language/stats/descriptives.c:110 src/language/stats/frequencies.c:145 msgid "Std Dev" msgstr "Szórás" #: src/language/stats/descriptives.c:111 src/language/stats/examine.c:750 #: src/language/stats/frequencies.c:146 src/language/stats/means-calc.c:450 #: src/ui/gui/psppire-dialog-action-descriptives.c:46 #: src/ui/gui/psppire-dialog-action-frequencies.c:45 msgid "Variance" msgstr "Variancia" #: src/language/stats/descriptives.c:112 src/language/stats/examine.c:752 #: src/language/stats/frequencies.c:147 src/language/stats/means-calc.c:451 #: src/ui/gui/psppire-dialog-action-descriptives.c:47 #: src/ui/gui/psppire-dialog-action-frequencies.c:50 msgid "Kurtosis" msgstr "Lapultság" #: src/language/stats/descriptives.c:113 src/language/stats/frequencies.c:148 #: src/language/stats/means-calc.c:452 msgid "S.E. Kurt" msgstr "Lapultság közepes hibája" #: src/language/stats/descriptives.c:114 src/language/stats/examine.c:752 #: src/language/stats/frequencies.c:149 src/language/stats/means-calc.c:453 #: src/ui/gui/psppire-dialog-action-descriptives.c:48 #: src/ui/gui/psppire-dialog-action-frequencies.c:46 msgid "Skewness" msgstr "Ferdeség" #: src/language/stats/descriptives.c:115 src/language/stats/frequencies.c:150 #: src/language/stats/means-calc.c:454 msgid "S.E. Skew" msgstr "Ferdeség közepes hibája" #: src/language/stats/descriptives.c:116 src/language/stats/examine.c:751 #: src/language/stats/frequencies.c:151 src/language/stats/means-calc.c:449 #: src/ui/gui/psppire-dialog-action-descriptives.c:43 #: src/ui/gui/psppire-dialog-action-frequencies.c:48 msgid "Range" msgstr "Terjedelem" #: src/language/stats/descriptives.c:117 src/language/stats/examine.c:751 #: src/language/stats/frequencies.c:152 src/language/stats/graph.c:214 #: src/language/stats/ks-one-sample.c:285 src/language/stats/means-calc.c:447 #: src/language/stats/npar-summary.c:110 src/language/stats/oneway.c:1061 #: src/ui/gui/psppire-dialog-action-descriptives.c:41 #: src/ui/gui/psppire-dialog-action-frequencies.c:42 msgid "Minimum" msgstr "Minimum" #: src/language/stats/descriptives.c:118 src/language/stats/examine.c:751 #: src/language/stats/frequencies.c:153 src/language/stats/graph.c:213 #: src/language/stats/ks-one-sample.c:285 src/language/stats/means-calc.c:448 #: src/language/stats/npar-summary.c:110 src/language/stats/oneway.c:1061 #: src/ui/gui/psppire-dialog-action-descriptives.c:42 #: src/ui/gui/psppire-dialog-action-frequencies.c:43 msgid "Maximum" msgstr "Maximum" #: src/language/stats/descriptives.c:119 src/language/stats/frequencies.c:154 #: src/language/stats/graph.c:212 src/language/stats/means-calc.c:446 #: src/ui/gui/psppire-dialog-action-descriptives.c:44 #: src/ui/gui/psppire-dialog-action-frequencies.c:53 msgid "Sum" msgstr "Összeg" #: src/language/stats/descriptives.c:350 #, c-format msgid "Z-score variable name %s would be a duplicate variable name." msgstr "A(z) %s Z-pontszám változó neve ismételt lenne." #: src/language/stats/descriptives.c:401 msgid "" "DESCRIPTIVES with Z scores ignores TEMPORARY. Temporary transformations " "will be made permanent." msgstr "" "A DESCRIPTIVES a Z-pontszámokkal figyelment kívül hagyja a TEMPORARY-t. Az " "ideiglenes transzformációk véglegesítve lesznek." #: src/language/stats/descriptives.c:478 msgid "expecting statistic name: reverting to default" msgstr "statisztika neve várt: visszaállítás az alapértelmezettre" #: src/language/stats/descriptives.c:561 msgid "" "Ran out of generic names for Z-score variables. There are only 126 generic " "names: ZSC001-ZSC0999, STDZ01-STDZ09, ZZZZ01-ZZZZ09, ZQZQ01-ZQZQ09." msgstr "" "Kifogytak az általános nevek a Z-pontszám változókhoz. Csak 126 általános " "név van: ZSC001-ZSC0999, STDZ01-STDZ09, ZZZZ01-ZZZZ09, ZQZQ01-ZQZQ09." #: src/language/stats/descriptives.c:579 #, fuzzy #| msgid "Mapping of variables to corresponding Z-scores." msgid "Mapping of Variables to Z-scores" msgstr "Változók leképezése a megfelelő Z-pontszámokra." #: src/language/stats/descriptives.c:581 #, fuzzy #| msgid "Name" msgid "Names" msgstr "Név" #: src/language/stats/descriptives.c:582 src/language/stats/glm.c:739 #: src/language/stats/regression.c:1030 msgid "Source" msgstr "Forrás" #: src/language/stats/descriptives.c:582 msgid "Target" msgstr "Cél" #: src/language/stats/descriptives.c:659 #, fuzzy, c-format #| msgid "Internal error processing Z scores" msgid "Internal error processing Z scores. Please report this to %s." msgstr "Belső hiba a Z-pontszámok feldolgozásakor" #: src/language/stats/descriptives.c:759 #, c-format msgid "Z-score of %s" msgstr "A(z) %s Z-pontszáma" #: src/language/stats/descriptives.c:1028 src/language/stats/roc.c:1029 msgid "Valid N (listwise)" msgstr "Érvényes N (listaként)" #: src/language/stats/descriptives.c:1028 #, fuzzy #| msgid "Valid N (listwise)" msgid "Missing N (listwise)" msgstr "Érvényes N (listaként)" #: src/language/stats/examine.c:75 msgid " (missing)" msgstr " (hiányzó)" #: src/language/stats/examine.c:225 #, c-format msgid "Boxplot of %s vs. %s" msgstr "Dobozdiagram: %s – %s" #: src/language/stats/examine.c:231 src/language/stats/examine.c:338 #, c-format msgid "Boxplot of %s" msgstr "Dobozdiagram: %s" #: src/language/stats/examine.c:321 msgid "Boxplot" msgstr "Dobozdiagram" #: src/language/stats/examine.c:418 msgid "Not creating NP plot because data set is empty." msgstr "Nem készül NP-diagram, mert az adathalmaz üres." #: src/language/stats/examine.c:478 #, c-format msgid "Not creating spreadlevel chart for %s" msgstr "Nem készül szóródási szintdiagram ehhez: %s" #: src/language/stats/examine.c:585 #, fuzzy #| msgid "Last non-missing value" msgid "User-missing value." msgstr "Utolsó nem hiányzó érték" #: src/language/stats/examine.c:591 src/language/stats/examine.c:595 #: src/language/stats/frequencies.c:1606 msgid "Percentiles" msgstr "Percentilisek" #: src/language/stats/examine.c:603 src/math/percentiles.c:37 msgid "Weighted Average" msgstr "Súlyozott átlag" #: src/language/stats/examine.c:603 msgid "Tukey's Hinges" msgstr "Tukey vonalak" #: src/language/stats/examine.c:610 src/language/stats/examine.c:685 #: src/language/stats/examine.c:759 src/language/stats/examine.c:858 #: src/language/stats/examine.c:938 src/language/stats/mann-whitney.c:200 #: src/language/stats/median.c:319 src/language/stats/t-test-indep.c:227 #: src/language/stats/t-test-indep.c:282 #: src/language/stats/t-test-one-sample.c:87 #, fuzzy #| msgid "_Dependent Variable" msgid "Dependent Variables" msgstr "_Függő változók" #: src/language/stats/examine.c:669 #, fuzzy #| msgid "Dev from Normal" msgid "Tests of Normality" msgstr "Eltérés a normálistól" #: src/language/stats/examine.c:673 msgid "Shapiro-Wilk" msgstr "" #: src/language/stats/examine.c:674 src/language/stats/examine.c:739 #: src/ui/gui/psppire-checkbox-treeview.c:73 msgid "Statistic" msgstr "Statisztika" #: src/language/stats/examine.c:676 src/language/stats/factor.c:2108 #: src/language/stats/glm.c:736 src/language/stats/logistic.c:1175 #: src/language/stats/oneway.c:978 src/language/stats/oneway.c:1154 #: src/language/stats/oneway.c:1376 src/language/stats/regression.c:906 #: src/language/stats/regression.c:1028 src/language/stats/t-test-indep.c:263 #: src/language/stats/t-test-paired.c:196 msgid "Sig." msgstr "Szig." #: src/language/stats/examine.c:735 src/language/stats/oneway.c:1045 #: src/ui/gui/descriptives.ui:25 msgid "Descriptives" msgstr "Leíróstatisztika" #: src/language/stats/examine.c:738 msgid "Aspect" msgstr "" #: src/language/stats/examine.c:739 src/language/stats/oneway.c:1053 #: src/language/stats/oneway.c:1240 src/language/stats/oneway.c:1375 #: src/language/stats/roc.c:975 src/language/stats/regression.c:902 msgid "Std. Error" msgstr "Sztd. hiba" #: src/language/stats/examine.c:745 src/language/stats/oneway.c:1056 #, c-format msgid "%g%% Confidence Interval for Mean" msgstr "%g%%-os konfidencia intervallum a mintaátlagra" #: src/language/stats/examine.c:747 src/language/stats/oneway.c:1058 #: src/language/stats/oneway.c:1382 src/language/stats/roc.c:982 #: src/language/stats/regression.c:913 msgid "Lower Bound" msgstr "Alsó korlát" #: src/language/stats/examine.c:748 src/language/stats/oneway.c:1059 #: src/language/stats/oneway.c:1383 src/language/stats/roc.c:983 #: src/language/stats/regression.c:914 msgid "Upper Bound" msgstr "Felső korlát" #: src/language/stats/examine.c:750 msgid "5% Trimmed Mean" msgstr "5%-os csonkolt átlag" #: src/language/stats/examine.c:750 src/language/stats/frequencies.c:143 #: src/language/stats/means-calc.c:442 src/language/stats/median.c:352 #: src/ui/gui/psppire-dialog-action-frequencies.c:52 msgid "Median" msgstr "Medián" #: src/language/stats/examine.c:752 msgid "Interquartile Range" msgstr "Interkvartilis terjedelem" #: src/language/stats/examine.c:832 msgid "Extreme Values" msgstr "Kiugró értékek" #: src/language/stats/examine.c:840 src/language/stats/quick-cluster.c:664 #: src/language/data-io/list.c:110 msgid "Case Number" msgstr "Esetszám" #: src/language/stats/examine.c:844 #, fuzzy #| msgid "Order by" msgid "Order" msgstr "Rendezési sorrend" #. TRANSLATORS: This is a noun, not an adjective. #: src/language/stats/examine.c:850 #, fuzzy #| msgid "_Extremes" msgid "Extreme" msgstr "_Extrémumok" #: src/language/stats/examine.c:851 msgid "Highest" msgstr "Legmagasabb" #: src/language/stats/examine.c:851 msgid "Lowest" msgstr "Legalacsonyabb" #: src/language/stats/examine.c:921 src/language/stats/logistic.c:1328 #: src/language/stats/means.c:694 src/language/stats/reliability.c:540 msgid "Case Processing Summary" msgstr "Esetfeldolgozási összegzés" #: src/language/stats/examine.c:927 src/language/stats/frequencies.c:304 #: src/language/stats/frequencies.c:1494 src/language/stats/logistic.c:1332 #: src/language/stats/means.c:713 src/language/stats/reliability.c:545 #: src/language/stats/crosstabs.q:927 msgid "Percent" msgstr "Százalék" #: src/language/stats/examine.c:929 src/language/stats/frequencies.c:321 #: src/language/stats/frequencies.c:1590 src/language/stats/quick-cluster.c:766 #: src/language/stats/reliability.c:548 src/language/stats/crosstabs.q:931 msgid "Valid" msgstr "Érvényes" #: src/language/stats/examine.c:929 src/language/stats/frequencies.c:336 #: src/language/stats/frequencies.c:1591 src/language/stats/crosstabs.q:931 msgid "Missing" msgstr "Hiányzó" #: src/language/stats/examine.c:1550 #, c-format msgid "%s may not be negative. Using default value (%g)." msgstr "%s nem lehet negatív. Alapértelmezett érték használata (%g)." #: src/language/stats/examine.c:1587 msgid "Percentiles must lie in the range (0, 100)" msgstr "A percentilisek a (0, 100) tartományba kell hogy essenek" #: src/language/stats/examine.c:1777 #, c-format msgid "%s and %s are mutually exclusive" msgstr "%s és %s kölcsönösen kizárja egymást" #: src/language/stats/factor.c:1121 #, c-format msgid "Matrix input for %s must be either COV or CORR" msgstr "A(z) %s mátrixbemenete COV vagy CORR kell legyen" #: src/language/stats/factor.c:1519 msgid "Factor analysis on a single variable is not useful." msgstr "Egyetlen változó faktoranalízise haszontalan." #: src/language/stats/factor.c:1523 msgid "Factor analysis without variables is not possible." msgstr "A változók nélkül faktoranalízis nem lehetséges." #: src/language/stats/factor.c:1634 msgid "Component Number" msgstr "Komponensek száma" #: src/language/stats/factor.c:1634 msgid "Factor Number" msgstr "Faktorok száma" #: src/language/stats/factor.c:1648 src/language/stats/factor.c:1651 msgid "Communalities" msgstr "Kommunalitások" #: src/language/stats/factor.c:1653 msgid "Initial" msgstr "Kezdeti" #: src/language/stats/factor.c:1655 msgid "Extraction" msgstr "Kinyerés" #: src/language/stats/factor.c:1697 src/language/stats/factor.c:1777 #: src/language/stats/factor.c:1839 msgid "Component" msgstr "Komponens" #: src/language/stats/factor.c:1697 src/language/stats/factor.c:1777 #: src/language/stats/factor.c:1839 msgid "Factor" msgstr "Faktor" #: src/language/stats/factor.c:1752 msgid "Total Variance Explained" msgstr "Teljes variancia magyarázat" #: src/language/stats/factor.c:1758 #, no-c-format msgid "% of Variance" msgstr "Variancia %-a" #: src/language/stats/factor.c:1760 #, no-c-format msgid "Cumulative %" msgstr "Kumulatív %" #: src/language/stats/factor.c:1763 msgid "Phase" msgstr "" #: src/language/stats/factor.c:1765 msgid "Initial Eigenvalues" msgstr "Kezdeti sajátértékek" #: src/language/stats/factor.c:1769 msgid "Extraction Sums of Squared Loadings" msgstr "Kinyert faktorsúlyok négyzetösszege" #: src/language/stats/factor.c:1773 msgid "Rotation Sums of Squared Loadings" msgstr "Forgatott faktorsúlyok négyzetösszege" #: src/language/stats/factor.c:1835 msgid "Factor Correlation Matrix" msgstr "Faktor korrelációs mátrix" #: src/language/stats/factor.c:1842 #, fuzzy #| msgid "Factor" msgid "Factor 2" msgstr "Faktor" # Ehhez nem találtam meghonosodott kifejezést #: src/language/stats/factor.c:1874 msgid "Anti-Image Matrices" msgstr "Anti-image mátrixok" #: src/language/stats/factor.c:1879 msgid "Anti-image Covariance" msgstr "Anti-image kovariancia" #: src/language/stats/factor.c:1880 msgid "Anti-image Correlation" msgstr "Anti-image korreláció" #: src/language/stats/factor.c:1901 msgid "Correlation Matrix" msgstr "Korrelációs mátrix" #: src/language/stats/factor.c:1910 src/language/stats/t-test-paired.c:195 msgid "Correlation" msgstr "Korreláció" #: src/language/stats/factor.c:1947 msgid "Determinant" msgstr "Determináns" #: src/language/stats/factor.c:1958 msgid "Covariance Matrix" msgstr "Kovariancia mátrix" #: src/language/stats/factor.c:1990 msgid "" "The dataset contains no complete observations. No analysis will be performed." msgstr "" "Az adathalmaz nem tartalmaz teljes megfigyeléseket. Nem lesz analízis " "végezve." #: src/language/stats/factor.c:2014 msgid "The dataset has no complete covariance or correlation matrix." msgstr "Az adathalmaznak nincs teljes kovariancia vagy korrelációs mátrixa." #: src/language/stats/factor.c:2071 msgid "Analysis N" msgstr "Analízis N" #: src/language/stats/factor.c:2099 msgid "KMO and Bartlett's Test" msgstr "KMO és Bartlett-próba" #: src/language/stats/factor.c:2103 msgid "Kaiser-Meyer-Olkin Measure of Sampling Adequacy" msgstr "Kaiser–Meyer–Olkin-statisztika a mintavétel elégségességére" #: src/language/stats/factor.c:2105 msgid "Bartlett's Test of Sphericity" msgstr "Bartlett-féle szférikussági próba" #: src/language/stats/factor.c:2106 msgid "Approx. Chi-Square" msgstr "Közelítő Khí-négyzet" #: src/language/stats/factor.c:2154 #, c-format msgid "" "The %s criteria result in zero factors extracted. Therefore no analysis will " "be performed." msgstr "" "A(z) %s feltételek nulla kinyert tényezőt eredményeztek. Emiatt nem lett " "elemzés végrehajtva." #: src/language/stats/factor.c:2161 #, c-format msgid "" "The %s criteria result in more factors than variables, which is not " "meaningful. No analysis will be performed." msgstr "" "A(z) %s feltételek több tényezőt eredményeztek mint változót, amelynek nincs " "értelme. Nem lesz elemzés végrehajtva." #: src/language/stats/factor.c:2254 msgid "Component Matrix" msgstr "Komponensmátrix" #: src/language/stats/factor.c:2254 msgid "Factor Matrix" msgstr "Faktormátrix" #: src/language/stats/factor.c:2259 msgid "Pattern Matrix" msgstr "Mintamátrix" #: src/language/stats/factor.c:2268 msgid "Structure Matrix" msgstr "Struktúramátrix" #: src/language/stats/factor.c:2270 msgid "Rotated Component Matrix" msgstr "Forgatott komponensmátrix" #: src/language/stats/factor.c:2271 msgid "Rotated Factor Matrix" msgstr "Forgatott faktormátrix" #: src/language/stats/flip.c:100 #, c-format msgid "%s ignores %s. Temporary transformations will be made permanent." msgstr "" "a(z) %s figyelmen kívül hagyja ezt: %s. Az átmeneti átalakítások véglegesek " "lesznek." #: src/language/stats/flip.c:153 #, c-format msgid "Could not create temporary file for %s." msgstr "Nem hozható létre átmeneti fájl ehhez: %s." #: src/language/stats/flip.c:341 #, c-format msgid "Error rewinding %s file: %s." msgstr "Hiba a(z) %s fájl visszaállításakor: %s." #: src/language/stats/flip.c:348 #, c-format msgid "Error creating %s source file." msgstr "Hiba a(z) %s forrásfájl létrehozásakor." #: src/language/stats/flip.c:361 #, c-format msgid "Error reading %s file: %s." msgstr "Hiba a(z) %s fájl olvasásakor: %s." #: src/language/stats/flip.c:363 #, c-format msgid "Unexpected end of file reading %s file." msgstr "Váratlan fájlvég a(z) %s fájl olvasásakor." #: src/language/stats/flip.c:379 #, c-format msgid "Error seeking %s source file: %s." msgstr "Hiba a(z) %s forrásfájlban lépkedéskor: %s." #: src/language/stats/flip.c:387 #, c-format msgid "Error writing %s source file: %s." msgstr "Hiba a(z) %s forrásfájl írásakor: %s." #: src/language/stats/flip.c:402 #, c-format msgid "Error rewinding %s source file: %s." msgstr "Hiba a(z) %s forrásfájl visszaállításakor: %s." #: src/language/stats/flip.c:433 #, c-format msgid "Error reading %s temporary file: %s." msgstr "Hiba a(z) %s átmeneti fájl írásakor: %s." #: src/language/stats/flip.c:436 #, c-format msgid "Unexpected end of file reading %s temporary file." msgstr "Váratlan fájlvég a(z) %s átmeneti fájl olvasásakor." #: src/language/stats/frequencies.c:144 #: src/ui/gui/psppire-dialog-action-frequencies.c:49 msgid "Mode" msgstr "Módusz" #: src/language/stats/frequencies.c:303 src/language/stats/logistic.c:1381 #: src/output/charts/plot-hist-cairo.c:112 msgid "Frequency" msgstr "Gyakoriság" #: src/language/stats/frequencies.c:305 msgid "Valid Percent" msgstr "Érvényes százalék" #: src/language/stats/frequencies.c:306 src/language/stats/graph.c:208 msgid "Cumulative Percent" msgstr "Kumulatív százalék" #: src/language/stats/frequencies.c:905 msgid "Histogram frequency must be greater than zero." msgstr "A hisztogram gyakoriságának nullánál nagyobbnak kell lennie." #: src/language/stats/frequencies.c:923 msgid "Histogram percentage must be greater than zero." msgstr "A hisztogram százalékának nullánál nagyobbnak kell lennie." #: src/language/stats/frequencies.c:1139 #, c-format msgid "" "%s for histogram must be greater than or equal to %s, but %s was specified " "as %.15g and %s as %.15g. %s and %s will be ignored." msgstr "" "A hisztogramhoz a(z) %s értékének nagyobb vagy egyenlőnek kell lennie mint " "%s, de %s %.15g, %s pedig %.15g értékként lett megadva. A(z) %s és a(z) %s " "figyelmen kívül lesz hagyva." #: src/language/stats/frequencies.c:1184 #, c-format msgid "" "%s for pie chart must be greater than or equal to %s, but %s was specified " "as %.15g and %s as %.15g. %s and %s will be ignored." msgstr "" "A kördiagramhoz a(z) %s értékének nagyobb vagy egyenlőnek kell lennie mint " "%s, de %s %.15g, %s pedig %.15g értékként lett megadva. A(z) %s és a(z) %s " "figyelmen kívül lesz hagyva." #: src/language/stats/frequencies.c:1474 #, c-format msgid "Omitting pie chart for %s, which has only %d unique values." msgstr "Kördiagram kihagyása ehhez: %s, mert csak %d egyedi értéket tartalmaz." #: src/language/stats/frequencies.c:1477 #, c-format msgid "Omitting pie chart for %s, which has over 50 unique values." msgstr "" "Kördiagram kihagyása ehhez: %s, mert több mint 50 egyedi értéket tartalmaz." #: src/language/stats/frequencies.c:1494 src/language/stats/graph.c:205 #: src/language/stats/quick-cluster.c:747 #: src/ui/gui/psppire-dialog-action-crosstabs.c:90 #: src/language/stats/crosstabs.q:789 src/language/stats/crosstabs.q:1262 msgid "Count" msgstr "Számosság" #: src/language/stats/friedman.c:220 src/language/stats/kruskal-wallis.c:247 #: src/language/stats/mann-whitney.c:182 src/language/stats/wilcoxon.c:240 msgid "Ranks" msgstr "Rangok" #: src/language/stats/friedman.c:222 src/language/stats/friedman.c:223 #: src/language/stats/kruskal-wallis.c:251 #: src/language/stats/mann-whitney.c:186 src/language/stats/wilcoxon.c:245 msgid "Mean Rank" msgstr "Mintaátlag rangja" #: src/language/stats/friedman.c:253 msgid "Kendall's W" msgstr "Kendall-féle W" #: src/language/stats/friedman.c:256 src/language/stats/kruskal-wallis.c:298 #: src/language/stats/median.c:353 msgid "Chi-Square" msgstr "Khí-négyzet" #: src/language/stats/glm.c:169 msgid "Multivariate analysis is not yet implemented" msgstr "A többváltozós analízis még nincs megvalósítva" #: src/language/stats/glm.c:274 msgid "Only types 1, 2 & 3 sums of squares are currently implemented" msgstr "Csak az 1., 2. és 3. típusú négyzetösszeg van jelenleg megvalósítva" #: src/language/stats/glm.c:727 msgid "Tests of Between-Subjects Effects" msgstr "Alanyok közti hatások próbái" #: src/language/stats/glm.c:730 #, fuzzy #| msgid "Type %s Sum of Squares" msgid "Type I Sum Of Squares" msgstr "%s. típusú négyzetösszeg" #: src/language/stats/glm.c:731 #, fuzzy #| msgid "Type %s Sum of Squares" msgid "Type II Sum Of Squares" msgstr "%s. típusú négyzetösszeg" #: src/language/stats/glm.c:732 #, fuzzy #| msgid "Type %s Sum of Squares" msgid "Type III Sum Of Squares" msgstr "%s. típusú négyzetösszeg" #: src/language/stats/glm.c:734 src/language/stats/oneway.c:976 #: src/language/stats/regression.c:1026 msgid "Mean Square" msgstr "Középérték négyzetet" #: src/language/stats/glm.c:735 src/language/stats/oneway.c:977 #: src/language/stats/regression.c:1027 src/language/stats/t-test-indep.c:262 msgid "F" msgstr "F" #: src/language/stats/glm.c:740 msgid "Corrected Model" msgstr "Javított modell" #: src/language/stats/glm.c:740 msgid "Model" msgstr "Modell" #: src/language/stats/glm.c:752 msgid "Intercept" msgstr "Ordinátatengely-metszet" #: src/language/stats/glm.c:802 src/output/pivot-table.c:763 #: src/output/spv/spv.c:867 msgid "Error" msgstr "Hiba" #: src/language/stats/glm.c:819 msgid "Corrected Total" msgstr "Javított összesítés" #: src/language/stats/graph.c:206 msgid "Percentage" msgstr "Százalék" #: src/language/stats/graph.c:207 msgid "Cumulative Count" msgstr "Kumulatív számosság" #: src/language/stats/graph.c:296 #, c-format msgid "%s vs. %s by %s" msgstr "%s – %s, %s szerint" #: src/language/stats/graph.c:303 #, c-format msgid "%s vs. %s" msgstr "%s – %s" #: src/language/stats/graph.c:322 msgid "" "Maximum number of scatterplot categories reached. Your BY variable has too " "many distinct values. The coloring of the plot will not be correct." msgstr "" "A pontfelhő kategóriák legnagyobb száma elérve. A BY változójának túl sok " "különböző értéke van. A diagram színezése helytelen lesz." #: src/language/stats/graph.c:551 src/language/stats/rank.c:636 #, c-format msgid "%s of %s" msgstr "%s / %s" #: src/language/stats/graph.c:698 src/language/stats/graph.c:729 #: src/language/stats/graph.c:777 msgid "Only one chart type is allowed." msgstr "Csak egy diagramtípus engedélyezett." #: src/language/stats/graph.c:721 src/language/stats/graph.c:820 #: src/language/stats/graph.c:834 msgid "Only one variable is allowed." msgstr "Csak egy változó engedélyezett." #: src/language/stats/graph.c:843 msgid "Variable expected" msgstr "Változó várt" #: src/language/stats/graph.c:883 msgid "FOOTNOTE is not implemented yet for GRAPH" msgstr "A FOOTNOTE még nincs implementálva a GRAPH parancshoz" #: src/language/stats/ks-one-sample.c:274 src/ui/gui/ks-one-sample.ui:24 msgid "One-Sample Kolmogorov-Smirnov Test" msgstr "Egymintás Kolmogorov–Szmirnov-próba" #: src/language/stats/ks-one-sample.c:284 msgid "Uniform Parameters" msgstr "Egyenletes paraméterek" #: src/language/stats/ks-one-sample.c:289 msgid "Normal Parameters" msgstr "Normális paraméterek" #: src/language/stats/ks-one-sample.c:294 msgid "Poisson Parameters" msgstr "Poisson paraméterek" #: src/language/stats/ks-one-sample.c:295 #: src/ui/gui/psppire-dialog-action-crosstabs.c:76 #: src/language/stats/crosstabs.q:1421 msgid "Lambda" msgstr "Lambda" #: src/language/stats/ks-one-sample.c:300 msgid "Exponential Parameters" msgstr "Exponenciális paraméterek" #: src/language/stats/ks-one-sample.c:308 msgid "Most Extreme Differences" msgstr "Legnagyobb különbségek" #: src/language/stats/ks-one-sample.c:309 msgid "Absolute" msgstr "Abszolút" #: src/language/stats/ks-one-sample.c:309 src/language/stats/roc.c:1037 msgid "Positive" msgstr "Pozitív" #: src/language/stats/ks-one-sample.c:309 src/language/stats/roc.c:1037 msgid "Negative" msgstr "Negatív" #: src/language/stats/ks-one-sample.c:312 msgid "Kolmogorov-Smirnov Z" msgstr "Kolmogorov–Szmirnov Z" #: src/language/stats/ks-one-sample.c:313 #: src/language/stats/jonckheere-terpstra.c:374 #: src/language/stats/mann-whitney.c:251 src/language/stats/runs.c:328 #: src/language/stats/wilcoxon.c:284 msgid "Asymp. Sig. (2-tailed)" msgstr "Aszimp. szig. (2-farkú)" #: src/language/stats/logistic.c:327 msgid "All predicted values are either 1 or 0" msgstr "Minden előrejelzett érték 1 vagy 0" #: src/language/stats/logistic.c:525 msgid "Dependent variable's values are not dichotomous." msgstr "A függő változó értékei nem dichotómok." #: src/language/stats/logistic.c:614 #, c-format msgid "" "Category %s does not have at least two distinct values. Logistic regression " "will not be run." msgstr "" "A(z) %s kategóriának nincs legalább két különböző értéke. A logisztikus " "regresszió nem lesz futtatva." #: src/language/stats/logistic.c:674 #, c-format msgid "" "Estimation terminated at iteration number %d because parameter estimates " "changed by less than %g" msgstr "" "A becslés befejeződött a(z) %d. iterációszámnál, mert a paraméterbecslések " "változása kisebb volt mint %g" #: src/language/stats/logistic.c:686 #, c-format msgid "" "Estimation terminated at iteration number %d because Log Likelihood " "decreased by less than %g%%" msgstr "" "A becslés befejeződött a(z) %d. iterációszámnál, mert a Log Likelihood " "kevesebb mint %g%%-kal csökkent" #: src/language/stats/logistic.c:701 #, c-format msgid "" "Estimation terminated at iteration number %d because maximum iterations has " "been reached" msgstr "" "A becslés befejeződött a(z) %d. iterációszámnál, mert elérte a legnagyobb " "iterációt" #: src/language/stats/logistic.c:994 msgid "Cut point value must be in the range [0,1]" msgstr "A vágási pont a [0,1] tartományba kell essen" #: src/language/stats/logistic.c:1139 msgid "Dependent Variable Encoding" msgstr "Függő változó kódolás" #: src/language/stats/logistic.c:1141 msgid "Mapping" msgstr "" #: src/language/stats/logistic.c:1142 msgid "Internal Value" msgstr "Belső érték" #: src/language/stats/logistic.c:1145 msgid "Original Value" msgstr "Eredeti érték" #: src/language/stats/logistic.c:1167 msgid "Variables in the Equation" msgstr "Az egyenlet változói" #: src/language/stats/logistic.c:1171 src/language/stats/regression.c:902 msgid "B" msgstr "B" #: src/language/stats/logistic.c:1172 msgid "S.E." msgstr "S.E." #: src/language/stats/logistic.c:1173 msgid "Wald" msgstr "Wald" #: src/language/stats/logistic.c:1176 msgid "Exp(B)" msgstr "Exp(B)" #: src/language/stats/logistic.c:1181 #, c-format msgid "%d%% CI for Exp(B)" msgstr "%d%% CI ennél: Exp(B)" #: src/language/stats/logistic.c:1183 src/language/stats/t-test-indep.c:274 #: src/language/stats/t-test-one-sample.c:83 #: src/language/stats/t-test-paired.c:249 src/language/stats/crosstabs.q:1369 msgid "Lower" msgstr "Alsó" #: src/language/stats/logistic.c:1183 src/language/stats/t-test-indep.c:275 #: src/language/stats/t-test-one-sample.c:84 #: src/language/stats/t-test-paired.c:250 src/language/stats/crosstabs.q:1370 msgid "Upper" msgstr "Felső" #: src/language/stats/logistic.c:1189 src/language/stats/logistic.c:1470 msgid "Step 1" msgstr "1. lépés" #: src/language/stats/logistic.c:1263 msgid "Constant" msgstr "Állandó" #: src/language/stats/logistic.c:1298 msgid "Model Summary" msgstr "Modell összefoglaló" #: src/language/stats/logistic.c:1301 msgid "-2 Log likelihood" msgstr "-2 Log likelihood" #: src/language/stats/logistic.c:1302 msgid "Cox & Snell R Square" msgstr "Cox & Snell R négyzet" #: src/language/stats/logistic.c:1303 msgid "Nagelkerke R Square" msgstr "Nagelkerke R négyzet" #: src/language/stats/logistic.c:1306 src/language/stats/logistic.c:1470 #, fuzzy #| msgid "Step 1" msgid "Step" msgstr "1. lépés" #: src/language/stats/logistic.c:1335 msgid "Unweighted Cases" msgstr "Súlyozatlan esetek" #: src/language/stats/logistic.c:1336 msgid "Included in Analysis" msgstr "Tartalmazza az elemzés" #: src/language/stats/logistic.c:1336 msgid "Missing Cases" msgstr "Hiányzó esetek" #: src/language/stats/logistic.c:1365 msgid "Categorical Variables' Codings" msgstr "Kategóriaváltozók kódolása" #: src/language/stats/logistic.c:1380 #, fuzzy #| msgid "Encodings" msgid "Codings" msgstr "Kódolások" #: src/language/stats/logistic.c:1383 msgid "Parameter coding" msgstr "Paraméter kódolása" #: src/language/stats/logistic.c:1462 msgid "Classification Table" msgstr "Osztályozási táblázat" #: src/language/stats/logistic.c:1466 msgid "Predicted" msgstr "Előrejelzett" #: src/language/stats/logistic.c:1466 #, fuzzy #| msgid "" #| "Percentage\n" #| "Correct" msgid "Percentage Correct" msgstr "" "Helyes\n" "százalék" #: src/language/stats/logistic.c:1468 msgid "Observed" msgstr "Megfigyelt" #: src/language/stats/logistic.c:1468 msgid "Overall Percentage" msgstr "Összefoglaló százalék" #: src/language/stats/jonckheere-terpstra.c:357 msgid "Jonckheere-Terpstra Test" msgstr "Jonckheere–Terpstra próba" #: src/language/stats/jonckheere-terpstra.c:364 #, c-format msgid "Number of levels in %s" msgstr "Szintek száma itt: %s" #: src/language/stats/jonckheere-terpstra.c:370 msgid "Observed J-T Statistic" msgstr "Tapasztalati J–T statisztika" #: src/language/stats/jonckheere-terpstra.c:371 msgid "Mean J-T Statistic" msgstr "Átlagos J–T statisztika" #: src/language/stats/jonckheere-terpstra.c:372 msgid "Std. Deviation of J-T Statistic" msgstr "A J–T statisztika szórása" #: src/language/stats/jonckheere-terpstra.c:373 msgid "Std. J-T Statistic" msgstr "Sztenderd J–T statisztika" #: src/language/stats/mann-whitney.c:187 src/language/stats/wilcoxon.c:246 msgid "Sum of Ranks" msgstr "Rangok összege" #: src/language/stats/mann-whitney.c:248 msgid "Mann-Whitney U" msgstr "Mann–Whitney U" #: src/language/stats/mann-whitney.c:249 msgid "Wilcoxon W" msgstr "Wilcoxon W" #: src/language/stats/mann-whitney.c:250 src/language/stats/runs.c:327 #: src/language/stats/wilcoxon.c:283 msgid "Z" msgstr "Z" #: src/language/stats/means.c:702 msgid "Included" msgstr "Tartalmazza" #: src/language/stats/means.c:704 src/language/stats/reliability.c:548 msgid "Excluded" msgstr "Kihagyott" #: src/language/stats/means.c:753 msgid "Report" msgstr "Jelentés" #: src/language/stats/means.c:838 #, fuzzy, c-format #| msgid "" #| "Dependent variable %s has no non-missing values. No analysis for this " #| "variable will be done." msgid "" "The table \"%s\" has no non-empty control variables. No result for this " "table will be displayed." msgstr "" "A(z) %s függő változónak nincs hiányzó értéke. További elemzés nem lesz " "végrehajtva a változóhoz." #: src/language/stats/means-calc.c:443 msgid "Group Median" msgstr "Csoport medián" #: src/language/stats/means-calc.c:455 msgid "First" msgstr "Első" #: src/language/stats/means-calc.c:456 msgid "Last" msgstr "Utolsó" #: src/language/stats/means-calc.c:458 msgid "Percent N" msgstr "Százalék N" #: src/language/stats/means-calc.c:459 msgid "Percent Sum" msgstr "Százalék összeg" #: src/language/stats/means-calc.c:461 msgid "Harmonic Mean" msgstr "Harmonikus közép" #: src/language/stats/means-calc.c:462 msgid "Geom. Mean" msgstr "Geom. közép" #: src/language/stats/mcnemar.c:144 msgid "The McNemar test is appropriate only for dichotomous variables" msgstr "A McNemar-próba csak dichotóm változókhoz megfelelő" #: src/language/stats/mcnemar.c:226 src/language/stats/sign.c:105 msgid "Point Probability" msgstr "Pont valószínűség" #: src/language/stats/mcnemar.c:229 src/language/stats/sign.c:78 #: src/language/stats/sign.c:108 src/language/stats/t-test-paired.c:199 #: src/language/stats/t-test-paired.c:257 src/language/stats/wilcoxon.c:253 #: src/language/stats/wilcoxon.c:292 #, fuzzy #| msgid "Pair %d" msgid "Pairs" msgstr "%d. pár" #: src/language/stats/median.c:316 msgid "> Median" msgstr "> Medián" #: src/language/stats/median.c:316 msgid "≤ Median" msgstr "≤ Medián" #: src/language/stats/npar.c:536 #, c-format msgid "%s subcommand not currently implemented." msgstr "a(z) %s alparancs jelenleg nincs megvalósítva." #: src/language/stats/npar.c:691 #, c-format msgid "Expecting %s, %s, %s or a number." msgstr "%s, %s, %s vagy egy szám várt." #: src/language/stats/npar.c:845 #, c-format msgid "" "The specified value of HI (%d) is lower than the specified value of LO (%d)" msgstr "A megadott HI érték (%d) alacsonyabb, mint a megadott LO érték (%d)" #: src/language/stats/npar.c:897 #, c-format msgid "" "%d expected values were given, but the specified range (%d-%d) requires " "exactly %d values." msgstr "" "%d várt érték volt megadva, de a megadott tartomány (%d-%d) pontosan %d " "értéket igényel." #: src/language/stats/npar.c:1118 src/language/stats/t-test-parser.c:173 #, c-format msgid "" "PAIRED was specified but the number of variables preceding WITH (%zu) did " "not match the number following (%zu)." msgstr "" "PAIRED lett meghatározva, de a WITH (%zu) parancsot megelőző változók száma " "nem egyezett a követő számokkal (%zu)." #: src/language/stats/oneway.c:361 msgid "LSD" msgstr "LSD" #: src/language/stats/oneway.c:362 src/ui/gui/oneway.ui:338 msgid "Tukey HSD" msgstr "Tukey HSD" #: src/language/stats/oneway.c:363 src/ui/gui/oneway.ui:253 msgid "Bonferroni" msgstr "Bonferroni" #: src/language/stats/oneway.c:364 src/ui/gui/oneway.ui:304 msgid "Scheffé" msgstr "Scheffé" #: src/language/stats/oneway.c:365 msgid "Games-Howell" msgstr "Games–Howell" #: src/language/stats/oneway.c:366 src/ui/gui/oneway.ui:321 msgid "Šidák" msgstr "Šidák" #: src/language/stats/oneway.c:519 #, c-format msgid "The post hoc analysis method %s is not supported." msgstr "A post hoc %s elemző módszer nem támogatott." #: src/language/stats/oneway.c:842 #, c-format msgid "" "Dependent variable %s has no non-missing values. No analysis for this " "variable will be done." msgstr "" "A(z) %s függő változónak nincs hiányzó értéke. További elemzés nem lesz " "végrehajtva a változóhoz." #: src/language/stats/oneway.c:924 #, c-format msgid "" "In contrast list %zu, the number of coefficients (%zu) does not equal the " "number of groups (%d). This contrast list will be ignored." msgstr "" "A(z) %zu. kontrasztlistában az együtthatók száma (%zu) nem egyezik a " "csoportok számával (%d). Ez a kontrasztlista figyelmen kívül lesz hagyva." #: src/language/stats/oneway.c:936 #, c-format msgid "Coefficients for contrast %zu do not total zero" msgstr "Az együtthatók összege a(z) %zu. kontrasztnál nem nulla" #: src/language/stats/oneway.c:971 msgid "ANOVA" msgstr "ANOVA" #: src/language/stats/oneway.c:974 src/language/stats/regression.c:1024 msgid "Sum of Squares" msgstr "Négyzetösszeg" #: src/language/stats/oneway.c:981 msgid "Between Groups" msgstr "Csoportok közt" #: src/language/stats/oneway.c:981 msgid "Within Groups" msgstr "Csoportokon belül" #: src/language/stats/oneway.c:1075 src/language/stats/oneway.c:1257 #, fuzzy #| msgid "_Dependent Variable" msgid "Dependent Variable" msgstr "_Függő változók" #: src/language/stats/oneway.c:1148 msgid "Test of Homogeneity of Variances" msgstr "Varianciák homogenitás-vizsgálata" #: src/language/stats/oneway.c:1151 msgid "Levene Statistic" msgstr "Levene statisztika" #: src/language/stats/oneway.c:1152 msgid "df1" msgstr "df1" #: src/language/stats/oneway.c:1153 msgid "df2" msgstr "df2" #: src/language/stats/oneway.c:1192 msgid "Contrast Coefficients" msgstr "Kontraszt együtthatók" #: src/language/stats/oneway.c:1199 src/language/stats/oneway.c:1246 msgid "Contrast" msgstr "Kontraszt" #: src/language/stats/oneway.c:1236 msgid "Contrast Tests" msgstr "Kontraszt próbák" #: src/language/stats/oneway.c:1239 msgid "Value of Contrast" msgstr "Kontraszt értéke" #: src/language/stats/oneway.c:1241 src/language/stats/regression.c:905 #: src/language/stats/t-test-indep.c:266 #: src/language/stats/t-test-one-sample.c:74 #: src/language/stats/t-test-paired.c:252 msgid "t" msgstr "t" #: src/language/stats/oneway.c:1252 msgid "Assumption" msgstr "" #: src/language/stats/oneway.c:1253 msgid "Assume equal variances" msgstr "Egyenlő varianciák feltételezése" #: src/language/stats/oneway.c:1254 #, fuzzy #| msgid "Does not assume equal" msgid "Does not assume equal variances" msgstr "Nem feltételez egyenlőséget" #: src/language/stats/oneway.c:1367 #, c-format msgid "Multiple Comparisons (%s)" msgstr "Több összehasonlítás (%s)" #: src/language/stats/oneway.c:1374 #, fuzzy #| msgid "Mean Difference" msgid "Mean Difference (I - J)" msgstr "Mintaátlag különbsége" #: src/language/stats/oneway.c:1379 #, c-format msgid "%g%% Confidence Interval" msgstr "%g%% konfidencia intervallum" #: src/language/stats/oneway.c:1386 src/language/stats/oneway.c:1390 msgid "(J) Family" msgstr "" #: src/language/stats/oneway.c:1406 #, fuzzy #| msgid "Runs Test" msgid "Test" msgstr "Végrehajtja a próbát" #: src/language/stats/quick-cluster.c:576 msgid "Initial Cluster Centers" msgstr "Kezdeti klaszterközéppontok" #: src/language/stats/quick-cluster.c:577 msgid "Final Cluster Centers" msgstr "Végső klaszterközéppontok" #: src/language/stats/quick-cluster.c:580 #: src/language/stats/quick-cluster.c:660 #: src/language/stats/quick-cluster.c:661 #: src/language/stats/quick-cluster.c:753 msgid "Cluster" msgstr "Klaszter" #: src/language/stats/quick-cluster.c:658 msgid "Cluster Membership" msgstr "Klasztertagság" #: src/language/stats/quick-cluster.c:744 msgid "Number of Cases in each Cluster" msgstr "Esetek száma az egyes klaszterekben" #: src/language/stats/quick-cluster.c:750 #, fuzzy #| msgid "Cluster" msgid "Clusters" msgstr "Klaszter" #: src/language/stats/quick-cluster.c:867 #: src/language/stats/quick-cluster.c:893 #, fuzzy, c-format #| msgid "Variable %s already exists." msgid "A variable called `%s' already exists." msgstr "A(z) %s változó már létezik." #: src/language/stats/quick-cluster.c:908 #, fuzzy, c-format #| msgid "expecting %s or %s" msgid "Expecting %s or %s." msgstr "%s vagy %s várt" #: src/language/stats/quick-cluster.c:928 msgid "The number of clusters must be positive" msgstr "A klaszterek számának pozitívnak kell lennie" #: src/language/stats/quick-cluster.c:944 #, fuzzy #| msgid "The convergence criterium must be positive" msgid "The convergence criterion must be positive" msgstr "A konvergencia kritériumnak pozitívnak kell lennie" #: src/language/stats/quick-cluster.c:960 msgid "The number of iterations must be positive" msgstr "Az iterációk számának pozitívnak kell lennie" #: src/language/stats/rank.c:205 #, c-format msgid "" "Cannot generate variable name for ranking %s with %s. All candidates in use." msgstr "" "Nem lehet változónevet előállítani a(z) %s rangsorolásnál ezzel: %s. Az " "összes jelölt használatban van." #: src/language/stats/rank.c:321 #, c-format msgid "Too many variables in %s clause." msgstr "Túl sok változó a(z) %s feltételben." #: src/language/stats/rank.c:323 #, c-format msgid "Variable %s already exists." msgstr "A(z) %s változó már létezik." #: src/language/stats/rank.c:325 src/language/expressions/evaluate.c:164 #, c-format msgid "Duplicate variable name %s." msgstr "Ismételt változónév: %s." #: src/language/stats/rank.c:631 #, c-format msgid "%s of %s by %s" msgstr "%s / %s e szerint: %s" #: src/language/stats/rank.c:825 #, fuzzy #| msgid "Variables Created By %s" msgid "Variables Created by RANK" msgstr "%s által létrehozott változók" #: src/language/stats/rank.c:828 src/language/stats/rank.c:829 #, fuzzy #| msgid "Name Variable:" msgid "New Variable" msgstr "Név változó:" #: src/language/stats/rank.c:829 #, fuzzy #| msgid "Function: " msgid "Function" msgstr "Függvény: " #: src/language/stats/rank.c:830 #, fuzzy #| msgid "Extraction" msgid "Fraction" msgstr "Kinyerés" #: src/language/stats/rank.c:830 #, fuzzy #| msgid "_Grouping Variable:" msgid "Grouping Variables" msgstr "_Csoportosító változó:" #: src/language/stats/rank.c:833 src/language/stats/rank.c:834 #, fuzzy #| msgid "_Test Variable:" msgid "Existing Variable" msgstr "_Próbaváltozó:" #: src/language/stats/reliability.c:164 msgid "Reliability on a single variable is not useful." msgstr "Egyetlen változó megbízhatósága haszontalan." #: src/language/stats/reliability.c:281 msgid "" "The STATISTICS subcommand is not yet implemented. No statistics will be " "produced." msgstr "" "A STATISTICS alparancs még nincs megvalósítva. Nem lesz statisztika " "létrehozva." #: src/language/stats/reliability.c:300 msgid "The split point must be less than the number of variables" msgstr "A felosztási pontnak kisebbnek kell lennie, mint a változók száma" #: src/language/stats/reliability.c:525 #, c-format msgid "Scale: %s" msgstr "Arány: %s" #: src/language/stats/reliability.c:582 msgid "Item-Total Statistics" msgstr "Elem-Összes statisztika" #: src/language/stats/reliability.c:585 msgid "Scale Mean if Item Deleted" msgstr "Mintaátlag skálázása, ha egy elem törlésre kerül" #: src/language/stats/reliability.c:586 msgid "Scale Variance if Item Deleted" msgstr "Variancia skálázása, ha egy elem törlésre került" #: src/language/stats/reliability.c:587 msgid "Corrected Item-Total Correlation" msgstr "Javított elem-összes korreláció" #: src/language/stats/reliability.c:588 msgid "Cronbach's Alpha if Item Deleted" msgstr "Cronbach-féle alfa, ha az elem törlésre kerül" #: src/language/stats/reliability.c:627 msgid "Reliability Statistics" msgstr "Megbízhatósági statisztika" #: src/language/stats/reliability.c:634 src/language/stats/reliability.c:646 msgid "Cronbach's Alpha" msgstr "Cronbach-féle alfa" #: src/language/stats/reliability.c:635 src/language/stats/reliability.c:649 #: src/language/stats/reliability.c:652 msgid "N of Items" msgstr "Elemek száma" #: src/language/stats/reliability.c:647 msgid "Part 1" msgstr "1. rész" #: src/language/stats/reliability.c:650 msgid "Part 2" msgstr "2. rész" #: src/language/stats/reliability.c:654 msgid "Total N of Items" msgstr "Elemek összes száma" #: src/language/stats/reliability.c:656 msgid "Correlation Between Forms" msgstr "Korreláció az űrlapok közt" #: src/language/stats/reliability.c:659 msgid "Spearman-Brown Coefficient" msgstr "Spearman–Brown együttható" #: src/language/stats/reliability.c:660 msgid "Equal Length" msgstr "Egyenlő hossz" #: src/language/stats/reliability.c:661 msgid "Unequal Length" msgstr "Nem egyenlő hossz" #: src/language/stats/reliability.c:663 msgid "Guttman Split-Half Coefficient" msgstr "Guttman-féle felezési együttható" #: src/language/stats/roc.c:966 msgid "Area Under the Curve" msgstr "Görbe alatti terület" #: src/language/stats/roc.c:970 msgid "Area" msgstr "Terület" #: src/language/stats/roc.c:976 msgid "Asymptotic Sig." msgstr "Aszimptotikus szig." #: src/language/stats/roc.c:979 #, c-format msgid "Asymp. %g%% Confidence Interval" msgstr "Aszimp. %g%% konfidencia intervallum" #: src/language/stats/roc.c:987 msgid "Variable under test" msgstr "Próba alatti változó" #: src/language/stats/roc.c:1026 msgid "Case Summary" msgstr "Esetösszegzés" #: src/language/stats/roc.c:1030 msgid "Unweighted" msgstr "Súlyozatlan" #: src/language/stats/roc.c:1031 msgid "Weighted" msgstr "Súlyozott" #: src/language/stats/roc.c:1064 msgid "Coordinates of the Curve" msgstr "A görbe koordinátái" #: src/language/stats/roc.c:1068 msgid "Positive if greater than or equal to" msgstr "Pozitív, ha nagyobb vagy egyenlő mint" #: src/language/stats/roc.c:1069 src/output/charts/roc-chart-cairo.c:38 msgid "Sensitivity" msgstr "Érzékenység" #: src/language/stats/roc.c:1069 src/output/charts/roc-chart-cairo.c:37 msgid "1 - Specificity" msgstr "1- Fajlagosság" #: src/language/stats/roc.c:1072 #, fuzzy #| msgid "ordinary" msgid "Coordinates" msgstr "szokványos" #: src/language/stats/roc.c:1076 msgid "Test variable" msgstr "Próbaváltozó" #: src/language/stats/regression.c:224 src/language/stats/regression.c:229 #, c-format msgid "VARIABLES may not appear after %s" msgstr "VARIABLES nem szerepelhet a(z) %s után" #: src/language/stats/regression.c:412 msgid "" "REGRESSION with SAVE ignores TEMPORARY. Temporary transformations will be " "made permanent." msgstr "" "A REGRESSION a SAVE beállítással figyelmen kívül hagyja a TEMPORARY-t. Az " "átmeneti átalakítások véglegesek lesznek." #: src/language/stats/regression.c:416 msgid "REGRESSION with SAVE ignores FILTER. All cases will be processed." msgstr "" "A REGRESSION a SAVE beállítással figyelmen kívül hagyja a FILTER-t. Minden " "eset feldolgozásra kerül." #: src/language/stats/regression.c:569 msgid "" "The dependent variable is equal to the independent variable. The least " "squares line is therefore Y=X. Standard errors and related statistics may be " "meaningless." msgstr "" "A függő változó megegyezik a független változóval. A legkisebb négyzetek " "vonal ezért Y=X. A sztenderd hibák és a kapcsolódó statisztikák " "értelmetlenek lehetnek." #: src/language/stats/regression.c:776 msgid "No valid data found. This command was skipped." msgstr "Nem található érvényes adat. A parancs kihagyva." #: src/language/stats/regression.c:863 #, c-format msgid "Model Summary (%s)" msgstr "Modell összefoglaló (%s)" #: src/language/stats/regression.c:868 #: src/ui/gui/psppire-dialog-action-regression.c:42 msgid "R" msgstr "R" #: src/language/stats/regression.c:868 msgid "R Square" msgstr "R négyzet" #: src/language/stats/regression.c:868 msgid "Adjusted R Square" msgstr "Igazított R négyzet" #: src/language/stats/regression.c:869 msgid "Std. Error of the Estimate" msgstr "A becslés sztenderd hibája" #: src/language/stats/regression.c:895 #, c-format msgid "Coefficients (%s)" msgstr "Együtthatók (%s)" #: src/language/stats/regression.c:901 msgid "Unstandardized Coefficients" msgstr "Nem sztenderdizált együtthatók" #: src/language/stats/regression.c:904 msgid "Standardized Coefficients" msgstr "Sztenderdizált együtthatók" #: src/language/stats/regression.c:904 msgid "Beta" msgstr "Béta" #: src/language/stats/regression.c:911 #, c-format msgid "%g%% Confidence Interval for B" msgstr "%g%%-os konfidencia intervallum a B-hez" #: src/language/stats/regression.c:919 #, fuzzy #| msgid "Reliability Statistics" msgid "Collinearity Statistics" msgstr "Megbízhatósági statisztika" #: src/language/stats/regression.c:920 #, fuzzy #| msgid "Covariance" msgid "Tolerance" msgstr "Kovariancia" #: src/language/stats/regression.c:920 msgid "VIF" msgstr "" #: src/language/stats/regression.c:933 msgid "(Constant)" msgstr "(Állandó)" #: src/language/stats/regression.c:1020 #, c-format msgid "ANOVA (%s)" msgstr "ANOVA (%s)" #: src/language/stats/regression.c:1031 src/ui/gui/regression.ui:24 msgid "Regression" msgstr "Regresszió" #: src/language/stats/regression.c:1075 #, c-format msgid "Coefficient Correlations (%s)" msgstr "Együttható korrelációk (%s)" #: src/language/stats/regression.c:1082 #, fuzzy #| msgid "Model" msgid "Models" msgstr "Modell" #: src/language/stats/regression.c:1090 msgid "Covariances" msgstr "Kovarianciák" #: src/language/stats/runs.c:169 #, c-format msgid "" "Multiple modes exist for variable `%s'. Using %.*g as the threshold value." msgstr "" "Több mód létezik a(z) „%s” változóhoz. %.*g használata küszöbértékként." #: src/language/stats/runs.c:314 src/ui/gui/runs.ui:24 msgid "Runs Test" msgstr "Végrehajtja a próbát" #: src/language/stats/runs.c:319 msgid "Test Value" msgstr "Próbaérték" #: src/language/stats/runs.c:320 msgid "Test Value (mode)" msgstr "Próbaérték (módusz)" #: src/language/stats/runs.c:321 msgid "Test Value (mean)" msgstr "Próbaérték (mintaátlag)" #: src/language/stats/runs.c:322 msgid "Test Value (median)" msgstr "Próbaérték (medián)" #: src/language/stats/runs.c:323 msgid "Cases < Test Value" msgstr "Esetek < Próbaérték" #: src/language/stats/runs.c:324 msgid "Cases ≥ Test Value" msgstr "Esetek ≥ Próbaérték" #: src/language/stats/runs.c:325 msgid "Total Cases" msgstr "Összes eset" #: src/language/stats/runs.c:326 msgid "Number of Runs" msgstr "Futások száma" #: src/language/stats/sign.c:72 #, fuzzy #| msgid "Mean Difference" msgid "Differences" msgstr "Mintaátlag különbsége" #: src/language/stats/sign.c:73 msgid "Negative Differences" msgstr "Negatív eltérések" #: src/language/stats/sign.c:74 msgid "Positive Differences" msgstr "Pozitív eltérések" #: src/language/stats/sign.c:75 src/language/stats/wilcoxon.c:250 msgid "Ties" msgstr "Egyezések" #: src/language/stats/sort-cases.c:63 msgid "Buffer limit must be at least 2." msgstr "A pufferlimit legalább 2 kell legyen." #: src/language/stats/sort-criteria.c:89 #, c-format msgid "Variable %s specified twice in sort criteria." msgstr "A(z) %s változó kétszer van megadva a rendezési feltételek közt." #: src/language/stats/t-test-indep.c:190 msgid "Group Statistics" msgstr "Csoportstatisztika" #: src/language/stats/t-test-indep.c:200 #, fuzzy #| msgid "Group1" msgid "Group" msgstr "1. csoport" #: src/language/stats/t-test-indep.c:256 msgid "Independent Samples Test" msgstr "Független mintás próba" #: src/language/stats/t-test-indep.c:261 msgid "Levene's Test for Equality of Variances" msgstr "Levene-próba a varianciák egyezésére" #: src/language/stats/t-test-indep.c:265 #, fuzzy #| msgid "t-test for Equality of Means" msgid "T-Test for Equality of Means" msgstr "t-próba a mintaátlagok egyezésére" #: src/language/stats/t-test-indep.c:269 #: src/language/stats/t-test-one-sample.c:77 msgid "Mean Difference" msgstr "Mintaátlag különbsége" #: src/language/stats/t-test-indep.c:270 msgid "Std. Error Difference" msgstr "Sztd. hiba eltérés" #: src/language/stats/t-test-indep.c:273 #, fuzzy, no-c-format #| msgid "%g%% Confidence Interval of the Difference" msgid "95% Confidence Interval of the Difference" msgstr "Az eltérés %g%%-os konfidencia intervalluma" #: src/language/stats/t-test-indep.c:277 #, fuzzy #| msgid "Options" msgid "Assumptions" msgstr "Beállítások" #: src/language/stats/t-test-indep.c:278 msgid "Equal variances assumed" msgstr "Egyenlő varianciák feltételezése" #: src/language/stats/t-test-indep.c:279 msgid "Equal variances not assumed" msgstr "Egyenlő varianciák nincsenek feltételezve" #: src/language/stats/t-test-one-sample.c:64 msgid "One-Sample Test" msgstr "Egymintás próba" #: src/language/stats/t-test-one-sample.c:71 #, fuzzy, c-format #| msgid "Test Value = %f" msgid "Test Value = %.*g" msgstr "Próbaérték = %f" #: src/language/stats/t-test-one-sample.c:80 #: src/language/stats/t-test-paired.c:246 #, c-format msgid "%g%% Confidence Interval of the Difference" msgstr "Az eltérés %g%%-os konfidencia intervalluma" #: src/language/stats/t-test-one-sample.c:122 msgid "One-Sample Statistics" msgstr "Egymintás statisztikák" #: src/language/stats/t-test-paired.c:147 msgid "Paired Sample Statistics" msgstr "Páros mintás statisztikák" #: src/language/stats/t-test-paired.c:163 #: src/language/stats/t-test-paired.c:205 #: src/language/stats/t-test-paired.c:263 #, fuzzy, c-format #| msgid "Pair %d" msgid "Pair %zu" msgstr "%d. pár" #: src/language/stats/t-test-paired.c:190 msgid "Paired Samples Correlations" msgstr "Páros mintás korrelációk" #: src/language/stats/t-test-paired.c:208 #, c-format msgid "%s & %s" msgstr "%s és %s" #: src/language/stats/t-test-paired.c:234 msgid "Paired Samples Test" msgstr "Páros mintás próba" #: src/language/stats/t-test-paired.c:240 msgid "Paired Differences" msgstr "Páros eltérések" #: src/language/stats/t-test-paired.c:266 #, c-format msgid "%s - %s" msgstr "%s - %s" #: src/language/stats/t-test-parser.c:133 #, c-format msgid "When applying %s to a string variable, two values must be specified." msgstr "" "Egy karakterlánc változón törtönő %s alkalmazásakor két értéket kell megadni." #: src/language/stats/t-test-parser.c:145 #: src/language/stats/t-test-parser.c:241 #, c-format msgid "%s subcommand may not be used with %s." msgstr "A(z) %s alparancs nem használható ezzel: %s." #: src/language/stats/t-test-parser.c:305 msgid "Exactly one of TESTVAL, GROUPS and PAIRS subcommands must be specified." msgstr "" "A TESTVAL, GROUPS és PAIRS alparancsok közül pontosan egyet kell megadni." #: src/language/stats/wilcoxon.c:248 #, fuzzy #| msgid "_Sign" msgid "Sign" msgstr "_Sign" #: src/language/stats/wilcoxon.c:249 msgid "Negative Ranks" msgstr "Negatív rangok" #: src/language/stats/wilcoxon.c:249 msgid "Positive Ranks" msgstr "Pozitív rangok" #: src/language/stats/wilcoxon.c:296 #, fuzzy #| msgid "Too many pairs to calculate exact significance." msgid "Too many pairs to calculate exact significance" msgstr "Túl sok pár a pontos szignifikancia kiszámításához." #: src/language/data-io/combine-files.c:214 msgid "Cannot specify the active dataset since none has been defined." msgstr "" "Nem lehet megadni az aktív adathalmazt, mivel egy sem lett meghatározva." #: src/language/data-io/combine-files.c:220 msgid "" "This command may not be used after TEMPORARY when the active dataset is an " "input source. Temporary transformations will be made permanent." msgstr "" "Ez a parancs nem használható a TEMPORARY parancs után, ha az aktív " "adathalmaz egy bemeneti forrás. Az átmeneti transzformációk véglegesítve " "lesznek." #: src/language/data-io/combine-files.c:255 msgid "Multiple IN subcommands for a single FILE or TABLE." msgstr "Több IN alparancs egyetlen FILE vagy TABLE értékhez." #: src/language/data-io/combine-files.c:308 #, c-format msgid "File %s lacks BY variable %s." msgstr "A(z) %s fájlból hiányzik a(z) %s BY változó." #: src/language/data-io/combine-files.c:311 #, c-format msgid "Active dataset lacks BY variable %s." msgstr "Az aktív adathalmazból hiányzik a(z) %s BY változó." #: src/language/data-io/combine-files.c:388 #: src/language/data-io/combine-files.c:393 #, c-format msgid "BY is required when %s is specified." msgstr "A BY kötelező, ha a(z) %s meg van adva." #: src/language/data-io/combine-files.c:521 msgid "" "Combining files with incompatible encodings. String data may not be " "represented correctly." msgstr "" "Fájlok egyesítése inkompatibilis kódolásokkal. A karakterlánc adatok esetleg " "nem lesznek helyesen ábrázolva." #: src/language/data-io/combine-files.c:564 #, c-format msgid "" "Variable %s in file %s has different type or width from the same variable in " "earlier file." msgstr "" "A(z) %s változónak a(z) %s fájlban eltérő típusa vagy szélessége van a " "korábbi fájlban lévő ugyanazon változóból." #: src/language/data-io/combine-files.c:570 #, c-format msgid "In file %s, %s is numeric." msgstr "A(z) %s fájlban a(z) %s numerikus." #: src/language/data-io/combine-files.c:573 #, c-format msgid "In file %s, %s is a string variable with width %d." msgstr "A(z) %s fájlban a(z) %s egy %d szélességű karakterlánc-változó." #: src/language/data-io/combine-files.c:578 #, c-format msgid "In an earlier file, %s was numeric." msgstr "Egy korábbi fájlban a(z) %s numerikus volt." #: src/language/data-io/combine-files.c:581 #, c-format msgid "In an earlier file, %s was a string variable with width %d." msgstr "" "Egy korábbi fájlban a(z) %s egy %d szélességű karakterlánc változó volt." #: src/language/data-io/combine-files.c:621 #, c-format msgid "" "Variable name %s specified on %s subcommand duplicates an existing variable " "name." msgstr "" "A(z) %s alparancsban megadott %s változónév egy meglévő változónevet ismétel." #: src/language/data-io/combine-files.c:793 #, c-format msgid "Encountered %zu sets of duplicate cases in the master file." msgstr "%zu ismételt esetkészlet fordult elő a mesterfájlban." #: src/language/data-io/data-list.c:129 src/language/data-io/data-list.c:144 #, fuzzy, c-format #| msgid "The %s value must be nonnegative." msgid "The %s value must be non-negative." msgstr "A(z) %s értéknek nemnegatívnak kell lennie." #: src/language/data-io/data-list.c:154 #, c-format msgid "The %s subcommand may only be used within %s." msgstr "A(z) %s alparancs csak ezen belül használható: %s." #: src/language/data-io/data-list.c:159 #, c-format msgid "The %s subcommand may only be specified once." msgstr "A(z) %s alparancsot csak egyszer lehet megadni." #: src/language/data-io/data-list.c:197 msgid "Only one of FIXED, FREE, or LIST may be specified." msgstr "A FIXED, FREE vagy LIST parancsok közül csak egyet szabad megadni." #: src/language/data-io/data-list.c:260 msgid "Encoding should not be specified for inline data. It will be ignored." msgstr "" "A kódolást nem szükséges megadni beágyazott adatoknál. Figyelmen kívül lesz " "hagyva." #: src/language/data-io/data-list.c:269 #, c-format msgid "The %s subcommand may be used only with %s." msgstr "A(z) %s alparancsot csak ezzel együtt lehet használni: %s." #: src/language/data-io/data-list.c:284 src/language/data-io/matrix-data.c:578 msgid "At least one variable must be specified." msgstr "Legalább egy változót meg kell adni." #: src/language/data-io/data-list.c:383 src/language/data-io/data-list.c:491 #: src/language/data-io/get-data.c:662 #, c-format msgid "%s is a duplicate variable name." msgstr "A(z) %s egy ismételt változónév." #: src/language/data-io/data-list.c:390 #, c-format msgid "There is already a variable %s of a different type." msgstr "Már van egy eltérő típusú %s változó." #: src/language/data-io/data-list.c:397 #, c-format msgid "There is already a string variable %s of a different width." msgstr "Már van egy eltérő szélességű %s karakterlánc változó." #: src/language/data-io/data-list.c:405 #, c-format msgid "Cannot place variable %s on record %d when RECORDS=%d is specified." msgstr "" "Nem lehet elhelyezni a(z) %s változót a(z) %d. rekordba, ha a RECORDS=%d meg " "van adva." #: src/language/data-io/data-parser.c:453 #: src/language/data-io/data-parser.c:462 msgid "Quoted string extends beyond end of line." msgstr "Az idézőjelbe tette karakterlánc túlér a sor végén." #: src/language/data-io/data-parser.c:488 msgid "Missing delimiter following quoted string." msgstr "Hiányzó elválasztójel az idézőjelbe tett karakterlánc után." #: src/language/data-io/data-parser.c:506 #, c-format msgid "Data for variable %s is not valid as format %s: %s" msgstr "A(z) %s változó adata érvénytelen a(z) %s formátum szerint: %s" #: src/language/data-io/data-parser.c:536 #, c-format msgid "Partial case of %d of %d records discarded." msgstr "%d / %d részleges eset rekord elvetve." #: src/language/data-io/data-parser.c:592 #, c-format msgid "Partial case discarded. The first variable missing was %s." msgstr "Részleges eset elvetve. Az első hiányzó változó a(z) %s volt." #: src/language/data-io/data-parser.c:634 #, c-format msgid "" "Missing value(s) for all variables from %s onward. These will be filled " "with the system-missing value or blanks, as appropriate." msgstr "" "Hiányzó értékek minden változónál a(z) %s változót követően. Ezek megfelelő " "módon, hiányzó vagy üres értékekkel lesznek feltöltve." #: src/language/data-io/data-parser.c:655 msgid "Record ends in data not part of any field." msgstr "A rekord olyan adatokkal ér véget, amely egyetlen mezőnek sem része." #: src/language/data-io/data-parser.c:670 #, c-format msgid "Reading %d record from %s." msgid_plural "Reading %d records from %s." msgstr[0] "%d rekord olvasása innen: %s." msgstr[1] "%d rekord olvasása innen: %s." #: src/language/data-io/data-parser.c:680 src/language/data-io/print.c:435 msgid "Record" msgstr "Rekord" #: src/language/data-io/data-parser.c:680 src/language/data-io/print.c:435 #: src/ui/gui/psppire-var-sheet-header.c:76 msgid "Columns" msgstr "Oszlopok" #: src/language/data-io/data-parser.c:680 #: src/language/data-io/data-parser.c:725 src/language/data-io/print.c:435 msgid "Format" msgstr "Formátum" #: src/language/data-io/data-parser.c:720 #, c-format msgid "Reading free-form data from %s." msgstr "Szabad szöveges adatok olvasása innen: %s." #. TRANSLATORS: this fragment will be interpolated into #. messages in fh_lock() that identify types of files. #: src/language/data-io/data-reader.c:136 src/language/data-io/data-writer.c:79 msgid "data file" msgstr "adatfájl" #: src/language/data-io/data-reader.c:160 #, c-format msgid "Could not open `%s' for reading as a data file: %s." msgstr "A(z) „%s” nem nyitható meg adatfájlként: %s." #: src/language/data-io/data-reader.c:174 #, c-format msgid "Could not read `%s' as a text file with encoding `%s': %s." msgstr "A(z) „%s” nem nyitható meg „%s” kódolású szövegfájlként: %s." #: src/language/data-io/data-reader.c:233 #, c-format msgid "" "Missing %s while reading inline data. This probably indicates a missing or " "incorrectly formatted %s command. %s must appear by itself on a single line " "with exactly one space between words." msgstr "" "Hiányzó %s a beágyazott adatok olvasásakor. Lehetséges hogy ez egy hiányzó " "vagy helytelenül formázott %s parancsra utal. A(z) %s önmagában kell " "megjelenjen, egy sorban, pontosan egy szóközzel a szavak között." #: src/language/data-io/data-reader.c:253 #: src/language/data-io/data-reader.c:387 #, c-format msgid "Error reading file %s: %s." msgstr "Hiba a(z) %s fájl olvasásakor: %s." #: src/language/data-io/data-reader.c:261 #, c-format msgid "Unexpected end of file in partial record reading %s." msgstr "Váratlan fájlvég a(z) %s részleges rekord olvasásakor." #: src/language/data-io/data-reader.c:321 #, c-format msgid "Corrupt block descriptor word at offset 0x%lx in %s." msgstr "Sérült blokkleíró szó a 0x%lx eltolásnál, itt: %s." #: src/language/data-io/data-reader.c:322 #, c-format msgid "Corrupt record descriptor word at offset 0x%lx in %s." msgstr "Sérült rekordleíró szó a 0x%lx eltolásnál, itt: %s." #: src/language/data-io/data-reader.c:335 #, c-format msgid "Corrupt record size at offset 0x%lx in %s." msgstr "Sérült rekordméret a 0x%lx eltolásnál, itt: %s." #: src/language/data-io/data-reader.c:493 msgid "Record exceeds remaining block length." msgstr "A rekordok túllépik a hátralévő blokkhosszt." #: src/language/data-io/data-reader.c:567 #, c-format msgid "Attempt to read beyond end-of-file on file %s." msgstr "Olvasási kísérlet a(z) %s fájl vége után." #: src/language/data-io/data-reader.c:570 #, c-format msgid "Attempt to read beyond %s." msgstr "Olvasási kísérlet a(z) %s után." #: src/language/data-io/data-reader.c:733 msgid "" "This command is not valid here since the current input program does not " "access the inline file." msgstr "" "Ez a parancs nem érvényes itt, hiszen a jelenlegi bemeneti program nem éri " "el a beágyazott fájlt." #: src/language/data-io/data-writer.c:106 #, c-format msgid "An error occurred while opening `%s' for writing as a data file: %s." msgstr "" "Hiba történt a(z) „%s” változó adatfájlként írásra történő megnyitásakor: %s." #: src/language/data-io/data-writer.c:224 #, c-format msgid "I/O error occurred writing data file `%s'." msgstr "Ki-/bemeneti hiba történt a(z) „%s” adatfájl írásakor." #: src/language/data-io/dataset.c:64 #, c-format msgid "There is no dataset named %s." msgstr "Nincs %s nevű adathalmaz." #: src/language/data-io/dataset.c:250 #, fuzzy #| msgid "Dataset" msgid "Datasets" msgstr "Adathalmaz" #: src/language/data-io/dataset.c:263 msgid "unnamed dataset" msgstr "névtelen adathalmaz" #: src/language/data-io/file-handle.c:61 #, c-format msgid "" "File handle %s is already defined. Use %s before redefining a file handle." msgstr "" "A(z) %s fájlkezelő már meg lett határozva. Használja ezt a fájlkezelő " "újradefiniálása előtt: %s." #: src/language/data-io/file-handle.c:241 #, c-format msgid "%s must be specified with %s." msgstr "a(z) %s ezzel együtt kell legyen megadva: %s." #: src/language/data-io/file-handle.c:252 #, c-format msgid "" "The specified file mode requires LRECL. Assuming %zu-character records." msgstr "" "A megadott fájlmód LRECL-t igényel. %zu karakteres rekordok feltételezve." #: src/language/data-io/file-handle.c:256 #, c-format msgid "" "Record length (%d) must be between 1 and %lu bytes. Assuming %zu-character " "records." msgstr "" "A rekordhossz (%d) 1 és %lu bájt között kell legyen. %zu karakteres rekordok " "feltételezve." #: src/language/data-io/file-handle.c:300 msgid "file" msgstr "fájl" #: src/language/data-io/file-handle.c:302 msgid "inline file" msgstr "beágyazott fájl" #: src/language/data-io/file-handle.c:350 msgid "expecting a file name or handle name" msgstr "fájlnév vagy kezelőnév várt" #: src/language/data-io/file-handle.c:365 #, c-format msgid "Handle for %s not allowed here." msgstr "A(z) %s kezelője itt nem megengedett." #: src/language/data-io/get-data.c:108 src/output/measure.c:262 #, c-format msgid "error reading file `%s'" msgstr "hiba a(z) %s fájl olvasásakor" #: src/language/data-io/get-data.c:127 #, c-format msgid "Unsupported TYPE %s." msgstr "Nem támogatott TÍPUS: %s." #: src/language/data-io/get-data.c:278 msgid "The sheet index must be greater than or equal to 1" msgstr "A munkalap indexnek nagyobbnak, vagy egyenlőnek kell lennie mint 1" #: src/language/data-io/get-data.c:285 src/language/data-io/get-data.c:308 #: src/language/data-io/get-data.c:327 #, c-format msgid "%s must be followed by either \"%s\" or \"%s\"." msgstr "A(z) %s után ezek egyike kell következzen: „%s” vagy „%s”." #: src/language/data-io/get-data.c:357 #, c-format msgid "" "%s is allowed only with %s arrangement, but %s arrangement was stated or " "implied earlier in this command." msgstr "" "A(z) %s csak a(z) %s elrendezésnél megengedett, de a(z) %s elrendezés lett " "megadva (konkrétan vagy indirekt) a parancs korábbi részében." #: src/language/data-io/get-data.c:441 src/language/data-io/get-data.c:479 #, c-format msgid "Value of %s must be 1 or greater." msgstr "A(z) %s értékének 1-nek, vagy nagyobbnak kell lennie." #: src/language/data-io/get-data.c:504 msgid "" "Ignoring obsolete IMPORTCASES subcommand. (N OF CASES or SAMPLE may be used " "to substitute.)" msgstr "" "Az elavult IMPORTCASES alparancs figyelmen kívül hagyása. (az N OF CASES " "vagy a SAMPLE használható helyette)" #: src/language/data-io/get-data.c:551 msgid "" "In compatible syntax mode, the QUALIFIER string must contain exactly one " "character." msgstr "" "A kompatibilis szintaxis módban, a QUALIFIER karakterlánc pontosan egy " "karaktert kell tartalmazzon." #: src/language/data-io/get-data.c:583 #, c-format msgid "" "The record number specified, %ld, is at or before the previous record, %d. " "Data fields must be listed in order of increasing record number." msgstr "" "A megadott %ld rekordszám, az előző %d. rekordnál, vagy az előtt található. " "Az adatmezőket rekordszám szerinti növekvő sorrendben kell felsorolni." #: src/language/data-io/get-data.c:592 #, c-format msgid "" "The record number specified, %ld, exceeds the number of records per case " "specified on FIXCASE, %d." msgstr "" "A megadott %ld rekordszám meghaladja FIXCASE-nél megadott %d rekord / eset " "számát." #: src/language/data-io/get.c:132 #, c-format msgid "%s: Data file dictionary has no variables." msgstr "%s: Az adatfájl szótárnak nincsenek változói." #: src/language/data-io/inpt-pgm.c:133 #, c-format msgid "Unexpected end-of-file within %s." msgstr "Váratlan fájlvég ezen belül: %s." #: src/language/data-io/inpt-pgm.c:146 #, c-format msgid "Input program must contain %s or %s." msgstr "A bemeneti programnak tartalmaznia kell az egyiket: %s vagy %s." #: src/language/data-io/inpt-pgm.c:152 msgid "Input program did not create any variables." msgstr "A bemeneti program nem hozott létre egyetlen változót sem." #: src/language/data-io/inpt-pgm.c:365 msgid "" "REREAD: Column numbers must be positive finite numbers. Column set to 1." msgstr "" "REREAD: Az oszlopszámoknak véges, pozitív számoknak kell lenniük. Az oszlop " "beállítva 1-re." #: src/language/data-io/list.c:100 #, fuzzy #| msgid "Dataset" msgid "Data List" msgstr "Adathalmaz" #: src/language/data-io/list.c:221 #, c-format msgid "" "The first case (%ld) specified precedes the last case (%ld) specified. The " "values will be swapped." msgstr "" "A megadott első eset (%ld) megelőzi a megadott utolsó esetet (%ld). Az " "értékek fel lesznek cserélve." #: src/language/data-io/list.c:230 #, c-format msgid "" "The first case (%ld) to list is numbered less than 1. The value is being " "reset to 1." msgstr "" "Az első felsorolandó eset (%ld) száma kisebb mint 1. Az érték újra be lett " "állítva 1-re." #: src/language/data-io/list.c:237 #, c-format msgid "" "The last case (%ld) to list is numbered less than 1. The value is being " "reset to 1." msgstr "" "Az utolsó felsorolandó eset (%ld) száma kisebb mint 1. Az érték újra be lett " "állítva 1-re." #: src/language/data-io/list.c:244 #, c-format msgid "The step value %ld is less than 1. The value is being reset to 1." msgstr "" "A(z) %ld léptetési érték kisebb mint 1. Az érték újra be lett állítva 1-re." #: src/language/data-io/placement-parser.c:96 #, c-format msgid "" "Number of variables specified (%zu) differs from number of variable formats " "(%zu)." msgstr "A megadott változószám (%zu) eltér a változóformátumok számától (%zu)." #: src/language/data-io/placement-parser.c:106 msgid "" "SPSS-like or Fortran-like format specification expected after variable names." msgstr "" "SPSS-szerű vagy Fortran-szerű formátummegadás várt a változónevek után." #: src/language/data-io/placement-parser.c:129 #, c-format msgid "The %d columns %d-%d can't be evenly divided into %zu fields." msgstr "A(z) %d oszlop: %d-%d, nem osztható fel egyenlően %zu mezőbe." #: src/language/data-io/placement-parser.c:310 msgid "Column positions for fields must be positive." msgstr "A mezők oszloppozíciója pozitív kell legyen." #: src/language/data-io/placement-parser.c:312 msgid "Column positions for fields must not be negative." msgstr "A mezők oszloppozíciója negatív kell legyen." #: src/language/data-io/placement-parser.c:372 msgid "The ending column for a field must be greater than the starting column." msgstr "A mező záróoszlopa nagyobb kell legyen, mint a kezőoszlopa." #: src/language/data-io/placement-parser.c:409 #, fuzzy, c-format #| msgid "" #| "The record number specified, %ld, is at or before the previous record, " #| "%d. Data fields must be listed in order of increasing record number." msgid "" "The record number specified, %.0f, is at or before the previous record, %d. " "Data fields must be listed in order of increasing record number." msgstr "" "A megadott %ld rekordszám, az előző %d. rekordnál, vagy az előtt található. " "Az adatmezőket rekordszám szerinti növekvő sorrendben kell felsorolni." #: src/language/data-io/print-space.c:127 #, c-format msgid "The expression on %s evaluated to the system-missing value." msgstr "A(z) %s változón megadott kifejezés hiányzó értékre értékelődött ki." #: src/language/data-io/print-space.c:130 #, c-format msgid "The expression on %s evaluated to %g." msgstr "A(z) %s változón megadott kifejezés erre értékelődött ki: %g." #: src/language/data-io/print.c:189 src/language/data-io/trim.c:58 msgid "expecting a valid subcommand" msgstr "érvényes alparancs várt" #: src/language/data-io/print.c:219 #, c-format msgid "%s is required when binary formats are specified." msgstr "A(z) %s szükséges, amikor bináris formátum van megadva." #: src/language/data-io/print.c:302 #, c-format msgid "Output calls for %d records but %zu specified on RECORDS subcommand." msgstr "A kimenet %d rekordot vár, de %zu lett megadva a RECORDS alparancsban." #: src/language/data-io/print.c:432 #, fuzzy #| msgid "Case Processing Summary" msgid "Print Summary" msgstr "Esetfeldolgozási összegzés" #: src/language/data-io/print.c:462 #, fuzzy #| msgid "Record" msgid "N of Records" msgstr "Rekord" #: src/language/data-io/matrix-data.c:191 #, c-format msgid "" "There are %d variable declared but the data has at least %d matrix rows." msgstr "" "%d változó van megadva, de az adatokban legalább %d mátrixsor szerepel." #: src/language/data-io/matrix-data.c:292 msgid "" "The N subcommand was specified, but a N record was also found in the data. " "The N record will be ignored." msgstr "" "Az N alparancs volt megadva, de már található N rekord az adatokban. Az N " "rekord figyelmen kívül lesz hagyva." #: src/language/data-io/matrix-data.c:488 src/language/utilities/set.q:186 #, c-format msgid "%s must not be negative." msgstr "%s nem lehet negatív." #: src/language/data-io/matrix-data.c:568 msgid "FORMAT = FULL and FORMAT = NODIAGONAL are mutually exclusive." msgstr "A FORMAT = FULL és a FORMAT = NODIAGONAL kölcsönösen kizárják egymást." #: src/language/data-io/matrix-reader.c:102 #: src/language/data-io/matrix-reader.c:118 #, c-format msgid "Matrix dataset lacks a variable called %s." msgstr "A mátrix adathalmazból hiányzik a(z) %s változó." #: src/language/data-io/matrix-reader.c:109 #: src/language/data-io/matrix-reader.c:125 #, c-format msgid "Matrix dataset variable %s should be of string type." msgstr "A mátrix adathalmaz %s változó karakterlánc kell legyen." #: src/language/data-io/save-translate.c:168 #: src/language/data-io/save-translate.c:183 #, c-format msgid "The %s string must contain exactly one character." msgstr "A(z) %s karakterlánc pontosan egy karaktert kell tartalmazzon." #: src/language/data-io/save-translate.c:249 #, c-format msgid "Output file `%s' exists but %s was not specified." msgstr "A(z) „%s” kimeneti fájl létezik, de a(z) %s nem lett megadva." #: src/language/data-io/save.c:309 msgid "The OUTFILE or METADATA subcommand is required." msgstr "" #: src/language/data-io/trim.c:69 #, c-format msgid "" "Cannot rename %s as %s because there already exists a variable named %s. To " "rename variables with overlapping names, use a single RENAME subcommand such " "as `/RENAME (A=B)(B=C)(C=A)', or equivalently, `/RENAME (A B C=B C A)'." msgstr "" "A(z) %s nem nevezhető át erre: %s, mert már létezik %s nevű változó. Az " "ütköző nevű változók átnevezéséhez használjon egy RENAME alparancsot, mint " "például `/RENAME (A=B)(B=C)(C=A)`, vagy ekvivalens módon: `/RENAME (A B C=B " "C A)`." #: src/language/data-io/trim.c:227 #, c-format msgid "" "Number of variables on left side of `=' (%zu) does not match number of " "variables on right side (%zu), in parenthesized group %d of RENAME " "subcommand." msgstr "" "Az `=` bal oldalán található változók száma (%zu) nem egyezik a jobb oldali " "változók számával (%zu), a RENAME alparancs %d. zárójelbe tett csoportjában." #: src/language/data-io/trim.c:242 #, c-format msgid "Requested renaming duplicates variable name %s." msgstr "%s ismételt változónév átnevezése kérve." #: src/language/data-io/trim.c:281 msgid "Cannot DROP all variables from dictionary." msgstr "Nem dobható el az összes változó a szótárból a DROP paranccsal." #: src/language/expressions/evaluate.c:151 msgid "expecting number or string" msgstr "szám vagy karakterlánc várt" #: src/language/expressions/helpers.c:43 msgid "" "One of the arguments to a DATE function is not an integer. The result will " "be system-missing." msgstr "" "A DATE függvény egyik argumentuma nem egész szám. Az eredmény hiányzó érték " "lesz." #: src/language/expressions/helpers.c:71 msgid "" "The week argument to DATE.WKYR is not an integer. The result will be system-" "missing." msgstr "" "A DATE.WKYR hét argumentuma nem egész szám. Az eredmény hiányzó érték lesz." #: src/language/expressions/helpers.c:77 msgid "" "The week argument to DATE.WKYR is outside the acceptable range of 1 to 53. " "The result will be system-missing." msgstr "" "A DATE.WKYR hét argumentuma kívül esik az elfogadható 1…53 tartományból. Az " "eredmény hiányzó érték lesz." #: src/language/expressions/helpers.c:99 msgid "" "The day argument to DATE.YRDAY is not an integer. The result will be system-" "missing." msgstr "" "A DATE.YRDAY nap argumentuma nem egész szám. Az eredmény hiányzó érték lesz." #: src/language/expressions/helpers.c:105 msgid "" "The day argument to DATE.YRDAY is outside the acceptable range of 1 to 366. " "The result will be system-missing." msgstr "" "A DATE.YRDAY nap argumentuma kívül esik az elfogadható 1…266 tartományból. " "Az eredmény hiányzó érték lesz." #: src/language/expressions/helpers.c:127 msgid "" "The year argument to YRMODA is greater than 47516. The result will be " "system-missing." msgstr "" "Az YRMODA év argumentuma nagyobb mint 47516. Az eredmény hiányzó érték lesz." #: src/language/expressions/helpers.c:180 #, c-format msgid "" "Unrecognized date unit `%.*s'. Valid date units are `%s', `%s', `%s', `%s', " "`%s', `%s', `%s', and `%s'." msgstr "" "Nem felismert dátumegység: „%.*s”. Az érvényes dátumegységek a következőek: " "„%s”, „%s”, „%s”, „%s”, „%s”, „%s”, „%s” vagy „%s”." #: src/language/expressions/helpers.c:333 #, c-format msgid "Invalid DATESUM method. Valid choices are `%s' and `%s'." msgstr "Érvénytelen DATESUM módszer. Az érvényes választások: „%s” és „%s”." #: src/language/expressions/parse.c:261 #, c-format msgid "" "Type mismatch: expression has %s type, but a numeric value is required here." msgstr "" "Típuseltérés: a kifejezés %s típusú, de itt egy numerikus érték szükséges." #: src/language/expressions/parse.c:274 #, c-format msgid "" "Type mismatch: expression has %s type, but a string value is required here." msgstr "" "Típuseltérés: a kifejezés %s típusú, de itt egy karakterlánc érték szükséges." #: src/language/expressions/parse.c:436 #, c-format msgid "Type mismatch while applying %s operator: cannot convert %s to %s." msgstr "" "Típuseltérés a(z) %s operátor alkalmazásakor: nem alakítható át a(z) %s " "erre: %s." #: src/language/expressions/parse.c:650 msgid "" "Chaining relational operators (e.g. `a < b < c') will not produce the " "mathematically expected result. Use the AND logical operator to fix the " "problem (e.g. `a < b AND b < c'). If chaining is really intended, " "parentheses will disable this warning (e.g. `(a < b) < c'.)" msgstr "" "A relációs operátorok láncolása (pl. „a < b < c”) nem a matematikailag várt " "eredményt adja. Használja az AND logikai operátort a probléma megoldására " "(pl. „a < b AND b < c”). Ha a láncolás tényleg szándékos, akkor a zárójelek " "kikapcsolják ezt a figyelmeztetése (pl. „(a < b) < c”)" #: src/language/expressions/parse.c:752 msgid "" "The exponentiation operator (`**') is left-associative, even though right-" "associative semantics are more useful. That is, `a**b**c' equals " "`(a**b)**c', not as `a**(b**c)'. To disable this warning, insert " "parentheses." msgstr "" "A hatványozás operátor („**”) balról asszociatív, bár a jobbról " "asszociativitás szemantikája hasznosabb. Tehát, „a**b**c” „(a**b)**c”-vel " "egyezik meg, nem pedig „a**(b**c)”-vel. A figyelmeztetés kikapcsolásához " "szúrjon be zárójeleket." #: src/language/expressions/parse.c:832 #, c-format msgid "Unknown system variable %s." msgstr "Ismeretlen %s rendszerváltozó." #: src/language/expressions/parse.c:880 #, c-format msgid "Unknown identifier %s." msgstr "Ismeretlen %s azonosító." #: src/language/expressions/parse.c:1102 #, c-format msgid "%s must have at least %d arguments in list." msgstr "A(z) %s legalább %d argumentummal kell rendelkezzen a listában." #: src/language/expressions/parse.c:1111 #, c-format msgid "%s must have an even number of arguments in list." msgstr "A(z) %s páros számú argumentummal kell rendelkezzen a listában." #: src/language/expressions/parse.c:1114 #, c-format msgid "%s must have multiple of %d arguments in list." msgstr "" "A(z) %s argumentumainak számának a(z) %d többszörösének kell lennie a " "listában." #: src/language/expressions/parse.c:1124 #, c-format msgid "%s function does not accept a minimum valid argument count." msgstr "A(z) %s függvény nem fogad el minimális érvényes argumentumszámot." #: src/language/expressions/parse.c:1133 #, c-format msgid "%s requires at least %d valid arguments in list." msgstr "A(z) %s legalább %d érvényes argumentumot vár a listában." #: src/language/expressions/parse.c:1139 #, c-format msgid "" "With %s, using minimum valid argument count of %d does not make sense when " "passing only %d arguments in list." msgstr "" "A(z) %s használatánál, a(z) %d legkisebb argumentumszámnak nincs értelme, " "amikor csak %d argumentum kerül átadásra a listába." #: src/language/expressions/parse.c:1193 #, c-format msgid "Type mismatch invoking %s as " msgstr "Típuseltérés a(z) %s meghívásakor ekként: " #: src/language/expressions/parse.c:1198 msgid "Function invocation " msgstr "A függvényhívás " #: src/language/expressions/parse.c:1200 msgid " does not match any known function. Candidates are:" msgstr " egyetlen ismert függvényt sem. A jelöltek:" #: src/language/expressions/parse.c:1230 #, c-format msgid "No function or vector named %s." msgstr "Nem található %s nevű függvény vagy vektor." #: src/language/expressions/parse.c:1292 #, c-format msgid "%s is a PSPP extension." msgstr "A(z) %s egy PSPP kiegészítő." #: src/language/expressions/parse.c:1295 #, c-format msgid "%s is not available in this version of PSPP." msgstr "A(z) %s nem érhető el a PSPP ezen verziójában." #: src/language/expressions/parse.c:1302 #, c-format msgid "%s may not appear after %s." msgstr "A(z) %s nem szerepelhet a(z) %s után." #: src/libpspp/ext-array.c:66 msgid "failed to create temporary file" msgstr "átmeneti fájl létrehozása sikertelen" #: src/libpspp/ext-array.c:106 msgid "seeking in temporary file" msgstr "pozicionálás az átmeneti fájlban" #: src/libpspp/ext-array.c:125 msgid "reading temporary file" msgstr "átmeneti fájl olvasása" #: src/libpspp/ext-array.c:127 msgid "unexpected end of file reading temporary file" msgstr "váratlan fájlvég az átmeneti fájl olvasásakor" #: src/libpspp/ext-array.c:147 msgid "writing to temporary file" msgstr "átmeneti fájl írása" #: src/libpspp/i18n.c:1128 msgid "Arabic" msgstr "Arab" #: src/libpspp/i18n.c:1130 msgid "Armenian" msgstr "Örmény" #: src/libpspp/i18n.c:1131 msgid "Baltic" msgstr "Balti" #: src/libpspp/i18n.c:1133 msgid "Celtic" msgstr "Kelta" #: src/libpspp/i18n.c:1134 msgid "Central European" msgstr "Közép-európai" #: src/libpspp/i18n.c:1136 msgid "Chinese Simplified" msgstr "Egyszerűsített kínai" #: src/libpspp/i18n.c:1138 msgid "Chinese Traditional" msgstr "Hagyományos kínai" #: src/libpspp/i18n.c:1140 msgid "Croatian" msgstr "Horvát" #: src/libpspp/i18n.c:1141 msgid "Cyrillic" msgstr "Cirill" #: src/libpspp/i18n.c:1143 msgid "Cyrillic/Russian" msgstr "Cirill/orosz" #: src/libpspp/i18n.c:1144 msgid "Cyrillic/Ukrainian" msgstr "Cirill/ukrán" #: src/libpspp/i18n.c:1146 msgid "Georgian" msgstr "Grúz" #: src/libpspp/i18n.c:1147 msgid "Greek" msgstr "Görög" #: src/libpspp/i18n.c:1148 msgid "Gujarati" msgstr "Gudzsarati" #: src/libpspp/i18n.c:1149 msgid "Gurmukhi" msgstr "Gurmukhi" #: src/libpspp/i18n.c:1150 msgid "Hebrew" msgstr "Héber" #: src/libpspp/i18n.c:1152 msgid "Hebrew Visual" msgstr "Héber (vizuális)" #: src/libpspp/i18n.c:1153 msgid "Hindi" msgstr "Hindi" #: src/libpspp/i18n.c:1154 msgid "Icelandic" msgstr "Izlandi" #: src/libpspp/i18n.c:1155 msgid "Japanese" msgstr "Japán" #: src/libpspp/i18n.c:1157 msgid "Korean" msgstr "Koreai" #: src/libpspp/i18n.c:1159 msgid "Nordic" msgstr "Északi" #: src/libpspp/i18n.c:1160 msgid "Romanian" msgstr "Román" #: src/libpspp/i18n.c:1162 msgid "South European" msgstr "Dél-európai" #: src/libpspp/i18n.c:1163 msgid "Thai" msgstr "Thai" #: src/libpspp/i18n.c:1165 msgid "Turkish" msgstr "Török" #: src/libpspp/i18n.c:1167 msgid "Vietnamese" msgstr "Vietnami" #: src/libpspp/i18n.c:1169 msgid "Western European" msgstr "Nyugat-európai" #: src/libpspp/message.c:89 #, c-format msgid "%s: %s" msgstr "%s: %s" #: src/libpspp/message.c:113 msgid "error" msgstr "hiba" #: src/libpspp/message.c:115 msgid "warning" msgstr "figyelmeztetés" #: src/libpspp/message.c:118 msgid "note" msgstr "megjegyzés" #: src/libpspp/message.c:327 #, c-format msgid "Notes (%d) exceed limit (%d). Suppressing further notes." msgstr "" "A megjegyzések száma (%d) meghaladja a korlátot (%d). További megjegyzések " "elrejtése." #: src/libpspp/message.c:335 #, c-format msgid "Warnings (%d) exceed limit (%d). Syntax processing will be halted." msgstr "" "A figyelmeztetések száma (%d) meghaladja a korlátot (%d). A további " "szintaktikai feldolgozás megáll." #: src/libpspp/message.c:338 #, c-format msgid "Errors (%d) exceed limit (%d). Syntax processing will be halted." msgstr "" "A hibák száma (%d) meghaladja a korlátot (%d). A további szintaktikai " "feldolgozás megáll." #: src/libpspp/zip-reader.c:202 #, fuzzy, c-format #| msgid "Corrupt file at 0x%llx: Expected %; got %" msgid "%s: corrupt archive at 0x%llx: expected %# but got %#" msgstr "Sérült fájl itt: 0x%llx: % várt; % kapott" #: src/libpspp/zip-reader.c:329 src/libpspp/zip-reader.c:449 #, fuzzy, c-format #| msgid "%s: seek failed (%s)." msgid "%s: open failed (%s)" msgstr "%s: pozicionálás sikertelen (%s)." #: src/libpspp/zip-reader.c:344 #, fuzzy, c-format #| msgid "Cannot find central directory" msgid "%s: cannot find central directory" msgstr "Központi könyvtár nem található" #: src/libpspp/zip-reader.c:353 src/libpspp/zip-reader.c:384 #: src/libpspp/zip-reader.c:468 #, fuzzy, c-format #| msgid "%s: seek failed (%s)." msgid "%s: seek failed (%s)" msgstr "%s: pozicionálás sikertelen (%s)." #: src/libpspp/zip-reader.c:441 #, fuzzy, c-format #| msgid "%s: unknown option `%s'" msgid "%s: unknown member \"%s\"" msgstr "%s: ismeretlen beállítás: „%s”" #: src/libpspp/zip-reader.c:503 #, fuzzy, c-format #| msgid "" #| "Name mismatch in zip archive. Central directory says `%s'; local file " #| "header says `%s'" msgid "" "%s: name mismatch between central directory (%s) and local file header (%s)" msgstr "" "Néveltérés a zip archívumban. A központi könyvtár ezt mondja: „%s”; a helyi " "fájlfejléc pedig ezt: „%s”" #: src/libpspp/zip-reader.c:696 #, fuzzy, c-format #| msgid "Cannot initialize inflator: %s" msgid "%s: cannot initialize inflator (%s)" msgstr "A felfújó nem készíthető elő: %s" #: src/libpspp/zip-reader.c:751 #, fuzzy, c-format #| msgid "Error inflating: %s" msgid "%s: error inflating \"%s\" (%s)" msgstr "Hiba a felfújáskor: %s" #: src/libpspp/zip-writer.c:97 utilities/pspp-convert.c:346 #, c-format msgid "%s: error opening output file" msgstr "%s: hiba a kimeneti fájl megnyitásakor" #: src/libpspp/zip-writer.c:169 #, c-format msgid "%s: error seeking in output file" msgstr "%s: hiba a kimeneti fájlban pozicionáláskor" #: src/libpspp/zip-writer.c:210 msgid "error creating temporary file" msgstr "hiba az átmeneti fájl létrehozásakor" #: src/libpspp/zip-writer.c:279 #, c-format msgid "%s: write failed" msgstr "%s: írás sikertelen" #. TRANSLATORS: This is a format string which, when presented to #. printf like functions, will create a pango markup string to #. display real number in scientific notation. #. #. In its untranslated form, it will display similar to "1.23 x 10^4". You #. can leave it untranslated if this is how scientific notation is usually #. presented in your language. #. #. Some locales (such as German) prefer the centered dot rather than the #. multiplication sign between the mantissa an exponent. In which #. case, you can change "#215;" to "#8901;" or other unicode code #. point as appropriate. #. #. The . in this string does not and should not be changed, since #. that is taken care of by the stdc library. #. #. For information on Pango markup, see #. http://developer.gnome.org/pango/stable/PangoMarkupFormat.html #. #. For tables of unicode code points, see http://unicode.org/charts #. #: src/math/chart-geometry.c:123 #, c-format msgid "%%.%dlf×10%d" msgstr "%%.%dlf×10%d" #: src/math/histogram.c:145 msgid "" "Not creating histogram because the data contains less than 2 distinct values" msgstr "" "Nem készül hisztogram, mert az adatok kevesebb mint 2 diszkrét értéket " "tartalmaznak" #: src/math/percentiles.c:36 msgid "HAverage" msgstr "HAverage" #: src/math/percentiles.c:38 msgid "Rounded" msgstr "Kerekített" #: src/math/percentiles.c:39 msgid "Empirical" msgstr "Tapasztalati" #: src/math/percentiles.c:40 msgid "Empirical with averaging" msgstr "Tapasztalati, átlagolással" #: src/math/shapiro-wilk.c:84 msgid "" "One or more weight values are non-integer. Fractional parts will be ignored " "when calculating the Shapiro-Wilk statistic." msgstr "" #: src/output/ascii.c:340 #, c-format msgid "ascii: opening output file `%s'" msgstr "ascii: „%s” kimeneti fájl megnyitása" #: src/output/ascii.c:371 #, c-format msgid "%s: %s must be positive integer or `auto'" msgstr "%s: a(z) %s pozitív egész kell legyen vagy „auto”" #: src/output/ascii.c:393 #, fuzzy, c-format #| msgid "" #| "ascii: page excluding margins and headers must be at least %d characters " #| "wide by %d lines long, but as configured is only %d characters by %d lines" msgid "" "ascii: page must be at least %d characters wide, but as configured is only " "%d characters" msgstr "" "ascii: az oldal, leszámítva a margókat és címkéket, legalább %d karakter " "széles, és %d sor hosszú kell legyen, de csak %d karakter × %d sorként van " "beállítva" #: src/output/ascii.c:508 #, c-format msgid "See %s for a chart." msgstr "Lásd ezt a diagramhoz: %s." #: src/output/charts/piechart.c:54 msgid "*MISSING*" msgstr "*HIÁNYZÓ*" #: src/output/csv.c:100 src/output/html.c:117 src/output/journal.c:166 #: src/output/msglog.c:68 #, c-format msgid "error opening output file `%s'" msgstr "hiba a(z) %s kimeneti fájl megnyitásakor" #: src/output/driver.c:522 #, c-format msgid "%s is not a valid device type (the choices are `%s' and `%s')" msgstr "A(z) %s nem egy érvényes eszköztípus (a lehetőségek: „%s” és „%s”)" #: src/output/driver.c:536 #, c-format msgid "%s: unknown option `%s'" msgstr "%s: ismeretlen beállítás: „%s”" #: src/output/driver.c:553 #, c-format msgid "%s: output option missing `='" msgstr "%s: a kimeneti kapcsolóból hiányzik az „=”" #: src/output/driver.c:560 #, c-format msgid "%s: output option specified more than once" msgstr "%s: a kimeneti kapcsoló többször is meg lett adva" #: src/output/html.c:129 msgid "PSPP Output" msgstr "PSPP kimenet" #: src/output/html.c:266 msgid "No description" msgstr "Nincs leírás" #: src/output/journal.c:69 #, c-format msgid "error writing output file `%s'" msgstr "hiba a(z) %s kimeneti fájl írásakor" #: src/output/measure.c:68 #, c-format msgid "`%s' is not a valid length." msgstr "A(z) „%s” hossz érvénytelen." #: src/output/measure.c:96 #, c-format msgid "syntax error in paper size `%s'" msgstr "szintaktikai hiba a(z) „%s” papírméretben" #: src/output/measure.c:233 #, c-format msgid "unknown paper type `%.*s'" msgstr "ismeretlen „%.*s” papírtípus" #: src/output/measure.c:251 #, c-format msgid "error opening input file `%s'" msgstr "hiba a(z) %s bemeneti fájl megnyitásakor" #: src/output/measure.c:279 #, c-format msgid "file `%s' does not state a paper size" msgstr "a(z) „%s” fájl nem adja meg a papírméretet" #: src/output/options.c:112 #, c-format msgid "%s: `%s' is `%s' but a Boolean value is required" msgstr "%s: a(z) „%s” „%s” típusú, de egy logikai érték szükséges" #: src/output/options.c:187 #, c-format msgid "%s: `%s' is `%s' but one of the following is required: %s" msgstr "%s: a(z) „%s” „%s”, de a következők egyike szükséges: %s" #: src/output/options.c:231 #, fuzzy, c-format #| msgid "%s: `%s' is `%s' but a nonnegative integer is required" msgid "%s: `%s' is `%s' but a non-negative integer is required" msgstr "%s: a(z) „%s” „%s” típusú, de egy nemnegatív egész szükséges" #: src/output/options.c:235 #, c-format msgid "%s: `%s' is `%s' but a positive integer is required" msgstr "%s: a(z) „%s” „%s” típusú, de egy pozitív egész szükséges" #: src/output/options.c:238 #, c-format msgid "%s: `%s' is `%s' but an integer is required" msgstr "%s: a(z) „%s” „%s” típusú, de egy egész szükséges" #: src/output/options.c:241 #, c-format msgid "%s: `%s' is `%s' but an integer greater than %d is required" msgstr "%s: a(z) „%s” „%s” típusú, de egy %d értéknél nagyobb egész szükséges" #: src/output/options.c:246 #, c-format msgid "%s: `%s' is `%s' but an integer between %d and %d is required" msgstr "%s: „%s” „%s” típusú, de egy %d és %d közti egész szükséges" #: src/output/options.c:325 #, c-format msgid "%s: `%s' is `%s' but a file name that contains `#' is required." msgstr "%s: „%s” „%s” típusú, de egy „#”-et is tartalmazó fájlnév szükséges." #. TRANSLATORS: Do not translate this string. If the script of your language #. reads from right to left (eg Persian, Arabic, Hebrew etc), then replace #. this string with "output-direction-rtl". Otherwise either leave it #. untranslated or copy it verbatim. #: src/output/render.c:994 msgid "output-direction-ltr" msgstr "output-direction-ltr" #: src/output/text-item.c:44 msgid "Page Title" msgstr "" #: src/output/text-item.c:47 msgid "Title" msgstr "" #: src/output/text-item.c:51 msgid "Log" msgstr "" #: src/output/text-item.c:54 msgid "Page Break" msgstr "" #: src/output/cairo.c:520 #, c-format msgid "`%s': bad font specification" msgstr "„%s”: hibás betűkészlet megadás" #: src/output/cairo.c:744 #, c-format msgid "" "The defined page is not wide enough to hold at least %d characters in the " "default font. In fact, there's only room for %d characters." msgstr "" "A megadott oldal nem elég széles ahhoz, hogy legalább %d karakter kiférjen " "az alapértelmezett betűkészletből. Valójában csak %d karakternek van elég " "hely." #: src/output/cairo.c:752 #, c-format msgid "" "The defined page is not long enough to hold at least %d lines in the default " "font. In fact, there's only room for %d lines." msgstr "" "A megadott oldal nem elég széles ahhoz, hogy legalább %d sor kiférjen az " "alapértelmezett betűkészletből. Valójában csak %d sornak van elég hely." #: src/output/cairo.c:837 #, c-format msgid "error opening output file `%s': %s" msgstr "hiba a(z) „%s” kimeneti fájl megnyitásakor: %s" #: src/output/cairo.c:892 #, c-format msgid "error drawing output for %s driver: %s" msgstr "hiba a kimenet rajzolásakor a(z) %s meghajtóval: %s" #: src/output/cairo.c:2056 #, c-format msgid "error writing output file `%s': %s" msgstr "hiba a(z) „%s” kimeneti fájl írásakor: %s" #: src/output/charts/np-plot-cairo.c:37 #, c-format msgid "Normal Q-Q Plot of %s" msgstr "A(z) %s normális Q-Q diagramja" #: src/output/charts/np-plot-cairo.c:38 src/output/charts/np-plot-cairo.c:68 msgid "Observed Value" msgstr "Megfigyelt érték" #: src/output/charts/np-plot-cairo.c:39 msgid "Expected Normal" msgstr "Várt normális" #: src/output/charts/np-plot-cairo.c:67 #, c-format msgid "Detrended Normal Q-Q Plot of %s" msgstr "A(z) %s trendtől megtisztított normális Q-Q diagramja" #: src/output/charts/np-plot-cairo.c:69 msgid "Dev from Normal" msgstr "Eltérés a normálistól" #: src/output/charts/barchart-cairo.c:65 msgid "Bar Chart" msgstr "Oszlopdiagram" #: src/output/charts/plot-hist-cairo.c:43 #, c-format msgid "N = %.2f" msgstr "N = %.2f" #: src/output/charts/plot-hist-cairo.c:52 #, c-format msgid "Mean = %.1f" msgstr "Mintaátlag = %.1f" #: src/output/charts/plot-hist-cairo.c:61 #, c-format msgid "Std. Dev = %.2f" msgstr "Szórás = %.2f" #: src/output/charts/plot-hist-cairo.c:110 msgid "HISTOGRAM" msgstr "HISZTOGRAM" #: src/output/charts/roc-chart-cairo.c:36 src/ui/gui/roc.ui:24 msgid "ROC Curve" msgstr "ROC görbe" #: src/output/charts/scree-cairo.c:36 msgid "Scree Plot" msgstr "Kőtörmelék diagram" #: src/output/charts/scree-cairo.c:38 msgid "Eigenvalue" msgstr "Sajátérték" #: src/output/charts/spreadlevel-cairo.c:37 #, c-format msgid "Spread vs. Level Plot of %s" msgstr "Szórás ↔ a(z) %s szintdiagramja" #: src/output/charts/spreadlevel-cairo.c:38 msgid "Level" msgstr "Szint" #: src/output/charts/spreadlevel-cairo.c:39 msgid "Spread" msgstr "Szórás" #: src/output/charts/scatterplot-cairo.c:57 #, c-format msgid "Scatterplot %s" msgstr "%s pontdiagram" #: src/output/spv/spv-legacy-decoder.c:2222 msgid "Table lacks cell data." msgstr "" #: src/output/spv/spv-writer.c:68 #, fuzzy, c-format #| msgid "%s: write failed" msgid "%s: create failed" msgstr "%s: írás sikertelen" #: src/output/spv/spv-writer.c:89 #, fuzzy #| msgid "%s: error writing output file" msgid "I/O error writing SPV file" msgstr "%s: hiba a kimeneti fájl írásakor" #: src/output/spv/spv.c:693 #, fuzzy, c-format #| msgid "failed to create temporary file" msgid "%s: Failed to create XML parser" msgstr "átmeneti fájl létrehozása sikertelen" #: src/output/spv/spv.c:718 #, c-format msgid "%s: document is not well-formed" msgstr "" #: src/output/spv/spv.c:726 #, c-format msgid "%s: root node is \"%s\" but \"%s\" was expected" msgstr "" #: src/ui/gui/psppire-acr.c:273 msgid "Add" msgstr "Hozzáadás" #: src/ui/gui/psppire-acr.c:274 msgid "Edit" msgstr "Szerkesztés" #: src/ui/gui/psppire-acr.c:275 msgid "Remove" msgstr "Eltávolítás" #: src/ui/gui/psppire-buttonbox.c:311 msgid "OK" msgstr "OK" #: src/ui/gui/psppire-buttonbox.c:319 msgid "Go To" msgstr "Ugrás" #: src/ui/gui/psppire-buttonbox.c:327 msgid "Continue" msgstr "Folytatás" #: src/ui/gui/psppire-buttonbox.c:339 src/ui/gui/psppire-import-assistant.c:759 msgid "Paste" msgstr "Beillesztés" #: src/ui/gui/psppire-buttonbox.c:345 #: src/ui/gui/psppire-dialog-action-aggregate.c:216 #: src/ui/gui/psppire-data-window.c:496 src/ui/gui/psppire-data-window.c:624 #: src/ui/gui/psppire-output-window.c:353 #: src/ui/gui/psppire-syntax-window.c:594 src/ui/gui/psppire-window.c:445 #: src/ui/gui/psppire-window.c:628 msgid "Cancel" msgstr "Mégse" #: src/ui/gui/psppire-buttonbox.c:351 msgid "Close" msgstr "Bezárás" #: src/ui/gui/psppire-buttonbox.c:358 src/ui/gui/psppire-import-assistant.c:760 msgid "Reset" msgstr "Visszaállítás" #: src/ui/gui/psppire-buttonbox.c:365 msgid "Help" msgstr "Súgó" #: src/ui/gui/psppire-dialog-action-aggregate.c:213 msgid "Aggregate destination file" msgstr "Aggregálás célfájlja" #: src/ui/gui/psppire-dialog-action-aggregate.c:217 #: src/ui/gui/psppire-data-window.c:493 src/ui/gui/psppire-data-window.c:497 #: src/ui/gui/psppire-output-window.c:354 #: src/ui/gui/psppire-syntax-window.c:595 src/ui/gui/psppire-window.c:449 #: src/ui/gui/aggregate.ui:565 msgid "Save" msgstr "Mentés" #: src/ui/gui/psppire-dialog-action-aggregate.c:226 #: src/ui/gui/psppire-data-window.c:503 msgid "System Files (*.sav)" msgstr "Rendszerfájlok (*.sav)" #: src/ui/gui/psppire-dialog-action-aggregate.c:231 #: src/ui/gui/psppire-data-window.c:508 msgid "Compressed System Files (*.zsav)" msgstr "Tömörített rendszerfájlok (*.zsav)" #: src/ui/gui/psppire-dialog-action-aggregate.c:236 #: src/ui/gui/psppire-data-window.c:513 src/ui/gui/psppire-window.c:652 msgid "Portable Files (*.por) " msgstr "Hordozható fájlok (*.por) " #: src/ui/gui/psppire-dialog-action-autorecode.c:337 #: src/ui/gui/psppire-dialog-action-recode.c:535 #: src/ui/gui/psppire-dialog-action-recode-different.c:288 msgid "New" msgstr "Új" #: src/ui/gui/psppire-dialog-action-autorecode.c:351 #: src/ui/gui/psppire-dialog-action-recode.c:527 #: src/ui/gui/psppire-dialog-action-recode-different.c:301 msgid "Old" msgstr "Régi" #: src/ui/gui/psppire-dialog-action-comments.c:142 #, c-format msgid "Column Number: %d" msgstr "Oszlopszám: %d" #: src/ui/gui/psppire-dialog-action-crosstabs.c:71 msgid "Chisq" msgstr "Khí-négyzet" #: src/ui/gui/psppire-dialog-action-crosstabs.c:71 msgid "" "Pearson chi-square, likelihood ratio, Fisher’s exact test, continuity " "correction, linear-by-linear association." msgstr "" #: src/ui/gui/psppire-dialog-action-crosstabs.c:74 #: src/language/stats/crosstabs.q:1334 msgid "Phi" msgstr "Fí" #: src/ui/gui/psppire-dialog-action-crosstabs.c:75 msgid "CC" msgstr "CC" #: src/ui/gui/psppire-dialog-action-crosstabs.c:75 #, fuzzy #| msgid "Contingency Coefficient" msgid "Contingency coefficient" msgstr "Kontingencia-együttható" #: src/ui/gui/psppire-dialog-action-crosstabs.c:77 msgid "UC" msgstr "UC" #: src/ui/gui/psppire-dialog-action-crosstabs.c:77 #, fuzzy #| msgid "Uncertainty Coefficient" msgid "Uncertainty coefficient" msgstr "Határozatlansági együttható" #: src/ui/gui/psppire-dialog-action-crosstabs.c:78 msgid "BTau" msgstr "BTau" #: src/ui/gui/psppire-dialog-action-crosstabs.c:78 #, fuzzy #| msgid "Kendall's tau-b" msgid "Kendall's Tau-b" msgstr "Kendall-féle tau-b" #: src/ui/gui/psppire-dialog-action-crosstabs.c:79 msgid "CTau" msgstr "CTau" #: src/ui/gui/psppire-dialog-action-crosstabs.c:79 #, fuzzy #| msgid "Kendall's tau-c" msgid "Kendall's Tau-c" msgstr "Kendall-féle tau-c" #: src/ui/gui/psppire-dialog-action-crosstabs.c:80 msgid "Risk" msgstr "Kockázat" #: src/ui/gui/psppire-dialog-action-crosstabs.c:80 #, fuzzy #| msgid "Risk estimate." msgid "Relative Risk estimate" msgstr "Kockázatbecslés." #: src/ui/gui/psppire-dialog-action-crosstabs.c:81 #: src/language/stats/crosstabs.q:1338 msgid "Gamma" msgstr "Gamma" #: src/ui/gui/psppire-dialog-action-crosstabs.c:82 msgid "D" msgstr "D" #: src/ui/gui/psppire-dialog-action-crosstabs.c:82 #, fuzzy #| msgid "Somers' d" msgid "Somer's d" msgstr "Somers-féle d" #: src/ui/gui/psppire-dialog-action-crosstabs.c:83 #: src/language/stats/crosstabs.q:1344 msgid "Kappa" msgstr "Kappa" #: src/ui/gui/psppire-dialog-action-crosstabs.c:83 msgid "Cohen's Kappa" msgstr "" #: src/ui/gui/psppire-dialog-action-crosstabs.c:84 #: src/language/stats/crosstabs.q:1429 msgid "Eta" msgstr "Éta" #: src/ui/gui/psppire-dialog-action-crosstabs.c:85 msgid "Corr" msgstr "Korr" #: src/ui/gui/psppire-dialog-action-crosstabs.c:85 #, fuzzy #| msgid "Spearman Correlation" msgid "Spearman correlation, Pearson's r" msgstr "Spearman korreláció" #: src/ui/gui/psppire-dialog-action-crosstabs.c:90 #, fuzzy #| msgid "Frequency" msgid "Frequency Count" msgstr "Gyakoriság" #: src/ui/gui/psppire-dialog-action-crosstabs.c:91 msgid "Row" msgstr "Sor" #: src/ui/gui/psppire-dialog-action-crosstabs.c:91 #, fuzzy #| msgid "Percent" msgid "Row percent" msgstr "Százalék" #: src/ui/gui/psppire-dialog-action-crosstabs.c:92 msgid "Column" msgstr "Oszlop" #: src/ui/gui/psppire-dialog-action-crosstabs.c:92 #, fuzzy #| msgid "Cum Percent" msgid "Column percent" msgstr "Kum. százalék" #: src/ui/gui/psppire-dialog-action-crosstabs.c:93 #, fuzzy #| msgid "Valid Percent" msgid "Total percent" msgstr "Érvényes százalék" #: src/ui/gui/psppire-dialog-action-crosstabs.c:94 #: src/language/stats/crosstabs.q:1266 msgid "Expected" msgstr "Várt" #: src/ui/gui/psppire-dialog-action-crosstabs.c:94 #, fuzzy #| msgid "Expected Values:" msgid "Expected value" msgstr "Várt értékek:" #: src/ui/gui/psppire-dialog-action-crosstabs.c:96 #: src/language/stats/crosstabs.q:1268 msgid "Std. Residual" msgstr "Sztd. reziduális" #: src/ui/gui/psppire-dialog-action-crosstabs.c:96 #, fuzzy #| msgid "Std. Residual" msgid "Standardized Residual" msgstr "Sztd. reziduális" #: src/ui/gui/psppire-dialog-action-crosstabs.c:97 msgid "Adjusted Std. Residual" msgstr "Korrigált sztd. reziduális" #: src/ui/gui/psppire-dialog-action-descriptives.c:45 msgid "Standard error" msgstr "Sztenderd hiba" #: src/ui/gui/psppire-dialog-action-descriptives.c:45 #, fuzzy #| msgid "Standard error of the mean" msgid "Standard error of mean" msgstr "A mintaátlag sztenderd hibája" #: src/ui/gui/psppire-dialog-action-descriptives.c:47 #, fuzzy #| msgid "Standard error of the kurtosis" msgid "Kurtosis and standard error of kurtosis" msgstr "A lapultság sztenderd hibája" #: src/ui/gui/psppire-dialog-action-descriptives.c:48 #, fuzzy #| msgid "Standard error of the skewness" msgid "Skewness and standard error of skewness" msgstr "A ferdeség sztenderd hibája" #: src/ui/gui/psppire-dialog-action-factor.c:323 #, c-format msgid "_Eigenvalues over %4.2f times the mean eigenvalue" msgstr "_Sajátértékek, melyek nagyobbak mint %4.2f × átlagos sajátérték" #: src/ui/gui/psppire-dialog-action-frequencies.c:44 msgid "Standard error of the mean" msgstr "A mintaátlag sztenderd hibája" #: src/ui/gui/psppire-dialog-action-frequencies.c:47 msgid "Standard error of the skewness" msgstr "A ferdeség sztenderd hibája" #: src/ui/gui/psppire-dialog-action-frequencies.c:51 msgid "Standard error of the kurtosis" msgstr "A lapultság sztenderd hibája" #: src/ui/gui/psppire-dialog-action-oneway.c:175 #, c-format msgid "Contrast %d of %d" msgstr "%d / %d kontraszt" #: src/ui/gui/psppire-dialog-action-paired.c:162 src/ui/gui/examine.ui:282 #: src/ui/gui/indep-samples.ui:334 src/ui/gui/t-test.ui:296 msgid "O_ptions..." msgstr "_Beállítások…" #: src/ui/gui/psppire-dialog-action-paired.c:168 msgid "Paired Samples T Test" msgstr "Páros mintás t-próba" #: src/ui/gui/psppire-dialog-action-recode-different.c:327 msgid "Recode into Different Variables" msgstr "Átkódolás különböző változókba" #: src/ui/gui/psppire-dialog-action-recode-different.c:330 msgid "Recode into Different Variables: Old and New Values " msgstr "Átkódolás különböző változókba: régi és új értékek " #: src/ui/gui/psppire-dialog-action-recode-same.c:108 src/ui/gui/recode.ui:391 msgid "Recode into Same Variables" msgstr "Átkódolás ugyanazon változókba" #: src/ui/gui/psppire-dialog-action-recode-same.c:114 msgid "Recode into Same Variables: Old and New Values" msgstr "Átkódolás ugyanazon változókba: régi és új értékek" #: src/ui/gui/psppire-dialog-action-regression.c:40 msgid "Coeff" msgstr "Együttható" #: src/ui/gui/psppire-dialog-action-regression.c:40 msgid "Show the regression coefficients" msgstr "A regresszió-együtthatók megjelenítése" #: src/ui/gui/psppire-dialog-action-regression.c:41 msgid "Conf. Interval" msgstr "Konfidencia intervallum" #: src/ui/gui/psppire-dialog-action-regression.c:41 msgid "Show the confidence interval for the regression coefficients" msgstr "A konfidencia intervallum megjelenítése a regresszió-együtthatóknál" #: src/ui/gui/psppire-dialog-action-regression.c:42 msgid "Show the correlation between observed and predicted values" msgstr "" "A korreláció megjelenítése a megfigyelt és az elöre jelzett értékek között" #: src/ui/gui/psppire-dialog-action-regression.c:43 msgid "Anova" msgstr "ANOVA" #: src/ui/gui/psppire-dialog-action-regression.c:43 msgid "Show the analysis of variance table" msgstr "A varianciatáblázat elemzésének megjelenítése" #: src/ui/gui/psppire-dialog-action-regression.c:44 msgid "Bcov" msgstr "Bkov" #: src/ui/gui/psppire-dialog-action-regression.c:44 msgid "Show the variance coefficient matrix" msgstr "A variancia együttható mátrix megjelenítése" #: src/ui/gui/psppire-dialog-action-regression.c:45 #, fuzzy #| msgid "Total" msgid "Tol" msgstr "Összesen" #: src/ui/gui/psppire-dialog-action-regression.c:45 #, fuzzy #| msgid "Show the variance coefficient matrix" msgid "Show the variance inflation factor and its reciprocal" msgstr "A variancia együttható mátrix megjelenítése" #: src/ui/gui/psppire-dialog-action-select.c:88 #, c-format msgid "Approximately %3d%% of all cases." msgstr "Körül-belül az összes eset %3d%%-a." #: src/ui/gui/psppire-dialog-action-select.c:89 #, c-format msgid "Exactly %3d cases from the first %3d cases." msgstr "Pontosan %3d eset az első %3d esetből." #: src/ui/gui/psppire-dialog-action-select.c:236 #, c-format msgid "%d thru %d" msgstr "%d → %d" #: src/ui/gui/psppire-dialog-action-two-sample.c:180 #: src/ui/gui/k-independent.ui:404 src/ui/gui/k-related.ui:197 msgid "Test Type" msgstr "Próbatípus" #: src/ui/gui/psppire-dialog-action-two-sample.c:189 msgid "_Wilcoxon" msgstr "_Wilcoxon" #: src/ui/gui/psppire-dialog-action-two-sample.c:190 msgid "_Sign" msgstr "_Sign" #: src/ui/gui/psppire-dialog-action-two-sample.c:191 msgid "_McNemar" msgstr "_McNemar" #: src/ui/gui/psppire-dialog-action-two-sample.c:209 msgid "Two-Related-Samples Tests" msgstr "Két kapcsolódó mintás próbák" #: src/ui/gui/psppire-dialog-action-weight.c:74 src/ui/gui/weight.ui:83 #: src/ui/gui/weight.ui:211 msgid "Do not weight cases" msgstr "Ne súlyozza az eseteket" #: src/ui/gui/psppire-dialog-action-weight.c:80 #, c-format msgid "Weight cases by %s" msgstr "Esetek súlyozása e szerint: %s" #: src/ui/gui/psppire-dict.c:95 msgid "Var" msgstr "Valtozo" #. TRANSLATORS: This string must be a valid variable name. That means: #. - The string must be at most 64 bytes (not characters) long. #. - The string may not contain whitespace. #. - The first character may not be '$' #. - The first character may not be a digit #. - The final character may not be '.' or '_' #. #: src/ui/gui/psppire-dict.c:385 #, c-format msgid "Var%04d" msgstr "Valtozo%04d" #: src/ui/gui/psppire-dict.c:566 msgid "Duplicate variable name." msgstr "Ismételt változónév." #: src/ui/gui/psppire-dictview.c:617 msgid "Prefer variable labels" msgstr "Változócímkék előnyben részesítése" #: src/ui/gui/psppire-dictview.c:631 msgid "Default sort order" msgstr "Alapértelmezett rendezési sorrend" #: src/ui/gui/psppire-dictview.c:637 msgid "Unsorted (dictionary order)" msgstr "Nem rendezett (szótári rendezés)" #: src/ui/gui/psppire-dictview.c:642 msgid "Sort by name" msgstr "Rendezés név szerint" #: src/ui/gui/psppire-dictview.c:647 msgid "Sort by label" msgstr "Rendezés címke szerint" #: src/ui/gui/psppire-means-layer.c:95 #, c-format msgid "Layer %d of %d" msgstr "%d / %d réteg" #: src/ui/gui/psppire-means-layer.c:169 msgid "Forward" msgstr "Előre" #: src/ui/gui/psppire-means-layer.c:170 msgid "Back" msgstr "Vissza" #: src/ui/gui/psppire-text-file.c:55 #, c-format msgid "Could not open `%s'" msgstr "A(z) „%s” nem nyitható meg" #: src/ui/gui/psppire-text-file.c:71 #, c-format msgid "Error reading `%s': %s" msgstr "Hiba a(z) „%s” olvasásakor: %s" #: src/ui/gui/psppire-text-file.c:74 #, c-format msgid "" "Failed to read `%s', because it contains a line over %d bytes long and " "therefore appears not to be a text file." msgstr "" "A(z) „%s” olvasása sikertelen, mert egy több mint %d bájtos sort tartalmaz, " "ezért nem tűnik szöveges fájlnak." #: src/ui/gui/psppire-text-file.c:96 #, c-format msgid "`%s' is empty." msgstr "A(z) „%s” üres." #: src/ui/gui/psppire-val-chooser.c:255 msgid "through" msgstr "–" #: src/ui/gui/psppire-val-chooser.c:288 msgid "_Value:" msgstr "É_rték:" #: src/ui/gui/psppire-val-chooser.c:289 msgid "_System Missing" msgstr "Hiányzó rend_szer" #: src/ui/gui/psppire-val-chooser.c:290 msgid "System _or User Missing" msgstr "Hiányzó rendszer _vagy felhasználó" #: src/ui/gui/psppire-val-chooser.c:291 msgid "_Range:" msgstr "_Terjedelem:" #: src/ui/gui/psppire-val-chooser.c:292 msgid "Range, _LOWEST thru value" msgstr "Tartomány, _LOWEST → érték" #: src/ui/gui/psppire-val-chooser.c:293 msgid "Range, value thru _HIGHEST" msgstr "Tartomány, érték → _HIGHEST" #: src/ui/gui/psppire-val-chooser.c:294 msgid "_All other values" msgstr "Ö_sszes többi érték" #: src/ui/gui/psppire-var-view.c:153 #, c-format msgid "Var%d" msgstr "Var%d" #: src/ui/source-init-opts.c:72 #, c-format msgid "Algorithm must be either `%s' or `%s'." msgstr "Az algoritmus „%s” vagy „%s” kell legyen." #: src/ui/source-init-opts.c:97 #, c-format msgid "Syntax must be either `%s' or `%s'." msgstr "A szintaktika „%s” vagy „%s” kell legyen." #: src/ui/terminal/main.c:144 msgid "Error encountered while ERROR=STOP is effective." msgstr "Hiba történt amikor ERROR=STOP volt érvényben." #: src/ui/terminal/main.c:150 msgid "" "Stopping syntax file processing here to avoid a cascade of dependent command " "failures." msgstr "" "A szintaktika fájl feldolgozása itt megállt, hogy elkerülje a függő " "parancsok további hibáit." #: src/ui/terminal/terminal-opts.c:147 #, c-format msgid "" "PSPP, a program for statistical analysis of sampled data.\n" "Usage: %s [OPTION]... FILE...\n" "\n" "Arguments to long options also apply to equivalent short options.\n" "\n" "Output options:\n" " -o, --output=FILE output to FILE, default format from FILE's name\n" " -O format=FORMAT override format for previous -o\n" " -O OPTION=VALUE set output option to customize previous -o\n" " -O device={terminal|listing} override device type for previous -o\n" " -e, --error-file=FILE append errors, warnings, and notes to FILE\n" " --no-output disable default output driver\n" "Supported output formats: %s\n" "\n" "Language options:\n" " -I, --include=DIR append DIR to search path\n" " -I-, --no-include clear search path\n" " -r, --no-statrc disable running rc file at startup\n" " -a, --algorithm={compatible|enhanced}\n" " set to `compatible' if you want output\n" " calculated from broken algorithms\n" " -x, --syntax={compatible|enhanced}\n" " set to `compatible' to disable PSPP extensions\n" " -b, --batch interpret syntax in batch mode\n" " -i, --interactive interpret syntax in interactive mode\n" " --syntax-encoding=ENCODING specify encoding for syntax files\n" " -s, --safer don't allow some unsafe operations\n" "Default search path: %s\n" "\n" "Informative output:\n" " -h, --help display this help and exit\n" " -V, --version output version information and exit\n" "\n" "Non-option arguments are interpreted as syntax files to execute.\n" msgstr "" "PSPP, egy program mintavételezett adatok statisztikai elemzésére.\n" "Használat: %s [KAPCSOLÓ]… FÁJL…\n" "\n" "A hosszú kapcsolók argumentumai a rövid kapcsolók esetén is érvényesek.\n" "\n" "Kimeneti kapcsolók:\n" " -o, --output=FÁJL kimenet a FÁJLba, az alapértelmezett formátum\n" " a FÁJL nevéből\n" " -O format=FORMÁTUM a fájlformátum módosítása az előző -o " "kapcsolóhoz\n" " képest\n" " -O KAPCSOLÓ=ÉRTÉK kimeneti kapcsoló megadása az előző -o\n" " kapcsoló testreszabásához\n" " -O device={terminal|listing} az eszköztípus " "felülbírálása az előző -o\n" " kapcsolónál megadott fájlnál\n" " -e, --error-file=FÁJL hibák, figyelmeztetések és megjegyzések\n" " hozzáfűzése a FÁJLhoz\n" " --no-output alapértelmezett kimeneti meghajtó letiltása\n" "Támogatott kimeneti formátumok: %s\n" "\n" "Nyelvi beállítások:\n" " -I, --include=MAPPA MAPPA hozzáfűzése a keresési útvonalhoz\n" " -I-, --no-include keresési útvonal kiürítése\n" " -r, --no-statrc az rc fájl elindításának letiltása futtatáskor\n" " -a, --algorithm={compatible|enhanced}\n" " állítsa „compatible” értékre, ha hibás\n" " algoritmusok kimeneti értéket akarja használni\n" " -x, --syntax={compatible|enhanced}\n" " állítsa „compatible” értékre a PSPP " "kiterjesztések\n" " letiltásához\n" " -b, --batch a szintaktika kötegelt módban értelmezése\n" " -i, --interactive a szintaktika interaktív értelmezése\n" " --syntax-encoding=KÓDOLÁS a szintatika fájlok kódolásának megadása\n" " -s, --safer néhány nem biztonságos művelet megtiltása\n" "Alapértelmezett keresési útvonal: %s\n" "\n" "Informatív kimenet:\n" " -h, --help ezen súgó megjelenítése és kilépés\n" " -V, --version verzióinformációk megjelenítése és kilépés\n" "\n" "A nem kapcsolóként megadott argumentumok szintaktika fájlokként " "értelmezettek,\n" "és végrehajtásra kerülnek.\n" #: src/ui/gui/find-dialog.c:197 msgid "Find" msgstr "Keresés" #: src/ui/gui/find-dialog.c:662 #, c-format msgid "Bad regular expression: %s" msgstr "Hibás reguláris kifejezés: %s" #: src/ui/gui/help-menu.c:70 msgid "A program for the analysis of sampled data" msgstr "Egy program mintaadatok elemzéséhez" #. TRANSLATORS: Do not translate this string. Instead, put the names of the people #. who have helped in the translation. #: src/ui/gui/help-menu.c:80 msgid "translator-credits" msgstr "" "Meskó Balázs \n" "Úr Balázs " #: src/ui/gui/help-menu.c:170 #, c-format msgid "Help path conversion error: %s" msgstr "Súgó útvonal átalakítási hiba: %s" #: src/ui/gui/help-menu.c:197 #, fuzzy, c-format #| msgid "" #| "Cannot open reference manual via yelp: %s. Cannot open via html: %s with " #| "uri: %s The PSSP manual is also available at %s" msgid "" "Cannot open via html: %s with uri: %s The PSSP manual is also available at %s" msgstr "" "A referencia kézikönyv nem nyitható meg a yelp segítségével: %s. Nem " "nyitható meg HTML-ként: %s a következő URI-val: %s A PSPP kézikönyve itt is " "elérhető: %s" #: src/ui/gui/help-menu.c:218 msgid "_Help" msgstr "_Súgó" #: src/ui/gui/help-menu.c:221 msgid "_About" msgstr "_Névjegy" #: src/ui/gui/help-menu.c:222 msgid "_Reference Manual" msgstr "_Referencia kézikönyv" #: src/ui/gui/main.c:306 msgid "Show version information and exit" msgstr "Verzióinformációk megjelenítése és kilépés" #: src/ui/gui/main.c:409 msgid "Do not display the splash screen" msgstr "Ne jelenítse meg az indítóképet" #: src/ui/gui/main.c:411 msgid "Do not attempt single instance negotiation" msgstr "Ne próbáljon meg csak egy példányban futni" #: src/ui/gui/missing-val-dialog.c:217 msgid "" "The maximum length of a missing value for a string variable is 8 in UTF-8." msgstr "" "Egy hiányzó érték legnagyobb hossza egy karakterlánc-változónál 8 UTF-8-ban." #: src/ui/gui/missing-val-dialog.c:268 msgid "At least one value must be specified" msgstr "Legalább egy értéket meg kell adni" #: src/ui/gui/missing-val-dialog.c:298 msgid "Incorrect range specification" msgstr "Érvénytelen tartománymegadás" #: src/ui/gui/psppire-data-editor.c:380 #, c-format msgid "%d : %s" msgstr "%d : %s" #: src/ui/gui/psppire-data-editor.c:391 #, c-format msgid "%'d case" msgid_plural "%'d cases" msgstr[0] "%'d eset" msgstr[1] "%'d eset" #: src/ui/gui/psppire-data-editor.c:396 #, c-format msgid "%'d variable" msgid_plural "%'d variables" msgstr[0] "%'d változó" msgstr[1] "%'d variables" #: src/ui/gui/psppire-data-editor.c:485 msgid "Case" msgstr "Eset" #: src/ui/gui/psppire-data-editor.c:495 msgid "Data View" msgstr "Adatnézet" #: src/ui/gui/psppire-data-editor.c:505 msgid "Variable View" msgstr "Változónézet" #: src/ui/gui/psppire-data-sheet.c:171 src/ui/gui/psppire-data-window.c:1338 msgid "_Insert Case" msgstr "_Eset beszúrása" #: src/ui/gui/psppire-data-sheet.c:179 src/ui/gui/psppire-data-window.c:1391 msgid "Cl_ear Cases" msgstr "Esetek _törlése" #: src/ui/gui/psppire-data-sheet.c:305 src/ui/gui/psppire-data-window.c:1337 #: src/ui/gui/psppire-variable-sheet.c:274 msgid "_Insert Variable" msgstr "_Változó beszúrása" #: src/ui/gui/psppire-data-sheet.c:314 src/ui/gui/psppire-variable-sheet.c:283 msgid "Cl_ear Variables" msgstr "Változók tö_rlése" #: src/ui/gui/psppire-data-sheet.c:326 msgid "Sort _Ascending" msgstr "_Növekvő sorrend" #: src/ui/gui/psppire-data-sheet.c:333 msgid "Sort _Descending" msgstr "Csö_kkenő sorrend" #: src/ui/gui/psppire-data-window.c:175 msgid "Transformations Pending" msgstr "Transzformációk függőben" #: src/ui/gui/psppire-data-window.c:191 msgid "Filter off" msgstr "Szűrő ki" #: src/ui/gui/psppire-data-window.c:203 #, c-format msgid "Filter by %s" msgstr "Szűrés e szerint: %s" #: src/ui/gui/psppire-data-window.c:224 msgid "No Split" msgstr "Nincs felosztás" #: src/ui/gui/psppire-data-window.c:233 msgid "Split by " msgstr "Felosztás e szerint: " #: src/ui/gui/psppire-data-window.c:261 msgid "Weights off" msgstr "Súlyok ki" #: src/ui/gui/psppire-data-window.c:273 #, c-format msgid "Weight by %s" msgstr "Súly e szerint: %s" #: src/ui/gui/psppire-data-window.c:518 #: src/ui/gui/psppire-import-assistant.c:681 #: src/ui/gui/psppire-syntax-window.c:607 src/ui/gui/psppire-window.c:669 msgid "All Files" msgstr "Minden fájl" #: src/ui/gui/psppire-data-window.c:535 msgid "System File" msgstr "Rendszerfájl" #: src/ui/gui/psppire-data-window.c:542 msgid "Compressed System File" msgstr "Tömörített rendszerfájl" #: src/ui/gui/psppire-data-window.c:548 msgid "Portable File" msgstr "Hordozható fájl" #: src/ui/gui/psppire-data-window.c:551 msgid "Format:" msgstr "Formátum:" #: src/ui/gui/psppire-data-window.c:615 msgid "Delete Existing Dataset?" msgstr "Törli a meglévő adathalmazt?" #: src/ui/gui/psppire-data-window.c:619 #, c-format msgid "" "Renaming \"%s\" to \"%s\" will destroy the existing dataset named \"%s\". " "Are you sure that you want to do this?" msgstr "" "Az átnevezés („%s” → „%s”) tönkre fogja tenni a meglévő „%s” adathalmazt. " "Biztosan ezt szeretné tenni?" #: src/ui/gui/psppire-data-window.c:625 msgid "Delete" msgstr "Törlés" #: src/ui/gui/psppire-data-window.c:647 #, c-format msgid "Please enter a new name for dataset \"%s\":" msgstr "Adjon egy új nevet a(z) „%s” adathalmaznak:" #: src/ui/gui/psppire-data-window.c:649 msgid "Rename Dataset" msgstr "Adathalmaz átnevezése" #: src/ui/gui/psppire-data-window.c:1199 src/ui/gui/output-window.ui:68 #: src/ui/gui/syntax-editor.ui:22 msgid "_File" msgstr "_Fájl" #: src/ui/gui/psppire-data-window.c:1203 src/ui/gui/syntax-editor.ui:25 msgid "_New" msgstr "Ú_j" #: src/ui/gui/psppire-data-window.c:1210 msgid "_Syntax" msgstr "Szinta_xis" #: src/ui/gui/psppire-data-window.c:1213 src/ui/gui/data-editor.ui:177 #: src/ui/gui/data-editor.ui:189 msgid "_Data" msgstr "_Adatok" #: src/ui/gui/psppire-data-window.c:1220 src/ui/gui/syntax-editor.ui:36 msgid "_Open" msgstr "_Megnyitás" #: src/ui/gui/psppire-data-window.c:1223 msgid "_Import Data..." msgstr "Adatok _importálása…" #: src/ui/gui/psppire-data-window.c:1231 src/ui/gui/logistic.ui:261 #: src/ui/gui/regression.ui:66 msgid "_Save..." msgstr "_Mentés…" #: src/ui/gui/psppire-data-window.c:1234 msgid "Save _As..." msgstr "Men_tés másként…" #: src/ui/gui/psppire-data-window.c:1237 msgid "_Rename Dataset..." msgstr "Adathalmaz át_nevezése…" #: src/ui/gui/psppire-data-window.c:1248 msgid "_Display Data File Information" msgstr "_Adatfájl információk megjelenítése" #: src/ui/gui/psppire-data-window.c:1255 msgid "Working File" msgstr "Munkafájl" #: src/ui/gui/psppire-data-window.c:1257 msgid "_External File..." msgstr "_Külső fájl…" #: src/ui/gui/psppire-data-window.c:1267 msgid "_Recently Used Data" msgstr "Nemrég _használt adatok" #: src/ui/gui/psppire-data-window.c:1268 msgid "Recently Used _Files" msgstr "Nemrég használt _fájlok" #: src/ui/gui/psppire-data-window.c:1315 src/ui/gui/output-window.ui:82 #: src/ui/gui/syntax-editor.ui:59 msgid "_Quit" msgstr "_Kilépés" #: src/ui/gui/psppire-data-window.c:1333 src/ui/gui/output-window.ui:89 #: src/ui/gui/syntax-editor.ui:66 msgid "_Edit" msgstr "Sz_erkesztés" #: src/ui/gui/psppire-data-window.c:1339 msgid "_Go To Variable..." msgstr "_Ugrás változóhoz…" #: src/ui/gui/psppire-data-window.c:1340 msgid "_Go To Case..." msgstr "Ugrás _esethez…" #: src/ui/gui/psppire-data-window.c:1364 src/ui/gui/syntax-editor.ui:69 msgid "Cu_t" msgstr "Ki_vágás" #: src/ui/gui/psppire-data-window.c:1373 src/ui/gui/output-window.ui:96 #: src/ui/gui/syntax-editor.ui:74 msgid "_Copy" msgstr "_Másolás" #: src/ui/gui/psppire-data-window.c:1380 src/ui/gui/syntax-editor.ui:79 msgid "_Paste" msgstr "_Beillesztés" #: src/ui/gui/psppire-data-window.c:1387 msgid "Clear _Variables" msgstr "_Változók törlése" #: src/ui/gui/psppire-data-window.c:1401 msgid "_Find..." msgstr "_Keresés…" #: src/ui/gui/psppire-data-window.c:1407 src/ui/gui/logistic.ui:246 msgid "_Options..." msgstr "_Beállítások…" #: src/ui/gui/psppire-data-window.c:1676 msgid "Jump to variable" msgstr "Ugrás változóhoz" #: src/ui/gui/psppire-data-window.c:1689 msgid "Jump to a case in the data sheet" msgstr "Esethez ugrás a munkafüzetben" #: src/ui/gui/psppire-data-window.c:1703 msgid "Search for values in the data" msgstr "Értékek keresése az adatokban" #: src/ui/gui/psppire-data-window.c:1715 msgid "Create a new case at the current position" msgstr "Egy új eset létrehozása a jelenlegi pozíciónál" #: src/ui/gui/psppire-data-window.c:1727 msgid "Create a new variable at the current position" msgstr "Egy új változó létrehozása a jelenlegi pozíciónál" #: src/ui/gui/psppire-data-window.c:1741 msgid "Split the active dataset" msgstr "Az aktív adathalmaz felosztása" #: src/ui/gui/psppire-data-window.c:1753 msgid "Weight cases by variable" msgstr "Esetek súlyozása változóval" #: src/ui/gui/psppire-data-window.c:1764 msgid "Show/hide value labels" msgstr "Értékcímkék megjelenítése/elrejtése" #: src/ui/gui/psppire-data-window.c:1904 msgid "Data Editor" msgstr "Adatszerkesztő" #: src/ui/gui/psppire-encoding-selector.c:140 msgid "Automatically Detect" msgstr "Automatikus észlelés" #: src/ui/gui/psppire-encoding-selector.c:147 msgid "Locale Encoding" msgstr "Területi beállítás kódolása" #: src/ui/gui/psppire-encoding-selector.c:177 msgid "Character Encoding: " msgstr "Karakterkódolás: " #: src/ui/gui/psppire-import-assistant.c:337 msgid "line" msgstr "sor" #: src/ui/gui/psppire-import-assistant.c:347 msgid "var" msgstr "változó" #: src/ui/gui/psppire-import-assistant.c:560 msgid "Importing Spreadsheet Data" msgstr "Táblázatadatok importálása" #: src/ui/gui/psppire-import-assistant.c:686 msgid "Text Files" msgstr "Minden szövegfájl" #: src/ui/gui/psppire-import-assistant.c:691 msgid "Text (*.txt) Files" msgstr "Szöveg (*.txt) fájlok" #: src/ui/gui/psppire-import-assistant.c:697 msgid "Plain Text (ASCII) Files" msgstr "Egyszerű szöveg (ASCII) fájlok" #: src/ui/gui/psppire-import-assistant.c:702 msgid "Comma Separated Value Files" msgstr "Vesszővel elválasztott érték fájlok" #: src/ui/gui/psppire-import-assistant.c:709 msgid "Tab Separated Value Files" msgstr "Tabulátorral elválasztott érték fájlok" #: src/ui/gui/psppire-import-assistant.c:714 msgid "Gnumeric Spreadsheet Files" msgstr "Gnumeric táblázatfájlok" #: src/ui/gui/psppire-import-assistant.c:719 msgid "OpenDocument Spreadsheet Files" msgstr "OpenDocument táblázatfájlok" #: src/ui/gui/psppire-import-assistant.c:724 msgid "All Spreadsheet Files" msgstr "Minden táblázatfájl" #: src/ui/gui/psppire-import-assistant.c:733 msgid "Select File to Import" msgstr "Válassza ki az importálandó fájlt" #: src/ui/gui/psppire-import-assistant.c:770 msgid "Importing Delimited Text Data" msgstr "Tagolt szöveges adat importálása" #: src/ui/gui/psppire-import-assistant.c:865 msgid "Select the First Line" msgstr "Első sor kiválasztása" #: src/ui/gui/psppire-import-assistant.c:877 msgid "Line" msgstr "Sor" #: src/ui/gui/psppire-import-assistant.c:931 msgid "" "This assistant will guide you through the process of importing data into " "PSPP from a text file with one line per case, in which fields are separated " "by tabs, commas, or other delimiters.\n" "\n" msgstr "" "A varázsló végigvezeti az adatimportálási folyamaton, amely egy eset / egy " "sor alapon importálja a szöveges fájl adatait, és ahol a mezőket " "tabulátorok, vesszők, vagy más elválasztók határolják.\n" "\n" #: src/ui/gui/psppire-import-assistant.c:941 #, c-format msgid "The selected file contains %'lu line of text. " msgid_plural "The selected file contains %'lu lines of text. " msgstr[0] "A kiválasztott fájl %'lu sornyi szöveget tartalmaz. " msgstr[1] "A kiválasztott fájl %'lu sornyi szöveget tartalmaz. " #: src/ui/gui/psppire-import-assistant.c:950 #, c-format msgid "The selected file contains approximately %'lu line of text. " msgid_plural "The selected file contains approximately %'lu lines of text. " msgstr[0] "A kiválasztott fájl %'lu körülbelül sornyi szöveget tartalmaz. " msgstr[1] "A kiválasztott fájl %'lu körülbelül sornyi szöveget tartalmaz. " #: src/ui/gui/psppire-import-assistant.c:956 #, c-format msgid "" "Only the first %zu line of the file will be shown for preview purposes in " "the following screens. " msgid_plural "" "Only the first %zu lines of the file will be shown for preview purposes in " "the following screens. " msgstr[0] "" "Csak az első %zu sor szöveg lesz előnézeti célból megjelenítve a következő " "képernyőkön. " msgstr[1] "" "Csak az első %zu sor szöveg lesz előnézeti célból megjelenítve a következő " "képernyőkön. " #: src/ui/gui/psppire-import-assistant.c:965 msgid "You may choose below how much of the file should actually be imported." msgstr "" "Kiválaszthatja lent, hogy a fájl mekkora része kerüljön ténylegesen " "importálásra." #: src/ui/gui/psppire-import-assistant.c:974 #, c-format msgid "Only the first %4d cases" msgstr "Csak az első %4d eset" #: src/ui/gui/psppire-import-assistant.c:985 #, c-format msgid "Only the first %3d %% of file (approximately)" msgstr "Csak a fájl első %3d %%-nyi része (körülbelül)" #: src/ui/gui/psppire-import-assistant.c:1009 msgid "Select the Lines to Import" msgstr "Válassza ki az importálandó sorokat" #: src/ui/gui/psppire-import-assistant.c:1151 msgid "Choose Separators" msgstr "Elválasztók kiválasztása" #: src/ui/gui/psppire-import-assistant.c:1438 msgid "Adjust Variable Formats" msgstr "Változóformátumok módosítása" #: src/ui/gui/psppire-output-view.c:410 msgid "Message" msgstr "Üzenet" #: src/ui/gui/psppire-output-view.c:543 msgid "failed to create temporary directory during clipboard operation" msgstr "nem sikerült átmeneti könyvtárat létrehozni a vágólapművelet során" #: src/ui/gui/psppire-output-window.c:241 msgid "Infer file type from extension" msgstr "Fájltípus meghatározása a kiterjesztésből" #: src/ui/gui/psppire-output-window.c:242 msgid "SPSS Viewer (*.spv)" msgstr "" #: src/ui/gui/psppire-output-window.c:243 msgid "PDF (*.pdf)" msgstr "PDF (*.pdf)" #: src/ui/gui/psppire-output-window.c:244 msgid "HTML (*.html)" msgstr "HTML (*.html)" #: src/ui/gui/psppire-output-window.c:245 msgid "OpenDocument (*.odt)" msgstr "OpenDocument (*.odt)" #: src/ui/gui/psppire-output-window.c:246 msgid "Text (*.txt)" msgstr "Szöveg (*.txt)" #: src/ui/gui/psppire-output-window.c:247 msgid "Text [plain] (*.txt)" msgstr "Egyszerű szöveg (*.txt)" #: src/ui/gui/psppire-output-window.c:248 msgid "PostScript (*.ps)" msgstr "PostScript (*.ps)" #: src/ui/gui/psppire-output-window.c:249 msgid "Comma-Separated Values (*.csv)" msgstr "Vesszővel elválasztott értékek (*.csv)" #: src/ui/gui/psppire-output-window.c:350 msgid "Export Output" msgstr "Exportálás kimenete" #: src/ui/gui/psppire-output-window.c:548 msgid "Output Viewer" msgstr "Kimenetmegjelenítő" #: src/ui/gui/psppire-spreadsheet-model.c:237 msgid "(empty)" msgstr "(üres)" #: src/ui/gui/psppire-syntax-window.c:226 msgid "Text Search" msgstr "" #: src/ui/gui/psppire-syntax-window.c:229 #, fuzzy #| msgid "OK" msgid "_OK" msgstr "OK" #: src/ui/gui/psppire-syntax-window.c:231 #, fuzzy #| msgid "Cancel" msgid "_Cancel" msgstr "Mégse" #: src/ui/gui/psppire-syntax-window.c:239 msgid "Text to search for:" msgstr "" #: src/ui/gui/psppire-syntax-window.c:570 #, c-format msgid "Saved file `%s'" msgstr "Mentett fájl „%s”" #: src/ui/gui/psppire-syntax-window.c:591 msgid "Save Syntax" msgstr "Szintaxis mentése" #: src/ui/gui/psppire-syntax-window.c:601 src/ui/gui/psppire-window.c:657 msgid "Syntax Files (*.sps) " msgstr "Szintaxisfájlok (*.sps) " #: src/ui/gui/psppire-syntax-window.c:970 msgid "Syntax Editor" msgstr "Szintaxisszerkesztő" #: src/ui/gui/psppire-syntax-window.c:990 #, c-format msgid "Cannot load syntax file `%s'" msgstr "Nem tölthető be a(z) „%s” szintaxisfájl" #: src/ui/gui/psppire-variable-sheet.c:412 #, c-format msgid "{%s, %s}..." msgstr "{%s, %s}…" #: src/ui/gui/psppire-var-sheet-header.c:64 msgid "Decimal" msgstr "Decimális" #: src/ui/gui/psppire-var-sheet-header.c:79 msgid "Align" msgstr "Igazítás" #: src/ui/gui/psppire-var-sheet-header.c:82 msgid "Measure" msgstr "Mérési skála" #: src/ui/gui/psppire-window.c:430 #, c-format msgid "Save the changes to `%s' before closing?" msgstr "Menti a(z) „%s” módosításait bezárás előtt?" #: src/ui/gui/psppire-window.c:437 #, c-format msgid "" "If you don't save, changes from the last %ld seconds will be permanently " "lost." msgstr "" "Ha nem menti, akkor az elmúlt %ld másodperc módosításai végleg elvesznek." #: src/ui/gui/psppire-window.c:441 msgid "Close _without saving" msgstr "Bezárás mentés _nélkül" #: src/ui/gui/psppire-window.c:625 src/ui/gui/psppire-window.c:629 msgid "Open" msgstr "Megnyitás" #: src/ui/gui/psppire-window.c:634 msgid "Data and Syntax Files" msgstr "Adat- és szintaxis fájlok" #: src/ui/gui/psppire-window.c:646 msgid "System Files (*.sav, *.zsav)" msgstr "Rendszerfájlok (*.sav, *.zsav)" #: src/ui/gui/psppire-window.c:663 #, fuzzy #| msgid "Syntax Files (*.sps) " msgid "Output Files (*.spv) " msgstr "Szintaxisfájlok (*.sps) " #: src/ui/gui/t-test-options.c:65 #, c-format msgid "Con_fidence Interval: %2d %%" msgstr "Kon_fidencia intervallum: %2d %%" #: src/ui/gui/val-labs-dialog.c:591 #, c-format msgid "%s = `%s'" msgstr "%s = `%s'" #: src/ui/gui/var-type-dialog.c:541 #, fuzzy #| msgid "Compute Variable: Type and Label" msgid "Variable Type and Format" msgstr "Számítási változó: típus és címke" #: src/ui/gui/windows-menu.c:92 msgid "_Minimize all Windows" msgstr "Minden ablak _minimalizálása" #: src/ui/gui/windows-menu.c:100 msgid "_Split" msgstr "_Felosztás" #: src/ui/gui/windows-menu.c:132 msgid "_Windows" msgstr "Abla_kok" #: utilities/pspp-convert.c:67 #, c-format msgid "%s argument must be a single character" msgstr "" #: utilities/pspp-convert.c:265 msgid "exactly two non-option arguments are required; use --help for help" msgstr "" "pontosan kettő nem kapcsoló argumentum szükséges; a súgóhoz használja a --" "help parancsot" #: utilities/pspp-convert.c:276 #, c-format msgid "%s: cannot guess output format (use -O option)" msgstr "%s: a kimeneti formátum nem található ki (használja a -O kapcsolót)" #: utilities/pspp-convert.c:341 #, c-format msgid "%s: unknown output format (use -O option)" msgstr "%s: ismeretlen kimeneti formátum (használja a -O kapcsolót)" #: utilities/pspp-convert.c:360 #, c-format msgid "%s: error reading input file" msgstr "%s: hiba a bemeneti fájl olvasásakor" #: utilities/pspp-convert.c:362 #, c-format msgid "%s: error writing output file" msgstr "%s: hiba a kimeneti fájl írásakor" #: utilities/pspp-convert.c:409 #, fuzzy, c-format #| msgid "%s: error opening output file" msgid "%s: error opening password file" msgstr "%s: hiba a kimeneti fájl megnyitásakor" #: utilities/pspp-convert.c:425 #, fuzzy, c-format #| msgid "%s: error reading input file" msgid "" "\n" "%s: password not in file" msgstr "%s: hiba a bemeneti fájl olvasásakor" #: utilities/pspp-convert.c:462 #, fuzzy, c-format #| msgid "`%c' is not a valid hex digit" msgid "%s: '%c' is not in alphabet" msgstr "a(z) „%c” nem érvényes hexadecimális számjegy" #: utilities/pspp-convert.c:526 msgid "sorry, wrong password" msgstr "sajnáljuk, hibás jelszó" #: utilities/pspp-output.c:92 #, c-format msgid "%s and %s:" msgstr "" #: utilities/pspp-output.c:547 #, c-format msgid "%s: invalid XPath expression" msgstr "" #: utilities/pspp-output.c:716 msgid "missing command name (use --help for help)" msgstr "" #: utilities/pspp-output.c:720 #, c-format msgid "unknown command \"%s\" (use --help for help)" msgstr "" #: utilities/pspp-output.c:728 #, c-format msgid "\"%s\" command takes exactly %d argument" msgid_plural "\"%s\" command takes exactly %d arguments" msgstr[0] "" msgstr[1] "" #: utilities/pspp-output.c:735 #, fuzzy, c-format #| msgid "%s requires at least %d valid arguments in list." msgid "\"%s\" command requires at least %d argument" msgid_plural "\"%s\" command requires at least %d arguments" msgstr[0] "A(z) %s legalább %d érvényes argumentumot vár a listában." msgstr[1] "A(z) %s legalább %d érvényes argumentumot vár a listában." #: utilities/pspp-output.c:742 #, fuzzy, c-format #| msgid "%s requires at least %d valid arguments in list." msgid "\"%s\" command requires between %d and %d arguments" msgstr "A(z) %s legalább %d érvényes argumentumot vár a listában." #: utilities/pspp-output.c:782 msgid "The following object classes are supported:" msgstr "" #: utilities/pspp-output.c:791 #, c-format msgid "%s: unknown object class (use --select=help for help" msgstr "" #: src/language/utilities/set.q:162 #, c-format msgid "%s must be between 0 and 20." msgstr "%s 0 és 20 között kell legyen." #: src/language/utilities/set.q:172 src/language/utilities/set.q:179 #, c-format msgid "%s must be at least 1." msgstr "%s legalább 1 kell legyen." #: src/language/utilities/set.q:205 #, c-format msgid "%s must be at least 1MB" msgstr "%s legalább 1 MB kell legyen" #: src/language/utilities/set.q:207 #, c-format msgid "%s must be positive" msgstr "%s pozitív kell legyen" #: src/language/utilities/set.q:213 src/language/utilities/set.q:215 #: src/language/utilities/set.q:217 src/language/utilities/set.q:219 #: src/language/utilities/set.q:221 src/language/utilities/set.q:223 #: src/language/utilities/set.q:225 src/language/utilities/set.q:227 #: src/language/utilities/set.q:229 src/language/utilities/set.q:231 #: src/language/utilities/set.q:233 #, c-format msgid "%s is obsolete." msgstr "%s elavult." #: src/language/utilities/set.q:239 msgid "Active file compression is not implemented." msgstr "Az aktív fájltömörítés nincs megvalósítva." #: src/language/utilities/set.q:403 #, c-format msgid "%s must be 1500 or later." msgstr "%s legalább 1500 vagy későbbi kell legyen." #: src/language/utilities/set.q:410 #, c-format msgid "expecting %s or year" msgstr "%s vagy év várt" #: src/language/utilities/set.q:438 src/language/utilities/set.q:535 #, c-format msgid "%s must be at least %d." msgstr "%s legalább %d kell legyen." #: src/language/utilities/set.q:474 #, c-format msgid "%s is not a recognized encoding or locale name" msgstr "%s nem egy ismert kódolás vagy területi beállítás neve" #: src/language/utilities/set.q:562 #, c-format msgid "" "%s requires numeric output format as an argument. Specified format %s is of " "type string." msgstr "" "%s numerikus kimeneti formátumot vár argumentumként. A megadott %s formátum " "karakterlánc típusú." #: src/language/utilities/set.q:791 msgid "ISL (32-bit IEEE 754 single, little-endian)" msgstr "ISL (32-bites IEEE 754 egyszeres, little-endian)" #: src/language/utilities/set.q:794 msgid "ISB (32-bit IEEE 754 single, big-endian)" msgstr "ISB (32-bites IEEE 754 egyszeres, big-endian)" #: src/language/utilities/set.q:797 msgid "IDL (64-bit IEEE 754 double, little-endian)" msgstr "IDL (64-bites IEEE 754 dupla, little-endian)" #: src/language/utilities/set.q:800 msgid "IDB (64-bit IEEE 754 double, big-endian)" msgstr "IDB (64-bites IEEE 754 dupla, big-endian)" #: src/language/utilities/set.q:804 msgid "VF (32-bit VAX F, VAX-endian)" msgstr "VF (32-bites VAX F, VAX-endian)" #: src/language/utilities/set.q:807 msgid "VD (64-bit VAX D, VAX-endian)" msgstr "VD (64-bites VAX D, VAX-endian)" #: src/language/utilities/set.q:810 msgid "VG (64-bit VAX G, VAX-endian)" msgstr "VG (64-bites VAX G, VAX-endian)" #: src/language/utilities/set.q:814 msgid "ZS (32-bit IBM Z hexadecimal short, big-endian)" msgstr "ZS (32-bites IBM Z hexadecimális short, big-endian)" #: src/language/utilities/set.q:817 msgid "ZL (64-bit IBM Z hexadecimal long, big-endian)" msgstr "ZL (64-bites IBM Z hexadecimális long, big-endian)" #: src/language/utilities/set.q:985 #, c-format msgid "%s is %s." msgstr "%s ilyen: %s." #: src/language/utilities/set.q:1089 #, c-format msgid "" "Too many %s commands without a %s: at most %d levels of saved settings are " "allowed." msgstr "" "Túl sok %s parancs %s nélkül: legfeljebb %d szintnyi mentett beállítás " "engedélyezett." #: src/language/utilities/set.q:1109 #, c-format msgid "%s without matching %s." msgstr "%s összetartozó %s nélkül." #: src/language/stats/crosstabs.q:327 #, c-format msgid "Missing mode %s not allowed in general mode. Assuming %s." msgstr "" "A(z) %s hiányzó mód nem megengedett általános módban. %s feltételezése." #: src/language/stats/crosstabs.q:444 msgid "Too many cross-tabulation variables or dimensions." msgstr "Túl sok kereszttábla változó vagy dimenzió." #: src/language/stats/crosstabs.q:509 #, c-format msgid "%s must be specified before %s." msgstr "a(z) %s megadása a(z) %s előtt kell történjen." #: src/language/stats/crosstabs.q:543 #, c-format msgid "Maximum value (%ld) less than minimum value (%ld)." msgstr "A legnagyobb érték (%ld) kisebb, mint a legkisebb érték (%ld)." #: src/language/stats/crosstabs.q:922 #, fuzzy #| msgid "Summary." msgid "Summary" msgstr "Összegzés." #: src/language/stats/crosstabs.q:935 #, fuzzy #| msgid "Crosstabs" msgid "Crosstabulation" msgstr "Kereszttáblák" #. TRANSLATORS: The %s here describes a crosstabulation. It takes the #. form "var1 * var2 * var3 * ...". #: src/language/stats/crosstabs.q:1013 #, c-format msgid "Crosstabulation %s contained no non-missing cases." msgstr "A(z) %s kereszttábla nem tartalmazott nem hiányzó eseteket." #: src/language/stats/crosstabs.q:1204 #, fuzzy #| msgid "Missing Values" msgid "Missing value" msgstr "Hiányzó értékek" #: src/language/stats/crosstabs.q:1263 #, fuzzy #| msgid "row %" msgid "Row %" msgstr "sor %" #: src/language/stats/crosstabs.q:1264 #, fuzzy #| msgid "column %" msgid "Column %" msgstr "oszlop %" #: src/language/stats/crosstabs.q:1265 #, fuzzy #| msgid "total %" msgid "Total %" msgstr "összesen %" #: src/language/stats/crosstabs.q:1269 #, fuzzy #| msgid "Adjusted Std. Residual" msgid "Adjusted Residual" msgstr "Korrigált sztd. reziduális" #: src/language/stats/crosstabs.q:1288 #, fuzzy #| msgid "Chi-Square Test" msgid "Chi-Square Tests" msgstr "Khí-négyzet próba" #: src/language/stats/crosstabs.q:1294 msgid "Pearson Chi-Square" msgstr "Pearson-féle Khí-négyzet" #: src/language/stats/crosstabs.q:1295 msgid "Likelihood Ratio" msgstr "Likelihood arány" #: src/language/stats/crosstabs.q:1296 msgid "Fisher's Exact Test" msgstr "Fisher-egzakt teszt" #: src/language/stats/crosstabs.q:1297 msgid "Continuity Correction" msgstr "Folytonossági korrekció" #: src/language/stats/crosstabs.q:1298 msgid "Linear-by-Linear Association" msgstr "Lineáris – Lineáris" #: src/language/stats/crosstabs.q:1299 src/language/stats/crosstabs.q:1345 #: src/language/stats/crosstabs.q:1854 msgid "N of Valid Cases" msgstr "N / érvényes esetek" #: src/language/stats/crosstabs.q:1305 #, fuzzy #| msgid "Asymp. Sig. (2-tailed)" msgid "Asymptotic Sig. (2-tailed)" msgstr "Aszimp. szig. (2-farkú)" #: src/language/stats/crosstabs.q:1319 #, fuzzy #| msgid "Symmetric measures." msgid "Symmetric Measures" msgstr "Szimmetrikus mérések." #: src/language/stats/crosstabs.q:1324 src/language/stats/crosstabs.q:1364 #: src/language/stats/crosstabs.q:1411 #, fuzzy #| msgid "_Values" msgid "Values" msgstr "É_rtékek" #: src/language/stats/crosstabs.q:1326 src/language/stats/crosstabs.q:1413 msgid "Asymp. Std. Error" msgstr "Aszimp. sztd. hiba" #: src/language/stats/crosstabs.q:1327 src/language/stats/crosstabs.q:1414 msgid "Approx. T" msgstr "Körülbelüli T" #: src/language/stats/crosstabs.q:1328 src/language/stats/crosstabs.q:1415 msgid "Approx. Sig." msgstr "Körülbelüli szig." #: src/language/stats/crosstabs.q:1333 src/language/stats/crosstabs.q:1420 msgid "Nominal by Nominal" msgstr "Nominális – nominális" #: src/language/stats/crosstabs.q:1334 msgid "Cramer's V" msgstr "Cramer-féle V" #: src/language/stats/crosstabs.q:1334 msgid "Contingency Coefficient" msgstr "Kontingencia-együttható" #: src/language/stats/crosstabs.q:1336 src/language/stats/crosstabs.q:1425 msgid "Ordinal by Ordinal" msgstr "Ordinális – ordinális" #: src/language/stats/crosstabs.q:1337 msgid "Kendall's tau-b" msgstr "Kendall-féle tau-b" #: src/language/stats/crosstabs.q:1337 msgid "Kendall's tau-c" msgstr "Kendall-féle tau-c" #: src/language/stats/crosstabs.q:1338 msgid "Spearman Correlation" msgstr "Spearman korreláció" #: src/language/stats/crosstabs.q:1340 msgid "Interval by Interval" msgstr "Intervallum – intervallum" #: src/language/stats/crosstabs.q:1341 msgid "Pearson's R" msgstr "Pearson-féle R" #: src/language/stats/crosstabs.q:1343 msgid "Measure of Agreement" msgstr "Egyezés mértéke" #: src/language/stats/crosstabs.q:1359 #, fuzzy #| msgid "Risk estimate." msgid "Risk Estimate" msgstr "Kockázatbecslés." #: src/language/stats/crosstabs.q:1368 #, fuzzy, no-c-format #| msgid "95%% Confidence Interval" msgid "95% Confidence Interval" msgstr "95%%-os konfidencia intervallum" #: src/language/stats/crosstabs.q:1389 msgid "Symmetric" msgstr "Szimmetrikus" #: src/language/stats/crosstabs.q:1391 src/language/stats/crosstabs.q:1396 #, c-format msgid "%s Dependent" msgstr "%s függő változó" #: src/language/stats/crosstabs.q:1406 #, fuzzy #| msgid "Directional measures." msgid "Directional Measures" msgstr "Irányított mérések." #: src/language/stats/crosstabs.q:1422 msgid "Goodman and Kruskal tau" msgstr "Goodman és Kruskal-féle tau" #: src/language/stats/crosstabs.q:1423 msgid "Uncertainty Coefficient" msgstr "Határozatlansági együttható" #: src/language/stats/crosstabs.q:1426 msgid "Somers' d" msgstr "Somers-féle d" #: src/language/stats/crosstabs.q:1428 msgid "Nominal by Interval" msgstr "Nominális – intervallum" #: src/language/stats/crosstabs.q:1826 #, fuzzy, c-format #| msgid "Odds Ratio for %s (%g / %g)" msgid "Odds Ratio for %s" msgstr "Esélyhányad ehhez: %s (%g / %g)" #: src/language/stats/crosstabs.q:1835 #, fuzzy, c-format #| msgid "For cohort %s = %.*g" msgid "For cohort %s = " msgstr "A(z) %s csoportnál = %.*g" #: src/ui/gui/aggregate.ui:24 msgid "Aggregate Data" msgstr "Adatok aggregálása" #: src/ui/gui/aggregate.ui:126 msgid "_Break variable(s)" msgstr "_Felosztási változók" #: src/ui/gui/aggregate.ui:179 msgid "Variable Name: " msgstr "Változónév: " #: src/ui/gui/aggregate.ui:215 msgid "Variable Label: " msgstr "Változócímke: " #: src/ui/gui/aggregate.ui:252 msgid "Function: " msgstr "Függvény: " #: src/ui/gui/aggregate.ui:327 msgid "Argument 1: " msgstr "1. argumentum: " #: src/ui/gui/aggregate.ui:364 msgid "Argument 2: " msgstr "2. argumentum: " #: src/ui/gui/aggregate.ui:428 msgid "Aggregated variables" msgstr "Aggregált változók" #: src/ui/gui/aggregate.ui:469 msgid "_Add aggregated variables to the active dataset" msgstr "_Aggregált értékek hozzáadása az aktív adathalmazhoz" #: src/ui/gui/aggregate.ui:486 msgid "_Replace the current dataset with the aggregated variables" msgstr "Jelenlegi adathalmaz _cseréje az aggregált változókkal" #: src/ui/gui/aggregate.ui:504 msgid "_Write a new data file containing only the aggregated variables" msgstr "Ú_j adatfájl írása, csak az aggregált változókat tartalmazva" #: src/ui/gui/aggregate.ui:544 msgid "label" msgstr "címke" #: src/ui/gui/aggregate.ui:593 msgid "File is _already sorted on break variable(s)" msgstr "A fájl _már a felosztási változók szerint rendezett" #: src/ui/gui/aggregate.ui:609 msgid "Sort file before a_ggregating" msgstr "Fájlok rendezése a_ggregálás előtt" #: src/ui/gui/aggregate.ui:630 msgid "Options for very large datasets" msgstr "Beállítások nagyon nagy adathalmazokhoz" #: src/ui/gui/autorecode.ui:24 msgid "Automatic Recode" msgstr "Automatikus átkódolás" #: src/ui/gui/autorecode.ui:120 msgid "Variable -> New Name" msgstr "Változó -> új név" #: src/ui/gui/autorecode.ui:145 msgid "_Lowest value" msgstr "Leg_alacsonyabb érték" #: src/ui/gui/autorecode.ui:163 msgid "_Highest value" msgstr "Leg_magasabb érték" #: src/ui/gui/autorecode.ui:185 msgid "Recode starting from" msgstr "Átkódolás innentől kezdve" #: src/ui/gui/autorecode.ui:204 msgid "_New Name" msgstr "Ú_j név" #: src/ui/gui/autorecode.ui:227 msgid "_Add New Name" msgstr "Új név _hozzáadása" #: src/ui/gui/autorecode.ui:285 msgid "_Use the same recoding scheme for all variables" msgstr "_Ugyanazon rögzítőséma használata minden változóhoz" #: src/ui/gui/autorecode.ui:301 msgid "Treat _blank string values as missing" msgstr "Ü_res karakterlánc értékek hiányzóként kezelése" #: src/ui/gui/binomial.ui:86 msgid "_Test Variable List:" msgstr "_Próba változólista:" #: src/ui/gui/binomial.ui:160 src/ui/gui/chi-square.ui:281 msgid "_Get from data" msgstr "_Kinyerés az adatokból" #: src/ui/gui/binomial.ui:181 src/ui/gui/indep-samples.ui:150 msgid "_Cut point:" msgstr "_Vágási pont:" #: src/ui/gui/binomial.ui:225 msgid "Define Dichotomy" msgstr "Dichotómok megadása" #: src/ui/gui/binomial.ui:245 msgid "Test _Proportion:" msgstr "Próba _arány:" #: src/ui/gui/compute.ui:32 msgid "Compute Variable: Type and Label" msgstr "Számítási változó: típus és címke" #: src/ui/gui/compute.ui:67 msgid "Use _expression as label" msgstr "_Kifejezés használata címkeként" #: src/ui/gui/compute.ui:90 msgid "_Label:" msgstr "_Címke:" #: src/ui/gui/compute.ui:194 msgid "_String" msgstr "_Karakterlánc" #: src/ui/gui/compute.ui:287 msgid "_Numeric" msgstr "_Numerikus" #: src/ui/gui/compute.ui:343 msgid "Compute Variable" msgstr "Számítási változó" #: src/ui/gui/compute.ui:381 msgid "Target _Variable:" msgstr "Cél_változó:" #: src/ui/gui/compute.ui:412 msgid "_Type & Label..." msgstr "_Típus és címke…" #: src/ui/gui/compute.ui:469 msgid "=" msgstr "=" #: src/ui/gui/compute.ui:526 msgid "_Numeric Expressions:" msgstr "_Numerikus kifejezések:" #: src/ui/gui/compute.ui:598 msgid "_Functions:" msgstr "_Függvények:" #: src/ui/gui/compute.ui:678 msgid "_If..." msgstr "_Ha…" #: src/ui/gui/barchart.ui:24 msgid "Barchart" msgstr "Oszlopdiagram" #: src/ui/gui/barchart.ui:112 msgid "Category A_xis:" msgstr "Kategória _tengely:" #: src/ui/gui/barchart.ui:140 msgid "_N of cases" msgstr "_Esetek száma" #: src/ui/gui/barchart.ui:158 msgid "_Cum. n of cases" msgstr "Esetek _kum. száma" #: src/ui/gui/barchart.ui:174 msgid "Other _summary function" msgstr "Más ö_sszegző függvény" #: src/ui/gui/barchart.ui:191 msgid "% of c_ases" msgstr "Esetek %-a" #: src/ui/gui/barchart.ui:207 msgid "C_um. % of cases" msgstr "Esetek k_um. %-a" #: src/ui/gui/barchart.ui:270 src/ui/gui/histogram.ui:100 msgid "_Variable:" msgstr "_Változó:" #: src/ui/gui/barchart.ui:308 msgid "Bars Represent" msgstr "Az oszlopok jelentése" #: src/ui/gui/barchart.ui:340 msgid "Category C_luster:" msgstr "Kategória k_laszter:" #: src/ui/gui/correlation.ui:24 msgid "Bivariate Correlations" msgstr "Kétváltozós korrelációk" #: src/ui/gui/correlation.ui:148 msgid "Pearso_n" msgstr "Pearso_n" #: src/ui/gui/correlation.ui:164 msgid "_Kendall's tau-b" msgstr "_Kendall-féle tau-b" #: src/ui/gui/correlation.ui:180 msgid "_Spearman" msgstr "_Spearman" #: src/ui/gui/correlation.ui:200 msgid "Correlation Coefficients" msgstr "Korrelációs együtthatók" #: src/ui/gui/correlation.ui:224 msgid "_Two-tailed" msgstr "_Két-farkú" #: src/ui/gui/correlation.ui:241 msgid "One-tai_led" msgstr "_Egy-farkú" #: src/ui/gui/correlation.ui:262 msgid "Test of Significance" msgstr "Szignifikancia próba" #: src/ui/gui/correlation.ui:275 msgid "_Flag significant correlations" msgstr "Szignifikáns korrelációk meg_jelölése" #: src/ui/gui/count.ui:24 msgid "Count Occurrences of Values within Cases" msgstr "Értékek előfordulási száma az esetek közt" #: src/ui/gui/count.ui:117 msgid "Numeric _Variables:" msgstr "Numerikus _változók:" #: src/ui/gui/count.ui:147 msgid "_Target Variable:" msgstr "_Célváltozó:" #: src/ui/gui/count.ui:178 msgid "Target _Label:" msgstr "Cél _címke:" #: src/ui/gui/count.ui:192 msgid "_Define Values..." msgstr "Értékek _meghatározása…" #: src/ui/gui/count.ui:257 msgid "Count Values within Cases: Values to Count" msgstr "Értékek számolása az esetekben: számolandó értékek" #: src/ui/gui/count.ui:305 msgid "Values _to Count:" msgstr "_Számolandó értékek:" #: src/ui/gui/comments.ui:25 msgid "Data File Comments" msgstr "Adatfájl megjegyzések" #: src/ui/gui/comments.ui:49 msgid "Comments:" msgstr "Megjegyzések:" #: src/ui/gui/comments.ui:106 msgid "Display comments in output" msgstr "Megjegyzések megjelenítése a kimenetben" #: src/ui/gui/comments.ui:127 msgid "Column Number: 0" msgstr "Oszlopszám: 0" #: src/ui/gui/crosstabs.ui:25 msgid "Crosstabs: Cells" msgstr "Kereszttáblák: cellák" #: src/ui/gui/crosstabs.ui:67 msgid "Cell Display" msgstr "Cella megjelenítés" #: src/ui/gui/crosstabs.ui:99 msgid "Crosstabs" msgstr "Kereszttáblák" #: src/ui/gui/crosstabs.ui:150 msgid "_Rows" msgstr "_Sorok" #: src/ui/gui/crosstabs.ui:195 msgid "_Columns" msgstr "_Oszlopok" #: src/ui/gui/crosstabs.ui:242 msgid "_Format..." msgstr "_Formátum…" #: src/ui/gui/crosstabs.ui:256 src/ui/gui/examine.ui:267 msgid "_Statistics..." msgstr "_Statisztika…" #: src/ui/gui/crosstabs.ui:270 msgid "Ce_lls..." msgstr "Ce_llák…" #: src/ui/gui/crosstabs.ui:348 msgid "Crosstabs: Format" msgstr "Kereszttáblák: formátum" #: src/ui/gui/crosstabs.ui:371 msgid "Print tables" msgstr "Táblák nyomtatása" #: src/ui/gui/crosstabs.ui:387 msgid "Pivot" msgstr "Sarokpont" #: src/ui/gui/crosstabs.ui:403 src/ui/gui/sort.ui:157 msgid "Ascending" msgstr "Növekvő" #: src/ui/gui/crosstabs.ui:455 msgid "Crosstabs: Statistics" msgstr "Kereszttáblák: statisztika" #: src/ui/gui/chi-square.ui:30 msgid "Chi-Square Test" msgstr "Khí-négyzet próba" #: src/ui/gui/chi-square.ui:82 msgid "All categor_ies equal" msgstr "Minden _kategória egyenlő" #: src/ui/gui/chi-square.ui:103 msgid "_Values" msgstr "É_rtékek" #: src/ui/gui/chi-square.ui:159 msgid "Expected Values:" msgstr "Várt értékek:" #: src/ui/gui/chi-square.ui:204 msgid "Test _Variables" msgstr "Próba_változók" #: src/ui/gui/chi-square.ui:298 msgid "Use _specified range" msgstr "_Megadott tartomány használata" #: src/ui/gui/chi-square.ui:323 msgid "_Lower:" msgstr "_Alsó:" #: src/ui/gui/chi-square.ui:337 msgid "_Upper:" msgstr "_Felső:" #: src/ui/gui/chi-square.ui:381 msgid "Expected Range:" msgstr "Várt terjedelem:" #: src/ui/gui/descriptives.ui:131 src/ui/gui/factor.ui:797 #: src/ui/gui/recode.ui:638 msgid "_Variables:" msgstr "_Változók:" #: src/ui/gui/descriptives.ui:176 msgid "S_tatistics:" msgstr "S_tatisztika:" #: src/ui/gui/descriptives.ui:230 msgid "_Exclude entire case if any selected variable is missing" msgstr "Teljes eset _kihagyása ha bármelyik kiválasztott változó hiányzik" #: src/ui/gui/descriptives.ui:247 msgid "_Include user-missing data in analysis" msgstr "Hiányzó adatok _bevétele az elemzésbe" #: src/ui/gui/descriptives.ui:264 msgid "Save _Z-scores of selected variables as new variables" msgstr "Kiválasztott változók _Z-pontszámának mentése új változóként" #: src/ui/gui/descriptives.ui:286 msgid "Options:" msgstr "Beállítások:" #: src/ui/gui/examine.ui:25 msgid "Explore" msgstr "Felfedezés" #: src/ui/gui/examine.ui:69 msgid "_Label Cases by:" msgstr "Esetek _címkézése eszerint:" #: src/ui/gui/examine.ui:116 msgid "_Factor List:" msgstr "_Faktorlista:" #: src/ui/gui/examine.ui:163 src/ui/gui/means.ui:126 msgid "_Dependent List:" msgstr "_Függő lista:" #: src/ui/gui/examine.ui:331 msgid "Explore: Options" msgstr "Felfedezés: beállítások" #: src/ui/gui/examine.ui:355 src/ui/gui/t-test.ui:81 msgid "Exclude cases _listwise" msgstr "Esetek kihagyása _listánként" #: src/ui/gui/examine.ui:373 msgid "Exclude cases _pairwise" msgstr "Esetek kihagyása _páronként" #: src/ui/gui/examine.ui:392 msgid "_Report values" msgstr "Értékek _jelentése" #: src/ui/gui/examine.ui:449 msgid "Explore: Statistics" msgstr "Felfedezés: statisztika" #: src/ui/gui/examine.ui:468 src/ui/gui/oneway.ui:576 msgid "_Descriptives" msgstr "_Leíróstatisztikák" #: src/ui/gui/examine.ui:485 msgid "_Extremes" msgstr "_Extrémumok" #: src/ui/gui/examine.ui:502 msgid "_Percentiles" msgstr "_Percentilisek" #: src/ui/gui/goto-case.ui:31 msgid "Goto Case" msgstr "Ugrás esethez" #: src/ui/gui/goto-case.ui:52 msgid "Goto Case Number:" msgstr "Ugrás esethez:" #: src/ui/gui/factor.ui:39 msgid "Factor Analysis: Rotation" msgstr "Faktoranalízis: forgatás" #: src/ui/gui/factor.ui:70 msgid "_None" msgstr "_Nincs" #: src/ui/gui/factor.ui:87 msgid "_Varimax" msgstr "_Varimax" #: src/ui/gui/factor.ui:104 msgid "_Quartimax" msgstr "_Quartimax" #: src/ui/gui/factor.ui:123 msgid "_Equimax" msgstr "_Equimax" #: src/ui/gui/factor.ui:146 msgid "Method" msgstr "Metódus" #: src/ui/gui/factor.ui:159 msgid "_Display rotated solution" msgstr "Forgatott megoldás _megjelenítése" #: src/ui/gui/factor.ui:181 src/ui/gui/factor.ui:582 msgid "Ma_ximum iterations for convergence:" msgstr "Ma_ximális iterációk a konvergenciához:" #: src/ui/gui/factor.ui:241 src/ui/gui/factor.ui:255 msgid "Principal Components Analysis" msgstr "Főkomponens elemzés" #: src/ui/gui/factor.ui:246 src/ui/gui/factor.ui:258 msgid "Principal Axis Factoring" msgstr "Főfaktorok módszere" #: src/ui/gui/factor.ui:264 msgid "Factor Analysis: Extraction" msgstr "Faktoranalízis: kinyerés" #: src/ui/gui/factor.ui:290 msgid "_Method: " msgstr "_Módszer: " #: src/ui/gui/factor.ui:345 msgid "Co_rrelation matrix" msgstr "Ko_rreláció mátrix" #: src/ui/gui/factor.ui:361 msgid "Co_variance matrix" msgstr "Ko_variancia mátrix" #: src/ui/gui/factor.ui:382 msgid "Analyze" msgstr "Elemzés" #: src/ui/gui/factor.ui:407 msgid "_Unrotated factor solution" msgstr "_Nem forgatott faktor megoldás" #: src/ui/gui/factor.ui:423 msgid "_Scree plot" msgstr "_Kőtörmelék diagram" #: src/ui/gui/factor.ui:443 src/ui/gui/histogram.ui:146 src/ui/gui/roc.ui:329 msgid "Display" msgstr "Megjelenítés" #: src/ui/gui/factor.ui:526 msgid "_Number of factors:" msgstr "Faktorok _száma:" #: src/ui/gui/factor.ui:563 msgid "Extract" msgstr "Kinyerés" #: src/ui/gui/factor.ui:640 msgid "Factor Analysis" msgstr "Faktoranalízis" #: src/ui/gui/factor.ui:672 src/ui/gui/data-editor.ui:266 msgid "_Descriptives..." msgstr "_Leíróstatisztikák…" #: src/ui/gui/factor.ui:685 msgid "_Extraction..." msgstr "_Kinyerés…" #: src/ui/gui/factor.ui:699 msgid "_Rotations..." msgstr "_Forgatások…" #: src/ui/gui/find.ui:25 msgid "Find Case" msgstr "Eset keresése" #: src/ui/gui/find.ui:117 msgid "Variable:" msgstr "Változó:" #: src/ui/gui/find.ui:157 src/ui/gui/val-labs-dialog.ui:113 msgid "Value:" msgstr "Érték:" #: src/ui/gui/find.ui:180 msgid "Search value labels" msgstr "Értékcímkék keresése" #: src/ui/gui/find.ui:210 msgid "Regular expression Match" msgstr "Reguláris kifejezés illesztés" #: src/ui/gui/find.ui:227 msgid "Search substrings" msgstr "Részkarekterláncok keresése" #: src/ui/gui/find.ui:244 msgid "Wrap around" msgstr "Körkörös keresés" #: src/ui/gui/find.ui:260 msgid "Search backward" msgstr "Keresés visszafelé" #: src/ui/gui/frequencies.ui:32 msgid "Frequencies: Frequency Tables" msgstr "Gyakoriságok: gyakoriságtáblázatok" #: src/ui/gui/frequencies.ui:67 msgid "_Always" msgstr "_Mindig" #: src/ui/gui/frequencies.ui:85 msgid "_Never" msgstr "_Soha" #: src/ui/gui/frequencies.ui:107 msgid "If no _more than " msgstr "Ha nem több _mint " #: src/ui/gui/frequencies.ui:129 src/ui/gui/frequencies.ui:454 msgid "100" msgstr "100" #: src/ui/gui/frequencies.ui:145 msgid "values" msgstr "érték" #: src/ui/gui/frequencies.ui:167 msgid "Display frequency tables" msgstr "Gyakoriságtáblázatok megjelenítése" #: src/ui/gui/frequencies.ui:194 msgid "A_scending value" msgstr "_Növekvő érték" #: src/ui/gui/frequencies.ui:212 msgid "D_escending value" msgstr "_Csökkenő érték" #: src/ui/gui/frequencies.ui:230 msgid "Ascending _frequency" msgstr "Növekvő _gyakoriság" #: src/ui/gui/frequencies.ui:248 msgid "Descending f_requency" msgstr "Csökkenő gy_akoriság" #: src/ui/gui/frequencies.ui:271 msgid "Order by" msgstr "Rendezési sorrend" #: src/ui/gui/frequencies.ui:324 msgid "Frequencies: Charts" msgstr "Gyakoriságok: diagramok" #: src/ui/gui/frequencies.ui:356 msgid "Scale:" msgstr "Arány:" #: src/ui/gui/frequencies.ui:366 msgid "_Frequencies" msgstr "_Gyakoriságok" #: src/ui/gui/frequencies.ui:383 msgid "_Percentages" msgstr "_Százalékok" #: src/ui/gui/frequencies.ui:407 msgid "Exclude values _below " msgstr "Értékek kihagyása ez _alatt " #: src/ui/gui/frequencies.ui:422 msgid "Exclude values _above " msgstr "Értékek kihagyása e _felett " #: src/ui/gui/frequencies.ui:441 src/ui/gui/reliability.ui:227 msgid "0" msgstr "0" #: src/ui/gui/frequencies.ui:469 msgid "Chart Formatting" msgstr "Diagram formázása" #: src/ui/gui/frequencies.ui:494 msgid "Draw _histograms" msgstr "_Hisztogramok rajzolása" #: src/ui/gui/frequencies.ui:510 msgid "Superimpose _normal curve" msgstr "_Normális görbe rárakása" #: src/ui/gui/frequencies.ui:530 msgid "Histograms" msgstr "Hisztogramok" #: src/ui/gui/frequencies.ui:555 msgid "Draw _bar charts" msgstr "_Oszlopdiagramok rajzolása" #: src/ui/gui/frequencies.ui:575 msgid "Bar Charts" msgstr "Oszlopdiagramok" #: src/ui/gui/frequencies.ui:600 msgid "Draw _pie charts" msgstr "_Kördiagramok rajzolása" #: src/ui/gui/frequencies.ui:616 msgid "Include slices for _missing values" msgstr "Szeletek bevétele _hiányzó értékek esetén" #: src/ui/gui/frequencies.ui:636 msgid "Pie Charts" msgstr "Kördiagramok" #: src/ui/gui/frequencies.ui:725 src/ui/gui/rank.ui:489 msgid "_Variable(s):" msgstr "_Változók:" #: src/ui/gui/frequencies.ui:769 msgid "_Statistics:" msgstr "_Statisztika:" #: src/ui/gui/frequencies.ui:783 msgid "Include _missing values" msgstr "_Hiányzó értékek bevétele" #: src/ui/gui/frequencies.ui:806 msgid "Ch_arts..." msgstr "_Diagramok…" #: src/ui/gui/frequencies.ui:821 msgid "Frequency _Tables..." msgstr "Gyakoriság_táblázatok…" #: src/ui/gui/histogram.ui:24 msgid "Histogram" msgstr "Hisztogram" #: src/ui/gui/histogram.ui:126 msgid "_Display normal curve" msgstr "Normális görbe _megjelenítése" #: src/ui/gui/indep-samples.ui:25 src/ui/gui/k-independent.ui:35 msgid "Define Groups" msgstr "Csoportok meghatározása" #: src/ui/gui/indep-samples.ui:75 msgid "Group_2 value:" msgstr "_2. csoport érték:" #: src/ui/gui/indep-samples.ui:89 msgid "Group_1 value:" msgstr "_1. csoport érték:" #: src/ui/gui/indep-samples.ui:190 msgid "_Use specified values:" msgstr "Megadott értékek _használata:" #: src/ui/gui/indep-samples.ui:259 msgid "Independent-Samples T Test" msgstr "Független mintás t-próba" #: src/ui/gui/indep-samples.ui:319 msgid "_Define Groups..." msgstr "Csoportok _meghatározása…" #: src/ui/gui/indep-samples.ui:401 src/ui/gui/t-test.ui:211 msgid "_Test Variable(s):" msgstr "_Próbaváltozók:" #: src/ui/gui/indep-samples.ui:454 src/ui/gui/k-independent.ui:165 msgid "_Grouping Variable:" msgstr "_Csoportosító változó:" #: src/ui/gui/k-independent.ui:63 msgid "_Upper limit:" msgstr "_Felső korlát:" #: src/ui/gui/k-independent.ui:77 msgid "_Lower limit:" msgstr "_Alsó korlát:" #: src/ui/gui/k-independent.ui:136 msgid "Tests for Several Independent Samples" msgstr "Próbák több független mintára" #: src/ui/gui/k-independent.ui:208 src/ui/gui/ks-one-sample.ui:131 msgid "Test _Variable List:" msgstr "Próba _változólista:" #: src/ui/gui/k-independent.ui:320 msgid "_Define Groups" msgstr "Csoportok meg_határozása" #: src/ui/gui/k-independent.ui:365 msgid "_Kruskal-Wallis H" msgstr "_Kruskal-Wallis H" #: src/ui/gui/k-independent.ui:382 src/ui/gui/runs.ui:140 msgid "_Median" msgstr "_Medián" #: src/ui/gui/k-means.ui:24 msgid "K-Means Cluster Analysis" msgstr "K-közép klaszteranalízis" #: src/ui/gui/k-means.ui:122 msgid "N_umber of Clusters: " msgstr "Klaszterek száma: " #: src/ui/gui/k-related.ui:24 msgid "Tests for Several Related Samples" msgstr "Próbák több kapcsolódó mintára" #: src/ui/gui/k-related.ui:113 msgid "_Test Variables:" msgstr "_Próba változók:" #: src/ui/gui/k-related.ui:145 msgid "_Friedman" msgstr "_Friedman" #: src/ui/gui/k-related.ui:161 msgid "_Kendall's W" msgstr "_Kendall-féle W" #: src/ui/gui/k-related.ui:177 msgid "_Cochran's Q" msgstr "_Cochran-féle Q" #: src/ui/gui/ks-one-sample.ui:163 msgid "_Normal" msgstr "_Normális" #: src/ui/gui/ks-one-sample.ui:181 msgid "_Poisson" msgstr "_Poisson" #: src/ui/gui/ks-one-sample.ui:198 msgid "_Uniform" msgstr "_Egyenletes" #: src/ui/gui/ks-one-sample.ui:213 msgid "_Exponential" msgstr "_Exponenciális" #: src/ui/gui/ks-one-sample.ui:232 msgid "Test Distribution" msgstr "Próbaeloszlás" #: src/ui/gui/logistic.ui:42 msgid "Logistic Regression: Options" msgstr "Logisztikus regresszió: beállítások" #: src/ui/gui/logistic.ui:66 msgid "CI for _exp(B): " msgstr "CI az _exp(B)-hez: " #: src/ui/gui/logistic.ui:97 msgid "%" msgstr "%" #: src/ui/gui/logistic.ui:146 msgid "Classification cu_toff: " msgstr "Osztályozás _vágása: " #: src/ui/gui/logistic.ui:159 msgid "_Maximum Iterations: " msgstr "_Maximális iterációk: " #: src/ui/gui/logistic.ui:177 msgid "Include _constant in model" msgstr "_Konstans bevétele a modellbe" #: src/ui/gui/logistic.ui:219 msgid "Logistic Regression" msgstr "Logisztikus regresszió" #: src/ui/gui/logistic.ui:364 src/ui/gui/regression.ui:185 msgid "_Dependent" msgstr "_Függő" #: src/ui/gui/logistic.ui:412 src/ui/gui/regression.ui:232 msgid "_Independent" msgstr "Függet_len" #: src/ui/gui/means.ui:25 msgid "Means" msgstr "Mintaátlagok" #: src/ui/gui/means.ui:179 msgid "_Independent List:" msgstr "_Független lista:" #: src/ui/gui/missing-val-dialog.ui:48 msgid "_No missing values" msgstr "_Nincs hiányzó érték" #: src/ui/gui/missing-val-dialog.ui:136 msgid "_Discrete missing values" msgstr "Hiányzó _diszkrét értékek" #: src/ui/gui/missing-val-dialog.ui:172 msgid "_Low:" msgstr "_Alacsony:" #: src/ui/gui/missing-val-dialog.ui:197 msgid "_High:" msgstr "_Magas:" #: src/ui/gui/missing-val-dialog.ui:221 msgid "Di_screte value:" msgstr "Disz_krét érték:" #: src/ui/gui/missing-val-dialog.ui:245 msgid "_Range plus one optional discrete missing value" msgstr "_Tartomány, és egy választható diszkrét hiányzó érték" #: src/ui/gui/oneway.ui:25 msgid "One-Way ANOVA: Contrasts" msgstr "Egytényezős ANOVA: kontrasztok" #: src/ui/gui/oneway.ui:107 msgid "_Coefficients:" msgstr "_Együtthatók:" #: src/ui/gui/oneway.ui:161 msgid "Coefficient Total: " msgstr "Együtthatók összege: " #: src/ui/gui/oneway.ui:198 msgid "Contrast 1 of 1" msgstr "Kontraszt 1 / 1" #: src/ui/gui/oneway.ui:234 #, fuzzy #| msgid "One-Way ANOVA: Contrasts" msgid "One-Way ANOVA: Post-Hoc" msgstr "Egytényezős ANOVA: kontrasztok" #: src/ui/gui/oneway.ui:270 #, fuzzy #| msgid "Games-Howell" msgid "Games Howell" msgstr "Games–Howell" #: src/ui/gui/oneway.ui:287 msgid "Fisher's LSD" msgstr "" #: src/ui/gui/oneway.ui:379 msgid "One-Way ANOVA" msgstr "Egytényezős ANOVA" #: src/ui/gui/oneway.ui:408 msgid "_Factor:" msgstr "_Faktor:" #: src/ui/gui/oneway.ui:451 msgid "Dependent _Variable(s):" msgstr "_Függő változók:" #: src/ui/gui/oneway.ui:593 msgid "_Homogeneity" msgstr "_Homogenitás" #: src/ui/gui/oneway.ui:637 msgid "Post-Hoc..." msgstr "" #: src/ui/gui/oneway.ui:652 msgid "_Contrasts..." msgstr "_Kontrasztok…" #: src/ui/gui/options.ui:25 msgid "Options Case" msgstr "Beállítások" #: src/ui/gui/options.ui:55 msgid "Display _Labels" msgstr "_Címkék megjelenítése" #: src/ui/gui/options.ui:71 msgid "Display _Names" msgstr "_Nevek megjelenítése" #: src/ui/gui/options.ui:99 msgid "Sort by L_abel" msgstr "Rendezés _címke szerint" #: src/ui/gui/options.ui:115 msgid "Sort by Na_me" msgstr "Rendezés _név szerint" #: src/ui/gui/options.ui:131 msgid "Do not S_ort" msgstr "Ne _rendezze" #: src/ui/gui/options.ui:159 msgid "Variable Lists" msgstr "Változólisták" #: src/ui/gui/options.ui:184 msgid "Ma_ximize" msgstr "Ma_ximalizálás" #: src/ui/gui/options.ui:199 msgid "_Raise" msgstr "_Feldobás" #: src/ui/gui/options.ui:214 msgid "Aler_t" msgstr "_Riasztás" #: src/ui/gui/options.ui:233 msgid "Output Window Action" msgstr "Kimenetablak művelete" #: src/ui/gui/paired-samples.ui:147 msgid "_Test Pair(s):" msgstr "_Próbapárok:" #: src/ui/gui/rank.ui:30 msgid "Rank Cases: Types" msgstr "Esetek rangsorolása: típusok" #: src/ui/gui/rank.ui:57 msgid "Sum of case _weights" msgstr "Eset_súlyok összege" #: src/ui/gui/rank.ui:74 msgid "Fractional rank as _%" msgstr "_Tört helyezés mint _%" #: src/ui/gui/rank.ui:92 msgid "_Fractional rank" msgstr "_Tört helyezés" #: src/ui/gui/rank.ui:109 msgid "_Savage score" msgstr "_Savage pontszám" #: src/ui/gui/rank.ui:125 msgid "_Rank" msgstr "_Helyezés" #: src/ui/gui/rank.ui:147 msgid "N_tiles" msgstr "N_tilisek" #: src/ui/gui/rank.ui:195 msgid "_Proportion Estimates" msgstr "_Aránybecslések" #: src/ui/gui/rank.ui:213 msgid "_Normal Scores" msgstr "_Normál pontszám" #: src/ui/gui/rank.ui:251 msgid "_Blom" msgstr "_Blom" #: src/ui/gui/rank.ui:269 msgid "Tuke_y" msgstr "Tuke_y" #: src/ui/gui/rank.ui:287 msgid "Ran_kit" msgstr "Ran_kit" #: src/ui/gui/rank.ui:305 msgid "_Van der Waerden" msgstr "_Van der Waerden" #: src/ui/gui/rank.ui:328 msgid "Proportion Estimation Formula" msgstr "Aránybecslési formula" #: src/ui/gui/rank.ui:369 msgid "Rank Cases" msgstr "Esetek rangsorolása" #: src/ui/gui/rank.ui:434 msgid "_By:" msgstr "_Rendezés:" #: src/ui/gui/rank.ui:595 msgid "_Smallest Value" msgstr "Leg_kisebb érték" #: src/ui/gui/rank.ui:613 msgid "_Largest Value" msgstr "Leg_nagyobb érték" #: src/ui/gui/rank.ui:637 msgid "Assign rank 1 to:" msgstr "1 rang hozzárendelése ehhez:" #: src/ui/gui/rank.ui:656 msgid "_Display summary tables" msgstr "Összegző táblázatok _megjelenítése" #: src/ui/gui/rank.ui:679 msgid "Rank T_ypes" msgstr "_Típusok rangsorolása" #: src/ui/gui/rank.ui:694 msgid "_Ties..." msgstr "_Döntetlenek…" #: src/ui/gui/rank.ui:756 msgid "Rank Cases: Ties" msgstr "Esetek rangsorolása: döntetlenek" #: src/ui/gui/rank.ui:788 msgid "_Mean" msgstr "_Mintaátlag" #: src/ui/gui/rank.ui:806 msgid "_Low" msgstr "_Alacsony" #: src/ui/gui/rank.ui:825 msgid "_High" msgstr "_Magas" #: src/ui/gui/rank.ui:851 msgid "_Sequential ranks to unique values" msgstr "_Sorozatos rangok az egyedi értékekhez" #: src/ui/gui/rank.ui:875 msgid "Rank Assigned to Ties" msgstr "Döntetlenekhez rendelt rang" #: src/ui/gui/runs.ui:155 msgid "M_ean" msgstr "M_intaátlag" #: src/ui/gui/runs.ui:171 msgid "Mo_de" msgstr "Mó_d" #: src/ui/gui/runs.ui:191 msgid "_Custom:" msgstr "_Egyéni:" #: src/ui/gui/runs.ui:230 msgid "Cut Point" msgstr "Vágási pont" #: src/ui/gui/sort.ui:25 msgid "Sort Cases" msgstr "Esetek rendezése" #: src/ui/gui/sort.ui:101 msgid "Sort by:" msgstr "Rendezés:" #: src/ui/gui/sort.ui:174 msgid "Descending" msgstr "Csökkenő" #: src/ui/gui/sort.ui:196 msgid "Sort Order" msgstr "Rendezési sorrend" #: src/ui/gui/split-file.ui:25 msgid "Split File" msgstr "Fájl felosztása" #: src/ui/gui/split-file.ui:103 msgid "Anal_yze all cases. Do not create groups." msgstr "Minden eset _elemzése. Ne hozzon létre csoportokat." #: src/ui/gui/split-file.ui:121 msgid "Compare _groups." msgstr "_Csoportok összehasonlítása." #: src/ui/gui/split-file.ui:140 msgid "Organize ou_tput by groups." msgstr "_Kimenet rendezése csoportonként." #: src/ui/gui/split-file.ui:225 msgid "Groups _based on:" msgstr "Csoportok ez _alapján:" #: src/ui/gui/split-file.ui:255 msgid "_Sort the file by grouping variables." msgstr "Fájl _rendezése csoportosítási változók szerint." #: src/ui/gui/split-file.ui:273 msgid "_File is already sorted." msgstr "A _fájl már rendezett." #: src/ui/gui/split-file.ui:334 msgid "Current Status : " msgstr "Jelenlegi állapot : " #: src/ui/gui/split-file.ui:348 msgid "Analysis by groups is off" msgstr "A csoportonkénti elemzés kikapcsolva" #: src/ui/gui/recode.ui:135 msgid "System _Missing" msgstr "Hiányzó rend_szer" #: src/ui/gui/recode.ui:150 msgid "Co_py old values" msgstr "Régi értékek _másolása" #: src/ui/gui/recode.ui:172 msgid "Va_lue: " msgstr "É_rték: " #: src/ui/gui/recode.ui:276 msgid "Conver_t numeric strings to numbers (`5' -> 5)" msgstr "Numerikus karakterláncok á_talakítása számokká („5” -> 5)" #: src/ui/gui/recode.ui:297 msgid "Output variables are _strings" msgstr "A kimeneti változók _karakterláncok" #: src/ui/gui/recode.ui:318 msgid "Width: " msgstr "Szélesség: " #: src/ui/gui/recode.ui:499 msgid "_Name:" msgstr "_Név:" #: src/ui/gui/recode.ui:527 msgid "La_bel:" msgstr "_Címke:" #: src/ui/gui/recode.ui:556 msgid "Chan_ge" msgstr "_Módosítás" #: src/ui/gui/recode.ui:584 msgid "Output Variable" msgstr "Kimeneti változó" #: src/ui/gui/recode.ui:658 msgid "Old and New Va_lues..." msgstr "Régi és új é_rtékek…" #: src/ui/gui/regression.ui:51 msgid "S_tatistics..." msgstr "S_tatisztika…" #: src/ui/gui/regression.ui:272 msgid "Regression: Save" msgstr "Regresszió: mentés" #: src/ui/gui/regression.ui:290 src/ui/gui/univariate.ui:42 msgid "_Predicted values" msgstr "_Előrejelzett értékek" #: src/ui/gui/regression.ui:307 src/ui/gui/univariate.ui:59 msgid "_Residuals" msgstr "_Reziduálisok" #: src/ui/gui/regression.ui:351 msgid "Regression: Statistics" msgstr "Regresszió: statisztika" #: src/ui/gui/regression.ui:393 src/ui/gui/univariate.ui:143 msgid "S_tatistics" msgstr "S_tatisztika" #: src/ui/gui/reliability.ui:34 msgid "Alpha" msgstr "Alfa" #: src/ui/gui/reliability.ui:43 msgid "Reliability Analysis" msgstr "Megbízhatósági elemzés" #: src/ui/gui/reliability.ui:144 msgid "_Items:" msgstr "_Elemek:" #: src/ui/gui/reliability.ui:166 msgid "_Model: " msgstr "_Modell: " #: src/ui/gui/reliability.ui:212 msgid "_Variables in first split:" msgstr "_Változók az első felosztásban:" #: src/ui/gui/reliability.ui:259 msgid "Show _descriptives for scale if item is deleted" msgstr "Skála _leíróstatisztikájának megjelenítése ha egy elem törlésre kerül" #: src/ui/gui/roc.ui:145 msgid "_Test Variable:" msgstr "_Próbaváltozó:" #: src/ui/gui/roc.ui:175 msgid "_State Variable:" msgstr "Á_llapotváltozó:" #: src/ui/gui/roc.ui:202 msgid "_Value of state variable:" msgstr "Állapotváltozó é_rtéke:" #: src/ui/gui/roc.ui:249 msgid "ROC C_urve" msgstr "ROC _görbe" #: src/ui/gui/roc.ui:269 msgid "_With diagonal reference line" msgstr "Átlós _referencia vonallal" #: src/ui/gui/roc.ui:293 msgid "Standard _Error and Confidence Interval" msgstr "Sztenderd _hiba és konfidencia intervallum" #: src/ui/gui/roc.ui:309 msgid "_Coordinate points of the ROC Curve" msgstr "A ROC görbe _koordináta pontjai" #: src/ui/gui/scatterplot.ui:25 msgid "Scatterplot" msgstr "Pontdiagram" #: src/ui/gui/scatterplot.ui:56 msgid "_X Axis:" msgstr "_X-tengely:" #: src/ui/gui/scatterplot.ui:100 msgid "_Y Axis:" msgstr "_Y-tengely:" #: src/ui/gui/select-cases.ui:37 msgid "Select Cases: Range" msgstr "Esetek kiválasztása: terjedelem" #: src/ui/gui/select-cases.ui:87 msgid "First case" msgstr "Első eset" #: src/ui/gui/select-cases.ui:99 msgid "Last case" msgstr "Utolsó eset" #: src/ui/gui/select-cases.ui:111 msgid "Observation" msgstr "Megfigyelés" #: src/ui/gui/select-cases.ui:161 msgid "Select Cases" msgstr "Esetek kiválasztása" #: src/ui/gui/select-cases.ui:313 msgid "Use filter variable" msgstr "Szűrőváltozó használata" #: src/ui/gui/select-cases.ui:380 msgid "Based on time or case range" msgstr "Idő vagy esettartomány alapján" #: src/ui/gui/select-cases.ui:395 msgid "Range..." msgstr "Terjedelem…" #: src/ui/gui/select-cases.ui:444 msgid "Random sample of cases" msgstr "Véletlenszerű esetminta" #: src/ui/gui/select-cases.ui:460 msgid "Sample..." msgstr "Minta…" #: src/ui/gui/select-cases.ui:508 msgid "If condition is satisfied" msgstr "Ha a feltétel kielégített" #: src/ui/gui/select-cases.ui:523 msgid "If..." msgstr "Ha…" #: src/ui/gui/select-cases.ui:567 msgid "All Cases" msgstr "Minden eset" #: src/ui/gui/select-cases.ui:581 msgid "Select" msgstr "Kiválasztás" #: src/ui/gui/select-cases.ui:608 msgid "Filtered" msgstr "Szűrt" #: src/ui/gui/select-cases.ui:625 msgid "Deleted" msgstr "Törölt" #: src/ui/gui/select-cases.ui:647 msgid "Unselected Cases Are" msgstr "Nem kiválasztott esetek" #: src/ui/gui/select-cases.ui:694 msgid "Select Cases: Random Sample" msgstr "Esetek kiválasztása: véletlenszerű minta" #: src/ui/gui/select-cases.ui:756 msgid "Sample Size" msgstr "Mintaméret" #: src/ui/gui/t-test.ui:25 msgid "Options" msgstr "Beállítások" #: src/ui/gui/t-test.ui:63 msgid "Exclude cases _analysis by analysis" msgstr "Esetek kihagyása _elemzésenként" #: src/ui/gui/t-test.ui:148 msgid "One - Sample T Test" msgstr "Egymintás t-próba" #: src/ui/gui/t-test.ui:265 msgid "Test _Value: " msgstr "Próbaér_ték: " #: src/ui/gui/text-data-import.ui:32 msgid "Select the first line of the data file that contains data." msgstr "Az adatfájl első olyan sorának kiválasztása, amelyik tartalmaz adatot." #: src/ui/gui/text-data-import.ui:54 msgid "Line above selected line contains variable names" msgstr "A kiválasztott sor feletti sor tartalmazza a változóneveket" #: src/ui/gui/text-data-import.ui:80 msgid "" "Check the data formats displayed below and fix any that are incorrect. You " "may set other variable properties now or later." msgstr "" "Ellenőrizze az alább megjelenített adatformátumokat, és javítsa a hibásakat. " "Más változótulajdonságokat is beállíthat, most vagy később." #: src/ui/gui/text-data-import.ui:121 msgid "Variables" msgstr "Változók" #: src/ui/gui/text-data-import.ui:152 msgid "Data Preview" msgstr "Adat előnézet" #: src/ui/gui/text-data-import.ui:181 msgid "" "This assistant will guide you through the process of importing data into " "PSPP from a text file with one line per case, in which fields are separated " "by tabs, commas, or other delimiters.\n" "\n" "\tThe selected file contains N lines of text. Only the first M of these " "will be shown for preview purposes in the following screens. You may choose " "below how much of the file should actually be imported." msgstr "" "Ez a varázsló végigvezeti az adatok importálási folyamatán. A szövegfájl egy " "eset - egy sor alapon lesz feldolgozva, ahol a mezőket tabulátorok, vesszők " "vagy más elválasztók határolják.\n" "\n" "\tA kiválasztott fájl N sornyi szöveget tartalmaz. Áttekintési céllal, csak " "az első M lesz megjelenítve a következő képernyőkön. Alább kiválaszthatja " "hogy mennyi adat kerüljön ténylegesen importálásra a fájlból." #: src/ui/gui/text-data-import.ui:252 msgid "All cases" msgstr "Minden eset" #: src/ui/gui/text-data-import.ui:272 msgid "Amount to Import" msgstr "Importálandó mennyiség" #: src/ui/gui/text-data-import.ui:325 msgid "C_ustom" msgstr "_Egyéni" #: src/ui/gui/text-data-import.ui:341 msgid "Slas_h (/)" msgstr "_Ferde vonal (/)" #: src/ui/gui/text-data-import.ui:357 msgid "Semicolo_n (;)" msgstr "_Pontosvessző (;)" #: src/ui/gui/text-data-import.ui:373 msgid "P_ipe (|)" msgstr "_Csővezeték (|)" #: src/ui/gui/text-data-import.ui:389 msgid "H_yphen (-)" msgstr "_Kötőjel (-)" #: src/ui/gui/text-data-import.ui:405 msgid "Co_mma (,)" msgstr "_Vessző (,)" #: src/ui/gui/text-data-import.ui:421 msgid "_Colon (:)" msgstr "Ke_ttőspont (:)" #: src/ui/gui/text-data-import.ui:437 msgid "Ban_g (!)" msgstr "F_elkiáltójel (!)" #: src/ui/gui/text-data-import.ui:453 msgid "Ta_b" msgstr "Ta_b" #: src/ui/gui/text-data-import.ui:469 msgid "_Space" msgstr "_Szóköz" #: src/ui/gui/text-data-import.ui:490 msgid "Separators" msgstr "Elválasztók" #: src/ui/gui/text-data-import.ui:541 msgid "Quote separator characters with" msgstr "Elválasztó karakterek idézőjelekben" #: src/ui/gui/text-data-import.ui:561 msgid "Quoting" msgstr "Idézőjelek" #: src/ui/gui/text-data-import.ui:599 msgid "Fields Preview" msgstr "Mezők előnézete" #: src/ui/gui/text-data-import.ui:622 msgid "" "Enter below the sheet number and the cell range which you wish to import." msgstr "" "Írja be lent a munkalap számát, és a cellatartományt, amelyet importálni " "szeretne." #: src/ui/gui/text-data-import.ui:670 msgid "_Cells: " msgstr "_Cellák: " #: src/ui/gui/text-data-import.ui:684 msgid "_Sheet Index: " msgstr "_Munkalap index: " #: src/ui/gui/text-data-import.ui:695 msgid "Use first row as _variable names" msgstr "Az első sor használata _változónevekként" #: src/ui/gui/text-data-import.ui:717 msgid "Cells to Import" msgstr "Importálandó cellák" #: src/ui/gui/transpose.ui:24 msgid "Transpose" msgstr "Transzponálás" #: src/ui/gui/transpose.ui:91 msgid "Name Variable:" msgstr "Név változó:" #: src/ui/gui/transpose.ui:127 msgid "Variable(s):" msgstr "Változó(k):" #: src/ui/gui/univariate.ui:25 msgid "Univariate: Save" msgstr "Egyváltozós: mentés" #: src/ui/gui/univariate.ui:103 msgid "Univariate: Statistics" msgstr "Egyváltozós: statisztika" #: src/ui/gui/univariate.ui:178 msgid "Univariate" msgstr "Egyváltozós" #: src/ui/gui/univariate.ui:281 msgid "_Dependent Variable" msgstr "_Függő változók" #: src/ui/gui/univariate.ui:329 msgid "_Fixed Factors" msgstr "_Rögzített faktorok" #: src/ui/gui/val-labs-dialog.ui:101 msgid "Value Label:" msgstr "Értékcímke:" #: src/ui/gui/data-editor.ui:33 msgid "Information Area" msgstr "Információs terület" #: src/ui/gui/data-editor.ui:55 msgid "Case Counter Area" msgstr "Esetszámláló terület" #: src/ui/gui/data-editor.ui:80 msgid "Filter Use Status Area" msgstr "Szűrő használati állapotterület" #: src/ui/gui/data-editor.ui:106 msgid "Weight Status Area" msgstr "Súly állapotterület" #: src/ui/gui/data-editor.ui:132 msgid "Split File Status Area" msgstr "Fájl felosztási állapotterület" #: src/ui/gui/data-editor.ui:154 msgid "_View" msgstr "_Nézet" #: src/ui/gui/data-editor.ui:157 msgid "_Status Bar" msgstr "Á_llapotsor" #: src/ui/gui/data-editor.ui:163 msgid "_Font..." msgstr "_Betűkészlet…" #: src/ui/gui/data-editor.ui:167 msgid "_Grid Lines" msgstr "_Rácsvonalak" #: src/ui/gui/data-editor.ui:171 msgid "Value _Labels" msgstr "Érték_címkék" #: src/ui/gui/data-editor.ui:182 msgid "_Variables" msgstr "_Változók" #: src/ui/gui/data-editor.ui:192 msgid "_Sort Cases..." msgstr "Esetek _rendezése…" #: src/ui/gui/data-editor.ui:196 msgid "_Transpose..." msgstr "_Transzponálás…" #: src/ui/gui/data-editor.ui:200 msgid "_Aggregate..." msgstr "_Aggregálás…" #: src/ui/gui/data-editor.ui:206 msgid "S_plit File..." msgstr "Fájl felosztása…" #: src/ui/gui/data-editor.ui:210 msgid "Select _Cases..." msgstr "_Esetek kiválasztása…" #: src/ui/gui/data-editor.ui:214 msgid "_Weight Cases..." msgstr "Esetek _súlyozása…" #: src/ui/gui/data-editor.ui:220 msgid "_Transform" msgstr "Áta_lakítás" #: src/ui/gui/data-editor.ui:223 msgid "_Compute..." msgstr "_Kiszámítás…" #: src/ui/gui/data-editor.ui:227 msgid "Cou_nt..." msgstr "Szá_molás…" #: src/ui/gui/data-editor.ui:231 msgid "Ran_k Cases..." msgstr "Esetek ran_gsorolása…" #: src/ui/gui/data-editor.ui:235 msgid "Auto_matic Recode..." msgstr "Auto_matikus átkódolás…" #: src/ui/gui/data-editor.ui:241 msgid "Recode into _Same Variables..." msgstr "Átkódolás _ugyanazon változókba…" #: src/ui/gui/data-editor.ui:245 msgid "Recode into _Different Variables..." msgstr "Átkódolás _különböző változókba…" #: src/ui/gui/data-editor.ui:251 msgid "_Run Pending Transforms" msgstr "Függőben lévő átalakítások _futtatása" #: src/ui/gui/data-editor.ui:257 msgid "_Analyze" msgstr "Elem_zés" #: src/ui/gui/data-editor.ui:260 msgid "_Descriptive Statistics" msgstr "_Leíróstatisztika" #: src/ui/gui/data-editor.ui:262 msgid "_Frequencies..." msgstr "_Gyakoriságok…" #: src/ui/gui/data-editor.ui:270 msgid "_Explore..." msgstr "_Felfedezés…" #: src/ui/gui/data-editor.ui:274 msgid "_Crosstabs..." msgstr "_Kereszttáblák…" #: src/ui/gui/data-editor.ui:279 msgid "Compare _Means" msgstr "_Mintaátlagok összehasonlítása" #: src/ui/gui/data-editor.ui:281 msgid "_Means..." msgstr "_Mintaátlagok…" #: src/ui/gui/data-editor.ui:285 msgid "_One Sample T Test..." msgstr "_Egymintás t-próba…" #: src/ui/gui/data-editor.ui:289 msgid "_Independent Samples T Test..." msgstr "_Független mintás t-próba…" #: src/ui/gui/data-editor.ui:293 msgid "_Paired Samples T Test..." msgstr "_Páros mintás t-próba…" #: src/ui/gui/data-editor.ui:297 msgid "One Way _ANOVA..." msgstr "Egytényezős _ANOVA…" #: src/ui/gui/data-editor.ui:302 msgid "_Univariate Analysis..." msgstr "Egy_változós elemzés…" #: src/ui/gui/data-editor.ui:306 msgid "Bivariate _Correlation..." msgstr "Kétváltozós _korreláció…" #: src/ui/gui/data-editor.ui:310 msgid "_K-Means Cluster..." msgstr "_K-közép klaszteranalízis…" #: src/ui/gui/data-editor.ui:314 msgid "_Factor Analysis..." msgstr "_Faktoranalízis…" #: src/ui/gui/data-editor.ui:318 msgid "Re_liability..." msgstr "Meg_bízhatóság…" #: src/ui/gui/data-editor.ui:322 msgid "_Regression" msgstr "_Regresszió" #: src/ui/gui/data-editor.ui:325 msgid "_Linear..." msgstr "_Lineáris…" #: src/ui/gui/data-editor.ui:329 msgid "_Binary Logistic..." msgstr "_Bináris logisztikus…" #: src/ui/gui/data-editor.ui:335 msgid "_Non-Parametric Statistics" msgstr "_Nem-paraméteres statisztikák" #: src/ui/gui/data-editor.ui:338 msgid "_Chi Square..." msgstr "_Khí-négyzet…" #: src/ui/gui/data-editor.ui:342 msgid "_Binomial..." msgstr "_Binomiális…" #: src/ui/gui/data-editor.ui:346 msgid "_Runs..." msgstr "F_utások…" #: src/ui/gui/data-editor.ui:350 msgid "_1 Sample K-S..." msgstr "_1-mintás K–S…" #: src/ui/gui/data-editor.ui:354 msgid "_2 Related Samples..." msgstr "_2 kapcsolódó minta…" #: src/ui/gui/data-editor.ui:358 msgid "_K Related Samples..." msgstr "_K kapcsolódó minta…" #: src/ui/gui/data-editor.ui:362 msgid "K _Independent Samples..." msgstr "K _független minta…" #: src/ui/gui/data-editor.ui:368 msgid "ROC Cur_ve..." msgstr "ROC _görbe…" #: src/ui/gui/data-editor.ui:374 msgid "_Graphs" msgstr "_Diagramok" #: src/ui/gui/data-editor.ui:377 msgid "_Scatterplot" msgstr "_Pontdiagram" #: src/ui/gui/data-editor.ui:381 msgid "_Histogram" msgstr "_Hisztogram" #: src/ui/gui/data-editor.ui:385 msgid "_Barchart" msgstr "_Oszlopdiagram" #: src/ui/gui/data-editor.ui:391 msgid "_Utilities" msgstr "Segédf_unkciók" #: src/ui/gui/data-editor.ui:394 msgid "_Variables..." msgstr "_Változók…" #: src/ui/gui/data-editor.ui:398 msgid "Data File _Comments..." msgstr "Adatfájl _megjegyzések…" #: src/ui/gui/output-window.ui:71 msgid "_Print..." msgstr "N_yomtatás…" #: src/ui/gui/output-window.ui:76 msgid "_Export..." msgstr "_Exportálás…" #: src/ui/gui/output-window.ui:92 msgid "Select _All" msgstr "Ö_sszes kijelölése" #: src/ui/gui/syntax-editor.ui:27 msgid "Syntax" msgstr "Szintaxis" #: src/ui/gui/syntax-editor.ui:31 msgid "Data" msgstr "Adatok" #: src/ui/gui/syntax-editor.ui:41 msgid "_Save" msgstr "Me_ntés" #: src/ui/gui/syntax-editor.ui:46 msgid "Save _As" msgstr "Men_tés másként" #: src/ui/gui/syntax-editor.ui:53 msgid "_Print" msgstr "N_yomtatás" #: src/ui/gui/syntax-editor.ui:84 msgid "_Delete" msgstr "_Törlés" #: src/ui/gui/syntax-editor.ui:90 msgid "_Undo" msgstr "_Visszavonás" #: src/ui/gui/syntax-editor.ui:94 msgid "_Redo" msgstr "_Mégis" #: src/ui/gui/syntax-editor.ui:100 #, fuzzy #| msgid "Find" msgid "_Find" msgstr "Keresés" #: src/ui/gui/syntax-editor.ui:106 msgid "_Run" msgstr "_Futtatás" #: src/ui/gui/syntax-editor.ui:109 msgid "_All" msgstr "Össz_es" #: src/ui/gui/syntax-editor.ui:113 msgid "_Selection" msgstr "_Kijelölés" #: src/ui/gui/syntax-editor.ui:117 msgid "_Current Line" msgstr "_Jelenlegi sor" #: src/ui/gui/syntax-editor.ui:122 msgid "_To End" msgstr "A _végére" #: src/ui/gui/var-type-dialog.ui:99 msgid "Scientific notation" msgstr "Tudományos jelölés" #: src/ui/gui/var-type-dialog.ui:150 msgid "Custom currency" msgstr "Egyéni pénznem" #: src/ui/gui/var-type-dialog.ui:267 msgid "positive" msgstr "pozitív" #: src/ui/gui/var-type-dialog.ui:279 msgid "negative" msgstr "negatív" #: src/ui/gui/var-type-dialog.ui:293 msgid "Sample" msgstr "Minta" #: src/ui/gui/var-type-dialog.ui:350 msgid "Width:" msgstr "Szélesség:" #: src/ui/gui/var-type-dialog.ui:396 msgid "Decimal Places:" msgstr "Decimális helyek:" #: src/ui/gui/weight.ui:24 msgid "Weight Cases" msgstr "Esetek súlyozása" #: src/ui/gui/weight.ui:100 msgid "Weight cases by" msgstr "Esetek súlyozása" #: src/ui/gui/weight.ui:144 msgid "Frequency Variable" msgstr "Gyakoriság változó" #: src/ui/gui/weight.ui:198 msgid "Current Status: " msgstr "Jelenlegi állapot: " #. TRANSLATORS: This is the application name in the desktop file #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:7 #: src/ui/gui/org.fsf.pspp.desktop.in:7 msgid "GNU PSPP" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:8 #, fuzzy #| msgid "A program for the analysis of sampled data" msgid "GNU PSPP is a program for statistical analysis of sampled data" msgstr "Egy program mintaadatok elemzéséhez" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:10 msgid "" "GNU PSPP is a program for the statistical analysis of sampled data. It is a " "Free replacement for the proprietary program SPSS, and appears very similar " "to it with a few exceptions. The most important of these exceptions are, " "that there are no “time bombs”; your copy of PSPP will not “expire” or " "deliberately stop working in the future. Neither are there any artificial " "limits on the number of cases or variables which you can use. There are no " "additional packages to purchase in order to get “advanced” functions; all " "functionality that PSPP currently supports is in the core package." msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:11 msgid "" "PSPP is a stable and reliable application. It can perform descriptive " "statistics, T-tests, anova, linear and logistic regression, measures of " "association, cluster analysis, reliability and factor analysis, non-" "parametric tests and more. Its backend is designed to perform its analyses " "as fast as possible, regardless of the size of the input data. You can use " "PSPP with its graphical interface or the more traditional syntax commands." msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:12 msgid "A brief list of some of the PSPP's features." msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:14 msgid "Support for over 1 billion cases" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:15 msgid "Support for over 1 billion variables" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:16 msgid "Syntax and data files which are compatible with those of SPSS" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:17 msgid "A choice of terminal or graphical user interface" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:18 msgid "A choice of text, postscript, pdf, opendocument or html output formats" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:19 msgid "" "Inter-operability with: LibreOffice, Apache OpenOffice, Gnumeric and other " "free software" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:20 msgid "Easy data import from spreadsheets, text files and database sources" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:21 msgid "" "The capability to open, analyse and edit two or more datasets concurrently" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:22 msgid "A user interface supporting all common character sets" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:23 msgid "A user interface has been translated to multiple languages" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:24 msgid "Very fast statistical procedures, even on very large data sets" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:25 msgid "No license fees and no expiration period" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:26 msgid "No unethical “end user license agreements”" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:27 msgid "A fully indexed user manual" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:28 msgid "Freedom ensured; It is licensed under the GPLv3 or later" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:29 msgid "" "Portability; Runs on many different computers and many different operating " "systems" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:31 msgid "" "PSPP is particularly aimed at statisticians, social scientists and students " "requiring fast convenient analysis of sampled data." msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:41 #, fuzzy #| msgid "Variable View" msgid "GNU PSPP Variable View" msgstr "Változónézet" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:54 msgid "Free Software Foundation" msgstr "" #: src/ui/gui/org.fsf.pspp.desktop.in:8 msgid "Statistical Software" msgstr "Statisztikai szoftver" #: src/ui/gui/org.fsf.pspp.desktop.in:9 msgid "Analyze statistical data with a free alternative to SPSS" msgstr "Statisztikai adatok elemzése az SPSS szabad alternatívájával" #. TRANSLATORS: Do not translate this string. Keep it as is, verbatim. #: src/ui/gui/org.fsf.pspp.desktop.in:12 msgid "pspp" msgstr "" #. TRANSLATORS: You must keep all ";" - also at the end of line. #: src/ui/gui/org.fsf.pspp.desktop.in:17 msgid "statistics;analysis;spss;" msgstr "" #~ msgid "Sorry. The help system hasn't yet been implemented." #~ msgstr "Sajnáljuk. A súgórendszer még nem lett megvalósítva." #~ msgid "Details" #~ msgstr "Részletek" #~ msgid "Multiple dichotomy set" #~ msgstr "Többértékű dichotóm halmaz" #~ msgid "Multiple category set" #~ msgstr "Többértékű kategóriahalmaz" #~ msgid "Label source" #~ msgstr "Címke forrása" #~ msgid "First variable label among variables" #~ msgstr "Első változó címkéje a változók közül" #~ msgid "Provided by user" #~ msgstr "Felhasználó által megadott" #~ msgid "Category label source" #~ msgstr "Kategória címke forrása" #~ msgid "Variable labels" #~ msgstr "Változócímkék" #~ msgid "Value labels of counted value" #~ msgstr "Számított érték értékcímkéi" #~ msgid "Label:" #~ msgstr "Címke:" #~ msgid "No label." #~ msgstr "Nincs címke." #~ msgid "Product:" #~ msgstr "Termék:" #~ msgid "Variables:" #~ msgstr "Változók:" #~ msgid "Cases:" #~ msgstr "Esetek:" #~ msgid "Type:" #~ msgstr "Típus:" #~ msgid "Description" #~ msgstr "Leírás" #~ msgid "The active dataset does not have a file label." #~ msgstr "Az aktív adathalmaznak nincs fájlcímkéje." #~ msgid "File label: %s" #~ msgstr "Fájlcímke: %s" #~ msgid "The active dataset dictionary does not contain any documents." #~ msgstr "Az aktív adathalmaz szótár nem tartalmaz egy dokumentumot sem." #~ msgid "Documents in the active dataset:" #~ msgstr "Dokumentumok az aktív adathalmazban:" #~ msgid "Custom data file attributes." #~ msgstr "Egyéni adatfájl attribútumok." #~ msgid "Label: %s\n" #~ msgstr "Címke: %s\n" #~ msgid "Format: %s\n" #~ msgstr "Formátum: %s\n" #~ msgid "Print Format: %s\n" #~ msgstr "Nyomtatási formátum: %s\n" #~ msgid "Write Format: %s\n" #~ msgstr "Írási formátum: %s\n" #~ msgid "Measure: %s\n" #~ msgstr "Mértékegység: %s\n" #~ msgid "Role: %s\n" #~ msgstr "Szerep: %s\n" #~ msgid "Display Alignment: %s\n" #~ msgstr "Megjelenítési igazítás: %s\n" #~ msgid "Display Width: %d\n" #~ msgstr "Megjelenítési szélesség: %d\n" #~ msgid "Missing Values: " #~ msgstr "Hiányzó értékek: " #~ msgid "Interactive shell not supported on this platform." #~ msgstr "Az interaktív héj nem támogatott ezen a platformon." #~ msgid "Error executing command: %s." #~ msgstr "Hiba a parancs végrehajtásakor: %s." #~ msgid "Unknown TABLECELLS class" #~ msgstr "Ismeretlen TABLECELLS osztály" #~ msgid "Exact Sig. (%d-tailed)" #~ msgstr "Pontos szig. (%d-farkú)" #~ msgid "Valid N" #~ msgstr "Érvényes N" #~ msgid "Missing N" #~ msgstr "Hiányzó N" #~ msgid "Valid cases = %.*g; cases with missing value(s) = %.*g." #~ msgstr "Érvényes esetek = %.*g, esetek hiányzó értékekkel = %.*g." #~ msgid "%g" #~ msgstr "%g" #~ msgid "%d" #~ msgstr "%d" #~ msgid "%zu" #~ msgstr "%zu" #~ msgid "50 (Median)" #~ msgstr "50 (medián)" #~ msgid "(%d)" #~ msgstr "(%d)" #~ msgid "Min" #~ msgstr "Min" #~ msgid "Max" #~ msgstr "Max" #~ msgid "%g%%" #~ msgstr "%g%%" #~ msgid "25th" #~ msgstr "25.-ik" #~ msgid "50th (Median)" #~ msgstr "50. (Medián)" #~ msgid "75th" #~ msgstr "75.-ik" #~ msgid "(I) %s" #~ msgstr "(I) %s" #~ msgid "(J) %s" #~ msgstr "(J) %s" #~ msgid "(I - J)" #~ msgstr "(I – J)" #~ msgid "%s into %s(%s of %s using %s BY %s)" #~ msgstr "%s ide: %s(%s / %s, %s használatával, e szerint: %s)" #~ msgid "%s into %s(%s of %s BY %s)" #~ msgstr "%s ide: %s(%s / %s e szerint: %s)" #~ msgid "%s into %s(%s of %s using %s)" #~ msgstr "%s ide: %s(%s / %s, %s használatával)" #~ msgid "%s into %s(%s of %s)" #~ msgstr "%s ide: %s(%s / %s)" #~ msgid "Area Under the Curve (%s)" #~ msgstr "Görbe alatti terület (%s)" #~ msgid "Coordinates of the Curve (%s)" #~ msgstr "A görbe koordinátái (%s)" #~ msgid "Std. Error Mean" #~ msgstr "A mintaátlag sztd. hibája" #~ msgid "(active dataset)" #~ msgstr "(aktív adathalmaz)" #~ msgid "Writing %zu record to %s." #~ msgid_plural "Writing %zu records to %s." #~ msgstr[0] "%zu rekord írása ide: %s." #~ msgstr[1] "%zu rekord írása ide: %s." #~ msgid "Writing %zu record." #~ msgid_plural "Writing %zu records." #~ msgstr[0] "%zu rekord írása." #~ msgstr[1] "%zu rekord írása." #~ msgid "Unsupported compression type (%d)" #~ msgstr "Nem támogatott tömörítési típus (%d)" #~ msgid "Failed to seek to end of central directory record: %s" #~ msgstr "A központi könyvtárrekord végére pozicionálás sikertelen: %s" #~ msgid "Failed to seek to central directory: %s" #~ msgstr "A központi könyvtárra pozicionálás sikertelen: %s" #~ msgid "Failed to seek to start of member `%s': %s" #~ msgstr "A(z) „%s” tag kezdetére pozicionálás sikertelen: %s" #~ msgid "ascii: closing output file `%s'" #~ msgstr "ascii: „%s” kimeneti fájl lezárása" #~ msgid "%s - Page %d" #~ msgstr "%s - %d. oldal" #~ msgid "bad vline: x=%d+%d=%d y=(%d+%d=%d,%d+%d=%d) in table size (%d,%d)\n" #~ msgstr "" #~ "hibás vline: x=%d+%d=%d y=(%d+%d=%d,%d+%d=%d) a(z) (%d,%d) méretű " #~ "táblában\n" #~ msgid "bad hline: x=(%d+%d=%d,%d+%d=%d) y=%d+%d=%d in table size (%d,%d)\n" #~ msgstr "" #~ "hibás hline: x=(%d+%d=%d,%d+%d=%d) y=%d+%d=%d a(z) (%d,%d) méretű " #~ "táblában\n" #~ msgid "" #~ "bad box: (%d+%d=%d,%d+%d=%d)-(%d+%d=%d,%d+%d=%d) in table size (%d,%d)\n" #~ msgstr "" #~ "hibás doboz: (%d+%d=%d,%d+%d=%d)-(%d+%d=%d,%d+%d=%d) a(z) (%d,%d) méretű " #~ "táblában\n" #~ msgid "can only convert encrypted data file to sav or sys format" #~ msgstr "" #~ "a titkosított adatfájlokat csak sav vagy sys formátumba lehet átalakítani" #~ msgid "can only convert encrypted syntax file to sps format" #~ msgstr "" #~ "a titkosított szintaktika fájlokat csak sps formátumba lehet átalakítani" #~ msgid "count" #~ msgstr "szám" #~ msgid "expected" #~ msgstr "várt" #~ msgid "residual" #~ msgstr "reziduális" #~ msgid "std. resid." #~ msgstr "sztd. rezid." #~ msgid "adj. resid." #~ msgstr "korr. rezid." #~ msgid "Chi-square tests." #~ msgstr "Khí-négyzet próbák." #~ msgid "Odds Ratio for %s (%.*s / %.*s)" #~ msgstr "Esélyhányad ehhez: %s (%.*s / %.*s)" #~ msgid "For cohort %s = %.*s" #~ msgstr "A(z) %s csoportnál = %.*s" #~ msgid "Support for %s files was not compiled into this installation of PSPP" #~ msgstr "" #~ "A(z) %s fájlok támogatása nem lett belefordítva a PSPP ezen telepítésébe" #~ msgid "Cannot parse field content `%.*s' as format %s: %s" #~ msgstr "" #~ "A(z) „%.*s” mezőtartalom nem dolgozható fel a(z) %s formátum szerint: %s" #~ msgid "This input line has too few separators to fill in this field." #~ msgstr "" #~ "A bemeneti sornak túl kevés elválasztója van ahhoz, hogy kitöltse ezt a " #~ "mezőt." #~ msgid "An error occurred reading the spreadsheet file." #~ msgstr "Hiba történt a táblázatfájl olvasásakor." #~ msgid "Enter a number to add a new variable." #~ msgstr "Írjon be egy számot egy új változó hozzáadásához." #~ msgid "Enter a number to add a new case." #~ msgstr "Írjon be egy számot egy új eset hozzáadásához." #~ msgid "Cannot create variable." #~ msgstr "Nem lehet létrehozni a változót." #~ msgid "\"%s\" is not a valid variable name." #~ msgstr "A(z) „%s” nem érvényes változónév." #~ msgid "This dictionary already contains a variable named \"%s\"." #~ msgstr "Ez a szótár már tartalmaz egy „%s” nevű változót." #~ msgid "Cannot rename variable." #~ msgstr "Nem lehet átnevezni a változót." #~ msgid "Enter a variable name to add a new variable." #~ msgstr "Adjon meg egy változónevet az új változóhoz." #~ msgid "{%s, %s}\n" #~ msgstr "{%s, %s}\n" #~ msgid "Multiple response set name `%s' does not begin with `$'." #~ msgstr "A(z) „%s” többértékű válaszhalmaz neve nem „$” jellel kezdődik." #~ msgid "could not access definition for terminal `%s'" #~ msgstr "a(z) „%s” terminál definíciója nem érhető el" #~ msgid "" #~ "PSPPIRE, a GUI for PSPP, a program for statistical analysis of sampled " #~ "data.\n" #~ "Usage: %s [OPTION]... FILE\n" #~ "\n" #~ "Arguments to long options also apply to equivalent short options.\n" #~ "\n" #~ "GUI options:\n" #~ " -q, --no-splash don't show splash screen during startup\n" #~ "\n" #~ "%sLanguage options:\n" #~ " -I, --include=DIR append DIR to search path\n" #~ " -I-, --no-include clear search path\n" #~ " -a, --algorithm={compatible|enhanced}\n" #~ " set to `compatible' if you want output\n" #~ " calculated from broken algorithms\n" #~ " -x, --syntax={compatible|enhanced}\n" #~ " set to `compatible' to disable PSPP " #~ "extensions\n" #~ " -i, --interactive interpret syntax in interactive mode\n" #~ " -s, --safer don't allow some unsafe operations\n" #~ "Default search path: %s\n" #~ "\n" #~ "Informative output:\n" #~ " -h, --help display this help and exit\n" #~ " -V, --version output version information and exit\n" #~ "\n" #~ "A non-option argument is interpreted as a data file in .sav or .zsav or ." #~ "por\n" #~ "format or a syntax file to load.\n" #~ msgstr "" #~ "PSPPIRE, egy GUI a PSPP-hez, egy mintavételezett adatok statisztikai " #~ "elemzésére\n" #~ "készült programhoz.\n" #~ "Használat: %s [KAPCSOLÓ]… FÁJL\n" #~ "\n" #~ "Arguments to long options also apply to equivalent short options.\n" #~ "\n" #~ "GUI beállítások:\n" #~ " -q, --no-splash nem jeleníti meg a felugó képernyőt " #~ "indításkor\n" #~ "\n" #~ "%sNyelvi beállítások:\n" #~ " -I, --include=MAPPA MAPPA hozzáfűzése a keresési útvonalhoz\n" #~ " -I-, --no-include keresési útvonal kiürítése\n" #~ " -a, --algorithm={compatible|enhanced}\n" #~ " állítsa „compatible” értékre, ha hibás\n" #~ " algoritmusok kimeneti értéket akarja " #~ "használni\n" #~ " -x, --syntax={compatible|enhanced}\n" #~ " állítsa „compatible” értékre a PSPP " #~ "kiterjesztések\n" #~ " letiltásához\n" #~ " -i, --interactive a szintaktika interaktív értelmezése\n" #~ " -s, --safer néhány nem biztonságos művelet megtiltása\n" #~ "Alapértelmezett keresési útvonal: %s\n" #~ "\n" #~ "Informatív kimenet:\n" #~ " -h, --help ezen súgó megjelenítése és kilépés\n" #~ " -V, --version verzióinformációk megjelenítése és kilépés\n" #~ "\n" #~ "A nem kapcsolóként megadott argumentumok adatfájlként (.sav, .zsav vagy ." #~ "por\n" #~ "formátumban), vagy betöltendő szintaktika fájlként értelmezettek.\n" #~ msgid "_Reset" #~ msgstr "_Visszaállítás" #~ msgid "_Select" #~ msgstr "_Kijelölés" #~ msgid "Delete the variables at the selected position(s)" #~ msgstr "Változók törlése a kiválasztott pozícióknál" #~ msgid "Delete the cases at the selected position(s)" #~ msgstr "Esetek törlése a kiválasztott pozícióknál" #~ msgid "_Open..." #~ msgstr "_Megnyitás…" #~ msgid "Transpose the cases with the variables" #~ msgstr "Esetek transzponálása a változókkal" #~ msgid "Aggregate the case values into a new variable" #~ msgstr "Az esetértékek aggregálása egy új változóba" #~ msgid "Choose a subset of cases for analysis" #~ msgstr "Válassza ki elemzésre az esetek egy részhalmazát" #~ msgid "All" #~ msgstr "Összes" pspp-1.4.1/po/pt_BR.po0000644000175000017500000116122413725012645014113 0ustar00blpblp00000000000000# translation of pspp-0.6.2-pre4 to Brazilian Portuguese # Copyright (C) 2007, 2008 Free Software Foundation, Inc. # This file is distributed under the same licence as the PSPP package. # Michel Almada de Castro Boaventura , 2009. msgid "" msgstr "" "Project-Id-Version: pspp-0.6.2-pre4\n" "Report-Msgid-Bugs-To: pspp-dev@gnu.org\n" "PO-Revision-Date: 2009-09-07 02:30-0300\n" "Last-Translator: Michel Almada de Castro Boaventura \n" "Language-Team: Brazilian Portuguese \n" "Language: pt_BR\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Bugs: Report translation errors to the Language-Team address.\n" #: src/data/any-reader.c:72 src/data/encrypted-file.c:78 #, fuzzy, c-format #| msgid "An error occurred while opening \"%s\": %s." msgid "An error occurred while opening `%s': %s." msgstr "Ocorreu um erro ao abrir \"%s\": %s." #: src/data/any-reader.c:93 src/language/lexer/lexer.c:1633 #, fuzzy, c-format #| msgid "Error removing `%s': %s." msgid "Error reading `%s': %s." msgstr "Erro removendo '%s' : %s." #: src/data/any-reader.c:114 #, fuzzy, c-format #| msgid "\"%s\" is not a system or portable file." msgid "`%s' is not a system or portable file." msgstr "\"%s\" não é um arquivo de sistema ou portátil." # Inline? #: src/data/any-reader.c:123 src/data/any-writer.c:66 msgid "The inline file is not allowed here." msgstr "O arquivo inline não é permitido aqui." #: src/data/any-reader.c:205 #, fuzzy, c-format #| msgid "Can't read from %s as a %s because it is already being read as a %s." msgid "" "Cannot read from dataset %s because no dictionary or data has been written " "to it yet." msgstr "" "Impossível ler de %s como uma %s porque ela já está sendo lida como uma %s." #: src/data/any-reader.c:260 src/language/data-io/dataset.c:253 #, fuzzy #| msgid "_Data" msgid "Dataset" msgstr "_Dados" #: src/data/calendar.c:100 #, c-format msgid "Month %d is not in acceptable range of 0 to 13." msgstr "O mês %d não está no intervalo aceitável de 0 a 13." #: src/data/calendar.c:110 #, c-format msgid "Day %d is not in acceptable range of 0 to 31." msgstr "O dia %d não está no intervalo aceitável de 0 a 31." #: src/data/calendar.c:119 #, c-format msgid "Date %04d-%d-%d is before the earliest acceptable date of 1582-10-15." msgstr "A data %04d-%d-%d é anterior à data mais antiga aceitável, 1582-10-15." #: src/data/casereader-filter.c:221 msgid "" "At least one case in the data read had a weight value that was user-missing, " "system-missing, zero, or negative. These case(s) were ignored." msgstr "" "Pelo menos um caso nos dados lidos tinha uma ponderação que era user-" "missing, system-missing, zero ou negativo. Este(s) caso(s) foi(foram) " "ignorado(s)." #. TRANSLATORS: this fragment will be interpolated into messages in fh_lock() #. that identify types of files. #: src/data/csv-file-writer.c:138 #, fuzzy #| msgid "file" msgid "CSV file" msgstr "arquivo" #: src/data/csv-file-writer.c:146 #, fuzzy, c-format #| msgid "Error opening \"%s\" for writing as a system file: %s." msgid "Error opening `%s' for writing as a CSV file: %s." msgstr "Erro ao abrir \"%s\" para gravação como arquivo de sistema: %s." #: src/data/csv-file-writer.c:453 #, fuzzy, c-format #| msgid "An I/O error occurred writing system file \"%s\"." msgid "An I/O error occurred writing CSV file `%s'." msgstr "Um erro de E/S ocorreu ao gravar arquivo de sistema \"%s\"." #: src/data/data-in.c:175 #, fuzzy, c-format #| msgid "%s variable %s has invalid %s format %s." msgid "Data is not valid as format %s: %s" msgstr "%s variável %s tem um inválido %s formato %s." #: src/data/data-in.c:377 src/data/data-in.c:553 msgid "Field contents are not numeric." msgstr "Os conteúdo do campo não são numéricos." #: src/data/data-in.c:379 src/data/data-in.c:555 msgid "Number followed by garbage." msgstr "Número seguido por lixo." #: src/data/data-in.c:392 msgid "Invalid numeric syntax." msgstr "Sintaxe numérica inválida." #: src/data/data-in.c:400 src/data/data-in.c:571 msgid "Too-large number set to system-missing." msgstr "Número muito grande definido como system-missing." #: src/data/data-in.c:406 src/data/data-in.c:577 msgid "Too-small number set to zero." msgstr "Número muito pequeno definido como zero." #: src/data/data-in.c:426 msgid "All characters in field must be digits." msgstr "Todos os caracteres no campo devem ser dígitos." #: src/data/data-in.c:445 msgid "Unrecognized character in field." msgstr "Caractere não reconhecido no campo." #: src/data/data-in.c:466 src/data/data-in.c:729 msgid "Field must have even length." msgstr "Campo deve ter tamanho par." #: src/data/data-in.c:468 src/data/data-in.c:732 msgid "Field must contain only hex digits." msgstr "Campo deve conter apenas dígitos hexadecimais." #: src/data/data-in.c:544 #, fuzzy #| msgid "Invalid numeric syntax." msgid "Invalid zoned decimal syntax." msgstr "Sintaxe numérica inválida." #: src/data/data-in.c:644 src/data/data-in.c:650 #, fuzzy #| msgid "Invalid numeric syntax." msgid "Invalid syntax for P field." msgstr "Sintaxe numérica inválida." #: src/data/data-in.c:768 src/data/data-in.c:818 msgid "Syntax error in date field." msgstr "Erro de sintaxe no campo de data." #: src/data/data-in.c:783 #, c-format msgid "Day (%ld) must be between 1 and 31." msgstr "Dia (%ld) deve estar entre 1 e 31." #: src/data/data-in.c:832 msgid "Delimiter expected between fields in date." msgstr "Delimitador esperado entre campos na data." #: src/data/data-in.c:906 msgid "" "Unrecognized month format. Months may be specified as Arabic or Roman " "numerals or as at least 3 letters of their English names." msgstr "" "Formato de mês não reconhecido. Meses devem ser especificados como números " "Arábicos ou Romanos, ou com pelo menos 3 letras de seus nomes em Inglês." #: src/data/data-in.c:933 #, c-format msgid "Year (%ld) must be between 1582 and 19999." msgstr "Ano (%ld) deve estar entre 1582 e 19999." # duvida na tradução. #: src/data/data-in.c:944 #, fuzzy, c-format #| msgid "Trailing garbage \"%.*s\" following date." msgid "Trailing garbage `%.*s' following date." msgstr "Procurando na lixeira \"%.*s\" seguindo por data." #: src/data/data-in.c:958 msgid "Julian day must have exactly three digits." msgstr "Dia Juliano deve ter exatamente três dígitos." #: src/data/data-in.c:960 #, c-format msgid "Julian day (%ld) must be between 1 and 366." msgstr "Dia Juliano (%ld) deve estar entre 1 e 366." #: src/data/data-in.c:984 #, c-format msgid "Quarter (%ld) must be between 1 and 4." msgstr "Quartil (%ld) deve estar entre 1 e 4." #: src/data/data-in.c:1005 #, c-format msgid "Week (%ld) must be between 1 and 53." msgstr "Semana (%ld) deve estar entre 1 e 53." #: src/data/data-in.c:1017 msgid "Delimiter expected between fields in time." msgstr "Delimitador esperado entre campos de tempo." #: src/data/data-in.c:1037 #, c-format msgid "Minute (%ld) must be between 0 and 59." msgstr "Minute (%ld) deve estar entre 0 e 59." #: src/data/data-in.c:1075 msgid "" "Unrecognized weekday name. At least the first two letters of an English " "weekday name must be specified." msgstr "" "Dia da semana não reconhecido. Pelo menos duas letras do nome em inglês " "devem ser especificadas." #: src/data/data-in.c:1210 #, c-format msgid "`%c' expected in date field." msgstr "`%c' esperado no campo de data." #: src/data/data-out.c:580 #, c-format msgid "Weekday number %f is not between 1 and 7." msgstr "Numero do dia na semana %f não está entre 1 e 7." #: src/data/data-out.c:605 #, c-format msgid "Month number %f is not between 1 and 12." msgstr "Número do mês %f não está entre 1 e 12." #. TRANSLATORS: this fragment will be interpolated into #. messages in fh_lock() that identify types of files. #: src/data/dataset-writer.c:66 src/language/data-io/file-handle.c:304 #, fuzzy #| msgid "data file" msgid "dataset" msgstr "arquivo de dados" #: src/data/dict-class.c:52 msgid "ordinary" msgstr "ordinária" #: src/data/dict-class.c:54 msgid "system" msgstr "system" #: src/data/dict-class.c:56 msgid "scratch" msgstr "rascunho" #: src/data/dictionary.c:1523 #, c-format msgid "Truncating document line to %d bytes." msgstr "Linha do documento truncada para %d bytes." #: src/data/encrypted-file.c:89 #, fuzzy, c-format #| msgid "An error occurred while opening \"%s\": %s." msgid "An error occurred while reading `%s': %s." msgstr "Ocorreu um erro ao abrir \"%s\": %s." #: src/data/encrypted-file.c:430 #, c-format msgid "" "%s: encrypted file corrupted (ends in incomplete %u-byte ciphertext block)" msgstr "" #: src/data/encrypted-file.c:449 #, c-format msgid "%s: encrypted file corrupted (ends with bad padding)" msgstr "" #: src/data/file-handle-def.c:283 src/language/data-io/dataset.c:266 msgid "active dataset" msgstr "" #: src/data/file-handle-def.c:518 #, c-format msgid "Can't read from %s as a %s because it is already being read as a %s." msgstr "" "Impossível ler de %s como uma %s porque ela já está sendo lida como uma %s." #: src/data/file-handle-def.c:522 #, c-format msgid "Can't write to %s as a %s because it is already being written as a %s." msgstr "" "Impossível gravar em %s como um %s porque ele já está sendo gravado em um %s." #: src/data/file-handle-def.c:529 #, c-format msgid "Can't re-open %s as a %s." msgstr "Impossível reabrir %s como %s." #: src/data/file-name.c:133 #, fuzzy, c-format #| msgid "Not opening pipe file `%s' because SAFER option set." msgid "Not opening pipe file `%s' because %s option set." msgstr "Não abrindo arquivo pipe '%s' porque a opção SAFER está ativada." #: src/data/format.c:339 msgid "Input format" msgstr "Formato de entrada" #: src/data/format.c:339 msgid "Output format" msgstr "Formato de saída" #: src/data/format.c:342 #, c-format msgid "Format %s may not be used for input." msgstr "Formato %s não pode ser utilizado como entrada." #: src/data/format.c:349 #, c-format msgid "%s specifies width %d, but %s requires an even width." msgstr "" "%s especifica comprimento %d, mas %s requer um comprimento de tamanho par." #: src/data/format.c:358 #, c-format msgid "%s %s specifies width %d, but %s requires a width between %d and %d." msgstr "" "%s %s especifica comprimento %d, mas %s requer um comprimento entre %d e %d." #: src/data/format.c:367 #, c-format msgid "%s %s specifies %d decimal place, but %s does not allow any decimals." msgid_plural "" "%s %s specifies %d decimal places, but %s does not allow any decimals." msgstr[0] "" msgstr[1] "" #: src/data/format.c:378 #, c-format msgid "" "%s %s specifies %d decimal place, but the given width allows at most %d " "decimals." msgid_plural "" "%s %s specifies %d decimal places, but the given width allows at most %d " "decimals." msgstr[0] "" msgstr[1] "" #: src/data/format.c:385 #, c-format msgid "" "%s %s specifies %d decimal place, but the given width does not allow for any " "decimals." msgid_plural "" "%s %s specifies %d decimal places, but the given width does not allow for " "any decimals." msgstr[0] "" msgstr[1] "" #: src/data/format.c:424 #, c-format msgid "%s variables are not compatible with %s format %s." msgstr "%s variáveis não são compatíveis com %s formato %s." #: src/data/format.c:425 src/data/format.c:1074 #: src/ui/gui/var-type-dialog.ui:167 msgid "String" msgstr "String" #: src/data/format.c:425 src/data/format.c:1035 #: src/ui/gui/var-type-dialog.ui:48 msgid "Numeric" msgstr "Numérico" #: src/data/format.c:426 src/data/sys-file-reader.c:2212 #: src/data/sys-file-reader.c:2214 src/language/xforms/recode.c:512 #: src/language/xforms/recode.c:513 src/language/xforms/recode.c:525 #: src/language/xforms/recode.c:526 #: src/language/dictionary/apply-dictionary.c:77 #: src/language/dictionary/apply-dictionary.c:78 msgid "numeric" msgstr "numérico" #: src/data/format.c:426 src/data/sys-file-reader.c:2212 #: src/data/sys-file-reader.c:2214 src/language/xforms/recode.c:512 #: src/language/xforms/recode.c:513 src/language/xforms/recode.c:525 #: src/language/xforms/recode.c:526 #: src/language/dictionary/apply-dictionary.c:77 #: src/language/dictionary/apply-dictionary.c:78 msgid "string" msgstr "string" #: src/data/format.c:444 #, c-format msgid "String variable with width %d is not compatible with format %s." msgstr "String de tamanho %d não é compatível com o formato %s" #: src/data/format.c:1038 src/ui/gui/var-type-dialog.ui:65 msgid "Comma" msgstr "Vírgula" #: src/data/format.c:1041 src/ui/gui/var-type-dialog.ui:82 msgid "Dot" msgstr "Ponto" #: src/data/format.c:1044 msgid "Scientific" msgstr "Científica" #: src/data/format.c:1061 src/ui/gui/var-type-dialog.ui:116 msgid "Date" msgstr "Data" #: src/data/format.c:1064 src/ui/gui/var-type-dialog.ui:133 msgid "Dollar" msgstr "Moeda" #: src/data/format.c:1071 msgid "Custom" msgstr "Personalizado" #: src/data/gnumeric-reader.c:478 src/data/ods-reader.c:505 #, c-format msgid "Cannot convert the value in the spreadsheet cell %s to format (%s): %s" msgstr "" #: src/data/gnumeric-reader.c:502 src/data/ods-reader.c:567 #, c-format msgid "" "There was a problem whilst reading the %s file `%s' (near line %d): `%s'" msgstr "" #: src/data/gnumeric-reader.c:597 #, c-format msgid "" "The gnumeric file `%s' is encoded as %s instead of the usual UTF-8 encoding. " "Any non-ascii characters will be incorrectly imported." msgstr "" #: src/data/gnumeric-reader.c:641 src/data/ods-reader.c:682 #, fuzzy, c-format #| msgid "Invalid cell range \"%s\"" msgid "Invalid cell range `%s'" msgstr "Intervalo de células \"%s\" inválido" #: src/data/gnumeric-reader.c:813 src/data/ods-reader.c:710 #: src/data/ods-reader.c:843 #, c-format msgid "Selected sheet or range of spreadsheet `%s' is empty." msgstr "" #: src/data/identifier2.c:60 #, fuzzy, c-format #| msgid "Variable name %s exceeds %d-character limit." msgid "Identifier `%s' exceeds %d-byte limit." msgstr "Nome de variável %s excede o limite de %d caracteres." #: src/data/identifier2.c:84 #, fuzzy #| msgid "Variable name cannot be empty string." msgid "Identifier cannot be empty string." msgstr "Nome de variável não pode ser uma string vazia." #: src/data/identifier2.c:92 #, fuzzy, c-format #| msgid "" #| "`%s' may not be used as a variable name because it is a reserved word." msgid "`%s' may not be used as an identifier because it is a reserved word." msgstr "" "'%s' não pode ser usada como nome de variável por ser uma palavra reservada." #: src/data/identifier2.c:103 #, fuzzy, c-format #| msgid "" #| "`%s' may not be used as a variable name because it is a reserved word." msgid "" "`%s' may not be used as an identifier because it contains ill-formed UTF-8 " "at byte offset %tu." msgstr "" "'%s' não pode ser usada como nome de variável por ser uma palavra reservada." #: src/data/identifier2.c:114 #, fuzzy, c-format #| msgid "" #| "Character `%c' (in %s) may not appear as the first character in a " #| "variable name." msgid "" "Character %s (in `%s') may not appear as the first character in a identifier." msgstr "" "Caractere '%c' (em %s) não pode aparecer como o primeiro caractere no nome " "de uma variável." #: src/data/identifier2.c:126 #, fuzzy, c-format #| msgid "Character `%c' (in %s) may not appear in a variable name." msgid "Character %s (in `%s') may not appear in an identifier." msgstr "Caractere '%c' (em %s) não pode aparecer em um nome de variável." #: src/data/mdd-writer.c:241 #, fuzzy, c-format #| msgid "I/O error occurred writing data file \"%s\"." msgid "An I/O error occurred writing metadata file `%s'." msgstr "Ocorreu um erro de E/S gravando no arquivo de dados \"%s\"." #. TRANSLATORS: this fragment will be interpolated into #. messages in fh_lock() that identify types of files. #: src/data/mdd-writer.c:457 #, fuzzy #| msgid "data file" msgid "metadata file" msgstr "arquivo de dados" #: src/data/mdd-writer.c:465 #, fuzzy, c-format #| msgid "Error opening \"%s\" for writing as a portable file: %s." msgid "Error opening `%s' for writing as a metadata file: %s." msgstr "Erro ao abrir \"%s\" para escrever como arquivo portátil: %s." #: src/data/mdd-writer.c:473 #, c-format msgid "Internal error creating xmlTextWriter. Please report this to %s." msgstr "" #: src/data/make-file.c:217 #, c-format msgid "Opening %s for writing: %s." msgstr "Abrindo %s para gravação: %s." #: src/data/make-file.c:228 #, c-format msgid "Opening stream for %s: %s." msgstr "Abrindo stream para %s: %s." #: src/data/make-file.c:260 #, c-format msgid "Creating temporary file to replace %s: %s." msgstr "Criando arquivo temporário para substituir %s: %s." #: src/data/make-file.c:277 #, c-format msgid "Creating temporary file %s: %s." msgstr "Criando arquivo temporário %s: %s." #: src/data/make-file.c:289 #, c-format msgid "Opening stream for temporary file %s: %s." msgstr "Abrindo stream para arquivo temporário %s: %s." #: src/data/make-file.c:326 #, c-format msgid "Replacing %s by %s: %s." msgstr "Substituindo %s por %s: %s." #: src/data/make-file.c:354 #, c-format msgid "Removing %s: %s." msgstr "Removendo %s: %s." #: src/data/mrset.c:83 #, c-format msgid "" "%s is not a valid name for a multiple response set. Multiple response set " "names must begin with `$'." msgstr "" #: src/data/ods-reader.c:620 #, fuzzy, c-format #| msgid "cannot open font file \"%s\"" msgid "Cannot open %s as a OpenDocument file: %s" msgstr "impossível abrir arquivo de fonte \"%s\"" #. TRANSLATORS: this fragment will be interpolated into #. messages in fh_lock() that identify types of files. #: src/data/pc+-file-reader.c:206 #, fuzzy #| msgid "system file" msgid "SPSS/PC+ system file" msgstr "arquivo de sistema" #: src/data/pc+-file-reader.c:215 #, fuzzy, c-format #| msgid "Error opening \"%s\" for reading as a system file: %s." msgid "Error opening `%s' for reading as an SPSS/PC+ system file: %s." msgstr "Erro ao abrir \"%s\" para leitura como arquivo de sistema: %s." #: src/data/pc+-file-reader.c:224 src/data/sys-file-reader.c:3541 #, fuzzy, c-format #| msgid "%s: Creating file: %s." msgid "%s: stat failed (%s)." msgstr "%s: Criando arquivo: %s" #: src/data/pc+-file-reader.c:230 #, fuzzy, c-format #| msgid "Variable suffix too large." msgid "%s: file too large." msgstr "Sufixo de variável muito grande." #: src/data/pc+-file-reader.c:257 #, c-format msgid "" "Directory entry is for a %u-byte record starting at offset %u but file is " "only %u bytes long." msgstr "" #: src/data/pc+-file-reader.c:275 #, fuzzy, c-format msgid "Directory fields have unexpected values (%u,%u)." msgstr "Arquivo especifica valor inesperado %g como SYSMIS." #: src/data/pc+-file-reader.c:372 src/data/sys-file-reader.c:672 #, fuzzy, c-format #| msgid "Variable" msgid "Variable %zu" msgstr "Variável" #: src/data/pc+-file-reader.c:380 src/data/sys-file-reader.c:680 #, fuzzy, c-format #| msgid "Value Labels" msgid "Variable %zu Label" msgstr "Value Labels" #: src/data/pc+-file-reader.c:385 #, c-format msgid "Variable %zu Value Label %zu" msgstr "" #: src/data/pc+-file-reader.c:388 src/data/sys-file-reader.c:690 msgid "Creation Date" msgstr "" #: src/data/pc+-file-reader.c:389 src/data/sys-file-reader.c:691 msgid "Creation Time" msgstr "" #: src/data/pc+-file-reader.c:390 src/data/sys-file-reader.c:692 #: src/language/dictionary/sys-file-info.c:200 msgid "Product" msgstr "" #: src/data/pc+-file-reader.c:391 src/data/sys-file-reader.c:693 #: src/language/dictionary/sys-file-info.c:300 #, fuzzy #| msgid "File label:" msgid "File Label" msgstr "Rótulo de arquivo:" #: src/data/pc+-file-reader.c:427 #, c-format msgid "" "Using default encoding %s to read this SPSS/PC+ system file. For best " "results, specify an encoding explicitly. Use SYSFILE INFO with ENCODING=" "\"DETECT\" to analyze the possible encodings." msgstr "" #: src/data/pc+-file-reader.c:483 src/data/sys-file-reader.c:890 #, fuzzy, c-format #| msgid "Error closing system file \"%s\": %s." msgid "Error closing system file `%s': %s." msgstr "Erro ao fechar arquivo de sistema \"%s\": %s." #: src/data/pc+-file-reader.c:544 #, fuzzy #| msgid "This is not an SPSS system file." msgid "This is not an SPSS/PC+ system file." msgstr "Este não é um arquivo de sistema do SPSS." #: src/data/pc+-file-reader.c:548 #, c-format msgid "Record 0 has unexpected length %u." msgstr "" #: src/data/pc+-file-reader.c:572 #, fuzzy, c-format msgid "Record 0 specifies unexpected system missing value %g (%a)." msgstr "Arquivo especifica valor inesperado %g como SYSMIS." #: src/data/pc+-file-reader.c:577 #, c-format msgid "Record 0 reserved fields have unexpected values (%u,%u,%u,%u,%u,%u)." msgstr "" #: src/data/pc+-file-reader.c:581 #, c-format msgid "Record 0 case counts differ (%u versus %u)." msgstr "" #: src/data/pc+-file-reader.c:585 #, fuzzy, c-format #| msgid "Compression %s." msgid "Invalid compression type %u." msgstr "Compressão %s." #: src/data/pc+-file-reader.c:596 #, c-format msgid "" "Record 0 claims %u cases with %u values per case (requiring at least %zu " "bytes) but data record is only %u bytes long." msgstr "" #: src/data/pc+-file-reader.c:618 #, c-format msgid "" "Value labels claimed to end at offset %u in labels record but labels record " "is only %u bytes." msgstr "" #: src/data/pc+-file-reader.c:629 #, c-format msgid "" "Value labels claimed to be at offset %u with length %u but file size is only " "%u bytes." msgstr "" #: src/data/pc+-file-reader.c:656 #, c-format msgid "" "Value labels end with partial label (%u bytes left in record, label length " "%)." msgstr "" #: src/data/pc+-file-reader.c:669 #, c-format msgid "%u leftover bytes following value labels." msgstr "" #: src/data/pc+-file-reader.c:685 #, c-format msgid "" "Variable label claimed to start at offset %u in labels record but labels " "record is only %u bytes." msgstr "" #: src/data/pc+-file-reader.c:697 #, c-format msgid "" "Variable label with length %u starting at offset %u in labels record " "overruns end of %u-byte labels record." msgstr "" #: src/data/pc+-file-reader.c:719 #, c-format msgid "Record 1 has length %u (expected %u)." msgstr "" #: src/data/pc+-file-reader.c:751 #, fuzzy, c-format #| msgid "Variable %s has label of invalid length %zu." msgid "Variable %u has invalid type %." msgstr "Variável %s tem um rótulo de tamanho inválido %zu." #: src/data/pc+-file-reader.c:787 #, fuzzy, c-format #| msgid "Invalid integer." msgid "Invalid weight index %u." msgstr "Inteiro inválido." #: src/data/pc+-file-reader.c:857 #, c-format msgid "Invalid variable name `%s'." msgstr "Nome de variável '%s' inválido." #: src/data/pc+-file-reader.c:865 src/data/sys-file-reader.c:1444 #, fuzzy, c-format #| msgid "Invalid variable name `%s' in position %d." msgid "Renaming variable with duplicate name `%s' to `%s'." msgstr "Nome de variável '%s' inválido na posição %d." #: src/data/pc+-file-reader.c:877 #, fuzzy, c-format #| msgid "THRU is not allowed with string variables." msgid "Cannot weight by string variable `%s'." msgstr "THRU não é permitido com variáveis string." #: src/data/pc+-file-reader.c:973 src/data/sys-file-reader.c:2762 msgid "File ends in partial case." msgstr "Arquivo termina em um caso parcial." #: src/data/pc+-file-reader.c:979 #, c-format msgid "" "Case beginning at offset 0x%08x extends past end of data record at offset 0x" "%08x." msgstr "" #: src/data/pc+-file-reader.c:998 src/data/sys-file-reader.c:2770 #, c-format msgid "Error reading case from file %s." msgstr "Erro lendo caso do arquivo %s." #: src/data/pc+-file-reader.c:1114 src/data/sys-file-reader.c:2933 #, c-format msgid "" "Possible compressed data corruption: string contains compressed integer " "(opcode %d)." msgstr "" #: src/data/pc+-file-reader.c:1156 src/data/sys-file-reader.c:3234 #, c-format msgid "`%s' near offset 0x%llx: " msgstr "" #: src/data/pc+-file-reader.c:1159 src/data/sys-file-reader.c:3237 #, c-format msgid "`%s': " msgstr "" #: src/data/pc+-file-reader.c:1211 src/data/sys-file-reader.c:3288 #, c-format msgid "System error: %s." msgstr "Erro de sistema: %s." #: src/data/pc+-file-reader.c:1216 src/data/sys-file-reader.c:3293 msgid "Unexpected end of file." msgstr "Fim de arquivo inesperado." #: src/data/pc+-file-reader.c:1301 src/data/sys-file-reader.c:3518 #, fuzzy, c-format #| msgid "%s: Creating file: %s." msgid "%s: seek failed (%s)." msgstr "%s: Criando arquivo: %s" #: src/data/pc+-file-reader.c:1351 #, fuzzy #| msgid "System File" msgid "SPSS/PC+ System File" msgstr "Arquivos de Sistema" #: src/data/por-file-reader.c:109 #, fuzzy, c-format #| msgid "portable file %s corrupt at offset 0x%lx: " msgid "portable file %s corrupt at offset 0x%llx: " msgstr "arquivo portable %s corrompido no offset 0x%lx: " #: src/data/por-file-reader.c:136 #, fuzzy, c-format #| msgid "reading portable file %s at offset 0x%lx: " msgid "reading portable file %s at offset 0x%llx: " msgstr "lendo arquivo portable %s no offset 0x%lx: " #: src/data/por-file-reader.c:164 #, fuzzy, c-format #| msgid "Error closing portable file \"%s\": %s." msgid "Error closing portable file `%s': %s." msgstr "Erro ao fechar arquivo portável \"%s\": %s." #: src/data/por-file-reader.c:216 msgid "unexpected end of file" msgstr "fim de arquivo inesperado" #. TRANSLATORS: this fragment will be interpolated into #. messages in fh_lock() that identify types of files. #: src/data/por-file-reader.c:275 src/data/por-file-writer.c:147 msgid "portable file" msgstr "arquivo portável" #: src/data/por-file-reader.c:283 #, fuzzy, c-format #| msgid "" #| "An error occurred while opening \"%s\" for reading as a portable file: %s." msgid "" "An error occurred while opening `%s' for reading as a portable file: %s." msgstr "Ocorreu um erro ao abrir \"%s\" para ler como arquivo portable: %s." #: src/data/por-file-reader.c:304 msgid "Data record expected." msgstr "Registro de dados esperado." #: src/data/por-file-reader.c:402 msgid "Number expected." msgstr "Número esperado." #: src/data/por-file-reader.c:430 msgid "Missing numeric terminator." msgstr "Terminador de número ausente." #: src/data/por-file-reader.c:453 msgid "Invalid integer." msgstr "Inteiro inválido." #: src/data/por-file-reader.c:464 src/data/por-file-reader.c:484 #, c-format msgid "Bad string length %d." msgstr "Tamanho de string %d incorreto." #: src/data/por-file-reader.c:547 #, c-format msgid "%s: Not a portable file." msgstr "%s: Não é um arquivo portável." #: src/data/por-file-reader.c:564 #, c-format msgid "Unrecognized version code `%c'." msgstr "Versão de código '%c' não reconhecida." #: src/data/por-file-reader.c:577 #, c-format msgid "Bad date string length %zu." msgstr "Comprimento %zu de string de data inválido" #: src/data/por-file-reader.c:579 #, c-format msgid "Bad time string length %zu." msgstr "Comprimento de String de tempo %zu errado." #: src/data/por-file-reader.c:630 #, c-format msgid "" "%s: Bad format specifier byte (%d). Variable will be assigned a default " "format." msgstr "" "%s: Byte especificador de formato inválido (%d). Variável será definida com " "um formato padrão." #: src/data/por-file-reader.c:651 #, c-format msgid "Numeric variable %s has invalid format specifier %s." msgstr "Variável numérica %s tem um especificador de formato inválido: %s." #: src/data/por-file-reader.c:655 #, c-format msgid "String variable %s with width %d has invalid format specifier %s." msgstr "" "Variável string %s com tamanho %d tem um especificador de formato inválido " "%s." #: src/data/por-file-reader.c:679 msgid "Expected variable count record." msgstr "Registro de quantidade de variáveis esperado." #: src/data/por-file-reader.c:683 #, c-format msgid "Invalid number of variables %d." msgstr "Número de variáveis inválido: %d." #: src/data/por-file-reader.c:692 #, c-format msgid "Weight variable name (%s) truncated." msgstr "Nome da variável de ponderação (%s) truncado." #: src/data/por-file-reader.c:707 msgid "Expected variable record." msgstr "Registro de variável esperado." #: src/data/por-file-reader.c:711 #, c-format msgid "Invalid variable width %d." msgstr "Comprimento %d de variável inválido." #: src/data/por-file-reader.c:719 #, c-format msgid "Invalid variable name `%s' in position %d." msgstr "Nome de variável '%s' inválido na posição %d." #: src/data/por-file-reader.c:723 src/data/sys-file-reader.c:1426 #, c-format msgid "Bad width %d for variable %s." msgstr "Comprimento %d incorreto para variável %s." #: src/data/por-file-reader.c:737 #, c-format msgid "Duplicate variable name %s in position %d renamed to %s." msgstr "Nome de variável %s duplicado na posição %d renomeado para %s." #: src/data/por-file-reader.c:786 #, c-format msgid "Weighting variable %s not present in dictionary." msgstr "Variável de ponderação %s ausente no dicionário." #: src/data/por-file-reader.c:830 #, c-format msgid "Unknown variable %s while parsing value labels." msgstr "Variável %s desconhecida ao analisar rótulos dos valores." #: src/data/por-file-reader.c:833 #, c-format msgid "" "Cannot assign value labels to %s and %s, which have different variable types." msgstr "" "Impossível atribuir rótulos de valores para %s e %s, as quais possuem " "diferentes tipos." #: src/data/por-file-reader.c:972 #, fuzzy #| msgid "Portable File" msgid "SPSS Portable File" msgstr "Arquivo portátil" #: src/data/por-file-writer.c:139 #, c-format msgid "Invalid decimal digits count %d. Treating as %d." msgstr "Quantidade %d de dígitos decimais inválida. Tratando como %d." #: src/data/por-file-writer.c:159 #, fuzzy, c-format #| msgid "Error opening \"%s\" for writing as a portable file: %s." msgid "Error opening `%s' for writing as a portable file: %s." msgstr "Erro ao abrir \"%s\" para escrever como arquivo portátil: %s." #: src/data/por-file-writer.c:505 #, fuzzy, c-format #| msgid "An I/O error occurred writing portable file \"%s\"." msgid "An I/O error occurred writing portable file `%s'." msgstr "Um erro de E/S ocorreu ao escrever no arquivo portátil \"%s\"." #: src/data/psql-reader.c:48 msgid "" "Support for reading postgres databases was not compiled into this " "installation of PSPP" msgstr "" "Suporte para ler bancos de dados postgres não foi compilado nesta instalação " "do PSPP" #: src/data/psql-reader.c:242 msgid "Memory error whilst opening psql source" msgstr "Erro de memória ao abrir fonte psql" #: src/data/psql-reader.c:248 #, c-format msgid "Error opening psql source: %s." msgstr "Erro abrindo fonte psql: %s." #: src/data/psql-reader.c:263 #, c-format msgid "" "Postgres server is version %s. Reading from versions earlier than 8.0 is not " "supported." msgstr "" "A versão do Postgres é %s. Ler de versões anteriores à 8.0 não é suportado." #: src/data/psql-reader.c:283 msgid "" "Connection is unencrypted, but unencrypted connections have not been " "permitted." msgstr "" "Conexão está descriptografada, mas conexões descriptografadas não foram " "permitidas." #: src/data/psql-reader.c:324 src/data/psql-reader.c:349 #: src/data/psql-reader.c:359 #, c-format msgid "Error from psql source: %s." msgstr "Erro do destino psql: %s." #: src/data/psql-reader.c:454 #, c-format msgid "Unsupported OID %d. SYSMIS values will be inserted." msgstr "OID %d não suportado. Valor SYSMIS será inserido." #: src/data/settings.c:391 msgid "" "MXWARNS set to zero. No further warnings will be given even when " "potentially problematic situations are encountered." msgstr "" #: src/data/settings.c:398 #, c-format msgid "" "Warnings re-enabled. %d warnings will be issued before aborting syntax " "processing." msgstr "" #: src/data/settings.c:618 #, c-format msgid "" "%s: Custom currency string `%s' does not contain exactly three periods or " "commas (or it contains both)." msgstr "" "%s: String de moeda personalizada '%s' não contem exatamente três pontos ou " "vírgulas (ou ela contém ambos)." #. TRANSLATORS: this fragment will be interpolated into #. messages in fh_lock() that identify types of files. #: src/data/sys-file-reader.c:407 src/data/sys-file-writer.c:245 msgid "system file" msgstr "arquivo de sistema" #: src/data/sys-file-reader.c:414 #, fuzzy, c-format #| msgid "Error opening \"%s\" for reading as a system file: %s." msgid "Error opening `%s' for reading as a system file: %s." msgstr "Erro ao abrir \"%s\" para leitura como arquivo de sistema: %s." #: src/data/sys-file-reader.c:491 msgid "Misplaced type 4 record." msgstr "Registro de tipo 4 fora do lugar." #: src/data/sys-file-reader.c:496 #, fuzzy #| msgid "Multiple type 6 (document) records." msgid "Duplicate type 6 (document) record." msgstr "Múltiplos registros de tipo 6 (documento)." #: src/data/sys-file-reader.c:506 src/data/sys-file-reader.c:1343 #, fuzzy, c-format #| msgid "" #| "Unrecognized record type 7, subtype %d. Please send a copy of this file, " #| "and the syntax which created it to %s" msgid "" "Unrecognized record type 7, subtype %d. For help, please send this file to " "%s and mention that you were using %s." msgstr "" "Registro de tipo 7 e subtipo %d não reconhecido. Por favor, envie uma cópia " "deste arquivo bem como da sintaxe que o criou para %s" #: src/data/sys-file-reader.c:526 #, c-format msgid "" "Record type 7, subtype %d found here has the same type as the record found " "near offset 0x%llx. For help, please send this file to %s and mention that " "you were using %s." msgstr "" #: src/data/sys-file-reader.c:538 #, c-format msgid "Unrecognized record type %d." msgstr "Registro de tipo %d não reconhecido." #: src/data/sys-file-reader.c:688 #, fuzzy, c-format #| msgid "Value Labels" msgid "Value Label %zu" msgstr "Value Labels" #: src/data/sys-file-reader.c:697 msgid "Extra Product Info" msgstr "" #: src/data/sys-file-reader.c:710 #, fuzzy, c-format #| msgid "Current Line" msgid "Document Line %zu" msgstr "Linha atual" #: src/data/sys-file-reader.c:718 #, c-format msgid "MRSET %zu" msgstr "" #: src/data/sys-file-reader.c:720 #, c-format msgid "MRSET %zu Label" msgstr "" #: src/data/sys-file-reader.c:725 #, c-format msgid "MRSET %zu Counted Value" msgstr "" #: src/data/sys-file-reader.c:763 #, c-format msgid "" "This system file does not indicate its own character encoding. Using " "default encoding %s. For best results, specify an encoding explicitly. Use " "SYSFILE INFO with ENCODING=\"DETECT\" to analyze the possible encodings." msgstr "" #: src/data/sys-file-reader.c:845 #, fuzzy, c-format #| msgid "File header claims %d variable positions but %d were read from file." msgid "File header claims %d variable positions but %zu were read from file." msgstr "" "Cabeçalho do arquivo requer %d posições de variáveis, mas %d foram lidas do " "arquivo." #: src/data/sys-file-reader.c:958 src/data/sys-file-reader.c:972 msgid "This is not an SPSS system file." msgstr "Este não é um arquivo de sistema do SPSS." #: src/data/sys-file-reader.c:1027 msgid "" "Compression bias is not the usual value of 100, or system file uses " "unrecognized floating-point format." msgstr "" #: src/data/sys-file-reader.c:1102 msgid "Variable label indicator field is not 0 or 1." msgstr "Campo indicador de rótulo de variável não é 0 ou 1." #: src/data/sys-file-reader.c:1115 msgid "Numeric missing value indicator field is not -3, -2, 0, 1, 2, or 3." msgstr "Campo de indicador de missing numérico não é -3, -3, 0, 1, 2 ou 3." #: src/data/sys-file-reader.c:1125 msgid "String missing value indicator field is not 0, 1, 2, or 3." msgstr "Campo de indicação de valores ausentes de string não é 0, 1, 2 ou 3." #: src/data/sys-file-reader.c:1152 #, fuzzy, c-format #| msgid "Invalid number of variables %d." msgid "Invalid number of labels %u." msgstr "Número de variáveis inválido: %d." #: src/data/sys-file-reader.c:1185 msgid "" "Variable index record (type 4) does not immediately follow value label " "record (type 3) as it should." msgstr "" "Índice do registro da variável (tipo 4) não foi seguido imediatamente por um " "registro de rótulo de valores (tipo 3) como deveria." #: src/data/sys-file-reader.c:1197 #, fuzzy, c-format #| msgid "" #| "Number of variables associated with a value label (%d) is not between 1 " #| "and the number of variables (%zu)." msgid "" "Number of variables associated with a value label (%u) is not between 1 and " "the number of variables (%zu)." msgstr "" "Número de variáveis associadas com um rótulo de valores (%d) não está entre " "1 e o número de variáveis (%zu)." #: src/data/sys-file-reader.c:1224 #, fuzzy, c-format #| msgid "Number of document lines (%d) must be greater than 0." msgid "Number of document lines (%d) must be greater than 0 and less than %d." msgstr "Número de linhas do documento (%d) precisa ser maior que 0." #: src/data/sys-file-reader.c:1317 #, c-format msgid "Record type 7, subtype %d has bad size %u (expected %d)." msgstr "" #: src/data/sys-file-reader.c:1321 #, c-format msgid "Record type 7, subtype %d has bad count %u (expected %d)." msgstr "" #: src/data/sys-file-reader.c:1435 #, fuzzy, c-format #| msgid "%s variable %s has invalid %s format %s." msgid "Renaming variable with invalid name `%s' to `%s'." msgstr "%s variável %s tem um inválido %s formato %s." #: src/data/sys-file-reader.c:1517 msgid "Missing string continuation record." msgstr "Faltando registro de continuação de string." #: src/data/sys-file-reader.c:1550 #, fuzzy, c-format #| msgid "String variable %s with width %d has invalid format specifier %s." msgid "Variable %s with width %d has invalid print format 0x%x." msgstr "" "Variável string %s com tamanho %d tem um especificador de formato inválido " "%s." #: src/data/sys-file-reader.c:1554 #, fuzzy, c-format #| msgid "String variable %s with width %d has invalid format specifier %s." msgid "Variable %s with width %d has invalid write format 0x%x." msgstr "" "Variável string %s com tamanho %d tem um especificador de formato inválido " "%s." #: src/data/sys-file-reader.c:1559 msgid "Suppressing further invalid format warnings." msgstr "Ocultando avisos de formato inválido subsequentes." #: src/data/sys-file-reader.c:1613 #, c-format msgid "" "Floating-point representation indicated by system file (%d) differs from " "expected (%d)." msgstr "" "Representação de ponto flutuante indicado pelo arquivo de sistema (%d) " "difere do esperado (%d)." #: src/data/sys-file-reader.c:1629 #, fuzzy, c-format #| msgid "" #| "Integer format indicated by system file (%s) differs from expected (%s)." msgid "" "Integer format indicated by system file (%d) differs from expected (%d)." msgstr "" "Formato inteiro indicado pelo arquivo de sistema (%s) difere do esperado " "(%s)." #: src/data/sys-file-reader.c:1647 src/data/sys-file-reader.c:1653 #, fuzzy, c-format msgid "File specifies unexpected value %g (%a) as %s, instead of %g (%a)." msgstr "Arquivo especifica valor inesperado %g como SYSMIS." #: src/data/sys-file-reader.c:1662 #, fuzzy, c-format msgid "" "File specifies unexpected value %g (%a) as %s, instead of %g (%a) or %g (%a)." msgstr "Arquivo especifica valor inesperado %g como SYSMIS." #: src/data/sys-file-reader.c:1714 src/data/sys-file-reader.c:1733 #, c-format msgid "Missing space following `%c' at offset %zu in MRSETS record." msgstr "" #: src/data/sys-file-reader.c:1741 #, c-format msgid "" "Missing label source value following `E' at offset %zu in MRSETS record." msgstr "" #: src/data/sys-file-reader.c:1748 #, c-format msgid "" "Unexpected label source value following `E' at offset %zu in MRSETS record." msgstr "" #: src/data/sys-file-reader.c:1755 #, c-format msgid "Missing `C', `D', or `E' at offset %zu in MRSETS record." msgstr "" #: src/data/sys-file-reader.c:1782 #, c-format msgid "Missing new-line parsing variable names at offset %zu in MRSETS record." msgstr "" #: src/data/sys-file-reader.c:1817 #, fuzzy, c-format #| msgid "Invalid variable name `%s'." msgid "Invalid multiple response set name `%s'." msgstr "Nome de variável '%s' inválido." #: src/data/sys-file-reader.c:1850 #, fuzzy, c-format #| msgid "%s is a duplicate variable name." msgid "MRSET %s contains duplicate variable name %s." msgstr "%s é um nome de variável duplicado." #: src/data/sys-file-reader.c:1865 #, c-format msgid "MRSET %s contains both string and numeric variables." msgstr "" #: src/data/sys-file-reader.c:1877 #, fuzzy, c-format #| msgid "File %s lacks BY variable %s." msgid "MRSET %s has no variables." msgstr "Arquivo %s não possui variável BY %s." #: src/data/sys-file-reader.c:1879 #, c-format msgid "MRSET %s has only one variable." msgstr "" #: src/data/sys-file-reader.c:1923 #, fuzzy, c-format #| msgid "Extension 11 has bad count %zu (for %zu variables)." msgid "Extension 11 has bad count %u (for %zu variables)." msgstr "Extensão 11 tem uma quantidade inválida %zu (para %zu variáveis)." #: src/data/sys-file-reader.c:1956 #, c-format msgid "" "Invalid variable display parameters for variable %zu (%s). Default " "parameters substituted." msgstr "" "Parâmetro de exibição de variáveis inválido para a variável %zu (%s). " "Parâmetros substituídos pelo padrão." #: src/data/sys-file-reader.c:2000 #, fuzzy, c-format #| msgid "Duplicate variable name %s." msgid "Duplicate long variable name `%s'." msgstr "Nome de variável %s duplicado." #: src/data/sys-file-reader.c:2053 #, c-format msgid "Long variable mapping from %s to invalid variable name `%s'." msgstr "Variável longa mapeando de %s para um nome de variável inválido '%s'." #: src/data/sys-file-reader.c:2088 #, fuzzy, c-format #| msgid "" #| "%s listed as string of invalid length %s in very length string record." msgid "%s listed as string of invalid length %s in very long string record." msgstr "" "%s listada como string de tamanho inválido %s em um registro de string muito " "longo." #: src/data/sys-file-reader.c:2099 #, c-format msgid "" "%s listed in very long string record with width %s, which requires only one " "segment." msgstr "" "%s listado em registro de string muito longa com comprimento %s, o que " "requer apenas um segmento." #: src/data/sys-file-reader.c:2107 #, c-format msgid "Very long string %s overflows dictionary." msgstr "String muito longa %s estoura dicionário." #: src/data/sys-file-reader.c:2125 #, fuzzy, c-format #| msgid "" #| "Very long string with width %ld has segment %d of width %d (expected %d)" msgid "" "Very long string with width %ld has segment %d of width %d (expected %d)." msgstr "" "String muito longa de tamanho %ld tem segmento %d de tamanho %d (esperado %d)" #: src/data/sys-file-reader.c:2183 #, fuzzy, c-format #| msgid "Variable index %d not in valid range 1...%d." msgid "Value label variable index %d not in valid range 1...%zu." msgstr "Índice de variável %d não está no intervalo válido de 1...%d." #: src/data/sys-file-reader.c:2193 #, fuzzy, c-format #| msgid "Variable index %d refers to long string continuation." msgid "Value label variable index %d refers to long string continuation." msgstr "Variável de índice %d se refere a uma continuação de uma string longa." #: src/data/sys-file-reader.c:2208 #, c-format msgid "" "Variables associated with value label are not all of identical type. " "Variable %s is %s, but variable %s is %s." msgstr "" "Variáveis associadas com rótulo de valores não são todas do mesmo tipo. " "Variável %s é %s, mas variável %s é %s." #: src/data/sys-file-reader.c:2226 #, fuzzy, c-format msgid "" "Value labels may not be added to long string variables (e.g. %s) using " "records types 3 and 4." msgstr "Rótulos de valores não são permitidos em variáveis string longas (%s)." #: src/data/sys-file-reader.c:2255 #, c-format msgid "Duplicate value label for %g on %s." msgstr "Rótulo de valores duplicados para %g em %s." #: src/data/sys-file-reader.c:2260 src/data/sys-file-reader.c:2600 #, fuzzy, c-format #| msgid "Duplicate value label for \"%.*s\" on %s." msgid "Duplicate value label for `%.*s' on %s." msgstr "Rótulo de valores duplicados para \"%.*s\" em %s." #: src/data/sys-file-reader.c:2283 #, fuzzy, c-format msgid "Suppressed %d additional warnings for value labels." msgstr "Ocultados %d avisos adicionais de mapeamento de variável." #: src/data/sys-file-reader.c:2297 #, fuzzy, c-format #| msgid "Variable index %d not in valid range 1...%d." msgid "" "Weight variable index %d not in valid range 1...%zu. Treating file as " "unweighted." msgstr "Índice de variável %d não está no intervalo válido de 1...%d." #: src/data/sys-file-reader.c:2307 #, fuzzy, c-format #| msgid "Variable index %d refers to long string continuation." msgid "" "Weight variable index %d refers to long string continuation. Treating file " "as unweighted." msgstr "Variável de índice %d se refere a uma continuação de uma string longa." #: src/data/sys-file-reader.c:2315 #, fuzzy, c-format #| msgid "Target variable %s duplicates existing variable %s." msgid "Ignoring string variable `%s' set as weighting variable." msgstr "Variável de destino %s duplica variável existente %s." #: src/data/sys-file-reader.c:2352 #, fuzzy, c-format #| msgid "Error reading file %s: %s." msgid "Error parsing attribute value %s[%d]." msgstr "Erro lendo arquivo %s: %s." #: src/data/sys-file-reader.c:2366 #, c-format msgid "Attribute value %s[%d] is not quoted: %s." msgstr "" #: src/data/sys-file-reader.c:2379 #, fuzzy, c-format #| msgid "Duplicate variable name %s." msgid "Duplicate attribute %s." msgstr "Nome de variável %s duplicado." #: src/data/sys-file-reader.c:2463 #, fuzzy, c-format #| msgid "Invalid number of variables %d." msgid "Invalid role for variable %s." msgstr "Número de variáveis inválido: %d." #: src/data/sys-file-reader.c:2472 #, fuzzy, c-format #| msgid "%s variable %s has invalid %s format %s." msgid "%zu other variables had invalid roles." msgstr "%s variável %s tem um inválido %s formato %s." #: src/data/sys-file-reader.c:2485 #, c-format msgid "Extension record subtype %d ends unexpectedly." msgstr "" #: src/data/sys-file-reader.c:2531 #, fuzzy, c-format msgid "Ignoring long string value label record for unknown variable %s." msgstr "Mapeamento de variável se refere a uma variável desconhecida %s." #: src/data/sys-file-reader.c:2536 #, fuzzy, c-format msgid "Ignoring long string value label record for numeric variable %s." msgstr "Mapeamento de variável se refere a uma variável desconhecida %s." #: src/data/sys-file-reader.c:2543 #, c-format msgid "" "Ignoring long string value label record for variable %s because the record's " "width (%d) does not match the variable's width (%d)." msgstr "" #: src/data/sys-file-reader.c:2573 #, c-format msgid "" "Ignoring long string value label %zu for variable %s, with width %d, that " "has bad value width %zu." msgstr "" #: src/data/sys-file-reader.c:2646 #, c-format msgid "" "Long string missing values record says variable %s has %d missing values, " "but only 1 to 3 missing values are allowed." msgstr "" #: src/data/sys-file-reader.c:2656 #, fuzzy, c-format msgid "Ignoring long string missing value record for unknown variable %s." msgstr "Mapeamento de variável se refere a uma variável desconhecida %s." #: src/data/sys-file-reader.c:2661 #, fuzzy, c-format msgid "Ignoring long string missing value record for numeric variable %s." msgstr "Mapeamento de variável se refere a uma variável desconhecida %s." #: src/data/sys-file-reader.c:2686 #, c-format msgid "" "Ignoring long string missing value %zu for variable %s, with width %d, that " "has bad value width %zu." msgstr "" #: src/data/sys-file-reader.c:2740 #, fuzzy #| msgid "File ends in partial case." msgid "File ends in partial string value." msgstr "Arquivo termina em um caso parcial." #: src/data/sys-file-reader.c:2879 msgid "" "Possible compressed data corruption: compressed spaces appear in numeric " "field." msgstr "" #: src/data/sys-file-reader.c:3030 #, fuzzy, c-format msgid "Suppressed %d additional related warnings." msgstr "Ocultados %d avisos adicionais de mapeamento de variável." #: src/data/sys-file-reader.c:3076 src/data/sys-file-reader.c:3093 #, fuzzy, c-format #| msgid "Variable map refers to unknown variable %s." msgid "Dictionary record refers to unknown variable %s." msgstr "Mapeamento de variável se refere a uma variável desconhecida %s." #: src/data/sys-file-reader.c:3159 #, c-format msgid "Expecting digit at offset %zu in MRSETS record." msgstr "" #: src/data/sys-file-reader.c:3167 #, c-format msgid "Expecting space at offset %zu in MRSETS record." msgstr "" #: src/data/sys-file-reader.c:3175 #, c-format msgid "%zu-byte string starting at offset %zu exceeds record length %zu." msgstr "" #: src/data/sys-file-reader.c:3185 #, c-format msgid "Expecting space at offset %zu following %zu-byte string." msgstr "" #: src/data/sys-file-reader.c:3476 #, c-format msgid "Wrong ZLIB data header offset %#llx (expected %#llx)." msgstr "" #: src/data/sys-file-reader.c:3484 #, c-format msgid "Impossible ZLIB trailer offset 0x%llx." msgstr "" #: src/data/sys-file-reader.c:3491 #, fuzzy, c-format #| msgid "Invalid variable width %d." msgid "Invalid ZLIB trailer length %lld." msgstr "Comprimento %d de variável inválido." #: src/data/sys-file-reader.c:3555 #, c-format msgid "End of ZLIB trailer (0x%llx) is not file size (0x%llx)." msgstr "" #: src/data/sys-file-reader.c:3565 #, c-format msgid "ZLIB trailer bias (%lld) differs from file header bias (%.2f)." msgstr "" #: src/data/sys-file-reader.c:3575 #, c-format msgid "ZLIB trailer \"zero\" field has nonzero value %lld." msgstr "" #: src/data/sys-file-reader.c:3581 #, fuzzy, c-format msgid "ZLIB trailer specifies unexpected %u-byte block size." msgstr "Arquivo especifica valor inesperado %g como SYSMIS." #: src/data/sys-file-reader.c:3589 #, c-format msgid "%lld-byte ZLIB trailer specifies %u data blocks (expected %lld)." msgstr "" #: src/data/sys-file-reader.c:3614 #, c-format msgid "" "ZLIB block descriptor %u reported uncompressed data offset %#llx, when %#llx " "was expected." msgstr "" #: src/data/sys-file-reader.c:3623 #, c-format msgid "" "ZLIB block descriptor %u reported compressed data offset %#llx, when %#llx " "was expected." msgstr "" #: src/data/sys-file-reader.c:3633 #, c-format msgid "" "ZLIB block descriptor %u reported block size %#x, when %#x was expected." msgstr "" #: src/data/sys-file-reader.c:3641 #, c-format msgid "" "ZLIB block descriptor %u reported block size %#x, when at most %#x was " "expected." msgstr "" #: src/data/sys-file-reader.c:3653 #, c-format msgid "" "ZLIB block descriptor %u reports compressed size %u and uncompressed size %u." msgstr "" #: src/data/sys-file-reader.c:3665 #, c-format msgid "" "ZLIB trailer is at offset %#llx but %#llx would be expected from block " "descriptors." msgstr "" #: src/data/sys-file-reader.c:3684 #, c-format msgid "ZLIB initialization failed (%s)." msgstr "" #: src/data/sys-file-reader.c:3699 #, c-format msgid "Inconsistency at end of ZLIB stream (%s)." msgstr "" #: src/data/sys-file-reader.c:3758 #, c-format msgid "ZLIB stream inconsistency (%s)." msgstr "" #: src/data/sys-file-reader.c:3782 #, fuzzy #| msgid "Unexpected end of file reading %s." msgid "Unexpected end of ZLIB compressed data." msgstr "Fim de arquivo não esperado lendo %s." #: src/data/sys-file-reader.c:3820 #, fuzzy #| msgid "System File" msgid "SPSS System File" msgstr "Arquivos de Sistema" #: src/data/sys-file-writer.c:210 #, c-format msgid "Unknown system file version %d. Treating as version %d." msgstr "" "Arquivo de sistema de versão %d desconhecido. Tratando-o como versão %d." #: src/data/sys-file-writer.c:256 #, fuzzy, c-format #| msgid "Error opening \"%s\" for writing as a system file: %s." msgid "Error opening `%s' for writing as a system file: %s." msgstr "Erro ao abrir \"%s\" para gravação como arquivo de sistema: %s." #: src/data/sys-file-writer.c:1271 #, fuzzy, c-format #| msgid "An I/O error occurred writing system file \"%s\"." msgid "An I/O error occurred writing system file `%s'." msgstr "Um erro de E/S ocorreu ao gravar arquivo de sistema \"%s\"." #: src/data/sys-file-writer.c:1378 #, c-format msgid "Failed to initialize ZLIB for compression (%s)." msgstr "" #: src/data/sys-file-writer.c:1407 #, c-format msgid "Failed to complete ZLIB stream compression (%s)." msgstr "" #: src/data/sys-file-writer.c:1449 #, c-format msgid "ZLIB stream compression failed (%s)." msgstr "" #: src/data/sys-file-writer.c:1491 #, fuzzy, c-format #| msgid "%s: Creating file: %s." msgid "%s: Seek failed (%s)." msgstr "%s: Criando arquivo: %s" #: src/data/variable.c:58 msgid "Left" msgstr "Esquerda" #: src/data/variable.c:59 msgid "Right" msgstr "Direita" #: src/data/variable.c:60 msgid "Center" msgstr "Centro" #: src/data/variable.c:66 msgid "Nominal" msgstr "Nominal" #: src/data/variable.c:67 msgid "Ordinal" msgstr "Ordinal" #: src/data/variable.c:68 src/language/stats/ks-one-sample.c:300 msgid "Scale" msgstr "Escalar" #: src/data/variable.c:74 msgid "Input" msgstr "" #. TRANSLATORS: This will be part of a filename. Please avoid whitespace. #: src/data/variable.c:75 src/output/spv/spv-writer.c:213 #: src/ui/gui/psppire-output-window.c:547 #, fuzzy #| msgid "Output%d" msgid "Output" msgstr "Saída%d" #: src/data/variable.c:76 msgid "Both" msgstr "" #: src/data/variable.c:77 src/language/dictionary/sys-file-info.c:237 #: src/ui/gui/psppire-dialog-action-crosstabs.c:86 #: src/ui/gui/psppire-dialog-action-crosstabs.c:98 #: src/ui/gui/psppire-dialog-action-crosstabs.c:133 #: src/ui/gui/psppire-dialog-action-crosstabs.c:141 #: src/ui/gui/psppire-variable-sheet.c:408 src/ui/gui/var-display.c:34 msgid "None" msgstr "Nenhum" #: src/data/variable.c:78 #, fuzzy #| msgid "Position" msgid "Partition" msgstr "Posição" #: src/data/variable.c:79 src/ui/gui/reliability.ui:37 #, fuzzy msgid "Split" msgstr "_Dividir" #: src/data/variable.c:729 #, fuzzy, c-format #| msgid "%s is %s (%s)." msgid "%s (%s)" msgstr "%s é %s (%s)." #: src/data/variable.c:1339 msgid "" "At least one case in the data file had a weight value that was user-missing, " "system-missing, zero, or negative. These case(s) were ignored." msgstr "" "Pelo menos um caso no arquivo de dados tinha um valor de ponderação que era " "user-missing, system-missing, zero ou negativo. Este(s) caso(s) foi(foram) " "ignorado(s)." #: src/language/command.c:207 src/language/stats/graph.c:749 #: src/language/stats/graph.c:755 src/language/stats/graph.c:789 #: src/language/stats/graph.c:794 src/language/stats/graph.c:799 #: src/language/stats/graph.c:852 src/language/stats/graph.c:857 #: src/language/stats/graph.c:862 src/language/stats/graph.c:867 #: src/language/stats/graph.c:872 src/language/stats/graph.c:877 #: src/language/stats/graph.c:882 src/language/utilities/set.q:236 #, c-format msgid "%s is not yet implemented." msgstr "" #: src/language/command.c:212 #, c-format msgid "%s may be used only in testing mode." msgstr "%s só pode ser utilizado no modo de teste." #: src/language/command.c:217 #, c-format msgid "%s may be used only in enhanced syntax mode." msgstr "%s só pode ser utilizado no modo de sintaxe otimizado." #: src/language/command.c:345 msgid "expecting command name" msgstr "esperando nome de comando" #: src/language/command.c:347 #, fuzzy, c-format #| msgid "Unknown command %s." msgid "Unknown command `%s'." msgstr "Comando %s desconhecido." #: src/language/command.c:380 #, fuzzy, c-format #| msgid "%s is allowed only before the active file has been defined." msgid "%s is allowed only before the active dataset has been defined." msgstr "%s é permitido somente após o arquivo ativo ser definido." #: src/language/command.c:384 #, fuzzy, c-format #| msgid "%s is allowed only after the active file has been defined." msgid "%s is allowed only after the active dataset has been defined." msgstr "%s é permitido somente antes do arquivo ativo ser definido." #: src/language/command.c:388 src/language/command.c:392 #, fuzzy, c-format #| msgid "%s is allowed only inside FILE TYPE." msgid "%s is allowed only inside %s." msgstr "%s é permitido apenas dentro de FILE TYPE." #: src/language/command.c:399 src/language/command.c:403 #, fuzzy, c-format #| msgid "" #| "%s is allowed only before the active file has been defined or inside FILE " #| "TYPE." msgid "" "%s is allowed only before the active dataset has been defined or inside %s." msgstr "" "%s é permitido apenas após o arquivo ativo ser definido, ou dentro de FILE " "TYPE." #: src/language/command.c:407 src/language/command.c:411 #, fuzzy, c-format #| msgid "" #| "%s is allowed only after the active file has been defined or inside FILE " #| "TYPE." msgid "" "%s is allowed only after the active dataset has been defined or inside %s." msgstr "" "%s é permitido apenas antes do arquivo ativo ser definido, ou dentro de FILE " "TYPE." #: src/language/command.c:415 #, fuzzy, c-format #| msgid "%s is allowed only inside INPUT PROGRAM or inside FILE TYPE." msgid "%s is allowed only inside %s or inside %s." msgstr "%s é permitido apenas dentro de INPUT PROGRAM ou FILE TYPE." #: src/language/command.c:421 #, fuzzy, c-format #| msgid "" #| "%s is allowed only after the active file has been defined, inside INPUT " #| "PROGRAM, or inside FILE TYPE." msgid "" "%s is allowed only after the active dataset has been defined, inside INPUT " "PROGRAM, or inside FILE TYPE." msgstr "" "%s é permitido apenas antes do arquivo ativo ser definido, dentro de INPUT " "PROGRAM, ou FILE TYPE." #: src/language/command.c:426 #, fuzzy, c-format #| msgid "" #| "%s is allowed only before the active file has been defined, inside INPUT " #| "PROGRAM, or inside FILE TYPE." msgid "" "%s is allowed only before the active dataset has been defined, inside INPUT " "PROGRAM, or inside FILE TYPE." msgstr "" "%s é permitido apenas após o arquivo ativo ser definido, dentro de INPUT " "PROGRAM, ou FILE TYPE." #: src/language/command.c:444 src/language/command.c:447 #, fuzzy, c-format #| msgid "%s is not allowed inside FILE TYPE." msgid "%s is not allowed inside %s." msgstr "%s não é permitido dentro de FILE TYPE." #: src/language/command.c:529 src/language/utilities/host.c:272 #: src/language/utilities/permissions.c:105 #, fuzzy, c-format #| msgid "This command not allowed when the SAFER option is set." msgid "This command not allowed when the %s option is set." msgstr "Este comando não é permitido quando a opção SAFER está ativa." #: src/language/command.c:545 #, c-format msgid "Error removing `%s': %s." msgstr "Erro removendo '%s' : %s." #: src/language/lexer/lexer.c:296 #, fuzzy, c-format #| msgid "expecting `%s'" msgid "expecting %s" msgstr "esperando '%s'" #: src/language/lexer/lexer.c:300 #, c-format msgid "expecting %s or %s" msgstr "esperando %s ou %s" #: src/language/lexer/lexer.c:304 #, fuzzy, c-format #| msgid "expecting %s or %s" msgid "expecting %s, %s, or %s" msgstr "esperando %s ou %s" #: src/language/lexer/lexer.c:309 #, fuzzy, c-format #| msgid "expecting %s or %s" msgid "expecting %s, %s, %s, or %s" msgstr "esperando %s ou %s" #: src/language/lexer/lexer.c:314 #, fuzzy, c-format #| msgid "expecting %s or %s" msgid "expecting %s, %s, %s, %s, or %s" msgstr "esperando %s ou %s" #: src/language/lexer/lexer.c:319 #, fuzzy, c-format #| msgid "expecting %s or %s" msgid "expecting %s, %s, %s, %s, %s, or %s" msgstr "esperando %s ou %s" #: src/language/lexer/lexer.c:325 #, fuzzy, c-format #| msgid "expecting %s or %s" msgid "expecting %s, %s, %s, %s, %s, %s, or %s" msgstr "esperando %s ou %s" #: src/language/lexer/lexer.c:331 #, c-format msgid "expecting %s, %s, %s, %s, %s, %s, %s, or %s" msgstr "" #: src/language/lexer/lexer.c:351 #, c-format msgid "Subcommand %s may only be specified once." msgstr "Subcomando %s só pode ser especificado uma vez." #: src/language/lexer/lexer.c:363 #, fuzzy, c-format #| msgid "Subcommand %s may only be specified once." msgid "Required subcommand %s was not specified." msgstr "Subcomando %s só pode ser especificado uma vez." #: src/language/lexer/lexer.c:371 #, fuzzy, c-format #| msgid "Subcommand %s may only be specified once." msgid "%s may only be specified once within subcommand %s" msgstr "Subcomando %s só pode ser especificado uma vez." #: src/language/lexer/lexer.c:380 #, c-format msgid "Required %s specification missing from %s subcommand" msgstr "" #: src/language/lexer/lexer.c:399 #, fuzzy #| msgid "Syntax error in date field." msgid "Syntax error at end of input" msgstr "Erro de sintaxe no campo de data." #: src/language/lexer/lexer.c:420 src/language/xforms/select-if.c:60 #: src/language/stats/autorecode.c:206 src/language/stats/npar.c:503 #: src/language/data-io/print-space.c:83 msgid "expecting end of command" msgstr "esperando fim do comando" #: src/language/lexer/lexer.c:631 msgid "expecting string" msgstr "esperando string" #: src/language/lexer/lexer.c:660 msgid "expecting integer" msgstr "esperando inteiro" #: src/language/lexer/lexer.c:673 msgid "expecting number" msgstr "esperando número" #: src/language/lexer/lexer.c:685 msgid "expecting identifier" msgstr "esperando identificador" #: src/language/lexer/lexer.c:1272 #, fuzzy #| msgid "expecting end of command" msgid "Syntax error at end of command" msgstr "esperando fim do comando" #: src/language/lexer/lexer.c:1281 #, fuzzy, c-format #| msgid "Syntax error at %s." msgid "Syntax error at `%s'" msgstr "Erro de sintaxe em %s." #: src/language/lexer/lexer.c:1284 #, fuzzy #| msgid "Syntax error at %s." msgid "Syntax error" msgstr "Erro de sintaxe em %s." #: src/language/lexer/lexer.c:1470 #, fuzzy, c-format #| msgid "" #| "String of %s digits has %zu characters, which is not a multiple of %d." msgid "String of hex digits has %d characters, which is not a multiple of 2" msgstr "String de %s dígitos tem %zu caracteres, o que não é múltiplo de %d." #: src/language/lexer/lexer.c:1477 #, fuzzy, c-format #| msgid "`%c' is not a valid %s digit." msgid "`%c' is not a valid hex digit" msgstr "'%c' não é um dígito %s válido." #: src/language/lexer/lexer.c:1482 #, c-format msgid "" "Unicode string contains %d bytes, which is not in the valid range of 1 to 8 " "bytes" msgstr "" #: src/language/lexer/lexer.c:1488 #, fuzzy, c-format #| msgid "`%c' is not a valid %s digit." msgid "U+%04X is not a valid Unicode code point" msgstr "'%c' não é um dígito %s válido." #: src/language/lexer/lexer.c:1493 #, fuzzy #| msgid "Unterminated string constant." msgid "Unterminated string constant" msgstr "Constante string não terminada." #: src/language/lexer/lexer.c:1497 #, fuzzy, c-format #| msgid "String expected following `+'." msgid "Missing exponent following `%s'" msgstr "String esperada seguindo '+'." #: src/language/lexer/lexer.c:1502 #, fuzzy #| msgid "expecting end of command" msgid "Unexpected `.' in middle of command" msgstr "esperando fim do comando" #: src/language/lexer/lexer.c:1508 #, fuzzy, c-format msgid "Bad character %s in input" msgstr "Caractere inválido na entrada: '%c'." #: src/language/lexer/lexer.c:1603 #, c-format msgid "Opening `%s': %s." msgstr "" #: src/language/lexer/lexer.c:1647 #, fuzzy, c-format #| msgid "Error removing `%s': %s." msgid "Error closing `%s': %s." msgstr "Erro removendo '%s' : %s." #: src/language/lexer/subcommand-list.c:118 #, c-format msgid "No more than %d %s subcommands allowed." msgstr "" #: src/language/lexer/format-parser.c:77 msgid "expecting valid format specifier" msgstr "esperando especificador de formato válido" #: src/language/lexer/format-parser.c:116 #: src/language/lexer/format-parser.c:143 src/language/utilities/output.c:108 #: src/language/data-io/data-list.c:453 src/language/data-io/get-data.c:638 #: src/language/data-io/placement-parser.c:236 #, fuzzy, c-format #| msgid "Unknown format type \"%s\"." msgid "Unknown format type `%s'." msgstr "Tipo de formato \"%s\" desconhecido." #: src/language/lexer/format-parser.c:122 #, c-format msgid "Format specifier `%s' lacks required width." msgstr "" #: src/language/lexer/format-parser.c:138 msgid "expecting format type" msgstr "esperando formato de tipo" #: src/language/lexer/value-parser.c:66 #, fuzzy, c-format #| msgid "" #| "Low end of range (%g) is below high end (%g). The range will be treated " #| "as reversed." msgid "" "The high end of the range (%.*g) is below the low end (%.*g). The range " "will be treated as if reversed." msgstr "" "Limite inferior do intervalo (%g) é maior que o limite superior (%g). O " "intervalo será invertido." #: src/language/lexer/value-parser.c:74 #, fuzzy, c-format #| msgid "Ends of range are equal (%g)." msgid "Ends of range are equal (%.*g)." msgstr "Limites do intervalo são iguais (%g)." #: src/language/lexer/value-parser.c:82 #, fuzzy, c-format #| msgid "LO or LOWEST must be part of a range." msgid "%s or %s must be part of a range." msgstr "LO ou LOWEST deve ser parte do intervalo." #: src/language/lexer/value-parser.c:112 msgid "System-missing value is not valid here." msgstr "Valor system-missing não é válido aqui." #: src/language/lexer/variable-parser.c:86 utilities/pspp-convert.c:83 msgid "expecting variable name" msgstr "esperando nome de variável" #: src/language/lexer/variable-parser.c:96 #, c-format msgid "%s is not a variable name." msgstr "%s não é um nome válido." #: src/language/lexer/variable-parser.c:206 #, c-format msgid "" "%s is not a numeric variable. It will not be included in the variable list." msgstr "" "%s não é uma variável válida. Ela não será incluída na lista de variáveis." #: src/language/lexer/variable-parser.c:209 #, c-format msgid "" "%s is not a string variable. It will not be included in the variable list." msgstr "" "%s não é uma variável string. Ela não será incluída na lista de variáveis." #: src/language/lexer/variable-parser.c:213 #, c-format msgid "Scratch variables (such as %s) are not allowed here." msgstr "Variáveis rascunho (como %s) não são permitidas aqui." #: src/language/lexer/variable-parser.c:217 #, c-format msgid "" "%s and %s are not the same type. All variables in this variable list must " "be of the same type. %s will be omitted from the list." msgstr "" "%s e %s não são do mesmo tipo. Todas as variáveis nesta lista devem ser do " "mesmo tipo. %s será omitida da lista." #: src/language/lexer/variable-parser.c:223 #, c-format msgid "" "%s and %s are string variables with different widths. All variables in this " "variable list must have the same width. %s will be omitted from the list." msgstr "" "%s e %s são variáveis strings de tamanho diferente. Todas as variáveis nesta " "lista devem ter o mesmo tamanho. %s será omitida da lista." #: src/language/lexer/variable-parser.c:228 #: src/language/lexer/variable-parser.c:447 #, c-format msgid "Variable %s appears twice in variable list." msgstr "Variável %s apareceu duas vezes na lista de variáveis." #: src/language/lexer/variable-parser.c:341 #, c-format msgid "%s TO %s is not valid syntax since %s precedes %s in the dictionary." msgstr "%s TO %s não é uma sintaxe válida pois %s precede %s no dicionário." #: src/language/lexer/variable-parser.c:349 #, c-format msgid "" "When using the TO keyword to specify several variables, both variables must " "be from the same variable dictionaries, of either ordinary, scratch, or " "system variables. %s is a %s variable, whereas %s is %s." msgstr "" "Ao usar a palavra-chave TO para especificar várias variáveis, ambas devem " "ser do mesmo dicionário de variáveis, ordinárias, rascunho ou variáveis de " "sistema. %s é uma variável %s, enquanto %s é %s." #: src/language/lexer/variable-parser.c:424 #, fuzzy, c-format #| msgid "" #| "`%s' may not be used as a variable name because it is a reserved word." msgid "`%s' cannot be used with TO because it does not end in a digit." msgstr "" "'%s' não pode ser usada como nome de variável por ser uma palavra reservada." #: src/language/lexer/variable-parser.c:432 #, c-format msgid "Numeric suffix on `%s' is larger than supported with TO." msgstr "" #: src/language/lexer/variable-parser.c:505 msgid "Scratch variables not allowed here." msgstr "Variáveis rascunho não permitidas aqui." #: src/language/lexer/variable-parser.c:529 msgid "Prefixes don't match in use of TO convention." msgstr "Prefixos não coincidem no uso da convenção TO." #: src/language/lexer/variable-parser.c:534 msgid "Bad bounds in use of TO convention." msgstr "Intervalos incorretos no uso da convenção TO." #: src/language/xforms/compute.c:150 src/language/xforms/compute.c:205 #, c-format msgid "" "When executing COMPUTE: SYSMIS is not a valid value as an index into vector " "%s." msgstr "" #: src/language/xforms/compute.c:154 src/language/xforms/compute.c:212 #, c-format msgid "" "When executing COMPUTE: %.*g is not a valid value as an index into vector %s." msgstr "" #: src/language/xforms/compute.c:356 #, c-format msgid "There is no vector named %s." msgstr "Não existe vetor de nome %s." #: src/language/xforms/count.c:125 msgid "Destination cannot be a string variable." msgstr "Destino não pode ser uma variável string." #: src/language/xforms/sample.c:76 msgid "The sampling factor must be between 0 and 1 exclusive." msgstr "" #: src/language/xforms/sample.c:96 #, c-format msgid "Cannot sample %d observations from a population of %d." msgstr "" #: src/language/xforms/recode.c:261 msgid "" "Inconsistent target variable types. Target variables must be all numeric or " "all string." msgstr "" #: src/language/xforms/recode.c:282 msgid "CONVERT requires string input values and numeric output values." msgstr "" #: src/language/xforms/recode.c:339 #, fuzzy, c-format #| msgid "THRU is not allowed with string variables." msgid "%s is not allowed with string variables." msgstr "THRU não é permitido com variáveis string." #: src/language/xforms/recode.c:422 msgid "expecting output value" msgstr "" #: src/language/xforms/recode.c:479 #, c-format msgid "" "%zu variable(s) cannot be recoded into %zu variable(s). Specify the same " "number of variables as source and target variables." msgstr "" #: src/language/xforms/recode.c:494 #, c-format msgid "" "There is no variable named %s. (All string variables specified on INTO must " "already exist. Use the STRING command to create a string variable.)" msgstr "" "Não existe variável de nome %s. (Todas as variáveis strings especificadas em " "INTO devem existir previamente. Use o comando STRING para criar uma " "variável string.)" #: src/language/xforms/recode.c:510 #, c-format msgid "INTO is required with %s input values and %s output values." msgstr "" #: src/language/xforms/recode.c:523 #, c-format msgid "Type mismatch. Cannot store %s data in %s variable %s." msgstr "" #: src/language/xforms/recode.c:566 #, c-format msgid "" "Cannot recode because the variable %s would require a width of %d bytes or " "greater, but it has a width of only %d bytes." msgstr "" #: src/language/xforms/select-if.c:100 msgid "Syntax error expecting OFF or BY. Turning off case filtering." msgstr "" #: src/language/xforms/select-if.c:115 msgid "The filter variable must be numeric." msgstr "" #: src/language/xforms/select-if.c:121 msgid "The filter variable may not be scratch." msgstr "" #: src/language/control/control-stack.c:49 #, c-format msgid "%s without %s." msgstr "%s sem %s." #: src/language/control/control-stack.c:77 #, c-format msgid "This command must appear inside %s...%s, without intermediate %s...%s." msgstr "" "Este comando deve aparecer dentro de %s...%s sem %s...%s intermediário." #: src/language/control/control-stack.c:94 #, c-format msgid "This command cannot appear outside %s...%s." msgstr "Este comando não pode aparecer fora de %s...%s." #: src/language/control/do-if.c:180 #, fuzzy, c-format #| msgid "This command may not follow ELSE in DO IF...END IF." msgid "This command may not follow %s in %s ... %s." msgstr "Este comando não pode seguir ELSE em um DO IF...END IF." #: src/language/control/loop.c:211 msgid "Only one index clause may be specified." msgstr "Apenas um índice de cláusula pode ser especificado." #: src/language/control/repeat.c:120 #, fuzzy, c-format #| msgid "Dummy variable name \"%s\" hides dictionary variable \"%s\"." msgid "Dummy variable name `%s' hides dictionary variable `%s'." msgstr "Nome de variável dummy \"%s\" oculta variável de dicionário \"%s\"." #: src/language/control/repeat.c:126 #, fuzzy, c-format #| msgid "Dummy variable name \"%s\" is given twice." msgid "Dummy variable name `%s' is given twice." msgstr "Variável dummy de nome \"%s\" foi informada duas vezes." #: src/language/control/repeat.c:170 #, fuzzy, c-format #| msgid "" #| "Dummy variable \"%.*s\" had %d substitutions, so \"%.*s\" must also, but " #| "%d were specified." msgid "" "Dummy variable `%s' had %zu substitutions, so `%s' must also, but %zu were " "specified." msgstr "" "Variável dummy \"%.*s\" tinha %d substituições, portanto \"%.*s\"também " "deveria ter, porém %d foram especificadas." #: src/language/control/repeat.c:379 #, fuzzy #| msgid "Ranges may only have integer bounds" msgid "Ranges may only have integer bounds." msgstr "Intervalos podem ter somente intervalos inteiros" #: src/language/control/repeat.c:393 #, fuzzy, c-format #| msgid "%g TO %g is an invalid range." msgid "%ld TO %ld is an invalid range." msgstr "%g TO %g é um intervalo inválido." #: src/language/control/repeat.c:443 #, fuzzy, c-format #| msgid "No matching DO REPEAT." msgid "No matching %s." msgstr "DO REPEAT não coincidindo." #: src/language/control/temporary.c:44 msgid "" "This command may only appear once between procedures and procedure-like " "commands." msgstr "" #: src/language/dictionary/attributes.c:104 #, fuzzy msgid "Attribute array index must be between 1 and 65535." msgstr "Dia (%ld) deve estar entre 1 e 31." #: src/language/dictionary/apply-dictionary.c:74 #, c-format msgid "Variable %s is %s in target file, but %s in source file." msgstr "Variável %s é %s no arquivo de destino, mas %s no arquivo de origem." #: src/language/dictionary/apply-dictionary.c:110 msgid "No matching variables found between the source and target files." msgstr "" "Nenhuma coincidência de variáveis encontrada entre os arquivos de origem e " "destino." #: src/language/dictionary/delete-variables.c:40 #: src/language/dictionary/modify-variables.c:79 #: src/language/dictionary/rename-variables.c:51 #, fuzzy, c-format #| msgid "" #| "FLIP ignores TEMPORARY. Temporary transformations will be made permanent." msgid "" "%s may not be used after %s. Temporary transformations will be made " "permanent." msgstr "" "FLIP ignora TEMPORARY. Transformações temporárias serão feitas permanentes." #: src/language/dictionary/delete-variables.c:48 #: src/language/dictionary/modify-variables.c:312 #, c-format msgid "" "%s may not be used to delete all variables from the active dataset " "dictionary. Use %s instead." msgstr "" #: src/language/dictionary/missing-values.c:70 #, c-format msgid "" "Cannot mix numeric variables (e.g. %s) and string variables (e.g. %s) within " "a single list." msgstr "" "Não é possível misturar variáveis numéricas (e.g. %s) e strings (e.g. %s) " "dentro de uma única lista." #: src/language/dictionary/missing-values.c:91 msgid "" "Too many numeric missing values. At most three individual values or one " "value and one range are allowed." msgstr "" #: src/language/dictionary/missing-values.c:126 #, c-format msgid "Truncating missing value to maximum acceptable length (%d bytes)." msgstr "" #: src/language/dictionary/missing-values.c:137 msgid "" "Too many string missing values. At most three individual values are allowed." msgstr "" #: src/language/dictionary/missing-values.c:154 #, c-format msgid "Missing values provided are too long to assign to variable of width %d." msgstr "" #: src/language/dictionary/modify-variables.c:145 msgid "Cannot specify ALL after specifying a set of variables." msgstr "" #: src/language/dictionary/modify-variables.c:221 #: src/language/dictionary/rename-variables.c:76 #, c-format msgid "" "Differing number of variables in old name list (%zu) and in new name list " "(%zu)." msgstr "" #: src/language/dictionary/modify-variables.c:244 #: src/language/dictionary/modify-variables.c:294 #, c-format msgid "" "%s subcommand may be given at most once. It may not be given in conjunction " "with the %s subcommand." msgstr "" #: src/language/dictionary/modify-variables.c:331 #, c-format msgid "Unrecognized subcommand name `%s'." msgstr "Subcomando de nome '%s' não reconhecido." #: src/language/dictionary/modify-variables.c:334 msgid "Subcommand name expected." msgstr "Nome de Subcomando esperado." #: src/language/dictionary/mrsets.c:117 #, c-format msgid "" "VARIABLES specified only variable %s on %s, but at least two variables are " "required." msgstr "" #: src/language/dictionary/mrsets.c:150 msgid "Numeric VALUE must be an integer." msgstr "" #: src/language/dictionary/mrsets.c:230 src/language/dictionary/mrsets.c:268 #, c-format msgid "" "MDGROUP subcommand for group %s specifies a string VALUE, but the variables " "specified for this group are numeric." msgstr "" #: src/language/dictionary/mrsets.c:254 #, c-format msgid "" "VALUE string on MDGROUP subcommand for group %s is %d bytes long, but it " "must be no longer than the narrowest variable in the group, which is %s with " "a width of %d bytes." msgstr "" #: src/language/dictionary/mrsets.c:280 #, c-format msgid "" "MDGROUP subcommand for group %s specifies LABELSOURCE=VARLABEL but not " "CATEGORYLABELS=COUNTEDVALUES. Ignoring LABELSOURCE." msgstr "" #: src/language/dictionary/mrsets.c:286 #, c-format msgid "" "MDGROUP subcommand for group %s specifies both LABEL and LABELSOURCE, but " "only one of these subcommands may be used at a time. Ignoring LABELSOURCE." msgstr "" #: src/language/dictionary/mrsets.c:326 #, c-format msgid "" "Variables %s and %s specified as part of multiple dichotomy group %s have " "the same variable label. Categories represented by these variables will not " "be distinguishable in output." msgstr "" #: src/language/dictionary/mrsets.c:356 #, c-format msgid "" "Variable %s specified as part of multiple dichotomy group %s (which has " "CATEGORYLABELS=COUNTEDVALUES) has no value label for its counted value. " "This category will not be distinguishable in output." msgstr "" #: src/language/dictionary/mrsets.c:369 #, c-format msgid "" "Variables %s and %s specified as part of multiple dichotomy group %s (which " "has CATEGORYLABELS=COUNTEDVALUES) have the same value label for the group's " "counted value. These categories will not be distinguishable in output." msgstr "" #: src/language/dictionary/mrsets.c:426 #, c-format msgid "" "Variables specified on MCGROUP should have the same categories, but %s and " "%s (and possibly others) in multiple category group %s have different value " "labels for value %s." msgstr "" #: src/language/dictionary/mrsets.c:484 #, fuzzy, c-format #| msgid "No function or vector named %s." msgid "No multiple response set named %s." msgstr "Nenhuma função ou vetor de nome %s." #: src/language/dictionary/mrsets.c:533 #, fuzzy #| msgid "The active file dictionary does not contain any documents." msgid "" "The active dataset dictionary does not contain any multiple response sets." msgstr "O arquivo de dicionário ativo não contém nenhum documento." #: src/language/dictionary/mrsets.c:540 msgid "Multiple Response Sets" msgstr "" #: src/language/dictionary/mrsets.c:543 #: src/language/dictionary/sys-file-info.c:446 #: src/language/dictionary/sys-file-info.c:733 #: src/language/stats/autorecode.c:375 src/language/data-io/data-parser.c:679 #: src/language/data-io/data-parser.c:725 src/language/data-io/print.c:434 msgid "Attributes" msgstr "" #: src/language/dictionary/mrsets.c:544 #: src/language/dictionary/sys-file-info.c:191 #: src/language/dictionary/sys-file-info.c:301 #: src/language/dictionary/sys-file-info.c:302 #: src/language/dictionary/sys-file-info.c:455 #: src/language/dictionary/sys-file-info.c:570 #: src/ui/gui/psppire-var-sheet-header.c:67 src/ui/gui/compute.ui:157 msgid "Label" msgstr "Label" #: src/language/dictionary/mrsets.c:544 #: src/language/dictionary/sys-file-info.c:241 msgid "Encoding" msgstr "" #: src/language/dictionary/mrsets.c:544 #, fuzzy #| msgid "Old Value" msgid "Counted Value" msgstr "Valores Antigos" #: src/language/dictionary/mrsets.c:544 #, fuzzy #| msgid "Cl_ear Variables" msgid "Member Variables" msgstr "Limpar Variáv_eis" #: src/language/dictionary/mrsets.c:547 #: src/language/dictionary/sys-file-info.c:470 #: src/ui/gui/psppire-var-sheet-header.c:55 msgid "Name" msgstr "Nome" #: src/language/dictionary/mrsets.c:564 msgid "Dichotomies" msgstr "" #: src/language/dictionary/mrsets.c:565 src/language/stats/logistic.c:1391 #, fuzzy #| msgid "Category" msgid "Categories" msgstr "Categoria" #: src/language/dictionary/numeric.c:67 #, c-format msgid "Format type %s may not be used with a numeric variable." msgstr "Formato tipo %s não pode ser usado com uma variável numérica." #: src/language/dictionary/numeric.c:86 src/language/dictionary/numeric.c:153 #, c-format msgid "There is already a variable named %s." msgstr "Já existe uma variável de nome %s." #: src/language/dictionary/numeric.c:138 #, c-format msgid "Format type %s may not be used with a string variable." msgstr "Formato tipo %s não pode ser usado como uma variável string." #: src/language/dictionary/rename-variables.c:92 #, c-format msgid "Renaming would duplicate variable name %s." msgstr "" #: src/language/dictionary/split-file.c:75 #, fuzzy #| msgid "Split File" msgid "Split Values" msgstr "Dividir Arquivo" #: src/language/dictionary/split-file.c:76 #: src/language/dictionary/split-file.c:77 #: src/language/dictionary/sys-file-info.c:696 #: src/language/stats/chisquare.c:195 src/language/stats/cochran.c:156 #: src/language/stats/cochran.c:185 src/language/stats/examine.c:841 #: src/language/stats/reliability.c:648 src/language/stats/reliability.c:651 #: src/language/stats/crosstabs.q:1303 src/language/stats/crosstabs.q:1325 #: src/language/stats/crosstabs.q:1365 src/language/stats/crosstabs.q:1412 msgid "Value" msgstr "Valor" #: src/language/dictionary/split-file.c:79 #: src/language/dictionary/sys-file-info.c:734 #: src/language/stats/chisquare.c:246 src/language/stats/chisquare.c:328 #: src/language/stats/cochran.c:164 src/language/stats/correlations.c:100 #: src/language/stats/descriptives.c:1004 src/language/stats/friedman.c:226 #: src/language/stats/jonckheere-terpstra.c:377 #: src/language/stats/npar-summary.c:113 src/language/stats/quick-cluster.c:588 #: src/language/stats/runs.c:331 src/language/data-io/data-parser.c:683 #: src/language/data-io/data-parser.c:728 src/language/data-io/print.c:438 #: src/ui/gui/psppire-dictview.c:580 src/ui/gui/psppire-data-editor.c:502 msgid "Variable" msgstr "Variável" #: src/language/dictionary/sys-file-info.c:184 #, fuzzy #| msgid "Variable Information:" msgid "File Information" msgstr "Informação da Variável:" #: src/language/dictionary/sys-file-info.c:185 msgid "Attribute" msgstr "" #: src/language/dictionary/sys-file-info.c:187 #, fuzzy #| msgid "File:" msgid "File" msgstr "Arquivo:" #: src/language/dictionary/sys-file-info.c:194 #, fuzzy #| msgid "Created:" msgid "Created" msgstr "Criado:" #: src/language/dictionary/sys-file-info.c:203 #, fuzzy #| msgid "Integer Format:" msgid "Integer Format" msgstr "Formato inteiro:" #: src/language/dictionary/sys-file-info.c:205 #, fuzzy #| msgid "Big Endian." msgid "Big Endian" msgstr "Big Endian." #: src/language/dictionary/sys-file-info.c:206 #, fuzzy #| msgid "Little Endian." msgid "Little Endian" msgstr "Little Endian." #: src/language/dictionary/sys-file-info.c:207 #: src/language/dictionary/sys-file-info.c:216 #: src/language/dictionary/sys-file-info.c:223 src/language/utilities/set.q:930 msgid "Unknown" msgstr "Desconhecido" #: src/language/dictionary/sys-file-info.c:209 #, fuzzy #| msgid "Real Format:" msgid "Real Format" msgstr "Formato Real:" #: src/language/dictionary/sys-file-info.c:211 msgid "IEEE 754 LE." msgstr "IEEE 754 LE." #: src/language/dictionary/sys-file-info.c:212 msgid "IEEE 754 BE." msgstr "IEE 754 BE." #: src/language/dictionary/sys-file-info.c:213 msgid "VAX D." msgstr "VAX D." #: src/language/dictionary/sys-file-info.c:214 msgid "VAX G." msgstr "VAX G." #: src/language/dictionary/sys-file-info.c:215 msgid "IBM 390 Hex Long." msgstr "IBM 390 Hex Long." #: src/language/dictionary/sys-file-info.c:218 #: src/language/dictionary/sys-file-info.c:443 #: src/language/stats/binomial.c:199 src/language/stats/correlations.c:131 #: src/language/stats/correlations.c:159 src/language/stats/descriptives.c:585 #: src/language/stats/factor.c:1658 src/language/stats/factor.c:1701 #: src/language/stats/factor.c:1860 src/language/stats/factor.c:2074 #: src/language/stats/frequencies.c:1583 #: src/language/stats/kruskal-wallis.c:254 #: src/language/stats/kruskal-wallis.c:303 #: src/language/stats/ks-one-sample.c:316 src/language/stats/logistic.c:1187 #: src/language/stats/mann-whitney.c:254 src/language/stats/means.c:718 #: src/language/stats/means.c:800 src/language/stats/median.c:358 #: src/language/stats/oneway.c:985 src/language/stats/oneway.c:1157 #: src/language/stats/reliability.c:591 src/language/stats/regression.c:924 #: src/language/stats/t-test-one-sample.c:132 #: src/language/stats/t-test-paired.c:157 src/language/data-io/list.c:104 #: src/ui/gui/variable-info.ui:25 msgid "Variables" msgstr "Variáveis" #: src/language/dictionary/sys-file-info.c:221 src/language/stats/examine.c:929 #: src/language/stats/means.c:697 src/language/stats/reliability.c:548 #: src/language/stats/crosstabs.q:930 msgid "Cases" msgstr "Casos" #: src/language/dictionary/sys-file-info.c:226 src/language/stats/oneway.c:980 #: src/ui/gui/psppire-var-sheet-header.c:58 src/ui/gui/compute.ui:303 msgid "Type" msgstr "Tipo" #: src/language/dictionary/sys-file-info.c:230 #, fuzzy #| msgid "Weight:" msgid "Weight" msgstr "Peso:" #: src/language/dictionary/sys-file-info.c:233 #, fuzzy #| msgid "Not weighted." msgid "Not weighted" msgstr "Sem ponderação." #: src/language/dictionary/sys-file-info.c:235 #, fuzzy #| msgid "Compression %s." msgid "Compression" msgstr "Compressão %s." #: src/language/dictionary/sys-file-info.c:245 #: src/language/dictionary/sys-file-info.c:424 #: src/language/dictionary/sys-file-info.c:426 #, fuzzy #| msgid "Comments:" msgid "Documents" msgstr "Comentários:" #: src/language/dictionary/sys-file-info.c:305 #: src/language/dictionary/sys-file-info.c:430 msgid "(none)" msgstr "" #: src/language/dictionary/sys-file-info.c:393 msgid "No variables to display." msgstr "Nenhuma variável para exibir." #: src/language/dictionary/sys-file-info.c:404 msgid "Macros not supported." msgstr "Macros não suportadas." #: src/language/dictionary/sys-file-info.c:426 msgid "Document" msgstr "" #: src/language/dictionary/sys-file-info.c:454 msgid "Position" msgstr "Posição" #: src/language/dictionary/sys-file-info.c:456 #, fuzzy #| msgid "Measurement Level: %s\n" msgid "Measurement Level" msgstr "Nível de medida: %s\n" #: src/language/dictionary/sys-file-info.c:457 #: src/ui/gui/psppire-var-sheet-header.c:85 msgid "Role" msgstr "" #: src/language/dictionary/sys-file-info.c:458 #: src/ui/gui/psppire-var-sheet-header.c:61 src/ui/gui/compute.ui:215 msgid "Width" msgstr "Tamanho" #: src/language/dictionary/sys-file-info.c:459 #, fuzzy #| msgid "Align" msgid "Alignment" msgstr "Alinhamento" #: src/language/dictionary/sys-file-info.c:460 #: src/language/dictionary/sys-file-info.c:734 msgid "Print Format" msgstr "Formato de Impressão" #: src/language/dictionary/sys-file-info.c:461 #, fuzzy #| msgid "Write Format: %s" msgid "Write Format" msgstr "Formato de Escrita: %s" #: src/language/dictionary/sys-file-info.c:462 #: src/ui/gui/missing-val-dialog.c:379 src/ui/gui/psppire-var-sheet-header.c:73 #: src/ui/gui/examine.ui:416 src/ui/gui/t-test.ui:105 msgid "Missing Values" msgstr "Missing Values" #: src/language/dictionary/sys-file-info.c:567 #: src/ui/gui/psppire-var-sheet-header.c:70 src/ui/gui/val-labs-dialog.c:489 #: src/ui/gui/val-labs-dialog.ui:194 msgid "Value Labels" msgstr "Value Labels" #: src/language/dictionary/sys-file-info.c:573 #, fuzzy #| msgid "Variable View" msgid "Variable Value" msgstr "Visualização de variáveis" #: src/language/dictionary/sys-file-info.c:577 #, fuzzy #| msgid "_No missing values" msgid "User-missing value" msgstr "Sem missi_ng values" #: src/language/dictionary/sys-file-info.c:693 #, fuzzy msgid "Variable and Dataset Attributes" msgstr "Variáveis" #: src/language/dictionary/sys-file-info.c:699 #, fuzzy msgid "Variable and Name" msgstr "Variáveis" #: src/language/dictionary/sys-file-info.c:702 msgid "(dataset)" msgstr "" #: src/language/dictionary/sys-file-info.c:722 msgid "No vectors defined." msgstr "Vetor não definido." #: src/language/dictionary/sys-file-info.c:732 #, fuzzy #| msgid "Vector" msgid "Vectors" msgstr "Vetor" #: src/language/dictionary/sys-file-info.c:736 msgid "Vector and Position" msgstr "" #: src/language/dictionary/sys-file-info.c:998 msgid "No valid encodings found." msgstr "" #: src/language/dictionary/sys-file-info.c:1004 #, fuzzy, c-format #| msgid "expecting %s or %s" msgid "Usable encodings for %s." msgstr "esperando %s ou %s" #: src/language/dictionary/sys-file-info.c:1007 #, c-format msgid "" "Encodings that can successfully read %s (by specifying the encoding name on " "the GET command's ENCODING subcommand). Encodings that yield identical text " "are listed together." msgstr "" #: src/language/dictionary/sys-file-info.c:1012 #: src/language/dictionary/sys-file-info.c:1013 msgid "Encodings" msgstr "" #: src/language/dictionary/sys-file-info.c:1042 #, c-format msgid "%s Encoded Text Strings" msgstr "" #: src/language/dictionary/sys-file-info.c:1046 msgid "" "Text strings in the file dictionary that the previously listed encodings " "interpret differently, along with the interpretations." msgstr "" #: src/language/dictionary/sys-file-info.c:1049 src/output/text-item.c:57 #: src/ui/gui/psppire-import-assistant.c:885 msgid "Text" msgstr "" #: src/language/dictionary/sys-file-info.c:1059 msgid "Purpose" msgstr "" #: src/language/dictionary/value-labels.c:154 #, fuzzy, c-format #| msgid "Truncating value label to 60 characters." msgid "Truncating value label to %d bytes." msgstr "Truncando rótulo de valores para 60 caracteres." #: src/language/dictionary/vector.c:66 #, c-format msgid "A vector named %s already exists." msgstr "Um vetor chamado %s já existe." #: src/language/dictionary/vector.c:74 #, c-format msgid "Vector name %s is given twice." msgstr "O nome do vetor %s foi informado duas vezes" #: src/language/dictionary/vector.c:98 msgid "A slash must separate each vector specification in VECTOR's long form." msgstr "" "Uma barra deve separar cada especificação de vetor na forma longa de VECTOR." #: src/language/dictionary/vector.c:131 msgid "Vectors must have at least one element." msgstr "Vetores devem ter pelo menos um elemento." #: src/language/dictionary/vector.c:151 msgid "expecting vector length" msgstr "esperando tamanho do vetor" #: src/language/dictionary/vector.c:170 #, c-format msgid "%s is an existing variable name." msgstr "%s é um nome de variável existente." #: src/language/dictionary/variable-display.c:121 msgid "Variable display width must be a positive integer." msgstr "" #: src/language/dictionary/weight.c:49 msgid "The weighting variable must be numeric." msgstr "A variável de ponderação deve ser numérica." #: src/language/dictionary/weight.c:54 msgid "The weighting variable may not be scratch." msgstr "A variável de ponderação não deve ser rascunho." #: src/language/tests/moments-test.c:50 msgid "expecting weight value" msgstr "esperando valor de ponderação" #: src/language/utilities/cd.c:45 src/language/utilities/include.c:173 #, fuzzy, c-format #| msgid "Cannot change directory to %s: %s " msgid "Cannot change directory to %s: %s" msgstr "Não é possível mudar diretório para %s: %s" #: src/language/utilities/date.c:33 #, fuzzy, c-format #| msgid "%s is not implemented." msgid "Only %s is currently implemented." msgstr "%s não está implementado." #: src/language/utilities/host.c:60 #, fuzzy #| msgid "Command shell not supported on this platform." msgid "Time limit not supported on this platform." msgstr "Shell de comando não é suportado nesta plataforma." #: src/language/utilities/host.c:74 #, c-format msgid "%s: Command exited with status %d." msgstr "" #: src/language/utilities/host.c:95 #, fuzzy, c-format #| msgid "failed to create temporary file" msgid "Failed to create temporary file (%s)." msgstr "falha ao criar arquivo temporário." #: src/language/utilities/host.c:102 #, c-format msgid "/dev/null: Failed to open (%s)." msgstr "" #: src/language/utilities/host.c:117 #, c-format msgid "Couldn't fork: %s." msgstr "Impossível criar fork: %s." #: src/language/utilities/host.c:193 #, c-format msgid "While running \"%s\", waiting for child process failed (%s)." msgstr "" #: src/language/utilities/host.c:203 #, c-format msgid "Command \"%s\" timed out." msgstr "" #: src/language/utilities/host.c:205 #, c-format msgid "Command \"%s\" terminated by signal %d." msgstr "" #: src/language/utilities/host.c:212 msgid "Command or shell not found" msgstr "" #: src/language/utilities/host.c:214 msgid "Could not invoke command or shell" msgstr "" #: src/language/utilities/host.c:217 #, c-format msgid "Command \"%s\" exited with status %d (%s)." msgstr "" #: src/language/utilities/host.c:220 #, c-format msgid "Command \"%s\" exited with status %d." msgstr "" #: src/language/utilities/host.c:230 #, c-format msgid "Command \"%s\" output could not be read (%s)." msgstr "" #: src/language/utilities/title.c:88 #, c-format msgid " (Entered %s)" msgstr "" #: src/language/utilities/include.c:73 #, c-format msgid "Can't find `%s' in include file search path." msgstr "" #: src/language/utilities/output.c:128 #, fuzzy, c-format #| msgid "Unknown command %s." msgid "Unknown cell class %s." msgstr "Comando %s desconhecido." #: src/language/utilities/permissions.c:113 #, c-format msgid "Cannot stat %s: %s" msgstr "" #: src/language/utilities/permissions.c:127 #, c-format msgid "Cannot change mode of %s: %s" msgstr "" #: src/language/stats/aggregate.c:96 #, fuzzy #| msgid "Sum of Squares" msgid "Sum of values" msgstr "Soma dos quadrados" #: src/language/stats/aggregate.c:97 msgid "Mean average" msgstr "" #: src/language/stats/aggregate.c:98 #, fuzzy #| msgid "Weighted Average" msgid "Median average" msgstr "Média ponderada" #: src/language/stats/aggregate.c:99 #: src/ui/gui/psppire-dialog-action-descriptives.c:40 #: src/ui/gui/psppire-dialog-action-frequencies.c:41 msgid "Standard deviation" msgstr "Desvio padrão" #: src/language/stats/aggregate.c:100 #: src/ui/gui/psppire-dialog-action-descriptives.c:42 #, fuzzy #| msgid "Maximum" msgid "Maximum value" msgstr "Máximo" #: src/language/stats/aggregate.c:101 #: src/ui/gui/psppire-dialog-action-descriptives.c:41 #, fuzzy #| msgid "Minimum" msgid "Minimum value" msgstr "Mínimo" #: src/language/stats/aggregate.c:102 msgid "Percentage greater than" msgstr "" #: src/language/stats/aggregate.c:103 #, fuzzy #| msgid "Percentiles" msgid "Percentage less than" msgstr "Percentis" #: src/language/stats/aggregate.c:104 msgid "Percentage included in range" msgstr "" #: src/language/stats/aggregate.c:105 msgid "Percentage excluded from range" msgstr "" #: src/language/stats/aggregate.c:106 msgid "Fraction greater than" msgstr "" #: src/language/stats/aggregate.c:107 msgid "Fraction less than" msgstr "" #: src/language/stats/aggregate.c:108 msgid "Fraction included in range" msgstr "" #: src/language/stats/aggregate.c:109 msgid "Fraction excluded from range" msgstr "" # lala #: src/language/stats/aggregate.c:110 #, fuzzy #| msgid "Sum of case weights" msgid "Number of cases" msgstr "Soma dos pesos dos casos" # lala #: src/language/stats/aggregate.c:111 #, fuzzy #| msgid "Sum of case weights" msgid "Number of cases (unweighted)" msgstr "Soma dos pesos dos casos" #: src/language/stats/aggregate.c:112 #, fuzzy #| msgid "_No missing values" msgid "Number of missing values" msgstr "Sem missi_ng values" #: src/language/stats/aggregate.c:113 #, fuzzy #| msgid "_No missing values" msgid "Number of missing values (unweighted)" msgstr "Sem missi_ng values" #: src/language/stats/aggregate.c:114 #, fuzzy #| msgid "_Discrete missing values" msgid "First non-missing value" msgstr "Missing values _discretos" #: src/language/stats/aggregate.c:115 #, fuzzy #| msgid "_No missing values" msgid "Last non-missing value" msgstr "Sem missi_ng values" #: src/language/stats/aggregate.c:258 msgid "" "When PRESORTED is specified, specifying sorting directions with (A) or (D) " "has no effect. Output data will be sorted the same way as the input data." msgstr "" "Quando PRESORTED é especificado, definir uma direção de ordenamento com (A) " "ou (D) não tem efeito. Dados de saída serão ordenadores da mesma forma que " "os de entrada." #: src/language/stats/aggregate.c:448 msgid "expecting aggregation function" msgstr "esperando função agregadora" #: src/language/stats/aggregate.c:460 #, c-format msgid "Unknown aggregation function %s." msgstr "Função agregadora desconhecida %s." #: src/language/stats/aggregate.c:513 #, c-format msgid "Missing argument %zu to %s." msgstr "Faltando argumento %zu para %s." #: src/language/stats/aggregate.c:522 #, c-format msgid "Arguments to %s must be of same type as source variables." msgstr "Argumento para %s deve ser do mesmo tipo que as variáveis de origem." #: src/language/stats/aggregate.c:541 #, c-format msgid "" "Number of source variables (%zu) does not match number of target variables " "(%zu)." msgstr "" "Número de variáveis de origem (%zu) não combinam com o número de variáveis " "algo (%zu)." #: src/language/stats/aggregate.c:557 #, c-format msgid "" "The value arguments passed to the %s function are out-of-order. They will " "be treated as if they had been specified in the correct order." msgstr "" #: src/language/stats/aggregate.c:631 #, c-format msgid "" "Variable name %s is not unique within the aggregate file dictionary, which " "contains the aggregate variables and the break variables." msgstr "" #: src/language/stats/autorecode.c:152 #, c-format msgid "Source variable count (%zu) does not match target variable count (%zu)." msgstr "" #: src/language/stats/autorecode.c:164 #, c-format msgid "Target variable %s duplicates existing variable %s." msgstr "Variável de destino %s duplica variável existente %s." #: src/language/stats/autorecode.c:221 #, c-format msgid "" "With GROUP, variables may not mix string variables (such as %s) and numeric " "variables (such as %s)." msgstr "" #: src/language/stats/autorecode.c:363 #, fuzzy #| msgid "Recode into Same Variables" msgid "Recoding grouped variables." msgstr "Transformar para a Mesma Variável" #: src/language/stats/autorecode.c:365 #, fuzzy, c-format #| msgid "Replacing %s by %s: %s." msgid "Recoding %s into %s (%s)." msgstr "Substituindo %s por %s: %s." #: src/language/stats/autorecode.c:369 #, fuzzy, c-format #| msgid "Removing %s: %s." msgid "Recoding %s into %s." msgstr "Removendo %s: %s." #: src/language/stats/autorecode.c:376 src/ui/gui/recode.ui:209 msgid "New Value" msgstr "Novo Valor" #: src/language/stats/autorecode.c:376 msgid "Value Label" msgstr "" #: src/language/stats/autorecode.c:379 msgid "Old Value" msgstr "Valores Antigos" #: src/language/stats/binomial.c:138 #, c-format msgid "Variable %s is not dichotomous" msgstr "Variável %s não é dicotômica" #: src/language/stats/binomial.c:182 src/ui/gui/binomial.ui:30 msgid "Binomial Test" msgstr "Teste Binomial" #: src/language/stats/binomial.c:186 src/language/stats/chisquare.c:183 #: src/language/stats/chisquare.c:239 src/language/stats/chisquare.c:322 #: src/language/stats/cochran.c:188 src/language/stats/correlations.c:94 #: src/language/stats/correlations.c:145 src/language/stats/descriptives.c:991 #: src/language/stats/examine.c:602 src/language/stats/examine.c:742 #: src/language/stats/examine.c:836 src/language/stats/examine.c:925 #: src/language/stats/factor.c:1755 src/language/stats/factor.c:1878 #: src/language/stats/factor.c:1908 src/language/stats/factor.c:2068 #: src/language/stats/factor.c:2102 src/language/stats/frequencies.c:302 #: src/language/stats/frequencies.c:1579 src/language/stats/frequencies.c:1586 #: src/language/stats/friedman.c:250 src/language/stats/glm.c:729 #: src/language/stats/kruskal-wallis.c:249 #: src/language/stats/kruskal-wallis.c:297 #: src/language/stats/ks-one-sample.c:278 src/language/stats/logistic.c:1170 #: src/language/stats/logistic.c:1300 src/language/stats/logistic.c:1330 #: src/language/stats/jonckheere-terpstra.c:361 #: src/language/stats/mann-whitney.c:184 src/language/stats/mann-whitney.c:247 #: src/language/stats/means.c:757 src/language/stats/means.c:811 #: src/language/stats/mcnemar.c:222 src/language/stats/median.c:315 #: src/language/stats/median.c:350 src/language/stats/npar-summary.c:106 #: src/language/stats/oneway.c:973 src/language/stats/oneway.c:1051 #: src/language/stats/oneway.c:1150 src/language/stats/oneway.c:1238 #: src/language/stats/oneway.c:1373 src/language/stats/quick-cluster.c:746 #: src/language/stats/reliability.c:543 src/language/stats/reliability.c:584 #: src/language/stats/reliability.c:633 src/language/stats/reliability.c:644 #: src/language/stats/roc.c:969 src/language/stats/roc.c:1067 #: src/language/stats/regression.c:867 src/language/stats/regression.c:899 #: src/language/stats/regression.c:1023 src/language/stats/regression.c:1089 #: src/language/stats/runs.c:318 src/language/stats/sign.c:102 #: src/language/stats/t-test-indep.c:193 src/language/stats/t-test-indep.c:259 #: src/language/stats/t-test-one-sample.c:68 #: src/language/stats/t-test-one-sample.c:125 #: src/language/stats/t-test-paired.c:150 #: src/language/stats/t-test-paired.c:193 #: src/language/stats/t-test-paired.c:238 src/language/stats/wilcoxon.c:243 #: src/language/stats/wilcoxon.c:282 src/language/stats/crosstabs.q:925 #: src/language/stats/crosstabs.q:1253 src/language/stats/crosstabs.q:1293 #: src/language/stats/crosstabs.q:1302 src/language/stats/crosstabs.q:1331 #: src/language/stats/crosstabs.q:1373 src/language/stats/crosstabs.q:1418 #: src/ui/gui/crosstabs.ui:499 src/ui/gui/oneway.ui:615 msgid "Statistics" msgstr "Estatísticas" #: src/language/stats/binomial.c:187 src/language/stats/chisquare.c:240 #: src/language/stats/chisquare.c:252 msgid "Category" msgstr "Categoria" #: src/language/stats/binomial.c:188 src/language/stats/cochran.c:189 #: src/language/stats/correlations.c:97 src/language/stats/correlations.c:155 #: src/language/stats/descriptives.c:993 src/language/stats/examine.c:926 #: src/language/stats/frequencies.c:1588 src/language/stats/friedman.c:251 #: src/language/stats/kruskal-wallis.c:250 #: src/language/stats/ks-one-sample.c:279 src/language/stats/logistic.c:1331 #: src/language/stats/jonckheere-terpstra.c:369 #: src/language/stats/mann-whitney.c:185 src/language/stats/means.c:710 #: src/language/stats/means-calc.c:439 src/language/stats/mcnemar.c:223 #: src/language/stats/median.c:351 src/language/stats/npar-summary.c:107 #: src/language/stats/oneway.c:1052 src/language/stats/reliability.c:544 #: src/language/stats/sign.c:69 src/language/stats/sign.c:70 #: src/language/stats/t-test-indep.c:194 #: src/language/stats/t-test-one-sample.c:126 #: src/language/stats/t-test-paired.c:151 #: src/language/stats/t-test-paired.c:194 src/language/stats/wilcoxon.c:244 #: src/language/stats/crosstabs.q:926 msgid "N" msgstr "N" #: src/language/stats/binomial.c:189 msgid "Observed Prop." msgstr "" #: src/language/stats/binomial.c:190 msgid "Test Prop." msgstr "" #: src/language/stats/binomial.c:192 src/language/stats/mcnemar.c:224 #: src/language/stats/sign.c:103 src/language/stats/wilcoxon.c:288 #: src/language/stats/crosstabs.q:1306 msgid "Exact Sig. (2-tailed)" msgstr "" #: src/language/stats/binomial.c:193 src/language/stats/mcnemar.c:225 #: src/language/stats/sign.c:104 src/language/stats/wilcoxon.c:289 #: src/language/stats/crosstabs.q:1307 msgid "Exact Sig. (1-tailed)" msgstr "" #: src/language/stats/binomial.c:195 #, fuzzy #| msgid "Group1" msgid "Groups" msgstr "Grupo 1" #: src/language/stats/binomial.c:196 #, fuzzy #| msgid "Group1" msgid "Group 1" msgstr "Grupo 1" #: src/language/stats/binomial.c:196 #, fuzzy #| msgid "Group2" msgid "Group 2" msgstr "Grupo 2" #: src/language/stats/binomial.c:196 src/language/stats/chisquare.c:223 #: src/language/stats/chisquare.c:257 src/language/stats/examine.c:930 #: src/language/stats/factor.c:1756 src/language/stats/frequencies.c:344 #: src/language/stats/glm.c:811 src/language/stats/kruskal-wallis.c:285 #: src/language/stats/logistic.c:1336 src/language/stats/mann-whitney.c:197 #: src/language/stats/means.c:706 src/language/stats/oneway.c:982 #: src/language/stats/oneway.c:1072 src/language/stats/reliability.c:549 #: src/language/stats/regression.c:1031 src/language/stats/sign.c:75 #: src/language/stats/wilcoxon.c:250 #: src/ui/gui/psppire-dialog-action-crosstabs.c:93 #: src/language/stats/crosstabs.q:931 src/language/stats/crosstabs.q:1218 msgid "Total" msgstr "Total" #: src/language/stats/chisquare.c:171 #, c-format msgid "" "CHISQUARE test specified %d expected values, but variable %s has %zu " "distinct values." msgstr "" #: src/language/stats/chisquare.c:184 src/language/stats/chisquare.c:241 msgid "Observed N" msgstr "N observado" #: src/language/stats/chisquare.c:185 src/language/stats/chisquare.c:242 msgid "Expected N" msgstr "N esperado" #: src/language/stats/chisquare.c:186 src/language/stats/chisquare.c:243 #: src/language/stats/regression.c:1031 #: src/ui/gui/psppire-dialog-action-crosstabs.c:95 #: src/language/stats/crosstabs.q:1267 msgid "Residual" msgstr "Resíduo" #: src/language/stats/chisquare.c:235 src/language/stats/cochran.c:150 #: src/language/stats/median.c:305 src/language/stats/sign.c:66 #: src/ui/gui/frequencies.ui:676 msgid "Frequencies" msgstr "Frequência" #: src/language/stats/chisquare.c:320 src/language/stats/cochran.c:181 #: src/language/stats/friedman.c:246 src/language/stats/kruskal-wallis.c:295 #: src/language/stats/mann-whitney.c:244 src/language/stats/mcnemar.c:219 #: src/language/stats/median.c:347 src/language/stats/sign.c:100 #: src/language/stats/wilcoxon.c:279 msgid "Test Statistics" msgstr "Testes estatísticos" #: src/language/stats/chisquare.c:323 #, fuzzy #| msgid "Chi-Square" msgid "Chi-square" msgstr "Chi-quadrado" #: src/language/stats/chisquare.c:324 src/language/stats/cochran.c:191 #: src/language/stats/examine.c:675 src/language/stats/factor.c:2107 #: src/language/stats/friedman.c:257 src/language/stats/glm.c:733 #: src/language/stats/kruskal-wallis.c:299 src/language/stats/logistic.c:1174 #: src/language/stats/median.c:354 src/language/stats/oneway.c:975 #: src/language/stats/oneway.c:1242 src/language/stats/regression.c:1025 #: src/language/stats/t-test-indep.c:267 #: src/language/stats/t-test-one-sample.c:75 #: src/language/stats/t-test-paired.c:253 src/language/stats/crosstabs.q:1304 msgid "df" msgstr "df" #: src/language/stats/chisquare.c:325 src/language/stats/cochran.c:192 #: src/language/stats/friedman.c:258 src/language/stats/kruskal-wallis.c:300 #: src/language/stats/median.c:355 msgid "Asymp. Sig." msgstr "Asymp. Sig." #: src/language/stats/cochran.c:111 msgid "More than two values encountered. Cochran Q test will not be run." msgstr "" #: src/language/stats/cochran.c:153 #, c-format msgid "Success (%.*g)" msgstr "" #: src/language/stats/cochran.c:154 #, c-format msgid "Failure (%.*g)" msgstr "" #: src/language/stats/cochran.c:190 msgid "Cochran's Q" msgstr "" #: src/language/stats/correlations.c:91 src/language/stats/descriptives.c:987 #: src/language/stats/factor.c:2065 src/language/stats/npar-summary.c:102 msgid "Descriptive Statistics" msgstr "" #: src/language/stats/correlations.c:95 src/language/stats/descriptives.c:108 #: src/language/stats/examine.c:742 src/language/stats/factor.c:2069 #: src/language/stats/frequencies.c:141 src/language/stats/graph.c:211 #: src/language/stats/ks-one-sample.c:290 src/language/stats/means-calc.c:438 #: src/language/stats/npar-summary.c:108 src/language/stats/oneway.c:1052 #: src/language/stats/t-test-indep.c:195 #: src/language/stats/t-test-one-sample.c:127 #: src/language/stats/t-test-paired.c:152 #: src/language/stats/t-test-paired.c:241 #: src/ui/gui/psppire-dialog-action-descriptives.c:39 #: src/ui/gui/psppire-dialog-action-frequencies.c:40 msgid "Mean" msgstr "Média" #: src/language/stats/correlations.c:96 src/language/stats/examine.c:751 #: src/language/stats/factor.c:2070 src/language/stats/ks-one-sample.c:290 #: src/language/stats/means-calc.c:440 src/language/stats/npar-summary.c:109 #: src/language/stats/oneway.c:1052 src/language/stats/t-test-indep.c:196 #: src/language/stats/t-test-one-sample.c:128 #: src/language/stats/t-test-paired.c:153 #: src/language/stats/t-test-paired.c:242 msgid "Std. Deviation" msgstr "Desvio padrão" #: src/language/stats/correlations.c:126 #, fuzzy #| msgid "Bivariate _Correlation" msgid "Correlations" msgstr "_Correlação Bivariada" #: src/language/stats/correlations.c:146 #, fuzzy #| msgid "Bivariate _Correlation" msgid "Pearson Correlation" msgstr "_Correlação Bivariada" #: src/language/stats/correlations.c:147 src/language/stats/oneway.c:1243 #: src/language/stats/t-test-indep.c:268 #: src/language/stats/t-test-one-sample.c:76 #: src/language/stats/t-test-paired.c:254 msgid "Sig. (2-tailed)" msgstr "" #: src/language/stats/correlations.c:147 src/language/stats/factor.c:1913 #, fuzzy msgid "Sig. (1-tailed)" msgstr "Asymp. Sig." #: src/language/stats/correlations.c:151 msgid "Cross-products" msgstr "" #: src/language/stats/correlations.c:152 #, fuzzy #| msgid "Covariances" msgid "Covariance" msgstr "Co-variança" #: src/language/stats/correlations.c:165 msgid "Significant at .05 level" msgstr "" #: src/language/stats/correlations.c:234 msgid "The data for the chosen variables are all missing or empty." msgstr "" #: src/language/stats/correlations.c:390 src/language/stats/descriptives.c:368 #: src/language/data-io/list.c:166 msgid "No variables specified." msgstr "" #: src/language/stats/descriptives.c:109 src/language/stats/frequencies.c:142 #: src/language/stats/means-calc.c:445 src/language/stats/t-test-indep.c:197 #: src/language/stats/t-test-one-sample.c:129 #: src/language/stats/t-test-paired.c:154 #: src/language/stats/t-test-paired.c:243 msgid "S.E. Mean" msgstr "" #: src/language/stats/descriptives.c:110 src/language/stats/frequencies.c:145 msgid "Std Dev" msgstr "Std Dev" #: src/language/stats/descriptives.c:111 src/language/stats/examine.c:750 #: src/language/stats/frequencies.c:146 src/language/stats/means-calc.c:450 #: src/ui/gui/psppire-dialog-action-descriptives.c:46 #: src/ui/gui/psppire-dialog-action-frequencies.c:45 msgid "Variance" msgstr "Variança" #: src/language/stats/descriptives.c:112 src/language/stats/examine.c:752 #: src/language/stats/frequencies.c:147 src/language/stats/means-calc.c:451 #: src/ui/gui/psppire-dialog-action-descriptives.c:47 #: src/ui/gui/psppire-dialog-action-frequencies.c:50 msgid "Kurtosis" msgstr "" #: src/language/stats/descriptives.c:113 src/language/stats/frequencies.c:148 #: src/language/stats/means-calc.c:452 msgid "S.E. Kurt" msgstr "" #: src/language/stats/descriptives.c:114 src/language/stats/examine.c:752 #: src/language/stats/frequencies.c:149 src/language/stats/means-calc.c:453 #: src/ui/gui/psppire-dialog-action-descriptives.c:48 #: src/ui/gui/psppire-dialog-action-frequencies.c:46 msgid "Skewness" msgstr "" #: src/language/stats/descriptives.c:115 src/language/stats/frequencies.c:150 #: src/language/stats/means-calc.c:454 msgid "S.E. Skew" msgstr "" #: src/language/stats/descriptives.c:116 src/language/stats/examine.c:751 #: src/language/stats/frequencies.c:151 src/language/stats/means-calc.c:449 #: src/ui/gui/psppire-dialog-action-descriptives.c:43 #: src/ui/gui/psppire-dialog-action-frequencies.c:48 msgid "Range" msgstr "Intervalo" #: src/language/stats/descriptives.c:117 src/language/stats/examine.c:751 #: src/language/stats/frequencies.c:152 src/language/stats/graph.c:214 #: src/language/stats/ks-one-sample.c:285 src/language/stats/means-calc.c:447 #: src/language/stats/npar-summary.c:110 src/language/stats/oneway.c:1061 #: src/ui/gui/psppire-dialog-action-descriptives.c:41 #: src/ui/gui/psppire-dialog-action-frequencies.c:42 msgid "Minimum" msgstr "Mínimo" #: src/language/stats/descriptives.c:118 src/language/stats/examine.c:751 #: src/language/stats/frequencies.c:153 src/language/stats/graph.c:213 #: src/language/stats/ks-one-sample.c:285 src/language/stats/means-calc.c:448 #: src/language/stats/npar-summary.c:110 src/language/stats/oneway.c:1061 #: src/ui/gui/psppire-dialog-action-descriptives.c:42 #: src/ui/gui/psppire-dialog-action-frequencies.c:43 msgid "Maximum" msgstr "Máximo" #: src/language/stats/descriptives.c:119 src/language/stats/frequencies.c:154 #: src/language/stats/graph.c:212 src/language/stats/means-calc.c:446 #: src/ui/gui/psppire-dialog-action-descriptives.c:44 #: src/ui/gui/psppire-dialog-action-frequencies.c:53 msgid "Sum" msgstr "Soma" #: src/language/stats/descriptives.c:350 #, c-format msgid "Z-score variable name %s would be a duplicate variable name." msgstr "" #: src/language/stats/descriptives.c:401 #, fuzzy #| msgid "" #| "FLIP ignores TEMPORARY. Temporary transformations will be made permanent." msgid "" "DESCRIPTIVES with Z scores ignores TEMPORARY. Temporary transformations " "will be made permanent." msgstr "" "FLIP ignora TEMPORARY. Transformações temporárias serão feitas permanentes." #: src/language/stats/descriptives.c:478 msgid "expecting statistic name: reverting to default" msgstr "nome de estatística esperado: revertendo para o padrão" #: src/language/stats/descriptives.c:561 msgid "" "Ran out of generic names for Z-score variables. There are only 126 generic " "names: ZSC001-ZSC0999, STDZ01-STDZ09, ZZZZ01-ZZZZ09, ZQZQ01-ZQZQ09." msgstr "" #: src/language/stats/descriptives.c:579 msgid "Mapping of Variables to Z-scores" msgstr "" #: src/language/stats/descriptives.c:581 #, fuzzy #| msgid "Name" msgid "Names" msgstr "Nome" #: src/language/stats/descriptives.c:582 src/language/stats/glm.c:739 #: src/language/stats/regression.c:1030 msgid "Source" msgstr "Fonte" #: src/language/stats/descriptives.c:582 msgid "Target" msgstr "Destino" #: src/language/stats/descriptives.c:659 #, c-format msgid "Internal error processing Z scores. Please report this to %s." msgstr "" #: src/language/stats/descriptives.c:759 #, c-format msgid "Z-score of %s" msgstr "" #: src/language/stats/descriptives.c:1028 src/language/stats/roc.c:1029 msgid "Valid N (listwise)" msgstr "" #: src/language/stats/descriptives.c:1028 msgid "Missing N (listwise)" msgstr "" #: src/language/stats/examine.c:75 #, fuzzy #| msgid "Missing" msgid " (missing)" msgstr "Missing" #: src/language/stats/examine.c:225 #, c-format msgid "Boxplot of %s vs. %s" msgstr "Boxplot de %s por %s" #: src/language/stats/examine.c:231 src/language/stats/examine.c:338 #, fuzzy, c-format msgid "Boxplot of %s" msgstr "Boxplot de %s por %s" #: src/language/stats/examine.c:321 msgid "Boxplot" msgstr "Boxplot" #: src/language/stats/examine.c:418 msgid "Not creating NP plot because data set is empty." msgstr "" #: src/language/stats/examine.c:478 #, c-format msgid "Not creating spreadlevel chart for %s" msgstr "" #: src/language/stats/examine.c:585 #, fuzzy #| msgid "_No missing values" msgid "User-missing value." msgstr "Sem missi_ng values" #: src/language/stats/examine.c:591 src/language/stats/examine.c:595 #: src/language/stats/frequencies.c:1606 msgid "Percentiles" msgstr "Percentis" #: src/language/stats/examine.c:603 src/math/percentiles.c:37 msgid "Weighted Average" msgstr "Média ponderada" #: src/language/stats/examine.c:603 msgid "Tukey's Hinges" msgstr "" #: src/language/stats/examine.c:610 src/language/stats/examine.c:685 #: src/language/stats/examine.c:759 src/language/stats/examine.c:858 #: src/language/stats/examine.c:938 src/language/stats/mann-whitney.c:200 #: src/language/stats/median.c:319 src/language/stats/t-test-indep.c:227 #: src/language/stats/t-test-indep.c:282 #: src/language/stats/t-test-one-sample.c:87 #, fuzzy #| msgid "Dependent _Variable(s):" msgid "Dependent Variables" msgstr "_Variável(s) Dependente(s)" #: src/language/stats/examine.c:669 msgid "Tests of Normality" msgstr "" #: src/language/stats/examine.c:673 msgid "Shapiro-Wilk" msgstr "" #: src/language/stats/examine.c:674 src/language/stats/examine.c:739 #: src/ui/gui/psppire-checkbox-treeview.c:73 msgid "Statistic" msgstr "Estatística" #: src/language/stats/examine.c:676 src/language/stats/factor.c:2108 #: src/language/stats/glm.c:736 src/language/stats/logistic.c:1175 #: src/language/stats/oneway.c:978 src/language/stats/oneway.c:1154 #: src/language/stats/oneway.c:1376 src/language/stats/regression.c:906 #: src/language/stats/regression.c:1028 src/language/stats/t-test-indep.c:263 #: src/language/stats/t-test-paired.c:196 msgid "Sig." msgstr "" #: src/language/stats/examine.c:735 src/language/stats/oneway.c:1045 #: src/ui/gui/descriptives.ui:25 msgid "Descriptives" msgstr "Descritivas" #: src/language/stats/examine.c:738 msgid "Aspect" msgstr "" #: src/language/stats/examine.c:739 src/language/stats/oneway.c:1053 #: src/language/stats/oneway.c:1240 src/language/stats/oneway.c:1375 #: src/language/stats/roc.c:975 src/language/stats/regression.c:902 msgid "Std. Error" msgstr "Erro padrão" #: src/language/stats/examine.c:745 src/language/stats/oneway.c:1056 #, c-format msgid "%g%% Confidence Interval for Mean" msgstr "" #: src/language/stats/examine.c:747 src/language/stats/oneway.c:1058 #: src/language/stats/oneway.c:1382 src/language/stats/roc.c:982 #: src/language/stats/regression.c:913 msgid "Lower Bound" msgstr "Intervalo inferior" #: src/language/stats/examine.c:748 src/language/stats/oneway.c:1059 #: src/language/stats/oneway.c:1383 src/language/stats/roc.c:983 #: src/language/stats/regression.c:914 msgid "Upper Bound" msgstr "Intervalo superior" #: src/language/stats/examine.c:750 msgid "5% Trimmed Mean" msgstr "" #: src/language/stats/examine.c:750 src/language/stats/frequencies.c:143 #: src/language/stats/means-calc.c:442 src/language/stats/median.c:352 #: src/ui/gui/psppire-dialog-action-frequencies.c:52 msgid "Median" msgstr "" #: src/language/stats/examine.c:752 msgid "Interquartile Range" msgstr "" #: src/language/stats/examine.c:832 msgid "Extreme Values" msgstr "" #: src/language/stats/examine.c:840 src/language/stats/quick-cluster.c:664 #: src/language/data-io/list.c:110 msgid "Case Number" msgstr "Número do caso" #: src/language/stats/examine.c:844 #, fuzzy #| msgid "Order by" msgid "Order" msgstr "Ordenar por" #. TRANSLATORS: This is a noun, not an adjective. #: src/language/stats/examine.c:850 #, fuzzy #| msgid "Extremes" msgid "Extreme" msgstr "Extremos" #: src/language/stats/examine.c:851 msgid "Highest" msgstr "Maior" #: src/language/stats/examine.c:851 msgid "Lowest" msgstr "Menor" #: src/language/stats/examine.c:921 src/language/stats/logistic.c:1328 #: src/language/stats/means.c:694 src/language/stats/reliability.c:540 msgid "Case Processing Summary" msgstr "Sumário de processamento de casos" #: src/language/stats/examine.c:927 src/language/stats/frequencies.c:304 #: src/language/stats/frequencies.c:1494 src/language/stats/logistic.c:1332 #: src/language/stats/means.c:713 src/language/stats/reliability.c:545 #: src/language/stats/crosstabs.q:927 msgid "Percent" msgstr "Percentual" #: src/language/stats/examine.c:929 src/language/stats/frequencies.c:321 #: src/language/stats/frequencies.c:1590 src/language/stats/quick-cluster.c:766 #: src/language/stats/reliability.c:548 src/language/stats/crosstabs.q:931 msgid "Valid" msgstr "Valido" #: src/language/stats/examine.c:929 src/language/stats/frequencies.c:336 #: src/language/stats/frequencies.c:1591 src/language/stats/crosstabs.q:931 msgid "Missing" msgstr "Missing" #: src/language/stats/examine.c:1550 #, c-format msgid "%s may not be negative. Using default value (%g)." msgstr "" #: src/language/stats/examine.c:1587 msgid "Percentiles must lie in the range (0, 100)" msgstr "" #: src/language/stats/examine.c:1777 #, c-format msgid "%s and %s are mutually exclusive" msgstr "%s e %s são mutualmente excludentes" #: src/language/stats/factor.c:1121 #, c-format msgid "Matrix input for %s must be either COV or CORR" msgstr "" #: src/language/stats/factor.c:1519 msgid "Factor analysis on a single variable is not useful." msgstr "" #: src/language/stats/factor.c:1523 msgid "Factor analysis without variables is not possible." msgstr "" #: src/language/stats/factor.c:1634 #, fuzzy #| msgid "Column Number: 0" msgid "Component Number" msgstr "Número da Coluna: 0" #: src/language/stats/factor.c:1634 #, fuzzy #| msgid "Case Number" msgid "Factor Number" msgstr "Número do caso" #: src/language/stats/factor.c:1648 src/language/stats/factor.c:1651 #, fuzzy #| msgid "Comments:" msgid "Communalities" msgstr "Comentários:" #: src/language/stats/factor.c:1653 msgid "Initial" msgstr "" #: src/language/stats/factor.c:1655 msgid "Extraction" msgstr "" #: src/language/stats/factor.c:1697 src/language/stats/factor.c:1777 #: src/language/stats/factor.c:1839 msgid "Component" msgstr "" #: src/language/stats/factor.c:1697 src/language/stats/factor.c:1777 #: src/language/stats/factor.c:1839 #, fuzzy #| msgid "_Factor:" msgid "Factor" msgstr "_Fator:" #: src/language/stats/factor.c:1752 msgid "Total Variance Explained" msgstr "" #: src/language/stats/factor.c:1758 #, fuzzy, no-c-format #| msgid "Variance" msgid "% of Variance" msgstr "Variança" #: src/language/stats/factor.c:1760 #, no-c-format msgid "Cumulative %" msgstr "" #: src/language/stats/factor.c:1763 msgid "Phase" msgstr "" #: src/language/stats/factor.c:1765 msgid "Initial Eigenvalues" msgstr "" #: src/language/stats/factor.c:1769 msgid "Extraction Sums of Squared Loadings" msgstr "" #: src/language/stats/factor.c:1773 msgid "Rotation Sums of Squared Loadings" msgstr "" #: src/language/stats/factor.c:1835 msgid "Factor Correlation Matrix" msgstr "" #: src/language/stats/factor.c:1842 #, fuzzy #| msgid "_Factor:" msgid "Factor 2" msgstr "_Fator:" #: src/language/stats/factor.c:1874 msgid "Anti-Image Matrices" msgstr "" #: src/language/stats/factor.c:1879 #, fuzzy #| msgid "Covariances" msgid "Anti-image Covariance" msgstr "Co-variança" #: src/language/stats/factor.c:1880 #, fuzzy #| msgid "Bivariate _Correlation" msgid "Anti-image Correlation" msgstr "_Correlação Bivariada" #: src/language/stats/factor.c:1901 msgid "Correlation Matrix" msgstr "" #: src/language/stats/factor.c:1910 src/language/stats/t-test-paired.c:195 msgid "Correlation" msgstr "" #: src/language/stats/factor.c:1947 msgid "Determinant" msgstr "" #: src/language/stats/factor.c:1958 #, fuzzy #| msgid "Covariances" msgid "Covariance Matrix" msgstr "Co-variança" #: src/language/stats/factor.c:1990 msgid "" "The dataset contains no complete observations. No analysis will be performed." msgstr "" #: src/language/stats/factor.c:2014 msgid "The dataset has no complete covariance or correlation matrix." msgstr "" #: src/language/stats/factor.c:2071 msgid "Analysis N" msgstr "" #: src/language/stats/factor.c:2099 msgid "KMO and Bartlett's Test" msgstr "" #: src/language/stats/factor.c:2103 msgid "Kaiser-Meyer-Olkin Measure of Sampling Adequacy" msgstr "" #: src/language/stats/factor.c:2105 msgid "Bartlett's Test of Sphericity" msgstr "" #: src/language/stats/factor.c:2106 #, fuzzy #| msgid "Pearson Chi-Square" msgid "Approx. Chi-Square" msgstr "Chi-quadrado de Pearson" #: src/language/stats/factor.c:2154 #, c-format msgid "" "The %s criteria result in zero factors extracted. Therefore no analysis will " "be performed." msgstr "" #: src/language/stats/factor.c:2161 #, c-format msgid "" "The %s criteria result in more factors than variables, which is not " "meaningful. No analysis will be performed." msgstr "" #: src/language/stats/factor.c:2254 msgid "Component Matrix" msgstr "" #: src/language/stats/factor.c:2254 #, fuzzy #| msgid "Factor List:" msgid "Factor Matrix" msgstr "Lista de Fator:" #: src/language/stats/factor.c:2259 msgid "Pattern Matrix" msgstr "" #: src/language/stats/factor.c:2268 msgid "Structure Matrix" msgstr "" #: src/language/stats/factor.c:2270 msgid "Rotated Component Matrix" msgstr "" #: src/language/stats/factor.c:2271 msgid "Rotated Factor Matrix" msgstr "" #: src/language/stats/flip.c:100 #, fuzzy, c-format #| msgid "" #| "FLIP ignores TEMPORARY. Temporary transformations will be made permanent." msgid "%s ignores %s. Temporary transformations will be made permanent." msgstr "" "FLIP ignora TEMPORARY. Transformações temporárias serão feitas permanentes." #: src/language/stats/flip.c:153 #, fuzzy, c-format #| msgid "Could not create temporary file for FLIP." msgid "Could not create temporary file for %s." msgstr "Não foi possível criar arquivo temporário para FLIP." #: src/language/stats/flip.c:341 #, fuzzy, c-format #| msgid "Error reading file %s: %s." msgid "Error rewinding %s file: %s." msgstr "Erro lendo arquivo %s: %s." #: src/language/stats/flip.c:348 #, fuzzy, c-format #| msgid "Error creating FLIP source file." msgid "Error creating %s source file." msgstr "Erro ao criar arquivo de origem FLIP" #: src/language/stats/flip.c:361 #, fuzzy, c-format #| msgid "Error reading file %s: %s." msgid "Error reading %s file: %s." msgstr "Erro lendo arquivo %s: %s." #: src/language/stats/flip.c:363 #, fuzzy, c-format #| msgid "Unexpected end of file reading %s." msgid "Unexpected end of file reading %s file." msgstr "Fim de arquivo não esperado lendo %s." #: src/language/stats/flip.c:379 #, fuzzy, c-format #| msgid "Error opening psql source: %s." msgid "Error seeking %s source file: %s." msgstr "Erro abrindo fonte psql: %s." #: src/language/stats/flip.c:387 #, fuzzy, c-format #| msgid "Error writing FLIP file: %s." msgid "Error writing %s source file: %s." msgstr "Erro escrevendo em arquivo FLIP: %s." #: src/language/stats/flip.c:402 #, fuzzy, c-format #| msgid "Error opening psql source: %s." msgid "Error rewinding %s source file: %s." msgstr "Erro abrindo fonte psql: %s." #: src/language/stats/flip.c:433 #, fuzzy, c-format #| msgid "%s: Creating temporary file: %s." msgid "Error reading %s temporary file: %s." msgstr "%s: Criando arquivo temporário: %s" #: src/language/stats/flip.c:436 #, fuzzy, c-format #| msgid "unexpected end of file reading temporary file" msgid "Unexpected end of file reading %s temporary file." msgstr "fim inesperado ao ler arquivo temporário" #: src/language/stats/frequencies.c:144 #: src/ui/gui/psppire-dialog-action-frequencies.c:49 msgid "Mode" msgstr "" #: src/language/stats/frequencies.c:303 src/language/stats/logistic.c:1381 #: src/output/charts/plot-hist-cairo.c:112 msgid "Frequency" msgstr "Frequência" #: src/language/stats/frequencies.c:305 #, fuzzy #| msgid "Percent" msgid "Valid Percent" msgstr "Percentual" #: src/language/stats/frequencies.c:306 src/language/stats/graph.c:208 msgid "Cumulative Percent" msgstr "" #: src/language/stats/frequencies.c:905 msgid "Histogram frequency must be greater than zero." msgstr "" #: src/language/stats/frequencies.c:923 #, fuzzy #| msgid "Number of document lines (%d) must be greater than 0." msgid "Histogram percentage must be greater than zero." msgstr "Número de linhas do documento (%d) precisa ser maior que 0." #: src/language/stats/frequencies.c:1139 #, c-format msgid "" "%s for histogram must be greater than or equal to %s, but %s was specified " "as %.15g and %s as %.15g. %s and %s will be ignored." msgstr "" #: src/language/stats/frequencies.c:1184 #, c-format msgid "" "%s for pie chart must be greater than or equal to %s, but %s was specified " "as %.15g and %s as %.15g. %s and %s will be ignored." msgstr "" #: src/language/stats/frequencies.c:1474 #, c-format msgid "Omitting pie chart for %s, which has only %d unique values." msgstr "" #: src/language/stats/frequencies.c:1477 #, c-format msgid "Omitting pie chart for %s, which has over 50 unique values." msgstr "" #: src/language/stats/frequencies.c:1494 src/language/stats/graph.c:205 #: src/language/stats/quick-cluster.c:747 #: src/ui/gui/psppire-dialog-action-crosstabs.c:90 #: src/language/stats/crosstabs.q:789 src/language/stats/crosstabs.q:1262 msgid "Count" msgstr "Contagem" #: src/language/stats/friedman.c:220 src/language/stats/kruskal-wallis.c:247 #: src/language/stats/mann-whitney.c:182 src/language/stats/wilcoxon.c:240 #, fuzzy msgid "Ranks" msgstr "Ordenamento" #: src/language/stats/friedman.c:222 src/language/stats/friedman.c:223 #: src/language/stats/kruskal-wallis.c:251 #: src/language/stats/mann-whitney.c:186 src/language/stats/wilcoxon.c:245 #, fuzzy msgid "Mean Rank" msgstr "Média" #: src/language/stats/friedman.c:253 msgid "Kendall's W" msgstr "" #: src/language/stats/friedman.c:256 src/language/stats/kruskal-wallis.c:298 #: src/language/stats/median.c:353 msgid "Chi-Square" msgstr "Chi-quadrado" #: src/language/stats/glm.c:169 #, fuzzy #| msgid "Active file compression is not implemented." msgid "Multivariate analysis is not yet implemented" msgstr "Compressão de arquivo ativo não está implementado." #: src/language/stats/glm.c:274 msgid "Only types 1, 2 & 3 sums of squares are currently implemented" msgstr "" #: src/language/stats/glm.c:727 msgid "Tests of Between-Subjects Effects" msgstr "" #: src/language/stats/glm.c:730 #, fuzzy #| msgid "Sum of Squares" msgid "Type I Sum Of Squares" msgstr "Soma dos quadrados" #: src/language/stats/glm.c:731 #, fuzzy #| msgid "Sum of Squares" msgid "Type II Sum Of Squares" msgstr "Soma dos quadrados" #: src/language/stats/glm.c:732 #, fuzzy #| msgid "Sum of Squares" msgid "Type III Sum Of Squares" msgstr "Soma dos quadrados" #: src/language/stats/glm.c:734 src/language/stats/oneway.c:976 #: src/language/stats/regression.c:1026 msgid "Mean Square" msgstr "" #: src/language/stats/glm.c:735 src/language/stats/oneway.c:977 #: src/language/stats/regression.c:1027 src/language/stats/t-test-indep.c:262 msgid "F" msgstr "" #: src/language/stats/glm.c:740 msgid "Corrected Model" msgstr "" #: src/language/stats/glm.c:740 msgid "Model" msgstr "Modelo" #: src/language/stats/glm.c:752 #, fuzzy #| msgid "Percent" msgid "Intercept" msgstr "Percentual" #: src/language/stats/glm.c:802 src/output/pivot-table.c:763 #: src/output/spv/spv.c:867 #, fuzzy #| msgid "error" msgid "Error" msgstr "erro" #: src/language/stats/glm.c:819 #, fuzzy #| msgid "Coefficient Total: " msgid "Corrected Total" msgstr "Coeficiente Total: " #: src/language/stats/graph.c:206 #, fuzzy #| msgid "Percent" msgid "Percentage" msgstr "Percentual" #: src/language/stats/graph.c:207 msgid "Cumulative Count" msgstr "" #: src/language/stats/graph.c:296 #, fuzzy, c-format #| msgid "%s is %s (%s)." msgid "%s vs. %s by %s" msgstr "%s é %s (%s)." #: src/language/stats/graph.c:303 #, fuzzy, c-format #| msgid "Boxplot of %s vs. %s" msgid "%s vs. %s" msgstr "Boxplot de %s por %s" #: src/language/stats/graph.c:322 msgid "" "Maximum number of scatterplot categories reached. Your BY variable has too " "many distinct values. The coloring of the plot will not be correct." msgstr "" #: src/language/stats/graph.c:551 src/language/stats/rank.c:636 #, c-format msgid "%s of %s" msgstr "" #: src/language/stats/graph.c:698 src/language/stats/graph.c:729 #: src/language/stats/graph.c:777 msgid "Only one chart type is allowed." msgstr "" # Inline? #: src/language/stats/graph.c:721 src/language/stats/graph.c:820 #: src/language/stats/graph.c:834 #, fuzzy #| msgid "The inline file is not allowed here." msgid "Only one variable is allowed." msgstr "O arquivo inline não é permitido aqui." #: src/language/stats/graph.c:843 #, fuzzy #| msgid "Variable Type" msgid "Variable expected" msgstr "Tipo da Variável" #: src/language/stats/graph.c:883 #, fuzzy #| msgid "%s is not implemented." msgid "FOOTNOTE is not implemented yet for GRAPH" msgstr "%s não está implementado." #: src/language/stats/ks-one-sample.c:274 src/ui/gui/ks-one-sample.ui:24 msgid "One-Sample Kolmogorov-Smirnov Test" msgstr "" #: src/language/stats/ks-one-sample.c:284 msgid "Uniform Parameters" msgstr "" #: src/language/stats/ks-one-sample.c:289 msgid "Normal Parameters" msgstr "" #: src/language/stats/ks-one-sample.c:294 msgid "Poisson Parameters" msgstr "" #: src/language/stats/ks-one-sample.c:295 #: src/ui/gui/psppire-dialog-action-crosstabs.c:76 #: src/language/stats/crosstabs.q:1421 msgid "Lambda" msgstr "Lambda" #: src/language/stats/ks-one-sample.c:300 msgid "Exponential Parameters" msgstr "" #: src/language/stats/ks-one-sample.c:308 msgid "Most Extreme Differences" msgstr "" #: src/language/stats/ks-one-sample.c:309 msgid "Absolute" msgstr "" #: src/language/stats/ks-one-sample.c:309 src/language/stats/roc.c:1037 #, fuzzy msgid "Positive" msgstr "positivo" #: src/language/stats/ks-one-sample.c:309 src/language/stats/roc.c:1037 #, fuzzy msgid "Negative" msgstr "negativo" #: src/language/stats/ks-one-sample.c:312 msgid "Kolmogorov-Smirnov Z" msgstr "" #: src/language/stats/ks-one-sample.c:313 #: src/language/stats/jonckheere-terpstra.c:374 #: src/language/stats/mann-whitney.c:251 src/language/stats/runs.c:328 #: src/language/stats/wilcoxon.c:284 #, fuzzy msgid "Asymp. Sig. (2-tailed)" msgstr "Asymp. Sig." #: src/language/stats/logistic.c:327 msgid "All predicted values are either 1 or 0" msgstr "" #: src/language/stats/logistic.c:525 #, fuzzy #| msgid "Dependent variable must be numeric." msgid "Dependent variable's values are not dichotomous." msgstr "Variável dependente precisa ser numérica" #: src/language/stats/logistic.c:614 #, c-format msgid "" "Category %s does not have at least two distinct values. Logistic regression " "will not be run." msgstr "" #: src/language/stats/logistic.c:674 #, c-format msgid "" "Estimation terminated at iteration number %d because parameter estimates " "changed by less than %g" msgstr "" #: src/language/stats/logistic.c:686 #, c-format msgid "" "Estimation terminated at iteration number %d because Log Likelihood " "decreased by less than %g%%" msgstr "" #: src/language/stats/logistic.c:701 #, c-format msgid "" "Estimation terminated at iteration number %d because maximum iterations has " "been reached" msgstr "" #: src/language/stats/logistic.c:994 msgid "Cut point value must be in the range [0,1]" msgstr "" #: src/language/stats/logistic.c:1139 #, fuzzy #| msgid "Dependent _Variable(s):" msgid "Dependent Variable Encoding" msgstr "_Variável(s) Dependente(s)" #: src/language/stats/logistic.c:1141 msgid "Mapping" msgstr "" #: src/language/stats/logistic.c:1142 #, fuzzy msgid "Internal Value" msgstr "Arquivo portátil" #: src/language/stats/logistic.c:1145 #, fuzzy #| msgid "Old Value" msgid "Original Value" msgstr "Valores Antigos" #: src/language/stats/logistic.c:1167 #, fuzzy #| msgid "Variable Information:" msgid "Variables in the Equation" msgstr "Informação da Variável:" #: src/language/stats/logistic.c:1171 src/language/stats/regression.c:902 msgid "B" msgstr "" #: src/language/stats/logistic.c:1172 msgid "S.E." msgstr "" #: src/language/stats/logistic.c:1173 msgid "Wald" msgstr "" #: src/language/stats/logistic.c:1176 msgid "Exp(B)" msgstr "" #: src/language/stats/logistic.c:1181 #, c-format msgid "%d%% CI for Exp(B)" msgstr "" #: src/language/stats/logistic.c:1183 src/language/stats/t-test-indep.c:274 #: src/language/stats/t-test-one-sample.c:83 #: src/language/stats/t-test-paired.c:249 src/language/stats/crosstabs.q:1369 msgid "Lower" msgstr "" #: src/language/stats/logistic.c:1183 src/language/stats/t-test-indep.c:275 #: src/language/stats/t-test-one-sample.c:84 #: src/language/stats/t-test-paired.c:250 src/language/stats/crosstabs.q:1370 msgid "Upper" msgstr "" #: src/language/stats/logistic.c:1189 src/language/stats/logistic.c:1470 msgid "Step 1" msgstr "" #: src/language/stats/logistic.c:1263 msgid "Constant" msgstr "" #: src/language/stats/logistic.c:1298 msgid "Model Summary" msgstr "" #: src/language/stats/logistic.c:1301 msgid "-2 Log likelihood" msgstr "" #: src/language/stats/logistic.c:1302 msgid "Cox & Snell R Square" msgstr "" #: src/language/stats/logistic.c:1303 msgid "Nagelkerke R Square" msgstr "" #: src/language/stats/logistic.c:1306 src/language/stats/logistic.c:1470 msgid "Step" msgstr "" #: src/language/stats/logistic.c:1335 #, fuzzy #| msgid "Weight Cases" msgid "Unweighted Cases" msgstr "Dar Peso Aos Casos" #: src/language/stats/logistic.c:1336 #, fuzzy #| msgid "Include user-missing data in analysis" msgid "Included in Analysis" msgstr "Incluir user-missing na análise" #: src/language/stats/logistic.c:1336 #, fuzzy #| msgid "Missing Values" msgid "Missing Cases" msgstr "Missing Values" #: src/language/stats/logistic.c:1365 msgid "Categorical Variables' Codings" msgstr "" #: src/language/stats/logistic.c:1380 msgid "Codings" msgstr "" #: src/language/stats/logistic.c:1383 msgid "Parameter coding" msgstr "" #: src/language/stats/logistic.c:1462 msgid "Classification Table" msgstr "" #: src/language/stats/logistic.c:1466 #, fuzzy #| msgid "Predicted values" msgid "Predicted" msgstr "Valores esperados" #: src/language/stats/logistic.c:1466 msgid "Percentage Correct" msgstr "" #: src/language/stats/logistic.c:1468 #, fuzzy #| msgid "Observed N" msgid "Observed" msgstr "N observado" #: src/language/stats/logistic.c:1468 msgid "Overall Percentage" msgstr "" #: src/language/stats/jonckheere-terpstra.c:357 msgid "Jonckheere-Terpstra Test" msgstr "" #: src/language/stats/jonckheere-terpstra.c:364 #, c-format msgid "Number of levels in %s" msgstr "" #: src/language/stats/jonckheere-terpstra.c:370 #, fuzzy #| msgid "Levene Statistic" msgid "Observed J-T Statistic" msgstr "Estatística de Levene" #: src/language/stats/jonckheere-terpstra.c:371 #, fuzzy #| msgid "Levene Statistic" msgid "Mean J-T Statistic" msgstr "Estatística de Levene" #: src/language/stats/jonckheere-terpstra.c:372 #, fuzzy #| msgid "Std. Deviation" msgid "Std. Deviation of J-T Statistic" msgstr "Desvio padrão" #: src/language/stats/jonckheere-terpstra.c:373 #, fuzzy #| msgid "Test Statistics" msgid "Std. J-T Statistic" msgstr "Testes estatísticos" #: src/language/stats/mann-whitney.c:187 src/language/stats/wilcoxon.c:246 #, fuzzy msgid "Sum of Ranks" msgstr "Soma dos quadrados" #: src/language/stats/mann-whitney.c:248 msgid "Mann-Whitney U" msgstr "" #: src/language/stats/mann-whitney.c:249 msgid "Wilcoxon W" msgstr "" #: src/language/stats/mann-whitney.c:250 src/language/stats/runs.c:327 #: src/language/stats/wilcoxon.c:283 msgid "Z" msgstr "" #: src/language/stats/means.c:702 #, fuzzy msgid "Included" msgstr "Esperado" #: src/language/stats/means.c:704 src/language/stats/reliability.c:548 #, fuzzy msgid "Excluded" msgstr "Esperado" #: src/language/stats/means.c:753 msgid "Report" msgstr "" #: src/language/stats/means.c:838 #, c-format msgid "" "The table \"%s\" has no non-empty control variables. No result for this " "table will be displayed." msgstr "" #: src/language/stats/means-calc.c:443 #, fuzzy #| msgid "Groups based on:" msgid "Group Median" msgstr "Grupos baseados em:" #: src/language/stats/means-calc.c:455 #, fuzzy #| msgid "First case" msgid "First" msgstr "Primeiro caso" #: src/language/stats/means-calc.c:456 #, fuzzy #| msgid "Last case" msgid "Last" msgstr "Último caso" #: src/language/stats/means-calc.c:458 #, fuzzy #| msgid "Percent" msgid "Percent N" msgstr "Percentual" #: src/language/stats/means-calc.c:459 #, fuzzy #| msgid "Percent" msgid "Percent Sum" msgstr "Percentual" #: src/language/stats/means-calc.c:461 msgid "Harmonic Mean" msgstr "" #: src/language/stats/means-calc.c:462 msgid "Geom. Mean" msgstr "" #: src/language/stats/mcnemar.c:144 msgid "The McNemar test is appropriate only for dichotomous variables" msgstr "" #: src/language/stats/mcnemar.c:226 src/language/stats/sign.c:105 msgid "Point Probability" msgstr "" #: src/language/stats/mcnemar.c:229 src/language/stats/sign.c:78 #: src/language/stats/sign.c:108 src/language/stats/t-test-paired.c:199 #: src/language/stats/t-test-paired.c:257 src/language/stats/wilcoxon.c:253 #: src/language/stats/wilcoxon.c:292 msgid "Pairs" msgstr "" #: src/language/stats/median.c:316 msgid "> Median" msgstr "" #: src/language/stats/median.c:316 msgid "≤ Median" msgstr "" #: src/language/stats/npar.c:536 #, fuzzy, c-format #| msgid "%s is not currently supported." msgid "%s subcommand not currently implemented." msgstr "%s não é atualmente suportada." #: src/language/stats/npar.c:691 #, fuzzy, c-format #| msgid "expecting number" msgid "Expecting %s, %s, %s or a number." msgstr "esperando número" #: src/language/stats/npar.c:845 #, c-format msgid "" "The specified value of HI (%d) is lower than the specified value of LO (%d)" msgstr "" #: src/language/stats/npar.c:897 #, c-format msgid "" "%d expected values were given, but the specified range (%d-%d) requires " "exactly %d values." msgstr "" #: src/language/stats/npar.c:1118 src/language/stats/t-test-parser.c:173 #, c-format msgid "" "PAIRED was specified but the number of variables preceding WITH (%zu) did " "not match the number following (%zu)." msgstr "" #: src/language/stats/oneway.c:361 msgid "LSD" msgstr "" #: src/language/stats/oneway.c:362 src/ui/gui/oneway.ui:338 #, fuzzy #| msgid "Tukey" msgid "Tukey HSD" msgstr "Tukey" #: src/language/stats/oneway.c:363 src/ui/gui/oneway.ui:253 msgid "Bonferroni" msgstr "" #: src/language/stats/oneway.c:364 src/ui/gui/oneway.ui:304 msgid "Scheffé" msgstr "" #: src/language/stats/oneway.c:365 msgid "Games-Howell" msgstr "" #: src/language/stats/oneway.c:366 src/ui/gui/oneway.ui:321 msgid "Šidák" msgstr "" #: src/language/stats/oneway.c:519 #, c-format msgid "The post hoc analysis method %s is not supported." msgstr "" #: src/language/stats/oneway.c:842 #, c-format msgid "" "Dependent variable %s has no non-missing values. No analysis for this " "variable will be done." msgstr "" #: src/language/stats/oneway.c:924 #, c-format msgid "" "In contrast list %zu, the number of coefficients (%zu) does not equal the " "number of groups (%d). This contrast list will be ignored." msgstr "" #: src/language/stats/oneway.c:936 #, c-format msgid "Coefficients for contrast %zu do not total zero" msgstr "" #: src/language/stats/oneway.c:971 msgid "ANOVA" msgstr "ANOVA" #: src/language/stats/oneway.c:974 src/language/stats/regression.c:1024 msgid "Sum of Squares" msgstr "Soma dos quadrados" #: src/language/stats/oneway.c:981 msgid "Between Groups" msgstr "" #: src/language/stats/oneway.c:981 msgid "Within Groups" msgstr "" #: src/language/stats/oneway.c:1075 src/language/stats/oneway.c:1257 #, fuzzy #| msgid "Dependent _Variable(s):" msgid "Dependent Variable" msgstr "_Variável(s) Dependente(s)" #: src/language/stats/oneway.c:1148 msgid "Test of Homogeneity of Variances" msgstr "" #: src/language/stats/oneway.c:1151 msgid "Levene Statistic" msgstr "Estatística de Levene" #: src/language/stats/oneway.c:1152 msgid "df1" msgstr "" #: src/language/stats/oneway.c:1153 msgid "df2" msgstr "" #: src/language/stats/oneway.c:1192 msgid "Contrast Coefficients" msgstr "" #: src/language/stats/oneway.c:1199 src/language/stats/oneway.c:1246 msgid "Contrast" msgstr "" #: src/language/stats/oneway.c:1236 msgid "Contrast Tests" msgstr "" #: src/language/stats/oneway.c:1239 msgid "Value of Contrast" msgstr "" #: src/language/stats/oneway.c:1241 src/language/stats/regression.c:905 #: src/language/stats/t-test-indep.c:266 #: src/language/stats/t-test-one-sample.c:74 #: src/language/stats/t-test-paired.c:252 msgid "t" msgstr "" #: src/language/stats/oneway.c:1252 msgid "Assumption" msgstr "" #: src/language/stats/oneway.c:1253 msgid "Assume equal variances" msgstr "" #: src/language/stats/oneway.c:1254 msgid "Does not assume equal variances" msgstr "" #: src/language/stats/oneway.c:1367 #, c-format msgid "Multiple Comparisons (%s)" msgstr "" #: src/language/stats/oneway.c:1374 msgid "Mean Difference (I - J)" msgstr "" #: src/language/stats/oneway.c:1379 #, fuzzy, c-format #| msgid "95%% Confidence Interval" msgid "%g%% Confidence Interval" msgstr "Intervalo de confiança de 95%%" #: src/language/stats/oneway.c:1386 src/language/stats/oneway.c:1390 msgid "(J) Family" msgstr "" #: src/language/stats/oneway.c:1406 msgid "Test" msgstr "" #: src/language/stats/quick-cluster.c:576 msgid "Initial Cluster Centers" msgstr "" #: src/language/stats/quick-cluster.c:577 msgid "Final Cluster Centers" msgstr "" #: src/language/stats/quick-cluster.c:580 #: src/language/stats/quick-cluster.c:660 #: src/language/stats/quick-cluster.c:661 #: src/language/stats/quick-cluster.c:753 msgid "Cluster" msgstr "" #: src/language/stats/quick-cluster.c:658 msgid "Cluster Membership" msgstr "" #: src/language/stats/quick-cluster.c:744 msgid "Number of Cases in each Cluster" msgstr "" #: src/language/stats/quick-cluster.c:750 msgid "Clusters" msgstr "" #: src/language/stats/quick-cluster.c:867 #: src/language/stats/quick-cluster.c:893 #, fuzzy, c-format #| msgid "A vector named %s already exists." msgid "A variable called `%s' already exists." msgstr "Um vetor chamado %s já existe." #: src/language/stats/quick-cluster.c:908 #, c-format msgid "Expecting %s or %s." msgstr "" #: src/language/stats/quick-cluster.c:928 msgid "The number of clusters must be positive" msgstr "" #: src/language/stats/quick-cluster.c:944 msgid "The convergence criterion must be positive" msgstr "" #: src/language/stats/quick-cluster.c:960 msgid "The number of iterations must be positive" msgstr "" #: src/language/stats/rank.c:205 #, c-format msgid "" "Cannot generate variable name for ranking %s with %s. All candidates in use." msgstr "" #: src/language/stats/rank.c:321 #, fuzzy, c-format #| msgid "Too many values in single command." msgid "Too many variables in %s clause." msgstr "Muitos valores em um único comando." #: src/language/stats/rank.c:323 #, c-format msgid "Variable %s already exists." msgstr "" #: src/language/stats/rank.c:325 src/language/expressions/evaluate.c:164 #, c-format msgid "Duplicate variable name %s." msgstr "Nome de variável %s duplicado." #: src/language/stats/rank.c:631 #, c-format msgid "%s of %s by %s" msgstr "" #: src/language/stats/rank.c:825 msgid "Variables Created by RANK" msgstr "" #: src/language/stats/rank.c:828 src/language/stats/rank.c:829 #, fuzzy #| msgid "Name Variable:" msgid "New Variable" msgstr "Nome da Variável" #: src/language/stats/rank.c:829 #, fuzzy #| msgid "Functions:" msgid "Function" msgstr "Funções:" #: src/language/stats/rank.c:830 #, fuzzy #| msgid "Functions:" msgid "Fraction" msgstr "Funções:" #: src/language/stats/rank.c:830 #, fuzzy #| msgid "Variables" msgid "Grouping Variables" msgstr "Variáveis" #: src/language/stats/rank.c:833 src/language/stats/rank.c:834 #, fuzzy #| msgid "Insert Variable" msgid "Existing Variable" msgstr "Inserir Variáveis" #: src/language/stats/reliability.c:164 msgid "Reliability on a single variable is not useful." msgstr "" #: src/language/stats/reliability.c:281 msgid "" "The STATISTICS subcommand is not yet implemented. No statistics will be " "produced." msgstr "" #: src/language/stats/reliability.c:300 msgid "The split point must be less than the number of variables" msgstr "" #: src/language/stats/reliability.c:525 #, fuzzy, c-format #| msgid "Scale" msgid "Scale: %s" msgstr "Escalar" #: src/language/stats/reliability.c:582 #, fuzzy msgid "Item-Total Statistics" msgstr "Testes estatísticos" #: src/language/stats/reliability.c:585 msgid "Scale Mean if Item Deleted" msgstr "" #: src/language/stats/reliability.c:586 msgid "Scale Variance if Item Deleted" msgstr "" #: src/language/stats/reliability.c:587 msgid "Corrected Item-Total Correlation" msgstr "" #: src/language/stats/reliability.c:588 msgid "Cronbach's Alpha if Item Deleted" msgstr "" #: src/language/stats/reliability.c:627 #, fuzzy msgid "Reliability Statistics" msgstr "Testes estatísticos" #: src/language/stats/reliability.c:634 src/language/stats/reliability.c:646 msgid "Cronbach's Alpha" msgstr "" #: src/language/stats/reliability.c:635 src/language/stats/reliability.c:649 #: src/language/stats/reliability.c:652 msgid "N of Items" msgstr "" #: src/language/stats/reliability.c:647 #, fuzzy msgid "Part 1" msgstr "Var 1" #: src/language/stats/reliability.c:650 #, fuzzy msgid "Part 2" msgstr "Var 2" #: src/language/stats/reliability.c:654 msgid "Total N of Items" msgstr "" #: src/language/stats/reliability.c:656 msgid "Correlation Between Forms" msgstr "" #: src/language/stats/reliability.c:659 msgid "Spearman-Brown Coefficient" msgstr "" #: src/language/stats/reliability.c:660 msgid "Equal Length" msgstr "" #: src/language/stats/reliability.c:661 msgid "Unequal Length" msgstr "" #: src/language/stats/reliability.c:663 msgid "Guttman Split-Half Coefficient" msgstr "" #: src/language/stats/roc.c:966 msgid "Area Under the Curve" msgstr "" #: src/language/stats/roc.c:970 msgid "Area" msgstr "" #: src/language/stats/roc.c:976 #, fuzzy msgid "Asymptotic Sig." msgstr "Asymp. Sig." #: src/language/stats/roc.c:979 #, fuzzy, c-format msgid "Asymp. %g%% Confidence Interval" msgstr "Intervalo de confiança de 95%%" #: src/language/stats/roc.c:987 #, fuzzy msgid "Variable under test" msgstr "Variáveis" #: src/language/stats/roc.c:1026 #, fuzzy msgid "Case Summary" msgstr "Sumário." #: src/language/stats/roc.c:1030 #, fuzzy msgid "Unweighted" msgstr "Sem ponderação." #: src/language/stats/roc.c:1031 #, fuzzy msgid "Weighted" msgstr "Peso:" #: src/language/stats/roc.c:1064 msgid "Coordinates of the Curve" msgstr "" #: src/language/stats/roc.c:1068 msgid "Positive if greater than or equal to" msgstr "" #: src/language/stats/roc.c:1069 src/output/charts/roc-chart-cairo.c:38 msgid "Sensitivity" msgstr "" #: src/language/stats/roc.c:1069 src/output/charts/roc-chart-cairo.c:37 msgid "1 - Specificity" msgstr "" #: src/language/stats/roc.c:1072 #, fuzzy #| msgid "ordinary" msgid "Coordinates" msgstr "ordinária" #: src/language/stats/roc.c:1076 #, fuzzy msgid "Test variable" msgstr "Variável(is) de teste:" #: src/language/stats/regression.c:224 src/language/stats/regression.c:229 #, fuzzy, c-format #| msgid "%s may not appear after TEMPORARY." msgid "VARIABLES may not appear after %s" msgstr "%s não pode aparecer após TEMPORARY." #: src/language/stats/regression.c:412 #, fuzzy #| msgid "" #| "FLIP ignores TEMPORARY. Temporary transformations will be made permanent." msgid "" "REGRESSION with SAVE ignores TEMPORARY. Temporary transformations will be " "made permanent." msgstr "" "FLIP ignora TEMPORARY. Transformações temporárias serão feitas permanentes." #: src/language/stats/regression.c:416 msgid "REGRESSION with SAVE ignores FILTER. All cases will be processed." msgstr "" #: src/language/stats/regression.c:569 msgid "" "The dependent variable is equal to the independent variable. The least " "squares line is therefore Y=X. Standard errors and related statistics may be " "meaningless." msgstr "" #: src/language/stats/regression.c:776 msgid "No valid data found. This command was skipped." msgstr "" #: src/language/stats/regression.c:863 #, fuzzy, c-format msgid "Model Summary (%s)" msgstr "Sumário." #: src/language/stats/regression.c:868 #: src/ui/gui/psppire-dialog-action-regression.c:42 msgid "R" msgstr "" #: src/language/stats/regression.c:868 msgid "R Square" msgstr "" #: src/language/stats/regression.c:868 msgid "Adjusted R Square" msgstr "" #: src/language/stats/regression.c:869 msgid "Std. Error of the Estimate" msgstr "" #: src/language/stats/regression.c:895 #, fuzzy, c-format #| msgid "Coefficients" msgid "Coefficients (%s)" msgstr "Coeficientes" #: src/language/stats/regression.c:901 #, fuzzy #| msgid "Coefficients" msgid "Unstandardized Coefficients" msgstr "Coeficientes" #: src/language/stats/regression.c:904 #, fuzzy #| msgid "Coefficients" msgid "Standardized Coefficients" msgstr "Coeficientes" #: src/language/stats/regression.c:904 msgid "Beta" msgstr "" #: src/language/stats/regression.c:911 #, fuzzy, c-format #| msgid "95%% Confidence Interval" msgid "%g%% Confidence Interval for B" msgstr "Intervalo de confiança de 95%%" #: src/language/stats/regression.c:919 #, fuzzy msgid "Collinearity Statistics" msgstr "Testes estatísticos" #: src/language/stats/regression.c:920 #, fuzzy #| msgid "Covariances" msgid "Tolerance" msgstr "Co-variança" #: src/language/stats/regression.c:920 msgid "VIF" msgstr "" #: src/language/stats/regression.c:933 msgid "(Constant)" msgstr "" #: src/language/stats/regression.c:1020 #, fuzzy, c-format #| msgid "ANOVA" msgid "ANOVA (%s)" msgstr "ANOVA" #: src/language/stats/regression.c:1031 src/ui/gui/regression.ui:24 msgid "Regression" msgstr "Regressão" #: src/language/stats/regression.c:1075 #, fuzzy, c-format #| msgid "Coefficient Total: " msgid "Coefficient Correlations (%s)" msgstr "Coeficiente Total: " #: src/language/stats/regression.c:1082 #, fuzzy #| msgid "Model" msgid "Models" msgstr "Modelo" #: src/language/stats/regression.c:1090 msgid "Covariances" msgstr "Co-variança" #: src/language/stats/runs.c:169 #, c-format msgid "" "Multiple modes exist for variable `%s'. Using %.*g as the threshold value." msgstr "" #: src/language/stats/runs.c:314 src/ui/gui/runs.ui:24 msgid "Runs Test" msgstr "" #: src/language/stats/runs.c:319 #, fuzzy #| msgid "Test Value: " msgid "Test Value" msgstr "Valor de teste: " #: src/language/stats/runs.c:320 #, fuzzy #| msgid "Test Value: " msgid "Test Value (mode)" msgstr "Valor de teste: " #: src/language/stats/runs.c:321 #, fuzzy #| msgid "Test Value: " msgid "Test Value (mean)" msgstr "Valor de teste: " #: src/language/stats/runs.c:322 #, fuzzy #| msgid "Test Value: " msgid "Test Value (median)" msgstr "Valor de teste: " #: src/language/stats/runs.c:323 #, fuzzy #| msgid "Test Value: " msgid "Cases < Test Value" msgstr "Valor de teste: " #: src/language/stats/runs.c:324 #, fuzzy #| msgid "Test Value: " msgid "Cases ≥ Test Value" msgstr "Valor de teste: " #: src/language/stats/runs.c:325 #, fuzzy #| msgid "_Sort Cases" msgid "Total Cases" msgstr "_Ordenar Casos" #: src/language/stats/runs.c:326 #, fuzzy msgid "Number of Runs" msgstr "Soma dos quadrados" #: src/language/stats/sign.c:72 msgid "Differences" msgstr "" #: src/language/stats/sign.c:73 msgid "Negative Differences" msgstr "" #: src/language/stats/sign.c:74 msgid "Positive Differences" msgstr "" #: src/language/stats/sign.c:75 src/language/stats/wilcoxon.c:250 #, fuzzy msgid "Ties" msgstr "Ntiles" #: src/language/stats/sort-cases.c:63 msgid "Buffer limit must be at least 2." msgstr "" #: src/language/stats/sort-criteria.c:89 #, c-format msgid "Variable %s specified twice in sort criteria." msgstr "" #: src/language/stats/t-test-indep.c:190 msgid "Group Statistics" msgstr "" #: src/language/stats/t-test-indep.c:200 #, fuzzy #| msgid "Group1" msgid "Group" msgstr "Grupo 1" #: src/language/stats/t-test-indep.c:256 msgid "Independent Samples Test" msgstr "Teste de Amostras Independentes" #: src/language/stats/t-test-indep.c:261 msgid "Levene's Test for Equality of Variances" msgstr "Teste de Levene para Igualdade de Varianças" #: src/language/stats/t-test-indep.c:265 #, fuzzy #| msgid "t-test for Equality of Means" msgid "T-Test for Equality of Means" msgstr "teste t para Igualdade de Médias" #: src/language/stats/t-test-indep.c:269 #: src/language/stats/t-test-one-sample.c:77 msgid "Mean Difference" msgstr "" #: src/language/stats/t-test-indep.c:270 msgid "Std. Error Difference" msgstr "" #: src/language/stats/t-test-indep.c:273 #, fuzzy, no-c-format #| msgid "95%% Confidence Interval" msgid "95% Confidence Interval of the Difference" msgstr "Intervalo de confiança de 95%%" #: src/language/stats/t-test-indep.c:277 #, fuzzy #| msgid "Options:" msgid "Assumptions" msgstr "Opções:" #: src/language/stats/t-test-indep.c:278 msgid "Equal variances assumed" msgstr "" #: src/language/stats/t-test-indep.c:279 msgid "Equal variances not assumed" msgstr "" #: src/language/stats/t-test-one-sample.c:64 msgid "One-Sample Test" msgstr "" #: src/language/stats/t-test-one-sample.c:71 #, fuzzy, c-format #| msgid "Test Value: " msgid "Test Value = %.*g" msgstr "Valor de teste: " #: src/language/stats/t-test-one-sample.c:80 #: src/language/stats/t-test-paired.c:246 #, c-format msgid "%g%% Confidence Interval of the Difference" msgstr "" #: src/language/stats/t-test-one-sample.c:122 msgid "One-Sample Statistics" msgstr "" #: src/language/stats/t-test-paired.c:147 msgid "Paired Sample Statistics" msgstr "" #: src/language/stats/t-test-paired.c:163 #: src/language/stats/t-test-paired.c:205 #: src/language/stats/t-test-paired.c:263 #, c-format msgid "Pair %zu" msgstr "" #: src/language/stats/t-test-paired.c:190 msgid "Paired Samples Correlations" msgstr "" #: src/language/stats/t-test-paired.c:208 #, c-format msgid "%s & %s" msgstr "" #: src/language/stats/t-test-paired.c:234 msgid "Paired Samples Test" msgstr "" #: src/language/stats/t-test-paired.c:240 msgid "Paired Differences" msgstr "" #: src/language/stats/t-test-paired.c:266 #, c-format msgid "%s - %s" msgstr "" #: src/language/stats/t-test-parser.c:133 #, fuzzy, c-format #| msgid "At least one variable must be specified." msgid "When applying %s to a string variable, two values must be specified." msgstr "Pelo menos uma variável deve ser especificada." #: src/language/stats/t-test-parser.c:145 #: src/language/stats/t-test-parser.c:241 #, fuzzy, c-format msgid "%s subcommand may not be used with %s." msgstr "O subcomando END só pode ser usado dentro de INPUT PROGRAM." #: src/language/stats/t-test-parser.c:305 #, fuzzy msgid "Exactly one of TESTVAL, GROUPS and PAIRS subcommands must be specified." msgstr "TESTVAL, GROUPS e PAIRS subcomandos são mutualmente excludentes." #: src/language/stats/wilcoxon.c:248 msgid "Sign" msgstr "" #: src/language/stats/wilcoxon.c:249 #, fuzzy msgid "Negative Ranks" msgstr "negativo" #: src/language/stats/wilcoxon.c:249 #, fuzzy msgid "Positive Ranks" msgstr "Posição" #: src/language/stats/wilcoxon.c:296 msgid "Too many pairs to calculate exact significance" msgstr "" #: src/language/data-io/combine-files.c:214 #, fuzzy #| msgid "" #| "Cannot specify the active file since no active file has been defined." msgid "Cannot specify the active dataset since none has been defined." msgstr "" "Impossível especificar o arquivo ativo uma vez que nenhum arquivo ativo foi " "definido." #: src/language/data-io/combine-files.c:220 #, fuzzy msgid "" "This command may not be used after TEMPORARY when the active dataset is an " "input source. Temporary transformations will be made permanent." msgstr "" "FLIP ignora TEMPORARY. Transformações temporárias serão feitas permanentes." #: src/language/data-io/combine-files.c:255 msgid "Multiple IN subcommands for a single FILE or TABLE." msgstr "Múltiplos subcomandos IN para um único FILE ou TABLE" #: src/language/data-io/combine-files.c:308 #, c-format msgid "File %s lacks BY variable %s." msgstr "Arquivo %s não possui variável BY %s." #: src/language/data-io/combine-files.c:311 #, fuzzy, c-format #| msgid "File %s lacks BY variable %s." msgid "Active dataset lacks BY variable %s." msgstr "Arquivo %s não possui variável BY %s." #: src/language/data-io/combine-files.c:388 #: src/language/data-io/combine-files.c:393 #, fuzzy, c-format msgid "BY is required when %s is specified." msgstr "BY é necessário quando IN é especificado." #: src/language/data-io/combine-files.c:521 msgid "" "Combining files with incompatible encodings. String data may not be " "represented correctly." msgstr "" #: src/language/data-io/combine-files.c:564 #, c-format msgid "" "Variable %s in file %s has different type or width from the same variable in " "earlier file." msgstr "" #: src/language/data-io/combine-files.c:570 #, c-format msgid "In file %s, %s is numeric." msgstr "" #: src/language/data-io/combine-files.c:573 #, fuzzy, c-format msgid "In file %s, %s is a string variable with width %d." msgstr "Comprimento %d de variável inválido." #: src/language/data-io/combine-files.c:578 #, c-format msgid "In an earlier file, %s was numeric." msgstr "" #: src/language/data-io/combine-files.c:581 #, fuzzy, c-format msgid "In an earlier file, %s was a string variable with width %d." msgstr "Já existe uma variável string %s de comprimento diferente." #: src/language/data-io/combine-files.c:621 #, c-format msgid "" "Variable name %s specified on %s subcommand duplicates an existing variable " "name." msgstr "" #: src/language/data-io/combine-files.c:793 #, c-format msgid "Encountered %zu sets of duplicate cases in the master file." msgstr "" #: src/language/data-io/data-list.c:129 src/language/data-io/data-list.c:144 #, fuzzy, c-format #| msgid "The weighting variable must be numeric." msgid "The %s value must be non-negative." msgstr "A variável de ponderação deve ser numérica." #: src/language/data-io/data-list.c:154 #, fuzzy, c-format #| msgid "The END subcommand may only be used within INPUT PROGRAM." msgid "The %s subcommand may only be used within %s." msgstr "O subcomando END só pode ser usado dentro de INPUT PROGRAM." #: src/language/data-io/data-list.c:159 #, fuzzy, c-format #| msgid "The END subcommand may only be specified once." msgid "The %s subcommand may only be specified once." msgstr "O subcomando END só pode ser especificado uma vez." #: src/language/data-io/data-list.c:197 msgid "Only one of FIXED, FREE, or LIST may be specified." msgstr "Apenas um FIXED, FREE ou LIST pode ser especificado." #: src/language/data-io/data-list.c:260 msgid "Encoding should not be specified for inline data. It will be ignored." msgstr "" #: src/language/data-io/data-list.c:269 #, fuzzy, c-format #| msgid "The END subcommand may be used only with DATA LIST FIXED." msgid "The %s subcommand may be used only with %s." msgstr "O subcomando END só pode ser usado com DATA LIST FIXED." #: src/language/data-io/data-list.c:284 src/language/data-io/matrix-data.c:578 msgid "At least one variable must be specified." msgstr "Pelo menos uma variável deve ser especificada." #: src/language/data-io/data-list.c:383 src/language/data-io/data-list.c:491 #: src/language/data-io/get-data.c:662 #, c-format msgid "%s is a duplicate variable name." msgstr "%s é um nome de variável duplicado." #: src/language/data-io/data-list.c:390 #, c-format msgid "There is already a variable %s of a different type." msgstr "Já existe uma variável %s de um tipo diferente." #: src/language/data-io/data-list.c:397 #, c-format msgid "There is already a string variable %s of a different width." msgstr "Já existe uma variável string %s de comprimento diferente." #: src/language/data-io/data-list.c:405 #, c-format msgid "Cannot place variable %s on record %d when RECORDS=%d is specified." msgstr "" "Impossível colocar variável %s no registro %d quando RECORDS=%d está " "especificado." #: src/language/data-io/data-parser.c:453 #: src/language/data-io/data-parser.c:462 msgid "Quoted string extends beyond end of line." msgstr "String entre aspas se estende além do fim da linha." #: src/language/data-io/data-parser.c:488 msgid "Missing delimiter following quoted string." msgstr "" #: src/language/data-io/data-parser.c:506 #, fuzzy, c-format #| msgid "%s variable %s has invalid %s format %s." msgid "Data for variable %s is not valid as format %s: %s" msgstr "%s variável %s tem um inválido %s formato %s." #: src/language/data-io/data-parser.c:536 #, c-format msgid "Partial case of %d of %d records discarded." msgstr "Caso parcial dos registros %d a %d descartados." #: src/language/data-io/data-parser.c:592 #, c-format msgid "Partial case discarded. The first variable missing was %s." msgstr "Casos parciais descartados. A primeira variável ausente foi %s." #: src/language/data-io/data-parser.c:634 #, c-format msgid "" "Missing value(s) for all variables from %s onward. These will be filled " "with the system-missing value or blanks, as appropriate." msgstr "" #: src/language/data-io/data-parser.c:655 msgid "Record ends in data not part of any field." msgstr "Registro termina em dados que não fazem parte de nenhum campo." #: src/language/data-io/data-parser.c:670 #, c-format msgid "Reading %d record from %s." msgid_plural "Reading %d records from %s." msgstr[0] "" msgstr[1] "" #: src/language/data-io/data-parser.c:680 src/language/data-io/print.c:435 msgid "Record" msgstr "Registro" #: src/language/data-io/data-parser.c:680 src/language/data-io/print.c:435 #: src/ui/gui/psppire-var-sheet-header.c:76 msgid "Columns" msgstr "Colunas" #: src/language/data-io/data-parser.c:680 #: src/language/data-io/data-parser.c:725 src/language/data-io/print.c:435 msgid "Format" msgstr "Formato" #: src/language/data-io/data-parser.c:720 #, c-format msgid "Reading free-form data from %s." msgstr "" #. TRANSLATORS: this fragment will be interpolated into #. messages in fh_lock() that identify types of files. #: src/language/data-io/data-reader.c:136 src/language/data-io/data-writer.c:79 msgid "data file" msgstr "arquivo de dados" #: src/language/data-io/data-reader.c:160 #, fuzzy, c-format #| msgid "Could not open \"%s\" for reading as a data file: %s." msgid "Could not open `%s' for reading as a data file: %s." msgstr "Impossível abrir \"%s\" para leitura como um arquivo de dados: %s." #: src/language/data-io/data-reader.c:174 #, c-format msgid "Could not read `%s' as a text file with encoding `%s': %s." msgstr "" #: src/language/data-io/data-reader.c:233 #, fuzzy, c-format #| msgid "" #| "Unexpected end-of-file while reading data in BEGIN DATA. This probably " #| "indicates a missing or misformatted END DATA command. END DATA must " #| "appear by itself on a single line with exactly one space between words." msgid "" "Missing %s while reading inline data. This probably indicates a missing or " "incorrectly formatted %s command. %s must appear by itself on a single line " "with exactly one space between words." msgstr "" "Fim-de-arquivo inesperado ao ler dados com BEGIN DATA. Isto provavelmente " "indica um END DATA ausente ou mal formatado. END DATA deve aparecer sozinho " "em uma única linha com exatamente um espaço entre as palavras." #: src/language/data-io/data-reader.c:253 #: src/language/data-io/data-reader.c:387 #, c-format msgid "Error reading file %s: %s." msgstr "Erro lendo arquivo %s: %s." #: src/language/data-io/data-reader.c:261 #, c-format msgid "Unexpected end of file in partial record reading %s." msgstr "Fim de arquivo inesperado em registro parcial ao ler %s." #: src/language/data-io/data-reader.c:321 #, c-format msgid "Corrupt block descriptor word at offset 0x%lx in %s." msgstr "Palavra descritora de bloco corrompida no offset 0x%lx em %s." #: src/language/data-io/data-reader.c:322 #, c-format msgid "Corrupt record descriptor word at offset 0x%lx in %s." msgstr "Palavra descritora de registro corrompida no offset 0x%lx em %s." #: src/language/data-io/data-reader.c:335 #, c-format msgid "Corrupt record size at offset 0x%lx in %s." msgstr "Tamanho de registro corrompido no offset 0x%lx em %s." #: src/language/data-io/data-reader.c:493 msgid "Record exceeds remaining block length." msgstr "Registro excede tamanho restante de bloco." #: src/language/data-io/data-reader.c:567 #, c-format msgid "Attempt to read beyond end-of-file on file %s." msgstr "Tentativa de ler arquivo %s além de seu fim." #: src/language/data-io/data-reader.c:570 #, fuzzy, c-format #| msgid "Attempt to read beyond END DATA." msgid "Attempt to read beyond %s." msgstr "Tentativa de ler além de END DATA." # inline? #: src/language/data-io/data-reader.c:733 msgid "" "This command is not valid here since the current input program does not " "access the inline file." msgstr "" "Este comando não é válido aqui, pois a entrada do programa atual não acessa " "arquivo inline." #: src/language/data-io/data-writer.c:106 #, fuzzy, c-format #| msgid "" #| "An error occurred while opening \"%s\" for writing as a data file: %s." msgid "An error occurred while opening `%s' for writing as a data file: %s." msgstr "" "Um erro ocorreu ao abrir \"%s\" para gravação como um arquivo de dados: %s." #: src/language/data-io/data-writer.c:224 #, fuzzy, c-format #| msgid "I/O error occurred writing data file \"%s\"." msgid "I/O error occurred writing data file `%s'." msgstr "Ocorreu um erro de E/S gravando no arquivo de dados \"%s\"." #: src/language/data-io/dataset.c:64 #, fuzzy, c-format #| msgid "There is no vector named %s." msgid "There is no dataset named %s." msgstr "Não existe vetor de nome %s." #: src/language/data-io/dataset.c:250 #, fuzzy #| msgid "_Data" msgid "Datasets" msgstr "_Dados" #: src/language/data-io/dataset.c:263 msgid "unnamed dataset" msgstr "" #: src/language/data-io/file-handle.c:61 #, fuzzy, c-format #| msgid "" #| "File handle %s is already defined. Use CLOSE FILE HANDLE before " #| "redefining a file handle." msgid "" "File handle %s is already defined. Use %s before redefining a file handle." msgstr "" "Manipulador de arquivo %s já está definido. Use CLOSE FILE HANDLER antes de " "redefinir um manipulador." #: src/language/data-io/file-handle.c:241 #, fuzzy, c-format #| msgid "RECFORM must be specified with MODE=360." msgid "%s must be specified with %s." msgstr "RECFORM deve ser especificado com MODE=360" #: src/language/data-io/file-handle.c:252 #, fuzzy, c-format #| msgid "" #| "The specified file mode requires LRECL. Assuming %d-character records." msgid "" "The specified file mode requires LRECL. Assuming %zu-character records." msgstr "" "O modo de arquivo especificado requer LRECL. Assumindo registros de %d " "caracteres." #: src/language/data-io/file-handle.c:256 #, fuzzy, c-format #| msgid "" #| "Record length (%ld) must be between 1 and %lu bytes. Assuming %d-" #| "character records." msgid "" "Record length (%d) must be between 1 and %lu bytes. Assuming %zu-character " "records." msgstr "" "Tamanho de registro (%ld) deve ser entre 1 e %lu bytes. Assumindo registros " "de %d caracteres." #: src/language/data-io/file-handle.c:300 msgid "file" msgstr "arquivo" #: src/language/data-io/file-handle.c:302 msgid "inline file" msgstr "arquivo inline" #: src/language/data-io/file-handle.c:350 msgid "expecting a file name or handle name" msgstr "esperando nome de arquivo ou de manipulador" #: src/language/data-io/file-handle.c:365 #, c-format msgid "Handle for %s not allowed here." msgstr "Manipulador para %s não é permitido aqui." #: src/language/data-io/get-data.c:108 src/output/measure.c:262 #, fuzzy, c-format #| msgid "Error reading file %s: %s." msgid "error reading file `%s'" msgstr "Erro lendo arquivo %s: %s." #: src/language/data-io/get-data.c:127 #, fuzzy, c-format #| msgid "Unsupported TYPE %s" msgid "Unsupported TYPE %s." msgstr "TYPE %s não suportado" #: src/language/data-io/get-data.c:278 msgid "The sheet index must be greater than or equal to 1" msgstr "" #: src/language/data-io/get-data.c:285 src/language/data-io/get-data.c:308 #: src/language/data-io/get-data.c:327 #, c-format msgid "%s must be followed by either \"%s\" or \"%s\"." msgstr "" #: src/language/data-io/get-data.c:357 #, c-format msgid "" "%s is allowed only with %s arrangement, but %s arrangement was stated or " "implied earlier in this command." msgstr "" #: src/language/data-io/get-data.c:441 src/language/data-io/get-data.c:479 #, fuzzy, c-format #| msgid "Value of FIRSTCASE must be 1 or greater." msgid "Value of %s must be 1 or greater." msgstr "Valor de FIRSTCASE deve ser maior ou igual a 1." #: src/language/data-io/get-data.c:504 msgid "" "Ignoring obsolete IMPORTCASES subcommand. (N OF CASES or SAMPLE may be used " "to substitute.)" msgstr "" #: src/language/data-io/get-data.c:551 msgid "" "In compatible syntax mode, the QUALIFIER string must contain exactly one " "character." msgstr "" "No modo de sintaxe compatível, a strint QUALIFIER deve conter exatamente um " "caractere." #: src/language/data-io/get-data.c:583 #, c-format msgid "" "The record number specified, %ld, is at or before the previous record, %d. " "Data fields must be listed in order of increasing record number." msgstr "" #: src/language/data-io/get-data.c:592 #, c-format msgid "" "The record number specified, %ld, exceeds the number of records per case " "specified on FIXCASE, %d." msgstr "" #: src/language/data-io/get.c:132 #, fuzzy, c-format #| msgid "The active file dictionary does not contain any documents." msgid "%s: Data file dictionary has no variables." msgstr "O arquivo de dicionário ativo não contém nenhum documento." #: src/language/data-io/inpt-pgm.c:133 #, fuzzy, c-format #| msgid "Unexpected end of file reading %s." msgid "Unexpected end-of-file within %s." msgstr "Fim de arquivo não esperado lendo %s." #: src/language/data-io/inpt-pgm.c:146 #, c-format msgid "Input program must contain %s or %s." msgstr "" #: src/language/data-io/inpt-pgm.c:152 msgid "Input program did not create any variables." msgstr "" #: src/language/data-io/inpt-pgm.c:365 msgid "" "REREAD: Column numbers must be positive finite numbers. Column set to 1." msgstr "" #: src/language/data-io/list.c:100 #, fuzzy msgid "Data List" msgstr "%s --- Editor de Dados do PSPP" #: src/language/data-io/list.c:221 #, c-format msgid "" "The first case (%ld) specified precedes the last case (%ld) specified. The " "values will be swapped." msgstr "" #: src/language/data-io/list.c:230 #, c-format msgid "" "The first case (%ld) to list is numbered less than 1. The value is being " "reset to 1." msgstr "" #: src/language/data-io/list.c:237 #, c-format msgid "" "The last case (%ld) to list is numbered less than 1. The value is being " "reset to 1." msgstr "" #: src/language/data-io/list.c:244 #, c-format msgid "The step value %ld is less than 1. The value is being reset to 1." msgstr "" #: src/language/data-io/placement-parser.c:96 #, c-format msgid "" "Number of variables specified (%zu) differs from number of variable formats " "(%zu)." msgstr "" #: src/language/data-io/placement-parser.c:106 msgid "" "SPSS-like or Fortran-like format specification expected after variable names." msgstr "" #: src/language/data-io/placement-parser.c:129 #, c-format msgid "The %d columns %d-%d can't be evenly divided into %zu fields." msgstr "" #: src/language/data-io/placement-parser.c:310 msgid "Column positions for fields must be positive." msgstr "" #: src/language/data-io/placement-parser.c:312 msgid "Column positions for fields must not be negative." msgstr "" #: src/language/data-io/placement-parser.c:372 msgid "The ending column for a field must be greater than the starting column." msgstr "" #: src/language/data-io/placement-parser.c:409 #, c-format msgid "" "The record number specified, %.0f, is at or before the previous record, %d. " "Data fields must be listed in order of increasing record number." msgstr "" #: src/language/data-io/print-space.c:127 #, c-format msgid "The expression on %s evaluated to the system-missing value." msgstr "" #: src/language/data-io/print-space.c:130 #, fuzzy, c-format #| msgid "Use expression as label" msgid "The expression on %s evaluated to %g." msgstr "Usar expressão como rótulo" #: src/language/data-io/print.c:189 src/language/data-io/trim.c:58 msgid "expecting a valid subcommand" msgstr "esperando um subcomando válido" #: src/language/data-io/print.c:219 #, fuzzy, c-format msgid "%s is required when binary formats are specified." msgstr "BY é necessário quando IN é especificado." #: src/language/data-io/print.c:302 #, c-format msgid "Output calls for %d records but %zu specified on RECORDS subcommand." msgstr "" #: src/language/data-io/print.c:432 #, fuzzy #| msgid "Case Processing Summary" msgid "Print Summary" msgstr "Sumário de processamento de casos" #: src/language/data-io/print.c:462 #, fuzzy #| msgid "Record" msgid "N of Records" msgstr "Registro" #: src/language/data-io/matrix-data.c:191 #, c-format msgid "" "There are %d variable declared but the data has at least %d matrix rows." msgstr "" #: src/language/data-io/matrix-data.c:292 msgid "" "The N subcommand was specified, but a N record was also found in the data. " "The N record will be ignored." msgstr "" #: src/language/data-io/matrix-data.c:488 src/language/utilities/set.q:186 #, fuzzy, c-format #| msgid "%s is not a variable name." msgid "%s must not be negative." msgstr "%s não é um nome válido." #: src/language/data-io/matrix-data.c:568 #, fuzzy #| msgid "%s and %s are mutually exclusive" msgid "FORMAT = FULL and FORMAT = NODIAGONAL are mutually exclusive." msgstr "%s e %s são mutualmente excludentes" #: src/language/data-io/matrix-reader.c:102 #: src/language/data-io/matrix-reader.c:118 #, fuzzy, c-format #| msgid "File %s lacks BY variable %s." msgid "Matrix dataset lacks a variable called %s." msgstr "Arquivo %s não possui variável BY %s." #: src/language/data-io/matrix-reader.c:109 #: src/language/data-io/matrix-reader.c:125 #, c-format msgid "Matrix dataset variable %s should be of string type." msgstr "" #: src/language/data-io/save-translate.c:168 #: src/language/data-io/save-translate.c:183 #, fuzzy, c-format #| msgid "" #| "In compatible syntax mode, the QUALIFIER string must contain exactly one " #| "character." msgid "The %s string must contain exactly one character." msgstr "" "No modo de sintaxe compatível, a strint QUALIFIER deve conter exatamente um " "caractere." #: src/language/data-io/save-translate.c:249 #, c-format msgid "Output file `%s' exists but %s was not specified." msgstr "" #: src/language/data-io/save.c:309 msgid "The OUTFILE or METADATA subcommand is required." msgstr "" #: src/language/data-io/trim.c:69 #, c-format msgid "" "Cannot rename %s as %s because there already exists a variable named %s. To " "rename variables with overlapping names, use a single RENAME subcommand such " "as `/RENAME (A=B)(B=C)(C=A)', or equivalently, `/RENAME (A B C=B C A)'." msgstr "" #: src/language/data-io/trim.c:227 #, c-format msgid "" "Number of variables on left side of `=' (%zu) does not match number of " "variables on right side (%zu), in parenthesized group %d of RENAME " "subcommand." msgstr "" #: src/language/data-io/trim.c:242 #, c-format msgid "Requested renaming duplicates variable name %s." msgstr "" #: src/language/data-io/trim.c:281 msgid "Cannot DROP all variables from dictionary." msgstr "DROP de todas as variáveis do dicionário impossível." #: src/language/expressions/evaluate.c:151 msgid "expecting number or string" msgstr "esperando número ou string" #: src/language/expressions/helpers.c:43 msgid "" "One of the arguments to a DATE function is not an integer. The result will " "be system-missing." msgstr "" "Um dos argumentos para a função DATE não é um inteiro. O resultado será um " "system-missing." #: src/language/expressions/helpers.c:71 msgid "" "The week argument to DATE.WKYR is not an integer. The result will be system-" "missing." msgstr "" "O argumento semana para DATE.WKYR não é um inteiro. O resultado será um " "system-missing." #: src/language/expressions/helpers.c:77 msgid "" "The week argument to DATE.WKYR is outside the acceptable range of 1 to 53. " "The result will be system-missing." msgstr "" "O argumento semana para DATE.WKYR está fora do intervalo aceitável entre 1 e " "53. O resultado será um system-missing." #: src/language/expressions/helpers.c:99 msgid "" "The day argument to DATE.YRDAY is not an integer. The result will be system-" "missing." msgstr "" "O argumento dia para DATE.YRDAY não é um inteiro. O resultado será um system-" "missing." #: src/language/expressions/helpers.c:105 msgid "" "The day argument to DATE.YRDAY is outside the acceptable range of 1 to 366. " "The result will be system-missing." msgstr "" "O argumento dia para DATE.YRDAY está fora do intervalo aceitável entre 1 e " "366. O resultado será um system-missing." #: src/language/expressions/helpers.c:127 msgid "" "The year argument to YRMODA is greater than 47516. The result will be " "system-missing." msgstr "" "O argumento ano para YRMODA é maior que 47516. O resultado será um system-" "missing." #: src/language/expressions/helpers.c:180 #, fuzzy, c-format #| msgid "" #| "Unrecognized date unit \"%.*s\". Valid date units are \"years\", " #| "\"quarters\", \"months\", \"weeks\", \"days\", \"hours\", \"minutes\", " #| "and \"seconds\"." msgid "" "Unrecognized date unit `%.*s'. Valid date units are `%s', `%s', `%s', `%s', " "`%s', `%s', `%s', and `%s'." msgstr "" "Unidade de data não reconhecido \"%.*s\". Valores válidos de unidade são " "\"years\", \"quarters\", \"months\", \"weeks\", \"days\", \"hours\", " "\"minutes\", and \"seconds\"." #: src/language/expressions/helpers.c:333 #, fuzzy, c-format #| msgid "" #| "Invalid DATESUM method. Valid choices are \"closest\" and \"rollover\"." msgid "Invalid DATESUM method. Valid choices are `%s' and `%s'." msgstr "" "Método DATESUM inválido. Escolhas válidas são \"closest\" and \"rollover\"." #: src/language/expressions/parse.c:261 #, c-format msgid "" "Type mismatch: expression has %s type, but a numeric value is required here." msgstr "" "Incompatibilidade de tipos: expressão tem tipo %s, mas um valor numérico é " "requerido aqui." #: src/language/expressions/parse.c:274 #, c-format msgid "" "Type mismatch: expression has %s type, but a string value is required here." msgstr "" "Incompatibilidade de tipos: expressão tem tipo %s, mas um valor string é " "requerido aqui." #: src/language/expressions/parse.c:436 #, c-format msgid "Type mismatch while applying %s operator: cannot convert %s to %s." msgstr "" "Incompatibilidade de tipos ao aplicar o operador %s: não é possível " "converter %s para %s." #: src/language/expressions/parse.c:650 #, fuzzy #| msgid "" #| "Chaining relational operators (e.g. \"a < b < c\") will not produce the " #| "mathematically expected result. Use the AND logical operator to fix the " #| "problem (e.g. \"a < b AND b < c\"). If chaining is really intended, " #| "parentheses will disable this warning (e.g. \"(a < b) < c\".)" msgid "" "Chaining relational operators (e.g. `a < b < c') will not produce the " "mathematically expected result. Use the AND logical operator to fix the " "problem (e.g. `a < b AND b < c'). If chaining is really intended, " "parentheses will disable this warning (e.g. `(a < b) < c'.)" msgstr "" "Encadear operadores relacionais (i.e. \"a < b < c\") não irá produzir o " "resultado esperado. Use o operador lógico AND para corrigir o problema (i.e. " "\"a < b AND b < c\"). Se o encadeamento é intencional, o uso de parênteses " "irá desabilitar este aviso (i.e. \"(a < b) < c\".)" #: src/language/expressions/parse.c:752 #, fuzzy #| msgid "" #| "The exponentiation operator (\"**\") is left-associative, even though " #| "right-associative semantics are more useful. That is, \"a**b**c\" equals " #| "\"(a**b)**c\", not as \"a**(b**c)\". To disable this warning, insert " #| "parentheses." msgid "" "The exponentiation operator (`**') is left-associative, even though right-" "associative semantics are more useful. That is, `a**b**c' equals " "`(a**b)**c', not as `a**(b**c)'. To disable this warning, insert " "parentheses." msgstr "" "O operador exponencial (\"**\") é associativo à esquerda, mesmo que a " "semântica associativa a direita seja mais útil.Ou seja, \"a**b**c\" equivale " "a \"(a**b)**c\", não a \"a**(b**c)\". Para desabilitar este aviso, insira " "parênteses." #: src/language/expressions/parse.c:832 #, c-format msgid "Unknown system variable %s." msgstr "Variável de sistema %s desconhecida." #: src/language/expressions/parse.c:880 #, c-format msgid "Unknown identifier %s." msgstr "Identificador %s desconhecido." #: src/language/expressions/parse.c:1102 #, c-format msgid "%s must have at least %d arguments in list." msgstr "%s deve ter pelo menos %d argumentos na lista." #: src/language/expressions/parse.c:1111 #, fuzzy, c-format #| msgid "%s must have even number of arguments in list." msgid "%s must have an even number of arguments in list." msgstr "%s deve ter um número par de argumentos na lista." #: src/language/expressions/parse.c:1114 #, c-format msgid "%s must have multiple of %d arguments in list." msgstr "%s deve ter um número de argumentos múltiplo de %d na lista." #: src/language/expressions/parse.c:1124 #, c-format msgid "%s function does not accept a minimum valid argument count." msgstr "" #: src/language/expressions/parse.c:1133 #, c-format msgid "%s requires at least %d valid arguments in list." msgstr "" #: src/language/expressions/parse.c:1139 #, c-format msgid "" "With %s, using minimum valid argument count of %d does not make sense when " "passing only %d arguments in list." msgstr "" #: src/language/expressions/parse.c:1193 #, c-format msgid "Type mismatch invoking %s as " msgstr "Incompatibilidade de tipos invocando %s como " #: src/language/expressions/parse.c:1198 msgid "Function invocation " msgstr "Invocação de função" #: src/language/expressions/parse.c:1200 msgid " does not match any known function. Candidates are:" msgstr " não combina com nenhuma função conhecida. Candidatas são:" #: src/language/expressions/parse.c:1230 #, c-format msgid "No function or vector named %s." msgstr "Nenhuma função ou vetor de nome %s." #: src/language/expressions/parse.c:1292 #, c-format msgid "%s is a PSPP extension." msgstr "%s é uma extensão do PSPP." #: src/language/expressions/parse.c:1295 #, fuzzy, c-format #| msgid "%s is not a variable name." msgid "%s is not available in this version of PSPP." msgstr "%s não é um nome válido." #: src/language/expressions/parse.c:1302 #, fuzzy, c-format #| msgid "%s may not appear after TEMPORARY." msgid "%s may not appear after %s." msgstr "%s não pode aparecer após TEMPORARY." #: src/libpspp/ext-array.c:66 msgid "failed to create temporary file" msgstr "falha ao criar arquivo temporário." #: src/libpspp/ext-array.c:106 msgid "seeking in temporary file" msgstr "procurando no arquivo temporário." #: src/libpspp/ext-array.c:125 msgid "reading temporary file" msgstr "lendo arquivo temporário." #: src/libpspp/ext-array.c:127 msgid "unexpected end of file reading temporary file" msgstr "fim inesperado ao ler arquivo temporário" #: src/libpspp/ext-array.c:147 msgid "writing to temporary file" msgstr "escrevendo no arquivo temporário." #: src/libpspp/i18n.c:1128 msgid "Arabic" msgstr "" #: src/libpspp/i18n.c:1130 msgid "Armenian" msgstr "" #: src/libpspp/i18n.c:1131 msgid "Baltic" msgstr "" #: src/libpspp/i18n.c:1133 msgid "Celtic" msgstr "" #: src/libpspp/i18n.c:1134 msgid "Central European" msgstr "" #: src/libpspp/i18n.c:1136 msgid "Chinese Simplified" msgstr "" #: src/libpspp/i18n.c:1138 msgid "Chinese Traditional" msgstr "" #: src/libpspp/i18n.c:1140 msgid "Croatian" msgstr "" #: src/libpspp/i18n.c:1141 msgid "Cyrillic" msgstr "" #: src/libpspp/i18n.c:1143 msgid "Cyrillic/Russian" msgstr "" #: src/libpspp/i18n.c:1144 msgid "Cyrillic/Ukrainian" msgstr "" #: src/libpspp/i18n.c:1146 msgid "Georgian" msgstr "" #: src/libpspp/i18n.c:1147 msgid "Greek" msgstr "" #: src/libpspp/i18n.c:1148 msgid "Gujarati" msgstr "" #: src/libpspp/i18n.c:1149 msgid "Gurmukhi" msgstr "" #: src/libpspp/i18n.c:1150 msgid "Hebrew" msgstr "" #: src/libpspp/i18n.c:1152 msgid "Hebrew Visual" msgstr "" #: src/libpspp/i18n.c:1153 msgid "Hindi" msgstr "" #: src/libpspp/i18n.c:1154 msgid "Icelandic" msgstr "" #: src/libpspp/i18n.c:1155 msgid "Japanese" msgstr "" #: src/libpspp/i18n.c:1157 msgid "Korean" msgstr "" #: src/libpspp/i18n.c:1159 msgid "Nordic" msgstr "" #: src/libpspp/i18n.c:1160 msgid "Romanian" msgstr "" #: src/libpspp/i18n.c:1162 msgid "South European" msgstr "" #: src/libpspp/i18n.c:1163 msgid "Thai" msgstr "" #: src/libpspp/i18n.c:1165 msgid "Turkish" msgstr "" #: src/libpspp/i18n.c:1167 msgid "Vietnamese" msgstr "" #: src/libpspp/i18n.c:1169 msgid "Western European" msgstr "" #: src/libpspp/message.c:89 #, c-format msgid "%s: %s" msgstr "" #: src/libpspp/message.c:113 msgid "error" msgstr "erro" #: src/libpspp/message.c:115 msgid "warning" msgstr "aviso" #: src/libpspp/message.c:118 msgid "note" msgstr "" #: src/libpspp/message.c:327 #, c-format msgid "Notes (%d) exceed limit (%d). Suppressing further notes." msgstr "" #: src/libpspp/message.c:335 #, fuzzy, c-format #| msgid "Warnings (%d) exceed limit (%d)." msgid "Warnings (%d) exceed limit (%d). Syntax processing will be halted." msgstr "(%d) avisos excederam o limite (%d)." #: src/libpspp/message.c:338 #, fuzzy, c-format #| msgid "Errors (%d) exceeds limit (%d)." msgid "Errors (%d) exceed limit (%d). Syntax processing will be halted." msgstr "(%d) erros excederam o limite (%d)." #: src/libpspp/zip-reader.c:202 #, c-format msgid "%s: corrupt archive at 0x%llx: expected %# but got %#" msgstr "" #: src/libpspp/zip-reader.c:329 src/libpspp/zip-reader.c:449 #, fuzzy, c-format #| msgid "%s: Creating file: %s." msgid "%s: open failed (%s)" msgstr "%s: Criando arquivo: %s" #: src/libpspp/zip-reader.c:344 #, c-format msgid "%s: cannot find central directory" msgstr "" #: src/libpspp/zip-reader.c:353 src/libpspp/zip-reader.c:384 #: src/libpspp/zip-reader.c:468 #, fuzzy, c-format #| msgid "%s: Creating file: %s." msgid "%s: seek failed (%s)" msgstr "%s: Criando arquivo: %s" #: src/libpspp/zip-reader.c:441 #, c-format msgid "%s: unknown member \"%s\"" msgstr "" #: src/libpspp/zip-reader.c:503 #, c-format msgid "" "%s: name mismatch between central directory (%s) and local file header (%s)" msgstr "" #: src/libpspp/zip-reader.c:696 #, c-format msgid "%s: cannot initialize inflator (%s)" msgstr "" #: src/libpspp/zip-reader.c:751 #, fuzzy, c-format #| msgid "Error reading \"%s\": %s" msgid "%s: error inflating \"%s\" (%s)" msgstr "Erro lendo \"%s\": %s" #: src/libpspp/zip-writer.c:97 utilities/pspp-convert.c:346 #, c-format msgid "%s: error opening output file" msgstr "" #: src/libpspp/zip-writer.c:169 #, fuzzy, c-format #| msgid "seeking in temporary file" msgid "%s: error seeking in output file" msgstr "procurando no arquivo temporário." #: src/libpspp/zip-writer.c:210 #, fuzzy #| msgid "reading temporary file" msgid "error creating temporary file" msgstr "lendo arquivo temporário." #: src/libpspp/zip-writer.c:279 #, fuzzy, c-format #| msgid "%s: Not a portable file." msgid "%s: write failed" msgstr "%s: Não é um arquivo portável." #. TRANSLATORS: This is a format string which, when presented to #. printf like functions, will create a pango markup string to #. display real number in scientific notation. #. #. In its untranslated form, it will display similar to "1.23 x 10^4". You #. can leave it untranslated if this is how scientific notation is usually #. presented in your language. #. #. Some locales (such as German) prefer the centered dot rather than the #. multiplication sign between the mantissa an exponent. In which #. case, you can change "#215;" to "#8901;" or other unicode code #. point as appropriate. #. #. The . in this string does not and should not be changed, since #. that is taken care of by the stdc library. #. #. For information on Pango markup, see #. http://developer.gnome.org/pango/stable/PangoMarkupFormat.html #. #. For tables of unicode code points, see http://unicode.org/charts #. #: src/math/chart-geometry.c:123 #, c-format msgid "%%.%dlf×10%d" msgstr "" #: src/math/histogram.c:145 msgid "" "Not creating histogram because the data contains less than 2 distinct values" msgstr "" #: src/math/percentiles.c:36 msgid "HAverage" msgstr "" #: src/math/percentiles.c:38 msgid "Rounded" msgstr "" #: src/math/percentiles.c:39 msgid "Empirical" msgstr "" #: src/math/percentiles.c:40 msgid "Empirical with averaging" msgstr "" #: src/math/shapiro-wilk.c:84 msgid "" "One or more weight values are non-integer. Fractional parts will be ignored " "when calculating the Shapiro-Wilk statistic." msgstr "" #: src/output/ascii.c:340 #, c-format msgid "ascii: opening output file `%s'" msgstr "" #: src/output/ascii.c:371 #, c-format msgid "%s: %s must be positive integer or `auto'" msgstr "" #: src/output/ascii.c:393 #, c-format msgid "" "ascii: page must be at least %d characters wide, but as configured is only " "%d characters" msgstr "" #: src/output/ascii.c:508 #, c-format msgid "See %s for a chart." msgstr "" #: src/output/charts/piechart.c:54 msgid "*MISSING*" msgstr "" #: src/output/csv.c:100 src/output/html.c:117 src/output/journal.c:166 #: src/output/msglog.c:68 #, fuzzy, c-format #| msgid "Error opening psql source: %s." msgid "error opening output file `%s'" msgstr "Erro abrindo fonte psql: %s." #: src/output/driver.c:522 #, c-format msgid "%s is not a valid device type (the choices are `%s' and `%s')" msgstr "" #: src/output/driver.c:536 #, c-format msgid "%s: unknown option `%s'" msgstr "" #: src/output/driver.c:553 #, c-format msgid "%s: output option missing `='" msgstr "" #: src/output/driver.c:560 #, c-format msgid "%s: output option specified more than once" msgstr "" #: src/output/html.c:129 msgid "PSPP Output" msgstr "" #: src/output/html.c:266 #, fuzzy #| msgid "Description" msgid "No description" msgstr "Descrição" #: src/output/journal.c:69 #, fuzzy, c-format #| msgid "Error writing FLIP file: %s." msgid "error writing output file `%s'" msgstr "Erro escrevendo em arquivo FLIP: %s." #: src/output/measure.c:68 #, c-format msgid "`%s' is not a valid length." msgstr "" #: src/output/measure.c:96 #, c-format msgid "syntax error in paper size `%s'" msgstr "" #: src/output/measure.c:233 #, c-format msgid "unknown paper type `%.*s'" msgstr "" #: src/output/measure.c:251 #, fuzzy, c-format #| msgid "Error opening psql source: %s." msgid "error opening input file `%s'" msgstr "Erro abrindo fonte psql: %s." #: src/output/measure.c:279 #, c-format msgid "file `%s' does not state a paper size" msgstr "" #: src/output/options.c:112 #, c-format msgid "%s: `%s' is `%s' but a Boolean value is required" msgstr "" #: src/output/options.c:187 #, c-format msgid "%s: `%s' is `%s' but one of the following is required: %s" msgstr "" #: src/output/options.c:231 #, c-format msgid "%s: `%s' is `%s' but a non-negative integer is required" msgstr "" #: src/output/options.c:235 #, c-format msgid "%s: `%s' is `%s' but a positive integer is required" msgstr "" #: src/output/options.c:238 #, c-format msgid "%s: `%s' is `%s' but an integer is required" msgstr "" #: src/output/options.c:241 #, c-format msgid "%s: `%s' is `%s' but an integer greater than %d is required" msgstr "" #: src/output/options.c:246 #, c-format msgid "%s: `%s' is `%s' but an integer between %d and %d is required" msgstr "" #: src/output/options.c:325 #, c-format msgid "%s: `%s' is `%s' but a file name that contains `#' is required." msgstr "" #. TRANSLATORS: Do not translate this string. If the script of your language #. reads from right to left (eg Persian, Arabic, Hebrew etc), then replace #. this string with "output-direction-rtl". Otherwise either leave it #. untranslated or copy it verbatim. #: src/output/render.c:994 msgid "output-direction-ltr" msgstr "" #: src/output/text-item.c:44 msgid "Page Title" msgstr "" #: src/output/text-item.c:47 msgid "Title" msgstr "" #: src/output/text-item.c:51 msgid "Log" msgstr "" #: src/output/text-item.c:54 msgid "Page Break" msgstr "" #: src/output/cairo.c:520 #, fuzzy, c-format #| msgid "\"%s\": bad font specification" msgid "`%s': bad font specification" msgstr "\"%s\": especificação de fonte inválida" #: src/output/cairo.c:744 #, c-format msgid "" "The defined page is not wide enough to hold at least %d characters in the " "default font. In fact, there's only room for %d characters." msgstr "" #: src/output/cairo.c:752 #, c-format msgid "" "The defined page is not long enough to hold at least %d lines in the default " "font. In fact, there's only room for %d lines." msgstr "" #: src/output/cairo.c:837 #, fuzzy, c-format #| msgid "Error reading file %s: %s." msgid "error opening output file `%s': %s" msgstr "Erro lendo arquivo %s: %s." #: src/output/cairo.c:892 #, c-format msgid "error drawing output for %s driver: %s" msgstr "" #: src/output/cairo.c:2056 #, fuzzy, c-format #| msgid "Error writing FLIP file: %s." msgid "error writing output file `%s': %s" msgstr "Erro escrevendo em arquivo FLIP: %s." #: src/output/charts/np-plot-cairo.c:37 #, c-format msgid "Normal Q-Q Plot of %s" msgstr "" #: src/output/charts/np-plot-cairo.c:38 src/output/charts/np-plot-cairo.c:68 msgid "Observed Value" msgstr "" #: src/output/charts/np-plot-cairo.c:39 msgid "Expected Normal" msgstr "" #: src/output/charts/np-plot-cairo.c:67 #, c-format msgid "Detrended Normal Q-Q Plot of %s" msgstr "" #: src/output/charts/np-plot-cairo.c:69 msgid "Dev from Normal" msgstr "" #: src/output/charts/barchart-cairo.c:65 msgid "Bar Chart" msgstr "" #: src/output/charts/plot-hist-cairo.c:43 #, c-format msgid "N = %.2f" msgstr "" #: src/output/charts/plot-hist-cairo.c:52 #, c-format msgid "Mean = %.1f" msgstr "" #: src/output/charts/plot-hist-cairo.c:61 #, fuzzy, c-format #| msgid "Std Dev" msgid "Std. Dev = %.2f" msgstr "Std Dev" #: src/output/charts/plot-hist-cairo.c:110 msgid "HISTOGRAM" msgstr "" #: src/output/charts/roc-chart-cairo.c:36 src/ui/gui/roc.ui:24 msgid "ROC Curve" msgstr "" #: src/output/charts/scree-cairo.c:36 msgid "Scree Plot" msgstr "" #: src/output/charts/scree-cairo.c:38 msgid "Eigenvalue" msgstr "" #: src/output/charts/spreadlevel-cairo.c:37 #, c-format msgid "Spread vs. Level Plot of %s" msgstr "" #: src/output/charts/spreadlevel-cairo.c:38 msgid "Level" msgstr "" #: src/output/charts/spreadlevel-cairo.c:39 msgid "Spread" msgstr "" #: src/output/charts/scatterplot-cairo.c:57 #, c-format msgid "Scatterplot %s" msgstr "" #: src/output/spv/spv-legacy-decoder.c:2222 msgid "Table lacks cell data." msgstr "" #: src/output/spv/spv-writer.c:68 #, fuzzy, c-format #| msgid "%s: Creating file: %s." msgid "%s: create failed" msgstr "%s: Criando arquivo: %s" #: src/output/spv/spv-writer.c:89 #, fuzzy #| msgid "Error writing FLIP file: %s." msgid "I/O error writing SPV file" msgstr "Erro escrevendo em arquivo FLIP: %s." #: src/output/spv/spv.c:693 #, fuzzy, c-format #| msgid "failed to create temporary file" msgid "%s: Failed to create XML parser" msgstr "falha ao criar arquivo temporário." #: src/output/spv/spv.c:718 #, c-format msgid "%s: document is not well-formed" msgstr "" #: src/output/spv/spv.c:726 #, c-format msgid "%s: root node is \"%s\" but \"%s\" was expected" msgstr "" #: src/ui/gui/psppire-acr.c:273 msgid "Add" msgstr "" #: src/ui/gui/psppire-acr.c:274 #, fuzzy #| msgid "_Edit" msgid "Edit" msgstr "_Editar" #: src/ui/gui/psppire-acr.c:275 msgid "Remove" msgstr "" #: src/ui/gui/psppire-buttonbox.c:311 msgid "OK" msgstr "OK" #: src/ui/gui/psppire-buttonbox.c:319 msgid "Go To" msgstr "Ir Para" #: src/ui/gui/psppire-buttonbox.c:327 msgid "Continue" msgstr "Continuar" #: src/ui/gui/psppire-buttonbox.c:339 src/ui/gui/psppire-import-assistant.c:759 msgid "Paste" msgstr "Colar" #: src/ui/gui/psppire-buttonbox.c:345 #: src/ui/gui/psppire-dialog-action-aggregate.c:216 #: src/ui/gui/psppire-data-window.c:496 src/ui/gui/psppire-data-window.c:624 #: src/ui/gui/psppire-output-window.c:353 #: src/ui/gui/psppire-syntax-window.c:594 src/ui/gui/psppire-window.c:445 #: src/ui/gui/psppire-window.c:628 msgid "Cancel" msgstr "Cancelar" #: src/ui/gui/psppire-buttonbox.c:351 msgid "Close" msgstr "" #: src/ui/gui/psppire-buttonbox.c:358 src/ui/gui/psppire-import-assistant.c:760 msgid "Reset" msgstr "Reiniciar" #: src/ui/gui/psppire-buttonbox.c:365 msgid "Help" msgstr "Ajuda" #: src/ui/gui/psppire-dialog-action-aggregate.c:213 #, fuzzy #| msgid "Save data to file" msgid "Aggregate destination file" msgstr "Salvar dados para arquivo" #: src/ui/gui/psppire-dialog-action-aggregate.c:217 #: src/ui/gui/psppire-data-window.c:493 src/ui/gui/psppire-data-window.c:497 #: src/ui/gui/psppire-output-window.c:354 #: src/ui/gui/psppire-syntax-window.c:595 src/ui/gui/psppire-window.c:449 #: src/ui/gui/aggregate.ui:565 msgid "Save" msgstr "Salvar" #: src/ui/gui/psppire-dialog-action-aggregate.c:226 #: src/ui/gui/psppire-data-window.c:503 msgid "System Files (*.sav)" msgstr "Arquivo de Sistema (*.sav)" #: src/ui/gui/psppire-dialog-action-aggregate.c:231 #: src/ui/gui/psppire-data-window.c:508 #, fuzzy #| msgid "System Files (*.sav)" msgid "Compressed System Files (*.zsav)" msgstr "Arquivo de Sistema (*.sav)" #: src/ui/gui/psppire-dialog-action-aggregate.c:236 #: src/ui/gui/psppire-data-window.c:513 src/ui/gui/psppire-window.c:652 msgid "Portable Files (*.por) " msgstr "Arquivo Portável (*.por) " #: src/ui/gui/psppire-dialog-action-autorecode.c:337 #: src/ui/gui/psppire-dialog-action-recode.c:535 #: src/ui/gui/psppire-dialog-action-recode-different.c:288 msgid "New" msgstr "Novo" #: src/ui/gui/psppire-dialog-action-autorecode.c:351 #: src/ui/gui/psppire-dialog-action-recode.c:527 #: src/ui/gui/psppire-dialog-action-recode-different.c:301 msgid "Old" msgstr "Antigo" #: src/ui/gui/psppire-dialog-action-comments.c:142 #, c-format msgid "Column Number: %d" msgstr "Número da coluna: %d" #: src/ui/gui/psppire-dialog-action-crosstabs.c:71 msgid "Chisq" msgstr "Chisq" #: src/ui/gui/psppire-dialog-action-crosstabs.c:71 msgid "" "Pearson chi-square, likelihood ratio, Fisher’s exact test, continuity " "correction, linear-by-linear association." msgstr "" #: src/ui/gui/psppire-dialog-action-crosstabs.c:74 #: src/language/stats/crosstabs.q:1334 msgid "Phi" msgstr "" #: src/ui/gui/psppire-dialog-action-crosstabs.c:75 msgid "CC" msgstr "CC" #: src/ui/gui/psppire-dialog-action-crosstabs.c:75 #, fuzzy #| msgid "Coefficients" msgid "Contingency coefficient" msgstr "Coeficientes" #: src/ui/gui/psppire-dialog-action-crosstabs.c:77 msgid "UC" msgstr "UC" #: src/ui/gui/psppire-dialog-action-crosstabs.c:77 msgid "Uncertainty coefficient" msgstr "" #: src/ui/gui/psppire-dialog-action-crosstabs.c:78 msgid "BTau" msgstr "BTau" #: src/ui/gui/psppire-dialog-action-crosstabs.c:78 msgid "Kendall's Tau-b" msgstr "" #: src/ui/gui/psppire-dialog-action-crosstabs.c:79 msgid "CTau" msgstr "CTau" #: src/ui/gui/psppire-dialog-action-crosstabs.c:79 msgid "Kendall's Tau-c" msgstr "" #: src/ui/gui/psppire-dialog-action-crosstabs.c:80 msgid "Risk" msgstr "Risk" #: src/ui/gui/psppire-dialog-action-crosstabs.c:80 msgid "Relative Risk estimate" msgstr "" #: src/ui/gui/psppire-dialog-action-crosstabs.c:81 #: src/language/stats/crosstabs.q:1338 msgid "Gamma" msgstr "Gamma" #: src/ui/gui/psppire-dialog-action-crosstabs.c:82 msgid "D" msgstr "D" #: src/ui/gui/psppire-dialog-action-crosstabs.c:82 msgid "Somer's d" msgstr "" #: src/ui/gui/psppire-dialog-action-crosstabs.c:83 #: src/language/stats/crosstabs.q:1344 msgid "Kappa" msgstr "Kappa" #: src/ui/gui/psppire-dialog-action-crosstabs.c:83 msgid "Cohen's Kappa" msgstr "" #: src/ui/gui/psppire-dialog-action-crosstabs.c:84 #: src/language/stats/crosstabs.q:1429 msgid "Eta" msgstr "" #: src/ui/gui/psppire-dialog-action-crosstabs.c:85 msgid "Corr" msgstr "Corr" #: src/ui/gui/psppire-dialog-action-crosstabs.c:85 msgid "Spearman correlation, Pearson's r" msgstr "" #: src/ui/gui/psppire-dialog-action-crosstabs.c:90 #, fuzzy #| msgid "Frequency" msgid "Frequency Count" msgstr "Frequência" #: src/ui/gui/psppire-dialog-action-crosstabs.c:91 msgid "Row" msgstr "Linha" #: src/ui/gui/psppire-dialog-action-crosstabs.c:91 #, fuzzy #| msgid "Percent" msgid "Row percent" msgstr "Percentual" #: src/ui/gui/psppire-dialog-action-crosstabs.c:92 msgid "Column" msgstr "Coluna" #: src/ui/gui/psppire-dialog-action-crosstabs.c:92 #, fuzzy #| msgid "Column Number: 0" msgid "Column percent" msgstr "Número da Coluna: 0" #: src/ui/gui/psppire-dialog-action-crosstabs.c:93 #, fuzzy #| msgid "Percent" msgid "Total percent" msgstr "Percentual" #: src/ui/gui/psppire-dialog-action-crosstabs.c:94 #: src/language/stats/crosstabs.q:1266 msgid "Expected" msgstr "Esperado" #: src/ui/gui/psppire-dialog-action-crosstabs.c:94 #, fuzzy #| msgid "Expected N" msgid "Expected value" msgstr "N esperado" #: src/ui/gui/psppire-dialog-action-crosstabs.c:96 #: src/language/stats/crosstabs.q:1268 msgid "Std. Residual" msgstr "Resíduo padrão" #: src/ui/gui/psppire-dialog-action-crosstabs.c:96 #, fuzzy #| msgid "Std. Residual" msgid "Standardized Residual" msgstr "Resíduo padrão" #: src/ui/gui/psppire-dialog-action-crosstabs.c:97 msgid "Adjusted Std. Residual" msgstr "Resíduo padrão ajustado" #: src/ui/gui/psppire-dialog-action-descriptives.c:45 msgid "Standard error" msgstr "Erro padrão" #: src/ui/gui/psppire-dialog-action-descriptives.c:45 #, fuzzy #| msgid "Standard error of the mean" msgid "Standard error of mean" msgstr "Erro padrão da média" #: src/ui/gui/psppire-dialog-action-descriptives.c:47 #, fuzzy #| msgid "Standard error of the kurtosis" msgid "Kurtosis and standard error of kurtosis" msgstr "Erro padrão do kurtosis" #: src/ui/gui/psppire-dialog-action-descriptives.c:48 #, fuzzy #| msgid "Standard error of the skewness" msgid "Skewness and standard error of skewness" msgstr "Erro padrão do skewness" #: src/ui/gui/psppire-dialog-action-factor.c:323 #, c-format msgid "_Eigenvalues over %4.2f times the mean eigenvalue" msgstr "" #: src/ui/gui/psppire-dialog-action-frequencies.c:44 msgid "Standard error of the mean" msgstr "Erro padrão da média" #: src/ui/gui/psppire-dialog-action-frequencies.c:47 msgid "Standard error of the skewness" msgstr "Erro padrão do skewness" #: src/ui/gui/psppire-dialog-action-frequencies.c:51 msgid "Standard error of the kurtosis" msgstr "Erro padrão do kurtosis" #: src/ui/gui/psppire-dialog-action-oneway.c:175 #, c-format msgid "Contrast %d of %d" msgstr "Contraste %d de %d" #: src/ui/gui/psppire-dialog-action-paired.c:162 src/ui/gui/examine.ui:282 #: src/ui/gui/indep-samples.ui:334 src/ui/gui/t-test.ui:296 #, fuzzy #| msgid "Options..." msgid "O_ptions..." msgstr "Opções..." #: src/ui/gui/psppire-dialog-action-paired.c:168 #, fuzzy #| msgid "_Paired Samples T Test" msgid "Paired Samples T Test" msgstr "Teste T para amostras em_parelhadas" #: src/ui/gui/psppire-dialog-action-recode-different.c:327 msgid "Recode into Different Variables" msgstr "Transformar para Variáveis Diferentes" #: src/ui/gui/psppire-dialog-action-recode-different.c:330 msgid "Recode into Different Variables: Old and New Values " msgstr "Transformar Para Diferentes Variáveis: Antigos e Novos Valores " #: src/ui/gui/psppire-dialog-action-recode-same.c:108 src/ui/gui/recode.ui:391 msgid "Recode into Same Variables" msgstr "Transformar para a Mesma Variável" #: src/ui/gui/psppire-dialog-action-recode-same.c:114 msgid "Recode into Same Variables: Old and New Values" msgstr "Transformar Para a Mesma Variável: Antigos e Novos Valores" #: src/ui/gui/psppire-dialog-action-regression.c:40 msgid "Coeff" msgstr "Coeff" #: src/ui/gui/psppire-dialog-action-regression.c:40 msgid "Show the regression coefficients" msgstr "" #: src/ui/gui/psppire-dialog-action-regression.c:41 #, fuzzy #| msgid "95%% Confidence Interval" msgid "Conf. Interval" msgstr "Intervalo de confiança de 95%%" #: src/ui/gui/psppire-dialog-action-regression.c:41 msgid "Show the confidence interval for the regression coefficients" msgstr "" #: src/ui/gui/psppire-dialog-action-regression.c:42 msgid "Show the correlation between observed and predicted values" msgstr "" #: src/ui/gui/psppire-dialog-action-regression.c:43 msgid "Anova" msgstr "Anova" #: src/ui/gui/psppire-dialog-action-regression.c:43 #, fuzzy #| msgid "Perform one way analysis of variance" msgid "Show the analysis of variance table" msgstr "Fazer análise one way de variância" #: src/ui/gui/psppire-dialog-action-regression.c:44 msgid "Bcov" msgstr "Bcov" #: src/ui/gui/psppire-dialog-action-regression.c:44 msgid "Show the variance coefficient matrix" msgstr "" #: src/ui/gui/psppire-dialog-action-regression.c:45 #, fuzzy #| msgid "Total" msgid "Tol" msgstr "Total" #: src/ui/gui/psppire-dialog-action-regression.c:45 msgid "Show the variance inflation factor and its reciprocal" msgstr "" #: src/ui/gui/psppire-dialog-action-select.c:88 #, c-format msgid "Approximately %3d%% of all cases." msgstr "Aproximadamente %3d%% de todos os casos." #: src/ui/gui/psppire-dialog-action-select.c:89 #, c-format msgid "Exactly %3d cases from the first %3d cases." msgstr "Exatamente %3d casos dos primeiros %3d casos." #: src/ui/gui/psppire-dialog-action-select.c:236 #, c-format msgid "%d thru %d" msgstr "%d até %d" #: src/ui/gui/psppire-dialog-action-two-sample.c:180 #: src/ui/gui/k-independent.ui:404 src/ui/gui/k-related.ui:197 #, fuzzy #| msgid "Type" msgid "Test Type" msgstr "Tipo" #: src/ui/gui/psppire-dialog-action-two-sample.c:189 msgid "_Wilcoxon" msgstr "" #: src/ui/gui/psppire-dialog-action-two-sample.c:190 msgid "_Sign" msgstr "" #: src/ui/gui/psppire-dialog-action-two-sample.c:191 msgid "_McNemar" msgstr "" #: src/ui/gui/psppire-dialog-action-two-sample.c:209 #, fuzzy #| msgid "_Paired Samples T Test" msgid "Two-Related-Samples Tests" msgstr "Teste T para amostras em_parelhadas" #: src/ui/gui/psppire-dialog-action-weight.c:74 src/ui/gui/weight.ui:83 #: src/ui/gui/weight.ui:211 msgid "Do not weight cases" msgstr "Não ponderar casos" #: src/ui/gui/psppire-dialog-action-weight.c:80 #, c-format msgid "Weight cases by %s" msgstr "Pesar casos por %s" #: src/ui/gui/psppire-dict.c:95 #, fuzzy #| msgid "Var 1" msgid "Var" msgstr "Var 1" #. TRANSLATORS: This string must be a valid variable name. That means: #. - The string must be at most 64 bytes (not characters) long. #. - The string may not contain whitespace. #. - The first character may not be '$' #. - The first character may not be a digit #. - The final character may not be '.' or '_' #. #: src/ui/gui/psppire-dict.c:385 #, c-format msgid "Var%04d" msgstr "" #: src/ui/gui/psppire-dict.c:566 #, fuzzy #| msgid "Duplicate variable name %s." msgid "Duplicate variable name." msgstr "Nome de variável %s duplicado." #: src/ui/gui/psppire-dictview.c:617 #, fuzzy msgid "Prefer variable labels" msgstr "Procurar por rótulos de valores" #: src/ui/gui/psppire-dictview.c:631 msgid "Default sort order" msgstr "" #: src/ui/gui/psppire-dictview.c:637 msgid "Unsorted (dictionary order)" msgstr "" #: src/ui/gui/psppire-dictview.c:642 #, fuzzy #| msgid "Sort by:" msgid "Sort by name" msgstr "Ordenar por:" #: src/ui/gui/psppire-dictview.c:647 #, fuzzy #| msgid "Sort by:" msgid "Sort by label" msgstr "Ordenar por:" #: src/ui/gui/psppire-means-layer.c:95 #, fuzzy, c-format #| msgid "Contrast %d of %d" msgid "Layer %d of %d" msgstr "Contraste %d de %d" #: src/ui/gui/psppire-means-layer.c:169 msgid "Forward" msgstr "" #: src/ui/gui/psppire-means-layer.c:170 msgid "Back" msgstr "" #: src/ui/gui/psppire-text-file.c:55 #, fuzzy, c-format #| msgid "Could not open \"%s\": %s" msgid "Could not open `%s'" msgstr "Impossível abrir \"%s\": %s" #: src/ui/gui/psppire-text-file.c:71 #, fuzzy, c-format #| msgid "Error reading \"%s\": %s" msgid "Error reading `%s': %s" msgstr "Erro lendo \"%s\": %s" #: src/ui/gui/psppire-text-file.c:74 #, fuzzy, c-format #| msgid "" #| "Failed to read \"%s\", because it contains a line over %d bytes long and " #| "therefore appears not to be a text file." msgid "" "Failed to read `%s', because it contains a line over %d bytes long and " "therefore appears not to be a text file." msgstr "" "Falha ao ler \"%s\", porque ele contém uma linha com mais de %d bytes d" #: src/ui/gui/psppire-text-file.c:96 #, fuzzy, c-format #| msgid "\"%s\" is empty." msgid "`%s' is empty." msgstr "\"%s\" está vazio." #: src/ui/gui/psppire-val-chooser.c:255 msgid "through" msgstr "até" #: src/ui/gui/psppire-val-chooser.c:288 #, fuzzy #| msgid "Value:" msgid "_Value:" msgstr "Valor:" #: src/ui/gui/psppire-val-chooser.c:289 #, fuzzy #| msgid "System Missing" msgid "_System Missing" msgstr "System Missing" #: src/ui/gui/psppire-val-chooser.c:290 #, fuzzy #| msgid "System-or user-missing" msgid "System _or User Missing" msgstr "System ou user-missing" #: src/ui/gui/psppire-val-chooser.c:291 #, fuzzy #| msgid "Range:" msgid "_Range:" msgstr "Intervalo:" #: src/ui/gui/psppire-val-chooser.c:292 #, fuzzy #| msgid "Range, LOWEST thru value" msgid "Range, _LOWEST thru value" msgstr "Intervalo, MENOR até valor" #: src/ui/gui/psppire-val-chooser.c:293 #, fuzzy #| msgid "Range, value thru HIGHEST" msgid "Range, value thru _HIGHEST" msgstr "Intervalo, valor até MÁXIMO" #: src/ui/gui/psppire-val-chooser.c:294 #, fuzzy #| msgid "All other values" msgid "_All other values" msgstr "Todos os outros valores" #: src/ui/gui/psppire-var-view.c:153 #, c-format msgid "Var%d" msgstr "" #: src/ui/source-init-opts.c:72 #, c-format msgid "Algorithm must be either `%s' or `%s'." msgstr "" #: src/ui/source-init-opts.c:97 #, c-format msgid "Syntax must be either `%s' or `%s'." msgstr "" #: src/ui/terminal/main.c:144 msgid "Error encountered while ERROR=STOP is effective." msgstr "Erro encontrado enquanto ERROR=STOP está ativo." #: src/ui/terminal/main.c:150 msgid "" "Stopping syntax file processing here to avoid a cascade of dependent command " "failures." msgstr "" "Interrompendo processamento do arquivo de sintaxe para evitar falha uma " "cascata de falhas de comandos." #: src/ui/terminal/terminal-opts.c:147 #, c-format msgid "" "PSPP, a program for statistical analysis of sampled data.\n" "Usage: %s [OPTION]... FILE...\n" "\n" "Arguments to long options also apply to equivalent short options.\n" "\n" "Output options:\n" " -o, --output=FILE output to FILE, default format from FILE's name\n" " -O format=FORMAT override format for previous -o\n" " -O OPTION=VALUE set output option to customize previous -o\n" " -O device={terminal|listing} override device type for previous -o\n" " -e, --error-file=FILE append errors, warnings, and notes to FILE\n" " --no-output disable default output driver\n" "Supported output formats: %s\n" "\n" "Language options:\n" " -I, --include=DIR append DIR to search path\n" " -I-, --no-include clear search path\n" " -r, --no-statrc disable running rc file at startup\n" " -a, --algorithm={compatible|enhanced}\n" " set to `compatible' if you want output\n" " calculated from broken algorithms\n" " -x, --syntax={compatible|enhanced}\n" " set to `compatible' to disable PSPP extensions\n" " -b, --batch interpret syntax in batch mode\n" " -i, --interactive interpret syntax in interactive mode\n" " --syntax-encoding=ENCODING specify encoding for syntax files\n" " -s, --safer don't allow some unsafe operations\n" "Default search path: %s\n" "\n" "Informative output:\n" " -h, --help display this help and exit\n" " -V, --version output version information and exit\n" "\n" "Non-option arguments are interpreted as syntax files to execute.\n" msgstr "" #: src/ui/gui/find-dialog.c:197 msgid "Find" msgstr "Localizar" #: src/ui/gui/find-dialog.c:662 #, c-format msgid "Bad regular expression: %s" msgstr "Expressão regular mal formada: %s" #: src/ui/gui/help-menu.c:70 msgid "A program for the analysis of sampled data" msgstr "" #. TRANSLATORS: Do not translate this string. Instead, put the names of the people #. who have helped in the translation. #: src/ui/gui/help-menu.c:80 msgid "translator-credits" msgstr "" #: src/ui/gui/help-menu.c:170 #, c-format msgid "Help path conversion error: %s" msgstr "" #: src/ui/gui/help-menu.c:197 #, c-format msgid "" "Cannot open via html: %s with uri: %s The PSSP manual is also available at %s" msgstr "" #: src/ui/gui/help-menu.c:218 msgid "_Help" msgstr "A_juda" #: src/ui/gui/help-menu.c:221 msgid "_About" msgstr "_Sobre" #: src/ui/gui/help-menu.c:222 msgid "_Reference Manual" msgstr "_Manual de Referência" #: src/ui/gui/main.c:306 msgid "Show version information and exit" msgstr "" #: src/ui/gui/main.c:409 msgid "Do not display the splash screen" msgstr "" #: src/ui/gui/main.c:411 msgid "Do not attempt single instance negotiation" msgstr "" #: src/ui/gui/missing-val-dialog.c:217 msgid "" "The maximum length of a missing value for a string variable is 8 in UTF-8." msgstr "" #: src/ui/gui/missing-val-dialog.c:268 #, fuzzy #| msgid "At least one variable must be specified." msgid "At least one value must be specified" msgstr "Pelo menos uma variável deve ser especificada." #: src/ui/gui/missing-val-dialog.c:298 msgid "Incorrect range specification" msgstr "Especificação incorreta de intervalo" #: src/ui/gui/psppire-data-editor.c:380 #, c-format msgid "%d : %s" msgstr "" #: src/ui/gui/psppire-data-editor.c:391 #, fuzzy, c-format #| msgid " cases" msgid "%'d case" msgid_plural "%'d cases" msgstr[0] "casos" msgstr[1] "casos" #: src/ui/gui/psppire-data-editor.c:396 #, fuzzy, c-format msgid "%'d variable" msgid_plural "%'d variables" msgstr[0] "Variável(is) de teste:" msgstr[1] "Variável(is) de teste:" #: src/ui/gui/psppire-data-editor.c:485 #, fuzzy #| msgid "Cases" msgid "Case" msgstr "Casos" #: src/ui/gui/psppire-data-editor.c:495 msgid "Data View" msgstr "Visualização de dados" #: src/ui/gui/psppire-data-editor.c:505 msgid "Variable View" msgstr "Visualização de variáveis" #: src/ui/gui/psppire-data-sheet.c:171 src/ui/gui/psppire-data-window.c:1338 #, fuzzy #| msgid "Insert Case" msgid "_Insert Case" msgstr "Inserir Caso" #: src/ui/gui/psppire-data-sheet.c:179 src/ui/gui/psppire-data-window.c:1391 #, fuzzy #| msgid "_Clear Cases" msgid "Cl_ear Cases" msgstr "Limpar _Casos" #: src/ui/gui/psppire-data-sheet.c:305 src/ui/gui/psppire-data-window.c:1337 #: src/ui/gui/psppire-variable-sheet.c:274 #, fuzzy #| msgid "Insert Variable" msgid "_Insert Variable" msgstr "Inserir Variáveis" #: src/ui/gui/psppire-data-sheet.c:314 src/ui/gui/psppire-variable-sheet.c:283 msgid "Cl_ear Variables" msgstr "Limpar Variáv_eis" #: src/ui/gui/psppire-data-sheet.c:326 #, fuzzy #| msgid "Sort Ascending" msgid "Sort _Ascending" msgstr "Ordenar Ascendentemente " #: src/ui/gui/psppire-data-sheet.c:333 #, fuzzy #| msgid "Sort Descending" msgid "Sort _Descending" msgstr "Ordenar Descendentemente" #: src/ui/gui/psppire-data-window.c:175 msgid "Transformations Pending" msgstr "Transformação Pendente" #: src/ui/gui/psppire-data-window.c:191 msgid "Filter off" msgstr "Sem Filtro" #: src/ui/gui/psppire-data-window.c:203 #, c-format msgid "Filter by %s" msgstr "Filtrar por %s" #: src/ui/gui/psppire-data-window.c:224 msgid "No Split" msgstr "Sem divisão" #: src/ui/gui/psppire-data-window.c:233 msgid "Split by " msgstr "Dividido por " #: src/ui/gui/psppire-data-window.c:261 msgid "Weights off" msgstr "Sem Pesos" #: src/ui/gui/psppire-data-window.c:273 #, c-format msgid "Weight by %s" msgstr "Peso por %s" #: src/ui/gui/psppire-data-window.c:518 #: src/ui/gui/psppire-import-assistant.c:681 #: src/ui/gui/psppire-syntax-window.c:607 src/ui/gui/psppire-window.c:669 msgid "All Files" msgstr "Todos os Arquivos" #: src/ui/gui/psppire-data-window.c:535 msgid "System File" msgstr "Arquivos de Sistema" #: src/ui/gui/psppire-data-window.c:542 #, fuzzy #| msgid "System File" msgid "Compressed System File" msgstr "Arquivos de Sistema" #: src/ui/gui/psppire-data-window.c:548 msgid "Portable File" msgstr "Arquivo portátil" #: src/ui/gui/psppire-data-window.c:551 #, fuzzy #| msgid "Format" msgid "Format:" msgstr "Formato" #: src/ui/gui/psppire-data-window.c:615 msgid "Delete Existing Dataset?" msgstr "" #: src/ui/gui/psppire-data-window.c:619 #, c-format msgid "" "Renaming \"%s\" to \"%s\" will destroy the existing dataset named \"%s\". " "Are you sure that you want to do this?" msgstr "" #: src/ui/gui/psppire-data-window.c:625 #, fuzzy #| msgid "Deleted" msgid "Delete" msgstr "Apagado" #: src/ui/gui/psppire-data-window.c:647 #, c-format msgid "Please enter a new name for dataset \"%s\":" msgstr "" #: src/ui/gui/psppire-data-window.c:649 msgid "Rename Dataset" msgstr "" #: src/ui/gui/psppire-data-window.c:1199 src/ui/gui/output-window.ui:68 #: src/ui/gui/syntax-editor.ui:22 msgid "_File" msgstr "_Arquivo" #: src/ui/gui/psppire-data-window.c:1203 src/ui/gui/syntax-editor.ui:25 msgid "_New" msgstr "" #: src/ui/gui/psppire-data-window.c:1210 msgid "_Syntax" msgstr "_Sintaxe" #: src/ui/gui/psppire-data-window.c:1213 src/ui/gui/data-editor.ui:177 #: src/ui/gui/data-editor.ui:189 msgid "_Data" msgstr "_Dados" #: src/ui/gui/psppire-data-window.c:1220 src/ui/gui/syntax-editor.ui:36 #, fuzzy #| msgid "Open" msgid "_Open" msgstr "Abrir" #: src/ui/gui/psppire-data-window.c:1223 #, fuzzy #| msgid "_Import Text Data" msgid "_Import Data..." msgstr "_Importar dados textuais" #: src/ui/gui/psppire-data-window.c:1231 src/ui/gui/logistic.ui:261 #: src/ui/gui/regression.ui:66 #, fuzzy #| msgid "Save..." msgid "_Save..." msgstr "Salvar..." #: src/ui/gui/psppire-data-window.c:1234 #, fuzzy #| msgid "Save As" msgid "Save _As..." msgstr "Salvar Como" #: src/ui/gui/psppire-data-window.c:1237 msgid "_Rename Dataset..." msgstr "" #: src/ui/gui/psppire-data-window.c:1248 #, fuzzy msgid "_Display Data File Information" msgstr "informação do arquivo de dados" #: src/ui/gui/psppire-data-window.c:1255 msgid "Working File" msgstr "" #: src/ui/gui/psppire-data-window.c:1257 #, fuzzy msgid "_External File..." msgstr "Arquivo portátil" #: src/ui/gui/psppire-data-window.c:1267 #, fuzzy #| msgid "Recently Used Da_ta" msgid "_Recently Used Data" msgstr "Dados Recen_temente usados" #: src/ui/gui/psppire-data-window.c:1268 msgid "Recently Used _Files" msgstr "Arquivos _Recentemente Usados" #: src/ui/gui/psppire-data-window.c:1315 src/ui/gui/output-window.ui:82 #: src/ui/gui/syntax-editor.ui:59 msgid "_Quit" msgstr "" #: src/ui/gui/psppire-data-window.c:1333 src/ui/gui/output-window.ui:89 #: src/ui/gui/syntax-editor.ui:66 msgid "_Edit" msgstr "_Editar" #: src/ui/gui/psppire-data-window.c:1339 #, fuzzy #| msgid "_Variables" msgid "_Go To Variable..." msgstr "_Variáveis" #: src/ui/gui/psppire-data-window.c:1340 #, fuzzy #| msgid "Go To Case" msgid "_Go To Case..." msgstr "Ir para Caso" #: src/ui/gui/psppire-data-window.c:1364 src/ui/gui/syntax-editor.ui:69 msgid "Cu_t" msgstr "" #: src/ui/gui/psppire-data-window.c:1373 src/ui/gui/output-window.ui:96 #: src/ui/gui/syntax-editor.ui:74 msgid "_Copy" msgstr "" #: src/ui/gui/psppire-data-window.c:1380 src/ui/gui/syntax-editor.ui:79 #, fuzzy #| msgid "Paste" msgid "_Paste" msgstr "Colar" #: src/ui/gui/psppire-data-window.c:1387 #, fuzzy #| msgid "Cl_ear Variables" msgid "Clear _Variables" msgstr "Limpar Variáv_eis" #: src/ui/gui/psppire-data-window.c:1401 #, fuzzy #| msgid "_Find" msgid "_Find..." msgstr "_Localizar" #: src/ui/gui/psppire-data-window.c:1407 src/ui/gui/logistic.ui:246 #, fuzzy #| msgid "Options..." msgid "_Options..." msgstr "Opções..." #: src/ui/gui/psppire-data-window.c:1676 #, fuzzy msgid "Jump to variable" msgstr "Pular para variável" #: src/ui/gui/psppire-data-window.c:1689 #, fuzzy #| msgid "Jump to a Case in the Data Sheet" msgid "Jump to a case in the data sheet" msgstr "Pular para o Caso na matriz de dados" #: src/ui/gui/psppire-data-window.c:1703 #, fuzzy msgid "Search for values in the data" msgstr "Recodificar valores na mesma variável" #: src/ui/gui/psppire-data-window.c:1715 msgid "Create a new case at the current position" msgstr "Criar um caso na posição atual" #: src/ui/gui/psppire-data-window.c:1727 msgid "Create a new variable at the current position" msgstr "Criar uma variável na posição atual" #: src/ui/gui/psppire-data-window.c:1741 #, fuzzy #| msgid "Split the active file" msgid "Split the active dataset" msgstr "Dividir o arquivo ativo" #: src/ui/gui/psppire-data-window.c:1753 msgid "Weight cases by variable" msgstr "Pondera casos pela variável" #: src/ui/gui/psppire-data-window.c:1764 msgid "Show/hide value labels" msgstr "Exibir/ocultar rótulos de valores" #: src/ui/gui/psppire-data-window.c:1904 #, fuzzy msgid "Data Editor" msgstr "%s --- Editor de Dados do PSPP" #: src/ui/gui/psppire-encoding-selector.c:140 msgid "Automatically Detect" msgstr "" #: src/ui/gui/psppire-encoding-selector.c:147 #, fuzzy #| msgid "Little Endian." msgid "Locale Encoding" msgstr "Little Endian." #: src/ui/gui/psppire-encoding-selector.c:177 msgid "Character Encoding: " msgstr "" #: src/ui/gui/psppire-import-assistant.c:337 msgid "line" msgstr "" #: src/ui/gui/psppire-import-assistant.c:347 msgid "var" msgstr "var" #: src/ui/gui/psppire-import-assistant.c:560 #, fuzzy #| msgid "Importing Textual Data" msgid "Importing Spreadsheet Data" msgstr "Importar dados textuais" #: src/ui/gui/psppire-import-assistant.c:686 #, fuzzy #| msgid "All Files" msgid "Text Files" msgstr "Todos os Arquivos" #: src/ui/gui/psppire-import-assistant.c:691 msgid "Text (*.txt) Files" msgstr "" #: src/ui/gui/psppire-import-assistant.c:697 msgid "Plain Text (ASCII) Files" msgstr "" #: src/ui/gui/psppire-import-assistant.c:702 msgid "Comma Separated Value Files" msgstr "" #: src/ui/gui/psppire-import-assistant.c:709 msgid "Tab Separated Value Files" msgstr "" #: src/ui/gui/psppire-import-assistant.c:714 msgid "Gnumeric Spreadsheet Files" msgstr "" #: src/ui/gui/psppire-import-assistant.c:719 msgid "OpenDocument Spreadsheet Files" msgstr "" #: src/ui/gui/psppire-import-assistant.c:724 #, fuzzy #| msgid "All Files" msgid "All Spreadsheet Files" msgstr "Todos os Arquivos" #: src/ui/gui/psppire-import-assistant.c:733 #, fuzzy #| msgid "Select Data to Import" msgid "Select File to Import" msgstr "Selecione dados para importar" #: src/ui/gui/psppire-import-assistant.c:770 msgid "Importing Delimited Text Data" msgstr "Importando dados textuais delimitados" #: src/ui/gui/psppire-import-assistant.c:865 msgid "Select the First Line" msgstr "" #: src/ui/gui/psppire-import-assistant.c:877 msgid "Line" msgstr "Linha" #: src/ui/gui/psppire-import-assistant.c:931 msgid "" "This assistant will guide you through the process of importing data into " "PSPP from a text file with one line per case, in which fields are separated " "by tabs, commas, or other delimiters.\n" "\n" msgstr "" "Este assistente irá acompanhá-lo durante o processo de importar dados para o " "PSPP de um arquivo de texto com um caso por linha, no qual campos são " "separados por tabulações, vírgulas ou outros delimitadores.\n" #: src/ui/gui/psppire-import-assistant.c:941 #, c-format msgid "The selected file contains %'lu line of text. " msgid_plural "The selected file contains %'lu lines of text. " msgstr[0] "" msgstr[1] "" #: src/ui/gui/psppire-import-assistant.c:950 #, c-format msgid "The selected file contains approximately %'lu line of text. " msgid_plural "The selected file contains approximately %'lu lines of text. " msgstr[0] "" msgstr[1] "" #: src/ui/gui/psppire-import-assistant.c:956 #, c-format msgid "" "Only the first %zu line of the file will be shown for preview purposes in " "the following screens. " msgid_plural "" "Only the first %zu lines of the file will be shown for preview purposes in " "the following screens. " msgstr[0] "" msgstr[1] "" #: src/ui/gui/psppire-import-assistant.c:965 msgid "You may choose below how much of the file should actually be imported." msgstr "" "Você pode escolher abaixo quanto do arquivo será efetivamente importado." #: src/ui/gui/psppire-import-assistant.c:974 #, fuzzy, c-format #| msgid "Only first " msgid "Only the first %4d cases" msgstr "Apenas o primeiro " #: src/ui/gui/psppire-import-assistant.c:985 #, fuzzy, c-format #| msgid "% of file (approximately)" msgid "Only the first %3d %% of file (approximately)" msgstr "% do arquivo (aproximadamente)" #: src/ui/gui/psppire-import-assistant.c:1009 #, fuzzy #| msgid "Select Data to Import" msgid "Select the Lines to Import" msgstr "Selecione dados para importar" #: src/ui/gui/psppire-import-assistant.c:1151 msgid "Choose Separators" msgstr "Escolha os separadores" #: src/ui/gui/psppire-import-assistant.c:1438 msgid "Adjust Variable Formats" msgstr "Ajustar formatos da variável" #: src/ui/gui/psppire-output-view.c:410 msgid "Message" msgstr "" #: src/ui/gui/psppire-output-view.c:543 #, fuzzy #| msgid "failed to create temporary file" msgid "failed to create temporary directory during clipboard operation" msgstr "falha ao criar arquivo temporário." #: src/ui/gui/psppire-output-window.c:241 msgid "Infer file type from extension" msgstr "" #: src/ui/gui/psppire-output-window.c:242 msgid "SPSS Viewer (*.spv)" msgstr "" #: src/ui/gui/psppire-output-window.c:243 msgid "PDF (*.pdf)" msgstr "" #: src/ui/gui/psppire-output-window.c:244 msgid "HTML (*.html)" msgstr "" #: src/ui/gui/psppire-output-window.c:245 msgid "OpenDocument (*.odt)" msgstr "" #: src/ui/gui/psppire-output-window.c:246 msgid "Text (*.txt)" msgstr "" #: src/ui/gui/psppire-output-window.c:247 msgid "Text [plain] (*.txt)" msgstr "" #: src/ui/gui/psppire-output-window.c:248 msgid "PostScript (*.ps)" msgstr "" #: src/ui/gui/psppire-output-window.c:249 msgid "Comma-Separated Values (*.csv)" msgstr "" #: src/ui/gui/psppire-output-window.c:350 msgid "Export Output" msgstr "" #: src/ui/gui/psppire-output-window.c:548 #, fuzzy msgid "Output Viewer" msgstr "Variável de Saída" #: src/ui/gui/psppire-spreadsheet-model.c:237 msgid "(empty)" msgstr "" #: src/ui/gui/psppire-syntax-window.c:226 msgid "Text Search" msgstr "" #: src/ui/gui/psppire-syntax-window.c:229 #, fuzzy #| msgid "OK" msgid "_OK" msgstr "OK" #: src/ui/gui/psppire-syntax-window.c:231 #, fuzzy #| msgid "Cancel" msgid "_Cancel" msgstr "Cancelar" #: src/ui/gui/psppire-syntax-window.c:239 msgid "Text to search for:" msgstr "" #: src/ui/gui/psppire-syntax-window.c:570 #, fuzzy, c-format msgid "Saved file `%s'" msgstr "lendo arquivo de fonte \"%s\"" #: src/ui/gui/psppire-syntax-window.c:591 msgid "Save Syntax" msgstr "Salvar Sintaxe" #: src/ui/gui/psppire-syntax-window.c:601 src/ui/gui/psppire-window.c:657 msgid "Syntax Files (*.sps) " msgstr "Arquivo de Sintaxe (*.sps) " #: src/ui/gui/psppire-syntax-window.c:970 #, fuzzy msgid "Syntax Editor" msgstr "Editor de Sintaxe do PSPP" #: src/ui/gui/psppire-syntax-window.c:990 #, fuzzy, c-format msgid "Cannot load syntax file `%s'" msgstr "impossível abrir arquivo de fonte \"%s\"" #: src/ui/gui/psppire-variable-sheet.c:412 #, c-format msgid "{%s, %s}..." msgstr "" #: src/ui/gui/psppire-var-sheet-header.c:64 #, fuzzy #| msgid "Decimals" msgid "Decimal" msgstr "Decimais" #: src/ui/gui/psppire-var-sheet-header.c:79 msgid "Align" msgstr "Alinhamento" #: src/ui/gui/psppire-var-sheet-header.c:82 msgid "Measure" msgstr "Medida" #: src/ui/gui/psppire-window.c:430 #, c-format msgid "Save the changes to `%s' before closing?" msgstr "" #: src/ui/gui/psppire-window.c:437 #, c-format msgid "" "If you don't save, changes from the last %ld seconds will be permanently " "lost." msgstr "" #: src/ui/gui/psppire-window.c:441 #, fuzzy msgid "Close _without saving" msgstr "%s sem %s." #: src/ui/gui/psppire-window.c:625 src/ui/gui/psppire-window.c:629 msgid "Open" msgstr "Abrir" #: src/ui/gui/psppire-window.c:634 #, fuzzy msgid "Data and Syntax Files" msgstr "impossível abrir arquivo de fonte \"%s\"" #: src/ui/gui/psppire-window.c:646 #, fuzzy #| msgid "System Files (*.sav)" msgid "System Files (*.sav, *.zsav)" msgstr "Arquivo de Sistema (*.sav)" #: src/ui/gui/psppire-window.c:663 #, fuzzy #| msgid "Syntax Files (*.sps) " msgid "Output Files (*.spv) " msgstr "Arquivo de Sintaxe (*.sps) " #: src/ui/gui/t-test-options.c:65 #, fuzzy, c-format #| msgid "Confidence Interval: %2d %%" msgid "Con_fidence Interval: %2d %%" msgstr "Intervalo de confiança: %2d %%" #: src/ui/gui/val-labs-dialog.c:591 #, c-format msgid "%s = `%s'" msgstr "" #: src/ui/gui/var-type-dialog.c:541 #, fuzzy #| msgid "Variable Type" msgid "Variable Type and Format" msgstr "Tipo da Variável" #: src/ui/gui/windows-menu.c:92 #, fuzzy #| msgid "_Minimize All Windows" msgid "_Minimize all Windows" msgstr "_Minimizar Todas as Janelas" #: src/ui/gui/windows-menu.c:100 #, fuzzy msgid "_Split" msgstr "_Dividir" #: src/ui/gui/windows-menu.c:132 msgid "_Windows" msgstr "_Janelas" #: utilities/pspp-convert.c:67 #, c-format msgid "%s argument must be a single character" msgstr "" #: utilities/pspp-convert.c:265 msgid "exactly two non-option arguments are required; use --help for help" msgstr "" #: utilities/pspp-convert.c:276 #, c-format msgid "%s: cannot guess output format (use -O option)" msgstr "" #: utilities/pspp-convert.c:341 #, c-format msgid "%s: unknown output format (use -O option)" msgstr "" #: utilities/pspp-convert.c:360 #, fuzzy, c-format #| msgid "Error reading file %s: %s." msgid "%s: error reading input file" msgstr "Erro lendo arquivo %s: %s." #: utilities/pspp-convert.c:362 #, fuzzy, c-format #| msgid "Error writing FLIP file: %s." msgid "%s: error writing output file" msgstr "Erro escrevendo em arquivo FLIP: %s." #: utilities/pspp-convert.c:409 #, fuzzy, c-format #| msgid "Error opening psql source: %s." msgid "%s: error opening password file" msgstr "Erro abrindo fonte psql: %s." #: utilities/pspp-convert.c:425 #, c-format msgid "" "\n" "%s: password not in file" msgstr "" #: utilities/pspp-convert.c:462 #, c-format msgid "%s: '%c' is not in alphabet" msgstr "" #: utilities/pspp-convert.c:526 msgid "sorry, wrong password" msgstr "" #: utilities/pspp-output.c:92 #, c-format msgid "%s and %s:" msgstr "" #: utilities/pspp-output.c:547 #, fuzzy, c-format #| msgid "in expression" msgid "%s: invalid XPath expression" msgstr "na expressão" #: utilities/pspp-output.c:716 msgid "missing command name (use --help for help)" msgstr "" #: utilities/pspp-output.c:720 #, c-format msgid "unknown command \"%s\" (use --help for help)" msgstr "" #: utilities/pspp-output.c:728 #, c-format msgid "\"%s\" command takes exactly %d argument" msgid_plural "\"%s\" command takes exactly %d arguments" msgstr[0] "" msgstr[1] "" #: utilities/pspp-output.c:735 #, fuzzy, c-format #| msgid "%s must have at least %d arguments in list." msgid "\"%s\" command requires at least %d argument" msgid_plural "\"%s\" command requires at least %d arguments" msgstr[0] "%s deve ter pelo menos %d argumentos na lista." msgstr[1] "%s deve ter pelo menos %d argumentos na lista." #: utilities/pspp-output.c:742 #, c-format msgid "\"%s\" command requires between %d and %d arguments" msgstr "" #: utilities/pspp-output.c:782 msgid "The following object classes are supported:" msgstr "" #: utilities/pspp-output.c:791 #, c-format msgid "%s: unknown object class (use --select=help for help" msgstr "" #: src/language/utilities/set.q:162 #, fuzzy, c-format #| msgid "Day (%ld) must be between 1 and 31." msgid "%s must be between 0 and 20." msgstr "Dia (%ld) deve estar entre 1 e 31." #: src/language/utilities/set.q:172 src/language/utilities/set.q:179 #, fuzzy, c-format #| msgid "LENGTH must be at least 1." msgid "%s must be at least 1." msgstr "LENGTH deve ser pelo menos 1." #: src/language/utilities/set.q:205 #, fuzzy, c-format #| msgid "LENGTH must be at least 1." msgid "%s must be at least 1MB" msgstr "LENGTH deve ser pelo menos 1." #: src/language/utilities/set.q:207 #, c-format msgid "%s must be positive" msgstr "" #: src/language/utilities/set.q:213 src/language/utilities/set.q:215 #: src/language/utilities/set.q:217 src/language/utilities/set.q:219 #: src/language/utilities/set.q:221 src/language/utilities/set.q:223 #: src/language/utilities/set.q:225 src/language/utilities/set.q:227 #: src/language/utilities/set.q:229 src/language/utilities/set.q:231 #: src/language/utilities/set.q:233 #, c-format msgid "%s is obsolete." msgstr "%s é obsoleto." #: src/language/utilities/set.q:239 msgid "Active file compression is not implemented." msgstr "Compressão de arquivo ativo não está implementado." #: src/language/utilities/set.q:403 #, c-format msgid "%s must be 1500 or later." msgstr "" #: src/language/utilities/set.q:410 #, fuzzy, c-format #| msgid "expecting %s or %s" msgid "expecting %s or year" msgstr "esperando %s ou %s" #: src/language/utilities/set.q:438 src/language/utilities/set.q:535 #, fuzzy, c-format #| msgid "LENGTH must be at least 1." msgid "%s must be at least %d." msgstr "LENGTH deve ser pelo menos 1." #: src/language/utilities/set.q:474 #, fuzzy, c-format msgid "%s is not a recognized encoding or locale name" msgstr "%s é um nome de variável existente." #: src/language/utilities/set.q:562 #, c-format msgid "" "%s requires numeric output format as an argument. Specified format %s is of " "type string." msgstr "" #: src/language/utilities/set.q:791 msgid "ISL (32-bit IEEE 754 single, little-endian)" msgstr "" #: src/language/utilities/set.q:794 msgid "ISB (32-bit IEEE 754 single, big-endian)" msgstr "" #: src/language/utilities/set.q:797 msgid "IDL (64-bit IEEE 754 double, little-endian)" msgstr "" #: src/language/utilities/set.q:800 msgid "IDB (64-bit IEEE 754 double, big-endian)" msgstr "" #: src/language/utilities/set.q:804 msgid "VF (32-bit VAX F, VAX-endian)" msgstr "" #: src/language/utilities/set.q:807 msgid "VD (64-bit VAX D, VAX-endian)" msgstr "" #: src/language/utilities/set.q:810 msgid "VG (64-bit VAX G, VAX-endian)" msgstr "" #: src/language/utilities/set.q:814 msgid "ZS (32-bit IBM Z hexadecimal short, big-endian)" msgstr "" #: src/language/utilities/set.q:817 msgid "ZL (64-bit IBM Z hexadecimal long, big-endian)" msgstr "" #: src/language/utilities/set.q:985 #, fuzzy, c-format msgid "%s is %s." msgstr "%s é \"%s\"." #: src/language/utilities/set.q:1089 #, c-format msgid "" "Too many %s commands without a %s: at most %d levels of saved settings are " "allowed." msgstr "" #: src/language/utilities/set.q:1109 #, fuzzy, c-format #| msgid "%s without %s." msgid "%s without matching %s." msgstr "%s sem %s." #: src/language/stats/crosstabs.q:327 #, c-format msgid "Missing mode %s not allowed in general mode. Assuming %s." msgstr "" #: src/language/stats/crosstabs.q:444 msgid "Too many cross-tabulation variables or dimensions." msgstr "Excessivo número de variáveis ou dimensões para crosstab." #: src/language/stats/crosstabs.q:509 #, c-format msgid "%s must be specified before %s." msgstr "" #: src/language/stats/crosstabs.q:543 #, c-format msgid "Maximum value (%ld) less than minimum value (%ld)." msgstr "" #: src/language/stats/crosstabs.q:922 #, fuzzy #| msgid "Summary." msgid "Summary" msgstr "Sumário." #: src/language/stats/crosstabs.q:935 #, fuzzy #| msgid "Generate crosstabulations" msgid "Crosstabulation" msgstr "Gerar crosstabs" #. TRANSLATORS: The %s here describes a crosstabulation. It takes the #. form "var1 * var2 * var3 * ...". #: src/language/stats/crosstabs.q:1013 #, c-format msgid "Crosstabulation %s contained no non-missing cases." msgstr "" #: src/language/stats/crosstabs.q:1204 #, fuzzy #| msgid "Missing Values" msgid "Missing value" msgstr "Missing Values" #: src/language/stats/crosstabs.q:1263 #, fuzzy #| msgid "row %" msgid "Row %" msgstr "linha %" #: src/language/stats/crosstabs.q:1264 #, fuzzy #| msgid "column %" msgid "Column %" msgstr "coluna %" #: src/language/stats/crosstabs.q:1265 #, fuzzy #| msgid "total %" msgid "Total %" msgstr "total %" #: src/language/stats/crosstabs.q:1269 #, fuzzy #| msgid "Adjusted Std. Residual" msgid "Adjusted Residual" msgstr "Resíduo padrão ajustado" #: src/language/stats/crosstabs.q:1288 #, fuzzy #| msgid "Chi-square tests." msgid "Chi-Square Tests" msgstr "Teste Chi-quadrado" #: src/language/stats/crosstabs.q:1294 msgid "Pearson Chi-Square" msgstr "Chi-quadrado de Pearson" #: src/language/stats/crosstabs.q:1295 msgid "Likelihood Ratio" msgstr "" #: src/language/stats/crosstabs.q:1296 msgid "Fisher's Exact Test" msgstr "" #: src/language/stats/crosstabs.q:1297 msgid "Continuity Correction" msgstr "" #: src/language/stats/crosstabs.q:1298 msgid "Linear-by-Linear Association" msgstr "" #: src/language/stats/crosstabs.q:1299 src/language/stats/crosstabs.q:1345 #: src/language/stats/crosstabs.q:1854 msgid "N of Valid Cases" msgstr "N de casos válidos" #: src/language/stats/crosstabs.q:1305 #, fuzzy msgid "Asymptotic Sig. (2-tailed)" msgstr "Asymp. Sig." #: src/language/stats/crosstabs.q:1319 #, fuzzy #| msgid "Symmetric measures." msgid "Symmetric Measures" msgstr "Medidas simétricas." #: src/language/stats/crosstabs.q:1324 src/language/stats/crosstabs.q:1364 #: src/language/stats/crosstabs.q:1411 msgid "Values" msgstr "Valores" #: src/language/stats/crosstabs.q:1326 src/language/stats/crosstabs.q:1413 msgid "Asymp. Std. Error" msgstr "" #: src/language/stats/crosstabs.q:1327 src/language/stats/crosstabs.q:1414 msgid "Approx. T" msgstr "" #: src/language/stats/crosstabs.q:1328 src/language/stats/crosstabs.q:1415 msgid "Approx. Sig." msgstr "" #: src/language/stats/crosstabs.q:1333 src/language/stats/crosstabs.q:1420 msgid "Nominal by Nominal" msgstr "" #: src/language/stats/crosstabs.q:1334 msgid "Cramer's V" msgstr "" #: src/language/stats/crosstabs.q:1334 msgid "Contingency Coefficient" msgstr "" #: src/language/stats/crosstabs.q:1336 src/language/stats/crosstabs.q:1425 msgid "Ordinal by Ordinal" msgstr "" #: src/language/stats/crosstabs.q:1337 msgid "Kendall's tau-b" msgstr "" #: src/language/stats/crosstabs.q:1337 msgid "Kendall's tau-c" msgstr "" #: src/language/stats/crosstabs.q:1338 msgid "Spearman Correlation" msgstr "" #: src/language/stats/crosstabs.q:1340 msgid "Interval by Interval" msgstr "" #: src/language/stats/crosstabs.q:1341 msgid "Pearson's R" msgstr "R de Pearson" #: src/language/stats/crosstabs.q:1343 msgid "Measure of Agreement" msgstr "" #: src/language/stats/crosstabs.q:1359 #, fuzzy #| msgid "Proportion Estimates" msgid "Risk Estimate" msgstr "Estimativas de proporção" #: src/language/stats/crosstabs.q:1368 #, fuzzy, no-c-format #| msgid "95%% Confidence Interval" msgid "95% Confidence Interval" msgstr "Intervalo de confiança de 95%%" #: src/language/stats/crosstabs.q:1389 msgid "Symmetric" msgstr "Simétrico" #: src/language/stats/crosstabs.q:1391 src/language/stats/crosstabs.q:1396 #, c-format msgid "%s Dependent" msgstr "%s Dependente" #: src/language/stats/crosstabs.q:1406 msgid "Directional Measures" msgstr "" #: src/language/stats/crosstabs.q:1422 msgid "Goodman and Kruskal tau" msgstr "" #: src/language/stats/crosstabs.q:1423 msgid "Uncertainty Coefficient" msgstr "" #: src/language/stats/crosstabs.q:1426 msgid "Somers' d" msgstr "" #: src/language/stats/crosstabs.q:1428 msgid "Nominal by Interval" msgstr "" #: src/language/stats/crosstabs.q:1826 #, c-format msgid "Odds Ratio for %s" msgstr "" #: src/language/stats/crosstabs.q:1835 #, c-format msgid "For cohort %s = " msgstr "" #: src/ui/gui/aggregate.ui:24 msgid "Aggregate Data" msgstr "" #: src/ui/gui/aggregate.ui:126 #, fuzzy #| msgid "Cl_ear Variables" msgid "_Break variable(s)" msgstr "Limpar Variáv_eis" #: src/ui/gui/aggregate.ui:179 #, fuzzy #| msgid "Variable:" msgid "Variable Name: " msgstr "Variável:" #: src/ui/gui/aggregate.ui:215 #, fuzzy #| msgid "Value Label:" msgid "Variable Label: " msgstr "Value Label:" #: src/ui/gui/aggregate.ui:252 #, fuzzy #| msgid "Functions:" msgid "Function: " msgstr "Funções:" #: src/ui/gui/aggregate.ui:327 msgid "Argument 1: " msgstr "" #: src/ui/gui/aggregate.ui:364 msgid "Argument 2: " msgstr "" #: src/ui/gui/aggregate.ui:428 #, fuzzy msgid "Aggregated variables" msgstr "Variável(is) de teste:" #: src/ui/gui/aggregate.ui:469 msgid "_Add aggregated variables to the active dataset" msgstr "" #: src/ui/gui/aggregate.ui:486 #, fuzzy #| msgid "Transpose the cases with the variables" msgid "_Replace the current dataset with the aggregated variables" msgstr "Transpor os casos com as variáveis" #: src/ui/gui/aggregate.ui:504 msgid "_Write a new data file containing only the aggregated variables" msgstr "" #: src/ui/gui/aggregate.ui:544 #, fuzzy #| msgid "Label" msgid "label" msgstr "Label" #: src/ui/gui/aggregate.ui:593 #, fuzzy #| msgid "File is already sorted." msgid "File is _already sorted on break variable(s)" msgstr "Arquivo já está ordenado." #: src/ui/gui/aggregate.ui:609 msgid "Sort file before a_ggregating" msgstr "" #: src/ui/gui/aggregate.ui:630 msgid "Options for very large datasets" msgstr "" #: src/ui/gui/autorecode.ui:24 msgid "Automatic Recode" msgstr "" #: src/ui/gui/autorecode.ui:120 #, fuzzy #| msgid "Variable View" msgid "Variable -> New Name" msgstr "Visualização de variáveis" #: src/ui/gui/autorecode.ui:145 #, fuzzy #| msgid "_Largest Value" msgid "_Lowest value" msgstr "_Maior Valor" #: src/ui/gui/autorecode.ui:163 #, fuzzy #| msgid "_Largest Value" msgid "_Highest value" msgstr "_Maior Valor" #: src/ui/gui/autorecode.ui:185 msgid "Recode starting from" msgstr "" #: src/ui/gui/autorecode.ui:204 #, fuzzy #| msgid "New Value" msgid "_New Name" msgstr "Novo Valor" #: src/ui/gui/autorecode.ui:227 msgid "_Add New Name" msgstr "" #: src/ui/gui/autorecode.ui:285 msgid "_Use the same recoding scheme for all variables" msgstr "" #: src/ui/gui/autorecode.ui:301 msgid "Treat _blank string values as missing" msgstr "" #: src/ui/gui/binomial.ui:86 #, fuzzy #| msgid "Test Variable(s):" msgid "_Test Variable List:" msgstr "Variável(is) de teste:" #: src/ui/gui/binomial.ui:160 src/ui/gui/chi-square.ui:281 msgid "_Get from data" msgstr "" #: src/ui/gui/binomial.ui:181 src/ui/gui/indep-samples.ui:150 msgid "_Cut point:" msgstr "Ponto de _corte:" #: src/ui/gui/binomial.ui:225 msgid "Define Dichotomy" msgstr "" #: src/ui/gui/binomial.ui:245 msgid "Test _Proportion:" msgstr "" #: src/ui/gui/compute.ui:32 msgid "Compute Variable: Type and Label" msgstr "" #: src/ui/gui/compute.ui:67 #, fuzzy #| msgid "Use expression as label" msgid "Use _expression as label" msgstr "Usar expressão como rótulo" #: src/ui/gui/compute.ui:90 #, fuzzy #| msgid "Label:" msgid "_Label:" msgstr "Label:" #: src/ui/gui/compute.ui:194 #, fuzzy #| msgid "String" msgid "_String" msgstr "String" #: src/ui/gui/compute.ui:287 #, fuzzy #| msgid "Numeric" msgid "_Numeric" msgstr "Numérico" #: src/ui/gui/compute.ui:343 #, fuzzy #| msgid "Output Variable" msgid "Compute Variable" msgstr "Variável de Saída" #: src/ui/gui/compute.ui:381 #, fuzzy #| msgid "Target Variable:" msgid "Target _Variable:" msgstr "Variável alvo:" #: src/ui/gui/compute.ui:412 #, fuzzy #| msgid "Type & Label" msgid "_Type & Label..." msgstr "Tipo & Label" #: src/ui/gui/compute.ui:469 msgid "=" msgstr "=" #: src/ui/gui/compute.ui:526 #, fuzzy #| msgid "Numeric Expressions:" msgid "_Numeric Expressions:" msgstr "Expressões Numéricas:" #: src/ui/gui/compute.ui:598 #, fuzzy #| msgid "Functions:" msgid "_Functions:" msgstr "Funções:" #: src/ui/gui/compute.ui:678 #, fuzzy #| msgid "If..." msgid "_If..." msgstr "Se..." #: src/ui/gui/barchart.ui:24 msgid "Barchart" msgstr "" #: src/ui/gui/barchart.ui:112 #, fuzzy #| msgid "Category" msgid "Category A_xis:" msgstr "Categoria" #: src/ui/gui/barchart.ui:140 #, fuzzy #| msgid " cases" msgid "_N of cases" msgstr "casos" # lala #: src/ui/gui/barchart.ui:158 #, fuzzy #| msgid "Sum of case weights" msgid "_Cum. n of cases" msgstr "Soma dos pesos dos casos" #: src/ui/gui/barchart.ui:174 msgid "Other _summary function" msgstr "" #: src/ui/gui/barchart.ui:191 #, fuzzy #| msgid " cases" msgid "% of c_ases" msgstr "casos" # lala #: src/ui/gui/barchart.ui:207 #, fuzzy #| msgid "Sum of case weights" msgid "C_um. % of cases" msgstr "Soma dos pesos dos casos" #: src/ui/gui/barchart.ui:270 src/ui/gui/histogram.ui:100 #, fuzzy #| msgid "Variable:" msgid "_Variable:" msgstr "Variável:" #: src/ui/gui/barchart.ui:308 msgid "Bars Represent" msgstr "" #: src/ui/gui/barchart.ui:340 #, fuzzy #| msgid "Category" msgid "Category C_luster:" msgstr "Categoria" #: src/ui/gui/correlation.ui:24 #, fuzzy #| msgid "Bivariate _Correlation" msgid "Bivariate Correlations" msgstr "_Correlação Bivariada" #: src/ui/gui/correlation.ui:148 #, fuzzy #| msgid "Pearson's R" msgid "Pearso_n" msgstr "R de Pearson" #: src/ui/gui/correlation.ui:164 msgid "_Kendall's tau-b" msgstr "" #: src/ui/gui/correlation.ui:180 msgid "_Spearman" msgstr "" #: src/ui/gui/correlation.ui:200 #, fuzzy #| msgid "Coefficients" msgid "Correlation Coefficients" msgstr "Coeficientes" #: src/ui/gui/correlation.ui:224 msgid "_Two-tailed" msgstr "" #: src/ui/gui/correlation.ui:241 msgid "One-tai_led" msgstr "" #: src/ui/gui/correlation.ui:262 msgid "Test of Significance" msgstr "" #: src/ui/gui/correlation.ui:275 msgid "_Flag significant correlations" msgstr "" #: src/ui/gui/count.ui:24 msgid "Count Occurrences of Values within Cases" msgstr "" #: src/ui/gui/count.ui:117 #, fuzzy #| msgid "Name Variable:" msgid "Numeric _Variables:" msgstr "Nome da Variável" #: src/ui/gui/count.ui:147 #, fuzzy #| msgid "Target Variable:" msgid "_Target Variable:" msgstr "Variável alvo:" #: src/ui/gui/count.ui:178 #, fuzzy #| msgid "Target Variable:" msgid "Target _Label:" msgstr "Variável alvo:" #: src/ui/gui/count.ui:192 #, fuzzy #| msgid "Define Groups" msgid "_Define Values..." msgstr "Define grupos" #: src/ui/gui/count.ui:257 msgid "Count Values within Cases: Values to Count" msgstr "" #: src/ui/gui/count.ui:305 msgid "Values _to Count:" msgstr "" #: src/ui/gui/comments.ui:25 #, fuzzy #| msgid "Data File _Comments" msgid "Data File Comments" msgstr "_Comentários do Arquivo de Dados" #: src/ui/gui/comments.ui:49 msgid "Comments:" msgstr "Comentários:" #: src/ui/gui/comments.ui:106 msgid "Display comments in output" msgstr "Exibir comentários na saída" #: src/ui/gui/comments.ui:127 msgid "Column Number: 0" msgstr "Número da Coluna: 0" #: src/ui/gui/crosstabs.ui:25 #, fuzzy #| msgid "_Crosstabs" msgid "Crosstabs: Cells" msgstr "_Crosstabs" #: src/ui/gui/crosstabs.ui:67 msgid "Cell Display" msgstr "Visualizar Célula" #: src/ui/gui/crosstabs.ui:99 #, fuzzy #| msgid "_Crosstabs" msgid "Crosstabs" msgstr "_Crosstabs" #: src/ui/gui/crosstabs.ui:150 #, fuzzy #| msgid "Rows" msgid "_Rows" msgstr "Linhas" #: src/ui/gui/crosstabs.ui:195 #, fuzzy #| msgid "Columns" msgid "_Columns" msgstr "Colunas" #: src/ui/gui/crosstabs.ui:242 #, fuzzy #| msgid "Format..." msgid "_Format..." msgstr "Formato..." #: src/ui/gui/crosstabs.ui:256 src/ui/gui/examine.ui:267 #, fuzzy #| msgid "Statistics..." msgid "_Statistics..." msgstr "Estatísticas..." #: src/ui/gui/crosstabs.ui:270 #, fuzzy #| msgid "Cells..." msgid "Ce_lls..." msgstr "Células..." #: src/ui/gui/crosstabs.ui:348 #, fuzzy #| msgid "_Crosstabs" msgid "Crosstabs: Format" msgstr "_Crosstabs" #: src/ui/gui/crosstabs.ui:371 msgid "Print tables" msgstr "Imprimir tabelas" #: src/ui/gui/crosstabs.ui:387 msgid "Pivot" msgstr "Pivô" #: src/ui/gui/crosstabs.ui:403 src/ui/gui/sort.ui:157 msgid "Ascending" msgstr "Ascendente" #: src/ui/gui/crosstabs.ui:455 #, fuzzy #| msgid "Test Statistics" msgid "Crosstabs: Statistics" msgstr "Testes estatísticos" #: src/ui/gui/chi-square.ui:30 #, fuzzy #| msgid "Chi-square tests." msgid "Chi-Square Test" msgstr "Teste Chi-quadrado" #: src/ui/gui/chi-square.ui:82 msgid "All categor_ies equal" msgstr "" #: src/ui/gui/chi-square.ui:103 #, fuzzy #| msgid "Values" msgid "_Values" msgstr "Valores" #: src/ui/gui/chi-square.ui:159 #, fuzzy #| msgid "Expected N" msgid "Expected Values:" msgstr "N esperado" #: src/ui/gui/chi-square.ui:204 #, fuzzy #| msgid "Test Variable(s):" msgid "Test _Variables" msgstr "Variável(is) de teste:" #: src/ui/gui/chi-square.ui:298 msgid "Use _specified range" msgstr "" #: src/ui/gui/chi-square.ui:323 #, fuzzy #| msgid "_Low:" msgid "_Lower:" msgstr "_Menor:" #: src/ui/gui/chi-square.ui:337 msgid "_Upper:" msgstr "" #: src/ui/gui/chi-square.ui:381 #, fuzzy #| msgid "Expected N" msgid "Expected Range:" msgstr "N esperado" #: src/ui/gui/descriptives.ui:131 src/ui/gui/factor.ui:797 #: src/ui/gui/recode.ui:638 #, fuzzy #| msgid "Variables:" msgid "_Variables:" msgstr "Variáveis:" #: src/ui/gui/descriptives.ui:176 #, fuzzy #| msgid "Statistics:" msgid "S_tatistics:" msgstr "Estatísticas:" #: src/ui/gui/descriptives.ui:230 #, fuzzy #| msgid "Exclude entire case if any selected variable is missing" msgid "_Exclude entire case if any selected variable is missing" msgstr "" "Excluir o caso completo se qualquer variável selecionada for um missing" #: src/ui/gui/descriptives.ui:247 #, fuzzy #| msgid "Include user-missing data in analysis" msgid "_Include user-missing data in analysis" msgstr "Incluir user-missing na análise" #: src/ui/gui/descriptives.ui:264 #, fuzzy #| msgid "Save Z-scores of selected variables as new variables" msgid "Save _Z-scores of selected variables as new variables" msgstr "Salvar Z-score da variável selecionada como novas variáveis" #: src/ui/gui/descriptives.ui:286 msgid "Options:" msgstr "Opções:" #: src/ui/gui/examine.ui:25 #, fuzzy #| msgid "_Explore" msgid "Explore" msgstr "_Explorar" #: src/ui/gui/examine.ui:69 #, fuzzy #| msgid "Label Cases by:" msgid "_Label Cases by:" msgstr "Inserir Label nos Casos por:" #: src/ui/gui/examine.ui:116 #, fuzzy #| msgid "Factor List:" msgid "_Factor List:" msgstr "Lista de Fator:" #: src/ui/gui/examine.ui:163 src/ui/gui/means.ui:126 #, fuzzy #| msgid "Dependent List:" msgid "_Dependent List:" msgstr "Lista Dependente:" #: src/ui/gui/examine.ui:331 msgid "Explore: Options" msgstr "" #: src/ui/gui/examine.ui:355 src/ui/gui/t-test.ui:81 msgid "Exclude cases _listwise" msgstr "Excluir casos _listwise" #: src/ui/gui/examine.ui:373 #, fuzzy #| msgid "Exclude cases _listwise" msgid "Exclude cases _pairwise" msgstr "Excluir casos _listwise" #: src/ui/gui/examine.ui:392 #, fuzzy #| msgid "Repeat values" msgid "_Report values" msgstr "Repetir valores" #: src/ui/gui/examine.ui:449 #, fuzzy #| msgid "Test Statistics" msgid "Explore: Statistics" msgstr "Testes estatísticos" #: src/ui/gui/examine.ui:468 src/ui/gui/oneway.ui:576 msgid "_Descriptives" msgstr "_Descritivas" #: src/ui/gui/examine.ui:485 #, fuzzy #| msgid "Extremes" msgid "_Extremes" msgstr "Extremos" #: src/ui/gui/examine.ui:502 #, fuzzy #| msgid "Percentiles" msgid "_Percentiles" msgstr "Percentis" #: src/ui/gui/goto-case.ui:31 #, fuzzy #| msgid "_Goto Case" msgid "Goto Case" msgstr "_Ir para Caso" #: src/ui/gui/goto-case.ui:52 msgid "Goto Case Number:" msgstr "Ir Para Caso Número:" #: src/ui/gui/factor.ui:39 msgid "Factor Analysis: Rotation" msgstr "" #: src/ui/gui/factor.ui:70 #, fuzzy #| msgid "None" msgid "_None" msgstr "Nenhum" #: src/ui/gui/factor.ui:87 #, fuzzy #| msgid "_Variables" msgid "_Varimax" msgstr "_Variáveis" #: src/ui/gui/factor.ui:104 msgid "_Quartimax" msgstr "" #: src/ui/gui/factor.ui:123 msgid "_Equimax" msgstr "" #: src/ui/gui/factor.ui:146 msgid "Method" msgstr "" #: src/ui/gui/factor.ui:159 #, fuzzy msgid "_Display rotated solution" msgstr "informação do arquivo de dados" #: src/ui/gui/factor.ui:181 src/ui/gui/factor.ui:582 msgid "Ma_ximum iterations for convergence:" msgstr "" #: src/ui/gui/factor.ui:241 src/ui/gui/factor.ui:255 msgid "Principal Components Analysis" msgstr "" #: src/ui/gui/factor.ui:246 src/ui/gui/factor.ui:258 msgid "Principal Axis Factoring" msgstr "" #: src/ui/gui/factor.ui:264 msgid "Factor Analysis: Extraction" msgstr "" #: src/ui/gui/factor.ui:290 msgid "_Method: " msgstr "" #: src/ui/gui/factor.ui:345 msgid "Co_rrelation matrix" msgstr "" #: src/ui/gui/factor.ui:361 #, fuzzy #| msgid "Covariances" msgid "Co_variance matrix" msgstr "Co-variança" #: src/ui/gui/factor.ui:382 #, fuzzy #| msgid "_Analyze" msgid "Analyze" msgstr "A_nalisar" #: src/ui/gui/factor.ui:407 msgid "_Unrotated factor solution" msgstr "" #: src/ui/gui/factor.ui:423 msgid "_Scree plot" msgstr "" #: src/ui/gui/factor.ui:443 src/ui/gui/histogram.ui:146 src/ui/gui/roc.ui:329 #, fuzzy #| msgid "Cell Display" msgid "Display" msgstr "Visualizar Célula" #: src/ui/gui/factor.ui:526 msgid "_Number of factors:" msgstr "" #: src/ui/gui/factor.ui:563 msgid "Extract" msgstr "" #: src/ui/gui/factor.ui:640 #, fuzzy #| msgid "Factor List:" msgid "Factor Analysis" msgstr "Lista de Fator:" #: src/ui/gui/factor.ui:672 src/ui/gui/data-editor.ui:266 #, fuzzy #| msgid "_Descriptives" msgid "_Descriptives..." msgstr "_Descritivas" #: src/ui/gui/factor.ui:685 msgid "_Extraction..." msgstr "" #: src/ui/gui/factor.ui:699 #, fuzzy #| msgid "Options..." msgid "_Rotations..." msgstr "Opções..." #: src/ui/gui/find.ui:25 msgid "Find Case" msgstr "Localizar Casos" #: src/ui/gui/find.ui:117 msgid "Variable:" msgstr "Variável:" #: src/ui/gui/find.ui:157 src/ui/gui/val-labs-dialog.ui:113 msgid "Value:" msgstr "Valor:" #: src/ui/gui/find.ui:180 msgid "Search value labels" msgstr "Procurar por rótulos de valores" #: src/ui/gui/find.ui:210 msgid "Regular expression Match" msgstr "Casamento da expressão Regular" #: src/ui/gui/find.ui:227 msgid "Search substrings" msgstr "Procurar sub-strings" #: src/ui/gui/find.ui:244 msgid "Wrap around" msgstr "" #: src/ui/gui/find.ui:260 msgid "Search backward" msgstr "Pesquisa reversa" #: src/ui/gui/frequencies.ui:32 #, fuzzy #| msgid "Display Frequency Table" msgid "Frequencies: Frequency Tables" msgstr "Exibir Tabela de Frequência" #: src/ui/gui/frequencies.ui:67 msgid "_Always" msgstr "" #: src/ui/gui/frequencies.ui:85 msgid "_Never" msgstr "" #: src/ui/gui/frequencies.ui:107 msgid "If no _more than " msgstr "" #: src/ui/gui/frequencies.ui:129 src/ui/gui/frequencies.ui:454 msgid "100" msgstr "" #: src/ui/gui/frequencies.ui:145 #, fuzzy #| msgid "Values" msgid "values" msgstr "Valores" #: src/ui/gui/frequencies.ui:167 #, fuzzy #| msgid "Display Frequency Table" msgid "Display frequency tables" msgstr "Exibir Tabela de Frequência" #: src/ui/gui/frequencies.ui:194 #, fuzzy #| msgid "Ascending" msgid "A_scending value" msgstr "Ascendente" #: src/ui/gui/frequencies.ui:212 #, fuzzy #| msgid "Descending" msgid "D_escending value" msgstr "Descendente" #: src/ui/gui/frequencies.ui:230 #, fuzzy #| msgid "Ascending Order" msgid "Ascending _frequency" msgstr "Ordem Ascendente" #: src/ui/gui/frequencies.ui:248 #, fuzzy #| msgid "Descending Order" msgid "Descending f_requency" msgstr "Ordem Descendente" #: src/ui/gui/frequencies.ui:271 msgid "Order by" msgstr "Ordenar por" #: src/ui/gui/frequencies.ui:324 #, fuzzy #| msgid "Frequencies" msgid "Frequencies: Charts" msgstr "Frequência" #: src/ui/gui/frequencies.ui:356 #, fuzzy #| msgid "Scale" msgid "Scale:" msgstr "Escalar" #: src/ui/gui/frequencies.ui:366 msgid "_Frequencies" msgstr "_Frequências" #: src/ui/gui/frequencies.ui:383 #, fuzzy #| msgid "Percentiles" msgid "_Percentages" msgstr "Percentis" #: src/ui/gui/frequencies.ui:407 #, fuzzy #| msgid "Exclude cases _listwise" msgid "Exclude values _below " msgstr "Excluir casos _listwise" #: src/ui/gui/frequencies.ui:422 #, fuzzy #| msgid "Exclude cases _listwise" msgid "Exclude values _above " msgstr "Excluir casos _listwise" #: src/ui/gui/frequencies.ui:441 src/ui/gui/reliability.ui:227 msgid "0" msgstr "" #: src/ui/gui/frequencies.ui:469 #, fuzzy #| msgid "Quoting" msgid "Chart Formatting" msgstr "Quoting" #: src/ui/gui/frequencies.ui:494 msgid "Draw _histograms" msgstr "" #: src/ui/gui/frequencies.ui:510 msgid "Superimpose _normal curve" msgstr "" #: src/ui/gui/frequencies.ui:530 #, fuzzy #| msgid "Separators" msgid "Histograms" msgstr "Separadores" #: src/ui/gui/frequencies.ui:555 msgid "Draw _bar charts" msgstr "" #: src/ui/gui/frequencies.ui:575 #, fuzzy #| msgid "Separators" msgid "Bar Charts" msgstr "Separadores" #: src/ui/gui/frequencies.ui:600 msgid "Draw _pie charts" msgstr "" #: src/ui/gui/frequencies.ui:616 #, fuzzy #| msgid "_Discrete missing values" msgid "Include slices for _missing values" msgstr "Missing values _discretos" #: src/ui/gui/frequencies.ui:636 #, fuzzy #| msgid "Separators" msgid "Pie Charts" msgstr "Separadores" #: src/ui/gui/frequencies.ui:725 src/ui/gui/rank.ui:489 #, fuzzy #| msgid "Variable(s):" msgid "_Variable(s):" msgstr "Variável(is):" #: src/ui/gui/frequencies.ui:769 #, fuzzy #| msgid "Statistics:" msgid "_Statistics:" msgstr "Estatísticas:" #: src/ui/gui/frequencies.ui:783 #, fuzzy #| msgid "_No missing values" msgid "Include _missing values" msgstr "Sem missi_ng values" #: src/ui/gui/frequencies.ui:806 #, fuzzy #| msgid "_Contrasts..." msgid "Ch_arts..." msgstr "_Contrastes..." #: src/ui/gui/frequencies.ui:821 #, fuzzy #| msgid "Frequency Variable" msgid "Frequency _Tables..." msgstr "Frequência da Variável" #: src/ui/gui/histogram.ui:24 msgid "Histogram" msgstr "" #: src/ui/gui/histogram.ui:126 msgid "_Display normal curve" msgstr "" #: src/ui/gui/indep-samples.ui:25 src/ui/gui/k-independent.ui:35 msgid "Define Groups" msgstr "Define grupos" #: src/ui/gui/indep-samples.ui:75 msgid "Group_2 value:" msgstr "Valor do grupo_2:" #: src/ui/gui/indep-samples.ui:89 msgid "Group_1 value:" msgstr "Valor do grupo_1:" #: src/ui/gui/indep-samples.ui:190 msgid "_Use specified values:" msgstr "" #: src/ui/gui/indep-samples.ui:259 #, fuzzy #| msgid "_Independent Samples T Test" msgid "Independent-Samples T Test" msgstr "Teste T para Amostras _Independentes" #: src/ui/gui/indep-samples.ui:319 #, fuzzy #| msgid "Define Groups" msgid "_Define Groups..." msgstr "Define grupos" #: src/ui/gui/indep-samples.ui:401 src/ui/gui/t-test.ui:211 #, fuzzy #| msgid "Test Variable(s):" msgid "_Test Variable(s):" msgstr "Variável(is) de teste:" #: src/ui/gui/indep-samples.ui:454 src/ui/gui/k-independent.ui:165 #, fuzzy #| msgid "Target Variable:" msgid "_Grouping Variable:" msgstr "Variável alvo:" #: src/ui/gui/k-independent.ui:63 msgid "_Upper limit:" msgstr "" #: src/ui/gui/k-independent.ui:77 msgid "_Lower limit:" msgstr "" #: src/ui/gui/k-independent.ui:136 #, fuzzy #| msgid "Independent Samples Test" msgid "Tests for Several Independent Samples" msgstr "Teste de Amostras Independentes" #: src/ui/gui/k-independent.ui:208 src/ui/gui/ks-one-sample.ui:131 #, fuzzy #| msgid "Test Variable(s):" msgid "Test _Variable List:" msgstr "Variável(is) de teste:" #: src/ui/gui/k-independent.ui:320 #, fuzzy #| msgid "Define Groups" msgid "_Define Groups" msgstr "Define grupos" #: src/ui/gui/k-independent.ui:365 msgid "_Kruskal-Wallis H" msgstr "" #: src/ui/gui/k-independent.ui:382 src/ui/gui/runs.ui:140 msgid "_Median" msgstr "" #: src/ui/gui/k-means.ui:24 msgid "K-Means Cluster Analysis" msgstr "" #: src/ui/gui/k-means.ui:122 msgid "N_umber of Clusters: " msgstr "" #: src/ui/gui/k-related.ui:24 msgid "Tests for Several Related Samples" msgstr "" #: src/ui/gui/k-related.ui:113 #, fuzzy #| msgid "Test Variable(s):" msgid "_Test Variables:" msgstr "Variável(is) de teste:" #: src/ui/gui/k-related.ui:145 msgid "_Friedman" msgstr "" #: src/ui/gui/k-related.ui:161 msgid "_Kendall's W" msgstr "" #: src/ui/gui/k-related.ui:177 msgid "_Cochran's Q" msgstr "" #: src/ui/gui/ks-one-sample.ui:163 #, fuzzy #| msgid "Format" msgid "_Normal" msgstr "Formato" #: src/ui/gui/ks-one-sample.ui:181 msgid "_Poisson" msgstr "" #: src/ui/gui/ks-one-sample.ui:198 #, fuzzy #| msgid "_Transform" msgid "_Uniform" msgstr "_Transformar" #: src/ui/gui/ks-one-sample.ui:213 #, fuzzy #| msgid "_Explore" msgid "_Exponential" msgstr "_Explorar" #: src/ui/gui/ks-one-sample.ui:232 msgid "Test Distribution" msgstr "" #: src/ui/gui/logistic.ui:42 msgid "Logistic Regression: Options" msgstr "" #: src/ui/gui/logistic.ui:66 msgid "CI for _exp(B): " msgstr "" #: src/ui/gui/logistic.ui:97 #, fuzzy msgid "%" msgstr "%d" #: src/ui/gui/logistic.ui:146 msgid "Classification cu_toff: " msgstr "" #: src/ui/gui/logistic.ui:159 msgid "_Maximum Iterations: " msgstr "" #: src/ui/gui/logistic.ui:177 msgid "Include _constant in model" msgstr "" #: src/ui/gui/logistic.ui:219 #, fuzzy #| msgid "Linear _Regression" msgid "Logistic Regression" msgstr "Regressão Linear" #: src/ui/gui/logistic.ui:364 src/ui/gui/regression.ui:185 #, fuzzy #| msgid "Dependent" msgid "_Dependent" msgstr "Dependente" #: src/ui/gui/logistic.ui:412 src/ui/gui/regression.ui:232 #, fuzzy #| msgid "Independent" msgid "_Independent" msgstr "Independente" #: src/ui/gui/means.ui:25 #, fuzzy #| msgid "Mean" msgid "Means" msgstr "Média" #: src/ui/gui/means.ui:179 #, fuzzy #| msgid "Dependent List:" msgid "_Independent List:" msgstr "Lista Dependente:" #: src/ui/gui/missing-val-dialog.ui:48 msgid "_No missing values" msgstr "Sem missi_ng values" #: src/ui/gui/missing-val-dialog.ui:136 msgid "_Discrete missing values" msgstr "Missing values _discretos" #: src/ui/gui/missing-val-dialog.ui:172 msgid "_Low:" msgstr "_Menor:" #: src/ui/gui/missing-val-dialog.ui:197 msgid "_High:" msgstr "Ma_ior:" #: src/ui/gui/missing-val-dialog.ui:221 msgid "Di_screte value:" msgstr "Valor Di_screto:" #: src/ui/gui/missing-val-dialog.ui:245 msgid "_Range plus one optional discrete missing value" msgstr "" #: src/ui/gui/oneway.ui:25 #, fuzzy #| msgid "One Way _ANOVA" msgid "One-Way ANOVA: Contrasts" msgstr "_ANOVA de Um Fator" #: src/ui/gui/oneway.ui:107 msgid "_Coefficients:" msgstr "_Coeficientes:" #: src/ui/gui/oneway.ui:161 msgid "Coefficient Total: " msgstr "Coeficiente Total: " #: src/ui/gui/oneway.ui:198 msgid "Contrast 1 of 1" msgstr "Contraste 1 de 1" #: src/ui/gui/oneway.ui:234 #, fuzzy #| msgid "One Way _ANOVA" msgid "One-Way ANOVA: Post-Hoc" msgstr "_ANOVA de Um Fator" #: src/ui/gui/oneway.ui:270 msgid "Games Howell" msgstr "" #: src/ui/gui/oneway.ui:287 msgid "Fisher's LSD" msgstr "" #: src/ui/gui/oneway.ui:379 #, fuzzy #| msgid "One Way _ANOVA" msgid "One-Way ANOVA" msgstr "_ANOVA de Um Fator" #: src/ui/gui/oneway.ui:408 msgid "_Factor:" msgstr "_Fator:" #: src/ui/gui/oneway.ui:451 msgid "Dependent _Variable(s):" msgstr "_Variável(s) Dependente(s)" #: src/ui/gui/oneway.ui:593 msgid "_Homogeneity" msgstr "_Homogeneidade" #: src/ui/gui/oneway.ui:637 msgid "Post-Hoc..." msgstr "" #: src/ui/gui/oneway.ui:652 msgid "_Contrasts..." msgstr "_Contrastes..." #: src/ui/gui/options.ui:25 #, fuzzy #| msgid "Options:" msgid "Options Case" msgstr "Opções:" #: src/ui/gui/options.ui:55 #, fuzzy #| msgid "Value _Labels" msgid "Display _Labels" msgstr "_Labels" #: src/ui/gui/options.ui:71 msgid "Display _Names" msgstr "" #: src/ui/gui/options.ui:99 #, fuzzy #| msgid "Sort by:" msgid "Sort by L_abel" msgstr "Ordenar por:" #: src/ui/gui/options.ui:115 #, fuzzy #| msgid "Sort by:" msgid "Sort by Na_me" msgstr "Ordenar por:" #: src/ui/gui/options.ui:131 msgid "Do not S_ort" msgstr "" #: src/ui/gui/options.ui:159 #, fuzzy #| msgid "Variables" msgid "Variable Lists" msgstr "Variáveis" #: src/ui/gui/options.ui:184 msgid "Ma_ximize" msgstr "" #: src/ui/gui/options.ui:199 msgid "_Raise" msgstr "" #: src/ui/gui/options.ui:214 msgid "Aler_t" msgstr "" #: src/ui/gui/options.ui:233 msgid "Output Window Action" msgstr "" #: src/ui/gui/paired-samples.ui:147 #, fuzzy #| msgid "Test Variable(s):" msgid "_Test Pair(s):" msgstr "Variável(is) de teste:" #: src/ui/gui/rank.ui:30 #, fuzzy #| msgid "Rank Cases" msgid "Rank Cases: Types" msgstr "Ordenamento de Casos" # lala #: src/ui/gui/rank.ui:57 #, fuzzy #| msgid "Sum of case weights" msgid "Sum of case _weights" msgstr "Soma dos pesos dos casos" #: src/ui/gui/rank.ui:74 msgid "Fractional rank as _%" msgstr "" #: src/ui/gui/rank.ui:92 msgid "_Fractional rank" msgstr "" #: src/ui/gui/rank.ui:109 msgid "_Savage score" msgstr "" #: src/ui/gui/rank.ui:125 #, fuzzy #| msgid "Rank" msgid "_Rank" msgstr "Ordenamento" #: src/ui/gui/rank.ui:147 #, fuzzy #| msgid "Ntiles" msgid "N_tiles" msgstr "Ntiles" #: src/ui/gui/rank.ui:195 #, fuzzy #| msgid "Proportion Estimates" msgid "_Proportion Estimates" msgstr "Estimativas de proporção" #: src/ui/gui/rank.ui:213 msgid "_Normal Scores" msgstr "" #: src/ui/gui/rank.ui:251 #, fuzzy #| msgid "Blom" msgid "_Blom" msgstr "Blom" #: src/ui/gui/rank.ui:269 #, fuzzy #| msgid "Tukey" msgid "Tuke_y" msgstr "Tukey" #: src/ui/gui/rank.ui:287 msgid "Ran_kit" msgstr "" #: src/ui/gui/rank.ui:305 #, fuzzy #| msgid "Van der Wärden" msgid "_Van der Waerden" msgstr "Van der Wärden" #: src/ui/gui/rank.ui:328 msgid "Proportion Estimation Formula" msgstr "" #: src/ui/gui/rank.ui:369 msgid "Rank Cases" msgstr "Ordenamento de Casos" #: src/ui/gui/rank.ui:434 msgid "_By:" msgstr "" #: src/ui/gui/rank.ui:595 msgid "_Smallest Value" msgstr "_Menor Valor" #: src/ui/gui/rank.ui:613 msgid "_Largest Value" msgstr "_Maior Valor" #: src/ui/gui/rank.ui:637 msgid "Assign rank 1 to:" msgstr "" #: src/ui/gui/rank.ui:656 msgid "_Display summary tables" msgstr "_Exibir tabelas de resumo" #: src/ui/gui/rank.ui:679 msgid "Rank T_ypes" msgstr "Tipos de _Ordenamento" #: src/ui/gui/rank.ui:694 msgid "_Ties..." msgstr "" #: src/ui/gui/rank.ui:756 #, fuzzy #| msgid "Rank Cases" msgid "Rank Cases: Ties" msgstr "Ordenamento de Casos" #: src/ui/gui/rank.ui:788 msgid "_Mean" msgstr "_Média" #: src/ui/gui/rank.ui:806 msgid "_Low" msgstr "_Mínimo" #: src/ui/gui/rank.ui:825 msgid "_High" msgstr "Máxim_o" #: src/ui/gui/rank.ui:851 msgid "_Sequential ranks to unique values" msgstr "" #: src/ui/gui/rank.ui:875 msgid "Rank Assigned to Ties" msgstr "" #: src/ui/gui/runs.ui:155 msgid "M_ean" msgstr "" #: src/ui/gui/runs.ui:171 msgid "Mo_de" msgstr "" #: src/ui/gui/runs.ui:191 #, fuzzy #| msgid "Custom" msgid "_Custom:" msgstr "Personalizado" #: src/ui/gui/runs.ui:230 #, fuzzy #| msgid "_Cut point:" msgid "Cut Point" msgstr "Ponto de _corte:" #: src/ui/gui/sort.ui:25 #, fuzzy #| msgid "_Sort Cases" msgid "Sort Cases" msgstr "_Ordenar Casos" #: src/ui/gui/sort.ui:101 msgid "Sort by:" msgstr "Ordenar por:" #: src/ui/gui/sort.ui:174 msgid "Descending" msgstr "Descendente" #: src/ui/gui/sort.ui:196 msgid "Sort Order" msgstr "Ordenação" #: src/ui/gui/split-file.ui:25 msgid "Split File" msgstr "Dividir Arquivo" #: src/ui/gui/split-file.ui:103 #, fuzzy #| msgid "Analyze all cases. Do not create groups." msgid "Anal_yze all cases. Do not create groups." msgstr "Analisar todos os casos. Não criar grupos." #: src/ui/gui/split-file.ui:121 #, fuzzy #| msgid "Compare groups." msgid "Compare _groups." msgstr "Comparar grupos." #: src/ui/gui/split-file.ui:140 #, fuzzy #| msgid "Organize output by groups." msgid "Organize ou_tput by groups." msgstr "Organizar saída por grupos." #: src/ui/gui/split-file.ui:225 #, fuzzy #| msgid "Groups based on:" msgid "Groups _based on:" msgstr "Grupos baseados em:" #: src/ui/gui/split-file.ui:255 #, fuzzy #| msgid "Sort the file by grouping variables." msgid "_Sort the file by grouping variables." msgstr "Ordenar o arquivo agrupando variáveis." #: src/ui/gui/split-file.ui:273 #, fuzzy #| msgid "File is already sorted." msgid "_File is already sorted." msgstr "Arquivo já está ordenado." #: src/ui/gui/split-file.ui:334 msgid "Current Status : " msgstr "Status Atual : " #: src/ui/gui/split-file.ui:348 msgid "Analysis by groups is off" msgstr "Análise por grupos está desabilitada" #: src/ui/gui/recode.ui:135 #, fuzzy #| msgid "System Missing" msgid "System _Missing" msgstr "System Missing" #: src/ui/gui/recode.ui:150 #, fuzzy #| msgid "Copy old values" msgid "Co_py old values" msgstr "Copiar valores antigos" #: src/ui/gui/recode.ui:172 #, fuzzy #| msgid "Value: " msgid "Va_lue: " msgstr "Valor: " #: src/ui/gui/recode.ui:276 #, fuzzy #| msgid "Convert numeric strings to numbers ('5' -> 5)" msgid "Conver_t numeric strings to numbers (`5' -> 5)" msgstr "Converter stringe numérica para número ('5' -> 5)" #: src/ui/gui/recode.ui:297 #, fuzzy #| msgid "Output variables are strings" msgid "Output variables are _strings" msgstr "Variáveis de outputt são strings" #: src/ui/gui/recode.ui:318 msgid "Width: " msgstr "Tamanho: " #: src/ui/gui/recode.ui:499 #, fuzzy #| msgid "Name:" msgid "_Name:" msgstr "Nome:" #: src/ui/gui/recode.ui:527 #, fuzzy #| msgid "Label:" msgid "La_bel:" msgstr "Label:" #: src/ui/gui/recode.ui:556 #, fuzzy #| msgid "Change" msgid "Chan_ge" msgstr "Mudar" #: src/ui/gui/recode.ui:584 msgid "Output Variable" msgstr "Variável de Saída" #: src/ui/gui/recode.ui:658 #, fuzzy #| msgid "Old and New Values" msgid "Old and New Va_lues..." msgstr "Antigos e Novos Valores" #: src/ui/gui/regression.ui:51 #, fuzzy #| msgid "Statistics..." msgid "S_tatistics..." msgstr "Estatísticas..." #: src/ui/gui/regression.ui:272 #, fuzzy #| msgid "Regression" msgid "Regression: Save" msgstr "Regressão" #: src/ui/gui/regression.ui:290 src/ui/gui/univariate.ui:42 #, fuzzy #| msgid "Predicted values" msgid "_Predicted values" msgstr "Valores esperados" #: src/ui/gui/regression.ui:307 src/ui/gui/univariate.ui:59 #, fuzzy #| msgid "Residuals" msgid "_Residuals" msgstr "Residuais" #: src/ui/gui/regression.ui:351 #, fuzzy #| msgid "Test Statistics" msgid "Regression: Statistics" msgstr "Testes estatísticos" #: src/ui/gui/regression.ui:393 src/ui/gui/univariate.ui:143 #, fuzzy #| msgid "Statistics" msgid "S_tatistics" msgstr "Estatísticas" #: src/ui/gui/reliability.ui:34 msgid "Alpha" msgstr "" #: src/ui/gui/reliability.ui:43 msgid "Reliability Analysis" msgstr "" #: src/ui/gui/reliability.ui:144 msgid "_Items:" msgstr "" #: src/ui/gui/reliability.ui:166 #, fuzzy msgid "_Model: " msgstr "Modo:" #: src/ui/gui/reliability.ui:212 #, fuzzy msgid "_Variables in first split:" msgstr "Informação da Variável:" #: src/ui/gui/reliability.ui:259 msgid "Show _descriptives for scale if item is deleted" msgstr "" #: src/ui/gui/roc.ui:145 #, fuzzy #| msgid "Test Variable(s):" msgid "_Test Variable:" msgstr "Variável(is) de teste:" #: src/ui/gui/roc.ui:175 #, fuzzy #| msgid "Name Variable:" msgid "_State Variable:" msgstr "Nome da Variável" #: src/ui/gui/roc.ui:202 #, fuzzy #| msgid "Use filter variable" msgid "_Value of state variable:" msgstr "Usar variável de filtro" #: src/ui/gui/roc.ui:249 msgid "ROC C_urve" msgstr "" #: src/ui/gui/roc.ui:269 msgid "_With diagonal reference line" msgstr "" #: src/ui/gui/roc.ui:293 #, fuzzy #| msgid "95%% Confidence Interval" msgid "Standard _Error and Confidence Interval" msgstr "Intervalo de confiança de 95%%" #: src/ui/gui/roc.ui:309 msgid "_Coordinate points of the ROC Curve" msgstr "" #: src/ui/gui/scatterplot.ui:25 msgid "Scatterplot" msgstr "" #: src/ui/gui/scatterplot.ui:56 msgid "_X Axis:" msgstr "" #: src/ui/gui/scatterplot.ui:100 msgid "_Y Axis:" msgstr "" #: src/ui/gui/select-cases.ui:37 #, fuzzy #| msgid "Select Cases" msgid "Select Cases: Range" msgstr "Selecionar Casos" #: src/ui/gui/select-cases.ui:87 msgid "First case" msgstr "Primeiro caso" #: src/ui/gui/select-cases.ui:99 msgid "Last case" msgstr "Último caso" #: src/ui/gui/select-cases.ui:111 msgid "Observation" msgstr "Observação" #: src/ui/gui/select-cases.ui:161 msgid "Select Cases" msgstr "Selecionar Casos" #: src/ui/gui/select-cases.ui:313 msgid "Use filter variable" msgstr "Usar variável de filtro" #: src/ui/gui/select-cases.ui:380 msgid "Based on time or case range" msgstr "Baseado no tempo ou intervalo do caso" #: src/ui/gui/select-cases.ui:395 msgid "Range..." msgstr "Intervalo..." #: src/ui/gui/select-cases.ui:444 msgid "Random sample of cases" msgstr "Amostra aleatória de casos" #: src/ui/gui/select-cases.ui:460 msgid "Sample..." msgstr "Amostra..." #: src/ui/gui/select-cases.ui:508 msgid "If condition is satisfied" msgstr "Se condição é satisfeita" #: src/ui/gui/select-cases.ui:523 msgid "If..." msgstr "Se..." #: src/ui/gui/select-cases.ui:567 msgid "All Cases" msgstr "Todos os Casos" #: src/ui/gui/select-cases.ui:581 msgid "Select" msgstr "Selecionar" #: src/ui/gui/select-cases.ui:608 msgid "Filtered" msgstr "Filtrado" #: src/ui/gui/select-cases.ui:625 msgid "Deleted" msgstr "Apagado" #: src/ui/gui/select-cases.ui:647 msgid "Unselected Cases Are" msgstr "Casos não selecionados São" #: src/ui/gui/select-cases.ui:694 #, fuzzy #| msgid "Select Cases" msgid "Select Cases: Random Sample" msgstr "Selecionar Casos" #: src/ui/gui/select-cases.ui:756 msgid "Sample Size" msgstr "Tamanho da Amostra" #: src/ui/gui/t-test.ui:25 #, fuzzy #| msgid "Options:" msgid "Options" msgstr "Opções:" #: src/ui/gui/t-test.ui:63 msgid "Exclude cases _analysis by analysis" msgstr "" #: src/ui/gui/t-test.ui:148 #, fuzzy #| msgid "_One Sample T Test" msgid "One - Sample T Test" msgstr "Teste T Para Uma Am_ostra" #: src/ui/gui/t-test.ui:265 #, fuzzy #| msgid "Test Value: " msgid "Test _Value: " msgstr "Valor de teste: " #: src/ui/gui/text-data-import.ui:32 msgid "Select the first line of the data file that contains data." msgstr "Selecione a primeira linha do arquivo de dados que contem dados." #: src/ui/gui/text-data-import.ui:54 msgid "Line above selected line contains variable names" msgstr "" #: src/ui/gui/text-data-import.ui:80 msgid "" "Check the data formats displayed below and fix any that are incorrect. You " "may set other variable properties now or later." msgstr "" "Verifique os formatos de dados exibidos abaixo e corrija os incorretos. Você " "pode definir outras propriedades das variáveis agora ou mais tarde." #: src/ui/gui/text-data-import.ui:121 msgid "Variables" msgstr "Variáveis" #: src/ui/gui/text-data-import.ui:152 msgid "Data Preview" msgstr "Visualização de dados" #: src/ui/gui/text-data-import.ui:181 #, fuzzy #| msgid "" #| "This assistant will guide you through the process of importing data into " #| "PSPP from a text file with one line per case, in which fields are " #| "separated by tabs, commas, or other delimiters.\n" #| "\n" #| "The selected file contains N lines of text. Only the first M of these " #| "will be shown for preview purposes in the following screens. You may " #| "choose below how much of the file should actually be imported." msgid "" "This assistant will guide you through the process of importing data into " "PSPP from a text file with one line per case, in which fields are separated " "by tabs, commas, or other delimiters.\n" "\n" "\tThe selected file contains N lines of text. Only the first M of these " "will be shown for preview purposes in the following screens. You may choose " "below how much of the file should actually be imported." msgstr "" "Este assistente irá acompanhá-lo durante o processo de importar dados para o " "PSPP de um arquivo de texto com um caso por linha, no qual campos são " "separados por tabulações, vírgulas ou outros delimitadores.\n" "\n" "O arquivo selecionado contém N linhas de texto. Apenas as M primeiras destas " "irão ser exibidas como pré-visualização nas telas seguintes. Você pode " "escolher abaixo quanto do arquivo deve ser efetivamente importado." #: src/ui/gui/text-data-import.ui:252 msgid "All cases" msgstr "Todos os casos" #: src/ui/gui/text-data-import.ui:272 msgid "Amount to Import" msgstr "Quantidade para importar" #: src/ui/gui/text-data-import.ui:325 msgid "C_ustom" msgstr "Personalizad_o" #: src/ui/gui/text-data-import.ui:341 msgid "Slas_h (/)" msgstr "Barr_a (/)" #: src/ui/gui/text-data-import.ui:357 msgid "Semicolo_n (;)" msgstr "Po_nto-e-vírgula (;)" #: src/ui/gui/text-data-import.ui:373 msgid "P_ipe (|)" msgstr "P_ipe (|)" #: src/ui/gui/text-data-import.ui:389 msgid "H_yphen (-)" msgstr "Híf_en (-) " #: src/ui/gui/text-data-import.ui:405 msgid "Co_mma (,)" msgstr "Vírgul_a (,)" #: src/ui/gui/text-data-import.ui:421 msgid "_Colon (:)" msgstr "Dois-P_ontos (:)" #: src/ui/gui/text-data-import.ui:437 msgid "Ban_g (!)" msgstr "Exclamaçã_o (!)" #: src/ui/gui/text-data-import.ui:453 msgid "Ta_b" msgstr "Ta_bulação" #: src/ui/gui/text-data-import.ui:469 msgid "_Space" msgstr "E_spaço" #: src/ui/gui/text-data-import.ui:490 msgid "Separators" msgstr "Separadores" #: src/ui/gui/text-data-import.ui:541 msgid "Quote separator characters with" msgstr "" #: src/ui/gui/text-data-import.ui:561 msgid "Quoting" msgstr "Quoting" #: src/ui/gui/text-data-import.ui:599 msgid "Fields Preview" msgstr "Visualização dos campos" #: src/ui/gui/text-data-import.ui:622 msgid "" "Enter below the sheet number and the cell range which you wish to import." msgstr "" #: src/ui/gui/text-data-import.ui:670 #, fuzzy #| msgid "Cells..." msgid "_Cells: " msgstr "Células..." #: src/ui/gui/text-data-import.ui:684 msgid "_Sheet Index: " msgstr "" #: src/ui/gui/text-data-import.ui:695 #, fuzzy #| msgid "%s is not a variable name." msgid "Use first row as _variable names" msgstr "%s não é um nome válido." #: src/ui/gui/text-data-import.ui:717 #, fuzzy #| msgid "Amount to Import" msgid "Cells to Import" msgstr "Quantidade para importar" #: src/ui/gui/transpose.ui:24 #, fuzzy #| msgid "_Transpose" msgid "Transpose" msgstr "_Transpor" #: src/ui/gui/transpose.ui:91 msgid "Name Variable:" msgstr "Nome da Variável" #: src/ui/gui/transpose.ui:127 msgid "Variable(s):" msgstr "Variável(is):" #: src/ui/gui/univariate.ui:25 msgid "Univariate: Save" msgstr "" #: src/ui/gui/univariate.ui:103 #, fuzzy msgid "Univariate: Statistics" msgstr "Testes estatísticos" #: src/ui/gui/univariate.ui:178 msgid "Univariate" msgstr "" #: src/ui/gui/univariate.ui:281 #, fuzzy #| msgid "Dependent _Variable(s):" msgid "_Dependent Variable" msgstr "_Variável(s) Dependente(s)" #: src/ui/gui/univariate.ui:329 #, fuzzy #| msgid "_Factor:" msgid "_Fixed Factors" msgstr "_Fator:" #: src/ui/gui/val-labs-dialog.ui:101 msgid "Value Label:" msgstr "Value Label:" #: src/ui/gui/data-editor.ui:33 msgid "Information Area" msgstr "Área de Informação" #: src/ui/gui/data-editor.ui:55 msgid "Case Counter Area" msgstr "Área de Contagem dos Casos" #: src/ui/gui/data-editor.ui:80 msgid "Filter Use Status Area" msgstr "Área de Status do Uso de Filtros" #: src/ui/gui/data-editor.ui:106 msgid "Weight Status Area" msgstr "Área de Status dos Pesos" #: src/ui/gui/data-editor.ui:132 msgid "Split File Status Area" msgstr "Área de Status da Divisão de Arquivos" #: src/ui/gui/data-editor.ui:154 msgid "_View" msgstr "_Ver" #: src/ui/gui/data-editor.ui:157 msgid "_Status Bar" msgstr "_Barra de Status" #: src/ui/gui/data-editor.ui:163 #, fuzzy #| msgid "_Fonts" msgid "_Font..." msgstr "_Fontes" #: src/ui/gui/data-editor.ui:167 msgid "_Grid Lines" msgstr "_Linhas da Grade" #: src/ui/gui/data-editor.ui:171 msgid "Value _Labels" msgstr "_Labels" #: src/ui/gui/data-editor.ui:182 msgid "_Variables" msgstr "_Variáveis" #: src/ui/gui/data-editor.ui:192 #, fuzzy #| msgid "_Sort Cases" msgid "_Sort Cases..." msgstr "_Ordenar Casos" #: src/ui/gui/data-editor.ui:196 #, fuzzy #| msgid "_Transpose" msgid "_Transpose..." msgstr "_Transpor" #: src/ui/gui/data-editor.ui:200 msgid "_Aggregate..." msgstr "" #: src/ui/gui/data-editor.ui:206 #, fuzzy #| msgid "S_plit File" msgid "S_plit File..." msgstr "_Dividir Arquivo" #: src/ui/gui/data-editor.ui:210 #, fuzzy #| msgid "Select _Cases" msgid "Select _Cases..." msgstr "Selecionar _Casos" #: src/ui/gui/data-editor.ui:214 #, fuzzy #| msgid "_Weight Cases" msgid "_Weight Cases..." msgstr "Dar _Peso aos Casos" #: src/ui/gui/data-editor.ui:220 msgid "_Transform" msgstr "_Transformar" #: src/ui/gui/data-editor.ui:223 #, fuzzy #| msgid "_Compute" msgid "_Compute..." msgstr "_Computar" #: src/ui/gui/data-editor.ui:227 msgid "Cou_nt..." msgstr "" #: src/ui/gui/data-editor.ui:231 #, fuzzy #| msgid "Ran_k Cases" msgid "Ran_k Cases..." msgstr "Classificar Casos" #: src/ui/gui/data-editor.ui:235 msgid "Auto_matic Recode..." msgstr "" #: src/ui/gui/data-editor.ui:241 #, fuzzy #| msgid "Recode into _Same Variables" msgid "Recode into _Same Variables..." msgstr "Recodificar na _Mesma Variável" #: src/ui/gui/data-editor.ui:245 #, fuzzy #| msgid "Recode into _Different Variables" msgid "Recode into _Different Variables..." msgstr "Recodificar em uma Variável _Diferente" #: src/ui/gui/data-editor.ui:251 msgid "_Run Pending Transforms" msgstr "_Executar Transformações Pendentes" #: src/ui/gui/data-editor.ui:257 msgid "_Analyze" msgstr "A_nalisar" #: src/ui/gui/data-editor.ui:260 msgid "_Descriptive Statistics" msgstr "Estatísticas _Descritivas" #: src/ui/gui/data-editor.ui:262 #, fuzzy #| msgid "_Frequencies" msgid "_Frequencies..." msgstr "_Frequências" #: src/ui/gui/data-editor.ui:270 #, fuzzy #| msgid "_Explore" msgid "_Explore..." msgstr "_Explorar" #: src/ui/gui/data-editor.ui:274 #, fuzzy #| msgid "_Crosstabs" msgid "_Crosstabs..." msgstr "_Crosstabs" #: src/ui/gui/data-editor.ui:279 msgid "Compare _Means" msgstr "Comparar _Médias" #: src/ui/gui/data-editor.ui:281 #, fuzzy #| msgid "_Mean" msgid "_Means..." msgstr "_Média" #: src/ui/gui/data-editor.ui:285 #, fuzzy #| msgid "_One Sample T Test" msgid "_One Sample T Test..." msgstr "Teste T Para Uma Am_ostra" #: src/ui/gui/data-editor.ui:289 #, fuzzy #| msgid "_Independent Samples T Test" msgid "_Independent Samples T Test..." msgstr "Teste T para Amostras _Independentes" #: src/ui/gui/data-editor.ui:293 #, fuzzy #| msgid "_Paired Samples T Test" msgid "_Paired Samples T Test..." msgstr "Teste T para amostras em_parelhadas" #: src/ui/gui/data-editor.ui:297 #, fuzzy #| msgid "One Way _ANOVA" msgid "One Way _ANOVA..." msgstr "_ANOVA de Um Fator" #: src/ui/gui/data-editor.ui:302 msgid "_Univariate Analysis..." msgstr "" #: src/ui/gui/data-editor.ui:306 #, fuzzy #| msgid "Bivariate _Correlation" msgid "Bivariate _Correlation..." msgstr "_Correlação Bivariada" #: src/ui/gui/data-editor.ui:310 msgid "_K-Means Cluster..." msgstr "" #: src/ui/gui/data-editor.ui:314 msgid "_Factor Analysis..." msgstr "" #: src/ui/gui/data-editor.ui:318 msgid "Re_liability..." msgstr "" #: src/ui/gui/data-editor.ui:322 #, fuzzy #| msgid "Regression" msgid "_Regression" msgstr "Regressão" #: src/ui/gui/data-editor.ui:325 msgid "_Linear..." msgstr "" #: src/ui/gui/data-editor.ui:329 msgid "_Binary Logistic..." msgstr "" #: src/ui/gui/data-editor.ui:335 msgid "_Non-Parametric Statistics" msgstr "Estatísticas Não-Paramétricas" #: src/ui/gui/data-editor.ui:338 #, fuzzy #| msgid "_Chi-Square" msgid "_Chi Square..." msgstr "_Chi-Quadrado" #: src/ui/gui/data-editor.ui:342 #, fuzzy #| msgid "_Binomial" msgid "_Binomial..." msgstr "_Binomial" #: src/ui/gui/data-editor.ui:346 #, fuzzy #| msgid "_Run" msgid "_Runs..." msgstr "_Executar" #: src/ui/gui/data-editor.ui:350 #, fuzzy #| msgid "Sample..." msgid "_1 Sample K-S..." msgstr "Amostra..." #: src/ui/gui/data-editor.ui:354 #, fuzzy #| msgid "Sample..." msgid "_2 Related Samples..." msgstr "Amostra..." #: src/ui/gui/data-editor.ui:358 #, fuzzy #| msgid "Sample..." msgid "_K Related Samples..." msgstr "Amostra..." #: src/ui/gui/data-editor.ui:362 #, fuzzy #| msgid "Independent Samples Test" msgid "K _Independent Samples..." msgstr "Teste de Amostras Independentes" #: src/ui/gui/data-editor.ui:368 msgid "ROC Cur_ve..." msgstr "" #: src/ui/gui/data-editor.ui:374 msgid "_Graphs" msgstr "" #: src/ui/gui/data-editor.ui:377 msgid "_Scatterplot" msgstr "" #: src/ui/gui/data-editor.ui:381 msgid "_Histogram" msgstr "" #: src/ui/gui/data-editor.ui:385 msgid "_Barchart" msgstr "" #: src/ui/gui/data-editor.ui:391 msgid "_Utilities" msgstr "_Utilidades" #: src/ui/gui/data-editor.ui:394 #, fuzzy #| msgid "_Variables" msgid "_Variables..." msgstr "_Variáveis" #: src/ui/gui/data-editor.ui:398 #, fuzzy #| msgid "Data File _Comments" msgid "Data File _Comments..." msgstr "_Comentários do Arquivo de Dados" #: src/ui/gui/output-window.ui:71 #, fuzzy #| msgid "Print" msgid "_Print..." msgstr "Imprimir" #: src/ui/gui/output-window.ui:76 #, fuzzy #| msgid "_Explore" msgid "_Export..." msgstr "_Explorar" #: src/ui/gui/output-window.ui:92 #, fuzzy #| msgid "Select" msgid "Select _All" msgstr "Selecionar" #: src/ui/gui/syntax-editor.ui:27 #, fuzzy #| msgid "_Syntax" msgid "Syntax" msgstr "_Sintaxe" #: src/ui/gui/syntax-editor.ui:31 #, fuzzy #| msgid "_Data" msgid "Data" msgstr "_Dados" #: src/ui/gui/syntax-editor.ui:41 #, fuzzy #| msgid "Save" msgid "_Save" msgstr "Salvar" #: src/ui/gui/syntax-editor.ui:46 #, fuzzy #| msgid "Save As" msgid "Save _As" msgstr "Salvar Como" #: src/ui/gui/syntax-editor.ui:53 #, fuzzy #| msgid "Print" msgid "_Print" msgstr "Imprimir" #: src/ui/gui/syntax-editor.ui:84 #, fuzzy #| msgid "Deleted" msgid "_Delete" msgstr "Apagado" #: src/ui/gui/syntax-editor.ui:90 #, fuzzy #| msgid "Undo" msgid "_Undo" msgstr "Desfazer" #: src/ui/gui/syntax-editor.ui:94 #, fuzzy #| msgid "Redo" msgid "_Redo" msgstr "Refazer" #: src/ui/gui/syntax-editor.ui:100 msgid "_Find" msgstr "_Localizar" #: src/ui/gui/syntax-editor.ui:106 msgid "_Run" msgstr "_Executar" #: src/ui/gui/syntax-editor.ui:109 msgid "_All" msgstr "" #: src/ui/gui/syntax-editor.ui:113 #, fuzzy #| msgid "Selection" msgid "_Selection" msgstr "Seleção" #: src/ui/gui/syntax-editor.ui:117 #, fuzzy #| msgid "Current Line" msgid "_Current Line" msgstr "Linha atual" #: src/ui/gui/syntax-editor.ui:122 #, fuzzy #| msgid "To End" msgid "_To End" msgstr "Para o Final" #: src/ui/gui/var-type-dialog.ui:99 msgid "Scientific notation" msgstr "Notação Científica" #: src/ui/gui/var-type-dialog.ui:150 msgid "Custom currency" msgstr "Moeda Personalizada" #: src/ui/gui/var-type-dialog.ui:267 msgid "positive" msgstr "positivo" #: src/ui/gui/var-type-dialog.ui:279 msgid "negative" msgstr "negativo" #: src/ui/gui/var-type-dialog.ui:293 msgid "Sample" msgstr "Amostra" #: src/ui/gui/var-type-dialog.ui:350 msgid "Width:" msgstr "Tamanho:" #: src/ui/gui/var-type-dialog.ui:396 msgid "Decimal Places:" msgstr "Casas Decimais:" #: src/ui/gui/weight.ui:24 msgid "Weight Cases" msgstr "Dar Peso Aos Casos" #: src/ui/gui/weight.ui:100 msgid "Weight cases by" msgstr "Ponderar casos por" #: src/ui/gui/weight.ui:144 msgid "Frequency Variable" msgstr "Frequência da Variável" #: src/ui/gui/weight.ui:198 msgid "Current Status: " msgstr "Status Atual: " #. TRANSLATORS: This is the application name in the desktop file #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:7 #: src/ui/gui/org.fsf.pspp.desktop.in:7 msgid "GNU PSPP" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:8 msgid "GNU PSPP is a program for statistical analysis of sampled data" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:10 msgid "" "GNU PSPP is a program for the statistical analysis of sampled data. It is a " "Free replacement for the proprietary program SPSS, and appears very similar " "to it with a few exceptions. The most important of these exceptions are, " "that there are no “time bombs”; your copy of PSPP will not “expire” or " "deliberately stop working in the future. Neither are there any artificial " "limits on the number of cases or variables which you can use. There are no " "additional packages to purchase in order to get “advanced” functions; all " "functionality that PSPP currently supports is in the core package." msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:11 msgid "" "PSPP is a stable and reliable application. It can perform descriptive " "statistics, T-tests, anova, linear and logistic regression, measures of " "association, cluster analysis, reliability and factor analysis, non-" "parametric tests and more. Its backend is designed to perform its analyses " "as fast as possible, regardless of the size of the input data. You can use " "PSPP with its graphical interface or the more traditional syntax commands." msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:12 msgid "A brief list of some of the PSPP's features." msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:14 msgid "Support for over 1 billion cases" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:15 msgid "Support for over 1 billion variables" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:16 msgid "Syntax and data files which are compatible with those of SPSS" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:17 msgid "A choice of terminal or graphical user interface" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:18 msgid "A choice of text, postscript, pdf, opendocument or html output formats" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:19 msgid "" "Inter-operability with: LibreOffice, Apache OpenOffice, Gnumeric and other " "free software" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:20 msgid "Easy data import from spreadsheets, text files and database sources" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:21 msgid "" "The capability to open, analyse and edit two or more datasets concurrently" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:22 msgid "A user interface supporting all common character sets" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:23 msgid "A user interface has been translated to multiple languages" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:24 msgid "Very fast statistical procedures, even on very large data sets" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:25 msgid "No license fees and no expiration period" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:26 msgid "No unethical “end user license agreements”" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:27 msgid "A fully indexed user manual" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:28 msgid "Freedom ensured; It is licensed under the GPLv3 or later" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:29 msgid "" "Portability; Runs on many different computers and many different operating " "systems" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:31 msgid "" "PSPP is particularly aimed at statisticians, social scientists and students " "requiring fast convenient analysis of sampled data." msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:41 #, fuzzy #| msgid "Variable View" msgid "GNU PSPP Variable View" msgstr "Visualização de variáveis" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:54 msgid "Free Software Foundation" msgstr "" #: src/ui/gui/org.fsf.pspp.desktop.in:8 #, fuzzy #| msgid "Statistic" msgid "Statistical Software" msgstr "Estatística" #: src/ui/gui/org.fsf.pspp.desktop.in:9 msgid "Analyze statistical data with a free alternative to SPSS" msgstr "" #. TRANSLATORS: Do not translate this string. Keep it as is, verbatim. #: src/ui/gui/org.fsf.pspp.desktop.in:12 msgid "pspp" msgstr "" #. TRANSLATORS: You must keep all ";" - also at the end of line. #: src/ui/gui/org.fsf.pspp.desktop.in:17 msgid "statistics;analysis;spss;" msgstr "" #~ msgid "Buttons" #~ msgstr "Botões" #~ msgid "The mask that decides what buttons appear in the button box" #~ msgstr "A máscara que decide qual botão irá aparecer na caixa de botões" #~ msgid "column %d" #~ msgstr "coluna %d" #~ msgid "columns %d-%d" #~ msgstr "colunas %d-%d" #~ msgid "%s field) " #~ msgstr "%s campo)" #~ msgid "searching for \"%s\" in path \"%s\"" #~ msgstr "Procurando \"%s\" no caminho \"%s\"" #~ msgid "...found \"%s\"" #~ msgstr "...\"%s\" encontrado" #~ msgid "...not found" #~ msgstr "...não encontrado" #~ msgid "" #~ "Support for Gnumeric files was not compiled into this installation of PSPP" #~ msgstr "" #~ "Suporte para arquivos Gnumeric não foi compilado nesta instalação do PSPP." #, fuzzy #~ msgid "Error opening \"%s\" for reading as a Gnumeric file: %s." #~ msgstr "Ocorreu um erro ao abrir \"%s\" para ler como arquivo gnumeric: %s." #~ msgid "Cannot create variable name from %s" #~ msgstr "Impossível criar nome de variável para %s" #~ msgid "Duplicate variable name %s in position %d." #~ msgstr "Nome de variável %s duplicado na posição %d." #~ msgid "" #~ "Scratch file handle %s has not yet been written, using SAVE or another " #~ "procedure, so it cannot yet be used for reading." #~ msgstr "" #~ "Arquivo de rascunho de identificador %s não foi ainda escrito, usando " #~ "SAVE ou outro procedimento, portanto não pode ser usado ainda para " #~ "leitura." #~ msgid "scratch file" #~ msgstr "arquivo de rascunho" #, fuzzy #~ msgid "" #~ "Recoded variable name duplicates an existing `%s' within system file." #~ msgstr "Nome de variável '%s' duplicado dentro do arquivo de sistema." #~ msgid "Duplicate variable name `%s' within system file." #~ msgstr "Nome de variável '%s' duplicado dentro do arquivo de sistema." #~ msgid "Unknown variable format %." #~ msgstr "Variável de formato % desconhecida." #~ msgid "print" #~ msgstr "imprimir" #~ msgid "write" #~ msgstr "escrever" #~ msgid "Weighting variable must be numeric." #~ msgstr "Variável de ponderação deve ser numérica." #~ msgid "Document line contains null byte." #~ msgstr "Linha do documento contém byte nulo." #~ msgid "Bad size (%zu) or count (%zu) field on record type 7, subtype 3." #~ msgstr "" #~ "Tamanho (%zu) ou quantidade (%zu) inválidos de registro tipo 7, subtipo 3." #~ msgid "little-endian" #~ msgstr "little-endian" #~ msgid "big-endian" #~ msgstr "big-endian" #~ msgid "Bad size (%zu) or count (%zu) on extension 4." #~ msgstr "Tamanho (%zu) ou quantidade (%zu) da extensão 4 inválido." #~ msgid "Bad size %zu on extension 11." #~ msgstr "Tamanho %zu inválido da extensão 11." #~ msgid "Duplicate long variable name `%s' within system file." #~ msgstr "Nome longo de variável '%s' duplicado dentro do arquivo de sistema." #~ msgid "Invalid number of labels: %d. Ignoring labels." #~ msgstr "Número de rótulos inválido: %d. Ignorando rótulos." #~ msgid "Compressed data is corrupt." #~ msgstr "Dado compactado está corrompido." #~ msgid "%s is allowed only inside INPUT PROGRAM." #~ msgstr "%s é permitido somente dentro de INPUT PROGRAM." #~ msgid "" #~ "%s is allowed only before the active file has been defined or inside " #~ "INPUT PROGRAM." #~ msgstr "" #~ "%s é permitido apenas após o arquivo ativo ser definido, ou dentro de " #~ "INPUT PROGRAM." #~ msgid "" #~ "%s is allowed only after the active file has been defined or inside INPUT " #~ "PROGRAM." #~ msgstr "" #~ "%s é permitido apenas após o arquivo ativo ser definido, ou dentro de " #~ "INPUT PROGRAM." #~ msgid "%s is not allowed inside INPUT PROGRAM." #~ msgstr "%s não é permitido dentro de INPUT PROGRAM." #~ msgid "Interactive shell not supported on this platform." #~ msgstr "Shell interativo não é suportado nesta plataforma." #~ msgid "Error executing command: %s." #~ msgstr "Erro executando comando: %s." #~ msgid "%s does not form a valid number." #~ msgstr "%s não forma um número válido." #~ msgid "missing required subcommand %s" #~ msgstr "subcomando necessário %s ausente" #~ msgid "Syntax error %s at %s." #~ msgstr "Erro de sintaxe %s em %s." #~ msgid "binary" #~ msgstr "binário" #~ msgid "octal" #~ msgstr "octal" #~ msgid "hex" #~ msgstr "hexa" #~ msgid "Unexpected end of file in string concatenation." #~ msgstr "Fim de arquivo inesperado na concatenação da string." #~ msgid "String exceeds 255 characters in length (%zu characters)." #~ msgstr "String excedeu 255 caracteres de comprimento (%zu caracteres)." #~ msgid "expecting number or data string" #~ msgstr "esperando número ou string de data" #~ msgid "incorrect use of TO convention" #~ msgstr "uso incorreto da convenção TO." #~ msgid "DO REPEAT may not nest in compatibility mode." #~ msgstr "DO REPEAT não pode estar aninhado no modo de compatibilidade." #~ msgid "String expected." #~ msgstr "String esperada." #, fuzzy #~ msgid "expecting ATTRIBUTE= or DELETE=" #~ msgstr "esperando FIXED ou DELIMITED" #~ msgid "expecting `('" #~ msgstr "esperando '('" #~ msgid "RENAME subcommand may be given at most once." #~ msgstr "Subcomando RENAME só pode ser dado uma vez." #~ msgid "`(' expected on RENAME subcommand." #~ msgstr "'(' esperado no subcomando RENAME." #~ msgid "`/' or `.' expected." #~ msgstr "'/' ou '.' esperado." #~ msgid "`(' expected." #~ msgstr "'(' esperado." #~ msgid "`=' expected between lists of new and old variable names." #~ msgstr "'=' esperado entre listas dos novos e velhos nomes de variável" #~ msgid "`)' expected after variable names." #~ msgstr "')' esperado após nome de variável." #~ msgid "No label." #~ msgstr "Sem rótulo." #~ msgid "Unknown." #~ msgstr "Desconhecido." #~ msgid "Cases:" #~ msgstr "Casos:" #~ msgid "Type:" #~ msgstr "Tipo:" #~ msgid "System File." #~ msgstr "Arquivo de sistema." #~ msgid "Mode:" #~ msgstr "Modo:" #~ msgid "on" #~ msgstr "Ligado" #~ msgid "off" #~ msgstr "Desligado" #, fuzzy #~ msgid "Charset:" #~ msgstr "Casos:" #~ msgid "The active file does not have a file label." #~ msgstr "O arquivo ativo não possui um rótulo de arquivo." #~ msgid "Documents in the active file:" #~ msgstr "Documentos no arquivo ativo:" #~ msgid "Format: %s" #~ msgstr "Formato: %s" #~ msgid "Print Format: %s" #~ msgstr "Formato de Impressão: %s" #~ msgid "Measure: %s" #~ msgstr "Medida: %s" #~ msgid "Missing Values: " #~ msgstr "Missing Values:" #~ msgid "String expected for variable label." #~ msgstr "Esperada string como rotulo de variável." #~ msgid "Truncating variable label to 255 characters." #~ msgstr "Truncando rótulo de variável para 255 caracteres." #~ msgid "%s is too long for a variable name." #~ msgstr "%s é muito longo para um nome de variável." #~ msgid "%s: `.' expected after string." #~ msgstr "%s: '.' esperado após string." #~ msgid "while expecting COLUMNWISE" #~ msgstr "ao esperar COLUMNWISE" #~ msgid "expecting BREAK" #~ msgstr "esperando BREAK" #~ msgid "expecting `)'" #~ msgstr "esperando ')'" #~ msgid "Valid N" #~ msgstr "N válidos" #~ msgid "BY is required when TABLE is specified." #~ msgstr "BY é necessário quando TABLE é especificado." #~ msgid "expecting FIXED or DELIMITED" #~ msgstr "esperando FIXED ou DELIMITED" #~ msgid "expecting LINE or VARIABLES" #~ msgstr "esperando LINE ou VARIABLES" #~ msgid "Value of FIXCASE must be at least 1." #~ msgstr "Valor de FIXCASE deve ser pelo menos 1." #~ msgid "Value of FIRST must be at least 1." #~ msgstr "Valor de FIRST deve ser pelo menos 1." #~ msgid "Value of PERCENT must be between 1 and 100." #~ msgstr "Valor de PERCENT deve estar entre 1 e 100." #~ msgid "expecting VARIABLES" #~ msgstr "esperando VARIABLES" #~ msgid "expecting COMM or TAPE" #~ msgstr "esperando COMM ou TAPE" #~ msgid "`=' expected after variable list." #~ msgstr "'=' esperado após lista de variáveis." #~ msgid "expecting `,' or `)' invoking %s function" #~ msgstr "esperando ',' ou ')' invocando função %s" #~ msgid "hash table:" #~ msgstr "tabela hash:" #~ msgid "expected end of file" #~ msgstr "fim de arquivo esperado" #~ msgid "number out of valid range" #~ msgstr "número fora do intervalo válido" #~ msgid "invalid numeric syntax" #~ msgstr "sintaxe numérica inválida" #~ msgid "syntax error expecting integer" #~ msgstr "erro de sintaxe esperando inteiro" #~ msgid "syntax error expecting number" #~ msgstr "erro de sintaxe esperando número" #~ msgid "syntax error in hex constant" #~ msgstr "erro de sintaxe em constante hexa" #~ msgid "syntax error expecting hex constant" #~ msgstr "erro de sintaxe esperando constante hexa" #~ msgid "unexpected end of line" #~ msgstr "fim de linha inesperado" #~ msgid "unexpected end of line expecting string" #~ msgstr "fim de linha inesperado esperando string" #~ msgid "" #~ "unknown orientation `%s' (valid orientations are `portrait' and " #~ "`landscape')" #~ msgstr "" #~ "orientação desconhecida '%s' (orientações válidas são 'retrato' e " #~ "'paisagem')" #~ msgid "boolean value expected for %s" #~ msgstr "valor booleano esperado para %s" #~ msgid "positive integer value required for `%s'" #~ msgstr "valor inteiro positivo requerido para '%s'" #~ msgid "" #~ "default font size must be at least 1 point (value of 1000 for key `%s')" #~ msgstr "" #~ "tamanho padrão de fonte precisa ser pelo menos de 1 ponto (valor de 1000 " #~ "para chave '%s')" #~ msgid "could not find AFM file \"%s\"" #~ msgstr "impossível encontrar arquivo AFM \"%s\"" #~ msgid "could not find font \"%s\"" #~ msgstr "impossível encontrar fonte \"%s\"" #~ msgid "could not find encoding \"%s\"" #~ msgstr "impossível abrir codificação \"%s\"" #~ msgid "reading font file \"%s\"" #~ msgstr "lendo arquivo de fonte \"%s\"" #~ msgid "cannot open font encoding file \"%s\"" #~ msgstr "impossível abrir arquivo de codificação de fonte \"%s\"" #~ msgid "invalid numeric format" #~ msgstr "formato numérico inválido" #~ msgid "closing Postscript encoding \"%s\"" #~ msgstr "fechando codificação \"%s\" Postscript" #~ msgid "bad vline: x=%d+%d=%d y=(%d+%d=%d,%d+%d=%d) in table size (%d,%d)\n" #~ msgstr "" #~ "problema na vline: x=%d+%d=%d y=(%d+%d=%d,%d+%d=%d) no tamanho da tabela " #~ "(%d,%d)\n" #~ msgid "" #~ "bad box: (%d+%d=%d,%d+%d=%d)-(%d+%d=%d,%d+%d=%d) in table size (%d,%d)\n" #~ msgstr "" #~ "problema na caixa: (%d+%d=%d,%d+%d=%d)-(%d+%d=%d,%d+%d=%d) no tamanho da " #~ "tabela (%d,%d)\n" #~ msgid "Cannot open %s (%s). Writing errors to stdout instead.\n" #~ msgstr "Impossível abrir %s (%s). Imprimindo erros na saída padrão.\n" #~ msgid "Terminating execution of syntax file due to error." #~ msgstr "Terminando a execução do arquivo de sintaxe devido a um erro." #~ msgid "could not access definition for terminal `%s'" #~ msgstr "não foi possível acessar definição para o terminal '%s'" #, fuzzy #~ msgid "Start an interactive session" #~ msgstr "Ordenar casos no arquivo ativo" #~ msgid "Sorry. The help system hasn't yet been implemented." #~ msgstr "Desculpe. O sistema de ajuda ainda não foi implementado." #~ msgid "Cannot open reference manual: %s" #~ msgstr "Impossível abrir manual de referência: %s" #~ msgid "data file error" #~ msgstr "erro no arquivo de dados" #~ msgid "PSPP error" #~ msgstr "Erro no PSPP" #~ msgid "syntax warning" #~ msgstr "aviso na sintaxe" #~ msgid "data file warning" #~ msgstr "aviso no arquivo de dados" #~ msgid "PSPP warning" #~ msgstr "aviso do PSPP" #~ msgid "syntax information" #~ msgstr "informação da sintaxe" #~ msgid "data file information" #~ msgstr "informação do arquivo de dados" #~ msgid "PSPP information" #~ msgstr "Informação do PSPP" #~ msgid "Incorrect value for variable type" #~ msgstr "Valor incorreto para tipo de variável" #~ msgid "_Reset" #~ msgstr "_Reiniciar" #~ msgid "_Select" #~ msgstr "_Selecionar" #~ msgid "%d" #~ msgstr "%d" #~ msgid "Font Selection" #~ msgstr "Seleção de fonte" #~ msgid "Clear" #~ msgstr "Limpar" #~ msgid "Open a data file" #~ msgstr "Abrir arquivo de dados" #~ msgid "New data file" #~ msgstr "Novo arquivo de dados" #~ msgid "Import text data file" #~ msgstr "Importar arquivo de dados textuais" #~ msgid "Delete the cases at the selected position(s)" #~ msgstr "Deletar o caso na posição(ões) selecionada(s)" #~ msgid "Delete the variables at the selected position(s)" #~ msgstr "Deletar as variáveis na posição(ões) selecionada(s)" #~ msgid "Sort cases in the active file" #~ msgstr "Ordenar casos no arquivo ativo" #~ msgid "Select cases from the active file" #~ msgstr "Selecionar casos do arquivo ativo" #~ msgid "Compute new values for a variable" #~ msgstr "Computar novos valores de uma variável" #~ msgid "Calculate T Test for samples from independent groups" #~ msgstr "Calcular Teste T para amostrar de grupos independentes" #~ msgid "Calculate T Test for paired samples" #~ msgstr "Calcular Teste T para amostras emparelhadas" #~ msgid "Calculate T Test for sample from a single distribution" #~ msgstr "Calcular Teste T para amostra de uma distribuição única" #~ msgid "Commentary text for the data file" #~ msgstr "Comentário do arquivo de dados" #, fuzzy #~ msgid "Recode values into different variables" #~ msgstr "Recodificar valores em variáveis diferentes" #~ msgid "Calculate descriptive statistics (mean, variance, ...)" #~ msgstr "Calcular estatísticas descritivas (média, variância, ...)" #~ msgid "Generate frequency statistics" #~ msgstr "Gerar estatísticas de frequência" #~ msgid "Examine Data by Factors" #~ msgstr "Examina dados pelos fatores" #~ msgid "Estimate parameters of the linear model" #~ msgstr "Estima parâmetros do modelo linear" #~ msgid "Open Syntax" #~ msgstr "Abrir Sintaxe" #~ msgid "Import Delimited Text Data" #~ msgstr "Importar Dados Textuais Delimitados" #~ msgid "This input line has too few separators to fill in this field." #~ msgstr "" #~ "Esta linha de entrada tem poucos separadores para preencher este campo." #~ msgid "Field content \"%.*s\" cannot be parsed in format %s." #~ msgstr "Campo contendo \"%.*s\" não pode ser analisado no formato %s." #~ msgid "Var 2" #~ msgstr "Var 2" #~ msgid "Label: %s\n" #~ msgstr "Label: %s\n" #~ msgid "Type: %s\n" #~ msgstr "Tipo: %s\n" #~ msgid "Missing Values: %s\n" #~ msgstr "Valores missing: %s\n" #~ msgid "Value Labels:\n" #~ msgstr "Value Labels:\n" #~ msgid "No label" #~ msgstr "Sem rótulo" #~ msgid "Suppress value labels" #~ msgstr "Ocultar rótulos de valores" #~ msgid "Labeling" #~ msgstr "Rotulando" #~ msgid "_Import Delimited Text Data" #~ msgstr "_Importar Dados Textuais Delimitados" #~ msgid "Insert Cases" #~ msgstr "Inserir Casos" #~ msgid "Recall" #~ msgstr "Recall" #~ msgid "Processor Area" #~ msgstr "Área do Processamento" #~ msgid "Ascending Counts" #~ msgstr "Contagens Ascendentes" #~ msgid "Descending Counts" #~ msgstr "Contagens Descendentes" #~ msgid "Supress tables with more than N categories" #~ msgstr "Ocultar tabelas com mais de N categorias" #~ msgid "Maximum no of categories" #~ msgstr "Número máximo de categorias" #~ msgid "Messages Reported" #~ msgstr "Mensagens Reportadas" #~ msgid "" #~ "The PSPP processor reported # errors. The first # and last # are shown " #~ "below:" #~ msgstr "" #~ "O processador do PSPP reportou # erros. O primeiro # e o último # estão " #~ "abaixo:" #~ msgid "gtk-close" #~ msgstr "gtk-close" #~ msgid "gtk-go-back" #~ msgstr "gtk-go-back" #~ msgid "gtk-go-forward" #~ msgstr "gtk-go-forward" #~ msgid "gtk-save" #~ msgstr "gtk-save" #~ msgid "gtk-save-as" #~ msgstr "gtk-save-as" #~ msgid "gtk-copy" #~ msgstr "gtk-copy" #~ msgid "By:" #~ msgstr "Por:" #~ msgid "Rankit" #~ msgstr "Rankit" #~ msgid "System-Missing" #~ msgstr "System-Missing" #~ msgid "All" #~ msgstr "Todos" #~ msgid "Doubled quote mark treated as escape" #~ msgstr "Marca de aspas duplas tratado como escape" #, fuzzy #~ msgid "Unrecognized record type 7, subtype %d." #~ msgstr "Registro de tipo %d não reconhecido." #~ msgid "expecting AUTOMATIC or year" #~ msgstr "esperando AUTOMATIC ou ano" #~ msgid "WIDTH must be at least 40." #~ msgstr "WIDTH deve ser pelo menos 40." #~ msgid "expecting BY" #~ msgstr "esperando BY" #~ msgid "count" #~ msgstr "contagem" #~ msgid "expected" #~ msgstr "esperado" #~ msgid "residual" #~ msgstr "residual" #~ msgid "`)' expected after GROUPED interval list." #~ msgstr "')' esperado após lista de intervalo do GROUPED" #, fuzzy #~ msgid "N of items" #~ msgstr "N de casos válidos" #~ msgid "`/FORMAT WEIGHT' specified, but weighting is not on." #~ msgstr "'/FORMAT WEIGHT' especificado, mas ponderação está desabilitada." #~ msgid "Bad variable width %d." #~ msgstr "Comprimento %d de variável inválido." #~ msgid "" #~ "Ignoring missing values on long string variable %s, which PSPP does not " #~ "yet support." #~ msgstr "" #~ "Ignorando valores missing na variável de string longa %s, os quais PSPP " #~ "não suporta ainda." #~ msgid "" #~ "Ignoring value labels for long string variables, which PSPP does not yet " #~ "support." #~ msgstr "" #~ "Ignorando rótulos de valores para variável de string longa, os quais PSPP " #~ "ainda não suporta." #~ msgid "File specifies unexpected value %g as HIGHEST." #~ msgstr "Arquivo especifica valor inesperado %g como HIGHEST." #~ msgid "File specifies unexpected value %g as LOWEST." #~ msgstr "Arquivo especifica valor inesperado %g como LOWEST." #~ msgid "%s is unimplemented." #~ msgstr "%s não está implementado." #~ msgid "Bad character in input: `\\%o'." #~ msgstr "Caractere inválido na entrada: '\\%o'." #~ msgid "Could not create acceptable variant for variable %s." #~ msgstr "Não foi possível criar variança aceitável para variável %s." #~ msgid "Cannot create more than 99999 variable names." #~ msgstr "Impossível criar mais que 99999 nomes de variáve." #~ msgid "Long string variable %s is not valid here." #~ msgstr "Variável string longa %s não é válida aqui." #~ msgid "error opening \"%s\" for writing" #~ msgstr "erro ao abrir \"%s\" para gravação" #~ msgid "FORMAT is %s." #~ msgstr "FORMAT é %s." #~ msgid "WEIGHT is variable %s." #~ msgstr "WEIGHT é a variável %s." #~ msgid "_Labels" #~ msgstr "_Label" #~ msgid "Insert _Variable" #~ msgstr "Inserir _Variáveis" #~ msgid "Insert Ca_se" #~ msgstr "Inserir Ca_so" #~ msgid "_Weights" #~ msgstr "_Ponderação" #~ msgid "_Sort" #~ msgstr "_Ordenar" #~ msgid "Oneway _ANOVA" #~ msgstr "_ANOVA de Um Fator" #~ msgid "One _Sample T Test" #~ msgstr "Teste T Para Uma Am_ostra" #~ msgid "%ld" #~ msgstr "%ld" #~ msgid "Syntax%d" #~ msgstr "Sintaxe%d" #~ msgid "%s --- PSPP Syntax Editor" #~ msgstr "%s --- Editor de Sintaxe do PSPP" #~ msgid "Untitled%d" #~ msgstr "Sem título%d" #~ msgid "%s --- PSPP Output" #~ msgstr "%s --- Saída do PSPP" #~ msgid "" #~ "PSPP, a program for statistical analysis of sample data.\n" #~ "\n" #~ "Usage: %s [OPTION]... FILE...\n" #~ "\n" #~ "If a long option shows an argument as mandatory, then it is mandatory\n" #~ "for the equivalent short option also. Similarly for optional arguments.\n" #~ "\n" #~ "Configuration:\n" #~ " -a, --algorithm={compatible|enhanced}\n" #~ " set to `compatible' if you want output\n" #~ " calculated from broken algorithms\n" #~ " -B, --config-dir=DIR set configuration directory to DIR\n" #~ " -o, --device=DEVICE select output driver DEVICE and disable " #~ "defaults\n" #~ "\n" #~ "Input and output:\n" #~ " -e, --error-file=FILE send error messages to FILE (appended)\n" #~ " -f, --out-file=FILE send output to FILE (overwritten)\n" #~ " -p, --pipe read syntax from stdin, send output to " #~ "stdout\n" #~ " -I-, --no-include clear include path\n" #~ " -I, --include=DIR append DIR to include path\n" #~ "\n" #~ "Language modifiers:\n" #~ " -i, --interactive interpret syntax in interactive mode\n" #~ " -n, --edit just check syntax; don't actually run the " #~ "code\n" #~ " -r, --no-statrc disable execution of .pspp/rc at startup\n" #~ " -s, --safer don't allow some unsafe operations\n" #~ " -x, --syntax={compatible|enhanced}\n" #~ " set to `compatible' if you want only to " #~ "accept\n" #~ " spss compatible syntax\n" #~ "\n" #~ "Informative output:\n" #~ " -h, --help print this help, then exit\n" #~ " -l, --list print a list of known driver classes, then " #~ "exit\n" #~ " -V, --version show PSPP version, then exit\n" #~ " -v, --verbose increments verbosity level\n" #~ "\n" #~ "Non-option arguments:\n" #~ " FILE syntax file to execute\n" #~ " KEY=VALUE overrides macros in output initialization " #~ "file\n" #~ "\n" #~ msgstr "" #~ "PSPP, um programa para análises estatísticas de dados amostrais.\n" #~ "\n" #~ "Uso: %s [OPÇÃO]... ARQUIVO...\n" #~ "\n" #~ "Se uma opção longa exibe um argumento como obrigatório, então ele também " #~ "é obrigatório\n" #~ "para a opção curta equivale. O mesmo se aplica para argumentos " #~ "opcionais.\n" #~ "\n" #~ "Configuração:\n" #~ " -a, --algorithm={compatible|enhanced}\n" #~ " escolha 'compatible' se você deseja saída\n" #~ " calculada por algoritmos problemáticos\n" #~ " -B, --config-dir=DIR define o diretório de configuração como DIR\n" #~ " -o, --device=DEVICE seleciona DEVICE como driver de saída e " #~ "desabilita padrões\n" #~ "\n" #~ "Entrada e saída:\n" #~ " -e, --error-file=FILE envia mensagens de erro para FILE (incluídas " #~ "no final)\n" #~ " -f, --out-file=FILE envia saída para FILE (sobrescrevendo)\n" #~ " -p, --pipe lê sintaxe de stdin, e envia saída para " #~ "stdout\n" #~ " -I-, --no-include limpa caminho de inclusão\n" #~ " -I, --include=DIR Insere DIR no caminho de inclusão\n" #~ "\n" #~ "Modificadores da linguagem:\n" #~ " -i, --interactive interpreta sintaxe no modo interativo\n" #~ " -n, --edit simplesmente checa sintaxe; não executa o " #~ "código\n" #~ " -r, --no-statrc desabilita a execução de .pspp/rc na " #~ "inicialização\n" #~ " -s, --safer não permite algumas operações inseguras\n" #~ " -x, --syntax={compatible|enhanced}\n" #~ " escolha 'compatible' se você deseja somente " #~ "aceitar\n" #~ " sintaxe compatível com SPSS\n" #~ "\n" #~ "Informative output:\n" #~ " -h, --help exibe esta ajuda, e então sai\n" #~ " -l, --list exibe uma lista de classes de driver " #~ "conhecidos, e então sai\n" #~ " -V, --version exibe a versão do PSPP, e então sai\n" #~ " -v, --verbose incrementa o nível de verbosidade\n" #~ "\n" #~ "Non-option arguments:\n" #~ " FILE arquivo de sintaxe para executar\n" #~ " KEY=VALUE sobrescreve macros no arquivo de " #~ "inicialização da saída\n" #~ "\n" #~ msgid "" #~ "\n" #~ "Report bugs to <%s>.\n" #~ msgstr "" #~ "\n" #~ "Reporte bugs para <%s>.\n" pspp-1.4.1/po/ru.po0000644000175000017500000141356113725012645013537 0ustar00blpblp00000000000000# Russian translation of PSPP # Copyright (C) 2015 Free Software Foundation, Inc. # This file is distributed under the same license as the pspp package. # # Igor Zotov , 2015. # Pavel Maryanov , 2015. msgid "" msgstr "" "Project-Id-Version: pspp 0.8.5\n" "Report-Msgid-Bugs-To: pspp-dev@gnu.org\n" "PO-Revision-Date: 2015-08-21 14:48+0300\n" "Last-Translator: Pavel Maryanov \n" "Language-Team: Russian \n" "Language: ru\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Bugs: Report translation errors to the Language-Team address.\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" "X-Generator: Poedit 1.8.4\n" #: src/data/any-reader.c:72 src/data/encrypted-file.c:78 #, c-format msgid "An error occurred while opening `%s': %s." msgstr "При попытке открыть `%s' произошла ошибка: %s." #: src/data/any-reader.c:93 src/language/lexer/lexer.c:1633 #, c-format msgid "Error reading `%s': %s." msgstr "Ошибка чтения `%s: %s." #: src/data/any-reader.c:114 #, c-format msgid "`%s' is not a system or portable file." msgstr "`%s' не является системным или портативным файлом." #: src/data/any-reader.c:123 src/data/any-writer.c:66 msgid "The inline file is not allowed here." msgstr "Здесь нельзя использовать встроенные файлы." #: src/data/any-reader.c:205 #, c-format msgid "" "Cannot read from dataset %s because no dictionary or data has been written " "to it yet." msgstr "" "Чтение базы данных %s невозможно, так как нет словаря или данные еще не " "записаны в базу." #: src/data/any-reader.c:260 src/language/data-io/dataset.c:253 msgid "Dataset" msgstr "База данных" #: src/data/calendar.c:100 #, c-format msgid "Month %d is not in acceptable range of 0 to 13." msgstr "Месяц %d не входит в приемлемый диапазон от 0 до 13." #: src/data/calendar.c:110 #, c-format msgid "Day %d is not in acceptable range of 0 to 31." msgstr "День %d не входит в приемлемый диапазон от 0 до 31." #: src/data/calendar.c:119 #, c-format msgid "Date %04d-%d-%d is before the earliest acceptable date of 1582-10-15." msgstr "Дата% 04d-% d-% d находится перед первой приемлемой датой 1582-10-15." #: src/data/casereader-filter.c:221 msgid "" "At least one case in the data read had a weight value that was user-missing, " "system-missing, zero, or negative. These case(s) were ignored." msgstr "" "По крайней мере, один случай в чтении данных имел значение веса, которое " "было пропущено пользователем, пропущено системой, является нулевым или " "отрицательным. Такое(ие) наблюдение будут проигнорировано(ы)." #. TRANSLATORS: this fragment will be interpolated into messages in fh_lock() #. that identify types of files. #: src/data/csv-file-writer.c:138 msgid "CSV file" msgstr "файл CSV" #: src/data/csv-file-writer.c:146 #, fuzzy, c-format #| msgid "Error opening `%s' for writing as a system file: %s." msgid "Error opening `%s' for writing as a CSV file: %s." msgstr "" "Ошибка при попытке открыть `%s' для записи в формате системного файла: %s." #: src/data/csv-file-writer.c:453 #, c-format msgid "An I/O error occurred writing CSV file `%s'." msgstr "При попытке записать CSV файл `%s' произошла ошибка." #: src/data/data-in.c:175 #, c-format msgid "Data is not valid as format %s: %s" msgstr "Формат даты %s является некорректным: %s" #: src/data/data-in.c:377 src/data/data-in.c:553 msgid "Field contents are not numeric." msgstr "Содержимое поля не является числом." #: src/data/data-in.c:379 src/data/data-in.c:555 msgid "Number followed by garbage." msgstr "После записи числа обнаружены лишние символы." #: src/data/data-in.c:392 msgid "Invalid numeric syntax." msgstr "Некорректный синтаксис числового значения." #: src/data/data-in.c:400 src/data/data-in.c:571 msgid "Too-large number set to system-missing." msgstr "Слишком большое число будет пропущено системой." #: src/data/data-in.c:406 src/data/data-in.c:577 msgid "Too-small number set to zero." msgstr "Слишком малое число будет заменено на ноль." #: src/data/data-in.c:426 msgid "All characters in field must be digits." msgstr "Все символы в поле должны быть цифрами." #: src/data/data-in.c:445 msgid "Unrecognized character in field." msgstr "Неизвестный символ в поле." #: src/data/data-in.c:466 src/data/data-in.c:729 msgid "Field must have even length." msgstr "Длина поля должно быть четным его величине." #: src/data/data-in.c:468 src/data/data-in.c:732 msgid "Field must contain only hex digits." msgstr "Содержимое поля должно состоять только из шестнадцатеричных цифр." #: src/data/data-in.c:544 msgid "Invalid zoned decimal syntax." msgstr "Неверный синтаксический запись зонированного десятичного числа." #: src/data/data-in.c:644 src/data/data-in.c:650 msgid "Invalid syntax for P field." msgstr "Некорректный синтаксис поля P." #: src/data/data-in.c:768 src/data/data-in.c:818 msgid "Syntax error in date field." msgstr "Синтаксическая ошибка в поле данных." #: src/data/data-in.c:783 #, c-format msgid "Day (%ld) must be between 1 and 31." msgstr "День (%ld) должен находиться в диапазоне от 1 до 31." #: src/data/data-in.c:832 msgid "Delimiter expected between fields in date." msgstr "Между полями в дате необходимо указать разделитель." #: src/data/data-in.c:906 msgid "" "Unrecognized month format. Months may be specified as Arabic or Roman " "numerals or as at least 3 letters of their English names." msgstr "" "Неизвестный Формат месяца. Месяцы могут быть указаны в формате арабских или " "римских цифр или с помощью минимум 3-х букв их английских названий. " #: src/data/data-in.c:933 #, c-format msgid "Year (%ld) must be between 1582 and 19999." msgstr "Год (%ld) должен быть целым числом от 1582 до 19999." #: src/data/data-in.c:944 #, c-format msgid "Trailing garbage `%.*s' following date." msgstr "Лишние данные `%.*s' после даты." #: src/data/data-in.c:958 msgid "Julian day must have exactly three digits." msgstr "Запись дня по юлианскому календарю должна состоять точно из трех цифр." #: src/data/data-in.c:960 #, c-format msgid "Julian day (%ld) must be between 1 and 366." msgstr "Юлианский день (%ld) должно быть целым числом от 1 до 366." #: src/data/data-in.c:984 #, c-format msgid "Quarter (%ld) must be between 1 and 4." msgstr "Квартал (%ld) должен быть указан целым числом от 1 до 4." #: src/data/data-in.c:1005 #, c-format msgid "Week (%ld) must be between 1 and 53." msgstr "Неделя (%ld) должна быть указана целым числом от 1 до 53." #: src/data/data-in.c:1017 msgid "Delimiter expected between fields in time." msgstr "Между полями в записи времени должен быть указан разделитель." #: src/data/data-in.c:1037 #, c-format msgid "Minute (%ld) must be between 0 and 59." msgstr "Минуты (%ld) должны быть целым числом от 0 до 59." #: src/data/data-in.c:1075 msgid "" "Unrecognized weekday name. At least the first two letters of an English " "weekday name must be specified." msgstr "" "Нераспознанное название дня недели. Следует указать по крайней мере первые " "две буквы английского названия дня недели." #: src/data/data-in.c:1210 #, c-format msgid "`%c' expected in date field." msgstr "В поле даты должен быть символ `%c'." #: src/data/data-out.c:580 #, c-format msgid "Weekday number %f is not between 1 and 7." msgstr "День недели %f не является целым числом от 1 до 7." #: src/data/data-out.c:605 #, c-format msgid "Month number %f is not between 1 and 12." msgstr "Месяц %f не является целым числом от 1 до 12." #. TRANSLATORS: this fragment will be interpolated into #. messages in fh_lock() that identify types of files. #: src/data/dataset-writer.c:66 src/language/data-io/file-handle.c:304 msgid "dataset" msgstr "база данных" #: src/data/dict-class.c:52 msgid "ordinary" msgstr "порядковая" #: src/data/dict-class.c:54 msgid "system" msgstr "системный" #: src/data/dict-class.c:56 msgid "scratch" msgstr "нулевой" #: src/data/dictionary.c:1523 #, c-format msgid "Truncating document line to %d bytes." msgstr "Обрезаем строку документа до %d байт." #: src/data/encrypted-file.c:89 #, c-format msgid "An error occurred while reading `%s': %s." msgstr "Во время попытки чтения `%s' произошла ошибка: %s." #: src/data/encrypted-file.c:430 #, c-format msgid "" "%s: encrypted file corrupted (ends in incomplete %u-byte ciphertext block)" msgstr "" #: src/data/encrypted-file.c:449 #, c-format msgid "%s: encrypted file corrupted (ends with bad padding)" msgstr "" #: src/data/file-handle-def.c:283 src/language/data-io/dataset.c:266 msgid "active dataset" msgstr "активная база данных" #: src/data/file-handle-def.c:518 #, c-format msgid "Can't read from %s as a %s because it is already being read as a %s." msgstr "" "Не удалось прочитать %s как %s, поскольку оно уже было прочитано как %s. " #: src/data/file-handle-def.c:522 #, c-format msgid "Can't write to %s as a %s because it is already being written as a %s." msgstr "Не удалось записать %s как %s, поскольку оно уже было записано как %s." #: src/data/file-handle-def.c:529 #, c-format msgid "Can't re-open %s as a %s." msgstr "Не удалось открыть `%s' для чтения в формате файла данных: %s." #: src/data/file-name.c:133 #, c-format msgid "Not opening pipe file `%s' because %s option set." msgstr "Не открыт pipe файл `%s' так как установлен параметр %s." #: src/data/format.c:339 msgid "Input format" msgstr "Входной формат" #: src/data/format.c:339 msgid "Output format" msgstr "Выходной формат" #: src/data/format.c:342 #, c-format msgid "Format %s may not be used for input." msgstr "Формат: %s нельзя использовать для входных данных." #: src/data/format.c:349 #, c-format msgid "%s specifies width %d, but %s requires an even width." msgstr "%s определяет ширину %d, но для %s требуется четное значение ширины." #: src/data/format.c:358 #, c-format msgid "%s %s specifies width %d, but %s requires a width between %d and %d." msgstr "" "%s %s определяет ширину %d, но для %s нужна ширина в пределах от %d до %d." #: src/data/format.c:367 #, c-format msgid "%s %s specifies %d decimal place, but %s does not allow any decimals." msgid_plural "" "%s %s specifies %d decimal places, but %s does not allow any decimals." msgstr[0] "" "%s %s определяет %d десятичную позицию, но %s запрещает любые десятичные " "позиции." msgstr[1] "" "%s %s определяет %d десятичные позиции, но %s запрещает любые десятичные " "позиции." msgstr[2] "" "%s %s определяет %d десятичных позиций, но %s запрещает любые десятичные " "позиции." #: src/data/format.c:378 #, c-format msgid "" "%s %s specifies %d decimal place, but the given width allows at most %d " "decimals." msgid_plural "" "%s %s specifies %d decimal places, but the given width allows at most %d " "decimals." msgstr[0] "" "%s %s определяет %d десятичную позицию, но для указанного значения ширины " "можно использовать не более %d десятичных позиций." msgstr[1] "" "%s %s определяет %d десятичные позиции, но для указанного значения ширины " "можно использовать не более %d десятичных позиций." msgstr[2] "" "%s %s определяет %d десятичных позиций, но для указанного значения ширины " "можно использовать не более %d десятичных позиций." #: src/data/format.c:385 #, c-format msgid "" "%s %s specifies %d decimal place, but the given width does not allow for any " "decimals." msgid_plural "" "%s %s specifies %d decimal places, but the given width does not allow for " "any decimals." msgstr[0] "" "%s %s определяет %d десятичную позицию, но учитывая ширину не допускается " "для любых десятичных дробей." msgstr[1] "" "%s %s определяет %d десятичные позиции, но учитывая ширину не допускается " "для любых десятичных дробей." msgstr[2] "" "%s %s определяет %d десятичных позиций, но учитывая ширину не допускается " "для любых десятичных дробей." #: src/data/format.c:424 #, c-format msgid "%s variables are not compatible with %s format %s." msgstr "Переменные %s несовместимы с %s форматом %s." #: src/data/format.c:425 src/data/format.c:1074 #: src/ui/gui/var-type-dialog.ui:167 msgid "String" msgstr "Строка" #: src/data/format.c:425 src/data/format.c:1035 #: src/ui/gui/var-type-dialog.ui:48 msgid "Numeric" msgstr "Число" #: src/data/format.c:426 src/data/sys-file-reader.c:2212 #: src/data/sys-file-reader.c:2214 src/language/xforms/recode.c:512 #: src/language/xforms/recode.c:513 src/language/xforms/recode.c:525 #: src/language/xforms/recode.c:526 #: src/language/dictionary/apply-dictionary.c:77 #: src/language/dictionary/apply-dictionary.c:78 msgid "numeric" msgstr "число" #: src/data/format.c:426 src/data/sys-file-reader.c:2212 #: src/data/sys-file-reader.c:2214 src/language/xforms/recode.c:512 #: src/language/xforms/recode.c:513 src/language/xforms/recode.c:525 #: src/language/xforms/recode.c:526 #: src/language/dictionary/apply-dictionary.c:77 #: src/language/dictionary/apply-dictionary.c:78 msgid "string" msgstr "строка" #: src/data/format.c:444 #, c-format msgid "String variable with width %d is not compatible with format %s." msgstr "Строчная переменная с шириной %d является несовместимой с форматом %s." #: src/data/format.c:1038 src/ui/gui/var-type-dialog.ui:65 msgid "Comma" msgstr "Запятая" #: src/data/format.c:1041 src/ui/gui/var-type-dialog.ui:82 msgid "Dot" msgstr "Точка" #: src/data/format.c:1044 msgid "Scientific" msgstr "Инженерный" #: src/data/format.c:1061 src/ui/gui/var-type-dialog.ui:116 msgid "Date" msgstr "Дата" #: src/data/format.c:1064 src/ui/gui/var-type-dialog.ui:133 msgid "Dollar" msgstr "Доллар" #: src/data/format.c:1071 msgid "Custom" msgstr "Нетипичный" #: src/data/gnumeric-reader.c:478 src/data/ods-reader.c:505 #, c-format msgid "Cannot convert the value in the spreadsheet cell %s to format (%s): %s" msgstr "" "Не удается преобразовать значение в ячейке электронной таблицы %s в формат " "(%s): %s" #: src/data/gnumeric-reader.c:502 src/data/ods-reader.c:567 #, c-format msgid "" "There was a problem whilst reading the %s file `%s' (near line %d): `%s'" msgstr "Возникла проблема при чтении %s файла `%s' (в строке %d): `%s'" #: src/data/gnumeric-reader.c:597 #, c-format msgid "" "The gnumeric file `%s' is encoded as %s instead of the usual UTF-8 encoding. " "Any non-ascii characters will be incorrectly imported." msgstr "" "В файле gnumeric `%s' использована кодировка %s вместо привычной кодировки " "UTF-8. Все символы, не входящие в ASCII будут импортированы с ошибками." #: src/data/gnumeric-reader.c:641 src/data/ods-reader.c:682 #, c-format msgid "Invalid cell range `%s'" msgstr "Некорректный диапазон ячеек `%s'" #: src/data/gnumeric-reader.c:813 src/data/ods-reader.c:710 #: src/data/ods-reader.c:843 #, c-format msgid "Selected sheet or range of spreadsheet `%s' is empty." msgstr "" "Выбранный лист или диапазон ячеек электронной таблицы `%s' является пустым." #: src/data/identifier2.c:60 #, c-format msgid "Identifier `%s' exceeds %d-byte limit." msgstr "Размеры идентификатора `%s' превышают %d-байтовое ограничение." #: src/data/identifier2.c:84 msgid "Identifier cannot be empty string." msgstr "Идентификатор не может быть пустой строкой." #: src/data/identifier2.c:92 #, c-format msgid "`%s' may not be used as an identifier because it is a reserved word." msgstr "" "`%s' нельзя использовать как название идентификатора, поскольку это слово " "зарезервировано." #: src/data/identifier2.c:103 #, c-format msgid "" "`%s' may not be used as an identifier because it contains ill-formed UTF-8 " "at byte offset %tu." msgstr "" "Название `%s' нельзя использовать как идентификатор, поскольку в нем " "содержится ошибка формата UTF-8 в смещении в байтах %tu." #: src/data/identifier2.c:114 #, c-format msgid "" "Character %s (in `%s') may not appear as the first character in a identifier." msgstr "" "Символ %s (в `%s') нельзя использовать как первую букву идентификатора." #: src/data/identifier2.c:126 #, c-format msgid "Character %s (in `%s') may not appear in an identifier." msgstr "Символ %s (в `%s') нельзя использовать в идентификаторе." #: src/data/mdd-writer.c:241 #, fuzzy, c-format #| msgid "I/O error occurred writing data file `%s'." msgid "An I/O error occurred writing metadata file `%s'." msgstr "Во время записи файла данных «%s» произошла ошибка ввода-вывода." #. TRANSLATORS: this fragment will be interpolated into #. messages in fh_lock() that identify types of files. #: src/data/mdd-writer.c:457 #, fuzzy #| msgid "data file" msgid "metadata file" msgstr "файл данных" #: src/data/mdd-writer.c:465 #, fuzzy, c-format #| msgid "Error opening `%s' for writing as a portable file: %s." msgid "Error opening `%s' for writing as a metadata file: %s." msgstr "" "Ошибка при попытке открыть `%s' для записи в формате портативного файла: %s." #: src/data/mdd-writer.c:473 #, c-format msgid "Internal error creating xmlTextWriter. Please report this to %s." msgstr "" #: src/data/make-file.c:217 #, c-format msgid "Opening %s for writing: %s." msgstr "Открываем %s для записи: %s." #: src/data/make-file.c:228 #, c-format msgid "Opening stream for %s: %s." msgstr "Открываем поток для %s: %s." #: src/data/make-file.c:260 #, c-format msgid "Creating temporary file to replace %s: %s." msgstr "Создаем временный файл на замену %s: %s." #: src/data/make-file.c:277 #, c-format msgid "Creating temporary file %s: %s." msgstr "Создаем временный файл %s: %s." #: src/data/make-file.c:289 #, c-format msgid "Opening stream for temporary file %s: %s." msgstr "Открываем поток для временного файла %s: %s." #: src/data/make-file.c:326 #, c-format msgid "Replacing %s by %s: %s." msgstr "Заменяем %s на %s: %s." #: src/data/make-file.c:354 #, c-format msgid "Removing %s: %s." msgstr "Изымаем %s: %s." #: src/data/mrset.c:83 #, c-format msgid "" "%s is not a valid name for a multiple response set. Multiple response set " "names must begin with `$'." msgstr "" "%s не является допустимым именем для набора множественных ответов. Имя " "набора множественных ответов должно начинаться с `$'. " #: src/data/ods-reader.c:620 #, c-format msgid "Cannot open %s as a OpenDocument file: %s" msgstr "Не удалось открыть %s как OpenDocument файл: %s" #. TRANSLATORS: this fragment will be interpolated into #. messages in fh_lock() that identify types of files. #: src/data/pc+-file-reader.c:206 msgid "SPSS/PC+ system file" msgstr "системный файл SPSS/PC+" #: src/data/pc+-file-reader.c:215 #, c-format msgid "Error opening `%s' for reading as an SPSS/PC+ system file: %s." msgstr "" "Ошибка при открытии `%s' для чтения в формате системного файла SPSS/PC+: %s." #: src/data/pc+-file-reader.c:224 src/data/sys-file-reader.c:3541 #, c-format msgid "%s: stat failed (%s)." msgstr "%s: ошибка статистики (%s)." #: src/data/pc+-file-reader.c:230 #, c-format msgid "%s: file too large." msgstr "%s: файл является слишком большим." #: src/data/pc+-file-reader.c:257 #, c-format msgid "" "Directory entry is for a %u-byte record starting at offset %u but file is " "only %u bytes long." msgstr "" "Запись каталога предназначен для %u-байтового записи со смещением %u, но в " "файле только %u байт." #: src/data/pc+-file-reader.c:275 #, c-format msgid "Directory fields have unexpected values (%u,%u)." msgstr "Поля каталога имеют неожиданные значения (%u,%u)." #: src/data/pc+-file-reader.c:372 src/data/sys-file-reader.c:672 #, c-format msgid "Variable %zu" msgstr "Переменная %zu" #: src/data/pc+-file-reader.c:380 src/data/sys-file-reader.c:680 #, c-format msgid "Variable %zu Label" msgstr "Метка переменной %zu" #: src/data/pc+-file-reader.c:385 #, c-format msgid "Variable %zu Value Label %zu" msgstr "Переменная %zu, метка значение %zu" #: src/data/pc+-file-reader.c:388 src/data/sys-file-reader.c:690 msgid "Creation Date" msgstr "Дата создания" #: src/data/pc+-file-reader.c:389 src/data/sys-file-reader.c:691 msgid "Creation Time" msgstr "Время создания" #: src/data/pc+-file-reader.c:390 src/data/sys-file-reader.c:692 #: src/language/dictionary/sys-file-info.c:200 msgid "Product" msgstr "Продукт" #: src/data/pc+-file-reader.c:391 src/data/sys-file-reader.c:693 #: src/language/dictionary/sys-file-info.c:300 msgid "File Label" msgstr "Метка файла" #: src/data/pc+-file-reader.c:427 #, c-format msgid "" "Using default encoding %s to read this SPSS/PC+ system file. For best " "results, specify an encoding explicitly. Use SYSFILE INFO with ENCODING=" "\"DETECT\" to analyze the possible encodings." msgstr "" "Используется кодировка по умолчанию %s для чтения этого SPSS/PC+ системного " "файла. Чтобы улучшить результаты, укажите кодировку точно. Используйте " "SYSFILE INFO с ENCODING=\"DETECT\" для анализа возможных кодировок." #: src/data/pc+-file-reader.c:483 src/data/sys-file-reader.c:890 #, c-format msgid "Error closing system file `%s': %s." msgstr "Ошибка во время попытки закрыть системный файл `%s': %s." #: src/data/pc+-file-reader.c:544 msgid "This is not an SPSS/PC+ system file." msgstr "Это не системный файл SPSS/PC+." #: src/data/pc+-file-reader.c:548 #, c-format msgid "Record 0 has unexpected length %u." msgstr "Запись 0 имеет случайную длину, %u." #: src/data/pc+-file-reader.c:572 #, c-format msgid "Record 0 specifies unexpected system missing value %g (%a)." msgstr "Запись 0 определяет неожиданно пропущенное системой значение %g (%a)." #: src/data/pc+-file-reader.c:577 #, c-format msgid "Record 0 reserved fields have unexpected values (%u,%u,%u,%u,%u,%u)." msgstr "" "Запись зарезервированных полей 0 имеет неожиданные значения (%u,%u,%u,%u,%u," "%u). " #: src/data/pc+-file-reader.c:581 #, c-format msgid "Record 0 case counts differ (%u versus %u)." msgstr "Запись наблюдения 0 имеет другую размерность (%u вместо %u)." #: src/data/pc+-file-reader.c:585 #, c-format msgid "Invalid compression type %u." msgstr "Неподдерживаемый тип сжатия %u." #: src/data/pc+-file-reader.c:596 #, c-format msgid "" "Record 0 claims %u cases with %u values per case (requiring at least %zu " "bytes) but data record is only %u bytes long." msgstr "" "Для записи 0 определено %u наблюдений с %u значениями наблюдения (нужно по " "крайней мере %zu байт), но запись данных состоит только из %u байт." #: src/data/pc+-file-reader.c:618 #, c-format msgid "" "Value labels claimed to end at offset %u in labels record but labels record " "is only %u bytes." msgstr "" "Метки значений должны завершаться смещением %u в записи меток, но запись " "меток состоит только из %u байт." #: src/data/pc+-file-reader.c:629 #, c-format msgid "" "Value labels claimed to be at offset %u with length %u but file size is only " "%u bytes." msgstr "" "Метки значений должны начинаться с отступом %u и иметь длину %u, но файл " "имеет размер всего в %u байт." #: src/data/pc+-file-reader.c:656 #, c-format msgid "" "Value labels end with partial label (%u bytes left in record, label length " "%)." msgstr "" "Метки значений завершаются частичной меткой (в записи остается %u байт, " "длина метки %)." #: src/data/pc+-file-reader.c:669 #, c-format msgid "%u leftover bytes following value labels." msgstr "%u остаточных байт следуют за метками значений." #: src/data/pc+-file-reader.c:685 #, c-format msgid "" "Variable label claimed to start at offset %u in labels record but labels " "record is only %u bytes." msgstr "" "Переменная метка должна начинаться отступом %u в записи меток, но запись " "метки состоит только из %u байт." #: src/data/pc+-file-reader.c:697 #, c-format msgid "" "Variable label with length %u starting at offset %u in labels record " "overruns end of %u-byte labels record." msgstr "" "Метки переменной длиной %u начиная с отступа %u в записи меток перекрывает " "конец %u - байтовой записи меток." #: src/data/pc+-file-reader.c:719 #, c-format msgid "Record 1 has length %u (expected %u)." msgstr "Запись 1 имеет длину %u (должно быть %u)." #: src/data/pc+-file-reader.c:751 #, c-format msgid "Variable %u has invalid type %." msgstr "Переменная %u принадлежит к некорректному типа %." #: src/data/pc+-file-reader.c:787 #, c-format msgid "Invalid weight index %u." msgstr "Неверный индекс веса, %u." #: src/data/pc+-file-reader.c:857 #, c-format msgid "Invalid variable name `%s'." msgstr "Некорректное название переменной `%s'." #: src/data/pc+-file-reader.c:865 src/data/sys-file-reader.c:1444 #, c-format msgid "Renaming variable with duplicate name `%s' to `%s'." msgstr "Переименовываем переменную с названием, `%s' на `%s'." #: src/data/pc+-file-reader.c:877 #, c-format msgid "Cannot weight by string variable `%s'." msgstr "Такой вес строчной переменной `%s' невозможен." #: src/data/pc+-file-reader.c:973 src/data/sys-file-reader.c:2762 msgid "File ends in partial case." msgstr "Файл завершен на незавершеной записи данных." #: src/data/pc+-file-reader.c:979 #, c-format msgid "" "Case beginning at offset 0x%08x extends past end of data record at offset 0x" "%08x." msgstr "" "Данные, начинаются с отступом 0x%08x и продолжаются после записи данных с " "отступом 0x%08x." #: src/data/pc+-file-reader.c:998 src/data/sys-file-reader.c:2770 #, c-format msgid "Error reading case from file %s." msgstr "Ошибка во время чтения данных файла %s." #: src/data/pc+-file-reader.c:1114 src/data/sys-file-reader.c:2933 #, c-format msgid "" "Possible compressed data corruption: string contains compressed integer " "(opcode %d)." msgstr "" "Вероятное повреждение при сжатии данных: строка содержит сжатое целое " "значение (код операции %d)." #: src/data/pc+-file-reader.c:1156 src/data/sys-file-reader.c:3234 #, c-format msgid "`%s' near offset 0x%llx: " msgstr "`%s' рядом с позицией 0x%llx: " #: src/data/pc+-file-reader.c:1159 src/data/sys-file-reader.c:3237 #, c-format msgid "`%s': " msgstr "`%s': " #: src/data/pc+-file-reader.c:1211 src/data/sys-file-reader.c:3288 #, c-format msgid "System error: %s." msgstr "Системная ошибка: %s." #: src/data/pc+-file-reader.c:1216 src/data/sys-file-reader.c:3293 msgid "Unexpected end of file." msgstr "Неожиданный символ конца файла." #: src/data/pc+-file-reader.c:1301 src/data/sys-file-reader.c:3518 #, c-format msgid "%s: seek failed (%s)." msgstr "%s: ошибка позиционирования (%s)." #: src/data/pc+-file-reader.c:1351 msgid "SPSS/PC+ System File" msgstr "Системный файл SPSS/PC+" #: src/data/por-file-reader.c:109 #, c-format msgid "portable file %s corrupt at offset 0x%llx: " msgstr "портативный файл %s поврежден на позиции 0x%llx: " #: src/data/por-file-reader.c:136 #, c-format msgid "reading portable file %s at offset 0x%llx: " msgstr "чтение портативного файла %s в позиции 0x%llx: " #: src/data/por-file-reader.c:164 #, c-format msgid "Error closing portable file `%s': %s." msgstr "Ошибка во время попытки закрыть портативный файл `%s': %s." #: src/data/por-file-reader.c:216 msgid "unexpected end of file" msgstr "неожиданный символ конца файла" #. TRANSLATORS: this fragment will be interpolated into #. messages in fh_lock() that identify types of files. #: src/data/por-file-reader.c:275 src/data/por-file-writer.c:147 msgid "portable file" msgstr "портативный файл" #: src/data/por-file-reader.c:283 #, c-format msgid "" "An error occurred while opening `%s' for reading as a portable file: %s." msgstr "" "Во время попытки открыть файл `%s' для чтения в формате портативного файла " "произошла ошибка: %s." #: src/data/por-file-reader.c:304 msgid "Data record expected." msgstr "Данные ожидают записи." #: src/data/por-file-reader.c:402 msgid "Number expected." msgstr "Необходимо использовать число." #: src/data/por-file-reader.c:430 msgid "Missing numeric terminator." msgstr "Пропущена отметка конца числа." #: src/data/por-file-reader.c:453 msgid "Invalid integer." msgstr "Некорректное целое число." #: src/data/por-file-reader.c:464 src/data/por-file-reader.c:484 #, c-format msgid "Bad string length %d." msgstr "Ошибочная длина строки %d." #: src/data/por-file-reader.c:547 #, c-format msgid "%s: Not a portable file." msgstr "%s: не является портативным файлом." #: src/data/por-file-reader.c:564 #, c-format msgid "Unrecognized version code `%c'." msgstr "Нераспознанный код версии, `%c'." #: src/data/por-file-reader.c:577 #, c-format msgid "Bad date string length %zu." msgstr "Ошибочная длина строки даты, %zu." #: src/data/por-file-reader.c:579 #, c-format msgid "Bad time string length %zu." msgstr "Ошибочная длина строки времени, %zu." #: src/data/por-file-reader.c:630 #, c-format msgid "" "%s: Bad format specifier byte (%d). Variable will be assigned a default " "format." msgstr "" "%s: Ошибочный спецификатор формата байт (%d). Переменной будет присвоено " "значение формата по умолчанию." #: src/data/por-file-reader.c:651 #, c-format msgid "Numeric variable %s has invalid format specifier %s." msgstr "" "Для числовой переменной %s используется некорректный спецификатор формата %s." #: src/data/por-file-reader.c:655 #, c-format msgid "String variable %s with width %d has invalid format specifier %s." msgstr "" "Для строчной переменной %s с шириной %d указан некорректный спецификатор " "формата %s." #: src/data/por-file-reader.c:679 msgid "Expected variable count record." msgstr "Должна быть указана запись количества переменных." #: src/data/por-file-reader.c:683 #, c-format msgid "Invalid number of variables %d." msgstr "Неверное количество переменных, %d." #: src/data/por-file-reader.c:692 #, c-format msgid "Weight variable name (%s) truncated." msgstr "Имя переменной (%s) обрезано." #: src/data/por-file-reader.c:707 msgid "Expected variable record." msgstr "Должна быть указана запись переменной." #: src/data/por-file-reader.c:711 #, c-format msgid "Invalid variable width %d." msgstr "Некорректная ширина переменной %d." #: src/data/por-file-reader.c:719 #, c-format msgid "Invalid variable name `%s' in position %d." msgstr "Некорректное название переменной `%s' в позиции %d." #: src/data/por-file-reader.c:723 src/data/sys-file-reader.c:1426 #, c-format msgid "Bad width %d for variable %s." msgstr "Ошибочная ширина %d переменной %s." #: src/data/por-file-reader.c:737 #, c-format msgid "Duplicate variable name %s in position %d renamed to %s." msgstr "Дубликат названия переменной %s в позиции %d переименован в %s." #: src/data/por-file-reader.c:786 #, c-format msgid "Weighting variable %s not present in dictionary." msgstr "В словаре не найдена переменная %s." #: src/data/por-file-reader.c:830 #, c-format msgid "Unknown variable %s while parsing value labels." msgstr "Неизвестная переменная %s при обработке меток значений." #: src/data/por-file-reader.c:833 #, c-format msgid "" "Cannot assign value labels to %s and %s, which have different variable types." msgstr "" "Не удалось назначить метки значений к %s и %s, они принадлежат к разным " "типам переменных." #: src/data/por-file-reader.c:972 msgid "SPSS Portable File" msgstr "Портативный файл SPSS" #: src/data/por-file-writer.c:139 #, c-format msgid "Invalid decimal digits count %d. Treating as %d." msgstr "Некорректное число десятичных знаков %d. Будет исправлено на %d." #: src/data/por-file-writer.c:159 #, c-format msgid "Error opening `%s' for writing as a portable file: %s." msgstr "" "Ошибка при попытке открыть `%s' для записи в формате портативного файла: %s." #: src/data/por-file-writer.c:505 #, c-format msgid "An I/O error occurred writing portable file `%s'." msgstr "При попытке записать портативный файл `%s' произошла ошибка." #: src/data/psql-reader.c:48 msgid "" "Support for reading postgres databases was not compiled into this " "installation of PSPP" msgstr "В этом экземпляре PSPP нет поддержки чтения баз данных postgres" #: src/data/psql-reader.c:242 msgid "Memory error whilst opening psql source" msgstr "Ошибка в работе с памятью при попытке открыть код psql" #: src/data/psql-reader.c:248 #, c-format msgid "Error opening psql source: %s." msgstr "Ошибка при попытке открыть источник psql: %s." #: src/data/psql-reader.c:263 #, c-format msgid "" "Postgres server is version %s. Reading from versions earlier than 8.0 is not " "supported." msgstr "Postgres сервер версии %s. Чтение версий ранее 8.0 не поддерживается." #: src/data/psql-reader.c:283 msgid "" "Connection is unencrypted, but unencrypted connections have not been " "permitted." msgstr "" "Соединение не зашифровано. Передача данных незашифрованными соединениями " "запрещена." #: src/data/psql-reader.c:324 src/data/psql-reader.c:349 #: src/data/psql-reader.c:359 #, c-format msgid "Error from psql source: %s." msgstr "Ошибка источника psql: %s." #: src/data/psql-reader.c:454 #, c-format msgid "Unsupported OID %d. SYSMIS values will be inserted." msgstr "Неподдерживаемые элементы OID %d. Будут вставлены значения SYSMIS." #: src/data/settings.c:391 msgid "" "MXWARNS set to zero. No further warnings will be given even when " "potentially problematic situations are encountered." msgstr "" "Для MXWARNS установлено нулевое значение. Программа больше не будет " "предупреждать вас, даже если будут выявлены потенциально проблемные вещи." #: src/data/settings.c:398 #, c-format msgid "" "Warnings re-enabled. %d warnings will be issued before aborting syntax " "processing." msgstr "" "Показ предупреждены повторно включен. До автоматического прерывания " "обработки синтаксических конструкций будет показано %d предупреждений." #: src/data/settings.c:618 #, c-format msgid "" "%s: Custom currency string `%s' does not contain exactly three periods or " "commas (or it contains both)." msgstr "" "%s: в строке нетипичной валюты, `%s' пропущены точки или запятые (или " "содержатся и точки и запятые)." #. TRANSLATORS: this fragment will be interpolated into #. messages in fh_lock() that identify types of files. #: src/data/sys-file-reader.c:407 src/data/sys-file-writer.c:245 msgid "system file" msgstr "системный файл" #: src/data/sys-file-reader.c:414 #, c-format msgid "Error opening `%s' for reading as a system file: %s." msgstr "Ошибка при открытии `%s' как системного файла: %s." #: src/data/sys-file-reader.c:491 msgid "Misplaced type 4 record." msgstr "Ошибочное расположение записи типа 4." #: src/data/sys-file-reader.c:496 msgid "Duplicate type 6 (document) record." msgstr "Дублирование записи типа 6 (документа)." #: src/data/sys-file-reader.c:506 src/data/sys-file-reader.c:1343 #, fuzzy, c-format #| msgid "" #| "Unrecognized record type 7, subtype %d. Please send a copy of this file, " #| "and the syntax which created it to %s." msgid "" "Unrecognized record type 7, subtype %d. For help, please send this file to " "%s and mention that you were using %s." msgstr "" "Нераспознанный тип записи 7, подтип %d. Пожалуйста, отправьте копию этого " "файла, и синтаксис его создания по адресу %s." #: src/data/sys-file-reader.c:526 #, fuzzy, c-format #| msgid "" #| "Record type 7, subtype %d found here has the same type as the record " #| "found near offset 0x%llx. Please send a copy of this file, and the " #| "syntax which created it to %s." msgid "" "Record type 7, subtype %d found here has the same type as the record found " "near offset 0x%llx. For help, please send this file to %s and mention that " "you were using %s." msgstr "" "Запись тип 7, подтип %d, обнаруженная здесь принадлежит к тому же типу, что " "и записи по адресу 0x%llx. Пожалуйста, пришлите копию этого файла и " "синтаксические конструкции, с помощью которых он был создан, по адресу %s." #: src/data/sys-file-reader.c:538 #, c-format msgid "Unrecognized record type %d." msgstr "Нераспознанный тип записи %d." #: src/data/sys-file-reader.c:688 #, c-format msgid "Value Label %zu" msgstr "Метка значения %zu" #: src/data/sys-file-reader.c:697 msgid "Extra Product Info" msgstr "Дополнительные сведения по продукту" #: src/data/sys-file-reader.c:710 #, c-format msgid "Document Line %zu" msgstr "Строка документа %zu" #: src/data/sys-file-reader.c:718 #, c-format msgid "MRSET %zu" msgstr "MRSET %zu" #: src/data/sys-file-reader.c:720 #, c-format msgid "MRSET %zu Label" msgstr "Метка MRSET %zu" #: src/data/sys-file-reader.c:725 #, c-format msgid "MRSET %zu Counted Value" msgstr "Расчет значения MRSET %zu" #: src/data/sys-file-reader.c:763 #, c-format msgid "" "This system file does not indicate its own character encoding. Using " "default encoding %s. For best results, specify an encoding explicitly. Use " "SYSFILE INFO with ENCODING=\"DETECT\" to analyze the possible encodings." msgstr "" "В данном системном файле не указана кодировка. Используется кодировка по " "умолчанию %s. Чтобы улучшить результаты, укажите точную кодировку. " "Используйте SYSFILE INFO с ENCODING=\"DETECT\" для анализа возможных " "кодировок." #: src/data/sys-file-reader.c:845 #, c-format msgid "File header claims %d variable positions but %zu were read from file." msgstr "" "В заголовке файла объявлено о %d позиций переменных, но из файла было " "прочитано только %zu." #: src/data/sys-file-reader.c:958 src/data/sys-file-reader.c:972 msgid "This is not an SPSS system file." msgstr "Это не системный файл SPSS." #: src/data/sys-file-reader.c:1027 msgid "" "Compression bias is not the usual value of 100, or system file uses " "unrecognized floating-point format." msgstr "" "Уровень сжатия не является обычным значением 100, или в системном файле " "содержатся данные в неизвестном формате с плавающей точкой." #: src/data/sys-file-reader.c:1102 msgid "Variable label indicator field is not 0 or 1." msgstr "Поле индикатора метки переменной не содержит 0 или 1." #: src/data/sys-file-reader.c:1115 msgid "Numeric missing value indicator field is not -3, -2, 0, 1, 2, or 3." msgstr "" "В числовом значении отсутствует индикатор поля не равный -3, -2, 0, 1, 2, " "или 3." #: src/data/sys-file-reader.c:1125 msgid "String missing value indicator field is not 0, 1, 2, or 3." msgstr "" "В строке отсутствует значение поля с показателем не равным 0, 1, 2, или 3." #: src/data/sys-file-reader.c:1152 #, c-format msgid "Invalid number of labels %u." msgstr "Некорректное количество меток, %u." #: src/data/sys-file-reader.c:1185 msgid "" "Variable index record (type 4) does not immediately follow value label " "record (type 3) as it should." msgstr "" "Запись индекса переменной (тип 4) не соответствует значению метки записи " "(тип 3), как это должно быть." #: src/data/sys-file-reader.c:1197 #, c-format msgid "" "Number of variables associated with a value label (%u) is not between 1 and " "the number of variables (%zu)." msgstr "" "Число переменных, связанных со значением метки (%u) не лежит между 1 и " "значением количества переменных (%zu)." #: src/data/sys-file-reader.c:1224 #, c-format msgid "Number of document lines (%d) must be greater than 0 and less than %d." msgstr "" "Количество строк в документе (%d) должна быть больше 0 и быть меньше %d." #: src/data/sys-file-reader.c:1317 #, c-format msgid "Record type 7, subtype %d has bad size %u (expected %d)." msgstr "Запись тип 7, подтип %d, имеет размерность %u (должно быть %d)." #: src/data/sys-file-reader.c:1321 #, c-format msgid "Record type 7, subtype %d has bad count %u (expected %d)." msgstr "Неверная запись тип 7, подтип %d в графе %u (ожидалось %d)." #: src/data/sys-file-reader.c:1435 #, fuzzy, c-format #| msgid "Renaming variable with duplicate name `%s' to `%s'." msgid "Renaming variable with invalid name `%s' to `%s'." msgstr "Переименовываем переменную с названием, `%s' на `%s'." #: src/data/sys-file-reader.c:1517 msgid "Missing string continuation record." msgstr "Пропущено запись продолжения строки." #: src/data/sys-file-reader.c:1550 #, c-format msgid "Variable %s with width %d has invalid print format 0x%x." msgstr "Переменная %s с шириной %d имеет некорректный формат печати 0x%x." #: src/data/sys-file-reader.c:1554 #, c-format msgid "Variable %s with width %d has invalid write format 0x%x." msgstr "Переменная %s с шириной %d имеет некорректный формат записи 0x%x." #: src/data/sys-file-reader.c:1559 msgid "Suppressing further invalid format warnings." msgstr "" "Дальнейшие предупреждение по поводу некорректного форматирования отключено." #: src/data/sys-file-reader.c:1613 #, c-format msgid "" "Floating-point representation indicated by system file (%d) differs from " "expected (%d)." msgstr "" "Представление чисел с плавающей точкой, определенное в системном файле (%d) " "отличается от ожидаемого (%d)." #: src/data/sys-file-reader.c:1629 #, c-format msgid "" "Integer format indicated by system file (%d) differs from expected (%d)." msgstr "" "Формат записи целого числа, определенный в системном файле (%d) отличается " "от ожидаемого (%d)." #: src/data/sys-file-reader.c:1647 src/data/sys-file-reader.c:1653 #, c-format msgid "File specifies unexpected value %g (%a) as %s, instead of %g (%a)." msgstr "Файл имеет неожиданные значения %g (%a) как %s, вместо %g (%a)." #: src/data/sys-file-reader.c:1662 #, c-format msgid "" "File specifies unexpected value %g (%a) as %s, instead of %g (%a) or %g (%a)." msgstr "" "Файл имеет неожиданное значение %g (%a) как %s, вместо %g (%a) или %g (%a)." #: src/data/sys-file-reader.c:1714 src/data/sys-file-reader.c:1733 #, c-format msgid "Missing space following `%c' at offset %zu in MRSETS record." msgstr "Пропущен пробел в `%c' в позиции %zu в записи MRSETS." #: src/data/sys-file-reader.c:1741 #, fuzzy, c-format #| msgid "" #| "Unexpected label source value following `E' at offset %zu in MRSETS " #| "record." msgid "" "Missing label source value following `E' at offset %zu in MRSETS record." msgstr "" "Неожиданное значение источника метки с последующим `E' на позиции %zu в " "записи MRSETS." #: src/data/sys-file-reader.c:1748 #, c-format msgid "" "Unexpected label source value following `E' at offset %zu in MRSETS record." msgstr "" "Неожиданное значение источника метки с последующим `E' на позиции %zu в " "записи MRSETS." #: src/data/sys-file-reader.c:1755 #, c-format msgid "Missing `C', `D', or `E' at offset %zu in MRSETS record." msgstr "Пропущено `C', `D', или `E' на позиции %zu в записи MRSETS." #: src/data/sys-file-reader.c:1782 #, c-format msgid "Missing new-line parsing variable names at offset %zu in MRSETS record." msgstr "" "Пропущено название переменных, разделенных разрывом строк на позиции %zu в " "записи MRSETS." #: src/data/sys-file-reader.c:1817 #, fuzzy, c-format #| msgid "No multiple response set named %s." msgid "Invalid multiple response set name `%s'." msgstr "Нет набора множества ответов с названием %s." #: src/data/sys-file-reader.c:1850 #, c-format msgid "MRSET %s contains duplicate variable name %s." msgstr "MRSET %s содержит дублирование названия переменной %s." #: src/data/sys-file-reader.c:1865 #, c-format msgid "MRSET %s contains both string and numeric variables." msgstr "MRSET %s имет переменные и в строке и в числовом значении." #: src/data/sys-file-reader.c:1877 #, c-format msgid "MRSET %s has no variables." msgstr "MRSET %s не содержит переменных." #: src/data/sys-file-reader.c:1879 #, c-format msgid "MRSET %s has only one variable." msgstr "MRSET %s содержит только одну переменную." #: src/data/sys-file-reader.c:1923 #, c-format msgid "Extension 11 has bad count %u (for %zu variables)." msgstr "Расширение 11 содержит значение счетчика %u (для %zu переменных)." #: src/data/sys-file-reader.c:1956 #, c-format msgid "" "Invalid variable display parameters for variable %zu (%s). Default " "parameters substituted." msgstr "" "Некорректные параметры отображения переменной %zu (%s). Будут использованы " "типовые параметры." #: src/data/sys-file-reader.c:2000 #, c-format msgid "Duplicate long variable name `%s'." msgstr "Дублирование длинного названия переменной `%s'." #: src/data/sys-file-reader.c:2053 #, c-format msgid "Long variable mapping from %s to invalid variable name `%s'." msgstr "Долгая привязка переменной %s к названию некорректной переменной `%s'." #: src/data/sys-file-reader.c:2088 #, c-format msgid "%s listed as string of invalid length %s in very long string record." msgstr "" "%s показано в списке как строка некорректной длины %s (очень длинные строки)." #: src/data/sys-file-reader.c:2099 #, c-format msgid "" "%s listed in very long string record with width %s, which requires only one " "segment." msgstr "" "%s использует в записи очень длинные строки с шириной %s, которые требует " "только одного сегмента." #: src/data/sys-file-reader.c:2107 #, c-format msgid "Very long string %s overflows dictionary." msgstr "Слишком длинная строка %s выходит за пределы словаря." #: src/data/sys-file-reader.c:2125 #, c-format msgid "" "Very long string with width %ld has segment %d of width %d (expected %d)." msgstr "" "Очень длинная строка с шириной %ld имеет сегмент линии %d шириной не более " "%d (должна быть %d). " #: src/data/sys-file-reader.c:2183 #, fuzzy, c-format #| msgid "Variable index %d not in valid range 1...%zu." msgid "Value label variable index %d not in valid range 1...%zu." msgstr "Индекс переменной %d не принадлежит корректному диапазону 1...%zu." #: src/data/sys-file-reader.c:2193 #, fuzzy, c-format #| msgid "Variable index %d refers to long string continuation." msgid "Value label variable index %d refers to long string continuation." msgstr "Индекс переменной %d указывает на продолжение долгой строки." #: src/data/sys-file-reader.c:2208 #, c-format msgid "" "Variables associated with value label are not all of identical type. " "Variable %s is %s, but variable %s is %s." msgstr "" "Переменные, связанные со значением метки не все одинакового типа. Переменная " "%s есть %s, но переменная %s есть %s." #: src/data/sys-file-reader.c:2226 #, c-format msgid "" "Value labels may not be added to long string variables (e.g. %s) using " "records types 3 and 4." msgstr "" "Значения меток не могут быть добавлены к длинным строковым переменным " "(например, %s) с помощью записей типов 3 и 4. " #: src/data/sys-file-reader.c:2255 #, c-format msgid "Duplicate value label for %g on %s." msgstr "Дублирование метки значение для %g в %s." #: src/data/sys-file-reader.c:2260 src/data/sys-file-reader.c:2600 #, c-format msgid "Duplicate value label for `%.*s' on %s." msgstr "Дублирование метки значение для `%.*s' в %s." #: src/data/sys-file-reader.c:2283 #, fuzzy, c-format #| msgid "Suppressed %d additional related warnings." msgid "Suppressed %d additional warnings for value labels." msgstr "Отключено %d дополнительных связанных предупреждений." #: src/data/sys-file-reader.c:2297 #, fuzzy, c-format #| msgid "Variable index %d not in valid range 1...%zu." msgid "" "Weight variable index %d not in valid range 1...%zu. Treating file as " "unweighted." msgstr "Индекс переменной %d не принадлежит корректному диапазону 1...%zu." #: src/data/sys-file-reader.c:2307 #, fuzzy, c-format #| msgid "Variable index %d refers to long string continuation." msgid "" "Weight variable index %d refers to long string continuation. Treating file " "as unweighted." msgstr "Индекс переменной %d указывает на продолжение долгой строки." #: src/data/sys-file-reader.c:2315 #, c-format msgid "Ignoring string variable `%s' set as weighting variable." msgstr "Игнорируем строчную переменную `%s', установите переменную." #: src/data/sys-file-reader.c:2352 #, c-format msgid "Error parsing attribute value %s[%d]." msgstr "Ошибка при попытке обработать значение атрибута %s[%d]." #: src/data/sys-file-reader.c:2366 #, c-format msgid "Attribute value %s[%d] is not quoted: %s." msgstr "Значение атрибута %s[%d] указано не в кавычках: %s." #: src/data/sys-file-reader.c:2379 #, fuzzy, c-format #| msgid "Duplicate variable name %s." msgid "Duplicate attribute %s." msgstr "Дублирование названия переменной %s." #: src/data/sys-file-reader.c:2463 #, c-format msgid "Invalid role for variable %s." msgstr "Некорректная роль переменной %s." #: src/data/sys-file-reader.c:2472 #, c-format msgid "%zu other variables had invalid roles." msgstr "%zu других переменных имеет некорректную роль." #: src/data/sys-file-reader.c:2485 #, c-format msgid "Extension record subtype %d ends unexpectedly." msgstr "Запись расширения подтипа %d неожиданно заканчивается." #: src/data/sys-file-reader.c:2531 #, c-format msgid "Ignoring long string value label record for unknown variable %s." msgstr "" "Игнорируем запись метки длинного строкового значения для неизвестной " "переменной %s." #: src/data/sys-file-reader.c:2536 #, c-format msgid "Ignoring long string value label record for numeric variable %s." msgstr "" "Игнорируем запись метки длинного строкового значения числовой переменной %s." #: src/data/sys-file-reader.c:2543 #, c-format msgid "" "Ignoring long string value label record for variable %s because the record's " "width (%d) does not match the variable's width (%d)." msgstr "" "Игнорируем запись метки длинного строкового значения для переменной %s, " "поскольку длина записи (%d) не соответствует ширине переменной (%d)." #: src/data/sys-file-reader.c:2573 #, c-format msgid "" "Ignoring long string value label %zu for variable %s, with width %d, that " "has bad value width %zu." msgstr "" "Игнорируем метку значения длинной строки %zu для переменной %s с шириной %d, " "поскольку значение имеет ошибочную ширину %zu." #: src/data/sys-file-reader.c:2646 #, c-format msgid "" "Long string missing values record says variable %s has %d missing values, " "but only 1 to 3 missing values are allowed." msgstr "" "Запись о пропущенных значениях длинной строки говорит, что переменная %s " "имеет %d пропущенных значений, при этом разрешено иметь только от 1 до 3 " "пропущенных значений." #: src/data/sys-file-reader.c:2656 #, c-format msgid "Ignoring long string missing value record for unknown variable %s." msgstr "" "Игнорируем запись длинного строкового пропущенного значение для неизвестной " "переменной %s." #: src/data/sys-file-reader.c:2661 #, c-format msgid "Ignoring long string missing value record for numeric variable %s." msgstr "" "Игнорируем запись длинного строкового пропущенного значение для числовой " "переменной %s." #: src/data/sys-file-reader.c:2686 #, c-format msgid "" "Ignoring long string missing value %zu for variable %s, with width %d, that " "has bad value width %zu." msgstr "" "Игнорируем пропущенное значение длинного строки %zu для переменной %s с " "шириной %d, поскольку значение имеет ошибочную ширину %zu." #: src/data/sys-file-reader.c:2740 msgid "File ends in partial string value." msgstr "Файл завершен на незавершенной строке." #: src/data/sys-file-reader.c:2879 msgid "" "Possible compressed data corruption: compressed spaces appear in numeric " "field." msgstr "" "Вероятное повреждение при сжатии данных: попытка сжатия пробелов в числовом " "поле." #: src/data/sys-file-reader.c:3030 #, c-format msgid "Suppressed %d additional related warnings." msgstr "Отключено %d дополнительных связанных предупреждений." #: src/data/sys-file-reader.c:3076 src/data/sys-file-reader.c:3093 #, c-format msgid "Dictionary record refers to unknown variable %s." msgstr "Запись словаря ссылается на неизвестную переменную %s." #: src/data/sys-file-reader.c:3159 #, c-format msgid "Expecting digit at offset %zu in MRSETS record." msgstr "В позиции %zu в записи MRSETS необходимо использовать цифру." #: src/data/sys-file-reader.c:3167 #, c-format msgid "Expecting space at offset %zu in MRSETS record." msgstr "В позиции %zu в записи MRSETS необходимо использовать пробел." #: src/data/sys-file-reader.c:3175 #, c-format msgid "%zu-byte string starting at offset %zu exceeds record length %zu." msgstr "" "%zu-байтовое строчное значение, начинающееся с позиции %zu, выходит за " "пределы длины записи %zu." #: src/data/sys-file-reader.c:3185 #, c-format msgid "Expecting space at offset %zu following %zu-byte string." msgstr "" "В позиции %zu необходимо использовать пробел с последующей %zu-байтовым " "строкой." #: src/data/sys-file-reader.c:3476 #, c-format msgid "Wrong ZLIB data header offset %#llx (expected %#llx)." msgstr "Неверный заголовок данных ZLIB в позиции %#llx (должно быть %#llx)." #: src/data/sys-file-reader.c:3484 #, c-format msgid "Impossible ZLIB trailer offset 0x%llx." msgstr "Некорректная концовка ZLIB в позиции 0x%llx." #: src/data/sys-file-reader.c:3491 #, c-format msgid "Invalid ZLIB trailer length %lld." msgstr "Некорректная концовка ZLIB в длинне %lld." #: src/data/sys-file-reader.c:3555 #, c-format msgid "End of ZLIB trailer (0x%llx) is not file size (0x%llx)." msgstr "" "Завершение ZLIB (0x%llx) находится за пределами размера файла (0x%llx)." #: src/data/sys-file-reader.c:3565 #, c-format msgid "ZLIB trailer bias (%lld) differs from file header bias (%.2f)." msgstr "Уровень ZLIB (%lld) отличается от уровня заголовка файла (%.2f)." #: src/data/sys-file-reader.c:3575 #, c-format msgid "ZLIB trailer \"zero\" field has nonzero value %lld." msgstr "Поле \"zero\" ZLIB имеет ненулевое значение %lld." #: src/data/sys-file-reader.c:3581 #, c-format msgid "ZLIB trailer specifies unexpected %u-byte block size." msgstr "ZLIB имеет неожиданный размер блока в %u байт." #: src/data/sys-file-reader.c:3589 #, c-format msgid "%lld-byte ZLIB trailer specifies %u data blocks (expected %lld)." msgstr "" "%lld-байтовый концовка ZLIB определяет %u блоков данных (должно быть %lld)." #: src/data/sys-file-reader.c:3614 #, c-format msgid "" "ZLIB block descriptor %u reported uncompressed data offset %#llx, when %#llx " "was expected." msgstr "" "Сжатие ZLIB блока дескриптора %u сообщило о не сжатии данных %#llx, хотя " "ожидалось %#llx" #: src/data/sys-file-reader.c:3623 #, c-format msgid "" "ZLIB block descriptor %u reported compressed data offset %#llx, when %#llx " "was expected." msgstr "" "Сжатие ZLIB блока дескриптора %u сообщило о не сжатии данных %#llx, хотя " "ожидалось %#llx" #: src/data/sys-file-reader.c:3633 #, c-format msgid "" "ZLIB block descriptor %u reported block size %#x, when %#x was expected." msgstr "" "Сжатие ZLIB блока дескриптора %u сообщило о размере блока %#x, хотя " "ожидалось %#x" #: src/data/sys-file-reader.c:3641 #, c-format msgid "" "ZLIB block descriptor %u reported block size %#x, when at most %#x was " "expected." msgstr "" "Сжатие ZLIB блока дескриптора %u сообщило о размере блока %#x, хотя " "ожидалось не более %#x." #: src/data/sys-file-reader.c:3653 #, c-format msgid "" "ZLIB block descriptor %u reports compressed size %u and uncompressed size %u." msgstr "" "Сжатие ZLIB блока дескриптора %u сообщило о сжатом размере данных %u и " "несжатом размере данных %u." #: src/data/sys-file-reader.c:3665 #, c-format msgid "" "ZLIB trailer is at offset %#llx but %#llx would be expected from block " "descriptors." msgstr "" "Концовка ZLIB расположена на позиции %#llx но %#llx можно было бы ожидать от " "блока дескрипторов." #: src/data/sys-file-reader.c:3684 #, c-format msgid "ZLIB initialization failed (%s)." msgstr "Ошибка при попытке инициализировать ZLIB (%s)." #: src/data/sys-file-reader.c:3699 #, c-format msgid "Inconsistency at end of ZLIB stream (%s)." msgstr "Не соблюдена последовательность в конце потока данных ZLIB (%s)." #: src/data/sys-file-reader.c:3758 #, c-format msgid "ZLIB stream inconsistency (%s)." msgstr "Не соблюдена последовательность в потоке данных ZLIB (%s)." #: src/data/sys-file-reader.c:3782 msgid "Unexpected end of ZLIB compressed data." msgstr "Неожиданное завершение сжатия данных ZLIB." #: src/data/sys-file-reader.c:3820 msgid "SPSS System File" msgstr "Системный файл SPSS" #: src/data/sys-file-writer.c:210 #, c-format msgid "Unknown system file version %d. Treating as version %d." msgstr "Неизвестная версия системного файла %d. Исправлено как версия %d." #: src/data/sys-file-writer.c:256 #, c-format msgid "Error opening `%s' for writing as a system file: %s." msgstr "" "Ошибка при попытке открыть `%s' для записи в формате системного файла: %s." #: src/data/sys-file-writer.c:1271 #, c-format msgid "An I/O error occurred writing system file `%s'." msgstr "При попытке записать системный файл `%s' произошла ошибка." #: src/data/sys-file-writer.c:1378 #, c-format msgid "Failed to initialize ZLIB for compression (%s)." msgstr "Не удалось инициализировать ZLIB для сжатия (%s)." #: src/data/sys-file-writer.c:1407 #, c-format msgid "Failed to complete ZLIB stream compression (%s)." msgstr "Не удалось завершить сжатие данных ZLIB (%s)." #: src/data/sys-file-writer.c:1449 #, c-format msgid "ZLIB stream compression failed (%s)." msgstr "Ошибка во время попытки сжатия потока данных ZLIB (%s)." #: src/data/sys-file-writer.c:1491 #, c-format msgid "%s: Seek failed (%s)." msgstr "%s: ошибка позиционирования (%s)." #: src/data/variable.c:58 msgid "Left" msgstr "Слева" #: src/data/variable.c:59 msgid "Right" msgstr "Справа" #: src/data/variable.c:60 msgid "Center" msgstr "По центру" #: src/data/variable.c:66 msgid "Nominal" msgstr "Номинальная" #: src/data/variable.c:67 msgid "Ordinal" msgstr "Порядковая" #: src/data/variable.c:68 src/language/stats/ks-one-sample.c:300 msgid "Scale" msgstr "Масштаб" #: src/data/variable.c:74 msgid "Input" msgstr "Ввод" #. TRANSLATORS: This will be part of a filename. Please avoid whitespace. #: src/data/variable.c:75 src/output/spv/spv-writer.c:213 #: src/ui/gui/psppire-output-window.c:547 msgid "Output" msgstr "Вывод" #: src/data/variable.c:76 msgid "Both" msgstr "Оба" #: src/data/variable.c:77 src/language/dictionary/sys-file-info.c:237 #: src/ui/gui/psppire-dialog-action-crosstabs.c:86 #: src/ui/gui/psppire-dialog-action-crosstabs.c:98 #: src/ui/gui/psppire-dialog-action-crosstabs.c:133 #: src/ui/gui/psppire-dialog-action-crosstabs.c:141 #: src/ui/gui/psppire-variable-sheet.c:408 src/ui/gui/var-display.c:34 msgid "None" msgstr "Нет" #: src/data/variable.c:78 msgid "Partition" msgstr "Разделение" #: src/data/variable.c:79 src/ui/gui/reliability.ui:37 msgid "Split" msgstr "Распределение" #: src/data/variable.c:729 #, c-format msgid "%s (%s)" msgstr "%s (%s)" #: src/data/variable.c:1339 msgid "" "At least one case in the data file had a weight value that was user-missing, " "system-missing, zero, or negative. These case(s) were ignored." msgstr "" "По крайней мере, один случай в чтении данных имел значение веса, которое " "было пропущено пользователем, пропущено системой, является нулевым или " "отрицательным. Такое(ие) наблюдение будут проигнорировано(ы)." #: src/language/command.c:207 src/language/stats/graph.c:749 #: src/language/stats/graph.c:755 src/language/stats/graph.c:789 #: src/language/stats/graph.c:794 src/language/stats/graph.c:799 #: src/language/stats/graph.c:852 src/language/stats/graph.c:857 #: src/language/stats/graph.c:862 src/language/stats/graph.c:867 #: src/language/stats/graph.c:872 src/language/stats/graph.c:877 #: src/language/stats/graph.c:882 src/language/utilities/set.q:236 #, c-format msgid "%s is not yet implemented." msgstr "%s пока еще не реализовано." #: src/language/command.c:212 #, c-format msgid "%s may be used only in testing mode." msgstr "%s можно использовать только в режиме тестирования." #: src/language/command.c:217 #, c-format msgid "%s may be used only in enhanced syntax mode." msgstr "%s можно использовать только в расширенном синтаксическом режиме." #: src/language/command.c:345 msgid "expecting command name" msgstr "должно быть указано название команды" #: src/language/command.c:347 #, c-format msgid "Unknown command `%s'." msgstr "Неизвестная команда: `%s'." #: src/language/command.c:380 #, c-format msgid "%s is allowed only before the active dataset has been defined." msgstr "%s можно использовать только перед созданием активного набора данных." #: src/language/command.c:384 #, c-format msgid "%s is allowed only after the active dataset has been defined." msgstr "%s можно использовать только после создания активного набора данных." #: src/language/command.c:388 src/language/command.c:392 #, c-format msgid "%s is allowed only inside %s." msgstr "%s можно использовать только внутри %s." #: src/language/command.c:399 src/language/command.c:403 #, c-format msgid "" "%s is allowed only before the active dataset has been defined or inside %s." msgstr "" "%s можно использовать только перед созданием активного набора данных или " "внутри %s." #: src/language/command.c:407 src/language/command.c:411 #, c-format msgid "" "%s is allowed only after the active dataset has been defined or inside %s." msgstr "" "%s можно использовать только после создания активного набора данных или " "внутри %s." #: src/language/command.c:415 #, c-format msgid "%s is allowed only inside %s or inside %s." msgstr "%s можно использовать только внутри %s или внутри %s." #: src/language/command.c:421 #, c-format msgid "" "%s is allowed only after the active dataset has been defined, inside INPUT " "PROGRAM, or inside FILE TYPE." msgstr "" "%s можно использовать только после создания активного набора данных, в " "пределах INPUT PROGRAM или в пределах FILE TYPE." #: src/language/command.c:426 #, c-format msgid "" "%s is allowed only before the active dataset has been defined, inside INPUT " "PROGRAM, or inside FILE TYPE." msgstr "" "%s можно использовать только перед определением активного набора данных, в " "пределах INPUT PROGRAM или в пределах FILE TYPE." #: src/language/command.c:444 src/language/command.c:447 #, c-format msgid "%s is not allowed inside %s." msgstr "%s нельзя использовать внутри %s." #: src/language/command.c:529 src/language/utilities/host.c:272 #: src/language/utilities/permissions.c:105 #, c-format msgid "This command not allowed when the %s option is set." msgstr "Эту команду нельзя использовать, если установлен параметр %s." #: src/language/command.c:545 #, c-format msgid "Error removing `%s': %s." msgstr "Ошибка при попытке удалить `%s': %s." #: src/language/lexer/lexer.c:296 #, c-format msgid "expecting %s" msgstr "должно быть %s" #: src/language/lexer/lexer.c:300 #, c-format msgid "expecting %s or %s" msgstr "должно быть %s или %s" #: src/language/lexer/lexer.c:304 #, c-format msgid "expecting %s, %s, or %s" msgstr "должно быть %s, %s, или %s" #: src/language/lexer/lexer.c:309 #, c-format msgid "expecting %s, %s, %s, or %s" msgstr "должно быть %s, %s, %s, или %s" #: src/language/lexer/lexer.c:314 #, c-format msgid "expecting %s, %s, %s, %s, or %s" msgstr "должно быть %s, %s, %s, %s, или %s" #: src/language/lexer/lexer.c:319 #, c-format msgid "expecting %s, %s, %s, %s, %s, or %s" msgstr "должно быть %s, %s, %s, %s, %s, или %s" #: src/language/lexer/lexer.c:325 #, c-format msgid "expecting %s, %s, %s, %s, %s, %s, or %s" msgstr "должно быть %s, %s, %s, %s, %s, %s, или %s" #: src/language/lexer/lexer.c:331 #, c-format msgid "expecting %s, %s, %s, %s, %s, %s, %s, or %s" msgstr "должно быть %s, %s, %s, %s, %s, %s, %s, или %s" #: src/language/lexer/lexer.c:351 #, c-format msgid "Subcommand %s may only be specified once." msgstr "Подкоманду %s можно указывать только один раз." #: src/language/lexer/lexer.c:363 #, c-format msgid "Required subcommand %s was not specified." msgstr "Обязательная подкоманда %s не была указана." #: src/language/lexer/lexer.c:371 #, c-format msgid "%s may only be specified once within subcommand %s" msgstr "%s можно указывать только один раз в пределах подкоманды %s" #: src/language/lexer/lexer.c:380 #, c-format msgid "Required %s specification missing from %s subcommand" msgstr "Требуемые %s спецификации пропущены в %s подкоманде" #: src/language/lexer/lexer.c:399 msgid "Syntax error at end of input" msgstr "Синтаксическая ошибка исходных данных" #: src/language/lexer/lexer.c:420 src/language/xforms/select-if.c:60 #: src/language/stats/autorecode.c:206 src/language/stats/npar.c:503 #: src/language/data-io/print-space.c:83 msgid "expecting end of command" msgstr "ожидание завершения команды" #: src/language/lexer/lexer.c:631 msgid "expecting string" msgstr "должна быть указана строка" #: src/language/lexer/lexer.c:660 msgid "expecting integer" msgstr "должно быть указано целое число" #: src/language/lexer/lexer.c:673 msgid "expecting number" msgstr "должно быть указано число" #: src/language/lexer/lexer.c:685 msgid "expecting identifier" msgstr "должен быть указан идентификатор" #: src/language/lexer/lexer.c:1272 msgid "Syntax error at end of command" msgstr "Синтаксическая ошибка в команде" #: src/language/lexer/lexer.c:1281 #, c-format msgid "Syntax error at `%s'" msgstr "Синтаксическая ошибка в `%s'" #: src/language/lexer/lexer.c:1284 msgid "Syntax error" msgstr "Синтаксическая ошибка" #: src/language/lexer/lexer.c:1470 #, c-format msgid "String of hex digits has %d characters, which is not a multiple of 2" msgstr "" "Строка шестнадцатеричных цифр состоит из %d символов. Количество символов не " "является кратным 2." #: src/language/lexer/lexer.c:1477 #, c-format msgid "`%c' is not a valid hex digit" msgstr "`%c' не является корректной шеснадцатиричной цифрой" #: src/language/lexer/lexer.c:1482 #, c-format msgid "" "Unicode string contains %d bytes, which is not in the valid range of 1 to 8 " "bytes" msgstr "" "В строке Unicode содержит %d байтов, что не является корректным диапазоном " "от 1 до 8 байт" #: src/language/lexer/lexer.c:1488 #, c-format msgid "U+%04X is not a valid Unicode code point" msgstr "U+%04X не является корректным пунктом в таблице Unicode" #: src/language/lexer/lexer.c:1493 msgid "Unterminated string constant" msgstr "Незавершенная строчная константа" #: src/language/lexer/lexer.c:1497 #, c-format msgid "Missing exponent following `%s'" msgstr "Отсутствует показатель в `%s'" #: src/language/lexer/lexer.c:1502 msgid "Unexpected `.' in middle of command" msgstr "Неожиданная `.' в середине команды" #: src/language/lexer/lexer.c:1508 #, c-format msgid "Bad character %s in input" msgstr "Неверный символ %s во входных данных" #: src/language/lexer/lexer.c:1603 #, c-format msgid "Opening `%s': %s." msgstr "Открываем `%s': %s." #: src/language/lexer/lexer.c:1647 #, c-format msgid "Error closing `%s': %s." msgstr "Ошибка во время попытки закрыть `%s': %s." #: src/language/lexer/subcommand-list.c:118 #, c-format msgid "No more than %d %s subcommands allowed." msgstr "Можно использовать не более %d подкоманды %s." #: src/language/lexer/format-parser.c:77 msgid "expecting valid format specifier" msgstr "должен быть указан корректный спецификатор формата" #: src/language/lexer/format-parser.c:116 #: src/language/lexer/format-parser.c:143 src/language/utilities/output.c:108 #: src/language/data-io/data-list.c:453 src/language/data-io/get-data.c:638 #: src/language/data-io/placement-parser.c:236 #, c-format msgid "Unknown format type `%s'." msgstr "Неизвестный тип формата `%s'." #: src/language/lexer/format-parser.c:122 #, c-format msgid "Format specifier `%s' lacks required width." msgstr "В специфікаторе формата `%s' пропущено обязательное значение ширины." #: src/language/lexer/format-parser.c:138 msgid "expecting format type" msgstr "должен быть указан формат" #: src/language/lexer/value-parser.c:66 #, c-format msgid "" "The high end of the range (%.*g) is below the low end (%.*g). The range " "will be treated as if reversed." msgstr "" "Верхняя граница диапазона (%.*g) ниже нижней границы (%.*g). Границы будут " "переставлены местами." #: src/language/lexer/value-parser.c:74 #, c-format msgid "Ends of range are equal (%.*g)." msgstr "Конец диапазона равен (%.*g)." #: src/language/lexer/value-parser.c:82 #, c-format msgid "%s or %s must be part of a range." msgstr "%s или %s должны быть частью диапазона." #: src/language/lexer/value-parser.c:112 msgid "System-missing value is not valid here." msgstr "Система пропустила недопустимые значения." #: src/language/lexer/variable-parser.c:86 utilities/pspp-convert.c:83 msgid "expecting variable name" msgstr "должно быть указано название переменной" #: src/language/lexer/variable-parser.c:96 #, c-format msgid "%s is not a variable name." msgstr "%s не является именем переменной." #: src/language/lexer/variable-parser.c:206 #, c-format msgid "" "%s is not a numeric variable. It will not be included in the variable list." msgstr "" "%s не является числовой переменной и не будет включена в список переменных." #: src/language/lexer/variable-parser.c:209 #, c-format msgid "" "%s is not a string variable. It will not be included in the variable list." msgstr "" "%s не является строчной переменной. Она не будет включена в список " "переменных." #: src/language/lexer/variable-parser.c:213 #, c-format msgid "Scratch variables (such as %s) are not allowed here." msgstr "" "Использование нулевых значений переменных недопустимо (в частности %s)." #: src/language/lexer/variable-parser.c:217 #, c-format msgid "" "%s and %s are not the same type. All variables in this variable list must " "be of the same type. %s will be omitted from the list." msgstr "" "%s и %s не принадлежат к одному и тому же типу. Все переменные в этом списке " "переменных должны принадлежать к одному и тому же типу. %s будет удалена из " "списка." #: src/language/lexer/variable-parser.c:223 #, c-format msgid "" "%s and %s are string variables with different widths. All variables in this " "variable list must have the same width. %s will be omitted from the list." msgstr "" "Строковые переменные %s и %s имеют разную длину. Все переменные в списке " "переменных должны иметь одинаковую длину. %s будет удалена из списка." #: src/language/lexer/variable-parser.c:228 #: src/language/lexer/variable-parser.c:447 #, c-format msgid "Variable %s appears twice in variable list." msgstr "Переменная %s в списке переменных использована дважды." #: src/language/lexer/variable-parser.c:341 #, c-format msgid "%s TO %s is not valid syntax since %s precedes %s in the dictionary." msgstr "" "%s TO %s является некорректной синтаксической конструкцией, поскольку %s " "предшествует %s в словаре." #: src/language/lexer/variable-parser.c:349 #, c-format msgid "" "When using the TO keyword to specify several variables, both variables must " "be from the same variable dictionaries, of either ordinary, scratch, or " "system variables. %s is a %s variable, whereas %s is %s." msgstr "" "Если используется ключевое слово TO для определение нескольких переменных, " "обе переменные должны принадлежать одному и тому же словарю обычных, нулевых " "или системных переменных. %s является %s переменной, а %s является %s." #: src/language/lexer/variable-parser.c:424 #, c-format msgid "`%s' cannot be used with TO because it does not end in a digit." msgstr "" "`%s' нельзя использовать с TO, так как название переменной не завершается " "цифрой." #: src/language/lexer/variable-parser.c:432 #, c-format msgid "Numeric suffix on `%s' is larger than supported with TO." msgstr "Числовой суффикс `%s' превышает поддерживаемый TO." #: src/language/lexer/variable-parser.c:505 msgid "Scratch variables not allowed here." msgstr "Нулевые переменные здесь использовать нельзя." #: src/language/lexer/variable-parser.c:529 msgid "Prefixes don't match in use of TO convention." msgstr "Префиксы не согласуются с синтаксисом TO." #: src/language/lexer/variable-parser.c:534 msgid "Bad bounds in use of TO convention." msgstr "TO использует ложные границы." #: src/language/xforms/compute.c:150 src/language/xforms/compute.c:205 #, c-format msgid "" "When executing COMPUTE: SYSMIS is not a valid value as an index into vector " "%s." msgstr "" "При выполнении ВЫЧИСЛЕНИЯ: SYSMIS получено не действительное значение " "индекса в векторе %s." #: src/language/xforms/compute.c:154 src/language/xforms/compute.c:212 #, c-format msgid "" "When executing COMPUTE: %.*g is not a valid value as an index into vector %s." msgstr "" "При выполнении ВЫЧИСЛЕНИЯ: %.*g получено не действительное значение индекса " "в векторе %s." #: src/language/xforms/compute.c:356 #, c-format msgid "There is no vector named %s." msgstr "Нет вектора с именем %s." #: src/language/xforms/count.c:125 msgid "Destination cannot be a string variable." msgstr "Назначение не может быть строчной переменной." #: src/language/xforms/sample.c:76 msgid "The sampling factor must be between 0 and 1 exclusive." msgstr "" "Коэффициент деления выборки должен принадлежать промежутку от 0 до 1 не " "включая границ." #: src/language/xforms/sample.c:96 #, c-format msgid "Cannot sample %d observations from a population of %d." msgstr "Не удалось назначить выборку %d данных из совокупности в %d данных." #: src/language/xforms/recode.c:261 msgid "" "Inconsistent target variable types. Target variables must be all numeric or " "all string." msgstr "" "Несогласованное назначение типа переменных. Назначенные переменные должны " "быть или все числовые или все строчные." #: src/language/xforms/recode.c:282 msgid "CONVERT requires string input values and numeric output values." msgstr "" "Для выполнения CONVERT нужна строка входных значений и числовые значения " "выводимых результатов." #: src/language/xforms/recode.c:339 #, c-format msgid "%s is not allowed with string variables." msgstr "%s нельзя использовать со строковыми переменными." #: src/language/xforms/recode.c:422 msgid "expecting output value" msgstr "должно быть получено выходное значение" #: src/language/xforms/recode.c:479 #, c-format msgid "" "%zu variable(s) cannot be recoded into %zu variable(s). Specify the same " "number of variables as source and target variables." msgstr "" "%zu переменной(ых) не может быть перекодирована(ы) в %zu переменную(ые). " "Задайте одинаковое число переменных в качестве исходных и целевых переменных." #: src/language/xforms/recode.c:494 #, c-format msgid "" "There is no variable named %s. (All string variables specified on INTO must " "already exist. Use the STRING command to create a string variable.)" msgstr "" "Не существует переменной с именем %s. (Все строковые переменные указаны в " "INTO должны уже существовать. Воспользуйтесь командой STRING для создания " "строковой переменной.)" #: src/language/xforms/recode.c:510 #, c-format msgid "INTO is required with %s input values and %s output values." msgstr "" "С входными значениями %s и исходными значениями %s следует использовать INTO." #: src/language/xforms/recode.c:523 #, c-format msgid "Type mismatch. Cannot store %s data in %s variable %s." msgstr "" "Несоответствие типов. Невозможно сохранить %s данные в %s переменной %s." #: src/language/xforms/recode.c:566 #, c-format msgid "" "Cannot recode because the variable %s would require a width of %d bytes or " "greater, but it has a width of only %d bytes." msgstr "" "Перекодирование невозможно, поскольку для переменной %s нужна ширина %d " "байтов или больше, но имеем ширину лишь в %d байт." #: src/language/xforms/select-if.c:100 msgid "Syntax error expecting OFF or BY. Turning off case filtering." msgstr "Синтаксическая ошибка ожидания OFF или BY. Отключаем фильтрацию." #: src/language/xforms/select-if.c:115 msgid "The filter variable must be numeric." msgstr "Переменная фильтрация должна быть числовой." #: src/language/xforms/select-if.c:121 msgid "The filter variable may not be scratch." msgstr "Переменная фильтрация не может быть нулевой." #: src/language/control/control-stack.c:49 #, c-format msgid "%s without %s." msgstr "%s без %s." #: src/language/control/control-stack.c:77 #, c-format msgid "This command must appear inside %s...%s, without intermediate %s...%s." msgstr "" "Эту команду можно использовать только в %s...%s, без промежуточных %s...%s." #: src/language/control/control-stack.c:94 #, c-format msgid "This command cannot appear outside %s...%s." msgstr "Эту команду нельзя использовать вне %s...%s." #: src/language/control/do-if.c:180 #, c-format msgid "This command may not follow %s in %s ... %s." msgstr "После этой команды в %s ... %s не может быть никакого %s." #: src/language/control/loop.c:211 msgid "Only one index clause may be specified." msgstr "Можно использовать только одно выражение индекса." #: src/language/control/repeat.c:120 #, c-format msgid "Dummy variable name `%s' hides dictionary variable `%s'." msgstr "" "Название фиктивной переменной `%s', скрывает переменную из словаря, `%s'." #: src/language/control/repeat.c:126 #, c-format msgid "Dummy variable name `%s' is given twice." msgstr "Название фиктивной переменной `%s' указано дважды." #: src/language/control/repeat.c:170 #, c-format msgid "" "Dummy variable `%s' had %zu substitutions, so `%s' must also, but %zu were " "specified." msgstr "" "Фиктивная переменная `%s' имела %zu подставлений, следовательно `%s' должна " "иметь столько же %zu." #: src/language/control/repeat.c:379 msgid "Ranges may only have integer bounds." msgstr "Границами диапазона могут быть только целые числа." #: src/language/control/repeat.c:393 #, c-format msgid "%ld TO %ld is an invalid range." msgstr "%ld TO %ld не является корректным определением диапазона." #: src/language/control/repeat.c:443 #, c-format msgid "No matching %s." msgstr "Нет подходящего %s." #: src/language/control/temporary.c:44 msgid "" "This command may only appear once between procedures and procedure-like " "commands." msgstr "" "Эту команду можно использовать только один раз между процедурами и " "процедурными командами." #: src/language/dictionary/attributes.c:104 msgid "Attribute array index must be between 1 and 65535." msgstr "" "Индекс в массиве атрибутов должен принадлежать диапазону от 1 до 65535." #: src/language/dictionary/apply-dictionary.c:74 #, c-format msgid "Variable %s is %s in target file, but %s in source file." msgstr "" "Переменная %s равна %s в файле назначения, но равна %s в файле источника." #: src/language/dictionary/apply-dictionary.c:110 msgid "No matching variables found between the source and target files." msgstr "" "Не найдено соответствующих переменных между файлами источника и назначения." #: src/language/dictionary/delete-variables.c:40 #: src/language/dictionary/modify-variables.c:79 #: src/language/dictionary/rename-variables.c:51 #, c-format msgid "" "%s may not be used after %s. Temporary transformations will be made " "permanent." msgstr "" "%s не может использоваться после %s. Временные преобразования будут сделаны " "постоянными." #: src/language/dictionary/delete-variables.c:48 #: src/language/dictionary/modify-variables.c:312 #, c-format msgid "" "%s may not be used to delete all variables from the active dataset " "dictionary. Use %s instead." msgstr "" "%s не может использоваться, чтобы удалить все переменные из словаря активной " "базы данных. Используйте %s вместо этого." #: src/language/dictionary/missing-values.c:70 #, c-format msgid "" "Cannot mix numeric variables (e.g. %s) and string variables (e.g. %s) within " "a single list." msgstr "" "Нельзя смешивать числовые переменные (например %s) и строковые переменные " "(например %s) в одном списке." #: src/language/dictionary/missing-values.c:91 msgid "" "Too many numeric missing values. At most three individual values or one " "value and one range are allowed." msgstr "" #: src/language/dictionary/missing-values.c:126 #, c-format msgid "Truncating missing value to maximum acceptable length (%d bytes)." msgstr "" "Обрезаем пропущенное значение до максимально доступной длины (%d байт)." #: src/language/dictionary/missing-values.c:137 msgid "" "Too many string missing values. At most three individual values are allowed." msgstr "" #: src/language/dictionary/missing-values.c:154 #, c-format msgid "Missing values provided are too long to assign to variable of width %d." msgstr "" "Отсутствующие значения будут слишком длинными для назначения переменной " "ширины не более %d." #: src/language/dictionary/modify-variables.c:145 msgid "Cannot specify ALL after specifying a set of variables." msgstr "нельзя указывать ALL после определения набора переменных." #: src/language/dictionary/modify-variables.c:221 #: src/language/dictionary/rename-variables.c:76 #, c-format msgid "" "Differing number of variables in old name list (%zu) and in new name list " "(%zu)." msgstr "" "Различные количества переменных в списке старых названий (%zu) и в списке " "новых названий (%zu)." #: src/language/dictionary/modify-variables.c:244 #: src/language/dictionary/modify-variables.c:294 #, c-format msgid "" "%s subcommand may be given at most once. It may not be given in conjunction " "with the %s subcommand." msgstr "" "Подкоманду %s можно использовать не более одного раза. Ее нельзя " "использовать в сочетании с подкомандой %s." #: src/language/dictionary/modify-variables.c:331 #, c-format msgid "Unrecognized subcommand name `%s'." msgstr "Неизвестное название подкоманды, `%s'." #: src/language/dictionary/modify-variables.c:334 msgid "Subcommand name expected." msgstr "Субкомманда должна быть указана." #: src/language/dictionary/mrsets.c:117 #, c-format msgid "" "VARIABLES specified only variable %s on %s, but at least two variables are " "required." msgstr "" "VARIABLES определяет только переменную %s в %s, но нужны по крайней мере две " "переменные." #: src/language/dictionary/mrsets.c:150 msgid "Numeric VALUE must be an integer." msgstr "Значение VALUE должно быть целым числом." #: src/language/dictionary/mrsets.c:230 src/language/dictionary/mrsets.c:268 #, c-format msgid "" "MDGROUP subcommand for group %s specifies a string VALUE, but the variables " "specified for this group are numeric." msgstr "" "Подкоманда MDGROUP для группы %s задает строковое значение, но переменные, " "заданные для этой группы являются числовыми." #: src/language/dictionary/mrsets.c:254 #, c-format msgid "" "VALUE string on MDGROUP subcommand for group %s is %d bytes long, but it " "must be no longer than the narrowest variable in the group, which is %s with " "a width of %d bytes." msgstr "" "Строка VALUE в подкоманде MDGROUP для группы %s имеет длину %d байт, но ее " "длина не должна превышать самую короткую переменную в группе, то есть %s " "длиной %d." #: src/language/dictionary/mrsets.c:280 #, c-format msgid "" "MDGROUP subcommand for group %s specifies LABELSOURCE=VARLABEL but not " "CATEGORYLABELS=COUNTEDVALUES. Ignoring LABELSOURCE." msgstr "" "Подкоманда MDGROUP для группы %s задает LABELSOURCE=VARLABEL но не " "CATEGORYLABELS=COUNTEDVALUES. Игнорируем LABELSOURCE." #: src/language/dictionary/mrsets.c:286 #, c-format msgid "" "MDGROUP subcommand for group %s specifies both LABEL and LABELSOURCE, but " "only one of these subcommands may be used at a time. Ignoring LABELSOURCE." msgstr "" "Подкоманда MDGROUP для группы %s задает и LABEL и LABELSOURCE, но только " "одна из этих подкоманд может быть использована единовременно. Игнорируем " "LABELSOURCE." #: src/language/dictionary/mrsets.c:326 #, c-format msgid "" "Variables %s and %s specified as part of multiple dichotomy group %s have " "the same variable label. Categories represented by these variables will not " "be distinguishable in output." msgstr "" "Переменные %s и %s, указанные как часть множественной дихотомии %s, имеют " "одинаковую метку переменной. Категории, которые определяются этими " "переменными, в выведенных данных нельзя будет различить." #: src/language/dictionary/mrsets.c:356 #, c-format msgid "" "Variable %s specified as part of multiple dichotomy group %s (which has " "CATEGORYLABELS=COUNTEDVALUES) has no value label for its counted value. " "This category will not be distinguishable in output." msgstr "" "Переменная %s, указанная как часть множественной дихотомии %s (где " "CATEGORYLABELS=COUNTEDVALUES), не имеет метки значения для подсчитанного " "значения. Категории, которые определяются этими переменными, в выведенных " "данных нельзя будет различить." #: src/language/dictionary/mrsets.c:369 #, c-format msgid "" "Variables %s and %s specified as part of multiple dichotomy group %s (which " "has CATEGORYLABELS=COUNTEDVALUES) have the same value label for the group's " "counted value. These categories will not be distinguishable in output." msgstr "" "Переменные %s и %s, указанные как часть множественной дихотомии %s (где " "CATEGORYLABELS=COUNTEDVALUES), имеют одинаковую метку значения подсчитанного " "значения в группе. Категории, которые определяются этими переменными, в " "выведенных данных нельзя будет различить." #: src/language/dictionary/mrsets.c:426 #, c-format msgid "" "Variables specified on MCGROUP should have the same categories, but %s and " "%s (and possibly others) in multiple category group %s have different value " "labels for value %s." msgstr "" "Переменные, указанные в MCGROUP должны принадлежать одним и тем же " "категориям, но %s и %s (и, вероятно, другие) переменные в группе из " "нескольких категорий %s имеют различные метки значения %s." #: src/language/dictionary/mrsets.c:484 #, c-format msgid "No multiple response set named %s." msgstr "Нет набора множества ответов с названием %s." #: src/language/dictionary/mrsets.c:533 msgid "" "The active dataset dictionary does not contain any multiple response sets." msgstr "" "В активном словаре набора данных не содержится никаких наборов множеств " "ответов." #: src/language/dictionary/mrsets.c:540 msgid "Multiple Response Sets" msgstr "Наборы множеств ответов" #: src/language/dictionary/mrsets.c:543 #: src/language/dictionary/sys-file-info.c:446 #: src/language/dictionary/sys-file-info.c:733 #: src/language/stats/autorecode.c:375 src/language/data-io/data-parser.c:679 #: src/language/data-io/data-parser.c:725 src/language/data-io/print.c:434 #, fuzzy #| msgid "Attribute" msgid "Attributes" msgstr "Атрибут" #: src/language/dictionary/mrsets.c:544 #: src/language/dictionary/sys-file-info.c:191 #: src/language/dictionary/sys-file-info.c:301 #: src/language/dictionary/sys-file-info.c:302 #: src/language/dictionary/sys-file-info.c:455 #: src/language/dictionary/sys-file-info.c:570 #: src/ui/gui/psppire-var-sheet-header.c:67 src/ui/gui/compute.ui:157 msgid "Label" msgstr "Метка" #: src/language/dictionary/mrsets.c:544 #: src/language/dictionary/sys-file-info.c:241 #, fuzzy #| msgid "Encoding:" msgid "Encoding" msgstr "Кодировка:" #: src/language/dictionary/mrsets.c:544 #, fuzzy #| msgid "Counted value" msgid "Counted Value" msgstr "Подсчитанное значение" #: src/language/dictionary/mrsets.c:544 #, fuzzy #| msgid "Cl_ear Variables" msgid "Member Variables" msgstr "Очистить переменные" #: src/language/dictionary/mrsets.c:547 #: src/language/dictionary/sys-file-info.c:470 #: src/ui/gui/psppire-var-sheet-header.c:55 msgid "Name" msgstr "Название" #: src/language/dictionary/mrsets.c:564 msgid "Dichotomies" msgstr "" #: src/language/dictionary/mrsets.c:565 src/language/stats/logistic.c:1391 #, fuzzy #| msgid "Category" msgid "Categories" msgstr "Категория" #: src/language/dictionary/numeric.c:67 #, c-format msgid "Format type %s may not be used with a numeric variable." msgstr "Тип форматирования %s нельзя применять к числовой переменной." #: src/language/dictionary/numeric.c:86 src/language/dictionary/numeric.c:153 #, c-format msgid "There is already a variable named %s." msgstr "Переменная с именем %s уже существует." #: src/language/dictionary/numeric.c:138 #, c-format msgid "Format type %s may not be used with a string variable." msgstr "Тип форматирования %s нельзя применять к строчной переменной." #: src/language/dictionary/rename-variables.c:92 #, c-format msgid "Renaming would duplicate variable name %s." msgstr "Переименование приведет к дублированию названия переменной %s." #: src/language/dictionary/split-file.c:75 #, fuzzy #| msgid "Split File" msgid "Split Values" msgstr "Разделить файл" #: src/language/dictionary/split-file.c:76 #: src/language/dictionary/split-file.c:77 #: src/language/dictionary/sys-file-info.c:696 #: src/language/stats/chisquare.c:195 src/language/stats/cochran.c:156 #: src/language/stats/cochran.c:185 src/language/stats/examine.c:841 #: src/language/stats/reliability.c:648 src/language/stats/reliability.c:651 #: src/language/stats/crosstabs.q:1303 src/language/stats/crosstabs.q:1325 #: src/language/stats/crosstabs.q:1365 src/language/stats/crosstabs.q:1412 msgid "Value" msgstr "Значение" #: src/language/dictionary/split-file.c:79 #: src/language/dictionary/sys-file-info.c:734 #: src/language/stats/chisquare.c:246 src/language/stats/chisquare.c:328 #: src/language/stats/cochran.c:164 src/language/stats/correlations.c:100 #: src/language/stats/descriptives.c:1004 src/language/stats/friedman.c:226 #: src/language/stats/jonckheere-terpstra.c:377 #: src/language/stats/npar-summary.c:113 src/language/stats/quick-cluster.c:588 #: src/language/stats/runs.c:331 src/language/data-io/data-parser.c:683 #: src/language/data-io/data-parser.c:728 src/language/data-io/print.c:438 #: src/ui/gui/psppire-dictview.c:580 src/ui/gui/psppire-data-editor.c:502 msgid "Variable" msgstr "Переменная" #: src/language/dictionary/sys-file-info.c:184 #, fuzzy #| msgid "Variable Information:" msgid "File Information" msgstr "Данные по переменной:" #: src/language/dictionary/sys-file-info.c:185 msgid "Attribute" msgstr "Атрибут" #: src/language/dictionary/sys-file-info.c:187 #, fuzzy #| msgid "File:" msgid "File" msgstr "Файл:" #: src/language/dictionary/sys-file-info.c:194 #, fuzzy #| msgid "Created:" msgid "Created" msgstr "Создано:" #: src/language/dictionary/sys-file-info.c:203 #, fuzzy #| msgid "Integer Format:" msgid "Integer Format" msgstr "Числовой формат:" #: src/language/dictionary/sys-file-info.c:205 msgid "Big Endian" msgstr "Обратный порядок" #: src/language/dictionary/sys-file-info.c:206 msgid "Little Endian" msgstr "Прямой порядок" #: src/language/dictionary/sys-file-info.c:207 #: src/language/dictionary/sys-file-info.c:216 #: src/language/dictionary/sys-file-info.c:223 src/language/utilities/set.q:930 msgid "Unknown" msgstr "Неизвестно" #: src/language/dictionary/sys-file-info.c:209 #, fuzzy #| msgid "Real Format:" msgid "Real Format" msgstr "Настоящий формат:" #: src/language/dictionary/sys-file-info.c:211 msgid "IEEE 754 LE." msgstr "IEEE 754 LE." #: src/language/dictionary/sys-file-info.c:212 msgid "IEEE 754 BE." msgstr "IEEE 754 BE." #: src/language/dictionary/sys-file-info.c:213 msgid "VAX D." msgstr "VAX D." #: src/language/dictionary/sys-file-info.c:214 msgid "VAX G." msgstr "VAX G." #: src/language/dictionary/sys-file-info.c:215 msgid "IBM 390 Hex Long." msgstr "IBM 390 шест. длинные." #: src/language/dictionary/sys-file-info.c:218 #: src/language/dictionary/sys-file-info.c:443 #: src/language/stats/binomial.c:199 src/language/stats/correlations.c:131 #: src/language/stats/correlations.c:159 src/language/stats/descriptives.c:585 #: src/language/stats/factor.c:1658 src/language/stats/factor.c:1701 #: src/language/stats/factor.c:1860 src/language/stats/factor.c:2074 #: src/language/stats/frequencies.c:1583 #: src/language/stats/kruskal-wallis.c:254 #: src/language/stats/kruskal-wallis.c:303 #: src/language/stats/ks-one-sample.c:316 src/language/stats/logistic.c:1187 #: src/language/stats/mann-whitney.c:254 src/language/stats/means.c:718 #: src/language/stats/means.c:800 src/language/stats/median.c:358 #: src/language/stats/oneway.c:985 src/language/stats/oneway.c:1157 #: src/language/stats/reliability.c:591 src/language/stats/regression.c:924 #: src/language/stats/t-test-one-sample.c:132 #: src/language/stats/t-test-paired.c:157 src/language/data-io/list.c:104 #: src/ui/gui/variable-info.ui:25 msgid "Variables" msgstr "Переменные" #: src/language/dictionary/sys-file-info.c:221 src/language/stats/examine.c:929 #: src/language/stats/means.c:697 src/language/stats/reliability.c:548 #: src/language/stats/crosstabs.q:930 msgid "Cases" msgstr "Наблюдения" #: src/language/dictionary/sys-file-info.c:226 src/language/stats/oneway.c:980 #: src/ui/gui/psppire-var-sheet-header.c:58 src/ui/gui/compute.ui:303 msgid "Type" msgstr "Тип" #: src/language/dictionary/sys-file-info.c:230 #, fuzzy #| msgid "Weight:" msgid "Weight" msgstr "Вес:" #: src/language/dictionary/sys-file-info.c:233 #, fuzzy #| msgid "Not weighted." msgid "Not weighted" msgstr "Не взвешенно." #: src/language/dictionary/sys-file-info.c:235 #, fuzzy #| msgid "Compression:" msgid "Compression" msgstr "Сжатие:" #: src/language/dictionary/sys-file-info.c:245 #: src/language/dictionary/sys-file-info.c:424 #: src/language/dictionary/sys-file-info.c:426 #, fuzzy #| msgid "Comments:" msgid "Documents" msgstr "Комментарии:" #: src/language/dictionary/sys-file-info.c:305 #: src/language/dictionary/sys-file-info.c:430 msgid "(none)" msgstr "" #: src/language/dictionary/sys-file-info.c:393 msgid "No variables to display." msgstr "Нет переменных для отображения." #: src/language/dictionary/sys-file-info.c:404 msgid "Macros not supported." msgstr "Поддержки макросов не предусмотрено." #: src/language/dictionary/sys-file-info.c:426 #, fuzzy #| msgid "Document Line %zu" msgid "Document" msgstr "Строка документа %zu" #: src/language/dictionary/sys-file-info.c:454 msgid "Position" msgstr "Расположение" #: src/language/dictionary/sys-file-info.c:456 #, fuzzy #| msgid "Measurement Level: %s\n" msgid "Measurement Level" msgstr "Уровень измерения: %s\n" #: src/language/dictionary/sys-file-info.c:457 #: src/ui/gui/psppire-var-sheet-header.c:85 msgid "Role" msgstr "Роль" #: src/language/dictionary/sys-file-info.c:458 #: src/ui/gui/psppire-var-sheet-header.c:61 src/ui/gui/compute.ui:215 msgid "Width" msgstr "Ширина" #: src/language/dictionary/sys-file-info.c:459 #, fuzzy #| msgid "Align" msgid "Alignment" msgstr "Выровнять" #: src/language/dictionary/sys-file-info.c:460 #: src/language/dictionary/sys-file-info.c:734 msgid "Print Format" msgstr "Формат печати" #: src/language/dictionary/sys-file-info.c:461 #, fuzzy #| msgid "Print Format" msgid "Write Format" msgstr "Формат печати" #: src/language/dictionary/sys-file-info.c:462 #: src/ui/gui/missing-val-dialog.c:379 src/ui/gui/psppire-var-sheet-header.c:73 #: src/ui/gui/examine.ui:416 src/ui/gui/t-test.ui:105 msgid "Missing Values" msgstr "Пропущенные значения" #: src/language/dictionary/sys-file-info.c:567 #: src/ui/gui/psppire-var-sheet-header.c:70 src/ui/gui/val-labs-dialog.c:489 #: src/ui/gui/val-labs-dialog.ui:194 msgid "Value Labels" msgstr "Метки значений" #: src/language/dictionary/sys-file-info.c:573 #, fuzzy #| msgid "Variable View" msgid "Variable Value" msgstr "Просмотр переменных" #: src/language/dictionary/sys-file-info.c:577 #, fuzzy #| msgid "Last non-missing value" msgid "User-missing value" msgstr "Последнее непропущенное значение" #: src/language/dictionary/sys-file-info.c:693 #, fuzzy #| msgid "Variable under test" msgid "Variable and Dataset Attributes" msgstr "Переменная, проверка которой выполняется" #: src/language/dictionary/sys-file-info.c:699 #, fuzzy #| msgid "Variable Name:" msgid "Variable and Name" msgstr "Переменная названий:" #: src/language/dictionary/sys-file-info.c:702 #, fuzzy #| msgid "dataset" msgid "(dataset)" msgstr "база данных" #: src/language/dictionary/sys-file-info.c:722 msgid "No vectors defined." msgstr "Векторов не определено." #: src/language/dictionary/sys-file-info.c:732 #, fuzzy #| msgid "Vector" msgid "Vectors" msgstr "Вектор" #: src/language/dictionary/sys-file-info.c:736 msgid "Vector and Position" msgstr "" #: src/language/dictionary/sys-file-info.c:998 msgid "No valid encodings found." msgstr "Корректных кодировок не найдено." #: src/language/dictionary/sys-file-info.c:1004 #, c-format msgid "Usable encodings for %s." msgstr "Кодировка пригодна для %s." #: src/language/dictionary/sys-file-info.c:1007 #, c-format msgid "" "Encodings that can successfully read %s (by specifying the encoding name on " "the GET command's ENCODING subcommand). Encodings that yield identical text " "are listed together." msgstr "" "Кодировка данных в которой может быть успешно использовано для чтения %s, " "если в подкоманде ENCODING команды GET будет указано название кодировки. " "Кодировки, результаты применения которых являются одинаковыми, показаны " "вместе." #: src/language/dictionary/sys-file-info.c:1012 #: src/language/dictionary/sys-file-info.c:1013 msgid "Encodings" msgstr "Кодировка" #: src/language/dictionary/sys-file-info.c:1042 #, fuzzy, c-format #| msgid "%s encoded text strings." msgid "%s Encoded Text Strings" msgstr "Текстовые строки в кодировке %s." #: src/language/dictionary/sys-file-info.c:1046 msgid "" "Text strings in the file dictionary that the previously listed encodings " "interpret differently, along with the interpretations." msgstr "" "Текстовые строки в файле словаря из ранее перечисленных кодировок " "интерпретированы по-разному и указаны вместе с толкованием." #: src/language/dictionary/sys-file-info.c:1049 src/output/text-item.c:57 #: src/ui/gui/psppire-import-assistant.c:885 msgid "Text" msgstr "Текст" #: src/language/dictionary/sys-file-info.c:1059 msgid "Purpose" msgstr "Назначение" #: src/language/dictionary/value-labels.c:154 #, c-format msgid "Truncating value label to %d bytes." msgstr "Обрезаем метку значения до %d байт." #: src/language/dictionary/vector.c:66 #, c-format msgid "A vector named %s already exists." msgstr "Вектор с именем %s уже существует." #: src/language/dictionary/vector.c:74 #, c-format msgid "Vector name %s is given twice." msgstr "Название вектора %s указано дважды." #: src/language/dictionary/vector.c:98 msgid "A slash must separate each vector specification in VECTOR's long form." msgstr "" "В расширенной форме записи VECTOR спецификации отдельных векторов следует " "разделять символом slash (наклонной чертой)." #: src/language/dictionary/vector.c:131 msgid "Vectors must have at least one element." msgstr "Векторы должны состоять по крайней мере из одного элемента." #: src/language/dictionary/vector.c:151 msgid "expecting vector length" msgstr "должна быть указана длина вектора" #: src/language/dictionary/vector.c:170 #, c-format msgid "%s is an existing variable name." msgstr "%s является названием переменной, которая уже существует." #: src/language/dictionary/variable-display.c:121 msgid "Variable display width must be a positive integer." msgstr "Значение ширины показа переменной должно быть положительным и целым." #: src/language/dictionary/weight.c:49 msgid "The weighting variable must be numeric." msgstr "Весовая переменная должна быть числовой." #: src/language/dictionary/weight.c:54 msgid "The weighting variable may not be scratch." msgstr "Весовая переменная не может иметь нулевое значение." #: src/language/tests/moments-test.c:50 msgid "expecting weight value" msgstr "должно быть использовано значение веса" #: src/language/utilities/cd.c:45 src/language/utilities/include.c:173 #, fuzzy, c-format #| msgid "Cannot change directory to %s: %s " msgid "Cannot change directory to %s: %s" msgstr "Невозможно изменить каталог на %s: %s " #: src/language/utilities/date.c:33 #, c-format msgid "Only %s is currently implemented." msgstr "В текущей версии реализовано только %s." #: src/language/utilities/host.c:60 #, fuzzy #| msgid "Command shell not supported on this platform." msgid "Time limit not supported on this platform." msgstr "На этой платформе не предусмотрено поддержки командной оболочки." #: src/language/utilities/host.c:74 #, c-format msgid "%s: Command exited with status %d." msgstr "" #: src/language/utilities/host.c:95 #, fuzzy, c-format #| msgid "failed to create temporary file" msgid "Failed to create temporary file (%s)." msgstr "не удалось создать временный файл" #: src/language/utilities/host.c:102 #, c-format msgid "/dev/null: Failed to open (%s)." msgstr "" #: src/language/utilities/host.c:117 #, c-format msgid "Couldn't fork: %s." msgstr "Невозможно выполнить разветвление: %s." #: src/language/utilities/host.c:193 #, c-format msgid "While running \"%s\", waiting for child process failed (%s)." msgstr "" #: src/language/utilities/host.c:203 #, c-format msgid "Command \"%s\" timed out." msgstr "" #: src/language/utilities/host.c:205 #, c-format msgid "Command \"%s\" terminated by signal %d." msgstr "" #: src/language/utilities/host.c:212 msgid "Command or shell not found" msgstr "" #: src/language/utilities/host.c:214 msgid "Could not invoke command or shell" msgstr "" #: src/language/utilities/host.c:217 #, c-format msgid "Command \"%s\" exited with status %d (%s)." msgstr "" #: src/language/utilities/host.c:220 #, c-format msgid "Command \"%s\" exited with status %d." msgstr "" #: src/language/utilities/host.c:230 #, c-format msgid "Command \"%s\" output could not be read (%s)." msgstr "" #: src/language/utilities/title.c:88 #, c-format msgid " (Entered %s)" msgstr " (Введено %s)" #: src/language/utilities/include.c:73 #, c-format msgid "Can't find `%s' in include file search path." msgstr "Не удалось найти `%s' в каталоге включенных файлов." #: src/language/utilities/output.c:128 #, fuzzy, c-format #| msgid "Unknown command `%s'." msgid "Unknown cell class %s." msgstr "Неизвестная команда: `%s'." #: src/language/utilities/permissions.c:113 #, c-format msgid "Cannot stat %s: %s" msgstr "Не удалось выполнить статистическую обработку %s: %s" #: src/language/utilities/permissions.c:127 #, c-format msgid "Cannot change mode of %s: %s" msgstr "Не удалось изменить режим доступа к %s: %s" #: src/language/stats/aggregate.c:96 msgid "Sum of values" msgstr "Сумма значений" #: src/language/stats/aggregate.c:97 msgid "Mean average" msgstr "Среднее" #: src/language/stats/aggregate.c:98 msgid "Median average" msgstr "Медиана" #: src/language/stats/aggregate.c:99 #: src/ui/gui/psppire-dialog-action-descriptives.c:40 #: src/ui/gui/psppire-dialog-action-frequencies.c:41 msgid "Standard deviation" msgstr "Стандартное отклонение" #: src/language/stats/aggregate.c:100 #: src/ui/gui/psppire-dialog-action-descriptives.c:42 msgid "Maximum value" msgstr "Максимальное значение" #: src/language/stats/aggregate.c:101 #: src/ui/gui/psppire-dialog-action-descriptives.c:41 msgid "Minimum value" msgstr "Минимальное значение" #: src/language/stats/aggregate.c:102 msgid "Percentage greater than" msgstr "Процент выше чем" #: src/language/stats/aggregate.c:103 msgid "Percentage less than" msgstr "Процент, ниже чем" #: src/language/stats/aggregate.c:104 msgid "Percentage included in range" msgstr "Процент для включения в диапазон" #: src/language/stats/aggregate.c:105 msgid "Percentage excluded from range" msgstr "Процент для исключения из диапазона" #: src/language/stats/aggregate.c:106 msgid "Fraction greater than" msgstr "Доля, больше" #: src/language/stats/aggregate.c:107 msgid "Fraction less than" msgstr "Доля, меньше" #: src/language/stats/aggregate.c:108 msgid "Fraction included in range" msgstr "Доля включеного в диапазон" #: src/language/stats/aggregate.c:109 msgid "Fraction excluded from range" msgstr "Доля исключенного из диапазона" #: src/language/stats/aggregate.c:110 msgid "Number of cases" msgstr "Количество наблюдений" #: src/language/stats/aggregate.c:111 msgid "Number of cases (unweighted)" msgstr "Количество наблюдений (невзвешенных)" #: src/language/stats/aggregate.c:112 msgid "Number of missing values" msgstr "Количество пропущенных значений" #: src/language/stats/aggregate.c:113 msgid "Number of missing values (unweighted)" msgstr "Количество пропущенных значений (невзвешенных)" #: src/language/stats/aggregate.c:114 msgid "First non-missing value" msgstr "Первое непропущенное значение" #: src/language/stats/aggregate.c:115 msgid "Last non-missing value" msgstr "Последнее непропущенное значение" #: src/language/stats/aggregate.c:258 msgid "" "When PRESORTED is specified, specifying sorting directions with (A) or (D) " "has no effect. Output data will be sorted the same way as the input data." msgstr "" "Если указано PRESORTED, определение порядка с помощью (A) или (D) не " "приведет ни к каким последствиям. Выведенные данные будут упорядочены тем же " "способом, что и входные данные." #: src/language/stats/aggregate.c:448 msgid "expecting aggregation function" msgstr "должна быть указана функция агрегирования" #: src/language/stats/aggregate.c:460 #, c-format msgid "Unknown aggregation function %s." msgstr "Неизвестная функция агрегирования %s." #: src/language/stats/aggregate.c:513 #, c-format msgid "Missing argument %zu to %s." msgstr "Пропущен аргумент %zu функции %s." #: src/language/stats/aggregate.c:522 #, c-format msgid "Arguments to %s must be of same type as source variables." msgstr "" "Аргументы %s должны принадлежать к тому же типу, что и начальные переменные." #: src/language/stats/aggregate.c:541 #, c-format msgid "" "Number of source variables (%zu) does not match number of target variables " "(%zu)." msgstr "" "Количество переменных в источнике (%zu) не совпадает с количеством " "переменных назначения (%zu)." #: src/language/stats/aggregate.c:557 #, c-format msgid "" "The value arguments passed to the %s function are out-of-order. They will " "be treated as if they had been specified in the correct order." msgstr "" "Значения параметров, которые участвуют в функции %s, не упорядочены. " "Обработка будет осуществлена так, как будто параметры были указаны в " "надлежащем порядке." #: src/language/stats/aggregate.c:631 #, c-format msgid "" "Variable name %s is not unique within the aggregate file dictionary, which " "contains the aggregate variables and the break variables." msgstr "" "Название переменной %s, не является уникальным в пределах словаря для " "агрегирования, в котором содержатся переменные для агрегирования и " "переменные разбиения." #: src/language/stats/autorecode.c:152 #, c-format msgid "Source variable count (%zu) does not match target variable count (%zu)." msgstr "" "Количество исходных переменных (%zu) не совпадает с количеством переменных " "назначения (%zu)." #: src/language/stats/autorecode.c:164 #, c-format msgid "Target variable %s duplicates existing variable %s." msgstr "Переменная назначения %s дублирует уже созданную переменную %s." #: src/language/stats/autorecode.c:221 #, c-format msgid "" "With GROUP, variables may not mix string variables (such as %s) and numeric " "variables (such as %s)." msgstr "" #: src/language/stats/autorecode.c:363 #, fuzzy #| msgid "Recode into Same Variables" msgid "Recoding grouped variables." msgstr "Перекодировать в тех же самых переменных" #: src/language/stats/autorecode.c:365 #, fuzzy, c-format #| msgid "Replacing %s by %s: %s." msgid "Recoding %s into %s (%s)." msgstr "Заменяем %s на %s: %s." #: src/language/stats/autorecode.c:369 #, fuzzy, c-format #| msgid "Removing %s: %s." msgid "Recoding %s into %s." msgstr "Изымаем %s: %s." #: src/language/stats/autorecode.c:376 src/ui/gui/recode.ui:209 msgid "New Value" msgstr "Новое значение" #: src/language/stats/autorecode.c:376 msgid "Value Label" msgstr "Метка значения" #: src/language/stats/autorecode.c:379 msgid "Old Value" msgstr "Предыдущее значение" #: src/language/stats/binomial.c:138 #, c-format msgid "Variable %s is not dichotomous" msgstr "Переменная %s не является дихотомичной" #: src/language/stats/binomial.c:182 src/ui/gui/binomial.ui:30 msgid "Binomial Test" msgstr "Биноминальная проверка" #: src/language/stats/binomial.c:186 src/language/stats/chisquare.c:183 #: src/language/stats/chisquare.c:239 src/language/stats/chisquare.c:322 #: src/language/stats/cochran.c:188 src/language/stats/correlations.c:94 #: src/language/stats/correlations.c:145 src/language/stats/descriptives.c:991 #: src/language/stats/examine.c:602 src/language/stats/examine.c:742 #: src/language/stats/examine.c:836 src/language/stats/examine.c:925 #: src/language/stats/factor.c:1755 src/language/stats/factor.c:1878 #: src/language/stats/factor.c:1908 src/language/stats/factor.c:2068 #: src/language/stats/factor.c:2102 src/language/stats/frequencies.c:302 #: src/language/stats/frequencies.c:1579 src/language/stats/frequencies.c:1586 #: src/language/stats/friedman.c:250 src/language/stats/glm.c:729 #: src/language/stats/kruskal-wallis.c:249 #: src/language/stats/kruskal-wallis.c:297 #: src/language/stats/ks-one-sample.c:278 src/language/stats/logistic.c:1170 #: src/language/stats/logistic.c:1300 src/language/stats/logistic.c:1330 #: src/language/stats/jonckheere-terpstra.c:361 #: src/language/stats/mann-whitney.c:184 src/language/stats/mann-whitney.c:247 #: src/language/stats/means.c:757 src/language/stats/means.c:811 #: src/language/stats/mcnemar.c:222 src/language/stats/median.c:315 #: src/language/stats/median.c:350 src/language/stats/npar-summary.c:106 #: src/language/stats/oneway.c:973 src/language/stats/oneway.c:1051 #: src/language/stats/oneway.c:1150 src/language/stats/oneway.c:1238 #: src/language/stats/oneway.c:1373 src/language/stats/quick-cluster.c:746 #: src/language/stats/reliability.c:543 src/language/stats/reliability.c:584 #: src/language/stats/reliability.c:633 src/language/stats/reliability.c:644 #: src/language/stats/roc.c:969 src/language/stats/roc.c:1067 #: src/language/stats/regression.c:867 src/language/stats/regression.c:899 #: src/language/stats/regression.c:1023 src/language/stats/regression.c:1089 #: src/language/stats/runs.c:318 src/language/stats/sign.c:102 #: src/language/stats/t-test-indep.c:193 src/language/stats/t-test-indep.c:259 #: src/language/stats/t-test-one-sample.c:68 #: src/language/stats/t-test-one-sample.c:125 #: src/language/stats/t-test-paired.c:150 #: src/language/stats/t-test-paired.c:193 #: src/language/stats/t-test-paired.c:238 src/language/stats/wilcoxon.c:243 #: src/language/stats/wilcoxon.c:282 src/language/stats/crosstabs.q:925 #: src/language/stats/crosstabs.q:1253 src/language/stats/crosstabs.q:1293 #: src/language/stats/crosstabs.q:1302 src/language/stats/crosstabs.q:1331 #: src/language/stats/crosstabs.q:1373 src/language/stats/crosstabs.q:1418 #: src/ui/gui/crosstabs.ui:499 src/ui/gui/oneway.ui:615 msgid "Statistics" msgstr "Статистика" #: src/language/stats/binomial.c:187 src/language/stats/chisquare.c:240 #: src/language/stats/chisquare.c:252 msgid "Category" msgstr "Категория" #: src/language/stats/binomial.c:188 src/language/stats/cochran.c:189 #: src/language/stats/correlations.c:97 src/language/stats/correlations.c:155 #: src/language/stats/descriptives.c:993 src/language/stats/examine.c:926 #: src/language/stats/frequencies.c:1588 src/language/stats/friedman.c:251 #: src/language/stats/kruskal-wallis.c:250 #: src/language/stats/ks-one-sample.c:279 src/language/stats/logistic.c:1331 #: src/language/stats/jonckheere-terpstra.c:369 #: src/language/stats/mann-whitney.c:185 src/language/stats/means.c:710 #: src/language/stats/means-calc.c:439 src/language/stats/mcnemar.c:223 #: src/language/stats/median.c:351 src/language/stats/npar-summary.c:107 #: src/language/stats/oneway.c:1052 src/language/stats/reliability.c:544 #: src/language/stats/sign.c:69 src/language/stats/sign.c:70 #: src/language/stats/t-test-indep.c:194 #: src/language/stats/t-test-one-sample.c:126 #: src/language/stats/t-test-paired.c:151 #: src/language/stats/t-test-paired.c:194 src/language/stats/wilcoxon.c:244 #: src/language/stats/crosstabs.q:926 msgid "N" msgstr "N" #: src/language/stats/binomial.c:189 msgid "Observed Prop." msgstr "Наблюдается предложение." #: src/language/stats/binomial.c:190 msgid "Test Prop." msgstr "Тестирование предложения." #: src/language/stats/binomial.c:192 src/language/stats/mcnemar.c:224 #: src/language/stats/sign.c:103 src/language/stats/wilcoxon.c:288 #: src/language/stats/crosstabs.q:1306 msgid "Exact Sig. (2-tailed)" msgstr "Точная значимость (двусторонняя)" #: src/language/stats/binomial.c:193 src/language/stats/mcnemar.c:225 #: src/language/stats/sign.c:104 src/language/stats/wilcoxon.c:289 #: src/language/stats/crosstabs.q:1307 msgid "Exact Sig. (1-tailed)" msgstr "Точная значимость (односторонняя)" #: src/language/stats/binomial.c:195 #, fuzzy #| msgid "Group1" msgid "Groups" msgstr "Группа1" #: src/language/stats/binomial.c:196 #, fuzzy #| msgid "Group1" msgid "Group 1" msgstr "Группа1" #: src/language/stats/binomial.c:196 #, fuzzy #| msgid "Group2" msgid "Group 2" msgstr "Група2" #: src/language/stats/binomial.c:196 src/language/stats/chisquare.c:223 #: src/language/stats/chisquare.c:257 src/language/stats/examine.c:930 #: src/language/stats/factor.c:1756 src/language/stats/frequencies.c:344 #: src/language/stats/glm.c:811 src/language/stats/kruskal-wallis.c:285 #: src/language/stats/logistic.c:1336 src/language/stats/mann-whitney.c:197 #: src/language/stats/means.c:706 src/language/stats/oneway.c:982 #: src/language/stats/oneway.c:1072 src/language/stats/reliability.c:549 #: src/language/stats/regression.c:1031 src/language/stats/sign.c:75 #: src/language/stats/wilcoxon.c:250 #: src/ui/gui/psppire-dialog-action-crosstabs.c:93 #: src/language/stats/crosstabs.q:931 src/language/stats/crosstabs.q:1218 msgid "Total" msgstr "Итого" #: src/language/stats/chisquare.c:171 #, fuzzy, c-format #| msgid "" #| "CHISQUARE test specified %d expected values, but %d distinct values were " #| "encountered in variable %s." msgid "" "CHISQUARE test specified %d expected values, but variable %s has %zu " "distinct values." msgstr "" "Проверка CHISQUARE определила %d ожидаемых значений, но было выявлено %d " "различных значений в переменной %s." #: src/language/stats/chisquare.c:184 src/language/stats/chisquare.c:241 msgid "Observed N" msgstr "N из наблюдений" #: src/language/stats/chisquare.c:185 src/language/stats/chisquare.c:242 msgid "Expected N" msgstr "Ожидаемое N" #: src/language/stats/chisquare.c:186 src/language/stats/chisquare.c:243 #: src/language/stats/regression.c:1031 #: src/ui/gui/psppire-dialog-action-crosstabs.c:95 #: src/language/stats/crosstabs.q:1267 msgid "Residual" msgstr "Остатки" #: src/language/stats/chisquare.c:235 src/language/stats/cochran.c:150 #: src/language/stats/median.c:305 src/language/stats/sign.c:66 #: src/ui/gui/frequencies.ui:676 msgid "Frequencies" msgstr "Частоты" #: src/language/stats/chisquare.c:320 src/language/stats/cochran.c:181 #: src/language/stats/friedman.c:246 src/language/stats/kruskal-wallis.c:295 #: src/language/stats/mann-whitney.c:244 src/language/stats/mcnemar.c:219 #: src/language/stats/median.c:347 src/language/stats/sign.c:100 #: src/language/stats/wilcoxon.c:279 msgid "Test Statistics" msgstr "Критерии проверки" #: src/language/stats/chisquare.c:323 #, fuzzy #| msgid "Chi-Square" msgid "Chi-square" msgstr "χ-квадрат" #: src/language/stats/chisquare.c:324 src/language/stats/cochran.c:191 #: src/language/stats/examine.c:675 src/language/stats/factor.c:2107 #: src/language/stats/friedman.c:257 src/language/stats/glm.c:733 #: src/language/stats/kruskal-wallis.c:299 src/language/stats/logistic.c:1174 #: src/language/stats/median.c:354 src/language/stats/oneway.c:975 #: src/language/stats/oneway.c:1242 src/language/stats/regression.c:1025 #: src/language/stats/t-test-indep.c:267 #: src/language/stats/t-test-one-sample.c:75 #: src/language/stats/t-test-paired.c:253 src/language/stats/crosstabs.q:1304 msgid "df" msgstr "df" #: src/language/stats/chisquare.c:325 src/language/stats/cochran.c:192 #: src/language/stats/friedman.c:258 src/language/stats/kruskal-wallis.c:300 #: src/language/stats/median.c:355 msgid "Asymp. Sig." msgstr "Асимпт. знач." #: src/language/stats/cochran.c:111 msgid "More than two values encountered. Cochran Q test will not be run." msgstr "" "Обнаружено свыше двух значений. Проверка Q Кохрена не будет запускаться." #: src/language/stats/cochran.c:153 #, c-format msgid "Success (%.*g)" msgstr "Успех (%.*g)" #: src/language/stats/cochran.c:154 #, c-format msgid "Failure (%.*g)" msgstr "Ошибка (%.*g)" #: src/language/stats/cochran.c:190 msgid "Cochran's Q" msgstr "Q Кохрена" #: src/language/stats/correlations.c:91 src/language/stats/descriptives.c:987 #: src/language/stats/factor.c:2065 src/language/stats/npar-summary.c:102 msgid "Descriptive Statistics" msgstr "Описательные статистики" #: src/language/stats/correlations.c:95 src/language/stats/descriptives.c:108 #: src/language/stats/examine.c:742 src/language/stats/factor.c:2069 #: src/language/stats/frequencies.c:141 src/language/stats/graph.c:211 #: src/language/stats/ks-one-sample.c:290 src/language/stats/means-calc.c:438 #: src/language/stats/npar-summary.c:108 src/language/stats/oneway.c:1052 #: src/language/stats/t-test-indep.c:195 #: src/language/stats/t-test-one-sample.c:127 #: src/language/stats/t-test-paired.c:152 #: src/language/stats/t-test-paired.c:241 #: src/ui/gui/psppire-dialog-action-descriptives.c:39 #: src/ui/gui/psppire-dialog-action-frequencies.c:40 msgid "Mean" msgstr "Среднее" #: src/language/stats/correlations.c:96 src/language/stats/examine.c:751 #: src/language/stats/factor.c:2070 src/language/stats/ks-one-sample.c:290 #: src/language/stats/means-calc.c:440 src/language/stats/npar-summary.c:109 #: src/language/stats/oneway.c:1052 src/language/stats/t-test-indep.c:196 #: src/language/stats/t-test-one-sample.c:128 #: src/language/stats/t-test-paired.c:153 #: src/language/stats/t-test-paired.c:242 msgid "Std. Deviation" msgstr "Станд. отклонение" #: src/language/stats/correlations.c:126 msgid "Correlations" msgstr "Корреляции" #: src/language/stats/correlations.c:146 msgid "Pearson Correlation" msgstr "Корреляция Пирсона" #: src/language/stats/correlations.c:147 src/language/stats/oneway.c:1243 #: src/language/stats/t-test-indep.c:268 #: src/language/stats/t-test-one-sample.c:76 #: src/language/stats/t-test-paired.c:254 msgid "Sig. (2-tailed)" msgstr "Знач. (двустороннее)" #: src/language/stats/correlations.c:147 src/language/stats/factor.c:1913 msgid "Sig. (1-tailed)" msgstr "Знач. (одностороннее)" #: src/language/stats/correlations.c:151 msgid "Cross-products" msgstr "Кросс-продукты" #: src/language/stats/correlations.c:152 msgid "Covariance" msgstr "Ковариация" #: src/language/stats/correlations.c:165 #, fuzzy #| msgid "Significance" msgid "Significant at .05 level" msgstr "Значимость" #: src/language/stats/correlations.c:234 msgid "The data for the chosen variables are all missing or empty." msgstr "" #: src/language/stats/correlations.c:390 src/language/stats/descriptives.c:368 #: src/language/data-io/list.c:166 msgid "No variables specified." msgstr "Не указаны переменные." #: src/language/stats/descriptives.c:109 src/language/stats/frequencies.c:142 #: src/language/stats/means-calc.c:445 src/language/stats/t-test-indep.c:197 #: src/language/stats/t-test-one-sample.c:129 #: src/language/stats/t-test-paired.c:154 #: src/language/stats/t-test-paired.c:243 msgid "S.E. Mean" msgstr "Стандартная ошибка среднего значения." #: src/language/stats/descriptives.c:110 src/language/stats/frequencies.c:145 msgid "Std Dev" msgstr "Станд. отклон." #: src/language/stats/descriptives.c:111 src/language/stats/examine.c:750 #: src/language/stats/frequencies.c:146 src/language/stats/means-calc.c:450 #: src/ui/gui/psppire-dialog-action-descriptives.c:46 #: src/ui/gui/psppire-dialog-action-frequencies.c:45 msgid "Variance" msgstr "Рассеивание" #: src/language/stats/descriptives.c:112 src/language/stats/examine.c:752 #: src/language/stats/frequencies.c:147 src/language/stats/means-calc.c:451 #: src/ui/gui/psppire-dialog-action-descriptives.c:47 #: src/ui/gui/psppire-dialog-action-frequencies.c:50 msgid "Kurtosis" msgstr "Эксцесс" #: src/language/stats/descriptives.c:113 src/language/stats/frequencies.c:148 #: src/language/stats/means-calc.c:452 msgid "S.E. Kurt" msgstr "Стандартная ошибка эксцесса." #: src/language/stats/descriptives.c:114 src/language/stats/examine.c:752 #: src/language/stats/frequencies.c:149 src/language/stats/means-calc.c:453 #: src/ui/gui/psppire-dialog-action-descriptives.c:48 #: src/ui/gui/psppire-dialog-action-frequencies.c:46 msgid "Skewness" msgstr "Асимметрия" #: src/language/stats/descriptives.c:115 src/language/stats/frequencies.c:150 #: src/language/stats/means-calc.c:454 msgid "S.E. Skew" msgstr "Стандартная ошибка асимметрии." #: src/language/stats/descriptives.c:116 src/language/stats/examine.c:751 #: src/language/stats/frequencies.c:151 src/language/stats/means-calc.c:449 #: src/ui/gui/psppire-dialog-action-descriptives.c:43 #: src/ui/gui/psppire-dialog-action-frequencies.c:48 msgid "Range" msgstr "Диапазон" #: src/language/stats/descriptives.c:117 src/language/stats/examine.c:751 #: src/language/stats/frequencies.c:152 src/language/stats/graph.c:214 #: src/language/stats/ks-one-sample.c:285 src/language/stats/means-calc.c:447 #: src/language/stats/npar-summary.c:110 src/language/stats/oneway.c:1061 #: src/ui/gui/psppire-dialog-action-descriptives.c:41 #: src/ui/gui/psppire-dialog-action-frequencies.c:42 msgid "Minimum" msgstr "Минимум" #: src/language/stats/descriptives.c:118 src/language/stats/examine.c:751 #: src/language/stats/frequencies.c:153 src/language/stats/graph.c:213 #: src/language/stats/ks-one-sample.c:285 src/language/stats/means-calc.c:448 #: src/language/stats/npar-summary.c:110 src/language/stats/oneway.c:1061 #: src/ui/gui/psppire-dialog-action-descriptives.c:42 #: src/ui/gui/psppire-dialog-action-frequencies.c:43 msgid "Maximum" msgstr "Максимум" #: src/language/stats/descriptives.c:119 src/language/stats/frequencies.c:154 #: src/language/stats/graph.c:212 src/language/stats/means-calc.c:446 #: src/ui/gui/psppire-dialog-action-descriptives.c:44 #: src/ui/gui/psppire-dialog-action-frequencies.c:53 msgid "Sum" msgstr "Сумма" #: src/language/stats/descriptives.c:350 #, c-format msgid "Z-score variable name %s would be a duplicate variable name." msgstr "Имя переменной Z-оценки %s будет дубликатом названия переменной." #: src/language/stats/descriptives.c:401 msgid "" "DESCRIPTIVES with Z scores ignores TEMPORARY. Temporary transformations " "will be made permanent." msgstr "" "DESCRIPTIVES с Z оценками игнорирует TEMPORARY. Временные преобразования " "преобразуются в постоянные." #: src/language/stats/descriptives.c:478 msgid "expecting statistic name: reverting to default" msgstr "неожиданное название статистики: возвращаемся к типовому названию" #: src/language/stats/descriptives.c:561 msgid "" "Ran out of generic names for Z-score variables. There are only 126 generic " "names: ZSC001-ZSC0999, STDZ01-STDZ09, ZZZZ01-ZZZZ09, ZQZQ01-ZQZQ09." msgstr "" "Исчерпан диапазон типовых названий переменных для Z-оценок. Предусмотрено " "только 126 типовых названий: ZSC001-ZSC0999, STDZ01-STDZ09, ZZZZ01-ZZZZ09, " "ZQZQ01-ZQZQ09." #: src/language/stats/descriptives.c:579 #, fuzzy #| msgid "Mapping of variables to corresponding Z-scores." msgid "Mapping of Variables to Z-scores" msgstr "Привязка переменных к соответствующим Z-оценкам." #: src/language/stats/descriptives.c:581 #, fuzzy #| msgid "Name" msgid "Names" msgstr "Название" #: src/language/stats/descriptives.c:582 src/language/stats/glm.c:739 #: src/language/stats/regression.c:1030 msgid "Source" msgstr "Источник" #: src/language/stats/descriptives.c:582 msgid "Target" msgstr "Назначение" #: src/language/stats/descriptives.c:659 #, fuzzy, c-format #| msgid "Internal error processing Z scores" msgid "Internal error processing Z scores. Please report this to %s." msgstr "Внутренняя ошибка во время обработки Z-оценок" #: src/language/stats/descriptives.c:759 #, c-format msgid "Z-score of %s" msgstr "Z-оценка %s" #: src/language/stats/descriptives.c:1028 src/language/stats/roc.c:1029 msgid "Valid N (listwise)" msgstr "Кол-во корректных (в целом)" #: src/language/stats/descriptives.c:1028 #, fuzzy #| msgid "Valid N (listwise)" msgid "Missing N (listwise)" msgstr "Кол-во корректных (в целом)" #: src/language/stats/examine.c:75 msgid " (missing)" msgstr " (потеряно)" #: src/language/stats/examine.c:225 #, c-format msgid "Boxplot of %s vs. %s" msgstr "Блочная диаграмма %s от %s" #: src/language/stats/examine.c:231 src/language/stats/examine.c:338 #, c-format msgid "Boxplot of %s" msgstr "Блочная диаграмма %s" #: src/language/stats/examine.c:321 msgid "Boxplot" msgstr "Блочная диаграмма" #: src/language/stats/examine.c:418 msgid "Not creating NP plot because data set is empty." msgstr "Чертежей NP не создано, поскольку набор данных является пустым." #: src/language/stats/examine.c:478 #, c-format msgid "Not creating spreadlevel chart for %s" msgstr "Диаграмма рассеивания по уровням для %s не создана" #: src/language/stats/examine.c:585 #, fuzzy #| msgid "Last non-missing value" msgid "User-missing value." msgstr "Последнее непропущенное значение" #: src/language/stats/examine.c:591 src/language/stats/examine.c:595 #: src/language/stats/frequencies.c:1606 msgid "Percentiles" msgstr "Процентили" #: src/language/stats/examine.c:603 src/math/percentiles.c:37 msgid "Weighted Average" msgstr "Взвешенное среднее" #: src/language/stats/examine.c:603 msgid "Tukey's Hinges" msgstr "Угловые точки Туки" #: src/language/stats/examine.c:610 src/language/stats/examine.c:685 #: src/language/stats/examine.c:759 src/language/stats/examine.c:858 #: src/language/stats/examine.c:938 src/language/stats/mann-whitney.c:200 #: src/language/stats/median.c:319 src/language/stats/t-test-indep.c:227 #: src/language/stats/t-test-indep.c:282 #: src/language/stats/t-test-one-sample.c:87 #, fuzzy #| msgid "_Dependent Variable" msgid "Dependent Variables" msgstr "Зависимая переменная" #: src/language/stats/examine.c:669 #, fuzzy #| msgid "Dev from Normal" msgid "Tests of Normality" msgstr "Откл. от нормы" #: src/language/stats/examine.c:673 msgid "Shapiro-Wilk" msgstr "" #: src/language/stats/examine.c:674 src/language/stats/examine.c:739 #: src/ui/gui/psppire-checkbox-treeview.c:73 msgid "Statistic" msgstr "Статистика" #: src/language/stats/examine.c:676 src/language/stats/factor.c:2108 #: src/language/stats/glm.c:736 src/language/stats/logistic.c:1175 #: src/language/stats/oneway.c:978 src/language/stats/oneway.c:1154 #: src/language/stats/oneway.c:1376 src/language/stats/regression.c:906 #: src/language/stats/regression.c:1028 src/language/stats/t-test-indep.c:263 #: src/language/stats/t-test-paired.c:196 msgid "Sig." msgstr "Знач." #: src/language/stats/examine.c:735 src/language/stats/oneway.c:1045 #: src/ui/gui/descriptives.ui:25 msgid "Descriptives" msgstr "Описательные статистики" #: src/language/stats/examine.c:738 msgid "Aspect" msgstr "" #: src/language/stats/examine.c:739 src/language/stats/oneway.c:1053 #: src/language/stats/oneway.c:1240 src/language/stats/oneway.c:1375 #: src/language/stats/roc.c:975 src/language/stats/regression.c:902 msgid "Std. Error" msgstr "Станд. погрешность" #: src/language/stats/examine.c:745 src/language/stats/oneway.c:1056 #, c-format msgid "%g%% Confidence Interval for Mean" msgstr "%g%%-ый доверительный интервал для среднего" #: src/language/stats/examine.c:747 src/language/stats/oneway.c:1058 #: src/language/stats/oneway.c:1382 src/language/stats/roc.c:982 #: src/language/stats/regression.c:913 msgid "Lower Bound" msgstr "Нижняя граница" #: src/language/stats/examine.c:748 src/language/stats/oneway.c:1059 #: src/language/stats/oneway.c:1383 src/language/stats/roc.c:983 #: src/language/stats/regression.c:914 msgid "Upper Bound" msgstr "Верхняя граница" #: src/language/stats/examine.c:750 msgid "5% Trimmed Mean" msgstr "5% обрезанное среднее" #: src/language/stats/examine.c:750 src/language/stats/frequencies.c:143 #: src/language/stats/means-calc.c:442 src/language/stats/median.c:352 #: src/ui/gui/psppire-dialog-action-frequencies.c:52 msgid "Median" msgstr "Медиана" #: src/language/stats/examine.c:752 msgid "Interquartile Range" msgstr "Межквартильний диапазон" #: src/language/stats/examine.c:832 msgid "Extreme Values" msgstr "Экстремумы" #: src/language/stats/examine.c:840 src/language/stats/quick-cluster.c:664 #: src/language/data-io/list.c:110 msgid "Case Number" msgstr "Номер наблюдения" #: src/language/stats/examine.c:844 #, fuzzy #| msgid "Order by" msgid "Order" msgstr "Критерий сортировки" #. TRANSLATORS: This is a noun, not an adjective. #: src/language/stats/examine.c:850 #, fuzzy #| msgid "_Extremes" msgid "Extreme" msgstr "_Экстремальные значения" #: src/language/stats/examine.c:851 msgid "Highest" msgstr "Самый высокий" #: src/language/stats/examine.c:851 msgid "Lowest" msgstr "Самый низкий" #: src/language/stats/examine.c:921 src/language/stats/logistic.c:1328 #: src/language/stats/means.c:694 src/language/stats/reliability.c:540 msgid "Case Processing Summary" msgstr "Резюме обработки наблюдений" #: src/language/stats/examine.c:927 src/language/stats/frequencies.c:304 #: src/language/stats/frequencies.c:1494 src/language/stats/logistic.c:1332 #: src/language/stats/means.c:713 src/language/stats/reliability.c:545 #: src/language/stats/crosstabs.q:927 msgid "Percent" msgstr "Процент" #: src/language/stats/examine.c:929 src/language/stats/frequencies.c:321 #: src/language/stats/frequencies.c:1590 src/language/stats/quick-cluster.c:766 #: src/language/stats/reliability.c:548 src/language/stats/crosstabs.q:931 msgid "Valid" msgstr "Действующий" #: src/language/stats/examine.c:929 src/language/stats/frequencies.c:336 #: src/language/stats/frequencies.c:1591 src/language/stats/crosstabs.q:931 msgid "Missing" msgstr "Потеряно" #: src/language/stats/examine.c:1550 #, c-format msgid "%s may not be negative. Using default value (%g)." msgstr "%s не может быть отрицательным. Используем типовое значение (%g)." #: src/language/stats/examine.c:1587 msgid "Percentiles must lie in the range (0, 100)" msgstr "Процентили должны принадлежать диапазону (0, 100)" #: src/language/stats/examine.c:1777 #, c-format msgid "%s and %s are mutually exclusive" msgstr "%s и %s являются взаимоисключающими" #: src/language/stats/factor.c:1121 #, c-format msgid "Matrix input for %s must be either COV or CORR" msgstr "" #: src/language/stats/factor.c:1519 msgid "Factor analysis on a single variable is not useful." msgstr "Факторный анализ одной переменной лишен смысла." #: src/language/stats/factor.c:1523 #, fuzzy #| msgid "Factor analysis on a single variable is not useful." msgid "Factor analysis without variables is not possible." msgstr "Факторный анализ одной переменной лишен смысла." #: src/language/stats/factor.c:1634 msgid "Component Number" msgstr "Количество компонент" #: src/language/stats/factor.c:1634 msgid "Factor Number" msgstr "Номер фактора" #: src/language/stats/factor.c:1648 src/language/stats/factor.c:1651 msgid "Communalities" msgstr "Общности" #: src/language/stats/factor.c:1653 msgid "Initial" msgstr "Начальный" #: src/language/stats/factor.c:1655 msgid "Extraction" msgstr "Извлечение" #: src/language/stats/factor.c:1697 src/language/stats/factor.c:1777 #: src/language/stats/factor.c:1839 msgid "Component" msgstr "Компонент" #: src/language/stats/factor.c:1697 src/language/stats/factor.c:1777 #: src/language/stats/factor.c:1839 msgid "Factor" msgstr "Фактор" #: src/language/stats/factor.c:1752 msgid "Total Variance Explained" msgstr "Распределение совокупной дисперсии" #: src/language/stats/factor.c:1758 #, no-c-format msgid "% of Variance" msgstr "% дисперсии" #: src/language/stats/factor.c:1760 #, no-c-format msgid "Cumulative %" msgstr "Накопительный процент" #: src/language/stats/factor.c:1763 msgid "Phase" msgstr "" #: src/language/stats/factor.c:1765 msgid "Initial Eigenvalues" msgstr "Исходные собственные значения" #: src/language/stats/factor.c:1769 msgid "Extraction Sums of Squared Loadings" msgstr "Извлечения суммы квадратов нагрузок" #: src/language/stats/factor.c:1773 msgid "Rotation Sums of Squared Loadings" msgstr "Суммы квадратов нагрузок вращения" #: src/language/stats/factor.c:1835 msgid "Factor Correlation Matrix" msgstr "Матрица корреляций факторов" #: src/language/stats/factor.c:1842 #, fuzzy #| msgid "Factor" msgid "Factor 2" msgstr "Фактор" #: src/language/stats/factor.c:1874 msgid "Anti-Image Matrices" msgstr "" #: src/language/stats/factor.c:1879 #, fuzzy #| msgid "Covariance" msgid "Anti-image Covariance" msgstr "Ковариация" #: src/language/stats/factor.c:1880 #, fuzzy #| msgid "Bivariate Correlations" msgid "Anti-image Correlation" msgstr "Двумерная корреляция" #: src/language/stats/factor.c:1901 msgid "Correlation Matrix" msgstr "Матрица корреляций" #: src/language/stats/factor.c:1910 src/language/stats/t-test-paired.c:195 msgid "Correlation" msgstr "Корреляция" #: src/language/stats/factor.c:1947 msgid "Determinant" msgstr "Определитель" #: src/language/stats/factor.c:1958 #, fuzzy #| msgid "Co_variance matrix" msgid "Covariance Matrix" msgstr "_Ковариационная матрица" #: src/language/stats/factor.c:1990 msgid "" "The dataset contains no complete observations. No analysis will be performed." msgstr "" "В наборе данных не содержится полных наблюдений. Анализ выполнен не будет." #: src/language/stats/factor.c:2014 msgid "The dataset has no complete covariance or correlation matrix." msgstr "" #: src/language/stats/factor.c:2071 msgid "Analysis N" msgstr "N в анализе" #: src/language/stats/factor.c:2099 msgid "KMO and Bartlett's Test" msgstr "Проверка КМО и Бартлета" #: src/language/stats/factor.c:2103 msgid "Kaiser-Meyer-Olkin Measure of Sampling Adequacy" msgstr "Шкала Кайзера-Мейера-Олкена адекватности разделения выборки на" #: src/language/stats/factor.c:2105 msgid "Bartlett's Test of Sphericity" msgstr "Проверка сферичности Бартлета" #: src/language/stats/factor.c:2106 msgid "Approx. Chi-Square" msgstr "Приблизительный χ-квадрат" #: src/language/stats/factor.c:2154 #, c-format msgid "" "The %s criteria result in zero factors extracted. Therefore no analysis will " "be performed." msgstr "" "Критерий, использованный в %s, привел к извлечению нулевого количества " "факторов. Следовательно, выполнять анализ нет смысла." #: src/language/stats/factor.c:2161 #, c-format msgid "" "The %s criteria result in more factors than variables, which is not " "meaningful. No analysis will be performed." msgstr "" "Критерий, использованный в %s, привел к извлечению количества факторов, что " "превышает количество переменных. Следовательно, выполнять анализ нет смысла." #: src/language/stats/factor.c:2254 msgid "Component Matrix" msgstr "Матрица компонентов" #: src/language/stats/factor.c:2254 msgid "Factor Matrix" msgstr "Матрица факторов" #: src/language/stats/factor.c:2259 msgid "Pattern Matrix" msgstr "Матрица образцов" #: src/language/stats/factor.c:2268 msgid "Structure Matrix" msgstr "Матрица структуры" #: src/language/stats/factor.c:2270 msgid "Rotated Component Matrix" msgstr "Обернута матрица компонентов" #: src/language/stats/factor.c:2271 msgid "Rotated Factor Matrix" msgstr "Вращение матрицы факторов" #: src/language/stats/flip.c:100 #, c-format msgid "%s ignores %s. Temporary transformations will be made permanent." msgstr "" "%s игнорирует %s. Временные преобразования преобразуются в окончательные." #: src/language/stats/flip.c:153 #, c-format msgid "Could not create temporary file for %s." msgstr "Не удалось создать временный файл для %s." #: src/language/stats/flip.c:341 #, c-format msgid "Error rewinding %s file: %s." msgstr "Ошибка во время попытки вернуться к началу файла %s: %s." #: src/language/stats/flip.c:348 #, c-format msgid "Error creating %s source file." msgstr "Ошибка при попытке создать файл исходных данных %s." #: src/language/stats/flip.c:361 #, c-format msgid "Error reading %s file: %s." msgstr "Ошибка чтения файла %s: %s." #: src/language/stats/flip.c:363 #, c-format msgid "Unexpected end of file reading %s file." msgstr "Неожиданное завершение файла во время чтения файла %s." #: src/language/stats/flip.c:379 #, c-format msgid "Error seeking %s source file: %s." msgstr "Ошибка позиционирования в файле исходных данных %s: %s." #: src/language/stats/flip.c:387 #, c-format msgid "Error writing %s source file: %s." msgstr "Ошибка при записи файла начальных данных %s: %s." #: src/language/stats/flip.c:402 #, c-format msgid "Error rewinding %s source file: %s." msgstr "Ошибка во время попытки вернуться к началу файла данных %s: %s." #: src/language/stats/flip.c:433 #, c-format msgid "Error reading %s temporary file: %s." msgstr "Ошибка при попытке чтения временного файла %s: %s." #: src/language/stats/flip.c:436 #, c-format msgid "Unexpected end of file reading %s temporary file." msgstr "Неожиданный конец файла во время чтения файла временных данных %s." #: src/language/stats/frequencies.c:144 #: src/ui/gui/psppire-dialog-action-frequencies.c:49 msgid "Mode" msgstr "Режим" #: src/language/stats/frequencies.c:303 src/language/stats/logistic.c:1381 #: src/output/charts/plot-hist-cairo.c:112 msgid "Frequency" msgstr "Частота" #: src/language/stats/frequencies.c:305 msgid "Valid Percent" msgstr "Корректный процент" #: src/language/stats/frequencies.c:306 src/language/stats/graph.c:208 #, fuzzy #| msgid "Cum Percent" msgid "Cumulative Percent" msgstr "Накоп. процент" #: src/language/stats/frequencies.c:905 msgid "Histogram frequency must be greater than zero." msgstr "Частота гистограммы должна превышать ноль." #: src/language/stats/frequencies.c:923 msgid "Histogram percentage must be greater than zero." msgstr "Процент в гистограмме должен превышать ноль." #: src/language/stats/frequencies.c:1139 #, c-format msgid "" "%s for histogram must be greater than or equal to %s, but %s was specified " "as %.15g and %s as %.15g. %s and %s will be ignored." msgstr "" "%s для гистограммы должно быть больше или равно %s, но %s была указано как " "%.15g и %s как %.15g. %s и %s будут проигнорированы." #: src/language/stats/frequencies.c:1184 #, c-format msgid "" "%s for pie chart must be greater than or equal to %s, but %s was specified " "as %.15g and %s as %.15g. %s and %s will be ignored." msgstr "" "%s для круговой диаграммы должно быть больше или равно %s, но %s была " "указано как %.15g и %s как %.15g. %s и %s будут проигнорированы." #: src/language/stats/frequencies.c:1474 #, c-format msgid "Omitting pie chart for %s, which has only %d unique values." msgstr "" "Пропускаем круговую диаграмму %s, в которой только %d уникальных значений." #: src/language/stats/frequencies.c:1477 #, c-format msgid "Omitting pie chart for %s, which has over 50 unique values." msgstr "" "Пропускаем круговую диаграмму %s, в которой более 50 уникальных значений." #: src/language/stats/frequencies.c:1494 src/language/stats/graph.c:205 #: src/language/stats/quick-cluster.c:747 #: src/ui/gui/psppire-dialog-action-crosstabs.c:90 #: src/language/stats/crosstabs.q:789 src/language/stats/crosstabs.q:1262 msgid "Count" msgstr "Количество" #: src/language/stats/friedman.c:220 src/language/stats/kruskal-wallis.c:247 #: src/language/stats/mann-whitney.c:182 src/language/stats/wilcoxon.c:240 msgid "Ranks" msgstr "Ранги" #: src/language/stats/friedman.c:222 src/language/stats/friedman.c:223 #: src/language/stats/kruskal-wallis.c:251 #: src/language/stats/mann-whitney.c:186 src/language/stats/wilcoxon.c:245 msgid "Mean Rank" msgstr "Средний ранг" #: src/language/stats/friedman.c:253 msgid "Kendall's W" msgstr "W Кендала" #: src/language/stats/friedman.c:256 src/language/stats/kruskal-wallis.c:298 #: src/language/stats/median.c:353 msgid "Chi-Square" msgstr "χ-квадрат" #: src/language/stats/glm.c:169 msgid "Multivariate analysis is not yet implemented" msgstr "Многомерный анализ еще не реализован" #: src/language/stats/glm.c:274 msgid "Only types 1, 2 & 3 sums of squares are currently implemented" msgstr "В текущей версии реализовано только типы 1, 2 и 3 сумм квадратов" #: src/language/stats/glm.c:727 msgid "Tests of Between-Subjects Effects" msgstr "Проверки межсубъективных эффектов" #: src/language/stats/glm.c:730 #, fuzzy #| msgid "Type %s Sum of Squares" msgid "Type I Sum Of Squares" msgstr "Сумма квадратов для типа %s" #: src/language/stats/glm.c:731 #, fuzzy #| msgid "Type %s Sum of Squares" msgid "Type II Sum Of Squares" msgstr "Сумма квадратов для типа %s" #: src/language/stats/glm.c:732 #, fuzzy #| msgid "Type %s Sum of Squares" msgid "Type III Sum Of Squares" msgstr "Сумма квадратов для типа %s" #: src/language/stats/glm.c:734 src/language/stats/oneway.c:976 #: src/language/stats/regression.c:1026 msgid "Mean Square" msgstr "Среднее по квадратам" #: src/language/stats/glm.c:735 src/language/stats/oneway.c:977 #: src/language/stats/regression.c:1027 src/language/stats/t-test-indep.c:262 msgid "F" msgstr "F" #: src/language/stats/glm.c:740 msgid "Corrected Model" msgstr "Исправлена модель" #: src/language/stats/glm.c:740 msgid "Model" msgstr "Модель" #: src/language/stats/glm.c:752 msgid "Intercept" msgstr "Отрезок" #: src/language/stats/glm.c:802 src/output/pivot-table.c:763 #: src/output/spv/spv.c:867 msgid "Error" msgstr "Ошибка" #: src/language/stats/glm.c:819 msgid "Corrected Total" msgstr "Всего исправленных" #: src/language/stats/graph.c:206 #, fuzzy #| msgid "_Percentages" msgid "Percentage" msgstr "_Проценты" #: src/language/stats/graph.c:207 #, fuzzy #| msgid "Cumulative %" msgid "Cumulative Count" msgstr "Накопительный процент" #: src/language/stats/graph.c:296 #, c-format msgid "%s vs. %s by %s" msgstr "%s против %s по %s" #: src/language/stats/graph.c:303 #, c-format msgid "%s vs. %s" msgstr "%s против %s" #: src/language/stats/graph.c:322 #, fuzzy #| msgid "" #| "Maximum number of scatterplot categories reached.Your BY variable has too " #| "many distinct values.The coloring of the plot will not be correct" msgid "" "Maximum number of scatterplot categories reached. Your BY variable has too " "many distinct values. The coloring of the plot will not be correct." msgstr "" "Превышено максимальное количество категорий в точечной диаграмме. Ваша " "переменная BY имеет слишком много различных значений. Раскраска диаграммы " "будет ошибочной." #: src/language/stats/graph.c:551 src/language/stats/rank.c:636 #, c-format msgid "%s of %s" msgstr "%s из %s" #: src/language/stats/graph.c:698 src/language/stats/graph.c:729 #: src/language/stats/graph.c:777 msgid "Only one chart type is allowed." msgstr "Можно использовать только один тип диаграммы." #: src/language/stats/graph.c:721 src/language/stats/graph.c:820 #: src/language/stats/graph.c:834 msgid "Only one variable is allowed." msgstr "Можно использовать только одну переменную." #: src/language/stats/graph.c:843 msgid "Variable expected" msgstr "Должна быть указана переменная" #: src/language/stats/graph.c:883 msgid "FOOTNOTE is not implemented yet for GRAPH" msgstr "FOOTNOTE еще не реализовано для GRAPH" #: src/language/stats/ks-one-sample.c:274 src/ui/gui/ks-one-sample.ui:24 msgid "One-Sample Kolmogorov-Smirnov Test" msgstr "Тест Колмогорова-Смирнова для одной выборки" #: src/language/stats/ks-one-sample.c:284 msgid "Uniform Parameters" msgstr "Параметры однородного распределения" #: src/language/stats/ks-one-sample.c:289 msgid "Normal Parameters" msgstr "Параметры нормального распределения" #: src/language/stats/ks-one-sample.c:294 msgid "Poisson Parameters" msgstr "Параметры распределения Пуассона" #: src/language/stats/ks-one-sample.c:295 #: src/ui/gui/psppire-dialog-action-crosstabs.c:76 #: src/language/stats/crosstabs.q:1421 msgid "Lambda" msgstr "Лямбда" #: src/language/stats/ks-one-sample.c:300 msgid "Exponential Parameters" msgstr "Параметры экспоненциального распределения" #: src/language/stats/ks-one-sample.c:308 msgid "Most Extreme Differences" msgstr "Наибольшие разницы" #: src/language/stats/ks-one-sample.c:309 msgid "Absolute" msgstr "Абсолютная" #: src/language/stats/ks-one-sample.c:309 src/language/stats/roc.c:1037 msgid "Positive" msgstr "Положительная" #: src/language/stats/ks-one-sample.c:309 src/language/stats/roc.c:1037 msgid "Negative" msgstr "Отрицательная" #: src/language/stats/ks-one-sample.c:312 msgid "Kolmogorov-Smirnov Z" msgstr "Колмогорова-Смирнова (Z)" #: src/language/stats/ks-one-sample.c:313 #: src/language/stats/jonckheere-terpstra.c:374 #: src/language/stats/mann-whitney.c:251 src/language/stats/runs.c:328 #: src/language/stats/wilcoxon.c:284 msgid "Asymp. Sig. (2-tailed)" msgstr "Асимпт. знач. (двусторонние)" #: src/language/stats/logistic.c:327 msgid "All predicted values are either 1 or 0" msgstr "Все предусмотренные значения: 1 или 0" #: src/language/stats/logistic.c:525 msgid "Dependent variable's values are not dichotomous." msgstr "Значение зависимой переменной не является дихотомичными." #: src/language/stats/logistic.c:614 #, c-format msgid "" "Category %s does not have at least two distinct values. Logistic regression " "will not be run." msgstr "" "В категории %s не содержится по крайней мере два различных значения. " "Логистическая регрессия не будет выполнена." #: src/language/stats/logistic.c:674 #, c-format msgid "" "Estimation terminated at iteration number %d because parameter estimates " "changed by less than %g" msgstr "" "Оценивание прервано на итерации %d, поскольку оценка параметра изменилась " "менее, чем на %g" #: src/language/stats/logistic.c:686 #, c-format msgid "" "Estimation terminated at iteration number %d because Log Likelihood " "decreased by less than %g%%" msgstr "" "Оценивание прервано на итерации %d, поскольку log-правдоподобие уменьшилась " "меньше, чем на %g%%" #: src/language/stats/logistic.c:701 #, c-format msgid "" "Estimation terminated at iteration number %d because maximum iterations has " "been reached" msgstr "" "Оценивание было прервано на итерации %d, поскольку было достигнуто " "максимальное количество итераций" #: src/language/stats/logistic.c:994 msgid "Cut point value must be in the range [0,1]" msgstr "Пороговое значение должно принадлежать диапазону [0,1]" #: src/language/stats/logistic.c:1139 msgid "Dependent Variable Encoding" msgstr "Кодирование зависимой переменной" #: src/language/stats/logistic.c:1141 msgid "Mapping" msgstr "" #: src/language/stats/logistic.c:1142 msgid "Internal Value" msgstr "Внутреннее значение" #: src/language/stats/logistic.c:1145 msgid "Original Value" msgstr "Начальное значение" #: src/language/stats/logistic.c:1167 msgid "Variables in the Equation" msgstr "Переменные в уравнении" #: src/language/stats/logistic.c:1171 src/language/stats/regression.c:902 msgid "B" msgstr "B" #: src/language/stats/logistic.c:1172 msgid "S.E." msgstr "Стандартная ошибка" #: src/language/stats/logistic.c:1173 msgid "Wald" msgstr "Вальда" #: src/language/stats/logistic.c:1176 msgid "Exp(B)" msgstr "Exp(B)" #: src/language/stats/logistic.c:1181 #, c-format msgid "%d%% CI for Exp(B)" msgstr "%d%% коэф. спряж. для Exp(B)" #: src/language/stats/logistic.c:1183 src/language/stats/t-test-indep.c:274 #: src/language/stats/t-test-one-sample.c:83 #: src/language/stats/t-test-paired.c:249 src/language/stats/crosstabs.q:1369 msgid "Lower" msgstr "Нижняя" #: src/language/stats/logistic.c:1183 src/language/stats/t-test-indep.c:275 #: src/language/stats/t-test-one-sample.c:84 #: src/language/stats/t-test-paired.c:250 src/language/stats/crosstabs.q:1370 msgid "Upper" msgstr "Верхняя" #: src/language/stats/logistic.c:1189 src/language/stats/logistic.c:1470 msgid "Step 1" msgstr "Шаг 1" #: src/language/stats/logistic.c:1263 msgid "Constant" msgstr "Константа" #: src/language/stats/logistic.c:1298 msgid "Model Summary" msgstr "Суммарная модель" #: src/language/stats/logistic.c:1301 msgid "-2 Log likelihood" msgstr "-2 log-правдоподобия" #: src/language/stats/logistic.c:1302 msgid "Cox & Snell R Square" msgstr "R квадрат Кокса и Снела" #: src/language/stats/logistic.c:1303 msgid "Nagelkerke R Square" msgstr "R квадрат Наґелькерке" #: src/language/stats/logistic.c:1306 src/language/stats/logistic.c:1470 #, fuzzy #| msgid "Step 1" msgid "Step" msgstr "Шаг 1" #: src/language/stats/logistic.c:1335 msgid "Unweighted Cases" msgstr "Невзвешенные наблюдения" #: src/language/stats/logistic.c:1336 msgid "Included in Analysis" msgstr "Включено в анализ" #: src/language/stats/logistic.c:1336 msgid "Missing Cases" msgstr "Пропущенные наблюдения" #: src/language/stats/logistic.c:1365 msgid "Categorical Variables' Codings" msgstr "Кодирование переменных категорий" #: src/language/stats/logistic.c:1380 #, fuzzy #| msgid "Encodings" msgid "Codings" msgstr "Кодировка" #: src/language/stats/logistic.c:1383 msgid "Parameter coding" msgstr "Кодирование параметра" #: src/language/stats/logistic.c:1462 msgid "Classification Table" msgstr "Таблица классификации" #: src/language/stats/logistic.c:1466 msgid "Predicted" msgstr "Предусмотрено" #: src/language/stats/logistic.c:1466 #, fuzzy #| msgid "" #| "Percentage\n" #| "Correct" msgid "Percentage Correct" msgstr "" "Исправленный\n" "процент" #: src/language/stats/logistic.c:1468 msgid "Observed" msgstr "Просмотрено" #: src/language/stats/logistic.c:1468 msgid "Overall Percentage" msgstr "Общий процент" #: src/language/stats/jonckheere-terpstra.c:357 msgid "Jonckheere-Terpstra Test" msgstr "Тест Джонкера-Терпстра" #: src/language/stats/jonckheere-terpstra.c:364 #, c-format msgid "Number of levels in %s" msgstr "Количество уровней в %s" #: src/language/stats/jonckheere-terpstra.c:370 msgid "Observed J-T Statistic" msgstr "Наблюдательная статистика Дж.-Т." #: src/language/stats/jonckheere-terpstra.c:371 msgid "Mean J-T Statistic" msgstr "Средняя статистика Дж.-Т." #: src/language/stats/jonckheere-terpstra.c:372 msgid "Std. Deviation of J-T Statistic" msgstr "Станд. отклонение статистики Дж.-Т." #: src/language/stats/jonckheere-terpstra.c:373 msgid "Std. J-T Statistic" msgstr "Станд. статистика Дж.-Т." #: src/language/stats/mann-whitney.c:187 src/language/stats/wilcoxon.c:246 msgid "Sum of Ranks" msgstr "Сумма рангов" #: src/language/stats/mann-whitney.c:248 msgid "Mann-Whitney U" msgstr "U Мана-Уитни" #: src/language/stats/mann-whitney.c:249 msgid "Wilcoxon W" msgstr "W Вилкоксона" #: src/language/stats/mann-whitney.c:250 src/language/stats/runs.c:327 #: src/language/stats/wilcoxon.c:283 msgid "Z" msgstr "Z" #: src/language/stats/means.c:702 msgid "Included" msgstr "Включены" #: src/language/stats/means.c:704 src/language/stats/reliability.c:548 msgid "Excluded" msgstr "Исключенные" #: src/language/stats/means.c:753 msgid "Report" msgstr "Отчет" #: src/language/stats/means.c:838 #, fuzzy, c-format #| msgid "" #| "Dependent variable %s has no non-missing values. No analysis for this " #| "variable will be done." msgid "" "The table \"%s\" has no non-empty control variables. No result for this " "table will be displayed." msgstr "" "В зависимой переменной %s нет непропущенных значений. Анализ для этой " "переменной не будет выполняться." #: src/language/stats/means-calc.c:443 msgid "Group Median" msgstr "Медиана группы" #: src/language/stats/means-calc.c:455 msgid "First" msgstr "Первый" #: src/language/stats/means-calc.c:456 msgid "Last" msgstr "Последний" #: src/language/stats/means-calc.c:458 msgid "Percent N" msgstr "N процентов" #: src/language/stats/means-calc.c:459 msgid "Percent Sum" msgstr "Сумма процентов" #: src/language/stats/means-calc.c:461 msgid "Harmonic Mean" msgstr "Среднее гармоническое" #: src/language/stats/means-calc.c:462 msgid "Geom. Mean" msgstr "Среднее геометрическое" #: src/language/stats/mcnemar.c:144 msgid "The McNemar test is appropriate only for dichotomous variables" msgstr "McNemar проверка уместна только для дихотомических переменных" #: src/language/stats/mcnemar.c:226 src/language/stats/sign.c:105 msgid "Point Probability" msgstr "Точечная вероятность" #: src/language/stats/mcnemar.c:229 src/language/stats/sign.c:78 #: src/language/stats/sign.c:108 src/language/stats/t-test-paired.c:199 #: src/language/stats/t-test-paired.c:257 src/language/stats/wilcoxon.c:253 #: src/language/stats/wilcoxon.c:292 #, fuzzy #| msgid "Pair %d" msgid "Pairs" msgstr "Пара %d" #: src/language/stats/median.c:316 msgid "> Median" msgstr "> медианы" #: src/language/stats/median.c:316 msgid "≤ Median" msgstr "≤ медианы" #: src/language/stats/npar.c:536 #, c-format msgid "%s subcommand not currently implemented." msgstr "Подкоманда %s в текущей версии еще не реализована." #: src/language/stats/npar.c:691 #, c-format msgid "Expecting %s, %s, %s or a number." msgstr "Должно быть %s, %s, %s или число." #: src/language/stats/npar.c:845 #, c-format msgid "" "The specified value of HI (%d) is lower than the specified value of LO (%d)" msgstr "Указанное значение HI (%d) меньше указанного значения LO (%d)" #: src/language/stats/npar.c:897 #, c-format msgid "" "%d expected values were given, but the specified range (%d-%d) requires " "exactly %d values." msgstr "" "Было предоставлено %d ожидаемых значений, но для указанного диапазона (%d-" "%d) нужно точно %d значений." #: src/language/stats/npar.c:1118 src/language/stats/t-test-parser.c:173 #, c-format msgid "" "PAIRED was specified but the number of variables preceding WITH (%zu) did " "not match the number following (%zu)." msgstr "" "Было указано PAIRED, но количество переменных, предшествующих WITH (%zu), не " "соответствовало количеству, следовавших за ним (%zu)." #: src/language/stats/oneway.c:361 msgid "LSD" msgstr "НУС" #: src/language/stats/oneway.c:362 src/ui/gui/oneway.ui:338 msgid "Tukey HSD" msgstr "ДЗР Туки" #: src/language/stats/oneway.c:363 src/ui/gui/oneway.ui:253 msgid "Bonferroni" msgstr "Бонферони" #: src/language/stats/oneway.c:364 src/ui/gui/oneway.ui:304 msgid "Scheffé" msgstr "Шеффе" #: src/language/stats/oneway.c:365 msgid "Games-Howell" msgstr "Ґеймс-Гауел" #: src/language/stats/oneway.c:366 src/ui/gui/oneway.ui:321 msgid "Šidák" msgstr "Шидяк" #: src/language/stats/oneway.c:519 #, c-format msgid "The post hoc analysis method %s is not supported." msgstr "Поддержки дополнительного метода анализа %s не предусмотрена." #: src/language/stats/oneway.c:842 #, c-format msgid "" "Dependent variable %s has no non-missing values. No analysis for this " "variable will be done." msgstr "" "В зависимой переменной %s нет непропущенных значений. Анализ для этой " "переменной не будет выполняться." #: src/language/stats/oneway.c:924 #, c-format msgid "" "In contrast list %zu, the number of coefficients (%zu) does not equal the " "number of groups (%d). This contrast list will be ignored." msgstr "" "В списке контрастов %zu количество коэффициентов (%zu) не равно количеству " "групп (%d). Этот список контрастов будет проигнорирован." #: src/language/stats/oneway.c:936 #, c-format msgid "Coefficients for contrast %zu do not total zero" msgstr "Сумма коэффициентов контраста %zu не равна нулю" #: src/language/stats/oneway.c:971 msgid "ANOVA" msgstr "ANOVA" #: src/language/stats/oneway.c:974 src/language/stats/regression.c:1024 msgid "Sum of Squares" msgstr "Сумма квадратов" #: src/language/stats/oneway.c:981 msgid "Between Groups" msgstr "Между группами" #: src/language/stats/oneway.c:981 msgid "Within Groups" msgstr "Внутри групп" #: src/language/stats/oneway.c:1075 src/language/stats/oneway.c:1257 #, fuzzy #| msgid "_Dependent Variable" msgid "Dependent Variable" msgstr "Зависимая переменная" #: src/language/stats/oneway.c:1148 msgid "Test of Homogeneity of Variances" msgstr "Проверка однородности дисперсий" #: src/language/stats/oneway.c:1151 msgid "Levene Statistic" msgstr "Статистика Ливиня" #: src/language/stats/oneway.c:1152 msgid "df1" msgstr "df1" #: src/language/stats/oneway.c:1153 msgid "df2" msgstr "df2" #: src/language/stats/oneway.c:1192 msgid "Contrast Coefficients" msgstr "Коэффициенты контрастности" #: src/language/stats/oneway.c:1199 src/language/stats/oneway.c:1246 msgid "Contrast" msgstr "Контраст" #: src/language/stats/oneway.c:1236 msgid "Contrast Tests" msgstr "Тесты контрастности" #: src/language/stats/oneway.c:1239 msgid "Value of Contrast" msgstr "Значение контрастности" #: src/language/stats/oneway.c:1241 src/language/stats/regression.c:905 #: src/language/stats/t-test-indep.c:266 #: src/language/stats/t-test-one-sample.c:74 #: src/language/stats/t-test-paired.c:252 msgid "t" msgstr "t" #: src/language/stats/oneway.c:1252 msgid "Assumption" msgstr "" #: src/language/stats/oneway.c:1253 msgid "Assume equal variances" msgstr "Предполагать равенство дисперсий" #: src/language/stats/oneway.c:1254 #, fuzzy #| msgid "Does not assume equal" msgid "Does not assume equal variances" msgstr "Не предполагать равенства" #: src/language/stats/oneway.c:1367 #, c-format msgid "Multiple Comparisons (%s)" msgstr "Несколько сравнений (%s)" #: src/language/stats/oneway.c:1374 #, fuzzy #| msgid "Mean Difference" msgid "Mean Difference (I - J)" msgstr "Средняя разница" #: src/language/stats/oneway.c:1379 #, c-format msgid "%g%% Confidence Interval" msgstr "%g%%-ый доверительный интервал" #: src/language/stats/oneway.c:1386 src/language/stats/oneway.c:1390 msgid "(J) Family" msgstr "" #: src/language/stats/oneway.c:1406 #, fuzzy #| msgid "Runs Test" msgid "Test" msgstr "Проверка серий" #: src/language/stats/quick-cluster.c:576 msgid "Initial Cluster Centers" msgstr "Начальные центры кластеров" #: src/language/stats/quick-cluster.c:577 msgid "Final Cluster Centers" msgstr "Центры окончательных кластеров" #: src/language/stats/quick-cluster.c:580 #: src/language/stats/quick-cluster.c:660 #: src/language/stats/quick-cluster.c:661 #: src/language/stats/quick-cluster.c:753 msgid "Cluster" msgstr "Кластер" #: src/language/stats/quick-cluster.c:658 #, fuzzy #| msgid "Final Cluster Centers" msgid "Cluster Membership" msgstr "Центры окончательных кластеров" #: src/language/stats/quick-cluster.c:744 msgid "Number of Cases in each Cluster" msgstr "Количество наблюдений в каждом из кластеров" #: src/language/stats/quick-cluster.c:750 #, fuzzy #| msgid "Cluster" msgid "Clusters" msgstr "Кластер" #: src/language/stats/quick-cluster.c:867 #: src/language/stats/quick-cluster.c:893 #, fuzzy, c-format #| msgid "Variable %s already exists." msgid "A variable called `%s' already exists." msgstr "Переменная %s уже существует." #: src/language/stats/quick-cluster.c:908 #, fuzzy, c-format #| msgid "expecting %s or %s" msgid "Expecting %s or %s." msgstr "должно быть %s или %s" #: src/language/stats/quick-cluster.c:928 msgid "The number of clusters must be positive" msgstr "Количество кластеров должно быть положительным" #: src/language/stats/quick-cluster.c:944 #, fuzzy #| msgid "The number of iterations must be positive" msgid "The convergence criterion must be positive" msgstr "Количество итераций должно быть положительным" #: src/language/stats/quick-cluster.c:960 msgid "The number of iterations must be positive" msgstr "Количество итераций должно быть положительным" #: src/language/stats/rank.c:205 #, c-format msgid "" "Cannot generate variable name for ranking %s with %s. All candidates in use." msgstr "" "Не удается создать имя переменной для ранжирования %s с %s. Все возможные " "варианты уже использованы. " #: src/language/stats/rank.c:321 #, c-format msgid "Too many variables in %s clause." msgstr "Слишком много переменных в инструкции %s." #: src/language/stats/rank.c:323 #, c-format msgid "Variable %s already exists." msgstr "Переменная %s уже существует." #: src/language/stats/rank.c:325 src/language/expressions/evaluate.c:164 #, c-format msgid "Duplicate variable name %s." msgstr "Дублирование названия переменной %s." #: src/language/stats/rank.c:631 #, c-format msgid "%s of %s by %s" msgstr "%s из %s за %s" #: src/language/stats/rank.c:825 #, fuzzy #| msgid "Variables Created By %s" msgid "Variables Created by RANK" msgstr "Переменные, созданные в %s" #: src/language/stats/rank.c:828 src/language/stats/rank.c:829 #, fuzzy #| msgid "Name Variable:" msgid "New Variable" msgstr "_Имя Переменной:" #: src/language/stats/rank.c:829 #, fuzzy #| msgid "Function: " msgid "Function" msgstr "Функция: " #: src/language/stats/rank.c:830 #, fuzzy #| msgid "Extraction" msgid "Fraction" msgstr "Извлечение" #: src/language/stats/rank.c:830 #, fuzzy #| msgid "_Grouping Variable:" msgid "Grouping Variables" msgstr "_Группировка переменной:" #: src/language/stats/rank.c:833 src/language/stats/rank.c:834 #, fuzzy #| msgid "Insert Variable" msgid "Existing Variable" msgstr "Вставить переменную" #: src/language/stats/reliability.c:164 msgid "Reliability on a single variable is not useful." msgstr "Оценка пригодности для одной переменной лишена смысла." #: src/language/stats/reliability.c:281 msgid "" "The STATISTICS subcommand is not yet implemented. No statistics will be " "produced." msgstr "" "Подкоманда STATISTICS пока не реализована. Статистическая обработка " "производиться не будет." #: src/language/stats/reliability.c:300 msgid "The split point must be less than the number of variables" msgstr "Пороговое значение должно быть меньше количества переменных" #: src/language/stats/reliability.c:525 #, c-format msgid "Scale: %s" msgstr "Шкала: %s" #: src/language/stats/reliability.c:582 msgid "Item-Total Statistics" msgstr "Общая статистика" #: src/language/stats/reliability.c:585 msgid "Scale Mean if Item Deleted" msgstr "Масштабируемое среднее, если пункт удален" #: src/language/stats/reliability.c:586 msgid "Scale Variance if Item Deleted" msgstr "Масштабируемая дисперсия, если пункт удален" #: src/language/stats/reliability.c:587 msgid "Corrected Item-Total Correlation" msgstr "Откорректированный пункт – суммарная корреляция" #: src/language/stats/reliability.c:588 msgid "Cronbach's Alpha if Item Deleted" msgstr "Альфа Кронбаха, если пункт удален" #: src/language/stats/reliability.c:627 msgid "Reliability Statistics" msgstr "Статистика годности" #: src/language/stats/reliability.c:634 src/language/stats/reliability.c:646 msgid "Cronbach's Alpha" msgstr "Альфа Кронбаха" #: src/language/stats/reliability.c:635 src/language/stats/reliability.c:649 #: src/language/stats/reliability.c:652 msgid "N of Items" msgstr "Кол-во пунктов" #: src/language/stats/reliability.c:647 msgid "Part 1" msgstr "Часть 1" #: src/language/stats/reliability.c:650 msgid "Part 2" msgstr "Часть 2" #: src/language/stats/reliability.c:654 msgid "Total N of Items" msgstr "Общее кол-во пунктов" #: src/language/stats/reliability.c:656 msgid "Correlation Between Forms" msgstr "Корреляция между формами" #: src/language/stats/reliability.c:659 msgid "Spearman-Brown Coefficient" msgstr "Коэффициент Спирмена-Брауна" #: src/language/stats/reliability.c:660 msgid "Equal Length" msgstr "Одинаковая длина" #: src/language/stats/reliability.c:661 msgid "Unequal Length" msgstr "Неодинаковая длина" #: src/language/stats/reliability.c:663 msgid "Guttman Split-Half Coefficient" msgstr "Коэффициент расщепления пополам Ґутмана" #: src/language/stats/roc.c:966 msgid "Area Under the Curve" msgstr "Площадь под кривой" #: src/language/stats/roc.c:970 msgid "Area" msgstr "Площадь" #: src/language/stats/roc.c:976 msgid "Asymptotic Sig." msgstr "Асимптотическое знач." #: src/language/stats/roc.c:979 #, c-format msgid "Asymp. %g%% Confidence Interval" msgstr "Асимпт. %g%%-ый доверительный интервал" #: src/language/stats/roc.c:987 msgid "Variable under test" msgstr "Переменная, проверка которой выполняется" #: src/language/stats/roc.c:1026 msgid "Case Summary" msgstr "Резюме наблюдений" #: src/language/stats/roc.c:1030 msgid "Unweighted" msgstr "Невзвешенная" #: src/language/stats/roc.c:1031 msgid "Weighted" msgstr "Взвешенная" #: src/language/stats/roc.c:1064 msgid "Coordinates of the Curve" msgstr "Координаты кривой" #: src/language/stats/roc.c:1068 msgid "Positive if greater than or equal to" msgstr "Положительное, если больше или равно" #: src/language/stats/roc.c:1069 src/output/charts/roc-chart-cairo.c:38 msgid "Sensitivity" msgstr "Чувствительность" #: src/language/stats/roc.c:1069 src/output/charts/roc-chart-cairo.c:37 msgid "1 - Specificity" msgstr "1 - специфичность" #: src/language/stats/roc.c:1072 #, fuzzy #| msgid "ordinary" msgid "Coordinates" msgstr "порядковая" #: src/language/stats/roc.c:1076 msgid "Test variable" msgstr "Переменная для проверки" #: src/language/stats/regression.c:224 src/language/stats/regression.c:229 #, fuzzy, c-format #| msgid "%s may not appear after %s." msgid "VARIABLES may not appear after %s" msgstr "%s не может использоваться после %s." #: src/language/stats/regression.c:412 msgid "" "REGRESSION with SAVE ignores TEMPORARY. Temporary transformations will be " "made permanent." msgstr "" "REGRESSION с SAVE игнорируют TEMPORARY. Временные преобразования " "преобразуются в постоянные." #: src/language/stats/regression.c:416 #, fuzzy #| msgid "" #| "REGRESSION with SAVE ignores TEMPORARY. Temporary transformations will " #| "be made permanent." msgid "REGRESSION with SAVE ignores FILTER. All cases will be processed." msgstr "" "REGRESSION с SAVE игнорируют TEMPORARY. Временные преобразования " "преобразуются в постоянные." #: src/language/stats/regression.c:569 msgid "" "The dependent variable is equal to the independent variable. The least " "squares line is therefore Y=X. Standard errors and related statistics may be " "meaningless." msgstr "" "Зависимая переменная равна независимой переменной. Поэтому прямая линейная " "регрессия будет: Y=X. Значение стандартной погрешности и связанной " "статистики, вероятно, лишены смысла." #: src/language/stats/regression.c:776 msgid "No valid data found. This command was skipped." msgstr "Не найдено корректных данных. Команда будет пропущена." #: src/language/stats/regression.c:863 #, c-format msgid "Model Summary (%s)" msgstr "Резюме модели (%s)" #: src/language/stats/regression.c:868 #: src/ui/gui/psppire-dialog-action-regression.c:42 msgid "R" msgstr "R" #: src/language/stats/regression.c:868 msgid "R Square" msgstr "R квадрат" #: src/language/stats/regression.c:868 msgid "Adjusted R Square" msgstr "Скорректированный R квадрат" #: src/language/stats/regression.c:869 msgid "Std. Error of the Estimate" msgstr "Ст. погрешность оценки" #: src/language/stats/regression.c:895 #, c-format msgid "Coefficients (%s)" msgstr "Коэффициенты (%s)" #: src/language/stats/regression.c:901 msgid "Unstandardized Coefficients" msgstr "Нестандартизированы коэффициенты" #: src/language/stats/regression.c:904 msgid "Standardized Coefficients" msgstr "Стандартизированные коэффициенты" #: src/language/stats/regression.c:904 msgid "Beta" msgstr "Бетта" #: src/language/stats/regression.c:911 #, c-format msgid "%g%% Confidence Interval for B" msgstr "%g%%-ый доверительный интервал для B" #: src/language/stats/regression.c:919 #, fuzzy #| msgid "Reliability Statistics" msgid "Collinearity Statistics" msgstr "Статистика годности" #: src/language/stats/regression.c:920 #, fuzzy #| msgid "Covariance" msgid "Tolerance" msgstr "Ковариация" #: src/language/stats/regression.c:920 msgid "VIF" msgstr "" #: src/language/stats/regression.c:933 msgid "(Constant)" msgstr "(Константа)" #: src/language/stats/regression.c:1020 #, c-format msgid "ANOVA (%s)" msgstr "ANOVA (%s)" #: src/language/stats/regression.c:1031 src/ui/gui/regression.ui:24 msgid "Regression" msgstr "Регрессия" #: src/language/stats/regression.c:1075 #, c-format msgid "Coefficient Correlations (%s)" msgstr "коэффициентов Корреляции (%s)" #: src/language/stats/regression.c:1082 #, fuzzy #| msgid "Model" msgid "Models" msgstr "Модель" #: src/language/stats/regression.c:1090 msgid "Covariances" msgstr "Ковариации" #: src/language/stats/runs.c:169 #, c-format msgid "" "Multiple modes exist for variable `%s'. Using %.*g as the threshold value." msgstr "" "Существует несколько мод для переменной `%s'. Используем %.*g как пороговое " "значение." #: src/language/stats/runs.c:314 src/ui/gui/runs.ui:24 msgid "Runs Test" msgstr "Проверка серий" #: src/language/stats/runs.c:319 msgid "Test Value" msgstr "Значение для проверки" #: src/language/stats/runs.c:320 msgid "Test Value (mode)" msgstr "Значение для проверки (мода)" #: src/language/stats/runs.c:321 msgid "Test Value (mean)" msgstr "Значение для проверки (среднее)" #: src/language/stats/runs.c:322 msgid "Test Value (median)" msgstr "Значение для проверки (медиана)" #: src/language/stats/runs.c:323 msgid "Cases < Test Value" msgstr "Наблюдений < Значение для проверки" #: src/language/stats/runs.c:324 msgid "Cases ≥ Test Value" msgstr "Наблюдений ≥ Значение для проверки" #: src/language/stats/runs.c:325 msgid "Total Cases" msgstr "Сумма наблюдений" #: src/language/stats/runs.c:326 msgid "Number of Runs" msgstr "Количество серий" #: src/language/stats/sign.c:72 #, fuzzy #| msgid "Mean Difference" msgid "Differences" msgstr "Средняя разница" #: src/language/stats/sign.c:73 msgid "Negative Differences" msgstr "Отрицательные разницы" #: src/language/stats/sign.c:74 msgid "Positive Differences" msgstr "Положительные разницы" #: src/language/stats/sign.c:75 src/language/stats/wilcoxon.c:250 msgid "Ties" msgstr "Совпадения" #: src/language/stats/sort-cases.c:63 msgid "Buffer limit must be at least 2." msgstr "Значением ограничения буфера должно быть по крайней мере число 2." #: src/language/stats/sort-criteria.c:89 #, c-format msgid "Variable %s specified twice in sort criteria." msgstr "Переменная %s в критерии упорядочивания указана дважды." #: src/language/stats/t-test-indep.c:190 msgid "Group Statistics" msgstr "Статистика группы" #: src/language/stats/t-test-indep.c:200 #, fuzzy #| msgid "Group1" msgid "Group" msgstr "Группа1" #: src/language/stats/t-test-indep.c:256 msgid "Independent Samples Test" msgstr "Проверка независимых выборок" #: src/language/stats/t-test-indep.c:261 msgid "Levene's Test for Equality of Variances" msgstr "Проверка Лівіня равенства дисперсий" #: src/language/stats/t-test-indep.c:265 #, fuzzy #| msgid "t-test for Equality of Means" msgid "T-Test for Equality of Means" msgstr "t-проверка равенства средних" #: src/language/stats/t-test-indep.c:269 #: src/language/stats/t-test-one-sample.c:77 msgid "Mean Difference" msgstr "Средняя разница" #: src/language/stats/t-test-indep.c:270 msgid "Std. Error Difference" msgstr "Разница стандратних погрешностей" #: src/language/stats/t-test-indep.c:273 #, fuzzy, no-c-format #| msgid "%g%% Confidence Interval of the Difference" msgid "95% Confidence Interval of the Difference" msgstr "%g%%-ый доверительный интервал разницы" #: src/language/stats/t-test-indep.c:277 #, fuzzy #| msgid "Options" msgid "Assumptions" msgstr "Параметры" #: src/language/stats/t-test-indep.c:278 msgid "Equal variances assumed" msgstr "Предполагаем равенство дисперсий" #: src/language/stats/t-test-indep.c:279 msgid "Equal variances not assumed" msgstr "Не предполагаем равенства дисперсий" #: src/language/stats/t-test-one-sample.c:64 msgid "One-Sample Test" msgstr "Тест для одной выборки" #: src/language/stats/t-test-one-sample.c:71 #, fuzzy, c-format #| msgid "Test Value = %f" msgid "Test Value = %.*g" msgstr "Значение проверки = %f" #: src/language/stats/t-test-one-sample.c:80 #: src/language/stats/t-test-paired.c:246 #, c-format msgid "%g%% Confidence Interval of the Difference" msgstr "%g%%-ый доверительный интервал разницы" #: src/language/stats/t-test-one-sample.c:122 msgid "One-Sample Statistics" msgstr "Статистика одной выборки" #: src/language/stats/t-test-paired.c:147 msgid "Paired Sample Statistics" msgstr "Статистика парных выборок" #: src/language/stats/t-test-paired.c:163 #: src/language/stats/t-test-paired.c:205 #: src/language/stats/t-test-paired.c:263 #, fuzzy, c-format #| msgid "Pair %d" msgid "Pair %zu" msgstr "Пара %d" #: src/language/stats/t-test-paired.c:190 msgid "Paired Samples Correlations" msgstr "Корреляции парных выборок" #: src/language/stats/t-test-paired.c:208 #, c-format msgid "%s & %s" msgstr "%s и %s" #: src/language/stats/t-test-paired.c:234 msgid "Paired Samples Test" msgstr "Проверка парных выборок" #: src/language/stats/t-test-paired.c:240 msgid "Paired Differences" msgstr "Парные разницы" #: src/language/stats/t-test-paired.c:266 #, c-format msgid "%s - %s" msgstr "%s - %s" #: src/language/stats/t-test-parser.c:133 #, c-format msgid "When applying %s to a string variable, two values must be specified." msgstr "" "Если %s применяется в строчной переменной, следует указать два значения." #: src/language/stats/t-test-parser.c:145 #: src/language/stats/t-test-parser.c:241 #, c-format msgid "%s subcommand may not be used with %s." msgstr "Подкоманду %s нельзя использовать вместе с %s." #: src/language/stats/t-test-parser.c:305 msgid "Exactly one of TESTVAL, GROUPS and PAIRS subcommands must be specified." msgstr "Должна быть указана толькоодна подкоманда TESTVAL, GROUPS и PAIRS." #: src/language/stats/wilcoxon.c:248 #, fuzzy #| msgid "_Sign" msgid "Sign" msgstr "_Знак" #: src/language/stats/wilcoxon.c:249 msgid "Negative Ranks" msgstr "Отрицательные ранги" #: src/language/stats/wilcoxon.c:249 msgid "Positive Ranks" msgstr "Положительные ранги" #: src/language/stats/wilcoxon.c:296 #, fuzzy #| msgid "Too many pairs to calculate exact significance." msgid "Too many pairs to calculate exact significance" msgstr "Слишком много пар для вычисления точной значимости." #: src/language/data-io/combine-files.c:214 msgid "Cannot specify the active dataset since none has been defined." msgstr "" "нельзя указывать активную базу данных, поскольку еще не было определено ни " "одной базы данных." #: src/language/data-io/combine-files.c:220 msgid "" "This command may not be used after TEMPORARY when the active dataset is an " "input source. Temporary transformations will be made permanent." msgstr "" "Эта команда не может быть использована после TEMPORARY, когда источником " "входных данных является активная база данных. Временные преобразования будут " "сделаны постоянными." #: src/language/data-io/combine-files.c:255 msgid "Multiple IN subcommands for a single FILE or TABLE." msgstr "Несколько подкоманд IN для одного файла (FILE) или таблицы (TABLE)." #: src/language/data-io/combine-files.c:308 #, c-format msgid "File %s lacks BY variable %s." msgstr "В файле %s не хватает BY переменной %s." #: src/language/data-io/combine-files.c:311 #, c-format msgid "Active dataset lacks BY variable %s." msgstr "В активном наборе данных не хватает BY переменной %s." #: src/language/data-io/combine-files.c:388 #: src/language/data-io/combine-files.c:393 #, c-format msgid "BY is required when %s is specified." msgstr "Необходимо указать BY, если указано %s." #: src/language/data-io/combine-files.c:521 msgid "" "Combining files with incompatible encodings. String data may not be " "represented correctly." msgstr "" "Сочетание файлов с несовместимыми кодировкой. Строковые данные могут быть " "показаны некорректно." #: src/language/data-io/combine-files.c:564 #, c-format msgid "" "Variable %s in file %s has different type or width from the same variable in " "earlier file." msgstr "" "Переменная %s в файле %s принадлежит к другому типу или имеет другую ширину, " "чем та же переменная в предыдущем файле." #: src/language/data-io/combine-files.c:570 #, c-format msgid "In file %s, %s is numeric." msgstr "В файле %s, %s число." #: src/language/data-io/combine-files.c:573 #, c-format msgid "In file %s, %s is a string variable with width %d." msgstr "В файле %s, %s является строчной переменной шириной %d." #: src/language/data-io/combine-files.c:578 #, c-format msgid "In an earlier file, %s was numeric." msgstr "В предыдущем файле %s была числом." #: src/language/data-io/combine-files.c:581 #, c-format msgid "In an earlier file, %s was a string variable with width %d." msgstr "В предыдущем файле %s была строчной переменной шириной %d." #: src/language/data-io/combine-files.c:621 #, c-format msgid "" "Variable name %s specified on %s subcommand duplicates an existing variable " "name." msgstr "" "Название переменной %s, указанной в %s подкоманде, дублирует название " "существующей переменной." #: src/language/data-io/combine-files.c:793 #, c-format msgid "Encountered %zu sets of duplicate cases in the master file." msgstr "В основном файле обнаружено %zu наборов повторяющихся наблюдений." #: src/language/data-io/data-list.c:129 src/language/data-io/data-list.c:144 #, fuzzy, c-format #| msgid "%s must not be negative." msgid "The %s value must be non-negative." msgstr "%s не должен быть отрицательным." #: src/language/data-io/data-list.c:154 #, c-format msgid "The %s subcommand may only be used within %s." msgstr "Подкоманду %s можно использовать только в пределах %s." #: src/language/data-io/data-list.c:159 #, c-format msgid "The %s subcommand may only be specified once." msgstr "Подкоманду %s можно использовать только один раз." #: src/language/data-io/data-list.c:197 msgid "Only one of FIXED, FREE, or LIST may be specified." msgstr "Можно указать только одну из команд, FIXED, FREE или LIST." #: src/language/data-io/data-list.c:260 msgid "Encoding should not be specified for inline data. It will be ignored." msgstr "" "Во встроенных данных не следует указывать кодировку. Команда смены кодировки " "будет проигнорирована." #: src/language/data-io/data-list.c:269 #, c-format msgid "The %s subcommand may be used only with %s." msgstr "Подкоманду %s можно использовать только с %s." #: src/language/data-io/data-list.c:284 src/language/data-io/matrix-data.c:578 msgid "At least one variable must be specified." msgstr "Должна быть указана по крайней мере одна переменная." #: src/language/data-io/data-list.c:383 src/language/data-io/data-list.c:491 #: src/language/data-io/get-data.c:662 #, c-format msgid "%s is a duplicate variable name." msgstr "%s дублирует название существующей переменной." #: src/language/data-io/data-list.c:390 #, c-format msgid "There is already a variable %s of a different type." msgstr "Уже существует переменная %s другого типа." #: src/language/data-io/data-list.c:397 #, c-format msgid "There is already a string variable %s of a different width." msgstr "Уже существует строчная переменная %s другой ширины." #: src/language/data-io/data-list.c:405 #, c-format msgid "Cannot place variable %s on record %d when RECORDS=%d is specified." msgstr "нельзя располагать переменную %s в записи %d, если указано RECORDS=%d." #: src/language/data-io/data-parser.c:453 #: src/language/data-io/data-parser.c:462 msgid "Quoted string extends beyond end of line." msgstr "Строка в кавычках завершается с концом строки в файле." #: src/language/data-io/data-parser.c:488 msgid "Missing delimiter following quoted string." msgstr "Не хватает разделителя с последующей строкой в кавычках." #: src/language/data-io/data-parser.c:506 #, c-format msgid "Data for variable %s is not valid as format %s: %s" msgstr "Данные переменной %s являются некорректными для формата %s: %s" #: src/language/data-io/data-parser.c:536 #, c-format msgid "Partial case of %d of %d records discarded." msgstr "Частичное наблюдения %d из %d записей отвергнуто." #: src/language/data-io/data-parser.c:592 #, c-format msgid "Partial case discarded. The first variable missing was %s." msgstr "" "Данные неполного наблюдения отвергнуты. Первая пропущенная переменная %s." #: src/language/data-io/data-parser.c:634 #, c-format msgid "" "Missing value(s) for all variables from %s onward. These will be filled " "with the system-missing value or blanks, as appropriate." msgstr "" "Отсутствующее(ие) значение(я) для всех переменных, начиная с %s . Переменные " "будут заполнены значением «пропущено системой» или заготовками, по мере " "необходимости." #: src/language/data-io/data-parser.c:655 msgid "Record ends in data not part of any field." msgstr "Запись заканчивается в данных, которые не являются частью поля." #: src/language/data-io/data-parser.c:670 #, c-format msgid "Reading %d record from %s." msgid_plural "Reading %d records from %s." msgstr[0] "Читаем %d запись из %s." msgstr[1] "Читаем %d записи %s." msgstr[2] "Читаем %d записей с %s." #: src/language/data-io/data-parser.c:680 src/language/data-io/print.c:435 msgid "Record" msgstr "Запись" #: src/language/data-io/data-parser.c:680 src/language/data-io/print.c:435 #: src/ui/gui/psppire-var-sheet-header.c:76 msgid "Columns" msgstr "Столбцы" #: src/language/data-io/data-parser.c:680 #: src/language/data-io/data-parser.c:725 src/language/data-io/print.c:435 msgid "Format" msgstr "Формат" #: src/language/data-io/data-parser.c:720 #, c-format msgid "Reading free-form data from %s." msgstr "Читаем данные в произвольной форме с %s." #. TRANSLATORS: this fragment will be interpolated into #. messages in fh_lock() that identify types of files. #: src/language/data-io/data-reader.c:136 src/language/data-io/data-writer.c:79 msgid "data file" msgstr "файл данных" #: src/language/data-io/data-reader.c:160 #, c-format msgid "Could not open `%s' for reading as a data file: %s." msgstr "Не удалось открыть `%s' для чтения в формате файла данных: %s." #: src/language/data-io/data-reader.c:174 #, c-format msgid "Could not read `%s' as a text file with encoding `%s': %s." msgstr "Не удалось прочитать `%s' как текстовый файл в кодировке `%s': %s." #: src/language/data-io/data-reader.c:233 #, c-format msgid "" "Missing %s while reading inline data. This probably indicates a missing or " "incorrectly formatted %s command. %s must appear by itself on a single line " "with exactly one space between words." msgstr "" "Во время чтения встроенных данных не было выявлено команды %s. Вероятно, это " "означает, что команда %s пропущена или неправильно отформатирована. %s " "должна быть указана в отдельной строке с одним пробелом между словами." #: src/language/data-io/data-reader.c:253 #: src/language/data-io/data-reader.c:387 #, c-format msgid "Error reading file %s: %s." msgstr "Ошибка чтения файла %s: %s." #: src/language/data-io/data-reader.c:261 #, c-format msgid "Unexpected end of file in partial record reading %s." msgstr "" "Неожиданное окончание файла на позиции, когда не было завершено чтение " "записи %s." #: src/language/data-io/data-reader.c:321 #, c-format msgid "Corrupt block descriptor word at offset 0x%lx in %s." msgstr "Поврежденное слово дескриптора блока на позиции 0x%lx в %s." #: src/language/data-io/data-reader.c:322 #, c-format msgid "Corrupt record descriptor word at offset 0x%lx in %s." msgstr "Поврежденное слово дескриптора на позиции 0x%lx в %s." #: src/language/data-io/data-reader.c:335 #, c-format msgid "Corrupt record size at offset 0x%lx in %s." msgstr "Неверный размер записи в позиции 0x%lx в %s." #: src/language/data-io/data-reader.c:493 msgid "Record exceeds remaining block length." msgstr "Запись выходит за пределы остатка длины блока." #: src/language/data-io/data-reader.c:567 #, c-format msgid "Attempt to read beyond end-of-file on file %s." msgstr "Попытка выхода за пределы файла %s во время чтения." #: src/language/data-io/data-reader.c:570 #, c-format msgid "Attempt to read beyond %s." msgstr "Попытка выхода за пределы %s во время чтения." #: src/language/data-io/data-reader.c:733 msgid "" "This command is not valid here since the current input program does not " "access the inline file." msgstr "" "Здесь нельзя использовать эту команду, поскольку текущая программа получения " "входных данных не имеет доступа к встроенному файлу." #: src/language/data-io/data-writer.c:106 #, c-format msgid "An error occurred while opening `%s' for writing as a data file: %s." msgstr "Ошибка при попытке открыть %s для записи в формате файла данных: %s." #: src/language/data-io/data-writer.c:224 #, c-format msgid "I/O error occurred writing data file `%s'." msgstr "Во время записи файла данных «%s» произошла ошибка ввода-вывода." #: src/language/data-io/dataset.c:64 #, c-format msgid "There is no dataset named %s." msgstr "Нет набора данных с именем %s." #: src/language/data-io/dataset.c:250 #, fuzzy #| msgid "Dataset" msgid "Datasets" msgstr "База данных" #: src/language/data-io/dataset.c:263 msgid "unnamed dataset" msgstr "база данных без названия" #: src/language/data-io/file-handle.c:61 #, c-format msgid "" "File handle %s is already defined. Use %s before redefining a file handle." msgstr "" "Дескриптор файла %s уже определен. Используйте %s до переопределения " "дескриптора файла." #: src/language/data-io/file-handle.c:241 #, c-format msgid "%s must be specified with %s." msgstr "%s должен быть указан с %s." #: src/language/data-io/file-handle.c:252 #, c-format msgid "" "The specified file mode requires LRECL. Assuming %zu-character records." msgstr "Указанный файл мод требует LRECL. Предполагаем %zu-символьные записи. " #: src/language/data-io/file-handle.c:256 #, fuzzy, c-format #| msgid "" #| "Record length (%ld) must be between 1 and %lu bytes. Assuming %zu-" #| "character records." msgid "" "Record length (%d) must be between 1 and %lu bytes. Assuming %zu-character " "records." msgstr "" "Длина записи (%ld) должна находиться между значениями 1 и %lu байт. " "Предполагаем %zu-символьные записи. " #: src/language/data-io/file-handle.c:300 msgid "file" msgstr "файл" #: src/language/data-io/file-handle.c:302 msgid "inline file" msgstr "встроенный файл" #: src/language/data-io/file-handle.c:350 msgid "expecting a file name or handle name" msgstr "должны быть указаны название файла или дескриптор" #: src/language/data-io/file-handle.c:365 #, c-format msgid "Handle for %s not allowed here." msgstr "Дескриптор файла %s здесь нельзя использовать." #: src/language/data-io/get-data.c:108 src/output/measure.c:262 #, c-format msgid "error reading file `%s'" msgstr "ошибка при попытке прочитать файл `%s'" #: src/language/data-io/get-data.c:127 #, c-format msgid "Unsupported TYPE %s." msgstr "неподдерживаемые элементы значения TYPE %s." #: src/language/data-io/get-data.c:278 msgid "The sheet index must be greater than or equal to 1" msgstr "Индекс листа должен быть больше или равен 1" #: src/language/data-io/get-data.c:285 src/language/data-io/get-data.c:308 #: src/language/data-io/get-data.c:327 #, c-format msgid "%s must be followed by either \"%s\" or \"%s\"." msgstr "После %s должно быть \"%s\" или \"%s\"." #: src/language/data-io/get-data.c:357 #, c-format msgid "" "%s is allowed only with %s arrangement, but %s arrangement was stated or " "implied earlier in this command." msgstr "" "%s можно использовать только упорядочиванием %s, но раньше в этой команде " "было указано или имелось в виду упорядочивание %s." #: src/language/data-io/get-data.c:441 src/language/data-io/get-data.c:479 #, c-format msgid "Value of %s must be 1 or greater." msgstr "Значение %s должно быть не меньше чем 1." #: src/language/data-io/get-data.c:504 msgid "" "Ignoring obsolete IMPORTCASES subcommand. (N OF CASES or SAMPLE may be used " "to substitute.)" msgstr "" #: src/language/data-io/get-data.c:551 msgid "" "In compatible syntax mode, the QUALIFIER string must contain exactly one " "character." msgstr "" "В режиме совместимости синтаксиса строка QUALIFIER должна содержать только " "один символ." #: src/language/data-io/get-data.c:583 #, c-format msgid "" "The record number specified, %ld, is at or before the previous record, %d. " "Data fields must be listed in order of increasing record number." msgstr "" "Указанный номер записи, %ld, является номером предварительной записи, %d, " "или предшествует ему. Поля данных в списке должны быть указаны в порядке " "возрастания номеров." #: src/language/data-io/get-data.c:592 #, c-format msgid "" "The record number specified, %ld, exceeds the number of records per case " "specified on FIXCASE, %d." msgstr "" "Указанный номер записи, %ld, превышает значение количества записей " "наблюдений, указанное в FIXCASE, %d." #: src/language/data-io/get.c:132 #, c-format msgid "%s: Data file dictionary has no variables." msgstr "" #: src/language/data-io/inpt-pgm.c:133 #, c-format msgid "Unexpected end-of-file within %s." msgstr "Неожиданное завершение файла в %s." #: src/language/data-io/inpt-pgm.c:146 #, c-format msgid "Input program must contain %s or %s." msgstr "Входная программа должна содержать инструкцию %s или %s." #: src/language/data-io/inpt-pgm.c:152 msgid "Input program did not create any variables." msgstr "Входная программа не создала никаких переменных." #: src/language/data-io/inpt-pgm.c:365 msgid "" "REREAD: Column numbers must be positive finite numbers. Column set to 1." msgstr "" "REREAD: номера столбцов должны быть положительными целыми числами. Столбцу " "установлено значение 1." #: src/language/data-io/list.c:100 #, fuzzy #| msgid "Dataset" msgid "Data List" msgstr "База данных" #: src/language/data-io/list.c:221 #, c-format msgid "" "The first case (%ld) specified precedes the last case (%ld) specified. The " "values will be swapped." msgstr "" "Первое указанное наблюдения (%ld) предшествует последнему указанному " "наблюдению (%ld). Значения поменяются местами." #: src/language/data-io/list.c:230 #, fuzzy, c-format #| msgid "" #| "The first case (%ld) to list is less than 1. The value is being reset to " #| "1." msgid "" "The first case (%ld) to list is numbered less than 1. The value is being " "reset to 1." msgstr "Значение первого наблюдения (%ld) меньше 1. Значение изменено на 1." #: src/language/data-io/list.c:237 #, fuzzy, c-format #| msgid "" #| "The last case (%ld) to list is less than 1. The value is being reset to " #| "1." msgid "" "The last case (%ld) to list is numbered less than 1. The value is being " "reset to 1." msgstr "Значение последнего наблюдения (%ld) меньше 1. Значение изменено на 1." #: src/language/data-io/list.c:244 #, c-format msgid "The step value %ld is less than 1. The value is being reset to 1." msgstr "Значение шага %ld меньше 1. Значение сбрасывается в 1." #: src/language/data-io/placement-parser.c:96 #, c-format msgid "" "Number of variables specified (%zu) differs from number of variable formats " "(%zu)." msgstr "" "Количество заданных переменных (%zu) отличается от количества форматов " "переменных (%zu)." #: src/language/data-io/placement-parser.c:106 msgid "" "SPSS-like or Fortran-like format specification expected after variable names." msgstr "" "После названия переменных следует указывать спецификацию форматов в стиле " "SPSS или Fortran." #: src/language/data-io/placement-parser.c:129 #, c-format msgid "The %d columns %d-%d can't be evenly divided into %zu fields." msgstr "%d столбцов, %d-%d, нельзя равномерно поделить на %zu полей." #: src/language/data-io/placement-parser.c:310 msgid "Column positions for fields must be positive." msgstr "Расположение столбцов полей должно быть положительным." #: src/language/data-io/placement-parser.c:312 msgid "Column positions for fields must not be negative." msgstr "Расположение столбцов полей не должно быть отрицательным." #: src/language/data-io/placement-parser.c:372 msgid "The ending column for a field must be greater than the starting column." msgstr "" "Значение завершающего столбца поля должно превышать значения исходного " "столбца." #: src/language/data-io/placement-parser.c:409 #, fuzzy, c-format #| msgid "" #| "The record number specified, %ld, is at or before the previous record, " #| "%d. Data fields must be listed in order of increasing record number." msgid "" "The record number specified, %.0f, is at or before the previous record, %d. " "Data fields must be listed in order of increasing record number." msgstr "" "Указанный номер записи, %ld, является номером предварительной записи, %d, " "или предшествует ему. Поля данных в списке должны быть указаны в порядке " "возрастания номеров." #: src/language/data-io/print-space.c:127 #, c-format msgid "The expression on %s evaluated to the system-missing value." msgstr "" "Результатом вычисления выражения %s является значение, которое будет " "пропущено системой." #: src/language/data-io/print-space.c:130 #, c-format msgid "The expression on %s evaluated to %g." msgstr "Вычисленное значение выражения для %s: %g." #: src/language/data-io/print.c:189 src/language/data-io/trim.c:58 msgid "expecting a valid subcommand" msgstr "должна быть указана корректная подкоманда." #: src/language/data-io/print.c:219 #, c-format msgid "%s is required when binary formats are specified." msgstr "%s, требуется, когда указаны двоичные (бинарные) форматы." #: src/language/data-io/print.c:302 #, c-format msgid "Output calls for %d records but %zu specified on RECORDS subcommand." msgstr "" "Для вывода данных нужно %d записей, но в подкоманды RECORDS указано " "количество записей %zu." #: src/language/data-io/print.c:432 #, fuzzy #| msgid "Case Processing Summary" msgid "Print Summary" msgstr "Резюме обработки наблюдений" #: src/language/data-io/print.c:462 #, fuzzy #| msgid "Record" msgid "N of Records" msgstr "Запись" #: src/language/data-io/matrix-data.c:191 #, c-format msgid "" "There are %d variable declared but the data has at least %d matrix rows." msgstr "" #: src/language/data-io/matrix-data.c:292 msgid "" "The N subcommand was specified, but a N record was also found in the data. " "The N record will be ignored." msgstr "" #: src/language/data-io/matrix-data.c:488 src/language/utilities/set.q:186 #, c-format msgid "%s must not be negative." msgstr "%s не должен быть отрицательным." #: src/language/data-io/matrix-data.c:568 #, fuzzy #| msgid "%s and %s are mutually exclusive" msgid "FORMAT = FULL and FORMAT = NODIAGONAL are mutually exclusive." msgstr "%s и %s являются взаимоисключающими" #: src/language/data-io/matrix-reader.c:102 #: src/language/data-io/matrix-reader.c:118 #, fuzzy, c-format #| msgid "Active dataset lacks BY variable %s." msgid "Matrix dataset lacks a variable called %s." msgstr "В активном наборе данных не хватает BY переменной %s." #: src/language/data-io/matrix-reader.c:109 #: src/language/data-io/matrix-reader.c:125 #, c-format msgid "Matrix dataset variable %s should be of string type." msgstr "" #: src/language/data-io/save-translate.c:168 #: src/language/data-io/save-translate.c:183 #, c-format msgid "The %s string must contain exactly one character." msgstr "Строка %s должна содержать только один символ." #: src/language/data-io/save-translate.c:249 #, c-format msgid "Output file `%s' exists but %s was not specified." msgstr "Файл выводимых данных `%s' уже существует, но %s не указано." #: src/language/data-io/save.c:309 msgid "The OUTFILE or METADATA subcommand is required." msgstr "" #: src/language/data-io/trim.c:69 #, c-format msgid "" "Cannot rename %s as %s because there already exists a variable named %s. To " "rename variables with overlapping names, use a single RENAME subcommand such " "as `/RENAME (A=B)(B=C)(C=A)', or equivalently, `/RENAME (A B C=B C A)'." msgstr "" "Переименовать %s на %s невозможно, поскольку переменная с именем %s уже " "существует. Чтобы переименовать переменные без конфликтов названий, " "воспользуйтесь подкомандой RENAME так: `/RENAME (A=B)(B=C)(C=A)', или так: `/" "RENAME (A B C=B C A)'." #: src/language/data-io/trim.c:227 #, c-format msgid "" "Number of variables on left side of `=' (%zu) does not match number of " "variables on right side (%zu), in parenthesized group %d of RENAME " "subcommand." msgstr "" "Количество переменных слева от `=' (%zu) не совпадает с количеством " "переменных справа от знака равенства (%zu) (группа %d в скобках подкоманды " "RENAME)." #: src/language/data-io/trim.c:242 #, c-format msgid "Requested renaming duplicates variable name %s." msgstr "Запрос переименования дубликатов переменной с именем %s." #: src/language/data-io/trim.c:281 msgid "Cannot DROP all variables from dictionary." msgstr "Невозможно выполнить DROP для всех переменных словаря." #: src/language/expressions/evaluate.c:151 msgid "expecting number or string" msgstr "должно быть указано число или строка" #: src/language/expressions/helpers.c:43 msgid "" "One of the arguments to a DATE function is not an integer. The result will " "be system-missing." msgstr "" "Один из аргументов функции DATE не является целым числом. Результат будет " "пропущен системой." #: src/language/expressions/helpers.c:71 msgid "" "The week argument to DATE.WKYR is not an integer. The result will be system-" "missing." msgstr "" "Аргумент недели DATE.WKYR не является целым числом. Результат будет пропущен " "системой." #: src/language/expressions/helpers.c:77 msgid "" "The week argument to DATE.WKYR is outside the acceptable range of 1 to 53. " "The result will be system-missing." msgstr "" "Аргумент недели DATE.WKYR лежит вне допустимого диапазона от 1 до 53. " "Результат будет пропущен системой." #: src/language/expressions/helpers.c:99 msgid "" "The day argument to DATE.YRDAY is not an integer. The result will be system-" "missing." msgstr "" "Аргумент дня DATE.YRDAY не является целым числом. Результат будет пропущен " "системой." #: src/language/expressions/helpers.c:105 msgid "" "The day argument to DATE.YRDAY is outside the acceptable range of 1 to 366. " "The result will be system-missing." msgstr "" "Аргумент дня DATE.YRDAY лежит вне допустимого диапазона от 1 до 366. " "Результат будет пропущен системой." #: src/language/expressions/helpers.c:127 msgid "" "The year argument to YRMODA is greater than 47516. The result will be " "system-missing." msgstr "" "Аргумент года YRMODA превышает 47516. Результат будет пропущен системой." #: src/language/expressions/helpers.c:180 #, c-format msgid "" "Unrecognized date unit `%.*s'. Valid date units are `%s', `%s', `%s', `%s', " "`%s', `%s', `%s', and `%s'." msgstr "" "Неизвестная единица даты, `%.*s'. Корректными единицами даты являются: `%s', " "`%s', `%s', `%s', `%s', `%s', `%s', и `%s'." #: src/language/expressions/helpers.c:333 #, c-format msgid "Invalid DATESUM method. Valid choices are `%s' and `%s'." msgstr "" "Некорректный метод DATESUM. Корректными вариантами являются `%s' и `%s'." #: src/language/expressions/parse.c:261 #, c-format msgid "" "Type mismatch: expression has %s type, but a numeric value is required here." msgstr "" "Несоответствие типов: выражение относится к типу %s, но нужное числовое " "значение." #: src/language/expressions/parse.c:274 #, c-format msgid "" "Type mismatch: expression has %s type, but a string value is required here." msgstr "" "Несоответствие типов: выражение относится к типу %s, но нужное строковое " "значение." #: src/language/expressions/parse.c:436 #, c-format msgid "Type mismatch while applying %s operator: cannot convert %s to %s." msgstr "" "Несоответствие типов во время применения оператора %s: не удалось " "преобразовать %s на %s." #: src/language/expressions/parse.c:650 msgid "" "Chaining relational operators (e.g. `a < b < c') will not produce the " "mathematically expected result. Use the AND logical operator to fix the " "problem (e.g. `a < b AND b < c'). If chaining is really intended, " "parentheses will disable this warning (e.g. `(a < b) < c'.)" msgstr "" "Использование цепочек неравенств (например `a < b < c') не приведет к " "получению математически корректного результата. Используйте логический " "оператор AND чтобы исправить проблему (например `a < b AND b < c'). Если " "без цепочки неравенств не обойтись, используйте скобки, чтобы программа " "больше не показывала это предупреждение (например `(a < b) < c')." #: src/language/expressions/parse.c:752 msgid "" "The exponentiation operator (`**') is left-associative, even though right-" "associative semantics are more useful. That is, `a**b**c' equals " "`(a**b)**c', not as `a**(b**c)'. To disable this warning, insert " "parentheses." msgstr "" "Оператор возведения в степень (`**') исчисляется в направлении слева " "направо, хотя предпочтительнее могло бы быть вычисление справа налево. Это " "означает, что `a**b**c' равно `(a**b)**c', а не `a**(b**c)'. Чтобы " "отключить это предупреждение, вставьте круглые скобки." #: src/language/expressions/parse.c:832 #, c-format msgid "Unknown system variable %s." msgstr "Неизвестная системная переменная %s." #: src/language/expressions/parse.c:880 #, c-format msgid "Unknown identifier %s." msgstr "Неизвестный идентификатор %s." #: src/language/expressions/parse.c:1102 #, c-format msgid "%s must have at least %d arguments in list." msgstr "%s должен иметь по крайней мере %d аргументов в списке." #: src/language/expressions/parse.c:1111 #, c-format msgid "%s must have an even number of arguments in list." msgstr "%s должна иметь четное количество аргументов в списке." #: src/language/expressions/parse.c:1114 #, c-format msgid "%s must have multiple of %d arguments in list." msgstr "Количество аргументов %s должно быть кратным %d." #: src/language/expressions/parse.c:1124 #, c-format msgid "%s function does not accept a minimum valid argument count." msgstr "%s функция не принимает минимальное допустимое количество аргументов." #: src/language/expressions/parse.c:1133 #, c-format msgid "%s requires at least %d valid arguments in list." msgstr "%s требует по крайней мере %d корректных аргументов в списке." #: src/language/expressions/parse.c:1139 #, c-format msgid "" "With %s, using minimum valid argument count of %d does not make sense when " "passing only %d arguments in list." msgstr "" "Если используется %s, использование минимальной корректного количества " "аргументов %d лишено смысла, а в списке передается только %d аргументов." #: src/language/expressions/parse.c:1193 #, c-format msgid "Type mismatch invoking %s as " msgstr "Несоответствие типов во время попытки вызвать %s как " #: src/language/expressions/parse.c:1198 msgid "Function invocation " msgstr "Вызов функции " #: src/language/expressions/parse.c:1200 msgid " does not match any known function. Candidates are:" msgstr "не соответствует любой известной функции. Кандидаты:" #: src/language/expressions/parse.c:1230 #, c-format msgid "No function or vector named %s." msgstr "Нет функции или вектора с именем %s." #: src/language/expressions/parse.c:1292 #, c-format msgid "%s is a PSPP extension." msgstr "%s является расширением PSPP." #: src/language/expressions/parse.c:1295 #, c-format msgid "%s is not available in this version of PSPP." msgstr "%s нельзя использовать в этой версии PSPP." #: src/language/expressions/parse.c:1302 #, c-format msgid "%s may not appear after %s." msgstr "%s не может использоваться после %s." #: src/libpspp/ext-array.c:66 msgid "failed to create temporary file" msgstr "не удалось создать временный файл" #: src/libpspp/ext-array.c:106 msgid "seeking in temporary file" msgstr "выполняем позиционирование во временном файле" #: src/libpspp/ext-array.c:125 msgid "reading temporary file" msgstr "читаем временный файл" #: src/libpspp/ext-array.c:127 msgid "unexpected end of file reading temporary file" msgstr "неожиданный конец файла при чтении файла временных данных" #: src/libpspp/ext-array.c:147 msgid "writing to temporary file" msgstr "записываем данные из временного файла" #: src/libpspp/i18n.c:1128 msgid "Arabic" msgstr "арабский" #: src/libpspp/i18n.c:1130 msgid "Armenian" msgstr "армянский" #: src/libpspp/i18n.c:1131 msgid "Baltic" msgstr "прибалтийский" #: src/libpspp/i18n.c:1133 msgid "Celtic" msgstr "кельтский" #: src/libpspp/i18n.c:1134 msgid "Central European" msgstr "Центральноевропейский" #: src/libpspp/i18n.c:1136 msgid "Chinese Simplified" msgstr "китайский (упрощенный)" #: src/libpspp/i18n.c:1138 msgid "Chinese Traditional" msgstr "китайский (традиционный)" #: src/libpspp/i18n.c:1140 msgid "Croatian" msgstr "хорватский" #: src/libpspp/i18n.c:1141 msgid "Cyrillic" msgstr "кириллица" #: src/libpspp/i18n.c:1143 msgid "Cyrillic/Russian" msgstr "кириллица/русский" #: src/libpspp/i18n.c:1144 msgid "Cyrillic/Ukrainian" msgstr "кириллица/украинский" #: src/libpspp/i18n.c:1146 msgid "Georgian" msgstr "грузинский" #: src/libpspp/i18n.c:1147 msgid "Greek" msgstr "греческий" #: src/libpspp/i18n.c:1148 msgid "Gujarati" msgstr "гуджарати" #: src/libpspp/i18n.c:1149 msgid "Gurmukhi" msgstr "гурмукх" #: src/libpspp/i18n.c:1150 msgid "Hebrew" msgstr "иврит" #: src/libpspp/i18n.c:1152 msgid "Hebrew Visual" msgstr "иврит (визуальный)" #: src/libpspp/i18n.c:1153 msgid "Hindi" msgstr "хинди" #: src/libpspp/i18n.c:1154 msgid "Icelandic" msgstr "исландский" #: src/libpspp/i18n.c:1155 msgid "Japanese" msgstr "японский" #: src/libpspp/i18n.c:1157 msgid "Korean" msgstr "корейский" #: src/libpspp/i18n.c:1159 msgid "Nordic" msgstr "скандинавский" #: src/libpspp/i18n.c:1160 msgid "Romanian" msgstr "румынский" #: src/libpspp/i18n.c:1162 msgid "South European" msgstr "южноевропейский" #: src/libpspp/i18n.c:1163 msgid "Thai" msgstr "тайский" #: src/libpspp/i18n.c:1165 msgid "Turkish" msgstr "турецкий" #: src/libpspp/i18n.c:1167 msgid "Vietnamese" msgstr "вьетнамский" #: src/libpspp/i18n.c:1169 msgid "Western European" msgstr "западноевропейский" #: src/libpspp/message.c:89 #, c-format msgid "%s: %s" msgstr "%s: %s" #: src/libpspp/message.c:113 msgid "error" msgstr "ошибка" #: src/libpspp/message.c:115 msgid "warning" msgstr "предупреждение" #: src/libpspp/message.c:118 msgid "note" msgstr "заметка" #: src/libpspp/message.c:327 #, c-format msgid "Notes (%d) exceed limit (%d). Suppressing further notes." msgstr "" "Заметки (%d) превышают предел (%d). Вывод дальнейших заметок прекращен." #: src/libpspp/message.c:335 #, c-format msgid "Warnings (%d) exceed limit (%d). Syntax processing will be halted." msgstr "" "Предупреждения (%d) превышают предел (%d). Обработка синтаксических " "конструкций будет прервана." #: src/libpspp/message.c:338 #, c-format msgid "Errors (%d) exceed limit (%d). Syntax processing will be halted." msgstr "" "Ошибки (%d) превышают предел (%d). Обработка синтаксических конструкций " "будет прервана." #: src/libpspp/zip-reader.c:202 #, fuzzy, c-format #| msgid "Corrupt file at 0x%llx: Expected %; got %" msgid "%s: corrupt archive at 0x%llx: expected %# but got %#" msgstr "" "Файл поврежден в позиции 0x%llx: ожидалось %; получено %" #: src/libpspp/zip-reader.c:329 src/libpspp/zip-reader.c:449 #, fuzzy, c-format #| msgid "%s: seek failed (%s)." msgid "%s: open failed (%s)" msgstr "%s: ошибка позиционирования (%s)." #: src/libpspp/zip-reader.c:344 #, fuzzy, c-format #| msgid "Cannot find central directory" msgid "%s: cannot find central directory" msgstr "Не удалось найти центральный каталог" #: src/libpspp/zip-reader.c:353 src/libpspp/zip-reader.c:384 #: src/libpspp/zip-reader.c:468 #, fuzzy, c-format #| msgid "%s: seek failed (%s)." msgid "%s: seek failed (%s)" msgstr "%s: ошибка позиционирования (%s)." #: src/libpspp/zip-reader.c:441 #, fuzzy, c-format #| msgid "%s: unknown option `%s'" msgid "%s: unknown member \"%s\"" msgstr "%s: неизвестный параметр `%s'" #: src/libpspp/zip-reader.c:503 #, fuzzy, c-format #| msgid "" #| "Name mismatch in zip archive. Central directory says `%s'; local file " #| "header says `%s'" msgid "" "%s: name mismatch between central directory (%s) and local file header (%s)" msgstr "" "Несоответствие названия в архиве zip. В центральном каталоге указано `%s', а " "название локального файла определяет `%s'." #: src/libpspp/zip-reader.c:696 #, fuzzy, c-format #| msgid "Cannot initialize inflator: %s" msgid "%s: cannot initialize inflator (%s)" msgstr "Не удалось инициализировать средство сжатия: %s" #: src/libpspp/zip-reader.c:751 #, fuzzy, c-format #| msgid "Error inflating: %s" msgid "%s: error inflating \"%s\" (%s)" msgstr "Ошибка во время сжатия: %s" #: src/libpspp/zip-writer.c:97 utilities/pspp-convert.c:346 #, c-format msgid "%s: error opening output file" msgstr "%s: ошибка при попытке открыть файл результатов" #: src/libpspp/zip-writer.c:169 #, c-format msgid "%s: error seeking in output file" msgstr "" "%s: ошибка во время попытки выполнить позиционирование в файле результатов" #: src/libpspp/zip-writer.c:210 msgid "error creating temporary file" msgstr "ошибка при создании временного файла" #: src/libpspp/zip-writer.c:279 #, c-format msgid "%s: write failed" msgstr "%s: ошибка при попытке записи" #. TRANSLATORS: This is a format string which, when presented to #. printf like functions, will create a pango markup string to #. display real number in scientific notation. #. #. In its untranslated form, it will display similar to "1.23 x 10^4". You #. can leave it untranslated if this is how scientific notation is usually #. presented in your language. #. #. Some locales (such as German) prefer the centered dot rather than the #. multiplication sign between the mantissa an exponent. In which #. case, you can change "#215;" to "#8901;" or other unicode code #. point as appropriate. #. #. The . in this string does not and should not be changed, since #. that is taken care of by the stdc library. #. #. For information on Pango markup, see #. http://developer.gnome.org/pango/stable/PangoMarkupFormat.html #. #. For tables of unicode code points, see http://unicode.org/charts #. #: src/math/chart-geometry.c:123 #, c-format msgid "%%.%dlf×10%d" msgstr "%%.%dlf×10%d" #: src/math/histogram.c:145 msgid "" "Not creating histogram because the data contains less than 2 distinct values" msgstr "" "Гистограмма не создана, поскольку данные содержат менее 2 различных значений" #: src/math/percentiles.c:36 msgid "HAverage" msgstr "Нормальное среднее" #: src/math/percentiles.c:38 msgid "Rounded" msgstr "Округленное" #: src/math/percentiles.c:39 msgid "Empirical" msgstr "Эмпирическое" #: src/math/percentiles.c:40 msgid "Empirical with averaging" msgstr "Эмпирическое с усреднением" #: src/math/shapiro-wilk.c:84 msgid "" "One or more weight values are non-integer. Fractional parts will be ignored " "when calculating the Shapiro-Wilk statistic." msgstr "" #: src/output/ascii.c:340 #, c-format msgid "ascii: opening output file `%s'" msgstr "ascii: открываем файл выводимых результатов `%s'" #: src/output/ascii.c:371 #, c-format msgid "%s: %s must be positive integer or `auto'" msgstr "%s: %s должно быть положительным целым числом или `auto'" #: src/output/ascii.c:393 #, fuzzy, c-format #| msgid "" #| "ascii: page excluding margins and headers must be at least %d characters " #| "wide by %d lines long, but as configured is only %d characters by %d lines" msgid "" "ascii: page must be at least %d characters wide, but as configured is only " "%d characters" msgstr "" "в ASCII: страницы исключая отступы и заголовки должны быть как минимум %d " "символов в ширину и %d строк данных, но было настроено только %d символов " "строк %d" #: src/output/ascii.c:508 #, c-format msgid "See %s for a chart." msgstr "Диаграмма сохранена в %s." #: src/output/charts/piechart.c:54 msgid "*MISSING*" msgstr "*ПРОПУЩЕНО*" #: src/output/csv.c:100 src/output/html.c:117 src/output/journal.c:166 #: src/output/msglog.c:68 #, c-format msgid "error opening output file `%s'" msgstr "ошибка при попытке открыть файл выводимых данных `%s'" #: src/output/driver.c:522 #, c-format msgid "%s is not a valid device type (the choices are `%s' and `%s')" msgstr "" "%s не является корректным типом устройства (возможные варианты: `%s' и `%s')" #: src/output/driver.c:536 #, c-format msgid "%s: unknown option `%s'" msgstr "%s: неизвестный параметр `%s'" #: src/output/driver.c:553 #, c-format msgid "%s: output option missing `='" msgstr "%s: в параметре вывода результатов пропущено `='" #: src/output/driver.c:560 #, c-format msgid "%s: output option specified more than once" msgstr "%s: параметр вывода результатов указан несколько раз" #: src/output/html.c:129 msgid "PSPP Output" msgstr "Вывод PSPP" #: src/output/html.c:266 msgid "No description" msgstr "Нет описания" #: src/output/journal.c:69 #, c-format msgid "error writing output file `%s'" msgstr "ошибка при записи файла результатов `%s'" #: src/output/measure.c:68 #, c-format msgid "`%s' is not a valid length." msgstr "`%s' не является корректным значением длины." #: src/output/measure.c:96 #, c-format msgid "syntax error in paper size `%s'" msgstr "синтаксическая ошибка в размере листа `%s'" #: src/output/measure.c:233 #, c-format msgid "unknown paper type `%.*s'" msgstr "неизвестный тип листа, `%.*s'" #: src/output/measure.c:251 #, c-format msgid "error opening input file `%s'" msgstr "ошибка при попытке открыть файл входных данных `%s'" #: src/output/measure.c:279 #, fuzzy, c-format #| msgid "paper size file `%s' does not state a paper size" msgid "file `%s' does not state a paper size" msgstr "файл размера листов `%s' не определяет размера листа" #: src/output/options.c:112 #, c-format msgid "%s: `%s' is `%s' but a Boolean value is required" msgstr "%s: `%s' равен `%s', но требуется логическое значение" #: src/output/options.c:187 #, c-format msgid "%s: `%s' is `%s' but one of the following is required: %s" msgstr "%s: `%s' равен `%s', но требуется одно из следующих значений: %s" #: src/output/options.c:231 #, fuzzy, c-format #| msgid "%s: `%s' is `%s' but a nonnegative integer is required" msgid "%s: `%s' is `%s' but a non-negative integer is required" msgstr "" "%s: `%s' равен `%s', но должно быть использовано неотрицательное целое число" #: src/output/options.c:235 #, c-format msgid "%s: `%s' is `%s' but a positive integer is required" msgstr "" "%s: `%s' равен `%s', но должно быть использовано положительное целое число" #: src/output/options.c:238 #, c-format msgid "%s: `%s' is `%s' but an integer is required" msgstr "%s: `%s' равен `%s', но должно быть указано целое число" #: src/output/options.c:241 #, c-format msgid "%s: `%s' is `%s' but an integer greater than %d is required" msgstr "" "%s: `%s' равен `%s', но должно быть указано целое число, которое превышает %d" #: src/output/options.c:246 #, c-format msgid "%s: `%s' is `%s' but an integer between %d and %d is required" msgstr "%s: `%s' есть `%s', но требуется целое число между %d и %d" #: src/output/options.c:325 #, c-format msgid "%s: `%s' is `%s' but a file name that contains `#' is required." msgstr "" "%s: `%s' равен `%s', но должно быть указано название файла, которое содержит " "`#'." #. TRANSLATORS: Do not translate this string. If the script of your language #. reads from right to left (eg Persian, Arabic, Hebrew etc), then replace #. this string with "output-direction-rtl". Otherwise either leave it #. untranslated or copy it verbatim. #: src/output/render.c:994 msgid "output-direction-ltr" msgstr "" #: src/output/text-item.c:44 msgid "Page Title" msgstr "" #: src/output/text-item.c:47 msgid "Title" msgstr "" #: src/output/text-item.c:51 msgid "Log" msgstr "" #: src/output/text-item.c:54 msgid "Page Break" msgstr "" #: src/output/cairo.c:520 #, c-format msgid "`%s': bad font specification" msgstr "`%s': ошибочная спецификация шрифта" #: src/output/cairo.c:744 #, c-format msgid "" "The defined page is not wide enough to hold at least %d characters in the " "default font. In fact, there's only room for %d characters." msgstr "" "Определенные страницы не достаточно широки для того, чтобы содержать по " "крайней мере %d символов текста, исполненных шрифтом по умолчанию. " "Фактически, на ней есть место только для %d символов. " #: src/output/cairo.c:752 #, c-format msgid "" "The defined page is not long enough to hold at least %d lines in the default " "font. In fact, there's only room for %d lines." msgstr "" "Определенные страницы не достаточно широки для того, чтобы содержать по " "крайней мере %d строк текста, исполненных шрифтом по умолчанию. Фактически, " "на нем есть место только для %d строк." #: src/output/cairo.c:837 #, c-format msgid "error opening output file `%s': %s" msgstr "ошибка при попытке открыть файл результатов `%s': %s" #: src/output/cairo.c:892 #, c-format msgid "error drawing output for %s driver: %s" msgstr "ошибка обработки драйвера %s: %s" #: src/output/cairo.c:2056 #, c-format msgid "error writing output file `%s': %s" msgstr "ошибка при записи файла результатов `%s': %s" #: src/output/charts/np-plot-cairo.c:37 #, c-format msgid "Normal Q-Q Plot of %s" msgstr "Нормальная диаграмма Q-Q без тренда %s" #: src/output/charts/np-plot-cairo.c:38 src/output/charts/np-plot-cairo.c:68 msgid "Observed Value" msgstr "Наблюдаемое Значение" #: src/output/charts/np-plot-cairo.c:39 msgid "Expected Normal" msgstr "Ожидаемый нормальный" #: src/output/charts/np-plot-cairo.c:67 #, c-format msgid "Detrended Normal Q-Q Plot of %s" msgstr "Нормальная диаграмма Q-Q без тренда %s" #: src/output/charts/np-plot-cairo.c:69 msgid "Dev from Normal" msgstr "Откл. от нормы" #: src/output/charts/barchart-cairo.c:65 msgid "Bar Chart" msgstr "Столбчатая диаграмма" #: src/output/charts/plot-hist-cairo.c:43 #, c-format msgid "N = %.2f" msgstr "N = %.2f" #: src/output/charts/plot-hist-cairo.c:52 #, c-format msgid "Mean = %.1f" msgstr "Среднее = %.1f" #: src/output/charts/plot-hist-cairo.c:61 #, c-format msgid "Std. Dev = %.2f" msgstr "Станд. откл. = %.2f" #: src/output/charts/plot-hist-cairo.c:110 msgid "HISTOGRAM" msgstr "ГИСТОГРАММА" #: src/output/charts/roc-chart-cairo.c:36 src/ui/gui/roc.ui:24 msgid "ROC Curve" msgstr "ROC-кривая" #: src/output/charts/scree-cairo.c:36 msgid "Scree Plot" msgstr "График собственных значений" #: src/output/charts/scree-cairo.c:38 msgid "Eigenvalue" msgstr "Собственное значение" #: src/output/charts/spreadlevel-cairo.c:37 #, c-format msgid "Spread vs. Level Plot of %s" msgstr "Рассеивание от среднего уровня %s" #: src/output/charts/spreadlevel-cairo.c:38 msgid "Level" msgstr "Уровень" #: src/output/charts/spreadlevel-cairo.c:39 msgid "Spread" msgstr "Рассеивание" #: src/output/charts/scatterplot-cairo.c:57 #, c-format msgid "Scatterplot %s" msgstr "Точечная диаграмма %s" #: src/output/spv/spv-legacy-decoder.c:2222 msgid "Table lacks cell data." msgstr "" #: src/output/spv/spv-writer.c:68 #, fuzzy, c-format #| msgid "%s: write failed" msgid "%s: create failed" msgstr "%s: ошибка при попытке записи" #: src/output/spv/spv-writer.c:89 #, fuzzy #| msgid "%s: error writing output file" msgid "I/O error writing SPV file" msgstr "%s: ошибка при попытке записи файла результатов" #: src/output/spv/spv.c:693 #, fuzzy, c-format #| msgid "failed to create temporary file" msgid "%s: Failed to create XML parser" msgstr "не удалось создать временный файл" #: src/output/spv/spv.c:718 #, c-format msgid "%s: document is not well-formed" msgstr "" #: src/output/spv/spv.c:726 #, c-format msgid "%s: root node is \"%s\" but \"%s\" was expected" msgstr "" #: src/ui/gui/psppire-acr.c:273 msgid "Add" msgstr "" #: src/ui/gui/psppire-acr.c:274 #, fuzzy #| msgid "_Edit" msgid "Edit" msgstr "_Редактировать" #: src/ui/gui/psppire-acr.c:275 msgid "Remove" msgstr "" #: src/ui/gui/psppire-buttonbox.c:311 msgid "OK" msgstr "" #: src/ui/gui/psppire-buttonbox.c:319 msgid "Go To" msgstr "" #: src/ui/gui/psppire-buttonbox.c:327 msgid "Continue" msgstr "Продолжить" #: src/ui/gui/psppire-buttonbox.c:339 src/ui/gui/psppire-import-assistant.c:759 msgid "Paste" msgstr "" #: src/ui/gui/psppire-buttonbox.c:345 #: src/ui/gui/psppire-dialog-action-aggregate.c:216 #: src/ui/gui/psppire-data-window.c:496 src/ui/gui/psppire-data-window.c:624 #: src/ui/gui/psppire-output-window.c:353 #: src/ui/gui/psppire-syntax-window.c:594 src/ui/gui/psppire-window.c:445 #: src/ui/gui/psppire-window.c:628 #, fuzzy #| msgid "Covariance" msgid "Cancel" msgstr "Ковариация" #: src/ui/gui/psppire-buttonbox.c:351 msgid "Close" msgstr "" #: src/ui/gui/psppire-buttonbox.c:358 src/ui/gui/psppire-import-assistant.c:760 #, fuzzy #| msgid "_Reset" msgid "Reset" msgstr "_Сброс" #: src/ui/gui/psppire-buttonbox.c:365 #, fuzzy #| msgid "_Help" msgid "Help" msgstr "_Помощь" #: src/ui/gui/psppire-dialog-action-aggregate.c:213 msgid "Aggregate destination file" msgstr "Агрегировать файл назначения" #: src/ui/gui/psppire-dialog-action-aggregate.c:217 #: src/ui/gui/psppire-data-window.c:493 src/ui/gui/psppire-data-window.c:497 #: src/ui/gui/psppire-output-window.c:354 #: src/ui/gui/psppire-syntax-window.c:595 src/ui/gui/psppire-window.c:449 #: src/ui/gui/aggregate.ui:565 msgid "Save" msgstr "Сохранить" #: src/ui/gui/psppire-dialog-action-aggregate.c:226 #: src/ui/gui/psppire-data-window.c:503 msgid "System Files (*.sav)" msgstr "системные файлы (*.sav)" #: src/ui/gui/psppire-dialog-action-aggregate.c:231 #: src/ui/gui/psppire-data-window.c:508 msgid "Compressed System Files (*.zsav)" msgstr "Сжатые Системные Файлы (*.zsav)" #: src/ui/gui/psppire-dialog-action-aggregate.c:236 #: src/ui/gui/psppire-data-window.c:513 src/ui/gui/psppire-window.c:652 msgid "Portable Files (*.por) " msgstr "Портативные Файлы (*.por) " #: src/ui/gui/psppire-dialog-action-autorecode.c:337 #: src/ui/gui/psppire-dialog-action-recode.c:535 #: src/ui/gui/psppire-dialog-action-recode-different.c:288 msgid "New" msgstr "Новое" #: src/ui/gui/psppire-dialog-action-autorecode.c:351 #: src/ui/gui/psppire-dialog-action-recode.c:527 #: src/ui/gui/psppire-dialog-action-recode-different.c:301 msgid "Old" msgstr "Предыдущее" #: src/ui/gui/psppire-dialog-action-comments.c:142 #, c-format msgid "Column Number: %d" msgstr "Номер столбца: %d" #: src/ui/gui/psppire-dialog-action-crosstabs.c:71 msgid "Chisq" msgstr "критерий χ2" #: src/ui/gui/psppire-dialog-action-crosstabs.c:71 msgid "" "Pearson chi-square, likelihood ratio, Fisher’s exact test, continuity " "correction, linear-by-linear association." msgstr "" #: src/ui/gui/psppire-dialog-action-crosstabs.c:74 #: src/language/stats/crosstabs.q:1334 msgid "Phi" msgstr "φ" #: src/ui/gui/psppire-dialog-action-crosstabs.c:75 msgid "CC" msgstr "Коэф. спряж." #: src/ui/gui/psppire-dialog-action-crosstabs.c:75 #, fuzzy #| msgid "Contingency Coefficient" msgid "Contingency coefficient" msgstr "Коэффициент непредсказуемости" #: src/ui/gui/psppire-dialog-action-crosstabs.c:77 msgid "UC" msgstr "Коэф. невизн." #: src/ui/gui/psppire-dialog-action-crosstabs.c:77 #, fuzzy #| msgid "Uncertainty Coefficient" msgid "Uncertainty coefficient" msgstr "Коэффициент неопределенности" #: src/ui/gui/psppire-dialog-action-crosstabs.c:78 msgid "BTau" msgstr "τ-b Кендала" #: src/ui/gui/psppire-dialog-action-crosstabs.c:78 #, fuzzy #| msgid "Kendall's tau-b" msgid "Kendall's Tau-b" msgstr "τ-b Кендала" #: src/ui/gui/psppire-dialog-action-crosstabs.c:79 msgid "CTau" msgstr "τ-c Кендала" #: src/ui/gui/psppire-dialog-action-crosstabs.c:79 #, fuzzy #| msgid "Kendall's tau-c" msgid "Kendall's Tau-c" msgstr "τ-c Кендала" #: src/ui/gui/psppire-dialog-action-crosstabs.c:80 msgid "Risk" msgstr "Риск" #: src/ui/gui/psppire-dialog-action-crosstabs.c:80 #, fuzzy #| msgid "Risk estimate." msgid "Relative Risk estimate" msgstr "Оценка риска." #: src/ui/gui/psppire-dialog-action-crosstabs.c:81 #: src/language/stats/crosstabs.q:1338 msgid "Gamma" msgstr "γ" #: src/ui/gui/psppire-dialog-action-crosstabs.c:82 msgid "D" msgstr "d Сомерса" #: src/ui/gui/psppire-dialog-action-crosstabs.c:82 #, fuzzy #| msgid "Somers' d" msgid "Somer's d" msgstr "d Сомерса" #: src/ui/gui/psppire-dialog-action-crosstabs.c:83 #: src/language/stats/crosstabs.q:1344 msgid "Kappa" msgstr "ϰ" #: src/ui/gui/psppire-dialog-action-crosstabs.c:83 msgid "Cohen's Kappa" msgstr "" #: src/ui/gui/psppire-dialog-action-crosstabs.c:84 #: src/language/stats/crosstabs.q:1429 msgid "Eta" msgstr "η" #: src/ui/gui/psppire-dialog-action-crosstabs.c:85 msgid "Corr" msgstr "Корреляции" #: src/ui/gui/psppire-dialog-action-crosstabs.c:85 #, fuzzy #| msgid "Spearman Correlation" msgid "Spearman correlation, Pearson's r" msgstr "Корреляция Спирмена" #: src/ui/gui/psppire-dialog-action-crosstabs.c:90 #, fuzzy #| msgid "Frequency" msgid "Frequency Count" msgstr "Частота" #: src/ui/gui/psppire-dialog-action-crosstabs.c:91 msgid "Row" msgstr "Строка" #: src/ui/gui/psppire-dialog-action-crosstabs.c:91 #, fuzzy #| msgid "Percent" msgid "Row percent" msgstr "Процент" #: src/ui/gui/psppire-dialog-action-crosstabs.c:92 msgid "Column" msgstr "Столбец" #: src/ui/gui/psppire-dialog-action-crosstabs.c:92 #, fuzzy #| msgid "Cum Percent" msgid "Column percent" msgstr "Накоп. процент" #: src/ui/gui/psppire-dialog-action-crosstabs.c:93 #, fuzzy #| msgid "Valid Percent" msgid "Total percent" msgstr "Корректный процент" #: src/ui/gui/psppire-dialog-action-crosstabs.c:94 #: src/language/stats/crosstabs.q:1266 msgid "Expected" msgstr "Ожидаемые" #: src/ui/gui/psppire-dialog-action-crosstabs.c:94 #, fuzzy #| msgid "Expected Values:" msgid "Expected value" msgstr "Ожидаемые значения:" #: src/ui/gui/psppire-dialog-action-crosstabs.c:96 #: src/language/stats/crosstabs.q:1268 msgid "Std. Residual" msgstr "Станд. остатки" #: src/ui/gui/psppire-dialog-action-crosstabs.c:96 #, fuzzy #| msgid "Std. Residual" msgid "Standardized Residual" msgstr "Станд. остатки" #: src/ui/gui/psppire-dialog-action-crosstabs.c:97 msgid "Adjusted Std. Residual" msgstr "Корректируемые станд. остатки" #: src/ui/gui/psppire-dialog-action-descriptives.c:45 msgid "Standard error" msgstr "Стандартная погрешность" #: src/ui/gui/psppire-dialog-action-descriptives.c:45 #, fuzzy #| msgid "Standard error of the mean" msgid "Standard error of mean" msgstr "Стандартная ошибка среднего" #: src/ui/gui/psppire-dialog-action-descriptives.c:47 #, fuzzy #| msgid "Standard error of the kurtosis" msgid "Kurtosis and standard error of kurtosis" msgstr "Стандартная ошибка эксцесса" #: src/ui/gui/psppire-dialog-action-descriptives.c:48 #, fuzzy #| msgid "Standard error of the skewness" msgid "Skewness and standard error of skewness" msgstr "Стандартная погрешность асимметрии" #: src/ui/gui/psppire-dialog-action-factor.c:323 #, c-format msgid "_Eigenvalues over %4.2f times the mean eigenvalue" msgstr "_Значения, превышающие более чем в %4.2f раз среднее значение" #: src/ui/gui/psppire-dialog-action-frequencies.c:44 msgid "Standard error of the mean" msgstr "Стандартная ошибка среднего" #: src/ui/gui/psppire-dialog-action-frequencies.c:47 msgid "Standard error of the skewness" msgstr "Стандартная погрешность асимметрии" #: src/ui/gui/psppire-dialog-action-frequencies.c:51 msgid "Standard error of the kurtosis" msgstr "Стандартная ошибка эксцесса" #: src/ui/gui/psppire-dialog-action-oneway.c:175 #, c-format msgid "Contrast %d of %d" msgstr "Контраст %d из %d" #: src/ui/gui/psppire-dialog-action-paired.c:162 src/ui/gui/examine.ui:282 #: src/ui/gui/indep-samples.ui:334 src/ui/gui/t-test.ui:296 msgid "O_ptions..." msgstr "П_араметры..." #: src/ui/gui/psppire-dialog-action-paired.c:168 msgid "Paired Samples T Test" msgstr "T-проверка парных выборок" #: src/ui/gui/psppire-dialog-action-recode-different.c:327 msgid "Recode into Different Variables" msgstr "Перекодировать в других переменных" #: src/ui/gui/psppire-dialog-action-recode-different.c:330 msgid "Recode into Different Variables: Old and New Values " msgstr "Перекодировка в другие переменные: предыдущие и новые значения " #: src/ui/gui/psppire-dialog-action-recode-same.c:108 src/ui/gui/recode.ui:391 msgid "Recode into Same Variables" msgstr "Перекодировать в тех же самых переменных" #: src/ui/gui/psppire-dialog-action-recode-same.c:114 msgid "Recode into Same Variables: Old and New Values" msgstr "Перекодирование в те же переменные: предыдущие и новые значения" #: src/ui/gui/psppire-dialog-action-regression.c:40 msgid "Coeff" msgstr "Коэффициенты" #: src/ui/gui/psppire-dialog-action-regression.c:40 msgid "Show the regression coefficients" msgstr "Показать коэффициенты регрессии" #: src/ui/gui/psppire-dialog-action-regression.c:41 msgid "Conf. Interval" msgstr "Доверительный интервал" #: src/ui/gui/psppire-dialog-action-regression.c:41 msgid "Show the confidence interval for the regression coefficients" msgstr "Показать доверительный интервал для коэффициентов регрессии" #: src/ui/gui/psppire-dialog-action-regression.c:42 msgid "Show the correlation between observed and predicted values" msgstr "" "Показать корреляцию между значениями в наблюдениях и ожидаемыми значениями" #: src/ui/gui/psppire-dialog-action-regression.c:43 msgid "Anova" msgstr "ANOVA" #: src/ui/gui/psppire-dialog-action-regression.c:43 msgid "Show the analysis of variance table" msgstr "Показать анализ дисперсионной таблицы" #: src/ui/gui/psppire-dialog-action-regression.c:44 msgid "Bcov" msgstr "Ковар. матрица" #: src/ui/gui/psppire-dialog-action-regression.c:44 msgid "Show the variance coefficient matrix" msgstr "Показать матрицу коэффициентов дисперсии" #: src/ui/gui/psppire-dialog-action-regression.c:45 #, fuzzy #| msgid "Total" msgid "Tol" msgstr "Итого" #: src/ui/gui/psppire-dialog-action-regression.c:45 #, fuzzy #| msgid "Show the variance coefficient matrix" msgid "Show the variance inflation factor and its reciprocal" msgstr "Показать матрицу коэффициентов дисперсии" #: src/ui/gui/psppire-dialog-action-select.c:88 #, c-format msgid "Approximately %3d%% of all cases." msgstr "Приблизительно %3d%% всех наблюдений." #: src/ui/gui/psppire-dialog-action-select.c:89 #, c-format msgid "Exactly %3d cases from the first %3d cases." msgstr "Точно %3d наблюдений из первых %3d наблюдений." #: src/ui/gui/psppire-dialog-action-select.c:236 #, c-format msgid "%d thru %d" msgstr "%d до %d" #: src/ui/gui/psppire-dialog-action-two-sample.c:180 #: src/ui/gui/k-independent.ui:404 src/ui/gui/k-related.ui:197 msgid "Test Type" msgstr "Тип теста" #: src/ui/gui/psppire-dialog-action-two-sample.c:189 msgid "_Wilcoxon" msgstr "_Уилкоксона" #: src/ui/gui/psppire-dialog-action-two-sample.c:190 msgid "_Sign" msgstr "_Знак" #: src/ui/gui/psppire-dialog-action-two-sample.c:191 msgid "_McNemar" msgstr "_МакНемара" #: src/ui/gui/psppire-dialog-action-two-sample.c:209 msgid "Two-Related-Samples Tests" msgstr "Проверки двух связанных выборок" #: src/ui/gui/psppire-dialog-action-weight.c:74 src/ui/gui/weight.ui:83 #: src/ui/gui/weight.ui:211 msgid "Do not weight cases" msgstr "Не взвешивать наблюдения" #: src/ui/gui/psppire-dialog-action-weight.c:80 #, c-format msgid "Weight cases by %s" msgstr "Взвесить наблюдения за %s" #: src/ui/gui/psppire-dict.c:95 #, fuzzy #| msgid "Var%d" msgid "Var" msgstr "Изменений%d" #. TRANSLATORS: This string must be a valid variable name. That means: #. - The string must be at most 64 bytes (not characters) long. #. - The string may not contain whitespace. #. - The first character may not be '$' #. - The first character may not be a digit #. - The final character may not be '.' or '_' #. #: src/ui/gui/psppire-dict.c:385 #, c-format msgid "Var%04d" msgstr "Переменная%04d" #: src/ui/gui/psppire-dict.c:566 msgid "Duplicate variable name." msgstr "Дублирование названия переменной." #: src/ui/gui/psppire-dictview.c:617 msgid "Prefer variable labels" msgstr "Преимущество переменных меток" #: src/ui/gui/psppire-dictview.c:631 msgid "Default sort order" msgstr "" #: src/ui/gui/psppire-dictview.c:637 msgid "Unsorted (dictionary order)" msgstr "Без сортировки (порядок словаря)" #: src/ui/gui/psppire-dictview.c:642 msgid "Sort by name" msgstr "Упорядочить по названию" #: src/ui/gui/psppire-dictview.c:647 msgid "Sort by label" msgstr "Упорядочить по ярлыку" #: src/ui/gui/psppire-means-layer.c:95 #, c-format msgid "Layer %d of %d" msgstr "Слой %d из %d" #: src/ui/gui/psppire-means-layer.c:169 msgid "Forward" msgstr "" #: src/ui/gui/psppire-means-layer.c:170 msgid "Back" msgstr "" #: src/ui/gui/psppire-text-file.c:55 #, c-format msgid "Could not open `%s'" msgstr "Не удалось открыть `%s'" #: src/ui/gui/psppire-text-file.c:71 #, c-format msgid "Error reading `%s': %s" msgstr "Ошибка во время чтения `%s': %s" #: src/ui/gui/psppire-text-file.c:74 #, c-format msgid "" "Failed to read `%s', because it contains a line over %d bytes long and " "therefore appears not to be a text file." msgstr "" "Не удалось прочитать данные из `%s', поскольку в файле содержится строка " "объемом более %d байт, вероятно, этот файл не является текстовым." #: src/ui/gui/psppire-text-file.c:96 #, c-format msgid "`%s' is empty." msgstr "`%s' является пустым." #: src/ui/gui/psppire-val-chooser.c:255 msgid "through" msgstr "через" #: src/ui/gui/psppire-val-chooser.c:288 msgid "_Value:" msgstr "_Значение:" #: src/ui/gui/psppire-val-chooser.c:289 msgid "_System Missing" msgstr "_Пропущенное системой" #: src/ui/gui/psppire-val-chooser.c:290 msgid "System _or User Missing" msgstr "Пропущенное системой _или Пользователем" #: src/ui/gui/psppire-val-chooser.c:291 msgid "_Range:" msgstr "_Диапазон:" #: src/ui/gui/psppire-val-chooser.c:292 msgid "Range, _LOWEST thru value" msgstr "Диапазон, _Значения от наименьшего до указанного" #: src/ui/gui/psppire-val-chooser.c:293 msgid "Range, value thru _HIGHEST" msgstr "Диапазон, значения от указанного до наибольшего" #: src/ui/gui/psppire-val-chooser.c:294 msgid "_All other values" msgstr "_Все другие значения" #: src/ui/gui/psppire-var-view.c:153 #, c-format msgid "Var%d" msgstr "Изменений%d" #: src/ui/source-init-opts.c:72 #, c-format msgid "Algorithm must be either `%s' or `%s'." msgstr "Алгоритмом должно быть `%s' или `%s'." #: src/ui/source-init-opts.c:97 #, c-format msgid "Syntax must be either `%s' or `%s'." msgstr "Синтаксической конструкцией должно быть `%s' или `%s'." #: src/ui/terminal/main.c:144 msgid "Error encountered while ERROR=STOP is effective." msgstr "Произошла ошибка, когда был задействован ERROR=STOP." #: src/ui/terminal/main.c:150 msgid "" "Stopping syntax file processing here to avoid a cascade of dependent command " "failures." msgstr "" "На этом месте обработка синтаксического файла прекращена, чтобы " "предотвратить показ дальнейших сообщений об ошибках." #: src/ui/terminal/terminal-opts.c:147 #, c-format msgid "" "PSPP, a program for statistical analysis of sampled data.\n" "Usage: %s [OPTION]... FILE...\n" "\n" "Arguments to long options also apply to equivalent short options.\n" "\n" "Output options:\n" " -o, --output=FILE output to FILE, default format from FILE's name\n" " -O format=FORMAT override format for previous -o\n" " -O OPTION=VALUE set output option to customize previous -o\n" " -O device={terminal|listing} override device type for previous -o\n" " -e, --error-file=FILE append errors, warnings, and notes to FILE\n" " --no-output disable default output driver\n" "Supported output formats: %s\n" "\n" "Language options:\n" " -I, --include=DIR append DIR to search path\n" " -I-, --no-include clear search path\n" " -r, --no-statrc disable running rc file at startup\n" " -a, --algorithm={compatible|enhanced}\n" " set to `compatible' if you want output\n" " calculated from broken algorithms\n" " -x, --syntax={compatible|enhanced}\n" " set to `compatible' to disable PSPP extensions\n" " -b, --batch interpret syntax in batch mode\n" " -i, --interactive interpret syntax in interactive mode\n" " --syntax-encoding=ENCODING specify encoding for syntax files\n" " -s, --safer don't allow some unsafe operations\n" "Default search path: %s\n" "\n" "Informative output:\n" " -h, --help display this help and exit\n" " -V, --version output version information and exit\n" "\n" "Non-option arguments are interpreted as syntax files to execute.\n" msgstr "" "PSPP - программа статистического анализа выбранных данных.\n" "Использование: %s [ПАРАМЕТР]... ФАЙЛ...\n" "\n" "Аргументы для длинных опций также применимы к эквивалентным коротким " "вариантам.\n" "\n" "Параметры вывода данных:\n" "-o, --вывод=ФАЙЛ вывод в файл, формат имени файла по умолчанию\n" "-O формат=ФОРМАТ переопределить формат для предыдущего-o\n" "-O ПАРАМЕТР=ЗНАЧЕНИЕ установить выходной параметр для настройки " "предыдущего -o\n" "-O устройство={терминал|объявление} переопределить Тип устройства для " "предыдущего-o\n" "-e, --ошибка-файл=файл дописывать ошибки, предупреждения и примечания в " "файл\n" "--нет-вывода отключить драйвер вывода по умолчанию\n" "Поддерживаемые выходные форматы: %s\n" "\n" "Параметры языка:\n" "-I, --включить=каталог добавить каталог к пути поиска\n" "-I-, --не-включать очистить пути поиска данных\n" "-r, --не выполнять rc отключить выполнение rc-файла при запуске\n" "-a,--алгоритм={совместимый|улучшенный}\n" "установите значение `compatible', если хотите вывести данные\n" "следует вычислять на основе совместимых со старыми\n" "версиями алгоритмов, содержащих ошибки\n" "-x,--синтаксис={совместимый|улучшенный}\n" "установите значение `compatible', чтобы отключить\n" "расширение PSPP\n" "-b, --пакет обрабатывать синтаксические конструкции в пакетном режиме\n" "-i, --интерактивный обрабатывать синтаксические конструкции в " "интерактивном режиме\n" "--синтаксис-кодирования=КОДИРОВКА указать кодировку файлов " "синтаксических конструкций\n" "-s, --безопасный запретить все действия, кроме безопасных\n" "Путь поиска данных по умолчанию: %s\n" "\n" "Вывод информационных данных:\n" "-h, --помощь показать справочную информацию и выйти\n" "-V, --версия вывести информацию о версии и выйти\n" "\n" "Аргументы, которые не являются параметрами, считаются файлами синтаксических " "конструкций, которые\n" "следует выполнить.\n" #: src/ui/gui/find-dialog.c:197 #, fuzzy #| msgid "_Find..." msgid "Find" msgstr "_Искать..." #: src/ui/gui/find-dialog.c:662 #, c-format msgid "Bad regular expression: %s" msgstr "Ошибочное регулярное выражение: %s" #: src/ui/gui/help-menu.c:70 msgid "A program for the analysis of sampled data" msgstr "Программа для анализа данных" #. TRANSLATORS: Do not translate this string. Instead, put the names of the people #. who have helped in the translation. #: src/ui/gui/help-menu.c:80 msgid "translator-credits" msgstr "" "Igor Zotov\n" "Pavel Maryanov" #: src/ui/gui/help-menu.c:170 #, c-format msgid "Help path conversion error: %s" msgstr "" #: src/ui/gui/help-menu.c:197 #, fuzzy, c-format #| msgid "" #| "Cannot open reference manual: %s. The PSPP user manual is also available " #| "at %s" msgid "" "Cannot open via html: %s with uri: %s The PSSP manual is also available at %s" msgstr "" "Не удалось открыть справочное руководство: %s. Справочное руководство PSPP " "также доступно в %s" #: src/ui/gui/help-menu.c:218 msgid "_Help" msgstr "_Помощь" #: src/ui/gui/help-menu.c:221 msgid "_About" msgstr "" #: src/ui/gui/help-menu.c:222 msgid "_Reference Manual" msgstr "_Справочное Руководство" #: src/ui/gui/main.c:306 msgid "Show version information and exit" msgstr "" #: src/ui/gui/main.c:409 msgid "Do not display the splash screen" msgstr "" #: src/ui/gui/main.c:411 msgid "Do not attempt single instance negotiation" msgstr "" #: src/ui/gui/missing-val-dialog.c:217 msgid "" "The maximum length of a missing value for a string variable is 8 in UTF-8." msgstr "" #: src/ui/gui/missing-val-dialog.c:268 #, fuzzy #| msgid "At least one variable must be specified." msgid "At least one value must be specified" msgstr "Должна быть указана по крайней мере одна переменная." #: src/ui/gui/missing-val-dialog.c:298 msgid "Incorrect range specification" msgstr "Некорректное определение диапазона" #: src/ui/gui/psppire-data-editor.c:380 #, fuzzy, c-format #| msgid "%s: %s" msgid "%d : %s" msgstr "%s: %s" #: src/ui/gui/psppire-data-editor.c:391 #, c-format msgid "%'d case" msgid_plural "%'d cases" msgstr[0] "%'d наблюдения" msgstr[1] "%'d наблюдения" msgstr[2] "%'d наблюдений" #: src/ui/gui/psppire-data-editor.c:396 #, c-format msgid "%'d variable" msgid_plural "%'d variables" msgstr[0] "%'d переменная" msgstr[1] "%'d переменные" msgstr[2] "%'d переменных" #: src/ui/gui/psppire-data-editor.c:485 msgid "Case" msgstr "Наблюдения" #: src/ui/gui/psppire-data-editor.c:495 msgid "Data View" msgstr "Просмотр данных" #: src/ui/gui/psppire-data-editor.c:505 msgid "Variable View" msgstr "Просмотр переменных" #: src/ui/gui/psppire-data-sheet.c:171 src/ui/gui/psppire-data-window.c:1338 #, fuzzy #| msgid "Insert Case" msgid "_Insert Case" msgstr "Вставить наблюдения" #: src/ui/gui/psppire-data-sheet.c:179 src/ui/gui/psppire-data-window.c:1391 #, fuzzy #| msgid "_Clear Cases" msgid "Cl_ear Cases" msgstr "_Очистить наблюдения" #: src/ui/gui/psppire-data-sheet.c:305 src/ui/gui/psppire-data-window.c:1337 #: src/ui/gui/psppire-variable-sheet.c:274 #, fuzzy #| msgid "Insert Variable" msgid "_Insert Variable" msgstr "Вставить переменную" #: src/ui/gui/psppire-data-sheet.c:314 src/ui/gui/psppire-variable-sheet.c:283 msgid "Cl_ear Variables" msgstr "Очистить переменные" #: src/ui/gui/psppire-data-sheet.c:326 msgid "Sort _Ascending" msgstr "Сортировать по Возрастанию" #: src/ui/gui/psppire-data-sheet.c:333 msgid "Sort _Descending" msgstr "Сортировать по Убыванию" #: src/ui/gui/psppire-data-window.c:175 msgid "Transformations Pending" msgstr "Преобразование в очереди" #: src/ui/gui/psppire-data-window.c:191 msgid "Filter off" msgstr "Фильтр. выкл." #: src/ui/gui/psppire-data-window.c:203 #, c-format msgid "Filter by %s" msgstr "Фильтр по %s" #: src/ui/gui/psppire-data-window.c:224 msgid "No Split" msgstr "Без разделения" #: src/ui/gui/psppire-data-window.c:233 msgid "Split by " msgstr "Критерий разделения: " #: src/ui/gui/psppire-data-window.c:261 msgid "Weights off" msgstr "Взвеш. выкл." #: src/ui/gui/psppire-data-window.c:273 #, c-format msgid "Weight by %s" msgstr "Вес по %s" #: src/ui/gui/psppire-data-window.c:518 #: src/ui/gui/psppire-import-assistant.c:681 #: src/ui/gui/psppire-syntax-window.c:607 src/ui/gui/psppire-window.c:669 msgid "All Files" msgstr "Все файлы" #: src/ui/gui/psppire-data-window.c:535 msgid "System File" msgstr "Системный файл" #: src/ui/gui/psppire-data-window.c:542 msgid "Compressed System File" msgstr "Система Сжатия Файла" #: src/ui/gui/psppire-data-window.c:548 msgid "Portable File" msgstr "Портативный файл" #: src/ui/gui/psppire-data-window.c:551 msgid "Format:" msgstr "Формат:" #: src/ui/gui/psppire-data-window.c:615 msgid "Delete Existing Dataset?" msgstr "Удалить имеющуюся базу данных?" #: src/ui/gui/psppire-data-window.c:619 #, c-format msgid "" "Renaming \"%s\" to \"%s\" will destroy the existing dataset named \"%s\". " "Are you sure that you want to do this?" msgstr "" "Переименование \"%s\" to \"%s\" приведет к удалению имеющейся базы данных с " "именем \"%s\". Вы действительно этого хотите?" #: src/ui/gui/psppire-data-window.c:625 #, fuzzy #| msgid "Deleted" msgid "Delete" msgstr "Удаленные" #: src/ui/gui/psppire-data-window.c:647 #, c-format msgid "Please enter a new name for dataset \"%s\":" msgstr "введите новое название базы данных \"%s\":" #: src/ui/gui/psppire-data-window.c:649 msgid "Rename Dataset" msgstr "Переименовать базу данных" #: src/ui/gui/psppire-data-window.c:1199 src/ui/gui/output-window.ui:68 #: src/ui/gui/syntax-editor.ui:22 msgid "_File" msgstr "_Файл" #: src/ui/gui/psppire-data-window.c:1203 src/ui/gui/syntax-editor.ui:25 #, fuzzy #| msgid "_New..." msgid "_New" msgstr "Новый..." #: src/ui/gui/psppire-data-window.c:1210 msgid "_Syntax" msgstr "_Синтаксис" #: src/ui/gui/psppire-data-window.c:1213 src/ui/gui/data-editor.ui:177 #: src/ui/gui/data-editor.ui:189 msgid "_Data" msgstr "_Данные" #: src/ui/gui/psppire-data-window.c:1220 src/ui/gui/syntax-editor.ui:36 #, fuzzy #| msgid "Open" msgid "_Open" msgstr "Открыть" #: src/ui/gui/psppire-data-window.c:1223 #, fuzzy #| msgid "I_mport Data..." msgid "_Import Data..." msgstr "Импортировать данные..." #: src/ui/gui/psppire-data-window.c:1231 src/ui/gui/logistic.ui:261 #: src/ui/gui/regression.ui:66 msgid "_Save..." msgstr "Сохранить..." #: src/ui/gui/psppire-data-window.c:1234 msgid "Save _As..." msgstr "Сохранить _как..." #: src/ui/gui/psppire-data-window.c:1237 msgid "_Rename Dataset..." msgstr "Переименовать..." #: src/ui/gui/psppire-data-window.c:1248 #, fuzzy #| msgid "D_isplay Data File Information" msgid "_Display Data File Information" msgstr "_Показать сведения о" #: src/ui/gui/psppire-data-window.c:1255 msgid "Working File" msgstr "Текущем файле" #: src/ui/gui/psppire-data-window.c:1257 #, fuzzy #| msgid "External File..." msgid "_External File..." msgstr "Внешнем файле..." #: src/ui/gui/psppire-data-window.c:1267 #, fuzzy #| msgid "Recently Used Da_ta" msgid "_Recently Used Data" msgstr "Недавно использованные _данные" #: src/ui/gui/psppire-data-window.c:1268 msgid "Recently Used _Files" msgstr "Недавно использованные _файлы" #: src/ui/gui/psppire-data-window.c:1315 src/ui/gui/output-window.ui:82 #: src/ui/gui/syntax-editor.ui:59 msgid "_Quit" msgstr "" #: src/ui/gui/psppire-data-window.c:1333 src/ui/gui/output-window.ui:89 #: src/ui/gui/syntax-editor.ui:66 msgid "_Edit" msgstr "_Редактировать" #: src/ui/gui/psppire-data-window.c:1339 #, fuzzy #| msgid "Go To Variable..." msgid "_Go To Variable..." msgstr "Перейти к переменной..." #: src/ui/gui/psppire-data-window.c:1340 #, fuzzy #| msgid "Go To Case..." msgid "_Go To Case..." msgstr "Перейти к наблюдению..." #: src/ui/gui/psppire-data-window.c:1364 src/ui/gui/syntax-editor.ui:69 msgid "Cu_t" msgstr "" #: src/ui/gui/psppire-data-window.c:1373 src/ui/gui/output-window.ui:96 #: src/ui/gui/syntax-editor.ui:74 msgid "_Copy" msgstr "_Копировать" #: src/ui/gui/psppire-data-window.c:1380 src/ui/gui/syntax-editor.ui:79 msgid "_Paste" msgstr "" #: src/ui/gui/psppire-data-window.c:1387 #, fuzzy #| msgid "Cl_ear Variables" msgid "Clear _Variables" msgstr "Очистить переменные" #: src/ui/gui/psppire-data-window.c:1401 msgid "_Find..." msgstr "_Искать..." #: src/ui/gui/psppire-data-window.c:1407 src/ui/gui/logistic.ui:246 msgid "_Options..." msgstr "_Параметры..." #: src/ui/gui/psppire-data-window.c:1676 msgid "Jump to variable" msgstr "Перейти к переменной" #: src/ui/gui/psppire-data-window.c:1689 msgid "Jump to a case in the data sheet" msgstr "Перейти к наблюдению в таблице данных" #: src/ui/gui/psppire-data-window.c:1703 #, fuzzy #| msgid "Sort cases in the active dataset" msgid "Search for values in the data" msgstr "Упорядочить наблюдения в активной базе данных" #: src/ui/gui/psppire-data-window.c:1715 msgid "Create a new case at the current position" msgstr "Создать запись наблюдения в текущей позиции" #: src/ui/gui/psppire-data-window.c:1727 msgid "Create a new variable at the current position" msgstr "Создать запись новой переменной в текущей позиции" #: src/ui/gui/psppire-data-window.c:1741 msgid "Split the active dataset" msgstr "Разделить текущую базу данных" #: src/ui/gui/psppire-data-window.c:1753 msgid "Weight cases by variable" msgstr "Взвесить наблюдения по переменной" #: src/ui/gui/psppire-data-window.c:1764 msgid "Show/hide value labels" msgstr "Показать или скрыть метки значений" #: src/ui/gui/psppire-data-window.c:1904 msgid "Data Editor" msgstr "Редактор данных" #: src/ui/gui/psppire-encoding-selector.c:140 msgid "Automatically Detect" msgstr "Определить автоматически" #: src/ui/gui/psppire-encoding-selector.c:147 msgid "Locale Encoding" msgstr "Локальное кодирование" #: src/ui/gui/psppire-encoding-selector.c:177 msgid "Character Encoding: " msgstr "Кодировка: " #: src/ui/gui/psppire-import-assistant.c:337 msgid "line" msgstr "" #: src/ui/gui/psppire-import-assistant.c:347 msgid "var" msgstr "переменные" #: src/ui/gui/psppire-import-assistant.c:560 msgid "Importing Spreadsheet Data" msgstr "Импорт данных из электронной таблицы" #: src/ui/gui/psppire-import-assistant.c:686 msgid "Text Files" msgstr "текстовые файлы" #: src/ui/gui/psppire-import-assistant.c:691 msgid "Text (*.txt) Files" msgstr "текстовые файлы (*.txt)" #: src/ui/gui/psppire-import-assistant.c:697 msgid "Plain Text (ASCII) Files" msgstr "Обычные текстовые файлы (ASCII)" #: src/ui/gui/psppire-import-assistant.c:702 msgid "Comma Separated Value Files" msgstr "Файлы значений, разделенных запятыми" #: src/ui/gui/psppire-import-assistant.c:709 msgid "Tab Separated Value Files" msgstr "Файлы значений, разделенных табуляцией" #: src/ui/gui/psppire-import-assistant.c:714 msgid "Gnumeric Spreadsheet Files" msgstr "Файлы электронных таблиц Gnumeric" #: src/ui/gui/psppire-import-assistant.c:719 msgid "OpenDocument Spreadsheet Files" msgstr "Файлы электронных таблиц OpenDocument" #: src/ui/gui/psppire-import-assistant.c:724 msgid "All Spreadsheet Files" msgstr "Все файлы электронных таблиц" #: src/ui/gui/psppire-import-assistant.c:733 #, fuzzy #| msgid "Select Data to Import" msgid "Select File to Import" msgstr "Выберите данные для импорта" #: src/ui/gui/psppire-import-assistant.c:770 msgid "Importing Delimited Text Data" msgstr "Импорт Текстового Файла С Разделителями" #: src/ui/gui/psppire-import-assistant.c:865 #, fuzzy #| msgid "Select Cases: Range" msgid "Select the First Line" msgstr "Выбор наблюдений: диапазон" #: src/ui/gui/psppire-import-assistant.c:877 msgid "Line" msgstr "Строка" #: src/ui/gui/psppire-import-assistant.c:931 msgid "" "This assistant will guide you through the process of importing data into " "PSPP from a text file with one line per case, in which fields are separated " "by tabs, commas, or other delimiters.\n" "\n" msgstr "" "Этот помощник проведет вас через процесс импорта данных в PSPP из текстового " "файла, в котором каждое наблюдение записано в отдельной строке, а поля " "разделены символами табуляции, запятыми или другими разделителями.\n" #: src/ui/gui/psppire-import-assistant.c:941 #, fuzzy, c-format #| msgid "The selected file contains %'zu line of text. " #| msgid_plural "The selected file contains %'zu lines of text. " msgid "The selected file contains %'lu line of text. " msgid_plural "The selected file contains %'lu lines of text. " msgstr[0] "В выбранном файле содержится %'zu строка текста. " msgstr[1] "В выбранном файле содержится %'zu строк текста. " msgstr[2] "В выбранном файле содержится %'zu строк текста. " #: src/ui/gui/psppire-import-assistant.c:950 #, c-format msgid "The selected file contains approximately %'lu line of text. " msgid_plural "The selected file contains approximately %'lu lines of text. " msgstr[0] "В выбранном файле содержится приблизительно %'lu строка текста. " msgstr[1] "В выбранном файле содержится приблизительно %'lu строк текста. " msgstr[2] "В выбранном файле содержится приблизительно %'lu строк текста" #: src/ui/gui/psppire-import-assistant.c:956 #, c-format msgid "" "Only the first %zu line of the file will be shown for preview purposes in " "the following screens. " msgid_plural "" "Only the first %zu lines of the file will be shown for preview purposes in " "the following screens. " msgstr[0] "" "Только первая %zu строка файла будет отображаться при предварительном " "просмотре следующих экранов." msgstr[1] "" "Только первые %zu строк файла будут отображаться при предварительном " "просмотре следующих экранов." msgstr[2] "" "Только первые %zu строк файла будут отображаться при предварительном " "просмотре следующих экранов." #: src/ui/gui/psppire-import-assistant.c:965 msgid "You may choose below how much of the file should actually be imported." msgstr "Ниже вы можете указать часть файла, которую следует импортировать." #: src/ui/gui/psppire-import-assistant.c:974 #, c-format msgid "Only the first %4d cases" msgstr "Только первые %4d наблюдений" #: src/ui/gui/psppire-import-assistant.c:985 #, c-format msgid "Only the first %3d %% of file (approximately)" msgstr "Только первые %3d%% файла (приблизительно)" #: src/ui/gui/psppire-import-assistant.c:1009 #, fuzzy #| msgid "Select Data to Import" msgid "Select the Lines to Import" msgstr "Выберите данные для импорта" #: src/ui/gui/psppire-import-assistant.c:1151 msgid "Choose Separators" msgstr "Выберите разделитель" #: src/ui/gui/psppire-import-assistant.c:1438 msgid "Adjust Variable Formats" msgstr "Настройка форматов переменных" #: src/ui/gui/psppire-output-view.c:410 msgid "Message" msgstr "Сообщение" #: src/ui/gui/psppire-output-view.c:543 msgid "failed to create temporary directory during clipboard operation" msgstr "" "не удалось создать каталог временных данных во время действий с буфером " "обмена данными" #: src/ui/gui/psppire-output-window.c:241 msgid "Infer file type from extension" msgstr "Определить тип файла с суффиксом названия" #: src/ui/gui/psppire-output-window.c:242 msgid "SPSS Viewer (*.spv)" msgstr "" #: src/ui/gui/psppire-output-window.c:243 msgid "PDF (*.pdf)" msgstr "PDF (*.pdf)" #: src/ui/gui/psppire-output-window.c:244 msgid "HTML (*.html)" msgstr "HTML (*.html)" #: src/ui/gui/psppire-output-window.c:245 msgid "OpenDocument (*.odt)" msgstr "OpenDocument (*.odt)" #: src/ui/gui/psppire-output-window.c:246 msgid "Text (*.txt)" msgstr "Текст (*.txt)" #: src/ui/gui/psppire-output-window.c:247 msgid "Text [plain] (*.txt)" msgstr "Текст [обычный] (*.txt)" #: src/ui/gui/psppire-output-window.c:248 msgid "PostScript (*.ps)" msgstr "PostScript (*.ps)" #: src/ui/gui/psppire-output-window.c:249 msgid "Comma-Separated Values (*.csv)" msgstr "разделенные запятыми значения (*.csv)" #: src/ui/gui/psppire-output-window.c:350 msgid "Export Output" msgstr "Экспортировать выведены данные" #: src/ui/gui/psppire-output-window.c:548 msgid "Output Viewer" msgstr "Просмотр выводимых данных" #: src/ui/gui/psppire-spreadsheet-model.c:237 msgid "(empty)" msgstr "(пусто)" #: src/ui/gui/psppire-syntax-window.c:226 msgid "Text Search" msgstr "" #: src/ui/gui/psppire-syntax-window.c:229 msgid "_OK" msgstr "" #: src/ui/gui/psppire-syntax-window.c:231 msgid "_Cancel" msgstr "" #: src/ui/gui/psppire-syntax-window.c:239 msgid "Text to search for:" msgstr "" #: src/ui/gui/psppire-syntax-window.c:570 #, c-format msgid "Saved file `%s'" msgstr "сохранить файл `%s'" #: src/ui/gui/psppire-syntax-window.c:591 msgid "Save Syntax" msgstr "Сохранить синтаксис" #: src/ui/gui/psppire-syntax-window.c:601 src/ui/gui/psppire-window.c:657 msgid "Syntax Files (*.sps) " msgstr "Файлы синтаксиса (*.sps) " #: src/ui/gui/psppire-syntax-window.c:970 msgid "Syntax Editor" msgstr "Редактор синтаксиса" #: src/ui/gui/psppire-syntax-window.c:990 #, c-format msgid "Cannot load syntax file `%s'" msgstr "Не удалось загрузить файл синтаксиса `%s'" #: src/ui/gui/psppire-variable-sheet.c:412 #, c-format msgid "{%s, %s}..." msgstr "{%s, %s}..." #: src/ui/gui/psppire-var-sheet-header.c:64 #, fuzzy #| msgid "Decimals" msgid "Decimal" msgstr "Знаков после запятой" #: src/ui/gui/psppire-var-sheet-header.c:79 msgid "Align" msgstr "Выровнять" #: src/ui/gui/psppire-var-sheet-header.c:82 msgid "Measure" msgstr "Шкала" #: src/ui/gui/psppire-window.c:430 #, c-format msgid "Save the changes to `%s' before closing?" msgstr "Сохранить изменения в `%s', прежде чем закрывать?" #: src/ui/gui/psppire-window.c:437 #, c-format msgid "" "If you don't save, changes from the last %ld seconds will be permanently " "lost." msgstr "" "Если вы не сохраните данные, внесенные изменения за последние %ld секунд, " "будут потеряны." #: src/ui/gui/psppire-window.c:441 msgid "Close _without saving" msgstr "Закрыть _без сохранения" #: src/ui/gui/psppire-window.c:625 src/ui/gui/psppire-window.c:629 msgid "Open" msgstr "Открыть" #: src/ui/gui/psppire-window.c:634 msgid "Data and Syntax Files" msgstr "Файлы данных и синтаксиса" #: src/ui/gui/psppire-window.c:646 msgid "System Files (*.sav, *.zsav)" msgstr "системные файлы (*.sav, *.zsav)" #: src/ui/gui/psppire-window.c:663 #, fuzzy #| msgid "Syntax Files (*.sps) " msgid "Output Files (*.spv) " msgstr "Файлы синтаксиса (*.sps) " #: src/ui/gui/t-test-options.c:65 #, c-format msgid "Con_fidence Interval: %2d %%" msgstr "_Доверительный интервал: %2d %%" #: src/ui/gui/val-labs-dialog.c:591 #, c-format msgid "%s = `%s'" msgstr "%s = `%s'" #: src/ui/gui/var-type-dialog.c:541 #, fuzzy #| msgid "Compute Variable: Type and Label" msgid "Variable Type and Format" msgstr "Вычисление переменной: тип и метка" #: src/ui/gui/windows-menu.c:92 #, fuzzy #| msgid "_Minimize All Windows" msgid "_Minimize all Windows" msgstr "_Минимизировать все окна" #: src/ui/gui/windows-menu.c:100 msgid "_Split" msgstr "_Разделить" #: src/ui/gui/windows-menu.c:132 msgid "_Windows" msgstr "_Windows" #: utilities/pspp-convert.c:67 #, c-format msgid "%s argument must be a single character" msgstr "" #: utilities/pspp-convert.c:265 msgid "exactly two non-option arguments are required; use --help for help" msgstr "" "должно быть указано только два аргумента, которые не являются параметрами; " "воспользуйтесь параметром --help, чтобы получить справку" #: utilities/pspp-convert.c:276 #, c-format msgid "%s: cannot guess output format (use -O option)" msgstr "" "%s: не удалось определить формат вывода данных (используйте -O параметры)" #: utilities/pspp-convert.c:341 #, c-format msgid "%s: unknown output format (use -O option)" msgstr "%s: неизвестный формат вывода данных (воспользуйтесь -O параметры)" #: utilities/pspp-convert.c:360 #, c-format msgid "%s: error reading input file" msgstr "%s: ошибка при попытке чтения файла входных данных" #: utilities/pspp-convert.c:362 #, c-format msgid "%s: error writing output file" msgstr "%s: ошибка при попытке записи файла результатов" #: utilities/pspp-convert.c:409 #, fuzzy, c-format #| msgid "%s: error opening output file" msgid "%s: error opening password file" msgstr "%s: ошибка при попытке открыть файл результатов" #: utilities/pspp-convert.c:425 #, fuzzy, c-format #| msgid "%s: error reading input file" msgid "" "\n" "%s: password not in file" msgstr "%s: ошибка при попытке чтения файла входных данных" #: utilities/pspp-convert.c:462 #, fuzzy, c-format #| msgid "`%c' is not a valid hex digit" msgid "%s: '%c' is not in alphabet" msgstr "`%c' не является корректной шеснадцатиричной цифрой" #: utilities/pspp-convert.c:526 msgid "sorry, wrong password" msgstr "извините, ошибочный пароль" #: utilities/pspp-output.c:92 #, fuzzy, c-format #| msgid "%s payload %s." msgid "%s and %s:" msgstr "%s без %s." #: utilities/pspp-output.c:547 #, c-format msgid "%s: invalid XPath expression" msgstr "" #: utilities/pspp-output.c:716 msgid "missing command name (use --help for help)" msgstr "" #: utilities/pspp-output.c:720 #, c-format msgid "unknown command \"%s\" (use --help for help)" msgstr "" #: utilities/pspp-output.c:728 #, c-format msgid "\"%s\" command takes exactly %d argument" msgid_plural "\"%s\" command takes exactly %d arguments" msgstr[0] "" msgstr[1] "" msgstr[2] "" #: utilities/pspp-output.c:735 #, fuzzy, c-format #| msgid "%s requires at least %d valid arguments in list." msgid "\"%s\" command requires at least %d argument" msgid_plural "\"%s\" command requires at least %d arguments" msgstr[0] "%s требует по крайней мере %d корректных аргументов в списке." msgstr[1] "%s требует по крайней мере %d корректных аргументов в списке." msgstr[2] "%s требует по крайней мере %d корректных аргументов в списке." #: utilities/pspp-output.c:742 #, fuzzy, c-format #| msgid "%s requires at least %d valid arguments in list." msgid "\"%s\" command requires between %d and %d arguments" msgstr "%s требует по крайней мере %d корректных аргументов в списке." #: utilities/pspp-output.c:782 msgid "The following object classes are supported:" msgstr "" #: utilities/pspp-output.c:791 #, c-format msgid "%s: unknown object class (use --select=help for help" msgstr "" #: src/language/utilities/set.q:162 #, c-format msgid "%s must be between 0 and 20." msgstr "Значение %s должно принадлежать диапазону от 0 до 20." #: src/language/utilities/set.q:172 src/language/utilities/set.q:179 #, c-format msgid "%s must be at least 1." msgstr "%s должен быть не меньше 1." #: src/language/utilities/set.q:205 #, c-format msgid "%s must be at least 1MB" msgstr "%s должен быть не меньше 1 МБ" #: src/language/utilities/set.q:207 #, c-format msgid "%s must be positive" msgstr "%s должен быть положительным" #: src/language/utilities/set.q:213 src/language/utilities/set.q:215 #: src/language/utilities/set.q:217 src/language/utilities/set.q:219 #: src/language/utilities/set.q:221 src/language/utilities/set.q:223 #: src/language/utilities/set.q:225 src/language/utilities/set.q:227 #: src/language/utilities/set.q:229 src/language/utilities/set.q:231 #: src/language/utilities/set.q:233 #, c-format msgid "%s is obsolete." msgstr "%s является лишним." #: src/language/utilities/set.q:239 msgid "Active file compression is not implemented." msgstr "Сжатие активного файла не реализовано." #: src/language/utilities/set.q:403 #, c-format msgid "%s must be 1500 or later." msgstr "Значение %s должно быть позже значения 1500." #: src/language/utilities/set.q:410 #, c-format msgid "expecting %s or year" msgstr "должен быть %s или год" #: src/language/utilities/set.q:438 src/language/utilities/set.q:535 #, c-format msgid "%s must be at least %d." msgstr "%s должен быть не менее %d." #: src/language/utilities/set.q:474 #, c-format msgid "%s is not a recognized encoding or locale name" msgstr "%s не известная программе кодировка или имя" #: src/language/utilities/set.q:562 #, c-format msgid "" "%s requires numeric output format as an argument. Specified format %s is of " "type string." msgstr "" "%s требует числовой формат вывода данных в качестве аргумента. Указанный " "формат %s имеет строковый формат. " #: src/language/utilities/set.q:791 msgid "ISL (32-bit IEEE 754 single, little-endian)" msgstr "ISL (32-битовое одинарной точности IEEE 754, прямой порядок байтов)" #: src/language/utilities/set.q:794 msgid "ISB (32-bit IEEE 754 single, big-endian)" msgstr "ISB (32-битовое одинарной точности IEEE 754, обратный порядок байтов)" #: src/language/utilities/set.q:797 msgid "IDL (64-bit IEEE 754 double, little-endian)" msgstr "IDL (32-битные двойной точности IEEE 754, прямой порядок байтов)" #: src/language/utilities/set.q:800 msgid "IDB (64-bit IEEE 754 double, big-endian)" msgstr "IDB (64-битное, двойной точности IEEE 754, обратный порядок байт)" #: src/language/utilities/set.q:804 msgid "VF (32-bit VAX F, VAX-endian)" msgstr "VF (32-битное, VAX F, порядок байтов VAX)" #: src/language/utilities/set.q:807 msgid "VD (64-bit VAX D, VAX-endian)" msgstr "VD (64-битное, VAX D, порядок байтов VAX)" #: src/language/utilities/set.q:810 msgid "VG (64-bit VAX G, VAX-endian)" msgstr "VG (64-битное, VAX G, порядок байтов VAX)" #: src/language/utilities/set.q:814 msgid "ZS (32-bit IBM Z hexadecimal short, big-endian)" msgstr "" "ZS (32-битное, IBM Z, шестнадцатеричное короткое, обратный порядок байтов)" #: src/language/utilities/set.q:817 msgid "ZL (64-bit IBM Z hexadecimal long, big-endian)" msgstr "" "ZL (64-битное, IBM Z, шестнадцатеричное длинное, обратный порядок байтов)" #: src/language/utilities/set.q:985 #, c-format msgid "%s is %s." msgstr "%s является %s." #: src/language/utilities/set.q:1089 #, c-format msgid "" "Too many %s commands without a %s: at most %d levels of saved settings are " "allowed." msgstr "" "Слишком много команд %s без %s: можно использовать не более %d уровней " "сохраненных параметров." #: src/language/utilities/set.q:1109 #, c-format msgid "%s without matching %s." msgstr "%s без аналога, %s." #: src/language/stats/crosstabs.q:327 #, c-format msgid "Missing mode %s not allowed in general mode. Assuming %s." msgstr "Отсутствует мода %s не разрешенная в общем. Предполагаем, что %s. " #: src/language/stats/crosstabs.q:444 msgid "Too many cross-tabulation variables or dimensions." msgstr "Слишком много переменных или измерений таблиц сопряженности." #: src/language/stats/crosstabs.q:509 #, c-format msgid "%s must be specified before %s." msgstr "%s должен быть указан в %s." #: src/language/stats/crosstabs.q:543 #, c-format msgid "Maximum value (%ld) less than minimum value (%ld)." msgstr "" "Максимальное значение (%ld) является меньшим, чем минимальное значение (%ld)." #: src/language/stats/crosstabs.q:922 #, fuzzy #| msgid "Summary." msgid "Summary" msgstr "Резюме." #: src/language/stats/crosstabs.q:935 #, fuzzy #| msgid "Crosstabs" msgid "Crosstabulation" msgstr "Таблицы сопряженности" #. TRANSLATORS: The %s here describes a crosstabulation. It takes the #. form "var1 * var2 * var3 * ...". #: src/language/stats/crosstabs.q:1013 #, c-format msgid "Crosstabulation %s contained no non-missing cases." msgstr "Таблица сопряженности\" %s не содержит непропущенных наблюдений." #: src/language/stats/crosstabs.q:1204 #, fuzzy #| msgid "Missing Values" msgid "Missing value" msgstr "Пропущенные значения" #: src/language/stats/crosstabs.q:1263 #, fuzzy #| msgid "row %" msgid "Row %" msgstr "% по строке" #: src/language/stats/crosstabs.q:1264 #, fuzzy #| msgid "column %" msgid "Column %" msgstr "% по столбцу" #: src/language/stats/crosstabs.q:1265 #, fuzzy #| msgid "total %" msgid "Total %" msgstr "общий %" #: src/language/stats/crosstabs.q:1269 #, fuzzy #| msgid "Adjusted Std. Residual" msgid "Adjusted Residual" msgstr "Корректируемые станд. остатки" #: src/language/stats/crosstabs.q:1288 #, fuzzy #| msgid "Chi-Square Test" msgid "Chi-Square Tests" msgstr "Проверка χ2" #: src/language/stats/crosstabs.q:1294 msgid "Pearson Chi-Square" msgstr "критерий χ2 Пирсона" #: src/language/stats/crosstabs.q:1295 msgid "Likelihood Ratio" msgstr "Коэффициент правдоподобия" #: src/language/stats/crosstabs.q:1296 msgid "Fisher's Exact Test" msgstr "Точная проверка Фишера" #: src/language/stats/crosstabs.q:1297 msgid "Continuity Correction" msgstr "Исправление непрерывности" #: src/language/stats/crosstabs.q:1298 msgid "Linear-by-Linear Association" msgstr "Критерий линейной зависимости" #: src/language/stats/crosstabs.q:1299 src/language/stats/crosstabs.q:1345 #: src/language/stats/crosstabs.q:1854 msgid "N of Valid Cases" msgstr "Кол-во корректных наблюдений" #: src/language/stats/crosstabs.q:1305 #, fuzzy #| msgid "Asymp. Sig. (2-tailed)" msgid "Asymptotic Sig. (2-tailed)" msgstr "Асимпт. знач. (двусторонние)" #: src/language/stats/crosstabs.q:1319 #, fuzzy #| msgid "Symmetric measures." msgid "Symmetric Measures" msgstr "Симметричные шкалы." #: src/language/stats/crosstabs.q:1324 src/language/stats/crosstabs.q:1364 #: src/language/stats/crosstabs.q:1411 #, fuzzy #| msgid "_Values" msgid "Values" msgstr "_Значения" #: src/language/stats/crosstabs.q:1326 src/language/stats/crosstabs.q:1413 msgid "Asymp. Std. Error" msgstr "Асимпт. станд. погрешность" #: src/language/stats/crosstabs.q:1327 src/language/stats/crosstabs.q:1414 msgid "Approx. T" msgstr "Прибл. T" #: src/language/stats/crosstabs.q:1328 src/language/stats/crosstabs.q:1415 msgid "Approx. Sig." msgstr "Прибл. знач." #: src/language/stats/crosstabs.q:1333 src/language/stats/crosstabs.q:1420 msgid "Nominal by Nominal" msgstr "Номинальная по Номинальной" #: src/language/stats/crosstabs.q:1334 msgid "Cramer's V" msgstr "V Крамера" #: src/language/stats/crosstabs.q:1334 msgid "Contingency Coefficient" msgstr "Коэффициент непредсказуемости" #: src/language/stats/crosstabs.q:1336 src/language/stats/crosstabs.q:1425 msgid "Ordinal by Ordinal" msgstr "Порядковая по Порядковой" #: src/language/stats/crosstabs.q:1337 msgid "Kendall's tau-b" msgstr "τ-b Кендала" #: src/language/stats/crosstabs.q:1337 msgid "Kendall's tau-c" msgstr "τ-c Кендала" #: src/language/stats/crosstabs.q:1338 msgid "Spearman Correlation" msgstr "Корреляция Спирмена" #: src/language/stats/crosstabs.q:1340 msgid "Interval by Interval" msgstr "Интервал за интервалом" #: src/language/stats/crosstabs.q:1341 msgid "Pearson's R" msgstr "R Пирсона" #: src/language/stats/crosstabs.q:1343 msgid "Measure of Agreement" msgstr "Шкала согласованности" #: src/language/stats/crosstabs.q:1359 #, fuzzy #| msgid "Risk estimate." msgid "Risk Estimate" msgstr "Оценка риска." #: src/language/stats/crosstabs.q:1368 #, fuzzy, no-c-format #| msgid "95%% Confidence Interval" msgid "95% Confidence Interval" msgstr "Доверительный интервал в 95%%" #: src/language/stats/crosstabs.q:1389 msgid "Symmetric" msgstr "Симметричная" #: src/language/stats/crosstabs.q:1391 src/language/stats/crosstabs.q:1396 #, c-format msgid "%s Dependent" msgstr "Зависимая %s" #: src/language/stats/crosstabs.q:1406 #, fuzzy #| msgid "Directional measures." msgid "Directional Measures" msgstr "Направленные шкалы." #: src/language/stats/crosstabs.q:1422 msgid "Goodman and Kruskal tau" msgstr "τ Гудмена и Краскала" #: src/language/stats/crosstabs.q:1423 msgid "Uncertainty Coefficient" msgstr "Коэффициент неопределенности" #: src/language/stats/crosstabs.q:1426 msgid "Somers' d" msgstr "d Сомерса" #: src/language/stats/crosstabs.q:1428 msgid "Nominal by Interval" msgstr "Номинальное с интервалом" #: src/language/stats/crosstabs.q:1826 #, fuzzy, c-format #| msgid "Odds Ratio for %s (%g / %g)" msgid "Odds Ratio for %s" msgstr "Отношение шансов для %s (%g / %g)" #: src/language/stats/crosstabs.q:1835 #, fuzzy, c-format #| msgid "For cohort %s = %g" msgid "For cohort %s = " msgstr "Для когорты %s = %g" #: src/ui/gui/aggregate.ui:24 msgid "Aggregate Data" msgstr "Агрегирование данных" #: src/ui/gui/aggregate.ui:126 msgid "_Break variable(s)" msgstr "_Разрыв переменной(s)" #: src/ui/gui/aggregate.ui:179 msgid "Variable Name: " msgstr "Имя переменной: " #: src/ui/gui/aggregate.ui:215 msgid "Variable Label: " msgstr "Метка переменной: " #: src/ui/gui/aggregate.ui:252 msgid "Function: " msgstr "Функция: " #: src/ui/gui/aggregate.ui:327 msgid "Argument 1: " msgstr "Аргумент 1:" #: src/ui/gui/aggregate.ui:364 msgid "Argument 2: " msgstr "Аргумент 2:" #: src/ui/gui/aggregate.ui:428 msgid "Aggregated variables" msgstr "Агрегирование переменных" #: src/ui/gui/aggregate.ui:469 msgid "_Add aggregated variables to the active dataset" msgstr "Добавить агрегированные переменные в активную базу данных" #: src/ui/gui/aggregate.ui:486 msgid "_Replace the current dataset with the aggregated variables" msgstr "_Заменить текущую базу данных агрегированными переменными" #: src/ui/gui/aggregate.ui:504 msgid "_Write a new data file containing only the aggregated variables" msgstr "" "_Записать новый файл данных, содержащий только агрегированные переменные" #: src/ui/gui/aggregate.ui:544 msgid "label" msgstr "метка" #: src/ui/gui/aggregate.ui:593 msgid "File is _already sorted on break variable(s)" msgstr "Файл _уже упорядочен по переменным группировки" #: src/ui/gui/aggregate.ui:609 msgid "Sort file before a_ggregating" msgstr "Упорядочить файл перед агрегированием" #: src/ui/gui/aggregate.ui:630 msgid "Options for very large datasets" msgstr "Параметры для данных очень большого объема" #: src/ui/gui/autorecode.ui:24 msgid "Automatic Recode" msgstr "Автоматическое перекодирование" #: src/ui/gui/autorecode.ui:120 msgid "Variable -> New Name" msgstr "Переменная -> Новое название" #: src/ui/gui/autorecode.ui:145 msgid "_Lowest value" msgstr "_Самое нижнее значение" #: src/ui/gui/autorecode.ui:163 msgid "_Highest value" msgstr "_Самое верхнее значение" #: src/ui/gui/autorecode.ui:185 msgid "Recode starting from" msgstr "Перекодировать, начиная с" #: src/ui/gui/autorecode.ui:204 msgid "_New Name" msgstr "_Новое название" #: src/ui/gui/autorecode.ui:227 msgid "_Add New Name" msgstr "_Добавить новое название" #: src/ui/gui/autorecode.ui:285 msgid "_Use the same recoding scheme for all variables" msgstr "_Использовать ту же схему перекодировки для всех переменных" #: src/ui/gui/autorecode.ui:301 msgid "Treat _blank string values as missing" msgstr "Заменить пустые строки значений пропущенными" #: src/ui/gui/binomial.ui:86 msgid "_Test Variable List:" msgstr "Список переменных для проверки:" #: src/ui/gui/binomial.ui:160 src/ui/gui/chi-square.ui:281 msgid "_Get from data" msgstr "_Получить из данных" #: src/ui/gui/binomial.ui:181 src/ui/gui/indep-samples.ui:150 msgid "_Cut point:" msgstr "_Порогове значение:" #: src/ui/gui/binomial.ui:225 msgid "Define Dichotomy" msgstr "Определение дихотомии" #: src/ui/gui/binomial.ui:245 msgid "Test _Proportion:" msgstr "Проверка _Доли:" #: src/ui/gui/compute.ui:32 msgid "Compute Variable: Type and Label" msgstr "Вычисление переменной: тип и метка" #: src/ui/gui/compute.ui:67 msgid "Use _expression as label" msgstr "Использовать _выражение как метку" #: src/ui/gui/compute.ui:90 msgid "_Label:" msgstr "_Метка:" #: src/ui/gui/compute.ui:194 msgid "_String" msgstr "_Строка" #: src/ui/gui/compute.ui:287 msgid "_Numeric" msgstr "_Число" #: src/ui/gui/compute.ui:343 msgid "Compute Variable" msgstr "Вычислить переменную" #: src/ui/gui/compute.ui:381 msgid "Target _Variable:" msgstr "Переменная для обработки:" #: src/ui/gui/compute.ui:412 msgid "_Type & Label..." msgstr "_Тип и метка..." #: src/ui/gui/compute.ui:469 msgid "=" msgstr "=" #: src/ui/gui/compute.ui:526 msgid "_Numeric Expressions:" msgstr "_Числовое выражение:" #: src/ui/gui/compute.ui:598 msgid "_Functions:" msgstr "_Функции:" #: src/ui/gui/compute.ui:678 msgid "_If..." msgstr "Если..." #: src/ui/gui/barchart.ui:24 #, fuzzy #| msgid "Bar Chart" msgid "Barchart" msgstr "Столбчатая диаграмма" #: src/ui/gui/barchart.ui:112 #, fuzzy #| msgid "Category" msgid "Category A_xis:" msgstr "Категория" #: src/ui/gui/barchart.ui:140 #, fuzzy #| msgid "Number of cases" msgid "_N of cases" msgstr "Количество наблюдений" #: src/ui/gui/barchart.ui:158 #, fuzzy #| msgid "Number of cases" msgid "_Cum. n of cases" msgstr "Количество наблюдений" #: src/ui/gui/barchart.ui:174 msgid "Other _summary function" msgstr "" #: src/ui/gui/barchart.ui:191 #, fuzzy #| msgid "Number of cases" msgid "% of c_ases" msgstr "Количество наблюдений" #: src/ui/gui/barchart.ui:207 #, fuzzy #| msgid "Number of cases" msgid "C_um. % of cases" msgstr "Количество наблюдений" #: src/ui/gui/barchart.ui:270 src/ui/gui/histogram.ui:100 #, fuzzy #| msgid "_Variables:" msgid "_Variable:" msgstr "_Переменные:" #: src/ui/gui/barchart.ui:308 msgid "Bars Represent" msgstr "" #: src/ui/gui/barchart.ui:340 #, fuzzy #| msgid "Category label source" msgid "Category C_luster:" msgstr "Источник метки категории" #: src/ui/gui/correlation.ui:24 msgid "Bivariate Correlations" msgstr "Двумерная корреляция" #: src/ui/gui/correlation.ui:148 msgid "Pearso_n" msgstr "Пирсо_н" #: src/ui/gui/correlation.ui:164 msgid "_Kendall's tau-b" msgstr "τ-b Кендала" #: src/ui/gui/correlation.ui:180 msgid "_Spearman" msgstr "_Спирмен" #: src/ui/gui/correlation.ui:200 msgid "Correlation Coefficients" msgstr "Коэффициенты корреляции" #: src/ui/gui/correlation.ui:224 msgid "_Two-tailed" msgstr "_Двусторонняя" #: src/ui/gui/correlation.ui:241 msgid "One-tai_led" msgstr "_Односторонняя" #: src/ui/gui/correlation.ui:262 msgid "Test of Significance" msgstr "Проверка значимости" #: src/ui/gui/correlation.ui:275 msgid "_Flag significant correlations" msgstr "_Помеченные значимые корреляции" #: src/ui/gui/count.ui:24 msgid "Count Occurrences of Values within Cases" msgstr "Подсчет появления значений в наблюдениях" #: src/ui/gui/count.ui:117 msgid "Numeric _Variables:" msgstr "_Числовые переменные:" #: src/ui/gui/count.ui:147 msgid "_Target Variable:" msgstr "Переменные для обработки:" #: src/ui/gui/count.ui:178 msgid "Target _Label:" msgstr "_Метка результата:" #: src/ui/gui/count.ui:192 msgid "_Define Values..." msgstr "_Определить значение..." #: src/ui/gui/count.ui:257 msgid "Count Values within Cases: Values to Count" msgstr "Подсчет количества значений в наблюдениях: значение для подсчета" #: src/ui/gui/count.ui:305 msgid "Values _to Count:" msgstr "Значение д_ля подсчета:" #: src/ui/gui/comments.ui:25 msgid "Data File Comments" msgstr "Комментарии к файлу данных" #: src/ui/gui/comments.ui:49 msgid "Comments:" msgstr "Комментарии:" #: src/ui/gui/comments.ui:106 msgid "Display comments in output" msgstr "Показывать комментарии в выведенных данных" #: src/ui/gui/comments.ui:127 msgid "Column Number: 0" msgstr "Номер столбца 0" #: src/ui/gui/crosstabs.ui:25 msgid "Crosstabs: Cells" msgstr "Таблицы сопряженности: ячейки" #: src/ui/gui/crosstabs.ui:67 msgid "Cell Display" msgstr "Показ ячейки" #: src/ui/gui/crosstabs.ui:99 msgid "Crosstabs" msgstr "Таблицы сопряженности" #: src/ui/gui/crosstabs.ui:150 msgid "_Rows" msgstr "_Строка" #: src/ui/gui/crosstabs.ui:195 msgid "_Columns" msgstr "_Столбцы" #: src/ui/gui/crosstabs.ui:242 msgid "_Format..." msgstr "_Формат..." #: src/ui/gui/crosstabs.ui:256 src/ui/gui/examine.ui:267 msgid "_Statistics..." msgstr "_Статистика..." #: src/ui/gui/crosstabs.ui:270 msgid "Ce_lls..." msgstr "_Ячейки..." #: src/ui/gui/crosstabs.ui:348 msgid "Crosstabs: Format" msgstr "Таблицы сопряженности: формат" #: src/ui/gui/crosstabs.ui:371 msgid "Print tables" msgstr "Напечатать таблицу" #: src/ui/gui/crosstabs.ui:387 msgid "Pivot" msgstr "Сводная таблица" #: src/ui/gui/crosstabs.ui:403 src/ui/gui/sort.ui:157 msgid "Ascending" msgstr "по возрастанию" #: src/ui/gui/crosstabs.ui:455 msgid "Crosstabs: Statistics" msgstr "Таблицы сопряженности: статистика" #: src/ui/gui/chi-square.ui:30 msgid "Chi-Square Test" msgstr "Проверка χ2" #: src/ui/gui/chi-square.ui:82 msgid "All categor_ies equal" msgstr "Все категории равны" #: src/ui/gui/chi-square.ui:103 msgid "_Values" msgstr "_Значения" #: src/ui/gui/chi-square.ui:159 msgid "Expected Values:" msgstr "Ожидаемые значения:" #: src/ui/gui/chi-square.ui:204 msgid "Test _Variables" msgstr "Тест переменных" #: src/ui/gui/chi-square.ui:298 msgid "Use _specified range" msgstr "Использовать _указанный диапазон" #: src/ui/gui/chi-square.ui:323 msgid "_Lower:" msgstr "_Нижний:" #: src/ui/gui/chi-square.ui:337 msgid "_Upper:" msgstr "_Верхний:" #: src/ui/gui/chi-square.ui:381 msgid "Expected Range:" msgstr "Ожидаемый диапазон" #: src/ui/gui/descriptives.ui:131 src/ui/gui/factor.ui:797 #: src/ui/gui/recode.ui:638 msgid "_Variables:" msgstr "_Переменные:" #: src/ui/gui/descriptives.ui:176 msgid "S_tatistics:" msgstr "С_татистика:" #: src/ui/gui/descriptives.ui:230 msgid "_Exclude entire case if any selected variable is missing" msgstr "" "_Исключить все наблюдения, если не хватает хотя бы одной обозначенной " "переменной" #: src/ui/gui/descriptives.ui:247 msgid "_Include user-missing data in analysis" msgstr "_Исключить данные с пропущенными позициями к анализу" #: src/ui/gui/descriptives.ui:264 msgid "Save _Z-scores of selected variables as new variables" msgstr "Сохранить Z-_оценки обозначенных переменных как новые переменные" #: src/ui/gui/descriptives.ui:286 msgid "Options:" msgstr "Параметры:" #: src/ui/gui/examine.ui:25 msgid "Explore" msgstr "Исследование" #: src/ui/gui/examine.ui:69 msgid "_Label Cases by:" msgstr "_Метки наблюдения:" #: src/ui/gui/examine.ui:116 msgid "_Factor List:" msgstr "Список _факторов:" #: src/ui/gui/examine.ui:163 src/ui/gui/means.ui:126 msgid "_Dependent List:" msgstr "Список зависимых:" #: src/ui/gui/examine.ui:331 msgid "Explore: Options" msgstr "Исследование: параметры" #: src/ui/gui/examine.ui:355 src/ui/gui/t-test.ui:81 msgid "Exclude cases _listwise" msgstr "Исключить наблюдения _целиком" #: src/ui/gui/examine.ui:373 msgid "Exclude cases _pairwise" msgstr "Исключить наблюдения _попарно" #: src/ui/gui/examine.ui:392 msgid "_Report values" msgstr "_Отчет о значениях" #: src/ui/gui/examine.ui:449 msgid "Explore: Statistics" msgstr "Исследование: статистика" #: src/ui/gui/examine.ui:468 src/ui/gui/oneway.ui:576 msgid "_Descriptives" msgstr "_Описательные статистики" #: src/ui/gui/examine.ui:485 msgid "_Extremes" msgstr "_Экстремальные значения" #: src/ui/gui/examine.ui:502 msgid "_Percentiles" msgstr "_Процентили" #: src/ui/gui/goto-case.ui:31 msgid "Goto Case" msgstr "Переход к наблюдению" #: src/ui/gui/goto-case.ui:52 msgid "Goto Case Number:" msgstr "Номер наблюдения для перехода:" #: src/ui/gui/factor.ui:39 msgid "Factor Analysis: Rotation" msgstr "Факторный анализ: вращение" #: src/ui/gui/factor.ui:70 msgid "_None" msgstr "_Нет" #: src/ui/gui/factor.ui:87 msgid "_Varimax" msgstr "_Варимакс" #: src/ui/gui/factor.ui:104 msgid "_Quartimax" msgstr "_Квартимакс" #: src/ui/gui/factor.ui:123 msgid "_Equimax" msgstr "_Эквимакс" #: src/ui/gui/factor.ui:146 msgid "Method" msgstr "Метод" #: src/ui/gui/factor.ui:159 msgid "_Display rotated solution" msgstr "_Показать развернутое решение" #: src/ui/gui/factor.ui:181 src/ui/gui/factor.ui:582 msgid "Ma_ximum iterations for convergence:" msgstr "Максимальное число итераций для сходимости:" #: src/ui/gui/factor.ui:241 src/ui/gui/factor.ui:255 msgid "Principal Components Analysis" msgstr "Анализ основных компонентов" #: src/ui/gui/factor.ui:246 src/ui/gui/factor.ui:258 msgid "Principal Axis Factoring" msgstr "Факторизация главных осей" #: src/ui/gui/factor.ui:264 msgid "Factor Analysis: Extraction" msgstr "Факторный анализ: Извлечение" #: src/ui/gui/factor.ui:290 msgid "_Method: " msgstr "_Метод: " #: src/ui/gui/factor.ui:345 msgid "Co_rrelation matrix" msgstr "_Матрица корреляций" #: src/ui/gui/factor.ui:361 msgid "Co_variance matrix" msgstr "_Ковариационная матрица" #: src/ui/gui/factor.ui:382 msgid "Analyze" msgstr "Проанализировать" #: src/ui/gui/factor.ui:407 msgid "_Unrotated factor solution" msgstr "_В этом состоянии фактор решения" #: src/ui/gui/factor.ui:423 msgid "_Scree plot" msgstr "_График собственных значений" #: src/ui/gui/factor.ui:443 src/ui/gui/histogram.ui:146 src/ui/gui/roc.ui:329 msgid "Display" msgstr "Показать" #: src/ui/gui/factor.ui:526 msgid "_Number of factors:" msgstr "_Номера факторов:" #: src/ui/gui/factor.ui:563 msgid "Extract" msgstr "Извлечь" #: src/ui/gui/factor.ui:640 msgid "Factor Analysis" msgstr "Факторный анализ" #: src/ui/gui/factor.ui:672 src/ui/gui/data-editor.ui:266 msgid "_Descriptives..." msgstr "_Описательные статистики..." #: src/ui/gui/factor.ui:685 msgid "_Extraction..." msgstr "_Извлечение..." #: src/ui/gui/factor.ui:699 msgid "_Rotations..." msgstr "_Вращения..." #: src/ui/gui/find.ui:25 msgid "Find Case" msgstr "Поиск наблюдения" #: src/ui/gui/find.ui:117 msgid "Variable:" msgstr "Переменная:" #: src/ui/gui/find.ui:157 src/ui/gui/val-labs-dialog.ui:113 msgid "Value:" msgstr "Значение:" #: src/ui/gui/find.ui:180 msgid "Search value labels" msgstr "Искать метки переменных" #: src/ui/gui/find.ui:210 msgid "Regular expression Match" msgstr "Соответствие по формальным выражением" #: src/ui/gui/find.ui:227 msgid "Search substrings" msgstr "Искать в тексте" #: src/ui/gui/find.ui:244 msgid "Wrap around" msgstr "Искать по кругу" #: src/ui/gui/find.ui:260 msgid "Search backward" msgstr "Искать в обратном направлении" #: src/ui/gui/frequencies.ui:32 msgid "Frequencies: Frequency Tables" msgstr "Частоты: таблицы частот" #: src/ui/gui/frequencies.ui:67 msgid "_Always" msgstr "_Всегда" #: src/ui/gui/frequencies.ui:85 msgid "_Never" msgstr "_Никогда" #: src/ui/gui/frequencies.ui:107 msgid "If no _more than " msgstr "Если имеем не _больше чем " #: src/ui/gui/frequencies.ui:129 src/ui/gui/frequencies.ui:454 msgid "100" msgstr "" #: src/ui/gui/frequencies.ui:145 msgid "values" msgstr "значение" #: src/ui/gui/frequencies.ui:167 msgid "Display frequency tables" msgstr "Показ таблиц частот" #: src/ui/gui/frequencies.ui:194 msgid "A_scending value" msgstr "По возрастанию значения" #: src/ui/gui/frequencies.ui:212 msgid "D_escending value" msgstr "По убыванию значения" #: src/ui/gui/frequencies.ui:230 msgid "Ascending _frequency" msgstr "По возрастанию частоты" #: src/ui/gui/frequencies.ui:248 msgid "Descending f_requency" msgstr "По убыванию _частоты" #: src/ui/gui/frequencies.ui:271 msgid "Order by" msgstr "Критерий сортировки" #: src/ui/gui/frequencies.ui:324 msgid "Frequencies: Charts" msgstr "Частоты: диаграммы" #: src/ui/gui/frequencies.ui:356 msgid "Scale:" msgstr "Шкала:" #: src/ui/gui/frequencies.ui:366 msgid "_Frequencies" msgstr "_Частоты" #: src/ui/gui/frequencies.ui:383 msgid "_Percentages" msgstr "_Проценты" #: src/ui/gui/frequencies.ui:407 msgid "Exclude values _below " msgstr "Исключить, значения _меньше" #: src/ui/gui/frequencies.ui:422 msgid "Exclude values _above " msgstr "Исключить, значения _больше " #: src/ui/gui/frequencies.ui:441 src/ui/gui/reliability.ui:227 msgid "0" msgstr "" #: src/ui/gui/frequencies.ui:469 msgid "Chart Formatting" msgstr "Форматирование" #: src/ui/gui/frequencies.ui:494 msgid "Draw _histograms" msgstr "Рисовать _гистограммы" #: src/ui/gui/frequencies.ui:510 msgid "Superimpose _normal curve" msgstr "Наложить _кривую нормального распределения" #: src/ui/gui/frequencies.ui:530 msgid "Histograms" msgstr "Гистограмма" #: src/ui/gui/frequencies.ui:555 msgid "Draw _bar charts" msgstr "Рисовать _столбиковые диаграммы" #: src/ui/gui/frequencies.ui:575 msgid "Bar Charts" msgstr "Столбиковые диаграммы" #: src/ui/gui/frequencies.ui:600 msgid "Draw _pie charts" msgstr "Рисовать _круговые диаграммы" #: src/ui/gui/frequencies.ui:616 msgid "Include slices for _missing values" msgstr "Включить секторы для пропущенных значений" #: src/ui/gui/frequencies.ui:636 msgid "Pie Charts" msgstr "Круговые диаграммы" #: src/ui/gui/frequencies.ui:725 src/ui/gui/rank.ui:489 msgid "_Variable(s):" msgstr "_Переменная(ые):" #: src/ui/gui/frequencies.ui:769 msgid "_Statistics:" msgstr "_Статистики:" #: src/ui/gui/frequencies.ui:783 msgid "Include _missing values" msgstr "Включить пропущенные значения" #: src/ui/gui/frequencies.ui:806 msgid "Ch_arts..." msgstr "_Диаграммы..." #: src/ui/gui/frequencies.ui:821 msgid "Frequency _Tables..." msgstr "_Таблицы частот..." #: src/ui/gui/histogram.ui:24 #, fuzzy #| msgid "Histograms" msgid "Histogram" msgstr "Гистограмма" #: src/ui/gui/histogram.ui:126 #, fuzzy #| msgid "Superimpose _normal curve" msgid "_Display normal curve" msgstr "Наложить _кривую нормального распределения" #: src/ui/gui/indep-samples.ui:25 src/ui/gui/k-independent.ui:35 msgid "Define Groups" msgstr "Определение групп" #: src/ui/gui/indep-samples.ui:75 msgid "Group_2 value:" msgstr "Значение группы_2:" #: src/ui/gui/indep-samples.ui:89 msgid "Group_1 value:" msgstr "Значение группы_1:" #: src/ui/gui/indep-samples.ui:190 msgid "_Use specified values:" msgstr "Использовать указанные значения:" #: src/ui/gui/indep-samples.ui:259 msgid "Independent-Samples T Test" msgstr "T-проверка независимых выборок" #: src/ui/gui/indep-samples.ui:319 msgid "_Define Groups..." msgstr "_Назначить группы..." #: src/ui/gui/indep-samples.ui:401 src/ui/gui/t-test.ui:211 msgid "_Test Variable(s):" msgstr "_Переменные для проверки:" #: src/ui/gui/indep-samples.ui:454 src/ui/gui/k-independent.ui:165 msgid "_Grouping Variable:" msgstr "_Группировка переменной:" #: src/ui/gui/k-independent.ui:63 #, fuzzy #| msgid "_Upper:" msgid "_Upper limit:" msgstr "_Верхний:" #: src/ui/gui/k-independent.ui:77 #, fuzzy #| msgid "_Lower:" msgid "_Lower limit:" msgstr "_Нижний:" #: src/ui/gui/k-independent.ui:136 #, fuzzy #| msgid "Tests for Several Related Samples" msgid "Tests for Several Independent Samples" msgstr "Тесты для нескольких связанных выборок" #: src/ui/gui/k-independent.ui:208 src/ui/gui/ks-one-sample.ui:131 msgid "Test _Variable List:" msgstr "Список переменных для тестирования:" #: src/ui/gui/k-independent.ui:320 #, fuzzy #| msgid "Define Groups" msgid "_Define Groups" msgstr "Определение групп" #: src/ui/gui/k-independent.ui:365 msgid "_Kruskal-Wallis H" msgstr "" #: src/ui/gui/k-independent.ui:382 src/ui/gui/runs.ui:140 msgid "_Median" msgstr "_Медиана" #: src/ui/gui/k-means.ui:24 msgid "K-Means Cluster Analysis" msgstr "Кластерный анализ методом k-средних" #: src/ui/gui/k-means.ui:122 msgid "N_umber of Clusters: " msgstr "_Номер кластеров: " #: src/ui/gui/k-related.ui:24 msgid "Tests for Several Related Samples" msgstr "Тесты для нескольких связанных выборок" #: src/ui/gui/k-related.ui:113 msgid "_Test Variables:" msgstr "Переменные для проверки:" #: src/ui/gui/k-related.ui:145 msgid "_Friedman" msgstr "_Фридмана" #: src/ui/gui/k-related.ui:161 msgid "_Kendall's W" msgstr "W _Кендала" #: src/ui/gui/k-related.ui:177 msgid "_Cochran's Q" msgstr "К_ритерий Кохрена" #: src/ui/gui/ks-one-sample.ui:163 msgid "_Normal" msgstr "_Нормальный" #: src/ui/gui/ks-one-sample.ui:181 msgid "_Poisson" msgstr "_Пуассона" #: src/ui/gui/ks-one-sample.ui:198 msgid "_Uniform" msgstr "_Однородный" #: src/ui/gui/ks-one-sample.ui:213 msgid "_Exponential" msgstr "_Экспоненциальный" #: src/ui/gui/ks-one-sample.ui:232 msgid "Test Distribution" msgstr "Проверка распределения" #: src/ui/gui/logistic.ui:42 msgid "Logistic Regression: Options" msgstr "Логистическая регрессия: параметры" #: src/ui/gui/logistic.ui:66 msgid "CI for _exp(B): " msgstr "Доверительный интервал _exp(B): " #: src/ui/gui/logistic.ui:97 msgid "%" msgstr "%" #: src/ui/gui/logistic.ui:146 msgid "Classification cu_toff: " msgstr "Порог классификации: " #: src/ui/gui/logistic.ui:159 msgid "_Maximum Iterations: " msgstr "_Макс. кол-во итераций: " #: src/ui/gui/logistic.ui:177 msgid "Include _constant in model" msgstr "Включить _константу в модель" #: src/ui/gui/logistic.ui:219 msgid "Logistic Regression" msgstr "Логистическая регрессия" #: src/ui/gui/logistic.ui:364 src/ui/gui/regression.ui:185 msgid "_Dependent" msgstr "Зависимые" #: src/ui/gui/logistic.ui:412 src/ui/gui/regression.ui:232 msgid "_Independent" msgstr "Независимые" #: src/ui/gui/means.ui:25 msgid "Means" msgstr "Средние" #: src/ui/gui/means.ui:179 msgid "_Independent List:" msgstr "Список _незалвисимых:" #: src/ui/gui/missing-val-dialog.ui:48 msgid "_No missing values" msgstr "_Без пропущенных значений" #: src/ui/gui/missing-val-dialog.ui:136 msgid "_Discrete missing values" msgstr "_Дискретные пропущенные значения" #: src/ui/gui/missing-val-dialog.ui:172 msgid "_Low:" msgstr "_Наименьший:" #: src/ui/gui/missing-val-dialog.ui:197 msgid "_High:" msgstr "Наибольший:" #: src/ui/gui/missing-val-dialog.ui:221 msgid "Di_screte value:" msgstr "Дискретное значение:" #: src/ui/gui/missing-val-dialog.ui:245 msgid "_Range plus one optional discrete missing value" msgstr "_Диапазон плюс одно необязательное дискретное пропущенное значение" #: src/ui/gui/oneway.ui:25 msgid "One-Way ANOVA: Contrasts" msgstr "Однофакторный ANOVA: контрасты" #: src/ui/gui/oneway.ui:107 msgid "_Coefficients:" msgstr "_Коэффициенты:" #: src/ui/gui/oneway.ui:161 msgid "Coefficient Total: " msgstr "_Коэффициент Общий:" #: src/ui/gui/oneway.ui:198 msgid "Contrast 1 of 1" msgstr "Контраст 1 из 1" #: src/ui/gui/oneway.ui:234 #, fuzzy #| msgid "One-Way ANOVA: Contrasts" msgid "One-Way ANOVA: Post-Hoc" msgstr "Однофакторный ANOVA: контрасты" #: src/ui/gui/oneway.ui:270 #, fuzzy #| msgid "Games-Howell" msgid "Games Howell" msgstr "Ґеймс-Гауел" #: src/ui/gui/oneway.ui:287 msgid "Fisher's LSD" msgstr "" #: src/ui/gui/oneway.ui:379 msgid "One-Way ANOVA" msgstr "Однофакторный ANOVA" #: src/ui/gui/oneway.ui:408 msgid "_Factor:" msgstr "_Фактор:" #: src/ui/gui/oneway.ui:451 msgid "Dependent _Variable(s):" msgstr "Зависимые переменные:" #: src/ui/gui/oneway.ui:593 msgid "_Homogeneity" msgstr "_Гомогенность" #: src/ui/gui/oneway.ui:637 msgid "Post-Hoc..." msgstr "" #: src/ui/gui/oneway.ui:652 msgid "_Contrasts..." msgstr "_Контрасты..." #: src/ui/gui/options.ui:25 #, fuzzy #| msgid "Options" msgid "Options Case" msgstr "Параметры" #: src/ui/gui/options.ui:55 #, fuzzy #| msgid "Value _Labels" msgid "Display _Labels" msgstr "_Метки значений" #: src/ui/gui/options.ui:71 #, fuzzy #| msgid "Display" msgid "Display _Names" msgstr "Показать" #: src/ui/gui/options.ui:99 #, fuzzy #| msgid "Sort by label" msgid "Sort by L_abel" msgstr "Упорядочить по ярлыку" #: src/ui/gui/options.ui:115 #, fuzzy #| msgid "Sort by name" msgid "Sort by Na_me" msgstr "Упорядочить по названию" #: src/ui/gui/options.ui:131 msgid "Do not S_ort" msgstr "" #: src/ui/gui/options.ui:159 #, fuzzy #| msgid "Variables" msgid "Variable Lists" msgstr "Переменные" #: src/ui/gui/options.ui:184 msgid "Ma_ximize" msgstr "" #: src/ui/gui/options.ui:199 msgid "_Raise" msgstr "" #: src/ui/gui/options.ui:214 msgid "Aler_t" msgstr "" #: src/ui/gui/options.ui:233 msgid "Output Window Action" msgstr "" #: src/ui/gui/paired-samples.ui:147 msgid "_Test Pair(s):" msgstr "_Тест пары:" #: src/ui/gui/rank.ui:30 msgid "Rank Cases: Types" msgstr "Ранжирование наблюдений: типы" #: src/ui/gui/rank.ui:57 msgid "Sum of case _weights" msgstr "Сумма значений _вес наблюдений" #: src/ui/gui/rank.ui:74 msgid "Fractional rank as _%" msgstr "Дробный ранг _у %" #: src/ui/gui/rank.ui:92 msgid "_Fractional rank" msgstr "_Дробный ранг" #: src/ui/gui/rank.ui:109 msgid "_Savage score" msgstr "Баллы _Севеджа" #: src/ui/gui/rank.ui:125 msgid "_Rank" msgstr "_Ранг" #: src/ui/gui/rank.ui:147 msgid "N_tiles" msgstr "N-разбивки" #: src/ui/gui/rank.ui:195 msgid "_Proportion Estimates" msgstr "Оценка частей" #: src/ui/gui/rank.ui:213 msgid "_Normal Scores" msgstr "_Нормальное значение" #: src/ui/gui/rank.ui:251 msgid "_Blom" msgstr "_Блома" #: src/ui/gui/rank.ui:269 msgid "Tuke_y" msgstr "Ту_ки" #: src/ui/gui/rank.ui:287 msgid "Ran_kit" msgstr "_Ранкит" #: src/ui/gui/rank.ui:305 msgid "_Van der Waerden" msgstr "_Ван дер-Вардена" #: src/ui/gui/rank.ui:328 msgid "Proportion Estimation Formula" msgstr "Формула оценки частей" #: src/ui/gui/rank.ui:369 msgid "Rank Cases" msgstr "Ранжирование наблюдений" #: src/ui/gui/rank.ui:434 msgid "_By:" msgstr "_Критерий:" #: src/ui/gui/rank.ui:595 msgid "_Smallest Value" msgstr "_меньшему значению" #: src/ui/gui/rank.ui:613 msgid "_Largest Value" msgstr "Большему значению" #: src/ui/gui/rank.ui:637 msgid "Assign rank 1 to:" msgstr "Придать ранг 1:" #: src/ui/gui/rank.ui:656 msgid "_Display summary tables" msgstr "Показывать таблицы резюме" #: src/ui/gui/rank.ui:679 msgid "Rank T_ypes" msgstr "_Типы рангов" #: src/ui/gui/rank.ui:694 msgid "_Ties..." msgstr "_Связи..." #: src/ui/gui/rank.ui:756 msgid "Rank Cases: Ties" msgstr "Ранжирование наблюдений: совпадения" #: src/ui/gui/rank.ui:788 msgid "_Mean" msgstr "_Средний" #: src/ui/gui/rank.ui:806 msgid "_Low" msgstr "_Меньший" #: src/ui/gui/rank.ui:825 msgid "_High" msgstr "_Больший" #: src/ui/gui/rank.ui:851 msgid "_Sequential ranks to unique values" msgstr "_Последовательные ряды уникальных значений" #: src/ui/gui/rank.ui:875 msgid "Rank Assigned to Ties" msgstr "Ранги совпадений в наблюдениях" #: src/ui/gui/runs.ui:155 msgid "M_ean" msgstr "Сререднее значение" #: src/ui/gui/runs.ui:171 msgid "Mo_de" msgstr "_Мода" #: src/ui/gui/runs.ui:191 msgid "_Custom:" msgstr "_Нестандартный:" #: src/ui/gui/runs.ui:230 msgid "Cut Point" msgstr "Пороговое значение" #: src/ui/gui/sort.ui:25 msgid "Sort Cases" msgstr "Упорядочивание наблюдений" #: src/ui/gui/sort.ui:101 msgid "Sort by:" msgstr "Критерий сортировки:" #: src/ui/gui/sort.ui:174 msgid "Descending" msgstr "По убыванию" #: src/ui/gui/sort.ui:196 msgid "Sort Order" msgstr "Порядок" #: src/ui/gui/split-file.ui:25 msgid "Split File" msgstr "Разделить файл" #: src/ui/gui/split-file.ui:103 msgid "Anal_yze all cases. Do not create groups." msgstr "_Проанализировать все случаи. Не создавать группы." #: src/ui/gui/split-file.ui:121 msgid "Compare _groups." msgstr "Сравнить _группы." #: src/ui/gui/split-file.ui:140 msgid "Organize ou_tput by groups." msgstr "Упорядочить _результаты по группам." #: src/ui/gui/split-file.ui:225 msgid "Groups _based on:" msgstr "_Основа группировки:" #: src/ui/gui/split-file.ui:255 msgid "_Sort the file by grouping variables." msgstr "_Отсортировать файл, группируя переменные." #: src/ui/gui/split-file.ui:273 msgid "_File is already sorted." msgstr "_Файл уже отсортирован." #: src/ui/gui/split-file.ui:334 msgid "Current Status : " msgstr "Текущее состояние: " #: src/ui/gui/split-file.ui:348 msgid "Analysis by groups is off" msgstr "Анализ по группам выключен" #: src/ui/gui/recode.ui:135 msgid "System _Missing" msgstr "Системные _потери" #: src/ui/gui/recode.ui:150 msgid "Co_py old values" msgstr "_Копировать предыдущее значение" #: src/ui/gui/recode.ui:172 msgid "Va_lue: " msgstr "_Значение: " #: src/ui/gui/recode.ui:276 msgid "Conver_t numeric strings to numbers (`5' -> 5)" msgstr "Преобразование числовых строк в числа (`5' -> 5)" #: src/ui/gui/recode.ui:297 msgid "Output variables are _strings" msgstr "Выходные переменные являются строками" #: src/ui/gui/recode.ui:318 msgid "Width: " msgstr "Ширина: " #: src/ui/gui/recode.ui:499 msgid "_Name:" msgstr "_Название:" #: src/ui/gui/recode.ui:527 msgid "La_bel:" msgstr "Метка:" #: src/ui/gui/recode.ui:556 msgid "Chan_ge" msgstr "Замена" #: src/ui/gui/recode.ui:584 msgid "Output Variable" msgstr "Выведенная переменная" #: src/ui/gui/recode.ui:658 msgid "Old and New Va_lues..." msgstr "Предыдущие и новые значения..." #: src/ui/gui/regression.ui:51 msgid "S_tatistics..." msgstr "С_татистика..." #: src/ui/gui/regression.ui:272 msgid "Regression: Save" msgstr "Регрессия: сохранение" #: src/ui/gui/regression.ui:290 src/ui/gui/univariate.ui:42 msgid "_Predicted values" msgstr "_Прогнозные значения" #: src/ui/gui/regression.ui:307 src/ui/gui/univariate.ui:59 msgid "_Residuals" msgstr "_Излишки" #: src/ui/gui/regression.ui:351 msgid "Regression: Statistics" msgstr "Регрессия: статистика" #: src/ui/gui/regression.ui:393 src/ui/gui/univariate.ui:143 msgid "S_tatistics" msgstr "С_татистика" #: src/ui/gui/reliability.ui:34 msgid "Alpha" msgstr "α" #: src/ui/gui/reliability.ui:43 msgid "Reliability Analysis" msgstr "Анализ пригодности" #: src/ui/gui/reliability.ui:144 msgid "_Items:" msgstr "_Пункты:" #: src/ui/gui/reliability.ui:166 msgid "_Model: " msgstr "_Модель: " #: src/ui/gui/reliability.ui:212 msgid "_Variables in first split:" msgstr "Переменные в первом разделении:" #: src/ui/gui/reliability.ui:259 msgid "Show _descriptives for scale if item is deleted" msgstr "Показать _описательные статистики для шкалы, если элемент удален" #: src/ui/gui/roc.ui:145 msgid "_Test Variable:" msgstr "Переменная для проверки:" #: src/ui/gui/roc.ui:175 msgid "_State Variable:" msgstr "_Переменная Состояния:" #: src/ui/gui/roc.ui:202 msgid "_Value of state variable:" msgstr "Значение переменной состояния:" #: src/ui/gui/roc.ui:249 msgid "ROC C_urve" msgstr "ROC-_кривая" #: src/ui/gui/roc.ui:269 msgid "_With diagonal reference line" msgstr "_С диагональной опорной линией" #: src/ui/gui/roc.ui:293 msgid "Standard _Error and Confidence Interval" msgstr "Стандартную ошибка и доверительный интервал" #: src/ui/gui/roc.ui:309 msgid "_Coordinate points of the ROC Curve" msgstr "Координаты точки ROC-кривой" #: src/ui/gui/scatterplot.ui:25 #, fuzzy #| msgid "Scatterplot %s" msgid "Scatterplot" msgstr "Точечная диаграмма %s" #: src/ui/gui/scatterplot.ui:56 msgid "_X Axis:" msgstr "" #: src/ui/gui/scatterplot.ui:100 msgid "_Y Axis:" msgstr "" #: src/ui/gui/select-cases.ui:37 msgid "Select Cases: Range" msgstr "Выбор наблюдений: диапазон" #: src/ui/gui/select-cases.ui:87 msgid "First case" msgstr "Первое наблюдение" #: src/ui/gui/select-cases.ui:99 msgid "Last case" msgstr "Последнее наблюдение" #: src/ui/gui/select-cases.ui:111 msgid "Observation" msgstr "Наблюдения" #: src/ui/gui/select-cases.ui:161 msgid "Select Cases" msgstr "Выбор наблюдений" #: src/ui/gui/select-cases.ui:313 msgid "Use filter variable" msgstr "Использовать переменную для фильтрации" #: src/ui/gui/select-cases.ui:380 msgid "Based on time or case range" msgstr "На основе времени или диапазона наблюдений" #: src/ui/gui/select-cases.ui:395 msgid "Range..." msgstr "Диапазон..." #: src/ui/gui/select-cases.ui:444 msgid "Random sample of cases" msgstr "Случайная выборка наблюдений" #: src/ui/gui/select-cases.ui:460 msgid "Sample..." msgstr "Выборка..." #: src/ui/gui/select-cases.ui:508 msgid "If condition is satisfied" msgstr "Если выполняется условие" #: src/ui/gui/select-cases.ui:523 msgid "If..." msgstr "Если..." #: src/ui/gui/select-cases.ui:567 msgid "All Cases" msgstr "Все наблюдения" #: src/ui/gui/select-cases.ui:581 msgid "Select" msgstr "Выбрать" #: src/ui/gui/select-cases.ui:608 msgid "Filtered" msgstr "Фильтрованные" #: src/ui/gui/select-cases.ui:625 msgid "Deleted" msgstr "Удаленные" #: src/ui/gui/select-cases.ui:647 msgid "Unselected Cases Are" msgstr "Невыбранные Случаи есть" #: src/ui/gui/select-cases.ui:694 msgid "Select Cases: Random Sample" msgstr "Выбор наблюдений: случайная выборка" #: src/ui/gui/select-cases.ui:756 msgid "Sample Size" msgstr "Размер выборки" #: src/ui/gui/t-test.ui:25 msgid "Options" msgstr "Параметры" #: src/ui/gui/t-test.ui:63 msgid "Exclude cases _analysis by analysis" msgstr "Исключить случаи _анализа путем анализа" #: src/ui/gui/t-test.ui:148 msgid "One - Sample T Test" msgstr "t-проверка одной выборки" #: src/ui/gui/t-test.ui:265 msgid "Test _Value: " msgstr "Значения для проверки: " #: src/ui/gui/text-data-import.ui:32 msgid "Select the first line of the data file that contains data." msgstr "Выберите первую строку файла данных, в котором содержатся данные." #: src/ui/gui/text-data-import.ui:54 msgid "Line above selected line contains variable names" msgstr "В строке над выделенной строкой содержатся названия переменных" #: src/ui/gui/text-data-import.ui:80 msgid "" "Check the data formats displayed below and fix any that are incorrect. You " "may set other variable properties now or later." msgstr "" "Ознакомьтесь с перечнем форматов данных, приведенным ниже, и исправьте " "ошибки в форматировании, если они есть. Вы можете определить свойства других " "переменных сейчас или позже." #: src/ui/gui/text-data-import.ui:121 msgid "Variables" msgstr "Переменные" #: src/ui/gui/text-data-import.ui:152 msgid "Data Preview" msgstr "просмотр данных" #: src/ui/gui/text-data-import.ui:181 #, fuzzy #| msgid "" #| "This assistant will guide you through the process of importing data into " #| "PSPP from a text file with one line per case, in which fields are " #| "separated by tabs, commas, or other delimiters.\n" #| "\n" #| "The selected file contains N lines of text. Only the first M of these " #| "will be shown for preview purposes in the following screens. You may " #| "choose below how much of the file should actually be imported." msgid "" "This assistant will guide you through the process of importing data into " "PSPP from a text file with one line per case, in which fields are separated " "by tabs, commas, or other delimiters.\n" "\n" "\tThe selected file contains N lines of text. Only the first M of these " "will be shown for preview purposes in the following screens. You may choose " "below how much of the file should actually be imported." msgstr "" "Этот помощник проведет вас через процесс импорта данных в PSPP из текстового " "файла, каждая из записей которого расположена в отдельной строке, а поля " "разделены символами табуляции, запятыми или другими разделителями.\n" "\n" "В обозначенном файле содержится N строк текста. На следующих страницах " "мастера будут показаны только первые M записей с целью предварительного " "просмотра. Ниже вы можете выбрать объем данных, который будет импортирован." #: src/ui/gui/text-data-import.ui:252 msgid "All cases" msgstr "Все наблюдения" #: src/ui/gui/text-data-import.ui:272 msgid "Amount to Import" msgstr "Величина, которую следует импортировать" #: src/ui/gui/text-data-import.ui:325 msgid "C_ustom" msgstr "Нестандартный" #: src/ui/gui/text-data-import.ui:341 msgid "Slas_h (/)" msgstr "Наклонная черта (/)" #: src/ui/gui/text-data-import.ui:357 msgid "Semicolo_n (;)" msgstr "Точка с запятой (;)" #: src/ui/gui/text-data-import.ui:373 msgid "P_ipe (|)" msgstr "_Риска (|)" #: src/ui/gui/text-data-import.ui:389 msgid "H_yphen (-)" msgstr "_Дефис (-)" #: src/ui/gui/text-data-import.ui:405 msgid "Co_mma (,)" msgstr "Запятая (,)" #: src/ui/gui/text-data-import.ui:421 msgid "_Colon (:)" msgstr "Двоеточие (:)" #: src/ui/gui/text-data-import.ui:437 msgid "Ban_g (!)" msgstr "Восклицательный знак (!)" #: src/ui/gui/text-data-import.ui:453 msgid "Ta_b" msgstr "_Табуляция" #: src/ui/gui/text-data-import.ui:469 msgid "_Space" msgstr "_Пробел" #: src/ui/gui/text-data-import.ui:490 msgid "Separators" msgstr "Разделители" #: src/ui/gui/text-data-import.ui:541 msgid "Quote separator characters with" msgstr "Обозначать символы разделителя" #: src/ui/gui/text-data-import.ui:561 msgid "Quoting" msgstr "Кавычки" #: src/ui/gui/text-data-import.ui:599 msgid "Fields Preview" msgstr "просмотр полей" #: src/ui/gui/text-data-import.ui:622 msgid "" "Enter below the sheet number and the cell range which you wish to import." msgstr "" "Ниже укажите номер листа и диапазон ячеек, данные из которые нужно " "импортировать." #: src/ui/gui/text-data-import.ui:670 msgid "_Cells: " msgstr "_Ячейки: " #: src/ui/gui/text-data-import.ui:684 msgid "_Sheet Index: " msgstr "Индекс листа: " #: src/ui/gui/text-data-import.ui:695 msgid "Use first row as _variable names" msgstr "Считать первую строку строкой _названием переменных" #: src/ui/gui/text-data-import.ui:717 msgid "Cells to Import" msgstr "Ячейки для импорта" #: src/ui/gui/transpose.ui:24 msgid "Transpose" msgstr "Транспонирование" #: src/ui/gui/transpose.ui:91 msgid "Name Variable:" msgstr "_Имя Переменной:" #: src/ui/gui/transpose.ui:127 msgid "Variable(s):" msgstr "Переменная(ые):" #: src/ui/gui/univariate.ui:25 msgid "Univariate: Save" msgstr "Одномерный: сохранить" #: src/ui/gui/univariate.ui:103 msgid "Univariate: Statistics" msgstr "Одномерный: статистика" #: src/ui/gui/univariate.ui:178 msgid "Univariate" msgstr "Одномерный" #: src/ui/gui/univariate.ui:281 msgid "_Dependent Variable" msgstr "Зависимая переменная" #: src/ui/gui/univariate.ui:329 msgid "_Fixed Factors" msgstr "_Фиксованные факторы" #: src/ui/gui/val-labs-dialog.ui:101 msgid "Value Label:" msgstr "Метка значения:" #: src/ui/gui/data-editor.ui:33 msgid "Information Area" msgstr "Область информации" #: src/ui/gui/data-editor.ui:55 msgid "Case Counter Area" msgstr "Область счетчика наблюдений" #: src/ui/gui/data-editor.ui:80 msgid "Filter Use Status Area" msgstr "Фильтр Использования Состояния Области" #: src/ui/gui/data-editor.ui:106 msgid "Weight Status Area" msgstr "Область состояния взвешивания" #: src/ui/gui/data-editor.ui:132 msgid "Split File Status Area" msgstr "Область состояния разделения файла" #: src/ui/gui/data-editor.ui:154 msgid "_View" msgstr "_Просмотр" #: src/ui/gui/data-editor.ui:157 msgid "_Status Bar" msgstr "Пан_ель состояния" #: src/ui/gui/data-editor.ui:163 msgid "_Font..." msgstr "Исходные шрифты темы..." #: src/ui/gui/data-editor.ui:167 msgid "_Grid Lines" msgstr "_Линии решетки" #: src/ui/gui/data-editor.ui:171 msgid "Value _Labels" msgstr "_Метки значений" #: src/ui/gui/data-editor.ui:182 msgid "_Variables" msgstr "_Переменные" #: src/ui/gui/data-editor.ui:192 msgid "_Sort Cases..." msgstr "_Упорядочить наблюдения..." #: src/ui/gui/data-editor.ui:196 msgid "_Transpose..." msgstr "_Транспонировать..." #: src/ui/gui/data-editor.ui:200 msgid "_Aggregate..." msgstr "_Агрегировать..." #: src/ui/gui/data-editor.ui:206 msgid "S_plit File..." msgstr "По_делить файл..." #: src/ui/gui/data-editor.ui:210 msgid "Select _Cases..." msgstr "Выбрать _Наблюдение..." #: src/ui/gui/data-editor.ui:214 msgid "_Weight Cases..." msgstr "Взвесить наблюдения..." #: src/ui/gui/data-editor.ui:220 msgid "_Transform" msgstr "Трансформировать" #: src/ui/gui/data-editor.ui:223 msgid "_Compute..." msgstr "_Вычислить..." #: src/ui/gui/data-editor.ui:227 msgid "Cou_nt..." msgstr "Расчитать..." #: src/ui/gui/data-editor.ui:231 msgid "Ran_k Cases..." msgstr "_Ранжировать наблюдения..." #: src/ui/gui/data-editor.ui:235 msgid "Auto_matic Recode..." msgstr "_Автоматическое Перекодирование..." #: src/ui/gui/data-editor.ui:241 msgid "Recode into _Same Variables..." msgstr "Перекодировать в этих же переменных..." #: src/ui/gui/data-editor.ui:245 msgid "Recode into _Different Variables..." msgstr "Перекодировать в разные переменные..." #: src/ui/gui/data-editor.ui:251 msgid "_Run Pending Transforms" msgstr "_Выполнить преобразования из очереди" #: src/ui/gui/data-editor.ui:257 msgid "_Analyze" msgstr "_Анализ" #: src/ui/gui/data-editor.ui:260 msgid "_Descriptive Statistics" msgstr "_Описательные статистики" #: src/ui/gui/data-editor.ui:262 msgid "_Frequencies..." msgstr "_Частоты..." #: src/ui/gui/data-editor.ui:270 msgid "_Explore..." msgstr "_Исследовать..." #: src/ui/gui/data-editor.ui:274 msgid "_Crosstabs..." msgstr "_Таблицы сопряженности..." #: src/ui/gui/data-editor.ui:279 msgid "Compare _Means" msgstr "Сравнение_средних" #: src/ui/gui/data-editor.ui:281 msgid "_Means..." msgstr "_Средние..." #: src/ui/gui/data-editor.ui:285 msgid "_One Sample T Test..." msgstr "_T-проверка по одной выборке..." #: src/ui/gui/data-editor.ui:289 msgid "_Independent Samples T Test..." msgstr "T-проверка независимых выборок..." #: src/ui/gui/data-editor.ui:293 msgid "_Paired Samples T Test..." msgstr "T-проверка парных выборок..." #: src/ui/gui/data-editor.ui:297 msgid "One Way _ANOVA..." msgstr "Однофакторный _ANOVA..." #: src/ui/gui/data-editor.ui:302 msgid "_Univariate Analysis..." msgstr "_Одномерный анализ..." #: src/ui/gui/data-editor.ui:306 msgid "Bivariate _Correlation..." msgstr "Двумерная _корреляция..." #: src/ui/gui/data-editor.ui:310 msgid "_K-Means Cluster..." msgstr "_Кластер k-средних..." #: src/ui/gui/data-editor.ui:314 #, fuzzy #| msgid "Factor _Analysis..." msgid "_Factor Analysis..." msgstr "Факторный _анализ..." #: src/ui/gui/data-editor.ui:318 msgid "Re_liability..." msgstr "_Достоверность..." #: src/ui/gui/data-editor.ui:322 msgid "_Regression" msgstr "_Регрессия" #: src/ui/gui/data-editor.ui:325 msgid "_Linear..." msgstr "_Линейная..." #: src/ui/gui/data-editor.ui:329 msgid "_Binary Logistic..." msgstr "_Бинарная логистическая..." #: src/ui/gui/data-editor.ui:335 msgid "_Non-Parametric Statistics" msgstr "_Непараметрическая статистика" #: src/ui/gui/data-editor.ui:338 #, fuzzy #| msgid "_Chi-Square..." msgid "_Chi Square..." msgstr "χ -_квадрат..." #: src/ui/gui/data-editor.ui:342 msgid "_Binomial..." msgstr "_Биномиальный..." #: src/ui/gui/data-editor.ui:346 #, fuzzy #| msgid "R_uns..." msgid "_Runs..." msgstr "_Серии..." #: src/ui/gui/data-editor.ui:350 #, fuzzy #| msgid "1-Sample _K-S..." msgid "_1 Sample K-S..." msgstr "Тест Колмогорова-Смирнова для одной выборки..." #: src/ui/gui/data-editor.ui:354 #, fuzzy #| msgid "2 _Related Samples..." msgid "_2 Related Samples..." msgstr "2 _Связанные выборки..." #: src/ui/gui/data-editor.ui:358 #, fuzzy #| msgid "K Related _Samples..." msgid "_K Related Samples..." msgstr "K связанных выборок..." #: src/ui/gui/data-editor.ui:362 #, fuzzy #| msgid "_Independent Samples T Test..." msgid "K _Independent Samples..." msgstr "T-проверка независимых выборок..." #: src/ui/gui/data-editor.ui:368 msgid "ROC Cur_ve..." msgstr "ROC-к_ривая..." #: src/ui/gui/data-editor.ui:374 msgid "_Graphs" msgstr "" #: src/ui/gui/data-editor.ui:377 #, fuzzy #| msgid "Scatterplot %s" msgid "_Scatterplot" msgstr "Точечная диаграмма %s" #: src/ui/gui/data-editor.ui:381 #, fuzzy #| msgid "Draw _histograms" msgid "_Histogram" msgstr "Рисовать _гистограммы" #: src/ui/gui/data-editor.ui:385 #, fuzzy #| msgid "Bar Chart" msgid "_Barchart" msgstr "Столбчатая диаграмма" #: src/ui/gui/data-editor.ui:391 msgid "_Utilities" msgstr "_Сервис" #: src/ui/gui/data-editor.ui:394 msgid "_Variables..." msgstr "_Переменные..." #: src/ui/gui/data-editor.ui:398 msgid "Data File _Comments..." msgstr "_Коментарии базы данных..." #: src/ui/gui/output-window.ui:71 msgid "_Print..." msgstr "_Печать..." #: src/ui/gui/output-window.ui:76 msgid "_Export..." msgstr "_Экспорт..." #: src/ui/gui/output-window.ui:92 msgid "Select _All" msgstr "Выбрать _всё" #: src/ui/gui/syntax-editor.ui:27 #, fuzzy #| msgid "_Syntax" msgid "Syntax" msgstr "_Синтаксис" #: src/ui/gui/syntax-editor.ui:31 #, fuzzy #| msgid "_Data" msgid "Data" msgstr "_Данные" #: src/ui/gui/syntax-editor.ui:41 msgid "_Save" msgstr "Сохранить" #: src/ui/gui/syntax-editor.ui:46 #, fuzzy #| msgid "Save _As..." msgid "Save _As" msgstr "Сохранить _как..." #: src/ui/gui/syntax-editor.ui:53 #, fuzzy #| msgid "_Print..." msgid "_Print" msgstr "_Печать..." #: src/ui/gui/syntax-editor.ui:84 #, fuzzy #| msgid "Deleted" msgid "_Delete" msgstr "Удаленные" #: src/ui/gui/syntax-editor.ui:90 msgid "_Undo" msgstr "" #: src/ui/gui/syntax-editor.ui:94 msgid "_Redo" msgstr "" #: src/ui/gui/syntax-editor.ui:100 #, fuzzy #| msgid "_Find..." msgid "_Find" msgstr "_Искать..." #: src/ui/gui/syntax-editor.ui:106 msgid "_Run" msgstr "З_апустить" #: src/ui/gui/syntax-editor.ui:109 msgid "_All" msgstr "" #: src/ui/gui/syntax-editor.ui:113 #, fuzzy #| msgid "Selection" msgid "_Selection" msgstr "Выбранные" #: src/ui/gui/syntax-editor.ui:117 #, fuzzy #| msgid "Current Line" msgid "_Current Line" msgstr "Текущая строка" #: src/ui/gui/syntax-editor.ui:122 #, fuzzy #| msgid "To End" msgid "_To End" msgstr "До конца" #: src/ui/gui/var-type-dialog.ui:99 msgid "Scientific notation" msgstr "Инженерная запись" #: src/ui/gui/var-type-dialog.ui:150 msgid "Custom currency" msgstr "Нетипичная валюта" #: src/ui/gui/var-type-dialog.ui:267 msgid "positive" msgstr "положительная" #: src/ui/gui/var-type-dialog.ui:279 msgid "negative" msgstr "отрицательная" #: src/ui/gui/var-type-dialog.ui:293 msgid "Sample" msgstr "Выборка" #: src/ui/gui/var-type-dialog.ui:350 msgid "Width:" msgstr "Ширина:" #: src/ui/gui/var-type-dialog.ui:396 msgid "Decimal Places:" msgstr "Десятичные знаки:" #: src/ui/gui/weight.ui:24 msgid "Weight Cases" msgstr "Вес наблюдений" #: src/ui/gui/weight.ui:100 msgid "Weight cases by" msgstr "Взвесить наблюдения за" #: src/ui/gui/weight.ui:144 msgid "Frequency Variable" msgstr "Переменная частоты" #: src/ui/gui/weight.ui:198 msgid "Current Status: " msgstr "Текущее состояние: " #. TRANSLATORS: This is the application name in the desktop file #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:7 #: src/ui/gui/org.fsf.pspp.desktop.in:7 msgid "GNU PSPP" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:8 #, fuzzy #| msgid "A program for the analysis of sampled data" msgid "GNU PSPP is a program for statistical analysis of sampled data" msgstr "Программа для анализа данных" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:10 msgid "" "GNU PSPP is a program for the statistical analysis of sampled data. It is a " "Free replacement for the proprietary program SPSS, and appears very similar " "to it with a few exceptions. The most important of these exceptions are, " "that there are no “time bombs”; your copy of PSPP will not “expire” or " "deliberately stop working in the future. Neither are there any artificial " "limits on the number of cases or variables which you can use. There are no " "additional packages to purchase in order to get “advanced” functions; all " "functionality that PSPP currently supports is in the core package." msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:11 msgid "" "PSPP is a stable and reliable application. It can perform descriptive " "statistics, T-tests, anova, linear and logistic regression, measures of " "association, cluster analysis, reliability and factor analysis, non-" "parametric tests and more. Its backend is designed to perform its analyses " "as fast as possible, regardless of the size of the input data. You can use " "PSPP with its graphical interface or the more traditional syntax commands." msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:12 msgid "A brief list of some of the PSPP's features." msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:14 msgid "Support for over 1 billion cases" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:15 msgid "Support for over 1 billion variables" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:16 msgid "Syntax and data files which are compatible with those of SPSS" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:17 msgid "A choice of terminal or graphical user interface" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:18 msgid "A choice of text, postscript, pdf, opendocument or html output formats" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:19 msgid "" "Inter-operability with: LibreOffice, Apache OpenOffice, Gnumeric and other " "free software" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:20 msgid "Easy data import from spreadsheets, text files and database sources" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:21 msgid "" "The capability to open, analyse and edit two or more datasets concurrently" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:22 msgid "A user interface supporting all common character sets" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:23 msgid "A user interface has been translated to multiple languages" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:24 msgid "Very fast statistical procedures, even on very large data sets" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:25 msgid "No license fees and no expiration period" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:26 msgid "No unethical “end user license agreements”" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:27 msgid "A fully indexed user manual" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:28 msgid "Freedom ensured; It is licensed under the GPLv3 or later" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:29 msgid "" "Portability; Runs on many different computers and many different operating " "systems" msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:31 msgid "" "PSPP is particularly aimed at statisticians, social scientists and students " "requiring fast convenient analysis of sampled data." msgstr "" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:41 #, fuzzy #| msgid "Variable View" msgid "GNU PSPP Variable View" msgstr "Просмотр переменных" #: src/ui/gui/org.fsf.pspp.metainfo.xml.in:54 msgid "Free Software Foundation" msgstr "" #: src/ui/gui/org.fsf.pspp.desktop.in:8 msgid "Statistical Software" msgstr "Статистическое программное обеспечение" #: src/ui/gui/org.fsf.pspp.desktop.in:9 msgid "Analyze statistical data with a free alternative to SPSS" msgstr "Анализ статистических данных в свободной альтернативе SPSS" #. TRANSLATORS: Do not translate this string. Keep it as is, verbatim. #: src/ui/gui/org.fsf.pspp.desktop.in:12 msgid "pspp" msgstr "" #. TRANSLATORS: You must keep all ";" - also at the end of line. #: src/ui/gui/org.fsf.pspp.desktop.in:17 msgid "statistics;analysis;spss;" msgstr "" #~ msgid "Sorry. The help system hasn't yet been implemented." #~ msgstr "К сожалению справка ещё не реализована." #~ msgid "Support for %s files was not compiled into this installation of PSPP" #~ msgstr "Поддержка файлов %s не используется в этом варианте PSPP" #~ msgid "Multiple response set name `%s' does not begin with `$'." #~ msgstr "Имя набора множества ответов `%s' не начинается с `$'." #~ msgid "expecting number or data string" #~ msgstr "должно быть указано число или строка данных" #~ msgid "Details" #~ msgstr "Подробности" #~ msgid "Multiple dichotomy set" #~ msgstr "Набор множеств дихотомий" #~ msgid "Multiple category set" #~ msgstr "Набор множества категорий" #~ msgid "Label source" #~ msgstr "Источник метки" #~ msgid "First variable label among variables" #~ msgstr "Метка первой переменной среди переменных" #~ msgid "Provided by user" #~ msgstr "Предоставлено пользователем" #~ msgid "Variable labels" #~ msgstr "Метки переменных" #~ msgid "Value labels of counted value" #~ msgstr "Метки значений для переменной расчета" #~ msgid "Label:" #~ msgstr "Метка:" #~ msgid "No label." #~ msgstr "Отсутствуют метки." #~ msgid "Product:" #~ msgstr "Продукт:" #~ msgid "Variables:" #~ msgstr "Переменные:" #~ msgid "Cases:" #~ msgstr "Наблюдение:" #~ msgid "Type:" #~ msgstr "Тип:" #~ msgid "Description" #~ msgstr "Описание" #~ msgid "The active dataset does not have a file label." #~ msgstr "В активном наборе данных нет метки файла." #~ msgid "File label: %s" #~ msgstr "Метка файла: %s" #~ msgid "The active dataset dictionary does not contain any documents." #~ msgstr "В активном словаре баз данных нет никаких документов." #~ msgid "Documents in the active dataset:" #~ msgstr "Документы в активной базе данных:" #~ msgid "Custom data file attributes." #~ msgstr "Нетипичные атрибуты файла данных." #~ msgid "Label: %s\n" #~ msgstr "Метка: %s\n" #~ msgid "Format: %s\n" #~ msgstr "Формат: %s\n" #~ msgid "Print Format: %s\n" #~ msgstr "Формат печати: %s\n" #~ msgid "Write Format: %s\n" #~ msgstr "Формат записи: %s\n" #~ msgid "Measure: %s\n" #~ msgstr "Шкала: %s\n" #~ msgid "Role: %s\n" #~ msgstr "Роль: %s\n" #~ msgid "Display Alignment: %s\n" #~ msgstr "Выравнивание во время показа: %s\n" #~ msgid "Display Width: %d\n" #~ msgstr "Ширина показа: %d\n" #~ msgid "Missing Values: " #~ msgstr "Пропущенные значения: " #~ msgid "Interactive shell not supported on this platform." #~ msgstr "" #~ "На этой платформе не предусмотрено поддержки интерактивной командной " #~ "оболочки." #~ msgid "Error executing command: %s." #~ msgstr "Ошибка при выполнении команды: %s." #~ msgid "Unknown TABLECELLS class" #~ msgstr "Неизвестный класс TABLECELLS" #~ msgid "Exact Sig. (%d-tailed)" #~ msgstr "Точное значение (%d-боковая)" #~ msgid "Valid N" #~ msgstr "Кол-во корректных" #~ msgid "Missing N" #~ msgstr "Кол-во пропущенных" #~ msgid "Valid cases = %.*g; cases with missing value(s) = %.*g." #~ msgstr "" #~ "Корректных наблюдений = %.*g; наблюдений с пропущенными значениями = %.*g." #~ msgid "%g" #~ msgstr "%g" #~ msgid "%d" #~ msgstr "%d" #~ msgid "%zu" #~ msgstr "%zu" #~ msgid "50 (Median)" #~ msgstr "50 (медиана)" #~ msgid "(%d)" #~ msgstr "(%d)" #~ msgid "Min" #~ msgstr "Мин." #~ msgid "Max" #~ msgstr "Макс." #~ msgid "%g%%" #~ msgstr "%g%%" #~ msgid "25th" #~ msgstr "25" #~ msgid "50th (Median)" #~ msgstr "50 (медиана)" #~ msgid "75th" #~ msgstr "75" #~ msgid "(I) %s" #~ msgstr "(I) %s" #~ msgid "(J) %s" #~ msgstr "(J) %s" #~ msgid "(I - J)" #~ msgstr "(I - J)" #~ msgid "Number of clusters may not be larger than the number of cases." #~ msgstr "Количество кластеров не может превышать количество наблюдений." #~ msgid "%s into %s(%s of %s using %s BY %s)" #~ msgstr "%s в %s(%s %s по помощью %s BY %s)" #~ msgid "%s into %s(%s of %s BY %s)" #~ msgstr "%s в %s(%s %s BY %s)" #~ msgid "%s into %s(%s of %s using %s)" #~ msgstr "%s в %s(%s %s с помощью %s)" #~ msgid "%s into %s(%s of %s)" #~ msgstr "%s в %s(%s %s)" #~ msgid "Area Under the Curve (%s)" #~ msgstr "Площадь под кривой (%s)" #~ msgid "Coordinates of the Curve (%s)" #~ msgstr "Координаты кривой (%s)" #~ msgid "Std. Error Mean" #~ msgstr "Станд. средняя ошибка" #~ msgid "(active dataset)" #~ msgstr "(активная база данных)" #~ msgid "Value of %s must be between 1 and 100." #~ msgstr "Значение %s должно принадлежать диапазону от 1 до 100." #~ msgid "Writing %zu record to %s." #~ msgid_plural "Writing %zu records to %s." #~ msgstr[0] "Записываем %zu запись в %s." #~ msgstr[1] "Записываем %zu записи в %s." #~ msgstr[2] "Записываем %zu записей в %s." #~ msgid "Writing %zu record." #~ msgid_plural "Writing %zu records." #~ msgstr[0] "Записываем %zu запись." #~ msgstr[1] "Записываем %zu записи." #~ msgstr[2] "Записываем %zu записей." #~ msgid "Unsupported compression type (%d)" #~ msgstr "Неподдерживаемый тип сжатия (%d)" #~ msgid "Failed to seek to end of central directory record: %s" #~ msgstr "" #~ "Не удалось выполнить позиционирование конца записи центрального каталога: " #~ "%s" #~ msgid "Failed to seek to central directory: %s" #~ msgstr "Не удалось выполнить позиционирование центрального каталога: %s" #~ msgid "Failed to seek to start of member `%s': %s" #~ msgstr "Не удалось выполнить позиционирование начала записи `%s': %s" #~ msgid "ascii: closing output file `%s'" #~ msgstr "ascii: закрываем файл выводимых результатов `%s'" #~ msgid "%s - Page %d" #~ msgstr "%s - страница %d" #~ msgid "bad vline: x=%d+%d=%d y=(%d+%d=%d,%d+%d=%d) in table size (%d,%d)\n" #~ msgstr "" #~ "ошибочная вертикальная линия: x=%d+%d=%d y=(%d+%d=%d,%d+%d=%d) в позиции " #~ "таблицы (%d,%d)\n" #~ "\n" #~ msgid "bad hline: x=(%d+%d=%d,%d+%d=%d) y=%d+%d=%d in table size (%d,%d)\n" #~ msgstr "" #~ "ошибочная горизонтальная линия: x=(%d+%d=%d,%d+%d=%d) y=%d+%d=%d в " #~ "позиции таблицы (%d,%d)\n" #~ msgid "" #~ "bad box: (%d+%d=%d,%d+%d=%d)-(%d+%d=%d,%d+%d=%d) in table size (%d,%d)\n" #~ msgstr "" #~ "ошибочный блок:(%d+%d=%d,%d+%d=%d)-(%d+%d=%d,%d+%d=%d в таблице размера " #~ "(%d,%d)\n" #~ msgid "could not access definition for terminal `%s'" #~ msgstr "не удалось получить доступ к определению терминала `%s'" #~ msgid "TreeView path" #~ msgstr "TreeView патч" #~ msgid "The path to the row in the GtkTreeView, as a string" #~ msgstr "Путь к строке в GtkTreeView, как строка" #~ msgid "Diagonal slash" #~ msgstr "Диагональная черта" #~ msgid "Whether to draw a diagonal slash across the button." #~ msgstr "Определяет, следует ли рисовать диагональную черту на кнопке." #~ msgid "" #~ "PSPPIRE, a GUI for PSPP, a program for statistical analysis of sampled " #~ "data.\n" #~ "Usage: %s [OPTION]... FILE\n" #~ "\n" #~ "Arguments to long options also apply to equivalent short options.\n" #~ "\n" #~ "GUI options:\n" #~ " -q, --no-splash don't show splash screen during startup\n" #~ "\n" #~ "%sLanguage options:\n" #~ " -I, --include=DIR append DIR to search path\n" #~ " -I-, --no-include clear search path\n" #~ " -a, --algorithm={compatible|enhanced}\n" #~ " set to `compatible' if you want output\n" #~ " calculated from broken algorithms\n" #~ " -x, --syntax={compatible|enhanced}\n" #~ " set to `compatible' to disable PSPP " #~ "extensions\n" #~ " -i, --interactive interpret syntax in interactive mode\n" #~ " -s, --safer don't allow some unsafe operations\n" #~ "Default search path: %s\n" #~ "\n" #~ "Informative output:\n" #~ " -h, --help display this help and exit\n" #~ " -V, --version output version information and exit\n" #~ "\n" #~ "A non-option argument is interpreted as a data file in .sav or .zsav or ." #~ "por\n" #~ "format or a syntax file to load.\n" #~ msgstr "" #~ "PSPPIRE, графический интерфейс PSPP, программы для статистического " #~ "анализа данных выборок.\n" #~ "Использование: %s [ПАРАМЕТР]... ФАЙЛ...\n" #~ "\n" #~ "Аргументы для длинных опций также применимы к эквивалентным коротким " #~ "вариантам.\n" #~ "\n" #~ "Параметры графического интерфейса:\n" #~ "-q, --нет заставки не показывать окно приветствия при запуске\n" #~ "\n" #~ "%sПараметры языка:\n" #~ "-I, --включить=каталог добавить каталог к пути поиска\n" #~ "-I-, --не-включать очистить пути поиска данных\n" #~ "-a,--алгоритм={совместимый|улучшенный}\n" #~ "установите значение `compatible', если хотите вывести данные\n" #~ "следует вычислять на основе совместимых со старыми\n" #~ "версиями алгоритмов, содержащих ошибки\n" #~ "-x,--синтаксис={совместимый|улучшенный}\n" #~ "установите значение `compatible', чтобы отключить\n" #~ "расширение PSPP\n" #~ "-i, --интерактивный обрабатывать синтаксические конструкции в " #~ "интерактивном режиме\n" #~ "-s, --безопасный запретить все действия, кроме безопасных\n" #~ "Путь поиска данных по умолчанию: %s\n" #~ "\n" #~ "Вывод информационных данных:\n" #~ "-h, --помощь показать справочную информацию и выйти\n" #~ "-V, --версия вывести информацию о версии и выйти\n" #~ "Не вариант аргумента, который интерпретируется как файл данных в .sav or ." #~ "zsav or .por\n" #~ "формате или синтаксисе файла для загрузки\n" #~ msgid "Incorrect value for variable type" #~ msgstr "Некорректное значение типа переменной" #~ msgid "_Select" #~ msgstr "_Выбрать" #~ msgid "Enter a number to add a new variable." #~ msgstr "Введите число, чтобы добавить новую переменную." #~ msgid "Enter a number to add a new case." #~ msgstr "Введите число, чтобы добавить новое наблюдение." #~ msgid "Font Selection" #~ msgstr "Выбор шрифта" #~ msgid "Cannot create variable." #~ msgstr "Не удалось создать переменную." #~ msgid "\"%s\" is not a valid variable name." #~ msgstr "\"%s\" не является корректным названием переменной." #~ msgid "This dictionary already contains a variable named \"%s\"." #~ msgstr "В этом словаре уже содержится переменная с именем \"%s\"." #~ msgid "Cannot rename variable." #~ msgstr "Не удалось переименовать переменную." #~ msgid "Enter a variable name to add a new variable." #~ msgstr "Чтобы добавить новую переменную, укажите ее название." #~ msgid "{%s, %s}\n" #~ msgstr "{%s, %s}\n" #~ msgid "Import Delimited Text Data" #~ msgstr "Импорт Текстового Файла С Разделителями" #~ msgid "An error occurred reading the spreadsheet file." #~ msgstr "" #~ "При попытке выполнить чтение файла электронной таблицы произошла ошибка." #~ msgid "This input line has too few separators to fill in this field." #~ msgstr "" #~ "В строке входных данных слишком мало разделителей для заполнения этого " #~ "поля." #~ msgid "Cannot parse field content `%.*s' as format %s: %s" #~ msgstr "" #~ "Не удалось обработать содержимое поля `%.*s' как данные в формате %s: %s" #~ msgid "can only convert encrypted data file to sav or sys format" #~ msgstr "" #~ "преобразование файла с зашифрованными данными возможно только в форматы " #~ "sav или sys" #~ msgid "count" #~ msgstr "количество" #~ msgid "expected" #~ msgstr "ожидаемое" #~ msgid "residual" #~ msgstr "остаток" #~ msgid "std. resid." #~ msgstr "станд. остаток" #~ msgid "adj. resid." #~ msgstr "кор. остаток" #~ msgid "Chi-square tests." #~ msgstr "χ2-тесты." #~ msgid "Odds Ratio for %s (%.*s / %.*s)" #~ msgstr "Отношение шансов для %s (%.*s / %.*s)" #~ msgid "For cohort %s = %.*g" #~ msgstr "Для когорты %s = %.*g" #~ msgid "For cohort %s = %.*s" #~ msgstr "Для когорты %s = %.*s" #~ msgid "Delete the variables at the selected position(s)" #~ msgstr "Удалить переменные на обозначенных позициях" #~ msgid "Delete the cases at the selected position(s)" #~ msgstr "Удалить записи наблюдений на обозначенных позициях" #~ msgid "(optional case selection condition)" #~ msgstr "(необязательное условие выбора наблюдения)" #~ msgid "Importing Textual Data" #~ msgstr "Импорт текстовых данных" #~ msgid "Doubled quote mark treated as escape" #~ msgstr "Считать двойные кавычки экранированием" #~ msgid "_Open..." #~ msgstr "_Открыть..." #~ msgid "Transpose the cases with the variables" #~ msgstr "Поменять местами наблюдения и переменные" #~ msgid "Choose a subset of cases for analysis" #~ msgstr "Выбрать подмножество наблюдений для анализа" #~ msgid "All" #~ msgstr "Все" #~ msgid "This is not an SPSS file system." #~ msgstr "Это не системный файл SPSS." #~ msgid "SPSS File System" #~ msgstr "Системный файл SPSS" #~ msgid "Ошибка при выполнении команды: %s." #~ msgstr "Ошибка при попытке выполнить команду: %s." #~ msgid "No specified variables." #~ msgstr "Не указаны переменные." #~ msgid "S. E." #~ msgstr "Ст. пох." #~ msgid "%s и %s" #~ msgstr "%s и %s" #~ msgid "Requested renaming этого поля variable name %s." #~ msgstr "" #~ "Во время желаемого переименования будет продублировано название " #~ "переменной %s." #~ msgid "Total Coefficient: " #~ msgstr "Сумма коэффициентов: " #~ msgid "Bar charts are not implemented." #~ msgstr "Столбиковые диаграммы не реализовано." #~ msgid "No valid data for variable %s; statistics not displayed." #~ msgstr "Нет корректных данных для переменной %s; статистика не показана." #~ msgid "Label: %s" #~ msgstr "Метка: %s" #~ msgid "Type: %s\n" #~ msgstr "Тип: %s\n" #~ msgid "Missing Values: %s\n" #~ msgstr "Пропущенные значения: %s\n" #~ msgid "Value Labels:\n" #~ msgstr "Метки значений:\n" #~ msgid "%s %s\n" #~ msgstr "%s %s\n" #~ msgid "Variables %s specified multiple times on %s subcommand." #~ msgstr "Переменные %s указаны несколько раз в подкоманде %s." #~ msgid "Variables %s specified on %s but not on %s." #~ msgstr "Переменные %s указаны в %s, но у %s." #~ msgid "Weighting variable must be numeric (not string variable `%s')." #~ msgstr "" #~ "Переменная взвешивания должна быть числовой (а не строчной переменной `" #~ "%s')." #~ msgid "Duplicate variable name `%s'." #~ msgstr "Дублирование названия переменной `%s'." #~ msgid "`%s' does not begin with `$' at offset %zu in MRSETS record." #~ msgstr "`%s' не начинается с `$' на позиции %zu в записи MRSETS." #~ msgid "Duplicate variable name %s at offset %zu in MRSETS record." #~ msgstr "Дублирование названия переменной %s в позиции %zu в записи MRSETS." #~ msgid "variable Truncating label for variable `%s' to %d bytes." #~ msgstr "Обрезаем метку переменной для переменной `%s' в %d байт." #~ msgid "%s is allowed only inside INPUT PROGRAM." #~ msgstr "%s можно использовать только внутри INPUT PROGRAM." #~ msgid "%s is allowed only inside FILE TYPE." #~ msgstr "%s можно использовать только внутри FILE TYPE." #~ msgid "" #~ "DELETE VARIABLES may not be used after TEMPORARY. Temporary " #~ "transformations will be made permanent." #~ msgstr "" #~ "DELETE VARIABLES нельзя использовать после TEMPORARY. Временные " #~ "преобразования будут сделаны постоянными." #~ msgid "" #~ "DROP subcommand may be given at most once. It may not be given in " #~ "conjunction with the KEEP subcommand." #~ msgstr "" #~ "Подкоманду DROP можно использовать не более одного раза. Ее нельзя " #~ "использовать в сочетании с подкомандою KEEP." #~ msgid "" #~ "RENAME VARS may not be used after TEMPORARY. Temporary transformations " #~ "will be made permanent." #~ msgstr "" #~ "RENAME VARS нельзя использовать после TEMPORARY. Временные преобразования " #~ "будут сделаны постоянными." #~ msgid "Charset:" #~ msgstr "Набор символов:" #~ msgid "Expecting MEAN, MEDIAN, MODE or number" #~ msgstr "Ожидаемое среднее, медиана, мода или количество" #~ msgid "Value of FIXCASE must be at least 1." #~ msgstr "Значение FIXCASE должно быть не меньше 1." #~ msgid "Value of FIRST must be at least 1." #~ msgstr "Значение FIRST должно быть не меньше 1." #~ msgid "WORKSPACE must be at least 1MB" #~ msgstr "WORKSPACE должно иметь размер не менее 1 МБ" #~ msgid "expecting AUTOMATIC or year" #~ msgstr "должно быть AUTOMATIC или значение года" #~ msgid "LENGTH must be at least 1." #~ msgstr "Значение LENGTH должно быть не меньше 1." #~ msgid "WIDTH must be at least 40." #~ msgstr "Значение WIDTH должно быть не менее 40." #~ msgid "RESTORE without matching PRESERVE." #~ msgstr "RESTORE без соответствующего PRESERVE." pspp-1.4.1/AUTHORS0000644000175000017500000000252113571051220013157 0ustar00blpblp00000000000000We wish to thank current active contributors to PSPP: * Ben Pfaff wrote the initial program and manual, which comprises the majority of the current code. Ben continues to contribute and most of the core libraries which ensure that PSPP runs with optimal speed are his work. * John Darrington wrote the initial version of the graphical user interface, and many of the statistical procedures. John also implemented support for long variable names, PostgreSQL and Gnumeric and made numerous revisions to other modules. * Jason Stover contributed statistical and numerical functionality, including lib/gslextras and the linear regression features. Jason is also an important contributor to GSL, which is used by PSPP. * Mehmet Hakan Satman provided the initial implementation of the QUICK CLUSTER command. Alan Mead and others contributed later improvements including the cluster membership subcommands. * Friedrich Beckmann wrote the GRAPH command. We also thank past contributors: * John Williams wrote an initial draft of the T-TEST procedure. * Michael Kiefte contributed bug fixes and other enhancements. * Patrick Kobly contributed bug fixes and other enhancements. * Rob van Son wrote the original version of the routine for calculation of the significance of the Wilcoxon matched pairs signed rank statistic used by the NPAR TEST command. pspp-1.4.1/COPYING0000644000175000017500000010437413320146056013157 0ustar00blpblp00000000000000 GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. 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 them 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. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. 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. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. "This License" refers to version 3 of the GNU General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey 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; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If 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 convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU 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. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. 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. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS 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. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs 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. 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 state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) 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 3 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, see . Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: Copyright (C) This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an "about box". You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . The GNU 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 Lesser General Public License instead of this License. But first, please read . pspp-1.4.1/README0000644000175000017500000001054213571051220012771 0ustar00blpblp00000000000000PSPP is a program for statistical analysis of sampled data. It is a free replacement for the proprietary program SPSS. PSPP supports T-tests, ANOVA and GLM analyses, factor analysis, non-parametric tests, linear and logistic regression, clustering, and other statistical features. PSPP produces statistical reports in plain text, PDF, PostScript, CSV, HTML, SVG, and OpenDocument formats. It can import data from OpenDocument, Gnumeric, text and SPSS formats. PSPP has both text-based and graphical user interfaces. The PSPP user interface has been translated into a number of languages. Instructions for PSPP installation are in INSTALL, including a list of prerequisite packages and other PSPP-specific information. Full documentation on PSPP's language is also included. For information on differences from previous versions, please see file NEWS. Source code for the latest release of PSPP is available at ftp://ftp.gnu.org/pub/gnu/pspp/. Test releases are at ftp://alpha.gnu.org/gnu/pspp/. Development sources are available at http://savannah.gnu.org/projects/pspp The following miscellaneous notes apply to this release: * On a few operating systems, such as OpenBSD, some of the tests may fail with messages similar to: 'Warning: cannot create a converter for "646" to "UTF-8"'. These test failures may safely be ignored. Questions and comments about using PSPP may be sent to pspp-users@gnu.org. Bug reports may be filed at http://savannah.gnu.org/bugs/?group=pspp or emailed to bug-gnu-pspp@gnu.org. We prefer the web-based system because it makes it more difficult for us to lose track of bugs, but we are happy to hear from users through any means. The PSPP bug tracker and bug reporting mailing list are public. To privately report a security vulnerability in GNU PSPP, please send your report to the closed mailing list pspp-security@gnu.org. The PSPP developers will help you assess your report and fix problems prior to public disclosure. The long term goals for PSPP are ambitious. We wish to provide the following support to users: * All of the SPSS transformation language. PSPP already supports a large subset of it. * All the statistical procedures that someone is willing to implement, whether they exist in SPSS or not. * Compatibility with SPSS syntax, including compatibility with known bugs and warts, where it makes sense. We also provide an "enhanced" mode in certain cases where PSPP can output better results that may surprise SPSS users. * Friendly textual and graphical interfaces. * Good documentation. Currently the PSPP manual describes its language completely, but we would like to add information on how to select statistical procedures and interpret their results. * Efficient support for very large data sets. For procedures where it is practical, we wish to efficiently support data sets many times larger than physical memory. The framework for this feature is already in place. It has not been tuned or extensively tested, however initial experience has given impressive results. Over the long term, we also wish to provide support to developers who wish to extend PSPP with new statistical procedures, by supplying the following: * Easy-to-use support for parsing language syntax. Currently, parsing is done by writing "recursive descent" code by hand, with some support for automated parsing of the most common constructs. We wish to improve the situation by supplying a more complete and flexible parser generator. * Easy-to-use support for producing attractive output. Currently, output is done by writing code to explicitly fill in table cells with data. We should be able to supply a more convenient interface that also allows for providing machine-readable output. * Eventually, a plug-in interface for procedures. Over the short term, the interface between the PSPP core and statistical procedures is evolving quickly enough that a plug-in model does not make sense. Over the long term, it may make sense to introduce plug-ins. For any copyright year range specified as YYYY-ZZZZ in this package note that the range specifies every single year in that closed interval. pspp-1.4.1/NEWS0000644000175000017500000013122113725005261012613 0ustar00blpblp00000000000000PSPP NEWS -- history of user-visible changes. Copyright (C) 1996-2000, 2008-2016, 2017, 2019, 2020 Free Software Foundation, Inc. See the end for copying conditions. Please send PSPP bug reports to bug-gnu-pspp@gnu.org. Changes from 1.4.0 to 1.4.1: * Bug fixes. * Translation updates. * HTML output is now HTML5 instead of HTML4.0 Transitional. * The HOST command has been reimplemented. It now supports TIMELIMIT. Changes from 1.2.0 to 1.4.0: * The file pspp-mode.el (the pspp-mode for Emacs) is no longer distributed with PSPP. Instead, it can be installed directly in emacs and is available from https://elpa.gnu.org/packages/pspp-mode.html * The Find dialog box, when searching for numeric values, will match only to the precision of the variable's print format. This avoids behaviour which is surprising to some users. * PSPP now supports the SPSS viewer (.spv) format that SPSS 16 and later use to save the contents of its output editor: - PSPP and PSPPIRE can write output to .spv files. - The new utility pspp-output can convert .spv files to other formats. - The pspp-convert utility can now decrypt encrypted .spv files. The encrypted viewer file format is unacceptably insecure, so to discourage its use PSPP and PSPPIRE do not directly read or write this format. * A bug where the Data|Select Cases|Random Sample menu would generate invalid syntax has been fixed. * FREQUENCIES will emit a warning if one or more weight values are missing. * Plain text output is no longer divided into pages, since it is now rarely printed on paper. * pspp-convert improvements: - New "-a", "-l", "--password-list" options to search for an encrypted file's password. - New "--keep" and "--drop" options to output only selected variables. - New "--recode", "--no-var-name", "--labels", "--print-formats", "--decimal", "--delimiter", and "--qualifier" options to control CSV output. * Improvements to SAVE DATA COLLECTION support for MDD files. * Bug fix for CVE-2018-20230. * The /RENAME subcommand in SAVE TRANSLATE et al. has been extended to support the syntax also accepted by other software. * The EXAMINE command will now perform the Shapiro-Wilk test when one or more plots are requested. * The REGRESSION command now supports the /STATISTICS=TOL option which outputs tolerance and variance inflation factor metrics for the data. * The QUICK CLUSTER command now supports the /SAVE option which can be used to save the cases' cluster membership and/or their distance from the cluster centre to the active file. * The MEANS command has been re-implemented. * The GUI now has a sub-dialog for post-hoc tests of the oneway anova test. * Gtk+3.22.0 or later must now be used when building. * GRAPH: Categorical barcharts displaying percentages now show the sub-category as a percentage of the primary category instead of the total. * The Syntax Window now has a Find function to perform simple text searching. * AUTORECODE: - The PRINT subcommand is now implemented. - Many bug fixes. Changes from 1.0.1 to 1.2.0: * New experimental command SAVE DATA COLLECTION to save MDD files. * MTIME and YMDHMS variable formats now supported. * Build changes: - zlib is now a required dependency. (Previously it was optional.) - Gtk+3.18.0 or later must now be used when building. - The code implementing the sheet rendering has been removed. Instead we use a third party library: spread-sheet-widget. * The "NOMISSING" keyword when generating syntax for piecharts in the frequencies command was omitted. This has been corrected. Changes from 1.0.0 to 1.0.1: * Bug fixes, including fixes for CVE-2017-12958, CVE-2017-12959, CVE-2017-12960, and CVE-2017-12961. Changes from 0.11.0 to 1.0.0: * Translation updates. Changes from 0.10.2 to 0.11.0: * The REGRESSION command now has a /ORIGIN subcommand to perform regression through the origin. * The FACTOR command can now analyse matrix files prepared with MATRIX DATA. * The FACTOR command can now print the anti-image matrices. * The MATRIX DATA command has been added. * Some inappropriate properties in selection dialogs have been corrected. * A bug which could cause the HTML driver to go into a tight loop has been fixed. * An error in the FREQUENCIES procedure, where the word "Mean" was printed when "Variance" was appropriate has been fixed. * The ncurses library is no longer required or used. * A bug where the Mann-Whitney test would give misleading results if run on multiple variables and MISSING=ANALAYSIS was specified has been fixed. * Gtk+3.14.5 or later must now be used when building. * Graphical user interface changes: ** There is a new menu: Edit|Options ** The Non Parametric Statistics Menu has a new item: "K Independent Samples". ** Dialog boxes can now be canceled using the key. * The AUTORECODE command now accepts an optional / before INTO. * The short form of the VECTOR command can now create string variables. * Bug fixes, including fixes for CVE-2017-10791 and CVE-2017-10792. Changes from 0.10.1 to 0.10.2: * CROSSTABS implements a new COUNT subcommand to round case or cell weights. * Help will be opened as HTML in default browser if yelp is not available. * When plotting scatterplots with only one dataset (the simple case) the colour used for the dataset is now black. The previous default from the Tango palette was too faint to see easily. * The varible info dialog could previously only paste a single variable. Now it can paste multiple variables. * Bug fixes, including the following: - T-test with independent samples GUI crashed with string type variable as group variable. - The variable info dialog showed the previous selected variable superimposed with the currently selected one. - The GLM command did not properly deal with missing values. This has been fixed. Changes from 0.10.0 to 0.10.1: * Bug fixes, including the following: - A bug where certain dialog boxes could not be properly populated has been fixed. - Various commands have been hardened against errors when called with invalid syntax. * Translation updates. Thanks to our translators! Changes from 0.8.5 to 0.10.0: * The QUICK CLUSTER command has a /PRINT subcommand which shows the initial cluster centres and the final cluster membership of each case. The clustering algorithm has also been updated, so as to produce better separated clusters. * A Russian localisation has been contributed. * The GRAPH command now has a /BAR subcommand to draw barcharts. * If the DECIMAL character is set to COMMA then the ',' character will not be treated as a separator by DATA LIST. * The graphical user interface (psppire) has been changed as follows: - It now uses Gtk+ version 3 instead of version 2. Accordingly, it has a somewhat different look and feel. - There is now a Graphs menu to access the GRAPH command. - The status of dialog box widgets are now preserved between calls to the same dialog box for the same dataset. - The dialog box for the Logistic Regression command will now infer that string variables or any varible with a "measure" of Nominal or Ordinal are to be treated as categorical variables and will generate syntax accordingly. * The pspp-convert utility can now decrypt encrypted syntax files. The encrypted syntax file format is unacceptably insecure, so to discourage its use PSPP and PSPPIRE do not directly read or write this format. * New commands: - SORT VARIABLES. * The following functions for transformation expressions are new: - REPLACE, for search-and-replace of one string with another. - STRUNC, to truncate a string and trim trailing spaces. - MEDIAN, to compute the median of its arguments. - The TRUNC function in expressions now supports additional arguments for truncating to values other than integers and to indicate a level of rounding fuzz. The default rounding fuzz may now be controlled and displayed with SET FUZZBITS and SHOW FUZZBITS, respectively. * Bug fixes, including the following notable ones: - The correlation coefficient in the paired samples t-test procedure is now correctly calculated when presented with weighted data. - The ESCAPE subcommand has been removed from GET DATA /TYPE=TXT. For compatibility, the behavior that ESCAPE enabled is now the default and only supported behavior. - Rendering of the variable and data sheets in right-to-left locales now works properly. - The Mann-Whitney test, when run on a dataset containing values of the group variable, other than those defining the test groups, would incorrectly calculate the ranks. This has been corrected. * The IMPORTCASES subcommand on GET DATA is now ignored, for compatibility. Changes from 0.8.4 to 0.8.5: * The FREQUENCIES and CROSSTABS commands can now generate barcharts. * The FACTOR command can now perform PROMAX rotations. * SPSS/PC+ system files are now supported on GET and other commands that read SPSS system files. The pspp-convert program can now read SPSS/PC+ system files. Writing the obsolete SPSS/PC+ system file format is not supported. * SYSFILE INFO can now read SPSS/PC+ system files and SPSS portable files. * FREQUENCIES: A bug was fixed where an assertion failure occurred when an empty dataset was presented. * The GRAPH command is now available. Initially it supports scatterplots and histograms. * The RND operator in expressions now supports additional operands for rounding to values other than integers and to indicate a level of rounding fuzz. The default rounding fuzz may now be controlled and displayed with SET FUZZBITS and SHOW FUZZBITS, respectively. Changes from 0.8.3 to 0.8.4: * Formatting of SYSFILE INFO output was made easier to read. * Bug fixes, including the following notable ones: - FREQUENCIES works properly for string variables. (This bug was introduced in 0.8.2.) - CROSSTABS now correctly computes all of the measures that it offers. Some measures have been removed because they were not computed correctly. - The NPAR TESTS calculation of significance for the RUNS subcommand has been corrected. - Planned comparisons in ONEWAY ANOVA now correctly handle negative T-values. - The COUNT command now correctly treats missing values as documented. - Conformance fixes to Open Document output format. Changes from 0.8.2 to 0.8.3: * Independent T-Tests displayed the standard error of the difference and the confidence interval for the unequal variances case, where the equal variances case should have been. This has been fixed. * REGRESSION now recognises /STATISTICS=CI(x) which causes confidence intervals for the coefficients to be printed. * When DESCRIPTIVES calculates Z scores, it now omits cases filtered by the current FILTER settings. * PSPPIRE graphical user interface improvements: - Dialog boxes with source variable lists can now choose the sort order; right click and select from the popup menu. - File|Open now allows an encoding to be selected for opening system files. - File|Display Data File Information|External File... now allows an encoding to be selected. - A problem with the Means dialog has been resolved (bug #41433). - Several problems related to the input of spreadsheets have been fixed (bug #41657, #41620 * System file related improvements: - With ENCODING="DETECT", SYSFILE INFO can now help the user to pick an encoding for reading a system file that does not identify its own encoding - SYSFILE INFO now accepts an ENCODING subcommand to specify the character encoding of string data in the system file. - Variable labels over 255 bytes long are now accepted without truncation (bug #41863). - System files that contain duplicate variable names may now be read successfully (bug #41475). Changes from 0.8.1 to 0.8.2: * Charts are now rendered with colours from the Tango palette instead of fully saturated primaries. * Support for new system file variants: - PSPP can now read and write ZCOMPRESSED system files, which compress data much more effectively than older "compressed" files. (The older format is still supported.) - PSPP can now decrypt encrypted system files, using the new pspp-convert utility. The encrypted system file format is unacceptably insecure, so to discourage its use PSPP and PSPPIRE do not directly read or write this format. * Missing values for long string variables are now read from and written to system files in an SPSS-compatible fashion. (Earlier versions of PSPP that supported missing values for long string variables wrote them to system files in an SPSS-incompatible way. To fix the problem, read the system file with this version of PSPP and then save a new copy of it.) * pspp-convert, a new standalone utility for converting SPSS system and portable files to other formats, is now included. The initial version supports comma-separated value files as output format. pspp-convert can also decrypt encrypted system files. * Build changes: - zlib is now a required dependency. (Previously it was optional.) Changes from 0.8.0 to 0.8.1: * New commands: - VARIABLE ROLE. * Changes to existing commands: - CROSSTABS: The requirement that one expected count must be less than five before Fishers Exact Test will be reported has been removed. * PSPPIRE graphical user interface improvements: - A new set of icons has been contributed. - Syntax windows now parse syntax in "auto" mode, which in practice should mean that both "batch" and "interactive" syntax now works, instead of just "interactive" syntax. - The variable pane of data windows now include a Role column. * Notable bug fixes: - System files written by IBM SPSS 21 are now read without warnings. - System files written by "VOXCO INTERVIEWER 4.3" are now read without warnings. - PSPPIRE should now more gracefully handle syntax files that contain errors. Changes from 0.6.2 to 0.8.0: * New commands: - ADD FILES - CORRELATIONS - DATAFILE ATTRIBUTES - DATASET ACTIVATE - DATASET CLOSE - DATASET COPY - DATASET DECLARE - DATASET DISPLAY - DATASET NAME - LOGISTIC REGRESSION - MATCH FILES - MEANS - MRSETS - PRESERVE and RESTORE - QUICK CLUSTER - RELIABILITY - ROC - SAVE TRANSLATE to CSV and tab-delimited files - UPDATE - VARIABLE ATTRIBUTES * Changes to existing commands: - AUTORECODE has a new GROUP subcommand. - CROSSTABS has been re-implemented to fix numerous bugs. - EXAMINE: /MISSING=LISTWISE is now the default. - DO REPEAT command has been reimplemented. Now, when DO REPEAT contains an INCLUDE or INSERT command, substitutions are not applied to the included file. - FILE HANDLE has a new ENDS subcommand to select CR or CRLF new-lines. - HOST has been updated to use more modern syntax. - Most commands that work with data files now support a new ENCODING subcommand. - MISSING VALUES can now assign missing values to long string variables. - ONEWAY: the POSTHOC subcommand is now implemented. - The following new subcommands to NPAR TESTS have been implemented: COCHRAN, FRIEDMAN, JONCKHEERE-TERPSTRA, KENDALL, KRUSKAL-WALLIS, MANN-WHITNEY, MCNEMAR, SIGN, WILCOXON, and RUNS - SET and SHOW no longer have ENDCMD, NULLINE, PROMPT, CPROMPT, and DPROMPT subcommands. The defaults are now fixed values. - SHOW now has a JOURNAL subcommand, to show the location of the journal file. - VALUE LABELS can now assign value labels to long string variables. * Other language changes: - The new DATASET commands replace the "scratch file" PSPP extension, which is no longer supported. - Strings may now include arbitrary Unicode code points specified in hexadecimal, using the syntax U'hhhh'. For example, Unicode code point U+1D11E, the musical G clef character, may be expressed as U'1D11E'. See the "Tokens" section in the PSPP manual for more information. - In previous versions of PSPP, in a string expressed in hexadecimal with X'hh' syntax, the hexadecimal digits expressed bytes in the locale encoding. In this version of PSPP, X'hh' syntax always expresses bytes in UTF-8 encoding. See the "Tokens" section in the PSPP manual for more information. * PSPPIRE graphical user interface improvements: - Added support for non-ASCII characters in strings, labels and variable names. - A "Split Window" function is available, which makes it easier to see different parts of a large data file. - Data files can now be opened by specifing their name as the first argument. This means that on a properly configured desktop, double clicking on an icon will open the file. - Foreign formats, such as Gnumeric, OpenDocument and CSV can be imported via using an "intelligent" application assistant dialog. * Output changes: - The new "cairo" output driver supports output in PostScript, PDF, and SVG formats. Its functionality is a superset of that of the "postscript" driver, which has been removed. You must have Cairo and Pango installed to build the "cairo" driver. - Charts are now produced with Cairo and Pango, instead of libplot. Without them, the new graphing features will not work. If you do not have Cairo and Pango installed, you must run `configure' with --without-cairo. - The plain text output driver now properly supports multibyte UTF-8 characters, including double-width characters and combining accents. - Output to OpenDocument format is now supported. - The HTML output is much improved. * The "pspp" program has a new option --batch (or -b) that selects "batch" syntax mode. In previous versions of PSPP this syntax mode was the default. Now a new "auto" syntax mode is the default. In "auto" mode, PSPP interprets most syntax files correctly regardless of their intended syntax mode. See the "Syntax Variants" section in the PSPP manual for more information. * The "pspp" program has a new option --syntax-encoding that specifies the encoding for syntax files listed on the command line, as well as the default encoding for syntax files included with INCLUDE or INSERT. The default is to accept the system locale encoding, UTF-8, UTF-16, or UTF-32, automatically detecting which one the system file uses. See the documentation for the INSERT command in the PSPP manual for more information. * Text data files that PRINT and WRITE creates now use the system native line ends by default (CRLF on Windows, LF only elsewhere). Use the new ENDS subcommand on FILE HANDLE to override the default. * A new Perl module allows Perl programs to read and write PSPP system files. * A tutorial chapter has been added to the user manual. Changes from 0.6.1 to 0.6.2: * New translations: - Dutch, thanks to Harry Thijssen. - Brazilian Portuguese, thanks to Michel Boaventura. Thanks for translations are also due to the coordinators at translationproject.org. * Statistical bug fixes: - REGRESSION: Report correct standard error of the estimate (bug #25677). - T-TEST: Report correct significance of paired sample T-test in the common case (bug #26936) and corner cases. Thanks to Mike Griffiths and Matej Cepl for reporting these bugs. * Build fixes and changes: - Fix build with GTK+ 2.17.4 and later. - Make running "make" after running "configure" with different settings reliably rebuild version.c. - Cygwin and MinGW build fixes. - Fixes for building with recent gnulib. - The Makefile now honors two new variables, PSPP_LDFLAGS and PSPPIRE_LDFLAGS, that affect linking of the PSPP and PSPPIRE binaries, respectively. This makes building easier for some packagers. - Fixes for "configure --enable-relocatable" (bug #25508). * Data file bug fixes and changes: - Fix reading text data files that contain a mix of white space and commas. Now "a ,b" is treated as two fields containing "a" and "b"; previously it was treated as three, with an empty field in the middle. - Fix writing corrupted .sav files on Windows. - Fix writing variable labels longer than 252 bytes to save files. Thanks to Robert Westlund for reporting this bug. - Fix writing corrupted .por files (bug #26034). - Fix reading .por files whose initial lines are not padded out with spaces as expected. - PSPP will no longer issue warnings about some .sav file records or values that it does not understand. These warnings were harmless, but needlessly alarmed some users. - Fix crash reading empty string fields from PostgreSQL databases. * Bug fixes that affect PSPP and PSPPIRE: - Users may now control precision of output statistics. Instead of hard coding the width and decimals of output numbers, respect the default format in most instances. Counts are now normally displayed with the format of the weight variable, if any. - Fix crash when an INSERT command specifies the name of a file that does not exist (bug #24569). - Fix crash when CROSSTABS specifies a long-string variable (bugs #24557 and #26131). - Fix crash drawing pie charts with many segments. - Fix crash when NUMERIC specifies an invalid format. * PSPPIRE bug fixes and changes: - On Windows, write the output file to the user's home directory instead of the current directory, to better match user expectations. - Some data editor fixes. * Documentation: - Fix typo in BINOMIAL section of user manual (bug #25892). Changes from 0.6.0 to 0.6.1: * Statistical bug fixes: - Report correct standardized regression coefficients in linear regression output (bug #23567). * Bug fixes that affect PSPP and PSPPIRE: - Avoid crash with pie charts (bug #24014). - Don't append % to count totals (bug #24003). - Don't crash on bad input (bug #24031). - Don't crash if "end data." is not left aligned (bug #24115). - Change default workspace value to 64 MB, to avoid unnecessary disk accesses on modern machines. * PSPPIRE bug fixes: - Add ".sav" or ".por" suffix to filename when saving with Save_As (bug #23137). - Make it possible to reopen the output window on Windows (bug #24033). - A POSIX regular expression library is now included and used automatically if the host does not have one or has one that is inadequate. * Build fixes and changes: - Work around bug in GSL that prevented build with recent GCC versions without manually adding -fgnu89-inline to CFLAGS. - Also warn about missing prerequisites as we encounter them (bug #24445). - Distribute necessary files to allow users working from the distributed tarball to configure with --enable-gui-tools. - Append $(EXEEXT_FOR_BUILD) to output file name when building q2c, fixing build problems on Windows. - GSL 1.8 or later is now required. - Build errors with --enable-relocatable were fixed. * The German translations were removed, since native German speakers found them too poor to be useful. Changes from 0.4.0 to 0.6.0: * The PSPP license is now version 3 or later of the GNU General Public License. Previously, it was version 2 or later. * PSPP now has a graphical interface, called PSPPIRE. This interface allows you to enter data and variable definitions interactively. Commands may be executed in syntax form, or by using the interactive dialog boxes available from the dropdown menus. * A few sample syntax files are now included in the `examples' directory. * Numerous major and minor bugs have been fixed. Build changes: * The INSTALL file now reflects the details of how to install PSPP. It is a tailored version of the generic installation instructions, instead of a verbatim copy. * iconv, which is ordinarily installed as part of a Unix-like system, is now required. If you don't have it already, you can install GNU libiconv (http://www.gnu.org/software/libiconv/). * libxml2 and zlib are new optional dependencies. They are required to use PSPP's support for reading Gnumeric files. Statistical procedure changes: * REGRESSION is a new procedure for fitting linear models to data via least-squares estimation. * NPAR TESTS is a new procedure for non-parametric tests. In this release, it supports binomial and chi-square tests. * RANK is a new procedure to rank variables. It supports numerous forms of ranking. * FREQUENCIES can now output histograms and pie charts. These features were present in earlier releases, but not documented. User interface changes: * In many situations where PSPP once terminated with a fatal error, PSPP now recovers and continues execution. * PSPP is now able to start up and run even if it cannot find its configuration files. * Journaling of interactive commands to a disk file is now implemented. By default, journaling is enabled, to a file named `pspp.jnl' in the current directory. SET JOURNAL may be used to control journaling. * The use of `+' between syntax file names on the command line to prevent the dictionary from being cleared between their executions is no longer supported. All syntax files are now executed as if `+' had been specified. * The -d/--define and -u/--undef command line options are no longer supported. Instead, use /usr/bin/env or shell primitives to define or clear environment variables before invoking PSPP. * If a syntax file named named `rc' is found in a configuration directory (such as $HOME/.pspp), it is executed before any syntax file specified on the command line. The -r or --no-statrc command line option may be used to disable this behavior. Output changes: * Output configuration options have changed. Please refer to the manual for a full description of the available options. In consequence, you will need to reinstall your "devices" file. "make install" will do this for you. * Most error messages are now written to PSPP output files by default. SET ERROR can be used to disable this behavior. * When invoked interactively, PSPP now by default produces output on the terminal, piping it through the "more" program. Previously, by default output was written only to file pspp.list. On most terminals, the page length used for output automatically adapts to the terminal size, even if the terminal is resized. * ASCII driver: - This driver now supports charts in output. Charts are written as separate files that the main output file refers to. By default, charts are written in PNG format to files named pspp-1.png, pspp-2.png, and so on. - Configurations are provided that use VT100 (and xterm) line-drawing characters in tables. The option "-o list-vt100" requests use of this device for output to pspp.list. * PostScript driver: - The default paper size is now determined using the PAPERSIZE environment variable, or the LC_PAPER locale category on systems that support it. If these are not set, the default is now A4, instead of US letter. To make US letter the default, set PAPERSIZE to "letter" in your environment. - Font metrics are now read from AFM files, instead of Groff-format metrics files. PostScript fonts can now be embedded in output. In consequence, you will need to install an AFM file for each font used in PostScript output. "make install" will install AFM files for the standard PostScript fonts, including the ones that the PostScript driver uses by default. - Standard paper sizes no longer need to be specified through a configuration file. The "papersize" configuration file is no longer needed, or supported. - The PostScript prologue is no longer obtained from the "ps-prologue" configuration file. This configuration file is no longer needed, or supported. * HTML driver: - The HTML prologue is no longer obtained from the "html-prologue" configuration file. This configuration file is no longer needed, or supported. Command language changes: * The following commands are new: - GET DATA, which currently supports reading Gnumeric files and text data files. It will be extended later to read other types of foreign data. - CD, to change the current directory. - INSERT, to execute a syntax file. - DELETE VARIABLES, to remove variables from the active file dictionary. - ADD DOCUMENT, to add text to active file documents. - CLOSE FILE HANDLE (a PSPP extension; see below). - XEXPORT, a PSPP extension that is a transformation equivalent to EXPORT. * The following functions for transformation expressions are new: - DATEDIFF, for computing the difference of two dates. - DATESUM, for advancing a date by a specified duration. - VALUELABEL, to obtain the value label for a value. * PSPP now supports very long string variables (over 255 bytes long). * MATCH FILES now supports the FIRST and LAST subcommands. * Previous versions of PSPP prohibited using commands to both read and write a single file at the same time. Now, PSPP allows this, and the new version of the file atomically replaces the old version. * The following commands are no longer available. They will be re-implemented in a later release: - CLEAR TRANSFORMATIONS - MATRIX DATA - REPEATING DATA * The PROCESS IF command, which was deprecated, has been removed. You may replace any usage of it by SELECT IF following TEMPORARY, which has the same effect. * The output format for variables created by VECTOR may now be specified as part of the VECTOR syntax. "Scratch files", a new PSPP extension: A scratch file, like a system file, consists of a dictionary and any number of cases. Small scratch files are stored in memory; one that grows too large is written to disk. By default, any file handle whose name begins with # is assumed to refer to a scratch file. Scratch files can be used just about anywhere a system or portable file can be used. Also, portable files are now allowed in most places that system files were allowed in previous PSPP version. A new CLOSE FILE HANDLE command allows the storage associated with scratch files to be freed. It also allows file handles to be reassigned to new files. For more information on scratch files, refer to the "File Handles" section in the PSPP manual. For specifics of what commands now allow what kinds of files to be specified, refer to the documentation on those particular commands. Data access changes: * Binary formats and IBM/360 formats, including ASCII/EBCDIC translation, are now supported. Use FILE HANDLE to specify the format of these files. * Little-endian, big-endian, and VAX-endian formats are now supported for integer binary formats when reading and writing data files. The new RIB and WIB subcommands on the SET command control endianness of integer data. The default is the host's native endianness. * IEEE 754, VAX, and IBM hexadecimal formats are now supported for floating point binary formats when reading and writing data files. The new RRB and WRB subcommands on the SET command control the floating point format. The default is the host's native floating point format. * DATA LIST now supports the SKIP subcommand, to skip records at the beginning of a file. For compatibility, DATA LIST now treats N format as F format for FREE and LIST format input. * The SAVE and XSAVE commands now support the UNSELECTED, PERMISSIONS, NAMES, and MAP subcommands. * The EXPORT command has been re-implemented to obtain better results. Support for the UNSELECTED, DIGITS, and TYPE subcommands has been added. * For compatibility, PRINT now inserts a space at the beginning of every output line, even lines that would otherwise be blank, when OUTFILE is specified. (The behavior of WRITE is unchanged.) * For compatibility, PRINT EJECT now inserts the digit `1' at the beginning of each line that should begin a new page. * For compatibility, WRITE now outputs the system-missing value as a field filled with spaces. Binary formats are an exception. (The behavior of PRINT is unchanged.) Documentation: * Input and output format descriptions have been rewritten. They now precisely describe what is accepted on input and written on output. * The descriptions of the PSPP system and portable file formats have been extensively revised and improved. For developers, the build system now requires Autoconf 2.60 and Automake 1.10. Changes from 0.3.0 to 0.4.0: Changes in build dependencies: * The GNU Scientific Library (libgsl), version 1.6 or later, is now required. * libplot from GNU plotutils is optional. Without it, the new graphing features will not work. If you do not have it installed, you must run `configure' with --without-libplot. * libgmp2 is no longer a dependency. Newly implemented commands and statistical features: * EXAMINE, including its graphing features. * FREQUENCIES now supports percentiles. * ONEWAY. * PERMISSIONS. * SHOW. * SORT CASES now sorts stably, that is, two cases with equal sort criteria will be in the same relative order before and after the sort. * T-TEST (re-written). * DATE and USE. These commands are parsed but otherwise ignored, to enhance compatibility with certain command files that invoke them unnecessarily. * VARIABLE WIDTH, VARIABLE ALIGNMENT, and VARIABLE LEVEL. These currently have no effect on PSPP output, but their values are written to and read from system files and thus may affect third-party software. * SET EPOCH implemented. * DATA LIST FREE and DATA LIST LIST now support arbitrary field delimiters. * FILE HANDLE now supports custom tab widths. Long variable names (and other identifiers) are now supported. Up to the first 64 bytes of each identifier is significant. PSPP now reads and writes system files compatible with SPSS version 12. New --algorithm and --syntax command line options allow SPSS-compatible or enhanced modes to be selected. Support for transformation expressions has been rewritten and significantly improved. Refer to the manual for details. Calculation of moments (mean, standard deviation, kurtosis, skewness) has been rewritten and should now be more accurate. In --algorithm=enhanced mode moments may be more accurate than SPSS in some cases. Numerous bugs have been fixed, too many to mention here. Many new tests have been added, leading to the discovery and fixing of many of these bugs. The ASCII output driver can now squeeze multiple blank lines into single blank lines. Much of the code has been rewritten and refactored. It is now much cleaner. The FILE TYPE and REPEATING DATA commands have been disabled for this release because their implementations were deemed too buggy to be useful. They will be fixed and replaced in a future release. New pspp-mode for Emacs (in pspp-mode.el). Added rudimentary command-line completion for interactive input. lib/julcal and lib/dcdflib are no longer used, so they have been removed. For developers, the build system now requires Autoconf 2.58 and Automake 1.7. The included gettext has been updated to version 0.12.1. Some reports state that Texinfo 4.8, the latest version, may be necessary to successfully format the documentation on some systems. Version 0.3.0 changes since 0.2.3: Bugs fixed: * Using alphanumeric variables in functions under AGGREGATE segfaulted. Fixed. * Under certain circumstances, the final case would be omitted from the results of an AGGREGATE operation. Fixed. * Undefined behavior was invoked by referencing a freed pointer under certain circumstances. Fixed. * A wrong record size was displayed when paging the active file to disk. Fixed. * Not having enough temporary space for sorting caused a core dump. Fixed. * Syntax errors in function descriptions on AGGREGATE caused core dumps. Fixed. * A null pointer was dereferenced, causing a core dump, when PERCENTILES was specified on FREQUENCIES. This fixes the problem, but PSPP still doesn't calculate percentiles. * SORT always sorted in ascending order. Fixed. * Some minor memory leaks in the expression parser were removed. * Many assertions fixed for strict ANSI C compliance. New features: * SET ECHO ON now implemented, but turned off by default. * PRINT specifier supported on END REPEAT. Other: * System libgmp2 library is used if installed instead of unconditionally using the included libgmp2 subset. * Extensive code cleanup, which continues. * Added CORRELATIONS command parser, but not implemented. Version 0.2.3 changes since 0.2.2: Bugs fixed: * SPLIT FILE with a string variable caused a core dump. Fixed. * Nested INCLUDEs didn't work. Fixed. * The MATCH FILES procedure set the values of variables not present to 0. It should have been SYSMIS. This is now fixed. * The REMARK command was too aggressive about skipping lines. It didn't like being the last command in a file. * Comment parsing wasn't consistent with the rest of the code in its idea of where one command ends and another starts. This meant that sometimes commands would be mysteriously ignored. Thanks to Dr. Dirk Melcher for reporting this bug. * The TABLE subcommand on MATCH FILES worked only erratically at best. This fixes it. Thanks to Dr. Dirk Melcher for reporting this bug. * VARIABLE LABELS rejected a slash before the first variable specification, contradicting the documentation. Thanks to Walter M. Gray for reporting this bug. * Because of an incorrect optimization in memory allocation, CROSSTABS sometimes segfaulted when asked to output multiple tables. Thanks to Walter M. Gray for reporting this bug. * CROSSTABS didn't display value labels for column and row variables. Thanks to Walter M. Gray for reporting this bug. * WRITE didn't write line ends. Fixed. Thanks to Dr. Dirk Melcher for reporting this bug. * The TABLE subcommand on MATCH FILES worked only erratically at best. This fixes it. Thanks to Dr. Dirk Melcher for reporting this bug. * VARIABLE LABELS rejected a slash before the first variable specification, contradicting the documentation. Thanks to Walter M. Gray for reporting this bug. * Because of an incorrect optimization in memory allocation, CROSSTABS sometimes segfaulted when asked to output multiple tables. Thanks to Walter M. Gray for reporting this bug. * CROSSTABS didn't display value labels for column and row variables. Thanks to Walter M. Gray for reporting this bug. * WRITE didn't write line ends. Fixed. Thanks to Dr. Dirk Melcher for reporting this bug. * MATCH FILES corrupted memory and dumped core on some syntax errors. Fixed. * MATCH FILES should set numeric values not available to the system-missing value, not to 0. Thanks to Dr. Dirk Melcher for reporting this bug. * KEEP didn't work properly on the SAVE procedure. Fixed. Thanks to Ralf Geschke for reporting this bug. * Memory leak fix. * Some systems didn't like the way open_file was coded. Thanks to Hankin for pointing this out. * The SAVE procedure didn't save long string variables properly. Fixed by this patch. Thanks to Hankin for this patch. * Minor documentation fixes for MATCH FILES. Version 0.2.2 changes since 0.2.1: Bugs fixed: * Fix behavior of PRINT SPACE for negative arguments. * Fix reading some unusual system files. * Fix LIST problems with very long variables. Thanks to Hankin for this bug report. * Fix problems with some string format specifiers. * Fix use of $CASENUM in expressions. Thanks to Dirk Melcher for reporting this bug. * Additional DATA LIST FREE and DATA LIST LIST fixes. Thanks to Hankin again on this one. * Sometimes you may encounter a PSPP script that has to be interpreted in interactive mode. Now you can use the -i flag to do this. * Warnings for egcs 1.1.1 cleaned up. (However you'll get lots of `unused variable' warnings under gcc 2.7.2.3, fixing this will take more effort.) * Tests fixed. * The files in gmp need the internationalization directory in their include path. Thanks to OKUJI Yoshinori for pointing this out. Version 0.2.1 changes since 0.2.0: Bugs fixed: * Remember to include examples/ directory in distribution :-) * Fixed gmp compile problems for some non-i386 architectures. Thanks to Hans Olav Eggestad and others for reporting this. * DATA LIST FREE and DATA LIST LIST parsing of input files is now matches the documented behavior exactly, and error messages are more helpful. Thanks to Mark H. Wood . Version 0.2.0 changes since 0.1.0: Procedures now implemented: * CROSSTABS. Please see documentation for caveats. Transformations and utilities now implemented: * AGGREGATE * APPLY DICTIONARY * CLEAR TRANSFORMATIONS * DISPLAY (all subcommands). * ERASE * FLIP * EXPORT * HOST * IMPORT * MATCH FILES * MATRIX DATA * NEW FILE * REPEATING DATA Support for input and output through pipes: "|command" and "command|" filenames; support for special filenames "-", "stdin", "stdout", "stderr". New command-line features: * New option --testing-mode: Invoke heuristics to assist testing. * New option --safer, -s: Don't allow certain unsafe operations. * New option --command=CMD, -c CMD: Perform literal command CMD. * rc file ~/.pspp/rc is executed before any other files. * Now multiple syntax files can be specified. Operator LAG is now implemented. Added missing FILE subcommand to REREAD. Table output manager completely rewritten. Device configuration file syntax changed. You will need to reinstall your `devices' file. New output driver for HTML. PostScript driver and prologue simplified. Many bugs fixed. General source-code cleanup. Added Texinfo documentation for: * PSPP system file format * PSPP portable file format * How to write input for q2c parser generator * HTML driver PSPP language is now fully documented. Please report any inaccuracies or omissions in the documentation. Changes for version 0.1.0: First public release. For changes from unreleased development versions, please see ONEWS. ---------------------------------------------------------------------- Copyright information: Permission is granted to anyone to make or distribute verbatim copies of this document as received, in any medium, provided that the copyright notice and this permission notice are preserved, thus giving the recipient permission to redistribute in turn. Permission is granted to distribute modified versions of this document, or of portions of it, under the above conditions, provided also that they carry prominent notices stating who last changed them. Local variables: version-control: never mode: indented-text end: pspp-1.4.1/configure0000755000175000017500000624670713725007421014051 0ustar00blpblp00000000000000#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.69 for GNU PSPP 1.4.1. # # Report bugs to . # # # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. # # # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # Use a proper internal environment variable to ensure we don't fall # into an infinite loop, continuously re-executing ourselves. if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then _as_can_reexec=no; export _as_can_reexec; # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 as_fn_exit 255 fi # We don't want this to propagate to other subprocesses. { _as_can_reexec=; unset _as_can_reexec;} if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi " as_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : else exitcode=1; echo positional parameters were not saved. fi test x\$exitcode = x0 || exit 1 test -x / || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 test \$(( 1 + 1 )) = 2 || exit 1 test -n \"\${ZSH_VERSION+set}\${BASH_VERSION+set}\" || ( ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO PATH=/empty FPATH=/empty; export PATH FPATH test \"X\`printf %s \$ECHO\`\" = \"X\$ECHO\" \\ || test \"X\`print -r -- \$ECHO\`\" = \"X\$ECHO\" ) || exit 1" if (eval "$as_required") 2>/dev/null; then : as_have_required=yes else as_have_required=no fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. as_found=: case $as_dir in #( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir/$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : CONFIG_SHELL=$as_shell as_have_required=yes if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : break 2 fi fi done;; esac as_found=false done $as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : CONFIG_SHELL=$SHELL as_have_required=yes fi; } IFS=$as_save_IFS if test "x$CONFIG_SHELL" != x; then : export CONFIG_SHELL # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi if test x$as_have_required = xno; then : $as_echo "$0: This script requires a shell more modern than all" $as_echo "$0: the shells that I found on your system." if test x${ZSH_VERSION+set} = xset ; then $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" $as_echo "$0: be upgraded to zsh 4.3.4 or later." else $as_echo "$0: Please tell bug-autoconf@gnu.org and $0: bug-gnu-pspp@gnu.org about your system, including any $0: error possibly output before this message. Then install $0: a modern shell, or manually run the script under such a $0: shell if you do have one." fi exit 1 fi fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # If we had to re-execute with $CONFIG_SHELL, we're ensured to have # already done that, so ensure we don't try to do so again and fall # in an infinite loop. This has already happened in practice. _as_can_reexec=no; export _as_can_reexec # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" SHELL=${CONFIG_SHELL-/bin/sh} test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIBOBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= # Identity of this package. PACKAGE_NAME='GNU PSPP' PACKAGE_TARNAME='pspp' PACKAGE_VERSION='1.4.1' PACKAGE_STRING='GNU PSPP 1.4.1' PACKAGE_BUGREPORT='bug-gnu-pspp@gnu.org' PACKAGE_URL='http://www.gnu.org/software/pspp/' # Factoring default headers for most tests. ac_includes_default="\ #include #ifdef HAVE_SYS_TYPES_H # include #endif #ifdef HAVE_SYS_STAT_H # include #endif #ifdef STDC_HEADERS # include # include #else # ifdef HAVE_STDLIB_H # include # endif #endif #ifdef HAVE_STRING_H # if !defined STDC_HEADERS && defined HAVE_MEMORY_H # include # endif # include #endif #ifdef HAVE_STRINGS_H # include #endif #ifdef HAVE_INTTYPES_H # include #endif #ifdef HAVE_STDINT_H # include #endif #ifdef HAVE_UNISTD_H # include #endif" gl_use_threads_default= gl_use_winpthreads_default= gt_needs= ac_header_list= ac_func_list= gl_floor_required=plain gl_getopt_required=POSIX gl_round_required=plain gl_trunc_required=plain ac_subst_vars='gltests_LTLIBOBJS gltests_LIBOBJS gl_LTLIBOBJS gl_LIBOBJS am__EXEEXT_FALSE am__EXEEXT_TRUE LTLIBOBJS LIBOBJS gltests_WITNESS NEXT_AS_FIRST_DIRECTIVE_WCHAR_H NEXT_WCHAR_H LIBUNISTRING_COMPILE_UNIWIDTH_WIDTH_FALSE LIBUNISTRING_COMPILE_UNIWIDTH_WIDTH_TRUE LIBUNISTRING_COMPILE_UNIWIDTH_U8_WIDTH_FALSE LIBUNISTRING_COMPILE_UNIWIDTH_U8_WIDTH_TRUE LIBUNISTRING_COMPILE_UNIWIDTH_U8_STRWIDTH_FALSE LIBUNISTRING_COMPILE_UNIWIDTH_U8_STRWIDTH_TRUE LIBUNISTRING_UNIWIDTH_H LIBUNISTRING_COMPILE_UNIWBRK_WORDBREAK_PROPERTY_FALSE LIBUNISTRING_COMPILE_UNIWBRK_WORDBREAK_PROPERTY_TRUE LIBUNISTRING_COMPILE_UNIWBRK_U8_WORDBREAKS_FALSE LIBUNISTRING_COMPILE_UNIWBRK_U8_WORDBREAKS_TRUE LIBUNISTRING_UNIWBRK_H LIBUNISTRING_UNITYPES_H LIBUNISTRING_COMPILE_UNISTR_U8_UCTOMB_FALSE LIBUNISTRING_COMPILE_UNISTR_U8_UCTOMB_TRUE LIBUNISTRING_COMPILE_UNISTR_U8_STRNCAT_FALSE LIBUNISTRING_COMPILE_UNISTR_U8_STRNCAT_TRUE LIBUNISTRING_COMPILE_UNISTR_U8_STRMBTOUC_FALSE LIBUNISTRING_COMPILE_UNISTR_U8_STRMBTOUC_TRUE LIBUNISTRING_COMPILE_UNISTR_U8_STRLEN_FALSE LIBUNISTRING_COMPILE_UNISTR_U8_STRLEN_TRUE LIBUNISTRING_COMPILE_UNISTR_U8_MBTOUCR_FALSE LIBUNISTRING_COMPILE_UNISTR_U8_MBTOUCR_TRUE LIBUNISTRING_COMPILE_UNISTR_U8_MBTOUC_UNSAFE_FALSE LIBUNISTRING_COMPILE_UNISTR_U8_MBTOUC_UNSAFE_TRUE LIBUNISTRING_COMPILE_UNISTR_U8_MBTOUC_FALSE LIBUNISTRING_COMPILE_UNISTR_U8_MBTOUC_TRUE LIBUNISTRING_COMPILE_UNISTR_U8_MBLEN_FALSE LIBUNISTRING_COMPILE_UNISTR_U8_MBLEN_TRUE LIBUNISTRING_COMPILE_UNISTR_U8_CPY_FALSE LIBUNISTRING_COMPILE_UNISTR_U8_CPY_TRUE LIBUNISTRING_COMPILE_UNISTR_U8_CMP2_FALSE LIBUNISTRING_COMPILE_UNISTR_U8_CMP2_TRUE LIBUNISTRING_COMPILE_UNISTR_U8_CMP_FALSE LIBUNISTRING_COMPILE_UNISTR_U8_CMP_TRUE LIBUNISTRING_COMPILE_UNISTR_U8_CHECK_FALSE LIBUNISTRING_COMPILE_UNISTR_U8_CHECK_TRUE LIBUNISTRING_UNISTR_H HAVE_UNISTD_H NEXT_AS_FIRST_DIRECTIVE_UNISTD_H NEXT_UNISTD_H LIBUNISTRING_COMPILE_UNINORM_U8_NORMALIZE_FALSE LIBUNISTRING_COMPILE_UNINORM_U8_NORMALIZE_TRUE LIBUNISTRING_COMPILE_UNINORM_NFKD_FALSE LIBUNISTRING_COMPILE_UNINORM_NFKD_TRUE LIBUNISTRING_COMPILE_UNINORM_NFD_FALSE LIBUNISTRING_COMPILE_UNINORM_NFD_TRUE LIBUNISTRING_COMPILE_UNINORM_DECOMPOSITION_FALSE LIBUNISTRING_COMPILE_UNINORM_DECOMPOSITION_TRUE LIBUNISTRING_COMPILE_UNINORM_DECOMPOSING_FORM_FALSE LIBUNISTRING_COMPILE_UNINORM_DECOMPOSING_FORM_TRUE LIBUNISTRING_COMPILE_UNINORM_CANONICAL_DECOMPOSITION_FALSE LIBUNISTRING_COMPILE_UNINORM_CANONICAL_DECOMPOSITION_TRUE LIBUNISTRING_UNINORM_H LIBUNISTRING_COMPILE_UNILBRK_U8_POSSIBLE_LINEBREAKS_FALSE LIBUNISTRING_COMPILE_UNILBRK_U8_POSSIBLE_LINEBREAKS_TRUE LIBUNISTRING_UNILBRK_H LIBUNISTRING_COMPILE_UNIGBRK_UC_IS_GRAPHEME_BREAK_FALSE LIBUNISTRING_COMPILE_UNIGBRK_UC_IS_GRAPHEME_BREAK_TRUE LIBUNISTRING_COMPILE_UNIGBRK_UC_GBRK_PROP_FALSE LIBUNISTRING_COMPILE_UNIGBRK_UC_GBRK_PROP_TRUE LIBUNISTRING_UNIGBRK_H LIBUNISTRING_COMPILE_UNICTYPE_PROPERTY_SOFT_DOTTED_FALSE LIBUNISTRING_COMPILE_UNICTYPE_PROPERTY_SOFT_DOTTED_TRUE LIBUNISTRING_COMPILE_UNICTYPE_CTYPE_PRINT_FALSE LIBUNISTRING_COMPILE_UNICTYPE_CTYPE_PRINT_TRUE LIBUNISTRING_COMPILE_UNICTYPE_COMBINING_CLASS_FALSE LIBUNISTRING_COMPILE_UNICTYPE_COMBINING_CLASS_TRUE LIBUNISTRING_COMPILE_UNICTYPE_CATEGORY_OF_FALSE LIBUNISTRING_COMPILE_UNICTYPE_CATEGORY_OF_TRUE LIBUNISTRING_COMPILE_UNICTYPE_CATEGORY_NONE_FALSE LIBUNISTRING_COMPILE_UNICTYPE_CATEGORY_NONE_TRUE LIBUNISTRING_UNICTYPE_H LIBUNISTRING_COMPILE_UNICASE_U8_TOUPPER_FALSE LIBUNISTRING_COMPILE_UNICASE_U8_TOUPPER_TRUE LIBUNISTRING_COMPILE_UNICASE_U8_TOTITLE_FALSE LIBUNISTRING_COMPILE_UNICASE_U8_TOTITLE_TRUE LIBUNISTRING_COMPILE_UNICASE_U8_TOLOWER_FALSE LIBUNISTRING_COMPILE_UNICASE_U8_TOLOWER_TRUE LIBUNISTRING_COMPILE_UNICASE_U8_CT_TOTITLE_FALSE LIBUNISTRING_COMPILE_UNICASE_U8_CT_TOTITLE_TRUE LIBUNISTRING_COMPILE_UNICASE_U8_CT_CASEFOLD_FALSE LIBUNISTRING_COMPILE_UNICASE_U8_CT_CASEFOLD_TRUE LIBUNISTRING_COMPILE_UNICASE_U8_CASEFOLD_FALSE LIBUNISTRING_COMPILE_UNICASE_U8_CASEFOLD_TRUE LIBUNISTRING_COMPILE_UNICASE_U8_CASECMP_FALSE LIBUNISTRING_COMPILE_UNICASE_U8_CASECMP_TRUE LIBUNISTRING_COMPILE_UNICASE_TOUPPER_FALSE LIBUNISTRING_COMPILE_UNICASE_TOUPPER_TRUE LIBUNISTRING_COMPILE_UNICASE_TOTITLE_FALSE LIBUNISTRING_COMPILE_UNICASE_TOTITLE_TRUE LIBUNISTRING_COMPILE_UNICASE_TOLOWER_FALSE LIBUNISTRING_COMPILE_UNICASE_TOLOWER_TRUE LIBUNISTRING_COMPILE_UNICASE_EMPTY_SUFFIX_CONTEXT_FALSE LIBUNISTRING_COMPILE_UNICASE_EMPTY_SUFFIX_CONTEXT_TRUE LIBUNISTRING_COMPILE_UNICASE_EMPTY_PREFIX_CONTEXT_FALSE LIBUNISTRING_COMPILE_UNICASE_EMPTY_PREFIX_CONTEXT_TRUE LIBUNISTRING_UNICASE_H TRUNC_LIBM UNISTD_H_DEFINES_STRUCT_TIMESPEC PTHREAD_H_DEFINES_STRUCT_TIMESPEC SYS_TIME_H_DEFINES_STRUCT_TIMESPEC TIME_H_DEFINES_STRUCT_TIMESPEC NEXT_AS_FIRST_DIRECTIVE_TIME_H NEXT_TIME_H NEXT_AS_FIRST_DIRECTIVE_TERMIOS_H NEXT_TERMIOS_H HAVE_TERMIOS_H HAVE_DECL_TCGETSID GNULIB_TCGETSID HAVE_SYS_UIO_H NEXT_AS_FIRST_DIRECTIVE_SYS_UIO_H NEXT_SYS_UIO_H HAVE_WS2TCPIP_H HAVE_SYS_SOCKET_H NEXT_AS_FIRST_DIRECTIVE_SYS_SOCKET_H NEXT_SYS_SOCKET_H HAVE_ACCEPT4 HAVE_SA_FAMILY_T HAVE_STRUCT_SOCKADDR_STORAGE_SS_FAMILY HAVE_STRUCT_SOCKADDR_STORAGE GNULIB_ACCEPT4 GNULIB_SHUTDOWN GNULIB_SETSOCKOPT GNULIB_SENDTO GNULIB_RECVFROM GNULIB_SEND GNULIB_RECV GNULIB_LISTEN GNULIB_GETSOCKOPT GNULIB_GETSOCKNAME GNULIB_GETPEERNAME GNULIB_BIND GNULIB_ACCEPT GNULIB_CONNECT GNULIB_SOCKET HAVE_SYS_RANDOM_H NEXT_AS_FIRST_DIRECTIVE_SYS_RANDOM_H NEXT_SYS_RANDOM_H HAVE_STRINGS_H NEXT_AS_FIRST_DIRECTIVE_STRINGS_H NEXT_STRINGS_H NEXT_AS_FIRST_DIRECTIVE_STRING_H NEXT_STRING_H HAVE_DECL_STRNCASECMP HAVE_STRCASECMP HAVE_FFS GNULIB_FFS NEXT_AS_FIRST_DIRECTIVE_STDLIB_H NEXT_STDLIB_H NEXT_AS_FIRST_DIRECTIVE_STDIO_H NEXT_STDIO_H HAVE__BOOL GL_GENERATE_STDBOOL_H_FALSE GL_GENERATE_STDBOOL_H_TRUE STDBOOL_H GL_GENERATE_STDARG_H_FALSE GL_GENERATE_STDARG_H_TRUE STDARG_H NEXT_AS_FIRST_DIRECTIVE_STDARG_H NEXT_STDARG_H GL_GENERATE_STDALIGN_H_FALSE GL_GENERATE_STDALIGN_H_TRUE STDALIGN_H NEXT_AS_FIRST_DIRECTIVE_SIGNAL_H NEXT_SIGNAL_H LIB_SELECT LIBSOCKET HAVE_SYS_SELECT_H NEXT_AS_FIRST_DIRECTIVE_SYS_SELECT_H NEXT_SYS_SELECT_H REPLACE_SELECT REPLACE_PSELECT HAVE_PSELECT GNULIB_SELECT GNULIB_PSELECT ROUND_LIBM RELOCATABLE_STRIP RELOCATABLE_BUILD_DIR RELOCATABLE_SRC_DIR RELOCATABLE_CONFIG_H_DIR RELOCATABLE_LIBRARY_PATH RELOCATABLE_VIA_WRAPPER_FALSE RELOCATABLE_VIA_WRAPPER_TRUE RELOCATABLE_VIA_LD_FALSE RELOCATABLE_VIA_LD_TRUE INSTALL_PROGRAM_ENV RELOCATABLE_LDFLAGS RELOCATABLE GLIBC21 REPLACE_RAISE REPLACE_PTHREAD_SIGMASK HAVE_SIGHANDLER_T HAVE_TYPE_VOLATILE_SIG_ATOMIC_T HAVE_STRUCT_SIGACTION_SA_SIGACTION HAVE_SIGACTION HAVE_SIGINFO_T HAVE_SIGSET_T HAVE_RAISE HAVE_PTHREAD_SIGMASK HAVE_POSIX_SIGNALBLOCKING GNULIB_SIGACTION GNULIB_SIGPROCMASK GNULIB_SIGNAL_H_SIGPIPE GNULIB_RAISE GNULIB_PTHREAD_SIGMASK ASM_SYMBOL_PREFIX LIB_NL_LANGINFO REPLACE_LOCALTIME REPLACE_GMTIME REPLACE_TZSET REPLACE_TIMEGM REPLACE_STRFTIME REPLACE_NANOSLEEP REPLACE_MKTIME REPLACE_LOCALTIME_R REPLACE_CTIME HAVE_TIMEZONE_T HAVE_TZSET HAVE_TIMEGM HAVE_STRPTIME HAVE_NANOSLEEP HAVE_DECL_LOCALTIME_R GNULIB_TZSET GNULIB_TIME_RZ GNULIB_TIME_R GNULIB_TIMEGM GNULIB_STRPTIME GNULIB_STRFTIME GNULIB_NANOSLEEP GNULIB_LOCALTIME GNULIB_MKTIME GNULIB_CTIME HAVE_VISIBILITY CFLAG_VISIBILITY LIB_MBRTOWC NEXT_AS_FIRST_DIRECTIVE_MATH_H NEXT_MATH_H LTLIBMULTITHREAD LIBMULTITHREAD LTLIBTHREAD LIBTHREAD LIBSTDTHREAD NEXT_AS_FIRST_DIRECTIVE_LOCALE_H NEXT_LOCALE_H HAVE_XLOCALE_H NEXT_AS_FIRST_DIRECTIVE_STDDEF_H NEXT_STDDEF_H GL_GENERATE_STDDEF_H_FALSE GL_GENERATE_STDDEF_H_TRUE STDDEF_H HAVE_WCHAR_T HAVE_MAX_ALIGN_T REPLACE_NULL REPLACE_STRUCT_LCONV REPLACE_FREELOCALE REPLACE_DUPLOCALE REPLACE_NEWLOCALE REPLACE_SETLOCALE REPLACE_LOCALECONV HAVE_FREELOCALE HAVE_DUPLOCALE HAVE_NEWLOCALE GNULIB_LOCALENAME GNULIB_DUPLOCALE GNULIB_SETLOCALE_NULL GNULIB_SETLOCALE GNULIB_LOCALECONV LOCALCHARSET_TESTS_ENVIRONMENT HAVE_LANGINFO_YESEXPR HAVE_LANGINFO_ERA HAVE_LANGINFO_ALTMON HAVE_LANGINFO_T_FMT_AMPM HAVE_LANGINFO_CODESET HAVE_LANGINFO_H NEXT_AS_FIRST_DIRECTIVE_LANGINFO_H NEXT_LANGINFO_H REPLACE_NL_LANGINFO HAVE_NL_LANGINFO GNULIB_NL_LANGINFO LOCALE_ZH_CN LOCALE_FR_UTF8 LOCALE_JA REPLACE_TOWLOWER REPLACE_ISWCNTRL HAVE_WCTYPE_H NEXT_AS_FIRST_DIRECTIVE_WCTYPE_H NEXT_WCTYPE_H HAVE_CRTDEFS_H HAVE_WINT_T HAVE_ISWCNTRL REPLACE_ISWXDIGIT REPLACE_ISWDIGIT REPLACE_ISWBLANK HAVE_WCTRANS_T HAVE_WCTYPE_T HAVE_ISWBLANK GNULIB_TOWCTRANS GNULIB_WCTRANS GNULIB_ISWCTYPE GNULIB_WCTYPE GNULIB_ISWXDIGIT GNULIB_ISWDIGIT GNULIB_ISWBLANK ISNAN_LIBM ISNANL_LIBM ISNAND_LIBM ISNANF_LIBM ISINF_LIBM ISFINITE_LIBM NEXT_AS_FIRST_DIRECTIVE_INTTYPES_H NEXT_INTTYPES_H UINT64_MAX_EQ_ULONG_MAX UINT32_MAX_LT_UINTMAX_MAX PRIPTR_PREFIX INT64_MAX_EQ_LONG_MAX INT32_MAX_LT_INTMAX_MAX REPLACE_STRTOUMAX REPLACE_STRTOIMAX HAVE_IMAXDIV_T HAVE_DECL_STRTOUMAX HAVE_DECL_STRTOIMAX HAVE_DECL_IMAXDIV HAVE_DECL_IMAXABS GNULIB_STRTOUMAX GNULIB_STRTOIMAX GNULIB_IMAXDIV GNULIB_IMAXABS GL_GENERATE_STDINT_H_FALSE GL_GENERATE_STDINT_H_TRUE STDINT_H HAVE_SYS_INTTYPES_H HAVE_SYS_BITYPES_H HAVE_C99_STDINT_H WINT_T_SUFFIX WCHAR_T_SUFFIX SIG_ATOMIC_T_SUFFIX SIZE_T_SUFFIX PTRDIFF_T_SUFFIX HAVE_SIGNED_WINT_T HAVE_SIGNED_WCHAR_T HAVE_SIGNED_SIG_ATOMIC_T BITSIZEOF_WINT_T BITSIZEOF_WCHAR_T BITSIZEOF_SIG_ATOMIC_T BITSIZEOF_SIZE_T BITSIZEOF_PTRDIFF_T HAVE_STDINT_H NEXT_AS_FIRST_DIRECTIVE_STDINT_H NEXT_STDINT_H HAVE_SYS_TYPES_H HAVE_INTTYPES_H HAVE_WCHAR_H GL_GENERATE_LIMITS_H_FALSE GL_GENERATE_LIMITS_H_TRUE LIMITS_H NEXT_AS_FIRST_DIRECTIVE_LIMITS_H NEXT_LIMITS_H LIB_HARD_LOCALE LIB_SETLOCALE_NULL LIB_SCHED_YIELD LIBPMULTITHREAD LIBPTHREAD NEXT_AS_FIRST_DIRECTIVE_SYS_TIME_H NEXT_SYS_TIME_H REPLACE_STRUCT_TIMEVAL REPLACE_GETTIMEOFDAY HAVE_SYS_TIME_H HAVE_STRUCT_TIMEVAL HAVE_GETTIMEOFDAY GNULIB_GETTIMEOFDAY LIB_GETRANDOM REPLACE_GETRANDOM HAVE_GETRANDOM GNULIB_GETRANDOM GNULIB_GL_UNISTD_H_GETOPT GETOPT_CDEFS_H GETOPT_H HAVE_SYS_CDEFS_H HAVE_GETOPT_H NEXT_AS_FIRST_DIRECTIVE_GETOPT_H NEXT_GETOPT_H WINDOWS_64_BIT_ST_SIZE WINDOWS_STAT_TIMESPEC NEXT_AS_FIRST_DIRECTIVE_SYS_STAT_H NEXT_SYS_STAT_H REPLACE_UTIMENSAT REPLACE_STAT REPLACE_MKNOD REPLACE_MKFIFO REPLACE_MKDIR REPLACE_LSTAT REPLACE_FUTIMENS REPLACE_FSTATAT REPLACE_FSTAT REPLACE_FCHMODAT HAVE_UTIMENSAT HAVE_MKNODAT HAVE_MKNOD HAVE_MKFIFOAT HAVE_MKFIFO HAVE_MKDIRAT HAVE_LSTAT HAVE_LCHMOD HAVE_GETUMASK HAVE_FUTIMENS HAVE_FSTATAT HAVE_FCHMODAT GNULIB_OVERRIDES_STRUCT_STAT GNULIB_UTIMENSAT GNULIB_STAT GNULIB_MKNODAT GNULIB_MKNOD GNULIB_MKFIFOAT GNULIB_MKFIFO GNULIB_MKDIRAT GNULIB_LSTAT GNULIB_LCHMOD GNULIB_GETUMASK GNULIB_FUTIMENS GNULIB_FSTATAT GNULIB_FSTAT GNULIB_FCHMODAT WINDOWS_STAT_INODES WINDOWS_64_BIT_OFF_T NEXT_AS_FIRST_DIRECTIVE_SYS_TYPES_H NEXT_SYS_TYPES_H HAVE_FEATURES_H REPLACE_VSPRINTF REPLACE_VSNPRINTF REPLACE_VPRINTF REPLACE_VFPRINTF REPLACE_VDPRINTF REPLACE_VASPRINTF REPLACE_TMPFILE REPLACE_STDIO_WRITE_FUNCS REPLACE_STDIO_READ_FUNCS REPLACE_SPRINTF REPLACE_SNPRINTF REPLACE_RENAMEAT REPLACE_RENAME REPLACE_REMOVE REPLACE_PRINTF REPLACE_POPEN REPLACE_PERROR REPLACE_OBSTACK_PRINTF REPLACE_GETLINE REPLACE_GETDELIM REPLACE_FTELLO REPLACE_FTELL REPLACE_FSEEKO REPLACE_FSEEK REPLACE_FREOPEN REPLACE_FPURGE REPLACE_FPRINTF REPLACE_FOPEN REPLACE_FFLUSH REPLACE_FDOPEN REPLACE_FCLOSE REPLACE_DPRINTF HAVE_VDPRINTF HAVE_VASPRINTF HAVE_RENAMEAT HAVE_POPEN HAVE_PCLOSE HAVE_FTELLO HAVE_FSEEKO HAVE_DPRINTF HAVE_DECL_VSNPRINTF HAVE_DECL_SNPRINTF HAVE_DECL_OBSTACK_PRINTF HAVE_DECL_GETLINE HAVE_DECL_GETDELIM HAVE_DECL_FTELLO HAVE_DECL_FSEEKO HAVE_DECL_FPURGE GNULIB_VSPRINTF_POSIX GNULIB_VSNPRINTF GNULIB_VPRINTF_POSIX GNULIB_VPRINTF GNULIB_VFPRINTF_POSIX GNULIB_VFPRINTF GNULIB_VDPRINTF GNULIB_VSCANF GNULIB_VFSCANF GNULIB_VASPRINTF GNULIB_TMPFILE GNULIB_STDIO_H_SIGPIPE GNULIB_STDIO_H_NONBLOCKING GNULIB_SPRINTF_POSIX GNULIB_SNPRINTF GNULIB_SCANF GNULIB_RENAMEAT GNULIB_RENAME GNULIB_REMOVE GNULIB_PUTS GNULIB_PUTCHAR GNULIB_PUTC GNULIB_PRINTF_POSIX GNULIB_PRINTF GNULIB_POPEN GNULIB_PERROR GNULIB_PCLOSE GNULIB_OBSTACK_PRINTF_POSIX GNULIB_OBSTACK_PRINTF GNULIB_GETLINE GNULIB_GETDELIM GNULIB_GETCHAR GNULIB_GETC GNULIB_FWRITE GNULIB_FTELLO GNULIB_FTELL GNULIB_FSEEKO GNULIB_FSEEK GNULIB_FSCANF GNULIB_FREOPEN GNULIB_FREAD GNULIB_FPUTS GNULIB_FPUTC GNULIB_FPURGE GNULIB_FPRINTF_POSIX GNULIB_FPRINTF GNULIB_FOPEN GNULIB_FGETS GNULIB_FGETC GNULIB_FFLUSH GNULIB_FDOPEN GNULIB_FCLOSE GNULIB_DPRINTF FLOOR_LIBM REPLACE_TRUNCL REPLACE_TRUNCF REPLACE_TRUNC REPLACE_TANHF REPLACE_TANF REPLACE_SQRTL REPLACE_SQRTF REPLACE_SINHF REPLACE_SINF REPLACE_SIGNBIT_USING_BUILTINS REPLACE_SIGNBIT REPLACE_ROUNDL REPLACE_ROUNDF REPLACE_ROUND REPLACE_RINTL REPLACE_REMAINDERL REPLACE_REMAINDERF REPLACE_REMAINDER REPLACE_NAN REPLACE_MODFL REPLACE_MODFF REPLACE_MODF REPLACE_LOGBL REPLACE_LOGBF REPLACE_LOGB REPLACE_LOG2L REPLACE_LOG2F REPLACE_LOG2 REPLACE_LOG1PL REPLACE_LOG1PF REPLACE_LOG1P REPLACE_LOG10L REPLACE_LOG10F REPLACE_LOG10 REPLACE_LOGL REPLACE_LOGF REPLACE_LOG REPLACE_LDEXPL REPLACE_ISNAN REPLACE_ISINF REPLACE_ISFINITE REPLACE_ILOGBL REPLACE_ILOGBF REPLACE_ILOGB REPLACE_HYPOTL REPLACE_HYPOTF REPLACE_HYPOT REPLACE_HUGE_VAL REPLACE_FREXPL REPLACE_FREXP REPLACE_FREXPF REPLACE_FMODL REPLACE_FMODF REPLACE_FMOD REPLACE_FMAL REPLACE_FMAF REPLACE_FMA REPLACE_FLOORL REPLACE_FLOORF REPLACE_FLOOR REPLACE_FABSL REPLACE_EXP2L REPLACE_EXP2 REPLACE_EXPM1L REPLACE_EXPM1F REPLACE_EXPM1 REPLACE_EXPL REPLACE_EXPF REPLACE_COSHF REPLACE_COSF REPLACE_CEILL REPLACE_CEILF REPLACE_CEIL REPLACE_CBRTL REPLACE_CBRTF REPLACE_ATAN2F REPLACE_ATANF REPLACE_ASINF REPLACE_ACOSF HAVE_DECL_TRUNCL HAVE_DECL_TRUNCF HAVE_DECL_TRUNC HAVE_DECL_TANL HAVE_DECL_SQRTL HAVE_DECL_SINL HAVE_DECL_ROUNDL HAVE_DECL_ROUNDF HAVE_DECL_ROUND HAVE_DECL_RINTF HAVE_DECL_REMAINDERL HAVE_DECL_REMAINDER HAVE_DECL_LOGB HAVE_DECL_LOG2L HAVE_DECL_LOG2F HAVE_DECL_LOG2 HAVE_DECL_LOG10L HAVE_DECL_LOGL HAVE_DECL_LDEXPL HAVE_DECL_FREXPL HAVE_DECL_FLOORL HAVE_DECL_FLOORF HAVE_DECL_EXPM1L HAVE_DECL_EXP2L HAVE_DECL_EXP2F HAVE_DECL_EXP2 HAVE_DECL_EXPL HAVE_DECL_COSL HAVE_DECL_COPYSIGNF HAVE_DECL_CEILL HAVE_DECL_CEILF HAVE_DECL_CBRTL HAVE_DECL_CBRTF HAVE_DECL_ATANL HAVE_DECL_ASINL HAVE_DECL_ACOSL HAVE_TANHF HAVE_TANL HAVE_TANF HAVE_SQRTL HAVE_SQRTF HAVE_SINHF HAVE_SINL HAVE_SINF HAVE_RINTL HAVE_RINT HAVE_REMAINDERF HAVE_REMAINDER HAVE_POWF HAVE_MODFL HAVE_MODFF HAVE_LOGBL HAVE_LOGBF HAVE_LOG1PL HAVE_LOG1PF HAVE_LOG1P HAVE_LOG10L HAVE_LOG10F HAVE_LOGL HAVE_LOGF HAVE_LDEXPF HAVE_ISNANL HAVE_ISNAND HAVE_ISNANF HAVE_ILOGBL HAVE_ILOGBF HAVE_ILOGB HAVE_HYPOTL HAVE_HYPOTF HAVE_FREXPF HAVE_FMODL HAVE_FMODF HAVE_FMAL HAVE_FMAF HAVE_FMA HAVE_FABSL HAVE_FABSF HAVE_EXPM1F HAVE_EXPM1 HAVE_EXPL HAVE_EXPF HAVE_COSHF HAVE_COSL HAVE_COSF HAVE_COPYSIGNL HAVE_COPYSIGN HAVE_CBRTL HAVE_CBRTF HAVE_CBRT HAVE_ATAN2F HAVE_ATANL HAVE_ATANF HAVE_ASINL HAVE_ASINF HAVE_ACOSL HAVE_ACOSF GNULIB_TRUNCL GNULIB_TRUNCF GNULIB_TRUNC GNULIB_TANHF GNULIB_TANL GNULIB_TANF GNULIB_SQRTL GNULIB_SQRTF GNULIB_SINHF GNULIB_SINL GNULIB_SINF GNULIB_SIGNBIT GNULIB_ROUNDL GNULIB_ROUNDF GNULIB_ROUND GNULIB_RINTL GNULIB_RINTF GNULIB_RINT GNULIB_REMAINDERL GNULIB_REMAINDERF GNULIB_REMAINDER GNULIB_POWF GNULIB_MODFL GNULIB_MODFF GNULIB_MODF GNULIB_LOGBL GNULIB_LOGBF GNULIB_LOGB GNULIB_LOG2L GNULIB_LOG2F GNULIB_LOG2 GNULIB_LOG1PL GNULIB_LOG1PF GNULIB_LOG1P GNULIB_LOG10L GNULIB_LOG10F GNULIB_LOG10 GNULIB_LOGL GNULIB_LOGF GNULIB_LOG GNULIB_LDEXPL GNULIB_LDEXPF GNULIB_ISNANL GNULIB_ISNAND GNULIB_ISNANF GNULIB_ISNAN GNULIB_ISINF GNULIB_ISFINITE GNULIB_ILOGBL GNULIB_ILOGBF GNULIB_ILOGB GNULIB_HYPOTL GNULIB_HYPOTF GNULIB_HYPOT GNULIB_FREXPL GNULIB_FREXP GNULIB_FREXPF GNULIB_FMODL GNULIB_FMODF GNULIB_FMOD GNULIB_FMAL GNULIB_FMAF GNULIB_FMA GNULIB_FLOORL GNULIB_FLOORF GNULIB_FLOOR GNULIB_FABSL GNULIB_FABSF GNULIB_EXPM1L GNULIB_EXPM1F GNULIB_EXPM1 GNULIB_EXP2L GNULIB_EXP2F GNULIB_EXP2 GNULIB_EXPL GNULIB_EXPF GNULIB_COSHF GNULIB_COSL GNULIB_COSF GNULIB_COPYSIGNL GNULIB_COPYSIGNF GNULIB_COPYSIGN GNULIB_CEILL GNULIB_CEILF GNULIB_CEIL GNULIB_CBRTL GNULIB_CBRTF GNULIB_CBRT GNULIB_ATAN2F GNULIB_ATANL GNULIB_ATANF GNULIB_ASINL GNULIB_ASINF GNULIB_ACOSL GNULIB_ACOSF REPLACE_ITOLD GL_GENERATE_FLOAT_H_FALSE GL_GENERATE_FLOAT_H_TRUE FLOAT_H NEXT_AS_FIRST_DIRECTIVE_FLOAT_H NEXT_FLOAT_H NEXT_AS_FIRST_DIRECTIVE_FCNTL_H NEXT_FCNTL_H REPLACE_OPENAT REPLACE_OPEN REPLACE_FCNTL REPLACE_CREAT HAVE_OPENAT HAVE_FCNTL GNULIB_OPENAT GNULIB_OPEN GNULIB_NONBLOCKING GNULIB_FCNTL GNULIB_CREAT UNDEFINE_STRTOK_R REPLACE_STRSIGNAL REPLACE_STRERROR_R REPLACE_STRERROR REPLACE_STRTOK_R REPLACE_STRCASESTR REPLACE_STRSTR REPLACE_STRNLEN REPLACE_STRNDUP REPLACE_STRNCAT REPLACE_STRDUP REPLACE_STRCHRNUL REPLACE_STPNCPY REPLACE_MEMMEM REPLACE_MEMCHR HAVE_STRVERSCMP HAVE_DECL_STRSIGNAL HAVE_DECL_STRERROR_R HAVE_DECL_STRTOK_R HAVE_STRCASESTR HAVE_STRSEP HAVE_STRPBRK HAVE_DECL_STRNLEN HAVE_DECL_STRNDUP HAVE_DECL_STRDUP HAVE_STRCHRNUL HAVE_STPNCPY HAVE_STPCPY HAVE_RAWMEMCHR HAVE_DECL_MEMRCHR HAVE_MEMPCPY HAVE_DECL_MEMMEM HAVE_FFSLL HAVE_FFSL HAVE_EXPLICIT_BZERO HAVE_MBSLEN GNULIB_STRVERSCMP GNULIB_STRSIGNAL GNULIB_STRERROR_R GNULIB_STRERROR GNULIB_MBSTOK_R GNULIB_MBSSEP GNULIB_MBSSPN GNULIB_MBSPBRK GNULIB_MBSCSPN GNULIB_MBSCASESTR GNULIB_MBSPCASECMP GNULIB_MBSNCASECMP GNULIB_MBSCASECMP GNULIB_MBSSTR GNULIB_MBSRCHR GNULIB_MBSCHR GNULIB_MBSNLEN GNULIB_MBSLEN GNULIB_STRTOK_R GNULIB_STRCASESTR GNULIB_STRSTR GNULIB_STRSEP GNULIB_STRPBRK GNULIB_STRNLEN GNULIB_STRNDUP GNULIB_STRNCAT GNULIB_STRDUP GNULIB_STRCHRNUL GNULIB_STPNCPY GNULIB_STPCPY GNULIB_RAWMEMCHR GNULIB_MEMRCHR GNULIB_MEMPCPY GNULIB_MEMMEM GNULIB_MEMCHR GNULIB_FFSLL GNULIB_FFSL GNULIB_EXPLICIT_BZERO EOVERFLOW_VALUE EOVERFLOW_HIDDEN ENOLINK_VALUE ENOLINK_HIDDEN EMULTIHOP_VALUE EMULTIHOP_HIDDEN GL_GENERATE_ERRNO_H_FALSE GL_GENERATE_ERRNO_H_TRUE ERRNO_H NEXT_AS_FIRST_DIRECTIVE_ERRNO_H NEXT_ERRNO_H pkglibexecdir lispdir HAVE_WINSOCK2_H HAVE_MSVC_INVALID_PARAMETER_HANDLER LIB_CLOCK_GETTIME UNISTD_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS UNISTD_H_HAVE_WINSOCK2_H UNISTD_H_HAVE_SYS_RANDOM_H REPLACE_WRITE REPLACE_USLEEP REPLACE_UNLINKAT REPLACE_UNLINK REPLACE_TTYNAME_R REPLACE_TRUNCATE REPLACE_SYMLINKAT REPLACE_SYMLINK REPLACE_SLEEP REPLACE_RMDIR REPLACE_READLINKAT REPLACE_READLINK REPLACE_READ REPLACE_PWRITE REPLACE_PREAD REPLACE_LSEEK REPLACE_LINKAT REPLACE_LINK REPLACE_LCHOWN REPLACE_ISATTY REPLACE_GETPASS REPLACE_GETPAGESIZE REPLACE_GETGROUPS REPLACE_GETLOGIN_R REPLACE_GETDTABLESIZE REPLACE_GETDOMAINNAME REPLACE_GETCWD REPLACE_FTRUNCATE REPLACE_FCHOWNAT REPLACE_FACCESSAT REPLACE_DUP2 REPLACE_DUP REPLACE_CLOSE REPLACE_CHOWN REPLACE_ACCESS HAVE_SYS_PARAM_H HAVE_OS_H HAVE_DECL_TTYNAME_R HAVE_DECL_TRUNCATE HAVE_DECL_SETHOSTNAME HAVE_DECL_GETUSERSHELL HAVE_DECL_GETPAGESIZE HAVE_DECL_GETLOGIN_R HAVE_DECL_GETLOGIN HAVE_DECL_GETDOMAINNAME HAVE_DECL_FDATASYNC HAVE_DECL_FCHDIR HAVE_DECL_ENVIRON HAVE_USLEEP HAVE_UNLINKAT HAVE_SYMLINKAT HAVE_SYMLINK HAVE_SLEEP HAVE_SETHOSTNAME HAVE_READLINKAT HAVE_READLINK HAVE_PWRITE HAVE_PREAD HAVE_PIPE2 HAVE_PIPE HAVE_LINKAT HAVE_LINK HAVE_LCHOWN HAVE_GROUP_MEMBER HAVE_GETPASS HAVE_GETPAGESIZE HAVE_GETLOGIN HAVE_GETHOSTNAME HAVE_GETGROUPS HAVE_GETENTROPY HAVE_GETDTABLESIZE HAVE_FTRUNCATE HAVE_FSYNC HAVE_FDATASYNC HAVE_FCHOWNAT HAVE_FCHDIR HAVE_FACCESSAT HAVE_EUIDACCESS HAVE_DUP3 HAVE_COPY_FILE_RANGE HAVE_CHOWN GNULIB_WRITE GNULIB_USLEEP GNULIB_UNLINKAT GNULIB_UNLINK GNULIB_UNISTD_H_SIGPIPE GNULIB_UNISTD_H_NONBLOCKING GNULIB_TTYNAME_R GNULIB_TRUNCATE GNULIB_SYMLINKAT GNULIB_SYMLINK GNULIB_SLEEP GNULIB_SETHOSTNAME GNULIB_RMDIR GNULIB_READLINKAT GNULIB_READLINK GNULIB_READ GNULIB_PWRITE GNULIB_PREAD GNULIB_PIPE2 GNULIB_PIPE GNULIB_LSEEK GNULIB_LINKAT GNULIB_LINK GNULIB_LCHOWN GNULIB_ISATTY GNULIB_GROUP_MEMBER GNULIB_GETUSERSHELL GNULIB_GETPASS GNULIB_GETPAGESIZE GNULIB_GETOPT_POSIX GNULIB_GETLOGIN_R GNULIB_GETLOGIN GNULIB_GETHOSTNAME GNULIB_GETGROUPS GNULIB_GETENTROPY GNULIB_GETDTABLESIZE GNULIB_GETDOMAINNAME GNULIB_GETCWD GNULIB_FTRUNCATE GNULIB_FSYNC GNULIB_FDATASYNC GNULIB_FCHOWNAT GNULIB_FCHDIR GNULIB_FACCESSAT GNULIB_EUIDACCESS GNULIB_ENVIRON GNULIB_DUP3 GNULIB_DUP2 GNULIB_DUP GNULIB_COPY_FILE_RANGE GNULIB_CLOSE GNULIB_CHOWN GNULIB_CHDIR GNULIB_ACCESS REPLACE_WCTOMB REPLACE_UNSETENV REPLACE_STRTOLD REPLACE_STRTOD REPLACE_SETSTATE REPLACE_SETENV REPLACE_REALPATH REPLACE_REALLOC REPLACE_RANDOM_R REPLACE_RANDOM REPLACE_QSORT_R REPLACE_PUTENV REPLACE_PTSNAME_R REPLACE_PTSNAME REPLACE_MKSTEMP REPLACE_MBTOWC REPLACE_MALLOC REPLACE_INITSTATE REPLACE_CANONICALIZE_FILE_NAME REPLACE_CALLOC HAVE_DECL_UNSETENV HAVE_UNLOCKPT HAVE_SYS_LOADAVG_H HAVE_STRUCT_RANDOM_DATA HAVE_STRTOULL HAVE_STRTOLL HAVE_STRTOLD HAVE_STRTOD HAVE_DECL_SETSTATE HAVE_SETSTATE HAVE_DECL_SETENV HAVE_SETENV HAVE_SECURE_GETENV HAVE_RPMATCH HAVE_REALPATH HAVE_REALLOCARRAY HAVE_RANDOM_R HAVE_RANDOM_H HAVE_RANDOM HAVE_QSORT_R HAVE_PTSNAME_R HAVE_PTSNAME HAVE_POSIX_OPENPT HAVE_MKSTEMPS HAVE_MKSTEMP HAVE_MKOSTEMPS HAVE_MKOSTEMP HAVE_MKDTEMP HAVE_MBTOWC HAVE_DECL_INITSTATE HAVE_INITSTATE HAVE_GRANTPT HAVE_GETSUBOPT HAVE_DECL_GETLOADAVG HAVE_CANONICALIZE_FILE_NAME HAVE_ATOLL HAVE__EXIT GNULIB_WCTOMB GNULIB_UNSETENV GNULIB_UNLOCKPT GNULIB_SYSTEM_POSIX GNULIB_STRTOULL GNULIB_STRTOLL GNULIB_STRTOLD GNULIB_STRTOD GNULIB_SETENV GNULIB_SECURE_GETENV GNULIB_RPMATCH GNULIB_REALPATH GNULIB_REALLOC_POSIX GNULIB_REALLOCARRAY GNULIB_RANDOM_R GNULIB_RANDOM GNULIB_QSORT_R GNULIB_PUTENV GNULIB_PTSNAME_R GNULIB_PTSNAME GNULIB_POSIX_OPENPT GNULIB_MKSTEMPS GNULIB_MKSTEMP GNULIB_MKOSTEMPS GNULIB_MKOSTEMP GNULIB_MKDTEMP GNULIB_MBTOWC GNULIB_MALLOC_POSIX GNULIB_GRANTPT GNULIB_GETSUBOPT GNULIB_GETLOADAVG GNULIB_CANONICALIZE_FILE_NAME GNULIB_CALLOC_POSIX GNULIB_ATOLL GNULIB__EXIT APPLE_UNIVERSAL_BUILD HAVE_SAME_LONG_DOUBLE_AS_DOUBLE GNULIB_OVERRIDES_WINT_T GL_GENERATE_BYTESWAP_H_FALSE GL_GENERATE_BYTESWAP_H_TRUE BYTESWAP_H LOCALE_FR REPLACE_WCSTOK REPLACE_WCSFTIME REPLACE_WCSWIDTH REPLACE_WCWIDTH REPLACE_WCSNRTOMBS REPLACE_WCSRTOMBS REPLACE_WCRTOMB REPLACE_MBSNRTOWCS REPLACE_MBSRTOWCS REPLACE_MBRLEN REPLACE_MBRTOWC REPLACE_MBSINIT REPLACE_WCTOB REPLACE_BTOWC REPLACE_MBSTATE_T HAVE_DECL_WCWIDTH HAVE_DECL_WCTOB HAVE_WCSFTIME HAVE_WCSWIDTH HAVE_WCSTOK HAVE_WCSSTR HAVE_WCSPBRK HAVE_WCSSPN HAVE_WCSCSPN HAVE_WCSRCHR HAVE_WCSCHR HAVE_WCSDUP HAVE_WCSXFRM HAVE_WCSCOLL HAVE_WCSNCASECMP HAVE_WCSCASECMP HAVE_WCSNCMP HAVE_WCSCMP HAVE_WCSNCAT HAVE_WCSCAT HAVE_WCPNCPY HAVE_WCSNCPY HAVE_WCPCPY HAVE_WCSCPY HAVE_WCSNLEN HAVE_WCSLEN HAVE_WMEMSET HAVE_WMEMPCPY HAVE_WMEMMOVE HAVE_WMEMCPY HAVE_WMEMCMP HAVE_WMEMCHR HAVE_WCSNRTOMBS HAVE_WCSRTOMBS HAVE_WCRTOMB HAVE_MBSNRTOWCS HAVE_MBSRTOWCS HAVE_MBRLEN HAVE_MBRTOWC HAVE_MBSINIT HAVE_BTOWC GNULIB_WCSFTIME GNULIB_WCSWIDTH GNULIB_WCSTOK GNULIB_WCSSTR GNULIB_WCSPBRK GNULIB_WCSSPN GNULIB_WCSCSPN GNULIB_WCSRCHR GNULIB_WCSCHR GNULIB_WCSDUP GNULIB_WCSXFRM GNULIB_WCSCOLL GNULIB_WCSNCASECMP GNULIB_WCSCASECMP GNULIB_WCSNCMP GNULIB_WCSCMP GNULIB_WCSNCAT GNULIB_WCSCAT GNULIB_WCPNCPY GNULIB_WCSNCPY GNULIB_WCPCPY GNULIB_WCSCPY GNULIB_WCSNLEN GNULIB_WCSLEN GNULIB_WMEMSET GNULIB_WMEMPCPY GNULIB_WMEMMOVE GNULIB_WMEMCPY GNULIB_WMEMCMP GNULIB_WMEMCHR GNULIB_WCWIDTH GNULIB_WCSNRTOMBS GNULIB_WCSRTOMBS GNULIB_WCRTOMB GNULIB_MBSNRTOWCS GNULIB_MBSRTOWCS GNULIB_MBRLEN GNULIB_MBRTOWC GNULIB_MBSINIT GNULIB_WCTOB GNULIB_BTOWC HAVE_ALLOCA_H GL_GENERATE_ALLOCA_H_FALSE GL_GENERATE_ALLOCA_H_TRUE ALLOCA_H ALLOCA LTALLOCA GL_COND_LIBTOOL_FALSE GL_COND_LIBTOOL_TRUE LTLIBREADLINE LIBREADLINE GSL_LIBS GSL_CFLAGS WITH_PERL_MODULE_FALSE WITH_PERL_MODULE_TRUE WITH_PERL_MODULE LIBXML2_LIBS LIBXML2_CFLAGS PSQL_SUPPORT PG_LIBS PG_LDFLAGS PG_CFLAGS PG_CONFIG NEXT_AS_FIRST_DIRECTIVE_GTK_GTK_H NEXT_GTK_GTK_H PRAGMA_COLUMNS PRAGMA_SYSTEM_HEADER INCLUDE_NEXT_AS_FIRST_DIRECTIVE INCLUDE_NEXT GLIB_COMPILE_RESOURCES GLIB_GENMARSHAL SPREAD_SHEET_WIDGET_LIBS SPREAD_SHEET_WIDGET_CFLAGS GLIB_LIBS GLIB_CFLAGS GTKSOURCEVIEW_LIBS GTKSOURCEVIEW_CFLAGS GTK_LIBS GTK_CFLAGS GTHREAD_LIBS GTHREAD_CFLAGS HAVE_GUI_FALSE HAVE_GUI_TRUE XMLLINT CAIRO_LIBS CAIRO_CFLAGS HAVE_CAIRO_FALSE HAVE_CAIRO_TRUE PSPPIRE_LDFLAGS PSPP_LDFLAGS XGETTEXT MSGFMT POSUB LTLIBINTL LIBINTL INTLLIBS LTLIBICONV LIBICONV USE_NLS INTL_MACOSX_LIBS PYTHON VERSION_FOR_PERL PERL EXEEXT_FOR_BUILD CC_FOR_BUILD cc_is_gcc_FALSE cc_is_gcc_TRUE HAVE_DOT_FALSE HAVE_DOT_TRUE BROKEN_DOCBOOK_XML_FALSE BROKEN_DOCBOOK_XML_TRUE AM_MAKEINFOFLAGS PKG_CONFIG_LIBDIR PKG_CONFIG_PATH PKG_CONFIG LT_SYS_LIBRARY_PATH OTOOL64 OTOOL LIPO NMEDIT DSYMUTIL MANIFEST_TOOL ac_ct_AR LN_S NM ac_ct_DUMPBIN DUMPBIN LD FGREP SED LIBTOOL OBJDUMP DLLTOOL AS host_os host_vendor host_cpu host build_os build_vendor build_cpu build RANLIB ARFLAGS AR EGREP GREP CPP am__fastdepCC_FALSE am__fastdepCC_TRUE CCDEPMODE am__nodep AMDEPBACKSLASH AMDEP_FALSE AMDEP_TRUE am__include DEPDIR OBJEXT EXEEXT ac_ct_CC CPPFLAGS LDFLAGS CFLAGS CC AM_BACKSLASH AM_DEFAULT_VERBOSITY AM_DEFAULT_V AM_V am__untar am__tar AMTAR am__leading_dot SET_MAKE AWK mkdir_p MKDIR_P INSTALL_STRIP_PROGRAM STRIP install_sh MAKEINFO AUTOHEADER AUTOMAKE AUTOCONF ACLOCAL VERSION PACKAGE CYGPATH_W am__isrc INSTALL_DATA INSTALL_SCRIPT INSTALL_PROGRAM target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir runstatedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL am__quote' ac_subst_files='' ac_user_opts=' enable_option_checking enable_silent_rules enable_dependency_tracking enable_largefile enable_threads enable_shared enable_static with_pic enable_fast_install with_aix_soname with_gnu_ld with_sysroot enable_libtool_lock enable_Werror enable_rpath with_libiconv_prefix enable_nls with_libintl_prefix with_cairo with_gui with_libpq with_perl_module with_libreadline_prefix with_libhistory_prefix enable_cross_guesses enable_assert with_included_regex enable_relocatable with_packager with_packager_version with_packager_bug_reports ' ac_precious_vars='build_alias host_alias target_alias CC CFLAGS LDFLAGS LIBS CPPFLAGS CPP LT_SYS_LIBRARY_PATH PKG_CONFIG PKG_CONFIG_PATH PKG_CONFIG_LIBDIR PYTHON PSPP_LDFLAGS PSPPIRE_LDFLAGS CAIRO_CFLAGS CAIRO_LIBS GTHREAD_CFLAGS GTHREAD_LIBS GTK_CFLAGS GTK_LIBS GTKSOURCEVIEW_CFLAGS GTKSOURCEVIEW_LIBS GLIB_CFLAGS GLIB_LIBS SPREAD_SHEET_WIDGET_CFLAGS SPREAD_SHEET_WIDGET_LIBS GLIB_GENMARSHAL PG_CONFIG LIBXML2_CFLAGS LIBXML2_LIBS GSL_CFLAGS GSL_LIBS' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' runstatedir='${localstatedir}/run' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *=) ac_optarg= ;; *) ac_optarg=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -runstatedir | --runstatedir | --runstatedi | --runstated \ | --runstate | --runstat | --runsta | --runst | --runs \ | --run | --ru | --r) ac_prev=runstatedir ;; -runstatedir=* | --runstatedir=* | --runstatedi=* | --runstated=* \ | --runstate=* | --runstat=* | --runsta=* | --runst=* | --runs=* \ | --run=* | --ru=* | --r=*) runstatedir=$ac_optarg ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) as_fn_error $? "unrecognized option: \`$ac_option' Try \`$0 --help' for more information" ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` as_fn_error $? "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi # Check all directory arguments for consistency. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir runstatedir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || as_fn_error $? "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error $? "pwd does not report name of working directory" # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures GNU PSPP 1.4.1 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking ...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --runstatedir=DIR modifiable per-process data [LOCALSTATEDIR/run] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root [DATAROOTDIR/doc/pspp] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF Program names: --program-prefix=PREFIX prepend PREFIX to installed program names --program-suffix=SUFFIX append SUFFIX to installed program names --program-transform-name=PROGRAM run sed PROGRAM on installed program names System types: --build=BUILD configure for building on BUILD [guessed] --host=HOST cross-compile to build programs to run on HOST [BUILD] _ACEOF fi if test -n "$ac_init_help"; then case $ac_init_help in short | recursive ) echo "Configuration of GNU PSPP 1.4.1:";; esac cat <<\_ACEOF Optional Features: --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --enable-silent-rules less verbose build output (undo: "make V=1") --disable-silent-rules verbose build output (undo: "make V=0") --enable-dependency-tracking do not reject slow dependency extractors --disable-dependency-tracking speeds up one-time build --disable-largefile omit support for large files --enable-threads={isoc|posix|isoc+posix|windows} specify multithreading API --disable-threads build without multithread safety --enable-shared[=PKGS] build shared libraries [default=yes] --enable-static[=PKGS] build static libraries [default=yes] --enable-fast-install[=PKGS] optimize for fast installation [default=yes] --disable-libtool-lock avoid locking (might break parallel builds) --enable-Werror Add -Werror to CFLAGS --disable-rpath do not hardcode runtime library paths --disable-nls do not use Native Language Support --enable-cross-guesses={conservative|risky} specify policy for cross-compilation guesses --disable-assert turn off assertions --enable-relocatable install a package that can be moved in the file system Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-pic[=PKGS] try to use only PIC/non-PIC objects [default=use both] --with-aix-soname=aix|svr4|both shared library versioning (aka "SONAME") variant to provide on AIX, [default=aix]. --with-gnu-ld assume the C compiler uses GNU ld [default=no] --with-sysroot[=DIR] Search for dependent libraries within DIR (or the compiler's sysroot if not specified). --with-gnu-ld assume the C compiler uses GNU ld [default=no] --with-libiconv-prefix[=DIR] search for libiconv in DIR/include and DIR/lib --without-libiconv-prefix don't search for libiconv in includedir and libdir --with-libintl-prefix[=DIR] search for libintl in DIR/include and DIR/lib --without-libintl-prefix don't search for libintl in includedir and libdir --without-cairo Don't build support for charts (using Cairo and Pango); implies --without-gui --without-gui Don't build the PSPPIRE GUI (using GTK+) --without-libpq don't compile in Postgres capability --without-perl-module do not build the Perl module --with-libreadline-prefix[=DIR] search for libreadline in DIR/include and DIR/lib --without-libreadline-prefix don't search for libreadline in includedir and libdir --with-libhistory-prefix[=DIR] search for libhistory in DIR/include and DIR/lib --without-libhistory-prefix don't search for libhistory in includedir and libdir --without-included-regex don't compile regex; this is the default on systems with recent-enough versions of the GNU C Library (use with caution on other systems). --with-packager String identifying the packager of this software --with-packager-version Packager-specific version information --with-packager-bug-reports Packager info for bug reports (URL/e-mail/...) Some influential environment variables: CC C compiler command CFLAGS C compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory LIBS libraries to pass to the linker, e.g. -l CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory CPP C preprocessor LT_SYS_LIBRARY_PATH User-defined run-time library search path. PKG_CONFIG path to pkg-config utility PKG_CONFIG_PATH directories to add to pkg-config's search path PKG_CONFIG_LIBDIR path overriding pkg-config's built-in search path PYTHON Python 2 or 3 interpreter PSPP_LDFLAGS linker flags to be used for linking the pspp binary only PSPPIRE_LDFLAGS linker flags to be used for linking the psppire binary only CAIRO_CFLAGS C compiler flags for CAIRO, overriding pkg-config CAIRO_LIBS linker flags for CAIRO, overriding pkg-config GTHREAD_CFLAGS C compiler flags for GTHREAD, overriding pkg-config GTHREAD_LIBS linker flags for GTHREAD, overriding pkg-config GTK_CFLAGS C compiler flags for GTK, overriding pkg-config GTK_LIBS linker flags for GTK, overriding pkg-config GTKSOURCEVIEW_CFLAGS C compiler flags for GTKSOURCEVIEW, overriding pkg-config GTKSOURCEVIEW_LIBS linker flags for GTKSOURCEVIEW, overriding pkg-config GLIB_CFLAGS C compiler flags for GLIB, overriding pkg-config GLIB_LIBS linker flags for GLIB, overriding pkg-config SPREAD_SHEET_WIDGET_CFLAGS C compiler flags for SPREAD_SHEET_WIDGET, overriding pkg-config SPREAD_SHEET_WIDGET_LIBS linker flags for SPREAD_SHEET_WIDGET, overriding pkg-config GLIB_GENMARSHAL PG_CONFIG Full pathname of the pg_config program shipped with Postgresql LIBXML2_CFLAGS C compiler flags for LIBXML2, overriding pkg-config LIBXML2_LIBS linker flags for LIBXML2, overriding pkg-config GSL_CFLAGS C compiler flags for GSL, overriding pkg-config GSL_LIBS linker flags for GSL, overriding pkg-config Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to . GNU PSPP home page: . General help using GNU software: . _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for guested configure. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF GNU PSPP configure 1.4.1 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## # ac_fn_c_try_compile LINENO # -------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_compile # ac_fn_c_try_cpp LINENO # ---------------------- # Try to preprocess conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_cpp # ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists, giving a warning if it cannot be compiled using # the include files in INCLUDES and setting the cache variable VAR # accordingly. ac_fn_c_check_header_mongrel () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if eval \${$3+:} false; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } else # Is the header compilable? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 $as_echo_n "checking $2 usability... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_header_compiler=yes else ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 $as_echo "$ac_header_compiler" >&6; } # Is the header present? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 $as_echo_n "checking $2 presence... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <$2> _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : ac_header_preproc=yes else ac_header_preproc=no fi rm -f conftest.err conftest.i conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 $as_echo "$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( yes:no: ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 $as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; no:yes:* ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 $as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 $as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 $as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 $as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ( $as_echo "## ----------------------------------- ## ## Report this to bug-gnu-pspp@gnu.org ## ## ----------------------------------- ##" ) | sed "s/^/$as_me: WARNING: /" >&2 ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=\$ac_header_compiler" fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_mongrel # ac_fn_c_try_run LINENO # ---------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. Assumes # that executables *can* be run. ac_fn_c_try_run () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then : ac_retval=0 else $as_echo "$as_me: program exited with status $ac_status" >&5 $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=$ac_status fi rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_run # ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists and can be compiled using the include files in # INCLUDES, setting the cache variable VAR accordingly. ac_fn_c_check_header_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_compile # ac_fn_c_try_link LINENO # ----------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || test -x conftest$ac_exeext }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_link # ac_fn_c_check_func LINENO FUNC VAR # ---------------------------------- # Tests whether FUNC exists, setting the cache variable VAR accordingly ac_fn_c_check_func () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Define $2 to an innocuous variant, in case declares $2. For example, HP-UX 11i declares gettimeofday. */ #define $2 innocuous_$2 /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $2 (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $2 /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $2 (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub_$2 || defined __stub___$2 choke me #endif int main () { return $2 (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_func # ac_fn_c_check_decl LINENO SYMBOL VAR INCLUDES # --------------------------------------------- # Tests whether SYMBOL is declared in INCLUDES, setting cache variable VAR # accordingly. ac_fn_c_check_decl () { ac_save_ac_compile="$ac_compile" if test -n "$ac_compile_for_check_decl"; then ac_compile="$ac_compile_for_check_decl" fi as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack as_decl_name=`echo $2|sed 's/ *(.*//'` as_decl_use=`echo $2|sed -e 's/(/((/' -e 's/)/) 0&/' -e 's/,/) 0& (/g'` { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $as_decl_name is declared" >&5 $as_echo_n "checking whether $as_decl_name is declared... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { #ifndef $as_decl_name #ifdef __cplusplus (void) $as_decl_use; #else (void) $as_decl_name; #endif #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno ac_compile="$ac_save_ac_compile" } # ac_fn_c_check_decl # ac_fn_c_check_type LINENO TYPE VAR INCLUDES # ------------------------------------------- # Tests whether TYPE exists after having included INCLUDES, setting cache # variable VAR accordingly. ac_fn_c_check_type () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=no" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { if (sizeof ($2)) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { if (sizeof (($2))) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else eval "$3=yes" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_type # ac_fn_c_compute_int LINENO EXPR VAR INCLUDES # -------------------------------------------- # Tries to find the compile-time value of EXPR in a program that includes # INCLUDES, setting VAR accordingly. Returns whether the value could be # computed ac_fn_c_compute_int () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if test "$cross_compiling" = yes; then # Depending upon the size, compute the lo and hi bounds. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { static int test_array [1 - 2 * !(($2) >= 0)]; test_array [0] = 0; return test_array [0]; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_lo=0 ac_mid=0 while :; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { static int test_array [1 - 2 * !(($2) <= $ac_mid)]; test_array [0] = 0; return test_array [0]; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_hi=$ac_mid; break else as_fn_arith $ac_mid + 1 && ac_lo=$as_val if test $ac_lo -le $ac_mid; then ac_lo= ac_hi= break fi as_fn_arith 2 '*' $ac_mid + 1 && ac_mid=$as_val fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext done else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { static int test_array [1 - 2 * !(($2) < 0)]; test_array [0] = 0; return test_array [0]; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_hi=-1 ac_mid=-1 while :; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { static int test_array [1 - 2 * !(($2) >= $ac_mid)]; test_array [0] = 0; return test_array [0]; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_lo=$ac_mid; break else as_fn_arith '(' $ac_mid ')' - 1 && ac_hi=$as_val if test $ac_mid -le $ac_hi; then ac_lo= ac_hi= break fi as_fn_arith 2 '*' $ac_mid && ac_mid=$as_val fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext done else ac_lo= ac_hi= fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext # Binary search between lo and hi bounds. while test "x$ac_lo" != "x$ac_hi"; do as_fn_arith '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo && ac_mid=$as_val cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { static int test_array [1 - 2 * !(($2) <= $ac_mid)]; test_array [0] = 0; return test_array [0]; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_hi=$ac_mid else as_fn_arith '(' $ac_mid ')' + 1 && ac_lo=$as_val fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext done case $ac_lo in #(( ?*) eval "$3=\$ac_lo"; ac_retval=0 ;; '') ac_retval=1 ;; esac else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 static long int longval () { return $2; } static unsigned long int ulongval () { return $2; } #include #include int main () { FILE *f = fopen ("conftest.val", "w"); if (! f) return 1; if (($2) < 0) { long int i = longval (); if (i != ($2)) return 1; fprintf (f, "%ld", i); } else { unsigned long int i = ulongval (); if (i != ($2)) return 1; fprintf (f, "%lu", i); } /* Do not output a trailing newline, as this causes \r\n confusion on some platforms. */ return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : echo >>conftest.val; read $3 &5 $as_echo_n "checking for $2.$3... " >&6; } if eval \${$4+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $5 int main () { static $2 ac_aggr; if (ac_aggr.$3) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$4=yes" else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $5 int main () { static $2 ac_aggr; if (sizeof ac_aggr.$3) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$4=yes" else eval "$4=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$4 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_member cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by GNU PSPP $as_me 1.4.1, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. $as_echo "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done { ac_configure_args0=; unset ac_configure_args0;} { ac_configure_args1=; unset ac_configure_args1;} # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo $as_echo "## ---------------- ## ## Cache variables. ## ## ---------------- ##" echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo $as_echo "## ----------------- ## ## Output variables. ## ## ----------------- ##" echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then $as_echo "## ------------------- ## ## File substitutions. ## ## ------------------- ##" echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then $as_echo "## ----------- ## ## confdefs.h. ## ## ----------- ##" echo cat confdefs.h echo fi test "$ac_signal" != 0 && $as_echo "$as_me: caught signal $ac_signal" $as_echo "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h $as_echo "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_URL "$PACKAGE_URL" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. ac_site_file1=NONE ac_site_file2=NONE if test -n "$CONFIG_SITE"; then # We do not want a PATH search for config.site. case $CONFIG_SITE in #(( -*) ac_site_file1=./$CONFIG_SITE;; */*) ac_site_file1=$CONFIG_SITE;; *) ac_site_file1=./$CONFIG_SITE;; esac elif test "x$prefix" != xNONE; then ac_site_file1=$prefix/share/config.site ac_site_file2=$prefix/etc/config.site else ac_site_file1=$ac_default_prefix/share/config.site ac_site_file2=$ac_default_prefix/etc/config.site fi for ac_site_file in "$ac_site_file1" "$ac_site_file2" do test "x$ac_site_file" = xNONE && continue if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 $as_echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file See \`config.log' for more details" "$LINENO" 5; } fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special files # actually), so we avoid doing that. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 $as_echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 $as_echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi gt_needs="$gt_needs need-ngettext" as_fn_append ac_header_list " pthread.h" as_fn_append ac_func_list " btowc" as_fn_append ac_func_list " uselocale" as_fn_append ac_header_list " xlocale.h" as_fn_append ac_func_list " snprintf" as_fn_append ac_func_list " canonicalize_file_name" as_fn_append ac_func_list " getcwd" as_fn_append ac_func_list " readlink" as_fn_append ac_func_list " realpath" as_fn_append ac_header_list " sys/param.h" as_fn_append ac_func_list " readlinkat" as_fn_append ac_func_list " _set_invalid_parameter_handler" as_fn_append ac_header_list " sys/socket.h" as_fn_append ac_header_list " unistd.h" as_fn_append ac_func_list " explicit_bzero" as_fn_append ac_func_list " memset_s" as_fn_append ac_func_list " fcntl" as_fn_append ac_func_list " symlink" as_fn_append ac_func_list " vasnprintf" as_fn_append ac_header_list " features.h" as_fn_append ac_func_list " __fseterr" as_fn_append ac_header_list " sys/stat.h" as_fn_append ac_func_list " getdelim" as_fn_append ac_func_list " getdtablesize" gl_getopt_required=GNU as_fn_append ac_header_list " getopt.h" as_fn_append ac_header_list " sys/cdefs.h" as_fn_append ac_func_list " getpass" as_fn_append ac_header_list " stdio_ext.h" as_fn_append ac_header_list " termios.h" as_fn_append ac_func_list " __fsetlocking" as_fn_append ac_func_list " getprogname" as_fn_append ac_func_list " getexecname" as_fn_append ac_func_list " getrandom" as_fn_append ac_func_list " gettimeofday" as_fn_append ac_header_list " sys/time.h" as_fn_append ac_header_list " threads.h" as_fn_append ac_header_list " limits.h" as_fn_append ac_header_list " wchar.h" as_fn_append ac_header_list " stdint.h" as_fn_append ac_header_list " inttypes.h" as_fn_append ac_func_list " iswcntrl" as_fn_append ac_header_list " crtdefs.h" as_fn_append ac_header_list " wctype.h" as_fn_append ac_func_list " iswblank" as_fn_append ac_header_list " langinfo.h" as_fn_append ac_func_list " newlocale" as_fn_append ac_func_list " duplocale" as_fn_append ac_func_list " freelocale" as_fn_append ac_func_list " lstat" as_fn_append ac_header_list " math.h" as_fn_append ac_func_list " mbsinit" as_fn_append ac_func_list " mbrtowc" as_fn_append ac_header_list " sys/mman.h" as_fn_append ac_func_list " mprotect" as_fn_append ac_func_list " mkstemp" as_fn_append ac_func_list " tzset" as_fn_append ac_func_list " nl_langinfo" as_fn_append ac_func_list " pipe2" gl_printf_safe=yes as_fn_append ac_header_list " malloc.h" as_fn_append ac_func_list " isblank" as_fn_append ac_func_list " iswctype" as_fn_append ac_func_list " setenv" as_fn_append ac_func_list " link" as_fn_append ac_func_list " secure_getenv" as_fn_append ac_func_list " getuid" as_fn_append ac_func_list " geteuid" as_fn_append ac_func_list " getgid" as_fn_append ac_func_list " getegid" as_fn_append ac_header_list " sys/select.h" as_fn_append ac_func_list " sigaction" as_fn_append ac_func_list " sigaltstack" as_fn_append ac_func_list " siginterrupt" as_fn_append ac_func_list " strdup" as_fn_append ac_header_list " strings.h" as_fn_append ac_func_list " strndup" as_fn_append ac_header_list " sys/random.h" as_fn_append ac_header_list " sys/uio.h" as_fn_append ac_func_list " localtime_r" as_fn_append ac_func_list " timegm" as_fn_append ac_func_list " wcrtomb" as_fn_append ac_func_list " wcwidth" # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then # differences in whitespace do not lead to failure. ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 $as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 $as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 $as_echo "$as_me: former value: \`$ac_old_val'" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 $as_echo "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## ## -------------------- ## ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_aux_dir= for ac_dir in build-aux "$srcdir"/build-aux; do if test -f "$ac_dir/install-sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install-sh -c" break elif test -f "$ac_dir/install.sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install.sh -c" break elif test -f "$ac_dir/shtool"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/shtool install -c" break fi done if test -z "$ac_aux_dir"; then as_fn_error $? "cannot find install-sh, install.sh, or shtool in build-aux \"$srcdir\"/build-aux" "$LINENO" 5 fi # These three variables are undocumented and unsupported, # and are intended to be withdrawn in a future Autoconf release. # They can cause serious problems if a builder's source tree is in a directory # whose full name contains unusual characters. ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. ac_config_headers="$ac_config_headers config.h" ac_config_commands="$ac_config_commands tests/atconfig" am__api_version='1.16' # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install # SunOS /usr/etc/install # IRIX /sbin/install # AIX /bin/install # AmigaOS /C/install, which installs bootblocks on floppy discs # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. # Reject install programs that cannot install multiple files. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 $as_echo_n "checking for a BSD-compatible install... " >&6; } if test -z "$INSTALL"; then if ${ac_cv_path_install+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. # Account for people who put trailing slashes in PATH elements. case $as_dir/ in #(( ./ | .// | /[cC]/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. # Don't use installbsd from OSF since it installs stuff as root # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then if test $ac_prog = install && grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : elif test $ac_prog = install && grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # program-specific install script used by HP pwplus--don't use. : else rm -rf conftest.one conftest.two conftest.dir echo one > conftest.one echo two > conftest.two mkdir conftest.dir if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && test -s conftest.one && test -s conftest.two && test -s conftest.dir/conftest.one && test -s conftest.dir/conftest.two then ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" break 3 fi fi fi done done ;; esac done IFS=$as_save_IFS rm -rf conftest.one conftest.two conftest.dir fi if test "${ac_cv_path_install+set}" = set; then INSTALL=$ac_cv_path_install else # As a last resort, use the slow shell script. Don't cache a # value for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. INSTALL=$ac_install_sh fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 $as_echo "$INSTALL" >&6; } # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 $as_echo_n "checking whether build environment is sane... " >&6; } # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[\\\"\#\$\&\'\`$am_lf]*) as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;; esac case $srcdir in *[\\\"\#\$\&\'\`$am_lf\ \ ]*) as_fn_error $? "unsafe srcdir value: '$srcdir'" "$LINENO" 5;; esac # Do 'set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( am_has_slept=no for am_try in 1 2; do echo "timestamp, slept: $am_has_slept" > conftest.file set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$*" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi if test "$*" != "X $srcdir/configure conftest.file" \ && test "$*" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". as_fn_error $? "ls -t appears to fail. Make sure there is not a broken alias in your environment" "$LINENO" 5 fi if test "$2" = conftest.file || test $am_try -eq 2; then break fi # Just in case. sleep 1 am_has_slept=yes done test "$2" = conftest.file ) then # Ok. : else as_fn_error $? "newly created file is older than distributed files! Check your system clock" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } # If we didn't sleep, we still need to ensure time stamps of config.status and # generated files are strictly newer. am_sleep_pid= if grep 'slept: no' conftest.file >/dev/null 2>&1; then ( sleep 1 ) & am_sleep_pid=$! fi rm -f conftest.file test "$program_prefix" != NONE && program_transform_name="s&^&$program_prefix&;$program_transform_name" # Use a double $ so make ignores it. test "$program_suffix" != NONE && program_transform_name="s&\$&$program_suffix&;$program_transform_name" # Double any \ or $. # By default was `s,x,x', remove it if useless. ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` # Expand $ac_aux_dir to an absolute path. am_aux_dir=`cd "$ac_aux_dir" && pwd` if test x"${MISSING+set}" != xset; then case $am_aux_dir in *\ * | *\ *) MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; *) MISSING="\${SHELL} $am_aux_dir/missing" ;; esac fi # Use eval to expand $SHELL if eval "$MISSING --is-lightweight"; then am_missing_run="$MISSING " else am_missing_run= { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 'missing' script is too old or missing" >&5 $as_echo "$as_me: WARNING: 'missing' script is too old or missing" >&2;} fi if test x"${install_sh+set}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi # Installed binaries are usually stripped using 'strip' when the user # run "make install-strip". However 'strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the 'STRIP' environment variable to overrule this program. if test "$cross_compiling" != no; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 $as_echo "$STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_STRIP="strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 $as_echo "$ac_ct_STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_STRIP" = x; then STRIP=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac STRIP=$ac_ct_STRIP fi else STRIP="$ac_cv_prog_STRIP" fi fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5 $as_echo_n "checking for a thread-safe mkdir -p... " >&6; } if test -z "$MKDIR_P"; then if ${ac_cv_path_mkdir+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in mkdir gmkdir; do for ac_exec_ext in '' $ac_executable_extensions; do as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( 'mkdir (GNU coreutils) '* | \ 'mkdir (coreutils) '* | \ 'mkdir (fileutils) '4.1*) ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext break 3;; esac done done done IFS=$as_save_IFS fi test -d ./--version && rmdir ./--version if test "${ac_cv_path_mkdir+set}" = set; then MKDIR_P="$ac_cv_path_mkdir -p" else # As a last resort, use the slow shell script. Don't cache a # value for MKDIR_P within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. MKDIR_P="$ac_install_sh -d" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 $as_echo "$MKDIR_P" >&6; } for ac_prog in gawk mawk nawk awk do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AWK+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AWK"; then ac_cv_prog_AWK="$AWK" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AWK="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AWK=$ac_cv_prog_AWK if test -n "$AWK"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 $as_echo "$AWK" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$AWK" && break done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 $as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } set x ${MAKE-make} ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : $as_echo_n "(cached) " >&6 else cat >conftest.make <<\_ACEOF SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF # GNU make sometimes prints "make[1]: Entering ...", which would confuse us. case `${MAKE-make} -f conftest.make 2>/dev/null` in *@@@%%%=?*=@@@%%%*) eval ac_cv_prog_make_${ac_make}_set=yes;; *) eval ac_cv_prog_make_${ac_make}_set=no;; esac rm -f conftest.make fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } SET_MAKE= else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null # Check whether --enable-silent-rules was given. if test "${enable_silent_rules+set}" = set; then : enableval=$enable_silent_rules; fi case $enable_silent_rules in # ((( yes) AM_DEFAULT_VERBOSITY=0;; no) AM_DEFAULT_VERBOSITY=1;; *) AM_DEFAULT_VERBOSITY=1;; esac am_make=${MAKE-make} { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 $as_echo_n "checking whether $am_make supports nested variables... " >&6; } if ${am_cv_make_support_nested_variables+:} false; then : $as_echo_n "(cached) " >&6 else if $as_echo 'TRUE=$(BAR$(V)) BAR0=false BAR1=true V=1 am__doit: @$(TRUE) .PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then am_cv_make_support_nested_variables=yes else am_cv_make_support_nested_variables=no fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 $as_echo "$am_cv_make_support_nested_variables" >&6; } if test $am_cv_make_support_nested_variables = yes; then AM_V='$(V)' AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' else AM_V=$AM_DEFAULT_VERBOSITY AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY fi AM_BACKSLASH='\' if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." am__isrc=' -I$(srcdir)' # test to see if srcdir already configured if test -f $srcdir/config.status; then as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi # Define the identity of the package. PACKAGE='pspp' VERSION='1.4.1' cat >>confdefs.h <<_ACEOF #define PACKAGE "$PACKAGE" _ACEOF cat >>confdefs.h <<_ACEOF #define VERSION "$VERSION" _ACEOF # Some tools Automake needs. ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} # For better backward compatibility. To be removed once Automake 1.9.x # dies out for good. For more background, see: # # mkdir_p='$(MKDIR_P)' # We need awk for the "check" target (and possibly the TAP driver). The # system "awk" is bad on some platforms. # Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AMTAR='$${TAR-tar}' # We'll loop over all known methods to create a tar archive until one works. _am_tools='gnutar plaintar pax cpio none' # The POSIX 1988 'ustar' format is defined with fixed-size fields. # There is notably a 21 bits limit for the UID and the GID. In fact, # the 'pax' utility can hang on bigger UID/GID (see automake bug#8343 # and bug#13588). am_max_uid=2097151 # 2^21 - 1 am_max_gid=$am_max_uid # The $UID and $GID variables are not portable, so we need to resort # to the POSIX-mandated id(1) utility. Errors in the 'id' calls # below are definitely unexpected, so allow the users to see them # (that is, avoid stderr redirection). am_uid=`id -u || echo unknown` am_gid=`id -g || echo unknown` { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether UID '$am_uid' is supported by ustar format" >&5 $as_echo_n "checking whether UID '$am_uid' is supported by ustar format... " >&6; } if test $am_uid -le $am_max_uid; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } _am_tools=none fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether GID '$am_gid' is supported by ustar format" >&5 $as_echo_n "checking whether GID '$am_gid' is supported by ustar format... " >&6; } if test $am_gid -le $am_max_gid; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } _am_tools=none fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to create a ustar tar archive" >&5 $as_echo_n "checking how to create a ustar tar archive... " >&6; } # Go ahead even if we have the value already cached. We do so because we # need to set the values for the 'am__tar' and 'am__untar' variables. _am_tools=${am_cv_prog_tar_ustar-$_am_tools} for _am_tool in $_am_tools; do case $_am_tool in gnutar) for _am_tar in tar gnutar gtar; do { echo "$as_me:$LINENO: $_am_tar --version" >&5 ($_am_tar --version) >&5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && break done am__tar="$_am_tar --format=ustar -chf - "'"$$tardir"' am__tar_="$_am_tar --format=ustar -chf - "'"$tardir"' am__untar="$_am_tar -xf -" ;; plaintar) # Must skip GNU tar: if it does not support --format= it doesn't create # ustar tarball either. (tar --version) >/dev/null 2>&1 && continue am__tar='tar chf - "$$tardir"' am__tar_='tar chf - "$tardir"' am__untar='tar xf -' ;; pax) am__tar='pax -L -x ustar -w "$$tardir"' am__tar_='pax -L -x ustar -w "$tardir"' am__untar='pax -r' ;; cpio) am__tar='find "$$tardir" -print | cpio -o -H ustar -L' am__tar_='find "$tardir" -print | cpio -o -H ustar -L' am__untar='cpio -i -H ustar -d' ;; none) am__tar=false am__tar_=false am__untar=false ;; esac # If the value was cached, stop now. We just wanted to have am__tar # and am__untar set. test -n "${am_cv_prog_tar_ustar}" && break # tar/untar a dummy directory, and stop if the command works. rm -rf conftest.dir mkdir conftest.dir echo GrepMe > conftest.dir/file { echo "$as_me:$LINENO: tardir=conftest.dir && eval $am__tar_ >conftest.tar" >&5 (tardir=conftest.dir && eval $am__tar_ >conftest.tar) >&5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } rm -rf conftest.dir if test -s conftest.tar; then { echo "$as_me:$LINENO: $am__untar &5 ($am__untar &5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } { echo "$as_me:$LINENO: cat conftest.dir/file" >&5 (cat conftest.dir/file) >&5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } grep GrepMe conftest.dir/file >/dev/null 2>&1 && break fi done rm -rf conftest.dir if ${am_cv_prog_tar_ustar+:} false; then : $as_echo_n "(cached) " >&6 else am_cv_prog_tar_ustar=$_am_tool fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_tar_ustar" >&5 $as_echo "$am_cv_prog_tar_ustar" >&6; } # POSIX will say in a future version that running "rm -f" with no argument # is OK; and we want to be able to make that assumption in our Makefile # recipes. So use an aggressive probe to check that the usage we want is # actually supported "in the wild" to an acceptable degree. # See automake bug#10828. # To make any issue more visible, cause the running configure to be aborted # by default if the 'rm' program in use doesn't match our expectations; the # user can still override this though. if rm -f && rm -fr && rm -rf; then : OK; else cat >&2 <<'END' Oops! Your 'rm' program seems unable to run without file operands specified on the command line, even when the '-f' option is present. This is contrary to the behaviour of most rm programs out there, and not conforming with the upcoming POSIX standard: Please tell bug-automake@gnu.org about your system, including the value of your $PATH and any error possibly output before this message. This can help us improve future automake versions. END if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then echo 'Configuration will proceed anyway, since you have set the' >&2 echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 echo >&2 else cat >&2 <<'END' Aborting the configuration process, to ensure you take notice of the issue. You can download and install GNU coreutils to get an 'rm' implementation that behaves properly: . If you want to complete the configuration process using your problematic 'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM to "yes", and re-run configure. END as_fn_error $? "Your 'rm' program is bad, sorry." "$LINENO" 5 fi fi DEPDIR="${am__leading_dot}deps" ac_config_commands="$ac_config_commands depfiles" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} supports the include directive" >&5 $as_echo_n "checking whether ${MAKE-make} supports the include directive... " >&6; } cat > confinc.mk << 'END' am__doit: @echo this is the am__doit target >confinc.out .PHONY: am__doit END am__include="#" am__quote= # BSD make does it like this. echo '.include "confinc.mk" # ignored' > confmf.BSD # Other make implementations (GNU, Solaris 10, AIX) do it like this. echo 'include confinc.mk # ignored' > confmf.GNU _am_result=no for s in GNU BSD; do { echo "$as_me:$LINENO: ${MAKE-make} -f confmf.$s && cat confinc.out" >&5 (${MAKE-make} -f confmf.$s && cat confinc.out) >&5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } case $?:`cat confinc.out 2>/dev/null` in #( '0:this is the am__doit target') : case $s in #( BSD) : am__include='.include' am__quote='"' ;; #( *) : am__include='include' am__quote='' ;; esac ;; #( *) : ;; esac if test "$am__include" != "#"; then _am_result="yes ($s style)" break fi done rm -f confinc.* confmf.* { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${_am_result}" >&5 $as_echo "${_am_result}" >&6; } # Check whether --enable-dependency-tracking was given. if test "${enable_dependency_tracking+set}" = set; then : enableval=$enable_dependency_tracking; fi if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' am__nodep='_no' fi if test "x$enable_dependency_tracking" != xno; then AMDEP_TRUE= AMDEP_FALSE='#' else AMDEP_TRUE='#' AMDEP_FALSE= fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}clang", so it can be a program name with args. set dummy ${ac_tool_prefix}clang; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}clang" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "clang", so it can be a program name with args. set dummy clang; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="clang" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi fi test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion -version; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 $as_echo_n "checking whether the C compiler works... " >&6; } ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # The possible output files: ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" ac_rmfiles= for ac_file in $ac_files do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; * ) ac_rmfiles="$ac_rmfiles $ac_file";; esac done rm -f $ac_rmfiles if { { ac_try="$ac_link_default" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link_default") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. # So ignore a value of `no', otherwise this would lead to `EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, # so that the user can short-circuit this test for compilers unknown to # Autoconf. for ac_file in $ac_files '' do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi # We set ac_cv_exeext here because the later test for it is not # safe: cross compilers may not add the suffix if given an `-o' # argument, so we may need to know it at that point already. # Even if this section looks crufty: it has the advantage of # actually working. break;; * ) break;; esac done test "$ac_cv_exeext" = no && ac_cv_exeext= else ac_file='' fi if test -z "$ac_file"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "C compiler cannot create executables See \`config.log' for more details" "$LINENO" 5; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 $as_echo_n "checking for C compiler default output file name... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 $as_echo "$ac_file" >&6; } ac_exeext=$ac_cv_exeext rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 $as_echo_n "checking for suffix of executables... " >&6; } if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with # `rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` break;; * ) break;; esac done else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of executables: cannot compile and link See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest conftest$ac_cv_exeext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 $as_echo "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { FILE *f = fopen ("conftest.out", "w"); return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF ac_clean_files="$ac_clean_files conftest.out" # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 $as_echo_n "checking whether we are cross compiling... " >&6; } if test "$cross_compiling" != yes; then { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if { ac_try='./conftest$ac_cv_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details" "$LINENO" 5; } fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 $as_echo "$cross_compiling" >&6; } rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 $as_echo_n "checking for suffix of object files... " >&6; } if ${ac_cv_objext+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of object files: cannot compile See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 $as_echo "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } if ${ac_cv_c_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if ${ac_cv_prog_cc_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C11 features" >&5 $as_echo_n "checking for $CC option to enable C11 features... " >&6; } if ${ac_cv_prog_cc_c11+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c11=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include #include #include // Check varargs macros. These examples are taken from C99 6.10.3.5. #define debug(...) fprintf (stderr, __VA_ARGS__) #define showlist(...) puts (#__VA_ARGS__) #define report(test,...) ((test) ? puts (#test) : printf (__VA_ARGS__)) static void test_varargs_macros (void) { int x = 1234; int y = 5678; debug ("Flag"); debug ("X = %d\n", x); showlist (The first, second, and third items.); report (x>y, "x is %d but y is %d", x, y); } // Check long long types. #define BIG64 18446744073709551615ull #define BIG32 4294967295ul #define BIG_OK (BIG64 / BIG32 == 4294967297ull && BIG64 % BIG32 == 0) #if !BIG_OK your preprocessor is broken; #endif #if BIG_OK #else your preprocessor is broken; #endif static long long int bignum = -9223372036854775807LL; static unsigned long long int ubignum = BIG64; struct incomplete_array { int datasize; double data[]; }; struct named_init { int number; const wchar_t *name; double average; }; typedef const char *ccp; static inline int test_restrict (ccp restrict text) { // See if C++-style comments work. // Iterate through items via the restricted pointer. // Also check for declarations in for loops. for (unsigned int i = 0; *(text+i) != '\0'; ++i) continue; return 0; } // Check varargs and va_copy. static bool test_varargs (const char *format, ...) { va_list args; va_start (args, format); va_list args_copy; va_copy (args_copy, args); const char *str = ""; int number = 0; float fnumber = 0; while (*format) { switch (*format++) { case 's': // string str = va_arg (args_copy, const char *); break; case 'd': // int number = va_arg (args_copy, int); break; case 'f': // float fnumber = va_arg (args_copy, double); break; default: break; } } va_end (args_copy); va_end (args); return *str && number && fnumber; } // Check _Alignas. char _Alignas (double) aligned_as_double; char _Alignas (0) no_special_alignment; extern char aligned_as_int; char _Alignas (0) _Alignas (int) aligned_as_int; // Check _Alignof. enum { int_alignment = _Alignof (int), int_array_alignment = _Alignof (int[100]), char_alignment = _Alignof (char) }; _Static_assert (0 < -_Alignof (int), "_Alignof is signed"); // Check _Noreturn. int _Noreturn does_not_return (void) { for (;;) continue; } // Check _Static_assert. struct test_static_assert { int x; _Static_assert (sizeof (int) <= sizeof (long int), "_Static_assert does not work in struct"); long int y; }; // Check UTF-8 literals. #define u8 syntax error! char const utf8_literal[] = u8"happens to be ASCII" "another string"; // Check duplicate typedefs. typedef long *long_ptr; typedef long int *long_ptr; typedef long_ptr long_ptr; // Anonymous structures and unions -- taken from C11 6.7.2.1 Example 1. struct anonymous { union { struct { int i; int j; }; struct { int k; long int l; } w; }; int m; } v1; int main () { // Check bool. _Bool success = false; // Check restrict. if (test_restrict ("String literal") == 0) success = true; char *restrict newvar = "Another string"; // Check varargs. success &= test_varargs ("s, d' f .", "string", 65, 34.234); test_varargs_macros (); // Check flexible array members. struct incomplete_array *ia = malloc (sizeof (struct incomplete_array) + (sizeof (double) * 10)); ia->datasize = 10; for (int i = 0; i < ia->datasize; ++i) ia->data[i] = i * 1.234; // Check named initializers. struct named_init ni = { .number = 34, .name = L"Test wide string", .average = 543.34343, }; ni.number = 58; int dynamic_array[ni.number]; dynamic_array[ni.number - 1] = 543; // work around unused variable warnings return (!success || bignum == 0LL || ubignum == 0uLL || newvar[0] == 'x' || dynamic_array[ni.number - 1] != 543); v1.i = 2; v1.w.k = 5; _Static_assert ((offsetof (struct anonymous, i) == offsetof (struct anonymous, w.k)), "Anonymous union alignment botch"); ; return 0; } _ACEOF for ac_arg in '' -std=gnu11 do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c11=$ac_arg fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c11" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL ac_prog_cc_stdc_options= case "x$ac_cv_prog_cc_c11" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) ac_prog_cc_stdc_options=" $ac_cv_prog_cc_c11" CC=$CC$ac_prog_cc_stdc_options { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c11" >&5 $as_echo "$ac_cv_prog_cc_c11" >&6; } ;; esac if test "x$ac_cv_prog_cc_c11" != xno; then : ac_prog_cc_stdc=c11 ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c11 else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C99 features" >&5 $as_echo_n "checking for $CC option to enable C99 features... " >&6; } if ${ac_cv_prog_cc_c99+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c99=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include #include #include // Check varargs macros. These examples are taken from C99 6.10.3.5. #define debug(...) fprintf (stderr, __VA_ARGS__) #define showlist(...) puts (#__VA_ARGS__) #define report(test,...) ((test) ? puts (#test) : printf (__VA_ARGS__)) static void test_varargs_macros (void) { int x = 1234; int y = 5678; debug ("Flag"); debug ("X = %d\n", x); showlist (The first, second, and third items.); report (x>y, "x is %d but y is %d", x, y); } // Check long long types. #define BIG64 18446744073709551615ull #define BIG32 4294967295ul #define BIG_OK (BIG64 / BIG32 == 4294967297ull && BIG64 % BIG32 == 0) #if !BIG_OK your preprocessor is broken; #endif #if BIG_OK #else your preprocessor is broken; #endif static long long int bignum = -9223372036854775807LL; static unsigned long long int ubignum = BIG64; struct incomplete_array { int datasize; double data[]; }; struct named_init { int number; const wchar_t *name; double average; }; typedef const char *ccp; static inline int test_restrict (ccp restrict text) { // See if C++-style comments work. // Iterate through items via the restricted pointer. // Also check for declarations in for loops. for (unsigned int i = 0; *(text+i) != '\0'; ++i) continue; return 0; } // Check varargs and va_copy. static bool test_varargs (const char *format, ...) { va_list args; va_start (args, format); va_list args_copy; va_copy (args_copy, args); const char *str = ""; int number = 0; float fnumber = 0; while (*format) { switch (*format++) { case 's': // string str = va_arg (args_copy, const char *); break; case 'd': // int number = va_arg (args_copy, int); break; case 'f': // float fnumber = va_arg (args_copy, double); break; default: break; } } va_end (args_copy); va_end (args); return *str && number && fnumber; } int main () { // Check bool. _Bool success = false; // Check restrict. if (test_restrict ("String literal") == 0) success = true; char *restrict newvar = "Another string"; // Check varargs. success &= test_varargs ("s, d' f .", "string", 65, 34.234); test_varargs_macros (); // Check flexible array members. struct incomplete_array *ia = malloc (sizeof (struct incomplete_array) + (sizeof (double) * 10)); ia->datasize = 10; for (int i = 0; i < ia->datasize; ++i) ia->data[i] = i * 1.234; // Check named initializers. struct named_init ni = { .number = 34, .name = L"Test wide string", .average = 543.34343, }; ni.number = 58; int dynamic_array[ni.number]; dynamic_array[ni.number - 1] = 543; // work around unused variable warnings return (!success || bignum == 0LL || ubignum == 0uLL || newvar[0] == 'x' || dynamic_array[ni.number - 1] != 543); ; return 0; } _ACEOF for ac_arg in '' -std=gnu99 -std=c99 -c99 -AC99 -D_STDC_C99= -qlanglvl=extc1x -qlanglvl=extc99 do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c99=$ac_arg fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c99" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL ac_prog_cc_stdc_options= case "x$ac_cv_prog_cc_c99" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) ac_prog_cc_stdc_options=" $ac_cv_prog_cc_c99" CC=$CC$ac_prog_cc_stdc_options { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c99" >&5 $as_echo "$ac_cv_prog_cc_c99" >&6; } ;; esac if test "x$ac_cv_prog_cc_c99" != xno; then : ac_prog_cc_stdc=c99 ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c99 else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C89 features" >&5 $as_echo_n "checking for $CC option to enable C89 features... " >&6; } if ${ac_cv_prog_cc_c89+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include struct stat; /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL ac_prog_cc_stdc_options= case "x$ac_cv_prog_cc_c89" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) ac_prog_cc_stdc_options=" $ac_cv_prog_cc_c89" CC=$CC$ac_prog_cc_stdc_options { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac if test "x$ac_cv_prog_cc_c89" != xno; then : ac_prog_cc_stdc=c89 ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c89 else ac_prog_cc_stdc=no ac_cv_prog_cc_stdc=no fi fi fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the compiler is clang" >&5 $as_echo_n "checking whether the compiler is clang... " >&6; } if ${gl_cv_compiler_clang+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __clang__ barfbarf #endif int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : gl_cv_compiler_clang=no else gl_cv_compiler_clang=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_compiler_clang" >&5 $as_echo "$gl_cv_compiler_clang" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for compiler option needed when checking for declarations" >&5 $as_echo_n "checking for compiler option needed when checking for declarations... " >&6; } if ${gl_cv_compiler_check_decl_option+:} false; then : $as_echo_n "(cached) " >&6 else if test $gl_cv_compiler_clang = yes; then save_ac_compile="$ac_compile" ac_compile="$ac_compile -Werror=implicit-function-declaration" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : gl_cv_compiler_check_decl_option='-Werror=implicit-function-declaration' else gl_cv_compiler_check_decl_option=none fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_compile="$save_ac_compile" else gl_cv_compiler_check_decl_option=none fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_compiler_check_decl_option" >&5 $as_echo "$gl_cv_compiler_check_decl_option" >&6; } if test "x$gl_cv_compiler_check_decl_option" != xnone; then ac_compile_for_check_decl="$ac_compile $gl_cv_compiler_check_decl_option" else ac_compile_for_check_decl="$ac_compile" fi depcc="$CC" am_compiler_list= { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } if ${am_cv_CC_dependencies_compiler_type+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CC_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CC_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CC_dependencies_compiler_type=none fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 $as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then am__fastdepCC_TRUE= am__fastdepCC_FALSE='#' else am__fastdepCC_TRUE='#' am__fastdepCC_FALSE= fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 $as_echo_n "checking how to run the C preprocessor... " >&6; } # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then if ${ac_cv_prog_CPP+:} false; then : $as_echo_n "(cached) " >&6 else # Double quotes because CPP needs to be expanded for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" do ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : break fi done ac_cv_prog_CPP=$CPP fi CPP=$ac_cv_prog_CPP else ac_cv_prog_CPP=$CPP fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 $as_echo "$CPP" >&6; } ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details" "$LINENO" 5; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 $as_echo_n "checking for grep that handles long lines and -e... " >&6; } if ${ac_cv_path_GREP+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$GREP"; then ac_path_GREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in grep ggrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_GREP" || continue # Check for GNU ac_path_GREP and select it if it is found. # Check for GNU $ac_path_GREP case `"$ac_path_GREP" --version 2>&1` in *GNU*) ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'GREP' >> "conftest.nl" "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_GREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_GREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_GREP"; then as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_GREP=$GREP fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 $as_echo "$ac_cv_path_GREP" >&6; } GREP="$ac_cv_path_GREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 $as_echo_n "checking for egrep... " >&6; } if ${ac_cv_path_EGREP+:} false; then : $as_echo_n "(cached) " >&6 else if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 then ac_cv_path_EGREP="$GREP -E" else if test -z "$EGREP"; then ac_path_EGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in egrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_EGREP" || continue # Check for GNU ac_path_EGREP and select it if it is found. # Check for GNU $ac_path_EGREP case `"$ac_path_EGREP" --version 2>&1` in *GNU*) ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'EGREP' >> "conftest.nl" "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_EGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_EGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_EGREP"; then as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_EGREP=$EGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 $as_echo "$ac_cv_path_EGREP" >&6; } EGREP="$ac_cv_path_EGREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } if ${ac_cv_header_stdc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else ac_cv_header_stdc=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) return 2; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : else ac_cv_header_stdc=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then $as_echo "#define STDC_HEADERS 1" >>confdefs.h fi # On IRIX 5.3, sys/types and inttypes.h are conflicting. for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ inttypes.h stdint.h unistd.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default " if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done ac_fn_c_check_header_mongrel "$LINENO" "minix/config.h" "ac_cv_header_minix_config_h" "$ac_includes_default" if test "x$ac_cv_header_minix_config_h" = xyes; then : MINIX=yes else MINIX= fi if test "$MINIX" = yes; then $as_echo "#define _POSIX_SOURCE 1" >>confdefs.h $as_echo "#define _POSIX_1_SOURCE 2" >>confdefs.h $as_echo "#define _MINIX 1" >>confdefs.h $as_echo "#define _NETBSD_SOURCE 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether it is safe to define __EXTENSIONS__" >&5 $as_echo_n "checking whether it is safe to define __EXTENSIONS__... " >&6; } if ${ac_cv_safe_to_define___extensions__+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ # define __EXTENSIONS__ 1 $ac_includes_default int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_safe_to_define___extensions__=yes else ac_cv_safe_to_define___extensions__=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_safe_to_define___extensions__" >&5 $as_echo "$ac_cv_safe_to_define___extensions__" >&6; } test $ac_cv_safe_to_define___extensions__ = yes && $as_echo "#define __EXTENSIONS__ 1" >>confdefs.h $as_echo "#define _ALL_SOURCE 1" >>confdefs.h $as_echo "#define _DARWIN_C_SOURCE 1" >>confdefs.h $as_echo "#define _GNU_SOURCE 1" >>confdefs.h $as_echo "#define _NETBSD_SOURCE 1" >>confdefs.h $as_echo "#define _OPENBSD_SOURCE 1" >>confdefs.h $as_echo "#define _POSIX_PTHREAD_SEMANTICS 1" >>confdefs.h $as_echo "#define __STDC_WANT_IEC_60559_ATTRIBS_EXT__ 1" >>confdefs.h $as_echo "#define __STDC_WANT_IEC_60559_BFP_EXT__ 1" >>confdefs.h $as_echo "#define __STDC_WANT_IEC_60559_DFP_EXT__ 1" >>confdefs.h $as_echo "#define __STDC_WANT_IEC_60559_FUNCS_EXT__ 1" >>confdefs.h $as_echo "#define __STDC_WANT_IEC_60559_TYPES_EXT__ 1" >>confdefs.h $as_echo "#define __STDC_WANT_LIB_EXT2__ 1" >>confdefs.h $as_echo "#define __STDC_WANT_MATH_SPEC_FUNCS__ 1" >>confdefs.h $as_echo "#define _TANDEM_SOURCE 1" >>confdefs.h { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether _XOPEN_SOURCE should be defined" >&5 $as_echo_n "checking whether _XOPEN_SOURCE should be defined... " >&6; } if ${ac_cv_should_define__xopen_source+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_should_define__xopen_source=no cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include mbstate_t x; int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define _XOPEN_SOURCE 500 #include mbstate_t x; int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_should_define__xopen_source=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_should_define__xopen_source" >&5 $as_echo "$ac_cv_should_define__xopen_source" >&6; } test $ac_cv_should_define__xopen_source = yes && $as_echo "#define _XOPEN_SOURCE 500" >>confdefs.h $as_echo "#define _HPUX_ALT_XOPEN_SOCKET_API 1" >>confdefs.h { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Minix Amsterdam compiler" >&5 $as_echo_n "checking for Minix Amsterdam compiler... " >&6; } if ${gl_cv_c_amsterdam_compiler+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __ACK__ Amsterdam #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "Amsterdam" >/dev/null 2>&1; then : gl_cv_c_amsterdam_compiler=yes else gl_cv_c_amsterdam_compiler=no fi rm -f conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_c_amsterdam_compiler" >&5 $as_echo "$gl_cv_c_amsterdam_compiler" >&6; } if test $gl_cv_c_amsterdam_compiler = yes; then if test -z "$AR"; then AR='cc -c.a' fi if test -z "$ARFLAGS"; then ARFLAGS='-o' fi else : fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ar", so it can be a program name with args. set dummy ${ac_tool_prefix}ar; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AR+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AR"; then ac_cv_prog_AR="$AR" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AR="${ac_tool_prefix}ar" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AR=$ac_cv_prog_AR if test -n "$AR"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 $as_echo "$AR" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_AR"; then ac_ct_AR=$AR # Extract the first word of "ar", so it can be a program name with args. set dummy ar; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_AR+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_AR"; then ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_AR="ar" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_AR=$ac_cv_prog_ac_ct_AR if test -n "$ac_ct_AR"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5 $as_echo "$ac_ct_AR" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_AR" = x; then AR="ar" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac AR=$ac_ct_AR fi else AR="$ac_cv_prog_AR" fi if test -z "$ARFLAGS"; then ARFLAGS='cr' fi if test -z "$RANLIB"; then if test $gl_cv_c_amsterdam_compiler = yes; then RANLIB=':' else if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. set dummy ${ac_tool_prefix}ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$RANLIB"; then ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi RANLIB=$ac_cv_prog_RANLIB if test -n "$RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 $as_echo "$RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_RANLIB"; then ac_ct_RANLIB=$RANLIB # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_RANLIB"; then ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_RANLIB="ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB if test -n "$ac_ct_RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 $as_echo "$ac_ct_RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_RANLIB" = x; then RANLIB=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac RANLIB=$ac_ct_RANLIB fi else RANLIB="$ac_cv_prog_RANLIB" fi fi fi # Make sure we can run config.sub. $SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 $as_echo_n "checking build system type... " >&6; } if ${ac_cv_build+:} false; then : $as_echo_n "(cached) " >&6 else ac_build_alias=$build_alias test "x$ac_build_alias" = x && ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` test "x$ac_build_alias" = x && as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 $as_echo "$ac_cv_build" >&6; } case $ac_cv_build in *-*-*) ;; *) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;; esac build=$ac_cv_build ac_save_IFS=$IFS; IFS='-' set x $ac_cv_build shift build_cpu=$1 build_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: build_os=$* IFS=$ac_save_IFS case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 $as_echo_n "checking host system type... " >&6; } if ${ac_cv_host+:} false; then : $as_echo_n "(cached) " >&6 else if test "x$host_alias" = x; then ac_cv_host=$ac_cv_build else ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 $as_echo "$ac_cv_host" >&6; } case $ac_cv_host in *-*-*) ;; *) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;; esac host=$ac_cv_host ac_save_IFS=$IFS; IFS='-' set x $ac_cv_host shift host_cpu=$1 host_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: host_os=$* IFS=$ac_save_IFS case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac # IEEE behaviour is the default on all CPUs except Alpha and SH # (according to the test results of Bruno Haible's ieeefp/fenv_default.m4 # and the GCC 4.1.2 manual). case "$host_cpu" in alpha*) # On Alpha systems, a compiler option provides the behaviour. # See the ieee(3) manual page, also available at # if test -n "$GCC"; then # GCC has the option -mieee. # For full IEEE compliance (rarely needed), use option -mieee-with-inexact. CPPFLAGS="$CPPFLAGS -mieee" else # Compaq (ex-DEC) C has the option -ieee, equivalent to -ieee_with_no_inexact. # For full IEEE compliance (rarely needed), use option -ieee_with_inexact. CPPFLAGS="$CPPFLAGS -ieee" fi ;; sh*) if test -n "$GCC"; then # GCC has the option -mieee. CPPFLAGS="$CPPFLAGS -mieee" fi ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _LARGEFILE_SOURCE value needed for large files" >&5 $as_echo_n "checking for _LARGEFILE_SOURCE value needed for large files... " >&6; } if ${ac_cv_sys_largefile_source+:} false; then : $as_echo_n "(cached) " >&6 else while :; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include /* for off_t */ #include int main () { int (*fp) (FILE *, off_t, int) = fseeko; return fseeko (stdin, 0, 0) && fp (stdin, 0, 0); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_sys_largefile_source=no; break fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define _LARGEFILE_SOURCE 1 #include /* for off_t */ #include int main () { int (*fp) (FILE *, off_t, int) = fseeko; return fseeko (stdin, 0, 0) && fp (stdin, 0, 0); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_sys_largefile_source=1; break fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext ac_cv_sys_largefile_source=unknown break done fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_largefile_source" >&5 $as_echo "$ac_cv_sys_largefile_source" >&6; } case $ac_cv_sys_largefile_source in #( no | unknown) ;; *) cat >>confdefs.h <<_ACEOF #define _LARGEFILE_SOURCE $ac_cv_sys_largefile_source _ACEOF ;; esac rm -rf conftest* # We used to try defining _XOPEN_SOURCE=500 too, to work around a bug # in glibc 2.1.3, but that breaks too many other things. # If you want fseeko and ftello with glibc, upgrade to a fixed glibc. if test $ac_cv_sys_largefile_source != unknown; then $as_echo "#define HAVE_FSEEKO 1" >>confdefs.h fi case "$host_os" in hpux*) $as_echo "#define _LARGEFILE_SOURCE 1" >>confdefs.h ;; esac # Check whether --enable-largefile was given. if test "${enable_largefile+set}" = set; then : enableval=$enable_largefile; fi if test "$enable_largefile" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for special C compiler options needed for large files" >&5 $as_echo_n "checking for special C compiler options needed for large files... " >&6; } if ${ac_cv_sys_largefile_CC+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_sys_largefile_CC=no if test "$GCC" != yes; then ac_save_CC=$CC while :; do # IRIX 6.2 and later do not support large files by default, # so use the C compiler's -n32 option if that helps. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include /* Check that off_t can represent 2**63 - 1 correctly. We can't simply define LARGE_OFF_T to be 9223372036854775807, since some C++ compilers masquerading as C compilers incorrectly reject 9223372036854775807. */ #define LARGE_OFF_T (((off_t) 1 << 31 << 31) - 1 + ((off_t) 1 << 31 << 31)) int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 && LARGE_OFF_T % 2147483647 == 1) ? 1 : -1]; int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : break fi rm -f core conftest.err conftest.$ac_objext CC="$CC -n32" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_sys_largefile_CC=' -n32'; break fi rm -f core conftest.err conftest.$ac_objext break done CC=$ac_save_CC rm -f conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_largefile_CC" >&5 $as_echo "$ac_cv_sys_largefile_CC" >&6; } if test "$ac_cv_sys_largefile_CC" != no; then CC=$CC$ac_cv_sys_largefile_CC fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _FILE_OFFSET_BITS value needed for large files" >&5 $as_echo_n "checking for _FILE_OFFSET_BITS value needed for large files... " >&6; } if ${ac_cv_sys_file_offset_bits+:} false; then : $as_echo_n "(cached) " >&6 else while :; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include /* Check that off_t can represent 2**63 - 1 correctly. We can't simply define LARGE_OFF_T to be 9223372036854775807, since some C++ compilers masquerading as C compilers incorrectly reject 9223372036854775807. */ #define LARGE_OFF_T (((off_t) 1 << 31 << 31) - 1 + ((off_t) 1 << 31 << 31)) int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 && LARGE_OFF_T % 2147483647 == 1) ? 1 : -1]; int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_sys_file_offset_bits=no; break fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define _FILE_OFFSET_BITS 64 #include /* Check that off_t can represent 2**63 - 1 correctly. We can't simply define LARGE_OFF_T to be 9223372036854775807, since some C++ compilers masquerading as C compilers incorrectly reject 9223372036854775807. */ #define LARGE_OFF_T (((off_t) 1 << 31 << 31) - 1 + ((off_t) 1 << 31 << 31)) int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 && LARGE_OFF_T % 2147483647 == 1) ? 1 : -1]; int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_sys_file_offset_bits=64; break fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_sys_file_offset_bits=unknown break done fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_file_offset_bits" >&5 $as_echo "$ac_cv_sys_file_offset_bits" >&6; } case $ac_cv_sys_file_offset_bits in #( no | unknown) ;; *) cat >>confdefs.h <<_ACEOF #define _FILE_OFFSET_BITS $ac_cv_sys_file_offset_bits _ACEOF ;; esac rm -rf conftest* if test $ac_cv_sys_file_offset_bits = unknown; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _LARGE_FILES value needed for large files" >&5 $as_echo_n "checking for _LARGE_FILES value needed for large files... " >&6; } if ${ac_cv_sys_large_files+:} false; then : $as_echo_n "(cached) " >&6 else while :; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include /* Check that off_t can represent 2**63 - 1 correctly. We can't simply define LARGE_OFF_T to be 9223372036854775807, since some C++ compilers masquerading as C compilers incorrectly reject 9223372036854775807. */ #define LARGE_OFF_T (((off_t) 1 << 31 << 31) - 1 + ((off_t) 1 << 31 << 31)) int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 && LARGE_OFF_T % 2147483647 == 1) ? 1 : -1]; int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_sys_large_files=no; break fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define _LARGE_FILES 1 #include /* Check that off_t can represent 2**63 - 1 correctly. We can't simply define LARGE_OFF_T to be 9223372036854775807, since some C++ compilers masquerading as C compilers incorrectly reject 9223372036854775807. */ #define LARGE_OFF_T (((off_t) 1 << 31 << 31) - 1 + ((off_t) 1 << 31 << 31)) int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 && LARGE_OFF_T % 2147483647 == 1) ? 1 : -1]; int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_sys_large_files=1; break fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_sys_large_files=unknown break done fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_large_files" >&5 $as_echo "$ac_cv_sys_large_files" >&6; } case $ac_cv_sys_large_files in #( no | unknown) ;; *) cat >>confdefs.h <<_ACEOF #define _LARGE_FILES $ac_cv_sys_large_files _ACEOF ;; esac rm -rf conftest* fi fi # Check whether --enable-threads was given. if test "${enable_threads+set}" = set; then : enableval=$enable_threads; gl_use_threads=$enableval else if test -n "$gl_use_threads_default"; then gl_use_threads="$gl_use_threads_default" else case "$host_os" in osf*) gl_use_threads=no ;; cygwin*) case `uname -r` in 1.[0-5].*) gl_use_threads=no ;; *) gl_use_threads=yes ;; esac ;; mingw*) case "$gl_use_winpthreads_default" in yes) gl_use_threads=posix ;; no) gl_use_threads=windows ;; *) gl_use_threads=yes ;; esac ;; *) gl_use_threads=yes ;; esac fi fi if test "$gl_use_threads" = yes \ || test "$gl_use_threads" = isoc \ || test "$gl_use_threads" = posix \ || test "$gl_use_threads" = isoc+posix; then # For using or : if test -z "$gl_anythreadlib_early_done"; then case "$host_os" in osf*) # On OSF/1, the compiler needs the flag -D_REENTRANT so that it # groks . cc also understands the flag -pthread, but # we don't use it because 1. gcc-2.95 doesn't understand -pthread, # 2. putting a flag into CPPFLAGS that has an effect on the linker # causes the AC_LINK_IFELSE test below to succeed unexpectedly, # leading to wrong values of LIBTHREAD and LTLIBTHREAD. CPPFLAGS="$CPPFLAGS -D_REENTRANT" ;; esac # Some systems optimize for single-threaded programs by default, and # need special flags to disable these optimizations. For example, the # definition of 'errno' in . case "$host_os" in aix* | freebsd*) CPPFLAGS="$CPPFLAGS -D_THREAD_SAFE" ;; solaris*) CPPFLAGS="$CPPFLAGS -D_REENTRANT" ;; esac gl_anythreadlib_early_done=done fi fi # Pre-early section. # Code from module absolute-header: # Code from module alloca: # Code from module alloca-opt: # Code from module allocator: # Code from module areadlink: # Code from module array-mergesort: # Code from module assert: # Code from module asyncsafe-spin: # Code from module attribute: # Code from module basename-lgpl: # Code from module binary-io: # Code from module btowc: # Code from module builtin-expect: # Code from module byteswap: # Code from module c-ctype: # Code from module c-snprintf: # Code from module c-strcase: # Code from module c-strcasestr: # Code from module c-strtod: # Code from module c-vasnprintf: # Code from module c-vasprintf: # Code from module c-xvasprintf: # Code from module c99: # Code from module canonicalize-lgpl: # Code from module careadlinkat: # Code from module chdir: # Code from module clean-temp: # Code from module clock-time: # Code from module cloexec: # Code from module close: # Code from module configmake: # Code from module count-leading-zeros: # Code from module count-one-bits: # Code from module crc: # Code from module crypto/md4: # Code from module crypto/rijndael: # Code from module dirname: # Code from module dirname-lgpl: # Code from module double-slash-root: # Code from module dtoastr: # Code from module dtotimespec: # Code from module dup2: # Code from module environ: # Code from module errno: # Code from module error: # Code from module exitfail: # Code from module explicit_bzero: # Code from module extensions: # Code from module extern-inline: # Code from module fatal-signal: # Code from module fcntl: # Code from module fcntl-h: # Code from module fd-hook: # Code from module filename: # Code from module flexmember: # Code from module float: # Code from module floor: # Code from module fopen: # Code from module fopen-gnu: # Code from module fpieee: # Code from module fprintf-posix: # Code from module fpucw: # Code from module frexp-nolibm: # Code from module frexpl-nolibm: # Code from module fseek: # Code from module fseeko: # Code from module fseterr: # Code from module fstat: # Code from module ftell: # Code from module ftello: # Code from module full-read: # Code from module full-write: # Code from module fwriteerror: # Code from module getdelim: # Code from module getdtablesize: # Code from module getline: # Code from module getopt-gnu: # Code from module getopt-posix: # Code from module getpass: # Code from module getprogname: # Code from module getrandom: # Code from module gettext-h: # Code from module gettime: # Code from module gettimeofday: # Code from module gitlog-to-changelog: # Code from module gperf: # Code from module hard-locale: # Code from module include_next: # Code from module inline: # Code from module intprops: # Code from module inttostr: # Code from module inttypes-incomplete: # Code from module isfinite: # Code from module isinf: # Code from module isnan: # Code from module isnand: # Code from module isnand-nolibm: # Code from module isnanf: # Code from module isnanf-nolibm: # Code from module isnanl: # Code from module isnanl-nolibm: # Code from module iswblank: # Code from module iswdigit: # Code from module iswxdigit: # Code from module langinfo: # Code from module largefile: # Code from module libc-config: # Code from module limits-h: # Code from module linked-list: # Code from module linkedhash-list: # Code from module list: # Code from module localcharset: # Code from module locale: # Code from module localeconv: # Code from module localename: # Code from module lock: # Code from module lseek: # Code from module lstat: # Code from module malloc-posix: # Code from module malloca: # Code from module math: # Code from module mbchar: # Code from module mbiter: # Code from module mbrtowc: # Code from module mbsinit: # Code from module mbtowc: # Code from module memcasecmp: # Code from module memchr: # Code from module memchr2: # Code from module memmem: # Code from module memmem-simple: # Code from module mempcpy: # Code from module memrchr: # Code from module minmax: # Code from module mkdir: # Code from module mkdtemp: # Code from module mkstemp: # Code from module mktime: # Code from module mktime-internal: # Code from module msvc-inval: # Code from module msvc-nothrow: # Code from module multiarch: # Code from module nl_langinfo: # Code from module nocrash: # Code from module nstrftime: # Code from module open: # Code from module pathmax: # Code from module pipe2: # Code from module printf-frexp: # Code from module printf-frexpl: # Code from module printf-posix: # Code from module printf-safe: # Code from module progname: # Code from module raise: # Code from module rawmemchr: # Code from module read: # Code from module read-file: # Code from module readlink: # Code from module realloc-posix: # Code from module regex: # Code from module relocatable-prog: # Code from module relocatable-prog-wrapper: # Code from module rename: # Code from module rmdir: # Code from module round: # Code from module safe-read: # Code from module safe-write: # Code from module same-inode: # Code from module secure_getenv: # Code from module select: # Code from module setenv: # Code from module setlocale-null: # Code from module sigaction: # Code from module signal-h: # Code from module signbit: # Code from module sigprocmask: # Code from module size_max: # Code from module snippet/_Noreturn: # Code from module snippet/arg-nonnull: # Code from module snippet/c++defs: # Code from module snippet/unused-parameter: # Code from module snippet/warn-on-use: # Code from module snprintf: # Code from module snprintf-posix: # Code from module socketlib: # Code from module sockets: # Code from module socklen: # Code from module sprintf-posix: # Code from module ssize_t: # Code from module stat: # Code from module stat-time: # Code from module std-gnu11: # Code from module stdalign: # Code from module stdarg: # Code from module stdbool: # Code from module stddef: # Code from module stdint: # Code from module stdio: # Code from module stdlib: # Code from module stpcpy: # Code from module strcase: # Code from module strcasestr: # Code from module strcasestr-simple: # Code from module strdup-posix: # Code from module streq: # Code from module strerror: # Code from module strerror-override: # Code from module string: # Code from module strings: # Code from module strncat: # Code from module strndup: # Code from module strnlen: # Code from module strsep: # Code from module strtod: # Code from module strtok_r: # Code from module sys_random: # Code from module sys_select: # Code from module sys_socket: # Code from module sys_stat: # Code from module sys_time: # Code from module sys_types: # Code from module sys_uio: # Code from module tempname: # Code from module termios: # Code from module thread-optim: # Code from module threadlib: # Code from module time: # Code from module time_r: # Code from module time_rz: # Code from module timegm: # Code from module timespec: # Code from module timespec-add: # Code from module timespec-sub: # Code from module tmpdir: # Code from module trunc: # Code from module tzset: # Code from module unicase/base: # Code from module unicase/cased: # Code from module unicase/empty-prefix-context: # Code from module unicase/empty-suffix-context: # Code from module unicase/ignorable: # Code from module unicase/special-casing: # Code from module unicase/tocasefold: # Code from module unicase/tolower: # Code from module unicase/totitle: # Code from module unicase/toupper: # Code from module unicase/u8-casecmp: # Code from module unicase/u8-casefold: # Code from module unicase/u8-casemap: # Code from module unicase/u8-ct-casefold: # Code from module unicase/u8-ct-totitle: # Code from module unicase/u8-tolower: # Code from module unicase/u8-totitle: # Code from module unicase/u8-toupper: # Code from module unictype/base: # Code from module unictype/category-none: # Code from module unictype/category-of: # Code from module unictype/combining-class: # Code from module unictype/ctype-print: # Code from module unictype/property-soft-dotted: # Code from module unigbrk/base: # Code from module unigbrk/uc-gbrk-prop: # Code from module unigbrk/uc-is-grapheme-break: # Code from module unilbrk/base: # Code from module unilbrk/tables: # Code from module unilbrk/u8-possible-linebreaks: # Code from module uninorm/base: # Code from module uninorm/canonical-decomposition: # Code from module uninorm/compat-decomposition: # Code from module uninorm/decompose-internal: # Code from module uninorm/decomposing-form: # Code from module uninorm/decomposition: # Code from module uninorm/decomposition-table: # Code from module uninorm/nfd: # Code from module uninorm/nfkd: # Code from module uninorm/u8-normalize: # Code from module unistd: # Code from module unistr/base: # Code from module unistr/u8-check: # Code from module unistr/u8-cmp: # Code from module unistr/u8-cmp2: # Code from module unistr/u8-cpy: # Code from module unistr/u8-mblen: # Code from module unistr/u8-mbtouc: # Code from module unistr/u8-mbtouc-unsafe: # Code from module unistr/u8-mbtoucr: # Code from module unistr/u8-strlen: # Code from module unistr/u8-strmbtouc: # Code from module unistr/u8-strncat: # Code from module unistr/u8-uctomb: # Code from module unitypes: # Code from module uniwbrk/base: # Code from module uniwbrk/table: # Code from module uniwbrk/u8-wordbreaks: # Code from module uniwbrk/wordbreak-property: # Code from module uniwidth/base: # Code from module uniwidth/u8-strwidth: # Code from module uniwidth/u8-width: # Code from module uniwidth/width: # Code from module unlocked-io: # Code from module unsetenv: # Code from module vasnprintf: # Code from module vasprintf: # Code from module vasprintf-posix: # Code from module verify: # Code from module version-etc: # Code from module version-etc-fsf: # Code from module vfprintf-posix: # Code from module vprintf-posix: # Code from module vsnprintf: # Code from module vsnprintf-posix: # Code from module vsprintf-posix: # Code from module wchar: # Code from module wcrtomb: # Code from module wctype-h: # Code from module wcwidth: # Code from module windows-mutex: # Code from module windows-once: # Code from module windows-recmutex: # Code from module windows-rwlock: # Code from module windows-spin: # Code from module write: # Code from module xalloc: # Code from module xalloc-die: # Code from module xalloc-oversized: # Code from module xbinary-io: # Code from module xlist: # Code from module xmalloca: # Code from module xmemdup0: # Code from module xreadlink: # Code from module xsize: # Code from module xstrndup: # Code from module xvasprintf: enable_win32_dll=yes case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-cegcc*) if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}as", so it can be a program name with args. set dummy ${ac_tool_prefix}as; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AS+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AS"; then ac_cv_prog_AS="$AS" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AS="${ac_tool_prefix}as" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AS=$ac_cv_prog_AS if test -n "$AS"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AS" >&5 $as_echo "$AS" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_AS"; then ac_ct_AS=$AS # Extract the first word of "as", so it can be a program name with args. set dummy as; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_AS+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_AS"; then ac_cv_prog_ac_ct_AS="$ac_ct_AS" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_AS="as" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_AS=$ac_cv_prog_ac_ct_AS if test -n "$ac_ct_AS"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AS" >&5 $as_echo "$ac_ct_AS" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_AS" = x; then AS="false" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac AS=$ac_ct_AS fi else AS="$ac_cv_prog_AS" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args. set dummy ${ac_tool_prefix}dlltool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_DLLTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$DLLTOOL"; then ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi DLLTOOL=$ac_cv_prog_DLLTOOL if test -n "$DLLTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5 $as_echo "$DLLTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_DLLTOOL"; then ac_ct_DLLTOOL=$DLLTOOL # Extract the first word of "dlltool", so it can be a program name with args. set dummy dlltool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_DLLTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_DLLTOOL"; then ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_DLLTOOL="dlltool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL if test -n "$ac_ct_DLLTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5 $as_echo "$ac_ct_DLLTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_DLLTOOL" = x; then DLLTOOL="false" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac DLLTOOL=$ac_ct_DLLTOOL fi else DLLTOOL="$ac_cv_prog_DLLTOOL" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args. set dummy ${ac_tool_prefix}objdump; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_OBJDUMP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$OBJDUMP"; then ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi OBJDUMP=$ac_cv_prog_OBJDUMP if test -n "$OBJDUMP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5 $as_echo "$OBJDUMP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_OBJDUMP"; then ac_ct_OBJDUMP=$OBJDUMP # Extract the first word of "objdump", so it can be a program name with args. set dummy objdump; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_OBJDUMP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_OBJDUMP"; then ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_OBJDUMP="objdump" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP if test -n "$ac_ct_OBJDUMP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5 $as_echo "$ac_ct_OBJDUMP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_OBJDUMP" = x; then OBJDUMP="false" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac OBJDUMP=$ac_ct_OBJDUMP fi else OBJDUMP="$ac_cv_prog_OBJDUMP" fi ;; esac test -z "$AS" && AS=as test -z "$DLLTOOL" && DLLTOOL=dlltool test -z "$OBJDUMP" && OBJDUMP=objdump enable_dlopen=yes case `pwd` in *\ * | *\ *) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5 $as_echo "$as_me: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&2;} ;; esac macro_version='2.4.6' macro_revision='2.4.6' ltmain=$ac_aux_dir/ltmain.sh # Backslashify metacharacters that are still active within # double-quoted strings. sed_quote_subst='s/\(["`$\\]\)/\\\1/g' # Same as above, but do not quote variable references. double_quote_subst='s/\(["`\\]\)/\\\1/g' # Sed substitution to delay expansion of an escaped shell variable in a # double_quote_subst'ed string. delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' # Sed substitution to delay expansion of an escaped single quote. delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' # Sed substitution to avoid accidental globbing in evaled expressions no_glob_subst='s/\*/\\\*/g' ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to print strings" >&5 $as_echo_n "checking how to print strings... " >&6; } # Test print first, because it will be a builtin if present. if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then ECHO='print -r --' elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then ECHO='printf %s\n' else # Use this function as a fallback that always works. func_fallback_echo () { eval 'cat <<_LTECHO_EOF $1 _LTECHO_EOF' } ECHO='func_fallback_echo' fi # func_echo_all arg... # Invoke $ECHO with all args, space-separated. func_echo_all () { $ECHO "" } case $ECHO in printf*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: printf" >&5 $as_echo "printf" >&6; } ;; print*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: print -r" >&5 $as_echo "print -r" >&6; } ;; *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: cat" >&5 $as_echo "cat" >&6; } ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5 $as_echo_n "checking for a sed that does not truncate output... " >&6; } if ${ac_cv_path_SED+:} false; then : $as_echo_n "(cached) " >&6 else ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ for ac_i in 1 2 3 4 5 6 7; do ac_script="$ac_script$as_nl$ac_script" done echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed { ac_script=; unset ac_script;} if test -z "$SED"; then ac_path_SED_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in sed gsed; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_SED="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_SED" || continue # Check for GNU ac_path_SED and select it if it is found. # Check for GNU $ac_path_SED case `"$ac_path_SED" --version 2>&1` in *GNU*) ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo '' >> "conftest.nl" "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_SED_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_SED="$ac_path_SED" ac_path_SED_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_SED_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_SED"; then as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5 fi else ac_cv_path_SED=$SED fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5 $as_echo "$ac_cv_path_SED" >&6; } SED="$ac_cv_path_SED" rm -f conftest.sed test -z "$SED" && SED=sed Xsed="$SED -e 1s/^X//" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for fgrep" >&5 $as_echo_n "checking for fgrep... " >&6; } if ${ac_cv_path_FGREP+:} false; then : $as_echo_n "(cached) " >&6 else if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1 then ac_cv_path_FGREP="$GREP -F" else if test -z "$FGREP"; then ac_path_FGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in fgrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_FGREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_FGREP" || continue # Check for GNU ac_path_FGREP and select it if it is found. # Check for GNU $ac_path_FGREP case `"$ac_path_FGREP" --version 2>&1` in *GNU*) ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'FGREP' >> "conftest.nl" "$ac_path_FGREP" FGREP < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_FGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_FGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_FGREP"; then as_fn_error $? "no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_FGREP=$FGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_FGREP" >&5 $as_echo "$ac_cv_path_FGREP" >&6; } FGREP="$ac_cv_path_FGREP" test -z "$GREP" && GREP=grep # Check whether --with-gnu-ld was given. if test "${with_gnu_ld+set}" = set; then : withval=$with_gnu_ld; test no = "$withval" || with_gnu_ld=yes else with_gnu_ld=no fi ac_prog=ld if test yes = "$GCC"; then # Check if gcc -print-prog-name=ld gives a path. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 $as_echo_n "checking for ld used by $CC... " >&6; } case $host in *-*-mingw*) # gcc leaves a trailing carriage return, which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; esac case $ac_prog in # Accept absolute paths. [\\/]* | ?:[\\/]*) re_direlt='/[^/][^/]*/\.\./' # Canonicalize the pathname of ld ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` done test -z "$LD" && LD=$ac_prog ;; "") # If it fails, then pretend we aren't using GCC. ac_prog=ld ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac elif test yes = "$with_gnu_ld"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 $as_echo_n "checking for GNU ld... " >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 $as_echo_n "checking for non-GNU ld... " >&6; } fi if ${lt_cv_path_LD+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$LD"; then lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS=$lt_save_ifs test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then lt_cv_path_LD=$ac_dir/$ac_prog # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some variants of GNU ld only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$lt_cv_path_LD" -v 2>&1 &5 $as_echo "$LD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 $as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } if ${lt_cv_prog_gnu_ld+:} false; then : $as_echo_n "(cached) " >&6 else # I'd rather use --version here, but apparently some GNU lds only accept -v. case `$LD -v 2>&1 &5 $as_echo "$lt_cv_prog_gnu_ld" >&6; } with_gnu_ld=$lt_cv_prog_gnu_ld { $as_echo "$as_me:${as_lineno-$LINENO}: checking for BSD- or MS-compatible name lister (nm)" >&5 $as_echo_n "checking for BSD- or MS-compatible name lister (nm)... " >&6; } if ${lt_cv_path_NM+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$NM"; then # Let the user override the test. lt_cv_path_NM=$NM else lt_nm_to_check=${ac_tool_prefix}nm if test -n "$ac_tool_prefix" && test "$build" = "$host"; then lt_nm_to_check="$lt_nm_to_check nm" fi for lt_tmp_nm in $lt_nm_to_check; do lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do IFS=$lt_save_ifs test -z "$ac_dir" && ac_dir=. tmp_nm=$ac_dir/$lt_tmp_nm if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext"; then # Check to see if the nm accepts a BSD-compat flag. # Adding the 'sed 1q' prevents false positives on HP-UX, which says: # nm: unknown option "B" ignored # Tru64's nm complains that /dev/null is an invalid object file # MSYS converts /dev/null to NUL, MinGW nm treats NUL as empty case $build_os in mingw*) lt_bad_file=conftest.nm/nofile ;; *) lt_bad_file=/dev/null ;; esac case `"$tmp_nm" -B $lt_bad_file 2>&1 | sed '1q'` in *$lt_bad_file* | *'Invalid file or object type'*) lt_cv_path_NM="$tmp_nm -B" break 2 ;; *) case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in */dev/null*) lt_cv_path_NM="$tmp_nm -p" break 2 ;; *) lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but continue # so that we can try to find one that supports BSD flags ;; esac ;; esac fi done IFS=$lt_save_ifs done : ${lt_cv_path_NM=no} fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5 $as_echo "$lt_cv_path_NM" >&6; } if test no != "$lt_cv_path_NM"; then NM=$lt_cv_path_NM else # Didn't find any BSD compatible name lister, look for dumpbin. if test -n "$DUMPBIN"; then : # Let the user override the test. else if test -n "$ac_tool_prefix"; then for ac_prog in dumpbin "link -dump" do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_DUMPBIN+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$DUMPBIN"; then ac_cv_prog_DUMPBIN="$DUMPBIN" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_DUMPBIN="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi DUMPBIN=$ac_cv_prog_DUMPBIN if test -n "$DUMPBIN"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DUMPBIN" >&5 $as_echo "$DUMPBIN" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$DUMPBIN" && break done fi if test -z "$DUMPBIN"; then ac_ct_DUMPBIN=$DUMPBIN for ac_prog in dumpbin "link -dump" do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_DUMPBIN+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_DUMPBIN"; then ac_cv_prog_ac_ct_DUMPBIN="$ac_ct_DUMPBIN" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_DUMPBIN="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_DUMPBIN=$ac_cv_prog_ac_ct_DUMPBIN if test -n "$ac_ct_DUMPBIN"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DUMPBIN" >&5 $as_echo "$ac_ct_DUMPBIN" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_DUMPBIN" && break done if test "x$ac_ct_DUMPBIN" = x; then DUMPBIN=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac DUMPBIN=$ac_ct_DUMPBIN fi fi case `$DUMPBIN -symbols -headers /dev/null 2>&1 | sed '1q'` in *COFF*) DUMPBIN="$DUMPBIN -symbols -headers" ;; *) DUMPBIN=: ;; esac fi if test : != "$DUMPBIN"; then NM=$DUMPBIN fi fi test -z "$NM" && NM=nm { $as_echo "$as_me:${as_lineno-$LINENO}: checking the name lister ($NM) interface" >&5 $as_echo_n "checking the name lister ($NM) interface... " >&6; } if ${lt_cv_nm_interface+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_nm_interface="BSD nm" echo "int some_variable = 0;" > conftest.$ac_ext (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&5) (eval "$ac_compile" 2>conftest.err) cat conftest.err >&5 (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&5) (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) cat conftest.err >&5 (eval echo "\"\$as_me:$LINENO: output\"" >&5) cat conftest.out >&5 if $GREP 'External.*some_variable' conftest.out > /dev/null; then lt_cv_nm_interface="MS dumpbin" fi rm -f conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_nm_interface" >&5 $as_echo "$lt_cv_nm_interface" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5 $as_echo_n "checking whether ln -s works... " >&6; } LN_S=$as_ln_s if test "$LN_S" = "ln -s"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5 $as_echo "no, using $LN_S" >&6; } fi # find the maximum length of command line arguments { $as_echo "$as_me:${as_lineno-$LINENO}: checking the maximum length of command line arguments" >&5 $as_echo_n "checking the maximum length of command line arguments... " >&6; } if ${lt_cv_sys_max_cmd_len+:} false; then : $as_echo_n "(cached) " >&6 else i=0 teststring=ABCD case $build_os in msdosdjgpp*) # On DJGPP, this test can blow up pretty badly due to problems in libc # (any single argument exceeding 2000 bytes causes a buffer overrun # during glob expansion). Even if it were fixed, the result of this # check would be larger than it should be. lt_cv_sys_max_cmd_len=12288; # 12K is about right ;; gnu*) # Under GNU Hurd, this test is not required because there is # no limit to the length of command line arguments. # Libtool will interpret -1 as no limit whatsoever lt_cv_sys_max_cmd_len=-1; ;; cygwin* | mingw* | cegcc*) # On Win9x/ME, this test blows up -- it succeeds, but takes # about 5 minutes as the teststring grows exponentially. # Worse, since 9x/ME are not pre-emptively multitasking, # you end up with a "frozen" computer, even though with patience # the test eventually succeeds (with a max line length of 256k). # Instead, let's just punt: use the minimum linelength reported by # all of the supported platforms: 8192 (on NT/2K/XP). lt_cv_sys_max_cmd_len=8192; ;; mint*) # On MiNT this can take a long time and run out of memory. lt_cv_sys_max_cmd_len=8192; ;; amigaos*) # On AmigaOS with pdksh, this test takes hours, literally. # So we just punt and use a minimum line length of 8192. lt_cv_sys_max_cmd_len=8192; ;; bitrig* | darwin* | dragonfly* | freebsd* | netbsd* | openbsd*) # This has been around since 386BSD, at least. Likely further. if test -x /sbin/sysctl; then lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` elif test -x /usr/sbin/sysctl; then lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` else lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs fi # And add a safety zone lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` ;; interix*) # We know the value 262144 and hardcode it with a safety zone (like BSD) lt_cv_sys_max_cmd_len=196608 ;; os2*) # The test takes a long time on OS/2. lt_cv_sys_max_cmd_len=8192 ;; osf*) # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not # nice to cause kernel panics so lets avoid the loop below. # First set a reasonable default. lt_cv_sys_max_cmd_len=16384 # if test -x /sbin/sysconfig; then case `/sbin/sysconfig -q proc exec_disable_arg_limit` in *1*) lt_cv_sys_max_cmd_len=-1 ;; esac fi ;; sco3.2v5*) lt_cv_sys_max_cmd_len=102400 ;; sysv5* | sco5v6* | sysv4.2uw2*) kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` if test -n "$kargmax"; then lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[ ]//'` else lt_cv_sys_max_cmd_len=32768 fi ;; *) lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` if test -n "$lt_cv_sys_max_cmd_len" && \ test undefined != "$lt_cv_sys_max_cmd_len"; then lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` else # Make teststring a little bigger before we do anything with it. # a 1K string should be a reasonable start. for i in 1 2 3 4 5 6 7 8; do teststring=$teststring$teststring done SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} # If test is not a shell built-in, we'll probably end up computing a # maximum length that is only half of the actual maximum length, but # we can't tell. while { test X`env echo "$teststring$teststring" 2>/dev/null` \ = "X$teststring$teststring"; } >/dev/null 2>&1 && test 17 != "$i" # 1/2 MB should be enough do i=`expr $i + 1` teststring=$teststring$teststring done # Only check the string length outside the loop. lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` teststring= # Add a significant safety factor because C++ compilers can tack on # massive amounts of additional arguments before passing them to the # linker. It appears as though 1/2 is a usable value. lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` fi ;; esac fi if test -n "$lt_cv_sys_max_cmd_len"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_max_cmd_len" >&5 $as_echo "$lt_cv_sys_max_cmd_len" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5 $as_echo "none" >&6; } fi max_cmd_len=$lt_cv_sys_max_cmd_len : ${CP="cp -f"} : ${MV="mv -f"} : ${RM="rm -f"} if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then lt_unset=unset else lt_unset=false fi # test EBCDIC or ASCII case `echo X|tr X '\101'` in A) # ASCII based system # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr lt_SP2NL='tr \040 \012' lt_NL2SP='tr \015\012 \040\040' ;; *) # EBCDIC based system lt_SP2NL='tr \100 \n' lt_NL2SP='tr \r\n \100\100' ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to $host format" >&5 $as_echo_n "checking how to convert $build file names to $host format... " >&6; } if ${lt_cv_to_host_file_cmd+:} false; then : $as_echo_n "(cached) " >&6 else case $host in *-*-mingw* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32 ;; *-*-cygwin* ) lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32 ;; * ) # otherwise, assume *nix lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32 ;; esac ;; *-*-cygwin* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin ;; *-*-cygwin* ) lt_cv_to_host_file_cmd=func_convert_file_noop ;; * ) # otherwise, assume *nix lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin ;; esac ;; * ) # unhandled hosts (and "normal" native builds) lt_cv_to_host_file_cmd=func_convert_file_noop ;; esac fi to_host_file_cmd=$lt_cv_to_host_file_cmd { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_host_file_cmd" >&5 $as_echo "$lt_cv_to_host_file_cmd" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to toolchain format" >&5 $as_echo_n "checking how to convert $build file names to toolchain format... " >&6; } if ${lt_cv_to_tool_file_cmd+:} false; then : $as_echo_n "(cached) " >&6 else #assume ordinary cross tools, or native build. lt_cv_to_tool_file_cmd=func_convert_file_noop case $host in *-*-mingw* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32 ;; esac ;; esac fi to_tool_file_cmd=$lt_cv_to_tool_file_cmd { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_tool_file_cmd" >&5 $as_echo "$lt_cv_to_tool_file_cmd" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $LD option to reload object files" >&5 $as_echo_n "checking for $LD option to reload object files... " >&6; } if ${lt_cv_ld_reload_flag+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_ld_reload_flag='-r' fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_reload_flag" >&5 $as_echo "$lt_cv_ld_reload_flag" >&6; } reload_flag=$lt_cv_ld_reload_flag case $reload_flag in "" | " "*) ;; *) reload_flag=" $reload_flag" ;; esac reload_cmds='$LD$reload_flag -o $output$reload_objs' case $host_os in cygwin* | mingw* | pw32* | cegcc*) if test yes != "$GCC"; then reload_cmds=false fi ;; darwin*) if test yes = "$GCC"; then reload_cmds='$LTCC $LTCFLAGS -nostdlib $wl-r -o $output$reload_objs' else reload_cmds='$LD$reload_flag -o $output$reload_objs' fi ;; esac if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args. set dummy ${ac_tool_prefix}objdump; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_OBJDUMP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$OBJDUMP"; then ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi OBJDUMP=$ac_cv_prog_OBJDUMP if test -n "$OBJDUMP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5 $as_echo "$OBJDUMP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_OBJDUMP"; then ac_ct_OBJDUMP=$OBJDUMP # Extract the first word of "objdump", so it can be a program name with args. set dummy objdump; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_OBJDUMP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_OBJDUMP"; then ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_OBJDUMP="objdump" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP if test -n "$ac_ct_OBJDUMP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5 $as_echo "$ac_ct_OBJDUMP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_OBJDUMP" = x; then OBJDUMP="false" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac OBJDUMP=$ac_ct_OBJDUMP fi else OBJDUMP="$ac_cv_prog_OBJDUMP" fi test -z "$OBJDUMP" && OBJDUMP=objdump { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to recognize dependent libraries" >&5 $as_echo_n "checking how to recognize dependent libraries... " >&6; } if ${lt_cv_deplibs_check_method+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_file_magic_cmd='$MAGIC_CMD' lt_cv_file_magic_test_file= lt_cv_deplibs_check_method='unknown' # Need to set the preceding variable on all platforms that support # interlibrary dependencies. # 'none' -- dependencies not supported. # 'unknown' -- same as none, but documents that we really don't know. # 'pass_all' -- all dependencies passed with no checks. # 'test_compile' -- check by making test program. # 'file_magic [[regex]]' -- check by looking for files in library path # that responds to the $file_magic_cmd with a given extended regex. # If you have 'file' or equivalent on your system and you're not sure # whether 'pass_all' will *always* work, you probably want this one. case $host_os in aix[4-9]*) lt_cv_deplibs_check_method=pass_all ;; beos*) lt_cv_deplibs_check_method=pass_all ;; bsdi[45]*) lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)' lt_cv_file_magic_cmd='/usr/bin/file -L' lt_cv_file_magic_test_file=/shlib/libc.so ;; cygwin*) # func_win32_libid is a shell function defined in ltmain.sh lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' lt_cv_file_magic_cmd='func_win32_libid' ;; mingw* | pw32*) # Base MSYS/MinGW do not provide the 'file' command needed by # func_win32_libid shell function, so use a weaker test based on 'objdump', # unless we find 'file', for example because we are cross-compiling. if ( file / ) >/dev/null 2>&1; then lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' lt_cv_file_magic_cmd='func_win32_libid' else # Keep this pattern in sync with the one in func_win32_libid. lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' lt_cv_file_magic_cmd='$OBJDUMP -f' fi ;; cegcc*) # use the weaker test based on 'objdump'. See mingw*. lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' lt_cv_file_magic_cmd='$OBJDUMP -f' ;; darwin* | rhapsody*) lt_cv_deplibs_check_method=pass_all ;; freebsd* | dragonfly*) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then case $host_cpu in i*86 ) # Not sure whether the presence of OpenBSD here was a mistake. # Let's accept both of them until this is cleared up. lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[3-9]86 (compact )?demand paged shared library' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` ;; esac else lt_cv_deplibs_check_method=pass_all fi ;; haiku*) lt_cv_deplibs_check_method=pass_all ;; hpux10.20* | hpux11*) lt_cv_file_magic_cmd=/usr/bin/file case $host_cpu in ia64*) lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64' lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so ;; hppa*64*) lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]' lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl ;; *) lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9]\.[0-9]) shared library' lt_cv_file_magic_test_file=/usr/lib/libc.sl ;; esac ;; interix[3-9]*) # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|\.a)$' ;; irix5* | irix6* | nonstopux*) case $LD in *-32|*"-32 ") libmagic=32-bit;; *-n32|*"-n32 ") libmagic=N32;; *-64|*"-64 ") libmagic=64-bit;; *) libmagic=never-match;; esac lt_cv_deplibs_check_method=pass_all ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) lt_cv_deplibs_check_method=pass_all ;; netbsd* | netbsdelf*-gnu) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|_pic\.a)$' fi ;; newos6*) lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=/usr/lib/libnls.so ;; *nto* | *qnx*) lt_cv_deplibs_check_method=pass_all ;; openbsd* | bitrig*) if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' fi ;; osf3* | osf4* | osf5*) lt_cv_deplibs_check_method=pass_all ;; rdos*) lt_cv_deplibs_check_method=pass_all ;; solaris*) lt_cv_deplibs_check_method=pass_all ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) lt_cv_deplibs_check_method=pass_all ;; sysv4 | sysv4.3*) case $host_vendor in motorola) lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]' lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` ;; ncr) lt_cv_deplibs_check_method=pass_all ;; sequent) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )' ;; sni) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib" lt_cv_file_magic_test_file=/lib/libc.so ;; siemens) lt_cv_deplibs_check_method=pass_all ;; pc) lt_cv_deplibs_check_method=pass_all ;; esac ;; tpf*) lt_cv_deplibs_check_method=pass_all ;; os2*) lt_cv_deplibs_check_method=pass_all ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_deplibs_check_method" >&5 $as_echo "$lt_cv_deplibs_check_method" >&6; } file_magic_glob= want_nocaseglob=no if test "$build" = "$host"; then case $host_os in mingw* | pw32*) if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then want_nocaseglob=yes else file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[\1]\/[\1]\/g;/g"` fi ;; esac fi file_magic_cmd=$lt_cv_file_magic_cmd deplibs_check_method=$lt_cv_deplibs_check_method test -z "$deplibs_check_method" && deplibs_check_method=unknown if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args. set dummy ${ac_tool_prefix}dlltool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_DLLTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$DLLTOOL"; then ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi DLLTOOL=$ac_cv_prog_DLLTOOL if test -n "$DLLTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5 $as_echo "$DLLTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_DLLTOOL"; then ac_ct_DLLTOOL=$DLLTOOL # Extract the first word of "dlltool", so it can be a program name with args. set dummy dlltool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_DLLTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_DLLTOOL"; then ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_DLLTOOL="dlltool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL if test -n "$ac_ct_DLLTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5 $as_echo "$ac_ct_DLLTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_DLLTOOL" = x; then DLLTOOL="false" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac DLLTOOL=$ac_ct_DLLTOOL fi else DLLTOOL="$ac_cv_prog_DLLTOOL" fi test -z "$DLLTOOL" && DLLTOOL=dlltool { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to associate runtime and link libraries" >&5 $as_echo_n "checking how to associate runtime and link libraries... " >&6; } if ${lt_cv_sharedlib_from_linklib_cmd+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_sharedlib_from_linklib_cmd='unknown' case $host_os in cygwin* | mingw* | pw32* | cegcc*) # two different shell functions defined in ltmain.sh; # decide which one to use based on capabilities of $DLLTOOL case `$DLLTOOL --help 2>&1` in *--identify-strict*) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib ;; *) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback ;; esac ;; *) # fallback: assume linklib IS sharedlib lt_cv_sharedlib_from_linklib_cmd=$ECHO ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sharedlib_from_linklib_cmd" >&5 $as_echo "$lt_cv_sharedlib_from_linklib_cmd" >&6; } sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO if test -n "$ac_tool_prefix"; then for ac_prog in ar do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AR+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AR"; then ac_cv_prog_AR="$AR" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AR="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AR=$ac_cv_prog_AR if test -n "$AR"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 $as_echo "$AR" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$AR" && break done fi if test -z "$AR"; then ac_ct_AR=$AR for ac_prog in ar do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_AR+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_AR"; then ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_AR="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_AR=$ac_cv_prog_ac_ct_AR if test -n "$ac_ct_AR"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5 $as_echo "$ac_ct_AR" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_AR" && break done if test "x$ac_ct_AR" = x; then AR="false" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac AR=$ac_ct_AR fi fi : ${AR=ar} : ${AR_FLAGS=cr} { $as_echo "$as_me:${as_lineno-$LINENO}: checking for archiver @FILE support" >&5 $as_echo_n "checking for archiver @FILE support... " >&6; } if ${lt_cv_ar_at_file+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_ar_at_file=no cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : echo conftest.$ac_objext > conftest.lst lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&5' { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 (eval $lt_ar_try) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if test 0 -eq "$ac_status"; then # Ensure the archiver fails upon bogus file names. rm -f conftest.$ac_objext libconftest.a { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 (eval $lt_ar_try) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if test 0 -ne "$ac_status"; then lt_cv_ar_at_file=@ fi fi rm -f conftest.* libconftest.a fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ar_at_file" >&5 $as_echo "$lt_cv_ar_at_file" >&6; } if test no = "$lt_cv_ar_at_file"; then archiver_list_spec= else archiver_list_spec=$lt_cv_ar_at_file fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 $as_echo "$STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_STRIP="strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 $as_echo "$ac_ct_STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_STRIP" = x; then STRIP=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac STRIP=$ac_ct_STRIP fi else STRIP="$ac_cv_prog_STRIP" fi test -z "$STRIP" && STRIP=: if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. set dummy ${ac_tool_prefix}ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$RANLIB"; then ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi RANLIB=$ac_cv_prog_RANLIB if test -n "$RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 $as_echo "$RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_RANLIB"; then ac_ct_RANLIB=$RANLIB # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_RANLIB"; then ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_RANLIB="ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB if test -n "$ac_ct_RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 $as_echo "$ac_ct_RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_RANLIB" = x; then RANLIB=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac RANLIB=$ac_ct_RANLIB fi else RANLIB="$ac_cv_prog_RANLIB" fi test -z "$RANLIB" && RANLIB=: # Determine commands to create old-style static archives. old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' old_postinstall_cmds='chmod 644 $oldlib' old_postuninstall_cmds= if test -n "$RANLIB"; then case $host_os in bitrig* | openbsd*) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib" ;; *) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib" ;; esac old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib" fi case $host_os in darwin*) lock_old_archive_extraction=yes ;; *) lock_old_archive_extraction=no ;; esac # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC # Check for command to grab the raw symbol name followed by C symbol from nm. { $as_echo "$as_me:${as_lineno-$LINENO}: checking command to parse $NM output from $compiler object" >&5 $as_echo_n "checking command to parse $NM output from $compiler object... " >&6; } if ${lt_cv_sys_global_symbol_pipe+:} false; then : $as_echo_n "(cached) " >&6 else # These are sane defaults that work on at least a few old systems. # [They come from Ultrix. What could be older than Ultrix?!! ;)] # Character class describing NM global symbol codes. symcode='[BCDEGRST]' # Regexp to match symbols that can be accessed directly from C. sympat='\([_A-Za-z][_A-Za-z0-9]*\)' # Define system-specific variables. case $host_os in aix*) symcode='[BCDT]' ;; cygwin* | mingw* | pw32* | cegcc*) symcode='[ABCDGISTW]' ;; hpux*) if test ia64 = "$host_cpu"; then symcode='[ABCDEGRST]' fi ;; irix* | nonstopux*) symcode='[BCDEGRST]' ;; osf*) symcode='[BCDEGQRST]' ;; solaris*) symcode='[BDRT]' ;; sco3.2v5*) symcode='[DT]' ;; sysv4.2uw2*) symcode='[DT]' ;; sysv5* | sco5v6* | unixware* | OpenUNIX*) symcode='[ABDT]' ;; sysv4) symcode='[DFNSTU]' ;; esac # If we're using GNU nm, then use its standard symbol codes. case `$NM -V 2>&1` in *GNU* | *'with BFD'*) symcode='[ABCDGIRSTW]' ;; esac if test "$lt_cv_nm_interface" = "MS dumpbin"; then # Gets list of data symbols to import. lt_cv_sys_global_symbol_to_import="sed -n -e 's/^I .* \(.*\)$/\1/p'" # Adjust the below global symbol transforms to fixup imported variables. lt_cdecl_hook=" -e 's/^I .* \(.*\)$/extern __declspec(dllimport) char \1;/p'" lt_c_name_hook=" -e 's/^I .* \(.*\)$/ {\"\1\", (void *) 0},/p'" lt_c_name_lib_hook="\ -e 's/^I .* \(lib.*\)$/ {\"\1\", (void *) 0},/p'\ -e 's/^I .* \(.*\)$/ {\"lib\1\", (void *) 0},/p'" else # Disable hooks by default. lt_cv_sys_global_symbol_to_import= lt_cdecl_hook= lt_c_name_hook= lt_c_name_lib_hook= fi # Transform an extracted symbol line into a proper C declaration. # Some systems (esp. on ia64) link data and code symbols differently, # so use this general approach. lt_cv_sys_global_symbol_to_cdecl="sed -n"\ $lt_cdecl_hook\ " -e 's/^T .* \(.*\)$/extern int \1();/p'"\ " -e 's/^$symcode$symcode* .* \(.*\)$/extern char \1;/p'" # Transform an extracted symbol line into symbol name and symbol address lt_cv_sys_global_symbol_to_c_name_address="sed -n"\ $lt_c_name_hook\ " -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\ " -e 's/^$symcode$symcode* .* \(.*\)$/ {\"\1\", (void *) \&\1},/p'" # Transform an extracted symbol line into symbol name with lib prefix and # symbol address. lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n"\ $lt_c_name_lib_hook\ " -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\ " -e 's/^$symcode$symcode* .* \(lib.*\)$/ {\"\1\", (void *) \&\1},/p'"\ " -e 's/^$symcode$symcode* .* \(.*\)$/ {\"lib\1\", (void *) \&\1},/p'" # Handle CRLF in mingw tool chain opt_cr= case $build_os in mingw*) opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp ;; esac # Try without a prefix underscore, then with it. for ac_symprfx in "" "_"; do # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. symxfrm="\\1 $ac_symprfx\\2 \\2" # Write the raw and C identifiers. if test "$lt_cv_nm_interface" = "MS dumpbin"; then # Fake it for dumpbin and say T for any non-static function, # D for any global variable and I for any imported variable. # Also find C++ and __fastcall symbols from MSVC++, # which start with @ or ?. lt_cv_sys_global_symbol_pipe="$AWK '"\ " {last_section=section; section=\$ 3};"\ " /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\ " /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ " /^ *Symbol name *: /{split(\$ 0,sn,\":\"); si=substr(sn[2],2)};"\ " /^ *Type *: code/{print \"T\",si,substr(si,length(prfx))};"\ " /^ *Type *: data/{print \"I\",si,substr(si,length(prfx))};"\ " \$ 0!~/External *\|/{next};"\ " / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ " {if(hide[section]) next};"\ " {f=\"D\"}; \$ 0~/\(\).*\|/{f=\"T\"};"\ " {split(\$ 0,a,/\||\r/); split(a[2],s)};"\ " s[1]~/^[@?]/{print f,s[1],s[1]; next};"\ " s[1]~prfx {split(s[1],t,\"@\"); print f,t[1],substr(t[1],length(prfx))}"\ " ' prfx=^$ac_symprfx" else lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[ ]\($symcode$symcode*\)[ ][ ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" fi lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'" # Check to see that the pipe works correctly. pipe_works=no rm -f conftest* cat > conftest.$ac_ext <<_LT_EOF #ifdef __cplusplus extern "C" { #endif char nm_test_var; void nm_test_func(void); void nm_test_func(void){} #ifdef __cplusplus } #endif int main(){nm_test_var='a';nm_test_func();return(0);} _LT_EOF if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then # Now try to grab the symbols. nlist=conftest.nm $ECHO "$as_me:$LINENO: $NM conftest.$ac_objext | $lt_cv_sys_global_symbol_pipe > $nlist" >&5 if eval "$NM" conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist 2>&5 && test -s "$nlist"; then # Try sorting and uniquifying the output. if sort "$nlist" | uniq > "$nlist"T; then mv -f "$nlist"T "$nlist" else rm -f "$nlist"T fi # Make sure that we snagged all the symbols we need. if $GREP ' nm_test_var$' "$nlist" >/dev/null; then if $GREP ' nm_test_func$' "$nlist" >/dev/null; then cat <<_LT_EOF > conftest.$ac_ext /* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ #if defined _WIN32 || defined __CYGWIN__ || defined _WIN32_WCE /* DATA imports from DLLs on WIN32 can't be const, because runtime relocations are performed -- see ld's documentation on pseudo-relocs. */ # define LT_DLSYM_CONST #elif defined __osf__ /* This system does not cope well with relocations in const data. */ # define LT_DLSYM_CONST #else # define LT_DLSYM_CONST const #endif #ifdef __cplusplus extern "C" { #endif _LT_EOF # Now generate the symbol file. eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' cat <<_LT_EOF >> conftest.$ac_ext /* The mapping between symbol names and symbols. */ LT_DLSYM_CONST struct { const char *name; void *address; } lt__PROGRAM__LTX_preloaded_symbols[] = { { "@PROGRAM@", (void *) 0 }, _LT_EOF $SED "s/^$symcode$symcode* .* \(.*\)$/ {\"\1\", (void *) \&\1},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext cat <<\_LT_EOF >> conftest.$ac_ext {0, (void *) 0} }; /* This works around a problem in FreeBSD linker */ #ifdef FREEBSD_WORKAROUND static const void *lt_preloaded_setup() { return lt__PROGRAM__LTX_preloaded_symbols; } #endif #ifdef __cplusplus } #endif _LT_EOF # Now try linking the two files. mv conftest.$ac_objext conftstm.$ac_objext lt_globsym_save_LIBS=$LIBS lt_globsym_save_CFLAGS=$CFLAGS LIBS=conftstm.$ac_objext CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag" if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s conftest$ac_exeext; then pipe_works=yes fi LIBS=$lt_globsym_save_LIBS CFLAGS=$lt_globsym_save_CFLAGS else echo "cannot find nm_test_func in $nlist" >&5 fi else echo "cannot find nm_test_var in $nlist" >&5 fi else echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5 fi else echo "$progname: failed program was:" >&5 cat conftest.$ac_ext >&5 fi rm -rf conftest* conftst* # Do not use the global_symbol_pipe unless it works. if test yes = "$pipe_works"; then break else lt_cv_sys_global_symbol_pipe= fi done fi if test -z "$lt_cv_sys_global_symbol_pipe"; then lt_cv_sys_global_symbol_to_cdecl= fi if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: failed" >&5 $as_echo "failed" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5 $as_echo "ok" >&6; } fi # Response file support. if test "$lt_cv_nm_interface" = "MS dumpbin"; then nm_file_list_spec='@' elif $NM --help 2>/dev/null | grep '[@]FILE' >/dev/null; then nm_file_list_spec='@' fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sysroot" >&5 $as_echo_n "checking for sysroot... " >&6; } # Check whether --with-sysroot was given. if test "${with_sysroot+set}" = set; then : withval=$with_sysroot; else with_sysroot=no fi lt_sysroot= case $with_sysroot in #( yes) if test yes = "$GCC"; then lt_sysroot=`$CC --print-sysroot 2>/dev/null` fi ;; #( /*) lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"` ;; #( no|'') ;; #( *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_sysroot" >&5 $as_echo "$with_sysroot" >&6; } as_fn_error $? "The sysroot must be an absolute path." "$LINENO" 5 ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${lt_sysroot:-no}" >&5 $as_echo "${lt_sysroot:-no}" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a working dd" >&5 $as_echo_n "checking for a working dd... " >&6; } if ${ac_cv_path_lt_DD+:} false; then : $as_echo_n "(cached) " >&6 else printf 0123456789abcdef0123456789abcdef >conftest.i cat conftest.i conftest.i >conftest2.i : ${lt_DD:=$DD} if test -z "$lt_DD"; then ac_path_lt_DD_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in dd; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_lt_DD="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_lt_DD" || continue if "$ac_path_lt_DD" bs=32 count=1 conftest.out 2>/dev/null; then cmp -s conftest.i conftest.out \ && ac_cv_path_lt_DD="$ac_path_lt_DD" ac_path_lt_DD_found=: fi $ac_path_lt_DD_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_lt_DD"; then : fi else ac_cv_path_lt_DD=$lt_DD fi rm -f conftest.i conftest2.i conftest.out fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_lt_DD" >&5 $as_echo "$ac_cv_path_lt_DD" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to truncate binary pipes" >&5 $as_echo_n "checking how to truncate binary pipes... " >&6; } if ${lt_cv_truncate_bin+:} false; then : $as_echo_n "(cached) " >&6 else printf 0123456789abcdef0123456789abcdef >conftest.i cat conftest.i conftest.i >conftest2.i lt_cv_truncate_bin= if "$ac_cv_path_lt_DD" bs=32 count=1 conftest.out 2>/dev/null; then cmp -s conftest.i conftest.out \ && lt_cv_truncate_bin="$ac_cv_path_lt_DD bs=4096 count=1" fi rm -f conftest.i conftest2.i conftest.out test -z "$lt_cv_truncate_bin" && lt_cv_truncate_bin="$SED -e 4q" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_truncate_bin" >&5 $as_echo "$lt_cv_truncate_bin" >&6; } # Calculate cc_basename. Skip known compiler wrappers and cross-prefix. func_cc_basename () { for cc_temp in $*""; do case $cc_temp in compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; \-*) ;; *) break;; esac done func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` } # Check whether --enable-libtool-lock was given. if test "${enable_libtool_lock+set}" = set; then : enableval=$enable_libtool_lock; fi test no = "$enable_libtool_lock" || enable_libtool_lock=yes # Some flags need to be propagated to the compiler or linker for good # libtool support. case $host in ia64-*-hpux*) # Find out what ABI is being produced by ac_compile, and set mode # options accordingly. echo 'int i;' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then case `/usr/bin/file conftest.$ac_objext` in *ELF-32*) HPUX_IA64_MODE=32 ;; *ELF-64*) HPUX_IA64_MODE=64 ;; esac fi rm -rf conftest* ;; *-*-irix6*) # Find out what ABI is being produced by ac_compile, and set linker # options accordingly. echo '#line '$LINENO' "configure"' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then if test yes = "$lt_cv_prog_gnu_ld"; then case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -melf32bsmip" ;; *N32*) LD="${LD-ld} -melf32bmipn32" ;; *64-bit*) LD="${LD-ld} -melf64bmip" ;; esac else case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -32" ;; *N32*) LD="${LD-ld} -n32" ;; *64-bit*) LD="${LD-ld} -64" ;; esac fi fi rm -rf conftest* ;; mips64*-*linux*) # Find out what ABI is being produced by ac_compile, and set linker # options accordingly. echo '#line '$LINENO' "configure"' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then emul=elf case `/usr/bin/file conftest.$ac_objext` in *32-bit*) emul="${emul}32" ;; *64-bit*) emul="${emul}64" ;; esac case `/usr/bin/file conftest.$ac_objext` in *MSB*) emul="${emul}btsmip" ;; *LSB*) emul="${emul}ltsmip" ;; esac case `/usr/bin/file conftest.$ac_objext` in *N32*) emul="${emul}n32" ;; esac LD="${LD-ld} -m $emul" fi rm -rf conftest* ;; x86_64-*kfreebsd*-gnu|x86_64-*linux*|powerpc*-*linux*| \ s390*-*linux*|s390*-*tpf*|sparc*-*linux*) # Find out what ABI is being produced by ac_compile, and set linker # options accordingly. Note that the listed cases only cover the # situations where additional linker options are needed (such as when # doing 32-bit compilation for a host where ld defaults to 64-bit, or # vice versa); the common cases where no linker options are needed do # not appear in the list. echo 'int i;' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then case `/usr/bin/file conftest.o` in *32-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_i386_fbsd" ;; x86_64-*linux*) case `/usr/bin/file conftest.o` in *x86-64*) LD="${LD-ld} -m elf32_x86_64" ;; *) LD="${LD-ld} -m elf_i386" ;; esac ;; powerpc64le-*linux*) LD="${LD-ld} -m elf32lppclinux" ;; powerpc64-*linux*) LD="${LD-ld} -m elf32ppclinux" ;; s390x-*linux*) LD="${LD-ld} -m elf_s390" ;; sparc64-*linux*) LD="${LD-ld} -m elf32_sparc" ;; esac ;; *64-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_x86_64_fbsd" ;; x86_64-*linux*) LD="${LD-ld} -m elf_x86_64" ;; powerpcle-*linux*) LD="${LD-ld} -m elf64lppc" ;; powerpc-*linux*) LD="${LD-ld} -m elf64ppc" ;; s390*-*linux*|s390*-*tpf*) LD="${LD-ld} -m elf64_s390" ;; sparc*-*linux*) LD="${LD-ld} -m elf64_sparc" ;; esac ;; esac fi rm -rf conftest* ;; *-*-sco3.2v5*) # On SCO OpenServer 5, we need -belf to get full-featured binaries. SAVE_CFLAGS=$CFLAGS CFLAGS="$CFLAGS -belf" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf" >&5 $as_echo_n "checking whether the C compiler needs -belf... " >&6; } if ${lt_cv_cc_needs_belf+:} false; then : $as_echo_n "(cached) " >&6 else ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_cv_cc_needs_belf=yes else lt_cv_cc_needs_belf=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5 $as_echo "$lt_cv_cc_needs_belf" >&6; } if test yes != "$lt_cv_cc_needs_belf"; then # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf CFLAGS=$SAVE_CFLAGS fi ;; *-*solaris*) # Find out what ABI is being produced by ac_compile, and set linker # options accordingly. echo 'int i;' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then case `/usr/bin/file conftest.o` in *64-bit*) case $lt_cv_prog_gnu_ld in yes*) case $host in i?86-*-solaris*|x86_64-*-solaris*) LD="${LD-ld} -m elf_x86_64" ;; sparc*-*-solaris*) LD="${LD-ld} -m elf64_sparc" ;; esac # GNU ld 2.21 introduced _sol2 emulations. Use them if available. if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then LD=${LD-ld}_sol2 fi ;; *) if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then LD="${LD-ld} -64" fi ;; esac ;; esac fi rm -rf conftest* ;; esac need_locks=$enable_libtool_lock if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}mt", so it can be a program name with args. set dummy ${ac_tool_prefix}mt; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_MANIFEST_TOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$MANIFEST_TOOL"; then ac_cv_prog_MANIFEST_TOOL="$MANIFEST_TOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_MANIFEST_TOOL="${ac_tool_prefix}mt" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi MANIFEST_TOOL=$ac_cv_prog_MANIFEST_TOOL if test -n "$MANIFEST_TOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MANIFEST_TOOL" >&5 $as_echo "$MANIFEST_TOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_MANIFEST_TOOL"; then ac_ct_MANIFEST_TOOL=$MANIFEST_TOOL # Extract the first word of "mt", so it can be a program name with args. set dummy mt; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_MANIFEST_TOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_MANIFEST_TOOL"; then ac_cv_prog_ac_ct_MANIFEST_TOOL="$ac_ct_MANIFEST_TOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_MANIFEST_TOOL="mt" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_MANIFEST_TOOL=$ac_cv_prog_ac_ct_MANIFEST_TOOL if test -n "$ac_ct_MANIFEST_TOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_MANIFEST_TOOL" >&5 $as_echo "$ac_ct_MANIFEST_TOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_MANIFEST_TOOL" = x; then MANIFEST_TOOL=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac MANIFEST_TOOL=$ac_ct_MANIFEST_TOOL fi else MANIFEST_TOOL="$ac_cv_prog_MANIFEST_TOOL" fi test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $MANIFEST_TOOL is a manifest tool" >&5 $as_echo_n "checking if $MANIFEST_TOOL is a manifest tool... " >&6; } if ${lt_cv_path_mainfest_tool+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_path_mainfest_tool=no echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&5 $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out cat conftest.err >&5 if $GREP 'Manifest Tool' conftest.out > /dev/null; then lt_cv_path_mainfest_tool=yes fi rm -f conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_mainfest_tool" >&5 $as_echo "$lt_cv_path_mainfest_tool" >&6; } if test yes != "$lt_cv_path_mainfest_tool"; then MANIFEST_TOOL=: fi case $host_os in rhapsody* | darwin*) if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}dsymutil", so it can be a program name with args. set dummy ${ac_tool_prefix}dsymutil; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_DSYMUTIL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$DSYMUTIL"; then ac_cv_prog_DSYMUTIL="$DSYMUTIL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_DSYMUTIL="${ac_tool_prefix}dsymutil" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi DSYMUTIL=$ac_cv_prog_DSYMUTIL if test -n "$DSYMUTIL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DSYMUTIL" >&5 $as_echo "$DSYMUTIL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_DSYMUTIL"; then ac_ct_DSYMUTIL=$DSYMUTIL # Extract the first word of "dsymutil", so it can be a program name with args. set dummy dsymutil; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_DSYMUTIL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_DSYMUTIL"; then ac_cv_prog_ac_ct_DSYMUTIL="$ac_ct_DSYMUTIL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_DSYMUTIL="dsymutil" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_DSYMUTIL=$ac_cv_prog_ac_ct_DSYMUTIL if test -n "$ac_ct_DSYMUTIL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DSYMUTIL" >&5 $as_echo "$ac_ct_DSYMUTIL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_DSYMUTIL" = x; then DSYMUTIL=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac DSYMUTIL=$ac_ct_DSYMUTIL fi else DSYMUTIL="$ac_cv_prog_DSYMUTIL" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}nmedit", so it can be a program name with args. set dummy ${ac_tool_prefix}nmedit; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_NMEDIT+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$NMEDIT"; then ac_cv_prog_NMEDIT="$NMEDIT" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_NMEDIT="${ac_tool_prefix}nmedit" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi NMEDIT=$ac_cv_prog_NMEDIT if test -n "$NMEDIT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NMEDIT" >&5 $as_echo "$NMEDIT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_NMEDIT"; then ac_ct_NMEDIT=$NMEDIT # Extract the first word of "nmedit", so it can be a program name with args. set dummy nmedit; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_NMEDIT+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_NMEDIT"; then ac_cv_prog_ac_ct_NMEDIT="$ac_ct_NMEDIT" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_NMEDIT="nmedit" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_NMEDIT=$ac_cv_prog_ac_ct_NMEDIT if test -n "$ac_ct_NMEDIT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_NMEDIT" >&5 $as_echo "$ac_ct_NMEDIT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_NMEDIT" = x; then NMEDIT=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac NMEDIT=$ac_ct_NMEDIT fi else NMEDIT="$ac_cv_prog_NMEDIT" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}lipo", so it can be a program name with args. set dummy ${ac_tool_prefix}lipo; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_LIPO+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$LIPO"; then ac_cv_prog_LIPO="$LIPO" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_LIPO="${ac_tool_prefix}lipo" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi LIPO=$ac_cv_prog_LIPO if test -n "$LIPO"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIPO" >&5 $as_echo "$LIPO" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_LIPO"; then ac_ct_LIPO=$LIPO # Extract the first word of "lipo", so it can be a program name with args. set dummy lipo; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_LIPO+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_LIPO"; then ac_cv_prog_ac_ct_LIPO="$ac_ct_LIPO" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_LIPO="lipo" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_LIPO=$ac_cv_prog_ac_ct_LIPO if test -n "$ac_ct_LIPO"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_LIPO" >&5 $as_echo "$ac_ct_LIPO" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_LIPO" = x; then LIPO=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac LIPO=$ac_ct_LIPO fi else LIPO="$ac_cv_prog_LIPO" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}otool", so it can be a program name with args. set dummy ${ac_tool_prefix}otool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_OTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$OTOOL"; then ac_cv_prog_OTOOL="$OTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_OTOOL="${ac_tool_prefix}otool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi OTOOL=$ac_cv_prog_OTOOL if test -n "$OTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL" >&5 $as_echo "$OTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_OTOOL"; then ac_ct_OTOOL=$OTOOL # Extract the first word of "otool", so it can be a program name with args. set dummy otool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_OTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_OTOOL"; then ac_cv_prog_ac_ct_OTOOL="$ac_ct_OTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_OTOOL="otool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_OTOOL=$ac_cv_prog_ac_ct_OTOOL if test -n "$ac_ct_OTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL" >&5 $as_echo "$ac_ct_OTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_OTOOL" = x; then OTOOL=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac OTOOL=$ac_ct_OTOOL fi else OTOOL="$ac_cv_prog_OTOOL" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}otool64", so it can be a program name with args. set dummy ${ac_tool_prefix}otool64; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_OTOOL64+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$OTOOL64"; then ac_cv_prog_OTOOL64="$OTOOL64" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_OTOOL64="${ac_tool_prefix}otool64" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi OTOOL64=$ac_cv_prog_OTOOL64 if test -n "$OTOOL64"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL64" >&5 $as_echo "$OTOOL64" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_OTOOL64"; then ac_ct_OTOOL64=$OTOOL64 # Extract the first word of "otool64", so it can be a program name with args. set dummy otool64; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_OTOOL64+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_OTOOL64"; then ac_cv_prog_ac_ct_OTOOL64="$ac_ct_OTOOL64" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_OTOOL64="otool64" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_OTOOL64=$ac_cv_prog_ac_ct_OTOOL64 if test -n "$ac_ct_OTOOL64"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL64" >&5 $as_echo "$ac_ct_OTOOL64" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_OTOOL64" = x; then OTOOL64=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac OTOOL64=$ac_ct_OTOOL64 fi else OTOOL64="$ac_cv_prog_OTOOL64" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -single_module linker flag" >&5 $as_echo_n "checking for -single_module linker flag... " >&6; } if ${lt_cv_apple_cc_single_mod+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_apple_cc_single_mod=no if test -z "$LT_MULTI_MODULE"; then # By default we will add the -single_module flag. You can override # by either setting the environment variable LT_MULTI_MODULE # non-empty at configure time, or by adding -multi_module to the # link flags. rm -rf libconftest.dylib* echo "int foo(void){return 1;}" > conftest.c echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c" >&5 $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c 2>conftest.err _lt_result=$? # If there is a non-empty error log, and "single_module" # appears in it, assume the flag caused a linker warning if test -s conftest.err && $GREP single_module conftest.err; then cat conftest.err >&5 # Otherwise, if the output was created with a 0 exit code from # the compiler, it worked. elif test -f libconftest.dylib && test 0 = "$_lt_result"; then lt_cv_apple_cc_single_mod=yes else cat conftest.err >&5 fi rm -rf libconftest.dylib* rm -f conftest.* fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod" >&5 $as_echo "$lt_cv_apple_cc_single_mod" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -exported_symbols_list linker flag" >&5 $as_echo_n "checking for -exported_symbols_list linker flag... " >&6; } if ${lt_cv_ld_exported_symbols_list+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_ld_exported_symbols_list=no save_LDFLAGS=$LDFLAGS echo "_main" > conftest.sym LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_cv_ld_exported_symbols_list=yes else lt_cv_ld_exported_symbols_list=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS=$save_LDFLAGS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5 $as_echo "$lt_cv_ld_exported_symbols_list" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -force_load linker flag" >&5 $as_echo_n "checking for -force_load linker flag... " >&6; } if ${lt_cv_ld_force_load+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_ld_force_load=no cat > conftest.c << _LT_EOF int forced_loaded() { return 2;} _LT_EOF echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&5 $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&5 echo "$AR cr libconftest.a conftest.o" >&5 $AR cr libconftest.a conftest.o 2>&5 echo "$RANLIB libconftest.a" >&5 $RANLIB libconftest.a 2>&5 cat > conftest.c << _LT_EOF int main() { return 0;} _LT_EOF echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&5 $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err _lt_result=$? if test -s conftest.err && $GREP force_load conftest.err; then cat conftest.err >&5 elif test -f conftest && test 0 = "$_lt_result" && $GREP forced_load conftest >/dev/null 2>&1; then lt_cv_ld_force_load=yes else cat conftest.err >&5 fi rm -f conftest.err libconftest.a conftest conftest.c rm -rf conftest.dSYM fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_force_load" >&5 $as_echo "$lt_cv_ld_force_load" >&6; } case $host_os in rhapsody* | darwin1.[012]) _lt_dar_allow_undefined='$wl-undefined ${wl}suppress' ;; darwin1.*) _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;; darwin*) # darwin 5.x on # if running on 10.5 or later, the deployment target defaults # to the OS version, if on x86, and 10.4, the deployment # target defaults to 10.4. Don't you love it? case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in 10.0,*86*-darwin8*|10.0,*-darwin[91]*) _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;; 10.[012][,.]*) _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;; 10.*) _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;; esac ;; esac if test yes = "$lt_cv_apple_cc_single_mod"; then _lt_dar_single_mod='$single_module' fi if test yes = "$lt_cv_ld_exported_symbols_list"; then _lt_dar_export_syms=' $wl-exported_symbols_list,$output_objdir/$libname-symbols.expsym' else _lt_dar_export_syms='~$NMEDIT -s $output_objdir/$libname-symbols.expsym $lib' fi if test : != "$DSYMUTIL" && test no = "$lt_cv_ld_force_load"; then _lt_dsymutil='~$DSYMUTIL $lib || :' else _lt_dsymutil= fi ;; esac # func_munge_path_list VARIABLE PATH # ----------------------------------- # VARIABLE is name of variable containing _space_ separated list of # directories to be munged by the contents of PATH, which is string # having a format: # "DIR[:DIR]:" # string "DIR[ DIR]" will be prepended to VARIABLE # ":DIR[:DIR]" # string "DIR[ DIR]" will be appended to VARIABLE # "DIRP[:DIRP]::[DIRA:]DIRA" # string "DIRP[ DIRP]" will be prepended to VARIABLE and string # "DIRA[ DIRA]" will be appended to VARIABLE # "DIR[:DIR]" # VARIABLE will be replaced by "DIR[ DIR]" func_munge_path_list () { case x$2 in x) ;; *:) eval $1=\"`$ECHO $2 | $SED 's/:/ /g'` \$$1\" ;; x:*) eval $1=\"\$$1 `$ECHO $2 | $SED 's/:/ /g'`\" ;; *::*) eval $1=\"\$$1\ `$ECHO $2 | $SED -e 's/.*:://' -e 's/:/ /g'`\" eval $1=\"`$ECHO $2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \$$1\" ;; *) eval $1=\"`$ECHO $2 | $SED 's/:/ /g'`\" ;; esac } for ac_header in dlfcn.h do : ac_fn_c_check_header_compile "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default " if test "x$ac_cv_header_dlfcn_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_DLFCN_H 1 _ACEOF fi done # Set options # Check whether --enable-shared was given. if test "${enable_shared+set}" = set; then : enableval=$enable_shared; p=${PACKAGE-default} case $enableval in yes) enable_shared=yes ;; no) enable_shared=no ;; *) enable_shared=no # Look at the argument we got. We use all the common list separators. lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, for pkg in $enableval; do IFS=$lt_save_ifs if test "X$pkg" = "X$p"; then enable_shared=yes fi done IFS=$lt_save_ifs ;; esac else enable_shared=yes fi # Check whether --enable-static was given. if test "${enable_static+set}" = set; then : enableval=$enable_static; p=${PACKAGE-default} case $enableval in yes) enable_static=yes ;; no) enable_static=no ;; *) enable_static=no # Look at the argument we got. We use all the common list separators. lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, for pkg in $enableval; do IFS=$lt_save_ifs if test "X$pkg" = "X$p"; then enable_static=yes fi done IFS=$lt_save_ifs ;; esac else enable_static=yes fi # Check whether --with-pic was given. if test "${with_pic+set}" = set; then : withval=$with_pic; lt_p=${PACKAGE-default} case $withval in yes|no) pic_mode=$withval ;; *) pic_mode=default # Look at the argument we got. We use all the common list separators. lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, for lt_pkg in $withval; do IFS=$lt_save_ifs if test "X$lt_pkg" = "X$lt_p"; then pic_mode=yes fi done IFS=$lt_save_ifs ;; esac else pic_mode=default fi # Check whether --enable-fast-install was given. if test "${enable_fast_install+set}" = set; then : enableval=$enable_fast_install; p=${PACKAGE-default} case $enableval in yes) enable_fast_install=yes ;; no) enable_fast_install=no ;; *) enable_fast_install=no # Look at the argument we got. We use all the common list separators. lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, for pkg in $enableval; do IFS=$lt_save_ifs if test "X$pkg" = "X$p"; then enable_fast_install=yes fi done IFS=$lt_save_ifs ;; esac else enable_fast_install=yes fi shared_archive_member_spec= case $host,$enable_shared in power*-*-aix[5-9]*,yes) { $as_echo "$as_me:${as_lineno-$LINENO}: checking which variant of shared library versioning to provide" >&5 $as_echo_n "checking which variant of shared library versioning to provide... " >&6; } # Check whether --with-aix-soname was given. if test "${with_aix_soname+set}" = set; then : withval=$with_aix_soname; case $withval in aix|svr4|both) ;; *) as_fn_error $? "Unknown argument to --with-aix-soname" "$LINENO" 5 ;; esac lt_cv_with_aix_soname=$with_aix_soname else if ${lt_cv_with_aix_soname+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_with_aix_soname=aix fi with_aix_soname=$lt_cv_with_aix_soname fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_aix_soname" >&5 $as_echo "$with_aix_soname" >&6; } if test aix != "$with_aix_soname"; then # For the AIX way of multilib, we name the shared archive member # based on the bitwidth used, traditionally 'shr.o' or 'shr_64.o', # and 'shr.imp' or 'shr_64.imp', respectively, for the Import File. # Even when GNU compilers ignore OBJECT_MODE but need '-maix64' flag, # the AIX toolchain works better with OBJECT_MODE set (default 32). if test 64 = "${OBJECT_MODE-32}"; then shared_archive_member_spec=shr_64 else shared_archive_member_spec=shr fi fi ;; *) with_aix_soname=aix ;; esac # This can be used to rebuild libtool when needed LIBTOOL_DEPS=$ltmain # Always use our own libtool. LIBTOOL='$(SHELL) $(top_builddir)/libtool' test -z "$LN_S" && LN_S="ln -s" if test -n "${ZSH_VERSION+set}"; then setopt NO_GLOB_SUBST fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for objdir" >&5 $as_echo_n "checking for objdir... " >&6; } if ${lt_cv_objdir+:} false; then : $as_echo_n "(cached) " >&6 else rm -f .libs 2>/dev/null mkdir .libs 2>/dev/null if test -d .libs; then lt_cv_objdir=.libs else # MS-DOS does not allow filenames that begin with a dot. lt_cv_objdir=_libs fi rmdir .libs 2>/dev/null fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_objdir" >&5 $as_echo "$lt_cv_objdir" >&6; } objdir=$lt_cv_objdir cat >>confdefs.h <<_ACEOF #define LT_OBJDIR "$lt_cv_objdir/" _ACEOF case $host_os in aix3*) # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test set != "${COLLECT_NAMES+set}"; then COLLECT_NAMES= export COLLECT_NAMES fi ;; esac # Global variables: ofile=libtool can_build_shared=yes # All known linkers require a '.a' archive for static linking (except MSVC, # which needs '.lib'). libext=a with_gnu_ld=$lt_cv_prog_gnu_ld old_CC=$CC old_CFLAGS=$CFLAGS # Set sane defaults for various variables test -z "$CC" && CC=cc test -z "$LTCC" && LTCC=$CC test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS test -z "$LD" && LD=ld test -z "$ac_objext" && ac_objext=o func_cc_basename $compiler cc_basename=$func_cc_basename_result # Only perform the check for file, if the check method requires it test -z "$MAGIC_CMD" && MAGIC_CMD=file case $deplibs_check_method in file_magic*) if test "$file_magic_cmd" = '$MAGIC_CMD'; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ${ac_tool_prefix}file" >&5 $as_echo_n "checking for ${ac_tool_prefix}file... " >&6; } if ${lt_cv_path_MAGIC_CMD+:} false; then : $as_echo_n "(cached) " >&6 else case $MAGIC_CMD in [\\/*] | ?:[\\/]*) lt_cv_path_MAGIC_CMD=$MAGIC_CMD # Let the user override the test with a path. ;; *) lt_save_MAGIC_CMD=$MAGIC_CMD lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" for ac_dir in $ac_dummy; do IFS=$lt_save_ifs test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/${ac_tool_prefix}file"; then lt_cv_path_MAGIC_CMD=$ac_dir/"${ac_tool_prefix}file" if test -n "$file_magic_test_file"; then case $deplibs_check_method in "file_magic "*) file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` MAGIC_CMD=$lt_cv_path_MAGIC_CMD if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | $EGREP "$file_magic_regex" > /dev/null; then : else cat <<_LT_EOF 1>&2 *** Warning: the command libtool uses to detect shared libraries, *** $file_magic_cmd, produces output that libtool cannot recognize. *** The result is that libtool may fail to recognize shared libraries *** as such. This will affect the creation of libtool libraries that *** depend on shared libraries, but programs linked with such libtool *** libraries will work regardless of this problem. Nevertheless, you *** may want to report the problem to your system manager and/or to *** bug-libtool@gnu.org _LT_EOF fi ;; esac fi break fi done IFS=$lt_save_ifs MAGIC_CMD=$lt_save_MAGIC_CMD ;; esac fi MAGIC_CMD=$lt_cv_path_MAGIC_CMD if test -n "$MAGIC_CMD"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 $as_echo "$MAGIC_CMD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test -z "$lt_cv_path_MAGIC_CMD"; then if test -n "$ac_tool_prefix"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for file" >&5 $as_echo_n "checking for file... " >&6; } if ${lt_cv_path_MAGIC_CMD+:} false; then : $as_echo_n "(cached) " >&6 else case $MAGIC_CMD in [\\/*] | ?:[\\/]*) lt_cv_path_MAGIC_CMD=$MAGIC_CMD # Let the user override the test with a path. ;; *) lt_save_MAGIC_CMD=$MAGIC_CMD lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" for ac_dir in $ac_dummy; do IFS=$lt_save_ifs test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/file"; then lt_cv_path_MAGIC_CMD=$ac_dir/"file" if test -n "$file_magic_test_file"; then case $deplibs_check_method in "file_magic "*) file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` MAGIC_CMD=$lt_cv_path_MAGIC_CMD if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | $EGREP "$file_magic_regex" > /dev/null; then : else cat <<_LT_EOF 1>&2 *** Warning: the command libtool uses to detect shared libraries, *** $file_magic_cmd, produces output that libtool cannot recognize. *** The result is that libtool may fail to recognize shared libraries *** as such. This will affect the creation of libtool libraries that *** depend on shared libraries, but programs linked with such libtool *** libraries will work regardless of this problem. Nevertheless, you *** may want to report the problem to your system manager and/or to *** bug-libtool@gnu.org _LT_EOF fi ;; esac fi break fi done IFS=$lt_save_ifs MAGIC_CMD=$lt_save_MAGIC_CMD ;; esac fi MAGIC_CMD=$lt_cv_path_MAGIC_CMD if test -n "$MAGIC_CMD"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 $as_echo "$MAGIC_CMD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi else MAGIC_CMD=: fi fi fi ;; esac # Use C for the default configuration in the libtool script lt_save_CC=$CC ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu # Source file extension for C test sources. ac_ext=c # Object file extension for compiled C test sources. objext=o objext=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(){return(0);}' # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC # Save the default compiler, since it gets overwritten when the other # tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. compiler_DEFAULT=$CC # save warnings/boilerplate of simple test code ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" >conftest.$ac_ext eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_compiler_boilerplate=`cat conftest.err` $RM conftest* ac_outfile=conftest.$ac_objext echo "$lt_simple_link_test_code" >conftest.$ac_ext eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_linker_boilerplate=`cat conftest.err` $RM -r conftest* ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... if test -n "$compiler"; then lt_prog_compiler_no_builtin_flag= if test yes = "$GCC"; then case $cc_basename in nvcc*) lt_prog_compiler_no_builtin_flag=' -Xcompiler -fno-builtin' ;; *) lt_prog_compiler_no_builtin_flag=' -fno-builtin' ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 $as_echo_n "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; } if ${lt_cv_prog_compiler_rtti_exceptions+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_rtti_exceptions=no ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-fno-rtti -fno-exceptions" ## exclude from sc_useless_quotes_in_assignment # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_rtti_exceptions=yes fi fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 $as_echo "$lt_cv_prog_compiler_rtti_exceptions" >&6; } if test yes = "$lt_cv_prog_compiler_rtti_exceptions"; then lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions" else : fi fi lt_prog_compiler_wl= lt_prog_compiler_pic= lt_prog_compiler_static= if test yes = "$GCC"; then lt_prog_compiler_wl='-Wl,' lt_prog_compiler_static='-static' case $host_os in aix*) # All AIX code is PIC. if test ia64 = "$host_cpu"; then # AIX 5 now supports IA64 processor lt_prog_compiler_static='-Bstatic' fi lt_prog_compiler_pic='-fPIC' ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support lt_prog_compiler_pic='-fPIC' ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but # adding the '-m68020' flag to GCC prevents building anything better, # like '-m68040'. lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries lt_prog_compiler_pic='-DDLL_EXPORT' case $host_os in os2*) lt_prog_compiler_static='$wl-static' ;; esac ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files lt_prog_compiler_pic='-fno-common' ;; haiku*) # PIC is the default for Haiku. # The "-static" flag exists, but is broken. lt_prog_compiler_static= ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) # +Z the default ;; *) lt_prog_compiler_pic='-fPIC' ;; esac ;; interix[3-9]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; msdosdjgpp*) # Just because we use GCC doesn't mean we suddenly get shared libraries # on systems that don't support them. lt_prog_compiler_can_build_shared=no enable_shared=no ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. lt_prog_compiler_pic='-fPIC -shared' ;; sysv4*MP*) if test -d /usr/nec; then lt_prog_compiler_pic=-Kconform_pic fi ;; *) lt_prog_compiler_pic='-fPIC' ;; esac case $cc_basename in nvcc*) # Cuda Compiler Driver 2.2 lt_prog_compiler_wl='-Xlinker ' if test -n "$lt_prog_compiler_pic"; then lt_prog_compiler_pic="-Xcompiler $lt_prog_compiler_pic" fi ;; esac else # PORTME Check for flag to pass linker flags through the system compiler. case $host_os in aix*) lt_prog_compiler_wl='-Wl,' if test ia64 = "$host_cpu"; then # AIX 5 now supports IA64 processor lt_prog_compiler_static='-Bstatic' else lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp' fi ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files lt_prog_compiler_pic='-fno-common' case $cc_basename in nagfor*) # NAG Fortran compiler lt_prog_compiler_wl='-Wl,-Wl,,' lt_prog_compiler_pic='-PIC' lt_prog_compiler_static='-Bstatic' ;; esac ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). lt_prog_compiler_pic='-DDLL_EXPORT' case $host_os in os2*) lt_prog_compiler_static='$wl-static' ;; esac ;; hpux9* | hpux10* | hpux11*) lt_prog_compiler_wl='-Wl,' # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) lt_prog_compiler_pic='+Z' ;; esac # Is there a better lt_prog_compiler_static that works with the bundled CC? lt_prog_compiler_static='$wl-a ${wl}archive' ;; irix5* | irix6* | nonstopux*) lt_prog_compiler_wl='-Wl,' # PIC (with -KPIC) is the default. lt_prog_compiler_static='-non_shared' ;; linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) case $cc_basename in # old Intel for x86_64, which still supported -KPIC. ecc*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-static' ;; # flang / f18. f95 an alias for gfortran or flang on Debian flang* | f18* | f95*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fPIC' lt_prog_compiler_static='-static' ;; # icc used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. icc* | ifort*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fPIC' lt_prog_compiler_static='-static' ;; # Lahey Fortran 8.1. lf95*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='--shared' lt_prog_compiler_static='--static' ;; nagfor*) # NAG Fortran compiler lt_prog_compiler_wl='-Wl,-Wl,,' lt_prog_compiler_pic='-PIC' lt_prog_compiler_static='-Bstatic' ;; tcc*) # Fabrice Bellard et al's Tiny C Compiler lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fPIC' lt_prog_compiler_static='-static' ;; pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group compilers (*not* the Pentium gcc compiler, # which looks to be a dead project) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fpic' lt_prog_compiler_static='-Bstatic' ;; ccc*) lt_prog_compiler_wl='-Wl,' # All Alpha code is PIC. lt_prog_compiler_static='-non_shared' ;; xl* | bgxl* | bgf* | mpixl*) # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-qpic' lt_prog_compiler_static='-qstaticlink' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [1-7].* | *Sun*Fortran*\ 8.[0-3]*) # Sun Fortran 8.3 passes all unrecognized flags to the linker lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' lt_prog_compiler_wl='' ;; *Sun\ F* | *Sun*Fortran*) lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' lt_prog_compiler_wl='-Qoption ld ' ;; *Sun\ C*) # Sun C 5.9 lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' lt_prog_compiler_wl='-Wl,' ;; *Intel*\ [CF]*Compiler*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fPIC' lt_prog_compiler_static='-static' ;; *Portland\ Group*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fpic' lt_prog_compiler_static='-Bstatic' ;; esac ;; esac ;; newsos6) lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. lt_prog_compiler_pic='-fPIC -shared' ;; osf3* | osf4* | osf5*) lt_prog_compiler_wl='-Wl,' # All OSF/1 code is PIC. lt_prog_compiler_static='-non_shared' ;; rdos*) lt_prog_compiler_static='-non_shared' ;; solaris*) lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' case $cc_basename in f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) lt_prog_compiler_wl='-Qoption ld ';; *) lt_prog_compiler_wl='-Wl,';; esac ;; sunos4*) lt_prog_compiler_wl='-Qoption ld ' lt_prog_compiler_pic='-PIC' lt_prog_compiler_static='-Bstatic' ;; sysv4 | sysv4.2uw2* | sysv4.3*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' ;; sysv4*MP*) if test -d /usr/nec; then lt_prog_compiler_pic='-Kconform_pic' lt_prog_compiler_static='-Bstatic' fi ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' ;; unicos*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_can_build_shared=no ;; uts4*) lt_prog_compiler_pic='-pic' lt_prog_compiler_static='-Bstatic' ;; *) lt_prog_compiler_can_build_shared=no ;; esac fi case $host_os in # For platforms that do not support PIC, -DPIC is meaningless: *djgpp*) lt_prog_compiler_pic= ;; *) lt_prog_compiler_pic="$lt_prog_compiler_pic -DPIC" ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 $as_echo_n "checking for $compiler option to produce PIC... " >&6; } if ${lt_cv_prog_compiler_pic+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_pic=$lt_prog_compiler_pic fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic" >&5 $as_echo "$lt_cv_prog_compiler_pic" >&6; } lt_prog_compiler_pic=$lt_cv_prog_compiler_pic # # Check to make sure the PIC flag actually works. # if test -n "$lt_prog_compiler_pic"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5 $as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; } if ${lt_cv_prog_compiler_pic_works+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_pic_works=no ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$lt_prog_compiler_pic -DPIC" ## exclude from sc_useless_quotes_in_assignment # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_pic_works=yes fi fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works" >&5 $as_echo "$lt_cv_prog_compiler_pic_works" >&6; } if test yes = "$lt_cv_prog_compiler_pic_works"; then case $lt_prog_compiler_pic in "" | " "*) ;; *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;; esac else lt_prog_compiler_pic= lt_prog_compiler_can_build_shared=no fi fi # # Check to make sure the static flag actually works. # wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\" { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 $as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } if ${lt_cv_prog_compiler_static_works+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_static_works=no save_LDFLAGS=$LDFLAGS LDFLAGS="$LDFLAGS $lt_tmp_static_flag" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&5 $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_static_works=yes fi else lt_cv_prog_compiler_static_works=yes fi fi $RM -r conftest* LDFLAGS=$save_LDFLAGS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works" >&5 $as_echo "$lt_cv_prog_compiler_static_works" >&6; } if test yes = "$lt_cv_prog_compiler_static_works"; then : else lt_prog_compiler_static= fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 $as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if ${lt_cv_prog_compiler_c_o+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_c_o=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o=yes fi fi chmod u+w . 2>&5 $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 $as_echo "$lt_cv_prog_compiler_c_o" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 $as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if ${lt_cv_prog_compiler_c_o+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_c_o=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o=yes fi fi chmod u+w . 2>&5 $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 $as_echo "$lt_cv_prog_compiler_c_o" >&6; } hard_links=nottested if test no = "$lt_cv_prog_compiler_c_o" && test no != "$need_locks"; then # do not overwrite the value of need_locks provided by the user { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 $as_echo_n "checking if we can lock with hard links... " >&6; } hard_links=yes $RM conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 $as_echo "$hard_links" >&6; } if test no = "$hard_links"; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&5 $as_echo "$as_me: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&2;} need_locks=warn fi else need_locks=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 $as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } runpath_var= allow_undefined_flag= always_export_symbols=no archive_cmds= archive_expsym_cmds= compiler_needs_object=no enable_shared_with_static_runtimes=no export_dynamic_flag_spec= export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' hardcode_automatic=no hardcode_direct=no hardcode_direct_absolute=no hardcode_libdir_flag_spec= hardcode_libdir_separator= hardcode_minus_L=no hardcode_shlibpath_var=unsupported inherit_rpath=no link_all_deplibs=unknown module_cmds= module_expsym_cmds= old_archive_from_new_cmds= old_archive_from_expsyms_cmds= thread_safe_flag_spec= whole_archive_flag_spec= # include_expsyms should be a list of space-separated symbols to be *always* # included in the symbol list include_expsyms= # exclude_expsyms can be an extended regexp of symbols to exclude # it will be wrapped by ' (' and ')$', so one must not match beginning or # end of line. Example: 'a|bc|.*d.*' will exclude the symbols 'a' and 'bc', # as well as any symbol that contains 'd'. exclude_expsyms='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out # platforms (ab)use it in PIC code, but their linkers get confused if # the symbol is explicitly referenced. Since portable code cannot # rely on this symbol name, it's probably fine to never include it in # preloaded symbol tables. # Exclude shared library initialization/finalization symbols. extract_expsyms_cmds= case $host_os in cygwin* | mingw* | pw32* | cegcc*) # FIXME: the MSVC++ port hasn't been tested in a loooong time # When not using gcc, we currently assume that we are using # Microsoft Visual C++. if test yes != "$GCC"; then with_gnu_ld=no fi ;; interix*) # we just hope/assume this is gcc and not c89 (= MSVC++) with_gnu_ld=yes ;; openbsd* | bitrig*) with_gnu_ld=no ;; linux* | k*bsd*-gnu | gnu*) link_all_deplibs=no ;; esac ld_shlibs=yes # On some targets, GNU ld is compatible enough with the native linker # that we're better off using the native interface for both. lt_use_gnu_ld_interface=no if test yes = "$with_gnu_ld"; then case $host_os in aix*) # The AIX port of GNU ld has always aspired to compatibility # with the native linker. However, as the warning in the GNU ld # block says, versions before 2.19.5* couldn't really create working # shared libraries, regardless of the interface used. case `$LD -v 2>&1` in *\ \(GNU\ Binutils\)\ 2.19.5*) ;; *\ \(GNU\ Binutils\)\ 2.[2-9]*) ;; *\ \(GNU\ Binutils\)\ [3-9]*) ;; *) lt_use_gnu_ld_interface=yes ;; esac ;; *) lt_use_gnu_ld_interface=yes ;; esac fi if test yes = "$lt_use_gnu_ld_interface"; then # If archive_cmds runs LD, not CC, wlarc should be empty wlarc='$wl' # Set some defaults for GNU ld with shared library support. These # are reset later if shared libraries are not supported. Putting them # here allows them to be overridden if necessary. runpath_var=LD_RUN_PATH hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' export_dynamic_flag_spec='$wl--export-dynamic' # ancient GNU ld didn't support --whole-archive et. al. if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then whole_archive_flag_spec=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' else whole_archive_flag_spec= fi supports_anon_versioning=no case `$LD -v | $SED -e 's/(^)\+)\s\+//' 2>&1` in *GNU\ gold*) supports_anon_versioning=yes ;; *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... *\ 2.11.*) ;; # other 2.11 versions *) supports_anon_versioning=yes ;; esac # See if GNU ld supports shared libraries. case $host_os in aix[3-9]*) # On AIX/PPC, the GNU linker is very broken if test ia64 != "$host_cpu"; then ld_shlibs=no cat <<_LT_EOF 1>&2 *** Warning: the GNU linker, at least up to release 2.19, is reported *** to be unable to reliably create shared libraries on AIX. *** Therefore, libtool is disabling shared libraries support. If you *** really care for shared libraries, you may want to install binutils *** 2.20 or above, or modify your PATH so that a non-GNU linker is found. *** You will then need to restart the configuration process. _LT_EOF fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' archive_expsym_cmds='' ;; m68k) archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes ;; esac ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then allow_undefined_flag=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' else ld_shlibs=no fi ;; cygwin* | mingw* | pw32* | cegcc*) # _LT_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless, # as there is no search path for DLLs. hardcode_libdir_flag_spec='-L$libdir' export_dynamic_flag_spec='$wl--export-all-symbols' allow_undefined_flag=unsupported always_export_symbols=no enable_shared_with_static_runtimes=yes export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols' exclude_expsyms='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname' if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file, use it as # is; otherwise, prepend EXPORTS... archive_expsym_cmds='if test DEF = "`$SED -n -e '\''s/^[ ]*//'\'' -e '\''/^\(;.*\)*$/d'\'' -e '\''s/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p'\'' -e q $export_symbols`" ; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else ld_shlibs=no fi ;; haiku*) archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' link_all_deplibs=yes ;; os2*) hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes allow_undefined_flag=unsupported shrext_cmds=.dll archive_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' archive_expsym_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ prefix_cmds="$SED"~ if test EXPORTS = "`$SED 1q $export_symbols`"; then prefix_cmds="$prefix_cmds -e 1d"; fi~ prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' old_archive_From_new_cmds='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' enable_shared_with_static_runtimes=yes ;; interix[3-9]*) hardcode_direct=no hardcode_shlibpath_var=no hardcode_libdir_flag_spec='$wl-rpath,$libdir' export_dynamic_flag_spec='$wl-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' archive_expsym_cmds='sed "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) tmp_diet=no if test linux-dietlibc = "$host_os"; then case $cc_basename in diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) esac fi if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ && test no = "$tmp_diet" then tmp_addflag=' $pic_flag' tmp_sharedflag='-shared' case $cc_basename,$host_cpu in pgcc*) # Portland Group C compiler whole_archive_flag_spec='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' tmp_addflag=' $pic_flag' ;; pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group f77 and f90 compilers whole_archive_flag_spec='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' tmp_addflag=' $pic_flag -Mnomain' ;; ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 tmp_addflag=' -i_dynamic' ;; efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 tmp_addflag=' -i_dynamic -nofor_main' ;; ifc* | ifort*) # Intel Fortran compiler tmp_addflag=' -nofor_main' ;; lf95*) # Lahey Fortran 8.1 whole_archive_flag_spec= tmp_sharedflag='--shared' ;; nagfor*) # NAGFOR 5.3 tmp_sharedflag='-Wl,-shared' ;; xl[cC]* | bgxl[cC]* | mpixl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below) tmp_sharedflag='-qmkshrobj' tmp_addflag= ;; nvcc*) # Cuda Compiler Driver 2.2 whole_archive_flag_spec='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' compiler_needs_object=yes ;; esac case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C 5.9 whole_archive_flag_spec='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' compiler_needs_object=yes tmp_sharedflag='-G' ;; *Sun\ F*) # Sun Fortran 8.3 tmp_sharedflag='-G' ;; esac archive_cmds='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' if test yes = "$supports_anon_versioning"; then archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib' fi case $cc_basename in tcc*) export_dynamic_flag_spec='-rdynamic' ;; xlf* | bgf* | bgxlf* | mpixlf*) # IBM XL Fortran 10.1 on PPC cannot create shared libs itself whole_archive_flag_spec='--whole-archive$convenience --no-whole-archive' hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' if test yes = "$supports_anon_versioning"; then archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' fi ;; esac else ld_shlibs=no fi ;; netbsd* | netbsdelf*-gnu) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' wlarc= else archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' fi ;; solaris*) if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then ld_shlibs=no cat <<_LT_EOF 1>&2 *** Warning: The releases 2.8.* of the GNU linker cannot reliably *** create shared libraries on Solaris systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.9.1 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs=no fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) case `$LD -v 2>&1` in *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) ld_shlibs=no cat <<_LT_EOF 1>&2 *** Warning: Releases of the GNU linker prior to 2.16.91.0.3 cannot *** reliably create shared libraries on SCO systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.16.91.0.3 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF ;; *) # For security reasons, it is highly recommended that you always # use absolute paths for naming shared libraries, and exclude the # DT_RUNPATH tag from executables and libraries. But doing so # requires that you compile everything twice, which is a pain. if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs=no fi ;; esac ;; sunos4*) archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' wlarc= hardcode_direct=yes hardcode_shlibpath_var=no ;; *) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs=no fi ;; esac if test no = "$ld_shlibs"; then runpath_var= hardcode_libdir_flag_spec= export_dynamic_flag_spec= whole_archive_flag_spec= fi else # PORTME fill in a description of your system's linker (not GNU ld) case $host_os in aix3*) allow_undefined_flag=unsupported always_export_symbols=yes archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' # Note: this linker hardcodes the directories in LIBPATH if there # are no directories specified by -L. hardcode_minus_L=yes if test yes = "$GCC" && test -z "$lt_prog_compiler_static"; then # Neither direct hardcoding nor static linking is supported with a # broken collect2. hardcode_direct=unsupported fi ;; aix[4-9]*) if test ia64 = "$host_cpu"; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag= else # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to GNU nm, but means don't demangle to AIX nm. # Without the "-l" option, or with the "-B" option, AIX nm treats # weak defined symbols like other global defined symbols, whereas # GNU nm marks them as "W". # While the 'weak' keyword is ignored in the Export File, we need # it in the Import File for the 'aix-soname' feature, so we have # to replace the "-B" option with "-P" for AIX nm. if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols' else export_symbols_cmds='`func_echo_all $NM | $SED -e '\''s/B\([^B]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && (substr(\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols' fi aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # have runtime linking enabled, and use it for executables. # For shared libraries, we enable/disable runtime linking # depending on the kind of the shared library created - # when "with_aix_soname,aix_use_runtimelinking" is: # "aix,no" lib.a(lib.so.V) shared, rtl:no, for executables # "aix,yes" lib.so shared, rtl:yes, for executables # lib.a static archive # "both,no" lib.so.V(shr.o) shared, rtl:yes # lib.a(lib.so.V) shared, rtl:no, for executables # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables # lib.a(lib.so.V) shared, rtl:no # "svr4,*" lib.so.V(shr.o) shared, rtl:yes, for executables # lib.a static archive case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) for ld_flag in $LDFLAGS; do if (test x-brtl = "x$ld_flag" || test x-Wl,-brtl = "x$ld_flag"); then aix_use_runtimelinking=yes break fi done if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then # With aix-soname=svr4, we create the lib.so.V shared archives only, # so we don't have lib.a shared libs to link our executables. # We have to force runtime linking in this case. aix_use_runtimelinking=yes LDFLAGS="$LDFLAGS -Wl,-brtl" fi ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. archive_cmds='' hardcode_direct=yes hardcode_direct_absolute=yes hardcode_libdir_separator=':' link_all_deplibs=yes file_list_spec='$wl-f,' case $with_aix_soname,$aix_use_runtimelinking in aix,*) ;; # traditional, no import file svr4,* | *,yes) # use import file # The Import File defines what to hardcode. hardcode_direct=no hardcode_direct_absolute=no ;; esac if test yes = "$GCC"; then case $host_os in aix4.[012]|aix4.[012].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`$CC -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 hardcode_direct=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking hardcode_minus_L=yes hardcode_libdir_flag_spec='-L$libdir' hardcode_libdir_separator= fi ;; esac shared_flag='-shared' if test yes = "$aix_use_runtimelinking"; then shared_flag="$shared_flag "'$wl-G' fi # Need to ensure runtime linking is disabled for the traditional # shared library, or the linker may eventually find shared libraries # /with/ Import File - we do not want to mix them. shared_flag_aix='-shared' shared_flag_svr4='-shared $wl-G' else # not using gcc if test ia64 = "$host_cpu"; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test yes = "$aix_use_runtimelinking"; then shared_flag='$wl-G' else shared_flag='$wl-bM:SRE' fi shared_flag_aix='$wl-bM:SRE' shared_flag_svr4='$wl-G' fi fi export_dynamic_flag_spec='$wl-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to export. always_export_symbols=yes if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. allow_undefined_flag='-berok' # Determine the default libpath from the value encoded in an # empty executable. if test set = "${lt_cv_aix_libpath+set}"; then aix_libpath=$lt_cv_aix_libpath else if ${lt_cv_aix_libpath_+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }' lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_=/usr/lib:/lib fi fi aix_libpath=$lt_cv_aix_libpath_ fi hardcode_libdir_flag_spec='$wl-blibpath:$libdir:'"$aix_libpath" archive_expsym_cmds='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag else if test ia64 = "$host_cpu"; then hardcode_libdir_flag_spec='$wl-R $libdir:/usr/lib:/lib' allow_undefined_flag="-z nodefs" archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an # empty executable. if test set = "${lt_cv_aix_libpath+set}"; then aix_libpath=$lt_cv_aix_libpath else if ${lt_cv_aix_libpath_+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }' lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_=/usr/lib:/lib fi fi aix_libpath=$lt_cv_aix_libpath_ fi hardcode_libdir_flag_spec='$wl-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. no_undefined_flag=' $wl-bernotok' allow_undefined_flag=' $wl-berok' if test yes = "$with_gnu_ld"; then # We only use this code for GNU lds that support --whole-archive. whole_archive_flag_spec='$wl--whole-archive$convenience $wl--no-whole-archive' else # Exported symbols can be pulled into shared objects from archives whole_archive_flag_spec='$convenience' fi archive_cmds_need_lc=yes archive_expsym_cmds='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d' # -brtl affects multiple linker settings, -berok does not and is overridden later compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([, ]\\)%-berok\\1%g"`' if test svr4 != "$with_aix_soname"; then # This is similar to how AIX traditionally builds its shared libraries. archive_expsym_cmds="$archive_expsym_cmds"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname' fi if test aix != "$with_aix_soname"; then archive_expsym_cmds="$archive_expsym_cmds"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp' else # used by -dlpreopen to get the symbols archive_expsym_cmds="$archive_expsym_cmds"'~$MV $output_objdir/$realname.d/$soname $output_objdir' fi archive_expsym_cmds="$archive_expsym_cmds"'~$RM -r $output_objdir/$realname.d' fi fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' archive_expsym_cmds='' ;; m68k) archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes ;; esac ;; bsdi[45]*) export_dynamic_flag_spec=-rdynamic ;; cygwin* | mingw* | pw32* | cegcc*) # When not using gcc, we currently assume that we are using # Microsoft Visual C++. # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. case $cc_basename in cl*) # Native MSVC hardcode_libdir_flag_spec=' ' allow_undefined_flag=unsupported always_export_symbols=yes file_list_spec='@' # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=.dll # FIXME: Setting linknames here is a bad hack. archive_cmds='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames=' archive_expsym_cmds='if test DEF = "`$SED -n -e '\''s/^[ ]*//'\'' -e '\''/^\(;.*\)*$/d'\'' -e '\''s/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p'\'' -e q $export_symbols`" ; then cp "$export_symbols" "$output_objdir/$soname.def"; echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp"; else $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp; fi~ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ linknames=' # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, )='true' enable_shared_with_static_runtimes=yes exclude_expsyms='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1,DATA/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols' # Don't use ranlib old_postinstall_cmds='chmod 644 $oldlib' postlink_cmds='lt_outputfile="@OUTPUT@"~ lt_tool_outputfile="@TOOL_OUTPUT@"~ case $lt_outputfile in *.exe|*.EXE) ;; *) lt_outputfile=$lt_outputfile.exe lt_tool_outputfile=$lt_tool_outputfile.exe ;; esac~ if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; $RM "$lt_outputfile.manifest"; fi' ;; *) # Assume MSVC wrapper hardcode_libdir_flag_spec=' ' allow_undefined_flag=unsupported # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=.dll # FIXME: Setting linknames here is a bad hack. archive_cmds='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' # The linker will automatically build a .lib file if we build a DLL. old_archive_from_new_cmds='true' # FIXME: Should let the user specify the lib program. old_archive_cmds='lib -OUT:$oldlib$oldobjs$old_deplibs' enable_shared_with_static_runtimes=yes ;; esac ;; darwin* | rhapsody*) archive_cmds_need_lc=no hardcode_direct=no hardcode_automatic=yes hardcode_shlibpath_var=unsupported if test yes = "$lt_cv_ld_force_load"; then whole_archive_flag_spec='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience $wl-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' else whole_archive_flag_spec='' fi link_all_deplibs=yes allow_undefined_flag=$_lt_dar_allow_undefined case $cc_basename in ifort*|nagfor*) _lt_dar_can_shared=yes ;; *) _lt_dar_can_shared=$GCC ;; esac if test yes = "$_lt_dar_can_shared"; then output_verbose_link_cmd=func_echo_all archive_cmds="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dsymutil" module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dsymutil" archive_expsym_cmds="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dar_export_syms$_lt_dsymutil" module_expsym_cmds="sed -e 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dar_export_syms$_lt_dsymutil" else ld_shlibs=no fi ;; dgux*) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec='-L$libdir' hardcode_shlibpath_var=no ;; # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor # support. Future versions do this automatically, but an explicit c++rt0.o # does not break anything, and helps significantly (at the cost of a little # extra space). freebsd2.2*) archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes hardcode_shlibpath_var=no ;; # Unfortunately, older versions of FreeBSD 2 do not have this feature. freebsd2.*) archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=yes hardcode_minus_L=yes hardcode_shlibpath_var=no ;; # FreeBSD 3 and greater uses gcc -shared to do shared libraries. freebsd* | dragonfly*) archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes hardcode_shlibpath_var=no ;; hpux9*) if test yes = "$GCC"; then archive_cmds='$RM $output_objdir/$soname~$CC -shared $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' else archive_cmds='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' fi hardcode_libdir_flag_spec='$wl+b $wl$libdir' hardcode_libdir_separator=: hardcode_direct=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes export_dynamic_flag_spec='$wl-E' ;; hpux10*) if test yes,no = "$GCC,$with_gnu_ld"; then archive_cmds='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' fi if test no = "$with_gnu_ld"; then hardcode_libdir_flag_spec='$wl+b $wl$libdir' hardcode_libdir_separator=: hardcode_direct=yes hardcode_direct_absolute=yes export_dynamic_flag_spec='$wl-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes fi ;; hpux11*) if test yes,no = "$GCC,$with_gnu_ld"; then case $host_cpu in hppa*64*) archive_cmds='$CC -shared $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) archive_cmds='$CC -shared $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) archive_cmds='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac else case $host_cpu in hppa*64*) archive_cmds='$CC -b $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) archive_cmds='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) # Older versions of the 11.00 compiler do not understand -b yet # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC understands -b" >&5 $as_echo_n "checking if $CC understands -b... " >&6; } if ${lt_cv_prog_compiler__b+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler__b=no save_LDFLAGS=$LDFLAGS LDFLAGS="$LDFLAGS -b" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&5 $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler__b=yes fi else lt_cv_prog_compiler__b=yes fi fi $RM -r conftest* LDFLAGS=$save_LDFLAGS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler__b" >&5 $as_echo "$lt_cv_prog_compiler__b" >&6; } if test yes = "$lt_cv_prog_compiler__b"; then archive_cmds='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' fi ;; esac fi if test no = "$with_gnu_ld"; then hardcode_libdir_flag_spec='$wl+b $wl$libdir' hardcode_libdir_separator=: case $host_cpu in hppa*64*|ia64*) hardcode_direct=no hardcode_shlibpath_var=no ;; *) hardcode_direct=yes hardcode_direct_absolute=yes export_dynamic_flag_spec='$wl-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes ;; esac fi ;; irix5* | irix6* | nonstopux*) if test yes = "$GCC"; then archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' # Try to use the -exported_symbol ld option, if it does not # work, assume that -exports_file does not work either and # implicitly export all symbols. # This should be the same for all languages, so no per-tag cache variable. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $host_os linker accepts -exported_symbol" >&5 $as_echo_n "checking whether the $host_os linker accepts -exported_symbol... " >&6; } if ${lt_cv_irix_exported_symbol+:} false; then : $as_echo_n "(cached) " >&6 else save_LDFLAGS=$LDFLAGS LDFLAGS="$LDFLAGS -shared $wl-exported_symbol ${wl}foo $wl-update_registry $wl/dev/null" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int foo (void) { return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_cv_irix_exported_symbol=yes else lt_cv_irix_exported_symbol=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS=$save_LDFLAGS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_irix_exported_symbol" >&5 $as_echo "$lt_cv_irix_exported_symbol" >&6; } if test yes = "$lt_cv_irix_exported_symbol"; then archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations $wl-exports_file $wl$export_symbols -o $lib' fi link_all_deplibs=no else archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -exports_file $export_symbols -o $lib' fi archive_cmds_need_lc='no' hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' hardcode_libdir_separator=: inherit_rpath=yes link_all_deplibs=yes ;; linux*) case $cc_basename in tcc*) # Fabrice Bellard et al's Tiny C Compiler ld_shlibs=yes archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; netbsd* | netbsdelf*-gnu) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out else archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF fi hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes hardcode_shlibpath_var=no ;; newsos6) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=yes hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' hardcode_libdir_separator=: hardcode_shlibpath_var=no ;; *nto* | *qnx*) ;; openbsd* | bitrig*) if test -f /usr/libexec/ld.so; then hardcode_direct=yes hardcode_shlibpath_var=no hardcode_direct_absolute=yes if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags $wl-retain-symbols-file,$export_symbols' hardcode_libdir_flag_spec='$wl-rpath,$libdir' export_dynamic_flag_spec='$wl-E' else archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec='$wl-rpath,$libdir' fi else ld_shlibs=no fi ;; os2*) hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes allow_undefined_flag=unsupported shrext_cmds=.dll archive_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' archive_expsym_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ prefix_cmds="$SED"~ if test EXPORTS = "`$SED 1q $export_symbols`"; then prefix_cmds="$prefix_cmds -e 1d"; fi~ prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' old_archive_From_new_cmds='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' enable_shared_with_static_runtimes=yes ;; osf3*) if test yes = "$GCC"; then allow_undefined_flag=' $wl-expect_unresolved $wl\*' archive_cmds='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' else allow_undefined_flag=' -expect_unresolved \*' archive_cmds='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' fi archive_cmds_need_lc='no' hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' hardcode_libdir_separator=: ;; osf4* | osf5*) # as osf3* with the addition of -msym flag if test yes = "$GCC"; then allow_undefined_flag=' $wl-expect_unresolved $wl\*' archive_cmds='$CC -shared$allow_undefined_flag $pic_flag $libobjs $deplibs $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' else allow_undefined_flag=' -expect_unresolved \*' archive_cmds='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ $CC -shared$allow_undefined_flag $wl-input $wl$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~$RM $lib.exp' # Both c and cxx compiler support -rpath directly hardcode_libdir_flag_spec='-rpath $libdir' fi archive_cmds_need_lc='no' hardcode_libdir_separator=: ;; solaris*) no_undefined_flag=' -z defs' if test yes = "$GCC"; then wlarc='$wl' archive_cmds='$CC -shared $pic_flag $wl-z ${wl}text $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -shared $pic_flag $wl-z ${wl}text $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' else case `$CC -V 2>&1` in *"Compilers 5.0"*) wlarc='' archive_cmds='$LD -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $linker_flags' archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $LD -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' ;; *) wlarc='$wl' archive_cmds='$CC -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' ;; esac fi hardcode_libdir_flag_spec='-R$libdir' hardcode_shlibpath_var=no case $host_os in solaris2.[0-5] | solaris2.[0-5].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands '-z linker_flag'. GCC discards it without '$wl', # but is careful enough not to reorder. # Supported since Solaris 2.6 (maybe 2.5.1?) if test yes = "$GCC"; then whole_archive_flag_spec='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract' else whole_archive_flag_spec='-z allextract$convenience -z defaultextract' fi ;; esac link_all_deplibs=yes ;; sunos4*) if test sequent = "$host_vendor"; then # Use $CC to link under sequent, because it throws in some extra .o # files that make .init and .fini sections work. archive_cmds='$CC -G $wl-h $soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' fi hardcode_libdir_flag_spec='-L$libdir' hardcode_direct=yes hardcode_minus_L=yes hardcode_shlibpath_var=no ;; sysv4) case $host_vendor in sni) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=yes # is this really true??? ;; siemens) ## LD is ld it makes a PLAMLIB ## CC just makes a GrossModule. archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags' reload_cmds='$CC -r -o $output$reload_objs' hardcode_direct=no ;; motorola) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=no #Motorola manual says yes, but my tests say they lie ;; esac runpath_var='LD_RUN_PATH' hardcode_shlibpath_var=no ;; sysv4.3*) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_shlibpath_var=no export_dynamic_flag_spec='-Bexport' ;; sysv4*MP*) if test -d /usr/nec; then archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_shlibpath_var=no runpath_var=LD_RUN_PATH hardcode_runpath_var=yes ld_shlibs=yes fi ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) no_undefined_flag='$wl-z,text' archive_cmds_need_lc=no hardcode_shlibpath_var=no runpath_var='LD_RUN_PATH' if test yes = "$GCC"; then archive_cmds='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We CANNOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. no_undefined_flag='$wl-z,text' allow_undefined_flag='$wl-z,nodefs' archive_cmds_need_lc=no hardcode_shlibpath_var=no hardcode_libdir_flag_spec='$wl-R,$libdir' hardcode_libdir_separator=':' link_all_deplibs=yes export_dynamic_flag_spec='$wl-Bexport' runpath_var='LD_RUN_PATH' if test yes = "$GCC"; then archive_cmds='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; uts4*) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec='-L$libdir' hardcode_shlibpath_var=no ;; *) ld_shlibs=no ;; esac if test sni = "$host_vendor"; then case $host in sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) export_dynamic_flag_spec='$wl-Blargedynsym' ;; esac fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs" >&5 $as_echo "$ld_shlibs" >&6; } test no = "$ld_shlibs" && can_build_shared=no with_gnu_ld=$with_gnu_ld # # Do we need to explicitly link libc? # case "x$archive_cmds_need_lc" in x|xyes) # Assume -lc should be added archive_cmds_need_lc=yes if test yes,yes = "$GCC,$enable_shared"; then case $archive_cmds in *'~'*) # FIXME: we may have to deal with multi-command sequences. ;; '$CC '*) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 $as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } if ${lt_cv_archive_cmds_need_lc+:} false; then : $as_echo_n "(cached) " >&6 else $RM conftest* echo "$lt_simple_compile_test_code" > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } 2>conftest.err; then soname=conftest lib=conftest libobjs=conftest.$ac_objext deplibs= wl=$lt_prog_compiler_wl pic_flag=$lt_prog_compiler_pic compiler_flags=-v linker_flags=-v verstring= output_objdir=. libname=conftest lt_save_allow_undefined_flag=$allow_undefined_flag allow_undefined_flag= if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 (eval $archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } then lt_cv_archive_cmds_need_lc=no else lt_cv_archive_cmds_need_lc=yes fi allow_undefined_flag=$lt_save_allow_undefined_flag else cat conftest.err 1>&5 fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc" >&5 $as_echo "$lt_cv_archive_cmds_need_lc" >&6; } archive_cmds_need_lc=$lt_cv_archive_cmds_need_lc ;; esac fi ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 $as_echo_n "checking dynamic linker characteristics... " >&6; } if test yes = "$GCC"; then case $host_os in darwin*) lt_awk_arg='/^libraries:/,/LR/' ;; *) lt_awk_arg='/^libraries:/' ;; esac case $host_os in mingw* | cegcc*) lt_sed_strip_eq='s|=\([A-Za-z]:\)|\1|g' ;; *) lt_sed_strip_eq='s|=/|/|g' ;; esac lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` case $lt_search_path_spec in *\;*) # if the path contains ";" then we assume it to be the separator # otherwise default to the standard path separator (i.e. ":") - it is # assumed that no part of a normal pathname contains ";" but that should # okay in the real world where ";" in dirpaths is itself problematic. lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'` ;; *) lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"` ;; esac # Ok, now we have the path, separated by spaces, we can step through it # and add multilib dir if necessary... lt_tmp_lt_search_path_spec= lt_multi_os_dir=/`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` # ...but if some path component already ends with the multilib dir we assume # that all is fine and trust -print-search-dirs as is (GCC 4.2? or newer). case "$lt_multi_os_dir; $lt_search_path_spec " in "/; "* | "/.; "* | "/./; "* | *"$lt_multi_os_dir "* | *"$lt_multi_os_dir/ "*) lt_multi_os_dir= ;; esac for lt_sys_path in $lt_search_path_spec; do if test -d "$lt_sys_path$lt_multi_os_dir"; then lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path$lt_multi_os_dir" elif test -n "$lt_multi_os_dir"; then test -d "$lt_sys_path" && \ lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" fi done lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk ' BEGIN {RS = " "; FS = "/|\n";} { lt_foo = ""; lt_count = 0; for (lt_i = NF; lt_i > 0; lt_i--) { if ($lt_i != "" && $lt_i != ".") { if ($lt_i == "..") { lt_count++; } else { if (lt_count == 0) { lt_foo = "/" $lt_i lt_foo; } else { lt_count--; } } } } if (lt_foo != "") { lt_freq[lt_foo]++; } if (lt_freq[lt_foo] == 1) { print lt_foo; } }'` # AWK program above erroneously prepends '/' to C:/dos/paths # for these hosts. case $host_os in mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ $SED 's|/\([A-Za-z]:\)|\1|g'` ;; esac sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` else sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" fi library_names_spec= libname_spec='lib$name' soname_spec= shrext_cmds=.so postinstall_cmds= postuninstall_cmds= finish_cmds= finish_eval= shlibpath_var= shlibpath_overrides_runpath=unknown version_type=none dynamic_linker="$host_os ld.so" sys_lib_dlsearch_path_spec="/lib /usr/lib" need_lib_prefix=unknown hardcode_into_libs=no # when you set need_version to no, make sure it does not cause -set_version # flags to be left without arguments need_version=unknown case $host_os in aix3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$release$shared_ext$versuffix $libname.a' shlibpath_var=LIBPATH # AIX 3 has no versioning support, so we append a major version to the name. soname_spec='$libname$release$shared_ext$major' ;; aix[4-9]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no hardcode_into_libs=yes if test ia64 = "$host_cpu"; then # AIX 5 supports IA64 library_names_spec='$libname$release$shared_ext$major $libname$release$shared_ext$versuffix $libname$shared_ext' shlibpath_var=LD_LIBRARY_PATH else # With GCC up to 2.95.x, collect2 would create an import file # for dependence libraries. The import file would start with # the line '#! .'. This would cause the generated library to # depend on '.', always an invalid library. This was fixed in # development snapshots of GCC prior to 3.0. case $host_os in aix4 | aix4.[01] | aix4.[01].*) if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' echo ' yes ' echo '#endif'; } | $CC -E - | $GREP yes > /dev/null; then : else can_build_shared=no fi ;; esac # Using Import Files as archive members, it is possible to support # filename-based versioning of shared library archives on AIX. While # this would work for both with and without runtime linking, it will # prevent static linking of such archives. So we do filename-based # shared library versioning with .so extension only, which is used # when both runtime linking and shared linking is enabled. # Unfortunately, runtime linking may impact performance, so we do # not want this to be the default eventually. Also, we use the # versioned .so libs for executables only if there is the -brtl # linker flag in LDFLAGS as well, or --with-aix-soname=svr4 only. # To allow for filename-based versioning support, we need to create # libNAME.so.V as an archive file, containing: # *) an Import File, referring to the versioned filename of the # archive as well as the shared archive member, telling the # bitwidth (32 or 64) of that shared object, and providing the # list of exported symbols of that shared object, eventually # decorated with the 'weak' keyword # *) the shared object with the F_LOADONLY flag set, to really avoid # it being seen by the linker. # At run time we better use the real file rather than another symlink, # but for link time we create the symlink libNAME.so -> libNAME.so.V case $with_aix_soname,$aix_use_runtimelinking in # AIX (on Power*) has no versioning support, so currently we cannot hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. aix,yes) # traditional libtool dynamic_linker='AIX unversionable lib.so' # If using run time linking (on AIX 4.2 or later) use lib.so # instead of lib.a to let people know that these are not # typical AIX shared libraries. library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' ;; aix,no) # traditional AIX only dynamic_linker='AIX lib.a(lib.so.V)' # We preserve .a as extension for shared libraries through AIX4.2 # and later when we are not doing run time linking. library_names_spec='$libname$release.a $libname.a' soname_spec='$libname$release$shared_ext$major' ;; svr4,*) # full svr4 only dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o)" library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' # We do not specify a path in Import Files, so LIBPATH fires. shlibpath_overrides_runpath=yes ;; *,yes) # both, prefer svr4 dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o), lib.a(lib.so.V)" library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' # unpreferred sharedlib libNAME.a needs extra handling postinstall_cmds='test -n "$linkname" || linkname="$realname"~func_stripname "" ".so" "$linkname"~$install_shared_prog "$dir/$func_stripname_result.$libext" "$destdir/$func_stripname_result.$libext"~test -z "$tstripme" || test -z "$striplib" || $striplib "$destdir/$func_stripname_result.$libext"' postuninstall_cmds='for n in $library_names $old_library; do :; done~func_stripname "" ".so" "$n"~test "$func_stripname_result" = "$n" || func_append rmfiles " $odir/$func_stripname_result.$libext"' # We do not specify a path in Import Files, so LIBPATH fires. shlibpath_overrides_runpath=yes ;; *,no) # both, prefer aix dynamic_linker="AIX lib.a(lib.so.V), lib.so.V($shared_archive_member_spec.o)" library_names_spec='$libname$release.a $libname.a' soname_spec='$libname$release$shared_ext$major' # unpreferred sharedlib libNAME.so.V and symlink libNAME.so need extra handling postinstall_cmds='test -z "$dlname" || $install_shared_prog $dir/$dlname $destdir/$dlname~test -z "$tstripme" || test -z "$striplib" || $striplib $destdir/$dlname~test -n "$linkname" || linkname=$realname~func_stripname "" ".a" "$linkname"~(cd "$destdir" && $LN_S -f $dlname $func_stripname_result.so)' postuninstall_cmds='test -z "$dlname" || func_append rmfiles " $odir/$dlname"~for n in $old_library $library_names; do :; done~func_stripname "" ".a" "$n"~func_append rmfiles " $odir/$func_stripname_result.so"' ;; esac shlibpath_var=LIBPATH fi ;; amigaos*) case $host_cpu in powerpc) # Since July 2007 AmigaOS4 officially supports .so libraries. # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' ;; m68k) library_names_spec='$libname.ixlibrary $libname.a' # Create ${libname}_ixlibrary.a entries in /sys/libs. finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ;; esac ;; beos*) library_names_spec='$libname$shared_ext' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; bsdi[45]*) version_type=linux # correct to gnu/linux during the next big refactor need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" # the default ld.so.conf also contains /usr/contrib/lib and # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow # libtool to hard-code these into programs ;; cygwin* | mingw* | pw32* | cegcc*) version_type=windows shrext_cmds=.dll need_version=no need_lib_prefix=no case $GCC,$cc_basename in yes,*) # gcc library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \$file`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname~ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; fi' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes case $host_os in cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' soname_spec='`echo $libname | sed -e 's/^lib/cyg/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api" ;; mingw* | cegcc*) # MinGW DLLs use traditional 'lib' prefix soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' library_names_spec='`echo $libname | sed -e 's/^lib/pw/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' ;; esac dynamic_linker='Win32 ld.exe' ;; *,cl*) # Native MSVC libname_spec='$name' soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' library_names_spec='$libname.dll.lib' case $build_os in mingw*) sys_lib_search_path_spec= lt_save_ifs=$IFS IFS=';' for lt_path in $LIB do IFS=$lt_save_ifs # Let DOS variable expansion print the short 8.3 style file name. lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" done IFS=$lt_save_ifs # Convert to MSYS style. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'` ;; cygwin*) # Convert to unix form, then to dos form, then back to unix form # but this time dos style (no spaces!) so that the unix form looks # like /cygdrive/c/PROGRA~1:/cygdr... sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` ;; *) sys_lib_search_path_spec=$LIB if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then # It is most probably a Windows format PATH. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi # FIXME: find the short name or the path components, as spaces are # common. (e.g. "Program Files" -> "PROGRA~1") ;; esac # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \$file`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes dynamic_linker='Win32 link.exe' ;; *) # Assume MSVC wrapper library_names_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext $libname.lib' dynamic_linker='Win32 ld.exe' ;; esac # FIXME: first we should search . and the directory the executable is in shlibpath_var=PATH ;; darwin* | rhapsody*) dynamic_linker="$host_os dyld" version_type=darwin need_lib_prefix=no need_version=no library_names_spec='$libname$release$major$shared_ext $libname$shared_ext' soname_spec='$libname$release$major$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib" sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ;; dgux*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH ;; freebsd* | dragonfly*) # DragonFly does not have aout. When/if they implement a new # versioning mechanism, adjust this. if test -x /usr/bin/objformat; then objformat=`/usr/bin/objformat` else case $host_os in freebsd[23].*) objformat=aout ;; *) objformat=elf ;; esac fi version_type=freebsd-$objformat case $version_type in freebsd-elf*) library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' need_version=no need_lib_prefix=no ;; freebsd-*) library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' need_version=yes ;; esac shlibpath_var=LD_LIBRARY_PATH case $host_os in freebsd2.*) shlibpath_overrides_runpath=yes ;; freebsd3.[01]* | freebsdelf3.[01]*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; *) # from 4.6 on, and DragonFly shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; esac ;; haiku*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no dynamic_linker="$host_os runtime_loader" library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LIBRARY_PATH shlibpath_overrides_runpath=no sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' hardcode_into_libs=yes ;; hpux9* | hpux10* | hpux11*) # Give a soname corresponding to the major version so that dld.sl refuses to # link against other versions. version_type=sunos need_lib_prefix=no need_version=no case $host_cpu in ia64*) shrext_cmds='.so' hardcode_into_libs=yes dynamic_linker="$host_os dld.so" shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' if test 32 = "$HPUX_IA64_MODE"; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" sys_lib_dlsearch_path_spec=/usr/lib/hpux32 else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" sys_lib_dlsearch_path_spec=/usr/lib/hpux64 fi ;; hppa*64*) shrext_cmds='.sl' hardcode_into_libs=yes dynamic_linker="$host_os dld.sl" shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; *) shrext_cmds='.sl' dynamic_linker="$host_os dld.sl" shlibpath_var=SHLIB_PATH shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' ;; esac # HP-UX runs *really* slowly unless shared libraries are mode 555, ... postinstall_cmds='chmod 555 $lib' # or fails outright, so override atomically: install_override_mode=555 ;; interix[3-9]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; *) if test yes = "$lt_cv_prog_gnu_ld"; then version_type=linux # correct to gnu/linux during the next big refactor else version_type=irix fi ;; esac need_lib_prefix=no need_version=no soname_spec='$libname$release$shared_ext$major' library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$release$shared_ext $libname$shared_ext' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in # libtool.m4 will add one of these switches to LD *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= libmagic=32-bit;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 libmagic=64-bit;; *) libsuff= shlibsuff= libmagic=never-match;; esac ;; esac shlibpath_var=LD_LIBRARY${shlibsuff}_PATH shlibpath_overrides_runpath=no sys_lib_search_path_spec="/usr/lib$libsuff /lib$libsuff /usr/local/lib$libsuff" sys_lib_dlsearch_path_spec="/usr/lib$libsuff /lib$libsuff" hardcode_into_libs=yes ;; # No shared lib support for Linux oldld, aout, or coff. linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; linux*android*) version_type=none # Android doesn't support versioned libraries. need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext' soname_spec='$libname$release$shared_ext' finish_cmds= shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes dynamic_linker='Android linker' # Don't embed -rpath directories since the linker doesn't support them. hardcode_libdir_flag_spec='-L$libdir' ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no # Some binutils ld are patched to set DT_RUNPATH if ${lt_cv_shlibpath_overrides_runpath+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_shlibpath_overrides_runpath=no save_LDFLAGS=$LDFLAGS save_libdir=$libdir eval "libdir=/foo; wl=\"$lt_prog_compiler_wl\"; \ LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec\"" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then : lt_cv_shlibpath_overrides_runpath=yes fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS=$save_LDFLAGS libdir=$save_libdir fi shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes # Ideally, we could use ldconfig to report *all* directores which are # searched for libraries, however this is still not possible. Aside from not # being certain /sbin/ldconfig is available, command # 'ldconfig -N -X -v | grep ^/' on 64bit Fedora does not report /usr/lib64, # even though it is searched at run-time. Try to do the best guess by # appending ld.so.conf contents (and includes) to the search path. if test -f /etc/ld.so.conf; then lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" fi # We used to test for /lib/ld.so.1 and disable shared libraries on # powerpc, because MkLinux only supported shared libraries with the # GNU dynamic linker. Since this was broken with cross compilers, # most powerpc-linux boxes support dynamic linking these days and # people can always --disable-shared, the test was removed, and we # assume the GNU/Linux dynamic linker is in use. dynamic_linker='GNU/Linux ld.so' ;; netbsdelf*-gnu) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='NetBSD ld.elf_so' ;; netbsd*) version_type=sunos need_lib_prefix=no need_version=no if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' dynamic_linker='NetBSD ld.elf_so' fi shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; newsos6) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; *nto* | *qnx*) version_type=qnx need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='ldqnx.so' ;; openbsd* | bitrig*) version_type=sunos sys_lib_dlsearch_path_spec=/usr/lib need_lib_prefix=no if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then need_version=no else need_version=yes fi library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; os2*) libname_spec='$name' version_type=windows shrext_cmds=.dll need_version=no need_lib_prefix=no # OS/2 can only load a DLL with a base name of 8 characters or less. soname_spec='`test -n "$os2dllname" && libname="$os2dllname"; v=$($ECHO $release$versuffix | tr -d .-); n=$($ECHO $libname | cut -b -$((8 - ${#v})) | tr . _); $ECHO $n$v`$shared_ext' library_names_spec='${libname}_dll.$libext' dynamic_linker='OS/2 ld.exe' shlibpath_var=BEGINLIBPATH sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec postinstall_cmds='base_file=`basename \$file`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; $ECHO \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname~ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; fi' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; $ECHO \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' ;; osf3* | osf4* | osf5*) version_type=osf need_lib_prefix=no need_version=no soname_spec='$libname$release$shared_ext$major' library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; rdos*) dynamic_linker=no ;; solaris*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes # ldd complains unless libraries are executable postinstall_cmds='chmod +x $lib' ;; sunos4*) version_type=sunos library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes if test yes = "$with_gnu_ld"; then need_lib_prefix=no fi need_version=yes ;; sysv4 | sysv4.3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) shlibpath_overrides_runpath=no need_lib_prefix=no runpath_var=LD_RUN_PATH ;; siemens) need_lib_prefix=no ;; motorola) need_lib_prefix=no need_version=no shlibpath_overrides_runpath=no sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' ;; esac ;; sysv4*MP*) if test -d /usr/nec; then version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$shared_ext.$versuffix $libname$shared_ext.$major $libname$shared_ext' soname_spec='$libname$shared_ext.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) version_type=sco need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes if test yes = "$with_gnu_ld"; then sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' else sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' case $host_os in sco3.2v5*) sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" ;; esac fi sys_lib_dlsearch_path_spec='/usr/lib' ;; tpf*) # TPF is a cross-target only. Preferred cross-host = GNU/Linux. version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; uts4*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH ;; *) dynamic_linker=no ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 $as_echo "$dynamic_linker" >&6; } test no = "$dynamic_linker" && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test yes = "$GCC"; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi if test set = "${lt_cv_sys_lib_search_path_spec+set}"; then sys_lib_search_path_spec=$lt_cv_sys_lib_search_path_spec fi if test set = "${lt_cv_sys_lib_dlsearch_path_spec+set}"; then sys_lib_dlsearch_path_spec=$lt_cv_sys_lib_dlsearch_path_spec fi # remember unaugmented sys_lib_dlsearch_path content for libtool script decls... configure_time_dlsearch_path=$sys_lib_dlsearch_path_spec # ... but it needs LT_SYS_LIBRARY_PATH munging for other configure-time code func_munge_path_list sys_lib_dlsearch_path_spec "$LT_SYS_LIBRARY_PATH" # to be used as default LT_SYS_LIBRARY_PATH value in generated libtool configure_time_lt_sys_library_path=$LT_SYS_LIBRARY_PATH { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 $as_echo_n "checking how to hardcode library paths into programs... " >&6; } hardcode_action= if test -n "$hardcode_libdir_flag_spec" || test -n "$runpath_var" || test yes = "$hardcode_automatic"; then # We can hardcode non-existent directories. if test no != "$hardcode_direct" && # If the only mechanism to avoid hardcoding is shlibpath_var, we # have to relink, otherwise we might link with an installed library # when we should be linking with a yet-to-be-installed one ## test no != "$_LT_TAGVAR(hardcode_shlibpath_var, )" && test no != "$hardcode_minus_L"; then # Linking always hardcodes the temporary library directory. hardcode_action=relink else # We can link without hardcoding, and we can hardcode nonexisting dirs. hardcode_action=immediate fi else # We cannot hardcode anything, or else we can only hardcode existing # directories. hardcode_action=unsupported fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action" >&5 $as_echo "$hardcode_action" >&6; } if test relink = "$hardcode_action" || test yes = "$inherit_rpath"; then # Fast installation is not supported enable_fast_install=no elif test yes = "$shlibpath_overrides_runpath" || test no = "$enable_shared"; then # Fast installation is not necessary enable_fast_install=needless fi if test yes != "$enable_dlopen"; then enable_dlopen=unknown enable_dlopen_self=unknown enable_dlopen_self_static=unknown else lt_cv_dlopen=no lt_cv_dlopen_libs= case $host_os in beos*) lt_cv_dlopen=load_add_on lt_cv_dlopen_libs= lt_cv_dlopen_self=yes ;; mingw* | pw32* | cegcc*) lt_cv_dlopen=LoadLibrary lt_cv_dlopen_libs= ;; cygwin*) lt_cv_dlopen=dlopen lt_cv_dlopen_libs= ;; darwin*) # if libdl is installed we need to link against it { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 $as_echo_n "checking for dlopen in -ldl... " >&6; } if ${ac_cv_lib_dl_dlopen+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dlopen (); int main () { return dlopen (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dl_dlopen=yes else ac_cv_lib_dl_dlopen=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 $as_echo "$ac_cv_lib_dl_dlopen" >&6; } if test "x$ac_cv_lib_dl_dlopen" = xyes; then : lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl else lt_cv_dlopen=dyld lt_cv_dlopen_libs= lt_cv_dlopen_self=yes fi ;; tpf*) # Don't try to run any link tests for TPF. We know it's impossible # because TPF is a cross-compiler, and we know how we open DSOs. lt_cv_dlopen=dlopen lt_cv_dlopen_libs= lt_cv_dlopen_self=no ;; *) ac_fn_c_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load" if test "x$ac_cv_func_shl_load" = xyes; then : lt_cv_dlopen=shl_load else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5 $as_echo_n "checking for shl_load in -ldld... " >&6; } if ${ac_cv_lib_dld_shl_load+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldld $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char shl_load (); int main () { return shl_load (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dld_shl_load=yes else ac_cv_lib_dld_shl_load=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5 $as_echo "$ac_cv_lib_dld_shl_load" >&6; } if test "x$ac_cv_lib_dld_shl_load" = xyes; then : lt_cv_dlopen=shl_load lt_cv_dlopen_libs=-ldld else ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen" if test "x$ac_cv_func_dlopen" = xyes; then : lt_cv_dlopen=dlopen else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 $as_echo_n "checking for dlopen in -ldl... " >&6; } if ${ac_cv_lib_dl_dlopen+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dlopen (); int main () { return dlopen (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dl_dlopen=yes else ac_cv_lib_dl_dlopen=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 $as_echo "$ac_cv_lib_dl_dlopen" >&6; } if test "x$ac_cv_lib_dl_dlopen" = xyes; then : lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5 $as_echo_n "checking for dlopen in -lsvld... " >&6; } if ${ac_cv_lib_svld_dlopen+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lsvld $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dlopen (); int main () { return dlopen (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_svld_dlopen=yes else ac_cv_lib_svld_dlopen=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5 $as_echo "$ac_cv_lib_svld_dlopen" >&6; } if test "x$ac_cv_lib_svld_dlopen" = xyes; then : lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-lsvld else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5 $as_echo_n "checking for dld_link in -ldld... " >&6; } if ${ac_cv_lib_dld_dld_link+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldld $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dld_link (); int main () { return dld_link (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dld_dld_link=yes else ac_cv_lib_dld_dld_link=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5 $as_echo "$ac_cv_lib_dld_dld_link" >&6; } if test "x$ac_cv_lib_dld_dld_link" = xyes; then : lt_cv_dlopen=dld_link lt_cv_dlopen_libs=-ldld fi fi fi fi fi fi ;; esac if test no = "$lt_cv_dlopen"; then enable_dlopen=no else enable_dlopen=yes fi case $lt_cv_dlopen in dlopen) save_CPPFLAGS=$CPPFLAGS test yes = "$ac_cv_header_dlfcn_h" && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" save_LDFLAGS=$LDFLAGS wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" save_LIBS=$LIBS LIBS="$lt_cv_dlopen_libs $LIBS" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5 $as_echo_n "checking whether a program can dlopen itself... " >&6; } if ${lt_cv_dlopen_self+:} false; then : $as_echo_n "(cached) " >&6 else if test yes = "$cross_compiling"; then : lt_cv_dlopen_self=cross else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF #line $LINENO "configure" #include "confdefs.h" #if HAVE_DLFCN_H #include #endif #include #ifdef RTLD_GLOBAL # define LT_DLGLOBAL RTLD_GLOBAL #else # ifdef DL_GLOBAL # define LT_DLGLOBAL DL_GLOBAL # else # define LT_DLGLOBAL 0 # endif #endif /* We may have to define LT_DLLAZY_OR_NOW in the command line if we find out it does not work in some platform. */ #ifndef LT_DLLAZY_OR_NOW # ifdef RTLD_LAZY # define LT_DLLAZY_OR_NOW RTLD_LAZY # else # ifdef DL_LAZY # define LT_DLLAZY_OR_NOW DL_LAZY # else # ifdef RTLD_NOW # define LT_DLLAZY_OR_NOW RTLD_NOW # else # ifdef DL_NOW # define LT_DLLAZY_OR_NOW DL_NOW # else # define LT_DLLAZY_OR_NOW 0 # endif # endif # endif # endif #endif /* When -fvisibility=hidden is used, assume the code has been annotated correspondingly for the symbols needed. */ #if defined __GNUC__ && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) int fnord () __attribute__((visibility("default"))); #endif int fnord () { return 42; } int main () { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); int status = $lt_dlunknown; if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; else { if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; else puts (dlerror ()); } /* dlclose (self); */ } else puts (dlerror ()); return status; } _LT_EOF if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s "conftest$ac_exeext" 2>/dev/null; then (./conftest; exit; ) >&5 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;; x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;; x$lt_dlunknown|x*) lt_cv_dlopen_self=no ;; esac else : # compilation failed lt_cv_dlopen_self=no fi fi rm -fr conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5 $as_echo "$lt_cv_dlopen_self" >&6; } if test yes = "$lt_cv_dlopen_self"; then wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5 $as_echo_n "checking whether a statically linked program can dlopen itself... " >&6; } if ${lt_cv_dlopen_self_static+:} false; then : $as_echo_n "(cached) " >&6 else if test yes = "$cross_compiling"; then : lt_cv_dlopen_self_static=cross else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF #line $LINENO "configure" #include "confdefs.h" #if HAVE_DLFCN_H #include #endif #include #ifdef RTLD_GLOBAL # define LT_DLGLOBAL RTLD_GLOBAL #else # ifdef DL_GLOBAL # define LT_DLGLOBAL DL_GLOBAL # else # define LT_DLGLOBAL 0 # endif #endif /* We may have to define LT_DLLAZY_OR_NOW in the command line if we find out it does not work in some platform. */ #ifndef LT_DLLAZY_OR_NOW # ifdef RTLD_LAZY # define LT_DLLAZY_OR_NOW RTLD_LAZY # else # ifdef DL_LAZY # define LT_DLLAZY_OR_NOW DL_LAZY # else # ifdef RTLD_NOW # define LT_DLLAZY_OR_NOW RTLD_NOW # else # ifdef DL_NOW # define LT_DLLAZY_OR_NOW DL_NOW # else # define LT_DLLAZY_OR_NOW 0 # endif # endif # endif # endif #endif /* When -fvisibility=hidden is used, assume the code has been annotated correspondingly for the symbols needed. */ #if defined __GNUC__ && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) int fnord () __attribute__((visibility("default"))); #endif int fnord () { return 42; } int main () { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); int status = $lt_dlunknown; if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; else { if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; else puts (dlerror ()); } /* dlclose (self); */ } else puts (dlerror ()); return status; } _LT_EOF if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s "conftest$ac_exeext" 2>/dev/null; then (./conftest; exit; ) >&5 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;; x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;; x$lt_dlunknown|x*) lt_cv_dlopen_self_static=no ;; esac else : # compilation failed lt_cv_dlopen_self_static=no fi fi rm -fr conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static" >&5 $as_echo "$lt_cv_dlopen_self_static" >&6; } fi CPPFLAGS=$save_CPPFLAGS LDFLAGS=$save_LDFLAGS LIBS=$save_LIBS ;; esac case $lt_cv_dlopen_self in yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; *) enable_dlopen_self=unknown ;; esac case $lt_cv_dlopen_self_static in yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; *) enable_dlopen_self_static=unknown ;; esac fi striplib= old_striplib= { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible" >&5 $as_echo_n "checking whether stripping libraries is possible... " >&6; } if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" test -z "$striplib" && striplib="$STRIP --strip-unneeded" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else # FIXME - insert some real tests, host_os isn't really good enough case $host_os in darwin*) if test -n "$STRIP"; then striplib="$STRIP -x" old_striplib="$STRIP -S" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi ;; *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } ;; esac fi # Report what library types will actually be built { $as_echo "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5 $as_echo_n "checking if libtool supports shared libraries... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5 $as_echo "$can_build_shared" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5 $as_echo_n "checking whether to build shared libraries... " >&6; } test no = "$can_build_shared" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test yes = "$enable_shared" && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[4-9]*) if test ia64 != "$host_cpu"; then case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in yes,aix,yes) ;; # shared object as lib.so file only yes,svr4,*) ;; # shared object as lib.so archive member only yes,*) enable_static=no ;; # shared object in lib.a archive as well esac fi ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5 $as_echo "$enable_shared" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5 $as_echo_n "checking whether to build static libraries... " >&6; } # Make sure either enable_shared or enable_static is yes. test yes = "$enable_shared" || enable_static=yes { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5 $as_echo "$enable_static" >&6; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu CC=$lt_save_CC ac_config_commands="$ac_config_commands libtool" # Only expand once: { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether termios.h defines TIOCGWINSZ" >&5 $as_echo_n "checking whether termios.h defines TIOCGWINSZ... " >&6; } if ${ac_cv_sys_tiocgwinsz_in_termios_h+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #ifdef TIOCGWINSZ yes #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "yes" >/dev/null 2>&1; then : ac_cv_sys_tiocgwinsz_in_termios_h=yes else ac_cv_sys_tiocgwinsz_in_termios_h=no fi rm -f conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_tiocgwinsz_in_termios_h" >&5 $as_echo "$ac_cv_sys_tiocgwinsz_in_termios_h" >&6; } if test $ac_cv_sys_tiocgwinsz_in_termios_h != yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether sys/ioctl.h defines TIOCGWINSZ" >&5 $as_echo_n "checking whether sys/ioctl.h defines TIOCGWINSZ... " >&6; } if ${ac_cv_sys_tiocgwinsz_in_sys_ioctl_h+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #ifdef TIOCGWINSZ yes #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "yes" >/dev/null 2>&1; then : ac_cv_sys_tiocgwinsz_in_sys_ioctl_h=yes else ac_cv_sys_tiocgwinsz_in_sys_ioctl_h=no fi rm -f conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_tiocgwinsz_in_sys_ioctl_h" >&5 $as_echo "$ac_cv_sys_tiocgwinsz_in_sys_ioctl_h" >&6; } if test $ac_cv_sys_tiocgwinsz_in_sys_ioctl_h = yes; then $as_echo "#define GWINSZ_IN_SYS_IOCTL 1" >>confdefs.h fi fi if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args. set dummy ${ac_tool_prefix}pkg-config; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_PKG_CONFIG+:} false; then : $as_echo_n "(cached) " >&6 else case $PKG_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi PKG_CONFIG=$ac_cv_path_PKG_CONFIG if test -n "$PKG_CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKG_CONFIG" >&5 $as_echo "$PKG_CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_path_PKG_CONFIG"; then ac_pt_PKG_CONFIG=$PKG_CONFIG # Extract the first word of "pkg-config", so it can be a program name with args. set dummy pkg-config; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_ac_pt_PKG_CONFIG+:} false; then : $as_echo_n "(cached) " >&6 else case $ac_pt_PKG_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_ac_pt_PKG_CONFIG="$ac_pt_PKG_CONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_ac_pt_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi ac_pt_PKG_CONFIG=$ac_cv_path_ac_pt_PKG_CONFIG if test -n "$ac_pt_PKG_CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_PKG_CONFIG" >&5 $as_echo "$ac_pt_PKG_CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_pt_PKG_CONFIG" = x; then PKG_CONFIG="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac PKG_CONFIG=$ac_pt_PKG_CONFIG fi else PKG_CONFIG="$ac_cv_path_PKG_CONFIG" fi fi if test -n "$PKG_CONFIG"; then _pkg_min_version=0.9.0 { $as_echo "$as_me:${as_lineno-$LINENO}: checking pkg-config is at least version $_pkg_min_version" >&5 $as_echo_n "checking pkg-config is at least version $_pkg_min_version... " >&6; } if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } PKG_CONFIG="" fi fi # Defines MAKEINFO { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether makeinfo supports @clicksequence" >&5 $as_echo_n "checking whether makeinfo supports @clicksequence... " >&6; } if ${pspp_cv_have_clicksequence+:} false; then : $as_echo_n "(cached) " >&6 else cat > conftest.texi <&5" >&5 eval "$MAKEINFO conftest.texi >&5 2>&1" retval=$? echo "configure:16089: \$? = $retval" >&5 if test $retval = 0; then pspp_cv_have_clicksequence=yes else pspp_cv_have_clicksequence=no fi rm -f conftest.texi conftest.info fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $pspp_cv_have_clicksequence" >&5 $as_echo "$pspp_cv_have_clicksequence" >&6; } if test $pspp_cv_have_clicksequence = no; then AM_MAKEINFOFLAGS="$AM_MAKEINFOFLAGS -DMISSING_CLICKSEQUENCE" fi # Defines MAKEINFO { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether makeinfo generates broken DocBook XML" >&5 $as_echo_n "checking whether makeinfo generates broken DocBook XML... " >&6; } if ${pspp_cv_broken_docbook_xml+:} false; then : $as_echo_n "(cached) " >&6 else case $(eval "$MAKEINFO --version | head -1") in #( *texinfo*4.13*) : pspp_cv_broken_docbook_xml=yes ;; #( *texinfo*) : pspp_cv_broken_docbook_xml=no ;; #( *) : pspp_cv_broken_docbook_xml=yes ;; #( *) : ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $pspp_cv_broken_docbook_xml" >&5 $as_echo "$pspp_cv_broken_docbook_xml" >&6; } if test "$pspp_cv_broken_docbook_xml" = yes; then BROKEN_DOCBOOK_XML_TRUE= BROKEN_DOCBOOK_XML_FALSE='#' else BROKEN_DOCBOOK_XML_TRUE='#' BROKEN_DOCBOOK_XML_FALSE= fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dot" >&5 $as_echo_n "checking for dot... " >&6; } if ${pspp_cv_dot+:} false; then : $as_echo_n "(cached) " >&6 else if (dot -V) 2>&1 | grep '^dot - [gG]raphviz version' >/dev/null 2>&1; then pspp_cv_dot=yes else pspp_cv_dot=no fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $pspp_cv_dot" >&5 $as_echo "$pspp_cv_dot" >&6; } if test "$pspp_cv_dot" = yes; then HAVE_DOT_TRUE= HAVE_DOT_FALSE='#' else HAVE_DOT_TRUE='#' HAVE_DOT_FALSE= fi # Check whether --enable-Werror was given. if test "${enable_Werror+set}" = set; then : enableval=$enable_Werror; else enable_Werror=no fi if test x"$GCC" = x"yes" ; then cc_is_gcc_TRUE= cc_is_gcc_FALSE='#' else cc_is_gcc_TRUE='#' cc_is_gcc_FALSE= fi # Put a plausible default for CC_FOR_BUILD in Makefile. if test -z "$CC_FOR_BUILD"; then if test "x$cross_compiling" = "xno"; then CC_FOR_BUILD='$(CC)' else CC_FOR_BUILD=cc fi fi # Also set EXEEXT_FOR_BUILD. if test "x$cross_compiling" = "xno"; then EXEEXT_FOR_BUILD='$(EXEEXT)' else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for build system executable suffix" >&5 $as_echo_n "checking for build system executable suffix... " >&6; } if ${pspp_cv_build_exeext+:} false; then : $as_echo_n "(cached) " >&6 else rm -f conftest* echo 'int main () { return 0; }' > conftest.c pspp_cv_build_exeext= ${CC_FOR_BUILD} -o conftest conftest.c 1>&5 2>&5 for file in conftest.*; do case $file in # ( *.c | *.o | *.obj | *.ilk | *.pdb) ;; # ( *) pspp_cv_build_exeext=`echo $file | sed -e s/conftest//` ;; esac done rm -f conftest* test x"${pspp_cv_build_exeext}" = x && pspp_cv_build_exeext=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $pspp_cv_build_exeext" >&5 $as_echo "$pspp_cv_build_exeext" >&6; } EXEEXT_FOR_BUILD="" test x"${pspp_cv_build_exeext}" != xno && EXEEXT_FOR_BUILD=${pspp_cv_build_exeext} fi # Extract the first word of "perl", so it can be a program name with args. set dummy perl; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_PERL+:} false; then : $as_echo_n "(cached) " >&6 else case $PERL in [\\/]* | ?:[\\/]*) ac_cv_path_PERL="$PERL" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_PERL="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_PERL" && ac_cv_path_PERL="no" ;; esac fi PERL=$ac_cv_path_PERL if test -n "$PERL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PERL" >&5 $as_echo "$PERL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "$PERL" != no && $PERL -e 'require 5.005_03;'; then :; else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: You must install Perl 5.005_03 (or later) before building PSPP." >&5 $as_echo "$as_me: WARNING: You must install Perl 5.005_03 (or later) before building PSPP." >&2;} pspp_required_prereqs="$pspp_required_prereqs Perl 5.005_03 (or later)" fi # The PSPP autobuilder appends a build number to the PSPP version number, # e.g. "0.7.2-build40". But Perl won't parse version numbers that contain # anything other than digits and periods, so "-build" causes an error. So we # define $(VERSION_FOR_PERL) that drops everything from the hyphen onward. VERSION_FOR_PERL=`echo "$VERSION" | sed 's/-.*//'` for ac_prog in python python2 python3 do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_PYTHON+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$PYTHON"; then ac_cv_prog_PYTHON="$PYTHON" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_PYTHON="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi PYTHON=$ac_cv_prog_PYTHON if test -n "$PYTHON"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PYTHON" >&5 $as_echo "$PYTHON" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$PYTHON" && break done test -n "$PYTHON" || PYTHON="none" # This suppresses an error in gl/careadlinkat.c that otherwise can't be # avoided in GCC 10.x: # ../../gl/careadlinkat.c: In function ‘careadlinkat’: # cc1: error: function may return address of local variable CFLAGS="$CFLAGS -DGCC_LINT" if test "X$prefix" = "XNONE"; then acl_final_prefix="$ac_default_prefix" else acl_final_prefix="$prefix" fi if test "X$exec_prefix" = "XNONE"; then acl_final_exec_prefix='${prefix}' else acl_final_exec_prefix="$exec_prefix" fi acl_save_prefix="$prefix" prefix="$acl_final_prefix" eval acl_final_exec_prefix=\"$acl_final_exec_prefix\" prefix="$acl_save_prefix" # Check whether --with-gnu-ld was given. if test "${with_gnu_ld+set}" = set; then : withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes else with_gnu_ld=no fi # Prepare PATH_SEPARATOR. # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then # Determine PATH_SEPARATOR by trying to find /bin/sh in a PATH which # contains only /bin. Note that ksh looks also at the FPATH variable, # so we have to set that as well for the test. PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 \ && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 \ || PATH_SEPARATOR=';' } fi if test -n "$LD"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld" >&5 $as_echo_n "checking for ld... " >&6; } elif test "$GCC" = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 $as_echo_n "checking for ld used by $CC... " >&6; } elif test "$with_gnu_ld" = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 $as_echo_n "checking for GNU ld... " >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 $as_echo_n "checking for non-GNU ld... " >&6; } fi if test -n "$LD"; then # Let the user override the test with a path. : else if ${acl_cv_path_LD+:} false; then : $as_echo_n "(cached) " >&6 else acl_cv_path_LD= # Final result of this test ac_prog=ld # Program to search in $PATH if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. case $host in *-*-mingw*) # gcc leaves a trailing carriage return which upsets mingw acl_output=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) acl_output=`($CC -print-prog-name=ld) 2>&5` ;; esac case $acl_output in # Accept absolute paths. [\\/]* | ?:[\\/]*) re_direlt='/[^/][^/]*/\.\./' # Canonicalize the pathname of ld acl_output=`echo "$acl_output" | sed 's%\\\\%/%g'` while echo "$acl_output" | grep "$re_direlt" > /dev/null 2>&1; do acl_output=`echo $acl_output | sed "s%$re_direlt%/%"` done # Got the pathname. No search in PATH is needed. acl_cv_path_LD="$acl_output" ac_prog= ;; "") # If it fails, then pretend we aren't using GCC. ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac fi if test -n "$ac_prog"; then # Search for $ac_prog in $PATH. acl_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS="$acl_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then acl_cv_path_LD="$ac_dir/$ac_prog" # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some variants of GNU ld only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$acl_cv_path_LD" -v 2>&1 conftest.$ac_ext /* end confdefs.h. */ #if defined __powerpc64__ || defined _ARCH_PPC64 int ok; #else error fail #endif _ACEOF if ac_fn_c_try_compile "$LINENO"; then : # The compiler produces 64-bit code. Add option '-b64' so that the # linker groks 64-bit object files. case "$acl_cv_path_LD " in *" -b64 "*) ;; *) acl_cv_path_LD="$acl_cv_path_LD -b64" ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ;; sparc64-*-netbsd*) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #if defined __sparcv9 || defined __arch64__ int ok; #else error fail #endif _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else # The compiler produces 32-bit code. Add option '-m elf32_sparc' # so that the linker groks 32-bit object files. case "$acl_cv_path_LD " in *" -m elf32_sparc "*) ;; *) acl_cv_path_LD="$acl_cv_path_LD -m elf32_sparc" ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ;; esac fi LD="$acl_cv_path_LD" fi if test -n "$LD"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LD" >&5 $as_echo "$LD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 $as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } if ${acl_cv_prog_gnu_ld+:} false; then : $as_echo_n "(cached) " >&6 else # I'd rather use --version here, but apparently some GNU lds only accept -v. case `$LD -v 2>&1 &5 $as_echo "$acl_cv_prog_gnu_ld" >&6; } with_gnu_ld=$acl_cv_prog_gnu_ld { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shared library run path origin" >&5 $as_echo_n "checking for shared library run path origin... " >&6; } if ${acl_cv_rpath+:} false; then : $as_echo_n "(cached) " >&6 else CC="$CC" GCC="$GCC" LDFLAGS="$LDFLAGS" LD="$LD" with_gnu_ld="$with_gnu_ld" \ ${CONFIG_SHELL-/bin/sh} "$ac_aux_dir/config.rpath" "$host" > conftest.sh . ./conftest.sh rm -f ./conftest.sh acl_cv_rpath=done fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $acl_cv_rpath" >&5 $as_echo "$acl_cv_rpath" >&6; } wl="$acl_cv_wl" acl_libext="$acl_cv_libext" acl_shlibext="$acl_cv_shlibext" acl_libname_spec="$acl_cv_libname_spec" acl_library_names_spec="$acl_cv_library_names_spec" acl_hardcode_libdir_flag_spec="$acl_cv_hardcode_libdir_flag_spec" acl_hardcode_libdir_separator="$acl_cv_hardcode_libdir_separator" acl_hardcode_direct="$acl_cv_hardcode_direct" acl_hardcode_minus_L="$acl_cv_hardcode_minus_L" # Check whether --enable-rpath was given. if test "${enable_rpath+set}" = set; then : enableval=$enable_rpath; : else enable_rpath=yes fi acl_libdirstem=lib acl_libdirstem2= case "$host_os" in solaris*) { $as_echo "$as_me:${as_lineno-$LINENO}: checking for 64-bit host" >&5 $as_echo_n "checking for 64-bit host... " >&6; } if ${gl_cv_solaris_64bit+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef _LP64 sixtyfour bits #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "sixtyfour bits" >/dev/null 2>&1; then : gl_cv_solaris_64bit=yes else gl_cv_solaris_64bit=no fi rm -f conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_solaris_64bit" >&5 $as_echo "$gl_cv_solaris_64bit" >&6; } if test $gl_cv_solaris_64bit = yes; then acl_libdirstem=lib/64 case "$host_cpu" in sparc*) acl_libdirstem2=lib/sparcv9 ;; i*86 | x86_64) acl_libdirstem2=lib/amd64 ;; esac fi ;; *) searchpath=`(LC_ALL=C $CC -print-search-dirs) 2>/dev/null | sed -n -e 's,^libraries: ,,p' | sed -e 's,^=,,'` if test -n "$searchpath"; then acl_save_IFS="${IFS= }"; IFS=":" for searchdir in $searchpath; do if test -d "$searchdir"; then case "$searchdir" in */lib64/ | */lib64 ) acl_libdirstem=lib64 ;; */../ | */.. ) # Better ignore directories of this form. They are misleading. ;; *) searchdir=`cd "$searchdir" && pwd` case "$searchdir" in */lib64 ) acl_libdirstem=lib64 ;; esac ;; esac fi done IFS="$acl_save_IFS" fi ;; esac test -n "$acl_libdirstem2" || acl_libdirstem2="$acl_libdirstem" use_additional=yes acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval additional_includedir=\"$includedir\" eval additional_libdir=\"$libdir\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" # Check whether --with-libiconv-prefix was given. if test "${with_libiconv_prefix+set}" = set; then : withval=$with_libiconv_prefix; if test "X$withval" = "Xno"; then use_additional=no else if test "X$withval" = "X"; then acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval additional_includedir=\"$includedir\" eval additional_libdir=\"$libdir\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" else additional_includedir="$withval/include" additional_libdir="$withval/$acl_libdirstem" if test "$acl_libdirstem2" != "$acl_libdirstem" \ && ! test -d "$withval/$acl_libdirstem"; then additional_libdir="$withval/$acl_libdirstem2" fi fi fi fi LIBICONV= LTLIBICONV= INCICONV= LIBICONV_PREFIX= HAVE_LIBICONV= rpathdirs= ltrpathdirs= names_already_handled= names_next_round='iconv ' while test -n "$names_next_round"; do names_this_round="$names_next_round" names_next_round= for name in $names_this_round; do already_handled= for n in $names_already_handled; do if test "$n" = "$name"; then already_handled=yes break fi done if test -z "$already_handled"; then names_already_handled="$names_already_handled $name" uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./+-|ABCDEFGHIJKLMNOPQRSTUVWXYZ____|'` eval value=\"\$HAVE_LIB$uppername\" if test -n "$value"; then if test "$value" = yes; then eval value=\"\$LIB$uppername\" test -z "$value" || LIBICONV="${LIBICONV}${LIBICONV:+ }$value" eval value=\"\$LTLIB$uppername\" test -z "$value" || LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }$value" else : fi else found_dir= found_la= found_so= found_a= eval libname=\"$acl_libname_spec\" # typically: libname=lib$name if test -n "$acl_shlibext"; then shrext=".$acl_shlibext" # typically: shrext=.so else shrext= fi if test $use_additional = yes; then dir="$additional_libdir" if test -n "$acl_shlibext"; then if test -f "$dir/$libname$shrext"; then found_dir="$dir" found_so="$dir/$libname$shrext" else if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then ver=`(cd "$dir" && \ for f in "$libname$shrext".*; do echo "$f"; done \ | sed -e "s,^$libname$shrext\\\\.,," \ | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \ | sed 1q ) 2>/dev/null` if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then found_dir="$dir" found_so="$dir/$libname$shrext.$ver" fi else eval library_names=\"$acl_library_names_spec\" for f in $library_names; do if test -f "$dir/$f"; then found_dir="$dir" found_so="$dir/$f" break fi done fi fi fi if test "X$found_dir" = "X"; then if test -f "$dir/$libname.$acl_libext"; then found_dir="$dir" found_a="$dir/$libname.$acl_libext" fi fi if test "X$found_dir" != "X"; then if test -f "$dir/$libname.la"; then found_la="$dir/$libname.la" fi fi fi if test "X$found_dir" = "X"; then for x in $LDFLAGS $LTLIBICONV; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" case "$x" in -L*) dir=`echo "X$x" | sed -e 's/^X-L//'` if test -n "$acl_shlibext"; then if test -f "$dir/$libname$shrext"; then found_dir="$dir" found_so="$dir/$libname$shrext" else if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then ver=`(cd "$dir" && \ for f in "$libname$shrext".*; do echo "$f"; done \ | sed -e "s,^$libname$shrext\\\\.,," \ | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \ | sed 1q ) 2>/dev/null` if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then found_dir="$dir" found_so="$dir/$libname$shrext.$ver" fi else eval library_names=\"$acl_library_names_spec\" for f in $library_names; do if test -f "$dir/$f"; then found_dir="$dir" found_so="$dir/$f" break fi done fi fi fi if test "X$found_dir" = "X"; then if test -f "$dir/$libname.$acl_libext"; then found_dir="$dir" found_a="$dir/$libname.$acl_libext" fi fi if test "X$found_dir" != "X"; then if test -f "$dir/$libname.la"; then found_la="$dir/$libname.la" fi fi ;; esac if test "X$found_dir" != "X"; then break fi done fi if test "X$found_dir" != "X"; then LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-L$found_dir -l$name" if test "X$found_so" != "X"; then if test "$enable_rpath" = no \ || test "X$found_dir" = "X/usr/$acl_libdirstem" \ || test "X$found_dir" = "X/usr/$acl_libdirstem2"; then LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so" else haveit= for x in $ltrpathdirs; do if test "X$x" = "X$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then ltrpathdirs="$ltrpathdirs $found_dir" fi if test "$acl_hardcode_direct" = yes; then LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so" else if test -n "$acl_hardcode_libdir_flag_spec" && test "$acl_hardcode_minus_L" = no; then LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so" haveit= for x in $rpathdirs; do if test "X$x" = "X$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then rpathdirs="$rpathdirs $found_dir" fi else haveit= for x in $LDFLAGS $LIBICONV; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X-L$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then LIBICONV="${LIBICONV}${LIBICONV:+ }-L$found_dir" fi if test "$acl_hardcode_minus_L" != no; then LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so" else LIBICONV="${LIBICONV}${LIBICONV:+ }-l$name" fi fi fi fi else if test "X$found_a" != "X"; then LIBICONV="${LIBICONV}${LIBICONV:+ }$found_a" else LIBICONV="${LIBICONV}${LIBICONV:+ }-L$found_dir -l$name" fi fi additional_includedir= case "$found_dir" in */$acl_libdirstem | */$acl_libdirstem/) basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem/"'*$,,'` if test "$name" = 'iconv'; then LIBICONV_PREFIX="$basedir" fi additional_includedir="$basedir/include" ;; */$acl_libdirstem2 | */$acl_libdirstem2/) basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem2/"'*$,,'` if test "$name" = 'iconv'; then LIBICONV_PREFIX="$basedir" fi additional_includedir="$basedir/include" ;; esac if test "X$additional_includedir" != "X"; then if test "X$additional_includedir" != "X/usr/include"; then haveit= if test "X$additional_includedir" = "X/usr/local/include"; then if test -n "$GCC"; then case $host_os in linux* | gnu* | k*bsd*-gnu) haveit=yes;; esac fi fi if test -z "$haveit"; then for x in $CPPFLAGS $INCICONV; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X-I$additional_includedir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_includedir"; then INCICONV="${INCICONV}${INCICONV:+ }-I$additional_includedir" fi fi fi fi fi if test -n "$found_la"; then save_libdir="$libdir" case "$found_la" in */* | *\\*) . "$found_la" ;; *) . "./$found_la" ;; esac libdir="$save_libdir" for dep in $dependency_libs; do case "$dep" in -L*) additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'` if test "X$additional_libdir" != "X/usr/$acl_libdirstem" \ && test "X$additional_libdir" != "X/usr/$acl_libdirstem2"; then haveit= if test "X$additional_libdir" = "X/usr/local/$acl_libdirstem" \ || test "X$additional_libdir" = "X/usr/local/$acl_libdirstem2"; then if test -n "$GCC"; then case $host_os in linux* | gnu* | k*bsd*-gnu) haveit=yes;; esac fi fi if test -z "$haveit"; then haveit= for x in $LDFLAGS $LIBICONV; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X-L$additional_libdir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_libdir"; then LIBICONV="${LIBICONV}${LIBICONV:+ }-L$additional_libdir" fi fi haveit= for x in $LDFLAGS $LTLIBICONV; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X-L$additional_libdir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_libdir"; then LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-L$additional_libdir" fi fi fi fi ;; -R*) dir=`echo "X$dep" | sed -e 's/^X-R//'` if test "$enable_rpath" != no; then haveit= for x in $rpathdirs; do if test "X$x" = "X$dir"; then haveit=yes break fi done if test -z "$haveit"; then rpathdirs="$rpathdirs $dir" fi haveit= for x in $ltrpathdirs; do if test "X$x" = "X$dir"; then haveit=yes break fi done if test -z "$haveit"; then ltrpathdirs="$ltrpathdirs $dir" fi fi ;; -l*) names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'` ;; *.la) names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'` ;; *) LIBICONV="${LIBICONV}${LIBICONV:+ }$dep" LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }$dep" ;; esac done fi else LIBICONV="${LIBICONV}${LIBICONV:+ }-l$name" LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-l$name" fi fi fi done done if test "X$rpathdirs" != "X"; then if test -n "$acl_hardcode_libdir_separator"; then alldirs= for found_dir in $rpathdirs; do alldirs="${alldirs}${alldirs:+$acl_hardcode_libdir_separator}$found_dir" done acl_save_libdir="$libdir" libdir="$alldirs" eval flag=\"$acl_hardcode_libdir_flag_spec\" libdir="$acl_save_libdir" LIBICONV="${LIBICONV}${LIBICONV:+ }$flag" else for found_dir in $rpathdirs; do acl_save_libdir="$libdir" libdir="$found_dir" eval flag=\"$acl_hardcode_libdir_flag_spec\" libdir="$acl_save_libdir" LIBICONV="${LIBICONV}${LIBICONV:+ }$flag" done fi fi if test "X$ltrpathdirs" != "X"; then for found_dir in $ltrpathdirs; do LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-R$found_dir" done fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether NLS is requested" >&5 $as_echo_n "checking whether NLS is requested... " >&6; } # Check whether --enable-nls was given. if test "${enable_nls+set}" = set; then : enableval=$enable_nls; USE_NLS=$enableval else USE_NLS=yes fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $USE_NLS" >&5 $as_echo "$USE_NLS" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for CFPreferencesCopyAppValue" >&5 $as_echo_n "checking for CFPreferencesCopyAppValue... " >&6; } if ${gt_cv_func_CFPreferencesCopyAppValue+:} false; then : $as_echo_n "(cached) " >&6 else gt_save_LIBS="$LIBS" LIBS="$LIBS -Wl,-framework -Wl,CoreFoundation" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { CFPreferencesCopyAppValue(NULL, NULL) ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : gt_cv_func_CFPreferencesCopyAppValue=yes else gt_cv_func_CFPreferencesCopyAppValue=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS="$gt_save_LIBS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_func_CFPreferencesCopyAppValue" >&5 $as_echo "$gt_cv_func_CFPreferencesCopyAppValue" >&6; } if test $gt_cv_func_CFPreferencesCopyAppValue = yes; then $as_echo "#define HAVE_CFPREFERENCESCOPYAPPVALUE 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for CFLocaleCopyPreferredLanguages" >&5 $as_echo_n "checking for CFLocaleCopyPreferredLanguages... " >&6; } if ${gt_cv_func_CFLocaleCopyPreferredLanguages+:} false; then : $as_echo_n "(cached) " >&6 else gt_save_LIBS="$LIBS" LIBS="$LIBS -Wl,-framework -Wl,CoreFoundation" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { CFLocaleCopyPreferredLanguages(); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : gt_cv_func_CFLocaleCopyPreferredLanguages=yes else gt_cv_func_CFLocaleCopyPreferredLanguages=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS="$gt_save_LIBS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_func_CFLocaleCopyPreferredLanguages" >&5 $as_echo "$gt_cv_func_CFLocaleCopyPreferredLanguages" >&6; } if test $gt_cv_func_CFLocaleCopyPreferredLanguages = yes; then $as_echo "#define HAVE_CFLOCALECOPYPREFERREDLANGUAGES 1" >>confdefs.h fi INTL_MACOSX_LIBS= if test $gt_cv_func_CFPreferencesCopyAppValue = yes \ || test $gt_cv_func_CFLocaleCopyPreferredLanguages = yes; then INTL_MACOSX_LIBS="-Wl,-framework -Wl,CoreFoundation" fi LIBINTL= LTLIBINTL= POSUB= case " $gt_needs " in *" need-formatstring-macros "*) gt_api_version=3 ;; *" need-ngettext "*) gt_api_version=2 ;; *) gt_api_version=1 ;; esac gt_func_gnugettext_libc="gt_cv_func_gnugettext${gt_api_version}_libc" gt_func_gnugettext_libintl="gt_cv_func_gnugettext${gt_api_version}_libintl" if test "$USE_NLS" = "yes"; then gt_use_preinstalled_gnugettext=no if test $gt_api_version -ge 3; then gt_revision_test_code=' #ifndef __GNU_GETTEXT_SUPPORTED_REVISION #define __GNU_GETTEXT_SUPPORTED_REVISION(major) ((major) == 0 ? 0 : -1) #endif typedef int array [2 * (__GNU_GETTEXT_SUPPORTED_REVISION(0) >= 1) - 1]; ' else gt_revision_test_code= fi if test $gt_api_version -ge 2; then gt_expression_test_code=' + * ngettext ("", "", 0)' else gt_expression_test_code= fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU gettext in libc" >&5 $as_echo_n "checking for GNU gettext in libc... " >&6; } if eval \${$gt_func_gnugettext_libc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #ifndef __GNU_GETTEXT_SUPPORTED_REVISION extern int _nl_msg_cat_cntr; extern int *_nl_domain_bindings; #define __GNU_GETTEXT_SYMBOL_EXPRESSION (_nl_msg_cat_cntr + *_nl_domain_bindings) #else #define __GNU_GETTEXT_SYMBOL_EXPRESSION 0 #endif $gt_revision_test_code int main () { bindtextdomain ("", ""); return * gettext ("")$gt_expression_test_code + __GNU_GETTEXT_SYMBOL_EXPRESSION ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : eval "$gt_func_gnugettext_libc=yes" else eval "$gt_func_gnugettext_libc=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi eval ac_res=\$$gt_func_gnugettext_libc { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if { eval "gt_val=\$$gt_func_gnugettext_libc"; test "$gt_val" != "yes"; }; then am_save_CPPFLAGS="$CPPFLAGS" for element in $INCICONV; do haveit= for x in $CPPFLAGS; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X$element"; then haveit=yes break fi done if test -z "$haveit"; then CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }$element" fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking for iconv" >&5 $as_echo_n "checking for iconv... " >&6; } if ${am_cv_func_iconv+:} false; then : $as_echo_n "(cached) " >&6 else am_cv_func_iconv="no, consider installing GNU libiconv" am_cv_lib_iconv=no cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { iconv_t cd = iconv_open("",""); iconv(cd,NULL,NULL,NULL,NULL); iconv_close(cd); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : am_cv_func_iconv=yes fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test "$am_cv_func_iconv" != yes; then am_save_LIBS="$LIBS" LIBS="$LIBS $LIBICONV" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { iconv_t cd = iconv_open("",""); iconv(cd,NULL,NULL,NULL,NULL); iconv_close(cd); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : am_cv_lib_iconv=yes am_cv_func_iconv=yes fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS="$am_save_LIBS" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_func_iconv" >&5 $as_echo "$am_cv_func_iconv" >&6; } if test "$am_cv_func_iconv" = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working iconv" >&5 $as_echo_n "checking for working iconv... " >&6; } if ${am_cv_func_iconv_works+:} false; then : $as_echo_n "(cached) " >&6 else am_save_LIBS="$LIBS" if test $am_cv_lib_iconv = yes; then LIBS="$LIBS $LIBICONV" fi am_cv_func_iconv_works=no for ac_iconv_const in '' 'const'; do if test "$cross_compiling" = yes; then : case "$host_os" in aix* | hpux*) am_cv_func_iconv_works="guessing no" ;; *) am_cv_func_iconv_works="guessing yes" ;; esac else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #ifndef ICONV_CONST # define ICONV_CONST $ac_iconv_const #endif int main () { int result = 0; /* Test against AIX 5.1 bug: Failures are not distinguishable from successful returns. */ { iconv_t cd_utf8_to_88591 = iconv_open ("ISO8859-1", "UTF-8"); if (cd_utf8_to_88591 != (iconv_t)(-1)) { static ICONV_CONST char input[] = "\342\202\254"; /* EURO SIGN */ char buf[10]; ICONV_CONST char *inptr = input; size_t inbytesleft = strlen (input); char *outptr = buf; size_t outbytesleft = sizeof (buf); size_t res = iconv (cd_utf8_to_88591, &inptr, &inbytesleft, &outptr, &outbytesleft); if (res == 0) result |= 1; iconv_close (cd_utf8_to_88591); } } /* Test against Solaris 10 bug: Failures are not distinguishable from successful returns. */ { iconv_t cd_ascii_to_88591 = iconv_open ("ISO8859-1", "646"); if (cd_ascii_to_88591 != (iconv_t)(-1)) { static ICONV_CONST char input[] = "\263"; char buf[10]; ICONV_CONST char *inptr = input; size_t inbytesleft = strlen (input); char *outptr = buf; size_t outbytesleft = sizeof (buf); size_t res = iconv (cd_ascii_to_88591, &inptr, &inbytesleft, &outptr, &outbytesleft); if (res == 0) result |= 2; iconv_close (cd_ascii_to_88591); } } /* Test against AIX 6.1..7.1 bug: Buffer overrun. */ { iconv_t cd_88591_to_utf8 = iconv_open ("UTF-8", "ISO-8859-1"); if (cd_88591_to_utf8 != (iconv_t)(-1)) { static ICONV_CONST char input[] = "\304"; static char buf[2] = { (char)0xDE, (char)0xAD }; ICONV_CONST char *inptr = input; size_t inbytesleft = 1; char *outptr = buf; size_t outbytesleft = 1; size_t res = iconv (cd_88591_to_utf8, &inptr, &inbytesleft, &outptr, &outbytesleft); if (res != (size_t)(-1) || outptr - buf > 1 || buf[1] != (char)0xAD) result |= 4; iconv_close (cd_88591_to_utf8); } } #if 0 /* This bug could be worked around by the caller. */ /* Test against HP-UX 11.11 bug: Positive return value instead of 0. */ { iconv_t cd_88591_to_utf8 = iconv_open ("utf8", "iso88591"); if (cd_88591_to_utf8 != (iconv_t)(-1)) { static ICONV_CONST char input[] = "\304rger mit b\366sen B\374bchen ohne Augenma\337"; char buf[50]; ICONV_CONST char *inptr = input; size_t inbytesleft = strlen (input); char *outptr = buf; size_t outbytesleft = sizeof (buf); size_t res = iconv (cd_88591_to_utf8, &inptr, &inbytesleft, &outptr, &outbytesleft); if ((int)res > 0) result |= 8; iconv_close (cd_88591_to_utf8); } } #endif /* Test against HP-UX 11.11 bug: No converter from EUC-JP to UTF-8 is provided. */ if (/* Try standardized names. */ iconv_open ("UTF-8", "EUC-JP") == (iconv_t)(-1) /* Try IRIX, OSF/1 names. */ && iconv_open ("UTF-8", "eucJP") == (iconv_t)(-1) /* Try AIX names. */ && iconv_open ("UTF-8", "IBM-eucJP") == (iconv_t)(-1) /* Try HP-UX names. */ && iconv_open ("utf8", "eucJP") == (iconv_t)(-1)) result |= 16; return result; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : am_cv_func_iconv_works=yes fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi test "$am_cv_func_iconv_works" = no || break done LIBS="$am_save_LIBS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_func_iconv_works" >&5 $as_echo "$am_cv_func_iconv_works" >&6; } case "$am_cv_func_iconv_works" in *no) am_func_iconv=no am_cv_lib_iconv=no ;; *) am_func_iconv=yes ;; esac else am_func_iconv=no am_cv_lib_iconv=no fi if test "$am_func_iconv" = yes; then $as_echo "#define HAVE_ICONV 1" >>confdefs.h fi if test "$am_cv_lib_iconv" = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to link with libiconv" >&5 $as_echo_n "checking how to link with libiconv... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIBICONV" >&5 $as_echo "$LIBICONV" >&6; } else CPPFLAGS="$am_save_CPPFLAGS" LIBICONV= LTLIBICONV= fi use_additional=yes acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval additional_includedir=\"$includedir\" eval additional_libdir=\"$libdir\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" # Check whether --with-libintl-prefix was given. if test "${with_libintl_prefix+set}" = set; then : withval=$with_libintl_prefix; if test "X$withval" = "Xno"; then use_additional=no else if test "X$withval" = "X"; then acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval additional_includedir=\"$includedir\" eval additional_libdir=\"$libdir\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" else additional_includedir="$withval/include" additional_libdir="$withval/$acl_libdirstem" if test "$acl_libdirstem2" != "$acl_libdirstem" \ && ! test -d "$withval/$acl_libdirstem"; then additional_libdir="$withval/$acl_libdirstem2" fi fi fi fi LIBINTL= LTLIBINTL= INCINTL= LIBINTL_PREFIX= HAVE_LIBINTL= rpathdirs= ltrpathdirs= names_already_handled= names_next_round='intl ' while test -n "$names_next_round"; do names_this_round="$names_next_round" names_next_round= for name in $names_this_round; do already_handled= for n in $names_already_handled; do if test "$n" = "$name"; then already_handled=yes break fi done if test -z "$already_handled"; then names_already_handled="$names_already_handled $name" uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./+-|ABCDEFGHIJKLMNOPQRSTUVWXYZ____|'` eval value=\"\$HAVE_LIB$uppername\" if test -n "$value"; then if test "$value" = yes; then eval value=\"\$LIB$uppername\" test -z "$value" || LIBINTL="${LIBINTL}${LIBINTL:+ }$value" eval value=\"\$LTLIB$uppername\" test -z "$value" || LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }$value" else : fi else found_dir= found_la= found_so= found_a= eval libname=\"$acl_libname_spec\" # typically: libname=lib$name if test -n "$acl_shlibext"; then shrext=".$acl_shlibext" # typically: shrext=.so else shrext= fi if test $use_additional = yes; then dir="$additional_libdir" if test -n "$acl_shlibext"; then if test -f "$dir/$libname$shrext"; then found_dir="$dir" found_so="$dir/$libname$shrext" else if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then ver=`(cd "$dir" && \ for f in "$libname$shrext".*; do echo "$f"; done \ | sed -e "s,^$libname$shrext\\\\.,," \ | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \ | sed 1q ) 2>/dev/null` if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then found_dir="$dir" found_so="$dir/$libname$shrext.$ver" fi else eval library_names=\"$acl_library_names_spec\" for f in $library_names; do if test -f "$dir/$f"; then found_dir="$dir" found_so="$dir/$f" break fi done fi fi fi if test "X$found_dir" = "X"; then if test -f "$dir/$libname.$acl_libext"; then found_dir="$dir" found_a="$dir/$libname.$acl_libext" fi fi if test "X$found_dir" != "X"; then if test -f "$dir/$libname.la"; then found_la="$dir/$libname.la" fi fi fi if test "X$found_dir" = "X"; then for x in $LDFLAGS $LTLIBINTL; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" case "$x" in -L*) dir=`echo "X$x" | sed -e 's/^X-L//'` if test -n "$acl_shlibext"; then if test -f "$dir/$libname$shrext"; then found_dir="$dir" found_so="$dir/$libname$shrext" else if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then ver=`(cd "$dir" && \ for f in "$libname$shrext".*; do echo "$f"; done \ | sed -e "s,^$libname$shrext\\\\.,," \ | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \ | sed 1q ) 2>/dev/null` if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then found_dir="$dir" found_so="$dir/$libname$shrext.$ver" fi else eval library_names=\"$acl_library_names_spec\" for f in $library_names; do if test -f "$dir/$f"; then found_dir="$dir" found_so="$dir/$f" break fi done fi fi fi if test "X$found_dir" = "X"; then if test -f "$dir/$libname.$acl_libext"; then found_dir="$dir" found_a="$dir/$libname.$acl_libext" fi fi if test "X$found_dir" != "X"; then if test -f "$dir/$libname.la"; then found_la="$dir/$libname.la" fi fi ;; esac if test "X$found_dir" != "X"; then break fi done fi if test "X$found_dir" != "X"; then LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }-L$found_dir -l$name" if test "X$found_so" != "X"; then if test "$enable_rpath" = no \ || test "X$found_dir" = "X/usr/$acl_libdirstem" \ || test "X$found_dir" = "X/usr/$acl_libdirstem2"; then LIBINTL="${LIBINTL}${LIBINTL:+ }$found_so" else haveit= for x in $ltrpathdirs; do if test "X$x" = "X$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then ltrpathdirs="$ltrpathdirs $found_dir" fi if test "$acl_hardcode_direct" = yes; then LIBINTL="${LIBINTL}${LIBINTL:+ }$found_so" else if test -n "$acl_hardcode_libdir_flag_spec" && test "$acl_hardcode_minus_L" = no; then LIBINTL="${LIBINTL}${LIBINTL:+ }$found_so" haveit= for x in $rpathdirs; do if test "X$x" = "X$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then rpathdirs="$rpathdirs $found_dir" fi else haveit= for x in $LDFLAGS $LIBINTL; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X-L$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then LIBINTL="${LIBINTL}${LIBINTL:+ }-L$found_dir" fi if test "$acl_hardcode_minus_L" != no; then LIBINTL="${LIBINTL}${LIBINTL:+ }$found_so" else LIBINTL="${LIBINTL}${LIBINTL:+ }-l$name" fi fi fi fi else if test "X$found_a" != "X"; then LIBINTL="${LIBINTL}${LIBINTL:+ }$found_a" else LIBINTL="${LIBINTL}${LIBINTL:+ }-L$found_dir -l$name" fi fi additional_includedir= case "$found_dir" in */$acl_libdirstem | */$acl_libdirstem/) basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem/"'*$,,'` if test "$name" = 'intl'; then LIBINTL_PREFIX="$basedir" fi additional_includedir="$basedir/include" ;; */$acl_libdirstem2 | */$acl_libdirstem2/) basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem2/"'*$,,'` if test "$name" = 'intl'; then LIBINTL_PREFIX="$basedir" fi additional_includedir="$basedir/include" ;; esac if test "X$additional_includedir" != "X"; then if test "X$additional_includedir" != "X/usr/include"; then haveit= if test "X$additional_includedir" = "X/usr/local/include"; then if test -n "$GCC"; then case $host_os in linux* | gnu* | k*bsd*-gnu) haveit=yes;; esac fi fi if test -z "$haveit"; then for x in $CPPFLAGS $INCINTL; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X-I$additional_includedir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_includedir"; then INCINTL="${INCINTL}${INCINTL:+ }-I$additional_includedir" fi fi fi fi fi if test -n "$found_la"; then save_libdir="$libdir" case "$found_la" in */* | *\\*) . "$found_la" ;; *) . "./$found_la" ;; esac libdir="$save_libdir" for dep in $dependency_libs; do case "$dep" in -L*) additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'` if test "X$additional_libdir" != "X/usr/$acl_libdirstem" \ && test "X$additional_libdir" != "X/usr/$acl_libdirstem2"; then haveit= if test "X$additional_libdir" = "X/usr/local/$acl_libdirstem" \ || test "X$additional_libdir" = "X/usr/local/$acl_libdirstem2"; then if test -n "$GCC"; then case $host_os in linux* | gnu* | k*bsd*-gnu) haveit=yes;; esac fi fi if test -z "$haveit"; then haveit= for x in $LDFLAGS $LIBINTL; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X-L$additional_libdir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_libdir"; then LIBINTL="${LIBINTL}${LIBINTL:+ }-L$additional_libdir" fi fi haveit= for x in $LDFLAGS $LTLIBINTL; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X-L$additional_libdir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_libdir"; then LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }-L$additional_libdir" fi fi fi fi ;; -R*) dir=`echo "X$dep" | sed -e 's/^X-R//'` if test "$enable_rpath" != no; then haveit= for x in $rpathdirs; do if test "X$x" = "X$dir"; then haveit=yes break fi done if test -z "$haveit"; then rpathdirs="$rpathdirs $dir" fi haveit= for x in $ltrpathdirs; do if test "X$x" = "X$dir"; then haveit=yes break fi done if test -z "$haveit"; then ltrpathdirs="$ltrpathdirs $dir" fi fi ;; -l*) names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'` ;; *.la) names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'` ;; *) LIBINTL="${LIBINTL}${LIBINTL:+ }$dep" LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }$dep" ;; esac done fi else LIBINTL="${LIBINTL}${LIBINTL:+ }-l$name" LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }-l$name" fi fi fi done done if test "X$rpathdirs" != "X"; then if test -n "$acl_hardcode_libdir_separator"; then alldirs= for found_dir in $rpathdirs; do alldirs="${alldirs}${alldirs:+$acl_hardcode_libdir_separator}$found_dir" done acl_save_libdir="$libdir" libdir="$alldirs" eval flag=\"$acl_hardcode_libdir_flag_spec\" libdir="$acl_save_libdir" LIBINTL="${LIBINTL}${LIBINTL:+ }$flag" else for found_dir in $rpathdirs; do acl_save_libdir="$libdir" libdir="$found_dir" eval flag=\"$acl_hardcode_libdir_flag_spec\" libdir="$acl_save_libdir" LIBINTL="${LIBINTL}${LIBINTL:+ }$flag" done fi fi if test "X$ltrpathdirs" != "X"; then for found_dir in $ltrpathdirs; do LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }-R$found_dir" done fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU gettext in libintl" >&5 $as_echo_n "checking for GNU gettext in libintl... " >&6; } if eval \${$gt_func_gnugettext_libintl+:} false; then : $as_echo_n "(cached) " >&6 else gt_save_CPPFLAGS="$CPPFLAGS" CPPFLAGS="$CPPFLAGS $INCINTL" gt_save_LIBS="$LIBS" LIBS="$LIBS $LIBINTL" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #ifndef __GNU_GETTEXT_SUPPORTED_REVISION extern int _nl_msg_cat_cntr; extern #ifdef __cplusplus "C" #endif const char *_nl_expand_alias (const char *); #define __GNU_GETTEXT_SYMBOL_EXPRESSION (_nl_msg_cat_cntr + *_nl_expand_alias ("")) #else #define __GNU_GETTEXT_SYMBOL_EXPRESSION 0 #endif $gt_revision_test_code int main () { bindtextdomain ("", ""); return * gettext ("")$gt_expression_test_code + __GNU_GETTEXT_SYMBOL_EXPRESSION ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : eval "$gt_func_gnugettext_libintl=yes" else eval "$gt_func_gnugettext_libintl=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" != yes; } && test -n "$LIBICONV"; then LIBS="$LIBS $LIBICONV" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #ifndef __GNU_GETTEXT_SUPPORTED_REVISION extern int _nl_msg_cat_cntr; extern #ifdef __cplusplus "C" #endif const char *_nl_expand_alias (const char *); #define __GNU_GETTEXT_SYMBOL_EXPRESSION (_nl_msg_cat_cntr + *_nl_expand_alias ("")) #else #define __GNU_GETTEXT_SYMBOL_EXPRESSION 0 #endif $gt_revision_test_code int main () { bindtextdomain ("", ""); return * gettext ("")$gt_expression_test_code + __GNU_GETTEXT_SYMBOL_EXPRESSION ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : LIBINTL="$LIBINTL $LIBICONV" LTLIBINTL="$LTLIBINTL $LTLIBICONV" eval "$gt_func_gnugettext_libintl=yes" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi CPPFLAGS="$gt_save_CPPFLAGS" LIBS="$gt_save_LIBS" fi eval ac_res=\$$gt_func_gnugettext_libintl { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } fi if { eval "gt_val=\$$gt_func_gnugettext_libc"; test "$gt_val" = "yes"; } \ || { { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" = "yes"; } \ && test "$PACKAGE" != gettext-runtime \ && test "$PACKAGE" != gettext-tools; }; then gt_use_preinstalled_gnugettext=yes else LIBINTL= LTLIBINTL= INCINTL= fi if test -n "$INTL_MACOSX_LIBS"; then if test "$gt_use_preinstalled_gnugettext" = "yes" \ || test "$nls_cv_use_gnu_gettext" = "yes"; then LIBINTL="$LIBINTL $INTL_MACOSX_LIBS" LTLIBINTL="$LTLIBINTL $INTL_MACOSX_LIBS" fi fi if test "$gt_use_preinstalled_gnugettext" = "yes" \ || test "$nls_cv_use_gnu_gettext" = "yes"; then $as_echo "#define ENABLE_NLS 1" >>confdefs.h else USE_NLS=no fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to use NLS" >&5 $as_echo_n "checking whether to use NLS... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $USE_NLS" >&5 $as_echo "$USE_NLS" >&6; } if test "$USE_NLS" = "yes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking where the gettext function comes from" >&5 $as_echo_n "checking where the gettext function comes from... " >&6; } if test "$gt_use_preinstalled_gnugettext" = "yes"; then if { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" = "yes"; }; then gt_source="external libintl" else gt_source="libc" fi else gt_source="included intl directory" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_source" >&5 $as_echo "$gt_source" >&6; } fi if test "$USE_NLS" = "yes"; then if test "$gt_use_preinstalled_gnugettext" = "yes"; then if { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" = "yes"; }; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to link with libintl" >&5 $as_echo_n "checking how to link with libintl... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIBINTL" >&5 $as_echo "$LIBINTL" >&6; } for element in $INCINTL; do haveit= for x in $CPPFLAGS; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X$element"; then haveit=yes break fi done if test -z "$haveit"; then CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }$element" fi done fi $as_echo "#define HAVE_GETTEXT 1" >>confdefs.h $as_echo "#define HAVE_DCGETTEXT 1" >>confdefs.h fi POSUB=po fi INTLLIBS="$LIBINTL" LIBS="$LIBINTL $LIBS" for ac_prog in msgfmt do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_MSGFMT+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$MSGFMT"; then ac_cv_prog_MSGFMT="$MSGFMT" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_MSGFMT="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi MSGFMT=$ac_cv_prog_MSGFMT if test -n "$MSGFMT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MSGFMT" >&5 $as_echo "$MSGFMT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$MSGFMT" && break done if test "x$MSGFMT" = x; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: You must install msgfmt (is usually provided with gettext) before building PSPP." >&5 $as_echo "$as_me: WARNING: You must install msgfmt (is usually provided with gettext) before building PSPP." >&2;} pspp_required_prereqs="$pspp_required_prereqs msgfmt (is usually provided with gettext)" fi for ac_prog in xgettext do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_XGETTEXT+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$XGETTEXT"; then ac_cv_prog_XGETTEXT="$XGETTEXT" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_XGETTEXT="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi XGETTEXT=$ac_cv_prog_XGETTEXT if test -n "$XGETTEXT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $XGETTEXT" >&5 $as_echo "$XGETTEXT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$XGETTEXT" && break done if test "x$XGETTEXT" = x; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: You must install xgettext (is usually provided with gettext) before building PSPP." >&5 $as_echo "$as_me: WARNING: You must install xgettext (is usually provided with gettext) before building PSPP." >&2;} pspp_required_prereqs="$pspp_required_prereqs xgettext (is usually provided with gettext)" fi $as_echo '' > test.metainfo.xml.in $as_echo '' >> test.metainfo.xml.in $as_echo 'Hallo' >> test.metainfo.xml.in $as_echo '' >> test.metainfo.xml.in xgettext -o mifc.po test.metainfo.xml.in if ! test -f ./mifc.po ; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: You must install appstream 0.12 or later for metainfo.its before building PSPP." >&5 $as_echo "$as_me: WARNING: You must install appstream 0.12 or later for metainfo.its before building PSPP." >&2;} pspp_required_prereqs="$pspp_required_prereqs appstream 0.12 or later for metainfo.its" fi rm -f mifc.po test.metainfo.xml.in # Check whether --enable-largefile was given. if test "${enable_largefile+set}" = set; then : enableval=$enable_largefile; fi if test "$enable_largefile" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for special C compiler options needed for large files" >&5 $as_echo_n "checking for special C compiler options needed for large files... " >&6; } if ${ac_cv_sys_largefile_CC+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_sys_largefile_CC=no if test "$GCC" != yes; then ac_save_CC=$CC while :; do # IRIX 6.2 and later do not support large files by default, # so use the C compiler's -n32 option if that helps. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include /* Check that off_t can represent 2**63 - 1 correctly. We can't simply define LARGE_OFF_T to be 9223372036854775807, since some C++ compilers masquerading as C compilers incorrectly reject 9223372036854775807. */ #define LARGE_OFF_T (((off_t) 1 << 31 << 31) - 1 + ((off_t) 1 << 31 << 31)) int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 && LARGE_OFF_T % 2147483647 == 1) ? 1 : -1]; int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : break fi rm -f core conftest.err conftest.$ac_objext CC="$CC -n32" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_sys_largefile_CC=' -n32'; break fi rm -f core conftest.err conftest.$ac_objext break done CC=$ac_save_CC rm -f conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_largefile_CC" >&5 $as_echo "$ac_cv_sys_largefile_CC" >&6; } if test "$ac_cv_sys_largefile_CC" != no; then CC=$CC$ac_cv_sys_largefile_CC fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _FILE_OFFSET_BITS value needed for large files" >&5 $as_echo_n "checking for _FILE_OFFSET_BITS value needed for large files... " >&6; } if ${ac_cv_sys_file_offset_bits+:} false; then : $as_echo_n "(cached) " >&6 else while :; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include /* Check that off_t can represent 2**63 - 1 correctly. We can't simply define LARGE_OFF_T to be 9223372036854775807, since some C++ compilers masquerading as C compilers incorrectly reject 9223372036854775807. */ #define LARGE_OFF_T (((off_t) 1 << 31 << 31) - 1 + ((off_t) 1 << 31 << 31)) int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 && LARGE_OFF_T % 2147483647 == 1) ? 1 : -1]; int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_sys_file_offset_bits=no; break fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define _FILE_OFFSET_BITS 64 #include /* Check that off_t can represent 2**63 - 1 correctly. We can't simply define LARGE_OFF_T to be 9223372036854775807, since some C++ compilers masquerading as C compilers incorrectly reject 9223372036854775807. */ #define LARGE_OFF_T (((off_t) 1 << 31 << 31) - 1 + ((off_t) 1 << 31 << 31)) int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 && LARGE_OFF_T % 2147483647 == 1) ? 1 : -1]; int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_sys_file_offset_bits=64; break fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_sys_file_offset_bits=unknown break done fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_file_offset_bits" >&5 $as_echo "$ac_cv_sys_file_offset_bits" >&6; } case $ac_cv_sys_file_offset_bits in #( no | unknown) ;; *) cat >>confdefs.h <<_ACEOF #define _FILE_OFFSET_BITS $ac_cv_sys_file_offset_bits _ACEOF ;; esac rm -rf conftest* if test $ac_cv_sys_file_offset_bits = unknown; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _LARGE_FILES value needed for large files" >&5 $as_echo_n "checking for _LARGE_FILES value needed for large files... " >&6; } if ${ac_cv_sys_large_files+:} false; then : $as_echo_n "(cached) " >&6 else while :; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include /* Check that off_t can represent 2**63 - 1 correctly. We can't simply define LARGE_OFF_T to be 9223372036854775807, since some C++ compilers masquerading as C compilers incorrectly reject 9223372036854775807. */ #define LARGE_OFF_T (((off_t) 1 << 31 << 31) - 1 + ((off_t) 1 << 31 << 31)) int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 && LARGE_OFF_T % 2147483647 == 1) ? 1 : -1]; int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_sys_large_files=no; break fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define _LARGE_FILES 1 #include /* Check that off_t can represent 2**63 - 1 correctly. We can't simply define LARGE_OFF_T to be 9223372036854775807, since some C++ compilers masquerading as C compilers incorrectly reject 9223372036854775807. */ #define LARGE_OFF_T (((off_t) 1 << 31 << 31) - 1 + ((off_t) 1 << 31 << 31)) int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 && LARGE_OFF_T % 2147483647 == 1) ? 1 : -1]; int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_sys_large_files=1; break fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_sys_large_files=unknown break done fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_large_files" >&5 $as_echo "$ac_cv_sys_large_files" >&6; } case $ac_cv_sys_large_files in #( no | unknown) ;; *) cat >>confdefs.h <<_ACEOF #define _LARGE_FILES $ac_cv_sys_large_files _ACEOF ;; esac rm -rf conftest* fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing sin" >&5 $as_echo_n "checking for library containing sin... " >&6; } if ${ac_cv_search_sin+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char sin (); int main () { return sin (); ; return 0; } _ACEOF for ac_lib in '' m; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_sin=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_sin+:} false; then : break fi done if ${ac_cv_search_sin+:} false; then : else ac_cv_search_sin=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_sin" >&5 $as_echo "$ac_cv_search_sin" >&6; } ac_res=$ac_cv_search_sin if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for LC_PAPER" >&5 $as_echo_n "checking for LC_PAPER... " >&6; } if ${pspp_cv_lc_paper+:} false; then : $as_echo_n "(cached) " >&6 else pspp_cv_lc_paper=no cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { (void) LC_PAPER; (void) _NL_PAPER_WIDTH; (void) _NL_PAPER_HEIGHT ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : pspp_cv_lc_paper=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $pspp_cv_lc_paper" >&5 $as_echo "$pspp_cv_lc_paper" >&6; } if test "$pspp_cv_lc_paper" = yes; then $as_echo "#define HAVE_LC_PAPER 1" >>confdefs.h fi # Support for Cairo and Pango. # Check whether --with-cairo was given. if test "${with_cairo+set}" = set; then : withval=$with_cairo; else with_cairo=yes fi if test "$with_cairo" != no; then HAVE_CAIRO_TRUE= HAVE_CAIRO_FALSE='#' else HAVE_CAIRO_TRUE='#' HAVE_CAIRO_FALSE= fi if test "$with_cairo" != no; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for cairo >= 1.5 pango >= 1.22 pangocairo" >&5 $as_echo_n "checking for cairo >= 1.5 pango >= 1.22 pangocairo... " >&6; } if test -n "$CAIRO_CFLAGS"; then pkg_cv_CAIRO_CFLAGS="$CAIRO_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"cairo >= 1.5 pango >= 1.22 pangocairo\""; } >&5 ($PKG_CONFIG --exists --print-errors "cairo >= 1.5 pango >= 1.22 pangocairo") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_CAIRO_CFLAGS=`$PKG_CONFIG --cflags "cairo >= 1.5 pango >= 1.22 pangocairo" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$CAIRO_LIBS"; then pkg_cv_CAIRO_LIBS="$CAIRO_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"cairo >= 1.5 pango >= 1.22 pangocairo\""; } >&5 ($PKG_CONFIG --exists --print-errors "cairo >= 1.5 pango >= 1.22 pangocairo") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_CAIRO_LIBS=`$PKG_CONFIG --libs "cairo >= 1.5 pango >= 1.22 pangocairo" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then CAIRO_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "cairo >= 1.5 pango >= 1.22 pangocairo" 2>&1` else CAIRO_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "cairo >= 1.5 pango >= 1.22 pangocairo" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$CAIRO_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: You must install cairo 1.5 or later and pango 1.22 or later (or use --without-cairo) before building PSPP." >&5 $as_echo "$as_me: WARNING: You must install cairo 1.5 or later and pango 1.22 or later (or use --without-cairo) before building PSPP." >&2;} pspp_required_prereqs="$pspp_required_prereqs cairo 1.5 or later and pango 1.22 or later (or use --without-cairo)" elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: You must install cairo 1.5 or later and pango 1.22 or later (or use --without-cairo) before building PSPP." >&5 $as_echo "$as_me: WARNING: You must install cairo 1.5 or later and pango 1.22 or later (or use --without-cairo) before building PSPP." >&2;} pspp_required_prereqs="$pspp_required_prereqs cairo 1.5 or later and pango 1.22 or later (or use --without-cairo)" else CAIRO_CFLAGS=$pkg_cv_CAIRO_CFLAGS CAIRO_LIBS=$pkg_cv_CAIRO_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } CPPFLAGS="$CPPFLAGS $CAIRO_CFLAGS" $as_echo "#define HAVE_CAIRO 1" >>confdefs.h fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for an xmllint program which fits our needs" >&5 $as_echo_n "checking for an xmllint program which fits our needs... " >&6; } if ${ac_cv_path_XMLLINT+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$XMLLINT"; then ac_path_XMLLINT_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in xmllint; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_XMLLINT="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_XMLLINT" || continue $ac_path_XMLLINT --version 2>&1 | $GREP XPath > /dev/null && test `$ac_path_XMLLINT --version 2>&1 | $SED 's/^.* \([0-9]*\).*/\1/'` -gt 20900 && ac_cv_path_XMLLINT=$ac_path_XMLLINT $ac_path_XMLLINT_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_XMLLINT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: no appropriate xmllint program found. Using a dummy (echo)" >&5 $as_echo "$as_me: WARNING: no appropriate xmllint program found. Using a dummy (echo)" >&2;}; ac_cv_path_XMLLINT=$ECHO fi else ac_cv_path_XMLLINT=$XMLLINT fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_XMLLINT" >&5 $as_echo "$ac_cv_path_XMLLINT" >&6; } XMLLINT=$ac_cv_path_XMLLINT # Support for GUI. # Check whether --with-gui was given. if test "${with_gui+set}" = set; then : withval=$with_gui; else with_gui=yes fi if test "$with_cairo" != no && test "$with_gui" != "no"; then HAVE_GUI_TRUE= HAVE_GUI_FALSE='#' else HAVE_GUI_TRUE='#' HAVE_GUI_FALSE= fi if test "$with_cairo" != no && test "$with_gui" != "no"; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gthread-2.0" >&5 $as_echo_n "checking for gthread-2.0... " >&6; } if test -n "$GTHREAD_CFLAGS"; then pkg_cv_GTHREAD_CFLAGS="$GTHREAD_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gthread-2.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "gthread-2.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GTHREAD_CFLAGS=`$PKG_CONFIG --cflags "gthread-2.0" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$GTHREAD_LIBS"; then pkg_cv_GTHREAD_LIBS="$GTHREAD_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gthread-2.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "gthread-2.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GTHREAD_LIBS=`$PKG_CONFIG --libs "gthread-2.0" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then GTHREAD_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "gthread-2.0" 2>&1` else GTHREAD_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "gthread-2.0" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$GTHREAD_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: You must install gthread 2.0 (or use --without-gui) before building PSPP." >&5 $as_echo "$as_me: WARNING: You must install gthread 2.0 (or use --without-gui) before building PSPP." >&2;} pspp_required_prereqs="$pspp_required_prereqs gthread 2.0 (or use --without-gui)" elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: You must install gthread 2.0 (or use --without-gui) before building PSPP." >&5 $as_echo "$as_me: WARNING: You must install gthread 2.0 (or use --without-gui) before building PSPP." >&2;} pspp_required_prereqs="$pspp_required_prereqs gthread 2.0 (or use --without-gui)" else GTHREAD_CFLAGS=$pkg_cv_GTHREAD_CFLAGS GTHREAD_LIBS=$pkg_cv_GTHREAD_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gtk+-3.0 >= 3.22.0" >&5 $as_echo_n "checking for gtk+-3.0 >= 3.22.0... " >&6; } if test -n "$GTK_CFLAGS"; then pkg_cv_GTK_CFLAGS="$GTK_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gtk+-3.0 >= 3.22.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "gtk+-3.0 >= 3.22.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GTK_CFLAGS=`$PKG_CONFIG --cflags "gtk+-3.0 >= 3.22.0" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$GTK_LIBS"; then pkg_cv_GTK_LIBS="$GTK_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gtk+-3.0 >= 3.22.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "gtk+-3.0 >= 3.22.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GTK_LIBS=`$PKG_CONFIG --libs "gtk+-3.0 >= 3.22.0" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then GTK_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "gtk+-3.0 >= 3.22.0" 2>&1` else GTK_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "gtk+-3.0 >= 3.22.0" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$GTK_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: You must install gtk+ 3.0 version 3.22.0 or later (or use --without-gui) before building PSPP." >&5 $as_echo "$as_me: WARNING: You must install gtk+ 3.0 version 3.22.0 or later (or use --without-gui) before building PSPP." >&2;} pspp_required_prereqs="$pspp_required_prereqs gtk+ 3.0 version 3.22.0 or later (or use --without-gui)" elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: You must install gtk+ 3.0 version 3.22.0 or later (or use --without-gui) before building PSPP." >&5 $as_echo "$as_me: WARNING: You must install gtk+ 3.0 version 3.22.0 or later (or use --without-gui) before building PSPP." >&2;} pspp_required_prereqs="$pspp_required_prereqs gtk+ 3.0 version 3.22.0 or later (or use --without-gui)" else GTK_CFLAGS=$pkg_cv_GTK_CFLAGS GTK_LIBS=$pkg_cv_GTK_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gtksourceview-3.0 >= 3.4.2" >&5 $as_echo_n "checking for gtksourceview-3.0 >= 3.4.2... " >&6; } if test -n "$GTKSOURCEVIEW_CFLAGS"; then pkg_cv_GTKSOURCEVIEW_CFLAGS="$GTKSOURCEVIEW_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gtksourceview-3.0 >= 3.4.2\""; } >&5 ($PKG_CONFIG --exists --print-errors "gtksourceview-3.0 >= 3.4.2") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GTKSOURCEVIEW_CFLAGS=`$PKG_CONFIG --cflags "gtksourceview-3.0 >= 3.4.2" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$GTKSOURCEVIEW_LIBS"; then pkg_cv_GTKSOURCEVIEW_LIBS="$GTKSOURCEVIEW_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gtksourceview-3.0 >= 3.4.2\""; } >&5 ($PKG_CONFIG --exists --print-errors "gtksourceview-3.0 >= 3.4.2") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GTKSOURCEVIEW_LIBS=`$PKG_CONFIG --libs "gtksourceview-3.0 >= 3.4.2" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then GTKSOURCEVIEW_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "gtksourceview-3.0 >= 3.4.2" 2>&1` else GTKSOURCEVIEW_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "gtksourceview-3.0 >= 3.4.2" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$GTKSOURCEVIEW_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: You must install gtksourceview 3.0 version 3.4.2 or later (or use --without-gui) before building PSPP." >&5 $as_echo "$as_me: WARNING: You must install gtksourceview 3.0 version 3.4.2 or later (or use --without-gui) before building PSPP." >&2;} pspp_required_prereqs="$pspp_required_prereqs gtksourceview 3.0 version 3.4.2 or later (or use --without-gui)" elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: You must install gtksourceview 3.0 version 3.4.2 or later (or use --without-gui) before building PSPP." >&5 $as_echo "$as_me: WARNING: You must install gtksourceview 3.0 version 3.4.2 or later (or use --without-gui) before building PSPP." >&2;} pspp_required_prereqs="$pspp_required_prereqs gtksourceview 3.0 version 3.4.2 or later (or use --without-gui)" else GTKSOURCEVIEW_CFLAGS=$pkg_cv_GTKSOURCEVIEW_CFLAGS GTKSOURCEVIEW_LIBS=$pkg_cv_GTKSOURCEVIEW_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for glib-2.0 >= 2.44" >&5 $as_echo_n "checking for glib-2.0 >= 2.44... " >&6; } if test -n "$GLIB_CFLAGS"; then pkg_cv_GLIB_CFLAGS="$GLIB_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"glib-2.0 >= 2.44\""; } >&5 ($PKG_CONFIG --exists --print-errors "glib-2.0 >= 2.44") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GLIB_CFLAGS=`$PKG_CONFIG --cflags "glib-2.0 >= 2.44" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$GLIB_LIBS"; then pkg_cv_GLIB_LIBS="$GLIB_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"glib-2.0 >= 2.44\""; } >&5 ($PKG_CONFIG --exists --print-errors "glib-2.0 >= 2.44") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GLIB_LIBS=`$PKG_CONFIG --libs "glib-2.0 >= 2.44" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then GLIB_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "glib-2.0 >= 2.44" 2>&1` else GLIB_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "glib-2.0 >= 2.44" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$GLIB_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: You must install glib 2.0 version 2.44 or later (or use --without-gui) before building PSPP." >&5 $as_echo "$as_me: WARNING: You must install glib 2.0 version 2.44 or later (or use --without-gui) before building PSPP." >&2;} pspp_required_prereqs="$pspp_required_prereqs glib 2.0 version 2.44 or later (or use --without-gui)" elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: You must install glib 2.0 version 2.44 or later (or use --without-gui) before building PSPP." >&5 $as_echo "$as_me: WARNING: You must install glib 2.0 version 2.44 or later (or use --without-gui) before building PSPP." >&2;} pspp_required_prereqs="$pspp_required_prereqs glib 2.0 version 2.44 or later (or use --without-gui)" else GLIB_CFLAGS=$pkg_cv_GLIB_CFLAGS GLIB_LIBS=$pkg_cv_GLIB_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for spread-sheet-widget >= 0.6" >&5 $as_echo_n "checking for spread-sheet-widget >= 0.6... " >&6; } if test -n "$SPREAD_SHEET_WIDGET_CFLAGS"; then pkg_cv_SPREAD_SHEET_WIDGET_CFLAGS="$SPREAD_SHEET_WIDGET_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"spread-sheet-widget >= 0.6\""; } >&5 ($PKG_CONFIG --exists --print-errors "spread-sheet-widget >= 0.6") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_SPREAD_SHEET_WIDGET_CFLAGS=`$PKG_CONFIG --cflags "spread-sheet-widget >= 0.6" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$SPREAD_SHEET_WIDGET_LIBS"; then pkg_cv_SPREAD_SHEET_WIDGET_LIBS="$SPREAD_SHEET_WIDGET_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"spread-sheet-widget >= 0.6\""; } >&5 ($PKG_CONFIG --exists --print-errors "spread-sheet-widget >= 0.6") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_SPREAD_SHEET_WIDGET_LIBS=`$PKG_CONFIG --libs "spread-sheet-widget >= 0.6" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then SPREAD_SHEET_WIDGET_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "spread-sheet-widget >= 0.6" 2>&1` else SPREAD_SHEET_WIDGET_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "spread-sheet-widget >= 0.6" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$SPREAD_SHEET_WIDGET_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: You must install spread-sheet-widget 0.6 (or use --without-gui) before building PSPP." >&5 $as_echo "$as_me: WARNING: You must install spread-sheet-widget 0.6 (or use --without-gui) before building PSPP." >&2;} pspp_required_prereqs="$pspp_required_prereqs spread-sheet-widget 0.6 (or use --without-gui)" elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: You must install spread-sheet-widget 0.6 (or use --without-gui) before building PSPP." >&5 $as_echo "$as_me: WARNING: You must install spread-sheet-widget 0.6 (or use --without-gui) before building PSPP." >&2;} pspp_required_prereqs="$pspp_required_prereqs spread-sheet-widget 0.6 (or use --without-gui)" else SPREAD_SHEET_WIDGET_CFLAGS=$pkg_cv_SPREAD_SHEET_WIDGET_CFLAGS SPREAD_SHEET_WIDGET_LIBS=$pkg_cv_SPREAD_SHEET_WIDGET_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi for ac_prog in glib-genmarshal do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_GLIB_GENMARSHAL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$GLIB_GENMARSHAL"; then ac_cv_prog_GLIB_GENMARSHAL="$GLIB_GENMARSHAL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_GLIB_GENMARSHAL="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi GLIB_GENMARSHAL=$ac_cv_prog_GLIB_GENMARSHAL if test -n "$GLIB_GENMARSHAL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GLIB_GENMARSHAL" >&5 $as_echo "$GLIB_GENMARSHAL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$GLIB_GENMARSHAL" && break done if test "x$GLIB_GENMARSHAL" = x; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: You must install glib-genmarshal (or use --without-gui) before building PSPP." >&5 $as_echo "$as_me: WARNING: You must install glib-genmarshal (or use --without-gui) before building PSPP." >&2;} pspp_required_prereqs="$pspp_required_prereqs glib-genmarshal (or use --without-gui)" fi for ac_prog in glib-compile-resources do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_GLIB_COMPILE_RESOURCES+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$GLIB_COMPILE_RESOURCES"; then ac_cv_prog_GLIB_COMPILE_RESOURCES="$GLIB_COMPILE_RESOURCES" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_GLIB_COMPILE_RESOURCES="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi GLIB_COMPILE_RESOURCES=$ac_cv_prog_GLIB_COMPILE_RESOURCES if test -n "$GLIB_COMPILE_RESOURCES"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GLIB_COMPILE_RESOURCES" >&5 $as_echo "$GLIB_COMPILE_RESOURCES" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$GLIB_COMPILE_RESOURCES" && break done if test "x$GLIB_COMPILE_RESOURCES" = x; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: You must install glib-compile-resources (or use --without-gui) before building PSPP." >&5 $as_echo "$as_me: WARNING: You must install glib-compile-resources (or use --without-gui) before building PSPP." >&2;} pspp_required_prereqs="$pspp_required_prereqs glib-compile-resources (or use --without-gui)" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the preprocessor supports include_next" >&5 $as_echo_n "checking whether the preprocessor supports include_next... " >&6; } if ${gl_cv_have_include_next+:} false; then : $as_echo_n "(cached) " >&6 else rm -rf conftestd1a conftestd1b conftestd2 mkdir conftestd1a conftestd1b conftestd2 cat < conftestd1a/conftest.h #define DEFINED_IN_CONFTESTD1 #include_next #ifdef DEFINED_IN_CONFTESTD2 int foo; #else #error "include_next doesn't work" #endif EOF cat < conftestd1b/conftest.h #define DEFINED_IN_CONFTESTD1 #include #include_next #ifdef DEFINED_IN_CONFTESTD2 int foo; #else #error "include_next doesn't work" #endif EOF cat < conftestd2/conftest.h #ifndef DEFINED_IN_CONFTESTD1 #error "include_next test doesn't work" #endif #define DEFINED_IN_CONFTESTD2 EOF gl_save_CPPFLAGS="$CPPFLAGS" CPPFLAGS="$gl_save_CPPFLAGS -Iconftestd1b -Iconftestd2" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_compile "$LINENO"; then : gl_cv_have_include_next=yes else CPPFLAGS="$gl_save_CPPFLAGS -Iconftestd1a -Iconftestd2" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_compile "$LINENO"; then : gl_cv_have_include_next=buggy else gl_cv_have_include_next=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext CPPFLAGS="$gl_save_CPPFLAGS" rm -rf conftestd1a conftestd1b conftestd2 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_have_include_next" >&5 $as_echo "$gl_cv_have_include_next" >&6; } PRAGMA_SYSTEM_HEADER= if test $gl_cv_have_include_next = yes; then INCLUDE_NEXT=include_next INCLUDE_NEXT_AS_FIRST_DIRECTIVE=include_next if test -n "$GCC"; then PRAGMA_SYSTEM_HEADER='#pragma GCC system_header' fi else if test $gl_cv_have_include_next = buggy; then INCLUDE_NEXT=include INCLUDE_NEXT_AS_FIRST_DIRECTIVE=include_next else INCLUDE_NEXT=include INCLUDE_NEXT_AS_FIRST_DIRECTIVE=include fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether system header files limit the line length" >&5 $as_echo_n "checking whether system header files limit the line length... " >&6; } if ${gl_cv_pragma_columns+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __TANDEM choke me #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "choke me" >/dev/null 2>&1; then : gl_cv_pragma_columns=yes else gl_cv_pragma_columns=no fi rm -f conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_pragma_columns" >&5 $as_echo "$gl_cv_pragma_columns" >&6; } if test $gl_cv_pragma_columns = yes; then PRAGMA_COLUMNS="#pragma COLUMNS 10000" else PRAGMA_COLUMNS= fi if test $gl_cv_have_include_next = yes; then gl_cv_next_gtk_gtk_h='<'gtk/gtk.h'>' else { $as_echo "$as_me:${as_lineno-$LINENO}: checking absolute name of " >&5 $as_echo_n "checking absolute name of ... " >&6; } if ${gl_cv_next_gtk_gtk_h+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF case "$host_os" in aix*) gl_absname_cpp="$ac_cpp -C" ;; *) gl_absname_cpp="$ac_cpp" ;; esac case "$host_os" in mingw*) gl_dirsep_regex='[/\\]' ;; *) gl_dirsep_regex='\/' ;; esac gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g' gl_header_literal_regex=`echo 'gtk/gtk.h' \ | sed -e "$gl_make_literal_regex_sed"` gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{ s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/ s|^/[^/]|//&| p q }' gl_cv_absolute_gtk_gtk_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 | sed -n "$gl_absolute_header_sed"` gl_header=$gl_cv_absolute_gtk_gtk_h gl_cv_next_gtk_gtk_h='"'$gl_header'"' fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_gtk_gtk_h" >&5 $as_echo "$gl_cv_next_gtk_gtk_h" >&6; } fi NEXT_GTK_GTK_H=$gl_cv_next_gtk_gtk_h if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next' gl_next_as_first_directive='<'gtk/gtk.h'>' else # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include' gl_next_as_first_directive=$gl_cv_next_gtk_gtk_h fi NEXT_AS_FIRST_DIRECTIVE_GTK_GTK_H=$gl_next_as_first_directive # Check whether --with-libpq was given. if test "${with_libpq+set}" = set; then : withval=$with_libpq; fi # Extract the first word of "pg_config", so it can be a program name with args. set dummy pg_config; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_PG_CONFIG+:} false; then : $as_echo_n "(cached) " >&6 else case $PG_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_PG_CONFIG="$PG_CONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_dummy="$PATH:/usr/local/pgsql/bin:/usr/pgsql/bin" for as_dir in $as_dummy do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_PG_CONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi PG_CONFIG=$ac_cv_path_PG_CONFIG if test -n "$PG_CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PG_CONFIG" >&5 $as_echo "$PG_CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test x"$with_libpq" != x"no" && test -n "$PG_CONFIG" ; then PG_CFLAGS=-I`$PG_CONFIG --includedir` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for PQexec in -lpq" >&5 $as_echo_n "checking for PQexec in -lpq... " >&6; } if ${ac_cv_lib_pq_PQexec+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lpq $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char PQexec (); int main () { return PQexec (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_pq_PQexec=yes else ac_cv_lib_pq_PQexec=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pq_PQexec" >&5 $as_echo "$ac_cv_lib_pq_PQexec" >&6; } if test "x$ac_cv_lib_pq_PQexec" = xyes; then : : else PG_LDFLAGS="-L`$PG_CONFIG --libdir` -R`$PG_CONFIG --libdir`" fi PG_LIBS=-lpq if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libssl\""; } >&5 ($PKG_CONFIG --exists --print-errors "libssl") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then $as_echo "#define USE_SSL 1" >>confdefs.h fi # Now verify that we can actually link against libpq. If we are # cross-compiling and picked up a host libpq, or if libpq is just # badly installed, this will fail. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lpq links successfully" >&5 $as_echo_n "checking whether -lpq links successfully... " >&6; } if ${pspp_cv_have_libpq+:} false; then : $as_echo_n "(cached) " >&6 else save_CPPFLAGS=$CPPFLAGS save_LIBS=$LIBS save_LDFLAGS=$LDFLAGS CPPFLAGS="$PG_CFLAGS $CPPFLAGS" LIBS="$PG_LIBS $LIBS" LDFLAGS="$PG_LDFLAGS $LDFLAGS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { PQfinish (0); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : pspp_cv_have_libpq=yes else pspp_cv_have_libpq=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext CPPFLAGS=$save_CPPFLAGS LIBS=$save_LIBS LDFLAGS=$save_LDFLAGS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $pspp_cv_have_libpq" >&5 $as_echo "$pspp_cv_have_libpq" >&6; } if test $pspp_cv_have_libpq = yes; then PSQL_SUPPORT=yes $as_echo "#define PSQL_SUPPORT 1" >>confdefs.h else PSQL_SUPPORT=no PG_CONFIG= PG_CFLAGS= PG_LDFLAGS= PG_LIBS= fi else PSQL_SUPPORT=no pspp_cv_have_libpq=no fi pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for libxml-2.0" >&5 $as_echo_n "checking for libxml-2.0... " >&6; } if test -n "$LIBXML2_CFLAGS"; then pkg_cv_LIBXML2_CFLAGS="$LIBXML2_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libxml-2.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "libxml-2.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_LIBXML2_CFLAGS=`$PKG_CONFIG --cflags "libxml-2.0" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$LIBXML2_LIBS"; then pkg_cv_LIBXML2_LIBS="$LIBXML2_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libxml-2.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "libxml-2.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_LIBXML2_LIBS=`$PKG_CONFIG --libs "libxml-2.0" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then LIBXML2_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "libxml-2.0" 2>&1` else LIBXML2_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "libxml-2.0" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$LIBXML2_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: You must install libxml2 before building PSPP." >&5 $as_echo "$as_me: WARNING: You must install libxml2 before building PSPP." >&2;} pspp_required_prereqs="$pspp_required_prereqs libxml2" elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: You must install libxml2 before building PSPP." >&5 $as_echo "$as_me: WARNING: You must install libxml2 before building PSPP." >&2;} pspp_required_prereqs="$pspp_required_prereqs libxml2" else LIBXML2_CFLAGS=$pkg_cv_LIBXML2_CFLAGS LIBXML2_LIBS=$pkg_cv_LIBXML2_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing gzopen" >&5 $as_echo_n "checking for library containing gzopen... " >&6; } if ${ac_cv_search_gzopen+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char gzopen (); int main () { return gzopen (); ; return 0; } _ACEOF for ac_lib in '' z; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_gzopen=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_gzopen+:} false; then : break fi done if ${ac_cv_search_gzopen+:} false; then : else ac_cv_search_gzopen=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_gzopen" >&5 $as_echo "$ac_cv_search_gzopen" >&6; } ac_res=$ac_cv_search_gzopen if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: You must install zlib before building PSPP." >&5 $as_echo "$as_me: WARNING: You must install zlib before building PSPP." >&2;} pspp_required_prereqs="$pspp_required_prereqs zlib" fi for ac_header in zlib.h do : ac_fn_c_check_header_mongrel "$LINENO" "zlib.h" "ac_cv_header_zlib_h" "$ac_includes_default" if test "x$ac_cv_header_zlib_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_ZLIB_H 1 _ACEOF else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: You must install zlib before building PSPP." >&5 $as_echo "$as_me: WARNING: You must install zlib before building PSPP." >&2;} pspp_required_prereqs="$pspp_required_prereqs zlib" fi done $as_echo "#define crc32 gl_crc32" >>confdefs.h # Check whether --with-perl-module was given. if test "${with_perl_module+set}" = set; then : withval=$with_perl_module; case $with_perl_module in # ( yes|no) ;; # ( *) { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "--with-perl-module argument must be 'yes' or 'no' See \`config.log' for more details" "$LINENO" 5; } ;; esac WITH_PERL_MODULE=$with_perl_module else if test x"$cross_compiling" != x"yes"; then WITH_PERL_MODULE=yes else WITH_PERL_MODULE=no fi fi if test $WITH_PERL_MODULE = yes; then WITH_PERL_MODULE_TRUE= WITH_PERL_MODULE_FALSE='#' else WITH_PERL_MODULE_TRUE='#' WITH_PERL_MODULE_FALSE= fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing cblas_dsdot" >&5 $as_echo_n "checking for library containing cblas_dsdot... " >&6; } if ${ac_cv_search_cblas_dsdot+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char cblas_dsdot (); int main () { return cblas_dsdot (); ; return 0; } _ACEOF for ac_lib in '' gslcblas; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_cblas_dsdot=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_cblas_dsdot+:} false; then : break fi done if ${ac_cv_search_cblas_dsdot+:} false; then : else ac_cv_search_cblas_dsdot=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_cblas_dsdot" >&5 $as_echo "$ac_cv_search_cblas_dsdot" >&6; } ac_res=$ac_cv_search_cblas_dsdot if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: You must install libgslcblas before building PSPP." >&5 $as_echo "$as_me: WARNING: You must install libgslcblas before building PSPP." >&2;} pspp_required_prereqs="$pspp_required_prereqs libgslcblas" fi pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gsl >= 1.13" >&5 $as_echo_n "checking for gsl >= 1.13... " >&6; } if test -n "$GSL_CFLAGS"; then pkg_cv_GSL_CFLAGS="$GSL_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gsl >= 1.13\""; } >&5 ($PKG_CONFIG --exists --print-errors "gsl >= 1.13") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GSL_CFLAGS=`$PKG_CONFIG --cflags "gsl >= 1.13" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$GSL_LIBS"; then pkg_cv_GSL_LIBS="$GSL_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gsl >= 1.13\""; } >&5 ($PKG_CONFIG --exists --print-errors "gsl >= 1.13") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GSL_LIBS=`$PKG_CONFIG --libs "gsl >= 1.13" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then GSL_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "gsl >= 1.13" 2>&1` else GSL_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "gsl >= 1.13" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$GSL_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing gsl_poly_eval_derivs" >&5 $as_echo_n "checking for library containing gsl_poly_eval_derivs... " >&6; } if ${ac_cv_search_gsl_poly_eval_derivs+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char gsl_poly_eval_derivs (); int main () { return gsl_poly_eval_derivs (); ; return 0; } _ACEOF for ac_lib in '' gsl; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_gsl_poly_eval_derivs=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_gsl_poly_eval_derivs+:} false; then : break fi done if ${ac_cv_search_gsl_poly_eval_derivs+:} false; then : else ac_cv_search_gsl_poly_eval_derivs=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_gsl_poly_eval_derivs" >&5 $as_echo "$ac_cv_search_gsl_poly_eval_derivs" >&6; } ac_res=$ac_cv_search_gsl_poly_eval_derivs if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: You must install gsl version 1.13 or later before building PSPP." >&5 $as_echo "$as_me: WARNING: You must install gsl version 1.13 or later before building PSPP." >&2;} pspp_required_prereqs="$pspp_required_prereqs gsl version 1.13 or later" fi elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing gsl_poly_eval_derivs" >&5 $as_echo_n "checking for library containing gsl_poly_eval_derivs... " >&6; } if ${ac_cv_search_gsl_poly_eval_derivs+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char gsl_poly_eval_derivs (); int main () { return gsl_poly_eval_derivs (); ; return 0; } _ACEOF for ac_lib in '' gsl; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_gsl_poly_eval_derivs=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_gsl_poly_eval_derivs+:} false; then : break fi done if ${ac_cv_search_gsl_poly_eval_derivs+:} false; then : else ac_cv_search_gsl_poly_eval_derivs=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_gsl_poly_eval_derivs" >&5 $as_echo "$ac_cv_search_gsl_poly_eval_derivs" >&6; } ac_res=$ac_cv_search_gsl_poly_eval_derivs if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: You must install gsl version 1.13 or later before building PSPP." >&5 $as_echo "$as_me: WARNING: You must install gsl version 1.13 or later before building PSPP." >&2;} pspp_required_prereqs="$pspp_required_prereqs gsl version 1.13 or later" fi else GSL_CFLAGS=$pkg_cv_GSL_CFLAGS GSL_LIBS=$pkg_cv_GSL_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for inline" >&5 $as_echo_n "checking for inline... " >&6; } if ${ac_cv_c_inline+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_c_inline=no for ac_kw in inline __inline__ __inline; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifndef __cplusplus typedef int foo_t; static $ac_kw foo_t static_foo () {return 0; } $ac_kw foo_t foo () {return 0; } #endif _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_inline=$ac_kw fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext test "$ac_cv_c_inline" != no && break done fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_inline" >&5 $as_echo "$ac_cv_c_inline" >&6; } case $ac_cv_c_inline in inline | yes) ;; *) case $ac_cv_c_inline in no) ac_val=;; *) ac_val=$ac_cv_c_inline;; esac cat >>confdefs.h <<_ACEOF #ifndef __cplusplus #define inline $ac_val #endif _ACEOF ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the compiler generally respects inline" >&5 $as_echo_n "checking whether the compiler generally respects inline... " >&6; } if ${gl_cv_c_inline_effective+:} false; then : $as_echo_n "(cached) " >&6 else if test $ac_cv_c_inline = no; then gl_cv_c_inline_effective=no else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifdef __NO_INLINE__ #error "inline is not effective" #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : gl_cv_c_inline_effective=yes else gl_cv_c_inline_effective=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_c_inline_effective" >&5 $as_echo "$gl_cv_c_inline_effective" >&6; } if test $gl_cv_c_inline_effective = yes; then $as_echo "#define HAVE_INLINE 1" >>confdefs.h fi # GSL only uses "inline" at all if HAVE_INLINE is defined as a macro. # In turn, gnulib's gl_INLINE is one macro that does that. We need to # make sure that it has run by the time we run this test, otherwise we'll # get a false result. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -fgnu89-inline" >&5 $as_echo_n "checking whether $CC accepts -fgnu89-inline... " >&6; } if ${pspp_cv__fgnu89_inline+:} false; then : $as_echo_n "(cached) " >&6 else pspp_save_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -fgnu89-inline" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : pspp_cv__fgnu89_inline=yes else pspp_cv__fgnu89_inline=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext CFLAGS="$pspp_save_CFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $pspp_cv__fgnu89_inline" >&5 $as_echo "$pspp_cv__fgnu89_inline" >&6; } if test $pspp_cv__fgnu89_inline = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether GSL needs -fgnu89-inline to link" >&5 $as_echo_n "checking whether GSL needs -fgnu89-inline to link... " >&6; } if ${pspp_cv_gsl_needs_fgnu89_inline+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { GSL_MAX_INT(1,2); ; return 0; } _ACEOF mv conftest.$ac_ext conftest1.$ac_ext cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include void x (void) {} _ACEOF mv conftest.$ac_ext conftest2.$ac_ext rm -f conftest1.$ac_objext conftest2.$ac_objext conftest$ac_exeext pspp_link2='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest1.$ac_ext conftest2.$ac_ext $LIBS >&5' if { { ac_try="$pspp_link2" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$pspp_link2") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || test -x conftest$ac_exeext }; then : pspp_cv_gsl_needs_fgnu89_inline=no else echo "$as_me: failed source file 1 of 2 was:" >&5 sed 's/^/| /' conftest1.$ac_ext >&5 echo "$as_me: failed source file 2 of 2 was:" >&5 sed 's/^/| /' conftest2.$ac_ext >&5 pspp_cv_gsl_needs_fgnu89_inline=yes fi rm -rf conftest.dSYM conftest1.dSYM conftest2.dSYM rm -f core conftest.err conftest1.err conftest2.err rm -f conftest1.$ac_objext conftest2.$ac_objext conftest*_ipa8_conftest*.oo rm -f conftest$ac_exeext rm -f conftest1.$ac_ext conftest1.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $pspp_cv_gsl_needs_fgnu89_inline" >&5 $as_echo "$pspp_cv_gsl_needs_fgnu89_inline" >&6; } if test "$pspp_cv_gsl_needs_fgnu89_inline" = "yes"; then CFLAGS="$CFLAGS -fgnu89-inline" fi else : fi use_additional=yes acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval additional_includedir=\"$includedir\" eval additional_libdir=\"$libdir\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" # Check whether --with-libreadline-prefix was given. if test "${with_libreadline_prefix+set}" = set; then : withval=$with_libreadline_prefix; if test "X$withval" = "Xno"; then use_additional=no else if test "X$withval" = "X"; then acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval additional_includedir=\"$includedir\" eval additional_libdir=\"$libdir\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" else additional_includedir="$withval/include" additional_libdir="$withval/$acl_libdirstem" if test "$acl_libdirstem2" != "$acl_libdirstem" \ && ! test -d "$withval/$acl_libdirstem"; then additional_libdir="$withval/$acl_libdirstem2" fi fi fi fi LIBREADLINE= LTLIBREADLINE= INCREADLINE= LIBREADLINE_PREFIX= HAVE_LIBREADLINE= rpathdirs= ltrpathdirs= names_already_handled= names_next_round='readline ' while test -n "$names_next_round"; do names_this_round="$names_next_round" names_next_round= for name in $names_this_round; do already_handled= for n in $names_already_handled; do if test "$n" = "$name"; then already_handled=yes break fi done if test -z "$already_handled"; then names_already_handled="$names_already_handled $name" uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./+-|ABCDEFGHIJKLMNOPQRSTUVWXYZ____|'` eval value=\"\$HAVE_LIB$uppername\" if test -n "$value"; then if test "$value" = yes; then eval value=\"\$LIB$uppername\" test -z "$value" || LIBREADLINE="${LIBREADLINE}${LIBREADLINE:+ }$value" eval value=\"\$LTLIB$uppername\" test -z "$value" || LTLIBREADLINE="${LTLIBREADLINE}${LTLIBREADLINE:+ }$value" else : fi else found_dir= found_la= found_so= found_a= eval libname=\"$acl_libname_spec\" # typically: libname=lib$name if test -n "$acl_shlibext"; then shrext=".$acl_shlibext" # typically: shrext=.so else shrext= fi if test $use_additional = yes; then dir="$additional_libdir" if test -n "$acl_shlibext"; then if test -f "$dir/$libname$shrext"; then found_dir="$dir" found_so="$dir/$libname$shrext" else if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then ver=`(cd "$dir" && \ for f in "$libname$shrext".*; do echo "$f"; done \ | sed -e "s,^$libname$shrext\\\\.,," \ | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \ | sed 1q ) 2>/dev/null` if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then found_dir="$dir" found_so="$dir/$libname$shrext.$ver" fi else eval library_names=\"$acl_library_names_spec\" for f in $library_names; do if test -f "$dir/$f"; then found_dir="$dir" found_so="$dir/$f" break fi done fi fi fi if test "X$found_dir" = "X"; then if test -f "$dir/$libname.$acl_libext"; then found_dir="$dir" found_a="$dir/$libname.$acl_libext" fi fi if test "X$found_dir" != "X"; then if test -f "$dir/$libname.la"; then found_la="$dir/$libname.la" fi fi fi if test "X$found_dir" = "X"; then for x in $LDFLAGS $LTLIBREADLINE; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" case "$x" in -L*) dir=`echo "X$x" | sed -e 's/^X-L//'` if test -n "$acl_shlibext"; then if test -f "$dir/$libname$shrext"; then found_dir="$dir" found_so="$dir/$libname$shrext" else if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then ver=`(cd "$dir" && \ for f in "$libname$shrext".*; do echo "$f"; done \ | sed -e "s,^$libname$shrext\\\\.,," \ | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \ | sed 1q ) 2>/dev/null` if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then found_dir="$dir" found_so="$dir/$libname$shrext.$ver" fi else eval library_names=\"$acl_library_names_spec\" for f in $library_names; do if test -f "$dir/$f"; then found_dir="$dir" found_so="$dir/$f" break fi done fi fi fi if test "X$found_dir" = "X"; then if test -f "$dir/$libname.$acl_libext"; then found_dir="$dir" found_a="$dir/$libname.$acl_libext" fi fi if test "X$found_dir" != "X"; then if test -f "$dir/$libname.la"; then found_la="$dir/$libname.la" fi fi ;; esac if test "X$found_dir" != "X"; then break fi done fi if test "X$found_dir" != "X"; then LTLIBREADLINE="${LTLIBREADLINE}${LTLIBREADLINE:+ }-L$found_dir -l$name" if test "X$found_so" != "X"; then if test "$enable_rpath" = no \ || test "X$found_dir" = "X/usr/$acl_libdirstem" \ || test "X$found_dir" = "X/usr/$acl_libdirstem2"; then LIBREADLINE="${LIBREADLINE}${LIBREADLINE:+ }$found_so" else haveit= for x in $ltrpathdirs; do if test "X$x" = "X$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then ltrpathdirs="$ltrpathdirs $found_dir" fi if test "$acl_hardcode_direct" = yes; then LIBREADLINE="${LIBREADLINE}${LIBREADLINE:+ }$found_so" else if test -n "$acl_hardcode_libdir_flag_spec" && test "$acl_hardcode_minus_L" = no; then LIBREADLINE="${LIBREADLINE}${LIBREADLINE:+ }$found_so" haveit= for x in $rpathdirs; do if test "X$x" = "X$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then rpathdirs="$rpathdirs $found_dir" fi else haveit= for x in $LDFLAGS $LIBREADLINE; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X-L$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then LIBREADLINE="${LIBREADLINE}${LIBREADLINE:+ }-L$found_dir" fi if test "$acl_hardcode_minus_L" != no; then LIBREADLINE="${LIBREADLINE}${LIBREADLINE:+ }$found_so" else LIBREADLINE="${LIBREADLINE}${LIBREADLINE:+ }-l$name" fi fi fi fi else if test "X$found_a" != "X"; then LIBREADLINE="${LIBREADLINE}${LIBREADLINE:+ }$found_a" else LIBREADLINE="${LIBREADLINE}${LIBREADLINE:+ }-L$found_dir -l$name" fi fi additional_includedir= case "$found_dir" in */$acl_libdirstem | */$acl_libdirstem/) basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem/"'*$,,'` if test "$name" = 'readline'; then LIBREADLINE_PREFIX="$basedir" fi additional_includedir="$basedir/include" ;; */$acl_libdirstem2 | */$acl_libdirstem2/) basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem2/"'*$,,'` if test "$name" = 'readline'; then LIBREADLINE_PREFIX="$basedir" fi additional_includedir="$basedir/include" ;; esac if test "X$additional_includedir" != "X"; then if test "X$additional_includedir" != "X/usr/include"; then haveit= if test "X$additional_includedir" = "X/usr/local/include"; then if test -n "$GCC"; then case $host_os in linux* | gnu* | k*bsd*-gnu) haveit=yes;; esac fi fi if test -z "$haveit"; then for x in $CPPFLAGS $INCREADLINE; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X-I$additional_includedir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_includedir"; then INCREADLINE="${INCREADLINE}${INCREADLINE:+ }-I$additional_includedir" fi fi fi fi fi if test -n "$found_la"; then save_libdir="$libdir" case "$found_la" in */* | *\\*) . "$found_la" ;; *) . "./$found_la" ;; esac libdir="$save_libdir" for dep in $dependency_libs; do case "$dep" in -L*) additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'` if test "X$additional_libdir" != "X/usr/$acl_libdirstem" \ && test "X$additional_libdir" != "X/usr/$acl_libdirstem2"; then haveit= if test "X$additional_libdir" = "X/usr/local/$acl_libdirstem" \ || test "X$additional_libdir" = "X/usr/local/$acl_libdirstem2"; then if test -n "$GCC"; then case $host_os in linux* | gnu* | k*bsd*-gnu) haveit=yes;; esac fi fi if test -z "$haveit"; then haveit= for x in $LDFLAGS $LIBREADLINE; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X-L$additional_libdir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_libdir"; then LIBREADLINE="${LIBREADLINE}${LIBREADLINE:+ }-L$additional_libdir" fi fi haveit= for x in $LDFLAGS $LTLIBREADLINE; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X-L$additional_libdir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_libdir"; then LTLIBREADLINE="${LTLIBREADLINE}${LTLIBREADLINE:+ }-L$additional_libdir" fi fi fi fi ;; -R*) dir=`echo "X$dep" | sed -e 's/^X-R//'` if test "$enable_rpath" != no; then haveit= for x in $rpathdirs; do if test "X$x" = "X$dir"; then haveit=yes break fi done if test -z "$haveit"; then rpathdirs="$rpathdirs $dir" fi haveit= for x in $ltrpathdirs; do if test "X$x" = "X$dir"; then haveit=yes break fi done if test -z "$haveit"; then ltrpathdirs="$ltrpathdirs $dir" fi fi ;; -l*) names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'` ;; *.la) names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'` ;; *) LIBREADLINE="${LIBREADLINE}${LIBREADLINE:+ }$dep" LTLIBREADLINE="${LTLIBREADLINE}${LTLIBREADLINE:+ }$dep" ;; esac done fi else LIBREADLINE="${LIBREADLINE}${LIBREADLINE:+ }-l$name" LTLIBREADLINE="${LTLIBREADLINE}${LTLIBREADLINE:+ }-l$name" fi fi fi done done if test "X$rpathdirs" != "X"; then if test -n "$acl_hardcode_libdir_separator"; then alldirs= for found_dir in $rpathdirs; do alldirs="${alldirs}${alldirs:+$acl_hardcode_libdir_separator}$found_dir" done acl_save_libdir="$libdir" libdir="$alldirs" eval flag=\"$acl_hardcode_libdir_flag_spec\" libdir="$acl_save_libdir" LIBREADLINE="${LIBREADLINE}${LIBREADLINE:+ }$flag" else for found_dir in $rpathdirs; do acl_save_libdir="$libdir" libdir="$found_dir" eval flag=\"$acl_hardcode_libdir_flag_spec\" libdir="$acl_save_libdir" LIBREADLINE="${LIBREADLINE}${LIBREADLINE:+ }$flag" done fi fi if test "X$ltrpathdirs" != "X"; then for found_dir in $ltrpathdirs; do LTLIBREADLINE="${LTLIBREADLINE}${LTLIBREADLINE:+ }-R$found_dir" done fi use_additional=yes acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval additional_includedir=\"$includedir\" eval additional_libdir=\"$libdir\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" # Check whether --with-libhistory-prefix was given. if test "${with_libhistory_prefix+set}" = set; then : withval=$with_libhistory_prefix; if test "X$withval" = "Xno"; then use_additional=no else if test "X$withval" = "X"; then acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval additional_includedir=\"$includedir\" eval additional_libdir=\"$libdir\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" else additional_includedir="$withval/include" additional_libdir="$withval/$acl_libdirstem" if test "$acl_libdirstem2" != "$acl_libdirstem" \ && ! test -d "$withval/$acl_libdirstem"; then additional_libdir="$withval/$acl_libdirstem2" fi fi fi fi LIBHISTORY= LTLIBHISTORY= INCHISTORY= LIBHISTORY_PREFIX= HAVE_LIBHISTORY= rpathdirs= ltrpathdirs= names_already_handled= names_next_round='history ' while test -n "$names_next_round"; do names_this_round="$names_next_round" names_next_round= for name in $names_this_round; do already_handled= for n in $names_already_handled; do if test "$n" = "$name"; then already_handled=yes break fi done if test -z "$already_handled"; then names_already_handled="$names_already_handled $name" uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./+-|ABCDEFGHIJKLMNOPQRSTUVWXYZ____|'` eval value=\"\$HAVE_LIB$uppername\" if test -n "$value"; then if test "$value" = yes; then eval value=\"\$LIB$uppername\" test -z "$value" || LIBHISTORY="${LIBHISTORY}${LIBHISTORY:+ }$value" eval value=\"\$LTLIB$uppername\" test -z "$value" || LTLIBHISTORY="${LTLIBHISTORY}${LTLIBHISTORY:+ }$value" else : fi else found_dir= found_la= found_so= found_a= eval libname=\"$acl_libname_spec\" # typically: libname=lib$name if test -n "$acl_shlibext"; then shrext=".$acl_shlibext" # typically: shrext=.so else shrext= fi if test $use_additional = yes; then dir="$additional_libdir" if test -n "$acl_shlibext"; then if test -f "$dir/$libname$shrext"; then found_dir="$dir" found_so="$dir/$libname$shrext" else if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then ver=`(cd "$dir" && \ for f in "$libname$shrext".*; do echo "$f"; done \ | sed -e "s,^$libname$shrext\\\\.,," \ | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \ | sed 1q ) 2>/dev/null` if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then found_dir="$dir" found_so="$dir/$libname$shrext.$ver" fi else eval library_names=\"$acl_library_names_spec\" for f in $library_names; do if test -f "$dir/$f"; then found_dir="$dir" found_so="$dir/$f" break fi done fi fi fi if test "X$found_dir" = "X"; then if test -f "$dir/$libname.$acl_libext"; then found_dir="$dir" found_a="$dir/$libname.$acl_libext" fi fi if test "X$found_dir" != "X"; then if test -f "$dir/$libname.la"; then found_la="$dir/$libname.la" fi fi fi if test "X$found_dir" = "X"; then for x in $LDFLAGS $LTLIBHISTORY; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" case "$x" in -L*) dir=`echo "X$x" | sed -e 's/^X-L//'` if test -n "$acl_shlibext"; then if test -f "$dir/$libname$shrext"; then found_dir="$dir" found_so="$dir/$libname$shrext" else if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then ver=`(cd "$dir" && \ for f in "$libname$shrext".*; do echo "$f"; done \ | sed -e "s,^$libname$shrext\\\\.,," \ | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \ | sed 1q ) 2>/dev/null` if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then found_dir="$dir" found_so="$dir/$libname$shrext.$ver" fi else eval library_names=\"$acl_library_names_spec\" for f in $library_names; do if test -f "$dir/$f"; then found_dir="$dir" found_so="$dir/$f" break fi done fi fi fi if test "X$found_dir" = "X"; then if test -f "$dir/$libname.$acl_libext"; then found_dir="$dir" found_a="$dir/$libname.$acl_libext" fi fi if test "X$found_dir" != "X"; then if test -f "$dir/$libname.la"; then found_la="$dir/$libname.la" fi fi ;; esac if test "X$found_dir" != "X"; then break fi done fi if test "X$found_dir" != "X"; then LTLIBHISTORY="${LTLIBHISTORY}${LTLIBHISTORY:+ }-L$found_dir -l$name" if test "X$found_so" != "X"; then if test "$enable_rpath" = no \ || test "X$found_dir" = "X/usr/$acl_libdirstem" \ || test "X$found_dir" = "X/usr/$acl_libdirstem2"; then LIBHISTORY="${LIBHISTORY}${LIBHISTORY:+ }$found_so" else haveit= for x in $ltrpathdirs; do if test "X$x" = "X$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then ltrpathdirs="$ltrpathdirs $found_dir" fi if test "$acl_hardcode_direct" = yes; then LIBHISTORY="${LIBHISTORY}${LIBHISTORY:+ }$found_so" else if test -n "$acl_hardcode_libdir_flag_spec" && test "$acl_hardcode_minus_L" = no; then LIBHISTORY="${LIBHISTORY}${LIBHISTORY:+ }$found_so" haveit= for x in $rpathdirs; do if test "X$x" = "X$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then rpathdirs="$rpathdirs $found_dir" fi else haveit= for x in $LDFLAGS $LIBHISTORY; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X-L$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then LIBHISTORY="${LIBHISTORY}${LIBHISTORY:+ }-L$found_dir" fi if test "$acl_hardcode_minus_L" != no; then LIBHISTORY="${LIBHISTORY}${LIBHISTORY:+ }$found_so" else LIBHISTORY="${LIBHISTORY}${LIBHISTORY:+ }-l$name" fi fi fi fi else if test "X$found_a" != "X"; then LIBHISTORY="${LIBHISTORY}${LIBHISTORY:+ }$found_a" else LIBHISTORY="${LIBHISTORY}${LIBHISTORY:+ }-L$found_dir -l$name" fi fi additional_includedir= case "$found_dir" in */$acl_libdirstem | */$acl_libdirstem/) basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem/"'*$,,'` if test "$name" = 'history'; then LIBHISTORY_PREFIX="$basedir" fi additional_includedir="$basedir/include" ;; */$acl_libdirstem2 | */$acl_libdirstem2/) basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem2/"'*$,,'` if test "$name" = 'history'; then LIBHISTORY_PREFIX="$basedir" fi additional_includedir="$basedir/include" ;; esac if test "X$additional_includedir" != "X"; then if test "X$additional_includedir" != "X/usr/include"; then haveit= if test "X$additional_includedir" = "X/usr/local/include"; then if test -n "$GCC"; then case $host_os in linux* | gnu* | k*bsd*-gnu) haveit=yes;; esac fi fi if test -z "$haveit"; then for x in $CPPFLAGS $INCHISTORY; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X-I$additional_includedir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_includedir"; then INCHISTORY="${INCHISTORY}${INCHISTORY:+ }-I$additional_includedir" fi fi fi fi fi if test -n "$found_la"; then save_libdir="$libdir" case "$found_la" in */* | *\\*) . "$found_la" ;; *) . "./$found_la" ;; esac libdir="$save_libdir" for dep in $dependency_libs; do case "$dep" in -L*) additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'` if test "X$additional_libdir" != "X/usr/$acl_libdirstem" \ && test "X$additional_libdir" != "X/usr/$acl_libdirstem2"; then haveit= if test "X$additional_libdir" = "X/usr/local/$acl_libdirstem" \ || test "X$additional_libdir" = "X/usr/local/$acl_libdirstem2"; then if test -n "$GCC"; then case $host_os in linux* | gnu* | k*bsd*-gnu) haveit=yes;; esac fi fi if test -z "$haveit"; then haveit= for x in $LDFLAGS $LIBHISTORY; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X-L$additional_libdir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_libdir"; then LIBHISTORY="${LIBHISTORY}${LIBHISTORY:+ }-L$additional_libdir" fi fi haveit= for x in $LDFLAGS $LTLIBHISTORY; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X-L$additional_libdir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_libdir"; then LTLIBHISTORY="${LTLIBHISTORY}${LTLIBHISTORY:+ }-L$additional_libdir" fi fi fi fi ;; -R*) dir=`echo "X$dep" | sed -e 's/^X-R//'` if test "$enable_rpath" != no; then haveit= for x in $rpathdirs; do if test "X$x" = "X$dir"; then haveit=yes break fi done if test -z "$haveit"; then rpathdirs="$rpathdirs $dir" fi haveit= for x in $ltrpathdirs; do if test "X$x" = "X$dir"; then haveit=yes break fi done if test -z "$haveit"; then ltrpathdirs="$ltrpathdirs $dir" fi fi ;; -l*) names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'` ;; *.la) names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'` ;; *) LIBHISTORY="${LIBHISTORY}${LIBHISTORY:+ }$dep" LTLIBHISTORY="${LTLIBHISTORY}${LTLIBHISTORY:+ }$dep" ;; esac done fi else LIBHISTORY="${LIBHISTORY}${LIBHISTORY:+ }-l$name" LTLIBHISTORY="${LTLIBHISTORY}${LTLIBHISTORY:+ }-l$name" fi fi fi done done if test "X$rpathdirs" != "X"; then if test -n "$acl_hardcode_libdir_separator"; then alldirs= for found_dir in $rpathdirs; do alldirs="${alldirs}${alldirs:+$acl_hardcode_libdir_separator}$found_dir" done acl_save_libdir="$libdir" libdir="$alldirs" eval flag=\"$acl_hardcode_libdir_flag_spec\" libdir="$acl_save_libdir" LIBHISTORY="${LIBHISTORY}${LIBHISTORY:+ }$flag" else for found_dir in $rpathdirs; do acl_save_libdir="$libdir" libdir="$found_dir" eval flag=\"$acl_hardcode_libdir_flag_spec\" libdir="$acl_save_libdir" LIBHISTORY="${LIBHISTORY}${LIBHISTORY:+ }$flag" done fi fi if test "X$ltrpathdirs" != "X"; then for found_dir in $ltrpathdirs; do LTLIBHISTORY="${LTLIBHISTORY}${LTLIBHISTORY:+ }-R$found_dir" done fi am_save_CPPFLAGS="$CPPFLAGS" for element in $INCREADLINE $INCHISTORY; do haveit= for x in $CPPFLAGS; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X$element"; then haveit=yes break fi done if test -z "$haveit"; then CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }$element" fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking for readline" >&5 $as_echo_n "checking for readline... " >&6; } if ${gl_cv_lib_readline+:} false; then : $as_echo_n "(cached) " >&6 else gl_cv_lib_readline=no am_save_LIBS="$LIBS" for extra_lib in "" ncurses termcap curses; do LIBS="$am_save_LIBS $LIBREADLINE $LIBHISTORY" if test -n "$extra_lib"; then LIBS="$LIBS -l$extra_lib" fi cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include int main () { readline((char*)0); add_history((char*)0); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : gl_cv_lib_readline=yes fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test "$gl_cv_lib_readline" = yes; then if test -n "$extra_lib"; then LIBREADLINE="$LIBREADLINE $LIBHISTORY -l$extra_lib" LTLIBREADLINE="$LTLIBREADLINE $LTLIBHISTORY -l$extra_lib" fi break fi done LIBS="$am_save_LIBS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_lib_readline" >&5 $as_echo "$gl_cv_lib_readline" >&6; } if test "$gl_cv_lib_readline" = yes; then $as_echo "#define HAVE_READLINE 1" >>confdefs.h { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to link with libreadline" >&5 $as_echo_n "checking how to link with libreadline... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIBREADLINE" >&5 $as_echo "$LIBREADLINE" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing rl_echo_signal_char" >&5 $as_echo_n "checking for library containing rl_echo_signal_char... " >&6; } if ${ac_cv_search_rl_echo_signal_char+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char rl_echo_signal_char (); int main () { return rl_echo_signal_char (); ; return 0; } _ACEOF for ac_lib in '' readline; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $LIBREADLINE $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_rl_echo_signal_char=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_rl_echo_signal_char+:} false; then : break fi done if ${ac_cv_search_rl_echo_signal_char+:} false; then : else ac_cv_search_rl_echo_signal_char=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_rl_echo_signal_char" >&5 $as_echo "$ac_cv_search_rl_echo_signal_char" >&6; } ac_res=$ac_cv_search_rl_echo_signal_char if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" $as_echo "#define HAVE_RL_ECHO_SIGNAL_CHAR 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing rl_outstream" >&5 $as_echo_n "checking for library containing rl_outstream... " >&6; } if ${ac_cv_search_rl_outstream+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char rl_outstream (); int main () { return rl_outstream (); ; return 0; } _ACEOF for ac_lib in '' readline; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $LIBREADLINE $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_rl_outstream=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_rl_outstream+:} false; then : break fi done if ${ac_cv_search_rl_outstream+:} false; then : else ac_cv_search_rl_outstream=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_rl_outstream" >&5 $as_echo "$ac_cv_search_rl_outstream" >&6; } ac_res=$ac_cv_search_rl_outstream if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" $as_echo "#define HAVE_RL_OUTSTREAM 1" >>confdefs.h fi else CPPFLAGS="$am_save_CPPFLAGS" LIBREADLINE= LTLIBREADLINE= LIBHISTORY= LTLIBHISTORY= pspp_optional_prereqs="$pspp_optional_prereqs libreadline (which may itself require libncurses or libtermcap)" fi for ac_header in sys/wait.h fpu_control.h ieeefp.h fenv.h pwd.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done ac_fn_c_check_decl "$LINENO" "SIGWINCH" "ac_cv_have_decl_SIGWINCH" "#include /* NetBSD declares sys_siglist in unistd.h. */ #ifdef HAVE_UNISTD_H # include #endif " if test "x$ac_cv_have_decl_SIGWINCH" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_SIGWINCH $ac_have_decl _ACEOF # For gnulib. # Check whether --enable-cross-guesses was given. if test "${enable_cross_guesses+set}" = set; then : enableval=$enable_cross_guesses; if test "x$enableval" != xconservative && test "x$enableval" != xrisky; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: invalid argument supplied to --enable-cross-guesses" >&5 $as_echo "$as_me: WARNING: invalid argument supplied to --enable-cross-guesses" >&2;} enableval=conservative fi gl_cross_guesses="$enableval" else gl_cross_guesses=conservative fi if test $gl_cross_guesses = risky; then gl_cross_guess_normal="guessing yes" gl_cross_guess_inverted="guessing no" else gl_cross_guess_normal="guessing no" gl_cross_guess_inverted="guessing yes" fi LIBC_FATAL_STDERR_=1 export LIBC_FATAL_STDERR_ ac_fn_c_check_type "$LINENO" "size_t" "ac_cv_type_size_t" "$ac_includes_default" if test "x$ac_cv_type_size_t" = xyes; then : else cat >>confdefs.h <<_ACEOF #define size_t unsigned int _ACEOF fi # The Ultrix 4.2 mips builtin alloca declared by alloca.h only works # for constant arguments. Useless! { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working alloca.h" >&5 $as_echo_n "checking for working alloca.h... " >&6; } if ${ac_cv_working_alloca_h+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { char *p = (char *) alloca (2 * sizeof (int)); if (p) return 0; ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_working_alloca_h=yes else ac_cv_working_alloca_h=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_working_alloca_h" >&5 $as_echo "$ac_cv_working_alloca_h" >&6; } if test $ac_cv_working_alloca_h = yes; then $as_echo "#define HAVE_ALLOCA_H 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for alloca" >&5 $as_echo_n "checking for alloca... " >&6; } if ${ac_cv_func_alloca_works+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __GNUC__ # define alloca __builtin_alloca #else # ifdef _MSC_VER # include # define alloca _alloca # else # ifdef HAVE_ALLOCA_H # include # else # ifdef _AIX #pragma alloca # else # ifndef alloca /* predefined by HP cc +Olibcalls */ void *alloca (size_t); # endif # endif # endif # endif #endif int main () { char *p = (char *) alloca (1); if (p) return 0; ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_func_alloca_works=yes else ac_cv_func_alloca_works=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_alloca_works" >&5 $as_echo "$ac_cv_func_alloca_works" >&6; } if test $ac_cv_func_alloca_works = yes; then $as_echo "#define HAVE_ALLOCA 1" >>confdefs.h else # The SVR3 libPW and SVR4 libucb both contain incompatible functions # that cause trouble. Some versions do not even contain alloca or # contain a buggy version. If you still want to use their alloca, # use ar to extract alloca.o from them instead of compiling alloca.c. ALLOCA=\${LIBOBJDIR}alloca.$ac_objext $as_echo "#define C_ALLOCA 1" >>confdefs.h { $as_echo "$as_me:${as_lineno-$LINENO}: checking stack direction for C alloca" >&5 $as_echo_n "checking stack direction for C alloca... " >&6; } if ${ac_cv_c_stack_direction+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : ac_cv_c_stack_direction=0 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int find_stack_direction (int *addr, int depth) { int dir, dummy = 0; if (! addr) addr = &dummy; *addr = addr < &dummy ? 1 : addr == &dummy ? 0 : -1; dir = depth ? find_stack_direction (addr, depth - 1) : 0; return dir + dummy; } int main (int argc, char **argv) { return find_stack_direction (0, argc + !argv + 20) < 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_c_stack_direction=1 else ac_cv_c_stack_direction=-1 fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_stack_direction" >&5 $as_echo "$ac_cv_c_stack_direction" >&6; } cat >>confdefs.h <<_ACEOF #define STACK_DIRECTION $ac_cv_c_stack_direction _ACEOF fi for ac_header in $ac_header_list do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default " if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done GNULIB_BTOWC=0; GNULIB_WCTOB=0; GNULIB_MBSINIT=0; GNULIB_MBRTOWC=0; GNULIB_MBRLEN=0; GNULIB_MBSRTOWCS=0; GNULIB_MBSNRTOWCS=0; GNULIB_WCRTOMB=0; GNULIB_WCSRTOMBS=0; GNULIB_WCSNRTOMBS=0; GNULIB_WCWIDTH=0; GNULIB_WMEMCHR=0; GNULIB_WMEMCMP=0; GNULIB_WMEMCPY=0; GNULIB_WMEMMOVE=0; GNULIB_WMEMPCPY=0; GNULIB_WMEMSET=0; GNULIB_WCSLEN=0; GNULIB_WCSNLEN=0; GNULIB_WCSCPY=0; GNULIB_WCPCPY=0; GNULIB_WCSNCPY=0; GNULIB_WCPNCPY=0; GNULIB_WCSCAT=0; GNULIB_WCSNCAT=0; GNULIB_WCSCMP=0; GNULIB_WCSNCMP=0; GNULIB_WCSCASECMP=0; GNULIB_WCSNCASECMP=0; GNULIB_WCSCOLL=0; GNULIB_WCSXFRM=0; GNULIB_WCSDUP=0; GNULIB_WCSCHR=0; GNULIB_WCSRCHR=0; GNULIB_WCSCSPN=0; GNULIB_WCSSPN=0; GNULIB_WCSPBRK=0; GNULIB_WCSSTR=0; GNULIB_WCSTOK=0; GNULIB_WCSWIDTH=0; GNULIB_WCSFTIME=0; HAVE_BTOWC=1; HAVE_MBSINIT=1; HAVE_MBRTOWC=1; HAVE_MBRLEN=1; HAVE_MBSRTOWCS=1; HAVE_MBSNRTOWCS=1; HAVE_WCRTOMB=1; HAVE_WCSRTOMBS=1; HAVE_WCSNRTOMBS=1; HAVE_WMEMCHR=1; HAVE_WMEMCMP=1; HAVE_WMEMCPY=1; HAVE_WMEMMOVE=1; HAVE_WMEMPCPY=1; HAVE_WMEMSET=1; HAVE_WCSLEN=1; HAVE_WCSNLEN=1; HAVE_WCSCPY=1; HAVE_WCPCPY=1; HAVE_WCSNCPY=1; HAVE_WCPNCPY=1; HAVE_WCSCAT=1; HAVE_WCSNCAT=1; HAVE_WCSCMP=1; HAVE_WCSNCMP=1; HAVE_WCSCASECMP=1; HAVE_WCSNCASECMP=1; HAVE_WCSCOLL=1; HAVE_WCSXFRM=1; HAVE_WCSDUP=1; HAVE_WCSCHR=1; HAVE_WCSRCHR=1; HAVE_WCSCSPN=1; HAVE_WCSSPN=1; HAVE_WCSPBRK=1; HAVE_WCSSTR=1; HAVE_WCSTOK=1; HAVE_WCSWIDTH=1; HAVE_WCSFTIME=1; HAVE_DECL_WCTOB=1; HAVE_DECL_WCWIDTH=1; REPLACE_MBSTATE_T=0; REPLACE_BTOWC=0; REPLACE_WCTOB=0; REPLACE_MBSINIT=0; REPLACE_MBRTOWC=0; REPLACE_MBRLEN=0; REPLACE_MBSRTOWCS=0; REPLACE_MBSNRTOWCS=0; REPLACE_WCRTOMB=0; REPLACE_WCSRTOMBS=0; REPLACE_WCSNRTOMBS=0; REPLACE_WCWIDTH=0; REPLACE_WCSWIDTH=0; REPLACE_WCSFTIME=0; REPLACE_WCSTOK=0; { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether uses 'inline' correctly" >&5 $as_echo_n "checking whether uses 'inline' correctly... " >&6; } if ${gl_cv_header_wchar_h_correct_inline+:} false; then : $as_echo_n "(cached) " >&6 else gl_cv_header_wchar_h_correct_inline=yes cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define wcstod renamed_wcstod /* Tru64 with Desktop Toolkit C has a bug: must be included before . BSD/OS 4.0.1 has a bug: , and must be included before . */ #include #include #include #include extern int zero (void); int main () { return zero(); } _ACEOF save_ac_compile="$ac_compile" ac_compile=`echo "$save_ac_compile" | sed s/conftest/conftest1/` if echo '#include "conftest.c"' >conftest1.c && { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define wcstod renamed_wcstod /* Tru64 with Desktop Toolkit C has a bug: must be included before . BSD/OS 4.0.1 has a bug: , and must be included before . */ #include #include #include #include int zero (void) { return 0; } _ACEOF ac_compile=`echo "$save_ac_compile" | sed s/conftest/conftest2/` if echo '#include "conftest.c"' >conftest2.c && { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then if $CC -o conftest$ac_exeext $CFLAGS $LDFLAGS conftest1.$ac_objext conftest2.$ac_objext $LIBS >&5 2>&1; then : else gl_cv_header_wchar_h_correct_inline=no fi fi fi ac_compile="$save_ac_compile" rm -f conftest12.c conftest12.$ac_objext conftest$ac_exeext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_wchar_h_correct_inline" >&5 $as_echo "$gl_cv_header_wchar_h_correct_inline" >&6; } if test $gl_cv_header_wchar_h_correct_inline = no; then as_fn_error $? " cannot be used with this compiler ($CC $CFLAGS $CPPFLAGS). This is a known interoperability problem of glibc <= 2.5 with gcc >= 4.3 in C99 mode. You have four options: - Add the flag -fgnu89-inline to CC and reconfigure, or - Fix your include files, using parts of , or - Use a gcc version older than 4.3, or - Don't use the flags -std=c99 or -std=gnu99. Configuration aborted." "$LINENO" 5 fi for ac_func in $ac_func_list do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking for nl_langinfo and CODESET" >&5 $as_echo_n "checking for nl_langinfo and CODESET... " >&6; } if ${am_cv_langinfo_codeset+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { char* cs = nl_langinfo(CODESET); return !cs; ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : am_cv_langinfo_codeset=yes else am_cv_langinfo_codeset=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_langinfo_codeset" >&5 $as_echo "$am_cv_langinfo_codeset" >&6; } if test $am_cv_langinfo_codeset = yes; then $as_echo "#define HAVE_LANGINFO_CODESET 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a traditional french locale" >&5 $as_echo_n "checking for a traditional french locale... " >&6; } if ${gt_cv_locale_fr+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if HAVE_LANGINFO_CODESET # include #endif #include #include struct tm t; char buf[16]; int main () { /* On BeOS and Haiku, locales are not implemented in libc. Rather, libintl imitates locale dependent behaviour by looking at the environment variables, and all locales use the UTF-8 encoding. */ #if defined __BEOS__ || defined __HAIKU__ return 1; #else /* Check whether the given locale name is recognized by the system. */ # if defined _WIN32 && !defined __CYGWIN__ /* On native Windows, setlocale(category, "") looks at the system settings, not at the environment variables. Also, when an encoding suffix such as ".65001" or ".54936" is specified, it succeeds but sets the LC_CTYPE category of the locale to "C". */ if (setlocale (LC_ALL, getenv ("LC_ALL")) == NULL || strcmp (setlocale (LC_CTYPE, NULL), "C") == 0) return 1; # else if (setlocale (LC_ALL, "") == NULL) return 1; # endif /* Check whether nl_langinfo(CODESET) is nonempty and not "ASCII" or "646". On Mac OS X 10.3.5 (Darwin 7.5) in the fr_FR locale, nl_langinfo(CODESET) is empty, and the behaviour of Tcl 8.4 in this locale is not useful. On OpenBSD 4.0, when an unsupported locale is specified, setlocale() succeeds but then nl_langinfo(CODESET) is "646". In this situation, some unit tests fail. On MirBSD 10, when an unsupported locale is specified, setlocale() succeeds but then nl_langinfo(CODESET) is "UTF-8". */ # if HAVE_LANGINFO_CODESET { const char *cs = nl_langinfo (CODESET); if (cs[0] == '\0' || strcmp (cs, "ASCII") == 0 || strcmp (cs, "646") == 0 || strcmp (cs, "UTF-8") == 0) return 1; } # endif # ifdef __CYGWIN__ /* On Cygwin, avoid locale names without encoding suffix, because the locale_charset() function relies on the encoding suffix. Note that LC_ALL is set on the command line. */ if (strchr (getenv ("LC_ALL"), '.') == NULL) return 1; # endif /* Check whether in the abbreviation of the second month, the second character (should be U+00E9: LATIN SMALL LETTER E WITH ACUTE) is only one byte long. This excludes the UTF-8 encoding. */ t.tm_year = 1975 - 1900; t.tm_mon = 2 - 1; t.tm_mday = 4; if (strftime (buf, sizeof (buf), "%b", &t) < 3 || buf[2] != 'v') return 1; # if !defined __BIONIC__ /* Bionic libc's 'struct lconv' is just a dummy. */ /* Check whether the decimal separator is a comma. On NetBSD 3.0 in the fr_FR.ISO8859-1 locale, localeconv()->decimal_point are nl_langinfo(RADIXCHAR) are both ".". */ if (localeconv () ->decimal_point[0] != ',') return 1; # endif return 0; #endif } _ACEOF if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s conftest$ac_exeext; then case "$host_os" in # Handle native Windows specially, because there setlocale() interprets # "ar" as "Arabic" or "Arabic_Saudi Arabia.1256", # "fr" or "fra" as "French" or "French_France.1252", # "ge"(!) or "deu"(!) as "German" or "German_Germany.1252", # "ja" as "Japanese" or "Japanese_Japan.932", # and similar. mingw*) # Test for the native Windows locale name. if (LC_ALL=French_France.1252 LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then gt_cv_locale_fr=French_France.1252 else # None found. gt_cv_locale_fr=none fi ;; *) # Setting LC_ALL is not enough. Need to set LC_TIME to empty, because # otherwise on Mac OS X 10.3.5 the LC_TIME=C from the beginning of the # configure script would override the LC_ALL setting. Likewise for # LC_CTYPE, which is also set at the beginning of the configure script. # Test for the usual locale name. if (LC_ALL=fr_FR LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then gt_cv_locale_fr=fr_FR else # Test for the locale name with explicit encoding suffix. if (LC_ALL=fr_FR.ISO-8859-1 LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then gt_cv_locale_fr=fr_FR.ISO-8859-1 else # Test for the AIX, OSF/1, FreeBSD, NetBSD, OpenBSD locale name. if (LC_ALL=fr_FR.ISO8859-1 LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then gt_cv_locale_fr=fr_FR.ISO8859-1 else # Test for the HP-UX locale name. if (LC_ALL=fr_FR.iso88591 LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then gt_cv_locale_fr=fr_FR.iso88591 else # Test for the Solaris 7 locale name. if (LC_ALL=fr LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then gt_cv_locale_fr=fr else # None found. gt_cv_locale_fr=none fi fi fi fi fi ;; esac fi rm -fr conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_locale_fr" >&5 $as_echo "$gt_cv_locale_fr" >&6; } LOCALE_FR=$gt_cv_locale_fr { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C/C++ restrict keyword" >&5 $as_echo_n "checking for C/C++ restrict keyword... " >&6; } if ${ac_cv_c_restrict+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_c_restrict=no # The order here caters to the fact that C++ does not require restrict. for ac_kw in __restrict __restrict__ _Restrict restrict; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ typedef int *int_ptr; int foo (int_ptr $ac_kw ip) { return ip[0]; } int bar (int [$ac_kw]); /* Catch GCC bug 14050. */ int bar (int ip[$ac_kw]) { return ip[0]; } int main () { int s[1]; int *$ac_kw t = s; t[0] = 0; return foo (t) + bar (t); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_restrict=$ac_kw fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext test "$ac_cv_c_restrict" != no && break done fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_restrict" >&5 $as_echo "$ac_cv_c_restrict" >&6; } case $ac_cv_c_restrict in restrict) ;; no) $as_echo "#define restrict /**/" >>confdefs.h ;; *) cat >>confdefs.h <<_ACEOF #define restrict $ac_cv_c_restrict _ACEOF ;; esac if test $ac_cv_func_uselocale = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether uselocale works" >&5 $as_echo_n "checking whether uselocale works... " >&6; } if ${gt_cv_func_uselocale_works+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : # Guess no on AIX and z/OS, yes otherwise. case "$host_os" in aix* | openedition*) gt_cv_func_uselocale_works="guessing no" ;; *) gt_cv_func_uselocale_works="guessing yes" ;; esac else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #if HAVE_XLOCALE_H # include #endif locale_t loc1; int main () { uselocale (NULL); setlocale (LC_ALL, "en_US.UTF-8"); return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : gt_cv_func_uselocale_works=yes else gt_cv_func_uselocale_works=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_func_uselocale_works" >&5 $as_echo "$gt_cv_func_uselocale_works" >&6; } else gt_cv_func_uselocale_works=no fi case "$gt_cv_func_uselocale_works" in *yes) $as_echo "#define HAVE_WORKING_USELOCALE 1" >>confdefs.h ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for wchar_t" >&5 $as_echo_n "checking for wchar_t... " >&6; } if ${gt_cv_c_wchar_t+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include wchar_t foo = (wchar_t)'\0'; int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : gt_cv_c_wchar_t=yes else gt_cv_c_wchar_t=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_c_wchar_t" >&5 $as_echo "$gt_cv_c_wchar_t" >&6; } if test $gt_cv_c_wchar_t = yes; then $as_echo "#define HAVE_WCHAR_T 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for wint_t" >&5 $as_echo_n "checking for wint_t... " >&6; } if ${gt_cv_c_wint_t+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Tru64 with Desktop Toolkit C has a bug: must be included before . BSD/OS 4.0.1 has a bug: , and must be included before . */ #include #include #include #include wint_t foo = (wchar_t)'\0'; int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : gt_cv_c_wint_t=yes else gt_cv_c_wint_t=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_c_wint_t" >&5 $as_echo "$gt_cv_c_wint_t" >&6; } if test $gt_cv_c_wint_t = yes; then $as_echo "#define HAVE_WINT_T 1" >>confdefs.h { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether wint_t is too small" >&5 $as_echo_n "checking whether wint_t is too small... " >&6; } if ${gl_cv_type_wint_t_too_small+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Tru64 with Desktop Toolkit C has a bug: must be included before . BSD/OS 4.0.1 has a bug: , and must be included before . */ #if !(defined __GLIBC__ && !defined __UCLIBC__) # include # include # include #endif #include int verify[sizeof (wint_t) < sizeof (int) ? -1 : 1]; int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : gl_cv_type_wint_t_too_small=no else gl_cv_type_wint_t_too_small=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_type_wint_t_too_small" >&5 $as_echo "$gl_cv_type_wint_t_too_small" >&6; } if test $gl_cv_type_wint_t_too_small = yes; then GNULIB_OVERRIDES_WINT_T=1 else GNULIB_OVERRIDES_WINT_T=0 fi else GNULIB_OVERRIDES_WINT_T=0 fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking where to find the exponent in a 'double'" >&5 $as_echo_n "checking where to find the exponent in a 'double'... " >&6; } if ${gl_cv_cc_double_expbit0+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #if defined arm || defined __arm || defined __arm__ mixed_endianness #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "mixed_endianness" >/dev/null 2>&1; then : gl_cv_cc_double_expbit0="unknown" else : if ${ac_cv_c_bigendian+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_c_bigendian=unknown # See if we're dealing with a universal compiler. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifndef __APPLE_CC__ not a universal capable compiler #endif typedef int dummy; _ACEOF if ac_fn_c_try_compile "$LINENO"; then : # Check for potential -arch flags. It is not universal unless # there are at least two -arch flags with different values. ac_arch= ac_prev= for ac_word in $CC $CFLAGS $CPPFLAGS $LDFLAGS; do if test -n "$ac_prev"; then case $ac_word in i?86 | x86_64 | ppc | ppc64) if test -z "$ac_arch" || test "$ac_arch" = "$ac_word"; then ac_arch=$ac_word else ac_cv_c_bigendian=universal break fi ;; esac ac_prev= elif test "x$ac_word" = "x-arch"; then ac_prev=arch fi done fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_c_bigendian = unknown; then # See if sys/param.h defines the BYTE_ORDER macro. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { #if ! (defined BYTE_ORDER && defined BIG_ENDIAN \ && defined LITTLE_ENDIAN && BYTE_ORDER && BIG_ENDIAN \ && LITTLE_ENDIAN) bogus endian macros #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : # It does; now see whether it defined to BIG_ENDIAN or not. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { #if BYTE_ORDER != BIG_ENDIAN not big endian #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_bigendian=yes else ac_cv_c_bigendian=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi if test $ac_cv_c_bigendian = unknown; then # See if defines _LITTLE_ENDIAN or _BIG_ENDIAN (e.g., Solaris). cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { #if ! (defined _LITTLE_ENDIAN || defined _BIG_ENDIAN) bogus endian macros #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : # It does; now see whether it defined to _BIG_ENDIAN or not. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { #ifndef _BIG_ENDIAN not big endian #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_bigendian=yes else ac_cv_c_bigendian=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi if test $ac_cv_c_bigendian = unknown; then # Compile a test program. if test "$cross_compiling" = yes; then : # Try to guess by grepping values from an object file. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ short int ascii_mm[] = { 0x4249, 0x4765, 0x6E44, 0x6961, 0x6E53, 0x7953, 0 }; short int ascii_ii[] = { 0x694C, 0x5454, 0x656C, 0x6E45, 0x6944, 0x6E61, 0 }; int use_ascii (int i) { return ascii_mm[i] + ascii_ii[i]; } short int ebcdic_ii[] = { 0x89D3, 0xE3E3, 0x8593, 0x95C5, 0x89C4, 0x9581, 0 }; short int ebcdic_mm[] = { 0xC2C9, 0xC785, 0x95C4, 0x8981, 0x95E2, 0xA8E2, 0 }; int use_ebcdic (int i) { return ebcdic_mm[i] + ebcdic_ii[i]; } extern int foo; int main () { return use_ascii (foo) == use_ebcdic (foo); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : if grep BIGenDianSyS conftest.$ac_objext >/dev/null; then ac_cv_c_bigendian=yes fi if grep LiTTleEnDian conftest.$ac_objext >/dev/null ; then if test "$ac_cv_c_bigendian" = unknown; then ac_cv_c_bigendian=no else # finding both strings is unlikely to happen, but who knows? ac_cv_c_bigendian=unknown fi fi fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { /* Are we little or big endian? From Harbison&Steele. */ union { long int l; char c[sizeof (long int)]; } u; u.l = 1; return u.c[sizeof (long int) - 1] == 1; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_c_bigendian=no else ac_cv_c_bigendian=yes fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi : case $ac_cv_c_bigendian in #( yes) gl_cv_cc_double_expbit0="word 0 bit 20";; #( no) gl_cv_cc_double_expbit0="word 1 bit 20" ;; #( universal) $as_echo "#define AC_APPLE_UNIVERSAL_BUILD 1" >>confdefs.h ;; #( *) gl_cv_cc_double_expbit0="unknown" ;; esac fi rm -f conftest* else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include #define NWORDS \ ((sizeof (double) + sizeof (unsigned int) - 1) / sizeof (unsigned int)) typedef union { double value; unsigned int word[NWORDS]; } memory_double; static unsigned int ored_words[NWORDS]; static unsigned int anded_words[NWORDS]; static void add_to_ored_words (double x) { memory_double m; size_t i; /* Clear it first, in case sizeof (double) < sizeof (memory_double). */ memset (&m, 0, sizeof (memory_double)); m.value = x; for (i = 0; i < NWORDS; i++) { ored_words[i] |= m.word[i]; anded_words[i] &= m.word[i]; } } int main () { size_t j; FILE *fp = fopen ("conftest.out", "w"); if (fp == NULL) return 1; for (j = 0; j < NWORDS; j++) anded_words[j] = ~ (unsigned int) 0; add_to_ored_words (0.25); add_to_ored_words (0.5); add_to_ored_words (1.0); add_to_ored_words (2.0); add_to_ored_words (4.0); /* Remove bits that are common (e.g. if representation of the first mantissa bit is explicit). */ for (j = 0; j < NWORDS; j++) ored_words[j] &= ~anded_words[j]; /* Now find the nonzero word. */ for (j = 0; j < NWORDS; j++) if (ored_words[j] != 0) break; if (j < NWORDS) { size_t i; for (i = j + 1; i < NWORDS; i++) if (ored_words[i] != 0) { fprintf (fp, "unknown"); return (fclose (fp) != 0); } for (i = 0; ; i++) if ((ored_words[j] >> i) & 1) { fprintf (fp, "word %d bit %d", (int) j, (int) i); return (fclose (fp) != 0); } } fprintf (fp, "unknown"); return (fclose (fp) != 0); } _ACEOF if ac_fn_c_try_run "$LINENO"; then : gl_cv_cc_double_expbit0=`cat conftest.out` else gl_cv_cc_double_expbit0="unknown" fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi rm -f conftest.out fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_cc_double_expbit0" >&5 $as_echo "$gl_cv_cc_double_expbit0" >&6; } case "$gl_cv_cc_double_expbit0" in word*bit*) word=`echo "$gl_cv_cc_double_expbit0" | sed -e 's/word //' -e 's/ bit.*//'` bit=`echo "$gl_cv_cc_double_expbit0" | sed -e 's/word.*bit //'` cat >>confdefs.h <<_ACEOF #define DBL_EXPBIT0_WORD $word _ACEOF cat >>confdefs.h <<_ACEOF #define DBL_EXPBIT0_BIT $bit _ACEOF ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether snprintf returns a byte count as in C99" >&5 $as_echo_n "checking whether snprintf returns a byte count as in C99... " >&6; } if ${gl_cv_func_snprintf_retval_c99+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : case "$host_os" in # Guess yes on glibc systems. *-gnu* | gnu*) gl_cv_func_snprintf_retval_c99="guessing yes";; # Guess yes on musl systems. *-musl*) gl_cv_func_snprintf_retval_c99="guessing yes";; # Guess yes on FreeBSD >= 5. freebsd[1-4].*) gl_cv_func_snprintf_retval_c99="guessing no";; freebsd* | kfreebsd*) gl_cv_func_snprintf_retval_c99="guessing yes";; # Guess yes on Mac OS X >= 10.3. darwin[1-6].*) gl_cv_func_snprintf_retval_c99="guessing no";; darwin*) gl_cv_func_snprintf_retval_c99="guessing yes";; # Guess yes on OpenBSD >= 3.9. openbsd[1-2].* | openbsd3.[0-8] | openbsd3.[0-8].*) gl_cv_func_snprintf_retval_c99="guessing no";; openbsd*) gl_cv_func_snprintf_retval_c99="guessing yes";; # Guess yes on Solaris >= 2.10. solaris2.[1-9][0-9]*) gl_cv_func_printf_sizes_c99="guessing yes";; solaris*) gl_cv_func_printf_sizes_c99="guessing no";; # Guess yes on AIX >= 4. aix[1-3]*) gl_cv_func_snprintf_retval_c99="guessing no";; aix*) gl_cv_func_snprintf_retval_c99="guessing yes";; # Guess yes on NetBSD >= 3. netbsd[1-2]* | netbsdelf[1-2]* | netbsdaout[1-2]* | netbsdcoff[1-2]*) gl_cv_func_snprintf_retval_c99="guessing no";; netbsd*) gl_cv_func_snprintf_retval_c99="guessing yes";; # Guess yes on BeOS. beos*) gl_cv_func_snprintf_retval_c99="guessing yes";; # Guess yes on Android. linux*-android*) gl_cv_func_snprintf_retval_c99="guessing yes";; # Guess yes on MSVC, no on mingw. mingw*) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef _MSC_VER Known #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "Known" >/dev/null 2>&1; then : gl_cv_func_snprintf_retval_c99="guessing yes" else gl_cv_func_snprintf_retval_c99="guessing no" fi rm -f conftest* ;; # If we don't know, obey --enable-cross-guesses. *) gl_cv_func_snprintf_retval_c99="$gl_cross_guess_normal";; esac else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if HAVE_SNPRINTF # define my_snprintf snprintf #else # include static int my_snprintf (char *buf, int size, const char *format, ...) { va_list args; int ret; va_start (args, format); ret = vsnprintf (buf, size, format, args); va_end (args); return ret; } #endif static char buf[100]; int main () { strcpy (buf, "ABCDEF"); if (my_snprintf (buf, 3, "%d %d", 4567, 89) != 7) return 1; if (my_snprintf (buf, 0, "%d %d", 4567, 89) != 7) return 2; if (my_snprintf (NULL, 0, "%d %d", 4567, 89) != 7) return 3; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : gl_cv_func_snprintf_retval_c99=yes else gl_cv_func_snprintf_retval_c99=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_snprintf_retval_c99" >&5 $as_echo "$gl_cv_func_snprintf_retval_c99" >&6; } for ac_func in snprintf strnlen wcslen wcsnlen mbrtowc wcrtomb do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done ac_fn_c_check_decl "$LINENO" "_snprintf" "ac_cv_have_decl__snprintf" "#include " if test "x$ac_cv_have_decl__snprintf" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL__SNPRINTF $ac_have_decl _ACEOF case "$gl_cv_func_snprintf_retval_c99" in *yes) $as_echo "#define HAVE_SNPRINTF_RETVAL_C99 1" >>confdefs.h ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether printf supports 'long double' arguments" >&5 $as_echo_n "checking whether printf supports 'long double' arguments... " >&6; } if ${gl_cv_func_printf_long_double+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : case "$host_os" in # Guess no on BeOS. beos*) gl_cv_func_printf_long_double="guessing no";; # Guess yes on Android. linux*-android*) gl_cv_func_printf_long_double="guessing yes";; # Guess yes on MSVC, no on mingw. mingw*) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef _MSC_VER Known #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "Known" >/dev/null 2>&1; then : gl_cv_func_printf_long_double="guessing yes" else gl_cv_func_printf_long_double="guessing no" fi rm -f conftest* ;; *) gl_cv_func_printf_long_double="guessing yes";; esac else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include static char buf[10000]; int main () { int result = 0; buf[0] = '\0'; if (sprintf (buf, "%Lf %d", 1.75L, 33, 44, 55) < 0 || strcmp (buf, "1.750000 33") != 0) result |= 1; buf[0] = '\0'; if (sprintf (buf, "%Le %d", 1.75L, 33, 44, 55) < 0 || strcmp (buf, "1.750000e+00 33") != 0) result |= 2; buf[0] = '\0'; if (sprintf (buf, "%Lg %d", 1.75L, 33, 44, 55) < 0 || strcmp (buf, "1.75 33") != 0) result |= 4; return result; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : gl_cv_func_printf_long_double=yes else gl_cv_func_printf_long_double=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_printf_long_double" >&5 $as_echo "$gl_cv_func_printf_long_double" >&6; } case "$gl_cv_func_printf_long_double" in *yes) ;; *) $as_echo "#define NEED_PRINTF_LONG_DOUBLE 1" >>confdefs.h ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether printf supports infinite 'double' arguments" >&5 $as_echo_n "checking whether printf supports infinite 'double' arguments... " >&6; } if ${gl_cv_func_printf_infinite+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : case "$host_os" in # Guess yes on glibc systems. *-gnu* | gnu*) gl_cv_func_printf_infinite="guessing yes";; # Guess yes on musl systems. *-musl*) gl_cv_func_printf_infinite="guessing yes";; # Guess yes on FreeBSD >= 6. freebsd[1-5].*) gl_cv_func_printf_infinite="guessing no";; freebsd* | kfreebsd*) gl_cv_func_printf_infinite="guessing yes";; # Guess yes on Mac OS X >= 10.3. darwin[1-6].*) gl_cv_func_printf_infinite="guessing no";; darwin*) gl_cv_func_printf_infinite="guessing yes";; # Guess yes on HP-UX >= 11. hpux[7-9]* | hpux10*) gl_cv_func_printf_infinite="guessing no";; hpux*) gl_cv_func_printf_infinite="guessing yes";; # Guess yes on NetBSD >= 3. netbsd[1-2]* | netbsdelf[1-2]* | netbsdaout[1-2]* | netbsdcoff[1-2]*) gl_cv_func_printf_infinite="guessing no";; netbsd*) gl_cv_func_printf_infinite="guessing yes";; # Guess yes on BeOS. beos*) gl_cv_func_printf_infinite="guessing yes";; # Guess no on Android. linux*-android*) gl_cv_func_printf_infinite="guessing no";; # Guess yes on MSVC, no on mingw. mingw*) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef _MSC_VER Known #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "Known" >/dev/null 2>&1; then : gl_cv_func_printf_infinite="guessing yes" else gl_cv_func_printf_infinite="guessing no" fi rm -f conftest* ;; # If we don't know, obey --enable-cross-guesses. *) gl_cv_func_printf_infinite="$gl_cross_guess_normal";; esac else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include static int strisnan (const char *string, size_t start_index, size_t end_index) { if (start_index < end_index) { if (string[start_index] == '-') start_index++; if (start_index + 3 <= end_index && memcmp (string + start_index, "nan", 3) == 0) { start_index += 3; if (start_index == end_index || (string[start_index] == '(' && string[end_index - 1] == ')')) return 1; } } return 0; } static int have_minus_zero () { static double plus_zero = 0.0; double minus_zero = - plus_zero; return memcmp (&plus_zero, &minus_zero, sizeof (double)) != 0; } static char buf[10000]; static double zero = 0.0; int main () { int result = 0; if (sprintf (buf, "%f", 1.0 / zero) < 0 || (strcmp (buf, "inf") != 0 && strcmp (buf, "infinity") != 0)) result |= 1; if (sprintf (buf, "%f", -1.0 / zero) < 0 || (strcmp (buf, "-inf") != 0 && strcmp (buf, "-infinity") != 0)) result |= 1; if (sprintf (buf, "%f", zero / zero) < 0 || !strisnan (buf, 0, strlen (buf))) result |= 2; if (sprintf (buf, "%e", 1.0 / zero) < 0 || (strcmp (buf, "inf") != 0 && strcmp (buf, "infinity") != 0)) result |= 4; if (sprintf (buf, "%e", -1.0 / zero) < 0 || (strcmp (buf, "-inf") != 0 && strcmp (buf, "-infinity") != 0)) result |= 4; if (sprintf (buf, "%e", zero / zero) < 0 || !strisnan (buf, 0, strlen (buf))) result |= 8; if (sprintf (buf, "%g", 1.0 / zero) < 0 || (strcmp (buf, "inf") != 0 && strcmp (buf, "infinity") != 0)) result |= 16; if (sprintf (buf, "%g", -1.0 / zero) < 0 || (strcmp (buf, "-inf") != 0 && strcmp (buf, "-infinity") != 0)) result |= 16; if (sprintf (buf, "%g", zero / zero) < 0 || !strisnan (buf, 0, strlen (buf))) result |= 32; /* This test fails on HP-UX 10.20. */ if (have_minus_zero ()) if (sprintf (buf, "%g", - zero) < 0 || strcmp (buf, "-0") != 0) result |= 64; return result; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : gl_cv_func_printf_infinite=yes else gl_cv_func_printf_infinite=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_printf_infinite" >&5 $as_echo "$gl_cv_func_printf_infinite" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether byte ordering is bigendian" >&5 $as_echo_n "checking whether byte ordering is bigendian... " >&6; } if ${ac_cv_c_bigendian+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_c_bigendian=unknown # See if we're dealing with a universal compiler. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifndef __APPLE_CC__ not a universal capable compiler #endif typedef int dummy; _ACEOF if ac_fn_c_try_compile "$LINENO"; then : # Check for potential -arch flags. It is not universal unless # there are at least two -arch flags with different values. ac_arch= ac_prev= for ac_word in $CC $CFLAGS $CPPFLAGS $LDFLAGS; do if test -n "$ac_prev"; then case $ac_word in i?86 | x86_64 | ppc | ppc64) if test -z "$ac_arch" || test "$ac_arch" = "$ac_word"; then ac_arch=$ac_word else ac_cv_c_bigendian=universal break fi ;; esac ac_prev= elif test "x$ac_word" = "x-arch"; then ac_prev=arch fi done fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_c_bigendian = unknown; then # See if sys/param.h defines the BYTE_ORDER macro. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { #if ! (defined BYTE_ORDER && defined BIG_ENDIAN \ && defined LITTLE_ENDIAN && BYTE_ORDER && BIG_ENDIAN \ && LITTLE_ENDIAN) bogus endian macros #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : # It does; now see whether it defined to BIG_ENDIAN or not. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { #if BYTE_ORDER != BIG_ENDIAN not big endian #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_bigendian=yes else ac_cv_c_bigendian=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi if test $ac_cv_c_bigendian = unknown; then # See if defines _LITTLE_ENDIAN or _BIG_ENDIAN (e.g., Solaris). cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { #if ! (defined _LITTLE_ENDIAN || defined _BIG_ENDIAN) bogus endian macros #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : # It does; now see whether it defined to _BIG_ENDIAN or not. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { #ifndef _BIG_ENDIAN not big endian #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_bigendian=yes else ac_cv_c_bigendian=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi if test $ac_cv_c_bigendian = unknown; then # Compile a test program. if test "$cross_compiling" = yes; then : # Try to guess by grepping values from an object file. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ short int ascii_mm[] = { 0x4249, 0x4765, 0x6E44, 0x6961, 0x6E53, 0x7953, 0 }; short int ascii_ii[] = { 0x694C, 0x5454, 0x656C, 0x6E45, 0x6944, 0x6E61, 0 }; int use_ascii (int i) { return ascii_mm[i] + ascii_ii[i]; } short int ebcdic_ii[] = { 0x89D3, 0xE3E3, 0x8593, 0x95C5, 0x89C4, 0x9581, 0 }; short int ebcdic_mm[] = { 0xC2C9, 0xC785, 0x95C4, 0x8981, 0x95E2, 0xA8E2, 0 }; int use_ebcdic (int i) { return ebcdic_mm[i] + ebcdic_ii[i]; } extern int foo; int main () { return use_ascii (foo) == use_ebcdic (foo); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : if grep BIGenDianSyS conftest.$ac_objext >/dev/null; then ac_cv_c_bigendian=yes fi if grep LiTTleEnDian conftest.$ac_objext >/dev/null ; then if test "$ac_cv_c_bigendian" = unknown; then ac_cv_c_bigendian=no else # finding both strings is unlikely to happen, but who knows? ac_cv_c_bigendian=unknown fi fi fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { /* Are we little or big endian? From Harbison&Steele. */ union { long int l; char c[sizeof (long int)]; } u; u.l = 1; return u.c[sizeof (long int) - 1] == 1; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_c_bigendian=no else ac_cv_c_bigendian=yes fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_bigendian" >&5 $as_echo "$ac_cv_c_bigendian" >&6; } case $ac_cv_c_bigendian in #( yes) $as_echo "#define WORDS_BIGENDIAN 1" >>confdefs.h ;; #( no) ;; #( universal) $as_echo "#define AC_APPLE_UNIVERSAL_BUILD 1" >>confdefs.h ;; #( *) as_fn_error $? "unknown endianness presetting ac_cv_c_bigendian=no (or yes) will help" "$LINENO" 5 ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether long double and double are the same" >&5 $as_echo_n "checking whether long double and double are the same... " >&6; } if ${gl_cv_long_double_equals_double+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { typedef int check[sizeof (long double) == sizeof (double) && LDBL_MANT_DIG == DBL_MANT_DIG && LDBL_MAX_EXP == DBL_MAX_EXP && LDBL_MIN_EXP == DBL_MIN_EXP ? 1 : -1]; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : gl_cv_long_double_equals_double=yes else gl_cv_long_double_equals_double=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_long_double_equals_double" >&5 $as_echo "$gl_cv_long_double_equals_double" >&6; } if test $gl_cv_long_double_equals_double = yes; then $as_echo "#define HAVE_SAME_LONG_DOUBLE_AS_DOUBLE 1" >>confdefs.h HAVE_SAME_LONG_DOUBLE_AS_DOUBLE=1 else HAVE_SAME_LONG_DOUBLE_AS_DOUBLE=0 fi if test -n "$gl_printf_safe"; then $as_echo "#define CHECK_PRINTF_SAFE 1" >>confdefs.h fi case "$gl_cv_func_printf_long_double" in *yes) { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether printf supports infinite 'long double' arguments" >&5 $as_echo_n "checking whether printf supports infinite 'long double' arguments... " >&6; } if ${gl_cv_func_printf_infinite_long_double+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : case "$host_cpu" in # Guess no on ia64, x86_64, i386. ia64 | x86_64 | i*86) gl_cv_func_printf_infinite_long_double="guessing no";; *) case "$host_os" in # Guess yes on glibc systems. *-gnu* | gnu*) gl_cv_func_printf_infinite_long_double="guessing yes";; # Guess yes on musl systems. *-musl*) gl_cv_func_printf_infinite_long_double="guessing yes";; # Guess yes on FreeBSD >= 6. freebsd[1-5].*) gl_cv_func_printf_infinite_long_double="guessing no";; freebsd* | kfreebsd*) gl_cv_func_printf_infinite_long_double="guessing yes";; # Guess yes on HP-UX >= 11. hpux[7-9]* | hpux10*) gl_cv_func_printf_infinite_long_double="guessing no";; hpux*) gl_cv_func_printf_infinite_long_double="guessing yes";; # Guess no on Android. linux*-android*) gl_cv_func_printf_infinite_long_double="guessing no";; # Guess yes on MSVC, no on mingw. mingw*) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef _MSC_VER Known #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "Known" >/dev/null 2>&1; then : gl_cv_func_printf_infinite_long_double="guessing yes" else gl_cv_func_printf_infinite_long_double="guessing no" fi rm -f conftest* ;; # If we don't know, obey --enable-cross-guesses. *) gl_cv_func_printf_infinite_long_double="$gl_cross_guess_normal";; esac ;; esac else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #if defined __MACH__ && defined __APPLE__ /* Avoid a crash on Mac OS X. */ #include #include #include #include #include #include /* The exception port on which our thread listens. */ static mach_port_t our_exception_port; /* The main function of the thread listening for exceptions of type EXC_BAD_ACCESS. */ static void * mach_exception_thread (void *arg) { /* Buffer for a message to be received. */ struct { mach_msg_header_t head; mach_msg_body_t msgh_body; char data[1024]; } msg; mach_msg_return_t retval; /* Wait for a message on the exception port. */ retval = mach_msg (&msg.head, MACH_RCV_MSG | MACH_RCV_LARGE, 0, sizeof (msg), our_exception_port, MACH_MSG_TIMEOUT_NONE, MACH_PORT_NULL); if (retval != MACH_MSG_SUCCESS) abort (); exit (1); } static void nocrash_init (void) { mach_port_t self = mach_task_self (); /* Allocate a port on which the thread shall listen for exceptions. */ if (mach_port_allocate (self, MACH_PORT_RIGHT_RECEIVE, &our_exception_port) == KERN_SUCCESS) { /* See https://web.mit.edu/darwin/src/modules/xnu/osfmk/man/mach_port_insert_right.html. */ if (mach_port_insert_right (self, our_exception_port, our_exception_port, MACH_MSG_TYPE_MAKE_SEND) == KERN_SUCCESS) { /* The exceptions we want to catch. Only EXC_BAD_ACCESS is interesting for us. */ exception_mask_t mask = EXC_MASK_BAD_ACCESS; /* Create the thread listening on the exception port. */ pthread_attr_t attr; pthread_t thread; if (pthread_attr_init (&attr) == 0 && pthread_attr_setdetachstate (&attr, PTHREAD_CREATE_DETACHED) == 0 && pthread_create (&thread, &attr, mach_exception_thread, NULL) == 0) { pthread_attr_destroy (&attr); /* Replace the exception port info for these exceptions with our own. Note that we replace the exception port for the entire task, not only for a particular thread. This has the effect that when our exception port gets the message, the thread specific exception port has already been asked, and we don't need to bother about it. See https://web.mit.edu/darwin/src/modules/xnu/osfmk/man/task_set_exception_ports.html. */ task_set_exception_ports (self, mask, our_exception_port, EXCEPTION_DEFAULT, MACHINE_THREAD_STATE); } } } } #elif defined _WIN32 && ! defined __CYGWIN__ /* Avoid a crash on native Windows. */ #define WIN32_LEAN_AND_MEAN #include #include static LONG WINAPI exception_filter (EXCEPTION_POINTERS *ExceptionInfo) { switch (ExceptionInfo->ExceptionRecord->ExceptionCode) { case EXCEPTION_ACCESS_VIOLATION: case EXCEPTION_IN_PAGE_ERROR: case EXCEPTION_STACK_OVERFLOW: case EXCEPTION_GUARD_PAGE: case EXCEPTION_PRIV_INSTRUCTION: case EXCEPTION_ILLEGAL_INSTRUCTION: case EXCEPTION_DATATYPE_MISALIGNMENT: case EXCEPTION_ARRAY_BOUNDS_EXCEEDED: case EXCEPTION_NONCONTINUABLE_EXCEPTION: exit (1); } return EXCEPTION_CONTINUE_SEARCH; } static void nocrash_init (void) { SetUnhandledExceptionFilter ((LPTOP_LEVEL_EXCEPTION_FILTER) exception_filter); } #else /* Avoid a crash on POSIX systems. */ #include #include /* A POSIX signal handler. */ static void exception_handler (int sig) { _exit (1); } static void nocrash_init (void) { #ifdef SIGSEGV signal (SIGSEGV, exception_handler); #endif #ifdef SIGBUS signal (SIGBUS, exception_handler); #endif } #endif #include #include #include static int strisnan (const char *string, size_t start_index, size_t end_index) { if (start_index < end_index) { if (string[start_index] == '-') start_index++; if (start_index + 3 <= end_index && memcmp (string + start_index, "nan", 3) == 0) { start_index += 3; if (start_index == end_index || (string[start_index] == '(' && string[end_index - 1] == ')')) return 1; } } return 0; } static char buf[10000]; static long double zeroL = 0.0L; int main () { int result = 0; nocrash_init(); if (sprintf (buf, "%Lf", 1.0L / zeroL) < 0 || (strcmp (buf, "inf") != 0 && strcmp (buf, "infinity") != 0)) result |= 1; if (sprintf (buf, "%Lf", -1.0L / zeroL) < 0 || (strcmp (buf, "-inf") != 0 && strcmp (buf, "-infinity") != 0)) result |= 1; if (sprintf (buf, "%Lf", zeroL / zeroL) < 0 || !strisnan (buf, 0, strlen (buf))) result |= 1; if (sprintf (buf, "%Le", 1.0L / zeroL) < 0 || (strcmp (buf, "inf") != 0 && strcmp (buf, "infinity") != 0)) result |= 1; if (sprintf (buf, "%Le", -1.0L / zeroL) < 0 || (strcmp (buf, "-inf") != 0 && strcmp (buf, "-infinity") != 0)) result |= 1; if (sprintf (buf, "%Le", zeroL / zeroL) < 0 || !strisnan (buf, 0, strlen (buf))) result |= 1; if (sprintf (buf, "%Lg", 1.0L / zeroL) < 0 || (strcmp (buf, "inf") != 0 && strcmp (buf, "infinity") != 0)) result |= 1; if (sprintf (buf, "%Lg", -1.0L / zeroL) < 0 || (strcmp (buf, "-inf") != 0 && strcmp (buf, "-infinity") != 0)) result |= 1; if (sprintf (buf, "%Lg", zeroL / zeroL) < 0 || !strisnan (buf, 0, strlen (buf))) result |= 1; #if CHECK_PRINTF_SAFE && ((defined __ia64 && LDBL_MANT_DIG == 64) || (defined __x86_64__ || defined __amd64__) || (defined __i386 || defined __i386__ || defined _I386 || defined _M_IX86 || defined _X86_)) && !HAVE_SAME_LONG_DOUBLE_AS_DOUBLE /* Representation of an 80-bit 'long double' as an initializer for a sequence of 'unsigned int' words. */ # ifdef WORDS_BIGENDIAN # define LDBL80_WORDS(exponent,manthi,mantlo) \ { ((unsigned int) (exponent) << 16) | ((unsigned int) (manthi) >> 16), \ ((unsigned int) (manthi) << 16) | ((unsigned int) (mantlo) >> 16), \ (unsigned int) (mantlo) << 16 \ } # else # define LDBL80_WORDS(exponent,manthi,mantlo) \ { mantlo, manthi, exponent } # endif { /* Quiet NaN. */ static union { unsigned int word[4]; long double value; } x = { LDBL80_WORDS (0xFFFF, 0xC3333333, 0x00000000) }; if (sprintf (buf, "%Lf", x.value) < 0 || !strisnan (buf, 0, strlen (buf))) result |= 2; if (sprintf (buf, "%Le", x.value) < 0 || !strisnan (buf, 0, strlen (buf))) result |= 2; if (sprintf (buf, "%Lg", x.value) < 0 || !strisnan (buf, 0, strlen (buf))) result |= 2; } { /* Signalling NaN. */ static union { unsigned int word[4]; long double value; } x = { LDBL80_WORDS (0xFFFF, 0x83333333, 0x00000000) }; if (sprintf (buf, "%Lf", x.value) < 0 || !strisnan (buf, 0, strlen (buf))) result |= 2; if (sprintf (buf, "%Le", x.value) < 0 || !strisnan (buf, 0, strlen (buf))) result |= 2; if (sprintf (buf, "%Lg", x.value) < 0 || !strisnan (buf, 0, strlen (buf))) result |= 2; } { /* Pseudo-NaN. */ static union { unsigned int word[4]; long double value; } x = { LDBL80_WORDS (0xFFFF, 0x40000001, 0x00000000) }; if (sprintf (buf, "%Lf", x.value) <= 0) result |= 4; if (sprintf (buf, "%Le", x.value) <= 0) result |= 4; if (sprintf (buf, "%Lg", x.value) <= 0) result |= 4; } { /* Pseudo-Infinity. */ static union { unsigned int word[4]; long double value; } x = { LDBL80_WORDS (0xFFFF, 0x00000000, 0x00000000) }; if (sprintf (buf, "%Lf", x.value) <= 0) result |= 8; if (sprintf (buf, "%Le", x.value) <= 0) result |= 8; if (sprintf (buf, "%Lg", x.value) <= 0) result |= 8; } { /* Pseudo-Zero. */ static union { unsigned int word[4]; long double value; } x = { LDBL80_WORDS (0x4004, 0x00000000, 0x00000000) }; if (sprintf (buf, "%Lf", x.value) <= 0) result |= 16; if (sprintf (buf, "%Le", x.value) <= 0) result |= 16; if (sprintf (buf, "%Lg", x.value) <= 0) result |= 16; } { /* Unnormalized number. */ static union { unsigned int word[4]; long double value; } x = { LDBL80_WORDS (0x4000, 0x63333333, 0x00000000) }; if (sprintf (buf, "%Lf", x.value) <= 0) result |= 32; if (sprintf (buf, "%Le", x.value) <= 0) result |= 32; if (sprintf (buf, "%Lg", x.value) <= 0) result |= 32; } { /* Pseudo-Denormal. */ static union { unsigned int word[4]; long double value; } x = { LDBL80_WORDS (0x0000, 0x83333333, 0x00000000) }; if (sprintf (buf, "%Lf", x.value) <= 0) result |= 64; if (sprintf (buf, "%Le", x.value) <= 0) result |= 64; if (sprintf (buf, "%Lg", x.value) <= 0) result |= 64; } #endif return result; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : gl_cv_func_printf_infinite_long_double=yes else gl_cv_func_printf_infinite_long_double=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_printf_infinite_long_double" >&5 $as_echo "$gl_cv_func_printf_infinite_long_double" >&6; } ;; *) gl_cv_func_printf_infinite_long_double="irrelevant" ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether printf supports the 'a' and 'A' directives" >&5 $as_echo_n "checking whether printf supports the 'a' and 'A' directives... " >&6; } if ${gl_cv_func_printf_directive_a+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : case "$host_os" in # Guess yes on glibc >= 2.5 systems. *-gnu* | gnu*) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #ifdef __GNU_LIBRARY__ #if ((__GLIBC__ == 2 && __GLIBC_MINOR__ >= 5) || (__GLIBC__ > 2)) && !defined __UCLIBC__ BZ2908 #endif #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "BZ2908" >/dev/null 2>&1; then : gl_cv_func_printf_directive_a="guessing yes" else gl_cv_func_printf_directive_a="guessing no" fi rm -f conftest* ;; # Guess yes on musl systems. *-musl*) gl_cv_func_printf_directive_a="guessing yes";; # Guess no on Android. linux*-android*) gl_cv_func_printf_directive_a="guessing no";; # Guess no on native Windows. mingw*) gl_cv_func_printf_directive_a="guessing no";; # If we don't know, obey --enable-cross-guesses. *) gl_cv_func_printf_directive_a="$gl_cross_guess_normal";; esac else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include static char buf[100]; static double zero = 0.0; int main () { int result = 0; if (sprintf (buf, "%a %d", 3.1416015625, 33, 44, 55) < 0 || (strcmp (buf, "0x1.922p+1 33") != 0 && strcmp (buf, "0x3.244p+0 33") != 0 && strcmp (buf, "0x6.488p-1 33") != 0 && strcmp (buf, "0xc.91p-2 33") != 0)) result |= 1; if (sprintf (buf, "%A %d", -3.1416015625, 33, 44, 55) < 0 || (strcmp (buf, "-0X1.922P+1 33") != 0 && strcmp (buf, "-0X3.244P+0 33") != 0 && strcmp (buf, "-0X6.488P-1 33") != 0 && strcmp (buf, "-0XC.91P-2 33") != 0)) result |= 2; /* This catches a FreeBSD 6.1 bug: it doesn't round. */ if (sprintf (buf, "%.2a %d", 1.51, 33, 44, 55) < 0 || (strcmp (buf, "0x1.83p+0 33") != 0 && strcmp (buf, "0x3.05p-1 33") != 0 && strcmp (buf, "0x6.0ap-2 33") != 0 && strcmp (buf, "0xc.14p-3 33") != 0)) result |= 4; /* This catches a Mac OS X 10.12.4 (Darwin 16.5) bug: it doesn't round. */ if (sprintf (buf, "%.0a %d", 1.51, 33, 44, 55) < 0 || (strcmp (buf, "0x2p+0 33") != 0 && strcmp (buf, "0x3p-1 33") != 0 && strcmp (buf, "0x6p-2 33") != 0 && strcmp (buf, "0xcp-3 33") != 0)) result |= 4; /* This catches a FreeBSD 6.1 bug. See */ if (sprintf (buf, "%010a %d", 1.0 / zero, 33, 44, 55) < 0 || buf[0] == '0') result |= 8; /* This catches a Mac OS X 10.3.9 (Darwin 7.9) bug. */ if (sprintf (buf, "%.1a", 1.999) < 0 || (strcmp (buf, "0x1.0p+1") != 0 && strcmp (buf, "0x2.0p+0") != 0 && strcmp (buf, "0x4.0p-1") != 0 && strcmp (buf, "0x8.0p-2") != 0)) result |= 16; /* This catches the same Mac OS X 10.3.9 (Darwin 7.9) bug and also a glibc 2.4 bug . */ if (sprintf (buf, "%.1La", 1.999L) < 0 || (strcmp (buf, "0x1.0p+1") != 0 && strcmp (buf, "0x2.0p+0") != 0 && strcmp (buf, "0x4.0p-1") != 0 && strcmp (buf, "0x8.0p-2") != 0)) result |= 32; return result; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : gl_cv_func_printf_directive_a=yes else gl_cv_func_printf_directive_a=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_printf_directive_a" >&5 $as_echo "$gl_cv_func_printf_directive_a" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether printf supports the 'F' directive" >&5 $as_echo_n "checking whether printf supports the 'F' directive... " >&6; } if ${gl_cv_func_printf_directive_f+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : case "$host_os" in # Guess yes on glibc systems. *-gnu* | gnu*) gl_cv_func_printf_directive_f="guessing yes";; # Guess yes on musl systems. *-musl*) gl_cv_func_printf_directive_f="guessing yes";; # Guess yes on FreeBSD >= 6. freebsd[1-5].*) gl_cv_func_printf_directive_f="guessing no";; freebsd* | kfreebsd*) gl_cv_func_printf_directive_f="guessing yes";; # Guess yes on Mac OS X >= 10.3. darwin[1-6].*) gl_cv_func_printf_directive_f="guessing no";; darwin*) gl_cv_func_printf_directive_f="guessing yes";; # Guess yes on Solaris >= 2.10. solaris2.[1-9][0-9]*) gl_cv_func_printf_directive_f="guessing yes";; solaris*) gl_cv_func_printf_directive_f="guessing no";; # Guess no on Android. linux*-android*) gl_cv_func_printf_directive_f="guessing no";; # Guess yes on MSVC, no on mingw. mingw*) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef _MSC_VER Known #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "Known" >/dev/null 2>&1; then : gl_cv_func_printf_directive_f="guessing yes" else gl_cv_func_printf_directive_f="guessing no" fi rm -f conftest* ;; # If we don't know, obey --enable-cross-guesses. *) gl_cv_func_printf_directive_f="$gl_cross_guess_normal";; esac else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include static char buf[100]; static double zero = 0.0; int main () { int result = 0; if (sprintf (buf, "%F %d", 1234567.0, 33, 44, 55) < 0 || strcmp (buf, "1234567.000000 33") != 0) result |= 1; if (sprintf (buf, "%F", 1.0 / zero) < 0 || (strcmp (buf, "INF") != 0 && strcmp (buf, "INFINITY") != 0)) result |= 2; /* This catches a Cygwin 1.5.x bug. */ if (sprintf (buf, "%.F", 1234.0) < 0 || strcmp (buf, "1234") != 0) result |= 4; return result; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : gl_cv_func_printf_directive_f=yes else gl_cv_func_printf_directive_f=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_printf_directive_f" >&5 $as_echo "$gl_cv_func_printf_directive_f" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether printf supports the 'ls' directive" >&5 $as_echo_n "checking whether printf supports the 'ls' directive... " >&6; } if ${gl_cv_func_printf_directive_ls+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : case "$host_os" in openbsd*) gl_cv_func_printf_directive_ls="guessing no";; irix*) gl_cv_func_printf_directive_ls="guessing no";; solaris*) gl_cv_func_printf_directive_ls="guessing no";; cygwin*) gl_cv_func_printf_directive_ls="guessing no";; beos* | haiku*) gl_cv_func_printf_directive_ls="guessing no";; # Guess no on Android. linux*-android*) gl_cv_func_printf_directive_ls="guessing no";; # Guess yes on native Windows. mingw*) gl_cv_func_printf_directive_ls="guessing yes";; *) gl_cv_func_printf_directive_ls="guessing yes";; esac else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Tru64 with Desktop Toolkit C has a bug: must be included before . BSD/OS 4.0.1 has a bug: , and must be included before . */ #include #include #include #include #include int main () { int result = 0; char buf[100]; /* Test whether %ls works at all. This test fails on OpenBSD 4.0, IRIX 6.5, Solaris 2.6, Haiku, but not on Cygwin 1.5. */ { static const wchar_t wstring[] = { 'a', 'b', 'c', 0 }; buf[0] = '\0'; if (sprintf (buf, "%ls", wstring) < 0 || strcmp (buf, "abc") != 0) result |= 1; } /* This test fails on IRIX 6.5, Solaris 2.6, Cygwin 1.5, Haiku (with an assertion failure inside libc), but not on OpenBSD 4.0. */ { static const wchar_t wstring[] = { 'a', 0 }; buf[0] = '\0'; if (sprintf (buf, "%ls", wstring) < 0 || strcmp (buf, "a") != 0) result |= 2; } /* Test whether precisions in %ls are supported as specified in ISO C 99 section 7.19.6.1: "If a precision is specified, no more than that many bytes are written (including shift sequences, if any), and the array shall contain a null wide character if, to equal the multibyte character sequence length given by the precision, the function would need to access a wide character one past the end of the array." This test fails on Solaris 10. */ { static const wchar_t wstring[] = { 'a', 'b', (wchar_t) 0xfdfdfdfd, 0 }; buf[0] = '\0'; if (sprintf (buf, "%.2ls", wstring) < 0 || strcmp (buf, "ab") != 0) result |= 8; } return result; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : gl_cv_func_printf_directive_ls=yes else gl_cv_func_printf_directive_ls=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_printf_directive_ls" >&5 $as_echo "$gl_cv_func_printf_directive_ls" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether printf supports the grouping flag" >&5 $as_echo_n "checking whether printf supports the grouping flag... " >&6; } if ${gl_cv_func_printf_flag_grouping+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : case "$host_os" in cygwin*) gl_cv_func_printf_flag_grouping="guessing no";; netbsd*) gl_cv_func_printf_flag_grouping="guessing no";; # Guess no on Android. linux*-android*) gl_cv_func_printf_flag_grouping="guessing no";; # Guess no on native Windows. mingw* | pw*) gl_cv_func_printf_flag_grouping="guessing no";; *) gl_cv_func_printf_flag_grouping="guessing yes";; esac else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include static char buf[100]; int main () { if (sprintf (buf, "%'d %d", 1234567, 99) < 0 || buf[strlen (buf) - 1] != '9') return 1; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : gl_cv_func_printf_flag_grouping=yes else gl_cv_func_printf_flag_grouping=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_printf_flag_grouping" >&5 $as_echo "$gl_cv_func_printf_flag_grouping" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether printf supports the left-adjust flag correctly" >&5 $as_echo_n "checking whether printf supports the left-adjust flag correctly... " >&6; } if ${gl_cv_func_printf_flag_leftadjust+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : case "$host_os" in # Guess yes on HP-UX 11. hpux11*) gl_cv_func_printf_flag_leftadjust="guessing yes";; # Guess no on HP-UX 10 and older. hpux*) gl_cv_func_printf_flag_leftadjust="guessing no";; # Guess yes on Android. linux*-android*) gl_cv_func_printf_flag_leftadjust="guessing yes";; # Guess yes on native Windows. mingw*) gl_cv_func_printf_flag_leftadjust="guessing yes";; # Guess yes otherwise. *) gl_cv_func_printf_flag_leftadjust="guessing yes";; esac else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include static char buf[100]; int main () { /* Check that a '-' flag is not annihilated by a negative width. */ if (sprintf (buf, "a%-*sc", -3, "b") < 0 || strcmp (buf, "ab c") != 0) return 1; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : gl_cv_func_printf_flag_leftadjust=yes else gl_cv_func_printf_flag_leftadjust=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_printf_flag_leftadjust" >&5 $as_echo "$gl_cv_func_printf_flag_leftadjust" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether printf supports the zero flag correctly" >&5 $as_echo_n "checking whether printf supports the zero flag correctly... " >&6; } if ${gl_cv_func_printf_flag_zero+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : case "$host_os" in # Guess yes on glibc systems. *-gnu* | gnu*) gl_cv_func_printf_flag_zero="guessing yes";; # Guess yes on musl systems. *-musl*) gl_cv_func_printf_flag_zero="guessing yes";; # Guess yes on BeOS. beos*) gl_cv_func_printf_flag_zero="guessing yes";; # Guess no on Android. linux*-android*) gl_cv_func_printf_flag_zero="guessing no";; # Guess no on native Windows. mingw*) gl_cv_func_printf_flag_zero="guessing no";; # If we don't know, obey --enable-cross-guesses. *) gl_cv_func_printf_flag_zero="$gl_cross_guess_normal";; esac else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include static char buf[100]; static double zero = 0.0; int main () { if (sprintf (buf, "%010f", 1.0 / zero, 33, 44, 55) < 0 || (strcmp (buf, " inf") != 0 && strcmp (buf, " infinity") != 0)) return 1; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : gl_cv_func_printf_flag_zero=yes else gl_cv_func_printf_flag_zero=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_printf_flag_zero" >&5 $as_echo "$gl_cv_func_printf_flag_zero" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether printf supports large precisions" >&5 $as_echo_n "checking whether printf supports large precisions... " >&6; } if ${gl_cv_func_printf_precision+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : case "$host_os" in # Guess no only on Solaris, native Windows, and BeOS systems. solaris*) gl_cv_func_printf_precision="guessing no" ;; mingw* | pw*) gl_cv_func_printf_precision="guessing no" ;; beos*) gl_cv_func_printf_precision="guessing no" ;; # Guess yes on Android. linux*-android*) gl_cv_func_printf_precision="guessing yes" ;; *) gl_cv_func_printf_precision="guessing yes" ;; esac else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include static char buf[5000]; int main () { int result = 0; #ifdef __BEOS__ /* On BeOS, this would crash and show a dialog box. Avoid the crash. */ return 1; #endif if (sprintf (buf, "%.4000d %d", 1, 33, 44) < 4000 + 3) result |= 1; if (sprintf (buf, "%.4000f %d", 1.0, 33, 44) < 4000 + 5) result |= 2; if (sprintf (buf, "%.511f %d", 1.0, 33, 44) < 511 + 5 || buf[0] != '1') result |= 4; if (sprintf (buf, "%.999f %d", 1.0, 33, 44) < 999 + 5 || buf[0] != '1') result |= 4; return result; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : gl_cv_func_printf_precision=yes else gl_cv_func_printf_precision=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_printf_precision" >&5 $as_echo "$gl_cv_func_printf_precision" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the compiler produces multi-arch binaries" >&5 $as_echo_n "checking whether the compiler produces multi-arch binaries... " >&6; } if ${gl_cv_c_multiarch+:} false; then : $as_echo_n "(cached) " >&6 else gl_cv_c_multiarch=no cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifndef __APPLE_CC__ not a universal capable compiler #endif typedef int dummy; _ACEOF if ac_fn_c_try_compile "$LINENO"; then : arch= prev= for word in ${CC} ${CFLAGS} ${CPPFLAGS} ${LDFLAGS}; do if test -n "$prev"; then case $word in i?86 | x86_64 | ppc | ppc64 | arm | arm64) if test -z "$arch" || test "$arch" = "$word"; then arch="$word" else gl_cv_c_multiarch=yes fi ;; esac prev= else if test "x$word" = "x-arch"; then prev=arch fi fi done fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_c_multiarch" >&5 $as_echo "$gl_cv_c_multiarch" >&6; } if test $gl_cv_c_multiarch = yes; then APPLE_UNIVERSAL_BUILD=1 else APPLE_UNIVERSAL_BUILD=0 fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether printf survives out-of-memory conditions" >&5 $as_echo_n "checking whether printf survives out-of-memory conditions... " >&6; } if ${gl_cv_func_printf_enomem+:} false; then : $as_echo_n "(cached) " >&6 else gl_cv_func_printf_enomem="guessing no" if test "$cross_compiling" = no; then if test $APPLE_UNIVERSAL_BUILD = 0; then cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #if defined __MACH__ && defined __APPLE__ /* Avoid a crash on Mac OS X. */ #include #include #include #include #include #include /* The exception port on which our thread listens. */ static mach_port_t our_exception_port; /* The main function of the thread listening for exceptions of type EXC_BAD_ACCESS. */ static void * mach_exception_thread (void *arg) { /* Buffer for a message to be received. */ struct { mach_msg_header_t head; mach_msg_body_t msgh_body; char data1024; } msg; mach_msg_return_t retval; /* Wait for a message on the exception port. */ retval = mach_msg (&msg.head, MACH_RCV_MSG | MACH_RCV_LARGE, 0, sizeof (msg), our_exception_port, MACH_MSG_TIMEOUT_NONE, MACH_PORT_NULL); if (retval != MACH_MSG_SUCCESS) abort (); exit (1); } static void nocrash_init (void) { mach_port_t self = mach_task_self (); /* Allocate a port on which the thread shall listen for exceptions. */ if (mach_port_allocate (self, MACH_PORT_RIGHT_RECEIVE, &our_exception_port) == KERN_SUCCESS) { /* See https://web.mit.edu/darwin/src/modules/xnu/osfmk/man/mach_port_insert_right.html. */ if (mach_port_insert_right (self, our_exception_port, our_exception_port, MACH_MSG_TYPE_MAKE_SEND) == KERN_SUCCESS) { /* The exceptions we want to catch. Only EXC_BAD_ACCESS is interesting for us. */ exception_mask_t mask = EXC_MASK_BAD_ACCESS; /* Create the thread listening on the exception port. */ pthread_attr_t attr; pthread_t thread; if (pthread_attr_init (&attr) == 0 && pthread_attr_setdetachstate (&attr, PTHREAD_CREATE_DETACHED) == 0 && pthread_create (&thread, &attr, mach_exception_thread, NULL) == 0) { pthread_attr_destroy (&attr); /* Replace the exception port info for these exceptions with our own. Note that we replace the exception port for the entire task, not only for a particular thread. This has the effect that when our exception port gets the message, the thread specific exception port has already been asked, and we don't need to bother about it. See https://web.mit.edu/darwin/src/modules/xnu/osfmk/man/task_set_exception_ports.html. */ task_set_exception_ports (self, mask, our_exception_port, EXCEPTION_DEFAULT, MACHINE_THREAD_STATE); } } } } #elif defined _WIN32 && ! defined __CYGWIN__ /* Avoid a crash on native Windows. */ #define WIN32_LEAN_AND_MEAN #include #include static LONG WINAPI exception_filter (EXCEPTION_POINTERS *ExceptionInfo) { switch (ExceptionInfo->ExceptionRecord->ExceptionCode) { case EXCEPTION_ACCESS_VIOLATION: case EXCEPTION_IN_PAGE_ERROR: case EXCEPTION_STACK_OVERFLOW: case EXCEPTION_GUARD_PAGE: case EXCEPTION_PRIV_INSTRUCTION: case EXCEPTION_ILLEGAL_INSTRUCTION: case EXCEPTION_DATATYPE_MISALIGNMENT: case EXCEPTION_ARRAY_BOUNDS_EXCEEDED: case EXCEPTION_NONCONTINUABLE_EXCEPTION: exit (1); } return EXCEPTION_CONTINUE_SEARCH; } static void nocrash_init (void) { SetUnhandledExceptionFilter ((LPTOP_LEVEL_EXCEPTION_FILTER) exception_filter); } #else /* Avoid a crash on POSIX systems. */ #include #include /* A POSIX signal handler. */ static void exception_handler (int sig) { _exit (1); } static void nocrash_init (void) { #ifdef SIGSEGV signal (SIGSEGV, exception_handler); #endif #ifdef SIGBUS signal (SIGBUS, exception_handler); #endif } #endif #include #include #include #include #include int main() { struct rlimit limit; int ret; nocrash_init (); /* Some printf implementations allocate temporary space with malloc. */ /* On BSD systems, malloc() is limited by RLIMIT_DATA. */ #ifdef RLIMIT_DATA if (getrlimit (RLIMIT_DATA, &limit) < 0) return 77; if (limit.rlim_max == RLIM_INFINITY || limit.rlim_max > 5000000) limit.rlim_max = 5000000; limit.rlim_cur = limit.rlim_max; if (setrlimit (RLIMIT_DATA, &limit) < 0) return 77; #endif /* On Linux systems, malloc() is limited by RLIMIT_AS. */ #ifdef RLIMIT_AS if (getrlimit (RLIMIT_AS, &limit) < 0) return 77; if (limit.rlim_max == RLIM_INFINITY || limit.rlim_max > 5000000) limit.rlim_max = 5000000; limit.rlim_cur = limit.rlim_max; if (setrlimit (RLIMIT_AS, &limit) < 0) return 77; #endif /* Some printf implementations allocate temporary space on the stack. */ #ifdef RLIMIT_STACK if (getrlimit (RLIMIT_STACK, &limit) < 0) return 77; if (limit.rlim_max == RLIM_INFINITY || limit.rlim_max > 5000000) limit.rlim_max = 5000000; limit.rlim_cur = limit.rlim_max; if (setrlimit (RLIMIT_STACK, &limit) < 0) return 77; #endif ret = printf ("%.5000000f", 1.0); return !(ret == 5000002 || (ret < 0 && errno == ENOMEM)); } _ACEOF if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s conftest$ac_exeext; then (./conftest 2>&5 result=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $result" >&5 if test $result != 0 && test $result != 77; then result=1; fi exit $result ) >/dev/null 2>/dev/null case $? in 0) gl_cv_func_printf_enomem="yes" ;; 77) gl_cv_func_printf_enomem="guessing no" ;; *) gl_cv_func_printf_enomem="no" ;; esac else gl_cv_func_printf_enomem="guessing no" fi rm -fr conftest* else gl_cv_func_printf_enomem="guessing no" fi fi if test "$gl_cv_func_printf_enomem" = "guessing no"; then case "$host_os" in # Guess yes on glibc systems. *-gnu* | gnu*) gl_cv_func_printf_enomem="guessing yes";; # Guess yes on Solaris. solaris*) gl_cv_func_printf_enomem="guessing yes";; # Guess yes on AIX. aix*) gl_cv_func_printf_enomem="guessing yes";; # Guess yes on HP-UX/hppa. hpux*) case "$host_cpu" in hppa*) gl_cv_func_printf_enomem="guessing yes";; *) gl_cv_func_printf_enomem="guessing no";; esac ;; # Guess yes on IRIX. irix*) gl_cv_func_printf_enomem="guessing yes";; # Guess yes on OSF/1. osf*) gl_cv_func_printf_enomem="guessing yes";; # Guess yes on BeOS. beos*) gl_cv_func_printf_enomem="guessing yes";; # Guess yes on Haiku. haiku*) gl_cv_func_printf_enomem="guessing yes";; # Guess no on Android. linux*-android*) gl_cv_func_printf_enomem="guessing no";; # If we don't know, obey --enable-cross-guesses. *) gl_cv_func_printf_enomem="$gl_cross_guess_normal";; esac fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_printf_enomem" >&5 $as_echo "$gl_cv_func_printf_enomem" >&6; } GNULIB__EXIT=0; GNULIB_ATOLL=0; GNULIB_CALLOC_POSIX=0; GNULIB_CANONICALIZE_FILE_NAME=0; GNULIB_GETLOADAVG=0; GNULIB_GETSUBOPT=0; GNULIB_GRANTPT=0; GNULIB_MALLOC_POSIX=0; GNULIB_MBTOWC=0; GNULIB_MKDTEMP=0; GNULIB_MKOSTEMP=0; GNULIB_MKOSTEMPS=0; GNULIB_MKSTEMP=0; GNULIB_MKSTEMPS=0; GNULIB_POSIX_OPENPT=0; GNULIB_PTSNAME=0; GNULIB_PTSNAME_R=0; GNULIB_PUTENV=0; GNULIB_QSORT_R=0; GNULIB_RANDOM=0; GNULIB_RANDOM_R=0; GNULIB_REALLOCARRAY=0; GNULIB_REALLOC_POSIX=0; GNULIB_REALPATH=0; GNULIB_RPMATCH=0; GNULIB_SECURE_GETENV=0; GNULIB_SETENV=0; GNULIB_STRTOD=0; GNULIB_STRTOLD=0; GNULIB_STRTOLL=0; GNULIB_STRTOULL=0; GNULIB_SYSTEM_POSIX=0; GNULIB_UNLOCKPT=0; GNULIB_UNSETENV=0; GNULIB_WCTOMB=0; HAVE__EXIT=1; HAVE_ATOLL=1; HAVE_CANONICALIZE_FILE_NAME=1; HAVE_DECL_GETLOADAVG=1; HAVE_GETSUBOPT=1; HAVE_GRANTPT=1; HAVE_INITSTATE=1; HAVE_DECL_INITSTATE=1; HAVE_MBTOWC=1; HAVE_MKDTEMP=1; HAVE_MKOSTEMP=1; HAVE_MKOSTEMPS=1; HAVE_MKSTEMP=1; HAVE_MKSTEMPS=1; HAVE_POSIX_OPENPT=1; HAVE_PTSNAME=1; HAVE_PTSNAME_R=1; HAVE_QSORT_R=1; HAVE_RANDOM=1; HAVE_RANDOM_H=1; HAVE_RANDOM_R=1; HAVE_REALLOCARRAY=1; HAVE_REALPATH=1; HAVE_RPMATCH=1; HAVE_SECURE_GETENV=1; HAVE_SETENV=1; HAVE_DECL_SETENV=1; HAVE_SETSTATE=1; HAVE_DECL_SETSTATE=1; HAVE_STRTOD=1; HAVE_STRTOLD=1; HAVE_STRTOLL=1; HAVE_STRTOULL=1; HAVE_STRUCT_RANDOM_DATA=1; HAVE_SYS_LOADAVG_H=0; HAVE_UNLOCKPT=1; HAVE_DECL_UNSETENV=1; REPLACE_CALLOC=0; REPLACE_CANONICALIZE_FILE_NAME=0; REPLACE_INITSTATE=0; REPLACE_MALLOC=0; REPLACE_MBTOWC=0; REPLACE_MKSTEMP=0; REPLACE_PTSNAME=0; REPLACE_PTSNAME_R=0; REPLACE_PUTENV=0; REPLACE_QSORT_R=0; REPLACE_RANDOM=0; REPLACE_RANDOM_R=0; REPLACE_REALLOC=0; REPLACE_REALPATH=0; REPLACE_SETENV=0; REPLACE_SETSTATE=0; REPLACE_STRTOD=0; REPLACE_STRTOLD=0; REPLACE_UNSETENV=0; REPLACE_WCTOMB=0; { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether // is distinct from /" >&5 $as_echo_n "checking whether // is distinct from /... " >&6; } if ${gl_cv_double_slash_root+:} false; then : $as_echo_n "(cached) " >&6 else if test x"$cross_compiling" = xyes ; then # When cross-compiling, there is no way to tell whether // is special # short of a list of hosts. However, the only known hosts to date # that have a distinct // are Apollo DomainOS (too old to port to), # Cygwin, and z/OS. If anyone knows of another system for which // has # special semantics and is distinct from /, please report it to # . case $host in *-cygwin | i370-ibm-openedition) gl_cv_double_slash_root=yes ;; *) # Be optimistic and assume that / and // are the same when we # don't know. gl_cv_double_slash_root='unknown, assuming no' ;; esac else set x `ls -di / // 2>/dev/null` if test "$2" = "$4" && wc //dev/null >/dev/null 2>&1; then gl_cv_double_slash_root=no else gl_cv_double_slash_root=yes fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_double_slash_root" >&5 $as_echo "$gl_cv_double_slash_root" >&6; } if test "$gl_cv_double_slash_root" = yes; then $as_echo "#define DOUBLE_SLASH_IS_DISTINCT_ROOT 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether realpath works" >&5 $as_echo_n "checking whether realpath works... " >&6; } if ${gl_cv_func_realpath_works+:} false; then : $as_echo_n "(cached) " >&6 else touch conftest.a mkdir conftest.d if test "$cross_compiling" = yes; then : case "$host_os" in # Guess yes on glibc systems. *-gnu* | gnu*) gl_cv_func_realpath_works="guessing yes" ;; # Guess yes on musl systems. *-musl*) gl_cv_func_realpath_works="guessing yes" ;; # Guess no on native Windows. mingw*) gl_cv_func_realpath_works="guessing no" ;; # If we don't know, obey --enable-cross-guesses. *) gl_cv_func_realpath_works="$gl_cross_guess_normal" ;; esac else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #if defined __MACH__ && defined __APPLE__ /* Avoid a crash on Mac OS X. */ #include #include #include #include #include #include /* The exception port on which our thread listens. */ static mach_port_t our_exception_port; /* The main function of the thread listening for exceptions of type EXC_BAD_ACCESS. */ static void * mach_exception_thread (void *arg) { /* Buffer for a message to be received. */ struct { mach_msg_header_t head; mach_msg_body_t msgh_body; char data[1024]; } msg; mach_msg_return_t retval; /* Wait for a message on the exception port. */ retval = mach_msg (&msg.head, MACH_RCV_MSG | MACH_RCV_LARGE, 0, sizeof (msg), our_exception_port, MACH_MSG_TIMEOUT_NONE, MACH_PORT_NULL); if (retval != MACH_MSG_SUCCESS) abort (); exit (1); } static void nocrash_init (void) { mach_port_t self = mach_task_self (); /* Allocate a port on which the thread shall listen for exceptions. */ if (mach_port_allocate (self, MACH_PORT_RIGHT_RECEIVE, &our_exception_port) == KERN_SUCCESS) { /* See https://web.mit.edu/darwin/src/modules/xnu/osfmk/man/mach_port_insert_right.html. */ if (mach_port_insert_right (self, our_exception_port, our_exception_port, MACH_MSG_TYPE_MAKE_SEND) == KERN_SUCCESS) { /* The exceptions we want to catch. Only EXC_BAD_ACCESS is interesting for us. */ exception_mask_t mask = EXC_MASK_BAD_ACCESS; /* Create the thread listening on the exception port. */ pthread_attr_t attr; pthread_t thread; if (pthread_attr_init (&attr) == 0 && pthread_attr_setdetachstate (&attr, PTHREAD_CREATE_DETACHED) == 0 && pthread_create (&thread, &attr, mach_exception_thread, NULL) == 0) { pthread_attr_destroy (&attr); /* Replace the exception port info for these exceptions with our own. Note that we replace the exception port for the entire task, not only for a particular thread. This has the effect that when our exception port gets the message, the thread specific exception port has already been asked, and we don't need to bother about it. See https://web.mit.edu/darwin/src/modules/xnu/osfmk/man/task_set_exception_ports.html. */ task_set_exception_ports (self, mask, our_exception_port, EXCEPTION_DEFAULT, MACHINE_THREAD_STATE); } } } } #elif defined _WIN32 && ! defined __CYGWIN__ /* Avoid a crash on native Windows. */ #define WIN32_LEAN_AND_MEAN #include #include static LONG WINAPI exception_filter (EXCEPTION_POINTERS *ExceptionInfo) { switch (ExceptionInfo->ExceptionRecord->ExceptionCode) { case EXCEPTION_ACCESS_VIOLATION: case EXCEPTION_IN_PAGE_ERROR: case EXCEPTION_STACK_OVERFLOW: case EXCEPTION_GUARD_PAGE: case EXCEPTION_PRIV_INSTRUCTION: case EXCEPTION_ILLEGAL_INSTRUCTION: case EXCEPTION_DATATYPE_MISALIGNMENT: case EXCEPTION_ARRAY_BOUNDS_EXCEEDED: case EXCEPTION_NONCONTINUABLE_EXCEPTION: exit (1); } return EXCEPTION_CONTINUE_SEARCH; } static void nocrash_init (void) { SetUnhandledExceptionFilter ((LPTOP_LEVEL_EXCEPTION_FILTER) exception_filter); } #else /* Avoid a crash on POSIX systems. */ #include #include /* A POSIX signal handler. */ static void exception_handler (int sig) { _exit (1); } static void nocrash_init (void) { #ifdef SIGSEGV signal (SIGSEGV, exception_handler); #endif #ifdef SIGBUS signal (SIGBUS, exception_handler); #endif } #endif #include #include int main () { int result = 0; { char *name = realpath ("conftest.a", NULL); if (!(name && *name == '/')) result |= 1; free (name); } { char *name = realpath ("conftest.b/../conftest.a", NULL); if (name != NULL) result |= 2; free (name); } { char *name = realpath ("conftest.a/", NULL); if (name != NULL) result |= 4; free (name); } { char *name1 = realpath (".", NULL); char *name2 = realpath ("conftest.d//./..", NULL); if (! name1 || ! name2 || strcmp (name1, name2)) result |= 8; free (name1); free (name2); } return result; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : gl_cv_func_realpath_works=yes else gl_cv_func_realpath_works=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi rm -rf conftest.a conftest.d fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_realpath_works" >&5 $as_echo "$gl_cv_func_realpath_works" >&6; } case "$gl_cv_func_realpath_works" in *yes) $as_echo "#define FUNC_REALPATH_WORKS 1" >>confdefs.h ;; esac GNULIB_ACCESS=0; GNULIB_CHDIR=0; GNULIB_CHOWN=0; GNULIB_CLOSE=0; GNULIB_COPY_FILE_RANGE=0; GNULIB_DUP=0; GNULIB_DUP2=0; GNULIB_DUP3=0; GNULIB_ENVIRON=0; GNULIB_EUIDACCESS=0; GNULIB_FACCESSAT=0; GNULIB_FCHDIR=0; GNULIB_FCHOWNAT=0; GNULIB_FDATASYNC=0; GNULIB_FSYNC=0; GNULIB_FTRUNCATE=0; GNULIB_GETCWD=0; GNULIB_GETDOMAINNAME=0; GNULIB_GETDTABLESIZE=0; GNULIB_GETENTROPY=0; GNULIB_GETGROUPS=0; GNULIB_GETHOSTNAME=0; GNULIB_GETLOGIN=0; GNULIB_GETLOGIN_R=0; GNULIB_GETOPT_POSIX=0; GNULIB_GETPAGESIZE=0; GNULIB_GETPASS=0; GNULIB_GETUSERSHELL=0; GNULIB_GROUP_MEMBER=0; GNULIB_ISATTY=0; GNULIB_LCHOWN=0; GNULIB_LINK=0; GNULIB_LINKAT=0; GNULIB_LSEEK=0; GNULIB_PIPE=0; GNULIB_PIPE2=0; GNULIB_PREAD=0; GNULIB_PWRITE=0; GNULIB_READ=0; GNULIB_READLINK=0; GNULIB_READLINKAT=0; GNULIB_RMDIR=0; GNULIB_SETHOSTNAME=0; GNULIB_SLEEP=0; GNULIB_SYMLINK=0; GNULIB_SYMLINKAT=0; GNULIB_TRUNCATE=0; GNULIB_TTYNAME_R=0; GNULIB_UNISTD_H_NONBLOCKING=0; GNULIB_UNISTD_H_SIGPIPE=0; GNULIB_UNLINK=0; GNULIB_UNLINKAT=0; GNULIB_USLEEP=0; GNULIB_WRITE=0; HAVE_CHOWN=1; HAVE_COPY_FILE_RANGE=1; HAVE_DUP3=1; HAVE_EUIDACCESS=1; HAVE_FACCESSAT=1; HAVE_FCHDIR=1; HAVE_FCHOWNAT=1; HAVE_FDATASYNC=1; HAVE_FSYNC=1; HAVE_FTRUNCATE=1; HAVE_GETDTABLESIZE=1; HAVE_GETENTROPY=1; HAVE_GETGROUPS=1; HAVE_GETHOSTNAME=1; HAVE_GETLOGIN=1; HAVE_GETPAGESIZE=1; HAVE_GETPASS=1; HAVE_GROUP_MEMBER=1; HAVE_LCHOWN=1; HAVE_LINK=1; HAVE_LINKAT=1; HAVE_PIPE=1; HAVE_PIPE2=1; HAVE_PREAD=1; HAVE_PWRITE=1; HAVE_READLINK=1; HAVE_READLINKAT=1; HAVE_SETHOSTNAME=1; HAVE_SLEEP=1; HAVE_SYMLINK=1; HAVE_SYMLINKAT=1; HAVE_UNLINKAT=1; HAVE_USLEEP=1; HAVE_DECL_ENVIRON=1; HAVE_DECL_FCHDIR=1; HAVE_DECL_FDATASYNC=1; HAVE_DECL_GETDOMAINNAME=1; HAVE_DECL_GETLOGIN=1; HAVE_DECL_GETLOGIN_R=1; HAVE_DECL_GETPAGESIZE=1; HAVE_DECL_GETUSERSHELL=1; HAVE_DECL_SETHOSTNAME=1; HAVE_DECL_TRUNCATE=1; HAVE_DECL_TTYNAME_R=1; HAVE_OS_H=0; HAVE_SYS_PARAM_H=0; REPLACE_ACCESS=0; REPLACE_CHOWN=0; REPLACE_CLOSE=0; REPLACE_DUP=0; REPLACE_DUP2=0; REPLACE_FACCESSAT=0; REPLACE_FCHOWNAT=0; REPLACE_FTRUNCATE=0; REPLACE_GETCWD=0; REPLACE_GETDOMAINNAME=0; REPLACE_GETDTABLESIZE=0; REPLACE_GETLOGIN_R=0; REPLACE_GETGROUPS=0; REPLACE_GETPAGESIZE=0; REPLACE_GETPASS=0; REPLACE_ISATTY=0; REPLACE_LCHOWN=0; REPLACE_LINK=0; REPLACE_LINKAT=0; REPLACE_LSEEK=0; REPLACE_PREAD=0; REPLACE_PWRITE=0; REPLACE_READ=0; REPLACE_READLINK=0; REPLACE_READLINKAT=0; REPLACE_RMDIR=0; REPLACE_SLEEP=0; REPLACE_SYMLINK=0; REPLACE_SYMLINKAT=0; REPLACE_TRUNCATE=0; REPLACE_TTYNAME_R=0; REPLACE_UNLINK=0; REPLACE_UNLINKAT=0; REPLACE_USLEEP=0; REPLACE_WRITE=0; UNISTD_H_HAVE_SYS_RANDOM_H=0; UNISTD_H_HAVE_WINSOCK2_H=0; UNISTD_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS=0; if test $ac_cv_func__set_invalid_parameter_handler = yes; then HAVE_MSVC_INVALID_PARAMETER_HANDLER=1 $as_echo "#define HAVE_MSVC_INVALID_PARAMETER_HANDLER 1" >>confdefs.h else HAVE_MSVC_INVALID_PARAMETER_HANDLER=0 fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking if environ is properly declared" >&5 $as_echo_n "checking if environ is properly declared... " >&6; } if ${gt_cv_var_environ_declaration+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #if HAVE_UNISTD_H #include #endif /* mingw, BeOS, Haiku declare environ in , not in . */ #include extern struct { int foo; } environ; int main () { environ.foo = 1; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : gt_cv_var_environ_declaration=no else gt_cv_var_environ_declaration=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_var_environ_declaration" >&5 $as_echo "$gt_cv_var_environ_declaration" >&6; } if test $gt_cv_var_environ_declaration = yes; then $as_echo "#define HAVE_ENVIRON_DECL 1" >>confdefs.h fi if test $gt_cv_var_environ_declaration != yes; then HAVE_DECL_ENVIRON=0 fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for complete errno.h" >&5 $as_echo_n "checking for complete errno.h... " >&6; } if ${gl_cv_header_errno_h_complete+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #if !defined ETXTBSY booboo #endif #if !defined ENOMSG booboo #endif #if !defined EIDRM booboo #endif #if !defined ENOLINK booboo #endif #if !defined EPROTO booboo #endif #if !defined EMULTIHOP booboo #endif #if !defined EBADMSG booboo #endif #if !defined EOVERFLOW booboo #endif #if !defined ENOTSUP booboo #endif #if !defined ENETRESET booboo #endif #if !defined ECONNABORTED booboo #endif #if !defined ESTALE booboo #endif #if !defined EDQUOT booboo #endif #if !defined ECANCELED booboo #endif #if !defined EOWNERDEAD booboo #endif #if !defined ENOTRECOVERABLE booboo #endif #if !defined EILSEQ booboo #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "booboo" >/dev/null 2>&1; then : gl_cv_header_errno_h_complete=no else gl_cv_header_errno_h_complete=yes fi rm -f conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_errno_h_complete" >&5 $as_echo "$gl_cv_header_errno_h_complete" >&6; } if test $gl_cv_header_errno_h_complete = yes; then ERRNO_H='' else if test $gl_cv_have_include_next = yes; then gl_cv_next_errno_h='<'errno.h'>' else { $as_echo "$as_me:${as_lineno-$LINENO}: checking absolute name of " >&5 $as_echo_n "checking absolute name of ... " >&6; } if ${gl_cv_next_errno_h+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF case "$host_os" in aix*) gl_absname_cpp="$ac_cpp -C" ;; *) gl_absname_cpp="$ac_cpp" ;; esac case "$host_os" in mingw*) gl_dirsep_regex='[/\\]' ;; *) gl_dirsep_regex='\/' ;; esac gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g' gl_header_literal_regex=`echo 'errno.h' \ | sed -e "$gl_make_literal_regex_sed"` gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{ s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/ s|^/[^/]|//&| p q }' gl_cv_absolute_errno_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 | sed -n "$gl_absolute_header_sed"` gl_header=$gl_cv_absolute_errno_h gl_cv_next_errno_h='"'$gl_header'"' fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_errno_h" >&5 $as_echo "$gl_cv_next_errno_h" >&6; } fi NEXT_ERRNO_H=$gl_cv_next_errno_h if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next' gl_next_as_first_directive='<'errno.h'>' else # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include' gl_next_as_first_directive=$gl_cv_next_errno_h fi NEXT_AS_FIRST_DIRECTIVE_ERRNO_H=$gl_next_as_first_directive ERRNO_H='errno.h' fi if test -n "$ERRNO_H"; then GL_GENERATE_ERRNO_H_TRUE= GL_GENERATE_ERRNO_H_FALSE='#' else GL_GENERATE_ERRNO_H_TRUE='#' GL_GENERATE_ERRNO_H_FALSE= fi if test -n "$ERRNO_H"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for EMULTIHOP value" >&5 $as_echo_n "checking for EMULTIHOP value... " >&6; } if ${gl_cv_header_errno_h_EMULTIHOP+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #ifdef EMULTIHOP yes #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "yes" >/dev/null 2>&1; then : gl_cv_header_errno_h_EMULTIHOP=yes else gl_cv_header_errno_h_EMULTIHOP=no fi rm -f conftest* if test $gl_cv_header_errno_h_EMULTIHOP = no; then cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define _XOPEN_SOURCE_EXTENDED 1 #include #ifdef EMULTIHOP yes #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "yes" >/dev/null 2>&1; then : gl_cv_header_errno_h_EMULTIHOP=hidden fi rm -f conftest* if test $gl_cv_header_errno_h_EMULTIHOP = hidden; then if ac_fn_c_compute_int "$LINENO" "EMULTIHOP" "gl_cv_header_errno_h_EMULTIHOP" " #define _XOPEN_SOURCE_EXTENDED 1 #include /* The following two lines are a workaround against an autoconf-2.52 bug. */ #include #include "; then : fi fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_errno_h_EMULTIHOP" >&5 $as_echo "$gl_cv_header_errno_h_EMULTIHOP" >&6; } case $gl_cv_header_errno_h_EMULTIHOP in yes | no) EMULTIHOP_HIDDEN=0; EMULTIHOP_VALUE= ;; *) EMULTIHOP_HIDDEN=1; EMULTIHOP_VALUE="$gl_cv_header_errno_h_EMULTIHOP" ;; esac fi if test -n "$ERRNO_H"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ENOLINK value" >&5 $as_echo_n "checking for ENOLINK value... " >&6; } if ${gl_cv_header_errno_h_ENOLINK+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #ifdef ENOLINK yes #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "yes" >/dev/null 2>&1; then : gl_cv_header_errno_h_ENOLINK=yes else gl_cv_header_errno_h_ENOLINK=no fi rm -f conftest* if test $gl_cv_header_errno_h_ENOLINK = no; then cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define _XOPEN_SOURCE_EXTENDED 1 #include #ifdef ENOLINK yes #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "yes" >/dev/null 2>&1; then : gl_cv_header_errno_h_ENOLINK=hidden fi rm -f conftest* if test $gl_cv_header_errno_h_ENOLINK = hidden; then if ac_fn_c_compute_int "$LINENO" "ENOLINK" "gl_cv_header_errno_h_ENOLINK" " #define _XOPEN_SOURCE_EXTENDED 1 #include /* The following two lines are a workaround against an autoconf-2.52 bug. */ #include #include "; then : fi fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_errno_h_ENOLINK" >&5 $as_echo "$gl_cv_header_errno_h_ENOLINK" >&6; } case $gl_cv_header_errno_h_ENOLINK in yes | no) ENOLINK_HIDDEN=0; ENOLINK_VALUE= ;; *) ENOLINK_HIDDEN=1; ENOLINK_VALUE="$gl_cv_header_errno_h_ENOLINK" ;; esac fi if test -n "$ERRNO_H"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for EOVERFLOW value" >&5 $as_echo_n "checking for EOVERFLOW value... " >&6; } if ${gl_cv_header_errno_h_EOVERFLOW+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #ifdef EOVERFLOW yes #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "yes" >/dev/null 2>&1; then : gl_cv_header_errno_h_EOVERFLOW=yes else gl_cv_header_errno_h_EOVERFLOW=no fi rm -f conftest* if test $gl_cv_header_errno_h_EOVERFLOW = no; then cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define _XOPEN_SOURCE_EXTENDED 1 #include #ifdef EOVERFLOW yes #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "yes" >/dev/null 2>&1; then : gl_cv_header_errno_h_EOVERFLOW=hidden fi rm -f conftest* if test $gl_cv_header_errno_h_EOVERFLOW = hidden; then if ac_fn_c_compute_int "$LINENO" "EOVERFLOW" "gl_cv_header_errno_h_EOVERFLOW" " #define _XOPEN_SOURCE_EXTENDED 1 #include /* The following two lines are a workaround against an autoconf-2.52 bug. */ #include #include "; then : fi fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_errno_h_EOVERFLOW" >&5 $as_echo "$gl_cv_header_errno_h_EOVERFLOW" >&6; } case $gl_cv_header_errno_h_EOVERFLOW in yes | no) EOVERFLOW_HIDDEN=0; EOVERFLOW_VALUE= ;; *) EOVERFLOW_HIDDEN=1; EOVERFLOW_VALUE="$gl_cv_header_errno_h_EOVERFLOW" ;; esac fi ac_fn_c_check_decl "$LINENO" "strerror_r" "ac_cv_have_decl_strerror_r" "$ac_includes_default" if test "x$ac_cv_have_decl_strerror_r" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_STRERROR_R $ac_have_decl _ACEOF for ac_func in strerror_r do : ac_fn_c_check_func "$LINENO" "strerror_r" "ac_cv_func_strerror_r" if test "x$ac_cv_func_strerror_r" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_STRERROR_R 1 _ACEOF fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether strerror_r returns char *" >&5 $as_echo_n "checking whether strerror_r returns char *... " >&6; } if ${ac_cv_func_strerror_r_char_p+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_func_strerror_r_char_p=no if test $ac_cv_have_decl_strerror_r = yes; then cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { char buf[100]; char x = *strerror_r (0, buf, sizeof buf); char *p = strerror_r (0, buf, sizeof buf); return !p || x; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_func_strerror_r_char_p=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext else # strerror_r is not declared. Choose between # systems that have relatively inaccessible declarations for the # function. BeOS and DEC UNIX 4.0 fall in this category, but the # former has a strerror_r that returns char*, while the latter # has a strerror_r that returns `int'. # This test should segfault on the DEC system. if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default extern char *strerror_r (); int main () { char buf[100]; char x = *strerror_r (0, buf, sizeof buf); return ! isalpha (x); ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_func_strerror_r_char_p=yes fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_strerror_r_char_p" >&5 $as_echo "$ac_cv_func_strerror_r_char_p" >&6; } if test $ac_cv_func_strerror_r_char_p = yes; then $as_echo "#define STRERROR_R_CHAR_P 1" >>confdefs.h fi XGETTEXT_EXTRA_OPTIONS= GNULIB_EXPLICIT_BZERO=0; GNULIB_FFSL=0; GNULIB_FFSLL=0; GNULIB_MEMCHR=0; GNULIB_MEMMEM=0; GNULIB_MEMPCPY=0; GNULIB_MEMRCHR=0; GNULIB_RAWMEMCHR=0; GNULIB_STPCPY=0; GNULIB_STPNCPY=0; GNULIB_STRCHRNUL=0; GNULIB_STRDUP=0; GNULIB_STRNCAT=0; GNULIB_STRNDUP=0; GNULIB_STRNLEN=0; GNULIB_STRPBRK=0; GNULIB_STRSEP=0; GNULIB_STRSTR=0; GNULIB_STRCASESTR=0; GNULIB_STRTOK_R=0; GNULIB_MBSLEN=0; GNULIB_MBSNLEN=0; GNULIB_MBSCHR=0; GNULIB_MBSRCHR=0; GNULIB_MBSSTR=0; GNULIB_MBSCASECMP=0; GNULIB_MBSNCASECMP=0; GNULIB_MBSPCASECMP=0; GNULIB_MBSCASESTR=0; GNULIB_MBSCSPN=0; GNULIB_MBSPBRK=0; GNULIB_MBSSPN=0; GNULIB_MBSSEP=0; GNULIB_MBSTOK_R=0; GNULIB_STRERROR=0; GNULIB_STRERROR_R=0; GNULIB_STRSIGNAL=0; GNULIB_STRVERSCMP=0; HAVE_MBSLEN=0; HAVE_EXPLICIT_BZERO=1; HAVE_FFSL=1; HAVE_FFSLL=1; HAVE_DECL_MEMMEM=1; HAVE_MEMPCPY=1; HAVE_DECL_MEMRCHR=1; HAVE_RAWMEMCHR=1; HAVE_STPCPY=1; HAVE_STPNCPY=1; HAVE_STRCHRNUL=1; HAVE_DECL_STRDUP=1; HAVE_DECL_STRNDUP=1; HAVE_DECL_STRNLEN=1; HAVE_STRPBRK=1; HAVE_STRSEP=1; HAVE_STRCASESTR=1; HAVE_DECL_STRTOK_R=1; HAVE_DECL_STRERROR_R=1; HAVE_DECL_STRSIGNAL=1; HAVE_STRVERSCMP=1; REPLACE_MEMCHR=0; REPLACE_MEMMEM=0; REPLACE_STPNCPY=0; REPLACE_STRCHRNUL=0; REPLACE_STRDUP=0; REPLACE_STRNCAT=0; REPLACE_STRNDUP=0; REPLACE_STRNLEN=0; REPLACE_STRSTR=0; REPLACE_STRCASESTR=0; REPLACE_STRTOK_R=0; REPLACE_STRERROR=0; REPLACE_STRERROR_R=0; REPLACE_STRSIGNAL=0; UNDEFINE_STRTOK_R=0; ac_fn_c_check_type "$LINENO" "sig_atomic_t" "ac_cv_type_sig_atomic_t" "#include " if test "x$ac_cv_type_sig_atomic_t" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_SIG_ATOMIC_T 1 _ACEOF else $as_echo "#define sig_atomic_t int" >>confdefs.h fi GNULIB_CREAT=0; GNULIB_FCNTL=0; GNULIB_NONBLOCKING=0; GNULIB_OPEN=0; GNULIB_OPENAT=0; HAVE_FCNTL=1; HAVE_OPENAT=1; REPLACE_CREAT=0; REPLACE_FCNTL=0; REPLACE_OPEN=0; REPLACE_OPENAT=0; { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working fcntl.h" >&5 $as_echo_n "checking for working fcntl.h... " >&6; } if ${gl_cv_header_working_fcntl_h+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : case "$host_os" in # Guess 'no' on native Windows. mingw*) gl_cv_header_working_fcntl_h='no' ;; *) gl_cv_header_working_fcntl_h=cross-compiling ;; esac else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if HAVE_UNISTD_H # include #else /* on Windows with MSVC */ # include # include # defined sleep(n) _sleep ((n) * 1000) #endif #include #ifndef O_NOATIME #define O_NOATIME 0 #endif #ifndef O_NOFOLLOW #define O_NOFOLLOW 0 #endif static int const constants[] = { O_CREAT, O_EXCL, O_NOCTTY, O_TRUNC, O_APPEND, O_NONBLOCK, O_SYNC, O_ACCMODE, O_RDONLY, O_RDWR, O_WRONLY }; int main () { int result = !constants; #if HAVE_SYMLINK { static char const sym[] = "conftest.sym"; if (symlink ("/dev/null", sym) != 0) result |= 2; else { int fd = open (sym, O_WRONLY | O_NOFOLLOW | O_CREAT, 0); if (fd >= 0) { close (fd); result |= 4; } } if (unlink (sym) != 0 || symlink (".", sym) != 0) result |= 2; else { int fd = open (sym, O_RDONLY | O_NOFOLLOW); if (fd >= 0) { close (fd); result |= 4; } } unlink (sym); } #endif { static char const file[] = "confdefs.h"; int fd = open (file, O_RDONLY | O_NOATIME); if (fd < 0) result |= 8; else { struct stat st0; if (fstat (fd, &st0) != 0) result |= 16; else { char c; sleep (1); if (read (fd, &c, 1) != 1) result |= 24; else { if (close (fd) != 0) result |= 32; else { struct stat st1; if (stat (file, &st1) != 0) result |= 40; else if (st0.st_atime != st1.st_atime) result |= 64; } } } } } return result; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : gl_cv_header_working_fcntl_h=yes else case $? in #( 4) gl_cv_header_working_fcntl_h='no (bad O_NOFOLLOW)';; #( 64) gl_cv_header_working_fcntl_h='no (bad O_NOATIME)';; #( 68) gl_cv_header_working_fcntl_h='no (bad O_NOATIME, O_NOFOLLOW)';; #( *) gl_cv_header_working_fcntl_h='no';; esac fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_working_fcntl_h" >&5 $as_echo "$gl_cv_header_working_fcntl_h" >&6; } case $gl_cv_header_working_fcntl_h in #( *O_NOATIME* | no | cross-compiling) ac_val=0;; #( *) ac_val=1;; esac cat >>confdefs.h <<_ACEOF #define HAVE_WORKING_O_NOATIME $ac_val _ACEOF case $gl_cv_header_working_fcntl_h in #( *O_NOFOLLOW* | no | cross-compiling) ac_val=0;; #( *) ac_val=1;; esac cat >>confdefs.h <<_ACEOF #define HAVE_WORKING_O_NOFOLLOW $ac_val _ACEOF ac_fn_c_check_type "$LINENO" "pid_t" "ac_cv_type_pid_t" "$ac_includes_default" if test "x$ac_cv_type_pid_t" = xyes; then : else cat >>confdefs.h <<_ACEOF #define pid_t int _ACEOF fi ac_fn_c_check_type "$LINENO" "mode_t" "ac_cv_type_mode_t" "$ac_includes_default" if test "x$ac_cv_type_mode_t" = xyes; then : else cat >>confdefs.h <<_ACEOF #define mode_t int _ACEOF fi GNULIB_ACOSF=0; GNULIB_ACOSL=0; GNULIB_ASINF=0; GNULIB_ASINL=0; GNULIB_ATANF=0; GNULIB_ATANL=0; GNULIB_ATAN2F=0; GNULIB_CBRT=0; GNULIB_CBRTF=0; GNULIB_CBRTL=0; GNULIB_CEIL=0; GNULIB_CEILF=0; GNULIB_CEILL=0; GNULIB_COPYSIGN=0; GNULIB_COPYSIGNF=0; GNULIB_COPYSIGNL=0; GNULIB_COSF=0; GNULIB_COSL=0; GNULIB_COSHF=0; GNULIB_EXPF=0; GNULIB_EXPL=0; GNULIB_EXP2=0; GNULIB_EXP2F=0; GNULIB_EXP2L=0; GNULIB_EXPM1=0; GNULIB_EXPM1F=0; GNULIB_EXPM1L=0; GNULIB_FABSF=0; GNULIB_FABSL=0; GNULIB_FLOOR=0; GNULIB_FLOORF=0; GNULIB_FLOORL=0; GNULIB_FMA=0; GNULIB_FMAF=0; GNULIB_FMAL=0; GNULIB_FMOD=0; GNULIB_FMODF=0; GNULIB_FMODL=0; GNULIB_FREXPF=0; GNULIB_FREXP=0; GNULIB_FREXPL=0; GNULIB_HYPOT=0; GNULIB_HYPOTF=0; GNULIB_HYPOTL=0; GNULIB_ILOGB=0; GNULIB_ILOGBF=0; GNULIB_ILOGBL=0; GNULIB_ISFINITE=0; GNULIB_ISINF=0; GNULIB_ISNAN=0; GNULIB_ISNANF=0; GNULIB_ISNAND=0; GNULIB_ISNANL=0; GNULIB_LDEXPF=0; GNULIB_LDEXPL=0; GNULIB_LOG=0; GNULIB_LOGF=0; GNULIB_LOGL=0; GNULIB_LOG10=0; GNULIB_LOG10F=0; GNULIB_LOG10L=0; GNULIB_LOG1P=0; GNULIB_LOG1PF=0; GNULIB_LOG1PL=0; GNULIB_LOG2=0; GNULIB_LOG2F=0; GNULIB_LOG2L=0; GNULIB_LOGB=0; GNULIB_LOGBF=0; GNULIB_LOGBL=0; GNULIB_MODF=0; GNULIB_MODFF=0; GNULIB_MODFL=0; GNULIB_POWF=0; GNULIB_REMAINDER=0; GNULIB_REMAINDERF=0; GNULIB_REMAINDERL=0; GNULIB_RINT=0; GNULIB_RINTF=0; GNULIB_RINTL=0; GNULIB_ROUND=0; GNULIB_ROUNDF=0; GNULIB_ROUNDL=0; GNULIB_SIGNBIT=0; GNULIB_SINF=0; GNULIB_SINL=0; GNULIB_SINHF=0; GNULIB_SQRTF=0; GNULIB_SQRTL=0; GNULIB_TANF=0; GNULIB_TANL=0; GNULIB_TANHF=0; GNULIB_TRUNC=0; GNULIB_TRUNCF=0; GNULIB_TRUNCL=0; HAVE_ACOSF=1; HAVE_ACOSL=1; HAVE_ASINF=1; HAVE_ASINL=1; HAVE_ATANF=1; HAVE_ATANL=1; HAVE_ATAN2F=1; HAVE_CBRT=1; HAVE_CBRTF=1; HAVE_CBRTL=1; HAVE_COPYSIGN=1; HAVE_COPYSIGNL=1; HAVE_COSF=1; HAVE_COSL=1; HAVE_COSHF=1; HAVE_EXPF=1; HAVE_EXPL=1; HAVE_EXPM1=1; HAVE_EXPM1F=1; HAVE_FABSF=1; HAVE_FABSL=1; HAVE_FMA=1; HAVE_FMAF=1; HAVE_FMAL=1; HAVE_FMODF=1; HAVE_FMODL=1; HAVE_FREXPF=1; HAVE_HYPOTF=1; HAVE_HYPOTL=1; HAVE_ILOGB=1; HAVE_ILOGBF=1; HAVE_ILOGBL=1; HAVE_ISNANF=1; HAVE_ISNAND=1; HAVE_ISNANL=1; HAVE_LDEXPF=1; HAVE_LOGF=1; HAVE_LOGL=1; HAVE_LOG10F=1; HAVE_LOG10L=1; HAVE_LOG1P=1; HAVE_LOG1PF=1; HAVE_LOG1PL=1; HAVE_LOGBF=1; HAVE_LOGBL=1; HAVE_MODFF=1; HAVE_MODFL=1; HAVE_POWF=1; HAVE_REMAINDER=1; HAVE_REMAINDERF=1; HAVE_RINT=1; HAVE_RINTL=1; HAVE_SINF=1; HAVE_SINL=1; HAVE_SINHF=1; HAVE_SQRTF=1; HAVE_SQRTL=1; HAVE_TANF=1; HAVE_TANL=1; HAVE_TANHF=1; HAVE_DECL_ACOSL=1; HAVE_DECL_ASINL=1; HAVE_DECL_ATANL=1; HAVE_DECL_CBRTF=1; HAVE_DECL_CBRTL=1; HAVE_DECL_CEILF=1; HAVE_DECL_CEILL=1; HAVE_DECL_COPYSIGNF=1; HAVE_DECL_COSL=1; HAVE_DECL_EXPL=1; HAVE_DECL_EXP2=1; HAVE_DECL_EXP2F=1; HAVE_DECL_EXP2L=1; HAVE_DECL_EXPM1L=1; HAVE_DECL_FLOORF=1; HAVE_DECL_FLOORL=1; HAVE_DECL_FREXPL=1; HAVE_DECL_LDEXPL=1; HAVE_DECL_LOGL=1; HAVE_DECL_LOG10L=1; HAVE_DECL_LOG2=1; HAVE_DECL_LOG2F=1; HAVE_DECL_LOG2L=1; HAVE_DECL_LOGB=1; HAVE_DECL_REMAINDER=1; HAVE_DECL_REMAINDERL=1; HAVE_DECL_RINTF=1; HAVE_DECL_ROUND=1; HAVE_DECL_ROUNDF=1; HAVE_DECL_ROUNDL=1; HAVE_DECL_SINL=1; HAVE_DECL_SQRTL=1; HAVE_DECL_TANL=1; HAVE_DECL_TRUNC=1; HAVE_DECL_TRUNCF=1; HAVE_DECL_TRUNCL=1; REPLACE_ACOSF=0; REPLACE_ASINF=0; REPLACE_ATANF=0; REPLACE_ATAN2F=0; REPLACE_CBRTF=0; REPLACE_CBRTL=0; REPLACE_CEIL=0; REPLACE_CEILF=0; REPLACE_CEILL=0; REPLACE_COSF=0; REPLACE_COSHF=0; REPLACE_EXPF=0; REPLACE_EXPL=0; REPLACE_EXPM1=0; REPLACE_EXPM1F=0; REPLACE_EXPM1L=0; REPLACE_EXP2=0; REPLACE_EXP2L=0; REPLACE_FABSL=0; REPLACE_FLOOR=0; REPLACE_FLOORF=0; REPLACE_FLOORL=0; REPLACE_FMA=0; REPLACE_FMAF=0; REPLACE_FMAL=0; REPLACE_FMOD=0; REPLACE_FMODF=0; REPLACE_FMODL=0; REPLACE_FREXPF=0; REPLACE_FREXP=0; REPLACE_FREXPL=0; REPLACE_HUGE_VAL=0; REPLACE_HYPOT=0; REPLACE_HYPOTF=0; REPLACE_HYPOTL=0; REPLACE_ILOGB=0; REPLACE_ILOGBF=0; REPLACE_ILOGBL=0; REPLACE_ISFINITE=0; REPLACE_ISINF=0; REPLACE_ISNAN=0; REPLACE_LDEXPL=0; REPLACE_LOG=0; REPLACE_LOGF=0; REPLACE_LOGL=0; REPLACE_LOG10=0; REPLACE_LOG10F=0; REPLACE_LOG10L=0; REPLACE_LOG1P=0; REPLACE_LOG1PF=0; REPLACE_LOG1PL=0; REPLACE_LOG2=0; REPLACE_LOG2F=0; REPLACE_LOG2L=0; REPLACE_LOGB=0; REPLACE_LOGBF=0; REPLACE_LOGBL=0; REPLACE_MODF=0; REPLACE_MODFF=0; REPLACE_MODFL=0; REPLACE_NAN=0; REPLACE_REMAINDER=0; REPLACE_REMAINDERF=0; REPLACE_REMAINDERL=0; REPLACE_RINTL=0; REPLACE_ROUND=0; REPLACE_ROUNDF=0; REPLACE_ROUNDL=0; REPLACE_SIGNBIT=0; REPLACE_SIGNBIT_USING_BUILTINS=0; REPLACE_SINF=0; REPLACE_SINHF=0; REPLACE_SQRTF=0; REPLACE_SQRTL=0; REPLACE_TANF=0; REPLACE_TANHF=0; REPLACE_TRUNC=0; REPLACE_TRUNCF=0; REPLACE_TRUNCL=0; saved_as_echo_n="$as_echo_n" as_echo_n=':' if ${gl_cv_func_floor_libm+:} false; then : $as_echo_n "(cached) " >&6 else gl_cv_func_floor_libm=? cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifndef __NO_MATH_INLINES # define __NO_MATH_INLINES 1 /* for glibc */ #endif #include double (*funcptr) (double) = floor; double x; int main () { x = funcptr(x) + floor(x); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : gl_cv_func_floor_libm= fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test "$gl_cv_func_floor_libm" = "?"; then save_LIBS="$LIBS" LIBS="$LIBS -lm" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifndef __NO_MATH_INLINES # define __NO_MATH_INLINES 1 /* for glibc */ #endif #include double (*funcptr) (double) = floor; double x; int main () { x = funcptr(x) + floor(x); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : gl_cv_func_floor_libm="-lm" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS="$save_LIBS" fi fi as_echo_n="$saved_as_echo_n" FLOOR_LIBM="$gl_cv_func_floor_libm" if test "$FLOOR_LIBM" = "?"; then FLOOR_LIBM= fi if test $REPLACE_FLOOR = 1; then FLOOR_LIBM= fi GNULIB_DPRINTF=0; GNULIB_FCLOSE=0; GNULIB_FDOPEN=0; GNULIB_FFLUSH=0; GNULIB_FGETC=0; GNULIB_FGETS=0; GNULIB_FOPEN=0; GNULIB_FPRINTF=0; GNULIB_FPRINTF_POSIX=0; GNULIB_FPURGE=0; GNULIB_FPUTC=0; GNULIB_FPUTS=0; GNULIB_FREAD=0; GNULIB_FREOPEN=0; GNULIB_FSCANF=0; GNULIB_FSEEK=0; GNULIB_FSEEKO=0; GNULIB_FTELL=0; GNULIB_FTELLO=0; GNULIB_FWRITE=0; GNULIB_GETC=0; GNULIB_GETCHAR=0; GNULIB_GETDELIM=0; GNULIB_GETLINE=0; GNULIB_OBSTACK_PRINTF=0; GNULIB_OBSTACK_PRINTF_POSIX=0; GNULIB_PCLOSE=0; GNULIB_PERROR=0; GNULIB_POPEN=0; GNULIB_PRINTF=0; GNULIB_PRINTF_POSIX=0; GNULIB_PUTC=0; GNULIB_PUTCHAR=0; GNULIB_PUTS=0; GNULIB_REMOVE=0; GNULIB_RENAME=0; GNULIB_RENAMEAT=0; GNULIB_SCANF=0; GNULIB_SNPRINTF=0; GNULIB_SPRINTF_POSIX=0; GNULIB_STDIO_H_NONBLOCKING=0; GNULIB_STDIO_H_SIGPIPE=0; GNULIB_TMPFILE=0; GNULIB_VASPRINTF=0; GNULIB_VFSCANF=0; GNULIB_VSCANF=0; GNULIB_VDPRINTF=0; GNULIB_VFPRINTF=0; GNULIB_VFPRINTF_POSIX=0; GNULIB_VPRINTF=0; GNULIB_VPRINTF_POSIX=0; GNULIB_VSNPRINTF=0; GNULIB_VSPRINTF_POSIX=0; HAVE_DECL_FPURGE=1; HAVE_DECL_FSEEKO=1; HAVE_DECL_FTELLO=1; HAVE_DECL_GETDELIM=1; HAVE_DECL_GETLINE=1; HAVE_DECL_OBSTACK_PRINTF=1; HAVE_DECL_SNPRINTF=1; HAVE_DECL_VSNPRINTF=1; HAVE_DPRINTF=1; HAVE_FSEEKO=1; HAVE_FTELLO=1; HAVE_PCLOSE=1; HAVE_POPEN=1; HAVE_RENAMEAT=1; HAVE_VASPRINTF=1; HAVE_VDPRINTF=1; REPLACE_DPRINTF=0; REPLACE_FCLOSE=0; REPLACE_FDOPEN=0; REPLACE_FFLUSH=0; REPLACE_FOPEN=0; REPLACE_FPRINTF=0; REPLACE_FPURGE=0; REPLACE_FREOPEN=0; REPLACE_FSEEK=0; REPLACE_FSEEKO=0; REPLACE_FTELL=0; REPLACE_FTELLO=0; REPLACE_GETDELIM=0; REPLACE_GETLINE=0; REPLACE_OBSTACK_PRINTF=0; REPLACE_PERROR=0; REPLACE_POPEN=0; REPLACE_PRINTF=0; REPLACE_REMOVE=0; REPLACE_RENAME=0; REPLACE_RENAMEAT=0; REPLACE_SNPRINTF=0; REPLACE_SPRINTF=0; REPLACE_STDIO_READ_FUNCS=0; REPLACE_STDIO_WRITE_FUNCS=0; REPLACE_TMPFILE=0; REPLACE_VASPRINTF=0; REPLACE_VDPRINTF=0; REPLACE_VFPRINTF=0; REPLACE_VPRINTF=0; REPLACE_VSNPRINTF=0; REPLACE_VSPRINTF=0; { $as_echo "$as_me:${as_lineno-$LINENO}: checking for stdint.h" >&5 $as_echo_n "checking for stdint.h... " >&6; } if ${gl_cv_header_stdint_h+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { uintmax_t i = (uintmax_t) -1; return !i; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : gl_cv_header_stdint_h=yes else gl_cv_header_stdint_h=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_stdint_h" >&5 $as_echo "$gl_cv_header_stdint_h" >&6; } if test $gl_cv_header_stdint_h = yes; then cat >>confdefs.h <<_ACEOF #define HAVE_STDINT_H_WITH_UINTMAX 1 _ACEOF fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for inttypes.h" >&5 $as_echo_n "checking for inttypes.h... " >&6; } if ${gl_cv_header_inttypes_h+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { uintmax_t i = (uintmax_t) -1; return !i; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : gl_cv_header_inttypes_h=yes else gl_cv_header_inttypes_h=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_inttypes_h" >&5 $as_echo "$gl_cv_header_inttypes_h" >&6; } if test $gl_cv_header_inttypes_h = yes; then cat >>confdefs.h <<_ACEOF #define HAVE_INTTYPES_H_WITH_UINTMAX 1 _ACEOF fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether printf supports size specifiers as in C99" >&5 $as_echo_n "checking whether printf supports size specifiers as in C99... " >&6; } if ${gl_cv_func_printf_sizes_c99+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : case "$host_os" in # Guess yes on glibc systems. *-gnu* | gnu*) gl_cv_func_printf_sizes_c99="guessing yes";; # Guess yes on musl systems. *-musl*) gl_cv_func_printf_sizes_c99="guessing yes";; # Guess yes on FreeBSD >= 5. freebsd[1-4].*) gl_cv_func_printf_sizes_c99="guessing no";; freebsd* | kfreebsd*) gl_cv_func_printf_sizes_c99="guessing yes";; # Guess yes on Mac OS X >= 10.3. darwin[1-6].*) gl_cv_func_printf_sizes_c99="guessing no";; darwin*) gl_cv_func_printf_sizes_c99="guessing yes";; # Guess yes on OpenBSD >= 3.9. openbsd[1-2].* | openbsd3.[0-8] | openbsd3.[0-8].*) gl_cv_func_printf_sizes_c99="guessing no";; openbsd*) gl_cv_func_printf_sizes_c99="guessing yes";; # Guess yes on Solaris >= 2.10. solaris2.[1-9][0-9]*) gl_cv_func_printf_sizes_c99="guessing yes";; solaris*) gl_cv_func_printf_sizes_c99="guessing no";; # Guess yes on NetBSD >= 3. netbsd[1-2]* | netbsdelf[1-2]* | netbsdaout[1-2]* | netbsdcoff[1-2]*) gl_cv_func_printf_sizes_c99="guessing no";; netbsd*) gl_cv_func_printf_sizes_c99="guessing yes";; # Guess yes on Android. linux*-android*) gl_cv_func_printf_sizes_c99="guessing yes";; # Guess yes on MSVC, no on mingw. mingw*) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef _MSC_VER Known #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "Known" >/dev/null 2>&1; then : gl_cv_func_printf_sizes_c99="guessing yes" else gl_cv_func_printf_sizes_c99="guessing no" fi rm -f conftest* ;; # If we don't know, obey --enable-cross-guesses. *) gl_cv_func_printf_sizes_c99="$gl_cross_guess_normal";; esac else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include #if HAVE_STDINT_H_WITH_UINTMAX # include #endif #if HAVE_INTTYPES_H_WITH_UINTMAX # include #endif static char buf[100]; int main () { int result = 0; #if HAVE_STDINT_H_WITH_UINTMAX || HAVE_INTTYPES_H_WITH_UINTMAX buf[0] = '\0'; if (sprintf (buf, "%ju %d", (uintmax_t) 12345671, 33, 44, 55) < 0 || strcmp (buf, "12345671 33") != 0) result |= 1; #else result |= 1; #endif buf[0] = '\0'; if (sprintf (buf, "%zu %d", (size_t) 12345672, 33, 44, 55) < 0 || strcmp (buf, "12345672 33") != 0) result |= 2; buf[0] = '\0'; if (sprintf (buf, "%tu %d", (ptrdiff_t) 12345673, 33, 44, 55) < 0 || strcmp (buf, "12345673 33") != 0) result |= 4; buf[0] = '\0'; if (sprintf (buf, "%Lg %d", (long double) 1.5, 33, 44, 55) < 0 || strcmp (buf, "1.5 33") != 0) result |= 8; return result; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : gl_cv_func_printf_sizes_c99=yes else gl_cv_func_printf_sizes_c99=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_printf_sizes_c99" >&5 $as_echo "$gl_cv_func_printf_sizes_c99" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether printf supports the 'n' directive" >&5 $as_echo_n "checking whether printf supports the 'n' directive... " >&6; } if ${gl_cv_func_printf_directive_n+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : case "$host_os" in # Guess no on glibc when _FORTIFY_SOURCE >= 2. *-gnu* | gnu*) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #if _FORTIFY_SOURCE >= 2 error fail #endif _ACEOF if ac_fn_c_try_compile "$LINENO"; then : gl_cv_func_printf_directive_n="guessing yes" else gl_cv_func_printf_directive_n="guessing no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ;; # Guess no on Android. linux*-android*) gl_cv_func_printf_directive_n="guessing no";; # Guess no on native Windows. mingw*) gl_cv_func_printf_directive_n="guessing no";; *) gl_cv_func_printf_directive_n="guessing yes";; esac else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #ifdef _MSC_VER #include /* See page about "Parameter Validation" on msdn.microsoft.com. */ static void cdecl invalid_parameter_handler (const wchar_t *expression, const wchar_t *function, const wchar_t *file, unsigned int line, uintptr_t dummy) { exit (1); } #endif static char fmtstring[10]; static char buf[100]; int main () { int count = -1; #ifdef _MSC_VER _set_invalid_parameter_handler (invalid_parameter_handler); #endif /* Copy the format string. Some systems (glibc with _FORTIFY_SOURCE=2) support %n in format strings in read-only memory but not in writable memory. */ strcpy (fmtstring, "%d %n"); if (sprintf (buf, fmtstring, 123, &count, 33, 44, 55) < 0 || strcmp (buf, "123 ") != 0 || count != 4) return 1; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : gl_cv_func_printf_directive_n=yes else gl_cv_func_printf_directive_n=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_printf_directive_n" >&5 $as_echo "$gl_cv_func_printf_directive_n" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether printf supports POSIX/XSI format strings with positions" >&5 $as_echo_n "checking whether printf supports POSIX/XSI format strings with positions... " >&6; } if ${gl_cv_func_printf_positions+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : case "$host_os" in netbsd[1-3]* | netbsdelf[1-3]* | netbsdaout[1-3]* | netbsdcoff[1-3]*) gl_cv_func_printf_positions="guessing no";; beos*) gl_cv_func_printf_positions="guessing no";; # Guess yes on Android. linux*-android*) gl_cv_func_printf_positions="guessing yes";; # Guess no on native Windows. mingw* | pw*) gl_cv_func_printf_positions="guessing no";; *) gl_cv_func_printf_positions="guessing yes";; esac else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include /* The string "%2$d %1$d", with dollar characters protected from the shell's dollar expansion (possibly an autoconf bug). */ static char format[] = { '%', '2', '$', 'd', ' ', '%', '1', '$', 'd', '\0' }; static char buf[100]; int main () { sprintf (buf, format, 33, 55); return (strcmp (buf, "55 33") != 0); } _ACEOF if ac_fn_c_try_run "$LINENO"; then : gl_cv_func_printf_positions=yes else gl_cv_func_printf_positions=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_printf_positions" >&5 $as_echo "$gl_cv_func_printf_positions" >&6; } if test $ac_cv_header_features_h = yes; then HAVE_FEATURES_H=1 else HAVE_FEATURES_H=0 fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for intmax_t" >&5 $as_echo_n "checking for intmax_t... " >&6; } if ${gt_cv_c_intmax_t+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if HAVE_STDINT_H_WITH_UINTMAX #include #endif #if HAVE_INTTYPES_H_WITH_UINTMAX #include #endif int main () { intmax_t x = -1; return !x; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : gt_cv_c_intmax_t=yes else gt_cv_c_intmax_t=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_c_intmax_t" >&5 $as_echo "$gt_cv_c_intmax_t" >&6; } if test $gt_cv_c_intmax_t = yes; then $as_echo "#define HAVE_INTMAX_T 1" >>confdefs.h else cat >>confdefs.h <<_ACEOF #define intmax_t long long _ACEOF fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether frexp() can be used without linking with libm" >&5 $as_echo_n "checking whether frexp() can be used without linking with libm... " >&6; } if ${gl_cv_func_frexp_no_libm+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include double x; int main () { int e; return frexp (x, &e) > 0; ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : gl_cv_func_frexp_no_libm=yes else gl_cv_func_frexp_no_libm=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_frexp_no_libm" >&5 $as_echo "$gl_cv_func_frexp_no_libm" >&6; } ac_fn_c_check_decl "$LINENO" "alarm" "ac_cv_have_decl_alarm" "$ac_includes_default" if test "x$ac_cv_have_decl_alarm" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_ALARM $ac_have_decl _ACEOF { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stdin defaults to large file offsets" >&5 $as_echo_n "checking whether stdin defaults to large file offsets... " >&6; } if ${gl_cv_var_stdin_large_offset+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { #if defined __SL64 && defined __SCLE /* cygwin */ /* Cygwin 1.5.24 and earlier fail to put stdin in 64-bit mode, making fseeko/ftello needlessly fail. This bug was fixed in 1.5.25, and it is easier to do a version check than building a runtime test. */ # include # if CYGWIN_VERSION_DLL_COMBINED < CYGWIN_VERSION_DLL_MAKE_COMBINED (1005, 25) choke me # endif #endif ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : gl_cv_var_stdin_large_offset=yes else gl_cv_var_stdin_large_offset=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_var_stdin_large_offset" >&5 $as_echo "$gl_cv_var_stdin_large_offset" >&6; } case "$host_os" in mingw*) { $as_echo "$as_me:${as_lineno-$LINENO}: checking for 64-bit off_t" >&5 $as_echo_n "checking for 64-bit off_t... " >&6; } if ${gl_cv_type_off_t_64+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int verify_off_t_size[sizeof (off_t) >= 8 ? 1 : -1]; int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : gl_cv_type_off_t_64=yes else gl_cv_type_off_t_64=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_type_off_t_64" >&5 $as_echo "$gl_cv_type_off_t_64" >&6; } if test $gl_cv_type_off_t_64 = no; then WINDOWS_64_BIT_OFF_T=1 else WINDOWS_64_BIT_OFF_T=0 fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for 64-bit st_size" >&5 $as_echo_n "checking for 64-bit st_size... " >&6; } if ${gl_cv_member_st_size_64+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include struct stat buf; int verify_st_size_size[sizeof (buf.st_size) >= 8 ? 1 : -1]; int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : gl_cv_member_st_size_64=yes else gl_cv_member_st_size_64=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_member_st_size_64" >&5 $as_echo "$gl_cv_member_st_size_64" >&6; } if test $gl_cv_member_st_size_64 = no; then WINDOWS_64_BIT_ST_SIZE=1 else WINDOWS_64_BIT_ST_SIZE=0 fi ;; *) WINDOWS_64_BIT_OFF_T=0 WINDOWS_64_BIT_ST_SIZE=0 ;; esac $as_echo "#define _USE_STD_STAT 1" >>confdefs.h if test $gl_cv_have_include_next = yes; then gl_cv_next_sys_types_h='<'sys/types.h'>' else { $as_echo "$as_me:${as_lineno-$LINENO}: checking absolute name of " >&5 $as_echo_n "checking absolute name of ... " >&6; } if ${gl_cv_next_sys_types_h+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF case "$host_os" in aix*) gl_absname_cpp="$ac_cpp -C" ;; *) gl_absname_cpp="$ac_cpp" ;; esac case "$host_os" in mingw*) gl_dirsep_regex='[/\\]' ;; *) gl_dirsep_regex='\/' ;; esac gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g' gl_header_literal_regex=`echo 'sys/types.h' \ | sed -e "$gl_make_literal_regex_sed"` gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{ s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/ s|^/[^/]|//&| p q }' gl_cv_absolute_sys_types_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 | sed -n "$gl_absolute_header_sed"` gl_header=$gl_cv_absolute_sys_types_h gl_cv_next_sys_types_h='"'$gl_header'"' fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_sys_types_h" >&5 $as_echo "$gl_cv_next_sys_types_h" >&6; } fi NEXT_SYS_TYPES_H=$gl_cv_next_sys_types_h if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next' gl_next_as_first_directive='<'sys/types.h'>' else # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include' gl_next_as_first_directive=$gl_cv_next_sys_types_h fi NEXT_AS_FIRST_DIRECTIVE_SYS_TYPES_H=$gl_next_as_first_directive WINDOWS_STAT_INODES=0 ac_fn_c_check_decl "$LINENO" "fseeko" "ac_cv_have_decl_fseeko" "$ac_includes_default" if test "x$ac_cv_have_decl_fseeko" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_FSEEKO $ac_have_decl _ACEOF { $as_echo "$as_me:${as_lineno-$LINENO}: checking for fseeko" >&5 $as_echo_n "checking for fseeko... " >&6; } if ${gl_cv_func_fseeko+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { fseeko (stdin, 0, 0); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : gl_cv_func_fseeko=yes else gl_cv_func_fseeko=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_fseeko" >&5 $as_echo "$gl_cv_func_fseeko" >&6; } if test $ac_cv_have_decl_fseeko = no; then HAVE_DECL_FSEEKO=0 fi if test $gl_cv_func_fseeko = no; then HAVE_FSEEKO=0 else if test $WINDOWS_64_BIT_OFF_T = 1; then REPLACE_FSEEKO=1 fi if test $gl_cv_var_stdin_large_offset = no; then REPLACE_FSEEKO=1 fi fi GNULIB_FCHMODAT=0; GNULIB_FSTAT=0; GNULIB_FSTATAT=0; GNULIB_FUTIMENS=0; GNULIB_GETUMASK=0; GNULIB_LCHMOD=0; GNULIB_LSTAT=0; GNULIB_MKDIRAT=0; GNULIB_MKFIFO=0; GNULIB_MKFIFOAT=0; GNULIB_MKNOD=0; GNULIB_MKNODAT=0; GNULIB_STAT=0; GNULIB_UTIMENSAT=0; GNULIB_OVERRIDES_STRUCT_STAT=0; HAVE_FCHMODAT=1; HAVE_FSTATAT=1; HAVE_FUTIMENS=1; HAVE_GETUMASK=1; HAVE_LCHMOD=1; HAVE_LSTAT=1; HAVE_MKDIRAT=1; HAVE_MKFIFO=1; HAVE_MKFIFOAT=1; HAVE_MKNOD=1; HAVE_MKNODAT=1; HAVE_UTIMENSAT=1; REPLACE_FCHMODAT=0; REPLACE_FSTAT=0; REPLACE_FSTATAT=0; REPLACE_FUTIMENS=0; REPLACE_LSTAT=0; REPLACE_MKDIR=0; REPLACE_MKFIFO=0; REPLACE_MKNOD=0; REPLACE_STAT=0; REPLACE_UTIMENSAT=0; { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stat file-mode macros are broken" >&5 $as_echo_n "checking whether stat file-mode macros are broken... " >&6; } if ${ac_cv_header_stat_broken+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if defined S_ISBLK && defined S_IFDIR extern char c1[S_ISBLK (S_IFDIR) ? -1 : 1]; #endif #if defined S_ISBLK && defined S_IFCHR extern char c2[S_ISBLK (S_IFCHR) ? -1 : 1]; #endif #if defined S_ISLNK && defined S_IFREG extern char c3[S_ISLNK (S_IFREG) ? -1 : 1]; #endif #if defined S_ISSOCK && defined S_IFREG extern char c4[S_ISSOCK (S_IFREG) ? -1 : 1]; #endif _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stat_broken=no else ac_cv_header_stat_broken=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stat_broken" >&5 $as_echo "$ac_cv_header_stat_broken" >&6; } if test $ac_cv_header_stat_broken = yes; then $as_echo "#define STAT_MACROS_BROKEN 1" >>confdefs.h fi if test $gl_cv_have_include_next = yes; then gl_cv_next_sys_stat_h='<'sys/stat.h'>' else { $as_echo "$as_me:${as_lineno-$LINENO}: checking absolute name of " >&5 $as_echo_n "checking absolute name of ... " >&6; } if ${gl_cv_next_sys_stat_h+:} false; then : $as_echo_n "(cached) " >&6 else if test $ac_cv_header_sys_stat_h = yes; then cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF case "$host_os" in aix*) gl_absname_cpp="$ac_cpp -C" ;; *) gl_absname_cpp="$ac_cpp" ;; esac case "$host_os" in mingw*) gl_dirsep_regex='[/\\]' ;; *) gl_dirsep_regex='\/' ;; esac gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g' gl_header_literal_regex=`echo 'sys/stat.h' \ | sed -e "$gl_make_literal_regex_sed"` gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{ s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/ s|^/[^/]|//&| p q }' gl_cv_absolute_sys_stat_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 | sed -n "$gl_absolute_header_sed"` gl_header=$gl_cv_absolute_sys_stat_h gl_cv_next_sys_stat_h='"'$gl_header'"' else gl_cv_next_sys_stat_h='<'sys/stat.h'>' fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_sys_stat_h" >&5 $as_echo "$gl_cv_next_sys_stat_h" >&6; } fi NEXT_SYS_STAT_H=$gl_cv_next_sys_stat_h if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next' gl_next_as_first_directive='<'sys/stat.h'>' else # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include' gl_next_as_first_directive=$gl_cv_next_sys_stat_h fi NEXT_AS_FIRST_DIRECTIVE_SYS_STAT_H=$gl_next_as_first_directive WINDOWS_STAT_TIMESPEC=0 ac_fn_c_check_type "$LINENO" "nlink_t" "ac_cv_type_nlink_t" "#include #include " if test "x$ac_cv_type_nlink_t" = xyes; then : else $as_echo "#define nlink_t int" >>confdefs.h fi ac_fn_c_check_decl "$LINENO" "ftello" "ac_cv_have_decl_ftello" "$ac_includes_default" if test "x$ac_cv_have_decl_ftello" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_FTELLO $ac_have_decl _ACEOF if test $ac_cv_have_decl_ftello = no; then HAVE_DECL_FTELLO=0 fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ftello" >&5 $as_echo_n "checking for ftello... " >&6; } if ${gl_cv_func_ftello+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { ftello (stdin); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : gl_cv_func_ftello=yes else gl_cv_func_ftello=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_ftello" >&5 $as_echo "$gl_cv_func_ftello" >&6; } if test $gl_cv_func_ftello = no; then HAVE_FTELLO=0 else if test $WINDOWS_64_BIT_OFF_T = 1; then REPLACE_FTELLO=1 fi if test $gl_cv_var_stdin_large_offset = no; then REPLACE_FTELLO=1 fi if test $REPLACE_FTELLO = 0; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ftello works" >&5 $as_echo_n "checking whether ftello works... " >&6; } if ${gl_cv_func_ftello_works+:} false; then : $as_echo_n "(cached) " >&6 else case "$host_os" in # Guess no on Solaris. solaris*) gl_cv_func_ftello_works="guessing no" ;; # Guess yes on native Windows. mingw*) gl_cv_func_ftello_works="guessing yes" ;; # Guess yes otherwise. *) gl_cv_func_ftello_works="guessing yes" ;; esac if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #define TESTFILE "conftest.tmp" int main (void) { FILE *fp; /* Create a file with some contents. */ fp = fopen (TESTFILE, "w"); if (fp == NULL) return 70; if (fwrite ("foogarsh", 1, 8, fp) < 8) { fclose (fp); return 71; } if (fclose (fp)) return 72; /* The file's contents is now "foogarsh". */ /* Try writing after reading to EOF. */ fp = fopen (TESTFILE, "r+"); if (fp == NULL) return 73; if (fseek (fp, -1, SEEK_END)) { fclose (fp); return 74; } if (!(getc (fp) == 'h')) { fclose (fp); return 1; } if (!(getc (fp) == EOF)) { fclose (fp); return 2; } if (!(ftell (fp) == 8)) { fclose (fp); return 3; } if (!(ftell (fp) == 8)) { fclose (fp); return 4; } if (!(putc ('!', fp) == '!')) { fclose (fp); return 5; } if (!(ftell (fp) == 9)) { fclose (fp); return 6; } if (!(fclose (fp) == 0)) return 7; fp = fopen (TESTFILE, "r"); if (fp == NULL) return 75; { char buf[10]; if (!(fread (buf, 1, 10, fp) == 9)) { fclose (fp); return 10; } if (!(memcmp (buf, "foogarsh!", 9) == 0)) { fclose (fp); return 11; } } if (!(fclose (fp) == 0)) return 12; /* The file's contents is now "foogarsh!". */ return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : gl_cv_func_ftello_works=yes else gl_cv_func_ftello_works=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_ftello_works" >&5 $as_echo "$gl_cv_func_ftello_works" >&6; } case "$gl_cv_func_ftello_works" in *yes) ;; *) REPLACE_FTELLO=1 $as_echo "#define FTELLO_BROKEN_AFTER_SWITCHING_FROM_READ_TO_WRITE 1" >>confdefs.h ;; esac fi fi ac_fn_c_check_decl "$LINENO" "getdelim" "ac_cv_have_decl_getdelim" "$ac_includes_default" if test "x$ac_cv_have_decl_getdelim" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_GETDELIM $ac_have_decl _ACEOF ac_fn_c_check_decl "$LINENO" "getdtablesize" "ac_cv_have_decl_getdtablesize" "$ac_includes_default" if test "x$ac_cv_have_decl_getdtablesize" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_GETDTABLESIZE $ac_have_decl _ACEOF ac_fn_c_check_decl "$LINENO" "getline" "ac_cv_have_decl_getline" "$ac_includes_default" if test "x$ac_cv_have_decl_getline" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_GETLINE $ac_have_decl _ACEOF if test $gl_cv_have_include_next = yes; then gl_cv_next_getopt_h='<'getopt.h'>' else { $as_echo "$as_me:${as_lineno-$LINENO}: checking absolute name of " >&5 $as_echo_n "checking absolute name of ... " >&6; } if ${gl_cv_next_getopt_h+:} false; then : $as_echo_n "(cached) " >&6 else if test $ac_cv_header_getopt_h = yes; then cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF case "$host_os" in aix*) gl_absname_cpp="$ac_cpp -C" ;; *) gl_absname_cpp="$ac_cpp" ;; esac case "$host_os" in mingw*) gl_dirsep_regex='[/\\]' ;; *) gl_dirsep_regex='\/' ;; esac gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g' gl_header_literal_regex=`echo 'getopt.h' \ | sed -e "$gl_make_literal_regex_sed"` gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{ s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/ s|^/[^/]|//&| p q }' gl_cv_absolute_getopt_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 | sed -n "$gl_absolute_header_sed"` gl_header=$gl_cv_absolute_getopt_h gl_cv_next_getopt_h='"'$gl_header'"' else gl_cv_next_getopt_h='<'getopt.h'>' fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_getopt_h" >&5 $as_echo "$gl_cv_next_getopt_h" >&6; } fi NEXT_GETOPT_H=$gl_cv_next_getopt_h if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next' gl_next_as_first_directive='<'getopt.h'>' else # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include' gl_next_as_first_directive=$gl_cv_next_getopt_h fi NEXT_AS_FIRST_DIRECTIVE_GETOPT_H=$gl_next_as_first_directive if test $ac_cv_header_getopt_h = yes; then HAVE_GETOPT_H=1 else HAVE_GETOPT_H=0 fi gl_replace_getopt= if test -z "$gl_replace_getopt" && test $gl_getopt_required = GNU; then for ac_header in getopt.h do : ac_fn_c_check_header_mongrel "$LINENO" "getopt.h" "ac_cv_header_getopt_h" "$ac_includes_default" if test "x$ac_cv_header_getopt_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_GETOPT_H 1 _ACEOF else gl_replace_getopt=yes fi done fi if test -z "$gl_replace_getopt" && test $gl_getopt_required = GNU; then for ac_func in getopt_long_only do : ac_fn_c_check_func "$LINENO" "getopt_long_only" "ac_cv_func_getopt_long_only" if test "x$ac_cv_func_getopt_long_only" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_GETOPT_LONG_ONLY 1 _ACEOF else gl_replace_getopt=yes fi done fi if test -z "$gl_replace_getopt"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether getopt is POSIX compatible" >&5 $as_echo_n "checking whether getopt is POSIX compatible... " >&6; } if ${gl_cv_func_getopt_posix+:} false; then : $as_echo_n "(cached) " >&6 else if test $cross_compiling = no; then if test "$cross_compiling" = yes; then : { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot run test program while cross compiling See \`config.log' for more details" "$LINENO" 5; } else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include int main () { static char program[] = "program"; static char a[] = "-a"; static char foo[] = "foo"; static char bar[] = "bar"; char *argv[] = { program, a, foo, bar, NULL }; int c; c = getopt (4, argv, "ab"); if (!(c == 'a')) return 1; c = getopt (4, argv, "ab"); if (!(c == -1)) return 2; if (!(optind == 2)) return 3; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : gl_cv_func_getopt_posix=maybe else gl_cv_func_getopt_posix=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi if test $gl_cv_func_getopt_posix = maybe; then if test "$cross_compiling" = yes; then : { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot run test program while cross compiling See \`config.log' for more details" "$LINENO" 5; } else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include int main () { static char program[] = "program"; static char donald[] = "donald"; static char p[] = "-p"; static char billy[] = "billy"; static char duck[] = "duck"; static char a[] = "-a"; static char bar[] = "bar"; char *argv[] = { program, donald, p, billy, duck, a, bar, NULL }; int c; c = getopt (7, argv, "+abp:q:"); if (!(c == -1)) return 4; if (!(strcmp (argv[0], "program") == 0)) return 5; if (!(strcmp (argv[1], "donald") == 0)) return 6; if (!(strcmp (argv[2], "-p") == 0)) return 7; if (!(strcmp (argv[3], "billy") == 0)) return 8; if (!(strcmp (argv[4], "duck") == 0)) return 9; if (!(strcmp (argv[5], "-a") == 0)) return 10; if (!(strcmp (argv[6], "bar") == 0)) return 11; if (!(optind == 1)) return 12; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : gl_cv_func_getopt_posix=maybe else gl_cv_func_getopt_posix=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi if test $gl_cv_func_getopt_posix = maybe; then if test "$cross_compiling" = yes; then : { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot run test program while cross compiling See \`config.log' for more details" "$LINENO" 5; } else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include int main () { static char program[] = "program"; static char ab[] = "-ab"; char *argv[3] = { program, ab, NULL }; if (getopt (2, argv, "ab:") != 'a') return 13; if (getopt (2, argv, "ab:") != '?') return 14; if (optopt != 'b') return 15; if (optind != 2) return 16; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : gl_cv_func_getopt_posix=yes else gl_cv_func_getopt_posix=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi else case "$host_os" in darwin* | aix* | mingw*) gl_cv_func_getopt_posix="guessing no";; *) gl_cv_func_getopt_posix="guessing yes";; esac fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_getopt_posix" >&5 $as_echo "$gl_cv_func_getopt_posix" >&6; } case "$gl_cv_func_getopt_posix" in *no) gl_replace_getopt=yes ;; esac fi if test -z "$gl_replace_getopt" && test $gl_getopt_required = GNU; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working GNU getopt function" >&5 $as_echo_n "checking for working GNU getopt function... " >&6; } if ${gl_cv_func_getopt_gnu+:} false; then : $as_echo_n "(cached) " >&6 else # Even with POSIXLY_CORRECT, the GNU extension of leading '-' in the # optstring is necessary for programs like m4 that have POSIX-mandated # semantics for supporting options interspersed with files. # Also, since getopt_long is a GNU extension, we require optind=0. # Bash ties 'set -o posix' to a non-exported POSIXLY_CORRECT; # so take care to revert to the correct (non-)export state. gl_awk_probe='BEGIN { if ("POSIXLY_CORRECT" in ENVIRON) print "x" }' case ${POSIXLY_CORRECT+x}`$AWK "$gl_awk_probe" conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include #if defined __MACH__ && defined __APPLE__ /* Avoid a crash on Mac OS X. */ #include #include #include #include #include #include /* The exception port on which our thread listens. */ static mach_port_t our_exception_port; /* The main function of the thread listening for exceptions of type EXC_BAD_ACCESS. */ static void * mach_exception_thread (void *arg) { /* Buffer for a message to be received. */ struct { mach_msg_header_t head; mach_msg_body_t msgh_body; char data[1024]; } msg; mach_msg_return_t retval; /* Wait for a message on the exception port. */ retval = mach_msg (&msg.head, MACH_RCV_MSG | MACH_RCV_LARGE, 0, sizeof (msg), our_exception_port, MACH_MSG_TIMEOUT_NONE, MACH_PORT_NULL); if (retval != MACH_MSG_SUCCESS) abort (); exit (1); } static void nocrash_init (void) { mach_port_t self = mach_task_self (); /* Allocate a port on which the thread shall listen for exceptions. */ if (mach_port_allocate (self, MACH_PORT_RIGHT_RECEIVE, &our_exception_port) == KERN_SUCCESS) { /* See https://web.mit.edu/darwin/src/modules/xnu/osfmk/man/mach_port_insert_right.html. */ if (mach_port_insert_right (self, our_exception_port, our_exception_port, MACH_MSG_TYPE_MAKE_SEND) == KERN_SUCCESS) { /* The exceptions we want to catch. Only EXC_BAD_ACCESS is interesting for us. */ exception_mask_t mask = EXC_MASK_BAD_ACCESS; /* Create the thread listening on the exception port. */ pthread_attr_t attr; pthread_t thread; if (pthread_attr_init (&attr) == 0 && pthread_attr_setdetachstate (&attr, PTHREAD_CREATE_DETACHED) == 0 && pthread_create (&thread, &attr, mach_exception_thread, NULL) == 0) { pthread_attr_destroy (&attr); /* Replace the exception port info for these exceptions with our own. Note that we replace the exception port for the entire task, not only for a particular thread. This has the effect that when our exception port gets the message, the thread specific exception port has already been asked, and we don't need to bother about it. See https://web.mit.edu/darwin/src/modules/xnu/osfmk/man/task_set_exception_ports.html. */ task_set_exception_ports (self, mask, our_exception_port, EXCEPTION_DEFAULT, MACHINE_THREAD_STATE); } } } } #elif defined _WIN32 && ! defined __CYGWIN__ /* Avoid a crash on native Windows. */ #define WIN32_LEAN_AND_MEAN #include #include static LONG WINAPI exception_filter (EXCEPTION_POINTERS *ExceptionInfo) { switch (ExceptionInfo->ExceptionRecord->ExceptionCode) { case EXCEPTION_ACCESS_VIOLATION: case EXCEPTION_IN_PAGE_ERROR: case EXCEPTION_STACK_OVERFLOW: case EXCEPTION_GUARD_PAGE: case EXCEPTION_PRIV_INSTRUCTION: case EXCEPTION_ILLEGAL_INSTRUCTION: case EXCEPTION_DATATYPE_MISALIGNMENT: case EXCEPTION_ARRAY_BOUNDS_EXCEEDED: case EXCEPTION_NONCONTINUABLE_EXCEPTION: exit (1); } return EXCEPTION_CONTINUE_SEARCH; } static void nocrash_init (void) { SetUnhandledExceptionFilter ((LPTOP_LEVEL_EXCEPTION_FILTER) exception_filter); } #else /* Avoid a crash on POSIX systems. */ #include #include /* A POSIX signal handler. */ static void exception_handler (int sig) { _exit (1); } static void nocrash_init (void) { #ifdef SIGSEGV signal (SIGSEGV, exception_handler); #endif #ifdef SIGBUS signal (SIGBUS, exception_handler); #endif } #endif int main () { int result = 0; nocrash_init(); /* This code succeeds on glibc 2.8, OpenBSD 4.0, Cygwin, mingw, and fails on Mac OS X 10.5, AIX 5.2, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10. */ { static char conftest[] = "conftest"; static char plus[] = "-+"; char *argv[3] = { conftest, plus, NULL }; opterr = 0; if (getopt (2, argv, "+a") != '?') result |= 1; } /* This code succeeds on glibc 2.8, mingw, and fails on Mac OS X 10.5, OpenBSD 4.0, AIX 5.2, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin 1.5.x. */ { static char program[] = "program"; static char p[] = "-p"; static char foo[] = "foo"; static char bar[] = "bar"; char *argv[] = { program, p, foo, bar, NULL }; optind = 1; if (getopt (4, argv, "p::") != 'p') result |= 2; else if (optarg != NULL) result |= 4; else if (getopt (4, argv, "p::") != -1) result |= 6; else if (optind != 2) result |= 8; } /* This code succeeds on glibc 2.8 and fails on Cygwin 1.7.0. */ { static char program[] = "program"; static char foo[] = "foo"; static char p[] = "-p"; char *argv[] = { program, foo, p, NULL }; optind = 0; if (getopt (3, argv, "-p") != 1) result |= 16; else if (getopt (3, argv, "-p") != 'p') result |= 16; } /* This code fails on glibc 2.11. */ { static char program[] = "program"; static char b[] = "-b"; static char a[] = "-a"; char *argv[] = { program, b, a, NULL }; optind = opterr = 0; if (getopt (3, argv, "+:a:b") != 'b') result |= 32; else if (getopt (3, argv, "+:a:b") != ':') result |= 32; } /* This code dumps core on glibc 2.14. */ { static char program[] = "program"; static char w[] = "-W"; static char dummy[] = "dummy"; char *argv[] = { program, w, dummy, NULL }; optind = opterr = 1; if (getopt (3, argv, "W;") != 'W') result |= 64; } return result; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : gl_cv_func_getopt_gnu=yes else gl_cv_func_getopt_gnu=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi case $gl_had_POSIXLY_CORRECT in exported) ;; yes) { POSIXLY_CORRECT=; unset POSIXLY_CORRECT;}; POSIXLY_CORRECT=1 ;; *) { POSIXLY_CORRECT=; unset POSIXLY_CORRECT;} ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_getopt_gnu" >&5 $as_echo "$gl_cv_func_getopt_gnu" >&6; } if test "$gl_cv_func_getopt_gnu" != yes; then gl_replace_getopt=yes else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working GNU getopt_long function" >&5 $as_echo_n "checking for working GNU getopt_long function... " >&6; } if ${gl_cv_func_getopt_long_gnu+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : case "$host_os" in openbsd*) gl_cv_func_getopt_long_gnu="guessing no";; *) gl_cv_func_getopt_long_gnu="guessing yes";; esac else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include int main () { static const struct option long_options[] = { { "xtremely-",no_argument, NULL, 1003 }, { "xtra", no_argument, NULL, 1001 }, { "xtreme", no_argument, NULL, 1002 }, { "xtremely", no_argument, NULL, 1003 }, { NULL, 0, NULL, 0 } }; /* This code fails on OpenBSD 5.0. */ { static char program[] = "program"; static char xtremel[] = "--xtremel"; char *argv[] = { program, xtremel, NULL }; int option_index; optind = 1; opterr = 0; if (getopt_long (2, argv, "", long_options, &option_index) != 1003) return 1; } return 0; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : gl_cv_func_getopt_long_gnu=yes else gl_cv_func_getopt_long_gnu=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_getopt_long_gnu" >&5 $as_echo "$gl_cv_func_getopt_long_gnu" >&6; } case "$gl_cv_func_getopt_long_gnu" in *yes) ;; *) gl_replace_getopt=yes ;; esac fi fi if test $ac_cv_func_getpass = no; then HAVE_GETPASS=0 fi ac_fn_c_check_decl "$LINENO" "fflush_unlocked" "ac_cv_have_decl_fflush_unlocked" "$ac_includes_default" if test "x$ac_cv_have_decl_fflush_unlocked" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_FFLUSH_UNLOCKED $ac_have_decl _ACEOF ac_fn_c_check_decl "$LINENO" "flockfile" "ac_cv_have_decl_flockfile" "$ac_includes_default" if test "x$ac_cv_have_decl_flockfile" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_FLOCKFILE $ac_have_decl _ACEOF ac_fn_c_check_decl "$LINENO" "fputs_unlocked" "ac_cv_have_decl_fputs_unlocked" "$ac_includes_default" if test "x$ac_cv_have_decl_fputs_unlocked" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_FPUTS_UNLOCKED $ac_have_decl _ACEOF ac_fn_c_check_decl "$LINENO" "funlockfile" "ac_cv_have_decl_funlockfile" "$ac_includes_default" if test "x$ac_cv_have_decl_funlockfile" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_FUNLOCKFILE $ac_have_decl _ACEOF ac_fn_c_check_decl "$LINENO" "putc_unlocked" "ac_cv_have_decl_putc_unlocked" "$ac_includes_default" if test "x$ac_cv_have_decl_putc_unlocked" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_PUTC_UNLOCKED $ac_have_decl _ACEOF GNULIB_GETRANDOM=0; HAVE_GETRANDOM=1; REPLACE_GETRANDOM=0; : GNULIB_GETTIMEOFDAY=0; HAVE_GETTIMEOFDAY=1; HAVE_STRUCT_TIMEVAL=1; HAVE_SYS_TIME_H=1; REPLACE_GETTIMEOFDAY=0; REPLACE_STRUCT_TIMEVAL=0; if test $gl_cv_have_include_next = yes; then gl_cv_next_sys_time_h='<'sys/time.h'>' else { $as_echo "$as_me:${as_lineno-$LINENO}: checking absolute name of " >&5 $as_echo_n "checking absolute name of ... " >&6; } if ${gl_cv_next_sys_time_h+:} false; then : $as_echo_n "(cached) " >&6 else if test $ac_cv_header_sys_time_h = yes; then cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF case "$host_os" in aix*) gl_absname_cpp="$ac_cpp -C" ;; *) gl_absname_cpp="$ac_cpp" ;; esac case "$host_os" in mingw*) gl_dirsep_regex='[/\\]' ;; *) gl_dirsep_regex='\/' ;; esac gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g' gl_header_literal_regex=`echo 'sys/time.h' \ | sed -e "$gl_make_literal_regex_sed"` gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{ s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/ s|^/[^/]|//&| p q }' gl_cv_absolute_sys_time_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 | sed -n "$gl_absolute_header_sed"` gl_header=$gl_cv_absolute_sys_time_h gl_cv_next_sys_time_h='"'$gl_header'"' else gl_cv_next_sys_time_h='<'sys/time.h'>' fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_sys_time_h" >&5 $as_echo "$gl_cv_next_sys_time_h" >&6; } fi NEXT_SYS_TIME_H=$gl_cv_next_sys_time_h if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next' gl_next_as_first_directive='<'sys/time.h'>' else # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include' gl_next_as_first_directive=$gl_cv_next_sys_time_h fi NEXT_AS_FIRST_DIRECTIVE_SYS_TIME_H=$gl_next_as_first_directive if test $ac_cv_header_sys_time_h != yes; then HAVE_SYS_TIME_H=0 fi if test $ac_cv_header_sys_socket_h != yes; then for ac_header in winsock2.h do : ac_fn_c_check_header_mongrel "$LINENO" "winsock2.h" "ac_cv_header_winsock2_h" "$ac_includes_default" if test "x$ac_cv_header_winsock2_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_WINSOCK2_H 1 _ACEOF fi done fi if test "$ac_cv_header_winsock2_h" = yes; then HAVE_WINSOCK2_H=1 UNISTD_H_HAVE_WINSOCK2_H=1 SYS_IOCTL_H_HAVE_WINSOCK2_H=1 else HAVE_WINSOCK2_H=0 fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for struct timeval" >&5 $as_echo_n "checking for struct timeval... " >&6; } if ${gl_cv_sys_struct_timeval+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #if HAVE_SYS_TIME_H #include #endif #include #if HAVE_WINSOCK2_H # include #endif int main () { static struct timeval x; x.tv_sec = x.tv_usec; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : gl_cv_sys_struct_timeval=yes else gl_cv_sys_struct_timeval=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_sys_struct_timeval" >&5 $as_echo "$gl_cv_sys_struct_timeval" >&6; } if test $gl_cv_sys_struct_timeval != yes; then HAVE_STRUCT_TIMEVAL=0 else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for wide-enough struct timeval.tv_sec member" >&5 $as_echo_n "checking for wide-enough struct timeval.tv_sec member... " >&6; } if ${gl_cv_sys_struct_timeval_tv_sec+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #if HAVE_SYS_TIME_H #include #endif #include #if HAVE_WINSOCK2_H # include #endif int main () { static struct timeval x; typedef int verify_tv_sec_type[ sizeof (time_t) <= sizeof x.tv_sec ? 1 : -1 ]; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : gl_cv_sys_struct_timeval_tv_sec=yes else gl_cv_sys_struct_timeval_tv_sec=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_sys_struct_timeval_tv_sec" >&5 $as_echo "$gl_cv_sys_struct_timeval_tv_sec" >&6; } if test $gl_cv_sys_struct_timeval_tv_sec != yes; then REPLACE_STRUCT_TIMEVAL=1 fi fi if test -z "$gl_pthreadlib_body_done"; then gl_pthread_api=no LIBPTHREAD= LIBPMULTITHREAD= # On OSF/1, the compiler needs the flag -pthread or -D_REENTRANT so that # it groks . It's added above, in gl_ANYTHREADLIB_EARLY. ac_fn_c_check_header_mongrel "$LINENO" "pthread.h" "ac_cv_header_pthread_h" "$ac_includes_default" if test "x$ac_cv_header_pthread_h" = xyes; then : gl_have_pthread_h=yes else gl_have_pthread_h=no fi if test "$gl_have_pthread_h" = yes; then # Other possible tests: # -lpthreads (FSU threads, PCthreads) # -lgthreads # Test whether both pthread_mutex_lock and pthread_mutexattr_init exist # in libc. IRIX 6.5 has the first one in both libc and libpthread, but # the second one only in libpthread, and lock.c needs it. # # If -pthread works, prefer it to -lpthread, since Ubuntu 14.04 # needs -pthread for some reason. See: # https://lists.gnu.org/r/bug-gnulib/2014-09/msg00023.html save_LIBS=$LIBS for gl_pthread in '' '-pthread'; do LIBS="$LIBS $gl_pthread" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include pthread_mutex_t m; pthread_mutexattr_t ma; int main () { pthread_mutex_lock (&m); pthread_mutexattr_init (&ma); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : gl_pthread_api=yes LIBPTHREAD=$gl_pthread LIBPMULTITHREAD=$gl_pthread fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$save_LIBS test $gl_pthread_api = yes && break done # Test for libpthread by looking for pthread_kill. (Not pthread_self, # since it is defined as a macro on OSF/1.) if test $gl_pthread_api = yes && test -z "$LIBPTHREAD"; then # The program links fine without libpthread. But it may actually # need to link with libpthread in order to create multiple threads. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_kill in -lpthread" >&5 $as_echo_n "checking for pthread_kill in -lpthread... " >&6; } if ${ac_cv_lib_pthread_pthread_kill+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lpthread $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char pthread_kill (); int main () { return pthread_kill (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_pthread_pthread_kill=yes else ac_cv_lib_pthread_pthread_kill=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pthread_pthread_kill" >&5 $as_echo "$ac_cv_lib_pthread_pthread_kill" >&6; } if test "x$ac_cv_lib_pthread_pthread_kill" = xyes; then : LIBPMULTITHREAD=-lpthread # On Solaris and HP-UX, most pthread functions exist also in libc. # Therefore pthread_in_use() needs to actually try to create a # thread: pthread_create from libc will fail, whereas # pthread_create will actually create a thread. # On Solaris 10 or newer, this test is no longer needed, because # libc contains the fully functional pthread functions. case "$host_os" in solaris | solaris2.1-9 | solaris2.1-9.* | hpux*) $as_echo "#define PTHREAD_IN_USE_DETECTION_HARD 1" >>confdefs.h esac fi elif test $gl_pthread_api != yes; then # Some library is needed. Try libpthread and libc_r. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_kill in -lpthread" >&5 $as_echo_n "checking for pthread_kill in -lpthread... " >&6; } if ${ac_cv_lib_pthread_pthread_kill+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lpthread $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char pthread_kill (); int main () { return pthread_kill (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_pthread_pthread_kill=yes else ac_cv_lib_pthread_pthread_kill=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pthread_pthread_kill" >&5 $as_echo "$ac_cv_lib_pthread_pthread_kill" >&6; } if test "x$ac_cv_lib_pthread_pthread_kill" = xyes; then : gl_pthread_api=yes LIBPTHREAD=-lpthread LIBPMULTITHREAD=-lpthread fi if test $gl_pthread_api != yes; then # For FreeBSD 4. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_kill in -lc_r" >&5 $as_echo_n "checking for pthread_kill in -lc_r... " >&6; } if ${ac_cv_lib_c_r_pthread_kill+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lc_r $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char pthread_kill (); int main () { return pthread_kill (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_c_r_pthread_kill=yes else ac_cv_lib_c_r_pthread_kill=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_c_r_pthread_kill" >&5 $as_echo "$ac_cv_lib_c_r_pthread_kill" >&6; } if test "x$ac_cv_lib_c_r_pthread_kill" = xyes; then : gl_pthread_api=yes LIBPTHREAD=-lc_r LIBPMULTITHREAD=-lc_r fi fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether POSIX threads API is available" >&5 $as_echo_n "checking whether POSIX threads API is available... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_pthread_api" >&5 $as_echo "$gl_pthread_api" >&6; } if test $gl_pthread_api = yes; then $as_echo "#define HAVE_PTHREAD_API 1" >>confdefs.h fi cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { sched_yield (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : LIB_SCHED_YIELD= else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sched_yield in -lrt" >&5 $as_echo_n "checking for sched_yield in -lrt... " >&6; } if ${ac_cv_lib_rt_sched_yield+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lrt $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char sched_yield (); int main () { return sched_yield (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_rt_sched_yield=yes else ac_cv_lib_rt_sched_yield=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_rt_sched_yield" >&5 $as_echo "$ac_cv_lib_rt_sched_yield" >&6; } if test "x$ac_cv_lib_rt_sched_yield" = xyes; then : LIB_SCHED_YIELD=-lrt else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sched_yield in -lposix4" >&5 $as_echo_n "checking for sched_yield in -lposix4... " >&6; } if ${ac_cv_lib_posix4_sched_yield+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lposix4 $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char sched_yield (); int main () { return sched_yield (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_posix4_sched_yield=yes else ac_cv_lib_posix4_sched_yield=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_posix4_sched_yield" >&5 $as_echo "$ac_cv_lib_posix4_sched_yield" >&6; } if test "x$ac_cv_lib_posix4_sched_yield" = xyes; then : LIB_SCHED_YIELD=-lposix4 fi fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext gl_pthreadlib_body_done=done fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether setlocale (LC_ALL, NULL) is multithread-safe" >&5 $as_echo_n "checking whether setlocale (LC_ALL, NULL) is multithread-safe... " >&6; } if ${gl_cv_func_setlocale_null_all_mtsafe+:} false; then : $as_echo_n "(cached) " >&6 else case "$host_os" in # Guess no on musl libc, macOS, FreeBSD, NetBSD, OpenBSD, AIX, Haiku, Cygwin. *-musl* | darwin* | freebsd* | netbsd* | openbsd* | aix* | haiku* | cygwin*) gl_cv_func_setlocale_null_all_mtsafe=no ;; # Guess yes on glibc, HP-UX, IRIX, Solaris, native Windows. *-gnu* | gnu* | hpux* | irix* | solaris* | mingw*) gl_cv_func_setlocale_null_all_mtsafe=yes ;; # If we don't know, obey --enable-cross-guesses. *) gl_cv_func_setlocale_null_all_mtsafe="$gl_cross_guess_normal" ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_setlocale_null_all_mtsafe" >&5 $as_echo "$gl_cv_func_setlocale_null_all_mtsafe" >&6; } case "$host_os" in mingw*) ;; *) if test $gl_pthread_api = no && test $ac_cv_header_threads_h = no; then gl_cv_func_setlocale_null_all_mtsafe="trivially yes" fi ;; esac case "$gl_cv_func_setlocale_null_all_mtsafe" in *yes) SETLOCALE_NULL_ALL_MTSAFE=1 ;; *) SETLOCALE_NULL_ALL_MTSAFE=0 ;; esac cat >>confdefs.h <<_ACEOF #define SETLOCALE_NULL_ALL_MTSAFE $SETLOCALE_NULL_ALL_MTSAFE _ACEOF { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether setlocale (category, NULL) is multithread-safe" >&5 $as_echo_n "checking whether setlocale (category, NULL) is multithread-safe... " >&6; } if ${gl_cv_func_setlocale_null_one_mtsafe+:} false; then : $as_echo_n "(cached) " >&6 else case "$host_os" in # Guess no on OpenBSD, AIX. openbsd* | aix*) gl_cv_func_setlocale_null_one_mtsafe=no ;; # Guess yes on glibc, musl libc, macOS, FreeBSD, NetBSD, HP-UX, IRIX, Solaris, Haiku, Cygwin, native Windows. *-gnu* | gnu* | *-musl* | darwin* | freebsd* | netbsd* | hpux* | irix* | solaris* | haiku* | cygwin* | mingw*) gl_cv_func_setlocale_null_one_mtsafe=yes ;; # If we don't know, obey --enable-cross-guesses. *) gl_cv_func_setlocale_null_one_mtsafe="$gl_cross_guess_normal" ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_setlocale_null_one_mtsafe" >&5 $as_echo "$gl_cv_func_setlocale_null_one_mtsafe" >&6; } case "$host_os" in mingw*) ;; *) if test $gl_pthread_api = no && test $ac_cv_header_threads_h = no; then gl_cv_func_setlocale_null_one_mtsafe="trivially yes" fi ;; esac case "$gl_cv_func_setlocale_null_one_mtsafe" in *yes) SETLOCALE_NULL_ONE_MTSAFE=1 ;; *) SETLOCALE_NULL_ONE_MTSAFE=0 ;; esac cat >>confdefs.h <<_ACEOF #define SETLOCALE_NULL_ONE_MTSAFE $SETLOCALE_NULL_ONE_MTSAFE _ACEOF if test $SETLOCALE_NULL_ALL_MTSAFE = 0 || test $SETLOCALE_NULL_ONE_MTSAFE = 0; then case "$host_os" in mingw*) LIB_SETLOCALE_NULL= ;; *) { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether imported symbols can be declared weak" >&5 $as_echo_n "checking whether imported symbols can be declared weak... " >&6; } if ${gl_cv_have_weak+:} false; then : $as_echo_n "(cached) " >&6 else gl_cv_have_weak=no cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ extern void xyzzy (); #pragma weak xyzzy int main () { xyzzy(); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : gl_cv_have_weak=maybe fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test $gl_cv_have_weak = maybe; then if test "$cross_compiling" = yes; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __ELF__ Extensible Linking Format #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "Extensible Linking Format" >/dev/null 2>&1; then : gl_cv_have_weak="guessing yes" else gl_cv_have_weak="guessing no" fi rm -f conftest* else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #pragma weak fputs int main () { return (fputs == NULL); } _ACEOF if ac_fn_c_try_run "$LINENO"; then : gl_cv_have_weak=yes else gl_cv_have_weak=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi case " $LDFLAGS " in *" -static "*) gl_cv_have_weak=no ;; esac case "$gl_cv_have_weak" in *yes) case "$host_os" in freebsd* | dragonfly*) : > conftest1.c $CC $CPPFLAGS $CFLAGS $LDFLAGS -fPIC -shared -o libempty.so conftest1.c -lpthread >&5 2>&1 cat < conftest2.c #include #pragma weak pthread_mutexattr_gettype int main () { return (pthread_mutexattr_gettype != NULL); } EOF $CC $CPPFLAGS $CFLAGS $LDFLAGS -o conftest conftest2.c libempty.so >&5 2>&1 \ || gl_cv_have_weak=no rm -f conftest1.c libempty.so conftest2.c conftest ;; esac ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_have_weak" >&5 $as_echo "$gl_cv_have_weak" >&6; } case "$gl_cv_have_weak" in *yes) $as_echo "#define HAVE_WEAK_SYMBOLS 1" >>confdefs.h ;; esac case "$gl_cv_have_weak" in *yes) LIB_SETLOCALE_NULL= ;; *) LIB_SETLOCALE_NULL="$LIBPTHREAD" ;; esac ;; esac else LIB_SETLOCALE_NULL= fi ac_fn_c_check_type "$LINENO" "off_t" "ac_cv_type_off_t" "$ac_includes_default" if test "x$ac_cv_type_off_t" = xyes; then : else cat >>confdefs.h <<_ACEOF #define off_t long int _ACEOF fi if test $gl_cv_have_include_next = yes; then gl_cv_next_limits_h='<'limits.h'>' else { $as_echo "$as_me:${as_lineno-$LINENO}: checking absolute name of " >&5 $as_echo_n "checking absolute name of ... " >&6; } if ${gl_cv_next_limits_h+:} false; then : $as_echo_n "(cached) " >&6 else if test $ac_cv_header_limits_h = yes; then cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF case "$host_os" in aix*) gl_absname_cpp="$ac_cpp -C" ;; *) gl_absname_cpp="$ac_cpp" ;; esac case "$host_os" in mingw*) gl_dirsep_regex='[/\\]' ;; *) gl_dirsep_regex='\/' ;; esac gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g' gl_header_literal_regex=`echo 'limits.h' \ | sed -e "$gl_make_literal_regex_sed"` gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{ s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/ s|^/[^/]|//&| p q }' gl_cv_absolute_limits_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 | sed -n "$gl_absolute_header_sed"` gl_header=$gl_cv_absolute_limits_h gl_cv_next_limits_h='"'$gl_header'"' else gl_cv_next_limits_h='<'limits.h'>' fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_limits_h" >&5 $as_echo "$gl_cv_next_limits_h" >&6; } fi NEXT_LIMITS_H=$gl_cv_next_limits_h if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next' gl_next_as_first_directive='<'limits.h'>' else # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include' gl_next_as_first_directive=$gl_cv_next_limits_h fi NEXT_AS_FIRST_DIRECTIVE_LIMITS_H=$gl_next_as_first_directive { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether limits.h has LLONG_MAX, WORD_BIT, ULLONG_WIDTH etc." >&5 $as_echo_n "checking whether limits.h has LLONG_MAX, WORD_BIT, ULLONG_WIDTH etc.... " >&6; } if ${gl_cv_header_limits_width+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifndef __STDC_WANT_IEC_60559_BFP_EXT__ #define __STDC_WANT_IEC_60559_BFP_EXT__ 1 #endif #include long long llm = LLONG_MAX; int wb = WORD_BIT; int ullw = ULLONG_WIDTH; int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : gl_cv_header_limits_width=yes else gl_cv_header_limits_width=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_limits_width" >&5 $as_echo "$gl_cv_header_limits_width" >&6; } if test "$gl_cv_header_limits_width" = yes; then LIMITS_H= else LIMITS_H=limits.h fi if test -n "$LIMITS_H"; then GL_GENERATE_LIMITS_H_TRUE= GL_GENERATE_LIMITS_H_FALSE='#' else GL_GENERATE_LIMITS_H_TRUE='#' GL_GENERATE_LIMITS_H_FALSE= fi $as_echo "#define HAVE_LONG_LONG_INT 1" >>confdefs.h $as_echo "#define HAVE_UNSIGNED_LONG_LONG_INT 1" >>confdefs.h if test $ac_cv_header_wchar_h = yes; then HAVE_WCHAR_H=1 else HAVE_WCHAR_H=0 fi if test $ac_cv_header_inttypes_h = yes; then HAVE_INTTYPES_H=1 else HAVE_INTTYPES_H=0 fi if test $ac_cv_header_sys_types_h = yes; then HAVE_SYS_TYPES_H=1 else HAVE_SYS_TYPES_H=0 fi if test $gl_cv_have_include_next = yes; then gl_cv_next_stdint_h='<'stdint.h'>' else { $as_echo "$as_me:${as_lineno-$LINENO}: checking absolute name of " >&5 $as_echo_n "checking absolute name of ... " >&6; } if ${gl_cv_next_stdint_h+:} false; then : $as_echo_n "(cached) " >&6 else if test $ac_cv_header_stdint_h = yes; then cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF case "$host_os" in aix*) gl_absname_cpp="$ac_cpp -C" ;; *) gl_absname_cpp="$ac_cpp" ;; esac case "$host_os" in mingw*) gl_dirsep_regex='[/\\]' ;; *) gl_dirsep_regex='\/' ;; esac gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g' gl_header_literal_regex=`echo 'stdint.h' \ | sed -e "$gl_make_literal_regex_sed"` gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{ s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/ s|^/[^/]|//&| p q }' gl_cv_absolute_stdint_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 | sed -n "$gl_absolute_header_sed"` gl_header=$gl_cv_absolute_stdint_h gl_cv_next_stdint_h='"'$gl_header'"' else gl_cv_next_stdint_h='<'stdint.h'>' fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_stdint_h" >&5 $as_echo "$gl_cv_next_stdint_h" >&6; } fi NEXT_STDINT_H=$gl_cv_next_stdint_h if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next' gl_next_as_first_directive='<'stdint.h'>' else # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include' gl_next_as_first_directive=$gl_cv_next_stdint_h fi NEXT_AS_FIRST_DIRECTIVE_STDINT_H=$gl_next_as_first_directive if test $ac_cv_header_stdint_h = yes; then HAVE_STDINT_H=1 else HAVE_STDINT_H=0 fi if test $ac_cv_header_stdint_h = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stdint.h conforms to C99" >&5 $as_echo_n "checking whether stdint.h conforms to C99... " >&6; } if ${gl_cv_header_working_stdint_h+:} false; then : $as_echo_n "(cached) " >&6 else gl_cv_header_working_stdint_h=no cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define _GL_JUST_INCLUDE_SYSTEM_STDINT_H 1 /* work if build isn't clean */ #define __STDC_CONSTANT_MACROS 1 #define __STDC_LIMIT_MACROS 1 #include /* Dragonfly defines WCHAR_MIN, WCHAR_MAX only in . */ #if !(defined WCHAR_MIN && defined WCHAR_MAX) #error "WCHAR_MIN, WCHAR_MAX not defined in " #endif /* BSD/OS 4.0.1 has a bug: , and must be included before . */ #include #include #if HAVE_WCHAR_H # include # include # include #endif #ifdef INT8_MAX int8_t a1 = INT8_MAX; int8_t a1min = INT8_MIN; #endif #ifdef INT16_MAX int16_t a2 = INT16_MAX; int16_t a2min = INT16_MIN; #endif #ifdef INT32_MAX int32_t a3 = INT32_MAX; int32_t a3min = INT32_MIN; #endif #ifdef INT64_MAX int64_t a4 = INT64_MAX; int64_t a4min = INT64_MIN; #endif #ifdef UINT8_MAX uint8_t b1 = UINT8_MAX; #else typedef int b1[(unsigned char) -1 != 255 ? 1 : -1]; #endif #ifdef UINT16_MAX uint16_t b2 = UINT16_MAX; #endif #ifdef UINT32_MAX uint32_t b3 = UINT32_MAX; #endif #ifdef UINT64_MAX uint64_t b4 = UINT64_MAX; #endif int_least8_t c1 = INT8_C (0x7f); int_least8_t c1max = INT_LEAST8_MAX; int_least8_t c1min = INT_LEAST8_MIN; int_least16_t c2 = INT16_C (0x7fff); int_least16_t c2max = INT_LEAST16_MAX; int_least16_t c2min = INT_LEAST16_MIN; int_least32_t c3 = INT32_C (0x7fffffff); int_least32_t c3max = INT_LEAST32_MAX; int_least32_t c3min = INT_LEAST32_MIN; int_least64_t c4 = INT64_C (0x7fffffffffffffff); int_least64_t c4max = INT_LEAST64_MAX; int_least64_t c4min = INT_LEAST64_MIN; uint_least8_t d1 = UINT8_C (0xff); uint_least8_t d1max = UINT_LEAST8_MAX; uint_least16_t d2 = UINT16_C (0xffff); uint_least16_t d2max = UINT_LEAST16_MAX; uint_least32_t d3 = UINT32_C (0xffffffff); uint_least32_t d3max = UINT_LEAST32_MAX; uint_least64_t d4 = UINT64_C (0xffffffffffffffff); uint_least64_t d4max = UINT_LEAST64_MAX; int_fast8_t e1 = INT_FAST8_MAX; int_fast8_t e1min = INT_FAST8_MIN; int_fast16_t e2 = INT_FAST16_MAX; int_fast16_t e2min = INT_FAST16_MIN; int_fast32_t e3 = INT_FAST32_MAX; int_fast32_t e3min = INT_FAST32_MIN; int_fast64_t e4 = INT_FAST64_MAX; int_fast64_t e4min = INT_FAST64_MIN; uint_fast8_t f1 = UINT_FAST8_MAX; uint_fast16_t f2 = UINT_FAST16_MAX; uint_fast32_t f3 = UINT_FAST32_MAX; uint_fast64_t f4 = UINT_FAST64_MAX; #ifdef INTPTR_MAX intptr_t g = INTPTR_MAX; intptr_t gmin = INTPTR_MIN; #endif #ifdef UINTPTR_MAX uintptr_t h = UINTPTR_MAX; #endif intmax_t i = INTMAX_MAX; uintmax_t j = UINTMAX_MAX; /* Check that SIZE_MAX has the correct type, if possible. */ #if 201112 <= __STDC_VERSION__ int k = _Generic (SIZE_MAX, size_t: 0); #elif (2 <= __GNUC__ || defined __IBM__TYPEOF__ \ || (0x5110 <= __SUNPRO_C && !__STDC__)) extern size_t k; extern __typeof__ (SIZE_MAX) k; #endif #include /* for CHAR_BIT */ #define TYPE_MINIMUM(t) \ ((t) ((t) 0 < (t) -1 ? (t) 0 : ~ TYPE_MAXIMUM (t))) #define TYPE_MAXIMUM(t) \ ((t) ((t) 0 < (t) -1 \ ? (t) -1 \ : ((((t) 1 << (sizeof (t) * CHAR_BIT - 2)) - 1) * 2 + 1))) struct s { int check_PTRDIFF: PTRDIFF_MIN == TYPE_MINIMUM (ptrdiff_t) && PTRDIFF_MAX == TYPE_MAXIMUM (ptrdiff_t) ? 1 : -1; /* Detect bug in FreeBSD 6.0 / ia64. */ int check_SIG_ATOMIC: SIG_ATOMIC_MIN == TYPE_MINIMUM (sig_atomic_t) && SIG_ATOMIC_MAX == TYPE_MAXIMUM (sig_atomic_t) ? 1 : -1; int check_SIZE: SIZE_MAX == TYPE_MAXIMUM (size_t) ? 1 : -1; int check_WCHAR: WCHAR_MIN == TYPE_MINIMUM (wchar_t) && WCHAR_MAX == TYPE_MAXIMUM (wchar_t) ? 1 : -1; /* Detect bug in mingw. */ int check_WINT: WINT_MIN == TYPE_MINIMUM (wint_t) && WINT_MAX == TYPE_MAXIMUM (wint_t) ? 1 : -1; /* Detect bugs in glibc 2.4 and Solaris 10 stdint.h, among others. */ int check_UINT8_C: (-1 < UINT8_C (0)) == (-1 < (uint_least8_t) 0) ? 1 : -1; int check_UINT16_C: (-1 < UINT16_C (0)) == (-1 < (uint_least16_t) 0) ? 1 : -1; /* Detect bugs in OpenBSD 3.9 stdint.h. */ #ifdef UINT8_MAX int check_uint8: (uint8_t) -1 == UINT8_MAX ? 1 : -1; #endif #ifdef UINT16_MAX int check_uint16: (uint16_t) -1 == UINT16_MAX ? 1 : -1; #endif #ifdef UINT32_MAX int check_uint32: (uint32_t) -1 == UINT32_MAX ? 1 : -1; #endif #ifdef UINT64_MAX int check_uint64: (uint64_t) -1 == UINT64_MAX ? 1 : -1; #endif int check_uint_least8: (uint_least8_t) -1 == UINT_LEAST8_MAX ? 1 : -1; int check_uint_least16: (uint_least16_t) -1 == UINT_LEAST16_MAX ? 1 : -1; int check_uint_least32: (uint_least32_t) -1 == UINT_LEAST32_MAX ? 1 : -1; int check_uint_least64: (uint_least64_t) -1 == UINT_LEAST64_MAX ? 1 : -1; int check_uint_fast8: (uint_fast8_t) -1 == UINT_FAST8_MAX ? 1 : -1; int check_uint_fast16: (uint_fast16_t) -1 == UINT_FAST16_MAX ? 1 : -1; int check_uint_fast32: (uint_fast32_t) -1 == UINT_FAST32_MAX ? 1 : -1; int check_uint_fast64: (uint_fast64_t) -1 == UINT_FAST64_MAX ? 1 : -1; int check_uintptr: (uintptr_t) -1 == UINTPTR_MAX ? 1 : -1; int check_uintmax: (uintmax_t) -1 == UINTMAX_MAX ? 1 : -1; int check_size: (size_t) -1 == SIZE_MAX ? 1 : -1; }; int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : if test "$cross_compiling" = yes; then : case "$host_os" in # Guess yes on native Windows. mingw*) gl_cv_header_working_stdint_h="guessing yes" ;; # In general, assume it works. *) gl_cv_header_working_stdint_h="guessing yes" ;; esac else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define _GL_JUST_INCLUDE_SYSTEM_STDINT_H 1 /* work if build isn't clean */ #define __STDC_CONSTANT_MACROS 1 #define __STDC_LIMIT_MACROS 1 #include /* BSD/OS 4.0.1 has a bug: , and must be included before . */ #include #include #if HAVE_WCHAR_H # include # include # include #endif #include #include #define MVAL(macro) MVAL1(macro) #define MVAL1(expression) #expression static const char *macro_values[] = { #ifdef INT8_MAX MVAL (INT8_MAX), #endif #ifdef INT16_MAX MVAL (INT16_MAX), #endif #ifdef INT32_MAX MVAL (INT32_MAX), #endif #ifdef INT64_MAX MVAL (INT64_MAX), #endif #ifdef UINT8_MAX MVAL (UINT8_MAX), #endif #ifdef UINT16_MAX MVAL (UINT16_MAX), #endif #ifdef UINT32_MAX MVAL (UINT32_MAX), #endif #ifdef UINT64_MAX MVAL (UINT64_MAX), #endif NULL }; int main () { const char **mv; for (mv = macro_values; *mv != NULL; mv++) { const char *value = *mv; /* Test whether it looks like a cast expression. */ if (strncmp (value, "((unsigned int)"/*)*/, 15) == 0 || strncmp (value, "((unsigned short)"/*)*/, 17) == 0 || strncmp (value, "((unsigned char)"/*)*/, 16) == 0 || strncmp (value, "((int)"/*)*/, 6) == 0 || strncmp (value, "((signed short)"/*)*/, 15) == 0 || strncmp (value, "((signed char)"/*)*/, 14) == 0) return mv - macro_values + 1; } return 0; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : gl_cv_header_working_stdint_h=yes fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_working_stdint_h" >&5 $as_echo "$gl_cv_header_working_stdint_h" >&6; } fi HAVE_C99_STDINT_H=0 HAVE_SYS_BITYPES_H=0 HAVE_SYS_INTTYPES_H=0 STDINT_H=stdint.h case "$gl_cv_header_working_stdint_h" in *yes) HAVE_C99_STDINT_H=1 { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stdint.h predates C++11" >&5 $as_echo_n "checking whether stdint.h predates C++11... " >&6; } if ${gl_cv_header_stdint_predates_cxx11_h+:} false; then : $as_echo_n "(cached) " >&6 else gl_cv_header_stdint_predates_cxx11_h=yes cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define _GL_JUST_INCLUDE_SYSTEM_STDINT_H 1 /* work if build isn't clean */ #include /* BSD/OS 4.0.1 has a bug: , and must be included before . */ #include #include #if HAVE_WCHAR_H # include # include # include #endif intmax_t im = INTMAX_MAX; int32_t i32 = INT32_C (0x7fffffff); int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : gl_cv_header_stdint_predates_cxx11_h=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_stdint_predates_cxx11_h" >&5 $as_echo "$gl_cv_header_stdint_predates_cxx11_h" >&6; } if test "$gl_cv_header_stdint_predates_cxx11_h" = yes; then $as_echo "#define __STDC_CONSTANT_MACROS 1" >>confdefs.h $as_echo "#define __STDC_LIMIT_MACROS 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stdint.h has UINTMAX_WIDTH etc." >&5 $as_echo_n "checking whether stdint.h has UINTMAX_WIDTH etc.... " >&6; } if ${gl_cv_header_stdint_width+:} false; then : $as_echo_n "(cached) " >&6 else gl_cv_header_stdint_width=no cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Work if build is not clean. */ #define _GL_JUST_INCLUDE_SYSTEM_STDINT_H 1 #ifndef __STDC_WANT_IEC_60559_BFP_EXT__ #define __STDC_WANT_IEC_60559_BFP_EXT__ 1 #endif #include /* BSD/OS 4.0.1 has a bug: , and must be included before . */ #include #include #if HAVE_WCHAR_H # include # include # include #endif int iw = UINTMAX_WIDTH; int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : gl_cv_header_stdint_width=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_stdint_width" >&5 $as_echo "$gl_cv_header_stdint_width" >&6; } if test "$gl_cv_header_stdint_width" = yes; then STDINT_H= fi ;; *) for ac_header in sys/inttypes.h sys/bitypes.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done if test $ac_cv_header_sys_inttypes_h = yes; then HAVE_SYS_INTTYPES_H=1 fi if test $ac_cv_header_sys_bitypes_h = yes; then HAVE_SYS_BITYPES_H=1 fi if test $APPLE_UNIVERSAL_BUILD = 0; then for gltype in ptrdiff_t size_t ; do { $as_echo "$as_me:${as_lineno-$LINENO}: checking for bit size of $gltype" >&5 $as_echo_n "checking for bit size of $gltype... " >&6; } if eval \${gl_cv_bitsizeof_${gltype}+:} false; then : $as_echo_n "(cached) " >&6 else if ac_fn_c_compute_int "$LINENO" "sizeof ($gltype) * CHAR_BIT" "result" " /* BSD/OS 4.0.1 has a bug: , and must be included before . */ #include #include #if HAVE_WCHAR_H # include # include # include #endif #include "; then : else result=unknown fi eval gl_cv_bitsizeof_${gltype}=\$result fi eval ac_res=\$gl_cv_bitsizeof_${gltype} { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval result=\$gl_cv_bitsizeof_${gltype} if test $result = unknown; then result=0 fi GLTYPE=`echo "$gltype" | tr 'abcdefghijklmnopqrstuvwxyz ' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ_'` cat >>confdefs.h <<_ACEOF #define BITSIZEOF_${GLTYPE} $result _ACEOF eval BITSIZEOF_${GLTYPE}=\$result done fi for gltype in sig_atomic_t wchar_t wint_t ; do { $as_echo "$as_me:${as_lineno-$LINENO}: checking for bit size of $gltype" >&5 $as_echo_n "checking for bit size of $gltype... " >&6; } if eval \${gl_cv_bitsizeof_${gltype}+:} false; then : $as_echo_n "(cached) " >&6 else if ac_fn_c_compute_int "$LINENO" "sizeof ($gltype) * CHAR_BIT" "result" " /* BSD/OS 4.0.1 has a bug: , and must be included before . */ #include #include #if HAVE_WCHAR_H # include # include # include #endif #include "; then : else result=unknown fi eval gl_cv_bitsizeof_${gltype}=\$result fi eval ac_res=\$gl_cv_bitsizeof_${gltype} { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval result=\$gl_cv_bitsizeof_${gltype} if test $result = unknown; then result=0 fi GLTYPE=`echo "$gltype" | tr 'abcdefghijklmnopqrstuvwxyz ' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ_'` cat >>confdefs.h <<_ACEOF #define BITSIZEOF_${GLTYPE} $result _ACEOF eval BITSIZEOF_${GLTYPE}=\$result done for gltype in sig_atomic_t wchar_t wint_t ; do { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $gltype is signed" >&5 $as_echo_n "checking whether $gltype is signed... " >&6; } if eval \${gl_cv_type_${gltype}_signed+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* BSD/OS 4.0.1 has a bug: , and must be included before . */ #include #include #if HAVE_WCHAR_H # include # include # include #endif int verify[2 * (($gltype) -1 < ($gltype) 0) - 1]; int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : result=yes else result=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext eval gl_cv_type_${gltype}_signed=\$result fi eval ac_res=\$gl_cv_type_${gltype}_signed { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval result=\$gl_cv_type_${gltype}_signed GLTYPE=`echo $gltype | tr 'abcdefghijklmnopqrstuvwxyz ' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ_'` if test "$result" = yes; then cat >>confdefs.h <<_ACEOF #define HAVE_SIGNED_${GLTYPE} 1 _ACEOF eval HAVE_SIGNED_${GLTYPE}=1 else eval HAVE_SIGNED_${GLTYPE}=0 fi done gl_cv_type_ptrdiff_t_signed=yes gl_cv_type_size_t_signed=no if test $APPLE_UNIVERSAL_BUILD = 0; then for gltype in ptrdiff_t size_t ; do { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $gltype integer literal suffix" >&5 $as_echo_n "checking for $gltype integer literal suffix... " >&6; } if eval \${gl_cv_type_${gltype}_suffix+:} false; then : $as_echo_n "(cached) " >&6 else eval gl_cv_type_${gltype}_suffix=no eval result=\$gl_cv_type_${gltype}_signed if test "$result" = yes; then glsufu= else glsufu=u fi for glsuf in "$glsufu" ${glsufu}l ${glsufu}ll ${glsufu}i64; do case $glsuf in '') gltype1='int';; l) gltype1='long int';; ll) gltype1='long long int';; i64) gltype1='__int64';; u) gltype1='unsigned int';; ul) gltype1='unsigned long int';; ull) gltype1='unsigned long long int';; ui64)gltype1='unsigned __int64';; esac cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* BSD/OS 4.0.1 has a bug: , and must be included before . */ #include #include #if HAVE_WCHAR_H # include # include # include #endif extern $gltype foo; extern $gltype1 foo; int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval gl_cv_type_${gltype}_suffix=\$glsuf fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext eval result=\$gl_cv_type_${gltype}_suffix test "$result" != no && break done fi eval ac_res=\$gl_cv_type_${gltype}_suffix { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } GLTYPE=`echo $gltype | tr 'abcdefghijklmnopqrstuvwxyz ' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ_'` eval result=\$gl_cv_type_${gltype}_suffix test "$result" = no && result= eval ${GLTYPE}_SUFFIX=\$result cat >>confdefs.h <<_ACEOF #define ${GLTYPE}_SUFFIX $result _ACEOF done fi for gltype in sig_atomic_t wchar_t wint_t ; do { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $gltype integer literal suffix" >&5 $as_echo_n "checking for $gltype integer literal suffix... " >&6; } if eval \${gl_cv_type_${gltype}_suffix+:} false; then : $as_echo_n "(cached) " >&6 else eval gl_cv_type_${gltype}_suffix=no eval result=\$gl_cv_type_${gltype}_signed if test "$result" = yes; then glsufu= else glsufu=u fi for glsuf in "$glsufu" ${glsufu}l ${glsufu}ll ${glsufu}i64; do case $glsuf in '') gltype1='int';; l) gltype1='long int';; ll) gltype1='long long int';; i64) gltype1='__int64';; u) gltype1='unsigned int';; ul) gltype1='unsigned long int';; ull) gltype1='unsigned long long int';; ui64)gltype1='unsigned __int64';; esac cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* BSD/OS 4.0.1 has a bug: , and must be included before . */ #include #include #if HAVE_WCHAR_H # include # include # include #endif extern $gltype foo; extern $gltype1 foo; int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval gl_cv_type_${gltype}_suffix=\$glsuf fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext eval result=\$gl_cv_type_${gltype}_suffix test "$result" != no && break done fi eval ac_res=\$gl_cv_type_${gltype}_suffix { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } GLTYPE=`echo $gltype | tr 'abcdefghijklmnopqrstuvwxyz ' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ_'` eval result=\$gl_cv_type_${gltype}_suffix test "$result" = no && result= eval ${GLTYPE}_SUFFIX=\$result cat >>confdefs.h <<_ACEOF #define ${GLTYPE}_SUFFIX $result _ACEOF done if test $GNULIB_OVERRIDES_WINT_T = 1; then BITSIZEOF_WINT_T=32 fi ;; esac LIMITS_H='limits.h' if test -n "$LIMITS_H"; then GL_GENERATE_LIMITS_H_TRUE= GL_GENERATE_LIMITS_H_FALSE='#' else GL_GENERATE_LIMITS_H_TRUE='#' GL_GENERATE_LIMITS_H_FALSE= fi if test -n "$STDINT_H"; then GL_GENERATE_STDINT_H_TRUE= GL_GENERATE_STDINT_H_FALSE='#' else GL_GENERATE_STDINT_H_TRUE='#' GL_GENERATE_STDINT_H_FALSE= fi GNULIB_IMAXABS=0; GNULIB_IMAXDIV=0; GNULIB_STRTOIMAX=0; GNULIB_STRTOUMAX=0; HAVE_DECL_IMAXABS=1; HAVE_DECL_IMAXDIV=1; HAVE_DECL_STRTOIMAX=1; HAVE_DECL_STRTOUMAX=1; HAVE_IMAXDIV_T=1; REPLACE_STRTOIMAX=0; REPLACE_STRTOUMAX=0; INT32_MAX_LT_INTMAX_MAX=1; INT64_MAX_EQ_LONG_MAX='defined _LP64'; PRIPTR_PREFIX=__PRIPTR_PREFIX; UINT32_MAX_LT_UINTMAX_MAX=1; UINT64_MAX_EQ_ULONG_MAX='defined _LP64'; if test $gl_cv_have_include_next = yes; then gl_cv_next_inttypes_h='<'inttypes.h'>' else { $as_echo "$as_me:${as_lineno-$LINENO}: checking absolute name of " >&5 $as_echo_n "checking absolute name of ... " >&6; } if ${gl_cv_next_inttypes_h+:} false; then : $as_echo_n "(cached) " >&6 else if test $ac_cv_header_inttypes_h = yes; then cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF case "$host_os" in aix*) gl_absname_cpp="$ac_cpp -C" ;; *) gl_absname_cpp="$ac_cpp" ;; esac case "$host_os" in mingw*) gl_dirsep_regex='[/\\]' ;; *) gl_dirsep_regex='\/' ;; esac gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g' gl_header_literal_regex=`echo 'inttypes.h' \ | sed -e "$gl_make_literal_regex_sed"` gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{ s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/ s|^/[^/]|//&| p q }' gl_cv_absolute_inttypes_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 | sed -n "$gl_absolute_header_sed"` gl_header=$gl_cv_absolute_inttypes_h gl_cv_next_inttypes_h='"'$gl_header'"' else gl_cv_next_inttypes_h='<'inttypes.h'>' fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_inttypes_h" >&5 $as_echo "$gl_cv_next_inttypes_h" >&6; } fi NEXT_INTTYPES_H=$gl_cv_next_inttypes_h if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next' gl_next_as_first_directive='<'inttypes.h'>' else # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include' gl_next_as_first_directive=$gl_cv_next_inttypes_h fi NEXT_AS_FIRST_DIRECTIVE_INTTYPES_H=$gl_next_as_first_directive { $as_echo "$as_me:${as_lineno-$LINENO}: checking where to find the exponent in a 'float'" >&5 $as_echo_n "checking where to find the exponent in a 'float'... " >&6; } if ${gl_cv_cc_float_expbit0+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : gl_cv_cc_float_expbit0="word 0 bit 23" else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include #define NWORDS \ ((sizeof (float) + sizeof (unsigned int) - 1) / sizeof (unsigned int)) typedef union { float value; unsigned int word[NWORDS]; } memory_float; static unsigned int ored_words[NWORDS]; static unsigned int anded_words[NWORDS]; static void add_to_ored_words (float x) { memory_float m; size_t i; /* Clear it first, in case sizeof (float) < sizeof (memory_float). */ memset (&m, 0, sizeof (memory_float)); m.value = x; for (i = 0; i < NWORDS; i++) { ored_words[i] |= m.word[i]; anded_words[i] &= m.word[i]; } } int main () { size_t j; FILE *fp = fopen ("conftest.out", "w"); if (fp == NULL) return 1; for (j = 0; j < NWORDS; j++) anded_words[j] = ~ (unsigned int) 0; add_to_ored_words (0.25f); add_to_ored_words (0.5f); add_to_ored_words (1.0f); add_to_ored_words (2.0f); add_to_ored_words (4.0f); /* Remove bits that are common (e.g. if representation of the first mantissa bit is explicit). */ for (j = 0; j < NWORDS; j++) ored_words[j] &= ~anded_words[j]; /* Now find the nonzero word. */ for (j = 0; j < NWORDS; j++) if (ored_words[j] != 0) break; if (j < NWORDS) { size_t i; for (i = j + 1; i < NWORDS; i++) if (ored_words[i] != 0) { fprintf (fp, "unknown"); return (fclose (fp) != 0); } for (i = 0; ; i++) if ((ored_words[j] >> i) & 1) { fprintf (fp, "word %d bit %d", (int) j, (int) i); return (fclose (fp) != 0); } } fprintf (fp, "unknown"); return (fclose (fp) != 0); } _ACEOF if ac_fn_c_try_run "$LINENO"; then : gl_cv_cc_float_expbit0=`cat conftest.out` else gl_cv_cc_float_expbit0="unknown" fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi rm -f conftest.out fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_cc_float_expbit0" >&5 $as_echo "$gl_cv_cc_float_expbit0" >&6; } case "$gl_cv_cc_float_expbit0" in word*bit*) word=`echo "$gl_cv_cc_float_expbit0" | sed -e 's/word //' -e 's/ bit.*//'` bit=`echo "$gl_cv_cc_float_expbit0" | sed -e 's/word.*bit //'` cat >>confdefs.h <<_ACEOF #define FLT_EXPBIT0_WORD $word _ACEOF cat >>confdefs.h <<_ACEOF #define FLT_EXPBIT0_BIT $bit _ACEOF ;; esac ISNANF_LIBM= { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether isnan(float) can be used without linking with libm" >&5 $as_echo_n "checking whether isnan(float) can be used without linking with libm... " >&6; } if ${gl_cv_func_isnanf_no_libm+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #if (__GNUC__ >= 4) || (__clang_major__ >= 4) # undef isnanf # define isnanf(x) __builtin_isnan ((float)(x)) #elif defined isnan # undef isnanf # define isnanf(x) isnan ((float)(x)) #endif float x; int main () { return isnanf (x); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : gl_cv_func_isnanf_no_libm=yes else gl_cv_func_isnanf_no_libm=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_isnanf_no_libm" >&5 $as_echo "$gl_cv_func_isnanf_no_libm" >&6; } if test $gl_cv_func_isnanf_no_libm = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether isnan(float) can be used with libm" >&5 $as_echo_n "checking whether isnan(float) can be used with libm... " >&6; } if ${gl_cv_func_isnanf_in_libm+:} false; then : $as_echo_n "(cached) " >&6 else save_LIBS="$LIBS" LIBS="$LIBS -lm" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #if (__GNUC__ >= 4) || (__clang_major__ >= 4) # undef isnanf # define isnanf(x) __builtin_isnan ((float)(x)) #elif defined isnan # undef isnanf # define isnanf(x) isnan ((float)(x)) #endif float x; int main () { return isnanf (x); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : gl_cv_func_isnanf_in_libm=yes else gl_cv_func_isnanf_in_libm=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS="$save_LIBS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_isnanf_in_libm" >&5 $as_echo "$gl_cv_func_isnanf_in_libm" >&6; } if test $gl_cv_func_isnanf_in_libm = yes; then ISNANF_LIBM=-lm fi fi if test $gl_cv_func_isnanf_no_libm = yes \ || test $gl_cv_func_isnanf_in_libm = yes; then save_LIBS="$LIBS" LIBS="$LIBS $ISNANF_LIBM" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether isnan(float) works" >&5 $as_echo_n "checking whether isnan(float) works... " >&6; } if ${gl_cv_func_isnanf_works+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : case "$host_os" in irix* | solaris*) gl_cv_func_isnanf_works="guessing no" ;; mingw*) # Guess yes on mingw, no on MSVC. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __MINGW32__ Known #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "Known" >/dev/null 2>&1; then : gl_cv_func_isnanf_works="guessing yes" else gl_cv_func_isnanf_works="guessing no" fi rm -f conftest* ;; *) gl_cv_func_isnanf_works="guessing yes" ;; esac else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #if (__GNUC__ >= 4) || (__clang_major__ >= 4) # undef isnanf # define isnanf(x) __builtin_isnan ((float)(x)) #elif defined isnan # undef isnanf # define isnanf(x) isnan ((float)(x)) #endif /* The Compaq (ex-DEC) C 6.4 compiler chokes on the expression 0.0 / 0.0. */ #ifdef __DECC static float NaN () { static float zero = 0.0f; return zero / zero; } #else # define NaN() (0.0f / 0.0f) #endif #define NWORDS \ ((sizeof (float) + sizeof (unsigned int) - 1) / sizeof (unsigned int)) typedef union { unsigned int word[NWORDS]; float value; } memory_float; int main() { int result = 0; if (isnanf (1.0f / 0.0f)) result |= 1; if (!isnanf (NaN ())) result |= 2; #if defined FLT_EXPBIT0_WORD && defined FLT_EXPBIT0_BIT /* The isnanf function should be immune against changes in the sign bit and in the mantissa bits. The xor operation twiddles a bit that can only be a sign bit or a mantissa bit. */ if (FLT_EXPBIT0_WORD == 0 && FLT_EXPBIT0_BIT > 0) { memory_float m; m.value = NaN (); /* Set the bits below the exponent to 01111...111. */ m.word[0] &= -1U << FLT_EXPBIT0_BIT; m.word[0] |= 1U << (FLT_EXPBIT0_BIT - 1) - 1; if (!isnanf (m.value)) result |= 4; } #endif return result; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : gl_cv_func_isnanf_works=yes else gl_cv_func_isnanf_works=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_isnanf_works" >&5 $as_echo "$gl_cv_func_isnanf_works" >&6; } LIBS="$save_LIBS" case "$gl_cv_func_isnanf_works" in *yes) gl_func_isnanf=yes ;; *) gl_func_isnanf=no; ISNANF_LIBM= ;; esac else gl_func_isnanf=no fi if test $gl_func_isnanf != yes; then HAVE_ISNANF=0 fi ISNAND_LIBM= { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether isnan(double) can be used without linking with libm" >&5 $as_echo_n "checking whether isnan(double) can be used without linking with libm... " >&6; } if ${gl_cv_func_isnand_no_libm+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #if (__GNUC__ >= 4) || (__clang_major__ >= 4) # undef isnand # define isnand(x) __builtin_isnan ((double)(x)) #else # undef isnand # define isnand(x) isnan ((double)(x)) #endif double x; int main () { return isnand (x); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : gl_cv_func_isnand_no_libm=yes else gl_cv_func_isnand_no_libm=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_isnand_no_libm" >&5 $as_echo "$gl_cv_func_isnand_no_libm" >&6; } if test $gl_cv_func_isnand_no_libm = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether isnan(double) can be used with libm" >&5 $as_echo_n "checking whether isnan(double) can be used with libm... " >&6; } if ${gl_cv_func_isnand_in_libm+:} false; then : $as_echo_n "(cached) " >&6 else save_LIBS="$LIBS" LIBS="$LIBS -lm" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #if (__GNUC__ >= 4) || (__clang_major__ >= 4) # undef isnand # define isnand(x) __builtin_isnan ((double)(x)) #elif defined isnan # undef isnand # define isnand(x) isnan ((double)(x)) #endif double x; int main () { return isnand (x); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : gl_cv_func_isnand_in_libm=yes else gl_cv_func_isnand_in_libm=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS="$save_LIBS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_isnand_in_libm" >&5 $as_echo "$gl_cv_func_isnand_in_libm" >&6; } if test $gl_cv_func_isnand_in_libm = yes; then ISNAND_LIBM=-lm fi fi if test $gl_cv_func_isnand_no_libm = yes \ || test $gl_cv_func_isnand_in_libm = yes; then gl_func_isnand=yes else gl_func_isnand=no HAVE_ISNAND=0 fi ISNANL_LIBM= { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether isnan(long double) can be used without linking with libm" >&5 $as_echo_n "checking whether isnan(long double) can be used without linking with libm... " >&6; } if ${gl_cv_func_isnanl_no_libm+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #if (__GNUC__ >= 4) || (__clang_major__ >= 4) # undef isnanl # define isnanl(x) __builtin_isnan ((long double)(x)) #elif defined isnan # undef isnanl # define isnanl(x) isnan ((long double)(x)) #endif long double x; int main () { return isnanl (x); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : gl_cv_func_isnanl_no_libm=yes else gl_cv_func_isnanl_no_libm=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_isnanl_no_libm" >&5 $as_echo "$gl_cv_func_isnanl_no_libm" >&6; } if test $gl_cv_func_isnanl_no_libm = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether isnan(long double) can be used with libm" >&5 $as_echo_n "checking whether isnan(long double) can be used with libm... " >&6; } if ${gl_cv_func_isnanl_in_libm+:} false; then : $as_echo_n "(cached) " >&6 else save_LIBS="$LIBS" LIBS="$LIBS -lm" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #if (__GNUC__ >= 4) || (__clang_major__ >= 4) # undef isnanl # define isnanl(x) __builtin_isnan ((long double)(x)) #elif defined isnan # undef isnanl # define isnanl(x) isnan ((long double)(x)) #endif long double x; int main () { return isnanl (x); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : gl_cv_func_isnanl_in_libm=yes else gl_cv_func_isnanl_in_libm=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS="$save_LIBS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_isnanl_in_libm" >&5 $as_echo "$gl_cv_func_isnanl_in_libm" >&6; } if test $gl_cv_func_isnanl_in_libm = yes; then ISNANL_LIBM=-lm fi fi if test $gl_cv_func_isnanl_no_libm = yes \ || test $gl_cv_func_isnanl_in_libm = yes; then save_LIBS="$LIBS" LIBS="$LIBS $ISNANL_LIBM" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether isnanl works" >&5 $as_echo_n "checking whether isnanl works... " >&6; } if ${gl_cv_func_isnanl_works+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : case "$host_os" in mingw*) # Guess yes on mingw, no on MSVC. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __MINGW32__ Known #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "Known" >/dev/null 2>&1; then : gl_cv_func_isnanl_works="guessing yes" else gl_cv_func_isnanl_works="guessing no" fi rm -f conftest* ;; *) gl_cv_func_isnanl_works="guessing yes" ;; esac else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #if (__GNUC__ >= 4) || (__clang_major__ >= 4) # undef isnanl # define isnanl(x) __builtin_isnan ((long double)(x)) #elif defined isnan # undef isnanl # define isnanl(x) isnan ((long double)(x)) #endif #define NWORDS \ ((sizeof (long double) + sizeof (unsigned int) - 1) / sizeof (unsigned int)) typedef union { unsigned int word[NWORDS]; long double value; } memory_long_double; /* On Irix 6.5, gcc 3.4.3 can't compute compile-time NaN, and needs the runtime type conversion. */ #ifdef __sgi static long double NaNl () { double zero = 0.0; return zero / zero; } #else # define NaNl() (0.0L / 0.0L) #endif int main () { int result = 0; if (!isnanl (NaNl ())) result |= 1; { memory_long_double m; unsigned int i; /* The isnanl function should be immune against changes in the sign bit and in the mantissa bits. The xor operation twiddles a bit that can only be a sign bit or a mantissa bit (since the exponent never extends to bit 31). */ m.value = NaNl (); m.word[NWORDS / 2] ^= (unsigned int) 1 << (sizeof (unsigned int) * CHAR_BIT - 1); for (i = 0; i < NWORDS; i++) m.word[i] |= 1; if (!isnanl (m.value)) result |= 1; } #if ((defined __ia64 && LDBL_MANT_DIG == 64) || (defined __x86_64__ || defined __amd64__) || (defined __i386 || defined __i386__ || defined _I386 || defined _M_IX86 || defined _X86_)) && !HAVE_SAME_LONG_DOUBLE_AS_DOUBLE /* Representation of an 80-bit 'long double' as an initializer for a sequence of 'unsigned int' words. */ # ifdef WORDS_BIGENDIAN # define LDBL80_WORDS(exponent,manthi,mantlo) \ { ((unsigned int) (exponent) << 16) | ((unsigned int) (manthi) >> 16), \ ((unsigned int) (manthi) << 16) | ((unsigned int) (mantlo) >> 16), \ (unsigned int) (mantlo) << 16 \ } # else # define LDBL80_WORDS(exponent,manthi,mantlo) \ { mantlo, manthi, exponent } # endif { /* Quiet NaN. */ static memory_long_double x = { LDBL80_WORDS (0xFFFF, 0xC3333333, 0x00000000) }; if (!isnanl (x.value)) result |= 2; } { /* Signalling NaN. */ static memory_long_double x = { LDBL80_WORDS (0xFFFF, 0x83333333, 0x00000000) }; if (!isnanl (x.value)) result |= 2; } /* isnanl should return something even for noncanonical values. */ { /* Pseudo-NaN. */ static memory_long_double x = { LDBL80_WORDS (0xFFFF, 0x40000001, 0x00000000) }; if (isnanl (x.value) && !isnanl (x.value)) result |= 4; } { /* Pseudo-Infinity. */ static memory_long_double x = { LDBL80_WORDS (0xFFFF, 0x00000000, 0x00000000) }; if (isnanl (x.value) && !isnanl (x.value)) result |= 8; } { /* Pseudo-Zero. */ static memory_long_double x = { LDBL80_WORDS (0x4004, 0x00000000, 0x00000000) }; if (isnanl (x.value) && !isnanl (x.value)) result |= 16; } { /* Unnormalized number. */ static memory_long_double x = { LDBL80_WORDS (0x4000, 0x63333333, 0x00000000) }; if (isnanl (x.value) && !isnanl (x.value)) result |= 32; } { /* Pseudo-Denormal. */ static memory_long_double x = { LDBL80_WORDS (0x0000, 0x83333333, 0x00000000) }; if (isnanl (x.value) && !isnanl (x.value)) result |= 64; } #endif return result; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : gl_cv_func_isnanl_works=yes else gl_cv_func_isnanl_works=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_isnanl_works" >&5 $as_echo "$gl_cv_func_isnanl_works" >&6; } LIBS="$save_LIBS" case "$gl_cv_func_isnanl_works" in *yes) gl_func_isnanl=yes ;; *) gl_func_isnanl=no; ISNANL_LIBM= ;; esac else gl_func_isnanl=no fi if test $gl_func_isnanl != yes; then HAVE_ISNANL=0 fi GNULIB_ISWBLANK=0; GNULIB_ISWDIGIT=0; GNULIB_ISWXDIGIT=0; GNULIB_WCTYPE=0; GNULIB_ISWCTYPE=0; GNULIB_WCTRANS=0; GNULIB_TOWCTRANS=0; HAVE_ISWBLANK=1; HAVE_WCTYPE_T=1; HAVE_WCTRANS_T=1; REPLACE_ISWBLANK=0; REPLACE_ISWDIGIT=0; REPLACE_ISWXDIGIT=0; if test $ac_cv_header_crtdefs_h = yes; then HAVE_CRTDEFS_H=1 else HAVE_CRTDEFS_H=0 fi if test $ac_cv_func_iswcntrl = yes; then HAVE_ISWCNTRL=1 else HAVE_ISWCNTRL=0 fi if test $gt_cv_c_wint_t = yes; then HAVE_WINT_T=1 else HAVE_WINT_T=0 fi if test $gl_cv_have_include_next = yes; then gl_cv_next_wctype_h='<'wctype.h'>' else { $as_echo "$as_me:${as_lineno-$LINENO}: checking absolute name of " >&5 $as_echo_n "checking absolute name of ... " >&6; } if ${gl_cv_next_wctype_h+:} false; then : $as_echo_n "(cached) " >&6 else if test $ac_cv_header_wctype_h = yes; then cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF case "$host_os" in aix*) gl_absname_cpp="$ac_cpp -C" ;; *) gl_absname_cpp="$ac_cpp" ;; esac case "$host_os" in mingw*) gl_dirsep_regex='[/\\]' ;; *) gl_dirsep_regex='\/' ;; esac gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g' gl_header_literal_regex=`echo 'wctype.h' \ | sed -e "$gl_make_literal_regex_sed"` gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{ s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/ s|^/[^/]|//&| p q }' gl_cv_absolute_wctype_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 | sed -n "$gl_absolute_header_sed"` gl_header=$gl_cv_absolute_wctype_h gl_cv_next_wctype_h='"'$gl_header'"' else gl_cv_next_wctype_h='<'wctype.h'>' fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_wctype_h" >&5 $as_echo "$gl_cv_next_wctype_h" >&6; } fi NEXT_WCTYPE_H=$gl_cv_next_wctype_h if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next' gl_next_as_first_directive='<'wctype.h'>' else # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include' gl_next_as_first_directive=$gl_cv_next_wctype_h fi NEXT_AS_FIRST_DIRECTIVE_WCTYPE_H=$gl_next_as_first_directive if test $ac_cv_header_wctype_h = yes; then if test $ac_cv_func_iswcntrl = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether iswcntrl works" >&5 $as_echo_n "checking whether iswcntrl works... " >&6; } if ${gl_cv_func_iswcntrl_works+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #if __GNU_LIBRARY__ == 1 Linux libc5 i18n is broken. #endif int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : gl_cv_func_iswcntrl_works="guessing yes" else gl_cv_func_iswcntrl_works="guessing no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Tru64 with Desktop Toolkit C has a bug: must be included before . BSD/OS 4.0.1 has a bug: , and must be included before . */ #include #include #include #include #include int main () { return iswprint ('x') == 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : gl_cv_func_iswcntrl_works=yes else gl_cv_func_iswcntrl_works=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_iswcntrl_works" >&5 $as_echo "$gl_cv_func_iswcntrl_works" >&6; } fi HAVE_WCTYPE_H=1 else HAVE_WCTYPE_H=0 fi if test $GNULIB_OVERRIDES_WINT_T = 1; then REPLACE_ISWCNTRL=1 else case "$gl_cv_func_iswcntrl_works" in *yes) REPLACE_ISWCNTRL=0 ;; *) REPLACE_ISWCNTRL=1 ;; esac fi if test $HAVE_ISWCNTRL = 0 || test $REPLACE_ISWCNTRL = 1; then : fi if test $REPLACE_ISWCNTRL = 1; then REPLACE_TOWLOWER=1 else for ac_func in towlower do : ac_fn_c_check_func "$LINENO" "towlower" "ac_cv_func_towlower" if test "x$ac_cv_func_towlower" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_TOWLOWER 1 _ACEOF fi done if test $ac_cv_func_towlower = yes; then REPLACE_TOWLOWER=0 else ac_fn_c_check_decl "$LINENO" "towlower" "ac_cv_have_decl_towlower" "/* Tru64 with Desktop Toolkit C has a bug: must be included before . BSD/OS 4.0.1 has a bug: , and must be included before . */ #include #include #include #include #if HAVE_WCTYPE_H # include #endif " if test "x$ac_cv_have_decl_towlower" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_TOWLOWER $ac_have_decl _ACEOF if test $ac_cv_have_decl_towlower = yes; then REPLACE_TOWLOWER=1 else REPLACE_TOWLOWER=0 fi fi fi if test $HAVE_ISWCNTRL = 0 || test $REPLACE_TOWLOWER = 1; then : fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for wctype_t" >&5 $as_echo_n "checking for wctype_t... " >&6; } if ${gl_cv_type_wctype_t+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Tru64 with Desktop Toolkit C has a bug: must be included before . BSD/OS 4.0.1 has a bug: , and must be included before . */ #include #include #include #include #if HAVE_WCTYPE_H # include #endif wctype_t a; int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : gl_cv_type_wctype_t=yes else gl_cv_type_wctype_t=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_type_wctype_t" >&5 $as_echo "$gl_cv_type_wctype_t" >&6; } if test $gl_cv_type_wctype_t = no; then HAVE_WCTYPE_T=0 fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for wctrans_t" >&5 $as_echo_n "checking for wctrans_t... " >&6; } if ${gl_cv_type_wctrans_t+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Tru64 with Desktop Toolkit C has a bug: must be included before . BSD/OS 4.0.1 has a bug: , and must be included before . */ #include #include #include #include #include wctrans_t a; int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : gl_cv_type_wctrans_t=yes else gl_cv_type_wctrans_t=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_type_wctrans_t" >&5 $as_echo "$gl_cv_type_wctrans_t" >&6; } if test $gl_cv_type_wctrans_t = no; then HAVE_WCTRANS_T=0 fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a traditional japanese locale" >&5 $as_echo_n "checking for a traditional japanese locale... " >&6; } if ${gt_cv_locale_ja+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if HAVE_LANGINFO_CODESET # include #endif #include #include struct tm t; char buf[16]; int main () { /* On BeOS and Haiku, locales are not implemented in libc. Rather, libintl imitates locale dependent behaviour by looking at the environment variables, and all locales use the UTF-8 encoding. */ #if defined __BEOS__ || defined __HAIKU__ return 1; #else /* Check whether the given locale name is recognized by the system. */ # if defined _WIN32 && !defined __CYGWIN__ /* On native Windows, setlocale(category, "") looks at the system settings, not at the environment variables. Also, when an encoding suffix such as ".65001" or ".54936" is specified, it succeeds but sets the LC_CTYPE category of the locale to "C". */ if (setlocale (LC_ALL, getenv ("LC_ALL")) == NULL || strcmp (setlocale (LC_CTYPE, NULL), "C") == 0) return 1; # else if (setlocale (LC_ALL, "") == NULL) return 1; # endif /* Check whether nl_langinfo(CODESET) is nonempty and not "ASCII" or "646". On Mac OS X 10.3.5 (Darwin 7.5) in the fr_FR locale, nl_langinfo(CODESET) is empty, and the behaviour of Tcl 8.4 in this locale is not useful. On OpenBSD 4.0, when an unsupported locale is specified, setlocale() succeeds but then nl_langinfo(CODESET) is "646". In this situation, some unit tests fail. On MirBSD 10, when an unsupported locale is specified, setlocale() succeeds but then nl_langinfo(CODESET) is "UTF-8". */ # if HAVE_LANGINFO_CODESET { const char *cs = nl_langinfo (CODESET); if (cs[0] == '\0' || strcmp (cs, "ASCII") == 0 || strcmp (cs, "646") == 0 || strcmp (cs, "UTF-8") == 0) return 1; } # endif # ifdef __CYGWIN__ /* On Cygwin, avoid locale names without encoding suffix, because the locale_charset() function relies on the encoding suffix. Note that LC_ALL is set on the command line. */ if (strchr (getenv ("LC_ALL"), '.') == NULL) return 1; # endif /* Check whether MB_CUR_MAX is > 1. This excludes the dysfunctional locales on Cygwin 1.5.x. */ if (MB_CUR_MAX == 1) return 1; /* Check whether in a month name, no byte in the range 0x80..0x9F occurs. This excludes the UTF-8 encoding (except on MirBSD). */ { const char *p; t.tm_year = 1975 - 1900; t.tm_mon = 2 - 1; t.tm_mday = 4; if (strftime (buf, sizeof (buf), "%B", &t) < 2) return 1; for (p = buf; *p != '\0'; p++) if ((unsigned char) *p >= 0x80 && (unsigned char) *p < 0xa0) return 1; } return 0; #endif } _ACEOF if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s conftest$ac_exeext; then case "$host_os" in # Handle native Windows specially, because there setlocale() interprets # "ar" as "Arabic" or "Arabic_Saudi Arabia.1256", # "fr" or "fra" as "French" or "French_France.1252", # "ge"(!) or "deu"(!) as "German" or "German_Germany.1252", # "ja" as "Japanese" or "Japanese_Japan.932", # and similar. mingw*) # Note that on native Windows, the Japanese locale is # Japanese_Japan.932, and CP932 is very different from EUC-JP, so we # cannot use it here. gt_cv_locale_ja=none ;; *) # Setting LC_ALL is not enough. Need to set LC_TIME to empty, because # otherwise on Mac OS X 10.3.5 the LC_TIME=C from the beginning of the # configure script would override the LC_ALL setting. Likewise for # LC_CTYPE, which is also set at the beginning of the configure script. # Test for the AIX locale name. if (LC_ALL=ja_JP LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then gt_cv_locale_ja=ja_JP else # Test for the locale name with explicit encoding suffix. if (LC_ALL=ja_JP.EUC-JP LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then gt_cv_locale_ja=ja_JP.EUC-JP else # Test for the HP-UX, OSF/1, NetBSD locale name. if (LC_ALL=ja_JP.eucJP LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then gt_cv_locale_ja=ja_JP.eucJP else # Test for the IRIX, FreeBSD locale name. if (LC_ALL=ja_JP.EUC LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then gt_cv_locale_ja=ja_JP.EUC else # Test for the Solaris 7 locale name. if (LC_ALL=ja LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then gt_cv_locale_ja=ja else # Special test for NetBSD 1.6. if test -f /usr/share/locale/ja_JP.eucJP/LC_CTYPE; then gt_cv_locale_ja=ja_JP.eucJP else # None found. gt_cv_locale_ja=none fi fi fi fi fi fi ;; esac fi rm -fr conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_locale_ja" >&5 $as_echo "$gt_cv_locale_ja" >&6; } LOCALE_JA=$gt_cv_locale_ja { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a french Unicode locale" >&5 $as_echo_n "checking for a french Unicode locale... " >&6; } if ${gt_cv_locale_fr_utf8+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if HAVE_LANGINFO_CODESET # include #endif #include #include struct tm t; char buf[16]; int main () { /* On BeOS and Haiku, locales are not implemented in libc. Rather, libintl imitates locale dependent behaviour by looking at the environment variables, and all locales use the UTF-8 encoding. */ #if !(defined __BEOS__ || defined __HAIKU__) /* Check whether the given locale name is recognized by the system. */ # if defined _WIN32 && !defined __CYGWIN__ /* On native Windows, setlocale(category, "") looks at the system settings, not at the environment variables. Also, when an encoding suffix such as ".65001" or ".54936" is specified, it succeeds but sets the LC_CTYPE category of the locale to "C". */ if (setlocale (LC_ALL, getenv ("LC_ALL")) == NULL || strcmp (setlocale (LC_CTYPE, NULL), "C") == 0) return 1; # else if (setlocale (LC_ALL, "") == NULL) return 1; # endif /* Check whether nl_langinfo(CODESET) is nonempty and not "ASCII" or "646". On Mac OS X 10.3.5 (Darwin 7.5) in the fr_FR locale, nl_langinfo(CODESET) is empty, and the behaviour of Tcl 8.4 in this locale is not useful. On OpenBSD 4.0, when an unsupported locale is specified, setlocale() succeeds but then nl_langinfo(CODESET) is "646". In this situation, some unit tests fail. */ # if HAVE_LANGINFO_CODESET { const char *cs = nl_langinfo (CODESET); if (cs[0] == '\0' || strcmp (cs, "ASCII") == 0 || strcmp (cs, "646") == 0) return 1; } # endif # ifdef __CYGWIN__ /* On Cygwin, avoid locale names without encoding suffix, because the locale_charset() function relies on the encoding suffix. Note that LC_ALL is set on the command line. */ if (strchr (getenv ("LC_ALL"), '.') == NULL) return 1; # endif /* Check whether in the abbreviation of the second month, the second character (should be U+00E9: LATIN SMALL LETTER E WITH ACUTE) is two bytes long, with UTF-8 encoding. */ t.tm_year = 1975 - 1900; t.tm_mon = 2 - 1; t.tm_mday = 4; if (strftime (buf, sizeof (buf), "%b", &t) < 4 || buf[1] != (char) 0xc3 || buf[2] != (char) 0xa9 || buf[3] != 'v') return 1; #endif #if !defined __BIONIC__ /* Bionic libc's 'struct lconv' is just a dummy. */ /* Check whether the decimal separator is a comma. On NetBSD 3.0 in the fr_FR.ISO8859-1 locale, localeconv()->decimal_point are nl_langinfo(RADIXCHAR) are both ".". */ if (localeconv () ->decimal_point[0] != ',') return 1; #endif return 0; } _ACEOF if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s conftest$ac_exeext; then case "$host_os" in # Handle native Windows specially, because there setlocale() interprets # "ar" as "Arabic" or "Arabic_Saudi Arabia.1256", # "fr" or "fra" as "French" or "French_France.1252", # "ge"(!) or "deu"(!) as "German" or "German_Germany.1252", # "ja" as "Japanese" or "Japanese_Japan.932", # and similar. mingw*) # Test for the hypothetical native Windows locale name. if (LC_ALL=French_France.65001 LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then gt_cv_locale_fr_utf8=French_France.65001 else # None found. gt_cv_locale_fr_utf8=none fi ;; *) # Setting LC_ALL is not enough. Need to set LC_TIME to empty, because # otherwise on Mac OS X 10.3.5 the LC_TIME=C from the beginning of the # configure script would override the LC_ALL setting. Likewise for # LC_CTYPE, which is also set at the beginning of the configure script. # Test for the usual locale name. if (LC_ALL=fr_FR LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then gt_cv_locale_fr_utf8=fr_FR else # Test for the locale name with explicit encoding suffix. if (LC_ALL=fr_FR.UTF-8 LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then gt_cv_locale_fr_utf8=fr_FR.UTF-8 else # Test for the Solaris 7 locale name. if (LC_ALL=fr.UTF-8 LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then gt_cv_locale_fr_utf8=fr.UTF-8 else # None found. gt_cv_locale_fr_utf8=none fi fi fi ;; esac fi rm -fr conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_locale_fr_utf8" >&5 $as_echo "$gt_cv_locale_fr_utf8" >&6; } LOCALE_FR_UTF8=$gt_cv_locale_fr_utf8 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a transitional chinese locale" >&5 $as_echo_n "checking for a transitional chinese locale... " >&6; } if ${gt_cv_locale_zh_CN+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #if HAVE_LANGINFO_CODESET # include #endif #include #include struct tm t; char buf[16]; int main () { /* On BeOS and Haiku, locales are not implemented in libc. Rather, libintl imitates locale dependent behaviour by looking at the environment variables, and all locales use the UTF-8 encoding. */ #if defined __BEOS__ || defined __HAIKU__ return 1; #else /* Check whether the given locale name is recognized by the system. */ # if defined _WIN32 && !defined __CYGWIN__ /* On native Windows, setlocale(category, "") looks at the system settings, not at the environment variables. Also, when an encoding suffix such as ".65001" or ".54936" is specified, it succeeds but sets the LC_CTYPE category of the locale to "C". */ if (setlocale (LC_ALL, getenv ("LC_ALL")) == NULL || strcmp (setlocale (LC_CTYPE, NULL), "C") == 0) return 1; # else if (setlocale (LC_ALL, "") == NULL) return 1; # endif /* Check whether nl_langinfo(CODESET) is nonempty and not "ASCII" or "646". On Mac OS X 10.3.5 (Darwin 7.5) in the fr_FR locale, nl_langinfo(CODESET) is empty, and the behaviour of Tcl 8.4 in this locale is not useful. On OpenBSD 4.0, when an unsupported locale is specified, setlocale() succeeds but then nl_langinfo(CODESET) is "646". In this situation, some unit tests fail. On MirBSD 10, when an unsupported locale is specified, setlocale() succeeds but then nl_langinfo(CODESET) is "UTF-8". */ # if HAVE_LANGINFO_CODESET { const char *cs = nl_langinfo (CODESET); if (cs[0] == '\0' || strcmp (cs, "ASCII") == 0 || strcmp (cs, "646") == 0 || strcmp (cs, "UTF-8") == 0) return 1; } # endif # ifdef __CYGWIN__ /* On Cygwin, avoid locale names without encoding suffix, because the locale_charset() function relies on the encoding suffix. Note that LC_ALL is set on the command line. */ if (strchr (getenv ("LC_ALL"), '.') == NULL) return 1; # endif /* Check whether in a month name, no byte in the range 0x80..0x9F occurs. This excludes the UTF-8 encoding (except on MirBSD). */ { const char *p; t.tm_year = 1975 - 1900; t.tm_mon = 2 - 1; t.tm_mday = 4; if (strftime (buf, sizeof (buf), "%B", &t) < 2) return 1; for (p = buf; *p != '\0'; p++) if ((unsigned char) *p >= 0x80 && (unsigned char) *p < 0xa0) return 1; } /* Check whether a typical GB18030 multibyte sequence is recognized as a single wide character. This excludes the GB2312 and GBK encodings. */ if (mblen ("\203\062\332\066", 5) != 4) return 1; return 0; #endif } _ACEOF if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s conftest$ac_exeext; then case "$host_os" in # Handle native Windows specially, because there setlocale() interprets # "ar" as "Arabic" or "Arabic_Saudi Arabia.1256", # "fr" or "fra" as "French" or "French_France.1252", # "ge"(!) or "deu"(!) as "German" or "German_Germany.1252", # "ja" as "Japanese" or "Japanese_Japan.932", # and similar. mingw*) # Test for the hypothetical native Windows locale name. if (LC_ALL=Chinese_China.54936 LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then gt_cv_locale_zh_CN=Chinese_China.54936 else # None found. gt_cv_locale_zh_CN=none fi ;; solaris2.8) # On Solaris 8, the locales zh_CN.GB18030, zh_CN.GBK, zh.GBK are # broken. One witness is the test case in gl_MBRTOWC_SANITYCHECK. # Another witness is that "LC_ALL=zh_CN.GB18030 bash -c true" dumps core. gt_cv_locale_zh_CN=none ;; *) # Setting LC_ALL is not enough. Need to set LC_TIME to empty, because # otherwise on Mac OS X 10.3.5 the LC_TIME=C from the beginning of the # configure script would override the LC_ALL setting. Likewise for # LC_CTYPE, which is also set at the beginning of the configure script. # Test for the locale name without encoding suffix. if (LC_ALL=zh_CN LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then gt_cv_locale_zh_CN=zh_CN else # Test for the locale name with explicit encoding suffix. if (LC_ALL=zh_CN.GB18030 LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then gt_cv_locale_zh_CN=zh_CN.GB18030 else # None found. gt_cv_locale_zh_CN=none fi fi ;; esac else # If there was a link error, due to mblen(), the system is so old that # it certainly doesn't have a chinese locale. gt_cv_locale_zh_CN=none fi rm -fr conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_locale_zh_CN" >&5 $as_echo "$gt_cv_locale_zh_CN" >&6; } LOCALE_ZH_CN=$gt_cv_locale_zh_CN GNULIB_NL_LANGINFO=0; HAVE_NL_LANGINFO=1; REPLACE_NL_LANGINFO=0; GNULIB_LOCALECONV=0; GNULIB_SETLOCALE=0; GNULIB_SETLOCALE_NULL=0; GNULIB_DUPLOCALE=0; GNULIB_LOCALENAME=0; HAVE_NEWLOCALE=1; HAVE_DUPLOCALE=1; HAVE_FREELOCALE=1; REPLACE_LOCALECONV=0; REPLACE_SETLOCALE=0; REPLACE_NEWLOCALE=0; REPLACE_DUPLOCALE=0; REPLACE_FREELOCALE=0; REPLACE_STRUCT_LCONV=0; REPLACE_NULL=0; HAVE_MAX_ALIGN_T=1; HAVE_WCHAR_T=1; STDDEF_H= { $as_echo "$as_me:${as_lineno-$LINENO}: checking for good max_align_t" >&5 $as_echo_n "checking for good max_align_t... " >&6; } if ${gl_cv_type_max_align_t+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include unsigned int s = sizeof (max_align_t); #if defined __GNUC__ || defined __IBM__ALIGNOF__ int check1[2 * (__alignof__ (double) <= __alignof__ (max_align_t)) - 1]; int check2[2 * (__alignof__ (long double) <= __alignof__ (max_align_t)) - 1]; #endif int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : gl_cv_type_max_align_t=yes else gl_cv_type_max_align_t=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_type_max_align_t" >&5 $as_echo "$gl_cv_type_max_align_t" >&6; } if test $gl_cv_type_max_align_t = no; then HAVE_MAX_ALIGN_T=0 STDDEF_H=stddef.h fi if test $gt_cv_c_wchar_t = no; then HAVE_WCHAR_T=0 STDDEF_H=stddef.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether NULL can be used in arbitrary expressions" >&5 $as_echo_n "checking whether NULL can be used in arbitrary expressions... " >&6; } if ${gl_cv_decl_null_works+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int test[2 * (sizeof NULL == sizeof (void *)) -1]; int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : gl_cv_decl_null_works=yes else gl_cv_decl_null_works=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_decl_null_works" >&5 $as_echo "$gl_cv_decl_null_works" >&6; } if test $gl_cv_decl_null_works = no; then REPLACE_NULL=1 STDDEF_H=stddef.h fi if test -n "$STDDEF_H"; then GL_GENERATE_STDDEF_H_TRUE= GL_GENERATE_STDDEF_H_FALSE='#' else GL_GENERATE_STDDEF_H_TRUE='#' GL_GENERATE_STDDEF_H_FALSE= fi if test -n "$STDDEF_H"; then if test $gl_cv_have_include_next = yes; then gl_cv_next_stddef_h='<'stddef.h'>' else { $as_echo "$as_me:${as_lineno-$LINENO}: checking absolute name of " >&5 $as_echo_n "checking absolute name of ... " >&6; } if ${gl_cv_next_stddef_h+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF case "$host_os" in aix*) gl_absname_cpp="$ac_cpp -C" ;; *) gl_absname_cpp="$ac_cpp" ;; esac case "$host_os" in mingw*) gl_dirsep_regex='[/\\]' ;; *) gl_dirsep_regex='\/' ;; esac gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g' gl_header_literal_regex=`echo 'stddef.h' \ | sed -e "$gl_make_literal_regex_sed"` gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{ s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/ s|^/[^/]|//&| p q }' gl_cv_absolute_stddef_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 | sed -n "$gl_absolute_header_sed"` gl_header=$gl_cv_absolute_stddef_h gl_cv_next_stddef_h='"'$gl_header'"' fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_stddef_h" >&5 $as_echo "$gl_cv_next_stddef_h" >&6; } fi NEXT_STDDEF_H=$gl_cv_next_stddef_h if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next' gl_next_as_first_directive='<'stddef.h'>' else # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include' gl_next_as_first_directive=$gl_cv_next_stddef_h fi NEXT_AS_FIRST_DIRECTIVE_STDDEF_H=$gl_next_as_first_directive fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether locale.h defines locale_t" >&5 $as_echo_n "checking whether locale.h defines locale_t... " >&6; } if ${gl_cv_header_locale_has_locale_t+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include locale_t x; int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : gl_cv_header_locale_has_locale_t=yes else gl_cv_header_locale_has_locale_t=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_locale_has_locale_t" >&5 $as_echo "$gl_cv_header_locale_has_locale_t" >&6; } if test $ac_cv_header_xlocale_h = yes; then HAVE_XLOCALE_H=1 if test $gl_cv_header_locale_has_locale_t = yes; then gl_cv_header_locale_h_needs_xlocale_h=no else gl_cv_header_locale_h_needs_xlocale_h=yes fi HAVE_LOCALE_T=1 else HAVE_XLOCALE_H=0 gl_cv_header_locale_h_needs_xlocale_h=no if test $gl_cv_header_locale_has_locale_t = yes; then HAVE_LOCALE_T=1 else HAVE_LOCALE_T=0 fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for LC_MESSAGES" >&5 $as_echo_n "checking for LC_MESSAGES... " >&6; } if ${gt_cv_val_LC_MESSAGES+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { return LC_MESSAGES ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : gt_cv_val_LC_MESSAGES=yes else gt_cv_val_LC_MESSAGES=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_val_LC_MESSAGES" >&5 $as_echo "$gt_cv_val_LC_MESSAGES" >&6; } if test $gt_cv_val_LC_MESSAGES = yes; then $as_echo "#define HAVE_LC_MESSAGES 1" >>confdefs.h fi if test $ac_cv_func_uselocale = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether uselocale works" >&5 $as_echo_n "checking whether uselocale works... " >&6; } if ${gt_cv_func_uselocale_works+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : # Guess no on AIX and z/OS, yes otherwise. case "$host_os" in aix* | openedition*) gt_cv_func_uselocale_works="guessing no" ;; *) gt_cv_func_uselocale_works="guessing yes" ;; esac else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #if HAVE_XLOCALE_H # include #endif locale_t loc1; int main () { uselocale (NULL); setlocale (LC_ALL, "en_US.UTF-8"); return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : gt_cv_func_uselocale_works=yes else gt_cv_func_uselocale_works=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_func_uselocale_works" >&5 $as_echo "$gt_cv_func_uselocale_works" >&6; } else gt_cv_func_uselocale_works=no fi case "$gt_cv_func_uselocale_works" in *yes) $as_echo "#define HAVE_WORKING_USELOCALE 1" >>confdefs.h ;; esac case "$gt_cv_func_uselocale_works" in *yes) { $as_echo "$as_me:${as_lineno-$LINENO}: checking for fake locale system (OpenBSD)" >&5 $as_echo_n "checking for fake locale system (OpenBSD)... " >&6; } if ${gt_cv_locale_fake+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : case "$host_os" in openbsd*) gt_cv_locale_fake="guessing yes" ;; *) gt_cv_locale_fake="guessing no" ;; esac else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #if HAVE_XLOCALE_H # include #endif int main () { locale_t loc1, loc2; if (setlocale (LC_ALL, "de_DE.UTF-8") == NULL) return 1; if (setlocale (LC_ALL, "fr_FR.UTF-8") == NULL) return 1; loc1 = newlocale (LC_ALL_MASK, "de_DE.UTF-8", (locale_t)0); loc2 = newlocale (LC_ALL_MASK, "fr_FR.UTF-8", (locale_t)0); return !(loc1 == loc2); } _ACEOF if ac_fn_c_try_run "$LINENO"; then : gt_cv_locale_fake=yes else gt_cv_locale_fake=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_locale_fake" >&5 $as_echo "$gt_cv_locale_fake" >&6; } ;; *) gt_cv_locale_fake=no ;; esac case "$gt_cv_locale_fake" in *yes) $as_echo "#define HAVE_FAKE_LOCALES 1" >>confdefs.h ;; esac case "$gt_cv_func_uselocale_works" in *yes) { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Solaris 11.4 locale system" >&5 $as_echo_n "checking for Solaris 11.4 locale system... " >&6; } if ${gt_cv_locale_solaris114+:} false; then : $as_echo_n "(cached) " >&6 else case "$host_os" in solaris*) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include struct _LC_locale_t *x; locale_t y; int main () { *y = x; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : gt_cv_locale_solaris114=yes else gt_cv_locale_solaris114=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ;; *) gt_cv_locale_solaris114=no ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_locale_solaris114" >&5 $as_echo "$gt_cv_locale_solaris114" >&6; } ;; *) gt_cv_locale_solaris114=no ;; esac if test $gt_cv_locale_solaris114 = yes; then $as_echo "#define HAVE_SOLARIS114_LOCALES 1" >>confdefs.h fi case "$gt_cv_func_uselocale_works" in *yes) for ac_func in getlocalename_l do : ac_fn_c_check_func "$LINENO" "getlocalename_l" "ac_cv_func_getlocalename_l" if test "x$ac_cv_func_getlocalename_l" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_GETLOCALENAME_L 1 _ACEOF fi done ;; esac gt_nameless_locales=no case "$host_os" in aix*) gt_nameless_locales=yes $as_echo "#define HAVE_NAMELESS_LOCALES 1" >>confdefs.h ;; esac gl_threads_api=none LIBTHREAD= LTLIBTHREAD= LIBMULTITHREAD= LTLIBMULTITHREAD= if test "$gl_use_threads" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether imported symbols can be declared weak" >&5 $as_echo_n "checking whether imported symbols can be declared weak... " >&6; } if ${gl_cv_have_weak+:} false; then : $as_echo_n "(cached) " >&6 else gl_cv_have_weak=no cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ extern void xyzzy (); #pragma weak xyzzy int main () { xyzzy(); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : gl_cv_have_weak=maybe fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test $gl_cv_have_weak = maybe; then if test "$cross_compiling" = yes; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __ELF__ Extensible Linking Format #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "Extensible Linking Format" >/dev/null 2>&1; then : gl_cv_have_weak="guessing yes" else gl_cv_have_weak="guessing no" fi rm -f conftest* else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #pragma weak fputs int main () { return (fputs == NULL); } _ACEOF if ac_fn_c_try_run "$LINENO"; then : gl_cv_have_weak=yes else gl_cv_have_weak=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi case " $LDFLAGS " in *" -static "*) gl_cv_have_weak=no ;; esac case "$gl_cv_have_weak" in *yes) case "$host_os" in freebsd* | dragonfly*) : > conftest1.c $CC $CPPFLAGS $CFLAGS $LDFLAGS -fPIC -shared -o libempty.so conftest1.c -lpthread >&5 2>&1 cat < conftest2.c #include #pragma weak pthread_mutexattr_gettype int main () { return (pthread_mutexattr_gettype != NULL); } EOF $CC $CPPFLAGS $CFLAGS $LDFLAGS -o conftest conftest2.c libempty.so >&5 2>&1 \ || gl_cv_have_weak=no rm -f conftest1.c libempty.so conftest2.c conftest ;; esac ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_have_weak" >&5 $as_echo "$gl_cv_have_weak" >&6; } case "$gl_cv_have_weak" in *yes) $as_echo "#define HAVE_WEAK_SYMBOLS 1" >>confdefs.h ;; esac if case "$gl_cv_have_weak" in *yes) true;; *) false;; esac; then : fi if test "$gl_use_threads" = isoc || test "$gl_use_threads" = isoc+posix; then gl_have_isoc_threads="$ac_cv_header_threads_h" fi if test "$gl_use_threads" = yes \ || test "$gl_use_threads" = posix \ || test "$gl_use_threads" = isoc+posix; then if test -z "$gl_pthreadlib_body_done"; then gl_pthread_api=no LIBPTHREAD= LIBPMULTITHREAD= # On OSF/1, the compiler needs the flag -pthread or -D_REENTRANT so that # it groks . It's added above, in gl_ANYTHREADLIB_EARLY. ac_fn_c_check_header_mongrel "$LINENO" "pthread.h" "ac_cv_header_pthread_h" "$ac_includes_default" if test "x$ac_cv_header_pthread_h" = xyes; then : gl_have_pthread_h=yes else gl_have_pthread_h=no fi if test "$gl_have_pthread_h" = yes; then # Other possible tests: # -lpthreads (FSU threads, PCthreads) # -lgthreads # Test whether both pthread_mutex_lock and pthread_mutexattr_init exist # in libc. IRIX 6.5 has the first one in both libc and libpthread, but # the second one only in libpthread, and lock.c needs it. # # If -pthread works, prefer it to -lpthread, since Ubuntu 14.04 # needs -pthread for some reason. See: # https://lists.gnu.org/r/bug-gnulib/2014-09/msg00023.html save_LIBS=$LIBS for gl_pthread in '' '-pthread'; do LIBS="$LIBS $gl_pthread" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include pthread_mutex_t m; pthread_mutexattr_t ma; int main () { pthread_mutex_lock (&m); pthread_mutexattr_init (&ma); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : gl_pthread_api=yes LIBPTHREAD=$gl_pthread LIBPMULTITHREAD=$gl_pthread fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$save_LIBS test $gl_pthread_api = yes && break done # Test for libpthread by looking for pthread_kill. (Not pthread_self, # since it is defined as a macro on OSF/1.) if test $gl_pthread_api = yes && test -z "$LIBPTHREAD"; then # The program links fine without libpthread. But it may actually # need to link with libpthread in order to create multiple threads. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_kill in -lpthread" >&5 $as_echo_n "checking for pthread_kill in -lpthread... " >&6; } if ${ac_cv_lib_pthread_pthread_kill+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lpthread $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char pthread_kill (); int main () { return pthread_kill (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_pthread_pthread_kill=yes else ac_cv_lib_pthread_pthread_kill=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pthread_pthread_kill" >&5 $as_echo "$ac_cv_lib_pthread_pthread_kill" >&6; } if test "x$ac_cv_lib_pthread_pthread_kill" = xyes; then : LIBPMULTITHREAD=-lpthread # On Solaris and HP-UX, most pthread functions exist also in libc. # Therefore pthread_in_use() needs to actually try to create a # thread: pthread_create from libc will fail, whereas # pthread_create will actually create a thread. # On Solaris 10 or newer, this test is no longer needed, because # libc contains the fully functional pthread functions. case "$host_os" in solaris | solaris2.1-9 | solaris2.1-9.* | hpux*) $as_echo "#define PTHREAD_IN_USE_DETECTION_HARD 1" >>confdefs.h esac fi elif test $gl_pthread_api != yes; then # Some library is needed. Try libpthread and libc_r. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_kill in -lpthread" >&5 $as_echo_n "checking for pthread_kill in -lpthread... " >&6; } if ${ac_cv_lib_pthread_pthread_kill+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lpthread $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char pthread_kill (); int main () { return pthread_kill (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_pthread_pthread_kill=yes else ac_cv_lib_pthread_pthread_kill=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pthread_pthread_kill" >&5 $as_echo "$ac_cv_lib_pthread_pthread_kill" >&6; } if test "x$ac_cv_lib_pthread_pthread_kill" = xyes; then : gl_pthread_api=yes LIBPTHREAD=-lpthread LIBPMULTITHREAD=-lpthread fi if test $gl_pthread_api != yes; then # For FreeBSD 4. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_kill in -lc_r" >&5 $as_echo_n "checking for pthread_kill in -lc_r... " >&6; } if ${ac_cv_lib_c_r_pthread_kill+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lc_r $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char pthread_kill (); int main () { return pthread_kill (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_c_r_pthread_kill=yes else ac_cv_lib_c_r_pthread_kill=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_c_r_pthread_kill" >&5 $as_echo "$ac_cv_lib_c_r_pthread_kill" >&6; } if test "x$ac_cv_lib_c_r_pthread_kill" = xyes; then : gl_pthread_api=yes LIBPTHREAD=-lc_r LIBPMULTITHREAD=-lc_r fi fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether POSIX threads API is available" >&5 $as_echo_n "checking whether POSIX threads API is available... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_pthread_api" >&5 $as_echo "$gl_pthread_api" >&6; } if test $gl_pthread_api = yes; then $as_echo "#define HAVE_PTHREAD_API 1" >>confdefs.h fi cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { sched_yield (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : LIB_SCHED_YIELD= else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sched_yield in -lrt" >&5 $as_echo_n "checking for sched_yield in -lrt... " >&6; } if ${ac_cv_lib_rt_sched_yield+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lrt $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char sched_yield (); int main () { return sched_yield (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_rt_sched_yield=yes else ac_cv_lib_rt_sched_yield=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_rt_sched_yield" >&5 $as_echo "$ac_cv_lib_rt_sched_yield" >&6; } if test "x$ac_cv_lib_rt_sched_yield" = xyes; then : LIB_SCHED_YIELD=-lrt else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sched_yield in -lposix4" >&5 $as_echo_n "checking for sched_yield in -lposix4... " >&6; } if ${ac_cv_lib_posix4_sched_yield+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lposix4 $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char sched_yield (); int main () { return sched_yield (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_posix4_sched_yield=yes else ac_cv_lib_posix4_sched_yield=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_posix4_sched_yield" >&5 $as_echo "$ac_cv_lib_posix4_sched_yield" >&6; } if test "x$ac_cv_lib_posix4_sched_yield" = xyes; then : LIB_SCHED_YIELD=-lposix4 fi fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext gl_pthreadlib_body_done=done fi LIBTHREAD=$LIBPTHREAD LTLIBTHREAD=$LIBPTHREAD LIBMULTITHREAD=$LIBPMULTITHREAD LTLIBMULTITHREAD=$LIBPMULTITHREAD if test $gl_pthread_api = yes; then if test "$gl_use_threads" = isoc+posix && test "$gl_have_isoc_threads" = yes; then gl_threads_api='isoc+posix' $as_echo "#define USE_ISOC_AND_POSIX_THREADS 1" >>confdefs.h LIBTHREAD= LTLIBTHREAD= else gl_threads_api=posix $as_echo "#define USE_POSIX_THREADS 1" >>confdefs.h if test -n "$LIBMULTITHREAD" || test -n "$LTLIBMULTITHREAD"; then if case "$gl_cv_have_weak" in *yes) true;; *) false;; esac; then $as_echo "#define USE_POSIX_THREADS_WEAK 1" >>confdefs.h LIBTHREAD= LTLIBTHREAD= fi fi fi fi fi if test $gl_threads_api = none; then if test "$gl_use_threads" = isoc && test "$gl_have_isoc_threads" = yes; then if test -z "$gl_stdthreadlib_body_done"; then case "$host_os" in mingw*) LIBSTDTHREAD= ;; *) if test -z "$gl_pthreadlib_body_done"; then gl_pthread_api=no LIBPTHREAD= LIBPMULTITHREAD= # On OSF/1, the compiler needs the flag -pthread or -D_REENTRANT so that # it groks . It's added above, in gl_ANYTHREADLIB_EARLY. ac_fn_c_check_header_mongrel "$LINENO" "pthread.h" "ac_cv_header_pthread_h" "$ac_includes_default" if test "x$ac_cv_header_pthread_h" = xyes; then : gl_have_pthread_h=yes else gl_have_pthread_h=no fi if test "$gl_have_pthread_h" = yes; then # Other possible tests: # -lpthreads (FSU threads, PCthreads) # -lgthreads # Test whether both pthread_mutex_lock and pthread_mutexattr_init exist # in libc. IRIX 6.5 has the first one in both libc and libpthread, but # the second one only in libpthread, and lock.c needs it. # # If -pthread works, prefer it to -lpthread, since Ubuntu 14.04 # needs -pthread for some reason. See: # https://lists.gnu.org/r/bug-gnulib/2014-09/msg00023.html save_LIBS=$LIBS for gl_pthread in '' '-pthread'; do LIBS="$LIBS $gl_pthread" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include pthread_mutex_t m; pthread_mutexattr_t ma; int main () { pthread_mutex_lock (&m); pthread_mutexattr_init (&ma); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : gl_pthread_api=yes LIBPTHREAD=$gl_pthread LIBPMULTITHREAD=$gl_pthread fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$save_LIBS test $gl_pthread_api = yes && break done # Test for libpthread by looking for pthread_kill. (Not pthread_self, # since it is defined as a macro on OSF/1.) if test $gl_pthread_api = yes && test -z "$LIBPTHREAD"; then # The program links fine without libpthread. But it may actually # need to link with libpthread in order to create multiple threads. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_kill in -lpthread" >&5 $as_echo_n "checking for pthread_kill in -lpthread... " >&6; } if ${ac_cv_lib_pthread_pthread_kill+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lpthread $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char pthread_kill (); int main () { return pthread_kill (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_pthread_pthread_kill=yes else ac_cv_lib_pthread_pthread_kill=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pthread_pthread_kill" >&5 $as_echo "$ac_cv_lib_pthread_pthread_kill" >&6; } if test "x$ac_cv_lib_pthread_pthread_kill" = xyes; then : LIBPMULTITHREAD=-lpthread # On Solaris and HP-UX, most pthread functions exist also in libc. # Therefore pthread_in_use() needs to actually try to create a # thread: pthread_create from libc will fail, whereas # pthread_create will actually create a thread. # On Solaris 10 or newer, this test is no longer needed, because # libc contains the fully functional pthread functions. case "$host_os" in solaris | solaris2.1-9 | solaris2.1-9.* | hpux*) $as_echo "#define PTHREAD_IN_USE_DETECTION_HARD 1" >>confdefs.h esac fi elif test $gl_pthread_api != yes; then # Some library is needed. Try libpthread and libc_r. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_kill in -lpthread" >&5 $as_echo_n "checking for pthread_kill in -lpthread... " >&6; } if ${ac_cv_lib_pthread_pthread_kill+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lpthread $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char pthread_kill (); int main () { return pthread_kill (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_pthread_pthread_kill=yes else ac_cv_lib_pthread_pthread_kill=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pthread_pthread_kill" >&5 $as_echo "$ac_cv_lib_pthread_pthread_kill" >&6; } if test "x$ac_cv_lib_pthread_pthread_kill" = xyes; then : gl_pthread_api=yes LIBPTHREAD=-lpthread LIBPMULTITHREAD=-lpthread fi if test $gl_pthread_api != yes; then # For FreeBSD 4. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_kill in -lc_r" >&5 $as_echo_n "checking for pthread_kill in -lc_r... " >&6; } if ${ac_cv_lib_c_r_pthread_kill+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lc_r $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char pthread_kill (); int main () { return pthread_kill (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_c_r_pthread_kill=yes else ac_cv_lib_c_r_pthread_kill=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_c_r_pthread_kill" >&5 $as_echo "$ac_cv_lib_c_r_pthread_kill" >&6; } if test "x$ac_cv_lib_c_r_pthread_kill" = xyes; then : gl_pthread_api=yes LIBPTHREAD=-lc_r LIBPMULTITHREAD=-lc_r fi fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether POSIX threads API is available" >&5 $as_echo_n "checking whether POSIX threads API is available... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_pthread_api" >&5 $as_echo "$gl_pthread_api" >&6; } if test $gl_pthread_api = yes; then $as_echo "#define HAVE_PTHREAD_API 1" >>confdefs.h fi cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { sched_yield (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : LIB_SCHED_YIELD= else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sched_yield in -lrt" >&5 $as_echo_n "checking for sched_yield in -lrt... " >&6; } if ${ac_cv_lib_rt_sched_yield+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lrt $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char sched_yield (); int main () { return sched_yield (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_rt_sched_yield=yes else ac_cv_lib_rt_sched_yield=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_rt_sched_yield" >&5 $as_echo "$ac_cv_lib_rt_sched_yield" >&6; } if test "x$ac_cv_lib_rt_sched_yield" = xyes; then : LIB_SCHED_YIELD=-lrt else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sched_yield in -lposix4" >&5 $as_echo_n "checking for sched_yield in -lposix4... " >&6; } if ${ac_cv_lib_posix4_sched_yield+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lposix4 $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char sched_yield (); int main () { return sched_yield (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_posix4_sched_yield=yes else ac_cv_lib_posix4_sched_yield=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_posix4_sched_yield" >&5 $as_echo "$ac_cv_lib_posix4_sched_yield" >&6; } if test "x$ac_cv_lib_posix4_sched_yield" = xyes; then : LIB_SCHED_YIELD=-lposix4 fi fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext gl_pthreadlib_body_done=done fi if test $ac_cv_header_threads_h = yes; then for ac_func in thrd_create do : ac_fn_c_check_func "$LINENO" "thrd_create" "ac_cv_func_thrd_create" if test "x$ac_cv_func_thrd_create" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_THRD_CREATE 1 _ACEOF fi done if test $ac_cv_func_thrd_create = yes; then LIBSTDTHREAD= else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for thrd_create in -lstdthreads" >&5 $as_echo_n "checking for thrd_create in -lstdthreads... " >&6; } if ${ac_cv_lib_stdthreads_thrd_create+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lstdthreads $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char thrd_create (); int main () { return thrd_create (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_stdthreads_thrd_create=yes else ac_cv_lib_stdthreads_thrd_create=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_stdthreads_thrd_create" >&5 $as_echo "$ac_cv_lib_stdthreads_thrd_create" >&6; } if test "x$ac_cv_lib_stdthreads_thrd_create" = xyes; then : LIBSTDTHREAD='-lstdthreads -lpthread' else LIBSTDTHREAD="$LIBPMULTITHREAD" fi fi else LIBSTDTHREAD="$LIBPMULTITHREAD $LIB_SCHED_YIELD" fi ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ISO C threads API is available" >&5 $as_echo_n "checking whether ISO C threads API is available... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_threads_h" >&5 $as_echo "$ac_cv_header_threads_h" >&6; } gl_stdthreadlib_body_done=done fi LIBTHREAD=$LIBSTDTHREAD LTLIBTHREAD=$LIBSTDTHREAD LIBMULTITHREAD=$LIBSTDTHREAD LTLIBMULTITHREAD=$LIBSTDTHREAD gl_threads_api=isoc $as_echo "#define USE_ISOC_THREADS 1" >>confdefs.h fi fi if test $gl_threads_api = none; then case "$gl_use_threads" in yes | windows | win32) # The 'win32' is for backward compatibility. if { case "$host_os" in mingw*) true;; *) false;; esac }; then gl_threads_api=windows $as_echo "#define USE_WINDOWS_THREADS 1" >>confdefs.h fi ;; esac fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for multithread API to use" >&5 $as_echo_n "checking for multithread API to use... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_threads_api" >&5 $as_echo "$gl_threads_api" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether lstat correctly handles trailing slash" >&5 $as_echo_n "checking whether lstat correctly handles trailing slash... " >&6; } if ${gl_cv_func_lstat_dereferences_slashed_symlink+:} false; then : $as_echo_n "(cached) " >&6 else rm -f conftest.sym conftest.file echo >conftest.file if test "$cross_compiling" = yes; then : case "$host_os" in linux-* | linux) # Guess yes on Linux systems. gl_cv_func_lstat_dereferences_slashed_symlink="guessing yes" ;; *-gnu* | gnu*) # Guess yes on glibc systems. gl_cv_func_lstat_dereferences_slashed_symlink="guessing yes" ;; mingw*) # Guess no on native Windows. gl_cv_func_lstat_dereferences_slashed_symlink="guessing no" ;; *) # If we don't know, obey --enable-cross-guesses. gl_cv_func_lstat_dereferences_slashed_symlink="$gl_cross_guess_normal" ;; esac else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { struct stat sbuf; if (symlink ("conftest.file", "conftest.sym") != 0) return 1; /* Linux will dereference the symlink and fail, as required by POSIX. That is better in the sense that it means we will not have to compile and use the lstat wrapper. */ return lstat ("conftest.sym/", &sbuf) == 0; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : gl_cv_func_lstat_dereferences_slashed_symlink=yes else gl_cv_func_lstat_dereferences_slashed_symlink=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi rm -f conftest.sym conftest.file fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_lstat_dereferences_slashed_symlink" >&5 $as_echo "$gl_cv_func_lstat_dereferences_slashed_symlink" >&6; } case "$gl_cv_func_lstat_dereferences_slashed_symlink" in *yes) cat >>confdefs.h <<_ACEOF #define LSTAT_FOLLOWS_SLASHED_SYMLINK 1 _ACEOF ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether malloc, realloc, calloc are POSIX compliant" >&5 $as_echo_n "checking whether malloc, realloc, calloc are POSIX compliant... " >&6; } if ${gl_cv_func_malloc_posix+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #if defined _WIN32 && ! defined __CYGWIN__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : gl_cv_func_malloc_posix=yes else gl_cv_func_malloc_posix=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_malloc_posix" >&5 $as_echo "$gl_cv_func_malloc_posix" >&6; } for ac_header in stdlib.h do : ac_fn_c_check_header_mongrel "$LINENO" "stdlib.h" "ac_cv_header_stdlib_h" "$ac_includes_default" if test "x$ac_cv_header_stdlib_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_STDLIB_H 1 _ACEOF fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU libc compatible malloc" >&5 $as_echo_n "checking for GNU libc compatible malloc... " >&6; } if ${ac_cv_func_malloc_0_nonnull+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : case "$host_os" in # Guess yes on platforms where we know the result. *-gnu* | gnu* | *-musl* | freebsd* | netbsd* | openbsd* \ | hpux* | solaris* | cygwin* | mingw*) ac_cv_func_malloc_0_nonnull="guessing yes" ;; # If we don't know, obey --enable-cross-guesses. *) ac_cv_func_malloc_0_nonnull="$gl_cross_guess_normal" ;; esac else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #if defined STDC_HEADERS || defined HAVE_STDLIB_H # include #else char *malloc (); #endif int main () { char *p = malloc (0); int result = !p; free (p); return result; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_func_malloc_0_nonnull=yes else ac_cv_func_malloc_0_nonnull=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_malloc_0_nonnull" >&5 $as_echo "$ac_cv_func_malloc_0_nonnull" >&6; } case "$ac_cv_func_malloc_0_nonnull" in *yes) gl_cv_func_malloc_0_nonnull=1 ;; *) gl_cv_func_malloc_0_nonnull=0 ;; esac cat >>confdefs.h <<_ACEOF #define MALLOC_0_IS_NONNULL $gl_cv_func_malloc_0_nonnull _ACEOF { $as_echo "$as_me:${as_lineno-$LINENO}: checking for mbstate_t" >&5 $as_echo_n "checking for mbstate_t... " >&6; } if ${ac_cv_type_mbstate_t+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default /* Tru64 with Desktop Toolkit C has a bug: must be included before . BSD/OS 4.0.1 has a bug: , and must be included before . */ #include #include #include #include int main () { mbstate_t x; return sizeof x; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_type_mbstate_t=yes else ac_cv_type_mbstate_t=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_type_mbstate_t" >&5 $as_echo "$ac_cv_type_mbstate_t" >&6; } if test $ac_cv_type_mbstate_t = yes; then $as_echo "#define HAVE_MBSTATE_T 1" >>confdefs.h else $as_echo "#define mbstate_t int" >>confdefs.h fi # Check for mmap(). Don't use AC_FUNC_MMAP, because it checks too much: it # fails on HP-UX 11, because MAP_FIXED mappings do not work. But this is # irrelevant for anonymous mappings. ac_fn_c_check_func "$LINENO" "mmap" "ac_cv_func_mmap" if test "x$ac_cv_func_mmap" = xyes; then : gl_have_mmap=yes else gl_have_mmap=no fi # Try to allow MAP_ANONYMOUS. gl_have_mmap_anonymous=no if test $gl_have_mmap = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for MAP_ANONYMOUS" >&5 $as_echo_n "checking for MAP_ANONYMOUS... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #ifdef MAP_ANONYMOUS I cannot identify this map #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "I cannot identify this map" >/dev/null 2>&1; then : gl_have_mmap_anonymous=yes fi rm -f conftest* if test $gl_have_mmap_anonymous != yes; then cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #ifdef MAP_ANON I cannot identify this map #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "I cannot identify this map" >/dev/null 2>&1; then : $as_echo "#define MAP_ANONYMOUS MAP_ANON" >>confdefs.h gl_have_mmap_anonymous=yes fi rm -f conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_have_mmap_anonymous" >&5 $as_echo "$gl_have_mmap_anonymous" >&6; } if test $gl_have_mmap_anonymous = yes; then $as_echo "#define HAVE_MAP_ANONYMOUS 1" >>confdefs.h fi fi # Detect platform-specific bugs in some versions of glibc: # memchr should not dereference anything with length 0 # https://bugzilla.redhat.com/show_bug.cgi?id=499689 # memchr should not dereference overestimated length after a match # https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=521737 # https://sourceware.org/bugzilla/show_bug.cgi?id=10162 # memchr should cast the second argument to 'unsigned char'. # This bug exists in Android 4.3. # Assume that memchr works on platforms that lack mprotect. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether memchr works" >&5 $as_echo_n "checking whether memchr works... " >&6; } if ${gl_cv_func_memchr_works+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : case "$host_os" in # Guess no on Android. linux*-android*) gl_cv_func_memchr_works="guessing no" ;; # Guess yes on native Windows. mingw*) gl_cv_func_memchr_works="guessing yes" ;; # If we don't know, obey --enable-cross-guesses. *) gl_cv_func_memchr_works="$gl_cross_guess_normal" ;; esac else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #if HAVE_SYS_MMAN_H # include # include # include # include # ifndef MAP_FILE # define MAP_FILE 0 # endif #endif int main () { int result = 0; char *fence = NULL; #if HAVE_SYS_MMAN_H && HAVE_MPROTECT # if HAVE_MAP_ANONYMOUS const int flags = MAP_ANONYMOUS | MAP_PRIVATE; const int fd = -1; # else /* !HAVE_MAP_ANONYMOUS */ const int flags = MAP_FILE | MAP_PRIVATE; int fd = open ("/dev/zero", O_RDONLY, 0666); if (fd >= 0) # endif { int pagesize = getpagesize (); char *two_pages = (char *) mmap (NULL, 2 * pagesize, PROT_READ | PROT_WRITE, flags, fd, 0); if (two_pages != (char *)(-1) && mprotect (two_pages + pagesize, pagesize, PROT_NONE) == 0) fence = two_pages + pagesize; } #endif if (fence) { if (memchr (fence, 0, 0)) result |= 1; strcpy (fence - 9, "12345678"); if (memchr (fence - 9, 0, 79) != fence - 1) result |= 2; if (memchr (fence - 1, 0, 3) != fence - 1) result |= 4; } /* Test against bug on Android 4.3. */ { char input[3]; input[0] = 'a'; input[1] = 'b'; input[2] = 'c'; if (memchr (input, 0x789abc00 | 'b', 3) != input + 1) result |= 8; } return result; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : gl_cv_func_memchr_works=yes else gl_cv_func_memchr_works=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_memchr_works" >&5 $as_echo "$gl_cv_func_memchr_works" >&6; } case "$gl_cv_func_memchr_works" in *yes) ;; *) REPLACE_MEMCHR=1 ;; esac ac_fn_c_check_decl "$LINENO" "memmem" "ac_cv_have_decl_memmem" "$ac_includes_default" if test "x$ac_cv_have_decl_memmem" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_MEMMEM $ac_have_decl _ACEOF for ac_func in memmem do : ac_fn_c_check_func "$LINENO" "memmem" "ac_cv_func_memmem" if test "x$ac_cv_func_memmem" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_MEMMEM 1 _ACEOF fi done if test $ac_cv_func_memmem = yes; then HAVE_MEMMEM=1 else HAVE_MEMMEM=0 fi if test $ac_cv_have_decl_memmem = no; then HAVE_DECL_MEMMEM=0 else { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether memmem works" >&5 $as_echo_n "checking whether memmem works... " >&6; } if ${gl_cv_func_memmem_works_always+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __GNU_LIBRARY__ #include #if ((__GLIBC__ == 2 && ((__GLIBC_MINOR > 0 && __GLIBC_MINOR__ < 9) \ || __GLIBC_MINOR__ > 12)) \ || (__GLIBC__ > 2)) \ || defined __UCLIBC__ Lucky user #endif #elif defined __CYGWIN__ #include #if CYGWIN_VERSION_DLL_COMBINED > CYGWIN_VERSION_DLL_MAKE_COMBINED (1007, 7) Lucky user #endif #else Lucky user #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "Lucky user" >/dev/null 2>&1; then : gl_cv_func_memmem_works_always="guessing yes" else gl_cv_func_memmem_works_always="$gl_cross_guess_normal" fi rm -f conftest* else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include /* for memmem */ #define P "_EF_BF_BD" #define HAYSTACK "F_BD_CE_BD" P P P P "_C3_88_20" P P P "_C3_A7_20" P #define NEEDLE P P P P P int main () { int result = 0; if (memmem (HAYSTACK, strlen (HAYSTACK), NEEDLE, strlen (NEEDLE))) result |= 1; /* Check for empty needle behavior. */ { const char *haystack = "AAA"; if (memmem (haystack, 3, (const char *) 1, 0) != haystack) result |= 2; } return result; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : gl_cv_func_memmem_works_always=yes else gl_cv_func_memmem_works_always=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_memmem_works_always" >&5 $as_echo "$gl_cv_func_memmem_works_always" >&6; } case "$gl_cv_func_memmem_works_always" in *yes) ;; *) REPLACE_MEMMEM=1 ;; esac fi : ac_fn_c_check_decl "$LINENO" "memrchr" "ac_cv_have_decl_memrchr" "$ac_includes_default" if test "x$ac_cv_have_decl_memrchr" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_MEMRCHR $ac_have_decl _ACEOF { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether defines MIN and MAX" >&5 $as_echo_n "checking whether defines MIN and MAX... " >&6; } if ${gl_cv_minmax_in_limits_h+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int x = MIN (42, 17); int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : gl_cv_minmax_in_limits_h=yes else gl_cv_minmax_in_limits_h=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_minmax_in_limits_h" >&5 $as_echo "$gl_cv_minmax_in_limits_h" >&6; } if test $gl_cv_minmax_in_limits_h = yes; then $as_echo "#define HAVE_MINMAX_IN_LIMITS_H 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether defines MIN and MAX" >&5 $as_echo_n "checking whether defines MIN and MAX... " >&6; } if ${gl_cv_minmax_in_sys_param_h+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int x = MIN (42, 17); int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : gl_cv_minmax_in_sys_param_h=yes else gl_cv_minmax_in_sys_param_h=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_minmax_in_sys_param_h" >&5 $as_echo "$gl_cv_minmax_in_sys_param_h" >&6; } if test $gl_cv_minmax_in_sys_param_h = yes; then $as_echo "#define HAVE_MINMAX_IN_SYS_PARAM_H 1" >>confdefs.h fi GNULIB_CTIME=0; GNULIB_MKTIME=0; GNULIB_LOCALTIME=0; GNULIB_NANOSLEEP=0; GNULIB_STRFTIME=0; GNULIB_STRPTIME=0; GNULIB_TIMEGM=0; GNULIB_TIME_R=0; GNULIB_TIME_RZ=0; GNULIB_TZSET=0; HAVE_DECL_LOCALTIME_R=1; HAVE_NANOSLEEP=1; HAVE_STRPTIME=1; HAVE_TIMEGM=1; HAVE_TZSET=1; HAVE_TIMEZONE_T=0; REPLACE_CTIME=GNULIB_PORTCHECK; REPLACE_LOCALTIME_R=GNULIB_PORTCHECK; REPLACE_MKTIME=GNULIB_PORTCHECK; REPLACE_NANOSLEEP=GNULIB_PORTCHECK; REPLACE_STRFTIME=GNULIB_PORTCHECK; REPLACE_TIMEGM=GNULIB_PORTCHECK; REPLACE_TZSET=GNULIB_PORTCHECK; : ${GNULIB_GETTIMEOFDAY=0}; REPLACE_GMTIME=0; REPLACE_LOCALTIME=0; { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether time_t is signed" >&5 $as_echo_n "checking whether time_t is signed... " >&6; } if ${gl_cv_time_t_is_signed+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include char time_t_signed[(time_t) -1 < 0 ? 1 : -1]; int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : gl_cv_time_t_is_signed=yes else gl_cv_time_t_is_signed=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_time_t_is_signed" >&5 $as_echo "$gl_cv_time_t_is_signed" >&6; } if test $gl_cv_time_t_is_signed = yes; then $as_echo "#define TIME_T_IS_SIGNED 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working mktime" >&5 $as_echo_n "checking for working mktime... " >&6; } if ${gl_cv_func_working_mktime+:} false; then : $as_echo_n "(cached) " >&6 else if test $APPLE_UNIVERSAL_BUILD = 1; then # A universal build on Apple Mac OS X platforms. # The test result would be 'yes' in 32-bit mode and 'no' in 64-bit mode. # But we need a configuration result that is valid in both modes. gl_cv_func_working_mktime="guessing no" else if test "$cross_compiling" = yes; then : case "$host_os" in # Guess no on native Windows. mingw*) gl_cv_func_working_mktime="guessing no" ;; *) gl_cv_func_working_mktime="$gl_cross_guess_normal" ;; esac else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Test program from Paul Eggert and Tony Leneis. */ #include #include #include #ifdef HAVE_UNISTD_H # include #endif #if HAVE_DECL_ALARM # include #endif #ifndef TIME_T_IS_SIGNED # define TIME_T_IS_SIGNED 0 #endif /* Work around redefinition to rpl_putenv by other config tests. */ #undef putenv static time_t time_t_max; static time_t time_t_min; /* Values we'll use to set the TZ environment variable. */ static char *tz_strings[] = { (char *) 0, "TZ=GMT0", "TZ=JST-9", "TZ=EST+3EDT+2,M10.1.0/00:00:00,M2.3.0/00:00:00" }; #define N_STRINGS (sizeof (tz_strings) / sizeof (tz_strings[0])) /* Return 0 if mktime fails to convert a date in the spring-forward gap. Based on a problem report from Andreas Jaeger. */ static int spring_forward_gap () { /* glibc (up to about 1998-10-07) failed this test. */ struct tm tm; /* Use the portable POSIX.1 specification "TZ=PST8PDT,M4.1.0,M10.5.0" instead of "TZ=America/Vancouver" in order to detect the bug even on systems that don't support the Olson extension, or don't have the full zoneinfo tables installed. */ putenv ("TZ=PST8PDT,M4.1.0,M10.5.0"); tm.tm_year = 98; tm.tm_mon = 3; tm.tm_mday = 5; tm.tm_hour = 2; tm.tm_min = 0; tm.tm_sec = 0; tm.tm_isdst = -1; return mktime (&tm) != (time_t) -1; } static int mktime_test1 (time_t now) { struct tm *lt; return ! (lt = localtime (&now)) || mktime (lt) == now; } static int mktime_test (time_t now) { return (mktime_test1 (now) && mktime_test1 ((time_t) (time_t_max - now)) && mktime_test1 ((time_t) (time_t_min + now))); } static int irix_6_4_bug () { /* Based on code from Ariel Faigon. */ struct tm tm; tm.tm_year = 96; tm.tm_mon = 3; tm.tm_mday = 0; tm.tm_hour = 0; tm.tm_min = 0; tm.tm_sec = 0; tm.tm_isdst = -1; mktime (&tm); return tm.tm_mon == 2 && tm.tm_mday == 31; } static int bigtime_test (int j) { struct tm tm; time_t now; tm.tm_year = tm.tm_mon = tm.tm_mday = tm.tm_hour = tm.tm_min = tm.tm_sec = j; now = mktime (&tm); if (now != (time_t) -1) { struct tm *lt = localtime (&now); if (! (lt && lt->tm_year == tm.tm_year && lt->tm_mon == tm.tm_mon && lt->tm_mday == tm.tm_mday && lt->tm_hour == tm.tm_hour && lt->tm_min == tm.tm_min && lt->tm_sec == tm.tm_sec && lt->tm_yday == tm.tm_yday && lt->tm_wday == tm.tm_wday && ((lt->tm_isdst < 0 ? -1 : 0 < lt->tm_isdst) == (tm.tm_isdst < 0 ? -1 : 0 < tm.tm_isdst)))) return 0; } return 1; } static int year_2050_test () { /* The correct answer for 2050-02-01 00:00:00 in Pacific time, ignoring leap seconds. */ unsigned long int answer = 2527315200UL; struct tm tm; time_t t; tm.tm_year = 2050 - 1900; tm.tm_mon = 2 - 1; tm.tm_mday = 1; tm.tm_hour = tm.tm_min = tm.tm_sec = 0; tm.tm_isdst = -1; /* Use the portable POSIX.1 specification "TZ=PST8PDT,M4.1.0,M10.5.0" instead of "TZ=America/Vancouver" in order to detect the bug even on systems that don't support the Olson extension, or don't have the full zoneinfo tables installed. */ putenv ("TZ=PST8PDT,M4.1.0,M10.5.0"); t = mktime (&tm); /* Check that the result is either a failure, or close enough to the correct answer that we can assume the discrepancy is due to leap seconds. */ return (t == (time_t) -1 || (0 < t && answer - 120 <= t && t <= answer + 120)); } int main () { int result = 0; time_t t, delta; int i, j; int time_t_signed_magnitude = (time_t) ~ (time_t) 0 < (time_t) -1; #if HAVE_DECL_ALARM /* This test makes some buggy mktime implementations loop. Give up after 60 seconds; a mktime slower than that isn't worth using anyway. */ signal (SIGALRM, SIG_DFL); alarm (60); #endif time_t_max = (! TIME_T_IS_SIGNED ? (time_t) -1 : ((((time_t) 1 << (sizeof (time_t) * CHAR_BIT - 2)) - 1) * 2 + 1)); time_t_min = (! TIME_T_IS_SIGNED ? (time_t) 0 : time_t_signed_magnitude ? ~ (time_t) 0 : ~ time_t_max); delta = time_t_max / 997; /* a suitable prime number */ for (i = 0; i < N_STRINGS; i++) { if (tz_strings[i]) putenv (tz_strings[i]); for (t = 0; t <= time_t_max - delta && (result & 1) == 0; t += delta) if (! mktime_test (t)) result |= 1; if ((result & 2) == 0 && ! (mktime_test ((time_t) 1) && mktime_test ((time_t) (60 * 60)) && mktime_test ((time_t) (60 * 60 * 24)))) result |= 2; for (j = 1; (result & 4) == 0; j <<= 1) { if (! bigtime_test (j)) result |= 4; if (INT_MAX / 2 < j) break; } if ((result & 8) == 0 && ! bigtime_test (INT_MAX)) result |= 8; } if (! irix_6_4_bug ()) result |= 16; if (! spring_forward_gap ()) result |= 32; if (! year_2050_test ()) result |= 64; return result; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : gl_cv_func_working_mktime=yes else gl_cv_func_working_mktime=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_working_mktime" >&5 $as_echo "$gl_cv_func_working_mktime" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether struct tm is in sys/time.h or time.h" >&5 $as_echo_n "checking whether struct tm is in sys/time.h or time.h... " >&6; } if ${ac_cv_struct_tm+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { struct tm tm; int *p = &tm.tm_sec; return !p; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_struct_tm=time.h else ac_cv_struct_tm=sys/time.h fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_struct_tm" >&5 $as_echo "$ac_cv_struct_tm" >&6; } if test $ac_cv_struct_tm = sys/time.h; then $as_echo "#define TM_IN_SYS_TIME 1" >>confdefs.h fi ac_fn_c_check_member "$LINENO" "struct tm" "tm_zone" "ac_cv_member_struct_tm_tm_zone" "#include #include <$ac_cv_struct_tm> " if test "x$ac_cv_member_struct_tm_tm_zone" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_STRUCT_TM_TM_ZONE 1 _ACEOF fi if test "$ac_cv_member_struct_tm_tm_zone" = yes; then $as_echo "#define HAVE_TM_ZONE 1" >>confdefs.h else ac_fn_c_check_decl "$LINENO" "tzname" "ac_cv_have_decl_tzname" "#include " if test "x$ac_cv_have_decl_tzname" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_TZNAME $ac_have_decl _ACEOF { $as_echo "$as_me:${as_lineno-$LINENO}: checking for tzname" >&5 $as_echo_n "checking for tzname... " >&6; } if ${ac_cv_var_tzname+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #if !HAVE_DECL_TZNAME extern char *tzname[]; #endif int main () { return tzname[0][0]; ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_var_tzname=yes else ac_cv_var_tzname=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_var_tzname" >&5 $as_echo "$ac_cv_var_tzname" >&6; } if test $ac_cv_var_tzname = yes; then $as_echo "#define HAVE_TZNAME 1" >>confdefs.h fi fi ac_fn_c_check_member "$LINENO" "struct tm" "tm_gmtoff" "ac_cv_member_struct_tm_tm_gmtoff" "#include " if test "x$ac_cv_member_struct_tm_tm_gmtoff" = xyes; then : $as_echo "#define HAVE_TM_GMTOFF 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for O_CLOEXEC" >&5 $as_echo_n "checking for O_CLOEXEC... " >&6; } if ${gl_cv_macro_O_CLOEXEC+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #ifndef O_CLOEXEC choke me; #endif int main () { return O_CLOEXEC; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : gl_cv_macro_O_CLOEXEC=yes else gl_cv_macro_O_CLOEXEC=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_macro_O_CLOEXEC" >&5 $as_echo "$gl_cv_macro_O_CLOEXEC" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for promoted mode_t type" >&5 $as_echo_n "checking for promoted mode_t type... " >&6; } if ${gl_cv_promoted_mode_t+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { typedef int array[2 * (sizeof (mode_t) < sizeof (int)) - 1]; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : gl_cv_promoted_mode_t='int' else gl_cv_promoted_mode_t='mode_t' fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_promoted_mode_t" >&5 $as_echo "$gl_cv_promoted_mode_t" >&6; } cat >>confdefs.h <<_ACEOF #define PROMOTED_MODE_T $gl_cv_promoted_mode_t _ACEOF gl_cv_func_vfprintf_posix=no case "$gl_cv_func_printf_sizes_c99" in *yes) case "$gl_cv_func_printf_long_double" in *yes) case "$gl_cv_func_printf_infinite" in *yes) case "$gl_cv_func_printf_infinite_long_double" in *yes) case "$gl_cv_func_printf_directive_a" in *yes) case "$gl_cv_func_printf_directive_f" in *yes) case "$gl_cv_func_printf_directive_n" in *yes) case "$gl_cv_func_printf_directive_ls" in *yes) case "$gl_cv_func_printf_positions" in *yes) case "$gl_cv_func_printf_flag_grouping" in *yes) case "$gl_cv_func_printf_flag_leftadjust" in *yes) case "$gl_cv_func_printf_flag_zero" in *yes) case "$gl_cv_func_printf_precision" in *yes) case "$gl_cv_func_printf_enomem" in *yes) # vfprintf exists and is # already POSIX compliant. gl_cv_func_vfprintf_posix=yes ;; esac ;; esac ;; esac ;; esac ;; esac ;; esac ;; esac ;; esac ;; esac ;; esac ;; esac ;; esac ;; esac ;; esac if test $gl_cv_func_vfprintf_posix = no; then case "$gl_cv_func_printf_infinite" in *yes) ;; *) $as_echo "#define NEED_PRINTF_INFINITE_DOUBLE 1" >>confdefs.h ;; esac case "$gl_cv_func_printf_long_double" in *yes) case "$gl_cv_func_printf_infinite_long_double" in *yes) ;; *) $as_echo "#define NEED_PRINTF_INFINITE_LONG_DOUBLE 1" >>confdefs.h ;; esac ;; esac case "$gl_cv_func_printf_directive_a" in *yes) ;; *) $as_echo "#define NEED_PRINTF_DIRECTIVE_A 1" >>confdefs.h for ac_func in nl_langinfo do : ac_fn_c_check_func "$LINENO" "nl_langinfo" "ac_cv_func_nl_langinfo" if test "x$ac_cv_func_nl_langinfo" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_NL_LANGINFO 1 _ACEOF fi done ;; esac case "$gl_cv_func_printf_directive_f" in *yes) ;; *) $as_echo "#define NEED_PRINTF_DIRECTIVE_F 1" >>confdefs.h ;; esac case "$gl_cv_func_printf_directive_ls" in *yes) ;; *) $as_echo "#define NEED_PRINTF_DIRECTIVE_LS 1" >>confdefs.h ;; esac case "$gl_cv_func_printf_flag_grouping" in *yes) ;; *) $as_echo "#define NEED_PRINTF_FLAG_GROUPING 1" >>confdefs.h ;; esac case "$gl_cv_func_printf_flag_leftadjust" in *yes) ;; *) $as_echo "#define NEED_PRINTF_FLAG_LEFTADJUST 1" >>confdefs.h ;; esac case "$gl_cv_func_printf_flag_zero" in *yes) ;; *) $as_echo "#define NEED_PRINTF_FLAG_ZERO 1" >>confdefs.h ;; esac case "$gl_cv_func_printf_precision" in *yes) ;; *) $as_echo "#define NEED_PRINTF_UNBOUNDED_PRECISION 1" >>confdefs.h $as_echo "#define NEED_PRINTF_DOUBLE 1" >>confdefs.h $as_echo "#define NEED_PRINTF_LONG_DOUBLE 1" >>confdefs.h ;; esac case "$gl_cv_func_printf_enomem" in *yes) ;; *) $as_echo "#define NEED_PRINTF_ENOMEM 1" >>confdefs.h $as_echo "#define NEED_PRINTF_DOUBLE 1" >>confdefs.h $as_echo "#define NEED_PRINTF_LONG_DOUBLE 1" >>confdefs.h ;; esac gl_LIBOBJS="$gl_LIBOBJS vasnprintf.$ac_objext" gl_LIBOBJS="$gl_LIBOBJS printf-args.$ac_objext" gl_LIBOBJS="$gl_LIBOBJS printf-parse.$ac_objext" gl_LIBOBJS="$gl_LIBOBJS asnprintf.$ac_objext" if test $ac_cv_func_vasnprintf = yes; then $as_echo "#define REPLACE_VASNPRINTF 1" >>confdefs.h fi ac_fn_c_check_type "$LINENO" "ptrdiff_t" "ac_cv_type_ptrdiff_t" "$ac_includes_default" if test "x$ac_cv_type_ptrdiff_t" = xyes; then : else $as_echo "#define ptrdiff_t long" >>confdefs.h fi gl_LIBOBJS="$gl_LIBOBJS vfprintf.$ac_objext" REPLACE_VFPRINTF=1 $as_echo "#define REPLACE_VFPRINTF_POSIX 1" >>confdefs.h : fi cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef _MSC_VER MicrosoftCompiler #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "MicrosoftCompiler" >/dev/null 2>&1; then : gl_asmext='asm' gl_c_asm_opt='-c -Fa' else gl_asmext='s' gl_c_asm_opt='-S' fi rm -f conftest* { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C symbols are prefixed with underscore at the linker level" >&5 $as_echo_n "checking whether C symbols are prefixed with underscore at the linker level... " >&6; } if ${gl_cv_prog_as_underscore+:} false; then : $as_echo_n "(cached) " >&6 else cat > conftest.c <&5 (eval $ac_try) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; } >/dev/null 2>&1 if LC_ALL=C $EGREP '(^|[^a-zA-Z0-9_])_foo([^a-zA-Z0-9_]|$)' conftest.$gl_asmext >/dev/null; then gl_cv_prog_as_underscore=yes else gl_cv_prog_as_underscore=no fi rm -f conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_prog_as_underscore" >&5 $as_echo "$gl_cv_prog_as_underscore" >&6; } if test $gl_cv_prog_as_underscore = yes; then USER_LABEL_PREFIX=_ else USER_LABEL_PREFIX= fi cat >>confdefs.h <<_ACEOF #define USER_LABEL_PREFIX $USER_LABEL_PREFIX _ACEOF ASM_SYMBOL_PREFIX='"'${USER_LABEL_PREFIX}'"' GNULIB_PTHREAD_SIGMASK=0; GNULIB_RAISE=0; GNULIB_SIGNAL_H_SIGPIPE=0; GNULIB_SIGPROCMASK=0; GNULIB_SIGACTION=0; HAVE_POSIX_SIGNALBLOCKING=1; HAVE_PTHREAD_SIGMASK=1; HAVE_RAISE=1; HAVE_SIGSET_T=1; HAVE_SIGINFO_T=1; HAVE_SIGACTION=1; HAVE_STRUCT_SIGACTION_SA_SIGACTION=1; HAVE_TYPE_VOLATILE_SIG_ATOMIC_T=1; HAVE_SIGHANDLER_T=1; REPLACE_PTHREAD_SIGMASK=0; REPLACE_RAISE=0; ac_fn_c_check_type "$LINENO" "sigset_t" "ac_cv_type_sigset_t" " #include /* Mingw defines sigset_t not in , but in . */ #include " if test "x$ac_cv_type_sigset_t" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_SIGSET_T 1 _ACEOF gl_cv_type_sigset_t=yes else gl_cv_type_sigset_t=no fi if test $gl_cv_type_sigset_t != yes; then HAVE_SIGSET_T=0 fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C Library >= 2.1 or uClibc" >&5 $as_echo_n "checking whether we are using the GNU C Library >= 2.1 or uClibc... " >&6; } if ${ac_cv_gnu_library_2_1+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #ifdef __GNU_LIBRARY__ #if (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 1) || (__GLIBC__ > 2) Lucky GNU user #endif #endif #ifdef __UCLIBC__ Lucky user #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "Lucky" >/dev/null 2>&1; then : ac_cv_gnu_library_2_1=yes else ac_cv_gnu_library_2_1=no fi rm -f conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_gnu_library_2_1" >&5 $as_echo "$ac_cv_gnu_library_2_1" >&6; } GLIBC21="$ac_cv_gnu_library_2_1" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shared library path variable" >&5 $as_echo_n "checking for shared library path variable... " >&6; } if ${acl_cv_libpath+:} false; then : $as_echo_n "(cached) " >&6 else LD="$LD" \ ${CONFIG_SHELL-/bin/sh} "$ac_aux_dir/config.libpath" "$host" > conftest.sh . ./conftest.sh rm -f ./conftest.sh acl_cv_libpath=${acl_cv_shlibpath_var:-none} fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $acl_cv_libpath" >&5 $as_echo "$acl_cv_libpath" >&6; } shlibpath_var="$acl_cv_shlibpath_var" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to activate relocatable installation" >&5 $as_echo_n "checking whether to activate relocatable installation... " >&6; } # Check whether --enable-relocatable was given. if test "${enable_relocatable+set}" = set; then : enableval=$enable_relocatable; if test "$enableval" != no; then RELOCATABLE=yes else RELOCATABLE=no fi else RELOCATABLE=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RELOCATABLE" >&5 $as_echo "$RELOCATABLE" >&6; } if test "X$prefix" = "XNONE"; then reloc_final_prefix="$ac_default_prefix" else reloc_final_prefix="$prefix" fi cat >>confdefs.h <<_ACEOF #define INSTALLPREFIX "${reloc_final_prefix}" _ACEOF if test $RELOCATABLE = yes; then $as_echo "#define ENABLE_RELOCATABLE 1" >>confdefs.h fi is_noop=no use_elf_origin_trick=no use_macos_tools=no use_wrapper=no if test $RELOCATABLE = yes; then # --enable-relocatable implies --disable-rpath enable_rpath=no for ac_header in mach-o/dyld.h do : ac_fn_c_check_header_mongrel "$LINENO" "mach-o/dyld.h" "ac_cv_header_mach_o_dyld_h" "$ac_includes_default" if test "x$ac_cv_header_mach_o_dyld_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_MACH_O_DYLD_H 1 _ACEOF fi done for ac_func in _NSGetExecutablePath do : ac_fn_c_check_func "$LINENO" "_NSGetExecutablePath" "ac_cv_func__NSGetExecutablePath" if test "x$ac_cv_func__NSGetExecutablePath" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE__NSGETEXECUTABLEPATH 1 _ACEOF fi done case "$host_os" in mingw*) is_noop=yes ;; # For the platforms that support $ORIGIN, see # . # glibc systems, Linux with musl libc: yes. Android: no. linux*-android*) ;; linux* | kfreebsd*) use_elf_origin_trick=yes ;; # Hurd: # only after the glibc commit from 2018-01-08 # gnu*) # Test for a glibc version >= 2.27. for ac_func in copy_file_range do : ac_fn_c_check_func "$LINENO" "copy_file_range" "ac_cv_func_copy_file_range" if test "x$ac_cv_func_copy_file_range" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_COPY_FILE_RANGE 1 _ACEOF fi done if test $ac_cv_func_copy_file_range = yes; then use_elf_origin_trick=yes fi ;; # FreeBSD >= 7.3, DragonFly >= 3.0: yes. freebsd | freebsd[1-7] | freebsd[1-6].* | freebsd7.[0-2]) ;; dragonfly | dragonfly[1-2] | dragonfly[1-2].*) ;; freebsd* | dragonfly*) use_elf_origin_trick=yes ;; # NetBSD >= 8.0: yes. netbsd | netbsd[1-7] | netbsd[1-7].*) ;; netbsdelf | netbsdelf[1-7] | netbsdelf[1-7].*) ;; netbsd*) use_elf_origin_trick=yes ;; # OpenBSD >= 5.4: yes. openbsd | openbsd[1-5] | openbsd[1-4].* | openbsd5.[0-3]) ;; openbsd*) use_elf_origin_trick=yes ;; # Solaris >= 10: yes. solaris | solaris2.[1-9] | solaris2.[1-9].*) ;; solaris*) use_elf_origin_trick=yes ;; # Haiku: yes. haiku*) use_elf_origin_trick=yes ;; # On Mac OS X 10.4 or newer, use Mac OS X tools. See # . darwin | darwin[1-7].*) ;; darwin*) use_macos_tools=yes ;; esac if test $is_noop = yes; then RELOCATABLE_LDFLAGS=: else if test $use_elf_origin_trick = yes || test $use_macos_tools = yes; then case "$ac_aux_dir" in /*) reloc_ldflags="$ac_aux_dir/reloc-ldflags" ;; *) reloc_ldflags="\$(top_builddir)/$ac_aux_dir/reloc-ldflags" ;; esac RELOCATABLE_LDFLAGS="\"$reloc_ldflags\" \"\$(host)\" \"\$(RELOCATABLE_LIBRARY_PATH)\"" if test $use_macos_tools = yes; then case "$ac_aux_dir" in /*) LIBTOOL="${CONFIG_SHELL-$SHELL} $ac_aux_dir/libtool-reloc $LIBTOOL" ;; *) LIBTOOL="${CONFIG_SHELL-$SHELL} \$(top_builddir)/$ac_aux_dir/libtool-reloc $LIBTOOL" ;; esac fi else use_wrapper=yes INSTALL_PROGRAM_ENV="RELOC_LIBRARY_PATH_VAR=\"$shlibpath_var\" RELOC_LIBRARY_PATH_VALUE=\"\$(RELOCATABLE_LIBRARY_PATH)\" RELOC_PREFIX=\"\$(prefix)\" RELOC_DESTDIR=\"\$(DESTDIR)\" RELOC_COMPILE_COMMAND=\"\$(CC) \$(CPPFLAGS) \$(CFLAGS) \$(LDFLAGS)\" RELOC_SRCDIR=\"\$(RELOCATABLE_SRC_DIR)\" RELOC_BUILDDIR=\"\$(RELOCATABLE_BUILD_DIR)\" RELOC_CONFIG_H_DIR=\"\$(RELOCATABLE_CONFIG_H_DIR)\" RELOC_EXEEXT=\"\$(EXEEXT)\" RELOC_STRIP_PROG=\"\$(RELOCATABLE_STRIP)\" RELOC_INSTALL_PROG=\"$INSTALL_PROGRAM\"" case "$ac_aux_dir" in /*) INSTALL_PROGRAM="$ac_aux_dir/install-reloc" ;; *) INSTALL_PROGRAM="\$(top_builddir)/$ac_aux_dir/install-reloc" ;; esac fi fi fi if test $is_noop = yes || test $use_elf_origin_trick = yes || test $use_macos_tools = yes; then RELOCATABLE_VIA_LD_TRUE= RELOCATABLE_VIA_LD_FALSE='#' else RELOCATABLE_VIA_LD_TRUE='#' RELOCATABLE_VIA_LD_FALSE= fi if test $use_wrapper = yes; then RELOCATABLE_VIA_WRAPPER_TRUE= RELOCATABLE_VIA_WRAPPER_FALSE='#' else RELOCATABLE_VIA_WRAPPER_TRUE='#' RELOCATABLE_VIA_WRAPPER_FALSE= fi RELOCATABLE_STRIP=':' ac_fn_c_check_decl "$LINENO" "setenv" "ac_cv_have_decl_setenv" "$ac_includes_default" if test "x$ac_cv_have_decl_setenv" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_SETENV $ac_have_decl _ACEOF { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ssize_t" >&5 $as_echo_n "checking for ssize_t... " >&6; } if ${gt_cv_ssize_t+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { int x = sizeof (ssize_t *) + sizeof (ssize_t); return !x; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : gt_cv_ssize_t=yes else gt_cv_ssize_t=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_ssize_t" >&5 $as_echo "$gt_cv_ssize_t" >&6; } if test $gt_cv_ssize_t = no; then $as_echo "#define ssize_t int" >>confdefs.h fi GNULIB_PSELECT=0; GNULIB_SELECT=0; HAVE_PSELECT=1; REPLACE_PSELECT=0; REPLACE_SELECT=0; { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether is self-contained" >&5 $as_echo_n "checking whether is self-contained... " >&6; } if ${gl_cv_header_sys_select_h_selfcontained+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { struct timeval b; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : gl_cv_header_sys_select_h_selfcontained=yes else gl_cv_header_sys_select_h_selfcontained=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $gl_cv_header_sys_select_h_selfcontained = yes; then cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { int memset; int bzero; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { #undef memset #define memset nonexistent_memset extern #ifdef __cplusplus "C" #endif void *memset (void *, int, unsigned long); #undef bzero #define bzero nonexistent_bzero extern #ifdef __cplusplus "C" #endif void bzero (void *, unsigned long); fd_set fds; FD_ZERO (&fds); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : else gl_cv_header_sys_select_h_selfcontained=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_sys_select_h_selfcontained" >&5 $as_echo "$gl_cv_header_sys_select_h_selfcontained" >&6; } if test $gl_cv_have_include_next = yes; then gl_cv_next_sys_select_h='<'sys/select.h'>' else { $as_echo "$as_me:${as_lineno-$LINENO}: checking absolute name of " >&5 $as_echo_n "checking absolute name of ... " >&6; } if ${gl_cv_next_sys_select_h+:} false; then : $as_echo_n "(cached) " >&6 else if test $ac_cv_header_sys_select_h = yes; then cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF case "$host_os" in aix*) gl_absname_cpp="$ac_cpp -C" ;; *) gl_absname_cpp="$ac_cpp" ;; esac case "$host_os" in mingw*) gl_dirsep_regex='[/\\]' ;; *) gl_dirsep_regex='\/' ;; esac gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g' gl_header_literal_regex=`echo 'sys/select.h' \ | sed -e "$gl_make_literal_regex_sed"` gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{ s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/ s|^/[^/]|//&| p q }' gl_cv_absolute_sys_select_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 | sed -n "$gl_absolute_header_sed"` gl_header=$gl_cv_absolute_sys_select_h gl_cv_next_sys_select_h='"'$gl_header'"' else gl_cv_next_sys_select_h='<'sys/select.h'>' fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_sys_select_h" >&5 $as_echo "$gl_cv_next_sys_select_h" >&6; } fi NEXT_SYS_SELECT_H=$gl_cv_next_sys_select_h if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next' gl_next_as_first_directive='<'sys/select.h'>' else # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include' gl_next_as_first_directive=$gl_cv_next_sys_select_h fi NEXT_AS_FIRST_DIRECTIVE_SYS_SELECT_H=$gl_next_as_first_directive if test $ac_cv_header_sys_select_h = yes; then HAVE_SYS_SELECT_H=1 else HAVE_SYS_SELECT_H=0 fi if test $ac_cv_header_sys_socket_h != yes; then for ac_header in winsock2.h do : ac_fn_c_check_header_mongrel "$LINENO" "winsock2.h" "ac_cv_header_winsock2_h" "$ac_includes_default" if test "x$ac_cv_header_winsock2_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_WINSOCK2_H 1 _ACEOF fi done fi if test "$ac_cv_header_winsock2_h" = yes; then HAVE_WINSOCK2_H=1 UNISTD_H_HAVE_WINSOCK2_H=1 SYS_IOCTL_H_HAVE_WINSOCK2_H=1 else HAVE_WINSOCK2_H=0 fi if test $ac_cv_header_sys_socket_h != yes; then for ac_header in winsock2.h do : ac_fn_c_check_header_mongrel "$LINENO" "winsock2.h" "ac_cv_header_winsock2_h" "$ac_includes_default" if test "x$ac_cv_header_winsock2_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_WINSOCK2_H 1 _ACEOF fi done fi if test "$ac_cv_header_winsock2_h" = yes; then HAVE_WINSOCK2_H=1 UNISTD_H_HAVE_WINSOCK2_H=1 SYS_IOCTL_H_HAVE_WINSOCK2_H=1 else HAVE_WINSOCK2_H=0 fi LIBSOCKET= if test $HAVE_WINSOCK2_H = 1; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we need to call WSAStartup in winsock2.h and -lws2_32" >&5 $as_echo_n "checking if we need to call WSAStartup in winsock2.h and -lws2_32... " >&6; } if ${gl_cv_func_wsastartup+:} false; then : $as_echo_n "(cached) " >&6 else gl_save_LIBS="$LIBS" LIBS="$LIBS -lws2_32" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef HAVE_WINSOCK2_H # include #endif int main () { WORD wVersionRequested = MAKEWORD(1, 1); WSADATA wsaData; int err = WSAStartup(wVersionRequested, &wsaData); WSACleanup (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : gl_cv_func_wsastartup=yes else gl_cv_func_wsastartup=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS="$gl_save_LIBS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_wsastartup" >&5 $as_echo "$gl_cv_func_wsastartup" >&6; } if test "$gl_cv_func_wsastartup" = "yes"; then $as_echo "#define WINDOWS_SOCKETS 1" >>confdefs.h LIBSOCKET='-lws2_32' fi else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing setsockopt" >&5 $as_echo_n "checking for library containing setsockopt... " >&6; } if ${gl_cv_lib_socket+:} false; then : $as_echo_n "(cached) " >&6 else gl_cv_lib_socket= cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ extern #ifdef __cplusplus "C" #endif char setsockopt(); int main () { setsockopt(); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : else gl_save_LIBS="$LIBS" LIBS="$gl_save_LIBS -lsocket" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ extern #ifdef __cplusplus "C" #endif char setsockopt(); int main () { setsockopt(); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : gl_cv_lib_socket="-lsocket" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$gl_cv_lib_socket"; then LIBS="$gl_save_LIBS -lnetwork" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ extern #ifdef __cplusplus "C" #endif char setsockopt(); int main () { setsockopt(); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : gl_cv_lib_socket="-lnetwork" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$gl_cv_lib_socket"; then LIBS="$gl_save_LIBS -lnet" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ extern #ifdef __cplusplus "C" #endif char setsockopt(); int main () { setsockopt(); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : gl_cv_lib_socket="-lnet" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi fi LIBS="$gl_save_LIBS" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$gl_cv_lib_socket"; then gl_cv_lib_socket="none needed" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_lib_socket" >&5 $as_echo "$gl_cv_lib_socket" >&6; } if test "$gl_cv_lib_socket" != "none needed"; then LIBSOCKET="$gl_cv_lib_socket" fi fi : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for uid_t in sys/types.h" >&5 $as_echo_n "checking for uid_t in sys/types.h... " >&6; } if ${ac_cv_type_uid_t+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "uid_t" >/dev/null 2>&1; then : ac_cv_type_uid_t=yes else ac_cv_type_uid_t=no fi rm -f conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_type_uid_t" >&5 $as_echo "$ac_cv_type_uid_t" >&6; } if test $ac_cv_type_uid_t = no; then $as_echo "#define uid_t int" >>confdefs.h $as_echo "#define gid_t int" >>confdefs.h fi ac_fn_c_check_decl "$LINENO" "snprintf" "ac_cv_have_decl_snprintf" "$ac_includes_default" if test "x$ac_cv_have_decl_snprintf" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_SNPRINTF $ac_have_decl _ACEOF if test $ac_cv_header_sys_socket_h = no; then for ac_header in ws2tcpip.h do : ac_fn_c_check_header_mongrel "$LINENO" "ws2tcpip.h" "ac_cv_header_ws2tcpip_h" "$ac_includes_default" if test "x$ac_cv_header_ws2tcpip_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_WS2TCPIP_H 1 _ACEOF fi done fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for stdbool.h that conforms to C99" >&5 $as_echo_n "checking for stdbool.h that conforms to C99... " >&6; } if ${ac_cv_header_stdbool_h+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #ifdef __cplusplus typedef bool Bool; #else typedef _Bool Bool; #ifndef bool "error: bool is not defined" #endif #ifndef false "error: false is not defined" #endif #if false "error: false is not 0" #endif #ifndef true "error: true is not defined" #endif #if true != 1 "error: true is not 1" #endif #endif #ifndef __bool_true_false_are_defined "error: __bool_true_false_are_defined is not defined" #endif struct s { Bool s: 1; Bool t; bool u: 1; bool v; } s; char a[true == 1 ? 1 : -1]; char b[false == 0 ? 1 : -1]; char c[__bool_true_false_are_defined == 1 ? 1 : -1]; char d[(bool) 0.5 == true ? 1 : -1]; /* See body of main program for 'e'. */ char f[(Bool) 0.0 == false ? 1 : -1]; char g[true]; char h[sizeof (Bool)]; char i[sizeof s.t]; enum { j = false, k = true, l = false * true, m = true * 256 }; /* The following fails for HP aC++/ANSI C B3910B A.05.55 [Dec 04 2003]. */ Bool n[m]; char o[sizeof n == m * sizeof n[0] ? 1 : -1]; char p[-1 - (Bool) 0 < 0 && -1 - (bool) 0 < 0 ? 1 : -1]; /* Catch a bug in an HP-UX C compiler. See https://gcc.gnu.org/ml/gcc-patches/2003-12/msg02303.html https://lists.gnu.org/r/bug-coreutils/2005-11/msg00161.html */ Bool q = true; Bool *pq = &q; bool *qq = &q; int main () { bool e = &s; *pq |= q; *pq |= ! q; *qq |= q; *qq |= ! q; /* Refer to every declared value, to avoid compiler optimizations. */ return (!a + !b + !c + !d + !e + !f + !g + !h + !i + !!j + !k + !!l + !m + !n + !o + !p + !q + !pq + !qq); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdbool_h=yes else ac_cv_header_stdbool_h=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdbool_h" >&5 $as_echo "$ac_cv_header_stdbool_h" >&6; } ac_fn_c_check_type "$LINENO" "_Bool" "ac_cv_type__Bool" "$ac_includes_default" if test "x$ac_cv_type__Bool" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE__BOOL 1 _ACEOF fi GNULIB_FFS=0; HAVE_FFS=1; HAVE_STRCASECMP=1; HAVE_DECL_STRNCASECMP=1; for ac_func in strcasestr do : ac_fn_c_check_func "$LINENO" "strcasestr" "ac_cv_func_strcasestr" if test "x$ac_cv_func_strcasestr" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_STRCASESTR 1 _ACEOF fi done if test $ac_cv_func_strcasestr = no; then HAVE_STRCASESTR=0 else if test $REPLACE_MEMCHR = 1; then REPLACE_STRCASESTR=1 else { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether strcasestr works" >&5 $as_echo_n "checking whether strcasestr works... " >&6; } if ${gl_cv_func_strcasestr_works_always+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __GNU_LIBRARY__ #include #if ((__GLIBC__ == 2 && __GLIBC_MINOR__ > 12) || (__GLIBC__ > 2)) \ || defined __UCLIBC__ Lucky user #endif #elif defined __CYGWIN__ #include #if CYGWIN_VERSION_DLL_COMBINED > CYGWIN_VERSION_DLL_MAKE_COMBINED (1007, 7) Lucky user #endif #else Lucky user #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "Lucky user" >/dev/null 2>&1; then : gl_cv_func_strcasestr_works_always="guessing yes" else gl_cv_func_strcasestr_works_always="$gl_cross_guess_normal" fi rm -f conftest* else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include /* for strcasestr */ #ifdef __GNU_LIBRARY__ #include #if __GLIBC__ == 2 && __GLIBC_MINOR__ == 28 Unlucky user #endif #endif #define P "_EF_BF_BD" #define HAYSTACK "F_BD_CE_BD" P P P P "_C3_88_20" P P P "_C3_A7_20" P #define NEEDLE P P P P P int main () { return !!strcasestr (HAYSTACK, NEEDLE); ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : gl_cv_func_strcasestr_works_always=yes else gl_cv_func_strcasestr_works_always=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_strcasestr_works_always" >&5 $as_echo "$gl_cv_func_strcasestr_works_always" >&6; } case "$gl_cv_func_strcasestr_works_always" in *yes) ;; *) REPLACE_STRCASESTR=1 ;; esac fi fi ac_fn_c_check_decl "$LINENO" "strdup" "ac_cv_have_decl_strdup" "$ac_includes_default" if test "x$ac_cv_have_decl_strdup" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_STRDUP $ac_have_decl _ACEOF REPLACE_STRERROR_0=0 { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether strerror(0) succeeds" >&5 $as_echo_n "checking whether strerror(0) succeeds... " >&6; } if ${gl_cv_func_strerror_0_works+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : case "$host_os" in # Guess yes on glibc systems. *-gnu* | gnu*) gl_cv_func_strerror_0_works="guessing yes" ;; # Guess yes on musl systems. *-musl*) gl_cv_func_strerror_0_works="guessing yes" ;; # Guess yes on native Windows. mingw*) gl_cv_func_strerror_0_works="guessing yes" ;; # If we don't know, obey --enable-cross-guesses. *) gl_cv_func_strerror_0_works="$gl_cross_guess_normal" ;; esac else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { int result = 0; char *str; errno = 0; str = strerror (0); if (!*str) result |= 1; if (errno) result |= 2; if (strstr (str, "nknown") || strstr (str, "ndefined")) result |= 4; return result; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : gl_cv_func_strerror_0_works=yes else gl_cv_func_strerror_0_works=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_strerror_0_works" >&5 $as_echo "$gl_cv_func_strerror_0_works" >&6; } case "$gl_cv_func_strerror_0_works" in *yes) ;; *) REPLACE_STRERROR_0=1 $as_echo "#define REPLACE_STRERROR_0 1" >>confdefs.h ;; esac if test $gl_cv_have_include_next = yes; then gl_cv_next_string_h='<'string.h'>' else { $as_echo "$as_me:${as_lineno-$LINENO}: checking absolute name of " >&5 $as_echo_n "checking absolute name of ... " >&6; } if ${gl_cv_next_string_h+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF case "$host_os" in aix*) gl_absname_cpp="$ac_cpp -C" ;; *) gl_absname_cpp="$ac_cpp" ;; esac case "$host_os" in mingw*) gl_dirsep_regex='[/\\]' ;; *) gl_dirsep_regex='\/' ;; esac gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g' gl_header_literal_regex=`echo 'string.h' \ | sed -e "$gl_make_literal_regex_sed"` gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{ s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/ s|^/[^/]|//&| p q }' gl_cv_absolute_string_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 | sed -n "$gl_absolute_header_sed"` gl_header=$gl_cv_absolute_string_h gl_cv_next_string_h='"'$gl_header'"' fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_string_h" >&5 $as_echo "$gl_cv_next_string_h" >&6; } fi NEXT_STRING_H=$gl_cv_next_string_h if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next' gl_next_as_first_directive='<'string.h'>' else # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include' gl_next_as_first_directive=$gl_cv_next_string_h fi NEXT_AS_FIRST_DIRECTIVE_STRING_H=$gl_next_as_first_directive if test $gl_cv_have_include_next = yes; then gl_cv_next_strings_h='<'strings.h'>' else { $as_echo "$as_me:${as_lineno-$LINENO}: checking absolute name of " >&5 $as_echo_n "checking absolute name of ... " >&6; } if ${gl_cv_next_strings_h+:} false; then : $as_echo_n "(cached) " >&6 else if test $ac_cv_header_strings_h = yes; then cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF case "$host_os" in aix*) gl_absname_cpp="$ac_cpp -C" ;; *) gl_absname_cpp="$ac_cpp" ;; esac case "$host_os" in mingw*) gl_dirsep_regex='[/\\]' ;; *) gl_dirsep_regex='\/' ;; esac gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g' gl_header_literal_regex=`echo 'strings.h' \ | sed -e "$gl_make_literal_regex_sed"` gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{ s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/ s|^/[^/]|//&| p q }' gl_cv_absolute_strings_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 | sed -n "$gl_absolute_header_sed"` gl_header=$gl_cv_absolute_strings_h gl_cv_next_strings_h='"'$gl_header'"' else gl_cv_next_strings_h='<'strings.h'>' fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_strings_h" >&5 $as_echo "$gl_cv_next_strings_h" >&6; } fi NEXT_STRINGS_H=$gl_cv_next_strings_h if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next' gl_next_as_first_directive='<'strings.h'>' else # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include' gl_next_as_first_directive=$gl_cv_next_strings_h fi NEXT_AS_FIRST_DIRECTIVE_STRINGS_H=$gl_next_as_first_directive if test $ac_cv_header_strings_h = yes; then HAVE_STRINGS_H=1 else HAVE_STRINGS_H=0 fi # Check for mmap(). Don't use AC_FUNC_MMAP, because it checks too much: it # fails on HP-UX 11, because MAP_FIXED mappings do not work. But this is # irrelevant for anonymous mappings. ac_fn_c_check_func "$LINENO" "mmap" "ac_cv_func_mmap" if test "x$ac_cv_func_mmap" = xyes; then : gl_have_mmap=yes else gl_have_mmap=no fi # Try to allow MAP_ANONYMOUS. gl_have_mmap_anonymous=no if test $gl_have_mmap = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for MAP_ANONYMOUS" >&5 $as_echo_n "checking for MAP_ANONYMOUS... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #ifdef MAP_ANONYMOUS I cannot identify this map #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "I cannot identify this map" >/dev/null 2>&1; then : gl_have_mmap_anonymous=yes fi rm -f conftest* if test $gl_have_mmap_anonymous != yes; then cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #ifdef MAP_ANON I cannot identify this map #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "I cannot identify this map" >/dev/null 2>&1; then : $as_echo "#define MAP_ANONYMOUS MAP_ANON" >>confdefs.h gl_have_mmap_anonymous=yes fi rm -f conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_have_mmap_anonymous" >&5 $as_echo "$gl_have_mmap_anonymous" >&6; } if test $gl_have_mmap_anonymous = yes; then $as_echo "#define HAVE_MAP_ANONYMOUS 1" >>confdefs.h fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether strncat works" >&5 $as_echo_n "checking whether strncat works... " >&6; } if ${gl_cv_func_strncat_works+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : case "$host_os" in # Guess no on Solaris. solaris*) gl_cv_func_strncat_works="guessing no" ;; # Guess yes on native Windows. mingw*) gl_cv_func_strncat_works="guessing yes" ;; # Guess yes otherwise. *) gl_cv_func_strncat_works="guessing yes" ;; esac else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #if HAVE_SYS_MMAN_H # include # include # include # include # ifndef MAP_FILE # define MAP_FILE 0 # endif #endif int main () { char *fence = NULL; #if HAVE_SYS_MMAN_H && HAVE_MPROTECT # if HAVE_MAP_ANONYMOUS const int flags = MAP_ANONYMOUS | MAP_PRIVATE; const int fd = -1; # else /* !HAVE_MAP_ANONYMOUS */ const int flags = MAP_FILE | MAP_PRIVATE; int fd = open ("/dev/zero", O_RDONLY, 0666); if (fd >= 0) # endif { int pagesize = getpagesize (); char *two_pages = (char *) mmap (NULL, 2 * pagesize, PROT_READ | PROT_WRITE, flags, fd, 0); if (two_pages != (char *)(-1) && mprotect (two_pages + pagesize, pagesize, PROT_NONE) == 0) fence = two_pages + pagesize; } #endif if (fence) { char dest[8]; dest[0] = '*'; dest[1] = 'a'; dest[2] = '\0'; dest[3] = 'w'; dest[4] = 'x'; dest[5] = 'y'; dest[6] = 'z'; *(fence - 3) = '7'; *(fence - 2) = '2'; *(fence - 1) = '9'; if (strncat (dest + 1, fence - 3, 3) != dest + 1) return 1; if (dest[0] != '*') return 2; if (dest[1] != 'a' || dest[2] != '7' || dest[3] != '2' || dest[4] != '9' || dest[5] != '\0') return 3; if (dest[6] != 'z') return 4; } return 0; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : gl_cv_func_strncat_works=yes else gl_cv_func_strncat_works=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_strncat_works" >&5 $as_echo "$gl_cv_func_strncat_works" >&6; } case "$gl_cv_func_strncat_works" in *yes) ;; *) REPLACE_STRNCAT=1 ;; esac ac_fn_c_check_decl "$LINENO" "strndup" "ac_cv_have_decl_strndup" "$ac_includes_default" if test "x$ac_cv_have_decl_strndup" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_STRNDUP $ac_have_decl _ACEOF ac_fn_c_check_decl "$LINENO" "strnlen" "ac_cv_have_decl_strnlen" "$ac_includes_default" if test "x$ac_cv_have_decl_strnlen" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_STRNLEN $ac_have_decl _ACEOF { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ldexp() can be used without linking with libm" >&5 $as_echo_n "checking whether ldexp() can be used without linking with libm... " >&6; } if ${gl_cv_func_ldexp_no_libm+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifndef __NO_MATH_INLINES # define __NO_MATH_INLINES 1 /* for glibc */ #endif #include double (*funcptr) (double, int) = ldexp; double x; int main () { return ldexp (x, -1) > 0; ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : gl_cv_func_ldexp_no_libm=yes else gl_cv_func_ldexp_no_libm=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_ldexp_no_libm" >&5 $as_echo "$gl_cv_func_ldexp_no_libm" >&6; } ac_fn_c_check_decl "$LINENO" "strtok_r" "ac_cv_have_decl_strtok_r" "$ac_includes_default" if test "x$ac_cv_have_decl_strtok_r" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_STRTOK_R $ac_have_decl _ACEOF GNULIB_SOCKET=0; GNULIB_CONNECT=0; GNULIB_ACCEPT=0; GNULIB_BIND=0; GNULIB_GETPEERNAME=0; GNULIB_GETSOCKNAME=0; GNULIB_GETSOCKOPT=0; GNULIB_LISTEN=0; GNULIB_RECV=0; GNULIB_SEND=0; GNULIB_RECVFROM=0; GNULIB_SENDTO=0; GNULIB_SETSOCKOPT=0; GNULIB_SHUTDOWN=0; GNULIB_ACCEPT4=0; HAVE_STRUCT_SOCKADDR_STORAGE=1; HAVE_STRUCT_SOCKADDR_STORAGE_SS_FAMILY=1; HAVE_SA_FAMILY_T=1; HAVE_ACCEPT4=1; case "$host_os" in osf*) $as_echo "#define _POSIX_PII_SOCKET 1" >>confdefs.h ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether is self-contained" >&5 $as_echo_n "checking whether is self-contained... " >&6; } if ${gl_cv_header_sys_socket_h_selfcontained+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : gl_cv_header_sys_socket_h_selfcontained=yes else gl_cv_header_sys_socket_h_selfcontained=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_sys_socket_h_selfcontained" >&5 $as_echo "$gl_cv_header_sys_socket_h_selfcontained" >&6; } if test $gl_cv_header_sys_socket_h_selfcontained = yes; then for ac_func in shutdown do : ac_fn_c_check_func "$LINENO" "shutdown" "ac_cv_func_shutdown" if test "x$ac_cv_func_shutdown" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_SHUTDOWN 1 _ACEOF fi done if test $ac_cv_func_shutdown = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether defines the SHUT_* macros" >&5 $as_echo_n "checking whether defines the SHUT_* macros... " >&6; } if ${gl_cv_header_sys_socket_h_shut+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { int a[] = { SHUT_RD, SHUT_WR, SHUT_RDWR }; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : gl_cv_header_sys_socket_h_shut=yes else gl_cv_header_sys_socket_h_shut=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_sys_socket_h_shut" >&5 $as_echo "$gl_cv_header_sys_socket_h_shut" >&6; } if test $gl_cv_header_sys_socket_h_shut = no; then SYS_SOCKET_H='sys/socket.h' fi fi fi # We need to check for ws2tcpip.h now. if test $gl_cv_have_include_next = yes; then gl_cv_next_sys_socket_h='<'sys/socket.h'>' else { $as_echo "$as_me:${as_lineno-$LINENO}: checking absolute name of " >&5 $as_echo_n "checking absolute name of ... " >&6; } if ${gl_cv_next_sys_socket_h+:} false; then : $as_echo_n "(cached) " >&6 else if test $ac_cv_header_sys_socket_h = yes; then cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF case "$host_os" in aix*) gl_absname_cpp="$ac_cpp -C" ;; *) gl_absname_cpp="$ac_cpp" ;; esac case "$host_os" in mingw*) gl_dirsep_regex='[/\\]' ;; *) gl_dirsep_regex='\/' ;; esac gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g' gl_header_literal_regex=`echo 'sys/socket.h' \ | sed -e "$gl_make_literal_regex_sed"` gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{ s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/ s|^/[^/]|//&| p q }' gl_cv_absolute_sys_socket_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 | sed -n "$gl_absolute_header_sed"` gl_header=$gl_cv_absolute_sys_socket_h gl_cv_next_sys_socket_h='"'$gl_header'"' else gl_cv_next_sys_socket_h='<'sys/socket.h'>' fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_sys_socket_h" >&5 $as_echo "$gl_cv_next_sys_socket_h" >&6; } fi NEXT_SYS_SOCKET_H=$gl_cv_next_sys_socket_h if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next' gl_next_as_first_directive='<'sys/socket.h'>' else # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include' gl_next_as_first_directive=$gl_cv_next_sys_socket_h fi NEXT_AS_FIRST_DIRECTIVE_SYS_SOCKET_H=$gl_next_as_first_directive if test $ac_cv_header_sys_socket_h = yes; then HAVE_SYS_SOCKET_H=1 else HAVE_SYS_SOCKET_H=0 fi if test $ac_cv_header_sys_socket_h = yes; then HAVE_WS2TCPIP_H=0 else if test $ac_cv_header_ws2tcpip_h = yes; then HAVE_WS2TCPIP_H=1 else HAVE_WS2TCPIP_H=0 fi fi ac_fn_c_check_type "$LINENO" "struct sockaddr_storage" "ac_cv_type_struct_sockaddr_storage" " /* sys/types.h is not needed according to POSIX, but the sys/socket.h in i386-unknown-freebsd4.10 and powerpc-apple-darwin5.5 required it. */ #include #ifdef HAVE_SYS_SOCKET_H #include #endif #ifdef HAVE_WS2TCPIP_H #include #endif " if test "x$ac_cv_type_struct_sockaddr_storage" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_STRUCT_SOCKADDR_STORAGE 1 _ACEOF fi ac_fn_c_check_type "$LINENO" "sa_family_t" "ac_cv_type_sa_family_t" " /* sys/types.h is not needed according to POSIX, but the sys/socket.h in i386-unknown-freebsd4.10 and powerpc-apple-darwin5.5 required it. */ #include #ifdef HAVE_SYS_SOCKET_H #include #endif #ifdef HAVE_WS2TCPIP_H #include #endif " if test "x$ac_cv_type_sa_family_t" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_SA_FAMILY_T 1 _ACEOF fi if test $ac_cv_type_struct_sockaddr_storage = no; then HAVE_STRUCT_SOCKADDR_STORAGE=0 fi if test $ac_cv_type_sa_family_t = no; then HAVE_SA_FAMILY_T=0 fi if test $ac_cv_type_struct_sockaddr_storage != no; then ac_fn_c_check_member "$LINENO" "struct sockaddr_storage" "ss_family" "ac_cv_member_struct_sockaddr_storage_ss_family" "#include #ifdef HAVE_SYS_SOCKET_H #include #endif #ifdef HAVE_WS2TCPIP_H #include #endif " if test "x$ac_cv_member_struct_sockaddr_storage_ss_family" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_STRUCT_SOCKADDR_STORAGE_SS_FAMILY 1 _ACEOF else HAVE_STRUCT_SOCKADDR_STORAGE_SS_FAMILY=0 fi fi if test $HAVE_STRUCT_SOCKADDR_STORAGE = 0 || test $HAVE_SA_FAMILY_T = 0 \ || test $HAVE_STRUCT_SOCKADDR_STORAGE_SS_FAMILY = 0; then SYS_SOCKET_H='sys/socket.h' fi if test $ac_cv_header_sys_socket_h != yes; then for ac_header in winsock2.h do : ac_fn_c_check_header_mongrel "$LINENO" "winsock2.h" "ac_cv_header_winsock2_h" "$ac_includes_default" if test "x$ac_cv_header_winsock2_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_WINSOCK2_H 1 _ACEOF fi done fi if test "$ac_cv_header_winsock2_h" = yes; then HAVE_WINSOCK2_H=1 UNISTD_H_HAVE_WINSOCK2_H=1 SYS_IOCTL_H_HAVE_WINSOCK2_H=1 else HAVE_WINSOCK2_H=0 fi GNULIB_TCGETSID=0; HAVE_DECL_TCGETSID=1; HAVE_TERMIOS_H=1; { $as_echo "$as_me:${as_lineno-$LINENO}: checking for struct timespec in " >&5 $as_echo_n "checking for struct timespec in ... " >&6; } if ${gl_cv_sys_struct_timespec_in_time_h+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { static struct timespec x; x.tv_sec = x.tv_nsec; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : gl_cv_sys_struct_timespec_in_time_h=yes else gl_cv_sys_struct_timespec_in_time_h=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_sys_struct_timespec_in_time_h" >&5 $as_echo "$gl_cv_sys_struct_timespec_in_time_h" >&6; } TIME_H_DEFINES_STRUCT_TIMESPEC=0 SYS_TIME_H_DEFINES_STRUCT_TIMESPEC=0 PTHREAD_H_DEFINES_STRUCT_TIMESPEC=0 UNISTD_H_DEFINES_STRUCT_TIMESPEC=0 if test $gl_cv_sys_struct_timespec_in_time_h = yes; then TIME_H_DEFINES_STRUCT_TIMESPEC=1 else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for struct timespec in " >&5 $as_echo_n "checking for struct timespec in ... " >&6; } if ${gl_cv_sys_struct_timespec_in_sys_time_h+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { static struct timespec x; x.tv_sec = x.tv_nsec; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : gl_cv_sys_struct_timespec_in_sys_time_h=yes else gl_cv_sys_struct_timespec_in_sys_time_h=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_sys_struct_timespec_in_sys_time_h" >&5 $as_echo "$gl_cv_sys_struct_timespec_in_sys_time_h" >&6; } if test $gl_cv_sys_struct_timespec_in_sys_time_h = yes; then SYS_TIME_H_DEFINES_STRUCT_TIMESPEC=1 else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for struct timespec in " >&5 $as_echo_n "checking for struct timespec in ... " >&6; } if ${gl_cv_sys_struct_timespec_in_pthread_h+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { static struct timespec x; x.tv_sec = x.tv_nsec; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : gl_cv_sys_struct_timespec_in_pthread_h=yes else gl_cv_sys_struct_timespec_in_pthread_h=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_sys_struct_timespec_in_pthread_h" >&5 $as_echo "$gl_cv_sys_struct_timespec_in_pthread_h" >&6; } if test $gl_cv_sys_struct_timespec_in_pthread_h = yes; then PTHREAD_H_DEFINES_STRUCT_TIMESPEC=1 else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for struct timespec in " >&5 $as_echo_n "checking for struct timespec in ... " >&6; } if ${gl_cv_sys_struct_timespec_in_unistd_h+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { static struct timespec x; x.tv_sec = x.tv_nsec; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : gl_cv_sys_struct_timespec_in_unistd_h=yes else gl_cv_sys_struct_timespec_in_unistd_h=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_sys_struct_timespec_in_unistd_h" >&5 $as_echo "$gl_cv_sys_struct_timespec_in_unistd_h" >&6; } if test $gl_cv_sys_struct_timespec_in_unistd_h = yes; then UNISTD_H_DEFINES_STRUCT_TIMESPEC=1 fi fi fi fi if test $gl_cv_have_include_next = yes; then gl_cv_next_time_h='<'time.h'>' else { $as_echo "$as_me:${as_lineno-$LINENO}: checking absolute name of " >&5 $as_echo_n "checking absolute name of ... " >&6; } if ${gl_cv_next_time_h+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF case "$host_os" in aix*) gl_absname_cpp="$ac_cpp -C" ;; *) gl_absname_cpp="$ac_cpp" ;; esac case "$host_os" in mingw*) gl_dirsep_regex='[/\\]' ;; *) gl_dirsep_regex='\/' ;; esac gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g' gl_header_literal_regex=`echo 'time.h' \ | sed -e "$gl_make_literal_regex_sed"` gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{ s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/ s|^/[^/]|//&| p q }' gl_cv_absolute_time_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 | sed -n "$gl_absolute_header_sed"` gl_header=$gl_cv_absolute_time_h gl_cv_next_time_h='"'$gl_header'"' fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_time_h" >&5 $as_echo "$gl_cv_next_time_h" >&6; } fi NEXT_TIME_H=$gl_cv_next_time_h if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next' gl_next_as_first_directive='<'time.h'>' else # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include' gl_next_as_first_directive=$gl_cv_next_time_h fi NEXT_AS_FIRST_DIRECTIVE_TIME_H=$gl_next_as_first_directive gl_libunistring_sed_extract_major='/^[0-9]/{s/^\([0-9]*\).*/\1/p;q;} i\ 0 q ' gl_libunistring_sed_extract_minor='/^[0-9][0-9]*[.][0-9]/{s/^[0-9]*[.]\([0-9]*\).*/\1/p;q;} i\ 0 q ' gl_libunistring_sed_extract_subminor='/^[0-9][0-9]*[.][0-9][0-9]*[.][0-9]/{s/^[0-9]*[.][0-9]*[.]\([0-9]*\).*/\1/p;q;} i\ 0 q ' if test "$HAVE_LIBUNISTRING" = yes; then LIBUNISTRING_VERSION_MAJOR=`echo "$LIBUNISTRING_VERSION" | sed -n -e "$gl_libunistring_sed_extract_major"` LIBUNISTRING_VERSION_MINOR=`echo "$LIBUNISTRING_VERSION" | sed -n -e "$gl_libunistring_sed_extract_minor"` LIBUNISTRING_VERSION_SUBMINOR=`echo "$LIBUNISTRING_VERSION" | sed -n -e "$gl_libunistring_sed_extract_subminor"` fi ac_fn_c_check_decl "$LINENO" "clearerr_unlocked" "ac_cv_have_decl_clearerr_unlocked" "$ac_includes_default" if test "x$ac_cv_have_decl_clearerr_unlocked" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_CLEARERR_UNLOCKED $ac_have_decl _ACEOF ac_fn_c_check_decl "$LINENO" "feof_unlocked" "ac_cv_have_decl_feof_unlocked" "$ac_includes_default" if test "x$ac_cv_have_decl_feof_unlocked" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_FEOF_UNLOCKED $ac_have_decl _ACEOF ac_fn_c_check_decl "$LINENO" "ferror_unlocked" "ac_cv_have_decl_ferror_unlocked" "$ac_includes_default" if test "x$ac_cv_have_decl_ferror_unlocked" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_FERROR_UNLOCKED $ac_have_decl _ACEOF ac_fn_c_check_decl "$LINENO" "fgets_unlocked" "ac_cv_have_decl_fgets_unlocked" "$ac_includes_default" if test "x$ac_cv_have_decl_fgets_unlocked" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_FGETS_UNLOCKED $ac_have_decl _ACEOF ac_fn_c_check_decl "$LINENO" "fputc_unlocked" "ac_cv_have_decl_fputc_unlocked" "$ac_includes_default" if test "x$ac_cv_have_decl_fputc_unlocked" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_FPUTC_UNLOCKED $ac_have_decl _ACEOF ac_fn_c_check_decl "$LINENO" "fread_unlocked" "ac_cv_have_decl_fread_unlocked" "$ac_includes_default" if test "x$ac_cv_have_decl_fread_unlocked" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_FREAD_UNLOCKED $ac_have_decl _ACEOF ac_fn_c_check_decl "$LINENO" "fwrite_unlocked" "ac_cv_have_decl_fwrite_unlocked" "$ac_includes_default" if test "x$ac_cv_have_decl_fwrite_unlocked" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_FWRITE_UNLOCKED $ac_have_decl _ACEOF ac_fn_c_check_decl "$LINENO" "getc_unlocked" "ac_cv_have_decl_getc_unlocked" "$ac_includes_default" if test "x$ac_cv_have_decl_getc_unlocked" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_GETC_UNLOCKED $ac_have_decl _ACEOF ac_fn_c_check_decl "$LINENO" "getchar_unlocked" "ac_cv_have_decl_getchar_unlocked" "$ac_includes_default" if test "x$ac_cv_have_decl_getchar_unlocked" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_GETCHAR_UNLOCKED $ac_have_decl _ACEOF ac_fn_c_check_decl "$LINENO" "putchar_unlocked" "ac_cv_have_decl_putchar_unlocked" "$ac_includes_default" if test "x$ac_cv_have_decl_putchar_unlocked" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_PUTCHAR_UNLOCKED $ac_have_decl _ACEOF ac_fn_c_check_decl "$LINENO" "unsetenv" "ac_cv_have_decl_unsetenv" "$ac_includes_default" if test "x$ac_cv_have_decl_unsetenv" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_UNSETENV $ac_have_decl _ACEOF ac_fn_c_check_decl "$LINENO" "vsnprintf" "ac_cv_have_decl_vsnprintf" "$ac_includes_default" if test "x$ac_cv_have_decl_vsnprintf" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_VSNPRINTF $ac_have_decl _ACEOF if true; then GL_COND_LIBTOOL_TRUE= GL_COND_LIBTOOL_FALSE='#' else GL_COND_LIBTOOL_TRUE='#' GL_COND_LIBTOOL_FALSE= fi gl_cond_libtool=true gl_m4_base='gl/m4' gl_source_base='gl' LTALLOCA=`echo "$ALLOCA" | sed -e 's/\.[^.]* /.lo /g;s/\.[^.]*$/.lo/'` if test $ac_cv_func_alloca_works = no; then : fi # Define an additional variable used in the Makefile substitution. if test $ac_cv_working_alloca_h = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for alloca as a compiler built-in" >&5 $as_echo_n "checking for alloca as a compiler built-in... " >&6; } if ${gl_cv_rpl_alloca+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #if defined __GNUC__ || defined _AIX || defined _MSC_VER Need own alloca #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "Need own alloca" >/dev/null 2>&1; then : gl_cv_rpl_alloca=yes else gl_cv_rpl_alloca=no fi rm -f conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_rpl_alloca" >&5 $as_echo "$gl_cv_rpl_alloca" >&6; } if test $gl_cv_rpl_alloca = yes; then $as_echo "#define HAVE_ALLOCA 1" >>confdefs.h ALLOCA_H=alloca.h else ALLOCA_H= fi else ALLOCA_H=alloca.h fi if test -n "$ALLOCA_H"; then GL_GENERATE_ALLOCA_H_TRUE= GL_GENERATE_ALLOCA_H_FALSE='#' else GL_GENERATE_ALLOCA_H_TRUE='#' GL_GENERATE_ALLOCA_H_FALSE= fi if test $ac_cv_working_alloca_h = yes; then HAVE_ALLOCA_H=1 else HAVE_ALLOCA_H=0 fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable assertions" >&5 $as_echo_n "checking whether to enable assertions... " >&6; } # Check whether --enable-assert was given. if test "${enable_assert+set}" = set; then : enableval=$enable_assert; if test "x$enableval" = xno; then : $as_echo "#define NDEBUG 1" >>confdefs.h elif test "x$enableval" != xyes; then : { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: invalid argument supplied to --enable-assert" >&5 $as_echo "$as_me: WARNING: invalid argument supplied to --enable-assert" >&2;} enable_assert=yes fi else enable_assert=yes fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_assert" >&5 $as_echo "$enable_assert" >&6; } if test $ac_cv_func_btowc = no; then HAVE_BTOWC=0 else { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether btowc(0) is correct" >&5 $as_echo_n "checking whether btowc(0) is correct... " >&6; } if ${gl_cv_func_btowc_nul+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : case "$host_os" in # Guess no on Cygwin. cygwin*) gl_cv_func_btowc_nul="guessing no" ;; # Guess yes on native Windows. mingw*) gl_cv_func_btowc_nul="guessing yes" ;; # Guess yes otherwise. *) gl_cv_func_btowc_nul="guessing yes" ;; esac else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include /* Tru64 with Desktop Toolkit C has a bug: must be included before . BSD/OS 4.0.1 has a bug: , and must be included before . */ #include #include #include #include int main () { if (btowc ('\0') != 0) return 1; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : gl_cv_func_btowc_nul=yes else gl_cv_func_btowc_nul=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_btowc_nul" >&5 $as_echo "$gl_cv_func_btowc_nul" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether btowc(EOF) is correct" >&5 $as_echo_n "checking whether btowc(EOF) is correct... " >&6; } if ${gl_cv_func_btowc_eof+:} false; then : $as_echo_n "(cached) " >&6 else case "$host_os" in # Guess no on IRIX. irix*) gl_cv_func_btowc_eof="guessing no" ;; # Guess yes on native Windows. mingw*) gl_cv_func_btowc_eof="guessing yes" ;; # Guess yes otherwise. *) gl_cv_func_btowc_eof="guessing yes" ;; esac if test $LOCALE_FR != none; then if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include /* Tru64 with Desktop Toolkit C has a bug: must be included before . BSD/OS 4.0.1 has a bug: , and must be included before . */ #include #include #include #include int main () { if (setlocale (LC_ALL, "$LOCALE_FR") != NULL) { if (btowc (EOF) != WEOF) return 1; } return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : gl_cv_func_btowc_eof=yes else gl_cv_func_btowc_eof=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_btowc_eof" >&5 $as_echo "$gl_cv_func_btowc_eof" >&6; } case "$gl_cv_func_btowc_nul" in *yes) ;; *) REPLACE_BTOWC=1 ;; esac case "$gl_cv_func_btowc_eof" in *yes) ;; *) REPLACE_BTOWC=1 ;; esac fi if test $HAVE_BTOWC = 0 || test $REPLACE_BTOWC = 1; then gl_LIBOBJS="$gl_LIBOBJS btowc.$ac_objext" : fi GNULIB_BTOWC=1 $as_echo "#define GNULIB_TEST_BTOWC 1" >>confdefs.h { $as_echo "$as_me:${as_lineno-$LINENO}: checking for __builtin_expect" >&5 $as_echo_n "checking for __builtin_expect... " >&6; } if ${gl_cv___builtin_expect+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (int argc, char **argv) { argc = __builtin_expect (argc, 100); return argv[argc != 100][0]; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : gl_cv___builtin_expect=yes else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main (int argc, char **argv) { argc = __builtin_expect (argc, 100); return argv[argc != 100][0]; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : gl_cv___builtin_expect="in " else gl_cv___builtin_expect=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv___builtin_expect" >&5 $as_echo "$gl_cv___builtin_expect" >&6; } if test "$gl_cv___builtin_expect" = yes; then $as_echo "#define HAVE___BUILTIN_EXPECT 1" >>confdefs.h elif test "$gl_cv___builtin_expect" = "in "; then $as_echo "#define HAVE___BUILTIN_EXPECT 2" >>confdefs.h fi for ac_header in byteswap.h do : ac_fn_c_check_header_mongrel "$LINENO" "byteswap.h" "ac_cv_header_byteswap_h" "$ac_includes_default" if test "x$ac_cv_header_byteswap_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_BYTESWAP_H 1 _ACEOF BYTESWAP_H='' else BYTESWAP_H='byteswap.h' fi done if test -n "$BYTESWAP_H"; then GL_GENERATE_BYTESWAP_H_TRUE= GL_GENERATE_BYTESWAP_H_FALSE='#' else GL_GENERATE_BYTESWAP_H_TRUE='#' GL_GENERATE_BYTESWAP_H_FALSE= fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for strtod_l" >&5 $as_echo_n "checking for strtod_l... " >&6; } if ${gl_cv_func_strtod_l+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if HAVE_XLOCALE_H # include #endif locale_t loc; int main () { char *end; return strtod_l("0",&end,loc) < 0.0; ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : gl_cv_func_strtod_l=yes else gl_cv_func_strtod_l=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_strtod_l" >&5 $as_echo "$gl_cv_func_strtod_l" >&6; } if test $gl_cv_func_strtod_l = yes; then HAVE_STRTOD_L=1 else HAVE_STRTOD_L=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_STRTOD_L $HAVE_STRTOD_L _ACEOF case "$gl_cv_func_printf_infinite" in *yes) ;; *) $as_echo "#define NEED_PRINTF_INFINITE_DOUBLE 1" >>confdefs.h ;; esac case "$gl_cv_func_printf_long_double" in *yes) case "$gl_cv_func_printf_infinite_long_double" in *yes) ;; *) $as_echo "#define NEED_PRINTF_INFINITE_LONG_DOUBLE 1" >>confdefs.h ;; esac ;; esac case "$gl_cv_func_printf_directive_a" in *yes) ;; *) $as_echo "#define NEED_PRINTF_DIRECTIVE_A 1" >>confdefs.h for ac_func in nl_langinfo do : ac_fn_c_check_func "$LINENO" "nl_langinfo" "ac_cv_func_nl_langinfo" if test "x$ac_cv_func_nl_langinfo" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_NL_LANGINFO 1 _ACEOF fi done ;; esac case "$gl_cv_func_printf_directive_f" in *yes) ;; *) $as_echo "#define NEED_PRINTF_DIRECTIVE_F 1" >>confdefs.h ;; esac case "$gl_cv_func_printf_directive_ls" in *yes) ;; *) $as_echo "#define NEED_PRINTF_DIRECTIVE_LS 1" >>confdefs.h ;; esac case "$gl_cv_func_printf_flag_grouping" in *yes) ;; *) $as_echo "#define NEED_PRINTF_FLAG_GROUPING 1" >>confdefs.h ;; esac case "$gl_cv_func_printf_flag_leftadjust" in *yes) ;; *) $as_echo "#define NEED_PRINTF_FLAG_LEFTADJUST 1" >>confdefs.h ;; esac case "$gl_cv_func_printf_flag_zero" in *yes) ;; *) $as_echo "#define NEED_PRINTF_FLAG_ZERO 1" >>confdefs.h ;; esac case "$gl_cv_func_printf_precision" in *yes) ;; *) $as_echo "#define NEED_PRINTF_UNBOUNDED_PRECISION 1" >>confdefs.h $as_echo "#define NEED_PRINTF_DOUBLE 1" >>confdefs.h $as_echo "#define NEED_PRINTF_LONG_DOUBLE 1" >>confdefs.h ;; esac case "$gl_cv_func_printf_enomem" in *yes) ;; *) $as_echo "#define NEED_PRINTF_ENOMEM 1" >>confdefs.h $as_echo "#define NEED_PRINTF_DOUBLE 1" >>confdefs.h $as_echo "#define NEED_PRINTF_LONG_DOUBLE 1" >>confdefs.h ;; esac if test $ac_cv_func_canonicalize_file_name = no; then HAVE_CANONICALIZE_FILE_NAME=0 if test $ac_cv_func_realpath = no; then HAVE_REALPATH=0 else case "$gl_cv_func_realpath_works" in *yes) ;; *) REPLACE_REALPATH=1 ;; esac fi else case "$gl_cv_func_realpath_works" in *yes) ;; *) REPLACE_CANONICALIZE_FILE_NAME=1 REPLACE_REALPATH=1 ;; esac fi if test $HAVE_CANONICALIZE_FILE_NAME = 0 || test $REPLACE_CANONICALIZE_FILE_NAME = 1; then gl_LIBOBJS="$gl_LIBOBJS canonicalize-lgpl.$ac_objext" fi cat >>confdefs.h <<_ACEOF #define GNULIB_CANONICALIZE_LGPL 1 _ACEOF GNULIB_CANONICALIZE_FILE_NAME=1 $as_echo "#define GNULIB_TEST_CANONICALIZE_FILE_NAME 1" >>confdefs.h GNULIB_REALPATH=1 $as_echo "#define GNULIB_TEST_REALPATH 1" >>confdefs.h GNULIB_CHDIR=1 $as_echo "#define GNULIB_TEST_CHDIR 1" >>confdefs.h $as_echo "#define SIGNAL_SAFE_LIST 1" >>confdefs.h # Solaris 2.5.1 needs -lposix4 to get the clock_gettime function. # Solaris 7 prefers the library name -lrt to the obsolescent name -lposix4. # Save and restore LIBS so e.g., -lrt, isn't added to it. Otherwise, *all* # programs in the package would end up linked with that potentially-shared # library, inducing unnecessary run-time overhead. LIB_CLOCK_GETTIME= gl_saved_libs=$LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing clock_gettime" >&5 $as_echo_n "checking for library containing clock_gettime... " >&6; } if ${ac_cv_search_clock_gettime+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char clock_gettime (); int main () { return clock_gettime (); ; return 0; } _ACEOF for ac_lib in '' rt posix4; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_clock_gettime=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_clock_gettime+:} false; then : break fi done if ${ac_cv_search_clock_gettime+:} false; then : else ac_cv_search_clock_gettime=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_clock_gettime" >&5 $as_echo "$ac_cv_search_clock_gettime" >&6; } ac_res=$ac_cv_search_clock_gettime if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" test "$ac_cv_search_clock_gettime" = "none required" || LIB_CLOCK_GETTIME=$ac_cv_search_clock_gettime fi for ac_func in clock_gettime clock_settime do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done LIBS=$gl_saved_libs $as_echo "#define GNULIB_TEST_CLOEXEC 1" >>confdefs.h if test $HAVE_MSVC_INVALID_PARAMETER_HANDLER = 1; then REPLACE_CLOSE=1 fi if test $ac_cv_header_sys_socket_h != yes; then for ac_header in winsock2.h do : ac_fn_c_check_header_mongrel "$LINENO" "winsock2.h" "ac_cv_header_winsock2_h" "$ac_includes_default" if test "x$ac_cv_header_winsock2_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_WINSOCK2_H 1 _ACEOF fi done fi if test "$ac_cv_header_winsock2_h" = yes; then HAVE_WINSOCK2_H=1 UNISTD_H_HAVE_WINSOCK2_H=1 SYS_IOCTL_H_HAVE_WINSOCK2_H=1 else HAVE_WINSOCK2_H=0 fi if test $UNISTD_H_HAVE_WINSOCK2_H = 1; then REPLACE_CLOSE=1 fi if test $REPLACE_CLOSE = 1; then gl_LIBOBJS="$gl_LIBOBJS close.$ac_objext" fi GNULIB_CLOSE=1 $as_echo "#define GNULIB_TEST_CLOSE 1" >>confdefs.h if test "x$lispdir" = x; then lispdir='${datarootdir}/emacs/site-lisp' fi if test "x$runstatedir" = x; then runstatedir='${localstatedir}/run' fi pkglibexecdir='${libexecdir}/${PACKAGE}' : cat >>confdefs.h <<_ACEOF #define GNULIB_DIRNAME 1 _ACEOF { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether // is distinct from /" >&5 $as_echo_n "checking whether // is distinct from /... " >&6; } if ${gl_cv_double_slash_root+:} false; then : $as_echo_n "(cached) " >&6 else if test x"$cross_compiling" = xyes ; then # When cross-compiling, there is no way to tell whether // is special # short of a list of hosts. However, the only known hosts to date # that have a distinct // are Apollo DomainOS (too old to port to), # Cygwin, and z/OS. If anyone knows of another system for which // has # special semantics and is distinct from /, please report it to # . case $host in *-cygwin | i370-ibm-openedition) gl_cv_double_slash_root=yes ;; *) # Be optimistic and assume that / and // are the same when we # don't know. gl_cv_double_slash_root='unknown, assuming no' ;; esac else set x `ls -di / // 2>/dev/null` if test "$2" = "$4" && wc //dev/null >/dev/null 2>&1; then gl_cv_double_slash_root=no else gl_cv_double_slash_root=yes fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_double_slash_root" >&5 $as_echo "$gl_cv_double_slash_root" >&6; } if test "$gl_cv_double_slash_root" = yes; then $as_echo "#define DOUBLE_SLASH_IS_DISTINCT_ROOT 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether dup2 works" >&5 $as_echo_n "checking whether dup2 works... " >&6; } if ${gl_cv_func_dup2_works+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : case "$host_os" in mingw*) # on this platform, dup2 always returns 0 for success gl_cv_func_dup2_works="guessing no" ;; cygwin*) # on cygwin 1.5.x, dup2(1,1) returns 0 gl_cv_func_dup2_works="guessing no" ;; aix* | freebsd*) # on AIX 7.1 and FreeBSD 6.1, dup2 (1,toobig) gives EMFILE, # not EBADF. gl_cv_func_dup2_works="guessing no" ;; haiku*) # on Haiku alpha 2, dup2(1, 1) resets FD_CLOEXEC. gl_cv_func_dup2_works="guessing no" ;; *-android*) # implemented using dup3(), which fails if oldfd == newfd gl_cv_func_dup2_works="guessing no" ;; os2*) # on OS/2 kLIBC, dup2() does not work on a directory fd. gl_cv_func_dup2_works="guessing no" ;; *) gl_cv_func_dup2_works="guessing yes" ;; esac else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include #include #ifndef RLIM_SAVED_CUR # define RLIM_SAVED_CUR RLIM_INFINITY #endif #ifndef RLIM_SAVED_MAX # define RLIM_SAVED_MAX RLIM_INFINITY #endif int main () { int result = 0; int bad_fd = INT_MAX; struct rlimit rlim; if (getrlimit (RLIMIT_NOFILE, &rlim) == 0 && 0 <= rlim.rlim_cur && rlim.rlim_cur <= INT_MAX && rlim.rlim_cur != RLIM_INFINITY && rlim.rlim_cur != RLIM_SAVED_MAX && rlim.rlim_cur != RLIM_SAVED_CUR) bad_fd = rlim.rlim_cur; #ifdef FD_CLOEXEC if (fcntl (1, F_SETFD, FD_CLOEXEC) == -1) result |= 1; #endif if (dup2 (1, 1) != 1) result |= 2; #ifdef FD_CLOEXEC if (fcntl (1, F_GETFD) != FD_CLOEXEC) result |= 4; #endif close (0); if (dup2 (0, 0) != -1) result |= 8; /* Many gnulib modules require POSIX conformance of EBADF. */ if (dup2 (2, bad_fd) == -1 && errno != EBADF) result |= 16; /* Flush out some cygwin core dumps. */ if (dup2 (2, -1) != -1 || errno != EBADF) result |= 32; dup2 (2, 255); dup2 (2, 256); /* On OS/2 kLIBC, dup2() does not work on a directory fd. */ { int fd = open (".", O_RDONLY); if (fd == -1) result |= 64; else if (dup2 (fd, fd + 1) == -1) result |= 128; close (fd); } return result; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : gl_cv_func_dup2_works=yes else gl_cv_func_dup2_works=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_dup2_works" >&5 $as_echo "$gl_cv_func_dup2_works" >&6; } case "$gl_cv_func_dup2_works" in *yes) ;; *) REPLACE_DUP2=1 for ac_func in setdtablesize do : ac_fn_c_check_func "$LINENO" "setdtablesize" "ac_cv_func_setdtablesize" if test "x$ac_cv_func_setdtablesize" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_SETDTABLESIZE 1 _ACEOF fi done ;; esac if test $REPLACE_DUP2 = 1; then gl_LIBOBJS="$gl_LIBOBJS dup2.$ac_objext" fi GNULIB_DUP2=1 $as_echo "#define GNULIB_TEST_DUP2 1" >>confdefs.h GNULIB_ENVIRON=1 $as_echo "#define GNULIB_TEST_ENVIRON 1" >>confdefs.h { $as_echo "$as_me:${as_lineno-$LINENO}: checking for error_at_line" >&5 $as_echo_n "checking for error_at_line... " >&6; } if ${ac_cv_lib_error_at_line+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { error_at_line (0, 0, "", 0, "an error occurred"); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_error_at_line=yes else ac_cv_lib_error_at_line=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_error_at_line" >&5 $as_echo "$ac_cv_lib_error_at_line" >&6; } if test $ac_cv_lib_error_at_line = no; then gl_LIBOBJS="$gl_LIBOBJS error.$ac_objext" : fi XGETTEXT_EXTRA_OPTIONS="$XGETTEXT_EXTRA_OPTIONS --flag=error:3:c-format" XGETTEXT_EXTRA_OPTIONS="$XGETTEXT_EXTRA_OPTIONS --flag=error_at_line:5:c-format" if test $ac_cv_func_explicit_bzero = no; then HAVE_EXPLICIT_BZERO=0 fi if test $HAVE_EXPLICIT_BZERO = 0; then gl_LIBOBJS="$gl_LIBOBJS explicit_bzero.$ac_objext" for ac_func in explicit_memset do : ac_fn_c_check_func "$LINENO" "explicit_memset" "ac_cv_func_explicit_memset" if test "x$ac_cv_func_explicit_memset" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_EXPLICIT_MEMSET 1 _ACEOF fi done fi GNULIB_EXPLICIT_BZERO=1 $as_echo "#define GNULIB_TEST_EXPLICIT_BZERO 1" >>confdefs.h : if test $ac_cv_func_fcntl = no; then if test $ac_cv_func_fcntl = no; then HAVE_FCNTL=0 else REPLACE_FCNTL=1 fi else { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether fcntl handles F_DUPFD correctly" >&5 $as_echo_n "checking whether fcntl handles F_DUPFD correctly... " >&6; } if ${gl_cv_func_fcntl_f_dupfd_works+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : case $host_os in aix* | cygwin* | haiku*) gl_cv_func_fcntl_f_dupfd_works="guessing no" ;; *) gl_cv_func_fcntl_f_dupfd_works="guessing yes" ;; esac else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include #include #ifndef RLIM_SAVED_CUR # define RLIM_SAVED_CUR RLIM_INFINITY #endif #ifndef RLIM_SAVED_MAX # define RLIM_SAVED_MAX RLIM_INFINITY #endif int main () { int result = 0; int bad_fd = INT_MAX; struct rlimit rlim; if (getrlimit (RLIMIT_NOFILE, &rlim) == 0 && 0 <= rlim.rlim_cur && rlim.rlim_cur <= INT_MAX && rlim.rlim_cur != RLIM_INFINITY && rlim.rlim_cur != RLIM_SAVED_MAX && rlim.rlim_cur != RLIM_SAVED_CUR) bad_fd = rlim.rlim_cur; if (fcntl (0, F_DUPFD, -1) != -1) result |= 1; if (errno != EINVAL) result |= 2; if (fcntl (0, F_DUPFD, bad_fd) != -1) result |= 4; if (errno != EINVAL) result |= 8; /* On OS/2 kLIBC, F_DUPFD does not work on a directory fd */ { int fd; fd = open (".", O_RDONLY); if (fd == -1) result |= 16; else if (fcntl (fd, F_DUPFD, STDERR_FILENO + 1) == -1) result |= 32; close (fd); } return result; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : gl_cv_func_fcntl_f_dupfd_works=yes else gl_cv_func_fcntl_f_dupfd_works=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_fcntl_f_dupfd_works" >&5 $as_echo "$gl_cv_func_fcntl_f_dupfd_works" >&6; } case $gl_cv_func_fcntl_f_dupfd_works in *yes) ;; *) if test $ac_cv_func_fcntl = no; then HAVE_FCNTL=0 else REPLACE_FCNTL=1 fi $as_echo "#define FCNTL_DUPFD_BUGGY 1" >>confdefs.h ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether fcntl understands F_DUPFD_CLOEXEC" >&5 $as_echo_n "checking whether fcntl understands F_DUPFD_CLOEXEC... " >&6; } if ${gl_cv_func_fcntl_f_dupfd_cloexec+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #ifndef F_DUPFD_CLOEXEC choke me #endif int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __linux__ /* The Linux kernel only added F_DUPFD_CLOEXEC in 2.6.24, so we always replace it to support the semantics on older kernels that failed with EINVAL. */ choke me #endif int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : gl_cv_func_fcntl_f_dupfd_cloexec=yes else gl_cv_func_fcntl_f_dupfd_cloexec="needs runtime check" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext else gl_cv_func_fcntl_f_dupfd_cloexec=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_fcntl_f_dupfd_cloexec" >&5 $as_echo "$gl_cv_func_fcntl_f_dupfd_cloexec" >&6; } if test "$gl_cv_func_fcntl_f_dupfd_cloexec" != yes; then if test $ac_cv_func_fcntl = no; then HAVE_FCNTL=0 else REPLACE_FCNTL=1 fi fi fi if test $HAVE_FCNTL = 0 || test $REPLACE_FCNTL = 1; then gl_LIBOBJS="$gl_LIBOBJS fcntl.$ac_objext" fi GNULIB_FCNTL=1 $as_echo "#define GNULIB_TEST_FCNTL 1" >>confdefs.h if test $gl_cv_have_include_next = yes; then gl_cv_next_fcntl_h='<'fcntl.h'>' else { $as_echo "$as_me:${as_lineno-$LINENO}: checking absolute name of " >&5 $as_echo_n "checking absolute name of ... " >&6; } if ${gl_cv_next_fcntl_h+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF case "$host_os" in aix*) gl_absname_cpp="$ac_cpp -C" ;; *) gl_absname_cpp="$ac_cpp" ;; esac case "$host_os" in mingw*) gl_dirsep_regex='[/\\]' ;; *) gl_dirsep_regex='\/' ;; esac gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g' gl_header_literal_regex=`echo 'fcntl.h' \ | sed -e "$gl_make_literal_regex_sed"` gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{ s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/ s|^/[^/]|//&| p q }' gl_cv_absolute_fcntl_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 | sed -n "$gl_absolute_header_sed"` gl_header=$gl_cv_absolute_fcntl_h gl_cv_next_fcntl_h='"'$gl_header'"' fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_fcntl_h" >&5 $as_echo "$gl_cv_next_fcntl_h" >&6; } fi NEXT_FCNTL_H=$gl_cv_next_fcntl_h if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next' gl_next_as_first_directive='<'fcntl.h'>' else # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include' gl_next_as_first_directive=$gl_cv_next_fcntl_h fi NEXT_AS_FIRST_DIRECTIVE_FCNTL_H=$gl_next_as_first_directive { $as_echo "$as_me:${as_lineno-$LINENO}: checking for flexible array member" >&5 $as_echo_n "checking for flexible array member... " >&6; } if ${ac_cv_c_flexmember+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include struct m { struct m *next, **list; char name[]; }; struct s { struct s *p; struct m *m; int n; double d[]; }; int main () { int m = getchar (); size_t nbytes = offsetof (struct s, d) + m * sizeof (double); nbytes += sizeof (struct s) - 1; nbytes -= nbytes % sizeof (struct s); struct s *p = malloc (nbytes); p->p = p; p->m = NULL; p->d[0] = 0.0; return p->d != (double *) NULL; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_flexmember=yes else ac_cv_c_flexmember=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_flexmember" >&5 $as_echo "$ac_cv_c_flexmember" >&6; } if test $ac_cv_c_flexmember = yes; then $as_echo "#define FLEXIBLE_ARRAY_MEMBER /**/" >>confdefs.h else $as_echo "#define FLEXIBLE_ARRAY_MEMBER 1" >>confdefs.h fi FLOAT_H= REPLACE_FLOAT_LDBL=0 case "$host_os" in aix* | beos* | openbsd* | mirbsd* | irix*) FLOAT_H=float.h ;; freebsd* | dragonfly*) case "$host_cpu" in i[34567]86 ) FLOAT_H=float.h ;; x86_64 ) # On x86_64 systems, the C compiler may still be generating # 32-bit code. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #if defined __LP64__ || defined __x86_64__ || defined __amd64__ int ok; #else error fail #endif _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else FLOAT_H=float.h fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ;; esac ;; linux*) case "$host_cpu" in powerpc*) FLOAT_H=float.h ;; esac ;; esac case "$host_os" in aix* | freebsd* | dragonfly* | linux*) if test -n "$FLOAT_H"; then REPLACE_FLOAT_LDBL=1 fi ;; esac REPLACE_ITOLD=0 { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether conversion from 'int' to 'long double' works" >&5 $as_echo_n "checking whether conversion from 'int' to 'long double' works... " >&6; } if ${gl_cv_func_itold_works+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : case "$host" in sparc*-*-linux*) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #if defined __LP64__ || defined __arch64__ int ok; #else error fail #endif _ACEOF if ac_fn_c_try_compile "$LINENO"; then : gl_cv_func_itold_works="guessing no" else gl_cv_func_itold_works="guessing yes" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ;; # Guess yes on native Windows. mingw*) gl_cv_func_itold_works="guessing yes" ;; *) gl_cv_func_itold_works="guessing yes" ;; esac else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int i = -1; volatile long double ld; int main () { ld += i * 1.0L; if (ld > 0) return 1; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : gl_cv_func_itold_works=yes else gl_cv_func_itold_works=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_itold_works" >&5 $as_echo "$gl_cv_func_itold_works" >&6; } case "$gl_cv_func_itold_works" in *no) REPLACE_ITOLD=1 FLOAT_H=float.h ;; esac if test -n "$FLOAT_H"; then if test $gl_cv_have_include_next = yes; then gl_cv_next_float_h='<'float.h'>' else { $as_echo "$as_me:${as_lineno-$LINENO}: checking absolute name of " >&5 $as_echo_n "checking absolute name of ... " >&6; } if ${gl_cv_next_float_h+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF case "$host_os" in aix*) gl_absname_cpp="$ac_cpp -C" ;; *) gl_absname_cpp="$ac_cpp" ;; esac case "$host_os" in mingw*) gl_dirsep_regex='[/\\]' ;; *) gl_dirsep_regex='\/' ;; esac gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g' gl_header_literal_regex=`echo 'float.h' \ | sed -e "$gl_make_literal_regex_sed"` gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{ s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/ s|^/[^/]|//&| p q }' gl_cv_absolute_float_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 | sed -n "$gl_absolute_header_sed"` gl_header=$gl_cv_absolute_float_h gl_cv_next_float_h='"'$gl_header'"' fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_float_h" >&5 $as_echo "$gl_cv_next_float_h" >&6; } fi NEXT_FLOAT_H=$gl_cv_next_float_h if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next' gl_next_as_first_directive='<'float.h'>' else # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include' gl_next_as_first_directive=$gl_cv_next_float_h fi NEXT_AS_FIRST_DIRECTIVE_FLOAT_H=$gl_next_as_first_directive fi if test -n "$FLOAT_H"; then GL_GENERATE_FLOAT_H_TRUE= GL_GENERATE_FLOAT_H_FALSE='#' else GL_GENERATE_FLOAT_H_TRUE='#' GL_GENERATE_FLOAT_H_FALSE= fi if test $REPLACE_FLOAT_LDBL = 1; then gl_LIBOBJS="$gl_LIBOBJS float.$ac_objext" fi if test $REPLACE_ITOLD = 1; then gl_LIBOBJS="$gl_LIBOBJS itold.$ac_objext" fi if test $REPLACE_FLOOR = 1; then gl_LIBOBJS="$gl_LIBOBJS floor.$ac_objext" fi GNULIB_FLOOR=1 $as_echo "#define GNULIB_TEST_FLOOR 1" >>confdefs.h case "$host_os" in mingw* | pw*) REPLACE_FOPEN=1 gl_cv_func_fopen_slash="guessing no" ;; *) { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether fopen recognizes a trailing slash" >&5 $as_echo_n "checking whether fopen recognizes a trailing slash... " >&6; } if ${gl_cv_func_fopen_slash+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : case "$host_os" in aix* | hpux* | solaris2.[0-9] | solaris2.[0-9].*) gl_cv_func_fopen_slash="guessing no" ;; *) gl_cv_func_fopen_slash="guessing yes" ;; esac else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { FILE *fp = fopen ("conftest.sl/", "w"); int result = (fp != NULL); if (fp != NULL) fclose (fp); return result; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : gl_cv_func_fopen_slash=yes else gl_cv_func_fopen_slash=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi rm -f conftest.sl fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_fopen_slash" >&5 $as_echo "$gl_cv_func_fopen_slash" >&6; } ;; esac case "$gl_cv_func_fopen_slash" in *no) $as_echo "#define FOPEN_TRAILING_SLASH_BUG 1" >>confdefs.h REPLACE_FOPEN=1 ;; esac if test $REPLACE_FOPEN = 1; then gl_LIBOBJS="$gl_LIBOBJS fopen.$ac_objext" : fi GNULIB_FOPEN=1 $as_echo "#define GNULIB_TEST_FOPEN 1" >>confdefs.h { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether fopen supports the mode character 'x'" >&5 $as_echo_n "checking whether fopen supports the mode character 'x'... " >&6; } if ${gl_cv_func_fopen_mode_x+:} false; then : $as_echo_n "(cached) " >&6 else rm -f conftest.x if test "$cross_compiling" = yes; then : case "$host_os" in # Guess yes on glibc and musl systems. linux*-gnu* | gnu* | kfreebsd*-gnu | *-musl*) gl_cv_func_fopen_mode_x="guessing yes" ;; # If we don't know, obey --enable-cross-guesses. *) gl_cv_func_fopen_mode_x="$gl_cross_guess_normal" ;; esac else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { FILE *fp; fp = fopen ("conftest.x", "w"); fclose (fp); fp = fopen ("conftest.x", "wx"); if (fp != NULL) /* 'x' ignored */ return 1; else if (errno == EEXIST) return 0; else /* 'x' rejected */ return 2; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : gl_cv_func_fopen_mode_x=yes else gl_cv_func_fopen_mode_x=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi rm -f conftest.x fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_fopen_mode_x" >&5 $as_echo "$gl_cv_func_fopen_mode_x" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether fopen supports the mode character 'e'" >&5 $as_echo_n "checking whether fopen supports the mode character 'e'... " >&6; } if ${gl_cv_func_fopen_mode_e+:} false; then : $as_echo_n "(cached) " >&6 else echo foo > conftest.x if test "$cross_compiling" = yes; then : case "$host_os" in # Guess yes on glibc and musl systems. linux*-gnu* | gnu* | kfreebsd*-gnu | *-musl*) gl_cv_func_fopen_mode_e="guessing yes" ;; # Guess no on native Windows. mingw*) gl_cv_func_fopen_mode_e="guessing no" ;; # If we don't know, obey --enable-cross-guesses. *) gl_cv_func_fopen_mode_e="$gl_cross_guess_normal" ;; esac else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include int main () { FILE *fp = fopen ("conftest.x", "re"); if (fp != NULL) { if (fcntl (fileno (fp), F_GETFD) & FD_CLOEXEC) return 0; else /* 'e' ignored */ return 1; } else /* 'e' rejected */ return 2; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : gl_cv_func_fopen_mode_e=yes else gl_cv_func_fopen_mode_e=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi rm -f conftest.x fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_fopen_mode_e" >&5 $as_echo "$gl_cv_func_fopen_mode_e" >&6; } case "$gl_cv_func_fopen_mode_x" in *no) REPLACE_FOPEN=1 ;; esac case "$gl_cv_func_fopen_mode_e" in *no) REPLACE_FOPEN=1 ;; esac if test $REPLACE_FOPEN = 1; then gl_LIBOBJS="$gl_LIBOBJS fopen.$ac_objext" : fi cat >>confdefs.h <<_ACEOF #define GNULIB_FOPEN_GNU 1 _ACEOF gl_cv_func_fprintf_posix=no case "$gl_cv_func_printf_sizes_c99" in *yes) case "$gl_cv_func_printf_long_double" in *yes) case "$gl_cv_func_printf_infinite" in *yes) case "$gl_cv_func_printf_infinite_long_double" in *yes) case "$gl_cv_func_printf_directive_a" in *yes) case "$gl_cv_func_printf_directive_f" in *yes) case "$gl_cv_func_printf_directive_n" in *yes) case "$gl_cv_func_printf_directive_ls" in *yes) case "$gl_cv_func_printf_positions" in *yes) case "$gl_cv_func_printf_flag_grouping" in *yes) case "$gl_cv_func_printf_flag_leftadjust" in *yes) case "$gl_cv_func_printf_flag_zero" in *yes) case "$gl_cv_func_printf_precision" in *yes) case "$gl_cv_func_printf_enomem" in *yes) # fprintf exists and is # already POSIX compliant. gl_cv_func_fprintf_posix=yes ;; esac ;; esac ;; esac ;; esac ;; esac ;; esac ;; esac ;; esac ;; esac ;; esac ;; esac ;; esac ;; esac ;; esac if test $gl_cv_func_fprintf_posix = no; then case "$gl_cv_func_printf_infinite" in *yes) ;; *) $as_echo "#define NEED_PRINTF_INFINITE_DOUBLE 1" >>confdefs.h ;; esac case "$gl_cv_func_printf_long_double" in *yes) case "$gl_cv_func_printf_infinite_long_double" in *yes) ;; *) $as_echo "#define NEED_PRINTF_INFINITE_LONG_DOUBLE 1" >>confdefs.h ;; esac ;; esac case "$gl_cv_func_printf_directive_a" in *yes) ;; *) $as_echo "#define NEED_PRINTF_DIRECTIVE_A 1" >>confdefs.h for ac_func in nl_langinfo do : ac_fn_c_check_func "$LINENO" "nl_langinfo" "ac_cv_func_nl_langinfo" if test "x$ac_cv_func_nl_langinfo" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_NL_LANGINFO 1 _ACEOF fi done ;; esac case "$gl_cv_func_printf_directive_f" in *yes) ;; *) $as_echo "#define NEED_PRINTF_DIRECTIVE_F 1" >>confdefs.h ;; esac case "$gl_cv_func_printf_directive_ls" in *yes) ;; *) $as_echo "#define NEED_PRINTF_DIRECTIVE_LS 1" >>confdefs.h ;; esac case "$gl_cv_func_printf_flag_grouping" in *yes) ;; *) $as_echo "#define NEED_PRINTF_FLAG_GROUPING 1" >>confdefs.h ;; esac case "$gl_cv_func_printf_flag_leftadjust" in *yes) ;; *) $as_echo "#define NEED_PRINTF_FLAG_LEFTADJUST 1" >>confdefs.h ;; esac case "$gl_cv_func_printf_flag_zero" in *yes) ;; *) $as_echo "#define NEED_PRINTF_FLAG_ZERO 1" >>confdefs.h ;; esac case "$gl_cv_func_printf_precision" in *yes) ;; *) $as_echo "#define NEED_PRINTF_UNBOUNDED_PRECISION 1" >>confdefs.h $as_echo "#define NEED_PRINTF_DOUBLE 1" >>confdefs.h $as_echo "#define NEED_PRINTF_LONG_DOUBLE 1" >>confdefs.h ;; esac case "$gl_cv_func_printf_enomem" in *yes) ;; *) $as_echo "#define NEED_PRINTF_ENOMEM 1" >>confdefs.h $as_echo "#define NEED_PRINTF_DOUBLE 1" >>confdefs.h $as_echo "#define NEED_PRINTF_LONG_DOUBLE 1" >>confdefs.h ;; esac gl_LIBOBJS="$gl_LIBOBJS vasnprintf.$ac_objext" gl_LIBOBJS="$gl_LIBOBJS printf-args.$ac_objext" gl_LIBOBJS="$gl_LIBOBJS printf-parse.$ac_objext" gl_LIBOBJS="$gl_LIBOBJS asnprintf.$ac_objext" if test $ac_cv_func_vasnprintf = yes; then $as_echo "#define REPLACE_VASNPRINTF 1" >>confdefs.h fi ac_fn_c_check_type "$LINENO" "ptrdiff_t" "ac_cv_type_ptrdiff_t" "$ac_includes_default" if test "x$ac_cv_type_ptrdiff_t" = xyes; then : else $as_echo "#define ptrdiff_t long" >>confdefs.h fi gl_LIBOBJS="$gl_LIBOBJS fprintf.$ac_objext" REPLACE_FPRINTF=1 $as_echo "#define REPLACE_FPRINTF_POSIX 1" >>confdefs.h : fi GNULIB_FPRINTF_POSIX=1 $as_echo "#define GNULIB_TEST_FPRINTF_POSIX 1" >>confdefs.h if test $gl_cv_func_frexp_no_libm = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether frexp works" >&5 $as_echo_n "checking whether frexp works... " >&6; } if ${gl_cv_func_frexp_works+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : case "$host_os" in netbsd* | irix*) gl_cv_func_frexp_works="guessing no" ;; mingw*) # Guess yes with MSVC, no with mingw. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef _MSC_VER Good #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "Good" >/dev/null 2>&1; then : gl_cv_func_frexp_works="guessing yes" else gl_cv_func_frexp_works="guessing no" fi rm -f conftest* ;; *) gl_cv_func_frexp_works="guessing yes" ;; esac else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #if HAVE_DECL_ALARM # include # include #endif /* HP cc on HP-UX 10.20 has a bug with the constant expression -0.0. ICC 10.0 has a bug when optimizing the expression -zero. The expression -DBL_MIN * DBL_MIN does not work when cross-compiling to PowerPC on Mac OS X 10.5. */ #if defined __hpux || defined __sgi || defined __ICC static double compute_minus_zero (void) { return -DBL_MIN * DBL_MIN; } # define minus_zero compute_minus_zero () #else double minus_zero = -0.0; #endif int main() { int result = 0; int i; volatile double x; double zero = 0.0; #if HAVE_DECL_ALARM /* NeXTstep 3.3 frexp() runs into an endless loop when called on an infinite number. Let the test fail in this case. */ signal (SIGALRM, SIG_DFL); alarm (5); #endif /* Test on denormalized numbers. */ for (i = 1, x = 1.0; i >= DBL_MIN_EXP; i--, x *= 0.5) ; if (x > 0.0) { int exp; double y = frexp (x, &exp); /* On machines with IEEE754 arithmetic: x = 1.11254e-308, exp = -1022. On NetBSD: y = 0.75. Correct: y = 0.5. */ if (y != 0.5) result |= 1; } /* Test on infinite numbers. */ x = 1.0 / zero; { int exp; double y = frexp (x, &exp); if (y != x) result |= 2; } /* Test on negative zero. */ x = minus_zero; { int exp; double y = frexp (x, &exp); if (memcmp (&y, &x, sizeof x)) result |= 4; } return result; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : gl_cv_func_frexp_works=yes else gl_cv_func_frexp_works=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_frexp_works" >&5 $as_echo "$gl_cv_func_frexp_works" >&6; } case "$gl_cv_func_frexp_works" in *yes) gl_func_frexp_no_libm=yes ;; *) gl_func_frexp_no_libm=no; REPLACE_FREXP=1 ;; esac else gl_func_frexp_no_libm=no REPLACE_FREXP=1 fi if test $gl_func_frexp_no_libm = yes; then $as_echo "#define HAVE_FREXP_IN_LIBC 1" >>confdefs.h fi if test $gl_func_frexp_no_libm != yes; then gl_LIBOBJS="$gl_LIBOBJS frexp.$ac_objext" fi GNULIB_FREXP=1 $as_echo "#define GNULIB_TEST_FREXP 1" >>confdefs.h ac_fn_c_check_decl "$LINENO" "frexpl" "ac_cv_have_decl_frexpl" "#include " if test "x$ac_cv_have_decl_frexpl" = xyes; then : else HAVE_DECL_FREXPL=0 fi if test $HAVE_DECL_FREXPL = 1; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether frexpl() can be used without linking with libm" >&5 $as_echo_n "checking whether frexpl() can be used without linking with libm... " >&6; } if ${gl_cv_func_frexpl_no_libm+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include long double x; int main () { int e; return frexpl (x, &e) > 0; ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : gl_cv_func_frexpl_no_libm=yes else gl_cv_func_frexpl_no_libm=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_frexpl_no_libm" >&5 $as_echo "$gl_cv_func_frexpl_no_libm" >&6; } if test $gl_cv_func_frexpl_no_libm = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether frexpl works" >&5 $as_echo_n "checking whether frexpl works... " >&6; } if ${gl_cv_func_frexpl_works+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : case "$host_os" in aix | aix[3-6]* | beos* | darwin* | irix* | mingw* | pw*) gl_cv_func_frexpl_works="guessing no";; *) gl_cv_func_frexpl_works="guessing yes";; esac else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include /* Override the values of , like done in float.in.h. */ #if defined __i386__ && (defined __BEOS__ || defined __OpenBSD__) # undef LDBL_MIN_EXP # define LDBL_MIN_EXP (-16381) #endif #if defined __i386__ && (defined __FreeBSD__ || defined __DragonFly__) # undef LDBL_MIN_EXP # define LDBL_MIN_EXP (-16381) #endif #if (defined _ARCH_PPC || defined _POWER) && defined _AIX && (LDBL_MANT_DIG == 106) && defined __GNUC__ # undef LDBL_MIN_EXP # define LDBL_MIN_EXP DBL_MIN_EXP #endif #if defined __sgi && (LDBL_MANT_DIG >= 106) # if defined __GNUC__ # undef LDBL_MIN_EXP # define LDBL_MIN_EXP DBL_MIN_EXP # endif #endif extern #ifdef __cplusplus "C" #endif long double frexpl (long double, int *); int main() { int result = 0; volatile long double x; /* Test on finite numbers that fails on AIX 5.1. */ x = 16.0L; { int exp = -9999; frexpl (x, &exp); if (exp != 5) result |= 1; } /* Test on finite numbers that fails on Mac OS X 10.4, because its frexpl function returns an invalid (incorrectly normalized) value: it returns y = { 0x3fe028f5, 0xc28f5c28, 0x3c9eb851, 0xeb851eb8 } but the correct result is 0.505L = { 0x3fe028f5, 0xc28f5c29, 0xbc547ae1, 0x47ae1480 } */ x = 1.01L; { int exp = -9999; long double y = frexpl (x, &exp); if (!(exp == 1 && y == 0.505L)) result |= 2; } /* Test on large finite numbers. This fails on BeOS at i = 16322, while LDBL_MAX_EXP = 16384. In the loop end test, we test x against Infinity, rather than comparing i with LDBL_MAX_EXP, because BeOS has a wrong LDBL_MAX_EXP. */ { int i; for (i = 1, x = 1.0L; x != x + x; i++, x *= 2.0L) { int exp = -9999; frexpl (x, &exp); if (exp != i) { result |= 4; break; } } } /* Test on denormalized numbers. */ { int i; for (i = 1, x = 1.0L; i >= LDBL_MIN_EXP; i--, x *= 0.5L) ; if (x > 0.0L) { int exp; long double y = frexpl (x, &exp); /* On machines with IEEE854 arithmetic: x = 1.68105e-4932, exp = -16382, y = 0.5. On Mac OS X 10.5: exp = -16384, y = 0.5. */ if (exp != LDBL_MIN_EXP - 1) result |= 8; } } /* Test on infinite numbers. */ x = 1.0L / 0.0L; { int exp; long double y = frexpl (x, &exp); if (y != x) result |= 16; } return result; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : gl_cv_func_frexpl_works=yes else gl_cv_func_frexpl_works=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_frexpl_works" >&5 $as_echo "$gl_cv_func_frexpl_works" >&6; } case "$gl_cv_func_frexpl_works" in *yes) gl_func_frexpl_no_libm=yes ;; *) gl_func_frexpl_no_libm=no; REPLACE_FREXPL=1 ;; esac else gl_func_frexpl_no_libm=no REPLACE_FREXPL=1 fi if test $gl_func_frexpl_no_libm = yes; then $as_echo "#define HAVE_FREXPL_IN_LIBC 1" >>confdefs.h fi fi if test $HAVE_DECL_FREXPL = 0 || test $gl_func_frexpl_no_libm = no; then gl_LIBOBJS="$gl_LIBOBJS frexpl.$ac_objext" fi GNULIB_FREXPL=1 $as_echo "#define GNULIB_TEST_FREXPL 1" >>confdefs.h if test $HAVE_FSEEKO = 0 || test $REPLACE_FSEEKO = 1; then REPLACE_FSEEK=1 fi if test $REPLACE_FSEEK = 1; then gl_LIBOBJS="$gl_LIBOBJS fseek.$ac_objext" fi GNULIB_FSEEK=1 $as_echo "#define GNULIB_TEST_FSEEK 1" >>confdefs.h { $as_echo "$as_me:${as_lineno-$LINENO}: checking for fseeko" >&5 $as_echo_n "checking for fseeko... " >&6; } if ${gl_cv_func_fseeko+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { fseeko (stdin, 0, 0); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : gl_cv_func_fseeko=yes else gl_cv_func_fseeko=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_fseeko" >&5 $as_echo "$gl_cv_func_fseeko" >&6; } if test $ac_cv_have_decl_fseeko = no; then HAVE_DECL_FSEEKO=0 fi if test $gl_cv_func_fseeko = no; then HAVE_FSEEKO=0 else if test $WINDOWS_64_BIT_OFF_T = 1; then REPLACE_FSEEKO=1 fi if test $gl_cv_var_stdin_large_offset = no; then REPLACE_FSEEKO=1 fi fi if test $HAVE_FSEEKO = 0 || test $REPLACE_FSEEKO = 1; then gl_LIBOBJS="$gl_LIBOBJS fseeko.$ac_objext" for ac_func in _fseeki64 do : ac_fn_c_check_func "$LINENO" "_fseeki64" "ac_cv_func__fseeki64" if test "x$ac_cv_func__fseeki64" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE__FSEEKI64 1 _ACEOF fi done if test $ac_cv_func__fseeki64 = yes; then ac_fn_c_check_decl "$LINENO" "_fseeki64" "ac_cv_have_decl__fseeki64" "$ac_includes_default" if test "x$ac_cv_have_decl__fseeki64" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL__FSEEKI64 $ac_have_decl _ACEOF fi fi GNULIB_FSEEKO=1 $as_echo "#define GNULIB_TEST_FSEEKO 1" >>confdefs.h if test $ac_cv_func___fseterr = no; then gl_LIBOBJS="$gl_LIBOBJS fseterr.$ac_objext" fi case "$host_os" in mingw* | solaris*) REPLACE_FSTAT=1 ;; esac if test $REPLACE_FSTAT = 1; then gl_LIBOBJS="$gl_LIBOBJS fstat.$ac_objext" case "$host_os" in mingw*) gl_LIBOBJS="$gl_LIBOBJS stat-w32.$ac_objext" ;; esac : fi GNULIB_FSTAT=1 $as_echo "#define GNULIB_TEST_FSTAT 1" >>confdefs.h if test $HAVE_FTELLO = 0 || test $REPLACE_FTELLO = 1; then REPLACE_FTELL=1 fi if test $REPLACE_FTELL = 1; then gl_LIBOBJS="$gl_LIBOBJS ftell.$ac_objext" fi GNULIB_FTELL=1 $as_echo "#define GNULIB_TEST_FTELL 1" >>confdefs.h if test $ac_cv_have_decl_ftello = no; then HAVE_DECL_FTELLO=0 fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ftello" >&5 $as_echo_n "checking for ftello... " >&6; } if ${gl_cv_func_ftello+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { ftello (stdin); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : gl_cv_func_ftello=yes else gl_cv_func_ftello=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_ftello" >&5 $as_echo "$gl_cv_func_ftello" >&6; } if test $gl_cv_func_ftello = no; then HAVE_FTELLO=0 else if test $WINDOWS_64_BIT_OFF_T = 1; then REPLACE_FTELLO=1 fi if test $gl_cv_var_stdin_large_offset = no; then REPLACE_FTELLO=1 fi if test $REPLACE_FTELLO = 0; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ftello works" >&5 $as_echo_n "checking whether ftello works... " >&6; } if ${gl_cv_func_ftello_works+:} false; then : $as_echo_n "(cached) " >&6 else case "$host_os" in # Guess no on Solaris. solaris*) gl_cv_func_ftello_works="guessing no" ;; # Guess yes on native Windows. mingw*) gl_cv_func_ftello_works="guessing yes" ;; # Guess yes otherwise. *) gl_cv_func_ftello_works="guessing yes" ;; esac if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #define TESTFILE "conftest.tmp" int main (void) { FILE *fp; /* Create a file with some contents. */ fp = fopen (TESTFILE, "w"); if (fp == NULL) return 70; if (fwrite ("foogarsh", 1, 8, fp) < 8) { fclose (fp); return 71; } if (fclose (fp)) return 72; /* The file's contents is now "foogarsh". */ /* Try writing after reading to EOF. */ fp = fopen (TESTFILE, "r+"); if (fp == NULL) return 73; if (fseek (fp, -1, SEEK_END)) { fclose (fp); return 74; } if (!(getc (fp) == 'h')) { fclose (fp); return 1; } if (!(getc (fp) == EOF)) { fclose (fp); return 2; } if (!(ftell (fp) == 8)) { fclose (fp); return 3; } if (!(ftell (fp) == 8)) { fclose (fp); return 4; } if (!(putc ('!', fp) == '!')) { fclose (fp); return 5; } if (!(ftell (fp) == 9)) { fclose (fp); return 6; } if (!(fclose (fp) == 0)) return 7; fp = fopen (TESTFILE, "r"); if (fp == NULL) return 75; { char buf[10]; if (!(fread (buf, 1, 10, fp) == 9)) { fclose (fp); return 10; } if (!(memcmp (buf, "foogarsh!", 9) == 0)) { fclose (fp); return 11; } } if (!(fclose (fp) == 0)) return 12; /* The file's contents is now "foogarsh!". */ return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : gl_cv_func_ftello_works=yes else gl_cv_func_ftello_works=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_ftello_works" >&5 $as_echo "$gl_cv_func_ftello_works" >&6; } case "$gl_cv_func_ftello_works" in *yes) ;; *) REPLACE_FTELLO=1 $as_echo "#define FTELLO_BROKEN_AFTER_SWITCHING_FROM_READ_TO_WRITE 1" >>confdefs.h ;; esac fi fi if test $HAVE_FTELLO = 0 || test $REPLACE_FTELLO = 1; then gl_LIBOBJS="$gl_LIBOBJS ftello.$ac_objext" for ac_func in _ftelli64 do : ac_fn_c_check_func "$LINENO" "_ftelli64" "ac_cv_func__ftelli64" if test "x$ac_cv_func__ftelli64" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE__FTELLI64 1 _ACEOF fi done fi GNULIB_FTELLO=1 $as_echo "#define GNULIB_TEST_FTELLO 1" >>confdefs.h cat >>confdefs.h <<_ACEOF #define GNULIB_FWRITEERROR 1 _ACEOF if test $ac_cv_func_getdelim = yes; then HAVE_GETDELIM=1 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working getdelim function" >&5 $as_echo_n "checking for working getdelim function... " >&6; } if ${gl_cv_func_working_getdelim+:} false; then : $as_echo_n "(cached) " >&6 else echo fooNbarN | tr -d '\012' | tr N '\012' > conftest.data if test "$cross_compiling" = yes; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #ifdef __GNU_LIBRARY__ #if (__GLIBC__ >= 2) && !defined __UCLIBC__ Lucky GNU user #endif #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "Lucky GNU user" >/dev/null 2>&1; then : gl_cv_func_working_getdelim="guessing yes" else case "$host_os" in *-musl*) gl_cv_func_working_getdelim="guessing yes" ;; *) gl_cv_func_working_getdelim="$gl_cross_guess_normal" ;; esac fi rm -f conftest* else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ # include # include # include int main () { FILE *in = fopen ("./conftest.data", "r"); if (!in) return 1; { /* Test result for a NULL buffer and a zero size. Based on a test program from Karl Heuer. */ char *line = NULL; size_t siz = 0; int len = getdelim (&line, &siz, '\n', in); if (!(len == 4 && line && strcmp (line, "foo\n") == 0)) { free (line); fclose (in); return 2; } free (line); } { /* Test result for a NULL buffer and a non-zero size. This crashes on FreeBSD 8.0. */ char *line = NULL; size_t siz = (size_t)(~0) / 4; if (getdelim (&line, &siz, '\n', in) == -1) { fclose (in); return 3; } free (line); } fclose (in); return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : gl_cv_func_working_getdelim=yes else gl_cv_func_working_getdelim=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_working_getdelim" >&5 $as_echo "$gl_cv_func_working_getdelim" >&6; } case "$gl_cv_func_working_getdelim" in *yes) ;; *) REPLACE_GETDELIM=1 ;; esac else HAVE_GETDELIM=0 fi if test $ac_cv_have_decl_getdelim = no; then HAVE_DECL_GETDELIM=0 fi if test $HAVE_GETDELIM = 0 || test $REPLACE_GETDELIM = 1; then gl_LIBOBJS="$gl_LIBOBJS getdelim.$ac_objext" for ac_func in flockfile funlockfile do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done ac_fn_c_check_decl "$LINENO" "getc_unlocked" "ac_cv_have_decl_getc_unlocked" "$ac_includes_default" if test "x$ac_cv_have_decl_getc_unlocked" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_GETC_UNLOCKED $ac_have_decl _ACEOF fi GNULIB_GETDELIM=1 $as_echo "#define GNULIB_TEST_GETDELIM 1" >>confdefs.h if test $ac_cv_func_getdtablesize = yes && test $ac_cv_have_decl_getdtablesize = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether getdtablesize works" >&5 $as_echo_n "checking whether getdtablesize works... " >&6; } if ${gl_cv_func_getdtablesize_works+:} false; then : $as_echo_n "(cached) " >&6 else case "$host_os" in vms*) gl_cv_func_getdtablesize_works="no (limitation)" ;; *) if test "$cross_compiling" = yes; then : case "$host_os" in cygwin*) # on cygwin 1.5.25, getdtablesize() automatically grows gl_cv_func_getdtablesize_works="guessing no" ;; *) gl_cv_func_getdtablesize_works="guessing yes" ;; esac else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { int size = getdtablesize(); if (dup2 (0, getdtablesize()) != -1) return 1; if (size != getdtablesize()) return 2; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : gl_cv_func_getdtablesize_works=yes else gl_cv_func_getdtablesize_works=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_getdtablesize_works" >&5 $as_echo "$gl_cv_func_getdtablesize_works" >&6; } case "$gl_cv_func_getdtablesize_works" in *yes | "no (limitation)") ;; *) REPLACE_GETDTABLESIZE=1 ;; esac else HAVE_GETDTABLESIZE=0 fi if test $HAVE_GETDTABLESIZE = 0 || test $REPLACE_GETDTABLESIZE = 1; then gl_LIBOBJS="$gl_LIBOBJS getdtablesize.$ac_objext" : fi GNULIB_GETDTABLESIZE=1 $as_echo "#define GNULIB_TEST_GETDTABLESIZE 1" >>confdefs.h gl_getline_needs_run_time_check=no ac_fn_c_check_func "$LINENO" "getline" "ac_cv_func_getline" if test "x$ac_cv_func_getline" = xyes; then : gl_getline_needs_run_time_check=yes else am_cv_func_working_getline=no fi if test $gl_getline_needs_run_time_check = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working getline function" >&5 $as_echo_n "checking for working getline function... " >&6; } if ${am_cv_func_working_getline+:} false; then : $as_echo_n "(cached) " >&6 else echo fooNbarN | tr -d '\012' | tr N '\012' > conftest.data if test "$cross_compiling" = yes; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #ifdef __GNU_LIBRARY__ #if (__GLIBC__ >= 2) && !defined __UCLIBC__ Lucky GNU user #endif #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "Lucky GNU user" >/dev/null 2>&1; then : am_cv_func_working_getline="guessing yes" else case "$host_os" in *-musl*) am_cv_func_working_getline="guessing yes" ;; *) am_cv_func_working_getline="$gl_cross_guess_normal" ;; esac fi rm -f conftest* else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ # include # include # include int main () { FILE *in = fopen ("./conftest.data", "r"); if (!in) return 1; { /* Test result for a NULL buffer and a zero size. Based on a test program from Karl Heuer. */ char *line = NULL; size_t siz = 0; int len = getline (&line, &siz, in); if (!(len == 4 && line && strcmp (line, "foo\n") == 0)) { free (line); fclose (in); return 2; } free (line); } { /* Test result for a NULL buffer and a non-zero size. This crashes on FreeBSD 8.0. */ char *line = NULL; size_t siz = (size_t)(~0) / 4; if (getline (&line, &siz, in) == -1) { fclose (in); return 3; } free (line); } fclose (in); return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : am_cv_func_working_getline=yes else am_cv_func_working_getline=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_func_working_getline" >&5 $as_echo "$am_cv_func_working_getline" >&6; } fi if test $ac_cv_have_decl_getline = no; then HAVE_DECL_GETLINE=0 fi case "$am_cv_func_working_getline" in *yes) ;; *) REPLACE_GETLINE=1 ;; esac if test $REPLACE_GETLINE = 1; then gl_LIBOBJS="$gl_LIBOBJS getline.$ac_objext" : fi GNULIB_GETLINE=1 $as_echo "#define GNULIB_TEST_GETLINE 1" >>confdefs.h REPLACE_GETOPT=0 if test -n "$gl_replace_getopt"; then REPLACE_GETOPT=1 fi if test $REPLACE_GETOPT = 1; then if test $ac_cv_header_sys_cdefs_h = yes; then HAVE_SYS_CDEFS_H=1 else HAVE_SYS_CDEFS_H=0 fi $as_echo "#define __GETOPT_PREFIX rpl_" >>confdefs.h GETOPT_H=getopt.h GETOPT_CDEFS_H=getopt-cdefs.h fi if test $REPLACE_GETOPT = 1; then gl_LIBOBJS="$gl_LIBOBJS getopt.$ac_objext" gl_LIBOBJS="$gl_LIBOBJS getopt1.$ac_objext" GNULIB_GL_UNISTD_H_GETOPT=1 fi GNULIB_GETOPT_POSIX=1 $as_echo "#define GNULIB_TEST_GETOPT_POSIX 1" >>confdefs.h if test $HAVE_GETPASS = 0 || test $REPLACE_GETPASS = 1; then gl_LIBOBJS="$gl_LIBOBJS getpass.$ac_objext" ac_fn_c_check_decl "$LINENO" "__fsetlocking" "ac_cv_have_decl___fsetlocking" "#include #if HAVE_STDIO_EXT_H #include #endif " if test "x$ac_cv_have_decl___fsetlocking" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL___FSETLOCKING $ac_have_decl _ACEOF { $as_echo "$as_me:${as_lineno-$LINENO}: checking for tcgetattr" >&5 $as_echo_n "checking for tcgetattr... " >&6; } if ${gl_cv_func_tcgetattr+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include struct termios x; int main () { return tcgetattr(0,&x); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : gl_cv_func_tcgetattr=yes else gl_cv_func_tcgetattr=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_tcgetattr" >&5 $as_echo "$gl_cv_func_tcgetattr" >&6; } if test $gl_cv_func_tcgetattr = yes; then HAVE_TCGETATTR=1 else HAVE_TCGETATTR=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_TCGETATTR $HAVE_TCGETATTR _ACEOF { $as_echo "$as_me:${as_lineno-$LINENO}: checking for tcsetattr" >&5 $as_echo_n "checking for tcsetattr... " >&6; } if ${gl_cv_func_tcsetattr+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include struct termios x; int main () { return tcsetattr(0,0,&x); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : gl_cv_func_tcsetattr=yes else gl_cv_func_tcsetattr=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_tcsetattr" >&5 $as_echo "$gl_cv_func_tcsetattr" >&6; } if test $gl_cv_func_tcsetattr = yes; then HAVE_TCSETATTR=1 else HAVE_TCSETATTR=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_TCSETATTR $HAVE_TCSETATTR _ACEOF fi GNULIB_GETPASS=1 $as_echo "#define GNULIB_TEST_GETPASS 1" >>confdefs.h ac_found=0 ac_fn_c_check_decl "$LINENO" "program_invocation_name" "ac_cv_have_decl_program_invocation_name" "#include " if test "x$ac_cv_have_decl_program_invocation_name" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_PROGRAM_INVOCATION_NAME $ac_have_decl _ACEOF if test $ac_have_decl = 1; then : ac_found=1 fi ac_fn_c_check_decl "$LINENO" "program_invocation_short_name" "ac_cv_have_decl_program_invocation_short_name" "#include " if test "x$ac_cv_have_decl_program_invocation_short_name" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_PROGRAM_INVOCATION_SHORT_NAME $ac_have_decl _ACEOF if test $ac_have_decl = 1; then : ac_found=1 fi ac_fn_c_check_decl "$LINENO" "__argv" "ac_cv_have_decl___argv" "#include " if test "x$ac_cv_have_decl___argv" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL___ARGV $ac_have_decl _ACEOF if test $ac_have_decl = 1; then : ac_found=1 fi # Incur the cost of this test only if none of the above worked. if test $ac_found = 0; then # On OpenBSD 5.1, using the global __progname variable appears to be # the only way to implement getprogname. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether __progname is defined in default libraries" >&5 $as_echo_n "checking whether __progname is defined in default libraries... " >&6; } if ${gl_cv_var___progname+:} false; then : $as_echo_n "(cached) " >&6 else gl_cv_var___progname= cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ extern char *__progname; int main () { return *__progname; ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : gl_cv_var___progname=yes fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_var___progname" >&5 $as_echo "$gl_cv_var___progname" >&6; } if test "$gl_cv_var___progname" = yes; then $as_echo "#define HAVE_VAR___PROGNAME 1" >>confdefs.h fi fi if test "$ac_cv_func_getrandom" != yes; then HAVE_GETRANDOM=0 else { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether getrandom is compatible with its GNU+BSD signature" >&5 $as_echo_n "checking whether getrandom is compatible with its GNU+BSD signature... " >&6; } if ${gl_cv_func_getrandom_ok+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Additional includes are needed before on Mac OS X. */ #include #include #include ssize_t getrandom (void *, size_t, unsigned int); int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : gl_cv_func_getrandom_ok=yes else gl_cv_func_getrandom_ok=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_getrandom_ok" >&5 $as_echo "$gl_cv_func_getrandom_ok" >&6; } if test $gl_cv_func_getrandom_ok = no; then REPLACE_GETRANDOM=1 fi fi case "$host_os" in mingw*) for ac_header in bcrypt.h do : ac_fn_c_check_header_compile "$LINENO" "bcrypt.h" "ac_cv_header_bcrypt_h" "#include " if test "x$ac_cv_header_bcrypt_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_BCRYPT_H 1 _ACEOF fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the bcrypt library is guaranteed to be present" >&5 $as_echo_n "checking whether the bcrypt library is guaranteed to be present... " >&6; } if ${gl_cv_lib_assume_bcrypt+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { #if !(_WIN32_WINNT >= _WIN32_WINNT_WIN7) cannot assume it #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : gl_cv_lib_assume_bcrypt=yes else gl_cv_lib_assume_bcrypt=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_lib_assume_bcrypt" >&5 $as_echo "$gl_cv_lib_assume_bcrypt" >&6; } if test $gl_cv_lib_assume_bcrypt = yes; then $as_echo "#define HAVE_LIB_BCRYPT 1" >>confdefs.h LIB_GETRANDOM='-lbcrypt' else LIB_GETRANDOM='-ladvapi32' fi ;; *) LIB_GETRANDOM= ;; esac if test $HAVE_GETRANDOM = 0 || test $REPLACE_GETRANDOM = 1; then gl_LIBOBJS="$gl_LIBOBJS getrandom.$ac_objext" fi GNULIB_GETRANDOM=1 $as_echo "#define GNULIB_TEST_GETRANDOM 1" >>confdefs.h gl_gettimeofday_timezone=void if test $ac_cv_func_gettimeofday != yes; then HAVE_GETTIMEOFDAY=0 else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gettimeofday with POSIX signature" >&5 $as_echo_n "checking for gettimeofday with POSIX signature... " >&6; } if ${gl_cv_func_gettimeofday_posix_signature+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include struct timeval c; int gettimeofday (struct timeval *restrict, void *restrict); int main () { /* glibc uses struct timezone * rather than the POSIX void * if _GNU_SOURCE is defined. However, since the only portable use of gettimeofday uses NULL as the second parameter, and since the glibc definition is actually more typesafe, it is not worth wrapping this to get a compliant signature. */ int (*f) (struct timeval *restrict, void *restrict) = gettimeofday; int x = f (&c, 0); return !(x | c.tv_sec | c.tv_usec); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : gl_cv_func_gettimeofday_posix_signature=yes else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int gettimeofday (struct timeval *restrict, struct timezone *restrict); int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : gl_cv_func_gettimeofday_posix_signature=almost else gl_cv_func_gettimeofday_posix_signature=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_gettimeofday_posix_signature" >&5 $as_echo "$gl_cv_func_gettimeofday_posix_signature" >&6; } if test $gl_cv_func_gettimeofday_posix_signature = almost; then gl_gettimeofday_timezone='struct timezone' elif test $gl_cv_func_gettimeofday_posix_signature != yes; then REPLACE_GETTIMEOFDAY=1 fi if test $REPLACE_STRUCT_TIMEVAL = 1; then REPLACE_GETTIMEOFDAY=1 fi case "$host_os" in mingw*) REPLACE_GETTIMEOFDAY=1 ;; esac fi cat >>confdefs.h <<_ACEOF #define GETTIMEOFDAY_TIMEZONE $gl_gettimeofday_timezone _ACEOF if test $HAVE_GETTIMEOFDAY = 0 || test $REPLACE_GETTIMEOFDAY = 1; then gl_LIBOBJS="$gl_LIBOBJS gettimeofday.$ac_objext" : fi GNULIB_GETTIMEOFDAY=1 $as_echo "#define GNULIB_TEST_GETTIMEOFDAY 1" >>confdefs.h LIB_HARD_LOCALE="$LIB_SETLOCALE_NULL" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the compiler generally respects inline" >&5 $as_echo_n "checking whether the compiler generally respects inline... " >&6; } if ${gl_cv_c_inline_effective+:} false; then : $as_echo_n "(cached) " >&6 else if test $ac_cv_c_inline = no; then gl_cv_c_inline_effective=no else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifdef __NO_INLINE__ #error "inline is not effective" #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : gl_cv_c_inline_effective=yes else gl_cv_c_inline_effective=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_c_inline_effective" >&5 $as_echo "$gl_cv_c_inline_effective" >&6; } if test $gl_cv_c_inline_effective = yes; then $as_echo "#define HAVE_INLINE 1" >>confdefs.h fi : : : : : ac_fn_c_check_decl "$LINENO" "isfinite" "ac_cv_have_decl_isfinite" "#include " if test "x$ac_cv_have_decl_isfinite" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_ISFINITE $ac_have_decl _ACEOF if test "$ac_cv_have_decl_isfinite" = yes; then save_LIBS=$LIBS ISFINITE_LIBM=missing for libm in "" "-lm"; do LIBS="$save_LIBS $libm" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifndef __NO_MATH_INLINES # define __NO_MATH_INLINES 1 /* for glibc */ #endif #include double x; int main () { x = isfinite (x) + isfinite ((float) x); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ISFINITE_LIBM=$libm break fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext done LIBS=$save_LIBS if test "$ISFINITE_LIBM" != missing; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether isfinite(long double) works" >&5 $as_echo_n "checking whether isfinite(long double) works... " >&6; } if ${gl_cv_func_isfinitel_works+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : case "$host_os" in # Guess no on native Windows. mingw*) gl_cv_func_isfinitel_works="guessing no" ;; *) gl_cv_func_isfinitel_works="guessing yes" ;; esac else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #define NWORDS \ ((sizeof (long double) + sizeof (unsigned int) - 1) / sizeof (unsigned int)) typedef union { unsigned int word[NWORDS]; long double value; } memory_long_double; /* On Irix 6.5, gcc 3.4.3 can't compute compile-time NaN, and needs the runtime type conversion. */ #ifdef __sgi static long double NaNl () { double zero = 0.0; return zero / zero; } #else # define NaNl() (0.0L / 0.0L) #endif int main () { int result = 0; { memory_long_double m; unsigned int i; /* The isfinite macro should be immune against changes in the sign bit and in the mantissa bits. The xor operation twiddles a bit that can only be a sign bit or a mantissa bit (since the exponent never extends to bit 31). */ m.value = NaNl (); m.word[NWORDS / 2] ^= (unsigned int) 1 << (sizeof (unsigned int) * CHAR_BIT - 1); for (i = 0; i < NWORDS; i++) m.word[i] |= 1; if (isfinite (m.value)) result |= 1; } #if ((defined __ia64 && LDBL_MANT_DIG == 64) || (defined __x86_64__ || defined __amd64__) || (defined __i386 || defined __i386__ || defined _I386 || defined _M_IX86 || defined _X86_)) && !HAVE_SAME_LONG_DOUBLE_AS_DOUBLE /* Representation of an 80-bit 'long double' as an initializer for a sequence of 'unsigned int' words. */ # ifdef WORDS_BIGENDIAN # define LDBL80_WORDS(exponent,manthi,mantlo) \ { ((unsigned int) (exponent) << 16) | ((unsigned int) (manthi) >> 16), \ ((unsigned int) (manthi) << 16) | ((unsigned int) (mantlo) >> 16), \ (unsigned int) (mantlo) << 16 \ } # else # define LDBL80_WORDS(exponent,manthi,mantlo) \ { mantlo, manthi, exponent } # endif { /* Quiet NaN. */ static memory_long_double x = { LDBL80_WORDS (0xFFFF, 0xC3333333, 0x00000000) }; if (isfinite (x.value)) result |= 2; } { /* Signalling NaN. */ static memory_long_double x = { LDBL80_WORDS (0xFFFF, 0x83333333, 0x00000000) }; if (isfinite (x.value)) result |= 2; } /* isfinite should return something even for noncanonical values. */ { /* Pseudo-NaN. */ static memory_long_double x = { LDBL80_WORDS (0xFFFF, 0x40000001, 0x00000000) }; if (isfinite (x.value) && !isfinite (x.value)) result |= 4; } { /* Pseudo-Infinity. */ static memory_long_double x = { LDBL80_WORDS (0xFFFF, 0x00000000, 0x00000000) }; if (isfinite (x.value) && !isfinite (x.value)) result |= 8; } { /* Pseudo-Zero. */ static memory_long_double x = { LDBL80_WORDS (0x4004, 0x00000000, 0x00000000) }; if (isfinite (x.value) && !isfinite (x.value)) result |= 16; } { /* Unnormalized number. */ static memory_long_double x = { LDBL80_WORDS (0x4000, 0x63333333, 0x00000000) }; if (isfinite (x.value) && !isfinite (x.value)) result |= 32; } { /* Pseudo-Denormal. */ static memory_long_double x = { LDBL80_WORDS (0x0000, 0x83333333, 0x00000000) }; if (isfinite (x.value) && !isfinite (x.value)) result |= 64; } #endif return result; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : gl_cv_func_isfinitel_works=yes else gl_cv_func_isfinitel_works=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_isfinitel_works" >&5 $as_echo "$gl_cv_func_isfinitel_works" >&6; } case "$gl_cv_func_isfinitel_works" in *yes) ;; *) ISFINITE_LIBM=missing;; esac fi fi if test "$ac_cv_have_decl_isfinite" != yes \ || test "$ISFINITE_LIBM" = missing \ || { case "$host_os" in solaris*) true;; *) false;; esac; }; then REPLACE_ISFINITE=1 ISFINITE_LIBM= fi if test $REPLACE_ISFINITE = 1; then gl_LIBOBJS="$gl_LIBOBJS isfinite.$ac_objext" fi GNULIB_ISFINITE=1 $as_echo "#define GNULIB_TEST_ISFINITE 1" >>confdefs.h ac_fn_c_check_decl "$LINENO" "isinf" "ac_cv_have_decl_isinf" "#include #ifndef isinf #error \"isinf must be a macro, not a function\" #endif " if test "x$ac_cv_have_decl_isinf" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_ISINF $ac_have_decl _ACEOF if test "$ac_cv_have_decl_isinf" = yes; then save_LIBS=$LIBS ISINF_LIBM=missing for libm in "" "-lm"; do LIBS="$save_LIBS $libm" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifndef __NO_MATH_INLINES # define __NO_MATH_INLINES 1 /* for glibc */ #endif #include double x; int main () { x = isinf (x) + isinf ((float) x); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ISINF_LIBM=$libm break fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext done LIBS=$save_LIBS if test "$ISINF_LIBM" != missing; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether isinf(long double) works" >&5 $as_echo_n "checking whether isinf(long double) works... " >&6; } if ${gl_cv_func_isinfl_works+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : case "$host_os" in mingw*) # Guess yes on mingw, no on MSVC. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __MINGW32__ Known #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "Known" >/dev/null 2>&1; then : gl_cv_func_isinfl_works="guessing yes" else gl_cv_func_isinfl_works="guessing no" fi rm -f conftest* ;; *) gl_cv_func_isinfl_works="guessing yes" ;; esac else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #define NWORDS \ ((sizeof (long double) + sizeof (unsigned int) - 1) / sizeof (unsigned int)) typedef union { unsigned int word[NWORDS]; long double value; } memory_long_double; /* On Irix 6.5, gcc 3.4.3 can't compute compile-time NaN, and needs the runtime type conversion. */ #ifdef __sgi static long double NaNl () { double zero = 0.0; return zero / zero; } #else # define NaNl() (0.0L / 0.0L) #endif int main () { int result = 0; if (isinf (LDBL_MAX)) result |= 1; { memory_long_double m; unsigned int i; /* The isinf macro should be immune against changes in the sign bit and in the mantissa bits. The xor operation twiddles a bit that can only be a sign bit or a mantissa bit (since the exponent never extends to bit 31). */ m.value = NaNl (); m.word[NWORDS / 2] ^= (unsigned int) 1 << (sizeof (unsigned int) * CHAR_BIT - 1); for (i = 0; i < NWORDS; i++) m.word[i] |= 1; if (isinf (m.value)) result |= 2; } #if ((defined __ia64 && LDBL_MANT_DIG == 64) || (defined __x86_64__ || defined __amd64__) || (defined __i386 || defined __i386__ || defined _I386 || defined _M_IX86 || defined _X86_)) && !HAVE_SAME_LONG_DOUBLE_AS_DOUBLE /* Representation of an 80-bit 'long double' as an initializer for a sequence of 'unsigned int' words. */ # ifdef WORDS_BIGENDIAN # define LDBL80_WORDS(exponent,manthi,mantlo) \ { ((unsigned int) (exponent) << 16) | ((unsigned int) (manthi) >> 16), \ ((unsigned int) (manthi) << 16) | ((unsigned int) (mantlo) >> 16), \ (unsigned int) (mantlo) << 16 \ } # else # define LDBL80_WORDS(exponent,manthi,mantlo) \ { mantlo, manthi, exponent } # endif { /* Quiet NaN. */ static memory_long_double x = { LDBL80_WORDS (0xFFFF, 0xC3333333, 0x00000000) }; if (isinf (x.value)) result |= 2; } { /* Signalling NaN. */ static memory_long_double x = { LDBL80_WORDS (0xFFFF, 0x83333333, 0x00000000) }; if (isinf (x.value)) result |= 2; } /* isinf should return something even for noncanonical values. */ { /* Pseudo-NaN. */ static memory_long_double x = { LDBL80_WORDS (0xFFFF, 0x40000001, 0x00000000) }; if (isinf (x.value) && !isinf (x.value)) result |= 4; } { /* Pseudo-Infinity. */ static memory_long_double x = { LDBL80_WORDS (0xFFFF, 0x00000000, 0x00000000) }; if (isinf (x.value) && !isinf (x.value)) result |= 8; } { /* Pseudo-Zero. */ static memory_long_double x = { LDBL80_WORDS (0x4004, 0x00000000, 0x00000000) }; if (isinf (x.value) && !isinf (x.value)) result |= 16; } { /* Unnormalized number. */ static memory_long_double x = { LDBL80_WORDS (0x4000, 0x63333333, 0x00000000) }; if (isinf (x.value) && !isinf (x.value)) result |= 32; } { /* Pseudo-Denormal. */ static memory_long_double x = { LDBL80_WORDS (0x0000, 0x83333333, 0x00000000) }; if (isinf (x.value) && !isinf (x.value)) result |= 64; } #endif return result; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : gl_cv_func_isinfl_works=yes else gl_cv_func_isinfl_works=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_isinfl_works" >&5 $as_echo "$gl_cv_func_isinfl_works" >&6; } case "$gl_cv_func_isinfl_works" in *yes) ;; *) ISINF_LIBM=missing;; esac fi fi if test "$ac_cv_have_decl_isinf" != yes \ || test "$ISINF_LIBM" = missing \ || { case "$host_os" in solaris*) true;; *) false;; esac; }; then REPLACE_ISINF=1 ISINF_LIBM= fi if test $REPLACE_ISINF = 1; then gl_LIBOBJS="$gl_LIBOBJS isinf.$ac_objext" fi GNULIB_ISINF=1 $as_echo "#define GNULIB_TEST_ISINF 1" >>confdefs.h # If we replaced any of the underlying isnan* functions, replace # the isnan macro; it undoubtedly suffers from the same flaws. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether isnan macro works" >&5 $as_echo_n "checking whether isnan macro works... " >&6; } if test $gl_func_isnanf = yes \ && test $gl_func_isnand = yes \ && test $gl_func_isnanl = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } ISNAN_LIBM= case " $ISNAN_LIBM " in *" $ISNANF_LIBM "*) ;; *) ISNAN_LIBM="$ISNAN_LIBM $ISNANF_LIBM" ;; esac case " $ISNAN_LIBM " in *" $ISNAND_LIBM "*) ;; *) ISNAN_LIBM="$ISNAN_LIBM $ISNAND_LIBM" ;; esac case " $ISNAN_LIBM " in *" $ISNANL_LIBM "*) ;; *) ISNAN_LIBM="$ISNAN_LIBM $ISNANL_LIBM" ;; esac else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } REPLACE_ISNAN=1 ISNAN_LIBM= fi GNULIB_ISNAN=1 $as_echo "#define GNULIB_TEST_ISNAN 1" >>confdefs.h ISNAND_LIBM= { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether isnan(double) can be used without linking with libm" >&5 $as_echo_n "checking whether isnan(double) can be used without linking with libm... " >&6; } if ${gl_cv_func_isnand_no_libm+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #if (__GNUC__ >= 4) || (__clang_major__ >= 4) # undef isnand # define isnand(x) __builtin_isnan ((double)(x)) #else # undef isnand # define isnand(x) isnan ((double)(x)) #endif double x; int main () { return isnand (x); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : gl_cv_func_isnand_no_libm=yes else gl_cv_func_isnand_no_libm=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_isnand_no_libm" >&5 $as_echo "$gl_cv_func_isnand_no_libm" >&6; } if test $gl_cv_func_isnand_no_libm = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether isnan(double) can be used with libm" >&5 $as_echo_n "checking whether isnan(double) can be used with libm... " >&6; } if ${gl_cv_func_isnand_in_libm+:} false; then : $as_echo_n "(cached) " >&6 else save_LIBS="$LIBS" LIBS="$LIBS -lm" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #if (__GNUC__ >= 4) || (__clang_major__ >= 4) # undef isnand # define isnand(x) __builtin_isnan ((double)(x)) #elif defined isnan # undef isnand # define isnand(x) isnan ((double)(x)) #endif double x; int main () { return isnand (x); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : gl_cv_func_isnand_in_libm=yes else gl_cv_func_isnand_in_libm=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS="$save_LIBS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_isnand_in_libm" >&5 $as_echo "$gl_cv_func_isnand_in_libm" >&6; } if test $gl_cv_func_isnand_in_libm = yes; then ISNAND_LIBM=-lm fi fi if test $gl_cv_func_isnand_no_libm = yes \ || test $gl_cv_func_isnand_in_libm = yes; then gl_func_isnand=yes else gl_func_isnand=no HAVE_ISNAND=0 fi if test $HAVE_ISNAND = 0 || test $REPLACE_ISNAN = 1; then gl_LIBOBJS="$gl_LIBOBJS isnand.$ac_objext" fi GNULIB_ISNAND=1 $as_echo "#define GNULIB_TEST_ISNAND 1" >>confdefs.h { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether isnan(double) can be used without linking with libm" >&5 $as_echo_n "checking whether isnan(double) can be used without linking with libm... " >&6; } if ${gl_cv_func_isnand_no_libm+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #if (__GNUC__ >= 4) || (__clang_major__ >= 4) # undef isnand # define isnand(x) __builtin_isnan ((double)(x)) #else # undef isnand # define isnand(x) isnan ((double)(x)) #endif double x; int main () { return isnand (x); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : gl_cv_func_isnand_no_libm=yes else gl_cv_func_isnand_no_libm=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_isnand_no_libm" >&5 $as_echo "$gl_cv_func_isnand_no_libm" >&6; } gl_func_isnand_no_libm=$gl_cv_func_isnand_no_libm if test $gl_cv_func_isnand_no_libm = yes; then $as_echo "#define HAVE_ISNAND_IN_LIBC 1" >>confdefs.h fi if test $gl_func_isnand_no_libm != yes; then gl_LIBOBJS="$gl_LIBOBJS isnand.$ac_objext" fi ISNANF_LIBM= { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether isnan(float) can be used without linking with libm" >&5 $as_echo_n "checking whether isnan(float) can be used without linking with libm... " >&6; } if ${gl_cv_func_isnanf_no_libm+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #if (__GNUC__ >= 4) || (__clang_major__ >= 4) # undef isnanf # define isnanf(x) __builtin_isnan ((float)(x)) #elif defined isnan # undef isnanf # define isnanf(x) isnan ((float)(x)) #endif float x; int main () { return isnanf (x); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : gl_cv_func_isnanf_no_libm=yes else gl_cv_func_isnanf_no_libm=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_isnanf_no_libm" >&5 $as_echo "$gl_cv_func_isnanf_no_libm" >&6; } if test $gl_cv_func_isnanf_no_libm = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether isnan(float) can be used with libm" >&5 $as_echo_n "checking whether isnan(float) can be used with libm... " >&6; } if ${gl_cv_func_isnanf_in_libm+:} false; then : $as_echo_n "(cached) " >&6 else save_LIBS="$LIBS" LIBS="$LIBS -lm" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #if (__GNUC__ >= 4) || (__clang_major__ >= 4) # undef isnanf # define isnanf(x) __builtin_isnan ((float)(x)) #elif defined isnan # undef isnanf # define isnanf(x) isnan ((float)(x)) #endif float x; int main () { return isnanf (x); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : gl_cv_func_isnanf_in_libm=yes else gl_cv_func_isnanf_in_libm=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS="$save_LIBS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_isnanf_in_libm" >&5 $as_echo "$gl_cv_func_isnanf_in_libm" >&6; } if test $gl_cv_func_isnanf_in_libm = yes; then ISNANF_LIBM=-lm fi fi if test $gl_cv_func_isnanf_no_libm = yes \ || test $gl_cv_func_isnanf_in_libm = yes; then save_LIBS="$LIBS" LIBS="$LIBS $ISNANF_LIBM" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether isnan(float) works" >&5 $as_echo_n "checking whether isnan(float) works... " >&6; } if ${gl_cv_func_isnanf_works+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : case "$host_os" in irix* | solaris*) gl_cv_func_isnanf_works="guessing no" ;; mingw*) # Guess yes on mingw, no on MSVC. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __MINGW32__ Known #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "Known" >/dev/null 2>&1; then : gl_cv_func_isnanf_works="guessing yes" else gl_cv_func_isnanf_works="guessing no" fi rm -f conftest* ;; *) gl_cv_func_isnanf_works="guessing yes" ;; esac else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #if (__GNUC__ >= 4) || (__clang_major__ >= 4) # undef isnanf # define isnanf(x) __builtin_isnan ((float)(x)) #elif defined isnan # undef isnanf # define isnanf(x) isnan ((float)(x)) #endif /* The Compaq (ex-DEC) C 6.4 compiler chokes on the expression 0.0 / 0.0. */ #ifdef __DECC static float NaN () { static float zero = 0.0f; return zero / zero; } #else # define NaN() (0.0f / 0.0f) #endif #define NWORDS \ ((sizeof (float) + sizeof (unsigned int) - 1) / sizeof (unsigned int)) typedef union { unsigned int word[NWORDS]; float value; } memory_float; int main() { int result = 0; if (isnanf (1.0f / 0.0f)) result |= 1; if (!isnanf (NaN ())) result |= 2; #if defined FLT_EXPBIT0_WORD && defined FLT_EXPBIT0_BIT /* The isnanf function should be immune against changes in the sign bit and in the mantissa bits. The xor operation twiddles a bit that can only be a sign bit or a mantissa bit. */ if (FLT_EXPBIT0_WORD == 0 && FLT_EXPBIT0_BIT > 0) { memory_float m; m.value = NaN (); /* Set the bits below the exponent to 01111...111. */ m.word[0] &= -1U << FLT_EXPBIT0_BIT; m.word[0] |= 1U << (FLT_EXPBIT0_BIT - 1) - 1; if (!isnanf (m.value)) result |= 4; } #endif return result; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : gl_cv_func_isnanf_works=yes else gl_cv_func_isnanf_works=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_isnanf_works" >&5 $as_echo "$gl_cv_func_isnanf_works" >&6; } LIBS="$save_LIBS" case "$gl_cv_func_isnanf_works" in *yes) gl_func_isnanf=yes ;; *) gl_func_isnanf=no; ISNANF_LIBM= ;; esac else gl_func_isnanf=no fi if test $gl_func_isnanf != yes; then HAVE_ISNANF=0 fi if test $HAVE_ISNANF = 0 || test $REPLACE_ISNAN = 1; then gl_LIBOBJS="$gl_LIBOBJS isnanf.$ac_objext" { $as_echo "$as_me:${as_lineno-$LINENO}: checking where to find the exponent in a 'float'" >&5 $as_echo_n "checking where to find the exponent in a 'float'... " >&6; } if ${gl_cv_cc_float_expbit0+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : gl_cv_cc_float_expbit0="word 0 bit 23" else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include #define NWORDS \ ((sizeof (float) + sizeof (unsigned int) - 1) / sizeof (unsigned int)) typedef union { float value; unsigned int word[NWORDS]; } memory_float; static unsigned int ored_words[NWORDS]; static unsigned int anded_words[NWORDS]; static void add_to_ored_words (float x) { memory_float m; size_t i; /* Clear it first, in case sizeof (float) < sizeof (memory_float). */ memset (&m, 0, sizeof (memory_float)); m.value = x; for (i = 0; i < NWORDS; i++) { ored_words[i] |= m.word[i]; anded_words[i] &= m.word[i]; } } int main () { size_t j; FILE *fp = fopen ("conftest.out", "w"); if (fp == NULL) return 1; for (j = 0; j < NWORDS; j++) anded_words[j] = ~ (unsigned int) 0; add_to_ored_words (0.25f); add_to_ored_words (0.5f); add_to_ored_words (1.0f); add_to_ored_words (2.0f); add_to_ored_words (4.0f); /* Remove bits that are common (e.g. if representation of the first mantissa bit is explicit). */ for (j = 0; j < NWORDS; j++) ored_words[j] &= ~anded_words[j]; /* Now find the nonzero word. */ for (j = 0; j < NWORDS; j++) if (ored_words[j] != 0) break; if (j < NWORDS) { size_t i; for (i = j + 1; i < NWORDS; i++) if (ored_words[i] != 0) { fprintf (fp, "unknown"); return (fclose (fp) != 0); } for (i = 0; ; i++) if ((ored_words[j] >> i) & 1) { fprintf (fp, "word %d bit %d", (int) j, (int) i); return (fclose (fp) != 0); } } fprintf (fp, "unknown"); return (fclose (fp) != 0); } _ACEOF if ac_fn_c_try_run "$LINENO"; then : gl_cv_cc_float_expbit0=`cat conftest.out` else gl_cv_cc_float_expbit0="unknown" fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi rm -f conftest.out fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_cc_float_expbit0" >&5 $as_echo "$gl_cv_cc_float_expbit0" >&6; } case "$gl_cv_cc_float_expbit0" in word*bit*) word=`echo "$gl_cv_cc_float_expbit0" | sed -e 's/word //' -e 's/ bit.*//'` bit=`echo "$gl_cv_cc_float_expbit0" | sed -e 's/word.*bit //'` cat >>confdefs.h <<_ACEOF #define FLT_EXPBIT0_WORD $word _ACEOF cat >>confdefs.h <<_ACEOF #define FLT_EXPBIT0_BIT $bit _ACEOF ;; esac fi GNULIB_ISNANF=1 $as_echo "#define GNULIB_TEST_ISNANF 1" >>confdefs.h { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether isnan(float) can be used without linking with libm" >&5 $as_echo_n "checking whether isnan(float) can be used without linking with libm... " >&6; } if ${gl_cv_func_isnanf_no_libm+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #if (__GNUC__ >= 4) || (__clang_major__ >= 4) # undef isnanf # define isnanf(x) __builtin_isnan ((float)(x)) #elif defined isnan # undef isnanf # define isnanf(x) isnan ((float)(x)) #endif float x; int main () { return isnanf (x); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : gl_cv_func_isnanf_no_libm=yes else gl_cv_func_isnanf_no_libm=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_isnanf_no_libm" >&5 $as_echo "$gl_cv_func_isnanf_no_libm" >&6; } if test $gl_cv_func_isnanf_no_libm = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether isnan(float) works" >&5 $as_echo_n "checking whether isnan(float) works... " >&6; } if ${gl_cv_func_isnanf_works+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : case "$host_os" in irix* | solaris*) gl_cv_func_isnanf_works="guessing no" ;; mingw*) # Guess yes on mingw, no on MSVC. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __MINGW32__ Known #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "Known" >/dev/null 2>&1; then : gl_cv_func_isnanf_works="guessing yes" else gl_cv_func_isnanf_works="guessing no" fi rm -f conftest* ;; *) gl_cv_func_isnanf_works="guessing yes" ;; esac else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #if (__GNUC__ >= 4) || (__clang_major__ >= 4) # undef isnanf # define isnanf(x) __builtin_isnan ((float)(x)) #elif defined isnan # undef isnanf # define isnanf(x) isnan ((float)(x)) #endif /* The Compaq (ex-DEC) C 6.4 compiler chokes on the expression 0.0 / 0.0. */ #ifdef __DECC static float NaN () { static float zero = 0.0f; return zero / zero; } #else # define NaN() (0.0f / 0.0f) #endif #define NWORDS \ ((sizeof (float) + sizeof (unsigned int) - 1) / sizeof (unsigned int)) typedef union { unsigned int word[NWORDS]; float value; } memory_float; int main() { int result = 0; if (isnanf (1.0f / 0.0f)) result |= 1; if (!isnanf (NaN ())) result |= 2; #if defined FLT_EXPBIT0_WORD && defined FLT_EXPBIT0_BIT /* The isnanf function should be immune against changes in the sign bit and in the mantissa bits. The xor operation twiddles a bit that can only be a sign bit or a mantissa bit. */ if (FLT_EXPBIT0_WORD == 0 && FLT_EXPBIT0_BIT > 0) { memory_float m; m.value = NaN (); /* Set the bits below the exponent to 01111...111. */ m.word[0] &= -1U << FLT_EXPBIT0_BIT; m.word[0] |= 1U << (FLT_EXPBIT0_BIT - 1) - 1; if (!isnanf (m.value)) result |= 4; } #endif return result; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : gl_cv_func_isnanf_works=yes else gl_cv_func_isnanf_works=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_isnanf_works" >&5 $as_echo "$gl_cv_func_isnanf_works" >&6; } fi if test $gl_cv_func_isnanf_no_libm = yes \ && { case "$gl_cv_func_isnanf_works" in *yes) true;; *) false;; esac }; then gl_func_isnanf_no_libm=yes $as_echo "#define HAVE_ISNANF_IN_LIBC 1" >>confdefs.h else gl_func_isnanf_no_libm=no fi if test $gl_func_isnanf_no_libm != yes; then gl_LIBOBJS="$gl_LIBOBJS isnanf.$ac_objext" { $as_echo "$as_me:${as_lineno-$LINENO}: checking where to find the exponent in a 'float'" >&5 $as_echo_n "checking where to find the exponent in a 'float'... " >&6; } if ${gl_cv_cc_float_expbit0+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : gl_cv_cc_float_expbit0="word 0 bit 23" else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include #define NWORDS \ ((sizeof (float) + sizeof (unsigned int) - 1) / sizeof (unsigned int)) typedef union { float value; unsigned int word[NWORDS]; } memory_float; static unsigned int ored_words[NWORDS]; static unsigned int anded_words[NWORDS]; static void add_to_ored_words (float x) { memory_float m; size_t i; /* Clear it first, in case sizeof (float) < sizeof (memory_float). */ memset (&m, 0, sizeof (memory_float)); m.value = x; for (i = 0; i < NWORDS; i++) { ored_words[i] |= m.word[i]; anded_words[i] &= m.word[i]; } } int main () { size_t j; FILE *fp = fopen ("conftest.out", "w"); if (fp == NULL) return 1; for (j = 0; j < NWORDS; j++) anded_words[j] = ~ (unsigned int) 0; add_to_ored_words (0.25f); add_to_ored_words (0.5f); add_to_ored_words (1.0f); add_to_ored_words (2.0f); add_to_ored_words (4.0f); /* Remove bits that are common (e.g. if representation of the first mantissa bit is explicit). */ for (j = 0; j < NWORDS; j++) ored_words[j] &= ~anded_words[j]; /* Now find the nonzero word. */ for (j = 0; j < NWORDS; j++) if (ored_words[j] != 0) break; if (j < NWORDS) { size_t i; for (i = j + 1; i < NWORDS; i++) if (ored_words[i] != 0) { fprintf (fp, "unknown"); return (fclose (fp) != 0); } for (i = 0; ; i++) if ((ored_words[j] >> i) & 1) { fprintf (fp, "word %d bit %d", (int) j, (int) i); return (fclose (fp) != 0); } } fprintf (fp, "unknown"); return (fclose (fp) != 0); } _ACEOF if ac_fn_c_try_run "$LINENO"; then : gl_cv_cc_float_expbit0=`cat conftest.out` else gl_cv_cc_float_expbit0="unknown" fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi rm -f conftest.out fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_cc_float_expbit0" >&5 $as_echo "$gl_cv_cc_float_expbit0" >&6; } case "$gl_cv_cc_float_expbit0" in word*bit*) word=`echo "$gl_cv_cc_float_expbit0" | sed -e 's/word //' -e 's/ bit.*//'` bit=`echo "$gl_cv_cc_float_expbit0" | sed -e 's/word.*bit //'` cat >>confdefs.h <<_ACEOF #define FLT_EXPBIT0_WORD $word _ACEOF cat >>confdefs.h <<_ACEOF #define FLT_EXPBIT0_BIT $bit _ACEOF ;; esac fi ISNANL_LIBM= { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether isnan(long double) can be used without linking with libm" >&5 $as_echo_n "checking whether isnan(long double) can be used without linking with libm... " >&6; } if ${gl_cv_func_isnanl_no_libm+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #if (__GNUC__ >= 4) || (__clang_major__ >= 4) # undef isnanl # define isnanl(x) __builtin_isnan ((long double)(x)) #elif defined isnan # undef isnanl # define isnanl(x) isnan ((long double)(x)) #endif long double x; int main () { return isnanl (x); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : gl_cv_func_isnanl_no_libm=yes else gl_cv_func_isnanl_no_libm=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_isnanl_no_libm" >&5 $as_echo "$gl_cv_func_isnanl_no_libm" >&6; } if test $gl_cv_func_isnanl_no_libm = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether isnan(long double) can be used with libm" >&5 $as_echo_n "checking whether isnan(long double) can be used with libm... " >&6; } if ${gl_cv_func_isnanl_in_libm+:} false; then : $as_echo_n "(cached) " >&6 else save_LIBS="$LIBS" LIBS="$LIBS -lm" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #if (__GNUC__ >= 4) || (__clang_major__ >= 4) # undef isnanl # define isnanl(x) __builtin_isnan ((long double)(x)) #elif defined isnan # undef isnanl # define isnanl(x) isnan ((long double)(x)) #endif long double x; int main () { return isnanl (x); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : gl_cv_func_isnanl_in_libm=yes else gl_cv_func_isnanl_in_libm=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS="$save_LIBS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_isnanl_in_libm" >&5 $as_echo "$gl_cv_func_isnanl_in_libm" >&6; } if test $gl_cv_func_isnanl_in_libm = yes; then ISNANL_LIBM=-lm fi fi if test $gl_cv_func_isnanl_no_libm = yes \ || test $gl_cv_func_isnanl_in_libm = yes; then save_LIBS="$LIBS" LIBS="$LIBS $ISNANL_LIBM" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether isnanl works" >&5 $as_echo_n "checking whether isnanl works... " >&6; } if ${gl_cv_func_isnanl_works+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : case "$host_os" in mingw*) # Guess yes on mingw, no on MSVC. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __MINGW32__ Known #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "Known" >/dev/null 2>&1; then : gl_cv_func_isnanl_works="guessing yes" else gl_cv_func_isnanl_works="guessing no" fi rm -f conftest* ;; *) gl_cv_func_isnanl_works="guessing yes" ;; esac else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #if (__GNUC__ >= 4) || (__clang_major__ >= 4) # undef isnanl # define isnanl(x) __builtin_isnan ((long double)(x)) #elif defined isnan # undef isnanl # define isnanl(x) isnan ((long double)(x)) #endif #define NWORDS \ ((sizeof (long double) + sizeof (unsigned int) - 1) / sizeof (unsigned int)) typedef union { unsigned int word[NWORDS]; long double value; } memory_long_double; /* On Irix 6.5, gcc 3.4.3 can't compute compile-time NaN, and needs the runtime type conversion. */ #ifdef __sgi static long double NaNl () { double zero = 0.0; return zero / zero; } #else # define NaNl() (0.0L / 0.0L) #endif int main () { int result = 0; if (!isnanl (NaNl ())) result |= 1; { memory_long_double m; unsigned int i; /* The isnanl function should be immune against changes in the sign bit and in the mantissa bits. The xor operation twiddles a bit that can only be a sign bit or a mantissa bit (since the exponent never extends to bit 31). */ m.value = NaNl (); m.word[NWORDS / 2] ^= (unsigned int) 1 << (sizeof (unsigned int) * CHAR_BIT - 1); for (i = 0; i < NWORDS; i++) m.word[i] |= 1; if (!isnanl (m.value)) result |= 1; } #if ((defined __ia64 && LDBL_MANT_DIG == 64) || (defined __x86_64__ || defined __amd64__) || (defined __i386 || defined __i386__ || defined _I386 || defined _M_IX86 || defined _X86_)) && !HAVE_SAME_LONG_DOUBLE_AS_DOUBLE /* Representation of an 80-bit 'long double' as an initializer for a sequence of 'unsigned int' words. */ # ifdef WORDS_BIGENDIAN # define LDBL80_WORDS(exponent,manthi,mantlo) \ { ((unsigned int) (exponent) << 16) | ((unsigned int) (manthi) >> 16), \ ((unsigned int) (manthi) << 16) | ((unsigned int) (mantlo) >> 16), \ (unsigned int) (mantlo) << 16 \ } # else # define LDBL80_WORDS(exponent,manthi,mantlo) \ { mantlo, manthi, exponent } # endif { /* Quiet NaN. */ static memory_long_double x = { LDBL80_WORDS (0xFFFF, 0xC3333333, 0x00000000) }; if (!isnanl (x.value)) result |= 2; } { /* Signalling NaN. */ static memory_long_double x = { LDBL80_WORDS (0xFFFF, 0x83333333, 0x00000000) }; if (!isnanl (x.value)) result |= 2; } /* isnanl should return something even for noncanonical values. */ { /* Pseudo-NaN. */ static memory_long_double x = { LDBL80_WORDS (0xFFFF, 0x40000001, 0x00000000) }; if (isnanl (x.value) && !isnanl (x.value)) result |= 4; } { /* Pseudo-Infinity. */ static memory_long_double x = { LDBL80_WORDS (0xFFFF, 0x00000000, 0x00000000) }; if (isnanl (x.value) && !isnanl (x.value)) result |= 8; } { /* Pseudo-Zero. */ static memory_long_double x = { LDBL80_WORDS (0x4004, 0x00000000, 0x00000000) }; if (isnanl (x.value) && !isnanl (x.value)) result |= 16; } { /* Unnormalized number. */ static memory_long_double x = { LDBL80_WORDS (0x4000, 0x63333333, 0x00000000) }; if (isnanl (x.value) && !isnanl (x.value)) result |= 32; } { /* Pseudo-Denormal. */ static memory_long_double x = { LDBL80_WORDS (0x0000, 0x83333333, 0x00000000) }; if (isnanl (x.value) && !isnanl (x.value)) result |= 64; } #endif return result; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : gl_cv_func_isnanl_works=yes else gl_cv_func_isnanl_works=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_isnanl_works" >&5 $as_echo "$gl_cv_func_isnanl_works" >&6; } LIBS="$save_LIBS" case "$gl_cv_func_isnanl_works" in *yes) gl_func_isnanl=yes ;; *) gl_func_isnanl=no; ISNANL_LIBM= ;; esac else gl_func_isnanl=no fi if test $gl_func_isnanl != yes; then HAVE_ISNANL=0 fi if test $HAVE_ISNANL = 0 || test $REPLACE_ISNAN = 1; then gl_LIBOBJS="$gl_LIBOBJS isnanl.$ac_objext" { $as_echo "$as_me:${as_lineno-$LINENO}: checking where to find the exponent in a 'long double'" >&5 $as_echo_n "checking where to find the exponent in a 'long double'... " >&6; } if ${gl_cv_cc_long_double_expbit0+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : gl_cv_cc_long_double_expbit0="unknown" case "$host_os" in mingw*) # On native Windows (little-endian), we know the result # in two cases: mingw, MSVC. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __MINGW32__ Known #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "Known" >/dev/null 2>&1; then : gl_cv_cc_long_double_expbit0="word 2 bit 0" fi rm -f conftest* cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef _MSC_VER Known #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "Known" >/dev/null 2>&1; then : gl_cv_cc_long_double_expbit0="word 1 bit 20" fi rm -f conftest* ;; esac else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include #define NWORDS \ ((sizeof (long double) + sizeof (unsigned int) - 1) / sizeof (unsigned int)) typedef union { long double value; unsigned int word[NWORDS]; } memory_long_double; static unsigned int ored_words[NWORDS]; static unsigned int anded_words[NWORDS]; static void add_to_ored_words (long double *x) { memory_long_double m; size_t i; /* Clear it first, in case sizeof (long double) < sizeof (memory_long_double). */ memset (&m, 0, sizeof (memory_long_double)); m.value = *x; for (i = 0; i < NWORDS; i++) { ored_words[i] |= m.word[i]; anded_words[i] &= m.word[i]; } } int main () { static long double samples[5] = { 0.25L, 0.5L, 1.0L, 2.0L, 4.0L }; size_t j; FILE *fp = fopen ("conftest.out", "w"); if (fp == NULL) return 1; for (j = 0; j < NWORDS; j++) anded_words[j] = ~ (unsigned int) 0; for (j = 0; j < 5; j++) add_to_ored_words (&samples[j]); /* Remove bits that are common (e.g. if representation of the first mantissa bit is explicit). */ for (j = 0; j < NWORDS; j++) ored_words[j] &= ~anded_words[j]; /* Now find the nonzero word. */ for (j = 0; j < NWORDS; j++) if (ored_words[j] != 0) break; if (j < NWORDS) { size_t i; for (i = j + 1; i < NWORDS; i++) if (ored_words[i] != 0) { fprintf (fp, "unknown"); return (fclose (fp) != 0); } for (i = 0; ; i++) if ((ored_words[j] >> i) & 1) { fprintf (fp, "word %d bit %d", (int) j, (int) i); return (fclose (fp) != 0); } } fprintf (fp, "unknown"); return (fclose (fp) != 0); } _ACEOF if ac_fn_c_try_run "$LINENO"; then : gl_cv_cc_long_double_expbit0=`cat conftest.out` else gl_cv_cc_long_double_expbit0="unknown" fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi rm -f conftest.out fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_cc_long_double_expbit0" >&5 $as_echo "$gl_cv_cc_long_double_expbit0" >&6; } case "$gl_cv_cc_long_double_expbit0" in word*bit*) word=`echo "$gl_cv_cc_long_double_expbit0" | sed -e 's/word //' -e 's/ bit.*//'` bit=`echo "$gl_cv_cc_long_double_expbit0" | sed -e 's/word.*bit //'` cat >>confdefs.h <<_ACEOF #define LDBL_EXPBIT0_WORD $word _ACEOF cat >>confdefs.h <<_ACEOF #define LDBL_EXPBIT0_BIT $bit _ACEOF ;; esac fi GNULIB_ISNANL=1 $as_echo "#define GNULIB_TEST_ISNANL 1" >>confdefs.h { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether isnan(long double) can be used without linking with libm" >&5 $as_echo_n "checking whether isnan(long double) can be used without linking with libm... " >&6; } if ${gl_cv_func_isnanl_no_libm+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #if (__GNUC__ >= 4) || (__clang_major__ >= 4) # undef isnanl # define isnanl(x) __builtin_isnan ((long double)(x)) #elif defined isnan # undef isnanl # define isnanl(x) isnan ((long double)(x)) #endif long double x; int main () { return isnanl (x); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : gl_cv_func_isnanl_no_libm=yes else gl_cv_func_isnanl_no_libm=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_isnanl_no_libm" >&5 $as_echo "$gl_cv_func_isnanl_no_libm" >&6; } gl_func_isnanl_no_libm=$gl_cv_func_isnanl_no_libm if test $gl_func_isnanl_no_libm = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether isnanl works" >&5 $as_echo_n "checking whether isnanl works... " >&6; } if ${gl_cv_func_isnanl_works+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : case "$host_os" in mingw*) # Guess yes on mingw, no on MSVC. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __MINGW32__ Known #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "Known" >/dev/null 2>&1; then : gl_cv_func_isnanl_works="guessing yes" else gl_cv_func_isnanl_works="guessing no" fi rm -f conftest* ;; *) gl_cv_func_isnanl_works="guessing yes" ;; esac else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #if (__GNUC__ >= 4) || (__clang_major__ >= 4) # undef isnanl # define isnanl(x) __builtin_isnan ((long double)(x)) #elif defined isnan # undef isnanl # define isnanl(x) isnan ((long double)(x)) #endif #define NWORDS \ ((sizeof (long double) + sizeof (unsigned int) - 1) / sizeof (unsigned int)) typedef union { unsigned int word[NWORDS]; long double value; } memory_long_double; /* On Irix 6.5, gcc 3.4.3 can't compute compile-time NaN, and needs the runtime type conversion. */ #ifdef __sgi static long double NaNl () { double zero = 0.0; return zero / zero; } #else # define NaNl() (0.0L / 0.0L) #endif int main () { int result = 0; if (!isnanl (NaNl ())) result |= 1; { memory_long_double m; unsigned int i; /* The isnanl function should be immune against changes in the sign bit and in the mantissa bits. The xor operation twiddles a bit that can only be a sign bit or a mantissa bit (since the exponent never extends to bit 31). */ m.value = NaNl (); m.word[NWORDS / 2] ^= (unsigned int) 1 << (sizeof (unsigned int) * CHAR_BIT - 1); for (i = 0; i < NWORDS; i++) m.word[i] |= 1; if (!isnanl (m.value)) result |= 1; } #if ((defined __ia64 && LDBL_MANT_DIG == 64) || (defined __x86_64__ || defined __amd64__) || (defined __i386 || defined __i386__ || defined _I386 || defined _M_IX86 || defined _X86_)) && !HAVE_SAME_LONG_DOUBLE_AS_DOUBLE /* Representation of an 80-bit 'long double' as an initializer for a sequence of 'unsigned int' words. */ # ifdef WORDS_BIGENDIAN # define LDBL80_WORDS(exponent,manthi,mantlo) \ { ((unsigned int) (exponent) << 16) | ((unsigned int) (manthi) >> 16), \ ((unsigned int) (manthi) << 16) | ((unsigned int) (mantlo) >> 16), \ (unsigned int) (mantlo) << 16 \ } # else # define LDBL80_WORDS(exponent,manthi,mantlo) \ { mantlo, manthi, exponent } # endif { /* Quiet NaN. */ static memory_long_double x = { LDBL80_WORDS (0xFFFF, 0xC3333333, 0x00000000) }; if (!isnanl (x.value)) result |= 2; } { /* Signalling NaN. */ static memory_long_double x = { LDBL80_WORDS (0xFFFF, 0x83333333, 0x00000000) }; if (!isnanl (x.value)) result |= 2; } /* isnanl should return something even for noncanonical values. */ { /* Pseudo-NaN. */ static memory_long_double x = { LDBL80_WORDS (0xFFFF, 0x40000001, 0x00000000) }; if (isnanl (x.value) && !isnanl (x.value)) result |= 4; } { /* Pseudo-Infinity. */ static memory_long_double x = { LDBL80_WORDS (0xFFFF, 0x00000000, 0x00000000) }; if (isnanl (x.value) && !isnanl (x.value)) result |= 8; } { /* Pseudo-Zero. */ static memory_long_double x = { LDBL80_WORDS (0x4004, 0x00000000, 0x00000000) }; if (isnanl (x.value) && !isnanl (x.value)) result |= 16; } { /* Unnormalized number. */ static memory_long_double x = { LDBL80_WORDS (0x4000, 0x63333333, 0x00000000) }; if (isnanl (x.value) && !isnanl (x.value)) result |= 32; } { /* Pseudo-Denormal. */ static memory_long_double x = { LDBL80_WORDS (0x0000, 0x83333333, 0x00000000) }; if (isnanl (x.value) && !isnanl (x.value)) result |= 64; } #endif return result; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : gl_cv_func_isnanl_works=yes else gl_cv_func_isnanl_works=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_isnanl_works" >&5 $as_echo "$gl_cv_func_isnanl_works" >&6; } case "$gl_cv_func_isnanl_works" in *yes) ;; *) gl_func_isnanl_no_libm=no ;; esac fi if test $gl_func_isnanl_no_libm = yes; then $as_echo "#define HAVE_ISNANL_IN_LIBC 1" >>confdefs.h fi if test $gl_func_isnanl_no_libm != yes; then gl_LIBOBJS="$gl_LIBOBJS isnanl.$ac_objext" { $as_echo "$as_me:${as_lineno-$LINENO}: checking where to find the exponent in a 'long double'" >&5 $as_echo_n "checking where to find the exponent in a 'long double'... " >&6; } if ${gl_cv_cc_long_double_expbit0+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : gl_cv_cc_long_double_expbit0="unknown" case "$host_os" in mingw*) # On native Windows (little-endian), we know the result # in two cases: mingw, MSVC. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __MINGW32__ Known #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "Known" >/dev/null 2>&1; then : gl_cv_cc_long_double_expbit0="word 2 bit 0" fi rm -f conftest* cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef _MSC_VER Known #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "Known" >/dev/null 2>&1; then : gl_cv_cc_long_double_expbit0="word 1 bit 20" fi rm -f conftest* ;; esac else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include #define NWORDS \ ((sizeof (long double) + sizeof (unsigned int) - 1) / sizeof (unsigned int)) typedef union { long double value; unsigned int word[NWORDS]; } memory_long_double; static unsigned int ored_words[NWORDS]; static unsigned int anded_words[NWORDS]; static void add_to_ored_words (long double *x) { memory_long_double m; size_t i; /* Clear it first, in case sizeof (long double) < sizeof (memory_long_double). */ memset (&m, 0, sizeof (memory_long_double)); m.value = *x; for (i = 0; i < NWORDS; i++) { ored_words[i] |= m.word[i]; anded_words[i] &= m.word[i]; } } int main () { static long double samples[5] = { 0.25L, 0.5L, 1.0L, 2.0L, 4.0L }; size_t j; FILE *fp = fopen ("conftest.out", "w"); if (fp == NULL) return 1; for (j = 0; j < NWORDS; j++) anded_words[j] = ~ (unsigned int) 0; for (j = 0; j < 5; j++) add_to_ored_words (&samples[j]); /* Remove bits that are common (e.g. if representation of the first mantissa bit is explicit). */ for (j = 0; j < NWORDS; j++) ored_words[j] &= ~anded_words[j]; /* Now find the nonzero word. */ for (j = 0; j < NWORDS; j++) if (ored_words[j] != 0) break; if (j < NWORDS) { size_t i; for (i = j + 1; i < NWORDS; i++) if (ored_words[i] != 0) { fprintf (fp, "unknown"); return (fclose (fp) != 0); } for (i = 0; ; i++) if ((ored_words[j] >> i) & 1) { fprintf (fp, "word %d bit %d", (int) j, (int) i); return (fclose (fp) != 0); } } fprintf (fp, "unknown"); return (fclose (fp) != 0); } _ACEOF if ac_fn_c_try_run "$LINENO"; then : gl_cv_cc_long_double_expbit0=`cat conftest.out` else gl_cv_cc_long_double_expbit0="unknown" fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi rm -f conftest.out fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_cc_long_double_expbit0" >&5 $as_echo "$gl_cv_cc_long_double_expbit0" >&6; } case "$gl_cv_cc_long_double_expbit0" in word*bit*) word=`echo "$gl_cv_cc_long_double_expbit0" | sed -e 's/word //' -e 's/ bit.*//'` bit=`echo "$gl_cv_cc_long_double_expbit0" | sed -e 's/word.*bit //'` cat >>confdefs.h <<_ACEOF #define LDBL_EXPBIT0_WORD $word _ACEOF cat >>confdefs.h <<_ACEOF #define LDBL_EXPBIT0_BIT $bit _ACEOF ;; esac fi ac_fn_c_check_decl "$LINENO" "iswblank" "ac_cv_have_decl_iswblank" " /* Tru64 with Desktop Toolkit C has a bug: must be included before . BSD/OS 4.0.1 has a bug: , and must be included before . */ #include #include #include #include #include " if test "x$ac_cv_have_decl_iswblank" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_ISWBLANK $ac_have_decl _ACEOF if test $ac_cv_func_iswblank = no; then HAVE_ISWBLANK=0 if test $ac_cv_have_decl_iswblank = yes; then REPLACE_ISWBLANK=1 fi fi if test $HAVE_ISWCNTRL = 0 || test $REPLACE_ISWCNTRL = 1; then : else if test $HAVE_ISWBLANK = 0 || test $REPLACE_ISWBLANK = 1; then : fi fi if test $HAVE_ISWCNTRL = 0 || test $REPLACE_ISWCNTRL = 1; then : else if test $HAVE_ISWBLANK = 0 || test $REPLACE_ISWBLANK = 1; then gl_LIBOBJS="$gl_LIBOBJS iswblank.$ac_objext" fi fi GNULIB_ISWBLANK=1 $as_echo "#define GNULIB_TEST_ISWBLANK 1" >>confdefs.h if test $HAVE_ISWCNTRL = 0 || test $REPLACE_ISWCNTRL = 1; then REPLACE_ISWDIGIT="$REPLACE_ISWCNTRL" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether iswdigit is ISO C compliant" >&5 $as_echo_n "checking whether iswdigit is ISO C compliant... " >&6; } if ${gl_cv_func_iswdigit_works+:} false; then : $as_echo_n "(cached) " >&6 else case "$host_os" in # Guess no on FreeBSD, NetBSD, Solaris, native Windows. freebsd* | dragonfly* | netbsd* | solaris* | mingw*) gl_cv_func_iswdigit_works="guessing no" ;; # Guess yes otherwise. *) gl_cv_func_iswdigit_works="guessing yes" ;; esac if test $LOCALE_FR != none || test $LOCALE_JA != none || test $LOCALE_FR_UTF8 != none || test $LOCALE_ZH_CN != none; then if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include /* Tru64 with Desktop Toolkit C has a bug: must be included before . BSD/OS 4.0.1 has a bug: , and must be included before . */ #include #include #include #include #include /* Returns the value of iswdigit for the multibyte character s[0..n-1]. */ static int for_character (const char *s, size_t n) { mbstate_t state; wchar_t wc; size_t ret; memset (&state, '\0', sizeof (mbstate_t)); wc = (wchar_t) 0xBADFACE; ret = mbrtowc (&wc, s, n, &state); if (ret != n) abort (); return iswdigit (wc); } int main (int argc, char *argv[]) { int is; int result = 0; if (setlocale (LC_ALL, "$LOCALE_FR") != NULL) { /* This fails on mingw, MSVC 14. */ /* U+00B2 SUPERSCRIPT TWO */ is = for_character ("\262", 1); if (!(is == 0)) result |= 1; } if (setlocale (LC_ALL, "$LOCALE_JA") != NULL) { /* This fails on NetBSD 8.0. */ /* U+FF11 FULLWIDTH DIGIT ONE */ is = for_character ("\243\261", 2); if (!(is == 0)) result |= 2; } if (setlocale (LC_ALL, "$LOCALE_FR_UTF8") != NULL) { /* This fails on FreeBSD 12, NetBSD 8.0, MSVC 14. */ /* U+0663 ARABIC-INDIC DIGIT THREE */ is = for_character ("\331\243", 2); if (!(is == 0)) result |= 4; /* This fails on FreeBSD 12, NetBSD 8.0, MSVC 14. */ /* U+FF11 FULLWIDTH DIGIT ONE */ is = for_character ("\357\274\221", 3); if (!(is == 0)) result |= 8; } if (setlocale (LC_ALL, "$LOCALE_ZH_CN") != NULL) { /* This fails on NetBSD 8.0, Solaris 10, Solaris 11.4. */ /* U+FF11 FULLWIDTH DIGIT ONE */ is = for_character ("\243\261", 2); if (!(is == 0)) result |= 16; } return result; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : gl_cv_func_iswdigit_works=yes else gl_cv_func_iswdigit_works=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_iswdigit_works" >&5 $as_echo "$gl_cv_func_iswdigit_works" >&6; } case "$gl_cv_func_iswdigit_works" in *yes) ;; *) REPLACE_ISWDIGIT=1 ;; esac fi if test $HAVE_ISWCNTRL = 0 || test $REPLACE_ISWCNTRL = 1; then : else if test $REPLACE_ISWDIGIT = 1; then gl_LIBOBJS="$gl_LIBOBJS iswdigit.$ac_objext" fi fi GNULIB_ISWDIGIT=1 $as_echo "#define GNULIB_TEST_ISWDIGIT 1" >>confdefs.h if test $HAVE_ISWCNTRL = 0 || test $REPLACE_ISWCNTRL = 1; then REPLACE_ISWXDIGIT="$REPLACE_ISWCNTRL" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether iswxdigit is ISO C compliant" >&5 $as_echo_n "checking whether iswxdigit is ISO C compliant... " >&6; } if ${gl_cv_func_iswxdigit_works+:} false; then : $as_echo_n "(cached) " >&6 else case "$host_os" in # Guess no on FreeBSD, NetBSD, Solaris, native Windows. freebsd* | dragonfly* | netbsd* | solaris* | mingw*) gl_cv_func_iswxdigit_works="guessing no" ;; # Guess yes otherwise. *) gl_cv_func_iswxdigit_works="guessing yes" ;; esac if test $LOCALE_JA != none || test $LOCALE_FR_UTF8 != none || test $LOCALE_ZH_CN != none; then if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include /* Tru64 with Desktop Toolkit C has a bug: must be included before . BSD/OS 4.0.1 has a bug: , and must be included before . */ #include #include #include #include #include /* Returns the value of iswxdigit for the multibyte character s[0..n-1]. */ static int for_character (const char *s, size_t n) { mbstate_t state; wchar_t wc; size_t ret; memset (&state, '\0', sizeof (mbstate_t)); wc = (wchar_t) 0xBADFACE; ret = mbrtowc (&wc, s, n, &state); if (ret != n) abort (); return iswxdigit (wc); } int main (int argc, char *argv[]) { int is; int result = 0; if (setlocale (LC_ALL, "$LOCALE_JA") != NULL) { /* This fails on NetBSD 8.0. */ /* U+FF21 FULLWIDTH LATIN CAPITAL LETTER A */ is = for_character ("\243\301", 2); if (!(is == 0)) result |= 1; } if (setlocale (LC_ALL, "$LOCALE_FR_UTF8") != NULL) { /* This fails on FreeBSD 12. */ /* U+0663 ARABIC-INDIC DIGIT THREE */ is = for_character ("\331\243", 2); if (!(is == 0)) result |= 2; /* This fails on MSVC 14. */ /* U+FF21 FULLWIDTH LATIN CAPITAL LETTER A */ is = for_character ("\357\274\241", 3); if (!(is == 0)) result |= 4; } if (setlocale (LC_ALL, "$LOCALE_ZH_CN") != NULL) { /* This fails on Solaris 10, Solaris 11.4. */ /* U+FF11 FULLWIDTH DIGIT ONE */ is = for_character ("\243\261", 2); if (!(is == 0)) result |= 8; } return result; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : gl_cv_func_iswxdigit_works=yes else gl_cv_func_iswxdigit_works=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_iswxdigit_works" >&5 $as_echo "$gl_cv_func_iswxdigit_works" >&6; } case "$gl_cv_func_iswxdigit_works" in *yes) ;; *) REPLACE_ISWXDIGIT=1 ;; esac fi if test $HAVE_ISWCNTRL = 0 || test $REPLACE_ISWCNTRL = 1; then : else if test $REPLACE_ISWXDIGIT = 1; then gl_LIBOBJS="$gl_LIBOBJS iswxdigit.$ac_objext" fi fi GNULIB_ISWXDIGIT=1 $as_echo "#define GNULIB_TEST_ISWXDIGIT 1" >>confdefs.h if test $gl_cv_have_include_next = yes; then gl_cv_next_langinfo_h='<'langinfo.h'>' else { $as_echo "$as_me:${as_lineno-$LINENO}: checking absolute name of " >&5 $as_echo_n "checking absolute name of ... " >&6; } if ${gl_cv_next_langinfo_h+:} false; then : $as_echo_n "(cached) " >&6 else if test $ac_cv_header_langinfo_h = yes; then cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF case "$host_os" in aix*) gl_absname_cpp="$ac_cpp -C" ;; *) gl_absname_cpp="$ac_cpp" ;; esac case "$host_os" in mingw*) gl_dirsep_regex='[/\\]' ;; *) gl_dirsep_regex='\/' ;; esac gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g' gl_header_literal_regex=`echo 'langinfo.h' \ | sed -e "$gl_make_literal_regex_sed"` gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{ s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/ s|^/[^/]|//&| p q }' gl_cv_absolute_langinfo_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 | sed -n "$gl_absolute_header_sed"` gl_header=$gl_cv_absolute_langinfo_h gl_cv_next_langinfo_h='"'$gl_header'"' else gl_cv_next_langinfo_h='<'langinfo.h'>' fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_langinfo_h" >&5 $as_echo "$gl_cv_next_langinfo_h" >&6; } fi NEXT_LANGINFO_H=$gl_cv_next_langinfo_h if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next' gl_next_as_first_directive='<'langinfo.h'>' else # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include' gl_next_as_first_directive=$gl_cv_next_langinfo_h fi NEXT_AS_FIRST_DIRECTIVE_LANGINFO_H=$gl_next_as_first_directive HAVE_LANGINFO_CODESET=0 HAVE_LANGINFO_T_FMT_AMPM=0 HAVE_LANGINFO_ALTMON=0 HAVE_LANGINFO_ERA=0 HAVE_LANGINFO_YESEXPR=0 if test $ac_cv_header_langinfo_h = yes; then HAVE_LANGINFO_H=1 { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether langinfo.h defines CODESET" >&5 $as_echo_n "checking whether langinfo.h defines CODESET... " >&6; } if ${gl_cv_header_langinfo_codeset+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int a = CODESET; int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : gl_cv_header_langinfo_codeset=yes else gl_cv_header_langinfo_codeset=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_langinfo_codeset" >&5 $as_echo "$gl_cv_header_langinfo_codeset" >&6; } if test $gl_cv_header_langinfo_codeset = yes; then HAVE_LANGINFO_CODESET=1 fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether langinfo.h defines T_FMT_AMPM" >&5 $as_echo_n "checking whether langinfo.h defines T_FMT_AMPM... " >&6; } if ${gl_cv_header_langinfo_t_fmt_ampm+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int a = T_FMT_AMPM; int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : gl_cv_header_langinfo_t_fmt_ampm=yes else gl_cv_header_langinfo_t_fmt_ampm=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_langinfo_t_fmt_ampm" >&5 $as_echo "$gl_cv_header_langinfo_t_fmt_ampm" >&6; } if test $gl_cv_header_langinfo_t_fmt_ampm = yes; then HAVE_LANGINFO_T_FMT_AMPM=1 fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether langinfo.h defines ALTMON_1" >&5 $as_echo_n "checking whether langinfo.h defines ALTMON_1... " >&6; } if ${gl_cv_header_langinfo_altmon+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int a = ALTMON_1; int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : gl_cv_header_langinfo_altmon=yes else gl_cv_header_langinfo_altmon=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_langinfo_altmon" >&5 $as_echo "$gl_cv_header_langinfo_altmon" >&6; } if test $gl_cv_header_langinfo_altmon = yes; then HAVE_LANGINFO_ALTMON=1 fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether langinfo.h defines ERA" >&5 $as_echo_n "checking whether langinfo.h defines ERA... " >&6; } if ${gl_cv_header_langinfo_era+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int a = ERA; int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : gl_cv_header_langinfo_era=yes else gl_cv_header_langinfo_era=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_langinfo_era" >&5 $as_echo "$gl_cv_header_langinfo_era" >&6; } if test $gl_cv_header_langinfo_era = yes; then HAVE_LANGINFO_ERA=1 fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether langinfo.h defines YESEXPR" >&5 $as_echo_n "checking whether langinfo.h defines YESEXPR... " >&6; } if ${gl_cv_header_langinfo_yesexpr+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int a = YESEXPR; int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : gl_cv_header_langinfo_yesexpr=yes else gl_cv_header_langinfo_yesexpr=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_langinfo_yesexpr" >&5 $as_echo "$gl_cv_header_langinfo_yesexpr" >&6; } if test $gl_cv_header_langinfo_yesexpr = yes; then HAVE_LANGINFO_YESEXPR=1 fi else HAVE_LANGINFO_H=0 fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports the __inline keyword" >&5 $as_echo_n "checking whether the compiler supports the __inline keyword... " >&6; } if ${gl_cv_c___inline+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ typedef int foo_t; static __inline foo_t foo (void) { return 0; } int main () { return foo (); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : gl_cv_c___inline=yes else gl_cv_c___inline=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_c___inline" >&5 $as_echo "$gl_cv_c___inline" >&6; } if test $gl_cv_c___inline = yes; then $as_echo "#define HAVE___INLINE 1" >>confdefs.h fi LOCALCHARSET_TESTS_ENVIRONMENT= case "$host_os" in solaris*) $as_echo "#define _LCONV_C99 1" >>confdefs.h ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether locale.h conforms to POSIX:2001" >&5 $as_echo_n "checking whether locale.h conforms to POSIX:2001... " >&6; } if ${gl_cv_header_locale_h_posix2001+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int x = LC_MESSAGES; int y = sizeof (((struct lconv *) 0)->decimal_point); int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : gl_cv_header_locale_h_posix2001=yes else gl_cv_header_locale_h_posix2001=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_locale_h_posix2001" >&5 $as_echo "$gl_cv_header_locale_h_posix2001" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether struct lconv is properly defined" >&5 $as_echo_n "checking whether struct lconv is properly defined... " >&6; } if ${gl_cv_sys_struct_lconv_ok+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include struct lconv l; int x = sizeof (l.decimal_point); int y = sizeof (l.int_p_cs_precedes); int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : gl_cv_sys_struct_lconv_ok=yes else gl_cv_sys_struct_lconv_ok=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_sys_struct_lconv_ok" >&5 $as_echo "$gl_cv_sys_struct_lconv_ok" >&6; } if test $gl_cv_sys_struct_lconv_ok = no; then case "$host_os" in mingw*) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef _MSC_VER Special #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "Special" >/dev/null 2>&1; then : else REPLACE_STRUCT_LCONV=1 fi rm -f conftest* ;; *) REPLACE_STRUCT_LCONV=1 ;; esac fi if test $gl_cv_have_include_next = yes; then gl_cv_next_locale_h='<'locale.h'>' else { $as_echo "$as_me:${as_lineno-$LINENO}: checking absolute name of " >&5 $as_echo_n "checking absolute name of ... " >&6; } if ${gl_cv_next_locale_h+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF case "$host_os" in aix*) gl_absname_cpp="$ac_cpp -C" ;; *) gl_absname_cpp="$ac_cpp" ;; esac case "$host_os" in mingw*) gl_dirsep_regex='[/\\]' ;; *) gl_dirsep_regex='\/' ;; esac gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g' gl_header_literal_regex=`echo 'locale.h' \ | sed -e "$gl_make_literal_regex_sed"` gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{ s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/ s|^/[^/]|//&| p q }' gl_cv_absolute_locale_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 | sed -n "$gl_absolute_header_sed"` gl_header=$gl_cv_absolute_locale_h gl_cv_next_locale_h='"'$gl_header'"' fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_locale_h" >&5 $as_echo "$gl_cv_next_locale_h" >&6; } fi NEXT_LOCALE_H=$gl_cv_next_locale_h if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next' gl_next_as_first_directive='<'locale.h'>' else # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include' gl_next_as_first_directive=$gl_cv_next_locale_h fi NEXT_AS_FIRST_DIRECTIVE_LOCALE_H=$gl_next_as_first_directive if test $REPLACE_STRUCT_LCONV = 1; then REPLACE_LOCALECONV=1 fi if test $REPLACE_LOCALECONV = 1; then gl_LIBOBJS="$gl_LIBOBJS localeconv.$ac_objext" ac_fn_c_check_member "$LINENO" "struct lconv" "decimal_point" "ac_cv_member_struct_lconv_decimal_point" "#include " if test "x$ac_cv_member_struct_lconv_decimal_point" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_STRUCT_LCONV_DECIMAL_POINT 1 _ACEOF fi fi GNULIB_LOCALECONV=1 $as_echo "#define GNULIB_TEST_LOCALECONV 1" >>confdefs.h if test $HAVE_LOCALE_T = 1; then gl_func_newlocale="$ac_cv_func_newlocale" gl_func_duplocale="$ac_cv_func_duplocale" gl_func_freelocale="$ac_cv_func_freelocale" else gl_func_newlocale=no gl_func_duplocale=no gl_func_freelocale=no fi if test $gl_func_newlocale != yes; then HAVE_NEWLOCALE=0 fi if test $gl_func_duplocale != yes; then HAVE_DUPLOCALE=0 fi if test $gl_func_freelocale != yes; then HAVE_FREELOCALE=0 fi if test $gt_nameless_locales = yes; then REPLACE_NEWLOCALE=1 REPLACE_DUPLOCALE=1 REPLACE_FREELOCALE=1 fi GNULIB_LOCALENAME=1 $as_echo "#define GNULIB_TEST_LOCALENAME 1" >>confdefs.h if test "$gl_threads_api" = posix; then # OSF/1 4.0 and Mac OS X 10.1 lack the pthread_rwlock_t type and the # pthread_rwlock_* functions. has_rwlock=false ac_fn_c_check_type "$LINENO" "pthread_rwlock_t" "ac_cv_type_pthread_rwlock_t" "#include " if test "x$ac_cv_type_pthread_rwlock_t" = xyes; then : has_rwlock=true $as_echo "#define HAVE_PTHREAD_RWLOCK 1" >>confdefs.h fi if $has_rwlock; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether pthread_rwlock_rdlock prefers a writer to a reader" >&5 $as_echo_n "checking whether pthread_rwlock_rdlock prefers a writer to a reader... " >&6; } if ${gl_cv_pthread_rwlock_rdlock_prefer_writer+:} false; then : $as_echo_n "(cached) " >&6 else save_LIBS="$LIBS" LIBS="$LIBS $LIBMULTITHREAD" if test "$cross_compiling" = yes; then : case "$host_os" in # Guess no on glibc systems. *-gnu* | gnu*) gl_cv_pthread_rwlock_rdlock_prefer_writer="guessing no" ;; # Guess no on musl systems. *-musl*) gl_cv_pthread_rwlock_rdlock_prefer_writer="guessing no" ;; # Guess no on bionic systems. *-android*) gl_cv_pthread_rwlock_rdlock_prefer_writer="guessing no" ;; # Guess yes on native Windows with the mingw-w64 winpthreads library. # Guess no on native Windows with the gnulib windows-rwlock module. mingw*) if test "$gl_use_threads" = yes || test "$gl_use_threads" = posix; then gl_cv_pthread_rwlock_rdlock_prefer_writer="guessing yes" else gl_cv_pthread_rwlock_rdlock_prefer_writer="guessing no" fi ;; # If we don't know, obey --enable-cross-guesses. *) gl_cv_pthread_rwlock_rdlock_prefer_writer="$gl_cross_guess_normal" ;; esac else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include #define SUCCEED() exit (0) #define FAILURE() exit (1) #define UNEXPECTED(n) (exit (10 + (n))) /* The main thread creates the waiting writer and the requesting reader threads in the default way; this guarantees that they have the same priority. We can reuse the main thread as first reader thread. */ static pthread_rwlock_t lock; static pthread_t reader1; static pthread_t writer; static pthread_t reader2; static pthread_t timer; /* Used to pass control from writer to reader2 and from reader2 to timer, as in a relay race. Passing control from one running thread to another running thread is most likely faster than to create the second thread. */ static pthread_mutex_t baton; static void * timer_func (void *ignored) { /* Step 13 (can be before or after step 12): The timer thread takes the baton, then waits a moment to make sure it can tell whether the second reader thread is blocked at step 12. */ if (pthread_mutex_lock (&baton)) UNEXPECTED (13); usleep (100000); /* By the time we get here, it's clear that the second reader thread is blocked at step 12. This is the desired behaviour. */ SUCCEED (); } static void * reader2_func (void *ignored) { int err; /* Step 8 (can be before or after step 7): The second reader thread takes the baton, then waits a moment to make sure the writer thread has reached step 7. */ if (pthread_mutex_lock (&baton)) UNEXPECTED (8); usleep (100000); /* Step 9: The second reader thread requests the lock. */ err = pthread_rwlock_tryrdlock (&lock); if (err == 0) FAILURE (); else if (err != EBUSY) UNEXPECTED (9); /* Step 10: Launch a timer, to test whether the next call blocks. */ if (pthread_create (&timer, NULL, timer_func, NULL)) UNEXPECTED (10); /* Step 11: Release the baton. */ if (pthread_mutex_unlock (&baton)) UNEXPECTED (11); /* Step 12: The second reader thread requests the lock. */ err = pthread_rwlock_rdlock (&lock); if (err == 0) FAILURE (); else UNEXPECTED (12); } static void * writer_func (void *ignored) { /* Step 4: Take the baton, so that the second reader thread does not go ahead too early. */ if (pthread_mutex_lock (&baton)) UNEXPECTED (4); /* Step 5: Create the second reader thread. */ if (pthread_create (&reader2, NULL, reader2_func, NULL)) UNEXPECTED (5); /* Step 6: Release the baton. */ if (pthread_mutex_unlock (&baton)) UNEXPECTED (6); /* Step 7: The writer thread requests the lock. */ if (pthread_rwlock_wrlock (&lock)) UNEXPECTED (7); return NULL; } int main () { reader1 = pthread_self (); /* Step 1: The main thread initializes the lock and the baton. */ if (pthread_rwlock_init (&lock, NULL)) UNEXPECTED (1); if (pthread_mutex_init (&baton, NULL)) UNEXPECTED (1); /* Step 2: The main thread acquires the lock as a reader. */ if (pthread_rwlock_rdlock (&lock)) UNEXPECTED (2); /* Step 3: Create the writer thread. */ if (pthread_create (&writer, NULL, writer_func, NULL)) UNEXPECTED (3); /* Job done. Go to sleep. */ for (;;) { sleep (1); } } _ACEOF if ac_fn_c_try_run "$LINENO"; then : gl_cv_pthread_rwlock_rdlock_prefer_writer=yes else gl_cv_pthread_rwlock_rdlock_prefer_writer=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi LIBS="$save_LIBS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_pthread_rwlock_rdlock_prefer_writer" >&5 $as_echo "$gl_cv_pthread_rwlock_rdlock_prefer_writer" >&6; } case "$gl_cv_pthread_rwlock_rdlock_prefer_writer" in *yes) $as_echo "#define HAVE_PTHREAD_RWLOCK_RDLOCK_PREFER_WRITER 1" >>confdefs.h ;; esac fi # glibc defines PTHREAD_MUTEX_RECURSIVE as enum, not as a macro. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { #if __FreeBSD__ == 4 error "No, in FreeBSD 4.0 recursive mutexes actually don't work." #elif (defined __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ \ && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ < 1070) error "No, in Mac OS X < 10.7 recursive mutexes actually don't work." #else int x = (int)PTHREAD_MUTEX_RECURSIVE; return !x; #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : $as_echo "#define HAVE_PTHREAD_MUTEX_RECURSIVE 1" >>confdefs.h fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi : cat >>confdefs.h <<_ACEOF #define GNULIB_LOCK 1 _ACEOF { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether lseek detects pipes" >&5 $as_echo_n "checking whether lseek detects pipes... " >&6; } if ${gl_cv_func_lseek_pipe+:} false; then : $as_echo_n "(cached) " >&6 else case "$host_os" in mingw*) gl_cv_func_lseek_pipe=no ;; *) if test $cross_compiling = no; then cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include /* for off_t */ #include /* for SEEK_CUR */ #if HAVE_UNISTD_H # include #else /* on Windows with MSVC */ # include #endif int main () { /* Exit with success only if stdin is seekable. */ return lseek (0, (off_t)0, SEEK_CUR) < 0; ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : if test -s conftest$ac_exeext \ && ./conftest$ac_exeext < conftest.$ac_ext \ && test 1 = "`echo hi \ | { ./conftest$ac_exeext; echo $?; cat >/dev/null; }`"; then gl_cv_func_lseek_pipe=yes else gl_cv_func_lseek_pipe=no fi else gl_cv_func_lseek_pipe=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #if defined __BEOS__ /* BeOS mistakenly return 0 when trying to seek on pipes. */ Choke me. #endif _ACEOF if ac_fn_c_try_compile "$LINENO"; then : gl_cv_func_lseek_pipe=yes else gl_cv_func_lseek_pipe=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_lseek_pipe" >&5 $as_echo "$gl_cv_func_lseek_pipe" >&6; } if test $gl_cv_func_lseek_pipe = no; then REPLACE_LSEEK=1 $as_echo "#define LSEEK_PIPE_BROKEN 1" >>confdefs.h fi if test $WINDOWS_64_BIT_OFF_T = 1; then REPLACE_LSEEK=1 fi if test $REPLACE_LSEEK = 1; then gl_LIBOBJS="$gl_LIBOBJS lseek.$ac_objext" fi GNULIB_LSEEK=1 $as_echo "#define GNULIB_TEST_LSEEK 1" >>confdefs.h if test $ac_cv_func_lstat = yes; then case $host_os,$gl_cv_func_lstat_dereferences_slashed_symlink in solaris* | *no) REPLACE_LSTAT=1 ;; esac else HAVE_LSTAT=0 fi if test $REPLACE_LSTAT = 1; then gl_LIBOBJS="$gl_LIBOBJS lstat.$ac_objext" : fi GNULIB_LSTAT=1 $as_echo "#define GNULIB_TEST_LSTAT 1" >>confdefs.h if test $gl_cv_func_malloc_posix = yes; then $as_echo "#define HAVE_MALLOC_POSIX 1" >>confdefs.h else REPLACE_MALLOC=1 fi if test $REPLACE_MALLOC = 1; then gl_LIBOBJS="$gl_LIBOBJS malloc.$ac_objext" fi GNULIB_MALLOC_POSIX=1 $as_echo "#define GNULIB_TEST_MALLOC_POSIX 1" >>confdefs.h if test $gl_cv_have_include_next = yes; then gl_cv_next_math_h='<'math.h'>' else { $as_echo "$as_me:${as_lineno-$LINENO}: checking absolute name of " >&5 $as_echo_n "checking absolute name of ... " >&6; } if ${gl_cv_next_math_h+:} false; then : $as_echo_n "(cached) " >&6 else if test $ac_cv_header_math_h = yes; then cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF case "$host_os" in aix*) gl_absname_cpp="$ac_cpp -C" ;; *) gl_absname_cpp="$ac_cpp" ;; esac case "$host_os" in mingw*) gl_dirsep_regex='[/\\]' ;; *) gl_dirsep_regex='\/' ;; esac gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g' gl_header_literal_regex=`echo 'math.h' \ | sed -e "$gl_make_literal_regex_sed"` gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{ s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/ s|^/[^/]|//&| p q }' gl_cv_absolute_math_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 | sed -n "$gl_absolute_header_sed"` gl_header=$gl_cv_absolute_math_h gl_cv_next_math_h='"'$gl_header'"' else gl_cv_next_math_h='<'math.h'>' fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_math_h" >&5 $as_echo "$gl_cv_next_math_h" >&6; } fi NEXT_MATH_H=$gl_cv_next_math_h if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next' gl_next_as_first_directive='<'math.h'>' else # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include' gl_next_as_first_directive=$gl_cv_next_math_h fi NEXT_AS_FIRST_DIRECTIVE_MATH_H=$gl_next_as_first_directive { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether NAN macro works" >&5 $as_echo_n "checking whether NAN macro works... " >&6; } if ${gl_cv_header_math_nan_works+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { /* Solaris 10 has a broken definition of NAN. Other platforms fail to provide NAN, or provide it only in C99 mode; this test only needs to fail when NAN is provided but wrong. */ float f = 1.0f; #ifdef NAN f = NAN; #endif return f == 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : gl_cv_header_math_nan_works=yes else gl_cv_header_math_nan_works=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_math_nan_works" >&5 $as_echo "$gl_cv_header_math_nan_works" >&6; } if test $gl_cv_header_math_nan_works = no; then REPLACE_NAN=1 fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether HUGE_VAL works" >&5 $as_echo_n "checking whether HUGE_VAL works... " >&6; } if ${gl_cv_header_math_huge_val_works+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { /* Solaris 10 has a broken definition of HUGE_VAL. */ double d = HUGE_VAL; return d == 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : gl_cv_header_math_huge_val_works=yes else gl_cv_header_math_huge_val_works=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_math_huge_val_works" >&5 $as_echo "$gl_cv_header_math_huge_val_works" >&6; } if test $gl_cv_header_math_huge_val_works = no; then REPLACE_HUGE_VAL=1 fi : if case "$host_os" in mingw*) true ;; *) test $ac_cv_func_mbsinit = yes ;; esac \ && test $ac_cv_func_mbrtowc = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether mbrtowc handles incomplete characters" >&5 $as_echo_n "checking whether mbrtowc handles incomplete characters... " >&6; } if ${gl_cv_func_mbrtowc_incomplete_state+:} false; then : $as_echo_n "(cached) " >&6 else case "$host_os" in # Guess no on AIX and OSF/1. aix* | osf*) gl_cv_func_mbrtowc_incomplete_state="guessing no" ;; # Guess yes otherwise. *) gl_cv_func_mbrtowc_incomplete_state="guessing yes" ;; esac if test $LOCALE_JA != none; then if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include /* Tru64 with Desktop Toolkit C has a bug: must be included before . BSD/OS 4.0.1 has a bug: , and must be included before . */ #include #include #include #include int main () { if (setlocale (LC_ALL, "$LOCALE_JA") != NULL) { const char input[] = "B\217\253\344\217\251\316er"; /* "Büßer" */ mbstate_t state; wchar_t wc; memset (&state, '\0', sizeof (mbstate_t)); if (mbrtowc (&wc, input + 1, 1, &state) == (size_t)(-2)) if (mbsinit (&state)) return 2; } return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : gl_cv_func_mbrtowc_incomplete_state=yes else gl_cv_func_mbrtowc_incomplete_state=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi else if test $LOCALE_FR_UTF8 != none; then if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include /* Tru64 with Desktop Toolkit C has a bug: must be included before . BSD/OS 4.0.1 has a bug: , and must be included before . */ #include #include #include #include int main () { if (setlocale (LC_ALL, "$LOCALE_FR_UTF8") != NULL) { const char input[] = "B\303\274\303\237er"; /* "Büßer" */ mbstate_t state; wchar_t wc; memset (&state, '\0', sizeof (mbstate_t)); if (mbrtowc (&wc, input + 1, 1, &state) == (size_t)(-2)) if (mbsinit (&state)) return 2; } return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : gl_cv_func_mbrtowc_incomplete_state=yes else gl_cv_func_mbrtowc_incomplete_state=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_mbrtowc_incomplete_state" >&5 $as_echo "$gl_cv_func_mbrtowc_incomplete_state" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether mbrtowc works as well as mbtowc" >&5 $as_echo_n "checking whether mbrtowc works as well as mbtowc... " >&6; } if ${gl_cv_func_mbrtowc_sanitycheck+:} false; then : $as_echo_n "(cached) " >&6 else case "$host_os" in # Guess no on Solaris 8. solaris2.8) gl_cv_func_mbrtowc_sanitycheck="guessing no" ;; # Guess yes otherwise. *) gl_cv_func_mbrtowc_sanitycheck="guessing yes" ;; esac if test $LOCALE_ZH_CN != none; then if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include /* Tru64 with Desktop Toolkit C has a bug: must be included before . BSD/OS 4.0.1 has a bug: , and must be included before . */ #include #include #include #include int main () { /* This fails on Solaris 8: mbrtowc returns 2, and sets wc to 0x00F0. mbtowc returns 4 (correct) and sets wc to 0x5EDC. */ if (setlocale (LC_ALL, "$LOCALE_ZH_CN") != NULL) { char input[] = "B\250\271\201\060\211\070er"; /* "Büßer" */ mbstate_t state; wchar_t wc; memset (&state, '\0', sizeof (mbstate_t)); if (mbrtowc (&wc, input + 3, 6, &state) != 4 && mbtowc (&wc, input + 3, 6) == 4) return 2; } return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : gl_cv_func_mbrtowc_sanitycheck=yes else gl_cv_func_mbrtowc_sanitycheck=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_mbrtowc_sanitycheck" >&5 $as_echo "$gl_cv_func_mbrtowc_sanitycheck" >&6; } REPLACE_MBSTATE_T=0 case "$gl_cv_func_mbrtowc_incomplete_state" in *yes) ;; *) REPLACE_MBSTATE_T=1 ;; esac case "$gl_cv_func_mbrtowc_sanitycheck" in *yes) ;; *) REPLACE_MBSTATE_T=1 ;; esac else REPLACE_MBSTATE_T=1 fi if test $ac_cv_func_mbrtowc = no; then HAVE_MBRTOWC=0 ac_fn_c_check_decl "$LINENO" "mbrtowc" "ac_cv_have_decl_mbrtowc" " /* Tru64 with Desktop Toolkit C has a bug: must be included before . BSD/OS 4.0.1 has a bug: , and must be included before . */ #include #include #include #include " if test "x$ac_cv_have_decl_mbrtowc" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_MBRTOWC $ac_have_decl _ACEOF if test $ac_cv_have_decl_mbrtowc = yes; then REPLACE_MBRTOWC=1 fi else if test $REPLACE_MBSTATE_T = 1; then REPLACE_MBRTOWC=1 else { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether mbrtowc handles a NULL pwc argument" >&5 $as_echo_n "checking whether mbrtowc handles a NULL pwc argument... " >&6; } if ${gl_cv_func_mbrtowc_null_arg1+:} false; then : $as_echo_n "(cached) " >&6 else case "$host_os" in # Guess no on Solaris. solaris*) gl_cv_func_mbrtowc_null_arg1="guessing no" ;; # Guess yes otherwise. *) gl_cv_func_mbrtowc_null_arg1="guessing yes" ;; esac if test $LOCALE_FR_UTF8 != none; then if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include /* Tru64 with Desktop Toolkit C has a bug: must be included before . BSD/OS 4.0.1 has a bug: , and must be included before . */ #include #include #include #include int main () { int result = 0; if (setlocale (LC_ALL, "$LOCALE_FR_UTF8") != NULL) { char input[] = "\303\237er"; mbstate_t state; wchar_t wc; size_t ret; memset (&state, '\0', sizeof (mbstate_t)); wc = (wchar_t) 0xBADFACE; ret = mbrtowc (&wc, input, 5, &state); if (ret != 2) result |= 1; if (!mbsinit (&state)) result |= 2; memset (&state, '\0', sizeof (mbstate_t)); ret = mbrtowc (NULL, input, 5, &state); if (ret != 2) /* Solaris 7 fails here: ret is -1. */ result |= 4; if (!mbsinit (&state)) result |= 8; } return result; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : gl_cv_func_mbrtowc_null_arg1=yes else gl_cv_func_mbrtowc_null_arg1=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_mbrtowc_null_arg1" >&5 $as_echo "$gl_cv_func_mbrtowc_null_arg1" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether mbrtowc handles a NULL string argument" >&5 $as_echo_n "checking whether mbrtowc handles a NULL string argument... " >&6; } if ${gl_cv_func_mbrtowc_null_arg2+:} false; then : $as_echo_n "(cached) " >&6 else case "$host_os" in # Guess no on OSF/1. osf*) gl_cv_func_mbrtowc_null_arg2="guessing no" ;; # Guess yes otherwise. *) gl_cv_func_mbrtowc_null_arg2="guessing yes" ;; esac if test $LOCALE_FR_UTF8 != none; then if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include /* Tru64 with Desktop Toolkit C has a bug: must be included before . BSD/OS 4.0.1 has a bug: , and must be included before . */ #include #include #include #include int main () { if (setlocale (LC_ALL, "$LOCALE_FR_UTF8") != NULL) { mbstate_t state; wchar_t wc; int ret; memset (&state, '\0', sizeof (mbstate_t)); wc = (wchar_t) 0xBADFACE; mbrtowc (&wc, NULL, 5, &state); /* Check that wc was not modified. */ if (wc != (wchar_t) 0xBADFACE) return 2; } return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : gl_cv_func_mbrtowc_null_arg2=yes else gl_cv_func_mbrtowc_null_arg2=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_mbrtowc_null_arg2" >&5 $as_echo "$gl_cv_func_mbrtowc_null_arg2" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether mbrtowc has a correct return value" >&5 $as_echo_n "checking whether mbrtowc has a correct return value... " >&6; } if ${gl_cv_func_mbrtowc_retval+:} false; then : $as_echo_n "(cached) " >&6 else case "$host_os" in # Guess no on HP-UX, Solaris, native Windows. hpux* | solaris* | mingw*) gl_cv_func_mbrtowc_retval="guessing no" ;; # Guess yes otherwise. *) gl_cv_func_mbrtowc_retval="guessing yes" ;; esac if test $LOCALE_FR_UTF8 != none || test $LOCALE_JA != none \ || { case "$host_os" in mingw*) true;; *) false;; esac; }; then if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include /* Tru64 with Desktop Toolkit C has a bug: must be included before . BSD/OS 4.0.1 has a bug: , and must be included before . */ #include #include #include #include int main () { int result = 0; int found_some_locale = 0; /* This fails on Solaris. */ if (setlocale (LC_ALL, "$LOCALE_FR_UTF8") != NULL) { char input[] = "B\303\274\303\237er"; /* "Büßer" */ mbstate_t state; wchar_t wc; memset (&state, '\0', sizeof (mbstate_t)); if (mbrtowc (&wc, input + 1, 1, &state) == (size_t)(-2)) { input[1] = '\0'; if (mbrtowc (&wc, input + 2, 5, &state) != 1) result |= 1; } found_some_locale = 1; } /* This fails on HP-UX 11.11. */ if (setlocale (LC_ALL, "$LOCALE_JA") != NULL) { char input[] = "B\217\253\344\217\251\316er"; /* "Büßer" */ mbstate_t state; wchar_t wc; memset (&state, '\0', sizeof (mbstate_t)); if (mbrtowc (&wc, input + 1, 1, &state) == (size_t)(-2)) { input[1] = '\0'; if (mbrtowc (&wc, input + 2, 5, &state) != 2) result |= 2; } found_some_locale = 1; } /* This fails on native Windows. */ if (setlocale (LC_ALL, "Japanese_Japan.932") != NULL) { char input[] = "<\223\372\226\173\214\352>"; /* "<日本語>" */ mbstate_t state; wchar_t wc; memset (&state, '\0', sizeof (mbstate_t)); if (mbrtowc (&wc, input + 3, 1, &state) == (size_t)(-2)) { input[3] = '\0'; if (mbrtowc (&wc, input + 4, 4, &state) != 1) result |= 4; } found_some_locale = 1; } if (setlocale (LC_ALL, "Chinese_Taiwan.950") != NULL) { char input[] = "<\244\351\245\273\273\171>"; /* "<日本語>" */ mbstate_t state; wchar_t wc; memset (&state, '\0', sizeof (mbstate_t)); if (mbrtowc (&wc, input + 3, 1, &state) == (size_t)(-2)) { input[3] = '\0'; if (mbrtowc (&wc, input + 4, 4, &state) != 1) result |= 8; } found_some_locale = 1; } if (setlocale (LC_ALL, "Chinese_China.936") != NULL) { char input[] = "<\310\325\261\276\325\132>"; /* "<日本語>" */ mbstate_t state; wchar_t wc; memset (&state, '\0', sizeof (mbstate_t)); if (mbrtowc (&wc, input + 3, 1, &state) == (size_t)(-2)) { input[3] = '\0'; if (mbrtowc (&wc, input + 4, 4, &state) != 1) result |= 16; } found_some_locale = 1; } return (found_some_locale ? result : 77); } _ACEOF if ac_fn_c_try_run "$LINENO"; then : gl_cv_func_mbrtowc_retval=yes else if test $? != 77; then gl_cv_func_mbrtowc_retval=no fi fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_mbrtowc_retval" >&5 $as_echo "$gl_cv_func_mbrtowc_retval" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether mbrtowc returns 0 when parsing a NUL character" >&5 $as_echo_n "checking whether mbrtowc returns 0 when parsing a NUL character... " >&6; } if ${gl_cv_func_mbrtowc_nul_retval+:} false; then : $as_echo_n "(cached) " >&6 else case "$host_os" in # Guess no on Solaris 8 and 9. solaris2.[89]) gl_cv_func_mbrtowc_nul_retval="guessing no" ;; # Guess yes otherwise. *) gl_cv_func_mbrtowc_nul_retval="guessing yes" ;; esac if test $LOCALE_ZH_CN != none; then if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include /* Tru64 with Desktop Toolkit C has a bug: must be included before . BSD/OS 4.0.1 has a bug: , and must be included before . */ #include #include #include #include int main () { /* This fails on Solaris 8 and 9. */ if (setlocale (LC_ALL, "$LOCALE_ZH_CN") != NULL) { mbstate_t state; wchar_t wc; memset (&state, '\0', sizeof (mbstate_t)); if (mbrtowc (&wc, "", 1, &state) != 0) return 2; } return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : gl_cv_func_mbrtowc_nul_retval=yes else gl_cv_func_mbrtowc_nul_retval=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_mbrtowc_nul_retval" >&5 $as_echo "$gl_cv_func_mbrtowc_nul_retval" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether mbrtowc stores incomplete characters" >&5 $as_echo_n "checking whether mbrtowc stores incomplete characters... " >&6; } if ${gl_cv_func_mbrtowc_stores_incomplete+:} false; then : $as_echo_n "(cached) " >&6 else case "$host_os" in # Guess yes on native Windows. mingw*) gl_cv_func_mbrtowc_stores_incomplete="guessing yes" ;; *) gl_cv_func_mbrtowc_stores_incomplete="guessing no" ;; esac case "$host_os" in mingw*) if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include /* Tru64 with Desktop Toolkit C has a bug: must be included before . BSD/OS 4.0.1 has a bug: , and must be included before . */ #include #include #include #include int main () { int result = 0; if (setlocale (LC_ALL, "French_France.65001") != NULL) { wchar_t wc = (wchar_t) 0xBADFACE; mbstate_t state; memset (&state, '\0', sizeof (mbstate_t)); if (mbrtowc (&wc, "\303", 1, &state) == (size_t)(-2) && wc != (wchar_t) 0xBADFACE) result |= 1; } if (setlocale (LC_ALL, "Japanese_Japan.932") != NULL) { wchar_t wc = (wchar_t) 0xBADFACE; mbstate_t state; memset (&state, '\0', sizeof (mbstate_t)); if (mbrtowc (&wc, "\226", 1, &state) == (size_t)(-2) && wc != (wchar_t) 0xBADFACE) result |= 2; } if (setlocale (LC_ALL, "Chinese_Taiwan.950") != NULL) { wchar_t wc = (wchar_t) 0xBADFACE; mbstate_t state; memset (&state, '\0', sizeof (mbstate_t)); if (mbrtowc (&wc, "\245", 1, &state) == (size_t)(-2) && wc != (wchar_t) 0xBADFACE) result |= 4; } if (setlocale (LC_ALL, "Chinese_China.936") != NULL) { wchar_t wc = (wchar_t) 0xBADFACE; mbstate_t state; memset (&state, '\0', sizeof (mbstate_t)); if (mbrtowc (&wc, "\261", 1, &state) == (size_t)(-2) && wc != (wchar_t) 0xBADFACE) result |= 8; } return result; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : gl_cv_func_mbrtowc_stores_incomplete=no else gl_cv_func_mbrtowc_stores_incomplete=yes fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi ;; *) if test $LOCALE_FR_UTF8 != none; then if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include /* Tru64 with Desktop Toolkit C has a bug: must be included before . BSD/OS 4.0.1 has a bug: , and must be included before . */ #include #include #include #include int main () { if (setlocale (LC_ALL, "$LOCALE_FR_UTF8") != NULL) { wchar_t wc = (wchar_t) 0xBADFACE; mbstate_t state; memset (&state, '\0', sizeof (mbstate_t)); if (mbrtowc (&wc, "\303", 1, &state) == (size_t)(-2) && wc != (wchar_t) 0xBADFACE) return 1; } return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : gl_cv_func_mbrtowc_stores_incomplete=no else gl_cv_func_mbrtowc_stores_incomplete=yes fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_mbrtowc_stores_incomplete" >&5 $as_echo "$gl_cv_func_mbrtowc_stores_incomplete" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether mbrtowc works on empty input" >&5 $as_echo_n "checking whether mbrtowc works on empty input... " >&6; } if ${gl_cv_func_mbrtowc_empty_input+:} false; then : $as_echo_n "(cached) " >&6 else case "$host_os" in # Guess no on AIX and glibc systems. aix* | *-gnu* | gnu*) gl_cv_func_mbrtowc_empty_input="guessing no" ;; # Guess yes on native Windows. mingw*) gl_cv_func_mbrtowc_empty_input="guessing yes" ;; *) gl_cv_func_mbrtowc_empty_input="guessing yes" ;; esac if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include static wchar_t wc; static mbstate_t mbs; int main (void) { return mbrtowc (&wc, "", 0, &mbs) != (size_t) -2; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : gl_cv_func_mbrtowc_empty_input=yes else gl_cv_func_mbrtowc_empty_input=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_mbrtowc_empty_input" >&5 $as_echo "$gl_cv_func_mbrtowc_empty_input" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C locale is free of encoding errors" >&5 $as_echo_n "checking whether the C locale is free of encoding errors... " >&6; } if ${gl_cv_func_mbrtowc_C_locale_sans_EILSEQ+:} false; then : $as_echo_n "(cached) " >&6 else gl_cv_func_mbrtowc_C_locale_sans_EILSEQ="$gl_cross_guess_normal" if test "$cross_compiling" = yes; then : case "$host_os" in # Guess yes on native Windows. mingw*) gl_cv_func_mbrtowc_C_locale_sans_EILSEQ="guessing yes" ;; esac else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include int main () { int i; char *locale = setlocale (LC_ALL, "C"); if (! locale) return 2; for (i = CHAR_MIN; i <= CHAR_MAX; i++) { char c = i; wchar_t wc; mbstate_t mbs = { 0, }; size_t ss = mbrtowc (&wc, &c, 1, &mbs); if (1 < ss) return 3; } return 0; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : gl_cv_func_mbrtowc_C_locale_sans_EILSEQ=yes else gl_cv_func_mbrtowc_C_locale_sans_EILSEQ=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_mbrtowc_C_locale_sans_EILSEQ" >&5 $as_echo "$gl_cv_func_mbrtowc_C_locale_sans_EILSEQ" >&6; } case "$gl_cv_func_mbrtowc_null_arg1" in *yes) ;; *) $as_echo "#define MBRTOWC_NULL_ARG1_BUG 1" >>confdefs.h REPLACE_MBRTOWC=1 ;; esac case "$gl_cv_func_mbrtowc_null_arg2" in *yes) ;; *) $as_echo "#define MBRTOWC_NULL_ARG2_BUG 1" >>confdefs.h REPLACE_MBRTOWC=1 ;; esac case "$gl_cv_func_mbrtowc_retval" in *yes) ;; *) $as_echo "#define MBRTOWC_RETVAL_BUG 1" >>confdefs.h REPLACE_MBRTOWC=1 ;; esac case "$gl_cv_func_mbrtowc_nul_retval" in *yes) ;; *) $as_echo "#define MBRTOWC_NUL_RETVAL_BUG 1" >>confdefs.h REPLACE_MBRTOWC=1 ;; esac case "$gl_cv_func_mbrtowc_stores_incomplete" in *no) ;; *) $as_echo "#define MBRTOWC_STORES_INCOMPLETE_BUG 1" >>confdefs.h REPLACE_MBRTOWC=1 ;; esac case "$gl_cv_func_mbrtowc_empty_input" in *yes) ;; *) $as_echo "#define MBRTOWC_EMPTY_INPUT_BUG 1" >>confdefs.h REPLACE_MBRTOWC=1 ;; esac case "$gl_cv_func_mbrtowc_C_locale_sans_EILSEQ" in *yes) ;; *) $as_echo "#define MBRTOWC_IN_C_LOCALE_MAYBE_EILSEQ 1" >>confdefs.h REPLACE_MBRTOWC=1 ;; esac fi fi if test $REPLACE_MBSTATE_T = 1; then case "$host_os" in mingw*) LIB_MBRTOWC= ;; *) { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether imported symbols can be declared weak" >&5 $as_echo_n "checking whether imported symbols can be declared weak... " >&6; } if ${gl_cv_have_weak+:} false; then : $as_echo_n "(cached) " >&6 else gl_cv_have_weak=no cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ extern void xyzzy (); #pragma weak xyzzy int main () { xyzzy(); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : gl_cv_have_weak=maybe fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test $gl_cv_have_weak = maybe; then if test "$cross_compiling" = yes; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __ELF__ Extensible Linking Format #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "Extensible Linking Format" >/dev/null 2>&1; then : gl_cv_have_weak="guessing yes" else gl_cv_have_weak="guessing no" fi rm -f conftest* else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #pragma weak fputs int main () { return (fputs == NULL); } _ACEOF if ac_fn_c_try_run "$LINENO"; then : gl_cv_have_weak=yes else gl_cv_have_weak=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi case " $LDFLAGS " in *" -static "*) gl_cv_have_weak=no ;; esac case "$gl_cv_have_weak" in *yes) case "$host_os" in freebsd* | dragonfly*) : > conftest1.c $CC $CPPFLAGS $CFLAGS $LDFLAGS -fPIC -shared -o libempty.so conftest1.c -lpthread >&5 2>&1 cat < conftest2.c #include #pragma weak pthread_mutexattr_gettype int main () { return (pthread_mutexattr_gettype != NULL); } EOF $CC $CPPFLAGS $CFLAGS $LDFLAGS -o conftest conftest2.c libempty.so >&5 2>&1 \ || gl_cv_have_weak=no rm -f conftest1.c libempty.so conftest2.c conftest ;; esac ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_have_weak" >&5 $as_echo "$gl_cv_have_weak" >&6; } case "$gl_cv_have_weak" in *yes) $as_echo "#define HAVE_WEAK_SYMBOLS 1" >>confdefs.h ;; esac case "$gl_cv_have_weak" in *yes) LIB_MBRTOWC= ;; *) LIB_MBRTOWC="$LIBPTHREAD" ;; esac ;; esac else LIB_MBRTOWC= fi if test $HAVE_MBRTOWC = 0 || test $REPLACE_MBRTOWC = 1; then gl_LIBOBJS="$gl_LIBOBJS mbrtowc.$ac_objext" if test $REPLACE_MBSTATE_T = 1; then gl_LIBOBJS="$gl_LIBOBJS lc-charset-dispatch.$ac_objext" gl_LIBOBJS="$gl_LIBOBJS mbtowc-lock.$ac_objext" CFLAG_VISIBILITY= HAVE_VISIBILITY=0 if test -n "$GCC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the -Werror option is usable" >&5 $as_echo_n "checking whether the -Werror option is usable... " >&6; } if ${gl_cv_cc_vis_werror+:} false; then : $as_echo_n "(cached) " >&6 else gl_save_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -Werror" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : gl_cv_cc_vis_werror=yes else gl_cv_cc_vis_werror=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext CFLAGS="$gl_save_CFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_cc_vis_werror" >&5 $as_echo "$gl_cv_cc_vis_werror" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for simple visibility declarations" >&5 $as_echo_n "checking for simple visibility declarations... " >&6; } if ${gl_cv_cc_visibility+:} false; then : $as_echo_n "(cached) " >&6 else gl_save_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -fvisibility=hidden" if test $gl_cv_cc_vis_werror = yes; then CFLAGS="$CFLAGS -Werror" fi cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ extern __attribute__((__visibility__("hidden"))) int hiddenvar; extern __attribute__((__visibility__("default"))) int exportedvar; extern __attribute__((__visibility__("hidden"))) int hiddenfunc (void); extern __attribute__((__visibility__("default"))) int exportedfunc (void); void dummyfunc (void) {} int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : gl_cv_cc_visibility=yes else gl_cv_cc_visibility=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext CFLAGS="$gl_save_CFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_cc_visibility" >&5 $as_echo "$gl_cv_cc_visibility" >&6; } if test $gl_cv_cc_visibility = yes; then CFLAG_VISIBILITY="-fvisibility=hidden" HAVE_VISIBILITY=1 fi fi cat >>confdefs.h <<_ACEOF #define HAVE_VISIBILITY $HAVE_VISIBILITY _ACEOF fi : fi GNULIB_MBRTOWC=1 $as_echo "#define GNULIB_TEST_MBRTOWC 1" >>confdefs.h if case "$host_os" in mingw*) true ;; *) test $ac_cv_func_mbsinit = yes ;; esac \ && test $ac_cv_func_mbrtowc = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether mbrtowc handles incomplete characters" >&5 $as_echo_n "checking whether mbrtowc handles incomplete characters... " >&6; } if ${gl_cv_func_mbrtowc_incomplete_state+:} false; then : $as_echo_n "(cached) " >&6 else case "$host_os" in # Guess no on AIX and OSF/1. aix* | osf*) gl_cv_func_mbrtowc_incomplete_state="guessing no" ;; # Guess yes otherwise. *) gl_cv_func_mbrtowc_incomplete_state="guessing yes" ;; esac if test $LOCALE_JA != none; then if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include /* Tru64 with Desktop Toolkit C has a bug: must be included before . BSD/OS 4.0.1 has a bug: , and must be included before . */ #include #include #include #include int main () { if (setlocale (LC_ALL, "$LOCALE_JA") != NULL) { const char input[] = "B\217\253\344\217\251\316er"; /* "Büßer" */ mbstate_t state; wchar_t wc; memset (&state, '\0', sizeof (mbstate_t)); if (mbrtowc (&wc, input + 1, 1, &state) == (size_t)(-2)) if (mbsinit (&state)) return 2; } return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : gl_cv_func_mbrtowc_incomplete_state=yes else gl_cv_func_mbrtowc_incomplete_state=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi else if test $LOCALE_FR_UTF8 != none; then if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include /* Tru64 with Desktop Toolkit C has a bug: must be included before . BSD/OS 4.0.1 has a bug: , and must be included before . */ #include #include #include #include int main () { if (setlocale (LC_ALL, "$LOCALE_FR_UTF8") != NULL) { const char input[] = "B\303\274\303\237er"; /* "Büßer" */ mbstate_t state; wchar_t wc; memset (&state, '\0', sizeof (mbstate_t)); if (mbrtowc (&wc, input + 1, 1, &state) == (size_t)(-2)) if (mbsinit (&state)) return 2; } return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : gl_cv_func_mbrtowc_incomplete_state=yes else gl_cv_func_mbrtowc_incomplete_state=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_mbrtowc_incomplete_state" >&5 $as_echo "$gl_cv_func_mbrtowc_incomplete_state" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether mbrtowc works as well as mbtowc" >&5 $as_echo_n "checking whether mbrtowc works as well as mbtowc... " >&6; } if ${gl_cv_func_mbrtowc_sanitycheck+:} false; then : $as_echo_n "(cached) " >&6 else case "$host_os" in # Guess no on Solaris 8. solaris2.8) gl_cv_func_mbrtowc_sanitycheck="guessing no" ;; # Guess yes otherwise. *) gl_cv_func_mbrtowc_sanitycheck="guessing yes" ;; esac if test $LOCALE_ZH_CN != none; then if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include /* Tru64 with Desktop Toolkit C has a bug: must be included before . BSD/OS 4.0.1 has a bug: , and must be included before . */ #include #include #include #include int main () { /* This fails on Solaris 8: mbrtowc returns 2, and sets wc to 0x00F0. mbtowc returns 4 (correct) and sets wc to 0x5EDC. */ if (setlocale (LC_ALL, "$LOCALE_ZH_CN") != NULL) { char input[] = "B\250\271\201\060\211\070er"; /* "Büßer" */ mbstate_t state; wchar_t wc; memset (&state, '\0', sizeof (mbstate_t)); if (mbrtowc (&wc, input + 3, 6, &state) != 4 && mbtowc (&wc, input + 3, 6) == 4) return 2; } return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : gl_cv_func_mbrtowc_sanitycheck=yes else gl_cv_func_mbrtowc_sanitycheck=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_mbrtowc_sanitycheck" >&5 $as_echo "$gl_cv_func_mbrtowc_sanitycheck" >&6; } REPLACE_MBSTATE_T=0 case "$gl_cv_func_mbrtowc_incomplete_state" in *yes) ;; *) REPLACE_MBSTATE_T=1 ;; esac case "$gl_cv_func_mbrtowc_sanitycheck" in *yes) ;; *) REPLACE_MBSTATE_T=1 ;; esac else REPLACE_MBSTATE_T=1 fi if test $ac_cv_func_mbsinit = no; then HAVE_MBSINIT=0 ac_fn_c_check_decl "$LINENO" "mbsinit" "ac_cv_have_decl_mbsinit" " /* Tru64 with Desktop Toolkit C has a bug: must be included before . BSD/OS 4.0.1 has a bug: , and must be included before . */ #include #include #include #include " if test "x$ac_cv_have_decl_mbsinit" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_MBSINIT $ac_have_decl _ACEOF if test $ac_cv_have_decl_mbsinit = yes; then REPLACE_MBSINIT=1 fi else if test $REPLACE_MBSTATE_T = 1; then REPLACE_MBSINIT=1 else case "$host_os" in mingw*) REPLACE_MBSINIT=1 ;; esac fi fi if test $HAVE_MBSINIT = 0 || test $REPLACE_MBSINIT = 1; then gl_LIBOBJS="$gl_LIBOBJS mbsinit.$ac_objext" : fi GNULIB_MBSINIT=1 $as_echo "#define GNULIB_TEST_MBSINIT 1" >>confdefs.h for ac_func in mbtowc do : ac_fn_c_check_func "$LINENO" "mbtowc" "ac_cv_func_mbtowc" if test "x$ac_cv_func_mbtowc" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_MBTOWC 1 _ACEOF fi done if test $ac_cv_func_mbtowc = no; then HAVE_MBTOWC=0 else if false; then REPLACE_MBTOWC=1 fi fi if test $HAVE_MBTOWC = 0 || test $REPLACE_MBTOWC = 1; then gl_LIBOBJS="$gl_LIBOBJS mbtowc.$ac_objext" : fi GNULIB_MBTOWC=1 $as_echo "#define GNULIB_TEST_MBTOWC 1" >>confdefs.h : if test $REPLACE_MEMCHR = 1; then gl_LIBOBJS="$gl_LIBOBJS memchr.$ac_objext" for ac_header in bp-sym.h do : ac_fn_c_check_header_mongrel "$LINENO" "bp-sym.h" "ac_cv_header_bp_sym_h" "$ac_includes_default" if test "x$ac_cv_header_bp_sym_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_BP_SYM_H 1 _ACEOF fi done fi GNULIB_MEMCHR=1 $as_echo "#define GNULIB_TEST_MEMCHR 1" >>confdefs.h if test $HAVE_DECL_MEMMEM = 1 && test $REPLACE_MEMMEM = 0; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether memmem works in linear time" >&5 $as_echo_n "checking whether memmem works in linear time... " >&6; } if ${gl_cv_func_memmem_works_fast+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #ifdef __GNU_LIBRARY__ #if ((__GLIBC__ == 2 && __GLIBC_MINOR__ >= 9) || (__GLIBC__ > 2)) \ && !defined __UCLIBC__ Lucky user #endif #endif #ifdef __CYGWIN__ #include #if CYGWIN_VERSION_DLL_COMBINED > CYGWIN_VERSION_DLL_MAKE_COMBINED (1007, 0) Lucky user #endif #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "Lucky user" >/dev/null 2>&1; then : gl_cv_func_memmem_works_fast="guessing yes" else gl_cv_func_memmem_works_fast="$gl_cross_guess_normal" fi rm -f conftest* else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include /* for signal */ #include /* for memmem */ #include /* for malloc */ #include /* for alarm */ static void quit (int sig) { _exit (sig + 128); } int main () { int result = 0; size_t m = 1000000; char *haystack = (char *) malloc (2 * m + 1); char *needle = (char *) malloc (m + 1); /* Failure to compile this test due to missing alarm is okay, since all such platforms (mingw) also lack memmem. */ signal (SIGALRM, quit); alarm (5); /* Check for quadratic performance. */ if (haystack && needle) { memset (haystack, 'A', 2 * m); haystack[2 * m] = 'B'; memset (needle, 'A', m); needle[m] = 'B'; if (!memmem (haystack, 2 * m + 1, needle, m + 1)) result |= 1; } /* Free allocated memory, in case some sanitizer is watching. */ free (haystack); free (needle); return result; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : gl_cv_func_memmem_works_fast=yes else gl_cv_func_memmem_works_fast=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_memmem_works_fast" >&5 $as_echo "$gl_cv_func_memmem_works_fast" >&6; } case "$gl_cv_func_memmem_works_fast" in *yes) ;; *) REPLACE_MEMMEM=1 ;; esac fi if test $HAVE_MEMMEM = 0 || test $REPLACE_MEMMEM = 1; then gl_LIBOBJS="$gl_LIBOBJS memmem.$ac_objext" fi for ac_func in memmem do : ac_fn_c_check_func "$LINENO" "memmem" "ac_cv_func_memmem" if test "x$ac_cv_func_memmem" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_MEMMEM 1 _ACEOF fi done if test $ac_cv_func_memmem = yes; then HAVE_MEMMEM=1 else HAVE_MEMMEM=0 fi if test $ac_cv_have_decl_memmem = no; then HAVE_DECL_MEMMEM=0 else { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether memmem works" >&5 $as_echo_n "checking whether memmem works... " >&6; } if ${gl_cv_func_memmem_works_always+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __GNU_LIBRARY__ #include #if ((__GLIBC__ == 2 && ((__GLIBC_MINOR > 0 && __GLIBC_MINOR__ < 9) \ || __GLIBC_MINOR__ > 12)) \ || (__GLIBC__ > 2)) \ || defined __UCLIBC__ Lucky user #endif #elif defined __CYGWIN__ #include #if CYGWIN_VERSION_DLL_COMBINED > CYGWIN_VERSION_DLL_MAKE_COMBINED (1007, 7) Lucky user #endif #else Lucky user #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "Lucky user" >/dev/null 2>&1; then : gl_cv_func_memmem_works_always="guessing yes" else gl_cv_func_memmem_works_always="$gl_cross_guess_normal" fi rm -f conftest* else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include /* for memmem */ #define P "_EF_BF_BD" #define HAYSTACK "F_BD_CE_BD" P P P P "_C3_88_20" P P P "_C3_A7_20" P #define NEEDLE P P P P P int main () { int result = 0; if (memmem (HAYSTACK, strlen (HAYSTACK), NEEDLE, strlen (NEEDLE))) result |= 1; /* Check for empty needle behavior. */ { const char *haystack = "AAA"; if (memmem (haystack, 3, (const char *) 1, 0) != haystack) result |= 2; } return result; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : gl_cv_func_memmem_works_always=yes else gl_cv_func_memmem_works_always=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_memmem_works_always" >&5 $as_echo "$gl_cv_func_memmem_works_always" >&6; } case "$gl_cv_func_memmem_works_always" in *yes) ;; *) REPLACE_MEMMEM=1 ;; esac fi : if test $HAVE_MEMMEM = 0 || test $REPLACE_MEMMEM = 1; then gl_LIBOBJS="$gl_LIBOBJS memmem.$ac_objext" fi GNULIB_MEMMEM=1 $as_echo "#define GNULIB_TEST_MEMMEM 1" >>confdefs.h for ac_func in mempcpy do : ac_fn_c_check_func "$LINENO" "mempcpy" "ac_cv_func_mempcpy" if test "x$ac_cv_func_mempcpy" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_MEMPCPY 1 _ACEOF fi done if test $ac_cv_func_mempcpy = no; then HAVE_MEMPCPY=0 fi if test $HAVE_MEMPCPY = 0; then gl_LIBOBJS="$gl_LIBOBJS mempcpy.$ac_objext" : fi GNULIB_MEMPCPY=1 $as_echo "#define GNULIB_TEST_MEMPCPY 1" >>confdefs.h if test $ac_cv_have_decl_memrchr = no; then HAVE_DECL_MEMRCHR=0 fi for ac_func in memrchr do : ac_fn_c_check_func "$LINENO" "memrchr" "ac_cv_func_memrchr" if test "x$ac_cv_func_memrchr" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_MEMRCHR 1 _ACEOF fi done if test $ac_cv_func_memrchr = no; then gl_LIBOBJS="$gl_LIBOBJS memrchr.$ac_objext" : fi GNULIB_MEMRCHR=1 $as_echo "#define GNULIB_TEST_MEMRCHR 1" >>confdefs.h { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether mkdir handles trailing slash" >&5 $as_echo_n "checking whether mkdir handles trailing slash... " >&6; } if ${gl_cv_func_mkdir_trailing_slash_works+:} false; then : $as_echo_n "(cached) " >&6 else rm -rf conftest.dir if test "$cross_compiling" = yes; then : case "$host_os" in # Guess yes on Linux systems. linux-* | linux) gl_cv_func_mkdir_trailing_slash_works="guessing yes" ;; # Guess yes on glibc systems. *-gnu* | gnu*) gl_cv_func_mkdir_trailing_slash_works="guessing yes" ;; # Guess yes on MSVC, no on mingw. mingw*) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef _MSC_VER Known #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "Known" >/dev/null 2>&1; then : gl_cv_func_mkdir_trailing_slash_works="guessing yes" else gl_cv_func_mkdir_trailing_slash_works="guessing no" fi rm -f conftest* ;; # If we don't know, obey --enable-cross-guesses. *) gl_cv_func_mkdir_trailing_slash_works="$gl_cross_guess_normal" ;; esac else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ # include # include int main () { return mkdir ("conftest.dir/", 0700); ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : gl_cv_func_mkdir_trailing_slash_works=yes else gl_cv_func_mkdir_trailing_slash_works=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi rm -rf conftest.dir fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_mkdir_trailing_slash_works" >&5 $as_echo "$gl_cv_func_mkdir_trailing_slash_works" >&6; } case "$gl_cv_func_mkdir_trailing_slash_works" in *yes) ;; *) REPLACE_MKDIR=1 ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether mkdir handles trailing dot" >&5 $as_echo_n "checking whether mkdir handles trailing dot... " >&6; } if ${gl_cv_func_mkdir_trailing_dot_works+:} false; then : $as_echo_n "(cached) " >&6 else rm -rf conftest.dir if test "$cross_compiling" = yes; then : case "$host_os" in # Guess yes on glibc systems. *-gnu* | gnu*) gl_cv_func_mkdir_trailing_dot_works="guessing yes" ;; # Guess yes on musl systems. *-musl*) gl_cv_func_mkdir_trailing_dot_works="guessing yes" ;; # Guess no on native Windows. mingw*) gl_cv_func_mkdir_trailing_dot_works="guessing no" ;; # If we don't know, obey --enable-cross-guesses. *) gl_cv_func_mkdir_trailing_dot_works="$gl_cross_guess_normal" ;; esac else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ # include # include int main () { return !mkdir ("conftest.dir/./", 0700); ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : gl_cv_func_mkdir_trailing_dot_works=yes else gl_cv_func_mkdir_trailing_dot_works=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi rm -rf conftest.dir fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_mkdir_trailing_dot_works" >&5 $as_echo "$gl_cv_func_mkdir_trailing_dot_works" >&6; } case "$gl_cv_func_mkdir_trailing_dot_works" in *yes) ;; *) REPLACE_MKDIR=1 $as_echo "#define FUNC_MKDIR_DOT_BUG 1" >>confdefs.h ;; esac if test $REPLACE_MKDIR = 1; then gl_LIBOBJS="$gl_LIBOBJS mkdir.$ac_objext" fi for ac_func in mkdtemp do : ac_fn_c_check_func "$LINENO" "mkdtemp" "ac_cv_func_mkdtemp" if test "x$ac_cv_func_mkdtemp" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_MKDTEMP 1 _ACEOF fi done if test $ac_cv_func_mkdtemp = no; then HAVE_MKDTEMP=0 fi if test $HAVE_MKDTEMP = 0; then gl_LIBOBJS="$gl_LIBOBJS mkdtemp.$ac_objext" : fi GNULIB_MKDTEMP=1 $as_echo "#define GNULIB_TEST_MKDTEMP 1" >>confdefs.h if test $ac_cv_func_mkstemp = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working mkstemp" >&5 $as_echo_n "checking for working mkstemp... " >&6; } if ${gl_cv_func_working_mkstemp+:} false; then : $as_echo_n "(cached) " >&6 else mkdir conftest.mkstemp if test "$cross_compiling" = yes; then : case "$host_os" in # Guess yes on glibc systems. *-gnu* | gnu*) gl_cv_func_working_mkstemp="guessing yes" ;; # Guess yes on musl systems. *-musl*) gl_cv_func_working_mkstemp="guessing yes" ;; # Guess no on native Windows. mingw*) gl_cv_func_working_mkstemp="guessing no" ;; # If we don't know, obey --enable-cross-guesses. *) gl_cv_func_working_mkstemp="$gl_cross_guess_normal" ;; esac else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { int result = 0; int i; off_t large = (off_t) 4294967295u; if (large < 0) large = 2147483647; umask (0); for (i = 0; i < 70; i++) { char templ[] = "conftest.mkstemp/coXXXXXX"; int (*mkstemp_function) (char *) = mkstemp; int fd = mkstemp_function (templ); if (fd < 0) result |= 1; else { struct stat st; if (lseek (fd, large, SEEK_SET) != large) result |= 2; if (fstat (fd, &st) < 0) result |= 4; else if (st.st_mode & 0077) result |= 8; if (close (fd)) result |= 16; } } return result; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : gl_cv_func_working_mkstemp=yes else gl_cv_func_working_mkstemp=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi rm -rf conftest.mkstemp fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_working_mkstemp" >&5 $as_echo "$gl_cv_func_working_mkstemp" >&6; } case "$gl_cv_func_working_mkstemp" in *yes) ;; *) REPLACE_MKSTEMP=1 ;; esac else HAVE_MKSTEMP=0 fi if test $HAVE_MKSTEMP = 0 || test $REPLACE_MKSTEMP = 1; then gl_LIBOBJS="$gl_LIBOBJS mkstemp.$ac_objext" fi GNULIB_MKSTEMP=1 $as_echo "#define GNULIB_TEST_MKSTEMP 1" >>confdefs.h REPLACE_MKTIME=0 if test "$gl_cv_func_working_mktime" != yes; then REPLACE_MKTIME=1 $as_echo "#define NEED_MKTIME_WORKING 1" >>confdefs.h fi case "$host_os" in mingw*) REPLACE_MKTIME=1 $as_echo "#define NEED_MKTIME_WINDOWS 1" >>confdefs.h ;; esac if test $REPLACE_MKTIME = 1; then gl_LIBOBJS="$gl_LIBOBJS mktime.$ac_objext" : fi GNULIB_MKTIME=1 $as_echo "#define GNULIB_TEST_MKTIME 1" >>confdefs.h WANT_MKTIME_INTERNAL=0 ac_fn_c_check_func "$LINENO" "__mktime_internal" "ac_cv_func___mktime_internal" if test "x$ac_cv_func___mktime_internal" = xyes; then : $as_echo "#define mktime_internal __mktime_internal" >>confdefs.h else WANT_MKTIME_INTERNAL=1 $as_echo "#define NEED_MKTIME_INTERNAL 1" >>confdefs.h fi if test $WANT_MKTIME_INTERNAL = 1; then gl_LIBOBJS="$gl_LIBOBJS mktime.$ac_objext" : fi if test $HAVE_MSVC_INVALID_PARAMETER_HANDLER = 1; then gl_LIBOBJS="$gl_LIBOBJS msvc-inval.$ac_objext" fi if test $HAVE_MSVC_INVALID_PARAMETER_HANDLER = 1; then gl_LIBOBJS="$gl_LIBOBJS msvc-nothrow.$ac_objext" fi cat >>confdefs.h <<_ACEOF #define GNULIB_MSVC_NOTHROW 1 _ACEOF if test $ac_cv_func_nl_langinfo = yes; then # On Irix 6.5, YESEXPR is defined, but nl_langinfo(YESEXPR) is broken. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether YESEXPR works" >&5 $as_echo_n "checking whether YESEXPR works... " >&6; } if ${gl_cv_func_nl_langinfo_yesexpr_works+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : case "$host_os" in # Guess no on irix systems. irix*) gl_cv_func_nl_langinfo_yesexpr_works="guessing no";; # Guess yes elsewhere. *) gl_cv_func_nl_langinfo_yesexpr_works="guessing yes";; esac else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { return !*nl_langinfo(YESEXPR); ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : gl_cv_func_nl_langinfo_yesexpr_works=yes else gl_cv_func_nl_langinfo_yesexpr_works=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_nl_langinfo_yesexpr_works" >&5 $as_echo "$gl_cv_func_nl_langinfo_yesexpr_works" >&6; } case $gl_cv_func_nl_langinfo_yesexpr_works in *yes) FUNC_NL_LANGINFO_YESEXPR_WORKS=1 ;; *) FUNC_NL_LANGINFO_YESEXPR_WORKS=0 ;; esac cat >>confdefs.h <<_ACEOF #define FUNC_NL_LANGINFO_YESEXPR_WORKS $FUNC_NL_LANGINFO_YESEXPR_WORKS _ACEOF if test $HAVE_LANGINFO_CODESET = 1 \ && test $HAVE_LANGINFO_T_FMT_AMPM = 1 \ && test $HAVE_LANGINFO_ALTMON = 1 \ && test $HAVE_LANGINFO_ERA = 1 \ && test $FUNC_NL_LANGINFO_YESEXPR_WORKS = 1; then : else REPLACE_NL_LANGINFO=1 $as_echo "#define REPLACE_NL_LANGINFO 1" >>confdefs.h fi else HAVE_NL_LANGINFO=0 fi if test $HAVE_NL_LANGINFO = 0 || test $HAVE_LANGINFO_CODESET = 0; then LIB_NL_LANGINFO="$LIB_SETLOCALE_NULL" else LIB_NL_LANGINFO= fi if test $HAVE_NL_LANGINFO = 0 || test $REPLACE_NL_LANGINFO = 1; then gl_LIBOBJS="$gl_LIBOBJS nl_langinfo.$ac_objext" fi GNULIB_NL_LANGINFO=1 $as_echo "#define GNULIB_TEST_NL_LANGINFO 1" >>confdefs.h # This defines (or not) HAVE_TZNAME and HAVE_TM_ZONE. $as_echo "#define my_strftime nstrftime" >>confdefs.h case "$host_os" in mingw* | pw*) REPLACE_OPEN=1 ;; *) if test "$gl_cv_macro_O_CLOEXEC" != yes; then REPLACE_OPEN=1 fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether open recognizes a trailing slash" >&5 $as_echo_n "checking whether open recognizes a trailing slash... " >&6; } if ${gl_cv_func_open_slash+:} false; then : $as_echo_n "(cached) " >&6 else # Assume that if we have lstat, we can also check symlinks. if test $ac_cv_func_lstat = yes; then touch conftest.tmp ln -s conftest.tmp conftest.lnk fi if test "$cross_compiling" = yes; then : case "$host_os" in freebsd* | aix* | hpux* | solaris2.[0-9] | solaris2.[0-9].*) gl_cv_func_open_slash="guessing no" ;; *) gl_cv_func_open_slash="guessing yes" ;; esac else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #if HAVE_UNISTD_H # include #endif int main () { int result = 0; #if HAVE_LSTAT if (open ("conftest.lnk/", O_RDONLY) != -1) result |= 1; #endif if (open ("conftest.sl/", O_CREAT, 0600) >= 0) result |= 2; return result; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : gl_cv_func_open_slash=yes else gl_cv_func_open_slash=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi rm -f conftest.sl conftest.tmp conftest.lnk fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_open_slash" >&5 $as_echo "$gl_cv_func_open_slash" >&6; } case "$gl_cv_func_open_slash" in *no) $as_echo "#define OPEN_TRAILING_SLASH_BUG 1" >>confdefs.h ;; esac case "$gl_cv_func_open_slash" in *no) REPLACE_OPEN=1 ;; esac ;; esac if test $REPLACE_OPEN = 1; then gl_LIBOBJS="$gl_LIBOBJS open.$ac_objext" : fi GNULIB_OPEN=1 $as_echo "#define GNULIB_TEST_OPEN 1" >>confdefs.h if test $ac_cv_func_pipe2 != yes; then HAVE_PIPE2=0 fi GNULIB_PIPE2=1 $as_echo "#define GNULIB_TEST_PIPE2 1" >>confdefs.h if test $gl_cv_func_frexp_no_libm = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether frexp works" >&5 $as_echo_n "checking whether frexp works... " >&6; } if ${gl_cv_func_frexp_works+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : case "$host_os" in netbsd* | irix*) gl_cv_func_frexp_works="guessing no" ;; mingw*) # Guess yes with MSVC, no with mingw. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef _MSC_VER Good #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "Good" >/dev/null 2>&1; then : gl_cv_func_frexp_works="guessing yes" else gl_cv_func_frexp_works="guessing no" fi rm -f conftest* ;; *) gl_cv_func_frexp_works="guessing yes" ;; esac else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #if HAVE_DECL_ALARM # include # include #endif /* HP cc on HP-UX 10.20 has a bug with the constant expression -0.0. ICC 10.0 has a bug when optimizing the expression -zero. The expression -DBL_MIN * DBL_MIN does not work when cross-compiling to PowerPC on Mac OS X 10.5. */ #if defined __hpux || defined __sgi || defined __ICC static double compute_minus_zero (void) { return -DBL_MIN * DBL_MIN; } # define minus_zero compute_minus_zero () #else double minus_zero = -0.0; #endif int main() { int result = 0; int i; volatile double x; double zero = 0.0; #if HAVE_DECL_ALARM /* NeXTstep 3.3 frexp() runs into an endless loop when called on an infinite number. Let the test fail in this case. */ signal (SIGALRM, SIG_DFL); alarm (5); #endif /* Test on denormalized numbers. */ for (i = 1, x = 1.0; i >= DBL_MIN_EXP; i--, x *= 0.5) ; if (x > 0.0) { int exp; double y = frexp (x, &exp); /* On machines with IEEE754 arithmetic: x = 1.11254e-308, exp = -1022. On NetBSD: y = 0.75. Correct: y = 0.5. */ if (y != 0.5) result |= 1; } /* Test on infinite numbers. */ x = 1.0 / zero; { int exp; double y = frexp (x, &exp); if (y != x) result |= 2; } /* Test on negative zero. */ x = minus_zero; { int exp; double y = frexp (x, &exp); if (memcmp (&y, &x, sizeof x)) result |= 4; } return result; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : gl_cv_func_frexp_works=yes else gl_cv_func_frexp_works=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_frexp_works" >&5 $as_echo "$gl_cv_func_frexp_works" >&6; } case "$gl_cv_func_frexp_works" in *yes) $as_echo "#define HAVE_FREXP_IN_LIBC 1" >>confdefs.h ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ldexp can be used without linking with libm" >&5 $as_echo_n "checking whether ldexp can be used without linking with libm... " >&6; } if ${gl_cv_func_ldexp_no_libm+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include double x; int y; int main () { return ldexp (x, y) < 1; ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : gl_cv_func_ldexp_no_libm=yes else gl_cv_func_ldexp_no_libm=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_ldexp_no_libm" >&5 $as_echo "$gl_cv_func_ldexp_no_libm" >&6; } if test $gl_cv_func_ldexp_no_libm = yes; then $as_echo "#define HAVE_LDEXP_IN_LIBC 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether frexpl() can be used without linking with libm" >&5 $as_echo_n "checking whether frexpl() can be used without linking with libm... " >&6; } if ${gl_cv_func_frexpl_no_libm+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include long double x; int main () { int e; return frexpl (x, &e) > 0; ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : gl_cv_func_frexpl_no_libm=yes else gl_cv_func_frexpl_no_libm=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_frexpl_no_libm" >&5 $as_echo "$gl_cv_func_frexpl_no_libm" >&6; } if test $gl_cv_func_frexpl_no_libm = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether frexpl works" >&5 $as_echo_n "checking whether frexpl works... " >&6; } if ${gl_cv_func_frexpl_works+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : case "$host_os" in aix | aix[3-6]* | beos* | darwin* | irix* | mingw* | pw*) gl_cv_func_frexpl_works="guessing no";; *) gl_cv_func_frexpl_works="guessing yes";; esac else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include /* Override the values of , like done in float.in.h. */ #if defined __i386__ && (defined __BEOS__ || defined __OpenBSD__) # undef LDBL_MIN_EXP # define LDBL_MIN_EXP (-16381) #endif #if defined __i386__ && (defined __FreeBSD__ || defined __DragonFly__) # undef LDBL_MIN_EXP # define LDBL_MIN_EXP (-16381) #endif #if (defined _ARCH_PPC || defined _POWER) && defined _AIX && (LDBL_MANT_DIG == 106) && defined __GNUC__ # undef LDBL_MIN_EXP # define LDBL_MIN_EXP DBL_MIN_EXP #endif #if defined __sgi && (LDBL_MANT_DIG >= 106) # if defined __GNUC__ # undef LDBL_MIN_EXP # define LDBL_MIN_EXP DBL_MIN_EXP # endif #endif extern #ifdef __cplusplus "C" #endif long double frexpl (long double, int *); int main() { int result = 0; volatile long double x; /* Test on finite numbers that fails on AIX 5.1. */ x = 16.0L; { int exp = -9999; frexpl (x, &exp); if (exp != 5) result |= 1; } /* Test on finite numbers that fails on Mac OS X 10.4, because its frexpl function returns an invalid (incorrectly normalized) value: it returns y = { 0x3fe028f5, 0xc28f5c28, 0x3c9eb851, 0xeb851eb8 } but the correct result is 0.505L = { 0x3fe028f5, 0xc28f5c29, 0xbc547ae1, 0x47ae1480 } */ x = 1.01L; { int exp = -9999; long double y = frexpl (x, &exp); if (!(exp == 1 && y == 0.505L)) result |= 2; } /* Test on large finite numbers. This fails on BeOS at i = 16322, while LDBL_MAX_EXP = 16384. In the loop end test, we test x against Infinity, rather than comparing i with LDBL_MAX_EXP, because BeOS has a wrong LDBL_MAX_EXP. */ { int i; for (i = 1, x = 1.0L; x != x + x; i++, x *= 2.0L) { int exp = -9999; frexpl (x, &exp); if (exp != i) { result |= 4; break; } } } /* Test on denormalized numbers. */ { int i; for (i = 1, x = 1.0L; i >= LDBL_MIN_EXP; i--, x *= 0.5L) ; if (x > 0.0L) { int exp; long double y = frexpl (x, &exp); /* On machines with IEEE854 arithmetic: x = 1.68105e-4932, exp = -16382, y = 0.5. On Mac OS X 10.5: exp = -16384, y = 0.5. */ if (exp != LDBL_MIN_EXP - 1) result |= 8; } } /* Test on infinite numbers. */ x = 1.0L / 0.0L; { int exp; long double y = frexpl (x, &exp); if (y != x) result |= 16; } return result; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : gl_cv_func_frexpl_works=yes else gl_cv_func_frexpl_works=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_frexpl_works" >&5 $as_echo "$gl_cv_func_frexpl_works" >&6; } case "$gl_cv_func_frexpl_works" in *yes) gl_func_frexpl_no_libm=yes ;; *) gl_func_frexpl_no_libm=no; REPLACE_FREXPL=1 ;; esac else gl_func_frexpl_no_libm=no REPLACE_FREXPL=1 fi if test $gl_func_frexpl_no_libm = yes; then $as_echo "#define HAVE_FREXPL_IN_LIBC 1" >>confdefs.h ac_fn_c_check_decl "$LINENO" "frexpl" "ac_cv_have_decl_frexpl" "#include " if test "x$ac_cv_have_decl_frexpl" = xyes; then : else HAVE_DECL_FREXPL=0 fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ldexpl() can be used without linking with libm" >&5 $as_echo_n "checking whether ldexpl() can be used without linking with libm... " >&6; } if ${gl_cv_func_ldexpl_no_libm+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include long double x; int main () { return ldexpl (x, -1) > 0; ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : gl_cv_func_ldexpl_no_libm=yes else gl_cv_func_ldexpl_no_libm=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_ldexpl_no_libm" >&5 $as_echo "$gl_cv_func_ldexpl_no_libm" >&6; } if test $gl_cv_func_ldexpl_no_libm = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ldexpl works" >&5 $as_echo_n "checking whether ldexpl works... " >&6; } if ${gl_cv_func_ldexpl_works+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : case "$host_os" in aix | aix[3-6]*) gl_cv_func_ldexpl_works="guessing no" ;; # Guess yes on native Windows. mingw*) gl_cv_func_ldexpl_works="guessing yes" ;; *) gl_cv_func_ldexpl_works="guessing yes" ;; esac else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include extern #ifdef __cplusplus "C" #endif long double ldexpl (long double, int); int main() { int result = 0; { volatile long double x = 1.0; volatile long double y = ldexpl (x, -1); if (y != 0.5L) result |= 1; } { volatile long double x = 1.73205L; volatile long double y = ldexpl (x, 0); if (y != x) result |= 2; } return result; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : gl_cv_func_ldexpl_works=yes else gl_cv_func_ldexpl_works=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_ldexpl_works" >&5 $as_echo "$gl_cv_func_ldexpl_works" >&6; } case "$gl_cv_func_ldexpl_works" in *yes) $as_echo "#define HAVE_LDEXPL_IN_LIBC 1" >>confdefs.h ac_fn_c_check_decl "$LINENO" "ldexpl" "ac_cv_have_decl_ldexpl" "#include " if test "x$ac_cv_have_decl_ldexpl" = xyes; then : else HAVE_DECL_LDEXPL=0 fi ;; esac fi if test $gl_cv_func_vfprintf_posix = no; then gl_LIBOBJS="$gl_LIBOBJS printf.$ac_objext" REPLACE_PRINTF=1 $as_echo "#define REPLACE_PRINTF_POSIX 1" >>confdefs.h : fi GNULIB_PRINTF_POSIX=1 $as_echo "#define GNULIB_TEST_PRINTF_POSIX 1" >>confdefs.h ac_fn_c_check_decl "$LINENO" "program_invocation_name" "ac_cv_have_decl_program_invocation_name" "#include " if test "x$ac_cv_have_decl_program_invocation_name" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_PROGRAM_INVOCATION_NAME $ac_have_decl _ACEOF ac_fn_c_check_decl "$LINENO" "program_invocation_short_name" "ac_cv_have_decl_program_invocation_short_name" "#include " if test "x$ac_cv_have_decl_program_invocation_short_name" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_PROGRAM_INVOCATION_SHORT_NAME $ac_have_decl _ACEOF for ac_func in raise do : ac_fn_c_check_func "$LINENO" "raise" "ac_cv_func_raise" if test "x$ac_cv_func_raise" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_RAISE 1 _ACEOF fi done if test $ac_cv_func_raise = no; then HAVE_RAISE=0 else if test $HAVE_MSVC_INVALID_PARAMETER_HANDLER = 1; then REPLACE_RAISE=1 fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sigprocmask" >&5 $as_echo_n "checking for sigprocmask... " >&6; } if ${gl_cv_func_sigprocmask_v16+:} false; then : $as_echo_n "(cached) " >&6 else if test $gl_cv_type_sigset_t = yes; then { ac_fn_c_check_func "$LINENO" "sigprocmask" "ac_cv_func_sigprocmask" if test "x$ac_cv_func_sigprocmask" = xyes; then : gl_cv_func_sigprocmask_v16=yes else gl_cv_func_sigprocmask_v16=no fi } 6>/dev/null else gl_cv_func_sigprocmask_v16=no fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_sigprocmask_v16" >&5 $as_echo "$gl_cv_func_sigprocmask_v16" >&6; } if test $gl_cv_func_sigprocmask_v16 != yes; then HAVE_POSIX_SIGNALBLOCKING=0 fi if test $HAVE_POSIX_SIGNALBLOCKING = 0; then : fi fi if test $HAVE_RAISE = 0 || test $REPLACE_RAISE = 1; then gl_LIBOBJS="$gl_LIBOBJS raise.$ac_objext" : fi GNULIB_RAISE=1 $as_echo "#define GNULIB_TEST_RAISE 1" >>confdefs.h for ac_func in rawmemchr do : ac_fn_c_check_func "$LINENO" "rawmemchr" "ac_cv_func_rawmemchr" if test "x$ac_cv_func_rawmemchr" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_RAWMEMCHR 1 _ACEOF fi done if test $ac_cv_func_rawmemchr = no; then HAVE_RAWMEMCHR=0 fi if test $HAVE_RAWMEMCHR = 0; then gl_LIBOBJS="$gl_LIBOBJS rawmemchr.$ac_objext" : fi GNULIB_RAWMEMCHR=1 $as_echo "#define GNULIB_TEST_RAWMEMCHR 1" >>confdefs.h if test $HAVE_MSVC_INVALID_PARAMETER_HANDLER = 1; then REPLACE_READ=1 fi if test $REPLACE_READ = 1; then gl_LIBOBJS="$gl_LIBOBJS read.$ac_objext" : fi GNULIB_READ=1 $as_echo "#define GNULIB_TEST_READ 1" >>confdefs.h : if test $ac_cv_func_readlink = no; then HAVE_READLINK=0 else { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether readlink signature is correct" >&5 $as_echo_n "checking whether readlink signature is correct... " >&6; } if ${gl_cv_decl_readlink_works+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include /* Cause compilation failure if original declaration has wrong type. */ ssize_t readlink (const char *, char *, size_t); int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : gl_cv_decl_readlink_works=yes else gl_cv_decl_readlink_works=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_decl_readlink_works" >&5 $as_echo "$gl_cv_decl_readlink_works" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether readlink handles trailing slash correctly" >&5 $as_echo_n "checking whether readlink handles trailing slash correctly... " >&6; } if ${gl_cv_func_readlink_works+:} false; then : $as_echo_n "(cached) " >&6 else # We have readlink, so assume ln -s works. ln -s conftest.no-such conftest.link ln -s conftest.link conftest.lnk2 if test "$cross_compiling" = yes; then : case "$host_os" in # Guess yes on Linux systems. linux-* | linux) gl_cv_func_readlink_works="guessing yes" ;; # Guess yes on glibc systems. *-gnu* | gnu*) gl_cv_func_readlink_works="guessing yes" ;; # If we don't know, obey --enable-cross-guesses. *) gl_cv_func_readlink_works="$gl_cross_guess_normal" ;; esac else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { char buf[20]; return readlink ("conftest.lnk2/", buf, sizeof buf) != -1; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : gl_cv_func_readlink_works=yes else gl_cv_func_readlink_works=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi rm -f conftest.link conftest.lnk2 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_readlink_works" >&5 $as_echo "$gl_cv_func_readlink_works" >&6; } case "$gl_cv_func_readlink_works" in *yes) if test "$gl_cv_decl_readlink_works" != yes; then REPLACE_READLINK=1 fi ;; *) $as_echo "#define READLINK_TRAILING_SLASH_BUG 1" >>confdefs.h REPLACE_READLINK=1 ;; esac fi if test $HAVE_READLINK = 0 || test $REPLACE_READLINK = 1; then gl_LIBOBJS="$gl_LIBOBJS readlink.$ac_objext" : fi GNULIB_READLINK=1 $as_echo "#define GNULIB_TEST_READLINK 1" >>confdefs.h if test $gl_cv_func_malloc_posix = yes; then $as_echo "#define HAVE_REALLOC_POSIX 1" >>confdefs.h else REPLACE_REALLOC=1 fi if test $REPLACE_REALLOC = 1; then gl_LIBOBJS="$gl_LIBOBJS realloc.$ac_objext" fi GNULIB_REALLOC_POSIX=1 $as_echo "#define GNULIB_TEST_REALLOC_POSIX 1" >>confdefs.h # Check whether --with-included-regex was given. if test "${with_included_regex+set}" = set; then : withval=$with_included_regex; fi case $with_included_regex in #( yes|no) ac_use_included_regex=$with_included_regex ;; '') # If the system regex support is good enough that it passes the # following run test, then default to *not* using the included regex.c. # If cross compiling, assume the test would fail and use the included # regex.c. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working re_compile_pattern" >&5 $as_echo_n "checking for working re_compile_pattern... " >&6; } if ${gl_cv_func_re_compile_pattern_working+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : case "$host_os" in # Guess no on native Windows. mingw*) gl_cv_func_re_compile_pattern_working="guessing no" ;; # Otherwise obey --enable-cross-guesses. *) gl_cv_func_re_compile_pattern_working="$gl_cross_guess_normal" ;; esac else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include #if defined M_CHECK_ACTION || HAVE_DECL_ALARM # include # include #endif #if HAVE_MALLOC_H # include #endif #ifdef M_CHECK_ACTION /* Exit with distinguishable exit code. */ static void sigabrt_no_core (int sig) { raise (SIGTERM); } #endif int main () { int result = 0; static struct re_pattern_buffer regex; unsigned char folded_chars[UCHAR_MAX + 1]; int i; const char *s; struct re_registers regs; /* Some builds of glibc go into an infinite loop on this test. Use alarm to force death, and mallopt to avoid malloc recursion in diagnosing the corrupted heap. */ #if HAVE_DECL_ALARM signal (SIGALRM, SIG_DFL); alarm (2); #endif #ifdef M_CHECK_ACTION signal (SIGABRT, sigabrt_no_core); mallopt (M_CHECK_ACTION, 2); #endif if (setlocale (LC_ALL, "en_US.UTF-8")) { { /* https://sourceware.org/ml/libc-hacker/2006-09/msg00008.html This test needs valgrind to catch the bug on Debian GNU/Linux 3.1 x86, but it might catch the bug better on other platforms and it shouldn't hurt to try the test here. */ static char const pat[] = "insert into"; static char const data[] = "\xFF\0\x12\xA2\xAA\xC4\xB1,K\x12\xC4\xB1*\xACK"; re_set_syntax (RE_SYNTAX_GREP | RE_HAT_LISTS_NOT_NEWLINE | RE_ICASE); memset (®ex, 0, sizeof regex); s = re_compile_pattern (pat, sizeof pat - 1, ®ex); if (s) result |= 1; else { if (re_search (®ex, data, sizeof data - 1, 0, sizeof data - 1, ®s) != -1) result |= 1; regfree (®ex); } } { /* This test is from glibc bug 15078. The test case is from Andreas Schwab in . */ static char const pat[] = "[^x]x"; static char const data[] = /* */ "\xe1\x80\x80" "\xe1\x80\xbb" "\xe1\x80\xbd" "\xe1\x80\x94" "\xe1\x80\xba" "\xe1\x80\xaf" "\xe1\x80\x95" "\xe1\x80\xba" "x"; re_set_syntax (0); memset (®ex, 0, sizeof regex); s = re_compile_pattern (pat, sizeof pat - 1, ®ex); if (s) result |= 1; else { i = re_search (®ex, data, sizeof data - 1, 0, sizeof data - 1, 0); if (i != 0 && i != 21) result |= 1; regfree (®ex); } } if (! setlocale (LC_ALL, "C")) return 1; } /* This test is from glibc bug 3957, reported by Andrew Mackey. */ re_set_syntax (RE_SYNTAX_EGREP | RE_HAT_LISTS_NOT_NEWLINE); memset (®ex, 0, sizeof regex); s = re_compile_pattern ("a[^x]b", 6, ®ex); if (s) result |= 2; else { /* This should fail, but succeeds for glibc-2.5. */ if (re_search (®ex, "a\nb", 3, 0, 3, ®s) != -1) result |= 2; regfree (®ex); } /* This regular expression is from Spencer ere test number 75 in grep-2.3. */ re_set_syntax (RE_SYNTAX_POSIX_EGREP); memset (®ex, 0, sizeof regex); for (i = 0; i <= UCHAR_MAX; i++) folded_chars[i] = i; regex.translate = folded_chars; s = re_compile_pattern ("a[[:]:]]b\n", 11, ®ex); /* This should fail with _Invalid character class name_ error. */ if (!s) { result |= 4; regfree (®ex); } /* Ensure that [b-a] is diagnosed as invalid, when using RE_NO_EMPTY_RANGES. */ re_set_syntax (RE_SYNTAX_POSIX_EGREP | RE_NO_EMPTY_RANGES); memset (®ex, 0, sizeof regex); s = re_compile_pattern ("a[b-a]", 6, ®ex); if (s == 0) { result |= 8; regfree (®ex); } /* This should succeed, but does not for glibc-2.1.3. */ memset (®ex, 0, sizeof regex); s = re_compile_pattern ("{1", 2, ®ex); if (s) result |= 8; else regfree (®ex); /* The following example is derived from a problem report against gawk from Jorge Stolfi . */ memset (®ex, 0, sizeof regex); s = re_compile_pattern ("[an\371]*n", 7, ®ex); if (s) result |= 8; else { /* This should match, but does not for glibc-2.2.1. */ if (re_match (®ex, "an", 2, 0, ®s) != 2) result |= 8; else { free (regs.start); free (regs.end); } regfree (®ex); } memset (®ex, 0, sizeof regex); s = re_compile_pattern ("x", 1, ®ex); if (s) result |= 8; else { /* glibc-2.2.93 does not work with a negative RANGE argument. */ if (re_search (®ex, "wxy", 3, 2, -2, ®s) != 1) result |= 8; else { free (regs.start); free (regs.end); } regfree (®ex); } /* The version of regex.c in older versions of gnulib ignored RE_ICASE. Detect that problem too. */ re_set_syntax (RE_SYNTAX_EMACS | RE_ICASE); memset (®ex, 0, sizeof regex); s = re_compile_pattern ("x", 1, ®ex); if (s) result |= 16; else { if (re_search (®ex, "WXY", 3, 0, 3, ®s) < 0) result |= 16; else { free (regs.start); free (regs.end); } regfree (®ex); } /* Catch a bug reported by Vin Shelton in https://lists.gnu.org/r/bug-coreutils/2007-06/msg00089.html */ re_set_syntax (RE_SYNTAX_POSIX_BASIC & ~RE_CONTEXT_INVALID_DUP & ~RE_NO_EMPTY_RANGES); memset (®ex, 0, sizeof regex); s = re_compile_pattern ("[[:alnum:]_-]\\\\+$", 16, ®ex); if (s) result |= 32; else regfree (®ex); /* REG_STARTEND was added to glibc on 2004-01-15. Reject older versions. */ if (! REG_STARTEND) result |= 64; /* Matching with the compiled form of this regexp would provoke an assertion failure prior to glibc-2.28: regexec.c:1375: pop_fail_stack: Assertion 'num >= 0' failed With glibc-2.28, compilation fails and reports the invalid back reference. */ re_set_syntax (RE_SYNTAX_POSIX_EGREP); memset (®ex, 0, sizeof regex); s = re_compile_pattern ("0|()0|\\1|0", 10, ®ex); if (!s) result |= 64; else { if (strcmp (s, "Invalid back reference")) result |= 64; regfree (®ex); } #if 0 /* It would be nice to reject hosts whose regoff_t values are too narrow (including glibc on hosts with 64-bit ptrdiff_t and 32-bit int), but we should wait until glibc implements this feature. Otherwise, support for equivalence classes and multibyte collation symbols would always be broken except when compiling --without-included-regex. */ if (sizeof (regoff_t) < sizeof (ptrdiff_t) || sizeof (regoff_t) < sizeof (ssize_t)) result |= 64; #endif return result; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : gl_cv_func_re_compile_pattern_working=yes else gl_cv_func_re_compile_pattern_working=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_re_compile_pattern_working" >&5 $as_echo "$gl_cv_func_re_compile_pattern_working" >&6; } case "$gl_cv_func_re_compile_pattern_working" in #( *yes) ac_use_included_regex=no;; #( *no) ac_use_included_regex=yes;; esac ;; *) as_fn_error $? "Invalid value for --with-included-regex: $with_included_regex" "$LINENO" 5 ;; esac if test $ac_use_included_regex = yes; then $as_echo "#define _REGEX_INCLUDE_LIMITS_H 1" >>confdefs.h $as_echo "#define _REGEX_LARGE_OFFSETS 1" >>confdefs.h $as_echo "#define re_syntax_options rpl_re_syntax_options" >>confdefs.h $as_echo "#define re_set_syntax rpl_re_set_syntax" >>confdefs.h $as_echo "#define re_compile_pattern rpl_re_compile_pattern" >>confdefs.h $as_echo "#define re_compile_fastmap rpl_re_compile_fastmap" >>confdefs.h $as_echo "#define re_search rpl_re_search" >>confdefs.h $as_echo "#define re_search_2 rpl_re_search_2" >>confdefs.h $as_echo "#define re_match rpl_re_match" >>confdefs.h $as_echo "#define re_match_2 rpl_re_match_2" >>confdefs.h $as_echo "#define re_set_registers rpl_re_set_registers" >>confdefs.h $as_echo "#define re_comp rpl_re_comp" >>confdefs.h $as_echo "#define re_exec rpl_re_exec" >>confdefs.h $as_echo "#define regcomp rpl_regcomp" >>confdefs.h $as_echo "#define regexec rpl_regexec" >>confdefs.h $as_echo "#define regerror rpl_regerror" >>confdefs.h $as_echo "#define regfree rpl_regfree" >>confdefs.h fi if test $ac_use_included_regex = yes; then gl_LIBOBJS="$gl_LIBOBJS regex.$ac_objext" for ac_header in libintl.h do : ac_fn_c_check_header_mongrel "$LINENO" "libintl.h" "ac_cv_header_libintl_h" "$ac_includes_default" if test "x$ac_cv_header_libintl_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBINTL_H 1 _ACEOF fi done ac_fn_c_check_decl "$LINENO" "isblank" "ac_cv_have_decl_isblank" "#include " if test "x$ac_cv_have_decl_isblank" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_ISBLANK $ac_have_decl _ACEOF fi : ${RELOCATABLE_CONFIG_H_DIR='$(top_builddir)'} RELOCATABLE_SRC_DIR="\$(top_srcdir)/$gl_source_base" RELOCATABLE_BUILD_DIR="\$(top_builddir)/$gl_source_base" if test $RELOCATABLE = yes; then gl_LIBOBJS="$gl_LIBOBJS progreloc.$ac_objext" gl_LIBOBJS="$gl_LIBOBJS relocatable.$ac_objext" fi : if test $ac_cv_have_decl_setenv = no; then HAVE_DECL_SETENV=0 fi for ac_header in search.h do : ac_fn_c_check_header_mongrel "$LINENO" "search.h" "ac_cv_header_search_h" "$ac_includes_default" if test "x$ac_cv_header_search_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_SEARCH_H 1 _ACEOF fi done for ac_func in tsearch do : ac_fn_c_check_func "$LINENO" "tsearch" "ac_cv_func_tsearch" if test "x$ac_cv_func_tsearch" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_TSEARCH 1 _ACEOF fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether rename honors trailing slash on destination" >&5 $as_echo_n "checking whether rename honors trailing slash on destination... " >&6; } if ${gl_cv_func_rename_slash_dst_works+:} false; then : $as_echo_n "(cached) " >&6 else rm -rf conftest.f conftest.f1 conftest.f2 conftest.d1 conftest.d2 conftest.lnk touch conftest.f && touch conftest.f1 && mkdir conftest.d1 || as_fn_error $? "cannot create temporary files" "$LINENO" 5 # Assume that if we have lstat, we can also check symlinks. if test $ac_cv_func_lstat = yes; then ln -s conftest.f conftest.lnk fi if test "$cross_compiling" = yes; then : case "$host_os" in # Guess yes on Linux systems. linux-* | linux) gl_cv_func_rename_slash_dst_works="guessing yes" ;; # Guess yes on glibc systems. *-gnu*) gl_cv_func_rename_slash_dst_works="guessing yes" ;; # Guess no on native Windows. mingw*) gl_cv_func_rename_slash_dst_works="guessing no" ;; # If we don't know, obey --enable-cross-guesses. *) gl_cv_func_rename_slash_dst_works="$gl_cross_guess_normal" ;; esac else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ # include # include int main () { int result = 0; if (rename ("conftest.f1", "conftest.f2/") == 0) result |= 1; if (rename ("conftest.d1", "conftest.d2/") != 0) result |= 2; #if HAVE_LSTAT if (rename ("conftest.f", "conftest.lnk/") == 0) result |= 4; #endif return result; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : gl_cv_func_rename_slash_dst_works=yes else gl_cv_func_rename_slash_dst_works=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi rm -rf conftest.f conftest.f1 conftest.f2 conftest.d1 conftest.d2 conftest.lnk fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_rename_slash_dst_works" >&5 $as_echo "$gl_cv_func_rename_slash_dst_works" >&6; } case "$gl_cv_func_rename_slash_dst_works" in *yes) ;; *) REPLACE_RENAME=1 $as_echo "#define RENAME_TRAILING_SLASH_DEST_BUG 1" >>confdefs.h ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether rename honors trailing slash on source" >&5 $as_echo_n "checking whether rename honors trailing slash on source... " >&6; } if ${gl_cv_func_rename_slash_src_works+:} false; then : $as_echo_n "(cached) " >&6 else rm -rf conftest.f conftest.f1 conftest.d1 conftest.d2 conftest.d3 conftest.lnk touch conftest.f && touch conftest.f1 && mkdir conftest.d1 || as_fn_error $? "cannot create temporary files" "$LINENO" 5 # Assume that if we have lstat, we can also check symlinks. if test $ac_cv_func_lstat = yes; then ln -s conftest.f conftest.lnk fi if test "$cross_compiling" = yes; then : case "$host_os" in # Guess yes on Linux systems. linux-* | linux) gl_cv_func_rename_slash_src_works="guessing yes" ;; # Guess yes on glibc systems. *-gnu*) gl_cv_func_rename_slash_src_works="guessing yes" ;; # Guess yes on native Windows. mingw*) gl_cv_func_rename_slash_src_works="guessing yes" ;; # If we don't know, obey --enable-cross-guesses. *) gl_cv_func_rename_slash_src_works="$gl_cross_guess_normal" ;; esac else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ # include # include int main () { int result = 0; if (rename ("conftest.f1/", "conftest.d3") == 0) result |= 1; if (rename ("conftest.d1/", "conftest.d2") != 0) result |= 2; #if HAVE_LSTAT if (rename ("conftest.lnk/", "conftest.f") == 0) result |= 4; #endif return result; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : gl_cv_func_rename_slash_src_works=yes else gl_cv_func_rename_slash_src_works=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi rm -rf conftest.f conftest.f1 conftest.d1 conftest.d2 conftest.d3 conftest.lnk fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_rename_slash_src_works" >&5 $as_echo "$gl_cv_func_rename_slash_src_works" >&6; } case "$gl_cv_func_rename_slash_src_works" in *yes) ;; *) REPLACE_RENAME=1 $as_echo "#define RENAME_TRAILING_SLASH_SOURCE_BUG 1" >>confdefs.h ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether rename manages hard links correctly" >&5 $as_echo_n "checking whether rename manages hard links correctly... " >&6; } if ${gl_cv_func_rename_link_works+:} false; then : $as_echo_n "(cached) " >&6 else if test $ac_cv_func_link = yes; then if test $cross_compiling != yes; then rm -rf conftest.f conftest.f1 conftest.f2 if touch conftest.f conftest.f2 && ln conftest.f conftest.f1 && set x `ls -i conftest.f conftest.f1` && test "" = ""; then if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ # include # include # include # include int main () { int result = 0; if (rename ("conftest.f", "conftest.f1")) result |= 1; if (unlink ("conftest.f1")) result |= 2; /* Allow either the POSIX-required behavior, where the previous rename kept conftest.f, or the (better) NetBSD behavior, where it removed conftest.f. */ if (rename ("conftest.f", "conftest.f") != 0 && errno != ENOENT) result |= 4; if (rename ("conftest.f1", "conftest.f1") == 0) result |= 8; if (rename ("conftest.f2", "conftest.f2") != 0) result |= 16; return result; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : gl_cv_func_rename_link_works=yes else gl_cv_func_rename_link_works=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi else gl_cv_func_rename_link_works="guessing no" fi rm -rf conftest.f conftest.f1 conftest.f2 else case "$host_os" in # Guess yes on Linux systems. linux-* | linux) gl_cv_func_rename_link_works="guessing yes" ;; # Guess yes on glibc systems. *-gnu*) gl_cv_func_rename_link_works="guessing yes" ;; # Guess yes on native Windows. mingw*) gl_cv_func_rename_link_works="guessing yes" ;; # If we don't know, obey --enable-cross-guesses. *) gl_cv_func_rename_link_works="$gl_cross_guess_normal" ;; esac fi else gl_cv_func_rename_link_works=yes fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_rename_link_works" >&5 $as_echo "$gl_cv_func_rename_link_works" >&6; } case "$gl_cv_func_rename_link_works" in *yes) ;; *) REPLACE_RENAME=1 $as_echo "#define RENAME_HARD_LINK_BUG 1" >>confdefs.h ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether rename manages existing destinations correctly" >&5 $as_echo_n "checking whether rename manages existing destinations correctly... " >&6; } if ${gl_cv_func_rename_dest_works+:} false; then : $as_echo_n "(cached) " >&6 else rm -rf conftest.f conftest.d1 conftest.d2 touch conftest.f && mkdir conftest.d1 conftest.d2 || as_fn_error $? "cannot create temporary files" "$LINENO" 5 if test "$cross_compiling" = yes; then : case "$host_os" in # Guess yes on Linux systems. linux-* | linux) gl_cv_func_rename_dest_works="guessing yes" ;; # Guess yes on glibc systems. *-gnu*) gl_cv_func_rename_dest_works="guessing yes" ;; # Guess no on native Windows. mingw*) gl_cv_func_rename_dest_works="guessing no" ;; # If we don't know, obey --enable-cross-guesses. *) gl_cv_func_rename_dest_works="$gl_cross_guess_normal" ;; esac else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ # include # include int main () { int result = 0; if (rename ("conftest.d1", "conftest.d2") != 0) result |= 1; if (rename ("conftest.d2", "conftest.f") == 0) result |= 2; return result; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : gl_cv_func_rename_dest_works=yes else gl_cv_func_rename_dest_works=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi rm -rf conftest.f conftest.d1 conftest.d2 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_rename_dest_works" >&5 $as_echo "$gl_cv_func_rename_dest_works" >&6; } case "$gl_cv_func_rename_dest_works" in *yes) ;; *) REPLACE_RENAME=1 $as_echo "#define RENAME_DEST_EXISTS_BUG 1" >>confdefs.h ;; esac if test $REPLACE_RENAME = 1; then gl_LIBOBJS="$gl_LIBOBJS rename.$ac_objext" fi GNULIB_RENAME=1 $as_echo "#define GNULIB_TEST_RENAME 1" >>confdefs.h { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether rmdir works" >&5 $as_echo_n "checking whether rmdir works... " >&6; } if ${gl_cv_func_rmdir_works+:} false; then : $as_echo_n "(cached) " >&6 else mkdir conftest.dir touch conftest.file if test "$cross_compiling" = yes; then : case "$host_os" in # Guess yes on Linux systems. linux-* | linux) gl_cv_func_rmdir_works="guessing yes" ;; # Guess yes on glibc systems. *-gnu* | gnu*) gl_cv_func_rmdir_works="guessing yes" ;; # Guess no on native Windows. mingw*) gl_cv_func_rmdir_works="guessing no" ;; # If we don't know, obey --enable-cross-guesses. *) gl_cv_func_rmdir_works="$gl_cross_guess_normal" ;; esac else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if HAVE_UNISTD_H # include #else /* on Windows with MSVC */ # include #endif int main () { int result = 0; if (!rmdir ("conftest.file/")) result |= 1; else if (errno != ENOTDIR) result |= 2; if (!rmdir ("conftest.dir/./")) result |= 4; return result; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : gl_cv_func_rmdir_works=yes else gl_cv_func_rmdir_works=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi rm -rf conftest.dir conftest.file fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_rmdir_works" >&5 $as_echo "$gl_cv_func_rmdir_works" >&6; } case "$gl_cv_func_rmdir_works" in *yes) ;; *) REPLACE_RMDIR=1 ;; esac if test $REPLACE_RMDIR = 1; then gl_LIBOBJS="$gl_LIBOBJS rmdir.$ac_objext" fi GNULIB_RMDIR=1 $as_echo "#define GNULIB_TEST_RMDIR 1" >>confdefs.h save_LIBS=$LIBS ROUND_LIBM=missing for libm in "" "-lm"; do LIBS="$save_LIBS $libm" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifndef __NO_MATH_INLINES # define __NO_MATH_INLINES 1 /* for glibc */ #endif #include extern #ifdef __cplusplus "C" #endif double round (double); double x; int main () { x = round (x); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ROUND_LIBM=$libm break fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext done LIBS=$save_LIBS if test "$ROUND_LIBM" != missing; then HAVE_ROUND=1 ac_fn_c_check_decl "$LINENO" "round" "ac_cv_have_decl_round" "#include " if test "x$ac_cv_have_decl_round" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_ROUND $ac_have_decl _ACEOF if test $ac_have_decl = 1; then : else HAVE_DECL_ROUND=0 fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether round works" >&5 $as_echo_n "checking whether round works... " >&6; } if ${gl_cv_func_round_works+:} false; then : $as_echo_n "(cached) " >&6 else save_LIBS="$LIBS" LIBS="$LIBS $ROUND_LIBM" if test "$cross_compiling" = yes; then : case "$host_os" in netbsd* | aix*) gl_cv_func_round_works="guessing no" ;; # Guess yes on MSVC, no on mingw. mingw*) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef _MSC_VER Known #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "Known" >/dev/null 2>&1; then : gl_cv_func_round_works="guessing yes" else gl_cv_func_round_works="guessing no" fi rm -f conftest* ;; *) gl_cv_func_round_works="guessing yes" ;; esac else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include extern #ifdef __cplusplus "C" #endif double round (double); #ifdef _MSC_VER # pragma fenv_access (off) #endif int main() { /* 2^DBL_MANT_DIG. */ static const double TWO_MANT_DIG = /* Assume DBL_MANT_DIG <= 5 * 31. Use the identity n = floor(n/5) + floor((n+1)/5) + ... + floor((n+4)/5). */ (double) (1U << (DBL_MANT_DIG / 5)) * (double) (1U << ((DBL_MANT_DIG + 1) / 5)) * (double) (1U << ((DBL_MANT_DIG + 2) / 5)) * (double) (1U << ((DBL_MANT_DIG + 3) / 5)) * (double) (1U << ((DBL_MANT_DIG + 4) / 5)); volatile double x = 0.5 - 0.5 / TWO_MANT_DIG; return (x < 0.5 && round (x) != 0.0); } _ACEOF if ac_fn_c_try_run "$LINENO"; then : gl_cv_func_round_works=yes else gl_cv_func_round_works=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi LIBS="$save_LIBS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_round_works" >&5 $as_echo "$gl_cv_func_round_works" >&6; } case "$gl_cv_func_round_works" in *no) REPLACE_ROUND=1 ;; esac else HAVE_ROUND=0 HAVE_DECL_ROUND=0 fi if test $HAVE_ROUND = 0 || test $REPLACE_ROUND = 1; then saved_as_echo_n="$as_echo_n" as_echo_n=':' if ${gl_cv_func_floor_libm+:} false; then : $as_echo_n "(cached) " >&6 else gl_cv_func_floor_libm=? cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifndef __NO_MATH_INLINES # define __NO_MATH_INLINES 1 /* for glibc */ #endif #include double (*funcptr) (double) = floor; double x; int main () { x = funcptr(x) + floor(x); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : gl_cv_func_floor_libm= fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test "$gl_cv_func_floor_libm" = "?"; then save_LIBS="$LIBS" LIBS="$LIBS -lm" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifndef __NO_MATH_INLINES # define __NO_MATH_INLINES 1 /* for glibc */ #endif #include double (*funcptr) (double) = floor; double x; int main () { x = funcptr(x) + floor(x); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : gl_cv_func_floor_libm="-lm" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS="$save_LIBS" fi fi as_echo_n="$saved_as_echo_n" FLOOR_LIBM="$gl_cv_func_floor_libm" saved_as_echo_n="$as_echo_n" as_echo_n=':' if ${gl_cv_func_ceil_libm+:} false; then : $as_echo_n "(cached) " >&6 else gl_cv_func_ceil_libm=? cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifndef __NO_MATH_INLINES # define __NO_MATH_INLINES 1 /* for glibc */ #endif #include double (*funcptr) (double) = ceil; double x; int main () { x = funcptr(x) + ceil(x); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : gl_cv_func_ceil_libm= fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test "$gl_cv_func_ceil_libm" = "?"; then save_LIBS="$LIBS" LIBS="$LIBS -lm" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifndef __NO_MATH_INLINES # define __NO_MATH_INLINES 1 /* for glibc */ #endif #include double (*funcptr) (double) = ceil; double x; int main () { x = funcptr(x) + ceil(x); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : gl_cv_func_ceil_libm="-lm" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS="$save_LIBS" fi fi as_echo_n="$saved_as_echo_n" CEIL_LIBM="$gl_cv_func_ceil_libm" ROUND_LIBM= case " $ROUND_LIBM " in *" $FLOOR_LIBM "*) ;; *) ROUND_LIBM="$ROUND_LIBM $FLOOR_LIBM" ;; esac case " $ROUND_LIBM " in *" $CEIL_LIBM "*) ;; *) ROUND_LIBM="$ROUND_LIBM $CEIL_LIBM" ;; esac fi if test $HAVE_ROUND = 0 || test $REPLACE_ROUND = 1; then gl_LIBOBJS="$gl_LIBOBJS round.$ac_objext" fi GNULIB_ROUND=1 $as_echo "#define GNULIB_TEST_ROUND 1" >>confdefs.h if test $ac_cv_func_secure_getenv = no; then HAVE_SECURE_GETENV=0 fi if test $HAVE_SECURE_GETENV = 0; then gl_LIBOBJS="$gl_LIBOBJS secure_getenv.$ac_objext" for ac_func in __secure_getenv do : ac_fn_c_check_func "$LINENO" "__secure_getenv" "ac_cv_func___secure_getenv" if test "x$ac_cv_func___secure_getenv" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE___SECURE_GETENV 1 _ACEOF fi done if test $ac_cv_func___secure_getenv = no; then for ac_func in issetugid do : ac_fn_c_check_func "$LINENO" "issetugid" "ac_cv_func_issetugid" if test "x$ac_cv_func_issetugid" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_ISSETUGID 1 _ACEOF fi done fi fi GNULIB_SECURE_GETENV=1 $as_echo "#define GNULIB_TEST_SECURE_GETENV 1" >>confdefs.h if test "$ac_cv_header_winsock2_h" = yes; then REPLACE_SELECT=1 else { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether select supports a 0 argument" >&5 $as_echo_n "checking whether select supports a 0 argument... " >&6; } if ${gl_cv_func_select_supports0+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : case "$host_os" in # Guess no on Interix. interix*) gl_cv_func_select_supports0="guessing no";; # Guess yes otherwise. *) gl_cv_func_select_supports0="guessing yes";; esac else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if HAVE_SYS_SELECT_H #include #endif int main () { struct timeval timeout; timeout.tv_sec = 0; timeout.tv_usec = 5; return select (0, (fd_set *)0, (fd_set *)0, (fd_set *)0, &timeout) < 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : gl_cv_func_select_supports0=yes else gl_cv_func_select_supports0=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_select_supports0" >&5 $as_echo "$gl_cv_func_select_supports0" >&6; } case "$gl_cv_func_select_supports0" in *yes) ;; *) REPLACE_SELECT=1 ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether select detects invalid fds" >&5 $as_echo_n "checking whether select detects invalid fds... " >&6; } if ${gl_cv_func_select_detects_ebadf+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : case "$host_os" in # Guess yes on Linux systems. linux-* | linux) gl_cv_func_select_detects_ebadf="guessing yes" ;; # Guess yes on glibc systems. *-gnu* | gnu*) gl_cv_func_select_detects_ebadf="guessing yes" ;; # If we don't know, obey --enable-cross-guesses. *) gl_cv_func_select_detects_ebadf="$gl_cross_guess_normal" ;; esac else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if HAVE_SYS_SELECT_H # include #endif #include #include int main () { fd_set set; dup2(0, 16); FD_ZERO(&set); FD_SET(16, &set); close(16); struct timeval timeout; timeout.tv_sec = 0; timeout.tv_usec = 5; return select (17, &set, NULL, NULL, &timeout) != -1 || errno != EBADF; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : gl_cv_func_select_detects_ebadf=yes else gl_cv_func_select_detects_ebadf=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_select_detects_ebadf" >&5 $as_echo "$gl_cv_func_select_detects_ebadf" >&6; } case $gl_cv_func_select_detects_ebadf in *yes) ;; *) REPLACE_SELECT=1 ;; esac fi LIB_SELECT="$LIBSOCKET" if test $REPLACE_SELECT = 1; then case "$host_os" in mingw*) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define WIN32_LEAN_AND_MEAN #include int main () { MsgWaitForMultipleObjects (0, NULL, 0, 0, 0); return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : else LIB_SELECT="$LIB_SELECT -luser32" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext ;; esac fi if test $REPLACE_SELECT = 1; then gl_LIBOBJS="$gl_LIBOBJS select.$ac_objext" fi GNULIB_SELECT=1 $as_echo "#define GNULIB_TEST_SELECT 1" >>confdefs.h if test $ac_cv_func_setenv = no; then HAVE_SETENV=0 else { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether setenv validates arguments" >&5 $as_echo_n "checking whether setenv validates arguments... " >&6; } if ${gl_cv_func_setenv_works+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : case "$host_os" in # Guess yes on glibc systems. *-gnu* | gnu*) gl_cv_func_setenv_works="guessing yes" ;; # Guess yes on musl systems. *-musl*) gl_cv_func_setenv_works="guessing yes" ;; # If we don't know, obey --enable-cross-guesses. *) gl_cv_func_setenv_works="$gl_cross_guess_normal" ;; esac else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include int main () { int result = 0; { if (setenv ("", "", 0) != -1) result |= 1; else if (errno != EINVAL) result |= 2; } { if (setenv ("a", "=", 1) != 0) result |= 4; else if (strcmp (getenv ("a"), "=") != 0) result |= 8; } return result; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : gl_cv_func_setenv_works=yes else gl_cv_func_setenv_works=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_setenv_works" >&5 $as_echo "$gl_cv_func_setenv_works" >&6; } case "$gl_cv_func_setenv_works" in *yes) ;; *) REPLACE_SETENV=1 ;; esac fi if test $HAVE_SETENV = 0 || test $REPLACE_SETENV = 1; then gl_LIBOBJS="$gl_LIBOBJS setenv.$ac_objext" fi GNULIB_SETENV=1 $as_echo "#define GNULIB_TEST_SETENV 1" >>confdefs.h { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether setlocale (LC_ALL, NULL) is multithread-safe" >&5 $as_echo_n "checking whether setlocale (LC_ALL, NULL) is multithread-safe... " >&6; } if ${gl_cv_func_setlocale_null_all_mtsafe+:} false; then : $as_echo_n "(cached) " >&6 else case "$host_os" in # Guess no on musl libc, macOS, FreeBSD, NetBSD, OpenBSD, AIX, Haiku, Cygwin. *-musl* | darwin* | freebsd* | netbsd* | openbsd* | aix* | haiku* | cygwin*) gl_cv_func_setlocale_null_all_mtsafe=no ;; # Guess yes on glibc, HP-UX, IRIX, Solaris, native Windows. *-gnu* | gnu* | hpux* | irix* | solaris* | mingw*) gl_cv_func_setlocale_null_all_mtsafe=yes ;; # If we don't know, obey --enable-cross-guesses. *) gl_cv_func_setlocale_null_all_mtsafe="$gl_cross_guess_normal" ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_setlocale_null_all_mtsafe" >&5 $as_echo "$gl_cv_func_setlocale_null_all_mtsafe" >&6; } case "$host_os" in mingw*) ;; *) if test $gl_pthread_api = no && test $ac_cv_header_threads_h = no; then gl_cv_func_setlocale_null_all_mtsafe="trivially yes" fi ;; esac case "$gl_cv_func_setlocale_null_all_mtsafe" in *yes) SETLOCALE_NULL_ALL_MTSAFE=1 ;; *) SETLOCALE_NULL_ALL_MTSAFE=0 ;; esac cat >>confdefs.h <<_ACEOF #define SETLOCALE_NULL_ALL_MTSAFE $SETLOCALE_NULL_ALL_MTSAFE _ACEOF { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether setlocale (category, NULL) is multithread-safe" >&5 $as_echo_n "checking whether setlocale (category, NULL) is multithread-safe... " >&6; } if ${gl_cv_func_setlocale_null_one_mtsafe+:} false; then : $as_echo_n "(cached) " >&6 else case "$host_os" in # Guess no on OpenBSD, AIX. openbsd* | aix*) gl_cv_func_setlocale_null_one_mtsafe=no ;; # Guess yes on glibc, musl libc, macOS, FreeBSD, NetBSD, HP-UX, IRIX, Solaris, Haiku, Cygwin, native Windows. *-gnu* | gnu* | *-musl* | darwin* | freebsd* | netbsd* | hpux* | irix* | solaris* | haiku* | cygwin* | mingw*) gl_cv_func_setlocale_null_one_mtsafe=yes ;; # If we don't know, obey --enable-cross-guesses. *) gl_cv_func_setlocale_null_one_mtsafe="$gl_cross_guess_normal" ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_setlocale_null_one_mtsafe" >&5 $as_echo "$gl_cv_func_setlocale_null_one_mtsafe" >&6; } case "$host_os" in mingw*) ;; *) if test $gl_pthread_api = no && test $ac_cv_header_threads_h = no; then gl_cv_func_setlocale_null_one_mtsafe="trivially yes" fi ;; esac case "$gl_cv_func_setlocale_null_one_mtsafe" in *yes) SETLOCALE_NULL_ONE_MTSAFE=1 ;; *) SETLOCALE_NULL_ONE_MTSAFE=0 ;; esac cat >>confdefs.h <<_ACEOF #define SETLOCALE_NULL_ONE_MTSAFE $SETLOCALE_NULL_ONE_MTSAFE _ACEOF if test $SETLOCALE_NULL_ALL_MTSAFE = 0 || test $SETLOCALE_NULL_ONE_MTSAFE = 0; then case "$host_os" in mingw*) LIB_SETLOCALE_NULL= ;; *) { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether imported symbols can be declared weak" >&5 $as_echo_n "checking whether imported symbols can be declared weak... " >&6; } if ${gl_cv_have_weak+:} false; then : $as_echo_n "(cached) " >&6 else gl_cv_have_weak=no cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ extern void xyzzy (); #pragma weak xyzzy int main () { xyzzy(); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : gl_cv_have_weak=maybe fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test $gl_cv_have_weak = maybe; then if test "$cross_compiling" = yes; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __ELF__ Extensible Linking Format #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "Extensible Linking Format" >/dev/null 2>&1; then : gl_cv_have_weak="guessing yes" else gl_cv_have_weak="guessing no" fi rm -f conftest* else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #pragma weak fputs int main () { return (fputs == NULL); } _ACEOF if ac_fn_c_try_run "$LINENO"; then : gl_cv_have_weak=yes else gl_cv_have_weak=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi case " $LDFLAGS " in *" -static "*) gl_cv_have_weak=no ;; esac case "$gl_cv_have_weak" in *yes) case "$host_os" in freebsd* | dragonfly*) : > conftest1.c $CC $CPPFLAGS $CFLAGS $LDFLAGS -fPIC -shared -o libempty.so conftest1.c -lpthread >&5 2>&1 cat < conftest2.c #include #pragma weak pthread_mutexattr_gettype int main () { return (pthread_mutexattr_gettype != NULL); } EOF $CC $CPPFLAGS $CFLAGS $LDFLAGS -o conftest conftest2.c libempty.so >&5 2>&1 \ || gl_cv_have_weak=no rm -f conftest1.c libempty.so conftest2.c conftest ;; esac ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_have_weak" >&5 $as_echo "$gl_cv_have_weak" >&6; } case "$gl_cv_have_weak" in *yes) $as_echo "#define HAVE_WEAK_SYMBOLS 1" >>confdefs.h ;; esac case "$gl_cv_have_weak" in *yes) LIB_SETLOCALE_NULL= ;; *) LIB_SETLOCALE_NULL="$LIBPTHREAD" ;; esac ;; esac else LIB_SETLOCALE_NULL= fi if test $SETLOCALE_NULL_ALL_MTSAFE = 0 || test $SETLOCALE_NULL_ONE_MTSAFE = 0; then gl_LIBOBJS="$gl_LIBOBJS setlocale-lock.$ac_objext" CFLAG_VISIBILITY= HAVE_VISIBILITY=0 if test -n "$GCC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the -Werror option is usable" >&5 $as_echo_n "checking whether the -Werror option is usable... " >&6; } if ${gl_cv_cc_vis_werror+:} false; then : $as_echo_n "(cached) " >&6 else gl_save_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -Werror" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : gl_cv_cc_vis_werror=yes else gl_cv_cc_vis_werror=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext CFLAGS="$gl_save_CFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_cc_vis_werror" >&5 $as_echo "$gl_cv_cc_vis_werror" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for simple visibility declarations" >&5 $as_echo_n "checking for simple visibility declarations... " >&6; } if ${gl_cv_cc_visibility+:} false; then : $as_echo_n "(cached) " >&6 else gl_save_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -fvisibility=hidden" if test $gl_cv_cc_vis_werror = yes; then CFLAGS="$CFLAGS -Werror" fi cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ extern __attribute__((__visibility__("hidden"))) int hiddenvar; extern __attribute__((__visibility__("default"))) int exportedvar; extern __attribute__((__visibility__("hidden"))) int hiddenfunc (void); extern __attribute__((__visibility__("default"))) int exportedfunc (void); void dummyfunc (void) {} int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : gl_cv_cc_visibility=yes else gl_cv_cc_visibility=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext CFLAGS="$gl_save_CFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_cc_visibility" >&5 $as_echo "$gl_cv_cc_visibility" >&6; } if test $gl_cv_cc_visibility = yes; then CFLAG_VISIBILITY="-fvisibility=hidden" HAVE_VISIBILITY=1 fi fi cat >>confdefs.h <<_ACEOF #define HAVE_VISIBILITY $HAVE_VISIBILITY _ACEOF fi GNULIB_SETLOCALE_NULL=1 $as_echo "#define GNULIB_TEST_SETLOCALE_NULL 1" >>confdefs.h if test $ac_cv_func_sigaction = yes; then ac_fn_c_check_member "$LINENO" "struct sigaction" "sa_sigaction" "ac_cv_member_struct_sigaction_sa_sigaction" "#include " if test "x$ac_cv_member_struct_sigaction_sa_sigaction" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_STRUCT_SIGACTION_SA_SIGACTION 1 _ACEOF fi if test $ac_cv_member_struct_sigaction_sa_sigaction = no; then HAVE_STRUCT_SIGACTION_SA_SIGACTION=0 fi else HAVE_SIGACTION=0 fi if test $HAVE_SIGACTION = 0; then gl_LIBOBJS="$gl_LIBOBJS sigaction.$ac_objext" ac_fn_c_check_type "$LINENO" "siginfo_t" "ac_cv_type_siginfo_t" " #include " if test "x$ac_cv_type_siginfo_t" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_SIGINFO_T 1 _ACEOF fi if test $ac_cv_type_siginfo_t = no; then HAVE_SIGINFO_T=0 fi fi GNULIB_SIGACTION=1 $as_echo "#define GNULIB_TEST_SIGACTION 1" >>confdefs.h if test $gl_cv_have_include_next = yes; then gl_cv_next_signal_h='<'signal.h'>' else { $as_echo "$as_me:${as_lineno-$LINENO}: checking absolute name of " >&5 $as_echo_n "checking absolute name of ... " >&6; } if ${gl_cv_next_signal_h+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF case "$host_os" in aix*) gl_absname_cpp="$ac_cpp -C" ;; *) gl_absname_cpp="$ac_cpp" ;; esac case "$host_os" in mingw*) gl_dirsep_regex='[/\\]' ;; *) gl_dirsep_regex='\/' ;; esac gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g' gl_header_literal_regex=`echo 'signal.h' \ | sed -e "$gl_make_literal_regex_sed"` gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{ s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/ s|^/[^/]|//&| p q }' gl_cv_absolute_signal_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 | sed -n "$gl_absolute_header_sed"` gl_header=$gl_cv_absolute_signal_h gl_cv_next_signal_h='"'$gl_header'"' fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_signal_h" >&5 $as_echo "$gl_cv_next_signal_h" >&6; } fi NEXT_SIGNAL_H=$gl_cv_next_signal_h if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next' gl_next_as_first_directive='<'signal.h'>' else # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include' gl_next_as_first_directive=$gl_cv_next_signal_h fi NEXT_AS_FIRST_DIRECTIVE_SIGNAL_H=$gl_next_as_first_directive # AIX declares sig_atomic_t to already include volatile, and C89 compilers # then choke on 'volatile sig_atomic_t'. C99 requires that it compile. ac_fn_c_check_type "$LINENO" "volatile sig_atomic_t" "ac_cv_type_volatile_sig_atomic_t" " #include " if test "x$ac_cv_type_volatile_sig_atomic_t" = xyes; then : else HAVE_TYPE_VOLATILE_SIG_ATOMIC_T=0 fi ac_fn_c_check_type "$LINENO" "sighandler_t" "ac_cv_type_sighandler_t" " #include " if test "x$ac_cv_type_sighandler_t" = xyes; then : else HAVE_SIGHANDLER_T=0 fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for signbit macro" >&5 $as_echo_n "checking for signbit macro... " >&6; } if ${gl_cv_func_signbit+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : case "$host_os" in # Guess yes on glibc systems. *-gnu* | gnu*) gl_cv_func_signbit="guessing yes" ;; # Guess yes on musl systems. *-musl*) gl_cv_func_signbit="guessing yes" ;; # Guess yes on native Windows. mingw*) gl_cv_func_signbit="guessing yes" ;; # If we don't know, obey --enable-cross-guesses. *) gl_cv_func_signbit="$gl_cross_guess_normal" ;; esac else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include /* If signbit is defined as a function, don't use it, since calling it for 'float' or 'long double' arguments would involve conversions. If signbit is not declared at all but exists as a library function, don't use it, since the prototype may not match. If signbit is not declared at all but exists as a compiler built-in, don't use it, since it's preferable to use __builtin_signbit* (no warnings, no conversions). */ #ifndef signbit # error "signbit should be a macro" #endif #include /* Global variables. Needed because GCC 4 constant-folds __builtin_signbitl (literal) but cannot constant-fold __builtin_signbitl (variable). */ float vf; double vd; long double vl; int main () { /* HP cc on HP-UX 10.20 has a bug with the constant expression -0.0. So we use -p0f and -p0d instead. */ float p0f = 0.0f; float m0f = -p0f; double p0d = 0.0; double m0d = -p0d; /* On HP-UX 10.20, negating 0.0L does not yield -0.0L. So we use another constant expression instead. But that expression does not work on other platforms, such as when cross-compiling to PowerPC on Mac OS X 10.5. */ long double p0l = 0.0L; #if defined __hpux || defined __sgi long double m0l = -LDBL_MIN * LDBL_MIN; #else long double m0l = -p0l; #endif int result = 0; if (signbit (vf)) /* link check */ vf++; { float plus_inf = 1.0f / p0f; float minus_inf = -1.0f / p0f; if (!(!signbit (255.0f) && signbit (-255.0f) && !signbit (p0f) && (memcmp (&m0f, &p0f, sizeof (float)) == 0 || signbit (m0f)) && !signbit (plus_inf) && signbit (minus_inf))) result |= 1; } if (signbit (vd)) /* link check */ vd++; { double plus_inf = 1.0 / p0d; double minus_inf = -1.0 / p0d; if (!(!signbit (255.0) && signbit (-255.0) && !signbit (p0d) && (memcmp (&m0d, &p0d, sizeof (double)) == 0 || signbit (m0d)) && !signbit (plus_inf) && signbit (minus_inf))) result |= 2; } if (signbit (vl)) /* link check */ vl++; { long double plus_inf = 1.0L / p0l; long double minus_inf = -1.0L / p0l; if (signbit (255.0L)) result |= 4; if (!signbit (-255.0L)) result |= 4; if (signbit (p0l)) result |= 8; if (!(memcmp (&m0l, &p0l, sizeof (long double)) == 0 || signbit (m0l))) result |= 16; if (signbit (plus_inf)) result |= 32; if (!signbit (minus_inf)) result |= 64; } return result; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : gl_cv_func_signbit=yes else gl_cv_func_signbit=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_signbit" >&5 $as_echo "$gl_cv_func_signbit" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for signbit compiler built-ins" >&5 $as_echo_n "checking for signbit compiler built-ins... " >&6; } if ${gl_cv_func_signbit_builtins+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : case "$host_os" in # Guess yes on glibc systems. *-gnu* | gnu*) gl_cv_func_signbit_builtins="guessing yes" ;; # Guess yes on musl systems. *-musl*) gl_cv_func_signbit_builtins="guessing yes" ;; # Guess yes on mingw, no on MSVC. mingw*) if test -n "$GCC"; then gl_cv_func_signbit_builtins="guessing yes" else gl_cv_func_signbit_builtins="guessing no" fi ;; # If we don't know, obey --enable-cross-guesses. *) gl_cv_func_signbit_builtins="$gl_cross_guess_normal" ;; esac else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #if (__GNUC__ >= 4) || (__clang_major__ >= 4) # define signbit(x) \ (sizeof (x) == sizeof (long double) ? __builtin_signbitl (x) : \ sizeof (x) == sizeof (double) ? __builtin_signbit (x) : \ __builtin_signbitf (x)) #else # error "signbit should be three compiler built-ins" #endif #include /* Global variables. Needed because GCC 4 constant-folds __builtin_signbitl (literal) but cannot constant-fold __builtin_signbitl (variable). */ float vf; double vd; long double vl; int main () { /* HP cc on HP-UX 10.20 has a bug with the constant expression -0.0. So we use -p0f and -p0d instead. */ float p0f = 0.0f; float m0f = -p0f; double p0d = 0.0; double m0d = -p0d; /* On HP-UX 10.20, negating 0.0L does not yield -0.0L. So we use another constant expression instead. But that expression does not work on other platforms, such as when cross-compiling to PowerPC on Mac OS X 10.5. */ long double p0l = 0.0L; #if defined __hpux || defined __sgi long double m0l = -LDBL_MIN * LDBL_MIN; #else long double m0l = -p0l; #endif int result = 0; if (signbit (vf)) /* link check */ vf++; { float plus_inf = 1.0f / p0f; float minus_inf = -1.0f / p0f; if (!(!signbit (255.0f) && signbit (-255.0f) && !signbit (p0f) && (memcmp (&m0f, &p0f, sizeof (float)) == 0 || signbit (m0f)) && !signbit (plus_inf) && signbit (minus_inf))) result |= 1; } if (signbit (vd)) /* link check */ vd++; { double plus_inf = 1.0 / p0d; double minus_inf = -1.0 / p0d; if (!(!signbit (255.0) && signbit (-255.0) && !signbit (p0d) && (memcmp (&m0d, &p0d, sizeof (double)) == 0 || signbit (m0d)) && !signbit (plus_inf) && signbit (minus_inf))) result |= 2; } if (signbit (vl)) /* link check */ vl++; { long double plus_inf = 1.0L / p0l; long double minus_inf = -1.0L / p0l; if (signbit (255.0L)) result |= 4; if (!signbit (-255.0L)) result |= 4; if (signbit (p0l)) result |= 8; if (!(memcmp (&m0l, &p0l, sizeof (long double)) == 0 || signbit (m0l))) result |= 16; if (signbit (plus_inf)) result |= 32; if (!signbit (minus_inf)) result |= 64; } return result; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : gl_cv_func_signbit_builtins=yes else gl_cv_func_signbit_builtins=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_signbit_builtins" >&5 $as_echo "$gl_cv_func_signbit_builtins" >&6; } case "$gl_cv_func_signbit_builtins" in *yes) REPLACE_SIGNBIT_USING_BUILTINS=1 ;; *) case "$gl_cv_func_signbit" in *yes) ;; *) REPLACE_SIGNBIT=1 ;; esac ;; esac case "$host_os" in solaris*) REPLACE_SIGNBIT=1 ;; esac if test $REPLACE_SIGNBIT = 1; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking where to find the sign bit in a 'float'" >&5 $as_echo_n "checking where to find the sign bit in a 'float'... " >&6; } if ${gl_cv_cc_float_signbit+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : gl_cv_cc_float_signbit="unknown" else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #define NWORDS \ ((sizeof (float) + sizeof (unsigned int) - 1) / sizeof (unsigned int)) typedef union { float value; unsigned int word[NWORDS]; } memory_float; static memory_float plus = { 1.0f }; static memory_float minus = { -1.0f }; int main () { size_t j, k, i; unsigned int m; FILE *fp = fopen ("conftest.out", "w"); if (fp == NULL) return 1; /* Find the different bit. */ k = 0; m = 0; for (j = 0; j < NWORDS; j++) { unsigned int x = plus.word[j] ^ minus.word[j]; if ((x & (x - 1)) || (x && m)) { /* More than one bit difference. */ fprintf (fp, "unknown"); fclose (fp); return 2; } if (x) { k = j; m = x; } } if (m == 0) { /* No difference. */ fprintf (fp, "unknown"); fclose (fp); return 3; } /* Now m = plus.word[k] ^ ~minus.word[k]. */ if (plus.word[k] & ~minus.word[k]) { /* Oh? The sign bit is set in the positive and cleared in the negative numbers? */ fprintf (fp, "unknown"); fclose (fp); return 4; } for (i = 0; ; i++) if ((m >> i) & 1) break; fprintf (fp, "word %d bit %d", (int) k, (int) i); if (fclose (fp) != 0) return 5; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : gl_cv_cc_float_signbit=`cat conftest.out` else gl_cv_cc_float_signbit="unknown" fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi rm -f conftest.out fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_cc_float_signbit" >&5 $as_echo "$gl_cv_cc_float_signbit" >&6; } case "$gl_cv_cc_float_signbit" in word*bit*) word=`echo "$gl_cv_cc_float_signbit" | sed -e 's/word //' -e 's/ bit.*//'` bit=`echo "$gl_cv_cc_float_signbit" | sed -e 's/word.*bit //'` cat >>confdefs.h <<_ACEOF #define FLT_SIGNBIT_WORD $word _ACEOF cat >>confdefs.h <<_ACEOF #define FLT_SIGNBIT_BIT $bit _ACEOF ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking where to find the sign bit in a 'double'" >&5 $as_echo_n "checking where to find the sign bit in a 'double'... " >&6; } if ${gl_cv_cc_double_signbit+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : gl_cv_cc_double_signbit="unknown" else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #define NWORDS \ ((sizeof (double) + sizeof (unsigned int) - 1) / sizeof (unsigned int)) typedef union { double value; unsigned int word[NWORDS]; } memory_float; static memory_float plus = { 1.0 }; static memory_float minus = { -1.0 }; int main () { size_t j, k, i; unsigned int m; FILE *fp = fopen ("conftest.out", "w"); if (fp == NULL) return 1; /* Find the different bit. */ k = 0; m = 0; for (j = 0; j < NWORDS; j++) { unsigned int x = plus.word[j] ^ minus.word[j]; if ((x & (x - 1)) || (x && m)) { /* More than one bit difference. */ fprintf (fp, "unknown"); fclose (fp); return 2; } if (x) { k = j; m = x; } } if (m == 0) { /* No difference. */ fprintf (fp, "unknown"); fclose (fp); return 3; } /* Now m = plus.word[k] ^ ~minus.word[k]. */ if (plus.word[k] & ~minus.word[k]) { /* Oh? The sign bit is set in the positive and cleared in the negative numbers? */ fprintf (fp, "unknown"); fclose (fp); return 4; } for (i = 0; ; i++) if ((m >> i) & 1) break; fprintf (fp, "word %d bit %d", (int) k, (int) i); if (fclose (fp) != 0) return 5; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : gl_cv_cc_double_signbit=`cat conftest.out` else gl_cv_cc_double_signbit="unknown" fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi rm -f conftest.out fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_cc_double_signbit" >&5 $as_echo "$gl_cv_cc_double_signbit" >&6; } case "$gl_cv_cc_double_signbit" in word*bit*) word=`echo "$gl_cv_cc_double_signbit" | sed -e 's/word //' -e 's/ bit.*//'` bit=`echo "$gl_cv_cc_double_signbit" | sed -e 's/word.*bit //'` cat >>confdefs.h <<_ACEOF #define DBL_SIGNBIT_WORD $word _ACEOF cat >>confdefs.h <<_ACEOF #define DBL_SIGNBIT_BIT $bit _ACEOF ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking where to find the sign bit in a 'long double'" >&5 $as_echo_n "checking where to find the sign bit in a 'long double'... " >&6; } if ${gl_cv_cc_long_double_signbit+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : gl_cv_cc_long_double_signbit="unknown" else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #define NWORDS \ ((sizeof (long double) + sizeof (unsigned int) - 1) / sizeof (unsigned int)) typedef union { long double value; unsigned int word[NWORDS]; } memory_float; static memory_float plus = { 1.0L }; static memory_float minus = { -1.0L }; int main () { size_t j, k, i; unsigned int m; FILE *fp = fopen ("conftest.out", "w"); if (fp == NULL) return 1; /* Find the different bit. */ k = 0; m = 0; for (j = 0; j < NWORDS; j++) { unsigned int x = plus.word[j] ^ minus.word[j]; if ((x & (x - 1)) || (x && m)) { /* More than one bit difference. */ fprintf (fp, "unknown"); fclose (fp); return 2; } if (x) { k = j; m = x; } } if (m == 0) { /* No difference. */ fprintf (fp, "unknown"); fclose (fp); return 3; } /* Now m = plus.word[k] ^ ~minus.word[k]. */ if (plus.word[k] & ~minus.word[k]) { /* Oh? The sign bit is set in the positive and cleared in the negative numbers? */ fprintf (fp, "unknown"); fclose (fp); return 4; } for (i = 0; ; i++) if ((m >> i) & 1) break; fprintf (fp, "word %d bit %d", (int) k, (int) i); if (fclose (fp) != 0) return 5; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : gl_cv_cc_long_double_signbit=`cat conftest.out` else gl_cv_cc_long_double_signbit="unknown" fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi rm -f conftest.out fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_cc_long_double_signbit" >&5 $as_echo "$gl_cv_cc_long_double_signbit" >&6; } case "$gl_cv_cc_long_double_signbit" in word*bit*) word=`echo "$gl_cv_cc_long_double_signbit" | sed -e 's/word //' -e 's/ bit.*//'` bit=`echo "$gl_cv_cc_long_double_signbit" | sed -e 's/word.*bit //'` cat >>confdefs.h <<_ACEOF #define LDBL_SIGNBIT_WORD $word _ACEOF cat >>confdefs.h <<_ACEOF #define LDBL_SIGNBIT_BIT $bit _ACEOF ;; esac if test "$gl_cv_cc_float_signbit" = unknown; then ac_fn_c_check_decl "$LINENO" "copysignf" "ac_cv_have_decl_copysignf" "#include " if test "x$ac_cv_have_decl_copysignf" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_COPYSIGNF $ac_have_decl _ACEOF if test "$ac_cv_have_decl_copysignf" = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether copysignf can be used without linking with libm" >&5 $as_echo_n "checking whether copysignf can be used without linking with libm... " >&6; } if ${gl_cv_func_copysignf_no_libm+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include float x, y; int main () { return copysignf (x, y) < 0; ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : gl_cv_func_copysignf_no_libm=yes else gl_cv_func_copysignf_no_libm=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_copysignf_no_libm" >&5 $as_echo "$gl_cv_func_copysignf_no_libm" >&6; } if test $gl_cv_func_copysignf_no_libm = yes; then $as_echo "#define HAVE_COPYSIGNF_IN_LIBC 1" >>confdefs.h fi fi fi if test "$gl_cv_cc_double_signbit" = unknown; then ac_fn_c_check_decl "$LINENO" "copysign" "ac_cv_have_decl_copysign" "#include " if test "x$ac_cv_have_decl_copysign" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_COPYSIGN $ac_have_decl _ACEOF if test "$ac_cv_have_decl_copysign" = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether copysign can be used without linking with libm" >&5 $as_echo_n "checking whether copysign can be used without linking with libm... " >&6; } if ${gl_cv_func_copysign_no_libm+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include double x, y; int main () { return copysign (x, y) < 0; ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : gl_cv_func_copysign_no_libm=yes else gl_cv_func_copysign_no_libm=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_copysign_no_libm" >&5 $as_echo "$gl_cv_func_copysign_no_libm" >&6; } if test $gl_cv_func_copysign_no_libm = yes; then $as_echo "#define HAVE_COPYSIGN_IN_LIBC 1" >>confdefs.h fi fi fi if test "$gl_cv_cc_long_double_signbit" = unknown; then ac_fn_c_check_decl "$LINENO" "copysignl" "ac_cv_have_decl_copysignl" "#include " if test "x$ac_cv_have_decl_copysignl" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_COPYSIGNL $ac_have_decl _ACEOF if test "$ac_cv_have_decl_copysignl" = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether copysignl can be used without linking with libm" >&5 $as_echo_n "checking whether copysignl can be used without linking with libm... " >&6; } if ${gl_cv_func_copysignl_no_libm+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include long double x, y; int main () { return copysignl (x, y) < 0; ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : gl_cv_func_copysignl_no_libm=yes else gl_cv_func_copysignl_no_libm=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_copysignl_no_libm" >&5 $as_echo "$gl_cv_func_copysignl_no_libm" >&6; } if test $gl_cv_func_copysignl_no_libm = yes; then $as_echo "#define HAVE_COPYSIGNL_IN_LIBC 1" >>confdefs.h fi fi fi fi if test $REPLACE_SIGNBIT = 1; then gl_LIBOBJS="$gl_LIBOBJS signbitf.$ac_objext" gl_LIBOBJS="$gl_LIBOBJS signbitd.$ac_objext" gl_LIBOBJS="$gl_LIBOBJS signbitl.$ac_objext" fi GNULIB_SIGNBIT=1 $as_echo "#define GNULIB_TEST_SIGNBIT 1" >>confdefs.h { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sigprocmask" >&5 $as_echo_n "checking for sigprocmask... " >&6; } if ${gl_cv_func_sigprocmask_v16+:} false; then : $as_echo_n "(cached) " >&6 else if test $gl_cv_type_sigset_t = yes; then { ac_fn_c_check_func "$LINENO" "sigprocmask" "ac_cv_func_sigprocmask" if test "x$ac_cv_func_sigprocmask" = xyes; then : gl_cv_func_sigprocmask_v16=yes else gl_cv_func_sigprocmask_v16=no fi } 6>/dev/null else gl_cv_func_sigprocmask_v16=no fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_sigprocmask_v16" >&5 $as_echo "$gl_cv_func_sigprocmask_v16" >&6; } if test $gl_cv_func_sigprocmask_v16 != yes; then HAVE_POSIX_SIGNALBLOCKING=0 fi if test $HAVE_POSIX_SIGNALBLOCKING = 0; then gl_LIBOBJS="$gl_LIBOBJS sigprocmask.$ac_objext" : fi GNULIB_SIGPROCMASK=1 $as_echo "#define GNULIB_TEST_SIGPROCMASK 1" >>confdefs.h for ac_header in stdint.h do : ac_fn_c_check_header_mongrel "$LINENO" "stdint.h" "ac_cv_header_stdint_h" "$ac_includes_default" if test "x$ac_cv_header_stdint_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_STDINT_H 1 _ACEOF fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking for SIZE_MAX" >&5 $as_echo_n "checking for SIZE_MAX... " >&6; } if ${gl_cv_size_max+:} false; then : $as_echo_n "(cached) " >&6 else gl_cv_size_max=no cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #if HAVE_STDINT_H #include #endif #ifdef SIZE_MAX Found it #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "Found it" >/dev/null 2>&1; then : gl_cv_size_max=yes fi rm -f conftest* if test $gl_cv_size_max != yes; then if ac_fn_c_compute_int "$LINENO" "sizeof (size_t) * CHAR_BIT - 1" "size_t_bits_minus_1" "#include #include "; then : else size_t_bits_minus_1= fi if ac_fn_c_compute_int "$LINENO" "sizeof (size_t) <= sizeof (unsigned int)" "fits_in_uint" "#include "; then : else fits_in_uint= fi if test -n "$size_t_bits_minus_1" && test -n "$fits_in_uint"; then if test $fits_in_uint = 1; then cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include extern size_t foo; extern unsigned long foo; int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : fits_in_uint=0 fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi if test $fits_in_uint = 1; then gl_cv_size_max="(((1U << $size_t_bits_minus_1) - 1) * 2 + 1)" else gl_cv_size_max="(((1UL << $size_t_bits_minus_1) - 1) * 2 + 1)" fi else gl_cv_size_max='((size_t)~(size_t)0)' fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_size_max" >&5 $as_echo "$gl_cv_size_max" >&6; } if test "$gl_cv_size_max" != yes; then cat >>confdefs.h <<_ACEOF #define SIZE_MAX $gl_cv_size_max _ACEOF fi gl_cv_func_snprintf_usable=no for ac_func in snprintf do : ac_fn_c_check_func "$LINENO" "snprintf" "ac_cv_func_snprintf" if test "x$ac_cv_func_snprintf" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_SNPRINTF 1 _ACEOF fi done if test $ac_cv_func_snprintf = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether snprintf respects a size of 1" >&5 $as_echo_n "checking whether snprintf respects a size of 1... " >&6; } if ${gl_cv_func_snprintf_size1+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : case "$host_os" in # Guess yes on Android. linux*-android*) gl_cv_func_snprintf_size1="guessing yes" ;; # Guess yes on native Windows. mingw*) gl_cv_func_snprintf_size1="guessing yes" ;; *) gl_cv_func_snprintf_size1="guessing yes" ;; esac else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #if HAVE_SNPRINTF # define my_snprintf snprintf #else # include static int my_snprintf (char *buf, int size, const char *format, ...) { va_list args; int ret; va_start (args, format); ret = vsnprintf (buf, size, format, args); va_end (args); return ret; } #endif int main() { static char buf[8] = { 'D', 'E', 'A', 'D', 'B', 'E', 'E', 'F' }; my_snprintf (buf, 1, "%d", 12345); return buf[1] != 'E'; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : gl_cv_func_snprintf_size1=yes else gl_cv_func_snprintf_size1=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_snprintf_size1" >&5 $as_echo "$gl_cv_func_snprintf_size1" >&6; } case "$gl_cv_func_snprintf_size1" in *yes) case "$gl_cv_func_snprintf_retval_c99" in *yes) { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether printf supports POSIX/XSI format strings with positions" >&5 $as_echo_n "checking whether printf supports POSIX/XSI format strings with positions... " >&6; } if ${gl_cv_func_printf_positions+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : case "$host_os" in netbsd[1-3]* | netbsdelf[1-3]* | netbsdaout[1-3]* | netbsdcoff[1-3]*) gl_cv_func_printf_positions="guessing no";; beos*) gl_cv_func_printf_positions="guessing no";; # Guess yes on Android. linux*-android*) gl_cv_func_printf_positions="guessing yes";; # Guess no on native Windows. mingw* | pw*) gl_cv_func_printf_positions="guessing no";; *) gl_cv_func_printf_positions="guessing yes";; esac else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include /* The string "%2$d %1$d", with dollar characters protected from the shell's dollar expansion (possibly an autoconf bug). */ static char format[] = { '%', '2', '$', 'd', ' ', '%', '1', '$', 'd', '\0' }; static char buf[100]; int main () { sprintf (buf, format, 33, 55); return (strcmp (buf, "55 33") != 0); } _ACEOF if ac_fn_c_try_run "$LINENO"; then : gl_cv_func_printf_positions=yes else gl_cv_func_printf_positions=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_printf_positions" >&5 $as_echo "$gl_cv_func_printf_positions" >&6; } case "$gl_cv_func_printf_positions" in *yes) gl_cv_func_snprintf_usable=yes ;; esac ;; esac ;; esac fi if test $gl_cv_func_snprintf_usable = no; then gl_LIBOBJS="$gl_LIBOBJS snprintf.$ac_objext" if test $ac_cv_func_snprintf = yes; then REPLACE_SNPRINTF=1 else if test $ac_cv_have_decl_snprintf = yes; then REPLACE_SNPRINTF=1 fi fi : fi if test $ac_cv_have_decl_snprintf = no; then HAVE_DECL_SNPRINTF=0 fi GNULIB_SNPRINTF=1 $as_echo "#define GNULIB_TEST_SNPRINTF 1" >>confdefs.h cat >>confdefs.h <<_ACEOF #define GNULIB_SNPRINTF 1 _ACEOF gl_cv_func_snprintf_posix=no for ac_func in snprintf do : ac_fn_c_check_func "$LINENO" "snprintf" "ac_cv_func_snprintf" if test "x$ac_cv_func_snprintf" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_SNPRINTF 1 _ACEOF fi done if test $ac_cv_func_snprintf = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether snprintf truncates the result as in C99" >&5 $as_echo_n "checking whether snprintf truncates the result as in C99... " >&6; } if ${gl_cv_func_snprintf_truncation_c99+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : case "$host_os" in # Guess yes on glibc systems. *-gnu* | gnu*) gl_cv_func_snprintf_truncation_c99="guessing yes";; # Guess yes on musl systems. *-musl*) gl_cv_func_snprintf_truncation_c99="guessing yes";; # Guess yes on FreeBSD >= 5. freebsd[1-4].*) gl_cv_func_snprintf_truncation_c99="guessing no";; freebsd* | kfreebsd*) gl_cv_func_snprintf_truncation_c99="guessing yes";; # Guess yes on Mac OS X >= 10.3. darwin[1-6].*) gl_cv_func_snprintf_truncation_c99="guessing no";; darwin*) gl_cv_func_snprintf_truncation_c99="guessing yes";; # Guess yes on OpenBSD >= 3.9. openbsd[1-2].* | openbsd3.[0-8] | openbsd3.[0-8].*) gl_cv_func_snprintf_truncation_c99="guessing no";; openbsd*) gl_cv_func_snprintf_truncation_c99="guessing yes";; # Guess yes on Solaris >= 2.6. solaris2.[0-5] | solaris2.[0-5].*) gl_cv_func_snprintf_truncation_c99="guessing no";; solaris*) gl_cv_func_snprintf_truncation_c99="guessing yes";; # Guess yes on AIX >= 4. aix[1-3]*) gl_cv_func_snprintf_truncation_c99="guessing no";; aix*) gl_cv_func_snprintf_truncation_c99="guessing yes";; # Guess yes on HP-UX >= 11. hpux[7-9]* | hpux10*) gl_cv_func_snprintf_truncation_c99="guessing no";; hpux*) gl_cv_func_snprintf_truncation_c99="guessing yes";; # Guess yes on IRIX >= 6.5. irix6.5) gl_cv_func_snprintf_truncation_c99="guessing yes";; # Guess yes on OSF/1 >= 5. osf[3-4]*) gl_cv_func_snprintf_truncation_c99="guessing no";; osf*) gl_cv_func_snprintf_truncation_c99="guessing yes";; # Guess yes on NetBSD >= 3. netbsd[1-2]* | netbsdelf[1-2]* | netbsdaout[1-2]* | netbsdcoff[1-2]*) gl_cv_func_snprintf_truncation_c99="guessing no";; netbsd*) gl_cv_func_snprintf_truncation_c99="guessing yes";; # Guess yes on BeOS. beos*) gl_cv_func_snprintf_truncation_c99="guessing yes";; # Guess yes on Android. linux*-android*) gl_cv_func_snprintf_truncation_c99="guessing yes";; # Guess no on native Windows. mingw*) gl_cv_func_snprintf_truncation_c99="guessing no";; # If we don't know, obey --enable-cross-guesses. *) gl_cv_func_snprintf_truncation_c99="$gl_cross_guess_normal";; esac else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if HAVE_SNPRINTF # define my_snprintf snprintf #else # include static int my_snprintf (char *buf, int size, const char *format, ...) { va_list args; int ret; va_start (args, format); ret = vsnprintf (buf, size, format, args); va_end (args); return ret; } #endif static char buf[100]; int main () { strcpy (buf, "ABCDEF"); my_snprintf (buf, 3, "%d %d", 4567, 89); if (memcmp (buf, "45\0DEF", 6) != 0) return 1; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : gl_cv_func_snprintf_truncation_c99=yes else gl_cv_func_snprintf_truncation_c99=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_snprintf_truncation_c99" >&5 $as_echo "$gl_cv_func_snprintf_truncation_c99" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether snprintf fully supports the 'n' directive" >&5 $as_echo_n "checking whether snprintf fully supports the 'n' directive... " >&6; } if ${gl_cv_func_snprintf_directive_n+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : case "$host_os" in # Guess no on glibc when _FORTIFY_SOURCE >= 2. *-gnu* | gnu*) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #if _FORTIFY_SOURCE >= 2 error fail #endif _ACEOF if ac_fn_c_try_compile "$LINENO"; then : gl_cv_func_snprintf_directive_n="guessing yes" else gl_cv_func_snprintf_directive_n="guessing no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ;; # Guess yes on musl systems. *-musl*) gl_cv_func_snprintf_directive_n="guessing yes";; # Guess yes on FreeBSD >= 5. freebsd[1-4].*) gl_cv_func_snprintf_directive_n="guessing no";; freebsd* | kfreebsd*) gl_cv_func_snprintf_directive_n="guessing yes";; # Guess yes on Mac OS X >= 10.3. darwin[1-6].*) gl_cv_func_snprintf_directive_n="guessing no";; darwin*) gl_cv_func_snprintf_directive_n="guessing yes";; # Guess yes on Solaris >= 2.6. solaris2.[0-5] | solaris2.[0-5].*) gl_cv_func_snprintf_directive_n="guessing no";; solaris*) gl_cv_func_snprintf_directive_n="guessing yes";; # Guess yes on AIX >= 4. aix[1-3]*) gl_cv_func_snprintf_directive_n="guessing no";; aix*) gl_cv_func_snprintf_directive_n="guessing yes";; # Guess yes on IRIX >= 6.5. irix6.5) gl_cv_func_snprintf_directive_n="guessing yes";; # Guess yes on OSF/1 >= 5. osf[3-4]*) gl_cv_func_snprintf_directive_n="guessing no";; osf*) gl_cv_func_snprintf_directive_n="guessing yes";; # Guess yes on NetBSD >= 3. netbsd[1-2]* | netbsdelf[1-2]* | netbsdaout[1-2]* | netbsdcoff[1-2]*) gl_cv_func_snprintf_directive_n="guessing no";; netbsd*) gl_cv_func_snprintf_directive_n="guessing yes";; # Guess yes on BeOS. beos*) gl_cv_func_snprintf_directive_n="guessing yes";; # Guess no on Android. linux*-android*) gl_cv_func_snprintf_directive_n="guessing no";; # Guess no on native Windows. mingw*) gl_cv_func_snprintf_directive_n="guessing no";; # If we don't know, obey --enable-cross-guesses. *) gl_cv_func_snprintf_directive_n="$gl_cross_guess_normal";; esac else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if HAVE_SNPRINTF # define my_snprintf snprintf #else # include static int my_snprintf (char *buf, int size, const char *format, ...) { va_list args; int ret; va_start (args, format); ret = vsnprintf (buf, size, format, args); va_end (args); return ret; } #endif static char fmtstring[10]; static char buf[100]; int main () { int count = -1; /* Copy the format string. Some systems (glibc with _FORTIFY_SOURCE=2) support %n in format strings in read-only memory but not in writable memory. */ strcpy (fmtstring, "%d %n"); my_snprintf (buf, 4, fmtstring, 12345, &count, 33, 44, 55); if (count != 6) return 1; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : gl_cv_func_snprintf_directive_n=yes else gl_cv_func_snprintf_directive_n=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_snprintf_directive_n" >&5 $as_echo "$gl_cv_func_snprintf_directive_n" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether snprintf respects a size of 1" >&5 $as_echo_n "checking whether snprintf respects a size of 1... " >&6; } if ${gl_cv_func_snprintf_size1+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : case "$host_os" in # Guess yes on Android. linux*-android*) gl_cv_func_snprintf_size1="guessing yes" ;; # Guess yes on native Windows. mingw*) gl_cv_func_snprintf_size1="guessing yes" ;; *) gl_cv_func_snprintf_size1="guessing yes" ;; esac else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #if HAVE_SNPRINTF # define my_snprintf snprintf #else # include static int my_snprintf (char *buf, int size, const char *format, ...) { va_list args; int ret; va_start (args, format); ret = vsnprintf (buf, size, format, args); va_end (args); return ret; } #endif int main() { static char buf[8] = { 'D', 'E', 'A', 'D', 'B', 'E', 'E', 'F' }; my_snprintf (buf, 1, "%d", 12345); return buf[1] != 'E'; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : gl_cv_func_snprintf_size1=yes else gl_cv_func_snprintf_size1=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_snprintf_size1" >&5 $as_echo "$gl_cv_func_snprintf_size1" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether vsnprintf respects a zero size as in C99" >&5 $as_echo_n "checking whether vsnprintf respects a zero size as in C99... " >&6; } if ${gl_cv_func_vsnprintf_zerosize_c99+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : case "$host_os" in # Guess yes on glibc systems. *-gnu* | gnu*) gl_cv_func_vsnprintf_zerosize_c99="guessing yes";; # Guess yes on musl systems. *-musl*) gl_cv_func_vsnprintf_zerosize_c99="guessing yes";; # Guess yes on FreeBSD >= 5. freebsd[1-4].*) gl_cv_func_vsnprintf_zerosize_c99="guessing no";; freebsd* | kfreebsd*) gl_cv_func_vsnprintf_zerosize_c99="guessing yes";; # Guess yes on Mac OS X >= 10.3. darwin[1-6].*) gl_cv_func_vsnprintf_zerosize_c99="guessing no";; darwin*) gl_cv_func_vsnprintf_zerosize_c99="guessing yes";; # Guess yes on Cygwin. cygwin*) gl_cv_func_vsnprintf_zerosize_c99="guessing yes";; # Guess yes on Solaris >= 2.6. solaris2.[0-5] | solaris2.[0-5].*) gl_cv_func_vsnprintf_zerosize_c99="guessing no";; solaris*) gl_cv_func_vsnprintf_zerosize_c99="guessing yes";; # Guess yes on AIX >= 4. aix[1-3]*) gl_cv_func_vsnprintf_zerosize_c99="guessing no";; aix*) gl_cv_func_vsnprintf_zerosize_c99="guessing yes";; # Guess yes on IRIX >= 6.5. irix6.5) gl_cv_func_vsnprintf_zerosize_c99="guessing yes";; # Guess yes on NetBSD >= 3. netbsd[1-2]* | netbsdelf[1-2]* | netbsdaout[1-2]* | netbsdcoff[1-2]*) gl_cv_func_vsnprintf_zerosize_c99="guessing no";; netbsd*) gl_cv_func_vsnprintf_zerosize_c99="guessing yes";; # Guess yes on BeOS. beos*) gl_cv_func_vsnprintf_zerosize_c99="guessing yes";; # Guess yes on Android. linux*-android*) gl_cv_func_vsnprintf_zerosize_c99="guessing yes";; # Guess yes on native Windows. mingw* | pw*) gl_cv_func_vsnprintf_zerosize_c99="guessing yes";; # If we don't know, obey --enable-cross-guesses. *) gl_cv_func_vsnprintf_zerosize_c99="$gl_cross_guess_normal";; esac else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include static int my_snprintf (char *buf, int size, const char *format, ...) { va_list args; int ret; va_start (args, format); ret = vsnprintf (buf, size, format, args); va_end (args); return ret; } int main() { static char buf[8] = { 'D', 'E', 'A', 'D', 'B', 'E', 'E', 'F' }; my_snprintf (buf, 0, "%d", 12345); return buf[0] != 'D'; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : gl_cv_func_vsnprintf_zerosize_c99=yes else gl_cv_func_vsnprintf_zerosize_c99=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_vsnprintf_zerosize_c99" >&5 $as_echo "$gl_cv_func_vsnprintf_zerosize_c99" >&6; } case "$gl_cv_func_printf_sizes_c99" in *yes) case "$gl_cv_func_printf_long_double" in *yes) case "$gl_cv_func_printf_infinite" in *yes) case "$gl_cv_func_printf_infinite_long_double" in *yes) case "$gl_cv_func_printf_directive_a" in *yes) case "$gl_cv_func_printf_directive_f" in *yes) case "$gl_cv_func_printf_directive_n" in *yes) case "$gl_cv_func_printf_directive_ls" in *yes) case "$gl_cv_func_printf_positions" in *yes) case "$gl_cv_func_printf_flag_grouping" in *yes) case "$gl_cv_func_printf_flag_leftadjust" in *yes) case "$gl_cv_func_printf_flag_zero" in *yes) case "$gl_cv_func_printf_precision" in *yes) case "$gl_cv_func_printf_enomem" in *yes) case "$gl_cv_func_snprintf_truncation_c99" in *yes) case "$gl_cv_func_snprintf_retval_c99" in *yes) case "$gl_cv_func_snprintf_directive_n" in *yes) case "$gl_cv_func_snprintf_size1" in *yes) case "$gl_cv_func_vsnprintf_zerosize_c99" in *yes) # snprintf exists and is # already POSIX compliant. gl_cv_func_snprintf_posix=yes ;; esac ;; esac ;; esac ;; esac ;; esac ;; esac ;; esac ;; esac ;; esac ;; esac ;; esac ;; esac ;; esac ;; esac ;; esac ;; esac ;; esac ;; esac ;; esac fi if test $gl_cv_func_snprintf_posix = no; then case "$gl_cv_func_printf_infinite" in *yes) ;; *) $as_echo "#define NEED_PRINTF_INFINITE_DOUBLE 1" >>confdefs.h ;; esac case "$gl_cv_func_printf_long_double" in *yes) case "$gl_cv_func_printf_infinite_long_double" in *yes) ;; *) $as_echo "#define NEED_PRINTF_INFINITE_LONG_DOUBLE 1" >>confdefs.h ;; esac ;; esac case "$gl_cv_func_printf_directive_a" in *yes) ;; *) $as_echo "#define NEED_PRINTF_DIRECTIVE_A 1" >>confdefs.h for ac_func in nl_langinfo do : ac_fn_c_check_func "$LINENO" "nl_langinfo" "ac_cv_func_nl_langinfo" if test "x$ac_cv_func_nl_langinfo" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_NL_LANGINFO 1 _ACEOF fi done ;; esac case "$gl_cv_func_printf_directive_f" in *yes) ;; *) $as_echo "#define NEED_PRINTF_DIRECTIVE_F 1" >>confdefs.h ;; esac case "$gl_cv_func_printf_directive_ls" in *yes) ;; *) $as_echo "#define NEED_PRINTF_DIRECTIVE_LS 1" >>confdefs.h ;; esac case "$gl_cv_func_printf_flag_grouping" in *yes) ;; *) $as_echo "#define NEED_PRINTF_FLAG_GROUPING 1" >>confdefs.h ;; esac case "$gl_cv_func_printf_flag_leftadjust" in *yes) ;; *) $as_echo "#define NEED_PRINTF_FLAG_LEFTADJUST 1" >>confdefs.h ;; esac case "$gl_cv_func_printf_flag_zero" in *yes) ;; *) $as_echo "#define NEED_PRINTF_FLAG_ZERO 1" >>confdefs.h ;; esac case "$gl_cv_func_printf_precision" in *yes) ;; *) $as_echo "#define NEED_PRINTF_UNBOUNDED_PRECISION 1" >>confdefs.h $as_echo "#define NEED_PRINTF_DOUBLE 1" >>confdefs.h $as_echo "#define NEED_PRINTF_LONG_DOUBLE 1" >>confdefs.h ;; esac case "$gl_cv_func_printf_enomem" in *yes) ;; *) $as_echo "#define NEED_PRINTF_ENOMEM 1" >>confdefs.h $as_echo "#define NEED_PRINTF_DOUBLE 1" >>confdefs.h $as_echo "#define NEED_PRINTF_LONG_DOUBLE 1" >>confdefs.h ;; esac gl_LIBOBJS="$gl_LIBOBJS vasnprintf.$ac_objext" gl_LIBOBJS="$gl_LIBOBJS printf-args.$ac_objext" gl_LIBOBJS="$gl_LIBOBJS printf-parse.$ac_objext" gl_LIBOBJS="$gl_LIBOBJS asnprintf.$ac_objext" if test $ac_cv_func_vasnprintf = yes; then $as_echo "#define REPLACE_VASNPRINTF 1" >>confdefs.h fi ac_fn_c_check_type "$LINENO" "ptrdiff_t" "ac_cv_type_ptrdiff_t" "$ac_includes_default" if test "x$ac_cv_type_ptrdiff_t" = xyes; then : else $as_echo "#define ptrdiff_t long" >>confdefs.h fi gl_LIBOBJS="$gl_LIBOBJS snprintf.$ac_objext" if test $ac_cv_func_snprintf = yes; then REPLACE_SNPRINTF=1 else if test $ac_cv_have_decl_snprintf = yes; then REPLACE_SNPRINTF=1 fi fi : fi ac_fn_c_check_type "$LINENO" "socklen_t" "ac_cv_type_socklen_t" " /* is not needed according to POSIX, but the in i386-unknown-freebsd4.10 and powerpc-apple-darwin5.5 required it. */ #include #if HAVE_SYS_SOCKET_H # include #elif HAVE_WS2TCPIP_H # include #endif " if test "x$ac_cv_type_socklen_t" = xyes; then : else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for socklen_t equivalent" >&5 $as_echo_n "checking for socklen_t equivalent... " >&6; } if ${gl_cv_socklen_t_equiv+:} false; then : $as_echo_n "(cached) " >&6 else # Systems have either "struct sockaddr *" or # "void *" as the second argument to getpeername gl_cv_socklen_t_equiv= for arg2 in "struct sockaddr" void; do for t in int size_t "unsigned int" "long int" "unsigned long int"; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int getpeername (int, $arg2 *, $t *); int main () { $t len; getpeername (0, 0, &len); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : gl_cv_socklen_t_equiv="$t" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext test "$gl_cv_socklen_t_equiv" != "" && break done test "$gl_cv_socklen_t_equiv" != "" && break done if test "$gl_cv_socklen_t_equiv" = ""; then as_fn_error $? "Cannot find a type to use in place of socklen_t" "$LINENO" 5 fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_socklen_t_equiv" >&5 $as_echo "$gl_cv_socklen_t_equiv" >&6; } cat >>confdefs.h <<_ACEOF #define socklen_t $gl_cv_socklen_t_equiv _ACEOF fi gl_cv_func_sprintf_posix=no case "$gl_cv_func_printf_sizes_c99" in *yes) case "$gl_cv_func_printf_long_double" in *yes) case "$gl_cv_func_printf_infinite" in *yes) case "$gl_cv_func_printf_infinite_long_double" in *yes) case "$gl_cv_func_printf_directive_a" in *yes) case "$gl_cv_func_printf_directive_f" in *yes) case "$gl_cv_func_printf_directive_n" in *yes) case "$gl_cv_func_printf_directive_ls" in *yes) case "$gl_cv_func_printf_positions" in *yes) case "$gl_cv_func_printf_flag_grouping" in *yes) case "$gl_cv_func_printf_flag_leftadjust" in *yes) case "$gl_cv_func_printf_flag_zero" in *yes) case "$gl_cv_func_printf_precision" in *yes) case "$gl_cv_func_printf_enomem" in *yes) # sprintf exists and is # already POSIX compliant. gl_cv_func_sprintf_posix=yes ;; esac ;; esac ;; esac ;; esac ;; esac ;; esac ;; esac ;; esac ;; esac ;; esac ;; esac ;; esac ;; esac ;; esac if test $gl_cv_func_sprintf_posix = no; then case "$gl_cv_func_printf_infinite" in *yes) ;; *) $as_echo "#define NEED_PRINTF_INFINITE_DOUBLE 1" >>confdefs.h ;; esac case "$gl_cv_func_printf_long_double" in *yes) case "$gl_cv_func_printf_infinite_long_double" in *yes) ;; *) $as_echo "#define NEED_PRINTF_INFINITE_LONG_DOUBLE 1" >>confdefs.h ;; esac ;; esac case "$gl_cv_func_printf_directive_a" in *yes) ;; *) $as_echo "#define NEED_PRINTF_DIRECTIVE_A 1" >>confdefs.h for ac_func in nl_langinfo do : ac_fn_c_check_func "$LINENO" "nl_langinfo" "ac_cv_func_nl_langinfo" if test "x$ac_cv_func_nl_langinfo" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_NL_LANGINFO 1 _ACEOF fi done ;; esac case "$gl_cv_func_printf_directive_f" in *yes) ;; *) $as_echo "#define NEED_PRINTF_DIRECTIVE_F 1" >>confdefs.h ;; esac case "$gl_cv_func_printf_directive_ls" in *yes) ;; *) $as_echo "#define NEED_PRINTF_DIRECTIVE_LS 1" >>confdefs.h ;; esac case "$gl_cv_func_printf_flag_grouping" in *yes) ;; *) $as_echo "#define NEED_PRINTF_FLAG_GROUPING 1" >>confdefs.h ;; esac case "$gl_cv_func_printf_flag_leftadjust" in *yes) ;; *) $as_echo "#define NEED_PRINTF_FLAG_LEFTADJUST 1" >>confdefs.h ;; esac case "$gl_cv_func_printf_flag_zero" in *yes) ;; *) $as_echo "#define NEED_PRINTF_FLAG_ZERO 1" >>confdefs.h ;; esac case "$gl_cv_func_printf_precision" in *yes) ;; *) $as_echo "#define NEED_PRINTF_UNBOUNDED_PRECISION 1" >>confdefs.h $as_echo "#define NEED_PRINTF_DOUBLE 1" >>confdefs.h $as_echo "#define NEED_PRINTF_LONG_DOUBLE 1" >>confdefs.h ;; esac case "$gl_cv_func_printf_enomem" in *yes) ;; *) $as_echo "#define NEED_PRINTF_ENOMEM 1" >>confdefs.h $as_echo "#define NEED_PRINTF_DOUBLE 1" >>confdefs.h $as_echo "#define NEED_PRINTF_LONG_DOUBLE 1" >>confdefs.h ;; esac gl_LIBOBJS="$gl_LIBOBJS vasnprintf.$ac_objext" gl_LIBOBJS="$gl_LIBOBJS printf-args.$ac_objext" gl_LIBOBJS="$gl_LIBOBJS printf-parse.$ac_objext" gl_LIBOBJS="$gl_LIBOBJS asnprintf.$ac_objext" if test $ac_cv_func_vasnprintf = yes; then $as_echo "#define REPLACE_VASNPRINTF 1" >>confdefs.h fi ac_fn_c_check_type "$LINENO" "ptrdiff_t" "ac_cv_type_ptrdiff_t" "$ac_includes_default" if test "x$ac_cv_type_ptrdiff_t" = xyes; then : else $as_echo "#define ptrdiff_t long" >>confdefs.h fi gl_LIBOBJS="$gl_LIBOBJS sprintf.$ac_objext" REPLACE_SPRINTF=1 : fi GNULIB_SPRINTF_POSIX=1 $as_echo "#define GNULIB_TEST_SPRINTF_POSIX 1" >>confdefs.h { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ssize_t" >&5 $as_echo_n "checking for ssize_t... " >&6; } if ${gt_cv_ssize_t+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { int x = sizeof (ssize_t *) + sizeof (ssize_t); return !x; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : gt_cv_ssize_t=yes else gt_cv_ssize_t=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_ssize_t" >&5 $as_echo "$gt_cv_ssize_t" >&6; } if test $gt_cv_ssize_t = no; then $as_echo "#define ssize_t int" >>confdefs.h fi case "$host_os" in mingw*) REPLACE_STAT=1 ;; *) { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stat handles trailing slashes on files" >&5 $as_echo_n "checking whether stat handles trailing slashes on files... " >&6; } if ${gl_cv_func_stat_file_slash+:} false; then : $as_echo_n "(cached) " >&6 else touch conftest.tmp # Assume that if we have lstat, we can also check symlinks. if test $ac_cv_func_lstat = yes; then ln -s conftest.tmp conftest.lnk fi if test "$cross_compiling" = yes; then : case "$host_os" in # Guess yes on Linux systems. linux-* | linux) gl_cv_func_stat_file_slash="guessing yes" ;; # Guess yes on glibc systems. *-gnu* | gnu*) gl_cv_func_stat_file_slash="guessing yes" ;; # If we don't know, obey --enable-cross-guesses. *) gl_cv_func_stat_file_slash="$gl_cross_guess_normal" ;; esac else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { int result = 0; struct stat st; if (!stat ("conftest.tmp/", &st)) result |= 1; #if HAVE_LSTAT if (!stat ("conftest.lnk/", &st)) result |= 2; #endif return result; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : gl_cv_func_stat_file_slash=yes else gl_cv_func_stat_file_slash=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi rm -f conftest.tmp conftest.lnk fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_stat_file_slash" >&5 $as_echo "$gl_cv_func_stat_file_slash" >&6; } case $gl_cv_func_stat_file_slash in *no) REPLACE_STAT=1 $as_echo "#define REPLACE_FUNC_STAT_FILE 1" >>confdefs.h ;; esac case $host_os in solaris*) REPLACE_FSTAT=1 ;; esac ;; esac if test $REPLACE_STAT = 1; then gl_LIBOBJS="$gl_LIBOBJS stat.$ac_objext" case "$host_os" in mingw*) gl_LIBOBJS="$gl_LIBOBJS stat-w32.$ac_objext" ;; esac : fi GNULIB_STAT=1 $as_echo "#define GNULIB_TEST_STAT 1" >>confdefs.h ac_fn_c_check_member "$LINENO" "struct stat" "st_atim.tv_nsec" "ac_cv_member_struct_stat_st_atim_tv_nsec" "#include #include " if test "x$ac_cv_member_struct_stat_st_atim_tv_nsec" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_STRUCT_STAT_ST_ATIM_TV_NSEC 1 _ACEOF { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether struct stat.st_atim is of type struct timespec" >&5 $as_echo_n "checking whether struct stat.st_atim is of type struct timespec... " >&6; } if ${ac_cv_typeof_struct_stat_st_atim_is_struct_timespec+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if HAVE_SYS_TIME_H # include #endif #include struct timespec ts; struct stat st; int main () { st.st_atim = ts; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_typeof_struct_stat_st_atim_is_struct_timespec=yes else ac_cv_typeof_struct_stat_st_atim_is_struct_timespec=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_typeof_struct_stat_st_atim_is_struct_timespec" >&5 $as_echo "$ac_cv_typeof_struct_stat_st_atim_is_struct_timespec" >&6; } if test $ac_cv_typeof_struct_stat_st_atim_is_struct_timespec = yes; then $as_echo "#define TYPEOF_STRUCT_STAT_ST_ATIM_IS_STRUCT_TIMESPEC 1" >>confdefs.h fi else ac_fn_c_check_member "$LINENO" "struct stat" "st_atimespec.tv_nsec" "ac_cv_member_struct_stat_st_atimespec_tv_nsec" "#include #include " if test "x$ac_cv_member_struct_stat_st_atimespec_tv_nsec" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_STRUCT_STAT_ST_ATIMESPEC_TV_NSEC 1 _ACEOF else ac_fn_c_check_member "$LINENO" "struct stat" "st_atimensec" "ac_cv_member_struct_stat_st_atimensec" "#include #include " if test "x$ac_cv_member_struct_stat_st_atimensec" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_STRUCT_STAT_ST_ATIMENSEC 1 _ACEOF else ac_fn_c_check_member "$LINENO" "struct stat" "st_atim.st__tim.tv_nsec" "ac_cv_member_struct_stat_st_atim_st__tim_tv_nsec" "#include #include " if test "x$ac_cv_member_struct_stat_st_atim_st__tim_tv_nsec" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_STRUCT_STAT_ST_ATIM_ST__TIM_TV_NSEC 1 _ACEOF fi fi fi fi ac_fn_c_check_member "$LINENO" "struct stat" "st_birthtimespec.tv_nsec" "ac_cv_member_struct_stat_st_birthtimespec_tv_nsec" "#include #include " if test "x$ac_cv_member_struct_stat_st_birthtimespec_tv_nsec" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_STRUCT_STAT_ST_BIRTHTIMESPEC_TV_NSEC 1 _ACEOF else ac_fn_c_check_member "$LINENO" "struct stat" "st_birthtimensec" "ac_cv_member_struct_stat_st_birthtimensec" "#include #include " if test "x$ac_cv_member_struct_stat_st_birthtimensec" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_STRUCT_STAT_ST_BIRTHTIMENSEC 1 _ACEOF else ac_fn_c_check_member "$LINENO" "struct stat" "st_birthtim.tv_nsec" "ac_cv_member_struct_stat_st_birthtim_tv_nsec" "#include #include " if test "x$ac_cv_member_struct_stat_st_birthtim_tv_nsec" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_STRUCT_STAT_ST_BIRTHTIM_TV_NSEC 1 _ACEOF fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working stdalign.h" >&5 $as_echo_n "checking for working stdalign.h... " >&6; } if ${gl_cv_header_working_stdalign_h+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include /* Test that alignof yields a result consistent with offsetof. This catches GCC bug 52023 . */ #ifdef __cplusplus template struct alignof_helper { char a; t b; }; # define ao(type) offsetof (alignof_helper, b) #else # define ao(type) offsetof (struct { char a; type b; }, b) #endif char test_double[ao (double) % _Alignof (double) == 0 ? 1 : -1]; char test_long[ao (long int) % _Alignof (long int) == 0 ? 1 : -1]; char test_alignof[alignof (double) == _Alignof (double) ? 1 : -1]; /* Test _Alignas only on platforms where gnulib can help. */ #if \ ((defined __cplusplus && 201103 <= __cplusplus) \ || (defined __APPLE__ && defined __MACH__ \ ? 4 < __GNUC__ + (1 <= __GNUC_MINOR__) \ : __GNUC__) \ || (__ia64 && (61200 <= __HP_cc || 61200 <= __HP_aCC)) \ || __ICC || 0x590 <= __SUNPRO_C || 0x0600 <= __xlC__ \ || 1300 <= _MSC_VER) struct alignas_test { char c; char alignas (8) alignas_8; }; char test_alignas[offsetof (struct alignas_test, alignas_8) == 8 ? 1 : -1]; #endif int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : gl_cv_header_working_stdalign_h=yes else gl_cv_header_working_stdalign_h=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_working_stdalign_h" >&5 $as_echo "$gl_cv_header_working_stdalign_h" >&6; } if test $gl_cv_header_working_stdalign_h = yes; then STDALIGN_H='' else STDALIGN_H='stdalign.h' fi if test -n "$STDALIGN_H"; then GL_GENERATE_STDALIGN_H_TRUE= GL_GENERATE_STDALIGN_H_FALSE='#' else GL_GENERATE_STDALIGN_H_TRUE='#' GL_GENERATE_STDALIGN_H_FALSE= fi STDARG_H='' NEXT_STDARG_H='' { $as_echo "$as_me:${as_lineno-$LINENO}: checking for va_copy" >&5 $as_echo_n "checking for va_copy... " >&6; } if ${gl_cv_func_va_copy+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { #ifndef va_copy void (*func) (va_list, va_list) = va_copy; #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : gl_cv_func_va_copy=yes else gl_cv_func_va_copy=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_va_copy" >&5 $as_echo "$gl_cv_func_va_copy" >&6; } if test $gl_cv_func_va_copy = no; then cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #if defined _AIX && !defined __GNUC__ AIX vaccine #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "vaccine" >/dev/null 2>&1; then : gl_aixcc=yes else gl_aixcc=no fi rm -f conftest* if test $gl_aixcc = yes; then STDARG_H=stdarg.h if test $gl_cv_have_include_next = yes; then gl_cv_next_stdarg_h='<'stdarg.h'>' else { $as_echo "$as_me:${as_lineno-$LINENO}: checking absolute name of " >&5 $as_echo_n "checking absolute name of ... " >&6; } if ${gl_cv_next_stdarg_h+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF case "$host_os" in aix*) gl_absname_cpp="$ac_cpp -C" ;; *) gl_absname_cpp="$ac_cpp" ;; esac case "$host_os" in mingw*) gl_dirsep_regex='[/\\]' ;; *) gl_dirsep_regex='\/' ;; esac gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g' gl_header_literal_regex=`echo 'stdarg.h' \ | sed -e "$gl_make_literal_regex_sed"` gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{ s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/ s|^/[^/]|//&| p q }' gl_cv_absolute_stdarg_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 | sed -n "$gl_absolute_header_sed"` gl_header=$gl_cv_absolute_stdarg_h gl_cv_next_stdarg_h='"'$gl_header'"' fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_stdarg_h" >&5 $as_echo "$gl_cv_next_stdarg_h" >&6; } fi NEXT_STDARG_H=$gl_cv_next_stdarg_h if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next' gl_next_as_first_directive='<'stdarg.h'>' else # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include' gl_next_as_first_directive=$gl_cv_next_stdarg_h fi NEXT_AS_FIRST_DIRECTIVE_STDARG_H=$gl_next_as_first_directive if test "$gl_cv_next_stdarg_h" = '""'; then gl_cv_next_stdarg_h='"///usr/include/stdarg.h"' NEXT_STDARG_H="$gl_cv_next_stdarg_h" fi else saved_as_echo_n="$as_echo_n" as_echo_n=':' if ${gl_cv_func___va_copy+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { #ifndef __va_copy error, bail out #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : gl_cv_func___va_copy=yes else gl_cv_func___va_copy=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi as_echo_n="$saved_as_echo_n" if test $gl_cv_func___va_copy = yes; then $as_echo "#define va_copy __va_copy" >>confdefs.h else $as_echo "#define va_copy gl_va_copy" >>confdefs.h fi fi fi if test -n "$STDARG_H"; then GL_GENERATE_STDARG_H_TRUE= GL_GENERATE_STDARG_H_FALSE='#' else GL_GENERATE_STDARG_H_TRUE='#' GL_GENERATE_STDARG_H_FALSE= fi if test "$ac_cv_header_stdbool_h" = yes; then case "$host_os" in solaris*) if test -z "$GCC"; then STDBOOL_H='stdbool.h' else STDBOOL_H='' fi ;; *) STDBOOL_H='' ;; esac else STDBOOL_H='stdbool.h' fi if test -n "$STDBOOL_H"; then GL_GENERATE_STDBOOL_H_TRUE= GL_GENERATE_STDBOOL_H_FALSE='#' else GL_GENERATE_STDBOOL_H_TRUE='#' GL_GENERATE_STDBOOL_H_FALSE= fi if test "$ac_cv_type__Bool" = yes; then HAVE__BOOL=1 else HAVE__BOOL=0 fi STDDEF_H= { $as_echo "$as_me:${as_lineno-$LINENO}: checking for good max_align_t" >&5 $as_echo_n "checking for good max_align_t... " >&6; } if ${gl_cv_type_max_align_t+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include unsigned int s = sizeof (max_align_t); #if defined __GNUC__ || defined __IBM__ALIGNOF__ int check1[2 * (__alignof__ (double) <= __alignof__ (max_align_t)) - 1]; int check2[2 * (__alignof__ (long double) <= __alignof__ (max_align_t)) - 1]; #endif int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : gl_cv_type_max_align_t=yes else gl_cv_type_max_align_t=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_type_max_align_t" >&5 $as_echo "$gl_cv_type_max_align_t" >&6; } if test $gl_cv_type_max_align_t = no; then HAVE_MAX_ALIGN_T=0 STDDEF_H=stddef.h fi if test $gt_cv_c_wchar_t = no; then HAVE_WCHAR_T=0 STDDEF_H=stddef.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether NULL can be used in arbitrary expressions" >&5 $as_echo_n "checking whether NULL can be used in arbitrary expressions... " >&6; } if ${gl_cv_decl_null_works+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int test[2 * (sizeof NULL == sizeof (void *)) -1]; int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : gl_cv_decl_null_works=yes else gl_cv_decl_null_works=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_decl_null_works" >&5 $as_echo "$gl_cv_decl_null_works" >&6; } if test $gl_cv_decl_null_works = no; then REPLACE_NULL=1 STDDEF_H=stddef.h fi if test -n "$STDDEF_H"; then GL_GENERATE_STDDEF_H_TRUE= GL_GENERATE_STDDEF_H_FALSE='#' else GL_GENERATE_STDDEF_H_TRUE='#' GL_GENERATE_STDDEF_H_FALSE= fi if test -n "$STDDEF_H"; then if test $gl_cv_have_include_next = yes; then gl_cv_next_stddef_h='<'stddef.h'>' else { $as_echo "$as_me:${as_lineno-$LINENO}: checking absolute name of " >&5 $as_echo_n "checking absolute name of ... " >&6; } if ${gl_cv_next_stddef_h+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF case "$host_os" in aix*) gl_absname_cpp="$ac_cpp -C" ;; *) gl_absname_cpp="$ac_cpp" ;; esac case "$host_os" in mingw*) gl_dirsep_regex='[/\\]' ;; *) gl_dirsep_regex='\/' ;; esac gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g' gl_header_literal_regex=`echo 'stddef.h' \ | sed -e "$gl_make_literal_regex_sed"` gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{ s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/ s|^/[^/]|//&| p q }' gl_cv_absolute_stddef_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 | sed -n "$gl_absolute_header_sed"` gl_header=$gl_cv_absolute_stddef_h gl_cv_next_stddef_h='"'$gl_header'"' fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_stddef_h" >&5 $as_echo "$gl_cv_next_stddef_h" >&6; } fi NEXT_STDDEF_H=$gl_cv_next_stddef_h if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next' gl_next_as_first_directive='<'stddef.h'>' else # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include' gl_next_as_first_directive=$gl_cv_next_stddef_h fi NEXT_AS_FIRST_DIRECTIVE_STDDEF_H=$gl_next_as_first_directive fi $as_echo "#define __USE_MINGW_ANSI_STDIO 1" >>confdefs.h if test $gl_cv_have_include_next = yes; then gl_cv_next_stdio_h='<'stdio.h'>' else { $as_echo "$as_me:${as_lineno-$LINENO}: checking absolute name of " >&5 $as_echo_n "checking absolute name of ... " >&6; } if ${gl_cv_next_stdio_h+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF case "$host_os" in aix*) gl_absname_cpp="$ac_cpp -C" ;; *) gl_absname_cpp="$ac_cpp" ;; esac case "$host_os" in mingw*) gl_dirsep_regex='[/\\]' ;; *) gl_dirsep_regex='\/' ;; esac gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g' gl_header_literal_regex=`echo 'stdio.h' \ | sed -e "$gl_make_literal_regex_sed"` gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{ s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/ s|^/[^/]|//&| p q }' gl_cv_absolute_stdio_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 | sed -n "$gl_absolute_header_sed"` gl_header=$gl_cv_absolute_stdio_h gl_cv_next_stdio_h='"'$gl_header'"' fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_stdio_h" >&5 $as_echo "$gl_cv_next_stdio_h" >&6; } fi NEXT_STDIO_H=$gl_cv_next_stdio_h if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next' gl_next_as_first_directive='<'stdio.h'>' else # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include' gl_next_as_first_directive=$gl_cv_next_stdio_h fi NEXT_AS_FIRST_DIRECTIVE_STDIO_H=$gl_next_as_first_directive { $as_echo "$as_me:${as_lineno-$LINENO}: checking which flavor of printf attribute matches inttypes macros" >&5 $as_echo_n "checking which flavor of printf attribute matches inttypes macros... " >&6; } if ${gl_cv_func_printf_attribute_flavor+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define __STDC_FORMAT_MACROS 1 #include #include /* For non-mingw systems, compilation will trivially succeed. For mingw, compilation will succeed for older mingw (system printf, "I64d") and fail for newer mingw (gnu printf, "lld"). */ #if (defined _WIN32 && ! defined __CYGWIN__) && \ (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4)) extern char PRIdMAX_probe[sizeof PRIdMAX == sizeof "I64d" ? 1 : -1]; #endif int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : gl_cv_func_printf_attribute_flavor=system else gl_cv_func_printf_attribute_flavor=gnu fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_printf_attribute_flavor" >&5 $as_echo "$gl_cv_func_printf_attribute_flavor" >&6; } if test "$gl_cv_func_printf_attribute_flavor" = gnu; then $as_echo "#define GNULIB_PRINTF_ATTRIBUTE_FLAVOR_GNU 1" >>confdefs.h fi GNULIB_FSCANF=1 cat >>confdefs.h <<_ACEOF #define GNULIB_FSCANF 1 _ACEOF GNULIB_SCANF=1 cat >>confdefs.h <<_ACEOF #define GNULIB_SCANF 1 _ACEOF GNULIB_FGETC=1 GNULIB_GETC=1 GNULIB_GETCHAR=1 GNULIB_FGETS=1 GNULIB_FREAD=1 GNULIB_FPRINTF=1 GNULIB_PRINTF=1 GNULIB_VFPRINTF=1 GNULIB_VPRINTF=1 GNULIB_FPUTC=1 GNULIB_PUTC=1 GNULIB_PUTCHAR=1 GNULIB_FPUTS=1 GNULIB_PUTS=1 GNULIB_FWRITE=1 if test $gl_cv_have_include_next = yes; then gl_cv_next_stdlib_h='<'stdlib.h'>' else { $as_echo "$as_me:${as_lineno-$LINENO}: checking absolute name of " >&5 $as_echo_n "checking absolute name of ... " >&6; } if ${gl_cv_next_stdlib_h+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF case "$host_os" in aix*) gl_absname_cpp="$ac_cpp -C" ;; *) gl_absname_cpp="$ac_cpp" ;; esac case "$host_os" in mingw*) gl_dirsep_regex='[/\\]' ;; *) gl_dirsep_regex='\/' ;; esac gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g' gl_header_literal_regex=`echo 'stdlib.h' \ | sed -e "$gl_make_literal_regex_sed"` gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{ s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/ s|^/[^/]|//&| p q }' gl_cv_absolute_stdlib_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 | sed -n "$gl_absolute_header_sed"` gl_header=$gl_cv_absolute_stdlib_h gl_cv_next_stdlib_h='"'$gl_header'"' fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_stdlib_h" >&5 $as_echo "$gl_cv_next_stdlib_h" >&6; } fi NEXT_STDLIB_H=$gl_cv_next_stdlib_h if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next' gl_next_as_first_directive='<'stdlib.h'>' else # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include' gl_next_as_first_directive=$gl_cv_next_stdlib_h fi NEXT_AS_FIRST_DIRECTIVE_STDLIB_H=$gl_next_as_first_directive for ac_func in stpcpy do : ac_fn_c_check_func "$LINENO" "stpcpy" "ac_cv_func_stpcpy" if test "x$ac_cv_func_stpcpy" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_STPCPY 1 _ACEOF fi done if test $ac_cv_func_stpcpy = no; then HAVE_STPCPY=0 fi if test $HAVE_STPCPY = 0; then gl_LIBOBJS="$gl_LIBOBJS stpcpy.$ac_objext" : fi GNULIB_STPCPY=1 $as_echo "#define GNULIB_TEST_STPCPY 1" >>confdefs.h for ac_func in strcasecmp do : ac_fn_c_check_func "$LINENO" "strcasecmp" "ac_cv_func_strcasecmp" if test "x$ac_cv_func_strcasecmp" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_STRCASECMP 1 _ACEOF fi done if test $ac_cv_func_strcasecmp = no; then HAVE_STRCASECMP=0 fi for ac_func in strncasecmp do : ac_fn_c_check_func "$LINENO" "strncasecmp" "ac_cv_func_strncasecmp" if test "x$ac_cv_func_strncasecmp" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_STRNCASECMP 1 _ACEOF fi done if test $ac_cv_func_strncasecmp = yes; then HAVE_STRNCASECMP=1 else HAVE_STRNCASECMP=0 fi ac_fn_c_check_decl "$LINENO" "strncasecmp" "ac_cv_have_decl_strncasecmp" "$ac_includes_default" if test "x$ac_cv_have_decl_strncasecmp" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_STRNCASECMP $ac_have_decl _ACEOF if test $ac_cv_have_decl_strncasecmp = no; then HAVE_DECL_STRNCASECMP=0 fi if test $HAVE_STRCASECMP = 0; then gl_LIBOBJS="$gl_LIBOBJS strcasecmp.$ac_objext" : fi if test $HAVE_STRNCASECMP = 0; then gl_LIBOBJS="$gl_LIBOBJS strncasecmp.$ac_objext" : fi if test $HAVE_STRCASESTR = 1 && test $REPLACE_STRCASESTR = 0; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether strcasestr works in linear time" >&5 $as_echo_n "checking whether strcasestr works in linear time... " >&6; } if ${gl_cv_func_strcasestr_linear+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #ifdef __GNU_LIBRARY__ #if ((__GLIBC__ == 2 && __GLIBC_MINOR__ > 12) || (__GLIBC__ > 2)) \ && !defined __UCLIBC__ Lucky user #endif #endif #ifdef __CYGWIN__ #include #if CYGWIN_VERSION_DLL_COMBINED > CYGWIN_VERSION_DLL_MAKE_COMBINED (1007, 7) Lucky user #endif #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "Lucky user" >/dev/null 2>&1; then : gl_cv_func_strcasestr_linear="guessing yes" else gl_cv_func_strcasestr_linear="$gl_cross_guess_normal" fi rm -f conftest* else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include /* for signal */ #include /* for strcasestr */ #include /* for malloc */ #include /* for alarm */ static void quit (int sig) { _exit (sig + 128); } int main () { int result = 0; size_t m = 1000000; char *haystack = (char *) malloc (2 * m + 2); char *needle = (char *) malloc (m + 2); /* Failure to compile this test due to missing alarm is okay, since all such platforms (mingw) also lack strcasestr. */ signal (SIGALRM, quit); alarm (5); /* Check for quadratic performance. */ if (haystack && needle) { memset (haystack, 'A', 2 * m); haystack[2 * m] = 'B'; haystack[2 * m + 1] = 0; memset (needle, 'A', m); needle[m] = 'B'; needle[m + 1] = 0; if (!strcasestr (haystack, needle)) result |= 1; } /* Free allocated memory, in case some sanitizer is watching. */ free (haystack); free (needle); return result; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : gl_cv_func_strcasestr_linear=yes else gl_cv_func_strcasestr_linear=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_strcasestr_linear" >&5 $as_echo "$gl_cv_func_strcasestr_linear" >&6; } case "$gl_cv_func_strcasestr_linear" in *yes) ;; *) REPLACE_STRCASESTR=1 ;; esac fi if test $HAVE_STRCASESTR = 0 || test $REPLACE_STRCASESTR = 1; then gl_LIBOBJS="$gl_LIBOBJS strcasestr.$ac_objext" : fi for ac_func in strcasestr do : ac_fn_c_check_func "$LINENO" "strcasestr" "ac_cv_func_strcasestr" if test "x$ac_cv_func_strcasestr" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_STRCASESTR 1 _ACEOF fi done if test $ac_cv_func_strcasestr = no; then HAVE_STRCASESTR=0 else if test $REPLACE_MEMCHR = 1; then REPLACE_STRCASESTR=1 else { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether strcasestr works" >&5 $as_echo_n "checking whether strcasestr works... " >&6; } if ${gl_cv_func_strcasestr_works_always+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __GNU_LIBRARY__ #include #if ((__GLIBC__ == 2 && __GLIBC_MINOR__ > 12) || (__GLIBC__ > 2)) \ || defined __UCLIBC__ Lucky user #endif #elif defined __CYGWIN__ #include #if CYGWIN_VERSION_DLL_COMBINED > CYGWIN_VERSION_DLL_MAKE_COMBINED (1007, 7) Lucky user #endif #else Lucky user #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "Lucky user" >/dev/null 2>&1; then : gl_cv_func_strcasestr_works_always="guessing yes" else gl_cv_func_strcasestr_works_always="$gl_cross_guess_normal" fi rm -f conftest* else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include /* for strcasestr */ #ifdef __GNU_LIBRARY__ #include #if __GLIBC__ == 2 && __GLIBC_MINOR__ == 28 Unlucky user #endif #endif #define P "_EF_BF_BD" #define HAYSTACK "F_BD_CE_BD" P P P P "_C3_88_20" P P P "_C3_A7_20" P #define NEEDLE P P P P P int main () { return !!strcasestr (HAYSTACK, NEEDLE); ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : gl_cv_func_strcasestr_works_always=yes else gl_cv_func_strcasestr_works_always=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_strcasestr_works_always" >&5 $as_echo "$gl_cv_func_strcasestr_works_always" >&6; } case "$gl_cv_func_strcasestr_works_always" in *yes) ;; *) REPLACE_STRCASESTR=1 ;; esac fi fi if test $HAVE_STRCASESTR = 0 || test $REPLACE_STRCASESTR = 1; then gl_LIBOBJS="$gl_LIBOBJS strcasestr.$ac_objext" : fi GNULIB_STRCASESTR=1 $as_echo "#define GNULIB_TEST_STRCASESTR 1" >>confdefs.h if test $ac_cv_func_strdup = yes; then if test $gl_cv_func_malloc_posix != yes; then REPLACE_STRDUP=1 fi fi if test $ac_cv_have_decl_strdup = no; then HAVE_DECL_STRDUP=0 fi if test $ac_cv_func_strdup = no || test $REPLACE_STRDUP = 1; then gl_LIBOBJS="$gl_LIBOBJS strdup.$ac_objext" : fi GNULIB_STRDUP=1 $as_echo "#define GNULIB_TEST_STRDUP 1" >>confdefs.h if test "$ERRNO_H:$REPLACE_STRERROR_0" = :0; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working strerror function" >&5 $as_echo_n "checking for working strerror function... " >&6; } if ${gl_cv_func_working_strerror+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : case "$host_os" in # Guess yes on glibc systems. *-gnu* | gnu*) gl_cv_func_working_strerror="guessing yes" ;; # Guess yes on musl systems. *-musl*) gl_cv_func_working_strerror="guessing yes" ;; # If we don't know, obey --enable-cross-guesses. *) gl_cv_func_working_strerror="$gl_cross_guess_normal" ;; esac else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { if (!*strerror (-2)) return 1; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : gl_cv_func_working_strerror=yes else gl_cv_func_working_strerror=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_working_strerror" >&5 $as_echo "$gl_cv_func_working_strerror" >&6; } case "$gl_cv_func_working_strerror" in *yes) ;; *) REPLACE_STRERROR=1 ;; esac else REPLACE_STRERROR=1 fi if test $REPLACE_STRERROR = 1; then gl_LIBOBJS="$gl_LIBOBJS strerror.$ac_objext" fi cat >>confdefs.h <<_ACEOF #define GNULIB_STRERROR 1 _ACEOF GNULIB_STRERROR=1 $as_echo "#define GNULIB_TEST_STRERROR 1" >>confdefs.h if test -n "$ERRNO_H" || test $REPLACE_STRERROR_0 = 1; then gl_LIBOBJS="$gl_LIBOBJS strerror-override.$ac_objext" if test $ac_cv_header_sys_socket_h != yes; then for ac_header in winsock2.h do : ac_fn_c_check_header_mongrel "$LINENO" "winsock2.h" "ac_cv_header_winsock2_h" "$ac_includes_default" if test "x$ac_cv_header_winsock2_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_WINSOCK2_H 1 _ACEOF fi done fi if test "$ac_cv_header_winsock2_h" = yes; then HAVE_WINSOCK2_H=1 UNISTD_H_HAVE_WINSOCK2_H=1 SYS_IOCTL_H_HAVE_WINSOCK2_H=1 else HAVE_WINSOCK2_H=0 fi fi if test $REPLACE_STRNCAT = 1; then gl_LIBOBJS="$gl_LIBOBJS strncat.$ac_objext" : fi GNULIB_STRNCAT=1 $as_echo "#define GNULIB_TEST_STRNCAT 1" >>confdefs.h if test $ac_cv_have_decl_strndup = no; then HAVE_DECL_STRNDUP=0 fi if test $ac_cv_func_strndup = yes; then HAVE_STRNDUP=1 # AIX 4.3.3, AIX 5.1 have a function that fails to add the terminating '\0'. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working strndup" >&5 $as_echo_n "checking for working strndup... " >&6; } if ${gl_cv_func_strndup_works+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : case $host_os in aix | aix[3-6]*) gl_cv_func_strndup_works="guessing no";; *) gl_cv_func_strndup_works="guessing yes";; esac else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { #if !HAVE_DECL_STRNDUP extern #ifdef __cplusplus "C" #endif char *strndup (const char *, size_t); #endif int result; char *s; s = strndup ("some longer string", 15); free (s); s = strndup ("shorter string", 13); result = s[13] != '\0'; free (s); return result; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : gl_cv_func_strndup_works=yes else gl_cv_func_strndup_works=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_strndup_works" >&5 $as_echo "$gl_cv_func_strndup_works" >&6; } case $gl_cv_func_strndup_works in *no) REPLACE_STRNDUP=1 ;; esac else HAVE_STRNDUP=0 fi if test $HAVE_STRNDUP = 0 || test $REPLACE_STRNDUP = 1; then gl_LIBOBJS="$gl_LIBOBJS strndup.$ac_objext" fi GNULIB_STRNDUP=1 $as_echo "#define GNULIB_TEST_STRNDUP 1" >>confdefs.h if test $ac_cv_have_decl_strnlen = no; then HAVE_DECL_STRNLEN=0 else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working strnlen" >&5 $as_echo_n "checking for working strnlen... " >&6; } if ${ac_cv_func_strnlen_working+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : # Guess no on AIX systems, yes otherwise. case "$host_os" in aix*) ac_cv_func_strnlen_working=no;; *) ac_cv_func_strnlen_working=yes;; esac else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { #define S "foobar" #define S_LEN (sizeof S - 1) /* At least one implementation is buggy: that of AIX 4.3 would give strnlen (S, 1) == 3. */ int i; for (i = 0; i < S_LEN + 1; ++i) { int expected = i <= S_LEN ? i : S_LEN; if (strnlen (S, i) != expected) return 1; } return 0; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_func_strnlen_working=yes else ac_cv_func_strnlen_working=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_strnlen_working" >&5 $as_echo "$ac_cv_func_strnlen_working" >&6; } test $ac_cv_func_strnlen_working = no && : if test $ac_cv_func_strnlen_working = no; then REPLACE_STRNLEN=1 fi fi if test $HAVE_DECL_STRNLEN = 0 || test $REPLACE_STRNLEN = 1; then gl_LIBOBJS="$gl_LIBOBJS strnlen.$ac_objext" : fi GNULIB_STRNLEN=1 $as_echo "#define GNULIB_TEST_STRNLEN 1" >>confdefs.h for ac_func in strsep do : ac_fn_c_check_func "$LINENO" "strsep" "ac_cv_func_strsep" if test "x$ac_cv_func_strsep" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_STRSEP 1 _ACEOF fi done if test $ac_cv_func_strsep = no; then HAVE_STRSEP=0 fi if test $HAVE_STRSEP = 0; then gl_LIBOBJS="$gl_LIBOBJS strsep.$ac_objext" : fi GNULIB_STRSEP=1 $as_echo "#define GNULIB_TEST_STRSEP 1" >>confdefs.h if test $HAVE_STRTOD = 1; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether strtod obeys C99" >&5 $as_echo_n "checking whether strtod obeys C99... " >&6; } if ${gl_cv_func_strtod_works+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #ifdef __GNU_LIBRARY__ #if ((__GLIBC__ == 2 && __GLIBC_MINOR__ >= 8) || (__GLIBC__ > 2)) \ && !defined __UCLIBC__ Lucky user #endif #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "Lucky user" >/dev/null 2>&1; then : gl_cv_func_strtod_works="guessing yes" else case "$host_os" in # Guess yes on musl systems. *-musl*) gl_cv_func_strtod_works="guessing yes" ;; # Guess yes on native Windows. mingw*) gl_cv_func_strtod_works="guessing yes" ;; *) gl_cv_func_strtod_works="$gl_cross_guess_normal" ;; esac fi rm -f conftest* else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include /* Compare two numbers with ==. This is a separate function because IRIX 6.5 "cc -O" miscompiles an 'x == x' test. */ static int numeric_equal (double x, double y) { return x == y; } int main () { int result = 0; { /* In some old versions of Linux (2000 or before), strtod mis-parses strings with leading '+'. */ const char *string = " +69"; char *term; double value = strtod (string, &term); if (value != 69 || term != (string + 4)) result |= 1; } { /* Under Solaris 2.4, strtod returns the wrong value for the terminating character under some conditions. */ const char *string = "NaN"; char *term; strtod (string, &term); if (term != string && *(term - 1) == 0) result |= 2; } { /* Older glibc and Cygwin mis-parse "-0x". */ const char *string = "-0x"; char *term; double value = strtod (string, &term); double zero = 0.0; if (1.0 / value != -1.0 / zero || term != (string + 2)) result |= 4; } { /* Many platforms do not parse hex floats. */ const char *string = "0XaP+1"; char *term; double value = strtod (string, &term); if (value != 20.0 || term != (string + 6)) result |= 8; } { /* Many platforms do not parse infinities. HP-UX 11.31 parses inf, but mistakenly sets errno. */ const char *string = "inf"; char *term; double value; errno = 0; value = strtod (string, &term); if (value != HUGE_VAL || term != (string + 3) || errno) result |= 16; } { /* glibc 2.7 and cygwin 1.5.24 misparse "nan()". */ const char *string = "nan()"; char *term; double value = strtod (string, &term); if (numeric_equal (value, value) || term != (string + 5)) result |= 32; } { /* darwin 10.6.1 misparses "nan(". */ const char *string = "nan("; char *term; double value = strtod (string, &term); if (numeric_equal (value, value) || term != (string + 3)) result |= 64; } return result; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : gl_cv_func_strtod_works=yes else gl_cv_func_strtod_works=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_strtod_works" >&5 $as_echo "$gl_cv_func_strtod_works" >&6; } case "$gl_cv_func_strtod_works" in *yes) ;; *) REPLACE_STRTOD=1 ;; esac fi if test $HAVE_STRTOD = 0 || test $REPLACE_STRTOD = 1; then gl_LIBOBJS="$gl_LIBOBJS strtod.$ac_objext" if test $gl_cv_func_ldexp_no_libm = yes; then $as_echo "#define HAVE_LDEXP_IN_LIBC 1" >>confdefs.h fi for ac_func in nl_langinfo do : ac_fn_c_check_func "$LINENO" "nl_langinfo" "ac_cv_func_nl_langinfo" if test "x$ac_cv_func_nl_langinfo" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_NL_LANGINFO 1 _ACEOF fi done fi GNULIB_STRTOD=1 $as_echo "#define GNULIB_TEST_STRTOD 1" >>confdefs.h for ac_func in strtok_r do : ac_fn_c_check_func "$LINENO" "strtok_r" "ac_cv_func_strtok_r" if test "x$ac_cv_func_strtok_r" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_STRTOK_R 1 _ACEOF fi done if test $ac_cv_func_strtok_r = yes; then HAVE_STRTOK_R=1 { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether strtok_r works" >&5 $as_echo_n "checking whether strtok_r works... " >&6; } if ${gl_cv_func_strtok_r_works+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : case "$host_os" in # Guess no on glibc systems. *-gnu* | gnu*) gl_cv_func_strtok_r_works="guessing no" ;; # Guess yes on native Windows. mingw*) gl_cv_func_strtok_r_works="guessing yes" ;; *) gl_cv_func_strtok_r_works="guessing yes" ;; esac else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifndef __OPTIMIZE__ # define __OPTIMIZE__ 1 #endif #undef __OPTIMIZE_SIZE__ #undef __NO_INLINE__ #include #include int main () { static const char dummy[] = "\177\01a"; char delimiters[] = "xxxxxxxx"; char *save_ptr = (char *) dummy; strtok_r (delimiters, "x", &save_ptr); strtok_r (NULL, "x", &save_ptr); return 0; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : gl_cv_func_strtok_r_works=yes else gl_cv_func_strtok_r_works=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_strtok_r_works" >&5 $as_echo "$gl_cv_func_strtok_r_works" >&6; } case "$gl_cv_func_strtok_r_works" in *no) UNDEFINE_STRTOK_R=1 ;; esac else HAVE_STRTOK_R=0 fi if test $ac_cv_have_decl_strtok_r = no; then HAVE_DECL_STRTOK_R=0 fi if test $HAVE_STRTOK_R = 0 || test $REPLACE_STRTOK_R = 1; then gl_LIBOBJS="$gl_LIBOBJS strtok_r.$ac_objext" : fi GNULIB_STRTOK_R=1 $as_echo "#define GNULIB_TEST_STRTOK_R 1" >>confdefs.h if test $gl_cv_have_include_next = yes; then gl_cv_next_sys_random_h='<'sys/random.h'>' else { $as_echo "$as_me:${as_lineno-$LINENO}: checking absolute name of " >&5 $as_echo_n "checking absolute name of ... " >&6; } if ${gl_cv_next_sys_random_h+:} false; then : $as_echo_n "(cached) " >&6 else if test $ac_cv_header_sys_random_h = yes; then cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF case "$host_os" in aix*) gl_absname_cpp="$ac_cpp -C" ;; *) gl_absname_cpp="$ac_cpp" ;; esac case "$host_os" in mingw*) gl_dirsep_regex='[/\\]' ;; *) gl_dirsep_regex='\/' ;; esac gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g' gl_header_literal_regex=`echo 'sys/random.h' \ | sed -e "$gl_make_literal_regex_sed"` gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{ s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/ s|^/[^/]|//&| p q }' gl_cv_absolute_sys_random_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 | sed -n "$gl_absolute_header_sed"` gl_header=$gl_cv_absolute_sys_random_h gl_cv_next_sys_random_h='"'$gl_header'"' else gl_cv_next_sys_random_h='<'sys/random.h'>' fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_sys_random_h" >&5 $as_echo "$gl_cv_next_sys_random_h" >&6; } fi NEXT_SYS_RANDOM_H=$gl_cv_next_sys_random_h if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next' gl_next_as_first_directive='<'sys/random.h'>' else # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include' gl_next_as_first_directive=$gl_cv_next_sys_random_h fi NEXT_AS_FIRST_DIRECTIVE_SYS_RANDOM_H=$gl_next_as_first_directive if test $ac_cv_header_sys_random_h = yes; then HAVE_SYS_RANDOM_H=1 else HAVE_SYS_RANDOM_H=0 fi if test $ac_cv_header_sys_random_h = yes; then UNISTD_H_HAVE_SYS_RANDOM_H=1 fi if test $gl_cv_have_include_next = yes; then gl_cv_next_sys_stat_h='<'sys/stat.h'>' else { $as_echo "$as_me:${as_lineno-$LINENO}: checking absolute name of " >&5 $as_echo_n "checking absolute name of ... " >&6; } if ${gl_cv_next_sys_stat_h+:} false; then : $as_echo_n "(cached) " >&6 else if test $ac_cv_header_sys_stat_h = yes; then cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF case "$host_os" in aix*) gl_absname_cpp="$ac_cpp -C" ;; *) gl_absname_cpp="$ac_cpp" ;; esac case "$host_os" in mingw*) gl_dirsep_regex='[/\\]' ;; *) gl_dirsep_regex='\/' ;; esac gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g' gl_header_literal_regex=`echo 'sys/stat.h' \ | sed -e "$gl_make_literal_regex_sed"` gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{ s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/ s|^/[^/]|//&| p q }' gl_cv_absolute_sys_stat_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 | sed -n "$gl_absolute_header_sed"` gl_header=$gl_cv_absolute_sys_stat_h gl_cv_next_sys_stat_h='"'$gl_header'"' else gl_cv_next_sys_stat_h='<'sys/stat.h'>' fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_sys_stat_h" >&5 $as_echo "$gl_cv_next_sys_stat_h" >&6; } fi NEXT_SYS_STAT_H=$gl_cv_next_sys_stat_h if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next' gl_next_as_first_directive='<'sys/stat.h'>' else # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include' gl_next_as_first_directive=$gl_cv_next_sys_stat_h fi NEXT_AS_FIRST_DIRECTIVE_SYS_STAT_H=$gl_next_as_first_directive WINDOWS_STAT_TIMESPEC=0 ac_fn_c_check_type "$LINENO" "nlink_t" "ac_cv_type_nlink_t" "#include #include " if test "x$ac_cv_type_nlink_t" = xyes; then : else $as_echo "#define nlink_t int" >>confdefs.h fi if test $gl_cv_have_include_next = yes; then gl_cv_next_sys_uio_h='<'sys/uio.h'>' else { $as_echo "$as_me:${as_lineno-$LINENO}: checking absolute name of " >&5 $as_echo_n "checking absolute name of ... " >&6; } if ${gl_cv_next_sys_uio_h+:} false; then : $as_echo_n "(cached) " >&6 else if test $ac_cv_header_sys_uio_h = yes; then cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF case "$host_os" in aix*) gl_absname_cpp="$ac_cpp -C" ;; *) gl_absname_cpp="$ac_cpp" ;; esac case "$host_os" in mingw*) gl_dirsep_regex='[/\\]' ;; *) gl_dirsep_regex='\/' ;; esac gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g' gl_header_literal_regex=`echo 'sys/uio.h' \ | sed -e "$gl_make_literal_regex_sed"` gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{ s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/ s|^/[^/]|//&| p q }' gl_cv_absolute_sys_uio_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 | sed -n "$gl_absolute_header_sed"` gl_header=$gl_cv_absolute_sys_uio_h gl_cv_next_sys_uio_h='"'$gl_header'"' else gl_cv_next_sys_uio_h='<'sys/uio.h'>' fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_sys_uio_h" >&5 $as_echo "$gl_cv_next_sys_uio_h" >&6; } fi NEXT_SYS_UIO_H=$gl_cv_next_sys_uio_h if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next' gl_next_as_first_directive='<'sys/uio.h'>' else # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include' gl_next_as_first_directive=$gl_cv_next_sys_uio_h fi NEXT_AS_FIRST_DIRECTIVE_SYS_UIO_H=$gl_next_as_first_directive if test $ac_cv_header_sys_uio_h = yes; then HAVE_SYS_UIO_H=1 else HAVE_SYS_UIO_H=0 fi : cat >>confdefs.h <<_ACEOF #define GNULIB_TEMPNAME 1 _ACEOF if test $gl_cv_have_include_next = yes; then gl_cv_next_termios_h='<'termios.h'>' else { $as_echo "$as_me:${as_lineno-$LINENO}: checking absolute name of " >&5 $as_echo_n "checking absolute name of ... " >&6; } if ${gl_cv_next_termios_h+:} false; then : $as_echo_n "(cached) " >&6 else if test $ac_cv_header_termios_h = yes; then cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF case "$host_os" in aix*) gl_absname_cpp="$ac_cpp -C" ;; *) gl_absname_cpp="$ac_cpp" ;; esac case "$host_os" in mingw*) gl_dirsep_regex='[/\\]' ;; *) gl_dirsep_regex='\/' ;; esac gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g' gl_header_literal_regex=`echo 'termios.h' \ | sed -e "$gl_make_literal_regex_sed"` gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{ s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/ s|^/[^/]|//&| p q }' gl_cv_absolute_termios_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 | sed -n "$gl_absolute_header_sed"` gl_header=$gl_cv_absolute_termios_h gl_cv_next_termios_h='"'$gl_header'"' else gl_cv_next_termios_h='<'termios.h'>' fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_termios_h" >&5 $as_echo "$gl_cv_next_termios_h" >&6; } fi NEXT_TERMIOS_H=$gl_cv_next_termios_h if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next' gl_next_as_first_directive='<'termios.h'>' else # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include' gl_next_as_first_directive=$gl_cv_next_termios_h fi NEXT_AS_FIRST_DIRECTIVE_TERMIOS_H=$gl_next_as_first_directive if test $ac_cv_header_termios_h != yes; then HAVE_TERMIOS_H=0 fi for ac_header in sys/single_threaded.h do : ac_fn_c_check_header_mongrel "$LINENO" "sys/single_threaded.h" "ac_cv_header_sys_single_threaded_h" "$ac_includes_default" if test "x$ac_cv_header_sys_single_threaded_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_SYS_SINGLE_THREADED_H 1 _ACEOF fi done ac_fn_c_check_decl "$LINENO" "localtime_r" "ac_cv_have_decl_localtime_r" "/* mingw's provides the functions asctime_r, ctime_r, gmtime_r, localtime_r only if or has been included before. */ #if defined __MINGW32__ # include #endif #include " if test "x$ac_cv_have_decl_localtime_r" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_LOCALTIME_R $ac_have_decl _ACEOF if test $ac_cv_have_decl_localtime_r = no; then HAVE_DECL_LOCALTIME_R=0 fi if test $ac_cv_func_localtime_r = yes; then HAVE_LOCALTIME_R=1 { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether localtime_r is compatible with its POSIX signature" >&5 $as_echo_n "checking whether localtime_r is compatible with its POSIX signature... " >&6; } if ${gl_cv_time_r_posix+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* mingw's provides the functions asctime_r, ctime_r, gmtime_r, localtime_r only if or has been included before. */ #if defined __MINGW32__ # include #endif #include int main () { /* We don't need to append 'restrict's to the argument types, even though the POSIX signature has the 'restrict's, since C99 says they can't affect type compatibility. */ struct tm * (*ptr) (time_t const *, struct tm *) = localtime_r; if (ptr) return 0; /* Check the return type is a pointer. On HP-UX 10 it is 'int'. */ *localtime_r (0, 0); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : gl_cv_time_r_posix=yes else gl_cv_time_r_posix=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_time_r_posix" >&5 $as_echo "$gl_cv_time_r_posix" >&6; } if test $gl_cv_time_r_posix = yes; then REPLACE_LOCALTIME_R=0 else REPLACE_LOCALTIME_R=1 fi else HAVE_LOCALTIME_R=0 { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether localtime_r exists as an inline function" >&5 $as_echo_n "checking whether localtime_r exists as an inline function... " >&6; } if ${gl_cv_func_localtime_r_inline+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* mingw's provides the functions asctime_r, ctime_r, gmtime_r, localtime_r only if or has been included before. */ #if defined __MINGW32__ # include #endif #include int main () { time_t a; struct tm r; localtime_r (&a, &r); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : gl_cv_func_localtime_r_inline=yes else gl_cv_func_localtime_r_inline=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_localtime_r_inline" >&5 $as_echo "$gl_cv_func_localtime_r_inline" >&6; } if test $gl_cv_func_localtime_r_inline = yes; then REPLACE_LOCALTIME_R=1 fi fi if test $HAVE_LOCALTIME_R = 0 || test $REPLACE_LOCALTIME_R = 1; then gl_LIBOBJS="$gl_LIBOBJS time_r.$ac_objext" : fi GNULIB_TIME_R=1 $as_echo "#define GNULIB_TEST_TIME_R 1" >>confdefs.h # Mac OS X 10.6 loops forever with some time_t values. # See Bug#27706, Bug#27736, and # https://lists.gnu.org/r/bug-gnulib/2017-07/msg00142.html { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether localtime loops forever near extrema" >&5 $as_echo_n "checking whether localtime loops forever near extrema... " >&6; } if ${gl_cv_func_localtime_infloop_bug+:} false; then : $as_echo_n "(cached) " >&6 else gl_cv_func_localtime_infloop_bug=no if test "$cross_compiling" = yes; then : gl_cv_func_localtime_infloop_bug="guessing no" else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include int main () { time_t t = -67768038400666600; struct tm *tm; char *tz = getenv ("TZ"); if (! (tz && strcmp (tz, "QQQ0") == 0)) return 0; alarm (2); tm = localtime (&t); /* Use TM and *TM to suppress over-optimization. */ return tm && tm->tm_isdst; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : (TZ=QQQ0 ./conftest$EXEEXT) >/dev/null 2>&1 || gl_cv_func_localtime_infloop_bug=yes fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_localtime_infloop_bug" >&5 $as_echo "$gl_cv_func_localtime_infloop_bug" >&6; } if test "$gl_cv_func_localtime_infloop_bug" = yes; then $as_echo "#define HAVE_LOCALTIME_INFLOOP_BUG 1" >>confdefs.h fi ac_fn_c_check_type "$LINENO" "timezone_t" "ac_cv_type_timezone_t" "#include " if test "x$ac_cv_type_timezone_t" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_TIMEZONE_T 1 _ACEOF fi if test "$ac_cv_type_timezone_t" = yes; then HAVE_TIMEZONE_T=1 fi if test $HAVE_TIMEZONE_T = 0; then gl_LIBOBJS="$gl_LIBOBJS time_rz.$ac_objext" fi GNULIB_TIME_RZ=1 $as_echo "#define GNULIB_TEST_TIME_RZ 1" >>confdefs.h REPLACE_TIMEGM=0 if test $ac_cv_func_timegm = yes; then if test "$gl_cv_func_working_mktime" != yes; then # Assume that timegm is buggy if mktime is. REPLACE_TIMEGM=1 fi else HAVE_TIMEGM=0 fi if test $HAVE_TIMEGM = 0 || test $REPLACE_TIMEGM = 1; then gl_LIBOBJS="$gl_LIBOBJS timegm.$ac_objext" : fi GNULIB_TIMEGM=1 $as_echo "#define GNULIB_TEST_TIMEGM 1" >>confdefs.h : : ac_fn_c_check_decl "$LINENO" "trunc" "ac_cv_have_decl_trunc" "#include " if test "x$ac_cv_have_decl_trunc" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_TRUNC $ac_have_decl _ACEOF if test "$ac_cv_have_decl_trunc" = yes; then TRUNC_LIBM=? cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifndef __NO_MATH_INLINES # define __NO_MATH_INLINES 1 /* for glibc */ #endif #include double (*funcptr) (double) = trunc; double x; int main () { x = funcptr(x) + trunc(x); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : TRUNC_LIBM= fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test "$TRUNC_LIBM" = "?"; then save_LIBS="$LIBS" LIBS="$LIBS -lm" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifndef __NO_MATH_INLINES # define __NO_MATH_INLINES 1 /* for glibc */ #endif #include double (*funcptr) (double) = trunc; double x; int main () { x = funcptr(x) + trunc(x); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : TRUNC_LIBM="-lm" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS="$save_LIBS" fi if test "$TRUNC_LIBM" = "?"; then TRUNC_LIBM= fi else HAVE_DECL_TRUNC=0 fi if test $HAVE_DECL_TRUNC = 0 || test $REPLACE_TRUNC = 1; then TRUNC_LIBM= fi if test $HAVE_DECL_TRUNC = 0 || test $REPLACE_TRUNC = 1; then gl_LIBOBJS="$gl_LIBOBJS trunc.$ac_objext" fi GNULIB_TRUNC=1 $as_echo "#define GNULIB_TEST_TRUNC 1" >>confdefs.h if test $ac_cv_func_tzset = no; then HAVE_TZSET=0 fi REPLACE_TZSET=0 case "$host_os" in mingw*) REPLACE_TZSET=1 ;; esac if test $HAVE_TZSET = 0 || test $REPLACE_TZSET = 1; then gl_LIBOBJS="$gl_LIBOBJS tzset.$ac_objext" fi GNULIB_TZSET=1 $as_echo "#define GNULIB_TEST_TZSET 1" >>confdefs.h if { test "$HAVE_LIBUNISTRING" != yes \ || { test $LIBUNISTRING_VERSION_MAJOR -lt 0 \ || { test $LIBUNISTRING_VERSION_MAJOR -eq 0 \ && { test $LIBUNISTRING_VERSION_MINOR -lt 9 \ || { test $LIBUNISTRING_VERSION_MINOR -eq 9 \ && test $LIBUNISTRING_VERSION_SUBMINOR -lt 4 } } } } }; then LIBUNISTRING_UNICASE_H='unicase.h' else LIBUNISTRING_UNICASE_H= fi if { test "$HAVE_LIBUNISTRING" != yes \ || { test $LIBUNISTRING_VERSION_MAJOR -lt 0 \ || { test $LIBUNISTRING_VERSION_MAJOR -eq 0 \ && { test $LIBUNISTRING_VERSION_MINOR -lt 9 \ || { test $LIBUNISTRING_VERSION_MINOR -eq 9 \ && test $LIBUNISTRING_VERSION_SUBMINOR -lt 1 } } } } }; then LIBUNISTRING_COMPILE_UNICASE_EMPTY_PREFIX_CONTEXT_TRUE= LIBUNISTRING_COMPILE_UNICASE_EMPTY_PREFIX_CONTEXT_FALSE='#' else LIBUNISTRING_COMPILE_UNICASE_EMPTY_PREFIX_CONTEXT_TRUE='#' LIBUNISTRING_COMPILE_UNICASE_EMPTY_PREFIX_CONTEXT_FALSE= fi if { test "$HAVE_LIBUNISTRING" != yes \ || { test $LIBUNISTRING_VERSION_MAJOR -lt 0 \ || { test $LIBUNISTRING_VERSION_MAJOR -eq 0 \ && { test $LIBUNISTRING_VERSION_MINOR -lt 9 \ || { test $LIBUNISTRING_VERSION_MINOR -eq 9 \ && test $LIBUNISTRING_VERSION_SUBMINOR -lt 1 } } } } }; then LIBUNISTRING_COMPILE_UNICASE_EMPTY_SUFFIX_CONTEXT_TRUE= LIBUNISTRING_COMPILE_UNICASE_EMPTY_SUFFIX_CONTEXT_FALSE='#' else LIBUNISTRING_COMPILE_UNICASE_EMPTY_SUFFIX_CONTEXT_TRUE='#' LIBUNISTRING_COMPILE_UNICASE_EMPTY_SUFFIX_CONTEXT_FALSE= fi if { test "$HAVE_LIBUNISTRING" != yes \ || { test $LIBUNISTRING_VERSION_MAJOR -lt 0 \ || { test $LIBUNISTRING_VERSION_MAJOR -eq 0 \ && { test $LIBUNISTRING_VERSION_MINOR -lt 9 \ || { test $LIBUNISTRING_VERSION_MINOR -eq 9 \ && test $LIBUNISTRING_VERSION_SUBMINOR -lt 8 } } } } }; then LIBUNISTRING_COMPILE_UNICASE_TOLOWER_TRUE= LIBUNISTRING_COMPILE_UNICASE_TOLOWER_FALSE='#' else LIBUNISTRING_COMPILE_UNICASE_TOLOWER_TRUE='#' LIBUNISTRING_COMPILE_UNICASE_TOLOWER_FALSE= fi if { test "$HAVE_LIBUNISTRING" != yes \ || { test $LIBUNISTRING_VERSION_MAJOR -lt 0 \ || { test $LIBUNISTRING_VERSION_MAJOR -eq 0 \ && { test $LIBUNISTRING_VERSION_MINOR -lt 9 \ || { test $LIBUNISTRING_VERSION_MINOR -eq 9 \ && test $LIBUNISTRING_VERSION_SUBMINOR -lt 8 } } } } }; then LIBUNISTRING_COMPILE_UNICASE_TOTITLE_TRUE= LIBUNISTRING_COMPILE_UNICASE_TOTITLE_FALSE='#' else LIBUNISTRING_COMPILE_UNICASE_TOTITLE_TRUE='#' LIBUNISTRING_COMPILE_UNICASE_TOTITLE_FALSE= fi if { test "$HAVE_LIBUNISTRING" != yes \ || { test $LIBUNISTRING_VERSION_MAJOR -lt 0 \ || { test $LIBUNISTRING_VERSION_MAJOR -eq 0 \ && { test $LIBUNISTRING_VERSION_MINOR -lt 9 \ || { test $LIBUNISTRING_VERSION_MINOR -eq 9 \ && test $LIBUNISTRING_VERSION_SUBMINOR -lt 8 } } } } }; then LIBUNISTRING_COMPILE_UNICASE_TOUPPER_TRUE= LIBUNISTRING_COMPILE_UNICASE_TOUPPER_FALSE='#' else LIBUNISTRING_COMPILE_UNICASE_TOUPPER_TRUE='#' LIBUNISTRING_COMPILE_UNICASE_TOUPPER_FALSE= fi if { test "$HAVE_LIBUNISTRING" != yes \ || { test $LIBUNISTRING_VERSION_MAJOR -lt 0 \ || { test $LIBUNISTRING_VERSION_MAJOR -eq 0 \ && { test $LIBUNISTRING_VERSION_MINOR -lt 9 \ || { test $LIBUNISTRING_VERSION_MINOR -eq 9 \ && test $LIBUNISTRING_VERSION_SUBMINOR -lt 8 } } } } }; then LIBUNISTRING_COMPILE_UNICASE_U8_CASECMP_TRUE= LIBUNISTRING_COMPILE_UNICASE_U8_CASECMP_FALSE='#' else LIBUNISTRING_COMPILE_UNICASE_U8_CASECMP_TRUE='#' LIBUNISTRING_COMPILE_UNICASE_U8_CASECMP_FALSE= fi if { test "$HAVE_LIBUNISTRING" != yes \ || { test $LIBUNISTRING_VERSION_MAJOR -lt 0 \ || { test $LIBUNISTRING_VERSION_MAJOR -eq 0 \ && { test $LIBUNISTRING_VERSION_MINOR -lt 9 \ || { test $LIBUNISTRING_VERSION_MINOR -eq 9 \ && test $LIBUNISTRING_VERSION_SUBMINOR -lt 8 } } } } }; then LIBUNISTRING_COMPILE_UNICASE_U8_CASEFOLD_TRUE= LIBUNISTRING_COMPILE_UNICASE_U8_CASEFOLD_FALSE='#' else LIBUNISTRING_COMPILE_UNICASE_U8_CASEFOLD_TRUE='#' LIBUNISTRING_COMPILE_UNICASE_U8_CASEFOLD_FALSE= fi if { test "$HAVE_LIBUNISTRING" != yes \ || { test $LIBUNISTRING_VERSION_MAJOR -lt 0 \ || { test $LIBUNISTRING_VERSION_MAJOR -eq 0 \ && { test $LIBUNISTRING_VERSION_MINOR -lt 9 \ || { test $LIBUNISTRING_VERSION_MINOR -eq 9 \ && test $LIBUNISTRING_VERSION_SUBMINOR -lt 8 } } } } }; then LIBUNISTRING_COMPILE_UNICASE_U8_CT_CASEFOLD_TRUE= LIBUNISTRING_COMPILE_UNICASE_U8_CT_CASEFOLD_FALSE='#' else LIBUNISTRING_COMPILE_UNICASE_U8_CT_CASEFOLD_TRUE='#' LIBUNISTRING_COMPILE_UNICASE_U8_CT_CASEFOLD_FALSE= fi if { test "$HAVE_LIBUNISTRING" != yes \ || { test $LIBUNISTRING_VERSION_MAJOR -lt 0 \ || { test $LIBUNISTRING_VERSION_MAJOR -eq 0 \ && { test $LIBUNISTRING_VERSION_MINOR -lt 9 \ || { test $LIBUNISTRING_VERSION_MINOR -eq 9 \ && test $LIBUNISTRING_VERSION_SUBMINOR -lt 8 } } } } }; then LIBUNISTRING_COMPILE_UNICASE_U8_CT_TOTITLE_TRUE= LIBUNISTRING_COMPILE_UNICASE_U8_CT_TOTITLE_FALSE='#' else LIBUNISTRING_COMPILE_UNICASE_U8_CT_TOTITLE_TRUE='#' LIBUNISTRING_COMPILE_UNICASE_U8_CT_TOTITLE_FALSE= fi if { test "$HAVE_LIBUNISTRING" != yes \ || { test $LIBUNISTRING_VERSION_MAJOR -lt 0 \ || { test $LIBUNISTRING_VERSION_MAJOR -eq 0 \ && { test $LIBUNISTRING_VERSION_MINOR -lt 9 \ || { test $LIBUNISTRING_VERSION_MINOR -eq 9 \ && test $LIBUNISTRING_VERSION_SUBMINOR -lt 8 } } } } }; then LIBUNISTRING_COMPILE_UNICASE_U8_TOLOWER_TRUE= LIBUNISTRING_COMPILE_UNICASE_U8_TOLOWER_FALSE='#' else LIBUNISTRING_COMPILE_UNICASE_U8_TOLOWER_TRUE='#' LIBUNISTRING_COMPILE_UNICASE_U8_TOLOWER_FALSE= fi if { test "$HAVE_LIBUNISTRING" != yes \ || { test $LIBUNISTRING_VERSION_MAJOR -lt 0 \ || { test $LIBUNISTRING_VERSION_MAJOR -eq 0 \ && { test $LIBUNISTRING_VERSION_MINOR -lt 9 \ || { test $LIBUNISTRING_VERSION_MINOR -eq 9 \ && test $LIBUNISTRING_VERSION_SUBMINOR -lt 8 } } } } }; then LIBUNISTRING_COMPILE_UNICASE_U8_TOTITLE_TRUE= LIBUNISTRING_COMPILE_UNICASE_U8_TOTITLE_FALSE='#' else LIBUNISTRING_COMPILE_UNICASE_U8_TOTITLE_TRUE='#' LIBUNISTRING_COMPILE_UNICASE_U8_TOTITLE_FALSE= fi if { test "$HAVE_LIBUNISTRING" != yes \ || { test $LIBUNISTRING_VERSION_MAJOR -lt 0 \ || { test $LIBUNISTRING_VERSION_MAJOR -eq 0 \ && { test $LIBUNISTRING_VERSION_MINOR -lt 9 \ || { test $LIBUNISTRING_VERSION_MINOR -eq 9 \ && test $LIBUNISTRING_VERSION_SUBMINOR -lt 8 } } } } }; then LIBUNISTRING_COMPILE_UNICASE_U8_TOUPPER_TRUE= LIBUNISTRING_COMPILE_UNICASE_U8_TOUPPER_FALSE='#' else LIBUNISTRING_COMPILE_UNICASE_U8_TOUPPER_TRUE='#' LIBUNISTRING_COMPILE_UNICASE_U8_TOUPPER_FALSE= fi if { test "$HAVE_LIBUNISTRING" != yes \ || { test $LIBUNISTRING_VERSION_MAJOR -lt 0 \ || { test $LIBUNISTRING_VERSION_MAJOR -eq 0 \ && { test $LIBUNISTRING_VERSION_MINOR -lt 9 \ || { test $LIBUNISTRING_VERSION_MINOR -eq 9 \ && test $LIBUNISTRING_VERSION_SUBMINOR -lt 4 } } } } }; then LIBUNISTRING_UNICTYPE_H='unictype.h' else LIBUNISTRING_UNICTYPE_H= fi if { test "$HAVE_LIBUNISTRING" != yes \ || { test $LIBUNISTRING_VERSION_MAJOR -lt 0 \ || { test $LIBUNISTRING_VERSION_MAJOR -eq 0 \ && { test $LIBUNISTRING_VERSION_MINOR -lt 9 \ || { test $LIBUNISTRING_VERSION_MINOR -eq 9 \ && test $LIBUNISTRING_VERSION_SUBMINOR -lt 8 } } } } }; then LIBUNISTRING_COMPILE_UNICTYPE_CATEGORY_NONE_TRUE= LIBUNISTRING_COMPILE_UNICTYPE_CATEGORY_NONE_FALSE='#' else LIBUNISTRING_COMPILE_UNICTYPE_CATEGORY_NONE_TRUE='#' LIBUNISTRING_COMPILE_UNICTYPE_CATEGORY_NONE_FALSE= fi if { test "$HAVE_LIBUNISTRING" != yes \ || { test $LIBUNISTRING_VERSION_MAJOR -lt 0 \ || { test $LIBUNISTRING_VERSION_MAJOR -eq 0 \ && { test $LIBUNISTRING_VERSION_MINOR -lt 9 \ || { test $LIBUNISTRING_VERSION_MINOR -eq 9 \ && test $LIBUNISTRING_VERSION_SUBMINOR -lt 8 } } } } }; then LIBUNISTRING_COMPILE_UNICTYPE_CATEGORY_OF_TRUE= LIBUNISTRING_COMPILE_UNICTYPE_CATEGORY_OF_FALSE='#' else LIBUNISTRING_COMPILE_UNICTYPE_CATEGORY_OF_TRUE='#' LIBUNISTRING_COMPILE_UNICTYPE_CATEGORY_OF_FALSE= fi if { test "$HAVE_LIBUNISTRING" != yes \ || { test $LIBUNISTRING_VERSION_MAJOR -lt 0 \ || { test $LIBUNISTRING_VERSION_MAJOR -eq 0 \ && { test $LIBUNISTRING_VERSION_MINOR -lt 9 \ || { test $LIBUNISTRING_VERSION_MINOR -eq 9 \ && test $LIBUNISTRING_VERSION_SUBMINOR -lt 8 } } } } }; then LIBUNISTRING_COMPILE_UNICTYPE_COMBINING_CLASS_TRUE= LIBUNISTRING_COMPILE_UNICTYPE_COMBINING_CLASS_FALSE='#' else LIBUNISTRING_COMPILE_UNICTYPE_COMBINING_CLASS_TRUE='#' LIBUNISTRING_COMPILE_UNICTYPE_COMBINING_CLASS_FALSE= fi if { test "$HAVE_LIBUNISTRING" != yes \ || { test $LIBUNISTRING_VERSION_MAJOR -lt 0 \ || { test $LIBUNISTRING_VERSION_MAJOR -eq 0 \ && { test $LIBUNISTRING_VERSION_MINOR -lt 9 \ || { test $LIBUNISTRING_VERSION_MINOR -eq 9 \ && test $LIBUNISTRING_VERSION_SUBMINOR -lt 8 } } } } }; then LIBUNISTRING_COMPILE_UNICTYPE_CTYPE_PRINT_TRUE= LIBUNISTRING_COMPILE_UNICTYPE_CTYPE_PRINT_FALSE='#' else LIBUNISTRING_COMPILE_UNICTYPE_CTYPE_PRINT_TRUE='#' LIBUNISTRING_COMPILE_UNICTYPE_CTYPE_PRINT_FALSE= fi if { test "$HAVE_LIBUNISTRING" != yes \ || { test $LIBUNISTRING_VERSION_MAJOR -lt 0 \ || { test $LIBUNISTRING_VERSION_MAJOR -eq 0 \ && { test $LIBUNISTRING_VERSION_MINOR -lt 9 \ || { test $LIBUNISTRING_VERSION_MINOR -eq 9 \ && test $LIBUNISTRING_VERSION_SUBMINOR -lt 8 } } } } }; then LIBUNISTRING_COMPILE_UNICTYPE_PROPERTY_SOFT_DOTTED_TRUE= LIBUNISTRING_COMPILE_UNICTYPE_PROPERTY_SOFT_DOTTED_FALSE='#' else LIBUNISTRING_COMPILE_UNICTYPE_PROPERTY_SOFT_DOTTED_TRUE='#' LIBUNISTRING_COMPILE_UNICTYPE_PROPERTY_SOFT_DOTTED_FALSE= fi if { test "$HAVE_LIBUNISTRING" != yes \ || { test $LIBUNISTRING_VERSION_MAJOR -lt 0 \ || { test $LIBUNISTRING_VERSION_MAJOR -eq 0 \ && { test $LIBUNISTRING_VERSION_MINOR -lt 9 \ || { test $LIBUNISTRING_VERSION_MINOR -eq 9 \ && test $LIBUNISTRING_VERSION_SUBMINOR -lt 4 } } } } }; then LIBUNISTRING_UNIGBRK_H='unigbrk.h' else LIBUNISTRING_UNIGBRK_H= fi if { test "$HAVE_LIBUNISTRING" != yes \ || { test $LIBUNISTRING_VERSION_MAJOR -lt 0 \ || { test $LIBUNISTRING_VERSION_MAJOR -eq 0 \ && { test $LIBUNISTRING_VERSION_MINOR -lt 9 \ || { test $LIBUNISTRING_VERSION_MINOR -eq 9 \ && test $LIBUNISTRING_VERSION_SUBMINOR -lt 8 } } } } }; then LIBUNISTRING_COMPILE_UNIGBRK_UC_GBRK_PROP_TRUE= LIBUNISTRING_COMPILE_UNIGBRK_UC_GBRK_PROP_FALSE='#' else LIBUNISTRING_COMPILE_UNIGBRK_UC_GBRK_PROP_TRUE='#' LIBUNISTRING_COMPILE_UNIGBRK_UC_GBRK_PROP_FALSE= fi if { test "$HAVE_LIBUNISTRING" != yes \ || { test $LIBUNISTRING_VERSION_MAJOR -lt 0 \ || { test $LIBUNISTRING_VERSION_MAJOR -eq 0 \ && { test $LIBUNISTRING_VERSION_MINOR -lt 9 \ || { test $LIBUNISTRING_VERSION_MINOR -eq 9 \ && test $LIBUNISTRING_VERSION_SUBMINOR -lt 8 } } } } }; then LIBUNISTRING_COMPILE_UNIGBRK_UC_IS_GRAPHEME_BREAK_TRUE= LIBUNISTRING_COMPILE_UNIGBRK_UC_IS_GRAPHEME_BREAK_FALSE='#' else LIBUNISTRING_COMPILE_UNIGBRK_UC_IS_GRAPHEME_BREAK_TRUE='#' LIBUNISTRING_COMPILE_UNIGBRK_UC_IS_GRAPHEME_BREAK_FALSE= fi if { test "$HAVE_LIBUNISTRING" != yes \ || { test $LIBUNISTRING_VERSION_MAJOR -lt 0 \ || { test $LIBUNISTRING_VERSION_MAJOR -eq 0 \ && { test $LIBUNISTRING_VERSION_MINOR -lt 9 \ || { test $LIBUNISTRING_VERSION_MINOR -eq 9 \ && test $LIBUNISTRING_VERSION_SUBMINOR -lt 4 } } } } }; then LIBUNISTRING_UNILBRK_H='unilbrk.h' else LIBUNISTRING_UNILBRK_H= fi if { test "$HAVE_LIBUNISTRING" != yes \ || { test $LIBUNISTRING_VERSION_MAJOR -lt 0 \ || { test $LIBUNISTRING_VERSION_MAJOR -eq 0 \ && { test $LIBUNISTRING_VERSION_MINOR -lt 9 \ || { test $LIBUNISTRING_VERSION_MINOR -eq 9 \ && test $LIBUNISTRING_VERSION_SUBMINOR -lt 8 } } } } }; then LIBUNISTRING_COMPILE_UNILBRK_U8_POSSIBLE_LINEBREAKS_TRUE= LIBUNISTRING_COMPILE_UNILBRK_U8_POSSIBLE_LINEBREAKS_FALSE='#' else LIBUNISTRING_COMPILE_UNILBRK_U8_POSSIBLE_LINEBREAKS_TRUE='#' LIBUNISTRING_COMPILE_UNILBRK_U8_POSSIBLE_LINEBREAKS_FALSE= fi if { test "$HAVE_LIBUNISTRING" != yes \ || { test $LIBUNISTRING_VERSION_MAJOR -lt 0 \ || { test $LIBUNISTRING_VERSION_MAJOR -eq 0 \ && { test $LIBUNISTRING_VERSION_MINOR -lt 9 \ || { test $LIBUNISTRING_VERSION_MINOR -eq 9 \ && test $LIBUNISTRING_VERSION_SUBMINOR -lt 4 } } } } }; then LIBUNISTRING_UNINORM_H='uninorm.h' else LIBUNISTRING_UNINORM_H= fi if { test "$HAVE_LIBUNISTRING" != yes \ || { test $LIBUNISTRING_VERSION_MAJOR -lt 0 \ || { test $LIBUNISTRING_VERSION_MAJOR -eq 0 \ && { test $LIBUNISTRING_VERSION_MINOR -lt 9 \ || { test $LIBUNISTRING_VERSION_MINOR -eq 9 \ && test $LIBUNISTRING_VERSION_SUBMINOR -lt 8 } } } } }; then LIBUNISTRING_COMPILE_UNINORM_CANONICAL_DECOMPOSITION_TRUE= LIBUNISTRING_COMPILE_UNINORM_CANONICAL_DECOMPOSITION_FALSE='#' else LIBUNISTRING_COMPILE_UNINORM_CANONICAL_DECOMPOSITION_TRUE='#' LIBUNISTRING_COMPILE_UNINORM_CANONICAL_DECOMPOSITION_FALSE= fi if { test "$HAVE_LIBUNISTRING" != yes \ || { test $LIBUNISTRING_VERSION_MAJOR -lt 0 \ || { test $LIBUNISTRING_VERSION_MAJOR -eq 0 \ && { test $LIBUNISTRING_VERSION_MINOR -lt 9 \ || { test $LIBUNISTRING_VERSION_MINOR -eq 9 \ && test $LIBUNISTRING_VERSION_SUBMINOR -lt 5 } } } } }; then LIBUNISTRING_COMPILE_UNINORM_DECOMPOSING_FORM_TRUE= LIBUNISTRING_COMPILE_UNINORM_DECOMPOSING_FORM_FALSE='#' else LIBUNISTRING_COMPILE_UNINORM_DECOMPOSING_FORM_TRUE='#' LIBUNISTRING_COMPILE_UNINORM_DECOMPOSING_FORM_FALSE= fi if { test "$HAVE_LIBUNISTRING" != yes \ || { test $LIBUNISTRING_VERSION_MAJOR -lt 0 \ || { test $LIBUNISTRING_VERSION_MAJOR -eq 0 \ && { test $LIBUNISTRING_VERSION_MINOR -lt 9 \ || { test $LIBUNISTRING_VERSION_MINOR -eq 9 \ && test $LIBUNISTRING_VERSION_SUBMINOR -lt 8 } } } } }; then LIBUNISTRING_COMPILE_UNINORM_DECOMPOSITION_TRUE= LIBUNISTRING_COMPILE_UNINORM_DECOMPOSITION_FALSE='#' else LIBUNISTRING_COMPILE_UNINORM_DECOMPOSITION_TRUE='#' LIBUNISTRING_COMPILE_UNINORM_DECOMPOSITION_FALSE= fi if { test "$HAVE_LIBUNISTRING" != yes \ || { test $LIBUNISTRING_VERSION_MAJOR -lt 0 \ || { test $LIBUNISTRING_VERSION_MAJOR -eq 0 \ && { test $LIBUNISTRING_VERSION_MINOR -lt 9 \ || { test $LIBUNISTRING_VERSION_MINOR -eq 9 \ && test $LIBUNISTRING_VERSION_SUBMINOR -lt 8 } } } } }; then LIBUNISTRING_COMPILE_UNINORM_NFD_TRUE= LIBUNISTRING_COMPILE_UNINORM_NFD_FALSE='#' else LIBUNISTRING_COMPILE_UNINORM_NFD_TRUE='#' LIBUNISTRING_COMPILE_UNINORM_NFD_FALSE= fi if { test "$HAVE_LIBUNISTRING" != yes \ || { test $LIBUNISTRING_VERSION_MAJOR -lt 0 \ || { test $LIBUNISTRING_VERSION_MAJOR -eq 0 \ && { test $LIBUNISTRING_VERSION_MINOR -lt 9 \ || { test $LIBUNISTRING_VERSION_MINOR -eq 9 \ && test $LIBUNISTRING_VERSION_SUBMINOR -lt 8 } } } } }; then LIBUNISTRING_COMPILE_UNINORM_NFKD_TRUE= LIBUNISTRING_COMPILE_UNINORM_NFKD_FALSE='#' else LIBUNISTRING_COMPILE_UNINORM_NFKD_TRUE='#' LIBUNISTRING_COMPILE_UNINORM_NFKD_FALSE= fi $as_echo "#define GNULIB_TEST_UNINORM_U8_NORMALIZE 1" >>confdefs.h if { test "$HAVE_LIBUNISTRING" != yes \ || { test $LIBUNISTRING_VERSION_MAJOR -lt 0 \ || { test $LIBUNISTRING_VERSION_MAJOR -eq 0 \ && { test $LIBUNISTRING_VERSION_MINOR -lt 9 \ || { test $LIBUNISTRING_VERSION_MINOR -eq 9 \ && test $LIBUNISTRING_VERSION_SUBMINOR -lt 8 } } } } }; then LIBUNISTRING_COMPILE_UNINORM_U8_NORMALIZE_TRUE= LIBUNISTRING_COMPILE_UNINORM_U8_NORMALIZE_FALSE='#' else LIBUNISTRING_COMPILE_UNINORM_U8_NORMALIZE_TRUE='#' LIBUNISTRING_COMPILE_UNINORM_U8_NORMALIZE_FALSE= fi if test $gl_cv_have_include_next = yes; then gl_cv_next_unistd_h='<'unistd.h'>' else { $as_echo "$as_me:${as_lineno-$LINENO}: checking absolute name of " >&5 $as_echo_n "checking absolute name of ... " >&6; } if ${gl_cv_next_unistd_h+:} false; then : $as_echo_n "(cached) " >&6 else if test $ac_cv_header_unistd_h = yes; then cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF case "$host_os" in aix*) gl_absname_cpp="$ac_cpp -C" ;; *) gl_absname_cpp="$ac_cpp" ;; esac case "$host_os" in mingw*) gl_dirsep_regex='[/\\]' ;; *) gl_dirsep_regex='\/' ;; esac gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g' gl_header_literal_regex=`echo 'unistd.h' \ | sed -e "$gl_make_literal_regex_sed"` gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{ s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/ s|^/[^/]|//&| p q }' gl_cv_absolute_unistd_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 | sed -n "$gl_absolute_header_sed"` gl_header=$gl_cv_absolute_unistd_h gl_cv_next_unistd_h='"'$gl_header'"' else gl_cv_next_unistd_h='<'unistd.h'>' fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_unistd_h" >&5 $as_echo "$gl_cv_next_unistd_h" >&6; } fi NEXT_UNISTD_H=$gl_cv_next_unistd_h if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next' gl_next_as_first_directive='<'unistd.h'>' else # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include' gl_next_as_first_directive=$gl_cv_next_unistd_h fi NEXT_AS_FIRST_DIRECTIVE_UNISTD_H=$gl_next_as_first_directive if test $ac_cv_header_unistd_h = yes; then HAVE_UNISTD_H=1 else HAVE_UNISTD_H=0 fi if { test "$HAVE_LIBUNISTRING" != yes \ || { test $LIBUNISTRING_VERSION_MAJOR -lt 0 \ || { test $LIBUNISTRING_VERSION_MAJOR -eq 0 \ && { test $LIBUNISTRING_VERSION_MINOR -lt 9 \ || { test $LIBUNISTRING_VERSION_MINOR -eq 9 \ && test $LIBUNISTRING_VERSION_SUBMINOR -lt 4 } } } } }; then LIBUNISTRING_UNISTR_H='unistr.h' else LIBUNISTRING_UNISTR_H= fi if { test "$HAVE_LIBUNISTRING" != yes \ || { test $LIBUNISTRING_VERSION_MAJOR -lt 0 \ || { test $LIBUNISTRING_VERSION_MAJOR -eq 0 \ && { test $LIBUNISTRING_VERSION_MINOR -lt 9 \ || { test $LIBUNISTRING_VERSION_MINOR -eq 9 \ && test $LIBUNISTRING_VERSION_SUBMINOR -lt 0 } } } } }; then LIBUNISTRING_COMPILE_UNISTR_U8_CHECK_TRUE= LIBUNISTRING_COMPILE_UNISTR_U8_CHECK_FALSE='#' else LIBUNISTRING_COMPILE_UNISTR_U8_CHECK_TRUE='#' LIBUNISTRING_COMPILE_UNISTR_U8_CHECK_FALSE= fi if { test "$HAVE_LIBUNISTRING" != yes \ || { test $LIBUNISTRING_VERSION_MAJOR -lt 0 \ || { test $LIBUNISTRING_VERSION_MAJOR -eq 0 \ && { test $LIBUNISTRING_VERSION_MINOR -lt 9 \ || { test $LIBUNISTRING_VERSION_MINOR -eq 9 \ && test $LIBUNISTRING_VERSION_SUBMINOR -lt 0 } } } } }; then LIBUNISTRING_COMPILE_UNISTR_U8_CMP_TRUE= LIBUNISTRING_COMPILE_UNISTR_U8_CMP_FALSE='#' else LIBUNISTRING_COMPILE_UNISTR_U8_CMP_TRUE='#' LIBUNISTRING_COMPILE_UNISTR_U8_CMP_FALSE= fi if { test "$HAVE_LIBUNISTRING" != yes \ || { test $LIBUNISTRING_VERSION_MAJOR -lt 0 \ || { test $LIBUNISTRING_VERSION_MAJOR -eq 0 \ && { test $LIBUNISTRING_VERSION_MINOR -lt 9 \ || { test $LIBUNISTRING_VERSION_MINOR -eq 9 \ && test $LIBUNISTRING_VERSION_SUBMINOR -lt 0 } } } } }; then LIBUNISTRING_COMPILE_UNISTR_U8_CMP2_TRUE= LIBUNISTRING_COMPILE_UNISTR_U8_CMP2_FALSE='#' else LIBUNISTRING_COMPILE_UNISTR_U8_CMP2_TRUE='#' LIBUNISTRING_COMPILE_UNISTR_U8_CMP2_FALSE= fi if { test "$HAVE_LIBUNISTRING" != yes \ || { test $LIBUNISTRING_VERSION_MAJOR -lt 0 \ || { test $LIBUNISTRING_VERSION_MAJOR -eq 0 \ && { test $LIBUNISTRING_VERSION_MINOR -lt 9 \ || { test $LIBUNISTRING_VERSION_MINOR -eq 9 \ && test $LIBUNISTRING_VERSION_SUBMINOR -lt 0 } } } } }; then LIBUNISTRING_COMPILE_UNISTR_U8_CPY_TRUE= LIBUNISTRING_COMPILE_UNISTR_U8_CPY_FALSE='#' else LIBUNISTRING_COMPILE_UNISTR_U8_CPY_TRUE='#' LIBUNISTRING_COMPILE_UNISTR_U8_CPY_FALSE= fi if { test "$HAVE_LIBUNISTRING" != yes \ || { test $LIBUNISTRING_VERSION_MAJOR -lt 0 \ || { test $LIBUNISTRING_VERSION_MAJOR -eq 0 \ && { test $LIBUNISTRING_VERSION_MINOR -lt 9 \ || { test $LIBUNISTRING_VERSION_MINOR -eq 9 \ && test $LIBUNISTRING_VERSION_SUBMINOR -lt 0 } } } } }; then LIBUNISTRING_COMPILE_UNISTR_U8_MBLEN_TRUE= LIBUNISTRING_COMPILE_UNISTR_U8_MBLEN_FALSE='#' else LIBUNISTRING_COMPILE_UNISTR_U8_MBLEN_TRUE='#' LIBUNISTRING_COMPILE_UNISTR_U8_MBLEN_FALSE= fi cat >>confdefs.h <<_ACEOF #define GNULIB_UNISTR_U8_MBTOUC 1 _ACEOF if { test "$HAVE_LIBUNISTRING" != yes \ || { test $LIBUNISTRING_VERSION_MAJOR -lt 0 \ || { test $LIBUNISTRING_VERSION_MAJOR -eq 0 \ && { test $LIBUNISTRING_VERSION_MINOR -lt 9 \ || { test $LIBUNISTRING_VERSION_MINOR -eq 9 \ && test $LIBUNISTRING_VERSION_SUBMINOR -lt 4 } } } } }; then LIBUNISTRING_COMPILE_UNISTR_U8_MBTOUC_TRUE= LIBUNISTRING_COMPILE_UNISTR_U8_MBTOUC_FALSE='#' else LIBUNISTRING_COMPILE_UNISTR_U8_MBTOUC_TRUE='#' LIBUNISTRING_COMPILE_UNISTR_U8_MBTOUC_FALSE= fi cat >>confdefs.h <<_ACEOF #define GNULIB_UNISTR_U8_MBTOUC_UNSAFE 1 _ACEOF if { test "$HAVE_LIBUNISTRING" != yes \ || { test $LIBUNISTRING_VERSION_MAJOR -lt 0 \ || { test $LIBUNISTRING_VERSION_MAJOR -eq 0 \ && { test $LIBUNISTRING_VERSION_MINOR -lt 9 \ || { test $LIBUNISTRING_VERSION_MINOR -eq 9 \ && test $LIBUNISTRING_VERSION_SUBMINOR -lt 4 } } } } }; then LIBUNISTRING_COMPILE_UNISTR_U8_MBTOUC_UNSAFE_TRUE= LIBUNISTRING_COMPILE_UNISTR_U8_MBTOUC_UNSAFE_FALSE='#' else LIBUNISTRING_COMPILE_UNISTR_U8_MBTOUC_UNSAFE_TRUE='#' LIBUNISTRING_COMPILE_UNISTR_U8_MBTOUC_UNSAFE_FALSE= fi cat >>confdefs.h <<_ACEOF #define GNULIB_UNISTR_U8_MBTOUCR 1 _ACEOF if { test "$HAVE_LIBUNISTRING" != yes \ || { test $LIBUNISTRING_VERSION_MAJOR -lt 0 \ || { test $LIBUNISTRING_VERSION_MAJOR -eq 0 \ && { test $LIBUNISTRING_VERSION_MINOR -lt 9 \ || { test $LIBUNISTRING_VERSION_MINOR -eq 9 \ && test $LIBUNISTRING_VERSION_SUBMINOR -lt 0 } } } } }; then LIBUNISTRING_COMPILE_UNISTR_U8_MBTOUCR_TRUE= LIBUNISTRING_COMPILE_UNISTR_U8_MBTOUCR_FALSE='#' else LIBUNISTRING_COMPILE_UNISTR_U8_MBTOUCR_TRUE='#' LIBUNISTRING_COMPILE_UNISTR_U8_MBTOUCR_FALSE= fi if { test "$HAVE_LIBUNISTRING" != yes \ || { test $LIBUNISTRING_VERSION_MAJOR -lt 0 \ || { test $LIBUNISTRING_VERSION_MAJOR -eq 0 \ && { test $LIBUNISTRING_VERSION_MINOR -lt 9 \ || { test $LIBUNISTRING_VERSION_MINOR -eq 9 \ && test $LIBUNISTRING_VERSION_SUBMINOR -lt 0 } } } } }; then LIBUNISTRING_COMPILE_UNISTR_U8_STRLEN_TRUE= LIBUNISTRING_COMPILE_UNISTR_U8_STRLEN_FALSE='#' else LIBUNISTRING_COMPILE_UNISTR_U8_STRLEN_TRUE='#' LIBUNISTRING_COMPILE_UNISTR_U8_STRLEN_FALSE= fi if { test "$HAVE_LIBUNISTRING" != yes \ || { test $LIBUNISTRING_VERSION_MAJOR -lt 0 \ || { test $LIBUNISTRING_VERSION_MAJOR -eq 0 \ && { test $LIBUNISTRING_VERSION_MINOR -lt 9 \ || { test $LIBUNISTRING_VERSION_MINOR -eq 9 \ && test $LIBUNISTRING_VERSION_SUBMINOR -lt 0 } } } } }; then LIBUNISTRING_COMPILE_UNISTR_U8_STRMBTOUC_TRUE= LIBUNISTRING_COMPILE_UNISTR_U8_STRMBTOUC_FALSE='#' else LIBUNISTRING_COMPILE_UNISTR_U8_STRMBTOUC_TRUE='#' LIBUNISTRING_COMPILE_UNISTR_U8_STRMBTOUC_FALSE= fi if { test "$HAVE_LIBUNISTRING" != yes \ || { test $LIBUNISTRING_VERSION_MAJOR -lt 0 \ || { test $LIBUNISTRING_VERSION_MAJOR -eq 0 \ && { test $LIBUNISTRING_VERSION_MINOR -lt 9 \ || { test $LIBUNISTRING_VERSION_MINOR -eq 9 \ && test $LIBUNISTRING_VERSION_SUBMINOR -lt 0 } } } } }; then LIBUNISTRING_COMPILE_UNISTR_U8_STRNCAT_TRUE= LIBUNISTRING_COMPILE_UNISTR_U8_STRNCAT_FALSE='#' else LIBUNISTRING_COMPILE_UNISTR_U8_STRNCAT_TRUE='#' LIBUNISTRING_COMPILE_UNISTR_U8_STRNCAT_FALSE= fi cat >>confdefs.h <<_ACEOF #define GNULIB_UNISTR_U8_UCTOMB 1 _ACEOF if { test "$HAVE_LIBUNISTRING" != yes \ || { test $LIBUNISTRING_VERSION_MAJOR -lt 0 \ || { test $LIBUNISTRING_VERSION_MAJOR -eq 0 \ && { test $LIBUNISTRING_VERSION_MINOR -lt 9 \ || { test $LIBUNISTRING_VERSION_MINOR -eq 9 \ && test $LIBUNISTRING_VERSION_SUBMINOR -lt 0 } } } } }; then LIBUNISTRING_COMPILE_UNISTR_U8_UCTOMB_TRUE= LIBUNISTRING_COMPILE_UNISTR_U8_UCTOMB_FALSE='#' else LIBUNISTRING_COMPILE_UNISTR_U8_UCTOMB_TRUE='#' LIBUNISTRING_COMPILE_UNISTR_U8_UCTOMB_FALSE= fi if { test "$HAVE_LIBUNISTRING" != yes \ || { test $LIBUNISTRING_VERSION_MAJOR -lt 0 \ || { test $LIBUNISTRING_VERSION_MAJOR -eq 0 \ && { test $LIBUNISTRING_VERSION_MINOR -lt 9 \ || { test $LIBUNISTRING_VERSION_MINOR -eq 9 \ && test $LIBUNISTRING_VERSION_SUBMINOR -lt 4 } } } } }; then LIBUNISTRING_UNITYPES_H='unitypes.h' else LIBUNISTRING_UNITYPES_H= fi if { test "$HAVE_LIBUNISTRING" != yes \ || { test $LIBUNISTRING_VERSION_MAJOR -lt 0 \ || { test $LIBUNISTRING_VERSION_MAJOR -eq 0 \ && { test $LIBUNISTRING_VERSION_MINOR -lt 9 \ || { test $LIBUNISTRING_VERSION_MINOR -eq 9 \ && test $LIBUNISTRING_VERSION_SUBMINOR -lt 4 } } } } }; then LIBUNISTRING_UNIWBRK_H='uniwbrk.h' else LIBUNISTRING_UNIWBRK_H= fi if { test "$HAVE_LIBUNISTRING" != yes \ || { test $LIBUNISTRING_VERSION_MAJOR -lt 0 \ || { test $LIBUNISTRING_VERSION_MAJOR -eq 0 \ && { test $LIBUNISTRING_VERSION_MINOR -lt 9 \ || { test $LIBUNISTRING_VERSION_MINOR -eq 9 \ && test $LIBUNISTRING_VERSION_SUBMINOR -lt 8 } } } } }; then LIBUNISTRING_COMPILE_UNIWBRK_U8_WORDBREAKS_TRUE= LIBUNISTRING_COMPILE_UNIWBRK_U8_WORDBREAKS_FALSE='#' else LIBUNISTRING_COMPILE_UNIWBRK_U8_WORDBREAKS_TRUE='#' LIBUNISTRING_COMPILE_UNIWBRK_U8_WORDBREAKS_FALSE= fi if { test "$HAVE_LIBUNISTRING" != yes \ || { test $LIBUNISTRING_VERSION_MAJOR -lt 0 \ || { test $LIBUNISTRING_VERSION_MAJOR -eq 0 \ && { test $LIBUNISTRING_VERSION_MINOR -lt 9 \ || { test $LIBUNISTRING_VERSION_MINOR -eq 9 \ && test $LIBUNISTRING_VERSION_SUBMINOR -lt 8 } } } } }; then LIBUNISTRING_COMPILE_UNIWBRK_WORDBREAK_PROPERTY_TRUE= LIBUNISTRING_COMPILE_UNIWBRK_WORDBREAK_PROPERTY_FALSE='#' else LIBUNISTRING_COMPILE_UNIWBRK_WORDBREAK_PROPERTY_TRUE='#' LIBUNISTRING_COMPILE_UNIWBRK_WORDBREAK_PROPERTY_FALSE= fi if { test "$HAVE_LIBUNISTRING" != yes \ || { test $LIBUNISTRING_VERSION_MAJOR -lt 0 \ || { test $LIBUNISTRING_VERSION_MAJOR -eq 0 \ && { test $LIBUNISTRING_VERSION_MINOR -lt 9 \ || { test $LIBUNISTRING_VERSION_MINOR -eq 9 \ && test $LIBUNISTRING_VERSION_SUBMINOR -lt 4 } } } } }; then LIBUNISTRING_UNIWIDTH_H='uniwidth.h' else LIBUNISTRING_UNIWIDTH_H= fi if { test "$HAVE_LIBUNISTRING" != yes \ || { test $LIBUNISTRING_VERSION_MAJOR -lt 0 \ || { test $LIBUNISTRING_VERSION_MAJOR -eq 0 \ && { test $LIBUNISTRING_VERSION_MINOR -lt 9 \ || { test $LIBUNISTRING_VERSION_MINOR -eq 9 \ && test $LIBUNISTRING_VERSION_SUBMINOR -lt 8 } } } } }; then LIBUNISTRING_COMPILE_UNIWIDTH_U8_STRWIDTH_TRUE= LIBUNISTRING_COMPILE_UNIWIDTH_U8_STRWIDTH_FALSE='#' else LIBUNISTRING_COMPILE_UNIWIDTH_U8_STRWIDTH_TRUE='#' LIBUNISTRING_COMPILE_UNIWIDTH_U8_STRWIDTH_FALSE= fi if { test "$HAVE_LIBUNISTRING" != yes \ || { test $LIBUNISTRING_VERSION_MAJOR -lt 0 \ || { test $LIBUNISTRING_VERSION_MAJOR -eq 0 \ && { test $LIBUNISTRING_VERSION_MINOR -lt 9 \ || { test $LIBUNISTRING_VERSION_MINOR -eq 9 \ && test $LIBUNISTRING_VERSION_SUBMINOR -lt 8 } } } } }; then LIBUNISTRING_COMPILE_UNIWIDTH_U8_WIDTH_TRUE= LIBUNISTRING_COMPILE_UNIWIDTH_U8_WIDTH_FALSE='#' else LIBUNISTRING_COMPILE_UNIWIDTH_U8_WIDTH_TRUE='#' LIBUNISTRING_COMPILE_UNIWIDTH_U8_WIDTH_FALSE= fi if { test "$HAVE_LIBUNISTRING" != yes \ || { test $LIBUNISTRING_VERSION_MAJOR -lt 0 \ || { test $LIBUNISTRING_VERSION_MAJOR -eq 0 \ && { test $LIBUNISTRING_VERSION_MINOR -lt 9 \ || { test $LIBUNISTRING_VERSION_MINOR -eq 9 \ && test $LIBUNISTRING_VERSION_SUBMINOR -lt 8 } } } } }; then LIBUNISTRING_COMPILE_UNIWIDTH_WIDTH_TRUE= LIBUNISTRING_COMPILE_UNIWIDTH_WIDTH_FALSE='#' else LIBUNISTRING_COMPILE_UNIWIDTH_WIDTH_TRUE='#' LIBUNISTRING_COMPILE_UNIWIDTH_WIDTH_FALSE= fi $as_echo "#define USE_UNLOCKED_IO 1" >>confdefs.h if test $ac_cv_have_decl_unsetenv = no; then HAVE_DECL_UNSETENV=0 fi for ac_func in unsetenv do : ac_fn_c_check_func "$LINENO" "unsetenv" "ac_cv_func_unsetenv" if test "x$ac_cv_func_unsetenv" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_UNSETENV 1 _ACEOF fi done if test $ac_cv_func_unsetenv = no; then HAVE_UNSETENV=0 else HAVE_UNSETENV=1 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for unsetenv() return type" >&5 $as_echo_n "checking for unsetenv() return type... " >&6; } if ${gt_cv_func_unsetenv_ret+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #undef _BSD #define _BSD 1 /* unhide unsetenv declaration in OSF/1 5.1 */ #include extern #ifdef __cplusplus "C" #endif int unsetenv (const char *name); int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : gt_cv_func_unsetenv_ret='int' else gt_cv_func_unsetenv_ret='void' fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_func_unsetenv_ret" >&5 $as_echo "$gt_cv_func_unsetenv_ret" >&6; } if test $gt_cv_func_unsetenv_ret = 'void'; then $as_echo "#define VOID_UNSETENV 1" >>confdefs.h REPLACE_UNSETENV=1 fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether unsetenv obeys POSIX" >&5 $as_echo_n "checking whether unsetenv obeys POSIX... " >&6; } if ${gl_cv_func_unsetenv_works+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : case "$host_os" in # Guess yes on glibc systems. *-gnu*) gl_cv_func_unsetenv_works="guessing yes" ;; # If we don't know, obey --enable-cross-guesses. *) gl_cv_func_unsetenv_works="$gl_cross_guess_normal" ;; esac else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include extern char **environ; int main () { char entry1[] = "a=1"; char entry2[] = "b=2"; char *env[] = { entry1, entry2, NULL }; if (putenv ((char *) "a=1")) return 1; if (putenv (entry2)) return 2; entry2[0] = 'a'; unsetenv ("a"); if (getenv ("a")) return 3; if (!unsetenv ("") || errno != EINVAL) return 4; entry2[0] = 'b'; environ = env; if (!getenv ("a")) return 5; entry2[0] = 'a'; unsetenv ("a"); if (getenv ("a")) return 6; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : gl_cv_func_unsetenv_works=yes else gl_cv_func_unsetenv_works=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_unsetenv_works" >&5 $as_echo "$gl_cv_func_unsetenv_works" >&6; } case "$gl_cv_func_unsetenv_works" in *yes) ;; *) REPLACE_UNSETENV=1 ;; esac fi if test $HAVE_UNSETENV = 0 || test $REPLACE_UNSETENV = 1; then gl_LIBOBJS="$gl_LIBOBJS unsetenv.$ac_objext" fi GNULIB_UNSETENV=1 $as_echo "#define GNULIB_TEST_UNSETENV 1" >>confdefs.h if test $ac_cv_func_vasnprintf = no; then gl_LIBOBJS="$gl_LIBOBJS vasnprintf.$ac_objext" gl_LIBOBJS="$gl_LIBOBJS printf-args.$ac_objext" gl_LIBOBJS="$gl_LIBOBJS printf-parse.$ac_objext" gl_LIBOBJS="$gl_LIBOBJS asnprintf.$ac_objext" if test $ac_cv_func_vasnprintf = yes; then $as_echo "#define REPLACE_VASNPRINTF 1" >>confdefs.h fi ac_fn_c_check_type "$LINENO" "ptrdiff_t" "ac_cv_type_ptrdiff_t" "$ac_includes_default" if test "x$ac_cv_type_ptrdiff_t" = xyes; then : else $as_echo "#define ptrdiff_t long" >>confdefs.h fi fi for ac_func in vasprintf do : ac_fn_c_check_func "$LINENO" "vasprintf" "ac_cv_func_vasprintf" if test "x$ac_cv_func_vasprintf" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_VASPRINTF 1 _ACEOF fi done if test $ac_cv_func_vasprintf = no; then gl_LIBOBJS="$gl_LIBOBJS vasprintf.$ac_objext" gl_LIBOBJS="$gl_LIBOBJS asprintf.$ac_objext" if test $ac_cv_func_vasprintf = yes; then REPLACE_VASPRINTF=1 else HAVE_VASPRINTF=0 fi fi GNULIB_VASPRINTF=1 $as_echo "#define GNULIB_TEST_VASPRINTF 1" >>confdefs.h XGETTEXT_EXTRA_OPTIONS="$XGETTEXT_EXTRA_OPTIONS --flag=asprintf:2:c-format" XGETTEXT_EXTRA_OPTIONS="$XGETTEXT_EXTRA_OPTIONS --flag=vasprintf:2:c-format" gl_cv_func_vasprintf_posix=no for ac_func in vasprintf do : ac_fn_c_check_func "$LINENO" "vasprintf" "ac_cv_func_vasprintf" if test "x$ac_cv_func_vasprintf" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_VASPRINTF 1 _ACEOF fi done case "$gl_cv_func_printf_sizes_c99" in *yes) case "$gl_cv_func_printf_long_double" in *yes) case "$gl_cv_func_printf_infinite" in *yes) case "$gl_cv_func_printf_infinite_long_double" in *yes) case "$gl_cv_func_printf_directive_a" in *yes) case "$gl_cv_func_printf_directive_f" in *yes) case "$gl_cv_func_printf_directive_n" in *yes) case "$gl_cv_func_printf_directive_ls" in *yes) case "$gl_cv_func_printf_positions" in *yes) case "$gl_cv_func_printf_flag_grouping" in *yes) case "$gl_cv_func_printf_flag_leftadjust" in *yes) case "$gl_cv_func_printf_flag_zero" in *yes) case "$gl_cv_func_printf_precision" in *yes) case "$gl_cv_func_printf_enomem" in *yes) if test $ac_cv_func_vasprintf = yes; then # vasprintf exists and is # already POSIX compliant. gl_cv_func_vasprintf_posix=yes fi ;; esac ;; esac ;; esac ;; esac ;; esac ;; esac ;; esac ;; esac ;; esac ;; esac ;; esac ;; esac ;; esac ;; esac if test $gl_cv_func_vasprintf_posix = no; then case "$gl_cv_func_printf_infinite" in *yes) ;; *) $as_echo "#define NEED_PRINTF_INFINITE_DOUBLE 1" >>confdefs.h ;; esac case "$gl_cv_func_printf_long_double" in *yes) case "$gl_cv_func_printf_infinite_long_double" in *yes) ;; *) $as_echo "#define NEED_PRINTF_INFINITE_LONG_DOUBLE 1" >>confdefs.h ;; esac ;; esac case "$gl_cv_func_printf_directive_a" in *yes) ;; *) $as_echo "#define NEED_PRINTF_DIRECTIVE_A 1" >>confdefs.h for ac_func in nl_langinfo do : ac_fn_c_check_func "$LINENO" "nl_langinfo" "ac_cv_func_nl_langinfo" if test "x$ac_cv_func_nl_langinfo" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_NL_LANGINFO 1 _ACEOF fi done ;; esac case "$gl_cv_func_printf_directive_f" in *yes) ;; *) $as_echo "#define NEED_PRINTF_DIRECTIVE_F 1" >>confdefs.h ;; esac case "$gl_cv_func_printf_directive_ls" in *yes) ;; *) $as_echo "#define NEED_PRINTF_DIRECTIVE_LS 1" >>confdefs.h ;; esac case "$gl_cv_func_printf_flag_grouping" in *yes) ;; *) $as_echo "#define NEED_PRINTF_FLAG_GROUPING 1" >>confdefs.h ;; esac case "$gl_cv_func_printf_flag_leftadjust" in *yes) ;; *) $as_echo "#define NEED_PRINTF_FLAG_LEFTADJUST 1" >>confdefs.h ;; esac case "$gl_cv_func_printf_flag_zero" in *yes) ;; *) $as_echo "#define NEED_PRINTF_FLAG_ZERO 1" >>confdefs.h ;; esac case "$gl_cv_func_printf_precision" in *yes) ;; *) $as_echo "#define NEED_PRINTF_UNBOUNDED_PRECISION 1" >>confdefs.h $as_echo "#define NEED_PRINTF_DOUBLE 1" >>confdefs.h $as_echo "#define NEED_PRINTF_LONG_DOUBLE 1" >>confdefs.h ;; esac case "$gl_cv_func_printf_enomem" in *yes) ;; *) $as_echo "#define NEED_PRINTF_ENOMEM 1" >>confdefs.h $as_echo "#define NEED_PRINTF_DOUBLE 1" >>confdefs.h $as_echo "#define NEED_PRINTF_LONG_DOUBLE 1" >>confdefs.h ;; esac gl_LIBOBJS="$gl_LIBOBJS vasnprintf.$ac_objext" gl_LIBOBJS="$gl_LIBOBJS printf-args.$ac_objext" gl_LIBOBJS="$gl_LIBOBJS printf-parse.$ac_objext" gl_LIBOBJS="$gl_LIBOBJS asnprintf.$ac_objext" if test $ac_cv_func_vasnprintf = yes; then $as_echo "#define REPLACE_VASNPRINTF 1" >>confdefs.h fi ac_fn_c_check_type "$LINENO" "ptrdiff_t" "ac_cv_type_ptrdiff_t" "$ac_includes_default" if test "x$ac_cv_type_ptrdiff_t" = xyes; then : else $as_echo "#define ptrdiff_t long" >>confdefs.h fi gl_LIBOBJS="$gl_LIBOBJS vasprintf.$ac_objext" gl_LIBOBJS="$gl_LIBOBJS asprintf.$ac_objext" if test $ac_cv_func_vasprintf = yes; then REPLACE_VASPRINTF=1 else HAVE_VASPRINTF=0 fi fi # Check whether --with-packager was given. if test "${with_packager+set}" = set; then : withval=$with_packager; case $withval in yes|no) ;; *) cat >>confdefs.h <<_ACEOF #define PACKAGE_PACKAGER "$withval" _ACEOF ;; esac fi # Check whether --with-packager-version was given. if test "${with_packager_version+set}" = set; then : withval=$with_packager_version; case $withval in yes|no) ;; *) cat >>confdefs.h <<_ACEOF #define PACKAGE_PACKAGER_VERSION "$withval" _ACEOF ;; esac fi # Check whether --with-packager-bug-reports was given. if test "${with_packager_bug_reports+set}" = set; then : withval=$with_packager_bug_reports; case $withval in yes|no) ;; *) cat >>confdefs.h <<_ACEOF #define PACKAGE_PACKAGER_BUG_REPORTS "$withval" _ACEOF ;; esac fi if test "X$with_packager" = "X" && \ test "X$with_packager_version$with_packager_bug_reports" != "X" then as_fn_error $? "The --with-packager-{bug-reports,version} options require --with-packager" "$LINENO" 5 fi gl_cv_func_vfprintf_posix=no case "$gl_cv_func_printf_sizes_c99" in *yes) case "$gl_cv_func_printf_long_double" in *yes) case "$gl_cv_func_printf_infinite" in *yes) case "$gl_cv_func_printf_infinite_long_double" in *yes) case "$gl_cv_func_printf_directive_a" in *yes) case "$gl_cv_func_printf_directive_f" in *yes) case "$gl_cv_func_printf_directive_n" in *yes) case "$gl_cv_func_printf_directive_ls" in *yes) case "$gl_cv_func_printf_positions" in *yes) case "$gl_cv_func_printf_flag_grouping" in *yes) case "$gl_cv_func_printf_flag_leftadjust" in *yes) case "$gl_cv_func_printf_flag_zero" in *yes) case "$gl_cv_func_printf_precision" in *yes) case "$gl_cv_func_printf_enomem" in *yes) # vfprintf exists and is # already POSIX compliant. gl_cv_func_vfprintf_posix=yes ;; esac ;; esac ;; esac ;; esac ;; esac ;; esac ;; esac ;; esac ;; esac ;; esac ;; esac ;; esac ;; esac ;; esac if test $gl_cv_func_vfprintf_posix = no; then case "$gl_cv_func_printf_infinite" in *yes) ;; *) $as_echo "#define NEED_PRINTF_INFINITE_DOUBLE 1" >>confdefs.h ;; esac case "$gl_cv_func_printf_long_double" in *yes) case "$gl_cv_func_printf_infinite_long_double" in *yes) ;; *) $as_echo "#define NEED_PRINTF_INFINITE_LONG_DOUBLE 1" >>confdefs.h ;; esac ;; esac case "$gl_cv_func_printf_directive_a" in *yes) ;; *) $as_echo "#define NEED_PRINTF_DIRECTIVE_A 1" >>confdefs.h for ac_func in nl_langinfo do : ac_fn_c_check_func "$LINENO" "nl_langinfo" "ac_cv_func_nl_langinfo" if test "x$ac_cv_func_nl_langinfo" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_NL_LANGINFO 1 _ACEOF fi done ;; esac case "$gl_cv_func_printf_directive_f" in *yes) ;; *) $as_echo "#define NEED_PRINTF_DIRECTIVE_F 1" >>confdefs.h ;; esac case "$gl_cv_func_printf_directive_ls" in *yes) ;; *) $as_echo "#define NEED_PRINTF_DIRECTIVE_LS 1" >>confdefs.h ;; esac case "$gl_cv_func_printf_flag_grouping" in *yes) ;; *) $as_echo "#define NEED_PRINTF_FLAG_GROUPING 1" >>confdefs.h ;; esac case "$gl_cv_func_printf_flag_leftadjust" in *yes) ;; *) $as_echo "#define NEED_PRINTF_FLAG_LEFTADJUST 1" >>confdefs.h ;; esac case "$gl_cv_func_printf_flag_zero" in *yes) ;; *) $as_echo "#define NEED_PRINTF_FLAG_ZERO 1" >>confdefs.h ;; esac case "$gl_cv_func_printf_precision" in *yes) ;; *) $as_echo "#define NEED_PRINTF_UNBOUNDED_PRECISION 1" >>confdefs.h $as_echo "#define NEED_PRINTF_DOUBLE 1" >>confdefs.h $as_echo "#define NEED_PRINTF_LONG_DOUBLE 1" >>confdefs.h ;; esac case "$gl_cv_func_printf_enomem" in *yes) ;; *) $as_echo "#define NEED_PRINTF_ENOMEM 1" >>confdefs.h $as_echo "#define NEED_PRINTF_DOUBLE 1" >>confdefs.h $as_echo "#define NEED_PRINTF_LONG_DOUBLE 1" >>confdefs.h ;; esac gl_LIBOBJS="$gl_LIBOBJS vasnprintf.$ac_objext" gl_LIBOBJS="$gl_LIBOBJS printf-args.$ac_objext" gl_LIBOBJS="$gl_LIBOBJS printf-parse.$ac_objext" gl_LIBOBJS="$gl_LIBOBJS asnprintf.$ac_objext" if test $ac_cv_func_vasnprintf = yes; then $as_echo "#define REPLACE_VASNPRINTF 1" >>confdefs.h fi ac_fn_c_check_type "$LINENO" "ptrdiff_t" "ac_cv_type_ptrdiff_t" "$ac_includes_default" if test "x$ac_cv_type_ptrdiff_t" = xyes; then : else $as_echo "#define ptrdiff_t long" >>confdefs.h fi gl_LIBOBJS="$gl_LIBOBJS vfprintf.$ac_objext" REPLACE_VFPRINTF=1 $as_echo "#define REPLACE_VFPRINTF_POSIX 1" >>confdefs.h : fi GNULIB_VFPRINTF_POSIX=1 $as_echo "#define GNULIB_TEST_VFPRINTF_POSIX 1" >>confdefs.h if test $gl_cv_func_vfprintf_posix = no; then gl_LIBOBJS="$gl_LIBOBJS vprintf.$ac_objext" REPLACE_VPRINTF=1 $as_echo "#define REPLACE_VPRINTF_POSIX 1" >>confdefs.h : fi GNULIB_VPRINTF_POSIX=1 $as_echo "#define GNULIB_TEST_VPRINTF_POSIX 1" >>confdefs.h gl_cv_func_vsnprintf_usable=no for ac_func in vsnprintf do : ac_fn_c_check_func "$LINENO" "vsnprintf" "ac_cv_func_vsnprintf" if test "x$ac_cv_func_vsnprintf" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_VSNPRINTF 1 _ACEOF fi done if test $ac_cv_func_vsnprintf = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether snprintf respects a size of 1" >&5 $as_echo_n "checking whether snprintf respects a size of 1... " >&6; } if ${gl_cv_func_snprintf_size1+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : case "$host_os" in # Guess yes on Android. linux*-android*) gl_cv_func_snprintf_size1="guessing yes" ;; # Guess yes on native Windows. mingw*) gl_cv_func_snprintf_size1="guessing yes" ;; *) gl_cv_func_snprintf_size1="guessing yes" ;; esac else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #if HAVE_SNPRINTF # define my_snprintf snprintf #else # include static int my_snprintf (char *buf, int size, const char *format, ...) { va_list args; int ret; va_start (args, format); ret = vsnprintf (buf, size, format, args); va_end (args); return ret; } #endif int main() { static char buf[8] = { 'D', 'E', 'A', 'D', 'B', 'E', 'E', 'F' }; my_snprintf (buf, 1, "%d", 12345); return buf[1] != 'E'; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : gl_cv_func_snprintf_size1=yes else gl_cv_func_snprintf_size1=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_snprintf_size1" >&5 $as_echo "$gl_cv_func_snprintf_size1" >&6; } case "$gl_cv_func_snprintf_size1" in *yes) case "$gl_cv_func_snprintf_retval_c99" in *yes) { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether printf supports POSIX/XSI format strings with positions" >&5 $as_echo_n "checking whether printf supports POSIX/XSI format strings with positions... " >&6; } if ${gl_cv_func_printf_positions+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : case "$host_os" in netbsd[1-3]* | netbsdelf[1-3]* | netbsdaout[1-3]* | netbsdcoff[1-3]*) gl_cv_func_printf_positions="guessing no";; beos*) gl_cv_func_printf_positions="guessing no";; # Guess yes on Android. linux*-android*) gl_cv_func_printf_positions="guessing yes";; # Guess no on native Windows. mingw* | pw*) gl_cv_func_printf_positions="guessing no";; *) gl_cv_func_printf_positions="guessing yes";; esac else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include /* The string "%2$d %1$d", with dollar characters protected from the shell's dollar expansion (possibly an autoconf bug). */ static char format[] = { '%', '2', '$', 'd', ' ', '%', '1', '$', 'd', '\0' }; static char buf[100]; int main () { sprintf (buf, format, 33, 55); return (strcmp (buf, "55 33") != 0); } _ACEOF if ac_fn_c_try_run "$LINENO"; then : gl_cv_func_printf_positions=yes else gl_cv_func_printf_positions=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_printf_positions" >&5 $as_echo "$gl_cv_func_printf_positions" >&6; } case "$gl_cv_func_printf_positions" in *yes) gl_cv_func_vsnprintf_usable=yes ;; esac ;; esac ;; esac fi if test $gl_cv_func_vsnprintf_usable = no; then gl_LIBOBJS="$gl_LIBOBJS vsnprintf.$ac_objext" if test $ac_cv_func_vsnprintf = yes; then REPLACE_VSNPRINTF=1 else if test $ac_cv_have_decl_vsnprintf = yes; then REPLACE_VSNPRINTF=1 fi fi : fi if test $ac_cv_have_decl_vsnprintf = no; then HAVE_DECL_VSNPRINTF=0 fi GNULIB_VSNPRINTF=1 $as_echo "#define GNULIB_TEST_VSNPRINTF 1" >>confdefs.h gl_cv_func_vsnprintf_posix=no for ac_func in vsnprintf do : ac_fn_c_check_func "$LINENO" "vsnprintf" "ac_cv_func_vsnprintf" if test "x$ac_cv_func_vsnprintf" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_VSNPRINTF 1 _ACEOF fi done if test $ac_cv_func_vsnprintf = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether snprintf truncates the result as in C99" >&5 $as_echo_n "checking whether snprintf truncates the result as in C99... " >&6; } if ${gl_cv_func_snprintf_truncation_c99+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : case "$host_os" in # Guess yes on glibc systems. *-gnu* | gnu*) gl_cv_func_snprintf_truncation_c99="guessing yes";; # Guess yes on musl systems. *-musl*) gl_cv_func_snprintf_truncation_c99="guessing yes";; # Guess yes on FreeBSD >= 5. freebsd[1-4].*) gl_cv_func_snprintf_truncation_c99="guessing no";; freebsd* | kfreebsd*) gl_cv_func_snprintf_truncation_c99="guessing yes";; # Guess yes on Mac OS X >= 10.3. darwin[1-6].*) gl_cv_func_snprintf_truncation_c99="guessing no";; darwin*) gl_cv_func_snprintf_truncation_c99="guessing yes";; # Guess yes on OpenBSD >= 3.9. openbsd[1-2].* | openbsd3.[0-8] | openbsd3.[0-8].*) gl_cv_func_snprintf_truncation_c99="guessing no";; openbsd*) gl_cv_func_snprintf_truncation_c99="guessing yes";; # Guess yes on Solaris >= 2.6. solaris2.[0-5] | solaris2.[0-5].*) gl_cv_func_snprintf_truncation_c99="guessing no";; solaris*) gl_cv_func_snprintf_truncation_c99="guessing yes";; # Guess yes on AIX >= 4. aix[1-3]*) gl_cv_func_snprintf_truncation_c99="guessing no";; aix*) gl_cv_func_snprintf_truncation_c99="guessing yes";; # Guess yes on HP-UX >= 11. hpux[7-9]* | hpux10*) gl_cv_func_snprintf_truncation_c99="guessing no";; hpux*) gl_cv_func_snprintf_truncation_c99="guessing yes";; # Guess yes on IRIX >= 6.5. irix6.5) gl_cv_func_snprintf_truncation_c99="guessing yes";; # Guess yes on OSF/1 >= 5. osf[3-4]*) gl_cv_func_snprintf_truncation_c99="guessing no";; osf*) gl_cv_func_snprintf_truncation_c99="guessing yes";; # Guess yes on NetBSD >= 3. netbsd[1-2]* | netbsdelf[1-2]* | netbsdaout[1-2]* | netbsdcoff[1-2]*) gl_cv_func_snprintf_truncation_c99="guessing no";; netbsd*) gl_cv_func_snprintf_truncation_c99="guessing yes";; # Guess yes on BeOS. beos*) gl_cv_func_snprintf_truncation_c99="guessing yes";; # Guess yes on Android. linux*-android*) gl_cv_func_snprintf_truncation_c99="guessing yes";; # Guess no on native Windows. mingw*) gl_cv_func_snprintf_truncation_c99="guessing no";; # If we don't know, obey --enable-cross-guesses. *) gl_cv_func_snprintf_truncation_c99="$gl_cross_guess_normal";; esac else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if HAVE_SNPRINTF # define my_snprintf snprintf #else # include static int my_snprintf (char *buf, int size, const char *format, ...) { va_list args; int ret; va_start (args, format); ret = vsnprintf (buf, size, format, args); va_end (args); return ret; } #endif static char buf[100]; int main () { strcpy (buf, "ABCDEF"); my_snprintf (buf, 3, "%d %d", 4567, 89); if (memcmp (buf, "45\0DEF", 6) != 0) return 1; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : gl_cv_func_snprintf_truncation_c99=yes else gl_cv_func_snprintf_truncation_c99=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_snprintf_truncation_c99" >&5 $as_echo "$gl_cv_func_snprintf_truncation_c99" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether snprintf fully supports the 'n' directive" >&5 $as_echo_n "checking whether snprintf fully supports the 'n' directive... " >&6; } if ${gl_cv_func_snprintf_directive_n+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : case "$host_os" in # Guess no on glibc when _FORTIFY_SOURCE >= 2. *-gnu* | gnu*) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #if _FORTIFY_SOURCE >= 2 error fail #endif _ACEOF if ac_fn_c_try_compile "$LINENO"; then : gl_cv_func_snprintf_directive_n="guessing yes" else gl_cv_func_snprintf_directive_n="guessing no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ;; # Guess yes on musl systems. *-musl*) gl_cv_func_snprintf_directive_n="guessing yes";; # Guess yes on FreeBSD >= 5. freebsd[1-4].*) gl_cv_func_snprintf_directive_n="guessing no";; freebsd* | kfreebsd*) gl_cv_func_snprintf_directive_n="guessing yes";; # Guess yes on Mac OS X >= 10.3. darwin[1-6].*) gl_cv_func_snprintf_directive_n="guessing no";; darwin*) gl_cv_func_snprintf_directive_n="guessing yes";; # Guess yes on Solaris >= 2.6. solaris2.[0-5] | solaris2.[0-5].*) gl_cv_func_snprintf_directive_n="guessing no";; solaris*) gl_cv_func_snprintf_directive_n="guessing yes";; # Guess yes on AIX >= 4. aix[1-3]*) gl_cv_func_snprintf_directive_n="guessing no";; aix*) gl_cv_func_snprintf_directive_n="guessing yes";; # Guess yes on IRIX >= 6.5. irix6.5) gl_cv_func_snprintf_directive_n="guessing yes";; # Guess yes on OSF/1 >= 5. osf[3-4]*) gl_cv_func_snprintf_directive_n="guessing no";; osf*) gl_cv_func_snprintf_directive_n="guessing yes";; # Guess yes on NetBSD >= 3. netbsd[1-2]* | netbsdelf[1-2]* | netbsdaout[1-2]* | netbsdcoff[1-2]*) gl_cv_func_snprintf_directive_n="guessing no";; netbsd*) gl_cv_func_snprintf_directive_n="guessing yes";; # Guess yes on BeOS. beos*) gl_cv_func_snprintf_directive_n="guessing yes";; # Guess no on Android. linux*-android*) gl_cv_func_snprintf_directive_n="guessing no";; # Guess no on native Windows. mingw*) gl_cv_func_snprintf_directive_n="guessing no";; # If we don't know, obey --enable-cross-guesses. *) gl_cv_func_snprintf_directive_n="$gl_cross_guess_normal";; esac else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if HAVE_SNPRINTF # define my_snprintf snprintf #else # include static int my_snprintf (char *buf, int size, const char *format, ...) { va_list args; int ret; va_start (args, format); ret = vsnprintf (buf, size, format, args); va_end (args); return ret; } #endif static char fmtstring[10]; static char buf[100]; int main () { int count = -1; /* Copy the format string. Some systems (glibc with _FORTIFY_SOURCE=2) support %n in format strings in read-only memory but not in writable memory. */ strcpy (fmtstring, "%d %n"); my_snprintf (buf, 4, fmtstring, 12345, &count, 33, 44, 55); if (count != 6) return 1; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : gl_cv_func_snprintf_directive_n=yes else gl_cv_func_snprintf_directive_n=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_snprintf_directive_n" >&5 $as_echo "$gl_cv_func_snprintf_directive_n" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether snprintf respects a size of 1" >&5 $as_echo_n "checking whether snprintf respects a size of 1... " >&6; } if ${gl_cv_func_snprintf_size1+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : case "$host_os" in # Guess yes on Android. linux*-android*) gl_cv_func_snprintf_size1="guessing yes" ;; # Guess yes on native Windows. mingw*) gl_cv_func_snprintf_size1="guessing yes" ;; *) gl_cv_func_snprintf_size1="guessing yes" ;; esac else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #if HAVE_SNPRINTF # define my_snprintf snprintf #else # include static int my_snprintf (char *buf, int size, const char *format, ...) { va_list args; int ret; va_start (args, format); ret = vsnprintf (buf, size, format, args); va_end (args); return ret; } #endif int main() { static char buf[8] = { 'D', 'E', 'A', 'D', 'B', 'E', 'E', 'F' }; my_snprintf (buf, 1, "%d", 12345); return buf[1] != 'E'; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : gl_cv_func_snprintf_size1=yes else gl_cv_func_snprintf_size1=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_snprintf_size1" >&5 $as_echo "$gl_cv_func_snprintf_size1" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether vsnprintf respects a zero size as in C99" >&5 $as_echo_n "checking whether vsnprintf respects a zero size as in C99... " >&6; } if ${gl_cv_func_vsnprintf_zerosize_c99+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : case "$host_os" in # Guess yes on glibc systems. *-gnu* | gnu*) gl_cv_func_vsnprintf_zerosize_c99="guessing yes";; # Guess yes on musl systems. *-musl*) gl_cv_func_vsnprintf_zerosize_c99="guessing yes";; # Guess yes on FreeBSD >= 5. freebsd[1-4].*) gl_cv_func_vsnprintf_zerosize_c99="guessing no";; freebsd* | kfreebsd*) gl_cv_func_vsnprintf_zerosize_c99="guessing yes";; # Guess yes on Mac OS X >= 10.3. darwin[1-6].*) gl_cv_func_vsnprintf_zerosize_c99="guessing no";; darwin*) gl_cv_func_vsnprintf_zerosize_c99="guessing yes";; # Guess yes on Cygwin. cygwin*) gl_cv_func_vsnprintf_zerosize_c99="guessing yes";; # Guess yes on Solaris >= 2.6. solaris2.[0-5] | solaris2.[0-5].*) gl_cv_func_vsnprintf_zerosize_c99="guessing no";; solaris*) gl_cv_func_vsnprintf_zerosize_c99="guessing yes";; # Guess yes on AIX >= 4. aix[1-3]*) gl_cv_func_vsnprintf_zerosize_c99="guessing no";; aix*) gl_cv_func_vsnprintf_zerosize_c99="guessing yes";; # Guess yes on IRIX >= 6.5. irix6.5) gl_cv_func_vsnprintf_zerosize_c99="guessing yes";; # Guess yes on NetBSD >= 3. netbsd[1-2]* | netbsdelf[1-2]* | netbsdaout[1-2]* | netbsdcoff[1-2]*) gl_cv_func_vsnprintf_zerosize_c99="guessing no";; netbsd*) gl_cv_func_vsnprintf_zerosize_c99="guessing yes";; # Guess yes on BeOS. beos*) gl_cv_func_vsnprintf_zerosize_c99="guessing yes";; # Guess yes on Android. linux*-android*) gl_cv_func_vsnprintf_zerosize_c99="guessing yes";; # Guess yes on native Windows. mingw* | pw*) gl_cv_func_vsnprintf_zerosize_c99="guessing yes";; # If we don't know, obey --enable-cross-guesses. *) gl_cv_func_vsnprintf_zerosize_c99="$gl_cross_guess_normal";; esac else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include static int my_snprintf (char *buf, int size, const char *format, ...) { va_list args; int ret; va_start (args, format); ret = vsnprintf (buf, size, format, args); va_end (args); return ret; } int main() { static char buf[8] = { 'D', 'E', 'A', 'D', 'B', 'E', 'E', 'F' }; my_snprintf (buf, 0, "%d", 12345); return buf[0] != 'D'; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : gl_cv_func_vsnprintf_zerosize_c99=yes else gl_cv_func_vsnprintf_zerosize_c99=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_vsnprintf_zerosize_c99" >&5 $as_echo "$gl_cv_func_vsnprintf_zerosize_c99" >&6; } case "$gl_cv_func_printf_sizes_c99" in *yes) case "$gl_cv_func_printf_long_double" in *yes) case "$gl_cv_func_printf_infinite" in *yes) case "$gl_cv_func_printf_infinite_long_double" in *yes) case "$gl_cv_func_printf_directive_a" in *yes) case "$gl_cv_func_printf_directive_f" in *yes) case "$gl_cv_func_printf_directive_n" in *yes) case "$gl_cv_func_printf_directive_ls" in *yes) case "$gl_cv_func_printf_positions" in *yes) case "$gl_cv_func_printf_flag_grouping" in *yes) case "$gl_cv_func_printf_flag_leftadjust" in *yes) case "$gl_cv_func_printf_flag_zero" in *yes) case "$gl_cv_func_printf_precision" in *yes) case "$gl_cv_func_printf_enomem" in *yes) case "$gl_cv_func_snprintf_truncation_c99" in *yes) case "$gl_cv_func_snprintf_retval_c99" in *yes) case "$gl_cv_func_snprintf_directive_n" in *yes) case "$gl_cv_func_snprintf_size1" in *yes) case "$gl_cv_func_vsnprintf_zerosize_c99" in *yes) # vsnprintf exists and is # already POSIX compliant. gl_cv_func_vsnprintf_posix=yes ;; esac ;; esac ;; esac ;; esac ;; esac ;; esac ;; esac ;; esac ;; esac ;; esac ;; esac ;; esac ;; esac ;; esac ;; esac ;; esac ;; esac ;; esac ;; esac fi if test $gl_cv_func_vsnprintf_posix = no; then case "$gl_cv_func_printf_infinite" in *yes) ;; *) $as_echo "#define NEED_PRINTF_INFINITE_DOUBLE 1" >>confdefs.h ;; esac case "$gl_cv_func_printf_long_double" in *yes) case "$gl_cv_func_printf_infinite_long_double" in *yes) ;; *) $as_echo "#define NEED_PRINTF_INFINITE_LONG_DOUBLE 1" >>confdefs.h ;; esac ;; esac case "$gl_cv_func_printf_directive_a" in *yes) ;; *) $as_echo "#define NEED_PRINTF_DIRECTIVE_A 1" >>confdefs.h for ac_func in nl_langinfo do : ac_fn_c_check_func "$LINENO" "nl_langinfo" "ac_cv_func_nl_langinfo" if test "x$ac_cv_func_nl_langinfo" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_NL_LANGINFO 1 _ACEOF fi done ;; esac case "$gl_cv_func_printf_directive_f" in *yes) ;; *) $as_echo "#define NEED_PRINTF_DIRECTIVE_F 1" >>confdefs.h ;; esac case "$gl_cv_func_printf_directive_ls" in *yes) ;; *) $as_echo "#define NEED_PRINTF_DIRECTIVE_LS 1" >>confdefs.h ;; esac case "$gl_cv_func_printf_flag_grouping" in *yes) ;; *) $as_echo "#define NEED_PRINTF_FLAG_GROUPING 1" >>confdefs.h ;; esac case "$gl_cv_func_printf_flag_leftadjust" in *yes) ;; *) $as_echo "#define NEED_PRINTF_FLAG_LEFTADJUST 1" >>confdefs.h ;; esac case "$gl_cv_func_printf_flag_zero" in *yes) ;; *) $as_echo "#define NEED_PRINTF_FLAG_ZERO 1" >>confdefs.h ;; esac case "$gl_cv_func_printf_precision" in *yes) ;; *) $as_echo "#define NEED_PRINTF_UNBOUNDED_PRECISION 1" >>confdefs.h $as_echo "#define NEED_PRINTF_DOUBLE 1" >>confdefs.h $as_echo "#define NEED_PRINTF_LONG_DOUBLE 1" >>confdefs.h ;; esac case "$gl_cv_func_printf_enomem" in *yes) ;; *) $as_echo "#define NEED_PRINTF_ENOMEM 1" >>confdefs.h $as_echo "#define NEED_PRINTF_DOUBLE 1" >>confdefs.h $as_echo "#define NEED_PRINTF_LONG_DOUBLE 1" >>confdefs.h ;; esac gl_LIBOBJS="$gl_LIBOBJS vasnprintf.$ac_objext" gl_LIBOBJS="$gl_LIBOBJS printf-args.$ac_objext" gl_LIBOBJS="$gl_LIBOBJS printf-parse.$ac_objext" gl_LIBOBJS="$gl_LIBOBJS asnprintf.$ac_objext" if test $ac_cv_func_vasnprintf = yes; then $as_echo "#define REPLACE_VASNPRINTF 1" >>confdefs.h fi ac_fn_c_check_type "$LINENO" "ptrdiff_t" "ac_cv_type_ptrdiff_t" "$ac_includes_default" if test "x$ac_cv_type_ptrdiff_t" = xyes; then : else $as_echo "#define ptrdiff_t long" >>confdefs.h fi gl_LIBOBJS="$gl_LIBOBJS vsnprintf.$ac_objext" if test $ac_cv_func_vsnprintf = yes; then REPLACE_VSNPRINTF=1 else if test $ac_cv_have_decl_vsnprintf = yes; then REPLACE_VSNPRINTF=1 fi fi : fi gl_cv_func_vsprintf_posix=no case "$gl_cv_func_printf_sizes_c99" in *yes) case "$gl_cv_func_printf_long_double" in *yes) case "$gl_cv_func_printf_infinite" in *yes) case "$gl_cv_func_printf_infinite_long_double" in *yes) case "$gl_cv_func_printf_directive_a" in *yes) case "$gl_cv_func_printf_directive_f" in *yes) case "$gl_cv_func_printf_directive_n" in *yes) case "$gl_cv_func_printf_directive_ls" in *yes) case "$gl_cv_func_printf_positions" in *yes) case "$gl_cv_func_printf_flag_grouping" in *yes) case "$gl_cv_func_printf_flag_leftadjust" in *yes) case "$gl_cv_func_printf_flag_zero" in *yes) case "$gl_cv_func_printf_precision" in *yes) case "$gl_cv_func_printf_enomem" in *yes) # vsprintf exists and is # already POSIX compliant. gl_cv_func_vsprintf_posix=yes ;; esac ;; esac ;; esac ;; esac ;; esac ;; esac ;; esac ;; esac ;; esac ;; esac ;; esac ;; esac ;; esac ;; esac if test $gl_cv_func_vsprintf_posix = no; then case "$gl_cv_func_printf_infinite" in *yes) ;; *) $as_echo "#define NEED_PRINTF_INFINITE_DOUBLE 1" >>confdefs.h ;; esac case "$gl_cv_func_printf_long_double" in *yes) case "$gl_cv_func_printf_infinite_long_double" in *yes) ;; *) $as_echo "#define NEED_PRINTF_INFINITE_LONG_DOUBLE 1" >>confdefs.h ;; esac ;; esac case "$gl_cv_func_printf_directive_a" in *yes) ;; *) $as_echo "#define NEED_PRINTF_DIRECTIVE_A 1" >>confdefs.h for ac_func in nl_langinfo do : ac_fn_c_check_func "$LINENO" "nl_langinfo" "ac_cv_func_nl_langinfo" if test "x$ac_cv_func_nl_langinfo" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_NL_LANGINFO 1 _ACEOF fi done ;; esac case "$gl_cv_func_printf_directive_f" in *yes) ;; *) $as_echo "#define NEED_PRINTF_DIRECTIVE_F 1" >>confdefs.h ;; esac case "$gl_cv_func_printf_directive_ls" in *yes) ;; *) $as_echo "#define NEED_PRINTF_DIRECTIVE_LS 1" >>confdefs.h ;; esac case "$gl_cv_func_printf_flag_grouping" in *yes) ;; *) $as_echo "#define NEED_PRINTF_FLAG_GROUPING 1" >>confdefs.h ;; esac case "$gl_cv_func_printf_flag_leftadjust" in *yes) ;; *) $as_echo "#define NEED_PRINTF_FLAG_LEFTADJUST 1" >>confdefs.h ;; esac case "$gl_cv_func_printf_flag_zero" in *yes) ;; *) $as_echo "#define NEED_PRINTF_FLAG_ZERO 1" >>confdefs.h ;; esac case "$gl_cv_func_printf_precision" in *yes) ;; *) $as_echo "#define NEED_PRINTF_UNBOUNDED_PRECISION 1" >>confdefs.h $as_echo "#define NEED_PRINTF_DOUBLE 1" >>confdefs.h $as_echo "#define NEED_PRINTF_LONG_DOUBLE 1" >>confdefs.h ;; esac case "$gl_cv_func_printf_enomem" in *yes) ;; *) $as_echo "#define NEED_PRINTF_ENOMEM 1" >>confdefs.h $as_echo "#define NEED_PRINTF_DOUBLE 1" >>confdefs.h $as_echo "#define NEED_PRINTF_LONG_DOUBLE 1" >>confdefs.h ;; esac gl_LIBOBJS="$gl_LIBOBJS vasnprintf.$ac_objext" gl_LIBOBJS="$gl_LIBOBJS printf-args.$ac_objext" gl_LIBOBJS="$gl_LIBOBJS printf-parse.$ac_objext" gl_LIBOBJS="$gl_LIBOBJS asnprintf.$ac_objext" if test $ac_cv_func_vasnprintf = yes; then $as_echo "#define REPLACE_VASNPRINTF 1" >>confdefs.h fi ac_fn_c_check_type "$LINENO" "ptrdiff_t" "ac_cv_type_ptrdiff_t" "$ac_includes_default" if test "x$ac_cv_type_ptrdiff_t" = xyes; then : else $as_echo "#define ptrdiff_t long" >>confdefs.h fi gl_LIBOBJS="$gl_LIBOBJS vsprintf.$ac_objext" REPLACE_VSPRINTF=1 : fi GNULIB_VSPRINTF_POSIX=1 $as_echo "#define GNULIB_TEST_VSPRINTF_POSIX 1" >>confdefs.h if test $gl_cv_have_include_next = yes; then gl_cv_next_wchar_h='<'wchar.h'>' else { $as_echo "$as_me:${as_lineno-$LINENO}: checking absolute name of " >&5 $as_echo_n "checking absolute name of ... " >&6; } if ${gl_cv_next_wchar_h+:} false; then : $as_echo_n "(cached) " >&6 else if test $ac_cv_header_wchar_h = yes; then cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF case "$host_os" in aix*) gl_absname_cpp="$ac_cpp -C" ;; *) gl_absname_cpp="$ac_cpp" ;; esac case "$host_os" in mingw*) gl_dirsep_regex='[/\\]' ;; *) gl_dirsep_regex='\/' ;; esac gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g' gl_header_literal_regex=`echo 'wchar.h' \ | sed -e "$gl_make_literal_regex_sed"` gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{ s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/ s|^/[^/]|//&| p q }' gl_cv_absolute_wchar_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 | sed -n "$gl_absolute_header_sed"` gl_header=$gl_cv_absolute_wchar_h gl_cv_next_wchar_h='"'$gl_header'"' else gl_cv_next_wchar_h='<'wchar.h'>' fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_wchar_h" >&5 $as_echo "$gl_cv_next_wchar_h" >&6; } fi NEXT_WCHAR_H=$gl_cv_next_wchar_h if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next' gl_next_as_first_directive='<'wchar.h'>' else # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include' gl_next_as_first_directive=$gl_cv_next_wchar_h fi NEXT_AS_FIRST_DIRECTIVE_WCHAR_H=$gl_next_as_first_directive if test $ac_cv_header_wchar_h = yes; then HAVE_WCHAR_H=1 else HAVE_WCHAR_H=0 fi if test $gt_cv_c_wint_t = yes; then HAVE_WINT_T=1 else HAVE_WINT_T=0 fi if case "$host_os" in mingw*) true ;; *) test $ac_cv_func_mbsinit = yes ;; esac \ && test $ac_cv_func_mbrtowc = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether mbrtowc handles incomplete characters" >&5 $as_echo_n "checking whether mbrtowc handles incomplete characters... " >&6; } if ${gl_cv_func_mbrtowc_incomplete_state+:} false; then : $as_echo_n "(cached) " >&6 else case "$host_os" in # Guess no on AIX and OSF/1. aix* | osf*) gl_cv_func_mbrtowc_incomplete_state="guessing no" ;; # Guess yes otherwise. *) gl_cv_func_mbrtowc_incomplete_state="guessing yes" ;; esac if test $LOCALE_JA != none; then if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include /* Tru64 with Desktop Toolkit C has a bug: must be included before . BSD/OS 4.0.1 has a bug: , and must be included before . */ #include #include #include #include int main () { if (setlocale (LC_ALL, "$LOCALE_JA") != NULL) { const char input[] = "B\217\253\344\217\251\316er"; /* "Büßer" */ mbstate_t state; wchar_t wc; memset (&state, '\0', sizeof (mbstate_t)); if (mbrtowc (&wc, input + 1, 1, &state) == (size_t)(-2)) if (mbsinit (&state)) return 2; } return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : gl_cv_func_mbrtowc_incomplete_state=yes else gl_cv_func_mbrtowc_incomplete_state=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi else if test $LOCALE_FR_UTF8 != none; then if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include /* Tru64 with Desktop Toolkit C has a bug: must be included before . BSD/OS 4.0.1 has a bug: , and must be included before . */ #include #include #include #include int main () { if (setlocale (LC_ALL, "$LOCALE_FR_UTF8") != NULL) { const char input[] = "B\303\274\303\237er"; /* "Büßer" */ mbstate_t state; wchar_t wc; memset (&state, '\0', sizeof (mbstate_t)); if (mbrtowc (&wc, input + 1, 1, &state) == (size_t)(-2)) if (mbsinit (&state)) return 2; } return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : gl_cv_func_mbrtowc_incomplete_state=yes else gl_cv_func_mbrtowc_incomplete_state=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_mbrtowc_incomplete_state" >&5 $as_echo "$gl_cv_func_mbrtowc_incomplete_state" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether mbrtowc works as well as mbtowc" >&5 $as_echo_n "checking whether mbrtowc works as well as mbtowc... " >&6; } if ${gl_cv_func_mbrtowc_sanitycheck+:} false; then : $as_echo_n "(cached) " >&6 else case "$host_os" in # Guess no on Solaris 8. solaris2.8) gl_cv_func_mbrtowc_sanitycheck="guessing no" ;; # Guess yes otherwise. *) gl_cv_func_mbrtowc_sanitycheck="guessing yes" ;; esac if test $LOCALE_ZH_CN != none; then if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include /* Tru64 with Desktop Toolkit C has a bug: must be included before . BSD/OS 4.0.1 has a bug: , and must be included before . */ #include #include #include #include int main () { /* This fails on Solaris 8: mbrtowc returns 2, and sets wc to 0x00F0. mbtowc returns 4 (correct) and sets wc to 0x5EDC. */ if (setlocale (LC_ALL, "$LOCALE_ZH_CN") != NULL) { char input[] = "B\250\271\201\060\211\070er"; /* "Büßer" */ mbstate_t state; wchar_t wc; memset (&state, '\0', sizeof (mbstate_t)); if (mbrtowc (&wc, input + 3, 6, &state) != 4 && mbtowc (&wc, input + 3, 6) == 4) return 2; } return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : gl_cv_func_mbrtowc_sanitycheck=yes else gl_cv_func_mbrtowc_sanitycheck=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_mbrtowc_sanitycheck" >&5 $as_echo "$gl_cv_func_mbrtowc_sanitycheck" >&6; } REPLACE_MBSTATE_T=0 case "$gl_cv_func_mbrtowc_incomplete_state" in *yes) ;; *) REPLACE_MBSTATE_T=1 ;; esac case "$gl_cv_func_mbrtowc_sanitycheck" in *yes) ;; *) REPLACE_MBSTATE_T=1 ;; esac else REPLACE_MBSTATE_T=1 fi if test $ac_cv_func_wcrtomb = no; then HAVE_WCRTOMB=0 ac_fn_c_check_decl "$LINENO" "wcrtomb" "ac_cv_have_decl_wcrtomb" " /* Tru64 with Desktop Toolkit C has a bug: must be included before . BSD/OS 4.0.1 has a bug: , and must be included before . */ #include #include #include #include " if test "x$ac_cv_have_decl_wcrtomb" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_WCRTOMB $ac_have_decl _ACEOF if test $ac_cv_have_decl_wcrtomb = yes; then REPLACE_WCRTOMB=1 fi else if test $REPLACE_WCRTOMB = 0; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether wcrtomb works in the C locale" >&5 $as_echo_n "checking whether wcrtomb works in the C locale... " >&6; } if ${gl_cv_func_wcrtomb_works+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : case "$host_os" in # Guess no on Android. linux*-android*) gl_cv_func_wcrtomb_works="guessing no";; # Guess yes otherwise. *) gl_cv_func_wcrtomb_works="guessing yes";; esac else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include /* Tru64 with Desktop Toolkit C has a bug: must be included before . BSD/OS 4.0.1 has a bug: , and must be included before . */ #include #include #include int main () { mbstate_t state; char out[64]; int count; memset (&state, 0, sizeof (state)); out[0] = 'x'; count = wcrtomb (out, L'a', &state); return !(count == 1 && out[0] == 'a'); } _ACEOF if ac_fn_c_try_run "$LINENO"; then : gl_cv_func_wcrtomb_works=yes else gl_cv_func_wcrtomb_works=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_wcrtomb_works" >&5 $as_echo "$gl_cv_func_wcrtomb_works" >&6; } case "$gl_cv_func_wcrtomb_works" in *yes) ;; *) $as_echo "#define WCRTOMB_C_LOCALE_BUG 1" >>confdefs.h REPLACE_WCRTOMB=1 ;; esac fi if test $REPLACE_WCRTOMB = 0; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether wcrtomb return value is correct" >&5 $as_echo_n "checking whether wcrtomb return value is correct... " >&6; } if ${gl_cv_func_wcrtomb_retval+:} false; then : $as_echo_n "(cached) " >&6 else case "$host_os" in # Guess no on AIX 4, OSF/1, Solaris, native Windows. aix4* | osf* | solaris* | mingw*) gl_cv_func_wcrtomb_retval="guessing no" ;; # Guess yes otherwise. *) gl_cv_func_wcrtomb_retval="guessing yes" ;; esac if test $LOCALE_FR != none || test $LOCALE_FR_UTF8 != none || test $LOCALE_JA != none || test $LOCALE_ZH_CN != none; then if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include /* Tru64 with Desktop Toolkit C has a bug: must be included before . BSD/OS 4.0.1 has a bug: , and must be included before . */ #include #include #include #include #include int main () { int result = 0; if (setlocale (LC_ALL, "$LOCALE_FR") != NULL) { if (wcrtomb (NULL, 0, NULL) != 1) result |= 1; } if (setlocale (LC_ALL, "$LOCALE_FR_UTF8") != NULL) { if (wcrtomb (NULL, 0, NULL) != 1) result |= 2; { wchar_t wc = (wchar_t) 0xBADFACE; if (mbtowc (&wc, "\303\274", 2) == 2) if (wcrtomb (NULL, wc, NULL) != 1) result |= 2; } } if (setlocale (LC_ALL, "$LOCALE_JA") != NULL) { if (wcrtomb (NULL, 0, NULL) != 1) result |= 4; } if (setlocale (LC_ALL, "$LOCALE_ZH_CN") != NULL) { if (wcrtomb (NULL, 0, NULL) != 1) result |= 8; } return result; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : gl_cv_func_wcrtomb_retval=yes else gl_cv_func_wcrtomb_retval=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_wcrtomb_retval" >&5 $as_echo "$gl_cv_func_wcrtomb_retval" >&6; } case "$gl_cv_func_wcrtomb_retval" in *yes) ;; *) $as_echo "#define WCRTOMB_RETVAL_BUG 1" >>confdefs.h REPLACE_WCRTOMB=1 ;; esac fi fi if test $HAVE_WCRTOMB = 0 || test $REPLACE_WCRTOMB = 1; then gl_LIBOBJS="$gl_LIBOBJS wcrtomb.$ac_objext" : fi GNULIB_WCRTOMB=1 $as_echo "#define GNULIB_TEST_WCRTOMB 1" >>confdefs.h if test $ac_cv_func_iswcntrl = yes; then HAVE_ISWCNTRL=1 else HAVE_ISWCNTRL=0 fi if test $gt_cv_c_wint_t = yes; then HAVE_WINT_T=1 else HAVE_WINT_T=0 fi if test $gl_cv_have_include_next = yes; then gl_cv_next_wctype_h='<'wctype.h'>' else { $as_echo "$as_me:${as_lineno-$LINENO}: checking absolute name of " >&5 $as_echo_n "checking absolute name of ... " >&6; } if ${gl_cv_next_wctype_h+:} false; then : $as_echo_n "(cached) " >&6 else if test $ac_cv_header_wctype_h = yes; then cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF case "$host_os" in aix*) gl_absname_cpp="$ac_cpp -C" ;; *) gl_absname_cpp="$ac_cpp" ;; esac case "$host_os" in mingw*) gl_dirsep_regex='[/\\]' ;; *) gl_dirsep_regex='\/' ;; esac gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g' gl_header_literal_regex=`echo 'wctype.h' \ | sed -e "$gl_make_literal_regex_sed"` gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{ s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/ s|^/[^/]|//&| p q }' gl_cv_absolute_wctype_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 | sed -n "$gl_absolute_header_sed"` gl_header=$gl_cv_absolute_wctype_h gl_cv_next_wctype_h='"'$gl_header'"' else gl_cv_next_wctype_h='<'wctype.h'>' fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_wctype_h" >&5 $as_echo "$gl_cv_next_wctype_h" >&6; } fi NEXT_WCTYPE_H=$gl_cv_next_wctype_h if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next' gl_next_as_first_directive='<'wctype.h'>' else # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include' gl_next_as_first_directive=$gl_cv_next_wctype_h fi NEXT_AS_FIRST_DIRECTIVE_WCTYPE_H=$gl_next_as_first_directive if test $ac_cv_header_wctype_h = yes; then if test $ac_cv_func_iswcntrl = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether iswcntrl works" >&5 $as_echo_n "checking whether iswcntrl works... " >&6; } if ${gl_cv_func_iswcntrl_works+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #if __GNU_LIBRARY__ == 1 Linux libc5 i18n is broken. #endif int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : gl_cv_func_iswcntrl_works="guessing yes" else gl_cv_func_iswcntrl_works="guessing no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Tru64 with Desktop Toolkit C has a bug: must be included before . BSD/OS 4.0.1 has a bug: , and must be included before . */ #include #include #include #include #include int main () { return iswprint ('x') == 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : gl_cv_func_iswcntrl_works=yes else gl_cv_func_iswcntrl_works=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_iswcntrl_works" >&5 $as_echo "$gl_cv_func_iswcntrl_works" >&6; } fi HAVE_WCTYPE_H=1 else HAVE_WCTYPE_H=0 fi if test $GNULIB_OVERRIDES_WINT_T = 1; then REPLACE_ISWCNTRL=1 else case "$gl_cv_func_iswcntrl_works" in *yes) REPLACE_ISWCNTRL=0 ;; *) REPLACE_ISWCNTRL=1 ;; esac fi if test $HAVE_ISWCNTRL = 0 || test $REPLACE_ISWCNTRL = 1; then : fi if test $REPLACE_ISWCNTRL = 1; then REPLACE_TOWLOWER=1 else for ac_func in towlower do : ac_fn_c_check_func "$LINENO" "towlower" "ac_cv_func_towlower" if test "x$ac_cv_func_towlower" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_TOWLOWER 1 _ACEOF fi done if test $ac_cv_func_towlower = yes; then REPLACE_TOWLOWER=0 else ac_fn_c_check_decl "$LINENO" "towlower" "ac_cv_have_decl_towlower" "/* Tru64 with Desktop Toolkit C has a bug: must be included before . BSD/OS 4.0.1 has a bug: , and must be included before . */ #include #include #include #include #if HAVE_WCTYPE_H # include #endif " if test "x$ac_cv_have_decl_towlower" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_TOWLOWER $ac_have_decl _ACEOF if test $ac_cv_have_decl_towlower = yes; then REPLACE_TOWLOWER=1 else REPLACE_TOWLOWER=0 fi fi fi if test $HAVE_ISWCNTRL = 0 || test $REPLACE_TOWLOWER = 1; then : fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for wctype_t" >&5 $as_echo_n "checking for wctype_t... " >&6; } if ${gl_cv_type_wctype_t+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Tru64 with Desktop Toolkit C has a bug: must be included before . BSD/OS 4.0.1 has a bug: , and must be included before . */ #include #include #include #include #if HAVE_WCTYPE_H # include #endif wctype_t a; int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : gl_cv_type_wctype_t=yes else gl_cv_type_wctype_t=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_type_wctype_t" >&5 $as_echo "$gl_cv_type_wctype_t" >&6; } if test $gl_cv_type_wctype_t = no; then HAVE_WCTYPE_T=0 fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for wctrans_t" >&5 $as_echo_n "checking for wctrans_t... " >&6; } if ${gl_cv_type_wctrans_t+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Tru64 with Desktop Toolkit C has a bug: must be included before . BSD/OS 4.0.1 has a bug: , and must be included before . */ #include #include #include #include #include wctrans_t a; int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : gl_cv_type_wctrans_t=yes else gl_cv_type_wctrans_t=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_type_wctrans_t" >&5 $as_echo "$gl_cv_type_wctrans_t" >&6; } if test $gl_cv_type_wctrans_t = no; then HAVE_WCTRANS_T=0 fi ac_fn_c_check_decl "$LINENO" "wcwidth" "ac_cv_have_decl_wcwidth" " /* AIX 3.2.5 declares wcwidth in . */ #include /* Tru64 with Desktop Toolkit C has a bug: must be included before . BSD/OS 4.0.1 has a bug: , and must be included before . */ #include #include #include #include " if test "x$ac_cv_have_decl_wcwidth" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_WCWIDTH $ac_have_decl _ACEOF if test $ac_cv_have_decl_wcwidth != yes; then HAVE_DECL_WCWIDTH=0 fi if test $ac_cv_func_wcwidth != yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether wcwidth is a macro" >&5 $as_echo_n "checking whether wcwidth is a macro... " >&6; } if ${gl_cv_func_wcwidth_macro+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #ifdef wcwidth wchar_header_defines_wcwidth #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "wchar_header_defines_wcwidth" >/dev/null 2>&1; then : gl_cv_func_wcwidth_macro=yes else gl_cv_func_wcwidth_macro=no fi rm -f conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_wcwidth_macro" >&5 $as_echo "$gl_cv_func_wcwidth_macro" >&6; } fi if test $ac_cv_func_wcwidth = yes || test $gl_cv_func_wcwidth_macro = yes; then HAVE_WCWIDTH=1 { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether wcwidth works reasonably in UTF-8 locales" >&5 $as_echo_n "checking whether wcwidth works reasonably in UTF-8 locales... " >&6; } if ${gl_cv_func_wcwidth_works+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : case "$host_os" in # Guess yes on glibc systems. *-gnu* | gnu*) gl_cv_func_wcwidth_works="guessing yes";; # Guess yes on musl systems. *-musl*) gl_cv_func_wcwidth_works="guessing yes";; # Guess yes on AIX 7 systems. aix[7-9]*) gl_cv_func_wcwidth_works="guessing yes";; *) gl_cv_func_wcwidth_works="$gl_cross_guess_normal";; esac else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include /* AIX 3.2.5 declares wcwidth in . */ #include /* Tru64 with Desktop Toolkit C has a bug: must be included before . BSD/OS 4.0.1 has a bug: , and must be included before . */ #include #include #include #include #if !HAVE_DECL_WCWIDTH extern # ifdef __cplusplus "C" # endif int wcwidth (int); #endif int main () { int result = 0; if (setlocale (LC_ALL, "en_US.UTF-8") != NULL) { if (wcwidth (0x0301) > 0) result |= 1; if (wcwidth (0x05B0) > 0) result |= 2; if (wcwidth (0x200B) > 0) result |= 4; if (wcwidth (0xFF1A) == 0) result |= 8; if (wcwidth (0x2202) > 1) result |= 16; } return result; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : gl_cv_func_wcwidth_works=yes else gl_cv_func_wcwidth_works=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_wcwidth_works" >&5 $as_echo "$gl_cv_func_wcwidth_works" >&6; } case "$gl_cv_func_wcwidth_works" in *yes) ;; *no) REPLACE_WCWIDTH=1 ;; esac else HAVE_WCWIDTH=0 fi if test $HAVE_WCWIDTH = 0 || test $REPLACE_WCWIDTH = 1; then gl_LIBOBJS="$gl_LIBOBJS wcwidth.$ac_objext" : fi GNULIB_WCWIDTH=1 $as_echo "#define GNULIB_TEST_WCWIDTH 1" >>confdefs.h case "$host_os" in mingw*) gl_LIBOBJS="$gl_LIBOBJS windows-mutex.$ac_objext" ;; esac case "$host_os" in mingw*) gl_LIBOBJS="$gl_LIBOBJS windows-once.$ac_objext" ;; esac case "$host_os" in mingw*) gl_LIBOBJS="$gl_LIBOBJS windows-recmutex.$ac_objext" ;; esac case "$host_os" in mingw*) gl_LIBOBJS="$gl_LIBOBJS windows-rwlock.$ac_objext" ;; esac case "$host_os" in mingw*) gl_LIBOBJS="$gl_LIBOBJS windows-spin.$ac_objext" ;; esac if test $HAVE_MSVC_INVALID_PARAMETER_HANDLER = 1; then REPLACE_WRITE=1 fi if test $REPLACE_WRITE = 1; then gl_LIBOBJS="$gl_LIBOBJS write.$ac_objext" : fi GNULIB_WRITE=1 $as_echo "#define GNULIB_TEST_WRITE 1" >>confdefs.h : for ac_header in stdint.h do : ac_fn_c_check_header_mongrel "$LINENO" "stdint.h" "ac_cv_header_stdint_h" "$ac_includes_default" if test "x$ac_cv_header_stdint_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_STDINT_H 1 _ACEOF fi done : : XGETTEXT_EXTRA_OPTIONS="$XGETTEXT_EXTRA_OPTIONS --flag=xasprintf:1:c-format" # End of code from modules gltests_libdeps= gltests_ltlibdeps= gl_source_base='tests' gltests_WITNESS=IN_`echo "${PACKAGE-$PACKAGE_TARNAME}" | LC_ALL=C tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ | LC_ALL=C sed -e 's/[^A-Z0-9_]/_/g'`_GNULIB_TESTS gl_module_indicator_condition=$gltests_WITNESS { $as_echo "$as_me:${as_lineno-$LINENO}: checking for inline" >&5 $as_echo_n "checking for inline... " >&6; } if ${ac_cv_c_inline+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_c_inline=no for ac_kw in inline __inline__ __inline; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifndef __cplusplus typedef int foo_t; static $ac_kw foo_t static_foo () {return 0; } $ac_kw foo_t foo () {return 0; } #endif _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_inline=$ac_kw fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext test "$ac_cv_c_inline" != no && break done fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_inline" >&5 $as_echo "$ac_cv_c_inline" >&6; } case $ac_cv_c_inline in inline | yes) ;; *) case $ac_cv_c_inline in no) ac_val=;; *) ac_val=$ac_cv_c_inline;; esac cat >>confdefs.h <<_ACEOF #ifndef __cplusplus #define inline $ac_val #endif _ACEOF ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether byte ordering is bigendian" >&5 $as_echo_n "checking whether byte ordering is bigendian... " >&6; } if ${ac_cv_c_bigendian+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_c_bigendian=unknown # See if we're dealing with a universal compiler. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifndef __APPLE_CC__ not a universal capable compiler #endif typedef int dummy; _ACEOF if ac_fn_c_try_compile "$LINENO"; then : # Check for potential -arch flags. It is not universal unless # there are at least two -arch flags with different values. ac_arch= ac_prev= for ac_word in $CC $CFLAGS $CPPFLAGS $LDFLAGS; do if test -n "$ac_prev"; then case $ac_word in i?86 | x86_64 | ppc | ppc64) if test -z "$ac_arch" || test "$ac_arch" = "$ac_word"; then ac_arch=$ac_word else ac_cv_c_bigendian=universal break fi ;; esac ac_prev= elif test "x$ac_word" = "x-arch"; then ac_prev=arch fi done fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_c_bigendian = unknown; then # See if sys/param.h defines the BYTE_ORDER macro. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { #if ! (defined BYTE_ORDER && defined BIG_ENDIAN \ && defined LITTLE_ENDIAN && BYTE_ORDER && BIG_ENDIAN \ && LITTLE_ENDIAN) bogus endian macros #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : # It does; now see whether it defined to BIG_ENDIAN or not. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { #if BYTE_ORDER != BIG_ENDIAN not big endian #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_bigendian=yes else ac_cv_c_bigendian=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi if test $ac_cv_c_bigendian = unknown; then # See if defines _LITTLE_ENDIAN or _BIG_ENDIAN (e.g., Solaris). cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { #if ! (defined _LITTLE_ENDIAN || defined _BIG_ENDIAN) bogus endian macros #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : # It does; now see whether it defined to _BIG_ENDIAN or not. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { #ifndef _BIG_ENDIAN not big endian #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_bigendian=yes else ac_cv_c_bigendian=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi if test $ac_cv_c_bigendian = unknown; then # Compile a test program. if test "$cross_compiling" = yes; then : # Try to guess by grepping values from an object file. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ short int ascii_mm[] = { 0x4249, 0x4765, 0x6E44, 0x6961, 0x6E53, 0x7953, 0 }; short int ascii_ii[] = { 0x694C, 0x5454, 0x656C, 0x6E45, 0x6944, 0x6E61, 0 }; int use_ascii (int i) { return ascii_mm[i] + ascii_ii[i]; } short int ebcdic_ii[] = { 0x89D3, 0xE3E3, 0x8593, 0x95C5, 0x89C4, 0x9581, 0 }; short int ebcdic_mm[] = { 0xC2C9, 0xC785, 0x95C4, 0x8981, 0x95E2, 0xA8E2, 0 }; int use_ebcdic (int i) { return ebcdic_mm[i] + ebcdic_ii[i]; } extern int foo; int main () { return use_ascii (foo) == use_ebcdic (foo); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : if grep BIGenDianSyS conftest.$ac_objext >/dev/null; then ac_cv_c_bigendian=yes fi if grep LiTTleEnDian conftest.$ac_objext >/dev/null ; then if test "$ac_cv_c_bigendian" = unknown; then ac_cv_c_bigendian=no else # finding both strings is unlikely to happen, but who knows? ac_cv_c_bigendian=unknown fi fi fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { /* Are we little or big endian? From Harbison&Steele. */ union { long int l; char c[sizeof (long int)]; } u; u.l = 1; return u.c[sizeof (long int) - 1] == 1; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_c_bigendian=no else ac_cv_c_bigendian=yes fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_bigendian" >&5 $as_echo "$ac_cv_c_bigendian" >&6; } case $ac_cv_c_bigendian in #( yes) $as_echo "#define WORDS_BIGENDIAN 1" >>confdefs.h ;; #( no) ;; #( universal) $as_echo "#define AC_APPLE_UNIVERSAL_BUILD 1" >>confdefs.h ;; #( *) as_fn_error $? "unknown endianness presetting ac_cv_c_bigendian=no (or yes) will help" "$LINENO" 5 ;; esac for ac_func in __setfpucw fork execl isinf isnan finite getpid feholdexcept fpsetmask popen round do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5 $as_echo_n "checking whether ln -s works... " >&6; } LN_S=$as_ln_s if test "$LN_S" = "ln -s"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5 $as_echo "no, using $LN_S" >&6; } fi # iconv is required am_save_CPPFLAGS="$CPPFLAGS" for element in $INCICONV; do haveit= for x in $CPPFLAGS; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X$element"; then haveit=yes break fi done if test -z "$haveit"; then CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }$element" fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking for iconv" >&5 $as_echo_n "checking for iconv... " >&6; } if ${am_cv_func_iconv+:} false; then : $as_echo_n "(cached) " >&6 else am_cv_func_iconv="no, consider installing GNU libiconv" am_cv_lib_iconv=no cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { iconv_t cd = iconv_open("",""); iconv(cd,NULL,NULL,NULL,NULL); iconv_close(cd); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : am_cv_func_iconv=yes fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test "$am_cv_func_iconv" != yes; then am_save_LIBS="$LIBS" LIBS="$LIBS $LIBICONV" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { iconv_t cd = iconv_open("",""); iconv(cd,NULL,NULL,NULL,NULL); iconv_close(cd); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : am_cv_lib_iconv=yes am_cv_func_iconv=yes fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS="$am_save_LIBS" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_func_iconv" >&5 $as_echo "$am_cv_func_iconv" >&6; } if test "$am_cv_func_iconv" = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working iconv" >&5 $as_echo_n "checking for working iconv... " >&6; } if ${am_cv_func_iconv_works+:} false; then : $as_echo_n "(cached) " >&6 else am_save_LIBS="$LIBS" if test $am_cv_lib_iconv = yes; then LIBS="$LIBS $LIBICONV" fi am_cv_func_iconv_works=no for ac_iconv_const in '' 'const'; do if test "$cross_compiling" = yes; then : case "$host_os" in aix* | hpux*) am_cv_func_iconv_works="guessing no" ;; *) am_cv_func_iconv_works="guessing yes" ;; esac else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #ifndef ICONV_CONST # define ICONV_CONST $ac_iconv_const #endif int main () { int result = 0; /* Test against AIX 5.1 bug: Failures are not distinguishable from successful returns. */ { iconv_t cd_utf8_to_88591 = iconv_open ("ISO8859-1", "UTF-8"); if (cd_utf8_to_88591 != (iconv_t)(-1)) { static ICONV_CONST char input[] = "\342\202\254"; /* EURO SIGN */ char buf[10]; ICONV_CONST char *inptr = input; size_t inbytesleft = strlen (input); char *outptr = buf; size_t outbytesleft = sizeof (buf); size_t res = iconv (cd_utf8_to_88591, &inptr, &inbytesleft, &outptr, &outbytesleft); if (res == 0) result |= 1; iconv_close (cd_utf8_to_88591); } } /* Test against Solaris 10 bug: Failures are not distinguishable from successful returns. */ { iconv_t cd_ascii_to_88591 = iconv_open ("ISO8859-1", "646"); if (cd_ascii_to_88591 != (iconv_t)(-1)) { static ICONV_CONST char input[] = "\263"; char buf[10]; ICONV_CONST char *inptr = input; size_t inbytesleft = strlen (input); char *outptr = buf; size_t outbytesleft = sizeof (buf); size_t res = iconv (cd_ascii_to_88591, &inptr, &inbytesleft, &outptr, &outbytesleft); if (res == 0) result |= 2; iconv_close (cd_ascii_to_88591); } } /* Test against AIX 6.1..7.1 bug: Buffer overrun. */ { iconv_t cd_88591_to_utf8 = iconv_open ("UTF-8", "ISO-8859-1"); if (cd_88591_to_utf8 != (iconv_t)(-1)) { static ICONV_CONST char input[] = "\304"; static char buf[2] = { (char)0xDE, (char)0xAD }; ICONV_CONST char *inptr = input; size_t inbytesleft = 1; char *outptr = buf; size_t outbytesleft = 1; size_t res = iconv (cd_88591_to_utf8, &inptr, &inbytesleft, &outptr, &outbytesleft); if (res != (size_t)(-1) || outptr - buf > 1 || buf[1] != (char)0xAD) result |= 4; iconv_close (cd_88591_to_utf8); } } #if 0 /* This bug could be worked around by the caller. */ /* Test against HP-UX 11.11 bug: Positive return value instead of 0. */ { iconv_t cd_88591_to_utf8 = iconv_open ("utf8", "iso88591"); if (cd_88591_to_utf8 != (iconv_t)(-1)) { static ICONV_CONST char input[] = "\304rger mit b\366sen B\374bchen ohne Augenma\337"; char buf[50]; ICONV_CONST char *inptr = input; size_t inbytesleft = strlen (input); char *outptr = buf; size_t outbytesleft = sizeof (buf); size_t res = iconv (cd_88591_to_utf8, &inptr, &inbytesleft, &outptr, &outbytesleft); if ((int)res > 0) result |= 8; iconv_close (cd_88591_to_utf8); } } #endif /* Test against HP-UX 11.11 bug: No converter from EUC-JP to UTF-8 is provided. */ if (/* Try standardized names. */ iconv_open ("UTF-8", "EUC-JP") == (iconv_t)(-1) /* Try IRIX, OSF/1 names. */ && iconv_open ("UTF-8", "eucJP") == (iconv_t)(-1) /* Try AIX names. */ && iconv_open ("UTF-8", "IBM-eucJP") == (iconv_t)(-1) /* Try HP-UX names. */ && iconv_open ("utf8", "eucJP") == (iconv_t)(-1)) result |= 16; return result; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : am_cv_func_iconv_works=yes fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi test "$am_cv_func_iconv_works" = no || break done LIBS="$am_save_LIBS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_func_iconv_works" >&5 $as_echo "$am_cv_func_iconv_works" >&6; } case "$am_cv_func_iconv_works" in *no) am_func_iconv=no am_cv_lib_iconv=no ;; *) am_func_iconv=yes ;; esac else am_func_iconv=no am_cv_lib_iconv=no fi if test "$am_func_iconv" = yes; then $as_echo "#define HAVE_ICONV 1" >>confdefs.h fi if test "$am_cv_lib_iconv" = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to link with libiconv" >&5 $as_echo_n "checking how to link with libiconv... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIBICONV" >&5 $as_echo "$LIBICONV" >&6; } else CPPFLAGS="$am_save_CPPFLAGS" LIBICONV= LTLIBICONV= fi if test "$am_cv_func_iconv" = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for iconv declaration" >&5 $as_echo_n "checking for iconv declaration... " >&6; } if ${am_cv_proto_iconv+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include extern #ifdef __cplusplus "C" #endif #if defined(__STDC__) || defined(_MSC_VER) || defined(__cplusplus) size_t iconv (iconv_t cd, char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft); #else size_t iconv(); #endif int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : am_cv_proto_iconv_arg1="" else am_cv_proto_iconv_arg1="const" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext am_cv_proto_iconv="extern size_t iconv (iconv_t cd, $am_cv_proto_iconv_arg1 char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft);" fi am_cv_proto_iconv=`echo "$am_cv_proto_iconv" | tr -s ' ' | sed -e 's/( /(/'` { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_proto_iconv" >&5 $as_echo " $am_cv_proto_iconv" >&6; } cat >>confdefs.h <<_ACEOF #define ICONV_CONST $am_cv_proto_iconv_arg1 _ACEOF fi if test "$am_cv_func_iconv" != "yes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: You must install iconv (see http://www.gnu.org/software/libiconv/) before building PSPP." >&5 $as_echo "$as_me: WARNING: You must install iconv (see http://www.gnu.org/software/libiconv/) before building PSPP." >&2;} pspp_required_prereqs="$pspp_required_prereqs iconv (see http://www.gnu.org/software/libiconv/)" fi LIBS="$LIBICONV $LIBS" RELOCATABLE_LIBRARY_PATH='$(pkglibdir)' RELOCATABLE_STRIP=: if test "$pspp_optional_prereqs" != ""; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: The following optional prerequisites are not installed. You may wish to install them to obtain additional functionality:$pspp_optional_prereqs" >&5 $as_echo "$as_me: WARNING: The following optional prerequisites are not installed. You may wish to install them to obtain additional functionality:$pspp_optional_prereqs" >&2;} fi if test "$pspp_required_prereqs" != ""; then as_fn_error $? "The following required prerequisites are not installed. You must install them before PSPP can be built:$pspp_required_prereqs" "$LINENO" 5 fi ac_config_files="$ac_config_files Makefile gl/Makefile po/Makefile tests/atlocal perl-module/lib/PSPP.pm" ac_config_commands="$ac_config_commands doc/dummy" # Check whether --enable-silent-rules was given. if test "${enable_silent_rules+set}" = set; then : enableval=$enable_silent_rules; fi case $enable_silent_rules in # ((( yes) AM_DEFAULT_VERBOSITY=0;; no) AM_DEFAULT_VERBOSITY=1;; *) AM_DEFAULT_VERBOSITY=1;; esac am_make=${MAKE-make} { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 $as_echo_n "checking whether $am_make supports nested variables... " >&6; } if ${am_cv_make_support_nested_variables+:} false; then : $as_echo_n "(cached) " >&6 else if $as_echo 'TRUE=$(BAR$(V)) BAR0=false BAR1=true V=1 am__doit: @$(TRUE) .PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then am_cv_make_support_nested_variables=yes else am_cv_make_support_nested_variables=no fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 $as_echo "$am_cv_make_support_nested_variables" >&6; } if test $am_cv_make_support_nested_variables = yes; then AM_V='$(V)' AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' else AM_V=$AM_DEFAULT_VERBOSITY AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY fi AM_BACKSLASH='\' cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # `set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then if test "x$cache_file" != "x/dev/null"; then { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 $as_echo "$as_me: updating cache $cache_file" >&6;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else case $cache_file in #( */* | ?:*) mv -f confcache "$cache_file"$$ && mv -f "$cache_file"$$ "$cache_file" ;; #( *) mv -f confcache "$cache_file" ;; esac fi fi else { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' DEFS=-DHAVE_CONFIG_H ac_libobjs= ac_ltlibobjs= U= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`$as_echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs { $as_echo "$as_me:${as_lineno-$LINENO}: checking that generated files are newer than configure" >&5 $as_echo_n "checking that generated files are newer than configure... " >&6; } if test -n "$am_sleep_pid"; then # Hide warnings about reused PIDs. wait $am_sleep_pid 2>/dev/null fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: done" >&5 $as_echo "done" >&6; } if test -n "$EXEEXT"; then am__EXEEXT_TRUE= am__EXEEXT_FALSE='#' else am__EXEEXT_TRUE='#' am__EXEEXT_FALSE= fi if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then as_fn_error $? "conditional \"AMDEP\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then as_fn_error $? "conditional \"am__fastdepCC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${BROKEN_DOCBOOK_XML_TRUE}" && test -z "${BROKEN_DOCBOOK_XML_FALSE}"; then as_fn_error $? "conditional \"BROKEN_DOCBOOK_XML\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HAVE_DOT_TRUE}" && test -z "${HAVE_DOT_FALSE}"; then as_fn_error $? "conditional \"HAVE_DOT\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test "X$enable_Werror" = Xyes; then CFLAGS="$CFLAGS -Werror -Wno-error=deprecated-declarations" fi if test -z "${cc_is_gcc_TRUE}" && test -z "${cc_is_gcc_FALSE}"; then as_fn_error $? "conditional \"cc_is_gcc\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HAVE_CAIRO_TRUE}" && test -z "${HAVE_CAIRO_FALSE}"; then as_fn_error $? "conditional \"HAVE_CAIRO\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HAVE_GUI_TRUE}" && test -z "${HAVE_GUI_FALSE}"; then as_fn_error $? "conditional \"HAVE_GUI\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${WITH_PERL_MODULE_TRUE}" && test -z "${WITH_PERL_MODULE_FALSE}"; then as_fn_error $? "conditional \"WITH_PERL_MODULE\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${GL_COND_LIBTOOL_TRUE}" && test -z "${GL_COND_LIBTOOL_FALSE}"; then as_fn_error $? "conditional \"GL_COND_LIBTOOL\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${GL_GENERATE_ALLOCA_H_TRUE}" && test -z "${GL_GENERATE_ALLOCA_H_FALSE}"; then as_fn_error $? "conditional \"GL_GENERATE_ALLOCA_H\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${GL_GENERATE_BYTESWAP_H_TRUE}" && test -z "${GL_GENERATE_BYTESWAP_H_FALSE}"; then as_fn_error $? "conditional \"GL_GENERATE_BYTESWAP_H\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${GL_GENERATE_ERRNO_H_TRUE}" && test -z "${GL_GENERATE_ERRNO_H_FALSE}"; then as_fn_error $? "conditional \"GL_GENERATE_ERRNO_H\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${GL_GENERATE_FLOAT_H_TRUE}" && test -z "${GL_GENERATE_FLOAT_H_FALSE}"; then as_fn_error $? "conditional \"GL_GENERATE_FLOAT_H\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${GL_GENERATE_LIMITS_H_TRUE}" && test -z "${GL_GENERATE_LIMITS_H_FALSE}"; then as_fn_error $? "conditional \"GL_GENERATE_LIMITS_H\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${GL_GENERATE_LIMITS_H_TRUE}" && test -z "${GL_GENERATE_LIMITS_H_FALSE}"; then as_fn_error $? "conditional \"GL_GENERATE_LIMITS_H\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${GL_GENERATE_STDINT_H_TRUE}" && test -z "${GL_GENERATE_STDINT_H_FALSE}"; then as_fn_error $? "conditional \"GL_GENERATE_STDINT_H\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${GL_GENERATE_STDDEF_H_TRUE}" && test -z "${GL_GENERATE_STDDEF_H_FALSE}"; then as_fn_error $? "conditional \"GL_GENERATE_STDDEF_H\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${RELOCATABLE_VIA_LD_TRUE}" && test -z "${RELOCATABLE_VIA_LD_FALSE}"; then as_fn_error $? "conditional \"RELOCATABLE_VIA_LD\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${RELOCATABLE_VIA_WRAPPER_TRUE}" && test -z "${RELOCATABLE_VIA_WRAPPER_FALSE}"; then as_fn_error $? "conditional \"RELOCATABLE_VIA_WRAPPER\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${GL_GENERATE_STDALIGN_H_TRUE}" && test -z "${GL_GENERATE_STDALIGN_H_FALSE}"; then as_fn_error $? "conditional \"GL_GENERATE_STDALIGN_H\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${GL_GENERATE_STDARG_H_TRUE}" && test -z "${GL_GENERATE_STDARG_H_FALSE}"; then as_fn_error $? "conditional \"GL_GENERATE_STDARG_H\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${GL_GENERATE_STDBOOL_H_TRUE}" && test -z "${GL_GENERATE_STDBOOL_H_FALSE}"; then as_fn_error $? "conditional \"GL_GENERATE_STDBOOL_H\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${GL_GENERATE_STDDEF_H_TRUE}" && test -z "${GL_GENERATE_STDDEF_H_FALSE}"; then as_fn_error $? "conditional \"GL_GENERATE_STDDEF_H\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${LIBUNISTRING_COMPILE_UNICASE_EMPTY_PREFIX_CONTEXT_TRUE}" && test -z "${LIBUNISTRING_COMPILE_UNICASE_EMPTY_PREFIX_CONTEXT_FALSE}"; then as_fn_error $? "conditional \"LIBUNISTRING_COMPILE_UNICASE_EMPTY_PREFIX_CONTEXT\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${LIBUNISTRING_COMPILE_UNICASE_EMPTY_SUFFIX_CONTEXT_TRUE}" && test -z "${LIBUNISTRING_COMPILE_UNICASE_EMPTY_SUFFIX_CONTEXT_FALSE}"; then as_fn_error $? "conditional \"LIBUNISTRING_COMPILE_UNICASE_EMPTY_SUFFIX_CONTEXT\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${LIBUNISTRING_COMPILE_UNICASE_TOLOWER_TRUE}" && test -z "${LIBUNISTRING_COMPILE_UNICASE_TOLOWER_FALSE}"; then as_fn_error $? "conditional \"LIBUNISTRING_COMPILE_UNICASE_TOLOWER\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${LIBUNISTRING_COMPILE_UNICASE_TOTITLE_TRUE}" && test -z "${LIBUNISTRING_COMPILE_UNICASE_TOTITLE_FALSE}"; then as_fn_error $? "conditional \"LIBUNISTRING_COMPILE_UNICASE_TOTITLE\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${LIBUNISTRING_COMPILE_UNICASE_TOUPPER_TRUE}" && test -z "${LIBUNISTRING_COMPILE_UNICASE_TOUPPER_FALSE}"; then as_fn_error $? "conditional \"LIBUNISTRING_COMPILE_UNICASE_TOUPPER\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${LIBUNISTRING_COMPILE_UNICASE_U8_CASECMP_TRUE}" && test -z "${LIBUNISTRING_COMPILE_UNICASE_U8_CASECMP_FALSE}"; then as_fn_error $? "conditional \"LIBUNISTRING_COMPILE_UNICASE_U8_CASECMP\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${LIBUNISTRING_COMPILE_UNICASE_U8_CASEFOLD_TRUE}" && test -z "${LIBUNISTRING_COMPILE_UNICASE_U8_CASEFOLD_FALSE}"; then as_fn_error $? "conditional \"LIBUNISTRING_COMPILE_UNICASE_U8_CASEFOLD\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${LIBUNISTRING_COMPILE_UNICASE_U8_CT_CASEFOLD_TRUE}" && test -z "${LIBUNISTRING_COMPILE_UNICASE_U8_CT_CASEFOLD_FALSE}"; then as_fn_error $? "conditional \"LIBUNISTRING_COMPILE_UNICASE_U8_CT_CASEFOLD\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${LIBUNISTRING_COMPILE_UNICASE_U8_CT_TOTITLE_TRUE}" && test -z "${LIBUNISTRING_COMPILE_UNICASE_U8_CT_TOTITLE_FALSE}"; then as_fn_error $? "conditional \"LIBUNISTRING_COMPILE_UNICASE_U8_CT_TOTITLE\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${LIBUNISTRING_COMPILE_UNICASE_U8_TOLOWER_TRUE}" && test -z "${LIBUNISTRING_COMPILE_UNICASE_U8_TOLOWER_FALSE}"; then as_fn_error $? "conditional \"LIBUNISTRING_COMPILE_UNICASE_U8_TOLOWER\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${LIBUNISTRING_COMPILE_UNICASE_U8_TOTITLE_TRUE}" && test -z "${LIBUNISTRING_COMPILE_UNICASE_U8_TOTITLE_FALSE}"; then as_fn_error $? "conditional \"LIBUNISTRING_COMPILE_UNICASE_U8_TOTITLE\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${LIBUNISTRING_COMPILE_UNICASE_U8_TOUPPER_TRUE}" && test -z "${LIBUNISTRING_COMPILE_UNICASE_U8_TOUPPER_FALSE}"; then as_fn_error $? "conditional \"LIBUNISTRING_COMPILE_UNICASE_U8_TOUPPER\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${LIBUNISTRING_COMPILE_UNICTYPE_CATEGORY_NONE_TRUE}" && test -z "${LIBUNISTRING_COMPILE_UNICTYPE_CATEGORY_NONE_FALSE}"; then as_fn_error $? "conditional \"LIBUNISTRING_COMPILE_UNICTYPE_CATEGORY_NONE\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${LIBUNISTRING_COMPILE_UNICTYPE_CATEGORY_OF_TRUE}" && test -z "${LIBUNISTRING_COMPILE_UNICTYPE_CATEGORY_OF_FALSE}"; then as_fn_error $? "conditional \"LIBUNISTRING_COMPILE_UNICTYPE_CATEGORY_OF\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${LIBUNISTRING_COMPILE_UNICTYPE_COMBINING_CLASS_TRUE}" && test -z "${LIBUNISTRING_COMPILE_UNICTYPE_COMBINING_CLASS_FALSE}"; then as_fn_error $? "conditional \"LIBUNISTRING_COMPILE_UNICTYPE_COMBINING_CLASS\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${LIBUNISTRING_COMPILE_UNICTYPE_CTYPE_PRINT_TRUE}" && test -z "${LIBUNISTRING_COMPILE_UNICTYPE_CTYPE_PRINT_FALSE}"; then as_fn_error $? "conditional \"LIBUNISTRING_COMPILE_UNICTYPE_CTYPE_PRINT\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${LIBUNISTRING_COMPILE_UNICTYPE_PROPERTY_SOFT_DOTTED_TRUE}" && test -z "${LIBUNISTRING_COMPILE_UNICTYPE_PROPERTY_SOFT_DOTTED_FALSE}"; then as_fn_error $? "conditional \"LIBUNISTRING_COMPILE_UNICTYPE_PROPERTY_SOFT_DOTTED\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${LIBUNISTRING_COMPILE_UNIGBRK_UC_GBRK_PROP_TRUE}" && test -z "${LIBUNISTRING_COMPILE_UNIGBRK_UC_GBRK_PROP_FALSE}"; then as_fn_error $? "conditional \"LIBUNISTRING_COMPILE_UNIGBRK_UC_GBRK_PROP\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${LIBUNISTRING_COMPILE_UNIGBRK_UC_IS_GRAPHEME_BREAK_TRUE}" && test -z "${LIBUNISTRING_COMPILE_UNIGBRK_UC_IS_GRAPHEME_BREAK_FALSE}"; then as_fn_error $? "conditional \"LIBUNISTRING_COMPILE_UNIGBRK_UC_IS_GRAPHEME_BREAK\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${LIBUNISTRING_COMPILE_UNILBRK_U8_POSSIBLE_LINEBREAKS_TRUE}" && test -z "${LIBUNISTRING_COMPILE_UNILBRK_U8_POSSIBLE_LINEBREAKS_FALSE}"; then as_fn_error $? "conditional \"LIBUNISTRING_COMPILE_UNILBRK_U8_POSSIBLE_LINEBREAKS\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${LIBUNISTRING_COMPILE_UNINORM_CANONICAL_DECOMPOSITION_TRUE}" && test -z "${LIBUNISTRING_COMPILE_UNINORM_CANONICAL_DECOMPOSITION_FALSE}"; then as_fn_error $? "conditional \"LIBUNISTRING_COMPILE_UNINORM_CANONICAL_DECOMPOSITION\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${LIBUNISTRING_COMPILE_UNINORM_DECOMPOSING_FORM_TRUE}" && test -z "${LIBUNISTRING_COMPILE_UNINORM_DECOMPOSING_FORM_FALSE}"; then as_fn_error $? "conditional \"LIBUNISTRING_COMPILE_UNINORM_DECOMPOSING_FORM\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${LIBUNISTRING_COMPILE_UNINORM_DECOMPOSITION_TRUE}" && test -z "${LIBUNISTRING_COMPILE_UNINORM_DECOMPOSITION_FALSE}"; then as_fn_error $? "conditional \"LIBUNISTRING_COMPILE_UNINORM_DECOMPOSITION\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${LIBUNISTRING_COMPILE_UNINORM_NFD_TRUE}" && test -z "${LIBUNISTRING_COMPILE_UNINORM_NFD_FALSE}"; then as_fn_error $? "conditional \"LIBUNISTRING_COMPILE_UNINORM_NFD\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${LIBUNISTRING_COMPILE_UNINORM_NFKD_TRUE}" && test -z "${LIBUNISTRING_COMPILE_UNINORM_NFKD_FALSE}"; then as_fn_error $? "conditional \"LIBUNISTRING_COMPILE_UNINORM_NFKD\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${LIBUNISTRING_COMPILE_UNINORM_U8_NORMALIZE_TRUE}" && test -z "${LIBUNISTRING_COMPILE_UNINORM_U8_NORMALIZE_FALSE}"; then as_fn_error $? "conditional \"LIBUNISTRING_COMPILE_UNINORM_U8_NORMALIZE\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${LIBUNISTRING_COMPILE_UNISTR_U8_CHECK_TRUE}" && test -z "${LIBUNISTRING_COMPILE_UNISTR_U8_CHECK_FALSE}"; then as_fn_error $? "conditional \"LIBUNISTRING_COMPILE_UNISTR_U8_CHECK\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${LIBUNISTRING_COMPILE_UNISTR_U8_CMP_TRUE}" && test -z "${LIBUNISTRING_COMPILE_UNISTR_U8_CMP_FALSE}"; then as_fn_error $? "conditional \"LIBUNISTRING_COMPILE_UNISTR_U8_CMP\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${LIBUNISTRING_COMPILE_UNISTR_U8_CMP2_TRUE}" && test -z "${LIBUNISTRING_COMPILE_UNISTR_U8_CMP2_FALSE}"; then as_fn_error $? "conditional \"LIBUNISTRING_COMPILE_UNISTR_U8_CMP2\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${LIBUNISTRING_COMPILE_UNISTR_U8_CPY_TRUE}" && test -z "${LIBUNISTRING_COMPILE_UNISTR_U8_CPY_FALSE}"; then as_fn_error $? "conditional \"LIBUNISTRING_COMPILE_UNISTR_U8_CPY\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${LIBUNISTRING_COMPILE_UNISTR_U8_MBLEN_TRUE}" && test -z "${LIBUNISTRING_COMPILE_UNISTR_U8_MBLEN_FALSE}"; then as_fn_error $? "conditional \"LIBUNISTRING_COMPILE_UNISTR_U8_MBLEN\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${LIBUNISTRING_COMPILE_UNISTR_U8_MBTOUC_TRUE}" && test -z "${LIBUNISTRING_COMPILE_UNISTR_U8_MBTOUC_FALSE}"; then as_fn_error $? "conditional \"LIBUNISTRING_COMPILE_UNISTR_U8_MBTOUC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${LIBUNISTRING_COMPILE_UNISTR_U8_MBTOUC_UNSAFE_TRUE}" && test -z "${LIBUNISTRING_COMPILE_UNISTR_U8_MBTOUC_UNSAFE_FALSE}"; then as_fn_error $? "conditional \"LIBUNISTRING_COMPILE_UNISTR_U8_MBTOUC_UNSAFE\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${LIBUNISTRING_COMPILE_UNISTR_U8_MBTOUCR_TRUE}" && test -z "${LIBUNISTRING_COMPILE_UNISTR_U8_MBTOUCR_FALSE}"; then as_fn_error $? "conditional \"LIBUNISTRING_COMPILE_UNISTR_U8_MBTOUCR\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${LIBUNISTRING_COMPILE_UNISTR_U8_STRLEN_TRUE}" && test -z "${LIBUNISTRING_COMPILE_UNISTR_U8_STRLEN_FALSE}"; then as_fn_error $? "conditional \"LIBUNISTRING_COMPILE_UNISTR_U8_STRLEN\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${LIBUNISTRING_COMPILE_UNISTR_U8_STRMBTOUC_TRUE}" && test -z "${LIBUNISTRING_COMPILE_UNISTR_U8_STRMBTOUC_FALSE}"; then as_fn_error $? "conditional \"LIBUNISTRING_COMPILE_UNISTR_U8_STRMBTOUC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${LIBUNISTRING_COMPILE_UNISTR_U8_STRNCAT_TRUE}" && test -z "${LIBUNISTRING_COMPILE_UNISTR_U8_STRNCAT_FALSE}"; then as_fn_error $? "conditional \"LIBUNISTRING_COMPILE_UNISTR_U8_STRNCAT\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${LIBUNISTRING_COMPILE_UNISTR_U8_UCTOMB_TRUE}" && test -z "${LIBUNISTRING_COMPILE_UNISTR_U8_UCTOMB_FALSE}"; then as_fn_error $? "conditional \"LIBUNISTRING_COMPILE_UNISTR_U8_UCTOMB\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${LIBUNISTRING_COMPILE_UNIWBRK_U8_WORDBREAKS_TRUE}" && test -z "${LIBUNISTRING_COMPILE_UNIWBRK_U8_WORDBREAKS_FALSE}"; then as_fn_error $? "conditional \"LIBUNISTRING_COMPILE_UNIWBRK_U8_WORDBREAKS\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${LIBUNISTRING_COMPILE_UNIWBRK_WORDBREAK_PROPERTY_TRUE}" && test -z "${LIBUNISTRING_COMPILE_UNIWBRK_WORDBREAK_PROPERTY_FALSE}"; then as_fn_error $? "conditional \"LIBUNISTRING_COMPILE_UNIWBRK_WORDBREAK_PROPERTY\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${LIBUNISTRING_COMPILE_UNIWIDTH_U8_STRWIDTH_TRUE}" && test -z "${LIBUNISTRING_COMPILE_UNIWIDTH_U8_STRWIDTH_FALSE}"; then as_fn_error $? "conditional \"LIBUNISTRING_COMPILE_UNIWIDTH_U8_STRWIDTH\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${LIBUNISTRING_COMPILE_UNIWIDTH_U8_WIDTH_TRUE}" && test -z "${LIBUNISTRING_COMPILE_UNIWIDTH_U8_WIDTH_FALSE}"; then as_fn_error $? "conditional \"LIBUNISTRING_COMPILE_UNIWIDTH_U8_WIDTH\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${LIBUNISTRING_COMPILE_UNIWIDTH_WIDTH_TRUE}" && test -z "${LIBUNISTRING_COMPILE_UNIWIDTH_WIDTH_FALSE}"; then as_fn_error $? "conditional \"LIBUNISTRING_COMPILE_UNIWIDTH_WIDTH\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi gl_libobjs= gl_ltlibobjs= if test -n "$gl_LIBOBJS"; then # Remove the extension. sed_drop_objext='s/\.o$//;s/\.obj$//' for i in `for i in $gl_LIBOBJS; do echo "$i"; done | sed -e "$sed_drop_objext" | sort | uniq`; do gl_libobjs="$gl_libobjs $i.$ac_objext" gl_ltlibobjs="$gl_ltlibobjs $i.lo" done fi gl_LIBOBJS=$gl_libobjs gl_LTLIBOBJS=$gl_ltlibobjs gltests_libobjs= gltests_ltlibobjs= if test -n "$gltests_LIBOBJS"; then # Remove the extension. sed_drop_objext='s/\.o$//;s/\.obj$//' for i in `for i in $gltests_LIBOBJS; do echo "$i"; done | sed -e "$sed_drop_objext" | sort | uniq`; do gltests_libobjs="$gltests_libobjs $i.$ac_objext" gltests_ltlibobjs="$gltests_ltlibobjs $i.lo" done fi gltests_LIBOBJS=$gltests_libobjs gltests_LTLIBOBJS=$gltests_ltlibobjs : "${CONFIG_STATUS=./config.status}" ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 $as_echo "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by GNU PSPP $as_me 1.4.1, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac case $ac_config_headers in *" "*) set x $ac_config_headers; shift; ac_config_headers=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" config_headers="$ac_config_headers" config_commands="$ac_config_commands" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ \`$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE --header=FILE[:TEMPLATE] instantiate the configuration header FILE Configuration files: $config_files Configuration headers: $config_headers Configuration commands: $config_commands Report bugs to . GNU PSPP home page: . General help using GNU software: ." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ GNU PSPP config.status 1.4.1 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" Copyright (C) 2012 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' INSTALL='$INSTALL' MKDIR_P='$MKDIR_P' AWK='$AWK' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; --*=) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) $as_echo "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) $as_echo "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --header | --heade | --head | --hea ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; esac as_fn_append CONFIG_HEADERS " '$ac_optarg'" ac_need_defaults=false;; --he | --h) # Conflict between --help and --header as_fn_error $? "ambiguous option: \`$1' Try \`$0 --help' for more information.";; --help | --hel | -h ) $as_echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error $? "unrecognized option: \`$1' Try \`$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX $as_echo "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # # INIT-COMMANDS # AMDEP_TRUE="$AMDEP_TRUE" MAKE="${MAKE-make}" # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH sed_quote_subst='$sed_quote_subst' double_quote_subst='$double_quote_subst' delay_variable_subst='$delay_variable_subst' AS='`$ECHO "$AS" | $SED "$delay_single_quote_subst"`' DLLTOOL='`$ECHO "$DLLTOOL" | $SED "$delay_single_quote_subst"`' OBJDUMP='`$ECHO "$OBJDUMP" | $SED "$delay_single_quote_subst"`' macro_version='`$ECHO "$macro_version" | $SED "$delay_single_quote_subst"`' macro_revision='`$ECHO "$macro_revision" | $SED "$delay_single_quote_subst"`' enable_shared='`$ECHO "$enable_shared" | $SED "$delay_single_quote_subst"`' enable_static='`$ECHO "$enable_static" | $SED "$delay_single_quote_subst"`' pic_mode='`$ECHO "$pic_mode" | $SED "$delay_single_quote_subst"`' enable_fast_install='`$ECHO "$enable_fast_install" | $SED "$delay_single_quote_subst"`' shared_archive_member_spec='`$ECHO "$shared_archive_member_spec" | $SED "$delay_single_quote_subst"`' SHELL='`$ECHO "$SHELL" | $SED "$delay_single_quote_subst"`' ECHO='`$ECHO "$ECHO" | $SED "$delay_single_quote_subst"`' PATH_SEPARATOR='`$ECHO "$PATH_SEPARATOR" | $SED "$delay_single_quote_subst"`' host_alias='`$ECHO "$host_alias" | $SED "$delay_single_quote_subst"`' host='`$ECHO "$host" | $SED "$delay_single_quote_subst"`' host_os='`$ECHO "$host_os" | $SED "$delay_single_quote_subst"`' build_alias='`$ECHO "$build_alias" | $SED "$delay_single_quote_subst"`' build='`$ECHO "$build" | $SED "$delay_single_quote_subst"`' build_os='`$ECHO "$build_os" | $SED "$delay_single_quote_subst"`' SED='`$ECHO "$SED" | $SED "$delay_single_quote_subst"`' Xsed='`$ECHO "$Xsed" | $SED "$delay_single_quote_subst"`' GREP='`$ECHO "$GREP" | $SED "$delay_single_quote_subst"`' EGREP='`$ECHO "$EGREP" | $SED "$delay_single_quote_subst"`' FGREP='`$ECHO "$FGREP" | $SED "$delay_single_quote_subst"`' LD='`$ECHO "$LD" | $SED "$delay_single_quote_subst"`' NM='`$ECHO "$NM" | $SED "$delay_single_quote_subst"`' LN_S='`$ECHO "$LN_S" | $SED "$delay_single_quote_subst"`' max_cmd_len='`$ECHO "$max_cmd_len" | $SED "$delay_single_quote_subst"`' ac_objext='`$ECHO "$ac_objext" | $SED "$delay_single_quote_subst"`' exeext='`$ECHO "$exeext" | $SED "$delay_single_quote_subst"`' lt_unset='`$ECHO "$lt_unset" | $SED "$delay_single_quote_subst"`' lt_SP2NL='`$ECHO "$lt_SP2NL" | $SED "$delay_single_quote_subst"`' lt_NL2SP='`$ECHO "$lt_NL2SP" | $SED "$delay_single_quote_subst"`' lt_cv_to_host_file_cmd='`$ECHO "$lt_cv_to_host_file_cmd" | $SED "$delay_single_quote_subst"`' lt_cv_to_tool_file_cmd='`$ECHO "$lt_cv_to_tool_file_cmd" | $SED "$delay_single_quote_subst"`' reload_flag='`$ECHO "$reload_flag" | $SED "$delay_single_quote_subst"`' reload_cmds='`$ECHO "$reload_cmds" | $SED "$delay_single_quote_subst"`' deplibs_check_method='`$ECHO "$deplibs_check_method" | $SED "$delay_single_quote_subst"`' file_magic_cmd='`$ECHO "$file_magic_cmd" | $SED "$delay_single_quote_subst"`' file_magic_glob='`$ECHO "$file_magic_glob" | $SED "$delay_single_quote_subst"`' want_nocaseglob='`$ECHO "$want_nocaseglob" | $SED "$delay_single_quote_subst"`' sharedlib_from_linklib_cmd='`$ECHO "$sharedlib_from_linklib_cmd" | $SED "$delay_single_quote_subst"`' AR='`$ECHO "$AR" | $SED "$delay_single_quote_subst"`' AR_FLAGS='`$ECHO "$AR_FLAGS" | $SED "$delay_single_quote_subst"`' archiver_list_spec='`$ECHO "$archiver_list_spec" | $SED "$delay_single_quote_subst"`' STRIP='`$ECHO "$STRIP" | $SED "$delay_single_quote_subst"`' RANLIB='`$ECHO "$RANLIB" | $SED "$delay_single_quote_subst"`' old_postinstall_cmds='`$ECHO "$old_postinstall_cmds" | $SED "$delay_single_quote_subst"`' old_postuninstall_cmds='`$ECHO "$old_postuninstall_cmds" | $SED "$delay_single_quote_subst"`' old_archive_cmds='`$ECHO "$old_archive_cmds" | $SED "$delay_single_quote_subst"`' lock_old_archive_extraction='`$ECHO "$lock_old_archive_extraction" | $SED "$delay_single_quote_subst"`' CC='`$ECHO "$CC" | $SED "$delay_single_quote_subst"`' CFLAGS='`$ECHO "$CFLAGS" | $SED "$delay_single_quote_subst"`' compiler='`$ECHO "$compiler" | $SED "$delay_single_quote_subst"`' GCC='`$ECHO "$GCC" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_pipe='`$ECHO "$lt_cv_sys_global_symbol_pipe" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_to_cdecl='`$ECHO "$lt_cv_sys_global_symbol_to_cdecl" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_to_import='`$ECHO "$lt_cv_sys_global_symbol_to_import" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_to_c_name_address='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix" | $SED "$delay_single_quote_subst"`' lt_cv_nm_interface='`$ECHO "$lt_cv_nm_interface" | $SED "$delay_single_quote_subst"`' nm_file_list_spec='`$ECHO "$nm_file_list_spec" | $SED "$delay_single_quote_subst"`' lt_sysroot='`$ECHO "$lt_sysroot" | $SED "$delay_single_quote_subst"`' lt_cv_truncate_bin='`$ECHO "$lt_cv_truncate_bin" | $SED "$delay_single_quote_subst"`' objdir='`$ECHO "$objdir" | $SED "$delay_single_quote_subst"`' MAGIC_CMD='`$ECHO "$MAGIC_CMD" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_no_builtin_flag='`$ECHO "$lt_prog_compiler_no_builtin_flag" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_pic='`$ECHO "$lt_prog_compiler_pic" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_wl='`$ECHO "$lt_prog_compiler_wl" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_static='`$ECHO "$lt_prog_compiler_static" | $SED "$delay_single_quote_subst"`' lt_cv_prog_compiler_c_o='`$ECHO "$lt_cv_prog_compiler_c_o" | $SED "$delay_single_quote_subst"`' need_locks='`$ECHO "$need_locks" | $SED "$delay_single_quote_subst"`' MANIFEST_TOOL='`$ECHO "$MANIFEST_TOOL" | $SED "$delay_single_quote_subst"`' DSYMUTIL='`$ECHO "$DSYMUTIL" | $SED "$delay_single_quote_subst"`' NMEDIT='`$ECHO "$NMEDIT" | $SED "$delay_single_quote_subst"`' LIPO='`$ECHO "$LIPO" | $SED "$delay_single_quote_subst"`' OTOOL='`$ECHO "$OTOOL" | $SED "$delay_single_quote_subst"`' OTOOL64='`$ECHO "$OTOOL64" | $SED "$delay_single_quote_subst"`' libext='`$ECHO "$libext" | $SED "$delay_single_quote_subst"`' shrext_cmds='`$ECHO "$shrext_cmds" | $SED "$delay_single_quote_subst"`' extract_expsyms_cmds='`$ECHO "$extract_expsyms_cmds" | $SED "$delay_single_quote_subst"`' archive_cmds_need_lc='`$ECHO "$archive_cmds_need_lc" | $SED "$delay_single_quote_subst"`' enable_shared_with_static_runtimes='`$ECHO "$enable_shared_with_static_runtimes" | $SED "$delay_single_quote_subst"`' export_dynamic_flag_spec='`$ECHO "$export_dynamic_flag_spec" | $SED "$delay_single_quote_subst"`' whole_archive_flag_spec='`$ECHO "$whole_archive_flag_spec" | $SED "$delay_single_quote_subst"`' compiler_needs_object='`$ECHO "$compiler_needs_object" | $SED "$delay_single_quote_subst"`' old_archive_from_new_cmds='`$ECHO "$old_archive_from_new_cmds" | $SED "$delay_single_quote_subst"`' old_archive_from_expsyms_cmds='`$ECHO "$old_archive_from_expsyms_cmds" | $SED "$delay_single_quote_subst"`' archive_cmds='`$ECHO "$archive_cmds" | $SED "$delay_single_quote_subst"`' archive_expsym_cmds='`$ECHO "$archive_expsym_cmds" | $SED "$delay_single_quote_subst"`' module_cmds='`$ECHO "$module_cmds" | $SED "$delay_single_quote_subst"`' module_expsym_cmds='`$ECHO "$module_expsym_cmds" | $SED "$delay_single_quote_subst"`' with_gnu_ld='`$ECHO "$with_gnu_ld" | $SED "$delay_single_quote_subst"`' allow_undefined_flag='`$ECHO "$allow_undefined_flag" | $SED "$delay_single_quote_subst"`' no_undefined_flag='`$ECHO "$no_undefined_flag" | $SED "$delay_single_quote_subst"`' hardcode_libdir_flag_spec='`$ECHO "$hardcode_libdir_flag_spec" | $SED "$delay_single_quote_subst"`' hardcode_libdir_separator='`$ECHO "$hardcode_libdir_separator" | $SED "$delay_single_quote_subst"`' hardcode_direct='`$ECHO "$hardcode_direct" | $SED "$delay_single_quote_subst"`' hardcode_direct_absolute='`$ECHO "$hardcode_direct_absolute" | $SED "$delay_single_quote_subst"`' hardcode_minus_L='`$ECHO "$hardcode_minus_L" | $SED "$delay_single_quote_subst"`' hardcode_shlibpath_var='`$ECHO "$hardcode_shlibpath_var" | $SED "$delay_single_quote_subst"`' hardcode_automatic='`$ECHO "$hardcode_automatic" | $SED "$delay_single_quote_subst"`' inherit_rpath='`$ECHO "$inherit_rpath" | $SED "$delay_single_quote_subst"`' link_all_deplibs='`$ECHO "$link_all_deplibs" | $SED "$delay_single_quote_subst"`' always_export_symbols='`$ECHO "$always_export_symbols" | $SED "$delay_single_quote_subst"`' export_symbols_cmds='`$ECHO "$export_symbols_cmds" | $SED "$delay_single_quote_subst"`' exclude_expsyms='`$ECHO "$exclude_expsyms" | $SED "$delay_single_quote_subst"`' include_expsyms='`$ECHO "$include_expsyms" | $SED "$delay_single_quote_subst"`' prelink_cmds='`$ECHO "$prelink_cmds" | $SED "$delay_single_quote_subst"`' postlink_cmds='`$ECHO "$postlink_cmds" | $SED "$delay_single_quote_subst"`' file_list_spec='`$ECHO "$file_list_spec" | $SED "$delay_single_quote_subst"`' variables_saved_for_relink='`$ECHO "$variables_saved_for_relink" | $SED "$delay_single_quote_subst"`' need_lib_prefix='`$ECHO "$need_lib_prefix" | $SED "$delay_single_quote_subst"`' need_version='`$ECHO "$need_version" | $SED "$delay_single_quote_subst"`' version_type='`$ECHO "$version_type" | $SED "$delay_single_quote_subst"`' runpath_var='`$ECHO "$runpath_var" | $SED "$delay_single_quote_subst"`' shlibpath_var='`$ECHO "$shlibpath_var" | $SED "$delay_single_quote_subst"`' shlibpath_overrides_runpath='`$ECHO "$shlibpath_overrides_runpath" | $SED "$delay_single_quote_subst"`' libname_spec='`$ECHO "$libname_spec" | $SED "$delay_single_quote_subst"`' library_names_spec='`$ECHO "$library_names_spec" | $SED "$delay_single_quote_subst"`' soname_spec='`$ECHO "$soname_spec" | $SED "$delay_single_quote_subst"`' install_override_mode='`$ECHO "$install_override_mode" | $SED "$delay_single_quote_subst"`' postinstall_cmds='`$ECHO "$postinstall_cmds" | $SED "$delay_single_quote_subst"`' postuninstall_cmds='`$ECHO "$postuninstall_cmds" | $SED "$delay_single_quote_subst"`' finish_cmds='`$ECHO "$finish_cmds" | $SED "$delay_single_quote_subst"`' finish_eval='`$ECHO "$finish_eval" | $SED "$delay_single_quote_subst"`' hardcode_into_libs='`$ECHO "$hardcode_into_libs" | $SED "$delay_single_quote_subst"`' sys_lib_search_path_spec='`$ECHO "$sys_lib_search_path_spec" | $SED "$delay_single_quote_subst"`' configure_time_dlsearch_path='`$ECHO "$configure_time_dlsearch_path" | $SED "$delay_single_quote_subst"`' configure_time_lt_sys_library_path='`$ECHO "$configure_time_lt_sys_library_path" | $SED "$delay_single_quote_subst"`' hardcode_action='`$ECHO "$hardcode_action" | $SED "$delay_single_quote_subst"`' enable_dlopen='`$ECHO "$enable_dlopen" | $SED "$delay_single_quote_subst"`' enable_dlopen_self='`$ECHO "$enable_dlopen_self" | $SED "$delay_single_quote_subst"`' enable_dlopen_self_static='`$ECHO "$enable_dlopen_self_static" | $SED "$delay_single_quote_subst"`' old_striplib='`$ECHO "$old_striplib" | $SED "$delay_single_quote_subst"`' striplib='`$ECHO "$striplib" | $SED "$delay_single_quote_subst"`' LTCC='$LTCC' LTCFLAGS='$LTCFLAGS' compiler='$compiler_DEFAULT' # A function that is used when there is no print builtin or printf. func_fallback_echo () { eval 'cat <<_LTECHO_EOF \$1 _LTECHO_EOF' } # Quote evaled strings. for var in AS \ DLLTOOL \ OBJDUMP \ SHELL \ ECHO \ PATH_SEPARATOR \ SED \ GREP \ EGREP \ FGREP \ LD \ NM \ LN_S \ lt_SP2NL \ lt_NL2SP \ reload_flag \ deplibs_check_method \ file_magic_cmd \ file_magic_glob \ want_nocaseglob \ sharedlib_from_linklib_cmd \ AR \ AR_FLAGS \ archiver_list_spec \ STRIP \ RANLIB \ CC \ CFLAGS \ compiler \ lt_cv_sys_global_symbol_pipe \ lt_cv_sys_global_symbol_to_cdecl \ lt_cv_sys_global_symbol_to_import \ lt_cv_sys_global_symbol_to_c_name_address \ lt_cv_sys_global_symbol_to_c_name_address_lib_prefix \ lt_cv_nm_interface \ nm_file_list_spec \ lt_cv_truncate_bin \ lt_prog_compiler_no_builtin_flag \ lt_prog_compiler_pic \ lt_prog_compiler_wl \ lt_prog_compiler_static \ lt_cv_prog_compiler_c_o \ need_locks \ MANIFEST_TOOL \ DSYMUTIL \ NMEDIT \ LIPO \ OTOOL \ OTOOL64 \ shrext_cmds \ export_dynamic_flag_spec \ whole_archive_flag_spec \ compiler_needs_object \ with_gnu_ld \ allow_undefined_flag \ no_undefined_flag \ hardcode_libdir_flag_spec \ hardcode_libdir_separator \ exclude_expsyms \ include_expsyms \ file_list_spec \ variables_saved_for_relink \ libname_spec \ library_names_spec \ soname_spec \ install_override_mode \ finish_eval \ old_striplib \ striplib; do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[\\\\\\\`\\"\\\$]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done # Double-quote double-evaled strings. for var in reload_cmds \ old_postinstall_cmds \ old_postuninstall_cmds \ old_archive_cmds \ extract_expsyms_cmds \ old_archive_from_new_cmds \ old_archive_from_expsyms_cmds \ archive_cmds \ archive_expsym_cmds \ module_cmds \ module_expsym_cmds \ export_symbols_cmds \ prelink_cmds \ postlink_cmds \ postinstall_cmds \ postuninstall_cmds \ finish_cmds \ sys_lib_search_path_spec \ configure_time_dlsearch_path \ configure_time_lt_sys_library_path; do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[\\\\\\\`\\"\\\$]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done ac_aux_dir='$ac_aux_dir' # See if we are running on zsh, and set the options that allow our # commands through without removal of \ escapes INIT. if test -n "\${ZSH_VERSION+set}"; then setopt NO_GLOB_SUBST fi PACKAGE='$PACKAGE' VERSION='$VERSION' RM='$RM' ofile='$ofile' _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;; "tests/atconfig") CONFIG_COMMANDS="$CONFIG_COMMANDS tests/atconfig" ;; "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; "libtool") CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;; "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; "gl/Makefile") CONFIG_FILES="$CONFIG_FILES gl/Makefile" ;; "po/Makefile") CONFIG_FILES="$CONFIG_FILES po/Makefile" ;; "tests/atlocal") CONFIG_FILES="$CONFIG_FILES tests/atlocal" ;; "perl-module/lib/PSPP.pm") CONFIG_FILES="$CONFIG_FILES perl-module/lib/PSPP.pm" ;; "doc/dummy") CONFIG_COMMANDS="$CONFIG_COMMANDS doc/dummy" ;; *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= ac_tmp= trap 'exit_status=$? : "${ac_tmp:=$tmp}" { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with `./config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$ac_tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove sole $(srcdir), # ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ h s/// s/^/:/ s/[ ]*$/:/ s/:\$(srcdir):/:/g s/:\${srcdir}:/:/g s/:@srcdir@:/:/g s/^:*// s/:*$// x s/\(=[ ]*\).*/\1/ G s/\n// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" # Set up the scripts for CONFIG_HEADERS section. # No need to generate them if there are no CONFIG_HEADERS. # This happens for instance with `./config.status Makefile'. if test -n "$CONFIG_HEADERS"; then cat >"$ac_tmp/defines.awk" <<\_ACAWK || BEGIN { _ACEOF # Transform confdefs.h into an awk script `defines.awk', embedded as # here-document in config.status, that substitutes the proper values into # config.h.in to produce config.h. # Create a delimiter string that does not exist in confdefs.h, to ease # handling of long lines. ac_delim='%!_!# ' for ac_last_try in false false :; do ac_tt=`sed -n "/$ac_delim/p" confdefs.h` if test -z "$ac_tt"; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done # For the awk script, D is an array of macro values keyed by name, # likewise P contains macro parameters if any. Preserve backslash # newline sequences. ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* sed -n ' s/.\{148\}/&'"$ac_delim"'/g t rset :rset s/^[ ]*#[ ]*define[ ][ ]*/ / t def d :def s/\\$// t bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3"/p s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p d :bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3\\\\\\n"\\/p t cont s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p t cont d :cont n s/.\{148\}/&'"$ac_delim"'/g t clear :clear s/\\$// t bsnlc s/["\\]/\\&/g; s/^/"/; s/$/"/p d :bsnlc s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p b cont ' >$CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 for (key in D) D_is_set[key] = 1 FS = "" } /^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { line = \$ 0 split(line, arg, " ") if (arg[1] == "#") { defundef = arg[2] mac1 = arg[3] } else { defundef = substr(arg[1], 2) mac1 = arg[2] } split(mac1, mac2, "(") #) macro = mac2[1] prefix = substr(line, 1, index(line, defundef) - 1) if (D_is_set[macro]) { # Preserve the white space surrounding the "#". print prefix "define", macro P[macro] D[macro] next } else { # Replace #undef with comments. This is necessary, for example, # in the case of _POSIX_SOURCE, which is predefined and required # on some systems where configure will not decide to define it. if (defundef == "undef") { print "/*", prefix defundef, macro, "*/" next } } } { print } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 fi # test -n "$CONFIG_HEADERS" eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :C $CONFIG_COMMANDS" shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 $as_echo "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`$as_echo "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$ac_tmp/stdin" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; esac ac_MKDIR_P=$MKDIR_P case $MKDIR_P in [\\/$]* | ?:[\\/]* ) ;; */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; esac _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 $as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t s&@INSTALL@&$ac_INSTALL&;t t s&@MKDIR_P@&$ac_MKDIR_P&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&5 $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$ac_tmp/stdin" case $ac_file in -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; :H) # # CONFIG_HEADER # if test x"$ac_file" != x-; then { $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" } >"$ac_tmp/config.h" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 $as_echo "$as_me: $ac_file is unchanged" >&6;} else rm -f "$ac_file" mv "$ac_tmp/config.h" "$ac_file" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 fi else $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ || as_fn_error $? "could not create -" "$LINENO" 5 fi # Compute "$ac_file"'s index in $config_headers. _am_arg="$ac_file" _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $_am_arg | $_am_arg:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" || $as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$_am_arg" : 'X\(//\)[^/]' \| \ X"$_am_arg" : 'X\(//\)$' \| \ X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$_am_arg" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'`/stamp-h$_am_stamp_count ;; :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 $as_echo "$as_me: executing $ac_file commands" >&6;} ;; esac case $ac_file$ac_mode in "tests/atconfig":C) cat >tests/atconfig </dev/null 2>&1 \ || continue am_dirpart=`$as_dirname -- "$am_mf" || $as_expr X"$am_mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$am_mf" : 'X\(//\)[^/]' \| \ X"$am_mf" : 'X\(//\)$' \| \ X"$am_mf" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$am_mf" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` am_filepart=`$as_basename -- "$am_mf" || $as_expr X/"$am_mf" : '.*/\([^/][^/]*\)/*$' \| \ X"$am_mf" : 'X\(//\)$' \| \ X"$am_mf" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$am_mf" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` { echo "$as_me:$LINENO: cd "$am_dirpart" \ && sed -e '/# am--include-marker/d' "$am_filepart" \ | $MAKE -f - am--depfiles" >&5 (cd "$am_dirpart" \ && sed -e '/# am--include-marker/d' "$am_filepart" \ | $MAKE -f - am--depfiles) >&5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } || am_rc=$? done if test $am_rc -ne 0; then { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "Something went wrong bootstrapping makefile fragments for automatic dependency tracking. If GNU make was not used, consider re-running the configure script with MAKE=\"gmake\" (or whatever is necessary). You can also try re-running configure with the '--disable-dependency-tracking' option to at least be able to build the package (albeit without support for automatic dependency tracking). See \`config.log' for more details" "$LINENO" 5; } fi { am_dirpart=; unset am_dirpart;} { am_filepart=; unset am_filepart;} { am_mf=; unset am_mf;} { am_rc=; unset am_rc;} rm -f conftest-deps.mk } ;; "libtool":C) # See if we are running on zsh, and set the options that allow our # commands through without removal of \ escapes. if test -n "${ZSH_VERSION+set}"; then setopt NO_GLOB_SUBST fi cfgfile=${ofile}T trap "$RM \"$cfgfile\"; exit 1" 1 2 15 $RM "$cfgfile" cat <<_LT_EOF >> "$cfgfile" #! $SHELL # Generated automatically by $as_me ($PACKAGE) $VERSION # NOTE: Changes made to this file will be lost: look at ltmain.sh. # Provide generalized library-building support services. # Written by Gordon Matzigkeit, 1996 # Copyright (C) 2014 Free Software Foundation, Inc. # This is free software; see the source for copying conditions. There is NO # warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # GNU Libtool 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 of the License, or # (at your option) any later version. # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program or library that is built # using GNU Libtool, you may include this file under the same # distribution terms that you use for the rest of that program. # # GNU Libtool 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, see . # The names of the tagged configurations supported by this script. available_tags='' # Configured defaults for sys_lib_dlsearch_path munging. : \${LT_SYS_LIBRARY_PATH="$configure_time_lt_sys_library_path"} # ### BEGIN LIBTOOL CONFIG # Assembler program. AS=$lt_AS # DLL creation program. DLLTOOL=$lt_DLLTOOL # Object dumper program. OBJDUMP=$lt_OBJDUMP # Which release of libtool.m4 was used? macro_version=$macro_version macro_revision=$macro_revision # Whether or not to build shared libraries. build_libtool_libs=$enable_shared # Whether or not to build static libraries. build_old_libs=$enable_static # What type of objects to build. pic_mode=$pic_mode # Whether or not to optimize for fast installation. fast_install=$enable_fast_install # Shared archive member basename,for filename based shared library versioning on AIX. shared_archive_member_spec=$shared_archive_member_spec # Shell to use when invoking shell scripts. SHELL=$lt_SHELL # An echo program that protects backslashes. ECHO=$lt_ECHO # The PATH separator for the build system. PATH_SEPARATOR=$lt_PATH_SEPARATOR # The host system. host_alias=$host_alias host=$host host_os=$host_os # The build system. build_alias=$build_alias build=$build build_os=$build_os # A sed program that does not truncate output. SED=$lt_SED # Sed that helps us avoid accidentally triggering echo(1) options like -n. Xsed="\$SED -e 1s/^X//" # A grep program that handles long lines. GREP=$lt_GREP # An ERE matcher. EGREP=$lt_EGREP # A literal string matcher. FGREP=$lt_FGREP # A BSD- or MS-compatible name lister. NM=$lt_NM # Whether we need soft or hard links. LN_S=$lt_LN_S # What is the maximum length of a command? max_cmd_len=$max_cmd_len # Object file suffix (normally "o"). objext=$ac_objext # Executable file suffix (normally ""). exeext=$exeext # whether the shell understands "unset". lt_unset=$lt_unset # turn spaces into newlines. SP2NL=$lt_lt_SP2NL # turn newlines into spaces. NL2SP=$lt_lt_NL2SP # convert \$build file names to \$host format. to_host_file_cmd=$lt_cv_to_host_file_cmd # convert \$build files to toolchain format. to_tool_file_cmd=$lt_cv_to_tool_file_cmd # Method to check whether dependent libraries are shared objects. deplibs_check_method=$lt_deplibs_check_method # Command to use when deplibs_check_method = "file_magic". file_magic_cmd=$lt_file_magic_cmd # How to find potential files when deplibs_check_method = "file_magic". file_magic_glob=$lt_file_magic_glob # Find potential files using nocaseglob when deplibs_check_method = "file_magic". want_nocaseglob=$lt_want_nocaseglob # Command to associate shared and link libraries. sharedlib_from_linklib_cmd=$lt_sharedlib_from_linklib_cmd # The archiver. AR=$lt_AR # Flags to create an archive. AR_FLAGS=$lt_AR_FLAGS # How to feed a file listing to the archiver. archiver_list_spec=$lt_archiver_list_spec # A symbol stripping program. STRIP=$lt_STRIP # Commands used to install an old-style archive. RANLIB=$lt_RANLIB old_postinstall_cmds=$lt_old_postinstall_cmds old_postuninstall_cmds=$lt_old_postuninstall_cmds # Whether to use a lock for old archive extraction. lock_old_archive_extraction=$lock_old_archive_extraction # A C compiler. LTCC=$lt_CC # LTCC compiler flags. LTCFLAGS=$lt_CFLAGS # Take the output of nm and produce a listing of raw symbols and C names. global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe # Transform the output of nm in a proper C declaration. global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl # Transform the output of nm into a list of symbols to manually relocate. global_symbol_to_import=$lt_lt_cv_sys_global_symbol_to_import # Transform the output of nm in a C name address pair. global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address # Transform the output of nm in a C name address pair when lib prefix is needed. global_symbol_to_c_name_address_lib_prefix=$lt_lt_cv_sys_global_symbol_to_c_name_address_lib_prefix # The name lister interface. nm_interface=$lt_lt_cv_nm_interface # Specify filename containing input files for \$NM. nm_file_list_spec=$lt_nm_file_list_spec # The root where to search for dependent libraries,and where our libraries should be installed. lt_sysroot=$lt_sysroot # Command to truncate a binary pipe. lt_truncate_bin=$lt_lt_cv_truncate_bin # The name of the directory that contains temporary libtool files. objdir=$objdir # Used to examine libraries when file_magic_cmd begins with "file". MAGIC_CMD=$MAGIC_CMD # Must we lock files when doing compilation? need_locks=$lt_need_locks # Manifest tool. MANIFEST_TOOL=$lt_MANIFEST_TOOL # Tool to manipulate archived DWARF debug symbol files on Mac OS X. DSYMUTIL=$lt_DSYMUTIL # Tool to change global to local symbols on Mac OS X. NMEDIT=$lt_NMEDIT # Tool to manipulate fat objects and archives on Mac OS X. LIPO=$lt_LIPO # ldd/readelf like tool for Mach-O binaries on Mac OS X. OTOOL=$lt_OTOOL # ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4. OTOOL64=$lt_OTOOL64 # Old archive suffix (normally "a"). libext=$libext # Shared library suffix (normally ".so"). shrext_cmds=$lt_shrext_cmds # The commands to extract the exported symbol list from a shared archive. extract_expsyms_cmds=$lt_extract_expsyms_cmds # Variables whose values should be saved in libtool wrapper scripts and # restored at link time. variables_saved_for_relink=$lt_variables_saved_for_relink # Do we need the "lib" prefix for modules? need_lib_prefix=$need_lib_prefix # Do we need a version for libraries? need_version=$need_version # Library versioning type. version_type=$version_type # Shared library runtime path variable. runpath_var=$runpath_var # Shared library path variable. shlibpath_var=$shlibpath_var # Is shlibpath searched before the hard-coded library search path? shlibpath_overrides_runpath=$shlibpath_overrides_runpath # Format of library name prefix. libname_spec=$lt_libname_spec # List of archive names. First name is the real one, the rest are links. # The last name is the one that the linker finds with -lNAME library_names_spec=$lt_library_names_spec # The coded name of the library, if different from the real name. soname_spec=$lt_soname_spec # Permission mode override for installation of shared libraries. install_override_mode=$lt_install_override_mode # Command to use after installation of a shared archive. postinstall_cmds=$lt_postinstall_cmds # Command to use after uninstallation of a shared archive. postuninstall_cmds=$lt_postuninstall_cmds # Commands used to finish a libtool library installation in a directory. finish_cmds=$lt_finish_cmds # As "finish_cmds", except a single script fragment to be evaled but # not shown. finish_eval=$lt_finish_eval # Whether we should hardcode library paths into libraries. hardcode_into_libs=$hardcode_into_libs # Compile-time system search path for libraries. sys_lib_search_path_spec=$lt_sys_lib_search_path_spec # Detected run-time system search path for libraries. sys_lib_dlsearch_path_spec=$lt_configure_time_dlsearch_path # Explicit LT_SYS_LIBRARY_PATH set during ./configure time. configure_time_lt_sys_library_path=$lt_configure_time_lt_sys_library_path # Whether dlopen is supported. dlopen_support=$enable_dlopen # Whether dlopen of programs is supported. dlopen_self=$enable_dlopen_self # Whether dlopen of statically linked programs is supported. dlopen_self_static=$enable_dlopen_self_static # Commands to strip libraries. old_striplib=$lt_old_striplib striplib=$lt_striplib # The linker used to build libraries. LD=$lt_LD # How to create reloadable object files. reload_flag=$lt_reload_flag reload_cmds=$lt_reload_cmds # Commands used to build an old-style archive. old_archive_cmds=$lt_old_archive_cmds # A language specific compiler. CC=$lt_compiler # Is the compiler the GNU compiler? with_gcc=$GCC # Compiler flag to turn off builtin functions. no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag # Additional compiler flags for building library objects. pic_flag=$lt_lt_prog_compiler_pic # How to pass a linker flag through the compiler. wl=$lt_lt_prog_compiler_wl # Compiler flag to prevent dynamic linking. link_static_flag=$lt_lt_prog_compiler_static # Does compiler simultaneously support -c and -o options? compiler_c_o=$lt_lt_cv_prog_compiler_c_o # Whether or not to add -lc for building shared libraries. build_libtool_need_lc=$archive_cmds_need_lc # Whether or not to disallow shared libs when runtime libs are static. allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes # Compiler flag to allow reflexive dlopens. export_dynamic_flag_spec=$lt_export_dynamic_flag_spec # Compiler flag to generate shared objects directly from archives. whole_archive_flag_spec=$lt_whole_archive_flag_spec # Whether the compiler copes with passing no objects directly. compiler_needs_object=$lt_compiler_needs_object # Create an old-style archive from a shared archive. old_archive_from_new_cmds=$lt_old_archive_from_new_cmds # Create a temporary old-style archive to link instead of a shared archive. old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds # Commands used to build a shared archive. archive_cmds=$lt_archive_cmds archive_expsym_cmds=$lt_archive_expsym_cmds # Commands used to build a loadable module if different from building # a shared archive. module_cmds=$lt_module_cmds module_expsym_cmds=$lt_module_expsym_cmds # Whether we are building with GNU ld or not. with_gnu_ld=$lt_with_gnu_ld # Flag that allows shared libraries with undefined symbols to be built. allow_undefined_flag=$lt_allow_undefined_flag # Flag that enforces no undefined symbols. no_undefined_flag=$lt_no_undefined_flag # Flag to hardcode \$libdir into a binary during linking. # This must work even if \$libdir does not exist hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec # Whether we need a single "-rpath" flag with a separated argument. hardcode_libdir_separator=$lt_hardcode_libdir_separator # Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes # DIR into the resulting binary. hardcode_direct=$hardcode_direct # Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes # DIR into the resulting binary and the resulting library dependency is # "absolute",i.e impossible to change by setting \$shlibpath_var if the # library is relocated. hardcode_direct_absolute=$hardcode_direct_absolute # Set to "yes" if using the -LDIR flag during linking hardcodes DIR # into the resulting binary. hardcode_minus_L=$hardcode_minus_L # Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR # into the resulting binary. hardcode_shlibpath_var=$hardcode_shlibpath_var # Set to "yes" if building a shared library automatically hardcodes DIR # into the library and all subsequent libraries and executables linked # against it. hardcode_automatic=$hardcode_automatic # Set to yes if linker adds runtime paths of dependent libraries # to runtime path list. inherit_rpath=$inherit_rpath # Whether libtool must link a program against all its dependency libraries. link_all_deplibs=$link_all_deplibs # Set to "yes" if exported symbols are required. always_export_symbols=$always_export_symbols # The commands to list exported symbols. export_symbols_cmds=$lt_export_symbols_cmds # Symbols that should not be listed in the preloaded symbols. exclude_expsyms=$lt_exclude_expsyms # Symbols that must always be exported. include_expsyms=$lt_include_expsyms # Commands necessary for linking programs (against libraries) with templates. prelink_cmds=$lt_prelink_cmds # Commands necessary for finishing linking programs. postlink_cmds=$lt_postlink_cmds # Specify filename containing input files. file_list_spec=$lt_file_list_spec # How to hardcode a shared library path into an executable. hardcode_action=$hardcode_action # ### END LIBTOOL CONFIG _LT_EOF cat <<'_LT_EOF' >> "$cfgfile" # ### BEGIN FUNCTIONS SHARED WITH CONFIGURE # func_munge_path_list VARIABLE PATH # ----------------------------------- # VARIABLE is name of variable containing _space_ separated list of # directories to be munged by the contents of PATH, which is string # having a format: # "DIR[:DIR]:" # string "DIR[ DIR]" will be prepended to VARIABLE # ":DIR[:DIR]" # string "DIR[ DIR]" will be appended to VARIABLE # "DIRP[:DIRP]::[DIRA:]DIRA" # string "DIRP[ DIRP]" will be prepended to VARIABLE and string # "DIRA[ DIRA]" will be appended to VARIABLE # "DIR[:DIR]" # VARIABLE will be replaced by "DIR[ DIR]" func_munge_path_list () { case x$2 in x) ;; *:) eval $1=\"`$ECHO $2 | $SED 's/:/ /g'` \$$1\" ;; x:*) eval $1=\"\$$1 `$ECHO $2 | $SED 's/:/ /g'`\" ;; *::*) eval $1=\"\$$1\ `$ECHO $2 | $SED -e 's/.*:://' -e 's/:/ /g'`\" eval $1=\"`$ECHO $2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \$$1\" ;; *) eval $1=\"`$ECHO $2 | $SED 's/:/ /g'`\" ;; esac } # Calculate cc_basename. Skip known compiler wrappers and cross-prefix. func_cc_basename () { for cc_temp in $*""; do case $cc_temp in compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; \-*) ;; *) break;; esac done func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` } # ### END FUNCTIONS SHARED WITH CONFIGURE _LT_EOF case $host_os in aix3*) cat <<\_LT_EOF >> "$cfgfile" # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test set != "${COLLECT_NAMES+set}"; then COLLECT_NAMES= export COLLECT_NAMES fi _LT_EOF ;; esac ltmain=$ac_aux_dir/ltmain.sh # We use sed instead of cat because bash on DJGPP gets confused if # if finds mixed CR/LF and LF-only lines. Since sed operates in # text mode, it properly converts lines to CR/LF. This bash problem # is reportedly fixed, but why not run on old versions too? sed '$q' "$ltmain" >> "$cfgfile" \ || (rm -f "$cfgfile"; exit 1) mv -f "$cfgfile" "$ofile" || (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") chmod +x "$ofile" ;; "doc/dummy":C) : ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || as_fn_exit 1 fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi echo "PSPP configured successfully." pspp-1.4.1/acinclude.m40000644000175000017500000003246013717773141014324 0ustar00blpblp00000000000000dnl Copyright (C) 2005, 2006, 2007, 2009, 2014, 2015 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl Prerequisites. dnl Summarize all the missing prerequisites at the end of the run to dnl increase user-friendliness. AC_DEFUN([PSPP_REQUIRED_PREREQ], [AC_MSG_WARN([You must install $1 before building PSPP.]) pspp_required_prereqs="$pspp_required_prereqs $1"]) AC_DEFUN([PSPP_OPTIONAL_PREREQ], [pspp_optional_prereqs="$pspp_optional_prereqs $1"]) AC_DEFUN([PSPP_CHECK_PREREQS], [ if test "$pspp_optional_prereqs" != ""; then AC_MSG_WARN([The following optional prerequisites are not installed. You may wish to install them to obtain additional functionality:$pspp_optional_prereqs]) fi if test "$pspp_required_prereqs" != ""; then AC_MSG_ERROR([The following required prerequisites are not installed. You must install them before PSPP can be built:$pspp_required_prereqs]) fi ]) dnl Check that a new enough version of Perl is available. AC_DEFUN([PSPP_PERL], [ AC_PATH_PROG([PERL], perl, no) AC_SUBST([PERL])dnl if test "$PERL" != no && $PERL -e 'require 5.005_03;'; then :; else PSPP_REQUIRED_PREREQ([Perl 5.005_03 (or later)]) fi # The PSPP autobuilder appends a build number to the PSPP version number, # e.g. "0.7.2-build40". But Perl won't parse version numbers that contain # anything other than digits and periods, so "-build" causes an error. So we # define $(VERSION_FOR_PERL) that drops everything from the hyphen onward. VERSION_FOR_PERL=`echo "$VERSION" | sed 's/-.*//'` AC_SUBST([VERSION_FOR_PERL]) ]) dnl Check that Python 2 or 3 is available. AC_DEFUN([PSPP_PYTHON], [AC_ARG_VAR([PYTHON], [Python 2 or 3 interpreter]) AC_CHECK_PROGS([PYTHON], [python python2 python3], [none])]) dnl PSPP_CHECK_CC_OPTION([OPTION], [ACTION-IF-ACCEPTED], [ACTION-IF-REJECTED]) dnl Check whether the given C compiler OPTION is accepted. dnl If so, execute ACTION-IF-ACCEPTED, otherwise ACTION-IF-REJECTED. AC_DEFUN([PSPP_CHECK_CC_OPTION], [ m4_define([pspp_cv_name], [pspp_cv_[]m4_translit([$1], [-], [_])])dnl AC_CACHE_CHECK([whether $CC accepts $1], [pspp_cv_name], [pspp_save_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS $1" AC_COMPILE_IFELSE([AC_LANG_PROGRAM(,)], [pspp_cv_name[]=yes], [pspp_cv_name[]=no]) CFLAGS="$pspp_save_CFLAGS"]) if test $pspp_cv_name = yes; then m4_if([$2], [], [;], [$2]) else m4_if([$3], [], [:], [$3]) fi ]) dnl Check for readline and history libraries. dnl Modified for PSPP, based on readline.m4 serial 3 from dnl gnulib, which was written by Simon Josefsson, with help from Bruno dnl Haible and Oskar Liljeblad. AC_DEFUN([PSPP_READLINE], [ dnl Prerequisites of AC_LIB_LINKFLAGS_BODY. AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) AC_REQUIRE([AC_LIB_RPATH]) dnl Search for libreadline and define LIBREADLINE, LTLIBREADLINE and dnl INCREADLINE accordingly. AC_LIB_LINKFLAGS_BODY([readline]) AC_LIB_LINKFLAGS_BODY([history]) dnl Add $INCREADLINE to CPPFLAGS before performing the following checks, dnl because if the user has installed libreadline and not disabled its use dnl via --without-libreadline-prefix, he wants to use it. The AC_LINK_IFELSE dnl will then succeed. am_save_CPPFLAGS="$CPPFLAGS" AC_LIB_APPENDTOVAR([CPPFLAGS], [$INCREADLINE $INCHISTORY]) AC_CACHE_CHECK(for readline, gl_cv_lib_readline, [ gl_cv_lib_readline=no am_save_LIBS="$LIBS" dnl On some systems, -lreadline doesn't link without an additional dnl -lncurses or -ltermcap. dnl Try -lncurses before -ltermcap, because libtermcap is unsecure dnl by design and obsolete since 1994. Try -lcurses last, because dnl libcurses is unusable on some old Unices. for extra_lib in "" ncurses termcap curses; do LIBS="$am_save_LIBS $LIBREADLINE $LIBHISTORY" if test -n "$extra_lib"; then LIBS="$LIBS -l$extra_lib" fi AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include #include #include ]], [[readline((char*)0); add_history((char*)0);]])],[gl_cv_lib_readline=yes],[]) if test "$gl_cv_lib_readline" = yes; then if test -n "$extra_lib"; then LIBREADLINE="$LIBREADLINE $LIBHISTORY -l$extra_lib" LTLIBREADLINE="$LTLIBREADLINE $LTLIBHISTORY -l$extra_lib" fi break fi done LIBS="$am_save_LIBS" ]) if test "$gl_cv_lib_readline" = yes; then AC_DEFINE([HAVE_READLINE], 1, [Define if you have the readline library.]) AC_MSG_CHECKING([how to link with libreadline]) AC_MSG_RESULT([$LIBREADLINE]) AC_SEARCH_LIBS([rl_echo_signal_char], [readline], AC_DEFINE([HAVE_RL_ECHO_SIGNAL_CHAR], 1, [Define if the readline library provides rl_echo_signal_char.]),[],[$LIBREADLINE]) AC_SEARCH_LIBS([rl_outstream], [readline], AC_DEFINE([HAVE_RL_OUTSTREAM], 1, [Define if the readline library provides rl_outstream.]),[],[$LIBREADLINE]) else dnl If $LIBREADLINE didn't lead to a usable library, we don't dnl need $INCREADLINE either. CPPFLAGS="$am_save_CPPFLAGS" LIBREADLINE= LTLIBREADLINE= LIBHISTORY= LTLIBHISTORY= PSPP_OPTIONAL_PREREQ([libreadline (which may itself require libncurses or libtermcap)]) fi AC_SUBST(LIBREADLINE) AC_SUBST(LTLIBREADLINE) ]) dnl Check for build tools. Adapted from bfd library. AC_DEFUN([PSPP_CC_FOR_BUILD], [# Put a plausible default for CC_FOR_BUILD in Makefile. if test -z "$CC_FOR_BUILD"; then if test "x$cross_compiling" = "xno"; then CC_FOR_BUILD='$(CC)' else CC_FOR_BUILD=cc fi fi AC_SUBST(CC_FOR_BUILD) # Also set EXEEXT_FOR_BUILD. if test "x$cross_compiling" = "xno"; then EXEEXT_FOR_BUILD='$(EXEEXT)' else AC_CACHE_CHECK([for build system executable suffix], pspp_cv_build_exeext, [rm -f conftest* echo 'int main () { return 0; }' > conftest.c pspp_cv_build_exeext= ${CC_FOR_BUILD} -o conftest conftest.c 1>&5 2>&5 for file in conftest.*; do case $file in # ( *.c | *.o | *.obj | *.ilk | *.pdb) ;; # ( *) pspp_cv_build_exeext=`echo $file | sed -e s/conftest//` ;; esac done rm -f conftest* test x"${pspp_cv_build_exeext}" = x && pspp_cv_build_exeext=no]) EXEEXT_FOR_BUILD="" test x"${pspp_cv_build_exeext}" != xno && EXEEXT_FOR_BUILD=${pspp_cv_build_exeext} fi AC_SUBST(EXEEXT_FOR_BUILD)]) dnl Check for LC_PAPER, _NL_PAPER_WIDTH, _NL_PAPER_HEIGHT. AC_DEFUN([PSPP_LC_PAPER], [AC_CACHE_CHECK(for LC_PAPER, pspp_cv_lc_paper, [ pspp_cv_lc_paper=no AC_COMPILE_IFELSE( [AC_LANG_PROGRAM( [#include #include ], [(void) LC_PAPER; (void) _NL_PAPER_WIDTH; (void) _NL_PAPER_HEIGHT])], [pspp_cv_lc_paper=yes]) ]) if test "$pspp_cv_lc_paper" = yes; then AC_DEFINE([HAVE_LC_PAPER], 1, [Define if you have LC_PAPER.]) fi ]) # PSPP_LINK2_IFELSE(SOURCE1, SOURCE2, [ACTION-IF-TRUE], [ACTION-IF-FALSE]) # ------------------------------------------------------------- # Based on AC_LINK_IFELSE, but tries to link both SOURCE1 and SOURCE2 # into a program. # # Test that resulting file is executable; see the problem reported by mwoehlke # in . # But skip the test when cross-compiling, to prevent problems like the one # reported by Chris Johns in # . # m4_define([PSPP_LINK2_IFELSE], [m4_ifvaln([$1], [AC_LANG_CONFTEST([$1])])dnl mv conftest.$ac_ext conftest1.$ac_ext m4_ifvaln([$2], [AC_LANG_CONFTEST([$2])])dnl mv conftest.$ac_ext conftest2.$ac_ext rm -f conftest1.$ac_objext conftest2.$ac_objext conftest$ac_exeext pspp_link2='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest1.$ac_ext conftest2.$ac_ext $LIBS >&5' AS_IF([_AC_DO_STDERR($pspp_link2) && { test -z "$ac_[]_AC_LANG_ABBREV[]_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || AS_TEST_X([conftest$ac_exeext]) }], [$3], [echo "$as_me: failed source file 1 of 2 was:" >&5 sed 's/^/| /' conftest1.$ac_ext >&5 echo "$as_me: failed source file 2 of 2 was:" >&5 sed 's/^/| /' conftest2.$ac_ext >&5 $4]) dnl Delete also the IPA/IPO (Inter Procedural Analysis/Optimization) dnl information created by the PGI compiler (conftest_ipa8_conftest.oo), dnl as it would interfere with the next link command. rm -rf conftest.dSYM conftest1.dSYM conftest2.dSYM rm -f core conftest.err conftest1.err conftest2.err rm -f conftest1.$ac_objext conftest2.$ac_objext conftest*_ipa8_conftest*.oo rm -f conftest$ac_exeext rm -f m4_ifval([$1], [conftest1.$ac_ext]) m4_ifval([$2], [conftest1.$ac_ext])[]dnl ])# PSPP_LINK2_IFELSE # GSL uses "extern inline" without determining whether the compiler uses # GCC inline rules or C99 inline rules. If it uses the latter then GSL # will be broken without passing -fgnu89-inline to GCC. AC_DEFUN([PSPP_GSL_NEEDS_FGNU89_INLINE], [# GSL only uses "inline" at all if HAVE_INLINE is defined as a macro. # In turn, gnulib's gl_INLINE is one macro that does that. We need to # make sure that it has run by the time we run this test, otherwise we'll # get a false result. AC_REQUIRE([gl_INLINE]) PSPP_CHECK_CC_OPTION( [-fgnu89-inline], [AC_CACHE_CHECK([whether GSL needs -fgnu89-inline to link], pspp_cv_gsl_needs_fgnu89_inline, [ PSPP_LINK2_IFELSE( [AC_LANG_PROGRAM([#include ], [GSL_MAX_INT(1,2);])], [AC_LANG_SOURCE([#include void x (void) {}])], [pspp_cv_gsl_needs_fgnu89_inline=no], [pspp_cv_gsl_needs_fgnu89_inline=yes])]) if test "$pspp_cv_gsl_needs_fgnu89_inline" = "yes"; then CFLAGS="$CFLAGS -fgnu89-inline" fi]) ]) AC_DEFUN([PSPP_CHECK_CLICKSEQUENCE], [AC_REQUIRE([AM_INIT_AUTOMAKE]) # Defines MAKEINFO AC_CACHE_CHECK([whether makeinfo supports @clicksequence], [pspp_cv_have_clicksequence], [cat > conftest.texi <&AS_MESSAGE_LOG_FD" >&AS_MESSAGE_LOG_FD eval "$MAKEINFO conftest.texi >&AS_MESSAGE_LOG_FD 2>&1" retval=$? echo "configure:__oline__: \$? = $retval" >&AS_MESSAGE_LOG_FD if test $retval = 0; then pspp_cv_have_clicksequence=yes else pspp_cv_have_clicksequence=no fi rm -f conftest.texi conftest.info]) if test $pspp_cv_have_clicksequence = no; then AM_MAKEINFOFLAGS="$AM_MAKEINFOFLAGS -DMISSING_CLICKSEQUENCE" AC_SUBST([AM_MAKEINFOFLAGS]) fi]) dnl Texinfo 4.13 generates broken DocBook XML. Probably other old dnl versions do too, but that's the one that causes problems. AC_DEFUN([PSPP_CHECK_MAKEINFO_DOCBOOK_XML], [AC_REQUIRE([AM_INIT_AUTOMAKE]) # Defines MAKEINFO AC_CACHE_CHECK( [whether makeinfo generates broken DocBook XML], [pspp_cv_broken_docbook_xml], [AS_CASE( [$(eval "$MAKEINFO --version | head -1")], [*texinfo*4.13*], [pspp_cv_broken_docbook_xml=yes], [*texinfo*], [pspp_cv_broken_docbook_xml=no], [*], [pspp_cv_broken_docbook_xml=yes])]) AM_CONDITIONAL( [BROKEN_DOCBOOK_XML], [test "$pspp_cv_broken_docbook_xml" = yes])]) # The following comes from Open vSwitch: # ---------------------------------------------------------------------- # Copyright (c) 2008, 2009, 2010, 2011 Nicira Networks. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at: # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. dnl PSPP_ENABLE_WERROR AC_DEFUN([PSPP_ENABLE_WERROR], [AC_ARG_ENABLE( [Werror], [AC_HELP_STRING([--enable-Werror], [Add -Werror to CFLAGS])], [], [enable_Werror=no]) AC_CONFIG_COMMANDS_PRE( [if test "X$enable_Werror" = Xyes; then CFLAGS="$CFLAGS -Werror -Wno-error=deprecated-declarations" fi])]) # The following comes from Open vSwitch: # ---------------------------------------------------------------------- # Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015 Nicira, Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at: # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. dnl Checks for dot. AC_DEFUN([PSPP_CHECK_DOT], [AC_CACHE_CHECK( [for dot], [pspp_cv_dot], [dnl "dot" writes -V output to stderr: if (dot -V) 2>&1 | grep '^dot - [[gG]]raphviz version' >/dev/null 2>&1; then pspp_cv_dot=yes else pspp_cv_dot=no fi]) AM_CONDITIONAL([HAVE_DOT], [test "$pspp_cv_dot" = yes])]) pspp-1.4.1/m4/0000755000175000017500000000000013725012646012441 5ustar00blpblp00000000000000pspp-1.4.1/m4/ltoptions.m40000644000175000017500000003426213725006215014740 0ustar00blpblp00000000000000# Helper functions for option handling. -*- Autoconf -*- # # Copyright (C) 2004-2005, 2007-2009, 2011-2015 Free Software # Foundation, Inc. # Written by Gary V. Vaughan, 2004 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # serial 8 ltoptions.m4 # This is to help aclocal find these macros, as it can't see m4_define. AC_DEFUN([LTOPTIONS_VERSION], [m4_if([1])]) # _LT_MANGLE_OPTION(MACRO-NAME, OPTION-NAME) # ------------------------------------------ m4_define([_LT_MANGLE_OPTION], [[_LT_OPTION_]m4_bpatsubst($1__$2, [[^a-zA-Z0-9_]], [_])]) # _LT_SET_OPTION(MACRO-NAME, OPTION-NAME) # --------------------------------------- # Set option OPTION-NAME for macro MACRO-NAME, and if there is a # matching handler defined, dispatch to it. Other OPTION-NAMEs are # saved as a flag. m4_define([_LT_SET_OPTION], [m4_define(_LT_MANGLE_OPTION([$1], [$2]))dnl m4_ifdef(_LT_MANGLE_DEFUN([$1], [$2]), _LT_MANGLE_DEFUN([$1], [$2]), [m4_warning([Unknown $1 option '$2'])])[]dnl ]) # _LT_IF_OPTION(MACRO-NAME, OPTION-NAME, IF-SET, [IF-NOT-SET]) # ------------------------------------------------------------ # Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. m4_define([_LT_IF_OPTION], [m4_ifdef(_LT_MANGLE_OPTION([$1], [$2]), [$3], [$4])]) # _LT_UNLESS_OPTIONS(MACRO-NAME, OPTION-LIST, IF-NOT-SET) # ------------------------------------------------------- # Execute IF-NOT-SET unless all options in OPTION-LIST for MACRO-NAME # are set. m4_define([_LT_UNLESS_OPTIONS], [m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), [m4_ifdef(_LT_MANGLE_OPTION([$1], _LT_Option), [m4_define([$0_found])])])[]dnl m4_ifdef([$0_found], [m4_undefine([$0_found])], [$3 ])[]dnl ]) # _LT_SET_OPTIONS(MACRO-NAME, OPTION-LIST) # ---------------------------------------- # OPTION-LIST is a space-separated list of Libtool options associated # with MACRO-NAME. If any OPTION has a matching handler declared with # LT_OPTION_DEFINE, dispatch to that macro; otherwise complain about # the unknown option and exit. m4_defun([_LT_SET_OPTIONS], [# Set options m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), [_LT_SET_OPTION([$1], _LT_Option)]) m4_if([$1],[LT_INIT],[ dnl dnl Simply set some default values (i.e off) if boolean options were not dnl specified: _LT_UNLESS_OPTIONS([LT_INIT], [dlopen], [enable_dlopen=no ]) _LT_UNLESS_OPTIONS([LT_INIT], [win32-dll], [enable_win32_dll=no ]) dnl dnl If no reference was made to various pairs of opposing options, then dnl we run the default mode handler for the pair. For example, if neither dnl 'shared' nor 'disable-shared' was passed, we enable building of shared dnl archives by default: _LT_UNLESS_OPTIONS([LT_INIT], [shared disable-shared], [_LT_ENABLE_SHARED]) _LT_UNLESS_OPTIONS([LT_INIT], [static disable-static], [_LT_ENABLE_STATIC]) _LT_UNLESS_OPTIONS([LT_INIT], [pic-only no-pic], [_LT_WITH_PIC]) _LT_UNLESS_OPTIONS([LT_INIT], [fast-install disable-fast-install], [_LT_ENABLE_FAST_INSTALL]) _LT_UNLESS_OPTIONS([LT_INIT], [aix-soname=aix aix-soname=both aix-soname=svr4], [_LT_WITH_AIX_SONAME([aix])]) ]) ])# _LT_SET_OPTIONS ## --------------------------------- ## ## Macros to handle LT_INIT options. ## ## --------------------------------- ## # _LT_MANGLE_DEFUN(MACRO-NAME, OPTION-NAME) # ----------------------------------------- m4_define([_LT_MANGLE_DEFUN], [[_LT_OPTION_DEFUN_]m4_bpatsubst(m4_toupper([$1__$2]), [[^A-Z0-9_]], [_])]) # LT_OPTION_DEFINE(MACRO-NAME, OPTION-NAME, CODE) # ----------------------------------------------- m4_define([LT_OPTION_DEFINE], [m4_define(_LT_MANGLE_DEFUN([$1], [$2]), [$3])[]dnl ])# LT_OPTION_DEFINE # dlopen # ------ LT_OPTION_DEFINE([LT_INIT], [dlopen], [enable_dlopen=yes ]) AU_DEFUN([AC_LIBTOOL_DLOPEN], [_LT_SET_OPTION([LT_INIT], [dlopen]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the 'dlopen' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_DLOPEN], []) # win32-dll # --------- # Declare package support for building win32 dll's. LT_OPTION_DEFINE([LT_INIT], [win32-dll], [enable_win32_dll=yes case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-cegcc*) AC_CHECK_TOOL(AS, as, false) AC_CHECK_TOOL(DLLTOOL, dlltool, false) AC_CHECK_TOOL(OBJDUMP, objdump, false) ;; esac test -z "$AS" && AS=as _LT_DECL([], [AS], [1], [Assembler program])dnl test -z "$DLLTOOL" && DLLTOOL=dlltool _LT_DECL([], [DLLTOOL], [1], [DLL creation program])dnl test -z "$OBJDUMP" && OBJDUMP=objdump _LT_DECL([], [OBJDUMP], [1], [Object dumper program])dnl ])# win32-dll AU_DEFUN([AC_LIBTOOL_WIN32_DLL], [AC_REQUIRE([AC_CANONICAL_HOST])dnl _LT_SET_OPTION([LT_INIT], [win32-dll]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the 'win32-dll' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_WIN32_DLL], []) # _LT_ENABLE_SHARED([DEFAULT]) # ---------------------------- # implement the --enable-shared flag, and supports the 'shared' and # 'disable-shared' LT_INIT options. # DEFAULT is either 'yes' or 'no'. If omitted, it defaults to 'yes'. m4_define([_LT_ENABLE_SHARED], [m4_define([_LT_ENABLE_SHARED_DEFAULT], [m4_if($1, no, no, yes)])dnl AC_ARG_ENABLE([shared], [AS_HELP_STRING([--enable-shared@<:@=PKGS@:>@], [build shared libraries @<:@default=]_LT_ENABLE_SHARED_DEFAULT[@:>@])], [p=${PACKAGE-default} case $enableval in yes) enable_shared=yes ;; no) enable_shared=no ;; *) enable_shared=no # Look at the argument we got. We use all the common list separators. lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, for pkg in $enableval; do IFS=$lt_save_ifs if test "X$pkg" = "X$p"; then enable_shared=yes fi done IFS=$lt_save_ifs ;; esac], [enable_shared=]_LT_ENABLE_SHARED_DEFAULT) _LT_DECL([build_libtool_libs], [enable_shared], [0], [Whether or not to build shared libraries]) ])# _LT_ENABLE_SHARED LT_OPTION_DEFINE([LT_INIT], [shared], [_LT_ENABLE_SHARED([yes])]) LT_OPTION_DEFINE([LT_INIT], [disable-shared], [_LT_ENABLE_SHARED([no])]) # Old names: AC_DEFUN([AC_ENABLE_SHARED], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[shared]) ]) AC_DEFUN([AC_DISABLE_SHARED], [_LT_SET_OPTION([LT_INIT], [disable-shared]) ]) AU_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)]) AU_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AM_ENABLE_SHARED], []) dnl AC_DEFUN([AM_DISABLE_SHARED], []) # _LT_ENABLE_STATIC([DEFAULT]) # ---------------------------- # implement the --enable-static flag, and support the 'static' and # 'disable-static' LT_INIT options. # DEFAULT is either 'yes' or 'no'. If omitted, it defaults to 'yes'. m4_define([_LT_ENABLE_STATIC], [m4_define([_LT_ENABLE_STATIC_DEFAULT], [m4_if($1, no, no, yes)])dnl AC_ARG_ENABLE([static], [AS_HELP_STRING([--enable-static@<:@=PKGS@:>@], [build static libraries @<:@default=]_LT_ENABLE_STATIC_DEFAULT[@:>@])], [p=${PACKAGE-default} case $enableval in yes) enable_static=yes ;; no) enable_static=no ;; *) enable_static=no # Look at the argument we got. We use all the common list separators. lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, for pkg in $enableval; do IFS=$lt_save_ifs if test "X$pkg" = "X$p"; then enable_static=yes fi done IFS=$lt_save_ifs ;; esac], [enable_static=]_LT_ENABLE_STATIC_DEFAULT) _LT_DECL([build_old_libs], [enable_static], [0], [Whether or not to build static libraries]) ])# _LT_ENABLE_STATIC LT_OPTION_DEFINE([LT_INIT], [static], [_LT_ENABLE_STATIC([yes])]) LT_OPTION_DEFINE([LT_INIT], [disable-static], [_LT_ENABLE_STATIC([no])]) # Old names: AC_DEFUN([AC_ENABLE_STATIC], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[static]) ]) AC_DEFUN([AC_DISABLE_STATIC], [_LT_SET_OPTION([LT_INIT], [disable-static]) ]) AU_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)]) AU_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AM_ENABLE_STATIC], []) dnl AC_DEFUN([AM_DISABLE_STATIC], []) # _LT_ENABLE_FAST_INSTALL([DEFAULT]) # ---------------------------------- # implement the --enable-fast-install flag, and support the 'fast-install' # and 'disable-fast-install' LT_INIT options. # DEFAULT is either 'yes' or 'no'. If omitted, it defaults to 'yes'. m4_define([_LT_ENABLE_FAST_INSTALL], [m4_define([_LT_ENABLE_FAST_INSTALL_DEFAULT], [m4_if($1, no, no, yes)])dnl AC_ARG_ENABLE([fast-install], [AS_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@], [optimize for fast installation @<:@default=]_LT_ENABLE_FAST_INSTALL_DEFAULT[@:>@])], [p=${PACKAGE-default} case $enableval in yes) enable_fast_install=yes ;; no) enable_fast_install=no ;; *) enable_fast_install=no # Look at the argument we got. We use all the common list separators. lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, for pkg in $enableval; do IFS=$lt_save_ifs if test "X$pkg" = "X$p"; then enable_fast_install=yes fi done IFS=$lt_save_ifs ;; esac], [enable_fast_install=]_LT_ENABLE_FAST_INSTALL_DEFAULT) _LT_DECL([fast_install], [enable_fast_install], [0], [Whether or not to optimize for fast installation])dnl ])# _LT_ENABLE_FAST_INSTALL LT_OPTION_DEFINE([LT_INIT], [fast-install], [_LT_ENABLE_FAST_INSTALL([yes])]) LT_OPTION_DEFINE([LT_INIT], [disable-fast-install], [_LT_ENABLE_FAST_INSTALL([no])]) # Old names: AU_DEFUN([AC_ENABLE_FAST_INSTALL], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[fast-install]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the 'fast-install' option into LT_INIT's first parameter.]) ]) AU_DEFUN([AC_DISABLE_FAST_INSTALL], [_LT_SET_OPTION([LT_INIT], [disable-fast-install]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the 'disable-fast-install' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_ENABLE_FAST_INSTALL], []) dnl AC_DEFUN([AM_DISABLE_FAST_INSTALL], []) # _LT_WITH_AIX_SONAME([DEFAULT]) # ---------------------------------- # implement the --with-aix-soname flag, and support the `aix-soname=aix' # and `aix-soname=both' and `aix-soname=svr4' LT_INIT options. DEFAULT # is either `aix', `both' or `svr4'. If omitted, it defaults to `aix'. m4_define([_LT_WITH_AIX_SONAME], [m4_define([_LT_WITH_AIX_SONAME_DEFAULT], [m4_if($1, svr4, svr4, m4_if($1, both, both, aix))])dnl shared_archive_member_spec= case $host,$enable_shared in power*-*-aix[[5-9]]*,yes) AC_MSG_CHECKING([which variant of shared library versioning to provide]) AC_ARG_WITH([aix-soname], [AS_HELP_STRING([--with-aix-soname=aix|svr4|both], [shared library versioning (aka "SONAME") variant to provide on AIX, @<:@default=]_LT_WITH_AIX_SONAME_DEFAULT[@:>@.])], [case $withval in aix|svr4|both) ;; *) AC_MSG_ERROR([Unknown argument to --with-aix-soname]) ;; esac lt_cv_with_aix_soname=$with_aix_soname], [AC_CACHE_VAL([lt_cv_with_aix_soname], [lt_cv_with_aix_soname=]_LT_WITH_AIX_SONAME_DEFAULT) with_aix_soname=$lt_cv_with_aix_soname]) AC_MSG_RESULT([$with_aix_soname]) if test aix != "$with_aix_soname"; then # For the AIX way of multilib, we name the shared archive member # based on the bitwidth used, traditionally 'shr.o' or 'shr_64.o', # and 'shr.imp' or 'shr_64.imp', respectively, for the Import File. # Even when GNU compilers ignore OBJECT_MODE but need '-maix64' flag, # the AIX toolchain works better with OBJECT_MODE set (default 32). if test 64 = "${OBJECT_MODE-32}"; then shared_archive_member_spec=shr_64 else shared_archive_member_spec=shr fi fi ;; *) with_aix_soname=aix ;; esac _LT_DECL([], [shared_archive_member_spec], [0], [Shared archive member basename, for filename based shared library versioning on AIX])dnl ])# _LT_WITH_AIX_SONAME LT_OPTION_DEFINE([LT_INIT], [aix-soname=aix], [_LT_WITH_AIX_SONAME([aix])]) LT_OPTION_DEFINE([LT_INIT], [aix-soname=both], [_LT_WITH_AIX_SONAME([both])]) LT_OPTION_DEFINE([LT_INIT], [aix-soname=svr4], [_LT_WITH_AIX_SONAME([svr4])]) # _LT_WITH_PIC([MODE]) # -------------------- # implement the --with-pic flag, and support the 'pic-only' and 'no-pic' # LT_INIT options. # MODE is either 'yes' or 'no'. If omitted, it defaults to 'both'. m4_define([_LT_WITH_PIC], [AC_ARG_WITH([pic], [AS_HELP_STRING([--with-pic@<:@=PKGS@:>@], [try to use only PIC/non-PIC objects @<:@default=use both@:>@])], [lt_p=${PACKAGE-default} case $withval in yes|no) pic_mode=$withval ;; *) pic_mode=default # Look at the argument we got. We use all the common list separators. lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, for lt_pkg in $withval; do IFS=$lt_save_ifs if test "X$lt_pkg" = "X$lt_p"; then pic_mode=yes fi done IFS=$lt_save_ifs ;; esac], [pic_mode=m4_default([$1], [default])]) _LT_DECL([], [pic_mode], [0], [What type of objects to build])dnl ])# _LT_WITH_PIC LT_OPTION_DEFINE([LT_INIT], [pic-only], [_LT_WITH_PIC([yes])]) LT_OPTION_DEFINE([LT_INIT], [no-pic], [_LT_WITH_PIC([no])]) # Old name: AU_DEFUN([AC_LIBTOOL_PICMODE], [_LT_SET_OPTION([LT_INIT], [pic-only]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the 'pic-only' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_PICMODE], []) ## ----------------- ## ## LTDL_INIT Options ## ## ----------------- ## m4_define([_LTDL_MODE], []) LT_OPTION_DEFINE([LTDL_INIT], [nonrecursive], [m4_define([_LTDL_MODE], [nonrecursive])]) LT_OPTION_DEFINE([LTDL_INIT], [recursive], [m4_define([_LTDL_MODE], [recursive])]) LT_OPTION_DEFINE([LTDL_INIT], [subproject], [m4_define([_LTDL_MODE], [subproject])]) m4_define([_LTDL_TYPE], []) LT_OPTION_DEFINE([LTDL_INIT], [installable], [m4_define([_LTDL_TYPE], [installable])]) LT_OPTION_DEFINE([LTDL_INIT], [convenience], [m4_define([_LTDL_TYPE], [convenience])]) pspp-1.4.1/m4/libtool.m40000644000175000017500000112676313725006215014362 0ustar00blpblp00000000000000# libtool.m4 - Configure libtool for the host system. -*-Autoconf-*- # # Copyright (C) 1996-2001, 2003-2015 Free Software Foundation, Inc. # Written by Gordon Matzigkeit, 1996 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. m4_define([_LT_COPYING], [dnl # Copyright (C) 2014 Free Software Foundation, Inc. # This is free software; see the source for copying conditions. There is NO # warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # GNU Libtool 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 of the License, or # (at your option) any later version. # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program or library that is built # using GNU Libtool, you may include this file under the same # distribution terms that you use for the rest of that program. # # GNU Libtool 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, see . ]) # serial 58 LT_INIT # LT_PREREQ(VERSION) # ------------------ # Complain and exit if this libtool version is less that VERSION. m4_defun([LT_PREREQ], [m4_if(m4_version_compare(m4_defn([LT_PACKAGE_VERSION]), [$1]), -1, [m4_default([$3], [m4_fatal([Libtool version $1 or higher is required], 63)])], [$2])]) # _LT_CHECK_BUILDDIR # ------------------ # Complain if the absolute build directory name contains unusual characters m4_defun([_LT_CHECK_BUILDDIR], [case `pwd` in *\ * | *\ *) AC_MSG_WARN([Libtool does not cope well with whitespace in `pwd`]) ;; esac ]) # LT_INIT([OPTIONS]) # ------------------ AC_DEFUN([LT_INIT], [AC_PREREQ([2.62])dnl We use AC_PATH_PROGS_FEATURE_CHECK AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl AC_BEFORE([$0], [LT_LANG])dnl AC_BEFORE([$0], [LT_OUTPUT])dnl AC_BEFORE([$0], [LTDL_INIT])dnl m4_require([_LT_CHECK_BUILDDIR])dnl dnl Autoconf doesn't catch unexpanded LT_ macros by default: m4_pattern_forbid([^_?LT_[A-Z_]+$])dnl m4_pattern_allow([^(_LT_EOF|LT_DLGLOBAL|LT_DLLAZY_OR_NOW|LT_MULTI_MODULE)$])dnl dnl aclocal doesn't pull ltoptions.m4, ltsugar.m4, or ltversion.m4 dnl unless we require an AC_DEFUNed macro: AC_REQUIRE([LTOPTIONS_VERSION])dnl AC_REQUIRE([LTSUGAR_VERSION])dnl AC_REQUIRE([LTVERSION_VERSION])dnl AC_REQUIRE([LTOBSOLETE_VERSION])dnl m4_require([_LT_PROG_LTMAIN])dnl _LT_SHELL_INIT([SHELL=${CONFIG_SHELL-/bin/sh}]) dnl Parse OPTIONS _LT_SET_OPTIONS([$0], [$1]) # This can be used to rebuild libtool when needed LIBTOOL_DEPS=$ltmain # Always use our own libtool. LIBTOOL='$(SHELL) $(top_builddir)/libtool' AC_SUBST(LIBTOOL)dnl _LT_SETUP # Only expand once: m4_define([LT_INIT]) ])# LT_INIT # Old names: AU_ALIAS([AC_PROG_LIBTOOL], [LT_INIT]) AU_ALIAS([AM_PROG_LIBTOOL], [LT_INIT]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_PROG_LIBTOOL], []) dnl AC_DEFUN([AM_PROG_LIBTOOL], []) # _LT_PREPARE_CC_BASENAME # ----------------------- m4_defun([_LT_PREPARE_CC_BASENAME], [ # Calculate cc_basename. Skip known compiler wrappers and cross-prefix. func_cc_basename () { for cc_temp in @S|@*""; do case $cc_temp in compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;; distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;; \-*) ;; *) break;; esac done func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` } ])# _LT_PREPARE_CC_BASENAME # _LT_CC_BASENAME(CC) # ------------------- # It would be clearer to call AC_REQUIREs from _LT_PREPARE_CC_BASENAME, # but that macro is also expanded into generated libtool script, which # arranges for $SED and $ECHO to be set by different means. m4_defun([_LT_CC_BASENAME], [m4_require([_LT_PREPARE_CC_BASENAME])dnl AC_REQUIRE([_LT_DECL_SED])dnl AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])dnl func_cc_basename $1 cc_basename=$func_cc_basename_result ]) # _LT_FILEUTILS_DEFAULTS # ---------------------- # It is okay to use these file commands and assume they have been set # sensibly after 'm4_require([_LT_FILEUTILS_DEFAULTS])'. m4_defun([_LT_FILEUTILS_DEFAULTS], [: ${CP="cp -f"} : ${MV="mv -f"} : ${RM="rm -f"} ])# _LT_FILEUTILS_DEFAULTS # _LT_SETUP # --------- m4_defun([_LT_SETUP], [AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_CANONICAL_BUILD])dnl AC_REQUIRE([_LT_PREPARE_SED_QUOTE_VARS])dnl AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])dnl _LT_DECL([], [PATH_SEPARATOR], [1], [The PATH separator for the build system])dnl dnl _LT_DECL([], [host_alias], [0], [The host system])dnl _LT_DECL([], [host], [0])dnl _LT_DECL([], [host_os], [0])dnl dnl _LT_DECL([], [build_alias], [0], [The build system])dnl _LT_DECL([], [build], [0])dnl _LT_DECL([], [build_os], [0])dnl dnl AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([LT_PATH_LD])dnl AC_REQUIRE([LT_PATH_NM])dnl dnl AC_REQUIRE([AC_PROG_LN_S])dnl test -z "$LN_S" && LN_S="ln -s" _LT_DECL([], [LN_S], [1], [Whether we need soft or hard links])dnl dnl AC_REQUIRE([LT_CMD_MAX_LEN])dnl _LT_DECL([objext], [ac_objext], [0], [Object file suffix (normally "o")])dnl _LT_DECL([], [exeext], [0], [Executable file suffix (normally "")])dnl dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_CHECK_SHELL_FEATURES])dnl m4_require([_LT_PATH_CONVERSION_FUNCTIONS])dnl m4_require([_LT_CMD_RELOAD])dnl m4_require([_LT_CHECK_MAGIC_METHOD])dnl m4_require([_LT_CHECK_SHAREDLIB_FROM_LINKLIB])dnl m4_require([_LT_CMD_OLD_ARCHIVE])dnl m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl m4_require([_LT_WITH_SYSROOT])dnl m4_require([_LT_CMD_TRUNCATE])dnl _LT_CONFIG_LIBTOOL_INIT([ # See if we are running on zsh, and set the options that allow our # commands through without removal of \ escapes INIT. if test -n "\${ZSH_VERSION+set}"; then setopt NO_GLOB_SUBST fi ]) if test -n "${ZSH_VERSION+set}"; then setopt NO_GLOB_SUBST fi _LT_CHECK_OBJDIR m4_require([_LT_TAG_COMPILER])dnl case $host_os in aix3*) # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test set != "${COLLECT_NAMES+set}"; then COLLECT_NAMES= export COLLECT_NAMES fi ;; esac # Global variables: ofile=libtool can_build_shared=yes # All known linkers require a '.a' archive for static linking (except MSVC, # which needs '.lib'). libext=a with_gnu_ld=$lt_cv_prog_gnu_ld old_CC=$CC old_CFLAGS=$CFLAGS # Set sane defaults for various variables test -z "$CC" && CC=cc test -z "$LTCC" && LTCC=$CC test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS test -z "$LD" && LD=ld test -z "$ac_objext" && ac_objext=o _LT_CC_BASENAME([$compiler]) # Only perform the check for file, if the check method requires it test -z "$MAGIC_CMD" && MAGIC_CMD=file case $deplibs_check_method in file_magic*) if test "$file_magic_cmd" = '$MAGIC_CMD'; then _LT_PATH_MAGIC fi ;; esac # Use C for the default configuration in the libtool script LT_SUPPORTED_TAG([CC]) _LT_LANG_C_CONFIG _LT_LANG_DEFAULT_CONFIG _LT_CONFIG_COMMANDS ])# _LT_SETUP # _LT_PREPARE_SED_QUOTE_VARS # -------------------------- # Define a few sed substitution that help us do robust quoting. m4_defun([_LT_PREPARE_SED_QUOTE_VARS], [# Backslashify metacharacters that are still active within # double-quoted strings. sed_quote_subst='s/\([["`$\\]]\)/\\\1/g' # Same as above, but do not quote variable references. double_quote_subst='s/\([["`\\]]\)/\\\1/g' # Sed substitution to delay expansion of an escaped shell variable in a # double_quote_subst'ed string. delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' # Sed substitution to delay expansion of an escaped single quote. delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' # Sed substitution to avoid accidental globbing in evaled expressions no_glob_subst='s/\*/\\\*/g' ]) # _LT_PROG_LTMAIN # --------------- # Note that this code is called both from 'configure', and 'config.status' # now that we use AC_CONFIG_COMMANDS to generate libtool. Notably, # 'config.status' has no value for ac_aux_dir unless we are using Automake, # so we pass a copy along to make sure it has a sensible value anyway. m4_defun([_LT_PROG_LTMAIN], [m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([ltmain.sh])])dnl _LT_CONFIG_LIBTOOL_INIT([ac_aux_dir='$ac_aux_dir']) ltmain=$ac_aux_dir/ltmain.sh ])# _LT_PROG_LTMAIN ## ------------------------------------- ## ## Accumulate code for creating libtool. ## ## ------------------------------------- ## # So that we can recreate a full libtool script including additional # tags, we accumulate the chunks of code to send to AC_CONFIG_COMMANDS # in macros and then make a single call at the end using the 'libtool' # label. # _LT_CONFIG_LIBTOOL_INIT([INIT-COMMANDS]) # ---------------------------------------- # Register INIT-COMMANDS to be passed to AC_CONFIG_COMMANDS later. m4_define([_LT_CONFIG_LIBTOOL_INIT], [m4_ifval([$1], [m4_append([_LT_OUTPUT_LIBTOOL_INIT], [$1 ])])]) # Initialize. m4_define([_LT_OUTPUT_LIBTOOL_INIT]) # _LT_CONFIG_LIBTOOL([COMMANDS]) # ------------------------------ # Register COMMANDS to be passed to AC_CONFIG_COMMANDS later. m4_define([_LT_CONFIG_LIBTOOL], [m4_ifval([$1], [m4_append([_LT_OUTPUT_LIBTOOL_COMMANDS], [$1 ])])]) # Initialize. m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS]) # _LT_CONFIG_SAVE_COMMANDS([COMMANDS], [INIT_COMMANDS]) # ----------------------------------------------------- m4_defun([_LT_CONFIG_SAVE_COMMANDS], [_LT_CONFIG_LIBTOOL([$1]) _LT_CONFIG_LIBTOOL_INIT([$2]) ]) # _LT_FORMAT_COMMENT([COMMENT]) # ----------------------------- # Add leading comment marks to the start of each line, and a trailing # full-stop to the whole comment if one is not present already. m4_define([_LT_FORMAT_COMMENT], [m4_ifval([$1], [ m4_bpatsubst([m4_bpatsubst([$1], [^ *], [# ])], [['`$\]], [\\\&])]m4_bmatch([$1], [[!?.]$], [], [.]) )]) ## ------------------------ ## ## FIXME: Eliminate VARNAME ## ## ------------------------ ## # _LT_DECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION], [IS-TAGGED?]) # ------------------------------------------------------------------- # CONFIGNAME is the name given to the value in the libtool script. # VARNAME is the (base) name used in the configure script. # VALUE may be 0, 1 or 2 for a computed quote escaped value based on # VARNAME. Any other value will be used directly. m4_define([_LT_DECL], [lt_if_append_uniq([lt_decl_varnames], [$2], [, ], [lt_dict_add_subkey([lt_decl_dict], [$2], [libtool_name], [m4_ifval([$1], [$1], [$2])]) lt_dict_add_subkey([lt_decl_dict], [$2], [value], [$3]) m4_ifval([$4], [lt_dict_add_subkey([lt_decl_dict], [$2], [description], [$4])]) lt_dict_add_subkey([lt_decl_dict], [$2], [tagged?], [m4_ifval([$5], [yes], [no])])]) ]) # _LT_TAGDECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION]) # -------------------------------------------------------- m4_define([_LT_TAGDECL], [_LT_DECL([$1], [$2], [$3], [$4], [yes])]) # lt_decl_tag_varnames([SEPARATOR], [VARNAME1...]) # ------------------------------------------------ m4_define([lt_decl_tag_varnames], [_lt_decl_filter([tagged?], [yes], $@)]) # _lt_decl_filter(SUBKEY, VALUE, [SEPARATOR], [VARNAME1..]) # --------------------------------------------------------- m4_define([_lt_decl_filter], [m4_case([$#], [0], [m4_fatal([$0: too few arguments: $#])], [1], [m4_fatal([$0: too few arguments: $#: $1])], [2], [lt_dict_filter([lt_decl_dict], [$1], [$2], [], lt_decl_varnames)], [3], [lt_dict_filter([lt_decl_dict], [$1], [$2], [$3], lt_decl_varnames)], [lt_dict_filter([lt_decl_dict], $@)])[]dnl ]) # lt_decl_quote_varnames([SEPARATOR], [VARNAME1...]) # -------------------------------------------------- m4_define([lt_decl_quote_varnames], [_lt_decl_filter([value], [1], $@)]) # lt_decl_dquote_varnames([SEPARATOR], [VARNAME1...]) # --------------------------------------------------- m4_define([lt_decl_dquote_varnames], [_lt_decl_filter([value], [2], $@)]) # lt_decl_varnames_tagged([SEPARATOR], [VARNAME1...]) # --------------------------------------------------- m4_define([lt_decl_varnames_tagged], [m4_assert([$# <= 2])dnl _$0(m4_quote(m4_default([$1], [[, ]])), m4_ifval([$2], [[$2]], [m4_dquote(lt_decl_tag_varnames)]), m4_split(m4_normalize(m4_quote(_LT_TAGS)), [ ]))]) m4_define([_lt_decl_varnames_tagged], [m4_ifval([$3], [lt_combine([$1], [$2], [_], $3)])]) # lt_decl_all_varnames([SEPARATOR], [VARNAME1...]) # ------------------------------------------------ m4_define([lt_decl_all_varnames], [_$0(m4_quote(m4_default([$1], [[, ]])), m4_if([$2], [], m4_quote(lt_decl_varnames), m4_quote(m4_shift($@))))[]dnl ]) m4_define([_lt_decl_all_varnames], [lt_join($@, lt_decl_varnames_tagged([$1], lt_decl_tag_varnames([[, ]], m4_shift($@))))dnl ]) # _LT_CONFIG_STATUS_DECLARE([VARNAME]) # ------------------------------------ # Quote a variable value, and forward it to 'config.status' so that its # declaration there will have the same value as in 'configure'. VARNAME # must have a single quote delimited value for this to work. m4_define([_LT_CONFIG_STATUS_DECLARE], [$1='`$ECHO "$][$1" | $SED "$delay_single_quote_subst"`']) # _LT_CONFIG_STATUS_DECLARATIONS # ------------------------------ # We delimit libtool config variables with single quotes, so when # we write them to config.status, we have to be sure to quote all # embedded single quotes properly. In configure, this macro expands # each variable declared with _LT_DECL (and _LT_TAGDECL) into: # # ='`$ECHO "$" | $SED "$delay_single_quote_subst"`' m4_defun([_LT_CONFIG_STATUS_DECLARATIONS], [m4_foreach([_lt_var], m4_quote(lt_decl_all_varnames), [m4_n([_LT_CONFIG_STATUS_DECLARE(_lt_var)])])]) # _LT_LIBTOOL_TAGS # ---------------- # Output comment and list of tags supported by the script m4_defun([_LT_LIBTOOL_TAGS], [_LT_FORMAT_COMMENT([The names of the tagged configurations supported by this script])dnl available_tags='_LT_TAGS'dnl ]) # _LT_LIBTOOL_DECLARE(VARNAME, [TAG]) # ----------------------------------- # Extract the dictionary values for VARNAME (optionally with TAG) and # expand to a commented shell variable setting: # # # Some comment about what VAR is for. # visible_name=$lt_internal_name m4_define([_LT_LIBTOOL_DECLARE], [_LT_FORMAT_COMMENT(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [description])))[]dnl m4_pushdef([_libtool_name], m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [libtool_name])))[]dnl m4_case(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [value])), [0], [_libtool_name=[$]$1], [1], [_libtool_name=$lt_[]$1], [2], [_libtool_name=$lt_[]$1], [_libtool_name=lt_dict_fetch([lt_decl_dict], [$1], [value])])[]dnl m4_ifval([$2], [_$2])[]m4_popdef([_libtool_name])[]dnl ]) # _LT_LIBTOOL_CONFIG_VARS # ----------------------- # Produce commented declarations of non-tagged libtool config variables # suitable for insertion in the LIBTOOL CONFIG section of the 'libtool' # script. Tagged libtool config variables (even for the LIBTOOL CONFIG # section) are produced by _LT_LIBTOOL_TAG_VARS. m4_defun([_LT_LIBTOOL_CONFIG_VARS], [m4_foreach([_lt_var], m4_quote(_lt_decl_filter([tagged?], [no], [], lt_decl_varnames)), [m4_n([_LT_LIBTOOL_DECLARE(_lt_var)])])]) # _LT_LIBTOOL_TAG_VARS(TAG) # ------------------------- m4_define([_LT_LIBTOOL_TAG_VARS], [m4_foreach([_lt_var], m4_quote(lt_decl_tag_varnames), [m4_n([_LT_LIBTOOL_DECLARE(_lt_var, [$1])])])]) # _LT_TAGVAR(VARNAME, [TAGNAME]) # ------------------------------ m4_define([_LT_TAGVAR], [m4_ifval([$2], [$1_$2], [$1])]) # _LT_CONFIG_COMMANDS # ------------------- # Send accumulated output to $CONFIG_STATUS. Thanks to the lists of # variables for single and double quote escaping we saved from calls # to _LT_DECL, we can put quote escaped variables declarations # into 'config.status', and then the shell code to quote escape them in # for loops in 'config.status'. Finally, any additional code accumulated # from calls to _LT_CONFIG_LIBTOOL_INIT is expanded. m4_defun([_LT_CONFIG_COMMANDS], [AC_PROVIDE_IFELSE([LT_OUTPUT], dnl If the libtool generation code has been placed in $CONFIG_LT, dnl instead of duplicating it all over again into config.status, dnl then we will have config.status run $CONFIG_LT later, so it dnl needs to know what name is stored there: [AC_CONFIG_COMMANDS([libtool], [$SHELL $CONFIG_LT || AS_EXIT(1)], [CONFIG_LT='$CONFIG_LT'])], dnl If the libtool generation code is destined for config.status, dnl expand the accumulated commands and init code now: [AC_CONFIG_COMMANDS([libtool], [_LT_OUTPUT_LIBTOOL_COMMANDS], [_LT_OUTPUT_LIBTOOL_COMMANDS_INIT])]) ])#_LT_CONFIG_COMMANDS # Initialize. m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS_INIT], [ # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH sed_quote_subst='$sed_quote_subst' double_quote_subst='$double_quote_subst' delay_variable_subst='$delay_variable_subst' _LT_CONFIG_STATUS_DECLARATIONS LTCC='$LTCC' LTCFLAGS='$LTCFLAGS' compiler='$compiler_DEFAULT' # A function that is used when there is no print builtin or printf. func_fallback_echo () { eval 'cat <<_LTECHO_EOF \$[]1 _LTECHO_EOF' } # Quote evaled strings. for var in lt_decl_all_varnames([[ \ ]], lt_decl_quote_varnames); do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[[\\\\\\\`\\"\\\$]]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done # Double-quote double-evaled strings. for var in lt_decl_all_varnames([[ \ ]], lt_decl_dquote_varnames); do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[[\\\\\\\`\\"\\\$]]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done _LT_OUTPUT_LIBTOOL_INIT ]) # _LT_GENERATED_FILE_INIT(FILE, [COMMENT]) # ------------------------------------ # Generate a child script FILE with all initialization necessary to # reuse the environment learned by the parent script, and make the # file executable. If COMMENT is supplied, it is inserted after the # '#!' sequence but before initialization text begins. After this # macro, additional text can be appended to FILE to form the body of # the child script. The macro ends with non-zero status if the # file could not be fully written (such as if the disk is full). m4_ifdef([AS_INIT_GENERATED], [m4_defun([_LT_GENERATED_FILE_INIT],[AS_INIT_GENERATED($@)])], [m4_defun([_LT_GENERATED_FILE_INIT], [m4_require([AS_PREPARE])]dnl [m4_pushdef([AS_MESSAGE_LOG_FD])]dnl [lt_write_fail=0 cat >$1 <<_ASEOF || lt_write_fail=1 #! $SHELL # Generated by $as_me. $2 SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$1 <<\_ASEOF || lt_write_fail=1 AS_SHELL_SANITIZE _AS_PREPARE exec AS_MESSAGE_FD>&1 _ASEOF test 0 = "$lt_write_fail" && chmod +x $1[]dnl m4_popdef([AS_MESSAGE_LOG_FD])])])# _LT_GENERATED_FILE_INIT # LT_OUTPUT # --------- # This macro allows early generation of the libtool script (before # AC_OUTPUT is called), incase it is used in configure for compilation # tests. AC_DEFUN([LT_OUTPUT], [: ${CONFIG_LT=./config.lt} AC_MSG_NOTICE([creating $CONFIG_LT]) _LT_GENERATED_FILE_INIT(["$CONFIG_LT"], [# Run this file to recreate a libtool stub with the current configuration.]) cat >>"$CONFIG_LT" <<\_LTEOF lt_cl_silent=false exec AS_MESSAGE_LOG_FD>>config.log { echo AS_BOX([Running $as_me.]) } >&AS_MESSAGE_LOG_FD lt_cl_help="\ '$as_me' creates a local libtool stub from the current configuration, for use in further configure time tests before the real libtool is generated. Usage: $[0] [[OPTIONS]] -h, --help print this help, then exit -V, --version print version number, then exit -q, --quiet do not print progress messages -d, --debug don't remove temporary files Report bugs to ." lt_cl_version="\ m4_ifset([AC_PACKAGE_NAME], [AC_PACKAGE_NAME ])config.lt[]dnl m4_ifset([AC_PACKAGE_VERSION], [ AC_PACKAGE_VERSION]) configured by $[0], generated by m4_PACKAGE_STRING. Copyright (C) 2011 Free Software Foundation, Inc. This config.lt script is free software; the Free Software Foundation gives unlimited permision to copy, distribute and modify it." while test 0 != $[#] do case $[1] in --version | --v* | -V ) echo "$lt_cl_version"; exit 0 ;; --help | --h* | -h ) echo "$lt_cl_help"; exit 0 ;; --debug | --d* | -d ) debug=: ;; --quiet | --q* | --silent | --s* | -q ) lt_cl_silent=: ;; -*) AC_MSG_ERROR([unrecognized option: $[1] Try '$[0] --help' for more information.]) ;; *) AC_MSG_ERROR([unrecognized argument: $[1] Try '$[0] --help' for more information.]) ;; esac shift done if $lt_cl_silent; then exec AS_MESSAGE_FD>/dev/null fi _LTEOF cat >>"$CONFIG_LT" <<_LTEOF _LT_OUTPUT_LIBTOOL_COMMANDS_INIT _LTEOF cat >>"$CONFIG_LT" <<\_LTEOF AC_MSG_NOTICE([creating $ofile]) _LT_OUTPUT_LIBTOOL_COMMANDS AS_EXIT(0) _LTEOF chmod +x "$CONFIG_LT" # configure is writing to config.log, but config.lt does its own redirection, # appending to config.log, which fails on DOS, as config.log is still kept # open by configure. Here we exec the FD to /dev/null, effectively closing # config.log, so it can be properly (re)opened and appended to by config.lt. lt_cl_success=: test yes = "$silent" && lt_config_lt_args="$lt_config_lt_args --quiet" exec AS_MESSAGE_LOG_FD>/dev/null $SHELL "$CONFIG_LT" $lt_config_lt_args || lt_cl_success=false exec AS_MESSAGE_LOG_FD>>config.log $lt_cl_success || AS_EXIT(1) ])# LT_OUTPUT # _LT_CONFIG(TAG) # --------------- # If TAG is the built-in tag, create an initial libtool script with a # default configuration from the untagged config vars. Otherwise add code # to config.status for appending the configuration named by TAG from the # matching tagged config vars. m4_defun([_LT_CONFIG], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl _LT_CONFIG_SAVE_COMMANDS([ m4_define([_LT_TAG], m4_if([$1], [], [C], [$1]))dnl m4_if(_LT_TAG, [C], [ # See if we are running on zsh, and set the options that allow our # commands through without removal of \ escapes. if test -n "${ZSH_VERSION+set}"; then setopt NO_GLOB_SUBST fi cfgfile=${ofile}T trap "$RM \"$cfgfile\"; exit 1" 1 2 15 $RM "$cfgfile" cat <<_LT_EOF >> "$cfgfile" #! $SHELL # Generated automatically by $as_me ($PACKAGE) $VERSION # NOTE: Changes made to this file will be lost: look at ltmain.sh. # Provide generalized library-building support services. # Written by Gordon Matzigkeit, 1996 _LT_COPYING _LT_LIBTOOL_TAGS # Configured defaults for sys_lib_dlsearch_path munging. : \${LT_SYS_LIBRARY_PATH="$configure_time_lt_sys_library_path"} # ### BEGIN LIBTOOL CONFIG _LT_LIBTOOL_CONFIG_VARS _LT_LIBTOOL_TAG_VARS # ### END LIBTOOL CONFIG _LT_EOF cat <<'_LT_EOF' >> "$cfgfile" # ### BEGIN FUNCTIONS SHARED WITH CONFIGURE _LT_PREPARE_MUNGE_PATH_LIST _LT_PREPARE_CC_BASENAME # ### END FUNCTIONS SHARED WITH CONFIGURE _LT_EOF case $host_os in aix3*) cat <<\_LT_EOF >> "$cfgfile" # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test set != "${COLLECT_NAMES+set}"; then COLLECT_NAMES= export COLLECT_NAMES fi _LT_EOF ;; esac _LT_PROG_LTMAIN # We use sed instead of cat because bash on DJGPP gets confused if # if finds mixed CR/LF and LF-only lines. Since sed operates in # text mode, it properly converts lines to CR/LF. This bash problem # is reportedly fixed, but why not run on old versions too? sed '$q' "$ltmain" >> "$cfgfile" \ || (rm -f "$cfgfile"; exit 1) mv -f "$cfgfile" "$ofile" || (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") chmod +x "$ofile" ], [cat <<_LT_EOF >> "$ofile" dnl Unfortunately we have to use $1 here, since _LT_TAG is not expanded dnl in a comment (ie after a #). # ### BEGIN LIBTOOL TAG CONFIG: $1 _LT_LIBTOOL_TAG_VARS(_LT_TAG) # ### END LIBTOOL TAG CONFIG: $1 _LT_EOF ])dnl /m4_if ], [m4_if([$1], [], [ PACKAGE='$PACKAGE' VERSION='$VERSION' RM='$RM' ofile='$ofile'], []) ])dnl /_LT_CONFIG_SAVE_COMMANDS ])# _LT_CONFIG # LT_SUPPORTED_TAG(TAG) # --------------------- # Trace this macro to discover what tags are supported by the libtool # --tag option, using: # autoconf --trace 'LT_SUPPORTED_TAG:$1' AC_DEFUN([LT_SUPPORTED_TAG], []) # C support is built-in for now m4_define([_LT_LANG_C_enabled], []) m4_define([_LT_TAGS], []) # LT_LANG(LANG) # ------------- # Enable libtool support for the given language if not already enabled. AC_DEFUN([LT_LANG], [AC_BEFORE([$0], [LT_OUTPUT])dnl m4_case([$1], [C], [_LT_LANG(C)], [C++], [_LT_LANG(CXX)], [Go], [_LT_LANG(GO)], [Java], [_LT_LANG(GCJ)], [Fortran 77], [_LT_LANG(F77)], [Fortran], [_LT_LANG(FC)], [Windows Resource], [_LT_LANG(RC)], [m4_ifdef([_LT_LANG_]$1[_CONFIG], [_LT_LANG($1)], [m4_fatal([$0: unsupported language: "$1"])])])dnl ])# LT_LANG # _LT_LANG(LANGNAME) # ------------------ m4_defun([_LT_LANG], [m4_ifdef([_LT_LANG_]$1[_enabled], [], [LT_SUPPORTED_TAG([$1])dnl m4_append([_LT_TAGS], [$1 ])dnl m4_define([_LT_LANG_]$1[_enabled], [])dnl _LT_LANG_$1_CONFIG($1)])dnl ])# _LT_LANG m4_ifndef([AC_PROG_GO], [ ############################################################ # NOTE: This macro has been submitted for inclusion into # # GNU Autoconf as AC_PROG_GO. When it is available in # # a released version of Autoconf we should remove this # # macro and use it instead. # ############################################################ m4_defun([AC_PROG_GO], [AC_LANG_PUSH(Go)dnl AC_ARG_VAR([GOC], [Go compiler command])dnl AC_ARG_VAR([GOFLAGS], [Go compiler flags])dnl _AC_ARG_VAR_LDFLAGS()dnl AC_CHECK_TOOL(GOC, gccgo) if test -z "$GOC"; then if test -n "$ac_tool_prefix"; then AC_CHECK_PROG(GOC, [${ac_tool_prefix}gccgo], [${ac_tool_prefix}gccgo]) fi fi if test -z "$GOC"; then AC_CHECK_PROG(GOC, gccgo, gccgo, false) fi ])#m4_defun ])#m4_ifndef # _LT_LANG_DEFAULT_CONFIG # ----------------------- m4_defun([_LT_LANG_DEFAULT_CONFIG], [AC_PROVIDE_IFELSE([AC_PROG_CXX], [LT_LANG(CXX)], [m4_define([AC_PROG_CXX], defn([AC_PROG_CXX])[LT_LANG(CXX)])]) AC_PROVIDE_IFELSE([AC_PROG_F77], [LT_LANG(F77)], [m4_define([AC_PROG_F77], defn([AC_PROG_F77])[LT_LANG(F77)])]) AC_PROVIDE_IFELSE([AC_PROG_FC], [LT_LANG(FC)], [m4_define([AC_PROG_FC], defn([AC_PROG_FC])[LT_LANG(FC)])]) dnl The call to [A][M_PROG_GCJ] is quoted like that to stop aclocal dnl pulling things in needlessly. AC_PROVIDE_IFELSE([AC_PROG_GCJ], [LT_LANG(GCJ)], [AC_PROVIDE_IFELSE([A][M_PROG_GCJ], [LT_LANG(GCJ)], [AC_PROVIDE_IFELSE([LT_PROG_GCJ], [LT_LANG(GCJ)], [m4_ifdef([AC_PROG_GCJ], [m4_define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[LT_LANG(GCJ)])]) m4_ifdef([A][M_PROG_GCJ], [m4_define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[LT_LANG(GCJ)])]) m4_ifdef([LT_PROG_GCJ], [m4_define([LT_PROG_GCJ], defn([LT_PROG_GCJ])[LT_LANG(GCJ)])])])])]) AC_PROVIDE_IFELSE([AC_PROG_GO], [LT_LANG(GO)], [m4_define([AC_PROG_GO], defn([AC_PROG_GO])[LT_LANG(GO)])]) AC_PROVIDE_IFELSE([LT_PROG_RC], [LT_LANG(RC)], [m4_define([LT_PROG_RC], defn([LT_PROG_RC])[LT_LANG(RC)])]) ])# _LT_LANG_DEFAULT_CONFIG # Obsolete macros: AU_DEFUN([AC_LIBTOOL_CXX], [LT_LANG(C++)]) AU_DEFUN([AC_LIBTOOL_F77], [LT_LANG(Fortran 77)]) AU_DEFUN([AC_LIBTOOL_FC], [LT_LANG(Fortran)]) AU_DEFUN([AC_LIBTOOL_GCJ], [LT_LANG(Java)]) AU_DEFUN([AC_LIBTOOL_RC], [LT_LANG(Windows Resource)]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_CXX], []) dnl AC_DEFUN([AC_LIBTOOL_F77], []) dnl AC_DEFUN([AC_LIBTOOL_FC], []) dnl AC_DEFUN([AC_LIBTOOL_GCJ], []) dnl AC_DEFUN([AC_LIBTOOL_RC], []) # _LT_TAG_COMPILER # ---------------- m4_defun([_LT_TAG_COMPILER], [AC_REQUIRE([AC_PROG_CC])dnl _LT_DECL([LTCC], [CC], [1], [A C compiler])dnl _LT_DECL([LTCFLAGS], [CFLAGS], [1], [LTCC compiler flags])dnl _LT_TAGDECL([CC], [compiler], [1], [A language specific compiler])dnl _LT_TAGDECL([with_gcc], [GCC], [0], [Is the compiler the GNU compiler?])dnl # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC ])# _LT_TAG_COMPILER # _LT_COMPILER_BOILERPLATE # ------------------------ # Check for compiler boilerplate output or warnings with # the simple compiler test code. m4_defun([_LT_COMPILER_BOILERPLATE], [m4_require([_LT_DECL_SED])dnl ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" >conftest.$ac_ext eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_compiler_boilerplate=`cat conftest.err` $RM conftest* ])# _LT_COMPILER_BOILERPLATE # _LT_LINKER_BOILERPLATE # ---------------------- # Check for linker boilerplate output or warnings with # the simple link test code. m4_defun([_LT_LINKER_BOILERPLATE], [m4_require([_LT_DECL_SED])dnl ac_outfile=conftest.$ac_objext echo "$lt_simple_link_test_code" >conftest.$ac_ext eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_linker_boilerplate=`cat conftest.err` $RM -r conftest* ])# _LT_LINKER_BOILERPLATE # _LT_REQUIRED_DARWIN_CHECKS # ------------------------- m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[ case $host_os in rhapsody* | darwin*) AC_CHECK_TOOL([DSYMUTIL], [dsymutil], [:]) AC_CHECK_TOOL([NMEDIT], [nmedit], [:]) AC_CHECK_TOOL([LIPO], [lipo], [:]) AC_CHECK_TOOL([OTOOL], [otool], [:]) AC_CHECK_TOOL([OTOOL64], [otool64], [:]) _LT_DECL([], [DSYMUTIL], [1], [Tool to manipulate archived DWARF debug symbol files on Mac OS X]) _LT_DECL([], [NMEDIT], [1], [Tool to change global to local symbols on Mac OS X]) _LT_DECL([], [LIPO], [1], [Tool to manipulate fat objects and archives on Mac OS X]) _LT_DECL([], [OTOOL], [1], [ldd/readelf like tool for Mach-O binaries on Mac OS X]) _LT_DECL([], [OTOOL64], [1], [ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4]) AC_CACHE_CHECK([for -single_module linker flag],[lt_cv_apple_cc_single_mod], [lt_cv_apple_cc_single_mod=no if test -z "$LT_MULTI_MODULE"; then # By default we will add the -single_module flag. You can override # by either setting the environment variable LT_MULTI_MODULE # non-empty at configure time, or by adding -multi_module to the # link flags. rm -rf libconftest.dylib* echo "int foo(void){return 1;}" > conftest.c echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c" >&AS_MESSAGE_LOG_FD $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c 2>conftest.err _lt_result=$? # If there is a non-empty error log, and "single_module" # appears in it, assume the flag caused a linker warning if test -s conftest.err && $GREP single_module conftest.err; then cat conftest.err >&AS_MESSAGE_LOG_FD # Otherwise, if the output was created with a 0 exit code from # the compiler, it worked. elif test -f libconftest.dylib && test 0 = "$_lt_result"; then lt_cv_apple_cc_single_mod=yes else cat conftest.err >&AS_MESSAGE_LOG_FD fi rm -rf libconftest.dylib* rm -f conftest.* fi]) AC_CACHE_CHECK([for -exported_symbols_list linker flag], [lt_cv_ld_exported_symbols_list], [lt_cv_ld_exported_symbols_list=no save_LDFLAGS=$LDFLAGS echo "_main" > conftest.sym LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], [lt_cv_ld_exported_symbols_list=yes], [lt_cv_ld_exported_symbols_list=no]) LDFLAGS=$save_LDFLAGS ]) AC_CACHE_CHECK([for -force_load linker flag],[lt_cv_ld_force_load], [lt_cv_ld_force_load=no cat > conftest.c << _LT_EOF int forced_loaded() { return 2;} _LT_EOF echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&AS_MESSAGE_LOG_FD $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&AS_MESSAGE_LOG_FD echo "$AR cr libconftest.a conftest.o" >&AS_MESSAGE_LOG_FD $AR cr libconftest.a conftest.o 2>&AS_MESSAGE_LOG_FD echo "$RANLIB libconftest.a" >&AS_MESSAGE_LOG_FD $RANLIB libconftest.a 2>&AS_MESSAGE_LOG_FD cat > conftest.c << _LT_EOF int main() { return 0;} _LT_EOF echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&AS_MESSAGE_LOG_FD $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err _lt_result=$? if test -s conftest.err && $GREP force_load conftest.err; then cat conftest.err >&AS_MESSAGE_LOG_FD elif test -f conftest && test 0 = "$_lt_result" && $GREP forced_load conftest >/dev/null 2>&1; then lt_cv_ld_force_load=yes else cat conftest.err >&AS_MESSAGE_LOG_FD fi rm -f conftest.err libconftest.a conftest conftest.c rm -rf conftest.dSYM ]) case $host_os in rhapsody* | darwin1.[[012]]) _lt_dar_allow_undefined='$wl-undefined ${wl}suppress' ;; darwin1.*) _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;; darwin*) # darwin 5.x on # if running on 10.5 or later, the deployment target defaults # to the OS version, if on x86, and 10.4, the deployment # target defaults to 10.4. Don't you love it? case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in 10.0,*86*-darwin8*|10.0,*-darwin[[91]]*) _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;; 10.[[012]][[,.]]*) _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;; 10.*) _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;; esac ;; esac if test yes = "$lt_cv_apple_cc_single_mod"; then _lt_dar_single_mod='$single_module' fi if test yes = "$lt_cv_ld_exported_symbols_list"; then _lt_dar_export_syms=' $wl-exported_symbols_list,$output_objdir/$libname-symbols.expsym' else _lt_dar_export_syms='~$NMEDIT -s $output_objdir/$libname-symbols.expsym $lib' fi if test : != "$DSYMUTIL" && test no = "$lt_cv_ld_force_load"; then _lt_dsymutil='~$DSYMUTIL $lib || :' else _lt_dsymutil= fi ;; esac ]) # _LT_DARWIN_LINKER_FEATURES([TAG]) # --------------------------------- # Checks for linker and compiler features on darwin m4_defun([_LT_DARWIN_LINKER_FEATURES], [ m4_require([_LT_REQUIRED_DARWIN_CHECKS]) _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_automatic, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported if test yes = "$lt_cv_ld_force_load"; then _LT_TAGVAR(whole_archive_flag_spec, $1)='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience $wl-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' m4_case([$1], [F77], [_LT_TAGVAR(compiler_needs_object, $1)=yes], [FC], [_LT_TAGVAR(compiler_needs_object, $1)=yes]) else _LT_TAGVAR(whole_archive_flag_spec, $1)='' fi _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(allow_undefined_flag, $1)=$_lt_dar_allow_undefined case $cc_basename in ifort*|nagfor*) _lt_dar_can_shared=yes ;; *) _lt_dar_can_shared=$GCC ;; esac if test yes = "$_lt_dar_can_shared"; then output_verbose_link_cmd=func_echo_all _LT_TAGVAR(archive_cmds, $1)="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dsymutil" _LT_TAGVAR(module_cmds, $1)="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dsymutil" _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dar_export_syms$_lt_dsymutil" _LT_TAGVAR(module_expsym_cmds, $1)="sed -e 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dar_export_syms$_lt_dsymutil" m4_if([$1], [CXX], [ if test yes != "$lt_cv_apple_cc_single_mod"; then _LT_TAGVAR(archive_cmds, $1)="\$CC -r -keep_private_externs -nostdlib -o \$lib-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$lib-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring$_lt_dsymutil" _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \$lib-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$lib-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring$_lt_dar_export_syms$_lt_dsymutil" fi ],[]) else _LT_TAGVAR(ld_shlibs, $1)=no fi ]) # _LT_SYS_MODULE_PATH_AIX([TAGNAME]) # ---------------------------------- # Links a minimal program and checks the executable # for the system default hardcoded library path. In most cases, # this is /usr/lib:/lib, but when the MPI compilers are used # the location of the communication and MPI libs are included too. # If we don't find anything, use the default library path according # to the aix ld manual. # Store the results from the different compilers for each TAGNAME. # Allow to override them for all tags through lt_cv_aix_libpath. m4_defun([_LT_SYS_MODULE_PATH_AIX], [m4_require([_LT_DECL_SED])dnl if test set = "${lt_cv_aix_libpath+set}"; then aix_libpath=$lt_cv_aix_libpath else AC_CACHE_VAL([_LT_TAGVAR([lt_cv_aix_libpath_], [$1])], [AC_LINK_IFELSE([AC_LANG_PROGRAM],[ lt_aix_libpath_sed='[ /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }]' _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi],[]) if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=/usr/lib:/lib fi ]) aix_libpath=$_LT_TAGVAR([lt_cv_aix_libpath_], [$1]) fi ])# _LT_SYS_MODULE_PATH_AIX # _LT_SHELL_INIT(ARG) # ------------------- m4_define([_LT_SHELL_INIT], [m4_divert_text([M4SH-INIT], [$1 ])])# _LT_SHELL_INIT # _LT_PROG_ECHO_BACKSLASH # ----------------------- # Find how we can fake an echo command that does not interpret backslash. # In particular, with Autoconf 2.60 or later we add some code to the start # of the generated configure script that will find a shell with a builtin # printf (that we can use as an echo command). m4_defun([_LT_PROG_ECHO_BACKSLASH], [ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO AC_MSG_CHECKING([how to print strings]) # Test print first, because it will be a builtin if present. if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then ECHO='print -r --' elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then ECHO='printf %s\n' else # Use this function as a fallback that always works. func_fallback_echo () { eval 'cat <<_LTECHO_EOF $[]1 _LTECHO_EOF' } ECHO='func_fallback_echo' fi # func_echo_all arg... # Invoke $ECHO with all args, space-separated. func_echo_all () { $ECHO "$*" } case $ECHO in printf*) AC_MSG_RESULT([printf]) ;; print*) AC_MSG_RESULT([print -r]) ;; *) AC_MSG_RESULT([cat]) ;; esac m4_ifdef([_AS_DETECT_SUGGESTED], [_AS_DETECT_SUGGESTED([ test -n "${ZSH_VERSION+set}${BASH_VERSION+set}" || ( ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO PATH=/empty FPATH=/empty; export PATH FPATH test "X`printf %s $ECHO`" = "X$ECHO" \ || test "X`print -r -- $ECHO`" = "X$ECHO" )])]) _LT_DECL([], [SHELL], [1], [Shell to use when invoking shell scripts]) _LT_DECL([], [ECHO], [1], [An echo program that protects backslashes]) ])# _LT_PROG_ECHO_BACKSLASH # _LT_WITH_SYSROOT # ---------------- AC_DEFUN([_LT_WITH_SYSROOT], [AC_MSG_CHECKING([for sysroot]) AC_ARG_WITH([sysroot], [AS_HELP_STRING([--with-sysroot@<:@=DIR@:>@], [Search for dependent libraries within DIR (or the compiler's sysroot if not specified).])], [], [with_sysroot=no]) dnl lt_sysroot will always be passed unquoted. We quote it here dnl in case the user passed a directory name. lt_sysroot= case $with_sysroot in #( yes) if test yes = "$GCC"; then lt_sysroot=`$CC --print-sysroot 2>/dev/null` fi ;; #( /*) lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"` ;; #( no|'') ;; #( *) AC_MSG_RESULT([$with_sysroot]) AC_MSG_ERROR([The sysroot must be an absolute path.]) ;; esac AC_MSG_RESULT([${lt_sysroot:-no}]) _LT_DECL([], [lt_sysroot], [0], [The root where to search for ]dnl [dependent libraries, and where our libraries should be installed.])]) # _LT_ENABLE_LOCK # --------------- m4_defun([_LT_ENABLE_LOCK], [AC_ARG_ENABLE([libtool-lock], [AS_HELP_STRING([--disable-libtool-lock], [avoid locking (might break parallel builds)])]) test no = "$enable_libtool_lock" || enable_libtool_lock=yes # Some flags need to be propagated to the compiler or linker for good # libtool support. case $host in ia64-*-hpux*) # Find out what ABI is being produced by ac_compile, and set mode # options accordingly. echo 'int i;' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then case `/usr/bin/file conftest.$ac_objext` in *ELF-32*) HPUX_IA64_MODE=32 ;; *ELF-64*) HPUX_IA64_MODE=64 ;; esac fi rm -rf conftest* ;; *-*-irix6*) # Find out what ABI is being produced by ac_compile, and set linker # options accordingly. echo '[#]line '$LINENO' "configure"' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then if test yes = "$lt_cv_prog_gnu_ld"; then case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -melf32bsmip" ;; *N32*) LD="${LD-ld} -melf32bmipn32" ;; *64-bit*) LD="${LD-ld} -melf64bmip" ;; esac else case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -32" ;; *N32*) LD="${LD-ld} -n32" ;; *64-bit*) LD="${LD-ld} -64" ;; esac fi fi rm -rf conftest* ;; mips64*-*linux*) # Find out what ABI is being produced by ac_compile, and set linker # options accordingly. echo '[#]line '$LINENO' "configure"' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then emul=elf case `/usr/bin/file conftest.$ac_objext` in *32-bit*) emul="${emul}32" ;; *64-bit*) emul="${emul}64" ;; esac case `/usr/bin/file conftest.$ac_objext` in *MSB*) emul="${emul}btsmip" ;; *LSB*) emul="${emul}ltsmip" ;; esac case `/usr/bin/file conftest.$ac_objext` in *N32*) emul="${emul}n32" ;; esac LD="${LD-ld} -m $emul" fi rm -rf conftest* ;; x86_64-*kfreebsd*-gnu|x86_64-*linux*|powerpc*-*linux*| \ s390*-*linux*|s390*-*tpf*|sparc*-*linux*) # Find out what ABI is being produced by ac_compile, and set linker # options accordingly. Note that the listed cases only cover the # situations where additional linker options are needed (such as when # doing 32-bit compilation for a host where ld defaults to 64-bit, or # vice versa); the common cases where no linker options are needed do # not appear in the list. echo 'int i;' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then case `/usr/bin/file conftest.o` in *32-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_i386_fbsd" ;; x86_64-*linux*) case `/usr/bin/file conftest.o` in *x86-64*) LD="${LD-ld} -m elf32_x86_64" ;; *) LD="${LD-ld} -m elf_i386" ;; esac ;; powerpc64le-*linux*) LD="${LD-ld} -m elf32lppclinux" ;; powerpc64-*linux*) LD="${LD-ld} -m elf32ppclinux" ;; s390x-*linux*) LD="${LD-ld} -m elf_s390" ;; sparc64-*linux*) LD="${LD-ld} -m elf32_sparc" ;; esac ;; *64-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_x86_64_fbsd" ;; x86_64-*linux*) LD="${LD-ld} -m elf_x86_64" ;; powerpcle-*linux*) LD="${LD-ld} -m elf64lppc" ;; powerpc-*linux*) LD="${LD-ld} -m elf64ppc" ;; s390*-*linux*|s390*-*tpf*) LD="${LD-ld} -m elf64_s390" ;; sparc*-*linux*) LD="${LD-ld} -m elf64_sparc" ;; esac ;; esac fi rm -rf conftest* ;; *-*-sco3.2v5*) # On SCO OpenServer 5, we need -belf to get full-featured binaries. SAVE_CFLAGS=$CFLAGS CFLAGS="$CFLAGS -belf" AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf, [AC_LANG_PUSH(C) AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],[[]])],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no]) AC_LANG_POP]) if test yes != "$lt_cv_cc_needs_belf"; then # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf CFLAGS=$SAVE_CFLAGS fi ;; *-*solaris*) # Find out what ABI is being produced by ac_compile, and set linker # options accordingly. echo 'int i;' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then case `/usr/bin/file conftest.o` in *64-bit*) case $lt_cv_prog_gnu_ld in yes*) case $host in i?86-*-solaris*|x86_64-*-solaris*) LD="${LD-ld} -m elf_x86_64" ;; sparc*-*-solaris*) LD="${LD-ld} -m elf64_sparc" ;; esac # GNU ld 2.21 introduced _sol2 emulations. Use them if available. if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then LD=${LD-ld}_sol2 fi ;; *) if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then LD="${LD-ld} -64" fi ;; esac ;; esac fi rm -rf conftest* ;; esac need_locks=$enable_libtool_lock ])# _LT_ENABLE_LOCK # _LT_PROG_AR # ----------- m4_defun([_LT_PROG_AR], [AC_CHECK_TOOLS(AR, [ar], false) : ${AR=ar} : ${AR_FLAGS=cr} _LT_DECL([], [AR], [1], [The archiver]) _LT_DECL([], [AR_FLAGS], [1], [Flags to create an archive]) AC_CACHE_CHECK([for archiver @FILE support], [lt_cv_ar_at_file], [lt_cv_ar_at_file=no AC_COMPILE_IFELSE([AC_LANG_PROGRAM], [echo conftest.$ac_objext > conftest.lst lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&AS_MESSAGE_LOG_FD' AC_TRY_EVAL([lt_ar_try]) if test 0 -eq "$ac_status"; then # Ensure the archiver fails upon bogus file names. rm -f conftest.$ac_objext libconftest.a AC_TRY_EVAL([lt_ar_try]) if test 0 -ne "$ac_status"; then lt_cv_ar_at_file=@ fi fi rm -f conftest.* libconftest.a ]) ]) if test no = "$lt_cv_ar_at_file"; then archiver_list_spec= else archiver_list_spec=$lt_cv_ar_at_file fi _LT_DECL([], [archiver_list_spec], [1], [How to feed a file listing to the archiver]) ])# _LT_PROG_AR # _LT_CMD_OLD_ARCHIVE # ------------------- m4_defun([_LT_CMD_OLD_ARCHIVE], [_LT_PROG_AR AC_CHECK_TOOL(STRIP, strip, :) test -z "$STRIP" && STRIP=: _LT_DECL([], [STRIP], [1], [A symbol stripping program]) AC_CHECK_TOOL(RANLIB, ranlib, :) test -z "$RANLIB" && RANLIB=: _LT_DECL([], [RANLIB], [1], [Commands used to install an old-style archive]) # Determine commands to create old-style static archives. old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' old_postinstall_cmds='chmod 644 $oldlib' old_postuninstall_cmds= if test -n "$RANLIB"; then case $host_os in bitrig* | openbsd*) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib" ;; *) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib" ;; esac old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib" fi case $host_os in darwin*) lock_old_archive_extraction=yes ;; *) lock_old_archive_extraction=no ;; esac _LT_DECL([], [old_postinstall_cmds], [2]) _LT_DECL([], [old_postuninstall_cmds], [2]) _LT_TAGDECL([], [old_archive_cmds], [2], [Commands used to build an old-style archive]) _LT_DECL([], [lock_old_archive_extraction], [0], [Whether to use a lock for old archive extraction]) ])# _LT_CMD_OLD_ARCHIVE # _LT_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, # [OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE]) # ---------------------------------------------------------------- # Check whether the given compiler option works AC_DEFUN([_LT_COMPILER_OPTION], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_SED])dnl AC_CACHE_CHECK([$1], [$2], [$2=no m4_if([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4]) echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$3" ## exclude from sc_useless_quotes_in_assignment # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&AS_MESSAGE_LOG_FD echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then $2=yes fi fi $RM conftest* ]) if test yes = "[$]$2"; then m4_if([$5], , :, [$5]) else m4_if([$6], , :, [$6]) fi ])# _LT_COMPILER_OPTION # Old name: AU_ALIAS([AC_LIBTOOL_COMPILER_OPTION], [_LT_COMPILER_OPTION]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION], []) # _LT_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, # [ACTION-SUCCESS], [ACTION-FAILURE]) # ---------------------------------------------------- # Check whether the given linker option works AC_DEFUN([_LT_LINKER_OPTION], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_SED])dnl AC_CACHE_CHECK([$1], [$2], [$2=no save_LDFLAGS=$LDFLAGS LDFLAGS="$LDFLAGS $3" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&AS_MESSAGE_LOG_FD $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then $2=yes fi else $2=yes fi fi $RM -r conftest* LDFLAGS=$save_LDFLAGS ]) if test yes = "[$]$2"; then m4_if([$4], , :, [$4]) else m4_if([$5], , :, [$5]) fi ])# _LT_LINKER_OPTION # Old name: AU_ALIAS([AC_LIBTOOL_LINKER_OPTION], [_LT_LINKER_OPTION]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], []) # LT_CMD_MAX_LEN #--------------- AC_DEFUN([LT_CMD_MAX_LEN], [AC_REQUIRE([AC_CANONICAL_HOST])dnl # find the maximum length of command line arguments AC_MSG_CHECKING([the maximum length of command line arguments]) AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl i=0 teststring=ABCD case $build_os in msdosdjgpp*) # On DJGPP, this test can blow up pretty badly due to problems in libc # (any single argument exceeding 2000 bytes causes a buffer overrun # during glob expansion). Even if it were fixed, the result of this # check would be larger than it should be. lt_cv_sys_max_cmd_len=12288; # 12K is about right ;; gnu*) # Under GNU Hurd, this test is not required because there is # no limit to the length of command line arguments. # Libtool will interpret -1 as no limit whatsoever lt_cv_sys_max_cmd_len=-1; ;; cygwin* | mingw* | cegcc*) # On Win9x/ME, this test blows up -- it succeeds, but takes # about 5 minutes as the teststring grows exponentially. # Worse, since 9x/ME are not pre-emptively multitasking, # you end up with a "frozen" computer, even though with patience # the test eventually succeeds (with a max line length of 256k). # Instead, let's just punt: use the minimum linelength reported by # all of the supported platforms: 8192 (on NT/2K/XP). lt_cv_sys_max_cmd_len=8192; ;; mint*) # On MiNT this can take a long time and run out of memory. lt_cv_sys_max_cmd_len=8192; ;; amigaos*) # On AmigaOS with pdksh, this test takes hours, literally. # So we just punt and use a minimum line length of 8192. lt_cv_sys_max_cmd_len=8192; ;; bitrig* | darwin* | dragonfly* | freebsd* | netbsd* | openbsd*) # This has been around since 386BSD, at least. Likely further. if test -x /sbin/sysctl; then lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` elif test -x /usr/sbin/sysctl; then lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` else lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs fi # And add a safety zone lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` ;; interix*) # We know the value 262144 and hardcode it with a safety zone (like BSD) lt_cv_sys_max_cmd_len=196608 ;; os2*) # The test takes a long time on OS/2. lt_cv_sys_max_cmd_len=8192 ;; osf*) # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not # nice to cause kernel panics so lets avoid the loop below. # First set a reasonable default. lt_cv_sys_max_cmd_len=16384 # if test -x /sbin/sysconfig; then case `/sbin/sysconfig -q proc exec_disable_arg_limit` in *1*) lt_cv_sys_max_cmd_len=-1 ;; esac fi ;; sco3.2v5*) lt_cv_sys_max_cmd_len=102400 ;; sysv5* | sco5v6* | sysv4.2uw2*) kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` if test -n "$kargmax"; then lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[[ ]]//'` else lt_cv_sys_max_cmd_len=32768 fi ;; *) lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` if test -n "$lt_cv_sys_max_cmd_len" && \ test undefined != "$lt_cv_sys_max_cmd_len"; then lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` else # Make teststring a little bigger before we do anything with it. # a 1K string should be a reasonable start. for i in 1 2 3 4 5 6 7 8; do teststring=$teststring$teststring done SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} # If test is not a shell built-in, we'll probably end up computing a # maximum length that is only half of the actual maximum length, but # we can't tell. while { test X`env echo "$teststring$teststring" 2>/dev/null` \ = "X$teststring$teststring"; } >/dev/null 2>&1 && test 17 != "$i" # 1/2 MB should be enough do i=`expr $i + 1` teststring=$teststring$teststring done # Only check the string length outside the loop. lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` teststring= # Add a significant safety factor because C++ compilers can tack on # massive amounts of additional arguments before passing them to the # linker. It appears as though 1/2 is a usable value. lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` fi ;; esac ]) if test -n "$lt_cv_sys_max_cmd_len"; then AC_MSG_RESULT($lt_cv_sys_max_cmd_len) else AC_MSG_RESULT(none) fi max_cmd_len=$lt_cv_sys_max_cmd_len _LT_DECL([], [max_cmd_len], [0], [What is the maximum length of a command?]) ])# LT_CMD_MAX_LEN # Old name: AU_ALIAS([AC_LIBTOOL_SYS_MAX_CMD_LEN], [LT_CMD_MAX_LEN]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], []) # _LT_HEADER_DLFCN # ---------------- m4_defun([_LT_HEADER_DLFCN], [AC_CHECK_HEADERS([dlfcn.h], [], [], [AC_INCLUDES_DEFAULT])dnl ])# _LT_HEADER_DLFCN # _LT_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE, # ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING) # ---------------------------------------------------------------- m4_defun([_LT_TRY_DLOPEN_SELF], [m4_require([_LT_HEADER_DLFCN])dnl if test yes = "$cross_compiling"; then : [$4] else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF [#line $LINENO "configure" #include "confdefs.h" #if HAVE_DLFCN_H #include #endif #include #ifdef RTLD_GLOBAL # define LT_DLGLOBAL RTLD_GLOBAL #else # ifdef DL_GLOBAL # define LT_DLGLOBAL DL_GLOBAL # else # define LT_DLGLOBAL 0 # endif #endif /* We may have to define LT_DLLAZY_OR_NOW in the command line if we find out it does not work in some platform. */ #ifndef LT_DLLAZY_OR_NOW # ifdef RTLD_LAZY # define LT_DLLAZY_OR_NOW RTLD_LAZY # else # ifdef DL_LAZY # define LT_DLLAZY_OR_NOW DL_LAZY # else # ifdef RTLD_NOW # define LT_DLLAZY_OR_NOW RTLD_NOW # else # ifdef DL_NOW # define LT_DLLAZY_OR_NOW DL_NOW # else # define LT_DLLAZY_OR_NOW 0 # endif # endif # endif # endif #endif /* When -fvisibility=hidden is used, assume the code has been annotated correspondingly for the symbols needed. */ #if defined __GNUC__ && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) int fnord () __attribute__((visibility("default"))); #endif int fnord () { return 42; } int main () { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); int status = $lt_dlunknown; if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; else { if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; else puts (dlerror ()); } /* dlclose (self); */ } else puts (dlerror ()); return status; }] _LT_EOF if AC_TRY_EVAL(ac_link) && test -s "conftest$ac_exeext" 2>/dev/null; then (./conftest; exit; ) >&AS_MESSAGE_LOG_FD 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) $1 ;; x$lt_dlneed_uscore) $2 ;; x$lt_dlunknown|x*) $3 ;; esac else : # compilation failed $3 fi fi rm -fr conftest* ])# _LT_TRY_DLOPEN_SELF # LT_SYS_DLOPEN_SELF # ------------------ AC_DEFUN([LT_SYS_DLOPEN_SELF], [m4_require([_LT_HEADER_DLFCN])dnl if test yes != "$enable_dlopen"; then enable_dlopen=unknown enable_dlopen_self=unknown enable_dlopen_self_static=unknown else lt_cv_dlopen=no lt_cv_dlopen_libs= case $host_os in beos*) lt_cv_dlopen=load_add_on lt_cv_dlopen_libs= lt_cv_dlopen_self=yes ;; mingw* | pw32* | cegcc*) lt_cv_dlopen=LoadLibrary lt_cv_dlopen_libs= ;; cygwin*) lt_cv_dlopen=dlopen lt_cv_dlopen_libs= ;; darwin*) # if libdl is installed we need to link against it AC_CHECK_LIB([dl], [dlopen], [lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl],[ lt_cv_dlopen=dyld lt_cv_dlopen_libs= lt_cv_dlopen_self=yes ]) ;; tpf*) # Don't try to run any link tests for TPF. We know it's impossible # because TPF is a cross-compiler, and we know how we open DSOs. lt_cv_dlopen=dlopen lt_cv_dlopen_libs= lt_cv_dlopen_self=no ;; *) AC_CHECK_FUNC([shl_load], [lt_cv_dlopen=shl_load], [AC_CHECK_LIB([dld], [shl_load], [lt_cv_dlopen=shl_load lt_cv_dlopen_libs=-ldld], [AC_CHECK_FUNC([dlopen], [lt_cv_dlopen=dlopen], [AC_CHECK_LIB([dl], [dlopen], [lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl], [AC_CHECK_LIB([svld], [dlopen], [lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-lsvld], [AC_CHECK_LIB([dld], [dld_link], [lt_cv_dlopen=dld_link lt_cv_dlopen_libs=-ldld]) ]) ]) ]) ]) ]) ;; esac if test no = "$lt_cv_dlopen"; then enable_dlopen=no else enable_dlopen=yes fi case $lt_cv_dlopen in dlopen) save_CPPFLAGS=$CPPFLAGS test yes = "$ac_cv_header_dlfcn_h" && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" save_LDFLAGS=$LDFLAGS wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" save_LIBS=$LIBS LIBS="$lt_cv_dlopen_libs $LIBS" AC_CACHE_CHECK([whether a program can dlopen itself], lt_cv_dlopen_self, [dnl _LT_TRY_DLOPEN_SELF( lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes, lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross) ]) if test yes = "$lt_cv_dlopen_self"; then wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" AC_CACHE_CHECK([whether a statically linked program can dlopen itself], lt_cv_dlopen_self_static, [dnl _LT_TRY_DLOPEN_SELF( lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=no, lt_cv_dlopen_self_static=cross) ]) fi CPPFLAGS=$save_CPPFLAGS LDFLAGS=$save_LDFLAGS LIBS=$save_LIBS ;; esac case $lt_cv_dlopen_self in yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; *) enable_dlopen_self=unknown ;; esac case $lt_cv_dlopen_self_static in yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; *) enable_dlopen_self_static=unknown ;; esac fi _LT_DECL([dlopen_support], [enable_dlopen], [0], [Whether dlopen is supported]) _LT_DECL([dlopen_self], [enable_dlopen_self], [0], [Whether dlopen of programs is supported]) _LT_DECL([dlopen_self_static], [enable_dlopen_self_static], [0], [Whether dlopen of statically linked programs is supported]) ])# LT_SYS_DLOPEN_SELF # Old name: AU_ALIAS([AC_LIBTOOL_DLOPEN_SELF], [LT_SYS_DLOPEN_SELF]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], []) # _LT_COMPILER_C_O([TAGNAME]) # --------------------------- # Check to see if options -c and -o are simultaneously supported by compiler. # This macro does not hard code the compiler like AC_PROG_CC_C_O. m4_defun([_LT_COMPILER_C_O], [m4_require([_LT_DECL_SED])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_TAG_COMPILER])dnl AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext], [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)], [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&AS_MESSAGE_LOG_FD echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes fi fi chmod u+w . 2>&AS_MESSAGE_LOG_FD $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* ]) _LT_TAGDECL([compiler_c_o], [lt_cv_prog_compiler_c_o], [1], [Does compiler simultaneously support -c and -o options?]) ])# _LT_COMPILER_C_O # _LT_COMPILER_FILE_LOCKS([TAGNAME]) # ---------------------------------- # Check to see if we can do hard links to lock some files if needed m4_defun([_LT_COMPILER_FILE_LOCKS], [m4_require([_LT_ENABLE_LOCK])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl _LT_COMPILER_C_O([$1]) hard_links=nottested if test no = "$_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)" && test no != "$need_locks"; then # do not overwrite the value of need_locks provided by the user AC_MSG_CHECKING([if we can lock with hard links]) hard_links=yes $RM conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no AC_MSG_RESULT([$hard_links]) if test no = "$hard_links"; then AC_MSG_WARN(['$CC' does not support '-c -o', so 'make -j' may be unsafe]) need_locks=warn fi else need_locks=no fi _LT_DECL([], [need_locks], [1], [Must we lock files when doing compilation?]) ])# _LT_COMPILER_FILE_LOCKS # _LT_CHECK_OBJDIR # ---------------- m4_defun([_LT_CHECK_OBJDIR], [AC_CACHE_CHECK([for objdir], [lt_cv_objdir], [rm -f .libs 2>/dev/null mkdir .libs 2>/dev/null if test -d .libs; then lt_cv_objdir=.libs else # MS-DOS does not allow filenames that begin with a dot. lt_cv_objdir=_libs fi rmdir .libs 2>/dev/null]) objdir=$lt_cv_objdir _LT_DECL([], [objdir], [0], [The name of the directory that contains temporary libtool files])dnl m4_pattern_allow([LT_OBJDIR])dnl AC_DEFINE_UNQUOTED([LT_OBJDIR], "$lt_cv_objdir/", [Define to the sub-directory where libtool stores uninstalled libraries.]) ])# _LT_CHECK_OBJDIR # _LT_LINKER_HARDCODE_LIBPATH([TAGNAME]) # -------------------------------------- # Check hardcoding attributes. m4_defun([_LT_LINKER_HARDCODE_LIBPATH], [AC_MSG_CHECKING([how to hardcode library paths into programs]) _LT_TAGVAR(hardcode_action, $1)= if test -n "$_LT_TAGVAR(hardcode_libdir_flag_spec, $1)" || test -n "$_LT_TAGVAR(runpath_var, $1)" || test yes = "$_LT_TAGVAR(hardcode_automatic, $1)"; then # We can hardcode non-existent directories. if test no != "$_LT_TAGVAR(hardcode_direct, $1)" && # If the only mechanism to avoid hardcoding is shlibpath_var, we # have to relink, otherwise we might link with an installed library # when we should be linking with a yet-to-be-installed one ## test no != "$_LT_TAGVAR(hardcode_shlibpath_var, $1)" && test no != "$_LT_TAGVAR(hardcode_minus_L, $1)"; then # Linking always hardcodes the temporary library directory. _LT_TAGVAR(hardcode_action, $1)=relink else # We can link without hardcoding, and we can hardcode nonexisting dirs. _LT_TAGVAR(hardcode_action, $1)=immediate fi else # We cannot hardcode anything, or else we can only hardcode existing # directories. _LT_TAGVAR(hardcode_action, $1)=unsupported fi AC_MSG_RESULT([$_LT_TAGVAR(hardcode_action, $1)]) if test relink = "$_LT_TAGVAR(hardcode_action, $1)" || test yes = "$_LT_TAGVAR(inherit_rpath, $1)"; then # Fast installation is not supported enable_fast_install=no elif test yes = "$shlibpath_overrides_runpath" || test no = "$enable_shared"; then # Fast installation is not necessary enable_fast_install=needless fi _LT_TAGDECL([], [hardcode_action], [0], [How to hardcode a shared library path into an executable]) ])# _LT_LINKER_HARDCODE_LIBPATH # _LT_CMD_STRIPLIB # ---------------- m4_defun([_LT_CMD_STRIPLIB], [m4_require([_LT_DECL_EGREP]) striplib= old_striplib= AC_MSG_CHECKING([whether stripping libraries is possible]) if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" test -z "$striplib" && striplib="$STRIP --strip-unneeded" AC_MSG_RESULT([yes]) else # FIXME - insert some real tests, host_os isn't really good enough case $host_os in darwin*) if test -n "$STRIP"; then striplib="$STRIP -x" old_striplib="$STRIP -S" AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) fi ;; *) AC_MSG_RESULT([no]) ;; esac fi _LT_DECL([], [old_striplib], [1], [Commands to strip libraries]) _LT_DECL([], [striplib], [1]) ])# _LT_CMD_STRIPLIB # _LT_PREPARE_MUNGE_PATH_LIST # --------------------------- # Make sure func_munge_path_list() is defined correctly. m4_defun([_LT_PREPARE_MUNGE_PATH_LIST], [[# func_munge_path_list VARIABLE PATH # ----------------------------------- # VARIABLE is name of variable containing _space_ separated list of # directories to be munged by the contents of PATH, which is string # having a format: # "DIR[:DIR]:" # string "DIR[ DIR]" will be prepended to VARIABLE # ":DIR[:DIR]" # string "DIR[ DIR]" will be appended to VARIABLE # "DIRP[:DIRP]::[DIRA:]DIRA" # string "DIRP[ DIRP]" will be prepended to VARIABLE and string # "DIRA[ DIRA]" will be appended to VARIABLE # "DIR[:DIR]" # VARIABLE will be replaced by "DIR[ DIR]" func_munge_path_list () { case x@S|@2 in x) ;; *:) eval @S|@1=\"`$ECHO @S|@2 | $SED 's/:/ /g'` \@S|@@S|@1\" ;; x:*) eval @S|@1=\"\@S|@@S|@1 `$ECHO @S|@2 | $SED 's/:/ /g'`\" ;; *::*) eval @S|@1=\"\@S|@@S|@1\ `$ECHO @S|@2 | $SED -e 's/.*:://' -e 's/:/ /g'`\" eval @S|@1=\"`$ECHO @S|@2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \@S|@@S|@1\" ;; *) eval @S|@1=\"`$ECHO @S|@2 | $SED 's/:/ /g'`\" ;; esac } ]])# _LT_PREPARE_PATH_LIST # _LT_SYS_DYNAMIC_LINKER([TAG]) # ----------------------------- # PORTME Fill in your ld.so characteristics m4_defun([_LT_SYS_DYNAMIC_LINKER], [AC_REQUIRE([AC_CANONICAL_HOST])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_OBJDUMP])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_CHECK_SHELL_FEATURES])dnl m4_require([_LT_PREPARE_MUNGE_PATH_LIST])dnl AC_MSG_CHECKING([dynamic linker characteristics]) m4_if([$1], [], [ if test yes = "$GCC"; then case $host_os in darwin*) lt_awk_arg='/^libraries:/,/LR/' ;; *) lt_awk_arg='/^libraries:/' ;; esac case $host_os in mingw* | cegcc*) lt_sed_strip_eq='s|=\([[A-Za-z]]:\)|\1|g' ;; *) lt_sed_strip_eq='s|=/|/|g' ;; esac lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` case $lt_search_path_spec in *\;*) # if the path contains ";" then we assume it to be the separator # otherwise default to the standard path separator (i.e. ":") - it is # assumed that no part of a normal pathname contains ";" but that should # okay in the real world where ";" in dirpaths is itself problematic. lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'` ;; *) lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"` ;; esac # Ok, now we have the path, separated by spaces, we can step through it # and add multilib dir if necessary... lt_tmp_lt_search_path_spec= lt_multi_os_dir=/`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` # ...but if some path component already ends with the multilib dir we assume # that all is fine and trust -print-search-dirs as is (GCC 4.2? or newer). case "$lt_multi_os_dir; $lt_search_path_spec " in "/; "* | "/.; "* | "/./; "* | *"$lt_multi_os_dir "* | *"$lt_multi_os_dir/ "*) lt_multi_os_dir= ;; esac for lt_sys_path in $lt_search_path_spec; do if test -d "$lt_sys_path$lt_multi_os_dir"; then lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path$lt_multi_os_dir" elif test -n "$lt_multi_os_dir"; then test -d "$lt_sys_path" && \ lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" fi done lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk ' BEGIN {RS = " "; FS = "/|\n";} { lt_foo = ""; lt_count = 0; for (lt_i = NF; lt_i > 0; lt_i--) { if ($lt_i != "" && $lt_i != ".") { if ($lt_i == "..") { lt_count++; } else { if (lt_count == 0) { lt_foo = "/" $lt_i lt_foo; } else { lt_count--; } } } } if (lt_foo != "") { lt_freq[[lt_foo]]++; } if (lt_freq[[lt_foo]] == 1) { print lt_foo; } }'` # AWK program above erroneously prepends '/' to C:/dos/paths # for these hosts. case $host_os in mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ $SED 's|/\([[A-Za-z]]:\)|\1|g'` ;; esac sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` else sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" fi]) library_names_spec= libname_spec='lib$name' soname_spec= shrext_cmds=.so postinstall_cmds= postuninstall_cmds= finish_cmds= finish_eval= shlibpath_var= shlibpath_overrides_runpath=unknown version_type=none dynamic_linker="$host_os ld.so" sys_lib_dlsearch_path_spec="/lib /usr/lib" need_lib_prefix=unknown hardcode_into_libs=no # when you set need_version to no, make sure it does not cause -set_version # flags to be left without arguments need_version=unknown AC_ARG_VAR([LT_SYS_LIBRARY_PATH], [User-defined run-time library search path.]) case $host_os in aix3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$release$shared_ext$versuffix $libname.a' shlibpath_var=LIBPATH # AIX 3 has no versioning support, so we append a major version to the name. soname_spec='$libname$release$shared_ext$major' ;; aix[[4-9]]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no hardcode_into_libs=yes if test ia64 = "$host_cpu"; then # AIX 5 supports IA64 library_names_spec='$libname$release$shared_ext$major $libname$release$shared_ext$versuffix $libname$shared_ext' shlibpath_var=LD_LIBRARY_PATH else # With GCC up to 2.95.x, collect2 would create an import file # for dependence libraries. The import file would start with # the line '#! .'. This would cause the generated library to # depend on '.', always an invalid library. This was fixed in # development snapshots of GCC prior to 3.0. case $host_os in aix4 | aix4.[[01]] | aix4.[[01]].*) if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' echo ' yes ' echo '#endif'; } | $CC -E - | $GREP yes > /dev/null; then : else can_build_shared=no fi ;; esac # Using Import Files as archive members, it is possible to support # filename-based versioning of shared library archives on AIX. While # this would work for both with and without runtime linking, it will # prevent static linking of such archives. So we do filename-based # shared library versioning with .so extension only, which is used # when both runtime linking and shared linking is enabled. # Unfortunately, runtime linking may impact performance, so we do # not want this to be the default eventually. Also, we use the # versioned .so libs for executables only if there is the -brtl # linker flag in LDFLAGS as well, or --with-aix-soname=svr4 only. # To allow for filename-based versioning support, we need to create # libNAME.so.V as an archive file, containing: # *) an Import File, referring to the versioned filename of the # archive as well as the shared archive member, telling the # bitwidth (32 or 64) of that shared object, and providing the # list of exported symbols of that shared object, eventually # decorated with the 'weak' keyword # *) the shared object with the F_LOADONLY flag set, to really avoid # it being seen by the linker. # At run time we better use the real file rather than another symlink, # but for link time we create the symlink libNAME.so -> libNAME.so.V case $with_aix_soname,$aix_use_runtimelinking in # AIX (on Power*) has no versioning support, so currently we cannot hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. aix,yes) # traditional libtool dynamic_linker='AIX unversionable lib.so' # If using run time linking (on AIX 4.2 or later) use lib.so # instead of lib.a to let people know that these are not # typical AIX shared libraries. library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' ;; aix,no) # traditional AIX only dynamic_linker='AIX lib.a[(]lib.so.V[)]' # We preserve .a as extension for shared libraries through AIX4.2 # and later when we are not doing run time linking. library_names_spec='$libname$release.a $libname.a' soname_spec='$libname$release$shared_ext$major' ;; svr4,*) # full svr4 only dynamic_linker="AIX lib.so.V[(]$shared_archive_member_spec.o[)]" library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' # We do not specify a path in Import Files, so LIBPATH fires. shlibpath_overrides_runpath=yes ;; *,yes) # both, prefer svr4 dynamic_linker="AIX lib.so.V[(]$shared_archive_member_spec.o[)], lib.a[(]lib.so.V[)]" library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' # unpreferred sharedlib libNAME.a needs extra handling postinstall_cmds='test -n "$linkname" || linkname="$realname"~func_stripname "" ".so" "$linkname"~$install_shared_prog "$dir/$func_stripname_result.$libext" "$destdir/$func_stripname_result.$libext"~test -z "$tstripme" || test -z "$striplib" || $striplib "$destdir/$func_stripname_result.$libext"' postuninstall_cmds='for n in $library_names $old_library; do :; done~func_stripname "" ".so" "$n"~test "$func_stripname_result" = "$n" || func_append rmfiles " $odir/$func_stripname_result.$libext"' # We do not specify a path in Import Files, so LIBPATH fires. shlibpath_overrides_runpath=yes ;; *,no) # both, prefer aix dynamic_linker="AIX lib.a[(]lib.so.V[)], lib.so.V[(]$shared_archive_member_spec.o[)]" library_names_spec='$libname$release.a $libname.a' soname_spec='$libname$release$shared_ext$major' # unpreferred sharedlib libNAME.so.V and symlink libNAME.so need extra handling postinstall_cmds='test -z "$dlname" || $install_shared_prog $dir/$dlname $destdir/$dlname~test -z "$tstripme" || test -z "$striplib" || $striplib $destdir/$dlname~test -n "$linkname" || linkname=$realname~func_stripname "" ".a" "$linkname"~(cd "$destdir" && $LN_S -f $dlname $func_stripname_result.so)' postuninstall_cmds='test -z "$dlname" || func_append rmfiles " $odir/$dlname"~for n in $old_library $library_names; do :; done~func_stripname "" ".a" "$n"~func_append rmfiles " $odir/$func_stripname_result.so"' ;; esac shlibpath_var=LIBPATH fi ;; amigaos*) case $host_cpu in powerpc) # Since July 2007 AmigaOS4 officially supports .so libraries. # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' ;; m68k) library_names_spec='$libname.ixlibrary $libname.a' # Create ${libname}_ixlibrary.a entries in /sys/libs. finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ;; esac ;; beos*) library_names_spec='$libname$shared_ext' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; bsdi[[45]]*) version_type=linux # correct to gnu/linux during the next big refactor need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" # the default ld.so.conf also contains /usr/contrib/lib and # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow # libtool to hard-code these into programs ;; cygwin* | mingw* | pw32* | cegcc*) version_type=windows shrext_cmds=.dll need_version=no need_lib_prefix=no case $GCC,$cc_basename in yes,*) # gcc library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \$file`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname~ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; fi' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes case $host_os in cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' soname_spec='`echo $libname | sed -e 's/^lib/cyg/'``echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext' m4_if([$1], [],[ sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api"]) ;; mingw* | cegcc*) # MinGW DLLs use traditional 'lib' prefix soname_spec='$libname`echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext' ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' library_names_spec='`echo $libname | sed -e 's/^lib/pw/'``echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext' ;; esac dynamic_linker='Win32 ld.exe' ;; *,cl*) # Native MSVC libname_spec='$name' soname_spec='$libname`echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext' library_names_spec='$libname.dll.lib' case $build_os in mingw*) sys_lib_search_path_spec= lt_save_ifs=$IFS IFS=';' for lt_path in $LIB do IFS=$lt_save_ifs # Let DOS variable expansion print the short 8.3 style file name. lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" done IFS=$lt_save_ifs # Convert to MSYS style. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([[a-zA-Z]]\\):| /\\1|g' -e 's|^ ||'` ;; cygwin*) # Convert to unix form, then to dos form, then back to unix form # but this time dos style (no spaces!) so that the unix form looks # like /cygdrive/c/PROGRA~1:/cygdr... sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` ;; *) sys_lib_search_path_spec=$LIB if $ECHO "$sys_lib_search_path_spec" | [$GREP ';[c-zC-Z]:/' >/dev/null]; then # It is most probably a Windows format PATH. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi # FIXME: find the short name or the path components, as spaces are # common. (e.g. "Program Files" -> "PROGRA~1") ;; esac # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \$file`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes dynamic_linker='Win32 link.exe' ;; *) # Assume MSVC wrapper library_names_spec='$libname`echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext $libname.lib' dynamic_linker='Win32 ld.exe' ;; esac # FIXME: first we should search . and the directory the executable is in shlibpath_var=PATH ;; darwin* | rhapsody*) dynamic_linker="$host_os dyld" version_type=darwin need_lib_prefix=no need_version=no library_names_spec='$libname$release$major$shared_ext $libname$shared_ext' soname_spec='$libname$release$major$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' m4_if([$1], [],[ sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"]) sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ;; dgux*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH ;; freebsd* | dragonfly*) # DragonFly does not have aout. When/if they implement a new # versioning mechanism, adjust this. if test -x /usr/bin/objformat; then objformat=`/usr/bin/objformat` else case $host_os in freebsd[[23]].*) objformat=aout ;; *) objformat=elf ;; esac fi version_type=freebsd-$objformat case $version_type in freebsd-elf*) library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' need_version=no need_lib_prefix=no ;; freebsd-*) library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' need_version=yes ;; esac shlibpath_var=LD_LIBRARY_PATH case $host_os in freebsd2.*) shlibpath_overrides_runpath=yes ;; freebsd3.[[01]]* | freebsdelf3.[[01]]*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; freebsd3.[[2-9]]* | freebsdelf3.[[2-9]]* | \ freebsd4.[[0-5]] | freebsdelf4.[[0-5]] | freebsd4.1.1 | freebsdelf4.1.1) shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; *) # from 4.6 on, and DragonFly shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; esac ;; haiku*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no dynamic_linker="$host_os runtime_loader" library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LIBRARY_PATH shlibpath_overrides_runpath=no sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' hardcode_into_libs=yes ;; hpux9* | hpux10* | hpux11*) # Give a soname corresponding to the major version so that dld.sl refuses to # link against other versions. version_type=sunos need_lib_prefix=no need_version=no case $host_cpu in ia64*) shrext_cmds='.so' hardcode_into_libs=yes dynamic_linker="$host_os dld.so" shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' if test 32 = "$HPUX_IA64_MODE"; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" sys_lib_dlsearch_path_spec=/usr/lib/hpux32 else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" sys_lib_dlsearch_path_spec=/usr/lib/hpux64 fi ;; hppa*64*) shrext_cmds='.sl' hardcode_into_libs=yes dynamic_linker="$host_os dld.sl" shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; *) shrext_cmds='.sl' dynamic_linker="$host_os dld.sl" shlibpath_var=SHLIB_PATH shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' ;; esac # HP-UX runs *really* slowly unless shared libraries are mode 555, ... postinstall_cmds='chmod 555 $lib' # or fails outright, so override atomically: install_override_mode=555 ;; interix[[3-9]]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; *) if test yes = "$lt_cv_prog_gnu_ld"; then version_type=linux # correct to gnu/linux during the next big refactor else version_type=irix fi ;; esac need_lib_prefix=no need_version=no soname_spec='$libname$release$shared_ext$major' library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$release$shared_ext $libname$shared_ext' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in # libtool.m4 will add one of these switches to LD *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= libmagic=32-bit;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 libmagic=64-bit;; *) libsuff= shlibsuff= libmagic=never-match;; esac ;; esac shlibpath_var=LD_LIBRARY${shlibsuff}_PATH shlibpath_overrides_runpath=no sys_lib_search_path_spec="/usr/lib$libsuff /lib$libsuff /usr/local/lib$libsuff" sys_lib_dlsearch_path_spec="/usr/lib$libsuff /lib$libsuff" hardcode_into_libs=yes ;; # No shared lib support for Linux oldld, aout, or coff. linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; linux*android*) version_type=none # Android doesn't support versioned libraries. need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext' soname_spec='$libname$release$shared_ext' finish_cmds= shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes dynamic_linker='Android linker' # Don't embed -rpath directories since the linker doesn't support them. _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no # Some binutils ld are patched to set DT_RUNPATH AC_CACHE_VAL([lt_cv_shlibpath_overrides_runpath], [lt_cv_shlibpath_overrides_runpath=no save_LDFLAGS=$LDFLAGS save_libdir=$libdir eval "libdir=/foo; wl=\"$_LT_TAGVAR(lt_prog_compiler_wl, $1)\"; \ LDFLAGS=\"\$LDFLAGS $_LT_TAGVAR(hardcode_libdir_flag_spec, $1)\"" AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], [AS_IF([ ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null], [lt_cv_shlibpath_overrides_runpath=yes])]) LDFLAGS=$save_LDFLAGS libdir=$save_libdir ]) shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes # Ideally, we could use ldconfig to report *all* directores which are # searched for libraries, however this is still not possible. Aside from not # being certain /sbin/ldconfig is available, command # 'ldconfig -N -X -v | grep ^/' on 64bit Fedora does not report /usr/lib64, # even though it is searched at run-time. Try to do the best guess by # appending ld.so.conf contents (and includes) to the search path. if test -f /etc/ld.so.conf; then lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \[$]2)); skip = 1; } { if (!skip) print \[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" fi # We used to test for /lib/ld.so.1 and disable shared libraries on # powerpc, because MkLinux only supported shared libraries with the # GNU dynamic linker. Since this was broken with cross compilers, # most powerpc-linux boxes support dynamic linking these days and # people can always --disable-shared, the test was removed, and we # assume the GNU/Linux dynamic linker is in use. dynamic_linker='GNU/Linux ld.so' ;; netbsdelf*-gnu) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='NetBSD ld.elf_so' ;; netbsd*) version_type=sunos need_lib_prefix=no need_version=no if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' dynamic_linker='NetBSD ld.elf_so' fi shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; newsos6) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; *nto* | *qnx*) version_type=qnx need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='ldqnx.so' ;; openbsd* | bitrig*) version_type=sunos sys_lib_dlsearch_path_spec=/usr/lib need_lib_prefix=no if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then need_version=no else need_version=yes fi library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; os2*) libname_spec='$name' version_type=windows shrext_cmds=.dll need_version=no need_lib_prefix=no # OS/2 can only load a DLL with a base name of 8 characters or less. soname_spec='`test -n "$os2dllname" && libname="$os2dllname"; v=$($ECHO $release$versuffix | tr -d .-); n=$($ECHO $libname | cut -b -$((8 - ${#v})) | tr . _); $ECHO $n$v`$shared_ext' library_names_spec='${libname}_dll.$libext' dynamic_linker='OS/2 ld.exe' shlibpath_var=BEGINLIBPATH sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec postinstall_cmds='base_file=`basename \$file`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; $ECHO \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname~ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; fi' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; $ECHO \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' ;; osf3* | osf4* | osf5*) version_type=osf need_lib_prefix=no need_version=no soname_spec='$libname$release$shared_ext$major' library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; rdos*) dynamic_linker=no ;; solaris*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes # ldd complains unless libraries are executable postinstall_cmds='chmod +x $lib' ;; sunos4*) version_type=sunos library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes if test yes = "$with_gnu_ld"; then need_lib_prefix=no fi need_version=yes ;; sysv4 | sysv4.3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) shlibpath_overrides_runpath=no need_lib_prefix=no runpath_var=LD_RUN_PATH ;; siemens) need_lib_prefix=no ;; motorola) need_lib_prefix=no need_version=no shlibpath_overrides_runpath=no sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' ;; esac ;; sysv4*MP*) if test -d /usr/nec; then version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$shared_ext.$versuffix $libname$shared_ext.$major $libname$shared_ext' soname_spec='$libname$shared_ext.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) version_type=sco need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes if test yes = "$with_gnu_ld"; then sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' else sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' case $host_os in sco3.2v5*) sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" ;; esac fi sys_lib_dlsearch_path_spec='/usr/lib' ;; tpf*) # TPF is a cross-target only. Preferred cross-host = GNU/Linux. version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; uts4*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH ;; *) dynamic_linker=no ;; esac AC_MSG_RESULT([$dynamic_linker]) test no = "$dynamic_linker" && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test yes = "$GCC"; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi if test set = "${lt_cv_sys_lib_search_path_spec+set}"; then sys_lib_search_path_spec=$lt_cv_sys_lib_search_path_spec fi if test set = "${lt_cv_sys_lib_dlsearch_path_spec+set}"; then sys_lib_dlsearch_path_spec=$lt_cv_sys_lib_dlsearch_path_spec fi # remember unaugmented sys_lib_dlsearch_path content for libtool script decls... configure_time_dlsearch_path=$sys_lib_dlsearch_path_spec # ... but it needs LT_SYS_LIBRARY_PATH munging for other configure-time code func_munge_path_list sys_lib_dlsearch_path_spec "$LT_SYS_LIBRARY_PATH" # to be used as default LT_SYS_LIBRARY_PATH value in generated libtool configure_time_lt_sys_library_path=$LT_SYS_LIBRARY_PATH _LT_DECL([], [variables_saved_for_relink], [1], [Variables whose values should be saved in libtool wrapper scripts and restored at link time]) _LT_DECL([], [need_lib_prefix], [0], [Do we need the "lib" prefix for modules?]) _LT_DECL([], [need_version], [0], [Do we need a version for libraries?]) _LT_DECL([], [version_type], [0], [Library versioning type]) _LT_DECL([], [runpath_var], [0], [Shared library runtime path variable]) _LT_DECL([], [shlibpath_var], [0],[Shared library path variable]) _LT_DECL([], [shlibpath_overrides_runpath], [0], [Is shlibpath searched before the hard-coded library search path?]) _LT_DECL([], [libname_spec], [1], [Format of library name prefix]) _LT_DECL([], [library_names_spec], [1], [[List of archive names. First name is the real one, the rest are links. The last name is the one that the linker finds with -lNAME]]) _LT_DECL([], [soname_spec], [1], [[The coded name of the library, if different from the real name]]) _LT_DECL([], [install_override_mode], [1], [Permission mode override for installation of shared libraries]) _LT_DECL([], [postinstall_cmds], [2], [Command to use after installation of a shared archive]) _LT_DECL([], [postuninstall_cmds], [2], [Command to use after uninstallation of a shared archive]) _LT_DECL([], [finish_cmds], [2], [Commands used to finish a libtool library installation in a directory]) _LT_DECL([], [finish_eval], [1], [[As "finish_cmds", except a single script fragment to be evaled but not shown]]) _LT_DECL([], [hardcode_into_libs], [0], [Whether we should hardcode library paths into libraries]) _LT_DECL([], [sys_lib_search_path_spec], [2], [Compile-time system search path for libraries]) _LT_DECL([sys_lib_dlsearch_path_spec], [configure_time_dlsearch_path], [2], [Detected run-time system search path for libraries]) _LT_DECL([], [configure_time_lt_sys_library_path], [2], [Explicit LT_SYS_LIBRARY_PATH set during ./configure time]) ])# _LT_SYS_DYNAMIC_LINKER # _LT_PATH_TOOL_PREFIX(TOOL) # -------------------------- # find a file program that can recognize shared library AC_DEFUN([_LT_PATH_TOOL_PREFIX], [m4_require([_LT_DECL_EGREP])dnl AC_MSG_CHECKING([for $1]) AC_CACHE_VAL(lt_cv_path_MAGIC_CMD, [case $MAGIC_CMD in [[\\/*] | ?:[\\/]*]) lt_cv_path_MAGIC_CMD=$MAGIC_CMD # Let the user override the test with a path. ;; *) lt_save_MAGIC_CMD=$MAGIC_CMD lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR dnl $ac_dummy forces splitting on constant user-supplied paths. dnl POSIX.2 word splitting is done only on the output of word expansions, dnl not every word. This closes a longstanding sh security hole. ac_dummy="m4_if([$2], , $PATH, [$2])" for ac_dir in $ac_dummy; do IFS=$lt_save_ifs test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$1"; then lt_cv_path_MAGIC_CMD=$ac_dir/"$1" if test -n "$file_magic_test_file"; then case $deplibs_check_method in "file_magic "*) file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` MAGIC_CMD=$lt_cv_path_MAGIC_CMD if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | $EGREP "$file_magic_regex" > /dev/null; then : else cat <<_LT_EOF 1>&2 *** Warning: the command libtool uses to detect shared libraries, *** $file_magic_cmd, produces output that libtool cannot recognize. *** The result is that libtool may fail to recognize shared libraries *** as such. This will affect the creation of libtool libraries that *** depend on shared libraries, but programs linked with such libtool *** libraries will work regardless of this problem. Nevertheless, you *** may want to report the problem to your system manager and/or to *** bug-libtool@gnu.org _LT_EOF fi ;; esac fi break fi done IFS=$lt_save_ifs MAGIC_CMD=$lt_save_MAGIC_CMD ;; esac]) MAGIC_CMD=$lt_cv_path_MAGIC_CMD if test -n "$MAGIC_CMD"; then AC_MSG_RESULT($MAGIC_CMD) else AC_MSG_RESULT(no) fi _LT_DECL([], [MAGIC_CMD], [0], [Used to examine libraries when file_magic_cmd begins with "file"])dnl ])# _LT_PATH_TOOL_PREFIX # Old name: AU_ALIAS([AC_PATH_TOOL_PREFIX], [_LT_PATH_TOOL_PREFIX]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_PATH_TOOL_PREFIX], []) # _LT_PATH_MAGIC # -------------- # find a file program that can recognize a shared library m4_defun([_LT_PATH_MAGIC], [_LT_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH) if test -z "$lt_cv_path_MAGIC_CMD"; then if test -n "$ac_tool_prefix"; then _LT_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH) else MAGIC_CMD=: fi fi ])# _LT_PATH_MAGIC # LT_PATH_LD # ---------- # find the pathname to the GNU or non-GNU linker AC_DEFUN([LT_PATH_LD], [AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_CANONICAL_BUILD])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_PROG_ECHO_BACKSLASH])dnl AC_ARG_WITH([gnu-ld], [AS_HELP_STRING([--with-gnu-ld], [assume the C compiler uses GNU ld @<:@default=no@:>@])], [test no = "$withval" || with_gnu_ld=yes], [with_gnu_ld=no])dnl ac_prog=ld if test yes = "$GCC"; then # Check if gcc -print-prog-name=ld gives a path. AC_MSG_CHECKING([for ld used by $CC]) case $host in *-*-mingw*) # gcc leaves a trailing carriage return, which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; esac case $ac_prog in # Accept absolute paths. [[\\/]]* | ?:[[\\/]]*) re_direlt='/[[^/]][[^/]]*/\.\./' # Canonicalize the pathname of ld ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` done test -z "$LD" && LD=$ac_prog ;; "") # If it fails, then pretend we aren't using GCC. ac_prog=ld ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac elif test yes = "$with_gnu_ld"; then AC_MSG_CHECKING([for GNU ld]) else AC_MSG_CHECKING([for non-GNU ld]) fi AC_CACHE_VAL(lt_cv_path_LD, [if test -z "$LD"; then lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS=$lt_save_ifs test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then lt_cv_path_LD=$ac_dir/$ac_prog # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some variants of GNU ld only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$lt_cv_path_LD" -v 2>&1 &1 conftest.i cat conftest.i conftest.i >conftest2.i : ${lt_DD:=$DD} AC_PATH_PROGS_FEATURE_CHECK([lt_DD], [dd], [if "$ac_path_lt_DD" bs=32 count=1 conftest.out 2>/dev/null; then cmp -s conftest.i conftest.out \ && ac_cv_path_lt_DD="$ac_path_lt_DD" ac_path_lt_DD_found=: fi]) rm -f conftest.i conftest2.i conftest.out]) ])# _LT_PATH_DD # _LT_CMD_TRUNCATE # ---------------- # find command to truncate a binary pipe m4_defun([_LT_CMD_TRUNCATE], [m4_require([_LT_PATH_DD]) AC_CACHE_CHECK([how to truncate binary pipes], [lt_cv_truncate_bin], [printf 0123456789abcdef0123456789abcdef >conftest.i cat conftest.i conftest.i >conftest2.i lt_cv_truncate_bin= if "$ac_cv_path_lt_DD" bs=32 count=1 conftest.out 2>/dev/null; then cmp -s conftest.i conftest.out \ && lt_cv_truncate_bin="$ac_cv_path_lt_DD bs=4096 count=1" fi rm -f conftest.i conftest2.i conftest.out test -z "$lt_cv_truncate_bin" && lt_cv_truncate_bin="$SED -e 4q"]) _LT_DECL([lt_truncate_bin], [lt_cv_truncate_bin], [1], [Command to truncate a binary pipe]) ])# _LT_CMD_TRUNCATE # _LT_CHECK_MAGIC_METHOD # ---------------------- # how to check for library dependencies # -- PORTME fill in with the dynamic library characteristics m4_defun([_LT_CHECK_MAGIC_METHOD], [m4_require([_LT_DECL_EGREP]) m4_require([_LT_DECL_OBJDUMP]) AC_CACHE_CHECK([how to recognize dependent libraries], lt_cv_deplibs_check_method, [lt_cv_file_magic_cmd='$MAGIC_CMD' lt_cv_file_magic_test_file= lt_cv_deplibs_check_method='unknown' # Need to set the preceding variable on all platforms that support # interlibrary dependencies. # 'none' -- dependencies not supported. # 'unknown' -- same as none, but documents that we really don't know. # 'pass_all' -- all dependencies passed with no checks. # 'test_compile' -- check by making test program. # 'file_magic [[regex]]' -- check by looking for files in library path # that responds to the $file_magic_cmd with a given extended regex. # If you have 'file' or equivalent on your system and you're not sure # whether 'pass_all' will *always* work, you probably want this one. case $host_os in aix[[4-9]]*) lt_cv_deplibs_check_method=pass_all ;; beos*) lt_cv_deplibs_check_method=pass_all ;; bsdi[[45]]*) lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib)' lt_cv_file_magic_cmd='/usr/bin/file -L' lt_cv_file_magic_test_file=/shlib/libc.so ;; cygwin*) # func_win32_libid is a shell function defined in ltmain.sh lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' lt_cv_file_magic_cmd='func_win32_libid' ;; mingw* | pw32*) # Base MSYS/MinGW do not provide the 'file' command needed by # func_win32_libid shell function, so use a weaker test based on 'objdump', # unless we find 'file', for example because we are cross-compiling. if ( file / ) >/dev/null 2>&1; then lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' lt_cv_file_magic_cmd='func_win32_libid' else # Keep this pattern in sync with the one in func_win32_libid. lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' lt_cv_file_magic_cmd='$OBJDUMP -f' fi ;; cegcc*) # use the weaker test based on 'objdump'. See mingw*. lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' lt_cv_file_magic_cmd='$OBJDUMP -f' ;; darwin* | rhapsody*) lt_cv_deplibs_check_method=pass_all ;; freebsd* | dragonfly*) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then case $host_cpu in i*86 ) # Not sure whether the presence of OpenBSD here was a mistake. # Let's accept both of them until this is cleared up. lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[[3-9]]86 (compact )?demand paged shared library' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` ;; esac else lt_cv_deplibs_check_method=pass_all fi ;; haiku*) lt_cv_deplibs_check_method=pass_all ;; hpux10.20* | hpux11*) lt_cv_file_magic_cmd=/usr/bin/file case $host_cpu in ia64*) lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|ELF-[[0-9]][[0-9]]) shared object file - IA64' lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so ;; hppa*64*) [lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]'] lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl ;; *) lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]]\.[[0-9]]) shared library' lt_cv_file_magic_test_file=/usr/lib/libc.sl ;; esac ;; interix[[3-9]]*) # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|\.a)$' ;; irix5* | irix6* | nonstopux*) case $LD in *-32|*"-32 ") libmagic=32-bit;; *-n32|*"-n32 ") libmagic=N32;; *-64|*"-64 ") libmagic=64-bit;; *) libmagic=never-match;; esac lt_cv_deplibs_check_method=pass_all ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) lt_cv_deplibs_check_method=pass_all ;; netbsd* | netbsdelf*-gnu) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|_pic\.a)$' fi ;; newos6*) lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (executable|dynamic lib)' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=/usr/lib/libnls.so ;; *nto* | *qnx*) lt_cv_deplibs_check_method=pass_all ;; openbsd* | bitrig*) if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|\.so|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' fi ;; osf3* | osf4* | osf5*) lt_cv_deplibs_check_method=pass_all ;; rdos*) lt_cv_deplibs_check_method=pass_all ;; solaris*) lt_cv_deplibs_check_method=pass_all ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) lt_cv_deplibs_check_method=pass_all ;; sysv4 | sysv4.3*) case $host_vendor in motorola) lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib) M[[0-9]][[0-9]]* Version [[0-9]]' lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` ;; ncr) lt_cv_deplibs_check_method=pass_all ;; sequent) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )' ;; sni) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method="file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB dynamic lib" lt_cv_file_magic_test_file=/lib/libc.so ;; siemens) lt_cv_deplibs_check_method=pass_all ;; pc) lt_cv_deplibs_check_method=pass_all ;; esac ;; tpf*) lt_cv_deplibs_check_method=pass_all ;; os2*) lt_cv_deplibs_check_method=pass_all ;; esac ]) file_magic_glob= want_nocaseglob=no if test "$build" = "$host"; then case $host_os in mingw* | pw32*) if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then want_nocaseglob=yes else file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[[\1]]\/[[\1]]\/g;/g"` fi ;; esac fi file_magic_cmd=$lt_cv_file_magic_cmd deplibs_check_method=$lt_cv_deplibs_check_method test -z "$deplibs_check_method" && deplibs_check_method=unknown _LT_DECL([], [deplibs_check_method], [1], [Method to check whether dependent libraries are shared objects]) _LT_DECL([], [file_magic_cmd], [1], [Command to use when deplibs_check_method = "file_magic"]) _LT_DECL([], [file_magic_glob], [1], [How to find potential files when deplibs_check_method = "file_magic"]) _LT_DECL([], [want_nocaseglob], [1], [Find potential files using nocaseglob when deplibs_check_method = "file_magic"]) ])# _LT_CHECK_MAGIC_METHOD # LT_PATH_NM # ---------- # find the pathname to a BSD- or MS-compatible name lister AC_DEFUN([LT_PATH_NM], [AC_REQUIRE([AC_PROG_CC])dnl AC_CACHE_CHECK([for BSD- or MS-compatible name lister (nm)], lt_cv_path_NM, [if test -n "$NM"; then # Let the user override the test. lt_cv_path_NM=$NM else lt_nm_to_check=${ac_tool_prefix}nm if test -n "$ac_tool_prefix" && test "$build" = "$host"; then lt_nm_to_check="$lt_nm_to_check nm" fi for lt_tmp_nm in $lt_nm_to_check; do lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do IFS=$lt_save_ifs test -z "$ac_dir" && ac_dir=. tmp_nm=$ac_dir/$lt_tmp_nm if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext"; then # Check to see if the nm accepts a BSD-compat flag. # Adding the 'sed 1q' prevents false positives on HP-UX, which says: # nm: unknown option "B" ignored # Tru64's nm complains that /dev/null is an invalid object file # MSYS converts /dev/null to NUL, MinGW nm treats NUL as empty case $build_os in mingw*) lt_bad_file=conftest.nm/nofile ;; *) lt_bad_file=/dev/null ;; esac case `"$tmp_nm" -B $lt_bad_file 2>&1 | sed '1q'` in *$lt_bad_file* | *'Invalid file or object type'*) lt_cv_path_NM="$tmp_nm -B" break 2 ;; *) case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in */dev/null*) lt_cv_path_NM="$tmp_nm -p" break 2 ;; *) lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but continue # so that we can try to find one that supports BSD flags ;; esac ;; esac fi done IFS=$lt_save_ifs done : ${lt_cv_path_NM=no} fi]) if test no != "$lt_cv_path_NM"; then NM=$lt_cv_path_NM else # Didn't find any BSD compatible name lister, look for dumpbin. if test -n "$DUMPBIN"; then : # Let the user override the test. else AC_CHECK_TOOLS(DUMPBIN, [dumpbin "link -dump"], :) case `$DUMPBIN -symbols -headers /dev/null 2>&1 | sed '1q'` in *COFF*) DUMPBIN="$DUMPBIN -symbols -headers" ;; *) DUMPBIN=: ;; esac fi AC_SUBST([DUMPBIN]) if test : != "$DUMPBIN"; then NM=$DUMPBIN fi fi test -z "$NM" && NM=nm AC_SUBST([NM]) _LT_DECL([], [NM], [1], [A BSD- or MS-compatible name lister])dnl AC_CACHE_CHECK([the name lister ($NM) interface], [lt_cv_nm_interface], [lt_cv_nm_interface="BSD nm" echo "int some_variable = 0;" > conftest.$ac_ext (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&AS_MESSAGE_LOG_FD) (eval "$ac_compile" 2>conftest.err) cat conftest.err >&AS_MESSAGE_LOG_FD (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&AS_MESSAGE_LOG_FD) (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) cat conftest.err >&AS_MESSAGE_LOG_FD (eval echo "\"\$as_me:$LINENO: output\"" >&AS_MESSAGE_LOG_FD) cat conftest.out >&AS_MESSAGE_LOG_FD if $GREP 'External.*some_variable' conftest.out > /dev/null; then lt_cv_nm_interface="MS dumpbin" fi rm -f conftest*]) ])# LT_PATH_NM # Old names: AU_ALIAS([AM_PROG_NM], [LT_PATH_NM]) AU_ALIAS([AC_PROG_NM], [LT_PATH_NM]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AM_PROG_NM], []) dnl AC_DEFUN([AC_PROG_NM], []) # _LT_CHECK_SHAREDLIB_FROM_LINKLIB # -------------------------------- # how to determine the name of the shared library # associated with a specific link library. # -- PORTME fill in with the dynamic library characteristics m4_defun([_LT_CHECK_SHAREDLIB_FROM_LINKLIB], [m4_require([_LT_DECL_EGREP]) m4_require([_LT_DECL_OBJDUMP]) m4_require([_LT_DECL_DLLTOOL]) AC_CACHE_CHECK([how to associate runtime and link libraries], lt_cv_sharedlib_from_linklib_cmd, [lt_cv_sharedlib_from_linklib_cmd='unknown' case $host_os in cygwin* | mingw* | pw32* | cegcc*) # two different shell functions defined in ltmain.sh; # decide which one to use based on capabilities of $DLLTOOL case `$DLLTOOL --help 2>&1` in *--identify-strict*) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib ;; *) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback ;; esac ;; *) # fallback: assume linklib IS sharedlib lt_cv_sharedlib_from_linklib_cmd=$ECHO ;; esac ]) sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO _LT_DECL([], [sharedlib_from_linklib_cmd], [1], [Command to associate shared and link libraries]) ])# _LT_CHECK_SHAREDLIB_FROM_LINKLIB # _LT_PATH_MANIFEST_TOOL # ---------------------- # locate the manifest tool m4_defun([_LT_PATH_MANIFEST_TOOL], [AC_CHECK_TOOL(MANIFEST_TOOL, mt, :) test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt AC_CACHE_CHECK([if $MANIFEST_TOOL is a manifest tool], [lt_cv_path_mainfest_tool], [lt_cv_path_mainfest_tool=no echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&AS_MESSAGE_LOG_FD $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out cat conftest.err >&AS_MESSAGE_LOG_FD if $GREP 'Manifest Tool' conftest.out > /dev/null; then lt_cv_path_mainfest_tool=yes fi rm -f conftest*]) if test yes != "$lt_cv_path_mainfest_tool"; then MANIFEST_TOOL=: fi _LT_DECL([], [MANIFEST_TOOL], [1], [Manifest tool])dnl ])# _LT_PATH_MANIFEST_TOOL # _LT_DLL_DEF_P([FILE]) # --------------------- # True iff FILE is a Windows DLL '.def' file. # Keep in sync with func_dll_def_p in the libtool script AC_DEFUN([_LT_DLL_DEF_P], [dnl test DEF = "`$SED -n dnl -e '\''s/^[[ ]]*//'\'' dnl Strip leading whitespace -e '\''/^\(;.*\)*$/d'\'' dnl Delete empty lines and comments -e '\''s/^\(EXPORTS\|LIBRARY\)\([[ ]].*\)*$/DEF/p'\'' dnl -e q dnl Only consider the first "real" line $1`" dnl ])# _LT_DLL_DEF_P # LT_LIB_M # -------- # check for math library AC_DEFUN([LT_LIB_M], [AC_REQUIRE([AC_CANONICAL_HOST])dnl LIBM= case $host in *-*-beos* | *-*-cegcc* | *-*-cygwin* | *-*-haiku* | *-*-pw32* | *-*-darwin*) # These system don't have libm, or don't need it ;; *-ncr-sysv4.3*) AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM=-lmw) AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm") ;; *) AC_CHECK_LIB(m, cos, LIBM=-lm) ;; esac AC_SUBST([LIBM]) ])# LT_LIB_M # Old name: AU_ALIAS([AC_CHECK_LIBM], [LT_LIB_M]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_CHECK_LIBM], []) # _LT_COMPILER_NO_RTTI([TAGNAME]) # ------------------------------- m4_defun([_LT_COMPILER_NO_RTTI], [m4_require([_LT_TAG_COMPILER])dnl _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= if test yes = "$GCC"; then case $cc_basename in nvcc*) _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -Xcompiler -fno-builtin' ;; *) _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' ;; esac _LT_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions], lt_cv_prog_compiler_rtti_exceptions, [-fno-rtti -fno-exceptions], [], [_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)="$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions"]) fi _LT_TAGDECL([no_builtin_flag], [lt_prog_compiler_no_builtin_flag], [1], [Compiler flag to turn off builtin functions]) ])# _LT_COMPILER_NO_RTTI # _LT_CMD_GLOBAL_SYMBOLS # ---------------------- m4_defun([_LT_CMD_GLOBAL_SYMBOLS], [AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([AC_PROG_AWK])dnl AC_REQUIRE([LT_PATH_NM])dnl AC_REQUIRE([LT_PATH_LD])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_TAG_COMPILER])dnl # Check for command to grab the raw symbol name followed by C symbol from nm. AC_MSG_CHECKING([command to parse $NM output from $compiler object]) AC_CACHE_VAL([lt_cv_sys_global_symbol_pipe], [ # These are sane defaults that work on at least a few old systems. # [They come from Ultrix. What could be older than Ultrix?!! ;)] # Character class describing NM global symbol codes. symcode='[[BCDEGRST]]' # Regexp to match symbols that can be accessed directly from C. sympat='\([[_A-Za-z]][[_A-Za-z0-9]]*\)' # Define system-specific variables. case $host_os in aix*) symcode='[[BCDT]]' ;; cygwin* | mingw* | pw32* | cegcc*) symcode='[[ABCDGISTW]]' ;; hpux*) if test ia64 = "$host_cpu"; then symcode='[[ABCDEGRST]]' fi ;; irix* | nonstopux*) symcode='[[BCDEGRST]]' ;; osf*) symcode='[[BCDEGQRST]]' ;; solaris*) symcode='[[BDRT]]' ;; sco3.2v5*) symcode='[[DT]]' ;; sysv4.2uw2*) symcode='[[DT]]' ;; sysv5* | sco5v6* | unixware* | OpenUNIX*) symcode='[[ABDT]]' ;; sysv4) symcode='[[DFNSTU]]' ;; esac # If we're using GNU nm, then use its standard symbol codes. case `$NM -V 2>&1` in *GNU* | *'with BFD'*) symcode='[[ABCDGIRSTW]]' ;; esac if test "$lt_cv_nm_interface" = "MS dumpbin"; then # Gets list of data symbols to import. lt_cv_sys_global_symbol_to_import="sed -n -e 's/^I .* \(.*\)$/\1/p'" # Adjust the below global symbol transforms to fixup imported variables. lt_cdecl_hook=" -e 's/^I .* \(.*\)$/extern __declspec(dllimport) char \1;/p'" lt_c_name_hook=" -e 's/^I .* \(.*\)$/ {\"\1\", (void *) 0},/p'" lt_c_name_lib_hook="\ -e 's/^I .* \(lib.*\)$/ {\"\1\", (void *) 0},/p'\ -e 's/^I .* \(.*\)$/ {\"lib\1\", (void *) 0},/p'" else # Disable hooks by default. lt_cv_sys_global_symbol_to_import= lt_cdecl_hook= lt_c_name_hook= lt_c_name_lib_hook= fi # Transform an extracted symbol line into a proper C declaration. # Some systems (esp. on ia64) link data and code symbols differently, # so use this general approach. lt_cv_sys_global_symbol_to_cdecl="sed -n"\ $lt_cdecl_hook\ " -e 's/^T .* \(.*\)$/extern int \1();/p'"\ " -e 's/^$symcode$symcode* .* \(.*\)$/extern char \1;/p'" # Transform an extracted symbol line into symbol name and symbol address lt_cv_sys_global_symbol_to_c_name_address="sed -n"\ $lt_c_name_hook\ " -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\ " -e 's/^$symcode$symcode* .* \(.*\)$/ {\"\1\", (void *) \&\1},/p'" # Transform an extracted symbol line into symbol name with lib prefix and # symbol address. lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n"\ $lt_c_name_lib_hook\ " -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\ " -e 's/^$symcode$symcode* .* \(lib.*\)$/ {\"\1\", (void *) \&\1},/p'"\ " -e 's/^$symcode$symcode* .* \(.*\)$/ {\"lib\1\", (void *) \&\1},/p'" # Handle CRLF in mingw tool chain opt_cr= case $build_os in mingw*) opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp ;; esac # Try without a prefix underscore, then with it. for ac_symprfx in "" "_"; do # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. symxfrm="\\1 $ac_symprfx\\2 \\2" # Write the raw and C identifiers. if test "$lt_cv_nm_interface" = "MS dumpbin"; then # Fake it for dumpbin and say T for any non-static function, # D for any global variable and I for any imported variable. # Also find C++ and __fastcall symbols from MSVC++, # which start with @ or ?. lt_cv_sys_global_symbol_pipe="$AWK ['"\ " {last_section=section; section=\$ 3};"\ " /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\ " /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ " /^ *Symbol name *: /{split(\$ 0,sn,\":\"); si=substr(sn[2],2)};"\ " /^ *Type *: code/{print \"T\",si,substr(si,length(prfx))};"\ " /^ *Type *: data/{print \"I\",si,substr(si,length(prfx))};"\ " \$ 0!~/External *\|/{next};"\ " / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ " {if(hide[section]) next};"\ " {f=\"D\"}; \$ 0~/\(\).*\|/{f=\"T\"};"\ " {split(\$ 0,a,/\||\r/); split(a[2],s)};"\ " s[1]~/^[@?]/{print f,s[1],s[1]; next};"\ " s[1]~prfx {split(s[1],t,\"@\"); print f,t[1],substr(t[1],length(prfx))}"\ " ' prfx=^$ac_symprfx]" else lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[ ]]\($symcode$symcode*\)[[ ]][[ ]]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" fi lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'" # Check to see that the pipe works correctly. pipe_works=no rm -f conftest* cat > conftest.$ac_ext <<_LT_EOF #ifdef __cplusplus extern "C" { #endif char nm_test_var; void nm_test_func(void); void nm_test_func(void){} #ifdef __cplusplus } #endif int main(){nm_test_var='a';nm_test_func();return(0);} _LT_EOF if AC_TRY_EVAL(ac_compile); then # Now try to grab the symbols. nlist=conftest.nm $ECHO "$as_me:$LINENO: $NM conftest.$ac_objext | $lt_cv_sys_global_symbol_pipe > $nlist" >&AS_MESSAGE_LOG_FD if eval "$NM" conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist 2>&AS_MESSAGE_LOG_FD && test -s "$nlist"; then # Try sorting and uniquifying the output. if sort "$nlist" | uniq > "$nlist"T; then mv -f "$nlist"T "$nlist" else rm -f "$nlist"T fi # Make sure that we snagged all the symbols we need. if $GREP ' nm_test_var$' "$nlist" >/dev/null; then if $GREP ' nm_test_func$' "$nlist" >/dev/null; then cat <<_LT_EOF > conftest.$ac_ext /* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ #if defined _WIN32 || defined __CYGWIN__ || defined _WIN32_WCE /* DATA imports from DLLs on WIN32 can't be const, because runtime relocations are performed -- see ld's documentation on pseudo-relocs. */ # define LT@&t@_DLSYM_CONST #elif defined __osf__ /* This system does not cope well with relocations in const data. */ # define LT@&t@_DLSYM_CONST #else # define LT@&t@_DLSYM_CONST const #endif #ifdef __cplusplus extern "C" { #endif _LT_EOF # Now generate the symbol file. eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' cat <<_LT_EOF >> conftest.$ac_ext /* The mapping between symbol names and symbols. */ LT@&t@_DLSYM_CONST struct { const char *name; void *address; } lt__PROGRAM__LTX_preloaded_symbols[[]] = { { "@PROGRAM@", (void *) 0 }, _LT_EOF $SED "s/^$symcode$symcode* .* \(.*\)$/ {\"\1\", (void *) \&\1},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext cat <<\_LT_EOF >> conftest.$ac_ext {0, (void *) 0} }; /* This works around a problem in FreeBSD linker */ #ifdef FREEBSD_WORKAROUND static const void *lt_preloaded_setup() { return lt__PROGRAM__LTX_preloaded_symbols; } #endif #ifdef __cplusplus } #endif _LT_EOF # Now try linking the two files. mv conftest.$ac_objext conftstm.$ac_objext lt_globsym_save_LIBS=$LIBS lt_globsym_save_CFLAGS=$CFLAGS LIBS=conftstm.$ac_objext CFLAGS="$CFLAGS$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)" if AC_TRY_EVAL(ac_link) && test -s conftest$ac_exeext; then pipe_works=yes fi LIBS=$lt_globsym_save_LIBS CFLAGS=$lt_globsym_save_CFLAGS else echo "cannot find nm_test_func in $nlist" >&AS_MESSAGE_LOG_FD fi else echo "cannot find nm_test_var in $nlist" >&AS_MESSAGE_LOG_FD fi else echo "cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD fi else echo "$progname: failed program was:" >&AS_MESSAGE_LOG_FD cat conftest.$ac_ext >&5 fi rm -rf conftest* conftst* # Do not use the global_symbol_pipe unless it works. if test yes = "$pipe_works"; then break else lt_cv_sys_global_symbol_pipe= fi done ]) if test -z "$lt_cv_sys_global_symbol_pipe"; then lt_cv_sys_global_symbol_to_cdecl= fi if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then AC_MSG_RESULT(failed) else AC_MSG_RESULT(ok) fi # Response file support. if test "$lt_cv_nm_interface" = "MS dumpbin"; then nm_file_list_spec='@' elif $NM --help 2>/dev/null | grep '[[@]]FILE' >/dev/null; then nm_file_list_spec='@' fi _LT_DECL([global_symbol_pipe], [lt_cv_sys_global_symbol_pipe], [1], [Take the output of nm and produce a listing of raw symbols and C names]) _LT_DECL([global_symbol_to_cdecl], [lt_cv_sys_global_symbol_to_cdecl], [1], [Transform the output of nm in a proper C declaration]) _LT_DECL([global_symbol_to_import], [lt_cv_sys_global_symbol_to_import], [1], [Transform the output of nm into a list of symbols to manually relocate]) _LT_DECL([global_symbol_to_c_name_address], [lt_cv_sys_global_symbol_to_c_name_address], [1], [Transform the output of nm in a C name address pair]) _LT_DECL([global_symbol_to_c_name_address_lib_prefix], [lt_cv_sys_global_symbol_to_c_name_address_lib_prefix], [1], [Transform the output of nm in a C name address pair when lib prefix is needed]) _LT_DECL([nm_interface], [lt_cv_nm_interface], [1], [The name lister interface]) _LT_DECL([], [nm_file_list_spec], [1], [Specify filename containing input files for $NM]) ]) # _LT_CMD_GLOBAL_SYMBOLS # _LT_COMPILER_PIC([TAGNAME]) # --------------------------- m4_defun([_LT_COMPILER_PIC], [m4_require([_LT_TAG_COMPILER])dnl _LT_TAGVAR(lt_prog_compiler_wl, $1)= _LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_static, $1)= m4_if([$1], [CXX], [ # C++ specific cases for pic, static, wl, etc. if test yes = "$GXX"; then _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' case $host_os in aix*) # All AIX code is PIC. if test ia64 = "$host_cpu"; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but # adding the '-m68020' flag to GCC prevents building anything better, # like '-m68040'. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | os2* | pw32* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) case $host_os in os2*) _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-static' ;; esac ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' ;; *djgpp*) # DJGPP does not support shared libraries at all _LT_TAGVAR(lt_prog_compiler_pic, $1)= ;; haiku*) # PIC is the default for Haiku. # The "-static" flag exists, but is broken. _LT_TAGVAR(lt_prog_compiler_static, $1)= ;; interix[[3-9]]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; sysv4*MP*) if test -d /usr/nec; then _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic fi ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac ;; *qnx* | *nto*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac else case $host_os in aix[[4-9]]*) # All AIX code is PIC. if test ia64 = "$host_cpu"; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' else _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' fi ;; chorus*) case $cc_basename in cxch68*) # Green Hills C++ Compiler # _LT_TAGVAR(lt_prog_compiler_static, $1)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" ;; esac ;; mingw* | cygwin* | os2* | pw32* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) ;; dgux*) case $cc_basename in ec++*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' ;; ghcx*) # Green Hills C++ Compiler _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ;; *) ;; esac ;; freebsd* | dragonfly*) # FreeBSD uses GNU C++ ;; hpux9* | hpux10* | hpux11*) case $cc_basename in CC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-a ${wl}archive' if test ia64 != "$host_cpu"; then _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' fi ;; aCC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-a ${wl}archive' case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' ;; esac ;; *) ;; esac ;; interix*) # This is c89, which is MS Visual C++ (no shared libs) # Anyone wants to do a port? ;; irix5* | irix6* | nonstopux*) case $cc_basename in CC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' # CC pic flag -KPIC is the default. ;; *) ;; esac ;; linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) case $cc_basename in KCC*) # KAI C++ Compiler _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; ecpc* ) # old Intel C++ for x86_64, which still supported -KPIC. _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; icpc* ) # Intel C++, used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; pgCC* | pgcpp*) # Portland Group C++ compiler _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; cxx*) # Compaq C++ # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. _LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; xlc* | xlC* | bgxl[[cC]]* | mpixl[[cC]]*) # IBM XL 8.0, 9.0 on PPC and BlueGene _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' ;; esac ;; esac ;; lynxos*) ;; m88k*) ;; mvs*) case $cc_basename in cxx*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall' ;; *) ;; esac ;; netbsd* | netbsdelf*-gnu) ;; *qnx* | *nto*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; osf3* | osf4* | osf5*) case $cc_basename in KCC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' ;; RCC*) # Rational C++ 2.4.1 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ;; cxx*) # Digital/Compaq C++ _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. _LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; *) ;; esac ;; psos*) ;; solaris*) case $cc_basename in CC* | sunCC*) # Sun C++ 4.2, 5.x and Centerline C++ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' ;; gcx*) # Green Hills C++ Compiler _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' ;; *) ;; esac ;; sunos4*) case $cc_basename in CC*) # Sun C++ 4.x _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; lcc*) # Lucid _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ;; *) ;; esac ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) case $cc_basename in CC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; esac ;; tandem*) case $cc_basename in NCC*) # NonStop-UX NCC 3.20 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' ;; *) ;; esac ;; vxworks*) ;; *) _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no ;; esac fi ], [ if test yes = "$GCC"; then _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' case $host_os in aix*) # All AIX code is PIC. if test ia64 = "$host_cpu"; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but # adding the '-m68020' flag to GCC prevents building anything better, # like '-m68040'. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) case $host_os in os2*) _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-static' ;; esac ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' ;; haiku*) # PIC is the default for Haiku. # The "-static" flag exists, but is broken. _LT_TAGVAR(lt_prog_compiler_static, $1)= ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) # +Z the default ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac ;; interix[[3-9]]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; msdosdjgpp*) # Just because we use GCC doesn't mean we suddenly get shared libraries # on systems that don't support them. _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no enable_shared=no ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; sysv4*MP*) if test -d /usr/nec; then _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic fi ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac case $cc_basename in nvcc*) # Cuda Compiler Driver 2.2 _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Xlinker ' if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then _LT_TAGVAR(lt_prog_compiler_pic, $1)="-Xcompiler $_LT_TAGVAR(lt_prog_compiler_pic, $1)" fi ;; esac else # PORTME Check for flag to pass linker flags through the system compiler. case $host_os in aix*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' if test ia64 = "$host_cpu"; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' else _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' fi ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' case $cc_basename in nagfor*) # NAG Fortran compiler _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,-Wl,,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; esac ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) case $host_os in os2*) _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-static' ;; esac ;; hpux9* | hpux10* | hpux11*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' ;; esac # Is there a better lt_prog_compiler_static that works with the bundled CC? _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-a ${wl}archive' ;; irix5* | irix6* | nonstopux*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # PIC (with -KPIC) is the default. _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) case $cc_basename in # old Intel for x86_64, which still supported -KPIC. ecc*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; # flang / f18. f95 an alias for gfortran or flang on Debian flang* | f18* | f95*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; # icc used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. icc* | ifort*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; # Lahey Fortran 8.1. lf95*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='--shared' _LT_TAGVAR(lt_prog_compiler_static, $1)='--static' ;; nagfor*) # NAG Fortran compiler _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,-Wl,,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; tcc*) # Fabrice Bellard et al's Tiny C Compiler _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group compilers (*not* the Pentium gcc compiler, # which looks to be a dead project) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; ccc*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # All Alpha code is PIC. _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; xl* | bgxl* | bgf* | mpixl*) # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [[1-7]].* | *Sun*Fortran*\ 8.[[0-3]]*) # Sun Fortran 8.3 passes all unrecognized flags to the linker _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='' ;; *Sun\ F* | *Sun*Fortran*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' ;; *Sun\ C*) # Sun C 5.9 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' ;; *Intel*\ [[CF]]*Compiler*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; *Portland\ Group*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; esac ;; esac ;; newsos6) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; osf3* | osf4* | osf5*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # All OSF/1 code is PIC. _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; rdos*) _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; solaris*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' case $cc_basename in f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ';; *) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,';; esac ;; sunos4*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; sysv4 | sysv4.2uw2* | sysv4.3*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; sysv4*MP*) if test -d /usr/nec; then _LT_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; unicos*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no ;; uts4*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; *) _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no ;; esac fi ]) case $host_os in # For platforms that do not support PIC, -DPIC is meaningless: *djgpp*) _LT_TAGVAR(lt_prog_compiler_pic, $1)= ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])" ;; esac AC_CACHE_CHECK([for $compiler option to produce PIC], [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)], [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_prog_compiler_pic, $1)]) _LT_TAGVAR(lt_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_cv_prog_compiler_pic, $1) # # Check to make sure the PIC flag actually works. # if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then _LT_COMPILER_OPTION([if $compiler PIC flag $_LT_TAGVAR(lt_prog_compiler_pic, $1) works], [_LT_TAGVAR(lt_cv_prog_compiler_pic_works, $1)], [$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])], [], [case $_LT_TAGVAR(lt_prog_compiler_pic, $1) in "" | " "*) ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)=" $_LT_TAGVAR(lt_prog_compiler_pic, $1)" ;; esac], [_LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no]) fi _LT_TAGDECL([pic_flag], [lt_prog_compiler_pic], [1], [Additional compiler flags for building library objects]) _LT_TAGDECL([wl], [lt_prog_compiler_wl], [1], [How to pass a linker flag through the compiler]) # # Check to make sure the static flag actually works. # wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) eval lt_tmp_static_flag=\"$_LT_TAGVAR(lt_prog_compiler_static, $1)\" _LT_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works], _LT_TAGVAR(lt_cv_prog_compiler_static_works, $1), $lt_tmp_static_flag, [], [_LT_TAGVAR(lt_prog_compiler_static, $1)=]) _LT_TAGDECL([link_static_flag], [lt_prog_compiler_static], [1], [Compiler flag to prevent dynamic linking]) ])# _LT_COMPILER_PIC # _LT_LINKER_SHLIBS([TAGNAME]) # ---------------------------- # See if the linker supports building shared libraries. m4_defun([_LT_LINKER_SHLIBS], [AC_REQUIRE([LT_PATH_LD])dnl AC_REQUIRE([LT_PATH_NM])dnl m4_require([_LT_PATH_MANIFEST_TOOL])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl m4_require([_LT_TAG_COMPILER])dnl AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) m4_if([$1], [CXX], [ _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] case $host_os in aix[[4-9]]*) # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to GNU nm, but means don't demangle to AIX nm. # Without the "-l" option, or with the "-B" option, AIX nm treats # weak defined symbols like other global defined symbols, whereas # GNU nm marks them as "W". # While the 'weak' keyword is ignored in the Export File, we need # it in the Import File for the 'aix-soname' feature, so we have # to replace the "-B" option with "-P" for AIX nm. if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols' else _LT_TAGVAR(export_symbols_cmds, $1)='`func_echo_all $NM | $SED -e '\''s/B\([[^B]]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && ([substr](\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols' fi ;; pw32*) _LT_TAGVAR(export_symbols_cmds, $1)=$ltdll_cmds ;; cygwin* | mingw* | cegcc*) case $cc_basename in cl*) _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' ;; *) _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'] ;; esac ;; linux* | k*bsd*-gnu | gnu*) _LT_TAGVAR(link_all_deplibs, $1)=no ;; *) _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' ;; esac ], [ runpath_var= _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_cmds, $1)= _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(compiler_needs_object, $1)=no _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(old_archive_from_new_cmds, $1)= _LT_TAGVAR(old_archive_from_expsyms_cmds, $1)= _LT_TAGVAR(thread_safe_flag_spec, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= # include_expsyms should be a list of space-separated symbols to be *always* # included in the symbol list _LT_TAGVAR(include_expsyms, $1)= # exclude_expsyms can be an extended regexp of symbols to exclude # it will be wrapped by ' (' and ')$', so one must not match beginning or # end of line. Example: 'a|bc|.*d.*' will exclude the symbols 'a' and 'bc', # as well as any symbol that contains 'd'. _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out # platforms (ab)use it in PIC code, but their linkers get confused if # the symbol is explicitly referenced. Since portable code cannot # rely on this symbol name, it's probably fine to never include it in # preloaded symbol tables. # Exclude shared library initialization/finalization symbols. dnl Note also adjust exclude_expsyms for C++ above. extract_expsyms_cmds= case $host_os in cygwin* | mingw* | pw32* | cegcc*) # FIXME: the MSVC++ port hasn't been tested in a loooong time # When not using gcc, we currently assume that we are using # Microsoft Visual C++. if test yes != "$GCC"; then with_gnu_ld=no fi ;; interix*) # we just hope/assume this is gcc and not c89 (= MSVC++) with_gnu_ld=yes ;; openbsd* | bitrig*) with_gnu_ld=no ;; linux* | k*bsd*-gnu | gnu*) _LT_TAGVAR(link_all_deplibs, $1)=no ;; esac _LT_TAGVAR(ld_shlibs, $1)=yes # On some targets, GNU ld is compatible enough with the native linker # that we're better off using the native interface for both. lt_use_gnu_ld_interface=no if test yes = "$with_gnu_ld"; then case $host_os in aix*) # The AIX port of GNU ld has always aspired to compatibility # with the native linker. However, as the warning in the GNU ld # block says, versions before 2.19.5* couldn't really create working # shared libraries, regardless of the interface used. case `$LD -v 2>&1` in *\ \(GNU\ Binutils\)\ 2.19.5*) ;; *\ \(GNU\ Binutils\)\ 2.[[2-9]]*) ;; *\ \(GNU\ Binutils\)\ [[3-9]]*) ;; *) lt_use_gnu_ld_interface=yes ;; esac ;; *) lt_use_gnu_ld_interface=yes ;; esac fi if test yes = "$lt_use_gnu_ld_interface"; then # If archive_cmds runs LD, not CC, wlarc should be empty wlarc='$wl' # Set some defaults for GNU ld with shared library support. These # are reset later if shared libraries are not supported. Putting them # here allows them to be overridden if necessary. runpath_var=LD_RUN_PATH _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' # ancient GNU ld didn't support --whole-archive et. al. if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then _LT_TAGVAR(whole_archive_flag_spec, $1)=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' else _LT_TAGVAR(whole_archive_flag_spec, $1)= fi supports_anon_versioning=no case `$LD -v | $SED -e 's/([^)]\+)\s\+//' 2>&1` in *GNU\ gold*) supports_anon_versioning=yes ;; *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11 *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... *\ 2.11.*) ;; # other 2.11 versions *) supports_anon_versioning=yes ;; esac # See if GNU ld supports shared libraries. case $host_os in aix[[3-9]]*) # On AIX/PPC, the GNU linker is very broken if test ia64 != "$host_cpu"; then _LT_TAGVAR(ld_shlibs, $1)=no cat <<_LT_EOF 1>&2 *** Warning: the GNU linker, at least up to release 2.19, is reported *** to be unable to reliably create shared libraries on AIX. *** Therefore, libtool is disabling shared libraries support. If you *** really care for shared libraries, you may want to install binutils *** 2.20 or above, or modify your PATH so that a non-GNU linker is found. *** You will then need to restart the configuration process. _LT_EOF fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='' ;; m68k) _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_minus_L, $1)=yes ;; esac ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(allow_undefined_flag, $1)=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; cygwin* | mingw* | pw32* | cegcc*) # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, # as there is no search path for DLLs. _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-all-symbols' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'] if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file, use it as # is; otherwise, prepend EXPORTS... _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; haiku*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(link_all_deplibs, $1)=yes ;; os2*) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(allow_undefined_flag, $1)=unsupported shrext_cmds=.dll _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' _LT_TAGVAR(archive_expsym_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ prefix_cmds="$SED"~ if test EXPORTS = "`$SED 1q $export_symbols`"; then prefix_cmds="$prefix_cmds -e 1d"; fi~ prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' _LT_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes ;; interix[[3-9]]*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) tmp_diet=no if test linux-dietlibc = "$host_os"; then case $cc_basename in diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) esac fi if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ && test no = "$tmp_diet" then tmp_addflag=' $pic_flag' tmp_sharedflag='-shared' case $cc_basename,$host_cpu in pgcc*) # Portland Group C compiler _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' tmp_addflag=' $pic_flag' ;; pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group f77 and f90 compilers _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' tmp_addflag=' $pic_flag -Mnomain' ;; ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 tmp_addflag=' -i_dynamic' ;; efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 tmp_addflag=' -i_dynamic -nofor_main' ;; ifc* | ifort*) # Intel Fortran compiler tmp_addflag=' -nofor_main' ;; lf95*) # Lahey Fortran 8.1 _LT_TAGVAR(whole_archive_flag_spec, $1)= tmp_sharedflag='--shared' ;; nagfor*) # NAGFOR 5.3 tmp_sharedflag='-Wl,-shared' ;; xl[[cC]]* | bgxl[[cC]]* | mpixl[[cC]]*) # IBM XL C 8.0 on PPC (deal with xlf below) tmp_sharedflag='-qmkshrobj' tmp_addflag= ;; nvcc*) # Cuda Compiler Driver 2.2 _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' _LT_TAGVAR(compiler_needs_object, $1)=yes ;; esac case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C 5.9 _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' _LT_TAGVAR(compiler_needs_object, $1)=yes tmp_sharedflag='-G' ;; *Sun\ F*) # Sun Fortran 8.3 tmp_sharedflag='-G' ;; esac _LT_TAGVAR(archive_cmds, $1)='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' if test yes = "$supports_anon_versioning"; then _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib' fi case $cc_basename in tcc*) _LT_TAGVAR(export_dynamic_flag_spec, $1)='-rdynamic' ;; xlf* | bgf* | bgxlf* | mpixlf*) # IBM XL Fortran 10.1 on PPC cannot create shared libs itself _LT_TAGVAR(whole_archive_flag_spec, $1)='--whole-archive$convenience --no-whole-archive' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' _LT_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' if test yes = "$supports_anon_versioning"; then _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' fi ;; esac else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; netbsd* | netbsdelf*-gnu) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' wlarc= else _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' fi ;; solaris*) if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then _LT_TAGVAR(ld_shlibs, $1)=no cat <<_LT_EOF 1>&2 *** Warning: The releases 2.8.* of the GNU linker cannot reliably *** create shared libraries on Solaris systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.9.1 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) case `$LD -v 2>&1` in *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.1[[0-5]].*) _LT_TAGVAR(ld_shlibs, $1)=no cat <<_LT_EOF 1>&2 *** Warning: Releases of the GNU linker prior to 2.16.91.0.3 cannot *** reliably create shared libraries on SCO systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.16.91.0.3 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF ;; *) # For security reasons, it is highly recommended that you always # use absolute paths for naming shared libraries, and exclude the # DT_RUNPATH tag from executables and libraries. But doing so # requires that you compile everything twice, which is a pain. if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; sunos4*) _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' wlarc= _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac if test no = "$_LT_TAGVAR(ld_shlibs, $1)"; then runpath_var= _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= fi else # PORTME fill in a description of your system's linker (not GNU ld) case $host_os in aix3*) _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=yes _LT_TAGVAR(archive_expsym_cmds, $1)='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' # Note: this linker hardcodes the directories in LIBPATH if there # are no directories specified by -L. _LT_TAGVAR(hardcode_minus_L, $1)=yes if test yes = "$GCC" && test -z "$lt_prog_compiler_static"; then # Neither direct hardcoding nor static linking is supported with a # broken collect2. _LT_TAGVAR(hardcode_direct, $1)=unsupported fi ;; aix[[4-9]]*) if test ia64 = "$host_cpu"; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag= else # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to GNU nm, but means don't demangle to AIX nm. # Without the "-l" option, or with the "-B" option, AIX nm treats # weak defined symbols like other global defined symbols, whereas # GNU nm marks them as "W". # While the 'weak' keyword is ignored in the Export File, we need # it in the Import File for the 'aix-soname' feature, so we have # to replace the "-B" option with "-P" for AIX nm. if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols' else _LT_TAGVAR(export_symbols_cmds, $1)='`func_echo_all $NM | $SED -e '\''s/B\([[^B]]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && ([substr](\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols' fi aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # have runtime linking enabled, and use it for executables. # For shared libraries, we enable/disable runtime linking # depending on the kind of the shared library created - # when "with_aix_soname,aix_use_runtimelinking" is: # "aix,no" lib.a(lib.so.V) shared, rtl:no, for executables # "aix,yes" lib.so shared, rtl:yes, for executables # lib.a static archive # "both,no" lib.so.V(shr.o) shared, rtl:yes # lib.a(lib.so.V) shared, rtl:no, for executables # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables # lib.a(lib.so.V) shared, rtl:no # "svr4,*" lib.so.V(shr.o) shared, rtl:yes, for executables # lib.a static archive case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) for ld_flag in $LDFLAGS; do if (test x-brtl = "x$ld_flag" || test x-Wl,-brtl = "x$ld_flag"); then aix_use_runtimelinking=yes break fi done if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then # With aix-soname=svr4, we create the lib.so.V shared archives only, # so we don't have lib.a shared libs to link our executables. # We have to force runtime linking in this case. aix_use_runtimelinking=yes LDFLAGS="$LDFLAGS -Wl,-brtl" fi ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. _LT_TAGVAR(archive_cmds, $1)='' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(file_list_spec, $1)='$wl-f,' case $with_aix_soname,$aix_use_runtimelinking in aix,*) ;; # traditional, no import file svr4,* | *,yes) # use import file # The Import File defines what to hardcode. _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no ;; esac if test yes = "$GCC"; then case $host_os in aix4.[[012]]|aix4.[[012]].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`$CC -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 _LT_TAGVAR(hardcode_direct, $1)=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)= fi ;; esac shared_flag='-shared' if test yes = "$aix_use_runtimelinking"; then shared_flag="$shared_flag "'$wl-G' fi # Need to ensure runtime linking is disabled for the traditional # shared library, or the linker may eventually find shared libraries # /with/ Import File - we do not want to mix them. shared_flag_aix='-shared' shared_flag_svr4='-shared $wl-G' else # not using gcc if test ia64 = "$host_cpu"; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test yes = "$aix_use_runtimelinking"; then shared_flag='$wl-G' else shared_flag='$wl-bM:SRE' fi shared_flag_aix='$wl-bM:SRE' shared_flag_svr4='$wl-G' fi fi _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to export. _LT_TAGVAR(always_export_symbols, $1)=yes if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. _LT_TAGVAR(allow_undefined_flag, $1)='-berok' # Determine the default libpath from the value encoded in an # empty executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-blibpath:$libdir:'"$aix_libpath" _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag else if test ia64 = "$host_cpu"; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R $libdir:/usr/lib:/lib' _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an # empty executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. _LT_TAGVAR(no_undefined_flag, $1)=' $wl-bernotok' _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-berok' if test yes = "$with_gnu_ld"; then # We only use this code for GNU lds that support --whole-archive. _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive$convenience $wl--no-whole-archive' else # Exported symbols can be pulled into shared objects from archives _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' fi _LT_TAGVAR(archive_cmds_need_lc, $1)=yes _LT_TAGVAR(archive_expsym_cmds, $1)='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d' # -brtl affects multiple linker settings, -berok does not and is overridden later compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([[, ]]\\)%-berok\\1%g"`' if test svr4 != "$with_aix_soname"; then # This is similar to how AIX traditionally builds its shared libraries. _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname' fi if test aix != "$with_aix_soname"; then _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp' else # used by -dlpreopen to get the symbols _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$MV $output_objdir/$realname.d/$soname $output_objdir' fi _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$RM -r $output_objdir/$realname.d' fi fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='' ;; m68k) _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_minus_L, $1)=yes ;; esac ;; bsdi[[45]]*) _LT_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic ;; cygwin* | mingw* | pw32* | cegcc*) # When not using gcc, we currently assume that we are using # Microsoft Visual C++. # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. case $cc_basename in cl*) # Native MSVC _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=yes _LT_TAGVAR(file_list_spec, $1)='@' # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=.dll # FIXME: Setting linknames here is a bad hack. _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames=' _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then cp "$export_symbols" "$output_objdir/$soname.def"; echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp"; else $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp; fi~ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ linknames=' # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1,DATA/'\'' | $SED -e '\''/^[[AITW]][[ ]]/s/.*[[ ]]//'\'' | sort | uniq > $export_symbols' # Don't use ranlib _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib' _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~ lt_tool_outputfile="@TOOL_OUTPUT@"~ case $lt_outputfile in *.exe|*.EXE) ;; *) lt_outputfile=$lt_outputfile.exe lt_tool_outputfile=$lt_tool_outputfile.exe ;; esac~ if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; $RM "$lt_outputfile.manifest"; fi' ;; *) # Assume MSVC wrapper _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=.dll # FIXME: Setting linknames here is a bad hack. _LT_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' # The linker will automatically build a .lib file if we build a DLL. _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' # FIXME: Should let the user specify the lib program. _LT_TAGVAR(old_archive_cmds, $1)='lib -OUT:$oldlib$oldobjs$old_deplibs' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes ;; esac ;; darwin* | rhapsody*) _LT_DARWIN_LINKER_FEATURES($1) ;; dgux*) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor # support. Future versions do this automatically, but an explicit c++rt0.o # does not break anything, and helps significantly (at the cost of a little # extra space). freebsd2.2*) _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; # Unfortunately, older versions of FreeBSD 2 do not have this feature. freebsd2.*) _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; # FreeBSD 3 and greater uses gcc -shared to do shared libraries. freebsd* | dragonfly*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; hpux9*) if test yes = "$GCC"; then _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' else _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(hardcode_direct, $1)=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' ;; hpux10*) if test yes,no = "$GCC,$with_gnu_ld"; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' fi if test no = "$with_gnu_ld"; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. _LT_TAGVAR(hardcode_minus_L, $1)=yes fi ;; hpux11*) if test yes,no = "$GCC,$with_gnu_ld"; then case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac else case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) m4_if($1, [], [ # Older versions of the 11.00 compiler do not understand -b yet # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) _LT_LINKER_OPTION([if $CC understands -b], _LT_TAGVAR(lt_cv_prog_compiler__b, $1), [-b], [_LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags'], [_LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'])], [_LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags']) ;; esac fi if test no = "$with_gnu_ld"; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: case $host_cpu in hppa*64*|ia64*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. _LT_TAGVAR(hardcode_minus_L, $1)=yes ;; esac fi ;; irix5* | irix6* | nonstopux*) if test yes = "$GCC"; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' # Try to use the -exported_symbol ld option, if it does not # work, assume that -exports_file does not work either and # implicitly export all symbols. # This should be the same for all languages, so no per-tag cache variable. AC_CACHE_CHECK([whether the $host_os linker accepts -exported_symbol], [lt_cv_irix_exported_symbol], [save_LDFLAGS=$LDFLAGS LDFLAGS="$LDFLAGS -shared $wl-exported_symbol ${wl}foo $wl-update_registry $wl/dev/null" AC_LINK_IFELSE( [AC_LANG_SOURCE( [AC_LANG_CASE([C], [[int foo (void) { return 0; }]], [C++], [[int foo (void) { return 0; }]], [Fortran 77], [[ subroutine foo end]], [Fortran], [[ subroutine foo end]])])], [lt_cv_irix_exported_symbol=yes], [lt_cv_irix_exported_symbol=no]) LDFLAGS=$save_LDFLAGS]) if test yes = "$lt_cv_irix_exported_symbol"; then _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations $wl-exports_file $wl$export_symbols -o $lib' fi _LT_TAGVAR(link_all_deplibs, $1)=no else _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -exports_file $export_symbols -o $lib' fi _LT_TAGVAR(archive_cmds_need_lc, $1)='no' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(inherit_rpath, $1)=yes _LT_TAGVAR(link_all_deplibs, $1)=yes ;; linux*) case $cc_basename in tcc*) # Fabrice Bellard et al's Tiny C Compiler _LT_TAGVAR(ld_shlibs, $1)=yes _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; netbsd* | netbsdelf*-gnu) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out else _LT_TAGVAR(archive_cmds, $1)='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; newsos6) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *nto* | *qnx*) ;; openbsd* | bitrig*) if test -f /usr/libexec/ld.so; then _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=yes if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags $wl-retain-symbols-file,$export_symbols' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' else _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' fi else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; os2*) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(allow_undefined_flag, $1)=unsupported shrext_cmds=.dll _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' _LT_TAGVAR(archive_expsym_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ prefix_cmds="$SED"~ if test EXPORTS = "`$SED 1q $export_symbols`"; then prefix_cmds="$prefix_cmds -e 1d"; fi~ prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' _LT_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes ;; osf3*) if test yes = "$GCC"; then _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-expect_unresolved $wl\*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' else _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' fi _LT_TAGVAR(archive_cmds_need_lc, $1)='no' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: ;; osf4* | osf5*) # as osf3* with the addition of -msym flag if test yes = "$GCC"; then _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-expect_unresolved $wl\*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $pic_flag $libobjs $deplibs $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' else _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ $CC -shared$allow_undefined_flag $wl-input $wl$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~$RM $lib.exp' # Both c and cxx compiler support -rpath directly _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' fi _LT_TAGVAR(archive_cmds_need_lc, $1)='no' _LT_TAGVAR(hardcode_libdir_separator, $1)=: ;; solaris*) _LT_TAGVAR(no_undefined_flag, $1)=' -z defs' if test yes = "$GCC"; then wlarc='$wl' _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $wl-z ${wl}text $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -shared $pic_flag $wl-z ${wl}text $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' else case `$CC -V 2>&1` in *"Compilers 5.0"*) wlarc='' _LT_TAGVAR(archive_cmds, $1)='$LD -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $LD -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' ;; *) wlarc='$wl' _LT_TAGVAR(archive_cmds, $1)='$CC -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' ;; esac fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no case $host_os in solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands '-z linker_flag'. GCC discards it without '$wl', # but is careful enough not to reorder. # Supported since Solaris 2.6 (maybe 2.5.1?) if test yes = "$GCC"; then _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract' else _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' fi ;; esac _LT_TAGVAR(link_all_deplibs, $1)=yes ;; sunos4*) if test sequent = "$host_vendor"; then # Use $CC to link under sequent, because it throws in some extra .o # files that make .init and .fini sections work. _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h $soname -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; sysv4) case $host_vendor in sni) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=yes # is this really true??? ;; siemens) ## LD is ld it makes a PLAMLIB ## CC just makes a GrossModule. _LT_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(reload_cmds, $1)='$CC -r -o $output$reload_objs' _LT_TAGVAR(hardcode_direct, $1)=no ;; motorola) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=no #Motorola manual says yes, but my tests say they lie ;; esac runpath_var='LD_RUN_PATH' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; sysv4.3*) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(export_dynamic_flag_spec, $1)='-Bexport' ;; sysv4*MP*) if test -d /usr/nec; then _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no runpath_var=LD_RUN_PATH hardcode_runpath_var=yes _LT_TAGVAR(ld_shlibs, $1)=yes fi ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) _LT_TAGVAR(no_undefined_flag, $1)='$wl-z,text' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no runpath_var='LD_RUN_PATH' if test yes = "$GCC"; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We CANNOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. _LT_TAGVAR(no_undefined_flag, $1)='$wl-z,text' _LT_TAGVAR(allow_undefined_flag, $1)='$wl-z,nodefs' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R,$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-Bexport' runpath_var='LD_RUN_PATH' if test yes = "$GCC"; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; uts4*) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) _LT_TAGVAR(ld_shlibs, $1)=no ;; esac if test sni = "$host_vendor"; then case $host in sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-Blargedynsym' ;; esac fi fi ]) AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) test no = "$_LT_TAGVAR(ld_shlibs, $1)" && can_build_shared=no _LT_TAGVAR(with_gnu_ld, $1)=$with_gnu_ld _LT_DECL([], [libext], [0], [Old archive suffix (normally "a")])dnl _LT_DECL([], [shrext_cmds], [1], [Shared library suffix (normally ".so")])dnl _LT_DECL([], [extract_expsyms_cmds], [2], [The commands to extract the exported symbol list from a shared archive]) # # Do we need to explicitly link libc? # case "x$_LT_TAGVAR(archive_cmds_need_lc, $1)" in x|xyes) # Assume -lc should be added _LT_TAGVAR(archive_cmds_need_lc, $1)=yes if test yes,yes = "$GCC,$enable_shared"; then case $_LT_TAGVAR(archive_cmds, $1) in *'~'*) # FIXME: we may have to deal with multi-command sequences. ;; '$CC '*) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. AC_CACHE_CHECK([whether -lc should be explicitly linked in], [lt_cv_]_LT_TAGVAR(archive_cmds_need_lc, $1), [$RM conftest* echo "$lt_simple_compile_test_code" > conftest.$ac_ext if AC_TRY_EVAL(ac_compile) 2>conftest.err; then soname=conftest lib=conftest libobjs=conftest.$ac_objext deplibs= wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) pic_flag=$_LT_TAGVAR(lt_prog_compiler_pic, $1) compiler_flags=-v linker_flags=-v verstring= output_objdir=. libname=conftest lt_save_allow_undefined_flag=$_LT_TAGVAR(allow_undefined_flag, $1) _LT_TAGVAR(allow_undefined_flag, $1)= if AC_TRY_EVAL(_LT_TAGVAR(archive_cmds, $1) 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) then lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=no else lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=yes fi _LT_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag else cat conftest.err 1>&5 fi $RM conftest* ]) _LT_TAGVAR(archive_cmds_need_lc, $1)=$lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1) ;; esac fi ;; esac _LT_TAGDECL([build_libtool_need_lc], [archive_cmds_need_lc], [0], [Whether or not to add -lc for building shared libraries]) _LT_TAGDECL([allow_libtool_libs_with_static_runtimes], [enable_shared_with_static_runtimes], [0], [Whether or not to disallow shared libs when runtime libs are static]) _LT_TAGDECL([], [export_dynamic_flag_spec], [1], [Compiler flag to allow reflexive dlopens]) _LT_TAGDECL([], [whole_archive_flag_spec], [1], [Compiler flag to generate shared objects directly from archives]) _LT_TAGDECL([], [compiler_needs_object], [1], [Whether the compiler copes with passing no objects directly]) _LT_TAGDECL([], [old_archive_from_new_cmds], [2], [Create an old-style archive from a shared archive]) _LT_TAGDECL([], [old_archive_from_expsyms_cmds], [2], [Create a temporary old-style archive to link instead of a shared archive]) _LT_TAGDECL([], [archive_cmds], [2], [Commands used to build a shared archive]) _LT_TAGDECL([], [archive_expsym_cmds], [2]) _LT_TAGDECL([], [module_cmds], [2], [Commands used to build a loadable module if different from building a shared archive.]) _LT_TAGDECL([], [module_expsym_cmds], [2]) _LT_TAGDECL([], [with_gnu_ld], [1], [Whether we are building with GNU ld or not]) _LT_TAGDECL([], [allow_undefined_flag], [1], [Flag that allows shared libraries with undefined symbols to be built]) _LT_TAGDECL([], [no_undefined_flag], [1], [Flag that enforces no undefined symbols]) _LT_TAGDECL([], [hardcode_libdir_flag_spec], [1], [Flag to hardcode $libdir into a binary during linking. This must work even if $libdir does not exist]) _LT_TAGDECL([], [hardcode_libdir_separator], [1], [Whether we need a single "-rpath" flag with a separated argument]) _LT_TAGDECL([], [hardcode_direct], [0], [Set to "yes" if using DIR/libNAME$shared_ext during linking hardcodes DIR into the resulting binary]) _LT_TAGDECL([], [hardcode_direct_absolute], [0], [Set to "yes" if using DIR/libNAME$shared_ext during linking hardcodes DIR into the resulting binary and the resulting library dependency is "absolute", i.e impossible to change by setting $shlibpath_var if the library is relocated]) _LT_TAGDECL([], [hardcode_minus_L], [0], [Set to "yes" if using the -LDIR flag during linking hardcodes DIR into the resulting binary]) _LT_TAGDECL([], [hardcode_shlibpath_var], [0], [Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into the resulting binary]) _LT_TAGDECL([], [hardcode_automatic], [0], [Set to "yes" if building a shared library automatically hardcodes DIR into the library and all subsequent libraries and executables linked against it]) _LT_TAGDECL([], [inherit_rpath], [0], [Set to yes if linker adds runtime paths of dependent libraries to runtime path list]) _LT_TAGDECL([], [link_all_deplibs], [0], [Whether libtool must link a program against all its dependency libraries]) _LT_TAGDECL([], [always_export_symbols], [0], [Set to "yes" if exported symbols are required]) _LT_TAGDECL([], [export_symbols_cmds], [2], [The commands to list exported symbols]) _LT_TAGDECL([], [exclude_expsyms], [1], [Symbols that should not be listed in the preloaded symbols]) _LT_TAGDECL([], [include_expsyms], [1], [Symbols that must always be exported]) _LT_TAGDECL([], [prelink_cmds], [2], [Commands necessary for linking programs (against libraries) with templates]) _LT_TAGDECL([], [postlink_cmds], [2], [Commands necessary for finishing linking programs]) _LT_TAGDECL([], [file_list_spec], [1], [Specify filename containing input files]) dnl FIXME: Not yet implemented dnl _LT_TAGDECL([], [thread_safe_flag_spec], [1], dnl [Compiler flag to generate thread safe objects]) ])# _LT_LINKER_SHLIBS # _LT_LANG_C_CONFIG([TAG]) # ------------------------ # Ensure that the configuration variables for a C compiler are suitably # defined. These variables are subsequently used by _LT_CONFIG to write # the compiler configuration to 'libtool'. m4_defun([_LT_LANG_C_CONFIG], [m4_require([_LT_DECL_EGREP])dnl lt_save_CC=$CC AC_LANG_PUSH(C) # Source file extension for C test sources. ac_ext=c # Object file extension for compiled C test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(){return(0);}' _LT_TAG_COMPILER # Save the default compiler, since it gets overwritten when the other # tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. compiler_DEFAULT=$CC # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... if test -n "$compiler"; then _LT_COMPILER_NO_RTTI($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) LT_SYS_DLOPEN_SELF _LT_CMD_STRIPLIB # Report what library types will actually be built AC_MSG_CHECKING([if libtool supports shared libraries]) AC_MSG_RESULT([$can_build_shared]) AC_MSG_CHECKING([whether to build shared libraries]) test no = "$can_build_shared" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test yes = "$enable_shared" && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[[4-9]]*) if test ia64 != "$host_cpu"; then case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in yes,aix,yes) ;; # shared object as lib.so file only yes,svr4,*) ;; # shared object as lib.so archive member only yes,*) enable_static=no ;; # shared object in lib.a archive as well esac fi ;; esac AC_MSG_RESULT([$enable_shared]) AC_MSG_CHECKING([whether to build static libraries]) # Make sure either enable_shared or enable_static is yes. test yes = "$enable_shared" || enable_static=yes AC_MSG_RESULT([$enable_static]) _LT_CONFIG($1) fi AC_LANG_POP CC=$lt_save_CC ])# _LT_LANG_C_CONFIG # _LT_LANG_CXX_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for a C++ compiler are suitably # defined. These variables are subsequently used by _LT_CONFIG to write # the compiler configuration to 'libtool'. m4_defun([_LT_LANG_CXX_CONFIG], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_PATH_MANIFEST_TOOL])dnl if test -n "$CXX" && ( test no != "$CXX" && ( (test g++ = "$CXX" && `g++ -v >/dev/null 2>&1` ) || (test g++ != "$CXX"))); then AC_PROG_CXXCPP else _lt_caught_CXX_error=yes fi AC_LANG_PUSH(C++) _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(compiler_needs_object, $1)=no _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds _LT_TAGVAR(no_undefined_flag, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no # Source file extension for C++ test sources. ac_ext=cpp # Object file extension for compiled C++ test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # No sense in running all these tests if we already determined that # the CXX compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test yes != "$_lt_caught_CXX_error"; then # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(int, char *[[]]) { return(0); }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_CFLAGS=$CFLAGS lt_save_LD=$LD lt_save_GCC=$GCC GCC=$GXX lt_save_with_gnu_ld=$with_gnu_ld lt_save_path_LD=$lt_cv_path_LD if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx else $as_unset lt_cv_prog_gnu_ld fi if test -n "${lt_cv_path_LDCXX+set}"; then lt_cv_path_LD=$lt_cv_path_LDCXX else $as_unset lt_cv_path_LD fi test -z "${LDCXX+set}" || LD=$LDCXX CC=${CXX-"c++"} CFLAGS=$CXXFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) if test -n "$compiler"; then # We don't want -fno-exception when compiling C++ code, so set the # no_builtin_flag separately if test yes = "$GXX"; then _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' else _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= fi if test yes = "$GXX"; then # Set up default GNU C++ configuration LT_PATH_LD # Check if GNU C++ uses GNU ld as the underlying linker, since the # archiving commands below assume that GNU ld is being used. if test yes = "$with_gnu_ld"; then _LT_TAGVAR(archive_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' # If archive_cmds runs LD, not CC, wlarc should be empty # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to # investigate it a little bit more. (MM) wlarc='$wl' # ancient GNU ld didn't support --whole-archive et. al. if eval "`$CC -print-prog-name=ld` --help 2>&1" | $GREP 'no-whole-archive' > /dev/null; then _LT_TAGVAR(whole_archive_flag_spec, $1)=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' else _LT_TAGVAR(whole_archive_flag_spec, $1)= fi else with_gnu_ld=no wlarc= # A generic and very simple default shared library creation # command for GNU C++ for the case where it uses the native # linker, instead of GNU ld. If possible, this setting should # overridden to take advantage of the native linker features on # the platform it is being used on. _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' fi # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP " \-L"' else GXX=no with_gnu_ld=no wlarc= fi # PORTME: fill in a description of your system's C++ link characteristics AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) _LT_TAGVAR(ld_shlibs, $1)=yes case $host_os in aix3*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; aix[[4-9]]*) if test ia64 = "$host_cpu"; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag= else aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # have runtime linking enabled, and use it for executables. # For shared libraries, we enable/disable runtime linking # depending on the kind of the shared library created - # when "with_aix_soname,aix_use_runtimelinking" is: # "aix,no" lib.a(lib.so.V) shared, rtl:no, for executables # "aix,yes" lib.so shared, rtl:yes, for executables # lib.a static archive # "both,no" lib.so.V(shr.o) shared, rtl:yes # lib.a(lib.so.V) shared, rtl:no, for executables # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables # lib.a(lib.so.V) shared, rtl:no # "svr4,*" lib.so.V(shr.o) shared, rtl:yes, for executables # lib.a static archive case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) for ld_flag in $LDFLAGS; do case $ld_flag in *-brtl*) aix_use_runtimelinking=yes break ;; esac done if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then # With aix-soname=svr4, we create the lib.so.V shared archives only, # so we don't have lib.a shared libs to link our executables. # We have to force runtime linking in this case. aix_use_runtimelinking=yes LDFLAGS="$LDFLAGS -Wl,-brtl" fi ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. _LT_TAGVAR(archive_cmds, $1)='' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(file_list_spec, $1)='$wl-f,' case $with_aix_soname,$aix_use_runtimelinking in aix,*) ;; # no import file svr4,* | *,yes) # use import file # The Import File defines what to hardcode. _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no ;; esac if test yes = "$GXX"; then case $host_os in aix4.[[012]]|aix4.[[012]].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`$CC -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 _LT_TAGVAR(hardcode_direct, $1)=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)= fi esac shared_flag='-shared' if test yes = "$aix_use_runtimelinking"; then shared_flag=$shared_flag' $wl-G' fi # Need to ensure runtime linking is disabled for the traditional # shared library, or the linker may eventually find shared libraries # /with/ Import File - we do not want to mix them. shared_flag_aix='-shared' shared_flag_svr4='-shared $wl-G' else # not using gcc if test ia64 = "$host_cpu"; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test yes = "$aix_use_runtimelinking"; then shared_flag='$wl-G' else shared_flag='$wl-bM:SRE' fi shared_flag_aix='$wl-bM:SRE' shared_flag_svr4='$wl-G' fi fi _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to # export. _LT_TAGVAR(always_export_symbols, $1)=yes if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. # The "-G" linker flag allows undefined symbols. _LT_TAGVAR(no_undefined_flag, $1)='-bernotok' # Determine the default libpath from the value encoded in an empty # executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-blibpath:$libdir:'"$aix_libpath" _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag else if test ia64 = "$host_cpu"; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R $libdir:/usr/lib:/lib' _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an # empty executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. _LT_TAGVAR(no_undefined_flag, $1)=' $wl-bernotok' _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-berok' if test yes = "$with_gnu_ld"; then # We only use this code for GNU lds that support --whole-archive. _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive$convenience $wl--no-whole-archive' else # Exported symbols can be pulled into shared objects from archives _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' fi _LT_TAGVAR(archive_cmds_need_lc, $1)=yes _LT_TAGVAR(archive_expsym_cmds, $1)='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d' # -brtl affects multiple linker settings, -berok does not and is overridden later compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([[, ]]\\)%-berok\\1%g"`' if test svr4 != "$with_aix_soname"; then # This is similar to how AIX traditionally builds its shared # libraries. Need -bnortl late, we may have -brtl in LDFLAGS. _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname' fi if test aix != "$with_aix_soname"; then _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp' else # used by -dlpreopen to get the symbols _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$MV $output_objdir/$realname.d/$soname $output_objdir' fi _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$RM -r $output_objdir/$realname.d' fi fi ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(allow_undefined_flag, $1)=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; chorus*) case $cc_basename in *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; cygwin* | mingw* | pw32* | cegcc*) case $GXX,$cc_basename in ,cl* | no,cl*) # Native MSVC # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=yes _LT_TAGVAR(file_list_spec, $1)='@' # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=.dll # FIXME: Setting linknames here is a bad hack. _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames=' _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then cp "$export_symbols" "$output_objdir/$soname.def"; echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp"; else $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp; fi~ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ linknames=' # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes # Don't use ranlib _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib' _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~ lt_tool_outputfile="@TOOL_OUTPUT@"~ case $lt_outputfile in *.exe|*.EXE) ;; *) lt_outputfile=$lt_outputfile.exe lt_tool_outputfile=$lt_tool_outputfile.exe ;; esac~ func_to_tool_file "$lt_outputfile"~ if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; $RM "$lt_outputfile.manifest"; fi' ;; *) # g++ # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, # as there is no search path for DLLs. _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-all-symbols' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file, use it as # is; otherwise, prepend EXPORTS... _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; darwin* | rhapsody*) _LT_DARWIN_LINKER_FEATURES($1) ;; os2*) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(allow_undefined_flag, $1)=unsupported shrext_cmds=.dll _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' _LT_TAGVAR(archive_expsym_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ prefix_cmds="$SED"~ if test EXPORTS = "`$SED 1q $export_symbols`"; then prefix_cmds="$prefix_cmds -e 1d"; fi~ prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' _LT_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes ;; dgux*) case $cc_basename in ec++*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; ghcx*) # Green Hills C++ Compiler # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; freebsd2.*) # C++ shared libraries reported to be fairly broken before # switch to ELF _LT_TAGVAR(ld_shlibs, $1)=no ;; freebsd-elf*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;; freebsd* | dragonfly*) # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF # conventions _LT_TAGVAR(ld_shlibs, $1)=yes ;; haiku*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(link_all_deplibs, $1)=yes ;; hpux9*) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, # but as the default # location of the library. case $cc_basename in CC*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; aCC*) _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -b $wl+b $wl$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP " \-L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test yes = "$GXX"; then _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' else # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; hpux10*|hpux11*) if test no = "$with_gnu_ld"; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: case $host_cpu in hppa*64*|ia64*) ;; *) _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' ;; esac fi case $host_cpu in hppa*64*|ia64*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, # but as the default # location of the library. ;; esac case $cc_basename in CC*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; aCC*) case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP " \-L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test yes = "$GXX"; then if test no = "$with_gnu_ld"; then case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC $wl+h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac fi else # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; interix[[3-9]]*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; irix5* | irix6*) case $cc_basename in CC*) # SGI C++ _LT_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' # Archives containing C++ object files must be created using # "CC -ar", where "CC" is the IRIX C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs' ;; *) if test yes = "$GXX"; then if test no = "$with_gnu_ld"; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' else _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` -o $lib' fi fi _LT_TAGVAR(link_all_deplibs, $1)=yes ;; esac _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(inherit_rpath, $1)=yes ;; linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib $wl-retain-symbols-file,$export_symbols; mv \$templib $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' # Archives containing C++ object files must be created using # "CC -Bstatic", where "CC" is the KAI C++ compiler. _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;; icpc* | ecpc* ) # Intel C++ with_gnu_ld=yes # version 8.0 and above of icpc choke on multiply defined symbols # if we add $predep_objects and $postdep_objects, however 7.1 and # earlier do not add the objects themselves. case `$CC -V 2>&1` in *"Version 7."*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' ;; *) # Version 8.0 or newer tmp_idyn= case $host_cpu in ia64*) tmp_idyn=' -i_dynamic';; esac _LT_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' ;; esac _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive$convenience $wl--no-whole-archive' ;; pgCC* | pgcpp*) # Portland Group C++ compiler case `$CC -V` in *pgCC\ [[1-5]].* | *pgcpp\ [[1-5]].*) _LT_TAGVAR(prelink_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~ compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"' _LT_TAGVAR(old_archive_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~ $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~ $RANLIB $oldlib' _LT_TAGVAR(archive_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' ;; *) # Version 6 and above use weak symbols _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' ;; esac _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl--rpath $wl$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' ;; cxx*) # Compaq C++ _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib $wl-retain-symbols-file $wl$export_symbols' runpath_var=LD_RUN_PATH _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed' ;; xl* | mpixl* | bgxl*) # IBM XL 8.0 on PPC, with GNU ld _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' _LT_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' if test yes = "$supports_anon_versioning"; then _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $CC -qmkshrobj $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib' fi ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' _LT_TAGVAR(archive_cmds, $1)='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-retain-symbols-file $wl$export_symbols' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' _LT_TAGVAR(compiler_needs_object, $1)=yes # Not sure whether something based on # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 # would be better. output_verbose_link_cmd='func_echo_all' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' ;; esac ;; esac ;; lynxos*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; m88k*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; mvs*) case $cc_basename in cxx*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' wlarc= _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no fi # Workaround some broken pre-1.5 toolchains output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' ;; *nto* | *qnx*) _LT_TAGVAR(ld_shlibs, $1)=yes ;; openbsd* | bitrig*) if test -f /usr/libexec/ld.so; then _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`"; then _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-retain-symbols-file,$export_symbols -o $lib' _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' _LT_TAGVAR(whole_archive_flag_spec, $1)=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' fi output_verbose_link_cmd=func_echo_all else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; osf3* | osf4* | osf5*) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Archives containing C++ object files must be created using # the KAI C++ compiler. case $host in osf3*) _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;; *) _LT_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs' ;; esac ;; RCC*) # Rational C++ 2.4.1 # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; cxx*) case $host in osf3*) _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-expect_unresolved $wl\*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $soname `test -n "$verstring" && func_echo_all "$wl-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' ;; *) _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ echo "-hidden">> $lib.exp~ $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname $wl-input $wl$lib.exp `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~ $RM $lib.exp' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' ;; esac _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test yes,no = "$GXX,$with_gnu_ld"; then _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-expect_unresolved $wl\*' case $host in osf3*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' ;; esac _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP " \-L"' else # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; psos*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; sunos4*) case $cc_basename in CC*) # Sun C++ 4.x # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; lcc*) # Lucid # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; solaris*) case $cc_basename in CC* | sunCC*) # Sun C++ 4.2, 5.x and Centerline C++ _LT_TAGVAR(archive_cmds_need_lc,$1)=yes _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' _LT_TAGVAR(archive_cmds, $1)='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G$allow_undefined_flag $wl-M $wl$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no case $host_os in solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands '-z linker_flag'. # Supported since Solaris 2.6 (maybe 2.5.1?) _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' ;; esac _LT_TAGVAR(link_all_deplibs, $1)=yes output_verbose_link_cmd='func_echo_all' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' ;; gcx*) # Green Hills C++ Compiler _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib' # The C++ compiler must be used to create the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs' ;; *) # GNU C++ compiler with Solaris linker if test yes,no = "$GXX,$with_gnu_ld"; then _LT_TAGVAR(no_undefined_flag, $1)=' $wl-z ${wl}defs' if $CC --version | $GREP -v '^2\.7' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -shared $pic_flag -nostdlib $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP " \-L"' else # g++ 2.7 appears to require '-G' NOT '-shared' on this # platform. _LT_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G -nostdlib $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP " \-L"' fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R $wl$libdir' case $host_os in solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; *) _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract' ;; esac fi ;; esac ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) _LT_TAGVAR(no_undefined_flag, $1)='$wl-z,text' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no runpath_var='LD_RUN_PATH' case $cc_basename in CC*) _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We CANNOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. _LT_TAGVAR(no_undefined_flag, $1)='$wl-z,text' _LT_TAGVAR(allow_undefined_flag, $1)='$wl-z,nodefs' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R,$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-Bexport' runpath_var='LD_RUN_PATH' case $cc_basename in CC*) _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(old_archive_cmds, $1)='$CC -Tprelink_objects $oldobjs~ '"$_LT_TAGVAR(old_archive_cmds, $1)" _LT_TAGVAR(reload_cmds, $1)='$CC -Tprelink_objects $reload_objs~ '"$_LT_TAGVAR(reload_cmds, $1)" ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; tandem*) case $cc_basename in NCC*) # NonStop-UX NCC 3.20 # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; vxworks*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) test no = "$_LT_TAGVAR(ld_shlibs, $1)" && can_build_shared=no _LT_TAGVAR(GCC, $1)=$GXX _LT_TAGVAR(LD, $1)=$LD ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... _LT_SYS_HIDDEN_LIBDEPS($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi # test -n "$compiler" CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS LDCXX=$LD LD=$lt_save_LD GCC=$lt_save_GCC with_gnu_ld=$lt_save_with_gnu_ld lt_cv_path_LDCXX=$lt_cv_path_LD lt_cv_path_LD=$lt_save_path_LD lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld fi # test yes != "$_lt_caught_CXX_error" AC_LANG_POP ])# _LT_LANG_CXX_CONFIG # _LT_FUNC_STRIPNAME_CNF # ---------------------- # func_stripname_cnf prefix suffix name # strip PREFIX and SUFFIX off of NAME. # PREFIX and SUFFIX must not contain globbing or regex special # characters, hashes, percent signs, but SUFFIX may contain a leading # dot (in which case that matches only a dot). # # This function is identical to the (non-XSI) version of func_stripname, # except this one can be used by m4 code that may be executed by configure, # rather than the libtool script. m4_defun([_LT_FUNC_STRIPNAME_CNF],[dnl AC_REQUIRE([_LT_DECL_SED]) AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH]) func_stripname_cnf () { case @S|@2 in .*) func_stripname_result=`$ECHO "@S|@3" | $SED "s%^@S|@1%%; s%\\\\@S|@2\$%%"`;; *) func_stripname_result=`$ECHO "@S|@3" | $SED "s%^@S|@1%%; s%@S|@2\$%%"`;; esac } # func_stripname_cnf ])# _LT_FUNC_STRIPNAME_CNF # _LT_SYS_HIDDEN_LIBDEPS([TAGNAME]) # --------------------------------- # Figure out "hidden" library dependencies from verbose # compiler output when linking a shared library. # Parse the compiler output and extract the necessary # objects, libraries and library flags. m4_defun([_LT_SYS_HIDDEN_LIBDEPS], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl AC_REQUIRE([_LT_FUNC_STRIPNAME_CNF])dnl # Dependencies to place before and after the object being linked: _LT_TAGVAR(predep_objects, $1)= _LT_TAGVAR(postdep_objects, $1)= _LT_TAGVAR(predeps, $1)= _LT_TAGVAR(postdeps, $1)= _LT_TAGVAR(compiler_lib_search_path, $1)= dnl we can't use the lt_simple_compile_test_code here, dnl because it contains code intended for an executable, dnl not a library. It's possible we should let each dnl tag define a new lt_????_link_test_code variable, dnl but it's only used here... m4_if([$1], [], [cat > conftest.$ac_ext <<_LT_EOF int a; void foo (void) { a = 0; } _LT_EOF ], [$1], [CXX], [cat > conftest.$ac_ext <<_LT_EOF class Foo { public: Foo (void) { a = 0; } private: int a; }; _LT_EOF ], [$1], [F77], [cat > conftest.$ac_ext <<_LT_EOF subroutine foo implicit none integer*4 a a=0 return end _LT_EOF ], [$1], [FC], [cat > conftest.$ac_ext <<_LT_EOF subroutine foo implicit none integer a a=0 return end _LT_EOF ], [$1], [GCJ], [cat > conftest.$ac_ext <<_LT_EOF public class foo { private int a; public void bar (void) { a = 0; } }; _LT_EOF ], [$1], [GO], [cat > conftest.$ac_ext <<_LT_EOF package foo func foo() { } _LT_EOF ]) _lt_libdeps_save_CFLAGS=$CFLAGS case "$CC $CFLAGS " in #( *\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;; *\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;; *\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;; esac dnl Parse the compiler output and extract the necessary dnl objects, libraries and library flags. if AC_TRY_EVAL(ac_compile); then # Parse the compiler output and extract the necessary # objects, libraries and library flags. # Sentinel used to keep track of whether or not we are before # the conftest object file. pre_test_object_deps_done=no for p in `eval "$output_verbose_link_cmd"`; do case $prev$p in -L* | -R* | -l*) # Some compilers place space between "-{L,R}" and the path. # Remove the space. if test x-L = "$p" || test x-R = "$p"; then prev=$p continue fi # Expand the sysroot to ease extracting the directories later. if test -z "$prev"; then case $p in -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;; -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;; -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;; esac fi case $p in =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;; esac if test no = "$pre_test_object_deps_done"; then case $prev in -L | -R) # Internal compiler library paths should come after those # provided the user. The postdeps already come after the # user supplied libs so there is no need to process them. if test -z "$_LT_TAGVAR(compiler_lib_search_path, $1)"; then _LT_TAGVAR(compiler_lib_search_path, $1)=$prev$p else _LT_TAGVAR(compiler_lib_search_path, $1)="${_LT_TAGVAR(compiler_lib_search_path, $1)} $prev$p" fi ;; # The "-l" case would never come before the object being # linked, so don't bother handling this case. esac else if test -z "$_LT_TAGVAR(postdeps, $1)"; then _LT_TAGVAR(postdeps, $1)=$prev$p else _LT_TAGVAR(postdeps, $1)="${_LT_TAGVAR(postdeps, $1)} $prev$p" fi fi prev= ;; *.lto.$objext) ;; # Ignore GCC LTO objects *.$objext) # This assumes that the test object file only shows up # once in the compiler output. if test "$p" = "conftest.$objext"; then pre_test_object_deps_done=yes continue fi if test no = "$pre_test_object_deps_done"; then if test -z "$_LT_TAGVAR(predep_objects, $1)"; then _LT_TAGVAR(predep_objects, $1)=$p else _LT_TAGVAR(predep_objects, $1)="$_LT_TAGVAR(predep_objects, $1) $p" fi else if test -z "$_LT_TAGVAR(postdep_objects, $1)"; then _LT_TAGVAR(postdep_objects, $1)=$p else _LT_TAGVAR(postdep_objects, $1)="$_LT_TAGVAR(postdep_objects, $1) $p" fi fi ;; *) ;; # Ignore the rest. esac done # Clean up. rm -f a.out a.exe else echo "libtool.m4: error: problem compiling $1 test program" fi $RM -f confest.$objext CFLAGS=$_lt_libdeps_save_CFLAGS # PORTME: override above test on systems where it is broken m4_if([$1], [CXX], [case $host_os in interix[[3-9]]*) # Interix 3.5 installs completely hosed .la files for C++, so rather than # hack all around it, let's just trust "g++" to DTRT. _LT_TAGVAR(predep_objects,$1)= _LT_TAGVAR(postdep_objects,$1)= _LT_TAGVAR(postdeps,$1)= ;; esac ]) case " $_LT_TAGVAR(postdeps, $1) " in *" -lc "*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;; esac _LT_TAGVAR(compiler_lib_search_dirs, $1)= if test -n "${_LT_TAGVAR(compiler_lib_search_path, $1)}"; then _LT_TAGVAR(compiler_lib_search_dirs, $1)=`echo " ${_LT_TAGVAR(compiler_lib_search_path, $1)}" | $SED -e 's! -L! !g' -e 's!^ !!'` fi _LT_TAGDECL([], [compiler_lib_search_dirs], [1], [The directories searched by this compiler when creating a shared library]) _LT_TAGDECL([], [predep_objects], [1], [Dependencies to place before and after the objects being linked to create a shared library]) _LT_TAGDECL([], [postdep_objects], [1]) _LT_TAGDECL([], [predeps], [1]) _LT_TAGDECL([], [postdeps], [1]) _LT_TAGDECL([], [compiler_lib_search_path], [1], [The library search path used internally by the compiler when linking a shared library]) ])# _LT_SYS_HIDDEN_LIBDEPS # _LT_LANG_F77_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for a Fortran 77 compiler are # suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to 'libtool'. m4_defun([_LT_LANG_F77_CONFIG], [AC_LANG_PUSH(Fortran 77) if test -z "$F77" || test no = "$F77"; then _lt_disable_F77=yes fi _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds _LT_TAGVAR(no_undefined_flag, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no # Source file extension for f77 test sources. ac_ext=f # Object file extension for compiled f77 test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # No sense in running all these tests if we already determined that # the F77 compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test yes != "$_lt_disable_F77"; then # Code to be used in simple compile tests lt_simple_compile_test_code="\ subroutine t return end " # Code to be used in simple link tests lt_simple_link_test_code="\ program t end " # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_GCC=$GCC lt_save_CFLAGS=$CFLAGS CC=${F77-"f77"} CFLAGS=$FFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) GCC=$G77 if test -n "$compiler"; then AC_MSG_CHECKING([if libtool supports shared libraries]) AC_MSG_RESULT([$can_build_shared]) AC_MSG_CHECKING([whether to build shared libraries]) test no = "$can_build_shared" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test yes = "$enable_shared" && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[[4-9]]*) if test ia64 != "$host_cpu"; then case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in yes,aix,yes) ;; # shared object as lib.so file only yes,svr4,*) ;; # shared object as lib.so archive member only yes,*) enable_static=no ;; # shared object in lib.a archive as well esac fi ;; esac AC_MSG_RESULT([$enable_shared]) AC_MSG_CHECKING([whether to build static libraries]) # Make sure either enable_shared or enable_static is yes. test yes = "$enable_shared" || enable_static=yes AC_MSG_RESULT([$enable_static]) _LT_TAGVAR(GCC, $1)=$G77 _LT_TAGVAR(LD, $1)=$LD ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi # test -n "$compiler" GCC=$lt_save_GCC CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS fi # test yes != "$_lt_disable_F77" AC_LANG_POP ])# _LT_LANG_F77_CONFIG # _LT_LANG_FC_CONFIG([TAG]) # ------------------------- # Ensure that the configuration variables for a Fortran compiler are # suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to 'libtool'. m4_defun([_LT_LANG_FC_CONFIG], [AC_LANG_PUSH(Fortran) if test -z "$FC" || test no = "$FC"; then _lt_disable_FC=yes fi _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds _LT_TAGVAR(no_undefined_flag, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no # Source file extension for fc test sources. ac_ext=${ac_fc_srcext-f} # Object file extension for compiled fc test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # No sense in running all these tests if we already determined that # the FC compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test yes != "$_lt_disable_FC"; then # Code to be used in simple compile tests lt_simple_compile_test_code="\ subroutine t return end " # Code to be used in simple link tests lt_simple_link_test_code="\ program t end " # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_GCC=$GCC lt_save_CFLAGS=$CFLAGS CC=${FC-"f95"} CFLAGS=$FCFLAGS compiler=$CC GCC=$ac_cv_fc_compiler_gnu _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) if test -n "$compiler"; then AC_MSG_CHECKING([if libtool supports shared libraries]) AC_MSG_RESULT([$can_build_shared]) AC_MSG_CHECKING([whether to build shared libraries]) test no = "$can_build_shared" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test yes = "$enable_shared" && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[[4-9]]*) if test ia64 != "$host_cpu"; then case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in yes,aix,yes) ;; # shared object as lib.so file only yes,svr4,*) ;; # shared object as lib.so archive member only yes,*) enable_static=no ;; # shared object in lib.a archive as well esac fi ;; esac AC_MSG_RESULT([$enable_shared]) AC_MSG_CHECKING([whether to build static libraries]) # Make sure either enable_shared or enable_static is yes. test yes = "$enable_shared" || enable_static=yes AC_MSG_RESULT([$enable_static]) _LT_TAGVAR(GCC, $1)=$ac_cv_fc_compiler_gnu _LT_TAGVAR(LD, $1)=$LD ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... _LT_SYS_HIDDEN_LIBDEPS($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi # test -n "$compiler" GCC=$lt_save_GCC CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS fi # test yes != "$_lt_disable_FC" AC_LANG_POP ])# _LT_LANG_FC_CONFIG # _LT_LANG_GCJ_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for the GNU Java Compiler compiler # are suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to 'libtool'. m4_defun([_LT_LANG_GCJ_CONFIG], [AC_REQUIRE([LT_PROG_GCJ])dnl AC_LANG_SAVE # Source file extension for Java test sources. ac_ext=java # Object file extension for compiled Java test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="class foo {}" # Code to be used in simple link tests lt_simple_link_test_code='public class conftest { public static void main(String[[]] argv) {}; }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_CFLAGS=$CFLAGS lt_save_GCC=$GCC GCC=yes CC=${GCJ-"gcj"} CFLAGS=$GCJFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_TAGVAR(LD, $1)=$LD _LT_CC_BASENAME([$compiler]) # GCJ did not exist at the time GCC didn't implicitly link libc in. _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... if test -n "$compiler"; then _LT_COMPILER_NO_RTTI($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi AC_LANG_RESTORE GCC=$lt_save_GCC CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS ])# _LT_LANG_GCJ_CONFIG # _LT_LANG_GO_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for the GNU Go compiler # are suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to 'libtool'. m4_defun([_LT_LANG_GO_CONFIG], [AC_REQUIRE([LT_PROG_GO])dnl AC_LANG_SAVE # Source file extension for Go test sources. ac_ext=go # Object file extension for compiled Go test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="package main; func main() { }" # Code to be used in simple link tests lt_simple_link_test_code='package main; func main() { }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_CFLAGS=$CFLAGS lt_save_GCC=$GCC GCC=yes CC=${GOC-"gccgo"} CFLAGS=$GOFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_TAGVAR(LD, $1)=$LD _LT_CC_BASENAME([$compiler]) # Go did not exist at the time GCC didn't implicitly link libc in. _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... if test -n "$compiler"; then _LT_COMPILER_NO_RTTI($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi AC_LANG_RESTORE GCC=$lt_save_GCC CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS ])# _LT_LANG_GO_CONFIG # _LT_LANG_RC_CONFIG([TAG]) # ------------------------- # Ensure that the configuration variables for the Windows resource compiler # are suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to 'libtool'. m4_defun([_LT_LANG_RC_CONFIG], [AC_REQUIRE([LT_PROG_RC])dnl AC_LANG_SAVE # Source file extension for RC test sources. ac_ext=rc # Object file extension for compiled RC test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }' # Code to be used in simple link tests lt_simple_link_test_code=$lt_simple_compile_test_code # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_CFLAGS=$CFLAGS lt_save_GCC=$GCC GCC= CC=${RC-"windres"} CFLAGS= compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes if test -n "$compiler"; then : _LT_CONFIG($1) fi GCC=$lt_save_GCC AC_LANG_RESTORE CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS ])# _LT_LANG_RC_CONFIG # LT_PROG_GCJ # ----------- AC_DEFUN([LT_PROG_GCJ], [m4_ifdef([AC_PROG_GCJ], [AC_PROG_GCJ], [m4_ifdef([A][M_PROG_GCJ], [A][M_PROG_GCJ], [AC_CHECK_TOOL(GCJ, gcj,) test set = "${GCJFLAGS+set}" || GCJFLAGS="-g -O2" AC_SUBST(GCJFLAGS)])])[]dnl ]) # Old name: AU_ALIAS([LT_AC_PROG_GCJ], [LT_PROG_GCJ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([LT_AC_PROG_GCJ], []) # LT_PROG_GO # ---------- AC_DEFUN([LT_PROG_GO], [AC_CHECK_TOOL(GOC, gccgo,) ]) # LT_PROG_RC # ---------- AC_DEFUN([LT_PROG_RC], [AC_CHECK_TOOL(RC, windres,) ]) # Old name: AU_ALIAS([LT_AC_PROG_RC], [LT_PROG_RC]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([LT_AC_PROG_RC], []) # _LT_DECL_EGREP # -------------- # If we don't have a new enough Autoconf to choose the best grep # available, choose the one first in the user's PATH. m4_defun([_LT_DECL_EGREP], [AC_REQUIRE([AC_PROG_EGREP])dnl AC_REQUIRE([AC_PROG_FGREP])dnl test -z "$GREP" && GREP=grep _LT_DECL([], [GREP], [1], [A grep program that handles long lines]) _LT_DECL([], [EGREP], [1], [An ERE matcher]) _LT_DECL([], [FGREP], [1], [A literal string matcher]) dnl Non-bleeding-edge autoconf doesn't subst GREP, so do it here too AC_SUBST([GREP]) ]) # _LT_DECL_OBJDUMP # -------------- # If we don't have a new enough Autoconf to choose the best objdump # available, choose the one first in the user's PATH. m4_defun([_LT_DECL_OBJDUMP], [AC_CHECK_TOOL(OBJDUMP, objdump, false) test -z "$OBJDUMP" && OBJDUMP=objdump _LT_DECL([], [OBJDUMP], [1], [An object symbol dumper]) AC_SUBST([OBJDUMP]) ]) # _LT_DECL_DLLTOOL # ---------------- # Ensure DLLTOOL variable is set. m4_defun([_LT_DECL_DLLTOOL], [AC_CHECK_TOOL(DLLTOOL, dlltool, false) test -z "$DLLTOOL" && DLLTOOL=dlltool _LT_DECL([], [DLLTOOL], [1], [DLL creation program]) AC_SUBST([DLLTOOL]) ]) # _LT_DECL_SED # ------------ # Check for a fully-functional sed program, that truncates # as few characters as possible. Prefer GNU sed if found. m4_defun([_LT_DECL_SED], [AC_PROG_SED test -z "$SED" && SED=sed Xsed="$SED -e 1s/^X//" _LT_DECL([], [SED], [1], [A sed program that does not truncate output]) _LT_DECL([], [Xsed], ["\$SED -e 1s/^X//"], [Sed that helps us avoid accidentally triggering echo(1) options like -n]) ])# _LT_DECL_SED m4_ifndef([AC_PROG_SED], [ ############################################################ # NOTE: This macro has been submitted for inclusion into # # GNU Autoconf as AC_PROG_SED. When it is available in # # a released version of Autoconf we should remove this # # macro and use it instead. # ############################################################ m4_defun([AC_PROG_SED], [AC_MSG_CHECKING([for a sed that does not truncate output]) AC_CACHE_VAL(lt_cv_path_SED, [# Loop through the user's path and test for sed and gsed. # Then use that list of sed's as ones to test for truncation. as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for lt_ac_prog in sed gsed; do for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext" fi done done done IFS=$as_save_IFS lt_ac_max=0 lt_ac_count=0 # Add /usr/xpg4/bin/sed as it is typically found on Solaris # along with /bin/sed that truncates output. for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do test ! -f "$lt_ac_sed" && continue cat /dev/null > conftest.in lt_ac_count=0 echo $ECHO_N "0123456789$ECHO_C" >conftest.in # Check for GNU sed and select it if it is found. if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then lt_cv_path_SED=$lt_ac_sed break fi while true; do cat conftest.in conftest.in >conftest.tmp mv conftest.tmp conftest.in cp conftest.in conftest.nl echo >>conftest.nl $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break cmp -s conftest.out conftest.nl || break # 10000 chars as input seems more than enough test 10 -lt "$lt_ac_count" && break lt_ac_count=`expr $lt_ac_count + 1` if test "$lt_ac_count" -gt "$lt_ac_max"; then lt_ac_max=$lt_ac_count lt_cv_path_SED=$lt_ac_sed fi done done ]) SED=$lt_cv_path_SED AC_SUBST([SED]) AC_MSG_RESULT([$SED]) ])#AC_PROG_SED ])#m4_ifndef # Old name: AU_ALIAS([LT_AC_PROG_SED], [AC_PROG_SED]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([LT_AC_PROG_SED], []) # _LT_CHECK_SHELL_FEATURES # ------------------------ # Find out whether the shell is Bourne or XSI compatible, # or has some other useful features. m4_defun([_LT_CHECK_SHELL_FEATURES], [if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then lt_unset=unset else lt_unset=false fi _LT_DECL([], [lt_unset], [0], [whether the shell understands "unset"])dnl # test EBCDIC or ASCII case `echo X|tr X '\101'` in A) # ASCII based system # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr lt_SP2NL='tr \040 \012' lt_NL2SP='tr \015\012 \040\040' ;; *) # EBCDIC based system lt_SP2NL='tr \100 \n' lt_NL2SP='tr \r\n \100\100' ;; esac _LT_DECL([SP2NL], [lt_SP2NL], [1], [turn spaces into newlines])dnl _LT_DECL([NL2SP], [lt_NL2SP], [1], [turn newlines into spaces])dnl ])# _LT_CHECK_SHELL_FEATURES # _LT_PATH_CONVERSION_FUNCTIONS # ----------------------------- # Determine what file name conversion functions should be used by # func_to_host_file (and, implicitly, by func_to_host_path). These are needed # for certain cross-compile configurations and native mingw. m4_defun([_LT_PATH_CONVERSION_FUNCTIONS], [AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_CANONICAL_BUILD])dnl AC_MSG_CHECKING([how to convert $build file names to $host format]) AC_CACHE_VAL(lt_cv_to_host_file_cmd, [case $host in *-*-mingw* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32 ;; *-*-cygwin* ) lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32 ;; * ) # otherwise, assume *nix lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32 ;; esac ;; *-*-cygwin* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin ;; *-*-cygwin* ) lt_cv_to_host_file_cmd=func_convert_file_noop ;; * ) # otherwise, assume *nix lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin ;; esac ;; * ) # unhandled hosts (and "normal" native builds) lt_cv_to_host_file_cmd=func_convert_file_noop ;; esac ]) to_host_file_cmd=$lt_cv_to_host_file_cmd AC_MSG_RESULT([$lt_cv_to_host_file_cmd]) _LT_DECL([to_host_file_cmd], [lt_cv_to_host_file_cmd], [0], [convert $build file names to $host format])dnl AC_MSG_CHECKING([how to convert $build file names to toolchain format]) AC_CACHE_VAL(lt_cv_to_tool_file_cmd, [#assume ordinary cross tools, or native build. lt_cv_to_tool_file_cmd=func_convert_file_noop case $host in *-*-mingw* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32 ;; esac ;; esac ]) to_tool_file_cmd=$lt_cv_to_tool_file_cmd AC_MSG_RESULT([$lt_cv_to_tool_file_cmd]) _LT_DECL([to_tool_file_cmd], [lt_cv_to_tool_file_cmd], [0], [convert $build files to toolchain format])dnl ])# _LT_PATH_CONVERSION_FUNCTIONS pspp-1.4.1/m4/ltsugar.m40000644000175000017500000001044013725006215014356 0ustar00blpblp00000000000000# ltsugar.m4 -- libtool m4 base layer. -*-Autoconf-*- # # Copyright (C) 2004-2005, 2007-2008, 2011-2015 Free Software # Foundation, Inc. # Written by Gary V. Vaughan, 2004 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # serial 6 ltsugar.m4 # This is to help aclocal find these macros, as it can't see m4_define. AC_DEFUN([LTSUGAR_VERSION], [m4_if([0.1])]) # lt_join(SEP, ARG1, [ARG2...]) # ----------------------------- # Produce ARG1SEPARG2...SEPARGn, omitting [] arguments and their # associated separator. # Needed until we can rely on m4_join from Autoconf 2.62, since all earlier # versions in m4sugar had bugs. m4_define([lt_join], [m4_if([$#], [1], [], [$#], [2], [[$2]], [m4_if([$2], [], [], [[$2]_])$0([$1], m4_shift(m4_shift($@)))])]) m4_define([_lt_join], [m4_if([$#$2], [2], [], [m4_if([$2], [], [], [[$1$2]])$0([$1], m4_shift(m4_shift($@)))])]) # lt_car(LIST) # lt_cdr(LIST) # ------------ # Manipulate m4 lists. # These macros are necessary as long as will still need to support # Autoconf-2.59, which quotes differently. m4_define([lt_car], [[$1]]) m4_define([lt_cdr], [m4_if([$#], 0, [m4_fatal([$0: cannot be called without arguments])], [$#], 1, [], [m4_dquote(m4_shift($@))])]) m4_define([lt_unquote], $1) # lt_append(MACRO-NAME, STRING, [SEPARATOR]) # ------------------------------------------ # Redefine MACRO-NAME to hold its former content plus 'SEPARATOR''STRING'. # Note that neither SEPARATOR nor STRING are expanded; they are appended # to MACRO-NAME as is (leaving the expansion for when MACRO-NAME is invoked). # No SEPARATOR is output if MACRO-NAME was previously undefined (different # than defined and empty). # # This macro is needed until we can rely on Autoconf 2.62, since earlier # versions of m4sugar mistakenly expanded SEPARATOR but not STRING. m4_define([lt_append], [m4_define([$1], m4_ifdef([$1], [m4_defn([$1])[$3]])[$2])]) # lt_combine(SEP, PREFIX-LIST, INFIX, SUFFIX1, [SUFFIX2...]) # ---------------------------------------------------------- # Produce a SEP delimited list of all paired combinations of elements of # PREFIX-LIST with SUFFIX1 through SUFFIXn. Each element of the list # has the form PREFIXmINFIXSUFFIXn. # Needed until we can rely on m4_combine added in Autoconf 2.62. m4_define([lt_combine], [m4_if(m4_eval([$# > 3]), [1], [m4_pushdef([_Lt_sep], [m4_define([_Lt_sep], m4_defn([lt_car]))])]]dnl [[m4_foreach([_Lt_prefix], [$2], [m4_foreach([_Lt_suffix], ]m4_dquote(m4_dquote(m4_shift(m4_shift(m4_shift($@)))))[, [_Lt_sep([$1])[]m4_defn([_Lt_prefix])[$3]m4_defn([_Lt_suffix])])])])]) # lt_if_append_uniq(MACRO-NAME, VARNAME, [SEPARATOR], [UNIQ], [NOT-UNIQ]) # ----------------------------------------------------------------------- # Iff MACRO-NAME does not yet contain VARNAME, then append it (delimited # by SEPARATOR if supplied) and expand UNIQ, else NOT-UNIQ. m4_define([lt_if_append_uniq], [m4_ifdef([$1], [m4_if(m4_index([$3]m4_defn([$1])[$3], [$3$2$3]), [-1], [lt_append([$1], [$2], [$3])$4], [$5])], [lt_append([$1], [$2], [$3])$4])]) # lt_dict_add(DICT, KEY, VALUE) # ----------------------------- m4_define([lt_dict_add], [m4_define([$1($2)], [$3])]) # lt_dict_add_subkey(DICT, KEY, SUBKEY, VALUE) # -------------------------------------------- m4_define([lt_dict_add_subkey], [m4_define([$1($2:$3)], [$4])]) # lt_dict_fetch(DICT, KEY, [SUBKEY]) # ---------------------------------- m4_define([lt_dict_fetch], [m4_ifval([$3], m4_ifdef([$1($2:$3)], [m4_defn([$1($2:$3)])]), m4_ifdef([$1($2)], [m4_defn([$1($2)])]))]) # lt_if_dict_fetch(DICT, KEY, [SUBKEY], VALUE, IF-TRUE, [IF-FALSE]) # ----------------------------------------------------------------- m4_define([lt_if_dict_fetch], [m4_if(lt_dict_fetch([$1], [$2], [$3]), [$4], [$5], [$6])]) # lt_dict_filter(DICT, [SUBKEY], VALUE, [SEPARATOR], KEY, [...]) # -------------------------------------------------------------- m4_define([lt_dict_filter], [m4_if([$5], [], [], [lt_join(m4_quote(m4_default([$4], [[, ]])), lt_unquote(m4_split(m4_normalize(m4_foreach(_Lt_key, lt_car([m4_shiftn(4, $@)]), [lt_if_dict_fetch([$1], _Lt_key, [$2], [$3], [_Lt_key ])])))))])[]dnl ]) pspp-1.4.1/m4/lt~obsolete.m40000644000175000017500000001377413725006215015264 0ustar00blpblp00000000000000# lt~obsolete.m4 -- aclocal satisfying obsolete definitions. -*-Autoconf-*- # # Copyright (C) 2004-2005, 2007, 2009, 2011-2015 Free Software # Foundation, Inc. # Written by Scott James Remnant, 2004. # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # serial 5 lt~obsolete.m4 # These exist entirely to fool aclocal when bootstrapping libtool. # # In the past libtool.m4 has provided macros via AC_DEFUN (or AU_DEFUN), # which have later been changed to m4_define as they aren't part of the # exported API, or moved to Autoconf or Automake where they belong. # # The trouble is, aclocal is a bit thick. It'll see the old AC_DEFUN # in /usr/share/aclocal/libtool.m4 and remember it, then when it sees us # using a macro with the same name in our local m4/libtool.m4 it'll # pull the old libtool.m4 in (it doesn't see our shiny new m4_define # and doesn't know about Autoconf macros at all.) # # So we provide this file, which has a silly filename so it's always # included after everything else. This provides aclocal with the # AC_DEFUNs it wants, but when m4 processes it, it doesn't do anything # because those macros already exist, or will be overwritten later. # We use AC_DEFUN over AU_DEFUN for compatibility with aclocal-1.6. # # Anytime we withdraw an AC_DEFUN or AU_DEFUN, remember to add it here. # Yes, that means every name once taken will need to remain here until # we give up compatibility with versions before 1.7, at which point # we need to keep only those names which we still refer to. # This is to help aclocal find these macros, as it can't see m4_define. AC_DEFUN([LTOBSOLETE_VERSION], [m4_if([1])]) m4_ifndef([AC_LIBTOOL_LINKER_OPTION], [AC_DEFUN([AC_LIBTOOL_LINKER_OPTION])]) m4_ifndef([AC_PROG_EGREP], [AC_DEFUN([AC_PROG_EGREP])]) m4_ifndef([_LT_AC_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH])]) m4_ifndef([_LT_AC_SHELL_INIT], [AC_DEFUN([_LT_AC_SHELL_INIT])]) m4_ifndef([_LT_AC_SYS_LIBPATH_AIX], [AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX])]) m4_ifndef([_LT_PROG_LTMAIN], [AC_DEFUN([_LT_PROG_LTMAIN])]) m4_ifndef([_LT_AC_TAGVAR], [AC_DEFUN([_LT_AC_TAGVAR])]) m4_ifndef([AC_LTDL_ENABLE_INSTALL], [AC_DEFUN([AC_LTDL_ENABLE_INSTALL])]) m4_ifndef([AC_LTDL_PREOPEN], [AC_DEFUN([AC_LTDL_PREOPEN])]) m4_ifndef([_LT_AC_SYS_COMPILER], [AC_DEFUN([_LT_AC_SYS_COMPILER])]) m4_ifndef([_LT_AC_LOCK], [AC_DEFUN([_LT_AC_LOCK])]) m4_ifndef([AC_LIBTOOL_SYS_OLD_ARCHIVE], [AC_DEFUN([AC_LIBTOOL_SYS_OLD_ARCHIVE])]) m4_ifndef([_LT_AC_TRY_DLOPEN_SELF], [AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF])]) m4_ifndef([AC_LIBTOOL_PROG_CC_C_O], [AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O])]) m4_ifndef([AC_LIBTOOL_SYS_HARD_LINK_LOCKS], [AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS])]) m4_ifndef([AC_LIBTOOL_OBJDIR], [AC_DEFUN([AC_LIBTOOL_OBJDIR])]) m4_ifndef([AC_LTDL_OBJDIR], [AC_DEFUN([AC_LTDL_OBJDIR])]) m4_ifndef([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH], [AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH])]) m4_ifndef([AC_LIBTOOL_SYS_LIB_STRIP], [AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP])]) m4_ifndef([AC_PATH_MAGIC], [AC_DEFUN([AC_PATH_MAGIC])]) m4_ifndef([AC_PROG_LD_GNU], [AC_DEFUN([AC_PROG_LD_GNU])]) m4_ifndef([AC_PROG_LD_RELOAD_FLAG], [AC_DEFUN([AC_PROG_LD_RELOAD_FLAG])]) m4_ifndef([AC_DEPLIBS_CHECK_METHOD], [AC_DEFUN([AC_DEPLIBS_CHECK_METHOD])]) m4_ifndef([AC_LIBTOOL_PROG_COMPILER_NO_RTTI], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI])]) m4_ifndef([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], [AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE])]) m4_ifndef([AC_LIBTOOL_PROG_COMPILER_PIC], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC])]) m4_ifndef([AC_LIBTOOL_PROG_LD_SHLIBS], [AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS])]) m4_ifndef([AC_LIBTOOL_POSTDEP_PREDEP], [AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP])]) m4_ifndef([LT_AC_PROG_EGREP], [AC_DEFUN([LT_AC_PROG_EGREP])]) m4_ifndef([LT_AC_PROG_SED], [AC_DEFUN([LT_AC_PROG_SED])]) m4_ifndef([_LT_CC_BASENAME], [AC_DEFUN([_LT_CC_BASENAME])]) m4_ifndef([_LT_COMPILER_BOILERPLATE], [AC_DEFUN([_LT_COMPILER_BOILERPLATE])]) m4_ifndef([_LT_LINKER_BOILERPLATE], [AC_DEFUN([_LT_LINKER_BOILERPLATE])]) m4_ifndef([_AC_PROG_LIBTOOL], [AC_DEFUN([_AC_PROG_LIBTOOL])]) m4_ifndef([AC_LIBTOOL_SETUP], [AC_DEFUN([AC_LIBTOOL_SETUP])]) m4_ifndef([_LT_AC_CHECK_DLFCN], [AC_DEFUN([_LT_AC_CHECK_DLFCN])]) m4_ifndef([AC_LIBTOOL_SYS_DYNAMIC_LINKER], [AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER])]) m4_ifndef([_LT_AC_TAGCONFIG], [AC_DEFUN([_LT_AC_TAGCONFIG])]) m4_ifndef([AC_DISABLE_FAST_INSTALL], [AC_DEFUN([AC_DISABLE_FAST_INSTALL])]) m4_ifndef([_LT_AC_LANG_CXX], [AC_DEFUN([_LT_AC_LANG_CXX])]) m4_ifndef([_LT_AC_LANG_F77], [AC_DEFUN([_LT_AC_LANG_F77])]) m4_ifndef([_LT_AC_LANG_GCJ], [AC_DEFUN([_LT_AC_LANG_GCJ])]) m4_ifndef([AC_LIBTOOL_LANG_C_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG])]) m4_ifndef([_LT_AC_LANG_C_CONFIG], [AC_DEFUN([_LT_AC_LANG_C_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_CXX_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG])]) m4_ifndef([_LT_AC_LANG_CXX_CONFIG], [AC_DEFUN([_LT_AC_LANG_CXX_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_F77_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_F77_CONFIG])]) m4_ifndef([_LT_AC_LANG_F77_CONFIG], [AC_DEFUN([_LT_AC_LANG_F77_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_GCJ_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_GCJ_CONFIG])]) m4_ifndef([_LT_AC_LANG_GCJ_CONFIG], [AC_DEFUN([_LT_AC_LANG_GCJ_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_RC_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_RC_CONFIG])]) m4_ifndef([_LT_AC_LANG_RC_CONFIG], [AC_DEFUN([_LT_AC_LANG_RC_CONFIG])]) m4_ifndef([AC_LIBTOOL_CONFIG], [AC_DEFUN([AC_LIBTOOL_CONFIG])]) m4_ifndef([_LT_AC_FILE_LTDLL_C], [AC_DEFUN([_LT_AC_FILE_LTDLL_C])]) m4_ifndef([_LT_REQUIRED_DARWIN_CHECKS], [AC_DEFUN([_LT_REQUIRED_DARWIN_CHECKS])]) m4_ifndef([_LT_AC_PROG_CXXCPP], [AC_DEFUN([_LT_AC_PROG_CXXCPP])]) m4_ifndef([_LT_PREPARE_SED_QUOTE_VARS], [AC_DEFUN([_LT_PREPARE_SED_QUOTE_VARS])]) m4_ifndef([_LT_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_PROG_ECHO_BACKSLASH])]) m4_ifndef([_LT_PROG_F77], [AC_DEFUN([_LT_PROG_F77])]) m4_ifndef([_LT_PROG_FC], [AC_DEFUN([_LT_PROG_FC])]) m4_ifndef([_LT_PROG_CXX], [AC_DEFUN([_LT_PROG_CXX])]) pspp-1.4.1/m4/ltversion.m40000644000175000017500000000127313725006215014726 0ustar00blpblp00000000000000# ltversion.m4 -- version numbers -*- Autoconf -*- # # Copyright (C) 2004, 2011-2015 Free Software Foundation, Inc. # Written by Scott James Remnant, 2004 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # @configure_input@ # serial 4179 ltversion.m4 # This file is part of GNU Libtool m4_define([LT_PACKAGE_VERSION], [2.4.6]) m4_define([LT_PACKAGE_REVISION], [2.4.6]) AC_DEFUN([LTVERSION_VERSION], [macro_version='2.4.6' macro_revision='2.4.6' _LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?]) _LT_DECL(, macro_revision, 0) ]) pspp-1.4.1/ABOUT-NLS0000644000175000017500000000010313546443556013353 0ustar00blpblp00000000000000 pspp-1.4.1/INSTALL0000644000175000017500000003363713725004300013152 0ustar00blpblp00000000000000Installation Instructions for GNU pspp ************************************** These instructions are based on the generic GNU installation instructions, but they have been tailored for PSPP. These instructions apply only to people wishing to build and install PSPP from source. Overview ======== PSPP uses the standard GNU configuration system. Therefore, if all is well, the following simple procedure should work, even on non-GNU systems: tar -xzf pspp-*.tar.gz cd pspp-* ./configure make sudo make install Obviously, you should replace 'pspp-*' in the above, with the name of the tarball you are installing. In 99% of cases, that is all you have to do - FINISHED! If any part of the above process fails, then it is likely that one or more of the necessary prerequisites is missing from your system. The following paragraphs contain highly detailed information which will help you fix this. Before You Install ================== Before you install PSPP, you will need to install certain prerequisite packages. You may also want to install other packages that enable additional functionality in PSPP. Please note, if you are installing any of the libararies mentioned below using pre-prepared binary packages provided by popular GNU/Linux vendors, you may need to ensure that you install the "development" versions (normally postfixed with -dev or -devel). If you do not know whether you have these installed already, you may proceed to "Basic Installation", below. The PSPP configuration process will notify you about required and optional packages that are not present on your system. The following packages are required to install PSPP: * A C compiler and tool chain. On Unix-like systems, we recommend GCC, but any modern compilation environment should work. On Microsoft Windows, Cygwin (http://www.cygwin.com/) and MinGW (http://www.mingw.org/) are known to work. * The GNU Scientific Library (http://www.gnu.org/software/gsl/), version 1.13 or later, including libgslcblas included with GSL. * Perl (http://www.perl.org/), version 5.005_03 or later. Perl is required during build but not after installation. * Python (https://python.org/), version 2.7 or later (Python 3 is fine). Some tests require Python; if it is missing, those tests will be skipped. PSPP does not otherwise require Python. * iconv, which should be installed as part of a Unix-like system. If you don't have a version already, you can install GNU libiconv (http://www.gnu.org/software/libiconv/). * libintl, from GNU gettext (http://www.gnu.org/software/gettext). GNU libc includes an integrated libintl, so there is no need to separately install libintl on a GNU/Linux system. * zlib (http://www.zlib.net/). * libxml2 (http://xmlsoft.org/). * metainfo.its, provided by the appstream package. This is required by xgettext to extract the translation strings from the org.fsf.pspp.metainfo.xml.in file. This is only required for building. It is not a runtime requirement. The following packages are required to enable PSPP's graphing features. If you cannot arrange to install them, you must run `configure' with --without-cairo (in which case you will get no graphing capability). * Cairo (http://cairographics.org/), version 1.12 or later. * Pango (http://www.pango.org/), version 1.22 or later. The following packages are required to enable PSPPIRE, the graphical user interface for PSPP. If you cannot install them or do not wish to use the GUI, you must run `configure' with --without-gui. * pkg-config (http://pkg-config.freedesktop.org/wiki/). Versions 0.18 and 0.19 have a bug that will prevent library detection, but other versions should be fine. * GTK+ (http://www.gtk.org/), version 3.22.0 or later. * GtkSourceView (http://projects.gnome.org/gtksourceview/) version 3.4.0 or later. * GNU Spread Sheet Widget (http://www.gnu.org/software/ssw) The following packages are optional: Other optional packages: * libreadline and libhistory (http://tiswww.case.edu/php/chet/readline/rltop.html). Without them, interactive command editing and history features in the text-based user interface will be disabled. * Texinfo (http://www.gnu.org/software/texinfo/), version 4.7 or later. Installing Texinfo will allow you to build PSPP documentation in PostScript or PDF format. * libpq, from Postgresql (http://postgresql.org). This enables PSPP to read Postgresql databases. The tests for the Postgresql interface, but not the Postgresql interface itself, requires the Postgresql server to be installed. * The Text::Diff module for Perl (http://cpan.org). This enables PSPP to test the Perl module more thoroughly. It is not needed to build or use the Perl module. Basic Installation ================== These are installation instructions specific to PSPP (including PSPPIRE, the graphic user interface). These instructions contain the information most commonly needed by people wishing to build the program from source. More detailed information can be found in the generic autoconf manual which is available at http://www.gnu.org/software/autoconf/manual/html_node/Running-configure-Scripts.html The `configure' shell script attempts to guess correct values for various system-dependent variables used during compilation. If you need to do unusual things to compile the package, please report the problem to bug-gnu-pspp@gnu.org. We will try to figure out how `configure' could work better in your situation for the next release. The simplest way to compile PSPP is: 1. `cd' to the directory containing the package's source code and type `./configure' to configure the package for your system. You may invoke `configure' with --help to see what options are available. The most common of these are listed under "Optional Features", below. It is best to build and install PSPP in directories whose names do not contain unusual characters such as spaces or single-quotes, due to limitations of the tools involved in the build process. If you installed some of the libraries that PSPP uses in a non-standard location (on many systems, anywhere other than /usr), you may need to provide some special flags to `configure' to tell it where to find them. For example, on GNU/Linux, if you installed some libraries in /usr/local, then you need to invoke it with at least the following options: ./configure LDFLAGS='-L/usr/local/lib -Wl,-rpath,/usr/local/lib' CPPFLAGS='-I/usr/local/include' Running `configure' takes awhile. While running, it prints some messages telling which features it is checking for. If `configure' completes successfully, it prints the message "PSPP configured successfully." at the end of its run. Otherwise, it may stop with a list of packages that you must install before PSPP. If it does, you need to install those packages, then re-run this step. Some prerequisites may be omitted by passing a --without- flag to `configure' (see "Optional Features", below). If you use one of these flags, then the feature that it disables will not be available in your PSPP installation. `configure' may also print a list of packages that you should consider installing. If you install them, then re-run `configure', additional features will be available in your PSPP installation. 2. Type `make' to compile the package. 3. Optionally, type `make check' to run the self-tests that come with the package. If any of the self-tests fail, please mail bug-gnu-pspp@gnu.org with the details, to give the PSPP developers an opportunity to fix the problem in the next release. 4. Type `make install' to install the programs and any data files and documentation. Ordinarily you will need root permissions to do this. The "su" and "sudo" commands are common ways to obtain root permissions. If you cannot get root permissions, see "Installation Names", below. Please note: The `make install' target does NOT install the perl module (see below). To install the perl module, you must change to the `perl-module' directory and manually run `make install' there. 5. You can remove the program binaries and object files from the source code directory by typing `make clean'. To also remove the files that `configure' created (so you can compile the package for a different kind of computer), type `make distclean'. Compilers and Options ===================== Some systems may require unusual options for compilation or linking that the `configure' script does not know about. Run `./configure --help' for details on some of the pertinent environment variables. You can give `configure' initial values for configuration parameters by setting variables in the command line or in the environment. Here is an example: ./configure CC=c89 CFLAGS=-O0 LIBS=-lposix To cross-compile PSPP, you will likely need to set the PKG_CONFIG_LIBDIR environment variable to point to an appropriate pkg-config for the cross-compilation environment. See "Defining Variables", below, for more details. Installation Names ================== By default, `make install' installs PSPP's commands under `/usr/local/bin', data files under `/usr/local/share', etc. You can specify an installation prefix other than `/usr/local' by giving `configure' the option `--prefix=PREFIX'. You may wish to install PSPP on a machine where you do not have root permissions. To do so, specify a prefix relative within your home directory, e.g. `--prefix=$HOME' or `--prefix=$HOME/inst'. All PSPP files will be installed under the prefix directory, which `make install' will create if necessary. You may run PSPP directly from the `bin' directory under the prefix directory as, e.g., `~/inst/bin/pspp' under most shells, or for added convenience you can add the installation directory to your PATH by editing a shell startup file such as `.bashrc'. You can specify separate installation prefixes for architecture-specific files and architecture-independent files. If you pass the option `--exec-prefix=PREFIX' to `configure', the package uses PREFIX as the prefix for installing programs and libraries. Documentation and other data files still use the regular prefix. In addition, if you use an unusual directory layout you can give options like `--bindir=DIR' to specify different values for particular kinds of files. Run `configure --help' for a list of the directories you can set and what kinds of files go in them. You can cause programs to be installed with an extra prefix or suffix on their names by giving `configure' the option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. Optional Features ================= `--without-cairo' Don't compile in support for charts (using Cairo and Pango). This is useful if your system lacks these libraries. `--without-gui' Don't build the PSPPIRE gui. Use this option if you only want to build the command line version of PSPP. Cairo and Pango required to build the GUI, so --without-cairo implies --without-gui. `--without-lib{xx}' Optional libraries should normally be detected and the relevant functionality will be built they exist. However, on some poorly configured systems a library may exist, but be totally broken. In these cases you can use --without-lib{xx} to force configure to disregard it. `--without-perl-module' Disable building the Perl module, in case it does not build properly or you do not need it. `--enable-relocatable' This option is useful for building a package which can be installed into an arbitrary directory and freely copied to any other directory. If you use this option, you will probably want to install the pspp with a command similar to "make install DESTDIR=". Defining Variables ================== Variables not defined in a site shell script can be set in the environment passed to `configure'. However, some packages may run configure again during the build, and the customized values of these variables may be lost. In order to avoid this problem, you should set them in the `configure' command line, using `VAR=value'. For example: ./configure CC=/usr/local2/bin/gcc causes the specified `gcc' to be used as the C compiler (unless it is overridden in the site shell script). Here is another example: /bin/bash ./configure CONFIG_SHELL=/bin/bash Here the `CONFIG_SHELL=/bin/bash' operand causes subsequent configuration-related scripts to be executed by `/bin/bash'. Generic `configure' Options =========================== `configure' also recognizes the following options to control how it operates. `--help' `-h' Print a summary of the options to `configure', and exit. `--version' `-V' Print the version of Autoconf used to generate the `configure' script, and exit. `--cache-file=FILE' Enable the cache: use and save the results of the tests in FILE, traditionally `config.cache'. FILE defaults to `/dev/null' to disable caching. `--config-cache' `-C' Alias for `--cache-file=config.cache'. `--quiet' `--silent' `-q' Do not print messages saying which checks are being made. To suppress all normal output, redirect it to `/dev/null' (any error messages will still be shown). `--srcdir=DIR' Look for the package's source code in directory DIR. Usually `configure' can determine that directory automatically. `configure' also accepts some other, not widely useful, options. Run `configure --help' for more details. ---------------------------------------------------------------------- Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004, 2005, 2007, 2013 Free Software Foundation, Inc. This file is free documentation; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. pspp-1.4.1/src/0000755000175000017500000000000013725012647012711 5ustar00blpblp00000000000000pspp-1.4.1/src/data/0000755000175000017500000000000013725012647013622 5ustar00blpblp00000000000000pspp-1.4.1/src/data/casewriter.h0000644000175000017500000000376413320146056016146 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2007, 2009, 2011 Free Software Foundation, Inc. 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 3 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, see . */ #ifndef DATA_CASEWRITER_H #define DATA_CASEWRITER_H 1 #include #include "data/transformations.h" #include "libpspp/compiler.h" struct casewriter; void casewriter_write (struct casewriter *, struct ccase *); bool casewriter_destroy (struct casewriter *); const struct caseproto *casewriter_get_proto (const struct casewriter *); struct casereader *casewriter_make_reader (struct casewriter *); struct casewriter *casewriter_rename (struct casewriter *); bool casewriter_error (const struct casewriter *); void casewriter_force_error (struct casewriter *); const struct taint *casewriter_get_taint (const struct casewriter *); struct casewriter *mem_writer_create (const struct caseproto *); struct casewriter *tmpfile_writer_create (const struct caseproto *); struct casewriter *autopaging_writer_create (const struct caseproto *); struct casewriter * casewriter_create_translator (struct casewriter *, const struct caseproto *translated_proto, struct ccase *(*translate) (struct ccase *input, void *aux), bool (*destroy) (void *aux), void *aux); #endif /* data/casewriter.h */ pspp-1.4.1/src/data/case-map.h0000644000175000017500000000465213320146056015461 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2007, 2009, 2012 Free Software Foundation, Inc. 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 3 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, see . */ /* Case map. A case map copies data from a case that corresponds to one dictionary to a case that corresponds to a second dictionary. A few options are available for ways to create the mapping. */ #ifndef DATA_CASE_MAP_H #define DATA_CASE_MAP_H 1 #include struct case_map; struct casereader; struct casewriter; struct ccase; struct dictionary; struct case_map *case_map_create (void); void case_map_destroy (struct case_map *); struct ccase *case_map_execute (const struct case_map *, struct ccase *); const struct caseproto *case_map_get_proto (const struct case_map *); struct casereader *case_map_create_input_translator (struct case_map *, struct casereader *); struct casewriter *case_map_create_output_translator (struct case_map *, struct casewriter *); /* For mapping cases for one version of a dictionary to those in a modified version of the same dictionary. */ struct case_map_stage *case_map_stage_create (const struct dictionary *); void case_map_stage_destroy (struct case_map_stage *); struct case_map *case_map_stage_get_case_map (const struct case_map_stage *); /* For eliminating "holes" in a case. */ struct case_map *case_map_to_compact_dict (const struct dictionary *d, unsigned int exclude_classes); /* For mapping cases for one dictionary to another based on variable names within the dictionary. */ struct case_map *case_map_by_name (const struct dictionary *old, const struct dictionary *new); void case_map_dump (const struct case_map *); #endif /* data/case-map.h */ pspp-1.4.1/src/data/missing-values.h0000644000175000017500000001064613546443556016760 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2005, 2009, 2013 Free Software Foundation, Inc. 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 3 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, see . */ /* User-missing values. struct missing_values is an opaque type that represents a set of user-missing values associated with a variable. Valid sets of missing values depend on variable width: - Numeric variables may have up to 3 discrete numeric user-missing values, or a range of numeric values, or a range plus one discrete value. - String variables may have up to 3 discrete string user-missing values. (However, for long string variables all bytes after the first MV_MAX_STRING must be spaces.) */ #ifndef DATA_MISSING_VALUES_H #define DATA_MISSING_VALUES_H 1 #include #include "data/value.h" struct pool; /* Missing values for long string variables after the first MV_MAX_STRING bytes must be all spaces. */ #define MV_MAX_STRING 8 /* Missing values. Opaque--use access functions defined below. */ struct missing_values { int type; /* Types of missing values, one of MVT_*. */ int width; /* 0=numeric, otherwise string width. */ union value values[3]; /* Missing values. [1], [2] are the range. */ }; /* Classes of missing values. */ enum mv_class { MV_NEVER = 0, /* Never considered missing. */ MV_USER = 1, /* Missing if value is user-missing. */ MV_SYSTEM = 2, /* Missing if value is system-missing. */ MV_ANY = MV_USER | MV_SYSTEM /* Missing if it is user or system-missing. */ }; /* Is a value missing? */ bool mv_is_value_missing (const struct missing_values *, const union value *, enum mv_class); bool mv_is_num_missing (const struct missing_values *, double, enum mv_class); bool mv_is_str_missing (const struct missing_values *, const uint8_t[], enum mv_class); bool mv_is_value_missing_varwidth (const struct missing_values *, const union value *, int value_width, enum mv_class); /* Initializing missing value sets. */ void mv_init (struct missing_values *, int width); void mv_init_pool (struct pool *pool, struct missing_values *, int width); void mv_destroy (struct missing_values *); void mv_copy (struct missing_values *, const struct missing_values *); void mv_clear (struct missing_values *); /* Changing width of a missing value set. */ bool mv_is_resizable (const struct missing_values *, int width); void mv_resize (struct missing_values *, int width); /* Basic property inspection. */ bool mv_is_acceptable (const union value *, int width); bool mv_is_empty (const struct missing_values *); int mv_get_width (const struct missing_values *); /* Inspecting discrete values. */ int mv_n_values (const struct missing_values *); bool mv_has_value (const struct missing_values *); const union value *mv_get_value (const struct missing_values *, int idx); /* Inspecting ranges. */ bool mv_has_range (const struct missing_values *); void mv_get_range (const struct missing_values *, double *low, double *high); /* Adding and modifying discrete values. */ bool mv_add_value (struct missing_values *, const union value *); bool mv_add_str (struct missing_values *, const uint8_t[], size_t len); bool mv_add_num (struct missing_values *, double); void mv_pop_value (struct missing_values *, union value *); bool mv_replace_value (struct missing_values *, const union value *, int idx); /* Adding and modifying ranges. */ bool mv_add_range (struct missing_values *, double low, double high); void mv_pop_range (struct missing_values *, double *low, double *high); /* Formatting. */ char *mv_to_string (const struct missing_values *, const char *encoding); #endif /* data/missing-values.h */ pspp-1.4.1/src/data/gnumeric-reader.h0000644000175000017500000000245413320146056017042 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2007, 2010 Free Software Foundation, Inc. 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 3 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, see . */ #ifndef GNUMERIC_READ_H #define GNUMERIC_READ_H 1 #include struct casereader; struct dictionary; struct spreadsheet_read_info; struct spreadsheet_read_options; struct spreadsheet *gnumeric_probe (const char *filename, bool report_errors); const char * gnumeric_get_sheet_name (struct spreadsheet *s, int n); char * gnumeric_get_sheet_range (struct spreadsheet *s, int n); struct casereader * gnumeric_make_reader (struct spreadsheet *spreadsheet, const struct spreadsheet_read_options *opts); void gnumeric_unref (struct spreadsheet *r); #endif pspp-1.4.1/src/data/csv-file-writer.c0000644000175000017500000003002113723617401017001 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2010, 2011, 2012, 2013, 2014 Free Software Foundation, Inc. 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 3 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, see . */ #include #include "data/csv-file-writer.h" #include #include #include #include #include #include #include #include "data/calendar.h" #include "data/case.h" #include "data/casewriter-provider.h" #include "data/casewriter.h" #include "data/data-out.h" #include "data/dictionary.h" #include "data/file-handle-def.h" #include "data/format.h" #include "data/make-file.h" #include "data/missing-values.h" #include "data/settings.h" #include "data/value-labels.h" #include "data/variable.h" #include "libpspp/assertion.h" #include "libpspp/i18n.h" #include "libpspp/message.h" #include "libpspp/str.h" #include "gl/ftoastr.h" #include "gl/minmax.h" #include "gl/unlocked-io.h" #include "gl/xalloc.h" #include "gettext.h" #define _(msgid) gettext (msgid) #define N_(msgid) (msgid) /* A variable in a CSV file. */ struct csv_var { int width; /* Variable width (0 to 32767). */ int case_index; /* Index into case. */ struct fmt_spec format; /* Print format. */ struct missing_values missing; /* User-missing values, if recoding. */ struct val_labs *val_labs; /* Value labels, if any and they are in use. */ }; /* Comma-separated value (CSV) file writer. */ struct csv_writer { struct file_handle *fh; /* File handle. */ struct fh_lock *lock; /* Mutual exclusion for file. */ FILE *file; /* File stream. */ struct replace_file *rf; /* Ticket for replacing output file. */ struct csv_writer_options opts; char *encoding; /* Encoding used by variables. */ /* Variables. */ struct csv_var *csv_vars; /* Variables. */ size_t n_csv_vars; /* Number of variables. */ }; static const struct casewriter_class csv_file_casewriter_class; static void write_var_names (struct csv_writer *, const struct dictionary *); static bool write_error (const struct csv_writer *); static bool close_writer (struct csv_writer *); /* Opens the CSV file designated by file handle FH for writing cases from dictionary DICT according to the given OPTS. No reference to D is retained, so it may be modified or destroyed at will after this function returns. */ struct casewriter * csv_writer_open (struct file_handle *fh, const struct dictionary *dict, const struct csv_writer_options *opts) { struct csv_writer *w; int i; /* Create and initialize writer. */ w = xmalloc (sizeof *w); w->fh = fh_ref (fh); w->lock = NULL; w->file = NULL; w->rf = NULL; w->opts = *opts; w->encoding = xstrdup (dict_get_encoding (dict)); w->n_csv_vars = dict_get_var_cnt (dict); w->csv_vars = xnmalloc (w->n_csv_vars, sizeof *w->csv_vars); for (i = 0; i < w->n_csv_vars; i++) { const struct variable *var = dict_get_var (dict, i); struct csv_var *cv = &w->csv_vars[i]; cv->width = var_get_width (var); cv->case_index = var_get_case_index (var); cv->format = *var_get_print_format (var); if (opts->recode_user_missing) mv_copy (&cv->missing, var_get_missing_values (var)); else mv_init (&cv->missing, cv->width); if (opts->use_value_labels) cv->val_labs = val_labs_clone (var_get_value_labels (var)); else cv->val_labs = NULL; } /* Open file handle as an exclusive writer. */ /* TRANSLATORS: this fragment will be interpolated into messages in fh_lock() that identify types of files. */ w->lock = fh_lock (fh, FH_REF_FILE, N_("CSV file"), FH_ACC_WRITE, true); if (w->lock == NULL) goto error; /* Create the file on disk. */ w->rf = replace_file_start (fh, "w", 0666, &w->file); if (w->rf == NULL) { msg (ME, _("Error opening `%s' for writing as a CSV file: %s."), fh_get_file_name (fh), strerror (errno)); goto error; } if (opts->include_var_names) write_var_names (w, dict); if (write_error (w)) goto error; return casewriter_create (dict_get_proto (dict), &csv_file_casewriter_class, w); error: close_writer (w); return NULL; } static bool csv_field_needs_quoting (struct csv_writer *w, const char *s, size_t len) { const char *p; for (p = s; p < &s[len]; p++) if (*p == w->opts.qualifier || *p == w->opts.delimiter || *p == '\n' || *p == '\r') return true; return false; } static void csv_output_buffer (struct csv_writer *w, const char *s, size_t len) { if (csv_field_needs_quoting (w, s, len)) { const char *p; putc (w->opts.qualifier, w->file); for (p = s; p < &s[len]; p++) { /* We are writing the output file in text mode, so transform any explicit CR-LF line breaks into LF only, to allow the C library to use correct system-specific new-lines. */ if (*p == '\r' && p[1] == '\n') continue; if (*p == w->opts.qualifier) putc (w->opts.qualifier, w->file); putc (*p, w->file); } putc (w->opts.qualifier, w->file); } else fwrite (s, 1, len, w->file); } static void csv_output_string (struct csv_writer *w, const char *s) { csv_output_buffer (w, s, strlen (s)); } static void write_var_names (struct csv_writer *w, const struct dictionary *d) { size_t i; for (i = 0; i < w->n_csv_vars; i++) { if (i > 0) putc (w->opts.delimiter, w->file); csv_output_string (w, var_get_name (dict_get_var (d, i))); } putc ('\n', w->file); } static void csv_output_format (struct csv_writer *w, const struct csv_var *cv, const union value *value) { char *s = data_out (value, w->encoding, &cv->format); struct substring ss = ss_cstr (s); if (cv->format.type != FMT_A) ss_trim (&ss, ss_cstr (" ")); else ss_rtrim (&ss, ss_cstr (" ")); csv_output_buffer (w, ss.string, ss.length); free (s); } static double extract_date (double number, int *y, int *m, int *d) { int yd; calendar_offset_to_gregorian (number / 60. / 60. / 24., y, m, d, &yd); return fmod (number, 60. * 60. * 24.); } static void extract_time (double number, double *H, int *M, int *S) { *H = floor (number / 60. / 60.); number = fmod (number, 60. * 60.); *M = floor (number / 60.); number = fmod (number, 60.); *S = floor (number); } static void csv_write_var__ (struct csv_writer *w, const struct csv_var *cv, const union value *value) { const char *label; label = val_labs_find (cv->val_labs, value); if (label != NULL) csv_output_string (w, label); else if (cv->width == 0 && value->f == SYSMIS) csv_output_buffer (w, " ", 1); else if (w->opts.use_print_formats) csv_output_format (w, cv, value); else { char s[MAX (DBL_STRLEN_BOUND, 128)]; char *cp; switch (cv->format.type) { case FMT_F: case FMT_COMMA: case FMT_DOT: case FMT_DOLLAR: case FMT_PCT: case FMT_E: case FMT_CCA: case FMT_CCB: case FMT_CCC: case FMT_CCD: case FMT_CCE: case FMT_N: case FMT_Z: case FMT_P: case FMT_PK: case FMT_IB: case FMT_PIB: case FMT_PIBHEX: case FMT_RB: case FMT_RBHEX: case FMT_WKDAY: case FMT_MONTH: dtoastr (s, sizeof s, 0, 0, value->f); cp = strpbrk (s, ".,"); if (cp != NULL) *cp = w->opts.decimal; break; case FMT_DATE: case FMT_ADATE: case FMT_EDATE: case FMT_JDATE: case FMT_SDATE: case FMT_QYR: case FMT_MOYR: case FMT_WKYR: if (value->f < 0) strcpy (s, " "); else { int y, m, d; extract_date (value->f, &y, &m, &d); snprintf (s, sizeof s, "%02d/%02d/%04d", m, d, y); } break; case FMT_DATETIME: case FMT_YMDHMS: if (value->f < 0) strcpy (s, " "); else { int y, m, d, M, S; double H; extract_time (extract_date (value->f, &y, &m, &d), &H, &M, &S); snprintf (s, sizeof s, "%02d/%02d/%04d %02.0f:%02d:%02d", m, d, y, H, M, S); } break; case FMT_MTIME: case FMT_TIME: case FMT_DTIME: { double H; int M, S; extract_time (fabs (value->f), &H, &M, &S); snprintf (s, sizeof s, "%s%02.0f:%02d:%02d", value->f < 0 ? "-" : "", H, M, S); } break; case FMT_A: case FMT_AHEX: csv_output_format (w, cv, value); return; case FMT_NUMBER_OF_FORMATS: NOT_REACHED (); } csv_output_string (w, s); } } static void csv_write_var (struct csv_writer *w, const struct csv_var *cv, const union value *value) { if (mv_is_value_missing (&cv->missing, value, MV_USER)) { union value missing; value_init (&missing, cv->width); value_set_missing (&missing, cv->width); csv_write_var__ (w, cv, &missing); value_destroy (&missing, cv->width); } else csv_write_var__ (w, cv, value); } static void csv_write_case (struct csv_writer *w, const struct ccase *c) { size_t i; for (i = 0; i < w->n_csv_vars; i++) { const struct csv_var *cv = &w->csv_vars[i]; if (i > 0) putc (w->opts.delimiter, w->file); csv_write_var (w, cv, case_data_idx (c, cv->case_index)); } putc ('\n', w->file); } /* Writes case C to CSV file W. */ static void csv_file_casewriter_write (struct casewriter *writer, void *w_, struct ccase *c) { struct csv_writer *w = w_; if (ferror (w->file)) { casewriter_force_error (writer); case_unref (c); return; } csv_write_case (w, c); case_unref (c); } /* Destroys CSV file writer W. */ static void csv_file_casewriter_destroy (struct casewriter *writer, void *w_) { struct csv_writer *w = w_; if (!close_writer (w)) casewriter_force_error (writer); } /* Returns true if an I/O error has occurred on WRITER, false otherwise. */ bool write_error (const struct csv_writer *writer) { return ferror (writer->file); } /* Closes a CSV file after we're done with it. Returns true if successful, false if an I/O error occurred. */ bool close_writer (struct csv_writer *w) { size_t i; bool ok; if (w == NULL) return true; ok = true; if (w->file != NULL) { if (write_error (w)) ok = false; if (fclose (w->file) == EOF) ok = false; if (!ok) msg (ME, _("An I/O error occurred writing CSV file `%s'."), fh_get_file_name (w->fh)); if (ok ? !replace_file_commit (w->rf) : !replace_file_abort (w->rf)) ok = false; } fh_unlock (w->lock); fh_unref (w->fh); free (w->encoding); for (i = 0; i < w->n_csv_vars; i++) { struct csv_var *cv = &w->csv_vars[i]; mv_destroy (&cv->missing); val_labs_destroy (cv->val_labs); } free (w->csv_vars); free (w); return ok; } /* CSV file writer casewriter class. */ static const struct casewriter_class csv_file_casewriter_class = { csv_file_casewriter_write, csv_file_casewriter_destroy, NULL, }; pspp-1.4.1/src/data/datasheet.h0000644000175000017500000000653413320146056015736 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2007, 2009, 2011 Free Software Foundation, Inc. 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 3 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, see . */ #ifndef DATA_DATASHEET_H #define DATA_DATASHEET_H 1 #include "data/case.h" #include "data/value.h" struct caseproto; struct casereader; /* A datasheet is a 2-d array of "union value"s that may be stored in memory or on disk. It efficiently supports data storage and retrieval, as well as adding, removing, and rearranging both rows and columns. */ struct datasheet *datasheet_create (struct casereader *); void datasheet_destroy (struct datasheet *); struct datasheet *datasheet_rename (struct datasheet *); const struct caseproto *datasheet_get_proto (const struct datasheet *); int datasheet_get_column_width (const struct datasheet *, size_t column); bool datasheet_error (const struct datasheet *); void datasheet_force_error (struct datasheet *); const struct taint *datasheet_get_taint (const struct datasheet *); struct casereader *datasheet_make_reader (struct datasheet *); /* Columns. */ size_t datasheet_get_n_columns (const struct datasheet *); bool datasheet_insert_column (struct datasheet *, const union value *, int width, size_t before); void datasheet_delete_columns (struct datasheet *, size_t start, size_t cnt); void datasheet_move_columns (struct datasheet *, size_t old_start, size_t new_start, size_t cnt); bool datasheet_resize_column (struct datasheet *, size_t column, int new_width, void (*resize_cb) (const union value *, union value *, const void *aux), const void *aux); /* Rows. */ casenumber datasheet_get_n_rows (const struct datasheet *); bool datasheet_insert_rows (struct datasheet *, casenumber before, struct ccase *[], casenumber cnt); void datasheet_delete_rows (struct datasheet *, casenumber first, casenumber cnt); void datasheet_move_rows (struct datasheet *, size_t old_start, size_t new_start, size_t cnt); /* Data. */ struct ccase *datasheet_get_row (const struct datasheet *, casenumber); bool datasheet_put_row (struct datasheet *, casenumber, struct ccase *); bool datasheet_get_value (const struct datasheet *, casenumber, size_t column, union value *); bool datasheet_put_value (struct datasheet *, casenumber, size_t column, const union value *); unsigned int hash_datasheet (const struct datasheet *ds); struct datasheet *clone_datasheet (const struct datasheet *ds); #endif /* data/datasheet.h */ pspp-1.4.1/src/data/file-name.h0000644000175000017500000000274313320146056015627 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 1997-9, 2000, 2009, 2010 Free Software Foundation, Inc. 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 3 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, see . */ #ifndef FILE_NAME_H #define FILE_NAME_H 1 #include #include #include struct file_handle ; char *fn_search_path (const char *base_name, char **path); char *fn_extension (const struct file_handle *); bool fn_exists (const struct file_handle *); FILE *fn_open (const struct file_handle *fn, const char *mode); int fn_close (const struct file_handle *fn, FILE *file); const char * default_output_path (void); #if defined _WIN32 || defined __WIN32__ #define WIN32_LEAN_AND_MEAN /* avoid including junk */ #define UNICODE 1 #include #else typedef char TCHAR; #endif TCHAR * convert_to_filename_encoding (const char *s, size_t len, const char *current_encoding); #endif /* file-name.h */ pspp-1.4.1/src/data/attributes.c0000644000175000017500000002433213320146056016151 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2008, 2009, 2011, 2012, 2016 Free Software Foundation, Inc. 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 3 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, see . */ #include #include "data/attributes.h" #include #include #include "libpspp/array.h" #include "libpspp/compiler.h" #include "libpspp/hash-functions.h" #include "libpspp/i18n.h" #include "gl/xalloc.h" /* A custom attribute of the sort maintained by the DATAFILE ATTRIBUTE and VARIABLE ATTRIBUTE commands. Attributes have a name (the rules for which are the same as those for PSPP variable names) and one or more values, each of which is a string. An attribute may be part of one attribute set. */ struct attribute { struct hmap_node node; /* Used by attrset. */ char *name; /* Name. */ char **values; /* Each value. */ size_t n_values; /* Number of values. */ size_t allocated_values; /* Amount of allocated space for values. */ }; /* Creates and returns a new attribute with the given NAME. The attribute initially has no values. (Attributes with no values cannot be saved to system files, so at least one value should be added before the attribute is made available to the PSPP user.) */ struct attribute * attribute_create (const char *name) { struct attribute *attr = xmalloc (sizeof *attr); attr->name = xstrdup (name); attr->values = NULL; attr->n_values = 0; attr->allocated_values = 0; return attr; } /* Creates and returns a new attribute with the same name and values as ORIG. */ struct attribute * attribute_clone (const struct attribute *orig) { struct attribute *attr; size_t i; attr = attribute_create (orig->name); for (i = 0; i < orig->n_values; i++) attribute_add_value (attr, orig->values[i]); return attr; } /* Destroys ATTR and frees all associated memory. This function must not be called if ATTR is part of an attribute set. Use attrset_delete() instead. */ void attribute_destroy (struct attribute *attr) { if (attr != NULL) { size_t i; for (i = 0; i < attr->n_values; i++) free (attr->values[i]); free (attr->values); free (attr->name); free (attr); } } /* Returns the name of ATTR. The caller must not free or modify the returned string. */ const char * attribute_get_name (const struct attribute *attr) { return attr->name; } /* Returns ATTR's value with the given INDEX, or a null pointer if INDEX is greater than or equal to the number of values in ATTR (that is, attributes are numbered starting from 0). The caller must not free or modify the returned string. */ const char * attribute_get_value (const struct attribute *attr, size_t index) { return index < attr->n_values ? attr->values[index] : NULL; } /* Returns ATTR's number of values. */ size_t attribute_get_n_values (const struct attribute *attrs) { return attrs->n_values; } /* Adds a copy of VALUE as a new value to ATTR. The caller retains ownership of VALUE. */ void attribute_add_value (struct attribute *attr, const char *value) { if (attr->n_values >= attr->allocated_values) attr->values = x2nrealloc (attr->values, &attr->allocated_values, sizeof *attr->values); attr->values[attr->n_values++] = xstrdup (value); } /* Adds or replaces the value with the given INDEX in ATTR by a copy of VALUE. The caller retains ownership of VALUE. If INDEX is an existing value index, that value is replaced. If no value index numbered INDEX exists in ATTR, then it is added, and any values intermediate between the last maximum index and INDEX are set to the empty string. */ void attribute_set_value (struct attribute *attr, size_t index, const char *value) { if (index < attr->n_values) { /* Replace existing value. */ free (attr->values[index]); attr->values[index] = xstrdup (value); } else { /* Add new value. */ while (index > attr->n_values) attribute_add_value (attr, ""); attribute_add_value (attr, value); } } /* Deletes the value with the given INDEX from ATTR. Any values with higher-numbered indexes are shifted down into the gap that this creates. If INDEX is greater than the maximum index, this has no effect.*/ void attribute_del_value (struct attribute *attr, size_t index) { if (index < attr->n_values) { free (attr->values[index]); remove_element (attr->values, attr->n_values, sizeof *attr->values, index); attr->n_values--; } } /* Initializes SET as a new, initially empty attibute set. */ void attrset_init (struct attrset *set) { hmap_init (&set->map); } /* Initializes NEW_SET as a new attribute set whose contents are initially the same as that of OLD_SET. */ void attrset_clone (struct attrset *new_set, const struct attrset *old_set) { struct attribute *old_attr; attrset_init (new_set); HMAP_FOR_EACH (old_attr, struct attribute, node, &old_set->map) { struct attribute *new_attr = attribute_clone (old_attr); hmap_insert (&new_set->map, &new_attr->node, hmap_node_hash (&old_attr->node)); } } /* Frees the storage associated with SET, if SET is nonnull. (Does not free SET itself.) */ void attrset_destroy (struct attrset *set) { if (set != NULL) { struct attribute *attr, *next; HMAP_FOR_EACH_SAFE (attr, next, struct attribute, node, &set->map) attribute_destroy (attr); hmap_destroy (&set->map); } } /* Returns the number of attributes in SET. */ size_t attrset_count (const struct attrset *set) { return hmap_count (&set->map); } /* Returns the attribute in SET whose name matches NAME case-insensitively, or a null pointer if SET does not contain an attribute with that name. */ struct attribute * attrset_lookup (const struct attrset *set, const char *name) { const struct attribute *attr; HMAP_FOR_EACH_WITH_HASH (attr, struct attribute, node, utf8_hash_case_string (name, 0), &set->map) if (!utf8_strcasecmp (attribute_get_name (attr), name)) break; return CONST_CAST (struct attribute *, attr); } /* Adds ATTR to SET. Succeeds and returns true if SET does not already contain an attribute with the same name (matched case insensitively); otherwise fails and returns false. On success only, ownership of ATTR is transferred to SET. */ bool attrset_try_add (struct attrset *set, struct attribute *attr) { const char *name = attribute_get_name (attr); if (attrset_lookup (set, name)) return false; hmap_insert (&set->map, &attr->node, utf8_hash_case_string (name, 0)); return true; } /* Adds ATTR to SET, which must not already contain an attribute with the same name (matched case insensitively). Ownership of ATTR is transferred to SET. */ void attrset_add (struct attrset *set, struct attribute *attr) { bool ok UNUSED = attrset_try_add (set, attr); assert (ok); } /* Deletes any attribute from SET that matches NAME (case-insensitively). */ void attrset_delete (struct attrset *set, const char *name) { struct attribute *attr = attrset_lookup (set, name); if (attr != NULL) { hmap_delete (&set->map, &attr->node); attribute_destroy (attr); } } /* Deletes all attributes from SET. */ void attrset_clear (struct attrset *set) { attrset_destroy (set); attrset_init (set); } static struct attribute *iterator_data (struct attrset_iterator *iterator) { return HMAP_NULLABLE_DATA (iterator->node, struct attribute, node); } /* Returns the first attribute in SET and initializes ITERATOR. If SET is empty, returns a null pointer. The caller must not destroy the returned attribute, but it may add or remove values. Attributes are visited in no particular order. Calling attrset_add() during iteration can cause some attributes to be visited more than once and others not at all. */ struct attribute * attrset_first (const struct attrset *set, struct attrset_iterator *iterator) { iterator->node = hmap_first (&set->map); return iterator_data (iterator); } /* Returns the next attribute in SET and advances ITERATOR, which should have been initialized by calling attrset_first(). If all the attributes in SET have already been visited, returns a null pointer. The caller must not destroy the returned attribute, but it may add or remove values. Attributes are visited in no particular order. Calling attrset_add() during iteration can cause some attributes to be visited more than once and others not at all. */ struct attribute * attrset_next (const struct attrset *set, struct attrset_iterator *iterator) { iterator->node = hmap_next (&set->map, iterator->node); return iterator_data (iterator); } static int compare_attribute_by_name (const void *a_, const void *b_) { const struct attribute *const *a = a_; const struct attribute *const *b = b_; return strcmp ((*a)->name, (*b)->name); } /* Allocates and returns an array of pointers to attributes that is sorted by attribute name. The array has 'attrset_count (SET)' elements. The caller is responsible for freeing the array. */ struct attribute ** attrset_sorted (const struct attrset *set) { if (set != NULL && attrset_count (set) > 0) { struct attribute **attrs; struct attribute *attr; size_t i; attrs = xmalloc (attrset_count (set) * sizeof *attrs); i = 0; HMAP_FOR_EACH (attr, struct attribute, node, &set->map) attrs[i++] = attr; assert (i == attrset_count (set)); qsort (attrs, attrset_count (set), sizeof *attrs, compare_attribute_by_name); return attrs; } else return NULL; } pspp-1.4.1/src/data/casereader-project.c0000644000175000017500000000622413320146056017525 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2009, 2011 Free Software Foundation, Inc. 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 3 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, see . */ #include #include "data/casereader-provider.h" #include "data/subcase.h" #include "gl/xalloc.h" static bool projection_is_no_op (const struct casereader *reader, const struct subcase *sc) { size_t n = subcase_get_n_fields (sc); size_t i; if (n != caseproto_get_n_widths (casereader_get_proto (reader))) return false; for (i = 0; i < n; i++) if (subcase_get_case_index (sc, i) != i) return false; return true; } struct casereader_project { struct subcase old_sc; struct subcase new_sc; }; static struct ccase * project_case (struct ccase *old, casenumber idx UNUSED, const void *project_) { const struct casereader_project *project = project_; struct ccase *new = case_create (subcase_get_proto (&project->new_sc)); subcase_copy (&project->old_sc, old, &project->new_sc, new); case_unref (old); return new; } static bool destroy_projection (void *project_) { struct casereader_project *project = project_; subcase_destroy (&project->old_sc); subcase_destroy (&project->new_sc); free (project); return true; } /* Returns a casereader in which each row is obtained by extracting the subcase SC from the corresponding row of SUBREADER. */ struct casereader * casereader_project (struct casereader *subreader, const struct subcase *sc) { if (projection_is_no_op (subreader, sc)) return casereader_rename (subreader); else { struct casereader_project *project = xmalloc (sizeof *project); const struct caseproto *proto; subcase_clone (&project->old_sc, sc); proto = subcase_get_proto (&project->old_sc); subcase_init_empty (&project->new_sc); subcase_add_proto_always (&project->new_sc, proto); return casereader_translate_stateless (subreader, proto, project_case, destroy_projection, project); } } /* Returns a casereader in which each row is obtained by extracting the value with index COLUMN from the corresponding row of SUBREADER. */ struct casereader * casereader_project_1 (struct casereader *subreader, int column) { const struct caseproto *subproto = casereader_get_proto (subreader); struct casereader *reader; struct subcase sc; subcase_init (&sc, column, caseproto_get_width (subproto, column), SC_ASCEND); reader = casereader_project (subreader, &sc); subcase_destroy (&sc); return reader; } pspp-1.4.1/src/data/calendar.c0000644000175000017500000001510013320146056015525 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2006, 2007, 2008, 2010, 2011 Free Software Foundation, Inc. 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 3 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, see . */ #include #include "data/calendar.h" #include #include #include "data/settings.h" #include "data/val-type.h" #include "gettext.h" #define _(msgid) gettext (msgid) /* 14 Oct 1582. */ #define EPOCH (-577734) /* Calculates and returns floor(a/b) for integer b > 0. */ static int floor_div (int a, int b) { assert (b > 0); return (a >= 0 ? a : a - b + 1) / b; } /* Calculates floor(a/b) and the corresponding remainder and stores them into *Q and *R. */ static void floor_divmod (int a, int b, int *q, int *r) { *q = floor_div (a, b); *r = a - b * *q; } /* Returns true if Y is a leap year, false otherwise. */ static bool is_leap_year (int y) { return y % 4 == 0 && (y % 100 != 0 || y % 400 == 0); } static int raw_gregorian_to_offset (int y, int m, int d) { return (EPOCH - 1 + 365 * (y - 1) + floor_div (y - 1, 4) - floor_div (y - 1, 100) + floor_div (y - 1, 400) + floor_div (367 * m - 362, 12) + (m <= 2 ? 0 : (m >= 2 && is_leap_year (y) ? -1 : -2)) + d); } /* Returns the number of days from 14 Oct 1582 to (Y,M,D) in the Gregorian calendar. Returns SYSMIS for dates before 14 Oct 1582. */ double calendar_gregorian_to_offset (int y, int m, int d, char **errorp) { /* Normalize year. */ if (y >= 0 && y < 100) { int epoch = settings_get_epoch (); int century = epoch / 100 + (y < epoch % 100); y += century * 100; } /* Normalize month. */ if (m < 1 || m > 12) { if (m == 0) { y--; m = 12; } else if (m == 13) { y++; m = 1; } else { if (errorp != NULL) *errorp = xasprintf (_("Month %d is not in acceptable range of " "0 to 13."), m); return SYSMIS; } } /* Normalize day. */ if (d < 0 || d > 31) { if (errorp != NULL) *errorp = xasprintf (_("Day %d is not in acceptable range of " "0 to 31."), d); return SYSMIS; } /* Validate date. */ if (y < 1582 || (y == 1582 && (m < 10 || (m == 10 && d < 15)))) { if (errorp != NULL) *errorp = xasprintf (_("Date %04d-%d-%d is before the earliest " "acceptable date of 1582-10-15."), y, m, d); return SYSMIS; } /* Calculate offset. */ if (errorp != NULL) *errorp = NULL; return raw_gregorian_to_offset (y, m, d); } /* Returns the number of days in the given YEAR from January 1 up to (but not including) the first day of MONTH. */ static int cum_month_days (int year, int month) { static const int cum_month_days[12] = { 0, 31, /* Jan */ 31 + 28, /* Feb */ 31 + 28 + 31, /* Mar */ 31 + 28 + 31 + 30, /* Apr */ 31 + 28 + 31 + 30 + 31, /* May */ 31 + 28 + 31 + 30 + 31 + 30, /* Jun */ 31 + 28 + 31 + 30 + 31 + 30 + 31, /* Jul */ 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31, /* Aug */ 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30, /* Sep */ 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31, /* Oct */ 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + 30, /* Nov */ }; assert (month >= 1 && month <= 12); return cum_month_days[month - 1] + (month >= 3 && is_leap_year (year)); } /* Takes a count of days from 14 Oct 1582 and returns the Gregorian calendar year it is in. Dates both before and after the epoch are supported. */ int calendar_offset_to_year (int ofs) { int d0; int n400, d1; int n100, d2; int n4, d3; int n1; int y; d0 = ofs - EPOCH; floor_divmod (d0, 365 * 400 + 100 - 3, &n400, &d1); floor_divmod (d1, 365 * 100 + 25 - 1, &n100, &d2); floor_divmod (d2, 365 * 4 + 1, &n4, &d3); n1 = floor_div (d3, 365); y = 400 * n400 + 100 * n100 + 4 * n4 + n1; if (n100 != 4 && n1 != 4) y++; return y; } /* Takes a count of days from 14 Oct 1582 and translates it into a Gregorian calendar date in (*Y,*M,*D). Also stores the year-relative day number into *YD. Dates both before and after the epoch are supported. */ void calendar_offset_to_gregorian (int ofs, int *y, int *m, int *d, int *yd) { int year = *y = calendar_offset_to_year (ofs); int january1 = raw_gregorian_to_offset (year, 1, 1); int yday = *yd = ofs - january1 + 1; int march1 = january1 + cum_month_days (year, 3); int correction = ofs < march1 ? 0 : (is_leap_year (year) ? 1 : 2); int month = *m = (12 * (yday - 1 + correction) + 373) / 367; *d = yday - cum_month_days (year, month); } /* Takes a count of days from 14 Oct 1582 and returns the 1-based year-relative day number, that is, the number of days from the beginning of the year. */ int calendar_offset_to_yday (int ofs) { int year = calendar_offset_to_year (ofs); int january1 = raw_gregorian_to_offset (year, 1, 1); int yday = ofs - january1 + 1; return yday; } /* Takes a count of days from 14 Oct 1582 and returns the corresponding weekday 1...7, with 1=Sunday. */ int calendar_offset_to_wday (int ofs) { int wday = (ofs - EPOCH + 1) % 7 + 1; if (wday <= 0) wday += 7; return wday; } /* Takes a count of days from 14 Oct 1582 and returns the month it is in. */ int calendar_offset_to_month (int ofs) { int y, m, d, yd; calendar_offset_to_gregorian (ofs, &y, &m, &d, &yd); return m; } /* Takes a count of days from 14 Oct 1582 and returns the corresponding day of the month. */ int calendar_offset_to_mday (int ofs) { int y, m, d, yd; calendar_offset_to_gregorian (ofs, &y, &m, &d, &yd); return d; } /* Returns the number of days in the specified month. */ int calendar_days_in_month (int y, int m) { static const int days_per_month[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; assert (m >= 1 && m <= 12); return m == 2 && is_leap_year (y) ? 29 : days_per_month[m - 1]; } pspp-1.4.1/src/data/por-file-reader.c0000644000175000017500000006161713434127346016756 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 1997-9, 2000, 2006, 2009, 2010, 2011, 2012, 2013, 2014, 2015 Free Software Foundation, Inc. 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 3 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, see . */ #include #include #include #include #include #include #include #include #include #include "data/any-reader.h" #include "data/casereader-provider.h" #include "data/casereader.h" #include "data/dictionary.h" #include "data/file-handle-def.h" #include "data/file-name.h" #include "data/format.h" #include "data/missing-values.h" #include "data/short-names.h" #include "data/value-labels.h" #include "data/variable.h" #include "libpspp/compiler.h" #include "libpspp/i18n.h" #include "libpspp/message.h" #include "libpspp/misc.h" #include "libpspp/pool.h" #include "libpspp/str.h" #include "gl/minmax.h" #include "gl/xalloc.h" #include "gl/xmemdup0.h" #include "gettext.h" #define _(msgid) gettext (msgid) #define N_(msgid) (msgid) /* portable_to_local[PORTABLE] translates the given portable character into the local character set. */ static const char portable_to_local[256] = { " " "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz ." "<(+|&[]!$*);^-/|,%_>?`:$@'=\" ~- 0123456789 -() {}\\ " " " }; /* Portable file reader. */ struct pfm_reader { struct any_reader any_reader; struct pool *pool; /* All the portable file state. */ jmp_buf bail_out; /* longjmp() target for error handling. */ struct dictionary *dict; struct any_read_info info; struct file_handle *fh; /* File handle. */ struct fh_lock *lock; /* Read lock for file. */ FILE *file; /* File stream. */ int line_length; /* Number of characters so far on this line. */ char cc; /* Current character. */ char *trans; /* 256-byte character set translation table. */ int var_cnt; /* Number of variables. */ int weight_index; /* 0-based index of weight variable, or -1. */ struct caseproto *proto; /* Format of output cases. */ bool ok; /* Set false on I/O error. */ }; static const struct casereader_class por_file_casereader_class; static struct pfm_reader * pfm_reader_cast (const struct any_reader *r_) { assert (r_->klass == &por_file_reader_class); return UP_CAST (r_, struct pfm_reader, any_reader); } static void error (struct pfm_reader *r, const char *msg,...) PRINTF_FORMAT (2, 3) NO_RETURN; /* Displays MSG as an error message and aborts reading the portable file via longjmp(). */ static void error (struct pfm_reader *r, const char *msg, ...) { struct string text; va_list args; ds_init_empty (&text); ds_put_format (&text, _("portable file %s corrupt at offset 0x%llx: "), fh_get_file_name (r->fh), (long long int) ftello (r->file)); va_start (args, msg); ds_put_vformat (&text, msg, args); va_end (args); struct msg m = { .category = MSG_C_GENERAL, .severity = MSG_S_ERROR, .text = ds_cstr (&text), }; msg_emit (&m); r->ok = false; longjmp (r->bail_out, 1); } /* Displays MSG as an warning for the current position in portable file reader R. */ static void warning (struct pfm_reader *r, const char *msg, ...) { struct string text; va_list args; ds_init_empty (&text); ds_put_format (&text, _("reading portable file %s at offset 0x%llx: "), fh_get_file_name (r->fh), (long long int) ftello (r->file)); va_start (args, msg); ds_put_vformat (&text, msg, args); va_end (args); struct msg m = { .category = MSG_C_GENERAL, .severity = MSG_S_WARNING, .text = ds_cstr (&text), }; msg_emit (&m); } /* Close and destroy R. Returns false if an error was detected on R, true otherwise. */ static bool pfm_close (struct any_reader *r_) { struct pfm_reader *r = pfm_reader_cast (r_); bool ok; dict_unref (r->dict); any_read_info_destroy (&r->info); if (r->file) { if (fn_close (r->fh, r->file) == EOF) { msg (ME, _("Error closing portable file `%s': %s."), fh_get_file_name (r->fh), strerror (errno)); r->ok = false; } r->file = NULL; } fh_unlock (r->lock); fh_unref (r->fh); ok = r->ok; pool_destroy (r->pool); return ok; } /* Closes portable file reader R, after we're done with it. */ static void por_file_casereader_destroy (struct casereader *reader, void *r_) { struct pfm_reader *r = r_; if (!pfm_close (&r->any_reader)) casereader_force_error (reader); } /* Read a single character into cur_char. */ static void advance (struct pfm_reader *r) { int c; /* Read the next character from the file. Ignore carriage returns entirely. Mostly ignore new-lines, but if a new-line occurs before the line has reached 80 bytes in length, then treat the "missing" bytes as spaces. */ for (;;) { while ((c = getc (r->file)) == '\r') continue; if (c != '\n') break; if (r->line_length < 80) { c = ' '; ungetc ('\n', r->file); break; } r->line_length = 0; } if (c == EOF) error (r, _("unexpected end of file")); if (r->trans != NULL) c = r->trans[c]; r->cc = c; r->line_length++; } /* Skip a single character if present, and return whether it was skipped. */ static inline bool match (struct pfm_reader *r, int c) { if (r->cc == c) { advance (r); return true; } else return false; } static void read_header (struct pfm_reader *); static void read_version_data (struct pfm_reader *, struct any_read_info *); static void read_variables (struct pfm_reader *, struct dictionary *); static void read_value_label (struct pfm_reader *, struct dictionary *); static void read_documents (struct pfm_reader *, struct dictionary *); /* Reads the dictionary from file with handle H, and returns it in a dictionary structure. This dictionary may be modified in order to rename, reorder, and delete variables, etc. */ static struct any_reader * pfm_open (struct file_handle *fh) { struct pool *volatile pool = NULL; struct pfm_reader *volatile r = NULL; /* Create and initialize reader. */ pool = pool_create (); r = pool_alloc (pool, sizeof *r); r->any_reader.klass = &por_file_reader_class; r->dict = dict_create (get_default_encoding ()); memset (&r->info, 0, sizeof r->info); r->pool = pool; r->fh = fh_ref (fh); r->lock = NULL; r->file = NULL; r->line_length = 0; r->weight_index = -1; r->trans = NULL; r->var_cnt = 0; r->proto = NULL; r->ok = true; if (setjmp (r->bail_out)) goto error; /* Lock file. */ /* TRANSLATORS: this fragment will be interpolated into messages in fh_lock() that identify types of files. */ r->lock = fh_lock (fh, FH_REF_FILE, N_("portable file"), FH_ACC_READ, false); if (r->lock == NULL) goto error; /* Open file. */ r->file = fn_open (r->fh, "rb"); if (r->file == NULL) { msg (ME, _("An error occurred while opening `%s' for reading " "as a portable file: %s."), fh_get_file_name (r->fh), strerror (errno)); goto error; } /* Read header, version, date info, product id, variables. */ read_header (r); read_version_data (r, &r->info); read_variables (r, r->dict); /* Read value labels. */ while (match (r, 'D')) read_value_label (r, r->dict); /* Read documents. */ if (match (r, 'E')) read_documents (r, r->dict); /* Check that we've made it to the data. */ if (!match (r, 'F')) error (r, _("Data record expected.")); r->proto = caseproto_ref_pool (dict_get_proto (r->dict), r->pool); return &r->any_reader; error: pfm_close (&r->any_reader); return NULL; } static struct casereader * pfm_decode (struct any_reader *r_, const char *encoding UNUSED, struct dictionary **dictp, struct any_read_info *info) { struct pfm_reader *r = pfm_reader_cast (r_); *dictp = r->dict; r->dict = NULL; if (info) { *info = r->info; memset (&r->info, 0, sizeof r->info); } return casereader_create_sequential (NULL, r->proto, CASENUMBER_MAX, &por_file_casereader_class, r); } /* Returns the value of base-30 digit C, or -1 if C is not a base-30 digit. */ static int base_30_value (unsigned char c) { static const char base_30_digits[] = "0123456789ABCDEFGHIJKLMNOPQRST"; const char *p = strchr (base_30_digits, c); return p != NULL ? p - base_30_digits : -1; } /* Read a floating point value and return its value. */ static double read_float (struct pfm_reader *r) { double num = 0.; int exponent = 0; bool got_dot = false; /* Seen a decimal point? */ bool got_digit = false; /* Seen any digits? */ bool negative = false; /* Number is negative? */ /* Skip leading spaces. */ while (match (r, ' ')) continue; /* `*' indicates system-missing. */ if (match (r, '*')) { advance (r); /* Probably a dot (.) but doesn't appear to matter. */ return SYSMIS; } negative = match (r, '-'); for (;;) { int digit = base_30_value (r->cc); if (digit != -1) { got_digit = true; /* Make sure that multiplication by 30 will not overflow. */ if (num > DBL_MAX * (1. / 30.)) /* The value of the digit doesn't matter, since we have already gotten as many digits as can be represented in a `double'. This doesn't necessarily mean the result will overflow. The exponent may reduce it to within range. We just need to record that there was another digit so that we can multiply by 10 later. */ ++exponent; else num = (num * 30.0) + digit; /* Keep track of the number of digits after the decimal point. If we just divided by 30 here, we would lose precision. */ if (got_dot) --exponent; } else if (!got_dot && r->cc == '.') /* Record that we have found the decimal point. */ got_dot = 1; else /* Any other character terminates the number. */ break; advance (r); } /* Check that we had some digits. */ if (!got_digit) error (r, _("Number expected.")); /* Get exponent if any. */ if (r->cc == '+' || r->cc == '-') { long int exp = 0; bool negative_exponent = r->cc == '-'; int digit; for (advance (r); (digit = base_30_value (r->cc)) != -1; advance (r)) { if (exp > LONG_MAX / 30) { exp = LONG_MAX; break; } exp = exp * 30 + digit; } /* We don't check whether there were actually any digits, but we probably should. */ if (negative_exponent) exp = -exp; exponent += exp; } /* Numbers must end with `/'. */ if (!match (r, '/')) error (r, _("Missing numeric terminator.")); /* Multiply `num' by 30 to the `exponent' power, checking for overflow. */ if (exponent < 0) num *= pow (30.0, (double) exponent); else if (exponent > 0) { if (num > DBL_MAX * pow (30.0, (double) -exponent)) num = DBL_MAX; else num *= pow (30.0, (double) exponent); } return negative ? -num : num; } /* Read an integer and return its value. */ static int read_int (struct pfm_reader *r) { double f = read_float (r); if (floor (f) != f || f >= INT_MAX || f <= INT_MIN) error (r, _("Invalid integer.")); return f; } /* Reads a string into BUF, which must have room for 256 characters. */ static void read_string (struct pfm_reader *r, char *buf) { int n = read_int (r); if (n < 0 || n > 255) error (r, _("Bad string length %d."), n); while (n-- > 0) { *buf++ = r->cc; advance (r); } *buf = '\0'; } /* Reads a string into BUF, which must have room for 256 characters. Returns the number of bytes read. */ static size_t read_bytes (struct pfm_reader *r, uint8_t *buf) { int n = read_int (r); if (n < 0 || n > 255) error (r, _("Bad string length %d."), n); while (n-- > 0) { *buf++ = r->cc; advance (r); } return n; } /* Reads a string and returns a copy of it allocated from R's pool. */ static char * read_pool_string (struct pfm_reader *r) { char string[256]; read_string (r, string); return pool_strdup (r->pool, string); } /* Reads the 464-byte file header. */ static void read_header (struct pfm_reader *r) { char *trans; int i; /* Read and ignore vanity splash strings. */ for (i = 0; i < 200; i++) advance (r); /* Skip the first 64 characters of the translation table. We don't care about these. They are probably all set to '0', marking them as untranslatable, and that would screw up our actual translation of the real '0'. */ for (i = 0; i < 64; i++) advance (r); /* Read the rest of the translation table. */ trans = pool_malloc (r->pool, 256); memset (trans, 0, 256); for (; i < 256; i++) { unsigned char c; advance (r); c = r->cc; if (trans[c] == 0) trans[c] = portable_to_local[i]; } /* Set up the translation table, then read the first translated character. */ r->trans = trans; advance (r); /* Skip and verify signature. */ for (i = 0; i < 8; i++) if (!match (r, "SPSSPORT"[i])) { msg (SE, _("%s: Not a portable file."), fh_get_file_name (r->fh)); longjmp (r->bail_out, 1); } } /* Reads the version and date info record, as well as product and subproduct identification records if present. */ static void read_version_data (struct pfm_reader *r, struct any_read_info *info) { static const char empty_string[] = ""; char *date, *time; const char *product, *subproduct; int i; /* Read file. */ if (!match (r, 'A')) error (r, _("Unrecognized version code `%c'."), r->cc); date = read_pool_string (r); time = read_pool_string (r); product = match (r, '1') ? read_pool_string (r) : empty_string; if (match (r, '2')) { /* Skip "author" field. */ read_pool_string (r); } subproduct = match (r, '3') ? read_pool_string (r) : empty_string; /* Validate file. */ if (strlen (date) != 8) error (r, _("Bad date string length %zu."), strlen (date)); if (strlen (time) != 6) error (r, _("Bad time string length %zu."), strlen (time)); /* Save file info. */ if (info != NULL) { memset (info, 0, sizeof *info); info->float_format = FLOAT_NATIVE_DOUBLE; info->integer_format = INTEGER_NATIVE; info->compression = ANY_COMP_NONE; info->case_cnt = -1; /* Date. */ info->creation_date = xmalloc (11); for (i = 0; i < 8; i++) { static const int map[] = {6, 7, 8, 9, 3, 4, 0, 1}; info->creation_date[map[i]] = date[i]; } info->creation_date[2] = info->creation_date[5] = ' '; info->creation_date[10] = '\0'; /* Time. */ info->creation_time = xmalloc (9); for (i = 0; i < 6; i++) { static const int map[] = {0, 1, 3, 4, 6, 7}; info->creation_time[map[i]] = time[i]; } info->creation_time[2] = info->creation_time[5] = ' '; info->creation_time[8] = 0; /* Product. */ info->product = xstrdup (product); info->product_ext = xstrdup (subproduct); } } /* Translates a format specification read from portable file R as the three integers INTS into a normal format specifier FORMAT, checking that the format is appropriate for variable V. */ static struct fmt_spec convert_format (struct pfm_reader *r, const int portable_format[3], struct variable *v, bool *report_error) { struct fmt_spec format; bool ok; if (!fmt_from_io (portable_format[0], &format.type)) { if (*report_error) warning (r, _("%s: Bad format specifier byte (%d). Variable " "will be assigned a default format."), var_get_name (v), portable_format[0]); goto assign_default; } format.w = portable_format[1]; format.d = portable_format[2]; msg_disable (); ok = (fmt_check_output (&format) && fmt_check_width_compat (&format, var_get_width (v))); msg_enable (); if (!ok) { if (*report_error) { char fmt_string[FMT_STRING_LEN_MAX + 1]; fmt_to_string (&format, fmt_string); if (var_is_numeric (v)) warning (r, _("Numeric variable %s has invalid format " "specifier %s."), var_get_name (v), fmt_string); else warning (r, _("String variable %s with width %d has " "invalid format specifier %s."), var_get_name (v), var_get_width (v), fmt_string); } goto assign_default; } return format; assign_default: *report_error = false; return fmt_default_for_width (var_get_width (v)); } static void parse_value (struct pfm_reader *, int width, union value *); /* Read information on all the variables. */ static void read_variables (struct pfm_reader *r, struct dictionary *dict) { char *weight_name = NULL; int i; if (!match (r, '4')) error (r, _("Expected variable count record.")); r->var_cnt = read_int (r); if (r->var_cnt <= 0) error (r, _("Invalid number of variables %d."), r->var_cnt); if (match (r, '5')) read_int (r); if (match (r, '6')) { weight_name = read_pool_string (r); if (strlen (weight_name) > SHORT_NAME_LEN) error (r, _("Weight variable name (%s) truncated."), weight_name); } for (i = 0; i < r->var_cnt; i++) { int width; char name[256]; int fmt[6]; struct variable *v; struct missing_values miss; struct fmt_spec print, write; bool report_error = true; int j; if (!match (r, '7')) error (r, _("Expected variable record.")); width = read_int (r); if (width < 0) error (r, _("Invalid variable width %d."), width); read_string (r, name); for (j = 0; j < 6; j++) fmt[j] = read_int (r); if (!dict_id_is_valid (dict, name, false) || *name == '#' || *name == '$') error (r, _("Invalid variable name `%s' in position %d."), name, i); str_uppercase (name); if (width < 0 || width > 255) error (r, _("Bad width %d for variable %s."), width, name); v = dict_create_var (dict, name, width); if (v == NULL) { unsigned long int i; for (i = 1; ; i++) { char *try_name = xasprintf ("%s_%lu", name, i); v = dict_create_var (dict, try_name, width); free (try_name); if (v != NULL) break; } warning (r, _("Duplicate variable name %s in position %d renamed " "to %s."), name, i, var_get_name (v)); } print = convert_format (r, &fmt[0], v, &report_error); write = convert_format (r, &fmt[3], v, &report_error); var_set_print_format (v, &print); var_set_write_format (v, &write); /* Range missing values. */ mv_init (&miss, width); if (match (r, 'B')) { double x = read_float (r); double y = read_float (r); mv_add_range (&miss, x, y); } else if (match (r, 'A')) mv_add_range (&miss, read_float (r), HIGHEST); else if (match (r, '9')) mv_add_range (&miss, LOWEST, read_float (r)); /* Single missing values. */ while (match (r, '8')) { int mv_width = MIN (width, 8); union value value; parse_value (r, mv_width, &value); value_resize (&value, mv_width, width); mv_add_value (&miss, &value); value_destroy (&value, width); } var_set_missing_values (v, &miss); mv_destroy (&miss); if (match (r, 'C')) { char label[256]; read_string (r, label); var_set_label (v, label); /* XXX */ } } if (weight_name != NULL) { struct variable *weight_var = dict_lookup_var (dict, weight_name); if (weight_var == NULL) error (r, _("Weighting variable %s not present in dictionary."), weight_name); dict_set_weight (dict, weight_var); } } /* Parse a value of with WIDTH into value V. */ static void parse_value (struct pfm_reader *r, int width, union value *v) { value_init (v, width); if (width > 0) { uint8_t buf[256]; size_t n_bytes = read_bytes (r, buf); value_copy_buf_rpad (v, width, buf, n_bytes, ' '); } else v->f = read_float (r); } /* Parse a value label record and return success. */ static void read_value_label (struct pfm_reader *r, struct dictionary *dict) { /* Variables. */ int nv; struct variable **v; /* Labels. */ int n_labels; int i; nv = read_int (r); v = pool_nalloc (r->pool, nv, sizeof *v); for (i = 0; i < nv; i++) { char name[256]; read_string (r, name); v[i] = dict_lookup_var (dict, name); if (v[i] == NULL) error (r, _("Unknown variable %s while parsing value labels."), name); if (var_get_type (v[0]) != var_get_type (v[i])) error (r, _("Cannot assign value labels to %s and %s, which " "have different variable types."), var_get_name (v[0]), var_get_name (v[i])); } n_labels = read_int (r); for (i = 0; i < n_labels; i++) { union value val; char label[256]; int j; parse_value (r, var_get_width (v[0]), &val); read_string (r, label); /* Assign the value label to each variable. */ for (j = 0; j < nv; j++) var_replace_value_label (v[j], &val, label); value_destroy (&val, var_get_width (v[0])); } } /* Reads a set of documents from portable file R into DICT. */ static void read_documents (struct pfm_reader *r, struct dictionary *dict) { int line_cnt; int i; line_cnt = read_int (r); for (i = 0; i < line_cnt; i++) { char line[256]; read_string (r, line); dict_add_document_line (dict, line, false); } } /* Reads and returns one case from portable file R. Returns a null pointer on failure. */ static struct ccase * por_file_casereader_read (struct casereader *reader, void *r_) { struct pfm_reader *r = r_; struct ccase *volatile c; size_t i; c = case_create (r->proto); setjmp (r->bail_out); if (!r->ok) { casereader_force_error (reader); case_unref (c); return NULL; } /* Check for end of file. */ if (r->cc == 'Z') { case_unref (c); return NULL; } for (i = 0; i < r->var_cnt; i++) { int width = caseproto_get_width (r->proto, i); if (width == 0) case_data_rw_idx (c, i)->f = read_float (r); else { uint8_t buf[256]; size_t n_bytes = read_bytes (r, buf); u8_buf_copy_rpad (case_str_rw_idx (c, i), width, buf, n_bytes, ' '); } } return c; } /* Detects whether FILE is an SPSS portable file. Returns 1 if so, 0 if not, and a negative errno value if there is an error reading FILE. */ static int pfm_detect (FILE *file) { unsigned char header[464]; char trans[256]; int cooked_cnt, raw_cnt, line_len; int i; cooked_cnt = raw_cnt = 0; line_len = 0; while (cooked_cnt < sizeof header) { int c = getc (file); if (c == EOF || raw_cnt++ > 512) return ferror (file) ? -errno : 0; else if (c == '\n') { while (line_len < 80 && cooked_cnt < sizeof header) { header[cooked_cnt++] = ' '; line_len++; } line_len = 0; } else if (c != '\r') { header[cooked_cnt++] = c; line_len++; } } memset (trans, 0, 256); for (i = 64; i < 256; i++) { unsigned char c = header[i + 200]; if (trans[c] == 0) trans[c] = portable_to_local[i]; } for (i = 0; i < 8; i++) if (trans[header[i + 456]] != "SPSSPORT"[i]) return 0; return 1; } static const struct casereader_class por_file_casereader_class = { por_file_casereader_read, por_file_casereader_destroy, NULL, NULL, }; const struct any_reader_class por_file_reader_class = { N_("SPSS Portable File"), pfm_detect, pfm_open, pfm_close, pfm_decode, NULL, /* get_strings */ }; pspp-1.4.1/src/data/transformations.c0000644000175000017500000001347013670210420017210 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 1997-9, 2000, 2006, 2009, 2011, 2013 Free Software Foundation, Inc. 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 3 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, see . */ #include #include "data/transformations.h" #include #include #include "libpspp/str.h" #include "gl/xalloc.h" /* A single transformation. */ struct transformation { /* Offset to add to EXECUTE's return value, if it returns a transformation index. Normally 0 but set to the starting index of a spliced chain after splicing. */ int idx_ofs; trns_finalize_func *finalize; /* Finalize proc. */ trns_proc_func *execute; /* Executes the transformation. */ trns_free_func *free; /* Garbage collector proc. */ void *aux; /* Auxiliary data. */ }; /* A chain of transformations. */ struct trns_chain { struct transformation *trns; /* Array of transformations. */ size_t trns_cnt; /* Number of transformations. */ size_t trns_cap; /* Allocated capacity. */ bool finalized; /* Finalize functions called? */ }; /* Allocates and returns a new transformation chain. */ struct trns_chain * trns_chain_create (void) { struct trns_chain *chain = xmalloc (sizeof *chain); chain->trns = NULL; chain->trns_cnt = 0; chain->trns_cap = 0; chain->finalized = false; return chain; } /* Finalizes all the un-finalized transformations in CHAIN. Any given transformation is only finalized once. */ void trns_chain_finalize (struct trns_chain *chain) { while (!chain->finalized) { size_t i; chain->finalized = true; for (i = 0; i < chain->trns_cnt; i++) { struct transformation *trns = &chain->trns[i]; trns_finalize_func *finalize = trns->finalize; trns->finalize = NULL; if (finalize != NULL) finalize (trns->aux); } } } /* Destroys CHAIN, finalizing it in the process if it has not already been finalized. */ bool trns_chain_destroy (struct trns_chain *chain) { bool ok = true; if (chain != NULL) { size_t i; /* Needed to ensure that the control stack gets cleared. */ trns_chain_finalize (chain); for (i = 0; i < chain->trns_cnt; i++) { struct transformation *trns = &chain->trns[i]; if (trns->free != NULL) ok = trns->free (trns->aux) && ok; } free (chain->trns); free (chain); } return ok; } /* Returns true if CHAIN contains any transformations, false otherwise. */ bool trns_chain_is_empty (const struct trns_chain *chain) { return chain->trns_cnt == 0; } /* Adds a transformation to CHAIN with finalize function FINALIZE, execute function EXECUTE, free function FREE, and auxiliary data AUX. */ void trns_chain_append (struct trns_chain *chain, trns_finalize_func *finalize, trns_proc_func *execute, trns_free_func *free, void *aux) { struct transformation *trns; chain->finalized = false; if (chain->trns_cnt == chain->trns_cap) chain->trns = x2nrealloc (chain->trns, &chain->trns_cap, sizeof *chain->trns); trns = &chain->trns[chain->trns_cnt++]; trns->idx_ofs = 0; trns->finalize = finalize; trns->execute = execute; trns->free = free; trns->aux = aux; } /* Appends the transformations in SRC to those in DST, and destroys SRC. Both DST and SRC must already be finalized. */ void trns_chain_splice (struct trns_chain *dst, struct trns_chain *src) { size_t i; assert (dst->finalized); assert (src->finalized); if (dst->trns_cnt + src->trns_cnt > dst->trns_cap) { dst->trns_cap = dst->trns_cnt + src->trns_cnt; dst->trns = xnrealloc (dst->trns, dst->trns_cap, sizeof *dst->trns); } for (i = 0; i < src->trns_cnt; i++) { struct transformation *d = &dst->trns[i + dst->trns_cnt]; const struct transformation *s = &src->trns[i]; *d = *s; d->idx_ofs += src->trns_cnt; } dst->trns_cnt += src->trns_cnt; src->trns_cnt = 0; trns_chain_destroy (src); } /* Returns the index that a transformation execution function may return to "jump" to the next transformation to be added. */ size_t trns_chain_next (struct trns_chain *chain) { return chain->trns_cnt; } /* Executes the given CHAIN of transformations on *C, passing CASE_NR as the case number. *C may be replaced by a new case. Returns the result code that caused the transformations to terminate, or TRNS_CONTINUE if the transformations finished due to "falling off the end" of the set of transformations. */ enum trns_result trns_chain_execute (const struct trns_chain *chain, enum trns_result start, struct ccase **c, casenumber case_nr) { size_t i; assert (chain->finalized); for (i = start < 0 ? 0 : start; i < chain->trns_cnt;) { struct transformation *trns = &chain->trns[i]; int retval = trns->execute (trns->aux, c, case_nr); if (retval == TRNS_CONTINUE) i++; else if (retval >= 0) i = retval + trns->idx_ofs; else return retval == TRNS_END_CASE ? i + 1 : retval; } return TRNS_CONTINUE; } pspp-1.4.1/src/data/transformations.h0000644000175000017500000000417513320146056017224 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 1997-9, 2000, 2006, 2009, 2011 Free Software Foundation, Inc. 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 3 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, see . */ #ifndef TRANSFORMATIONS_H #define TRANSFORMATIONS_H 1 #include #include #include "data/case.h" /* trns_proc_func return values. */ enum trns_result { TRNS_CONTINUE = -1, /* Continue to next transformation. */ TRNS_DROP_CASE = -2, /* Drop this case. */ TRNS_ERROR = -3, /* A serious error, so stop the procedure. */ TRNS_END_CASE = -4, /* Skip to next case. INPUT PROGRAM only. */ TRNS_END_FILE = -5 /* End of input. INPUT PROGRAM only. */ }; struct ccase; typedef void trns_finalize_func (void *); typedef int trns_proc_func (void *, struct ccase **, casenumber); typedef bool trns_free_func (void *); /* Transformation chains. */ struct trns_chain *trns_chain_create (void); void trns_chain_finalize (struct trns_chain *); bool trns_chain_destroy (struct trns_chain *); bool trns_chain_is_empty (const struct trns_chain *); void trns_chain_append (struct trns_chain *, trns_finalize_func *, trns_proc_func *, trns_free_func *, void *); size_t trns_chain_next (struct trns_chain *); enum trns_result trns_chain_execute (const struct trns_chain *, enum trns_result, struct ccase **, casenumber case_nr); void trns_chain_splice (struct trns_chain *, struct trns_chain *); #endif /* transformations.h */ pspp-1.4.1/src/data/format-guesser.h0000644000175000017500000000220013320146056016721 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2008, 2011 Free Software Foundation, Inc. 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 3 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, see . */ #ifndef FORMAT_GUESSER_H #define FORMAT_GUESSER_H 1 #include "libpspp/str.h" struct fmt_spec; struct fmt_guesser *fmt_guesser_create (void); void fmt_guesser_destroy (struct fmt_guesser *); void fmt_guesser_clear (struct fmt_guesser *); void fmt_guesser_add (struct fmt_guesser *, struct substring); void fmt_guesser_guess (struct fmt_guesser *, struct fmt_spec *); #endif /* format-guesser.h */ pspp-1.4.1/src/data/automake.mk0000644000175000017500000000763513571051220015761 0ustar00blpblp00000000000000# PSPP - a program for statistical analysis. # Copyright (C) 2017 Free Software Foundation, Inc. # # 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 3 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, see . # noinst_LTLIBRARIES += src/data/libdata.la src_data_libdata_la_CPPFLAGS = $(LIBXML2_CFLAGS) $(PG_CFLAGS) $(AM_CPPFLAGS) src_data_libdata_la_LIBADD = $(LIBXML2_LIBS) $(PG_LIBS) src_data_libdata_la_SOURCES = \ src/data/any-reader.c \ src/data/any-reader.h \ src/data/any-writer.c \ src/data/any-writer.h \ src/data/attributes.c \ src/data/attributes.h \ src/data/calendar.c \ src/data/calendar.h \ src/data/case-map.c \ src/data/case-map.h \ src/data/case-matcher.c \ src/data/case-matcher.h \ src/data/caseproto.c \ src/data/caseproto.h \ src/data/case.c \ src/data/casegrouper.c \ src/data/casegrouper.h \ src/data/caseinit.c \ src/data/caseinit.h \ src/data/casereader-filter.c \ src/data/casereader-project.c \ src/data/casereader-provider.h \ src/data/casereader-select.c \ src/data/casereader-shim.c \ src/data/casereader-shim.h \ src/data/casereader-translator.c \ src/data/casereader.c \ src/data/casereader.h \ src/data/casewindow.c \ src/data/casewindow.h \ src/data/casewriter-provider.h \ src/data/casewriter-translator.c \ src/data/casewriter.c \ src/data/casewriter.h \ src/data/case.h \ src/data/case-tmpfile.c \ src/data/case-tmpfile.h \ src/data/csv-file-writer.c \ src/data/csv-file-writer.h \ src/data/data-in.c \ src/data/data-in.h \ src/data/data-out.c \ src/data/data-out.h \ src/data/dataset.c \ src/data/dataset.h \ src/data/dataset-writer.c \ src/data/dataset-writer.h \ src/data/datasheet.c \ src/data/datasheet.h \ src/data/dict-class.c \ src/data/dict-class.h \ src/data/dictionary.c \ src/data/dictionary.h \ src/data/encrypted-file.c \ src/data/encrypted-file.h \ src/data/file-handle-def.c \ src/data/file-handle-def.h \ src/data/file-name.c \ src/data/file-name.h \ src/data/format-guesser.c \ src/data/format-guesser.h \ src/data/format.c \ src/data/format.h \ src/data/format.def \ src/data/gnumeric-reader.c \ src/data/gnumeric-reader.h \ src/data/identifier.c \ src/data/identifier2.c \ src/data/identifier.h \ src/data/lazy-casereader.c \ src/data/lazy-casereader.h \ src/data/mdd-writer.c \ src/data/mdd-writer.h \ src/data/missing-values.c \ src/data/missing-values.h \ src/data/make-file.c \ src/data/make-file.h \ src/data/mrset.c \ src/data/mrset.h \ src/data/ods-reader.c \ src/data/ods-reader.h \ src/data/pc+-file-reader.c \ src/data/por-file-reader.c \ src/data/por-file-writer.c \ src/data/por-file-writer.h \ src/data/psql-reader.c \ src/data/psql-reader.h \ src/data/session.c \ src/data/session.h \ src/data/settings.c \ src/data/settings.h \ src/data/short-names.c \ src/data/short-names.h \ src/data/spreadsheet-reader.c \ src/data/spreadsheet-reader.h \ src/data/subcase.c \ src/data/subcase.h \ src/data/sys-file-encoding.c \ src/data/sys-file-private.c \ src/data/sys-file-private.h \ src/data/sys-file-reader.c \ src/data/sys-file-writer.c \ src/data/sys-file-writer.h \ src/data/transformations.c \ src/data/transformations.h \ src/data/val-type.h \ src/data/value.c \ src/data/value.h \ src/data/value-labels.c \ src/data/value-labels.h \ src/data/vardict.h \ src/data/variable.h \ src/data/variable.c \ src/data/vector.c \ src/data/vector.h EXTRA_DIST += src/data/sys-file-encoding.pl pspp-1.4.1/src/data/case-matcher.c0000644000175000017500000001107613320146056016320 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2008, 2009, 2011 Free Software Foundation, Inc. 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 3 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, see . */ #include #include "data/case-matcher.h" #include #include "data/case.h" #include "data/subcase.h" #include "data/value.h" #include "libpspp/assertion.h" #include "gl/xalloc.h" struct case_matcher_input { struct subcase by_vars; struct ccase **data; bool *is_minimal; }; struct case_matcher { struct case_matcher_input *inputs; size_t n_inputs, allocated_inputs; union value *by_values; }; /* Creates and returns a new case matcher. */ struct case_matcher * case_matcher_create (void) { struct case_matcher *cm = xmalloc (sizeof *cm); cm->inputs = NULL; cm->n_inputs = 0; cm->allocated_inputs = 0; cm->by_values = NULL; return cm; } /* Adds a new input file to case matcher CM. case_matcher_match() will compare the variables specified in BY in case *DATA and set *IS_MINIMAL appropriately. (The caller may change the case that *DATA points to from one call to the next.) All of the BY subcases provided to this function for a given CM must be conformable (see subcase_conformable()). */ void case_matcher_add_input (struct case_matcher *cm, const struct subcase *by, struct ccase **data, bool *is_minimal) { struct case_matcher_input *input; if (cm->n_inputs == 0) { cm->by_values = xmalloc (sizeof *cm->by_values * subcase_get_n_fields (by)); caseproto_init_values (subcase_get_proto (by), cm->by_values); } else assert (subcase_conformable (by, &cm->inputs[0].by_vars)); if (cm->n_inputs >= cm->allocated_inputs) cm->inputs = x2nrealloc (cm->inputs, &cm->allocated_inputs, sizeof *cm->inputs); input = &cm->inputs[cm->n_inputs++]; subcase_clone (&input->by_vars, by); input->data = data; input->is_minimal = is_minimal; } /* Destroys case matcher CM. */ void case_matcher_destroy (struct case_matcher *cm) { if (cm != NULL) { size_t i; if (cm->by_values != NULL) { caseproto_destroy_values (subcase_get_proto (&cm->inputs[0].by_vars), cm->by_values); free (cm->by_values); } for (i = 0; i < cm->n_inputs; i++) { struct case_matcher_input *input = &cm->inputs[i]; subcase_destroy (&input->by_vars); } free (cm->inputs); free (cm); } } static int compare_BY_3way (struct case_matcher_input *a, struct case_matcher_input *b) { return subcase_compare_3way (&a->by_vars, *a->data, &b->by_vars, *b->data); } /* Compares the values of the BY variables in all of the nonnull cases provided to case_matcher_add_input() for CM, sets *IS_MINIMAL for each one to true if it has the minimum BY values among those cases or to false if its BY values are greater than the minimum. Also sets *IS_MINIMAL to false for null cases. Sets *BY to the BY values extracted from the minimum case. (The caller must not free *BY.) Returns true if at least one of the cases is nonnull, false if they are all null.*/ bool case_matcher_match (struct case_matcher *cm, union value **by) { struct case_matcher_input *file, *min; min = NULL; for (file = cm->inputs; file < &cm->inputs[cm->n_inputs]; file++) if (*file->data != NULL) { int cmp = min != NULL ? compare_BY_3way (min, file) : 1; if (cmp < 0) *file->is_minimal = false; else { *file->is_minimal = true; if (cmp > 0) min = file; } } else *file->is_minimal = false; if (min != NULL) { for (file = cm->inputs; file < min; file++) *file->is_minimal = false; subcase_extract (&min->by_vars, *min->data, cm->by_values); *by = cm->by_values; return true; } else { *by = NULL; return false; } } pspp-1.4.1/src/data/format.h0000644000175000017500000001644413410503302015254 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 1997-9, 2000, 2006, 2010, 2011, 2012 Free Software Foundation, Inc. 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 3 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, see . */ #ifndef DATA_FORMAT_H #define DATA_FORMAT_H 1 /* Display format types. */ #include #include #include "data/val-type.h" #include "libpspp/str.h" /* How a format is going to be used. */ enum fmt_use { FMT_FOR_INPUT, /* For parsing data input, e.g. data_in(). */ FMT_FOR_OUTPUT /* For formatting data output, e.g. data_out(). */ }; /* Format type categories. Each format is in exactly one category. We give categories bitwise disjoint values only to enable bitwise comparisons against a mask of FMT_CAT_* values, not to allow multiple categories per format. */ enum fmt_category { /* Numeric formats. */ FMT_CAT_BASIC = 0x001, /* Basic numeric formats. */ FMT_CAT_CUSTOM = 0x002, /* Custom currency formats. */ FMT_CAT_LEGACY = 0x004, /* Legacy numeric formats. */ FMT_CAT_BINARY = 0x008, /* Binary formats. */ FMT_CAT_HEXADECIMAL = 0x010, /* Hexadecimal formats. */ FMT_CAT_DATE = 0x020, /* Date formats. */ FMT_CAT_TIME = 0x040, /* Time formats. */ FMT_CAT_DATE_COMPONENT = 0x080, /* Date component formats. */ /* String formats. */ FMT_CAT_STRING = 0x100 /* String formats. */ }; /* Format type. */ enum fmt_type { #define FMT(NAME, METHOD, IMIN, OMIN, IO, CATEGORY) FMT_##NAME, #include "format.def" FMT_NUMBER_OF_FORMATS, }; /* Length of longest format specifier name, not including terminating null. */ #define FMT_TYPE_LEN_MAX 8 /* Length of longest string representation of fmt_spec, not including terminating null. */ #define FMT_STRING_LEN_MAX 32 /* Display format. */ struct fmt_spec { enum fmt_type type; /* One of FMT_*. */ int w; /* Width. */ int d; /* Number of decimal places. */ }; /* Maximum width of any numeric format. */ #define FMT_MAX_NUMERIC_WIDTH 40 /* Constructing formats. */ struct fmt_spec fmt_for_input (enum fmt_type, int w, int d) PURE_FUNCTION; struct fmt_spec fmt_for_output (enum fmt_type, int w, int d) PURE_FUNCTION; struct fmt_spec fmt_for_output_from_input (const struct fmt_spec *); struct fmt_spec fmt_default_for_width (int width); /* Verifying formats. */ bool fmt_check (const struct fmt_spec *, enum fmt_use); bool fmt_check_input (const struct fmt_spec *); bool fmt_check_output (const struct fmt_spec *); bool fmt_check_type_compat (const struct fmt_spec *, enum val_type); bool fmt_check_width_compat (const struct fmt_spec *, int var_width); /* Working with formats. */ int fmt_var_width (const struct fmt_spec *); char *fmt_to_string (const struct fmt_spec *, char s[FMT_STRING_LEN_MAX + 1]); bool fmt_equal (const struct fmt_spec *, const struct fmt_spec *); bool fmt_resize (struct fmt_spec *, int new_width); void fmt_fix (struct fmt_spec *, enum fmt_use); void fmt_fix_input (struct fmt_spec *); void fmt_fix_output (struct fmt_spec *); void fmt_change_width (struct fmt_spec *, int width, enum fmt_use); void fmt_change_decimals (struct fmt_spec *, int decimals, enum fmt_use); /* Format types. */ bool is_fmt_type (enum fmt_type); const char *fmt_name (enum fmt_type) PURE_FUNCTION; bool fmt_from_name (const char *name, enum fmt_type *); bool fmt_takes_decimals (enum fmt_type) PURE_FUNCTION; int fmt_min_width (enum fmt_type, enum fmt_use) PURE_FUNCTION; int fmt_max_width (enum fmt_type, enum fmt_use) PURE_FUNCTION; int fmt_max_decimals (enum fmt_type, int width, enum fmt_use) PURE_FUNCTION; int fmt_min_input_width (enum fmt_type) PURE_FUNCTION; int fmt_max_input_width (enum fmt_type) PURE_FUNCTION; int fmt_max_input_decimals (enum fmt_type, int width) PURE_FUNCTION; int fmt_min_output_width (enum fmt_type) PURE_FUNCTION; int fmt_max_output_width (enum fmt_type) PURE_FUNCTION; int fmt_max_output_decimals (enum fmt_type, int width) PURE_FUNCTION; int fmt_step_width (enum fmt_type) PURE_FUNCTION; bool fmt_is_string (enum fmt_type) PURE_FUNCTION; bool fmt_is_numeric (enum fmt_type) PURE_FUNCTION; enum fmt_category fmt_get_category (enum fmt_type) PURE_FUNCTION; enum fmt_type fmt_input_to_output (enum fmt_type) PURE_FUNCTION; bool fmt_usable_for_input (enum fmt_type) PURE_FUNCTION; int fmt_to_io (enum fmt_type) PURE_FUNCTION; bool fmt_from_io (int io, enum fmt_type *); bool fmt_from_u32 (uint32_t, int var_width, bool loose, struct fmt_spec *); const char *fmt_date_template (enum fmt_type, int width) PURE_FUNCTION; const char *fmt_gui_name (enum fmt_type); /* Format settings. A fmt_settings is really just a collection of one "struct fmt_number_style" for each format type. */ struct fmt_settings *fmt_settings_create (void); void fmt_settings_destroy (struct fmt_settings *); struct fmt_settings *fmt_settings_clone (const struct fmt_settings *); void fmt_settings_set_decimal (struct fmt_settings *, char); const struct fmt_number_style *fmt_settings_get_style ( const struct fmt_settings *, enum fmt_type); void fmt_settings_set_style (struct fmt_settings *, enum fmt_type, char decimal, char grouping, const char *neg_prefix, const char *prefix, const char *suffix, const char *neg_suffix); /* A prefix or suffix for a numeric output format. */ struct fmt_affix { char *s; /* String contents of affix, in UTF-8. */ int width; /* Display width in columns (see wcwidth()). */ }; /* A numeric output style. */ struct fmt_number_style { struct fmt_affix neg_prefix; /* Negative prefix. */ struct fmt_affix prefix; /* Prefix. */ struct fmt_affix suffix; /* Suffix. */ struct fmt_affix neg_suffix; /* Negative suffix. */ char decimal; /* Decimal point: '.' or ','. */ char grouping; /* Grouping character: ',', '.', or 0. */ /* A fmt_affix may require more bytes than its display width; for example, U+00A5 (¥) is 3 bytes in UTF-8 but occupies only one display column. This member is the sum of the number of bytes required by all of the fmt_affix members in this struct, minus their display widths. Thus, it can be used to size memory allocations: for example, the formatted result of CCA20.5 requires no more than (20 + extra_bytes) bytes in UTF-8. */ int extra_bytes; }; int fmt_affix_width (const struct fmt_number_style *); int fmt_neg_affix_width (const struct fmt_number_style *); extern const struct fmt_spec F_8_0 ; extern const struct fmt_spec F_8_2 ; extern const struct fmt_spec F_4_3 ; extern const struct fmt_spec F_5_1 ; #endif /* data/format.h */ pspp-1.4.1/src/data/por-file-writer.c0000644000175000017500000005733713670210420017020 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 1997-9, 2000, 2006, 2009, 2010, 2011, 2012, 2013 Free Software Foundation, Inc. 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 3 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, see . */ #include #include "data/por-file-writer.h" #include #include #include #include #include #include #include #include #include "data/case.h" #include "data/casewriter-provider.h" #include "data/casewriter.h" #include "data/dictionary.h" #include "data/file-handle-def.h" #include "data/format.h" #include "data/make-file.h" #include "data/missing-values.h" #include "data/short-names.h" #include "data/value-labels.h" #include "data/variable.h" #include "libpspp/message.h" #include "libpspp/misc.h" #include "libpspp/str.h" #include "libpspp/version.h" #include "gl/minmax.h" #include "gl/xalloc.h" #include "gettext.h" #define _(msgid) gettext (msgid) #define N_(msgid) (msgid) /* Maximum width of a variable in a portable file. */ #define MAX_POR_WIDTH 255 /* Portable file writer. */ struct pfm_writer { struct file_handle *fh; /* File handle. */ struct fh_lock *lock; /* Lock on file handle. */ FILE *file; /* File stream. */ struct replace_file *rf; /* Ticket for replacing output file. */ int lc; /* Number of characters on this line so far. */ size_t var_cnt; /* Number of variables. */ struct pfm_var *vars; /* Variables. */ int digits; /* Digits of precision. */ }; /* A variable to write to the portable file. */ struct pfm_var { int width; /* 0=numeric, otherwise string var width. */ int case_index; /* Index in case. */ }; static const struct casewriter_class por_file_casewriter_class; static bool close_writer (struct pfm_writer *); static void buf_write (struct pfm_writer *, const void *, size_t); static void write_header (struct pfm_writer *); static void write_version_data (struct pfm_writer *); static void write_variables (struct pfm_writer *, struct dictionary *); static void write_value_labels (struct pfm_writer *, const struct dictionary *); static void write_documents (struct pfm_writer *, const struct dictionary *); static void format_trig_double (long double, int base_10_precision, char[]); static char *format_trig_int (int, bool force_sign, char[]); /* Returns default options for writing a portable file. */ struct pfm_write_options pfm_writer_default_options (void) { struct pfm_write_options opts; opts.create_writeable = true; opts.type = PFM_COMM; opts.digits = DBL_DIG; return opts; } /* Writes the dictionary DICT to portable file HANDLE according to the given OPTS. Returns nonzero only if successful. DICT will not be modified, except to assign short names. */ struct casewriter * pfm_open_writer (struct file_handle *fh, struct dictionary *dict, struct pfm_write_options opts) { struct pfm_writer *w = NULL; mode_t mode; size_t i; /* Initialize data structures. */ w = xmalloc (sizeof *w); w->fh = fh_ref (fh); w->lock = NULL; w->file = NULL; w->rf = NULL; w->lc = 0; w->var_cnt = 0; w->vars = NULL; w->var_cnt = dict_get_var_cnt (dict); w->vars = xnmalloc (w->var_cnt, sizeof *w->vars); for (i = 0; i < w->var_cnt; i++) { const struct variable *dv = dict_get_var (dict, i); struct pfm_var *pv = &w->vars[i]; pv->width = MIN (var_get_width (dv), MAX_POR_WIDTH); pv->case_index = var_get_case_index (dv); } w->digits = opts.digits; if (w->digits < 1) { msg (ME, _("Invalid decimal digits count %d. Treating as %d."), w->digits, DBL_DIG); w->digits = DBL_DIG; } /* Lock file. */ /* TRANSLATORS: this fragment will be interpolated into messages in fh_lock() that identify types of files. */ w->lock = fh_lock (fh, FH_REF_FILE, N_("portable file"), FH_ACC_WRITE, true); if (w->lock == NULL) goto error; /* Create file. */ mode = 0444; if (opts.create_writeable) mode |= 0222; w->rf = replace_file_start (fh, "w", mode, &w->file); if (w->rf == NULL) { msg (ME, _("Error opening `%s' for writing as a portable file: %s."), fh_get_file_name (fh), strerror (errno)); goto error; } /* Write file header. */ write_header (w); write_version_data (w); write_variables (w, dict); write_value_labels (w, dict); if (dict_get_document_line_cnt (dict) > 0) write_documents (w, dict); buf_write (w, "F", 1); if (ferror (w->file)) goto error; return casewriter_create (dict_get_proto (dict), &por_file_casewriter_class, w); error: close_writer (w); return NULL; } /* Write NBYTES starting at BUF to the portable file represented by H. Break lines properly every 80 characters. */ static void buf_write (struct pfm_writer *w, const void *buf_, size_t nbytes) { const char *buf = buf_; if (ferror (w->file)) return; assert (buf != NULL); while (nbytes + w->lc >= 80) { size_t n = 80 - w->lc; if (n) fwrite (buf, n, 1, w->file); fwrite ("\r\n", 2, 1, w->file); nbytes -= n; buf += n; w->lc = 0; } fwrite (buf, nbytes, 1, w->file); w->lc += nbytes; } /* Write D to the portable file as a floating-point field. */ static void write_float (struct pfm_writer *w, double d) { char buffer[64]; format_trig_double (d, floor (d) == d ? DBL_DIG : w->digits, buffer); buf_write (w, buffer, strlen (buffer)); if (d != SYSMIS) buf_write (w, "/", 1); } /* Write N to the portable file as an integer field. */ static void write_int (struct pfm_writer *w, int n) { char buffer[64]; format_trig_int (n, false, buffer); buf_write (w, buffer, strlen (buffer)); buf_write (w, "/", 1); } /* Write S to the portable file as a string field. */ static void write_string (struct pfm_writer *w, const char *s) { size_t n = strlen (s); write_int (w, (int) n); buf_write (w, s, n); } /* Write file header. */ static void write_header (struct pfm_writer *w) { static const char spss2ascii[256] = { "0000000000000000000000000000000000000000000000000000000000000000" "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz ." "<(+|&[]!$*);^-/|,%_>?`:$@'=\"000000~-0000123456789000-()0{}\\00000" "0000000000000000000000000000000000000000000000000000000000000000" }; int i; for (i = 0; i < 5; i++) buf_write (w, "ASCII SPSS PORT FILE ", 40); buf_write (w, spss2ascii, 256); buf_write (w, "SPSSPORT", 8); } /* Writes version, date, and identification records. */ static void write_version_data (struct pfm_writer *w) { time_t t; struct tm tm; struct tm *tmp; if ((time_t) -1 == time (&t)) { tm.tm_sec = tm.tm_min = tm.tm_hour = tm.tm_mon = tm.tm_year = 0; tm.tm_mday = 1; tmp = &tm; } else tmp = localtime (&t); char *date_str = xasprintf ("%04d%02d%02d", tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday); char *time_str = xasprintf ("%02d%02d%02d", tmp->tm_hour, tmp->tm_min, tmp->tm_sec); buf_write (w, "A", 1); write_string (w, date_str); write_string (w, time_str); free (date_str); free (time_str); /* Product identification. */ buf_write (w, "1", 1); write_string (w, version); /* Subproduct identification. */ buf_write (w, "3", 1); write_string (w, host_system); } /* Write format F to file H. The format is first resized to fit a value of the given WIDTH, which is handy in case F represents a string longer than 255 bytes and thus WIDTH is truncated to 255 bytes. */ static void write_format (struct pfm_writer *w, struct fmt_spec f, int width) { fmt_resize (&f, width); write_int (w, fmt_to_io (f.type)); write_int (w, f.w); write_int (w, f.d); } /* Write value V with width WIDTH to file H. */ static void write_value (struct pfm_writer *w, const union value *v, int width) { if (width == 0) write_float (w, v->f); else { width = MIN (width, MAX_POR_WIDTH); write_int (w, width); buf_write (w, v->s, width); } } /* Write variable records. */ static void write_variables (struct pfm_writer *w, struct dictionary *dict) { int i; short_names_assign (dict); if (dict_get_weight (dict) != NULL) { buf_write (w, "6", 1); write_string (w, var_get_short_name (dict_get_weight (dict), 0)); } buf_write (w, "4", 1); write_int (w, dict_get_var_cnt (dict)); buf_write (w, "5", 1); write_int (w, ceil (w->digits * (log (10) / log (30)))); for (i = 0; i < dict_get_var_cnt (dict); i++) { struct variable *v = dict_get_var (dict, i); struct missing_values mv; int width = MIN (var_get_width (v), MAX_POR_WIDTH); int j; buf_write (w, "7", 1); write_int (w, width); write_string (w, var_get_short_name (v, 0)); write_format (w, *var_get_print_format (v), width); write_format (w, *var_get_write_format (v), width); /* Write missing values. */ mv_copy (&mv, var_get_missing_values (v)); if (var_get_width (v) > 8) mv_resize (&mv, 8); if (mv_has_range (&mv)) { double x, y; mv_get_range (&mv, &x, &y); if (x == LOWEST) { buf_write (w, "9", 1); write_float (w, y); } else if (y == HIGHEST) { buf_write (w, "A", 1); write_float (w, y); } else { buf_write (w, "B", 1); write_float (w, x); write_float (w, y); } } for (j = 0; j < mv_n_values (&mv); j++) { buf_write (w, "8", 1); write_value (w, mv_get_value (&mv, j), mv_get_width (&mv)); } mv_destroy (&mv); /* Write variable label. */ if (var_get_label (v) != NULL) { buf_write (w, "C", 1); write_string (w, var_get_label (v)); } } } /* Write value labels to disk. FIXME: Inefficient. */ static void write_value_labels (struct pfm_writer *w, const struct dictionary *dict) { int i; for (i = 0; i < dict_get_var_cnt (dict); i++) { struct variable *v = dict_get_var (dict, i); const struct val_labs *val_labs = var_get_value_labels (v); size_t n_labels = val_labs_count (val_labs); const struct val_lab **labels; int j; if (n_labels == 0) continue; buf_write (w, "D", 1); write_int (w, 1); write_string (w, var_get_short_name (v, 0)); write_int (w, val_labs_count (val_labs)); n_labels = val_labs_count (val_labs); labels = val_labs_sorted (val_labs); for (j = 0; j < n_labels; j++) { const struct val_lab *vl = labels[j]; write_value (w, val_lab_get_value (vl), var_get_width (v)); write_string (w, val_lab_get_escaped_label (vl)); } free (labels); } } /* Write documents in DICT to portable file W. */ static void write_documents (struct pfm_writer *w, const struct dictionary *dict) { size_t line_cnt = dict_get_document_line_cnt (dict); struct string line = DS_EMPTY_INITIALIZER; int i; buf_write (w, "E", 1); write_int (w, line_cnt); for (i = 0; i < line_cnt; i++) write_string (w, dict_get_document_line (dict, i)); ds_destroy (&line); } /* Writes case C to the portable file represented by WRITER. */ static void por_file_casewriter_write (struct casewriter *writer, void *w_, struct ccase *c) { struct pfm_writer *w = w_; int i; if (!ferror (w->file)) { for (i = 0; i < w->var_cnt; i++) { struct pfm_var *v = &w->vars[i]; if (v->width == 0) write_float (w, case_num_idx (c, v->case_index)); else { write_int (w, v->width); buf_write (w, case_str_idx (c, v->case_index), v->width); } } } else casewriter_force_error (writer); case_unref (c); } static void por_file_casewriter_destroy (struct casewriter *writer, void *w_) { struct pfm_writer *w = w_; if (!close_writer (w)) casewriter_force_error (writer); } /* Closes a portable file after we're done with it. Returns true if successful, false if an I/O error occurred. */ static bool close_writer (struct pfm_writer *w) { bool ok; if (w == NULL) return true; ok = true; if (w->file != NULL) { char buf[80]; memset (buf, 'Z', sizeof buf); buf_write (w, buf, w->lc >= 80 ? 80 : 80 - w->lc); ok = !ferror (w->file); if (fclose (w->file) == EOF) ok = false; if (!ok) msg (ME, _("An I/O error occurred writing portable file `%s'."), fh_get_file_name (w->fh)); if (ok ? !replace_file_commit (w->rf) : !replace_file_abort (w->rf)) ok = false; } fh_unlock (w->lock); fh_unref (w->fh); free (w->vars); free (w); return ok; } /* Base-30 conversion. Portable files represent numbers in base-30 format, so we need to be able to convert real and integer number to that base. Older versions of PSPP used libgmp to do so, but this added a big library dependency to do just one thing. Now we do it ourselves internally. Important fact: base 30 is called "trigesimal". */ /* Conversion base. */ #define BASE 30 /* As an integer. */ #define LDBASE ((long double) BASE) /* As a long double. */ /* This is floor(log30(2**31)), the minimum number of trigesimal digits that a `long int' can hold. */ #define CHUNK_SIZE 6 /* pow_tab[i] = pow (30, pow (2, i)) */ static long double pow_tab[16]; /* Initializes pow_tab[]. */ static void init_pow_tab (void) { static bool did_init = false; long double power; size_t i; /* Only initialize once. */ if (did_init) return; did_init = true; /* Set each element of pow_tab[] until we run out of numerical range. */ i = 0; for (power = 30.0L; power < DBL_MAX; power *= power) { assert (i < sizeof pow_tab / sizeof *pow_tab); pow_tab[i++] = power; } } /* Returns 30**EXPONENT, for 0 <= EXPONENT <= log30(DBL_MAX). */ static long double pow30_nonnegative (int exponent) { long double power; int i; assert (exponent >= 0); assert (exponent < 1L << (sizeof pow_tab / sizeof *pow_tab)); power = 1.L; for (i = 0; exponent > 0; exponent >>= 1, i++) if (exponent & 1) power *= pow_tab[i]; return power; } /* Returns 30**EXPONENT, for log30(DBL_MIN) <= EXPONENT <= log30(DBL_MAX). */ static long double pow30 (int exponent) { if (exponent >= 0) return pow30_nonnegative (exponent); else return 1.L / pow30_nonnegative (-exponent); } /* Returns the character corresponding to TRIG. */ static int trig_to_char (int trig) { assert (trig >= 0 && trig < 30); return "0123456789ABCDEFGHIJKLMNOPQRST"[trig]; } /* Formats the TRIG_CNT trigs in TRIGS[], writing them as null-terminated STRING. The trigesimal point is inserted after TRIG_PLACES characters have been printed, if necessary adding extra zeros at either end for correctness. Returns the character after the formatted number. */ static char * format_trig_digits (char *string, const char trigs[], int trig_cnt, int trig_places) { if (trig_places < 0) { *string++ = '.'; while (trig_places++ < 0) *string++ = '0'; trig_places = -1; } while (trig_cnt-- > 0) { if (trig_places-- == 0) *string++ = '.'; *string++ = trig_to_char (*trigs++); } while (trig_places-- > 0) *string++ = '0'; *string = '\0'; return string; } /* Helper function for format_trig_int() that formats VALUE as a trigesimal integer at CP. VALUE must be nonnegative. Returns the character following the formatted integer. */ static char * recurse_format_trig_int (char *cp, int value) { int trig = value % BASE; value /= BASE; if (value > 0) cp = recurse_format_trig_int (cp, value); *cp++ = trig_to_char (trig); return cp; } /* Formats VALUE as a trigesimal integer in null-terminated STRING[]. VALUE must be in the range -DBL_MAX...DBL_MAX. If FORCE_SIGN is true, a sign is always inserted; otherwise, a sign is only inserted if VALUE is negative. */ static char * format_trig_int (int value, bool force_sign, char string[]) { /* Insert sign. */ if (value < 0) { *string++ = '-'; value = -value; } else if (force_sign) *string++ = '+'; /* Format integer. */ string = recurse_format_trig_int (string, value); *string = '\0'; return string; } /* Determines whether the TRIG_CNT trigesimals in TRIGS[] warrant rounding up or down. Returns true if TRIGS[] represents a value greater than half, false if less than half. If TRIGS[] is exactly half, examines TRIGS[-1] and returns true if odd, false if even ("round to even"). */ static bool should_round_up (const char trigs[], int trig_cnt) { assert (trig_cnt > 0); if (*trigs < BASE / 2) { /* Less than half: round down. */ return false; } else if (*trigs > BASE / 2) { /* Greater than half: round up. */ return true; } else { /* Approximately half: look more closely. */ int i; for (i = 1; i < trig_cnt; i++) if (trigs[i] > 0) { /* Slightly greater than half: round up. */ return true; } /* Exactly half: round to even. */ return trigs[-1] % 2; } } /* Rounds up the rightmost trig in the TRIG_CNT trigs in TRIGS[], carrying to the left as necessary. Returns true if successful, false on failure (due to a carry out of the leftmost position). */ static bool try_round_up (char *trigs, int trig_cnt) { while (trig_cnt > 0) { char *round_trig = trigs + --trig_cnt; if (*round_trig != BASE - 1) { /* Round this trig up to the next value. */ ++*round_trig; return true; } /* Carry over to the next trig to the left. */ *round_trig = 0; } /* Ran out of trigs to carry. */ return false; } /* Converts VALUE to trigesimal format in string OUTPUT[] with the equivalent of at least BASE_10_PRECISION decimal digits of precision. The output format may use conventional or scientific notation. Missing, infinite, and extreme values are represented with "*.". */ static void format_trig_double (long double value, int base_10_precision, char output[]) { /* Original VALUE was negative? */ bool negative; /* Number of significant trigesimals. */ int base_30_precision; /* Base-2 significand and exponent for original VALUE. */ double base_2_sig; int base_2_exp; /* VALUE as a set of trigesimals. */ char buffer[DBL_DIG + 16]; char *trigs; int trig_cnt; /* Number of trigesimal places for trigs. trigs[0] has coefficient 30**(trig_places - 1), trigs[1] has coefficient 30**(trig_places - 2), and so on. In other words, the trigesimal point is just before trigs[0]. */ int trig_places; /* Number of trigesimal places left to write into BUFFER. */ int trigs_to_output; init_pow_tab (); /* Handle special cases. */ if (value == SYSMIS) goto missing_value; if (value == 0.) goto zero; /* Make VALUE positive. */ if (value < 0) { value = -value; negative = true; } else negative = false; /* Adjust VALUE to roughly 30**3, by shifting the trigesimal point left or right as necessary. We approximate the base-30 exponent by obtaining the base-2 exponent, then multiplying by log30(2). This approximation is sufficient to ensure that the adjusted VALUE is always in the range 0...30**6, an invariant of the loop below. */ errno = 0; base_2_sig = frexp (value, &base_2_exp); if (errno != 0 || !isfinite (base_2_sig)) goto missing_value; if (base_2_exp == 0 && base_2_sig == 0.) goto zero; if (base_2_exp <= INT_MIN / 20379L || base_2_exp >= INT_MAX / 20379L) goto missing_value; trig_places = (base_2_exp * 20379L / 100000L) + CHUNK_SIZE / 2; value *= pow30 (CHUNK_SIZE - trig_places); /* Dump all the trigs to buffer[], CHUNK_SIZE at a time. */ trigs = buffer; trig_cnt = 0; for (trigs_to_output = DIV_RND_UP (DBL_DIG * 2, 3) + 1 + (CHUNK_SIZE / 2); trigs_to_output > 0; trigs_to_output -= CHUNK_SIZE) { long chunk; int trigs_left; /* The current chunk is just the integer part of VALUE, truncated to the nearest integer. The chunk fits in a long. */ chunk = value; assert (pow30 (CHUNK_SIZE) <= LONG_MAX); assert (chunk >= 0 && chunk < pow30 (CHUNK_SIZE)); value -= chunk; /* Append the chunk, in base 30, to trigs[]. */ for (trigs_left = CHUNK_SIZE; chunk > 0 && trigs_left > 0;) { trigs[trig_cnt + --trigs_left] = chunk % 30; chunk /= 30; } while (trigs_left > 0) trigs[trig_cnt + --trigs_left] = 0; trig_cnt += CHUNK_SIZE; /* Proceed to the next chunk. */ if (value == 0.) break; value *= pow (LDBASE, CHUNK_SIZE); } /* Strip leading zeros. */ while (trig_cnt > 1 && *trigs == 0) { trigs++; trig_cnt--; trig_places--; } /* Round to requested precision, conservatively estimating the required base-30 precision as 2/3 of the base-10 precision (log30(10) = .68). */ assert (base_10_precision > 0); if (base_10_precision > LDBL_DIG) base_10_precision = LDBL_DIG; base_30_precision = DIV_RND_UP (base_10_precision * 2, 3); if (trig_cnt > base_30_precision) { if (should_round_up (trigs + base_30_precision, trig_cnt - base_30_precision)) { /* Try to round up. */ if (try_round_up (trigs, base_30_precision)) { /* Rounding up worked. */ trig_cnt = base_30_precision; } else { /* Couldn't round up because we ran out of trigs to carry into. Do the carry here instead. */ *trigs = 1; trig_cnt = 1; trig_places++; } } else { /* Round down. */ trig_cnt = base_30_precision; } } else { /* No rounding required: fewer digits available than requested. */ } /* Strip trailing zeros. */ while (trig_cnt > 1 && trigs[trig_cnt - 1] == 0) trig_cnt--; /* Write output. */ if (negative) *output++ = '-'; if (trig_places >= -1 && trig_places < trig_cnt + 3) { /* Use conventional notation. */ format_trig_digits (output, trigs, trig_cnt, trig_places); } else { /* Use scientific notation. */ char *op; op = format_trig_digits (output, trigs, trig_cnt, trig_cnt); op = format_trig_int (trig_places - trig_cnt, true, op); } return; zero: strcpy (output, "0"); return; missing_value: strcpy (output, "*."); return; } static const struct casewriter_class por_file_casewriter_class = { por_file_casewriter_write, por_file_casewriter_destroy, NULL, }; pspp-1.4.1/src/data/gnumeric-reader.c0000644000175000017500000005277613670210420017044 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2007, 2009, 2010, 2011, 2012, 2013, 2016 Free Software Foundation, Inc. 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 3 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, see . */ #include #include "data/gnumeric-reader.h" #include "spreadsheet-reader.h" #include #include #include #include #include #include "data/case.h" #include "data/casereader-provider.h" #include "data/data-in.h" #include "data/dictionary.h" #include "data/format.h" #include "data/identifier.h" #include "data/value.h" #include "data/variable.h" #include "libpspp/i18n.h" #include "libpspp/message.h" #include "libpspp/misc.h" #include "libpspp/str.h" #include "gl/c-strtod.h" #include "gl/minmax.h" #include "gl/xalloc.h" #include "gettext.h" #define _(msgid) gettext (msgid) #define N_(msgid) (msgid) /* Shamelessly lifted from the Gnumeric sources: https://git.gnome.org/browse/gnumeric/tree/src/value.h */ enum gnm_value_type { VALUE_EMPTY = 10, VALUE_BOOLEAN = 20, VALUE_INTEGER = 30, /* Note, this was removed from gnumeric in 2006 - old versions may of course still be around. New ones are supposed to use float.*/ VALUE_FLOAT = 40, VALUE_ERROR = 50, VALUE_STRING = 60, VALUE_CELLRANGE = 70, VALUE_ARRAY = 80 }; static void gnm_file_casereader_destroy (struct casereader *, void *); static struct ccase *gnm_file_casereader_read (struct casereader *, void *); static const struct casereader_class gnm_file_casereader_class = { gnm_file_casereader_read, gnm_file_casereader_destroy, NULL, NULL, }; enum reader_state { STATE_PRE_INIT = 0, /* Initial state */ STATE_SHEET_COUNT, /* Found the sheet index */ STATE_INIT , /* Other Initial state */ STATE_SHEET_START, /* Found the start of a sheet */ STATE_SHEET_NAME, /* Found the sheet name */ STATE_MAXROW, STATE_MAXCOL, STATE_SHEET_FOUND, /* Found the sheet that we actually want */ STATE_CELLS_START, /* Found the start of the cell array */ STATE_CELL /* Found a cell */ }; struct sheet_detail { /* The name of the sheet (utf8 encoding) */ char *name; int start_col; int stop_col; int start_row; int stop_row; int maxcol; int maxrow; }; struct state_data { /* The libxml reader for this instance */ xmlTextReaderPtr xtr; /* An internal state variable */ enum reader_state state; int node_type; int current_sheet; int row; int col; int min_col; }; static void state_data_destroy (struct state_data *sd) { xmlFreeTextReader (sd->xtr); } struct gnumeric_reader { struct spreadsheet spreadsheet; struct state_data rsd; struct state_data msd; int start_col; int stop_col; int start_row; int stop_row; struct sheet_detail *sheets; const xmlChar *target_sheet; int target_sheet_index; struct caseproto *proto; struct dictionary *dict; struct ccase *first_case; bool used_first_case; enum gnm_value_type vtype; }; void gnumeric_unref (struct spreadsheet *s) { struct gnumeric_reader *r = (struct gnumeric_reader *) s; if (0 == --s->ref_cnt) { int i; for (i = 0; i < s->n_sheets; ++i) { xmlFree (r->sheets[i].name); } free (r->sheets); state_data_destroy (&r->msd); dict_unref (r->dict); free (s->file_name); free (r); } } const char * gnumeric_get_sheet_name (struct spreadsheet *s, int n) { struct gnumeric_reader *gr = (struct gnumeric_reader *) s; assert (n < s->n_sheets); return gr->sheets[n].name; } static void process_node (struct gnumeric_reader *r, struct state_data *sd); char * gnumeric_get_sheet_range (struct spreadsheet *s, int n) { int ret; struct gnumeric_reader *gr = (struct gnumeric_reader *) s; assert (n < s->n_sheets); while ( (gr->sheets[n].stop_col == -1) && (1 == (ret = xmlTextReaderRead (gr->msd.xtr))) ) { process_node (gr, &gr->msd); } return create_cell_range ( gr->sheets[n].start_col, gr->sheets[n].start_row, gr->sheets[n].stop_col, gr->sheets[n].stop_row); } static void gnm_file_casereader_destroy (struct casereader *reader UNUSED, void *r_) { struct gnumeric_reader *r = r_; if (r == NULL) return ; state_data_destroy (&r->rsd); if (r->first_case && ! r->used_first_case) case_unref (r->first_case); if (r->proto) caseproto_unref (r->proto); gnumeric_unref (&r->spreadsheet); } static void process_node (struct gnumeric_reader *r, struct state_data *sd) { xmlChar *name = xmlTextReaderName (sd->xtr); if (name == NULL) name = xmlStrdup (_xml ("--")); sd->node_type = xmlTextReaderNodeType (sd->xtr); switch (sd->state) { case STATE_PRE_INIT: sd->current_sheet = -1; if (0 == xmlStrcasecmp (name, _xml("gnm:SheetNameIndex")) && XML_READER_TYPE_ELEMENT == sd->node_type) { sd->state = STATE_SHEET_COUNT; } break; case STATE_SHEET_COUNT: if (0 == xmlStrcasecmp (name, _xml("gnm:SheetName")) && XML_READER_TYPE_ELEMENT == sd->node_type) { ++sd->current_sheet; if (sd->current_sheet + 1 > r->spreadsheet.n_sheets) { struct sheet_detail *detail ; r->sheets = xrealloc (r->sheets, (sd->current_sheet + 1) * sizeof *r->sheets); detail = &r->sheets[sd->current_sheet]; detail->start_col = detail->stop_col = detail->start_row = detail->stop_row = -1; detail->name = NULL; r->spreadsheet.n_sheets = sd->current_sheet + 1; } } else if (0 == xmlStrcasecmp (name, _xml("gnm:SheetNameIndex")) && XML_READER_TYPE_END_ELEMENT == sd->node_type) { sd->state = STATE_INIT; sd->current_sheet = -1; } else if (XML_READER_TYPE_TEXT == sd->node_type) { if (r->sheets [r->spreadsheet.n_sheets - 1].name == NULL) r->sheets [r->spreadsheet.n_sheets - 1].name = CHAR_CAST (char *, xmlTextReaderValue (sd->xtr)); } break; case STATE_INIT: if (0 == xmlStrcasecmp (name, _xml("gnm:Sheet")) && XML_READER_TYPE_ELEMENT == sd->node_type) { ++sd->current_sheet; sd->state = STATE_SHEET_START; } break; case STATE_SHEET_START: if (0 == xmlStrcasecmp (name, _xml("gnm:Name")) && XML_READER_TYPE_ELEMENT == sd->node_type) { sd->state = STATE_SHEET_NAME; } break; case STATE_SHEET_NAME: if (0 == xmlStrcasecmp (name, _xml("gnm:Name")) && XML_READER_TYPE_END_ELEMENT == sd->node_type) { sd->state = STATE_INIT; } else if (0 == xmlStrcasecmp (name, _xml("gnm:Sheet")) && XML_READER_TYPE_END_ELEMENT == sd->node_type) { sd->state = STATE_INIT; } else if (XML_READER_TYPE_TEXT == sd->node_type) { if (r->target_sheet != NULL) { xmlChar *value = xmlTextReaderValue (sd->xtr); if (0 == xmlStrcmp (value, r->target_sheet)) sd->state = STATE_SHEET_FOUND; free (value); } else if (r->target_sheet_index == sd->current_sheet + 1) { sd->state = STATE_SHEET_FOUND; } else if (r->target_sheet_index == -1) { sd->state = STATE_SHEET_FOUND; } } break; case STATE_SHEET_FOUND: if (0 == xmlStrcasecmp (name, _xml("gnm:Cells")) && XML_READER_TYPE_ELEMENT == sd->node_type) { sd->min_col = INT_MAX; if (! xmlTextReaderIsEmptyElement (sd->xtr)) sd->state = STATE_CELLS_START; } else if (0 == xmlStrcasecmp (name, _xml("gnm:MaxRow")) && XML_READER_TYPE_ELEMENT == sd->node_type) { sd->state = STATE_MAXROW; } else if (0 == xmlStrcasecmp (name, _xml("gnm:MaxCol")) && XML_READER_TYPE_ELEMENT == sd->node_type) { sd->state = STATE_MAXCOL; } else if (0 == xmlStrcasecmp (name, _xml("gnm:Sheet")) && XML_READER_TYPE_END_ELEMENT == sd->node_type) { sd->state = STATE_INIT; } break; case STATE_MAXROW: if (0 == xmlStrcasecmp (name, _xml("gnm:MaxRow")) && XML_READER_TYPE_END_ELEMENT == sd->node_type) { sd->state = STATE_SHEET_FOUND; } else if (sd->node_type == XML_READER_TYPE_TEXT) { xmlChar *value = xmlTextReaderValue (sd->xtr); r->sheets[sd->current_sheet].maxrow = _xmlchar_to_int (value); xmlFree (value); } break; case STATE_MAXCOL: if (0 == xmlStrcasecmp (name, _xml("gnm:MaxCol")) && XML_READER_TYPE_END_ELEMENT == sd->node_type) { sd->state = STATE_SHEET_FOUND; } else if (sd->node_type == XML_READER_TYPE_TEXT) { xmlChar *value = xmlTextReaderValue (sd->xtr); r->sheets[sd->current_sheet].maxcol = _xmlchar_to_int (value); xmlFree (value); } break; case STATE_CELLS_START: if (0 == xmlStrcasecmp (name, _xml ("gnm:Cell")) && XML_READER_TYPE_ELEMENT == sd->node_type) { xmlChar *attr = NULL; attr = xmlTextReaderGetAttribute (sd->xtr, _xml ("Col")); sd->col = _xmlchar_to_int (attr); free (attr); if (sd->col < sd->min_col) sd->min_col = sd->col; attr = xmlTextReaderGetAttribute (sd->xtr, _xml ("Row")); sd->row = _xmlchar_to_int (attr); free (attr); if (r->sheets[sd->current_sheet].start_row == -1) { r->sheets[sd->current_sheet].start_row = sd->row; } if (r->sheets[sd->current_sheet].start_col == -1) { r->sheets[sd->current_sheet].start_col = sd->col; } if (! xmlTextReaderIsEmptyElement (sd->xtr)) sd->state = STATE_CELL; } else if ((0 == xmlStrcasecmp (name, _xml("gnm:Cells"))) && (XML_READER_TYPE_END_ELEMENT == sd->node_type)) { r->sheets[sd->current_sheet].stop_col = sd->col; r->sheets[sd->current_sheet].stop_row = sd->row; sd->state = STATE_SHEET_NAME; } break; case STATE_CELL: if (0 == xmlStrcasecmp (name, _xml("gnm:Cell")) && XML_READER_TYPE_END_ELEMENT == sd->node_type) { sd->state = STATE_CELLS_START; } break; default: break; }; xmlFree (name); } /* Sets the VAR of case C, to the value corresponding to the xml string XV */ static void convert_xml_string_to_value (struct ccase *c, const struct variable *var, const xmlChar *xv, enum gnm_value_type type, int col, int row) { union value *v = case_data_rw (c, var); if (xv == NULL) value_set_missing (v, var_get_width (var)); else if (var_is_alpha (var)) value_copy_str_rpad (v, var_get_width (var), xv, ' '); else if (type == VALUE_FLOAT || type == VALUE_INTEGER) { const char *text = CHAR_CAST (const char *, xv); char *endptr; errno = 0; v->f = c_strtod (text, &endptr); if (errno != 0 || endptr == text) v->f = SYSMIS; } else { const char *text = CHAR_CAST (const char *, xv); const struct fmt_spec *fmt = var_get_write_format (var); char *m = data_in (ss_cstr (text), "UTF-8", fmt->type, v, var_get_width (var), "UTF-8"); if (m) { char buf [FMT_STRING_LEN_MAX + 1]; char *cell = create_cell_ref (col, row); msg (MW, _("Cannot convert the value in the spreadsheet cell %s to format (%s): %s"), cell, fmt_to_string (fmt, buf), m); free (cell); } free (m); } } struct var_spec { char *name; int width; xmlChar *first_value; int first_type; }; static void gnumeric_error_handler (void *ctx, const char *mesg, xmlParserSeverities sev UNUSED, xmlTextReaderLocatorPtr loc) { struct gnumeric_reader *r = ctx; msg (MW, _("There was a problem whilst reading the %s file `%s' (near line %d): `%s'"), "Gnumeric", r->spreadsheet.file_name, xmlTextReaderLocatorLineNumber (loc), mesg); } static struct gnumeric_reader * gnumeric_reopen (struct gnumeric_reader *r, const char *filename, bool show_errors) { int ret = -1; struct state_data *sd; xmlTextReaderPtr xtr; gzFile gz; assert (r == NULL || filename == NULL); if (filename) { gz = gzopen (filename, "r"); } else { gz = gzopen (r->spreadsheet.file_name, "r"); } if (NULL == gz) return NULL; xtr = xmlReaderForIO ((xmlInputReadCallback) gzread, (xmlInputCloseCallback) gzclose, gz, NULL, NULL, show_errors ? 0 : (XML_PARSE_NOERROR | XML_PARSE_NOWARNING)); if (xtr == NULL) { gzclose (gz); return NULL; } if (r == NULL) { r = xzalloc (sizeof *r); r->spreadsheet.n_sheets = -1; r->spreadsheet.file_name = strdup (filename); sd = &r->msd; } else { sd = &r->rsd; } if (show_errors) xmlTextReaderSetErrorHandler (xtr, gnumeric_error_handler, r); r->target_sheet = NULL; r->target_sheet_index = -1; sd->row = sd->col = -1; sd->state = STATE_PRE_INIT; sd->xtr = xtr; r->spreadsheet.ref_cnt++; /* Advance to the start of the workbook. This gives us some confidence that we are actually dealing with a gnumeric spreadsheet. */ while ((sd->state != STATE_INIT) && 1 == (ret = xmlTextReaderRead (sd->xtr))) { process_node (r, sd); } if (ret != 1) { /* Does not seem to be a gnumeric file */ gnumeric_unref (&r->spreadsheet); return NULL; } r->spreadsheet.type = SPREADSHEET_GNUMERIC; if (show_errors) { const xmlChar *enc = xmlTextReaderConstEncoding (sd->xtr); xmlCharEncoding xce = xmlParseCharEncoding (CHAR_CAST (const char *, enc)); if (XML_CHAR_ENCODING_UTF8 != xce) { /* I have been told that ALL gnumeric files are UTF8 encoded. If that is correct, this can never happen. */ msg (MW, _("The gnumeric file `%s' is encoded as %s instead of the usual UTF-8 encoding. " "Any non-ascii characters will be incorrectly imported."), r->spreadsheet.file_name, enc); } } return r; } struct spreadsheet * gnumeric_probe (const char *filename, bool report_errors) { struct gnumeric_reader *r = gnumeric_reopen (NULL, filename, report_errors); return &r->spreadsheet; } struct casereader * gnumeric_make_reader (struct spreadsheet *spreadsheet, const struct spreadsheet_read_options *opts) { int type = 0; int x = 0; struct gnumeric_reader *r = NULL; unsigned long int vstart = 0; int ret; casenumber n_cases = CASENUMBER_MAX; int i; struct var_spec *var_spec = NULL; int n_var_specs = 0; r = (struct gnumeric_reader *) (spreadsheet); r = gnumeric_reopen (r, NULL, true); if (opts->cell_range) { if (! convert_cell_ref (opts->cell_range, &r->start_col, &r->start_row, &r->stop_col, &r->stop_row)) { msg (SE, _("Invalid cell range `%s'"), opts->cell_range); goto error; } } else { r->start_col = -1; r->start_row = 0; r->stop_col = -1; r->stop_row = -1; } r->target_sheet = BAD_CAST opts->sheet_name; r->target_sheet_index = opts->sheet_index; r->rsd.row = r->rsd.col = -1; r->rsd.current_sheet = -1; r->first_case = NULL; r->proto = NULL; /* Advance to the start of the cells for the target sheet */ while ((r->rsd.state != STATE_CELL || r->rsd.row < r->start_row) && 1 == (ret = xmlTextReaderRead (r->rsd.xtr))) { xmlChar *value ; process_node (r, &r->rsd); value = xmlTextReaderValue (r->rsd.xtr); if (r->rsd.state == STATE_MAXROW && r->rsd.node_type == XML_READER_TYPE_TEXT) { n_cases = 1 + _xmlchar_to_int (value) ; } free (value); } /* If a range has been given, then use that to calculate the number of cases */ if (opts->cell_range) { n_cases = MIN (n_cases, r->stop_row - r->start_row + 1); } if (opts->read_names) { r->start_row++; n_cases --; } /* Read in the first row of cells, including the headers if read_names was set */ while ( ((r->rsd.state == STATE_CELLS_START && r->rsd.row <= r->start_row) || r->rsd.state == STATE_CELL) && (ret = xmlTextReaderRead (r->rsd.xtr)) ) { int idx; if (r->rsd.state == STATE_CELL && r->rsd.node_type == XML_READER_TYPE_TEXT) { xmlChar *attr = xmlTextReaderGetAttribute (r->rsd.xtr, _xml ("ValueType")); type = _xmlchar_to_int (attr); xmlFree (attr); } process_node (r, &r->rsd); if (r->rsd.row > r->start_row) { xmlChar *attr = xmlTextReaderGetAttribute (r->rsd.xtr, _xml ("ValueType")); r->vtype = _xmlchar_to_int (attr); xmlFree (attr); break; } if (r->rsd.col < r->start_col || (r->stop_col != -1 && r->rsd.col > r->stop_col)) continue; idx = r->rsd.col - r->start_col; if (idx >= n_var_specs) { int i; var_spec = xrealloc (var_spec, sizeof (*var_spec) * (idx + 1)); for (i = n_var_specs; i <= idx; ++i) { var_spec [i].name = NULL; var_spec [i].width = -1; var_spec [i].first_value = NULL; var_spec [i].first_type = -1; } n_var_specs = idx + 1 ; } var_spec [idx].first_type = type; if (r->rsd.node_type == XML_READER_TYPE_TEXT) { xmlChar *value = xmlTextReaderValue (r->rsd.xtr); const char *text = CHAR_CAST (const char *, value); if (r->rsd.row < r->start_row) { if (opts->read_names) { var_spec [idx].name = xstrdup (text); } } else { var_spec [idx].first_value = xmlStrdup (value); if (-1 == var_spec [idx].width) var_spec [idx].width = (opts->asw == -1) ? ROUND_UP (strlen(text), SPREADSHEET_DEFAULT_WIDTH) : opts->asw; } free (value); } else if (r->rsd.node_type == XML_READER_TYPE_ELEMENT && r->rsd.state == STATE_CELL) { if (r->rsd.row == r->start_row) { xmlChar *attr = xmlTextReaderGetAttribute (r->rsd.xtr, _xml ("ValueType")); if (NULL == attr || VALUE_STRING != _xmlchar_to_int (attr)) var_spec [idx].width = 0; free (attr); } } } { const xmlChar *enc = xmlTextReaderConstEncoding (r->rsd.xtr); if (enc == NULL) goto error; /* Create the dictionary and populate it */ spreadsheet->dict = r->dict = dict_create (CHAR_CAST (const char *, enc)); } for (i = 0 ; i < n_var_specs ; ++i) { char *name; if ((var_spec[i].name == NULL) && (var_spec[i].first_value == NULL)) continue; /* Probably no data exists for this variable, so allocate a default width */ if (var_spec[i].width == -1) var_spec[i].width = SPREADSHEET_DEFAULT_WIDTH; name = dict_make_unique_var_name (r->dict, var_spec[i].name, &vstart); dict_create_var (r->dict, name, var_spec[i].width); free (name); } /* Create the first case, and cache it */ r->used_first_case = false; if (n_var_specs == 0) { msg (MW, _("Selected sheet or range of spreadsheet `%s' is empty."), spreadsheet->file_name); goto error; } r->proto = caseproto_ref (dict_get_proto (r->dict)); r->first_case = case_create (r->proto); case_set_missing (r->first_case); for (i = 0 ; i < n_var_specs ; ++i) { const struct variable *var; if ((var_spec[i].name == NULL) && (var_spec[i].first_value == NULL)) continue; var = dict_get_var (r->dict, x++); convert_xml_string_to_value (r->first_case, var, var_spec[i].first_value, var_spec[i].first_type, r->rsd.col + i - 1, r->rsd.row - 1); } for (i = 0 ; i < n_var_specs ; ++i) { free (var_spec[i].first_value); free (var_spec[i].name); } free (var_spec); return casereader_create_sequential (NULL, r->proto, n_cases, &gnm_file_casereader_class, r); error: for (i = 0 ; i < n_var_specs ; ++i) { free (var_spec[i].first_value); free (var_spec[i].name); } free (var_spec); gnm_file_casereader_destroy (NULL, r); return NULL; }; /* Reads and returns one case from READER's file. Returns a null pointer on failure. */ static struct ccase * gnm_file_casereader_read (struct casereader *reader UNUSED, void *r_) { struct ccase *c; int ret = 0; struct gnumeric_reader *r = r_; int current_row = r->rsd.row; if (!r->used_first_case) { r->used_first_case = true; return r->first_case; } c = case_create (r->proto); case_set_missing (c); if (r->start_col == -1) r->start_col = r->rsd.min_col; while ((r->rsd.state == STATE_CELL || r->rsd.state == STATE_CELLS_START) && r->rsd.row == current_row && (ret = xmlTextReaderRead (r->rsd.xtr))) { process_node (r, &r->rsd); if (r->rsd.state == STATE_CELL && r->rsd.node_type == XML_READER_TYPE_ELEMENT) { xmlChar *attr = xmlTextReaderGetAttribute (r->rsd.xtr, _xml ("ValueType")); r->vtype = _xmlchar_to_int (attr); xmlFree (attr); } if (r->rsd.col < r->start_col || (r->stop_col != -1 && r->rsd.col > r->stop_col)) continue; if (r->rsd.col - r->start_col >= caseproto_get_n_widths (r->proto)) continue; if (r->stop_row != -1 && r->rsd.row > r->stop_row) break; if (r->rsd.node_type == XML_READER_TYPE_TEXT) { xmlChar *value = xmlTextReaderValue (r->rsd.xtr); const int idx = r->rsd.col - r->start_col; const struct variable *var = dict_get_var (r->dict, idx); convert_xml_string_to_value (c, var, value, r->vtype, r->rsd.col, r->rsd.row); xmlFree (value); } } if (ret == 1) return c; else { case_unref (c); return NULL; } } pspp-1.4.1/src/data/missing-values.c0000644000175000017500000003520113546443556016745 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2005, 2009, 2011, 2013 Free Software Foundation, Inc. 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 3 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, see . */ #include #include "data/missing-values.h" #include #include #include "data/variable.h" #include "libpspp/assertion.h" #include "libpspp/cast.h" #include "libpspp/i18n.h" #include "libpspp/str.h" #include "gl/minmax.h" /* Types of user-missing values. Invisible--use access functions defined below instead. */ enum mv_type { MVT_NONE = 0, /* No user-missing values. */ MVT_1 = 1, /* One user-missing value. */ MVT_2 = 2, /* Two user-missing values. */ MVT_3 = 3, /* Three user-missing values. */ MVT_RANGE = 4, /* A range of user-missing values. */ MVT_RANGE_1 = 5 /* A range plus an individual value. */ }; /* Initializes MV as a set of missing values for a variable of the given WIDTH. MV should be destroyed with mv_destroy when it is no longer needed. */ void mv_init (struct missing_values *mv, int width) { int i; assert (width >= 0 && width <= MAX_STRING); mv->type = MVT_NONE; mv->width = width; for (i = 0; i < 3; i++) value_init (&mv->values[i], width); } /* Initializes MV as a set of missing values for a variable of the given WIDTH. MV will be automatically destroyed along with POOL; it must not be passed to mv_destroy for explicit destruction. */ void mv_init_pool (struct pool *pool, struct missing_values *mv, int width) { int i; assert (width >= 0 && width <= MAX_STRING); mv->type = MVT_NONE; mv->width = width; for (i = 0; i < 3; i++) value_init_pool (pool, &mv->values[i], width); } /* Frees any storage allocated by mv_init for MV. */ void mv_destroy (struct missing_values *mv) { if (mv != NULL) { int i; for (i = 0; i < 3; i++) value_destroy (&mv->values[i], mv->width); } } /* Removes any missing values from MV. */ void mv_clear (struct missing_values *mv) { mv->type = MVT_NONE; } /* Initializes MV as a copy of SRC. */ void mv_copy (struct missing_values *mv, const struct missing_values *src) { int i; mv_init (mv, src->width); mv->type = src->type; for (i = 0; i < 3; i++) value_copy (&mv->values[i], &src->values[i], mv->width); } /* Returns true if VALUE, of the given WIDTH, may be added to a missing value set also of the given WIDTH. This is normally the case, but string missing values over MV_MAX_STRING bytes long must consist solely of spaces after the first MV_MAX_STRING bytes. */ bool mv_is_acceptable (const union value *value, int width) { int i; for (i = MV_MAX_STRING; i < width; i++) if (value->s[i] != ' ') return false; return true; } /* Returns true if MV is an empty set of missing values. */ bool mv_is_empty (const struct missing_values *mv) { return mv->type == MVT_NONE; } /* Returns the width of the missing values that MV may contain. */ int mv_get_width (const struct missing_values *mv) { return mv->width; } /* Attempts to add individual value V to the set of missing values MV. Returns true if successful, false if MV has no more room for missing values or if V is not an acceptable missing value. */ bool mv_add_value (struct missing_values *mv, const union value *v) { if (!mv_is_acceptable (v, mv->width)) return false; switch (mv->type) { case MVT_NONE: case MVT_1: case MVT_2: case MVT_RANGE: value_copy (&mv->values[mv->type & 3], v, mv->width); mv->type++; return true; case MVT_3: case MVT_RANGE_1: return false; } NOT_REACHED (); } /* Attempts to add S, which is LEN bytes long, to the set of string missing values MV. Returns true if successful, false if MV has no more room for missing values or if S is not an acceptable missing value. */ bool mv_add_str (struct missing_values *mv, const uint8_t s[], size_t len) { union value v; bool ok; assert (mv->width > 0); while (len > mv->width) if (s[--len] != ' ') return false; value_init (&v, mv->width); buf_copy_rpad (CHAR_CAST (char *, v.s), mv->width, CHAR_CAST (char *, s), len, ' '); ok = mv_add_value (mv, &v); value_destroy (&v, mv->width); return ok; } /* Attempts to add D to the set of numeric missing values MV. Returns true if successful, false if MV has no more room for missing values. */ bool mv_add_num (struct missing_values *mv, double d) { union value v; bool ok; assert (mv->width == 0); value_init (&v, 0); v.f = d; ok = mv_add_value (mv, &v); value_destroy (&v, 0); return ok; } /* Attempts to add range [LOW, HIGH] to the set of numeric missing values MV. Returns true if successful, false if MV has no room for a range, or if LOW > HIGH. */ bool mv_add_range (struct missing_values *mv, double low, double high) { assert (mv->width == 0); if (low <= high && (mv->type == MVT_NONE || mv->type == MVT_1)) { mv->values[1].f = low; mv->values[2].f = high; mv->type |= 4; return true; } else return false; } /* Returns true if MV contains an individual value, false if MV is empty (or contains only a range). */ bool mv_has_value (const struct missing_values *mv) { return mv_n_values (mv) > 0; } /* Removes one individual value from MV and stores it in V, which must have been initialized as a value with the same width as MV. MV must contain an individual value (as determined by mv_has_value()). We remove the first value from MV, not the last, because the common use for this function is in iterating through a set of missing values. If we remove the last value then we'll output the missing values in order opposite of that in which they were added, so that a GET followed by a SAVE would reverse the order of missing values in the system file, a weird effect. */ void mv_pop_value (struct missing_values *mv, union value *v) { union value tmp; assert (mv_has_value (mv)); value_copy (v, &mv->values[0], mv->width); tmp = mv->values[0]; mv->values[0] = mv->values[1]; mv->values[1] = mv->values[2]; mv->values[2] = tmp; mv->type--; } /* Returns MV's discrete value with index IDX. The caller must not modify or free this value, or access it after MV is modified or freed. IDX must be less than the number of discrete values in MV, as reported by mv_n_values. */ const union value * mv_get_value (const struct missing_values *mv, int idx) { assert (idx >= 0 && idx < mv_n_values (mv)); return &mv->values[idx]; } /* Replaces MV's discrete value with index IDX by a copy of V, which must have the same width as MV. IDX must be less than the number of discrete values in MV, as reported by mv_n_values. */ bool mv_replace_value (struct missing_values *mv, const union value *v, int idx) { assert (idx >= 0) ; assert (idx < mv_n_values(mv)); if (!mv_is_acceptable (v, mv->width)) return false; value_copy (&mv->values[idx], v, mv->width); return true; } /* Returns the number of individual (not part of a range) missing values in MV. */ int mv_n_values (const struct missing_values *mv) { return mv->type & 3; } /* Returns true if MV contains a numeric range, false if MV is empty (or contains only individual values). */ bool mv_has_range (const struct missing_values *mv) { return mv->type == MVT_RANGE || mv->type == MVT_RANGE_1; } /* Removes the numeric range from MV and stores it in *LOW and *HIGH. MV must contain a individual range (as determined by mv_has_range()). */ void mv_pop_range (struct missing_values *mv, double *low, double *high) { assert (mv_has_range (mv)); *low = mv->values[1].f; *high = mv->values[2].f; mv->type &= 3; } /* Returns the numeric range from MV into *LOW and *HIGH. MV must contain a individual range (as determined by mv_has_range()). */ void mv_get_range (const struct missing_values *mv, double *low, double *high) { assert (mv_has_range (mv)); *low = mv->values[1].f; *high = mv->values[2].f; } /* Returns true if values[IDX] is in use when the `type' member is set to TYPE (in struct missing_values), false otherwise. */ static bool using_element (unsigned type, int idx) { assert (idx >= 0 && idx < 3); switch (type) { case MVT_NONE: return false; case MVT_1: return idx < 1; case MVT_2: return idx < 2; case MVT_3: return true; case MVT_RANGE: return idx > 0; case MVT_RANGE_1: return true; } NOT_REACHED (); } /* Returns true if MV can be resized to the given WIDTH with mv_resize(), false otherwise. Resizing is possible only when each value in MV (if any) is resizable from MV's current width to WIDTH, as determined by value_is_resizable. */ bool mv_is_resizable (const struct missing_values *mv, int width) { int i; for (i = 0; i < 3; i++) if (using_element (mv->type, i) && !value_is_resizable (&mv->values[i], mv->width, width)) return false; return true; } /* Resizes MV to the given WIDTH. WIDTH must fit the constraints explained for mv_is_resizable. */ void mv_resize (struct missing_values *mv, int width) { int i; assert (mv_is_resizable (mv, width)); for (i = 0; i < 3; i++) if (using_element (mv->type, i)) value_resize (&mv->values[i], mv->width, width); else { value_destroy (&mv->values[i], mv->width); value_init (&mv->values[i], width); } mv->width = width; } /* Returns true if D is a missing value in MV, false otherwise. MV must be a set of numeric missing values. */ static bool is_num_user_missing (const struct missing_values *mv, double d) { const union value *v = mv->values; assert (mv->width == 0); switch (mv->type) { case MVT_NONE: return false; case MVT_1: return v[0].f == d; case MVT_2: return v[0].f == d || v[1].f == d; case MVT_3: return v[0].f == d || v[1].f == d || v[2].f == d; case MVT_RANGE: return v[1].f <= d && d <= v[2].f; case MVT_RANGE_1: return v[0].f == d || (v[1].f <= d && d <= v[2].f); } NOT_REACHED (); } /* Returns true if S[] is a missing value in MV, false otherwise. MV must be a set of string missing values. S[] must contain exactly as many characters as MV's width. */ static bool is_str_user_missing (const struct missing_values *mv, const uint8_t s[]) { const union value *v = mv->values; assert (mv->width > 0); switch (mv->type) { case MVT_NONE: return false; case MVT_1: return !memcmp (v[0].s, s, mv->width); case MVT_2: return (!memcmp (v[0].s, s, mv->width) || !memcmp (v[1].s, s, mv->width)); case MVT_3: return (!memcmp (v[0].s, s, mv->width) || !memcmp (v[1].s, s, mv->width) || !memcmp (v[2].s, s, mv->width)); case MVT_RANGE: case MVT_RANGE_1: NOT_REACHED (); } NOT_REACHED (); } /* Returns true if V is a missing value in the given CLASS in MV, false otherwise. */ bool mv_is_value_missing (const struct missing_values *mv, const union value *v, enum mv_class class) { return (mv->width == 0 ? mv_is_num_missing (mv, v->f, class) : mv_is_str_missing (mv, v->s, class)); } /* Returns true if D is a missing value in the given CLASS in MV, false otherwise. MV must be a set of numeric missing values. */ bool mv_is_num_missing (const struct missing_values *mv, double d, enum mv_class class) { assert (mv->width == 0); return ((class & MV_SYSTEM && d == SYSMIS) || (class & MV_USER && is_num_user_missing (mv, d))); } /* Returns true if S[] is a missing value in the given CLASS in MV, false otherwise. MV must be a set of string missing values. S[] must contain exactly as many characters as MV's width. */ bool mv_is_str_missing (const struct missing_values *mv, const uint8_t s[], enum mv_class class) { assert (mv->width > 0); return class & MV_USER && is_str_user_missing (mv, s); } /* Like mv_is_value_missing(), this tests whether V is a missing value in the given CLASS in MV. It supports the uncommon case where V and MV might have different widths: the caller must specify VW, the width of V. MV and VW must be both numeric or both string. Comparison of strings of different width is done by conceptually extending both strings to infinite width by appending spaces. */ bool mv_is_value_missing_varwidth (const struct missing_values *mv, const union value *v, int vw, enum mv_class class) { int mvw = mv->width; if (mvw == vw) return mv_is_value_missing (mv, v, class); /* Make sure they're both strings. */ assert (mvw && vw); if (!(class & MV_USER) || mv->type == MVT_NONE) return false; for (int i = 0; i < mv->type; i++) if (!buf_compare_rpad (CHAR_CAST_BUG (const char *, mv->values[i].s), mvw, CHAR_CAST_BUG (const char *, v->s), vw)) return true; return false; } char * mv_to_string (const struct missing_values *mv, const char *encoding) { struct string s = DS_EMPTY_INITIALIZER; if (mv_has_range (mv)) { double x, y; mv_get_range (mv, &x, &y); if (x == LOWEST) ds_put_format (&s, "LOWEST THRU %.*g", DBL_DIG + 1, y); else if (y == HIGHEST) ds_put_format (&s, "%.*g THRU HIGHEST", DBL_DIG + 1, x); else ds_put_format (&s, "%.*g THRU %.*g", DBL_DIG + 1, x, DBL_DIG + 1, y); } for (size_t j = 0; j < mv_n_values (mv); j++) { const union value *value = mv_get_value (mv, j); if (!ds_is_empty (&s)) ds_put_cstr (&s, "; "); if (!mv->width) ds_put_format (&s, "%.*g", DBL_DIG + 1, value->f); else { char *mvs = recode_string ( "UTF-8", encoding, CHAR_CAST (char *, value->s), MIN (mv->width, MV_MAX_STRING)); ds_put_format (&s, "\"%s\"", mvs); free (mvs); } } return ds_is_empty (&s) ? NULL : ds_steal_cstr (&s); } pspp-1.4.1/src/data/identifier.h0000644000175000017500000001073613670210420016110 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 1997-9, 2000, 2010, 2011 Free Software Foundation, Inc. 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 3 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, see . */ #ifndef DATA_IDENTIFIER_H #define DATA_IDENTIFIER_H 1 #include #include #include #include "libpspp/str.h" #define TOKEN_TYPES \ TOKEN_TYPE(ID) /* Identifier. */ \ TOKEN_TYPE(POS_NUM) /* Positive number. */ \ TOKEN_TYPE(NEG_NUM) /* Negative number. */ \ TOKEN_TYPE(STRING) /* Quoted string. */ \ TOKEN_TYPE(STOP) /* End of input. */ \ \ TOKEN_TYPE(ENDCMD) /* . */ \ TOKEN_TYPE(PLUS) /* + */ \ TOKEN_TYPE(DASH) /* - */ \ TOKEN_TYPE(ASTERISK) /* * */ \ TOKEN_TYPE(SLASH) /* / */ \ TOKEN_TYPE(EQUALS) /* = */ \ TOKEN_TYPE(LPAREN) /* (*/ \ TOKEN_TYPE(RPAREN) /*) */ \ TOKEN_TYPE(LBRACK) /* [ */ \ TOKEN_TYPE(RBRACK) /* ] */ \ TOKEN_TYPE(COMMA) /* , */ \ \ TOKEN_TYPE(AND) /* AND */ \ TOKEN_TYPE(OR) /* OR */ \ TOKEN_TYPE(NOT) /* NOT */ \ \ TOKEN_TYPE(EQ) /* EQ */ \ TOKEN_TYPE(GE) /* GE or >= */ \ TOKEN_TYPE(GT) /* GT or > */ \ TOKEN_TYPE(LE) /* LE or <= */ \ TOKEN_TYPE(LT) /* LT or < */ \ TOKEN_TYPE(NE) /* NE or ~= */ \ \ TOKEN_TYPE(ALL) /* ALL */ \ TOKEN_TYPE(BY) /* BY */ \ TOKEN_TYPE(TO) /* TO */ \ TOKEN_TYPE(WITH) /* WITH */ \ \ TOKEN_TYPE(EXP) /* ** */ /* Token types. */ enum token_type { #define TOKEN_TYPE(TYPE) T_##TYPE, TOKEN_TYPES TOKEN_N_TYPES #undef TOKEN_TYPE }; const char *token_type_to_name (enum token_type); const char *token_type_to_string (enum token_type); /* Tokens. */ bool lex_is_keyword (enum token_type); /* Validating identifiers. */ #define ID_MAX_LEN 64 /* Maximum length of identifier, in bytes. */ bool id_is_valid (const char *id, const char *dict_encoding, bool issue_error); bool id_is_plausible (const char *id, bool issue_error); /* Recognizing identifiers. */ bool lex_is_id1 (char); bool lex_is_idn (char); bool lex_uc_is_id1 (ucs4_t); bool lex_uc_is_idn (ucs4_t); bool lex_uc_is_space (ucs4_t); size_t lex_id_get_length (struct substring); /* Comparing identifiers. */ bool lex_id_match (struct substring keyword, struct substring token); bool lex_id_match_n (struct substring keyword, struct substring token, size_t n); int lex_id_to_token (struct substring); #endif /* !data/identifier.h */ pspp-1.4.1/src/data/case-map.c0000644000175000017500000002623413670210420015447 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 1997-9, 2000, 2006, 2007, 2009, 2011, 2013 Free Software Foundation, Inc. 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 3 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, see . */ #include #include "data/case-map.h" #include #include #include "data/casereader.h" #include "data/casewriter.h" #include "data/dictionary.h" #include "data/variable.h" #include "data/case.h" #include "libpspp/assertion.h" #include "libpspp/hash-functions.h" #include "libpspp/hmap.h" #include "gl/xalloc.h" /* A case map. */ struct case_map { struct caseproto *proto; /* Prototype for output cases. */ int *map; /* For each destination index, the corresponding source index. */ }; static struct ccase *translate_case (struct ccase *, void *map_); static bool destroy_case_map (void *map_); /* Creates and returns an empty map that outputs cases matching PROTO. */ static struct case_map * create_case_map (const struct caseproto *proto) { size_t n_values = caseproto_get_n_widths (proto); struct case_map *map; size_t i; map = xmalloc (sizeof *map); map->proto = caseproto_ref (proto); map->map = xnmalloc (n_values, sizeof *map->map); for (i = 0; i < n_values; i++) map->map[i] = -1; return map; } /* Inserts into MAP a mapping of the value at index FROM in the source case to the value at index TO in the destination case. */ static void insert_mapping (struct case_map *map, size_t from, size_t to) { assert (to < caseproto_get_n_widths (map->proto)); assert (map->map[to] == -1); map->map[to] = from; } /* Destroys case map MAP. */ void case_map_destroy (struct case_map *map) { if (map != NULL) { caseproto_unref (map->proto); free (map->map); free (map); } } /* If MAP is nonnull, returns a new case that is the result of applying case map MAP to SRC, and unrefs SRC. If MAP is null, returns SRC unchanged. */ struct ccase * case_map_execute (const struct case_map *map, struct ccase *src) { if (map != NULL) { size_t n_values = caseproto_get_n_widths (map->proto); struct ccase *dst; size_t dst_idx; dst = case_create (map->proto); for (dst_idx = 0; dst_idx < n_values; dst_idx++) { int src_idx = map->map[dst_idx]; if (src_idx != -1) value_copy (case_data_rw_idx (dst, dst_idx), case_data_idx (src, src_idx), caseproto_get_width (map->proto, dst_idx)); } case_unref (src); return dst; } else return src; } /* Returns the prototype for output cases created by MAP. The caller must not unref the returned case prototype. */ const struct caseproto * case_map_get_proto (const struct case_map *map) { return map->proto; } /* Creates and returns a new casereader whose cases are produced by reading from SUBREADER and executing the actions of MAP. The casereader will have as many `union value's as MAP. When the new casereader is destroyed, MAP will be destroyed too. After this function is called, SUBREADER must not ever again be referenced directly. It will be destroyed automatically when the returned casereader is destroyed. */ struct casereader * case_map_create_input_translator (struct case_map *map, struct casereader *subreader) { return casereader_create_translator (subreader, case_map_get_proto (map), translate_case, destroy_case_map, map); } /* Creates and returns a new casewriter. Cases written to the new casewriter will be passed through MAP and written to SUBWRITER. The casewriter will have as many `union value's as MAP. When the new casewriter is destroyed, MAP will be destroyed too. After this function is called, SUBWRITER must not ever again be referenced directly. It will be destroyed automatically when the returned casewriter is destroyed. */ struct casewriter * case_map_create_output_translator (struct case_map *map, struct casewriter *subwriter) { return casewriter_create_translator (subwriter, case_map_get_proto (map), translate_case, destroy_case_map, map); } /* Casereader/casewriter translation callback. */ static struct ccase * translate_case (struct ccase *input, void *map_) { struct case_map *map = map_; return case_map_execute (map, input); } /* Casereader/casewriter destruction callback. */ static bool destroy_case_map (void *map_) { struct case_map *map = map_; case_map_destroy (map); return true; } /* Creates and returns a case_map that can be used to compact cases for dictionary D. Compacting a case eliminates "holes" between values and after the last value. (Holes are created by deleting variables.) All variables are compacted if EXCLUDE_CLASSES is 0, or it may contain one or more of (1u << DC_ORDINARY), (1u << DC_SYSTEM), or (1u << DC_SCRATCH) to cause the corresponding type of variable to be deleted during compaction. */ struct case_map * case_map_to_compact_dict (const struct dictionary *d, unsigned int exclude_classes) { size_t n_vars = dict_get_var_cnt (d); struct caseproto *proto; struct case_map *map; size_t n_values; size_t i; /* Create the case mapping. */ proto = dict_get_compacted_proto (d, exclude_classes); map = create_case_map (proto); caseproto_unref (proto); /* Add the values to the case mapping. */ n_values = 0; for (i = 0; i < n_vars; i++) { struct variable *v = dict_get_var (d, i); if (!(exclude_classes & (1u << var_get_dict_class (v)))) insert_mapping (map, var_get_case_index (v), n_values++); } return map; } struct stage_var { struct hmap_node hmap_node; /* In struct case_map_stage's 'stage_vars'. */ const struct variable *var; int case_index; }; struct case_map_stage { const struct dictionary *dict; struct hmap stage_vars; }; /* Prepares and returns a "struct case_map_stage" for producing a case map for DICT. Afterward, the caller may delete, reorder, or rename variables within DICT at will before using case_map_stage_get_case_map() to produce the case map. The caller must *not* add new variables to DICT. */ struct case_map_stage * case_map_stage_create (const struct dictionary *dict) { size_t n_vars = dict_get_var_cnt (dict); struct case_map_stage *stage; size_t i; stage = xmalloc (sizeof *stage); stage->dict = dict; hmap_init (&stage->stage_vars); for (i = 0; i < n_vars; i++) { const struct variable *var = dict_get_var (dict, i); struct stage_var *stage_var; stage_var = xmalloc (sizeof *stage_var); stage_var->var = var; stage_var->case_index = var_get_case_index (var); hmap_insert (&stage->stage_vars, &stage_var->hmap_node, hash_pointer (var, 0)); } return stage; } /* Destroys STAGE, which was created by case_map_stage_create(). */ void case_map_stage_destroy (struct case_map_stage *stage) { if (stage != NULL) { struct stage_var *stage_var, *next_stage_var; HMAP_FOR_EACH_SAFE (stage_var, next_stage_var, struct stage_var, hmap_node, &stage->stage_vars) { hmap_delete (&stage->stage_vars, &stage_var->hmap_node); free (stage_var); } hmap_destroy (&stage->stage_vars); free (stage); } } static const struct stage_var * case_map_stage_find_var (const struct case_map_stage *stage, const struct variable *var) { const struct stage_var *stage_var; HMAP_FOR_EACH_IN_BUCKET (stage_var, struct stage_var, hmap_node, hash_pointer (var, 0), &stage->stage_vars) if (stage_var->var == var) return stage_var; /* If the following assertion is reached, it indicates a bug in the case_map_stage client: the client allowed a new variable to be added to the dictionary. This is not allowed, because of the risk that the new varaible might have the same address as an old variable that has been deleted. */ NOT_REACHED (); } /* Produces a case map from STAGE, which must have been previously created with case_map_stage_create(). The case map maps from the original case index of the variables in STAGE's dictionary to their current case indexes. Returns the new case map, or a null pointer if no mapping is required (that is, no data has changed position). */ struct case_map * case_map_stage_get_case_map (const struct case_map_stage *stage) { struct case_map *map; size_t n_vars = dict_get_var_cnt (stage->dict); size_t n_values; size_t i; bool identity_map = true; map = create_case_map (dict_get_proto (stage->dict)); for (i = 0; i < n_vars; i++) { const struct variable *var = dict_get_var (stage->dict, i); const struct stage_var *stage_var = case_map_stage_find_var (stage, var); if (var_get_case_index (var) != stage_var->case_index) identity_map = false; insert_mapping (map, stage_var->case_index, var_get_case_index (var)); } if (identity_map) { case_map_destroy (map); return NULL; } n_values = caseproto_get_n_widths (map->proto); while (n_values > 0 && caseproto_get_width (map->proto, n_values - 1) == -1) map->proto = caseproto_remove_widths (map->proto, --n_values, 1); return map; } /* Creates and returns a case map for mapping variables in OLD to variables in NEW based on their name. For every variable in NEW, there must be a variable in OLD with the same name, type, and width. */ struct case_map * case_map_by_name (const struct dictionary *old, const struct dictionary *new) { struct case_map *map; size_t var_cnt = dict_get_var_cnt (new); size_t i; map = create_case_map (dict_get_proto (new)); for (i = 0; i < var_cnt; i++) { struct variable *nv = dict_get_var (new, i); struct variable *ov = dict_lookup_var_assert (old, var_get_name (nv)); assert (var_get_width (nv) == var_get_width (ov)); insert_mapping (map, var_get_case_index (ov), var_get_case_index (nv)); } return map; } /* Prints the mapping represented by case map CM to stdout, for debugging purposes. */ void case_map_dump (const struct case_map *cm) { int i; for (i = 0 ; i < caseproto_get_n_widths (cm->proto); ++i) printf ("%d -> %d\n", i, cm->map[i]); } pspp-1.4.1/src/data/data-out.c0000644000175000017500000010516113546443556015520 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 1997-9, 2000, 2006, 2009, 2011, 2012, 2013, 2014 Free Software Foundation, Inc. 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 3 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, see . */ #include #include "data/data-out.h" #include #include #include #include #include #include #include #include "data/calendar.h" #include "data/format.h" #include "data/settings.h" #include "data/value.h" #include "libpspp/assertion.h" #include "libpspp/cast.h" #include "libpspp/float-format.h" #include "libpspp/i18n.h" #include "libpspp/integer-format.h" #include "libpspp/message.h" #include "libpspp/misc.h" #include "libpspp/pool.h" #include "libpspp/str.h" #include "gl/minmax.h" #include "gl/c-snprintf.h" #include "gettext.h" #define _(msgid) gettext (msgid) /* A representation of a number that can be quickly rounded to any desired number of decimal places (up to a specified maximum). */ struct rounder { char string[64]; /* Magnitude of number with excess precision. */ int integer_digits; /* Number of digits before decimal point. */ int leading_nines; /* Number of `9's or `.'s at start of string. */ int leading_zeros; /* Number of `0's or `.'s at start of string. */ bool negative; /* Is the number negative? */ }; static void rounder_init (struct rounder *, double number, int max_decimals); static int rounder_width (const struct rounder *, int decimals, int *integer_digits, bool *negative); static void rounder_format (const struct rounder *, int decimals, char *output); typedef void data_out_converter_func (const union value *, const struct fmt_spec *, char *); #define FMT(NAME, METHOD, IMIN, OMIN, IO, CATEGORY) \ static data_out_converter_func output_##METHOD; #include "format.def" static bool output_decimal (const struct rounder *, const struct fmt_spec *, bool require_affixes, char *); static bool output_scientific (double, const struct fmt_spec *, bool require_affixes, char *); static double power10 (int) PURE_FUNCTION; static double power256 (int) PURE_FUNCTION; static void output_infinite (double, const struct fmt_spec *, char *); static void output_missing (const struct fmt_spec *, char *); static void output_overflow (const struct fmt_spec *, char *); static bool output_bcd_integer (double, int digits, char *); static void output_binary_integer (uint64_t, int bytes, enum integer_format, char *); static void output_hex (const void *, size_t bytes, char *); static data_out_converter_func *const converters[FMT_NUMBER_OF_FORMATS] = { #define FMT(NAME, METHOD, IMIN, OMIN, IO, CATEGORY) output_##METHOD, #include "format.def" }; /* Converts the INPUT value, encoded in INPUT_ENCODING, according to format specification FORMAT, appending the output to OUTPUT in OUTPUT_ENCODING. However, binary formats (FMT_P, FMT_PK, FMT_IB, FMT_PIB, FMT_RB) yield the binary results, which may not be properly encoded for OUTPUT_ENCODING. VALUE must be the correct width for FORMAT, that is, its width must be fmt_var_width(FORMAT). INPUT_ENCODING can normally be obtained by calling dict_get_encoding() on the dictionary with which INPUT is associated. ENCODING is only important when FORMAT's type is FMT_A. */ void data_out_recode (const union value *input, const char *input_encoding, const struct fmt_spec *format, struct string *output, const char *output_encoding) { assert (fmt_check_output (format)); if (format->type == FMT_A) { char *in = CHAR_CAST (char *, input->s); char *out = recode_string (output_encoding, input_encoding, in, format->w); ds_put_cstr (output, out); free (out); } else if (fmt_get_category (format->type) == FMT_CAT_BINARY) converters[format->type] (input, format, ds_put_uninit (output, format->w)); else { char *utf8_encoded = data_out (input, input_encoding, format); char *output_encoded = recode_string (output_encoding, UTF8, utf8_encoded, -1); ds_put_cstr (output, output_encoded); free (output_encoded); free (utf8_encoded); } } static char * binary_to_utf8 (const char *in, struct pool *pool) { uint8_t *out = pool_alloc_unaligned (pool, strlen (in) * 2 + 1); uint8_t *p = out; while (*in != '\0') { uint8_t byte = *in++; int mblen = u8_uctomb (p, byte, 2); assert (mblen > 0); p += mblen; } *p = '\0'; return CHAR_CAST (char *, out); } /* Converts the INPUT value into a UTF-8 encoded string, according to format specification FORMAT. VALUE must be the correct width for FORMAT, that is, its width must be fmt_var_width(FORMAT). INPUT_ENCODING must be the encoding of INPUT. Normally this can be obtained by calling dict_get_encoding() on the dictionary with which INPUT is associated. INPUT_ENCODING is only important when FORMAT's type is FMT_A. The return value is dynamically allocated, and must be freed by the caller. If POOL is non-null, then the return value is allocated on that pool. */ char * data_out_pool (const union value *input, const char *input_encoding, const struct fmt_spec *format, struct pool *pool) { assert (fmt_check_output (format)); if (format->type == FMT_A) { char *in = CHAR_CAST (char *, input->s); return recode_string_pool (UTF8, input_encoding, in, format->w, pool); } else if (fmt_get_category (format->type) == FMT_CAT_BINARY) { char tmp[16]; assert (format->w + 1 <= sizeof tmp); converters[format->type] (input, format, tmp); return binary_to_utf8 (tmp, pool); } else { const struct fmt_number_style *style = settings_get_style (format->type); size_t size = format->w + style->extra_bytes + 1; char *output; output = pool_alloc_unaligned (pool, size); converters[format->type] (input, format, output); return output; } } /* Like data_out_pool(), except that for basic numeric formats (F, COMMA, DOT, COLLAR, PCT, E) and custom currency formats are formatted as wide as necessary to fully display the selected number of decimal places. */ char * data_out_stretchy (const union value *input, const char *encoding, const struct fmt_spec *format, struct pool *pool) { if (fmt_get_category (format->type) & (FMT_CAT_BASIC | FMT_CAT_CUSTOM)) { const struct fmt_number_style *style = settings_get_style (format->type); struct fmt_spec wide_format; char tmp[128]; size_t size; wide_format.type = format->type; wide_format.w = 40; wide_format.d = format->d; size = format->w + style->extra_bytes + 1; if (size <= sizeof tmp) { output_number (input, &wide_format, tmp); return pool_strdup (pool, tmp + strspn (tmp, " ")); } } return data_out_pool (input, encoding, format, pool); } char * data_out (const union value *input, const char *input_encoding, const struct fmt_spec *format) { return data_out_pool (input, input_encoding, format, NULL); } /* Main conversion functions. */ /* Outputs F, COMMA, DOT, DOLLAR, PCT, E, CCA, CCB, CCC, CCD, and CCE formats. */ static void output_number (const union value *input, const struct fmt_spec *format, char *output) { double number = input->f; if (number == SYSMIS) output_missing (format, output); else if (!isfinite (number)) output_infinite (number, format, output); else { if (format->type != FMT_E && fabs (number) < 1.5 * power10 (format->w)) { struct rounder r; rounder_init (&r, number, format->d); if (output_decimal (&r, format, true, output) || output_scientific (number, format, true, output) || output_decimal (&r, format, false, output)) return; } if (!output_scientific (number, format, false, output)) output_overflow (format, output); } } /* Outputs N format. */ static void output_N (const union value *input, const struct fmt_spec *format, char *output) { double number = input->f * power10 (format->d); if (input->f == SYSMIS || number < 0) output_missing (format, output); else { char buf[128]; number = fabs (round (number)); if (number < power10 (format->w) && c_snprintf (buf, 128, "%0*.0f", format->w, number) == format->w) memcpy (output, buf, format->w); else output_overflow (format, output); } output[format->w] = '\0'; } /* Outputs Z format. */ static void output_Z (const union value *input, const struct fmt_spec *format, char *output) { double number = input->f * power10 (format->d); char buf[128]; if (input->f == SYSMIS) output_missing (format, output); else if (fabs (number) < power10 (format->w) && c_snprintf (buf, 128, "%0*.0f", format->w, fabs (round (number))) == format->w) { if (number < 0 && strspn (buf, "0") < format->w) { char *p = &buf[format->w - 1]; *p = "}JKLMNOPQR"[*p - '0']; } memcpy (output, buf, format->w); output[format->w] = '\0'; } else output_overflow (format, output); } /* Outputs P format. */ static void output_P (const union value *input, const struct fmt_spec *format, char *output) { if (output_bcd_integer (fabs (input->f * power10 (format->d)), format->w * 2 - 1, output) && input->f < 0.0) output[format->w - 1] |= 0xd; else output[format->w - 1] |= 0xf; } /* Outputs PK format. */ static void output_PK (const union value *input, const struct fmt_spec *format, char *output) { output_bcd_integer (input->f * power10 (format->d), format->w * 2, output); } /* Outputs IB format. */ static void output_IB (const union value *input, const struct fmt_spec *format, char *output) { double number = round (input->f * power10 (format->d)); if (input->f == SYSMIS || number >= power256 (format->w) / 2 - 1 || number < -power256 (format->w) / 2) memset (output, 0, format->w); else { uint64_t integer = fabs (number); if (number < 0) integer = -integer; output_binary_integer (integer, format->w, settings_get_output_integer_format (), output); } output[format->w] = '\0'; } /* Outputs PIB format. */ static void output_PIB (const union value *input, const struct fmt_spec *format, char *output) { double number = round (input->f * power10 (format->d)); if (input->f == SYSMIS || number < 0 || number >= power256 (format->w)) memset (output, 0, format->w); else output_binary_integer (number, format->w, settings_get_output_integer_format (), output); output[format->w] = '\0'; } /* Outputs PIBHEX format. */ static void output_PIBHEX (const union value *input, const struct fmt_spec *format, char *output) { double number = round (input->f); if (input->f == SYSMIS) output_missing (format, output); else if (input->f < 0 || number >= power256 (format->w / 2)) output_overflow (format, output); else { char tmp[8]; output_binary_integer (number, format->w / 2, INTEGER_MSB_FIRST, tmp); output_hex (tmp, format->w / 2, output); } } /* Outputs RB format. */ static void output_RB (const union value *input, const struct fmt_spec *format, char *output) { double d = input->f; memcpy (output, &d, format->w); output[format->w] = '\0'; } /* Outputs RBHEX format. */ static void output_RBHEX (const union value *input, const struct fmt_spec *format, char *output) { double d = input->f; output_hex (&d, format->w / 2, output); } /* Outputs DATE, ADATE, EDATE, JDATE, SDATE, QYR, MOYR, WKYR, DATETIME, TIME, and DTIME formats. */ static void output_date (const union value *input, const struct fmt_spec *format, char *output) { double number = input->f; int year, month, day, yday; const char *template = fmt_date_template (format->type, format->w); char tmp[64]; char *p = tmp; if (number == SYSMIS) goto missing; if (fmt_get_category (format->type) == FMT_CAT_DATE) { if (number <= 0) goto missing; calendar_offset_to_gregorian (number / 60. / 60. / 24., &year, &month, &day, &yday); number = fmod (number, 60. * 60. * 24.); } else year = month = day = yday = 0; while (*template != '\0') { int excess_width; int ch = *template; int count = 1; while (template[count] == ch) count++; template += count; switch (ch) { case 'd': if (count < 3) p += sprintf (p, "%02d", day); else p += sprintf (p, "%03d", yday); break; case 'm': if (count < 3) p += sprintf (p, "%02d", month); else { static const char *const months[12] = { "JAN", "FEB", "MAR", "APR", "MAY", "JUN", "JUL", "AUG", "SEP", "OCT", "NOV", "DEC", }; p = stpcpy (p, months[month - 1]); } break; case 'y': if (count >= 4) { if (year <= 9999) p += sprintf (p, "%04d", year); else if (format->type == FMT_DATETIME || format->type == FMT_YMDHMS) p = stpcpy (p, "****"); else goto overflow; } else { int epoch = settings_get_epoch (); int offset = year - epoch; if (offset < 0 || offset > 99) goto overflow; p += sprintf (p, "%02d", abs (year) % 100); } break; case 'q': p += sprintf (p, "%d", (month - 1) / 3 + 1); break; case 'w': p += sprintf (p, "%2d", (yday - 1) / 7 + 1); break; case 'D': if (number < 0) *p++ = '-'; number = fabs (number); p += c_snprintf (p, 64, "%*.0f", count, floor (number / 60. / 60. / 24.)); number = fmod (number, 60. * 60. * 24.); break; case 'H': if (number < 0) *p++ = '-'; number = fabs (number); p += c_snprintf (p, 64, "%0*.0f", count, floor (number / 60. / 60.)); number = fmod (number, 60. * 60.); break; case 'M': if (number < 0) *p++ = '-'; number = fabs (number); p += sprintf (p, "%02d", (int) floor (number / 60.)); number = fmod (number, 60.); excess_width = format->w - (p - tmp); if (excess_width < 0 || (format->type == FMT_MTIME && excess_width < 3)) goto overflow; if (excess_width == 3 || excess_width == 4 || (excess_width >= 5 && format->d == 0)) p += sprintf (p, ":%02d", (int) number); else if (excess_width >= 5) { int d = MIN (format->d, excess_width - 4); int w = d + 3; c_snprintf (p, 64, ":%0*.*f", w, d, number); if (settings_get_decimal_char (FMT_F) != '.') { char *cp = strchr (p, '.'); if (cp != NULL) *cp = settings_get_decimal_char (FMT_F); } p += strlen (p); } goto done; default: assert (count == 1); *p++ = ch; break; } } done: buf_copy_lpad (output, format->w, tmp, p - tmp, ' '); output[format->w] = '\0'; return; overflow: output_overflow (format, output); return; missing: output_missing (format, output); return; } /* Outputs WKDAY format. */ static void output_WKDAY (const union value *input, const struct fmt_spec *format, char *output) { static const char *const weekdays[7] = { "SUNDAY", "MONDAY", "TUESDAY", "WEDNESDAY", "THURSDAY", "FRIDAY", "SATURDAY", }; if (input->f >= 1 && input->f < 8) { buf_copy_str_rpad (output, format->w, weekdays[(int) input->f - 1], ' '); output[format->w] = '\0'; } else { if (input->f != SYSMIS) msg (ME, _("Weekday number %f is not between 1 and 7."), input->f); output_missing (format, output); } } /* Outputs MONTH format. */ static void output_MONTH (const union value *input, const struct fmt_spec *format, char *output) { static const char *const months[12] = { "JANUARY", "FEBRUARY", "MARCH", "APRIL", "MAY", "JUNE", "JULY", "AUGUST", "SEPTEMBER", "OCTOBER", "NOVEMBER", "DECEMBER", }; if (input->f >= 1 && input->f < 13) { buf_copy_str_rpad (output, format->w, months[(int) input->f - 1], ' '); output[format->w] = '\0'; } else { if (input->f != SYSMIS) msg (ME, _("Month number %f is not between 1 and 12."), input->f); output_missing (format, output); } } /* Outputs A format. */ static void output_A (const union value *input UNUSED, const struct fmt_spec *format UNUSED, char *output UNUSED) { NOT_REACHED (); } /* Outputs AHEX format. */ static void output_AHEX (const union value *input, const struct fmt_spec *format, char *output) { output_hex (input->s, format->w / 2, output); } /* Decimal and scientific formatting. */ /* If REQUEST plus the current *WIDTH fits within MAX_WIDTH, increments *WIDTH by REQUEST and return true. Otherwise returns false without changing *WIDTH. */ static bool allocate_space (int request, int max_width, int *width) { assert (*width <= max_width); if (request + *width <= max_width) { *width += request; return true; } else return false; } /* Tries to compose the number represented by R, in the style of FORMAT, into OUTPUT. Returns true if successful, false on failure, which occurs if FORMAT's width is too narrow. If REQUIRE_AFFIXES is true, then the prefix and suffix specified by FORMAT's style must be included; otherwise, they may be omitted to make the number fit. */ static bool output_decimal (const struct rounder *r, const struct fmt_spec *format, bool require_affixes, char *output) { const struct fmt_number_style *style = settings_get_style (format->type); int decimals; for (decimals = format->d; decimals >= 0; decimals--) { /* Formatted version of magnitude of NUMBER. */ char magnitude[64]; /* Number of digits in MAGNITUDE's integer and fractional parts. */ int integer_digits; /* Amount of space within the field width already claimed. Initially this is the width of MAGNITUDE, then it is reduced in stages as space is allocated to prefixes and suffixes and grouping characters. */ int width; /* Include various decorations? */ bool add_neg_prefix; bool add_affixes; bool add_grouping; /* Position in output. */ char *p; /* Make sure there's room for the number's magnitude, plus the negative suffix, plus (if negative) the negative prefix. */ width = rounder_width (r, decimals, &integer_digits, &add_neg_prefix); width += style->neg_suffix.width; if (add_neg_prefix) width += style->neg_prefix.width; if (width > format->w) continue; /* If there's room for the prefix and suffix, allocate space. If the affixes are required, but there's no space, give up. */ add_affixes = allocate_space (fmt_affix_width (style), format->w, &width); if (!add_affixes && require_affixes) continue; /* Check whether we should include grouping characters. We need room for a complete set or we don't insert any at all. We don't include grouping characters if decimal places were requested but they were all dropped. */ add_grouping = (style->grouping != 0 && integer_digits > 3 && (format->d == 0 || decimals > 0) && allocate_space ((integer_digits - 1) / 3, format->w, &width)); /* Format the number's magnitude. */ rounder_format (r, decimals, magnitude); /* Assemble number. */ p = output; if (format->w > width) p = mempset (p, ' ', format->w - width); if (add_neg_prefix) p = stpcpy (p, style->neg_prefix.s); if (add_affixes) p = stpcpy (p, style->prefix.s); if (!add_grouping) p = mempcpy (p, magnitude, integer_digits); else { int i; for (i = 0; i < integer_digits; i++) { if (i > 0 && (integer_digits - i) % 3 == 0) *p++ = style->grouping; *p++ = magnitude[i]; } } if (decimals > 0) { *p++ = style->decimal; p = mempcpy (p, &magnitude[integer_digits + 1], decimals); } if (add_affixes) p = stpcpy (p, style->suffix.s); if (add_neg_prefix) p = stpcpy (p, style->neg_suffix.s); else p = mempset (p, ' ', style->neg_suffix.width); assert (p >= output + format->w); assert (p <= output + format->w + style->extra_bytes); *p = '\0'; return true; } return false; } /* Formats NUMBER into OUTPUT in scientific notation according to the style of the format specified in FORMAT. */ static bool output_scientific (double number, const struct fmt_spec *format, bool require_affixes, char *output) { const struct fmt_number_style *style = settings_get_style (format->type); int width; int fraction_width; bool add_affixes; char *p; /* Allocate minimum required space. */ width = 6 + style->neg_suffix.width; if (number < 0) width += style->neg_prefix.width; if (width > format->w) return false; /* Check for room for prefix and suffix. */ add_affixes = allocate_space (fmt_affix_width (style), format->w, &width); if (require_affixes && !add_affixes) return false; /* Figure out number of characters we can use for the fraction, if any. (If that turns out to be 1, then we'll output a decimal point without any digits following; that's what the # flag does in the call to c_snprintf, below.) */ fraction_width = MIN (MIN (format->d + 1, format->w - width), 16); if (format->type != FMT_E && fraction_width == 1) fraction_width = 0; width += fraction_width; /* Format (except suffix). */ p = output; if (width < format->w) p = mempset (p, ' ', format->w - width); if (number < 0) p = stpcpy (p, style->neg_prefix.s); if (add_affixes) p = stpcpy (p, style->prefix.s); if (fraction_width > 0) c_snprintf (p, 64, "%#.*E", fraction_width - 1, fabs (number)); else c_snprintf (p, 64, "%.0E", fabs (number)); /* The C locale always uses a period `.' as a decimal point. Translate to comma if necessary. */ if (style->decimal != '.') { char *cp = strchr (p, '.'); if (cp != NULL) *cp = style->decimal; } /* Make exponent have exactly three digits, plus sign. */ { char *cp = strchr (p, 'E') + 1; long int exponent = strtol (cp, NULL, 10); if (labs (exponent) > 999) return false; sprintf (cp, "%+04ld", exponent); } /* Add suffixes. */ p = strchr (p, '\0'); if (add_affixes) p = stpcpy (p, style->suffix.s); if (number < 0) p = stpcpy (p, style->neg_suffix.s); else p = mempset (p, ' ', style->neg_suffix.width); assert (p >= output + format->w); assert (p <= output + format->w + style->extra_bytes); *p = '\0'; return true; } /* Returns true if the magnitude represented by R should be rounded up when chopped off at DECIMALS decimal places, false if it should be rounded down. */ static bool should_round_up (const struct rounder *r, int decimals) { int digit = r->string[r->integer_digits + decimals + 1]; assert (digit >= '0' && digit <= '9'); return digit >= '5'; } /* Initializes R for formatting the magnitude of NUMBER to no more than MAX_DECIMAL decimal places. */ static void rounder_init (struct rounder *r, double number, int max_decimals) { assert (fabs (number) < 1e41); assert (max_decimals >= 0 && max_decimals <= 16); if (max_decimals == 0) { /* Fast path. No rounding needed. We append ".00" to the integer representation because round_up assumes that fractional digits are present. */ c_snprintf (r->string, 64, "%.0f.00", fabs (round (number))); } else { /* Slow path. This is more difficult than it really should be because we have to make sure that numbers that are exactly halfway between two representations are always rounded away from zero. This is not what sprintf normally does (usually it rounds to even), so we have to fake it as best we can, by formatting with extra precision and then doing the rounding ourselves. We take up to two rounds to format numbers. In the first round, we obtain 2 digits of precision beyond those requested by the user. If those digits are exactly "50", then in a second round we format with as many digits as are significant in a "double". It might be better to directly implement our own floating-point formatting routine instead of relying on the system's sprintf implementation. But the classic Steele and White paper on printing floating-point numbers does not hint how to do what we want, and it's not obvious how to change their algorithms to do so. It would also be a lot of work. */ c_snprintf (r->string, 64, "%.*f", max_decimals + 2, fabs (number)); if (!strcmp (r->string + strlen (r->string) - 2, "50")) { int binary_exponent, decimal_exponent, format_decimals; frexp (number, &binary_exponent); decimal_exponent = binary_exponent * 3 / 10; format_decimals = (DBL_DIG + 1) - decimal_exponent; if (format_decimals > max_decimals + 2) c_snprintf (r->string, 64, "%.*f", format_decimals, fabs (number)); } } if (r->string[0] == '0') memmove (r->string, &r->string[1], strlen (r->string)); r->leading_zeros = strspn (r->string, "0."); r->leading_nines = strspn (r->string, "9."); r->integer_digits = strchr (r->string, '.') - r->string; assert (r->integer_digits < 64); assert (r->integer_digits >= 0); r->negative = number < 0; } /* Returns the number of characters required to format the magnitude represented by R to DECIMALS decimal places. The return value includes integer digits and a decimal point and fractional digits, if any, but it does not include any negative prefix or suffix or other affixes. *INTEGER_DIGITS is set to the number of digits before the decimal point in the output, between 0 and 40. If R represents a negative number and its rounded representation would include at least one nonzero digit, *NEGATIVE is set to true; otherwise, it is set to false. */ static int rounder_width (const struct rounder *r, int decimals, int *integer_digits, bool *negative) { /* Calculate base measures. */ int width = r->integer_digits; if (decimals > 0) width += decimals + 1; *integer_digits = r->integer_digits; *negative = r->negative; /* Rounding can cause adjustments. */ if (should_round_up (r, decimals)) { /* Rounding up leading 9s adds a new digit (a 1). */ if (r->leading_nines >= width) { width++; ++*integer_digits; } } else { /* Rounding down. */ if (r->leading_zeros >= width) { /* All digits that remain after rounding are zeros. Therefore we drop the negative sign. */ *negative = false; if (r->integer_digits == 0 && decimals == 0) { /* No digits at all are left. We need to display at least a single digit (a zero). */ assert (width == 0); width++; *integer_digits = 1; } } } return width; } /* Formats the magnitude represented by R into OUTPUT, rounding to DECIMALS decimal places. Exactly as many characters as indicated by rounder_width are written. No terminating null is appended. */ static void rounder_format (const struct rounder *r, int decimals, char *output) { int base_width = r->integer_digits + (decimals > 0 ? decimals + 1 : 0); if (should_round_up (r, decimals)) { if (r->leading_nines < base_width) { /* Rounding up. This is the common case where rounding up doesn't add an extra digit. */ char *p; memcpy (output, r->string, base_width); for (p = output + base_width - 1; ; p--) { assert (p >= output); if (*p == '9') *p = '0'; else if (*p >= '0' && *p <= '8') { (*p)++; break; } else assert (*p == '.'); } } else { /* Rounding up leading 9s causes the result to be a 1 followed by a number of 0s, plus a decimal point. */ char *p = output; *p++ = '1'; p = mempset (p, '0', r->integer_digits); if (decimals > 0) { *p++ = '.'; p = mempset (p, '0', decimals); } assert (p == output + base_width + 1); } } else { /* Rounding down. */ if (r->integer_digits != 0 || decimals != 0) { /* Common case: just copy the digits. */ memcpy (output, r->string, base_width); } else { /* No digits remain. The output is just a zero. */ output[0] = '0'; } } } /* Helper functions. */ /* Returns 10**X. */ static double PURE_FUNCTION power10 (int x) { static const double p[] = { 1e0, 1e1, 1e2, 1e3, 1e4, 1e5, 1e6, 1e7, 1e8, 1e9, 1e10, 1e11, 1e12, 1e13, 1e14, 1e15, 1e16, 1e17, 1e18, 1e19, 1e20, 1e21, 1e22, 1e23, 1e24, 1e25, 1e26, 1e27, 1e28, 1e29, 1e30, 1e31, 1e32, 1e33, 1e34, 1e35, 1e36, 1e37, 1e38, 1e39, 1e40, }; return x >= 0 && x < sizeof p / sizeof *p ? p[x] : pow (10.0, x); } /* Returns 256**X. */ static double PURE_FUNCTION power256 (int x) { static const double p[] = { 1.0, 256.0, 65536.0, 16777216.0, 4294967296.0, 1099511627776.0, 281474976710656.0, 72057594037927936.0, 18446744073709551616.0 }; return x >= 0 && x < sizeof p / sizeof *p ? p[x] : pow (256.0, x); } /* Formats non-finite NUMBER into OUTPUT according to the width given in FORMAT. */ static void output_infinite (double number, const struct fmt_spec *format, char *output) { assert (!isfinite (number)); if (format->w >= 3) { const char *s; if (isnan (number)) s = "NaN"; else if (isinf (number)) s = number > 0 ? "+Infinity" : "-Infinity"; else s = "Unknown"; buf_copy_str_lpad (output, format->w, s, ' '); } else output_overflow (format, output); output[format->w] = '\0'; } /* Formats OUTPUT as a missing value for the given FORMAT. */ static void output_missing (const struct fmt_spec *format, char *output) { memset (output, ' ', format->w); if (format->type != FMT_N) { int dot_ofs = (format->type == FMT_PCT ? 2 : format->type == FMT_E ? 5 : 1); output[MAX (0, format->w - format->d - dot_ofs)] = '.'; } else output[format->w - 1] = '.'; output[format->w] = '\0'; } /* Formats OUTPUT for overflow given FORMAT. */ static void output_overflow (const struct fmt_spec *format, char *output) { memset (output, '*', format->w); output[format->w] = '\0'; } /* Converts the integer part of NUMBER to a packed BCD number with the given number of DIGITS in OUTPUT. If DIGITS is odd, the least significant nibble of the final byte in OUTPUT is set to 0. Returns true if successful, false if NUMBER is not representable. On failure, OUTPUT is cleared to all zero bytes. */ static bool output_bcd_integer (double number, int digits, char *output) { char decimal[64]; assert (digits < sizeof decimal); output[DIV_RND_UP (digits, 2)] = '\0'; if (number != SYSMIS && number >= 0. && number < power10 (digits) && c_snprintf (decimal, 64, "%0*.0f", digits, round (number)) == digits) { const char *src = decimal; int i; for (i = 0; i < digits / 2; i++) { int d0 = *src++ - '0'; int d1 = *src++ - '0'; *output++ = (d0 << 4) + d1; } if (digits % 2) *output = (*src - '0') << 4; return true; } else { memset (output, 0, DIV_RND_UP (digits, 2)); return false; } } /* Writes VALUE to OUTPUT as a BYTES-byte binary integer of the given INTEGER_FORMAT. */ static void output_binary_integer (uint64_t value, int bytes, enum integer_format integer_format, char *output) { integer_put (value, integer_format, output, bytes); } /* Converts the BYTES bytes in DATA to twice as many hexadecimal digits in OUTPUT. */ static void output_hex (const void *data_, size_t bytes, char *output) { const uint8_t *data = data_; size_t i; for (i = 0; i < bytes; i++) { static const char hex_digits[] = "0123456789ABCDEF"; *output++ = hex_digits[data[i] >> 4]; *output++ = hex_digits[data[i] & 15]; } *output = '\0'; } pspp-1.4.1/src/data/casereader-translator.c0000644000175000017500000004234213670210420020244 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2007, 2009, 2011 Free Software Foundation, Inc. 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 3 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, see . */ #include #include #include "data/casereader-provider.h" #include "data/casereader.h" #include "data/val-type.h" #include "data/variable.h" #include "libpspp/taint.h" #include "gl/xalloc.h" /* Casereader that applies a user-supplied function to translate each case into another in an arbitrary fashion. */ /* A translating casereader. */ struct casereader_translator { struct casereader *subreader; /* Source of input cases. */ struct ccase *(*translate) (struct ccase *input, void *aux); bool (*destroy) (void *aux); void *aux; }; static const struct casereader_class casereader_translator_class; /* Creates and returns a new casereader whose cases are produced by reading from SUBREADER and passing through TRANSLATE, which must return the translated case, and populate it based on INPUT and auxiliary data AUX. TRANSLATE must destroy its input case. TRANSLATE may be stateful, that is, the output for a given case may depend on previous cases. If TRANSLATE is stateless, then you may want to use casereader_translate_stateless instead, since it sometimes performs better. The cases returned by TRANSLATE must match OUTPUT_PROTO. When the translating casereader is destroyed, DESTROY will be called to allow any state maintained by TRANSLATE to be freed. After this function is called, SUBREADER must not ever again be referenced directly. It will be destroyed automatically when the translating casereader is destroyed. */ struct casereader * casereader_create_translator (struct casereader *subreader, const struct caseproto *output_proto, struct ccase *(*translate) (struct ccase *input, void *aux), bool (*destroy) (void *aux), void *aux) { struct casereader_translator *ct = xmalloc (sizeof *ct); struct casereader *reader; ct->subreader = casereader_rename (subreader); ct->translate = translate; ct->destroy = destroy; ct->aux = aux; reader = casereader_create_sequential ( NULL, output_proto, casereader_get_case_cnt (ct->subreader), &casereader_translator_class, ct); taint_propagate (casereader_get_taint (ct->subreader), casereader_get_taint (reader)); return reader; } /* Internal read function for translating casereader. */ static struct ccase * casereader_translator_read (struct casereader *reader UNUSED, void *ct_) { struct casereader_translator *ct = ct_; struct ccase *tmp = casereader_read (ct->subreader); if (tmp) tmp = ct->translate (tmp, ct->aux); return tmp; } /* Internal destroy function for translating casereader. */ static void casereader_translator_destroy (struct casereader *reader UNUSED, void *ct_) { struct casereader_translator *ct = ct_; casereader_destroy (ct->subreader); ct->destroy (ct->aux); free (ct); } /* Casereader class for translating casereader. */ static const struct casereader_class casereader_translator_class = { casereader_translator_read, casereader_translator_destroy, NULL, NULL, }; /* Casereader that applies a user-supplied function to translate each case into another in a stateless fashion. */ /* A statelessly translating casereader. */ struct casereader_stateless_translator { struct casereader *subreader; /* Source of input cases. */ casenumber case_offset; struct ccase *(*translate) (struct ccase *input, casenumber, const void *aux); bool (*destroy) (void *aux); void *aux; }; static const struct casereader_random_class casereader_stateless_translator_class; /* Creates and returns a new casereader whose cases are produced by reading from SUBREADER and passing through the TRANSLATE function. TRANSLATE must takes ownership of its input case and returns a translated case, populating the translated case based on INPUT and auxiliary data AUX. TRANSLATE must be stateless, that is, the output for a given case must not depend on previous cases. This is because cases may be retrieved in arbitrary order, and some cases may be retrieved multiple times, and some cases may be skipped and never retrieved at all. If TRANSLATE is stateful, use casereader_create_translator instead. The casenumber argument to the TRANSLATE function is the absolute case number in SUBREADER, that is, 0 when the first case in SUBREADER is being translated, 1 when the second case is being translated, and so on. The cases returned by TRANSLATE must match OUTPUT_PROTO. When the stateless translating casereader is destroyed, DESTROY will be called to allow any auxiliary data maintained by TRANSLATE to be freed. After this function is called, SUBREADER must not ever again be referenced directly. It will be destroyed automatically when the translating casereader is destroyed. */ struct casereader * casereader_translate_stateless ( struct casereader *subreader, const struct caseproto *output_proto, struct ccase *(*translate) (struct ccase *input, casenumber, const void *aux), bool (*destroy) (void *aux), void *aux) { struct casereader_stateless_translator *cst = xmalloc (sizeof *cst); struct casereader *reader; cst->subreader = casereader_rename (subreader); cst->translate = translate; cst->destroy = destroy; cst->aux = aux; reader = casereader_create_random ( output_proto, casereader_get_case_cnt (cst->subreader), &casereader_stateless_translator_class, cst); taint_propagate (casereader_get_taint (cst->subreader), casereader_get_taint (reader)); return reader; } /* Internal read function for stateless translating casereader. */ static struct ccase * casereader_stateless_translator_read (struct casereader *reader UNUSED, void *cst_, casenumber idx) { struct casereader_stateless_translator *cst = cst_; struct ccase *tmp = casereader_peek (cst->subreader, idx); if (tmp != NULL) tmp = cst->translate (tmp, cst->case_offset + idx, cst->aux); return tmp; } /* Internal destroy function for translating casereader. */ static void casereader_stateless_translator_destroy (struct casereader *reader UNUSED, void *cst_) { struct casereader_stateless_translator *cst = cst_; casereader_destroy (cst->subreader); cst->destroy (cst->aux); free (cst); } static void casereader_stateless_translator_advance (struct casereader *reader UNUSED, void *cst_, casenumber cnt) { struct casereader_stateless_translator *cst = cst_; cst->case_offset += casereader_advance (cst->subreader, cnt); } /* Casereader class for stateless translating casereader. */ static const struct casereader_random_class casereader_stateless_translator_class = { casereader_stateless_translator_read, casereader_stateless_translator_destroy, casereader_stateless_translator_advance, }; struct casereader_append_numeric { struct caseproto *proto; casenumber n; new_value_func *func; void *aux; void (*destroy) (void *aux); }; static bool can_destroy (void *can_); static struct ccase *can_translate (struct ccase *, void *can_); /* Creates and returns a new casereader whose cases are produced by reading from SUBREADER and appending an additional value, generated by FUNC. AUX is an optional parameter which gets passed to FUNC. FUNC will also receive N as it, which is the ordinal number of the case in the reader. DESTROY is an optional parameter used to destroy AUX. After this function is called, SUBREADER must not ever again be referenced directly. It will be destroyed automatically when the translating casereader is destroyed. */ struct casereader * casereader_create_append_numeric (struct casereader *subreader, new_value_func func, void *aux, void (*destroy) (void *aux)) { struct casereader_append_numeric *can = xmalloc (sizeof *can); can->proto = caseproto_ref (casereader_get_proto (subreader)); can->proto = caseproto_add_width (can->proto, 0); can->n = 0; can->aux = aux; can->func = func; can->destroy = destroy; return casereader_create_translator (subreader, can->proto, can_translate, can_destroy, can); } static struct ccase * can_translate (struct ccase *c, void *can_) { struct casereader_append_numeric *can = can_; double new_value = can->func (c, can->n++, can->aux); c = case_unshare_and_resize (c, can->proto); case_data_rw_idx (c, caseproto_get_n_widths (can->proto) - 1)->f = new_value; return c; } static bool can_destroy (void *can_) { struct casereader_append_numeric *can = can_; if (can->destroy) can->destroy (can->aux); caseproto_unref (can->proto); free (can); return true; } struct arithmetic_sequence { double first; double increment; }; static double next_arithmetic (const struct ccase *c UNUSED, casenumber n, void *aux) { struct arithmetic_sequence *as = aux; return n * as->increment + as->first; } /* Creates and returns a new casereader whose cases are produced by reading from SUBREADER and appending an additional value, which takes the value FIRST in the first case, FIRST + INCREMENT in the second case, FIRST + INCREMENT * 2 in the third case, and so on. After this function is called, SUBREADER must not ever again be referenced directly. It will be destroyed automatically when the translating casereader is destroyed. */ struct casereader * casereader_create_arithmetic_sequence (struct casereader *subreader, double first, double increment) { struct arithmetic_sequence *as = xzalloc (sizeof *as); as->first = first; as->increment = increment; return casereader_create_append_numeric (subreader, next_arithmetic, as, free); } struct casereader_append_rank { struct casereader *clone; casenumber n; const struct variable *var; const struct variable *weight; struct caseproto *proto; casenumber n_common; double mean_rank; double cc; distinct_func *distinct; void *aux; enum rank_error *err; double prev_value; }; static bool car_destroy (void *car_); static struct ccase *car_translate (struct ccase *input, void *car_); /* Creates and returns a new casereader whose cases are produced by reading from SUBREADER and appending an additional value, which is the rank of the observation. W is the weight variable of the dictionary containing V, or NULL if there is no weight variable. The following preconditions must be met: 1. SUBREADER must be sorted on V. 2. The weight variables, must be non-negative. If either of these preconditions are not satisfied, then the rank variables may not be correct. In this case, if ERR is non-null, it will be set according to the erroneous conditions encountered. If DISTINCT_CALLBACK is non-null, then it will be called exactly once for every case containing a distinct value of V. AUX is an auxiliary pointer passed to DISTINCT_CALLBACK. After this function is called, SUBREADER must not ever again be referenced directly. It will be destroyed automatically when the translating casereader is destroyed. */ struct casereader * casereader_create_append_rank (struct casereader *subreader, const struct variable *v, const struct variable *w, enum rank_error *err, distinct_func *distinct_callback, void *aux ) { struct casereader_append_rank *car = xmalloc (sizeof *car); car->proto = caseproto_ref (casereader_get_proto (subreader)); car->proto = caseproto_add_width (car->proto, 0); car->weight = w; car->var = v; car->n = 0; car->n_common = 1; car->cc = 0.0; car->clone = casereader_clone (subreader); car->distinct = distinct_callback; car->aux = aux; car->err = err; car->prev_value = SYSMIS; return casereader_create_translator (subreader, car->proto, car_translate, car_destroy, car); } static bool car_destroy (void *car_) { struct casereader_append_rank *car = car_; casereader_destroy (car->clone); caseproto_unref (car->proto); free (car); return true; } static struct ccase * car_translate (struct ccase *input, void *car_) { struct casereader_append_rank *car = car_; const double value = case_data (input, car->var)->f; if (car->prev_value != SYSMIS) { if (car->err && value < car->prev_value) *car->err |= RANK_ERR_UNSORTED; } if (car->n_common == 1) { double vxx = SYSMIS; casenumber k = 0; double weight = 1.0; if (car->weight) { weight = case_data (input, car->weight)->f; if (car->err && weight < 0) *car->err |= RANK_ERR_NEGATIVE_WEIGHT; } do { struct ccase *c = casereader_peek (car->clone, car->n + ++k); if (c == NULL) break; vxx = case_data (c, car->var)->f; if (vxx == value) { if (car->weight) { double w = case_data (c, car->weight)->f; if (car->err && w < 0) *car->err |= RANK_ERR_NEGATIVE_WEIGHT; weight += w; } else weight += 1.0; car->n_common++; } case_unref (c); } while (vxx == value); car->mean_rank = car->cc + (weight + 1) / 2.0; car->cc += weight; if (car->distinct) car->distinct (value, car->n_common, weight, car->aux); } else car->n_common--; car->n++; input = case_unshare_and_resize (input, car->proto); case_data_rw_idx (input, caseproto_get_n_widths (car->proto) - 1)->f = car->mean_rank; car->prev_value = value; return input; } struct consolidator { const struct variable *key; const struct variable *weight; double cc; double prev_cc; casenumber n; struct casereader *clone; struct caseproto *proto; int direction; }; static bool uniquify (const struct ccase *c, void *aux) { struct consolidator *cdr = aux; const union value *current_value = case_data (c, cdr->key); const int key_width = var_get_width (cdr->key); const double weight = cdr->weight ? case_data (c, cdr->weight)->f : 1.0; struct ccase *next_case = casereader_peek (cdr->clone, cdr->n + 1); int dir = 0; cdr->n ++; cdr->cc += weight; if (NULL == next_case) goto end; dir = value_compare_3way (case_data (next_case, cdr->key), current_value, key_width); case_unref (next_case); if (dir != 0) { /* Insist that the data are sorted */ assert (cdr->direction == 0 || dir == cdr->direction); cdr->direction = dir; goto end; } return false; end: cdr->prev_cc = cdr->cc; cdr->cc = 0; return true; } static struct ccase * consolodate_weight (struct ccase *input, void *aux) { struct consolidator *cdr = aux; struct ccase *c; if (cdr->weight) { c = case_unshare (input); case_data_rw (c, cdr->weight)->f = cdr->prev_cc; } else { c = case_unshare_and_resize (input, cdr->proto); case_data_rw_idx (c, caseproto_get_n_widths (cdr->proto) - 1)->f = cdr->prev_cc; } return c; } static bool uniquify_destroy (void *aux) { struct consolidator *cdr = aux; casereader_destroy (cdr->clone); caseproto_unref (cdr->proto); free (cdr); return true; } /* Returns a new casereader which is based upon INPUT, but which contains a maximum of one case for each distinct value of KEY. If WEIGHT is non-null, then the new casereader's values for this variable will be the sum of all values matching KEY. IF WEIGHT is null, then the new casereader will have an additional numeric value appended, which will contain the total number of cases containing KEY. INPUT must be sorted on KEY */ struct casereader * casereader_create_distinct (struct casereader *input, const struct variable *key, const struct variable *weight) { struct casereader *u ; struct casereader *ud ; struct caseproto *output_proto = caseproto_ref (casereader_get_proto (input)); struct consolidator *cdr = xmalloc (sizeof (*cdr)); cdr->n = 0; cdr->key = key; cdr->weight = weight; cdr->cc = 0; cdr->clone = casereader_clone (input); cdr->direction = 0; if (NULL == cdr->weight) output_proto = caseproto_add_width (output_proto, 0); cdr->proto = output_proto; u = casereader_create_filter_func (input, uniquify, NULL, cdr, NULL); ud = casereader_create_translator (u, output_proto, consolodate_weight, uniquify_destroy, cdr); return ud; } pspp-1.4.1/src/data/casegrouper.c0000644000175000017500000001740313320146056016303 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2007, 2009, 2011, 2013 Free Software Foundation, Inc. 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 3 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, see . */ #include #include "data/casegrouper.h" #include #include "data/casereader.h" #include "data/casewriter.h" #include "data/dictionary.h" #include "data/subcase.h" #include "libpspp/taint.h" #include "gl/xalloc.h" /* A casegrouper. */ struct casegrouper { struct casereader *reader; /* Source of input cases. */ struct taint *taint; /* Error status for casegrouper. */ /* Functions for grouping cases. */ bool (*same_group) (const struct ccase *, const struct ccase *, void *aux); void (*destroy) (void *aux); void *aux; }; /* Creates and returns a new casegrouper that takes its input from READER. SAME_GROUP is used to decide which cases are in a group: it returns true if the pair of cases provided are in the same group, false otherwise. DESTROY will be called when the casegrouper is destroyed and should free any storage needed by SAME_GROUP. Takes ownerhip of READER. SAME_GROUP may be a null pointer. If so, READER's entire contents is considered to be a single group. */ struct casegrouper * casegrouper_create_func (struct casereader *reader, bool (*same_group) (const struct ccase *, const struct ccase *, void *aux), void (*destroy) (void *aux), void *aux) { struct casegrouper *grouper = xmalloc (sizeof *grouper); grouper->reader = casereader_rename (reader); grouper->taint = taint_clone (casereader_get_taint (grouper->reader)); grouper->same_group = same_group; grouper->destroy = destroy; grouper->aux = aux; return grouper; } /* Obtains the next group of cases from GROUPER. Returns true if successful, false if no groups remain. If successful, *READER is set to the casereader for the new group; otherwise, it is set to NULL. */ bool casegrouper_get_next_group (struct casegrouper *grouper, struct casereader **reader) { /* FIXME: we really shouldn't need a temporary casewriter for the common case where we read an entire group's data before going on to the next. */ if (grouper->same_group != NULL) { struct casewriter *writer; struct ccase *group_case, *tmp; group_case = casereader_read (grouper->reader); if (group_case == NULL) { *reader = NULL; return false; } writer = autopaging_writer_create ( casereader_get_proto (grouper->reader)); casewriter_write (writer, case_ref (group_case)); while ((tmp = casereader_peek (grouper->reader, 0)) != NULL && grouper->same_group (group_case, tmp, grouper->aux)) { case_unref (casereader_read (grouper->reader)); casewriter_write (writer, tmp); } case_unref (tmp); case_unref (group_case); *reader = casewriter_make_reader (writer); return true; } else { if (grouper->reader != NULL) { if (!casereader_is_empty (grouper->reader)) { *reader = grouper->reader; grouper->reader = NULL; return true; } else { casereader_destroy (grouper->reader); grouper->reader = NULL; return false; } } else { *reader = NULL; return false; } } } /* Destroys GROUPER. Returns false if GROUPER's input casereader or any state derived from it had become tainted, which means that an I/O error or other serious error occurred in processing data derived from GROUPER; otherwise, return true. */ bool casegrouper_destroy (struct casegrouper *grouper) { if (grouper != NULL) { struct taint *taint = grouper->taint; bool ok; casereader_destroy (grouper->reader); if (grouper->destroy != NULL) grouper->destroy (grouper->aux); free (grouper); ok = !taint_has_tainted_successor (taint); taint_destroy (taint); return ok; } else return true; } /* Casegrouper based on equal values of variables from case to case. */ static bool casegrouper_vars_same_group (const struct ccase *, const struct ccase *, void *); static void casegrouper_vars_destroy (void *); /* Creates and returns a casegrouper that reads data from READER and breaks it into contiguous groups of cases that have equal values for the VAR_CNT variables in VARS. If VAR_CNT is 0, then all the cases will be put in a single group. Takes ownerhip of READER. */ struct casegrouper * casegrouper_create_vars (struct casereader *reader, const struct variable *const *vars, size_t var_cnt) { if (var_cnt > 0) { struct subcase *sc = xmalloc (sizeof *sc); subcase_init_vars (sc, vars, var_cnt); return casegrouper_create_func (reader, casegrouper_vars_same_group, casegrouper_vars_destroy, sc); } else return casegrouper_create_func (reader, NULL, NULL, NULL); } /* Creates and returns a casegrouper that reads data from READER and breaks it into contiguous groups of cases that have equal values for the SPLIT FILE variables in DICT. If DICT has no SPLIT FILE variables, then all the cases will be put into a single group. Takes ownerhip of READER. */ struct casegrouper * casegrouper_create_splits (struct casereader *reader, const struct dictionary *dict) { return casegrouper_create_vars (reader, dict_get_split_vars (dict), dict_get_split_cnt (dict)); } /* Creates and returns a casegrouper that reads data from READER and breaks it into contiguous groups of cases that have equal values for the variables used for sorting in SC. If SC is empty (contains no fields), then all the cases will be put into a single group. Takes ownerhip of READER. */ struct casegrouper * casegrouper_create_subcase (struct casereader *reader, const struct subcase *sc) { if (subcase_get_n_fields (sc) > 0) { struct subcase *sc_copy = xmalloc (sizeof *sc); subcase_clone (sc_copy, sc); return casegrouper_create_func (reader, casegrouper_vars_same_group, casegrouper_vars_destroy, sc_copy); } else return casegrouper_create_func (reader, NULL, NULL, NULL); } /* "same_group" function for an equal-variables casegrouper. */ static bool casegrouper_vars_same_group (const struct ccase *a, const struct ccase *b, void *sc_) { struct subcase *sc = sc_; return subcase_equal (sc, a, sc, b); } /* "destroy" for an equal-variables casegrouper. */ static void casegrouper_vars_destroy (void *sc_) { struct subcase *sc = sc_; if (sc != NULL) { subcase_destroy (sc); free (sc); } } pspp-1.4.1/src/data/data-in.c0000644000175000017500000007674313723216277015327 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 1997-9, 2000, 2006, 2009, 2010, 2011, 2012 Free Software Foundation, Inc. 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 3 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, see . */ #include #include "data-in.h" #include #include #include #include #include #include #include #include #include #include #include "calendar.h" #include "dictionary.h" #include "format.h" #include "identifier.h" #include "libpspp/assertion.h" #include "libpspp/compiler.h" #include "libpspp/i18n.h" #include "libpspp/integer-format.h" #include "libpspp/misc.h" #include "libpspp/str.h" #include "settings.h" #include "value.h" #include "gl/c-ctype.h" #include "gl/c-strtod.h" #include "gl/minmax.h" #include "gl/xalloc.h" #include "gettext.h" #define _(msgid) gettext (msgid) /* Information about parsing one data field. */ struct data_in { struct substring input; /* Source. */ enum fmt_type format; /* Input format. */ union value *output; /* Destination. */ int width; /* Output width. */ }; typedef char *data_in_parser_func (struct data_in *); #define FMT(NAME, METHOD, IMIN, OMIN, IO, CATEGORY) \ static data_in_parser_func parse_##METHOD; #include "format.def" static void default_result (struct data_in *); static bool trim_spaces_and_check_missing (struct data_in *); static int hexit_value (int c); /* Parses the characters in INPUT, which are encoded in the given INPUT_ENCODING, according to FORMAT. Stores the parsed representation in OUTPUT, which the caller must have initialized with the given WIDTH (0 for a numeric field, otherwise the string width). If FORMAT is FMT_A, then OUTPUT_ENCODING must specify the correct encoding for OUTPUT (normally obtained via dict_get_encoding()). If successful NULL is the return value. Otherwise a string describing the problem is returned. The caller must free this string. */ char * data_in (struct substring input, const char *input_encoding, enum fmt_type format, union value *output, int width, const char *output_encoding) { static data_in_parser_func *const handlers[FMT_NUMBER_OF_FORMATS] = { #define FMT(NAME, METHOD, IMIN, OMIN, IO, CATEGORY) parse_##METHOD, #include "format.def" }; struct data_in i; enum fmt_category cat; const char *dest_encoding; char *s; char *error; assert ((width != 0) == fmt_is_string (format)); i.format = format; i.output = output; i.width = width; if (ss_is_empty (input)) { default_result (&i); return NULL; } cat = fmt_get_category (format); if (cat & (FMT_CAT_BASIC | FMT_CAT_HEXADECIMAL | FMT_CAT_CUSTOM | FMT_CAT_DATE | FMT_CAT_TIME | FMT_CAT_DATE_COMPONENT)) { /* We're going to parse these into numbers. For this purpose we want to deal with them in the local "C" encoding. Any character not in that encoding wouldn't be valid anyhow. */ dest_encoding = C_ENCODING; } else if (cat & (FMT_CAT_BINARY | FMT_CAT_LEGACY)) { /* Don't recode these binary formats at all, since they are not text. */ dest_encoding = NULL; } else { assert (cat == FMT_CAT_STRING); if (format == FMT_AHEX) { /* We want the hex digits in the local "C" encoding, even though the result may not be in that encoding. */ dest_encoding = C_ENCODING; } else { /* Use the final output encoding. */ dest_encoding = output_encoding; } } if (dest_encoding != NULL) { i.input = recode_substring_pool (dest_encoding, input_encoding, input, NULL); s = i.input.string; } else { i.input = input; s = NULL; } error = handlers[i.format] (&i); if (error != NULL) default_result (&i); free (s); return error; } bool data_in_msg (struct substring input, const char *input_encoding, enum fmt_type format, union value *output, int width, const char *output_encoding) { char *error = data_in (input, input_encoding, format, output, width, output_encoding); if (error != NULL) { msg (SW, _("Data is not valid as format %s: %s"), fmt_name (format), error); free (error); return false; } else return true; } static bool number_has_implied_decimals (const char *s, enum fmt_type type) { int decimal = settings_get_style (type)->decimal; bool got_digit = false; for (;;) { switch (*s) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': got_digit = true; break; case '+': case '-': if (got_digit) return false; break; case 'e': case 'E': case 'd': case 'D': return false; case '.': case ',': if (*s == decimal) return false; break; case '\0': return true; default: break; } s++; } } static bool has_implied_decimals (struct substring input, const char *input_encoding, enum fmt_type format) { bool retval; char *s; switch (format) { case FMT_F: case FMT_COMMA: case FMT_DOT: case FMT_DOLLAR: case FMT_PCT: case FMT_E: case FMT_Z: break; case FMT_N: case FMT_IB: case FMT_PIB: case FMT_P: case FMT_PK: return true; default: return false; } s = recode_string (C_ENCODING, input_encoding, ss_data (input), ss_length (input)); retval = (format == FMT_Z ? strchr (s, '.') == NULL : number_has_implied_decimals (s, format)); free (s); return retval; } /* In some cases, when no decimal point is explicitly included in numeric input, its position is implied by the number of decimal places in the input format. In such a case, this function may be called just after data_in(). Its arguments are a subset of that function's arguments plus D, the number of decimal places associated with FORMAT. If it is appropriate, this function modifies the numeric value in OUTPUT. */ void data_in_imply_decimals (struct substring input, const char *input_encoding, enum fmt_type format, int d, union value *output) { if (d > 0 && output->f != SYSMIS && has_implied_decimals (input, input_encoding, format)) output->f /= pow (10., d); } /* Format parsers. */ /* Parses F, COMMA, DOT, DOLLAR, PCT, and E input formats. */ static char * parse_number (struct data_in *i) { const struct fmt_number_style *style = settings_get_style (i->format); struct string tmp; int save_errno; char *tail; if (fmt_get_category (i->format) == FMT_CAT_CUSTOM) { style = settings_get_style (FMT_F); } /* Trim spaces and check for missing value representation. */ if (trim_spaces_and_check_missing (i)) return NULL; ds_init_empty (&tmp); ds_extend (&tmp, 64); /* Prefix character may precede sign. */ if (style->prefix.s[0] != '\0') { ss_match_byte (&i->input, style->prefix.s[0]); ss_ltrim (&i->input, ss_cstr (CC_SPACES)); } /* Sign. */ if (ss_match_byte (&i->input, '-')) { ds_put_byte (&tmp, '-'); ss_ltrim (&i->input, ss_cstr (CC_SPACES)); } else { ss_match_byte (&i->input, '+'); ss_ltrim (&i->input, ss_cstr (CC_SPACES)); } /* Prefix character may follow sign. */ if (style->prefix.s[0] != '\0') { ss_match_byte (&i->input, style->prefix.s[0]); ss_ltrim (&i->input, ss_cstr (CC_SPACES)); } /* Digits before decimal point. */ while (c_isdigit (ss_first (i->input))) { ds_put_byte (&tmp, ss_get_byte (&i->input)); if (style->grouping != 0) ss_match_byte (&i->input, style->grouping); } /* Decimal point and following digits. */ if (ss_match_byte (&i->input, style->decimal)) { ds_put_byte (&tmp, '.'); while (c_isdigit (ss_first (i->input))) ds_put_byte (&tmp, ss_get_byte (&i->input)); } /* Exponent. */ if (!ds_is_empty (&tmp) && !ss_is_empty (i->input) && strchr ("eEdD-+", ss_first (i->input))) { ds_put_byte (&tmp, 'e'); if (strchr ("eEdD", ss_first (i->input))) { ss_advance (&i->input, 1); ss_match_byte (&i->input, ' '); } if (ss_first (i->input) == '-' || ss_first (i->input) == '+') { if (ss_get_byte (&i->input) == '-') ds_put_byte (&tmp, '-'); ss_match_byte (&i->input, ' '); } while (c_isdigit (ss_first (i->input))) ds_put_byte (&tmp, ss_get_byte (&i->input)); } /* Suffix character. */ if (style->suffix.s[0] != '\0') ss_match_byte (&i->input, style->suffix.s[0]); if (!ss_is_empty (i->input)) { char *error; if (ds_is_empty (&tmp)) error = xstrdup (_("Field contents are not numeric.")); else error = xstrdup (_("Number followed by garbage.")); ds_destroy (&tmp); return error; } /* Let c_strtod() do the conversion. */ save_errno = errno; errno = 0; i->output->f = c_strtod (ds_cstr (&tmp), &tail); if (*tail != '\0') { errno = save_errno; ds_destroy (&tmp); return xstrdup (_("Invalid numeric syntax.")); } else if (errno == ERANGE) { if (fabs (i->output->f) > 1) { i->output->f = SYSMIS; ds_destroy (&tmp); return xstrdup (_("Too-large number set to system-missing.")); } else { i->output->f = 0.0; ds_destroy (&tmp); return xstrdup (_("Too-small number set to zero.")); } } else errno = save_errno; ds_destroy (&tmp); return NULL; } /* Parses N format. */ static char * parse_N (struct data_in *i) { int c; i->output->f = 0; while ((c = ss_get_byte (&i->input)) != EOF) { if (!c_isdigit (c)) return xstrdup (_("All characters in field must be digits.")); i->output->f = i->output->f * 10.0 + (c - '0'); } return NULL; } /* Parses PIBHEX format. */ static char * parse_PIBHEX (struct data_in *i) { double n; int c; n = 0.0; while ((c = ss_get_byte (&i->input)) != EOF) { if (!c_isxdigit (c)) return xstrdup (_("Unrecognized character in field.")); n = n * 16.0 + hexit_value (c); } i->output->f = n; return NULL; } /* Parses RBHEX format. */ static char * parse_RBHEX (struct data_in *i) { double d; size_t j; memset (&d, 0, sizeof d); for (j = 0; !ss_is_empty (i->input) && j < sizeof d; j++) { int hi = ss_get_byte (&i->input); int lo = ss_get_byte (&i->input); if (lo == EOF) return xstrdup (_("Field must have even length.")); else if (!c_isxdigit (hi) || !c_isxdigit (lo)) return xstrdup (_("Field must contain only hex digits.")); ((unsigned char *) &d)[j] = 16 * hexit_value (hi) + hexit_value (lo); } i->output->f = d; return NULL; } /* Digits for Z format. */ static const char z_digits[] = "0123456789{ABCDEFGHI}JKLMNOPQR"; /* Returns true if C is a Z format digit, false otherwise. */ static bool is_z_digit (int c) { return c > 0 && strchr (z_digits, c) != NULL; } /* Returns the (absolute value of the) value of C as a Z format digit. */ static int z_digit_value (int c) { assert (is_z_digit (c)); return (strchr (z_digits, c) - z_digits) % 10; } /* Returns true if Z format digit C represents a negative value, false otherwise. */ static bool is_negative_z_digit (int c) { assert (is_z_digit (c)); return (strchr (z_digits, c) - z_digits) >= 20; } /* Parses Z format. */ static char * parse_Z (struct data_in *i) { struct string tmp; int save_errno; bool got_dot = false; bool got_final_digit = false; /* Trim spaces and check for missing value representation. */ if (trim_spaces_and_check_missing (i)) return NULL; ds_init_empty (&tmp); ds_extend (&tmp, 64); ds_put_byte (&tmp, '+'); while (!ss_is_empty (i->input)) { int c = ss_get_byte (&i->input); if (c_isdigit (c) && !got_final_digit) ds_put_byte (&tmp, c); else if (is_z_digit (c) && !got_final_digit) { ds_put_byte (&tmp, z_digit_value (c) + '0'); if (is_negative_z_digit (c)) ds_data (&tmp)[0] = '-'; got_final_digit = true; } else if (c == '.' && !got_dot) { ds_put_byte (&tmp, '.'); got_dot = true; } else { ds_destroy (&tmp); return xstrdup (_("Invalid zoned decimal syntax.")); } } if (!ss_is_empty (i->input)) { char *error; if (ds_length (&tmp) == 1) error = xstrdup (_("Field contents are not numeric.")); else error = xstrdup (_("Number followed by garbage.")); ds_destroy (&tmp); return error; } /* Let c_strtod() do the conversion. */ save_errno = errno; errno = 0; i->output->f = c_strtod (ds_cstr (&tmp), NULL); if (errno == ERANGE) { if (fabs (i->output->f) > 1) { i->output->f = SYSMIS; ds_destroy (&tmp); return xstrdup (_("Too-large number set to system-missing.")); } else { i->output->f = 0.0; ds_destroy (&tmp); return xstrdup (_("Too-small number set to zero.")); } } else errno = save_errno; ds_destroy (&tmp); return NULL; } /* Parses IB format. */ static char * parse_IB (struct data_in *i) { size_t bytes; uint64_t value; uint64_t sign_bit; bytes = MIN (8, ss_length (i->input)); value = integer_get (settings_get_input_integer_format (), ss_data (i->input), bytes); sign_bit = UINT64_C(1) << (8 * bytes - 1); if (!(value & sign_bit)) i->output->f = value; else { /* Sign-extend to full 64 bits. */ value -= sign_bit << 1; i->output->f = -(double) -value; } return NULL; } /* Parses PIB format. */ static char * parse_PIB (struct data_in *i) { i->output->f = integer_get (settings_get_input_integer_format (), ss_data (i->input), MIN (8, ss_length (i->input))); return NULL; } /* Consumes the first character of S. Stores its high 4 bits in HIGH_NIBBLE and its low 4 bits in LOW_NIBBLE. */ static void get_nibbles (struct substring *s, int *high_nibble, int *low_nibble) { int c = ss_get_byte (s); assert (c != EOF); *high_nibble = (c >> 4) & 15; *low_nibble = c & 15; } /* Parses P format. */ static char * parse_P (struct data_in *i) { int high_nibble, low_nibble; i->output->f = 0.0; while (ss_length (i->input) > 1) { get_nibbles (&i->input, &high_nibble, &low_nibble); if (high_nibble > 9 || low_nibble > 9) return xstrdup (_("Invalid syntax for P field.")); i->output->f = (100 * i->output->f) + (10 * high_nibble) + low_nibble; } get_nibbles (&i->input, &high_nibble, &low_nibble); if (high_nibble > 9) return xstrdup (_("Invalid syntax for P field.")); i->output->f = (10 * i->output->f) + high_nibble; if (low_nibble < 10) i->output->f = (10 * i->output->f) + low_nibble; else if (low_nibble == 0xb || low_nibble == 0xd) i->output->f = -i->output->f; return NULL; } /* Parses PK format. */ static char * parse_PK (struct data_in *i) { i->output->f = 0.0; while (!ss_is_empty (i->input)) { int high_nibble, low_nibble; get_nibbles (&i->input, &high_nibble, &low_nibble); if (high_nibble > 9 || low_nibble > 9) { i->output->f = SYSMIS; return NULL; } i->output->f = (100 * i->output->f) + (10 * high_nibble) + low_nibble; } return NULL; } /* Parses RB format. */ static char * parse_RB (struct data_in *i) { enum float_format ff = settings_get_input_float_format (); size_t size = float_get_size (ff); if (ss_length (i->input) >= size) float_convert (ff, ss_data (i->input), FLOAT_NATIVE_DOUBLE, &i->output->f); else i->output->f = SYSMIS; return NULL; } /* Parses A format. */ static char * parse_A (struct data_in *i) { /* This is equivalent to buf_copy_rpad, except that we posibly do a character set recoding in the middle. */ uint8_t *dst = i->output->s; size_t dst_size = i->width; const char *src = ss_data (i->input); size_t src_size = ss_length (i->input); memcpy (dst, src, MIN (src_size, dst_size)); if (dst_size > src_size) memset (&dst[src_size], ' ', dst_size - src_size); return NULL; } /* Parses AHEX format. */ static char * parse_AHEX (struct data_in *i) { uint8_t *s = i->output->s; size_t j; for (j = 0; ; j++) { int hi = ss_get_byte (&i->input); int lo = ss_get_byte (&i->input); if (hi == EOF) break; else if (lo == EOF) return xstrdup (_("Field must have even length.")); if (!c_isxdigit (hi) || !c_isxdigit (lo)) return xstrdup (_("Field must contain only hex digits.")); if (j < i->width) s[j] = hexit_value (hi) * 16 + hexit_value (lo); } memset (&s[j], ' ', i->width - j); return NULL; } /* Date & time format components. */ /* Sign of a time value. */ enum time_sign { SIGN_NO_TIME, /* No time yet encountered. */ SIGN_POSITIVE, /* Positive time. */ SIGN_NEGATIVE /* Negative time. */ }; /* Parses a signed decimal integer from at most the first MAX_DIGITS characters in I, storing the result into *RESULT. Returns true if successful, false if no integer was present. */ static char * WARN_UNUSED_RESULT parse_int (struct data_in *i, long *result, size_t max_digits) { struct substring head = ss_head (i->input, max_digits); size_t n = ss_get_long (&head, result); if (n) { ss_advance (&i->input, n); return NULL; } else return xstrdup (_("Syntax error in date field.")); } /* Parses a date integer between 1 and 31 from I, storing it into *DAY. Returns true if successful, false if no date was present. */ static char * parse_day (struct data_in *i, long *day) { char *error = parse_int (i, day, SIZE_MAX); if (error != NULL) return error; if (*day >= 1 && *day <= 31) return NULL; return xasprintf (_("Day (%ld) must be between 1 and 31."), *day); } /* If *TIME_SIGN is SIGN_NO_TIME, allows a sign to precede the time and sets *TIME_SIGN. Otherwise, does not allow a sign. */ static void parse_time_sign (struct data_in *i, enum time_sign *time_sign) { if (*time_sign == SIGN_NO_TIME) { if (ss_match_byte (&i->input, '-')) *time_sign = SIGN_NEGATIVE; else { ss_match_byte (&i->input, '+'); *time_sign = SIGN_POSITIVE; } } } /* Parses an integer from the beginning of I. Adds SECONDS_PER_UNIT times the absolute value of the integer to *TIME. Returns true if successful, false if no integer was present. */ static char * parse_time_units (struct data_in *i, double seconds_per_unit, double *time) { char *error; long units; error = parse_int (i, &units, SIZE_MAX); if (error != NULL) return error; if (units < 0) return xstrdup (_("Syntax error in date field.")); *time += units * seconds_per_unit; return NULL; } /* Parses a data delimiter from the beginning of I. Returns true if successful, false if no delimiter was present. */ static char * parse_date_delimiter (struct data_in *i) { if (ss_ltrim (&i->input, ss_cstr ("-/.," CC_SPACES))) return NULL; return xstrdup (_("Delimiter expected between fields in date.")); } /* Parses spaces at the beginning of I. */ static void parse_spaces (struct data_in *i) { ss_ltrim (&i->input, ss_cstr (CC_SPACES)); } static struct substring parse_name_token (struct data_in *i) { struct substring token; ss_get_bytes (&i->input, ss_span (i->input, ss_cstr (CC_LETTERS)), &token); return token; } /* Reads a name from I and sets *OUTPUT to the value associated with that name. If ALLOW_SUFFIXES is true, then names that begin with one of the names are accepted; otherwise, only exact matches (except for case) are allowed. Returns true if successful, false otherwise. */ static bool match_name (struct substring token, const char *const *names, long *output) { int i; for (i = 1; *names != NULL; i++) if (ss_equals_case (ss_cstr (*names++), token)) { *output = i; return true; } return false; } /* Parses a month name or number from the beginning of I, storing the month (in range 1...12) into *MONTH. Returns true if successful, false if no month was present. */ static char * parse_month (struct data_in *i, long *month) { if (c_isdigit (ss_first (i->input))) { char *error = parse_int (i, month, SIZE_MAX); if (error != NULL) return error; if (*month >= 1 && *month <= 12) return NULL; } else { static const char *const english_names[] = { "jan", "feb", "mar", "apr", "may", "jun", "jul", "aug", "sep", "oct", "nov", "dec", NULL, }; static const char *const roman_names[] = { "i", "ii", "iii", "iv", "v", "vi", "vii", "viii", "ix", "x", "xi", "xii", NULL, }; struct substring token = parse_name_token (i); if (match_name (ss_head (token, 3), english_names, month) || match_name (ss_head (token, 4), roman_names, month)) return NULL; } return xstrdup (_("Unrecognized month format. Months may be specified " "as Arabic or Roman numerals or as at least 3 letters " "of their English names.")); } /* Parses a year of at most MAX_DIGITS from the beginning of I, storing a "4-digit" year into *YEAR. */ static char * parse_year (struct data_in *i, long *year, size_t max_digits) { char *error = parse_int (i, year, max_digits); if (error != NULL) return error; if (*year >= 0 && *year <= 99) { int epoch = settings_get_epoch (); int epoch_century = ROUND_DOWN (epoch, 100); int epoch_offset = epoch - epoch_century; if (*year >= epoch_offset) *year += epoch_century; else *year += epoch_century + 100; } if (*year >= 1582 && *year <= 19999) return NULL; return xasprintf (_("Year (%ld) must be between 1582 and 19999."), *year); } /* Returns true if input in I has been exhausted, false otherwise. */ static char * parse_trailer (struct data_in *i) { if (ss_is_empty (i->input)) return NULL; return xasprintf (_("Trailing garbage `%.*s' following date."), (int) ss_length (i->input), ss_data (i->input)); } /* Parses a 3-digit Julian day-of-year value from I into *YDAY. Returns true if successful, false on failure. */ static char * parse_yday (struct data_in *i, long *yday) { struct substring num_s; long num; ss_get_bytes (&i->input, 3, &num_s); if (ss_span (num_s, ss_cstr (CC_DIGITS)) != 3) return xstrdup (_("Julian day must have exactly three digits.")); else if (!ss_get_long (&num_s, &num) || num < 1 || num > 366) return xasprintf (_("Julian day (%ld) must be between 1 and 366."), num); *yday = num; return NULL; } /* Parses a quarter-of-year integer between 1 and 4 from I. Stores the corresponding month into *MONTH. Returns true if successful, false if no quarter was present. */ static char * parse_quarter (struct data_in *i, long int *month) { long quarter; char *error; error = parse_int (i, &quarter, SIZE_MAX); if (error != NULL) return error; if (quarter >= 1 && quarter <= 4) { *month = (quarter - 1) * 3 + 1; return NULL; } return xasprintf (_("Quarter (%ld) must be between 1 and 4."), quarter); } /* Parses a week-of-year integer between 1 and 53 from I, Stores the corresponding year-of-day into *YDAY. Returns true if successful, false if no week was present. */ static char * parse_week (struct data_in *i, long int *yday) { char *error; long week; error = parse_int (i, &week, SIZE_MAX); if (error != NULL) return error; if (week >= 1 && week <= 53) { *yday = (week - 1) * 7 + 1; return NULL; } return xasprintf (_("Week (%ld) must be between 1 and 53."), week); } /* Parses a time delimiter from the beginning of I. Returns true if successful, false if no delimiter was present. */ static char * parse_time_delimiter (struct data_in *i) { if (ss_ltrim (&i->input, ss_cstr (":" CC_SPACES)) > 0) return NULL; return xstrdup (_("Delimiter expected between fields in time.")); } /* Parses minutes and optional seconds from the beginning of I. The time is converted into seconds, which are added to *TIME. Returns true if successful, false if an error was found. */ static char * parse_minute_second (struct data_in *i, double *time) { long minute; char buf[64]; char *error; char *cp; /* Parse minutes. */ error = parse_int (i, &minute, SIZE_MAX); if (error != NULL) return error; if (i->format != FMT_MTIME && (minute < 0 || minute > 59)) return xasprintf (_("Minute (%ld) must be between 0 and 59."), minute); *time += 60. * minute; /* Check for seconds. */ if (ss_ltrim (&i->input, ss_cstr (":" CC_SPACES)) == 0 || !c_isdigit (ss_first (i->input))) return NULL; /* Parse seconds. */ cp = buf; while (c_isdigit (ss_first (i->input))) *cp++ = ss_get_byte (&i->input); if (ss_match_byte (&i->input, settings_get_decimal_char (FMT_F))) *cp++ = '.'; while (c_isdigit (ss_first (i->input))) *cp++ = ss_get_byte (&i->input); *cp = '\0'; *time += c_strtod (buf, NULL); return NULL; } /* Parses a weekday name from the beginning of I, storing a value of 1=Sunday...7=Saturday into *WEEKDAY. Returns true if successful, false if an error was found. */ static char * parse_weekday (struct data_in *i, long *weekday) { static const char *const weekday_names[] = { "su", "mo", "tu", "we", "th", "fr", "sa", NULL, }; struct substring token = parse_name_token (i); bool ok = match_name (ss_head (token, 2), weekday_names, weekday); if (!ok) return xstrdup (_("Unrecognized weekday name. At least the first two " "letters of an English weekday name must be " "specified.")); return NULL; } /* Date & time formats. */ /* Parses WKDAY format. */ static char * parse_WKDAY (struct data_in *i) { long weekday = 0; char *error; if (trim_spaces_and_check_missing (i)) return NULL; error = parse_weekday (i, &weekday); if (error == NULL) error = parse_trailer (i); i->output->f = weekday; return error; } /* Parses MONTH format. */ static char * parse_MONTH (struct data_in *i) { long month; char *error; if (trim_spaces_and_check_missing (i)) return NULL; error = parse_month (i, &month); if (error == NULL) error = parse_trailer (i); i->output->f = month; return error; } /* Parses DATE, ADATE, EDATE, JDATE, SDATE, QYR, MOYR, KWYR, DATETIME, YMDHMS, MTIME, TIME, and DTIME formats. */ static char * parse_date (struct data_in *i) { long int year = INT_MIN; long int month = 1; long int day = 1; long int yday = 1; double time = 0, date = 0; enum time_sign time_sign = SIGN_NO_TIME; const char *template = fmt_date_template (i->format, 0); size_t template_width = strlen (template); char *error; if (trim_spaces_and_check_missing (i)) return NULL; while (*template != '\0') { unsigned char ch = *template; int count = 1; while (template[count] == ch) count++; template += count; switch (ch) { case 'd': error = count < 3 ? parse_day (i, &day) : parse_yday (i, &yday); break; case 'm': error = parse_month (i, &month); break; case 'y': { size_t max_digits; if (!c_isalpha (*template)) max_digits = SIZE_MAX; else { if (ss_length (i->input) >= template_width + 2) max_digits = 4; else max_digits = 2; } error = parse_year (i, &year, max_digits); } break; case 'q': error = parse_quarter (i, &month); break; case 'w': error = parse_week (i, &yday); break; case 'D': parse_time_sign (i, &time_sign); error = parse_time_units (i, 60. * 60. * 24., &time); break; case 'H': parse_time_sign (i, &time_sign); error = parse_time_units (i, 60. * 60., &time); break; case 'M': if (i->format == FMT_MTIME) parse_time_sign (i, &time_sign); error = parse_minute_second (i, &time); break; case '-': case '/': case '.': error = parse_date_delimiter (i); break; case ':': error = parse_time_delimiter (i); break; case ' ': if (i->format != FMT_MOYR) { parse_spaces (i); error = NULL; } else error = parse_date_delimiter (i); break; default: assert (count == 1); if (!ss_match_byte (&i->input, c_toupper (ch)) && !ss_match_byte (&i->input, c_tolower (ch))) error = xasprintf (_("`%c' expected in date field."), ch); else error = NULL; break; } if (error != NULL) return error; } error = parse_trailer (i); if (error != NULL) return error; if (year != INT_MIN) { char *error; double ofs; ofs = calendar_gregorian_to_offset (year, month, day, &error); if (ofs == SYSMIS) return error; date = (yday - 1 + ofs) * 60. * 60. * 24.; } else date = 0.; i->output->f = date + (time_sign == SIGN_NEGATIVE ? -time : time); return NULL; } /* Utility functions. */ /* Sets the default result for I. For a numeric format, this is the value set on SET BLANKS (typically system-missing); for a string format, it is all spaces. */ static void default_result (struct data_in *i) { if (fmt_is_string (i->format)) memset (i->output->s, ' ', i->width); else i->output->f = settings_get_blanks (); } /* Trims leading and trailing spaces from I. If the result is empty, or a single period character, then sets the default result and returns true; otherwise, returns false. */ static bool trim_spaces_and_check_missing (struct data_in *i) { ss_trim (&i->input, ss_cstr (" ")); if (ss_is_empty (i->input) || ss_equals (i->input, ss_cstr ("."))) { default_result (i); return true; } return false; } /* Returns the integer value of hex digit C. */ static int hexit_value (int c) { const char s[] = "0123456789abcdef"; const char *cp = strchr (s, c_tolower ((unsigned char) c)); assert (cp != NULL); return cp - s; } pspp-1.4.1/src/data/value-labels.h0000644000175000017500000001074013507505260016345 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 1997-9, 2000, 2009, 2011, 2012 Free Software Foundation, Inc. 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 3 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, see . */ /* Sets of value labels. struct val_labs represents a mapping from `union value's to strings. The `union value's in the mapping all have the same width. If this width is numeric or short string, the mapping may contain any number of entries; long string mappings are always empty. */ #ifndef DATA_VALUE_LABELS_H #define DATA_VALUE_LABELS_H 1 #include #include #include "data/value.h" #include "libpspp/hmap.h" /* One value label. A value label is normally part of a struct val_labs (see below). */ struct val_lab { struct hmap_node node; /* Node in hash map. */ union value value; /* The value being labeled. */ const char *label; /* An interned string. */ const char *escaped_label; /* An interned string. */ }; /* Returns the value in VL. The caller must not modify or free the returned value. The width of the returned value cannot be determined directly from VL. It may be obtained by calling val_labs_get_width on the val_labs struct that VL is in. */ static inline const union value *val_lab_get_value (const struct val_lab *vl) { return &vl->value; } /* Returns the label in VL as a UTF-8 encoded interned string, in a format appropriate for use in output. The caller must not modify or free the returned value. */ static inline const char * val_lab_get_label (const struct val_lab *vl) { return vl->label; } /* Returns the label in VL as a UTF-8 encoded interned string. Any new-line characters in the label's usual output form are represented in the returned string as the two-byte sequence "\\n". This form is used on the VALUE LABELS command, in system and portable files, and passed to val_labs_add() and val_labs_replace(). The caller must not modify or free the returned value. */ static inline const char * val_lab_get_escaped_label (const struct val_lab *vl) { return vl->escaped_label; } /* A set of value labels. */ struct val_labs { int width; /* 0=numeric, otherwise string width. */ struct hmap labels; /* Hash table of `struct val_lab's. */ }; /* Creating and destroying sets of value labels. */ struct val_labs *val_labs_create (int width); struct val_labs *val_labs_clone (const struct val_labs *); void val_labs_clear (struct val_labs *); void val_labs_destroy (struct val_labs *); size_t val_labs_count (const struct val_labs *); /* Looking up value labels. */ const char *val_labs_find (const struct val_labs *, const union value *); struct val_lab *val_labs_lookup (const struct val_labs *, const union value *); const union value *val_labs_find_value (const struct val_labs *, const char *label); /* Basic properties. */ size_t val_labs_count (const struct val_labs *); int val_labs_get_width (const struct val_labs *); bool val_labs_can_set_width (const struct val_labs *, int new_width); void val_labs_set_width (struct val_labs *, int new_width); /* Adding value labels. */ bool val_labs_add (struct val_labs *, const union value *, const char *); void val_labs_replace (struct val_labs *, const union value *, const char *); void val_labs_remove (struct val_labs *, struct val_lab *); /* Iterating through value labels. */ const struct val_lab *val_labs_first (const struct val_labs *); const struct val_lab *val_labs_next (const struct val_labs *, const struct val_lab *); const struct val_lab **val_labs_sorted (const struct val_labs *); /* Properties of entire sets. */ unsigned int val_labs_hash (const struct val_labs *, unsigned int basis) WARN_UNUSED_RESULT; bool val_labs_equal (const struct val_labs *, const struct val_labs *); #endif /* data/value-labels.h */ pspp-1.4.1/src/data/attributes.h0000644000175000017500000000530313407076063016161 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2008, 2011, 2012, 2016 Free Software Foundation, Inc. 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 3 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, see . */ #ifndef DATA_ATTRIBUTES_H #define DATA_ATTRIBUTES_H 1 #include "libpspp/hmapx.h" /* This header supports custom attribute of the sort maintained by the DATAFILE ATTRIBUTE and VARIABLE ATTRIBUTE commands. Attributes have a name (the rules for which are the same as those for PSPP variable names) and one or more values, each of which is a string. An attribute may be part of one attribute set. An attribute set is an unordered collection of attributes with names that are unique (case-insensitively). */ struct attribute *attribute_create (const char *name); struct attribute *attribute_clone (const struct attribute *); void attribute_destroy (struct attribute *); const char *attribute_get_name (const struct attribute *); const char *attribute_get_value (const struct attribute *, size_t index); void attribute_add_value (struct attribute *, const char *); void attribute_set_value (struct attribute *, size_t index, const char *); void attribute_del_value (struct attribute *, size_t index); size_t attribute_get_n_values (const struct attribute *); struct attrset { struct hmap map; }; void attrset_init (struct attrset *); void attrset_clone (struct attrset *, const struct attrset *); void attrset_destroy (struct attrset *); size_t attrset_count (const struct attrset *); struct attribute *attrset_lookup (const struct attrset *, const char *); bool attrset_try_add (struct attrset *, struct attribute *); void attrset_add (struct attrset *, struct attribute *); void attrset_delete (struct attrset *, const char *); void attrset_clear (struct attrset *); struct attrset_iterator { struct hmap_node *node; }; struct attribute *attrset_first (const struct attrset *, struct attrset_iterator *); struct attribute *attrset_next (const struct attrset *, struct attrset_iterator *); struct attribute **attrset_sorted (const struct attrset *); #endif /* data/attributes.h */ pspp-1.4.1/src/data/mrset.c0000644000175000017500000000754013320146056015117 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2010, 2011 Free Software Foundation, Inc. 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 3 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, see . */ #include #include "data/mrset.h" #include #include "data/dictionary.h" #include "data/identifier.h" #include "data/val-type.h" #include "data/variable.h" #include "libpspp/message.h" #include "gl/xalloc.h" #include "gettext.h" #define _(msgid) gettext (msgid) /* Creates and returns a clone of OLD. The caller is responsible for freeing the new multiple response set (using mrset_destroy()). */ struct mrset * mrset_clone (const struct mrset *old) { struct mrset *new; new = xmalloc (sizeof *new); new->name = xstrdup (old->name); new->label = old->label != NULL ? xstrdup (old->label) : NULL; new->type = old->type; new->vars = xmemdup (old->vars, old->n_vars * sizeof *old->vars); new->n_vars = old->n_vars; new->cat_source = old->cat_source; new->label_from_var_label = old->label_from_var_label; value_clone (&new->counted, &old->counted, old->width); new->width = old->width; return new; } /* Frees MRSET and the data that it contains. */ void mrset_destroy (struct mrset *mrset) { if (mrset != NULL) { free (mrset->name); free (mrset->label); free (mrset->vars); value_destroy (&mrset->counted, mrset->width); free (mrset); } } /* Returns true if the UTF-8 encoded NAME is a valid name for a multiple response set in a dictionary encoded in DICT_ENCODING, false otherwise. If ISSUE_ERROR is true, issues an explanatory error message on failure. */ bool mrset_is_valid_name (const char *name, const char *dict_encoding, bool issue_error) { if (!id_is_valid (name, dict_encoding, issue_error)) return false; if (name[0] != '$') { if (issue_error) msg (SE, _("%s is not a valid name for a multiple response " "set. Multiple response set names must begin with " "`$'."), name); return false; } return true; } /* Checks various constraints on MRSET: - MRSET's name begins with '$' and is valid as an identifier in DICT. - MRSET has a valid type. - MRSET has at least 2 variables. - All of MRSET's variables are in DICT. - All of MRSET's variables are the same type (numeric or string). - If MRSET is a multiple dichotomy set, its counted value has the same type as and is no wider than its narrowest variable. Returns true if all the constraints are satisfied, otherwise false. */ bool mrset_ok (const struct mrset *mrset, const struct dictionary *dict) { enum val_type type; size_t i; if (mrset->name == NULL || !mrset_is_valid_name (mrset->name, dict_get_encoding (dict), false) || (mrset->type != MRSET_MD && mrset->type != MRSET_MC) || mrset->vars == NULL || mrset->n_vars < 2) return false; type = var_get_type (mrset->vars[0]); if (mrset->type == MRSET_MD && type != val_type_from_width (mrset->width)) return false; for (i = 0; i < mrset->n_vars; i++) if (!dict_contains_var (dict, mrset->vars[i]) || type != var_get_type (mrset->vars[i]) || (mrset->type == MRSET_MD && mrset->width > var_get_width (mrset->vars[i]))) return false; return true; } pspp-1.4.1/src/data/casereader-shim.h0000644000175000017500000000461613320146056017027 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2007, 2009, 2010 Free Software Foundation, Inc. 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 3 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, see . */ #ifndef DATA_CASEREADER_SHIM_H #define DATA_CASEREADER_SHIM_H 1 /* Buffering shim for implementing clone and peek operations. The "clone" and "peek" operations aren't implemented by all types of casereaders, but we have to expose a uniform interface anyhow. The casereader buffering shim can do this by interposing a buffer on top of an existing casereader. The shim maintains a window of cases that spans the positions of the original casereader and all of its clones (the "clone set"), from the position of the casereader that has read the fewest cases to the position of the casereader that has read the most. Thus, if all of the casereaders in the clone set are at approximately the same position, only a few cases are buffered and there is little inefficiency. If, on the other hand, one casereader is not used to read any cases at all, but another one is used to read all of the cases, the entire contents of the casereader is copied into the buffer. This still might not be so inefficient, given that case data in memory is shared across multiple identical copies, but in the worst case the window implementation will write cases to disk instead of maintaining them in-memory. Casereader buffering shims are inserted automatically on the first call to casereader_clone() or casereader_peek() for a casereader that does not support those operations natively. Thus, there is ordinarily little reason to intentionally insert a shim. */ struct casereader; struct casereader_shim *casereader_shim_insert (struct casereader *); void casereader_shim_slurp (struct casereader_shim *); #endif /* data/casereader-shim.h */ pspp-1.4.1/src/data/spreadsheet-reader.c0000644000175000017500000001107013670210420017520 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2007, 2009, 2010, 2011, 2013 Free Software Foundation, Inc. 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 3 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, see . */ #include #include "spreadsheet-reader.h" #include #include "gnumeric-reader.h" #include "ods-reader.h" #include #include #include #include #include #include void spreadsheet_ref (struct spreadsheet *s) { s->ref_cnt++; } void spreadsheet_unref (struct spreadsheet *s) { switch (s->type) { case SPREADSHEET_ODS: ods_unref (s); break; case SPREADSHEET_GNUMERIC: gnumeric_unref (s); break; default: NOT_REACHED (); break; } } struct casereader * spreadsheet_make_reader (struct spreadsheet *s, const struct spreadsheet_read_options *opts) { if (s->type == SPREADSHEET_ODS) return ods_make_reader (s, opts); if (s->type == SPREADSHEET_GNUMERIC) return gnumeric_make_reader (s, opts); return NULL; } const char * spreadsheet_get_sheet_name (struct spreadsheet *s, int n) { if (s->type == SPREADSHEET_ODS) return ods_get_sheet_name (s, n); if (s->type == SPREADSHEET_GNUMERIC) return gnumeric_get_sheet_name (s, n); return NULL; } char * spreadsheet_get_sheet_range (struct spreadsheet *s, int n) { if (s->type == SPREADSHEET_ODS) return ods_get_sheet_range (s, n); if (s->type == SPREADSHEET_GNUMERIC) return gnumeric_get_sheet_range (s, n); return NULL; } #define RADIX 26 static void reverse (char *s, int len) { int i; for (i = 0; i < len / 2; ++i) { char tmp = s[len - i - 1]; s[len - i -1] = s[i]; s[i] = tmp; } } /* Convert a string, which is an integer encoded in base26 IE, A=0, B=1, ... Z=25 to the integer it represents. ... except that in this scheme, digits with an exponent greater than 1 are implicitly incremented by 1, so AA = 0 + 1*26, AB = 1 + 1*26, ABC = 2 + 2*26 + 1*26^2 .... */ int ps26_to_int (const char *str) { int i; int multiplier = 1; int result = 0; int len = strlen (str); for (i = len - 1 ; i >= 0; --i) { int mantissa = (str[i] - 'A'); assert (mantissa >= 0); assert (mantissa < RADIX); if (i != len - 1) mantissa++; result += mantissa * multiplier; multiplier *= RADIX; } return result; } char * int_to_ps26 (int i) { char *ret = NULL; int lower = 0; long long int base = RADIX; int exp = 1; assert (i >= 0); while (i > lower + base - 1) { lower += base; base *= RADIX; assert (base > 0); exp++; } i -= lower; i += base; ret = xmalloc (exp + 1); exp = 0; do { ret[exp++] = (i % RADIX) + 'A'; i /= RADIX; } while (i > 1); ret[exp]='\0'; reverse (ret, exp); return ret; } char * create_cell_ref (int col0, int row0) { char *cs0 ; char *s ; if (col0 < 0) return NULL; if (row0 < 0) return NULL; cs0 = int_to_ps26 (col0); s = c_xasprintf ("%s%d", cs0, row0 + 1); free (cs0); return s; } char * create_cell_range (int col0, int row0, int coli, int rowi) { char *s0 = create_cell_ref (col0, row0); char *si = create_cell_ref (coli, rowi); char *s = c_xasprintf ("%s:%s", s0, si); free (s0); free (si); return s; } /* Convert a cell reference in the form "A1:B2", to integers. A1 means column zero, row zero. B1 means column 1 row 0. AA1 means column 26, row 0. */ bool convert_cell_ref (const char *ref, int *col0, int *row0, int *coli, int *rowi) { char startcol[5]; char stopcol [5]; int startrow; int stoprow; int n = sscanf (ref, "%4[a-zA-Z]%d:%4[a-zA-Z]%d", startcol, &startrow, stopcol, &stoprow); if (n != 4) return false; str_uppercase (startcol); *col0 = ps26_to_int (startcol); str_uppercase (stopcol); *coli = ps26_to_int (stopcol); *row0 = startrow - 1; *rowi = stoprow - 1 ; return true; } pspp-1.4.1/src/data/psql-reader.h0000644000175000017500000000211313320146056016200 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2008, 2011 Free Software Foundation, Inc. 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 3 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, see . */ #ifndef PSQL_READER_H #define PSQL_READER_H 1 #include #include "libpspp/str.h" struct casereader; struct psql_read_info { char *conninfo ; struct string sql; bool allow_clear; int str_width; int bsize; }; struct dictionary; struct casereader * psql_open_reader (struct psql_read_info *, struct dictionary **); #endif pspp-1.4.1/src/data/identifier.c0000644000175000017500000002037613320146056016111 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 1997-9, 2000, 2005, 2009, 2010, 2011, 2012, 2013 Free Software Foundation, Inc. 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 3 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, see . */ /* This file is concerned with the definition of the PSPP syntax, NOT the action of scanning/parsing code . */ #include #include "data/identifier.h" #include #include #include #include "libpspp/assertion.h" #include "libpspp/cast.h" #include "gl/c-ctype.h" #include "gettext.h" #define _(msgid) gettext (msgid) /* Tokens. */ /* Returns TYPE as a string, e.g. "ID" for T_ID. */ const char * token_type_to_name (enum token_type type) { switch (type) { #define TOKEN_TYPE(TYPE) case T_##TYPE: return #TYPE; TOKEN_TYPES #undef TOKEN_TYPE case TOKEN_N_TYPES: default: return "unknown token type"; } } /* Returns an ASCII string that yields TOKEN if it appeared in a syntax file, as a statically allocated constant string. This function returns NULL for tokens that don't have any fixed string representation, such as identifier and number tokens. */ const char * token_type_to_string (enum token_type token) { switch (token) { case T_ID: case T_POS_NUM: case T_NEG_NUM: case T_STRING: case T_STOP: return NULL; case T_ENDCMD: return "."; case T_PLUS: return "+"; case T_DASH: return "-"; case T_ASTERISK: return "*"; case T_SLASH: return "/"; case T_EQUALS: return "="; case T_LPAREN: return "("; case T_RPAREN: return ")"; case T_LBRACK: return "["; case T_RBRACK: return "]"; case T_COMMA: return ","; case T_AND: return "AND"; case T_OR: return "OR"; case T_NOT: return "NOT"; case T_EQ: return "EQ"; case T_GE: return ">="; case T_GT: return ">"; case T_LE: return "<="; case T_LT: return "<"; case T_NE: return "~="; case T_ALL: return "ALL"; case T_BY: return "BY"; case T_TO: return "TO"; case T_WITH: return "WITH"; case T_EXP: return "**"; case TOKEN_N_TYPES: NOT_REACHED (); } NOT_REACHED (); } /* Recognizing identifiers. */ static bool is_ascii_id1 (unsigned char c) { return c_isalpha (c) || c == '@' || c == '#' || c == '$'; } static bool is_ascii_idn (unsigned char c) { return is_ascii_id1 (c) || isdigit (c) || c == '.' || c == '_'; } /* Returns true if C may be the first byte in an identifier in the current locale. (PSPP is transitioning to using Unicode internally for syntax, so please use lex_uc_is_id1() instead, if possible.) */ bool lex_is_id1 (char c) { return is_ascii_id1 (c) || (unsigned char) c >= 128; } /* Returns true if C may be a byte in an identifier other than the first. (PSPP is transitioning to using Unicode internally for syntax, so please use lex_uc_is_idn() instead, if possible.) */ bool lex_is_idn (char c) { return is_ascii_idn (c) || (unsigned char) c >= 128; } /* Returns true if Unicode code point UC may be the first character in an identifier in the current locale. */ bool lex_uc_is_id1 (ucs4_t uc) { return (uc < 0x80 ? is_ascii_id1 (uc) : (uc_is_general_category_withtable (uc, UC_CATEGORY_MASK_L | UC_CATEGORY_MASK_M | UC_CATEGORY_MASK_S) && uc != 0xfffc && uc != 0xfffd)); } /* Returns true if Unicode code point UC may be a character in an identifier other than the first. */ bool lex_uc_is_idn (ucs4_t uc) { return (uc < 0x80 ? is_ascii_id1 (uc) || isdigit (uc) || uc == '.' || uc == '_' : (uc_is_general_category_withtable (uc, UC_CATEGORY_MASK_L | UC_CATEGORY_MASK_M | UC_CATEGORY_MASK_S | UC_CATEGORY_MASK_N) && uc != 0xfffc && uc != 0xfffd)); } /* Returns true if Unicode code point UC is a space that separates tokens. */ bool lex_uc_is_space (ucs4_t uc) { /* These are all of the Unicode characters in category Zs, Zl, or Zp. */ return (uc == ' ' || (uc <= 0x000d && uc >= 0x0009) || (uc >= 0x80 && (uc == 0xa0 || uc == 0x85 || uc == 0x1680 || uc == 0x180e || (uc >= 0x2000 && uc <= 0x200a) || uc == 0x2028 || uc == 0x2029 || uc == 0x202f || uc == 0x205f || uc == 0x3000))); } /* Returns the length of the longest prefix of STRING that forms a valid identifier. Returns zero if STRING does not begin with a valid identifier. */ size_t lex_id_get_length (struct substring string) { const uint8_t *s = CHAR_CAST (const uint8_t *, string.string); size_t len = string.length; size_t ofs; int mblen; for (ofs = 0; ofs < string.length; ofs += mblen) { ucs4_t uc; mblen = u8_mbtouc (&uc, s + ofs, len - ofs); if (!(ofs == 0 ? lex_uc_is_id1 (uc) : lex_uc_is_idn (uc))) break; } return ofs; } /* Comparing identifiers. */ /* Returns true if TOKEN is a case-insensitive match for KEYWORD. Keywords match if one of the following is true: KEYWORD and TOKEN are identical, or TOKEN is at least 3 characters long and those characters are identical to KEYWORD. (Letters that differ only in case are considered identical.) KEYWORD must be ASCII, but TOKEN may be ASCII or UTF-8. */ bool lex_id_match (struct substring keyword, struct substring token) { return lex_id_match_n (keyword, token, 3); } /* Returns true if TOKEN is a case-insensitive match for at least the first N characters of KEYWORD. KEYWORD must be ASCII, but TOKEN may be ASCII or UTF-8. */ bool lex_id_match_n (struct substring keyword, struct substring token, size_t n) { size_t token_len = ss_length (token); size_t keyword_len = ss_length (keyword); if (token_len >= n && token_len < keyword_len) return ss_equals_case (ss_head (keyword, token_len), token); else return ss_equals_case (keyword, token); } /* Table of keywords. */ struct keyword { int token; const struct substring identifier; }; static const struct keyword keywords[] = { { T_AND, SS_LITERAL_INITIALIZER ("AND") }, { T_OR, SS_LITERAL_INITIALIZER ("OR") }, { T_NOT, SS_LITERAL_INITIALIZER ("NOT") }, { T_EQ, SS_LITERAL_INITIALIZER ("EQ") }, { T_GE, SS_LITERAL_INITIALIZER ("GE") }, { T_GT, SS_LITERAL_INITIALIZER ("GT") }, { T_LE, SS_LITERAL_INITIALIZER ("LE") }, { T_LT, SS_LITERAL_INITIALIZER ("LT") }, { T_NE, SS_LITERAL_INITIALIZER ("NE") }, { T_ALL, SS_LITERAL_INITIALIZER ("ALL") }, { T_BY, SS_LITERAL_INITIALIZER ("BY") }, { T_TO, SS_LITERAL_INITIALIZER ("TO") }, { T_WITH, SS_LITERAL_INITIALIZER ("WITH") }, }; static const size_t keyword_cnt = sizeof keywords / sizeof *keywords; /* Returns true if TOKEN is representable as a keyword. */ bool lex_is_keyword (enum token_type token) { const struct keyword *kw; for (kw = keywords; kw < &keywords[keyword_cnt]; kw++) if (kw->token == token) return true; return false; } /* Returns the proper token type, either T_ID or a reserved keyword enum, for ID. */ int lex_id_to_token (struct substring id) { if (ss_length (id) >= 2 && ss_length (id) <= 4) { const struct keyword *kw; for (kw = keywords; kw < &keywords[keyword_cnt]; kw++) if (ss_equals_case (kw->identifier, id)) return kw->token; } return T_ID; } pspp-1.4.1/src/data/caseproto.h0000644000175000017500000001736513717773141016012 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2009, 2011 Free Software Foundation, Inc. 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 3 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, see . */ #ifndef DATA_CASEPROTO_H #define DATA_CASEPROTO_H 1 #include #include #include #include #include "data/value.h" #include "libpspp/cast.h" #include "libpspp/compiler.h" /* Case prototype. A case prototype specifies the number and type of the values in a case. It is essentially an array of integers, where the array index is an index into a case and each element represents the width of a value in a case. Valid widths are: * 0, indicating a numeric value. * A positive integer between 1 and 32767, indicating the size in bytes of a string value. * -1, indicating that the value at this index in the case is not used at all. (This is rarely useful.) Case prototypes are reference counted. A newly created case prototype has a single owner (the code that created it), represented by an initial reference count of 1. Other code that receives the case prototype may keep a virtual copy of it by calling caseproto_ref, which increments the case prototype's reference count. When this is done, the case prototype becomes shared between its original owner and each piece of code that incremented the reference count. Functions that modifying case prototypes automatically unshare them as necessary. All of these functions potentially move the caseproto around in memory even when the case prototype is not shared. Thus it is very important that every caller of a function that modifies a case prototype thereafter uses the returned caseproto instead of the one passed in as an argument. Only the case prototype code should refer to caseproto members directly. Other code should use the provided helper functions. */ struct caseproto { size_t ref_cnt; /* Reference count. */ /* Tracking of string widths. Lazily maintained: when 'strings' is null and 'n_strings' is nonzero, the former must be regenerated. */ size_t *strings; /* Array of indexes of string widths. */ size_t n_strings; /* Number of string widths. */ /* Widths. */ size_t n_widths; /* Number of widths. */ size_t allocated_widths; /* Space allocated for 'widths' array. */ short int widths[1]; /* Width of each case value. */ }; struct pool; /* Creation and destruction. */ struct caseproto *caseproto_create (void) MALLOC_LIKE; static inline struct caseproto *caseproto_ref (const struct caseproto *) WARN_UNUSED_RESULT; struct caseproto *caseproto_ref_pool (const struct caseproto *, struct pool *) WARN_UNUSED_RESULT; static inline void caseproto_unref (struct caseproto *); /* Inspecting stored widths. */ static inline int caseproto_get_width (const struct caseproto *, size_t idx); static inline size_t caseproto_get_n_widths (const struct caseproto *); /* Adding and removing widths. */ struct caseproto *caseproto_reserve (struct caseproto *, size_t n_widths) WARN_UNUSED_RESULT; struct caseproto *caseproto_add_width (struct caseproto *, int width) WARN_UNUSED_RESULT; struct caseproto *caseproto_set_width (struct caseproto *, size_t idx, int width) WARN_UNUSED_RESULT; struct caseproto *caseproto_insert_width (struct caseproto *, size_t before, int width) WARN_UNUSED_RESULT; struct caseproto *caseproto_remove_widths (struct caseproto *, size_t idx, size_t cnt) WARN_UNUSED_RESULT; struct caseproto *caseproto_move_widths (struct caseproto *, size_t old_start, size_t new_start, size_t cnt) WARN_UNUSED_RESULT; /* Working with "union value" arrays. */ bool caseproto_needs_init_values (const struct caseproto *); void caseproto_init_values (const struct caseproto *, union value[]); bool caseproto_try_init_values (const struct caseproto *, union value[]); void caseproto_reinit_values (const struct caseproto *old, const struct caseproto *new, union value[]); void caseproto_destroy_values (const struct caseproto *, union value[]); void caseproto_copy (const struct caseproto *, size_t idx, size_t count, union value *dst, const union value *src); /* Inspecting the cache of string widths. (These functions are useful for allocating cases, which requires allocating a block of memory for each string value in the case.) */ static inline size_t caseproto_get_n_strings (const struct caseproto *); static inline size_t caseproto_get_string_idx (const struct caseproto *, size_t idx1); /* For use in assertions. */ bool caseproto_range_is_valid (const struct caseproto *, size_t ofs, size_t count); bool caseproto_is_conformable (const struct caseproto *a, const struct caseproto *b); bool caseproto_equal (const struct caseproto *a, size_t a_start, const struct caseproto *b, size_t b_start, size_t n); /* Creation and destruction. */ void caseproto_free__ (struct caseproto *); /* Increments case prototype PROTO's reference count and returns PROTO. Afterward, PROTO is shared among its reference count holders. */ static inline struct caseproto * caseproto_ref (const struct caseproto *proto_) { struct caseproto *proto = CONST_CAST (struct caseproto *, proto_); proto->ref_cnt++; return proto; } /* Decrements case prototype PROTO's reference count. Frees PROTO if its reference count drops to 0. If PROTO is a null pointer, this function has no effect. */ static inline void caseproto_unref (struct caseproto *proto) { if (proto != NULL && --proto->ref_cnt == 0) caseproto_free__ (proto); } /* Inspecting stored widths. */ /* Returns case prototype PROTO's width with the given IDX. IDX must be less than caseproto_get_n_widths(PROTO). */ static inline int caseproto_get_width (const struct caseproto *proto, size_t idx) { assert (idx < proto->n_widths); return proto->widths[idx]; } /* Returns the number of widths in case prototype PROTO. */ static inline size_t caseproto_get_n_widths (const struct caseproto *proto) { return proto->n_widths; } /* Inspecting the cache of long string widths. */ void caseproto_refresh_string_cache__ (const struct caseproto *); /* Returns the number of strings in PROTO. */ static inline size_t caseproto_get_n_strings (const struct caseproto *proto) { return proto->n_strings; } /* Given string width IDX1, returns a value IDX2 for which caseproto_get_width(PROTO, IDX2) will return a value greater than 0. IDX1 must be less than caseproto_get_n_strings(PROTO), and IDX2 will be less than caseproto_get_n_widths(PROTO). */ static inline size_t caseproto_get_string_idx (const struct caseproto *proto, size_t idx1) { if (proto->strings == NULL) caseproto_refresh_string_cache__ (proto); assert (idx1 < proto->n_strings); return proto->strings[idx1]; } #endif /* data/caseproto.h */ pspp-1.4.1/src/data/data-out.h0000644000175000017500000000304713376636715015527 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 1997-9, 2000, 2006, 2011, 2013 Free Software Foundation, Inc. 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 3 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, see . */ #ifndef DATA_OUT_H #define DATA_OUT_H 1 #include #include "libpspp/float-format.h" #include "libpspp/integer-format.h" struct fmt_spec; struct string; union value; char *data_out (const union value *input, const char *input_encoding, const struct fmt_spec *); char *data_out_pool (const union value *input, const char *input_encoding, const struct fmt_spec *, struct pool *pool); char *data_out_stretchy (const union value *input, const char *input_encoding, const struct fmt_spec *, struct pool *); void data_out_recode (const union value *input, const char *input_encoding, const struct fmt_spec *, struct string *output, const char *output_encoding); #endif /* data-out.h */ pspp-1.4.1/src/data/format-guesser.c0000644000175000017500000006347513670210420016734 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2008, 2010, 2011 Free Software Foundation, Inc. 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 3 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, see . */ #include #include "data/format-guesser.h" #include #include #include "data/format.h" #include "data/settings.h" #include "libpspp/assertion.h" #include "libpspp/str.h" #include "gl/c-ctype.h" #include "gl/minmax.h" #include "gl/xalloc.h" /* A token in which potential date or time fields are broken. The token type is actually a bit-map. This allows a single token to represent multiple roles, as often happens in parsing adate or a time. For example, the number "1" can be a quarter of the year, month, hour, day of the month, week of the year, or a count of days. Such ambiguities are resolved on the higher-level bases of multiple tokens and multiple full dates. */ enum date_token { DT_DAY = 1 << 0, /* dd: Day of the month. */ DT_MONTH = 1 << 1, /* mm: Month. */ DT_ENGLISH_MONTH = 1 << 2, /* mmm: Spelled-out month, e.g. "jan". */ DT_YEAR = 1 << 3, /* yy: Year. */ DT_HOUR = 1 << 4, /* HH: Hour. */ DT_MINUTE = 1 << 5, /* MM: Minute. */ DT_SECOND = 1 << 6, /* SS: Second. */ DT_WEEKDAY = 1 << 7, /* www: Day of the week. */ DT_DAY_COUNT = 1 << 8, /* D: Number of days. */ DT_WEEK = 1 << 9, /* ww: Week of the year. */ DT_QUARTER = 1 << 10, /* q: Quarter of the year. */ DT_Q = 1 << 11, /* Literal "Q". */ DT_WK = 1 << 12, /* Literal "WK". */ DT_DELIM = 1 << 13, /* One of -/., or white space. */ DT_SPACE = 1 << 14, /* Any white space. */ DT_COLON = 1 << 15, /* : */ }; /* Syntax of a date format, in terms of the date tokens that compose it.*/ struct date_syntax { enum fmt_type format; /* Format type. */ #define MAX_TOKENS 11 size_t token_cnt; /* Number of tokens. */ enum date_token tokens[MAX_TOKENS]; /* Tokens. */ }; /* Syntax of all the data formats that we can parse. The order in the array can make a difference in the final choice of formats: in the case of a tie between the number of times each format is seen, the syntax earlier in the array takes precedence. The most important cases are the ordering of DATE before EDATE, so that spelled-out months in input yield DATE format (that produces spelled-out months in output, and the ordering of EDATE before ADATE, so that ambiguous dates such as "1/1/99" yield the more sensible European date format instead of American format. When a given date format has more than one syntax, they must be in adjacent array elements. */ static struct date_syntax syntax[] = { /* dd-mmm-yy */ { FMT_DATE, 5, {DT_DAY, DT_DELIM, DT_ENGLISH_MONTH, DT_DELIM, DT_YEAR} }, /* dd.mm.yy */ { FMT_EDATE, 5, {DT_DAY, DT_DELIM, DT_MONTH, DT_DELIM, DT_YEAR} }, /* mm/dd/yy */ { FMT_ADATE, 5, {DT_MONTH, DT_DELIM, DT_DAY, DT_DELIM, DT_YEAR} }, /* yy/mm/dd */ { FMT_SDATE, 5, {DT_YEAR, DT_DELIM, DT_MONTH, DT_DELIM, DT_DAY} }, /* mmm yy */ { FMT_MOYR, 3, {DT_MONTH, DT_DELIM, DT_YEAR} }, /* q Q yy */ { FMT_QYR, 3, {DT_QUARTER, DT_Q, DT_YEAR} }, /* ww WK yy */ { FMT_WKYR, 3, {DT_WEEK, DT_WK, DT_YEAR} }, /* dd-mmm-yyyy HH:MM */ { FMT_DATETIME, 9, {DT_DAY, DT_DELIM, DT_MONTH, DT_DELIM, DT_YEAR, DT_SPACE, DT_HOUR, DT_COLON, DT_MINUTE} }, /* dd-mmm-yyyy HH:MM:SS */ { FMT_DATETIME, 11, {DT_DAY, DT_DELIM, DT_MONTH, DT_DELIM, DT_YEAR, DT_SPACE, DT_HOUR, DT_COLON, DT_MINUTE, DT_COLON, DT_SECOND} }, /* yyyy-dd-mmm HH:MM */ { FMT_YMDHMS, 9, {DT_YEAR, DT_DELIM, DT_MONTH, DT_DELIM, DT_DAY, DT_SPACE, DT_HOUR, DT_COLON, DT_MINUTE} }, /* yyyy-dd-mmm HH:MM:SS */ { FMT_YMDHMS, 11, {DT_YEAR, DT_DELIM, DT_MONTH, DT_DELIM, DT_DAY, DT_SPACE, DT_HOUR, DT_COLON, DT_MINUTE, DT_COLON, DT_SECOND} }, /* HH:MM */ { FMT_TIME, 3, {DT_HOUR, DT_COLON, DT_MINUTE} }, /* HH:MM:SS */ { FMT_TIME, 5, {DT_HOUR, DT_COLON, DT_MINUTE, DT_COLON, DT_SECOND} }, /* D HH:MM */ { FMT_DTIME, 5, {DT_DAY_COUNT, DT_SPACE, DT_HOUR, DT_COLON, DT_MINUTE} }, /* D HH:MM:SS */ { FMT_DTIME, 7, {DT_DAY_COUNT, DT_SPACE, DT_HOUR, DT_COLON, DT_MINUTE, DT_COLON, DT_SECOND} }, /* www */ { FMT_WKDAY, 1, {DT_WEEKDAY} }, /* mmm We require a spelled-out English month so that single-character Roman numerals like "i" and "x" don't get detected as months. The latter is particularly common in the password field of /etc/passwd-like files. */ { FMT_MONTH, 1, {DT_ENGLISH_MONTH} }, }; /* Number of recognized date syntax formats. */ #define DATE_SYNTAX_CNT (sizeof syntax / sizeof *syntax) /* A format guesser. */ struct fmt_guesser { /* Maximum observed input width. */ unsigned int width; /* Sum of the digits after the decimal point in each input (divide by count to obtain average decimal positions). */ unsigned int decimals; /* Number of non-empty, non-missing input values. count is the sum of any_numeric, any_date, and the number of inputs that were not in any recognized format (hence, treated as A format). */ unsigned int count; /* Numeric input formats. */ unsigned int any_numeric; /* Sum of following counts. */ unsigned int f; /* Number of inputs in F format. */ unsigned int comma; /* Number of inputs in COMMA format. */ unsigned int dot; /* Number of inputs in DOT format. */ unsigned int dollar; /* Number of inputs in DOLLAR format. */ unsigned int pct; /* Number of inputs in PCT format. */ unsigned int e; /* Number of inputs in E format. */ /* Date or time input formats. The sum of the values in the date array is at least any_date, often higher because many example dates match more than one date format. */ unsigned int any_date; /* Number of inputs in any date format. */ unsigned int date[DATE_SYNTAX_CNT]; /* Number of inputs in each date format. */ }; static bool add_numeric (struct fmt_guesser *, struct substring); static void guess_numeric (struct fmt_guesser *, struct fmt_spec *); static void add_date_time (struct fmt_guesser *, struct substring); static bool match_date_syntax (const enum date_token a[], size_t a_len, const enum date_token b[], size_t b_len); static void guess_date_time (struct fmt_guesser *, struct fmt_spec *); static enum date_token parse_date_token (struct substring *, enum date_token tokens_seen, int *decimals); static enum date_token parse_date_number (struct substring *, enum date_token tokens_seen, int *decimals); static enum date_token recognize_identifier_token (struct substring *); static enum date_token recognize_id2 (int s0, int s1, bool more); static enum date_token recognize_id3 (int s0, int s1, int s2, bool more); /* Creates and returns a new format guesser. */ struct fmt_guesser * fmt_guesser_create (void) { struct fmt_guesser *g = xmalloc (sizeof *g); fmt_guesser_clear (g); return g; } /* Destroys format guesser G. */ void fmt_guesser_destroy (struct fmt_guesser *g) { free (g); } /* Clears the state of format guesser G, making it available for guessing the format of a new input stream. */ void fmt_guesser_clear (struct fmt_guesser *g) { memset (g, 0, sizeof *g); } /* Appends S to the stream of data items whose format G is guessing. */ void fmt_guesser_add (struct fmt_guesser *g, struct substring s) { if (ss_length (s) > g->width) g->width = ss_length (s); ss_trim (&s, ss_cstr (CC_SPACES)); if (ss_is_empty (s) || ss_equals (s, ss_cstr ("."))) { /* Can't guess anything from an empty string or a missing value. */ return; } g->count++; if (!add_numeric (g, s)) add_date_time (g, s); } /* Guesses the format of the input previously added to G using fmt_guesser_add, storing the guess into *F. The guessed format may not actually a valid input or output format, in that its width and number of decimal places may be outside the valid range for the guessed format type. The caller must therefore adjust the format to make it valid, e.g. by calling fmt_fix. */ void fmt_guesser_guess (struct fmt_guesser *g, struct fmt_spec *f) { if (g->count > 0) { /* Set defaults. The guesser functions typically override the width and type. */ f->type = FMT_A; f->w = g->width; f->d = 0; if (g->any_numeric > g->count / 2) guess_numeric (g, f); else if (g->any_date > g->count / 2) guess_date_time (g, f); } else { /* No data at all. Use fallback default. */ *f = fmt_default_for_width (0); } } /* Numeric formats. */ /* Tries to parse S as a numeric (F, COMMA, DOT, DOLLAR, PCT, or E) format. If successful, increments G's any_numeric counter and the counter for the specific format S that S matches and returns true. On failure, returns false without modifying G. This function is intended to match exactly the same set of strings that the actual numeric value parsers used by the data_in function would match. */ static bool add_numeric (struct fmt_guesser *g, struct substring s) { bool has_dollar; /* '$' appeared at start of S? */ bool has_percent; /* '%' appeared at end of S? */ int digits; /* Number of digits in S (before exponent). */ int dots; /* Number of '.' in S. */ int commas; /* Number of ',' in S. */ bool has_exp; /* [eEdD] appeared introducing exponent? */ bool has_exp_sign; /* '+' or '-' appeared in exponent? */ int exp_digits; /* Number of digits in exponent. */ int prev_delim; /* Initially 0, then ',' or '.' as delimiters seen. */ int delim_digits; /* Number of digits since last delimiter. */ int decimal; /* Decimal point character: '.', ',', or 0 if unknown or no decimal point in S. */ int precision; /* Digits of precision after decimal point. */ int c; /* Skip leading "$" and optional following white space. */ has_dollar = ss_match_byte (&s, '$'); if (has_dollar) ss_ltrim (&s, ss_cstr (CC_SPACES)); /* Skip optional sign. */ ss_match_byte_in (&s, ss_cstr ("+-")); /* Skip digits punctuated by commas and dots. We don't know whether the decimal point is a comma or a dot, so for now we just count them. */ digits = dots = commas = 0; delim_digits = 0; prev_delim = 0; for (; (c = ss_first (s)) != -1; ss_advance (&s, 1)) { if (c >= '0' && c <= '9') { digits++; if (dots || commas) delim_digits++; } else if (c == '.') { dots++; prev_delim = c; delim_digits = 0; } else if (c == ',') { commas++; prev_delim = c; delim_digits = 0; } else break; } if (digits == 0 || (dots > 1 && commas > 1)) { /* A valid number has at least one digit and can't have more than one decimal point. */ return false; } /* Skip the optional exponent. */ has_exp = ss_match_byte_in (&s, ss_cstr ("eEdD")) != EOF; has_exp_sign = ss_match_byte_in (&s, ss_cstr ("-+")) != EOF; if (has_exp_sign) ss_match_byte (&s, ' '); exp_digits = ss_ltrim (&s, ss_cstr (CC_DIGITS)); if ((has_exp || has_exp_sign) && !exp_digits) { /* Can't have the E or sign that leads in the exponent without actually having an exponent. */ return false; } /* Skip optional '%'. */ has_percent = ss_match_byte (&s, '%'); if (has_dollar && has_percent) { /* A valid number cannot have both '$' and '%'. */ return false; } /* Make sure there's no trailing garbage. */ if (!ss_is_empty (s)) return false; /* Figure out the decimal point (and therefore grouping) character and the number of digits following the decimal point. Sometimes the answer is ambiguous. */ if (dots > 1 && prev_delim == '.') { /* Can't have multiple decimal points, so '.' must really be the grouping character, with a precision of 0. */ decimal = ','; precision = 0; } else if (commas > 1 && prev_delim == ',') { /* Can't have multiple decimal points, so ',' must really be the grouping character, with a precision of 0. */ decimal = '.'; precision = 0; } else if (delim_digits == 3 && (!dots || !commas)) { /* The input is something like "1.234" or "1,234" where we can't tell whether the ',' or '.' is a grouping or decimal character. Assume that the decimal character from the settings is in use. */ if (prev_delim == settings_get_decimal_char (FMT_F)) { decimal = prev_delim; precision = delim_digits; } else { decimal = prev_delim == '.' ? ',' : '.'; precision = 0; } } else { /* The final delimiter is a decimal point, and the digits following it are decimals. */ decimal = prev_delim; precision = delim_digits; } /* Decide the most likely format. */ g->any_numeric++; g->decimals += precision; if (has_dollar) g->dollar++; else if (has_percent) g->pct++; else if (commas && decimal == '.') g->comma++; else if (dots && decimal == ',') g->dot++; else if (has_exp || has_exp_sign) g->e++; else g->f++; return true; } /* Guess which numeric format is most likely represented by G, and store it in F's type and d members. (f->w is already initialized.) */ static void guess_numeric (struct fmt_guesser *g, struct fmt_spec *f) { int decimal_char = settings_get_decimal_char (FMT_COMMA); f->d = g->decimals / g->count; if (g->pct) f->type = FMT_PCT; else if (g->dollar) f->type = FMT_DOLLAR; else if (g->comma > g->dot) f->type = decimal_char == '.' ? FMT_COMMA : FMT_DOT; else if (g->dot > g->comma) f->type = decimal_char == '.' ? FMT_DOT : FMT_COMMA; else if (g->e > g->any_numeric / 2) f->type = FMT_E; else f->type = FMT_F; } /* Tries to parse S as a date (DATE, ADATE, EDATE, SDATE, QYR, MOYR, WKYR, DATETIME, or YMDHMS), time (TIME or DTIME), or date component (WKDAY or MONTH) format. If successful, increments G's any_date counter and the counter or counters for the specific format(s) that S matches. On failure, does not modify G. XXX How can we distinguish MTIME from TIME? One way might be that TIME can have three parts (HH:MM:SS) but MTIME only ever has two (MM:SS). Does not attempt to recognize JDATE format: it looks just like F format and will thus be caught by the numeric parser. This function is intended to match a set of strings close to those that actual date and time parsers used by the data_in function would match, but somewhat pickier. In particular, minutes and seconds are only recognized when they have exactly two digits: "1:02:03" is a valid time, but "1:2:3" is rejected. */ static void add_date_time (struct fmt_guesser *g, struct substring s) { enum date_token token; enum date_token tokens[MAX_TOKENS]; enum date_token tokens_seen; size_t token_cnt; int decimals; bool is_date; int i; /* Break S into tokens. */ token_cnt = 0; tokens_seen = 0; decimals = 0; while (!ss_is_empty (s)) { if (token_cnt >= MAX_TOKENS) return; token = parse_date_token (&s, tokens_seen, &decimals); if (token == 0) return; tokens[token_cnt++] = token; tokens_seen |= token; } if (token_cnt == 0) return; /* Find matching date formats, if any, and increment the counter for each one of them. */ is_date = false; for (i = 0; i < DATE_SYNTAX_CNT; i++) { struct date_syntax *s = &syntax[i]; if (match_date_syntax (tokens, token_cnt, s->tokens, s->token_cnt)) { is_date = true; g->date[i]++; } } if (is_date) { g->any_date++; g->decimals += decimals; } } /* Returns true if the A_LEN tokens in A[] match the B_LEN tokens in B[], false otherwise. */ static bool match_date_syntax (const enum date_token a[], size_t a_len, const enum date_token b[], size_t b_len) { size_t i; if (a_len != b_len) return false; for (i = 0; i < a_len; i++) if (!(a[i] & b[i])) return false; return true; } /* Guess which date or time format is most likely represented by G, and store it in F's type and d members. (f->w is already initialized.) */ static void guess_date_time (struct fmt_guesser *g, struct fmt_spec *f) { unsigned int max = 0; int i, j; /* Choose the date format matched by the most inputs. Break ties by choosing the earliest in the array. */ for (i = 0; i < DATE_SYNTAX_CNT; i = j) { unsigned int sum = g->date[i]; for (j = i + 1; j < DATE_SYNTAX_CNT; j++) { if (syntax[i].format != syntax[j].format) break; sum += g->date[j]; } if (sum > max) { f->type = syntax[i].format; max = sum; } } /* Formats that include a time have an optional seconds field. If we saw a seconds field in any of the inputs, make sure that the field width is large enough to include for them. (We use the minimum input width, but an output width would be equally appropriate, since all the time formats have the same minimum widths for input and output.) */ if (f->type == FMT_DATETIME || f->type == FMT_YMDHMS || f->type == FMT_MTIME || f->type == FMT_TIME || f->type == FMT_DTIME) { for (i = 0; i < DATE_SYNTAX_CNT; i++) if (g->date[i] && syntax[i].tokens[syntax[i].token_cnt - 1] == DT_SECOND) { f->d = g->decimals / g->count; f->w = MAX (f->w, fmt_min_input_width (f->type) + 3); } } } /* Extracts the next date token from the string represented by S, which must not be an empty string, and advances *S past the end of the token. Returns the parsed token, or 0 if no valid token was found. TOKENS_SEEN should be a bitmap representing all the tokens already seen in this input; this is used to resolve some otherwise ambiguous parsing situation. If a count of seconds is parsed, *DECIMALS is set to the number of digits after the decimal point. */ static enum date_token parse_date_token (struct substring *s, enum date_token tokens_seen, int *decimals) { int c = ss_first (*s); switch (c) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': return parse_date_number (s, tokens_seen, decimals); case '+': case '-': /* '+' or '-' at the start of a string, or following a space, could be the sign that optionally introduces a time, e.g. "-1:00" in TIME format, "-1 1:00" in DTIME format, or "1/1/1978 +1:00" in DATETIME format. */ if ((!tokens_seen || s->string[-1] == ' ') && c_isdigit (ss_at (*s, 1))) { ss_advance (s, 1); ss_ltrim (s, ss_cstr (CC_DIGITS)); return DT_DAY_COUNT | DT_HOUR; } else if (c == '+') return 0; /* Fall through. */ case '/': case '.': case ',': ss_advance (s, 1); return DT_DELIM; case ':': ss_advance (s, 1); return DT_COLON; case ' ': case '\t': case '\v': case '\r': case '\n': { enum date_token token; ss_advance (s, 1); token = recognize_identifier_token (s); if (token) ss_match_byte_in (s, ss_cstr (CC_SPACES)); else token = DT_DELIM | DT_SPACE; return token; } default: return recognize_identifier_token (s); case EOF: NOT_REACHED (); } } /* Parses a digit sequence found in a date token. Advances *S past the end of the token. Returns the parsed token, or 0 if no valid token was found. TOKENS_SEEN should be a bitmap representing all the tokens already seen in this input; this is used to resolve some otherwise ambiguous parsing situation. If a count of seconds is parsed, *DECIMALS is set to the number of digits after the decimal point.*/ static enum date_token parse_date_number (struct substring *s, enum date_token tokens_seen, int *decimals) { long int value; size_t digit_cnt = ss_get_long (s, &value); enum date_token token = 0; if (ss_match_byte (s, settings_get_decimal_char (FMT_F)) && tokens_seen & DT_COLON && value <= 59) { /* Parse digits after the decimal point. */ token = DT_SECOND; *decimals = ss_ltrim (s, ss_cstr (CC_DIGITS)); } else { if (value <= 4) token = (DT_QUARTER | DT_MONTH | DT_HOUR | DT_DAY | DT_WEEK | DT_DAY_COUNT); else if (value <= 12) token = DT_MONTH | DT_HOUR | DT_DAY | DT_WEEK | DT_DAY_COUNT; else if (value <= 23) token = DT_HOUR | DT_DAY | DT_WEEK | DT_DAY_COUNT; else if (value <= 31) token = DT_DAY | DT_WEEK | DT_DAY_COUNT; else if (value <= 52) token = DT_WEEK | DT_DAY_COUNT; else token = DT_DAY_COUNT; if (digit_cnt == 2) { token |= DT_YEAR; if (value <= 59) token |= DT_MINUTE | DT_SECOND; } else if (digit_cnt == 4) token |= DT_YEAR; } return token; } /* Attempts to parse an identifier found in a date at the beginning of S. Advances *S past the end of the token. Returns the parsed token, or 0 if no valid token was found. */ static enum date_token recognize_identifier_token (struct substring *s) { size_t length = ss_span (*s, ss_cstr (CC_LETTERS)); enum date_token token = 0; switch (length) { case 0: break; case 1: switch (c_tolower (s->string[0])) { case 'i': case 'v': case 'x': token = DT_MONTH; break; case 'q': token = DT_Q; break; } break; case 2: { int s0 = c_tolower ((unsigned char) s->string[0]); int s1 = c_tolower ((unsigned char) s->string[1]); token = recognize_id2 (s0, s1, false); if (!token && s0 == 'w' && s1 == 'k') token = DT_WK; } break; default: { int s0 = c_tolower ((unsigned char) s->string[0]); int s1 = c_tolower ((unsigned char) s->string[1]); int s2 = c_tolower ((unsigned char) s->string[2]); token = recognize_id2 (s0, s1, true); if (!token) token = recognize_id3 (s0, s1, s2, length > 3); if (!token && length == 4) { int s3 = c_tolower ((unsigned char) s->string[3]); if (s0 == 'v' && s1 == 'i' && s2 == 'i' && s3 == 'i') token = DT_MONTH; } } break; } if (token) ss_advance (s, length); return token; } static enum date_token recognize_id2 (int s0, int s1, bool more) { bool weekday; switch (s0) { case 's': weekday = s1 == 'a' || s1 == 'u'; break; case 'm': weekday = s1 == 'o'; break; case 't': weekday = s1 == 'u' || s1 == 'h'; break; case 'w': weekday = s1 == 'e'; break; case 'f': weekday = s1 == 'r'; break; default: weekday = false; break; } if (weekday) return DT_WEEKDAY; if (!more) { bool month; switch (s0) { case 'i': month = s1 == 'i' || s1 == 'v' || s1 == 'x'; break; case 'v': month = s1 == 'i'; break; case 'x': month = s1 == 'i'; break; default: month = false; break; } if (month) return DT_MONTH; } return 0; } static enum date_token recognize_id3 (int s0, int s1, int s2, bool more) { bool month; switch (s0) { case 'j': month = ((s1 == 'a' && s2 == 'n') || (s1 == 'u' && (s2 == 'n' || s2 == 'l'))); break; case 'f': month = s1 == 'e' && s2 == 'b'; break; case 'm': month = (s1 == 'a' && (s2 == 'r' || s2 == 'y')); break; case 'a': month = (s1 == 'p' && s2 == 'r') || (s1 == 'u' && s2 == 'g'); break; case 's': month = s1 == 'e' && s2 == 'p'; break; case 'o': month = s1 == 'c' && s2 == 't'; break; case 'n': month = s1 == 'o' && s2 == 'v'; break; case 'd': month = s1 == 'e' && s2 == 'c'; break; default: month = false; } if (month) return DT_MONTH | DT_ENGLISH_MONTH; if (!more) { bool roman_month = false; switch (s0) { case 'i': case 'x': roman_month = s1 == 'i' && s2 == 'i'; break; case 'v': roman_month = s1 == 'i' && s2 == 'i'; break; } if (roman_month) return DT_MONTH; } return 0; } pspp-1.4.1/src/data/mrset.h0000644000175000017500000000610413320146056015117 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2010 Free Software Foundation, Inc. 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 3 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, see . */ #ifndef DATA_MRSET_H #define DATA_MRSET_H 1 /* Multiple response set data structure. A multiple response set (mrset) is a set of variables that represent multiple responses to a single survey question in one of the two following ways: - A multiple dichotomy set represents a survey question with a set of checkboxes. Each variable in the set is treated in a Boolean fashion: one value (the "counted value") means that the box was checked, and any other value means that it was not. - A multiple category set represents a survey question where the respondent is instructed to "list up to N choices". Each variable represents one of the responses. The set of functions provided here are skeletal. Undoubtedly they will grow as PSPP begins to make use of multiple response sets, as opposed to merely maintaining them as part of the dictionary. */ #include #include #include "data/value.h" struct dictionary; /* Type of a multiple response set. */ enum mrset_type { MRSET_MD, /* Multiple dichotomy group. */ MRSET_MC /* Multiple category group. */ }; /* Source of category labels for a multiple dichotomy group. */ enum mrset_md_cat_source { MRSET_VARLABELS, /* Variable labels. */ MRSET_COUNTEDVALUES /* Value labels for the counted value. */ }; /* A multiple response set. */ struct mrset { char *name; /* UTF-8 encoded name beginning with "$". */ char *label; /* Human-readable UTF-8 label for group. */ enum mrset_type type; /* Group type. */ struct variable **vars; /* Constituent variables. */ size_t n_vars; /* Number of constituent variables. */ /* MRSET_MD only. */ enum mrset_md_cat_source cat_source; /* Source of category labels. */ bool label_from_var_label; /* 'label' taken from variable label? */ union value counted; /* Counted value. */ int width; /* Width of 'counted'. */ }; struct mrset *mrset_clone (const struct mrset *); void mrset_destroy (struct mrset *); bool mrset_is_valid_name (const char *name, const char *dict_encoding, bool issue_error); bool mrset_ok (const struct mrset *, const struct dictionary *); #endif /* data/mrset.h */ pspp-1.4.1/src/data/ods-reader.h0000644000175000017500000000237413320146056016017 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2011 Free Software Foundation, Inc. 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 3 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, see . */ #ifndef ODS_READ_H #define ODS_READ_H 1 #include struct casereader; struct dictionary; struct spreadsheet_read_options; struct spreadsheet; const char * ods_get_sheet_name (struct spreadsheet *s, int n); char * ods_get_sheet_range (struct spreadsheet *s, int n); struct spreadsheet *ods_probe (const char *filename, bool report_errors); struct casereader * ods_make_reader (struct spreadsheet *spreadsheet, const struct spreadsheet_read_options *opts); void ods_unref (struct spreadsheet *s); #endif pspp-1.4.1/src/data/val-type.h0000644000175000017500000000336513320146056015534 0ustar00blpblp00000000000000/* PSPP - computes sample statistics. Copyright (C) 2007, 2011 Free Software Foundation, Inc. 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 3 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef DATA_VAL_TYPE_H #define DATA_VAL_TYPE_H 1 #include #include #include "libpspp/float-format.h" /* Special numeric values. */ #define SYSMIS (-DBL_MAX) /* System-missing value. */ #define LOWEST (float_get_lowest ()) /* Smallest nonmissing finite value. */ #define HIGHEST DBL_MAX /* Largest finite value. */ /* Maximum length of a string variable. */ #define MAX_STRING 32767 /* Value type. */ enum val_type { VAL_NUMERIC, /* A numeric value. */ VAL_STRING /* A string value. */ }; /* Returns true if VAL_TYPE is a valid value type. */ static inline bool val_type_is_valid (enum val_type val_type) { return val_type == VAL_NUMERIC || val_type == VAL_STRING; } /* Returns the value type for the given WIDTH. */ static inline enum val_type val_type_from_width (int width) { return width != 0 ? VAL_STRING : VAL_NUMERIC; } #endif /* data/val-type.h */ pspp-1.4.1/src/data/caseinit.h0000644000175000017500000000400013320146056015555 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2007, 2010 Free Software Foundation, Inc. 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 3 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, see . */ /* Case initializer. The procedure code has to resize cases provided by the active dataset data source, to provide room for any other variables that should go in the case, fill in the values of "left" variables, and initialize the values of other non-left variable to zero or spaces. Then, when we're done with that case, we have to save the values of "left" variables to copy into the next case read from the active dataset. The caseinit data structure provides a little help for tracking what data to initialize or to copy from case to case. */ #ifndef DATA_CASEINIT_H #define DATA_CASEINIT_H 1 struct dictionary; struct ccase; /* Creation and destruction. */ struct caseinit *caseinit_create (void); struct caseinit *caseinit_clone (struct caseinit *); void caseinit_clear (struct caseinit *); void caseinit_destroy (struct caseinit *); /* Track data to be initialized. */ void caseinit_mark_as_preinited (struct caseinit *, const struct dictionary *); void caseinit_mark_for_init (struct caseinit *, const struct dictionary *); /* Initialize data and copy data from case to case. */ void caseinit_init_vars (const struct caseinit *, struct ccase *); void caseinit_update_left_vars (struct caseinit *, const struct ccase *); #endif /* data/caseinit.h */ pspp-1.4.1/src/data/mdd-writer.h0000644000175000017500000000175313320146056016050 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2018 Free Software Foundation, Inc. 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 3 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, see . */ #ifndef MDD_WRITER_H #define MDD_WRITER_H 1 #include /* Writing MDD files. */ struct file_handle; struct dictionary; bool mdd_write (struct file_handle *, struct dictionary *, const char *sav_name); #endif /* mdd-writer.h */ pspp-1.4.1/src/data/dataset-writer.h0000644000175000017500000000201113320146056016715 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2006, 2009, 2010 Free Software Foundation, Inc. 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 3 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, see . */ #ifndef DATASET_WRITER_H #define DATASET_WRITER_H 1 #include struct dictionary; struct file_handle; struct casewriter *dataset_writer_open (struct file_handle *, const struct dictionary *); #endif /* dataset-writer.h */ pspp-1.4.1/src/data/dictionary.h0000644000175000017500000002162013434127346016141 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2004, 2007, 2009, 2010, 2011, 2012, 2013 Free Software Foundation, Inc. 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 3 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, see . */ #ifndef DATA_DICTIONARY_H #define DATA_DICTIONARY_H 1 #include #include #include "data/case.h" #include "data/dict-class.h" struct string; struct ccase; /* Creating dictionaries. */ struct dictionary *dict_create (const char *encoding); struct dictionary *dict_clone (const struct dictionary *) WARN_UNUSED_RESULT; struct dictionary *dict_ref (struct dictionary *s) WARN_UNUSED_RESULT; /* Clearing and destroying dictionaries. */ void dict_clear (struct dictionary *); void dict_unref (struct dictionary *); /* Common ways to access variables. */ struct variable *dict_lookup_var (const struct dictionary *, const char *); struct variable *dict_lookup_var_assert (const struct dictionary *, const char *); struct variable *dict_get_var (const struct dictionary *, size_t position); size_t dict_get_var_cnt (const struct dictionary *); /* Other access to variables. */ bool dict_contains_var (const struct dictionary *, const struct variable *); void dict_get_vars (const struct dictionary *, const struct variable ***vars, size_t *cnt, enum dict_class exclude); void dict_get_vars_mutable (const struct dictionary *, struct variable ***vars, size_t *cnt, enum dict_class exclude); /* Creating variables. */ struct variable *dict_create_var (struct dictionary *, const char *, int width); struct variable *dict_create_var_assert (struct dictionary *, const char *, int width); struct variable *dict_clone_var (struct dictionary *, const struct variable *); struct variable *dict_clone_var_assert (struct dictionary *, const struct variable *); struct variable *dict_clone_var_as (struct dictionary *, const struct variable *, const char *); struct variable *dict_clone_var_as_assert (struct dictionary *, const struct variable *, const char *); struct variable *dict_clone_var_in_place_assert (struct dictionary *, const struct variable *); /* Deleting variables. */ void dict_delete_var (struct dictionary *, struct variable *); void dict_delete_vars (struct dictionary *, struct variable *const *, size_t count); void dict_delete_consecutive_vars (struct dictionary *, size_t idx, size_t count); void dict_delete_scratch_vars (struct dictionary *); /* Changing the order of variables. */ void dict_reorder_var (struct dictionary *, struct variable *, size_t new_index); void dict_reorder_vars (struct dictionary *, struct variable *const *, size_t count); /* Variable names. */ bool dict_try_rename_var (struct dictionary *, struct variable *, const char *); void dict_rename_var (struct dictionary *, struct variable *, const char *); bool dict_rename_vars (struct dictionary *, struct variable **, char **new_names, size_t count, char **err_name); char *dict_make_unique_var_name (const struct dictionary *, const char *hint, unsigned long int *num_start); bool dict_get_names_must_be_ids (const struct dictionary *); void dict_set_names_must_be_ids (struct dictionary *, bool); /* Weight variable. */ double dict_get_case_weight (const struct dictionary *, const struct ccase *, bool *); struct variable *dict_get_weight (const struct dictionary *); void dict_set_weight (struct dictionary *, struct variable *); const struct fmt_spec *dict_get_weight_format (const struct dictionary *); /* Filter variable. */ struct variable *dict_get_filter (const struct dictionary *); void dict_set_filter (struct dictionary *, struct variable *); /* Case limit (N OF CASES). */ casenumber dict_get_case_limit (const struct dictionary *); void dict_set_case_limit (struct dictionary *, casenumber); /* Size of cases for this dictionary. */ const struct caseproto *dict_get_proto (const struct dictionary *); int dict_get_next_value_idx (const struct dictionary *); size_t dict_get_case_size (const struct dictionary *); /* Making this dictionary's cases smaller (if some variables were deleted). */ size_t dict_count_values (const struct dictionary *, unsigned int exclude_classes); void dict_compact_values (struct dictionary *); struct caseproto *dict_get_compacted_proto (const struct dictionary *, unsigned int exclude_classes); /* SPLIT FILE variables. */ const struct variable *const *dict_get_split_vars (const struct dictionary *); size_t dict_get_split_cnt (const struct dictionary *); void dict_set_split_vars (struct dictionary *, struct variable *const *, size_t cnt); /* File label. */ const char *dict_get_label (const struct dictionary *); void dict_set_label (struct dictionary *, const char *); /* Documents. */ #define DOC_LINE_LENGTH 80 /* Fixed length of document lines. */ const struct string_array *dict_get_documents (const struct dictionary *); void dict_set_documents (struct dictionary *, const struct string_array *); void dict_set_documents_string (struct dictionary *, const char *); void dict_clear_documents (struct dictionary *); bool dict_add_document_line (struct dictionary *, const char *, bool issue_warning); size_t dict_get_document_line_cnt (const struct dictionary *); const char *dict_get_document_line (const struct dictionary *, size_t); /* Vectors. */ bool dict_create_vector (struct dictionary *, const char *name, struct variable **, size_t cnt); void dict_create_vector_assert (struct dictionary *, const char *name, struct variable **, size_t cnt); const struct vector *dict_get_vector (const struct dictionary *, size_t idx); size_t dict_get_vector_cnt (const struct dictionary *); const struct vector *dict_lookup_vector (const struct dictionary *, const char *name); void dict_clear_vectors (struct dictionary *); /* Multiple response sets. */ const struct mrset *dict_get_mrset (const struct dictionary *, size_t idx); size_t dict_get_n_mrsets (const struct dictionary *); const struct mrset *dict_lookup_mrset (const struct dictionary *, const char *name); bool dict_add_mrset (struct dictionary *, struct mrset *); bool dict_delete_mrset (struct dictionary *, const char *name); void dict_clear_mrsets (struct dictionary *); /* Attributes. */ struct attrset *dict_get_attributes (const struct dictionary *); void dict_set_attributes (struct dictionary *, const struct attrset *); bool dict_has_attributes (const struct dictionary *); /* Data encoding. */ const char *dict_get_encoding (const struct dictionary *d); bool dict_id_is_valid (const struct dictionary *, const char *id, bool issue_error); /* Internal variables. */ struct variable *dict_create_internal_var (int case_idx, int width); void dict_destroy_internal_var (struct variable *); /* Functions to be called upon dictionary changes. */ struct dict_callbacks { void (*var_added) (struct dictionary *, int, void *); void (*var_deleted) (struct dictionary *, const struct variable *, int dict_index, int case_index, void *); void (*var_changed) (struct dictionary *, int, unsigned int, const struct variable *, void *); void (*weight_changed) (struct dictionary *, int, void *); void (*filter_changed) (struct dictionary *, int, void *); void (*split_changed) (struct dictionary *, void *); }; void dict_set_callbacks (struct dictionary *, const struct dict_callbacks *, void *); void dict_copy_callbacks (struct dictionary *, const struct dictionary *); void dict_set_change_callback (struct dictionary *d, void (*changed) (struct dictionary *, void*), void *data); /* Debug use only. */ void dict_dump (const struct dictionary *); #endif /* data/dictionary.h */ pspp-1.4.1/src/data/casereader-select.c0000644000175000017500000000453713320146056017343 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2009, 2010, 2011 Free Software Foundation, Inc. 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 3 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, see . */ #include #include "data/casereader-provider.h" #include "gl/xalloc.h" struct casereader_select { casenumber by; casenumber i; }; static bool casereader_select_include (const struct ccase *c UNUSED, void *cs_) { struct casereader_select *cs = cs_; if (++cs->i >= cs->by) { cs->i = 0; return true; } else return false; } static bool casereader_select_destroy (void *cs_) { struct casereader_select *cs = cs_; free (cs); return true; } /* Returns a casereader that contains cases FIRST though LAST, exclusive, of those within SUBREADER. (The first case in SUBREADER is number 0.) If BY is greater than 1, then it specifies a step between cases, e.g. a BY value of 2 causes the cases numbered FIRST + 1, FIRST + 3, FIRST + 5, and so on to be omitted. The caller gives up ownership of SUBREADER, transferring it into this function. */ struct casereader * casereader_select (struct casereader *subreader, casenumber first, casenumber last, casenumber by) { if (by == 0) by = 1; casereader_advance (subreader, first); if (last >= first) casereader_truncate (subreader, (last - first) / by * by); if (by == 1) return casereader_rename (subreader); else { struct casereader_select *cs = xmalloc (sizeof *cs); cs->by = by; cs->i = by - 1; return casereader_create_filter_func (subreader, casereader_select_include, casereader_select_destroy, cs, NULL); } } pspp-1.4.1/src/data/por-file-writer.h0000644000175000017500000000300713320146056017013 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 1997-9, 2000, 2009 Free Software Foundation, Inc. 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 3 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, see . */ #ifndef PFM_WRITE_H #define PFM_WRITE_H #include /* Portable file writing. */ /* Portable file types. */ enum pfm_type { PFM_COMM, /* Formatted for communication. */ PFM_TAPE /* Formatted for tape. */ }; /* Portable file writing options. */ struct pfm_write_options { bool create_writeable; /* File perms: writeable or read/only? */ enum pfm_type type; /* Type of portable file (TODO). */ int digits; /* Digits of precision. */ }; struct file_handle; struct dictionary; struct casewriter *pfm_open_writer (struct file_handle *, struct dictionary *, struct pfm_write_options); struct pfm_write_options pfm_writer_default_options (void); #endif /* por-file-writer.h */ pspp-1.4.1/src/data/casereader-shim.c0000644000175000017500000001072513320146056017020 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2007, 2009, 2010 Free Software Foundation, Inc. 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 3 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, see . */ #include #include "data/casereader-shim.h" #include #include "data/casereader.h" #include "data/casereader-provider.h" #include "data/casewindow.h" #include "data/settings.h" #include "libpspp/taint.h" #include "gl/xalloc.h" /* A buffering shim casereader. */ struct casereader_shim { struct casewindow *window; /* Window of buffered cases. */ struct casereader *subreader; /* Subordinate casereader. */ }; static const struct casereader_random_class shim_class; static bool buffer_case (struct casereader_shim *s); /* Interposes a buffering shim on READER. Returns the new shim. The only legitimate use of the returned casereader_shim is for calling casereader_shim_slurp(). If READER has no clones already (which the caller should ensure, if it plans to use the return value), then the returned casreader_shim is valid for that purpose until, and only until, the READER's 'destroy' function is called. */ struct casereader_shim * casereader_shim_insert (struct casereader *reader) { const struct caseproto *proto = casereader_get_proto (reader); casenumber case_cnt = casereader_get_case_cnt (reader); struct casereader_shim *s = xmalloc (sizeof *s); s->window = casewindow_create (proto, settings_get_workspace_cases (proto)); s->subreader = casereader_create_random (proto, case_cnt, &shim_class, s); casereader_swap (reader, s->subreader); taint_propagate (casewindow_get_taint (s->window), casereader_get_taint (reader)); taint_propagate (casereader_get_taint (s->subreader), casereader_get_taint (reader)); return s; } /* Reads all of the cases from S's subreader into S's buffer and destroys S's subreader. (This is a no-op if the subreader has already been destroyed.) Refer to the comment on casereader_shim_insert() for information on when this function may be used. */ void casereader_shim_slurp (struct casereader_shim *s) { while (buffer_case (s)) continue; } /* Reads a case from S's subreader and appends it to S's window. Returns true if successful, false at the end of S's subreader or upon an I/O error. */ static bool buffer_case (struct casereader_shim *s) { struct ccase *tmp; if (s->subreader == NULL) return false; tmp = casereader_read (s->subreader); if (tmp == NULL) { casereader_destroy (s->subreader); s->subreader = NULL; return false; } casewindow_push_head (s->window, tmp); return true; } /* Reads the case at the given 0-based OFFSET from the front of the window into C. Returns the case if successful, or a null pointer if OFFSET is beyond the end of file or upon I/O error. The caller must call case_unref() on the returned case when it is no longer needed. */ static struct ccase * casereader_shim_read (struct casereader *reader UNUSED, void *s_, casenumber offset) { struct casereader_shim *s = s_; while (casewindow_get_case_cnt (s->window) <= offset) if (!buffer_case (s)) return false; return casewindow_get_case (s->window, offset); } /* Destroys S. */ static void casereader_shim_destroy (struct casereader *reader UNUSED, void *s_) { struct casereader_shim *s = s_; casewindow_destroy (s->window); casereader_destroy (s->subreader); free (s); } /* Discards CNT cases from the front of S's window. */ static void casereader_shim_advance (struct casereader *reader UNUSED, void *s_, casenumber case_cnt) { struct casereader_shim *s = s_; casewindow_pop_tail (s->window, case_cnt); } /* Class for the buffered reader. */ static const struct casereader_random_class shim_class = { casereader_shim_read, casereader_shim_destroy, casereader_shim_advance, }; pspp-1.4.1/src/data/casewindow.c0000644000175000017500000002271713320146056016133 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2007, 2009, 2011 Free Software Foundation, Inc. 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 3 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, see . */ /* This casewindow implementation in terms of an class interface is undoubtedly a form of over-abstraction. However, it works and the extra abstraction seems to be harmless. */ #include #include "data/casewindow.h" #include #include "data/case-tmpfile.h" #include "libpspp/assertion.h" #include "libpspp/compiler.h" #include "libpspp/deque.h" #include "libpspp/taint.h" #include "gl/xalloc.h" /* A queue of cases. */ struct casewindow { /* Common data. */ struct caseproto *proto; /* Prototype of cases in window. */ casenumber max_in_core_cases; /* Max cases before dumping to disk. */ struct taint *taint; /* Taint status. */ /* Implementation data. */ const struct casewindow_class *class; void *aux; }; /* Implementation of a casewindow. */ struct casewindow_class { void *(*create) (struct taint *, const struct caseproto *); void (*destroy) (void *aux); void (*push_head) (void *aux, struct ccase *); void (*pop_tail) (void *aux, casenumber cnt); struct ccase *(*get_case) (void *aux, casenumber ofs); casenumber (*get_case_cnt) (const void *aux); }; /* Classes. */ static const struct casewindow_class casewindow_memory_class; static const struct casewindow_class casewindow_file_class; /* Creates and returns a new casewindow using the given parameters. */ static struct casewindow * do_casewindow_create (struct taint *taint, const struct caseproto *proto, casenumber max_in_core_cases) { struct casewindow *cw = xmalloc (sizeof *cw); cw->class = (max_in_core_cases ? &casewindow_memory_class : &casewindow_file_class); cw->aux = cw->class->create (taint, proto); cw->proto = caseproto_ref (proto); cw->max_in_core_cases = max_in_core_cases; cw->taint = taint; return cw; } /* Creates and returns a new casewindow for cases that take the form specified by PROTO. If the casewindow holds more than MAX_IN_CORE_CASES cases at any time, its cases will be dumped to disk; otherwise, its cases will be held in memory. The caller retains its reference to PROTO. */ struct casewindow * casewindow_create (const struct caseproto *proto, casenumber max_in_core_cases) { return do_casewindow_create (taint_create (), proto, max_in_core_cases); } /* Destroys casewindow CW. Returns true if CW was tainted, which is caused by an I/O error or by taint propagation to the casewindow. */ bool casewindow_destroy (struct casewindow *cw) { bool ok = true; if (cw != NULL) { cw->class->destroy (cw->aux); ok = taint_destroy (cw->taint); caseproto_unref (cw->proto); free (cw); } return ok; } /* Swaps the contents of casewindows A and B. */ static void casewindow_swap (struct casewindow *a, struct casewindow *b) { struct casewindow tmp = *a; *a = *b; *b = tmp; } /* Dumps the contents of casewindow OLD to disk. */ static void casewindow_to_disk (struct casewindow *old) { struct casewindow *new; new = do_casewindow_create (taint_clone (old->taint), old->proto, 0); while (casewindow_get_case_cnt (old) > 0 && !casewindow_error (new)) { struct ccase *c = casewindow_get_case (old, 0); if (c == NULL) break; casewindow_pop_tail (old, 1); casewindow_push_head (new, c); } casewindow_swap (old, new); casewindow_destroy (new); } /* Pushes case C at the head of casewindow CW. Case C becomes owned by the casewindow. */ void casewindow_push_head (struct casewindow *cw, struct ccase *c) { if (!casewindow_error (cw)) { cw->class->push_head (cw->aux, c); if (!casewindow_error (cw)) { casenumber case_cnt = cw->class->get_case_cnt (cw->aux); if (case_cnt > cw->max_in_core_cases && cw->class == &casewindow_memory_class) casewindow_to_disk (cw); } } else case_unref (c); } /* Deletes CASE_CNT cases at the tail of casewindow CW. */ void casewindow_pop_tail (struct casewindow *cw, casenumber case_cnt) { if (!casewindow_error (cw)) cw->class->pop_tail (cw->aux, case_cnt); } /* Returns the case that is CASE_IDX cases away from CW's tail into C, or a null pointer on an I/O error or if CW is otherwise tainted. The caller must call case_unref() on the returned case when it is no longer needed. */ struct ccase * casewindow_get_case (const struct casewindow *cw_, casenumber case_idx) { struct casewindow *cw = CONST_CAST (struct casewindow *, cw_); assert (case_idx >= 0 && case_idx < casewindow_get_case_cnt (cw)); if (casewindow_error (cw)) return NULL; return cw->class->get_case (cw->aux, case_idx); } /* Returns the number of cases in casewindow CW. */ casenumber casewindow_get_case_cnt (const struct casewindow *cw) { return cw->class->get_case_cnt (cw->aux); } /* Returns the case prototype for the cases in casewindow CW. The caller must not unref the returned prototype. */ const struct caseproto * casewindow_get_proto (const struct casewindow *cw) { return cw->proto; } /* Returns true if casewindow CW is tainted. A casewindow is tainted by an I/O error or by taint propagation to the casewindow. */ bool casewindow_error (const struct casewindow *cw) { return taint_is_tainted (cw->taint); } /* Marks casewindow CW tainted. */ void casewindow_force_error (struct casewindow *cw) { taint_set_taint (cw->taint); } /* Returns casewindow CW's taint object. */ const struct taint * casewindow_get_taint (const struct casewindow *cw) { return cw->taint; } /* In-memory casewindow data. */ struct casewindow_memory { struct deque deque; struct ccase **cases; }; static void * casewindow_memory_create (struct taint *taint UNUSED, const struct caseproto *proto UNUSED) { struct casewindow_memory *cwm = xmalloc (sizeof *cwm); cwm->cases = deque_init (&cwm->deque, 4, sizeof *cwm->cases); return cwm; } static void casewindow_memory_destroy (void *cwm_) { struct casewindow_memory *cwm = cwm_; while (!deque_is_empty (&cwm->deque)) case_unref (cwm->cases[deque_pop_front (&cwm->deque)]); free (cwm->cases); free (cwm); } static void casewindow_memory_push_head (void *cwm_, struct ccase *c) { struct casewindow_memory *cwm = cwm_; if (deque_is_full (&cwm->deque)) cwm->cases = deque_expand (&cwm->deque, cwm->cases, sizeof *cwm->cases); cwm->cases[deque_push_back (&cwm->deque)] = c; } static void casewindow_memory_pop_tail (void *cwm_, casenumber case_cnt) { struct casewindow_memory *cwm = cwm_; assert (deque_count (&cwm->deque) >= case_cnt); while (case_cnt-- > 0) case_unref (cwm->cases[deque_pop_front (&cwm->deque)]); } static struct ccase * casewindow_memory_get_case (void *cwm_, casenumber ofs) { struct casewindow_memory *cwm = cwm_; return case_ref (cwm->cases[deque_front (&cwm->deque, ofs)]); } static casenumber casewindow_memory_get_case_cnt (const void *cwm_) { const struct casewindow_memory *cwm = cwm_; return deque_count (&cwm->deque); } static const struct casewindow_class casewindow_memory_class = { casewindow_memory_create, casewindow_memory_destroy, casewindow_memory_push_head, casewindow_memory_pop_tail, casewindow_memory_get_case, casewindow_memory_get_case_cnt, }; /* On-disk casewindow data. */ struct casewindow_file { struct case_tmpfile *file; casenumber head, tail; }; static void * casewindow_file_create (struct taint *taint, const struct caseproto *proto) { struct casewindow_file *cwf = xmalloc (sizeof *cwf); cwf->file = case_tmpfile_create (proto); cwf->head = cwf->tail = 0; taint_propagate (case_tmpfile_get_taint (cwf->file), taint); return cwf; } static void casewindow_file_destroy (void *cwf_) { struct casewindow_file *cwf = cwf_; case_tmpfile_destroy (cwf->file); free (cwf); } static void casewindow_file_push_head (void *cwf_, struct ccase *c) { struct casewindow_file *cwf = cwf_; if (case_tmpfile_put_case (cwf->file, cwf->head, c)) cwf->head++; } static void casewindow_file_pop_tail (void *cwf_, casenumber cnt) { struct casewindow_file *cwf = cwf_; assert (cnt <= cwf->head - cwf->tail); cwf->tail += cnt; if (cwf->head == cwf->tail) cwf->head = cwf->tail = 0; } static struct ccase * casewindow_file_get_case (void *cwf_, casenumber ofs) { struct casewindow_file *cwf = cwf_; return case_tmpfile_get_case (cwf->file, cwf->tail + ofs); } static casenumber casewindow_file_get_case_cnt (const void *cwf_) { const struct casewindow_file *cwf = cwf_; return cwf->head - cwf->tail; } static const struct casewindow_class casewindow_file_class = { casewindow_file_create, casewindow_file_destroy, casewindow_file_push_head, casewindow_file_pop_tail, casewindow_file_get_case, casewindow_file_get_case_cnt, }; pspp-1.4.1/src/data/dictionary.c0000644000175000017500000015127213700645725016145 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 1997-9, 2000, 2006, 2007, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2020 Free Software Foundation, Inc. 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 3 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, see . */ #include #include "data/dictionary.h" #include #include #include #include #include "data/attributes.h" #include "data/case.h" #include "data/identifier.h" #include "data/mrset.h" #include "data/settings.h" #include "data/value-labels.h" #include "data/vardict.h" #include "data/variable.h" #include "data/vector.h" #include "libpspp/array.h" #include "libpspp/assertion.h" #include "libpspp/compiler.h" #include "libpspp/hash-functions.h" #include "libpspp/hmap.h" #include "libpspp/i18n.h" #include "libpspp/message.h" #include "libpspp/misc.h" #include "libpspp/pool.h" #include "libpspp/str.h" #include "libpspp/string-array.h" #include "libpspp/ll.h" #include "gl/intprops.h" #include "gl/minmax.h" #include "gl/xalloc.h" #include "gl/xmemdup0.h" #include "gettext.h" #define _(msgid) gettext (msgid) /* A dictionary. */ struct dictionary { int ref_cnt; struct vardict_info *var; /* Variables. */ size_t var_cnt, var_cap; /* Number of variables, capacity. */ struct caseproto *proto; /* Prototype for dictionary cases (updated lazily). */ struct hmap name_map; /* Variable index by name. */ int next_value_idx; /* Index of next `union value' to allocate. */ const struct variable **split; /* SPLIT FILE vars. */ size_t split_cnt; /* SPLIT FILE count. */ struct variable *weight; /* WEIGHT variable. */ struct variable *filter; /* FILTER variable. */ casenumber case_limit; /* Current case limit (N command). */ char *label; /* File label. */ struct string_array documents; /* Documents. */ struct vector **vector; /* Vectors of variables. */ size_t vector_cnt; /* Number of vectors. */ struct attrset attributes; /* Custom attributes. */ struct mrset **mrsets; /* Multiple response sets. */ size_t n_mrsets; /* Number of multiple response sets. */ /* Whether variable names must be valid identifiers. Normally, this is true, but sometimes a dictionary is prepared for external use (e.g. output to a CSV file) where names don't have to be valid. */ bool names_must_be_ids; char *encoding; /* Character encoding of string data */ const struct dict_callbacks *callbacks; /* Callbacks on dictionary modification */ void *cb_data ; /* Data passed to callbacks */ void (*changed) (struct dictionary *, void *); /* Generic change callback */ void *changed_data; }; static void dict_unset_split_var (struct dictionary *, struct variable *, bool); static void dict_unset_mrset_var (struct dictionary *, struct variable *); /* Compares two double pointers to variables, which should point to elements of a struct dictionary's `var' member array. */ static int compare_var_ptrs (const void *a_, const void *b_, const void *aux UNUSED) { struct variable *const *a = a_; struct variable *const *b = b_; return *a < *b ? -1 : *a > *b; } static void unindex_var (struct dictionary *d, struct vardict_info *vardict) { hmap_delete (&d->name_map, &vardict->name_node); } /* This function assumes that vardict->name_node.hash is valid, that is, that its name has not changed since it was hashed (rename_var() updates this hash along with the name itself). */ static void reindex_var (struct dictionary *d, struct vardict_info *vardict, bool skip_callbacks) { struct variable *old = (d->callbacks && d->callbacks->var_changed ? var_clone (vardict->var) : NULL); struct variable *var = vardict->var; var_set_vardict (var, vardict); hmap_insert_fast (&d->name_map, &vardict->name_node, vardict->name_node.hash); if (! skip_callbacks) { if (d->changed) d->changed (d, d->changed_data); if (old) { d->callbacks->var_changed (d, var_get_dict_index (var), VAR_TRAIT_POSITION, old, d->cb_data); var_unref (old); } } } /* Sets the case_index in V's vardict to CASE_INDEX. */ static void set_var_case_index (struct variable *v, int case_index) { var_get_vardict (v)->case_index = case_index; } /* Removes the dictionary variables with indexes from FROM to TO (exclusive) from name_map. */ static void unindex_vars (struct dictionary *d, size_t from, size_t to) { size_t i; for (i = from; i < to; i++) unindex_var (d, &d->var[i]); } /* Re-sets the dict_index in the dictionary variables with indexes from FROM to TO (exclusive). */ static void reindex_vars (struct dictionary *d, size_t from, size_t to, bool skip_callbacks) { size_t i; for (i = from; i < to; i++) reindex_var (d, &d->var[i], skip_callbacks); } /* Returns the encoding for data in dictionary D. The return value is a nonnull string that contains an IANA character set name. */ const char * dict_get_encoding (const struct dictionary *d) { return d->encoding ; } /* Returns true if UTF-8 string ID is an acceptable identifier in DICT's encoding, false otherwise. If ISSUE_ERROR is true, issues an explanatory error message on failure. */ bool dict_id_is_valid (const struct dictionary *dict, const char *id, bool issue_error) { return (!dict->names_must_be_ids || id_is_valid (id, dict->encoding, issue_error)); } void dict_set_change_callback (struct dictionary *d, void (*changed) (struct dictionary *, void*), void *data) { d->changed = changed; d->changed_data = data; } /* Discards dictionary D's caseproto. (It will be regenerated lazily, on demand.) */ static void invalidate_proto (struct dictionary *d) { caseproto_unref (d->proto); d->proto = NULL; } /* Print a representation of dictionary D to stdout, for debugging purposes. */ void dict_dump (const struct dictionary *d) { int i; for (i = 0 ; i < d->var_cnt ; ++i) { const struct variable *v = d->var[i].var; printf ("Name: %s;\tdict_idx: %zu; case_idx: %zu\n", var_get_name (v), var_get_dict_index (v), var_get_case_index (v)); } } /* Associate CALLBACKS with DICT. Callbacks will be invoked whenever the dictionary or any of the variables it contains are modified. Each callback will get passed CALLBACK_DATA. Any callback may be NULL, in which case it'll be ignored. */ void dict_set_callbacks (struct dictionary *dict, const struct dict_callbacks *callbacks, void *callback_data) { dict->callbacks = callbacks; dict->cb_data = callback_data; } /* Shallow copy the callbacks from SRC to DEST */ void dict_copy_callbacks (struct dictionary *dest, const struct dictionary *src) { dest->callbacks = src->callbacks; dest->cb_data = src->cb_data; } /* Creates and returns a new dictionary with the specified ENCODING. */ struct dictionary * dict_create (const char *encoding) { struct dictionary *d = xzalloc (sizeof *d); d->encoding = xstrdup (encoding); d->names_must_be_ids = true; hmap_init (&d->name_map); attrset_init (&d->attributes); d->ref_cnt = 1; return d; } /* Creates and returns a (deep) copy of an existing dictionary. The new dictionary's case indexes are copied from the old dictionary. If the new dictionary won't be used to access cases produced with the old dictionary, then the new dictionary's case indexes should be compacted with dict_compact_values to save space. Callbacks are not cloned. */ struct dictionary * dict_clone (const struct dictionary *s) { struct dictionary *d; size_t i; d = dict_create (s->encoding); dict_set_names_must_be_ids (d, dict_get_names_must_be_ids (s)); for (i = 0; i < s->var_cnt; i++) { struct variable *sv = s->var[i].var; struct variable *dv = dict_clone_var_assert (d, sv); size_t i; for (i = 0; i < var_get_short_name_cnt (sv); i++) var_set_short_name (dv, i, var_get_short_name (sv, i)); var_get_vardict (dv)->case_index = var_get_vardict (sv)->case_index; } d->next_value_idx = s->next_value_idx; d->split_cnt = s->split_cnt; if (d->split_cnt > 0) { d->split = xnmalloc (d->split_cnt, sizeof *d->split); for (i = 0; i < d->split_cnt; i++) d->split[i] = dict_lookup_var_assert (d, var_get_name (s->split[i])); } if (s->weight != NULL) dict_set_weight (d, dict_lookup_var_assert (d, var_get_name (s->weight))); if (s->filter != NULL) dict_set_filter (d, dict_lookup_var_assert (d, var_get_name (s->filter))); d->case_limit = s->case_limit; dict_set_label (d, dict_get_label (s)); dict_set_documents (d, dict_get_documents (s)); d->vector_cnt = s->vector_cnt; d->vector = xnmalloc (d->vector_cnt, sizeof *d->vector); for (i = 0; i < s->vector_cnt; i++) d->vector[i] = vector_clone (s->vector[i], s, d); dict_set_attributes (d, dict_get_attributes (s)); for (i = 0; i < s->n_mrsets; i++) { const struct mrset *old = s->mrsets[i]; struct mrset *new; size_t j; /* Clone old mrset, then replace vars from D by vars from S. */ new = mrset_clone (old); for (j = 0; j < new->n_vars; j++) new->vars[j] = dict_lookup_var_assert (d, var_get_name (new->vars[j])); dict_add_mrset (d, new); } return d; } /* Returns the SPLIT FILE vars (see cmd_split_file()). Call dict_get_split_cnt() to determine how many SPLIT FILE vars there are. Returns a null pointer if and only if there are no SPLIT FILE vars. */ const struct variable *const * dict_get_split_vars (const struct dictionary *d) { return d->split; } /* Returns the number of SPLIT FILE vars. */ size_t dict_get_split_cnt (const struct dictionary *d) { return d->split_cnt; } /* Removes variable V, which must be in D, from D's set of split variables. */ static void dict_unset_split_var (struct dictionary *d, struct variable *v, bool skip_callbacks) { int orig_count; assert (dict_contains_var (d, v)); orig_count = d->split_cnt; d->split_cnt = remove_equal (d->split, d->split_cnt, sizeof *d->split, &v, compare_var_ptrs, NULL); if (orig_count != d->split_cnt && !skip_callbacks) { if (d->changed) d->changed (d, d->changed_data); /* We changed the set of split variables so invoke the callback. */ if (d->callbacks && d->callbacks->split_changed) d->callbacks->split_changed (d, d->cb_data); } } /* Sets CNT split vars SPLIT in dictionary D. */ static void dict_set_split_vars__ (struct dictionary *d, struct variable *const *split, size_t cnt, bool skip_callbacks) { assert (cnt == 0 || split != NULL); d->split_cnt = cnt; if (cnt > 0) { d->split = xnrealloc (d->split, cnt, sizeof *d->split) ; memcpy (d->split, split, cnt * sizeof *d->split); } else { free (d->split); d->split = NULL; } if (!skip_callbacks) { if (d->changed) d->changed (d, d->changed_data); if (d->callbacks && d->callbacks->split_changed) d->callbacks->split_changed (d, d->cb_data); } } /* Sets CNT split vars SPLIT in dictionary D. */ void dict_set_split_vars (struct dictionary *d, struct variable *const *split, size_t cnt) { dict_set_split_vars__ (d, split, cnt, false); } /* Deletes variable V from dictionary D and frees V. This is a very bad idea if there might be any pointers to V from outside D. In general, no variable in the active dataset's dictionary should be deleted when any transformations are active on the dictionary's dataset, because those transformations might reference the deleted variable. The safest time to delete a variable is just after a procedure has been executed, as done by DELETE VARIABLES. Pointers to V within D are not a problem, because dict_delete_var() knows to remove V from split variables, weights, filters, etc. */ static void dict_delete_var__ (struct dictionary *d, struct variable *v, bool skip_callbacks) { int dict_index = var_get_dict_index (v); const int case_index = var_get_case_index (v); assert (dict_contains_var (d, v)); dict_unset_split_var (d, v, skip_callbacks); dict_unset_mrset_var (d, v); if (d->weight == v) dict_set_weight (d, NULL); if (d->filter == v) dict_set_filter (d, NULL); dict_clear_vectors (d); /* Remove V from var array. */ unindex_vars (d, dict_index, d->var_cnt); remove_element (d->var, d->var_cnt, sizeof *d->var, dict_index); d->var_cnt--; /* Update dict_index for each affected variable. */ reindex_vars (d, dict_index, d->var_cnt, skip_callbacks); /* Free memory. */ var_clear_vardict (v); if (! skip_callbacks) { if (d->changed) d->changed (d, d->changed_data); if (d->callbacks && d->callbacks->var_deleted) d->callbacks->var_deleted (d, v, dict_index, case_index, d->cb_data); } invalidate_proto (d); var_unref (v); } /* Deletes variable V from dictionary D and frees V. This is a very bad idea if there might be any pointers to V from outside D. In general, no variable in the active dataset's dictionary should be deleted when any transformations are active on the dictionary's dataset, because those transformations might reference the deleted variable. The safest time to delete a variable is just after a procedure has been executed, as done by DELETE VARIABLES. Pointers to V within D are not a problem, because dict_delete_var() knows to remove V from split variables, weights, filters, etc. */ void dict_delete_var (struct dictionary *d, struct variable *v) { dict_delete_var__ (d, v, false); } /* Deletes the COUNT variables listed in VARS from D. This is unsafe; see the comment on dict_delete_var() for details. */ void dict_delete_vars (struct dictionary *d, struct variable *const *vars, size_t count) { /* FIXME: this can be done in O(count) time, but this algorithm is O(count**2). */ assert (count == 0 || vars != NULL); while (count-- > 0) dict_delete_var (d, *vars++); } /* Deletes the COUNT variables in D starting at index IDX. This is unsafe; see the comment on dict_delete_var() for details. Deleting consecutive vars will result in less callbacks compared to iterating over dict_delete_var. A simple while loop over dict_delete_var will produce (d->var_cnt - IDX) * COUNT variable changed callbacks plus COUNT variable delete callbacks. This here produces d->var_cnt - IDX variable changed callbacks plus COUNT variable delete callbacks. */ void dict_delete_consecutive_vars (struct dictionary *d, size_t idx, size_t count) { assert (idx + count <= d->var_cnt); /* We need to store the variable and the corresponding case_index for the delete callbacks later. We store them in a linked list.*/ struct delvar { struct ll ll; struct variable *var; int case_index; }; struct ll_list list = LL_INITIALIZER (list); for (size_t i = idx; i < idx + count; i++) { struct delvar *dv = xmalloc (sizeof (struct delvar)); assert (dv); struct variable *v = d->var[i].var; dict_unset_split_var (d, v, false); dict_unset_mrset_var (d, v); if (d->weight == v) dict_set_weight (d, NULL); if (d->filter == v) dict_set_filter (d, NULL); dv->var = v; dv->case_index = var_get_case_index (v); ll_push_tail (&list, (struct ll *)dv); } dict_clear_vectors (d); /* Remove variables from var array. */ unindex_vars (d, idx, d->var_cnt); remove_range (d->var, d->var_cnt, sizeof *d->var, idx, count); d->var_cnt -= count; /* Reindexing will result variable-changed callback */ reindex_vars (d, idx, d->var_cnt, false); invalidate_proto (d); if (d->changed) d->changed (d, d->changed_data); /* Now issue the variable delete callbacks and delete the variables. The vardict is not valid at this point anymore. That is the reason why we stored the caseindex before reindexing. */ for (size_t vi = idx; vi < idx + count; vi++) { struct delvar *dv = (struct delvar *) ll_pop_head (&list); var_clear_vardict (dv->var); if (d->callbacks && d->callbacks->var_deleted) d->callbacks->var_deleted (d, dv->var, vi, dv->case_index, d->cb_data); var_unref (dv->var); free (dv); } } /* Deletes scratch variables from dictionary D. */ void dict_delete_scratch_vars (struct dictionary *d) { int i; /* FIXME: this can be done in O(count) time, but this algorithm is O(count**2). */ for (i = 0; i < d->var_cnt;) if (var_get_dict_class (d->var[i].var) == DC_SCRATCH) dict_delete_var (d, d->var[i].var); else i++; } /* Clears the contents from a dictionary without destroying the dictionary itself. */ static void dict_clear__ (struct dictionary *d, bool skip_callbacks) { /* FIXME? Should we really clear case_limit, label, documents? Others are necessarily cleared by deleting all the variables.*/ while (d->var_cnt > 0) { dict_delete_var__ (d, d->var[d->var_cnt - 1].var, skip_callbacks); } free (d->var); d->var = NULL; d->var_cnt = d->var_cap = 0; invalidate_proto (d); hmap_clear (&d->name_map); d->next_value_idx = 0; dict_set_split_vars__ (d, NULL, 0, skip_callbacks); if (skip_callbacks) { d->weight = NULL; d->filter = NULL; } else { dict_set_weight (d, NULL); dict_set_filter (d, NULL); } d->case_limit = 0; free (d->label); d->label = NULL; string_array_clear (&d->documents); dict_clear_vectors (d); attrset_clear (&d->attributes); } /* Clears the contents from a dictionary without destroying the dictionary itself. */ void dict_clear (struct dictionary *d) { dict_clear__ (d, false); } /* Clears a dictionary and destroys it. */ static void _dict_destroy (struct dictionary *d) { /* In general, we don't want callbacks occurring, if the dictionary is being destroyed */ d->callbacks = NULL ; dict_clear__ (d, true); string_array_destroy (&d->documents); hmap_destroy (&d->name_map); attrset_destroy (&d->attributes); dict_clear_mrsets (d); free (d->encoding); free (d); } struct dictionary * dict_ref (struct dictionary *d) { d->ref_cnt++; return d; } void dict_unref (struct dictionary *d) { if (d == NULL) return; d->ref_cnt--; assert (d->ref_cnt >= 0); if (d->ref_cnt == 0) _dict_destroy (d); } /* Returns the number of variables in D. */ size_t dict_get_var_cnt (const struct dictionary *d) { return d->var_cnt; } /* Returns the variable in D with dictionary index IDX, which must be between 0 and the count returned by dict_get_var_cnt(), exclusive. */ struct variable * dict_get_var (const struct dictionary *d, size_t idx) { assert (idx < d->var_cnt); return d->var[idx].var; } /* Sets *VARS to an array of pointers to variables in D and *CNT to the number of variables in *D. All variables are returned except for those, if any, in the classes indicated by EXCLUDE. (There is no point in putting DC_SYSTEM in EXCLUDE as dictionaries never include system variables.) */ void dict_get_vars (const struct dictionary *d, const struct variable ***vars, size_t *cnt, enum dict_class exclude) { dict_get_vars_mutable (d, (struct variable ***) vars, cnt, exclude); } /* Sets *VARS to an array of pointers to variables in D and *CNT to the number of variables in *D. All variables are returned except for those, if any, in the classes indicated by EXCLUDE. (There is no point in putting DC_SYSTEM in EXCLUDE as dictionaries never include system variables.) */ void dict_get_vars_mutable (const struct dictionary *d, struct variable ***vars, size_t *cnt, enum dict_class exclude) { size_t count; size_t i; assert (exclude == (exclude & DC_ALL)); count = 0; for (i = 0; i < d->var_cnt; i++) { enum dict_class class = var_get_dict_class (d->var[i].var); if (!(class & exclude)) count++; } *vars = xnmalloc (count, sizeof **vars); *cnt = 0; for (i = 0; i < d->var_cnt; i++) { enum dict_class class = var_get_dict_class (d->var[i].var); if (!(class & exclude)) (*vars)[(*cnt)++] = d->var[i].var; } assert (*cnt == count); } static struct variable * add_var_with_case_index (struct dictionary *d, struct variable *v, int case_index) { struct vardict_info *vardict; assert (case_index >= d->next_value_idx); /* Update dictionary. */ if (d->var_cnt >= d->var_cap) { size_t i; d->var = x2nrealloc (d->var, &d->var_cap, sizeof *d->var); hmap_clear (&d->name_map); for (i = 0; i < d->var_cnt; i++) { var_set_vardict (d->var[i].var, &d->var[i]); hmap_insert_fast (&d->name_map, &d->var[i].name_node, d->var[i].name_node.hash); } } vardict = &d->var[d->var_cnt++]; vardict->dict = d; vardict->var = v; hmap_insert (&d->name_map, &vardict->name_node, utf8_hash_case_string (var_get_name (v), 0)); vardict->case_index = case_index; var_set_vardict (v, vardict); if (d->changed) d->changed (d, d->changed_data); if (d->callbacks && d->callbacks->var_added) d->callbacks->var_added (d, var_get_dict_index (v), d->cb_data); invalidate_proto (d); d->next_value_idx = case_index + 1; return v; } static struct variable * add_var (struct dictionary *d, struct variable *v) { return add_var_with_case_index (d, v, d->next_value_idx); } /* Creates and returns a new variable in D with the given NAME and WIDTH. Returns a null pointer if the given NAME would duplicate that of an existing variable in the dictionary. */ struct variable * dict_create_var (struct dictionary *d, const char *name, int width) { return (dict_lookup_var (d, name) == NULL ? dict_create_var_assert (d, name, width) : NULL); } /* Creates and returns a new variable in D with the given NAME and WIDTH. Assert-fails if the given NAME would duplicate that of an existing variable in the dictionary. */ struct variable * dict_create_var_assert (struct dictionary *d, const char *name, int width) { assert (dict_lookup_var (d, name) == NULL); return add_var (d, var_create (name, width)); } /* Creates and returns a new variable in D, as a copy of existing variable OLD_VAR, which need not be in D or in any dictionary. Returns a null pointer if OLD_VAR's name would duplicate that of an existing variable in the dictionary. */ struct variable * dict_clone_var (struct dictionary *d, const struct variable *old_var) { return dict_clone_var_as (d, old_var, var_get_name (old_var)); } /* Creates and returns a new variable in D, as a copy of existing variable OLD_VAR, which need not be in D or in any dictionary. Assert-fails if OLD_VAR's name would duplicate that of an existing variable in the dictionary. */ struct variable * dict_clone_var_assert (struct dictionary *d, const struct variable *old_var) { return dict_clone_var_as_assert (d, old_var, var_get_name (old_var)); } /* Creates and returns a new variable in D with name NAME, as a copy of existing variable OLD_VAR, which need not be in D or in any dictionary. Returns a null pointer if the given NAME would duplicate that of an existing variable in the dictionary. */ struct variable * dict_clone_var_as (struct dictionary *d, const struct variable *old_var, const char *name) { return (dict_lookup_var (d, name) == NULL ? dict_clone_var_as_assert (d, old_var, name) : NULL); } /* Creates and returns a new variable in D with name NAME, as a copy of existing variable OLD_VAR, which need not be in D or in any dictionary. Assert-fails if the given NAME would duplicate that of an existing variable in the dictionary. */ struct variable * dict_clone_var_as_assert (struct dictionary *d, const struct variable *old_var, const char *name) { struct variable *new_var = var_clone (old_var); assert (dict_lookup_var (d, name) == NULL); var_set_name (new_var, name); return add_var (d, new_var); } struct variable * dict_clone_var_in_place_assert (struct dictionary *d, const struct variable *old_var) { assert (dict_lookup_var (d, var_get_name (old_var)) == NULL); return add_var_with_case_index (d, var_clone (old_var), var_get_case_index (old_var)); } /* Returns the variable named NAME in D, or a null pointer if no variable has that name. */ struct variable * dict_lookup_var (const struct dictionary *d, const char *name) { struct vardict_info *vardict; HMAP_FOR_EACH_WITH_HASH (vardict, struct vardict_info, name_node, utf8_hash_case_string (name, 0), &d->name_map) { struct variable *var = vardict->var; if (!utf8_strcasecmp (var_get_name (var), name)) return var; } return NULL; } /* Returns the variable named NAME in D. Assert-fails if no variable has that name. */ struct variable * dict_lookup_var_assert (const struct dictionary *d, const char *name) { struct variable *v = dict_lookup_var (d, name); assert (v != NULL); return v; } /* Returns true if variable V is in dictionary D, false otherwise. */ bool dict_contains_var (const struct dictionary *d, const struct variable *v) { return (var_has_vardict (v) && vardict_get_dictionary (var_get_vardict (v)) == d); } /* Moves V to 0-based position IDX in D. Other variables in D, if any, retain their relative positions. Runs in time linear in the distance moved. */ void dict_reorder_var (struct dictionary *d, struct variable *v, size_t new_index) { size_t old_index = var_get_dict_index (v); assert (new_index < d->var_cnt); unindex_vars (d, MIN (old_index, new_index), MAX (old_index, new_index) + 1); move_element (d->var, d->var_cnt, sizeof *d->var, old_index, new_index); reindex_vars (d, MIN (old_index, new_index), MAX (old_index, new_index) + 1, false); } /* Reorders the variables in D, placing the COUNT variables listed in ORDER in that order at the beginning of D. The other variables in D, if any, retain their relative positions. */ void dict_reorder_vars (struct dictionary *d, struct variable *const *order, size_t count) { struct vardict_info *new_var; size_t i; assert (count == 0 || order != NULL); assert (count <= d->var_cnt); new_var = xnmalloc (d->var_cap, sizeof *new_var); /* Add variables in ORDER to new_var. */ for (i = 0; i < count; i++) { struct vardict_info *old_var; assert (dict_contains_var (d, order[i])); old_var = var_get_vardict (order[i]); new_var[i] = *old_var; old_var->dict = NULL; } /* Add remaining variables to new_var. */ for (i = 0; i < d->var_cnt; i++) if (d->var[i].dict != NULL) new_var[count++] = d->var[i]; assert (count == d->var_cnt); /* Replace old vardicts by new ones. */ free (d->var); d->var = new_var; hmap_clear (&d->name_map); reindex_vars (d, 0, d->var_cnt, false); } /* Changes the name of variable V that is currently in a dictionary to NEW_NAME. */ static void rename_var (struct variable *v, const char *new_name) { struct vardict_info *vardict = var_get_vardict (v); var_clear_vardict (v); var_set_name (v, new_name); vardict->name_node.hash = utf8_hash_case_string (new_name, 0); var_set_vardict (v, vardict); } /* Tries to changes the name of V in D to name NEW_NAME. Returns true if successful, false if a variable (other than V) with the given name already exists in D. */ bool dict_try_rename_var (struct dictionary *d, struct variable *v, const char *new_name) { struct variable *conflict = dict_lookup_var (d, new_name); if (conflict && v != conflict) return false; struct variable *old = var_clone (v); unindex_var (d, var_get_vardict (v)); rename_var (v, new_name); reindex_var (d, var_get_vardict (v), false); if (settings_get_algorithm () == ENHANCED) var_clear_short_names (v); if (d->changed) d->changed (d, d->changed_data); if (d->callbacks && d->callbacks->var_changed) d->callbacks->var_changed (d, var_get_dict_index (v), VAR_TRAIT_NAME, old, d->cb_data); var_unref (old); return true; } /* Changes the name of V in D to name NEW_NAME. Assert-fails if a variable named NEW_NAME is already in D, except that NEW_NAME may be the same as V's existing name. */ void dict_rename_var (struct dictionary *d, struct variable *v, const char *new_name) { bool ok UNUSED = dict_try_rename_var (d, v, new_name); assert (ok); } /* Renames COUNT variables specified in VARS to the names given in NEW_NAMES within dictionary D. If the renaming would result in a duplicate variable name, returns false and stores a name that would be duplicated into *ERR_NAME (if ERR_NAME is non-null). Otherwise, the renaming is successful, and true is returned. */ bool dict_rename_vars (struct dictionary *d, struct variable **vars, char **new_names, size_t count, char **err_name) { struct pool *pool; char **old_names; size_t i; assert (count == 0 || vars != NULL); assert (count == 0 || new_names != NULL); /* Save the names of the variables to be renamed. */ pool = pool_create (); old_names = pool_nalloc (pool, count, sizeof *old_names); for (i = 0; i < count; i++) old_names[i] = pool_strdup (pool, var_get_name (vars[i])); /* Remove the variables to be renamed from the name hash, and rename them. */ for (i = 0; i < count; i++) { unindex_var (d, var_get_vardict (vars[i])); rename_var (vars[i], new_names[i]); } /* Add the renamed variables back into the name hash, checking for conflicts. */ for (i = 0; i < count; i++) { if (dict_lookup_var (d, var_get_name (vars[i])) != NULL) { /* There is a name conflict. Back out all the name changes that have already taken place, and indicate failure. */ size_t fail_idx = i; if (err_name != NULL) *err_name = new_names[i]; for (i = 0; i < fail_idx; i++) unindex_var (d, var_get_vardict (vars[i])); for (i = 0; i < count; i++) { rename_var (vars[i], old_names[i]); reindex_var (d, var_get_vardict (vars[i]), false); } pool_destroy (pool); return false; } reindex_var (d, var_get_vardict (vars[i]), false); } /* Clear short names. */ if (settings_get_algorithm () == ENHANCED) for (i = 0; i < count; i++) var_clear_short_names (vars[i]); pool_destroy (pool); return true; } /* Returns true if a variable named NAME may be inserted in DICT; that is, if there is not already a variable with that name in DICT and if NAME is not a reserved word. (The caller's checks have already verified that NAME is otherwise acceptable as a variable name.) */ static bool var_name_is_insertable (const struct dictionary *dict, const char *name) { return (dict_lookup_var (dict, name) == NULL && lex_id_to_token (ss_cstr (name)) == T_ID); } static char * make_hinted_name (const struct dictionary *dict, const char *hint) { size_t hint_len = strlen (hint); bool dropped = false; char *root, *rp; size_t ofs; int mblen; /* The allocation size here is OK: characters that are copied directly fit OK, and characters that are not copied directly are replaced by a single '_' byte. If u8_mbtouc() replaces bad input by 0xfffd, then that will get replaced by '_' too. */ root = rp = xmalloc (hint_len + 1); for (ofs = 0; ofs < hint_len; ofs += mblen) { ucs4_t uc; mblen = u8_mbtouc (&uc, CHAR_CAST (const uint8_t *, hint + ofs), hint_len - ofs); if (rp == root ? lex_uc_is_id1 (uc) && uc != '$' : lex_uc_is_idn (uc)) { if (dropped) { *rp++ = '_'; dropped = false; } rp += u8_uctomb (CHAR_CAST (uint8_t *, rp), uc, 6); } else if (rp != root) dropped = true; } *rp = '\0'; if (root[0] != '\0') { unsigned long int i; if (var_name_is_insertable (dict, root)) return root; for (i = 0; i < ULONG_MAX; i++) { char suffix[INT_BUFSIZE_BOUND (i) + 1]; char *name; suffix[0] = '_'; if (!str_format_26adic (i + 1, true, &suffix[1], sizeof suffix - 1)) NOT_REACHED (); name = utf8_encoding_concat (root, suffix, dict->encoding, 64); if (var_name_is_insertable (dict, name)) { free (root); return name; } free (name); } } free (root); return NULL; } static char * make_numeric_name (const struct dictionary *dict, unsigned long int *num_start) { unsigned long int number; for (number = num_start != NULL ? MAX (*num_start, 1) : 1; number < ULONG_MAX; number++) { char name[3 + INT_STRLEN_BOUND (number) + 1]; sprintf (name, "VAR%03lu", number); if (dict_lookup_var (dict, name) == NULL) { if (num_start != NULL) *num_start = number + 1; return xstrdup (name); } } NOT_REACHED (); } /* Devises and returns a variable name unique within DICT. The variable name is owned by the caller, which must free it with free() when it is no longer needed. HINT, if it is non-null, is used as a suggestion that will be modified for suitability as a variable name and for uniqueness. If HINT is null or entirely unsuitable, a name in the form "VAR%03d" will be generated, where the smallest unused integer value is used. If NUM_START is non-null, then its value is used as the minimum numeric value to check, and it is updated to the next value to be checked. */ char * dict_make_unique_var_name (const struct dictionary *dict, const char *hint, unsigned long int *num_start) { if (hint != NULL) { char *hinted_name = make_hinted_name (dict, hint); if (hinted_name != NULL) return hinted_name; } return make_numeric_name (dict, num_start); } /* Returns whether variable names must be valid identifiers. Normally, this is true, but sometimes a dictionary is prepared for external use (e.g. output to a CSV file) where names don't have to be valid. */ bool dict_get_names_must_be_ids (const struct dictionary *d) { return d->names_must_be_ids; } /* Sets whether variable names must be valid identifiers. Normally, this is true, but sometimes a dictionary is prepared for external use (e.g. output to a CSV file) where names don't have to be valid. Changing this setting from false to true doesn't make the dictionary check all the existing variable names, so it can cause an invariant violation. */ void dict_set_names_must_be_ids (struct dictionary *d, bool names_must_be_ids) { d->names_must_be_ids = names_must_be_ids; } /* Returns the weighting variable in dictionary D, or a null pointer if the dictionary is unweighted. */ struct variable * dict_get_weight (const struct dictionary *d) { assert (d->weight == NULL || dict_contains_var (d, d->weight)); return d->weight; } /* Returns the value of D's weighting variable in case C, except that a negative weight is returned as 0. Returns 1 if the dictionary is unweighted. Will warn about missing, negative, or zero values if *WARN_ON_INVALID is true. The function will set *WARN_ON_INVALID to false if an invalid weight is found. */ double dict_get_case_weight (const struct dictionary *d, const struct ccase *c, bool *warn_on_invalid) { assert (c != NULL); if (d->weight == NULL) return 1.0; else { double w = case_num (c, d->weight); return var_force_valid_weight (d->weight, w, warn_on_invalid); } } /* Returns the format to use for weights. */ const struct fmt_spec * dict_get_weight_format (const struct dictionary *d) { return d->weight ? var_get_print_format (d->weight) : &F_8_0; } /* Sets the weighting variable of D to V, or turning off weighting if V is a null pointer. */ void dict_set_weight (struct dictionary *d, struct variable *v) { assert (v == NULL || dict_contains_var (d, v)); assert (v == NULL || var_is_numeric (v)); d->weight = v; if (d->changed) d->changed (d, d->changed_data); if (d->callbacks && d->callbacks->weight_changed) d->callbacks->weight_changed (d, v ? var_get_dict_index (v) : -1, d->cb_data); } /* Returns the filter variable in dictionary D (see cmd_filter()) or a null pointer if the dictionary is unfiltered. */ struct variable * dict_get_filter (const struct dictionary *d) { assert (d->filter == NULL || dict_contains_var (d, d->filter)); return d->filter; } /* Sets V as the filter variable for dictionary D. Passing a null pointer for V turn off filtering. */ void dict_set_filter (struct dictionary *d, struct variable *v) { assert (v == NULL || dict_contains_var (d, v)); assert (v == NULL || var_is_numeric (v)); d->filter = v; if (d->changed) d->changed (d, d->changed_data); if (d->callbacks && d->callbacks->filter_changed) d->callbacks->filter_changed (d, v ? var_get_dict_index (v) : -1, d->cb_data); } /* Returns the case limit for dictionary D, or zero if the number of cases is unlimited. */ casenumber dict_get_case_limit (const struct dictionary *d) { return d->case_limit; } /* Sets CASE_LIMIT as the case limit for dictionary D. Use 0 for CASE_LIMIT to indicate no limit. */ void dict_set_case_limit (struct dictionary *d, casenumber case_limit) { d->case_limit = case_limit; } /* Returns the prototype used for cases created by dictionary D. */ const struct caseproto * dict_get_proto (const struct dictionary *d_) { struct dictionary *d = CONST_CAST (struct dictionary *, d_); if (d->proto == NULL) { size_t i; d->proto = caseproto_create (); d->proto = caseproto_reserve (d->proto, d->var_cnt); for (i = 0; i < d->var_cnt; i++) d->proto = caseproto_set_width (d->proto, var_get_case_index (d->var[i].var), var_get_width (d->var[i].var)); } return d->proto; } /* Returns the case index of the next value to be added to D. This value is the number of `union value's that need to be allocated to store a case for dictionary D. */ int dict_get_next_value_idx (const struct dictionary *d) { return d->next_value_idx; } /* Returns the number of bytes needed to store a case for dictionary D. */ size_t dict_get_case_size (const struct dictionary *d) { return sizeof (union value) * dict_get_next_value_idx (d); } /* Reassigns values in dictionary D so that fragmentation is eliminated. */ void dict_compact_values (struct dictionary *d) { size_t i; d->next_value_idx = 0; for (i = 0; i < d->var_cnt; i++) { struct variable *v = d->var[i].var; set_var_case_index (v, d->next_value_idx++); } invalidate_proto (d); } /* Returns the number of values occupied by the variables in dictionary D. All variables are considered if EXCLUDE_CLASSES is 0, or it may contain one or more of (1u << DC_ORDINARY), (1u << DC_SYSTEM), or (1u << DC_SCRATCH) to exclude the corresponding type of variable. The return value may be less than the number of values in one of dictionary D's cases (as returned by dict_get_next_value_idx) even if E is 0, because there may be gaps in D's cases due to deleted variables. */ size_t dict_count_values (const struct dictionary *d, unsigned int exclude_classes) { size_t i; size_t cnt; assert ((exclude_classes & ~((1u << DC_ORDINARY) | (1u << DC_SYSTEM) | (1u << DC_SCRATCH))) == 0); cnt = 0; for (i = 0; i < d->var_cnt; i++) { enum dict_class class = var_get_dict_class (d->var[i].var); if (!(exclude_classes & (1u << class))) cnt++; } return cnt; } /* Returns the case prototype that would result after deleting all variables from D that are not in one of the EXCLUDE_CLASSES and compacting the dictionary with dict_compact(). The caller must unref the returned caseproto when it is no longer needed. */ struct caseproto * dict_get_compacted_proto (const struct dictionary *d, unsigned int exclude_classes) { struct caseproto *proto; size_t i; assert ((exclude_classes & ~((1u << DC_ORDINARY) | (1u << DC_SYSTEM) | (1u << DC_SCRATCH))) == 0); proto = caseproto_create (); for (i = 0; i < d->var_cnt; i++) { struct variable *v = d->var[i].var; if (!(exclude_classes & (1u << var_get_dict_class (v)))) proto = caseproto_add_width (proto, var_get_width (v)); } return proto; } /* Returns the file label for D, or a null pointer if D is unlabeled (see cmd_file_label()). */ const char * dict_get_label (const struct dictionary *d) { return d->label; } /* Sets D's file label to LABEL, truncating it to at most 60 bytes in D's encoding. Removes D's label if LABEL is null or the empty string. */ void dict_set_label (struct dictionary *d, const char *label) { free (d->label); if (label == NULL || label[0] == '\0') d->label = NULL; else d->label = utf8_encoding_trunc (label, d->encoding, 60); } /* Returns the documents for D, as an UTF-8 encoded string_array. The return value is always nonnull; if there are no documents then the string_arary is empty.*/ const struct string_array * dict_get_documents (const struct dictionary *d) { return &d->documents; } /* Replaces the documents for D by NEW_DOCS, a UTF-8 encoded string_array. */ void dict_set_documents (struct dictionary *d, const struct string_array *new_docs) { size_t i; dict_clear_documents (d); for (i = 0; i < new_docs->n; i++) dict_add_document_line (d, new_docs->strings[i], false); } /* Replaces the documents for D by UTF-8 encoded string NEW_DOCS, dividing it into individual lines at new-line characters. Each line is truncated to at most DOC_LINE_LENGTH bytes in D's encoding. */ void dict_set_documents_string (struct dictionary *d, const char *new_docs) { const char *s; dict_clear_documents (d); for (s = new_docs; *s != '\0';) { size_t len = strcspn (s, "\n"); char *line = xmemdup0 (s, len); dict_add_document_line (d, line, false); free (line); s += len; if (*s == '\n') s++; } } /* Drops the documents from dictionary D. */ void dict_clear_documents (struct dictionary *d) { string_array_clear (&d->documents); } /* Appends the UTF-8 encoded LINE to the documents in D. LINE will be truncated so that it is no more than 80 bytes in the dictionary's encoding. If this causes some text to be lost, and ISSUE_WARNING is true, then a warning will be issued. */ bool dict_add_document_line (struct dictionary *d, const char *line, bool issue_warning) { size_t trunc_len; bool truncated; trunc_len = utf8_encoding_trunc_len (line, d->encoding, DOC_LINE_LENGTH); truncated = line[trunc_len] != '\0'; if (truncated && issue_warning) { /* Note to translators: "bytes" is correct, not characters */ msg (SW, _("Truncating document line to %d bytes."), DOC_LINE_LENGTH); } string_array_append_nocopy (&d->documents, xmemdup0 (line, trunc_len)); return !truncated; } /* Returns the number of document lines in dictionary D. */ size_t dict_get_document_line_cnt (const struct dictionary *d) { return d->documents.n; } /* Returns document line number IDX in dictionary D. The caller must not modify or free the returned string. */ const char * dict_get_document_line (const struct dictionary *d, size_t idx) { assert (idx < d->documents.n); return d->documents.strings[idx]; } /* Creates in D a vector named NAME that contains the CNT variables in VAR. Returns true if successful, or false if a vector named NAME already exists in D. */ bool dict_create_vector (struct dictionary *d, const char *name, struct variable **var, size_t cnt) { size_t i; assert (cnt > 0); for (i = 0; i < cnt; i++) assert (dict_contains_var (d, var[i])); if (dict_lookup_vector (d, name) == NULL) { d->vector = xnrealloc (d->vector, d->vector_cnt + 1, sizeof *d->vector); d->vector[d->vector_cnt++] = vector_create (name, var, cnt); return true; } else return false; } /* Creates in D a vector named NAME that contains the CNT variables in VAR. A vector named NAME must not already exist in D. */ void dict_create_vector_assert (struct dictionary *d, const char *name, struct variable **var, size_t cnt) { assert (dict_lookup_vector (d, name) == NULL); dict_create_vector (d, name, var, cnt); } /* Returns the vector in D with index IDX, which must be less than dict_get_vector_cnt (D). */ const struct vector * dict_get_vector (const struct dictionary *d, size_t idx) { assert (idx < d->vector_cnt); return d->vector[idx]; } /* Returns the number of vectors in D. */ size_t dict_get_vector_cnt (const struct dictionary *d) { return d->vector_cnt; } /* Looks up and returns the vector within D with the given NAME. */ const struct vector * dict_lookup_vector (const struct dictionary *d, const char *name) { size_t i; for (i = 0; i < d->vector_cnt; i++) if (!utf8_strcasecmp (vector_get_name (d->vector[i]), name)) return d->vector[i]; return NULL; } /* Deletes all vectors from D. */ void dict_clear_vectors (struct dictionary *d) { size_t i; for (i = 0; i < d->vector_cnt; i++) vector_destroy (d->vector[i]); free (d->vector); d->vector = NULL; d->vector_cnt = 0; } /* Multiple response sets. */ /* Returns the multiple response set in DICT with index IDX, which must be between 0 and the count returned by dict_get_n_mrsets(), exclusive. */ const struct mrset * dict_get_mrset (const struct dictionary *dict, size_t idx) { assert (idx < dict->n_mrsets); return dict->mrsets[idx]; } /* Returns the number of multiple response sets in DICT. */ size_t dict_get_n_mrsets (const struct dictionary *dict) { return dict->n_mrsets; } /* Looks for a multiple response set named NAME in DICT. If it finds one, returns its index; otherwise, returns SIZE_MAX. */ static size_t dict_lookup_mrset_idx (const struct dictionary *dict, const char *name) { size_t i; for (i = 0; i < dict->n_mrsets; i++) if (!utf8_strcasecmp (name, dict->mrsets[i]->name)) return i; return SIZE_MAX; } /* Looks for a multiple response set named NAME in DICT. If it finds one, returns it; otherwise, returns NULL. */ const struct mrset * dict_lookup_mrset (const struct dictionary *dict, const char *name) { size_t idx = dict_lookup_mrset_idx (dict, name); return idx != SIZE_MAX ? dict->mrsets[idx] : NULL; } /* Adds MRSET to DICT, replacing any existing set with the same name. Returns true if a set was replaced, false if none existed with the specified name. Ownership of MRSET is transferred to DICT. */ bool dict_add_mrset (struct dictionary *dict, struct mrset *mrset) { size_t idx; assert (mrset_ok (mrset, dict)); idx = dict_lookup_mrset_idx (dict, mrset->name); if (idx == SIZE_MAX) { dict->mrsets = xrealloc (dict->mrsets, (dict->n_mrsets + 1) * sizeof *dict->mrsets); dict->mrsets[dict->n_mrsets++] = mrset; return true; } else { mrset_destroy (dict->mrsets[idx]); dict->mrsets[idx] = mrset; return false; } } /* Looks for a multiple response set in DICT named NAME. If found, removes it from DICT and returns true. If none is found, returns false without modifying DICT. Deleting one multiple response set causes the indexes of other sets within DICT to change. */ bool dict_delete_mrset (struct dictionary *dict, const char *name) { size_t idx = dict_lookup_mrset_idx (dict, name); if (idx != SIZE_MAX) { mrset_destroy (dict->mrsets[idx]); dict->mrsets[idx] = dict->mrsets[--dict->n_mrsets]; return true; } else return false; } /* Deletes all multiple response sets from DICT. */ void dict_clear_mrsets (struct dictionary *dict) { size_t i; for (i = 0; i < dict->n_mrsets; i++) mrset_destroy (dict->mrsets[i]); free (dict->mrsets); dict->mrsets = NULL; dict->n_mrsets = 0; } /* Removes VAR, which must be in DICT, from DICT's multiple response sets. */ static void dict_unset_mrset_var (struct dictionary *dict, struct variable *var) { size_t i; assert (dict_contains_var (dict, var)); for (i = 0; i < dict->n_mrsets;) { struct mrset *mrset = dict->mrsets[i]; size_t j; for (j = 0; j < mrset->n_vars;) if (mrset->vars[j] == var) remove_element (mrset->vars, mrset->n_vars--, sizeof *mrset->vars, j); else j++; if (mrset->n_vars < 2) { mrset_destroy (mrset); dict->mrsets[i] = dict->mrsets[--dict->n_mrsets]; } else i++; } } /* Returns D's attribute set. The caller may examine or modify the attribute set, but must not destroy it. Destroying D or calling dict_set_attributes for D will also destroy D's attribute set. */ struct attrset * dict_get_attributes (const struct dictionary *d) { return CONST_CAST (struct attrset *, &d->attributes); } /* Replaces D's attributes set by a copy of ATTRS. */ void dict_set_attributes (struct dictionary *d, const struct attrset *attrs) { attrset_destroy (&d->attributes); attrset_clone (&d->attributes, attrs); } /* Returns true if D has at least one attribute in its attribute set, false if D's attribute set is empty. */ bool dict_has_attributes (const struct dictionary *d) { return attrset_count (&d->attributes) > 0; } /* Called from variable.c to notify the dictionary that some property (indicated by WHAT) of the variable has changed. OLDVAR is a copy of V as it existed prior to the change. OLDVAR is destroyed by this function. */ void dict_var_changed (const struct variable *v, unsigned int what, struct variable *oldvar) { if (var_has_vardict (v)) { const struct vardict_info *vardict = var_get_vardict (v); struct dictionary *d = vardict->dict; if (NULL == d) return; if (what & (VAR_TRAIT_WIDTH | VAR_TRAIT_POSITION)) invalidate_proto (d); if (d->changed) d->changed (d, d->changed_data); if (d->callbacks && d->callbacks->var_changed) d->callbacks->var_changed (d, var_get_dict_index (v), what, oldvar, d->cb_data); } var_unref (oldvar); } /* Dictionary used to contain "internal variables". */ static struct dictionary *internal_dict; /* Create a variable of the specified WIDTH to be used for internal calculations only. The variable is assigned case index CASE_IDX. */ struct variable * dict_create_internal_var (int case_idx, int width) { if (internal_dict == NULL) internal_dict = dict_create ("UTF-8"); for (;;) { static int counter = INT_MAX / 2; struct variable *var; char name[64]; if (++counter == INT_MAX) counter = INT_MAX / 2; sprintf (name, "$internal%d", counter); var = dict_create_var (internal_dict, name, width); if (var != NULL) { set_var_case_index (var, case_idx); return var; } } } /* Destroys VAR, which must have been created with dict_create_internal_var(). */ void dict_destroy_internal_var (struct variable *var) { if (var != NULL) { dict_delete_var (internal_dict, var); /* Destroy internal_dict if it has no variables left, just so that valgrind --leak-check --show-reachable won't show internal_dict. */ if (dict_get_var_cnt (internal_dict) == 0) { dict_unref (internal_dict); internal_dict = NULL; } } } int vardict_get_dict_index (const struct vardict_info *vardict) { return vardict - vardict->dict->var; } pspp-1.4.1/src/data/settings.h0000644000175000017500000001276513670210420015632 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 1997-9, 2000, 2006, 2009, 2010, 2015 Free Software Foundation, Inc. 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 3 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, see . */ #if !settings_h #define settings_h 1 #include #include #include "data/format.h" #include "libpspp/float-format.h" #include "libpspp/integer-format.h" #include "libpspp/message.h" struct caseproto; struct settings; void settings_init (void); void settings_done (void); struct settings *settings_get (void); void settings_set (const struct settings *); void settings_destroy (struct settings *); enum float_format settings_get_input_float_format (void); void settings_set_input_float_format (enum float_format); /* Returns the integer format used for IB and PIB input. */ enum integer_format settings_get_input_integer_format (void); /* Sets the integer format used for IB and PIB input to FORMAT. */ void settings_set_input_integer_format (enum integer_format); /* Returns the current output integer format. */ enum integer_format settings_get_output_integer_format (void); /* Sets the output integer format to INTEGER_FORMAT. */ void settings_set_output_integer_format (enum integer_format integer_format); /* Returns the current output float format. */ enum float_format settings_get_output_float_format (void); /* Sets the output float format to FLOAT_FORMAT. */ void settings_set_output_float_format (enum float_format float_format); int settings_get_viewlength (void); void settings_set_viewlength (int); int settings_get_viewwidth (void); void settings_set_viewwidth (int); bool settings_get_safer_mode (void); void settings_set_safer_mode (void); bool settings_get_include (void); void settings_set_include (bool); int settings_get_epoch (void); void settings_set_epoch (int); bool settings_get_scompression (void); void settings_set_scompression (bool); bool settings_get_undefined (void); void settings_set_undefined (bool); double settings_get_blanks (void); void settings_set_blanks (double); int settings_get_max_messages (enum msg_severity); void settings_set_max_messages (enum msg_severity, int max); bool settings_get_mprint (void); void settings_set_mprint (bool); int settings_get_mxloops (void); void settings_set_mxloops (int); size_t settings_get_workspace (void); size_t settings_get_workspace_cases (const struct caseproto *); void settings_set_workspace (size_t); const struct fmt_spec *settings_get_format (void); void settings_set_format (const struct fmt_spec *); bool settings_get_testing_mode (void); void settings_set_testing_mode (bool); int settings_get_fuzzbits (void); void settings_set_fuzzbits (int); /* Whether to show variable or value labels or the underlying value or variable name. */ enum settings_value_show { /* Use higher-level default. In a pivot_value, the default is taken from the pivot_table. In a pivot_table, the default is a global default. As a global default, this is invalid. */ SETTINGS_VALUE_SHOW_DEFAULT = 0, SETTINGS_VALUE_SHOW_VALUE = 1, /* Show value or variable name only. */ SETTINGS_VALUE_SHOW_LABEL = 2, /* Show label only. */ SETTINGS_VALUE_SHOW_BOTH = 3, /* Show both value/name and label. */ }; enum settings_value_show settings_get_show_values (void); enum settings_value_show settings_get_show_variables (void); void settings_set_show_values (enum settings_value_show); void settings_set_show_variables (enum settings_value_show); enum behavior_mode { ENHANCED, /* Use improved PSPP behavior. */ COMPATIBLE /* Be as compatible as possible. */ }; enum behavior_mode settings_get_algorithm (void); void settings_set_algorithm (enum behavior_mode); enum behavior_mode settings_get_syntax (void); void settings_set_syntax (enum behavior_mode); void settings_set_cmd_algorithm (enum behavior_mode); void unset_cmd_algorithm (void); enum fmt_type; bool settings_set_cc (const char *cc_string, enum fmt_type type); int settings_get_decimal_char (enum fmt_type type); void settings_set_decimal_char (char decimal); const struct fmt_number_style * settings_get_style (enum fmt_type type); char * settings_dollar_template (const struct fmt_spec *fmt); /* Routing of different kinds of output. */ enum settings_output_devices { SETTINGS_DEVICE_LISTING = 1 << 0, /* File or device. */ SETTINGS_DEVICE_TERMINAL = 1 << 1, /* Screen. */ SETTINGS_DEVICE_UNFILTERED = 1 << 2 /* Gets all output, no filtering. */ }; enum settings_output_type { SETTINGS_OUTPUT_ERROR, /* Errors and warnings. */ SETTINGS_OUTPUT_NOTE, /* Notes. */ SETTINGS_OUTPUT_SYNTAX, /* Syntax. */ SETTINGS_OUTPUT_RESULT, /* Everything else. */ SETTINGS_N_OUTPUT_TYPES }; void settings_set_output_routing (enum settings_output_type, enum settings_output_devices); enum settings_output_devices settings_get_output_routing ( enum settings_output_type); #endif /* !settings_h */ pspp-1.4.1/src/data/dataset.h0000644000175000017500000001056013320146056015413 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 1997-9, 2000, 2006, 2007, 2009, 2010, 2011, 2013 Free Software Foundation, Inc. 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 3 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, see . */ #ifndef PROCEDURE_H #define PROCEDURE_H 1 #include #include #include "data/transformations.h" struct casereader; struct dataset; struct dictionary; struct session; struct dataset *dataset_create (struct session *, const char *); struct dataset *dataset_clone (struct dataset *, const char *); void dataset_destroy (struct dataset *); void dataset_clear (struct dataset *); const char *dataset_name (const struct dataset *); void dataset_set_name (struct dataset *, const char *); struct session *dataset_session (const struct dataset *); void dataset_set_session (struct dataset *, struct session *); struct dictionary *dataset_dict (const struct dataset *); void dataset_set_dict (struct dataset *, struct dictionary *); const struct casereader *dataset_source (const struct dataset *); bool dataset_has_source (const struct dataset *ds); bool dataset_set_source (struct dataset *, struct casereader *); struct casereader *dataset_steal_source (struct dataset *); unsigned int dataset_seqno (const struct dataset *); struct dataset_callbacks { /* Called whenever a procedure completes execution or whenever the dictionary within the dataset is modified (though not when it is replaced by a new dictionary). */ void (*changed) (void *aux); /* Called whenever a transformation is added or removed. NON_EMPTY is true if after the change there is at least one transformation, false if there are no transformations. */ void (*transformations_changed) (bool non_empty, void *aux); }; void dataset_set_callbacks (struct dataset *, const struct dataset_callbacks *, void *aux); /* Dataset GUI window display status. */ enum dataset_display { DATASET_ASIS, /* Current state unchanged. */ DATASET_FRONT, /* Display and raise to top. */ DATASET_MINIMIZED, /* Display as icon. */ DATASET_HIDDEN /* Do not display. */ }; enum dataset_display dataset_get_display (const struct dataset *); void dataset_set_display (struct dataset *, enum dataset_display); /* Transformations. */ void add_transformation (struct dataset *ds, trns_proc_func *, trns_free_func *, void *); void add_transformation_with_finalizer (struct dataset *ds, trns_finalize_func *, trns_proc_func *, trns_free_func *, void *); size_t next_transformation (const struct dataset *ds); bool proc_cancel_all_transformations (struct dataset *ds); struct trns_chain *proc_capture_transformations (struct dataset *ds); void proc_start_temporary_transformations (struct dataset *ds); bool proc_in_temporary_transformations (const struct dataset *ds); bool proc_make_temporary_transformations_permanent (struct dataset *ds); bool proc_cancel_temporary_transformations (struct dataset *ds); struct variable *add_permanent_ordering_transformation (struct dataset *); /* Procedures. */ void proc_discard_output (struct dataset *ds); bool proc_execute (struct dataset *ds); time_t time_of_last_procedure (struct dataset *ds); struct casereader *proc_open_filtering (struct dataset *, bool filter); struct casereader *proc_open (struct dataset *); bool proc_is_open (const struct dataset *); bool proc_commit (struct dataset *); bool dataset_end_of_command (struct dataset *); const struct ccase *lagged_case (const struct dataset *ds, int n_before); void dataset_need_lag (struct dataset *ds, int n_before); /* Private interface for use by session code. */ void dataset_set_session__(struct dataset *, struct session *); #endif /* dataset.h */ pspp-1.4.1/src/data/case-tmpfile.h0000644000175000017500000000441513320146056016341 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2007, 2009, 2011 Free Software Foundation, Inc. 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 3 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, see . */ /* Manager for temporary files, each of which stores an array of like-size cases. Partial and whole cases may be read from and written to a case_tmpfile in random order. The indexes of the cases written in a case_tmpfile need not be sequential or start from 0 (although this will be inefficient if the file system does not support sparse files). The case_tmpfile does not track which cases have been written, so the client is responsible for reading data only from cases (or partial cases) that have previously been written. */ #ifndef DATA_CASE_TMPFILE_H #define DATA_CASE_TMPFILE_H 1 #include "data/case.h" struct caseproto; struct case_tmpfile *case_tmpfile_create (const struct caseproto *); bool case_tmpfile_destroy (struct case_tmpfile *); bool case_tmpfile_error (const struct case_tmpfile *); void case_tmpfile_force_error (struct case_tmpfile *); const struct taint *case_tmpfile_get_taint (const struct case_tmpfile *); bool case_tmpfile_get_values (const struct case_tmpfile *, casenumber, size_t start_value, union value[], size_t value_cnt); struct ccase *case_tmpfile_get_case (const struct case_tmpfile *, casenumber); bool case_tmpfile_put_values (struct case_tmpfile *, casenumber, size_t start_value, const union value[], size_t value_cnt); bool case_tmpfile_put_case (struct case_tmpfile *, casenumber, struct ccase *); #endif /* data/case-tmpfile.h */ pspp-1.4.1/src/data/vector.h0000644000175000017500000000310413320146056015264 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2006, 2010, 2011 Free Software Foundation, Inc. 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 3 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, see . */ #ifndef DATA_VECTOR_H #define DATA_VECTOR_H 1 #include #include "data/variable.h" struct dictionary; struct vector *vector_create (const char *name, struct variable **var, size_t var_cnt); struct vector *vector_clone (const struct vector *old, const struct dictionary *old_dict, const struct dictionary *new_dict); void vector_destroy (struct vector *); const char *vector_get_name (const struct vector *); enum val_type vector_get_type (const struct vector *); struct variable *vector_get_var (const struct vector *, size_t idx); size_t vector_get_var_cnt (const struct vector *); bool vector_is_valid_name (const char *name, bool issue_error); int compare_vector_ptrs_by_name (const void *a_, const void *b_); #endif /* data/vector.h */ pspp-1.4.1/src/data/format.def0000644000175000017500000000543413360715020015566 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 1997-9, 2000, 2006, 2010 Free Software Foundation, Inc. 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 3 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, see . */ /* Basic numeric formats. */ FMT (F, number, 1, 1, 5, FMT_CAT_BASIC) FMT (COMMA, number, 1, 1, 3, FMT_CAT_BASIC) FMT (DOT, number, 1, 1, 32, FMT_CAT_BASIC) FMT (DOLLAR, number, 1, 2, 4, FMT_CAT_BASIC) FMT (PCT, number, 1, 2, 31, FMT_CAT_BASIC) FMT (E, number, 1, 6, 17, FMT_CAT_BASIC) /* Custom currency formats. */ FMT (CCA, number, -1, 2, 33, FMT_CAT_CUSTOM) FMT (CCB, number, -1, 2, 34, FMT_CAT_CUSTOM) FMT (CCC, number, -1, 2, 35, FMT_CAT_CUSTOM) FMT (CCD, number, -1, 2, 36, FMT_CAT_CUSTOM) FMT (CCE, number, -1, 2, 37, FMT_CAT_CUSTOM) /* Legacy numeric formats. */ FMT (N, N, 1, 1, 16, FMT_CAT_LEGACY) FMT (Z, Z, 1, 1, 15, FMT_CAT_LEGACY) /* Binary and hexadecimal formats. */ FMT (P, P, 1, 1, 8, FMT_CAT_BINARY) FMT (PK, PK, 1, 1, 10, FMT_CAT_BINARY) FMT (IB, IB, 1, 1, 6, FMT_CAT_BINARY) FMT (PIB, PIB, 1, 1, 9, FMT_CAT_BINARY) FMT (PIBHEX, PIBHEX, 2, 2, 7, FMT_CAT_HEXADECIMAL) FMT (RB, RB, 2, 2, 11, FMT_CAT_BINARY) FMT (RBHEX, RBHEX, 4, 4, 12, FMT_CAT_HEXADECIMAL) /* Time and date formats. */ FMT (DATE, date, 8, 9, 20, FMT_CAT_DATE) FMT (ADATE, date, 8, 8, 23, FMT_CAT_DATE) FMT (EDATE, date, 8, 8, 38, FMT_CAT_DATE) FMT (JDATE, date, 5, 5, 24, FMT_CAT_DATE) FMT (SDATE, date, 8, 8, 39, FMT_CAT_DATE) FMT (QYR, date, 4, 6, 29, FMT_CAT_DATE) FMT (MOYR, date, 6, 6, 28, FMT_CAT_DATE) FMT (WKYR, date, 6, 8, 30, FMT_CAT_DATE) FMT (DATETIME, date, 17, 17, 22, FMT_CAT_DATE) FMT (YMDHMS, date, 12, 16, 41, FMT_CAT_DATE) FMT (MTIME, date, 4, 5, 40, FMT_CAT_TIME) FMT (TIME, date, 5, 5, 21, FMT_CAT_TIME) FMT (DTIME, date, 8, 8, 25, FMT_CAT_TIME) /* Date component formats. */ FMT (WKDAY, WKDAY, 2, 2, 26, FMT_CAT_DATE_COMPONENT) FMT (MONTH, MONTH, 3, 3, 27, FMT_CAT_DATE_COMPONENT) /* String formats. */ FMT (A, A, 1, 1, 1, FMT_CAT_STRING) FMT (AHEX, AHEX, 2, 2, 2, FMT_CAT_STRING) #undef FMT pspp-1.4.1/src/data/variable.h0000644000175000017500000001714613700645725015573 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 1997-9, 2000, 2009, 2010, 2011, 2012, 2013, 2014, 2020 Free Software Foundation, Inc. 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 3 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, see . */ #ifndef DATA_VARIABLE_H #define DATA_VARIABLE_H 1 #include #include #include "data/dict-class.h" #include "data/missing-values.h" #include "data/val-type.h" #include "data/settings.h" /* Bitfields to identify traits of a variable */ #define VAR_TRAIT_NAME 0x0001 #define VAR_TRAIT_WIDTH 0x0002 #define VAR_TRAIT_ROLE 0x0004 #define VAR_TRAIT_LABEL 0x0008 #define VAR_TRAIT_VALUE_LABELS 0x0010 #define VAR_TRAIT_MISSING_VALUES 0x0020 #define VAR_TRAIT_ALIGNMENT 0x0040 #define VAR_TRAIT_MEASURE 0x0080 #define VAR_TRAIT_DISPLAY_WIDTH 0x0100 #define VAR_TRAIT_LEAVE 0x0200 #define VAR_TRAIT_POSITION 0x0400 #define VAR_TRAIT_ATTRIBUTES 0x0800 #define VAR_TRAIT_PRINT_FORMAT 0x1000 #define VAR_TRAIT_WRITE_FORMAT 0x2000 union value; /* Variables. These functions should rarely be called directly: use dict_create_var, dict_clone_var, or dict_delete_var instead. */ struct variable *var_create (const char *name, int width); struct variable *var_clone (const struct variable *); struct variable * var_ref (struct variable *) WARN_UNUSED_RESULT; void var_unref (struct variable *); /* Variable names. */ const char *var_get_name (const struct variable *); void var_set_name (struct variable *, const char *); enum dict_class var_get_dict_class (const struct variable *); int compare_vars_by_name (const void *, const void *, const void *); unsigned hash_var_by_name (const void *, const void *); int compare_var_ptrs_by_name (const void *, const void *, const void *); unsigned hash_var_ptr_by_name (const void *, const void *); int compare_var_ptrs_by_dict_index (const void *, const void *, const void *); struct fmt_spec; /* Types and widths of values associated with a variable. */ enum val_type var_get_type (const struct variable *); int var_get_width (const struct variable *); void var_set_width (struct variable *, int width); void var_set_width_and_formats (struct variable *v, int new_width, const struct fmt_spec *print, const struct fmt_spec *write); bool var_is_numeric (const struct variable *); bool var_is_alpha (const struct variable *); /* Variables' missing values. */ const struct missing_values *var_get_missing_values (const struct variable *); void var_set_missing_values (struct variable *, const struct missing_values *); void var_clear_missing_values (struct variable *); bool var_has_missing_values (const struct variable *); bool var_is_value_missing (const struct variable *, const union value *, enum mv_class); bool var_is_num_missing (const struct variable *, double, enum mv_class); bool var_is_str_missing (const struct variable *, const uint8_t[], enum mv_class); /* Value labels. */ const char *var_lookup_value_label (const struct variable *, const union value *); struct string; void var_append_value_name (const struct variable *, const union value *, struct string *); void var_append_value_name__ (const struct variable *, const union value *, enum settings_value_show, struct string *); bool var_has_value_labels (const struct variable *); const struct val_labs *var_get_value_labels (const struct variable *); void var_set_value_labels (struct variable *, const struct val_labs *); bool var_add_value_label (struct variable *, const union value *, const char *); void var_replace_value_label (struct variable *, const union value *, const char *); void var_clear_value_labels (struct variable *); /* Print and write formats. */ const struct fmt_spec *var_get_print_format (const struct variable *); void var_set_print_format (struct variable *, const struct fmt_spec *); const struct fmt_spec *var_get_write_format (const struct variable *); void var_set_write_format (struct variable *, const struct fmt_spec *); void var_set_both_formats (struct variable *, const struct fmt_spec *); struct fmt_spec var_default_formats (int width); /* Variable labels. */ const char *var_to_string (const struct variable *); const char *var_get_label (const struct variable *); void var_set_label (struct variable *, const char *label); void var_clear_label (struct variable *); bool var_has_label (const struct variable *); /* How data is measured. */ enum measure { MEASURE_NOMINAL = 0, MEASURE_ORDINAL = 1, MEASURE_SCALE = 2, n_MEASURES }; bool measure_is_valid (enum measure); const char *measure_to_string (enum measure); const char *measure_to_syntax (enum measure); enum measure var_get_measure (const struct variable *); void var_set_measure (struct variable *, enum measure); enum measure var_default_measure (enum val_type); /* Intended usage of a variable, for populating dialogs. */ enum var_role { ROLE_INPUT, ROLE_TARGET, ROLE_BOTH, ROLE_NONE, ROLE_PARTITION, ROLE_SPLIT }; bool var_role_is_valid (enum var_role); const char *var_role_to_string (enum var_role); const char *var_role_to_syntax (enum var_role); enum var_role var_get_role (const struct variable *); void var_set_role (struct variable *, enum var_role); /* GUI display width. */ int var_get_display_width (const struct variable *); void var_set_display_width (struct variable *, int display_width); int var_default_display_width (int width); /* Alignment of data for display. */ enum alignment { ALIGN_LEFT = 0, ALIGN_RIGHT = 1, ALIGN_CENTRE = 2 }; bool alignment_is_valid (enum alignment); const char *alignment_to_string (enum alignment); const char *alignment_to_syntax (enum alignment); enum alignment var_get_alignment (const struct variable *); void var_set_alignment (struct variable *, enum alignment); enum alignment var_default_alignment (enum val_type); /* Whether variables' values should be preserved from case to case. */ bool var_get_leave (const struct variable *); void var_set_leave (struct variable *, bool leave); bool var_must_leave (const struct variable *); /* Short names. */ size_t var_get_short_name_cnt (const struct variable *); const char *var_get_short_name (const struct variable *, size_t idx); void var_set_short_name (struct variable *, size_t, const char *); void var_clear_short_names (struct variable *); /* Relationship with dictionary. */ size_t var_get_dict_index (const struct variable *); size_t var_get_case_index (const struct variable *); /* Custom attributes. */ struct attrset *var_get_attributes (const struct variable *); void var_set_attributes (struct variable *, const struct attrset *); bool var_has_attributes (const struct variable *); /* Encoding. */ const char *var_get_encoding (const struct variable *); /* Function types. */ typedef bool var_predicate_func (const struct variable *); double var_force_valid_weight (const struct variable *wv, double w, bool *warn_on_invalid); #endif /* data/variable.h */ pspp-1.4.1/src/data/session.c0000644000175000017500000001231713320146056015446 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2010, 2011, 2012, 2013 Free Software Foundation, Inc. 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 3 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, see . */ #include #include "data/session.h" #include #include #include "data/dataset.h" #include "libpspp/assertion.h" #include "libpspp/cast.h" #include "libpspp/hash-functions.h" #include "libpspp/i18n.h" #include "libpspp/str.h" #include "libpspp/hmapx.h" #include "gl/xalloc.h" struct session { struct session *parent; struct hmapx datasets; struct dataset *active; char *syntax_encoding; /* Default encoding for syntax files. */ unsigned int n_dataset_names; /* For session_generate_dataset_name(). */ }; static struct hmapx_node *session_lookup_dataset__ (const struct session *, const char *name); struct session * session_create (struct session *parent) { struct session *s; s = xmalloc (sizeof *s); s->parent = parent; hmapx_init (&s->datasets); s->active = NULL; s->syntax_encoding = xstrdup (s->parent != NULL ? s->parent->syntax_encoding : "Auto"); s->n_dataset_names = 0; return s; } void session_destroy (struct session *s) { if (s != NULL) { struct hmapx_node *node, *next; struct dataset *ds; s->active = NULL; HMAPX_FOR_EACH_SAFE (ds, node, next, &s->datasets) dataset_destroy (ds); hmapx_destroy (&s->datasets); free (s->syntax_encoding); free (s); } } struct dataset * session_active_dataset (struct session *s) { return s->active; } void session_set_active_dataset (struct session *s, struct dataset *ds) { assert (ds == NULL || dataset_session (ds) == s); s->active = ds; } void session_add_dataset (struct session *s, struct dataset *ds) { struct dataset *old; old = session_lookup_dataset (s, dataset_name (ds)); if (old == s->active) s->active = ds; if (old != NULL) { session_remove_dataset (s, old); dataset_destroy (old); } hmapx_insert (&s->datasets, ds, utf8_hash_case_string (dataset_name (ds), 0)); if (s->active == NULL) s->active = ds; dataset_set_session__ (ds, s); } void session_remove_dataset (struct session *s, struct dataset *ds) { assert (ds != s->active); hmapx_delete (&s->datasets, session_lookup_dataset__ (s, dataset_name (ds))); dataset_set_session__ (ds, NULL); } struct dataset * session_lookup_dataset (const struct session *s, const char *name) { struct hmapx_node *node = session_lookup_dataset__ (s, name); return (node != NULL ? node->data : s->parent != NULL ? session_lookup_dataset (s->parent, name) : NULL); } struct dataset * session_lookup_dataset_assert (const struct session *s, const char *name) { struct dataset *ds = session_lookup_dataset (s, name); assert (ds != NULL); return ds; } void session_set_default_syntax_encoding (struct session *s, const char *encoding) { free (s->syntax_encoding); s->syntax_encoding = xstrdup (encoding); } const char * session_get_default_syntax_encoding (const struct session *s) { return s->syntax_encoding; } size_t session_n_datasets (const struct session *s) { return hmapx_count (&s->datasets); } void session_for_each_dataset (const struct session *s, void (*cb) (struct dataset *, void *aux), void *aux) { struct hmapx_node *node, *next; struct dataset *ds; HMAPX_FOR_EACH_SAFE (ds, node, next, &s->datasets) cb (ds, aux); } struct dataset * session_get_dataset_by_seqno (const struct session *s, unsigned int seqno) { struct hmapx_node *node; struct dataset *ds; HMAPX_FOR_EACH (ds, node, &s->datasets) if (dataset_seqno (ds) == seqno) return ds; return NULL; } /* Returns an identifier that is is not currently in use as a dataset name. The caller must free the returned identifier, with free(). */ char * session_generate_dataset_name (struct session *s) { for (;;) { char *name; s->n_dataset_names++; assert(s->n_dataset_names != 0); name = xasprintf ("DataSet%u", s->n_dataset_names); if (!session_lookup_dataset (s, name)) return name; free (name); } } static struct hmapx_node * session_lookup_dataset__ (const struct session *s_, const char *name) { struct session *s = CONST_CAST (struct session *, s_); struct hmapx_node *node; struct dataset *ds; HMAPX_FOR_EACH_WITH_HASH (ds, node, utf8_hash_case_string (name, 0), &s->datasets) if (!utf8_strcasecmp (dataset_name (ds), name)) return node; return NULL; } pspp-1.4.1/src/data/casewriter.c0000644000175000017500000002343513320146056016136 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2007, 2009, 2011 Free Software Foundation, Inc. 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 3 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, see . */ #include #include "data/casewriter.h" #include "data/casewriter-provider.h" #include #include #include "data/casereader.h" #include "data/casereader-provider.h" #include "data/casewindow.h" #include "data/settings.h" #include "libpspp/assertion.h" #include "libpspp/compiler.h" #include "libpspp/taint.h" #include "gl/xalloc.h" /* A casewriter. */ struct casewriter { struct taint *taint; struct caseproto *proto; casenumber case_cnt; const struct casewriter_class *class; void *aux; }; static struct casewriter *create_casewriter_window (const struct caseproto *, casenumber max_in_core); /* Writes case C to WRITER. Ownership of C is transferred to WRITER. */ void casewriter_write (struct casewriter *writer, struct ccase *c) { size_t n_widths UNUSED = caseproto_get_n_widths (writer->proto); assert (case_get_value_cnt (c) >= n_widths); expensive_assert (caseproto_equal (case_get_proto (c), 0, writer->proto, 0, n_widths)); writer->class->write (writer, writer->aux, c); } /* Destroys WRITER. Returns true if successful, false if an I/O error was encountered on WRITER or on some object on which WRITER has a dependency. */ bool casewriter_destroy (struct casewriter *writer) { bool ok = true; if (writer != NULL) { writer->class->destroy (writer, writer->aux); ok = taint_destroy (writer->taint); caseproto_unref (writer->proto); free (writer); } return ok; } /* Returns the prototype for that cases written to WRITER must follow. */ const struct caseproto * casewriter_get_proto (const struct casewriter *writer) { return writer->proto; } /* Destroys WRITER and in its place returns a casereader that can be used to read back the data written to WRITER. WRITER must not be used again after calling this function, even as an argument to casewriter_destroy. Not all casewriters implement this function. Behavior is undefined if it is called on one that does not. If an I/O error was encountered on WRITER or on some object on which WRITER has a dependency, then the error will be propagated to the new casereader. */ struct casereader * casewriter_make_reader (struct casewriter *writer) { struct casereader *reader = writer->class->convert_to_reader (writer, writer->aux); taint_propagate (writer->taint, casereader_get_taint (reader)); caseproto_unref (writer->proto); taint_destroy (writer->taint); free (writer); return reader; } /* Returns a copy of WRITER, which is itself destroyed. Useful for taking over ownership of a casewriter, to enforce preventing the original owner from accessing the casewriter again. */ struct casewriter * casewriter_rename (struct casewriter *writer) { struct casewriter *new = xmemdup (writer, sizeof *writer); free (writer); return new; } /* Returns true if an I/O error or another hard error has occurred on WRITER, a clone of WRITER, or on some object on which WRITER's data has a dependency, false otherwise. */ bool casewriter_error (const struct casewriter *writer) { return taint_is_tainted (writer->taint); } /* Marks WRITER as having encountered an error. Ordinarily, this function should be called by the implementation of a casewriter, not by the casewriter's client. Instead, casewriter clients should usually ensure that a casewriter's error state is correct by using taint_propagate to propagate to the casewriter's taint structure, which may be obtained via casewriter_get_taint. */ void casewriter_force_error (struct casewriter *writer) { taint_set_taint (writer->taint); } /* Returns WRITER's associate taint object, for use with taint_propagate and other taint functions. */ const struct taint * casewriter_get_taint (const struct casewriter *writer) { return writer->taint; } /* Creates and returns a new casewriter with the given CLASS and auxiliary data AUX. The casewriter accepts cases that match case prototype PROTO, of which the caller retains ownership. */ struct casewriter * casewriter_create (const struct caseproto *proto, const struct casewriter_class *class, void *aux) { struct casewriter *writer = xmalloc (sizeof *writer); writer->taint = taint_create (); writer->proto = caseproto_ref (proto); writer->case_cnt = 0; writer->class = class; writer->aux = aux; return writer; } /* Returns a casewriter for cases that match case prototype PROTO. The cases written to the casewriter will be kept in memory, unless the amount of memory used grows too large, in which case they will be written to disk. A casewriter created with this function may be passed to casewriter_make_reader. This is usually the right kind of casewriter to use. */ struct casewriter * autopaging_writer_create (const struct caseproto *proto) { return create_casewriter_window (proto, settings_get_workspace_cases (proto)); } /* Returns a casewriter for cases that match case prototype PROTO. The cases written to the casewriter will be kept in memory. A casewriter created with this function may be passed to casewriter_make_reader. */ struct casewriter * mem_writer_create (const struct caseproto *proto) { return create_casewriter_window (proto, CASENUMBER_MAX); } /* Returns a casewriter for cases that match case prototype PROTO. The cases written to the casewriter will be written to disk. A casewriter created with this function may be passed to casewriter_make_reader. */ struct casewriter * tmpfile_writer_create (const struct caseproto *proto) { return create_casewriter_window (proto, 0); } static const struct casewriter_class casewriter_window_class; static const struct casereader_random_class casereader_window_class; /* Creates and returns a new casewriter based on a casewindow. Each of the casewriter's cases are composed of VALUE_CNT struct values. The casewriter's cases will be maintained in memory until MAX_IN_CORE_CASES have been written, at which point they will be written to disk. */ static struct casewriter * create_casewriter_window (const struct caseproto *proto, casenumber max_in_core_cases) { struct casewindow *window = casewindow_create (proto, max_in_core_cases); struct casewriter *writer = casewriter_create (proto, &casewriter_window_class, window); taint_propagate (casewindow_get_taint (window), casewriter_get_taint (writer)); return writer; } /* Writes case C to casewindow writer WINDOW. */ static void casewriter_window_write (struct casewriter *writer UNUSED, void *window_, struct ccase *c) { struct casewindow *window = window_; casewindow_push_head (window, c); } /* Destroys casewindow writer WINDOW. */ static void casewriter_window_destroy (struct casewriter *writer UNUSED, void *window_) { struct casewindow *window = window_; casewindow_destroy (window); } /* Converts casewindow writer WINDOW to a casereader and returns the casereader. */ static struct casereader * casewriter_window_convert_to_reader (struct casewriter *writer UNUSED, void *window_) { struct casewindow *window = window_; struct casereader *reader = casereader_create_random (casewindow_get_proto (window), casewindow_get_case_cnt (window), &casereader_window_class, window); taint_propagate (casewindow_get_taint (window), casereader_get_taint (reader)); return reader; } /* Reads and returns the case at the given 0-based OFFSET from the front of WINDOW into C. Returns a null pointer if OFFSET is beyond the end of file or upon I/O error. The caller must call case_unref() on the returned case when it is no longer needed.*/ static struct ccase * casereader_window_read (struct casereader *reader UNUSED, void *window_, casenumber offset) { struct casewindow *window = window_; if (offset >= casewindow_get_case_cnt (window)) return NULL; return casewindow_get_case (window, offset); } /* Destroys casewindow reader WINDOW. */ static void casereader_window_destroy (struct casereader *reader UNUSED, void *window_) { struct casewindow *window = window_; casewindow_destroy (window); } /* Discards CASE_CNT cases from the front of WINDOW. */ static void casereader_window_advance (struct casereader *reader UNUSED, void *window_, casenumber case_cnt) { struct casewindow *window = window_; casewindow_pop_tail (window, case_cnt); } /* Class for casewindow writer. */ static const struct casewriter_class casewriter_window_class = { casewriter_window_write, casewriter_window_destroy, casewriter_window_convert_to_reader, }; /* Class for casewindow reader. */ static const struct casereader_random_class casereader_window_class = { casereader_window_read, casereader_window_destroy, casereader_window_advance, }; pspp-1.4.1/src/data/variable.c0000644000175000017500000010510713700645725015561 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 1997-9, 2000, 2006, 2009, 2010, 2011, 2012, 2013, 2014, 2016, 2020 Free Software Foundation, Inc. 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 3 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, see . */ #include #include "data/variable.h" #include #include "data/attributes.h" #include "data/data-out.h" #include "data/dictionary.h" #include "data/format.h" #include "data/identifier.h" #include "data/missing-values.h" #include "data/settings.h" #include "data/value-labels.h" #include "data/vardict.h" #include "libpspp/assertion.h" #include "libpspp/compiler.h" #include "libpspp/hash-functions.h" #include "libpspp/i18n.h" #include "libpspp/message.h" #include "libpspp/misc.h" #include "libpspp/str.h" #include "gl/minmax.h" #include "gl/xalloc.h" #include "gettext.h" #define _(msgid) gettext (msgid) #define N_(msgid) (msgid) /* This should follow the definition in Gtk */ typedef struct { int value; const char *name; const char *label; } GEnumValue; const GEnumValue align[] = { {ALIGN_LEFT, "left", N_("Left")}, {ALIGN_RIGHT, "right", N_("Right")}, {ALIGN_CENTRE, "center", N_("Center")}, {0,0,0} }; const GEnumValue measure[] = { {MEASURE_NOMINAL, "nominal", N_("Nominal")}, {MEASURE_ORDINAL, "ordinal", N_("Ordinal")}, {MEASURE_SCALE, "scale", N_("Scale")}, {0,0,0} }; const GEnumValue role[] = { {ROLE_INPUT, "input", N_("Input")}, {ROLE_TARGET, "output", N_("Output")}, {ROLE_BOTH, "both", N_("Both")}, {ROLE_NONE, "none", N_("None")}, {ROLE_PARTITION, "partition", N_("Partition")}, {ROLE_SPLIT, "split", N_("Split")}, {0,0,0} }; /* A variable. */ struct variable { int ref_cnt; /* Dictionary information. */ char *name; /* Variable name. Mixed case. */ int width; /* 0 for numeric, otherwise string width. */ struct missing_values miss; /* Missing values. */ struct fmt_spec print; /* Default format for PRINT. */ struct fmt_spec write; /* Default format for WRITE. */ struct val_labs *val_labs; /* Value labels. */ char *label; /* Variable label. */ struct string name_and_label; /* The name and label in the same string */ /* GUI information. */ enum measure measure; /* Nominal, ordinal, or continuous. */ enum var_role role; /* Intended use. */ int display_width; /* Width of data editor column. */ enum alignment alignment; /* Alignment of data in GUI. */ /* Case information. */ bool leave; /* Leave value from case to case? */ /* Data for use by containing dictionary. */ struct vardict_info *vardict; /* Used only for system and portable file input and output. See short-names.h. */ char **short_names; size_t short_name_cnt; /* Custom attributes. */ struct attrset attributes; }; static void var_set_print_format_quiet (struct variable *v, const struct fmt_spec *print); static void var_set_write_format_quiet (struct variable *v, const struct fmt_spec *write); static void var_set_label_quiet (struct variable *v, const char *label); static void var_set_name_quiet (struct variable *v, const char *name); /* Creates and returns a new variable with the given NAME and WIDTH and other fields initialized to default values. The variable is not added to a dictionary; for that, use dict_create_var instead. */ struct variable * var_create (const char *name, int width) { struct variable *v; enum val_type type; assert (width >= 0 && width <= MAX_STRING); v = xzalloc (sizeof *v); var_set_name_quiet (v, name); v->width = width; mv_init (&v->miss, width); v->leave = var_must_leave (v); type = val_type_from_width (width); v->alignment = var_default_alignment (type); v->measure = var_default_measure (type); v->role = ROLE_INPUT; v->display_width = var_default_display_width (width); v->print = v->write = var_default_formats (width); attrset_init (&v->attributes); ds_init_empty (&v->name_and_label); v->ref_cnt = 1; return v; } /* Destroys variable V. V must not belong to a dictionary. If it does, use dict_delete_var instead. */ static void var_destroy__ (struct variable *v) { assert (!var_has_vardict (v)); mv_destroy (&v->miss); var_clear_short_names (v); val_labs_destroy (v->val_labs); var_set_label_quiet (v, NULL); attrset_destroy (var_get_attributes (v)); free (v->name); ds_destroy (&v->name_and_label); free (v); } struct variable * var_ref (struct variable *v) { v->ref_cnt++; return v; } void var_unref (struct variable *v) { if (--v->ref_cnt == 0) var_destroy__ (v); } /* Variable names. */ /* Return variable V's name, as a UTF-8 encoded string. */ const char * var_get_name (const struct variable *v) { return v->name; } /* Sets V's name to NAME, a UTF-8 encoded string. Do not use this function for a variable in a dictionary. Use dict_rename_var instead. */ static void var_set_name_quiet (struct variable *v, const char *name) { assert (!var_has_vardict (v)); free (v->name); v->name = xstrdup (name); ds_destroy (&v->name_and_label); ds_init_empty (&v->name_and_label); } /* Sets V's name to NAME, a UTF-8 encoded string. Do not use this function for a variable in a dictionary. Use dict_rename_var instead. */ void var_set_name (struct variable *v, const char *name) { struct variable *ov = var_clone (v); var_set_name_quiet (v, name); dict_var_changed (v, VAR_TRAIT_NAME, ov); } /* Returns VAR's dictionary class. */ enum dict_class var_get_dict_class (const struct variable *var) { return dict_class_from_id (var->name); } /* A hsh_compare_func that orders variables A and B by their names. */ int compare_vars_by_name (const void *a_, const void *b_, const void *aux UNUSED) { const struct variable *a = a_; const struct variable *b = b_; return utf8_strcasecmp (a->name, b->name); } /* A hsh_hash_func that hashes variable V based on its name. */ unsigned hash_var_by_name (const void *v_, const void *aux UNUSED) { const struct variable *v = v_; return utf8_hash_case_string (v->name, 0); } /* A hsh_compare_func that orders pointers to variables A and B by their names. */ int compare_var_ptrs_by_name (const void *a_, const void *b_, const void *aux UNUSED) { struct variable *const *a = a_; struct variable *const *b = b_; return utf8_strcasecmp (var_get_name (*a), var_get_name (*b)); } /* A hsh_compare_func that orders pointers to variables A and B by their dictionary indexes. */ int compare_var_ptrs_by_dict_index (const void *a_, const void *b_, const void *aux UNUSED) { struct variable *const *a = a_; struct variable *const *b = b_; size_t a_index = var_get_dict_index (*a); size_t b_index = var_get_dict_index (*b); return a_index < b_index ? -1 : a_index > b_index; } /* A hsh_hash_func that hashes pointer to variable V based on its name. */ unsigned hash_var_ptr_by_name (const void *v_, const void *aux UNUSED) { struct variable *const *v = v_; return utf8_hash_case_string (var_get_name (*v), 0); } /* Returns the type of variable V. */ enum val_type var_get_type (const struct variable *v) { return val_type_from_width (v->width); } /* Returns the width of variable V. */ int var_get_width (const struct variable *v) { return v->width; } void var_set_width_and_formats (struct variable *v, int new_width, const struct fmt_spec *print, const struct fmt_spec *write) { struct variable *ov; unsigned int traits = 0; ov = var_clone (v); if (mv_is_resizable (&v->miss, new_width)) mv_resize (&v->miss, new_width); else { mv_destroy (&v->miss); mv_init (&v->miss, new_width); } if (new_width != var_get_width (v)) traits |= VAR_TRAIT_MISSING_VALUES; if (v->val_labs != NULL) { if (val_labs_can_set_width (v->val_labs, new_width)) val_labs_set_width (v->val_labs, new_width); else { val_labs_destroy (v->val_labs); v->val_labs = NULL; } traits |= VAR_TRAIT_VALUE_LABELS; } if (fmt_resize (&v->print, new_width)) traits |= VAR_TRAIT_PRINT_FORMAT; if (fmt_resize (&v->write, new_width)) traits |= VAR_TRAIT_WRITE_FORMAT; if (v->width != new_width) { v->width = new_width; traits |= VAR_TRAIT_WIDTH; } if (print) { var_set_print_format_quiet (v, print); traits |= VAR_TRAIT_PRINT_FORMAT; } if (write) { var_set_write_format_quiet (v, write); traits |= VAR_TRAIT_WRITE_FORMAT; } if (traits != 0) dict_var_changed (v, traits, ov); } /* Changes the width of V to NEW_WIDTH. This function should be used cautiously. */ void var_set_width (struct variable *v, int new_width) { const int old_width = v->width; if (old_width == new_width) return; var_set_width_and_formats (v, new_width, NULL, NULL); } /* Returns true if variable V is numeric, false otherwise. */ bool var_is_numeric (const struct variable *v) { return var_get_type (v) == VAL_NUMERIC; } /* Returns true if variable V is a string variable, false otherwise. */ bool var_is_alpha (const struct variable *v) { return var_get_type (v) == VAL_STRING; } /* Returns variable V's missing values. */ const struct missing_values * var_get_missing_values (const struct variable *v) { return &v->miss; } /* Sets variable V's missing values to MISS, which must be of V's width or at least resizable to V's width. If MISS is null, then V's missing values, if any, are cleared. */ static void var_set_missing_values_quiet (struct variable *v, const struct missing_values *miss) { if (miss != NULL) { assert (mv_is_resizable (miss, v->width)); mv_destroy (&v->miss); mv_copy (&v->miss, miss); mv_resize (&v->miss, v->width); } else mv_clear (&v->miss); } /* Sets variable V's missing values to MISS, which must be of V's width or at least resizable to V's width. If MISS is null, then V's missing values, if any, are cleared. */ void var_set_missing_values (struct variable *v, const struct missing_values *miss) { struct variable *ov = var_clone (v); var_set_missing_values_quiet (v, miss); dict_var_changed (v, VAR_TRAIT_MISSING_VALUES, ov); } /* Sets variable V to have no user-missing values. */ void var_clear_missing_values (struct variable *v) { var_set_missing_values (v, NULL); } /* Returns true if V has any user-missing values, false otherwise. */ bool var_has_missing_values (const struct variable *v) { return !mv_is_empty (&v->miss); } /* Returns true if VALUE is in the given CLASS of missing values in V, false otherwise. */ bool var_is_value_missing (const struct variable *v, const union value *value, enum mv_class class) { return mv_is_value_missing (&v->miss, value, class); } /* Returns true if D is in the given CLASS of missing values in V, false otherwise. V must be a numeric variable. */ bool var_is_num_missing (const struct variable *v, double d, enum mv_class class) { return mv_is_num_missing (&v->miss, d, class); } /* Returns true if S[] is a missing value for V, false otherwise. S[] must contain exactly as many characters as V's width. V must be a string variable. */ bool var_is_str_missing (const struct variable *v, const uint8_t s[], enum mv_class class) { return mv_is_str_missing (&v->miss, s, class); } /* Returns variable V's value labels, possibly a null pointer if it has none. */ const struct val_labs * var_get_value_labels (const struct variable *v) { return v->val_labs; } /* Returns true if variable V has at least one value label. */ bool var_has_value_labels (const struct variable *v) { return val_labs_count (v->val_labs) > 0; } /* Sets variable V's value labels to a copy of VLS, which must have a width equal to V's width or one that can be changed to V's width. If VLS is null, then V's value labels, if any, are removed. */ static void var_set_value_labels_quiet (struct variable *v, const struct val_labs *vls) { val_labs_destroy (v->val_labs); v->val_labs = NULL; if (vls != NULL) { assert (val_labs_can_set_width (vls, v->width)); v->val_labs = val_labs_clone (vls); val_labs_set_width (v->val_labs, v->width); } } /* Sets variable V's value labels to a copy of VLS, which must have a width equal to V's width or one that can be changed to V's width. If VLS is null, then V's value labels, if any, are removed. */ void var_set_value_labels (struct variable *v, const struct val_labs *vls) { struct variable *ov = var_clone (v); var_set_value_labels_quiet (v, vls); dict_var_changed (v, VAR_TRAIT_LABEL, ov); } /* Makes sure that V has a set of value labels, by assigning one to it if necessary. */ static void alloc_value_labels (struct variable *v) { if (v->val_labs == NULL) v->val_labs = val_labs_create (v->width); } /* Attempts to add a value label with the given VALUE and UTF-8 encoded LABEL to V. Returns true if successful, false otherwise (probably due to an existing label). In LABEL, the two-byte sequence "\\n" is interpreted as a new-line. */ bool var_add_value_label (struct variable *v, const union value *value, const char *label) { alloc_value_labels (v); return val_labs_add (v->val_labs, value, label); } /* Adds or replaces a value label with the given VALUE and UTF-8 encoded LABEL to V. In LABEL, the two-byte sequence "\\n" is interpreted as a new-line. */ void var_replace_value_label (struct variable *v, const union value *value, const char *label) { alloc_value_labels (v); val_labs_replace (v->val_labs, value, label); } /* Removes V's value labels, if any. */ void var_clear_value_labels (struct variable *v) { var_set_value_labels (v, NULL); } /* Returns the label associated with VALUE for variable V, as a UTF-8 string in a format suitable for output, or a null pointer if none. */ const char * var_lookup_value_label (const struct variable *v, const union value *value) { return val_labs_find (v->val_labs, value); } /* Append to STR the string representation of VALUE for variable V. STR must be a pointer to an initialised struct string. */ static void append_value (const struct variable *v, const union value *value, struct string *str) { char *s = data_out (value, var_get_encoding (v), &v->print); struct substring ss = ss_cstr (s); ss_rtrim (&ss, ss_cstr (" ")); ds_put_substring (str, ss); free (s); } void var_append_value_name__ (const struct variable *v, const union value *value, enum settings_value_show show, struct string *str) { const char *label = var_lookup_value_label (v, value); switch (show) { case SETTINGS_VALUE_SHOW_VALUE: append_value (v, value, str); break; default: case SETTINGS_VALUE_SHOW_LABEL: if (label) ds_put_cstr (str, label); else append_value (v, value, str); break; case SETTINGS_VALUE_SHOW_BOTH: append_value (v, value, str); if (label != NULL) ds_put_format (str, " %s", label); break; } } /* Append STR with a string representing VALUE for variable V. That is, if VALUE has a label, append that label, otherwise format VALUE and append the formatted string. STR must be a pointer to an initialised struct string. */ void var_append_value_name (const struct variable *v, const union value *value, struct string *str) { var_append_value_name__ (v, value, settings_get_show_values (), str); } /* Print and write formats. */ /* Returns V's print format specification. */ const struct fmt_spec * var_get_print_format (const struct variable *v) { return &v->print; } /* Sets V's print format specification to PRINT, which must be a valid format specification for a variable of V's width (ordinarily an output format, but input formats are not rejected). */ static void var_set_print_format_quiet (struct variable *v, const struct fmt_spec *print) { if (!fmt_equal (&v->print, print)) { assert (fmt_check_width_compat (print, v->width)); v->print = *print; } } /* Sets V's print format specification to PRINT, which must be a valid format specification for a variable of V's width (ordinarily an output format, but input formats are not rejected). */ void var_set_print_format (struct variable *v, const struct fmt_spec *print) { struct variable *ov = var_clone (v); var_set_print_format_quiet (v, print); dict_var_changed (v, VAR_TRAIT_PRINT_FORMAT, ov); } /* Returns V's write format specification. */ const struct fmt_spec * var_get_write_format (const struct variable *v) { return &v->write; } /* Sets V's write format specification to WRITE, which must be a valid format specification for a variable of V's width (ordinarily an output format, but input formats are not rejected). */ static void var_set_write_format_quiet (struct variable *v, const struct fmt_spec *write) { if (!fmt_equal (&v->write, write)) { assert (fmt_check_width_compat (write, v->width)); v->write = *write; } } /* Sets V's write format specification to WRITE, which must be a valid format specification for a variable of V's width (ordinarily an output format, but input formats are not rejected). */ void var_set_write_format (struct variable *v, const struct fmt_spec *write) { struct variable *ov = var_clone (v); var_set_write_format_quiet (v, write); dict_var_changed (v, VAR_TRAIT_WRITE_FORMAT, ov); } /* Sets V's print and write format specifications to FORMAT, which must be a valid format specification for a variable of V's width (ordinarily an output format, but input formats are not rejected). */ void var_set_both_formats (struct variable *v, const struct fmt_spec *format) { struct variable *ov = var_clone (v); var_set_print_format_quiet (v, format); var_set_write_format_quiet (v, format); dict_var_changed (v, VAR_TRAIT_PRINT_FORMAT | VAR_TRAIT_WRITE_FORMAT, ov); } /* Returns the default print and write format for a variable of the given TYPE, as set by var_create. The return value can be used to reset a variable's print and write formats to the default. */ struct fmt_spec var_default_formats (int width) { return (width == 0 ? fmt_for_output (FMT_F, 8, 2) : fmt_for_output (FMT_A, width, 0)); } /* Update the combined name and label string if necessary */ static void update_vl_string (const struct variable *v) { /* Cast away const! */ struct string *str = (struct string *) &v->name_and_label; if (ds_is_empty (str)) { if (v->label) ds_put_format (str, _("%s (%s)"), v->label, v->name); else ds_put_cstr (str, v->name); } } /* Return a string representing this variable, in the form most appropriate from a human factors perspective, that is, its variable label if it has one, otherwise its name. */ const char * var_to_string (const struct variable *v) { switch (settings_get_show_variables ()) { case SETTINGS_VALUE_SHOW_VALUE: return v->name; case SETTINGS_VALUE_SHOW_LABEL: default: return v->label != NULL ? v->label : v->name; case SETTINGS_VALUE_SHOW_BOTH: update_vl_string (v); return ds_cstr (&v->name_and_label); } } /* Returns V's variable label, or a null pointer if it has none. */ const char * var_get_label (const struct variable *v) { return v->label; } /* Sets V's variable label to UTF-8 encoded string LABEL, stripping off leading and trailing white space. If LABEL is a null pointer or if LABEL is an empty string (after stripping white space), then V's variable label (if any) is removed. */ static void var_set_label_quiet (struct variable *v, const char *label) { free (v->label); v->label = NULL; if (label != NULL && label[strspn (label, CC_SPACES)]) v->label = xstrdup (label); ds_destroy (&v->name_and_label); ds_init_empty (&v->name_and_label); } /* Sets V's variable label to UTF-8 encoded string LABEL, stripping off leading and trailing white space. If LABEL is a null pointer or if LABEL is an empty string (after stripping white space), then V's variable label (if any) is removed. */ void var_set_label (struct variable *v, const char *label) { struct variable *ov = var_clone (v); var_set_label_quiet (v, label); dict_var_changed (v, VAR_TRAIT_LABEL, ov); } /* Removes any variable label from V. */ void var_clear_label (struct variable *v) { var_set_label (v, NULL); } /* Returns true if V has a variable V, false otherwise. */ bool var_has_label (const struct variable *v) { return v->label != NULL; } /* Returns true if M is a valid variable measurement level, false otherwise. */ bool measure_is_valid (enum measure m) { return m == MEASURE_NOMINAL || m == MEASURE_ORDINAL || m == MEASURE_SCALE; } /* Returns a string version of measurement level M, for display to a user. The caller may translate the string by passing it to gettext(). */ const char * measure_to_string (enum measure m) { assert (m == measure[m].value); return measure[m].label; } /* Returns a string version of measurement level M, for use in PSPP command syntax. */ const char * measure_to_syntax (enum measure m) { switch (m) { case MEASURE_NOMINAL: return "NOMINAL"; case MEASURE_ORDINAL: return "ORDINAL"; case MEASURE_SCALE: return "SCALE"; default: return "Invalid"; } } /* Returns V's measurement level. */ enum measure var_get_measure (const struct variable *v) { return v->measure; } /* Sets V's measurement level to MEASURE. */ static void var_set_measure_quiet (struct variable *v, enum measure measure) { assert (measure_is_valid (measure)); v->measure = measure; } /* Sets V's measurement level to MEASURE. */ void var_set_measure (struct variable *v, enum measure measure) { struct variable *ov = var_clone (v); var_set_measure_quiet (v, measure); dict_var_changed (v, VAR_TRAIT_MEASURE, ov); } /* Returns the default measurement level for a variable of the given TYPE, as set by var_create. The return value can be used to reset a variable's measurement level to the default. */ enum measure var_default_measure (enum val_type type) { return type == VAL_NUMERIC ? MEASURE_SCALE : MEASURE_NOMINAL; } /* Returns true if M is a valid variable role, false otherwise. */ bool var_role_is_valid (enum var_role role) { switch (role) { case ROLE_NONE: case ROLE_INPUT: case ROLE_TARGET: case ROLE_BOTH: case ROLE_PARTITION: case ROLE_SPLIT: return true; default: return false; } } /* Returns a string version of ROLE, for display to a user. The caller may translate the string by passing it to gettext(). */ const char * var_role_to_string (enum var_role r) { assert (r == role[r].value); return role[r].label; } /* Returns a string version of ROLE, for use in PSPP comamnd syntax. */ const char * var_role_to_syntax (enum var_role role) { switch (role) { case ROLE_INPUT: return "INPUT"; case ROLE_TARGET: return "TARGET"; case ROLE_BOTH: return "BOTH"; case ROLE_NONE: return "NONE"; case ROLE_PARTITION: return "PARTITION"; case ROLE_SPLIT: return "SPLIT"; default: return ""; } } /* Returns V's role. */ enum var_role var_get_role (const struct variable *v) { return v->role; } /* Sets V's role to ROLE. */ static void var_set_role_quiet (struct variable *v, enum var_role role) { assert (var_role_is_valid (role)); v->role = role; } /* Sets V's role to ROLE. */ void var_set_role (struct variable *v, enum var_role role) { struct variable *ov = var_clone (v); var_set_role_quiet (v, role); dict_var_changed (v, VAR_TRAIT_ROLE, ov); } /* Returns V's display width, which applies only to GUIs. */ int var_get_display_width (const struct variable *v) { return v->display_width; } /* Sets V's display width to DISPLAY_WIDTH. */ static void var_set_display_width_quiet (struct variable *v, int new_width) { if (v->display_width != new_width) { v->display_width = new_width; } } void var_set_display_width (struct variable *v, int new_width) { if (v->display_width != new_width) { struct variable *ov = var_clone (v); var_set_display_width_quiet (v, new_width); dict_var_changed (v, VAR_TRAIT_DISPLAY_WIDTH, ov); } } /* Returns the default display width for a variable of the given WIDTH, as set by var_create. The return value can be used to reset a variable's display width to the default. */ int var_default_display_width (int width) { return width == 0 ? 8 : MIN (width, 32); } /* Returns true if A is a valid alignment, false otherwise. */ bool alignment_is_valid (enum alignment a) { return a == ALIGN_LEFT || a == ALIGN_RIGHT || a == ALIGN_CENTRE; } /* Returns a string version of alignment A, for display to a user. The caller may translate the string by passing it to gettext(). */ const char * alignment_to_string (enum alignment a) { assert (a == align[a].value); return align[a].label; } /* Returns a string version of alignment A, for use in PSPP command syntax. */ const char * alignment_to_syntax (enum alignment a) { switch (a) { case ALIGN_LEFT: return "LEFT"; case ALIGN_RIGHT: return "RIGHT"; case ALIGN_CENTRE: return "CENTER"; default: return "Invalid"; } } /* Returns V's display alignment, which applies only to GUIs. */ enum alignment var_get_alignment (const struct variable *v) { return v->alignment; } /* Sets V's display alignment to ALIGNMENT. */ static void var_set_alignment_quiet (struct variable *v, enum alignment alignment) { assert (alignment_is_valid (alignment)); v->alignment = alignment; } /* Sets V's display alignment to ALIGNMENT. */ void var_set_alignment (struct variable *v, enum alignment alignment) { struct variable *ov = var_clone (v); var_set_alignment_quiet (v, alignment); dict_var_changed (v, VAR_TRAIT_ALIGNMENT, ov); } /* Returns the default display alignment for a variable of the given TYPE, as set by var_create. The return value can be used to reset a variable's display alignment to the default. */ enum alignment var_default_alignment (enum val_type type) { return type == VAL_NUMERIC ? ALIGN_RIGHT : ALIGN_LEFT; } /* Whether variables' values should be preserved from case to case. */ /* Returns true if variable V's value should be left from case to case, instead of being reset to system-missing or blanks. */ bool var_get_leave (const struct variable *v) { return v->leave; } /* Sets V's leave setting to LEAVE. */ static void var_set_leave_quiet (struct variable *v, bool leave) { assert (leave || !var_must_leave (v)); v->leave = leave; } /* Sets V's leave setting to LEAVE. */ void var_set_leave (struct variable *v, bool leave) { struct variable *ov = var_clone (v); var_set_leave_quiet (v, leave); dict_var_changed (v, VAR_TRAIT_LEAVE, ov); } /* Returns true if V must be left from case to case, false if it can be set either way. */ bool var_must_leave (const struct variable *v) { return var_get_dict_class (v) == DC_SCRATCH; } /* Returns the number of short names stored in VAR. Short names are used only for system and portable file input and output. They are upper-case only, not necessarily unique, and limited to SHORT_NAME_LEN characters (plus a null terminator). Ordinarily a variable has at most one short name, but very long string variables (longer than 255 bytes) may have more. A variable might not have any short name at all if it hasn't been saved to or read from a system or portable file. */ size_t var_get_short_name_cnt (const struct variable *var) { return var->short_name_cnt; } /* Returns VAR's short name with the given IDX, if it has one with that index, or a null pointer otherwise. Short names may be sparse: even if IDX is less than the number of short names in VAR, this function may return a null pointer. */ const char * var_get_short_name (const struct variable *var, size_t idx) { return idx < var->short_name_cnt ? var->short_names[idx] : NULL; } /* Sets VAR's short name with the given IDX to the UTF-8 string SHORT_NAME. The caller must already have checked that, in the dictionary encoding, SHORT_NAME is no more than SHORT_NAME_LEN bytes long. The new short name will be converted to uppercase. Specifying a null pointer for SHORT_NAME clears the specified short name. */ void var_set_short_name (struct variable *var, size_t idx, const char *short_name) { struct variable *ov = var_clone (var); /* Clear old short name numbered IDX, if any. */ if (idx < var->short_name_cnt) { free (var->short_names[idx]); var->short_names[idx] = NULL; } /* Install new short name for IDX. */ if (short_name != NULL) { if (idx >= var->short_name_cnt) { size_t old_cnt = var->short_name_cnt; size_t i; var->short_name_cnt = MAX (idx * 2, 1); var->short_names = xnrealloc (var->short_names, var->short_name_cnt, sizeof *var->short_names); for (i = old_cnt; i < var->short_name_cnt; i++) var->short_names[i] = NULL; } var->short_names[idx] = utf8_to_upper (short_name); } dict_var_changed (var, VAR_TRAIT_NAME, ov); } /* Clears V's short names. */ void var_clear_short_names (struct variable *v) { size_t i; for (i = 0; i < v->short_name_cnt; i++) free (v->short_names[i]); free (v->short_names); v->short_names = NULL; v->short_name_cnt = 0; } /* Relationship with dictionary. */ /* Returns V's index within its dictionary, the value for which "dict_get_var (dict, index)" will return V. V must be in a dictionary. */ size_t var_get_dict_index (const struct variable *v) { assert (var_has_vardict (v)); return vardict_get_dict_index (v->vardict); } /* Returns V's index within the case represented by its dictionary, that is, the value for which "case_data_idx (case, index)" will return the data for V in that case. V must be in a dictionary. */ size_t var_get_case_index (const struct variable *v) { assert (var_has_vardict (v)); return vardict_get_case_index (v->vardict); } /* Returns variable V's attribute set. The caller may examine or modify the attribute set, but must not destroy it. Destroying V, or calling var_set_attributes() on V, will also destroy its attribute set. */ struct attrset * var_get_attributes (const struct variable *v) { return CONST_CAST (struct attrset *, &v->attributes); } /* Replaces variable V's attributes set by a copy of ATTRS. */ static void var_set_attributes_quiet (struct variable *v, const struct attrset *attrs) { attrset_destroy (&v->attributes); attrset_clone (&v->attributes, attrs); } /* Replaces variable V's attributes set by a copy of ATTRS. */ void var_set_attributes (struct variable *v, const struct attrset *attrs) { struct variable *ov = var_clone (v); var_set_attributes_quiet (v, attrs); dict_var_changed (v, VAR_TRAIT_ATTRIBUTES, ov); } /* Returns true if V has any custom attributes, false if it has none. */ bool var_has_attributes (const struct variable *v) { return attrset_count (&v->attributes) > 0; } /* Creates and returns a clone of OLD_VAR. Most properties of the new variable are copied from OLD_VAR, except: - The variable's short name is not copied, because there is no reason to give a new variable with potentially a new name the same short name. - The new variable is not added to OLD_VAR's dictionary by default. Use dict_clone_var, instead, to do that. */ struct variable * var_clone (const struct variable *old_var) { struct variable *new_var = var_create (var_get_name (old_var), var_get_width (old_var)); var_set_missing_values_quiet (new_var, var_get_missing_values (old_var)); var_set_print_format_quiet (new_var, var_get_print_format (old_var)); var_set_write_format_quiet (new_var, var_get_write_format (old_var)); var_set_value_labels_quiet (new_var, var_get_value_labels (old_var)); var_set_label_quiet (new_var, var_get_label (old_var)); var_set_measure_quiet (new_var, var_get_measure (old_var)); var_set_role_quiet (new_var, var_get_role (old_var)); var_set_display_width_quiet (new_var, var_get_display_width (old_var)); var_set_alignment_quiet (new_var, var_get_alignment (old_var)); var_set_leave_quiet (new_var, var_get_leave (old_var)); var_set_attributes_quiet (new_var, var_get_attributes (old_var)); return new_var; } /* Returns the encoding of values of variable VAR. (This is actually a property of the dictionary.) Returns null if no specific encoding has been set. */ const char * var_get_encoding (const struct variable *var) { return (var_has_vardict (var) ? dict_get_encoding (vardict_get_dictionary (var->vardict)) : NULL); } /* Returns V's vardict structure. */ struct vardict_info * var_get_vardict (const struct variable *v) { return CONST_CAST (struct vardict_info *, v->vardict); } /* Sets V's vardict data to VARDICT. */ void var_set_vardict (struct variable *v, struct vardict_info *vardict) { v->vardict = vardict; } /* Returns true if V has vardict data. */ bool var_has_vardict (const struct variable *v) { return v->vardict != NULL; } /* Clears V's vardict data. */ void var_clear_vardict (struct variable *v) { v->vardict = NULL; } /* Returns zero, if W is a missing value for WV or if it is less than zero. Typically used to force a numerical value into a valid weight. As a side effect, this function will emit a warning if the value WARN_ON_INVALID points to a bool which is TRUE. That bool will be then set to FALSE. */ double var_force_valid_weight (const struct variable *wv, double w, bool *warn_on_invalid) { if (w < 0.0 || (wv && var_is_num_missing (wv, w, MV_ANY))) w = 0.0; if (w == 0.0 && warn_on_invalid != NULL && *warn_on_invalid) { *warn_on_invalid = false; msg (SW, _("At least one case in the data file had a weight value " "that was user-missing, system-missing, zero, or " "negative. These case(s) were ignored.")); } return w; } pspp-1.4.1/src/data/mdd-writer.c0000644000175000017500000007147613700645725016065 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2018 Free Software Foundation, Inc. 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 3 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, see . */ #include #include "data/mdd-writer.h" #include #include #include #include #include #include #include "data/dictionary.h" #include "data/file-handle-def.h" #include "data/format.h" #include "data/make-file.h" #include "data/missing-values.h" #include "data/mrset.h" #include "data/short-names.h" #include "data/value-labels.h" #include "data/variable.h" #include "libpspp/message.h" #include "libpspp/misc.h" #include "libpspp/string-map.h" #include "libpspp/string-set.h" #include "libpspp/version.h" #include "gl/c-ctype.h" #include "gl/ftoastr.h" #include "gl/xalloc.h" #include "gl/xmemdup0.h" #include "gettext.h" #define _(msgid) gettext (msgid) #define N_(msgid) (msgid) #define _xml(X) CHAR_CAST (const xmlChar *, X) enum val_numeric_type { VAL_INTEGER_TYPE = 1, VAL_STRING_TYPE = 2, VAL_CATEGORICAL_TYPE = 3, VAL_DATETIME_TYPE = 5, VAL_DECIMAL_TYPE = 6 }; /* Get the numeric type of the variable. */ static enum val_numeric_type var_get_numeric_type_ (const struct variable *var) { const struct fmt_spec *print = var_get_print_format (var); if (var_get_type (var) == VAL_STRING) return VAL_STRING_TYPE; if (var_has_value_labels (var)) return VAL_CATEGORICAL_TYPE; if (print->d > 0) return VAL_DECIMAL_TYPE; if (print->type == FMT_DATETIME) return VAL_DATETIME_TYPE; if (print->type == FMT_F) return VAL_INTEGER_TYPE; return VAL_CATEGORICAL_TYPE; } /* Metadata file writer. */ struct mdd_writer { struct file_handle *fh; /* File handle. */ struct fh_lock *lock; /* Mutual exclusion for file. */ FILE *file; /* File stream. */ struct replace_file *rf; /* Ticket for replacing output file. */ xmlTextWriter *writer; }; /* Either a variable or a multi-response set. */ struct var_or_mrset { /* If true, the union contains a multi-response set. Otherwise, it contains a variable. */ bool is_mrset; union { const struct mrset *mrset; const struct variable *variable; }; }; struct all_dict_variables { struct var_or_mrset *vars; size_t count; }; struct all_dict_variables all_variables (struct dictionary *dict); /* Extract all variables in a dictionary, both normal and multi. Excludes variables which are subvariables of an MRSET. */ struct all_dict_variables all_variables (struct dictionary *dict) { size_t n_vars = dict_get_var_cnt (dict); /* Start with a set of all variable names. */ struct string_set var_names = STRING_SET_INITIALIZER (var_names); for (size_t i = 0; i < n_vars; ++i) { const struct variable *var = dict_get_var (dict, i); string_set_insert (&var_names, var_get_name (var)); } /* For each MRSET M, remove all subvariable names of M from S. */ size_t n_sets = dict_get_n_mrsets (dict); for (size_t set_idx = 0; set_idx < n_sets; set_idx++) { const struct mrset *mrset = dict_get_mrset (dict, set_idx); for (size_t i = 0; i < mrset->n_vars; ++i) { const struct variable *var = mrset->vars[i]; string_set_delete (&var_names, var_get_name (var)); } } /* Add the number of remaining variables to the number of MRSets. */ size_t var_count = n_sets + string_set_count (&var_names); /* Allocate an array of var_or_mrset pointers (initially null). */ struct var_or_mrset *var_or_mrset_array = XCALLOC (var_count, struct var_or_mrset); /* Fill the array. */ struct string_set added_mrsets = STRING_SET_INITIALIZER (added_mrsets); size_t var_idx = 0; for (size_t i = 0; i < n_vars; ++i) { const struct variable *var = dict_get_var (dict, i); bool found_in_mrset = false; for (size_t set_idx = 0; set_idx < n_sets; set_idx++) { const struct mrset *mrset = dict_get_mrset (dict, set_idx); for (size_t i = 0; i < mrset->n_vars; ++i) { const struct variable *subvar = mrset->vars[i]; if (!strcmp (var_get_name (var), var_get_name (subvar))) { /* Then this variable is a member of this MRSet. */ found_in_mrset = true; /* Check if this MRSet has already been added and add otherwise. */ if (!string_set_contains (&added_mrsets, mrset->name)) { string_set_insert (&added_mrsets, mrset->name); assert (var_idx < var_count); struct var_or_mrset *v_o_m = &var_or_mrset_array[var_idx++]; v_o_m->is_mrset = true; v_o_m->mrset = mrset; } } } } /* If the variable wasn't found to be a member of any MRSets, record it as a normal variable. */ if (!found_in_mrset) { /* The variable is not part of a multi-response set. */ assert (var_idx < var_count); struct var_or_mrset *v_o_m = &var_or_mrset_array[var_idx++]; v_o_m->is_mrset = false; v_o_m->variable = var; } } /* Ensure that we filled up the array. */ assert (var_idx == var_count); /* Cleanup. */ string_set_destroy (&added_mrsets); string_set_destroy (&var_names); struct all_dict_variables result; result.vars = var_or_mrset_array; result.count = var_count; return result; } /* Returns true if an I/O error has occurred on WRITER, false otherwise. */ static bool mdd_write_error (const struct mdd_writer *writer) { return ferror (writer->file); } static bool mdd_close (struct mdd_writer *w) { if (!w) return true; if (w->writer) xmlFreeTextWriter (w->writer); bool ok = true; if (w->file) { fflush (w->file); ok = !mdd_write_error (w); if (fclose (w->file) == EOF) ok = false; if (!ok) msg (ME, _("An I/O error occurred writing metadata file `%s'."), fh_get_file_name (w->fh)); if (ok ? !replace_file_commit (w->rf) : !replace_file_abort (w->rf)) ok = false; } fh_unlock (w->lock); fh_unref (w->fh); free (w); return ok; } static void write_empty_element (xmlTextWriter *writer, const char *name) { xmlTextWriterStartElement (writer, _xml (name)); xmlTextWriterEndElement (writer); } static void write_attr (xmlTextWriter *writer, const char *key, const char *value) { xmlTextWriterWriteAttribute (writer, _xml (key), _xml (value)); } static void write_global_name_space (xmlTextWriter *writer) { write_attr (writer, "global-name-space", "-1"); } static void write_xml_lang (xmlTextWriter *writer) { /* XXX should write real language */ xmlTextWriterWriteAttributeNS (writer, _xml ("xml"), _xml ("lang"), NULL, _xml ("en-US")); } static void write_value_label_value (xmlTextWriter *writer, const struct val_lab *vl, int width) { /* XXX below would better use syntax_gen_value(). */ const union value *value = val_lab_get_value (vl); if (width) { char *s = xmemdup0 (value->s, width); xmlTextWriterWriteAttribute (writer, _xml ("value"), _xml (s)); free (s); } else { char s[DBL_BUFSIZE_BOUND]; c_dtoastr (s, sizeof s, 0, 0, value->f); xmlTextWriterWriteAttribute (writer, _xml ("value"), _xml (s)); } } static void write_context (xmlTextWriter *writer, const char *name, const char *alternative) { xmlTextWriterStartElement (writer, _xml ("context")); write_attr (writer, "name", name); if (alternative) { xmlTextWriterStartElement (writer, _xml ("alternatives")); xmlTextWriterStartElement (writer, _xml ("alternative")); write_attr (writer, "name", alternative); xmlTextWriterEndElement (writer); write_empty_element (writer, "deleted"); xmlTextWriterEndElement (writer); } xmlTextWriterEndElement (writer); } static char * name_to_id (const char *name) { char *id = xmalloc (strlen (name) + 2); char *d = id; for (const char *s = name; *s; s++) { if (c_isalpha (*s)) *d++ = c_tolower (*s); else if (c_isdigit (*s)) { if (d == id) *d++ = '_'; *d++ = *s; } else { if (d == id || d[-1] != '_') *d++ = '_'; } } if (d > id && d[-1] == '_') d--; *d = '\0'; return id; } static void write_variable_section (xmlTextWriter *writer, const struct variable *var, int id) { xmlTextWriterStartElement (writer, _xml ("variable")); write_attr (writer, "name", var_get_name (var)); bool is_string = var_get_type (var) == VAL_STRING; int type = var_get_numeric_type_ (var); xmlTextWriterWriteFormatAttribute (writer, _xml ("type"), "%d", type); int max = is_string ? var_get_width (var) : 1; xmlTextWriterWriteFormatAttribute (writer, _xml ("max"), "%d", max); write_attr (writer, "maxtype", "3"); const char *label = var_get_label (var); if (label) { xmlTextWriterStartElement (writer, _xml ("labels")); write_attr (writer, "context", "LABEL"); xmlTextWriterStartElement (writer, _xml ("text")); write_attr (writer, "context", "ANALYSIS"); write_xml_lang (writer); xmlTextWriterWriteString (writer, _xml (label)); xmlTextWriterEndElement (writer); xmlTextWriterEndElement (writer); } const struct val_labs *val_labs = var_get_value_labels (var); size_t n_vls = val_labs_count (val_labs); if (n_vls) { const struct val_lab **vls = val_labs_sorted (val_labs); /* */ xmlTextWriterStartElement (writer, _xml ("categories")); write_global_name_space (writer); int width = var_get_width (var); for (size_t j = 0; j < n_vls; j++) { const struct val_lab *vl = vls[j]; const union value *value = val_lab_get_value (vl); /* */ xmlTextWriterStartElement (writer, _xml ("category")); xmlTextWriterWriteFormatAttribute (writer, _xml ("id"), "_%d", id); char *name = name_to_id (val_lab_get_label (vl)); write_attr (writer, "name", name); free (name); /* If the value here is missing, annotate it. XXX only checking "user" here because not sure of correct other cases. */ if (var_is_value_missing (var, value, MV_USER)) write_attr (writer, "missing", "user"); else if (var_is_value_missing (var, value, MV_SYSTEM)) write_attr (writer, "missing", "system"); /* */ xmlTextWriterStartElement (writer, _xml ("properties")); xmlTextWriterStartElement (writer, _xml ("property")); write_attr (writer, "name", "Value"); write_value_label_value (writer, vl, width); write_attr (writer, "type", "5"); write_attr (writer, "context", "Analysis"); xmlTextWriterEndElement (writer); /* */ xmlTextWriterEndElement (writer); /* */ /* */ xmlTextWriterStartElement (writer, _xml ("labels")); write_attr (writer, "context", "LABEL"); xmlTextWriterStartElement (writer, _xml ("text")); write_attr (writer, "context", "ANALYSIS"); write_xml_lang (writer); xmlTextWriterWriteString (writer, _xml (val_lab_get_label (vl))); xmlTextWriterEndElement (writer); /* */ xmlTextWriterEndElement (writer); /* */ /* */ xmlTextWriterEndElement (writer); } write_empty_element (writer, "deleted"); xmlTextWriterEndElement (writer); /* */ free (vls); } /* */ xmlTextWriterEndElement (writer); } bool mdd_write (struct file_handle *fh, struct dictionary *dict, const char *sav_name) { struct mdd_writer *w = xzalloc (sizeof *w); size_t n_vars = dict_get_var_cnt (dict); /* Open file handle as an exclusive writer. */ /* TRANSLATORS: this fragment will be interpolated into messages in fh_lock() that identify types of files. */ w->lock = fh_lock (fh, FH_REF_FILE, N_("metadata file"), FH_ACC_WRITE, true); if (w->lock == NULL) goto error; /* Create the file on disk. */ w->rf = replace_file_start (fh, "wb", 0444, &w->file); if (w->rf == NULL) { msg (ME, _("Error opening `%s' for writing as a metadata file: %s."), fh_get_file_name (fh), strerror (errno)); goto error; } w->writer = xmlNewTextWriter (xmlOutputBufferCreateFile (w->file, NULL)); if (!w->writer) { msg (ME, _("Internal error creating xmlTextWriter. " "Please report this to %s."), PACKAGE_BUGREPORT); goto error; } xmlTextWriterStartDocument (w->writer, NULL, "UTF-8", NULL); /* The MDD file contents seem to roughly correspond to the object model documentatation at: https://support.unicomsi.com/manuals/intelligence/75/DDL/MDM/docjet/metadata/chm/contentsf.html. */ /* */ xmlTextWriterStartPI (w->writer, _xml ("xml-stylesheet")); xmlTextWriterWriteString (w->writer, _xml ("type=\"text/xsl\" href=\"mdd.xslt\"")); xmlTextWriterEndPI (w->writer); xmlTextWriterStartElement (w->writer, _xml ("xml")); /* */ xmlTextWriterStartElementNS ( w->writer, _xml ("mdm"), _xml ("metadata"), _xml ("http://www.spss.com/mr/dm/metadatamodel/Arc%203/2000-02-04")); static const struct pair { const char *key, *value; } pairs[] = { { "mdm_createversion", "7.0.0.0.331" }, { "mdm_lastversion", "7.0.0.0.331" }, { "id", "c4c181c1-0d7c-42e3-abcd-f08296d1dfdc" }, { "data_version", "9" }, { "data_sub_version", "1" }, { "systemvariable", "0" }, { "dbfiltervalidation", "-1" }, }; const int n_pairs = sizeof pairs / sizeof *pairs; for (const struct pair *p = pairs; p < &pairs[n_pairs]; p++) xmlTextWriterWriteAttribute (w->writer, _xml (p->key), _xml (p->value)); /* */ xmlTextWriterStartElement (w->writer, _xml ("atoms")); /* XXX Real files contain a list of languages and a few other random strings here in elements. It's really not clear what they're good for. */ xmlTextWriterEndElement (w->writer); /* */ xmlTextWriterStartElement (w->writer, _xml ("datasources")); xmlTextWriterWriteAttribute (w->writer, _xml ("default"), _xml ("mrSavDsc")); /* */ xmlTextWriterStartElement (w->writer, _xml ("connection")); write_attr (w->writer, "name", "mrSavDsc"); write_attr (w->writer, "dblocation", sav_name); write_attr (w->writer, "cdscname", "mrSavDsc"); write_attr (w->writer, "project", "126"); struct all_dict_variables allvars = all_variables (dict); struct var_or_mrset *var_or_mrset_array = allvars.vars; size_t var_count = allvars.count; short_names_assign (dict); for (size_t i = 0; i < var_count; i++) { const struct var_or_mrset var_or_mrset = var_or_mrset_array[i]; xmlTextWriterStartElement (w->writer, _xml ("var")); if (var_or_mrset.is_mrset) { const struct mrset *mrset = var_or_mrset.mrset; write_attr (w->writer, "fullname", mrset->name + 1); write_attr (w->writer, "aliasname", mrset->name); for (size_t subvar_idx = 0; subvar_idx < mrset->n_vars; subvar_idx++) { xmlTextWriterStartElement(w->writer, _xml ("subalias")); xmlTextWriterWriteFormatAttribute (w->writer, _xml ("index"), "%zu", subvar_idx); write_attr (w->writer, "name", var_get_name (mrset->vars[subvar_idx])); xmlTextWriterEndElement (w->writer); /* subalias */ } } else { const struct variable *var = var_or_mrset.variable; char *short_name = xstrdup (var_get_short_name (var, 0)); for (char *p = short_name; *p; p++) *p = c_tolower (*p); write_attr (w->writer, "fullname", short_name); free (short_name); write_attr (w->writer, "aliasname", var_get_name (var)); const struct val_labs *val_labs = var_get_value_labels (var); size_t n_vls = val_labs_count (val_labs); if (n_vls) { const struct val_lab **vls = val_labs_sorted (val_labs); xmlTextWriterStartElement (w->writer, _xml ("nativevalues")); int width = var_get_width (var); for (size_t j = 0; j < n_vls; j++) { const struct val_lab *vl = vls[j]; xmlTextWriterStartElement (w->writer, _xml ("nativevalue")); char *fullname = name_to_id (val_lab_get_label (vl)); write_attr (w->writer, "fullname", fullname); free (fullname); write_value_label_value (w->writer, vl, width); xmlTextWriterEndElement (w->writer); } xmlTextWriterEndElement (w->writer); free (vls); } } xmlTextWriterEndElement (w->writer); /* var */ } xmlTextWriterEndElement (w->writer); /* connection */ xmlTextWriterEndElement (w->writer); /* datasources */ /* If the dictionary has a label, record it here */ const char *file_label = dict_get_label (dict); if (file_label != NULL) { xmlTextWriterStartElement (w->writer, _xml ("labels")); write_attr (w->writer, "context", "LABEL"); xmlTextWriterStartElement (w->writer, _xml ("text")); write_attr (w->writer, "context", "ANALYSIS"); write_xml_lang (w->writer); xmlTextWriterWriteString (w->writer, _xml (file_label)); /* */ xmlTextWriterEndElement (w->writer); /* */ xmlTextWriterEndElement (w->writer); } /* We reserve ids 1...N_VARS for variables and then start other ids after that. */ int id = dict_get_var_cnt (dict) + 1; /* */ xmlTextWriterStartElement (w->writer, _xml ("definition")); for (size_t i = 0; i < var_count; i++) { xmlTextWriterWriteFormatAttribute (w->writer, _xml ("id"), "%zu", i + 1); const struct var_or_mrset var_or_mrset = var_or_mrset_array[i]; if (var_or_mrset.is_mrset) { const struct mrset *mrset = var_or_mrset.mrset; xmlTextWriterStartElement (w->writer, _xml ("variable")); write_attr (w->writer, "name", mrset->name); /* Use the type of the first subvariable as the type of the MRSET? */ write_attr (w->writer, "type", "3"); xmlTextWriterStartElement (w->writer, _xml ("properties")); xmlTextWriterStartElement (w->writer, _xml ("property")); write_attr (w->writer, "name", "QvLabel"); write_attr (w->writer, "value", mrset->name); write_attr (w->writer, "type", "8"); write_attr (w->writer, "context", "Analysis"); /* */ xmlTextWriterEndElement (w->writer); /* */ xmlTextWriterEndElement (w->writer); xmlTextWriterStartElement (w->writer, _xml ("labels")); write_attr (w->writer, "context", "LABEL"); xmlTextWriterStartElement (w->writer, _xml ("text")); write_attr (w->writer, "context", "ANALYSIS"); write_xml_lang (w->writer); xmlTextWriterWriteString (w->writer, _xml (mrset->label)); /* */ xmlTextWriterEndElement (w->writer); /* */ xmlTextWriterEndElement (w->writer); xmlTextWriterStartElement (w->writer, _xml ("categories")); write_attr (w->writer, "global-name-space", "-1"); write_empty_element (w->writer, "deleted"); /* Individual categories */ int value = 2; for (size_t var_idx = 0; var_idx < mrset->n_vars; ++var_idx) { const struct variable *subvar = mrset->vars[var_idx]; value += 2; xmlTextWriterStartElement (w->writer, _xml ("category")); write_attr (w->writer, "context", "LABEL"); char *name_without_spaces = strdup (var_get_name (subvar)); for (size_t i = 0; name_without_spaces[i]; ++i) if (name_without_spaces[i] == ' ') name_without_spaces[i] = '_'; write_attr (w->writer, "name", name_without_spaces); free (name_without_spaces); xmlTextWriterStartElement (w->writer, _xml ("properties")); xmlTextWriterStartElement (w->writer, _xml ("property")); write_attr (w->writer, "name", "QvBasicNum"); xmlTextWriterWriteFormatAttribute (w->writer, _xml ("value"), "%d", value); write_attr (w->writer, "type", "3"); write_attr (w->writer, "context", "Analysis"); /* */ xmlTextWriterEndElement (w->writer); /* */ xmlTextWriterEndElement (w->writer); xmlTextWriterStartElement (w->writer, _xml ("labels")); write_attr (w->writer, "context", "LABEL"); xmlTextWriterStartElement (w->writer, _xml ("text")); write_attr (w->writer, "context", "ANALYSIS"); write_xml_lang (w->writer); xmlTextWriterWriteString (w->writer, _xml (var_get_label (subvar))); /* */ xmlTextWriterEndElement (w->writer); /* */ xmlTextWriterEndElement (w->writer); /* */ xmlTextWriterEndElement (w->writer); } /* */ xmlTextWriterEndElement (w->writer); /* */ xmlTextWriterEndElement (w->writer); } else { const struct variable *var = var_or_mrset.variable; write_variable_section(w->writer, var, id++); } } xmlTextWriterEndElement (w->writer); /* */ write_empty_element (w->writer, "system"); write_empty_element (w->writer, "systemrouting"); write_empty_element (w->writer, "mappings"); /* */ xmlTextWriterStartElement (w->writer, _xml ("design")); xmlTextWriterStartElement (w->writer, _xml ("fields")); write_attr (w->writer, "name", "@fields"); write_global_name_space (w->writer); for (size_t i = 0; i < n_vars; i++) { const struct variable *var = dict_get_var (dict, i); xmlTextWriterStartElement (w->writer, _xml ("variable")); xmlTextWriterWriteFormatAttribute (w->writer, _xml ("id"), "_%zu", i + 1); write_attr (w->writer, "name", var_get_name (var)); xmlTextWriterWriteFormatAttribute (w->writer, _xml ("ref"), "%zu", i + 1); xmlTextWriterEndElement (w->writer); } write_empty_element (w->writer, "deleted"); xmlTextWriterEndElement (w->writer); xmlTextWriterStartElement (w->writer, _xml ("types")); write_attr (w->writer, "name", "@types"); write_global_name_space (w->writer); write_empty_element (w->writer, "deleted"); xmlTextWriterEndElement (w->writer); xmlTextWriterStartElement (w->writer, _xml ("pages")); write_attr (w->writer, "name", "@pages"); write_global_name_space (w->writer); write_empty_element (w->writer, "deleted"); xmlTextWriterEndElement (w->writer); xmlTextWriterStartElement (w->writer, _xml ("routings")); xmlTextWriterStartElement (w->writer, _xml ("scripts")); write_empty_element (w->writer, "deleted"); xmlTextWriterEndElement (w->writer); xmlTextWriterEndElement (w->writer); xmlTextWriterEndElement (w->writer); /* */ /* XXX should use the real language */ xmlTextWriterStartElement (w->writer, _xml ("languages")); write_attr (w->writer, "base", "EN-US"); xmlTextWriterStartElement (w->writer, _xml ("language")); write_attr (w->writer, "name", "EN-US"); write_attr (w->writer, "id", "0409"); xmlTextWriterEndElement (w->writer); write_empty_element (w->writer, "deleted"); xmlTextWriterEndElement (w->writer); /* */ xmlTextWriterStartElement (w->writer, _xml ("contexts")); write_attr (w->writer, "base", "Analysis"); write_context (w->writer, "ANALYSIS", "QUESTION"); write_context (w->writer, "QUESTION", "ANALYSIS"); write_context (w->writer, "WEBAPP", NULL); write_empty_element (w->writer, "deleted"); xmlTextWriterEndElement (w->writer); /* */ xmlTextWriterStartElement (w->writer, _xml ("labeltypes")); write_attr (w->writer, "base", "label"); write_context (w->writer, "LABEL", NULL); write_empty_element (w->writer, "deleted"); xmlTextWriterEndElement (w->writer); /* */ write_empty_element (w->writer, "routingcontexts"); /* */ xmlTextWriterStartElement (w->writer, _xml ("scripttypes")); write_attr (w->writer, "base", "mrScriptBasic"); write_context (w->writer, "MRSCRIPTBASIC", NULL); write_empty_element (w->writer, "deleted"); xmlTextWriterEndElement (w->writer); /* */ write_empty_element (w->writer, "versionlist"); /* */ xmlTextWriterStartElement (w->writer, _xml ("categorymap")); struct string_set categories = STRING_SET_INITIALIZER (categories); for (size_t i = 0; i < n_vars; i++) { const struct variable *var = dict_get_var (dict, i); const struct val_labs *val_labs = var_get_value_labels (var); size_t n_vls = val_labs_count (val_labs); if (n_vls) { const struct val_lab **vls = val_labs_sorted (val_labs); for (size_t j = 0; j < n_vls; j++) { const struct val_lab *vl = vls[j]; char *label = name_to_id (val_lab_get_label (vl)); if (string_set_insert_nocopy (&categories, label)) { xmlTextWriterStartElement (w->writer, _xml ("categoryid")); write_attr (w->writer, "name", label); xmlTextWriterWriteFormatAttribute ( w->writer, _xml ("value"), "%zu", string_set_count (&categories)); xmlTextWriterEndElement (w->writer); } } free (vls); } } string_set_destroy (&categories); xmlTextWriterEndElement (w->writer); /* */ xmlTextWriterStartElement (w->writer, _xml ("savelogs")); xmlTextWriterStartElement (w->writer, _xml ("savelog")); write_attr (w->writer, "fileversion", "7.0.0.0.331"); write_attr (w->writer, "versionset", ""); write_attr (w->writer, "username", "Administrator"); time_t t; if (time (&t) == (time_t) -1) write_attr (w->writer, "date", "01/01/1970 00:00:00 AM"); else { struct tm *tm = localtime (&t); int hour = tm->tm_hour % 12; xmlTextWriterWriteFormatAttribute (w->writer, _xml ("date"), "%02d/%02d/%04d %02d:%02d:%02d %s", tm->tm_mon + 1, tm->tm_mday, tm->tm_year + 1900, hour ? hour : 12, tm->tm_min, tm->tm_sec, tm->tm_hour < 12 ? "AM" : "PM"); } xmlTextWriterStartElement (w->writer, _xml ("user")); write_attr (w->writer, "name", "pspp"); write_attr (w->writer, "fileversion", version); write_attr (w->writer, "comment", "Written by GNU PSPP"); xmlTextWriterEndElement (w->writer); xmlTextWriterEndElement (w->writer); xmlTextWriterEndElement (w->writer); /* */ xmlTextWriterEndElement (w->writer); xmlTextWriterEndDocument (w->writer); free(var_or_mrset_array); error: mdd_close (w); return NULL; } pspp-1.4.1/src/data/data-in.h0000644000175000017500000000267513320146056015313 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 1997-9, 2000, 2006, 2010, 2011 Free Software Foundation, Inc. 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 3 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, see . */ #ifndef DATA_DATA_IN_H #define DATA_DATA_IN_H 1 #include #include "data/format.h" #include "libpspp/str.h" union value; struct dictionary; char *data_in (struct substring input, const char *input_encoding, enum fmt_type, union value *output, int width, const char *output_encoding); bool data_in_msg (struct substring input, const char *input_encoding, enum fmt_type, union value *output, int width, const char *output_encoding); void data_in_imply_decimals (struct substring input, const char *encoding, enum fmt_type format, int d, union value *output); #endif /* data/data-in.h */ pspp-1.4.1/src/data/caseinit.c0000644000175000017500000002020413320146056015554 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2007, 2009, 2010, 2011 Free Software Foundation, Inc. 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 3 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, see . */ #include #include "data/caseinit.h" #include #include #include #include "data/case.h" #include "data/dictionary.h" #include "data/value.h" #include "data/variable.h" #include "libpspp/array.h" #include "libpspp/assertion.h" #include "libpspp/compiler.h" #include "gl/xalloc.h" /* Initializer list: a set of values to write to locations within a case. */ /* Binds a value with a place to put it. */ struct init_value { size_t case_index; int width; union value value; }; /* A set of values to initialize in a case. */ struct init_list { struct init_value *values; size_t cnt; }; /* A bitmap of the "left" status of variables. */ enum leave_class { LEAVE_REINIT = 0x001, /* Reinitialize for every case. */ LEAVE_LEFT = 0x002 /* Keep the value from one case to the next. */ }; /* Initializes LIST as an empty initializer list. */ static void init_list_create (struct init_list *list) { list->values = NULL; list->cnt = 0; } /* Initializes NEW as a copy of OLD. */ static void init_list_clone (struct init_list *new, const struct init_list *old) { size_t i; new->values = xmemdup (old->values, old->cnt * sizeof *old->values); new->cnt = old->cnt; for (i = 0; i < new->cnt; i++) { struct init_value *iv = &new->values[i]; value_clone (&iv->value, &iv->value, iv->width); } } /* Frees the storage associated with LIST. */ static void init_list_destroy (struct init_list *list) { struct init_value *iv; for (iv = &list->values[0]; iv < &list->values[list->cnt]; iv++) value_destroy (&iv->value, iv->width); free (list->values); } /* Clears LIST, making it an empty list. */ static void init_list_clear (struct init_list *list) { init_list_destroy (list); init_list_create (list); } /* Compares `struct init_value's A and B by case_index and returns a strcmp()-type result. */ static int compare_init_values (const void *a_, const void *b_, const void *aux UNUSED) { const struct init_value *a = a_; const struct init_value *b = b_; return a->case_index < b->case_index ? -1 : a->case_index > b->case_index; } /* Returns true if LIST includes CASE_INDEX, false otherwise. */ static bool init_list_includes (const struct init_list *list, size_t case_index) { struct init_value value; value.case_index = case_index; return binary_search (list->values, list->cnt, sizeof *list->values, &value, compare_init_values, NULL) != NULL; } /* Marks LIST to initialize the `union value's for the variables in dictionary D that both (1) fall in the leave class or classes designated by INCLUDE and (2) are not in EXCLUDE. */ static void init_list_mark (struct init_list *list, const struct init_list *exclude, enum leave_class include, const struct dictionary *d) { size_t var_cnt = dict_get_var_cnt (d); size_t i; assert (list != exclude); list->values = xnrealloc (list->values, list->cnt + dict_get_var_cnt (d), sizeof *list->values); for (i = 0; i < var_cnt; i++) { struct variable *v = dict_get_var (d, i); size_t case_index = var_get_case_index (v); struct init_value *iv; /* Only include the correct class. */ if (!(include & (var_get_leave (v) ? LEAVE_LEFT : LEAVE_REINIT))) continue; /* Don't include those to be excluded. */ if (exclude != NULL && init_list_includes (exclude, case_index)) continue; iv = &list->values[list->cnt++]; iv->case_index = case_index; iv->width = var_get_width (v); value_init (&iv->value, iv->width); if (var_is_numeric (v) && var_get_leave (v)) iv->value.f = 0; else value_set_missing (&iv->value, iv->width); } /* Drop duplicates. */ list->cnt = sort_unique (list->values, list->cnt, sizeof *list->values, compare_init_values, NULL); } /* Initializes data in case C to the values in the initializer LIST. */ static void init_list_init (const struct init_list *list, struct ccase *c) { const struct init_value *iv; for (iv = &list->values[0]; iv < &list->values[list->cnt]; iv++) value_copy (case_data_rw_idx (c, iv->case_index), &iv->value, iv->width); } /* Updates the values in the initializer LIST from the data in case C. */ static void init_list_update (const struct init_list *list, const struct ccase *c) { struct init_value *iv; for (iv = &list->values[0]; iv < &list->values[list->cnt]; iv++) value_copy (&iv->value, case_data_idx (c, iv->case_index), iv->width); } /* A case initializer. */ struct caseinit { /* Values that do not need to be initialized by the procedure, because they are initialized by the data source. */ struct init_list preinited_values; /* Values that need to be initialized to SYSMIS or spaces in each case. */ struct init_list reinit_values; /* Values that need to be initialized to 0 or spaces in the first case and thereafter retain their values from case to case. */ struct init_list left_values; }; /* Creates and returns a new case initializer. */ struct caseinit * caseinit_create (void) { struct caseinit *ci = xmalloc (sizeof *ci); init_list_create (&ci->preinited_values); init_list_create (&ci->reinit_values); init_list_create (&ci->left_values); return ci; } /* Creates and returns a copy of OLD. */ struct caseinit * caseinit_clone (struct caseinit *old) { struct caseinit *new = xmalloc (sizeof *new); init_list_clone (&new->preinited_values, &old->preinited_values); init_list_clone (&new->reinit_values, &old->reinit_values); init_list_clone (&new->left_values, &old->left_values); return new; } /* Clears the contents of case initializer CI. */ void caseinit_clear (struct caseinit *ci) { init_list_clear (&ci->preinited_values); init_list_clear (&ci->reinit_values); init_list_clear (&ci->left_values); } /* Destroys case initializer CI. */ void caseinit_destroy (struct caseinit *ci) { if (ci != NULL) { init_list_destroy (&ci->preinited_values); init_list_destroy (&ci->reinit_values); init_list_destroy (&ci->left_values); free (ci); } } /* Marks the variables from dictionary D in CI as being initialized by the data source, so that the case initializer need not initialize them itself. */ void caseinit_mark_as_preinited (struct caseinit *ci, const struct dictionary *d) { init_list_mark (&ci->preinited_values, NULL, LEAVE_REINIT | LEAVE_LEFT, d); } /* Marks in CI the variables from dictionary D, except for any variables that were already marked with caseinit_mark_as_preinited, as needing initialization according to their leave status. */ void caseinit_mark_for_init (struct caseinit *ci, const struct dictionary *d) { init_list_mark (&ci->reinit_values, &ci->preinited_values, LEAVE_REINIT, d); init_list_mark (&ci->left_values, &ci->preinited_values, LEAVE_LEFT, d); } /* Initializes variables in *C as described by CI. C must not be shared. */ void caseinit_init_vars (const struct caseinit *ci, struct ccase *c) { init_list_init (&ci->reinit_values, c); init_list_init (&ci->left_values, c); } /* Updates the left vars in CI from the data in C, so that the next call to caseinit_init_vars will store those values in the next case. */ void caseinit_update_left_vars (struct caseinit *ci, const struct ccase *c) { init_list_update (&ci->left_values, c); } pspp-1.4.1/src/data/caseproto.c0000644000175000017500000003057413546443556016006 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2009, 2011 Free Software Foundation, Inc. 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 3 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, see . */ #include #include "data/caseproto.h" #include "data/val-type.h" #include "data/value.h" #include "libpspp/array.h" #include "libpspp/assertion.h" #include "libpspp/pool.h" #include "gl/minmax.h" static struct caseproto *caseproto_unshare (struct caseproto *); static bool try_init_strings (const struct caseproto *, size_t first, size_t last, union value[]); static void init_strings (const struct caseproto *, size_t first, size_t last, union value[]); static void destroy_strings (const struct caseproto *, size_t first, size_t last, union value[]); static size_t count_strings (const struct caseproto *, size_t idx, size_t count); /* Returns the number of bytes to allocate for a struct caseproto with room for N_WIDTHS elements in its widths[] array. */ static inline size_t caseproto_size (size_t n_widths) { return (offsetof (struct caseproto, widths) + n_widths * sizeof (((struct caseproto *) NULL)->widths[0])); } /* Creates and returns a case prototype that initially has no widths. */ struct caseproto * caseproto_create (void) { enum { N_ALLOCATE = 4 }; struct caseproto *proto = xmalloc (caseproto_size (N_ALLOCATE)); proto->ref_cnt = 1; proto->strings = NULL; proto->n_strings = 0; proto->n_widths = 0; proto->allocated_widths = N_ALLOCATE; return proto; } static void do_unref (void *proto_) { struct caseproto *proto = proto_; caseproto_unref (proto); } /* Creates and returns a new reference to PROTO. When POOL is destroyed, the new reference will be destroyed (unrefed). */ struct caseproto * caseproto_ref_pool (const struct caseproto *proto_, struct pool *pool) { struct caseproto *proto = caseproto_ref (proto_); pool_register (pool, do_unref, proto); return proto; } /* Returns a replacement for PROTO that is unshared and has enough room for at least N_WIDTHS widths before additional memory is needed. */ struct caseproto * caseproto_reserve (struct caseproto *proto, size_t n_widths) { proto = caseproto_unshare (proto); if (n_widths > proto->allocated_widths) { proto->allocated_widths *= MAX (proto->allocated_widths * 2, n_widths); proto = xrealloc (proto, caseproto_size (proto->allocated_widths)); } return proto; } /* Returns a replacement for PROTO with WIDTH appended. */ struct caseproto * caseproto_add_width (struct caseproto *proto, int width) { assert (width >= -1 && width <= MAX_STRING); proto = caseproto_reserve (proto, proto->n_widths + 1); proto->widths[proto->n_widths++] = width; proto->n_strings += count_strings (proto, proto->n_widths - 1, 1); return proto; } /* Returns a replacement for PROTO with the width at index IDX replaced by WIDTH. IDX may be greater than the current number of widths in PROTO, in which case any gap is filled in by widths of -1. */ struct caseproto * caseproto_set_width (struct caseproto *proto, size_t idx, int width) { assert (width >= -1 && width <= MAX_STRING); proto = caseproto_reserve (proto, idx + 1); while (idx >= proto->n_widths) proto->widths[proto->n_widths++] = -1; proto->n_strings -= count_strings (proto, idx, 1); proto->widths[idx] = width; proto->n_strings += count_strings (proto, idx, 1); return proto; } /* Returns a replacement for PROTO with WIDTH inserted just before index BEFORE, or just after the last element if BEFORE is the number of widths in PROTO. */ struct caseproto * caseproto_insert_width (struct caseproto *proto, size_t before, int width) { assert (before <= proto->n_widths); proto = caseproto_reserve (proto, proto->n_widths + 1); proto->n_strings += value_needs_init (width); insert_element (proto->widths, proto->n_widths, sizeof *proto->widths, before); proto->widths[before] = width; proto->n_widths++; return proto; } /* Returns a replacement for PROTO with CNT widths removed starting at index IDX. */ struct caseproto * caseproto_remove_widths (struct caseproto *proto, size_t idx, size_t cnt) { assert (caseproto_range_is_valid (proto, idx, cnt)); proto = caseproto_unshare (proto); proto->n_strings -= count_strings (proto, idx, cnt); remove_range (proto->widths, proto->n_widths, sizeof *proto->widths, idx, cnt); proto->n_widths -= cnt; return proto; } /* Returns a replacement for PROTO in which the CNT widths starting at index OLD_WIDTH now start at index NEW_WIDTH, with other widths shifting out of the way to make room. */ struct caseproto * caseproto_move_widths (struct caseproto *proto, size_t old_start, size_t new_start, size_t cnt) { assert (caseproto_range_is_valid (proto, old_start, cnt)); assert (caseproto_range_is_valid (proto, new_start, cnt)); proto = caseproto_unshare (proto); move_range (proto->widths, proto->n_widths, sizeof *proto->widths, old_start, new_start, cnt); return proto; } /* Returns true if PROTO contains COUNT widths starting at index OFS, false if any of those widths are out of range for PROTO. */ bool caseproto_range_is_valid (const struct caseproto *proto, size_t ofs, size_t count) { return (count <= proto->n_widths && ofs <= proto->n_widths && ofs + count <= proto->n_widths); } /* Returns true if A and B have the same widths along their common length. (When this is so, a case with prototype A may be extended or truncated to have prototype B without having to change any existing values, and vice versa.) */ bool caseproto_is_conformable (const struct caseproto *a, const struct caseproto *b) { size_t min; size_t i; min = MIN (a->n_widths, b->n_widths); for (i = 0; i < min; i++) if (a->widths[i] != b->widths[i]) return false; return true; } /* Returns true if the N widths starting at A_START in A are the same as the N widths starting at B_START in B, false if any of the corresponding widths differ. */ bool caseproto_equal (const struct caseproto *a, size_t a_start, const struct caseproto *b, size_t b_start, size_t n) { size_t i; assert (caseproto_range_is_valid (a, a_start, n)); assert (caseproto_range_is_valid (b, b_start, n)); for (i = 0; i < n; i++) if (a->widths[a_start + i] != b->widths[b_start + i]) return false; return true; } /* Returns true if an array of values that is to be used for data of the format specified in PROTO needs to be initialized by calling caseproto_init_values, false if that step may be skipped because such an initialization would be a no-op anyhow. This optimization is useful only when a large number of initializations of such arrays may be skipped as a group. */ bool caseproto_needs_init_values (const struct caseproto *proto) { return proto->n_strings > 0; } /* Initializes the values in VALUES as required by PROTO, by calling value_init() on each value for which this is required. The data in VALUES have indeterminate contents until explicitly written. VALUES must have at least caseproto_get_n_widths(PROTO) elements; only that many elements of VALUES are initialized. The caller retains ownership of PROTO. */ void caseproto_init_values (const struct caseproto *proto, union value values[]) { init_strings (proto, 0, proto->n_strings, values); } /* Like caseproto_init_values, but returns false instead of terminating if memory cannot be obtained. */ bool caseproto_try_init_values (const struct caseproto *proto, union value values[]) { return try_init_strings (proto, 0, proto->n_strings, values); } /* Initializes the data in VALUES that are in NEW but not in OLD, destroys the data in VALUES that are in OLD but not NEW, and does not modify the data in VALUES that are in both OLD and NEW. VALUES must previously have been initialized as required by OLD using e.g. caseproto_init_values. The data in VALUES that are in NEW but not in OLD will have indeterminate contents until explicitly written. OLD and NEW must be conformable for this operation, as reported by caseproto_is_conformable. The caller retains ownership of OLD and NEW. */ void caseproto_reinit_values (const struct caseproto *old, const struct caseproto *new, union value values[]) { size_t old_n_long = old->n_strings; size_t new_n_long = new->n_strings; expensive_assert (caseproto_is_conformable (old, new)); if (new_n_long > old_n_long) init_strings (new, old_n_long, new_n_long, values); else if (new_n_long < old_n_long) destroy_strings (old, new_n_long, old_n_long, values); } /* Frees the values in VALUES as required by PROTO, by calling value_destroy() on each value for which this is required. The values must previously have been initialized using e.g. caseproto_init_values. The caller retains ownership of PROTO. */ void caseproto_destroy_values (const struct caseproto *proto, union value values[]) { destroy_strings (proto, 0, proto->n_strings, values); } /* Copies COUNT values, whose widths are given by widths in PROTO starting with index IDX, from SRC to DST. The caller must ensure that the values in SRC and DST were appropriately initialized using e.g. caseproto_init_values. */ void caseproto_copy (const struct caseproto *proto, size_t idx, size_t count, union value *dst, const union value *src) { size_t i; assert (caseproto_range_is_valid (proto, idx, count)); for (i = 0; i < count; i++) value_copy (&dst[idx + i], &src[idx + i], proto->widths[idx + i]); } void caseproto_free__ (struct caseproto *proto) { free (proto->strings); free (proto); } void caseproto_refresh_string_cache__ (const struct caseproto *proto_) { struct caseproto *proto = CONST_CAST (struct caseproto *, proto_); size_t n, i; assert (proto->strings == NULL); assert (proto->n_strings > 0); proto->strings = xmalloc (proto->n_strings * sizeof *proto->strings); n = 0; for (i = 0; i < proto->n_widths; i++) if (proto->widths[i] > 0) proto->strings[n++] = i; assert (n == proto->n_strings); } static struct caseproto * caseproto_unshare (struct caseproto *old) { struct caseproto *new; if (old->ref_cnt > 1) { new = xmemdup (old, caseproto_size (old->allocated_widths)); new->ref_cnt = 1; --old->ref_cnt; } else { new = old; free (new->strings); } new->strings = NULL; return new; } static bool try_init_strings (const struct caseproto *proto, size_t first, size_t last, union value values[]) { size_t i; if (last > 0 && proto->strings == NULL) caseproto_refresh_string_cache__ (proto); for (i = first; i < last; i++) { size_t idx = proto->strings[i]; if (!value_try_init (&values[idx], proto->widths[idx])) { destroy_strings (proto, first, i, values); return false; } } return true; } static void init_strings (const struct caseproto *proto, size_t first, size_t last, union value values[]) { if (!try_init_strings (proto, first, last, values)) xalloc_die (); } static void destroy_strings (const struct caseproto *proto, size_t first, size_t last, union value values[]) { size_t i; if (last > 0 && proto->strings == NULL) caseproto_refresh_string_cache__ (proto); for (i = first; i < last; i++) { size_t idx = proto->strings[i]; value_destroy (&values[idx], proto->widths[idx]); } } static size_t count_strings (const struct caseproto *proto, size_t idx, size_t count) { size_t n, i; n = 0; for (i = 0; i < count; i++) n += proto->widths[idx + i] > 0; return n; } pspp-1.4.1/src/data/short-names.c0000644000175000017500000001210413320146056016215 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2007, 2009, 2010, 2011, 2014 Free Software Foundation, Inc. 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 3 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, see . */ #include #include "data/short-names.h" #include "data/dictionary.h" #include "data/sys-file-private.h" #include "data/variable.h" #include "libpspp/assertion.h" #include "libpspp/compiler.h" #include "libpspp/i18n.h" #include "libpspp/message.h" #include "libpspp/str.h" #include "libpspp/stringi-set.h" #include "gettext.h" #define _(msgid) gettext (msgid) static void claim_short_name (struct variable *v, size_t i, struct stringi_set *short_names) { const char *short_name = var_get_short_name (v, i); if (short_name != NULL && !stringi_set_insert (short_names, short_name)) var_set_short_name (v, i, NULL); } /* Form initial short_name from the variable name, then try _A, _B, ... _AA, _AB, etc., if needed. */ static void assign_short_name (struct variable *v, size_t i, struct stringi_set *short_names) { int trial; if (var_get_short_name (v, i) != NULL) return; for (trial = 0; ; trial++) { char suffix[SHORT_NAME_LEN + 1]; char *short_name; /* Compose suffix. */ if (trial == 0) suffix[0] = '\0'; else { suffix[0] = '_'; str_format_26adic (trial, true, &suffix[1], sizeof suffix - 1); } /* Set name. */ short_name = utf8_encoding_concat (var_get_name (v), suffix, var_get_encoding (v), SHORT_NAME_LEN); if (stringi_set_insert (short_names, short_name)) { var_set_short_name (v, i, short_name); free (short_name); return; } free (short_name); } } /* Assigns a valid, unique short_name[] to each variable in D. Each variable whose actual name is short has highest priority for that short name. Otherwise, variables with an existing short_name[] have the next highest priority for a given short name; if it is already taken, then the variable is treated as if short_name[] had been empty. Otherwise, long names are truncated to form short names. If that causes conflicts, variables are renamed as PREFIX_A, PREFIX_B, and so on. */ void short_names_assign (struct dictionary *d) { size_t var_cnt = dict_get_var_cnt (d); struct stringi_set short_names; size_t i, j; stringi_set_init (&short_names); /* Clear short names that conflict with a variable name. */ for (i = 0; i < var_cnt; i++) { struct variable *v = dict_get_var (d, i); int segment_cnt = sfm_width_to_segments (var_get_width (v)); for (j = 0; j < segment_cnt; j++) { const char *name = var_get_short_name (v, j); if (name != NULL) { struct variable *ov = dict_lookup_var (d, name); if (ov != NULL && (ov != v || j > 0)) var_set_short_name (v, j, NULL); } } } /* Give variables whose names are short the corresponding short name. */ for (i = 0; i < var_cnt; i++) { struct variable *v = dict_get_var (d, i); const char *name = var_get_name (v); int len = recode_string_len (var_get_encoding (v), "UTF-8", name, -1); if (len <= SHORT_NAME_LEN) var_set_short_name (v, 0, name); } /* Each variable with an assigned short name for its first segment now gets it unless there is a conflict. In case of conflict, the claimant earlier in dictionary order wins. Then similarly for additional segments of very long strings. */ for (i = 0; i < var_cnt; i++) { struct variable *v = dict_get_var (d, i); claim_short_name (v, 0, &short_names); } for (i = 0; i < var_cnt; i++) { struct variable *v = dict_get_var (d, i); int segment_cnt = sfm_width_to_segments (var_get_width (v)); for (j = 1; j < segment_cnt; j++) claim_short_name (v, j, &short_names); } /* Assign short names to first segment of remaining variables, then similarly for additional segments. */ for (i = 0; i < var_cnt; i++) { struct variable *v = dict_get_var (d, i); assign_short_name (v, 0, &short_names); } for (i = 0; i < var_cnt; i++) { struct variable *v = dict_get_var (d, i); int segment_cnt = sfm_width_to_segments (var_get_width (v)); for (j = 1; j < segment_cnt; j++) assign_short_name (v, j, &short_names); } stringi_set_destroy (&short_names); } pspp-1.4.1/src/data/case-matcher.h0000644000175000017500000000230413320146056016317 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2008, 2009 Free Software Foundation, Inc. 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 3 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, see . */ #ifndef DATA_CASE_MATCHER_H #define DATA_CASE_MATCHER_H 1 #include struct ccase; struct subcase; union value; struct case_matcher *case_matcher_create (void); void case_matcher_add_input (struct case_matcher *, const struct subcase *, struct ccase **, bool *is_minimal); void case_matcher_destroy (struct case_matcher *); bool case_matcher_match (struct case_matcher *, union value **by); #endif /* data/case-matcher.h */ pspp-1.4.1/src/data/datasheet.c0000644000175000017500000013621613670210420015725 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2007, 2009, 2010, 2011, 2012, 2013 Free Software Foundation, Inc. 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 3 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, see . */ #include #include "data/datasheet.h" #include #include #include "data/casereader-provider.h" #include "data/casereader.h" #include "data/casewriter.h" #include "data/lazy-casereader.h" #include "data/settings.h" #include "libpspp/array.h" #include "libpspp/assertion.h" #include "libpspp/misc.h" #include "libpspp/range-map.h" #include "libpspp/range-set.h" #include "libpspp/sparse-xarray.h" #include "libpspp/taint.h" #include "libpspp/tower.h" #include "gl/minmax.h" #include "gl/md4.h" #include "gl/xalloc.h" struct column; static struct axis *axis_create (void); static struct axis *axis_clone (const struct axis *); static void axis_destroy (struct axis *); static void axis_hash (const struct axis *, struct md4_ctx *); static bool axis_allocate (struct axis *, unsigned long int request, unsigned long int *start, unsigned long int *width); static void axis_make_available (struct axis *, unsigned long int start, unsigned long int width); static unsigned long int axis_extend (struct axis *, unsigned long int width); static unsigned long int axis_map (const struct axis *, unsigned long log_pos); static unsigned long axis_get_size (const struct axis *); static void axis_insert (struct axis *, unsigned long int log_start, unsigned long int phy_start, unsigned long int cnt); static void axis_remove (struct axis *, unsigned long int start, unsigned long int cnt); static void axis_move (struct axis *, unsigned long int old_start, unsigned long int new_start, unsigned long int cnt); static struct source *source_create_empty (size_t n_bytes); static struct source *source_create_casereader (struct casereader *); static struct source *source_clone (const struct source *); static void source_destroy (struct source *); static casenumber source_get_backing_n_rows (const struct source *); static int source_allocate_column (struct source *, int width); static void source_release_column (struct source *, int ofs, int width); static bool source_in_use (const struct source *); static bool source_read (const struct column *, casenumber row, union value *, size_t n); static bool source_write (const struct column *, casenumber row, const union value *, size_t n); static bool source_write_column (struct column *, const union value *); static bool source_has_backing (const struct source *); static int get_source_index (const struct datasheet *ds, const struct source *source); /* A datasheet is internally composed from a set of data files, called "sources". The sources that make up a datasheet must have the same number of rows (cases), but their numbers of columns (variables) may vary. A datasheet's external view is produced by mapping (permuting and selecting) its internal data. Thus, we can rearrange or delete rows or columns simply by modifying the mapping. We add rows by adding rows to each source and to the row mapping. We add columns by adding a new source, then adding that source to the column mapping. Each source in a datasheet can be a casereader or a sparse_xarray. Casereaders are read-only, so when sources made from casereaders need to be modified, it is done "virtually" through being overlaid by a sparse_xarray. */ struct source { struct range_set *avail; /* Free bytes are set to 1s. */ struct sparse_xarray *data; /* Data at top level, atop the backing. */ struct casereader *backing; /* Backing casereader (or null). */ casenumber backing_rows; /* Number of rows in backing (if backed). */ size_t n_used; /* Number of column in use (if backed). */ }; /* A logical column. */ struct column { struct source *source; /* Source of the underlying physical column. */ int value_ofs; /* If 'source' has a backing casereader, column's value offset in its cases. */ int byte_ofs; /* Byte offset in source's sparse_xarray. */ int width; /* 0=numeric, otherwise string width. */ }; /* A datasheet. */ struct datasheet { /* Data sources. */ struct source **sources; /* Sources, in no particular order. */ size_t n_sources; /* Number of sources. */ /* Columns. */ struct caseproto *proto; /* Prototype for rows (initialized lazily). */ struct column *columns; /* Logical to physical column mapping. */ size_t n_columns; /* Number of logical columns. */ unsigned column_min_alloc; /* Min. # of columns to put in a new source. */ /* Rows. */ struct axis *rows; /* Logical to physical row mapping. */ /* Tainting. */ struct taint *taint; /* Indicates corrupted data. */ }; /* Is this operation a read or a write? */ enum rw_op { OP_READ, OP_WRITE }; static void allocate_column (struct datasheet *, int width, struct column *); static void release_source (struct datasheet *, struct source *); static bool rw_case (struct datasheet *ds, enum rw_op op, casenumber lrow, size_t start_column, size_t n_columns, union value data[]); /* Returns the number of bytes needed to store a value with the given WIDTH on disk. */ static size_t width_to_n_bytes (int width) { return width == 0 ? sizeof (double) : width; } /* Returns the address of the data in VALUE (for reading or writing to/from disk). VALUE must have the given WIDTH. */ static void * value_to_data (const union value *value_, int width) { union value *value = (union value *) value_; assert (sizeof value->f == sizeof (double)); if (width == 0) return &value->f; else return value->s; } /* Returns the number of bytes needed to store all the values in PROTO on disk. */ static size_t caseproto_to_n_bytes (const struct caseproto *proto) { size_t n_bytes; size_t i; n_bytes = 0; for (i = 0; i < caseproto_get_n_widths (proto); i++) { int width = caseproto_get_width (proto, i); if (width >= 0) n_bytes += width_to_n_bytes (width); } return n_bytes; } /* Creates and returns a new datasheet. If READER is nonnull, then the datasheet initially contains the contents of READER. */ struct datasheet * datasheet_create (struct casereader *reader) { struct datasheet *ds = xmalloc (sizeof *ds); ds->sources = NULL; ds->n_sources = 0; ds->proto = NULL; ds->columns = NULL; ds->n_columns = 0; ds->column_min_alloc = 8; ds->rows = axis_create (); ds->taint = taint_create (); if (reader != NULL) { casenumber n_rows; size_t byte_ofs; size_t i; taint_propagate (casereader_get_taint (reader), ds->taint); ds->proto = caseproto_ref (casereader_get_proto (reader)); ds->sources = xmalloc (sizeof *ds->sources); ds->sources[0] = source_create_casereader (reader); ds->n_sources = 1; ds->n_columns = caseproto_get_n_widths (ds->proto); ds->columns = xnmalloc (ds->n_columns, sizeof *ds->columns); byte_ofs = 0; for (i = 0; i < ds->n_columns; i++) { struct column *column = &ds->columns[i]; int width = caseproto_get_width (ds->proto, i); column->source = ds->sources[0]; column->width = width; if (width >= 0) { column->value_ofs = i; column->byte_ofs = byte_ofs; byte_ofs += width_to_n_bytes (column->width); } } n_rows = source_get_backing_n_rows (ds->sources[0]); if (n_rows > 0) axis_insert (ds->rows, 0, axis_extend (ds->rows, n_rows), n_rows); } return ds; } /* Destroys datasheet DS. */ void datasheet_destroy (struct datasheet *ds) { size_t i; if (ds == NULL) return; for (i = 0; i < ds->n_sources; i++) source_destroy (ds->sources[i]); free (ds->sources); caseproto_unref (ds->proto); free (ds->columns); axis_destroy (ds->rows); taint_destroy (ds->taint); free (ds); } /* Returns the prototype for the cases in DS. The caller must not unref the returned prototype. */ const struct caseproto * datasheet_get_proto (const struct datasheet *ds_) { struct datasheet *ds = CONST_CAST (struct datasheet *, ds_); if (ds->proto == NULL) { size_t i; ds->proto = caseproto_create (); for (i = 0; i < ds->n_columns; i++) ds->proto = caseproto_add_width (ds->proto, ds->columns[i].width); } return ds->proto; } /* Returns the width of the given COLUMN within DS. COLUMN must be less than the number of columns in DS. */ int datasheet_get_column_width (const struct datasheet *ds, size_t column) { assert (column < datasheet_get_n_columns (ds)); return ds->columns[column].width; } /* Moves datasheet DS to a new location in memory, and returns the new location. Afterward, the datasheet must not be accessed at its former location. This function is useful for ensuring that all references to a datasheet have been dropped, especially in conjunction with tools like Valgrind. */ struct datasheet * datasheet_rename (struct datasheet *ds) { struct datasheet *new = xmemdup (ds, sizeof *ds); free (ds); return new; } /* Returns true if datasheet DS is tainted. A datasheet is tainted by an I/O error or by taint propagation to the datasheet. */ bool datasheet_error (const struct datasheet *ds) { return taint_is_tainted (ds->taint); } /* Marks datasheet DS tainted. */ void datasheet_force_error (struct datasheet *ds) { taint_set_taint (ds->taint); } /* Returns datasheet DS's taint object. */ const struct taint * datasheet_get_taint (const struct datasheet *ds) { return ds->taint; } /* Returns the number of rows in DS. */ casenumber datasheet_get_n_rows (const struct datasheet *ds) { return axis_get_size (ds->rows); } /* Returns the number of columns in DS. */ size_t datasheet_get_n_columns (const struct datasheet *ds) { return ds->n_columns; } /* Inserts a column of the given WIDTH into datasheet DS just before column BEFORE. Initializes the contents of each row in the inserted column to VALUE (which must have width WIDTH). Returns true if successful, false on failure. In case of failure, the datasheet is unchanged. */ bool datasheet_insert_column (struct datasheet *ds, const union value *value, int width, size_t before) { struct column *col; assert (before <= ds->n_columns); ds->columns = xnrealloc (ds->columns, ds->n_columns + 1, sizeof *ds->columns); insert_element (ds->columns, ds->n_columns, sizeof *ds->columns, before); col = &ds->columns[before]; ds->n_columns++; allocate_column (ds, width, col); if (width >= 0 && !source_write_column (col, value)) { datasheet_delete_columns (ds, before, 1); taint_set_taint (ds->taint); return false; } return true; } /* Deletes the N columns in DS starting from column START. */ void datasheet_delete_columns (struct datasheet *ds, size_t start, size_t n) { assert (start + n <= ds->n_columns); if (n > 0) { size_t i; for (i = start; i < start + n; i++) { struct column *column = &ds->columns[i]; struct source *source = column->source; source_release_column (source, column->byte_ofs, column->width); release_source (ds, source); } remove_range (ds->columns, ds->n_columns, sizeof *ds->columns, start, n); ds->n_columns -= n; caseproto_unref (ds->proto); ds->proto = NULL; } } /* Moves the N columns in DS starting at position OLD_START so that they then start at position NEW_START. Equivalent to deleting the column rows, then inserting them at what becomes position NEW_START after the deletion. */ void datasheet_move_columns (struct datasheet *ds, size_t old_start, size_t new_start, size_t n) { assert (old_start + n <= ds->n_columns); assert (new_start + n <= ds->n_columns); move_range (ds->columns, ds->n_columns, sizeof *ds->columns, old_start, new_start, n); caseproto_unref (ds->proto); ds->proto = NULL; } struct resize_datasheet_value_aux { union value src_value; size_t src_ofs; int src_width; void (*resize_cb) (const union value *, union value *, const void *aux); const void *resize_cb_aux; union value dst_value; size_t dst_ofs; int dst_width; }; static bool resize_datasheet_value (const void *src, void *dst, void *aux_) { struct resize_datasheet_value_aux *aux = aux_; memcpy (value_to_data (&aux->src_value, aux->src_width), (uint8_t *) src + aux->src_ofs, width_to_n_bytes (aux->src_width)); aux->resize_cb (&aux->src_value, &aux->dst_value, aux->resize_cb_aux); memcpy ((uint8_t *) dst + aux->dst_ofs, value_to_data (&aux->dst_value, aux->dst_width), width_to_n_bytes (aux->dst_width)); return true; } bool datasheet_resize_column (struct datasheet *ds, size_t column, int new_width, void (*resize_cb) (const union value *, union value *, const void *aux), const void *resize_cb_aux) { struct column old_col; struct column *col; int old_width; assert (column < datasheet_get_n_columns (ds)); col = &ds->columns[column]; old_col = *col; old_width = old_col.width; if (new_width == -1) { if (old_width != -1) { datasheet_delete_columns (ds, column, 1); datasheet_insert_column (ds, NULL, -1, column); } } else if (old_width == -1) { union value value; value_init (&value, new_width); value_set_missing (&value, new_width); if (resize_cb != NULL) resize_cb (NULL, &value, resize_cb_aux); datasheet_delete_columns (ds, column, 1); datasheet_insert_column (ds, &value, new_width, column); value_destroy (&value, new_width); } else if (source_has_backing (col->source)) { unsigned long int n_rows = axis_get_size (ds->rows); unsigned long int lrow; union value src, dst; source_release_column (col->source, col->byte_ofs, col->width); allocate_column (ds, new_width, col); value_init (&src, old_width); value_init (&dst, new_width); for (lrow = 0; lrow < n_rows; lrow++) { unsigned long int prow = axis_map (ds->rows, lrow); if (!source_read (&old_col, prow, &src, 1)) { /* FIXME: back out col changes. */ break; } resize_cb (&src, &dst, resize_cb_aux); if (!source_write (col, prow, &dst, 1)) { /* FIXME: back out col changes. */ break; } } value_destroy (&src, old_width); value_destroy (&dst, new_width); if (lrow < n_rows) return false; release_source (ds, old_col.source); } else { struct resize_datasheet_value_aux aux; source_release_column (col->source, col->byte_ofs, col->width); allocate_column (ds, new_width, col); value_init (&aux.src_value, old_col.width); aux.src_ofs = old_col.byte_ofs; aux.src_width = old_col.width; aux.resize_cb = resize_cb; aux.resize_cb_aux = resize_cb_aux; value_init (&aux.dst_value, new_width); aux.dst_ofs = col->byte_ofs; aux.dst_width = new_width; sparse_xarray_copy (old_col.source->data, col->source->data, resize_datasheet_value, &aux); value_destroy (&aux.src_value, old_width); value_destroy (&aux.dst_value, new_width); release_source (ds, old_col.source); } return true; } /* Retrieves and returns the contents of the given ROW in datasheet DS. The caller owns the returned case and must unref it when it is no longer needed. Returns a null pointer on I/O error. */ struct ccase * datasheet_get_row (const struct datasheet *ds, casenumber row) { size_t n_columns = datasheet_get_n_columns (ds); struct ccase *c = case_create (datasheet_get_proto (ds)); if (rw_case (CONST_CAST (struct datasheet *, ds), OP_READ, row, 0, n_columns, case_data_all_rw (c))) return c; else { case_unref (c); return NULL; } } /* Stores the contents of case C, which is destroyed, into the given ROW in DS. Returns true on success, false on I/O error. On failure, the given ROW might be partially modified or corrupted. */ bool datasheet_put_row (struct datasheet *ds, casenumber row, struct ccase *c) { size_t n_columns = datasheet_get_n_columns (ds); bool ok = rw_case (ds, OP_WRITE, row, 0, n_columns, (union value *) case_data_all (c)); case_unref (c); return ok; } /* Stores the values of COLUMN in DS in the given ROW in DS into VALUE. The caller must have already initialized VALUE as a value of the appropriate width (as returned by datasheet_get_column_width (DS, COLUMN)). Returns true if successful, false on I/O error. */ bool datasheet_get_value (const struct datasheet *ds, casenumber row, size_t column, union value *value) { assert (row >= 0); return rw_case (CONST_CAST (struct datasheet *, ds), OP_READ, row, column, 1, value); } /* Stores VALUE into DS in the given ROW and COLUMN. VALUE must have the correct width for COLUMN (as returned by datasheet_get_column_width (DS, COLUMN)). Returns true if successful, false on I/O error. On failure, ROW might be partially modified or corrupted. */ bool datasheet_put_value (struct datasheet *ds, casenumber row, size_t column, const union value *value) { return rw_case (ds, OP_WRITE, row, column, 1, (union value *) value); } /* Inserts the CNT cases at C into datasheet DS just before row BEFORE. Returns true if successful, false on I/O error. On failure, datasheet DS is not modified. Regardless of success, this function unrefs all of the cases in C. */ bool datasheet_insert_rows (struct datasheet *ds, casenumber before, struct ccase *c[], casenumber cnt) { casenumber added = 0; while (cnt > 0) { unsigned long first_phy; unsigned long phy_cnt; unsigned long i; /* Allocate physical rows from the pool of available rows. */ if (!axis_allocate (ds->rows, cnt, &first_phy, &phy_cnt)) { /* No rows were available. Extend the row axis to make some new ones available. */ phy_cnt = cnt; first_phy = axis_extend (ds->rows, cnt); } /* Insert the new rows into the row mapping. */ axis_insert (ds->rows, before, first_phy, phy_cnt); /* Initialize the new rows. */ for (i = 0; i < phy_cnt; i++) if (!datasheet_put_row (ds, before + i, c[i])) { while (++i < cnt) case_unref (c[i]); datasheet_delete_rows (ds, before - added, phy_cnt + added); return false; } /* Advance. */ c += phy_cnt; cnt -= phy_cnt; before += phy_cnt; added += phy_cnt; } return true; } /* Deletes the CNT rows in DS starting from row FIRST. */ void datasheet_delete_rows (struct datasheet *ds, casenumber first, casenumber cnt) { size_t lrow; /* Free up rows for reuse. FIXME: optimize. */ for (lrow = first; lrow < first + cnt; lrow++) axis_make_available (ds->rows, axis_map (ds->rows, lrow), 1); /* Remove rows from logical-to-physical mapping. */ axis_remove (ds->rows, first, cnt); } /* Moves the CNT rows in DS starting at position OLD_START so that they then start at position NEW_START. Equivalent to deleting the given rows, then inserting them at what becomes position NEW_START after the deletion. */ void datasheet_move_rows (struct datasheet *ds, size_t old_start, size_t new_start, size_t cnt) { axis_move (ds->rows, old_start, new_start, cnt); } static const struct casereader_random_class datasheet_reader_class; /* Creates and returns a casereader whose input cases are the rows in datasheet DS. From the caller's perspective, DS is effectively destroyed by this operation, such that the caller must not reference it again. */ struct casereader * datasheet_make_reader (struct datasheet *ds) { struct casereader *reader; ds = datasheet_rename (ds); reader = casereader_create_random (datasheet_get_proto (ds), datasheet_get_n_rows (ds), &datasheet_reader_class, ds); taint_propagate (datasheet_get_taint (ds), casereader_get_taint (reader)); return reader; } /* "read" function for the datasheet random casereader. */ static struct ccase * datasheet_reader_read (struct casereader *reader UNUSED, void *ds_, casenumber case_idx) { struct datasheet *ds = ds_; if (case_idx < datasheet_get_n_rows (ds)) { struct ccase *c = datasheet_get_row (ds, case_idx); if (c == NULL) taint_set_taint (ds->taint); return c; } else return NULL; } /* "destroy" function for the datasheet random casereader. */ static void datasheet_reader_destroy (struct casereader *reader UNUSED, void *ds_) { struct datasheet *ds = ds_; datasheet_destroy (ds); } /* "advance" function for the datasheet random casereader. */ static void datasheet_reader_advance (struct casereader *reader UNUSED, void *ds_, casenumber case_cnt) { struct datasheet *ds = ds_; datasheet_delete_rows (ds, 0, case_cnt); } /* Random casereader class for a datasheet. */ static const struct casereader_random_class datasheet_reader_class = { datasheet_reader_read, datasheet_reader_destroy, datasheet_reader_advance, }; static void allocate_column (struct datasheet *ds, int width, struct column *column) { caseproto_unref (ds->proto); ds->proto = NULL; column->value_ofs = -1; column->width = width; if (width >= 0) { int n_bytes; size_t i; n_bytes = width_to_n_bytes (width); for (i = 0; i < ds->n_sources; i++) { column->source = ds->sources[i]; column->byte_ofs = source_allocate_column (column->source, n_bytes); if (column->byte_ofs >= 0) return; } column->source = source_create_empty (MAX (n_bytes, ds->column_min_alloc)); ds->sources = xnrealloc (ds->sources, ds->n_sources + 1, sizeof *ds->sources); ds->sources[ds->n_sources++] = column->source; ds->column_min_alloc = MIN (65536, ds->column_min_alloc * 2); column->byte_ofs = source_allocate_column (column->source, n_bytes); assert (column->byte_ofs >= 0); } else { column->source = NULL; column->byte_ofs = -1; } } static void release_source (struct datasheet *ds, struct source *source) { if (source_has_backing (source) && !source_in_use (source)) { /* Since only the first source to be added ever has a backing, this source must have index 0. */ assert (source == ds->sources[0]); ds->sources[0] = ds->sources[--ds->n_sources]; source_destroy (source); } } /* Reads (if OP is OP_READ) or writes (if op is OP_WRITE) the N_COLUMNS columns starting from column START_COLUMN in row LROW to/from the N_COLUMNS values in DATA. */ static bool rw_case (struct datasheet *ds, enum rw_op op, casenumber lrow, size_t start_column, size_t n_columns, union value data[]) { struct column *columns = &ds->columns[start_column]; casenumber prow; size_t i; assert (lrow < datasheet_get_n_rows (ds)); assert (n_columns <= datasheet_get_n_columns (ds)); assert (start_column + n_columns <= datasheet_get_n_columns (ds)); prow = axis_map (ds->rows, lrow); for (i = 0; i < n_columns;) { struct source *source = columns[i].source; size_t j; bool ok; if (columns[i].width < 0) { i++; continue; } for (j = i + 1; j < n_columns; j++) if (columns[j].width < 0 || columns[j].source != source) break; if (op == OP_READ) ok = source_read (&columns[i], prow, &data[i], j - i); else ok = source_write (&columns[i], prow, &data[i], j - i); if (!ok) { taint_set_taint (ds->taint); return false; } i = j; } return true; } /* An axis. An axis has two functions. First, it maintains a mapping from logical (client-visible) to physical (storage) ordinates. The axis_map and axis_get_size functions inspect this mapping, and the axis_insert, axis_remove, and axis_move functions modify it. Second, it tracks the set of ordinates that are unused and available for reuse. The axis_allocate, axis_make_available, and axis_extend functions affect the set of available ordinates. */ struct axis { struct tower log_to_phy; /* Map from logical to physical ordinates; contains "struct axis_group"s. */ struct range_set *available; /* Set of unused, available ordinates. */ unsigned long int phy_size; /* Current physical length of axis. */ }; /* A mapping from logical to physical ordinates. */ struct axis_group { struct tower_node logical; /* Range of logical ordinates. */ unsigned long phy_start; /* First corresponding physical ordinate. */ }; static struct axis_group *axis_group_from_tower_node (struct tower_node *); static struct tower_node *make_axis_group (unsigned long int phy_start); static struct tower_node *split_axis (struct axis *, unsigned long int where); static void merge_axis_nodes (struct axis *, struct tower_node *, struct tower_node **other_node); static void check_axis_merged (const struct axis *axis UNUSED); /* Creates and returns a new, initially empty axis. */ static struct axis * axis_create (void) { struct axis *axis = xmalloc (sizeof *axis); tower_init (&axis->log_to_phy); axis->available = range_set_create (); axis->phy_size = 0; return axis; } /* Returns a clone of existing axis OLD. Currently this is used only by the datasheet model checker driver, but it could be otherwise useful. */ static struct axis * axis_clone (const struct axis *old) { const struct tower_node *node; struct axis *new; new = xmalloc (sizeof *new); tower_init (&new->log_to_phy); new->available = range_set_clone (old->available, NULL); new->phy_size = old->phy_size; for (node = tower_first (&old->log_to_phy); node != NULL; node = tower_next (&old->log_to_phy, node)) { unsigned long int size = tower_node_get_size (node); struct axis_group *group = tower_data (node, struct axis_group, logical); tower_insert (&new->log_to_phy, size, make_axis_group (group->phy_start), NULL); } return new; } /* Adds the state of AXIS to the MD4 hash context CTX. This is only used by the datasheet model checker driver. It is unlikely to be otherwise useful. */ static void axis_hash (const struct axis *axis, struct md4_ctx *ctx) { const struct tower_node *tn; const struct range_set_node *rsn; for (tn = tower_first (&axis->log_to_phy); tn != NULL; tn = tower_next (&axis->log_to_phy, tn)) { struct axis_group *group = tower_data (tn, struct axis_group, logical); unsigned long int phy_start = group->phy_start; unsigned long int size = tower_node_get_size (tn); md4_process_bytes (&phy_start, sizeof phy_start, ctx); md4_process_bytes (&size, sizeof size, ctx); } RANGE_SET_FOR_EACH (rsn, axis->available) { unsigned long int start = range_set_node_get_start (rsn); unsigned long int end = range_set_node_get_end (rsn); md4_process_bytes (&start, sizeof start, ctx); md4_process_bytes (&end, sizeof end, ctx); } md4_process_bytes (&axis->phy_size, sizeof axis->phy_size, ctx); } /* Destroys AXIS. */ static void axis_destroy (struct axis *axis) { if (axis == NULL) return; while (!tower_is_empty (&axis->log_to_phy)) { struct tower_node *node = tower_first (&axis->log_to_phy); struct axis_group *group = tower_data (node, struct axis_group, logical); tower_delete (&axis->log_to_phy, node); free (group); } range_set_destroy (axis->available); free (axis); } /* Allocates up to REQUEST contiguous unused and available ordinates from AXIS. If successful, stores the number obtained into *WIDTH and the ordinate of the first into *START, marks the ordinates as now unavailable return true. On failure, which occurs only if AXIS has no unused and available ordinates, returns false without modifying AXIS. */ static bool axis_allocate (struct axis *axis, unsigned long int request, unsigned long int *start, unsigned long int *width) { return range_set_allocate (axis->available, request, start, width); } /* Marks the WIDTH contiguous ordinates in AXIS, starting from START, as unused and available. */ static void axis_make_available (struct axis *axis, unsigned long int start, unsigned long int width) { range_set_set1 (axis->available, start, width); } /* Extends the total physical length of AXIS by WIDTH and returns the first ordinate in the new physical region. */ static unsigned long int axis_extend (struct axis *axis, unsigned long int width) { unsigned long int start = axis->phy_size; axis->phy_size += width; return start; } /* Returns the physical ordinate in AXIS corresponding to logical ordinate LOG_POS. LOG_POS must be less than the logical length of AXIS. */ static unsigned long int axis_map (const struct axis *axis, unsigned long log_pos) { struct tower_node *node; struct axis_group *group; unsigned long int group_start; node = tower_lookup (&axis->log_to_phy, log_pos, &group_start); group = tower_data (node, struct axis_group, logical); return group->phy_start + (log_pos - group_start); } /* Returns the logical length of AXIS. */ static unsigned long axis_get_size (const struct axis *axis) { return tower_height (&axis->log_to_phy); } /* Inserts the CNT contiguous physical ordinates starting at PHY_START into AXIS's logical-to-physical mapping, starting at logical position LOG_START. */ static void axis_insert (struct axis *axis, unsigned long int log_start, unsigned long int phy_start, unsigned long int cnt) { struct tower_node *before = split_axis (axis, log_start); struct tower_node *new = make_axis_group (phy_start); tower_insert (&axis->log_to_phy, cnt, new, before); merge_axis_nodes (axis, new, NULL); check_axis_merged (axis); } /* Removes CNT ordinates from AXIS's logical-to-physical mapping starting at logical position START. */ static void axis_remove (struct axis *axis, unsigned long int start, unsigned long int cnt) { if (cnt > 0) { struct tower_node *last = split_axis (axis, start + cnt); struct tower_node *cur, *next; for (cur = split_axis (axis, start); cur != last; cur = next) { next = tower_delete (&axis->log_to_phy, cur); free (axis_group_from_tower_node (cur)); } merge_axis_nodes (axis, last, NULL); check_axis_merged (axis); } } /* Moves the CNT ordinates in AXIS's logical-to-mapping starting at logical position OLD_START so that they then start at position NEW_START. */ static void axis_move (struct axis *axis, unsigned long int old_start, unsigned long int new_start, unsigned long int cnt) { if (cnt > 0 && old_start != new_start) { struct tower_node *old_first, *old_last, *new_first; struct tower_node *merge1, *merge2; struct tower tmp_array; /* Move ordinates OLD_START...(OLD_START + CNT) into new, separate TMP_ARRAY. */ old_first = split_axis (axis, old_start); old_last = split_axis (axis, old_start + cnt); tower_init (&tmp_array); tower_splice (&tmp_array, NULL, &axis->log_to_phy, old_first, old_last); merge_axis_nodes (axis, old_last, NULL); check_axis_merged (axis); /* Move TMP_ARRAY to position NEW_START. */ new_first = split_axis (axis, new_start); merge1 = tower_first (&tmp_array); merge2 = tower_last (&tmp_array); if (merge2 == merge1) merge2 = NULL; tower_splice (&axis->log_to_phy, new_first, &tmp_array, old_first, NULL); merge_axis_nodes (axis, merge1, &merge2); merge_axis_nodes (axis, merge2, NULL); check_axis_merged (axis); } } /* Returns the axis_group in which NODE is embedded. */ static struct axis_group * axis_group_from_tower_node (struct tower_node *node) { return tower_data (node, struct axis_group, logical); } /* Creates and returns a new axis_group at physical position PHY_START. */ static struct tower_node * make_axis_group (unsigned long phy_start) { struct axis_group *group = xmalloc (sizeof *group); group->phy_start = phy_start; return &group->logical; } /* Returns the tower_node in AXIS's logical-to-physical map whose bottom edge is at exact level WHERE. If there is no such tower_node in AXIS's logical-to-physical map, then split_axis creates one by breaking an existing tower_node into two separate ones, unless WHERE is equal to the tower height, in which case it simply returns a null pointer. */ static struct tower_node * split_axis (struct axis *axis, unsigned long int where) { unsigned long int group_start; struct tower_node *group_node; struct axis_group *group; assert (where <= tower_height (&axis->log_to_phy)); if (where >= tower_height (&axis->log_to_phy)) return NULL; group_node = tower_lookup (&axis->log_to_phy, where, &group_start); group = axis_group_from_tower_node (group_node); if (where > group_start) { unsigned long int size_1 = where - group_start; unsigned long int size_2 = tower_node_get_size (group_node) - size_1; struct tower_node *next = tower_next (&axis->log_to_phy, group_node); struct tower_node *new = make_axis_group (group->phy_start + size_1); tower_resize (&axis->log_to_phy, group_node, size_1); tower_insert (&axis->log_to_phy, size_2, new, next); return new; } else return &group->logical; } /* Within AXIS, attempts to merge NODE (or the last node in AXIS, if NODE is null) with its neighbor nodes. This is possible when logically adjacent nodes are also adjacent physically (in the same order). When a merge occurs, and OTHER_NODE is non-null and points to the node to be deleted, this function also updates *OTHER_NODE, if necessary, to ensure that it remains a valid pointer. */ static void merge_axis_nodes (struct axis *axis, struct tower_node *node, struct tower_node **other_node) { struct tower *t = &axis->log_to_phy; struct axis_group *group; struct tower_node *next, *prev; /* Find node to potentially merge with neighbors. */ if (node == NULL) node = tower_last (t); if (node == NULL) return; group = axis_group_from_tower_node (node); /* Try to merge NODE with successor. */ next = tower_next (t, node); if (next != NULL) { struct axis_group *next_group = axis_group_from_tower_node (next); unsigned long this_height = tower_node_get_size (node); if (group->phy_start + this_height == next_group->phy_start) { unsigned long next_height = tower_node_get_size (next); tower_resize (t, node, this_height + next_height); if (other_node != NULL && *other_node == next) *other_node = tower_next (t, *other_node); tower_delete (t, next); free (next_group); } } /* Try to merge NODE with predecessor. */ prev = tower_prev (t, node); if (prev != NULL) { struct axis_group *prev_group = axis_group_from_tower_node (prev); unsigned long prev_height = tower_node_get_size (prev); if (prev_group->phy_start + prev_height == group->phy_start) { unsigned long this_height = tower_node_get_size (node); group->phy_start = prev_group->phy_start; tower_resize (t, node, this_height + prev_height); if (other_node != NULL && *other_node == prev) *other_node = tower_next (t, *other_node); tower_delete (t, prev); free (prev_group); } } } /* Verify that all potentially merge-able nodes in AXIS are actually merged. */ static void check_axis_merged (const struct axis *axis UNUSED) { #if ASSERT_LEVEL >= 10 struct tower_node *prev, *node; for (prev = NULL, node = tower_first (&axis->log_to_phy); node != NULL; prev = node, node = tower_next (&axis->log_to_phy, node)) if (prev != NULL) { struct axis_group *prev_group = axis_group_from_tower_node (prev); unsigned long prev_height = tower_node_get_size (prev); struct axis_group *node_group = axis_group_from_tower_node (node); assert (prev_group->phy_start + prev_height != node_group->phy_start); } #endif } /* A source. */ /* Creates and returns an empty, unbacked source with N_BYTES bytes per case, none of which are initially in use. */ static struct source * source_create_empty (size_t n_bytes) { struct source *source = xmalloc (sizeof *source); size_t row_size = n_bytes + 4 * sizeof (void *); size_t max_memory_rows = settings_get_workspace () / row_size; source->avail = range_set_create (); range_set_set1 (source->avail, 0, n_bytes); source->data = sparse_xarray_create (n_bytes, MAX (max_memory_rows, 4)); source->backing = NULL; source->backing_rows = 0; source->n_used = 0; return source; } /* Creates and returns a new source backed by READER and with the same initial dimensions and content. */ static struct source * source_create_casereader (struct casereader *reader) { const struct caseproto *proto = casereader_get_proto (reader); size_t n_bytes = caseproto_to_n_bytes (proto); struct source *source = source_create_empty (n_bytes); size_t n_columns; size_t i; range_set_set0 (source->avail, 0, n_bytes); source->backing = reader; source->backing_rows = casereader_count_cases (reader); source->n_used = 0; n_columns = caseproto_get_n_widths (proto); for (i = 0; i < n_columns; i++) if (caseproto_get_width (proto, i) >= 0) source->n_used++; return source; } /* Returns a clone of source OLD with the same data and backing (if any). Currently this is used only by the datasheet model checker driver, but it could be otherwise useful. */ static struct source * source_clone (const struct source *old) { struct source *new = xmalloc (sizeof *new); new->avail = range_set_clone (old->avail, NULL); new->data = sparse_xarray_clone (old->data); new->backing = old->backing != NULL ? casereader_clone (old->backing) : NULL; new->backing_rows = old->backing_rows; new->n_used = old->n_used; if (new->data == NULL) { source_destroy (new); new = NULL; } return new; } static int source_allocate_column (struct source *source, int width) { unsigned long int start; int n_bytes; assert (width >= 0); n_bytes = width_to_n_bytes (width); if (source->backing == NULL && range_set_allocate_fully (source->avail, n_bytes, &start)) return start; else return -1; } static void source_release_column (struct source *source, int ofs, int width) { assert (width >= 0); range_set_set1 (source->avail, ofs, width_to_n_bytes (width)); if (source->backing != NULL) source->n_used--; } /* Returns true if SOURCE has any columns in use, false otherwise. */ static bool source_in_use (const struct source *source) { return source->n_used > 0; } /* Destroys SOURCE and its data and backing, if any. */ static void source_destroy (struct source *source) { if (source != NULL) { range_set_destroy (source->avail); sparse_xarray_destroy (source->data); casereader_destroy (source->backing); free (source); } } /* Returns the number of rows in SOURCE's backing casereader (SOURCE must have a backing casereader). */ static casenumber source_get_backing_n_rows (const struct source *source) { assert (source_has_backing (source)); return source->backing_rows; } /* Reads the N COLUMNS in the given ROW, into the N VALUES. Returns true if successful, false on I/O error. All of the COLUMNS must have the same source. The caller must have initialized VALUES with the proper width. */ static bool source_read (const struct column columns[], casenumber row, union value values[], size_t n) { struct source *source = columns[0].source; size_t i; if (source->backing == NULL || sparse_xarray_contains_row (source->data, row)) { bool ok = true; for (i = 0; i < n && ok; i++) ok = sparse_xarray_read (source->data, row, columns[i].byte_ofs, width_to_n_bytes (columns[i].width), value_to_data (&values[i], columns[i].width)); return ok; } else { struct ccase *c = casereader_peek (source->backing, row); bool ok = c != NULL; if (ok) { for (i = 0; i < n; i++) value_copy (&values[i], case_data_idx (c, columns[i].value_ofs), columns[i].width); case_unref (c); } return ok; } } static bool copy_case_into_source (struct source *source, struct ccase *c, casenumber row) { const struct caseproto *proto = casereader_get_proto (source->backing); size_t n_widths = caseproto_get_n_widths (proto); size_t ofs; size_t i; ofs = 0; for (i = 0; i < n_widths; i++) { int width = caseproto_get_width (proto, i); if (width >= 0) { int n_bytes = width_to_n_bytes (width); if (!sparse_xarray_write (source->data, row, ofs, n_bytes, value_to_data (case_data_idx (c, i), width))) return false; ofs += n_bytes; } } return true; } /* Writes the N VALUES to their source in the given ROW and COLUMNS. Returns true if successful, false on I/O error. On error, the row's data may be completely or partially corrupted, both inside and outside the region to be written. All of the COLUMNS must have the same source. */ static bool source_write (const struct column columns[], casenumber row, const union value values[], size_t n) { struct source *source = columns[0].source; struct casereader *backing = source->backing; size_t i; if (backing != NULL && !sparse_xarray_contains_row (source->data, row) && row < source->backing_rows) { struct ccase *c; bool ok; c = casereader_peek (backing, row); if (c == NULL) return false; ok = copy_case_into_source (source, c, row); case_unref (c); if (!ok) return false; } for (i = 0; i < n; i++) if (!sparse_xarray_write (source->data, row, columns[i].byte_ofs, width_to_n_bytes (columns[i].width), value_to_data (&values[i], columns[i].width))) return false; return true; } /* Within SOURCE, which must not have a backing casereader, writes the VALUE_CNT values in VALUES_CNT to the VALUE_CNT columns starting from START_COLUMN, in every row, even in rows not yet otherwise initialized. Returns true if successful, false if an I/O error occurs. We don't support backing != NULL because (1) it's harder and (2) this function is only called by datasheet_insert_column, which doesn't reuse columns from sources that are backed by casereaders. */ static bool source_write_column (struct column *column, const union value *value) { int width = column->width; assert (column->source->backing == NULL); assert (width >= 0); return sparse_xarray_write_columns (column->source->data, column->byte_ofs, width_to_n_bytes (width), value_to_data (value, width)); } /* Returns true if SOURCE has a backing casereader, false otherwise. */ static bool source_has_backing (const struct source *source) { return source->backing != NULL; } /* Datasheet model checker test driver. */ static int get_source_index (const struct datasheet *ds, const struct source *source) { size_t i; for (i = 0; i < ds->n_sources; i++) if (ds->sources[i] == source) return i; NOT_REACHED (); } /* Clones the structure and contents of ODS into a new datasheet, and returns the new datasheet. */ struct datasheet * clone_datasheet (const struct datasheet *ods) { struct datasheet *ds; size_t i; ds = xmalloc (sizeof *ds); ds->sources = xmalloc (ods->n_sources * sizeof *ds->sources); for (i = 0; i < ods->n_sources; i++) ds->sources[i] = source_clone (ods->sources[i]); ds->n_sources = ods->n_sources; ds->proto = ods->proto != NULL ? caseproto_ref (ods->proto) : NULL; ds->columns = xmemdup (ods->columns, ods->n_columns * sizeof *ods->columns); for (i = 0; i < ods->n_columns; i++) ds->columns[i].source = ds->sources[get_source_index (ods, ods->columns[i].source)]; ds->n_columns = ods->n_columns; ds->column_min_alloc = ods->column_min_alloc; ds->rows = axis_clone (ods->rows); ds->taint = taint_create (); return ds; } /* Hashes the structure of datasheet DS and returns the hash. We use MD4 because it is much faster than MD5 or SHA-1 but its collision resistance is just as good. */ unsigned int hash_datasheet (const struct datasheet *ds) { unsigned int hash[DIV_RND_UP (20, sizeof (unsigned int))]; struct md4_ctx ctx; size_t i; md4_init_ctx (&ctx); for (i = 0; i < ds->n_columns; i++) { const struct column *column = &ds->columns[i]; int source_n_bytes = sparse_xarray_get_n_columns (column->source->data); md4_process_bytes (&source_n_bytes, sizeof source_n_bytes, &ctx); /*md4_process_bytes (&column->byte_ofs, sizeof column->byte_ofs, &ctx);*/ md4_process_bytes (&column->value_ofs, sizeof column->value_ofs, &ctx); md4_process_bytes (&column->width, sizeof column->width, &ctx); } axis_hash (ds->rows, &ctx); md4_process_bytes (&ds->column_min_alloc, sizeof ds->column_min_alloc, &ctx); md4_finish_ctx (&ctx, hash); return hash[0]; } pspp-1.4.1/src/data/spreadsheet-reader.h0000644000175000017500000000550513360714656017553 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2007, 2010, 2016 Free Software Foundation, Inc. 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 3 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, see . */ #ifndef SPREADSHEET_READ_H #define SPREADSHEET_READ_H 1 #include #include struct casereeader; /* Default width of string variables. */ #define SPREADSHEET_DEFAULT_WIDTH 8 /* These elements are read/write. They may be passed in NULL (for pointers) or negative for integers, in which case they will be filled in be the function. */ struct spreadsheet_read_options { char *sheet_name ; /* The name of the sheet to open (in UTF-8) */ int sheet_index ; /* The index of the sheet to open (only used if sheet_name is NULL). The first index is 1 NOT 0 */ char *cell_range ; /* The cell range (in UTF-8) */ bool read_names ; /* True if the first row is to be used as the names of the variables */ int asw ; /* The width of string variables in the created dictionary */ }; int ps26_to_int (const char *str); char * int_to_ps26 (int); bool convert_cell_ref (const char *ref, int *col0, int *row0, int *coli, int *rowi); #define _xml(X) (CHAR_CAST (const xmlChar *, (X))) #define _xmlchar_to_int(X) ((X) ? atoi (CHAR_CAST (const char *, (X))) : -1) enum spreadsheet_type { SPREADSHEET_NONE, SPREADSHEET_GNUMERIC, SPREADSHEET_ODS }; struct spreadsheet { char *file_name; enum spreadsheet_type type; /* The total number of sheets in the "workbook" */ int n_sheets; /* The dictionary for client's reference. Client must ref or clone it if it needs a permanent or modifiable copy. */ struct dictionary *dict; int ref_cnt; }; struct casereader * spreadsheet_make_reader (struct spreadsheet *, const struct spreadsheet_read_options *); const char * spreadsheet_get_sheet_name (struct spreadsheet *s, int n) OPTIMIZE(2); char * spreadsheet_get_sheet_range (struct spreadsheet *s, int n) OPTIMIZE(2); char * create_cell_ref (int col0, int row0); char *create_cell_range (int col0, int row0, int coli, int rowi); void spreadsheet_unref (struct spreadsheet *); void spreadsheet_ref (struct spreadsheet *); #define SPREADSHEET_CAST(X) ((struct spreadsheet *)(X)) #endif pspp-1.4.1/src/data/casereader.h0000644000175000017500000001534013320146056016065 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2007, 2009, 2010, 2011, 2013 Free Software Foundation, Inc. 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 3 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, see . */ /* Casereader client interface. A casereader abstracts interfaces through which cases may be read. A casereader may be a front-end for a system file, a portable file, a dataset, or anything else on which a casereader interface has been overlaid. Casereader layering, in which a casereader acts as a filter or translator on top of another casereader, is also supported. There is no central interface for obtaining casereaders: a casereader for reading a system file is obtained from the system file reading module, and so on. Once a casereader has been obtained, by whatever means, the interface to it is uniform. The most important functions for casereader usage are: - casereader_read: Reads a case from the casereader. The case is consumed and cannot be read again. The caller is responsible for destroying the case. - casereader_clone: Makes a copy of a casereader. May be used to read one or a set of cases from a casereader repeatedly. - casereader_destroy: Destroys a casereader. Casereaders can encounter error conditions, such as I/O errors, as they read cases. Error conditions prevent any more cases from being read from the casereader. Error conditions are reported by casereader_error. Error condition may be propagated to or from a casereader with taint_propagate using the casereader's taint object, which may be obtained with casereader_get_taint. */ #ifndef DATA_CASEREADER_H #define DATA_CASEREADER_H 1 #include "libpspp/compiler.h" #include "data/case.h" #include "data/missing-values.h" struct dictionary; struct casereader; struct casewriter; struct subcase; struct ccase *casereader_read (struct casereader *); bool casereader_destroy (struct casereader *); struct casereader *casereader_clone (const struct casereader *); struct casereader *casereader_rename (struct casereader *); void casereader_swap (struct casereader *, struct casereader *); struct ccase *casereader_peek (struct casereader *, casenumber); bool casereader_is_empty (struct casereader *); bool casereader_error (const struct casereader *); void casereader_force_error (struct casereader *); const struct taint *casereader_get_taint (const struct casereader *); casenumber casereader_get_case_cnt (struct casereader *); casenumber casereader_count_cases (const struct casereader *); void casereader_truncate (struct casereader *, casenumber); const struct caseproto *casereader_get_proto (const struct casereader *); casenumber casereader_advance (struct casereader *, casenumber); void casereader_transfer (struct casereader *, struct casewriter *); struct casereader *casereader_create_empty (const struct caseproto *); struct casereader * casereader_create_filter_func (struct casereader *, bool (*include) (const struct ccase *, void *aux), bool (*destroy) (void *aux), void *aux, struct casewriter *exclude); struct casereader * casereader_create_filter_weight (struct casereader *, const struct dictionary *dict, bool *warn_on_invalid, struct casewriter *exclude); struct casereader * casereader_create_filter_missing (struct casereader *, const struct variable *const*vars, size_t var_cnt, enum mv_class, casenumber *n_missing, struct casewriter *exclude); struct casereader * casereader_create_counter (struct casereader *, casenumber *counter, casenumber initial_value); struct casereader * casereader_create_translator (struct casereader *, const struct caseproto *output_proto, struct ccase *(*translate) (struct ccase *, void *aux), bool (*destroy) (void *aux), void *aux); struct casereader * casereader_translate_stateless (struct casereader *, const struct caseproto *output_proto, struct ccase *(*translate) (struct ccase *, casenumber idx, const void *aux), bool (*destroy) (void *aux), void *aux); struct casereader *casereader_project (struct casereader *, const struct subcase *); struct casereader *casereader_project_1 (struct casereader *, int column); struct casereader *casereader_select (struct casereader *, casenumber first, casenumber last, casenumber by); /* A function which creates a numberic value from an existing case */ typedef double new_value_func (const struct ccase *, casenumber, void *); struct casereader * casereader_create_append_numeric (struct casereader *subreader, new_value_func func, void *aux, void (*destroy) (void *aux)); struct casereader * casereader_create_arithmetic_sequence (struct casereader *, double first, double increment); enum rank_error { RANK_ERR_NONE = 0, RANK_ERR_NEGATIVE_WEIGHT = 0x01, RANK_ERR_UNSORTED = 0x02 }; typedef void distinct_func (double v, casenumber n, double w, void *aux); struct casereader * casereader_create_append_rank (struct casereader *, const struct variable *v, const struct variable *w, enum rank_error *err, distinct_func *distinct_callback, void *aux); struct casereader * casereader_create_distinct (struct casereader *input, const struct variable *key, const struct variable *weight); #endif /* data/casereader.h */ pspp-1.4.1/src/data/casewriter-provider.h0000644000175000017500000000467313320146056017776 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2006, 2009, 2011 Free Software Foundation, Inc. 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 3 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, see . */ #ifndef DATA_CASEWRITER_PROVIDER_H #define DATA_CASEWRITER_PROVIDER_H 1 #include "data/casewriter.h" struct casewriter_class { /* Mandatory. Writes case C to WRITER. Ownership of C is transferred to WRITER. If an I/O error occurs, this function should call casewriter_force_error on WRITER. Some I/O error detection may be deferred to the "destroy" member function (e.g. writes to disk need not be flushed by "write") . */ void (*write) (struct casewriter *writer, void *aux, struct ccase *c); /* Mandatory. Finalizes output and destroys WRITER. If an I/O error is detected while finalizing output (e.g. while flushing output to disk), this function should call casewriter_force_error on WRITER. */ void (*destroy) (struct casewriter *writer, void *aux); /* Optional: supply if practical and desired by clients. Finalizes output to WRITER, destroys WRITER, and in its place returns a casereader that can be used to read back the data written to WRITER. WRITER will not be used again after calling this function, even as an argument to casewriter_destroy. If an I/O error is detected while finalizing output (e.g. while flushing output to disk), this function should call casewriter_force_error on WRITER. The caller will ensure that the error is propagated to the returned casereader. */ struct casereader *(*convert_to_reader) (struct casewriter *, void *aux); }; struct casewriter *casewriter_create (const struct caseproto *, const struct casewriter_class *, void *); #endif /* data/casewriter-provider.h */ pspp-1.4.1/src/data/casegrouper.h0000644000175000017500000000423613320146056016310 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2007 Free Software Foundation, Inc. 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 3 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, see . */ /* Casegrouper. Breaks up the cases from a casereader into sets of contiguous cases based on some criteria, e.g. sets of cases that all have the same values for some subset of variables. Each set of cases is made available to the client as a casereader. */ #ifndef DATA_CASEGROUPER_H #define DATA_CASEGROUPER_H 1 #include #include struct casereader; struct ccase; struct dictionary; struct subcase; struct variable; struct casegrouper * casegrouper_create_func (struct casereader *, bool (*same_group) (const struct ccase *, const struct ccase *, void *aux), void (*destroy) (void *aux), void *aux); struct casegrouper *casegrouper_create_vars (struct casereader *, const struct variable *const *vars, size_t var_cnt); struct casegrouper *casegrouper_create_splits (struct casereader *, const struct dictionary *); struct casegrouper *casegrouper_create_subcase (struct casereader *, const struct subcase *); bool casegrouper_get_next_group (struct casegrouper *, struct casereader **); bool casegrouper_destroy (struct casegrouper *); #endif /* data/casegrouper.h */ pspp-1.4.1/src/data/any-writer.c0000644000175000017500000000413513571051220016057 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2006, 2010, 2011 Free Software Foundation, Inc. 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 3 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, see . */ #include #include "data/any-writer.h" #include #include #include #include #include "data/dataset-writer.h" #include "data/file-handle-def.h" #include "data/file-name.h" #include "data/por-file-writer.h" #include "data/sys-file-writer.h" #include "libpspp/assertion.h" #include "libpspp/message.h" #include "libpspp/str.h" #include "gl/xalloc.h" #include "gettext.h" #define _(msgid) gettext (msgid) /* Creates and returns a writer for HANDLE with the given DICT. */ struct casewriter * any_writer_open (struct file_handle *handle, struct dictionary *dict) { switch (fh_get_referent (handle)) { case FH_REF_FILE: { struct casewriter *writer; char *extension; extension = fn_extension (handle); str_lowercase (extension); if (!strcmp (extension, ".por")) writer = pfm_open_writer (handle, dict, pfm_writer_default_options ()); else writer = sfm_open_writer (handle, dict, sfm_writer_default_options ()); free (extension); return writer; } case FH_REF_INLINE: msg (ME, _("The inline file is not allowed here.")); return NULL; case FH_REF_DATASET: return dataset_writer_open (handle, dict); } NOT_REACHED (); } pspp-1.4.1/src/data/subcase.c0000644000175000017500000003220313320146056015404 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2008, 2009, 2011, 2013 Free Software Foundation, Inc. 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 3 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, see . */ #include #include "data/subcase.h" #include #include "data/case.h" #include "data/variable.h" #include "libpspp/assertion.h" #include "gl/xalloc.h" static void invalidate_proto (struct subcase *sc); /* Initializes SC as a subcase that contains no fields. */ void subcase_init_empty (struct subcase *sc) { sc->fields = NULL; sc->n_fields = 0; sc->proto = NULL; } /* Initializes SC as a subcase with fields extracted from the N_VARS variables in VARS, with ascending sort order. */ void subcase_init_vars (struct subcase *sc, const struct variable *const *vars, size_t n_vars) { subcase_init_empty (sc); subcase_add_vars_always (sc, vars, n_vars); } /* Initializes SC as a subcase with a single field extracted from VAR, with the sort order specified by DIRECTION. */ void subcase_init_var (struct subcase *sc, const struct variable *var, enum subcase_direction direction) { subcase_init_empty (sc); subcase_add_var (sc, var, direction); } void subcase_init (struct subcase *sc, int index, int width, enum subcase_direction direction) { subcase_init_empty (sc); subcase_add (sc, index, width, direction); } /* Removes all the fields from SC. */ void subcase_clear (struct subcase *sc) { sc->n_fields = 0; invalidate_proto (sc); } /* Initializes SC with the same fields as ORIG. */ void subcase_clone (struct subcase *sc, const struct subcase *orig) { sc->fields = xmemdup (orig->fields, orig->n_fields * sizeof *orig->fields); sc->n_fields = orig->n_fields; sc->proto = orig->proto ? caseproto_ref (orig->proto) : NULL; } /* Frees the memory owned by SC (but not SC itself). */ void subcase_destroy (struct subcase *sc) { free (sc->fields); caseproto_unref (sc->proto); } /* Returns true if VAR already has a field in SC, false otherwise. */ bool subcase_contains_var (const struct subcase *sc, const struct variable *var) { return subcase_contains (sc, var_get_case_index (var)); } /* Returns true if CASE_INDEX already has a field in SC, false otherwise. */ bool subcase_contains (const struct subcase *sc, int case_index) { size_t i; for (i = 0; i < sc->n_fields; i++) if (sc->fields[i].case_index == case_index) return true; return false; } /* Add a field for VAR to SC, with DIRECTION as the sort order. Returns true if successful, false if VAR already has a field in SC. */ bool subcase_add_var (struct subcase *sc, const struct variable *var, enum subcase_direction direction) { if (!subcase_contains_var (sc, var)) { subcase_add_var_always (sc, var, direction); return true; } else return false; } /* Add a field for CASE_INDEX, WIDTH to SC, with DIRECTION as the sort order. Returns true if successful, false if CASE_INDEX already has a field in SC. */ bool subcase_add (struct subcase *sc, int case_index, int width, enum subcase_direction direction) { if (!subcase_contains (sc, case_index)) { subcase_add_always (sc, case_index, width, direction); return true; } else return false; } /* Add a field for VAR to SC, with DIRECTION as the sort order, regardless of whether VAR already has a field in SC. */ void subcase_add_var_always (struct subcase *sc, const struct variable *var, enum subcase_direction direction) { return subcase_add_always (sc, var_get_case_index (var), var_get_width (var), direction); } /* Add a field for each of the N_VARS variables in VAR to SC, regardless of whether each variable already has a field in SC. The fields are added with ascending direction. */ void subcase_add_vars_always (struct subcase *sc, const struct variable *const *vars, size_t n_vars) { size_t i; sc->fields = xnrealloc (sc->fields, sc->n_fields + n_vars, sizeof *sc->fields); for (i = 0; i < n_vars; i++) { struct subcase_field *field = &sc->fields[sc->n_fields++]; field->case_index = var_get_case_index (vars[i]); field->width = var_get_width (vars[i]); field->direction = SC_ASCEND; } invalidate_proto (sc); } /* Add a field for CASE_INDEX, WIDTH to SC, with DIRECTION as the sort order, regardless of whether CASE_INDEX already has a field in SC. */ void subcase_add_always (struct subcase *sc, int case_index, int width, enum subcase_direction direction) { struct subcase_field *field; sc->fields = xnrealloc (sc->fields, sc->n_fields + 1, sizeof *sc->fields); field = &sc->fields[sc->n_fields++]; field->case_index = case_index; field->width = width; field->direction = direction; invalidate_proto (sc); } /* Adds a field to SC for each column in PROTO, so that SC contains all of the columns in PROTO in the same order as a case conforming to PROTO. The fields are added with ascending direction. */ void subcase_add_proto_always (struct subcase *sc, const struct caseproto *proto) { size_t n = caseproto_get_n_widths (proto); size_t i; sc->fields = xnrealloc (sc->fields, sc->n_fields + n, sizeof *sc->fields); for (i = 0; i < n; i++) { struct subcase_field *field = &sc->fields[sc->n_fields++]; field->case_index = i; field->width = caseproto_get_width (proto, i); field->direction = SC_ASCEND; } invalidate_proto (sc); } /* Obtains a caseproto for a case described by SC. The caller must not modify or unref the returned case prototype. */ const struct caseproto * subcase_get_proto (const struct subcase *sc_) { struct subcase *sc = CONST_CAST (struct subcase *, sc_); if (sc->proto == NULL) { size_t i; sc->proto = caseproto_create (); for (i = 0; i < sc->n_fields; i++) sc->proto = caseproto_add_width (sc->proto, sc->fields[i].width); } return sc->proto; } /* Returns true if and only if A and B are conformable, which means that they have the same number of fields and that each corresponding field in A and B have the same width. */ bool subcase_conformable (const struct subcase *a, const struct subcase *b) { size_t i; if (a == b) return true; if (a->n_fields != b->n_fields) return false; for (i = 0; i < a->n_fields; i++) if (a->fields[i].width != b->fields[i].width) return false; return true; } /* Copies the fields represented by SC from C into VALUES. VALUES must have space for at least subcase_get_n_fields(SC) array elements. */ void subcase_extract (const struct subcase *sc, const struct ccase *c, union value values[]) { size_t i; for (i = 0; i < sc->n_fields; i++) { const struct subcase_field *field = &sc->fields[i]; union value *value = &values[i]; value_copy (value, case_data_idx (c, field->case_index), field->width); } } /* Copies the data in VALUES into the fields in C represented by SC. VALUES must have at least subcase_get_n_fields(SC) array elements, and C must be large enough to contain all the fields in SC. */ void subcase_inject (const struct subcase *sc, const union value values[], struct ccase *c) { size_t i; for (i = 0; i < sc->n_fields; i++) { const struct subcase_field *field = &sc->fields[i]; const union value *value = &values[i]; value_copy (case_data_rw_idx (c, field->case_index), value, field->width); } } /* Copies the fields in SRC represented by SRC_SC into the corresponding fields in DST respresented by DST_SC. SRC_SC and DST_SC must be conformable (as tested by subcase_conformable()). DST must not be shared. */ void subcase_copy (const struct subcase *src_sc, const struct ccase *src, const struct subcase *dst_sc, struct ccase *dst) { size_t i; expensive_assert (subcase_conformable (src_sc, dst_sc)); for (i = 0; i < src_sc->n_fields; i++) { const struct subcase_field *src_field = &src_sc->fields[i]; const struct subcase_field *dst_field = &dst_sc->fields[i]; value_copy (case_data_rw_idx (dst, dst_field->case_index), case_data_idx (src, src_field->case_index), src_field->width); } } /* Compares the fields in A specified in A_SC against the fields in B specified in B_SC. Returns -1, 0, or 1 if A's fields are lexicographically less than, equal to, or greater than B's fields, respectively. A_SC and B_SC must be conformable (as tested by subcase_conformable()). */ int subcase_compare_3way (const struct subcase *a_sc, const struct ccase *a, const struct subcase *b_sc, const struct ccase *b) { size_t i; expensive_assert (subcase_conformable (a_sc, b_sc)); for (i = 0; i < a_sc->n_fields; i++) { const struct subcase_field *a_field = &a_sc->fields[i]; const struct subcase_field *b_field = &b_sc->fields[i]; int cmp = value_compare_3way (case_data_idx (a, a_field->case_index), case_data_idx (b, b_field->case_index), a_field->width); if (cmp != 0) return a_field->direction == SC_ASCEND ? cmp : -cmp; } return 0; } /* Compares the values in A against the values in B specified by SC's fields. Returns -1, 0, or 1 if A's values are lexicographically less than, equal to, or greater than B's values, respectively. */ int subcase_compare_3way_xc (const struct subcase *sc, const union value a[], const struct ccase *b) { size_t i; for (i = 0; i < sc->n_fields; i++) { const struct subcase_field *field = &sc->fields[i]; int cmp = value_compare_3way (&a[i], case_data_idx (b, field->case_index), field->width); if (cmp != 0) return field->direction == SC_ASCEND ? cmp : -cmp; } return 0; } /* Compares the values in A specified by SC's fields against the values in B. Returns -1, 0, or 1 if A's values are lexicographically less than, equal to, or greater than B's values, respectively. */ int subcase_compare_3way_cx (const struct subcase *sc, const struct ccase *a, const union value b[]) { return -subcase_compare_3way_xc (sc, b, a); } /* Compares the values in A against the values in B, using SC to obtain the number and width of each value. Returns -1, 0, or 1 if A's values are lexicographically less than, equal to, or greater than B's values, respectively. */ int subcase_compare_3way_xx (const struct subcase *sc, const union value a[], const union value b[]) { size_t i; for (i = 0; i < sc->n_fields; i++) { const struct subcase_field *field = &sc->fields[i]; int cmp = value_compare_3way (a++, b++, field->width); if (cmp != 0) return field->direction == SC_ASCEND ? cmp : -cmp; } return 0; } /* Compares the fields in A specified in A_SC against the fields in B specified in B_SC. Returns true if the fields' values are equal, false otherwise. A_SC and B_SC must be conformable (as tested by subcase_conformable()). */ bool subcase_equal (const struct subcase *a_sc, const struct ccase *a, const struct subcase *b_sc, const struct ccase *b) { return subcase_compare_3way (a_sc, a, b_sc, b) == 0; } /* Compares the values in A against the values in B specified by SC's fields. Returns true if A's values are equal to B's values, otherwise false. */ bool subcase_equal_xc (const struct subcase *sc, const union value a[], const struct ccase *b) { return subcase_compare_3way_xc (sc, a, b) == 0; } /* Compares the values in A specified by SC's fields against the values in B. Returns true if A's values are equal to B's values, otherwise false. */ bool subcase_equal_cx (const struct subcase *sc, const struct ccase *a, const union value b[]) { return subcase_compare_3way_cx (sc, a, b) == 0; } /* Compares the values in A against the values in B, using SC to obtain the number and width of each value. Returns true if A's values are equal to B's values, otherwise false. */ bool subcase_equal_xx (const struct subcase *sc, const union value a[], const union value b[]) { return subcase_compare_3way_xx (sc, a, b) == 0; } /* Discards SC's case prototype. (It will be recreated if needed again later.) */ static void invalidate_proto (struct subcase *sc) { caseproto_unref (sc->proto); sc->proto = NULL; } pspp-1.4.1/src/data/casereader-filter.c0000644000175000017500000003126013670210420017335 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2007, 2009, 2011 Free Software Foundation, Inc. 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 3 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, see . */ #include #include "data/casereader.h" #include #include "data/casereader-provider.h" #include "data/casewriter.h" #include "data/variable.h" #include "data/dictionary.h" #include "libpspp/taint.h" #include "libpspp/message.h" #include "gl/xalloc.h" #include "gettext.h" #define _(msgid) gettext (msgid) /* A casereader that filters data coming from another casereader. */ struct casereader_filter { struct casereader *subreader; /* The reader to filter. */ bool (*include) (const struct ccase *, void *aux); bool (*destroy) (void *aux); void *aux; struct casewriter *exclude; /* Writer that gets filtered cases, or NULL. */ }; static const struct casereader_class casereader_filter_class; /* Creates and returns a casereader whose content is a filtered version of the data in SUBREADER. Only the cases for which INCLUDE returns true will appear in the returned casereader, in the original order. If EXCLUDE is non-null, then cases for which INCLUDE returns false are written to EXCLUDE. These cases will not necessarily be fully written to EXCLUDE until the filtering casereader's cases have been fully read or, if that never occurs, until the filtering casereader is destroyed. When the filtering casereader is destroyed, DESTROY will be called to allow any state maintained by INCLUDE to be freed. After this function is called, SUBREADER must not ever again be referenced directly. It will be destroyed automatically when the filtering casereader is destroyed. */ struct casereader * casereader_create_filter_func (struct casereader *subreader, bool (*include) (const struct ccase *, void *aux), bool (*destroy) (void *aux), void *aux, struct casewriter *exclude) { struct casereader_filter *filter = xmalloc (sizeof *filter); struct casereader *reader; filter->subreader = casereader_rename (subreader); filter->include = include; filter->destroy = destroy; filter->aux = aux; filter->exclude = exclude; reader = casereader_create_sequential ( NULL, casereader_get_proto (filter->subreader), CASENUMBER_MAX, &casereader_filter_class, filter); taint_propagate (casereader_get_taint (filter->subreader), casereader_get_taint (reader)); return reader; } /* Internal read function for filtering casereader. */ static struct ccase * casereader_filter_read (struct casereader *reader UNUSED, void *filter_) { struct casereader_filter *filter = filter_; for (;;) { struct ccase *c = casereader_read (filter->subreader); if (c == NULL) return NULL; else if (filter->include (c, filter->aux)) return c; else if (filter->exclude != NULL) casewriter_write (filter->exclude, c); else case_unref (c); } } /* Internal destruction function for filtering casereader. */ static void casereader_filter_destroy (struct casereader *reader, void *filter_) { struct casereader_filter *filter = filter_; /* Make sure we've written everything to the excluded cases casewriter, if there is one. */ if (filter->exclude != NULL) { struct ccase *c; while ((c = casereader_read (filter->subreader)) != NULL) if (filter->include (c, filter->aux)) case_unref (c); else casewriter_write (filter->exclude, c); } casereader_destroy (filter->subreader); if (filter->destroy != NULL && !filter->destroy (filter->aux)) casereader_force_error (reader); free (filter); } /* Filtering casereader class. */ static const struct casereader_class casereader_filter_class = { casereader_filter_read, casereader_filter_destroy, /* We could in fact delegate clone to the subreader, if the filter function is required to have no memory and if we added reference counting. But it might be useful to have filter functions with memory and in any case this would require a little extra work. */ NULL, NULL, }; /* Casereader for filtering valid weights. */ /* Weight-filtering data. */ struct casereader_filter_weight { const struct variable *weight_var; /* Weight variable. */ bool *warn_on_invalid; /* Have we already issued an error? */ bool local_warn_on_invalid; /* warn_on_invalid might point here. */ }; static bool casereader_filter_weight_include (const struct ccase *, void *); static bool casereader_filter_weight_destroy (void *); /* Creates and returns a casereader that filters cases from READER by valid weights, that is, any cases with user- or system-missing, zero, or negative weights are dropped. The weight variable's information is taken from DICT. If DICT does not have a weight variable, then no cases are filtered out. When a case with an invalid weight is encountered, *WARN_ON_INVALID is checked. If it is true, then an error message is issued and *WARN_ON_INVALID is set false. If WARN_ON_INVALID is a null pointer, then an internal bool that is initially true is used instead of a caller-supplied bool. If EXCLUDE is non-null, then dropped cases are written to EXCLUDE. These cases will not necessarily be fully written to EXCLUDE until the filtering casereader's cases have been fully read or, if that never occurs, until the filtering casereader is destroyed. After this function is called, READER must not ever again be referenced directly. It will be destroyed automatically when the filtering casereader is destroyed. */ struct casereader * casereader_create_filter_weight (struct casereader *reader, const struct dictionary *dict, bool *warn_on_invalid, struct casewriter *exclude) { struct variable *weight_var = dict_get_weight (dict); if (weight_var != NULL) { struct casereader_filter_weight *cfw = xmalloc (sizeof *cfw); cfw->weight_var = weight_var; cfw->warn_on_invalid = (warn_on_invalid ? warn_on_invalid : &cfw->local_warn_on_invalid); cfw->local_warn_on_invalid = true; reader = casereader_create_filter_func (reader, casereader_filter_weight_include, casereader_filter_weight_destroy, cfw, exclude); } else reader = casereader_rename (reader); return reader; } /* Internal "include" function for weight-filtering casereader. */ static bool casereader_filter_weight_include (const struct ccase *c, void *cfw_) { struct casereader_filter_weight *cfw = cfw_; double value = case_num (c, cfw->weight_var); if (value >= 0.0 && !var_is_num_missing (cfw->weight_var, value, MV_ANY)) return true; else { if (*cfw->warn_on_invalid) { msg (SW, _("At least one case in the data read had a weight value " "that was user-missing, system-missing, zero, or " "negative. These case(s) were ignored.")); *cfw->warn_on_invalid = false; } return false; } } /* Internal "destroy" function for weight-filtering casereader. */ static bool casereader_filter_weight_destroy (void *cfw_) { struct casereader_filter_weight *cfw = cfw_; free (cfw); return true; } /* Casereader for filtering missing values. */ /* Missing-value filtering data. */ struct casereader_filter_missing { struct variable **vars; /* Variables whose values to filter. */ size_t var_cnt; /* Number of variables. */ enum mv_class class; /* Types of missing values to filter. */ casenumber *n_missing; }; static bool casereader_filter_missing_include (const struct ccase *, void *); static bool casereader_filter_missing_destroy (void *); /* Creates and returns a casereader that filters out cases from READER that have a missing value in the given CLASS for any of the VAR_CNT variables in VARS. Only cases that have non-missing values for all of these variables are passed through. Ownership of VARS is retained by the caller. If EXCLUDE is non-null, then dropped cases are written to EXCLUDE. These cases will not necessarily be fully written to EXCLUDE until the filtering casereader's cases have been fully read or, if that never occurs, until the filtering casereader is destroyed. If N_MISSING is non-null, then after reading, it will be filled with the total number of dropped cases. After this function is called, READER must not ever again be referenced directly. It will be destroyed automatically when the filtering casereader is destroyed. */ struct casereader * casereader_create_filter_missing (struct casereader *reader, const struct variable *const*vars, size_t var_cnt, enum mv_class class, casenumber *n_missing, struct casewriter *exclude) { if (var_cnt > 0 && class != MV_NEVER) { struct casereader_filter_missing *cfm = xmalloc (sizeof *cfm); cfm->vars = xmemdup (vars, sizeof *vars * var_cnt); cfm->var_cnt = var_cnt; cfm->class = class; cfm->n_missing = n_missing; if (n_missing) *n_missing = 0; return casereader_create_filter_func (reader, casereader_filter_missing_include, casereader_filter_missing_destroy, cfm, exclude); } else return casereader_rename (reader); } /* Internal "include" function for missing value-filtering casereader. */ static bool casereader_filter_missing_include (const struct ccase *c, void *cfm_) { const struct casereader_filter_missing *cfm = cfm_; size_t i; for (i = 0; i < cfm->var_cnt; i++) { struct variable *var = cfm->vars[i]; const union value *value = case_data (c, var); if (var_is_value_missing (var, value, cfm->class)) { if (cfm->n_missing) (*cfm->n_missing)++; return false; } } return true; } /* Internal "destroy" function for missing value-filtering casereader. */ static bool casereader_filter_missing_destroy (void *cfm_) { struct casereader_filter_missing *cfm = cfm_; free (cfm->vars); free (cfm); return true; } /* Case-counting casereader. */ static bool casereader_counter_include (const struct ccase *, void *); /* Creates and returns a new casereader that counts the number of cases that have been read from it. *COUNTER is initially set to INITIAL_VALUE, then incremented by 1 each time a case is read. Counting casereaders must be used very cautiously: if a counting casereader is cloned or if the casereader_peek function is used on it, then the counter's value can be higher than expected because of the buffering that goes on behind the scenes. The counter is only incremented as cases are actually read from the casereader. In particular, if the casereader is destroyed before all cases have been read from the casereader, cases never read will not be included in the count. After this function is called, READER must not ever again be referenced directly. It will be destroyed automatically when the filtering casereader is destroyed. */ struct casereader * casereader_create_counter (struct casereader *reader, casenumber *counter, casenumber initial_value) { *counter = initial_value; return casereader_create_filter_func (reader, casereader_counter_include, NULL, counter, NULL); } /* Internal "include" function for counting casereader. */ static bool casereader_counter_include (const struct ccase *c UNUSED, void *counter_) { casenumber *counter = counter_; ++*counter; return true; } pspp-1.4.1/src/data/sys-file-reader.c0000644000175000017500000035033513716057063016773 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 1997-2000, 2006-2007, 2009-2016 Free Software Foundation, Inc. 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 3 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, see . */ #include #include "data/sys-file-private.h" #include #include #include #include #include #include #include "data/any-reader.h" #include "data/attributes.h" #include "data/case.h" #include "data/casereader-provider.h" #include "data/casereader.h" #include "data/dictionary.h" #include "data/file-handle-def.h" #include "data/file-name.h" #include "data/format.h" #include "data/identifier.h" #include "data/missing-values.h" #include "data/mrset.h" #include "data/short-names.h" #include "data/value-labels.h" #include "data/value.h" #include "data/variable.h" #include "libpspp/array.h" #include "libpspp/assertion.h" #include "libpspp/compiler.h" #include "libpspp/i18n.h" #include "libpspp/ll.h" #include "libpspp/message.h" #include "libpspp/misc.h" #include "libpspp/pool.h" #include "libpspp/str.h" #include "libpspp/stringi-set.h" #include "gl/c-strtod.h" #include "gl/c-ctype.h" #include "gl/inttostr.h" #include "gl/localcharset.h" #include "gl/minmax.h" #include "gl/unlocked-io.h" #include "gl/xalloc.h" #include "gl/xalloc-oversized.h" #include "gl/xsize.h" #include "gettext.h" #define _(msgid) gettext (msgid) #define N_(msgid) (msgid) enum { /* subtypes 0-2 unknown */ EXT_INTEGER = 3, /* Machine integer info. */ EXT_FLOAT = 4, /* Machine floating-point info. */ EXT_VAR_SETS = 5, /* Variable sets. */ EXT_DATE = 6, /* DATE. */ EXT_MRSETS = 7, /* Multiple response sets. */ EXT_DATA_ENTRY = 8, /* SPSS Data Entry. */ /* subtype 9 unknown */ EXT_PRODUCT_INFO = 10, /* Extra product info text. */ EXT_DISPLAY = 11, /* Variable display parameters. */ /* subtype 12 unknown */ EXT_LONG_NAMES = 13, /* Long variable names. */ EXT_LONG_STRINGS = 14, /* Long strings. */ /* subtype 15 unknown */ EXT_NCASES = 16, /* Extended number of cases. */ EXT_FILE_ATTRS = 17, /* Data file attributes. */ EXT_VAR_ATTRS = 18, /* Variable attributes. */ EXT_MRSETS2 = 19, /* Multiple response sets (extended). */ EXT_ENCODING = 20, /* Character encoding. */ EXT_LONG_LABELS = 21, /* Value labels for long strings. */ EXT_LONG_MISSING = 22, /* Missing values for long strings. */ EXT_DATAVIEW = 24 /* "Format properties in dataview table". */ }; /* Fields from the top-level header record. */ struct sfm_header_record { char magic[5]; /* First 4 bytes of file, then null. */ int weight_idx; /* 0 if unweighted, otherwise a var index. */ int nominal_case_size; /* Number of var positions. */ /* These correspond to the members of struct any_file_info or a dictionary but in the system file's encoding rather than ASCII. */ char creation_date[10]; /* "dd mmm yy". */ char creation_time[9]; /* "hh:mm:ss". */ char eye_catcher[61]; /* Eye-catcher string, then product name. */ char file_label[65]; /* File label. */ }; struct sfm_var_record { off_t pos; int width; char name[9]; int print_format; int write_format; int missing_value_code; uint8_t missing[24]; char *label; struct variable *var; }; struct sfm_value_label { uint8_t value[8]; char *label; }; struct sfm_value_label_record { off_t pos; struct sfm_value_label *labels; unsigned int n_labels; int *vars; unsigned int n_vars; }; struct sfm_document_record { off_t pos; char *documents; size_t n_lines; }; struct sfm_mrset { const char *name; /* Name. */ const char *label; /* Human-readable label for group. */ enum mrset_type type; /* Group type. */ const char **vars; /* Constituent variables' names. */ size_t n_vars; /* Number of constituent variables. */ /* MRSET_MD only. */ enum mrset_md_cat_source cat_source; /* Source of category labels. */ bool label_from_var_label; /* 'label' taken from variable label? */ const char *counted; /* Counted value, as string. */ }; struct sfm_extension_record { struct ll ll; /* In struct sfm_reader 'var_attrs' list. */ int subtype; /* Record subtype. */ off_t pos; /* Starting offset in file. */ unsigned int size; /* Size of data elements. */ unsigned int count; /* Number of data elements. */ void *data; /* Contents. */ }; /* System file reader. */ struct sfm_reader { struct any_reader any_reader; /* Resource tracking. */ struct pool *pool; /* All system file state. */ /* File data. */ struct any_read_info info; struct sfm_header_record header; struct sfm_var_record *vars; size_t n_vars; struct sfm_value_label_record *labels; size_t n_labels; struct sfm_document_record *document; struct sfm_mrset *mrsets; size_t n_mrsets; struct sfm_extension_record *extensions[32]; struct ll_list var_attrs; /* Contains "struct sfm_extension_record"s. */ /* File state. */ struct file_handle *fh; /* File handle. */ struct fh_lock *lock; /* Mutual exclusion for file handle. */ FILE *file; /* File stream. */ off_t pos; /* Position in file. */ bool error; /* I/O or corruption error? */ struct caseproto *proto; /* Format of output cases. */ /* File format. */ enum integer_format integer_format; /* On-disk integer format. */ enum float_format float_format; /* On-disk floating point format. */ struct sfm_var *sfm_vars; /* Variables. */ size_t sfm_var_cnt; /* Number of variables. */ int case_cnt; /* Number of cases */ const char *encoding; /* String encoding. */ bool written_by_readstat; /* From https://github.com/WizardMac/ReadStat? */ /* Decompression. */ enum any_compression compression; double bias; /* Compression bias, usually 100.0. */ uint8_t opcodes[8]; /* Current block of opcodes. */ size_t opcode_idx; /* Next opcode to interpret, 8 if none left. */ bool corruption_warning; /* Warned about possible corruption? */ /* ZLIB decompression. */ long long int ztrailer_ofs; /* Offset of ZLIB trailer at end of file. */ #define ZIN_BUF_SIZE 4096 uint8_t *zin_buf; /* Inflation input buffer. */ #define ZOUT_BUF_SIZE 16384 uint8_t *zout_buf; /* Inflation output buffer. */ unsigned int zout_end; /* Number of bytes of data in zout_buf. */ unsigned int zout_pos; /* First unconsumed byte in zout_buf. */ z_stream zstream; /* ZLIB inflater. */ }; static const struct casereader_class sys_file_casereader_class; static struct sfm_reader * sfm_reader_cast (const struct any_reader *r_) { assert (r_->klass == &sys_file_reader_class); return UP_CAST (r_, struct sfm_reader, any_reader); } static bool sfm_close (struct any_reader *); static void sys_msg (struct sfm_reader *r, off_t, int class, const char *format, va_list args) PRINTF_FORMAT (4, 0); static void sys_warn (struct sfm_reader *, off_t, const char *, ...) PRINTF_FORMAT (3, 4); static void sys_error (struct sfm_reader *, off_t, const char *, ...) PRINTF_FORMAT (3, 4); static bool read_bytes (struct sfm_reader *, void *, size_t) WARN_UNUSED_RESULT; static int try_read_bytes (struct sfm_reader *, void *, size_t) WARN_UNUSED_RESULT; static bool read_int (struct sfm_reader *, int *) WARN_UNUSED_RESULT; static bool read_uint (struct sfm_reader *, unsigned int *) WARN_UNUSED_RESULT; static bool read_int64 (struct sfm_reader *, long long int *) WARN_UNUSED_RESULT; static bool read_uint64 (struct sfm_reader *, unsigned long long int *) WARN_UNUSED_RESULT; static bool read_string (struct sfm_reader *, char *, size_t) WARN_UNUSED_RESULT; static bool skip_bytes (struct sfm_reader *, size_t) WARN_UNUSED_RESULT; /* ZLIB compressed data handling. */ static bool read_zheader (struct sfm_reader *) WARN_UNUSED_RESULT; static bool open_zstream (struct sfm_reader *) WARN_UNUSED_RESULT; static bool close_zstream (struct sfm_reader *) WARN_UNUSED_RESULT; static int read_bytes_zlib (struct sfm_reader *, void *, size_t) WARN_UNUSED_RESULT; static int read_compressed_bytes (struct sfm_reader *, void *, size_t) WARN_UNUSED_RESULT; static int try_read_compressed_bytes (struct sfm_reader *, void *, size_t) WARN_UNUSED_RESULT; static bool read_compressed_float (struct sfm_reader *, double *) WARN_UNUSED_RESULT; static char *fix_line_ends (const char *); static int parse_int (const struct sfm_reader *, const void *data, size_t ofs); static double parse_float (const struct sfm_reader *, const void *data, size_t ofs); static bool read_variable_record (struct sfm_reader *, struct sfm_var_record *); static bool read_value_label_record (struct sfm_reader *, struct sfm_value_label_record *); static bool read_document_record (struct sfm_reader *); static bool read_extension_record (struct sfm_reader *, int subtype, struct sfm_extension_record **); static bool skip_extension_record (struct sfm_reader *, int subtype); static struct text_record *open_text_record ( struct sfm_reader *, const struct sfm_extension_record *, bool recode_to_utf8); static void close_text_record (struct sfm_reader *, struct text_record *); static bool read_variable_to_value_pair (struct sfm_reader *, struct dictionary *, struct text_record *, struct variable **var, char **value); static void text_warn (struct sfm_reader *r, struct text_record *text, const char *format, ...) PRINTF_FORMAT (3, 4); static char *text_get_token (struct text_record *, struct substring delimiters, char *delimiter); static bool text_match (struct text_record *, char c); static bool text_read_variable_name (struct sfm_reader *, struct dictionary *, struct text_record *, struct substring delimiters, struct variable **); static bool text_read_short_name (struct sfm_reader *, struct dictionary *, struct text_record *, struct substring delimiters, struct variable **); static const char *text_parse_counted_string (struct sfm_reader *, struct text_record *); static size_t text_pos (const struct text_record *); static const char *text_get_all (const struct text_record *); /* Dictionary reader. */ enum which_format { PRINT_FORMAT, WRITE_FORMAT }; static bool read_dictionary (struct sfm_reader *); static bool read_record (struct sfm_reader *, int type, size_t *allocated_vars, size_t *allocated_labels); static bool read_header (struct sfm_reader *, struct any_read_info *, struct sfm_header_record *); static void parse_header (struct sfm_reader *, const struct sfm_header_record *, struct any_read_info *, struct dictionary *); static bool parse_variable_records (struct sfm_reader *, struct dictionary *, struct sfm_var_record *, size_t n); static void parse_format_spec (struct sfm_reader *, off_t pos, unsigned int format, enum which_format, struct variable *, int *format_warning_cnt); static void parse_document (struct dictionary *, struct sfm_document_record *); static void parse_display_parameters (struct sfm_reader *, const struct sfm_extension_record *, struct dictionary *); static bool parse_machine_integer_info (struct sfm_reader *, const struct sfm_extension_record *, struct any_read_info *); static void parse_machine_float_info (struct sfm_reader *, const struct sfm_extension_record *); static void parse_extra_product_info (struct sfm_reader *, const struct sfm_extension_record *, struct any_read_info *); static void parse_mrsets (struct sfm_reader *, const struct sfm_extension_record *, size_t *allocated_mrsets); static void decode_mrsets (struct sfm_reader *, struct dictionary *); static void parse_long_var_name_map (struct sfm_reader *, const struct sfm_extension_record *, struct dictionary *); static bool parse_long_string_map (struct sfm_reader *, const struct sfm_extension_record *, struct dictionary *); static void parse_value_labels (struct sfm_reader *, struct dictionary *); static struct variable *parse_weight_var (struct sfm_reader *, const struct sfm_var_record *, size_t n_var_recs, int idx); static void parse_data_file_attributes (struct sfm_reader *, const struct sfm_extension_record *, struct dictionary *); static void parse_variable_attributes (struct sfm_reader *, const struct sfm_extension_record *, struct dictionary *); static void assign_variable_roles (struct sfm_reader *, struct dictionary *); static void parse_long_string_value_labels (struct sfm_reader *, const struct sfm_extension_record *, struct dictionary *); static void parse_long_string_missing_values ( struct sfm_reader *, const struct sfm_extension_record *, struct dictionary *); /* Frees the strings inside INFO. */ void any_read_info_destroy (struct any_read_info *info) { if (info) { free (info->creation_date); free (info->creation_time); free (info->product); free (info->product_ext); } } /* Tries to open FH for reading as a system file. Returns an sfm_reader if successful, otherwise NULL. */ static struct any_reader * sfm_open (struct file_handle *fh) { size_t allocated_mrsets = 0; struct sfm_reader *r; /* Create and initialize reader. */ r = xzalloc (sizeof *r); r->any_reader.klass = &sys_file_reader_class; r->pool = pool_create (); pool_register (r->pool, free, r); r->fh = fh_ref (fh); r->opcode_idx = sizeof r->opcodes; ll_init (&r->var_attrs); /* TRANSLATORS: this fragment will be interpolated into messages in fh_lock() that identify types of files. */ r->lock = fh_lock (fh, FH_REF_FILE, N_("system file"), FH_ACC_READ, false); if (r->lock == NULL) goto error; r->file = fn_open (fh, "rb"); if (r->file == NULL) { msg (ME, _("Error opening `%s' for reading as a system file: %s."), fh_get_file_name (r->fh), strerror (errno)); goto error; } if (!read_dictionary (r)) goto error; if (r->extensions[EXT_MRSETS] != NULL) parse_mrsets (r, r->extensions[EXT_MRSETS], &allocated_mrsets); if (r->extensions[EXT_MRSETS2] != NULL) parse_mrsets (r, r->extensions[EXT_MRSETS2], &allocated_mrsets); return &r->any_reader; error: if (r) sfm_close (&r->any_reader); return NULL; } static bool read_dictionary (struct sfm_reader *r) { size_t allocated_vars; size_t allocated_labels; if (!read_header (r, &r->info, &r->header)) return false; allocated_vars = 0; allocated_labels = 0; for (;;) { int type; if (!read_int (r, &type)) return false; if (type == 999) break; if (!read_record (r, type, &allocated_vars, &allocated_labels)) return false; } if (!skip_bytes (r, 4)) return false; if (r->compression == ANY_COMP_ZLIB && !read_zheader (r)) return false; return true; } static bool read_record (struct sfm_reader *r, int type, size_t *allocated_vars, size_t *allocated_labels) { int subtype; switch (type) { case 2: if (r->n_vars >= *allocated_vars) r->vars = pool_2nrealloc (r->pool, r->vars, allocated_vars, sizeof *r->vars); return read_variable_record (r, &r->vars[r->n_vars++]); case 3: if (r->n_labels >= *allocated_labels) r->labels = pool_2nrealloc (r->pool, r->labels, allocated_labels, sizeof *r->labels); return read_value_label_record (r, &r->labels[r->n_labels++]); case 4: /* A Type 4 record is always immediately after a type 3 record, so the code for type 3 records reads the type 4 record too. */ sys_error (r, r->pos, _("Misplaced type 4 record.")); return false; case 6: if (r->document != NULL) sys_warn (r, r->pos, _("Duplicate type 6 (document) record.")); return read_document_record (r); case 7: if (!read_int (r, &subtype)) return false; else if (subtype < 0 || subtype >= sizeof r->extensions / sizeof *r->extensions) { sys_warn (r, r->pos, _("Unrecognized record type 7, subtype %d. For help, " "please send this file to %s and mention that you were " "using %s."), subtype, PACKAGE_BUGREPORT, PACKAGE_STRING); return skip_extension_record (r, subtype); } else if (subtype == 18) { /* System files written by "Stata 14.1/-savespss- 1.77 by S.Radyakin" put each variable attribute into a separate record with subtype 18. I'm surprised that SPSS puts up with this. */ struct sfm_extension_record *ext; bool ok = read_extension_record (r, subtype, &ext); if (ok && ext) ll_push_tail (&r->var_attrs, &ext->ll); return ok; } else if (r->extensions[subtype] != NULL) { sys_warn (r, r->pos, _("Record type 7, subtype %d found here has the same " "type as the record found near offset 0x%llx. For " "help, please send this file to %s and mention that " "you were using %s."), subtype, (long long int) r->extensions[subtype]->pos, PACKAGE_BUGREPORT, PACKAGE_STRING); return skip_extension_record (r, subtype); } else return read_extension_record (r, subtype, &r->extensions[subtype]); default: sys_error (r, r->pos, _("Unrecognized record type %d."), type); return false; } NOT_REACHED (); } /* Returns the character encoding obtained from R, or a null pointer if R doesn't have an indication of its character encoding. */ static const char * sfm_get_encoding (const struct sfm_reader *r) { /* The EXT_ENCODING record is the best way to determine dictionary encoding. */ if (r->extensions[EXT_ENCODING]) return r->extensions[EXT_ENCODING]->data; /* But EXT_INTEGER is better than nothing as a fallback. */ if (r->extensions[EXT_INTEGER]) { int codepage = parse_int (r, r->extensions[EXT_INTEGER]->data, 7 * 4); const char *encoding; switch (codepage) { case 1: return "EBCDIC-US"; case 2: case 3: /* These ostensibly mean "7-bit ASCII" and "8-bit ASCII"[sic] respectively. However, many files have character code 2 but data which are clearly not ASCII. Therefore, ignore these values. */ break; case 4: return "MS_KANJI"; default: encoding = sys_get_encoding_from_codepage (codepage); if (encoding != NULL) return encoding; break; } } /* If the file magic number is EBCDIC then its character data is too. */ if (!strcmp (r->header.magic, EBCDIC_MAGIC)) return "EBCDIC-US"; return NULL; } struct get_strings_aux { struct pool *pool; char **titles; char **strings; bool *ids; size_t allocated; size_t n; }; static void add_string__ (struct get_strings_aux *aux, const char *string, bool id, char *title) { if (aux->n >= aux->allocated) { aux->allocated = 2 * (aux->allocated + 1); aux->titles = pool_realloc (aux->pool, aux->titles, aux->allocated * sizeof *aux->titles); aux->strings = pool_realloc (aux->pool, aux->strings, aux->allocated * sizeof *aux->strings); aux->ids = pool_realloc (aux->pool, aux->ids, aux->allocated * sizeof *aux->ids); } aux->titles[aux->n] = title; aux->strings[aux->n] = pool_strdup (aux->pool, string); aux->ids[aux->n] = id; aux->n++; } static void PRINTF_FORMAT (3, 4) add_string (struct get_strings_aux *aux, const char *string, const char *title, ...) { va_list args; va_start (args, title); add_string__ (aux, string, false, pool_vasprintf (aux->pool, title, args)); va_end (args); } static void PRINTF_FORMAT (3, 4) add_id (struct get_strings_aux *aux, const char *id, const char *title, ...) { va_list args; va_start (args, title); add_string__ (aux, id, true, pool_vasprintf (aux->pool, title, args)); va_end (args); } /* Retrieves significant string data from R in its raw format, to allow the caller to try to detect the encoding in use. Returns the number of strings retrieved N. Sets each of *TITLESP, *IDSP, and *STRINGSP to an array of N elements allocated from POOL. For each I in 0...N-1, UTF-8 string *TITLESP[I] describes *STRINGSP[I], which is in whatever encoding system file R uses. *IDS[I] is true if *STRINGSP[I] must be a valid PSPP language identifier, false if *STRINGSP[I] is free-form text. */ static size_t sfm_get_strings (const struct any_reader *r_, struct pool *pool, char ***titlesp, bool **idsp, char ***stringsp) { struct sfm_reader *r = sfm_reader_cast (r_); const struct sfm_mrset *mrset; struct get_strings_aux aux; size_t var_idx; size_t i, j, k; aux.pool = pool; aux.titles = NULL; aux.strings = NULL; aux.ids = NULL; aux.allocated = 0; aux.n = 0; var_idx = 0; for (i = 0; i < r->n_vars; i++) if (r->vars[i].width != -1) add_id (&aux, r->vars[i].name, _("Variable %zu"), ++var_idx); var_idx = 0; for (i = 0; i < r->n_vars; i++) if (r->vars[i].width != -1) { var_idx++; if (r->vars[i].label) add_string (&aux, r->vars[i].label, _("Variable %zu Label"), var_idx); } k = 0; for (i = 0; i < r->n_labels; i++) for (j = 0; j < r->labels[i].n_labels; j++) add_string (&aux, r->labels[i].labels[j].label, _("Value Label %zu"), k++); add_string (&aux, r->header.creation_date, _("Creation Date")); add_string (&aux, r->header.creation_time, _("Creation Time")); add_string (&aux, r->header.eye_catcher, _("Product")); add_string (&aux, r->header.file_label, _("File Label")); if (r->extensions[EXT_PRODUCT_INFO]) add_string (&aux, r->extensions[EXT_PRODUCT_INFO]->data, _("Extra Product Info")); if (r->document) { size_t i; for (i = 0; i < r->document->n_lines; i++) { char line[81]; memcpy (line, r->document->documents + i * 80, 80); line[80] = '\0'; add_string (&aux, line, _("Document Line %zu"), i + 1); } } for (mrset = r->mrsets; mrset < &r->mrsets[r->n_mrsets]; mrset++) { size_t mrset_idx = mrset - r->mrsets + 1; add_id (&aux, mrset->name, _("MRSET %zu"), mrset_idx); if (mrset->label[0]) add_string (&aux, mrset->label, _("MRSET %zu Label"), mrset_idx); /* Skip the variables because they ought to be duplicates. */ if (mrset->counted) add_string (&aux, mrset->counted, _("MRSET %zu Counted Value"), mrset_idx); } /* data file attributes */ /* variable attributes */ /* long var map */ /* long string value labels */ /* long string missing values */ *titlesp = aux.titles; *idsp = aux.ids; *stringsp = aux.strings; return aux.n; } /* Decodes the dictionary read from R, saving it into into *DICT. Character strings in R are decoded using ENCODING, or an encoding obtained from R if ENCODING is null, or the locale encoding if R specifies no encoding. If INFOP is non-null, then it receives additional info about the system file, which the caller must eventually free with any_read_info_destroy() when it is no longer needed. This function consumes R. The caller must use it again later, even to destroy it with sfm_close(). */ static struct casereader * sfm_decode (struct any_reader *r_, const char *encoding, struct dictionary **dictp, struct any_read_info *infop) { struct sfm_reader *r = sfm_reader_cast (r_); struct dictionary *dict; if (encoding == NULL) { encoding = sfm_get_encoding (r); if (encoding == NULL) { sys_warn (r, -1, _("This system file does not indicate its own " "character encoding. Using default encoding " "%s. For best results, specify an encoding " "explicitly. Use SYSFILE INFO with " "ENCODING=\"DETECT\" to analyze the possible " "encodings."), locale_charset ()); encoding = locale_charset (); } } dict = dict_create (encoding); r->encoding = dict_get_encoding (dict); /* These records don't use variables at all. */ if (r->document != NULL) parse_document (dict, r->document); if (r->extensions[EXT_INTEGER] != NULL && !parse_machine_integer_info (r, r->extensions[EXT_INTEGER], &r->info)) goto error; if (r->extensions[EXT_FLOAT] != NULL) parse_machine_float_info (r, r->extensions[EXT_FLOAT]); if (r->extensions[EXT_PRODUCT_INFO] != NULL) parse_extra_product_info (r, r->extensions[EXT_PRODUCT_INFO], &r->info); if (r->extensions[EXT_FILE_ATTRS] != NULL) parse_data_file_attributes (r, r->extensions[EXT_FILE_ATTRS], dict); parse_header (r, &r->header, &r->info, dict); /* Parse the variable records, the basis of almost everything else. */ if (!parse_variable_records (r, dict, r->vars, r->n_vars)) goto error; /* Parse value labels and the weight variable immediately after the variable records. These records use indexes into var_recs[], so we must parse them before those indexes become invalidated by very long string variables. */ parse_value_labels (r, dict); if (r->header.weight_idx != 0) dict_set_weight (dict, parse_weight_var (r, r->vars, r->n_vars, r->header.weight_idx)); if (r->extensions[EXT_DISPLAY] != NULL) parse_display_parameters (r, r->extensions[EXT_DISPLAY], dict); /* The following records use short names, so they need to be parsed before parse_long_var_name_map() changes short names to long names. */ decode_mrsets (r, dict); if (r->extensions[EXT_LONG_STRINGS] != NULL && !parse_long_string_map (r, r->extensions[EXT_LONG_STRINGS], dict)) goto error; /* Now rename variables to their long names. */ parse_long_var_name_map (r, r->extensions[EXT_LONG_NAMES], dict); /* The following records use long names, so they need to follow renaming. */ if (!ll_is_empty (&r->var_attrs)) { struct sfm_extension_record *ext; ll_for_each (ext, struct sfm_extension_record, ll, &r->var_attrs) parse_variable_attributes (r, ext, dict); /* Roles use the $@Role attribute. */ assign_variable_roles (r, dict); } if (r->extensions[EXT_LONG_LABELS] != NULL) parse_long_string_value_labels (r, r->extensions[EXT_LONG_LABELS], dict); if (r->extensions[EXT_LONG_MISSING] != NULL) parse_long_string_missing_values (r, r->extensions[EXT_LONG_MISSING], dict); /* Warn if the actual amount of data per case differs from the amount that the header claims. SPSS version 13 gets this wrong when very long strings are involved, so don't warn in that case. */ if (r->header.nominal_case_size > 0 && r->header.nominal_case_size != r->n_vars && r->info.version_major != 13) sys_warn (r, -1, _("File header claims %d variable positions but " "%zu were read from file."), r->header.nominal_case_size, r->n_vars); /* Create an index of dictionary variable widths for sfm_read_case to use. We cannot use the `struct variable's from the dictionary we created, because the caller owns the dictionary and may destroy or modify its variables. */ sfm_dictionary_to_sfm_vars (dict, &r->sfm_vars, &r->sfm_var_cnt); pool_register (r->pool, free, r->sfm_vars); r->proto = caseproto_ref_pool (dict_get_proto (dict), r->pool); *dictp = dict; if (infop) { *infop = r->info; memset (&r->info, 0, sizeof r->info); } return casereader_create_sequential (NULL, r->proto, r->case_cnt == -1 ? CASENUMBER_MAX: r->case_cnt, &sys_file_casereader_class, r); error: sfm_close (r_); dict_unref (dict); *dictp = NULL; return NULL; } /* Closes R, which should have been returned by sfm_open() but not already closed with sfm_decode() or this function. Returns true if an I/O error has occurred on READER, false otherwise. */ static bool sfm_close (struct any_reader *r_) { struct sfm_reader *r = sfm_reader_cast (r_); bool error; if (r->file) { if (fn_close (r->fh, r->file) == EOF) { msg (ME, _("Error closing system file `%s': %s."), fh_get_file_name (r->fh), strerror (errno)); r->error = true; } r->file = NULL; } any_read_info_destroy (&r->info); fh_unlock (r->lock); fh_unref (r->fh); error = r->error; pool_destroy (r->pool); return !error; } /* Destroys READER. */ static void sys_file_casereader_destroy (struct casereader *reader UNUSED, void *r_) { struct sfm_reader *r = r_; sfm_close (&r->any_reader); } /* Detects whether FILE is an SPSS system file. Returns 1 if so, 0 if not, and a negative errno value if there is an error reading FILE. */ static int sfm_detect (FILE *file) { char magic[5]; if (fseek (file, 0, SEEK_SET) != 0) return -errno; if (fread (magic, 4, 1, file) != 1) return ferror (file) ? -errno : 0; magic[4] = '\0'; return (!strcmp (ASCII_MAGIC, magic) || !strcmp (ASCII_ZMAGIC, magic) || !strcmp (EBCDIC_MAGIC, magic)); } /* Reads the global header of the system file. Initializes *HEADER and *INFO, except for the string fields in *INFO, which parse_header() will initialize later once the file's encoding is known. */ static bool read_header (struct sfm_reader *r, struct any_read_info *info, struct sfm_header_record *header) { uint8_t raw_layout_code[4]; uint8_t raw_bias[8]; int compressed; bool zmagic; if (!read_string (r, header->magic, sizeof header->magic) || !read_string (r, header->eye_catcher, sizeof header->eye_catcher)) return false; r->written_by_readstat = strstr (header->eye_catcher, "https://github.com/WizardMac/ReadStat"); if (!strcmp (ASCII_MAGIC, header->magic) || !strcmp (EBCDIC_MAGIC, header->magic)) zmagic = false; else if (!strcmp (ASCII_ZMAGIC, header->magic)) zmagic = true; else { sys_error (r, 0, _("This is not an SPSS system file.")); return false; } /* Identify integer format. */ if (!read_bytes (r, raw_layout_code, sizeof raw_layout_code)) return false; if ((!integer_identify (2, raw_layout_code, sizeof raw_layout_code, &r->integer_format) && !integer_identify (3, raw_layout_code, sizeof raw_layout_code, &r->integer_format)) || (r->integer_format != INTEGER_MSB_FIRST && r->integer_format != INTEGER_LSB_FIRST)) { sys_error (r, 64, _("This is not an SPSS system file.")); return false; } if (!read_int (r, &header->nominal_case_size)) return false; if (header->nominal_case_size < 0 || header->nominal_case_size > INT_MAX / 16) header->nominal_case_size = -1; if (!read_int (r, &compressed)) return false; if (!zmagic) { if (compressed == 0) r->compression = ANY_COMP_NONE; else if (compressed == 1) r->compression = ANY_COMP_SIMPLE; else if (compressed != 0) { sys_error (r, 0, "System file header has invalid compression " "value %d.", compressed); return false; } } else { if (compressed == 2) r->compression = ANY_COMP_ZLIB; else { sys_error (r, 0, "ZLIB-compressed system file header has invalid " "compression value %d.", compressed); return false; } } if (!read_int (r, &header->weight_idx)) return false; if (!read_int (r, &r->case_cnt)) return false; if (r->case_cnt > INT_MAX / 2) r->case_cnt = -1; /* Identify floating-point format and obtain compression bias. */ if (!read_bytes (r, raw_bias, sizeof raw_bias)) return false; if (float_identify (100.0, raw_bias, sizeof raw_bias, &r->float_format) == 0) { uint8_t zero_bias[8] = { 0, 0, 0, 0, 0, 0, 0, 0 }; if (memcmp (raw_bias, zero_bias, 8)) sys_warn (r, r->pos - 8, _("Compression bias is not the usual " "value of 100, or system file uses unrecognized " "floating-point format.")); else { /* Some software is known to write all-zeros to this field. Such software also writes floating-point numbers in the format that we expect by default (it seems that all software most likely does, in reality), so don't warn in this case. */ } if (r->integer_format == INTEGER_MSB_FIRST) r->float_format = FLOAT_IEEE_DOUBLE_BE; else r->float_format = FLOAT_IEEE_DOUBLE_LE; } float_convert (r->float_format, raw_bias, FLOAT_NATIVE_DOUBLE, &r->bias); if (!read_string (r, header->creation_date, sizeof header->creation_date) || !read_string (r, header->creation_time, sizeof header->creation_time) || !read_string (r, header->file_label, sizeof header->file_label) || !skip_bytes (r, 3)) return false; info->integer_format = r->integer_format; info->float_format = r->float_format; info->compression = r->compression; info->case_cnt = r->case_cnt; return true; } /* Reads a variable (type 2) record from R into RECORD. */ static bool read_variable_record (struct sfm_reader *r, struct sfm_var_record *record) { int has_variable_label; memset (record, 0, sizeof *record); record->pos = r->pos; if (!read_int (r, &record->width) || !read_int (r, &has_variable_label) || !read_int (r, &record->missing_value_code) || !read_int (r, &record->print_format) || !read_int (r, &record->write_format) || !read_string (r, record->name, sizeof record->name)) return false; if (has_variable_label == 1) { enum { MAX_LABEL_LEN = 65536 }; unsigned int len, read_len; if (!read_uint (r, &len)) return false; /* Read up to MAX_LABEL_LEN bytes of label. */ read_len = MIN (MAX_LABEL_LEN, len); record->label = pool_malloc (r->pool, read_len + 1); if (!read_string (r, record->label, read_len + 1)) return false; /* Skip unread label bytes. */ if (!skip_bytes (r, len - read_len)) return false; /* Skip label padding up to multiple of 4 bytes. */ if (!skip_bytes (r, ROUND_UP (len, 4) - len)) return false; } else if (has_variable_label != 0) { sys_error (r, record->pos, _("Variable label indicator field is not 0 or 1.")); return false; } /* Set missing values. */ if (record->missing_value_code != 0) { int code = record->missing_value_code; if (record->width == 0) { if (code < -3 || code > 3 || code == -1) { sys_error (r, record->pos, _("Numeric missing value indicator field is not " "-3, -2, 0, 1, 2, or 3.")); return false; } } else { if (code < 1 || code > 3) { sys_error (r, record->pos, _("String missing value indicator field is not " "0, 1, 2, or 3.")); return false; } } if (!read_bytes (r, record->missing, 8 * abs (code))) return false; } return true; } /* Reads value labels from R into RECORD. */ static bool read_value_label_record (struct sfm_reader *r, struct sfm_value_label_record *record) { size_t i; int type; /* Read type 3 record. */ record->pos = r->pos; if (!read_uint (r, &record->n_labels)) return false; if (record->n_labels > UINT_MAX / sizeof *record->labels) { sys_error (r, r->pos - 4, _("Invalid number of labels %u."), record->n_labels); return false; } record->labels = pool_nmalloc (r->pool, record->n_labels, sizeof *record->labels); for (i = 0; i < record->n_labels; i++) { struct sfm_value_label *label = &record->labels[i]; unsigned char label_len; size_t padded_len; if (!read_bytes (r, label->value, sizeof label->value)) return false; /* Read label length. */ if (!read_bytes (r, &label_len, sizeof label_len)) return false; padded_len = ROUND_UP (label_len + 1, 8); /* Read label, padding. */ label->label = pool_malloc (r->pool, padded_len + 1); if (!read_bytes (r, label->label, padded_len - 1)) return false; label->label[label_len] = '\0'; } /* Read record type of type 4 record. */ if (!read_int (r, &type)) return false; if (type != 4) { sys_error (r, r->pos - 4, _("Variable index record (type 4) does not immediately " "follow value label record (type 3) as it should.")); return false; } /* Read number of variables associated with value label from type 4 record. */ if (!read_uint (r, &record->n_vars)) return false; if (record->n_vars < 1 || record->n_vars > r->n_vars) { sys_error (r, r->pos - 4, _("Number of variables associated with a value label (%u) " "is not between 1 and the number of variables (%zu)."), record->n_vars, r->n_vars); return false; } record->vars = pool_nmalloc (r->pool, record->n_vars, sizeof *record->vars); for (i = 0; i < record->n_vars; i++) if (!read_int (r, &record->vars[i])) return false; return true; } /* Reads a document record from R. Returns true if successful, false on error. */ static bool read_document_record (struct sfm_reader *r) { int n_lines; if (!read_int (r, &n_lines)) return false; else if (n_lines == 0) return true; else if (n_lines < 0 || n_lines >= INT_MAX / DOC_LINE_LENGTH) { sys_error (r, r->pos, _("Number of document lines (%d) " "must be greater than 0 and less than %d."), n_lines, INT_MAX / DOC_LINE_LENGTH); return false; } struct sfm_document_record *record; record = pool_malloc (r->pool, sizeof *record); record->pos = r->pos; record->n_lines = n_lines; record->documents = pool_malloc (r->pool, DOC_LINE_LENGTH * n_lines); if (!read_bytes (r, record->documents, DOC_LINE_LENGTH * n_lines)) return false; r->document = record; return true; } static bool read_extension_record_header (struct sfm_reader *r, int subtype, struct sfm_extension_record *record) { record->subtype = subtype; record->pos = r->pos; if (!read_uint (r, &record->size) || !read_uint (r, &record->count)) return false; /* Check that SIZE * COUNT + 1 doesn't overflow. Adding 1 allows an extra byte for a null terminator, used by some extension processing routines. */ if (record->size != 0 && xsum (1, xtimes (record->count, record->size)) >= UINT_MAX) { sys_error (r, record->pos, "Record type 7 subtype %d too large.", subtype); return false; } return true; } /* Reads an extension record from R into RECORD. */ static bool read_extension_record (struct sfm_reader *r, int subtype, struct sfm_extension_record **recordp) { struct extension_record_type { int subtype; int size; int count; }; static const struct extension_record_type types[] = { /* Implemented record types. */ { EXT_INTEGER, 4, 8 }, { EXT_FLOAT, 8, 3 }, { EXT_MRSETS, 1, 0 }, { EXT_PRODUCT_INFO, 1, 0 }, { EXT_DISPLAY, 4, 0 }, { EXT_LONG_NAMES, 1, 0 }, { EXT_LONG_STRINGS, 1, 0 }, { EXT_NCASES, 8, 2 }, { EXT_FILE_ATTRS, 1, 0 }, { EXT_VAR_ATTRS, 1, 0 }, { EXT_MRSETS2, 1, 0 }, { EXT_ENCODING, 1, 0 }, { EXT_LONG_LABELS, 1, 0 }, { EXT_LONG_MISSING, 1, 0 }, /* Ignored record types. */ { EXT_VAR_SETS, 0, 0 }, { EXT_DATE, 0, 0 }, { EXT_DATA_ENTRY, 0, 0 }, { EXT_DATAVIEW, 0, 0 }, }; const struct extension_record_type *type; struct sfm_extension_record *record; size_t n_bytes; *recordp = NULL; record = pool_malloc (r->pool, sizeof *record); if (!read_extension_record_header (r, subtype, record)) return false; n_bytes = record->count * record->size; for (type = types; type < &types[sizeof types / sizeof *types]; type++) if (subtype == type->subtype) { if (type->size > 0 && record->size != type->size) sys_warn (r, record->pos, _("Record type 7, subtype %d has bad size %u " "(expected %d)."), subtype, record->size, type->size); else if (type->count > 0 && record->count != type->count) sys_warn (r, record->pos, _("Record type 7, subtype %d has bad count %u " "(expected %d)."), subtype, record->count, type->count); else if (type->count == 0 && type->size == 0) { /* Ignore this record. */ } else { char *data = pool_malloc (r->pool, n_bytes + 1); data[n_bytes] = '\0'; record->data = data; if (!read_bytes (r, record->data, n_bytes)) return false; *recordp = record; return true; } goto skip; } sys_warn (r, record->pos, _("Unrecognized record type 7, subtype %d. For help, please " "send this file to %s and mention that you were using %s."), subtype, PACKAGE_BUGREPORT, PACKAGE_STRING); skip: return skip_bytes (r, n_bytes); } static bool skip_extension_record (struct sfm_reader *r, int subtype) { struct sfm_extension_record record; return (read_extension_record_header (r, subtype, &record) && skip_bytes (r, record.count * record.size)); } static void parse_header (struct sfm_reader *r, const struct sfm_header_record *header, struct any_read_info *info, struct dictionary *dict) { const char *dict_encoding = dict_get_encoding (dict); struct substring product; struct substring label; char *fixed_label; /* Convert file label to UTF-8 and put it into DICT. */ label = recode_substring_pool ("UTF-8", dict_encoding, ss_cstr (header->file_label), r->pool); ss_trim (&label, ss_cstr (" ")); label.string[label.length] = '\0'; fixed_label = fix_line_ends (label.string); dict_set_label (dict, fixed_label); free (fixed_label); /* Put creation date and time in UTF-8 into INFO. */ info->creation_date = recode_string ("UTF-8", dict_encoding, header->creation_date, -1); info->creation_time = recode_string ("UTF-8", dict_encoding, header->creation_time, -1); /* Put product name into INFO, dropping eye-catcher string if present. */ product = recode_substring_pool ("UTF-8", dict_encoding, ss_cstr (header->eye_catcher), r->pool); ss_match_string (&product, ss_cstr ("@(#) SPSS DATA FILE")); ss_trim (&product, ss_cstr (" ")); info->product = ss_xstrdup (product); } static struct variable * add_var_with_generated_name (struct dictionary *dict, int width) { char *name = dict_make_unique_var_name (dict, NULL, NULL); struct variable *var = dict_create_var_assert (dict, name, width); free (name); return var; } /* Reads a variable (type 2) record from R and adds the corresponding variable to DICT. Also skips past additional variable records for long string variables. */ static bool parse_variable_records (struct sfm_reader *r, struct dictionary *dict, struct sfm_var_record *var_recs, size_t n_var_recs) { const char *dict_encoding = dict_get_encoding (dict); struct sfm_var_record *rec; int n_warnings = 0; for (rec = var_recs; rec < &var_recs[n_var_recs];) { size_t n_values; char *name; size_t i; name = recode_string_pool ("UTF-8", dict_encoding, rec->name, -1, r->pool); name[strcspn (name, " ")] = '\0'; if (rec->width < 0 || rec->width > 255) { sys_error (r, rec->pos, _("Bad width %d for variable %s."), rec->width, name); return false; } struct variable *var; if (!dict_id_is_valid (dict, name, false) || name[0] == '$' || name[0] == '#') { var = add_var_with_generated_name (dict, rec->width); sys_warn (r, rec->pos, _("Renaming variable with invalid name " "`%s' to `%s'."), name, var_get_name (var)); } else { var = dict_create_var (dict, name, rec->width); if (var == NULL) { var = add_var_with_generated_name (dict, rec->width); sys_warn (r, rec->pos, _("Renaming variable with duplicate name " "`%s' to `%s'."), name, var_get_name (var)); } } rec->var = var; /* Set the short name the same as the long name (even if we renamed it). */ var_set_short_name (var, 0, var_get_name (var)); /* Get variable label, if any. */ if (rec->label) { char *utf8_label; utf8_label = recode_string_pool ("UTF-8", dict_encoding, rec->label, -1, r->pool); var_set_label (var, utf8_label); } /* Set missing values. */ if (rec->missing_value_code != 0) { int width = var_get_width (var); struct missing_values mv; mv_init_pool (r->pool, &mv, width); if (var_is_numeric (var)) { bool has_range = rec->missing_value_code < 0; int n_discrete = (has_range ? rec->missing_value_code == -3 : rec->missing_value_code); int ofs = 0; if (has_range) { double low = parse_float (r, rec->missing, 0); double high = parse_float (r, rec->missing, 8); /* Deal with SPSS 21 change in representation. */ if (low == SYSMIS) low = LOWEST; mv_add_range (&mv, low, high); ofs += 16; } for (i = 0; i < n_discrete; i++) { mv_add_num (&mv, parse_float (r, rec->missing, ofs)); ofs += 8; } } else for (i = 0; i < rec->missing_value_code; i++) mv_add_str (&mv, rec->missing + 8 * i, MIN (width, 8)); var_set_missing_values (var, &mv); } /* Set formats. */ parse_format_spec (r, rec->pos + 12, rec->print_format, PRINT_FORMAT, var, &n_warnings); parse_format_spec (r, rec->pos + 16, rec->write_format, WRITE_FORMAT, var, &n_warnings); /* Account for values. Skip long string continuation records, if any. */ n_values = rec->width == 0 ? 1 : DIV_RND_UP (rec->width, 8); for (i = 1; i < n_values; i++) if (i + (rec - var_recs) >= n_var_recs || rec[i].width != -1) { sys_error (r, rec->pos, _("Missing string continuation record.")); return false; } rec += n_values; } return true; } /* Translates the format spec from sysfile format to internal format. */ static void parse_format_spec (struct sfm_reader *r, off_t pos, unsigned int format, enum which_format which, struct variable *v, int *n_warnings) { const int max_warnings = 8; struct fmt_spec f; if (fmt_from_u32 (format, var_get_width (v), false, &f)) { if (which == PRINT_FORMAT) var_set_print_format (v, &f); else var_set_write_format (v, &f); } else if (format == 0) { /* Actually observed in the wild. No point in warning about it. */ } else if (++*n_warnings <= max_warnings) { if (which == PRINT_FORMAT) sys_warn (r, pos, _("Variable %s with width %d has invalid print " "format 0x%x."), var_get_name (v), var_get_width (v), format); else sys_warn (r, pos, _("Variable %s with width %d has invalid write " "format 0x%x."), var_get_name (v), var_get_width (v), format); if (*n_warnings == max_warnings) sys_warn (r, -1, _("Suppressing further invalid format warnings.")); } } static void parse_document (struct dictionary *dict, struct sfm_document_record *record) { const char *p; for (p = record->documents; p < record->documents + DOC_LINE_LENGTH * record->n_lines; p += DOC_LINE_LENGTH) { struct substring line; line = recode_substring_pool ("UTF-8", dict_get_encoding (dict), ss_buffer (p, DOC_LINE_LENGTH), NULL); ss_rtrim (&line, ss_cstr (" ")); line.string[line.length] = '\0'; dict_add_document_line (dict, line.string, false); ss_dealloc (&line); } } /* Parses record type 7, subtype 3. */ static bool parse_machine_integer_info (struct sfm_reader *r, const struct sfm_extension_record *record, struct any_read_info *info) { int float_representation, expected_float_format; int integer_representation, expected_integer_format; /* Save version info. */ info->version_major = parse_int (r, record->data, 0); info->version_minor = parse_int (r, record->data, 4); info->version_revision = parse_int (r, record->data, 8); /* Check floating point format. */ float_representation = parse_int (r, record->data, 16); if (r->float_format == FLOAT_IEEE_DOUBLE_BE || r->float_format == FLOAT_IEEE_DOUBLE_LE) expected_float_format = 1; else if (r->float_format == FLOAT_Z_LONG) expected_float_format = 2; else if (r->float_format == FLOAT_VAX_G || r->float_format == FLOAT_VAX_D) expected_float_format = 3; else NOT_REACHED (); if (float_representation != expected_float_format) { sys_error (r, record->pos, _("Floating-point representation indicated by " "system file (%d) differs from expected (%d)."), float_representation, expected_float_format); return false; } /* Check integer format. */ integer_representation = parse_int (r, record->data, 24); if (r->integer_format == INTEGER_MSB_FIRST) expected_integer_format = 1; else if (r->integer_format == INTEGER_LSB_FIRST) expected_integer_format = 2; else NOT_REACHED (); if (integer_representation != expected_integer_format) sys_warn (r, record->pos, _("Integer format indicated by system file (%d) " "differs from expected (%d)."), integer_representation, expected_integer_format); return true; } /* Parses record type 7, subtype 4. */ static void parse_machine_float_info (struct sfm_reader *r, const struct sfm_extension_record *record) { double sysmis = parse_float (r, record->data, 0); double highest = parse_float (r, record->data, 8); double lowest = parse_float (r, record->data, 16); if (sysmis != SYSMIS) sys_warn (r, record->pos, _("File specifies unexpected value %g (%a) as %s, " "instead of %g (%a)."), sysmis, sysmis, "SYSMIS", SYSMIS, SYSMIS); if (highest != HIGHEST) sys_warn (r, record->pos, _("File specifies unexpected value %g (%a) as %s, " "instead of %g (%a)."), highest, highest, "HIGHEST", HIGHEST, HIGHEST); /* SPSS before version 21 used a unique value just bigger than SYSMIS as LOWEST. SPSS 21 uses SYSMIS for LOWEST, which is OK because LOWEST only appears in a context (missing values) where SYSMIS cannot. */ if (lowest != LOWEST && lowest != SYSMIS) sys_warn (r, record->pos, _("File specifies unexpected value %g (%a) as %s, " "instead of %g (%a) or %g (%a)."), lowest, lowest, "LOWEST", LOWEST, LOWEST, SYSMIS, SYSMIS); } /* Parses record type 7, subtype 10. */ static void parse_extra_product_info (struct sfm_reader *r, const struct sfm_extension_record *record, struct any_read_info *info) { struct text_record *text; text = open_text_record (r, record, true); info->product_ext = fix_line_ends (text_get_all (text)); close_text_record (r, text); } /* Parses record type 7, subtype 7 or 19. */ static void parse_mrsets (struct sfm_reader *r, const struct sfm_extension_record *record, size_t *allocated_mrsets) { struct text_record *text; text = open_text_record (r, record, false); for (;;) { struct sfm_mrset *mrset = NULL; size_t allocated_vars = 0; char delimiter = '4'; /* Skip extra line feeds if present. */ while (text_match (text, '\n')) continue; if (r->n_mrsets >= *allocated_mrsets) r->mrsets = pool_2nrealloc (r->pool, r->mrsets, allocated_mrsets, sizeof *r->mrsets); mrset = &r->mrsets[r->n_mrsets]; memset(mrset, 0, sizeof *mrset); mrset->name = text_get_token (text, ss_cstr ("="), NULL); if (mrset->name == NULL) break; if (text_match (text, 'C')) { mrset->type = MRSET_MC; if (!text_match (text, ' ')) { sys_warn (r, record->pos, _("Missing space following `%c' at offset %zu " "in MRSETS record."), 'C', text_pos (text)); break; } } else if (text_match (text, 'D')) { mrset->type = MRSET_MD; mrset->cat_source = MRSET_VARLABELS; } else if (text_match (text, 'E')) { char *number; mrset->type = MRSET_MD; mrset->cat_source = MRSET_COUNTEDVALUES; if (!text_match (text, ' ')) { sys_warn (r, record->pos, _("Missing space following `%c' at offset %zu " "in MRSETS record."), 'E', text_pos (text)); break; } number = text_get_token (text, ss_cstr (" "), NULL); if (!number) sys_warn (r, record->pos, _("Missing label source value " "following `E' at offset %zu in MRSETS record."), text_pos (text)); else if (!strcmp (number, "11")) mrset->label_from_var_label = true; else if (strcmp (number, "1")) sys_warn (r, record->pos, _("Unexpected label source value following `E' " "at offset %zu in MRSETS record."), text_pos (text)); } else { sys_warn (r, record->pos, _("Missing `C', `D', or `E' at offset %zu " "in MRSETS record."), text_pos (text)); break; } if (mrset->type == MRSET_MD) { mrset->counted = text_parse_counted_string (r, text); if (mrset->counted == NULL) break; } mrset->label = text_parse_counted_string (r, text); if (mrset->label == NULL) break; allocated_vars = 0; do { const char *var; var = text_get_token (text, ss_cstr (" \n"), &delimiter); if (var == NULL) { if (delimiter != '\n') sys_warn (r, record->pos, _("Missing new-line parsing variable names " "at offset %zu in MRSETS record."), text_pos (text)); break; } if (mrset->n_vars >= allocated_vars) mrset->vars = pool_2nrealloc (r->pool, mrset->vars, &allocated_vars, sizeof *mrset->vars); mrset->vars[mrset->n_vars++] = var; } while (delimiter != '\n'); r->n_mrsets++; } close_text_record (r, text); } static void decode_mrsets (struct sfm_reader *r, struct dictionary *dict) { const struct sfm_mrset *s; for (s = r->mrsets; s < &r->mrsets[r->n_mrsets]; s++) { struct stringi_set var_names; struct mrset *mrset; char *name; int width; size_t i; name = recode_string ("UTF-8", r->encoding, s->name, -1); if (!mrset_is_valid_name (name, dict_get_encoding (dict), false)) { sys_warn (r, -1, _("Invalid multiple response set name `%s'."), name); free (name); continue; } mrset = xzalloc (sizeof *mrset); mrset->name = name; mrset->type = s->type; mrset->cat_source = s->cat_source; mrset->label_from_var_label = s->label_from_var_label; if (s->label[0] != '\0') mrset->label = recode_string ("UTF-8", r->encoding, s->label, -1); stringi_set_init (&var_names); mrset->vars = xmalloc (s->n_vars * sizeof *mrset->vars); width = INT_MAX; for (i = 0; i < s->n_vars; i++) { struct variable *var; char *var_name; var_name = recode_string ("UTF-8", r->encoding, s->vars[i], -1); var = dict_lookup_var (dict, var_name); if (var == NULL) { free (var_name); continue; } if (!stringi_set_insert (&var_names, var_name)) { sys_warn (r, -1, _("MRSET %s contains duplicate variable name %s."), mrset->name, var_name); free (var_name); continue; } free (var_name); if (mrset->label == NULL && mrset->label_from_var_label && var_has_label (var)) mrset->label = xstrdup (var_get_label (var)); if (mrset->n_vars && var_get_type (var) != var_get_type (mrset->vars[0])) { sys_warn (r, -1, _("MRSET %s contains both string and " "numeric variables."), mrset->name); continue; } width = MIN (width, var_get_width (var)); mrset->vars[mrset->n_vars++] = var; } if (mrset->n_vars < 2) { if (mrset->n_vars == 0) sys_warn (r, -1, _("MRSET %s has no variables."), mrset->name); else sys_warn (r, -1, _("MRSET %s has only one variable."), mrset->name); mrset_destroy (mrset); stringi_set_destroy (&var_names); continue; } if (mrset->type == MRSET_MD) { mrset->width = width; value_init (&mrset->counted, width); if (width == 0) mrset->counted.f = c_strtod (s->counted, NULL); else value_copy_str_rpad (&mrset->counted, width, (const uint8_t *) s->counted, ' '); } dict_add_mrset (dict, mrset); stringi_set_destroy (&var_names); } } /* Read record type 7, subtype 11, which specifies how variables should be displayed in GUI environments. */ static void parse_display_parameters (struct sfm_reader *r, const struct sfm_extension_record *record, struct dictionary *dict) { bool includes_width; bool warned = false; size_t n_vars; size_t ofs; size_t i; n_vars = dict_get_var_cnt (dict); if (record->count == 3 * n_vars) includes_width = true; else if (record->count == 2 * n_vars) includes_width = false; else { sys_warn (r, record->pos, _("Extension 11 has bad count %u (for %zu variables)."), record->count, n_vars); return; } ofs = 0; for (i = 0; i < n_vars; ++i) { struct variable *v = dict_get_var (dict, i); int measure, width, align; measure = parse_int (r, record->data, ofs); ofs += 4; if (includes_width) { width = parse_int (r, record->data, ofs); ofs += 4; } else width = 0; align = parse_int (r, record->data, ofs); ofs += 4; /* SPSS sometimes seems to set variables' measure to zero. */ if (0 == measure) measure = 1; if (measure < 1 || measure > 3 || align < 0 || align > 2) { if (!warned) sys_warn (r, record->pos, _("Invalid variable display parameters for variable " "%zu (%s). Default parameters substituted."), i, var_get_name (v)); warned = true; continue; } var_set_measure (v, (measure == 1 ? MEASURE_NOMINAL : measure == 2 ? MEASURE_ORDINAL : MEASURE_SCALE)); var_set_alignment (v, (align == 0 ? ALIGN_LEFT : align == 1 ? ALIGN_RIGHT : ALIGN_CENTRE)); /* Older versions (SPSS 9.0) sometimes set the display width to zero. This causes confusion in the GUI, so only set the width if it is nonzero. */ if (width > 0) var_set_display_width (v, width); } } static void rename_var_and_save_short_names (struct sfm_reader *r, off_t pos, struct dictionary *dict, struct variable *var, const char *new_name) { size_t n_short_names; char **short_names; size_t i; /* Renaming a variable may clear its short names, but we want to retain them, so we save them and re-set them afterward. */ n_short_names = var_get_short_name_cnt (var); short_names = xnmalloc (n_short_names, sizeof *short_names); for (i = 0; i < n_short_names; i++) { const char *s = var_get_short_name (var, i); short_names[i] = s != NULL ? xstrdup (s) : NULL; } /* Set long name. */ if (!dict_try_rename_var (dict, var, new_name)) sys_warn (r, pos, _("Duplicate long variable name `%s'."), new_name); /* Restore short names. */ for (i = 0; i < n_short_names; i++) { var_set_short_name (var, i, short_names[i]); free (short_names[i]); } free (short_names); } /* Parses record type 7, subtype 13, which gives the long name that corresponds to each short name. Modifies variable names in DICT accordingly. */ static void parse_long_var_name_map (struct sfm_reader *r, const struct sfm_extension_record *record, struct dictionary *dict) { struct text_record *text; struct variable *var; char *long_name; if (record == NULL) { /* There are no long variable names. Use the short variable names, converted to lowercase, as the long variable names. */ size_t i; for (i = 0; i < dict_get_var_cnt (dict); i++) { struct variable *var = dict_get_var (dict, i); char *new_name; new_name = utf8_to_lower (var_get_name (var)); rename_var_and_save_short_names (r, -1, dict, var, new_name); free (new_name); } return; } /* Rename each of the variables, one by one. (In a correctly constructed system file, this cannot create any intermediate duplicate variable names, because all of the new variable names are longer than any of the old variable names and thus there cannot be any overlaps.) */ text = open_text_record (r, record, true); while (read_variable_to_value_pair (r, dict, text, &var, &long_name)) { /* Validate long name. */ if (!dict_id_is_valid (dict, long_name, false) || long_name[0] == '$' || long_name[0] == '#') { sys_warn (r, record->pos, _("Long variable mapping from %s to invalid " "variable name `%s'."), var_get_name (var), long_name); continue; } rename_var_and_save_short_names (r, record->pos, dict, var, long_name); } close_text_record (r, text); } /* Reads record type 7, subtype 14, which gives the real length of each very long string. Rearranges DICT accordingly. */ static bool parse_long_string_map (struct sfm_reader *r, const struct sfm_extension_record *record, struct dictionary *dict) { struct text_record *text; struct variable *var; char *length_s; text = open_text_record (r, record, true); while (read_variable_to_value_pair (r, dict, text, &var, &length_s)) { size_t idx = var_get_dict_index (var); long int length; int segment_cnt; int i; /* Get length. */ length = strtol (length_s, NULL, 10); if (length < 1 || length > MAX_STRING) { sys_warn (r, record->pos, _("%s listed as string of invalid length %s " "in very long string record."), var_get_name (var), length_s); continue; } /* Check segments. */ segment_cnt = sfm_width_to_segments (length); if (segment_cnt == 1) { sys_warn (r, record->pos, _("%s listed in very long string record with width %s, " "which requires only one segment."), var_get_name (var), length_s); continue; } if (idx + segment_cnt > dict_get_var_cnt (dict)) { sys_error (r, record->pos, _("Very long string %s overflows dictionary."), var_get_name (var)); return false; } /* Get the short names from the segments and check their lengths. */ for (i = 0; i < segment_cnt; i++) { struct variable *seg = dict_get_var (dict, idx + i); int alloc_width = sfm_segment_alloc_width (length, i); int width = var_get_width (seg); if (i > 0) var_set_short_name (var, i, var_get_short_name (seg, 0)); if (ROUND_UP (width, 8) != ROUND_UP (alloc_width, 8)) { sys_error (r, record->pos, _("Very long string with width %ld has segment %d " "of width %d (expected %d)."), length, i, width, alloc_width); return false; } } dict_delete_consecutive_vars (dict, idx + 1, segment_cnt - 1); var_set_width (var, length); } close_text_record (r, text); dict_compact_values (dict); return true; } #define MAX_LABEL_WARNINGS 5 /* Displays a warning for offset OFFSET in the file. */ static void value_label_warning (struct sfm_reader *r, off_t offset, int *n_label_warnings, const char *format, ...) { if (++*n_label_warnings > MAX_LABEL_WARNINGS) return; va_list args; va_start (args, format); sys_msg (r, offset, MW, format, args); va_end (args); } #define MAX_LABEL_WARNINGS 5 static void parse_one_value_label_set (struct sfm_reader *r, struct dictionary *dict, const struct sfm_var_record *var_recs, size_t n_var_recs, const struct sfm_value_label_record *record, int *n_label_warnings) { char **utf8_labels = pool_nmalloc (r->pool, record->n_labels, sizeof *utf8_labels); for (size_t i = 0; i < record->n_labels; i++) utf8_labels[i] = recode_string_pool ("UTF-8", dict_get_encoding (dict), record->labels[i].label, -1, r->pool); struct variable **vars = pool_nmalloc (r->pool, record->n_vars, sizeof *vars); unsigned int n_vars = 0; for (size_t i = 0; i < record->n_vars; i++) { int idx = record->vars[i]; if (idx < 1 || idx > n_var_recs) { value_label_warning ( r, record->pos, n_label_warnings, _("Value label variable index %d not in valid range 1...%zu."), idx, n_var_recs); continue; } const struct sfm_var_record *rec = &var_recs[idx - 1]; if (rec->var == NULL) { value_label_warning ( r, record->pos, n_label_warnings, _("Value label variable index %d " "refers to long string continuation."), idx); continue; } vars[n_vars++] = rec->var; } if (!n_vars) return; for (size_t i = 1; i < n_vars; i++) if (var_get_type (vars[i]) != var_get_type (vars[0])) { value_label_warning ( r, record->pos, n_label_warnings, _("Variables associated with value label are not all of " "identical type. Variable %s is %s, but variable " "%s is %s."), var_get_name (vars[0]), var_is_numeric (vars[0]) ? _("numeric") : _("string"), var_get_name (vars[i]), var_is_numeric (vars[i]) ? _("numeric") : _("string")); return; } for (size_t i = 0; i < n_vars; i++) { struct variable *var = vars[i]; int width = var_get_width (var); if (width > 8) { value_label_warning ( r, record->pos, n_label_warnings, _("Value labels may not be added to long string " "variables (e.g. %s) using records types 3 and 4."), var_get_name (var)); continue; } for (size_t j = 0; j < record->n_labels; j++) { struct sfm_value_label *label = &record->labels[j]; union value value; value_init (&value, width); if (width == 0) value.f = parse_float (r, label->value, 0); else memcpy (value.s, label->value, width); if (!var_add_value_label (var, &value, utf8_labels[j])) { if (r->written_by_readstat) { /* Ignore the problem. ReadStat is buggy and emits value labels whose values are longer than string variables' widths, that are identical in the actual width of the variable, e.g. both values "ABC123" and "ABC456" for a string variable with width 3. */ } else if (var_is_numeric (var)) value_label_warning (r, record->pos, n_label_warnings, _("Duplicate value label for %g on %s."), value.f, var_get_name (var)); else value_label_warning ( r, record->pos, n_label_warnings, _("Duplicate value label for `%.*s' on %s."), width, value.s, var_get_name (var)); } value_destroy (&value, width); } } pool_free (r->pool, vars); for (size_t i = 0; i < record->n_labels; i++) pool_free (r->pool, utf8_labels[i]); pool_free (r->pool, utf8_labels); } static void parse_value_labels (struct sfm_reader *r, struct dictionary *dict) { int n_label_warnings = 0; for (size_t i = 0; i < r->n_labels; i++) parse_one_value_label_set (r, dict, r->vars, r->n_vars, &r->labels[i], &n_label_warnings); if (n_label_warnings > MAX_LABEL_WARNINGS) sys_warn (r, -1, _("Suppressed %d additional warnings for value labels."), n_label_warnings - MAX_LABEL_WARNINGS); } static struct variable * parse_weight_var (struct sfm_reader *r, const struct sfm_var_record *var_recs, size_t n_var_recs, int idx) { off_t offset = 76; /* Offset to variable index in header. */ if (idx < 1 || idx > n_var_recs) { sys_warn (r, offset, _("Weight variable index %d not in valid range 1...%zu. " "Treating file as unweighted."), idx, n_var_recs); return NULL; } const struct sfm_var_record *rec = &var_recs[idx - 1]; if (rec->var == NULL) { sys_warn (r, offset, _("Weight variable index %d refers to long string " "continuation. Treating file as unweighted."), idx); return NULL; } struct variable *weight_var = rec->var; if (!var_is_numeric (weight_var)) { sys_warn (r, offset, _("Ignoring string variable `%s' set " "as weighting variable."), var_get_name (weight_var)); return NULL; } return weight_var; } /* Parses a set of custom attributes from TEXT into ATTRS. ATTRS may be a null pointer, in which case the attributes are read but discarded. */ static void parse_attributes (struct sfm_reader *r, struct text_record *text, struct attrset *attrs) { do { struct attribute *attr; char *key; int index; /* Parse the key. */ key = text_get_token (text, ss_cstr ("("), NULL); if (key == NULL) return; attr = attribute_create (key); for (index = 1; ; index++) { /* Parse the value. */ char *value; size_t length; value = text_get_token (text, ss_cstr ("\n"), NULL); if (value == NULL) { text_warn (r, text, _("Error parsing attribute value %s[%d]."), key, index); break; } length = strlen (value); if (length >= 2 && value[0] == '\'' && value[length - 1] == '\'') { value[length - 1] = '\0'; attribute_add_value (attr, value + 1); } else { text_warn (r, text, _("Attribute value %s[%d] is not quoted: %s."), key, index, value); attribute_add_value (attr, value); } /* Was this the last value for this attribute? */ if (text_match (text, ')')) break; } if (attrs != NULL && attribute_get_n_values (attr) > 0) { if (!attrset_try_add (attrs, attr)) { text_warn (r, text, _("Duplicate attribute %s."), attribute_get_name (attr)); attribute_destroy (attr); } } else attribute_destroy (attr); } while (!text_match (text, '/')); } /* Reads record type 7, subtype 17, which lists custom attributes on the data file. */ static void parse_data_file_attributes (struct sfm_reader *r, const struct sfm_extension_record *record, struct dictionary *dict) { struct text_record *text = open_text_record (r, record, true); parse_attributes (r, text, dict_get_attributes (dict)); close_text_record (r, text); } /* Parses record type 7, subtype 18, which lists custom attributes on individual variables. */ static void parse_variable_attributes (struct sfm_reader *r, const struct sfm_extension_record *record, struct dictionary *dict) { struct text_record *text; struct variable *var; text = open_text_record (r, record, true); while (text_read_variable_name (r, dict, text, ss_cstr (":"), &var)) parse_attributes (r, text, var != NULL ? var_get_attributes (var) : NULL); close_text_record (r, text); } static void assign_variable_roles (struct sfm_reader *r, struct dictionary *dict) { size_t n_warnings = 0; size_t i; for (i = 0; i < dict_get_var_cnt (dict); i++) { struct variable *var = dict_get_var (dict, i); struct attrset *attrs = var_get_attributes (var); const struct attribute *attr = attrset_lookup (attrs, "$@Role"); if (attr != NULL && attribute_get_n_values (attr) > 0) { int value = atoi (attribute_get_value (attr, 0)); enum var_role role; switch (value) { case 0: role = ROLE_INPUT; break; case 1: role = ROLE_TARGET; break; case 2: role = ROLE_BOTH; break; case 3: role = ROLE_NONE; break; case 4: role = ROLE_PARTITION; break; case 5: role = ROLE_SPLIT; break; default: role = ROLE_INPUT; if (n_warnings++ == 0) sys_warn (r, -1, _("Invalid role for variable %s."), var_get_name (var)); } var_set_role (var, role); } } if (n_warnings > 1) sys_warn (r, -1, _("%zu other variables had invalid roles."), n_warnings - 1); } static bool check_overflow (struct sfm_reader *r, const struct sfm_extension_record *record, size_t ofs, size_t length) { size_t end = record->size * record->count; if (length >= end || ofs + length > end) { sys_warn (r, record->pos + end, _("Extension record subtype %d ends unexpectedly."), record->subtype); return false; } return true; } static void parse_long_string_value_labels (struct sfm_reader *r, const struct sfm_extension_record *record, struct dictionary *dict) { const char *dict_encoding = dict_get_encoding (dict); size_t end = record->size * record->count; size_t ofs = 0; while (ofs < end) { char *var_name; size_t n_labels, i; struct variable *var; union value value; int var_name_len; int width; /* Parse variable name length. */ if (!check_overflow (r, record, ofs, 4)) return; var_name_len = parse_int (r, record->data, ofs); ofs += 4; /* Parse variable name, width, and number of labels. */ if (!check_overflow (r, record, ofs, var_name_len) || !check_overflow (r, record, ofs, var_name_len + 8)) return; var_name = recode_string_pool ("UTF-8", dict_encoding, (const char *) record->data + ofs, var_name_len, r->pool); width = parse_int (r, record->data, ofs + var_name_len); n_labels = parse_int (r, record->data, ofs + var_name_len + 4); ofs += var_name_len + 8; /* Look up 'var' and validate. */ var = dict_lookup_var (dict, var_name); if (var == NULL) sys_warn (r, record->pos + ofs, _("Ignoring long string value label record for " "unknown variable %s."), var_name); else if (var_is_numeric (var)) { sys_warn (r, record->pos + ofs, _("Ignoring long string value label record for " "numeric variable %s."), var_name); var = NULL; } else if (width != var_get_width (var)) { sys_warn (r, record->pos + ofs, _("Ignoring long string value label record for variable " "%s because the record's width (%d) does not match the " "variable's width (%d)."), var_name, width, var_get_width (var)); var = NULL; } /* Parse values. */ value_init_pool (r->pool, &value, width); for (i = 0; i < n_labels; i++) { size_t value_length, label_length; bool skip = var == NULL; /* Parse value length. */ if (!check_overflow (r, record, ofs, 4)) return; value_length = parse_int (r, record->data, ofs); ofs += 4; /* Parse value. */ if (!check_overflow (r, record, ofs, value_length)) return; if (!skip) { if (value_length == width) memcpy (value.s, (const uint8_t *) record->data + ofs, width); else { sys_warn (r, record->pos + ofs, _("Ignoring long string value label %zu for " "variable %s, with width %d, that has bad value " "width %zu."), i, var_get_name (var), width, value_length); skip = true; } } ofs += value_length; /* Parse label length. */ if (!check_overflow (r, record, ofs, 4)) return; label_length = parse_int (r, record->data, ofs); ofs += 4; /* Parse label. */ if (!check_overflow (r, record, ofs, label_length)) return; if (!skip) { char *label; label = recode_string_pool ("UTF-8", dict_encoding, (const char *) record->data + ofs, label_length, r->pool); if (!var_add_value_label (var, &value, label)) sys_warn (r, record->pos + ofs, _("Duplicate value label for `%.*s' on %s."), width, value.s, var_get_name (var)); pool_free (r->pool, label); } ofs += label_length; } } } static void parse_long_string_missing_values (struct sfm_reader *r, const struct sfm_extension_record *record, struct dictionary *dict) { const char *dict_encoding = dict_get_encoding (dict); size_t end = record->size * record->count; size_t ofs = 0; while (ofs < end) { struct missing_values mv; char *var_name; struct variable *var; int n_missing_values; int var_name_len; size_t i; /* Parse variable name length. */ if (!check_overflow (r, record, ofs, 4)) return; var_name_len = parse_int (r, record->data, ofs); ofs += 4; /* Parse variable name. */ if (!check_overflow (r, record, ofs, var_name_len) || !check_overflow (r, record, ofs, var_name_len + 1)) return; var_name = recode_string_pool ("UTF-8", dict_encoding, (const char *) record->data + ofs, var_name_len, r->pool); ofs += var_name_len; /* Parse number of missing values. */ n_missing_values = ((const uint8_t *) record->data)[ofs]; if (n_missing_values < 1 || n_missing_values > 3) sys_warn (r, record->pos + ofs, _("Long string missing values record says variable %s " "has %d missing values, but only 1 to 3 missing values " "are allowed."), var_name, n_missing_values); ofs++; /* Look up 'var' and validate. */ var = dict_lookup_var (dict, var_name); if (var == NULL) sys_warn (r, record->pos + ofs, _("Ignoring long string missing value record for " "unknown variable %s."), var_name); else if (var_is_numeric (var)) { sys_warn (r, record->pos + ofs, _("Ignoring long string missing value record for " "numeric variable %s."), var_name); var = NULL; } /* Parse values. */ mv_init_pool (r->pool, &mv, var ? var_get_width (var) : 8); for (i = 0; i < n_missing_values; i++) { size_t value_length; /* Parse value length. */ if (!check_overflow (r, record, ofs, 4)) return; value_length = parse_int (r, record->data, ofs); ofs += 4; /* Parse value. */ if (!check_overflow (r, record, ofs, value_length)) return; if (var != NULL && i < 3 && !mv_add_str (&mv, (const uint8_t *) record->data + ofs, value_length)) sys_warn (r, record->pos + ofs, _("Ignoring long string missing value %zu for variable " "%s, with width %d, that has bad value width %zu."), i, var_get_name (var), var_get_width (var), value_length); ofs += value_length; } if (var != NULL) var_set_missing_values (var, &mv); } } /* Case reader. */ static void partial_record (struct sfm_reader *); static void read_error (struct casereader *, const struct sfm_reader *); static bool read_case_number (struct sfm_reader *, double *); static int read_case_string (struct sfm_reader *, uint8_t *, size_t); static int read_opcode (struct sfm_reader *); static bool read_compressed_number (struct sfm_reader *, double *); static int read_compressed_string (struct sfm_reader *, uint8_t *); static int read_whole_strings (struct sfm_reader *, uint8_t *, size_t); static bool skip_whole_strings (struct sfm_reader *, size_t); /* Reads and returns one case from READER's file. Returns a null pointer if not successful. */ static struct ccase * sys_file_casereader_read (struct casereader *reader, void *r_) { struct sfm_reader *r = r_; struct ccase *c; int retval; int i; if (r->error || !r->sfm_var_cnt) return NULL; c = case_create (r->proto); for (i = 0; i < r->sfm_var_cnt; i++) { struct sfm_var *sv = &r->sfm_vars[i]; union value *v = case_data_rw_idx (c, sv->case_index); if (sv->var_width == 0) retval = read_case_number (r, &v->f); else { retval = read_case_string (r, v->s + sv->offset, sv->segment_width); if (retval == 1) { retval = skip_whole_strings (r, ROUND_DOWN (sv->padding, 8)); if (retval == 0) sys_error (r, r->pos, _("File ends in partial string value.")); } } if (retval != 1) goto eof; } return c; eof: if (i != 0) partial_record (r); if (r->case_cnt != -1) read_error (reader, r); case_unref (c); return NULL; } /* Issues an error that R ends in a partial record. */ static void partial_record (struct sfm_reader *r) { sys_error (r, r->pos, _("File ends in partial case.")); } /* Issues an error that an unspecified error occurred SFM, and marks R tainted. */ static void read_error (struct casereader *r, const struct sfm_reader *sfm) { msg (ME, _("Error reading case from file %s."), fh_get_name (sfm->fh)); casereader_force_error (r); } /* Reads a number from R and stores its value in *D. If R is compressed, reads a compressed number; otherwise, reads a number in the regular way. Returns true if successful, false if end of file is reached immediately. */ static bool read_case_number (struct sfm_reader *r, double *d) { if (r->compression == ANY_COMP_NONE) { uint8_t number[8]; if (!try_read_bytes (r, number, sizeof number)) return false; float_convert (r->float_format, number, FLOAT_NATIVE_DOUBLE, d); return true; } else return read_compressed_number (r, d); } /* Reads LENGTH string bytes from R into S. Always reads a multiple of 8 bytes; if LENGTH is not a multiple of 8, then extra bytes are read and discarded without being written to S. Reads compressed strings if S is compressed. Returns 1 if successful, 0 if end of file is reached immediately, or -1 for some kind of error. */ static int read_case_string (struct sfm_reader *r, uint8_t *s, size_t length) { size_t whole = ROUND_DOWN (length, 8); size_t partial = length % 8; if (whole) { int retval = read_whole_strings (r, s, whole); if (retval != 1) return retval; } if (partial) { uint8_t bounce[8]; int retval = read_whole_strings (r, bounce, sizeof bounce); if (retval == -1) return -1; else if (!retval) { if (whole) { partial_record (r); return -1; } return 0; } memcpy (s + whole, bounce, partial); } return 1; } /* Reads and returns the next compression opcode from R. */ static int read_opcode (struct sfm_reader *r) { assert (r->compression != ANY_COMP_NONE); for (;;) { int opcode; if (r->opcode_idx >= sizeof r->opcodes) { int retval = try_read_compressed_bytes (r, r->opcodes, sizeof r->opcodes); if (retval != 1) return -1; r->opcode_idx = 0; } opcode = r->opcodes[r->opcode_idx++]; if (opcode != 0) return opcode; } } /* Reads a compressed number from R and stores its value in D. Returns true if successful, false if end of file is reached immediately. */ static bool read_compressed_number (struct sfm_reader *r, double *d) { int opcode = read_opcode (r); switch (opcode) { case -1: case 252: return false; case 253: return read_compressed_float (r, d); case 254: float_convert (r->float_format, " ", FLOAT_NATIVE_DOUBLE, d); if (!r->corruption_warning) { r->corruption_warning = true; sys_warn (r, r->pos, _("Possible compressed data corruption: " "compressed spaces appear in numeric field.")); } break; case 255: *d = SYSMIS; break; default: *d = opcode - r->bias; break; } return true; } /* Reads a compressed 8-byte string segment from R and stores it in DST. */ static int read_compressed_string (struct sfm_reader *r, uint8_t *dst) { int opcode; int retval; opcode = read_opcode (r); switch (opcode) { case -1: case 252: return 0; case 253: retval = read_compressed_bytes (r, dst, 8); return retval == 1 ? 1 : -1; case 254: memset (dst, ' ', 8); return 1; default: { double value = opcode - r->bias; float_convert (FLOAT_NATIVE_DOUBLE, &value, r->float_format, dst); if (value == 0.0) { /* This has actually been seen "in the wild". The submitter of the file that showed that the contents decoded as spaces, but they were at the end of the field so it's possible that the null bytes just acted as null terminators. */ } else if (!r->corruption_warning) { r->corruption_warning = true; sys_warn (r, r->pos, _("Possible compressed data corruption: " "string contains compressed integer (opcode %d)."), opcode); } } return 1; } } /* Reads LENGTH string bytes from R into S. LENGTH must be a multiple of 8. Reads compressed strings if S is compressed. Returns 1 if successful, 0 if end of file is reached immediately, or -1 for some kind of error. */ static int read_whole_strings (struct sfm_reader *r, uint8_t *s, size_t length) { assert (length % 8 == 0); if (r->compression == ANY_COMP_NONE) return try_read_bytes (r, s, length); else { size_t ofs; for (ofs = 0; ofs < length; ofs += 8) { int retval = read_compressed_string (r, s + ofs); if (retval != 1) { if (ofs != 0) { partial_record (r); return -1; } return retval; } } return 1; } } /* Skips LENGTH string bytes from R. LENGTH must be a multiple of 8. (LENGTH is also limited to 1024, but that's only because the current caller never needs more than that many bytes.) Returns true if successful, false if end of file is reached immediately. */ static bool skip_whole_strings (struct sfm_reader *r, size_t length) { uint8_t buffer[1024]; assert (length < sizeof buffer); return read_whole_strings (r, buffer, length); } /* Helpers for reading records that contain structured text strings. */ /* Maximum number of warnings to issue for a single text record. */ #define MAX_TEXT_WARNINGS 5 /* State. */ struct text_record { struct substring buffer; /* Record contents. */ off_t start; /* Starting offset in file. */ size_t pos; /* Current position in buffer. */ int n_warnings; /* Number of warnings issued or suppressed. */ bool recoded; /* Recoded into UTF-8? */ }; static struct text_record * open_text_record (struct sfm_reader *r, const struct sfm_extension_record *record, bool recode_to_utf8) { struct text_record *text; struct substring raw; text = pool_alloc (r->pool, sizeof *text); raw = ss_buffer (record->data, record->size * record->count); text->start = record->pos; text->buffer = (recode_to_utf8 ? recode_substring_pool ("UTF-8", r->encoding, raw, r->pool) : raw); text->pos = 0; text->n_warnings = 0; text->recoded = recode_to_utf8; return text; } /* Closes TEXT, frees its storage, and issues a final warning about suppressed warnings if necessary. */ static void close_text_record (struct sfm_reader *r, struct text_record *text) { if (text->n_warnings > MAX_TEXT_WARNINGS) sys_warn (r, -1, _("Suppressed %d additional related warnings."), text->n_warnings - MAX_TEXT_WARNINGS); if (text->recoded) pool_free (r->pool, ss_data (text->buffer)); } /* Reads a variable=value pair from TEXT. Looks up the variable in DICT and stores it into *VAR. Stores a null-terminated value into *VALUE. */ static bool read_variable_to_value_pair (struct sfm_reader *r, struct dictionary *dict, struct text_record *text, struct variable **var, char **value) { for (;;) { if (!text_read_short_name (r, dict, text, ss_cstr ("="), var)) return false; *value = text_get_token (text, ss_buffer ("\t\0", 2), NULL); if (*value == NULL) return false; text->pos += ss_span (ss_substr (text->buffer, text->pos, SIZE_MAX), ss_buffer ("\t\0", 2)); if (*var != NULL) return true; } } static bool text_read_variable_name (struct sfm_reader *r, struct dictionary *dict, struct text_record *text, struct substring delimiters, struct variable **var) { char *name; name = text_get_token (text, delimiters, NULL); if (name == NULL) return false; *var = dict_lookup_var (dict, name); if (*var != NULL) return true; text_warn (r, text, _("Dictionary record refers to unknown variable %s."), name); return false; } static bool text_read_short_name (struct sfm_reader *r, struct dictionary *dict, struct text_record *text, struct substring delimiters, struct variable **var) { char *short_name = text_get_token (text, delimiters, NULL); if (short_name == NULL) return false; *var = dict_lookup_var (dict, short_name); if (*var == NULL) text_warn (r, text, _("Dictionary record refers to unknown variable %s."), short_name); return true; } /* Displays a warning for the current file position, limiting the number to MAX_TEXT_WARNINGS for TEXT. */ static void text_warn (struct sfm_reader *r, struct text_record *text, const char *format, ...) { if (text->n_warnings++ < MAX_TEXT_WARNINGS) { va_list args; va_start (args, format); sys_msg (r, text->start + text->pos, MW, format, args); va_end (args); } } static char * text_get_token (struct text_record *text, struct substring delimiters, char *delimiter) { struct substring token; char *end; if (!ss_tokenize (text->buffer, delimiters, &text->pos, &token)) { if (delimiter != NULL) *delimiter = ss_data (text->buffer)[text->pos-1]; return NULL; } end = &ss_data (token)[ss_length (token)]; if (delimiter != NULL) *delimiter = *end; *end = '\0'; return ss_data (token); } /* Reads a integer value expressed in decimal, then a space, then a string that consists of exactly as many bytes as specified by the integer, then a space, from TEXT. Returns the string, null-terminated, as a subset of TEXT's buffer (so the caller should not free the string). */ static const char * text_parse_counted_string (struct sfm_reader *r, struct text_record *text) { size_t start; size_t n; char *s; start = text->pos; n = 0; while (text->pos < text->buffer.length) { int c = text->buffer.string[text->pos]; if (c < '0' || c > '9') break; n = (n * 10) + (c - '0'); text->pos++; } if (text->pos >= text->buffer.length || start == text->pos) { sys_warn (r, text->start, _("Expecting digit at offset %zu in MRSETS record."), text->pos); return NULL; } if (!text_match (text, ' ')) { sys_warn (r, text->start, _("Expecting space at offset %zu in MRSETS record."), text->pos); return NULL; } if (text->pos + n > text->buffer.length) { sys_warn (r, text->start, _("%zu-byte string starting at offset %zu " "exceeds record length %zu."), n, text->pos, text->buffer.length); return NULL; } s = &text->buffer.string[text->pos]; if (s[n] != ' ') { sys_warn (r, text->start, _("Expecting space at offset %zu following %zu-byte string."), text->pos + n, n); return NULL; } s[n] = '\0'; text->pos += n + 1; return s; } static bool text_match (struct text_record *text, char c) { if (text->pos >= text->buffer.length) return false; if (text->buffer.string[text->pos] == c) { text->pos++; return true; } else return false; } /* Returns the current byte offset (as converted to UTF-8, if it was converted) inside the TEXT's string. */ static size_t text_pos (const struct text_record *text) { return text->pos; } static const char * text_get_all (const struct text_record *text) { return text->buffer.string; } /* Messages. */ /* Displays a corruption message. */ static void sys_msg (struct sfm_reader *r, off_t offset, int class, const char *format, va_list args) { struct string text; ds_init_empty (&text); if (offset >= 0) ds_put_format (&text, _("`%s' near offset 0x%llx: "), fh_get_file_name (r->fh), (long long int) offset); else ds_put_format (&text, _("`%s': "), fh_get_file_name (r->fh)); ds_put_vformat (&text, format, args); struct msg m = { .category = msg_class_to_category (class), .severity = msg_class_to_severity (class), .text = ds_cstr (&text), }; msg_emit (&m); } /* Displays a warning for offset OFFSET in the file. */ static void sys_warn (struct sfm_reader *r, off_t offset, const char *format, ...) { va_list args; va_start (args, format); sys_msg (r, offset, MW, format, args); va_end (args); } /* Displays an error for the current file position and marks it as in an error state. */ static void sys_error (struct sfm_reader *r, off_t offset, const char *format, ...) { va_list args; va_start (args, format); sys_msg (r, offset, ME, format, args); va_end (args); r->error = true; } /* Reads BYTE_CNT bytes into BUF. Returns 1 if exactly BYTE_CNT bytes are successfully read. Returns -1 if an I/O error or a partial read occurs. Returns 0 for an immediate end-of-file and, if EOF_IS_OK is false, reports an error. */ static inline int read_bytes_internal (struct sfm_reader *r, bool eof_is_ok, void *buf, size_t byte_cnt) { size_t bytes_read = fread (buf, 1, byte_cnt, r->file); r->pos += bytes_read; if (bytes_read == byte_cnt) return 1; else if (ferror (r->file)) { sys_error (r, r->pos, _("System error: %s."), strerror (errno)); return -1; } else if (!eof_is_ok || bytes_read != 0) { sys_error (r, r->pos, _("Unexpected end of file.")); return -1; } else return 0; } /* Reads BYTE_CNT into BUF. Returns true if successful. Returns false upon I/O error or if end-of-file is encountered. */ static bool read_bytes (struct sfm_reader *r, void *buf, size_t byte_cnt) { return read_bytes_internal (r, false, buf, byte_cnt) == 1; } /* Reads BYTE_CNT bytes into BUF. Returns 1 if exactly BYTE_CNT bytes are successfully read. Returns 0 if an immediate end-of-file is encountered. Returns -1 if an I/O error or a partial read occurs. */ static int try_read_bytes (struct sfm_reader *r, void *buf, size_t byte_cnt) { return read_bytes_internal (r, true, buf, byte_cnt); } /* Reads a 32-bit signed integer from R and stores its value in host format in *X. Returns true if successful, otherwise false. */ static bool read_int (struct sfm_reader *r, int *x) { uint8_t integer[4]; if (read_bytes (r, integer, sizeof integer) != 1) return false; *x = integer_get (r->integer_format, integer, sizeof integer); return true; } static bool read_uint (struct sfm_reader *r, unsigned int *x) { bool ok; int y; ok = read_int (r, &y); *x = y; return ok; } /* Reads a 64-bit signed integer from R and returns its value in host format. */ static bool read_int64 (struct sfm_reader *r, long long int *x) { uint8_t integer[8]; if (read_bytes (r, integer, sizeof integer) != 1) return false; *x = integer_get (r->integer_format, integer, sizeof integer); return true; } /* Reads a 64-bit signed integer from R and returns its value in host format. */ static bool read_uint64 (struct sfm_reader *r, unsigned long long int *x) { long long int y; bool ok; ok = read_int64 (r, &y); *x = y; return ok; } static int parse_int (const struct sfm_reader *r, const void *data, size_t ofs) { return integer_get (r->integer_format, (const uint8_t *) data + ofs, 4); } static double parse_float (const struct sfm_reader *r, const void *data, size_t ofs) { return float_get_double (r->float_format, (const uint8_t *) data + ofs); } /* Reads exactly SIZE - 1 bytes into BUFFER and stores a null byte into BUFFER[SIZE - 1]. */ static bool read_string (struct sfm_reader *r, char *buffer, size_t size) { bool ok; assert (size > 0); ok = read_bytes (r, buffer, size - 1); if (ok) buffer[size - 1] = '\0'; return ok; } /* Skips BYTES bytes forward in R. */ static bool skip_bytes (struct sfm_reader *r, size_t bytes) { while (bytes > 0) { char buffer[1024]; size_t chunk = MIN (sizeof buffer, bytes); if (!read_bytes (r, buffer, chunk)) return false; bytes -= chunk; } return true; } /* Returns a malloc()'d copy of S in which all lone CRs and CR LF pairs have been replaced by LFs. (A product that identifies itself as VOXCO INTERVIEWER 4.3 produces system files that use CR-only line ends in the file label and extra product info.) */ static char * fix_line_ends (const char *s) { char *dst, *d; d = dst = xmalloc (strlen (s) + 1); while (*s != '\0') { if (*s == '\r') { s++; if (*s == '\n') s++; *d++ = '\n'; } else *d++ = *s++; } *d = '\0'; return dst; } static bool read_ztrailer (struct sfm_reader *r, long long int zheader_ofs, long long int ztrailer_len); static void * zalloc (voidpf pool_, uInt items, uInt size) { struct pool *pool = pool_; return (!size || xalloc_oversized (items, size) ? Z_NULL : pool_malloc (pool, items * size)); } static void zfree (voidpf pool_, voidpf address) { struct pool *pool = pool_; pool_free (pool, address); } static bool read_zheader (struct sfm_reader *r) { off_t pos = r->pos; long long int zheader_ofs; long long int ztrailer_ofs; long long int ztrailer_len; if (!read_int64 (r, &zheader_ofs) || !read_int64 (r, &ztrailer_ofs) || !read_int64 (r, &ztrailer_len)) return false; if (zheader_ofs != pos) { sys_error (r, pos, _("Wrong ZLIB data header offset %#llx " "(expected %#llx)."), zheader_ofs, (long long int) pos); return false; } if (ztrailer_ofs < r->pos) { sys_error (r, pos, _("Impossible ZLIB trailer offset 0x%llx."), ztrailer_ofs); return false; } if (ztrailer_len < 24 || ztrailer_len % 24) { sys_error (r, pos, _("Invalid ZLIB trailer length %lld."), ztrailer_len); return false; } r->ztrailer_ofs = ztrailer_ofs; if (!read_ztrailer (r, zheader_ofs, ztrailer_len)) return false; if (r->zin_buf == NULL) { r->zin_buf = pool_malloc (r->pool, ZIN_BUF_SIZE); r->zout_buf = pool_malloc (r->pool, ZOUT_BUF_SIZE); r->zstream.next_in = NULL; r->zstream.avail_in = 0; } r->zstream.zalloc = zalloc; r->zstream.zfree = zfree; r->zstream.opaque = r->pool; return open_zstream (r); } static void seek (struct sfm_reader *r, off_t offset) { if (fseeko (r->file, offset, SEEK_SET)) sys_error (r, 0, _("%s: seek failed (%s)."), fh_get_file_name (r->fh), strerror (errno)); r->pos = offset; } /* Performs some additional consistency checks on the ZLIB compressed data trailer. */ static bool read_ztrailer (struct sfm_reader *r, long long int zheader_ofs, long long int ztrailer_len) { long long int expected_uncmp_ofs; long long int expected_cmp_ofs; long long int bias; long long int zero; unsigned int block_size; unsigned int n_blocks; unsigned int i; struct stat s; if (fstat (fileno (r->file), &s)) { sys_error (r, 0, _("%s: stat failed (%s)."), fh_get_file_name (r->fh), strerror (errno)); return false; } if (!S_ISREG (s.st_mode)) { /* We can't seek to the trailer and then back to the data in this file, so skip doing extra checks. */ return true; } if (r->ztrailer_ofs + ztrailer_len != s.st_size) sys_warn (r, r->pos, _("End of ZLIB trailer (0x%llx) is not file size (0x%llx)."), r->ztrailer_ofs + ztrailer_len, (long long int) s.st_size); seek (r, r->ztrailer_ofs); /* Read fixed header from ZLIB data trailer. */ if (!read_int64 (r, &bias)) return false; if (-bias != r->bias) { sys_error (r, r->pos, _("ZLIB trailer bias (%lld) differs from " "file header bias (%.2f)."), -bias, r->bias); return false; } if (!read_int64 (r, &zero)) return false; if (zero != 0) sys_warn (r, r->pos, _("ZLIB trailer \"zero\" field has nonzero value %lld."), zero); if (!read_uint (r, &block_size)) return false; if (block_size != ZBLOCK_SIZE) sys_warn (r, r->pos, _("ZLIB trailer specifies unexpected %u-byte block size."), block_size); if (!read_uint (r, &n_blocks)) return false; if (n_blocks != (ztrailer_len - 24) / 24) { sys_error (r, r->pos, _("%lld-byte ZLIB trailer specifies %u data blocks (expected " "%lld)."), ztrailer_len, n_blocks, (ztrailer_len - 24) / 24); return false; } expected_uncmp_ofs = zheader_ofs; expected_cmp_ofs = zheader_ofs + 24; for (i = 0; i < n_blocks; i++) { off_t desc_ofs = r->pos; unsigned long long int uncompressed_ofs; unsigned long long int compressed_ofs; unsigned int uncompressed_size; unsigned int compressed_size; if (!read_uint64 (r, &uncompressed_ofs) || !read_uint64 (r, &compressed_ofs) || !read_uint (r, &uncompressed_size) || !read_uint (r, &compressed_size)) return false; if (uncompressed_ofs != expected_uncmp_ofs) { sys_error (r, desc_ofs, _("ZLIB block descriptor %u reported uncompressed data " "offset %#llx, when %#llx was expected."), i, uncompressed_ofs, expected_uncmp_ofs); return false; } if (compressed_ofs != expected_cmp_ofs) { sys_error (r, desc_ofs, _("ZLIB block descriptor %u reported compressed data " "offset %#llx, when %#llx was expected."), i, compressed_ofs, expected_cmp_ofs); return false; } if (i < n_blocks - 1) { if (uncompressed_size != block_size) sys_warn (r, desc_ofs, _("ZLIB block descriptor %u reported block size %#x, " "when %#x was expected."), i, uncompressed_size, block_size); } else { if (uncompressed_size > block_size) sys_warn (r, desc_ofs, _("ZLIB block descriptor %u reported block size %#x, " "when at most %#x was expected."), i, uncompressed_size, block_size); } /* http://www.zlib.net/zlib_tech.html says that the maximum expansion from compression, with worst-case parameters, is 13.5% plus 11 bytes. This code checks for an expansion of more than 14.3% plus 11 bytes. */ if (compressed_size > uncompressed_size + uncompressed_size / 7 + 11) { sys_error (r, desc_ofs, _("ZLIB block descriptor %u reports compressed size %u " "and uncompressed size %u."), i, compressed_size, uncompressed_size); return false; } expected_uncmp_ofs += uncompressed_size; expected_cmp_ofs += compressed_size; } if (expected_cmp_ofs != r->ztrailer_ofs) { sys_error (r, r->pos, _("ZLIB trailer is at offset %#llx but %#llx " "would be expected from block descriptors."), r->ztrailer_ofs, expected_cmp_ofs); return false; } seek (r, zheader_ofs + 24); return true; } static bool open_zstream (struct sfm_reader *r) { int error; r->zout_pos = r->zout_end = 0; error = inflateInit (&r->zstream); if (error != Z_OK) { sys_error (r, r->pos, _("ZLIB initialization failed (%s)."), r->zstream.msg); return false; } return true; } static bool close_zstream (struct sfm_reader *r) { int error; error = inflateEnd (&r->zstream); if (error != Z_OK) { sys_error (r, r->pos, _("Inconsistency at end of ZLIB stream (%s)."), r->zstream.msg); return false; } return true; } static int read_bytes_zlib (struct sfm_reader *r, void *buf_, size_t byte_cnt) { uint8_t *buf = buf_; if (byte_cnt == 0) return 1; for (;;) { int error; /* Use already inflated data if there is any. */ if (r->zout_pos < r->zout_end) { unsigned int n = MIN (byte_cnt, r->zout_end - r->zout_pos); memcpy (buf, &r->zout_buf[r->zout_pos], n); r->zout_pos += n; byte_cnt -= n; buf += n; if (byte_cnt == 0) return 1; } /* We need to inflate some more data. Get some more input data if we don't have any. */ if (r->zstream.avail_in == 0) { unsigned int n = MIN (ZIN_BUF_SIZE, r->ztrailer_ofs - r->pos); if (n == 0) return 0; else { int retval = try_read_bytes (r, r->zin_buf, n); if (retval != 1) return retval; r->zstream.avail_in = n; r->zstream.next_in = r->zin_buf; } } /* Inflate the (remaining) input data. */ r->zstream.avail_out = ZOUT_BUF_SIZE; r->zstream.next_out = r->zout_buf; error = inflate (&r->zstream, Z_SYNC_FLUSH); r->zout_pos = 0; r->zout_end = r->zstream.next_out - r->zout_buf; if (r->zout_end == 0) { if (error != Z_STREAM_END) { sys_error (r, r->pos, _("ZLIB stream inconsistency (%s)."), r->zstream.msg); return -1; } else if (!close_zstream (r) || !open_zstream (r)) return -1; } else { /* Process the output data and ignore 'error' for now. ZLIB will present it to us again on the next inflate() call. */ } } } static int read_compressed_bytes (struct sfm_reader *r, void *buf, size_t byte_cnt) { if (r->compression == ANY_COMP_SIMPLE) return read_bytes (r, buf, byte_cnt); else { int retval = read_bytes_zlib (r, buf, byte_cnt); if (retval == 0) sys_error (r, r->pos, _("Unexpected end of ZLIB compressed data.")); return retval; } } static int try_read_compressed_bytes (struct sfm_reader *r, void *buf, size_t byte_cnt) { if (r->compression == ANY_COMP_SIMPLE) return try_read_bytes (r, buf, byte_cnt); else return read_bytes_zlib (r, buf, byte_cnt); } /* Reads a 64-bit floating-point number from R and returns its value in host format. */ static bool read_compressed_float (struct sfm_reader *r, double *d) { uint8_t number[8]; if (!read_compressed_bytes (r, number, sizeof number)) return false; *d = float_get_double (r->float_format, number); return true; } static const struct casereader_class sys_file_casereader_class = { sys_file_casereader_read, sys_file_casereader_destroy, NULL, NULL, }; const struct any_reader_class sys_file_reader_class = { N_("SPSS System File"), sfm_detect, sfm_open, sfm_close, sfm_decode, sfm_get_strings, }; pspp-1.4.1/src/data/case-tmpfile.c0000644000175000017500000001522713546443556016356 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2007, 2009, 2010, 2011 Free Software Foundation, Inc. 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 3 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, see . */ #include #include "data/case-tmpfile.h" #include #include #include #include "libpspp/assertion.h" #include "libpspp/taint.h" #include "libpspp/ext-array.h" #include "gl/xalloc.h" /* A temporary file that stores an array of cases. */ struct case_tmpfile { struct taint *taint; /* Taint. */ struct caseproto *proto; /* Format of cases in the tmpfile. */ size_t case_size; /* Number of bytes per case. */ size_t *offsets; /* Offset to each value. */ struct ext_array *ext_array; /* Temporary file. */ }; /* Returns the number of bytes needed to store a value with the given WIDTH on disk. */ static size_t width_to_n_bytes (int width) { return width == 0 ? sizeof (double) : width; } /* Returns the address of the data in VALUE (for reading or writing to/from disk). VALUE must have the given WIDTH. */ static void * value_to_data (const union value *value_, int width) { union value *value = CONST_CAST (union value *, value_); assert (sizeof value->f == sizeof (double)); if (width == 0) return &value->f; else return value->s; } /* Creates and returns a new case_tmpfile that will store cases that match case prototype PROTO. The caller retains ownership of PROTO. */ struct case_tmpfile * case_tmpfile_create (const struct caseproto *proto) { struct case_tmpfile *ctf; size_t n_values; size_t i; ctf = xmalloc (sizeof *ctf); ctf->taint = taint_create (); ctf->ext_array = ext_array_create (); ctf->proto = caseproto_ref (proto); ctf->case_size = 0; n_values = caseproto_get_n_widths (proto); ctf->offsets = xmalloc (n_values * sizeof *ctf->offsets); for (i = 0; i < n_values; i++) { size_t width = caseproto_get_width (proto, i); ctf->offsets[i] = ctf->case_size; ctf->case_size += width == -1 ? 0 : width == 0 ? sizeof (double) : width; } return ctf; } /* Destroys case_tmpfile CTF. Returns true if CTF was tainted, which is caused by an I/O error on case_tmpfile access or by taint propagation to the case_tmpfile. */ bool case_tmpfile_destroy (struct case_tmpfile *ctf) { bool ok = true; if (ctf != NULL) { struct taint *taint = ctf->taint; ext_array_destroy (ctf->ext_array); caseproto_unref (ctf->proto); free (ctf->offsets); free (ctf); ok = taint_destroy (taint); } return ok; } /* Returns true if CTF is tainted, which is caused by an I/O error on case_tmpfile access or by taint propagation to the case_tmpfile. */ bool case_tmpfile_error (const struct case_tmpfile *ctf) { return taint_is_tainted (ctf->taint); } /* Marks CTF as tainted. */ void case_tmpfile_force_error (struct case_tmpfile *ctf) { taint_set_taint (ctf->taint); } /* Returns CTF's taint object. */ const struct taint * case_tmpfile_get_taint (const struct case_tmpfile *ctf) { return ctf->taint; } /* Reads N_VALUES values into VALUES, from the case numbered CASE_IDX starting START_VALUE values into that case. Returns true if successful, false if CTF is tainted or an I/O error occurs during the operation. The results of this function are undefined if any of the values read have not been previously written to CTF. */ bool case_tmpfile_get_values (const struct case_tmpfile *ctf, casenumber case_idx, size_t start_value, union value values[], size_t n_values) { off_t case_offset = (off_t) ctf->case_size * case_idx; size_t i; assert (caseproto_range_is_valid (ctf->proto, start_value, n_values)); for (i = start_value; i < start_value + n_values; i++) { int width = caseproto_get_width (ctf->proto, i); if (width != -1 && !ext_array_read (ctf->ext_array, case_offset + ctf->offsets[i], width_to_n_bytes (width), value_to_data (&values[i], width))) return false; } return true; } /* Reads the case numbered CASE_IDX from CTF. Returns the case if successful or a null pointer if CTF is tainted or an I/O error occurs during the operation. The results of this function are undefined if the case read from CTF had not previously been written. */ struct ccase * case_tmpfile_get_case (const struct case_tmpfile *ctf, casenumber case_idx) { struct ccase *c = case_create (ctf->proto); if (case_tmpfile_get_values (ctf, case_idx, 0, case_data_all_rw (c), caseproto_get_n_widths (ctf->proto))) return c; else { case_unref (c); return NULL; } } /* Writes N_VALUES values from VALUES, into the case numbered CASE_IDX starting START_VALUE values into that case. Returns true if successful, false if CTF is tainted or an I/O error occurs during the operation. */ bool case_tmpfile_put_values (struct case_tmpfile *ctf, casenumber case_idx, size_t start_value, const union value values[], size_t n_values) { off_t case_offset = (off_t) ctf->case_size * case_idx; size_t i; assert (caseproto_range_is_valid (ctf->proto, start_value, n_values)); for (i = start_value; i < start_value + n_values; i++) { int width = caseproto_get_width (ctf->proto, i); if (width != -1 && !ext_array_write (ctf->ext_array, case_offset + ctf->offsets[i], width_to_n_bytes (width), value_to_data (values++, width))) return false; } return true; } /* Writes C to CTF as the case numbered CASE_IDX. Returns true if successful, false if CTF is tainted or an I/O error occurs during the operation. */ bool case_tmpfile_put_case (struct case_tmpfile *ctf, casenumber case_idx, struct ccase *c) { bool ok = case_tmpfile_put_values (ctf, case_idx, 0, case_data_all (c), caseproto_get_n_widths (ctf->proto)); case_unref (c); return ok; } pspp-1.4.1/src/data/ods-reader.c0000644000175000017500000005527613670210420016016 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2011, 2012, 2013, 2016 Free Software Foundation, Inc. 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 3 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, see . */ #include #include "ods-reader.h" #include "spreadsheet-reader.h" #include #include #include #include #include #include "data/case.h" #include "data/casereader-provider.h" #include "data/data-in.h" #include "data/dictionary.h" #include "data/format.h" #include "data/identifier.h" #include "data/value.h" #include "data/variable.h" #include "libpspp/assertion.h" #include "libpspp/i18n.h" #include "libpspp/message.h" #include "libpspp/misc.h" #include "libpspp/str.h" #include "libpspp/zip-reader.h" #include "gl/c-strtod.h" #include "gl/minmax.h" #include "gl/xalloc.h" #include "gettext.h" #define _(msgid) gettext (msgid) #define N_(msgid) (msgid) static void ods_file_casereader_destroy (struct casereader *, void *); static struct ccase *ods_file_casereader_read (struct casereader *, void *); static const struct casereader_class ods_file_casereader_class = { ods_file_casereader_read, ods_file_casereader_destroy, NULL, NULL, }; struct sheet_detail { /* The name of the sheet (utf8 encoding) */ char *name; int start_col; int stop_col; int start_row; int stop_row; }; enum reader_state { STATE_INIT = 0, /* Initial state */ STATE_SPREADSHEET, /* Found the start of the spreadsheet doc */ STATE_TABLE, /* Found the sheet that we actually want */ STATE_ROW, /* Found the start of the cell array */ STATE_CELL, /* Found a cell */ STATE_CELL_CONTENT /* Found a the text within a cell */ }; struct state_data { xmlTextReaderPtr xtr; struct zip_member *zm; int node_type; enum reader_state state; int row; int col; int current_sheet; xmlChar *current_sheet_name; int col_span; }; static void state_data_destroy (struct state_data *sd) { xmlFree (sd->current_sheet_name); sd->current_sheet_name = NULL; xmlFreeTextReader (sd->xtr); sd->xtr = NULL; zip_member_finish (sd->zm); sd->zm = NULL; } struct ods_reader { struct spreadsheet spreadsheet; struct zip_reader *zreader; int target_sheet_index; xmlChar *target_sheet_name; /* State data for the meta data */ struct state_data msd; /* State data for the reader */ struct state_data rsd; int start_row; int start_col; int stop_row; int stop_col; struct sheet_detail *sheets; int n_allocated_sheets; struct caseproto *proto; struct dictionary *dict; struct ccase *first_case; bool used_first_case; bool read_names; struct string ods_errs; struct string zip_errs; }; void ods_unref (struct spreadsheet *s) { struct ods_reader *r = (struct ods_reader *) s; if (--s->ref_cnt == 0) { int i; state_data_destroy (&r->msd); for (i = 0; i < r->n_allocated_sheets; ++i) { xmlFree (r->sheets[i].name); } dict_unref (r->dict); zip_reader_destroy (r->zreader); free (r->sheets); free (s->file_name); free (r); } } static bool reading_target_sheet (const struct ods_reader *r, const struct state_data *msd) { if (r->target_sheet_name != NULL) { if (0 == xmlStrcmp (r->target_sheet_name, msd->current_sheet_name)) return true; } if (r->target_sheet_index == msd->current_sheet + 1) return true; return false; } static void process_node (struct ods_reader *or, struct state_data *r); const char * ods_get_sheet_name (struct spreadsheet *s, int n) { struct ods_reader *r = (struct ods_reader *) s; struct state_data *or = &r->msd; assert (n < s->n_sheets); while ( (r->n_allocated_sheets <= n) || or->state != STATE_SPREADSHEET ) { int ret = xmlTextReaderRead (or->xtr); if (ret != 1) break; process_node (r, or); } return r->sheets[n].name; } char * ods_get_sheet_range (struct spreadsheet *s, int n) { struct ods_reader *r = (struct ods_reader *) s; struct state_data *or = &r->msd; assert (n < s->n_sheets); while ( (r->n_allocated_sheets <= n) || (r->sheets[n].stop_row == -1) || or->state != STATE_SPREADSHEET ) { int ret = xmlTextReaderRead (or->xtr); if (ret != 1) break; process_node (r, or); } return create_cell_range ( r->sheets[n].start_col, r->sheets[n].start_row, r->sheets[n].stop_col, r->sheets[n].stop_row); } static void ods_file_casereader_destroy (struct casereader *reader UNUSED, void *r_) { struct ods_reader *r = r_; if (r == NULL) return ; state_data_destroy (&r->rsd); if (! ds_is_empty (&r->ods_errs)) msg (ME, "%s", ds_cstr (&r->ods_errs)); ds_destroy (&r->ods_errs); if (r->first_case && ! r->used_first_case) case_unref (r->first_case); caseproto_unref (r->proto); r->proto = NULL; xmlFree (r->target_sheet_name); r->target_sheet_name = NULL; ods_unref (&r->spreadsheet); } static void process_node (struct ods_reader *or, struct state_data *r) { xmlChar *name = xmlTextReaderName (r->xtr); if (name == NULL) name = xmlStrdup (_xml ("--")); r->node_type = xmlTextReaderNodeType (r->xtr); switch (r->state) { case STATE_INIT: if (0 == xmlStrcasecmp (name, _xml("office:spreadsheet")) && XML_READER_TYPE_ELEMENT == r->node_type) { r->state = STATE_SPREADSHEET; r->current_sheet = -1; r->current_sheet_name = NULL; } break; case STATE_SPREADSHEET: if (0 == xmlStrcasecmp (name, _xml("table:table")) && (XML_READER_TYPE_ELEMENT == r->node_type)) { xmlFree (r->current_sheet_name); r->current_sheet_name = xmlTextReaderGetAttribute (r->xtr, _xml ("table:name")); ++r->current_sheet; if (r->current_sheet >= or->n_allocated_sheets) { assert (r->current_sheet == or->n_allocated_sheets); or->sheets = xrealloc (or->sheets, sizeof (*or->sheets) * ++or->n_allocated_sheets); or->sheets[or->n_allocated_sheets - 1].start_col = -1; or->sheets[or->n_allocated_sheets - 1].stop_col = -1; or->sheets[or->n_allocated_sheets - 1].start_row = -1; or->sheets[or->n_allocated_sheets - 1].stop_row = -1; or->sheets[or->n_allocated_sheets - 1].name = CHAR_CAST (char *, xmlStrdup (r->current_sheet_name)); } r->col = 0; r->row = 0; r->state = STATE_TABLE; } else if (0 == xmlStrcasecmp (name, _xml("office:spreadsheet")) && XML_READER_TYPE_ELEMENT == r->node_type) { r->state = STATE_INIT; } break; case STATE_TABLE: if (0 == xmlStrcasecmp (name, _xml("table:table-row")) && (XML_READER_TYPE_ELEMENT == r->node_type)) { xmlChar *value = xmlTextReaderGetAttribute (r->xtr, _xml ("table:number-rows-repeated")); int row_span = value ? _xmlchar_to_int (value) : 1; r->row += row_span; r->col = 0; if (! xmlTextReaderIsEmptyElement (r->xtr)) r->state = STATE_ROW; xmlFree (value); } else if (0 == xmlStrcasecmp (name, _xml("table:table")) && (XML_READER_TYPE_END_ELEMENT == r->node_type)) { r->state = STATE_SPREADSHEET; } break; case STATE_ROW: if ((0 == xmlStrcasecmp (name, _xml ("table:table-cell"))) && (XML_READER_TYPE_ELEMENT == r->node_type)) { xmlChar *value = xmlTextReaderGetAttribute (r->xtr, _xml ("table:number-columns-repeated")); r->col_span = value ? _xmlchar_to_int (value) : 1; r->col += r->col_span; if (! xmlTextReaderIsEmptyElement (r->xtr)) r->state = STATE_CELL; xmlFree (value); } else if ((0 == xmlStrcasecmp (name, _xml ("table:table-row"))) && (XML_READER_TYPE_END_ELEMENT == r->node_type)) { r->state = STATE_TABLE; } break; case STATE_CELL: if ((0 == xmlStrcasecmp (name, _xml("text:p"))) && (XML_READER_TYPE_ELEMENT == r->node_type)) { if (! xmlTextReaderIsEmptyElement (r->xtr)) r->state = STATE_CELL_CONTENT; } else if ((0 == xmlStrcasecmp (name, _xml("table:table-cell"))) && (XML_READER_TYPE_END_ELEMENT == r->node_type) ) { r->state = STATE_ROW; } break; case STATE_CELL_CONTENT: assert (r->current_sheet >= 0); assert (r->current_sheet < or->n_allocated_sheets); if (or->sheets[r->current_sheet].start_row == -1) or->sheets[r->current_sheet].start_row = r->row - 1; if ( (or->sheets[r->current_sheet].start_col == -1) || (or->sheets[r->current_sheet].start_col >= r->col - 1) ) or->sheets[r->current_sheet].start_col = r->col - 1; or->sheets[r->current_sheet].stop_row = r->row - 1; if (or->sheets[r->current_sheet].stop_col < r->col - 1) or->sheets[r->current_sheet].stop_col = r->col - 1; if (XML_READER_TYPE_END_ELEMENT == r->node_type) r->state = STATE_CELL; break; default: NOT_REACHED (); break; }; xmlFree (name); } /* A struct containing the parameters of a cell's value parsed from the xml */ struct xml_value { xmlChar *type; xmlChar *value; xmlChar *text; }; struct var_spec { char *name; struct xml_value firstval; }; /* Determine the width that a xmv should probably have */ static int xmv_to_width (const struct xml_value *xmv, int fallback) { int width = SPREADSHEET_DEFAULT_WIDTH; /* Non-strings always have zero width */ if (xmv->type != NULL && 0 != xmlStrcmp (xmv->type, _xml("string"))) return 0; if (fallback != -1) return fallback; if (xmv->value) width = ROUND_UP (xmlStrlen (xmv->value), SPREADSHEET_DEFAULT_WIDTH); else if (xmv->text) width = ROUND_UP (xmlStrlen (xmv->text), SPREADSHEET_DEFAULT_WIDTH); return width; } /* Sets the VAR of case C, to the value corresponding to the xml data */ static void convert_xml_to_value (struct ccase *c, const struct variable *var, const struct xml_value *xmv, int col, int row) { union value *v = case_data_rw (c, var); if (xmv->value == NULL && xmv->text == NULL) value_set_missing (v, var_get_width (var)); else if (var_is_alpha (var)) /* Use the text field, because it seems that there is no value field for strings */ value_copy_str_rpad (v, var_get_width (var), xmv->text, ' '); else { const struct fmt_spec *fmt = var_get_write_format (var); enum fmt_category fc = fmt_get_category (fmt->type); assert (fc != FMT_CAT_STRING); if (0 == xmlStrcmp (xmv->type, _xml("float"))) { v->f = c_strtod (CHAR_CAST (const char *, xmv->value), NULL); } else { const char *text = xmv->value ? CHAR_CAST (const char *, xmv->value) : CHAR_CAST (const char *, xmv->text); char *m = data_in (ss_cstr (text), "UTF-8", fmt->type, v, var_get_width (var), "UTF-8"); if (m) { char buf [FMT_STRING_LEN_MAX + 1]; char *cell = create_cell_ref (col, row); msg (MW, _("Cannot convert the value in the spreadsheet cell %s to format (%s): %s"), cell, fmt_to_string (fmt, buf), m); free (cell); } free (m); } } } static int xml_reader_for_zip_member (void *zm_, char *buffer, int len) { struct zip_member *zm = zm_; return zip_member_read (zm, buffer, len); } /* Try to find out how many sheets there are in the "workbook" */ static int get_sheet_count (struct zip_reader *zreader) { xmlTextReaderPtr mxtr; struct zip_member *meta = NULL; meta = zip_member_open (zreader, "meta.xml"); if (meta == NULL) return -1; mxtr = xmlReaderForIO (xml_reader_for_zip_member, NULL, meta, NULL, NULL, 0); while (1 == xmlTextReaderRead (mxtr)) { xmlChar *name = xmlTextReaderName (mxtr); if (0 == xmlStrcmp (name, _xml("meta:document-statistic"))) { xmlChar *attr = xmlTextReaderGetAttribute (mxtr, _xml ("meta:table-count")); if (attr != NULL) { int s = _xmlchar_to_int (attr); xmlFreeTextReader (mxtr); zip_member_finish (meta); xmlFree (name); xmlFree (attr); return s; } xmlFree (attr); } xmlFree (name); } xmlFreeTextReader (mxtr); zip_member_finish (meta); return -1; } static void ods_error_handler (void *ctx, const char *mesg, xmlParserSeverities sev UNUSED, xmlTextReaderLocatorPtr loc) { struct ods_reader *r = ctx; msg (MW, _("There was a problem whilst reading the %s file `%s' (near line %d): `%s'"), "ODF", r->spreadsheet.file_name, xmlTextReaderLocatorLineNumber (loc), mesg); } static bool init_reader (struct ods_reader *r, bool report_errors, struct state_data *state) { struct zip_member *content = zip_member_open (r->zreader, "content.xml"); xmlTextReaderPtr xtr; if (content == NULL) return NULL; xtr = xmlReaderForIO (xml_reader_for_zip_member, NULL, content, NULL, NULL, report_errors ? 0 : (XML_PARSE_NOERROR | XML_PARSE_NOWARNING)); if (xtr == NULL) return false; *state = (struct state_data) { .xtr = xtr, .zm = content, .state = STATE_INIT }; r->spreadsheet.type = SPREADSHEET_ODS; if (report_errors) xmlTextReaderSetErrorHandler (xtr, ods_error_handler, r); return true; } struct spreadsheet * ods_probe (const char *filename, bool report_errors) { int sheet_count; struct ods_reader *r = xzalloc (sizeof *r); struct zip_reader *zr; ds_init_empty (&r->zip_errs); zr = zip_reader_create (filename, &r->zip_errs); if (zr == NULL) { if (report_errors) { msg (ME, _("Cannot open %s as a OpenDocument file: %s"), filename, ds_cstr (&r->zip_errs)); } ds_destroy (&r->zip_errs); free (r); return NULL; } sheet_count = get_sheet_count (zr); r->zreader = zr; r->spreadsheet.ref_cnt = 1; if (!init_reader (r, report_errors, &r->msd)) goto error; r->spreadsheet.n_sheets = sheet_count; r->n_allocated_sheets = 0; r->sheets = NULL; r->spreadsheet.file_name = strdup (filename); return &r->spreadsheet; error: ds_destroy (&r->zip_errs); zip_reader_destroy (r->zreader); free (r); return NULL; } struct casereader * ods_make_reader (struct spreadsheet *spreadsheet, const struct spreadsheet_read_options *opts) { intf ret = 0; xmlChar *type = NULL; unsigned long int vstart = 0; casenumber n_cases = CASENUMBER_MAX; int i; struct var_spec *var_spec = NULL; int n_var_specs = 0; struct ods_reader *r = (struct ods_reader *) spreadsheet; xmlChar *val_string = NULL; assert (r); r->read_names = opts->read_names; ds_init_empty (&r->ods_errs); ++r->spreadsheet.ref_cnt; if (!init_reader (r, true, &r->rsd)) goto error; r->used_first_case = false; r->first_case = NULL; if (opts->cell_range) { if (! convert_cell_ref (opts->cell_range, &r->start_col, &r->start_row, &r->stop_col, &r->stop_row)) { msg (SE, _("Invalid cell range `%s'"), opts->cell_range); goto error; } } else { r->start_col = 0; r->start_row = 0; r->stop_col = -1; r->stop_row = -1; } r->target_sheet_name = xmlStrdup (BAD_CAST opts->sheet_name); r->target_sheet_index = opts->sheet_index; /* Advance to the start of the cells for the target sheet */ while (! reading_target_sheet (r, &r->rsd) || r->rsd.state != STATE_ROW || r->rsd.row <= r->start_row) { if (1 != (ret = xmlTextReaderRead (r->rsd.xtr))) break; process_node (r, &r->rsd); } if (ret < 1) { msg (MW, _("Selected sheet or range of spreadsheet `%s' is empty."), spreadsheet->file_name); goto error; } if (opts->read_names) { while (1 == xmlTextReaderRead (r->rsd.xtr)) { process_node (r, &r->rsd); /* If the row is finished then stop for now */ if (r->rsd.state == STATE_TABLE && r->rsd.row > r->start_row) break; int idx = r->rsd.col - r->start_col - 1; if (idx < 0) continue; if (r->stop_col != -1 && idx > r->stop_col - r->start_col) continue; if (r->rsd.state == STATE_CELL_CONTENT && XML_READER_TYPE_TEXT == r->rsd.node_type) { xmlChar *value = xmlTextReaderValue (r->rsd.xtr); if (idx >= n_var_specs) { var_spec = xrealloc (var_spec, sizeof (*var_spec) * (idx + 1)); /* xrealloc (unlike realloc) doesn't initialise its memory to 0 */ memset (var_spec + n_var_specs, 0, (idx - n_var_specs + 1) * sizeof (*var_spec)); n_var_specs = idx + 1; } for (int i = 0; i < r->rsd.col_span; ++i) { var_spec[idx - i].firstval.text = 0; var_spec[idx - i].firstval.value = 0; var_spec[idx - i].firstval.type = 0; var_spec[idx - i].name = strdup (CHAR_CAST (const char *, value)); } xmlFree (value); } } } /* Read in the first row of data */ while (1 == xmlTextReaderRead (r->rsd.xtr)) { int idx; process_node (r, &r->rsd); if (! reading_target_sheet (r, &r->rsd)) break; /* If the row is finished then stop for now */ if (r->rsd.state == STATE_TABLE && r->rsd.row > r->start_row + (opts->read_names ? 1 : 0)) break; idx = r->rsd.col - r->start_col - 1; if (idx < 0) continue; if (r->stop_col != -1 && idx > r->stop_col - r->start_col) continue; if (r->rsd.state == STATE_CELL && XML_READER_TYPE_ELEMENT == r->rsd.node_type) { type = xmlTextReaderGetAttribute (r->rsd.xtr, _xml ("office:value-type")); val_string = xmlTextReaderGetAttribute (r->rsd.xtr, _xml ("office:value")); } if (r->rsd.state == STATE_CELL_CONTENT && XML_READER_TYPE_TEXT == r->rsd.node_type) { if (idx >= n_var_specs) { var_spec = xrealloc (var_spec, sizeof (*var_spec) * (idx + 1)); memset (var_spec + n_var_specs, 0, (idx - n_var_specs + 1) * sizeof (*var_spec)); var_spec [idx].name = NULL; n_var_specs = idx + 1; } var_spec [idx].firstval.type = type; var_spec [idx].firstval.text = xmlTextReaderValue (r->rsd.xtr); var_spec [idx].firstval.value = val_string; val_string = NULL; type = NULL; } } /* Create the dictionary and populate it */ r->spreadsheet.dict = r->dict = dict_create ( CHAR_CAST (const char *, xmlTextReaderConstEncoding (r->rsd.xtr))); for (i = 0; i < n_var_specs ; ++i) { struct fmt_spec fmt; struct variable *var = NULL; char *name = dict_make_unique_var_name (r->dict, var_spec[i].name, &vstart); int width = xmv_to_width (&var_spec[i].firstval, opts->asw); dict_create_var (r->dict, name, width); free (name); var = dict_get_var (r->dict, i); if (0 == xmlStrcmp (var_spec[i].firstval.type, _xml("date"))) { fmt.type = FMT_DATE; fmt.d = 0; fmt.w = 20; } else fmt = fmt_default_for_width (width); var_set_both_formats (var, &fmt); } if (n_var_specs == 0) { msg (MW, _("Selected sheet or range of spreadsheet `%s' is empty."), spreadsheet->file_name); goto error; } /* Create the first case, and cache it */ r->proto = caseproto_ref (dict_get_proto (r->dict)); r->first_case = case_create (r->proto); case_set_missing (r->first_case); for (i = 0 ; i < n_var_specs; ++i) { const struct variable *var = dict_get_var (r->dict, i); convert_xml_to_value (r->first_case, var, &var_spec[i].firstval, r->rsd.col - n_var_specs + i, r->rsd.row - 1); } /* Read in the first row of data */ while (1 == xmlTextReaderRead (r->rsd.xtr)) { process_node (r, &r->rsd); if (r->rsd.state == STATE_ROW) break; } for (i = 0 ; i < n_var_specs ; ++i) { free (var_spec[i].firstval.type); free (var_spec[i].firstval.value); free (var_spec[i].firstval.text); free (var_spec[i].name); } free (var_spec); return casereader_create_sequential (NULL, r->proto, n_cases, &ods_file_casereader_class, r); error: for (i = 0 ; i < n_var_specs ; ++i) { free (var_spec[i].firstval.type); free (var_spec[i].firstval.value); free (var_spec[i].firstval.text); free (var_spec[i].name); } free (var_spec); ods_file_casereader_destroy (NULL, r); return NULL; } /* Reads and returns one case from READER's file. Returns a null pointer on failure. */ static struct ccase * ods_file_casereader_read (struct casereader *reader UNUSED, void *r_) { struct ccase *c = NULL; struct ods_reader *r = r_; xmlChar *val_string = NULL; xmlChar *type = NULL; if (!r->used_first_case) { r->used_first_case = true; return r->first_case; } /* Advance to the start of a row. (If there is one) */ while (r->rsd.state != STATE_ROW && 1 == xmlTextReaderRead (r->rsd.xtr) ) { process_node (r, &r->rsd); } if (! reading_target_sheet (r, &r->rsd) || r->rsd.state < STATE_TABLE || (r->stop_row != -1 && r->rsd.row > r->stop_row + 1) ) { return NULL; } c = case_create (r->proto); case_set_missing (c); while (1 == xmlTextReaderRead (r->rsd.xtr)) { process_node (r, &r->rsd); if (r->stop_row != -1 && r->rsd.row > r->stop_row + 1) break; if (r->rsd.state == STATE_CELL && r->rsd.node_type == XML_READER_TYPE_ELEMENT) { type = xmlTextReaderGetAttribute (r->rsd.xtr, _xml ("office:value-type")); val_string = xmlTextReaderGetAttribute (r->rsd.xtr, _xml ("office:value")); } if (r->rsd.state == STATE_CELL_CONTENT && r->rsd.node_type == XML_READER_TYPE_TEXT) { int col; struct xml_value *xmv = xzalloc (sizeof *xmv); xmv->text = xmlTextReaderValue (r->rsd.xtr); xmv->value = val_string; val_string = NULL; xmv->type = type; type = NULL; for (col = 0; col < r->rsd.col_span; ++col) { const struct variable *var; const int idx = r->rsd.col - col - r->start_col - 1; if (idx < 0) continue; if (r->stop_col != -1 && idx > r->stop_col - r->start_col) break; if (idx >= dict_get_var_cnt (r->dict)) break; var = dict_get_var (r->dict, idx); convert_xml_to_value (c, var, xmv, idx + r->start_col, r->rsd.row - 1); } xmlFree (xmv->text); xmlFree (xmv->value); xmlFree (xmv->type); free (xmv); } if (r->rsd.state <= STATE_TABLE) break; } xmlFree (type); xmlFree (val_string); return c; } pspp-1.4.1/src/data/case.h0000644000175000017500000001405013717773141014712 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2004, 2007, 2009, 2010, 2011 Free Software Foundation, Inc. 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 3 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, see . */ #ifndef DATA_CASE_H #define DATA_CASE_H 1 #include #include #include #include #include "libpspp/compiler.h" #include "data/caseproto.h" struct variable; /* A count of cases or the index of a case within a collection of them. */ #define CASENUMBER_MAX LONG_MAX typedef long int casenumber; /* Reference-counted case implementation. A newly created case has a single owner (the code that created it), represented by an initial reference count of 1. Other code that receives the case may keep a virtual copy of it by calling case_ref, which increments the case's reference count. When this is done, the case becomes shared between its original owner and each piece of code that incremented the reference count. A shared case (one whose reference count is greater than 1) must not be modified, because this would make the case change in the view of every reference count holder, not just the one that intended to change the case. Because the purpose of keeping the reference count is to make a virtual copy of the case, this is undesirable behavior. The case_unshare function provides a solution, by making a new, unshared copy of a shared case. */ struct ccase { struct caseproto *proto; /* Case prototype. */ size_t ref_cnt; /* Reference count. */ union value values[1]; /* Values. */ }; struct ccase *case_create (const struct caseproto *) MALLOC_LIKE; struct ccase *case_try_create (const struct caseproto *) MALLOC_LIKE; struct ccase *case_clone (const struct ccase *) MALLOC_LIKE; static inline struct ccase *case_unshare (struct ccase *) WARN_UNUSED_RESULT; struct ccase *case_ref (const struct ccase *) WARN_UNUSED_RESULT; static inline void case_unref (struct ccase *); static inline bool case_is_shared (const struct ccase *); static inline size_t case_get_value_cnt (const struct ccase *); static inline const struct caseproto *case_get_proto (const struct ccase *); size_t case_get_cost (const struct caseproto *); struct ccase *case_resize (struct ccase *, const struct caseproto *) WARN_UNUSED_RESULT; struct ccase *case_unshare_and_resize (struct ccase *, const struct caseproto *) WARN_UNUSED_RESULT; void case_set_missing (struct ccase *); void case_copy (struct ccase *dst, size_t dst_idx, const struct ccase *src, size_t src_idx, size_t cnt); void case_copy_out (const struct ccase *, size_t start_idx, union value *, size_t n_values); void case_copy_in (struct ccase *, size_t start_idx, const union value *, size_t n_values); const union value *case_data (const struct ccase *, const struct variable *); const union value *case_data_idx (const struct ccase *, size_t idx); union value *case_data_rw (struct ccase *, const struct variable *); union value *case_data_rw_idx (struct ccase *, size_t idx); double case_num (const struct ccase *, const struct variable *); double case_num_idx (const struct ccase *, size_t idx); const uint8_t *case_str (const struct ccase *, const struct variable *); const uint8_t *case_str_idx (const struct ccase *, size_t idx); uint8_t *case_str_rw (struct ccase *, const struct variable *); uint8_t *case_str_rw_idx (struct ccase *, size_t idx); int case_compare (const struct ccase *, const struct ccase *, const struct variable *const *, size_t n_vars); int case_compare_2dict (const struct ccase *, const struct ccase *, const struct variable *const *, const struct variable *const *, size_t n_vars); const union value *case_data_all (const struct ccase *); union value *case_data_all_rw (struct ccase *); struct ccase *case_unshare__ (struct ccase *); void case_unref__ (struct ccase *); /* If C is a shared case, that is, if it has a reference count greater than 1, makes a new unshared copy and returns it, decrementing C's reference count. If C is not shared (its reference count is 1), returns C. This function should be used before attempting to modify any of the data in a case that might be shared, e.g.: c = case_unshare (c); // Make sure that C is not shared. case_data_rw (c, myvar)->f = 1; // Modify data in C. */ static inline struct ccase * case_unshare (struct ccase *c) { if (case_is_shared (c)) c = case_unshare__ (c); return c; } /* Decrements case C's reference count. Frees C if its reference count drops to 0. If C is a null pointer, this function has no effect. */ static inline void case_unref (struct ccase *c) { if (c != NULL && --c->ref_cnt == 0) case_unref__ (c); } /* Returns true if case C is shared. A case that is shared cannot be modified directly. Instead, an unshared copy must first be made with case_unshare(). */ static inline bool case_is_shared (const struct ccase *c) { return c->ref_cnt > 1; } /* Returns the number of union values in C. */ static inline size_t case_get_value_cnt (const struct ccase *c) { return caseproto_get_n_widths (c->proto); } /* Returns the prototype that describes the format of case C. The caller must not unref the returned prototype. */ static inline const struct caseproto * case_get_proto (const struct ccase *c) { return c->proto; } #endif /* data/case.h */ pspp-1.4.1/src/data/lazy-casereader.c0000644000175000017500000001204113320146056017030 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2007, 2009, 2011 Free Software Foundation, Inc. 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 3 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, see . */ #include #include "data/lazy-casereader.h" #include #include "data/case.h" #include "data/casereader.h" #include "data/casereader-provider.h" #include "libpspp/assertion.h" #include "gl/xalloc.h" /* A lazy casereader's auxiliary data. */ struct lazy_casereader { unsigned long int serial; struct casereader *(*callback) (void *aux); void *aux; }; static const struct casereader_class lazy_casereader_class; /* Creates and returns a new lazy casereader that will instantiate its underlying casereader, if necessary, by calling CALLBACK, passing AUX as its argument. *SERIAL is set to a "serial number" that uniquely identifies the new lazy casereader, for use with lazy_casereader_destroy. PROTO must be the format of the cases to be read from the casereader. CASE_CNT is an upper limit on the number of cases that casereader_read will return from the casereader in successive calls. Ordinarily, this is the actual number of cases in the data source or CASENUMBER_MAX if the number of cases cannot be predicted in advance. */ struct casereader * lazy_casereader_create (const struct caseproto *proto, casenumber case_cnt, struct casereader *(*callback) (void *aux), void *aux, unsigned long int *serial) { static unsigned long int next_serial = 0; struct lazy_casereader *lc; assert (callback != NULL); lc = xmalloc (sizeof *lc); *serial = lc->serial = next_serial++; lc->callback = callback; lc->aux = aux; return casereader_create_sequential (NULL, proto, case_cnt, &lazy_casereader_class, lc); } /* If READER is the lazy casereader that was returned by lazy_casereader_create along with SERIAL, and READER was never instantiated by any use of a casereader function, then this function destroys READER without instantiating it, and returns true. Returns false in any other case; that is, if READER is not a lazy casereader, or if READER is a lazy casereader with a serial number different from SERIAL, or if READER is a lazy casereader that was instantiated. When this function returns true, it necessarily indicates that the lazy casereader was never cloned and never destroyed. */ bool lazy_casereader_destroy (struct casereader *reader, unsigned long int serial) { struct lazy_casereader *lc; if (reader == NULL) return false; lc = casereader_dynamic_cast (reader, &lazy_casereader_class); if (lc == NULL || lc->serial != serial) return false; lc->callback = NULL; casereader_destroy (reader); return true; } /* Instantiates lazy casereader READER, which is associated with LC. */ static void instantiate_lazy_casereader (struct casereader *reader, struct lazy_casereader *lc) { struct casereader *subreader; /* Call the client-provided callback to obtain the real casereader, then swap READER with that casereader. */ subreader = lc->callback (lc->aux); casereader_swap (reader, subreader); /* Now destroy the lazy casereader, which is no longer needed since we already swapped it out. Set the callback to null to prevent lazy_casereader_do_destroy from trying to instantiate it again. */ lc->callback = NULL; casereader_destroy (subreader); } static struct ccase * lazy_casereader_read (struct casereader *reader, void *lc_) { struct lazy_casereader *lc = lc_; instantiate_lazy_casereader (reader, lc); return casereader_read (reader); } static void lazy_casereader_do_destroy (struct casereader *reader UNUSED, void *lc_) { struct lazy_casereader *lc = lc_; if (lc->callback != NULL) casereader_destroy (lc->callback (lc->aux)); free (lc); } static struct casereader * lazy_casereader_clone (struct casereader *reader, void *lc_) { struct lazy_casereader *lc = lc_; instantiate_lazy_casereader (reader, lc); return casereader_clone (reader); } static struct ccase * lazy_casereader_peek (struct casereader *reader, void *lc_, casenumber idx) { struct lazy_casereader *lc = lc_; instantiate_lazy_casereader (reader, lc); return casereader_peek (reader, idx); } static const struct casereader_class lazy_casereader_class = { lazy_casereader_read, lazy_casereader_do_destroy, lazy_casereader_clone, lazy_casereader_peek, }; pspp-1.4.1/src/data/format.c0000644000175000017500000007515413670210420015256 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 1997-9, 2000, 2006, 2010, 2011, 2012 Free Software Foundation, Inc. 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 3 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, see . */ #include #include "format.h" #include #include #include #include "data/identifier.h" #include "data/settings.h" #include "data/value.h" #include "data/variable.h" #include "libpspp/assertion.h" #include "libpspp/cast.h" #include "libpspp/compiler.h" #include "libpspp/message.h" #include "libpspp/misc.h" #include "libpspp/str.h" #include "gl/c-strcase.h" #include "gl/minmax.h" #include "gl/xalloc.h" #include "gettext.h" #define _(msgid) gettext (msgid) struct fmt_settings { struct fmt_number_style styles[FMT_NUMBER_OF_FORMATS]; }; bool is_fmt_type (enum fmt_type); static bool valid_width (enum fmt_type, int width, enum fmt_use); static int max_digits_for_bytes (int bytes); static void fmt_clamp_width (struct fmt_spec *, enum fmt_use); static void fmt_clamp_decimals (struct fmt_spec *, enum fmt_use); static void fmt_affix_set (struct fmt_affix *, const char *); static void fmt_affix_free (struct fmt_affix *); static void fmt_number_style_init (struct fmt_number_style *); static void fmt_number_style_clone (struct fmt_number_style *, const struct fmt_number_style *); static void fmt_number_style_destroy (struct fmt_number_style *); /* Creates and returns a new struct fmt_settings with default format styles. */ struct fmt_settings * fmt_settings_create (void) { struct fmt_settings *settings; int t; settings = xzalloc (sizeof *settings); for (t = 0 ; t < FMT_NUMBER_OF_FORMATS ; ++t) fmt_number_style_init (&settings->styles[t]); fmt_settings_set_decimal (settings, '.'); return settings; } /* Destroys SETTINGS. */ void fmt_settings_destroy (struct fmt_settings *settings) { if (settings != NULL) { int t; for (t = 0 ; t < FMT_NUMBER_OF_FORMATS ; ++t) fmt_number_style_destroy (&settings->styles[t]); free (settings->styles); } } /* Returns a copy of SETTINGS. */ struct fmt_settings * fmt_settings_clone (const struct fmt_settings *old) { struct fmt_settings *new; int t; new = xmalloc (sizeof *new); for (t = 0 ; t < FMT_NUMBER_OF_FORMATS ; ++t) fmt_number_style_clone (&new->styles[t], &old->styles[t]); return new; } /* Returns the number formatting style associated with the given format TYPE. */ const struct fmt_number_style * fmt_settings_get_style (const struct fmt_settings *settings, enum fmt_type type) { assert (is_fmt_type (type)); return &settings->styles[type]; } /* Sets the number style for TYPE to have the given DECIMAL and GROUPING characters, negative prefix NEG_PREFIX, prefix PREFIX, suffix SUFFIX, and negative suffix NEG_SUFFIX. All of the strings are UTF-8 encoded. */ void fmt_settings_set_style (struct fmt_settings *settings, enum fmt_type type, char decimal, char grouping, const char *neg_prefix, const char *prefix, const char *suffix, const char *neg_suffix) { struct fmt_number_style *style = &settings->styles[type]; int total_bytes, total_width; assert (grouping == '.' || grouping == ',' || grouping == 0); assert (decimal == '.' || decimal == ','); assert (decimal != grouping); fmt_number_style_destroy (style); fmt_affix_set (&style->neg_prefix, neg_prefix); fmt_affix_set (&style->prefix, prefix); fmt_affix_set (&style->suffix, suffix); fmt_affix_set (&style->neg_suffix, neg_suffix); style->decimal = decimal; style->grouping = grouping; total_bytes = (strlen (neg_prefix) + strlen (prefix) + strlen (suffix) + strlen (neg_suffix)); total_width = (style->neg_prefix.width + style->prefix.width + style->suffix.width + style->neg_suffix.width); style->extra_bytes = MAX (0, total_bytes - total_width); } /* Sets the decimal point character for the settings in S to DECIMAL. This has no effect on custom currency formats. */ void fmt_settings_set_decimal (struct fmt_settings *s, char decimal) { int grouping = decimal == '.' ? ',' : '.'; assert (decimal == '.' || decimal == ','); fmt_settings_set_style (s, FMT_F, decimal, 0, "-", "", "", ""); fmt_settings_set_style (s, FMT_E, decimal, 0, "-", "", "", ""); fmt_settings_set_style (s, FMT_COMMA, decimal, grouping, "-", "", "", ""); fmt_settings_set_style (s, FMT_DOT, grouping, decimal, "-", "", "", ""); fmt_settings_set_style (s, FMT_DOLLAR, decimal, grouping, "-", "$", "", ""); fmt_settings_set_style (s, FMT_PCT, decimal, 0, "-", "", "%", ""); } /* Returns an input format specification with type TYPE, width W, and D decimals. */ struct fmt_spec fmt_for_input (enum fmt_type type, int w, int d) { struct fmt_spec f; f.type = type; f.w = w; f.d = d; assert (fmt_check_input (&f)); return f; } /* Returns an output format specification with type TYPE, width W, and D decimals. */ struct fmt_spec fmt_for_output (enum fmt_type type, int w, int d) { struct fmt_spec f; f.type = type; f.w = w; f.d = d; assert (fmt_check_output (&f)); return f; } /* Returns the output format specifier corresponding to input format specifier INPUT. */ struct fmt_spec fmt_for_output_from_input (const struct fmt_spec *input) { struct fmt_spec output; assert (fmt_check_input (input)); output.type = fmt_input_to_output (input->type); output.w = input->w; if (output.w > fmt_max_output_width (output.type)) output.w = fmt_max_output_width (output.type); else if (output.w < fmt_min_output_width (output.type)) output.w = fmt_min_output_width (output.type); output.d = input->d; switch (input->type) { case FMT_Z: output.w++; if (output.d > 0) output.w++; break; case FMT_F: case FMT_COMMA: case FMT_DOT: case FMT_DOLLAR: case FMT_PCT: { const struct fmt_number_style *style = settings_get_style (input->type); output.w += fmt_affix_width (style); if (style->grouping != 0 && input->w - input->d >= 3) output.w += (input->w - input->d - 1) / 3; if (output.d > 0) output.w++; } break; case FMT_N: if (output.d > 0) output.w++; break; case FMT_E: output.d = MAX (input->d, 3); output.w = MAX (input->w, output.d + 7); break; case FMT_PIBHEX: output.w = max_digits_for_bytes (input->w / 2) + 1; break; case FMT_RB: case FMT_RBHEX: output.w = 8; output.d = 2; break; case FMT_P: case FMT_PK: output.w = 2 * input->w + (input->d > 0); break; case FMT_IB: case FMT_PIB: output.w = max_digits_for_bytes (input->w) + 1; if (output.d > 0) output.w++; break; case FMT_CCA: case FMT_CCB: case FMT_CCC: case FMT_CCD: case FMT_CCE: NOT_REACHED (); case FMT_A: break; case FMT_AHEX: output.w = input->w / 2; break; case FMT_DATE: case FMT_EDATE: case FMT_SDATE: case FMT_ADATE: case FMT_JDATE: case FMT_QYR: case FMT_MOYR: case FMT_WKYR: case FMT_TIME: case FMT_DTIME: case FMT_DATETIME: case FMT_WKDAY: case FMT_MONTH: break; case FMT_MTIME: if (input->d) output.w = MAX (input->w, input->d + 6); break; case FMT_YMDHMS: if (input->w) output.w = MAX (input->w, input->d + 20); break; default: NOT_REACHED (); } if (output.w > fmt_max_output_width (output.type)) output.w = fmt_max_output_width (output.type); assert (fmt_check_output (&output)); return output; } /* Returns the default format for the given WIDTH: F8.2 format for a numeric value, A format for a string value. */ struct fmt_spec fmt_default_for_width (int width) { return (width == 0 ? fmt_for_output (FMT_F, 8, 2) : fmt_for_output (FMT_A, width, 0)); } /* Checks whether SPEC is valid for USE and returns nonzero if so. Otherwise, emits an error message and returns zero. */ bool fmt_check (const struct fmt_spec *spec, enum fmt_use use) { const char *io_fmt; char str[FMT_STRING_LEN_MAX + 1]; int min_w, max_w, max_d; assert (is_fmt_type (spec->type)); fmt_to_string (spec, str); io_fmt = use == FMT_FOR_INPUT ? _("Input format") : _("Output format"); if (use == FMT_FOR_INPUT && !fmt_usable_for_input (spec->type)) { msg (SE, _("Format %s may not be used for input."), str); return false; } if (spec->w % fmt_step_width (spec->type)) { assert (fmt_step_width (spec->type) == 2); msg (SE, _("%s specifies width %d, but %s requires an even width."), str, spec->w, fmt_name (spec->type)); return false; } min_w = fmt_min_width (spec->type, use); max_w = fmt_max_width (spec->type, use); if (spec->w < min_w || spec->w > max_w) { msg (SE, _("%s %s specifies width %d, but " "%s requires a width between %d and %d."), io_fmt, str, spec->w, fmt_name (spec->type), min_w, max_w); return false; } max_d = fmt_max_decimals (spec->type, spec->w, use); if (!fmt_takes_decimals (spec->type) && spec->d != 0) { msg (SE, ngettext ("%s %s specifies %d decimal place, but " "%s does not allow any decimals.", "%s %s specifies %d decimal places, but " "%s does not allow any decimals.", spec->d), io_fmt, str, spec->d, fmt_name (spec->type)); return false; } else if (spec->d > max_d) { if (max_d > 0) msg (SE, ngettext ("%s %s specifies %d decimal place, but " "the given width allows at most %d decimals.", "%s %s specifies %d decimal places, but " "the given width allows at most %d decimals.", spec->d), io_fmt, str, spec->d, max_d); else msg (SE, ngettext ("%s %s specifies %d decimal place, but " "the given width does not allow for any decimals.", "%s %s specifies %d decimal places, but " "the given width does not allow for any decimals.", spec->d), io_fmt, str, spec->d); return false; } return true; } /* Checks whether SPEC is valid as an input format and returns nonzero if so. Otherwise, emits an error message and returns zero. */ bool fmt_check_input (const struct fmt_spec *spec) { return fmt_check (spec, FMT_FOR_INPUT); } /* Checks whether SPEC is valid as an output format and returns true if so. Otherwise, emits an error message and returns false. */ bool fmt_check_output (const struct fmt_spec *spec) { return fmt_check (spec, FMT_FOR_OUTPUT); } /* Checks that FORMAT is appropriate for a variable of the given VAR_TYPE and returns true if so. Otherwise returns false and emits an error message. */ bool fmt_check_type_compat (const struct fmt_spec *format, enum val_type var_type) { assert (val_type_is_valid (var_type)); if ((var_type == VAL_STRING) != (fmt_is_string (format->type) != 0)) { char str[FMT_STRING_LEN_MAX + 1]; msg (SE, _("%s variables are not compatible with %s format %s."), var_type == VAL_STRING ? _("String") : _("Numeric"), var_type == VAL_STRING ? _("numeric") : _("string"), fmt_to_string (format, str)); return false; } return true; } /* Checks that FORMAT is appropriate for a variable of the given WIDTH and returns true if so. Otherwise returns false and emits an error message. */ bool fmt_check_width_compat (const struct fmt_spec *format, int width) { if (!fmt_check_type_compat (format, val_type_from_width (width))) return false; if (fmt_var_width (format) != width) { char str[FMT_STRING_LEN_MAX + 1]; msg (SE, _("String variable with width %d is not compatible with " "format %s."), width, fmt_to_string (format, str)); return false; } return true; } /* Returns the width corresponding to FORMAT. The return value is the width of the `union value's required by FORMAT. */ int fmt_var_width (const struct fmt_spec *format) { return (format->type == FMT_AHEX ? format->w / 2 : format->type == FMT_A ? format->w : 0); } /* Converts F to its string representation (for instance, "F8.2") in BUFFER. Returns BUFFER. If F has decimals, they are included in the output string, even if F's format type does not allow decimals, to allow accurately presenting incorrect formats to the user. */ char * fmt_to_string (const struct fmt_spec *f, char buffer[FMT_STRING_LEN_MAX + 1]) { if (fmt_takes_decimals (f->type) || f->d > 0) snprintf (buffer, FMT_STRING_LEN_MAX + 1, "%s%d.%d", fmt_name (f->type), f->w, f->d); else snprintf (buffer, FMT_STRING_LEN_MAX + 1, "%s%d", fmt_name (f->type), f->w); return buffer; } /* Returns true if A and B are identical formats, false otherwise. */ bool fmt_equal (const struct fmt_spec *a, const struct fmt_spec *b) { return a->type == b->type && a->w == b->w && a->d == b->d; } /* Adjusts FMT to be valid for a value of the given WIDTH if necessary. If nothing needed to be changed the return value is false */ bool fmt_resize (struct fmt_spec *fmt, int width) { if ((width > 0) != fmt_is_string (fmt->type)) { /* Changed from numeric to string or vice versa. Set to default format for new width. */ *fmt = fmt_default_for_width (width); } else if (width > 0) { /* Changed width of string. Preserve format type, adjust width. */ fmt->w = fmt->type == FMT_AHEX ? width * 2 : width; } else { /* Still numeric. */ return false; } return true; } /* Adjusts FMT's width and decimal places to be valid for USE. */ void fmt_fix (struct fmt_spec *fmt, enum fmt_use use) { /* Clamp width to those allowed by format. */ fmt_clamp_width (fmt, use); /* If FMT has more decimal places than allowed, attempt to increase FMT's width until that number of decimal places can be achieved. */ if (fmt->d > fmt_max_decimals (fmt->type, fmt->w, use) && fmt_takes_decimals (fmt->type)) { int max_w = fmt_max_width (fmt->type, use); for (; fmt->w < max_w; fmt->w++) if (fmt->d <= fmt_max_decimals (fmt->type, fmt->w, use)) break; } /* Clamp decimals to those allowed by format and width. */ fmt_clamp_decimals (fmt, use); } /* Adjusts FMT's width and decimal places to be valid for an input format. */ void fmt_fix_input (struct fmt_spec *fmt) { fmt_fix (fmt, FMT_FOR_INPUT); } /* Adjusts FMT's width and decimal places to be valid for an output format. */ void fmt_fix_output (struct fmt_spec *fmt) { fmt_fix (fmt, FMT_FOR_OUTPUT); } /* Sets FMT's width to WIDTH (or the nearest width allowed by FMT's type) and reduces its decimal places as necessary (if necessary) for that width. */ void fmt_change_width (struct fmt_spec *fmt, int width, enum fmt_use use) { fmt->w = width; fmt_clamp_width (fmt, use); fmt_clamp_decimals (fmt, use); } /* Sets FMT's decimal places to DECIMALS (or the nearest number of decimal places allowed by FMT's type) and increases its width as necessary (if necessary) for that number of decimal places. */ void fmt_change_decimals (struct fmt_spec *fmt, int decimals, enum fmt_use use) { fmt->d = decimals; fmt_fix (fmt, use); } /* Describes a display format. */ struct fmt_desc { char name[9]; int min_input_width, min_output_width; int io; enum fmt_category category; }; static const struct fmt_desc *get_fmt_desc (enum fmt_type type); /* Returns the name of the given format TYPE. */ const char * fmt_name (enum fmt_type type) { return get_fmt_desc (type)->name; } /* Tries to parse NAME as a format type. If successful, stores the type in *TYPE and returns true. On failure, returns false. */ bool fmt_from_name (const char *name, enum fmt_type *type) { int i; for (i = 0; i < FMT_NUMBER_OF_FORMATS; i++) if (!c_strcasecmp (name, get_fmt_desc (i)->name)) { *type = i; return true; } return false; } /* Returns true if TYPE accepts decimal places, false otherwise. */ bool fmt_takes_decimals (enum fmt_type type) { return fmt_max_output_decimals (type, fmt_max_output_width (type)) > 0; } /* Returns the minimum width of the given format TYPE for the given USE. */ int fmt_min_width (enum fmt_type type, enum fmt_use use) { return (use == FMT_FOR_INPUT ? fmt_min_input_width (type) : fmt_min_output_width (type)); } /* Returns the maximum width of the given format TYPE, for input if FOR_INPUT is true, for output otherwise. */ int fmt_max_width (enum fmt_type type, enum fmt_use use UNUSED) { /* Maximum width is actually invariant of whether the format is for input or output, so FOR_INPUT is unused. */ assert (is_fmt_type (type)); switch (type) { case FMT_P: case FMT_PK: case FMT_PIBHEX: case FMT_RBHEX: return 16; case FMT_IB: case FMT_PIB: case FMT_RB: return 8; case FMT_A: return MAX_STRING; case FMT_AHEX: return 2 * MAX_STRING; default: return 40; } } /* Returns the maximum number of decimal places allowed for the given format TYPE with a width of WIDTH places, for the given USE. */ int fmt_max_decimals (enum fmt_type type, int width, enum fmt_use use) { int max_d; switch (type) { case FMT_F: case FMT_COMMA: case FMT_DOT: max_d = use == FMT_FOR_INPUT ? width : width - 1; break; case FMT_DOLLAR: case FMT_PCT: max_d = use == FMT_FOR_INPUT ? width : width - 2; break; case FMT_E: max_d = use == FMT_FOR_INPUT ? width : width - 7; break; case FMT_CCA: case FMT_CCB: case FMT_CCC: case FMT_CCD: case FMT_CCE: assert (use == FMT_FOR_OUTPUT); max_d = width - 1; break; case FMT_N: case FMT_Z: max_d = width; break; case FMT_P: max_d = width * 2 - 1; break; case FMT_PK: max_d = width * 2; break; case FMT_IB: case FMT_PIB: max_d = max_digits_for_bytes (width); break; case FMT_PIBHEX: max_d = 0; break; case FMT_RB: case FMT_RBHEX: max_d = 16; break; case FMT_DATE: case FMT_ADATE: case FMT_EDATE: case FMT_JDATE: case FMT_SDATE: case FMT_QYR: case FMT_MOYR: case FMT_WKYR: max_d = 0; break; case FMT_DATETIME: max_d = width - 21; break; case FMT_YMDHMS: max_d = width - 20; break; case FMT_MTIME: max_d = width - 6; break; case FMT_TIME: max_d = width - 9; break; case FMT_DTIME: max_d = width - 12; break; case FMT_WKDAY: case FMT_MONTH: case FMT_A: case FMT_AHEX: max_d = 0; break; default: NOT_REACHED (); } if (max_d < 0) max_d = 0; else if (max_d > 16) max_d = 16; return max_d; } /* Returns the minimum acceptable width for an input field formatted with the given TYPE. */ int fmt_min_input_width (enum fmt_type type) { return get_fmt_desc (type)->min_input_width; } /* Returns the maximum acceptable width for an input field formatted with the given TYPE. */ int fmt_max_input_width (enum fmt_type type) { return fmt_max_width (type, FMT_FOR_INPUT); } /* Returns the maximum number of decimal places allowed in an input field of the given TYPE and WIDTH. */ int fmt_max_input_decimals (enum fmt_type type, int width) { assert (valid_width (type, width, true)); return fmt_max_decimals (type, width, FMT_FOR_INPUT); } /* Returns the minimum acceptable width for an output field formatted with the given TYPE. */ int fmt_min_output_width (enum fmt_type type) { return get_fmt_desc (type)->min_output_width; } /* Returns the maximum acceptable width for an output field formatted with the given TYPE. */ int fmt_max_output_width (enum fmt_type type) { return fmt_max_width (type, FMT_FOR_OUTPUT); } /* Returns the maximum number of decimal places allowed in an output field of the given TYPE and WIDTH. */ int fmt_max_output_decimals (enum fmt_type type, int width) { assert (valid_width (type, width, false)); return fmt_max_decimals (type, width, FMT_FOR_OUTPUT); } /* Returns the width step for a field formatted with the given TYPE. Field width must be a multiple of the width step. */ int fmt_step_width (enum fmt_type type) { return (fmt_get_category (type) == FMT_CAT_HEXADECIMAL || type == FMT_AHEX ? 2 : 1); } /* Returns true if TYPE is used for string fields, false if it is used for numeric fields. */ bool fmt_is_string (enum fmt_type type) { return fmt_get_category (type) == FMT_CAT_STRING; } /* Returns true if TYPE is used for numeric fields, false if it is used for string fields. */ bool fmt_is_numeric (enum fmt_type type) { return !fmt_is_string (type); } /* Returns the format TYPE's category. Each format type is in exactly one category, and each category's value is bitwise disjoint from every other category. Thus, the return value may be tested for equality or compared bitwise against a mask of FMT_CAT_* values. */ enum fmt_category fmt_get_category (enum fmt_type type) { return get_fmt_desc (type)->category; } /* Returns the output format selected by default when TYPE is used as an input format. */ enum fmt_type fmt_input_to_output (enum fmt_type type) { switch (fmt_get_category (type)) { case FMT_CAT_STRING: return FMT_A; case FMT_CAT_LEGACY: case FMT_CAT_BINARY: case FMT_CAT_HEXADECIMAL: return FMT_F; default: return type; } } /* Returns the SPSS format type corresponding to the given PSPP format type. */ int fmt_to_io (enum fmt_type type) { return get_fmt_desc (type)->io; } /* Determines the PSPP format corresponding to the given SPSS format type. If successful, sets *FMT_TYPE to the PSPP format and returns true. On failure, return false. */ bool fmt_from_io (int io, enum fmt_type *fmt_type) { switch (io) { #define FMT(NAME, METHOD, IMIN, OMIN, IO, CATEGORY) \ case IO: \ *fmt_type = FMT_##NAME; \ return true; #include "format.def" default: return false; } } /* Translate U32, which is in the form found in SAV and SPV files, into a format specification, and stores the new specification in *F. If LOOSE is false, checks that the format specification is appropriate as an output format for a variable with the given WIDTH and reports an error if not. If LOOSE is true, instead adjusts the format's width and decimals as necessary to be suitable. Return true if successful, false if there was an error.. */ bool fmt_from_u32 (uint32_t u32, int width, bool loose, struct fmt_spec *f) { uint8_t raw_type = u32 >> 16; uint8_t w = u32 >> 8; uint8_t d = u32; msg_disable (); f->w = w; f->d = d; bool ok = fmt_from_io (raw_type, &f->type); if (ok) { if (loose) fmt_fix_output (f); else ok = fmt_check_output (f); } if (ok) ok = fmt_check_width_compat (f, width); msg_enable (); return ok; } /* Returns true if TYPE may be used as an input format, false otherwise. */ bool fmt_usable_for_input (enum fmt_type type) { assert (is_fmt_type (type)); return fmt_get_category (type) != FMT_CAT_CUSTOM; } /* For time and date formats, returns a template used for input and output in a field of the given WIDTH. WIDTH only affects whether a 2-digit year or a 4-digit year is used, that is, whether the returned string contains "yy" or "yyyy", and whether seconds are include, that is, whether the returned string contains ":SS". A caller that doesn't care whether the returned string contains "yy" or "yyyy" or ":SS" can just specify 0 to omit them. */ const char * fmt_date_template (enum fmt_type type, int width) { const char *s1, *s2; switch (type) { case FMT_DATE: s1 = "dd-mmm-yy"; s2 = "dd-mmm-yyyy"; break; case FMT_ADATE: s1 = "mm/dd/yy"; s2 = "mm/dd/yyyy"; break; case FMT_EDATE: s1 = "dd.mm.yy"; s2 = "dd.mm.yyyy"; break; case FMT_JDATE: s1 = "yyddd"; s2 = "yyyyddd"; break; case FMT_SDATE: s1 = "yy/mm/dd"; s2 = "yyyy/mm/dd"; break; case FMT_QYR: s1 = "q Q yy"; s2 = "q Q yyyy"; break; case FMT_MOYR: s1 = "mmm yy"; s2 = "mmm yyyy"; break; case FMT_WKYR: s1 = "ww WK yy"; s2 = "ww WK yyyy"; break; case FMT_DATETIME: s1 = "dd-mmm-yyyy HH:MM"; s2 = "dd-mmm-yyyy HH:MM:SS"; break; case FMT_YMDHMS: s1 = "yyyy-mm-dd HH:MM"; s2 = "yyyy-mm-dd HH:MM:SS"; break; case FMT_MTIME: s1 = "MM"; s2 = "MM:SS"; break; case FMT_TIME: s1 = "HH:MM"; s2 = "HH:MM:SS"; break; case FMT_DTIME: s1 = "D HH:MM"; s2 = "D HH:MM:SS"; break; default: NOT_REACHED (); } return width >= strlen (s2) ? s2 : s1; } /* Returns a string representing the format TYPE for use in a GUI dialog. */ const char * fmt_gui_name (enum fmt_type type) { switch (type) { case FMT_F: return _("Numeric"); case FMT_COMMA: return _("Comma"); case FMT_DOT: return _("Dot"); case FMT_E: return _("Scientific"); case FMT_DATE: case FMT_EDATE: case FMT_SDATE: case FMT_ADATE: case FMT_JDATE: case FMT_QYR: case FMT_MOYR: case FMT_WKYR: case FMT_DATETIME: case FMT_YMDHMS: case FMT_MTIME: case FMT_TIME: case FMT_DTIME: case FMT_WKDAY: case FMT_MONTH: return _("Date"); case FMT_DOLLAR: return _("Dollar"); case FMT_CCA: case FMT_CCB: case FMT_CCC: case FMT_CCD: case FMT_CCE: return _("Custom"); case FMT_A: return _("String"); default: return fmt_name (type); } } /* Returns true if TYPE is a valid format type, false otherwise. */ bool is_fmt_type (enum fmt_type type) { return type < FMT_NUMBER_OF_FORMATS; } /* Returns true if WIDTH is a valid width for the given format TYPE, for the given USE. */ static bool valid_width (enum fmt_type type, int width, enum fmt_use use) { return (width >= fmt_min_width (type, use) && width <= fmt_max_width (type, use)); } /* Returns the maximum number of decimal digits in an unsigned binary number that is BYTES bytes long. */ static int max_digits_for_bytes (int bytes) { int map[8] = {3, 5, 8, 10, 13, 15, 17, 20}; assert (bytes > 0 && bytes <= sizeof map / sizeof *map); return map[bytes - 1]; } /* Clamp FMT's width to the range and values allowed by FMT's type. */ static void fmt_clamp_width (struct fmt_spec *fmt, enum fmt_use use) { unsigned int step; int min_w, max_w; min_w = fmt_min_width (fmt->type, use); max_w = fmt_max_width (fmt->type, use); if (fmt->w < min_w) fmt->w = min_w; else if (fmt->w > max_w) fmt->w = max_w; /* Round width to step. */ step = fmt_step_width (fmt->type); fmt->w = ROUND_DOWN (fmt->w, step); } /* Clamp FMT's decimal places to the range allowed by FMT's type and width. */ static void fmt_clamp_decimals (struct fmt_spec *fmt, enum fmt_use use) { int max_d; max_d = fmt_max_decimals (fmt->type, fmt->w, use); if (fmt->d < 0) fmt->d = 0; else if (fmt->d > max_d) fmt->d = max_d; } /* Sets AFFIX's string value to S, a UTF-8 encoded string. */ static void fmt_affix_set (struct fmt_affix *affix, const char *s) { affix->s = s[0] == '\0' ? CONST_CAST (char *, "") : xstrdup (s); affix->width = u8_strwidth (CHAR_CAST (const uint8_t *, s), "UTF-8"); } /* Frees data in AFFIX. */ static void fmt_affix_free (struct fmt_affix *affix) { if (affix->s[0]) free (affix->s); } static void fmt_number_style_init (struct fmt_number_style *style) { fmt_affix_set (&style->neg_prefix, ""); fmt_affix_set (&style->prefix, ""); fmt_affix_set (&style->suffix, ""); fmt_affix_set (&style->neg_suffix, ""); style->decimal = '.'; style->grouping = 0; } static void fmt_number_style_clone (struct fmt_number_style *new, const struct fmt_number_style *old) { fmt_affix_set (&new->neg_prefix, old->neg_prefix.s); fmt_affix_set (&new->prefix, old->prefix.s); fmt_affix_set (&new->suffix, old->suffix.s); fmt_affix_set (&new->neg_suffix, old->neg_suffix.s); new->decimal = old->decimal; new->grouping = old->grouping; new->extra_bytes = old->extra_bytes; } /* Destroys a struct fmt_number_style. */ static void fmt_number_style_destroy (struct fmt_number_style *style) { if (style != NULL) { fmt_affix_free (&style->neg_prefix); fmt_affix_free (&style->prefix); fmt_affix_free (&style->suffix); fmt_affix_free (&style->neg_suffix); } } /* Returns the total width of the standard prefix and suffix for STYLE, in display columns (e.g. as returned by u8_strwidth()). */ int fmt_affix_width (const struct fmt_number_style *style) { return style->prefix.width + style->suffix.width; } /* Returns the total width of the negative prefix and suffix for STYLE, in display columns (e.g. as returned by u8_strwidth()). */ int fmt_neg_affix_width (const struct fmt_number_style *style) { return style->neg_prefix.width + style->neg_suffix.width; } /* Returns the struct fmt_desc for the given format TYPE. */ static const struct fmt_desc * get_fmt_desc (enum fmt_type type) { static const struct fmt_desc formats[FMT_NUMBER_OF_FORMATS] = { #define FMT(NAME, METHOD, IMIN, OMIN, IO, CATEGORY) \ {#NAME, IMIN, OMIN, IO, CATEGORY}, #include "format.def" }; assert (is_fmt_type (type)); return &formats[type]; } const struct fmt_spec F_8_0 = {FMT_F, 8, 0}; const struct fmt_spec F_8_2 = {FMT_F, 8, 2}; const struct fmt_spec F_4_3 = {FMT_F, 4, 3}; const struct fmt_spec F_5_1 = {FMT_F, 5, 1}; pspp-1.4.1/src/data/vardict.h0000644000175000017500000000366113320146056015426 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 1997-9, 2000, 2009 Free Software Foundation, Inc. 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 3 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, see . */ #ifndef DATA_VARDICT_H #define DATA_VARDICT_H 1 /* Interface between dictionary and variable code. This header file should only be included by variable.c and dictionary.c. */ struct dictionary ; /* Binds a variable to a dictionary. */ struct vardict_info { struct dictionary *dict; struct variable *var; struct hmap_node name_node; /* In struct dictionary's name_map. */ int case_index; /* Index into case of variable data. */ }; /* Called by dictionary code, defined in variable.c. */ struct vardict_info *var_get_vardict (const struct variable *); void var_set_vardict (struct variable *, struct vardict_info *); bool var_has_vardict (const struct variable *); void var_clear_vardict (struct variable *); /* Called by variable.c, defined in dictionary.c. */ void dict_var_changed (const struct variable *v, unsigned int what, struct variable *ov); int vardict_get_dict_index (const struct vardict_info *); static inline int vardict_get_case_index (const struct vardict_info *vardict) { return vardict->case_index; } static inline struct dictionary * vardict_get_dictionary (const struct vardict_info *vardict) { return vardict->dict; } #endif /* data/vardict.h */ pspp-1.4.1/src/data/vector.c0000644000175000017500000000771213320146056015270 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2006, 2010, 2011, 2012 Free Software Foundation, Inc. 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 3 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, see . */ #include #include "data/vector.h" #include #include "data/dictionary.h" #include "data/identifier.h" #include "libpspp/assertion.h" #include "libpspp/i18n.h" #include "libpspp/str.h" #include "gl/xalloc.h" /* Vector of variables. */ struct vector { char *name; /* Name. */ struct variable **vars; /* Set of variables. */ size_t var_cnt; /* Number of variables. */ }; /* Checks that all the variables in VECTOR have consistent width. */ static void check_widths (const struct vector *vector) { int width = var_get_width (vector->vars[0]); size_t i; for (i = 1; i < vector->var_cnt; i++) assert (width == var_get_width (vector->vars[i])); } /* Creates and returns a new vector with the given UTF-8 encoded NAME that contains the VAR_CNT variables in VARS. All variables in VARS must have the same type and width. */ struct vector * vector_create (const char *name, struct variable **vars, size_t var_cnt) { struct vector *vector = xmalloc (sizeof *vector); assert (var_cnt > 0); assert (id_is_plausible (name, false)); vector->name = xstrdup (name); vector->vars = xmemdup (vars, var_cnt * sizeof *vector->vars); vector->var_cnt = var_cnt; check_widths (vector); return vector; } /* Creates and returns a new vector as a clone of OLD, but that contains variables from NEW_DICT that are in the same position as those in OLD are in OLD_DICT. All variables in the new vector must have the same type and width. */ struct vector * vector_clone (const struct vector *old, const struct dictionary *old_dict, const struct dictionary *new_dict) { struct vector *new = xmalloc (sizeof *new); size_t i; new->name = xstrdup (old->name); new->vars = xnmalloc (old->var_cnt, sizeof *new->vars); new->var_cnt = old->var_cnt; for (i = 0; i < new->var_cnt; i++) { assert (dict_contains_var (old_dict, old->vars[i])); new->vars[i] = dict_get_var (new_dict, var_get_dict_index (old->vars[i])); } check_widths (new); return new; } /* Destroys VECTOR. */ void vector_destroy (struct vector *vector) { free (vector->name); free (vector->vars); free (vector); } /* Returns VECTOR's name, as a UTF-8 encoded string. */ const char * vector_get_name (const struct vector *vector) { return vector->name; } /* Returns the type of the variables in VECTOR. */ enum val_type vector_get_type (const struct vector *vector) { return var_get_type (vector->vars[0]); } /* Returns the variable in VECTOR with the given INDEX. */ struct variable * vector_get_var (const struct vector *vector, size_t index) { assert (index < vector->var_cnt); return vector->vars[index]; } /* Returns the number of variables in VECTOR. */ size_t vector_get_var_cnt (const struct vector *vector) { return vector->var_cnt; } /* Compares two pointers to vectors represented by A and B and returns a strcmp()-type result. */ int compare_vector_ptrs_by_name (const void *a_, const void *b_) { struct vector *const *pa = a_; struct vector *const *pb = b_; struct vector *a = *pa; struct vector *b = *pb; return utf8_strcasecmp (a->name, b->name); } pspp-1.4.1/src/data/short-names.h0000644000175000017500000000304713320146056016230 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2007 Free Software Foundation, Inc. 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 3 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, see . */ /* Short names for variables. PSPP allows variable names to be up to 64 bytes long, but the system and portable file formats require that each variable have a unique name no more than 8 bytes long, called its "short name". Furthermore, each "very long" string variable that is more than 255 bytes long has to be divided into multiple long string variables within that limit, and each of these segments must also have its own unique short name. The function in this module generates short names for variables with long names or that have very long string width. */ #ifndef DATA_SHORT_NAMES_H #define DATA_SHORT_NAMES_H 1 struct dictionary; /* Maximum length of a short name, in bytes. */ #define SHORT_NAME_LEN 8 void short_names_assign (struct dictionary *); #endif /* data/short-names.h */ pspp-1.4.1/src/data/casewindow.h0000644000175000017500000000403113320146056016125 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2007, 2009, 2011 Free Software Foundation, Inc. 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 3 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, see . */ /* Sliding window over a set of cases. A casewindow is a queue of cases: cases may be added at the head of the queue and deleted from the tail. A casewindow is initially maintained in memory and then, should it grow too large, is dumped to disk. Any case in the casewindow may be accessed, not just the case at the head. Cases are numbered relative to the tail: the least recently added case is number 0, and so on. */ #ifndef DATA_CASEWINDOW_H #define DATA_CASEWINDOW_H 1 #include "data/case.h" struct caseproto; struct casewindow *casewindow_create (const struct caseproto *, casenumber max_in_core_cases); bool casewindow_destroy (struct casewindow *); void casewindow_push_head (struct casewindow *, struct ccase *); void casewindow_pop_tail (struct casewindow *, casenumber cnt); struct ccase *casewindow_get_case (const struct casewindow *, casenumber case_idx); const struct caseproto *casewindow_get_proto (const struct casewindow *); casenumber casewindow_get_case_cnt (const struct casewindow *); bool casewindow_error (const struct casewindow *); void casewindow_force_error (struct casewindow *); const struct taint *casewindow_get_taint (const struct casewindow *); #endif /* data/casewindow.h */ pspp-1.4.1/src/data/sys-file-encoding.pl0000755000175000017500000000726013320146056017477 0ustar00blpblp00000000000000#! /usr/bin/perl use strict; use warnings; if (-t 0 || @ARGV) { print < sys-file-encoding.c To regenerate the encoding data, get the latest ICU encoding data from: http://source.icu-project.org/repos/icu/icu/trunk/source/data/mappings/convrtrs.txt then convert it with this script using the command above. EOF exit (@ARGV && $ARGV[0] eq '--help' ? 0 : 1); } open (CONVERTERS, '<', 'convrtrs.txt') or die "convrtrs.txt: open failed ($!)\n"; our $WINDOWS = 3; # Windows code pages. our $IBM = 2; # IBM code pages. our $CP = 1; # Java (?) code pages. our %sources = ($WINDOWS => "windows", $IBM => "ibm", $CP => "cp"); my $converter = ""; while () { chomp; s/#.*//; if (s/^\s+//) { $converter .= " $_"; } else { process_converter ($converter); $converter = $_; } } process_converter ($converter); close (CONVERTERS); our %codepages; print <<'EOF'; /* -*- mode: c; buffer-read-only: t -*- Generated by sys-file-encoding.pl. Do not modify! */ #include #include "data/sys-file-private.h" struct sys_encoding sys_codepage_number_to_name[] = { EOF for my $cpnumber (sort { $a <=> $b } (keys (%codepages))) { my $source = max (keys (%{$codepages{$cpnumber}})); my $name = ${$codepages{$cpnumber}{$source}}[0]; print " { $cpnumber, \"$name\" },\n"; } print " { 0, NULL }\n"; print "};\n\n"; my %names; for my $cpnumber (sort { $a <=> $b } (keys (%codepages))) { for my $source (keys (%{$codepages{$cpnumber}})) { for my $name (@{$codepages{$cpnumber}{$source}}) { push(@{$names{$name}{$source}}, $cpnumber); } } } print "struct sys_encoding sys_codepage_name_to_number[] = {\n"; for my $name (sort (keys (%names))) { for my $source (reverse (sort (keys (%sources)))) { next if !exists ($names{$name}{$source}); my (@numbers) = @{$names{$name}{$source}}; # The only two encodings that currently print this are KSC_5601 # and KS_C_5601-1987, for code pages 949 and 51949. It looks to # me like the correct code page number is 949, which is the one # chosen (because the numbers are in sorted order). print " /* $name has multiple numbers for $sources{$source}: @numbers */\n" if @numbers > 1; print " { $numbers[0], \"$name\" },\n"; last; } } print " { 0, NULL }\n"; print "};\n"; sub process_converter { my ($converter) = @_; return if $converter =~ /^\s*$/; return if $converter =~ /^\s*\{/; my %cps; my @iana; my @other; my @fields = split (' ', $converter); while (@fields) { my $name = shift (@fields); if (@fields && $fields[0] eq '{') { shift (@fields); my (%standards); for (;;) { my $standard = shift (@fields); last if $standard eq '}'; $standards{$standard} = 1; } if (exists $standards{'IANA*'}) { unshift (@iana, $name); } elsif (exists $standards{'IANA'}) { push (@iana, $name); } elsif (grep (/\*$/, keys %standards)) { unshift (@other, $name); } else { push (@other, $name); } } else { # Untagged names are completely nonstandard. next; } my $number; if (($number) = $name =~ /^cp([0-9]+)$/) { $cps{$CP} = int ($number); } elsif (($number) = $name =~ /^windows-([0-9]+)$/) { $cps{$WINDOWS} = int ($number); } elsif (($number) = $name =~ /^ibm-([0-9]+)$/) { $cps{$IBM} = int ($number); } else { next; } } # If there are no tagged names then this is completely nonstandard. return if !@iana && !@other; $codepages{$cps{$_}}{$_} = [@iana, @other] for keys (%cps); } sub max { my ($best); for my $x (@_) { $best = $x if !defined ($best) || $x > $best; } return $best; } pspp-1.4.1/src/data/settings.c0000644000175000017500000004200713670210420015615 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 1997-9, 2000, 2006, 2007, 2009, 2010, 2011, 2015 Free Software Foundation, Inc. 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 3 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, see . */ #include #include "data/settings.h" #include #include #include #include "data/case.h" #include "data/format.h" #include "data/value.h" #include "libpspp/i18n.h" #include "libpspp/integer-format.h" #include "libpspp/message.h" #include "gl/minmax.h" #include "gl/xalloc.h" #include "gettext.h" #define _(msgid) gettext (msgid) struct settings { /* Integer format used for IB and PIB input. */ enum integer_format input_integer_format; /* Floating-point format used for RB and RBHEX input. */ enum float_format input_float_format; /* Format of integers in output (SET WIB). */ enum integer_format output_integer_format; /* Format of reals in output (SET WRB). */ enum float_format output_float_format; int viewlength; int viewwidth; bool safer_mode; bool include; int epoch; bool route_errors_to_terminal; bool route_errors_to_listing; bool scompress; bool undefined; double blanks; int max_messages[MSG_N_SEVERITIES]; bool printback; bool mprint; int mxloops; size_t workspace; struct fmt_spec default_format; bool testing_mode; int fuzzbits; int cmd_algorithm; int global_algorithm; int syntax; struct fmt_settings *styles; enum settings_output_devices output_routing[SETTINGS_N_OUTPUT_TYPES]; enum settings_value_show show_values; enum settings_value_show show_variables; }; static struct settings the_settings = { INTEGER_NATIVE, /* input_integer_format */ FLOAT_NATIVE_DOUBLE, /* input_float_format */ INTEGER_NATIVE, /* output_integer_format */ FLOAT_NATIVE_DOUBLE, /* output_float_format */ 24, /* viewlength */ 79, /* viewwidth */ false, /* safer_mode */ true, /* include */ -1, /* epoch */ true, /* route_errors_to_terminal */ true, /* route_errors_to_listing */ true, /* scompress */ true, /* undefined */ SYSMIS, /* blanks */ /* max_messages */ { 100, /* MSG_S_ERROR */ 100, /* MSG_S_WARNING */ 100 /* MSG_S_NOTE */ }, true, /* printback */ true, /* mprint */ 40, /* mxloops */ 64L * 1024 * 1024, /* workspace */ {FMT_F, 8, 2}, /* default_format */ false, /* testing_mode */ 6, /* fuzzbits */ ENHANCED, /* cmd_algorithm */ ENHANCED, /* global_algorithm */ ENHANCED, /* syntax */ NULL, /* styles */ /* output_routing */ {SETTINGS_DEVICE_LISTING | SETTINGS_DEVICE_TERMINAL, SETTINGS_DEVICE_LISTING | SETTINGS_DEVICE_TERMINAL, 0, SETTINGS_DEVICE_LISTING | SETTINGS_DEVICE_TERMINAL}, SETTINGS_VALUE_SHOW_LABEL, SETTINGS_VALUE_SHOW_LABEL }; /* Initializes the settings module. */ void settings_init (void) { settings_set_epoch (-1); the_settings.styles = fmt_settings_create (); settings_set_decimal_char (get_system_decimal ()); } /* Cleans up the settings module. */ void settings_done (void) { settings_destroy (&the_settings); } static void settings_copy (struct settings *dst, const struct settings *src) { *dst = *src; dst->styles = fmt_settings_clone (src->styles); } /* Returns a copy of the current settings. */ struct settings * settings_get (void) { struct settings *s = xmalloc (sizeof *s); settings_copy (s, &the_settings); return s; } /* Replaces the current settings by those in S. The caller retains ownership of S. */ void settings_set (const struct settings *s) { settings_destroy (&the_settings); settings_copy (&the_settings, s); } /* Destroys S. */ void settings_destroy (struct settings *s) { if (s != NULL) { fmt_settings_destroy (s->styles); if (s != &the_settings) free (s); } } /* Returns the floating-point format used for RB and RBHEX input. */ enum float_format settings_get_input_float_format (void) { return the_settings.input_float_format; } /* Sets the floating-point format used for RB and RBHEX input to FORMAT. */ void settings_set_input_float_format (enum float_format format) { the_settings.input_float_format = format; } /* Returns the integer format used for IB and PIB input. */ enum integer_format settings_get_input_integer_format (void) { return the_settings.input_integer_format; } /* Sets the integer format used for IB and PIB input to FORMAT. */ void settings_set_input_integer_format (enum integer_format format) { the_settings.input_integer_format = format; } /* Returns the current output integer format. */ enum integer_format settings_get_output_integer_format (void) { return the_settings.output_integer_format; } /* Sets the output integer format to INTEGER_FORMAT. */ void settings_set_output_integer_format ( enum integer_format integer_format) { the_settings.output_integer_format = integer_format; } /* Returns the current output float format. */ enum float_format settings_get_output_float_format (void) { return the_settings.output_float_format; } /* Sets the output float format to FLOAT_FORMAT. */ void settings_set_output_float_format (enum float_format float_format) { the_settings.output_float_format = float_format; } /* Screen length in lines. */ int settings_get_viewlength (void) { return the_settings.viewlength; } /* Sets the view length. */ void settings_set_viewlength (int viewlength_) { the_settings.viewlength = viewlength_; } /* Screen width. */ int settings_get_viewwidth(void) { return the_settings.viewwidth; } /* Sets the screen width. */ void settings_set_viewwidth (int viewwidth_) { the_settings.viewwidth = viewwidth_; } /* Whether PSPP can erase and overwrite files. */ bool settings_get_safer_mode (void) { return the_settings.safer_mode; } /* Set safer mode. */ void settings_set_safer_mode (void) { the_settings.safer_mode = true; } /* If echo is on, whether commands from include files are echoed. */ bool settings_get_include (void) { return the_settings.include; } /* Set include file echo. */ void settings_set_include (bool include) { the_settings.include = include; } /* What year to use as the start of the epoch. */ int settings_get_epoch (void) { assert (the_settings.epoch >= 0); return the_settings.epoch; } /* Sets the year that starts the epoch. */ void settings_set_epoch (int epoch) { if (epoch < 0) { time_t t = time (0); struct tm *tm = localtime (&t); epoch = (tm != NULL ? tm->tm_year + 1900 : 2000) - 69; } the_settings.epoch = epoch; assert (the_settings.epoch >= 0); } /* Compress system files by default? */ bool settings_get_scompression (void) { return the_settings.scompress; } /* Set system file default compression. */ void settings_set_scompression (bool scompress) { the_settings.scompress = scompress; } /* Whether to warn on undefined values in numeric data. */ bool settings_get_undefined (void) { return the_settings.undefined; } /* Set whether to warn on undefined values. */ void settings_set_undefined (bool undefined) { the_settings.undefined = undefined; } /* The value that blank numeric fields are set to when read in. */ double settings_get_blanks (void) { return the_settings.blanks; } /* Set the value that blank numeric fields are set to when read in. */ void settings_set_blanks (double blanks) { the_settings.blanks = blanks; } /* Returns the maximum number of messages to show of the given SEVERITY before aborting. (The value for MSG_S_WARNING is interpreted as maximum number of warnings and errors combined.) */ int settings_get_max_messages (enum msg_severity severity) { assert (severity < MSG_N_SEVERITIES); return the_settings.max_messages[severity]; } /* Sets the maximum number of messages to show of the given SEVERITY before aborting to MAX. (The value for MSG_S_WARNING is interpreted as maximum number of warnings and errors combined.) In addition, in the case of warnings the special value of zero indicates that no warnings are to be issued. */ void settings_set_max_messages (enum msg_severity severity, int max) { assert (severity < MSG_N_SEVERITIES); if (severity == MSG_S_WARNING) { if (max == 0) { msg (MW, _("MXWARNS set to zero. No further warnings will be given even when potentially problematic situations are encountered.")); msg_ui_disable_warnings (true); } else if (the_settings.max_messages [MSG_S_WARNING] == 0) { msg_ui_disable_warnings (false); the_settings.max_messages[MSG_S_WARNING] = max; msg (MW, _("Warnings re-enabled. %d warnings will be issued before aborting syntax processing."), max); } } the_settings.max_messages[severity] = max; } /* Independent of get_printback, controls whether the commands generated by macro invocations are displayed. */ bool settings_get_mprint (void) { return the_settings.mprint; } /* Sets whether the commands generated by macro invocations are displayed. */ void settings_set_mprint (bool mprint) { the_settings.mprint = mprint; } /* Implied limit of unbounded loop. */ int settings_get_mxloops (void) { return the_settings.mxloops; } /* Set implied limit of unbounded loop. */ void settings_set_mxloops (int mxloops) { the_settings.mxloops = mxloops; } /* Approximate maximum amount of memory to use for cases, in bytes. */ size_t settings_get_workspace (void) { return the_settings.workspace; } /* Approximate maximum number of cases to allocate in-core, given that each case has the format given in PROTO. */ size_t settings_get_workspace_cases (const struct caseproto *proto) { size_t n_cases = settings_get_workspace () / case_get_cost (proto); return MAX (n_cases, 4); } /* Set approximate maximum amount of memory to use for cases, in bytes. */ void settings_set_workspace (size_t workspace) { the_settings.workspace = workspace; } /* Default format for variables created by transformations and by DATA LIST {FREE,LIST}. */ const struct fmt_spec * settings_get_format (void) { return &the_settings.default_format; } /* Set default format for variables created by transformations and by DATA LIST {FREE,LIST}. */ void settings_set_format (const struct fmt_spec *default_format) { the_settings.default_format = *default_format; } /* Are we in testing mode? (e.g. --testing-mode command line option) */ bool settings_get_testing_mode (void) { return the_settings.testing_mode; } /* Set testing mode. */ void settings_set_testing_mode (bool testing_mode) { the_settings.testing_mode = testing_mode; } int settings_get_fuzzbits (void) { return the_settings.fuzzbits; } void settings_set_fuzzbits (int fuzzbits) { the_settings.fuzzbits = fuzzbits; } /* Return the current algorithm setting */ enum behavior_mode settings_get_algorithm (void) { return the_settings.cmd_algorithm; } /* Set the algorithm option globally. */ void settings_set_algorithm (enum behavior_mode mode) { the_settings.global_algorithm = the_settings.cmd_algorithm = mode; } /* Set the algorithm option for this command only */ void settings_set_cmd_algorithm (enum behavior_mode mode) { the_settings.cmd_algorithm = mode; } /* Unset the algorithm option for this command */ void unset_cmd_algorithm (void) { the_settings.cmd_algorithm = the_settings.global_algorithm; } /* Get the current syntax setting */ enum behavior_mode settings_get_syntax (void) { return the_settings.syntax; } /* Set the syntax option */ void settings_set_syntax (enum behavior_mode mode) { the_settings.syntax = mode; } /* Find the grouping characters in CC_STRING and sets *GROUPING and *DECIMAL appropriately. Returns true if successful, false otherwise. */ static bool find_cc_separators (const char *cc_string, char *decimal, char *grouping) { const char *sp; int comma_cnt, dot_cnt; /* Count commas and periods. There must be exactly three of one or the other, except that an apostrophe escapes a following comma or period. */ comma_cnt = dot_cnt = 0; for (sp = cc_string; *sp; sp++) if (*sp == ',') comma_cnt++; else if (*sp == '.') dot_cnt++; else if (*sp == '\'' && (sp[1] == '.' || sp[1] == ',' || sp[1] == '\'')) sp++; if ((comma_cnt == 3) == (dot_cnt == 3)) return false; if (comma_cnt == 3) { *decimal = '.'; *grouping = ','; } else { *decimal = ','; *grouping = '.'; } return true; } /* Extracts a token from IN into a newly allocated string AFFIXP. Tokens are delimited by GROUPING. Returns the first character following the token. */ static const char * extract_cc_token (const char *in, int grouping, char **affixp) { char *out; out = *affixp = xmalloc (strlen (in) + 1); for (; *in != '\0' && *in != grouping; in++) { if (*in == '\'' && in[1] == grouping) in++; *out++ = *in; } *out = '\0'; if (*in == grouping) in++; return in; } /* Sets custom currency specifier CC having name CC_NAME ('A' through 'E') to correspond to the settings in CC_STRING. */ bool settings_set_cc (const char *cc_string, enum fmt_type type) { char *neg_prefix, *prefix, *suffix, *neg_suffix; char decimal, grouping; assert (fmt_get_category (type) == FMT_CAT_CUSTOM); /* Determine separators. */ if (!find_cc_separators (cc_string, &decimal, &grouping)) { msg (SE, _("%s: Custom currency string `%s' does not contain " "exactly three periods or commas (or it contains both)."), fmt_name (type), cc_string); return false; } cc_string = extract_cc_token (cc_string, grouping, &neg_prefix); cc_string = extract_cc_token (cc_string, grouping, &prefix); cc_string = extract_cc_token (cc_string, grouping, &suffix); cc_string = extract_cc_token (cc_string, grouping, &neg_suffix); fmt_settings_set_style (the_settings.styles, type, decimal, grouping, neg_prefix, prefix, suffix, neg_suffix); free (neg_suffix); free (suffix); free (prefix); free (neg_prefix); return true; } /* Returns the decimal point character for TYPE. */ int settings_get_decimal_char (enum fmt_type type) { return fmt_settings_get_style (the_settings.styles, type)->decimal; } void settings_set_decimal_char (char decimal) { fmt_settings_set_decimal (the_settings.styles, decimal); } /* Returns the number formatting style associated with the given format TYPE. */ const struct fmt_number_style * settings_get_style (enum fmt_type type) { assert (is_fmt_type (type)); return fmt_settings_get_style (the_settings.styles, type); } /* Returns a string of the form "$#,###.##" according to FMT, which must be of type FMT_DOLLAR. The caller must free the string. */ char * settings_dollar_template (const struct fmt_spec *fmt) { struct string str = DS_EMPTY_INITIALIZER; int c; const struct fmt_number_style *fns ; assert (fmt->type == FMT_DOLLAR); fns = fmt_settings_get_style (the_settings.styles, fmt->type); ds_put_byte (&str, '$'); for (c = MAX (fmt->w - fmt->d - 1, 0); c > 0;) { ds_put_byte (&str, '#'); if (--c % 4 == 0 && c > 0) { ds_put_byte (&str, fns->grouping); --c; } } if (fmt->d > 0) { ds_put_byte (&str, fns->decimal); ds_put_byte_multiple (&str, '#', fmt->d); } return ds_cstr (&str); } void settings_set_output_routing (enum settings_output_type type, enum settings_output_devices devices) { assert (type < SETTINGS_N_OUTPUT_TYPES); the_settings.output_routing[type] = devices; } enum settings_output_devices settings_get_output_routing (enum settings_output_type type) { assert (type < SETTINGS_N_OUTPUT_TYPES); return the_settings.output_routing[type] | SETTINGS_DEVICE_UNFILTERED; } enum settings_value_show settings_get_show_values (void) { return the_settings.show_values; } void settings_set_show_values (enum settings_value_show s) { the_settings.show_values = s; } enum settings_value_show settings_get_show_variables (void) { return the_settings.show_variables; } void settings_set_show_variables (enum settings_value_show s) { the_settings.show_variables = s; } pspp-1.4.1/src/data/sys-file-writer.h0000644000175000017500000000262613320146056017037 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 1997-9, 2000, 2009, 2013, 2014 Free Software Foundation, Inc. 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 3 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, see . */ #ifndef SFM_WRITE_H #define SFM_WRITE_H 1 #include #include "any-reader.h" /* Writing system files. */ /* Options for creating a system file. */ struct sfm_write_options { enum any_compression compression; bool create_writeable; /* File perms: writeable or read/only? */ int version; /* System file version (currently 2 or 3). */ }; struct file_handle; struct dictionary; struct casewriter *sfm_open_writer (struct file_handle *, struct dictionary *, struct sfm_write_options); struct sfm_write_options sfm_writer_default_options (void); #endif /* sys-file-writer.h */ pspp-1.4.1/src/data/file-handle-def.h0000644000175000017500000001107213673465023016702 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 1997-9, 2000, 2005, 2006, 2010, 2011, 2013 Free Software Foundation, Inc. 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 3 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, see . */ #ifndef FILE_HANDLE_DEF_H #define FILE_HANDLE_DEF_H #include "libpspp/compiler.h" #include #include struct dataset; /* What a file handle refers to. (Ordinarily only a single value is allowed, but fh_open() and fh_parse() take a mask.) */ enum fh_referent { FH_REF_FILE = 001, /* Ordinary file (the most common case). */ FH_REF_INLINE = 002, /* The inline file. */ FH_REF_DATASET = 004 /* Dataset. */ }; /* File modes. */ enum fh_mode { FH_MODE_TEXT, /* New-line delimited lines. */ FH_MODE_FIXED, /* Fixed-length records. */ FH_MODE_VARIABLE, /* Binary variable-length records. */ FH_MODE_360_VARIABLE, /* IBM 360 variable-length records. */ FH_MODE_360_SPANNED, /* IBM 360 variable-length, spanned records. */ }; /* Ways to access a file. */ enum fh_access { FH_ACC_READ, /* Read from it. */ FH_ACC_WRITE /* Write to it. */ }; /* How a line ends. This affects only writing FH_MODE_TEXT files. Writing in other modes does not use line ends, and reading in FH_MODE_TEXT mode accepts all forms of line ends. */ enum fh_line_ends { FH_END_LF, /* Unix line ends (\n). */ FH_END_CRLF /* MS-DOS line ends (\r\n). */ }; /* Properties of a file handle. */ struct fh_properties { enum fh_mode mode; /* File mode. */ enum fh_line_ends line_ends; /* Line ends for text files. */ size_t record_width; /* Length of fixed-format records. */ size_t tab_width; /* Tab width, 0=do not expand tabs. */ const char *encoding; /* Charset for contents. */ }; void fh_init (void); void fh_done (void); /* Creating file handles. */ struct file_handle *fh_create_file (const char *handle_name, const char *file_name, const char *file_name_encoding, const struct fh_properties *); struct file_handle *fh_create_dataset (struct dataset *); const struct fh_properties *fh_default_properties (void); /* Reference management. */ struct file_handle *fh_ref (struct file_handle *) WARN_UNUSED_RESULT; void fh_unref (struct file_handle *); void fh_unname (struct file_handle *); /* Finding file handles. */ struct file_handle *fh_from_id (const char *handle_name); struct file_handle *fh_inline_file (void); /* Generic properties of file handles. */ const char *fh_get_id (const struct file_handle *); const char *fh_get_name (const struct file_handle *); enum fh_referent fh_get_referent (const struct file_handle *); const char *fh_get_encoding (const struct file_handle *); /* Properties of FH_REF_FILE file handles. */ const char *fh_get_file_name (const struct file_handle *); const char *fh_get_file_name_encoding (const struct file_handle *handle); enum fh_mode fh_get_mode (const struct file_handle *) ; enum fh_line_ends fh_get_line_ends (const struct file_handle *); /* Properties of FH_REF_FILE and FH_REF_INLINE file handles. */ size_t fh_get_record_width (const struct file_handle *); size_t fh_get_tab_width (const struct file_handle *); /* Properties of FH_REF_DATASET file handles. */ struct dataset *fh_get_dataset (const struct file_handle *); /* Mutual exclusion for access . */ struct fh_lock *fh_lock (struct file_handle *, enum fh_referent mask, const char *type, enum fh_access, bool exclusive); bool fh_unlock (struct fh_lock *); void *fh_lock_get_aux (const struct fh_lock *); void fh_lock_set_aux (struct fh_lock *, void *aux); bool fh_is_locked (const struct file_handle *, enum fh_access); /* Default file handle for DATA LIST, REREAD, REPEATING DATA commands. */ struct file_handle *fh_get_default_handle (void); void fh_set_default_handle (struct file_handle *); #endif pspp-1.4.1/src/data/any-reader.h0000644000175000017500000001027713320146056016022 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2006, 2010, 2012, 2014, 2015 Free Software Foundation, Inc. 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 3 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, see . */ #ifndef ANY_READER_H #define ANY_READER_H 1 #include #include #include "data/case.h" #include "libpspp/float-format.h" #include "libpspp/integer-format.h" struct any_read_info; struct dictionary; struct file_handle; struct any_reader { const struct any_reader_class *klass; }; struct any_reader_class { /* The name of this kind of data file, e.g. "SPSS System File". */ const char *name; /* Detects whether FILE contains this type of file. Returns 1 if so, 0 if not, and a negative errno value if there is an error reading FILE. */ int (*detect) (FILE *file); struct any_reader *(*open) (struct file_handle *); bool (*close) (struct any_reader *); struct casereader *(*decode) (struct any_reader *, const char *encoding, struct dictionary **, struct any_read_info *); size_t (*get_strings) (const struct any_reader *, struct pool *pool, char ***labels, bool **ids, char ***values); }; extern const struct any_reader_class sys_file_reader_class; extern const struct any_reader_class por_file_reader_class; extern const struct any_reader_class pcp_file_reader_class; enum any_type { ANY_SYS, /* SPSS System File. */ ANY_PCP, /* SPSS/PC+ System File. */ ANY_POR, /* SPSS Portable File. */ }; enum any_compression { ANY_COMP_NONE, /* No compression. */ ANY_COMP_SIMPLE, /* Bytecode compression of integer values. */ ANY_COMP_ZLIB /* ZLIB "deflate" compression. */ }; /* Data file info that doesn't fit in struct dictionary. The strings in this structure are encoded in UTF-8. (They are normally in the ASCII subset of UTF-8.) */ struct any_read_info { const struct any_reader_class *klass; char *creation_date; char *creation_time; enum integer_format integer_format; enum float_format float_format; enum any_compression compression; casenumber case_cnt; /* -1 if unknown. */ char *product; /* Product name. */ char *product_ext; /* Extra product info. */ /* Writer's version number in X.Y.Z format. The version number is not always present; if not, then all of these are set to 0. */ int version_major; /* X. */ int version_minor; /* Y. */ int version_revision; /* Z. */ }; void any_read_info_destroy (struct any_read_info *); struct file_handle; struct dictionary; int any_reader_detect (const struct file_handle *file_name, const struct any_reader_class **); struct any_reader *any_reader_open (struct file_handle *); bool any_reader_close (struct any_reader *); struct casereader *any_reader_decode (struct any_reader *, const char *encoding, struct dictionary **, struct any_read_info *); size_t any_reader_get_strings (const struct any_reader *, struct pool *pool, char ***labels, bool **ids, char ***values); struct casereader *any_reader_open_and_decode (struct file_handle *, const char *encoding, struct dictionary **, struct any_read_info *); #endif /* any-reader.h */ pspp-1.4.1/src/data/sys-file-encoding.c0000644000175000017500000012612713571051220017303 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2017 Free Software Foundation, Inc. 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 3 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, see . */ /* -*- mode: c; buffer-read-only: t -*- Generated by sys-file-encoding.pl. Do not modify! */ #include #include "data/sys-file-private.h" struct sys_encoding sys_codepage_number_to_name[] = { { 37, "IBM037" }, { 256, "ibm-256" }, { 259, "IBM-Symbols" }, { 273, "IBM273" }, { 274, "IBM274" }, { 275, "IBM275" }, { 277, "IBM277" }, { 278, "IBM278" }, { 280, "IBM280" }, { 284, "IBM284" }, { 285, "IBM285" }, { 286, "EBCDIC-AT-DE-A" }, { 290, "IBM290" }, { 293, "ibm-293" }, { 297, "IBM297" }, { 300, "ibm-300" }, { 301, "ibm-301" }, { 367, "ANSI_X3.4-1968" }, { 420, "IBM420" }, { 424, "IBM424" }, { 425, "ibm-425" }, { 437, "IBM437" }, { 500, "IBM500" }, { 720, "windows-720" }, { 737, "windows-737" }, { 775, "IBM775" }, { 803, "ibm-803" }, { 806, "ibm-806" }, { 808, "ibm-808" }, { 813, "ISO-8859-7" }, { 819, "ISO_8859-1:1987" }, { 833, "ibm-833" }, { 834, "ibm-834" }, { 835, "ibm-835" }, { 836, "ibm-836" }, { 837, "ibm-837" }, { 838, "IBM-Thai" }, { 848, "ibm-848" }, { 849, "ibm-849" }, { 850, "IBM850" }, { 851, "IBM851" }, { 852, "IBM852" }, { 855, "IBM855" }, { 856, "cp856" }, { 857, "IBM857" }, { 858, "IBM00858" }, { 859, "ibm-859" }, { 860, "IBM860" }, { 861, "IBM861" }, { 862, "IBM862" }, { 863, "IBM863" }, { 864, "IBM864" }, { 865, "IBM865" }, { 866, "IBM866" }, { 867, "ibm-867" }, { 868, "IBM868" }, { 869, "IBM869" }, { 870, "IBM870" }, { 871, "IBM871" }, { 872, "ibm-872" }, { 874, "windows-874" }, { 875, "cp875" }, { 878, "KOI8-R" }, { 880, "IBM880" }, { 896, "ibm-896" }, { 897, "JIS_X0201" }, { 901, "ibm-901" }, { 902, "ibm-902" }, { 905, "IBM905" }, { 912, "ISO_8859-2:1987" }, { 913, "ISO_8859-3:1988" }, { 914, "ISO_8859-4:1988" }, { 915, "ISO_8859-5:1988" }, { 916, "ibm-916" }, { 918, "IBM918" }, { 920, "ISO_8859-9:1989" }, { 921, "ISO-8859-13" }, { 922, "cp922" }, { 923, "ISO-8859-15" }, { 924, "IBM00924" }, { 926, "ibm-926" }, { 927, "ibm-927" }, { 928, "ibm-928" }, { 930, "cp930" }, { 932, "Shift_JIS" }, { 933, "cp933" }, { 935, "cp935" }, { 936, "GBK" }, { 937, "cp937" }, { 939, "cp939" }, { 941, "ibm-941" }, { 943, "cp943" }, { 944, "ibm-944" }, { 946, "ibm-946" }, { 947, "ibm-947" }, { 948, "ibm-948" }, { 949, "windows-949" }, { 950, "Big5" }, { 951, "ibm-951" }, { 952, "ibm-952" }, { 953, "JIS_X0212-1990" }, { 954, "EUC-JP" }, { 955, "ibm-955" }, { 964, "cp964" }, { 970, "EUC-KR" }, { 971, "ibm-971" }, { 1004, "ibm-1004" }, { 1006, "cp1006" }, { 1008, "ibm-1008" }, { 1009, "ibm-1009" }, { 1010, "NF_Z_62-010" }, { 1011, "DIN_66003" }, { 1012, "IT" }, { 1013, "BS_4730" }, { 1014, "ES2" }, { 1015, "PT2" }, { 1016, "NS_4551-1" }, { 1017, "ibm-1017" }, { 1018, "SEN_850200_B" }, { 1019, "ibm-1019" }, { 1020, "CSA_Z243.4-1985-1" }, { 1021, "ibm-1021" }, { 1023, "ES" }, { 1025, "cp1025" }, { 1026, "IBM1026" }, { 1027, "ibm-1027" }, { 1041, "ibm-1041" }, { 1043, "ibm-1043" }, { 1046, "ibm-1046" }, { 1047, "IBM1047" }, { 1051, "hp-roman8" }, { 1088, "ibm-1088" }, { 1089, "ISO_8859-6:1987" }, { 1097, "cp1097" }, { 1098, "cp1098" }, { 1100, "DEC-MCS" }, { 1101, "ibm-1101" }, { 1102, "ibm-1102" }, { 1103, "ibm-1103" }, { 1104, "iso-ir-25" }, { 1105, "ibm-1105" }, { 1106, "ibm-1106" }, { 1107, "DS_2089" }, { 1112, "cp1112" }, { 1114, "ibm-1114" }, { 1115, "ibm-1115" }, { 1122, "cp1122" }, { 1123, "cp1123" }, { 1124, "cp1124" }, { 1125, "ibm-1125" }, { 1127, "ibm-1127" }, { 1129, "ibm-1129" }, { 1130, "ibm-1130" }, { 1131, "ibm-1131" }, { 1132, "ibm-1132" }, { 1133, "ibm-1133" }, { 1137, "ibm-1137" }, { 1140, "IBM01140" }, { 1141, "IBM01141" }, { 1142, "IBM01142" }, { 1143, "IBM01143" }, { 1144, "IBM01144" }, { 1145, "IBM01145" }, { 1146, "IBM01146" }, { 1147, "IBM01147" }, { 1148, "IBM01148" }, { 1149, "IBM01149" }, { 1153, "ibm-1153" }, { 1154, "ibm-1154" }, { 1155, "ibm-1155" }, { 1156, "ibm-1156" }, { 1157, "ibm-1157" }, { 1158, "ibm-1158" }, { 1160, "ibm-1160" }, { 1161, "ibm-1161" }, { 1162, "ibm-1162" }, { 1163, "ibm-1163" }, { 1164, "ibm-1164" }, { 1165, "ibm-1165" }, { 1166, "ibm-1166" }, { 1167, "ibm-1167" }, { 1168, "KOI8-U" }, { 1174, "KZ-1048" }, { 1200, "UTF-16LE" }, { 1201, "UTF-16BE" }, { 1205, "UTF-16" }, { 1213, "SCSU" }, { 1215, "BOCU-1" }, { 1235, "UTF-32LE" }, { 1237, "UTF-32" }, { 1250, "windows-1250" }, { 1251, "windows-1251" }, { 1252, "windows-1252" }, { 1253, "windows-1253" }, { 1254, "windows-1254" }, { 1255, "windows-1255" }, { 1256, "windows-1256" }, { 1257, "windows-1257" }, { 1258, "windows-1258" }, { 1276, "Adobe-Standard-Encoding" }, { 1277, "ibm-1277" }, { 1350, "ibm-1350" }, { 1351, "ibm-1351" }, { 1362, "ibm-1362" }, { 1363, "ibm-1363" }, { 1364, "ibm-1364" }, { 1370, "ibm-1370" }, { 1371, "ibm-1371" }, { 1373, "ibm-1373" }, { 1375, "Big5-HKSCS" }, { 1380, "ibm-1380" }, { 1381, "cp1381" }, { 1382, "ibm-1382" }, { 1383, "GB2312" }, { 1385, "ibm-9577" }, { 1386, "ibm-1386" }, { 1390, "ibm-1390" }, { 1392, "gb18030" }, { 1399, "ibm-1399" }, { 4517, "ibm-4517" }, { 4899, "ibm-4899" }, { 4902, "ibm-4902" }, { 4909, "ibm-4909" }, { 4930, "ibm-4930" }, { 4933, "ibm-4933" }, { 4948, "ibm-4948" }, { 4951, "ibm-4951" }, { 4952, "ibm-4952" }, { 4960, "ibm-4960" }, { 4971, "ibm-4971" }, { 5012, "ISO_8859-8:1988" }, { 5026, "cp930" }, { 5035, "cp939" }, { 5039, "ibm-5039" }, { 5048, "ibm-5048" }, { 5049, "ibm-5049" }, { 5050, "cp33722" }, { 5054, "JIS_Encoding" }, { 5067, "ibm-5067" }, { 5104, "ibm-5104" }, { 5123, "ibm-5123" }, { 5346, "windows-1250" }, { 5347, "windows-1251" }, { 5348, "windows-1252" }, { 5349, "windows-1253" }, { 5350, "windows-1254" }, { 5351, "ibm-5351" }, { 5352, "ibm-5352" }, { 5353, "ibm-5353" }, { 5354, "windows-1258" }, { 5471, "MS950_HKSCS" }, { 5478, "GB_2312-80" }, { 8482, "ibm-8482" }, { 8612, "ibm-8612" }, { 9005, "ISO_8859-7:1987" }, { 9027, "ibm-9027" }, { 9030, "IBM-Thai" }, { 9048, "ibm-9048" }, { 9056, "ibm-9056" }, { 9061, "ibm-9061" }, { 9066, "TIS-620" }, { 9067, "ibm-9067" }, { 9145, "ibm-9145" }, { 9238, "ibm-9238" }, { 9400, "CESU-8" }, { 9424, "UTF-32BE" }, { 9447, "windows-1255" }, { 9448, "windows-1256" }, { 9449, "windows-1257" }, { 9580, "ibm-1388" }, { 10000, "macintosh" }, { 10006, "windows-10006" }, { 10007, "windows-10007" }, { 10029, "windows-10029" }, { 10081, "windows-10081" }, { 12712, "ibm-12712" }, { 13125, "ibm-13125" }, { 13140, "ibm-13140" }, { 13218, "ibm-13218" }, { 13676, "ibm-13676" }, { 16804, "ibm-16804" }, { 17221, "ibm-17221" }, { 17248, "ibm-17248" }, { 17593, "UTF-8" }, { 20127, "ANSI_X3.4-1968" }, { 20780, "ibm-16684" }, { 20866, "KOI8-R" }, { 20880, "IBM880" }, { 20905, "IBM905" }, { 21344, "ibm-21344" }, { 21427, "ibm-21427" }, { 21866, "KOI8-U" }, { 25546, "ibm-25546" }, { 28592, "ISO_8859-2:1987" }, { 28593, "ISO_8859-3:1988" }, { 28594, "ISO_8859-4:1988" }, { 28595, "ISO_8859-5:1988" }, { 28596, "ISO_8859-6:1987" }, { 28597, "ISO_8859-7:1987" }, { 28598, "ISO_8859-8:1988" }, { 28599, "ISO_8859-9:1989" }, { 28603, "ISO-8859-13" }, { 28605, "ISO-8859-15" }, { 29875, "UTF-16LE" }, { 33058, "ibm-33058" }, { 33722, "cp33722" }, { 51932, "Extended_UNIX_Code_Packed_Format_for_Japanese" }, { 51949, "EUC-KR" }, { 54936, "gb18030" }, { 57002, "ibm-4902" }, { 57004, "windows-57004" }, { 57005, "windows-57005" }, { 57006, "windows-57003" }, { 57007, "windows-57007" }, { 57008, "windows-57008" }, { 57009, "windows-57009" }, { 57010, "windows-57010" }, { 57011, "windows-57011" }, { 61956, "UTF-16BE" }, { 65000, "UTF-7" }, { 65001, "UTF-8" }, { 65025, "ibm-65025" }, { 0, NULL } }; struct sys_encoding sys_codepage_name_to_number[] = { { 37, "037" }, { 1006, "1006" }, { 1025, "1025" }, { 1026, "1026" }, { 1047, "1047" }, { 28596, "1089" }, { 1097, "1097" }, { 1098, "1098" }, { 1112, "1112" }, { 1122, "1122" }, { 1123, "1123" }, { 1124, "1124" }, { 1381, "1381" }, { 1383, "1383" }, { 273, "273" }, { 277, "277" }, { 278, "278" }, { 280, "280" }, { 284, "284" }, { 285, "285" }, { 297, "297" }, { 5050, "33722" }, { 420, "420" }, { 424, "424" }, { 437, "437" }, { 51949, "5601" }, { 20127, "646" }, { 737, "737" }, { 775, "775" }, { 813, "813" }, { 819, "819" }, { 9030, "838" }, { 850, "850" }, { 851, "851" }, { 852, "852" }, { 855, "855" }, { 856, "856" }, { 857, "857" }, { 860, "860" }, { 861, "861" }, { 862, "862" }, { 863, "863" }, { 865, "865" }, { 866, "866" }, { 868, "868" }, { 869, "869" }, { 871, "871" }, { 875, "875" }, { 819, "8859_1" }, { 28603, "8859_13" }, { 28605, "8859_15" }, { 28592, "8859_2" }, { 28593, "8859_3" }, { 28594, "8859_4" }, { 28595, "8859_5" }, { 28596, "8859_6" }, { 813, "8859_7" }, { 28598, "8859_8" }, { 28599, "8859_9" }, { 28592, "912" }, { 28593, "913" }, { 28594, "914" }, { 28595, "915" }, { 916, "916" }, { 28599, "920" }, { 922, "922" }, { 28605, "923" }, { 5026, "930" }, { 933, "933" }, { 935, "935" }, { 937, "937" }, { 5035, "939" }, { 943, "943" }, { 949, "949" }, { 950, "950" }, { 964, "964" }, { 51949, "970" }, { 20127, "ANSI_X3.4-1968" }, { 20127, "ANSI_X3.4-1986" }, { 20127, "ASCII" }, { 28596, "ASMO-708" }, { 1276, "Adobe-Standard-Encoding" }, { 1215, "BOCU-1" }, { 1013, "BS_4730" }, { 950, "Big5" }, { 1375, "Big5-HKSCS" }, { 858, "CCSID00858" }, { 924, "CCSID00924" }, { 1140, "CCSID01140" }, { 1141, "CCSID01141" }, { 1142, "CCSID01142" }, { 1143, "CCSID01143" }, { 1144, "CCSID01144" }, { 1145, "CCSID01145" }, { 1146, "CCSID01146" }, { 1147, "CCSID01147" }, { 1148, "CCSID01148" }, { 1149, "CCSID01149" }, { 9400, "CESU-8" }, { 858, "CP00858" }, { 924, "CP00924" }, { 1140, "CP01140" }, { 1141, "CP01141" }, { 1142, "CP01142" }, { 1143, "CP01143" }, { 1144, "CP01144" }, { 1145, "CP01145" }, { 1146, "CP01146" }, { 1147, "CP01147" }, { 1148, "CP01148" }, { 1149, "CP01149" }, { 1026, "CP1026" }, { 273, "CP273" }, { 274, "CP274" }, { 280, "CP280" }, { 284, "CP284" }, { 285, "CP285" }, { 500, "CP500" }, { 868, "CP868" }, { 870, "CP870" }, { 871, "CP871" }, { 20905, "CP905" }, { 918, "CP918" }, { 936, "CP936" }, { 1020, "CSA_Z243.4-1985-1" }, { 1100, "DEC-MCS" }, { 1011, "DIN_66003" }, { 720, "DOS-720" }, { 862, "DOS-862" }, { 1107, "DS_2089" }, { 286, "EBCDIC-AT-DE-A" }, { 274, "EBCDIC-BE" }, { 275, "EBCDIC-BR" }, { 277, "EBCDIC-CP-DK" }, { 277, "EBCDIC-CP-NO" }, { 20880, "EBCDIC-Cyrillic" }, { 290, "EBCDIC-JP-kana" }, { 28596, "ECMA-114" }, { 28597, "ECMA-118" }, { 28597, "ELOT_928" }, { 1023, "ES" }, { 1014, "ES2" }, { 51932, "EUC-JP" }, { 51949, "EUC-KR" }, { 51932, "Extended_UNIX_Code_Packed_Format_for_Japanese" }, { 1018, "FI" }, { 54936, "GB18030" }, { 1383, "GB2312" }, { 936, "GBK" }, { 5478, "GB_2312-80" }, { 259, "IBM-Symbols" }, { 9030, "IBM-Thai" }, { 858, "IBM00858" }, { 924, "IBM00924" }, { 1140, "IBM01140" }, { 1141, "IBM01141" }, { 1142, "IBM01142" }, { 1143, "IBM01143" }, { 1144, "IBM01144" }, { 1145, "IBM01145" }, { 1146, "IBM01146" }, { 1147, "IBM01147" }, { 1148, "IBM01148" }, { 1149, "IBM01149" }, { 37, "IBM037" }, { 1006, "IBM1006" }, { 1026, "IBM1026" }, { 1047, "IBM1047" }, { 1098, "IBM1098" }, { 1153, "IBM1153" }, { 273, "IBM273" }, { 274, "IBM274" }, { 275, "IBM275" }, { 277, "IBM277" }, { 278, "IBM278" }, { 280, "IBM280" }, { 284, "IBM284" }, { 285, "IBM285" }, { 290, "IBM290" }, { 297, "IBM297" }, { 20127, "IBM367" }, { 420, "IBM420" }, { 424, "IBM424" }, { 437, "IBM437" }, { 500, "IBM500" }, { 737, "IBM737" }, { 775, "IBM775" }, { 819, "IBM819" }, { 9030, "IBM838" }, { 850, "IBM850" }, { 851, "IBM851" }, { 852, "IBM852" }, { 855, "IBM855" }, { 856, "IBM856" }, { 857, "IBM857" }, { 860, "IBM860" }, { 861, "IBM861" }, { 862, "IBM862" }, { 863, "IBM863" }, { 864, "IBM864" }, { 865, "IBM865" }, { 866, "IBM866" }, { 868, "IBM868" }, { 869, "IBM869" }, { 870, "IBM870" }, { 871, "IBM871" }, { 875, "IBM875" }, { 20880, "IBM880" }, { 20905, "IBM905" }, { 918, "IBM918" }, { 922, "IBM922" }, { 5026, "IBM930" }, { 5035, "IBM939" }, { 1205, "ISO-10646-UCS-2" }, { 1237, "ISO-10646-UCS-4" }, { 5054, "ISO-2022-JP-1" }, { 819, "ISO-8859-1" }, { 28603, "ISO-8859-13" }, { 28605, "ISO-8859-15" }, { 28592, "ISO-8859-2" }, { 28593, "ISO-8859-3" }, { 28594, "ISO-8859-4" }, { 28595, "ISO-8859-5" }, { 28596, "ISO-8859-6" }, { 28596, "ISO-8859-6-E" }, { 28596, "ISO-8859-6-I" }, { 28597, "ISO-8859-7" }, { 28598, "ISO-8859-8" }, { 28598, "ISO-8859-8-E" }, { 28598, "ISO-8859-8-I" }, { 28599, "ISO-8859-9" }, { 1020, "ISO646-CA" }, { 1011, "ISO646-DE" }, { 1107, "ISO646-DK" }, { 1023, "ISO646-ES" }, { 1014, "ISO646-ES2" }, { 1018, "ISO646-FI" }, { 1010, "ISO646-FR" }, { 1104, "ISO646-FR1" }, { 1013, "ISO646-GB" }, { 1012, "ISO646-IT" }, { 1016, "ISO646-NO" }, { 1015, "ISO646-PT2" }, { 1018, "ISO646-SE" }, { 20127, "ISO646-US" }, { 20127, "ISO_646.irv:1991" }, { 819, "ISO_8859-1:1987" }, { 28592, "ISO_8859-2:1987" }, { 28593, "ISO_8859-3:1988" }, { 28594, "ISO_8859-4:1988" }, { 28595, "ISO_8859-5:1988" }, { 28596, "ISO_8859-6:1987" }, { 28597, "ISO_8859-7:1987" }, { 28598, "ISO_8859-8:1988" }, { 28599, "ISO_8859-9:1989" }, { 1012, "IT" }, { 5054, "JIS_Encoding" }, { 897, "JIS_X0201" }, { 953, "JIS_X0212-1990" }, { 20866, "KOI8-R" }, { 21866, "KOI8-U" }, /* KSC_5601 has multiple numbers for windows: 949 51949 */ { 949, "KSC_5601" }, /* KS_C_5601-1987 has multiple numbers for windows: 949 51949 */ { 949, "KS_C_5601-1987" }, { 949, "KS_C_5601-1989" }, { 1174, "KZ-1048" }, { 28605, "Latin-9" }, { 874, "MS874" }, { 936, "MS936" }, { 5471, "MS950_HKSCS" }, { 932, "MS_Kanji" }, { 1010, "NF_Z_62-010" }, { 1016, "NS_4551-1" }, { 858, "PC-Multilingual-850+euro" }, { 1015, "PT2" }, { 1174, "RK1048" }, { 1213, "SCSU" }, { 1018, "SEN_850200_B" }, { 1174, "STRK1048-2002" }, { 932, "Shift_JIS" }, { 874, "TIS-620" }, { 20127, "US-ASCII" }, { 1205, "UTF-16" }, { 1201, "UTF-16BE" }, { 1200, "UTF-16LE" }, { 1237, "UTF-32" }, { 9424, "UTF-32BE" }, { 1235, "UTF-32LE" }, { 65000, "UTF-7" }, { 65001, "UTF-8" }, { 1201, "UnicodeBigUnmarked" }, { 1200, "UnicodeLittleUnmarked" }, { 51932, "X-EUC-JP" }, { 897, "X0201" }, { 28596, "arabic" }, { 20127, "ascii7" }, { 1375, "big5hk" }, { 1020, "ca" }, { 5478, "chinese" }, { 868, "cp-ar" }, { 869, "cp-gr" }, { 861, "cp-is" }, { 37, "cp037" }, { 1006, "cp1006" }, { 1025, "cp1025" }, { 1047, "cp1047" }, { 28596, "cp1089" }, { 1097, "cp1097" }, { 1098, "cp1098" }, { 1112, "cp1112" }, { 1122, "cp1122" }, { 1123, "cp1123" }, { 1124, "cp1124" }, { 1140, "cp1140" }, { 1141, "cp1141" }, { 1142, "cp1142" }, { 1143, "cp1143" }, { 1144, "cp1144" }, { 1145, "cp1145" }, { 1146, "cp1146" }, { 1147, "cp1147" }, { 1148, "cp1148" }, { 1149, "cp1149" }, { 1250, "cp1250" }, { 1251, "cp1251" }, { 1252, "cp1252" }, { 1253, "cp1253" }, { 1254, "cp1254" }, { 1255, "cp1255" }, { 1256, "cp1256" }, { 1257, "cp1257" }, { 1258, "cp1258" }, { 1363, "cp1363" }, { 1381, "cp1381" }, { 1383, "cp1383" }, { 275, "cp275" }, { 277, "cp277" }, { 278, "cp278" }, { 290, "cp290" }, { 297, "cp297" }, { 5050, "cp33722" }, { 20127, "cp367" }, { 420, "cp420" }, { 424, "cp424" }, { 437, "cp437" }, { 737, "cp737" }, { 775, "cp775" }, { 813, "cp813" }, { 819, "cp819" }, { 9030, "cp838" }, { 850, "cp850" }, { 851, "cp851" }, { 852, "cp852" }, { 855, "cp855" }, { 856, "cp856" }, { 857, "cp857" }, { 858, "cp858" }, { 860, "cp860" }, { 861, "cp861" }, { 862, "cp862" }, { 863, "cp863" }, { 864, "cp864" }, { 865, "cp865" }, { 866, "cp866" }, { 869, "cp869" }, { 9066, "cp874" }, { 875, "cp875" }, { 20880, "cp880" }, { 28592, "cp912" }, { 28593, "cp913" }, { 28594, "cp914" }, { 28595, "cp915" }, { 916, "cp916" }, { 28599, "cp920" }, { 922, "cp922" }, { 28605, "cp923" }, { 5026, "cp930" }, { 932, "cp932" }, { 933, "cp933" }, { 935, "cp935" }, { 937, "cp937" }, { 5035, "cp939" }, { 943, "cp943" }, { 932, "cp943c" }, { 949, "cp949" }, { 950, "cp950" }, { 964, "cp964" }, { 51949, "cp970" }, { 284, "cpibm284" }, { 285, "cpibm285" }, { 297, "cpibm297" }, { 37, "cpibm37" }, { 20127, "csASCII" }, { 1276, "csAdobeStandardEncoding" }, { 1215, "csBOCU-1" }, { 950, "csBig5" }, { 1100, "csDECMCS" }, { 286, "csEBCDICATDEA" }, { 51949, "csEUCKR" }, { 51932, "csEUCPkdFmtJapanese" }, { 1383, "csGB2312" }, { 1051, "csHPRoman8" }, { 897, "csHalfWidthKatakana" }, { 37, "csIBM037" }, { 1026, "csIBM1026" }, { 273, "csIBM273" }, { 274, "csIBM274" }, { 275, "csIBM275" }, { 277, "csIBM277" }, { 278, "csIBM278" }, { 280, "csIBM280" }, { 284, "csIBM284" }, { 285, "csIBM285" }, { 290, "csIBM290" }, { 297, "csIBM297" }, { 420, "csIBM420" }, { 424, "csIBM424" }, { 500, "csIBM500" }, { 855, "csIBM855" }, { 857, "csIBM857" }, { 860, "csIBM860" }, { 861, "csIBM861" }, { 863, "csIBM863" }, { 864, "csIBM864" }, { 865, "csIBM865" }, { 866, "csIBM866" }, { 868, "csIBM868" }, { 869, "csIBM869" }, { 870, "csIBM870" }, { 871, "csIBM871" }, { 20880, "csIBM880" }, { 20905, "csIBM905" }, { 918, "csIBM918" }, { 259, "csIBMSymbols" }, { 9030, "csIBMThai" }, { 1018, "csISO10Swedish" }, { 1020, "csISO121Canadian1" }, { 1012, "csISO15Italian" }, { 1023, "csISO17Spanish" }, { 1011, "csISO21German" }, { 1104, "csISO25French" }, { 1013, "csISO4UnitedKingdom" }, { 5478, "csISO58GB231280" }, { 1016, "csISO60DanishNorwegian" }, { 1016, "csISO60Norwegian1" }, { 1107, "csISO646Danish" }, { 1010, "csISO69French" }, { 1015, "csISO84Portuguese2" }, { 1014, "csISO85Spanish2" }, { 819, "csISOLatin1" }, { 28592, "csISOLatin2" }, { 28593, "csISOLatin3" }, { 28594, "csISOLatin4" }, { 28599, "csISOLatin5" }, { 28596, "csISOLatinArabic" }, { 28595, "csISOLatinCyrillic" }, { 28597, "csISOLatinGreek" }, { 28598, "csISOLatinHebrew" }, { 5054, "csJISEncoding" }, { 20866, "csKOI8R" }, { 949, "csKSC56011987" }, { 1174, "csKZ1048" }, { 10000, "csMacintosh" }, { 775, "csPC775Baltic" }, { 850, "csPC850Multilingual" }, { 851, "csPC851" }, { 862, "csPC862LatinHebrew" }, { 437, "csPC8CodePage437" }, { 852, "csPCp852" }, { 855, "csPCp855" }, { 932, "csShiftJIS" }, { 932, "csWindows31J" }, { 1020, "csa7-1" }, { 28605, "csisolatin0" }, { 28605, "csisolatin9" }, { 28595, "cyrillic" }, { 1011, "de" }, { 1100, "dec" }, { 1107, "dk" }, { 924, "ebcdic-Latin9--euro" }, { 420, "ebcdic-cp-ar1" }, { 918, "ebcdic-cp-ar2" }, { 500, "ebcdic-cp-be" }, { 37, "ebcdic-cp-ca" }, { 500, "ebcdic-cp-ch" }, { 284, "ebcdic-cp-es" }, { 278, "ebcdic-cp-fi" }, { 297, "ebcdic-cp-fr" }, { 285, "ebcdic-cp-gb" }, { 424, "ebcdic-cp-he" }, { 871, "ebcdic-cp-is" }, { 280, "ebcdic-cp-it" }, { 37, "ebcdic-cp-nl" }, { 870, "ebcdic-cp-roece" }, { 278, "ebcdic-cp-se" }, { 20905, "ebcdic-cp-tr" }, { 37, "ebcdic-cp-us" }, { 37, "ebcdic-cp-wt" }, { 870, "ebcdic-cp-yu" }, { 1141, "ebcdic-de-273+euro" }, { 1142, "ebcdic-dk-277+euro" }, { 1145, "ebcdic-es-284+euro" }, { 1143, "ebcdic-fi-278+euro" }, { 1147, "ebcdic-fr-297+euro" }, { 285, "ebcdic-gb" }, { 1146, "ebcdic-gb-285+euro" }, { 1148, "ebcdic-international-500+euro" }, { 871, "ebcdic-is" }, { 1149, "ebcdic-is-871+euro" }, { 1144, "ebcdic-it-280+euro" }, { 1142, "ebcdic-no-277+euro" }, { 1143, "ebcdic-se-278+euro" }, { 278, "ebcdic-sv" }, { 1140, "ebcdic-us-37+euro" }, { 1350, "eucJP-Open" }, { 954, "eucjis" }, { 1010, "fr" }, { 1013, "gb" }, { 54936, "gb18030" }, { 28597, "greek" }, { 28597, "greek8" }, { 28598, "hebrew" }, { 1051, "hp-roman8" }, { 1004, "ibm-1004" }, { 1004, "ibm-1004_P100-1995" }, { 1006, "ibm-1006" }, { 1006, "ibm-1006_P100-1995" }, { 1008, "ibm-1008" }, { 1008, "ibm-1008_P100-1995" }, { 1009, "ibm-1009" }, { 1009, "ibm-1009_P100-1995" }, { 1010, "ibm-1010" }, { 1010, "ibm-1010_P100-1995" }, { 1011, "ibm-1011" }, { 1011, "ibm-1011_P100-1995" }, { 1012, "ibm-1012" }, { 1012, "ibm-1012_P100-1995" }, { 1013, "ibm-1013" }, { 1013, "ibm-1013_P100-1995" }, { 1014, "ibm-1014" }, { 1014, "ibm-1014_P100-1995" }, { 1015, "ibm-1015" }, { 1015, "ibm-1015_P100-1995" }, { 1016, "ibm-1016" }, { 1016, "ibm-1016_P100-1995" }, { 1017, "ibm-1017" }, { 1017, "ibm-1017_P100-1995" }, { 1018, "ibm-1018" }, { 1018, "ibm-1018_P100-1995" }, { 1019, "ibm-1019" }, { 1019, "ibm-1019_P100-1995" }, { 1020, "ibm-1020" }, { 1020, "ibm-1020_P100-2003" }, { 1021, "ibm-1021" }, { 1021, "ibm-1021_P100-2003" }, { 1023, "ibm-1023" }, { 1023, "ibm-1023_P100-2003" }, { 1025, "ibm-1025" }, { 1025, "ibm-1025_P100-1995" }, { 1026, "ibm-1026" }, { 1026, "ibm-1026_P100-1995" }, { 1027, "ibm-1027" }, { 1027, "ibm-1027_P100-1995" }, { 1041, "ibm-1041" }, { 1041, "ibm-1041_P100-1995" }, { 1043, "ibm-1043" }, { 1043, "ibm-1043_P100-1995" }, { 1046, "ibm-1046" }, { 1046, "ibm-1046_X110-1999" }, { 1047, "ibm-1047" }, { 1047, "ibm-1047_P100-1995" }, { 1051, "ibm-1051" }, { 1051, "ibm-1051_P100-1995" }, { 1088, "ibm-1088" }, { 1088, "ibm-1088_P100-1995" }, { 28596, "ibm-1089" }, { 28596, "ibm-1089_P100-1995" }, { 1097, "ibm-1097" }, { 1097, "ibm-1097_P100-1995" }, { 1098, "ibm-1098" }, { 1098, "ibm-1098_P100-1995" }, { 1100, "ibm-1100" }, { 1100, "ibm-1100_P100-2003" }, { 1101, "ibm-1101" }, { 1101, "ibm-1101_P100-2003" }, { 1102, "ibm-1102" }, { 1102, "ibm-1102_P100-2003" }, { 1103, "ibm-1103" }, { 1103, "ibm-1103_P100-2003" }, { 1104, "ibm-1104" }, { 1104, "ibm-1104_P100-2003" }, { 1105, "ibm-1105" }, { 1105, "ibm-1105_P100-2003" }, { 1106, "ibm-1106" }, { 1106, "ibm-1106_P100-2003" }, { 1107, "ibm-1107" }, { 1107, "ibm-1107_P100-2003" }, { 1112, "ibm-1112" }, { 1112, "ibm-1112_P100-1995" }, { 1114, "ibm-1114" }, { 1114, "ibm-1114_P100-2001" }, { 1115, "ibm-1115" }, { 1115, "ibm-1115_P100-1995" }, { 1122, "ibm-1122" }, { 1122, "ibm-1122_P100-1999" }, { 1123, "ibm-1123" }, { 1123, "ibm-1123_P100-1995" }, { 1124, "ibm-1124" }, { 1124, "ibm-1124_P100-1996" }, { 1125, "ibm-1125" }, { 1125, "ibm-1125_P100-1997" }, { 1127, "ibm-1127" }, { 1127, "ibm-1127_P100-2004" }, { 1129, "ibm-1129" }, { 1129, "ibm-1129_P100-1997" }, { 1130, "ibm-1130" }, { 1130, "ibm-1130_P100-1997" }, { 1131, "ibm-1131" }, { 1131, "ibm-1131_P100-1997" }, { 1132, "ibm-1132" }, { 1132, "ibm-1132_P100-1998" }, { 1133, "ibm-1133" }, { 1133, "ibm-1133_P100-1997" }, { 1137, "ibm-1137" }, { 1137, "ibm-1137_P100-1999" }, { 1140, "ibm-1140" }, { 1140, "ibm-1140_P100-1997" }, { 1141, "ibm-1141" }, { 1141, "ibm-1141_P100-1997" }, { 1142, "ibm-1142" }, { 1142, "ibm-1142_P100-1997" }, { 1143, "ibm-1143" }, { 1143, "ibm-1143_P100-1997" }, { 1144, "ibm-1144" }, { 1144, "ibm-1144_P100-1997" }, { 1145, "ibm-1145" }, { 1145, "ibm-1145_P100-1997" }, { 1146, "ibm-1146" }, { 1146, "ibm-1146_P100-1997" }, { 1147, "ibm-1147" }, { 1147, "ibm-1147_P100-1997" }, { 1148, "ibm-1148" }, { 1148, "ibm-1148_P100-1997" }, { 1149, "ibm-1149" }, { 1149, "ibm-1149_P100-1997" }, { 1153, "ibm-1153" }, { 1153, "ibm-1153_P100-1999" }, { 1154, "ibm-1154" }, { 1154, "ibm-1154_P100-1999" }, { 1155, "ibm-1155" }, { 1155, "ibm-1155_P100-1999" }, { 1156, "ibm-1156" }, { 1156, "ibm-1156_P100-1999" }, { 1157, "ibm-1157" }, { 1157, "ibm-1157_P100-1999" }, { 1158, "ibm-1158" }, { 1158, "ibm-1158_P100-1999" }, { 1160, "ibm-1160" }, { 1160, "ibm-1160_P100-1999" }, { 1161, "ibm-1161" }, { 1161, "ibm-1161_P100-1999" }, { 1162, "ibm-1162" }, { 1162, "ibm-1162_P100-1999" }, { 1163, "ibm-1163" }, { 1163, "ibm-1163_P100-1999" }, { 1164, "ibm-1164" }, { 1164, "ibm-1164_P100-1999" }, { 1165, "ibm-1165" }, { 1165, "ibm-1165_P101-2000" }, { 1166, "ibm-1166" }, { 1166, "ibm-1166_P100-2002" }, { 1167, "ibm-1167" }, { 1167, "ibm-1167_P100-2002" }, { 21866, "ibm-1168" }, { 21866, "ibm-1168_P100-2002" }, { 1174, "ibm-1174" }, { 1174, "ibm-1174_X100-2007" }, { 1201, "ibm-1200" }, { 1201, "ibm-1201" }, { 1200, "ibm-1202" }, { 1200, "ibm-1203" }, { 1205, "ibm-1204" }, { 1205, "ibm-1205" }, { 65001, "ibm-1208" }, { 65001, "ibm-1209" }, { 1213, "ibm-1212" }, { 1213, "ibm-1213" }, { 1215, "ibm-1214" }, { 1215, "ibm-1215" }, { 9424, "ibm-1232" }, { 9424, "ibm-1233" }, { 1235, "ibm-1234" }, { 1235, "ibm-1235" }, { 1237, "ibm-1236" }, { 1237, "ibm-1237" }, { 1250, "ibm-1250" }, { 1250, "ibm-1250_P100-1995" }, { 1251, "ibm-1251" }, { 1251, "ibm-1251_P100-1995" }, { 1252, "ibm-1252" }, { 1252, "ibm-1252_P100-2000" }, { 1253, "ibm-1253" }, { 1253, "ibm-1253_P100-1995" }, { 1254, "ibm-1254" }, { 1254, "ibm-1254_P100-1995" }, { 1255, "ibm-1255" }, { 1255, "ibm-1255_P100-1995" }, { 1256, "ibm-1256" }, { 1256, "ibm-1256_P110-1997" }, { 1257, "ibm-1257" }, { 1257, "ibm-1257_P100-1995" }, { 1258, "ibm-1258" }, { 1258, "ibm-1258_P100-1997" }, { 12712, "ibm-12712" }, { 12712, "ibm-12712_P100-1998" }, { 1276, "ibm-1276" }, { 1276, "ibm-1276_P100-1995" }, { 1277, "ibm-1277" }, { 1277, "ibm-1277_P100-1995" }, { 13125, "ibm-13125" }, { 13125, "ibm-13125_P100-1997" }, { 13140, "ibm-13140" }, { 13140, "ibm-13140_P101-2000" }, { 13218, "ibm-13218" }, { 13218, "ibm-13218_P100-1996" }, { 1201, "ibm-13488" }, { 1201, "ibm-13489" }, { 1200, "ibm-13490" }, { 1200, "ibm-13491" }, { 65001, "ibm-13496" }, { 65001, "ibm-13497" }, { 1350, "ibm-1350" }, { 1350, "ibm-1350_P110-1997" }, { 1351, "ibm-1351" }, { 1351, "ibm-1351_P110-1997" }, { 1362, "ibm-1362" }, { 1362, "ibm-1362_P110-1999" }, { 1363, "ibm-1363" }, { 1363, "ibm-1363_P110-1997" }, { 1363, "ibm-1363_P11B-1998" }, { 1364, "ibm-1364" }, { 1364, "ibm-1364_P110-2007" }, { 13676, "ibm-13676" }, { 13676, "ibm-13676_P102-2001" }, { 1370, "ibm-1370" }, { 1370, "ibm-1370_P100-1999" }, { 1371, "ibm-1371" }, { 1371, "ibm-1371_P100-1999" }, { 1373, "ibm-1373" }, { 1373, "ibm-1373_P100-2002" }, { 1375, "ibm-1375" }, { 1375, "ibm-1375_P100-2007" }, { 1380, "ibm-1380" }, { 1380, "ibm-1380_P100-1995" }, { 1381, "ibm-1381" }, { 1381, "ibm-1381_P110-1999" }, { 1382, "ibm-1382" }, { 1382, "ibm-1382_P100-1995" }, { 1383, "ibm-1383" }, { 1383, "ibm-1383_P110-1999" }, { 1385, "ibm-1385" }, { 1386, "ibm-1386" }, { 1386, "ibm-1386_P100-2001" }, { 9580, "ibm-1388" }, { 9580, "ibm-1388_P103-2001" }, { 1390, "ibm-1390" }, { 1390, "ibm-1390_P110-2003" }, { 54936, "ibm-1392" }, { 1399, "ibm-1399" }, { 1399, "ibm-1399_P110-2003" }, { 20780, "ibm-16684" }, { 20780, "ibm-16684_P110-2003" }, { 16804, "ibm-16804" }, { 16804, "ibm-16804_X110-1999" }, { 17221, "ibm-17221" }, { 17221, "ibm-17221_P100-2001" }, { 17248, "ibm-17248" }, { 17248, "ibm-17248_X110-1999" }, { 1201, "ibm-17584" }, { 1201, "ibm-17585" }, { 1200, "ibm-17586" }, { 1200, "ibm-17587" }, { 65001, "ibm-17592" }, { 65001, "ibm-17593" }, { 20780, "ibm-20780" }, { 21344, "ibm-21344" }, { 21344, "ibm-21344_P101-2000" }, { 21427, "ibm-21427" }, { 21427, "ibm-21427_P100-1999" }, { 1201, "ibm-21680" }, { 1201, "ibm-21681" }, { 1200, "ibm-21682" }, { 1200, "ibm-21683" }, { 25546, "ibm-25546" }, { 256, "ibm-256" }, { 256, "ibm-256_P100-1995" }, { 1201, "ibm-25776" }, { 1201, "ibm-25777" }, { 1200, "ibm-25778" }, { 1200, "ibm-25779" }, { 259, "ibm-259" }, { 259, "ibm-259_P100-1995" }, { 273, "ibm-273" }, { 273, "ibm-273_P100-1995" }, { 274, "ibm-274" }, { 274, "ibm-274_P100-2000" }, { 275, "ibm-275" }, { 275, "ibm-275_P100-1995" }, { 277, "ibm-277" }, { 277, "ibm-277_P100-1995" }, { 278, "ibm-278" }, { 278, "ibm-278_P100-1995" }, { 280, "ibm-280" }, { 280, "ibm-280_P100-1995" }, { 284, "ibm-284" }, { 284, "ibm-284_P100-1995" }, { 285, "ibm-285" }, { 285, "ibm-285_P100-1995" }, { 286, "ibm-286" }, { 286, "ibm-286_P100-2003" }, { 290, "ibm-290" }, { 290, "ibm-290_P100-1995" }, { 293, "ibm-293" }, { 293, "ibm-293_P100-1995" }, { 297, "ibm-297" }, { 297, "ibm-297_P100-1995" }, { 1201, "ibm-29872" }, { 1201, "ibm-29873" }, { 1200, "ibm-29874" }, { 1200, "ibm-29875" }, { 300, "ibm-300" }, { 300, "ibm-300_P120-2006" }, { 301, "ibm-301" }, { 301, "ibm-301_P110-1997" }, { 33058, "ibm-33058" }, { 33058, "ibm-33058_P100-2000" }, { 5050, "ibm-33722" }, { 5050, "ibm-33722_P120-1999" }, { 51932, "ibm-33722_P12A_P12A-2004_U2" }, { 20127, "ibm-367" }, { 37, "ibm-37" }, { 37, "ibm-37_P100-1995" }, { 420, "ibm-420" }, { 420, "ibm-420_X120-1999" }, { 424, "ibm-424" }, { 424, "ibm-424_P100-1995" }, { 425, "ibm-425" }, { 425, "ibm-425_P101-2000" }, { 437, "ibm-437" }, { 437, "ibm-437_P100-1995" }, { 4517, "ibm-4517" }, { 4517, "ibm-4517_P100-2005" }, { 4899, "ibm-4899" }, { 4899, "ibm-4899_P100-1998" }, { 57002, "ibm-4902" }, { 4909, "ibm-4909" }, { 4909, "ibm-4909_P100-1999" }, { 4930, "ibm-4930" }, { 4930, "ibm-4930_P110-1999" }, { 4933, "ibm-4933" }, { 4933, "ibm-4933_P100-2002" }, { 4948, "ibm-4948" }, { 4948, "ibm-4948_P100-1995" }, { 4951, "ibm-4951" }, { 4951, "ibm-4951_P100-1995" }, { 4952, "ibm-4952" }, { 4952, "ibm-4952_P100-1995" }, { 4960, "ibm-4960" }, { 4960, "ibm-4960_P100-1995" }, { 4971, "ibm-4971" }, { 4971, "ibm-4971_P100-1999" }, { 500, "ibm-500" }, { 500, "ibm-500_P100-1995" }, { 28598, "ibm-5012" }, { 28598, "ibm-5012_P100-1999" }, { 5026, "ibm-5026" }, { 5035, "ibm-5035" }, { 5039, "ibm-5039" }, { 5039, "ibm-5039_P11A-1998" }, { 5048, "ibm-5048" }, { 5048, "ibm-5048_P100-1995" }, { 5049, "ibm-5049" }, { 5049, "ibm-5049_P100-1995" }, { 5050, "ibm-5050" }, { 5054, "ibm-5054" }, { 5067, "ibm-5067" }, { 5067, "ibm-5067_P100-1995" }, { 5104, "ibm-5104" }, { 5104, "ibm-5104_X110-1999" }, { 5123, "ibm-5123" }, { 5123, "ibm-5123_P100-1999" }, { 65001, "ibm-5304" }, { 65001, "ibm-5305" }, { 1250, "ibm-5346" }, { 1250, "ibm-5346_P100-1998" }, { 1251, "ibm-5347" }, { 1251, "ibm-5347_P100-1998" }, { 1252, "ibm-5348" }, { 1252, "ibm-5348_P100-1997" }, { 1253, "ibm-5349" }, { 1253, "ibm-5349_P100-1998" }, { 1254, "ibm-5350" }, { 1254, "ibm-5350_P100-1998" }, { 5351, "ibm-5351" }, { 5351, "ibm-5351_P100-1998" }, { 5352, "ibm-5352" }, { 5352, "ibm-5352_P100-1998" }, { 5353, "ibm-5353" }, { 5353, "ibm-5353_P100-1998" }, { 1258, "ibm-5354" }, { 1258, "ibm-5354_P100-1998" }, { 5471, "ibm-5471" }, { 5471, "ibm-5471_P100-2006" }, { 5478, "ibm-5478" }, { 5478, "ibm-5478_P100-1995" }, { 1201, "ibm-61955" }, { 1201, "ibm-61956" }, { 65025, "ibm-65025" }, { 720, "ibm-720" }, { 720, "ibm-720_P100-1997" }, { 737, "ibm-737" }, { 737, "ibm-737_P100-1997" }, { 775, "ibm-775" }, { 775, "ibm-775_P100-1996" }, { 803, "ibm-803" }, { 803, "ibm-803_P100-1999" }, { 806, "ibm-806" }, { 806, "ibm-806_P100-1998" }, { 808, "ibm-808" }, { 808, "ibm-808_P100-1999" }, { 813, "ibm-813" }, { 813, "ibm-813_P100-1995" }, { 819, "ibm-819" }, { 833, "ibm-833" }, { 833, "ibm-833_P100-1995" }, { 834, "ibm-834" }, { 834, "ibm-834_P100-1995" }, { 835, "ibm-835" }, { 835, "ibm-835_P100-1995" }, { 836, "ibm-836" }, { 836, "ibm-836_P100-1995" }, { 837, "ibm-837" }, { 837, "ibm-837_P100-1995" }, { 9030, "ibm-838" }, { 9030, "ibm-838_P100-1995" }, { 848, "ibm-848" }, { 8482, "ibm-8482" }, { 8482, "ibm-8482_P100-1999" }, { 848, "ibm-848_P100-1999" }, { 849, "ibm-849" }, { 849, "ibm-849_P100-1999" }, { 850, "ibm-850" }, { 850, "ibm-850_P100-1995" }, { 851, "ibm-851" }, { 851, "ibm-851_P100-1995" }, { 852, "ibm-852" }, { 852, "ibm-852_P100-1995" }, { 855, "ibm-855" }, { 855, "ibm-855_P100-1995" }, { 856, "ibm-856" }, { 856, "ibm-856_P100-1995" }, { 857, "ibm-857" }, { 857, "ibm-857_P100-1995" }, { 858, "ibm-858" }, { 858, "ibm-858_P100-1997" }, { 859, "ibm-859" }, { 859, "ibm-859_P100-1999" }, { 860, "ibm-860" }, { 860, "ibm-860_P100-1995" }, { 861, "ibm-861" }, { 8612, "ibm-8612" }, { 8612, "ibm-8612_P100-1995" }, { 861, "ibm-861_P100-1995" }, { 862, "ibm-862" }, { 862, "ibm-862_P100-1995" }, { 863, "ibm-863" }, { 863, "ibm-863_P100-1995" }, { 864, "ibm-864" }, { 864, "ibm-864_X110-1999" }, { 865, "ibm-865" }, { 865, "ibm-865_P100-1995" }, { 866, "ibm-866" }, { 866, "ibm-866_P100-1995" }, { 867, "ibm-867" }, { 867, "ibm-867_P100-1998" }, { 868, "ibm-868" }, { 868, "ibm-868_P100-1995" }, { 869, "ibm-869" }, { 869, "ibm-869_P100-1995" }, { 870, "ibm-870" }, { 870, "ibm-870_P100-1995" }, { 871, "ibm-871" }, { 871, "ibm-871_P100-1995" }, { 872, "ibm-872" }, { 872, "ibm-872_P100-1999" }, { 9066, "ibm-874" }, { 9066, "ibm-874_P100-1995" }, { 875, "ibm-875" }, { 875, "ibm-875_P100-1995" }, { 20866, "ibm-878" }, { 20866, "ibm-878_P100-1996" }, { 20880, "ibm-880" }, { 20880, "ibm-880_P100-1995" }, { 896, "ibm-896" }, { 896, "ibm-896_P100-1995" }, { 897, "ibm-897" }, { 897, "ibm-897_P100-1995" }, { 28597, "ibm-9005" }, { 28597, "ibm-9005_X110-2007" }, { 901, "ibm-901" }, { 901, "ibm-901_P100-1999" }, { 902, "ibm-902" }, { 9027, "ibm-9027" }, { 9027, "ibm-9027_P100-1999" }, { 902, "ibm-902_P100-1999" }, { 9030, "ibm-9030" }, { 9048, "ibm-9048" }, { 9048, "ibm-9048_P100-1998" }, { 20905, "ibm-905" }, { 9056, "ibm-9056" }, { 9056, "ibm-9056_P100-1995" }, { 20905, "ibm-905_P100-1995" }, { 9061, "ibm-9061" }, { 9061, "ibm-9061_P100-1999" }, { 9066, "ibm-9066" }, { 9067, "ibm-9067" }, { 9067, "ibm-9067_X100-2005" }, { 28592, "ibm-912" }, { 28592, "ibm-912_P100-1995" }, { 28593, "ibm-913" }, { 28593, "ibm-913_P100-2000" }, { 28594, "ibm-914" }, { 9145, "ibm-9145" }, { 9145, "ibm-9145_P110-1997" }, { 28594, "ibm-914_P100-1995" }, { 28595, "ibm-915" }, { 28595, "ibm-915_P100-1995" }, { 916, "ibm-916" }, { 916, "ibm-916_P100-1995" }, { 918, "ibm-918" }, { 918, "ibm-918_P100-1995" }, { 28599, "ibm-920" }, { 28599, "ibm-920_P100-1995" }, { 28603, "ibm-921" }, { 28603, "ibm-921_P100-1995" }, { 922, "ibm-922" }, { 922, "ibm-922_P100-1999" }, { 28605, "ibm-923" }, { 9238, "ibm-9238" }, { 9238, "ibm-9238_X110-1999" }, { 28605, "ibm-923_P100-1998" }, { 924, "ibm-924" }, { 924, "ibm-924_P100-1998" }, { 926, "ibm-926" }, { 926, "ibm-926_P100-2000" }, { 927, "ibm-927" }, { 927, "ibm-927_P100-1995" }, { 928, "ibm-928" }, { 928, "ibm-928_P100-1995" }, { 5026, "ibm-930" }, { 5026, "ibm-930_P120-1999" }, { 5035, "ibm-931" }, { 932, "ibm-932" }, { 933, "ibm-933" }, { 933, "ibm-933_P110-1995" }, { 935, "ibm-935" }, { 935, "ibm-935_P110-1999" }, { 937, "ibm-937" }, { 937, "ibm-937_P110-1999" }, { 5035, "ibm-939" }, { 5035, "ibm-939_P120-1999" }, { 9400, "ibm-9400" }, { 941, "ibm-941" }, { 941, "ibm-941_P13A-2001" }, { 932, "ibm-942" }, { 9424, "ibm-9424" }, { 932, "ibm-942_P12A-1999" }, { 943, "ibm-943" }, { 943, "ibm-943_P130-1999" }, { 932, "ibm-943_P15A-2003" }, { 944, "ibm-944" }, { 1255, "ibm-9447" }, { 1255, "ibm-9447_P100-2002" }, { 1256, "ibm-9448" }, { 1256, "ibm-9448_X100-2005" }, { 1257, "ibm-9449" }, { 1257, "ibm-9449_P100-2002" }, { 944, "ibm-944_P100-1995" }, { 946, "ibm-946" }, { 946, "ibm-946_P100-1995" }, { 947, "ibm-947" }, { 947, "ibm-947_P100-1995" }, { 948, "ibm-948" }, { 948, "ibm-948_P110-1999" }, { 949, "ibm-949" }, { 949, "ibm-949_P110-1999" }, { 950, "ibm-950" }, { 950, "ibm-950_P110-1999" }, { 951, "ibm-951" }, { 951, "ibm-951_P100-1995" }, { 952, "ibm-952" }, { 952, "ibm-952_P110-1997" }, { 953, "ibm-953" }, { 953, "ibm-953_P100-2000" }, { 954, "ibm-954" }, { 954, "ibm-954_P101-2007" }, { 955, "ibm-955" }, { 955, "ibm-955_P110-1997" }, { 1385, "ibm-9577" }, { 1385, "ibm-9577_P100-2001" }, { 9580, "ibm-9580" }, { 964, "ibm-964" }, { 964, "ibm-964_P110-1999" }, { 51949, "ibm-970" }, { 51949, "ibm-970_P110_P110-2006_U2" }, { 971, "ibm-971" }, { 51949, "ibm-eucKR" }, { 1018, "iso-ir-10" }, { 819, "iso-ir-100" }, { 28592, "iso-ir-101" }, { 28593, "iso-ir-109" }, { 28594, "iso-ir-110" }, { 1020, "iso-ir-121" }, { 28597, "iso-ir-126" }, { 28596, "iso-ir-127" }, { 28598, "iso-ir-138" }, { 28595, "iso-ir-144" }, { 28599, "iso-ir-148" }, { 949, "iso-ir-149" }, { 1012, "iso-ir-15" }, { 1023, "iso-ir-17" }, { 1011, "iso-ir-21" }, { 1104, "iso-ir-25" }, { 1013, "iso-ir-4" }, { 5478, "iso-ir-58" }, { 20127, "iso-ir-6" }, { 1016, "iso-ir-60" }, { 1010, "iso-ir-69" }, { 1015, "iso-ir-84" }, { 1014, "iso-ir-85" }, { 28605, "iso8859_15_fdis" }, { 20127, "iso_646.irv:1983" }, { 20866, "koi8" }, { 949, "korean" }, { 819, "l1" }, { 28592, "l2" }, { 28593, "l3" }, { 28594, "l4" }, { 28599, "l5" }, { 28605, "l9" }, { 28605, "latin0" }, { 819, "latin1" }, { 28592, "latin2" }, { 28593, "latin3" }, { 28594, "latin4" }, { 28599, "latin5" }, { 10000, "mac" }, { 10000, "macintosh" }, { 10000, "macos-0_2-10.2" }, { 10029, "macos-29-10.2" }, { 10081, "macos-35-10.2" }, { 10006, "macos-6_2-10.4" }, { 10007, "macos-7_3-10.2" }, { 10000, "macroman" }, { 949, "ms949" }, { 1016, "no" }, { 1051, "r8" }, { 1051, "roman8" }, { 1018, "se" }, { 9066, "tis620.2533" }, { 1013, "uk" }, { 20127, "us" }, { 10000, "windows-10000" }, { 10006, "windows-10006" }, { 10007, "windows-10007" }, { 10029, "windows-10029" }, { 10081, "windows-10081" }, { 1200, "windows-1200" }, { 1201, "windows-1201" }, { 1250, "windows-1250" }, { 1251, "windows-1251" }, { 1252, "windows-1252" }, { 1253, "windows-1253" }, { 1254, "windows-1254" }, { 1255, "windows-1255" }, { 1256, "windows-1256" }, { 1257, "windows-1257" }, { 1258, "windows-1258" }, { 20127, "windows-20127" }, { 20866, "windows-20866" }, { 20880, "windows-20880" }, { 20905, "windows-20905" }, { 21866, "windows-21866" }, { 28592, "windows-28592" }, { 28593, "windows-28593" }, { 28594, "windows-28594" }, { 28595, "windows-28595" }, { 28596, "windows-28596" }, { 28597, "windows-28597" }, { 28598, "windows-28598" }, { 28599, "windows-28599" }, { 28603, "windows-28603" }, { 28605, "windows-28605" }, { 932, "windows-31j" }, { 437, "windows-437" }, { 51932, "windows-51932" }, { 51949, "windows-51949" }, { 54936, "windows-54936" }, { 57002, "windows-57002" }, { 57006, "windows-57003" }, { 57004, "windows-57004" }, { 57005, "windows-57005" }, { 57006, "windows-57006" }, { 57007, "windows-57007" }, { 57008, "windows-57008" }, { 57009, "windows-57009" }, { 57010, "windows-57010" }, { 57011, "windows-57011" }, { 65000, "windows-65000" }, { 65001, "windows-65001" }, { 720, "windows-720" }, { 737, "windows-737" }, { 775, "windows-775" }, { 850, "windows-850" }, { 852, "windows-852" }, { 855, "windows-855" }, { 857, "windows-857" }, { 858, "windows-858" }, { 861, "windows-861" }, { 862, "windows-862" }, { 866, "windows-866" }, { 869, "windows-869" }, { 874, "windows-874" }, { 874, "windows-874-2000" }, { 932, "windows-932" }, { 936, "windows-936" }, { 936, "windows-936-2000" }, { 949, "windows-949" }, { 949, "windows-949-2000" }, { 950, "windows-950" }, { 950, "windows-950-2000" }, { 1006, "x-IBM1006" }, { 1025, "x-IBM1025" }, { 1027, "x-IBM1027" }, { 1041, "x-IBM1041" }, { 1043, "x-IBM1043" }, { 1046, "x-IBM1046" }, { 1046, "x-IBM1046S" }, { 1088, "x-IBM1088" }, { 1097, "x-IBM1097" }, { 1098, "x-IBM1098" }, { 1112, "x-IBM1112" }, { 1114, "x-IBM1114" }, { 1115, "x-IBM1115" }, { 1122, "x-IBM1122" }, { 1123, "x-IBM1123" }, { 1124, "x-IBM1124" }, { 1153, "x-IBM1153" }, { 1351, "x-IBM1351" }, { 1362, "x-IBM1362" }, { 1363, "x-IBM1363" }, { 1363, "x-IBM1363C" }, { 1364, "x-IBM1364" }, { 1370, "x-IBM1370" }, { 1371, "x-IBM1371" }, { 1380, "x-IBM1380" }, { 1381, "x-IBM1381" }, { 1382, "x-IBM1382" }, { 1385, "x-IBM1385" }, { 9580, "x-IBM1388" }, { 1390, "x-IBM1390" }, { 1399, "x-IBM1399" }, { 300, "x-IBM300" }, { 301, "x-IBM301" }, { 5050, "x-IBM33722" }, { 5050, "x-IBM33722A" }, { 5050, "x-IBM33722C" }, { 720, "x-IBM720" }, { 737, "x-IBM737" }, { 808, "x-IBM808" }, { 833, "x-IBM833" }, { 834, "x-IBM834" }, { 835, "x-IBM835" }, { 836, "x-IBM836" }, { 837, "x-IBM837" }, { 856, "x-IBM856" }, { 859, "x-IBM859" }, { 867, "x-IBM867" }, { 9066, "x-IBM874" }, { 875, "x-IBM875" }, { 897, "x-IBM897" }, { 28603, "x-IBM921" }, { 922, "x-IBM922" }, { 927, "x-IBM927" }, { 5026, "x-IBM930" }, { 5026, "x-IBM930A" }, { 933, "x-IBM933" }, { 935, "x-IBM935" }, { 937, "x-IBM937" }, { 5035, "x-IBM939" }, { 5035, "x-IBM939A" }, { 932, "x-IBM942" }, { 932, "x-IBM942C" }, { 943, "x-IBM943" }, { 947, "x-IBM947" }, { 948, "x-IBM948" }, { 949, "x-IBM949" }, { 950, "x-IBM950" }, { 951, "x-IBM951" }, { 954, "x-IBM954" }, { 954, "x-IBM954C" }, { 964, "x-IBM964" }, { 51949, "x-IBM970" }, { 971, "x-IBM971" }, { 57002, "x-ISCII91" }, { 28596, "x-ISO-8859-6S" }, { 932, "x-JISAutoDetect" }, { 1167, "x-KOI8_RU" }, { 949, "x-KSC5601" }, { 932, "x-MS932_0213" }, { 5471, "x-MS950-HKSCS" }, { 10029, "x-MacCentralEurope" }, { 10007, "x-MacCyrillic" }, { 10006, "x-MacGreek" }, { 10081, "x-MacTurkish" }, { 10007, "x-MacUkraine" }, { 1350, "x-eucJP-Open" }, { 57006, "x-iscii-as" }, { 57006, "x-iscii-be" }, { 57002, "x-iscii-de" }, { 57010, "x-iscii-gu" }, { 57008, "x-iscii-ka" }, { 57009, "x-iscii-ma" }, { 57007, "x-iscii-or" }, { 57011, "x-iscii-pa" }, { 57004, "x-iscii-ta" }, { 57005, "x-iscii-te" }, { 10029, "x-mac-ce" }, { 10029, "x-mac-centraleurroman" }, { 10007, "x-mac-cyrillic" }, { 10006, "x-mac-greek" }, { 10081, "x-mac-turkish" }, { 10000, "x-macroman" }, { 932, "x-ms-cp932" }, { 932, "x-sjis" }, { 1201, "x-utf-16be" }, { 1200, "x-utf-16le" }, { 1256, "x-windows-1256S" }, { 5054, "x-windows-50221" }, { 874, "x-windows-874" }, { 950, "x-windows-950" }, { 0, NULL } }; pspp-1.4.1/src/data/sys-file-writer.c0000644000175000017500000014053213670210420017024 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 1997-2000, 2006-2014 Free Software Foundation, Inc. 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 3 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, see . */ #include #include "data/sys-file-writer.h" #include "data/sys-file-private.h" #include #include #include #include #include #include #include #include "data/attributes.h" #include "data/case.h" #include "data/casewriter-provider.h" #include "data/casewriter.h" #include "data/dictionary.h" #include "data/file-handle-def.h" #include "data/format.h" #include "data/make-file.h" #include "data/missing-values.h" #include "data/mrset.h" #include "data/settings.h" #include "data/short-names.h" #include "data/value-labels.h" #include "data/variable.h" #include "libpspp/float-format.h" #include "libpspp/i18n.h" #include "libpspp/integer-format.h" #include "libpspp/message.h" #include "libpspp/misc.h" #include "libpspp/str.h" #include "libpspp/string-array.h" #include "libpspp/version.h" #include "gl/xmemdup0.h" #include "gl/minmax.h" #include "gl/unlocked-io.h" #include "gl/xalloc.h" #include "gettext.h" #define _(msgid) gettext (msgid) #define N_(msgid) (msgid) /* Compression bias used by PSPP. Values between (1 - COMPRESSION_BIAS) and (251 - COMPRESSION_BIAS) inclusive can be compressed. */ #define COMPRESSION_BIAS 100 /* System file writer. */ struct sfm_writer { struct file_handle *fh; /* File handle. */ struct fh_lock *lock; /* Mutual exclusion for file. */ FILE *file; /* File stream. */ struct replace_file *rf; /* Ticket for replacing output file. */ enum any_compression compression; casenumber case_cnt; /* Number of cases written so far. */ uint8_t space; /* ' ' in the file's character encoding. */ /* Simple compression buffering. Compressed data is output as a series of 8-byte elements, with 1 to 9 such elements clustered together. The first element in a cluster is 8 1-byte opcodes. Some opcodes call for an additional element in the cluster (hence, if there are eight such opcodes, then the cluster contains a full 9 elements). cbuf[] holds a cluster at a time. */ uint8_t cbuf[9][8]; int n_opcodes; /* Number of opcodes in cbuf[0] so far. */ int n_elements; /* Number of elements in cbuf[] so far. */ /* ZLIB compression. */ z_stream zstream; /* ZLIB deflater. */ off_t zstart; struct zblock *blocks; size_t n_blocks, allocated_blocks; /* Variables. */ struct sfm_var *sfm_vars; /* Variables. */ size_t sfm_var_cnt; /* Number of variables. */ size_t segment_cnt; /* Number of variables including extra segments for long string variables. */ }; struct zblock { unsigned int uncompressed_size; unsigned int compressed_size; }; static const struct casewriter_class sys_file_casewriter_class; static void write_header (struct sfm_writer *, const struct dictionary *); static void write_variable (struct sfm_writer *, const struct variable *); static void write_value_labels (struct sfm_writer *, const struct dictionary *); static void write_integer_info_record (struct sfm_writer *, const struct dictionary *); static void write_float_info_record (struct sfm_writer *); static void write_longvar_table (struct sfm_writer *w, const struct dictionary *dict); static void write_encoding_record (struct sfm_writer *w, const struct dictionary *); static void write_vls_length_table (struct sfm_writer *w, const struct dictionary *dict); static void write_long_string_value_labels (struct sfm_writer *, const struct dictionary *); static void write_long_string_missing_values (struct sfm_writer *, const struct dictionary *); static void write_mrsets (struct sfm_writer *, const struct dictionary *, bool pre_v14); static void write_variable_display_parameters (struct sfm_writer *w, const struct dictionary *dict); static void write_documents (struct sfm_writer *, const struct dictionary *); static void write_data_file_attributes (struct sfm_writer *, const struct dictionary *); static void write_variable_attributes (struct sfm_writer *, const struct dictionary *); static void write_int (struct sfm_writer *, int32_t); static void write_int64 (struct sfm_writer *, int64_t); static inline void convert_double_to_output_format (double, uint8_t[8]); static void write_float (struct sfm_writer *, double); static void write_string (struct sfm_writer *, const char *, size_t); static void write_utf8_string (struct sfm_writer *, const char *encoding, const char *string, size_t width); static void write_utf8_record (struct sfm_writer *, const char *encoding, const struct string *content, int subtype); static void write_string_record (struct sfm_writer *, const struct substring content, int subtype); static void write_bytes (struct sfm_writer *, const void *, size_t); static void write_zeros (struct sfm_writer *, size_t); static void write_spaces (struct sfm_writer *, size_t); static void write_value (struct sfm_writer *, const union value *, int width); static void write_case_uncompressed (struct sfm_writer *, const struct ccase *); static void write_case_compressed (struct sfm_writer *, const struct ccase *); static void flush_compressed (struct sfm_writer *); static void put_cmp_opcode (struct sfm_writer *, uint8_t); static void put_cmp_number (struct sfm_writer *, double); static void put_cmp_string (struct sfm_writer *, const void *, size_t); static bool start_zstream (struct sfm_writer *); static void finish_zstream (struct sfm_writer *); static void write_ztrailer (struct sfm_writer *); static bool write_error (const struct sfm_writer *); static bool close_writer (struct sfm_writer *); /* Returns default options for writing a system file. */ struct sfm_write_options sfm_writer_default_options (void) { struct sfm_write_options opts; opts.compression = (settings_get_scompression () ? ANY_COMP_SIMPLE : ANY_COMP_NONE); opts.create_writeable = true; opts.version = 3; return opts; } /* Opens the system file designated by file handle FH for writing cases from dictionary D according to the given OPTS. No reference to D is retained, so it may be modified or destroyed at will after this function returns. D is not modified by this function, except to assign short names. */ struct casewriter * sfm_open_writer (struct file_handle *fh, struct dictionary *d, struct sfm_write_options opts) { struct encoding_info encoding_info; struct sfm_writer *w; mode_t mode; int i; /* Check version. */ if (opts.version != 2 && opts.version != 3) { msg (ME, _("Unknown system file version %d. Treating as version %d."), opts.version, 3); opts.version = 3; } /* Create and initialize writer. */ w = xzalloc (sizeof *w); w->fh = fh_ref (fh); w->lock = NULL; w->file = NULL; w->rf = NULL; /* Use the requested compression, except that no EBCDIC-based ZLIB compressed files have been observed, so drop back to simple compression for those files. */ w->compression = opts.compression; if (w->compression == ANY_COMP_ZLIB && is_encoding_ebcdic_compatible (dict_get_encoding (d))) w->compression = ANY_COMP_SIMPLE; w->case_cnt = 0; w->n_opcodes = w->n_elements = 0; memset (w->cbuf[0], 0, 8); /* Figure out how to map in-memory case data to on-disk case data. Also count the number of segments. Very long strings occupy multiple segments, otherwise each variable only takes one segment. */ w->segment_cnt = sfm_dictionary_to_sfm_vars (d, &w->sfm_vars, &w->sfm_var_cnt); /* Open file handle as an exclusive writer. */ /* TRANSLATORS: this fragment will be interpolated into messages in fh_lock() that identify types of files. */ w->lock = fh_lock (fh, FH_REF_FILE, N_("system file"), FH_ACC_WRITE, true); if (w->lock == NULL) goto error; /* Create the file on disk. */ mode = 0444; if (opts.create_writeable) mode |= 0222; w->rf = replace_file_start (fh, "wb", mode, &w->file); if (w->rf == NULL) { msg (ME, _("Error opening `%s' for writing as a system file: %s."), fh_get_file_name (fh), strerror (errno)); goto error; } get_encoding_info (&encoding_info, dict_get_encoding (d)); w->space = encoding_info.space[0]; /* Write the file header. */ write_header (w, d); /* Write basic variable info. */ short_names_assign (d); for (i = 0; i < dict_get_var_cnt (d); i++) write_variable (w, dict_get_var (d, i)); write_value_labels (w, d); if (dict_get_document_line_cnt (d) > 0) write_documents (w, d); write_integer_info_record (w, d); write_float_info_record (w); write_mrsets (w, d, true); write_variable_display_parameters (w, d); if (opts.version >= 3) write_longvar_table (w, d); write_vls_length_table (w, d); write_long_string_value_labels (w, d); write_long_string_missing_values (w, d); if (opts.version >= 3) { if (attrset_count (dict_get_attributes (d))) write_data_file_attributes (w, d); write_variable_attributes (w, d); } write_mrsets (w, d, false); write_encoding_record (w, d); /* Write end-of-headers record. */ write_int (w, 999); write_int (w, 0); if (w->compression == ANY_COMP_ZLIB) { w->zstream.zalloc = Z_NULL; w->zstream.zfree = Z_NULL; w->zstream.opaque = Z_NULL; w->zstart = ftello (w->file); write_int64 (w, w->zstart); write_int64 (w, 0); write_int64 (w, 0); start_zstream (w); } if (write_error (w)) goto error; return casewriter_create (dict_get_proto (d), &sys_file_casewriter_class, w); error: close_writer (w); return NULL; } /* Returns value of X truncated to two least-significant digits. */ static int rerange (int x) { if (x < 0) x = -x; if (x >= 100) x %= 100; return x; } /* Calculates the offset of data for TARGET_VAR from the beginning of each case's data for dictionary D. The return value is in "octs" (8-byte units). */ static int calc_oct_idx (const struct dictionary *d, struct variable *target_var) { int oct_idx; int i; oct_idx = 0; for (i = 0; i < dict_get_var_cnt (d); i++) { struct variable *var = dict_get_var (d, i); if (var == target_var) break; oct_idx += sfm_width_to_octs (var_get_width (var)); } return oct_idx; } /* Write the sysfile_header header to system file W. */ static void write_header (struct sfm_writer *w, const struct dictionary *d) { const char *dict_encoding = dict_get_encoding (d); char prod_name[61]; const char *file_label; struct variable *weight; time_t t; /* Record-type code. */ if (is_encoding_ebcdic_compatible (dict_encoding)) write_string (w, EBCDIC_MAGIC, 4); else if (w->compression == ANY_COMP_ZLIB) write_string (w, ASCII_ZMAGIC, 4); else write_string (w, ASCII_MAGIC, 4); /* Product identification. */ snprintf (prod_name, sizeof prod_name, "@(#) SPSS DATA FILE %s - %s", version, host_system); write_utf8_string (w, dict_encoding, prod_name, 60); /* Layout code. */ write_int (w, 2); /* Number of `union value's per case. */ write_int (w, calc_oct_idx (d, NULL)); /* Compressed? */ write_int (w, (w->compression == ANY_COMP_NONE ? 0 : w->compression == ANY_COMP_SIMPLE ? 1 : 2)); /* Weight variable. */ weight = dict_get_weight (d); write_int (w, weight != NULL ? calc_oct_idx (d, weight) + 1 : 0); /* Number of cases. We don't know this in advance, so we write -1 to indicate an unknown number of cases. Later we can come back and overwrite it with the true value. */ write_int (w, -1); /* Compression bias. */ write_float (w, COMPRESSION_BIAS); /* Creation date and time. */ char *creation_date, *creation_time; if (time (&t) == (time_t) -1) { creation_date = xstrdup ("01 Jan 70"); creation_time = xstrdup ("00:00:00"); } else { static const char *const month_name[12] = { "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec", }; struct tm *tmp = localtime (&t); int day = rerange (tmp->tm_mday); int mon = rerange (tmp->tm_mon + 1); int year = rerange (tmp->tm_year); int hour = rerange (tmp->tm_hour + 1); int min = rerange (tmp->tm_min + 1); int sec = rerange (tmp->tm_sec + 1); creation_date = xasprintf ("%02d %s %02d", day, month_name[mon - 1], year); creation_time = xasprintf ("%02d:%02d:%02d", hour - 1, min - 1, sec - 1); } write_utf8_string (w, dict_encoding, creation_date, 9); write_utf8_string (w, dict_encoding, creation_time, 8); free (creation_time); free (creation_date); /* File label. */ file_label = dict_get_label (d); if (file_label == NULL) file_label = ""; write_utf8_string (w, dict_encoding, file_label, 64); /* Padding. */ write_zeros (w, 3); } /* Write format spec FMT to W, after adjusting it to be compatible with the given WIDTH. */ static void write_format (struct sfm_writer *w, struct fmt_spec fmt, int width) { assert (fmt_check_output (&fmt)); assert (sfm_width_to_segments (width) == 1); if (width > 0) fmt_resize (&fmt, width); write_int (w, (fmt_to_io (fmt.type) << 16) | (fmt.w << 8) | fmt.d); } /* Write a string continuation variable record for each 8-byte section beyond the initial 8 bytes, for a variable of the given WIDTH. */ static void write_variable_continuation_records (struct sfm_writer *w, int width) { int position; assert (sfm_width_to_segments (width) == 1); for (position = 8; position < width; position += 8) { write_int (w, 2); /* Record type. */ write_int (w, -1); /* Width. */ write_int (w, 0); /* No variable label. */ write_int (w, 0); /* No missing values. */ write_int (w, 0); /* Print format. */ write_int (w, 0); /* Write format. */ write_zeros (w, 8); /* Name. */ } } /* Write the variable record(s) for variable V to system file W. */ static void write_variable (struct sfm_writer *w, const struct variable *v) { int width = var_get_width (v); int segment_cnt = sfm_width_to_segments (width); int seg0_width = sfm_segment_alloc_width (width, 0); const char *encoding = var_get_encoding (v); int i; /* Record type. */ write_int (w, 2); /* Width. */ write_int (w, seg0_width); /* Variable has a variable label? */ write_int (w, var_has_label (v)); /* Number of missing values. If there is a range, then the range counts as 2 missing values and causes the number to be negated. Missing values for long string variables are written in a separate record. */ enum { MAX_SHORT_STRING = 8 }; if (width <= MAX_SHORT_STRING) { const struct missing_values *mv = var_get_missing_values (v); if (mv_has_range (mv)) write_int (w, -2 - mv_n_values (mv)); else write_int (w, mv_n_values (mv)); } else write_int (w, 0); /* Print and write formats. */ write_format (w, *var_get_print_format (v), seg0_width); write_format (w, *var_get_write_format (v), seg0_width); /* Short name. The full name is in a translation table written separately. */ write_utf8_string (w, encoding, var_get_short_name (v, 0), 8); /* Value label. */ if (var_has_label (v)) { char *label = recode_string (encoding, UTF8, var_get_label (v), -1); size_t label_len = MIN (strlen (label), 255); size_t padded_len = ROUND_UP (label_len, 4); write_int (w, label_len); write_string (w, label, padded_len); free (label); } /* Write the missing values, if any, range first. */ if (width <= MAX_SHORT_STRING) { const struct missing_values *mv = var_get_missing_values (v); if (mv_has_range (mv)) { double x, y; mv_get_range (mv, &x, &y); write_float (w, x); write_float (w, y); } for (i = 0; i < mv_n_values (mv); i++) write_value (w, mv_get_value (mv, i), width); } write_variable_continuation_records (w, seg0_width); /* Write additional segments for very long string variables. */ for (i = 1; i < segment_cnt; i++) { int seg_width = sfm_segment_alloc_width (width, i); struct fmt_spec fmt = fmt_for_output (FMT_A, MAX (seg_width, 1), 0); write_int (w, 2); /* Variable record. */ write_int (w, seg_width); /* Width. */ write_int (w, 0); /* No variable label. */ write_int (w, 0); /* No missing values. */ write_format (w, fmt, seg_width); /* Print format. */ write_format (w, fmt, seg_width); /* Write format. */ write_utf8_string (w, encoding, var_get_short_name (v, i), 8); write_variable_continuation_records (w, seg_width); } } /* Writes the value labels to system file W. Value labels for long string variables are written separately, by write_long_string_value_labels. */ static void write_value_labels (struct sfm_writer *w, const struct dictionary *d) { struct label_set { struct hmap_node hmap_node; const struct val_labs *val_labs; int *indexes; size_t n_indexes, allocated_indexes; }; size_t n_sets, allocated_sets; struct label_set **sets; struct hmap same_sets; size_t i; int idx; n_sets = allocated_sets = 0; sets = NULL; hmap_init (&same_sets); idx = 0; for (i = 0; i < dict_get_var_cnt (d); i++) { struct variable *v = dict_get_var (d, i); if (var_has_value_labels (v) && var_get_width (v) <= 8) { const struct val_labs *val_labs = var_get_value_labels (v); unsigned int hash = val_labs_hash (val_labs, 0); struct label_set *set; HMAP_FOR_EACH_WITH_HASH (set, struct label_set, hmap_node, hash, &same_sets) { if (val_labs_equal (set->val_labs, val_labs)) { if (set->n_indexes >= set->allocated_indexes) set->indexes = x2nrealloc (set->indexes, &set->allocated_indexes, sizeof *set->indexes); set->indexes[set->n_indexes++] = idx; goto next_var; } } set = xmalloc (sizeof *set); set->val_labs = val_labs; set->indexes = xmalloc (sizeof *set->indexes); set->indexes[0] = idx; set->n_indexes = 1; set->allocated_indexes = 1; hmap_insert (&same_sets, &set->hmap_node, hash); if (n_sets >= allocated_sets) sets = x2nrealloc (sets, &allocated_sets, sizeof *sets); sets[n_sets++] = set; } next_var: idx += sfm_width_to_octs (var_get_width (v)); } for (i = 0; i < n_sets; i++) { const struct label_set *set = sets[i]; const struct val_labs *val_labs = set->val_labs; size_t n_labels = val_labs_count (val_labs); int width = val_labs_get_width (val_labs); const struct val_lab **labels; size_t j; /* Value label record. */ write_int (w, 3); /* Record type. */ write_int (w, n_labels); labels = val_labs_sorted (val_labs); for (j = 0; j < n_labels; j++) { const struct val_lab *vl = labels[j]; char *label = recode_string (dict_get_encoding (d), UTF8, val_lab_get_escaped_label (vl), -1); uint8_t len = MIN (strlen (label), 255); write_value (w, val_lab_get_value (vl), width); write_bytes (w, &len, 1); write_bytes (w, label, len); write_zeros (w, REM_RND_UP (len + 1, 8)); free (label); } free (labels); /* Value label variable record. */ write_int (w, 4); /* Record type. */ write_int (w, set->n_indexes); for (j = 0; j < set->n_indexes; j++) write_int (w, set->indexes[j] + 1); } for (i = 0; i < n_sets; i++) { struct label_set *set = sets[i]; free (set->indexes); free (set); } free (sets); hmap_destroy (&same_sets); } /* Writes record type 6, document record. */ static void write_documents (struct sfm_writer *w, const struct dictionary *d) { const struct string_array *docs = dict_get_documents (d); const char *enc = dict_get_encoding (d); size_t i; write_int (w, 6); /* Record type. */ write_int (w, docs->n); for (i = 0; i < docs->n; i++) { char *s = recode_string (enc, "UTF-8", docs->strings[i], -1); size_t s_len = strlen (s); size_t write_len = MIN (s_len, DOC_LINE_LENGTH); write_bytes (w, s, write_len); write_spaces (w, DOC_LINE_LENGTH - write_len); free (s); } } static void put_attrset (struct string *string, const struct attrset *attrs) { const struct attribute *attr; struct attrset_iterator i; for (attr = attrset_first (attrs, &i); attr != NULL; attr = attrset_next (attrs, &i)) { size_t n_values = attribute_get_n_values (attr); size_t j; ds_put_cstr (string, attribute_get_name (attr)); ds_put_byte (string, '('); for (j = 0; j < n_values; j++) ds_put_format (string, "'%s'\n", attribute_get_value (attr, j)); ds_put_byte (string, ')'); } } static void write_data_file_attributes (struct sfm_writer *w, const struct dictionary *d) { struct string s = DS_EMPTY_INITIALIZER; put_attrset (&s, dict_get_attributes (d)); write_utf8_record (w, dict_get_encoding (d), &s, 17); ds_destroy (&s); } static void add_role_attribute (enum var_role role, struct attrset *attrs) { struct attribute *attr; const char *s; switch (role) { case ROLE_INPUT: default: s = "0"; break; case ROLE_TARGET: s = "1"; break; case ROLE_BOTH: s = "2"; break; case ROLE_NONE: s = "3"; break; case ROLE_PARTITION: s = "4"; break; case ROLE_SPLIT: s = "5"; break; } attrset_delete (attrs, "$@Role"); attr = attribute_create ("$@Role"); attribute_add_value (attr, s); attrset_add (attrs, attr); } static void write_variable_attributes (struct sfm_writer *w, const struct dictionary *d) { struct string s = DS_EMPTY_INITIALIZER; size_t n_vars = dict_get_var_cnt (d); size_t n_attrsets = 0; size_t i; for (i = 0; i < n_vars; i++) { struct variable *v = dict_get_var (d, i); struct attrset attrs; attrset_clone (&attrs, var_get_attributes (v)); add_role_attribute (var_get_role (v), &attrs); if (n_attrsets++) ds_put_byte (&s, '/'); ds_put_format (&s, "%s:", var_get_name (v)); put_attrset (&s, &attrs); attrset_destroy (&attrs); } if (n_attrsets) write_utf8_record (w, dict_get_encoding (d), &s, 18); ds_destroy (&s); } /* Write multiple response sets. If PRE_V14 is true, writes sets supported by SPSS before release 14, otherwise writes sets supported only by later versions. */ static void write_mrsets (struct sfm_writer *w, const struct dictionary *dict, bool pre_v14) { const char *encoding = dict_get_encoding (dict); struct string s = DS_EMPTY_INITIALIZER; size_t n_mrsets; size_t i; if (is_encoding_ebcdic_compatible (encoding)) { /* FIXME. */ return; } n_mrsets = dict_get_n_mrsets (dict); if (n_mrsets == 0) return; for (i = 0; i < n_mrsets; i++) { const struct mrset *mrset = dict_get_mrset (dict, i); char *name; size_t j; if ((mrset->type != MRSET_MD || mrset->cat_source != MRSET_COUNTEDVALUES) != pre_v14) continue; name = recode_string (encoding, "UTF-8", mrset->name, -1); ds_put_format (&s, "%s=", name); free (name); if (mrset->type == MRSET_MD) { char *counted; if (mrset->cat_source == MRSET_COUNTEDVALUES) ds_put_format (&s, "E %d ", mrset->label_from_var_label ? 11 : 1); else ds_put_byte (&s, 'D'); if (mrset->width == 0) counted = xasprintf ("%.0f", mrset->counted.f); else counted = xmemdup0 (mrset->counted.s, mrset->width); ds_put_format (&s, "%zu %s", strlen (counted), counted); free (counted); } else ds_put_byte (&s, 'C'); ds_put_byte (&s, ' '); if (mrset->label && !mrset->label_from_var_label) { char *label = recode_string (encoding, "UTF-8", mrset->label, -1); ds_put_format (&s, "%zu %s", strlen (label), label); free (label); } else ds_put_cstr (&s, "0 "); for (j = 0; j < mrset->n_vars; j++) { const char *short_name_utf8 = var_get_short_name (mrset->vars[j], 0); char *lower_name_utf8 = utf8_to_lower (short_name_utf8); char *short_name = recode_string (encoding, "UTF-8", lower_name_utf8, -1); ds_put_format (&s, " %s", short_name); free (short_name); free (lower_name_utf8); } ds_put_byte (&s, '\n'); } if (!ds_is_empty (&s)) write_string_record (w, ds_ss (&s), pre_v14 ? 7 : 19); ds_destroy (&s); } /* Write the alignment, width and scale values. */ static void write_variable_display_parameters (struct sfm_writer *w, const struct dictionary *dict) { int i; write_int (w, 7); /* Record type. */ write_int (w, 11); /* Record subtype. */ write_int (w, 4); /* Data item (int32) size. */ write_int (w, w->segment_cnt * 3); /* Number of data items. */ for (i = 0; i < dict_get_var_cnt (dict); ++i) { struct variable *v = dict_get_var (dict, i); int width = var_get_width (v); int segment_cnt = sfm_width_to_segments (width); int measure = (var_get_measure (v) == MEASURE_NOMINAL ? 1 : var_get_measure (v) == MEASURE_ORDINAL ? 2 : 3); int alignment = (var_get_alignment (v) == ALIGN_LEFT ? 0 : var_get_alignment (v) == ALIGN_RIGHT ? 1 : 2); int i; for (i = 0; i < segment_cnt; i++) { int width_left = width - sfm_segment_effective_offset (width, i); write_int (w, measure); write_int (w, (i == 0 ? var_get_display_width (v) : var_default_display_width (width_left))); write_int (w, alignment); } } } /* Writes the table of lengths for very long string variables. */ static void write_vls_length_table (struct sfm_writer *w, const struct dictionary *dict) { struct string map; int i; ds_init_empty (&map); for (i = 0; i < dict_get_var_cnt (dict); ++i) { const struct variable *v = dict_get_var (dict, i); if (sfm_width_to_segments (var_get_width (v)) > 1) ds_put_format (&map, "%s=%05d%c\t", var_get_short_name (v, 0), var_get_width (v), 0); } if (!ds_is_empty (&map)) write_utf8_record (w, dict_get_encoding (dict), &map, 14); ds_destroy (&map); } static void write_long_string_value_labels (struct sfm_writer *w, const struct dictionary *dict) { const char *encoding = dict_get_encoding (dict); size_t n_vars = dict_get_var_cnt (dict); size_t size, i; /* Figure out the size in advance. */ size = 0; for (i = 0; i < n_vars; i++) { struct variable *var = dict_get_var (dict, i); const struct val_labs *val_labs = var_get_value_labels (var); int width = var_get_width (var); const struct val_lab *val_lab; if (val_labs_count (val_labs) == 0 || width < 9) continue; size += 12; size += recode_string_len (encoding, "UTF-8", var_get_name (var), -1); for (val_lab = val_labs_first (val_labs); val_lab != NULL; val_lab = val_labs_next (val_labs, val_lab)) { size += 8 + width; size += recode_string_len (encoding, "UTF-8", val_lab_get_escaped_label (val_lab), -1); } } if (size == 0) return; write_int (w, 7); /* Record type. */ write_int (w, 21); /* Record subtype */ write_int (w, 1); /* Data item (byte) size. */ write_int (w, size); /* Number of data items. */ for (i = 0; i < n_vars; i++) { struct variable *var = dict_get_var (dict, i); const struct val_labs *val_labs = var_get_value_labels (var); int width = var_get_width (var); const struct val_lab *val_lab; char *var_name; if (val_labs_count (val_labs) == 0 || width < 9) continue; var_name = recode_string (encoding, "UTF-8", var_get_name (var), -1); write_int (w, strlen (var_name)); write_bytes (w, var_name, strlen (var_name)); free (var_name); write_int (w, width); write_int (w, val_labs_count (val_labs)); for (val_lab = val_labs_first (val_labs); val_lab != NULL; val_lab = val_labs_next (val_labs, val_lab)) { char *label; size_t len; write_int (w, width); write_bytes (w, val_lab_get_value (val_lab)->s, width); label = recode_string (var_get_encoding (var), "UTF-8", val_lab_get_escaped_label (val_lab), -1); len = strlen (label); write_int (w, len); write_bytes (w, label, len); free (label); } } } static void write_long_string_missing_values (struct sfm_writer *w, const struct dictionary *dict) { const char *encoding = dict_get_encoding (dict); size_t n_vars = dict_get_var_cnt (dict); size_t size, i; /* Figure out the size in advance. */ size = 0; for (i = 0; i < n_vars; i++) { struct variable *var = dict_get_var (dict, i); const struct missing_values *mv = var_get_missing_values (var); int width = var_get_width (var); if (mv_is_empty (mv) || width < 9) continue; size += 4; size += recode_string_len (encoding, "UTF-8", var_get_name (var), -1); size += 1; size += mv_n_values (mv) * (4 + 8); } if (size == 0) return; write_int (w, 7); /* Record type. */ write_int (w, 22); /* Record subtype */ write_int (w, 1); /* Data item (byte) size. */ write_int (w, size); /* Number of data items. */ for (i = 0; i < n_vars; i++) { struct variable *var = dict_get_var (dict, i); const struct missing_values *mv = var_get_missing_values (var); int width = var_get_width (var); uint8_t n_missing_values; char *var_name; int j; if (mv_is_empty (mv) || width < 9) continue; var_name = recode_string (encoding, "UTF-8", var_get_name (var), -1); write_int (w, strlen (var_name)); write_bytes (w, var_name, strlen (var_name)); free (var_name); n_missing_values = mv_n_values (mv); write_bytes (w, &n_missing_values, 1); for (j = 0; j < n_missing_values; j++) { const union value *value = mv_get_value (mv, j); write_int (w, 8); write_bytes (w, value->s, 8); } } } static void write_encoding_record (struct sfm_writer *w, const struct dictionary *d) { /* IANA says "...character set names may be up to 40 characters taken from the printable characters of US-ASCII," so character set names don't need to be recoded to be in UTF-8. We convert encoding names to uppercase because SPSS writes encoding names in uppercase. */ char *encoding = xstrdup (dict_get_encoding (d)); str_uppercase (encoding); write_string_record (w, ss_cstr (encoding), 20); free (encoding); } /* Writes the long variable name table. */ static void write_longvar_table (struct sfm_writer *w, const struct dictionary *dict) { struct string map; size_t i; ds_init_empty (&map); for (i = 0; i < dict_get_var_cnt (dict); i++) { struct variable *v = dict_get_var (dict, i); if (i) ds_put_byte (&map, '\t'); ds_put_format (&map, "%s=%s", var_get_short_name (v, 0), var_get_name (v)); } write_utf8_record (w, dict_get_encoding (dict), &map, 13); ds_destroy (&map); } /* Write integer information record. */ static void write_integer_info_record (struct sfm_writer *w, const struct dictionary *d) { const char *dict_encoding = dict_get_encoding (d); int version_component[3]; int float_format; int codepage; /* Parse the version string. */ memset (version_component, 0, sizeof version_component); sscanf (bare_version, "%d.%d.%d", &version_component[0], &version_component[1], &version_component[2]); /* Figure out the floating-point format. */ if (FLOAT_NATIVE_64_BIT == FLOAT_IEEE_DOUBLE_LE || FLOAT_NATIVE_64_BIT == FLOAT_IEEE_DOUBLE_BE) float_format = 1; else if (FLOAT_NATIVE_64_BIT == FLOAT_Z_LONG) float_format = 2; else if (FLOAT_NATIVE_64_BIT == FLOAT_VAX_D) float_format = 3; else abort (); /* Choose codepage. */ codepage = sys_get_codepage_from_encoding (dict_encoding); if (codepage == 0) { /* The codepage is unknown. Choose a default. For an EBCDIC-compatible encoding, use the value for EBCDIC. For an ASCII-compatible encoding, default to "7-bit ASCII", because many files use this codepage number regardless of their actual encoding. */ if (is_encoding_ascii_compatible (dict_encoding)) codepage = 2; else if (is_encoding_ebcdic_compatible (dict_encoding)) codepage = 1; } /* Write record. */ write_int (w, 7); /* Record type. */ write_int (w, 3); /* Record subtype. */ write_int (w, 4); /* Data item (int32) size. */ write_int (w, 8); /* Number of data items. */ write_int (w, version_component[0]); write_int (w, version_component[1]); write_int (w, version_component[2]); write_int (w, -1); /* Machine code. */ write_int (w, float_format); write_int (w, 1); /* Compression code. */ write_int (w, INTEGER_NATIVE == INTEGER_MSB_FIRST ? 1 : 2); write_int (w, codepage); } /* Write floating-point information record. */ static void write_float_info_record (struct sfm_writer *w) { write_int (w, 7); /* Record type. */ write_int (w, 4); /* Record subtype. */ write_int (w, 8); /* Data item (flt64) size. */ write_int (w, 3); /* Number of data items. */ write_float (w, SYSMIS); /* System-missing value. */ write_float (w, HIGHEST); /* Value used for HIGHEST in missing values. */ write_float (w, LOWEST); /* Value used for LOWEST in missing values. */ } /* Writes case C to system file W. */ static void sys_file_casewriter_write (struct casewriter *writer, void *w_, struct ccase *c) { struct sfm_writer *w = w_; if (ferror (w->file)) { casewriter_force_error (writer); case_unref (c); return; } w->case_cnt++; if (w->compression == ANY_COMP_NONE) write_case_uncompressed (w, c); else write_case_compressed (w, c); case_unref (c); } /* Destroys system file writer W. */ static void sys_file_casewriter_destroy (struct casewriter *writer, void *w_) { struct sfm_writer *w = w_; if (!close_writer (w)) casewriter_force_error (writer); } /* Returns true if an I/O error has occurred on WRITER, false otherwise. */ static bool write_error (const struct sfm_writer *writer) { return ferror (writer->file); } /* Closes a system file after we're done with it. Returns true if successful, false if an I/O error occurred. */ static bool close_writer (struct sfm_writer *w) { bool ok; if (w == NULL) return true; ok = true; if (w->file != NULL) { /* Flush buffer. */ flush_compressed (w); if (w->compression == ANY_COMP_ZLIB) { finish_zstream (w); write_ztrailer (w); } fflush (w->file); ok = !write_error (w); /* Seek back to the beginning and update the number of cases. This is just a courtesy to later readers, so there's no need to check return values or report errors. */ if (ok && w->case_cnt <= INT32_MAX && !fseeko (w->file, 80, SEEK_SET)) { write_int (w, w->case_cnt); clearerr (w->file); } if (fclose (w->file) == EOF) ok = false; if (!ok) msg (ME, _("An I/O error occurred writing system file `%s'."), fh_get_file_name (w->fh)); if (ok ? !replace_file_commit (w->rf) : !replace_file_abort (w->rf)) ok = false; } free (w->blocks); fh_unlock (w->lock); fh_unref (w->fh); free (w->sfm_vars); free (w); return ok; } /* System file writer casewriter class. */ static const struct casewriter_class sys_file_casewriter_class = { sys_file_casewriter_write, sys_file_casewriter_destroy, NULL, }; /* Writes case C to system file W, without compressing it. */ static void write_case_uncompressed (struct sfm_writer *w, const struct ccase *c) { size_t i; for (i = 0; i < w->sfm_var_cnt; i++) { struct sfm_var *v = &w->sfm_vars[i]; if (v->var_width == 0) write_float (w, case_num_idx (c, v->case_index)); else { write_bytes (w, case_str_idx (c, v->case_index) + v->offset, v->segment_width); write_spaces (w, v->padding); } } } /* Writes case C to system file W, with compression. */ static void write_case_compressed (struct sfm_writer *w, const struct ccase *c) { size_t i; for (i = 0; i < w->sfm_var_cnt; i++) { struct sfm_var *v = &w->sfm_vars[i]; if (v->var_width == 0) { double d = case_num_idx (c, v->case_index); if (d == SYSMIS) put_cmp_opcode (w, 255); else if (d >= 1 - COMPRESSION_BIAS && d <= 251 - COMPRESSION_BIAS && d == (int) d) put_cmp_opcode (w, (int) d + COMPRESSION_BIAS); else put_cmp_number (w, d); } else { int offset = v->offset; int width, padding; /* This code properly deals with a width that is not a multiple of 8, by ensuring that the final partial oct (8 byte unit) is treated as padded with spaces on the right. */ for (width = v->segment_width; width > 0; width -= 8, offset += 8) { const void *data = case_str_idx (c, v->case_index) + offset; int chunk_size = MIN (width, 8); if (!memcmp (data, " ", chunk_size)) put_cmp_opcode (w, 254); else put_cmp_string (w, data, chunk_size); } /* This code deals properly with padding that is not a multiple of 8 bytes, by discarding the remainder, which was already effectively padded with spaces in the previous loop. (Note that v->width + v->padding is always a multiple of 8.) */ for (padding = v->padding / 8; padding > 0; padding--) put_cmp_opcode (w, 254); } } } static bool start_zstream (struct sfm_writer *w) { int error; error = deflateInit (&w->zstream, 1); if (error != Z_OK) { msg (ME, _("Failed to initialize ZLIB for compression (%s)."), w->zstream.msg); return false; } return true; } static void finish_zstream (struct sfm_writer *w) { struct zblock *block; int error; assert (w->zstream.total_in <= ZBLOCK_SIZE); w->zstream.next_in = NULL; w->zstream.avail_in = 0; do { uint8_t buf[4096]; w->zstream.next_out = buf; w->zstream.avail_out = sizeof buf; error = deflate (&w->zstream, Z_FINISH); write_bytes (w, buf, w->zstream.next_out - buf); } while (error == Z_OK); if (error != Z_STREAM_END) msg (ME, _("Failed to complete ZLIB stream compression (%s)."), w->zstream.msg); if (w->n_blocks >= w->allocated_blocks) w->blocks = x2nrealloc (w->blocks, &w->allocated_blocks, sizeof *w->blocks); block = &w->blocks[w->n_blocks++]; block->uncompressed_size = w->zstream.total_in; block->compressed_size = w->zstream.total_out; deflateEnd (&w->zstream); } static void write_zlib (struct sfm_writer *w, const void *data_, unsigned int n) { const uint8_t *data = data_; while (n > 0) { unsigned int chunk; if (w->zstream.total_in >= ZBLOCK_SIZE) { finish_zstream (w); start_zstream (w); } chunk = MIN (n, ZBLOCK_SIZE - w->zstream.total_in); w->zstream.next_in = CONST_CAST (uint8_t *, data); w->zstream.avail_in = chunk; do { uint8_t buf[4096]; int error; w->zstream.next_out = buf; w->zstream.avail_out = sizeof buf; error = deflate (&w->zstream, Z_NO_FLUSH); write_bytes (w, buf, w->zstream.next_out - buf); if (error != Z_OK) { msg (ME, _("ZLIB stream compression failed (%s)."), w->zstream.msg); return; } } while (w->zstream.avail_in > 0 || w->zstream.avail_out == 0); data += chunk; n -= chunk; } } static void write_ztrailer (struct sfm_writer *w) { long long int uncompressed_ofs; long long int compressed_ofs; const struct zblock *block; write_int64 (w, -COMPRESSION_BIAS); write_int64 (w, 0); write_int (w, ZBLOCK_SIZE); write_int (w, w->n_blocks); uncompressed_ofs = w->zstart; compressed_ofs = w->zstart + 24; for (block = w->blocks; block < &w->blocks[w->n_blocks]; block++) { write_int64 (w, uncompressed_ofs); write_int64 (w, compressed_ofs); write_int (w, block->uncompressed_size); write_int (w, block->compressed_size); uncompressed_ofs += block->uncompressed_size; compressed_ofs += block->compressed_size; } if (!fseeko (w->file, w->zstart + 8, SEEK_SET)) { write_int64 (w, compressed_ofs); write_int64 (w, 24 + (w->n_blocks * 24)); } else msg (ME, _("%s: Seek failed (%s)."), fh_get_file_name (w->fh), strerror (errno)); } /* Flushes buffered compressed opcodes and data to W. */ static void flush_compressed (struct sfm_writer *w) { if (w->n_opcodes) { unsigned int n = 8 * (1 + w->n_elements); if (w->compression == ANY_COMP_SIMPLE) write_bytes (w, w->cbuf, n); else write_zlib (w, w->cbuf, n); w->n_opcodes = w->n_elements = 0; memset (w->cbuf[0], 0, 8); } } /* Appends OPCODE to the buffered set of compression opcodes in W. Flushes the compression buffer beforehand if necessary. */ static void put_cmp_opcode (struct sfm_writer *w, uint8_t opcode) { if (w->n_opcodes >= 8) flush_compressed (w); w->cbuf[0][w->n_opcodes++] = opcode; } /* Appends NUMBER to the buffered compression data in W. */ static void put_cmp_number (struct sfm_writer *w, double number) { put_cmp_opcode (w, 253); convert_double_to_output_format (number, w->cbuf[++w->n_elements]); } /* Appends SIZE bytes of DATA to the buffered compression data in W, followed by enough spaces to pad the output data to exactly 8 bytes (thus, SIZE must be no greater than 8). */ static void put_cmp_string (struct sfm_writer *w, const void *data, size_t size) { assert (size <= 8); put_cmp_opcode (w, 253); w->n_elements++; memset (w->cbuf[w->n_elements], w->space, 8); memcpy (w->cbuf[w->n_elements], data, size); } /* Writes 32-bit integer X to the output file for writer W. */ static void write_int (struct sfm_writer *w, int32_t x) { write_bytes (w, &x, sizeof x); } /* Writes 64-bit integer X to the output file for writer W. */ static void write_int64 (struct sfm_writer *w, int64_t x) { write_bytes (w, &x, sizeof x); } /* Converts NATIVE to the 64-bit format used in output files in OUTPUT. */ static inline void convert_double_to_output_format (double native, uint8_t output[8]) { /* If "double" is not a 64-bit type, then convert it to a 64-bit type. Otherwise just copy it. */ if (FLOAT_NATIVE_DOUBLE != FLOAT_NATIVE_64_BIT) float_convert (FLOAT_NATIVE_DOUBLE, &native, FLOAT_NATIVE_64_BIT, output); else memcpy (output, &native, sizeof native); } /* Writes floating-point number X to the output file for writer W. */ static void write_float (struct sfm_writer *w, double x) { uint8_t output[8]; convert_double_to_output_format (x, output); write_bytes (w, output, sizeof output); } /* Writes contents of VALUE with the given WIDTH to W, padding with zeros to a multiple of 8 bytes. To avoid a branch, and because we don't actually need to support it, WIDTH must be no bigger than 8. */ static void write_value (struct sfm_writer *w, const union value *value, int width) { assert (width <= 8); if (width == 0) write_float (w, value->f); else { write_bytes (w, value->s, width); write_zeros (w, 8 - width); } } /* Writes null-terminated STRING in a field of the given WIDTH to W. If STRING is longer than WIDTH, it is truncated; if STRING is shorter than WIDTH, it is padded on the right with spaces. */ static void write_string (struct sfm_writer *w, const char *string, size_t width) { size_t data_bytes = MIN (strlen (string), width); size_t pad_bytes = width - data_bytes; write_bytes (w, string, data_bytes); while (pad_bytes-- > 0) putc (w->space, w->file); } /* Recodes null-terminated UTF-8 encoded STRING into ENCODING, and writes the recoded version in a field of the given WIDTH to W. The string is truncated or padded on the right with spaces to exactly WIDTH bytes. */ static void write_utf8_string (struct sfm_writer *w, const char *encoding, const char *string, size_t width) { char *s = recode_string (encoding, "UTF-8", string, -1); write_string (w, s, width); free (s); } /* Writes a record with type 7, subtype SUBTYPE that contains CONTENT recoded from UTF-8 encoded into ENCODING. */ static void write_utf8_record (struct sfm_writer *w, const char *encoding, const struct string *content, int subtype) { struct substring s; s = recode_substring_pool (encoding, "UTF-8", ds_ss (content), NULL); write_string_record (w, s, subtype); ss_dealloc (&s); } /* Writes a record with type 7, subtype SUBTYPE that contains the string CONTENT. */ static void write_string_record (struct sfm_writer *w, const struct substring content, int subtype) { write_int (w, 7); write_int (w, subtype); write_int (w, 1); write_int (w, ss_length (content)); write_bytes (w, ss_data (content), ss_length (content)); } /* Writes SIZE bytes of DATA to W's output file. */ static void write_bytes (struct sfm_writer *w, const void *data, size_t size) { fwrite (data, 1, size, w->file); } /* Writes N zeros to W's output file. */ static void write_zeros (struct sfm_writer *w, size_t n) { while (n-- > 0) putc (0, w->file); } /* Writes N spaces to W's output file. */ static void write_spaces (struct sfm_writer *w, size_t n) { while (n-- > 0) putc (w->space, w->file); } pspp-1.4.1/src/data/value.h0000644000175000017500000001135113624301134015076 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 1997-9, 2000, 2007, 2009, 2010, 2012 Free Software Foundation, Inc. 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 3 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, see . */ #ifndef DATA_VALUE_H #define DATA_VALUE_H 1 #include "libpspp/compiler.h" #include #include #include #include #include #include "xalloc.h" /* A numeric or string value. The client is responsible for keeping track of the value's width. */ union value { double f; uint8_t *s; }; static inline void value_init (union value *, int width); static inline void value_clone (union value *, const union value *, int width); static inline bool value_needs_init (int width); static inline bool value_try_init (union value *, int width); static inline void value_destroy (union value *, int width); static inline void value_copy (union value *, const union value *, int width); void value_copy_rpad (union value *, int dst_width, const union value *, int src_width, char pad); void value_copy_str_rpad (union value *, int dst_width, const uint8_t *, char pad); void value_copy_buf_rpad (union value *dst, int dst_width, const uint8_t *src, size_t src_len, char pad); void value_set_missing (union value *, int width); int value_compare_3way (const union value *, const union value *, int width); bool value_equal (const union value *, const union value *, int width); unsigned int value_hash (const union value *, int width, unsigned int basis) WARN_UNUSED_RESULT; bool value_is_resizable (const union value *, int old_width, int new_width); bool value_needs_resize (int old_width, int new_width); void value_resize (union value *, int old_width, int new_width); bool value_is_spaces (const union value *, int width); static inline void value_swap (union value *, union value *); struct pool; void value_init_pool (struct pool *, union value *, int width); void value_clone_pool (struct pool *, union value *, const union value *, int width); void value_resize_pool (struct pool *, union value *, int old_width, int new_width); /* Initializes V as a value of the given WIDTH, where 0 represents a numeric value and a positive integer represents a string value WIDTH bytes long. A WIDTH of -1 is ignored. The contents of value V are indeterminate after initialization. */ static inline void value_init (union value *v, int width) { if (width > 0) v->s = xmalloc (width); } /* Initializes V as a value of the given WIDTH, as with value_init(), and copies SRC's value into V as its initial value. */ static inline void value_clone (union value *v, const union value *src, int width) { if (width <= 0) v->f = src->f; else v->s = xmemdup (src->s, width); } /* Returns true if a value of the given WIDTH actually needs to have the value_init and value_destroy functions called, false if those functions are no-ops for values of the given WIDTH. Using this function is only a valuable optimization if a large number of values of the given WIDTH are to be initialized*/ static inline bool value_needs_init (int width) { return width > 0; } /* Same as value_init, except that failure to allocate memory causes it to return false instead of terminating the program. On success, returns true. */ static inline bool value_try_init (union value *v, int width) { if (width > 0) { v->s = malloc (width); return v->s != NULL; } else return true; } /* Frees any memory allocated by value_init for V, which must have the given WIDTH. */ static inline void value_destroy (union value *v, int width) { if (width > 0) free (v->s); } /* Copies SRC to DST, given that they both contain data of the given WIDTH. */ static inline void value_copy (union value *dst, const union value *src, int width) { if (width <= 0) dst->f = src->f; else memcpy (dst->s, src->s, width); } /* Exchanges the contents of A and B. */ static inline void value_swap (union value *a, union value *b) { union value tmp = *a; *a = *b; *b = tmp; } #endif /* data/value.h */ pspp-1.4.1/src/data/identifier2.c0000644000175000017500000000761213320146056016171 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 1997-9, 2000, 2005, 2009, 2010, 2011 Free Software Foundation, Inc. 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 3 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, see . */ /* This file implements parts of identifier.h that call the msg() function. This allows test programs that do not use those functions to avoid linking additional object files. */ #include #include "data/identifier.h" #include #include #include "libpspp/cast.h" #include "libpspp/i18n.h" #include "libpspp/message.h" #include "gl/c-ctype.h" #include "gettext.h" #define _(msgid) gettext (msgid) /* Returns true if UTF-8 string ID is an acceptable identifier in encoding DICT_ENCODING (UTF-8 if null), false otherwise. If ISSUE_ERROR is true, issues an explanatory error message on failure. */ bool id_is_valid (const char *id, const char *dict_encoding, bool issue_error) { size_t dict_len; if (!id_is_plausible (id, issue_error)) return false; if (dict_encoding != NULL) { /* XXX need to reject recoded strings that contain the fallback character. */ dict_len = recode_string_len (dict_encoding, "UTF-8", id, -1); } else dict_len = strlen (id); if (dict_len > ID_MAX_LEN) { if (issue_error) msg (SE, _("Identifier `%s' exceeds %d-byte limit."), id, ID_MAX_LEN); return false; } return true; } /* Returns true if UTF-8 string ID is an plausible identifier, false otherwise. If ISSUE_ERROR is true, issues an explanatory error message on failure. */ bool id_is_plausible (const char *id, bool issue_error) { const uint8_t *bad_unit; const uint8_t *s; char ucname[16]; int mblen; ucs4_t uc; /* ID cannot be the empty string. */ if (id[0] == '\0') { if (issue_error) msg (SE, _("Identifier cannot be empty string.")); return false; } /* ID cannot be a reserved word. */ if (lex_id_to_token (ss_cstr (id)) != T_ID) { if (issue_error) msg (SE, _("`%s' may not be used as an identifier because it " "is a reserved word."), id); return false; } bad_unit = u8_check (CHAR_CAST (const uint8_t *, id), strlen (id)); if (bad_unit != NULL) { /* If this message ever appears, it probably indicates a PSPP bug since it shouldn't be possible to get invalid UTF-8 this far. */ if (issue_error) msg (SE, _("`%s' may not be used as an identifier because it " "contains ill-formed UTF-8 at byte offset %tu."), id, CHAR_CAST (const char *, bad_unit) - id); return false; } /* Check that it is a valid identifier. */ mblen = u8_strmbtouc (&uc, CHAR_CAST (uint8_t *, id)); if (!lex_uc_is_id1 (uc)) { if (issue_error) msg (SE, _("Character %s (in `%s') may not appear " "as the first character in a identifier."), uc_name (uc, ucname), id); return false; } for (s = CHAR_CAST (uint8_t *, id + mblen); (mblen = u8_strmbtouc (&uc, s)) != 0; s += mblen) if (!lex_uc_is_idn (uc)) { if (issue_error) msg (SE, _("Character %s (in `%s') may not appear in an " "identifier."), uc_name (uc, ucname), id); return false; } return true; } pspp-1.4.1/src/data/encrypted-file.h0000644000175000017500000000244213571051236016703 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2013, 2015 Free Software Foundation, Inc. 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 3 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, see . */ #ifndef ENCRYPTED_FILE_H #define ENCRYPTED_FILE_H 1 #include #include /* Reading encrypted SPSS files. */ struct encrypted_file; struct file_handle; int encrypted_file_open (struct encrypted_file **, const struct file_handle *); bool encrypted_file_unlock (struct encrypted_file *, const char *password); bool encrypted_file_unlock__ (struct encrypted_file *, const char *password); size_t encrypted_file_read (struct encrypted_file *, void *, size_t); int encrypted_file_close (struct encrypted_file *); #endif /* encrypted-file.h */ pspp-1.4.1/src/data/lazy-casereader.h0000644000175000017500000000322613320146056017042 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2007, 2009, 2011 Free Software Foundation, Inc. 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 3 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, see . */ /* Lazy casereader. A "lazy casereader" is a casereader that saves an underlying casereader from the need to be instantiated in the case where it is never used. If any casereader operation is ever performed on a lazy casereader, it invokes a callback function (provided by the lazy casereader's creator) to instantiate the underlying reader. */ #ifndef DATA_LAZY_CASEREADER_H #define DATA_LAZY_CASEREADER_H 1 #include #include "data/case.h" struct casereader *lazy_casereader_create (const struct caseproto *, casenumber case_cnt, struct casereader *(*) (void *aux), void *aux, unsigned long int *serial); bool lazy_casereader_destroy (struct casereader *, unsigned long int serial); #endif /* data/lazy-casereader.h */ pspp-1.4.1/src/data/value-labels.c0000644000175000017500000002513013320146056016334 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 1997-9, 2000, 2009, 2010, 2011, 2012 Free Software Foundation, Inc. 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 3 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, see . */ #include #include "data/value-labels.h" #include #include "data/data-out.h" #include "data/value.h" #include "data/variable.h" #include "libpspp/array.h" #include "libpspp/cast.h" #include "libpspp/compiler.h" #include "libpspp/hash-functions.h" #include "libpspp/hmap.h" #include "libpspp/intern.h" #include "libpspp/message.h" #include "libpspp/str.h" #include "gl/xalloc.h" /* Creates and returns a new, empty set of value labels with the given WIDTH. */ struct val_labs * val_labs_create (int width) { struct val_labs *vls = xmalloc (sizeof *vls); vls->width = width; hmap_init (&vls->labels); return vls; } /* Creates and returns a new set of value labels identical to VLS. Returns a null pointer if VLS is null. */ struct val_labs * val_labs_clone (const struct val_labs *vls) { struct val_labs *copy; struct val_lab *label; if (vls == NULL) return NULL; copy = val_labs_create (vls->width); HMAP_FOR_EACH (label, struct val_lab, node, &vls->labels) val_labs_add (copy, &label->value, label->escaped_label); return copy; } /* Determines whether VLS's width can be changed to NEW_WIDTH, using the rules checked by value_is_resizable. */ bool val_labs_can_set_width (const struct val_labs *vls, int new_width) { struct val_lab *label; HMAP_FOR_EACH (label, struct val_lab, node, &vls->labels) if (!value_is_resizable (&label->value, vls->width, new_width)) return false; return true; } /* Changes the width of VLS to NEW_WIDTH. The original and new width must be both numeric or both string. */ void val_labs_set_width (struct val_labs *vls, int new_width) { assert (val_labs_can_set_width (vls, new_width)); if (value_needs_resize (vls->width, new_width)) { struct val_lab *label; HMAP_FOR_EACH (label, struct val_lab, node, &vls->labels) value_resize (&label->value, vls->width, new_width); } vls->width = new_width; } /* Destroys VLS. */ void val_labs_destroy (struct val_labs *vls) { if (vls != NULL) { val_labs_clear (vls); hmap_destroy (&vls->labels); free (vls); } } /* Removes all the value labels from VLS. */ void val_labs_clear (struct val_labs *vls) { struct val_lab *label, *next; HMAP_FOR_EACH_SAFE (label, next, struct val_lab, node, &vls->labels) { hmap_delete (&vls->labels, &label->node); value_destroy (&label->value, vls->width); intern_unref (label->label); intern_unref (label->escaped_label); free (label); } } /* Returns the width of VLS. */ int val_labs_get_width (const struct val_labs *vls) { return vls->width; } /* Returns the number of value labels in VLS. Returns 0 if VLS is null. */ size_t val_labs_count (const struct val_labs *vls) { return vls == NULL ? 0 : hmap_count (&vls->labels); } static void set_label (struct val_lab *lab, const char *escaped_label) { lab->escaped_label = intern_new (escaped_label); if (strstr (escaped_label, "\\n") == NULL) lab->label = intern_ref (lab->escaped_label); else { struct string s; const char *p; ds_init_empty (&s); ds_extend (&s, intern_strlen (lab->escaped_label)); for (p = escaped_label; *p != '\0'; p++) { char c = *p; if (c == '\\' && p[1] == 'n') { c = '\n'; p++; } ds_put_byte (&s, c); } lab->label = intern_new (ds_cstr (&s)); ds_destroy (&s); } } static void do_add_val_lab (struct val_labs *vls, const union value *value, const char *escaped_label) { struct val_lab *lab = xmalloc (sizeof *lab); value_clone (&lab->value, value, vls->width); set_label (lab, escaped_label); hmap_insert (&vls->labels, &lab->node, value_hash (value, vls->width, 0)); } /* If VLS does not already contain a value label for VALUE, adds the UTF-8 encoded LABEL for it and returns true. Otherwise, returns false. In LABEL, the two-byte sequence "\\n" is interpreted as a new-line. */ bool val_labs_add (struct val_labs *vls, const union value *value, const char *label) { const struct val_lab *lab = val_labs_lookup (vls, value); if (lab == NULL) { do_add_val_lab (vls, value, label); return true; } else return false; } /* Sets LABEL as the value label for VALUE in VLS, replacing any existing label for VALUE. In LABEL, the two-byte sequence "\\n" is interpreted as a new-line. */ void val_labs_replace (struct val_labs *vls, const union value *value, const char *label) { struct val_lab *vl = val_labs_lookup (vls, value); if (vl != NULL) { intern_unref (vl->label); intern_unref (vl->escaped_label); set_label (vl, label); } else do_add_val_lab (vls, value, label); } /* Removes LABEL from VLS. */ void val_labs_remove (struct val_labs *vls, struct val_lab *label) { hmap_delete (&vls->labels, &label->node); value_destroy (&label->value, vls->width); intern_unref (label->label); intern_unref (label->escaped_label); free (label); } /* Searches VLS for a value label for VALUE. If successful, returns the string used as the label, as a UTF-8 encoded string in a format suitable for output. Otherwise, returns a null pointer. Returns a null pointer if VLS is null. */ const char * val_labs_find (const struct val_labs *vls, const union value *value) { const struct val_lab *label = val_labs_lookup (vls, value); return label ? label->label : NULL; } /* Searches VLS for a value label for VALUE. If successful, returns the value label; otherwise, returns a null pointer. Returns a null pointer if VLS is null. */ static struct val_lab * val_labs_lookup__ (const struct val_labs *vls, const union value *value, unsigned int hash) { struct val_lab *label; HMAP_FOR_EACH_WITH_HASH (label, struct val_lab, node, hash, &vls->labels) if (value_equal (&label->value, value, vls->width)) return label; return NULL; } /* Searches VLS for a value label for VALUE. If successful, returns the value label; otherwise, returns a null pointer. Returns a null pointer if VLS is null. */ struct val_lab * val_labs_lookup (const struct val_labs *vls, const union value *value) { return (vls == NULL ? NULL : val_labs_lookup__ (vls, value, value_hash (value, vls->width, 0))); } /* Searches VLS for a value label whose label is exactly LABEL. If successful, returns the corresponding value. Otherwise, returns a null pointer. Returns a null pointer if VLS is null. This function is O(n) in the number of labels in VLS. */ const union value * val_labs_find_value (const struct val_labs *vls, const char *label_) { const union value *value = NULL; if (vls != NULL) { const struct val_lab *vl; const char *label; label = intern_new (label_); HMAP_FOR_EACH (vl, struct val_lab, node, &vls->labels) if (vl->label == label) { value = &vl->value; break; } intern_unref (label); } return value; } /* Returns the first value label in VLS, in arbitrary order, or a null pointer if VLS is empty or if VLS is a null pointer. If the return value is non-null, then val_labs_next() may be used to continue iterating. */ const struct val_lab * val_labs_first (const struct val_labs *vls) { return vls ? HMAP_FIRST (struct val_lab, node, &vls->labels) : NULL; } /* Returns the next value label in an iteration begun by val_labs_first(). If the return value is non-null, then val_labs_next() may be used to continue iterating. */ const struct val_lab * val_labs_next (const struct val_labs *vls, const struct val_lab *label) { return HMAP_NEXT (label, struct val_lab, node, &vls->labels); } static int compare_labels_by_value_3way (const void *a_, const void *b_, const void *vls_) { const struct val_lab *const *a = a_; const struct val_lab *const *b = b_; const struct val_labs *vls = vls_; return value_compare_3way (&(*a)->value, &(*b)->value, vls->width); } /* Allocates and returns an array of pointers to value labels that is sorted in increasing order by value. The array has val_labs_count(VLS) elements. The caller is responsible for freeing the array. */ const struct val_lab ** val_labs_sorted (const struct val_labs *vls) { if (vls != NULL) { const struct val_lab *label; const struct val_lab **labels; size_t i; labels = xmalloc (val_labs_count (vls) * sizeof *labels); i = 0; HMAP_FOR_EACH (label, struct val_lab, node, &vls->labels) labels[i++] = label; assert (i == val_labs_count (vls)); sort (labels, val_labs_count (vls), sizeof *labels, compare_labels_by_value_3way, vls); return labels; } else return NULL; } /* Returns a hash value that represents all of the labels in VLS, starting from BASIS. */ unsigned int val_labs_hash (const struct val_labs *vls, unsigned int basis) { const struct val_lab *label; unsigned int hash; hash = hash_int (val_labs_count (vls), basis); HMAP_FOR_EACH (label, struct val_lab, node, &vls->labels) hash ^= value_hash (&label->value, vls->width, hash_string (label->label, basis)); return hash; } /* Returns true if A and B contain the same values with the same labels, false if they differ in some way. */ bool val_labs_equal (const struct val_labs *a, const struct val_labs *b) { const struct val_lab *label; if (val_labs_count (a) != val_labs_count (b)) return false; if (a == NULL || b == NULL) return true; if (a->width != b->width) return false; HMAP_FOR_EACH (label, struct val_lab, node, &a->labels) { struct val_lab *label2 = val_labs_lookup__ (b, &label->value, label->node.hash); if (!label2 || label->label != label2->label) return false; } return true; } pspp-1.4.1/src/data/any-writer.h0000644000175000017500000000170013320146056016063 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2006 Free Software Foundation, Inc. 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 3 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, see . */ #ifndef ANY_WRITER_H #define ANY_WRITER_H 1 #include struct file_handle; struct dictionary; struct casewriter *any_writer_open (struct file_handle *, struct dictionary *); #endif /* any-writer.h */ pspp-1.4.1/src/data/calendar.h0000644000175000017500000000222313571051220015530 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2017 Free Software Foundation, Inc. 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 3 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, see . */ #ifndef CALENDAR_H #define CALENDAR_H 1 double calendar_gregorian_to_offset (int y, int m, int d, char **errorp); void calendar_offset_to_gregorian (int ofs, int *y, int *m, int *d, int *yd); int calendar_offset_to_year (int ofs); int calendar_offset_to_month (int ofs); int calendar_offset_to_mday (int ofs); int calendar_offset_to_yday (int ofs); int calendar_offset_to_wday (int ofs); int calendar_days_in_month (int y, int m); #endif /* calendar.h */ pspp-1.4.1/src/data/case.c0000644000175000017500000003553713670210420014702 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2004, 2007, 2009, 2010, 2011 Free Software Foundation, Inc. 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 3 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, see . */ #include #include "data/case.h" #include #include #include #include "data/value.h" #include "data/variable.h" #include "libpspp/assertion.h" #include "libpspp/str.h" #include "gl/minmax.h" #include "gl/xalloc.h" /* Set this flag to 1 to copy cases instead of ref counting them. This is sometimes helpful in debugging situations. */ #define DEBUG_CASEREFS 0 #if DEBUG_CASEREFS #warning "Caseref debug enabled. CASES ARE NOT BEING SHARED!!" #endif static size_t case_size (const struct caseproto *); static void assert_variable_matches_case (const struct ccase *, const struct variable *); static void copy_forward (struct ccase *dst, size_t dst_idx, const struct ccase *src, size_t src_idx, size_t n_values); static void copy_backward (struct ccase *dst, size_t dst_idx, const struct ccase *src, size_t src_idx, size_t n_values); /* Creates and returns a new case that stores data of the form specified by PROTO. The data in the case have indeterminate contents until explicitly written. The caller retains ownership of PROTO. */ struct ccase * case_create (const struct caseproto *proto) { struct ccase *c = case_try_create (proto); if (c == NULL) xalloc_die (); return c; } /* Like case_create, but returns a null pointer if not enough memory is available. */ struct ccase * case_try_create (const struct caseproto *proto) { struct ccase *c = malloc (case_size (proto)); if (c != NULL) { if (caseproto_try_init_values (proto, c->values)) { c->proto = caseproto_ref (proto); c->ref_cnt = 1; return c; } free (c); } return NULL; } /* Creates and returns an unshared copy of case C. */ struct ccase * case_clone (const struct ccase *c) { return case_unshare (case_ref (c)); } /* Increments case C's reference count and returns C. Afterward, case C is shared among its reference count holders. */ struct ccase * case_ref (const struct ccase *c_) { struct ccase *c = CONST_CAST (struct ccase *, c_); c->ref_cnt++; #if DEBUG_CASEREFS c = case_unshare__ (c); #endif return c; } /* Returns an estimate of the number of bytes of memory that would be consumed in creating a case based on PROTO. The estimate includes typical overhead from malloc() in addition to the actual size of data. */ size_t case_get_cost (const struct caseproto *proto) { /* FIXME: improve approximation? */ return (1 + caseproto_get_n_widths (proto) + 3 * caseproto_get_n_strings (proto)) * sizeof (union value); } /* Changes the prototype for case C, which must not be shared. The new PROTO must be conformable with C's current prototype (as defined by caseproto_is_conformable). Any new values created by this function have indeterminate content that the caller is responsible for initializing. The caller retains ownership of PROTO. Returns a new case that replaces C, which is freed. */ struct ccase * case_resize (struct ccase *c, const struct caseproto *new_proto) { struct caseproto *old_proto = c->proto; size_t old_n_widths = caseproto_get_n_widths (old_proto); size_t new_n_widths = caseproto_get_n_widths (new_proto); assert (!case_is_shared (c)); expensive_assert (caseproto_is_conformable (old_proto, new_proto)); if (old_n_widths != new_n_widths) { if (new_n_widths < old_n_widths) caseproto_reinit_values (old_proto, new_proto, c->values); c = xrealloc (c, case_size (new_proto)); if (new_n_widths > old_n_widths) caseproto_reinit_values (old_proto, new_proto, c->values); caseproto_unref (old_proto); c->proto = caseproto_ref (new_proto); } return c; } /* case_unshare_and_resize(C, PROTO) is equivalent to case_resize(case_unshare(C), PROTO), but it is faster if case C is shared. Any new values created by this function have indeterminate content that the caller is responsible for initializing. The caller retains ownership of PROTO. Returns the new case that replaces C, which is freed. */ struct ccase * case_unshare_and_resize (struct ccase *c, const struct caseproto *proto) { if (!case_is_shared (c)) return case_resize (c, proto); else { struct ccase *new = case_create (proto); size_t old_n_values = caseproto_get_n_widths (c->proto); size_t new_n_values = caseproto_get_n_widths (proto); case_copy (new, 0, c, 0, MIN (old_n_values, new_n_values)); c->ref_cnt--; return new; } } /* Sets all of the numeric values in case C to the system-missing value, and all of the string values to spaces. */ void case_set_missing (struct ccase *c) { size_t i; assert (!case_is_shared (c)); for (i = 0; i < caseproto_get_n_widths (c->proto); i++) value_set_missing (&c->values[i], caseproto_get_width (c->proto, i)); } /* Copies N_VALUES values from SRC (starting at SRC_IDX) to DST (starting at DST_IDX). Each value that is copied into must have the same width as the value that it is copied from. Properly handles overlapping ranges when DST == SRC. DST must not be shared. */ void case_copy (struct ccase *dst, size_t dst_idx, const struct ccase *src, size_t src_idx, size_t n_values) { assert (!case_is_shared (dst)); assert (caseproto_range_is_valid (dst->proto, dst_idx, n_values)); assert (caseproto_range_is_valid (src->proto, src_idx, n_values)); assert (caseproto_equal (dst->proto, dst_idx, src->proto, src_idx, n_values)); if (dst != src) { if (!dst->proto->n_strings || !src->proto->n_strings) memcpy (&dst->values[dst_idx], &src->values[src_idx], sizeof dst->values[0] * n_values); else copy_forward (dst, dst_idx, src, src_idx, n_values); } else if (dst_idx != src_idx) { if (!dst->proto->n_strings) memmove (&dst->values[dst_idx], &src->values[src_idx], sizeof dst->values[0] * n_values); else if (dst_idx < src_idx) copy_forward (dst, dst_idx, src, src_idx, n_values); else /* dst_idx > src_idx */ copy_backward (dst, dst_idx, src, src_idx, n_values); } } /* Copies N_VALUES values out of case C to VALUES, starting at the given START_IDX. */ void case_copy_out (const struct ccase *c, size_t start_idx, union value *values, size_t n_values) { size_t i; assert (caseproto_range_is_valid (c->proto, start_idx, n_values)); for (i = 0; i < n_values; i++) value_copy (&values[i], &c->values[start_idx + i], caseproto_get_width (c->proto, start_idx + i)); } /* Copies N_VALUES values from VALUES into case C, starting at the given START_IDX. C must not be shared. */ void case_copy_in (struct ccase *c, size_t start_idx, const union value *values, size_t n_values) { size_t i; assert (!case_is_shared (c)); assert (caseproto_range_is_valid (c->proto, start_idx, n_values)); for (i = 0; i < n_values; i++) value_copy (&c->values[start_idx + i], &values[i], caseproto_get_width (c->proto, start_idx + i)); } /* Returns a pointer to the `union value' used for the element of C for variable V. Case C must be drawn from V's dictionary. The caller must not modify the returned data. */ const union value * case_data (const struct ccase *c, const struct variable *v) { assert_variable_matches_case (c, v); return &c->values[var_get_case_index (v)]; } /* Returns a pointer to the `union value' used for the element of C numbered IDX. The caller must not modify the returned data. */ const union value * case_data_idx (const struct ccase *c, size_t idx) { assert (idx < c->proto->n_widths); return &c->values[idx]; } /* Returns a pointer to the `union value' used for the element of C for variable V. Case C must be drawn from V's dictionary. The caller is allowed to modify the returned data. Case C must not be shared. */ union value * case_data_rw (struct ccase *c, const struct variable *v) { assert_variable_matches_case (c, v); assert (!case_is_shared (c)); return &c->values[var_get_case_index (v)]; } /* Returns a pointer to the `union value' used for the element of C numbered IDX. The caller is allowed to modify the returned data. Case C must not be shared. */ union value * case_data_rw_idx (struct ccase *c, size_t idx) { assert (idx < c->proto->n_widths); assert (!case_is_shared (c)); return &c->values[idx]; } /* Returns the numeric value of the `union value' in C for variable V. Case C must be drawn from V's dictionary. */ double case_num (const struct ccase *c, const struct variable *v) { assert_variable_matches_case (c, v); return c->values[var_get_case_index (v)].f; } /* Returns the numeric value of the `union value' in C numbered IDX. */ double case_num_idx (const struct ccase *c, size_t idx) { assert (idx < c->proto->n_widths); return c->values[idx].f; } /* Returns the string value of the `union value' in C for variable V. Case C must be drawn from V's dictionary. The caller must not modify the return value. Like the strings embedded in all "union value"s, the return value is not null-terminated. */ const uint8_t * case_str (const struct ccase *c, const struct variable *v) { assert_variable_matches_case (c, v); return c->values[var_get_case_index (v)].s; } /* Returns the string value of the `union value' in C numbered IDX. The caller must not modify the return value. Like the strings embedded in all "union value"s, the return value is not null-terminated. */ const uint8_t * case_str_idx (const struct ccase *c, size_t idx) { assert (idx < c->proto->n_widths); return c->values[idx].s; } /* Returns the string value of the `union value' in C for variable V. Case C must be drawn from V's dictionary. The caller may modify the return value. Case C must not be shared. Like the strings embedded in all "union value"s, the return value is not null-terminated. */ uint8_t * case_str_rw (struct ccase *c, const struct variable *v) { assert_variable_matches_case (c, v); size_t idx = var_get_case_index (v); assert (!case_is_shared (c)); return c->values[idx].s; } /* Returns the string value of the `union value' in C numbered IDX. The caller may modify the return value. Case C must not be shared. Like the strings embedded in all "union value"s, the return value is not null-terminated. */ uint8_t * case_str_rw_idx (struct ccase *c, size_t idx) { assert (idx < c->proto->n_widths); assert (!case_is_shared (c)); return c->values[idx].s; } /* Compares the values of the N_VARS variables in VP in cases A and B and returns a strcmp()-type result. */ int case_compare (const struct ccase *a, const struct ccase *b, const struct variable *const *vp, size_t n_vars) { return case_compare_2dict (a, b, vp, vp, n_vars); } /* Compares the values of the N_VARS variables in VAP in case CA to the values of the N_VARS variables in VBP in CB and returns a strcmp()-type result. */ int case_compare_2dict (const struct ccase *ca, const struct ccase *cb, const struct variable *const *vap, const struct variable *const *vbp, size_t n_vars) { int cmp = 0; for (; !cmp && n_vars-- > 0; vap++, vbp++) { const union value *va = case_data (ca, *vap); const union value *vb = case_data (cb, *vbp); assert (var_get_width (*vap) == var_get_width (*vbp)); cmp = value_compare_3way (va, vb, var_get_width (*vap)); } return cmp; } /* Returns a pointer to the array of `union value's used for C. The caller must *not* modify the returned data. This function breaks the case abstraction. It should *not* be commonly used. Prefer the other case functions. */ const union value * case_data_all (const struct ccase *c) { return c->values; } /* Returns a pointer to the array of `union value's used for C. The caller is allowed to modify the returned data. Case C must not be shared. This function breaks the case abstraction. It should *not* be commonly used. Prefer the other case functions. */ union value * case_data_all_rw (struct ccase *c) { assert (!case_is_shared (c)); return c->values; } /* Internal helper function for case_unshare. */ struct ccase * case_unshare__ (struct ccase *old) { struct ccase *new = case_create (old->proto); case_copy (new, 0, old, 0, caseproto_get_n_widths (new->proto)); --old->ref_cnt; return new; } /* Internal helper function for case_unref. */ void case_unref__ (struct ccase *c) { caseproto_destroy_values (c->proto, c->values); caseproto_unref (c->proto); free (c); } /* Returns the number of bytes needed by a case for case prototype PROTO. */ static size_t case_size (const struct caseproto *proto) { return (offsetof (struct ccase, values) + caseproto_get_n_widths (proto) * sizeof (union value)); } /* Returns true if C contains a value at V's case index with the same width as V; that is, if V may plausibly be used to read or write data in C. Useful in assertions. */ static void assert_variable_matches_case (const struct ccase *c, const struct variable *v) { size_t case_idx = var_get_case_index (v); assert (case_idx < caseproto_get_n_widths (c->proto)); assert (caseproto_get_width (c->proto, case_idx) == var_get_width (v)); } /* Internal helper function for case_copy(). */ static void copy_forward (struct ccase *dst, size_t dst_idx, const struct ccase *src, size_t src_idx, size_t n_values) { size_t i; for (i = 0; i < n_values; i++) value_copy (&dst->values[dst_idx + i], &src->values[src_idx + i], caseproto_get_width (dst->proto, dst_idx + i)); } /* Internal helper function for case_copy(). */ static void copy_backward (struct ccase *dst, size_t dst_idx, const struct ccase *src, size_t src_idx, size_t n_values) { size_t i; for (i = n_values; i-- != 0;) value_copy (&dst->values[dst_idx + i], &src->values[src_idx + i], caseproto_get_width (dst->proto, dst_idx + i)); } pspp-1.4.1/src/data/file-name.c0000644000175000017500000001550113670210420015611 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 1997-9, 2000, 2006, 2007, 2009, 2010, 2011 Free Software Foundation, Inc. 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 3 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, see . */ #include #include "data/file-name.h" #include "data/file-handle-def.h" #include #include #include #include #include #include #include #include "data/settings.h" #include "libpspp/hash-functions.h" #include "libpspp/message.h" #include "libpspp/i18n.h" #include "libpspp/str.h" #include "libpspp/version.h" #include "gl/dirname.h" #include "gl/intprops.h" #include "gl/minmax.h" #include "gl/relocatable.h" #include "gl/xalloc.h" #include "gl/xmalloca.h" #include "gettext.h" #define _(msgid) gettext (msgid) /* Functions for performing operations on file names. */ /* Returns the extension part of FILE_NAME as a malloc()'d string. If FILE_NAME does not have an extension, returns an empty string. */ char * fn_extension (const struct file_handle *fh) { const char *file_name = fh_get_file_name (fh); const char *extension = strrchr (file_name, '.'); if (extension == NULL) extension = ""; return xstrdup (extension); } /* Find out information about files. */ /* Returns true iff NAME specifies an absolute file name. */ static bool fn_is_absolute (const char *name) { return IS_ABSOLUTE_FILE_NAME (name); } /* Searches for a file with name NAME in the directories given in PATH, which is terminated by a null pointer. Returns the full name of the first file found, which the caller is responsible for freeing with free(), or NULL if none is found. */ char * fn_search_path (const char *base_name, char **path) { size_t i; if (fn_is_absolute (base_name)) return xstrdup (base_name); for (i = 0; path[i] != NULL; i++) { const char *dir = path[i]; char *file; if (!strcmp (dir, "") || !strcmp (dir, ".")) file = xstrdup (base_name); else if (ISSLASH (dir[strlen (dir) - 1])) file = xasprintf ("%s%s", dir, base_name); else file = xasprintf ("%s/%s", dir, base_name); struct stat temp; if (((stat (file, &temp) == 0) && (! S_ISDIR (temp.st_mode)))) return file; free (file); } return NULL; } /* Returns true if file with name NAME exists, and that file is not a directory */ bool fn_exists (const struct file_handle *fh) { const char *name = fh_get_file_name (fh); struct stat temp; if (stat (name, &temp) != 0) return false; return ! S_ISDIR (temp.st_mode); } /* Basic file handling. */ #if HAVE_POPEN /* Used for giving an error message on a set_safer security violation. */ static FILE * safety_violation (const char *fn) { msg (SE, _("Not opening pipe file `%s' because %s option set."), fn, "SAFER"); errno = EPERM; return NULL; } #endif /* File open routine that understands `-' as stdin/stdout and `|cmd' as a pipe to command `cmd'. Returns resultant FILE on success, NULL on failure. If NULL is returned then errno is set to a sensible value. */ FILE * fn_open (const struct file_handle *fh, const char *mode) { const char *fn = fh_get_file_name (fh); assert (mode[0] == 'r' || mode[0] == 'w' || mode[0] == 'a'); if (mode[0] == 'r') { if (!strcmp (fn, "stdin") || !strcmp (fn, "-")) return stdin; } else { if (!strcmp (fn, "stdout") || !strcmp (fn, "-")) return stdout; if (!strcmp (fn, "stderr")) return stderr; } #if HAVE_POPEN if (fn[0] == '|') { if (settings_get_safer_mode ()) return safety_violation (fn); return popen (&fn[1], mode[0] == 'r' ? "r" : "w"); } else if (*fn && fn[strlen (fn) - 1] == '|') { char *s; FILE *f; if (settings_get_safer_mode ()) return safety_violation (fn); s = xmalloca (strlen (fn)); memcpy (s, fn, strlen (fn) - 1); s[strlen (fn) - 1] = 0; f = popen (s, mode[0] == 'r' ? "r" : "w"); freea (s); return f; } else #endif #if WIN32 { wchar_t *ss = convert_to_filename_encoding (fn, strlen (fn), fh_get_file_name_encoding (fh)); wchar_t *m = (wchar_t *) recode_string ("UTF-16LE", "ASCII", mode, strlen (mode)); FILE *fp = _wfopen (ss, m); free (m); free (ss); return fp; } #else return fopen (fn, mode); #endif } /* Counterpart to fn_open that closes file F with name FN; returns 0 on success, EOF on failure. If EOF is returned, errno is set to a sensible value. */ int fn_close (const struct file_handle *fh, FILE *f) { const char *fn = fh_get_file_name (fh); if (fileno (f) == STDIN_FILENO || fileno (f) == STDOUT_FILENO || fileno (f) == STDERR_FILENO) return 0; #if HAVE_POPEN else if (fn[0] == '|' || (*fn && fn[strlen (fn) - 1] == '|')) { pclose (f); return 0; } #endif else return fclose (f); } #ifdef WIN32 /* Apparently windoze users like to see output dumped into their home directory, not the current directory (!) */ const char * default_output_path (void) { static char *path = NULL; if (path == NULL) { /* Windows NT defines HOMEDRIVE and HOMEPATH. But give preference to HOME, because the user can change HOME. */ const char *home_dir = getenv ("HOME"); int i; if (home_dir == NULL) { const char *home_drive = getenv ("HOMEDRIVE"); const char *home_path = getenv ("HOMEPATH"); if (home_drive != NULL && home_path != NULL) home_dir = xasprintf ("%s%s", home_drive, home_path); } if (home_dir == NULL) home_dir = "c:/users/default"; /* poor default */ /* Copy home_dir into path. Add a slash at the end but only if there isn't already one there, because Windows treats // specially. */ if (home_dir[0] == '\0' || strchr ("/\\", home_dir[strlen (home_dir) - 1]) == NULL) path = xasprintf ("%s%c", home_dir, '/'); else path = xstrdup (home_dir); for(i = 0; i < strlen (path); i++) if (path[i] == '\\') path[i] = '/'; } return path; } #else /* ... whereas the rest of the world just likes it to be put "here" for easy access. */ const char * default_output_path (void) { static char current_dir[] = ""; return current_dir; } #endif pspp-1.4.1/src/data/session.h0000644000175000017500000000372413320146056015455 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2010, 2011, 2012, 2013 Free Software Foundation, Inc. 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 3 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, see . */ #ifndef SESSION_H #define SESSION_H 1 #include struct dataset; struct session *session_create (struct session *parent); void session_destroy (struct session *); struct dataset *session_active_dataset (struct session *); void session_set_active_dataset (struct session *, struct dataset *); void session_add_dataset (struct session *, struct dataset *); void session_remove_dataset (struct session *, struct dataset *); struct dataset *session_lookup_dataset (const struct session *, const char *); struct dataset *session_lookup_dataset_assert (const struct session *, const char *); void session_set_default_syntax_encoding (struct session *, const char *); const char *session_get_default_syntax_encoding (const struct session *); size_t session_n_datasets (const struct session *); void session_for_each_dataset (const struct session *, void (*cb) (struct dataset *, void *aux), void *aux); struct dataset *session_get_dataset_by_seqno (const struct session *, unsigned int seqno); char *session_generate_dataset_name (struct session *); #endif /* session.h */ pspp-1.4.1/src/data/sys-file-private.h0000644000175000017500000000641113320146056017171 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2006-2007, 2009-2013 Free Software Foundation, Inc. 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 3 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, see . */ /* Infrastructure common to system file reader and writer. Old versions of SPSS limited string variables to a width of 255 bytes. For backward compatibility with these older versions, the system file format represents a string longer than 255 bytes, called a "very long string", as a collection of strings no longer than 255 bytes each. The strings concatenated to make a very long string are called its "segments"; for consistency, variables other than very long strings are considered to have a single segment. The interfaces in this file primarily provide support for dealing with very long strings. */ #ifndef DATA_SYS_FILE_PRIVATE_H #define DATA_SYS_FILE_PRIVATE_H 1 #include struct dictionary; /* ASCII magic numbers. */ #define ASCII_MAGIC "$FL2" /* For regular files. */ #define ASCII_ZMAGIC "$FL3" /* For ZLIB compressed files. */ /* EBCDIC magic number, the same as ASCII_MAGIC but encoded in EBCDIC. No EBCDIC ZLIB compressed files have been observed, so we do not define EBCDIC_ZMAGIC even though the value is obvious. */ #define EBCDIC_MAGIC "\x5b\xc6\xd3\xf2" /* Amount of data that ZLIB compressed data blocks typically decompress to. */ #define ZBLOCK_SIZE 0x3ff000 /* A variable in a system file. */ struct sfm_var { int var_width; /* Variable width (0 to 32767). */ int segment_width; /* Segment width (0 to 255). */ int case_index; /* Index into case. */ /* The following members are interesting only for string variables (width != 0). For numeric variables (width == 0) their values are always 0. Note: width + padding is always a multiple of 8. */ int offset; /* Offset within string variable in case. */ int padding; /* Number of padding bytes following data. */ }; int sfm_dictionary_to_sfm_vars (const struct dictionary *, struct sfm_var **, size_t *); int sfm_width_to_octs (int width); int sfm_width_to_segments (int width); int sfm_segment_effective_offset (int width, int segment); int sfm_segment_alloc_width (int width, int segment); /* A mapping between an encoding name and a Windows codepage. */ struct sys_encoding { int number; const char *name; }; extern struct sys_encoding sys_codepage_number_to_name[]; extern struct sys_encoding sys_codepage_name_to_number[]; int sys_get_codepage_from_encoding (const char *); const char *sys_get_encoding_from_codepage (int); #endif /* data/sys-file-private.h */ pspp-1.4.1/src/data/make-file.h0000644000175000017500000000375013320146056015623 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2004, 2010 Free Software Foundation, Inc. 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 3 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, see . */ #ifndef MAKE_FILE_H #define MAKE_FILE_H #include #include #include struct file_handle; /* Prepares to atomically replace a (potentially) existing file by a new file., by creating a temporary file with the given PERMISSIONS bits. Special files are an exception: they are not atomically replaced but simply opened for writing. If successful, stores a stream for it opened according to MODE (which should be "w" or "wb") in *FP. Returns a ticket that can be used to commit or abort the file replacement. If neither action has yet been taken, program termination via signal will cause all resources to be released. The return value must not be explicitly freed. The caller is responsible for closing *FP */ struct replace_file *replace_file_start (const struct file_handle *fh, const char *mode, mode_t permissions, FILE **fp); /* Commits or aborts the replacement of a (potentially) existing file by a new file, using the ticket returned by replace_file_start. Returns success. */ bool replace_file_commit (struct replace_file *); bool replace_file_abort (struct replace_file *); #endif /* make-file.h */ pspp-1.4.1/src/data/pc+-file-reader.c0000644000175000017500000011455213546443556016640 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 1997-2000, 2006-2007, 2009-2016 Free Software Foundation, Inc. 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 3 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, see . */ #include #include #include #include #include #include #include "data/any-reader.h" #include "data/case.h" #include "data/casereader-provider.h" #include "data/casereader.h" #include "data/dictionary.h" #include "data/file-handle-def.h" #include "data/file-name.h" #include "data/format.h" #include "data/identifier.h" #include "data/missing-values.h" #include "data/value-labels.h" #include "data/value.h" #include "data/variable.h" #include "libpspp/float-format.h" #include "libpspp/i18n.h" #include "libpspp/integer-format.h" #include "libpspp/message.h" #include "libpspp/misc.h" #include "libpspp/pool.h" #include "libpspp/str.h" #include "gl/localcharset.h" #include "gl/minmax.h" #include "gl/xalloc.h" #include "gl/xsize.h" #include "gettext.h" #define _(msgid) gettext (msgid) #define N_(msgid) (msgid) struct pcp_dir_entry { unsigned int ofs; unsigned int len; }; struct pcp_directory { struct pcp_dir_entry main; struct pcp_dir_entry variables; struct pcp_dir_entry labels; struct pcp_dir_entry data; }; struct pcp_main_header { char product[63]; /* "PCSPSS SYSTEM FILE..." */ unsigned int nominal_case_size; /* Number of var positions. */ char creation_date[9]; /* "[m]m/dd/yy". */ char creation_time[9]; /* "[H]H:MM:SS". */ char file_label[65]; /* File label. */ unsigned int weight_index; /* Index of weighting variable, 0 if none. */ }; struct pcp_var_record { unsigned int pos; char name[9]; int width; struct fmt_spec format; uint8_t missing[8]; char *label; bool weight; struct pcp_value_label *val_labs; size_t n_val_labs; struct variable *var; }; struct pcp_value_label { uint8_t value[8]; char *label; }; /* System file reader. */ struct pcp_reader { struct any_reader any_reader; /* Resource tracking. */ struct pool *pool; /* All system file state. */ /* File data. */ unsigned int file_size; struct any_read_info info; struct pcp_directory directory; struct pcp_main_header header; struct pcp_var_record *vars; size_t n_vars; /* File state. */ struct file_handle *fh; /* File handle. */ struct fh_lock *lock; /* Mutual exclusion for file handle. */ FILE *file; /* File stream. */ unsigned int pos; /* Position in file. */ bool error; /* I/O or corruption error? */ struct caseproto *proto; /* Format of output cases. */ /* File format. */ unsigned int n_cases; /* Number of cases */ const char *encoding; /* String encoding. */ /* Decompression. */ bool compressed; uint8_t opcodes[8]; /* Current block of opcodes. */ size_t opcode_idx; /* Next opcode to interpret, 8 if none left. */ bool corruption_warning; /* Warned about possible corruption? */ }; static struct pcp_reader * pcp_reader_cast (const struct any_reader *r_) { assert (r_->klass == &pcp_file_reader_class); return UP_CAST (r_, struct pcp_reader, any_reader); } static const struct casereader_class pcp_file_casereader_class; static bool pcp_close (struct any_reader *); static bool read_variables_record (struct pcp_reader *); static void pcp_msg (struct pcp_reader *r, off_t, int class, const char *format, va_list args) PRINTF_FORMAT (4, 0); static void pcp_warn (struct pcp_reader *, off_t, const char *, ...) PRINTF_FORMAT (3, 4); static void pcp_error (struct pcp_reader *, off_t, const char *, ...) PRINTF_FORMAT (3, 4); static bool read_bytes (struct pcp_reader *, void *, size_t) WARN_UNUSED_RESULT; static int try_read_bytes (struct pcp_reader *, void *, size_t) WARN_UNUSED_RESULT; static bool read_uint16 (struct pcp_reader *, unsigned int *) WARN_UNUSED_RESULT; static bool read_uint32 (struct pcp_reader *, unsigned int *) WARN_UNUSED_RESULT; static bool read_float (struct pcp_reader *, double *) WARN_UNUSED_RESULT; static double parse_float (const uint8_t number[8]); static bool read_string (struct pcp_reader *, char *, size_t) WARN_UNUSED_RESULT; static bool skip_bytes (struct pcp_reader *, size_t) WARN_UNUSED_RESULT; static bool pcp_seek (struct pcp_reader *, off_t); static bool pcp_is_sysmis(const uint8_t *); /* Dictionary reader. */ static bool read_dictionary (struct pcp_reader *); static bool read_main_header (struct pcp_reader *, struct pcp_main_header *); static void parse_header (struct pcp_reader *, const struct pcp_main_header *, struct any_read_info *, struct dictionary *); static bool parse_variable_records (struct pcp_reader *, struct dictionary *, struct pcp_var_record *, size_t n); /* Tries to open FH for reading as an SPSS/PC+ system file. Returns a pcp_reader if successful, otherwise NULL. */ static struct any_reader * pcp_open (struct file_handle *fh) { struct pcp_reader *r; struct stat s; /* Create and initialize reader. */ r = xzalloc (sizeof *r); r->any_reader.klass = &pcp_file_reader_class; r->pool = pool_create (); pool_register (r->pool, free, r); r->fh = fh_ref (fh); r->opcode_idx = sizeof r->opcodes; /* TRANSLATORS: this fragment will be interpolated into messages in fh_lock() that identify types of files. */ r->lock = fh_lock (fh, FH_REF_FILE, N_("SPSS/PC+ system file"), FH_ACC_READ, false); if (r->lock == NULL) goto error; /* Open file. */ r->file = fn_open (fh, "rb"); if (r->file == NULL) { msg (ME, _("Error opening `%s' for reading as an SPSS/PC+ " "system file: %s."), fh_get_file_name (r->fh), strerror (errno)); goto error; } /* Fetch file size. */ if (fstat (fileno (r->file), &s)) { pcp_error (r, 0, _("%s: stat failed (%s)."), fh_get_file_name (r->fh), strerror (errno)); goto error; } if (s.st_size > UINT_MAX) { pcp_error (r, 0, _("%s: file too large."), fh_get_file_name (r->fh)); goto error; } r->file_size = s.st_size; /* Read dictionary. */ if (!read_dictionary (r)) goto error; if (!pcp_seek (r, r->directory.data.ofs)) goto error; return &r->any_reader; error: pcp_close (&r->any_reader); return NULL; } static bool pcp_read_dir_entry (struct pcp_reader *r, struct pcp_dir_entry *de) { if (!read_uint32 (r, &de->ofs) || !read_uint32 (r, &de->len)) return false; if (de->len > r->file_size || de->ofs > r->file_size - de->len) { pcp_error (r, r->pos - 8, _("Directory entry is for a %u-byte record " "starting at offset %u but file is only " "%u bytes long."), de->ofs, de->len, r->file_size); return false; } return true; } static bool read_dictionary (struct pcp_reader *r) { unsigned int two, zero; if (!read_uint32 (r, &two) || !read_uint32 (r, &zero)) return false; if (two != 2 || zero != 0) pcp_warn (r, 0, _("Directory fields have unexpected values " "(%u,%u)."), two, zero); if (!pcp_read_dir_entry (r, &r->directory.main) || !pcp_read_dir_entry (r, &r->directory.variables) || !pcp_read_dir_entry (r, &r->directory.labels) || !pcp_read_dir_entry (r, &r->directory.data)) return false; if (!read_main_header (r, &r->header)) return false; read_variables_record (r); return true; } struct get_strings_aux { struct pool *pool; char **titles; char **strings; bool *ids; size_t allocated; size_t n; }; static void add_string__ (struct get_strings_aux *aux, const char *string, bool id, char *title) { if (aux->n >= aux->allocated) { aux->allocated = 2 * (aux->allocated + 1); aux->titles = pool_realloc (aux->pool, aux->titles, aux->allocated * sizeof *aux->titles); aux->strings = pool_realloc (aux->pool, aux->strings, aux->allocated * sizeof *aux->strings); aux->ids = pool_realloc (aux->pool, aux->ids, aux->allocated * sizeof *aux->ids); } aux->titles[aux->n] = title; aux->strings[aux->n] = pool_strdup (aux->pool, string); aux->ids[aux->n] = id; aux->n++; } static void PRINTF_FORMAT (3, 4) add_string (struct get_strings_aux *aux, const char *string, const char *title, ...) { va_list args; va_start (args, title); add_string__ (aux, string, false, pool_vasprintf (aux->pool, title, args)); va_end (args); } static void PRINTF_FORMAT (3, 4) add_id (struct get_strings_aux *aux, const char *id, const char *title, ...) { va_list args; va_start (args, title); add_string__ (aux, id, true, pool_vasprintf (aux->pool, title, args)); va_end (args); } /* Retrieves significant string data from R in its raw format, to allow the caller to try to detect the encoding in use. Returns the number of strings retrieved N. Sets each of *TITLESP, *IDSP, and *STRINGSP to an array of N elements allocated from POOL. For each I in 0...N-1, UTF-8 string *TITLESP[I] describes *STRINGSP[I], which is in whatever encoding system file R uses. *IDS[I] is true if *STRINGSP[I] must be a valid PSPP language identifier, false if *STRINGSP[I] is free-form text. */ static size_t pcp_get_strings (const struct any_reader *r_, struct pool *pool, char ***titlesp, bool **idsp, char ***stringsp) { struct pcp_reader *r = pcp_reader_cast (r_); struct get_strings_aux aux; size_t var_idx; size_t i, j; aux.pool = pool; aux.titles = NULL; aux.strings = NULL; aux.ids = NULL; aux.allocated = 0; aux.n = 0; var_idx = 0; for (i = 0; i < r->n_vars; i++) if (r->vars[i].width != -1) add_id (&aux, r->vars[i].name, _("Variable %zu"), ++var_idx); var_idx = 0; for (i = 0; i < r->n_vars; i++) if (r->vars[i].width != -1) { var_idx++; if (r->vars[i].label) add_string (&aux, r->vars[i].label, _("Variable %zu Label"), var_idx); for (j = 0; j < r->vars[i].n_val_labs; j++) add_string (&aux, r->vars[i].label, _("Variable %zu Value Label %zu"), var_idx, j); } add_string (&aux, r->header.creation_date, _("Creation Date")); add_string (&aux, r->header.creation_time, _("Creation Time")); add_string (&aux, r->header.product, _("Product")); add_string (&aux, r->header.file_label, _("File Label")); *titlesp = aux.titles; *idsp = aux.ids; *stringsp = aux.strings; return aux.n; } static void find_and_delete_var (struct dictionary *dict, const char *name) { struct variable *var = dict_lookup_var (dict, name); if (var) dict_delete_var (dict, var); } /* Decodes the dictionary read from R, saving it into into *DICT. Character strings in R are decoded using ENCODING, or an encoding obtained from R if ENCODING is null, or the locale encoding if R specifies no encoding. If INFOP is non-null, then it receives additional info about the system file, which the caller must eventually free with any_read_info_destroy() when it is no longer needed. This function consumes R. The caller must use it again later, even to destroy it with pcp_close(). */ static struct casereader * pcp_decode (struct any_reader *r_, const char *encoding, struct dictionary **dictp, struct any_read_info *infop) { struct pcp_reader *r = pcp_reader_cast (r_); struct dictionary *dict; if (encoding == NULL) { encoding = locale_charset (); pcp_warn (r, -1, _("Using default encoding %s to read this SPSS/PC+ " "system file. For best results, specify an " "encoding explicitly. Use SYSFILE INFO with " "ENCODING=\"DETECT\" to analyze the possible " "encodings."), encoding); } dict = dict_create (encoding); r->encoding = dict_get_encoding (dict); parse_header (r, &r->header, &r->info, dict); if (!parse_variable_records (r, dict, r->vars, r->n_vars)) goto error; /* Create an index of dictionary variable widths for pcp_read_case to use. We cannot use the `struct variable's from the dictionary we created, because the caller owns the dictionary and may destroy or modify its variables. */ r->proto = caseproto_ref_pool (dict_get_proto (dict), r->pool); find_and_delete_var (dict, "CASENUM_"); find_and_delete_var (dict, "DATE_"); find_and_delete_var (dict, "WEIGHT_"); *dictp = dict; if (infop) { *infop = r->info; memset (&r->info, 0, sizeof r->info); } return casereader_create_sequential (NULL, r->proto, r->n_cases, &pcp_file_casereader_class, r); error: pcp_close (&r->any_reader); dict_unref (dict); *dictp = NULL; return NULL; } /* Closes R, which should have been returned by pcp_open() but not already closed with pcp_decode() or this function. Returns true if an I/O error has occurred on READER, false otherwise. */ static bool pcp_close (struct any_reader *r_) { struct pcp_reader *r = pcp_reader_cast (r_); bool error; if (r->file) { if (fn_close (r->fh, r->file) == EOF) { msg (ME, _("Error closing system file `%s': %s."), fh_get_file_name (r->fh), strerror (errno)); r->error = true; } r->file = NULL; } any_read_info_destroy (&r->info); fh_unlock (r->lock); fh_unref (r->fh); error = r->error; pool_destroy (r->pool); return !error; } /* Destroys READER. */ static void pcp_file_casereader_destroy (struct casereader *reader UNUSED, void *r_) { struct pcp_reader *r = r_; pcp_close (&r->any_reader); } /* Detects whether FILE is an SPSS/PC+ system file. Returns 1 if so, 0 if not, and a negative errno value if there is an error reading FILE. */ static int pcp_detect (FILE *file) { static const char signature[4] = "SPSS"; char buf[sizeof signature]; if (fseek (file, 0x104, SEEK_SET)) return -errno; if (fread (buf, sizeof buf, 1, file) != 1) return ferror (file) ? -errno : 0; return !memcmp (buf, signature, sizeof buf); } /* Reads the main header of the SPSS/PC+ system file. Initializes *HEADER and *INFO, except for the string fields in *INFO, which parse_header() will initialize later once the file's encoding is known. */ static bool read_main_header (struct pcp_reader *r, struct pcp_main_header *header) { unsigned int base_ofs = r->directory.main.ofs; unsigned int zero0, zero1, zero2, zero3; size_t min_values, min_data_size; unsigned int one0, one1; unsigned int compressed; unsigned int n_cases1; uint8_t sysmis[8]; if (!pcp_seek (r, base_ofs)) return false; if (r->directory.main.len < 0xb0) { pcp_error (r, r->pos, _("This is not an SPSS/PC+ system file.")); return false; } else if (r->directory.main.len > 0xb0) pcp_warn (r, r->pos, _("Record 0 has unexpected length %u."), r->directory.main.len); if (!read_uint16 (r, &one0) || !read_string (r, header->product, sizeof header->product) || !read_bytes (r, sysmis, sizeof sysmis) || !read_uint32 (r, &zero0) || !read_uint32 (r, &zero1) || !read_uint16 (r, &one1) || !read_uint16 (r, &compressed) || !read_uint16 (r, &header->nominal_case_size) || !read_uint16 (r, &r->n_cases) || !read_uint16 (r, &header->weight_index) || !read_uint16 (r, &zero2) || !read_uint16 (r, &n_cases1) || !read_uint16 (r, &zero3) || !read_string (r, header->creation_date, sizeof header->creation_date) || !read_string (r, header->creation_time, sizeof header->creation_time) || !read_string (r, header->file_label, sizeof header->file_label)) return false; if (!pcp_is_sysmis (sysmis)) { double d = parse_float (sysmis); pcp_warn (r, base_ofs, _("Record 0 specifies unexpected system missing " "value %g (%a)."), d, d); } if (one0 != 1 || one1 != 1 || zero0 != 0 || zero1 != 0 || zero2 != 0 || zero3 != 0) pcp_warn (r, base_ofs, _("Record 0 reserved fields have unexpected values " "(%u,%u,%u,%u,%u,%u)."), one0, one1, zero0, zero1, zero2, zero3); if (n_cases1 != r->n_cases) pcp_warn (r, base_ofs, _("Record 0 case counts differ (%u versus %u)."), r->n_cases, n_cases1); if (compressed != 0 && compressed != 1) { pcp_error (r, base_ofs, _("Invalid compression type %u."), compressed); return false; } r->compressed = compressed != 0; min_values = xtimes (header->nominal_case_size, r->n_cases); min_data_size = xtimes (compressed ? 1 : 8, min_values); if (r->directory.data.len < min_data_size || size_overflow_p (min_data_size)) { pcp_warn (r, base_ofs, _("Record 0 claims %u cases with %u values per " "case (requiring at least %zu bytes) but data " "record is only %u bytes long."), r->n_cases, header->nominal_case_size, min_data_size, r->directory.data.len); return true; } return true; } static bool read_value_labels (struct pcp_reader *r, struct pcp_var_record *var, unsigned int start, unsigned int end) { size_t allocated_val_labs = 0; start += 7; end += 7; if (end > r->directory.labels.len) { pcp_warn (r, r->pos - 32, _("Value labels claimed to end at offset %u in labels record " "but labels record is only %u bytes."), end, r->directory.labels.len); return true; } start += r->directory.labels.ofs; end += r->directory.labels.ofs; if (start > end || end > r->file_size) { pcp_warn (r, r->pos - 32, _("Value labels claimed to be at offset %u with length %u " "but file size is only %u bytes."), start, end - start, r->file_size); return true; } if (!pcp_seek (r, start)) return false; while (r->pos < end && end - r->pos > 8) { struct pcp_value_label *vl; uint8_t len; if (var->n_val_labs >= allocated_val_labs) var->val_labs = pool_2nrealloc (r->pool, var->val_labs, &allocated_val_labs, sizeof *var->val_labs); vl = &var->val_labs[var->n_val_labs]; if (!read_bytes (r, vl->value, sizeof vl->value) || !read_bytes (r, &len, 1)) return false; if (end - r->pos < len) { pcp_warn (r, r->pos, _("Value labels end with partial label (%u bytes left in " "record, label length %"PRIu8")."), end - r->pos, len); return true; } vl->label = pool_malloc (r->pool, len + 1); if (!read_bytes (r, vl->label, len)) return false; vl->label[len] = '\0'; var->n_val_labs++; } if (r->pos < end) pcp_warn (r, r->pos, _("%u leftover bytes following value labels."), end - r->pos); return true; } static bool read_var_label (struct pcp_reader *r, struct pcp_var_record *var, unsigned int ofs) { uint8_t len; ofs += 7; if (ofs >= r->directory.labels.len) { pcp_warn (r, r->pos - 32, _("Variable label claimed to start at offset %u in labels " "record but labels record is only %u bytes."), ofs, r->directory.labels.len); return true; } if (!pcp_seek (r, ofs + r->directory.labels.ofs) || !read_bytes (r, &len, 1)) return false; if (len >= r->directory.labels.len - ofs) { pcp_warn (r, r->pos - 1, _("Variable label with length %u starting at offset %u in " "labels record overruns end of %u-byte labels record."), len, ofs + 1, r->directory.labels.len); return false; } var->label = pool_malloc (r->pool, len + 1); var->label[len] = '\0'; return read_bytes (r, var->label, len); } /* Reads the variables record (record 1) into R. */ static bool read_variables_record (struct pcp_reader *r) { unsigned int i; bool weighted; if (!pcp_seek (r, r->directory.variables.ofs)) return false; if (r->directory.variables.len != r->header.nominal_case_size * 32) { pcp_error (r, r->pos, _("Record 1 has length %u (expected %u)."), r->directory.variables.len, r->header.nominal_case_size * 32); return false; } r->vars = pool_calloc (r->pool, r->header.nominal_case_size, sizeof *r->vars); weighted = false; for (i = 0; i < r->header.nominal_case_size; i++) { struct pcp_var_record *var = &r->vars[r->n_vars++]; unsigned int value_label_start, value_label_end; unsigned int var_label_ofs; unsigned int format; uint8_t raw_type; var->pos = r->pos; if (!read_uint32 (r, &value_label_start) || !read_uint32 (r, &value_label_end) || !read_uint32 (r, &var_label_ofs) || !read_uint32 (r, &format) || !read_string (r, var->name, sizeof var->name) || !read_bytes (r, var->missing, sizeof var->missing)) return false; var->weight = r->header.weight_index && i == r->header.weight_index - 1; if (var->weight) weighted = true; raw_type = format >> 16; if (!fmt_from_io (raw_type, &var->format.type)) { pcp_error (r, var->pos, _("Variable %u has invalid type %"PRIu8"."), i, raw_type); return false; } var->format.w = (format >> 8) & 0xff; var->format.d = format & 0xff; fmt_fix_output (&var->format); var->width = fmt_var_width (&var->format); if (var_label_ofs) { unsigned int save_pos = r->pos; if (!read_var_label (r, var, var_label_ofs) || !pcp_seek (r, save_pos)) return false; } if (value_label_end > value_label_start && var->width <= 8) { unsigned int save_pos = r->pos; if (!read_value_labels (r, var, value_label_start, value_label_end) || !pcp_seek (r, save_pos)) return false; } if (var->width > 8) { int extra = DIV_RND_UP (var->width - 8, 8); i += extra; if (!skip_bytes (r, 32 * extra)) return false; } } if (r->header.weight_index && !weighted) pcp_warn (r, -1, _("Invalid weight index %u."), r->header.weight_index); return true; } static char * recode_and_trim_string (struct pool *pool, const char *from, const char *in) { struct substring out; out = recode_substring_pool ("UTF-8", from, ss_cstr (in), pool); ss_trim (&out, ss_cstr (" ")); return ss_xstrdup (out); } static void parse_header (struct pcp_reader *r, const struct pcp_main_header *header, struct any_read_info *info, struct dictionary *dict) { const char *dict_encoding = dict_get_encoding (dict); char *label; memset (info, 0, sizeof *info); info->integer_format = INTEGER_LSB_FIRST; info->float_format = FLOAT_IEEE_DOUBLE_LE; info->compression = r->compressed ? ANY_COMP_SIMPLE : ANY_COMP_NONE; info->case_cnt = r->n_cases; /* Convert file label to UTF-8 and put it into DICT. */ label = recode_and_trim_string (r->pool, dict_encoding, header->file_label); dict_set_label (dict, label); free (label); /* Put creation date, time, and product in UTF-8 into INFO. */ info->creation_date = recode_and_trim_string (r->pool, dict_encoding, header->creation_date); info->creation_time = recode_and_trim_string (r->pool, dict_encoding, header->creation_time); info->product = recode_and_trim_string (r->pool, dict_encoding, header->product); } /* Reads a variable (type 2) record from R and adds the corresponding variable to DICT. Also skips past additional variable records for long string variables. */ static bool parse_variable_records (struct pcp_reader *r, struct dictionary *dict, struct pcp_var_record *var_recs, size_t n_var_recs) { const char *dict_encoding = dict_get_encoding (dict); struct pcp_var_record *rec; for (rec = var_recs; rec < &var_recs[n_var_recs]; rec++) { struct variable *var; char *name; size_t i; name = recode_string_pool ("UTF-8", dict_encoding, rec->name, -1, r->pool); name[strcspn (name, " ")] = '\0'; /* Transform $DATE => DATE_, $WEIGHT => WEIGHT_, $CASENUM => CASENUM_. */ if (name[0] == '$') name = pool_asprintf (r->pool, "%s_", name + 1); if (!dict_id_is_valid (dict, name, false) || name[0] == '#') { pcp_error (r, rec->pos, _("Invalid variable name `%s'."), name); return false; } var = rec->var = dict_create_var (dict, name, rec->width); if (var == NULL) { char *new_name = dict_make_unique_var_name (dict, NULL, NULL); pcp_warn (r, rec->pos, _("Renaming variable with duplicate name " "`%s' to `%s'."), name, new_name); var = rec->var = dict_create_var_assert (dict, new_name, rec->width); free (new_name); } if (rec->weight) { if (!rec->width) dict_set_weight (dict, var); else pcp_warn (r, rec->pos, _("Cannot weight by string variable `%s'."), name); } /* Set the short name the same as the long name. */ var_set_short_name (var, 0, name); /* Get variable label, if any. */ if (rec->label) { char *utf8_label; utf8_label = recode_string ("UTF-8", dict_encoding, rec->label, -1); var_set_label (var, utf8_label); free (utf8_label); } /* Add value labels. */ for (i = 0; i < rec->n_val_labs; i++) { union value value; char *utf8_label; value_init (&value, rec->width); if (var_is_numeric (var)) value.f = parse_float (rec->val_labs[i].value); else memcpy (value.s, rec->val_labs[i].value, rec->width); utf8_label = recode_string ("UTF-8", dict_encoding, rec->val_labs[i].label, -1); var_add_value_label (var, &value, utf8_label); free (utf8_label); value_destroy (&value, rec->width); } /* Set missing values. */ if (rec->width <= 8 && !pcp_is_sysmis (rec->missing)) { int width = var_get_width (var); struct missing_values mv; mv_init_pool (r->pool, &mv, width); if (var_is_numeric (var)) mv_add_num (&mv, parse_float (rec->missing)); else mv_add_str (&mv, rec->missing, MIN (width, 8)); var_set_missing_values (var, &mv); } /* Set formats. */ var_set_both_formats (var, &rec->format); } return true; } /* Case reader. */ static void read_error (struct casereader *, const struct pcp_reader *); static bool read_case_number (struct pcp_reader *, double *); static int read_case_string (struct pcp_reader *, uint8_t *, size_t); static int read_opcode (struct pcp_reader *); static bool read_compressed_number (struct pcp_reader *, double *); static int read_compressed_string (struct pcp_reader *, uint8_t *); static int read_whole_strings (struct pcp_reader *, uint8_t *, size_t); /* Reads and returns one case from READER's file. Returns a null pointer if not successful. */ static struct ccase * pcp_file_casereader_read (struct casereader *reader, void *r_) { struct pcp_reader *r = r_; unsigned int start_pos = r->pos; struct ccase *c; int retval; int i; if (r->error || !r->n_cases) return NULL; r->n_cases--; c = case_create (r->proto); for (i = 0; i < r->n_vars; i++) { struct pcp_var_record *var = &r->vars[i]; union value *v = case_data_rw_idx (c, i); if (var->width == 0) retval = read_case_number (r, &v->f); else retval = read_case_string (r, v->s, var->width); if (retval != 1) { pcp_error (r, r->pos, _("File ends in partial case.")); goto error; } } if (r->pos > r->directory.data.ofs + r->directory.data.len) { pcp_error (r, r->pos, _("Case beginning at offset 0x%08x extends past " "end of data record at offset 0x%08x."), start_pos, r->directory.data.ofs + r->directory.data.len); goto error; } return c; error: read_error (reader, r); case_unref (c); return NULL; } /* Issues an error that an unspecified error occurred PCP, and marks R tainted. */ static void read_error (struct casereader *r, const struct pcp_reader *pcp) { msg (ME, _("Error reading case from file %s."), fh_get_name (pcp->fh)); casereader_force_error (r); } /* Reads a number from R and stores its value in *D. If R is compressed, reads a compressed number; otherwise, reads a number in the regular way. Returns true if successful, false if end of file is reached immediately. */ static bool read_case_number (struct pcp_reader *r, double *d) { if (!r->compressed) { uint8_t number[8]; if (!try_read_bytes (r, number, sizeof number)) return false; *d = parse_float (number); return true; } else return read_compressed_number (r, d); } /* Reads LENGTH string bytes from R into S. Always reads a multiple of 8 bytes; if LENGTH is not a multiple of 8, then extra bytes are read and discarded without being written to S. Reads compressed strings if S is compressed. Returns 1 if successful, 0 if end of file is reached immediately, or -1 for some kind of error. */ static int read_case_string (struct pcp_reader *r, uint8_t *s, size_t length) { size_t whole = ROUND_DOWN (length, 8); size_t partial = length % 8; if (whole) { int retval = read_whole_strings (r, s, whole); if (retval != 1) return retval; } if (partial) { uint8_t bounce[8]; int retval = read_whole_strings (r, bounce, sizeof bounce); if (retval <= 0) return -1; memcpy (s + whole, bounce, partial); } return 1; } /* Reads and returns the next compression opcode from R. */ static int read_opcode (struct pcp_reader *r) { assert (r->compressed); if (r->opcode_idx >= sizeof r->opcodes) { int retval = try_read_bytes (r, r->opcodes, sizeof r->opcodes); if (retval != 1) return -1; r->opcode_idx = 0; } return r->opcodes[r->opcode_idx++]; } /* Reads a compressed number from R and stores its value in D. Returns true if successful, false if end of file is reached immediately. */ static bool read_compressed_number (struct pcp_reader *r, double *d) { int opcode = read_opcode (r); switch (opcode) { case -1: return false; case 0: *d = SYSMIS; return true; case 1: return read_float (r, d); default: *d = opcode - 105.0; return true; } } /* Reads a compressed 8-byte string segment from R and stores it in DST. */ static int read_compressed_string (struct pcp_reader *r, uint8_t *dst) { int opcode; int retval; opcode = read_opcode (r); switch (opcode) { case -1: return 0; case 1: retval = read_bytes (r, dst, 8); return retval == 1 ? 1 : -1; default: if (!r->corruption_warning) { r->corruption_warning = true; pcp_warn (r, r->pos, _("Possible compressed data corruption: " "string contains compressed integer (opcode %d)."), opcode); } memset (dst, ' ', 8); return 1; } } /* Reads LENGTH string bytes from R into S. LENGTH must be a multiple of 8. Reads compressed strings if S is compressed. Returns 1 if successful, 0 if end of file is reached immediately, or -1 for some kind of error. */ static int read_whole_strings (struct pcp_reader *r, uint8_t *s, size_t length) { assert (length % 8 == 0); if (!r->compressed) return try_read_bytes (r, s, length); else { size_t ofs; for (ofs = 0; ofs < length; ofs += 8) { int retval = read_compressed_string (r, s + ofs); if (retval != 1) return -1; } return 1; } } /* Messages. */ /* Displays a corruption message. */ static void pcp_msg (struct pcp_reader *r, off_t offset, int class, const char *format, va_list args) { struct string text; ds_init_empty (&text); if (offset >= 0) ds_put_format (&text, _("`%s' near offset 0x%llx: "), fh_get_file_name (r->fh), (long long int) offset); else ds_put_format (&text, _("`%s': "), fh_get_file_name (r->fh)); ds_put_vformat (&text, format, args); struct msg m = { .category = msg_class_to_category (class), .severity = msg_class_to_severity (class), .text = ds_cstr (&text), }; msg_emit (&m); } /* Displays a warning for offset OFFSET in the file. */ static void pcp_warn (struct pcp_reader *r, off_t offset, const char *format, ...) { va_list args; va_start (args, format); pcp_msg (r, offset, MW, format, args); va_end (args); } /* Displays an error for the current file position, marks it as in an error state, and aborts reading it using longjmp. */ static void pcp_error (struct pcp_reader *r, off_t offset, const char *format, ...) { va_list args; va_start (args, format); pcp_msg (r, offset, ME, format, args); va_end (args); r->error = true; } /* Reads BYTE_CNT bytes into BUF. Returns 1 if exactly BYTE_CNT bytes are successfully read. Returns -1 if an I/O error or a partial read occurs. Returns 0 for an immediate end-of-file and, if EOF_IS_OK is false, reports an error. */ static inline int read_bytes_internal (struct pcp_reader *r, bool eof_is_ok, void *buf, size_t byte_cnt) { size_t bytes_read = fread (buf, 1, byte_cnt, r->file); r->pos += bytes_read; if (bytes_read == byte_cnt) return 1; else if (ferror (r->file)) { pcp_error (r, r->pos, _("System error: %s."), strerror (errno)); return -1; } else if (!eof_is_ok || bytes_read != 0) { pcp_error (r, r->pos, _("Unexpected end of file.")); return -1; } else return 0; } /* Reads BYTE_CNT into BUF. Returns true if successful. Returns false upon I/O error or if end-of-file is encountered. */ static bool read_bytes (struct pcp_reader *r, void *buf, size_t byte_cnt) { return read_bytes_internal (r, false, buf, byte_cnt) == 1; } /* Reads BYTE_CNT bytes into BUF. Returns 1 if exactly BYTE_CNT bytes are successfully read. Returns 0 if an immediate end-of-file is encountered. Returns -1 if an I/O error or a partial read occurs. */ static int try_read_bytes (struct pcp_reader *r, void *buf, size_t byte_cnt) { return read_bytes_internal (r, true, buf, byte_cnt); } /* Reads a 16-bit signed integer from R and stores its value in host format in *X. Returns true if successful, otherwise false. */ static bool read_uint16 (struct pcp_reader *r, unsigned int *x) { uint8_t integer[2]; if (read_bytes (r, integer, sizeof integer) != 1) return false; *x = integer_get (INTEGER_LSB_FIRST, integer, sizeof integer); return true; } /* Reads a 32-bit signed integer from R and stores its value in host format in *X. Returns true if successful, otherwise false. */ static bool read_uint32 (struct pcp_reader *r, unsigned int *x) { uint8_t integer[4]; if (read_bytes (r, integer, sizeof integer) != 1) return false; *x = integer_get (INTEGER_LSB_FIRST, integer, sizeof integer); return true; } /* Reads exactly SIZE - 1 bytes into BUFFER and stores a null byte into BUFFER[SIZE - 1]. */ static bool read_string (struct pcp_reader *r, char *buffer, size_t size) { bool ok; assert (size > 0); ok = read_bytes (r, buffer, size - 1); if (ok) buffer[size - 1] = '\0'; return ok; } /* Skips BYTES bytes forward in R. */ static bool skip_bytes (struct pcp_reader *r, size_t bytes) { while (bytes > 0) { char buffer[1024]; size_t chunk = MIN (sizeof buffer, bytes); if (!read_bytes (r, buffer, chunk)) return false; bytes -= chunk; } return true; } static bool pcp_seek (struct pcp_reader *r, off_t offset) { if (fseeko (r->file, offset, SEEK_SET)) { pcp_error (r, 0, _("%s: seek failed (%s)."), fh_get_file_name (r->fh), strerror (errno)); return false; } r->pos = offset; return true; } /* Reads a 64-bit floating-point number from R and returns its value in host format. */ static bool read_float (struct pcp_reader *r, double *d) { uint8_t number[8]; if (!read_bytes (r, number, sizeof number)) return false; else { *d = parse_float (number); return true; } } static double parse_float (const uint8_t number[8]) { return (pcp_is_sysmis (number) ? SYSMIS : float_get_double (FLOAT_IEEE_DOUBLE_LE, number)); } static bool pcp_is_sysmis(const uint8_t *p) { static const uint8_t sysmis[8] = { 0xf5, 0x1e, 0x26, 0x02, 0x8a, 0x8c, 0xed, 0xff }; return !memcmp (p, sysmis, 8); } static const struct casereader_class pcp_file_casereader_class = { pcp_file_casereader_read, pcp_file_casereader_destroy, NULL, NULL, }; const struct any_reader_class pcp_file_reader_class = { N_("SPSS/PC+ System File"), pcp_detect, pcp_open, pcp_close, pcp_decode, pcp_get_strings, }; pspp-1.4.1/src/data/file-handle-def.c0000644000175000017500000005612213673465023016702 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 1997-9, 2000, 2006, 2009, 2010, 2011, 2012, 2013 Free Software Foundation, Inc. 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 3 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, see . */ #include #include "data/file-handle-def.h" #include #include #include #include #include "data/dataset.h" #include "data/variable.h" #include "libpspp/cast.h" #include "libpspp/compiler.h" #include "libpspp/hash-functions.h" #include "libpspp/hmap.h" #include "libpspp/i18n.h" #include "libpspp/message.h" #include "libpspp/str.h" #include #include "gl/dirname.h" #include "gl/xalloc.h" #include "gettext.h" #define _(msgid) gettext (msgid) #if defined _WIN32 || defined __WIN32__ #define WIN32_LEAN_AND_MEAN /* avoid including junk */ #include #endif /* File handle. */ struct file_handle { struct hmap_node name_node; /* Element in named_handles hmap. */ size_t ref_cnt; /* Number of references. */ char *id; /* Identifier token, NULL if none. */ char *name; /* User-friendly identifying name. */ enum fh_referent referent; /* What the file handle refers to. */ /* FH_REF_FILE only. */ char *file_name; /* File name as provided by user. */ char *file_name_encoding; /* The character encoding of file_name, This is NOT the encoding of the file contents! */ enum fh_mode mode; /* File mode. */ enum fh_line_ends line_ends; /* Line ends for text files. */ /* FH_REF_FILE and FH_REF_INLINE only. */ size_t record_width; /* Length of fixed-format records. */ size_t tab_width; /* Tab width, 0=do not expand tabs. */ char *encoding; /* Charset for contents. */ /* FH_REF_DATASET only. */ struct dataset *ds; /* Dataset. */ }; /* All "struct file_handle"s with nonnull 'id' member. */ static struct hmap named_handles = HMAP_INITIALIZER (named_handles); /* Default file handle for DATA LIST, REREAD, REPEATING DATA commands. */ static struct file_handle *default_handle; /* The "file" that reads from BEGIN DATA...END DATA. */ static struct file_handle *inline_file; static struct file_handle *create_handle (const char *id, char *name, enum fh_referent, const char *encoding); static void free_handle (struct file_handle *); static void unname_handle (struct file_handle *); /* Hash table of all active locks. */ static struct hmap locks = HMAP_INITIALIZER (locks); static struct file_identity *fh_get_identity (const struct file_handle *); static void fh_free_identity (struct file_identity *); static int fh_compare_file_identities (const struct file_identity *, const struct file_identity *); static unsigned int fh_hash_identity (const struct file_identity *); /* File handle initialization routine. */ void fh_init (void) { inline_file = create_handle ("INLINE", xstrdup ("INLINE"), FH_REF_INLINE, "Auto"); inline_file->record_width = 80; inline_file->tab_width = 8; } /* Removes all named file handles from the global list. */ void fh_done (void) { struct file_handle *handle, *next; HMAP_FOR_EACH_SAFE (handle, next, struct file_handle, name_node, &named_handles) unname_handle (handle); free_handle (inline_file); } /* Free HANDLE and remove it from the global list. */ static void free_handle (struct file_handle *handle) { if (handle == NULL) return; /* Remove handle from global list. */ if (handle->id != NULL) hmap_delete (&named_handles, &handle->name_node); /* Free data. */ free (handle->id); free (handle->name); free (handle->file_name); free (handle->file_name_encoding); free (handle->encoding); free (handle); } /* Make HANDLE unnamed, so that it can no longer be referenced by name. The caller must hold a reference to HANDLE, which is not affected by this function. */ static void unname_handle (struct file_handle *handle) { assert (handle->id != NULL); free (handle->id); handle->id = NULL; hmap_delete (&named_handles, &handle->name_node); /* Drop the reference held by the named_handles table. */ fh_unref (handle); } /* Increments HANDLE's reference count and returns HANDLE. */ struct file_handle * fh_ref (struct file_handle *handle) { if (handle == fh_inline_file ()) return handle; assert (handle->ref_cnt > 0); handle->ref_cnt++; return handle; } /* Decrements HANDLE's reference count. If the reference count drops to 0, HANDLE is destroyed. */ void fh_unref (struct file_handle *handle) { if (handle != NULL) { if (handle == fh_inline_file ()) return; assert (handle->ref_cnt > 0); if (--handle->ref_cnt == 0) free_handle (handle); } } /* Make HANDLE unnamed, so that it can no longer be referenced by name. The caller must hold a reference to HANDLE, which is not affected by this function. This function ignores a null pointer as input. It has no effect on the inline handle, which is always named INLINE.*/ void fh_unname (struct file_handle *handle) { assert (handle->ref_cnt > 1); if (handle != fh_inline_file () && handle->id != NULL) unname_handle (handle); } /* Returns the handle with the given ID, or a null pointer if there is none. */ struct file_handle * fh_from_id (const char *id) { struct file_handle *handle; HMAP_FOR_EACH_WITH_HASH (handle, struct file_handle, name_node, utf8_hash_case_string (id, 0), &named_handles) if (!utf8_strcasecmp (id, handle->id)) { return fh_ref (handle); } return NULL; } /* Creates a new handle with identifier ID (which may be null) and name HANDLE_NAME that refers to REFERENT. Links the new handle into the global list. Returns the new handle. The new handle is not fully initialized. The caller is responsible for completing its initialization. */ static struct file_handle * create_handle (const char *id, char *handle_name, enum fh_referent referent, const char *encoding) { struct file_handle *handle = xzalloc (sizeof *handle); handle->ref_cnt = 1; handle->id = id != NULL ? xstrdup (id) : NULL; handle->name = handle_name; handle->referent = referent; handle->encoding = xstrdup (encoding); if (id != NULL) { hmap_insert (&named_handles, &handle->name_node, utf8_hash_case_string (handle->id, 0)); } return handle; } /* Returns the unique handle of referent type FH_REF_INLINE, which refers to the "inline file" that represents character data in the command file between BEGIN DATA and END DATA. */ struct file_handle * fh_inline_file (void) { return inline_file; } /* Creates and returns a new file handle with the given ID, which may be null. If it is non-null, it must be a UTF-8 encoded string that is unique among existing file identifiers. The new handle is associated with file FILE_NAME and the given PROPERTIES. */ struct file_handle * fh_create_file (const char *id, const char *file_name, const char *file_name_encoding, const struct fh_properties *properties) { char *handle_name; struct file_handle *handle; handle_name = id != NULL ? xstrdup (id) : xasprintf ("`%s'", file_name); handle = create_handle (id, handle_name, FH_REF_FILE, properties->encoding); handle->file_name = xstrdup (file_name); handle->file_name_encoding = file_name_encoding ? xstrdup (file_name_encoding) : NULL; handle->mode = properties->mode; handle->line_ends = properties->line_ends; handle->record_width = properties->record_width; handle->tab_width = properties->tab_width; return handle; } /* Creates a new file handle with the given ID, which must be unique among existing file identifiers. The new handle is associated with a dataset file (initially empty). */ struct file_handle * fh_create_dataset (struct dataset *ds) { const char *name; struct file_handle *handle; name = dataset_name (ds); if (name[0] == '\0') name = _("active dataset"); handle = create_handle (NULL, xstrdup (name), FH_REF_DATASET, C_ENCODING); handle->ds = ds; return handle; } /* Returns a set of default properties for a file handle. */ const struct fh_properties * fh_default_properties (void) { #if defined _WIN32 || defined __WIN32__ #define DEFAULT_LINE_ENDS FH_END_CRLF #else #define DEFAULT_LINE_ENDS FH_END_LF #endif static const struct fh_properties default_properties = {FH_MODE_TEXT, DEFAULT_LINE_ENDS, 1024, 4, (char *) "Auto"}; return &default_properties; } /* Returns the identifier that may be used in syntax to name the given HANDLE, which takes the form of a PSPP identifier. If HANDLE has no identifier, returns a null pointer. Return value is owned by the file handle.*/ const char * fh_get_id (const struct file_handle *handle) { return handle->id; } /* Returns a user-friendly string to identify the given HANDLE. If HANDLE was created by referring to a file name, returns the file name, enclosed in double quotes. Return value is owned by the file handle. Useful for printing error messages about use of file handles. */ const char * fh_get_name (const struct file_handle *handle) { return handle->name; } /* Returns the type of object that HANDLE refers to. */ enum fh_referent fh_get_referent (const struct file_handle *handle) { return handle->referent; } /* Returns the name of the file associated with HANDLE. */ const char * fh_get_file_name (const struct file_handle *handle) { assert (handle->referent == FH_REF_FILE); return handle->file_name; } /* Returns the character encoding of the name of the file associated with HANDLE. */ const char * fh_get_file_name_encoding (const struct file_handle *handle) { assert (handle->referent == FH_REF_FILE); return handle->file_name_encoding; } /* Returns the mode of HANDLE. */ enum fh_mode fh_get_mode (const struct file_handle *handle) { assert (handle->referent == FH_REF_FILE); return handle->mode; } /* Returns the line ends of HANDLE, which must be a handle associated with a file. */ enum fh_line_ends fh_get_line_ends (const struct file_handle *handle) { assert (handle->referent == FH_REF_FILE); return handle->line_ends; } /* Returns the width of a logical record on HANDLE. */ size_t fh_get_record_width (const struct file_handle *handle) { assert (handle->referent & (FH_REF_FILE | FH_REF_INLINE)); return handle->record_width; } /* Returns the number of characters per tab stop for HANDLE, or zero if tabs are not to be expanded. Applicable only to FH_MODE_TEXT files. */ size_t fh_get_tab_width (const struct file_handle *handle) { assert (handle->referent & (FH_REF_FILE | FH_REF_INLINE)); return handle->tab_width; } /* Returns the encoding of characters read from HANDLE. */ const char * fh_get_encoding (const struct file_handle *handle) { return handle->encoding; } /* Returns the dataset handle associated with HANDLE. Applicable to only FH_REF_DATASET files. */ struct dataset * fh_get_dataset (const struct file_handle *handle) { assert (handle->referent == FH_REF_DATASET); return handle->ds; } /* Returns the current default handle. */ struct file_handle * fh_get_default_handle (void) { return default_handle ? default_handle : fh_inline_file (); } /* Sets NEW_DEFAULT_HANDLE as the default handle. */ void fh_set_default_handle (struct file_handle *new_default_handle) { assert (new_default_handle == NULL || (new_default_handle->referent & (FH_REF_INLINE | FH_REF_FILE))); if (default_handle != NULL && default_handle != inline_file) fh_unref (default_handle); default_handle = new_default_handle; if (default_handle != NULL) default_handle = fh_ref (default_handle); } /* Information about a file handle's readers or writers. */ struct fh_lock { struct hmap_node node; /* hmap_node member. */ /* Hash key. */ enum fh_referent referent; /* Type of underlying file. */ union { struct file_identity *file; /* FH_REF_FILE only. */ unsigned int unique_id; /* FH_REF_DATASET only. */ } u; enum fh_access access; /* Type of file access. */ /* Number of openers. */ size_t open_cnt; /* Applicable only when open_cnt > 0. */ bool exclusive; /* No other openers allowed? */ const char *type; /* Human-readable type of file. */ void *aux; /* Owner's auxiliary data. */ }; static void make_key (struct fh_lock *, const struct file_handle *, enum fh_access); static void free_key (struct fh_lock *); static int compare_fh_locks (const struct fh_lock *a, const struct fh_lock *b); static unsigned int hash_fh_lock (const struct fh_lock *lock); /* Tries to lock handle H for the given kind of ACCESS and TYPE of file. Returns a pointer to a struct fh_lock if successful, otherwise a null pointer. H's referent type must be one of the bits in MASK. The caller must verify this ahead of time; we simply assert it here. TYPE is the sort of file, e.g. "system file". Only one type of access is allowed on a given file at a time for reading, and similarly for writing. If successful, a reference to TYPE is retained, so it should probably be a string literal. TYPE should be marked with N_() in the caller: that is, the caller should not translate it with gettext, but fh_lock will do so. ACCESS specifies whether the lock is for reading or writing. EXCLUSIVE is true to require exclusive access, false to allow sharing with other accessors. Exclusive read access precludes other readers, but not writers; exclusive write access precludes other writers, but not readers. A sharable read or write lock precludes reader or writers, respectively, of a different TYPE. A lock may be associated with auxiliary data. See fh_lock_get_aux and fh_lock_set_aux for more details. */ struct fh_lock * fh_lock (struct file_handle *h, enum fh_referent mask UNUSED, const char *type, enum fh_access access, bool exclusive) { struct fh_lock *key = NULL; size_t hash ; struct fh_lock *lock = NULL; bool found_lock = false; assert ((fh_get_referent (h) & mask) != 0); assert (access == FH_ACC_READ || access == FH_ACC_WRITE); key = xmalloc (sizeof *key); make_key (key, h, access); key->open_cnt = 1; key->exclusive = exclusive; key->type = type; key->aux = NULL; hash = hash_fh_lock (key); HMAP_FOR_EACH_WITH_HASH (lock, struct fh_lock, node, hash, &locks) { if (0 == compare_fh_locks (lock, key)) { found_lock = true; break; } } if (found_lock) { if (strcmp (lock->type, type)) { if (access == FH_ACC_READ) msg (SE, _("Can't read from %s as a %s because it is " "already being read as a %s."), fh_get_name (h), gettext (type), gettext (lock->type)); else msg (SE, _("Can't write to %s as a %s because it is " "already being written as a %s."), fh_get_name (h), gettext (type), gettext (lock->type)); return NULL; } else if (exclusive || lock->exclusive) { msg (SE, _("Can't re-open %s as a %s."), fh_get_name (h), gettext (type)); return NULL; } lock->open_cnt++; free_key (key); free (key); return lock; } hmap_insert (&locks, &key->node, hash); found_lock = false; HMAP_FOR_EACH_WITH_HASH (lock, struct fh_lock, node, hash, &locks) { if (0 == compare_fh_locks (lock, key)) { found_lock = true; break; } } assert (found_lock); return key; } /* Releases LOCK that was acquired with fh_lock. Returns true if LOCK is still locked, because other clients also had it locked. Returns false if LOCK has now been destroyed. In this case the caller must ensure that any auxiliary data associated with LOCK is destroyed, to avoid a memory leak. The caller must obtain a pointer to the auxiliary data, e.g. via fh_lock_get_aux *before* calling fh_unlock (because it yields undefined behavior to call fh_lock_get_aux on a destroyed lock). */ bool fh_unlock (struct fh_lock *lock) { if (lock != NULL) { assert (lock->open_cnt > 0); if (--lock->open_cnt == 0) { hmap_delete (&locks, &lock->node); free_key (lock); free (lock); return false; } } return true; } /* Returns auxiliary data for LOCK. Auxiliary data is shared by every client that holds LOCK (for an exclusive lock, this is a single client). To avoid leaks, auxiliary data must be released before LOCK is destroyed. */ void * fh_lock_get_aux (const struct fh_lock *lock) { return lock->aux; } /* Sets the auxiliary data for LOCK to AUX. */ void fh_lock_set_aux (struct fh_lock *lock, void *aux) { lock->aux = aux; } /* Returns true if HANDLE is locked for the given type of ACCESS, false otherwise. */ bool fh_is_locked (const struct file_handle *handle, enum fh_access access) { struct fh_lock key; const struct fh_lock *k = NULL; bool is_locked = false; size_t hash ; make_key (&key, handle, access); hash = hash_fh_lock (&key); HMAP_FOR_EACH_WITH_HASH (k, struct fh_lock, node, hash, &locks) { if (0 == compare_fh_locks (k, &key)) { is_locked = true; break; } } free_key (&key); return is_locked; } /* Initializes the key fields in LOCK for looking up or inserting handle H for the given kind of ACCESS. */ static void make_key (struct fh_lock *lock, const struct file_handle *h, enum fh_access access) { lock->referent = fh_get_referent (h); lock->access = access; if (lock->referent == FH_REF_FILE) lock->u.file = fh_get_identity (h); else if (lock->referent == FH_REF_DATASET) lock->u.unique_id = dataset_seqno (fh_get_dataset (h)); } /* Frees the key fields in LOCK. */ static void free_key (struct fh_lock *lock) { if (lock->referent == FH_REF_FILE) fh_free_identity (lock->u.file); } /* Compares the key fields in struct fh_lock objects A and B and returns a strcmp()-type result. */ static int compare_fh_locks (const struct fh_lock *a, const struct fh_lock *b) { if (a->referent != b->referent) return a->referent < b->referent ? -1 : 1; else if (a->access != b->access) return a->access < b->access ? -1 : 1; else if (a->referent == FH_REF_FILE) return fh_compare_file_identities (a->u.file, b->u.file); else if (a->referent == FH_REF_DATASET) return (a->u.unique_id < b->u.unique_id ? -1 : a->u.unique_id > b->u.unique_id); else return 0; } /* Returns a hash value for LOCK. */ static unsigned int hash_fh_lock (const struct fh_lock *lock) { unsigned int basis; if (lock->referent == FH_REF_FILE) basis = fh_hash_identity (lock->u.file); else if (lock->referent == FH_REF_DATASET) basis = lock->u.unique_id; else basis = 0; return hash_int ((lock->referent << 3) | lock->access, basis); } /* A file's identity: - For a file that exists, this is its device and inode. - For a file that does not exist, but which has a directory name that exists, this is the device and inode of the directory, plus the file's base name. - For a file that does not exist and has a nonexistent directory, this is the file name. Windows doesn't have inode numbers, so we just use the name there. */ struct file_identity { unsigned long long device; /* Device number. */ unsigned long long inode; /* Inode number. */ char *name; /* File name, where needed, otherwise NULL. */ }; /* Returns a pointer to a dynamically allocated structure whose value can be used to tell whether two files are actually the same file. The caller is responsible for freeing the structure with fh_free_identity() when finished. */ static struct file_identity * fh_get_identity (const struct file_handle *fh) { struct file_identity *identity = xmalloc (sizeof *identity); const char *file_name = fh_get_file_name (fh); #if !(defined _WIN32 || defined __WIN32__) struct stat s; if (lstat (file_name, &s) == 0) { identity->device = s.st_dev; identity->inode = s.st_ino; identity->name = NULL; } else { char *dir = dir_name (file_name); if (last_component (file_name) != NULL && stat (dir, &s) == 0) { identity->device = s.st_dev; identity->inode = s.st_ino; identity->name = base_name (file_name); } else { identity->device = 0; identity->inode = 0; identity->name = xstrdup (file_name); } free (dir); } #else /* Windows */ bool ok = false; HANDLE h = CreateFile (file_name, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_READONLY, NULL); if (h != INVALID_HANDLE_VALUE) { BY_HANDLE_FILE_INFORMATION fi; ok = GetFileInformationByHandle (h, &fi); if (ok) { identity->device = fi.dwVolumeSerialNumber; identity->inode = fi.nFileIndexHigh; identity->inode <<= (sizeof fi.nFileIndexLow) * CHAR_BIT; identity->inode |= fi.nFileIndexLow; identity->name = 0; } CloseHandle (h); } if (!ok) { identity->device = 0; identity->inode = 0; size_t bufsize; size_t pathlen = 255; char *cname = NULL; do { bufsize = pathlen; cname = xrealloc (cname, bufsize); pathlen = GetFullPathName (file_name, bufsize, cname, NULL); } while (pathlen > bufsize); identity->name = xstrdup (cname); free (cname); str_lowercase (identity->name); } #endif /* Windows */ return identity; } /* Frees IDENTITY obtained from fh_get_identity(). */ void fh_free_identity (struct file_identity *identity) { if (identity != NULL) { free (identity->name); free (identity); } } /* Compares A and B, returning a strcmp()-type result. */ int fh_compare_file_identities (const struct file_identity *a, const struct file_identity *b) { if (a->device != b->device) return a->device < b->device ? -1 : 1; else if (a->inode != b->inode) return a->inode < b->inode ? -1 : 1; else if (a->name != NULL) return b->name != NULL ? strcmp (a->name, b->name) : 1; else return b->name != NULL ? -1 : 0; } /* Returns a hash value for IDENTITY. */ unsigned int fh_hash_identity (const struct file_identity *identity) { unsigned int hash = hash_int (identity->device, identity->inode); if (identity->name != NULL) hash = hash_string (identity->name, hash); return hash; } pspp-1.4.1/src/data/casereader-provider.h0000644000175000017500000001527713320146056017726 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2007, 2009, 2011 Free Software Foundation, Inc. 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 3 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, see . */ /* Definitions needed to implement a new type of casereader. Code that only uses casereaders does not need this header. Two functions to create casereaders are supplied: - casereader_create_sequential, to create a casereader for a data source that is naturally sequential. The casereader layer will automatically, as needed, simulate the ability to access cases randomly. - casereader_create_random, to create a casereader for a data source that supports random access to cases. (This function is in fact implemented as a set of wrappers around casereader_create_sequential.) Which function is used has no effect on the set of operations that may be performed on the resulting casereader, only on how the casereader is implemented internally. */ #ifndef DATA_CASEREADER_PROVIDER_H #define DATA_CASEREADER_PROVIDER_H 1 #include "data/casereader.h" /* Casereader class for sequential data sources. */ struct casereader_class { /* Mandatory. Reads the next case from READER. If successful, returns the case and advances READER, so that the next call to this function will read the following case. The case just read will never be read again by a call to this function for READER. If a case is successfully returned, the client is responsible for calling case_unref upon it when it is no longer needed. At end of file or upon an I/O error, returns a null pointer. After null is returned once, this function will not be called again for the given READER. If an I/O error occurs, this function should call casereader_force_error on READER. */ struct ccase *(*read) (struct casereader *reader, void *aux); /* Mandatory. Destroys READER. If an I/O error is detected during destruction, this function should call casereader_force_error on READER. */ void (*destroy) (struct casereader *reader, void *aux); /* Optional: if convenient and efficiently implementable, supply this function as an optimization for use by casereader_clone. (But it might be easier to use the random-access casereader wrapper instead.) Creates and returns a clone of READER. The clone must read the same case data in the same sequence as READER, starting from the same position. The only allowable exception to this rule is that I/O errors may force the clone or the original casereader to stop reading after differing numbers of cases. The clone should have a clone of READER's taint object, accomplished by passing casereader_get_taint (READER) to casereader_create. */ struct casereader *(*clone) (struct casereader *reader, void *aux); /* Optional: if convenient and efficiently implementable, supply as an optimization for use by casereader_peek. (But it might be easier to use the random-access casereader wrapper instead.) Reads and returns the case at 0-based offset IDX from the beginning of READER. If a case is successfully returned, the client is responsible for calling case_unref upon it when it is no longer needed. At end of file or upon an I/O error, returns a null pointer. If this function returns null, then it will never be called again for an equal or greater value of IDX, and the "read" member function will never be called to advance as far as IDX cases further into the casereader. That is, returning null indicates that the casereader has fewer than IDX cases left. If an I/O error occurs, this function should call casereader_force_error on READER. */ struct ccase *(*peek) (struct casereader *reader, void *aux, casenumber idx); }; struct casereader * casereader_create_sequential (const struct taint *, const struct caseproto *, casenumber case_cnt, const struct casereader_class *, void *); void *casereader_dynamic_cast (struct casereader *, const struct casereader_class *); /* Casereader class for random-access data sources. */ struct casereader_random_class { /* Mandatory. Reads the case at 0-based offset IDX from the beginning of READER. If a case is successfully returned, the client is responsible for calling case_unref upon it when it is no longer needed. At end of file or upon an I/O error, returns a null pointer. If this function returns null, then it will never be called again for an equal or greater value of IDX, and the "read" member function will never be called to advance as far as IDX cases further into the casereader. That is, returning null indicates that the casereader has fewer than IDX cases. If an I/O error occurs, this function should call casereader_force_error on READER. */ struct ccase *(*read) (struct casereader *reader, void *aux, casenumber idx); /* Mandatory. Destroys READER. If an I/O error is detected during destruction, this function should call casereader_force_error on READER. */ void (*destroy) (struct casereader *reader, void *aux); /* Mandatory. A call to this function tells the callee that the CNT cases at the beginning of READER will never be read again. The casereader implementation should free any resources associated with those cases. After this function returns, the IDX argument in future calls to the "read" function will be relative to remaining cases. */ void (*advance) (struct casereader *reader, void *aux, casenumber cnt); }; struct casereader * casereader_create_random (const struct caseproto *, casenumber case_cnt, const struct casereader_random_class *, void *aux); #endif /* data/casereader-provider.h */ pspp-1.4.1/src/data/sys-file-private.c0000644000175000017500000002154013320146056017164 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2006, 2009, 2010 Free Software Foundation, Inc. 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 3 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, see . */ #include #include "data/sys-file-private.h" #include "data/dictionary.h" #include "data/value.h" #include "data/variable.h" #include "libpspp/assertion.h" #include "libpspp/misc.h" #include "gl/c-strcase.h" #include "gl/minmax.h" #include "gl/xalloc.h" /* Number of bytes really stored in each segment of a very long string variable. */ #define REAL_VLS_CHUNK 255 /* Number of bytes per segment by which the amount of space for very long string variables is allocated. */ #define EFFECTIVE_VLS_CHUNK 252 /* Returns true if WIDTH is a very long string width, false otherwise. */ static bool is_very_long (int width) { return width >= 256; } /* Returns the smaller of A or B. (Defined as a function to avoid evaluating A or B more than once.) */ static int min_int (int a, int b) { return MIN (a, b); } /* Returns the larger of A or B. (Defined as a function to avoid evaluating A or B more than once.) */ static int max_int (int a, int b) { return MAX (a, b); } /* Returns the number of bytes of uncompressed case data used for writing a variable of the given WIDTH to a system file. All required space is included, including trailing padding and internal padding. */ static int sfm_width_to_bytes (int width) { int bytes; assert (width >= 0); if (width == 0) bytes = 8; else if (!is_very_long (width)) bytes = width; else { int chunks = width / EFFECTIVE_VLS_CHUNK; int remainder = width % EFFECTIVE_VLS_CHUNK; bytes = remainder + (chunks * ROUND_UP (REAL_VLS_CHUNK, 8)); } return ROUND_UP (bytes, 8); } /* Returns the number of 8-byte units (octs) used to write data for a variable of the given WIDTH. */ int sfm_width_to_octs (int width) { return sfm_width_to_bytes (width) / 8; } /* Returns the number of "segments" used for writing case data for a variable of the given WIDTH. A segment is a physical variable in the system file that represents some piece of a logical variable as seen by a PSPP user. Only very long string variables have more than one segment. */ int sfm_width_to_segments (int width) { assert (width >= 0); return !is_very_long (width) ? 1 : DIV_RND_UP (width, EFFECTIVE_VLS_CHUNK); } /* Returns the width to allocate to the given SEGMENT within a variable of the given WIDTH. A segment is a physical variable in the system file that represents some piece of a logical variable as seen by a PSPP user. */ int sfm_segment_alloc_width (int width, int segment) { assert (segment < sfm_width_to_segments (width)); return (!is_very_long (width) ? width : segment < sfm_width_to_segments (width) - 1 ? 255 : width - segment * EFFECTIVE_VLS_CHUNK); } /* Returns the number of bytes to allocate to the given SEGMENT within a variable of the given width. This is the same as sfm_segment_alloc_width, except that a numeric value takes up 8 bytes despite having a width of 0. */ static int sfm_segment_alloc_bytes (int width, int segment) { assert (segment < sfm_width_to_segments (width)); return (width == 0 ? 8 : ROUND_UP (sfm_segment_alloc_width (width, segment), 8)); } /* Returns the number of bytes in the given SEGMENT within a variable of the given WIDTH that are actually used to store data. For a numeric value (WIDTH of 0), this is 8 bytes; for a string value less than 256 bytes wide, it is WIDTH bytes. For very long string values, the calculation is more complicated and ranges between 255 bytes for the first segment to as little as 0 bytes for final segments. */ static int sfm_segment_used_bytes (int width, int segment) { assert (segment < sfm_width_to_segments (width)); return (width == 0 ? 8 : !is_very_long (width) ? width : max_int (0, min_int (width - REAL_VLS_CHUNK * segment, REAL_VLS_CHUNK))); } /* Returns the number of bytes at the end of the given SEGMENT within a variable of the given WIDTH that are not used for data; that is, the number of bytes that must be padded with data that a reader ignores. */ static int sfm_segment_padding (int width, int segment) { return (sfm_segment_alloc_bytes (width, segment) - sfm_segment_used_bytes (width, segment)); } /* Returns the byte offset of the start of the given SEGMENT within a variable of the given WIDTH. The first segment starts at offset 0; only very long string variables have any other segments. */ static int sfm_segment_offset (int width, int segment) { assert (segment < sfm_width_to_segments (width)); return min_int (REAL_VLS_CHUNK * segment, width); } /* Returns the byte offset of the start of the given SEGMENT within a variable of the given WIDTH, given the (incorrect) assumption that there are EFFECTIVE_VLS_CHUNK bytes per segment. (Use of this function is questionable at best.) */ int sfm_segment_effective_offset (int width, int segment) { assert (segment < sfm_width_to_segments (width)); return EFFECTIVE_VLS_CHUNK * segment; } /* Creates and initializes an array of struct sfm_vars that describe how a case drawn from dictionary DICT is laid out in a system file. Returns the number of segments in a case. A segment is a physical variable in the system file that represents some piece of a logical variable as seen by a PSPP user. The array is allocated with malloc and stored in *SFM_VARS, and its number of elements is stored in *SFM_VAR_CNT. The caller is responsible for freeing it when it is no longer needed. */ int sfm_dictionary_to_sfm_vars (const struct dictionary *dict, struct sfm_var **sfm_vars, size_t *sfm_var_cnt) { size_t var_cnt = dict_get_var_cnt (dict); size_t segment_cnt; size_t i; /* Estimate the number of sfm_vars that will be needed. We might not need all of these, because very long string variables can have segments that are all padding, which do not need sfm_vars of their own. */ segment_cnt = 0; for (i = 0; i < var_cnt; i++) { const struct variable *v = dict_get_var (dict, i); segment_cnt += sfm_width_to_segments (var_get_width (v)); } /* Compose the sfm_vars. */ *sfm_vars = xnmalloc (segment_cnt, sizeof **sfm_vars); *sfm_var_cnt = 0; for (i = 0; i < var_cnt; i++) { const struct variable *dv = dict_get_var (dict, i); int width = var_get_width (dv); int j; for (j = 0; j < sfm_width_to_segments (width); j++) { int used_bytes = sfm_segment_used_bytes (width, j); int padding = sfm_segment_padding (width, j); struct sfm_var *sv; if (used_bytes != 0) { sv = &(*sfm_vars)[(*sfm_var_cnt)++]; sv->var_width = width; sv->segment_width = width == 0 ? 0 : used_bytes; sv->case_index = var_get_case_index (dv); sv->offset = sfm_segment_offset (width, j); sv->padding = padding; } else { /* Segment is all padding. Just add it to the previous segment. */ sv = &(*sfm_vars)[*sfm_var_cnt - 1]; sv->padding += padding; } assert ((sv->segment_width + sv->padding) % 8 == 0); } } return segment_cnt; } /* Given the name of an encoding, returns the codepage number to use in the 'character_code' member of the machine integer info record for writing a system file. */ int sys_get_codepage_from_encoding (const char *name) { const struct sys_encoding *e; for (e = sys_codepage_name_to_number; e->name != NULL; e++) if (!c_strcasecmp (name, e->name)) return e->number; return 0; } /* Given a codepage number from the 'character_code' member of the machine integer info record in a system file, returns a corresponding encoding name. Most encodings have multiple aliases; the one returned is the one that would be used in the character encoding record. */ const char * sys_get_encoding_from_codepage (int codepage) { const struct sys_encoding *e; for (e = sys_codepage_number_to_name; e->name != NULL; e++) if (codepage == e->number) return e->name; return NULL; } pspp-1.4.1/src/data/dict-class.h0000644000175000017500000000307713320146056016021 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2007 Free Software Foundation, Inc. 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 3 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, see . */ /* Dictionary classes. Occasionally it is useful to classify variables into three groups: system variables (those whose names begin with $), scratch variables (those whose names begin with #), and ordinary variables (all others). This header provides a little bit of support for this. */ #ifndef DATA_DICT_CLASS_H #define DATA_DICT_CLASS_H 1 /* Classes of variables. These values are bitwise disjoint so that they can be used in masks. */ enum dict_class { DC_ORDINARY = 0x0001, /* Ordinary identifier. */ DC_SYSTEM = 0x0002, /* System variable. */ DC_SCRATCH = 0x0004, /* Scratch variable. */ DC_ALL = 0x0007 /* All of the above. */ }; enum dict_class dict_class_from_id (const char *name); const char *dict_class_to_name (enum dict_class); #endif /* data/dict-class.h */ pspp-1.4.1/src/data/encrypted-file.c0000644000175000017500000003070713571051236016703 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2013, 2015 Free Software Foundation, Inc. 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 3 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, see . */ #include #include "data/encrypted-file.h" #include "data/file-handle-def.h" #include #include #include "data/file-name.h" #include "libpspp/assertion.h" #include "libpspp/cast.h" #include "libpspp/cmac-aes256.h" #include "libpspp/message.h" #include "libpspp/str.h" #include "gl/minmax.h" #include "gl/rijndael-alg-fst.h" #include "gl/xalloc.h" #include "gettext.h" #define _(msgid) gettext (msgid) struct encrypted_file { const struct file_handle *fh; FILE *file; int error; uint8_t ciphertext[256]; uint8_t plaintext[256]; unsigned int ofs, n, readable; uint32_t rk[4 * (RIJNDAEL_MAXNR + 1)]; int Nr; }; static bool decode_password (const char *input, char output[11]); static void fill_buffer (struct encrypted_file *); /* If FILENAME names an encrypted SPSS file, returns 1 and initializes *FP for further use by the caller. If FILENAME can be opened and read, but is not an encrypted SPSS file, returns 0. If FILENAME cannot be open or read, returns a negative errno value. */ int encrypted_file_open (struct encrypted_file **fp, const struct file_handle *fh) { struct encrypted_file *f; enum { HEADER_SIZE = 36 }; char data[HEADER_SIZE + sizeof f->ciphertext]; int retval; int n; f = xmalloc (sizeof *f); f->error = 0; f->fh = fh; f->file = fn_open (fh, "rb"); if (f->file == NULL) { msg (ME, _("An error occurred while opening `%s': %s."), fh_get_file_name (fh), strerror (errno)); retval = -errno; goto error; } n = fread (data, 1, sizeof data, f->file); if (n < HEADER_SIZE + 2 * 16) { int error = feof (f->file) ? 0 : errno; if (error) msg (ME, _("An error occurred while reading `%s': %s."), fh_get_file_name (fh), strerror (error)); retval = -error; goto error; } if (memcmp (data + 8, "ENCRYPTED", 9)) { retval = 0; goto error; } f->n = n - HEADER_SIZE; memcpy (f->ciphertext, data + HEADER_SIZE, f->n); f->ofs = 0; f->readable = 0; *fp = f; return 1; error: if (f->file) fn_close (fh, f->file); free (f); *fp = NULL; return retval; } /* Attempts to use PASSWORD, which may be a plaintext or "encrypted" password, to unlock F. Returns true if successful, otherwise false. */ bool encrypted_file_unlock (struct encrypted_file *f, const char *password) { char decoded_password[11]; return (encrypted_file_unlock__ (f, password) || (decode_password (password, decoded_password) && encrypted_file_unlock__ (f, decoded_password))); } /* Attempts to read N bytes of plaintext from F into BUF. Returns the number of bytes successfully read. A return value less than N may indicate end of file or an error; use encrypted_file_close() to distinguish. This function can only be used after encrypted_file_unlock() returns true. */ size_t encrypted_file_read (struct encrypted_file *f, void *buf_, size_t n) { uint8_t *buf = buf_; size_t ofs = 0; while (ofs < n) { unsigned int chunk = MIN (n - ofs, f->readable - f->ofs); if (chunk > 0) { memcpy (buf + ofs, &f->plaintext[f->ofs], chunk); ofs += chunk; f->ofs += chunk; } else { fill_buffer (f); if (!f->readable) break; } } return ofs; } /* Closes F. Returns 0 if no read errors occurred, otherwise a positive errno value. */ int encrypted_file_close (struct encrypted_file *f) { int error = f->error > 0 ? f->error : 0; if (fclose (f->file) == EOF && !error) error = errno; free (f); return error; } #define b(x) (1 << (x)) static const uint16_t m0[4][2] = { { b(2), b(2) | b(3) | b(6) | b(7) }, { b(3), b(0) | b(1) | b(4) | b(5) }, { b(4) | b(7), b(8) | b(9) | b(12) | b(14) }, { b(5) | b(6), b(10) | b(11) | b(14) | b(15) }, }; static const uint16_t m1[4][2] = { { b(0) | b(3) | b(12) | b(15), b(0) | b(1) | b(4) | b(5) }, { b(1) | b(2) | b(13) | b(14), b(2) | b(3) | b(6) | b(7) }, { b(4) | b(7) | b(8) | b(11), b(8) | b(9) | b(12) | b(13) }, { b(5) | b(6) | b(9) | b(10), b(10) | b(11) | b(14) | b(15) }, }; static const uint16_t m2[4][2] = { { b(2), b(1) | b(3) | b(9) | b(11) }, { b(3), b(0) | b(2) | b(8) | b(10) }, { b(4) | b(7), b(4) | b(6) | b(12) | b(14) }, { b(5) | b(6), b(5) | b(7) | b(13) | b(15) }, }; static const uint16_t m3[4][2] = { { b(0) | b(3) | b(12) | b(15), b(0) | b(2) | b(8) | b(10) }, { b(1) | b(2) | b(13) | b(14), b(1) | b(3) | b(9) | b(11) }, { b(4) | b(7) | b(8) | b(11), b(4) | b(6) | b(12) | b(14) }, { b(5) | b(6) | b(9) | b(10), b(5) | b(7) | b(13) | b(15) }, }; static int decode_nibble (const uint16_t table[4][2], int nibble) { int i; for (i = 0; i < 4; i++) if (table[i][0] & (1 << nibble)) return table[i][1]; return 0; } /* Returns true if X has exactly one 1-bit, false otherwise. */ static bool is_pow2 (int x) { return x && (x & (x - 1)) == 0; } /* If X has exactly one 1-bit, returns its index, where bit 0 is the LSB. Otherwise, returns 0. */ static int find_1bit (uint16_t x) { int i; if (!is_pow2 (x)) return -1; for (i = 0; i < 16; i++) if (x & (1u << i)) return i; abort (); } /* Attempts to decode a pair of encoded password characters A and B into a single byte of the plaintext password. Returns 0 if A and B are not a valid encoded password pair, otherwise a byte of the plaintext password. */ static int decode_password_2bytes (uint8_t a, uint8_t b) { int x = find_1bit (decode_nibble (m0, a >> 4) & decode_nibble (m2, b >> 4)); int y = find_1bit (decode_nibble (m1, a & 15) & decode_nibble (m3, b & 15)); return x < 0 || y < 0 ? 0 : (x << 4) | y; } /* Decodes an SPSS so-called "encrypted" password INPUT into OUTPUT. An encoded password is always an even number of bytes long and no longer than 20 bytes. A decoded password is never longer than 10 bytes plus a null terminator. Returns true if successful, otherwise false. */ static bool decode_password (const char *input, char output[11]) { size_t len; len = strlen (input); if (len > 20 || len % 2) return false; for (; *input; input += 2) { int c = decode_password_2bytes (input[0], input[1]); if (!c) return false; *output++ = c; } *output = '\0'; return true; } /* Check for magic number at beginning of plaintext decrypted from F. */ static bool is_good_magic (const struct encrypted_file *f) { char plaintext[16]; rijndaelDecrypt (f->rk, f->Nr, CHAR_CAST (const char *, f->ciphertext), plaintext); const struct substring magic[] = { ss_cstr ("$FL2@(#)"), ss_cstr ("$FL3@(#)"), ss_cstr ("* Encoding"), ss_buffer ("PK\3\4\x14\0\x8", 7) }; for (size_t i = 0; i < sizeof magic / sizeof *magic; i++) if (ss_equals (ss_buffer (plaintext, magic[i].length), magic[i])) return true; return false; } /* Attempts to use plaintext password PASSWORD to unlock F. Returns true if successful, otherwise false. */ bool encrypted_file_unlock__ (struct encrypted_file *f, const char *password) { /* NIST SP 800-108 fixed data. */ static const uint8_t fixed[] = { /* i */ 0x00, 0x00, 0x00, 0x01, /* label */ 0x35, 0x27, 0x13, 0xcc, 0x53, 0xa7, 0x78, 0x89, 0x87, 0x53, 0x22, 0x11, 0xd6, 0x5b, 0x31, 0x58, 0xdc, 0xfe, 0x2e, 0x7e, 0x94, 0xda, 0x2f, 0x00, 0xcc, 0x15, 0x71, 0x80, 0x0a, 0x6c, 0x63, 0x53, /* delimiter */ 0x00, /* context */ 0x38, 0xc3, 0x38, 0xac, 0x22, 0xf3, 0x63, 0x62, 0x0e, 0xce, 0x85, 0x3f, 0xb8, 0x07, 0x4c, 0x4e, 0x2b, 0x77, 0xc7, 0x21, 0xf5, 0x1a, 0x80, 0x1d, 0x67, 0xfb, 0xe1, 0xe1, 0x83, 0x07, 0xd8, 0x0d, /* L */ 0x00, 0x00, 0x01, 0x00, }; char padded_password[32]; size_t password_len; uint8_t cmac[16]; uint8_t key[32]; /* Truncate password to at most 10 bytes. */ password_len = strlen (password); if (password_len > 10) password_len = 10; /* padded_password = password padded with zeros to 32 bytes. */ memset (padded_password, 0, sizeof padded_password); memcpy (padded_password, password, password_len); /* cmac = CMAC(padded_password, fixed). */ cmac_aes256 (CHAR_CAST (const uint8_t *, padded_password), fixed, sizeof fixed, cmac); /* The key is the cmac repeated twice. */ memcpy(key, cmac, 16); memcpy(key + 16, cmac, 16); /* Use key to initialize AES. */ assert (sizeof key == 32); f->Nr = rijndaelKeySetupDec (f->rk, CHAR_CAST (const char *, key), 256); if (!is_good_magic (f)) return false; fill_buffer (f); return true; } /* Checks the 16 bytes of PLAINTEXT for PKCS#7 padding bytes. Returns the number of padding bytes (between 1 and 16, inclusive), if well formed, otherwise 0. */ static int check_padding (const uint8_t *plaintext) { uint8_t pad = plaintext[15]; if (pad < 1 || pad > 16) return 0; for (size_t i = 1; i < pad; i++) if (plaintext[15 - i] != pad) return 0; return pad; } static void fill_buffer (struct encrypted_file *f) { /* Move bytes between f->ciphertext[f->readable] and f->ciphertext[f->n] to the beginning of f->ciphertext. The first time this is called for a given file, it does nothing because f->readable is initially 0. After that, in steady state f->readable is 16 less than f->n, so the final 16 bytes of ciphertext become the first 16 bytes. This is necessary because we don't know until we hit end-of-file whether padding in the last 16 bytes will require us to discard up to 16 bytes of data. */ memmove (f->ciphertext, f->ciphertext + f->readable, f->n - f->readable); f->n -= f->readable; f->readable = 0; f->ofs = 0; if (f->error) /* or assert(!f->error)? */ return; /* Read new ciphernext, extending f->n, until we've filled up f->ciphertext or until we reach end-of-file or encounter an error. Afterward, f->error indicates what happened. */ while (f->n < sizeof f->ciphertext) { size_t retval = fread (f->ciphertext + f->n, 1, sizeof f->ciphertext - f->n, f->file); if (!retval) { f->error = ferror (f->file) ? errno : EOF; break; } f->n += retval; } /* Calculate the number of readable bytes. If we're at the end of the file, then we can read everything, otherwise we hold back the last 16 bytes because they might be padding or not. */ if (!f->error) { assert (f->n == sizeof f->ciphertext); f->readable = f->n - 16; } else f->readable = f->n; /* If we have an incomplete block then trim it off and complain. */ unsigned int overhang = f->readable % 16; if (overhang) { assert (f->error); msg (ME, _("%s: encrypted file corrupted (ends in incomplete %u-byte " "ciphertext block)"), fh_get_file_name (f->fh), overhang); f->error = EIO; f->readable -= overhang; } /* Decrypt all the blocks we have. */ for (size_t ofs = 0; ofs < f->readable; ofs += 16) rijndaelDecrypt (f->rk, f->Nr, CHAR_CAST (const char *, f->ciphertext + ofs), CHAR_CAST (char *, f->plaintext + ofs)); /* If we're at end of file then check the padding and trim it off. */ if (f->error == EOF) { unsigned int pad = check_padding (&f->plaintext[f->n - 16]); if (!pad) { msg (ME, _("%s: encrypted file corrupted (ends with bad padding)"), fh_get_file_name (f->fh)); f->error = EIO; return; } f->readable -= pad; } } pspp-1.4.1/src/data/casewriter-translator.c0000644000175000017500000000740513320146056020324 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2007, 2009, 2011 Free Software Foundation, Inc. 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 3 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, see . */ #include #include "data/casewriter.h" #include "data/casewriter-provider.h" #include #include "libpspp/taint.h" #include "gl/xalloc.h" struct casewriter_translator { struct casewriter *subwriter; struct ccase *(*translate) (struct ccase *, void *aux); bool (*destroy) (void *aux); void *aux; }; static const struct casewriter_class casewriter_translator_class; /* Creates and returns a new casewriter whose cases are passed through TRANSLATE, based on INPUT and auxiliary data AUX. (TRANSLATE may also return a null pointer, in which case no case is written to the output.) The translated cases are then written to SUBWRITER. The cases returned by TRANSLATE must match OUTPUT_PROTO. TRANSLATE takes ownership of each case passed to it. Thus, it should either unref each case and return a new case, or (unshare and then) modify and return the same case. When the translating casewriter is destroyed, DESTROY will be called to allow any state maintained by TRANSLATE to be freed. After this function is called, SUBWRITER must not ever again be referenced directly. It will be destroyed automatically when the translating casewriter is destroyed. */ struct casewriter * casewriter_create_translator (struct casewriter *subwriter, const struct caseproto *translated_proto, struct ccase *(*translate) (struct ccase *, void *aux), bool (*destroy) (void *aux), void *aux) { struct casewriter_translator *ct = xmalloc (sizeof *ct); struct casewriter *writer; ct->subwriter = casewriter_rename (subwriter); ct->translate = translate; ct->destroy = destroy; ct->aux = aux; writer = casewriter_create (translated_proto, &casewriter_translator_class, ct); taint_propagate (casewriter_get_taint (ct->subwriter), casewriter_get_taint (writer)); return writer; } static void casewriter_translator_write (struct casewriter *writer UNUSED, void *ct_, struct ccase *c) { struct casewriter_translator *ct = ct_; c = ct->translate (c, ct->aux); if (c != NULL) casewriter_write (ct->subwriter, c); } static void casewriter_translator_destroy (struct casewriter *writer UNUSED, void *ct_) { struct casewriter_translator *ct = ct_; casewriter_destroy (ct->subwriter); ct->destroy (ct->aux); free (ct); } static struct casereader * casewriter_translator_convert_to_reader (struct casewriter *writer UNUSED, void *ct_) { struct casewriter_translator *ct = ct_; struct casereader *reader = casewriter_make_reader (ct->subwriter); free (ct); ct->destroy (ct->aux); return reader; } static const struct casewriter_class casewriter_translator_class = { casewriter_translator_write, casewriter_translator_destroy, casewriter_translator_convert_to_reader, }; pspp-1.4.1/src/data/psql-reader.c0000644000175000017500000004327413670210420016203 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2008, 2009, 2010, 2011, 2012 Free Software Foundation, Inc. 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 3 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, see . */ #include #include "data/psql-reader.h" #include #include #include #include "data/calendar.h" #include "data/casereader-provider.h" #include "data/dictionary.h" #include "data/format.h" #include "data/variable.h" #include "libpspp/i18n.h" #include "libpspp/message.h" #include "libpspp/misc.h" #include "libpspp/str.h" #include "gl/c-strcase.h" #include "gl/minmax.h" #include "gl/xalloc.h" #include "gettext.h" #define _(msgid) gettext (msgid) #define N_(msgid) (msgid) #if !PSQL_SUPPORT struct casereader * psql_open_reader (struct psql_read_info *info UNUSED, struct dictionary **dict UNUSED) { msg (ME, _("Support for reading postgres databases was not compiled into this installation of PSPP")); return NULL; } #else #include #include /* Default width of string variables. */ #define PSQL_DEFAULT_WIDTH 8 /* These macros must be the same as in catalog/pg_types.h from the postgres source */ #define BOOLOID 16 #define BYTEAOID 17 #define CHAROID 18 #define NAMEOID 19 #define INT8OID 20 #define INT2OID 21 #define INT4OID 23 #define TEXTOID 25 #define OIDOID 26 #define FLOAT4OID 700 #define FLOAT8OID 701 #define CASHOID 790 #define BPCHAROID 1042 #define VARCHAROID 1043 #define DATEOID 1082 #define TIMEOID 1083 #define TIMESTAMPOID 1114 #define TIMESTAMPTZOID 1184 #define INTERVALOID 1186 #define TIMETZOID 1266 #define NUMERICOID 1700 static void psql_casereader_destroy (struct casereader *reader UNUSED, void *r_); static struct ccase *psql_casereader_read (struct casereader *, void *); static const struct casereader_class psql_casereader_class = { psql_casereader_read, psql_casereader_destroy, NULL, NULL, }; struct psql_reader { PGconn *conn; PGresult *res; int tuple; bool integer_datetimes; double postgres_epoch; struct caseproto *proto; struct dictionary *dict; /* An array of ints, which maps psql column numbers into pspp variables */ struct variable **vmap; size_t vmapsize; struct string fetch_cmd; int cache_size; }; static struct ccase *set_value (struct psql_reader *r); #if WORDS_BIGENDIAN static void data_to_native (const void *in_, void *out_, int len) { int i; const unsigned char *in = in_; unsigned char *out = out_; for (i = 0 ; i < len ; ++i) out[i] = in[i]; } #else static void data_to_native (const void *in_, void *out_, int len) { int i; const unsigned char *in = in_; unsigned char *out = out_; for (i = 0 ; i < len ; ++i) out[len - i - 1] = in[i]; } #endif #define GET_VALUE(IN, OUT) do { \ size_t sz = sizeof (OUT); \ data_to_native (*(IN), &(OUT), sz) ; \ (*IN) += sz; \ } while (false) #if 0 static void dump (const unsigned char *x, int l) { int i; for (i = 0; i < l ; ++i) { printf ("%02x ", x[i]); } putchar ('\n'); for (i = 0; i < l ; ++i) { if (isprint (x[i])) printf ("%c ", x[i]); else printf (" "); } putchar ('\n'); } #endif static struct variable * create_var (struct psql_reader *r, const struct fmt_spec *fmt, int width, const char *suggested_name, int col) { unsigned long int vx = 0; struct variable *var; char *name; name = dict_make_unique_var_name (r->dict, suggested_name, &vx); var = dict_create_var (r->dict, name, width); free (name); var_set_both_formats (var, fmt); if (col != -1) { r->vmap = xrealloc (r->vmap, (col + 1) * sizeof (*r->vmap)); r->vmap[col] = var; r->vmapsize = col + 1; } return var; } /* Fill the cache */ static bool reload_cache (struct psql_reader *r) { PQclear (r->res); r->tuple = 0; r->res = PQexec (r->conn, ds_cstr (&r->fetch_cmd)); if (PQresultStatus (r->res) != PGRES_TUPLES_OK || PQntuples (r->res) < 1) { PQclear (r->res); r->res = NULL; return false; } return true; } struct casereader * psql_open_reader (struct psql_read_info *info, struct dictionary **dict) { int i; int n_fields, n_tuples; PGresult *qres = NULL; casenumber n_cases = CASENUMBER_MAX; const char *encoding; struct psql_reader *r = xzalloc (sizeof *r); struct string query ; r->conn = PQconnectdb (info->conninfo); if (NULL == r->conn) { msg (ME, _("Memory error whilst opening psql source")); goto error; } if (PQstatus (r->conn) != CONNECTION_OK) { msg (ME, _("Error opening psql source: %s."), PQerrorMessage (r->conn)); goto error; } { int ver_num = 0; const char *vers = PQparameterStatus (r->conn, "server_version"); sscanf (vers, "%d", &ver_num); if (ver_num < 8) { msg (ME, _("Postgres server is version %s." " Reading from versions earlier than 8.0 is not supported."), vers); goto error; } } { const char *dt = PQparameterStatus (r->conn, "integer_datetimes"); r->integer_datetimes = (0 == c_strcasecmp (dt, "on")); } #if USE_SSL if (PQgetssl (r->conn) == NULL) #endif { if (! info->allow_clear) { msg (ME, _("Connection is unencrypted, " "but unencrypted connections have not been permitted.")); goto error; } } r->postgres_epoch = calendar_gregorian_to_offset (2000, 1, 1, NULL); { const int enc = PQclientEncoding (r->conn); /* According to section 22.2 of the Postgresql manual a value of zero (SQL_ASCII) indicates "a declaration of ignorance about the encoding". Accordingly, we use the default encoding if we find this value. */ encoding = enc ? pg_encoding_to_char (enc) : get_default_encoding (); /* Create the dictionary and populate it */ *dict = r->dict = dict_create (encoding); } const int version = PQserverVersion (r->conn); ds_init_empty (&query); /* Versions before 9.1 don't have the REPEATABLE READ isolation level. However according to if the server is in the "hot standby" mode then SERIALIZABLE won't work. */ ds_put_c_format (&query, "BEGIN READ ONLY ISOLATION LEVEL %s; " "DECLARE pspp BINARY CURSOR FOR ", (version < 90100) ? "SERIALIZABLE" : "REPEATABLE READ"); ds_put_substring (&query, info->sql.ss); qres = PQexec (r->conn, ds_cstr (&query)); ds_destroy (&query); if (PQresultStatus (qres) != PGRES_COMMAND_OK) { msg (ME, _("Error from psql source: %s."), PQresultErrorMessage (qres)); goto error; } PQclear (qres); /* Now use the count() function to find the total number of cases that this query returns. Doing this incurs some overhead. The server has to iterate every case in order to find this number. However, it's performed on the server side, and in all except the most huge databases the extra overhead will be worth the effort. On the other hand, most PSPP functions don't need to know this. The GUI is the notable exception. */ ds_init_cstr (&query, "SELECT count (*) FROM ("); ds_put_substring (&query, info->sql.ss); ds_put_cstr (&query, ") stupid_sql_standard"); qres = PQexec (r->conn, ds_cstr (&query)); ds_destroy (&query); if (PQresultStatus (qres) != PGRES_TUPLES_OK) { msg (ME, _("Error from psql source: %s."), PQresultErrorMessage (qres)); goto error; } n_cases = atol (PQgetvalue (qres, 0, 0)); PQclear (qres); qres = PQexec (r->conn, "FETCH FIRST FROM pspp"); if (PQresultStatus (qres) != PGRES_TUPLES_OK) { msg (ME, _("Error from psql source: %s."), PQresultErrorMessage (qres)); goto error; } n_tuples = PQntuples (qres); n_fields = PQnfields (qres); r->proto = NULL; r->vmap = NULL; r->vmapsize = 0; for (i = 0 ; i < n_fields ; ++i) { struct variable *var; struct fmt_spec fmt = {FMT_F, 8, 2}; Oid type = PQftype (qres, i); int width = 0; int length ; /* If there are no data then make a finger in the air guess at the contents */ if (n_tuples > 0) length = PQgetlength (qres, 0, i); else length = PSQL_DEFAULT_WIDTH; switch (type) { case BOOLOID: case OIDOID: case INT2OID: case INT4OID: case INT8OID: case FLOAT4OID: case FLOAT8OID: fmt.type = FMT_F; break; case CASHOID: fmt.type = FMT_DOLLAR; break; case CHAROID: fmt.type = FMT_A; width = length > 0 ? length : 1; fmt.d = 0; fmt.w = 1; break; case TEXTOID: case VARCHAROID: case BPCHAROID: fmt.type = FMT_A; width = (info->str_width == -1) ? ROUND_UP (length, PSQL_DEFAULT_WIDTH) : info->str_width; fmt.w = width; fmt.d = 0; break; case BYTEAOID: fmt.type = FMT_AHEX; width = length > 0 ? length : PSQL_DEFAULT_WIDTH; fmt.w = width * 2; fmt.d = 0; break; case INTERVALOID: fmt.type = FMT_DTIME; width = 0; fmt.d = 0; fmt.w = 13; break; case DATEOID: fmt.type = FMT_DATE; width = 0; fmt.w = 11; fmt.d = 0; break; case TIMEOID: case TIMETZOID: fmt.type = FMT_TIME; width = 0; fmt.w = 11; fmt.d = 0; break; case TIMESTAMPOID: case TIMESTAMPTZOID: fmt.type = FMT_DATETIME; fmt.d = 0; fmt.w = 22; width = 0; break; case NUMERICOID: fmt.type = FMT_E; fmt.d = 2; fmt.w = 40; width = 0; break; default: msg (MW, _("Unsupported OID %d. SYSMIS values will be inserted."), type); fmt.type = FMT_A; width = length > 0 ? length : PSQL_DEFAULT_WIDTH; fmt.w = width ; fmt.d = 0; break; } if (width == 0 && fmt_is_string (fmt.type)) fmt.w = width = PSQL_DEFAULT_WIDTH; var = create_var (r, &fmt, width, PQfname (qres, i), i); if (type == NUMERICOID && n_tuples > 0) { const uint8_t *vptr = (const uint8_t *) PQgetvalue (qres, 0, i); struct fmt_spec fmt; int16_t n_digits, weight, dscale; uint16_t sign; GET_VALUE (&vptr, n_digits); GET_VALUE (&vptr, weight); GET_VALUE (&vptr, sign); GET_VALUE (&vptr, dscale); fmt.d = dscale; fmt.type = FMT_E; fmt.w = fmt_max_output_width (fmt.type) ; fmt.d = MIN (dscale, fmt_max_output_decimals (fmt.type, fmt.w)); var_set_both_formats (var, &fmt); } /* Timezones need an extra variable */ switch (type) { case TIMETZOID: { struct string name; ds_init_cstr (&name, var_get_name (var)); ds_put_cstr (&name, "-zone"); fmt.type = FMT_F; fmt.w = 8; fmt.d = 2; create_var (r, &fmt, 0, ds_cstr (&name), -1); ds_destroy (&name); } break; case INTERVALOID: { struct string name; ds_init_cstr (&name, var_get_name (var)); ds_put_cstr (&name, "-months"); fmt.type = FMT_F; fmt.w = 3; fmt.d = 0; create_var (r, &fmt, 0, ds_cstr (&name), -1); ds_destroy (&name); } default: break; } } PQclear (qres); qres = PQexec (r->conn, "MOVE BACKWARD 1 FROM pspp"); if (PQresultStatus (qres) != PGRES_COMMAND_OK) { PQclear (qres); goto error; } PQclear (qres); r->cache_size = info->bsize != -1 ? info->bsize: 4096; ds_init_empty (&r->fetch_cmd); ds_put_format (&r->fetch_cmd, "FETCH FORWARD %d FROM pspp", r->cache_size); reload_cache (r); r->proto = caseproto_ref (dict_get_proto (*dict)); return casereader_create_sequential (NULL, r->proto, n_cases, &psql_casereader_class, r); error: dict_unref (*dict); psql_casereader_destroy (NULL, r); return NULL; } static void psql_casereader_destroy (struct casereader *reader UNUSED, void *r_) { struct psql_reader *r = r_; if (r == NULL) return ; ds_destroy (&r->fetch_cmd); free (r->vmap); if (r->res) PQclear (r->res); PQfinish (r->conn); caseproto_unref (r->proto); free (r); } static struct ccase * psql_casereader_read (struct casereader *reader UNUSED, void *r_) { struct psql_reader *r = r_; if (NULL == r->res || r->tuple >= r->cache_size) { if (! reload_cache (r)) return false; } return set_value (r); } static struct ccase * set_value (struct psql_reader *r) { struct ccase *c; int n_vars; int i; assert (r->res); n_vars = PQnfields (r->res); if (r->tuple >= PQntuples (r->res)) return NULL; c = case_create (r->proto); case_set_missing (c); for (i = 0 ; i < n_vars ; ++i) { Oid type = PQftype (r->res, i); const struct variable *v = r->vmap[i]; union value *val = case_data_rw (c, v); union value *val1 = NULL; switch (type) { case INTERVALOID: case TIMESTAMPTZOID: case TIMETZOID: if (i < r->vmapsize && var_get_dict_index(v) + 1 < dict_get_var_cnt (r->dict)) { const struct variable *v1 = NULL; v1 = dict_get_var (r->dict, var_get_dict_index (v) + 1); val1 = case_data_rw (c, v1); } break; default: break; } if (PQgetisnull (r->res, r->tuple, i)) { value_set_missing (val, var_get_width (v)); switch (type) { case INTERVALOID: case TIMESTAMPTZOID: case TIMETZOID: val1->f = SYSMIS; break; default: break; } } else { const uint8_t *vptr = (const uint8_t *) PQgetvalue (r->res, r->tuple, i); int length = PQgetlength (r->res, r->tuple, i); int var_width = var_get_width (v); switch (type) { case BOOLOID: { int8_t x; GET_VALUE (&vptr, x); val->f = x; } break; case OIDOID: case INT2OID: { int16_t x; GET_VALUE (&vptr, x); val->f = x; } break; case INT4OID: { int32_t x; GET_VALUE (&vptr, x); val->f = x; } break; case INT8OID: { int64_t x; GET_VALUE (&vptr, x); val->f = x; } break; case FLOAT4OID: { float n; GET_VALUE (&vptr, n); val->f = n; } break; case FLOAT8OID: { double n; GET_VALUE (&vptr, n); val->f = n; } break; case CASHOID: { /* Postgres 8.3 uses 64 bits. Earlier versions use 32 */ switch (length) { case 8: { int64_t x; GET_VALUE (&vptr, x); val->f = x / 100.0; } break; case 4: { int32_t x; GET_VALUE (&vptr, x); val->f = x / 100.0; } break; default: val->f = SYSMIS; break; } } break; case INTERVALOID: { if (r->integer_datetimes) { uint32_t months; uint32_t days; uint32_t us; uint32_t things; GET_VALUE (&vptr, things); GET_VALUE (&vptr, us); GET_VALUE (&vptr, days); GET_VALUE (&vptr, months); val->f = us / 1000000.0; val->f += days * 24 * 3600; val1->f = months; } else { uint32_t days, months; double seconds; GET_VALUE (&vptr, seconds); GET_VALUE (&vptr, days); GET_VALUE (&vptr, months); val->f = seconds; val->f += days * 24 * 3600; val1->f = months; } } break; case DATEOID: { int32_t x; GET_VALUE (&vptr, x); val->f = (x + r->postgres_epoch) * 24 * 3600 ; } break; case TIMEOID: { if (r->integer_datetimes) { uint64_t x; GET_VALUE (&vptr, x); val->f = x / 1000000.0; } else { double x; GET_VALUE (&vptr, x); val->f = x; } } break; case TIMETZOID: { int32_t zone; if (r->integer_datetimes) { uint64_t x; GET_VALUE (&vptr, x); val->f = x / 1000000.0; } else { double x; GET_VALUE (&vptr, x); val->f = x ; } GET_VALUE (&vptr, zone); val1->f = zone / 3600.0; } break; case TIMESTAMPOID: case TIMESTAMPTZOID: { if (r->integer_datetimes) { int64_t x; GET_VALUE (&vptr, x); x /= 1000000; val->f = (x + r->postgres_epoch * 24 * 3600); } else { double x; GET_VALUE (&vptr, x); val->f = (x + r->postgres_epoch * 24 * 3600); } } break; case TEXTOID: case VARCHAROID: case BPCHAROID: case BYTEAOID: memcpy (val->s, vptr, MIN (length, var_width)); break; case NUMERICOID: { double f = 0.0; int i; int16_t n_digits, weight, dscale; uint16_t sign; GET_VALUE (&vptr, n_digits); GET_VALUE (&vptr, weight); GET_VALUE (&vptr, sign); GET_VALUE (&vptr, dscale); #if 0 { struct fmt_spec fmt; fmt.d = dscale; fmt.type = FMT_E; fmt.w = fmt_max_output_width (fmt.type) ; fmt.d = MIN (dscale, fmt_max_output_decimals (fmt.type, fmt.w)); var_set_both_formats (v, &fmt); } #endif for (i = 0 ; i < n_digits; ++i) { uint16_t x; GET_VALUE (&vptr, x); f += x * pow (10000, weight--); } if (sign == 0x4000) f *= -1.0; if (sign == 0xC000) val->f = SYSMIS; else val->f = f; } break; default: val->f = SYSMIS; break; } } } r->tuple++; return c; } #endif pspp-1.4.1/src/data/dataset-writer.c0000644000175000017500000001016313360714656016732 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2006, 2009-2011 Free Software Foundation, Inc. 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 3 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, see . */ #include #include "data/dataset-writer.h" #include #include "data/case.h" #include "data/case-map.h" #include "data/casereader.h" #include "data/casewriter-provider.h" #include "data/casewriter.h" #include "data/dataset.h" #include "data/dictionary.h" #include "data/file-handle-def.h" #include "data/variable.h" #include "libpspp/compiler.h" #include "libpspp/taint.h" #include "gl/xalloc.h" #define N_(msgid) (msgid) /* A dataset file writer. */ struct dataset_writer { struct dataset *ds; /* Underlying dataset. */ struct fh_lock *lock; /* Exclusive access to file handle. */ struct dictionary *dict; /* Dictionary for subwriter. */ struct case_map *compactor; /* Compacts into dictionary. */ struct casewriter *subwriter; /* Data output. */ }; static const struct casewriter_class dataset_writer_casewriter_class; /* Opens FH, which must have referent type FH_REF_DATASET, and returns a dataset_writer for it, or a null pointer on failure. Cases stored in the dataset_writer will be expected to be drawn from DICTIONARY. */ struct casewriter * dataset_writer_open (struct file_handle *fh, const struct dictionary *dictionary) { struct dataset_writer *writer; struct casewriter *casewriter; struct fh_lock *lock; /* Get exclusive write access to handle. */ /* TRANSLATORS: this fragment will be interpolated into messages in fh_lock() that identify types of files. */ lock = fh_lock (fh, FH_REF_DATASET, N_("dataset"), FH_ACC_WRITE, true); if (lock == NULL) return NULL; /* Create writer. */ writer = xmalloc (sizeof *writer); writer->lock = lock; writer->ds = fh_get_dataset (fh); writer->dict = dict_clone (dictionary); dict_delete_scratch_vars (writer->dict); if (dict_count_values (writer->dict, 0) < dict_get_next_value_idx (writer->dict)) { writer->compactor = case_map_to_compact_dict (writer->dict, 0); dict_compact_values (writer->dict); } else writer->compactor = NULL; writer->subwriter = autopaging_writer_create (dict_get_proto (writer->dict)); casewriter = casewriter_create (dict_get_proto (writer->dict), &dataset_writer_casewriter_class, writer); taint_propagate (casewriter_get_taint (writer->subwriter), casewriter_get_taint (casewriter)); return casewriter; } /* Writes case C to WRITER. */ static void dataset_writer_casewriter_write (struct casewriter *w UNUSED, void *writer_, struct ccase *c) { struct dataset_writer *writer = writer_; casewriter_write (writer->subwriter, case_map_execute (writer->compactor, c)); } /* Closes WRITER. */ static void dataset_writer_casewriter_destroy (struct casewriter *w UNUSED, void *writer_) { struct dataset_writer *writer = writer_; struct casereader *reader = casewriter_make_reader (writer->subwriter); if (!casereader_error (reader)) { dataset_set_dict (writer->ds, writer->dict); dataset_set_source (writer->ds, reader); } else { casereader_destroy (reader); dict_unref (writer->dict); } fh_unlock (writer->lock); free (writer); } static const struct casewriter_class dataset_writer_casewriter_class = { dataset_writer_casewriter_write, dataset_writer_casewriter_destroy, NULL, }; pspp-1.4.1/src/data/dict-class.c0000644000175000017500000000313113320146056016003 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2007, 2011 Free Software Foundation, Inc. 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 3 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, see . */ #include #include "data/dict-class.h" #include "libpspp/assertion.h" #include "gettext.h" #define _(msgid) gettext (msgid) /* Returns the dictionary class corresponding to a variable named NAME. */ enum dict_class dict_class_from_id (const char *name) { switch (name[0]) { default: return DC_ORDINARY; case '$': return DC_SYSTEM; case '#': return DC_SCRATCH; } } /* Returns the name of dictionary class DICT_CLASS. This function should probably not be used in new code as it can lead to difficulties for internationalization. */ const char * dict_class_to_name (enum dict_class dict_class) { switch (dict_class) { case DC_ORDINARY: return _("ordinary"); case DC_SYSTEM: return _("system"); case DC_SCRATCH: return _("scratch"); default: NOT_REACHED (); } } pspp-1.4.1/src/data/value.c0000644000175000017500000002036013723235332015077 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 1997-9, 2000, 2009, 2010, 2011, 2012 Free Software Foundation, Inc. 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 3 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, see . */ #include #include "data/value.h" #include "data/val-type.h" #include "data/variable.h" #include "libpspp/hash-functions.h" #include "libpspp/pool.h" #include "libpspp/str.h" #include "gl/unistr.h" #include "gl/minmax.h" #include "gl/xalloc.h" /* Copies the contents of string value SRC with width SRC_WIDTH to string value DST with width DST_WIDTH. If SRC_WIDTH is greater than DST_WIDTH, then only the first DST_WIDTH bytes are copied; if DST_WIDTH is greater than SRC_WIDTH, then DST is padded on the right with PAD bytes. SRC and DST must be string values; that is, SRC_WIDTH and DST_WIDTH must both be positive. It is important that SRC_WIDTH and DST_WIDTH be the actual widths with which SRC and DST were initialized. Passing, e.g., smaller values in order to copy only a prefix of SRC or modify only a prefix of DST will not work in every case. */ void value_copy_rpad (union value *dst, int dst_width, const union value *src, int src_width, char pad) { u8_buf_copy_rpad (dst->s, dst_width, src->s, src_width, pad); } /* Copies the contents of null-terminated string SRC to string value DST with width DST_WIDTH. If SRC is more than DST_WIDTH bytes long, then only the first DST_WIDTH bytes are copied; if DST_WIDTH is greater than the length of SRC, then DST is padded on the right with PAD bytes. DST must be a string value; that is, DST_WIDTH must be positive. It is important that DST_WIDTH be the actual width with which DST was initialized. Passing, e.g., a smaller value in order to modify only a prefix of DST will not work in every case. */ void value_copy_str_rpad (union value *dst, int dst_width, const uint8_t *src, char pad) { value_copy_buf_rpad (dst, dst_width, src, u8_strlen (src), pad); } /* Copies the SRC_LEN bytes at SRC to string value DST with width DST_WIDTH. If SRC_LEN is greater than DST_WIDTH, then only the first DST_WIDTH bytes are copied; if DST_WIDTH is greater than SRC_LEN, then DST is padded on the right with PAD bytes. DST must be a string value; that is, DST_WIDTH must be positive. It is important that DST_WIDTH be the actual width with which DST was initialized. Passing, e.g., a smaller value in order to modify only a prefix of DST will not work in every case. */ void value_copy_buf_rpad (union value *dst, int dst_width, const uint8_t *src, size_t src_len, char pad) { u8_buf_copy_rpad (dst->s, dst_width, src, src_len, pad); } /* Sets V to the system-missing value for data of the given WIDTH. */ void value_set_missing (union value *v, int width) { if (width != -1) { if (width == 0) v->f = SYSMIS; else memset (v->s, ' ', width); } } /* Compares A and B, which both have the given WIDTH, and returns a strcmp()-type result. */ int value_compare_3way (const union value *a, const union value *b, int width) { return (width == -1 ? 0 : width == 0 ? (a->f < b->f ? -1 : a->f > b->f) : memcmp (a->s, b->s, width)); } /* Returns true if A and B, which must both have the given WIDTH, have equal contents, false if their contents differ. */ bool value_equal (const union value *a, const union value *b, int width) { return (width == -1 ? true : width == 0 ? a->f == b->f : !memcmp (a->s, b->s, width)); } /* Returns a hash of the data in VALUE, which must have the given WIDTH, folding BASIS into the hash value calculation. */ unsigned int value_hash (const union value *value, int width, unsigned int basis) { return (width == -1 ? basis : width == 0 ? hash_double (value->f, basis) : hash_bytes (value->s, width, basis)); } /* Tests whether VALUE may be resized from OLD_WIDTH to NEW_WIDTH, using the following rules that match those for resizing missing values and value labels. First, OLD_WIDTH and NEW_WIDTH must be both numeric or both string. Second, if NEW_WIDTH is less than OLD_WIDTH, then the bytes that would be trimmed off the right end of VALUE must be all spaces. */ bool value_is_resizable (const union value *value, int old_width, int new_width) { if (old_width == new_width) return true; else if (val_type_from_width (old_width) != val_type_from_width (new_width)) return false; else { const uint8_t *str = value->s; int i; for (i = new_width; i < old_width; i++) if (str[i] != ' ') return false; return true; } } /* Resizes VALUE from OLD_WIDTH to NEW_WIDTH. The arguments must satisfy the rules specified above for value_is_resizable. */ void value_resize (union value *value, int old_width, int new_width) { assert (value_is_resizable (value, old_width, new_width)); if (new_width != old_width && new_width > 0) { union value tmp; value_init (&tmp, new_width); value_copy_rpad (&tmp, new_width, value, old_width, ' '); value_destroy (value, old_width); *value = tmp; } } /* Returns true if VALUE, with the given WIDTH, is all spaces, false otherwise. Returns false if VALUE is numeric. */ bool value_is_spaces (const union value *value, int width) { int i; for (i = 0; i < width; i++) if (value->s[i] != ' ') return false; return true; } /* Returns true if resizing a value from OLD_WIDTH to NEW_WIDTH actually changes anything, false otherwise. If false is returned, calls to value_resize() with the specified parameters may be omitted without any ill effects. This is generally useful only if many values can skip being resized from OLD_WIDTH to NEW_WIDTH. Otherwise you might as well just call value_resize directly. */ bool value_needs_resize (int old_width, int new_width) { assert (val_type_from_width (old_width) == val_type_from_width (new_width)); return old_width != new_width; } /* Same as value_init, except that memory for VALUE (if necessary) is allocated from POOL and will be freed automatically when POOL is destroyed. VALUE must not be freed manually by calling value_destroy. If it needs to be resized, it must be done using value_resize_pool instead of value_resize. */ void value_init_pool (struct pool *pool, union value *value, int width) { if (width > 0) value->s = pool_alloc_unaligned (pool, width); } /* Same as value_clone(), except that memory for VALUE (if necessary) is allocated from POOL and will be freed automatically when POOL is destroyed. VALUE must not be freed manually by calling value_destroy(). If it needs to be resized, it must be done using value_resize_pool() instead of value_resize(). */ void value_clone_pool (struct pool *pool, union value *value, const union value *src, int width) { if (width > 0) value->s = pool_clone_unaligned (pool, src->s, width); else value->f = src->f; } /* Same as value_resize, except that VALUE must have been allocated from POOL using value_init_pool. This function causes some memory in POOL to be wasted in some cases (until the pool is freed), so it should only be done if this is acceptable. */ void value_resize_pool (struct pool *pool, union value *value, int old_width, int new_width) { assert (value_is_resizable (value, old_width, new_width)); if (new_width > old_width) { uint8_t *new_string = pool_alloc_unaligned (pool, new_width); memcpy (new_string, value->s, old_width); value->s = new_string; memset (value->s + old_width, ' ', new_width - old_width); } } pspp-1.4.1/src/data/dataset.c0000644000175000017500000006667413700645725015440 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 1997-9, 2000, 2006, 2007, 2009, 2010, 2011, 2013 Free Software Foundation, Inc. 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 3 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, see . */ #include #include "data/dataset.h" #include #include #include #include #include "data/case.h" #include "data/case-map.h" #include "data/caseinit.h" #include "data/casereader.h" #include "data/casereader-provider.h" #include "data/casereader-shim.h" #include "data/casewriter.h" #include "data/dictionary.h" #include "data/file-handle-def.h" #include "data/session.h" #include "data/transformations.h" #include "data/variable.h" #include "libpspp/deque.h" #include "libpspp/misc.h" #include "libpspp/str.h" #include "libpspp/taint.h" #include "libpspp/i18n.h" #include "gl/minmax.h" #include "gl/xalloc.h" struct dataset { /* A dataset is usually part of a session. Within a session its name must unique. The name must either be a valid PSPP identifier or the empty string. (It must be unique within the session even if it is the empty string; that is, there may only be a single dataset within a session with the empty string as its name.) */ struct session *session; char *name; enum dataset_display display; /* Cases are read from source, their transformation variables are initialized, pass through permanent_trns_chain (which transforms them into the format described by permanent_dict), are written to sink, pass through temporary_trns_chain (which transforms them into the format described by dict), and are finally passed to the procedure. */ struct casereader *source; struct caseinit *caseinit; struct trns_chain *permanent_trns_chain; struct dictionary *permanent_dict; struct casewriter *sink; struct trns_chain *temporary_trns_chain; struct dictionary *dict; /* If true, cases are discarded instead of being written to sink. */ bool discard_output; /* The transformation chain that the next transformation will be added to. */ struct trns_chain *cur_trns_chain; /* The case map used to compact a case, if necessary; otherwise a null pointer. */ struct case_map *compactor; /* Time at which proc was last invoked. */ time_t last_proc_invocation; /* Cases just before ("lagging") the current one. */ int n_lag; /* Number of cases to lag. */ struct deque lag; /* Deque of lagged cases. */ struct ccase **lag_cases; /* Lagged cases managed by deque. */ /* Procedure data. */ enum { PROC_COMMITTED, /* No procedure in progress. */ PROC_OPEN, /* proc_open called, casereader still open. */ PROC_CLOSED /* casereader from proc_open destroyed, but proc_commit not yet called. */ } proc_state; casenumber cases_written; /* Cases output so far. */ bool ok; /* Error status. */ struct casereader_shim *shim; /* Shim on proc_open() casereader. */ const struct dataset_callbacks *callbacks; void *cb_data; /* Uniquely distinguishes datasets. */ unsigned int seqno; }; static void dataset_changed__ (struct dataset *); static void dataset_transformations_changed__ (struct dataset *, bool non_empty); static void add_case_limit_trns (struct dataset *ds); static void add_filter_trns (struct dataset *ds); static void update_last_proc_invocation (struct dataset *ds); static void dict_callback (struct dictionary *d UNUSED, void *ds_) { struct dataset *ds = ds_; dataset_changed__ (ds); } static void dataset_create_finish__ (struct dataset *ds, struct session *session) { static unsigned int seqno; dict_set_change_callback (ds->dict, dict_callback, ds); proc_cancel_all_transformations (ds); dataset_set_session (ds, session); ds->seqno = ++seqno; } /* Creates a new dataset named NAME, adds it to SESSION, and returns it. If SESSION already contains a dataset named NAME, it is deleted and replaced. The dataset initially has an empty dictionary and no data source. */ struct dataset * dataset_create (struct session *session, const char *name) { struct dataset *ds; ds = xzalloc (sizeof *ds); ds->name = xstrdup (name); ds->display = DATASET_FRONT; ds->dict = dict_create (get_default_encoding ()); ds->caseinit = caseinit_create (); dataset_create_finish__ (ds, session); return ds; } /* Creates and returns a new dataset that has the same data and dictionary as OLD named NAME, adds it to the same session as OLD, and returns the new dataset. If SESSION already contains a dataset named NAME, it is deleted and replaced. OLD must not have any active transformations or temporary state and must not be in the middle of a procedure. Callbacks are not cloned. */ struct dataset * dataset_clone (struct dataset *old, const char *name) { struct dataset *new; assert (old->proc_state == PROC_COMMITTED); assert (trns_chain_is_empty (old->permanent_trns_chain)); assert (old->permanent_dict == NULL); assert (old->sink == NULL); assert (old->temporary_trns_chain == NULL); new = xzalloc (sizeof *new); new->name = xstrdup (name); new->display = DATASET_FRONT; new->source = casereader_clone (old->source); new->dict = dict_clone (old->dict); new->caseinit = caseinit_clone (old->caseinit); new->last_proc_invocation = old->last_proc_invocation; new->ok = old->ok; dataset_create_finish__ (new, old->session); return new; } /* Destroys DS. */ void dataset_destroy (struct dataset *ds) { if (ds != NULL) { dataset_set_session (ds, NULL); dataset_clear (ds); dict_unref (ds->dict); caseinit_destroy (ds->caseinit); trns_chain_destroy (ds->permanent_trns_chain); dataset_transformations_changed__ (ds, false); free (ds->name); free (ds); } } /* Discards the active dataset's dictionary, data, and transformations. */ void dataset_clear (struct dataset *ds) { assert (ds->proc_state == PROC_COMMITTED); dict_clear (ds->dict); fh_set_default_handle (NULL); ds->n_lag = 0; casereader_destroy (ds->source); ds->source = NULL; proc_cancel_all_transformations (ds); } const char * dataset_name (const struct dataset *ds) { return ds->name; } void dataset_set_name (struct dataset *ds, const char *name) { struct session *session = ds->session; bool active = false; if (session != NULL) { active = session_active_dataset (session) == ds; if (active) session_set_active_dataset (session, NULL); dataset_set_session (ds, NULL); } free (ds->name); ds->name = xstrdup (name); if (session != NULL) { dataset_set_session (ds, session); if (active) session_set_active_dataset (session, ds); } } struct session * dataset_session (const struct dataset *ds) { return ds->session; } void dataset_set_session (struct dataset *ds, struct session *session) { if (session != ds->session) { if (ds->session != NULL) session_remove_dataset (ds->session, ds); if (session != NULL) session_add_dataset (session, ds); } } /* Returns the dictionary within DS. This is always nonnull, although it might not contain any variables. */ struct dictionary * dataset_dict (const struct dataset *ds) { return ds->dict; } /* Replaces DS's dictionary by DICT, discarding any source and transformations. */ void dataset_set_dict (struct dataset *ds, struct dictionary *dict) { assert (ds->proc_state == PROC_COMMITTED); assert (ds->dict != dict); dataset_clear (ds); dict_unref (ds->dict); ds->dict = dict; dict_set_change_callback (ds->dict, dict_callback, ds); } /* Returns the casereader that will be read when a procedure is executed on DS. This can be NULL if none has been set up yet. */ const struct casereader * dataset_source (const struct dataset *ds) { return ds->source; } /* Returns true if DS has a data source, false otherwise. */ bool dataset_has_source (const struct dataset *ds) { return dataset_source (ds) != NULL; } /* Replaces the active dataset's data by READER. READER's cases must have an appropriate format for DS's dictionary. */ bool dataset_set_source (struct dataset *ds, struct casereader *reader) { casereader_destroy (ds->source); ds->source = reader; caseinit_clear (ds->caseinit); caseinit_mark_as_preinited (ds->caseinit, ds->dict); return reader == NULL || !casereader_error (reader); } /* Returns the data source from DS and removes it from DS. Returns a null pointer if DS has no data source. */ struct casereader * dataset_steal_source (struct dataset *ds) { struct casereader *reader = ds->source; ds->source = NULL; return reader; } /* Returns a number unique to DS. It can be used to distinguish one dataset from any other within a given program run, even datasets that do not exist at the same time. */ unsigned int dataset_seqno (const struct dataset *ds) { return ds->seqno; } void dataset_set_callbacks (struct dataset *ds, const struct dataset_callbacks *callbacks, void *cb_data) { ds->callbacks = callbacks; ds->cb_data = cb_data; } enum dataset_display dataset_get_display (const struct dataset *ds) { return ds->display; } void dataset_set_display (struct dataset *ds, enum dataset_display display) { ds->display = display; } /* Returns the last time the data was read. */ time_t time_of_last_procedure (struct dataset *ds) { if (ds->last_proc_invocation == 0) update_last_proc_invocation (ds); return ds->last_proc_invocation; } /* Regular procedure. */ /* Executes any pending transformations, if necessary. This is not identical to the EXECUTE command in that it won't always read the source data. This can be important when the source data is given inline within BEGIN DATA...END FILE. */ bool proc_execute (struct dataset *ds) { bool ok; if ((ds->temporary_trns_chain == NULL || trns_chain_is_empty (ds->temporary_trns_chain)) && trns_chain_is_empty (ds->permanent_trns_chain)) { ds->n_lag = 0; ds->discard_output = false; dict_set_case_limit (ds->dict, 0); dict_clear_vectors (ds->dict); return true; } ok = casereader_destroy (proc_open (ds)); return proc_commit (ds) && ok; } static const struct casereader_class proc_casereader_class; /* Opens dataset DS for reading cases with proc_read. If FILTER is true, then cases filtered out with FILTER BY will not be included in the casereader (which is usually desirable). If FILTER is false, all cases will be included regardless of FILTER BY settings. proc_commit must be called when done. */ struct casereader * proc_open_filtering (struct dataset *ds, bool filter) { struct casereader *reader; assert (ds->source != NULL); assert (ds->proc_state == PROC_COMMITTED); update_last_proc_invocation (ds); caseinit_mark_for_init (ds->caseinit, ds->dict); /* Finish up the collection of transformations. */ add_case_limit_trns (ds); if (filter) add_filter_trns (ds); trns_chain_finalize (ds->cur_trns_chain); /* Make permanent_dict refer to the dictionary right before data reaches the sink. */ if (ds->permanent_dict == NULL) ds->permanent_dict = ds->dict; /* Prepare sink. */ if (!ds->discard_output) { struct dictionary *pd = ds->permanent_dict; size_t compacted_value_cnt = dict_count_values (pd, 1u << DC_SCRATCH); if (compacted_value_cnt < dict_get_next_value_idx (pd)) { struct caseproto *compacted_proto; compacted_proto = dict_get_compacted_proto (pd, 1u << DC_SCRATCH); ds->compactor = case_map_to_compact_dict (pd, 1u << DC_SCRATCH); ds->sink = autopaging_writer_create (compacted_proto); caseproto_unref (compacted_proto); } else { ds->compactor = NULL; ds->sink = autopaging_writer_create (dict_get_proto (pd)); } } else { ds->compactor = NULL; ds->sink = NULL; } /* Allocate memory for lagged cases. */ ds->lag_cases = deque_init (&ds->lag, ds->n_lag, sizeof *ds->lag_cases); ds->proc_state = PROC_OPEN; ds->cases_written = 0; ds->ok = true; /* FIXME: use taint in dataset in place of `ok'? */ /* FIXME: for trivial cases we can just return a clone of ds->source? */ /* Create casereader and insert a shim on top. The shim allows us to arbitrarily extend the casereader's lifetime, by slurping the cases into the shim's buffer in proc_commit(). That is especially useful when output table_items are generated directly from the procedure casereader (e.g. by the LIST procedure) when we are using an output driver that keeps a reference to the output items passed to it (e.g. the GUI output driver in PSPPIRE). */ reader = casereader_create_sequential (NULL, dict_get_proto (ds->dict), CASENUMBER_MAX, &proc_casereader_class, ds); ds->shim = casereader_shim_insert (reader); return reader; } /* Opens dataset DS for reading cases with proc_read. proc_commit must be called when done. */ struct casereader * proc_open (struct dataset *ds) { return proc_open_filtering (ds, true); } /* Returns true if a procedure is in progress, that is, if proc_open has been called but proc_commit has not. */ bool proc_is_open (const struct dataset *ds) { return ds->proc_state != PROC_COMMITTED; } /* "read" function for procedure casereader. */ static struct ccase * proc_casereader_read (struct casereader *reader UNUSED, void *ds_) { struct dataset *ds = ds_; enum trns_result retval = TRNS_DROP_CASE; struct ccase *c; assert (ds->proc_state == PROC_OPEN); for (; ; case_unref (c)) { casenumber case_nr; assert (retval == TRNS_DROP_CASE || retval == TRNS_ERROR); if (retval == TRNS_ERROR) ds->ok = false; if (!ds->ok) return NULL; /* Read a case from source. */ c = casereader_read (ds->source); if (c == NULL) return NULL; c = case_unshare_and_resize (c, dict_get_proto (ds->dict)); caseinit_init_vars (ds->caseinit, c); /* Execute permanent transformations. */ case_nr = ds->cases_written + 1; retval = trns_chain_execute (ds->permanent_trns_chain, TRNS_CONTINUE, &c, case_nr); caseinit_update_left_vars (ds->caseinit, c); if (retval != TRNS_CONTINUE) continue; /* Write case to collection of lagged cases. */ if (ds->n_lag > 0) { while (deque_count (&ds->lag) >= ds->n_lag) case_unref (ds->lag_cases[deque_pop_back (&ds->lag)]); ds->lag_cases[deque_push_front (&ds->lag)] = case_ref (c); } /* Write case to replacement dataset. */ ds->cases_written++; if (ds->sink != NULL) casewriter_write (ds->sink, case_map_execute (ds->compactor, case_ref (c))); /* Execute temporary transformations. */ if (ds->temporary_trns_chain != NULL) { retval = trns_chain_execute (ds->temporary_trns_chain, TRNS_CONTINUE, &c, ds->cases_written); if (retval != TRNS_CONTINUE) continue; } return c; } } /* "destroy" function for procedure casereader. */ static void proc_casereader_destroy (struct casereader *reader, void *ds_) { struct dataset *ds = ds_; struct ccase *c; /* We are always the subreader for a casereader_buffer, so if we're being destroyed then it's because the casereader_buffer has read all the cases that it ever will. */ ds->shim = NULL; /* Make sure transformations happen for every input case, in case they have side effects, and ensure that the replacement active dataset gets all the cases it should. */ while ((c = casereader_read (reader)) != NULL) case_unref (c); ds->proc_state = PROC_CLOSED; ds->ok = casereader_destroy (ds->source) && ds->ok; ds->source = NULL; dataset_set_source (ds, NULL); } /* Must return false if the source casereader, a transformation, or the sink casewriter signaled an error. (If a temporary transformation signals an error, then the return value is false, but the replacement active dataset may still be untainted.) */ bool proc_commit (struct dataset *ds) { if (ds->shim != NULL) casereader_shim_slurp (ds->shim); assert (ds->proc_state == PROC_CLOSED); ds->proc_state = PROC_COMMITTED; dataset_changed__ (ds); /* Free memory for lagged cases. */ while (!deque_is_empty (&ds->lag)) case_unref (ds->lag_cases[deque_pop_back (&ds->lag)]); free (ds->lag_cases); /* Dictionary from before TEMPORARY becomes permanent. */ proc_cancel_temporary_transformations (ds); if (!ds->discard_output) { /* Finish compacting. */ if (ds->compactor != NULL) { case_map_destroy (ds->compactor); ds->compactor = NULL; dict_delete_scratch_vars (ds->dict); dict_compact_values (ds->dict); } /* Old data sink becomes new data source. */ if (ds->sink != NULL) ds->source = casewriter_make_reader (ds->sink); } else { ds->source = NULL; ds->discard_output = false; } ds->sink = NULL; caseinit_clear (ds->caseinit); caseinit_mark_as_preinited (ds->caseinit, ds->dict); dict_clear_vectors (ds->dict); ds->permanent_dict = NULL; return proc_cancel_all_transformations (ds) && ds->ok; } /* Casereader class for procedure execution. */ static const struct casereader_class proc_casereader_class = { proc_casereader_read, proc_casereader_destroy, NULL, NULL, }; /* Updates last_proc_invocation. */ static void update_last_proc_invocation (struct dataset *ds) { ds->last_proc_invocation = time (NULL); } /* Returns a pointer to the lagged case from N_BEFORE cases before the current one, or NULL if there haven't been that many cases yet. */ const struct ccase * lagged_case (const struct dataset *ds, int n_before) { assert (n_before >= 1); assert (n_before <= ds->n_lag); if (n_before <= deque_count (&ds->lag)) return ds->lag_cases[deque_front (&ds->lag, n_before - 1)]; else return NULL; } /* Returns the current set of permanent transformations, and clears the permanent transformations. For use by INPUT PROGRAM. */ struct trns_chain * proc_capture_transformations (struct dataset *ds) { struct trns_chain *chain; assert (ds->temporary_trns_chain == NULL); chain = ds->permanent_trns_chain; ds->cur_trns_chain = ds->permanent_trns_chain = trns_chain_create (); dataset_transformations_changed__ (ds, false); return chain; } /* Adds a transformation that processes a case with PROC and frees itself with FREE to the current set of transformations. The functions are passed AUX as auxiliary data. */ void add_transformation (struct dataset *ds, trns_proc_func *proc, trns_free_func *free, void *aux) { trns_chain_append (ds->cur_trns_chain, NULL, proc, free, aux); dataset_transformations_changed__ (ds, true); } /* Adds a transformation that processes a case with PROC and frees itself with FREE to the current set of transformations. When parsing of the block of transformations is complete, FINALIZE will be called. The functions are passed AUX as auxiliary data. */ void add_transformation_with_finalizer (struct dataset *ds, trns_finalize_func *finalize, trns_proc_func *proc, trns_free_func *free, void *aux) { trns_chain_append (ds->cur_trns_chain, finalize, proc, free, aux); dataset_transformations_changed__ (ds, true); } /* Returns the index of the next transformation. This value can be returned by a transformation procedure function to indicate a "jump" to that transformation. */ size_t next_transformation (const struct dataset *ds) { return trns_chain_next (ds->cur_trns_chain); } /* Returns true if the next call to add_transformation() will add a temporary transformation, false if it will add a permanent transformation. */ bool proc_in_temporary_transformations (const struct dataset *ds) { return ds->temporary_trns_chain != NULL; } /* Marks the start of temporary transformations. Further calls to add_transformation() will add temporary transformations. */ void proc_start_temporary_transformations (struct dataset *ds) { if (!proc_in_temporary_transformations (ds)) { add_case_limit_trns (ds); ds->permanent_dict = dict_clone (ds->dict); trns_chain_finalize (ds->permanent_trns_chain); ds->temporary_trns_chain = ds->cur_trns_chain = trns_chain_create (); dataset_transformations_changed__ (ds, true); } } /* Converts all the temporary transformations, if any, to permanent transformations. Further transformations will be permanent. The FILTER command is implemented as a temporary transformation, so a procedure that uses this function should usually use proc_open_filtering() with FILTER false, instead of plain proc_open(). Returns true if anything changed, false otherwise. */ bool proc_make_temporary_transformations_permanent (struct dataset *ds) { if (proc_in_temporary_transformations (ds)) { trns_chain_finalize (ds->temporary_trns_chain); trns_chain_splice (ds->permanent_trns_chain, ds->temporary_trns_chain); ds->temporary_trns_chain = NULL; ds->cur_trns_chain = ds->permanent_trns_chain; dict_unref (ds->permanent_dict); ds->permanent_dict = NULL; return true; } else return false; } /* Cancels all temporary transformations, if any. Further transformations will be permanent. Returns true if anything changed, false otherwise. */ bool proc_cancel_temporary_transformations (struct dataset *ds) { if (proc_in_temporary_transformations (ds)) { dict_unref (ds->dict); ds->dict = ds->permanent_dict; ds->permanent_dict = NULL; trns_chain_destroy (ds->temporary_trns_chain); ds->temporary_trns_chain = NULL; dataset_transformations_changed__ ( ds, !trns_chain_is_empty (ds->permanent_trns_chain)); return true; } else return false; } /* Cancels all transformations, if any. Returns true if successful, false on I/O error. */ bool proc_cancel_all_transformations (struct dataset *ds) { bool ok; assert (ds->proc_state == PROC_COMMITTED); ok = trns_chain_destroy (ds->permanent_trns_chain); ok = trns_chain_destroy (ds->temporary_trns_chain) && ok; ds->permanent_trns_chain = ds->cur_trns_chain = trns_chain_create (); ds->temporary_trns_chain = NULL; dataset_transformations_changed__ (ds, false); return ok; } static int store_case_num (void *var_, struct ccase **cc, casenumber case_num) { struct variable *var = var_; *cc = case_unshare (*cc); case_data_rw (*cc, var)->f = case_num; return TRNS_CONTINUE; } /* Add a variable which we can sort by to get back the original order. */ struct variable * add_permanent_ordering_transformation (struct dataset *ds) { struct variable *temp_var; temp_var = dict_create_var_assert (ds->dict, "$ORDER", 0); if (proc_in_temporary_transformations (ds)) { struct variable *perm_var; perm_var = dict_clone_var_in_place_assert (ds->permanent_dict, temp_var); trns_chain_append (ds->permanent_trns_chain, NULL, store_case_num, NULL, perm_var); trns_chain_finalize (ds->permanent_trns_chain); } else add_transformation (ds, store_case_num, NULL, temp_var); return temp_var; } /* Causes output from the next procedure to be discarded, instead of being preserved for use as input for the next procedure. */ void proc_discard_output (struct dataset *ds) { ds->discard_output = true; } /* Checks whether DS has a corrupted active dataset. If so, discards it and returns false. If not, returns true without doing anything. */ bool dataset_end_of_command (struct dataset *ds) { if (ds->source != NULL) { if (casereader_error (ds->source)) { dataset_clear (ds); return false; } else { const struct taint *taint = casereader_get_taint (ds->source); taint_reset_successor_taint (CONST_CAST (struct taint *, taint)); assert (!taint_has_tainted_successor (taint)); } } return true; } static trns_proc_func case_limit_trns_proc; static trns_free_func case_limit_trns_free; /* Adds a transformation that limits the number of cases that may pass through, if DS->DICT has a case limit. */ static void add_case_limit_trns (struct dataset *ds) { casenumber case_limit = dict_get_case_limit (ds->dict); if (case_limit != 0) { casenumber *cases_remaining = xmalloc (sizeof *cases_remaining); *cases_remaining = case_limit; add_transformation (ds, case_limit_trns_proc, case_limit_trns_free, cases_remaining); dict_set_case_limit (ds->dict, 0); } } /* Limits the maximum number of cases processed to *CASES_REMAINING. */ static int case_limit_trns_proc (void *cases_remaining_, struct ccase **c UNUSED, casenumber case_nr UNUSED) { size_t *cases_remaining = cases_remaining_; if (*cases_remaining > 0) { (*cases_remaining)--; return TRNS_CONTINUE; } else return TRNS_DROP_CASE; } /* Frees the data associated with a case limit transformation. */ static bool case_limit_trns_free (void *cases_remaining_) { size_t *cases_remaining = cases_remaining_; free (cases_remaining); return true; } static trns_proc_func filter_trns_proc; /* Adds a temporary transformation to filter data according to the variable specified on FILTER, if any. */ static void add_filter_trns (struct dataset *ds) { struct variable *filter_var = dict_get_filter (ds->dict); if (filter_var != NULL) { proc_start_temporary_transformations (ds); add_transformation (ds, filter_trns_proc, NULL, filter_var); } } /* FILTER transformation. */ static int filter_trns_proc (void *filter_var_, struct ccase **c, casenumber case_nr UNUSED) { struct variable *filter_var = filter_var_; double f = case_num (*c, filter_var); return (f != 0.0 && !var_is_num_missing (filter_var, f, MV_ANY) ? TRNS_CONTINUE : TRNS_DROP_CASE); } void dataset_need_lag (struct dataset *ds, int n_before) { ds->n_lag = MAX (ds->n_lag, n_before); } static void dataset_changed__ (struct dataset *ds) { if (ds->callbacks != NULL && ds->callbacks->changed != NULL) ds->callbacks->changed (ds->cb_data); } static void dataset_transformations_changed__ (struct dataset *ds, bool non_empty) { if (ds->callbacks != NULL && ds->callbacks->transformations_changed != NULL) ds->callbacks->transformations_changed (non_empty, ds->cb_data); } /* Private interface for use by session code. */ void dataset_set_session__ (struct dataset *ds, struct session *session) { ds->session = session; } pspp-1.4.1/src/data/csv-file-writer.h0000644000175000017500000000321713602175177017022 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2010 Free Software Foundation, Inc. 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 3 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, see . */ #ifndef CSV_FILE_WRITER_H #define CSV_FILE_WRITER_H 1 #include /* Writing comma-separated value (CSV) files. */ /* Options for creating CSV files. */ struct csv_writer_options { bool recode_user_missing; /* Recode user-missing to system-missing? */ bool include_var_names; /* Add header row with variable names? */ bool use_value_labels; /* Write value labels where available? */ bool use_print_formats; /* Honor variables' print formats? */ char decimal; /* Decimal point character. */ char delimiter; /* Field separator. */ char qualifier; /* Quote character. */ }; struct file_handle; struct dictionary; struct casewriter *csv_writer_open (struct file_handle *, const struct dictionary *, const struct csv_writer_options *); #endif /* csv-file-writer.h */ pspp-1.4.1/src/data/casereader.c0000644000175000017500000005012013670210420016046 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2007, 2009, 2010, 2013 Free Software Foundation, Inc. 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 3 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, see . */ #include #include "data/casereader.h" #include "data/casereader-provider.h" #include #include "data/casereader-shim.h" #include "data/casewriter.h" #include "libpspp/assertion.h" #include "libpspp/heap.h" #include "libpspp/taint.h" #include "gl/xalloc.h" /* A casereader. */ struct casereader { struct taint *taint; /* Corrupted? */ struct caseproto *proto; /* Format of contained cases. */ casenumber case_cnt; /* Number of cases, CASENUMBER_MAX if unknown. */ const struct casereader_class *class; /* Class. */ void *aux; /* Auxiliary data for class. */ }; /* Reads and returns the next case from READER. The caller owns the returned case and must call case_unref on it when its data is no longer needed. Returns a null pointer if cases have been exhausted or upon detection of an I/O error. The case returned is effectively consumed: it can never be read again through READER. If this is inconvenient, READER may be cloned in advance with casereader_clone, or casereader_peek may be used instead. */ struct ccase * casereader_read (struct casereader *reader) { if (reader->case_cnt != 0) { /* ->read may use casereader_swap to replace itself by another reader and then delegate to that reader by recursively calling casereader_read. Currently only lazy_casereader does this and, with luck, nothing else ever will. To allow this to work, however, we must decrement case_cnt before calling ->read. If we decremented case_cnt after calling ->read, then this would actually drop two cases from case_cnt instead of one, and we'd lose the last case in the casereader. */ struct ccase *c; if (reader->case_cnt != CASENUMBER_MAX) reader->case_cnt--; c = reader->class->read (reader, reader->aux); if (c != NULL) { size_t n_widths UNUSED = caseproto_get_n_widths (reader->proto); assert (case_get_value_cnt (c) >= n_widths); expensive_assert (caseproto_equal (case_get_proto (c), 0, reader->proto, 0, n_widths)); return c; } } reader->case_cnt = 0; return NULL; } /* Destroys READER. Returns false if an I/O error was detected on READER, true otherwise. */ bool casereader_destroy (struct casereader *reader) { bool ok = true; if (reader != NULL) { reader->class->destroy (reader, reader->aux); ok = taint_destroy (reader->taint); caseproto_unref (reader->proto); free (reader); } return ok; } /* Returns a clone of READER. READER and its clone may be used to read the same sequence of cases in the same order, barring I/O errors. */ struct casereader * casereader_clone (const struct casereader *reader_) { struct casereader *reader = CONST_CAST (struct casereader *, reader_); struct casereader *clone; if (reader == NULL) return NULL; if (reader->class->clone == NULL) casereader_shim_insert (reader); clone = reader->class->clone (reader, reader->aux); assert (clone != NULL); assert (clone != reader); return clone; } /* Returns a copy of READER, which is itself destroyed. Useful for taking over ownership of a casereader, to enforce preventing the original owner from accessing the casereader again. */ struct casereader * casereader_rename (struct casereader *reader) { struct casereader *new = xmemdup (reader, sizeof *reader); free (reader); return new; } /* Exchanges the casereaders referred to by A and B. */ void casereader_swap (struct casereader *a, struct casereader *b) { if (a != b) { struct casereader tmp = *a; *a = *b; *b = tmp; } } /* Reads and returns the (IDX + 1)'th case from READER. The caller owns the returned case and must call case_unref on it when it is no longer needed. Returns a null pointer if cases have been exhausted or upon detection of an I/O error. */ struct ccase * casereader_peek (struct casereader *reader, casenumber idx) { if (idx < reader->case_cnt) { struct ccase *c; if (reader->class->peek == NULL) casereader_shim_insert (reader); c = reader->class->peek (reader, reader->aux, idx); if (c != NULL) return c; else if (casereader_error (reader)) reader->case_cnt = 0; } if (reader->case_cnt > idx) reader->case_cnt = idx; return NULL; } /* Returns true if no cases remain to be read from READER, or if an error has occurred on READER. (A return value of false does *not* mean that the next call to casereader_peek or casereader_read will return true, because an error can occur in the meantime.) */ bool casereader_is_empty (struct casereader *reader) { if (reader->case_cnt == 0) return true; else { struct ccase *c = casereader_peek (reader, 0); if (c == NULL) return true; else { case_unref (c); return false; } } } /* Returns true if an I/O error or another hard error has occurred on READER, a clone of READER, or on some object on which READER's data has a dependency, false otherwise. */ bool casereader_error (const struct casereader *reader) { return taint_is_tainted (reader->taint); } /* Marks READER as having encountered an error. Ordinarily, this function should be called by the implementation of a casereader, not by the casereader's client. Instead, casereader clients should usually ensure that a casereader's error state is correct by using taint_propagate to propagate to the casereader's taint structure, which may be obtained via casereader_get_taint. */ void casereader_force_error (struct casereader *reader) { taint_set_taint (reader->taint); } /* Returns READER's associate taint object, for use with taint_propagate and other taint functions. */ const struct taint * casereader_get_taint (const struct casereader *reader) { return reader->taint; } /* Returns the number of cases that will be read by successive calls to casereader_read for READER, assuming that no errors occur. Upon an error condition, the case count drops to 0, so that no more cases can be obtained. Not all casereaders can predict the number of cases that they will produce without actually reading all of them. In that case, this function returns CASENUMBER_MAX. To obtain the actual number of cases in such a casereader, use casereader_count_cases. */ casenumber casereader_get_case_cnt (struct casereader *reader) { return reader->case_cnt; } static casenumber casereader_count_cases__ (const struct casereader *reader, casenumber max_cases) { struct casereader *clone; casenumber n_cases; clone = casereader_clone (reader); n_cases = casereader_advance (clone, max_cases); casereader_destroy (clone); return n_cases; } /* Returns the number of cases that will be read by successive calls to casereader_read for READER, assuming that no errors occur. Upon an error condition, the case count drops to 0, so that no more cases can be obtained. For a casereader that cannot predict the number of cases it will produce, this function actually reads (and discards) all of the contents of a clone of READER. Thus, the return value is always correct in the absence of I/O errors. */ casenumber casereader_count_cases (const struct casereader *reader) { if (reader->case_cnt == CASENUMBER_MAX) { struct casereader *reader_rw = CONST_CAST (struct casereader *, reader); reader_rw->case_cnt = casereader_count_cases__ (reader, CASENUMBER_MAX); } return reader->case_cnt; } /* Truncates READER to at most N cases. */ void casereader_truncate (struct casereader *reader, casenumber n) { /* This could be optimized, if it ever becomes too expensive, by adding a "max_cases" member to struct casereader. We could also add a "truncate" function to the casereader implementation, to allow the casereader to throw away data that cannot ever be read. */ if (reader->case_cnt == CASENUMBER_MAX) reader->case_cnt = casereader_count_cases__ (reader, n); if (reader->case_cnt > n) reader->case_cnt = n; } /* Returns the prototype for the cases in READER. The caller must not unref the returned prototype. */ const struct caseproto * casereader_get_proto (const struct casereader *reader) { return reader->proto; } /* Skips past N cases in READER, stopping when the last case in READER has been read or on an input error. Returns the number of cases successfully skipped. */ casenumber casereader_advance (struct casereader *reader, casenumber n) { casenumber i; for (i = 0; i < n; i++) { struct ccase *c = casereader_read (reader); if (c == NULL) break; case_unref (c); } return i; } /* Copies all the cases in READER to WRITER, propagating errors appropriately. READER is destroyed by this function */ void casereader_transfer (struct casereader *reader, struct casewriter *writer) { struct ccase *c; taint_propagate (casereader_get_taint (reader), casewriter_get_taint (writer)); while ((c = casereader_read (reader)) != NULL) casewriter_write (writer, c); casereader_destroy (reader); } /* Creates and returns a new casereader. This function is intended for use by casereader implementations, not by casereader clients. This function is most suited for creating a casereader for a data source that is naturally sequential. casereader_create_random may be more appropriate for a data source that supports random access. Ordinarily, specify a null pointer for TAINT, in which case the new casereader will have a new, unique taint object. If the new casereader should have a clone of an existing taint object, specify that object as TAINT. (This is most commonly useful in an implementation of the "clone" casereader_class function, in which case the cloned casereader should have the same taint object as the original casereader.) PROTO must be the prototype for the cases that may be read from the casereader. The caller retains its reference to PROTO. CASE_CNT is an upper limit on the number of cases that casereader_read will return from the casereader in successive calls. Ordinarily, this is the actual number of cases in the data source or CASENUMBER_MAX if the number of cases cannot be predicted in advance. CLASS and AUX are a set of casereader implementation-specific member functions and auxiliary data to pass to those member functions, respectively. */ struct casereader * casereader_create_sequential (const struct taint *taint, const struct caseproto *proto, casenumber case_cnt, const struct casereader_class *class, void *aux) { struct casereader *reader = xmalloc (sizeof *reader); reader->taint = taint != NULL ? taint_clone (taint) : taint_create (); reader->proto = caseproto_ref (proto); reader->case_cnt = case_cnt; reader->class = class; reader->aux = aux; return reader; } /* If READER is a casereader of the given CLASS, returns its associated auxiliary data; otherwise, returns a null pointer. This function is intended for use from casereader implementations, not by casereader users. Even within casereader implementations, its usefulness is quite limited, for at least two reasons. First, every casereader member function already receives a pointer to the casereader's auxiliary data. Second, a casereader's class can change (through a call to casereader_swap) and this is in practice quite common (e.g. any call to casereader_clone on a casereader that does not directly support clone will cause the casereader to be replaced by a shim caseader). */ void * casereader_dynamic_cast (struct casereader *reader, const struct casereader_class *class) { return reader->class == class ? reader->aux : NULL; } /* Random-access casereader implementation. This is a set of wrappers around casereader_create_sequential and struct casereader_class to make it easy to create efficient casereaders for data sources that natively support random access. */ /* One clone of a random reader. */ struct random_reader { struct random_reader_shared *shared; /* Data shared among clones. */ struct heap_node heap_node; /* Node in shared data's heap of readers. */ casenumber offset; /* Number of cases already read. */ }; /* Returns the random_reader in which the given heap_node is embedded. */ static struct random_reader * random_reader_from_heap_node (const struct heap_node *node) { return heap_data (node, struct random_reader, heap_node); } /* Data shared among clones of a random reader. */ struct random_reader_shared { struct heap *readers; /* Heap of struct random_readers. */ casenumber min_offset; /* Smallest offset of any random_reader. */ const struct casereader_random_class *class; void *aux; }; static const struct casereader_class random_reader_casereader_class; /* Creates and returns a new random_reader with the given SHARED data and OFFSET. Inserts the new random reader into the shared heap. */ static struct random_reader * make_random_reader (struct random_reader_shared *shared, casenumber offset) { struct random_reader *br = xmalloc (sizeof *br); br->offset = offset; br->shared = shared; heap_insert (shared->readers, &br->heap_node); return br; } /* Compares random_readers A and B by offset and returns a strcmp()-like result. */ static int compare_random_readers_by_offset (const struct heap_node *a_, const struct heap_node *b_, const void *aux UNUSED) { const struct random_reader *a = random_reader_from_heap_node (a_); const struct random_reader *b = random_reader_from_heap_node (b_); return a->offset < b->offset ? -1 : a->offset > b->offset; } /* Creates and returns a new casereader. This function is intended for use by casereader implementations, not by casereader clients. This function is most suited for creating a casereader for a data source that supports random access. casereader_create_sequential is more appropriate for a data source that is naturally sequential. PROTO must be the prototype for the cases that may be read from the casereader. The caller retains its reference to PROTO. CASE_CNT is an upper limit on the number of cases that casereader_read will return from the casereader in successive calls. Ordinarily, this is the actual number of cases in the data source or CASENUMBER_MAX if the number of cases cannot be predicted in advance. CLASS and AUX are a set of casereader implementation-specific member functions and auxiliary data to pass to those member functions, respectively. */ struct casereader * casereader_create_random (const struct caseproto *proto, casenumber case_cnt, const struct casereader_random_class *class, void *aux) { struct random_reader_shared *shared = xmalloc (sizeof *shared); shared->readers = heap_create (compare_random_readers_by_offset, NULL); shared->class = class; shared->aux = aux; shared->min_offset = 0; return casereader_create_sequential (NULL, proto, case_cnt, &random_reader_casereader_class, make_random_reader (shared, 0)); } /* Reassesses the min_offset in SHARED based on the minimum offset in the heap. */ static void advance_random_reader (struct casereader *reader, struct random_reader_shared *shared) { casenumber old, new; old = shared->min_offset; new = random_reader_from_heap_node (heap_minimum (shared->readers))->offset; assert (new >= old); if (new > old) { shared->min_offset = new; shared->class->advance (reader, shared->aux, new - old); } } /* struct casereader_class "read" function for random reader. */ static struct ccase * random_reader_read (struct casereader *reader, void *br_) { struct random_reader *br = br_; struct random_reader_shared *shared = br->shared; struct ccase *c = shared->class->read (reader, shared->aux, br->offset - shared->min_offset); if (c != NULL) { br->offset++; heap_changed (shared->readers, &br->heap_node); advance_random_reader (reader, shared); } return c; } /* struct casereader_class "destroy" function for random reader. */ static void random_reader_destroy (struct casereader *reader, void *br_) { struct random_reader *br = br_; struct random_reader_shared *shared = br->shared; heap_delete (shared->readers, &br->heap_node); if (heap_is_empty (shared->readers)) { heap_destroy (shared->readers); shared->class->destroy (reader, shared->aux); free (shared); } else advance_random_reader (reader, shared); free (br); } /* struct casereader_class "clone" function for random reader. */ static struct casereader * random_reader_clone (struct casereader *reader, void *br_) { struct random_reader *br = br_; struct random_reader_shared *shared = br->shared; return casereader_create_sequential (casereader_get_taint (reader), reader->proto, casereader_get_case_cnt (reader), &random_reader_casereader_class, make_random_reader (shared, br->offset)); } /* struct casereader_class "peek" function for random reader. */ static struct ccase * random_reader_peek (struct casereader *reader, void *br_, casenumber idx) { struct random_reader *br = br_; struct random_reader_shared *shared = br->shared; return shared->class->read (reader, shared->aux, br->offset - shared->min_offset + idx); } /* Casereader class for random reader. */ static const struct casereader_class random_reader_casereader_class = { random_reader_read, random_reader_destroy, random_reader_clone, random_reader_peek, }; static const struct casereader_class casereader_null_class; /* Returns a casereader with no cases. The casereader has the prototype specified by PROTO. PROTO may be specified as a null pointer, in which case the casereader has no variables. */ struct casereader * casereader_create_empty (const struct caseproto *proto_) { struct casereader *reader; struct caseproto *proto; proto = proto_ != NULL ? caseproto_ref (proto_) : caseproto_create (); reader = casereader_create_sequential (NULL, proto, 0, &casereader_null_class, NULL); caseproto_unref (proto); return reader; } static struct ccase * casereader_null_read (struct casereader *reader UNUSED, void *aux UNUSED) { return NULL; } static void casereader_null_destroy (struct casereader *reader UNUSED, void *aux UNUSED) { /* Nothing to do. */ } static const struct casereader_class casereader_null_class = { casereader_null_read, casereader_null_destroy, NULL, /* clone */ NULL, /* peek */ }; pspp-1.4.1/src/data/any-reader.c0000644000175000017500000001577313711575610016031 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2006, 2010, 2011, 2012, 2014 Free Software Foundation, Inc. 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 3 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, see . */ #include #include "data/any-reader.h" #include #include #include #include #include #include "data/casereader.h" #include "data/dataset.h" #include "data/dictionary.h" #include "data/file-handle-def.h" #include "data/file-name.h" #include "libpspp/assertion.h" #include "libpspp/cast.h" #include "libpspp/message.h" #include "libpspp/str.h" #include "gl/xalloc.h" #include "gettext.h" #define _(msgid) gettext (msgid) #define N_(msgid) (msgid) static const struct any_reader_class dataset_reader_class; static const struct any_reader_class *classes[] = { &sys_file_reader_class, &por_file_reader_class, &pcp_file_reader_class, }; enum { N_CLASSES = sizeof classes / sizeof *classes }; int any_reader_detect (const struct file_handle *file_handle, const struct any_reader_class **classp) { struct detector { enum any_type type; int (*detect) (FILE *); }; FILE *file; int retval; if (classp) *classp = NULL; file = fn_open (file_handle, "rb"); if (file == NULL) { msg (ME, _("An error occurred while opening `%s': %s."), fh_get_file_name (file_handle), strerror (errno)); return -errno; } retval = 0; for (int i = 0; i < N_CLASSES; i++) { int rc = classes[i]->detect (file); if (rc == 1) { retval = 1; if (classp) *classp = classes[i]; break; } else if (rc < 0) retval = rc; } if (retval < 0) msg (ME, _("Error reading `%s': %s."), fh_get_file_name (file_handle), strerror (-retval)); fn_close (file_handle, file); return retval; } struct any_reader * any_reader_open (struct file_handle *handle) { switch (fh_get_referent (handle)) { case FH_REF_FILE: { const struct any_reader_class *class; int retval; retval = any_reader_detect (handle, &class); if (retval <= 0) { if (retval == 0) msg (SE, _("`%s' is not a system or portable file."), fh_get_file_name (handle)); return NULL; } return class->open (handle); } case FH_REF_INLINE: msg (SE, _("The inline file is not allowed here.")); return NULL; case FH_REF_DATASET: return dataset_reader_class.open (handle); } NOT_REACHED (); } /* gnulib on some systems defines "close" as something else, which causes problems for this code. So undefine it here. */ #undef close bool any_reader_close (struct any_reader *any_reader) { return any_reader ? any_reader->klass->close (any_reader) : true; } struct casereader * any_reader_decode (struct any_reader *any_reader, const char *encoding, struct dictionary **dictp, struct any_read_info *info) { const struct any_reader_class *class = any_reader->klass; struct casereader *reader; reader = any_reader->klass->decode (any_reader, encoding, dictp, info); if (reader && info) info->klass = class; return reader; } size_t any_reader_get_strings (const struct any_reader *any_reader, struct pool *pool, char ***labels, bool **ids, char ***values) { return (any_reader->klass->get_strings ? any_reader->klass->get_strings (any_reader, pool, labels, ids, values) : 0); } struct casereader * any_reader_open_and_decode (struct file_handle *handle, const char *encoding, struct dictionary **dictp, struct any_read_info *info) { struct any_reader *any_reader = any_reader_open (handle); return (any_reader ? any_reader_decode (any_reader, encoding, dictp, info) : NULL); } struct dataset_reader { struct any_reader any_reader; struct dictionary *dict; struct casereader *reader; }; /* Opens FH, which must have referent type FH_REF_DATASET, and returns a dataset_reader for it, or a null pointer on failure. Stores a copy of the dictionary for the dataset file into *DICT. The caller takes ownership of the casereader and the dictionary. */ static struct any_reader * dataset_reader_open (struct file_handle *fh) { struct dataset_reader *reader; struct dataset *ds; /* We don't bother doing fh_lock or fh_ref on the file handle, as there's no advantage in this case, and doing these would require us to keep track of the "struct file_handle" and "struct fh_lock" and undo our work later. */ assert (fh_get_referent (fh) == FH_REF_DATASET); ds = fh_get_dataset (fh); if (ds == NULL || !dataset_has_source (ds)) { msg (SE, _("Cannot read from dataset %s because no dictionary or data " "has been written to it yet."), fh_get_name (fh)); return NULL; } reader = xmalloc (sizeof *reader); reader->any_reader.klass = &dataset_reader_class; reader->dict = dict_clone (dataset_dict (ds)); reader->reader = casereader_clone (dataset_source (ds)); return &reader->any_reader; } static struct dataset_reader * dataset_reader_cast (const struct any_reader *r_) { assert (r_->klass == &dataset_reader_class); return UP_CAST (r_, struct dataset_reader, any_reader); } static bool dataset_reader_close (struct any_reader *r_) { struct dataset_reader *r = dataset_reader_cast (r_); dict_unref (r->dict); casereader_destroy (r->reader); free (r); return true; } static struct casereader * dataset_reader_decode (struct any_reader *r_, const char *encoding UNUSED, struct dictionary **dictp, struct any_read_info *info) { struct dataset_reader *r = dataset_reader_cast (r_); struct casereader *reader; *dictp = r->dict; reader = r->reader; if (info) { memset (info, 0, sizeof *info); info->integer_format = INTEGER_NATIVE; info->float_format = FLOAT_NATIVE_DOUBLE; info->compression = ANY_COMP_NONE; info->case_cnt = casereader_get_case_cnt (reader); } free (r); return reader; } static const struct any_reader_class dataset_reader_class = { N_("Dataset"), NULL, dataset_reader_open, dataset_reader_close, dataset_reader_decode, NULL, }; pspp-1.4.1/src/data/subcase.h0000644000175000017500000001210613320146056015411 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2008, 2009 Free Software Foundation, Inc. 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 3 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, see . */ #ifndef DATA_SUBCASE_H #define DATA_SUBCASE_H 1 #include #include struct ccase; union value; struct variable; /* Sort order. */ enum subcase_direction { SC_ASCEND, /* A, B, C, ..., X, Y, Z. */ SC_DESCEND /* Z, Y, X, ..., C, B, A. */ }; /* A value within a case. */ struct subcase_field { size_t case_index; /* Starting position in the case. */ int width; /* 0=numeric, otherwise string width. */ enum subcase_direction direction; /* Sort order. */ }; /* A subcase specifies how to draw values from a case. */ struct subcase { struct subcase_field *fields; size_t n_fields; struct caseproto *proto; /* Created lazily. */ }; void subcase_init_empty (struct subcase *); void subcase_init_vars (struct subcase *, const struct variable *const *, size_t n_vars); void subcase_init_var (struct subcase *, const struct variable *, enum subcase_direction); void subcase_init (struct subcase *, int index, int width, enum subcase_direction); void subcase_clone (struct subcase *, const struct subcase *); void subcase_clear (struct subcase *); void subcase_destroy (struct subcase *); bool subcase_contains (const struct subcase *, int case_index); bool subcase_contains_var (const struct subcase *, const struct variable *); bool subcase_add (struct subcase *, int case_index, int width, enum subcase_direction direction); bool subcase_add_var (struct subcase *, const struct variable *, enum subcase_direction); void subcase_add_always (struct subcase *sc, int case_index, int width, enum subcase_direction direction); void subcase_add_var_always (struct subcase *, const struct variable *, enum subcase_direction); void subcase_add_vars_always (struct subcase *, const struct variable *const *, size_t n_vars); void subcase_add_proto_always (struct subcase *, const struct caseproto *); const struct caseproto *subcase_get_proto (const struct subcase *); static inline bool subcase_is_empty (const struct subcase *); static inline size_t subcase_get_n_fields (const struct subcase *); static inline size_t subcase_get_case_index (const struct subcase *, size_t idx); static inline enum subcase_direction subcase_get_direction ( const struct subcase *, size_t idx); bool subcase_conformable (const struct subcase *, const struct subcase *); void subcase_extract (const struct subcase *, const struct ccase *, union value *values); void subcase_inject (const struct subcase *, const union value *values, struct ccase *); void subcase_copy (const struct subcase *src_sc, const struct ccase *src, const struct subcase *dst_sc, struct ccase *dst); int subcase_compare_3way (const struct subcase *a_sc, const struct ccase *a, const struct subcase *b_sc, const struct ccase *b); int subcase_compare_3way_xc (const struct subcase *, const union value *a, const struct ccase *b); int subcase_compare_3way_cx (const struct subcase *, const struct ccase *a, const union value *b); int subcase_compare_3way_xx (const struct subcase *, const union value *a, const union value *b); bool subcase_equal (const struct subcase *a_sc, const struct ccase *a, const struct subcase *b_sc, const struct ccase *b); bool subcase_equal_xc (const struct subcase *, const union value *a, const struct ccase *b); bool subcase_equal_cx (const struct subcase *, const struct ccase *a, const union value *b); bool subcase_equal_xx (const struct subcase *, const union value *a, const union value *b); static inline size_t subcase_get_case_index (const struct subcase *sc, size_t idx) { return sc->fields[idx].case_index; } static inline enum subcase_direction subcase_get_direction (const struct subcase *sc, size_t idx) { return sc->fields[idx].direction; } static inline bool subcase_is_empty (const struct subcase *sc) { return sc->n_fields == 0; } static inline size_t subcase_get_n_fields (const struct subcase *sc) { return sc->n_fields; } #endif /* data/subcase.h */ pspp-1.4.1/src/data/make-file.c0000644000175000017500000002213513723621022015612 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2004, 2010, 2015 Free Software Foundation, Inc. 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 3 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, see . */ #include #include "data/make-file.h" #include "libpspp/i18n.h" #include #include #include #include #include #include #include #include "data/file-name.h" #include "data/file-handle-def.h" #include "libpspp/ll.h" #include "libpspp/message.h" #include "gl/fatal-signal.h" #include "gl/tempname.h" #include "gl/xalloc.h" #include "gl/xvasprintf.h" #include "gl/localcharset.h" #include "gettext.h" #define _(msgid) gettext (msgid) #if defined _WIN32 || defined __WIN32__ #define WIN32_LEAN_AND_MEAN /* avoid including junk */ #include #define TS_stat _stat #define Tunlink _wunlink #define Topen _wopen #define Tstat _wstat /* Shamelessly lifted and modified from the rpl_rename function in Gnulib */ static int Trename (TCHAR const *src, TCHAR const *dst) { int error; /* MoveFileExW works if SRC is a directory without any flags, but fails with MOVEFILE_REPLACE_EXISTING, so try without flags first. Thankfully, MoveFileExW handles hard links correctly, even though rename() does not. */ if (MoveFileExW (src, dst, 0)) return 0; /* Retry with MOVEFILE_REPLACE_EXISTING if the move failed due to the destination already existing. */ error = GetLastError (); if (error == ERROR_FILE_EXISTS || error == ERROR_ALREADY_EXISTS) { if (MoveFileExW (src, dst, MOVEFILE_REPLACE_EXISTING)) return 0; error = GetLastError (); } switch (error) { case ERROR_FILE_NOT_FOUND: case ERROR_PATH_NOT_FOUND: case ERROR_BAD_PATHNAME: case ERROR_DIRECTORY: errno = ENOENT; break; case ERROR_ACCESS_DENIED: case ERROR_SHARING_VIOLATION: errno = EACCES; break; case ERROR_OUTOFMEMORY: errno = ENOMEM; break; case ERROR_CURRENT_DIRECTORY: errno = EBUSY; break; case ERROR_NOT_SAME_DEVICE: errno = EXDEV; break; case ERROR_WRITE_PROTECT: errno = EROFS; break; case ERROR_WRITE_FAULT: case ERROR_READ_FAULT: case ERROR_GEN_FAILURE: errno = EIO; break; case ERROR_HANDLE_DISK_FULL: case ERROR_DISK_FULL: case ERROR_DISK_TOO_FRAGMENTED: errno = ENOSPC; break; case ERROR_FILE_EXISTS: case ERROR_ALREADY_EXISTS: errno = EEXIST; break; case ERROR_BUFFER_OVERFLOW: case ERROR_FILENAME_EXCED_RANGE: errno = ENAMETOOLONG; break; case ERROR_INVALID_NAME: case ERROR_DELETE_PENDING: errno = EPERM; /* ? */ break; # ifndef ERROR_FILE_TOO_LARGE /* This value is documented but not defined in all versions of windows.h. */ # define ERROR_FILE_TOO_LARGE 223 # endif case ERROR_FILE_TOO_LARGE: errno = EFBIG; break; default: errno = EINVAL; break; } return -1; } TCHAR * convert_to_filename_encoding (const char *s, size_t len, const char *current_encoding) { const char *enc = current_encoding; if (NULL == enc || 0 == strcmp (enc, "Auto")) enc = locale_charset (); return (TCHAR *) recode_string ("UTF-16LE", enc, s, len); } #else #define TS_stat stat #define Trename rename #define Tunlink unlink #define Topen open #define Tstat stat TCHAR * convert_to_filename_encoding (const char *s, size_t len UNUSED, const char *current_encoding UNUSED) { /* Non-windows systems don't care about the encoding. The string is copied here, to be consistent with the w32 case. */ return xstrdup (s); } #endif struct replace_file { struct ll ll; TCHAR *file_name; TCHAR *tmp_name; char *tmp_name_verbatim; const char *file_name_verbatim; }; static struct ll_list all_files = LL_INITIALIZER (all_files); static void free_replace_file (struct replace_file *); static void unlink_replace_files (int sig); struct replace_file * replace_file_start (const struct file_handle *fh, const char *mode, mode_t permissions, FILE **fp) { static bool registered; struct TS_stat s; struct replace_file *rf; int fd; int saved_errno = errno; const char *file_name = fh_get_file_name (fh); TCHAR * Tfile_name = convert_to_filename_encoding (file_name, strlen (file_name), fh_get_file_name_encoding (fh)); /* If FILE_NAME represents a special file, write to it directly instead of trying to replace it. */ if (Tstat (Tfile_name, &s) == 0 && !S_ISREG (s.st_mode)) { /* Open file descriptor. */ fd = Topen (Tfile_name, O_WRONLY); if (fd < 0) { saved_errno = errno; msg (ME, _("Opening %s for writing: %s."), file_name, strerror (saved_errno)); free (Tfile_name); return NULL; } /* Open file as stream. */ *fp = fdopen (fd, mode); if (*fp == NULL) { saved_errno = errno; msg (ME, _("Opening stream for %s: %s."), file_name, strerror (saved_errno)); close (fd); free (Tfile_name); return NULL; } rf = xzalloc (sizeof *rf); rf->file_name = NULL; rf->tmp_name = Tfile_name; return rf; } if (!registered) { at_fatal_signal (unlink_replace_files); registered = true; } block_fatal_signals (); rf = xzalloc (sizeof *rf); rf->file_name = Tfile_name; rf->file_name_verbatim = file_name; for (;;) { /* Generate unique temporary file name. */ free (rf->tmp_name_verbatim); rf->tmp_name_verbatim = xasprintf ("%stmpXXXXXX", file_name); if (gen_tempname (rf->tmp_name_verbatim, 0, 0600, GT_NOCREATE) < 0) { saved_errno = errno; msg (ME, _("Creating temporary file to replace %s: %s."), file_name, strerror (saved_errno)); goto error; } rf->tmp_name = convert_to_filename_encoding (rf->tmp_name_verbatim, strlen (rf->tmp_name_verbatim), fh_get_file_name_encoding (fh)); /* Create file by that name. */ bool binary = strchr (mode, 'b') != NULL; fd = Topen (rf->tmp_name, O_WRONLY | O_CREAT | O_EXCL | (binary ? O_BINARY : O_TEXT), permissions); if (fd >= 0) break; if (errno != EEXIST) { saved_errno = errno; msg (ME, _("Creating temporary file %s: %s."), rf->tmp_name_verbatim, strerror (saved_errno)); goto error; } } /* Open file as stream. */ *fp = fdopen (fd, mode); if (*fp == NULL) { saved_errno = errno; msg (ME, _("Opening stream for temporary file %s: %s."), rf->tmp_name_verbatim, strerror (saved_errno)); close (fd); Tunlink (rf->tmp_name); goto error; } /* Register file for deletion. */ ll_push_head (&all_files, &rf->ll); unblock_fatal_signals (); return rf; error: unblock_fatal_signals (); free_replace_file (rf); *fp = NULL; errno = saved_errno; return NULL; } bool replace_file_commit (struct replace_file *rf) { bool ok = true; if (rf->file_name != NULL) { int save_errno; block_fatal_signals (); ok = Trename (rf->tmp_name, rf->file_name) == 0; save_errno = errno; ll_remove (&rf->ll); unblock_fatal_signals (); if (!ok) msg (ME, _("Replacing %s by %s: %s."), rf->file_name_verbatim, rf->tmp_name_verbatim, strerror (save_errno)); } else { /* Special file: no temporary file to rename. */ } free_replace_file (rf); return ok; } bool replace_file_abort (struct replace_file *rf) { bool ok = true; if (rf->file_name != NULL) { int save_errno; block_fatal_signals (); ok = Tunlink (rf->tmp_name) == 0; save_errno = errno; ll_remove (&rf->ll); unblock_fatal_signals (); if (!ok) msg (ME, _("Removing %s: %s."), rf->tmp_name_verbatim, strerror (save_errno)); } else { /* Special file: no temporary file to unlink. */ } free_replace_file (rf); return ok; } static void free_replace_file (struct replace_file *rf) { free (rf->file_name); free (rf->tmp_name); free (rf->tmp_name_verbatim); free (rf); } static void unlink_replace_files (int sig UNUSED) { struct replace_file *rf; block_fatal_signals (); ll_for_each (rf, struct replace_file, ll, &all_files) { /* We don't free_replace_file(RF) because calling free is unsafe from an asynchronous signal handler. */ Tunlink (rf->tmp_name); } unblock_fatal_signals (); } pspp-1.4.1/src/automake.mk0000644000175000017500000000316613571051220015043 0ustar00blpblp00000000000000# PSPP - a program for statistical analysis. # Copyright (C) 2017 Free Software Foundation, Inc. # # 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 3 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, see . # ## Process this file with automake to produce Makefile.in -*- makefile -*- # PSPP include $(top_srcdir)/src/libpspp/automake.mk include $(top_srcdir)/src/data/automake.mk AM_CPPFLAGS += -I$(top_srcdir)/src -I$(top_srcdir)/lib pkglib_LTLIBRARIES = src/libpspp-core.la src/libpspp.la src_libpspp_core_la_SOURCES = src_libpspp_core_la_LDFLAGS = -release $(VERSION) src_libpspp_core_la_LIBADD = \ src/data/libdata.la \ src/libpspp/liblibpspp.la \ $(LIBXML2_LIBS) $(PG_LIBS) \ gl/libgl.la src_libpspp_la_SOURCES = src_libpspp_la_CFLAGS = $(GSL_CFLAGS) src_libpspp_la_LDFLAGS = -release $(VERSION) src_libpspp_la_LIBADD = \ src/language/liblanguage.la \ src/math/libpspp-math.la \ src/output/liboutput.la \ $(GSL_LIBS) include $(top_srcdir)/src/math/automake.mk include $(top_srcdir)/src/output/automake.mk include $(top_srcdir)/src/language/automake.mk include $(top_srcdir)/src/ui/automake.mk pspp-1.4.1/src/output/0000755000175000017500000000000013725012647014251 5ustar00blpblp00000000000000pspp-1.4.1/src/output/chart-item-provider.h0000644000175000017500000000215413320146056020302 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2004, 2009, 2011 Free Software Foundation, Inc. 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 3 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, see . */ #ifndef OUTPUT_CHART_ITEM_PROVIDER_H #define OUTPUT_CHART_ITEM_PROVIDER_H 1 #include "output/chart-item.h" #include "output/output-item.h" struct chart_item_class { void (*destroy) (struct chart_item *); }; void chart_item_init (struct chart_item *, const struct chart_item_class *, const char *title); #endif /* output/chart-provider.h */ pspp-1.4.1/src/output/group-item.c0000644000175000017500000000477113573046024016513 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2018 Free Sonftware Foundation, Inc. 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 3 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, see . */ #include #include "output/group-item.h" #include #include "output/driver.h" #include "output/output-item-provider.h" #include "gl/xalloc.h" struct group_open_item * group_open_item_create (const char *command_name) { return group_open_item_create_nocopy ( command_name ? xstrdup (command_name) : NULL); } struct group_open_item * group_open_item_create_nocopy (char *command_name) { struct group_open_item *item; item = xmalloc (sizeof *item); output_item_init (&item->output_item, &group_open_item_class); item->command_name = command_name; return item; } /* Submits ITEM to the configured output drivers, and transfers ownership to the output subsystem. */ void group_open_item_submit (struct group_open_item *item) { output_submit (&item->output_item); } static void group_open_item_destroy (struct output_item *output_item) { struct group_open_item *item = to_group_open_item (output_item); free (item->command_name); free (item); } const struct output_item_class group_open_item_class = { "group_open", group_open_item_destroy, }; struct group_close_item * group_close_item_create (void) { struct group_close_item *item; item = xmalloc (sizeof *item); output_item_init (&item->output_item, &group_close_item_class); return item; } /* Submits ITEM to the configured output drivers, and transfers ownership to the output subsystem. */ void group_close_item_submit (struct group_close_item *item) { output_submit (&item->output_item); } static void group_close_item_destroy (struct output_item *output_item) { struct group_close_item *item = to_group_close_item (output_item); free (item); } const struct output_item_class group_close_item_class = { "group_close", group_close_item_destroy, }; pspp-1.4.1/src/output/cairo.h0000644000175000017500000000770613547776540015544 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2009, 2010, 2014 Free Software Foundation, Inc. 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 3 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, see . */ #ifndef OUTPUT_CAIRO_H #define OUTPUT_CAIRO_H 1 #include #ifdef HAVE_CAIRO #include struct cell_color; struct chart_item; struct output_driver; struct output_item; struct string_map; /* Creating and destroying Cairo output drivers. */ struct xr_driver *xr_driver_create (cairo_t *, struct string_map *options); void xr_driver_destroy (struct xr_driver *); /* Functions for rendering a single output item to a Cairo context. Output items are never broken across multiple pages. Used by PSPPIRE to render in the GUI. */ struct xr_rendering *xr_rendering_create (struct xr_driver *, const struct output_item *, cairo_t *); void xr_rendering_destroy (struct xr_rendering *); void xr_rendering_apply_options (struct xr_rendering *, struct string_map *o); void xr_rendering_measure (const struct xr_rendering *, int *w, int *h); void xr_rendering_draw (struct xr_rendering *r, cairo_t *cr, int x0, int y0, int x1, int y1); /* Functions for rendering a series of output items to a series of Cairo contexts, with pagination, possibly including headers. The intended usage pattern is this: * Create an xr_driver with xr_driver_create(). The cairo_t passed in must accurately reflect the properties of the output (e.g. for the purpose of page size and font selection) but need not be used for rendering. * Call xr_driver_next_page() to set up the first real output page's cairo_t. (You can skip this step if the cairo_t passed to xr_driver_create() can be used.) * Then, for each output_item: - Pass the output item to xr_driver_output_item(). As much output as fits will be rendered on the current page. - Then, as long as xr_driver_need_new_page() returns true, obtain a new page for rendering and pass it to xr_driver_next_page(). As much output as fits on the new page will be rendered on it. * When you're done, destroy the output driver with xr_driver_destroy(). These functions may also be used for counting pages without actually rendering output. Follow the same steps, except pass NULL as the cairo_t to xr_driver_next_page(). (But xr_driver_create() still needs a valid cairo_t for page setup.) (If the cairo_t that you pass to xr_driver_create() won't remain valid, be sure to clear it out one way or another before calling xr_driver_destroy(), so that xr_driver_destroy() won't destroy it itself.) */ void xr_driver_next_page (struct xr_driver *, cairo_t *); void xr_driver_output_item (struct xr_driver *, const struct output_item *); bool xr_driver_need_new_page (const struct xr_driver *); bool xr_driver_is_page_blank (const struct xr_driver *); void parse_color (struct output_driver *d, struct string_map *options, const char *key, const char *default_value, struct cell_color *); /* Render charts with Cairo. */ char *xr_draw_png_chart (const struct chart_item *, const char *file_name_template, int number, const struct cell_color *fg, const struct cell_color *bg); #endif /* HAVE_CAIRO */ #endif /* output/cairo.h */ pspp-1.4.1/src/output/odt.c0000644000175000017500000004530413670210420015175 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2009-2014 Free Software Foundation, Inc. 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 3 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, see . */ #include /* A driver for creating OpenDocument Format text files from PSPP's output */ #include #include #include #ifdef HAVE_PWD_H #include #endif #include #include #include #include #include "libpspp/assertion.h" #include "libpspp/cast.h" #include "libpspp/message.h" #include "libpspp/str.h" #include "libpspp/temp-file.h" #include "libpspp/version.h" #include "libpspp/zip-writer.h" #include "data/file-handle-def.h" #include "output/driver-provider.h" #include "output/message-item.h" #include "output/options.h" #include "output/table-item.h" #include "output/table-provider.h" #include "output/text-item.h" #include "gl/xalloc.h" #include "gettext.h" #define _(msgid) gettext (msgid) #define _xml(X) (CHAR_CAST (const xmlChar *, X)) struct odt_driver { struct output_driver driver; struct zip_writer *zip; /* ZIP file writer. */ struct file_handle *handle; /* Handle for 'file_name'. */ char *file_name; /* Output file name. */ /* content.xml */ xmlTextWriterPtr content_wtr; /* XML writer. */ FILE *content_file; /* Temporary file. */ /* manifest.xml */ xmlTextWriterPtr manifest_wtr; /* XML writer. */ FILE *manifest_file; /* Temporary file. */ /* Number of tables so far. */ int table_num; }; static const struct output_driver_class odt_driver_class; static struct odt_driver * odt_driver_cast (struct output_driver *driver) { assert (driver->class == &odt_driver_class); return UP_CAST (driver, struct odt_driver, driver); } /* Creates a new temporary file and stores it in *FILE, then creates an XML writer for it and stores it in *W. */ static void create_writer (FILE **file, xmlTextWriterPtr *w) { /* XXX this can fail */ *file = create_temp_file (); *w = xmlNewTextWriter (xmlOutputBufferCreateFile (*file, NULL)); xmlTextWriterStartDocument (*w, NULL, "UTF-8", NULL); } static void register_file (struct odt_driver *odt, const char *filename) { assert (odt->manifest_wtr); xmlTextWriterStartElement (odt->manifest_wtr, _xml("manifest:file-entry")); xmlTextWriterWriteAttribute (odt->manifest_wtr, _xml("manifest:media-type"), _xml("text/xml")); xmlTextWriterWriteAttribute (odt->manifest_wtr, _xml("manifest:full-path"), _xml (filename)); xmlTextWriterEndElement (odt->manifest_wtr); } static void write_style_data (struct odt_driver *odt) { xmlTextWriterPtr w; FILE *file; create_writer (&file, &w); register_file (odt, "styles.xml"); xmlTextWriterStartElement (w, _xml ("office:document-styles")); xmlTextWriterWriteAttribute (w, _xml ("xmlns:office"), _xml ("urn:oasis:names:tc:opendocument:xmlns:office:1.0")); xmlTextWriterWriteAttribute (w, _xml ("xmlns:style"), _xml ("urn:oasis:names:tc:opendocument:xmlns:style:1.0")); xmlTextWriterWriteAttribute (w, _xml ("xmlns:fo"), _xml ("urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0")); xmlTextWriterWriteAttribute (w, _xml ("office:version"), _xml ("1.1")); xmlTextWriterStartElement (w, _xml ("office:styles")); { xmlTextWriterStartElement (w, _xml ("style:style")); xmlTextWriterWriteAttribute (w, _xml ("style:name"), _xml ("Standard")); xmlTextWriterWriteAttribute (w, _xml ("style:family"), _xml ("paragraph")); xmlTextWriterWriteAttribute (w, _xml ("style:class"), _xml ("text")); xmlTextWriterEndElement (w); /* style:style */ } { xmlTextWriterStartElement (w, _xml ("style:style")); xmlTextWriterWriteAttribute (w, _xml ("style:name"), _xml ("Table_20_Contents")); xmlTextWriterWriteAttribute (w, _xml ("style:display-name"), _xml ("Table Contents")); xmlTextWriterWriteAttribute (w, _xml ("style:family"), _xml ("paragraph")); xmlTextWriterWriteAttribute (w, _xml ("style:parent-style-name"), _xml ("Standard")); xmlTextWriterWriteAttribute (w, _xml ("style:class"), _xml ("extra")); xmlTextWriterEndElement (w); /* style:style */ } { xmlTextWriterStartElement (w, _xml ("style:style")); xmlTextWriterWriteAttribute (w, _xml ("style:name"), _xml ("Table_20_Heading")); xmlTextWriterWriteAttribute (w, _xml ("style:display-name"), _xml ("Table Heading")); xmlTextWriterWriteAttribute (w, _xml ("style:family"), _xml ("paragraph")); xmlTextWriterWriteAttribute (w, _xml ("style:parent-style-name"), _xml ("Table_20_Contents")); xmlTextWriterWriteAttribute (w, _xml ("style:class"), _xml ("extra")); xmlTextWriterStartElement (w, _xml ("style:text-properties")); xmlTextWriterWriteAttribute (w, _xml ("fo:font-weight"), _xml ("bold")); xmlTextWriterWriteAttribute (w, _xml ("style:font-weight-asian"), _xml ("bold")); xmlTextWriterWriteAttribute (w, _xml ("style:font-weight-complex"), _xml ("bold")); xmlTextWriterEndElement (w); /* style:text-properties */ xmlTextWriterEndElement (w); /* style:style */ } xmlTextWriterEndElement (w); /* office:styles */ xmlTextWriterEndElement (w); /* office:document-styles */ xmlTextWriterEndDocument (w); xmlFreeTextWriter (w); zip_writer_add (odt->zip, file, "styles.xml"); close_temp_file (file); } static void write_meta_data (struct odt_driver *odt) { xmlTextWriterPtr w; FILE *file; create_writer (&file, &w); register_file (odt, "meta.xml"); xmlTextWriterStartElement (w, _xml ("office:document-meta")); xmlTextWriterWriteAttribute (w, _xml ("xmlns:office"), _xml ("urn:oasis:names:tc:opendocument:xmlns:office:1.0")); xmlTextWriterWriteAttribute (w, _xml ("xmlns:dc"), _xml ("http://purl.org/dc/elements/1.1/")); xmlTextWriterWriteAttribute (w, _xml ("xmlns:meta"), _xml ("urn:oasis:names:tc:opendocument:xmlns:meta:1.0")); xmlTextWriterWriteAttribute (w, _xml ("xmlns:ooo"), _xml("http://openoffice.org/2004/office")); xmlTextWriterWriteAttribute (w, _xml ("office:version"), _xml("1.1")); xmlTextWriterStartElement (w, _xml ("office:meta")); { xmlTextWriterStartElement (w, _xml ("meta:generator")); xmlTextWriterWriteString (w, _xml (version)); xmlTextWriterEndElement (w); } { char buf[30]; time_t t = time (NULL); struct tm *tm = localtime (&t); strftime (buf, 30, "%Y-%m-%dT%H:%M:%S", tm); xmlTextWriterStartElement (w, _xml ("meta:creation-date")); xmlTextWriterWriteString (w, _xml (buf)); xmlTextWriterEndElement (w); xmlTextWriterStartElement (w, _xml ("dc:date")); xmlTextWriterWriteString (w, _xml (buf)); xmlTextWriterEndElement (w); } #ifdef HAVE_PWD_H { struct passwd *pw = getpwuid (getuid ()); if (pw != NULL) { xmlTextWriterStartElement (w, _xml ("meta:initial-creator")); xmlTextWriterWriteString (w, _xml (strtok (pw->pw_gecos, ","))); xmlTextWriterEndElement (w); xmlTextWriterStartElement (w, _xml ("dc:creator")); xmlTextWriterWriteString (w, _xml (strtok (pw->pw_gecos, ","))); xmlTextWriterEndElement (w); } } #endif xmlTextWriterEndElement (w); xmlTextWriterEndElement (w); xmlTextWriterEndDocument (w); xmlFreeTextWriter (w); zip_writer_add (odt->zip, file, "meta.xml"); close_temp_file (file); } static struct output_driver * odt_create (struct file_handle *fh, enum settings_output_devices device_type, struct string_map *o UNUSED) { struct output_driver *d; struct odt_driver *odt; struct zip_writer *zip; const char *file_name = fh_get_file_name (fh); zip = zip_writer_create (file_name); if (zip == NULL) return NULL; odt = xzalloc (sizeof *odt); d = &odt->driver; output_driver_init (d, &odt_driver_class, file_name, device_type); odt->zip = zip; odt->handle = fh; odt->file_name = xstrdup (file_name); zip_writer_add_string (zip, "mimetype", "application/vnd.oasis.opendocument.text"); /* Create the manifest */ create_writer (&odt->manifest_file, &odt->manifest_wtr); xmlTextWriterStartElement (odt->manifest_wtr, _xml("manifest:manifest")); xmlTextWriterWriteAttribute (odt->manifest_wtr, _xml("xmlns:manifest"), _xml("urn:oasis:names:tc:opendocument:xmlns:manifest:1.0")); /* Add a manifest entry for the document as a whole */ xmlTextWriterStartElement (odt->manifest_wtr, _xml("manifest:file-entry")); xmlTextWriterWriteAttribute (odt->manifest_wtr, _xml("manifest:media-type"), _xml("application/vnd.oasis.opendocument.text")); xmlTextWriterWriteAttribute (odt->manifest_wtr, _xml("manifest:full-path"), _xml("/")); xmlTextWriterEndElement (odt->manifest_wtr); write_meta_data (odt); write_style_data (odt); create_writer (&odt->content_file, &odt->content_wtr); register_file (odt, "content.xml"); /* Some necessary junk at the start */ xmlTextWriterStartElement (odt->content_wtr, _xml("office:document-content")); xmlTextWriterWriteAttribute (odt->content_wtr, _xml("xmlns:office"), _xml("urn:oasis:names:tc:opendocument:xmlns:office:1.0")); xmlTextWriterWriteAttribute (odt->content_wtr, _xml("xmlns:text"), _xml("urn:oasis:names:tc:opendocument:xmlns:text:1.0")); xmlTextWriterWriteAttribute (odt->content_wtr, _xml("xmlns:table"), _xml("urn:oasis:names:tc:opendocument:xmlns:table:1.0")); xmlTextWriterWriteAttribute (odt->content_wtr, _xml("office:version"), _xml("1.1")); xmlTextWriterStartElement (odt->content_wtr, _xml("office:body")); xmlTextWriterStartElement (odt->content_wtr, _xml("office:text")); /* Close the manifest */ xmlTextWriterEndElement (odt->manifest_wtr); xmlTextWriterEndDocument (odt->manifest_wtr); xmlFreeTextWriter (odt->manifest_wtr); zip_writer_add (odt->zip, odt->manifest_file, "META-INF/manifest.xml"); close_temp_file (odt->manifest_file); return d; } static void odt_destroy (struct output_driver *driver) { struct odt_driver *odt = odt_driver_cast (driver); if (odt->content_wtr != NULL) { xmlTextWriterEndElement (odt->content_wtr); /* office:text */ xmlTextWriterEndElement (odt->content_wtr); /* office:body */ xmlTextWriterEndElement (odt->content_wtr); /* office:document-content */ xmlTextWriterEndDocument (odt->content_wtr); xmlFreeTextWriter (odt->content_wtr); zip_writer_add (odt->zip, odt->content_file, "content.xml"); close_temp_file (odt->content_file); zip_writer_close (odt->zip); } fh_unref (odt->handle); free (odt->file_name); free (odt); } static void write_xml_with_line_breaks (struct odt_driver *odt, const char *line_) { xmlTextWriterPtr writer = odt->content_wtr; if (!strchr (line_, '\n')) xmlTextWriterWriteString (writer, _xml(line_)); else { char *line = xstrdup (line_); char *newline; char *p; for (p = line; *p; p = newline + 1) { newline = strchr (p, '\n'); if (!newline) { xmlTextWriterWriteString (writer, _xml(p)); free (line); return; } if (newline > p && newline[-1] == '\r') newline[-1] = '\0'; else *newline = '\0'; xmlTextWriterWriteString (writer, _xml(p)); xmlTextWriterWriteElement (writer, _xml("text:line-break"), _xml("")); } } } static void write_footnote (struct odt_driver *odt, const struct footnote *f) { xmlTextWriterStartElement (odt->content_wtr, _xml("text:note")); xmlTextWriterWriteAttribute (odt->content_wtr, _xml("text:note-class"), _xml("footnote")); xmlTextWriterStartElement (odt->content_wtr, _xml("text:note-citation")); if (strlen (f->marker) > 1) xmlTextWriterWriteFormatAttribute (odt->content_wtr, _xml("text:label"), "(%s)", f->marker); else xmlTextWriterWriteAttribute (odt->content_wtr, _xml("text:label"), _xml(f->marker)); xmlTextWriterEndElement (odt->content_wtr); xmlTextWriterStartElement (odt->content_wtr, _xml("text:note-body")); xmlTextWriterStartElement (odt->content_wtr, _xml("text:p")); write_xml_with_line_breaks (odt, f->content); xmlTextWriterEndElement (odt->content_wtr); xmlTextWriterEndElement (odt->content_wtr); xmlTextWriterEndElement (odt->content_wtr); } static void write_table_item_text (struct odt_driver *odt, const struct table_item_text *text) { if (!text) return; xmlTextWriterStartElement (odt->content_wtr, _xml("text:h")); xmlTextWriterWriteFormatAttribute (odt->content_wtr, _xml("text:outline-level"), "%d", 2); xmlTextWriterWriteString (odt->content_wtr, _xml (text->content)); for (size_t i = 0; i < text->n_footnotes; i++) write_footnote (odt, text->footnotes[i]); xmlTextWriterEndElement (odt->content_wtr); } static void write_table_item_layers (struct odt_driver *odt, const struct table_item_layers *layers) { if (!layers) return; for (size_t i = 0; i < layers->n_layers; i++) { const struct table_item_layer *layer = &layers->layers[i]; xmlTextWriterStartElement (odt->content_wtr, _xml("text:h")); xmlTextWriterWriteFormatAttribute (odt->content_wtr, _xml("text:outline-level"), "%d", 2); xmlTextWriterWriteString (odt->content_wtr, _xml (layer->content)); for (size_t i = 0; i < layer->n_footnotes; i++) write_footnote (odt, layer->footnotes[i]); xmlTextWriterEndElement (odt->content_wtr); } } static void write_table (struct odt_driver *odt, const struct table_item *item) { const struct table *tab = table_item_get_table (item); int r, c; /* Write a heading for the table */ write_table_item_text (odt, table_item_get_title (item)); write_table_item_layers (odt, table_item_get_layers (item)); /* Start table */ xmlTextWriterStartElement (odt->content_wtr, _xml("table:table")); xmlTextWriterWriteFormatAttribute (odt->content_wtr, _xml("table:name"), "TABLE-%d", odt->table_num++); /* Start column definitions */ xmlTextWriterStartElement (odt->content_wtr, _xml("table:table-column")); xmlTextWriterWriteFormatAttribute (odt->content_wtr, _xml("table:number-columns-repeated"), "%d", table_nc (tab)); xmlTextWriterEndElement (odt->content_wtr); /* Deal with row headers */ if (table_ht (tab) > 0) xmlTextWriterStartElement (odt->content_wtr, _xml("table:table-header-rows")); /* Write all the rows */ for (r = 0 ; r < table_nr (tab); ++r) { /* Start row definition */ xmlTextWriterStartElement (odt->content_wtr, _xml("table:table-row")); /* Write all the columns */ for (c = 0 ; c < table_nc (tab) ; ++c) { struct table_cell cell; table_get_cell (tab, c, r, &cell); if (c == cell.d[TABLE_HORZ][0] && r == cell.d[TABLE_VERT][0]) { int colspan = table_cell_colspan (&cell); int rowspan = table_cell_rowspan (&cell); xmlTextWriterStartElement (odt->content_wtr, _xml("table:table-cell")); xmlTextWriterWriteAttribute (odt->content_wtr, _xml("office:value-type"), _xml("string")); if (colspan > 1) xmlTextWriterWriteFormatAttribute ( odt->content_wtr, _xml("table:number-columns-spanned"), "%d", colspan); if (rowspan > 1) xmlTextWriterWriteFormatAttribute ( odt->content_wtr, _xml("table:number-rows-spanned"), "%d", rowspan); xmlTextWriterStartElement (odt->content_wtr, _xml("text:p")); if (r < table_ht (tab) || c < table_hl (tab)) xmlTextWriterWriteAttribute (odt->content_wtr, _xml("text:style-name"), _xml("Table_20_Heading")); else xmlTextWriterWriteAttribute (odt->content_wtr, _xml("text:style-name"), _xml("Table_20_Contents")); if (cell.options & TAB_MARKUP) { /* XXX */ char *s = output_get_text_from_markup (cell.text); write_xml_with_line_breaks (odt, s); free (s); } else write_xml_with_line_breaks (odt, cell.text); for (int i = 0; i < cell.n_footnotes; i++) write_footnote (odt, cell.footnotes[i]); xmlTextWriterEndElement (odt->content_wtr); /* text:p */ xmlTextWriterEndElement (odt->content_wtr); /* table:table-cell */ } else { xmlTextWriterStartElement (odt->content_wtr, _xml("table:covered-table-cell")); xmlTextWriterEndElement (odt->content_wtr); } } xmlTextWriterEndElement (odt->content_wtr); /* row */ if (table_ht (tab) > 0 && r == table_ht (tab) - 1) xmlTextWriterEndElement (odt->content_wtr); /* table-header-rows */ } xmlTextWriterEndElement (odt->content_wtr); /* table */ /* Write a caption for the table */ write_table_item_text (odt, table_item_get_caption (item)); } static void odt_output_text (struct odt_driver *odt, const char *text) { xmlTextWriterStartElement (odt->content_wtr, _xml("text:p")); xmlTextWriterWriteString (odt->content_wtr, _xml(text)); xmlTextWriterEndElement (odt->content_wtr); } /* Submit a table to the ODT driver */ static void odt_submit (struct output_driver *driver, const struct output_item *output_item) { struct odt_driver *odt = odt_driver_cast (driver); if (is_table_item (output_item)) write_table (odt, to_table_item (output_item)); else if (is_text_item (output_item)) odt_output_text (odt, text_item_get_text (to_text_item (output_item))); else if (is_message_item (output_item)) { const struct message_item *message_item = to_message_item (output_item); char *s = msg_to_string (message_item_get_msg (message_item)); odt_output_text (odt, s); free (s); } } struct output_driver_factory odt_driver_factory = { "odt", "pspp.odf", odt_create }; static const struct output_driver_class odt_driver_class = { "odf", odt_destroy, odt_submit, NULL, }; pspp-1.4.1/src/output/pivot-table.h0000644000175000017500000006441513670210420016646 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2017-2018 Free Software Foundation, Inc. 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 3 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, see . */ #ifndef OUTPUT_PIVOT_TABLE_H #define OUTPUT_PIVOT_TABLE_H 1 #include #include #include "data/format.h" #include "data/settings.h" #include "libpspp/compiler.h" #include "libpspp/hmap.h" #include "output/table.h" struct pivot_value; struct variable; union value; /* Pivot tables. Pivot tables are PSPP's primary form of output. They are analogous to the pivot tables you might be familiar with from spreadsheets and databases. See https://en.wikipedia.org/wiki/Pivot_table for a brief introduction to the overall concept of a pivot table. In PSPP, the most important internal pieces of a pivot table are: - Title. Every pivot table has a title that is displayed above it. It also has an optional caption (displayed below it) and corner text (displayed in the upper left corner). - Dimensions. A dimension consists of zero or more categories. A category has a label, such as "df" or "Asymp. Sig." or 123 or a variable name. The categories are the leaves of a tree whose non-leaf nodes form groups of categories. The tree always has a root group whose label is the name of the dimension. - Axes. A table has three axes: column, row, and layer. Each dimension is assigned to an axis, and each axis has zero or more dimensions. When an axis has more than one dimension, they are ordered from innermost to outermost. - Data. A table's data consists of zero or more cells. Each cell maps from a category for each dimension to a value, which is commonly a number but could also be a variable name or an arbitrary text string. Creating a pivot table usually consists of the following steps: 1. Create the table with pivot_table_create(), passing in the title. It's commonly useful to set up a few options at this point: - If empty rows or columns should not be displayed, set ->omit_empty to true. - Set the format to use for "count" values with pivot_table_set_weight_var() or pivot_table_set_weight_format(). 2. Create each dimension with pivot_dimension_create() and populate it with categories and, possibly, with groups that contain the categories. This call also assigns the dimension to an axis. In simple cases, only a call to pivot_dimension_create() is needed. Other functions such as pivot_category_create_group() can be used for hierarchies of categories. Sometimes it's easier to create categories in tandem with inserting data, for example by adding a category for a variable just before inserting the first cell for that variable. In that case, creating categories and inserting data can be interleaved. 3. Insert data. For each cell, supply the category indexes, which are assigned starting from 0 in the order in which the categories were created in step 2, and the value to go in the cell. If the table has a small, fixed number of dimensions, functions like, e.g. pivot_table_put3() for 3 dimensions, can be used. The general function pivot_table_put() works for other cases. 4. Output the table for user consumption. Use pivot_table_submit(). */ /* Pivot table display styling. */ /* Areas of a pivot table for styling purposes. */ enum pivot_area { PIVOT_AREA_TITLE, PIVOT_AREA_CAPTION, PIVOT_AREA_FOOTER, /* Footnotes. */ PIVOT_AREA_CORNER, /* Top-left corner. */ PIVOT_AREA_COLUMN_LABELS, PIVOT_AREA_ROW_LABELS, PIVOT_AREA_DATA, PIVOT_AREA_LAYERS, /* Layer indication. */ PIVOT_N_AREAS }; const char *pivot_area_to_string (enum pivot_area); const struct area_style *pivot_area_get_default_style (enum pivot_area); /* Table borders for styling purposes. */ enum pivot_border { PIVOT_BORDER_TITLE, /* Outer frame. */ PIVOT_BORDER_OUTER_LEFT, PIVOT_BORDER_OUTER_TOP, PIVOT_BORDER_OUTER_RIGHT, PIVOT_BORDER_OUTER_BOTTOM, /* Inner frame. */ PIVOT_BORDER_INNER_LEFT, PIVOT_BORDER_INNER_TOP, PIVOT_BORDER_INNER_RIGHT, PIVOT_BORDER_INNER_BOTTOM, /* Data area. */ PIVOT_BORDER_DATA_LEFT, PIVOT_BORDER_DATA_TOP, /* Dimensions. */ PIVOT_BORDER_DIM_ROW_HORZ, PIVOT_BORDER_DIM_ROW_VERT, PIVOT_BORDER_DIM_COL_HORZ, PIVOT_BORDER_DIM_COL_VERT, /* Categories. */ PIVOT_BORDER_CAT_ROW_HORZ, PIVOT_BORDER_CAT_ROW_VERT, PIVOT_BORDER_CAT_COL_HORZ, PIVOT_BORDER_CAT_COL_VERT, PIVOT_N_BORDERS }; const char *pivot_border_to_string (enum pivot_border); void pivot_border_get_default_style (enum pivot_border, struct table_border_style *); /* Sizing for rows or columns of a rendered table. The comments below talk about columns and their widths but they apply equally to rows and their heights. */ struct pivot_table_sizing { /* Minimum and maximum column width, in 1/96" units. */ int range[2]; /* Specific column widths, in 1/96" units. */ int *widths; size_t n_widths; /* Specific page breaks: 0-based columns after which a page break must occur, e.g. a value of 1 requests a break after the second column. */ size_t *breaks; size_t n_breaks; /* Keeps: columns to keep together on a page if possible. */ struct pivot_keep *keeps; size_t n_keeps; }; void pivot_table_sizing_uninit (struct pivot_table_sizing *); /* A set of columns to keep together on a page if possible, e.g. ofs=1, n=10 requests keeping together the 2nd through 11th columns. */ struct pivot_keep { size_t ofs; /* 0-based first column. */ size_t n; /* Number of columns. */ }; /* Axes. */ enum pivot_axis_type { PIVOT_AXIS_LAYER, PIVOT_AXIS_ROW, PIVOT_AXIS_COLUMN, PIVOT_N_AXES }; const char *pivot_axis_type_to_string (enum pivot_axis_type); /* An axis within a pivot table. */ struct pivot_axis { /* dimensions[0] is the innermost dimension, dimensions[1] is the next outer dimension, ... dimensions[n_dimensions - 1] is the outermost dimension. */ struct pivot_dimension **dimensions; size_t n_dimensions; /* The number of rows or columns along the axis, that is, the product of dimension[*]->n_leaves. It is 0 if any dimension has 0 leaves. */ size_t extent; /* Sum of dimensions[*]->label_depth. */ size_t label_depth; }; /* Successively assigns to INDEXES (which should be a "size_t *") each of the combinations of the categories in AXIS's dimensions, in lexicographic order with the innermost dimension iterating most quickly. The value assigned to INDEXES is dynamically allocated. If the client breaks out of the loop prematurely, it needs to free it with free(). */ #define PIVOT_AXIS_FOR_EACH(INDEXES, AXIS) \ for ((INDEXES) = NULL; \ ((INDEXES) = pivot_axis_iterator_next (INDEXES, AXIS)) != NULL;) size_t *pivot_axis_iterator_next (size_t *indexes, const struct pivot_axis *); /* Dimensions. A pivot_dimension identifies the categories associated with a single dimension within a multidimensional pivot table. A dimension contains a collection of categories, which are the leaves in a tree of groups. (A dimension or a group can contain zero categories, but this is unusual. If a dimension contains no categories, then its table cannot contain any data.) */ struct pivot_dimension { /* table->axes[axis_type]->dimensions[level] == dimension. */ struct pivot_table *table; enum pivot_axis_type axis_type; size_t level; /* 0 for innermost dimension within axis. */ /* table->dimensions[top_index] == dimension. */ size_t top_index; /* Hierarchy of categories within the dimension. The groups and categories are sorted in the order that should be used for display. This might be different from the original order produced for output if the user adjusted it. The root must always be a group, although it is allowed to have no subcategories. */ struct pivot_category *root; /* All of the leaves reachable via the root. The indexing for presentation_leaves is presentation order, thus presentation_leaves[i]->presentation_index == i. This order is the same as would be produced by an in-order traversal of the groups. It is the order into which the user reordered or sorted the categories. The indexing for data_leaves is that used for idx[] in struct pivot_cell, thus data_leaves[i]->data_index == i. This might differ from what an in-order traversal of 'root' would yield, if the user reordered categories. */ struct pivot_category **data_leaves; struct pivot_category **presentation_leaves; size_t n_leaves, allocated_leaves; /* Display. */ bool hide_all_labels; /* Number of rows or columns needed to express the labels. */ int label_depth; }; struct pivot_dimension *pivot_dimension_create ( struct pivot_table *, enum pivot_axis_type, const char *name, ...) SENTINEL (0); #define pivot_dimension_create(...) \ pivot_dimension_create(__VA_ARGS__, NULL_SENTINEL) struct pivot_dimension *pivot_dimension_create__ (struct pivot_table *, enum pivot_axis_type, struct pivot_value *name); void pivot_dimension_destroy (struct pivot_dimension *); void pivot_dimension_dump (const struct pivot_dimension *, int indentation); /* A pivot_category is a leaf (a category) or a group: - For a leaf, neither index is SIZE_MAX. - For a group, both indexes are SIZE_MAX. Do not use 'subs' or 'n_subs' to determine whether a category is a group, because a group may (pathologically) have no leaves. */ struct pivot_category { struct pivot_value *name; struct pivot_category *parent; struct pivot_dimension *dimension; size_t label_depth, extra_depth; /* Groups only. If show_label is true, then the group itself has a row (or a column) giving the group's name. Otherwise, the group's own name is not displayed. */ struct pivot_category **subs; /* Child categories or groups. */ size_t n_subs, allocated_subs; bool show_label; /* Display a label for the group itself? */ bool show_label_in_corner; /* Leaf only. */ struct fmt_spec format; size_t group_index; /* In ->parent->subs[]. */ size_t data_index; /* In ->dimension->data_leaves[]. */ size_t presentation_index; /* In ->dimension->presentation_leaves[]. */ }; static inline bool pivot_category_is_group (const struct pivot_category *category) { return category->data_index == SIZE_MAX; } static inline bool pivot_category_is_leaf (const struct pivot_category *category) { return !pivot_category_is_group (category); } /* Creating leaf categories. */ int pivot_category_create_leaves (struct pivot_category *parent, ...) SENTINEL (0); #define pivot_category_create_leaves(...) \ pivot_category_create_leaves(__VA_ARGS__, NULL_SENTINEL) int pivot_category_create_leaf ( struct pivot_category *parent, struct pivot_value *name); int pivot_category_create_leaf_rc ( struct pivot_category *parent, struct pivot_value *name, const char *rc); /* Creating category groups. */ struct pivot_category *pivot_category_create_group ( struct pivot_category *parent, const char *name, ...) SENTINEL (0); #define pivot_category_create_group(...) \ pivot_category_create_group(__VA_ARGS__, NULL_SENTINEL) struct pivot_category *pivot_category_create_group__ ( struct pivot_category *parent, struct pivot_value *name); void pivot_category_destroy (struct pivot_category *); /* Pivot result classes. These are used to mark leaf categories as having particular types of data, to set their numeric formats. The formats that actually get used for these classes are in the result_classes[] global array in pivot-table.c, except that PIVOT_RC_OTHER comes from settings_get_format() and PIVOT_RC_COUNT should come from the weight variable in the dataset's dictionary. */ #define PIVOT_RC_OTHER ("RC_OTHER") #define PIVOT_RC_INTEGER ("RC_INTEGER") #define PIVOT_RC_CORRELATION ("RC_CORRELATIONS") #define PIVOT_RC_SIGNIFICANCE ("RC_SIGNIFICANCE") #define PIVOT_RC_PERCENT ("RC_PERCENT") #define PIVOT_RC_RESIDUAL ("RC_RESIDUAL") #define PIVOT_RC_COUNT ("RC_COUNT") bool pivot_result_class_change (const char *, const struct fmt_spec *); /* A pivot table. See the top of this file for more information. */ struct pivot_table { /* Reference count. A pivot_table may be shared between multiple owners, indicated by a reference count greater than 1. When this is the case, the pivot_table must not be modified. */ int ref_cnt; /* Display settings. */ bool rotate_inner_column_labels; bool rotate_outer_row_labels; bool row_labels_in_corner; bool show_grid_lines; bool show_caption; bool omit_empty; /* Omit empty rows and columns? */ size_t *current_layer; /* axis[PIVOT_AXIS_LAYER].n_dimensions elements. */ char *table_look; enum settings_value_show show_values; enum settings_value_show show_variables; struct fmt_spec weight_format; /* Footnote display settings. */ bool show_numeric_markers; bool footnote_marker_superscripts; /* Column and row sizing and page breaks. sizing[TABLE_HORZ] is for columns, sizing[TABLE_VERT] is for rows. */ struct pivot_table_sizing sizing[TABLE_N_AXES]; /* Print settings. */ bool print_all_layers; bool paginate_layers; bool shrink_to_fit[TABLE_N_AXES]; bool top_continuation, bottom_continuation; char *continuation; size_t n_orphan_lines; /* Format settings. */ int epoch; char decimal; /* Usually ',' or '.'. */ char grouping; /* Usually '.' or ','. */ char *ccs[5]; /* Custom currency. */ double small; /* Command information. */ char *command_local; /* May be NULL. */ char *command_c; /* May be NULL. */ char *language; /* May be NULL. */ char *locale; /* May be NULL. */ /* Source information. */ char *dataset; /* May be NULL. */ char *datafile; /* May be NULL. */ time_t date; /* May be 0 if unknown. */ /* Footnotes. */ struct pivot_footnote **footnotes; size_t n_footnotes, allocated_footnotes; /* Titles. */ struct pivot_value *title; struct pivot_value *subtype; /* Same as spv_item's subtype. */ struct pivot_value *corner_text; struct pivot_value *caption; char *notes; /* Styles. */ struct area_style areas[PIVOT_N_AREAS]; struct table_border_style borders[PIVOT_N_BORDERS]; /* Dimensions. */ struct pivot_dimension **dimensions; size_t n_dimensions; /* Allocation of dimensions to rows, columns, and layers. */ struct pivot_axis axes[PIVOT_N_AXES]; struct hmap cells; /* Contains "struct pivot_cell"s. */ }; /* Creating and destroy pivot tables. */ struct pivot_table *pivot_table_create (const char *title); struct pivot_table *pivot_table_create__ (struct pivot_value *title, const char *subtype); struct pivot_table *pivot_table_create_for_text (struct pivot_value *title, struct pivot_value *content); struct pivot_table *pivot_table_ref (const struct pivot_table *); void pivot_table_unref (struct pivot_table *); bool pivot_table_is_shared (const struct pivot_table *); /* Format of PIVOT_RC_COUNT cells. */ void pivot_table_set_weight_var (struct pivot_table *, const struct variable *); void pivot_table_set_weight_format (struct pivot_table *, const struct fmt_spec *); /* Query. */ bool pivot_table_is_empty (const struct pivot_table *); /* Output. */ void pivot_table_submit (struct pivot_table *); /* Data cells. */ void pivot_table_put (struct pivot_table *, const size_t *dindexes, size_t n, struct pivot_value *); void pivot_table_put1 (struct pivot_table *, size_t idx1, struct pivot_value *); void pivot_table_put2 (struct pivot_table *, size_t idx1, size_t idx2, struct pivot_value *); void pivot_table_put3 (struct pivot_table *, size_t idx1, size_t idx2, size_t idx3, struct pivot_value *); void pivot_table_put4 (struct pivot_table *, size_t idx1, size_t idx2, size_t idx3, size_t idx4, struct pivot_value *); const struct pivot_value *pivot_table_get (const struct pivot_table *, const size_t *dindexes); struct pivot_value *pivot_table_get_rw (struct pivot_table *, const size_t *dindexes); /* Footnotes. Use pivot_table_create_footnote() to create a footnote. Use pivot_value_add_footnote() to add a reference to a footnote. */ struct pivot_footnote { size_t idx; struct pivot_value *content; struct pivot_value *marker; bool show; }; struct pivot_footnote *pivot_table_create_footnote ( struct pivot_table *, struct pivot_value *content); struct pivot_footnote *pivot_table_create_footnote__ ( struct pivot_table *, size_t idx, struct pivot_value *marker, struct pivot_value *content); void pivot_footnote_destroy (struct pivot_footnote *); /* Internals. */ void pivot_table_convert_indexes_ptod (const struct pivot_table *, const size_t *pindexes[PIVOT_N_AXES], size_t *dindexes); size_t *pivot_table_enumerate_axis (const struct pivot_table *, enum pivot_axis_type, const size_t *layer_indexes, bool omit_empty, size_t *n); #define PIVOT_ENUMERATION_FOR_EACH(INDEXES, ENUMERATION, AXIS) \ for ((INDEXES) = (ENUMERATION); *(INDEXES) != SIZE_MAX; \ (INDEXES) += MAX (1, (AXIS)->n_dimensions)) void pivot_table_assign_label_depth (struct pivot_table *); void pivot_table_dump (const struct pivot_table *, int indentation); /* pivot_value. */ enum pivot_value_type { PIVOT_VALUE_NUMERIC, /* A value of a numeric variable. */ PIVOT_VALUE_STRING, /* A value of a string variable. */ PIVOT_VALUE_VARIABLE, /* Name of a variable. */ PIVOT_VALUE_TEXT, /* Text. */ PIVOT_VALUE_TEMPLATE, /* Templated text. */ }; /* A pivot_value is the content of a single pivot table cell. A pivot_value is also a pivot table's title, caption, footnote marker and contents, and so on. A given pivot_value is one of: 1. A number resulting from a calculation (PIVOT_VALUE_NUMERIC). Use pivot_value_new_number() to create such a pivot_value. A numeric pivot_value has an associated display format (usually an F or PCT format). This format can be set directly on the pivot_value, but that is not usually the easiest way. Instead, it is usually true that all of the values in a single category should have the same format (e.g. all "Significance" values might use format F40.3), so PSPP makes it easy to set the default format for a category while creating the category. See pivot_dimension_create() for more details. For numbers that should be displayed as integers, pivot_value_new_integer() can occasionally be a useful special case. 2. A numeric or string value obtained from data (PIVOT_VALUE_NUMERIC or PIVOT_VALUE_STRING). If such a value corresponds to a variable, then the variable's name can be attached to the pivot_value. If the value has a value label, then that can also be attached. When a label is present, the user can control whether to show the value or the label or both. Use pivot_value_new_var_value() to create pivot_values of these kinds. 3. A variable name (PIVOT_VALUE_VARIABLE). The variable label, if any, can be attached too, and again the user can control whether to show the value or the label or both. 4. A text string (PIVOT_VALUE_TEXT). The value stores the string in English and translated into the output language (localized). Use pivot_value_new_text() or pivot_value_new_text_format() for those cases. In some cases, only an English or a localized version is available for one reason or another, although this is regrettable; in those cases, use pivot_value_new_user_text() or pivot_value_new_user_text_nocopy(). (There is also a PIVOT_VALUE_TEMPLATE but PSPP does not yet create these itself.) Footnotes ========= A pivot_value may reference any number of footnotes. Use pivot_value_add_footnote() to add a footnote reference. The footnotes being referenced must first be created with pivot_table_create_footnote(). Styling ======= A pivot_value can have specific font and cell styles. Only the user should add these. */ struct pivot_value { struct font_style *font_style; struct cell_style *cell_style; char **subscripts; size_t n_subscripts; char *superscript; const struct pivot_footnote **footnotes; size_t n_footnotes; enum pivot_value_type type; union { /* PIVOT_VALUE_NUMERIC. */ struct { double x; /* The numeric value. */ struct fmt_spec format; /* Format to display 'x'. */ char *var_name; /* May be NULL. */ char *value_label; /* May be NULL. */ enum settings_value_show show; /* Show value or label or both? */ } numeric; /* PIVOT_VALUE_STRING. */ struct { char *s; /* The string value. */ bool hex; /* Display in hex? */ char *var_name; /* May be NULL. */ char *value_label; /* May be NULL. */ enum settings_value_show show; /* Show value or label or both? */ } string; /* PIVOT_VALUE_VARIABLE. */ struct { char *var_name; char *var_label; /* May be NULL. */ enum settings_value_show show; /* Show name or label or both? */ } variable; /* PIVOT_VALUE_TEXT. */ struct { char *local; /* Localized. */ char *c; /* English. */ char *id; /* Identifier. */ bool user_provided; } text; /* PIVOT_VALUE_TEMPLATE. */ struct { char *local; /* Localized. */ char *id; /* Identifier. */ struct pivot_argument *args; size_t n_args; } template; }; }; /* Numbers resulting from calculations. */ struct pivot_value *pivot_value_new_number (double); struct pivot_value *pivot_value_new_integer (double); /* Values from data. */ struct pivot_value *pivot_value_new_var_value ( const struct variable *, const union value *); struct pivot_value *pivot_value_new_value (const union value *, int width, const struct fmt_spec *, const char *encoding); /* Values from variable names. */ struct pivot_value *pivot_value_new_variable (const struct variable *); /* Values from text strings. */ struct pivot_value *pivot_value_new_text (const char *); struct pivot_value *pivot_value_new_text_format (const char *, ...) PRINTF_FORMAT (1, 2); struct pivot_value *pivot_value_new_user_text (const char *, size_t length); struct pivot_value *pivot_value_new_user_text_nocopy (char *); /* Footnotes. */ void pivot_value_add_footnote (struct pivot_value *, const struct pivot_footnote *); /* Numeric formats. */ void pivot_value_set_rc (const struct pivot_table *, struct pivot_value *, const char *rc); /* Converting a pivot_value to a string for display. */ char *pivot_value_to_string (const struct pivot_value *, enum settings_value_show show_values, enum settings_value_show show_variables); void pivot_value_format (const struct pivot_value *, enum settings_value_show show_values, enum settings_value_show show_variables, struct string *); bool pivot_value_format_body (const struct pivot_value *, enum settings_value_show show_values, enum settings_value_show show_variables, struct string *); void pivot_value_destroy (struct pivot_value *); /* Styling. */ void pivot_value_get_style (struct pivot_value *, const struct font_style *base_font_style, const struct cell_style *base_cell_style, struct area_style *); void pivot_value_set_style (struct pivot_value *, const struct area_style *); /* Template arguments. */ struct pivot_argument { size_t n; struct pivot_value **values; }; void pivot_argument_uninit (struct pivot_argument *); /* One piece of data within a pivot table. */ struct pivot_cell { struct hmap_node hmap_node; /* In struct pivot_table's 'cells' hmap. */ struct pivot_value *value; unsigned int idx[]; /* One index per table dimension. */ }; #endif /* output/pivot-table.h */ pspp-1.4.1/src/output/automake.mk0000644000175000017500000000631113602145300016374 0ustar00blpblp00000000000000# PSPP - a program for statistical analysis. # Copyright (C) 2017 Free Software Foundation, Inc. # # 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 3 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, see . # ## Process this file with automake to produce Makefile.in -*- makefile -*- noinst_LTLIBRARIES += src/output/liboutput.la src_output_liboutput_la_CPPFLAGS = $(LIBXML2_CFLAGS) $(AM_CPPFLAGS) src_output_liboutput_la_SOURCES = \ src/output/ascii.c \ src/output/ascii.h \ src/output/chart-item-provider.h \ src/output/chart-item.c \ src/output/chart-item.h \ src/output/charts/boxplot.c \ src/output/charts/boxplot.h \ src/output/charts/np-plot.c \ src/output/charts/np-plot.h \ src/output/charts/barchart.c \ src/output/charts/barchart.h \ src/output/charts/piechart.c \ src/output/charts/piechart.h \ src/output/charts/plot-hist.c \ src/output/charts/plot-hist.h \ src/output/charts/roc-chart.c \ src/output/charts/roc-chart.h \ src/output/charts/spreadlevel-plot.c \ src/output/charts/spreadlevel-plot.h \ src/output/charts/scree.c \ src/output/charts/scree.h \ src/output/charts/scatterplot.c \ src/output/charts/scatterplot.h \ src/output/csv.c \ src/output/driver-provider.h \ src/output/driver.c \ src/output/driver.h \ src/output/group-item.c \ src/output/group-item.h \ src/output/html.c \ src/output/journal.c \ src/output/journal.h \ src/output/measure.c \ src/output/measure.h \ src/output/message-item.c \ src/output/message-item.h \ src/output/msglog.c \ src/output/msglog.h \ src/output/odt.c \ src/output/options.c \ src/output/options.h \ src/output/output-item-provider.h \ src/output/output-item.c \ src/output/output-item.h \ src/output/page-setup-item.c \ src/output/page-setup-item.h \ src/output/pivot-output.c \ src/output/pivot-table.c \ src/output/pivot-table.h \ src/output/render.c \ src/output/render.h \ src/output/spv-driver.c \ src/output/table-item.c \ src/output/table-item.h \ src/output/table-provider.h \ src/output/table.c \ src/output/table.h \ src/output/text-item.c \ src/output/text-item.h if HAVE_CAIRO src_output_liboutput_la_SOURCES += \ src/output/cairo-chart.c \ src/output/cairo-chart.h \ src/output/cairo.c \ src/output/cairo.h \ src/output/charts/boxplot-cairo.c \ src/output/charts/np-plot-cairo.c \ src/output/charts/barchart-cairo.c \ src/output/charts/piechart-cairo.c \ src/output/charts/plot-hist-cairo.c \ src/output/charts/roc-chart-cairo.c \ src/output/charts/scree-cairo.c \ src/output/charts/spreadlevel-cairo.c \ src/output/charts/scatterplot-cairo.c endif nodist_src_output_liboutput_la_SOURCES = EXTRA_DIST += \ src/output/README \ src/output/mk-class-boilerplate include src/output/spv/automake.mk pspp-1.4.1/src/output/cairo-chart.c0000644000175000017500000004156613711575611016625 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2004, 2009, 2010, 2011, 2014, 2015, 2020 Free Software Foundation, Inc. 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 3 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, see . */ #include #include "output/cairo-chart.h" #include "math/chart-geometry.h" #include #include #include #include #include #include #include #include #include #include "libpspp/assertion.h" #include "math/chart-geometry.h" #include "output/cairo.h" #include "output/chart-item.h" #include "gl/xalloc.h" #include "gl/xvasprintf.h" #include "gettext.h" #define _(msgid) gettext (msgid) void xrchart_geometry_init (cairo_t *cr, struct xrchart_geometry *geom, double width, double length) { /* Set default chart geometry. */ geom->axis[SCALE_ORDINATE].data_max = 0.900 * length; geom->axis[SCALE_ORDINATE].data_min = 0.200 * length; geom->axis[SCALE_ABSCISSA].data_min = 0.150 * width; geom->axis[SCALE_ABSCISSA].data_max = 0.800 * width; geom->abscissa_bottom = 0.070 * length; geom->ordinate_left = 0.050 * width; geom->title_bottom = 0.920 * length; geom->legend_left = 0.810 * width; geom->legend_right = width; geom->font_size = 15.0; geom->in_path = false; geom->dataset = NULL; geom->n_datasets = 0; geom->fill_colour = data_colour[0]; cairo_set_line_width (cr, 1.0); cairo_rectangle (cr, geom->axis[SCALE_ABSCISSA].data_min, geom->axis[SCALE_ORDINATE].data_min, geom->axis[SCALE_ABSCISSA].data_max - geom->axis[SCALE_ABSCISSA].data_min, geom->axis[SCALE_ORDINATE].data_max - geom->axis[SCALE_ORDINATE].data_min); cairo_stroke (cr); } void xrchart_geometry_free (cairo_t *cr UNUSED, struct xrchart_geometry *geom) { int i; for (i = 0 ; i < geom->n_datasets; ++i) free (geom->dataset[i]); free (geom->dataset); } #if ! PANGO_VERSION_CHECK (1, 22, 0) int pango_layout_get_baseline (PangoLayout *layout); /* Shamelessly copied from the pango source */ int pango_layout_get_baseline (PangoLayout *layout) { int baseline; /* XXX this is so inefficient */ PangoLayoutIter *iter = pango_layout_get_iter (layout); baseline = pango_layout_iter_get_baseline (iter); pango_layout_iter_free (iter); return baseline; } #endif /* These colours come from: http://tango.freedesktop.org/static/cvs/tango-art-tools/palettes/Tango-Palette.gpl */ const struct xrchart_colour data_colour[XRCHART_N_COLOURS] = { {252, 233, 79}, /* Butter 1 */ {138, 226, 52}, /* Chameleon 1 */ {252, 175, 62}, /* Orange 1 */ {114, 159, 207}, /* Sky Blue 1 */ {173, 127, 168}, /* Plum 1 */ {233, 185, 110}, /* Chocolate 1 */ {239, 41, 41}, /* Scarlet Red 1 */ {238, 238, 236}, /* Aluminium 1 */ {237, 212, 0}, /* Butter 2 */ {115, 210, 22}, /* Chameleon 2 */ {245, 121, 0}, /* Orange 2 */ {52, 101, 164}, /* Sky Blue 2 */ {117, 80, 123}, /* Plum 2 */ {193, 125, 17}, /* Chocolate 2 */ {204, 0, 0}, /* Scarlet Red 2 */ {136, 138, 133}, /* Aluminium 4 */ {196, 160, 0}, /* Butter 3 */ {78, 154, 6}, /* Chameleon 3 */ {206, 92, 0}, /* Orange 3 */ {32, 74, 135}, /* Sky Blue 3 */ {92, 53, 102}, /* Plum 3 */ {143, 89, 2}, /* Chocolate 3 */ {164, 0, 0}, /* Scarlet Red 3 */ {85, 87, 83}, /* Aluminium 5 */ {211, 215, 207}, /* Aluminium 2 */ {186, 189, 182}, /* Aluminium 3 */ {46, 52, 54}, /* Aluminium 6 */ }; void xrchart_draw_marker (cairo_t *cr, double x, double y, enum xrmarker_type marker, double size) { cairo_save (cr); cairo_translate (cr, x, y); cairo_scale (cr, size / 2.0, size / 2.0); cairo_set_line_width (cr, cairo_get_line_width (cr) / (size / 2.0)); switch (marker) { case XRMARKER_CIRCLE: cairo_arc (cr, 0, 0, 1.0, 0, 2 * M_PI); cairo_stroke (cr); break; case XRMARKER_ASTERISK: cairo_move_to (cr, 0, -1.0); /* | */ cairo_line_to (cr, 0, 1.0); cairo_move_to (cr, -M_SQRT1_2, -M_SQRT1_2); /* / */ cairo_line_to (cr, M_SQRT1_2, M_SQRT1_2); cairo_move_to (cr, -M_SQRT1_2, M_SQRT1_2); /* \ */ cairo_line_to (cr, M_SQRT1_2, -M_SQRT1_2); cairo_stroke (cr); break; case XRMARKER_SQUARE: cairo_rectangle (cr, -1.0, -1.0, 2.0, 2.0); cairo_stroke (cr); break; } cairo_restore (cr); } void xrchart_label_rotate (cairo_t *cr, int horz_justify, int vert_justify, double font_size, const char *string, double angle) { PangoFontDescription *desc; PangoLayout *layout; double x, y; desc = pango_font_description_from_string ("Sans"); if (desc == NULL) { cairo_new_path (cr); return; } pango_font_description_set_absolute_size (desc, font_size * PANGO_SCALE); cairo_save (cr); cairo_rotate (cr, angle); cairo_get_current_point (cr, &x, &y); cairo_translate (cr, x, y); cairo_move_to (cr, 0, 0); cairo_scale (cr, 1.0, -1.0); layout = pango_cairo_create_layout (cr); pango_layout_set_font_description (layout, desc); pango_layout_set_markup (layout, string, -1); if (horz_justify != 'l') { int width_pango; double width; pango_layout_get_size (layout, &width_pango, NULL); width = (double) width_pango / PANGO_SCALE; if (horz_justify == 'r') cairo_rel_move_to (cr, -width, 0); else cairo_rel_move_to (cr, -width / 2.0, 0); } if (vert_justify == 'x') { int baseline_pango = pango_layout_get_baseline (layout); double baseline = (double) baseline_pango / PANGO_SCALE; cairo_rel_move_to (cr, 0, -baseline); } else if (vert_justify != 't') { int height_pango; double height; pango_layout_get_size (layout, NULL, &height_pango); height = (double) height_pango / PANGO_SCALE; if (vert_justify == 'b') cairo_rel_move_to (cr, 0, -height); else if (vert_justify == 'c') cairo_rel_move_to (cr, 0, -height / 2.0); } pango_cairo_show_layout (cr, layout); g_object_unref (layout); cairo_restore (cr); cairo_new_path (cr); pango_font_description_free (desc); } void xrchart_label (cairo_t *cr, int horz_justify, int vert_justify, double font_size, const char *string) { xrchart_label_rotate (cr, horz_justify, vert_justify, font_size, string, 0); } /* Draw a tick mark at position If label is non null, then print it at the tick mark */ static void draw_tick_internal (cairo_t *cr, const struct xrchart_geometry *geom, enum tick_orientation orientation, bool rotated, double position, const char *s); void draw_tick (cairo_t *cr, const struct xrchart_geometry *geom, enum tick_orientation orientation, bool rotated, double position, const char *label, ...) { va_list ap; char *s; va_start (ap, label); s = xvasprintf (label, ap); if (fabs (position) < DBL_EPSILON) position = 0; draw_tick_internal (cr, geom, orientation, rotated, position, s); free (s); va_end (ap); } static void draw_tick_internal (cairo_t *cr, const struct xrchart_geometry *geom, enum tick_orientation orientation, bool rotated, double position, const char *s) { const int tickSize = 10; double x, y; cairo_move_to (cr, geom->axis[SCALE_ABSCISSA].data_min, geom->axis[SCALE_ORDINATE].data_min); if (orientation == SCALE_ABSCISSA) { cairo_rel_move_to (cr, position, 0); cairo_rel_line_to (cr, 0, -tickSize); } else if (orientation == SCALE_ORDINATE) { cairo_rel_move_to (cr, 0, position); cairo_rel_line_to (cr, -tickSize, 0); } else NOT_REACHED (); cairo_get_current_point (cr, &x, &y); cairo_stroke (cr); if (s != NULL) { cairo_move_to (cr, x, y); if (orientation == SCALE_ABSCISSA) { if (rotated) xrchart_label_rotate (cr, 'l', 'c', geom->font_size, s, -G_PI_4); else xrchart_label (cr, 'c', 't', geom->font_size, s); } else if (orientation == SCALE_ORDINATE) { xrchart_label (cr, 'r', 'c', geom->font_size, s); } } } /* Write the title on a chart*/ void xrchart_write_title (cairo_t *cr, const struct xrchart_geometry *geom, const char *title, ...) { va_list ap; char *s; cairo_save (cr); cairo_move_to (cr, geom->axis[SCALE_ABSCISSA].data_min, geom->title_bottom); va_start(ap, title); s = xvasprintf (title, ap); xrchart_label (cr, 'l', 'x', geom->font_size * 1.5, s); free (s); va_end (ap); cairo_restore (cr); } static void xrchart_text_extents (cairo_t *cr, const struct xrchart_geometry *geom, const char *utf8, double *width, double *height) { PangoFontDescription *desc; PangoLayout *layout; int width_pango; int height_pango; desc = pango_font_description_from_string ("Sans"); if (desc == NULL) return; pango_font_description_set_absolute_size (desc, geom->font_size * PANGO_SCALE); layout = pango_cairo_create_layout (cr); pango_layout_set_font_description (layout, desc); pango_layout_set_markup (layout, utf8, -1); pango_layout_get_size (layout, &width_pango, &height_pango); *width = (double) width_pango / PANGO_SCALE; *height = (double) height_pango / PANGO_SCALE; g_object_unref (layout); pango_font_description_free (desc); } static bool xrchart_write_scale (cairo_t *cr, struct xrchart_geometry *geom, double smin, double smax, enum tick_orientation orient) { int s; int ticks; double interval; double lower; double upper; double tickscale; char *tick_format_string; bool tickoversize = false; if (smax == smin) return false; chart_get_scale (smax, smin, &lower, &interval, &ticks); tick_format_string = chart_get_ticks_format (lower, interval, ticks, &tickscale); upper = lower + interval * (ticks+1); geom->axis[orient].max = upper; geom->axis[orient].min = lower; struct xrchart_axis *axis = &geom->axis[orient]; geom->axis[orient].scale = (fabs ((double) axis->data_max - axis->data_min) / fabs (axis->max - axis->min)); if (orient == SCALE_ABSCISSA) { char *test_text; double lower_txt_width, upper_txt_width, unused, width; test_text = xasprintf(tick_format_string, upper*tickscale); xrchart_text_extents (cr, geom, test_text, &upper_txt_width, &unused); free(test_text); test_text = xasprintf(tick_format_string, lower*tickscale); xrchart_text_extents (cr, geom, test_text, &lower_txt_width, &unused); free(test_text); width = MAX(lower_txt_width, upper_txt_width); tickoversize = width > 0.9 * ((double)(geom->axis[SCALE_ABSCISSA].data_max - geom->axis[SCALE_ABSCISSA].data_min))/(ticks+1); } double pos = lower; for (s = 0 ; s <= ticks; ++s) { draw_tick (cr, geom, orient, tickoversize, s * interval * geom->axis[orient].scale, tick_format_string, pos*tickscale); pos += interval; } free(tick_format_string); return true; } /* Set the scale for the ordinate */ bool xrchart_write_yscale (cairo_t *cr, struct xrchart_geometry *geom, double smin, double smax) { return xrchart_write_scale (cr, geom, smin, smax, SCALE_ORDINATE); } /* Set the scale for the abscissa */ bool xrchart_write_xscale (cairo_t *cr, struct xrchart_geometry *geom, double smin, double smax) { return xrchart_write_scale (cr, geom, smin, smax, SCALE_ABSCISSA); } /* Write the abscissa label */ void xrchart_write_xlabel (cairo_t *cr, const struct xrchart_geometry *geom, const char *label) { cairo_move_to (cr, geom->axis[SCALE_ABSCISSA].data_min, geom->abscissa_bottom); xrchart_label (cr, 'l', 't', geom->font_size, label); } /* Write the ordinate label */ void xrchart_write_ylabel (cairo_t *cr, const struct xrchart_geometry *geom, const char *label) { cairo_save (cr); cairo_translate (cr, geom->ordinate_left, geom->axis[SCALE_ORDINATE].data_min); cairo_rotate (cr, M_PI / 2.0); xrchart_label (cr, 'l', 'x', geom->font_size, label); cairo_restore (cr); } void xrchart_write_legend (cairo_t *cr, const struct xrchart_geometry *geom) { int i; const int vstep = geom->font_size * 2; const int xpad = 10; const int ypad = 10; const int swatch = 20; const int legend_top = geom->axis[SCALE_ORDINATE].data_max; const int legend_bottom = legend_top - (vstep * geom->n_datasets + 2 * ypad); cairo_save (cr); cairo_rectangle (cr, geom->legend_left, legend_top, geom->legend_right - xpad - geom->legend_left, legend_bottom - legend_top); cairo_stroke (cr); for (i = 0 ; i < geom->n_datasets ; ++i) { const int ypos = legend_top - vstep * (i + 1); const int xpos = geom->legend_left + xpad; const struct xrchart_colour *colour; cairo_move_to (cr, xpos, ypos); cairo_save (cr); colour = &data_colour [ i % XRCHART_N_COLOURS]; cairo_set_source_rgb (cr, colour->red / 255.0, colour->green / 255.0, colour->blue / 255.0); cairo_rectangle (cr, xpos, ypos, swatch, swatch); cairo_fill_preserve (cr); cairo_stroke (cr); cairo_restore (cr); cairo_move_to (cr, xpos + swatch * 1.5, ypos); xrchart_label (cr, 'l', 'x', geom->font_size, geom->dataset[i]); } cairo_restore (cr); } /* Start a new vector called NAME */ void xrchart_vector_start (cairo_t *cr, struct xrchart_geometry *geom, const char *name) { const struct xrchart_colour *colour; cairo_save (cr); colour = &data_colour[geom->n_datasets % XRCHART_N_COLOURS]; cairo_set_source_rgb (cr, colour->red / 255.0, colour->green / 255.0, colour->blue / 255.0); geom->n_datasets++; geom->dataset = xrealloc (geom->dataset, geom->n_datasets * sizeof (*geom->dataset)); geom->dataset[geom->n_datasets - 1] = strdup (name); } /* Plot a data point */ void xrchart_datum (cairo_t *cr, const struct xrchart_geometry *geom, int dataset UNUSED, double x, double y) { double x_pos = (x - geom->axis[SCALE_ABSCISSA].min) * geom->axis[SCALE_ABSCISSA].scale + geom->axis[SCALE_ABSCISSA].data_min; double y_pos = (y - geom->axis[SCALE_ORDINATE].min) * geom->axis[SCALE_ORDINATE].scale + geom->axis[SCALE_ORDINATE].data_min; xrchart_draw_marker (cr, x_pos, y_pos, XRMARKER_CIRCLE, 10); } void xrchart_vector_end (cairo_t *cr, struct xrchart_geometry *geom) { cairo_stroke (cr); cairo_restore (cr); geom->in_path = false; } /* Plot a data point */ void xrchart_vector (cairo_t *cr, struct xrchart_geometry *geom, double x, double y) { const double x_pos = (x - geom->axis[SCALE_ABSCISSA].min) * geom->axis[SCALE_ABSCISSA].scale + geom->axis[SCALE_ABSCISSA].data_min ; const double y_pos = (y - geom->axis[SCALE_ORDINATE].min) * geom->axis[SCALE_ORDINATE].scale + geom->axis[SCALE_ORDINATE].data_min ; if (geom->in_path) cairo_line_to (cr, x_pos, y_pos); else { cairo_move_to (cr, x_pos, y_pos); geom->in_path = true; } } /* Draw a line with slope SLOPE and intercept INTERCEPT. between the points limit1 and limit2. If lim_dim is XRCHART_DIM_Y then the limit{1,2} are on the y axis otherwise the x axis */ void xrchart_line(cairo_t *cr, const struct xrchart_geometry *geom, double slope, double intercept, double limit1, double limit2, enum xrchart_dim lim_dim) { double x1, y1; double x2, y2; if (lim_dim == XRCHART_DIM_Y) { x1 = (limit1 - intercept) / slope; x2 = (limit2 - intercept) / slope; y1 = limit1; y2 = limit2; } else { x1 = limit1; x2 = limit2; y1 = slope * x1 + intercept; y2 = slope * x2 + intercept; } y1 = (y1 - geom->axis[SCALE_ORDINATE].min) * geom->axis[SCALE_ORDINATE].scale + geom->axis[SCALE_ORDINATE].data_min; y2 = (y2 - geom->axis[SCALE_ORDINATE].min) * geom->axis[SCALE_ORDINATE].scale + geom->axis[SCALE_ORDINATE].data_min; x1 = (x1 - geom->axis[SCALE_ABSCISSA].min) * geom->axis[SCALE_ABSCISSA].scale + geom->axis[SCALE_ABSCISSA].data_min; x2 = (x2 - geom->axis[SCALE_ABSCISSA].min) * geom->axis[SCALE_ABSCISSA].scale + geom->axis[SCALE_ABSCISSA].data_min; cairo_move_to (cr, x1, y1); cairo_line_to (cr, x2, y2); cairo_stroke (cr); } pspp-1.4.1/src/output/msglog.h0000644000175000017500000000167213320146056015711 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2010 Free Software Foundation, Inc. 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 3 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, see . */ #ifndef OUTPUT_MSGLOG_H #define OUTPUT_MSGLOG_H 1 /* Output driver to log errors, warnings, and notes to files. */ struct output_driver *msglog_create (const char *file_name); #endif /* output/msglog.h */ pspp-1.4.1/src/output/README0000644000175000017500000000044213320146056015122 0ustar00blpblp00000000000000The source code in this directory must not call msg() to report errors. This can lead to reentrance in the output driver, because msg() may report error messages using the output driver. Instead, this code should report errors with error(), which will never call into the output drivers. pspp-1.4.1/src/output/chart-item.c0000644000175000017500000000540213413044256016446 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2004, 2009, 2011 Free Software Foundation, Inc. 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 3 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, see . */ #include #include "output/chart-item.h" #include "output/chart-item-provider.h" #include #include #include "libpspp/cast.h" #include "libpspp/compiler.h" #include "output/driver.h" #include "output/output-item-provider.h" #include "gl/xalloc.h" /* Initializes ITEM as a chart item of the specified CLASS. The new chart item initially has the specified TITLE, which may be NULL if no title is yet available. The caller retains ownership of TITLE. A chart item is an abstract class, that is, a plain chart_item is not useful on its own. Thus, this function is normally called from the initialization function of some subclass of chart_item. */ void chart_item_init (struct chart_item *item, const struct chart_item_class *class, const char *title) { output_item_init (&item->output_item, &chart_item_class); item->class = class; item->title = title != NULL ? xstrdup (title) : NULL; } /* Returns ITEM's title, which is a null pointer if no title has been set. */ const char * chart_item_get_title (const struct chart_item *item) { return item->title; } /* Sets ITEM's title to TITLE, replacing any previous title. Specify NULL for TITLE to clear any title from ITEM. The caller retains ownership of TITLE. This function may only be used on a chart_item that is unshared. */ void chart_item_set_title (struct chart_item *item, const char *title) { assert (!chart_item_is_shared (item)); free (item->title); item->title = title != NULL ? xstrdup (title) : NULL; } /* Submits ITEM to the configured output drivers, and transfers ownership to the output subsystem. */ void chart_item_submit (struct chart_item *item) { output_submit (&item->output_item); } static void chart_item_destroy (struct output_item *output_item) { struct chart_item *item = to_chart_item (output_item); char *title = item->title; item->class->destroy (item); free (title); } const struct output_item_class chart_item_class = { "chart", chart_item_destroy, }; pspp-1.4.1/src/output/render.h0000644000175000017500000001416113433403043015672 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2009, 2010, 2011, 2014 Free Software Foundation, Inc. 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 3 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, see . */ #ifndef OUTPUT_RENDER_H #define OUTPUT_RENDER_H 1 #include #include #include "output/table-provider.h" struct table_item; enum render_line_style { RENDER_LINE_NONE, RENDER_LINE_SINGLE, RENDER_LINE_DASHED, RENDER_LINE_THICK, RENDER_LINE_THIN, RENDER_LINE_DOUBLE, RENDER_N_LINES }; /* Parameters for rendering a table_item to a device. Coordinate system ================= The rendering code assumes that larger 'x' is to the right and larger 'y' toward the bottom of the page. The rendering code assumes that the table being rendered has its upper left corner at (0,0) in device coordinates. This is usually not the case from the driver's perspective, so the driver should expect to apply its own offset to coordinates passed to callback functions. Callback functions ================== For each of the callback functions, AUX is passed as the 'aux' member of the render_params structure. */ struct render_params { /* Measures CELL's width. Stores in *MIN_WIDTH the minimum width required to avoid splitting a single word across multiple lines (normally, this is the width of the longest word in the cell) and in *MAX_WIDTH the minimum width required to avoid line breaks other than at new-lines. */ void (*measure_cell_width) (void *aux, const struct table_cell *cell, int *min_width, int *max_width); /* Returns the height required to render CELL given a width of WIDTH. */ int (*measure_cell_height) (void *aux, const struct table_cell *cell, int width); /* Given that there is space measuring WIDTH by HEIGHT to render CELL, where HEIGHT is insufficient to render the entire height of the cell, returns the largest height less than HEIGHT at which it is appropriate to break the cell. For example, if breaking at the specified HEIGHT would break in the middle of a line of text, the return value would be just sufficiently less that the breakpoint would be between lines of text. Optional. If NULL, the rendering engine assumes that all breakpoints are acceptable. */ int (*adjust_break) (void *aux, const struct table_cell *cell, int width, int height); /* Draws a generalized intersection of lines in the rectangle whose top-left corner is (BB[TABLE_HORZ][0], BB[TABLE_VERT][0]) and whose bottom-right corner is (BB[TABLE_HORZ][1], BB[TABLE_VERT][1]). STYLES is interpreted this way: STYLES[TABLE_HORZ][0]: style of line from top of BB to its center. STYLES[TABLE_HORZ][1]: style of line from bottom of BB to its center. STYLES[TABLE_VERT][0]: style of line from left of BB to its center. STYLES[TABLE_VERT][1]: style of line from right of BB to its center. */ void (*draw_line) (void *aux, int bb[TABLE_N_AXES][2], enum render_line_style styles[TABLE_N_AXES][2], struct cell_color colors[TABLE_N_AXES][2]); /* Draws CELL within bounding box BB. CLIP is the same as BB (the common case) or a subregion enclosed by BB. In the latter case only the part of the cell that lies within CLIP should actually be drawn, although BB should used to determine the layout of the cell. */ void (*draw_cell) (void *aux, const struct table_cell *cell, int color_idx, int bb[TABLE_N_AXES][2], int spill[TABLE_N_AXES][2], int clip[TABLE_N_AXES][2]); /* Auxiliary data passed to each of the above functions. */ void *aux; /* Page size to try to fit the rendering into. Some tables will, of course, overflow this size. */ int size[TABLE_N_AXES]; /* Nominal size of a character in the most common font: font_size[TABLE_HORZ]: Em width. font_size[TABLE_VERT]: Line spacing. */ int font_size[TABLE_N_AXES]; /* Width of different kinds of lines. */ int line_widths[TABLE_N_AXES][RENDER_N_LINES]; /* Minimum cell width or height before allowing the cell to be broken across two pages. (Joined cells may always be broken at join points.) */ int min_break[TABLE_N_AXES]; /* True if the driver supports cell margins. (If false, the rendering engine will insert a small space betweeen adjacent cells that don't have an intervening rule.) */ bool supports_margins; /* True if the local language has a right-to-left direction, otherwise false. (Use render_direction_rtl() to find out.) */ bool rtl; }; /* An iterator for breaking render_pages into smaller chunks. */ struct render_pager *render_pager_create (const struct render_params *, const struct table_item *); void render_pager_destroy (struct render_pager *); bool render_pager_has_next (const struct render_pager *); int render_pager_draw_next (struct render_pager *, int space); void render_pager_draw (const struct render_pager *); void render_pager_draw_region (const struct render_pager *, int x, int y, int w, int h); int render_pager_get_size (const struct render_pager *, enum table_axis); int render_pager_get_best_breakpoint (const struct render_pager *, int height); bool render_direction_rtl (void); #endif /* output/render.h */ pspp-1.4.1/src/output/driver-provider.h0000644000175000017500000001032713412603174017542 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 1997-9, 2000, 2007, 2009, 2010, 2012, 2014 Free Software Foundation, Inc. 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 3 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, see . */ #ifndef OUTPUT_DRIVER_PROVIDER_H #define OUTPUT_DRIVER_PROVIDER_H 1 #include #include "data/settings.h" #include "libpspp/compiler.h" #include "output/driver.h" struct output_item; struct string_map; struct file_handle; /* A configured output driver. */ struct output_driver { const struct output_driver_class *class; /* Driver class. */ char *name; /* Name of this driver. */ enum settings_output_devices device_type; /* One of SETTINGS_DEVICE_*. */ }; void output_driver_init (struct output_driver *, const struct output_driver_class *, const char *, enum settings_output_devices); void output_driver_destroy (struct output_driver *); const char *output_driver_get_name (const struct output_driver *); char *output_driver_substitute_heading_vars (const char *, int page_number); /* One kind of output driver. Output driver implementations must not call msg() to report errors. This can lead to reentrance in the output driver, because msg() may report error messages using the output drivers. Instead, this code should report errors with error(), which will never call into the output drivers. */ struct output_driver_class { /* Name of this driver class. */ const char *name; /* Closes and frees DRIVER. */ void (*destroy) (struct output_driver *driver); /* Passes ITEM to DRIVER to be written as output. The caller retains ownership of ITEM (but DRIVER may keep a copy of it by incrementing the reference count by calling output_item_ref). */ void (*submit) (struct output_driver *driver, const struct output_item *item); /* Ensures that any output items passed to the 'submit' function for DRIVER have actually been displayed. This is called from the text-based UI before showing the command prompt, to ensure that the user has actually been shown any preceding output If it doesn't make sense for DRIVER to be used this way, then this function need not do anything. */ void (*flush) (struct output_driver *driver); }; /* An abstract way for the output subsystem to create an output driver. */ struct output_driver_factory { /* The file extension, without the leading dot, e.g. "pdf". */ const char *extension; /* The default file name, including extension. If this is "-", that implies that by default output will be directed to stdout. */ const char *default_file_name; /* Creates a new output driver of this class. NAME and TYPE should be passed directly to output_driver_init. Returns the new output driver if successful, otherwise a null pointer. It is up to the driver class to decide how to interpret OPTIONS. The create function should delete pairs that it understands from OPTIONS, because the caller may issue errors about unknown options for any pairs that remain. The functions in output/options.h can be useful. The returned driver should not have been registered (with output_driver_register). The caller will register the driver (if this is desirable). */ struct output_driver *(*create) (struct file_handle *, enum settings_output_devices type, struct string_map *options); }; char *output_get_text_from_markup (const char *markup); #endif /* output/driver-provider.h */ pspp-1.4.1/src/output/csv.c0000644000175000017500000002227413602145300015202 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2009, 2010, 2012, 2013, 2014 Free Software Foundation, Inc. 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 3 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, see . */ #include #include #include #include "data/file-name.h" #include "data/file-handle-def.h" #include "libpspp/assertion.h" #include "libpspp/compiler.h" #include "libpspp/message.h" #include "libpspp/str.h" #include "libpspp/string-map.h" #include "output/text-item.h" #include "output/driver-provider.h" #include "output/options.h" #include "output/message-item.h" #include "output/table-item.h" #include "output/table-provider.h" #include "gl/minmax.h" #include "gl/xalloc.h" #include "gl/xvasprintf.h" #include "gettext.h" #define _(msgid) gettext (msgid) /* Comma-separated value output driver. */ struct csv_driver { struct output_driver driver; char *separator; /* Field separator (usually comma or tab). */ int quote; /* Quote character (usually ' or ") or 0. */ char *quote_set; /* Characters that force quoting. */ bool titles; /* Print table titles? */ bool captions; /* Print table captions? */ struct file_handle *handle; FILE *file; /* Output file. */ int n_items; /* Number of items output so far. */ }; static const struct output_driver_class csv_driver_class; static struct csv_driver * csv_driver_cast (struct output_driver *driver) { assert (driver->class == &csv_driver_class); return UP_CAST (driver, struct csv_driver, driver); } static struct driver_option * opt (struct output_driver *d, struct string_map *options, const char *key, const char *default_value) { return driver_option_get (d, options, key, default_value); } static struct output_driver * csv_create (struct file_handle *fh, enum settings_output_devices device_type, struct string_map *o) { struct output_driver *d; struct csv_driver *csv; char *quote; csv = xzalloc (sizeof *csv); d = &csv->driver; output_driver_init (&csv->driver, &csv_driver_class, fh_get_file_name (fh), device_type); csv->separator = parse_string (opt (d, o, "separator", ",")); quote = parse_string (opt (d, o, "quote", "\"")); csv->quote = quote[0]; free (quote); csv->quote_set = xasprintf ("\n\r\t%s%c", csv->separator, csv->quote); csv->titles = parse_boolean (opt (d, o, "titles", "true")); csv->captions = parse_boolean (opt (d, o, "captions", "true")); csv->handle = fh; csv->file = fn_open (fh, "w"); csv->n_items = 0; if (csv->file == NULL) { msg_error (errno, _("error opening output file `%s'"), fh_get_file_name (fh)); output_driver_destroy (d); return NULL; } return d; } static void csv_destroy (struct output_driver *driver) { struct csv_driver *csv = csv_driver_cast (driver); if (csv->file != NULL) fn_close (csv->handle, csv->file); free (csv->separator); free (csv->quote_set); fh_unref (csv->handle); free (csv); } static void csv_flush (struct output_driver *driver) { struct csv_driver *csv = csv_driver_cast (driver); if (csv->file != NULL) fflush (csv->file); } static void csv_output_field__ (struct csv_driver *csv, struct substring field) { ss_ltrim (&field, ss_cstr (" ")); if (csv->quote && ss_cspan (field, ss_cstr (csv->quote_set)) < field.length) { putc (csv->quote, csv->file); for (size_t i = 0; i < field.length; i++) { if (field.string[i] == csv->quote) putc (csv->quote, csv->file); putc (field.string[i], csv->file); } putc (csv->quote, csv->file); } else fwrite (field.string, field.length, 1, csv->file); } static void csv_output_field (struct csv_driver *csv, const char *field) { csv_output_field__ (csv, ss_cstr (field)); } static void csv_put_separator (struct csv_driver *csv) { if (csv->n_items++ > 0) putc ('\n', csv->file); } static void csv_output_lines (struct csv_driver *csv, const char *text_) { struct substring text = ss_cstr (text_); struct substring line; size_t save_idx = 0; while (ss_separate (text, ss_cstr ("\n"), &save_idx, &line)) { csv_output_field__ (csv, line); putc ('\n', csv->file); } } static void csv_format_footnotes (const struct footnote **f, size_t n, struct string *s) { for (size_t i = 0; i < n; i++) ds_put_format (s, "[%s]", f[i]->marker); } static void csv_output_table_item_text (struct csv_driver *csv, const struct table_item_text *text, const char *leader) { if (!text) return; struct string s = DS_EMPTY_INITIALIZER; ds_put_format (&s, "%s: %s", leader, text->content); csv_format_footnotes (text->footnotes, text->n_footnotes, &s); csv_output_field (csv, ds_cstr (&s)); ds_destroy (&s); putc ('\n', csv->file); } static void csv_submit (struct output_driver *driver, const struct output_item *output_item) { struct csv_driver *csv = csv_driver_cast (driver); if (is_table_item (output_item)) { struct table_item *table_item = to_table_item (output_item); const struct table *t = table_item_get_table (table_item); int x, y; csv_put_separator (csv); if (csv->titles) csv_output_table_item_text (csv, table_item_get_title (table_item), "Table"); for (y = 0; y < table_nr (t); y++) { for (x = 0; x < table_nc (t); x++) { struct table_cell cell; table_get_cell (t, x, y, &cell); if (x > 0) fputs (csv->separator, csv->file); if (x != cell.d[TABLE_HORZ][0] || y != cell.d[TABLE_VERT][0]) csv_output_field (csv, ""); else if (!(cell.options & TAB_MARKUP) && !cell.n_footnotes && !cell.n_subscripts && !cell.superscript) csv_output_field (csv, cell.text); else { struct string s = DS_EMPTY_INITIALIZER; if (cell.options & TAB_MARKUP) { char *t = output_get_text_from_markup (cell.text); ds_put_cstr (&s, t); free (t); } else ds_put_cstr (&s, cell.text); if (cell.n_subscripts) for (size_t i = 0; i < cell.n_subscripts; i++) ds_put_format (&s, "%c%s", i ? ',' : '_', cell.subscripts[i]); if (cell.superscript) ds_put_format (&s, "^%s", cell.superscript); csv_format_footnotes (cell.footnotes, cell.n_footnotes, &s); csv_output_field (csv, ds_cstr (&s)); ds_destroy (&s); } } putc ('\n', csv->file); } if (csv->captions) csv_output_table_item_text (csv, table_item_get_caption (table_item), "Caption"); const struct footnote **f; size_t n_footnotes = table_collect_footnotes (table_item, &f); if (n_footnotes) { fputs ("\nFootnotes:\n", csv->file); for (size_t i = 0; i < n_footnotes; i++) { csv_output_field (csv, f[i]->marker); fputs (csv->separator, csv->file); csv_output_field (csv, f[i]->content); putc ('\n', csv->file); } free (f); } } else if (is_text_item (output_item)) { const struct text_item *text_item = to_text_item (output_item); enum text_item_type type = text_item_get_type (text_item); const char *text = text_item_get_text (text_item); if (type == TEXT_ITEM_SYNTAX || type == TEXT_ITEM_PAGE_TITLE) return; csv_put_separator (csv); if (text_item->markup) { char *plain_text = output_get_text_from_markup (text); csv_output_lines (csv, plain_text); free (plain_text); } else csv_output_lines (csv, text); } else if (is_message_item (output_item)) { const struct message_item *message_item = to_message_item (output_item); char *s = msg_to_string (message_item_get_msg (message_item)); csv_put_separator (csv); csv_output_field (csv, s); free (s); putc ('\n', csv->file); } } struct output_driver_factory csv_driver_factory = { "csv", "-", csv_create }; static const struct output_driver_class csv_driver_class = { "csv", csv_destroy, csv_submit, csv_flush, }; pspp-1.4.1/src/output/group-item.h0000644000175000017500000001155113573046024016512 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2018 Free Sonftware Foundation, Inc. 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 3 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, see . */ #ifndef OUTPUT_GROUP_ITEM_H #define OUTPUT_GROUP_ITEM_H 1 /* Grouping items. A group-open item marks the beginning of a group of related output items. A later group-close item ends the group. Groups can nest. */ #include #include "output/output-item.h" /* A group_open item. */ struct group_open_item { struct output_item output_item; char *command_name; }; struct group_open_item *group_open_item_create (const char *command_name); struct group_open_item *group_open_item_create_nocopy (char *command_name); /* A group_close item. */ struct group_close_item { struct output_item output_item; }; struct group_close_item *group_close_item_create (void); /* This boilerplate for group_open_item, a subclass of output_item, was autogenerated by mk-class-boilerplate. */ #include #include "libpspp/cast.h" extern const struct output_item_class group_open_item_class; /* Returns true if SUPER is a group_open_item, otherwise false. */ static inline bool is_group_open_item (const struct output_item *super) { return super->class == &group_open_item_class; } /* Returns SUPER converted to group_open_item. SUPER must be a group_open_item, as reported by is_group_open_item. */ static inline struct group_open_item * to_group_open_item (const struct output_item *super) { assert (is_group_open_item (super)); return UP_CAST (super, struct group_open_item, output_item); } /* Returns INSTANCE converted to output_item. */ static inline struct output_item * group_open_item_super (const struct group_open_item *instance) { return CONST_CAST (struct output_item *, &instance->output_item); } /* Increments INSTANCE's reference count and returns INSTANCE. */ static inline struct group_open_item * group_open_item_ref (const struct group_open_item *instance) { return to_group_open_item (output_item_ref (&instance->output_item)); } /* Decrements INSTANCE's reference count, then destroys INSTANCE if the reference count is now zero. */ static inline void group_open_item_unref (struct group_open_item *instance) { output_item_unref (&instance->output_item); } /* Returns true if INSTANCE's reference count is greater than 1, false otherwise. */ static inline bool group_open_item_is_shared (const struct group_open_item *instance) { return output_item_is_shared (&instance->output_item); } void group_open_item_submit (struct group_open_item *); /* This boilerplate for group_close_item, a subclass of output_item, was autogenerated by mk-class-boilerplate. */ #include #include "libpspp/cast.h" extern const struct output_item_class group_close_item_class; /* Returns true if SUPER is a group_close_item, otherwise false. */ static inline bool is_group_close_item (const struct output_item *super) { return super->class == &group_close_item_class; } /* Returns SUPER converted to group_close_item. SUPER must be a group_close_item, as reported by is_group_close_item. */ static inline struct group_close_item * to_group_close_item (const struct output_item *super) { assert (is_group_close_item (super)); return UP_CAST (super, struct group_close_item, output_item); } /* Returns INSTANCE converted to output_item. */ static inline struct output_item * group_close_item_super (const struct group_close_item *instance) { return CONST_CAST (struct output_item *, &instance->output_item); } /* Increments INSTANCE's reference count and returns INSTANCE. */ static inline struct group_close_item * group_close_item_ref (const struct group_close_item *instance) { return to_group_close_item (output_item_ref (&instance->output_item)); } /* Decrements INSTANCE's reference count, then destroys INSTANCE if the reference count is now zero. */ static inline void group_close_item_unref (struct group_close_item *instance) { output_item_unref (&instance->output_item); } /* Returns true if INSTANCE's reference count is greater than 1, false otherwise. */ static inline bool group_close_item_is_shared (const struct group_close_item *instance) { return output_item_is_shared (&instance->output_item); } void group_close_item_submit (struct group_close_item *); #endif /* output/group-item.h */ pspp-1.4.1/src/output/table.h0000644000175000017500000002414013602145300015475 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 1997, 1998, 1999, 2000, 2009, 2013, 2014 Free Software Foundation, Inc. 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 3 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, see . */ #ifndef OUTPUT_TABLE_H #define OUTPUT_TABLE_H 1 /* Tables. . A table is a rectangular grid of cells. Cells can be joined to form larger cells. Rows and columns can be separated by rules of various types. Rows at the top and bottom of a table and columns at the left and right edges of a table can be designated as headers, which means that if the table must be broken across more than one page, those rows or columns are repeated on each page. A table is not itself an output_item, and thus a table cannot by itself be used for output, but they can be embedded inside struct table_item (see table-item.h) for that purpose. */ #include #include #include #include "libpspp/compiler.h" struct casereader; struct fmt_spec; struct pool; struct table_item; struct variable; /* A table axis. Many table-related declarations use 2-element arrays in place of "x" and "y" variables. This reduces code duplication significantly, because much table code treats rows and columns the same way. A lot of code that uses these enumerations assumes that the two values are 0 and 1, so don't change them to other values. */ enum table_axis { TABLE_HORZ, TABLE_VERT #define TABLE_N_AXES 2 }; struct cell_color { uint8_t alpha, r, g, b; }; #define CELL_COLOR(r, g, b) { 255, r, g, b } #define CELL_COLOR_BLACK CELL_COLOR (0, 0, 0) #define CELL_COLOR_WHITE CELL_COLOR (255, 255, 255) static inline bool cell_color_equal (const struct cell_color *a, const struct cell_color *b) { return a->alpha == b->alpha && a->r == b->r && a->g == b->g && a->b == b->b; } void cell_color_dump (const struct cell_color *); enum table_stroke { TABLE_STROKE_NONE, TABLE_STROKE_SOLID, TABLE_STROKE_DASHED, TABLE_STROKE_THICK, TABLE_STROKE_THIN, TABLE_STROKE_DOUBLE, TABLE_N_STROKES, }; const char *table_stroke_to_string (enum table_stroke); /* Given strokes A and B, returns a stroke that "combines" them, that is, that gives a reasonable stroke choice for a rule for different reasons should have both styles A and B. */ static inline int table_stroke_combine (enum table_stroke a, enum table_stroke b) { return a > b ? a : b; } struct table_border_style { enum table_stroke stroke; struct cell_color color; }; #define TABLE_BORDER_STYLE_INITIALIZER { TABLE_STROKE_SOLID, CELL_COLOR_BLACK } enum table_halign { TABLE_HALIGN_RIGHT, TABLE_HALIGN_LEFT, TABLE_HALIGN_CENTER, TABLE_HALIGN_MIXED, TABLE_HALIGN_DECIMAL }; const char *table_halign_to_string (enum table_halign); enum table_valign { TABLE_VALIGN_TOP, TABLE_VALIGN_CENTER, TABLE_VALIGN_BOTTOM, }; const char *table_valign_to_string (enum table_valign); struct cell_style { enum table_halign halign; enum table_valign valign; double decimal_offset; /* In 1/96" units. */ char decimal_char; /* Either '.' or ','. */ int margin[TABLE_N_AXES][2]; /* In 1/96" units. */ }; #define CELL_STYLE_INITIALIZER { CELL_STYLE_INITIALIZER__ } #define CELL_STYLE_INITIALIZER__ \ .margin = { [TABLE_HORZ][0] = 8, [TABLE_HORZ][1] = 11, \ [TABLE_VERT][0] = 1, [TABLE_VERT][1] = 1 } void cell_style_dump (const struct cell_style *); struct font_style { bool bold, italic, underline, markup; struct cell_color fg[2], bg[2]; char *typeface; int size; }; #define FONT_STYLE_INITIALIZER { FONT_STYLE_INITIALIZER__ } #define FONT_STYLE_INITIALIZER__ \ .fg = { [0] = CELL_COLOR_BLACK, [1] = CELL_COLOR_BLACK}, \ .bg = { [0] = CELL_COLOR_WHITE, [1] = CELL_COLOR_WHITE}, void font_style_copy (struct pool *, struct font_style *, const struct font_style *); void font_style_uninit (struct font_style *); void font_style_dump (const struct font_style *); struct area_style { struct cell_style cell_style; struct font_style font_style; }; #define AREA_STYLE_INITIALIZER { AREA_STYLE_INITIALIZER__ } #define AREA_STYLE_INITIALIZER__ \ .cell_style = CELL_STYLE_INITIALIZER, \ .font_style = FONT_STYLE_INITIALIZER struct area_style *area_style_clone (struct pool *, const struct area_style *); void area_style_copy (struct pool *, struct area_style *, const struct area_style *); void area_style_uninit (struct area_style *); void area_style_free (struct area_style *); /* Properties of a table cell. */ enum { TAB_NONE = 0, TAB_FIX = 1 << 1, /* Use fixed font. */ TAB_MARKUP = 1 << 2, /* Text contains Pango markup. */ TAB_NUMERIC = 1 << 3, /* Cell contents are numeric. */ TAB_ROTATE = 1 << 4, /* Rotate cell contents 90 degrees. */ TAB_STYLE_SHIFT = 5, TAB_STYLE_MASK = 7 << TAB_STYLE_SHIFT, /* Internal use by tab.c only. */ TAB_JOIN = 1 << 14, }; /* A table. */ struct table { struct pool *container; /* Table size. n[TABLE_HORZ]: Number of columns. n[TABLE_VERT]: Number of rows. */ int n[TABLE_N_AXES]; /* Table headers. Rows at the top and bottom of a table and columns at the left and right edges of a table can be designated as headers. If the table must be broken across more than one page for output, headers rows and columns are repeated on each page. h[TABLE_HORZ][0]: Left header columns. h[TABLE_HORZ][1]: Right header columns. h[TABLE_VERT][0]: Top header rows. h[TABLE_VERT][1]: Bottom header rows. */ int h[TABLE_N_AXES][2]; /* Reference count. A table may be shared between multiple owners, indicated by a reference count greater than 1. When this is the case, the table must not be modified. */ int ref_cnt; /* Table contents. Each array element in cc[] is ordinarily a "char *" pointer to a string. If TAB_JOIN (defined in table.c) is set in ct[] for the element, however, it is a joined cell and the corresponding element of cc[] points to a struct table_cell. */ void **cc; /* Cell contents; void *[nr][nc]. */ unsigned short *ct; /* Cell types; unsigned short[nr][nc]. */ struct area_style *styles[8]; /* Rules. */ unsigned char *rh; /* Horiz rules; unsigned char[nr+1][nc]. */ unsigned char *rv; /* Vert rules; unsigned char[nr][nc+1]. */ struct cell_color *rule_colors[32]; }; /* Reference counting. */ struct table *table_ref (const struct table *); void table_unref (struct table *); bool table_is_shared (const struct table *); /* Returns the number of columns or rows, respectively, in T. */ static inline int table_nc (const struct table *t) { return t->n[TABLE_HORZ]; } static inline int table_nr (const struct table *t) { return t->n[TABLE_VERT]; } /* Returns the number of left, right, top, or bottom headers, respectively, in T. */ static inline int table_hl (const struct table *t) { return t->h[TABLE_HORZ][0]; } static inline int table_hr (const struct table *t) { return t->h[TABLE_HORZ][1]; } static inline int table_ht (const struct table *t) { return t->h[TABLE_VERT][0]; } static inline int table_hb (const struct table *t) { return t->h[TABLE_VERT][1]; } /* Simple kinds of output. */ struct table *table_from_string (const char *); void table_output_text (int options, const char *string); void table_output_text_format (int options, const char *, ...) PRINTF_FORMAT (2, 3); /* Rule masks. */ #define TAB_RULE_TYPE_MASK 7 #define TAB_RULE_TYPE_SHIFT 0 #define TAB_RULE_STYLE_MASK (31 << TAB_RULE_STYLE_SHIFT) #define TAB_RULE_STYLE_SHIFT 3 /* Tables. */ struct table *table_create (int nc, int nr, int hl, int hr, int ht, int hb); /* Rules. */ void table_hline (struct table *, int style, int x1, int x2, int y); void table_vline (struct table *, int style, int x, int y1, int y2); void table_box (struct table *, int f_h, int f_v, int i_h, int i_v, int x1, int y1, int x2, int y2); /* Cells. */ void table_text (struct table *, int c, int r, unsigned opt, const char *); void table_text_format (struct table *, int c, int r, unsigned opt, const char *, ...) PRINTF_FORMAT (5, 6); void table_joint_text (struct table *, int x1, int y1, int x2, int y2, unsigned opt, const char *); void table_add_subscripts (struct table *, int x, int y, char **subscripts, size_t n_subscripts); void table_add_superscript (struct table *, int x, int y, const char *superscript); /* Footnotes. Use table_create_footnote() to create the footnotes themselves, then use table_add_footnote() to create a reference from a table cell to a footnote. There are two steps because a footnote may have multiple references. */ struct footnote *table_create_footnote (struct table *, size_t idx, const char *content, const char *marker, struct area_style *); void table_add_footnote (struct table *, int x, int y, const struct footnote *); void table_add_style (struct table *, int x, int y, const struct area_style *); bool table_cell_is_empty (const struct table *, int c, int r); #endif /* output/table.h */ pspp-1.4.1/src/output/table-provider.h0000644000175000017500000000640613602145300017332 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 1997, 1998, 1999, 2000, 2009, 2011, 2013, 2014, 2018 Free Software Foundation, Inc. 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 3 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, see . */ #ifndef OUTPUT_TABLE_PROVIDER #define OUTPUT_TABLE_PROVIDER 1 #include #include "output/table.h" struct pool; struct string; enum table_halign table_halign_interpret (enum table_halign, bool numeric); struct footnote { size_t idx; char *content; char *marker; struct area_style *style; }; /* A cell in a table. */ struct table_cell { /* Occupied table region. d[TABLE_HORZ][0] is the leftmost column. d[TABLE_HORZ][1] is the rightmost column, plus 1. d[TABLE_VERT][0] is the top row. d[TABLE_VERT][1] is the bottom row, plus 1. For an ordinary cell: d[TABLE_HORZ][1] == d[TABLE_HORZ][0] + 1 and d[TABLE_VERT][1] == d[TABLE_VERT][0] + 1 For a joined cell: d[TABLE_HORZ][1] > d[TABLE_HORZ][0] + 1 or d[TABLE_VERT][1] > d[TABLE_VERT][0] + 1 or both. */ int d[TABLE_N_AXES][2]; unsigned int options; /* TAB_*. */ char *text; /* A paragraph of text. */ char **subscripts; size_t n_subscripts; char *superscript; const struct footnote **footnotes; size_t n_footnotes; const struct area_style *style; }; void table_cell_format_footnote_markers (const struct table_cell *, struct string *); /* Returns the number of columns that CELL spans. This is 1 for an ordinary cell and greater than one for a cell that joins multiple columns. */ static inline int table_cell_colspan (const struct table_cell *cell) { return cell->d[TABLE_HORZ][1] - cell->d[TABLE_HORZ][0]; } /* Returns the number of rows that CELL spans. This is 1 for an ordinary cell and greater than one for a cell that joins multiple rows. */ static inline int table_cell_rowspan (const struct table_cell *cell) { return cell->d[TABLE_VERT][1] - cell->d[TABLE_VERT][0]; } /* Returns true if CELL is a joined cell, that is, if it spans multiple rows or columns. Otherwise, returns false. */ static inline bool table_cell_is_joined (const struct table_cell *cell) { return table_cell_colspan (cell) > 1 || table_cell_rowspan (cell) > 1; } /* For use primarily by output drivers. */ void table_get_cell (const struct table *, int x, int y, struct table_cell *); int table_get_rule (const struct table *, enum table_axis, int x, int y, struct cell_color *); size_t table_collect_footnotes (const struct table_item *, const struct footnote ***); #endif /* output/table-provider.h */ pspp-1.4.1/src/output/table.c0000644000175000017500000005647513700645725015527 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2009, 2011, 2014, 2016 Free Software Foundation, Inc. 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 3 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, see . */ #include #include "output/table.h" #include "output/table-provider.h" #include #include #include #include "data/format.h" #include "libpspp/assertion.h" #include "libpspp/cast.h" #include "libpspp/compiler.h" #include "libpspp/pool.h" #include "libpspp/str.h" #include "output/table-item.h" #include "output/table.h" #include "output/text-item.h" #include "gl/xalloc.h" /* Increases TABLE's reference count, indicating that it has an additional owner. An table that is shared among multiple owners must not be modified. */ struct table * table_ref (const struct table *table_) { struct table *table = CONST_CAST (struct table *, table_); table->ref_cnt++; return table; } /* Decreases TABLE's reference count, indicating that it has one fewer owner. If TABLE no longer has any owners, it is freed. */ void table_unref (struct table *table) { if (table != NULL) { assert (table->ref_cnt > 0); if (--table->ref_cnt == 0) pool_destroy (table->container); } } /* Returns true if TABLE has more than one owner. A table item that is shared among multiple owners must not be modified. */ bool table_is_shared (const struct table *table) { return table->ref_cnt > 1; } struct area_style * area_style_clone (struct pool *pool, const struct area_style *old) { struct area_style *new = pool_malloc (pool, sizeof *new); *new = *old; if (new->font_style.typeface) new->font_style.typeface = pool_strdup (pool, new->font_style.typeface); return new; } void area_style_free (struct area_style *style) { if (style) { free (style->font_style.typeface); free (style); } } void table_cell_format_footnote_markers (const struct table_cell *cell, struct string *s) { for (size_t i = 0; i < cell->n_footnotes; i++) { if (i) ds_put_byte (s, ','); ds_put_cstr (s, cell->footnotes[i]->marker); } } static const struct footnote ** add_footnotes (const struct footnote **refs, size_t n_refs, const struct footnote **footnotes, size_t *allocated, size_t *n) { for (size_t i = 0; i < n_refs; i++) { const struct footnote *f = refs[i]; if (f->idx >= *allocated) { size_t new_allocated = (f->idx + 1) * 2; footnotes = xrealloc (footnotes, new_allocated * sizeof *footnotes); while (*allocated < new_allocated) footnotes[(*allocated)++] = NULL; } footnotes[f->idx] = f; if (f->idx >= *n) *n = f->idx + 1; } return footnotes; } size_t table_collect_footnotes (const struct table_item *item, const struct footnote ***footnotesp) { const struct footnote **footnotes = NULL; size_t allocated = 0; size_t n = 0; struct table *t = item->table; for (int y = 0; y < table_nr (t); y++) { struct table_cell cell; for (int x = 0; x < table_nc (t); x = cell.d[TABLE_HORZ][1]) { table_get_cell (t, x, y, &cell); if (x == cell.d[TABLE_HORZ][0] && y == cell.d[TABLE_VERT][0]) footnotes = add_footnotes (cell.footnotes, cell.n_footnotes, footnotes, &allocated, &n); } } const struct table_item_text *title = table_item_get_title (item); if (title) footnotes = add_footnotes (title->footnotes, title->n_footnotes, footnotes, &allocated, &n); const struct table_item_layers *layers = table_item_get_layers (item); if (layers) { for (size_t i = 0; i < layers->n_layers; i++) footnotes = add_footnotes (layers->layers[i].footnotes, layers->layers[i].n_footnotes, footnotes, &allocated, &n); } const struct table_item_text *caption = table_item_get_caption (item); if (caption) footnotes = add_footnotes (caption->footnotes, caption->n_footnotes, footnotes, &allocated, &n); size_t n_nonnull = 0; for (size_t i = 0; i < n; i++) if (footnotes[i]) footnotes[n_nonnull++] = footnotes[i]; *footnotesp = footnotes; return n_nonnull; } /* Returns a table that contains a single cell, whose contents are the left-aligned TEXT. */ struct table * table_from_string (const char *text) { struct table *t = table_create (1, 1, 0, 0, 0, 0); t->styles[0] = pool_alloc (t->container, sizeof *t->styles[0]); *t->styles[0] = (struct area_style) { AREA_STYLE_INITIALIZER__, .cell_style.halign = TABLE_HALIGN_LEFT, .cell_style.valign = TABLE_VALIGN_TOP }; table_text (t, 0, 0, 0 << TAB_STYLE_SHIFT, text); return t; } const char * table_halign_to_string (enum table_halign halign) { switch (halign) { case TABLE_HALIGN_LEFT: return "left"; case TABLE_HALIGN_CENTER: return "center"; case TABLE_HALIGN_RIGHT: return "right"; case TABLE_HALIGN_DECIMAL: return "decimal"; case TABLE_HALIGN_MIXED: return "mixed"; default: return "**error**"; } } const char * table_valign_to_string (enum table_valign valign) { switch (valign) { case TABLE_VALIGN_TOP: return "top"; case TABLE_VALIGN_CENTER: return "center"; case TABLE_VALIGN_BOTTOM: return "bottom"; default: return "**error**"; } } enum table_halign table_halign_interpret (enum table_halign halign, bool numeric) { switch (halign) { case TABLE_HALIGN_LEFT: case TABLE_HALIGN_CENTER: case TABLE_HALIGN_RIGHT: return halign; case TABLE_HALIGN_MIXED: return numeric ? TABLE_HALIGN_RIGHT : TABLE_HALIGN_LEFT; case TABLE_HALIGN_DECIMAL: return TABLE_HALIGN_DECIMAL; default: NOT_REACHED (); } } void font_style_copy (struct pool *container, struct font_style *dst, const struct font_style *src) { *dst = *src; if (dst->typeface) dst->typeface = pool_strdup (container, dst->typeface); } void font_style_uninit (struct font_style *font) { if (font) free (font->typeface); } void area_style_copy (struct pool *container, struct area_style *dst, const struct area_style *src) { font_style_copy (container, &dst->font_style, &src->font_style); dst->cell_style = src->cell_style; } void area_style_uninit (struct area_style *area) { if (area) font_style_uninit (&area->font_style); } const char * table_stroke_to_string (enum table_stroke stroke) { switch (stroke) { case TABLE_STROKE_NONE: return "none"; case TABLE_STROKE_SOLID: return "solid"; case TABLE_STROKE_DASHED: return "dashed"; case TABLE_STROKE_THICK: return "thick"; case TABLE_STROKE_THIN: return "thin"; case TABLE_STROKE_DOUBLE: return "double"; default: return "**error**"; } } void cell_color_dump (const struct cell_color *c) { if (c->alpha != 255) printf ("rgba(%d, %d, %d, %d)", c->r, c->g, c->b, c->alpha); else printf ("#%02"PRIx8"%02"PRIx8"%02"PRIx8, c->r, c->g, c->b); } void font_style_dump (const struct font_style *f) { printf ("%s %dpx ", f->typeface, f->size); cell_color_dump (&f->fg[0]); putchar ('/'); cell_color_dump (&f->bg[0]); if (!cell_color_equal (&f->fg[0], &f->fg[1]) || !cell_color_equal (&f->bg[0], &f->bg[1])) { printf (" alt="); cell_color_dump (&f->fg[1]); putchar ('/'); cell_color_dump (&f->bg[1]); } if (f->bold) fputs (" bold", stdout); if (f->italic) fputs (" italic", stdout); if (f->underline) fputs (" underline", stdout); } void cell_style_dump (const struct cell_style *c) { fputs (table_halign_to_string (c->halign), stdout); if (c->halign == TABLE_HALIGN_DECIMAL) printf ("(%.2gpx)", c->decimal_offset); printf (" %s", table_valign_to_string (c->valign)); printf (" %d,%d,%d,%dpx", c->margin[TABLE_HORZ][0], c->margin[TABLE_HORZ][1], c->margin[TABLE_VERT][0], c->margin[TABLE_VERT][1]); } static const bool debugging = true; /* Creates and returns a new table with NC columns and NR rows and initially no header rows or columns. Sets the number of header rows on each side of TABLE to HL on the left, HR on the right, HT on the top, HB on the bottom. Header rows are repeated when a table is broken across multiple columns or multiple pages. The table's cells are initially empty. */ struct table * table_create (int nc, int nr, int hl, int hr, int ht, int hb) { struct table *t; t = pool_create_container (struct table, container); t->n[TABLE_HORZ] = nc; t->n[TABLE_VERT] = nr; t->h[TABLE_HORZ][0] = hl; t->h[TABLE_HORZ][1] = hr; t->h[TABLE_VERT][0] = ht; t->h[TABLE_VERT][1] = hb; t->ref_cnt = 1; t->cc = pool_calloc (t->container, nr * nc, sizeof *t->cc); t->ct = pool_calloc (t->container, nr * nc, sizeof *t->ct); t->rh = pool_nmalloc (t->container, nc, nr + 1); memset (t->rh, TABLE_STROKE_NONE, nc * (nr + 1)); t->rv = pool_nmalloc (t->container, nr, nc + 1); memset (t->rv, TABLE_STROKE_NONE, nr * (nc + 1)); memset (t->styles, 0, sizeof t->styles); memset (t->rule_colors, 0, sizeof t->rule_colors); return t; } /* Rules. */ /* Draws a vertical line to the left of cells at horizontal position X from Y1 to Y2 inclusive in style STYLE, if style is not -1. */ void table_vline (struct table *t, int style, int x, int y1, int y2) { if (debugging) { if (x < 0 || x > table_nc (t) || y1 < 0 || y1 >= table_nr (t) || y2 < 0 || y2 >= table_nr (t)) { printf ("bad vline: x=%d y=(%d,%d) in table size (%d,%d)\n", x, y1, y2, table_nc (t), table_nr (t)); return; } } assert (x >= 0); assert (x <= table_nc (t)); assert (y1 >= 0); assert (y2 >= y1); assert (y2 <= table_nr (t)); if (style != -1) { int y; for (y = y1; y <= y2; y++) t->rv[x + (table_nc (t) + 1) * y] = style; } } /* Draws a horizontal line above cells at vertical position Y from X1 to X2 inclusive in style STYLE, if style is not -1. */ void table_hline (struct table *t, int style, int x1, int x2, int y) { if (debugging) { if (y < 0 || y > table_nr (t) || x1 < 0 || x1 >= table_nc (t) || x2 < 0 || x2 >= table_nc (t)) { printf ("bad hline: x=(%d,%d) y=%d in table size (%d,%d)\n", x1, x2, y, table_nc (t), table_nr (t)); return; } } assert (y >= 0); assert (y <= table_nr (t)); assert (x2 >= x1); assert (x1 >= 0); assert (x2 < table_nc (t)); if (style != -1) { int x; for (x = x1; x <= x2; x++) t->rh[x + table_nc (t) * y] = style; } } /* Draws a box around cells (X1,Y1)-(X2,Y2) inclusive with horizontal lines of style F_H and vertical lines of style F_V. Fills the interior of the box with horizontal lines of style I_H and vertical lines of style I_V. Any of the line styles may be -1 to avoid drawing those lines. This is distinct from 0, which draws a null line. */ void table_box (struct table *t, int f_h, int f_v, int i_h, int i_v, int x1, int y1, int x2, int y2) { if (debugging) { if (x1 < 0 || x1 >= table_nc (t) || x2 < 0 || x2 >= table_nc (t) || y1 < 0 || y1 >= table_nr (t) || y2 < 0 || y2 >= table_nr (t)) { printf ("bad box: (%d,%d)-(%d,%d) in table size (%d,%d)\n", x1, y1, x2, y2, table_nc (t), table_nr (t)); NOT_REACHED (); } } assert (x2 >= x1); assert (y2 >= y1); assert (x1 >= 0); assert (y1 >= 0); assert (x2 < table_nc (t)); assert (y2 < table_nr (t)); if (f_h != -1) { int x; for (x = x1; x <= x2; x++) { t->rh[x + table_nc (t) * y1] = f_h; t->rh[x + table_nc (t) * (y2 + 1)] = f_h; } } if (f_v != -1) { int y; for (y = y1; y <= y2; y++) { t->rv[x1 + (table_nc (t) + 1) * y] = f_v; t->rv[(x2 + 1) + (table_nc (t) + 1) * y] = f_v; } } if (i_h != -1) { int y; for (y = y1 + 1; y <= y2; y++) { int x; for (x = x1; x <= x2; x++) t->rh[x + table_nc (t) * y] = i_h; } } if (i_v != -1) { int x; for (x = x1 + 1; x <= x2; x++) { int y; for (y = y1; y <= y2; y++) t->rv[x + (table_nc (t) + 1) * y] = i_v; } } } /* Cells. */ static void do_table_text (struct table *table, int c, int r, unsigned opt, char *text) { assert (c >= 0); assert (r >= 0); assert (c < table_nc (table)); assert (r < table_nr (table)); if (debugging) { if (c < 0 || r < 0 || c >= table_nc (table) || r >= table_nr (table)) { printf ("table_text(): bad cell (%d,%d) in table size (%d,%d)\n", c, r, table_nc (table), table_nr (table)); return; } } table->cc[c + r * table_nc (table)] = text; table->ct[c + r * table_nc (table)] = opt; } /* Sets cell (C,R) in TABLE, with options OPT, to have text value TEXT. */ void table_text (struct table *table, int c, int r, unsigned opt, const char *text) { do_table_text (table, c, r, opt, pool_strdup (table->container, text)); } /* Sets cell (C,R) in TABLE, with options OPT, to have text value FORMAT, which is formatted as if passed to printf. */ void table_text_format (struct table *table, int c, int r, unsigned opt, const char *format, ...) { va_list args; va_start (args, format); do_table_text (table, c, r, opt, pool_vasprintf (table->container, format, args)); va_end (args); } static struct table_cell * add_joined_cell (struct table *table, int x1, int y1, int x2, int y2, unsigned opt) { assert (x1 >= 0); assert (y1 >= 0); assert (y2 >= y1); assert (x2 >= x1); assert (y2 < table_nr (table)); assert (x2 < table_nc (table)); if (debugging) { if (x1 < 0 || x1 >= table_nc (table) || y1 < 0 || y1 >= table_nr (table) || x2 < x1 || x2 >= table_nc (table) || y2 < y1 || y2 >= table_nr (table)) { printf ("table_joint_text(): bad cell " "(%d,%d)-(%d,%d) in table size (%d,%d)\n", x1, y1, x2, y2, table_nc (table), table_nr (table)); return NULL; } } table_box (table, -1, -1, TABLE_STROKE_NONE, TABLE_STROKE_NONE, x1, y1, x2, y2); struct table_cell *cell = pool_alloc (table->container, sizeof *cell); *cell = (struct table_cell) { .d = { [TABLE_HORZ] = { x1, ++x2 }, [TABLE_VERT] = { y1, ++y2 } }, .options = opt, }; void **cc = &table->cc[x1 + y1 * table_nc (table)]; unsigned short *ct = &table->ct[x1 + y1 * table_nc (table)]; const int ofs = table_nc (table) - (x2 - x1); for (int y = y1; y < y2; y++) { for (int x = x1; x < x2; x++) { *cc++ = cell; *ct++ = opt | TAB_JOIN; } cc += ofs; ct += ofs; } return cell; } /* Joins cells (X1,X2)-(Y1,Y2) inclusive in TABLE, and sets them with options OPT to have text value TEXT. */ void table_joint_text (struct table *table, int x1, int y1, int x2, int y2, unsigned opt, const char *text) { char *s = pool_strdup (table->container, text); if (x1 == x2 && y1 == y2) do_table_text (table, x1, y1, opt, s); else add_joined_cell (table, x1, y1, x2, y2, opt)->text = s; } static struct table_cell * get_joined_cell (struct table *table, int x, int y) { int index = x + y * table_nc (table); unsigned short opt = table->ct[index]; struct table_cell *cell; if (opt & TAB_JOIN) cell = table->cc[index]; else { char *text = table->cc[index]; cell = add_joined_cell (table, x, y, x, y, table->ct[index]); cell->text = text ? text : pool_strdup (table->container, ""); } return cell; } /* Sets the subscripts for column X, row Y in TABLE. */ void table_add_subscripts (struct table *table, int x, int y, char **subscripts, size_t n_subscripts) { struct table_cell *cell = get_joined_cell (table, x, y); cell->n_subscripts = n_subscripts; cell->subscripts = pool_nalloc (table->container, n_subscripts, sizeof *cell->subscripts); for (size_t i = 0; i < n_subscripts; i++) cell->subscripts[i] = pool_strdup (table->container, subscripts[i]); } /* Sets the superscript for column X, row Y in TABLE. */ void table_add_superscript (struct table *table, int x, int y, const char *superscript) { get_joined_cell (table, x, y)->superscript = pool_strdup (table->container, superscript); } /* Create a footnote in TABLE with MARKER (e.g. "a") as its marker and CONTENT as its content. The footnote will be styled as STYLE, which is mandatory. IDX must uniquely identify the footnote within TABLE. Returns the new footnote. The return value is the only way to get to the footnote later, so it is important for the caller to remember it. */ struct footnote * table_create_footnote (struct table *table, size_t idx, const char *content, const char *marker, struct area_style *style) { assert (style); struct footnote *f = pool_alloc (table->container, sizeof *f); f->idx = idx; f->content = pool_strdup (table->container, content); f->marker = pool_strdup (table->container, marker); f->style = style; return f; } /* Attaches a reference to footnote F to the cell at column X, row Y in TABLE. */ void table_add_footnote (struct table *table, int x, int y, const struct footnote *f) { assert (f->style); struct table_cell *cell = get_joined_cell (table, x, y); cell->footnotes = pool_realloc ( table->container, cell->footnotes, (cell->n_footnotes + 1) * sizeof *cell->footnotes); cell->footnotes[cell->n_footnotes++] = f; } /* Overrides the style for column X, row Y in TABLE with STYLE. Does not make a copy of STYLE, so it should either be allocated from TABLE->container or have a lifetime that will outlive TABLE. */ void table_add_style (struct table *table, int x, int y, const struct area_style *style) { get_joined_cell (table, x, y)->style = style; } /* Returns true if column C, row R has no contents, otherwise false. */ bool table_cell_is_empty (const struct table *table, int c, int r) { return table->cc[c + r * table_nc (table)] == NULL; } /* Editing. */ /* Writes STRING to the output. OPTIONS may be any valid combination of TAB_* bits. This function is obsolete. Please do not add new uses of it. Instead, use a text_item (see output/text-item.h). */ void table_output_text (int options UNUSED, const char *string) { text_item_submit (text_item_create (TEXT_ITEM_LOG, string)); } /* Same as table_output_text(), but FORMAT is passed through printf-like formatting before output. */ void table_output_text_format (int options, const char *format, ...) { va_list args; char *text; va_start (args, format); text = xvasprintf (format, args); va_end (args); table_output_text (options, text); free (text); } /* Initializes CELL with the contents of the table cell at column X and row Y within TABLE. When CELL is no longer needed, the caller is responsible for freeing it by calling table_cell_free(CELL). The caller must ensure that CELL is destroyed before TABLE is unref'ed. */ void table_get_cell (const struct table *t, int x, int y, struct table_cell *cell) { assert (x >= 0 && x < t->n[TABLE_HORZ]); assert (y >= 0 && y < t->n[TABLE_VERT]); int index = x + y * table_nc (t); unsigned short opt = t->ct[index]; const void *cc = t->cc[index]; const struct area_style *style = t->styles[(opt & TAB_STYLE_MASK) >> TAB_STYLE_SHIFT]; if (opt & TAB_JOIN) { const struct table_cell *jc = cc; *cell = *jc; if (!cell->style) cell->style = style; } else *cell = (struct table_cell) { .d = { [TABLE_HORZ] = { x, x + 1 }, [TABLE_VERT] = { y, y + 1 } }, .options = opt, .text = CONST_CAST (char *, cc ? cc : ""), .style = style, }; assert (cell->style); } /* Returns one of the TAL_* enumeration constants (declared in output/table.h) representing a rule running alongside one of the cells in TABLE. Suppose NC is the number of columns in TABLE and NR is the number of rows. Then, if AXIS is TABLE_HORZ, then 0 <= X <= NC and 0 <= Y < NR. If (X,Y) = (0,0), the return value is the rule that runs vertically on the left side of cell (0,0); if (X,Y) = (1,0), it is the vertical rule between that cell and cell (1,0); and so on, up to (NC,0), which runs vertically on the right of cell (NC-1,0). The following diagram illustrates the meaning of (X,Y) for AXIS = TABLE_HORZ within a 7x7 table. The '|' characters at the intersection of the X labels and Y labels show the rule whose style would be returned by calling table_get_rule with those X and Y values: 0 1 2 3 4 5 6 7 +--+--+--+--+--+--+--+ 0 | | | | | | | | +--+--+--+--+--+--+--+ 1 | | | | | | | | +--+--+--+--+--+--+--+ 2 | | | | | | | | +--+--+--+--+--+--+--+ 3 | | | | | | | | +--+--+--+--+--+--+--+ 4 | | | | | | | | +--+--+--+--+--+--+--+ 5 | | | | | | | | +--+--+--+--+--+--+--+ 6 | | | | | | | | +--+--+--+--+--+--+--+ Similarly, if AXIS is TABLE_VERT, then 0 <= X < NC and 0 <= Y <= NR. If (X,Y) = (0,0), the return value is the rule that runs horizontally above the top of cell (0,0); if (X,Y) = (0,1), it is the horizontal rule between that cell and cell (0,1); and so on, up to (0,NR), which runs horizontally below cell (0,NR-1). */ int table_get_rule (const struct table *table, enum table_axis axis, int x, int y, struct cell_color *color) { assert (x >= 0 && x < table->n[TABLE_HORZ] + (axis == TABLE_HORZ)); assert (y >= 0 && y < table->n[TABLE_VERT] + (axis == TABLE_VERT)); uint8_t raw = (axis == TABLE_VERT ? table->rh[x + table_nc (table) * y] : table->rv[x + (table_nc (table) + 1) * y]); struct cell_color *p = table->rule_colors[(raw & TAB_RULE_STYLE_MASK) >> TAB_RULE_STYLE_SHIFT]; *color = p ? *p : (struct cell_color) CELL_COLOR_BLACK; return (raw & TAB_RULE_TYPE_MASK) >> TAB_RULE_TYPE_SHIFT; } pspp-1.4.1/src/output/driver.h0000644000175000017500000000326313573046024015716 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 1997-9, 2000, 2007, 2009, 2010, 2014 Free Software Foundation, Inc. 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 3 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, see . */ #ifndef OUTPUT_DRIVER_H #define OUTPUT_DRIVER_H 1 #include #include struct output_item; struct string_set; struct string_map; void output_get_supported_formats (struct string_set *); void output_engine_push (void); void output_engine_pop (void); void output_submit (struct output_item *); void output_flush (void); void output_set_title (const char *); void output_set_subtitle (const char *); void output_set_filename (const char *); char *output_get_command_name (void); size_t output_get_group_level (void); void output_driver_parse_option (const char *option, struct string_map *options); struct output_driver *output_driver_create (struct string_map *options); bool output_driver_is_registered (const struct output_driver *); void output_driver_register (struct output_driver *); void output_driver_unregister (struct output_driver *); #endif /* output/driver.h */ pspp-1.4.1/src/output/render.c0000644000175000017500000020151113670210420015660 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2009, 2010, 2011, 2013, 2014, 2016 Free Software Foundation, Inc. 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 3 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, see . */ #include #include #include #include #include #include #include "libpspp/assertion.h" #include "libpspp/hash-functions.h" #include "libpspp/hmap.h" #include "libpspp/pool.h" #include "output/render.h" #include "output/table-item.h" #include "output/table.h" #include "gl/minmax.h" #include "gl/xalloc.h" #include "gettext.h" #define _(msgid) gettext (msgid) /* This file uses TABLE_HORZ and TABLE_VERT enough to warrant abbreviating. */ #define H TABLE_HORZ #define V TABLE_VERT /* A layout for rendering a specific table on a specific device. May represent the layout of an entire table presented to render_page_create(), or a rectangular subregion of a table broken out using render_break_next() to allow a table to be broken across multiple pages. A page's size is not limited to the size passed in as part of render_params. render_pager breaks a render_page into smaller render_pages that will fit in the available space. */ struct render_page { const struct render_params *params; /* Parameters of the target device. */ struct table *table; /* Table rendered. */ int ref_cnt; /* Region of 'table' to render. The horizontal cells rendered are the leftmost h[H][0], then r[H][0] through r[H][1], exclusive, then the rightmost h[H][1]. The vertical cells rendered are the topmost h[V][0], then r[V][0] through r[V][1], exclusive, then the bottommost h[V][1]. n[H] = h[H][0] + (r[H][1] - r[H][0]) + h[H][1] n[V] = h[V][0] + (r[V][1] - r[V][0]) + h[V][1] */ int h[TABLE_N_AXES][2]; int r[TABLE_N_AXES][2]; int n[TABLE_N_AXES]; /* "Cell positions". cp[H] represents x positions within the table. cp[H][0] = 0. cp[H][1] = the width of the leftmost vertical rule. cp[H][2] = cp[H][1] + the width of the leftmost column. cp[H][3] = cp[H][2] + the width of the second-from-left vertical rule. and so on: cp[H][2 * nc] = x position of the rightmost vertical rule. cp[H][2 * nc + 1] = total table width including all rules. Similarly, cp[V] represents y positions within the table. cp[V][0] = 0. cp[V][1] = the height of the topmost horizontal rule. cp[V][2] = cp[V][1] + the height of the topmost row. cp[V][3] = cp[V][2] + the height of the second-from-top horizontal rule. and so on: cp[V][2 * nr] = y position of the bottommost horizontal rule. cp[V][2 * nr + 1] = total table height including all rules. Rules and columns can have width or height 0, in which case consecutive values in this array are equal. */ int *cp[TABLE_N_AXES]; /* render_break_next() can break a table such that some cells are not fully contained within a render_page. This will happen if a cell is too wide or two tall to fit on a single page, or if a cell spans multiple rows or columns and the page only includes some of those rows or columns. This hash table contains "struct render_overflow"s that represents each such cell that doesn't completely fit on this page. Each overflow cell borders at least one header edge of the table and may border more. (A single table cell that is so large that it fills the entire page can overflow on all four sides!) */ struct hmap overflows; /* If a single column (or row) is too wide (or tall) to fit on a page reasonably, then render_break_next() will split a single row or column across multiple render_pages. This member indicates when this has happened: is_edge_cutoff[H][0] is true if pixels have been cut off the left side of the leftmost column in this page, and false otherwise. is_edge_cutoff[H][1] is true if pixels have been cut off the right side of the rightmost column in this page, and false otherwise. is_edge_cutoff[V][0] and is_edge_cutoff[V][1] are similar for the top and bottom of the table. The effect of is_edge_cutoff is to prevent rules along the edge in question from being rendered. When is_edge_cutoff is true for a given edge, the 'overflows' hmap will contain a node for each cell along that edge. */ bool is_edge_cutoff[TABLE_N_AXES][2]; /* If part of a joined cell would be cut off by breaking a table along 'axis' at the rule with offset 'z' (where 0 <= z <= n[axis]), then join_crossing[axis][z] is the thickness of the rule that would be cut off. This is used to know to allocate extra space for breaking at such a position, so that part of the cell's content is not lost. This affects breaking a table only when headers are present. When headers are not present, the rule's thickness is used for cell content, so no part of the cell's content is lost (and in fact it is duplicated across both pages). */ int *join_crossing[TABLE_N_AXES]; }; static struct render_page *render_page_create (const struct render_params *, struct table *, int min_width); struct render_page *render_page_ref (const struct render_page *page_); static void render_page_unref (struct render_page *); /* Returns the offset in struct render_page's cp[axis] array of the rule with index RULE_IDX. That is, if RULE_IDX is 0, then the offset is that of the leftmost or topmost rule; if RULE_IDX is 1, then the offset is that of the next rule to the right (or below); and so on. */ static int rule_ofs (int rule_idx) { return rule_idx * 2; } /* Returns the offset in struct render_page's cp[axis] array of the rule with index RULE_IDX_R, which counts from the right side (or bottom) of the page left (or up), according to whether AXIS is H or V, respectively. That is, if RULE_IDX_R is 0, then the offset is that of the rightmost or bottommost rule; if RULE_IDX is 1, then the offset is that of the next rule to the left (or above); and so on. */ static int rule_ofs_r (const struct render_page *page, int axis, int rule_idx_r) { return (page->n[axis] - rule_idx_r) * 2; } /* Returns the offset in struct render_page's cp[axis] array of the cell with index CELL_IDX. That is, if CELL_IDX is 0, then the offset is that of the leftmost or topmost cell; if CELL_IDX is 1, then the offset is that of the next cell to the right (or below); and so on. */ static int cell_ofs (int cell_idx) { return cell_idx * 2 + 1; } /* Returns the width of PAGE along AXIS from OFS0 to OFS1, exclusive. */ static int axis_width (const struct render_page *page, int axis, int ofs0, int ofs1) { return page->cp[axis][ofs1] - page->cp[axis][ofs0]; } /* Returns the width of the headers in PAGE along AXIS. */ static int headers_width (const struct render_page *page, int axis) { int h0 = page->h[axis][0]; int w0 = axis_width (page, axis, rule_ofs (0), cell_ofs (h0)); int n = page->n[axis]; int h1 = page->h[axis][1]; int w1 = axis_width (page, axis, rule_ofs_r (page, axis, h1), cell_ofs (n)); return w0 + w1; } /* Returns the width of cell X along AXIS in PAGE. */ static int cell_width (const struct render_page *page, int axis, int x) { return axis_width (page, axis, cell_ofs (x), cell_ofs (x) + 1); } /* Returns the width of rule X along AXIS in PAGE. */ static int rule_width (const struct render_page *page, int axis, int x) { return axis_width (page, axis, rule_ofs (x), rule_ofs (x) + 1); } /* Returns the width of rule X along AXIS in PAGE. */ static int rule_width_r (const struct render_page *page, int axis, int x) { int ofs = rule_ofs_r (page, axis, x); return axis_width (page, axis, ofs, ofs + 1); } /* Returns the width of cells X0 through X1, exclusive, along AXIS in PAGE. */ static int joined_width (const struct render_page *page, int axis, int x0, int x1) { return axis_width (page, axis, cell_ofs (x0), cell_ofs (x1) - 1); } /* Returns the width of the widest cell, excluding headers, along AXIS in PAGE. */ static int max_cell_width (const struct render_page *page, int axis) { int n = page->n[axis]; int x0 = page->h[axis][0]; int x1 = n - page->h[axis][1]; int max = 0; for (int x = x0; x < x1; x++) { int w = cell_width (page, axis, x); if (w > max) max = w; } return max; } /* A cell that doesn't completely fit on the render_page. */ struct render_overflow { struct hmap_node node; /* In render_page's 'overflows' hmap. */ /* Occupied region of page. d[H][0] is the leftmost column. d[H][1] is the rightmost column, plus 1. d[V][0] is the top row. d[V][1] is the bottom row, plus 1. The cell in its original table might occupy a larger region. This member reflects the size of the cell in the current render_page, after trimming off any rows or columns due to page-breaking. */ int d[TABLE_N_AXES]; /* The space that has been trimmed off the cell: overflow[H][0]: space trimmed off its left side. overflow[H][1]: space trimmed off its right side. overflow[V][0]: space trimmed off its top. overflow[V][1]: space trimmed off its bottom. During rendering, this information is used to position the rendered portion of the cell within the available space. When a cell is rendered, sometimes it is permitted to spill over into space that is ordinarily reserved for rules. Either way, this space is still included in overflow values. Suppose, for example, that a cell that joins 2 columns has a width of 60 pixels and content "abcdef", that the 2 columns that it joins have widths of 20 and 30 pixels, respectively, and that therefore the rule between the two joined columns has a width of 10 (20 + 10 + 30 = 60). It might render like this, if each character is 10x10, and showing a few extra table cells for context: +------+ |abcdef| +--+---+ |gh|ijk| +--+---+ If this render_page is broken at the rule that separates "gh" from "ijk", then the page that contains the left side of the "abcdef" cell will have overflow[H][1] of 10 + 30 = 40 for its portion of the cell, and the page that contains the right side of the cell will have overflow[H][0] of 20 + 10 = 30. The two resulting pages would look like this: +--- |abc +--+ |gh| +--+ and: ----+ cdef| +---+ |ijk| +---+ */ int overflow[TABLE_N_AXES][2]; }; /* Returns a hash value for (,Y). */ static unsigned int hash_cell (int x, int y) { return hash_int (x + (y << 16), 0); } /* Searches PAGE's set of render_overflow for one whose top-left cell is (X,Y). Returns it, if there is one, otherwise a null pointer. */ static const struct render_overflow * find_overflow (const struct render_page *page, int x, int y) { if (!hmap_is_empty (&page->overflows)) { const struct render_overflow *of; HMAP_FOR_EACH_WITH_HASH (of, struct render_overflow, node, hash_cell (x, y), &page->overflows) if (x == of->d[H] && y == of->d[V]) return of; } return NULL; } /* Row or column dimensions. Used to figure the size of a table in render_page_create() and discarded after that. */ struct render_row { /* Width without considering rows (or columns) that span more than one (or column). */ int unspanned; /* Width taking spanned rows (or columns) into consideration. */ int width; }; /* Modifies the 'width' members of the N elements of ROWS so that their sum, when added to rule widths RULES[1] through RULES[N - 1] inclusive, is at least WIDTH. */ static void distribute_spanned_width (int width, struct render_row *rows, const int *rules, int n) { /* Sum up the unspanned widths of the N rows for use as weights. */ int total_unspanned = 0; for (int x = 0; x < n; x++) total_unspanned += rows[x].unspanned; for (int x = 0; x < n - 1; x++) total_unspanned += rules[x + 1]; if (total_unspanned >= width) return; /* The algorithm used here is based on the following description from HTML 4: For cells that span multiple columns, a simple approach consists of apportioning the min/max widths evenly to each of the constituent columns. A slightly more complex approach is to use the min/max widths of unspanned cells to weight how spanned widths are apportioned. Experiments suggest that a blend of the two approaches gives good results for a wide range of tables. We blend the two approaches half-and-half, except that we cannot use the unspanned weights when 'total_unspanned' is 0 (because that would cause a division by zero). The calculation we want to do is this: w0 = width / n w1 = width * (column's unspanned width) / (total unspanned width) (column's width) = (w0 + w1) / 2 We implement it as a precise calculation in integers by multiplying w0 and w1 by the common denominator of all three calculations (d), dividing that out in the column width calculation, and then keeping the remainder for the next iteration. (We actually compute the unspanned width of a column as twice the unspanned width, plus the width of the rule on the left, plus the width of the rule on the right. That way each rule contributes to both the cell on its left and on its right.) */ long long int d0 = n; long long int d1 = 2LL * MAX (total_unspanned, 1); long long int d = d0 * d1; if (total_unspanned > 0) d *= 2; long long int w = d / 2; for (int x = 0; x < n; x++) { w += width * d1; if (total_unspanned > 0) { long long int unspanned = rows[x].unspanned * 2LL; if (x < n - 1) unspanned += rules[x + 1]; if (x > 0) unspanned += rules[x]; w += width * unspanned * d0; } rows[x].width = MAX (rows[x].width, w / d); w -= rows[x].width * d; } } /* Initializes PAGE->cp[AXIS] from the row widths in ROWS and the rule widths in RULES. */ static void accumulate_row_widths (const struct render_page *page, enum table_axis axis, const struct render_row *rows, const int *rules) { int n = page->n[axis]; int *cp = page->cp[axis]; cp[0] = 0; for (int z = 0; z < n; z++) { cp[1] = cp[0] + rules[z]; cp[2] = cp[1] + rows[z].width; cp += 2; } cp[1] = cp[0] + rules[n]; } /* Returns the sum of widths of the N ROWS and N+1 RULES. */ static int calculate_table_width (int n, const struct render_row *rows, int *rules) { int width = 0; for (int x = 0; x < n; x++) width += rows[x].width; for (int x = 0; x <= n; x++) width += rules[x]; return width; } /* Rendering utility functions. */ /* Returns the line style to use for drawing a rule of the given TYPE. */ static enum render_line_style rule_to_render_type (unsigned char type) { switch (type) { case TABLE_STROKE_NONE: return RENDER_LINE_NONE; case TABLE_STROKE_SOLID: return RENDER_LINE_SINGLE; case TABLE_STROKE_DASHED: return RENDER_LINE_DASHED; case TABLE_STROKE_THICK: return RENDER_LINE_THICK; case TABLE_STROKE_THIN: return RENDER_LINE_THIN; case TABLE_STROKE_DOUBLE: return RENDER_LINE_DOUBLE; default: NOT_REACHED (); } } /* Returns the width of the rule in TABLE that is at offset Z along axis A, if rendered with PARAMS. */ static int measure_rule (const struct render_params *params, const struct table *table, enum table_axis a, int z) { enum table_axis b = !a; /* Determine all types of rules that are present, as a bitmap in 'rules' where rule type 't' is present if bit 2**t is set. */ struct cell_color color; unsigned int rules = 0; int d[TABLE_N_AXES]; d[a] = z; for (d[b] = 0; d[b] < table->n[b]; d[b]++) rules |= 1u << table_get_rule (table, a, d[H], d[V], &color); /* Turn off TABLE_STROKE_NONE because it has width 0 and we needn't bother. However, if the device doesn't support margins, make sure that there is at least a small gap between cells (but we don't need any at the left or right edge of the table). */ if (rules & (1u << TABLE_STROKE_NONE)) { rules &= ~(1u << TABLE_STROKE_NONE); if (z > 0 && z < table->n[a] && !params->supports_margins && a == H) rules |= 1u << TABLE_STROKE_SOLID; } /* Calculate maximum width of the rules that are present. */ int width = 0; for (size_t i = 0; i < TABLE_N_STROKES; i++) if (rules & (1u << i)) width = MAX (width, params->line_widths[a][rule_to_render_type (i)]); return width; } /* Allocates and returns a new render_page using PARAMS and TABLE. Allocates space for rendering a table with dimensions given in N. The caller must initialize most of the members itself. */ static struct render_page * render_page_allocate__ (const struct render_params *params, struct table *table, int n[TABLE_N_AXES]) { struct render_page *page = xmalloc (sizeof *page); page->params = params; page->table = table; page->ref_cnt = 1; page->n[H] = n[H]; page->n[V] = n[V]; for (int i = 0; i < TABLE_N_AXES; i++) { page->cp[i] = xmalloc ((2 * n[i] + 2) * sizeof *page->cp[i]); page->join_crossing[i] = xzalloc ((n[i] + 1) * sizeof *page->join_crossing[i]); } hmap_init (&page->overflows); memset (page->is_edge_cutoff, 0, sizeof page->is_edge_cutoff); return page; } /* Allocates and returns a new render_page using PARAMS and TABLE. Allocates space for all of the members of the new page, but the caller must initialize the 'cp' member itself. */ static struct render_page * render_page_allocate (const struct render_params *params, struct table *table) { struct render_page *page = render_page_allocate__ (params, table, table->n); for (enum table_axis a = 0; a < TABLE_N_AXES; a++) { page->h[a][0] = table->h[a][0]; page->h[a][1] = table->h[a][1]; page->r[a][0] = table->h[a][0]; page->r[a][1] = table->n[a] - table->h[a][1]; } return page; } /* Allocates and returns a new render_page for PARAMS and TABLE, initializing cp[H] in the new page from ROWS and RULES. The caller must still initialize cp[V]. */ static struct render_page * create_page_with_exact_widths (const struct render_params *params, struct table *table, const struct render_row *rows, int *rules) { struct render_page *page = render_page_allocate (params, table); accumulate_row_widths (page, H, rows, rules); return page; } /* Allocates and returns a new render_page for PARAMS and TABLE. Initializes cp[H] in the new page by setting the width of each row 'i' to somewhere between the minimum cell width ROW_MIN[i].width and the maximum ROW_MAX[i].width. Sets the width of rules to those in RULES. W_MIN is the sum of ROWS_MIN[].width. W_MAX is the sum of ROWS_MAX[].width. The caller must still initialize cp[V]. */ static struct render_page * create_page_with_interpolated_widths (const struct render_params *params, struct table *table, const struct render_row *rows_min, const struct render_row *rows_max, int w_min, int w_max, const int *rules) { const int n = table->n[H]; const long long int avail = params->size[H] - w_min; const long long int wanted = w_max - w_min; assert (wanted > 0); struct render_page *page = render_page_allocate (params, table); int *cph = page->cp[H]; *cph = 0; long long int w = wanted / 2; for (int x = 0; x < n; x++) { w += avail * (rows_max[x].width - rows_min[x].width); int extra = w / wanted; w -= extra * wanted; cph[1] = cph[0] + rules[x]; cph[2] = cph[1] + rows_min[x].width + extra; cph += 2; } cph[1] = cph[0] + rules[n]; assert (page->cp[H][n * 2 + 1] == params->size[H]); return page; } static void set_join_crossings (struct render_page *page, enum table_axis axis, const struct table_cell *cell, int *rules) { for (int z = cell->d[axis][0] + 1; z <= cell->d[axis][1] - 1; z++) page->join_crossing[axis][z] = rules[z]; } /* Maps a contiguous range of cells from a page to the underlying table along the horizpntal or vertical dimension. */ struct map { int p0; /* First ordinate in the page. */ int t0; /* First ordinate in the table. */ int n; /* Number of ordinates in page and table. */ }; /* Initializes M to a mapping from PAGE to PAGE->table along axis A. The mapping includes ordinate Z (in PAGE). */ static void get_map (const struct render_page *page, enum table_axis a, int z, struct map *m) { if (z < page->h[a][0]) { m->p0 = 0; m->t0 = 0; m->n = page->h[a][0]; } else if (z < page->n[a] - page->h[a][1]) { m->p0 = page->h[a][0]; m->t0 = page->r[a][0]; m->n = page->r[a][1] - page->r[a][0]; } else { m->p0 = page->n[a] - page->h[a][1]; m->t0 = page->table->n[a] - page->table->h[a][1]; m->n = page->h[a][1]; } } /* Initializes CELL with the contents of the table cell at column X and row Y within PAGE. When CELL is no longer needed, the caller is responsible for freeing it by calling table_cell_free(CELL). The caller must ensure that CELL is destroyed before TABLE is unref'ed. This is equivalent to table_get_cell(), except X and Y are in terms of the page's rows and columns rather than the underlying table's. */ static void render_get_cell (const struct render_page *page, int x, int y, struct table_cell *cell) { int d[TABLE_N_AXES] = { [H] = x, [V] = y }; struct map map[TABLE_N_AXES]; for (enum table_axis a = 0; a < TABLE_N_AXES; a++) { struct map *m = &map[a]; get_map (page, a, d[a], m); d[a] += m->t0 - m->p0; } table_get_cell (page->table, d[H], d[V], cell); for (enum table_axis a = 0; a < TABLE_N_AXES; a++) { struct map *m = &map[a]; for (int i = 0; i < 2; i++) cell->d[a][i] -= m->t0 - m->p0; cell->d[a][0] = MAX (cell->d[a][0], m->p0); cell->d[a][1] = MIN (cell->d[a][1], m->p0 + m->n); } } /* Creates and returns a new render_page for rendering TABLE on a device described by PARAMS. The new render_page will be suitable for rendering on a device whose page size is PARAMS->size, but the caller is responsible for actually breaking it up to fit on such a device, using the render_break abstraction. */ static struct render_page * render_page_create (const struct render_params *params, struct table *table, int min_width) { enum { MIN, MAX }; int nc = table_nc (table); int nr = table_nr (table); /* Figure out rule widths. */ int *rules[TABLE_N_AXES]; for (enum table_axis axis = 0; axis < TABLE_N_AXES; axis++) { int n = table->n[axis] + 1; rules[axis] = xnmalloc (n, sizeof *rules); for (int z = 0; z < n; z++) rules[axis][z] = measure_rule (params, table, axis, z); } /* Calculate minimum and maximum widths of cells that do not span multiple columns. */ struct render_row *columns[2]; for (int i = 0; i < 2; i++) columns[i] = xzalloc (nc * sizeof *columns[i]); for (int y = 0; y < nr; y++) for (int x = 0; x < nc;) { struct table_cell cell; table_get_cell (table, x, y, &cell); if (y == cell.d[V][0]) { if (table_cell_colspan (&cell) == 1) { int w[2]; params->measure_cell_width (params->aux, &cell, &w[MIN], &w[MAX]); for (int i = 0; i < 2; i++) if (columns[i][x].unspanned < w[i]) columns[i][x].unspanned = w[i]; } } x = cell.d[H][1]; } /* Distribute widths of spanned columns. */ for (int i = 0; i < 2; i++) for (int x = 0; x < nc; x++) columns[i][x].width = columns[i][x].unspanned; for (int y = 0; y < nr; y++) for (int x = 0; x < nc;) { struct table_cell cell; table_get_cell (table, x, y, &cell); if (y == cell.d[V][0] && table_cell_colspan (&cell) > 1) { int w[2]; params->measure_cell_width (params->aux, &cell, &w[MIN], &w[MAX]); for (int i = 0; i < 2; i++) distribute_spanned_width (w[i], &columns[i][cell.d[H][0]], rules[H], table_cell_colspan (&cell)); } x = cell.d[H][1]; } if (min_width > 0) for (int i = 0; i < 2; i++) distribute_spanned_width (min_width, &columns[i][0], rules[H], nc); /* In pathological cases, spans can cause the minimum width of a column to exceed the maximum width. This bollixes our interpolation algorithm later, so fix it up. */ for (int i = 0; i < nc; i++) if (columns[MIN][i].width > columns[MAX][i].width) columns[MAX][i].width = columns[MIN][i].width; /* Decide final column widths. */ int table_widths[2]; for (int i = 0; i < 2; i++) table_widths[i] = calculate_table_width (table_nc (table), columns[i], rules[H]); struct render_page *page; if (table_widths[MAX] <= params->size[H]) { /* Fits even with maximum widths. Use them. */ page = create_page_with_exact_widths (params, table, columns[MAX], rules[H]); } else if (table_widths[MIN] <= params->size[H]) { /* Fits with minimum widths, so distribute the leftover space. */ page = create_page_with_interpolated_widths ( params, table, columns[MIN], columns[MAX], table_widths[MIN], table_widths[MAX], rules[H]); } else { /* Doesn't fit even with minimum widths. Assign minimums for now, and later we can break it horizontally into multiple pages. */ page = create_page_with_exact_widths (params, table, columns[MIN], rules[H]); } /* Calculate heights of cells that do not span multiple rows. */ struct render_row *rows = xzalloc (nr * sizeof *rows); for (int y = 0; y < nr; y++) for (int x = 0; x < nc;) { struct render_row *r = &rows[y]; struct table_cell cell; render_get_cell (page, x, y, &cell); if (y == cell.d[V][0]) { if (table_cell_rowspan (&cell) == 1) { int w = joined_width (page, H, cell.d[H][0], cell.d[H][1]); int h = params->measure_cell_height (params->aux, &cell, w); if (h > r->unspanned) r->unspanned = r->width = h; } else set_join_crossings (page, V, &cell, rules[V]); if (table_cell_colspan (&cell) > 1) set_join_crossings (page, H, &cell, rules[H]); } x = cell.d[H][1]; } for (int i = 0; i < 2; i++) free (columns[i]); /* Distribute heights of spanned rows. */ for (int y = 0; y < nr; y++) for (int x = 0; x < nc;) { struct table_cell cell; render_get_cell (page, x, y, &cell); if (y == cell.d[V][0] && table_cell_rowspan (&cell) > 1) { int w = joined_width (page, H, cell.d[H][0], cell.d[H][1]); int h = params->measure_cell_height (params->aux, &cell, w); distribute_spanned_width (h, &rows[cell.d[V][0]], rules[V], table_cell_rowspan (&cell)); } x = cell.d[H][1]; } /* Decide final row heights. */ accumulate_row_widths (page, V, rows, rules[V]); free (rows); /* Measure headers. If they are "too big", get rid of them. */ for (enum table_axis axis = 0; axis < TABLE_N_AXES; axis++) { int hw = headers_width (page, axis); if (hw * 2 >= page->params->size[axis] || hw + max_cell_width (page, axis) > page->params->size[axis]) { page->h[axis][0] = page->h[axis][1] = 0; page->r[axis][0] = 0; page->r[axis][1] = page->n[axis]; } } free (rules[H]); free (rules[V]); return page; } /* Increases PAGE's reference count. */ struct render_page * render_page_ref (const struct render_page *page_) { struct render_page *page = CONST_CAST (struct render_page *, page_); page->ref_cnt++; return page; } /* Decreases PAGE's reference count and destroys PAGE if this causes the reference count to fall to zero. */ static void render_page_unref (struct render_page *page) { if (page != NULL && --page->ref_cnt == 0) { struct render_overflow *overflow, *next; HMAP_FOR_EACH_SAFE (overflow, next, struct render_overflow, node, &page->overflows) free (overflow); hmap_destroy (&page->overflows); table_unref (page->table); for (int i = 0; i < TABLE_N_AXES; ++i) { free (page->join_crossing[i]); free (page->cp[i]); } free (page); } } /* Returns the size of PAGE along AXIS. (This might be larger than the page size specified in the parameters passed to render_page_create(). Use a render_break to break up a render_page into page-sized chunks.) */ static int render_page_get_size (const struct render_page *page, enum table_axis axis) { return page->cp[axis][page->n[axis] * 2 + 1]; } static int render_page_get_best_breakpoint (const struct render_page *page, int height) { /* If there's no room for at least the top row and the rules above and below it, don't include any of the table. */ if (page->cp[V][3] > height) return 0; /* Otherwise include as many rows and rules as we can. */ for (int y = 5; y <= 2 * page->n[V] + 1; y += 2) if (page->cp[V][y] > height) return page->cp[V][y - 2]; return height; } /* Drawing render_pages. */ /* This is like table_get_rule() except: - D is in terms of the page's rows and column rather than the underlying table's. - The result is in the form of a render_line_style. */ static enum render_line_style get_rule (const struct render_page *page, enum table_axis axis, const int d_[TABLE_N_AXES], struct cell_color *color) { int d[TABLE_N_AXES] = { d_[0] / 2, d_[1] / 2 }; int d2 = -1; enum table_axis a = axis; if (d[a] < page->h[a][0]) /* Nothing to do */; else if (d[a] <= page->n[a] - page->h[a][1]) { if (page->h[a][0] && d[a] == page->h[a][0]) d2 = page->h[a][0]; else if (page->h[a][1] && d[a] == page->n[a] - page->h[a][1]) d2 = page->table->n[a] - page->h[a][1]; d[a] += page->r[a][0] - page->h[a][0]; } else d[a] += ((page->table->n[a] - page->table->h[a][1]) - (page->n[a] - page->h[a][1])); enum table_axis b = !axis; struct map m; get_map (page, b, d[b], &m); d[b] += m.t0 - m.p0; int r = table_get_rule (page->table, axis, d[H], d[V], color); if (d2 >= 0) { d[a] = d2; int r2 = table_get_rule (page->table, axis, d[H], d[V], color); r = table_stroke_combine (r, r2); } return rule_to_render_type (r); } static bool is_rule (int z) { return !(z & 1); } bool render_direction_rtl (void) { /* TRANSLATORS: Do not translate this string. If the script of your language reads from right to left (eg Persian, Arabic, Hebrew etc), then replace this string with "output-direction-rtl". Otherwise either leave it untranslated or copy it verbatim. */ const char *dir = _("output-direction-ltr"); if (0 == strcmp ("output-direction-rtl", dir)) return true; if (0 != strcmp ("output-direction-ltr", dir)) fprintf (stderr, "This localisation has been incorrectly translated. " "Complain to the translator.\n"); return false; } static void render_rule (const struct render_page *page, const int ofs[TABLE_N_AXES], const int d[TABLE_N_AXES]) { enum render_line_style styles[TABLE_N_AXES][2]; struct cell_color colors[TABLE_N_AXES][2]; for (enum table_axis a = 0; a < TABLE_N_AXES; a++) { enum table_axis b = !a; styles[a][0] = styles[a][1] = RENDER_LINE_NONE; if (!is_rule (d[a]) || (page->is_edge_cutoff[a][0] && d[a] == 0) || (page->is_edge_cutoff[a][1] && d[a] == page->n[a] * 2)) continue; if (is_rule (d[b])) { if (d[b] > 0) { int e[TABLE_N_AXES]; e[H] = d[H]; e[V] = d[V]; e[b]--; styles[a][0] = get_rule (page, a, e, &colors[a][0]); } if (d[b] / 2 < page->n[b]) styles[a][1] = get_rule (page, a, d, &colors[a][1]); } else { styles[a][0] = styles[a][1] = get_rule (page, a, d, &colors[a][0]); colors[a][1] = colors[a][0]; } } if (styles[H][0] != RENDER_LINE_NONE || styles[H][1] != RENDER_LINE_NONE || styles[V][0] != RENDER_LINE_NONE || styles[V][1] != RENDER_LINE_NONE) { int bb[TABLE_N_AXES][2]; bb[H][0] = ofs[H] + page->cp[H][d[H]]; bb[H][1] = ofs[H] + page->cp[H][d[H] + 1]; if (page->params->rtl) { int temp = bb[H][0]; bb[H][0] = render_page_get_size (page, H) - bb[H][1]; bb[H][1] = render_page_get_size (page, H) - temp; } bb[V][0] = ofs[V] + page->cp[V][d[V]]; bb[V][1] = ofs[V] + page->cp[V][d[V] + 1]; page->params->draw_line (page->params->aux, bb, styles, colors); } } static void render_cell (const struct render_page *page, const int ofs[TABLE_N_AXES], const struct table_cell *cell) { int bb[TABLE_N_AXES][2]; int clip[TABLE_N_AXES][2]; bb[H][0] = clip[H][0] = ofs[H] + page->cp[H][cell->d[H][0] * 2 + 1]; bb[H][1] = clip[H][1] = ofs[H] + page->cp[H][cell->d[H][1] * 2]; if (page->params->rtl) { int temp = bb[H][0]; bb[H][0] = clip[H][0] = render_page_get_size (page, H) - bb[H][1]; bb[H][1] = clip[H][1] = render_page_get_size (page, H) - temp; } bb[V][0] = clip[V][0] = ofs[V] + page->cp[V][cell->d[V][0] * 2 + 1]; bb[V][1] = clip[V][1] = ofs[V] + page->cp[V][cell->d[V][1] * 2]; enum table_valign valign = cell->style->cell_style.valign; if (valign != TABLE_VALIGN_TOP) { int height = page->params->measure_cell_height ( page->params->aux, cell, bb[H][1] - bb[H][0]); int extra = bb[V][1] - bb[V][0] - height; if (extra > 0) { if (valign == TABLE_VALIGN_CENTER) extra /= 2; bb[V][0] += extra; } } const struct render_overflow *of = find_overflow ( page, cell->d[H][0], cell->d[V][0]); if (of) for (enum table_axis axis = 0; axis < TABLE_N_AXES; axis++) { if (of->overflow[axis][0]) { bb[axis][0] -= of->overflow[axis][0]; if (cell->d[axis][0] == 0 && !page->is_edge_cutoff[axis][0]) clip[axis][0] = ofs[axis] + page->cp[axis][cell->d[axis][0] * 2]; } if (of->overflow[axis][1]) { bb[axis][1] += of->overflow[axis][1]; if (cell->d[axis][1] == page->n[axis] && !page->is_edge_cutoff[axis][1]) clip[axis][1] = ofs[axis] + page->cp[axis][cell->d[axis][1] * 2 + 1]; } } int spill[TABLE_N_AXES][2]; for (enum table_axis axis = 0; axis < TABLE_N_AXES; axis++) { spill[axis][0] = rule_width (page, axis, cell->d[axis][0]) / 2; spill[axis][1] = rule_width (page, axis, cell->d[axis][1]) / 2; } int color_idx = (cell->d[V][0] < page->h[V][0] || page->n[V] - (cell->d[V][0] + 1) < page->h[V][1] ? 0 : (cell->d[V][0] - page->h[V][0]) & 1); page->params->draw_cell (page->params->aux, cell, color_idx, bb, spill, clip); } /* Draws the cells of PAGE indicated in BB. */ static void render_page_draw_cells (const struct render_page *page, int ofs[TABLE_N_AXES], int bb[TABLE_N_AXES][2]) { for (int y = bb[V][0]; y < bb[V][1]; y++) for (int x = bb[H][0]; x < bb[H][1];) if (!is_rule (x) && !is_rule (y)) { struct table_cell cell; render_get_cell (page, x / 2, y / 2, &cell); if (y / 2 == bb[V][0] / 2 || y / 2 == cell.d[V][0]) render_cell (page, ofs, &cell); x = rule_ofs (cell.d[H][1]); } else x++; for (int y = bb[V][0]; y < bb[V][1]; y++) for (int x = bb[H][0]; x < bb[H][1]; x++) if (is_rule (x) || is_rule (y)) { int d[TABLE_N_AXES]; d[H] = x; d[V] = y; render_rule (page, ofs, d); } } /* Renders PAGE, by calling the 'draw_line' and 'draw_cell' functions from the render_params provided to render_page_create(). */ static void render_page_draw (const struct render_page *page, int ofs[TABLE_N_AXES]) { int bb[TABLE_N_AXES][2]; bb[H][0] = 0; bb[H][1] = page->n[H] * 2 + 1; bb[V][0] = 0; bb[V][1] = page->n[V] * 2 + 1; render_page_draw_cells (page, ofs, bb); } /* Returns the greatest value i, 0 <= i < n, such that cp[i] <= x0. */ static int get_clip_min_extent (int x0, const int cp[], int n) { int low = 0; int high = n; int best = 0; while (low < high) { int middle = low + (high - low) / 2; if (cp[middle] <= x0) { best = middle; low = middle + 1; } else high = middle; } return best; } /* Returns the least value i, 0 <= i < n, such that cp[i] >= x1. */ static int get_clip_max_extent (int x1, const int cp[], int n) { int low = 0; int high = n; int best = n; while (low < high) { int middle = low + (high - low) / 2; if (cp[middle] >= x1) best = high = middle; else low = middle + 1; } while (best > 0 && cp[best - 1] == cp[best]) best--; return best; } /* Renders the cells of PAGE that intersect (X,Y)-(X+W,Y+H), by calling the 'draw_line' and 'draw_cell' functions from the render_params provided to render_page_create(). */ static void render_page_draw_region (const struct render_page *page, int ofs[TABLE_N_AXES], int clip[TABLE_N_AXES][2]) { int bb[TABLE_N_AXES][2]; bb[H][0] = get_clip_min_extent (clip[H][0], page->cp[H], page->n[H] * 2 + 1); bb[H][1] = get_clip_max_extent (clip[H][1], page->cp[H], page->n[H] * 2 + 1); bb[V][0] = get_clip_min_extent (clip[V][0], page->cp[V], page->n[V] * 2 + 1); bb[V][1] = get_clip_max_extent (clip[V][1], page->cp[V], page->n[V] * 2 + 1); render_page_draw_cells (page, ofs, bb); } /* Breaking up tables to fit on a page. */ /* An iterator for breaking render_pages into smaller chunks. */ struct render_break { struct render_page *page; /* Page being broken up. */ enum table_axis axis; /* Axis along which 'page' is being broken. */ int z; /* Next cell along 'axis'. */ int pixel; /* Pixel offset within cell 'z' (usually 0). */ int hw; /* Width of headers of 'page' along 'axis'. */ }; static int needed_size (const struct render_break *, int cell); static bool cell_is_breakable (const struct render_break *, int cell); static struct render_page *render_page_select (const struct render_page *, enum table_axis, int z0, int p0, int z1, int p1); /* Initializes render_break B for breaking PAGE along AXIS. Takes ownership of PAGE. */ static void render_break_init (struct render_break *b, struct render_page *page, enum table_axis axis) { b->page = page; b->axis = axis; b->z = page->h[axis][0]; b->pixel = 0; b->hw = headers_width (page, axis); } /* Initializes B as a render_break structure for which render_break_has_next() always returns false. */ static void render_break_init_empty (struct render_break *b) { b->page = NULL; b->axis = TABLE_HORZ; b->z = 0; b->pixel = 0; b->hw = 0; } /* Frees B and unrefs the render_page that it owns. */ static void render_break_destroy (struct render_break *b) { if (b != NULL) { render_page_unref (b->page); b->page = NULL; } } /* Returns true if B still has cells that are yet to be returned, false if all of B's page has been processed. */ static bool render_break_has_next (const struct render_break *b) { const struct render_page *page = b->page; enum table_axis axis = b->axis; return page != NULL && b->z < page->n[axis] - page->h[axis][1]; } /* Returns a new render_page that is up to SIZE pixels wide along B's axis. Returns a null pointer if B has already been completely broken up, or if SIZE is too small to reasonably render any cells. The latter will never happen if SIZE is at least as large as the page size passed to render_page_create() along B's axis. */ static struct render_page * render_break_next (struct render_break *b, int size) { const struct render_page *page = b->page; enum table_axis axis = b->axis; struct render_page *subpage; if (!render_break_has_next (b)) return NULL; int pixel = 0; int z; for (z = b->z; z < page->n[axis] - page->h[axis][1]; z++) { int needed = needed_size (b, z + 1); if (needed > size) { if (cell_is_breakable (b, z)) { /* If there is no right header and we render a partial cell on the right side of the body, then we omit the rightmost rule of the body. Otherwise the rendering is deceptive because it looks like the whole cell is present instead of a partial cell. This is similar to code for the left side in needed_size(). */ int rule_allowance = (page->h[axis][1] ? 0 : rule_width (page, axis, z)); /* The amount that, if we added cell 'z', the rendering would overfill the allocated 'size'. */ int overhang = needed - size - rule_allowance; /* The width of cell 'z'. */ int cell_size = cell_width (page, axis, z); /* The amount trimmed off the left side of 'z', and the amount left to render. */ int cell_ofs = z == b->z ? b->pixel : 0; int cell_left = cell_size - cell_ofs; /* A small but visible width. */ int em = page->params->font_size[axis]; /* If some of the cell remains to render, and there would still be some of the cell left afterward, then partially render that much of the cell. */ pixel = (cell_left && cell_left > overhang ? cell_left - overhang + cell_ofs : 0); /* If there would be only a tiny amount of the cell left after rendering it partially, reduce the amount rendered slightly to make the output look a little better. */ if (pixel + em > cell_size) pixel = MAX (pixel - em, 0); /* If we're breaking vertically, then consider whether the cells being broken have a better internal breakpoint than the exact number of pixels available, which might look bad e.g. because it breaks in the middle of a line of text. */ if (axis == TABLE_VERT && page->params->adjust_break) for (int x = 0; x < page->n[H];) { struct table_cell cell; render_get_cell (page, x, z, &cell); int w = joined_width (page, H, cell.d[H][0], cell.d[H][1]); int better_pixel = page->params->adjust_break ( page->params->aux, &cell, w, pixel); x = cell.d[H][1]; if (better_pixel < pixel) { if (better_pixel > (z == b->z ? b->pixel : 0)) { pixel = better_pixel; break; } else if (better_pixel == 0 && z != b->z) { pixel = 0; break; } } } } break; } } if (z == b->z && !pixel) return NULL; subpage = render_page_select (page, axis, b->z, b->pixel, pixel ? z + 1 : z, pixel ? cell_width (page, axis, z) - pixel : 0); b->z = z; b->pixel = pixel; return subpage; } /* Returns the width that would be required along B's axis to render a page from B's current position up to but not including CELL. */ static int needed_size (const struct render_break *b, int cell) { const struct render_page *page = b->page; enum table_axis axis = b->axis; /* Width of left header not including its rightmost rule. */ int size = axis_width (page, axis, 0, rule_ofs (page->h[axis][0])); /* If we have a pixel offset and there is no left header, then we omit the leftmost rule of the body. Otherwise the rendering is deceptive because it looks like the whole cell is present instead of a partial cell. Otherwise (if there are headers) we will be merging two rules: the rightmost rule in the header and the leftmost rule in the body. We assume that the width of a merged rule is the larger of the widths of either rule invidiually. */ if (b->pixel == 0 || page->h[axis][0]) size += MAX (rule_width (page, axis, page->h[axis][0]), rule_width (page, axis, b->z)); /* Width of body, minus any pixel offset in the leftmost cell. */ size += joined_width (page, axis, b->z, cell) - b->pixel; /* Width of rightmost rule in body merged with leftmost rule in headers. */ size += MAX (rule_width_r (page, axis, page->h[axis][1]), rule_width (page, axis, cell)); /* Width of right header not including its leftmost rule. */ size += axis_width (page, axis, rule_ofs_r (page, axis, page->h[axis][1]), rule_ofs_r (page, axis, 0)); /* Join crossing. */ if (page->h[axis][0] && page->h[axis][1]) size += page->join_crossing[axis][b->z]; return size; } /* Returns true if CELL along B's axis may be broken across a page boundary. This is just a heuristic. Breaking cells across page boundaries can save space, but it looks ugly. */ static bool cell_is_breakable (const struct render_break *b, int cell) { const struct render_page *page = b->page; enum table_axis axis = b->axis; return cell_width (page, axis, cell) >= page->params->min_break[axis]; } /* render_pager. */ struct render_pager { const struct render_params *params; struct render_page **pages; size_t n_pages, allocated_pages; size_t cur_page; struct render_break x_break; struct render_break y_break; }; static const struct render_page * render_pager_add_table (struct render_pager *p, struct table *table, int min_width) { if (p->n_pages >= p->allocated_pages) p->pages = x2nrealloc (p->pages, &p->allocated_pages, sizeof *p->pages); struct render_page *page = render_page_create (p->params, table, min_width); p->pages[p->n_pages++] = page; return page; } static void render_pager_start_page (struct render_pager *p) { render_break_init (&p->x_break, render_page_ref (p->pages[p->cur_page++]), H); render_break_init_empty (&p->y_break); } static void add_footnote_page (struct render_pager *p, const struct table_item *item) { const struct footnote **f; size_t n_footnotes = table_collect_footnotes (item, &f); if (!n_footnotes) return; struct table *t = table_create (1, n_footnotes, 0, 0, 0, 0); for (size_t i = 0; i < n_footnotes; i++) { table_text_format (t, 0, i, 0, "%s. %s", f[i]->marker, f[i]->content); table_add_style (t, 0, i, f[i]->style); } render_pager_add_table (p, t, 0); free (f); } static void add_text_page (struct render_pager *p, const struct table_item_text *t, int min_width) { if (!t) return; struct table *tab = table_create (1, 1, 0, 0, 0, 0); table_text (tab, 0, 0, 0, t->content); for (size_t i = 0; i < t->n_footnotes; i++) table_add_footnote (tab, 0, 0, t->footnotes[i]); if (t->style) tab->styles[0] = area_style_clone (tab->container, t->style); render_pager_add_table (p, tab, min_width); } static void add_layers_page (struct render_pager *p, const struct table_item_layers *layers, int min_width) { if (!layers) return; struct table *tab = table_create (1, layers->n_layers, 0, 0, 0, 0); for (size_t i = 0; i < layers->n_layers; i++) { const struct table_item_layer *layer = &layers->layers[i]; table_text (tab, 0, i, 0, layer->content); for (size_t j = 0; j < layer->n_footnotes; j++) table_add_footnote (tab, 0, i, layer->footnotes[j]); } if (layers->style) tab->styles[0] = area_style_clone (tab->container, layers->style); render_pager_add_table (p, tab, min_width); } /* Creates and returns a new render_pager for rendering TABLE_ITEM on the device with the given PARAMS. */ struct render_pager * render_pager_create (const struct render_params *params, const struct table_item *table_item) { const struct table *table = table_item_get_table (table_item); struct render_pager *p = xzalloc (sizeof *p); p->params = params; struct render_page *page = render_page_create (params, table_ref (table), 0); struct render_break b; render_break_init (&b, page, H); struct render_page *subpage = render_break_next (&b, p->params->size[H]); int title_width = subpage ? subpage->cp[H][2 * subpage->n[H] + 1] : 0; render_page_unref (subpage); render_break_destroy (&b); /* Title. */ add_text_page (p, table_item_get_title (table_item), title_width); /* Layers. */ add_layers_page (p, table_item_get_layers (table_item), title_width); /* Body. */ render_pager_add_table (p, table_ref (table_item_get_table (table_item)), 0); /* Caption. */ add_text_page (p, table_item_get_caption (table_item), 0); /* Footnotes. */ add_footnote_page (p, table_item); render_pager_start_page (p); return p; } /* Destroys P. */ void render_pager_destroy (struct render_pager *p) { if (p) { render_break_destroy (&p->x_break); render_break_destroy (&p->y_break); for (size_t i = 0; i < p->n_pages; i++) render_page_unref (p->pages[i]); free (p->pages); free (p); } } /* Returns true if P has content remaining to render, false if rendering is done. */ bool render_pager_has_next (const struct render_pager *p_) { struct render_pager *p = CONST_CAST (struct render_pager *, p_); while (!render_break_has_next (&p->y_break)) { render_break_destroy (&p->y_break); if (!render_break_has_next (&p->x_break)) { render_break_destroy (&p->x_break); if (p->cur_page >= p->n_pages) { render_break_init_empty (&p->x_break); render_break_init_empty (&p->y_break); return false; } render_pager_start_page (p); } else render_break_init ( &p->y_break, render_break_next (&p->x_break, p->params->size[H]), V); } return true; } /* Draws a chunk of content from P to fit in a space that has vertical size SPACE and the horizontal size specified in the render_params passed to render_page_create(). Returns the amount of space actually used by the rendered chunk, which will be 0 if SPACE is too small to render anything or if no content remains (use render_pager_has_next() to distinguish these cases). */ int render_pager_draw_next (struct render_pager *p, int space) { int ofs[TABLE_N_AXES] = { 0, 0 }; size_t start_page = SIZE_MAX; while (render_pager_has_next (p)) { if (start_page == p->cur_page) break; start_page = p->cur_page; struct render_page *page = render_break_next (&p->y_break, space - ofs[V]); if (!page) break; render_page_draw (page, ofs); ofs[V] += render_page_get_size (page, V); render_page_unref (page); } return ofs[V]; } /* Draws all of P's content. */ void render_pager_draw (const struct render_pager *p) { render_pager_draw_region (p, 0, 0, INT_MAX, INT_MAX); } /* Draws the region of P's content that lies in the region (X,Y)-(X+W,Y+H). Some extra content might be drawn; the device should perform clipping as necessary. */ void render_pager_draw_region (const struct render_pager *p, int x, int y, int w, int h) { int ofs[TABLE_N_AXES] = { 0, 0 }; int clip[TABLE_N_AXES][2]; clip[H][0] = x; clip[H][1] = x + w; for (size_t i = 0; i < p->n_pages; i++) { const struct render_page *page = p->pages[i]; int size = render_page_get_size (page, V); clip[V][0] = MAX (y, ofs[V]) - ofs[V]; clip[V][1] = MIN (y + h, ofs[V] + size) - ofs[V]; if (clip[V][1] > clip[V][0]) render_page_draw_region (page, ofs, clip); ofs[V] += size; } } /* Returns the size of P's content along AXIS; i.e. the content's width if AXIS is TABLE_HORZ and its length if AXIS is TABLE_VERT. */ int render_pager_get_size (const struct render_pager *p, enum table_axis axis) { int size = 0; for (size_t i = 0; i < p->n_pages; i++) { int subsize = render_page_get_size (p->pages[i], axis); size = axis == H ? MAX (size, subsize) : size + subsize; } return size; } int render_pager_get_best_breakpoint (const struct render_pager *p, int height) { int y = 0; size_t i; for (i = 0; i < p->n_pages; i++) { int size = render_page_get_size (p->pages[i], V); if (y + size >= height) return render_page_get_best_breakpoint (p->pages[i], height - y) + y; y += size; } return height; } /* render_page_select() and helpers. */ struct render_page_selection { const struct render_page *page; /* Page whose slice we are selecting. */ struct render_page *subpage; /* New page under construction. */ enum table_axis a; /* Axis of 'page' along which 'subpage' is a slice. */ enum table_axis b; /* The opposite of 'a'. */ int z0; /* First cell along 'a' being selected. */ int z1; /* Last cell being selected, plus 1. */ int p0; /* Number of pixels to trim off left side of z0. */ int p1; /* Number of pixels to trim off right side of z1-1. */ }; static void cell_to_subpage (struct render_page_selection *, const struct table_cell *, int subcell[TABLE_N_AXES]); static const struct render_overflow *find_overflow_for_cell ( struct render_page_selection *, const struct table_cell *); static struct render_overflow *insert_overflow (struct render_page_selection *, const struct table_cell *); /* Creates and returns a new render_page whose contents are a subregion of PAGE's contents. The new render_page includes cells Z0 through Z1 (exclusive) along AXIS, plus any headers on AXIS. If P0 is nonzero, then it is a number of pixels to exclude from the left or top (according to AXIS) of cell Z0. Similarly, P1 is a number of pixels to exclude from the right or bottom of cell Z1 - 1. (P0 and P1 are used to render cells that are too large to fit on a single page.) The whole of axis !AXIS is included. (The caller may follow up with another call to render_page_select() to select on !AXIS to select on that axis as well.) The caller retains ownership of PAGE, which is not modified. */ static struct render_page * render_page_select (const struct render_page *page, enum table_axis axis, int z0, int p0, int z1, int p1) { enum table_axis a = axis; enum table_axis b = !a; /* Optimize case where all of PAGE is selected by just incrementing the reference count. */ if (z0 == page->h[a][0] && p0 == 0 && z1 == page->n[a] - page->h[a][1] && p1 == 0) { struct render_page *page_rw = CONST_CAST (struct render_page *, page); page_rw->ref_cnt++; return page_rw; } /* Allocate subpage. */ int trim[2] = { z0 - page->h[a][0], (page->n[a] - page->h[a][1]) - z1 }; int n[TABLE_N_AXES] = { [H] = page->n[H], [V] = page->n[V] }; n[a] -= trim[0] + trim[1]; struct render_page *subpage = render_page_allocate__ ( page->params, table_ref (page->table), n); for (enum table_axis k = 0; k < TABLE_N_AXES; k++) { subpage->h[k][0] = page->h[k][0]; subpage->h[k][1] = page->h[k][1]; subpage->r[k][0] = page->r[k][0]; subpage->r[k][1] = page->r[k][1]; } subpage->r[a][0] += trim[0]; subpage->r[a][1] -= trim[1]; /* An edge is cut off if it was cut off in PAGE or if we're trimming pixels off that side of the page and there are no headers. */ subpage->is_edge_cutoff[a][0] = subpage->h[a][0] == 0 && (p0 || (z0 == 0 && page->is_edge_cutoff[a][0])); subpage->is_edge_cutoff[a][1] = subpage->h[a][1] == 0 && (p1 || (z1 == page->n[a] && page->is_edge_cutoff[a][1])); subpage->is_edge_cutoff[b][0] = page->is_edge_cutoff[b][0]; subpage->is_edge_cutoff[b][1] = page->is_edge_cutoff[b][1]; /* Select join crossings from PAGE into subpage. */ int *jc = subpage->join_crossing[a]; for (int z = 0; z < page->h[a][0]; z++) *jc++ = page->join_crossing[a][z]; for (int z = z0; z <= z1; z++) *jc++ = page->join_crossing[a][z]; for (int z = page->n[a] - page->h[a][1]; z < page->n[a]; z++) *jc++ = page->join_crossing[a][z]; assert (jc == &subpage->join_crossing[a][subpage->n[a] + 1]); memcpy (subpage->join_crossing[b], page->join_crossing[b], (subpage->n[b] + 1) * sizeof **subpage->join_crossing); /* Select widths from PAGE into subpage. */ int *scp = page->cp[a]; int *dcp = subpage->cp[a]; *dcp = 0; for (int z = 0; z <= rule_ofs (subpage->h[a][0]); z++, dcp++) { int w = !z && subpage->is_edge_cutoff[a][0] ? 0 : scp[z + 1] - scp[z]; dcp[1] = dcp[0] + w; } for (int z = cell_ofs (z0); z <= cell_ofs (z1 - 1); z++, dcp++) { dcp[1] = dcp[0] + (scp[z + 1] - scp[z]); if (z == cell_ofs (z0)) { dcp[1] -= p0; if (page->h[a][0] && page->h[a][1]) dcp[1] += page->join_crossing[a][z / 2]; } if (z == cell_ofs (z1 - 1)) dcp[1] -= p1; } for (int z = rule_ofs_r (page, a, subpage->h[a][1]); z <= rule_ofs_r (page, a, 0); z++, dcp++) { if (z == rule_ofs_r (page, a, 0) && subpage->is_edge_cutoff[a][1]) dcp[1] = dcp[0]; else dcp[1] = dcp[0] + (scp[z + 1] - scp[z]); } assert (dcp == &subpage->cp[a][2 * subpage->n[a] + 1]); for (int z = 0; z < page->n[b] * 2 + 2; z++) subpage->cp[b][z] = page->cp[b][z]; /* Add new overflows. */ struct render_page_selection s = { .page = page, .a = a, .b = b, .z0 = z0, .z1 = z1, .p0 = p0, .p1 = p1, .subpage = subpage, }; if (!page->h[a][0] || z0 > page->h[a][0] || p0) for (int z = 0; z < page->n[b];) { int d[TABLE_N_AXES]; d[a] = z0; d[b] = z; struct table_cell cell; render_get_cell (page, d[H], d[V], &cell); bool overflow0 = p0 || cell.d[a][0] < z0; bool overflow1 = cell.d[a][1] > z1 || (cell.d[a][1] == z1 && p1); if (overflow0 || overflow1) { struct render_overflow *ro = insert_overflow (&s, &cell); if (overflow0) { ro->overflow[a][0] += p0 + axis_width ( page, a, cell_ofs (cell.d[a][0]), cell_ofs (z0)); if (page->h[a][0] && page->h[a][1]) ro->overflow[a][0] -= page->join_crossing[a][cell.d[a][0] + 1]; } if (overflow1) { ro->overflow[a][1] += p1 + axis_width ( page, a, cell_ofs (z1), cell_ofs (cell.d[a][1])); if (page->h[a][0] && page->h[a][1]) ro->overflow[a][1] -= page->join_crossing[a][cell.d[a][1]]; } } z = cell.d[b][1]; } if (!page->h[a][1] || z1 < page->n[a] - page->h[a][1] || p1) for (int z = 0; z < page->n[b];) { int d[TABLE_N_AXES]; d[a] = z1 - 1; d[b] = z; struct table_cell cell; render_get_cell (page, d[H], d[V], &cell); if ((cell.d[a][1] > z1 || (cell.d[a][1] == z1 && p1)) && find_overflow_for_cell (&s, &cell) == NULL) { struct render_overflow *ro = insert_overflow (&s, &cell); ro->overflow[a][1] += p1 + axis_width (page, a, cell_ofs (z1), cell_ofs (cell.d[a][1])); } z = cell.d[b][1]; } /* Copy overflows from PAGE into subpage. */ struct render_overflow *ro; HMAP_FOR_EACH (ro, struct render_overflow, node, &page->overflows) { struct table_cell cell; table_get_cell (page->table, ro->d[H], ro->d[V], &cell); if (cell.d[a][1] > z0 && cell.d[a][0] < z1 && find_overflow_for_cell (&s, &cell) == NULL) insert_overflow (&s, &cell); } return subpage; } /* Given CELL, a table_cell within S->page, stores in SUBCELL the (x,y) coordinates of the top-left cell as it will appear in S->subpage. CELL must actually intersect the region of S->page that is being selected by render_page_select() or the results will not make any sense. */ static void cell_to_subpage (struct render_page_selection *s, const struct table_cell *cell, int subcell[TABLE_N_AXES]) { enum table_axis a = s->a; enum table_axis b = s->b; int ha0 = s->subpage->h[a][0]; subcell[a] = MAX (cell->d[a][0] - s->z0 + ha0, ha0); subcell[b] = cell->d[b][0]; } /* Given CELL, a table_cell within S->page, returns the render_overflow for that cell in S->subpage, if there is one, and a null pointer otherwise. CELL must actually intersect the region of S->page that is being selected by render_page_select() or the results will not make any sense. */ static const struct render_overflow * find_overflow_for_cell (struct render_page_selection *s, const struct table_cell *cell) { int subcell[2]; cell_to_subpage (s, cell, subcell); return find_overflow (s->subpage, subcell[H], subcell[V]); } /* Given CELL, a table_cell within S->page, inserts a render_overflow for that cell in S->subpage (which must not already exist). Initializes the new render_overflow's 'overflow' member from the overflow for CELL in S->page, if there is one. CELL must actually intersect the region of S->page that is being selected by render_page_select() or the results will not make any sense. */ static struct render_overflow * insert_overflow (struct render_page_selection *s, const struct table_cell *cell) { struct render_overflow *of = xzalloc (sizeof *of); cell_to_subpage (s, cell, of->d); hmap_insert (&s->subpage->overflows, &of->node, hash_cell (of->d[H], of->d[V])); const struct render_overflow *old = find_overflow (s->page, cell->d[H][0], cell->d[V][0]); if (old != NULL) memcpy (of->overflow, old->overflow, sizeof of->overflow); return of; } pspp-1.4.1/src/output/mk-class-boilerplate0000755000175000017500000000356513320146056020213 0ustar00blpblp00000000000000#! /usr/bin/perl while (<>) { if (my ($class, $super) = /boilerplate for ([a-zA-Z0-9_]+), a subclass of ([a-zA-Z0-9_]+)/) { while (<>) { last if / /; } print < #include "libpspp/cast.h" extern const struct ${super}_class ${class}_class; /* Returns true if SUPER is a ${class}, otherwise false. */ static inline bool is_${class} (const struct ${super} *super) { return super->class == &${class}_class; } /* Returns SUPER converted to ${class}. SUPER must be a ${class}, as reported by is_${class}. */ static inline struct ${class} * to_${class} (const struct ${super} *super) { assert (is_${class} (super)); return UP_CAST (super, struct ${class}, ${super}); } /* Returns INSTANCE converted to ${super}. */ static inline struct ${super} * ${class}_super (const struct ${class} *instance) { return CONST_CAST (struct ${super} *, &instance->${super}); } /* Increments INSTANCE's reference count and returns INSTANCE. */ static inline struct ${class} * ${class}_ref (const struct ${class} *instance) { return to_${class} (${super}_ref (&instance->${super})); } /* Decrements INSTANCE's reference count, then destroys INSTANCE if the reference count is now zero. */ static inline void ${class}_unref (struct ${class} *instance) { ${super}_unref (&instance->${super}); } /* Returns true if INSTANCE's reference count is greater than 1, false otherwise. */ static inline bool ${class}_is_shared (const struct ${class} *instance) { return ${super}_is_shared (&instance->${super}); } EOF if ($super ne 'output_item') { print <${super}); } EOF } else { print "void ${class}_submit (struct ${class} *);\n"; } } print; } pspp-1.4.1/src/output/options.c0000644000175000017500000002375113507505260016114 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2009, 2010, 2014 Free Software Foundation, Inc. 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 3 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, see . */ #include #include "output/options.h" #include #include #include #include #include #include "libpspp/str.h" #include "libpspp/string-map.h" #include "output/driver-provider.h" #include "output/measure.h" #include "gl/xalloc.h" #include "gettext.h" #define _(msgid) gettext (msgid) /* Creates and returns a new struct driver_option that contains copies of all of the supplied arguments. All of the arguments must be nonnull, except that VALUE may be NULL (if the user did not supply a value for this option). Refer to struct driver_option for the meaning of each argument. */ struct driver_option * driver_option_create (const char *driver_name, const char *name, const char *value, const char *default_value) { struct driver_option *o = xmalloc (sizeof *o); o->driver_name = xstrdup (driver_name); o->name = xstrdup (name); o->value = value != NULL ? xstrdup (value) : NULL; o->default_value = default_value ? xstrdup (default_value) : NULL; return o; } /* Creates and returns a new struct driver_option for output driver DRIVER (which is needed only to the extent that its name will be used in error messages). The option named NAME is extracted from OPTIONS. DEFAULT_VALUE is the default value of the option, used if the given option was not supplied or was invalid. */ struct driver_option * driver_option_get (struct output_driver *driver, struct string_map *options, const char *name, const char *default_value) { struct driver_option *option; char *value; value = string_map_find_and_delete (options, name); option = driver_option_create (output_driver_get_name (driver), name, value, default_value); free (value); return option; } /* Frees driver option O. */ void driver_option_destroy (struct driver_option *o) { if (o != NULL) { free (o->driver_name); free (o->name); free (o->value); free (o->default_value); free (o); } } /* Stores the paper size of the value of option O into *H and *V, in 1/72000" units. Any syntax accepted by measure_paper() may be used. Destroys O. */ void parse_paper_size (struct driver_option *o, int *h, int *v) { if (o->value == NULL || !measure_paper (o->value, h, v)) measure_paper (o->default_value, h, v); driver_option_destroy (o); } static int do_parse_boolean (const char *driver_name, const char *key, const char *value) { if (!strcmp (value, "on") || !strcmp (value, "true") || !strcmp (value, "yes") || !strcmp (value, "1")) return true; else if (!strcmp (value, "off") || !strcmp (value, "false") || !strcmp (value, "no") || !strcmp (value, "0")) return false; else { msg (MW, _("%s: `%s' is `%s' but a Boolean value is required"), driver_name, value, key); return -1; } } /* Parses and return O's value as a Boolean value. "true" and "false", "yes" and "no", "on" and "off", and "1" and "0" are acceptable boolean strings. Destroys O. */ bool parse_boolean (struct driver_option *o) { bool retval; retval = do_parse_boolean (o->driver_name, o->name, o->default_value) > 0; if (o->value != NULL) { int value = do_parse_boolean (o->driver_name, o->name, o->value); if (value >= 0) retval = value; } driver_option_destroy (o); return retval; } /* Parses O's value as an enumeration constant. The arguments to this function consist of a series of string/int pairs, terminated by a null pointer value. O's value is compared to each string in turn, and parse_enum() returns the int associated with the first matching string. If there is no match, or if O has no user-specified value, then O's default value is treated the same way. If the default value still does not match, parse_enum() returns 0. Example: parse_enum (o, "a", 1, "b", 2, NULL_SENTINEL) returns 1 if O's value if "a", 2 if O's value is "b". Destroys O. */ int parse_enum (struct driver_option *o, ...) { va_list args; int retval; retval = 0; va_start (args, o); for (;;) { const char *s; int value; s = va_arg (args, const char *); if (s == NULL) { if (o->value != NULL) { struct string choices; int i; ds_init_empty (&choices); va_end (args); va_start (args, o); for (i = 0; ; i++) { s = va_arg (args, const char *); if (s == NULL) break; value = va_arg (args, int); if (i > 0) ds_put_cstr (&choices, ", "); ds_put_format (&choices, "`%s'", s); } msg (MW, _("%s: `%s' is `%s' but one of the following " "is required: %s"), o->driver_name, o->name, o->value, ds_cstr (&choices)); ds_destroy (&choices); } break; } value = va_arg (args, int); if (o->value != NULL && !strcmp (s, o->value)) { retval = value; break; } else if (!strcmp (s, o->default_value)) retval = value; } va_end (args); driver_option_destroy (o); return retval; } /* Parses O's value as an integer in the range MIN_VALUE to MAX_VALUE (inclusive) and returns the integer. Destroys O. */ int parse_int (struct driver_option *o, int min_value, int max_value) { int retval = strtol (o->default_value, NULL, 0); if (o->value != NULL) { int value; char *tail; errno = 0; value = strtol (o->value, &tail, 0); if (tail != o->value && *tail == '\0' && errno != ERANGE && value >= min_value && value <= max_value) retval = value; else if (max_value == INT_MAX) { if (min_value == 0) msg (MW, _("%s: `%s' is `%s' but a non-negative integer " "is required"), o->driver_name, o->name, o->value); else if (min_value == 1) msg (MW, _("%s: `%s' is `%s' but a positive integer is " "required"), o->driver_name, o->name, o->value); else if (min_value == INT_MIN) msg (MW, _("%s: `%s' is `%s' but an integer is required"), o->driver_name, o->name, o->value); else msg (MW, _("%s: `%s' is `%s' but an integer greater " "than %d is required"), o->driver_name, o->name, o->value, min_value - 1); } else msg (MW, _("%s: `%s' is `%s' but an integer between %d and " "%d is required"), o->driver_name, o->name, o->value, min_value, max_value); } driver_option_destroy (o); return retval; } /* Parses O's value as a dimension, as understood by measure_dimension(), and returns its length in units of 1/72000". Destroys O. */ int parse_dimension (struct driver_option *o) { int retval; retval = (o->value != NULL ? measure_dimension (o->value) : o->default_value != NULL ? measure_dimension (o->default_value) : -1); driver_option_destroy (o); return retval; } /* Parses O's value as a string and returns it as a malloc'd string that the caller is responsible for freeing. Destroys O. */ char * parse_string (struct driver_option *o) { char *retval = xstrdup (o->value != NULL ? o->value : o->default_value); driver_option_destroy (o); return retval; } static char * default_chart_file_name (const char *file_name) { if (strcmp (file_name, "-")) { const char *extension = strrchr (file_name, '.'); int stem_length = extension ? extension - file_name : strlen (file_name); return xasprintf ("%.*s-#.png", stem_length, file_name); } else return NULL; } /* Parses and returns a chart file name, or NULL if no charts should be output. If a nonnull string is returned, it will contain at least one '#' character, which the client will presumably replace by a number as part of writing charts to separate files. If O->value is "none", then this function returns NULL. If O->value is non-NULL but not "none", returns a copy of that string (if it contains '#'). If O->value is NULL, then O's default_value should be the name of the main output file. Returns NULL if default_value is "-", and otherwise returns a copy of string string with its extension stripped off and "-#.png" appended. Destroys O. */ char * parse_chart_file_name (struct driver_option *o) { char *chart_file_name; if (o->value != NULL) { if (!strcmp (o->value, "none")) chart_file_name = NULL; else if (strchr (o->value, '#') != NULL) chart_file_name = xstrdup (o->value); else { msg (MW, _("%s: `%s' is `%s' but a file name that contains " "`#' is required."), o->name, o->value, o->driver_name); chart_file_name = default_chart_file_name (o->default_value); } } else chart_file_name = default_chart_file_name (o->default_value); driver_option_destroy (o); return chart_file_name; } pspp-1.4.1/src/output/measure.h0000644000175000017500000000171213320146056016055 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 1997-9, 2000, 2007, 2009 Free Software Foundation, Inc. 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 3 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, see . */ #ifndef OUTPUT_MEASURE_H #define OUTPUT_MEASURE_H 1 #include int measure_dimension (const char *dimen); bool measure_paper (const char *size, int *h, int *v); #endif /* output/measure.h */ pspp-1.4.1/src/output/spv/0000755000175000017500000000000013725012647015061 5ustar00blpblp00000000000000pspp-1.4.1/src/output/spv/spv-light-decoder.c0000644000175000017500000007644413723244071020560 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2017, 2018 Free Software Foundation, Inc. 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 3 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, see . */ #include #include "output/spv/spv-light-decoder.h" #include #include #include #include #include "libpspp/i18n.h" #include "libpspp/message.h" #include "output/pivot-table.h" #include "output/spv/light-binary-parser.h" #include "output/spv/spv.h" #include "gl/xalloc.h" #include "gl/xsize.h" static char * to_utf8 (const char *s, const char *encoding) { return recode_string ("UTF-8", encoding, s, strlen (s)); } static char * to_utf8_if_nonempty (const char *s, const char *encoding) { return s && s[0] ? to_utf8 (s, encoding) : NULL; } static void convert_widths (const uint32_t *in, uint32_t n, int **out, size_t *n_out) { if (n) { *n_out = n; *out = xnmalloc (n, sizeof **out); for (size_t i = 0; i < n; i++) (*out)[i] = in[i]; } } static void convert_breakpoints (const struct spvlb_breakpoints *in, size_t **out, size_t *n_out) { if (in && in->n_breaks) { *n_out = in->n_breaks; *out = xnmalloc (in->n_breaks, sizeof *out); for (size_t i = 0; i < in->n_breaks; i++) (*out)[i] = in->breaks[i]; } } static void convert_keeps (const struct spvlb_keeps *in, struct pivot_keep **out, size_t *n_out) { if (in && in->n_keeps) { *n_out = in->n_keeps; *out = xnmalloc (*n_out, sizeof **out); for (size_t i = 0; i < *n_out; i++) { (*out)[i].ofs = in->keeps[i]->offset; (*out)[i].n = in->keeps[i]->n; } } } static char * WARN_UNUSED_RESULT decode_spvlb_color_string (const char *s, uint8_t def, struct cell_color *colorp) { int r, g, b; if (!*s) r = g = b = def; else if (sscanf (s, "#%2x%2x%2x", &r, &g, &b) != 3) return xasprintf ("bad color %s", s); *colorp = (struct cell_color) CELL_COLOR (r, g, b); return NULL; } static struct cell_color decode_spvlb_color_u32 (uint32_t x) { return (struct cell_color) { x >> 24, x >> 16, x >> 8, x }; } static char * WARN_UNUSED_RESULT decode_spvlb_font_style (const struct spvlb_font_style *in, const char *encoding, struct font_style **outp) { if (!in) { *outp = NULL; return NULL; } struct cell_color fg, bg; char *error = decode_spvlb_color_string (in->fg_color, 0x00, &fg); if (!error) error = decode_spvlb_color_string (in->bg_color, 0xff, &bg); if (error) return error; *outp = xmalloc (sizeof **outp); **outp = (struct font_style) { .bold = in->bold, .italic = in->italic, .underline = in->underline, .fg = { fg, fg }, .bg = { bg, bg }, .typeface = to_utf8 (in->typeface, encoding), .size = in->size / 1.33, }; return NULL; } static char * WARN_UNUSED_RESULT decode_spvlb_halign (uint32_t in, enum table_halign *halignp) { switch (in) { case 0: *halignp = TABLE_HALIGN_CENTER; return NULL; case 2: *halignp = TABLE_HALIGN_LEFT; return NULL; case 4: *halignp = TABLE_HALIGN_RIGHT; return NULL; case 6: case 61453: *halignp = TABLE_HALIGN_DECIMAL; return NULL; case 0xffffffad: case 64173: *halignp = TABLE_HALIGN_MIXED; return NULL; default: return xasprintf ("bad cell style halign %"PRIu32, in); } } static char * WARN_UNUSED_RESULT decode_spvlb_valign (uint32_t in, enum table_valign *valignp) { switch (in) { case 0: *valignp = TABLE_VALIGN_CENTER; return NULL; case 1: *valignp = TABLE_VALIGN_TOP; return NULL; case 3: *valignp = TABLE_VALIGN_BOTTOM; return NULL; default: *valignp = 0; return xasprintf ("bad cell style valign %"PRIu32, in); } } static char * WARN_UNUSED_RESULT decode_spvlb_cell_style (const struct spvlb_cell_style *in, struct cell_style **outp) { if (!in) { *outp = NULL; return NULL; } enum table_halign halign; char *error = decode_spvlb_halign (in->halign, &halign); if (error) return error; enum table_valign valign; error = decode_spvlb_valign (in->valign, &valign); if (error) return error; *outp = xzalloc (sizeof **outp); **outp = (struct cell_style) { .halign = halign, .valign = valign, .decimal_offset = in->decimal_offset, .margin = { [TABLE_HORZ] = { in->left_margin, in->right_margin }, [TABLE_VERT] = { in->top_margin, in->bottom_margin }, }, }; return NULL; } static char *decode_spvlb_value ( const struct pivot_table *, const struct spvlb_value *, const char *encoding, struct pivot_value **) WARN_UNUSED_RESULT; static char * WARN_UNUSED_RESULT decode_spvlb_argument (const struct pivot_table *table, const struct spvlb_argument *in, const char *encoding, struct pivot_argument *out) { if (in->value) { struct pivot_value *value; char *error = decode_spvlb_value (table, in->value, encoding, &value); if (error) return error; out->n = 1; out->values = xmalloc (sizeof *out->values); out->values[0] = value; } else { out->n = 0; out->values = xnmalloc (in->n_values, sizeof *out->values); for (size_t i = 0; i < in->n_values; i++) { char *error = decode_spvlb_value (table, in->values[i], encoding, &out->values[i]); if (error) { pivot_argument_uninit (out); return error; } out->n++; } } return NULL; } static char * WARN_UNUSED_RESULT decode_spvlb_value_show (uint8_t in, enum settings_value_show *out) { switch (in) { case 0: *out = SETTINGS_VALUE_SHOW_DEFAULT; return NULL; case 1: *out = SETTINGS_VALUE_SHOW_VALUE; return NULL; case 2: *out = SETTINGS_VALUE_SHOW_LABEL; return NULL; case 3: *out = SETTINGS_VALUE_SHOW_BOTH; return NULL; default: return xasprintf ("bad value show %"PRIu8, in); } } static char * WARN_UNUSED_RESULT decode_spvlb_value (const struct pivot_table *table, const struct spvlb_value *in, const char *encoding, struct pivot_value **outp) { *outp = NULL; struct pivot_value *out = xzalloc (sizeof *out); const struct spvlb_value_mod *vm; char *error; switch (in->type) { case 1: vm = in->type_01.value_mod; out->type = PIVOT_VALUE_NUMERIC; out->numeric.x = in->type_01.x; error = spv_decode_fmt_spec (in->type_01.format, &out->numeric.format); if (error) return error; break; case 2: vm = in->type_02.value_mod; out->type = PIVOT_VALUE_NUMERIC; out->numeric.x = in->type_02.x; error = spv_decode_fmt_spec (in->type_02.format, &out->numeric.format); if (!error) error = decode_spvlb_value_show (in->type_02.show, &out->numeric.show); if (error) return NULL; out->numeric.var_name = to_utf8_if_nonempty (in->type_02.var_name, encoding); out->numeric.value_label = to_utf8_if_nonempty (in->type_02.value_label, encoding); break; case 3: vm = in->type_03.value_mod; out->type = PIVOT_VALUE_TEXT; out->text.local = to_utf8 (in->type_03.local, encoding); out->text.c = to_utf8 (in->type_03.c, encoding); out->text.id = to_utf8 (in->type_03.id, encoding); out->text.user_provided = !in->type_03.fixed; break; case 4: vm = in->type_04.value_mod; out->type = PIVOT_VALUE_STRING; error = decode_spvlb_value_show (in->type_04.show, &out->string.show); if (error) return NULL; out->string.s = to_utf8 (in->type_04.s, encoding); out->string.var_name = to_utf8 (in->type_04.var_name, encoding); out->string.value_label = to_utf8_if_nonempty (in->type_04.value_label, encoding); break; case 5: vm = in->type_05.value_mod; out->type = PIVOT_VALUE_VARIABLE; error = decode_spvlb_value_show (in->type_05.show, &out->variable.show); if (error) return error; out->variable.var_name = to_utf8 (in->type_05.var_name, encoding); out->variable.var_label = to_utf8_if_nonempty (in->type_05.var_label, encoding); break; case 6: vm = in->type_06.value_mod; out->type = PIVOT_VALUE_TEXT; out->text.local = to_utf8 (in->type_06.local, encoding); out->text.c = to_utf8 (in->type_06.c, encoding); out->text.id = to_utf8 (in->type_06.id, encoding); out->text.user_provided = false; break; case -1: vm = in->type_else.value_mod; out->type = PIVOT_VALUE_TEMPLATE; out->template.local = to_utf8 (in->type_else.template, encoding); out->template.id = out->template.local; out->template.n_args = 0; out->template.args = xnmalloc (in->type_else.n_args, sizeof *out->template.args); for (size_t i = 0; i < in->type_else.n_args; i++) { error = decode_spvlb_argument (table, in->type_else.args[i], encoding, &out->template.args[i]); if (error) { pivot_value_destroy (out); return error; } out->template.n_args++; } break; default: assert (0); } if (vm) { if (vm->n_subscripts) { out->n_subscripts = vm->n_subscripts; out->subscripts = xnmalloc (vm->n_subscripts, sizeof *out->subscripts); for (size_t i = 0; i < vm->n_subscripts; i++) out->subscripts[i] = to_utf8 (vm->subscripts[i], encoding); } if (vm->n_refs) { out->footnotes = xnmalloc (vm->n_refs, sizeof *out->footnotes); for (size_t i = 0; i < vm->n_refs; i++) { uint16_t idx = vm->refs[i]; if (idx >= table->n_footnotes) { pivot_value_destroy (out); return xasprintf ("bad footnote index: %"PRIu16" >= %zu", idx, table->n_footnotes); } out->footnotes[out->n_footnotes++] = table->footnotes[idx]; } } if (vm->style_pair) { error = decode_spvlb_font_style (vm->style_pair->font_style, encoding, &out->font_style); if (!error) error = decode_spvlb_cell_style (vm->style_pair->cell_style, &out->cell_style); if (error) { pivot_value_destroy (out); return error; } } if (vm->template_string && vm->template_string->id && vm->template_string->id[0] && out->type == PIVOT_VALUE_TEMPLATE) out->template.id = to_utf8 (vm->template_string->id, encoding); } *outp = out; return NULL; } static char * WARN_UNUSED_RESULT decode_spvlb_area (const struct spvlb_area *in, struct area_style *out, const char *encoding) { char *error; struct cell_color fg0, fg1, bg0, bg1; error = decode_spvlb_color_string (in->fg_color, 0x00, &fg0); if (!error) error = decode_spvlb_color_string (in->bg_color, 0xff, &bg0); if (!error && in->alternate) error = decode_spvlb_color_string (in->alt_fg_color, 0x00, &fg1); if (!error && in->alternate) error = decode_spvlb_color_string (in->alt_bg_color, 0xff, &bg1); enum table_halign halign; if (!error) { error = decode_spvlb_halign (in->halign, &halign); /* TABLE_HALIGN_DECIMAL doesn't seem to be a real halign for areas, which is good because there's no way to indicate the decimal offset. Just in case: */ if (!error && halign == TABLE_HALIGN_DECIMAL) halign = TABLE_HALIGN_MIXED; } enum table_valign valign; if (!error) error = decode_spvlb_valign (in->valign, &valign); if (error) return error; *out = (struct area_style) { .font_style = { .bold = (in->style & 1) != 0, .italic = (in->style & 2) != 0, .underline = in->underline, .fg = { fg0, in->alternate ? fg1 : fg0 }, .bg = { bg0, in->alternate ? bg1 : bg0 }, .typeface = to_utf8 (in->typeface, encoding), .size = in->size / 1.33, }, .cell_style = { .halign = halign, .valign = valign, .margin = { [TABLE_HORZ] = { in->left_margin, in->right_margin }, [TABLE_VERT] = { in->top_margin, in->bottom_margin }, }, }, }; return NULL; } static char * WARN_UNUSED_RESULT decode_spvlb_group (const struct pivot_table *, struct spvlb_category **, size_t n_categories, bool show_label, struct pivot_category *parent, struct pivot_dimension *, const char *encoding); static char * WARN_UNUSED_RESULT decode_spvlb_categories (const struct pivot_table *table, struct spvlb_category **categories, size_t n_categories, struct pivot_category *parent, struct pivot_dimension *dimension, const char *encoding) { for (size_t i = 0; i < n_categories; i++) { const struct spvlb_category *in = categories[i]; if (in->group && in->group->merge) { char *error = decode_spvlb_categories ( table, in->group->subcategories, in->group->n_subcategories, parent, dimension, encoding); if (error) return error; continue; } struct pivot_value *name; char *error = decode_spvlb_value (table, in->name, encoding, &name); if (error) return error; struct pivot_category *out = xzalloc (sizeof *out); out->name = name; out->parent = parent; out->dimension = dimension; if (in->group) { char *error = decode_spvlb_group (table, in->group->subcategories, in->group->n_subcategories, true, out, dimension, encoding); if (error) { pivot_category_destroy (out); return error; } out->data_index = SIZE_MAX; out->presentation_index = SIZE_MAX; } else { out->data_index = in->leaf->leaf_index; out->presentation_index = dimension->n_leaves; dimension->n_leaves++; } if (parent->n_subs >= parent->allocated_subs) parent->subs = x2nrealloc (parent->subs, &parent->allocated_subs, sizeof *parent->subs); parent->subs[parent->n_subs++] = out; } return NULL; } static char * WARN_UNUSED_RESULT decode_spvlb_group (const struct pivot_table *table, struct spvlb_category **categories, size_t n_categories, bool show_label, struct pivot_category *category, struct pivot_dimension *dimension, const char *encoding) { category->subs = XCALLOC (n_categories, struct pivot_category *); category->n_subs = 0; category->allocated_subs = 0; category->show_label = show_label; return decode_spvlb_categories (table, categories, n_categories, category, dimension, encoding); } static char * WARN_UNUSED_RESULT fill_leaves (struct pivot_category *category, struct pivot_dimension *dimension) { if (pivot_category_is_group (category)) { for (size_t i = 0; i < category->n_subs; i++) { char *error = fill_leaves (category->subs[i], dimension); if (error) return error; } } else { if (category->data_index >= dimension->n_leaves) return xasprintf ("leaf_index %zu >= n_leaves %zu", category->data_index, dimension->n_leaves); if (dimension->data_leaves[category->data_index]) return xasprintf ("two leaves with data_index %zu", category->data_index); dimension->data_leaves[category->data_index] = category; dimension->presentation_leaves[category->presentation_index] = category; } return NULL; } static char * WARN_UNUSED_RESULT decode_spvlb_dimension (const struct pivot_table *table, const struct spvlb_dimension *in, size_t idx, const char *encoding, struct pivot_dimension **outp) { /* Convert most of the dimension. */ struct pivot_value *name; char *error = decode_spvlb_value (table, in->name, encoding, &name); if (error) return error; struct pivot_dimension *out = xzalloc (sizeof *out); out->level = UINT_MAX; out->top_index = idx; out->hide_all_labels = in->props->hide_all_labels; out->root = xzalloc (sizeof *out->root); *out->root = (struct pivot_category) { .name = name, .dimension = out, .data_index = SIZE_MAX, .presentation_index = SIZE_MAX, }; error = decode_spvlb_group (table, in->categories, in->n_categories, !in->props->hide_dim_label, out->root, out, encoding); if (error) goto error; /* Allocate and fill the array of leaves now that we know how many there are. */ out->data_leaves = XCALLOC (out->n_leaves, struct pivot_category *); out->presentation_leaves = XCALLOC (out->n_leaves, struct pivot_category *); out->allocated_leaves = out->n_leaves; error = fill_leaves (out->root, out); if (error) goto error; for (size_t i = 0; i < out->n_leaves; i++) { assert (out->data_leaves[i] != NULL); assert (out->presentation_leaves[i] != NULL); } *outp = out; return NULL; error: pivot_dimension_destroy (out); return error; } static char * WARN_UNUSED_RESULT decode_spvlb_stroke (uint32_t stroke_type, enum table_stroke *strokep) { enum table_stroke strokes[] = { TABLE_STROKE_NONE, TABLE_STROKE_SOLID, TABLE_STROKE_DASHED, TABLE_STROKE_THICK, TABLE_STROKE_THIN, TABLE_STROKE_DOUBLE, }; if (stroke_type >= sizeof strokes / sizeof *strokes) return xasprintf ("bad stroke %"PRIu32, stroke_type); *strokep = strokes[stroke_type]; return NULL; } static char * WARN_UNUSED_RESULT decode_spvlb_border (const struct spvlb_border *in, struct pivot_table *table) { if (in->border_type >= PIVOT_N_BORDERS) return xasprintf ("bad border type %"PRIu32, in->border_type); struct table_border_style *out = &table->borders[in->border_type]; out->color = decode_spvlb_color_u32 (in->color); return decode_spvlb_stroke (in->stroke_type, &out->stroke); } static char * WARN_UNUSED_RESULT decode_spvlb_axis (const uint32_t *dimension_indexes, size_t n_dimensions, enum pivot_axis_type axis_type, struct pivot_table *table) { struct pivot_axis *axis = &table->axes[axis_type]; axis->dimensions = XCALLOC (n_dimensions, struct pivot_dimension *); axis->n_dimensions = n_dimensions; axis->extent = 1; for (size_t i = 0; i < n_dimensions; i++) { uint32_t idx = dimension_indexes[i]; if (idx >= table->n_dimensions) return xasprintf ("bad dimension index %"PRIu32" >= %zu", idx, table->n_dimensions); struct pivot_dimension *d = table->dimensions[idx]; if (d->level != UINT_MAX) return xasprintf ("duplicate dimension %"PRIu32, idx); axis->dimensions[i] = d; d->axis_type = axis_type; d->level = i; axis->extent *= d->n_leaves; } return NULL; } static char * decode_data_index (uint64_t in, const struct pivot_table *table, size_t *out) { uint64_t remainder = in; for (size_t i = table->n_dimensions - 1; i > 0; i--) { const struct pivot_dimension *d = table->dimensions[i]; if (d->n_leaves) { out[i] = remainder % d->n_leaves; remainder /= d->n_leaves; } else out[i] = 0; } if (remainder >= table->dimensions[0]->n_leaves) return xasprintf ("out of range cell data index %"PRIu64, in); out[0] = remainder; return NULL; } static char * WARN_UNUSED_RESULT decode_spvlb_cells (struct spvlb_cell **in, size_t n_in, struct pivot_table *table, const char *encoding) { if (!table->n_dimensions) return NULL; size_t *dindexes = xnmalloc (table->n_dimensions, sizeof *dindexes); for (size_t i = 0; i < n_in; i++) { struct pivot_value *value; char *error = decode_data_index (in[i]->index, table, dindexes); if (!error) error = decode_spvlb_value (table, in[i]->value, encoding, &value); if (error) { free (dindexes); return error; } pivot_table_put (table, dindexes, table->n_dimensions, value); } free (dindexes); return NULL; } static char * WARN_UNUSED_RESULT decode_spvlb_footnote (const struct spvlb_footnote *in, const char *encoding, size_t idx, struct pivot_table *table) { struct pivot_value *content; char *error = decode_spvlb_value (table, in->text, encoding, &content); if (error) return error; struct pivot_value *marker = NULL; if (in->marker) { error = decode_spvlb_value (table, in->marker, encoding, &marker); if (error) { pivot_value_destroy (content); return error; } if (marker->type == PIVOT_VALUE_TEXT) marker->text.user_provided = false; } struct pivot_footnote *f = pivot_table_create_footnote__ ( table, idx, marker, content); f->show = (int32_t) in->show > 0; return NULL; } static char * WARN_UNUSED_RESULT decode_current_layer (uint64_t current_layer, struct pivot_table *table) { const struct pivot_axis *axis = &table->axes[PIVOT_AXIS_LAYER]; table->current_layer = xnmalloc (axis->n_dimensions, sizeof *table->current_layer); for (size_t i = 0; i < axis->n_dimensions; i++) { const struct pivot_dimension *d = axis->dimensions[i]; if (d->n_leaves) { table->current_layer[i] = current_layer % d->n_leaves; current_layer /= d->n_leaves; } else table->current_layer[i] = 0; } if (current_layer > 0) return xasprintf ("out of range layer data index %"PRIu64, current_layer); return NULL; } char * WARN_UNUSED_RESULT decode_spvlb_table (const struct spvlb_table *in, struct pivot_table **outp) { *outp = NULL; if (in->header->version != 1 && in->header->version != 3) return xasprintf ("unknown version %"PRIu32" (expected 1 or 3)", in->header->version); char *error = NULL; struct pivot_table *out = xzalloc (sizeof *out); out->ref_cnt = 1; hmap_init (&out->cells); const struct spvlb_y1 *y1 = (in->formats->x0 ? in->formats->x0->y1 : in->formats->x3 ? in->formats->x3->y1 : NULL); const char *encoding; if (y1) encoding = y1->charset; else { const char *dot = strchr (in->formats->locale, '.'); encoding = dot ? dot + 1 : "windows-1252"; } /* Display settings. */ out->show_numeric_markers = !in->ts->show_alphabetic_markers; out->rotate_inner_column_labels = in->header->rotate_inner_column_labels; out->rotate_outer_row_labels = in->header->rotate_outer_row_labels; out->row_labels_in_corner = in->ts->show_row_labels_in_corner; out->show_grid_lines = in->borders->show_grid_lines; out->show_caption = true; out->footnote_marker_superscripts = in->ts->footnote_marker_superscripts; out->omit_empty = in->ts->omit_empty; const struct spvlb_x1 *x1 = in->formats->x1; if (x1) { error = decode_spvlb_value_show (x1->show_values, &out->show_values); if (!error) error = decode_spvlb_value_show (x1->show_variables, &out->show_variables); if (error) goto error; out->show_caption = x1->show_caption; } /* Column and row display settings. */ out->sizing[TABLE_VERT].range[0] = in->header->min_row_height; out->sizing[TABLE_VERT].range[1] = in->header->max_row_height; out->sizing[TABLE_HORZ].range[0] = in->header->min_col_width; out->sizing[TABLE_HORZ].range[1] = in->header->max_col_width; convert_widths (in->formats->widths, in->formats->n_widths, &out->sizing[TABLE_HORZ].widths, &out->sizing[TABLE_HORZ].n_widths); const struct spvlb_x2 *x2 = in->formats->x2; if (x2) convert_widths (x2->row_heights, x2->n_row_heights, &out->sizing[TABLE_VERT].widths, &out->sizing[TABLE_VERT].n_widths); convert_breakpoints (in->ts->row_breaks, &out->sizing[TABLE_VERT].breaks, &out->sizing[TABLE_VERT].n_breaks); convert_breakpoints (in->ts->col_breaks, &out->sizing[TABLE_HORZ].breaks, &out->sizing[TABLE_HORZ].n_breaks); convert_keeps (in->ts->row_keeps, &out->sizing[TABLE_VERT].keeps, &out->sizing[TABLE_VERT].n_keeps); convert_keeps (in->ts->col_keeps, &out->sizing[TABLE_HORZ].keeps, &out->sizing[TABLE_HORZ].n_keeps); out->notes = to_utf8_if_nonempty (in->ts->notes, encoding); out->table_look = to_utf8_if_nonempty (in->ts->table_look, encoding); /* Print settings. */ out->print_all_layers = in->ps->all_layers; out->paginate_layers = in->ps->paginate_layers; out->shrink_to_fit[TABLE_HORZ] = in->ps->fit_width; out->shrink_to_fit[TABLE_VERT] = in->ps->fit_length; out->top_continuation = in->ps->top_continuation; out->bottom_continuation = in->ps->bottom_continuation; out->continuation = xstrdup (in->ps->continuation_string); out->n_orphan_lines = in->ps->n_orphan_lines; /* Format settings. */ out->epoch = in->formats->y0->epoch; out->decimal = in->formats->y0->decimal; out->grouping = in->formats->y0->grouping; const struct spvlb_custom_currency *cc = in->formats->custom_currency; for (int i = 0; i < 5; i++) if (cc && i < cc->n_ccs) out->ccs[i] = xstrdup (cc->ccs[i]); out->small = in->formats->x3 ? in->formats->x3->small : 0; /* Command information. */ if (y1) { out->command_local = to_utf8 (y1->command_local, encoding); out->command_c = to_utf8 (y1->command, encoding); out->language = xstrdup (y1->language); /* charset? */ out->locale = xstrdup (y1->locale); } /* Source information. */ const struct spvlb_x3 *x3 = in->formats->x3; if (x3) { if (x3->dataset && x3->dataset[0] && x3->dataset[0] != 4) out->dataset = to_utf8 (x3->dataset, encoding); out->datafile = to_utf8_if_nonempty (x3->datafile, encoding); out->date = x3->date; } /* Footnotes. Any pivot_value might refer to footnotes, so it's important to process the footnotes early to ensure that those references can be resolved. There is a possible problem that a footnote might itself reference an as-yet-unprocessed footnote, but that's OK because footnote references don't actually look at the footnote contents but only resolve a pointer to where the footnote will go later. Before we really start, create all the footnotes we'll fill in. This is because sometimes footnotes refer to themselves or to each other and we don't want to reject those references. */ const struct spvlb_footnotes *fn = in->footnotes; if (fn->n_footnotes > 0) { pivot_table_create_footnote__ (out, fn->n_footnotes - 1, NULL, NULL); for (size_t i = 0; i < fn->n_footnotes; i++) { error = decode_spvlb_footnote (in->footnotes->footnotes[i], encoding, i, out); if (error) goto error; } } /* Title and caption. */ error = decode_spvlb_value (out, in->titles->user_title, encoding, &out->title); if (error) goto error; error = decode_spvlb_value (out, in->titles->subtype, encoding, &out->subtype); if (error) goto error; if (in->titles->corner_text) { error = decode_spvlb_value (out, in->titles->corner_text, encoding, &out->corner_text); if (error) goto error; } if (in->titles->caption) { error = decode_spvlb_value (out, in->titles->caption, encoding, &out->caption); if (error) goto error; } /* Styles. */ for (size_t i = 0; i < PIVOT_N_AREAS; i++) { error = decode_spvlb_area (in->areas->areas[i], &out->areas[i], encoding); if (error) goto error; } for (size_t i = 0; i < PIVOT_N_BORDERS; i++) { error = decode_spvlb_border (in->borders->borders[i], out); if (error) goto error; } /* Dimensions. */ out->n_dimensions = in->dimensions->n_dims; out->dimensions = XCALLOC (out->n_dimensions, struct pivot_dimension *); for (size_t i = 0; i < out->n_dimensions; i++) { error = decode_spvlb_dimension (out, in->dimensions->dims[i], i, encoding, &out->dimensions[i]); if (error) goto error; } /* Axes. */ size_t a = in->axes->n_layers; size_t b = in->axes->n_rows; size_t c = in->axes->n_columns; if (size_overflow_p (xsum3 (a, b, c)) || a + b + c != out->n_dimensions) { error = xasprintf ("dimensions do not sum correctly " "(%zu + %zu + %zu != %zu)", a, b, c, out->n_dimensions); goto error; } error = decode_spvlb_axis (in->axes->layers, in->axes->n_layers, PIVOT_AXIS_LAYER, out); if (error) goto error; error = decode_spvlb_axis (in->axes->rows, in->axes->n_rows, PIVOT_AXIS_ROW, out); if (error) goto error; error = decode_spvlb_axis (in->axes->columns, in->axes->n_columns, PIVOT_AXIS_COLUMN, out); if (error) goto error; pivot_table_assign_label_depth (out); error = decode_current_layer (in->ts->current_layer, out); if (error) goto error; /* Data. */ error = decode_spvlb_cells (in->cells->cells, in->cells->n_cells, out, encoding); *outp = out; return NULL; error: pivot_table_unref (out); return error; } pspp-1.4.1/src/output/spv/spv-light-decoder.h0000644000175000017500000000220013602145300020527 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2018 Free Software Foundation, Inc. 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 3 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, see . */ #ifndef OUTPUT_SPV_LIGHT_DECODER_H #define OUTPUT_SPV_LIGHT_DECODER_H 1 /* SPSS Viewer (SPV) light binary decoder. Used by spv.h, not useful directly. */ #include "libpspp/compiler.h" struct pivot_table; struct spvlb_table; char *decode_spvlb_table (const struct spvlb_table *, struct pivot_table **outp) WARN_UNUSED_RESULT; #endif /* output/spv/spv-light-decoder.h */ pspp-1.4.1/src/output/spv/spv-legacy-decoder.h0000644000175000017500000000316013602145300020672 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2018 Free Software Foundation, Inc. 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 3 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, see . */ #ifndef OUTPUT_SPV_LEGACY_DECODER_H #define OUTPUT_SPV_LEGACY_DECODER_H 1 /* SPSS Viewer (SPV) legacy binary decoder. Used by spv.h, not useful directly. */ #include "libpspp/compiler.h" struct pivot_table; struct spvdx_visualization; struct spvsx_table_properties; struct spv_data; struct spv_legacy_properties; void spv_legacy_properties_destroy (struct spv_legacy_properties *); char *decode_spvsx_legacy_properties (const struct spvsx_table_properties *, struct spv_legacy_properties **) WARN_UNUSED_RESULT; char *decode_spvdx_table (const struct spvdx_visualization *, const char *subtype, const struct spv_legacy_properties *, struct spv_data *, struct pivot_table **outp) WARN_UNUSED_RESULT; #endif /* output/spv/spv-legacy-decoder.h */ pspp-1.4.1/src/output/spv/spv-writer.h0000644000175000017500000000313013602145300017334 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2019 Free Software Foundation, Inc. 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 3 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, see . */ #ifndef OUTPUT_SPV_WRITER_H #define OUTPUT_SPV_WRITER_H 1 struct page_setup; struct table_item_text; struct pivot_table; struct spv_writer; struct text_item; #include "libpspp/compiler.h" char *spv_writer_open (const char *filename, struct spv_writer **) WARN_UNUSED_RESULT; char *spv_writer_close (struct spv_writer *) WARN_UNUSED_RESULT; void spv_writer_set_page_setup (struct spv_writer *, const struct page_setup *); void spv_writer_open_heading (struct spv_writer *, const char *command_id, const char *label); void spv_writer_close_heading (struct spv_writer *); void spv_writer_put_text (struct spv_writer *, const struct text_item *, const char *command_id); void spv_writer_put_table (struct spv_writer *, const struct pivot_table *); #endif /* output/spv/spv-writer.h */ pspp-1.4.1/src/output/spv/spv.c0000644000175000017500000010046013723216277016041 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2017, 2018 Free Software Foundation, Inc. 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 3 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, see . */ #include #include "output/spv/spv.h" #include #include #include #include #include #include #include "libpspp/assertion.h" #include "libpspp/cast.h" #include "libpspp/hash-functions.h" #include "libpspp/message.h" #include "libpspp/str.h" #include "libpspp/zip-reader.h" #include "output/page-setup-item.h" #include "output/pivot-table.h" #include "output/spv/detail-xml-parser.h" #include "output/spv/light-binary-parser.h" #include "output/spv/spv-css-parser.h" #include "output/spv/spv-legacy-data.h" #include "output/spv/spv-legacy-decoder.h" #include "output/spv/spv-light-decoder.h" #include "output/spv/structure-xml-parser.h" #include "gl/c-ctype.h" #include "gl/intprops.h" #include "gl/minmax.h" #include "gl/xalloc.h" #include "gl/xvasprintf.h" #include "gl/xsize.h" #include "gettext.h" #define _(msgid) gettext (msgid) #define N_(msgid) (msgid) struct spv_reader { struct string zip_errs; struct zip_reader *zip; struct spv_item *root; struct page_setup *page_setup; }; const struct page_setup * spv_get_page_setup (const struct spv_reader *spv) { return spv->page_setup; } const char * spv_item_type_to_string (enum spv_item_type type) { switch (type) { case SPV_ITEM_HEADING: return "heading"; case SPV_ITEM_TEXT: return "text"; case SPV_ITEM_TABLE: return "table"; case SPV_ITEM_GRAPH: return "graph"; case SPV_ITEM_MODEL: return "model"; case SPV_ITEM_OBJECT: return "object"; default: return "**error**"; } } const char * spv_item_class_to_string (enum spv_item_class class) { switch (class) { #define SPV_CLASS(ENUM, NAME) case SPV_CLASS_##ENUM: return NAME; SPV_CLASSES #undef SPV_CLASS default: return NULL; } } enum spv_item_class spv_item_class_from_string (const char *name) { #define SPV_CLASS(ENUM, NAME) \ if (!strcmp (name, NAME)) return SPV_CLASS_##ENUM; SPV_CLASSES #undef SPV_CLASS return (enum spv_item_class) SPV_N_CLASSES; } enum spv_item_type spv_item_get_type (const struct spv_item *item) { return item->type; } enum spv_item_class spv_item_get_class (const struct spv_item *item) { const char *label = spv_item_get_label (item); if (!label) label = ""; switch (item->type) { case SPV_ITEM_HEADING: return SPV_CLASS_HEADINGS; case SPV_ITEM_TEXT: return (!strcmp (label, "Title") ? SPV_CLASS_OUTLINEHEADERS : !strcmp (label, "Log") ? SPV_CLASS_LOGS : !strcmp (label, "Page Title") ? SPV_CLASS_PAGETITLE : SPV_CLASS_TEXTS); case SPV_ITEM_TABLE: return (!strcmp (label, "Warnings") ? SPV_CLASS_WARNINGS : !strcmp (label, "Notes") ? SPV_CLASS_NOTES : SPV_CLASS_TABLES); case SPV_ITEM_GRAPH: return SPV_CLASS_CHARTS; case SPV_ITEM_MODEL: return SPV_CLASS_MODELS; case SPV_ITEM_OBJECT: return SPV_CLASS_OTHER; case SPV_ITEM_TREE: return SPV_CLASS_TREES; default: return SPV_CLASS_UNKNOWN; } } const char * spv_item_get_label (const struct spv_item *item) { return item->label; } bool spv_item_is_heading (const struct spv_item *item) { return item->type == SPV_ITEM_HEADING; } size_t spv_item_get_n_children (const struct spv_item *item) { return item->n_children; } struct spv_item * spv_item_get_child (const struct spv_item *item, size_t idx) { assert (idx < item->n_children); return item->children[idx]; } bool spv_item_is_table (const struct spv_item *item) { return item->type == SPV_ITEM_TABLE; } bool spv_item_is_text (const struct spv_item *item) { return item->type == SPV_ITEM_TEXT; } const struct pivot_value * spv_item_get_text (const struct spv_item *item) { assert (spv_item_is_text (item)); return item->text; } struct spv_item * spv_item_next (const struct spv_item *item) { if (item->n_children) return item->children[0]; while (item->parent) { size_t idx = item->parent_idx + 1; item = item->parent; if (idx < item->n_children) return item->children[idx]; } return NULL; } const struct spv_item * spv_item_get_parent (const struct spv_item *item) { return item->parent; } size_t spv_item_get_level (const struct spv_item *item) { int level = 0; for (; item->parent; item = item->parent) level++; return level; } const char * spv_item_get_command_id (const struct spv_item *item) { return item->command_id; } const char * spv_item_get_subtype (const struct spv_item *item) { return item->subtype; } bool spv_item_is_visible (const struct spv_item *item) { return item->visible; } static void spv_item_destroy (struct spv_item *item) { if (item) { free (item->structure_member); free (item->label); free (item->command_id); for (size_t i = 0; i < item->n_children; i++) spv_item_destroy (item->children[i]); free (item->children); pivot_table_unref (item->table); spv_legacy_properties_destroy (item->legacy_properties); free (item->bin_member); free (item->xml_member); free (item->subtype); pivot_value_destroy (item->text); free (item->object_type); free (item->uri); free (item); } } static void spv_heading_add_child (struct spv_item *parent, struct spv_item *child) { assert (parent->type == SPV_ITEM_HEADING); assert (!child->parent); child->parent = parent; child->parent_idx = parent->n_children; if (parent->n_children >= parent->allocated_children) parent->children = x2nrealloc (parent->children, &parent->allocated_children, sizeof *parent->children); parent->children[parent->n_children++] = child; } static xmlNode * find_xml_child_element (xmlNode *parent, const char *child_name) { for (xmlNode *node = parent->children; node; node = node->next) if (node->type == XML_ELEMENT_NODE && node->name && !strcmp (CHAR_CAST (char *, node->name), child_name)) return node; return NULL; } static char * get_xml_attr (const xmlNode *node, const char *name) { return CHAR_CAST (char *, xmlGetProp (node, CHAR_CAST (xmlChar *, name))); } static void put_xml_attr (const char *name, const char *value, struct string *dst) { if (!value) return; ds_put_format (dst, " %s=\"", name); for (const char *p = value; *p; p++) { switch (*p) { case '\n': ds_put_cstr (dst, " "); break; case '&': ds_put_cstr (dst, "&"); break; case '<': ds_put_cstr (dst, "<"); break; case '>': ds_put_cstr (dst, ">"); break; case '"': ds_put_cstr (dst, """); break; default: ds_put_byte (dst, *p); break; } } ds_put_byte (dst, '"'); } static void extract_html_text (const xmlNode *node, int base_font_size, struct string *s) { if (node->type == XML_ELEMENT_NODE) { const char *name = CHAR_CAST (char *, node->name); if (!strcmp (name, "br")) ds_put_byte (s, '\n'); else if (strcmp (name, "style")) { const char *tag = NULL; if (strchr ("biu", name[0]) && name[1] == '\0') { tag = name; ds_put_format (s, "<%s>", tag); } else if (!strcmp (name, "font")) { tag = "span"; ds_put_format (s, "<%s", tag); char *face = get_xml_attr (node, "face"); put_xml_attr ("face", face, s); free (face); char *color = get_xml_attr (node, "color"); if (color) { if (color[0] == '#') put_xml_attr ("color", color, s); else { uint8_t r, g, b; if (sscanf (color, "rgb (%"SCNu8", %"SCNu8", %"SCNu8")", &r, &g, &b) == 3) { char color2[8]; snprintf (color2, sizeof color2, "#%02"PRIx8"%02"PRIx8"%02"PRIx8, r, g, b); put_xml_attr ("color", color2, s); } } } free (color); char *size_s = get_xml_attr (node, "size"); int html_size = size_s ? atoi (size_s) : 0; free (size_s); if (html_size >= 1 && html_size <= 7) { static const double scale[7] = { .444, .556, .667, .778, 1.0, 1.33, 2.0 }; double size = base_font_size * scale[html_size - 1]; char size2[INT_BUFSIZE_BOUND (int)]; snprintf (size2, sizeof size2, "%.0f", size * 1024.); put_xml_attr ("size", size2, s); } ds_put_cstr (s, ">"); } for (const xmlNode *child = node->children; child; child = child->next) extract_html_text (child, base_font_size, s); if (tag) ds_put_format (s, "", tag); } } else if (node->type == XML_TEXT_NODE) { /* U+00A0 NONBREAKING SPACE is really, really common in SPV text and it makes it impossible to break syntax across lines. Translate it into a regular space. (Note that U+00A0 is C2 A0 in UTF-8.) Do the same for U+2007 FIGURE SPACE, which also crops out weirdly sometimes. */ ds_extend (s, ds_length (s) + xmlStrlen (node->content)); for (const uint8_t *p = node->content; *p;) { int c; if (p[0] == 0xc2 && p[1] == 0xa0) { c = ' '; p += 2; } else if (p[0] == 0xe2 && p[1] == 0x80 && p[2] == 0x87) { c = ' '; p += 3; } else c = *p++; if (c_isspace (c)) { int last = ds_last (s); if (last != EOF && !c_isspace (last)) ds_put_byte (s, c); } else if (c == '<') ds_put_cstr (s, "<"); else if (c == '>') ds_put_cstr (s, ">"); else if (c == '&') ds_put_cstr (s, "&"); else ds_put_byte (s, c); } } } static xmlDoc * parse_embedded_html (const xmlNode *node) { /* Extract HTML from XML node. */ char *html_s = CHAR_CAST (char *, xmlNodeGetContent (node)); if (!html_s) xalloc_die (); xmlDoc *html_doc = htmlReadMemory ( html_s, strlen (html_s), NULL, "UTF-8", (HTML_PARSE_RECOVER | HTML_PARSE_NOERROR | HTML_PARSE_NOWARNING | HTML_PARSE_NOBLANKS | HTML_PARSE_NONET)); free (html_s); return html_doc; } /* Given NODE, which should contain HTML content, returns the text within that content as an allocated string. The caller must eventually free the returned string (with xmlFree()). */ static char * decode_embedded_html (const xmlNode *node, struct font_style *font_style) { struct string markup = DS_EMPTY_INITIALIZER; *font_style = (struct font_style) FONT_STYLE_INITIALIZER; font_style->size = 10; xmlDoc *html_doc = parse_embedded_html (node); if (html_doc) { xmlNode *root = xmlDocGetRootElement (html_doc); xmlNode *head = root ? find_xml_child_element (root, "head") : NULL; xmlNode *style = head ? find_xml_child_element (head, "style") : NULL; if (style) { uint8_t *style_s = xmlNodeGetContent (style); spv_parse_css_style (CHAR_CAST (char *, style_s), font_style); xmlFree (style_s); } if (root) extract_html_text (root, font_style->size, &markup); xmlFreeDoc (html_doc); } font_style->markup = true; return ds_steal_cstr (&markup); } static char * xstrdup_if_nonempty (const char *s) { return s && s[0] ? xstrdup (s) : NULL; } static void decode_container_text (const struct spvsx_container_text *ct, struct spv_item *item) { item->type = SPV_ITEM_TEXT; item->command_id = xstrdup_if_nonempty (ct->command_name); item->text = xzalloc (sizeof *item->text); item->text->type = PIVOT_VALUE_TEXT; item->text->font_style = xmalloc (sizeof *item->text->font_style); item->text->text.local = decode_embedded_html (ct->html->node_.raw, item->text->font_style); } static void decode_page_p (const xmlNode *in, struct page_paragraph *out) { char *style = get_xml_attr (in, "style"); out->halign = (style && strstr (style, "center") ? TABLE_HALIGN_CENTER : style && strstr (style, "right") ? TABLE_HALIGN_RIGHT : TABLE_HALIGN_LEFT); free (style); struct font_style font_style; out->markup = decode_embedded_html (in, &font_style); font_style_uninit (&font_style); } static void decode_page_paragraph (const struct spvsx_page_paragraph *page_paragraph, struct page_heading *ph) { memset (ph, 0, sizeof *ph); const struct spvsx_page_paragraph_text *page_paragraph_text = page_paragraph->page_paragraph_text; if (!page_paragraph_text) return; xmlDoc *html_doc = parse_embedded_html (page_paragraph_text->node_.raw); if (!html_doc) return; xmlNode *root = xmlDocGetRootElement (html_doc); xmlNode *body = find_xml_child_element (root, "body"); if (body) for (const xmlNode *node = body->children; node; node = node->next) if (node->type == XML_ELEMENT_NODE && !strcmp (CHAR_CAST (const char *, node->name), "p")) { ph->paragraphs = xrealloc (ph->paragraphs, (ph->n + 1) * sizeof *ph->paragraphs); decode_page_p (node, &ph->paragraphs[ph->n++]); } xmlFreeDoc (html_doc); } void spv_item_load (const struct spv_item *item) { if (spv_item_is_table (item)) spv_item_get_table (item); } bool spv_item_is_light_table (const struct spv_item *item) { return item->type == SPV_ITEM_TABLE && !item->xml_member; } char * WARN_UNUSED_RESULT spv_item_get_raw_light_table (const struct spv_item *item, void **data, size_t *size) { return zip_member_read_all (item->spv->zip, item->bin_member, data, size); } char * WARN_UNUSED_RESULT spv_item_get_light_table (const struct spv_item *item, struct spvlb_table **tablep) { *tablep = NULL; if (!spv_item_is_light_table (item)) return xstrdup ("not a light binary table object"); void *data; size_t size; char *error = spv_item_get_raw_light_table (item, &data, &size); if (error) return error; struct spvbin_input input; spvbin_input_init (&input, data, size); struct spvlb_table *table = NULL; error = (!size ? xasprintf ("light table member is empty") : !spvlb_parse_table (&input, &table) ? spvbin_input_to_error (&input, NULL) : input.ofs != input.size ? xasprintf ("expected end of file at offset %#zx", input.ofs) : NULL); if (error) { struct string s = DS_EMPTY_INITIALIZER; spv_item_format_path (item, &s); ds_put_format (&s, " (%s): %s", item->bin_member, error); free (error); error = ds_steal_cstr (&s); } free (data); if (!error) *tablep = table; return error; } static char * pivot_table_open_light (struct spv_item *item) { assert (spv_item_is_light_table (item)); struct spvlb_table *raw_table; char *error = spv_item_get_light_table (item, &raw_table); if (!error) error = decode_spvlb_table (raw_table, &item->table); spvlb_free_table (raw_table); return error; } bool spv_item_is_legacy_table (const struct spv_item *item) { return item->type == SPV_ITEM_TABLE && item->xml_member; } char * WARN_UNUSED_RESULT spv_item_get_raw_legacy_data (const struct spv_item *item, void **data, size_t *size) { if (!spv_item_is_legacy_table (item)) return xstrdup ("not a legacy table object"); return zip_member_read_all (item->spv->zip, item->bin_member, data, size); } char * WARN_UNUSED_RESULT spv_item_get_legacy_data (const struct spv_item *item, struct spv_data *data) { void *raw; size_t size; char *error = spv_item_get_raw_legacy_data (item, &raw, &size); if (!error) { error = spv_legacy_data_decode (raw, size, data); free (raw); } return error; } static char * WARN_UNUSED_RESULT spv_read_xml_member (struct spv_reader *spv, const char *member_name, bool keep_blanks, const char *root_element_name, xmlDoc **docp) { *docp = NULL; struct zip_member *zm = zip_member_open (spv->zip, member_name); if (!zm) return ds_steal_cstr (&spv->zip_errs); xmlParserCtxt *parser; xmlKeepBlanksDefault (keep_blanks); parser = xmlCreatePushParserCtxt(NULL, NULL, NULL, 0, NULL); if (!parser) { zip_member_finish (zm); return xasprintf (_("%s: Failed to create XML parser"), member_name); } int retval; char buf[4096]; while ((retval = zip_member_read (zm, buf, sizeof buf)) > 0) xmlParseChunk (parser, buf, retval, false); xmlParseChunk (parser, NULL, 0, true); xmlDoc *doc = parser->myDoc; bool well_formed = parser->wellFormed; xmlFreeParserCtxt (parser); if (retval < 0) { char *error = ds_steal_cstr (&spv->zip_errs); zip_member_finish (zm); xmlFreeDoc (doc); return error; } zip_member_finish (zm); if (!well_formed) { xmlFreeDoc (doc); return xasprintf(_("%s: document is not well-formed"), member_name); } const xmlNode *root_node = xmlDocGetRootElement (doc); assert (root_node->type == XML_ELEMENT_NODE); if (strcmp (CHAR_CAST (char *, root_node->name), root_element_name)) { xmlFreeDoc (doc); return xasprintf(_("%s: root node is \"%s\" but \"%s\" was expected"), member_name, CHAR_CAST (char *, root_node->name), root_element_name); } *docp = doc; return NULL; } char * WARN_UNUSED_RESULT spv_item_get_legacy_table (const struct spv_item *item, xmlDoc **docp) { assert (spv_item_is_legacy_table (item)); return spv_read_xml_member (item->spv, item->xml_member, false, "visualization", docp); } char * WARN_UNUSED_RESULT spv_item_get_structure (const struct spv_item *item, struct _xmlDoc **docp) { return spv_read_xml_member (item->spv, item->structure_member, false, "heading", docp); } static const char * identify_item (const struct spv_item *item) { return (item->label ? item->label : item->command_id ? item->command_id : spv_item_type_to_string (item->type)); } void spv_item_format_path (const struct spv_item *item, struct string *s) { enum { MAX_STACK = 32 }; const struct spv_item *stack[MAX_STACK]; size_t n = 0; while (item != NULL && item->parent && n < MAX_STACK) { stack[n++] = item; item = item->parent; } while (n > 0) { item = stack[--n]; ds_put_byte (s, '/'); const char *name = identify_item (item); ds_put_cstr (s, name); if (item->parent) { size_t total = 1; size_t index = 1; for (size_t i = 0; i < item->parent->n_children; i++) { const struct spv_item *sibling = item->parent->children[i]; if (sibling == item) index = total; else if (!strcmp (name, identify_item (sibling))) total++; } if (total > 1) ds_put_format (s, "[%zu]", index); } } } static char * WARN_UNUSED_RESULT pivot_table_open_legacy (struct spv_item *item) { assert (spv_item_is_legacy_table (item)); struct spv_data data; char *error = spv_item_get_legacy_data (item, &data); if (error) { struct string s = DS_EMPTY_INITIALIZER; spv_item_format_path (item, &s); ds_put_format (&s, " (%s): %s", item->bin_member, error); free (error); return ds_steal_cstr (&s); } xmlDoc *doc; error = spv_read_xml_member (item->spv, item->xml_member, false, "visualization", &doc); if (error) { spv_data_uninit (&data); return error; } struct spvxml_context ctx = SPVXML_CONTEXT_INIT (ctx); struct spvdx_visualization *v; spvdx_parse_visualization (&ctx, xmlDocGetRootElement (doc), &v); error = spvxml_context_finish (&ctx, &v->node_); if (!error) error = decode_spvdx_table (v, item->subtype, item->legacy_properties, &data, &item->table); if (error) { struct string s = DS_EMPTY_INITIALIZER; spv_item_format_path (item, &s); ds_put_format (&s, " (%s): %s", item->xml_member, error); free (error); error = ds_steal_cstr (&s); } spv_data_uninit (&data); spvdx_free_visualization (v); if (doc) xmlFreeDoc (doc); return error; } struct pivot_table * spv_item_get_table (const struct spv_item *item_) { struct spv_item *item = CONST_CAST (struct spv_item *, item_); assert (spv_item_is_table (item)); if (!item->table) { char *error = (item->xml_member ? pivot_table_open_legacy (item) : pivot_table_open_light (item)); if (error) { item->error = true; msg (ME, "%s", error); item->table = pivot_table_create_for_text ( pivot_value_new_text (N_("Error")), pivot_value_new_user_text (error, -1)); free (error); } } return item->table; } /* Constructs a new spv_item from XML and stores it in *ITEMP. Returns NULL if successful, otherwise an error message for the caller to use and free (with free()). XML should be a 'heading' or 'container' element. */ static char * WARN_UNUSED_RESULT spv_decode_container (const struct spvsx_container *c, const char *structure_member, struct spv_item *parent) { struct spv_item *item = xzalloc (sizeof *item); item->spv = parent->spv; item->label = xstrdup (c->label->text); item->visible = c->visibility == SPVSX_VISIBILITY_VISIBLE; item->structure_member = xstrdup (structure_member); assert (c->n_seq == 1); struct spvxml_node *content = c->seq[0]; if (spvsx_is_container_text (content)) decode_container_text (spvsx_cast_container_text (content), item); else if (spvsx_is_table (content)) { item->type = SPV_ITEM_TABLE; struct spvsx_table *table = spvsx_cast_table (content); const struct spvsx_table_structure *ts = table->table_structure; item->bin_member = xstrdup (ts->data_path->text); item->command_id = xstrdup_if_nonempty (table->command_name); item->subtype = xstrdup_if_nonempty (table->sub_type); if (ts->path) { item->xml_member = ts->path ? xstrdup (ts->path->text) : NULL; char *error = decode_spvsx_legacy_properties ( table->table_properties, &item->legacy_properties); if (error) { spv_item_destroy (item); return error; } } } else if (spvsx_is_graph (content)) { struct spvsx_graph *graph = spvsx_cast_graph (content); item->type = SPV_ITEM_GRAPH; item->command_id = xstrdup_if_nonempty (graph->command_name); /* XXX */ } else if (spvsx_is_model (content)) { struct spvsx_model *model = spvsx_cast_model (content); item->type = SPV_ITEM_MODEL; item->command_id = xstrdup_if_nonempty (model->command_name); /* XXX */ } else if (spvsx_is_object (content)) { struct spvsx_object *object = spvsx_cast_object (content); item->type = SPV_ITEM_OBJECT; item->object_type = xstrdup (object->type); item->uri = xstrdup (object->uri); } else if (spvsx_is_image (content)) { struct spvsx_image *image = spvsx_cast_image (content); item->type = SPV_ITEM_OBJECT; item->object_type = xstrdup ("image"); item->uri = xstrdup (image->data_path->text); } else if (spvsx_is_tree (content)) { struct spvsx_tree *tree = spvsx_cast_tree (content); item->type = SPV_ITEM_TREE; item->object_type = xstrdup ("tree"); item->uri = xstrdup (tree->data_path->text); } else NOT_REACHED (); spv_heading_add_child (parent, item); return NULL; } static char * WARN_UNUSED_RESULT spv_decode_children (struct spv_reader *spv, const char *structure_member, struct spvxml_node **seq, size_t n_seq, struct spv_item *parent) { for (size_t i = 0; i < n_seq; i++) { const struct spvxml_node *node = seq[i]; char *error = NULL; if (spvsx_is_container (node)) { const struct spvsx_container *container = spvsx_cast_container (node); error = spv_decode_container (container, structure_member, parent); } else if (spvsx_is_heading (node)) { const struct spvsx_heading *subheading = spvsx_cast_heading (node); struct spv_item *subitem = xzalloc (sizeof *subitem); subitem->structure_member = xstrdup (structure_member); subitem->spv = parent->spv; subitem->type = SPV_ITEM_HEADING; subitem->label = xstrdup (subheading->label->text); if (subheading->command_name) subitem->command_id = xstrdup (subheading->command_name); subitem->visible = !subheading->heading_visibility_present; spv_heading_add_child (parent, subitem); error = spv_decode_children (spv, structure_member, subheading->seq, subheading->n_seq, subitem); } else NOT_REACHED (); if (error) return error; } return NULL; } static struct page_setup * decode_page_setup (const struct spvsx_page_setup *in, const char *file_name) { struct page_setup *out = xmalloc (sizeof *out); *out = (struct page_setup) PAGE_SETUP_INITIALIZER; out->initial_page_number = in->initial_page_number; if (in->paper_width != DBL_MAX) out->paper[TABLE_HORZ] = in->paper_width; if (in->paper_height != DBL_MAX) out->paper[TABLE_VERT] = in->paper_height; if (in->margin_left != DBL_MAX) out->margins[TABLE_HORZ][0] = in->margin_left; if (in->margin_right != DBL_MAX) out->margins[TABLE_HORZ][1] = in->margin_right; if (in->margin_top != DBL_MAX) out->margins[TABLE_VERT][0] = in->margin_top; if (in->margin_bottom != DBL_MAX) out->margins[TABLE_VERT][1] = in->margin_bottom; if (in->space_after != DBL_MAX) out->object_spacing = in->space_after; if (in->chart_size) out->chart_size = (in->chart_size == SPVSX_CHART_SIZE_FULL_HEIGHT ? PAGE_CHART_FULL_HEIGHT : in->chart_size == SPVSX_CHART_SIZE_HALF_HEIGHT ? PAGE_CHART_HALF_HEIGHT : in->chart_size == SPVSX_CHART_SIZE_QUARTER_HEIGHT ? PAGE_CHART_QUARTER_HEIGHT : PAGE_CHART_AS_IS); decode_page_paragraph (in->page_header->page_paragraph, &out->headings[0]); decode_page_paragraph (in->page_footer->page_paragraph, &out->headings[1]); out->file_name = xstrdup (file_name); return out; } static char * WARN_UNUSED_RESULT spv_heading_read (struct spv_reader *spv, const char *file_name, const char *member_name) { xmlDoc *doc; char *error = spv_read_xml_member (spv, member_name, true, "heading", &doc); if (error) return error; struct spvxml_context ctx = SPVXML_CONTEXT_INIT (ctx); struct spvsx_root_heading *root; spvsx_parse_root_heading (&ctx, xmlDocGetRootElement (doc), &root); error = spvxml_context_finish (&ctx, &root->node_); if (!error && root->page_setup) spv->page_setup = decode_page_setup (root->page_setup, file_name); for (size_t i = 0; !error && i < root->n_seq; i++) error = spv_decode_children (spv, member_name, root->seq, root->n_seq, spv->root); if (error) { char *s = xasprintf ("%s: %s", member_name, error); free (error); error = s; } spvsx_free_root_heading (root); xmlFreeDoc (doc); return error; } struct spv_item * spv_get_root (const struct spv_reader *spv) { return spv->root; } static int spv_detect__ (struct zip_reader *zip, char **errorp) { *errorp = NULL; const char *member = "META-INF/MANIFEST.MF"; if (!zip_reader_contains_member (zip, member)) return 0; void *data; size_t size; *errorp = zip_member_read_all (zip, "META-INF/MANIFEST.MF", &data, &size); if (*errorp) return -1; const char *magic = "allowPivoting=true"; bool is_spv = size == strlen (magic) && !memcmp (magic, data, size); free (data); return is_spv; } /* Returns NULL if FILENAME is an SPV file, otherwise an error string that the caller must eventually free(). */ char * WARN_UNUSED_RESULT spv_detect (const char *filename) { struct string zip_error; struct zip_reader *zip = zip_reader_create (filename, &zip_error); if (!zip) return ds_steal_cstr (&zip_error); char *error; if (spv_detect__ (zip, &error) <= 0 && !error) error = xasprintf("%s: not an SPV file", filename); zip_reader_destroy (zip); ds_destroy (&zip_error); return error; } char * WARN_UNUSED_RESULT spv_open (const char *filename, struct spv_reader **spvp) { *spvp = NULL; struct spv_reader *spv = xzalloc (sizeof *spv); ds_init_empty (&spv->zip_errs); spv->zip = zip_reader_create (filename, &spv->zip_errs); if (!spv->zip) { char *error = ds_steal_cstr (&spv->zip_errs); spv_close (spv); return error; } char *error; int detect = spv_detect__ (spv->zip, &error); if (detect <= 0) { spv_close (spv); return error ? error : xasprintf("%s: not an SPV file", filename); } spv->root = xzalloc (sizeof *spv->root); spv->root->spv = spv; spv->root->type = SPV_ITEM_HEADING; for (size_t i = 0; ; i++) { const char *member_name = zip_reader_get_member_name (spv->zip, i); if (!member_name) break; struct substring member_name_ss = ss_cstr (member_name); if (ss_starts_with (member_name_ss, ss_cstr ("outputViewer")) && ss_ends_with (member_name_ss, ss_cstr (".xml"))) { char *error = spv_heading_read (spv, filename, member_name); if (error) { spv_close (spv); return error; } } } *spvp = spv; return NULL; } void spv_close (struct spv_reader *spv) { if (spv) { ds_destroy (&spv->zip_errs); zip_reader_destroy (spv->zip); spv_item_destroy (spv->root); page_setup_destroy (spv->page_setup); free (spv); } } char * WARN_UNUSED_RESULT spv_decode_fmt_spec (uint32_t u32, struct fmt_spec *out) { if (!u32 || (u32 == 0x10000 || u32 == 1 /* both used as string formats */)) { *out = fmt_for_output (FMT_F, 40, 2); return NULL; } uint8_t raw_type = u32 >> 16; uint8_t w = u32 >> 8; uint8_t d = u32; msg_disable (); *out = (struct fmt_spec) { .type = FMT_F, .w = w, .d = d }; bool ok = raw_type >= 40 || fmt_from_io (raw_type, &out->type); if (ok) { fmt_fix_output (out); ok = fmt_check_width_compat (out, 0); } msg_enable (); if (!ok) { *out = fmt_for_output (FMT_F, 40, 2); return xasprintf ("bad format %#"PRIx32, u32); } return NULL; } pspp-1.4.1/src/output/spv/binary-parser-generator0000644000175000017500000007032513673465023021557 0ustar00blpblp00000000000000#! /usr/bin/python # PSPP - a program for statistical analysis. # Copyright (C) 2017, 2018, 2019 Free Software Foundation, Inc. # # 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 3 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, see . import getopt import os import struct import sys n_errors = 0 def error(msg): global n_errors sys.stderr.write("%s:%d: %s\n" % (file_name, line_number, msg)) n_errors += 1 def fatal(msg): error(msg) sys.exit(1) def get_line(): global line global line_number line = input_file.readline() line_number += 1 def is_num(s): return s.isdigit() or (s[0] == '-' and s[1].isdigit()) xdigits = "0123456789abcdefABCDEF" def is_xdigits(s): for c in s: if c not in xdigits: return False return True def expect(type): if token[0] != type: fatal("syntax error expecting %s" % type) def match(type): if token[0] == type: get_token() return True else: return False def must_match(type): expect(type) get_token() def get_token(): global token global line prev = token if line == "": if token == ('eof', ): fatal("unexpected end of input") get_line() if not line: token = ('eof', ) return elif line == '\n': token = (';', ) return elif not line[0].isspace(): token = (';', ) return line = line.lstrip() if line == "": get_token() elif line[0] == '#': line = '' get_token() elif line[0] in '[]()?|*': token = (line[0], ) line = line[1:] elif line.startswith('=>'): token = (line[:2], ) line = line[2:] elif line.startswith('...'): token = (line[:3], ) line = line[3:] elif line[0].isalnum() or line[0] == '-': n = 1 while n < len(line) and (line[n].isalnum() or line[n] == '-'): n += 1 s = line[:n] line = line[n:] if prev[0] == '*' and is_num(s): token = ('number', int(s, 10)) elif len(s) == 2 and is_xdigits(s): token = ('bytes', struct.pack('B', int(s, 16))) elif s[0] == 'i' and is_num(s[1:]): token = ('bytes', struct.pack('i', int(s[2:]))) elif s[0].isupper(): token = ('nonterminal', s) elif s in ('bool', 'int16', 'int32', 'int64', 'be16', 'be32', 'be64', 'string', 'bestring', 'byte', 'float', 'double', 'count', 'becount', 'v1', 'v3', 'vAF', 'vB0', 'case', 'else'): token = (s, ) else: token = ('id', s) else: fatal("unknown character %c" % line[0]) def usage(): argv0 = os.path.basename(sys.argv[0]) print('''\ %(argv0)s, parser generator for SPV binary members usage: %(argv0)s GRAMMAR header %(argv0)s GRAMMAR code HEADER_NAME where GRAMMAR contains grammar definitions\ ''' % {"argv0": argv0}) sys.exit(0) class Item(object): def __init__(self, type_, name, n, content): self.type_ = type_ self.name = name self.n = n self.content = content def __repr__(self): if self.type_ == 'constant': return ' '.join(['%02x' % maybe_ord(x) for x in self.content]) elif self.content: return "%s(%s)" % (self.type_, self.content) else: return self.type_ def parse_item(): t = token name = None if t[0] == 'bytes': type_ = 'constant' content = t[1] get_token() elif t[0] in ('bool', 'byte', 'int16', 'int32', 'int64', 'be16', 'be32', 'be64', 'string', 'bestring', 'float', 'double', 'nonterminal', '...'): type_ = 'variable' content = t get_token() if t[0] == 'nonterminal': name = name_to_id(content[1]) elif t[0] in ('v1', 'v3', 'vAF', 'vB0', 'count', 'becount'): type_ = t[0] get_token() must_match('(') content = parse_choice() must_match(')') elif match('case'): return parse_case() elif match('('): type_ = '()' content = parse_choice() must_match(')') else: print(token) fatal('syntax error expecting item') n = 1 optional = False if match('*'): if token[0] == 'number': n = token[1] get_token() elif match('['): expect('id') n = token[1] get_token() must_match(']') if n.startswith('n-'): name = n[2:] else: fatal('expecting quantity') elif match('?'): optional = True if match('['): expect('id') if type_ == 'constant' and not optional: fatal("%s: cannot name a constant" % token[1]) name = token[1] get_token() must_match(']') if type_ == 'constant': content *= n n = 1 item = Item(type_, name, n, content) if optional: item = Item('|', None, 1, [[item], []]) return item def parse_concatenation(): items = [] while token[0] not in (')', ';', '|', 'eof'): item = parse_item() if (item.type_ == 'constant' and items and items[-1].type_ == 'constant'): items[-1].content += item.content else: items.append(item) return items def parse_choice(): sub = parse_concatenation() if token[0] != '|': return sub choices = [sub] while match('|'): choices.append(parse_concatenation()) return [Item('|', None, 1, choices)] def parse_case(): must_match('(') choices = {} while True: choice = None if match('else'): choice = 'else' items = parse_concatenation() if choice is None: if (not items or items[0].type_ != 'constant' or len(items[0].content) != 1): fatal("choice must begin with xx (or 'else')") choice = '%02x' % maybe_ord(items[0].content) if choice in choices: fatal("duplicate choice %s" % choice) choices[choice] = items if match(')'): break must_match('|') case_name = None if match('['): expect('id') case_name = token[1] get_token() must_match(']') return Item('case', case_name, 1, { '%s_%s' % (case_name, k) : v for k, v in choices.items() }) def parse_production(): expect('nonterminal') name = token[1] get_token() must_match('=>') return name, parse_choice() def print_members(p, indent): for item in p: if item.type_ == 'variable' and item.name: if item.content[0] == 'nonterminal': typename = 'struct %s%s' % (prefix, name_to_id(item.content[1])) n_stars = 1 else: c_types = {'bool': ('bool', 0), 'byte': ('uint8_t', 0), 'int16': ('uint16_t', 0), 'int32': ('uint32_t', 0), 'int64': ('uint64_t', 0), 'be16': ('uint16_t', 0), 'be32': ('uint32_t', 0), 'be64': ('uint64_t', 0), 'string': ('char', 1), 'bestring': ('char', 1), 'float': ('double', 0), 'double': ('double', 0), '...': ('uint8_t', 1)} typename, n_stars = c_types[item.content[0]] array_suffix = '' if item.n: if isinstance(item.n, int): if item.n > 1: array_suffix = '[%d]' % item.n else: n_stars += 1 print("%s%s %s%s%s;" % (indent, typename, '*' * n_stars, name_to_id(item.name), array_suffix)) elif item.type_ in ('v1', 'v3', 'vAF', 'vB0', 'count', 'becount', '()'): print_members(item.content, indent) elif item.type_ == '|': for choice in item.content: print_members(choice, indent) elif item.type_ == 'case': print("%sint %s;" % (indent, item.name)) print("%sunion {" % indent) for name, choice in sorted(item.content.items()): print("%s struct {" % indent) print_members(choice, indent + ' ' * 8) print("%s } %s;" % (indent, name)) print("%s};" % indent) elif item.type_ == 'constant': if item.name: print("%sbool %s;" % (indent, item.name)) elif item.type_ not in ("constant", "variable"): fatal("unhandled type %s" % item.type_) def maybe_ord(x): """ In Python 2, the elements of byte strings b'asdf' are char. In Python 3, the elements are int. This converts chars to ints. """ return x if type(x) is int else ord(x) def bytes_to_hex(s): return ''.join(['"'] + ["\\x%02x" % maybe_ord(x) for x in s] + ['"']) class Parser_Context(object): def __init__(self): self.suffixes = {} self.bail = 'error' self.need_error_handler = False def gen_name(self, prefix): n = self.suffixes.get(prefix, 0) + 1 self.suffixes[prefix] = n return '%s%d' % (prefix, n) if n > 1 else prefix def save_pos(self, indent): pos = self.gen_name('pos') print("%sstruct spvbin_position %s = spvbin_position_save (input);" % (indent, pos)) return pos def save_error(self, indent): error = self.gen_name('save_n_errors') print("%ssize_t %s = input->n_errors;" % (indent, error)) return error def parse_limit(self, endian, indent): limit = self.gen_name('saved_limit') print("""\ %sstruct spvbin_limit %s; %sif (!spvbin_limit_parse%s (&%s, input)) %s goto %s;""" % ( indent, limit, indent, '_be' if endian == 'big' else '', limit, indent, self.bail)) return limit def print_parser_items(name, production, indent, accessor, ctx): for item_idx in range(len(production)): if item_idx > 0: print item = production[item_idx] if item.type_ == 'constant': print("""%sif (!spvbin_match_bytes (input, %s, %d)) %s goto %s;""" % ( indent, bytes_to_hex(item.content), len(item.content), indent, ctx.bail)) ctx.need_error_handler = True if item.name: print("%sp->%s = true;" % (indent, item.name)) elif item.type_ == 'variable': if item.content[0] == 'nonterminal': func = '%sparse_%s' % (prefix, name_to_id(item.content[1])) else: func = 'spvbin_parse_%s' % item.content[0] if item.name: dst = "&p->%s%s" % (accessor, name_to_id(item.name)) else: dst = "NULL" if item.n == 1: print("""%sif (!%s (input, %s)) %s goto %s;""" % (indent, func, dst, indent, ctx.bail)) if item.content[0] != 'nonterminal' and item.name == 'version': print("%sinput->version = p->%s%s;" % ( indent, accessor, name_to_id(item.name))) else: if isinstance(item.n, int): count = item.n else: count = 'p->%s%s' % (accessor, name_to_id(item.n)) i_name = ctx.gen_name('i') if item.name: if not isinstance(item.n, int): print("%sp->%s%s = xcalloc (%s, sizeof *p->%s%s);" % ( indent, accessor, name_to_id(item.name), count, accessor, name_to_id(item.name))) dst += '[%s]' % i_name print("%sfor (int %s = 0; %s < %s; %s++)" % ( indent, i_name, i_name, count, i_name)) print("""%s if (!%s (input, %s)) %s goto %s;""" % (indent, func, dst, indent, ctx.bail)) ctx.need_error_handler = True elif item.type_ == '()': if item.n != 1: # Not yet implemented raise AssertionError print_parser_items(name, item.content, indent, accessor, ctx) elif item.type_ in ('v1', 'v3', 'vAF', 'vB0'): if item.n != 1: # Not yet implemented raise AssertionError print("%sif (input->version == 0x%s) {" % (indent, item.type_[1:])) print_parser_items(name, item.content, indent + ' ', accessor, ctx) print("%s}" % indent) elif item.type_ in ('count', 'becount'): if item.n != 1: # Not yet implemented raise AssertionError pos = ctx.save_pos(indent) endian = 'big' if item.type_ == 'becount' else 'little' limit = ctx.parse_limit(endian, indent) save_bail = ctx.bail ctx.bail = ctx.gen_name('backtrack') print("%sdo {" % indent) indent += ' ' if (item.content and item.content[-1].type_ == 'variable' and item.content[-1].content[0] == '...'): content = item.content[:-1] ellipsis = True else: content = item.content ellipsis = False print_parser_items(name, content, indent, accessor, ctx) if ellipsis: print("%sinput->ofs = input->size;" % indent) else: print("""%sif (!spvbin_input_at_end (input)) %s goto %s;""" % (indent, indent, ctx.bail)) print('%sspvbin_limit_pop (&%s, input);' % (indent, limit)) print('%sbreak;' % indent) print('') print('%s%s:' % (indent[4:], ctx.bail)) # In theory, we should emit code to clear whatever we're # backtracking from. In practice, it's not important to # do that. print("%sspvbin_position_restore (&%s, input);" % (indent, pos)) print('%sspvbin_limit_pop (&%s, input);' % (indent, limit)) print('%sgoto %s;' % (indent, save_bail)) indent = indent[4:] print("%s} while (0);" % indent) ctx.bail = save_bail elif item.type_ == '|': save_bail = ctx.bail print("%sdo {" % indent) indent += ' ' pos = ctx.save_pos(indent) error = ctx.save_error(indent) i = 0 for choice in item.content: if i: print("%sspvbin_position_restore (&%s, input);" % (indent, pos)) print("%sinput->n_errors = %s;" % (indent, error)) i += 1 if i != len(item.content): ctx.bail = ctx.gen_name('backtrack') else: ctx.bail = save_bail print_parser_items(name, choice, indent, accessor, ctx) print("%sbreak;" % indent) if i != len(item.content): print('') print('%s%s:' % (indent[4:], ctx.bail)) # In theory, we should emit code to clear whatever we're # backtracking from. In practice, it's not important to # do that. indent = indent[4:] print("%s} while (0);" % indent) elif item.type_ == 'case': i = 0 for choice_name, choice in sorted(item.content.items()): if choice_name.endswith('else'): print("%s} else {" % indent) print("%s p->%s%s = -1;" % (indent, accessor, item.name)) print('') else: print("%s%sif (spvbin_match_byte (input, 0x%s)) {" % ( indent, '} else ' if i else '', choice_name[-2:])) print("%s p->%s%s = 0x%s;" % ( indent, accessor, item.name, choice_name[-2:])) print('') choice = choice[1:] print_parser_items(name, choice, indent + ' ', accessor + choice_name + '.', ctx) i += 1 print("%s}" % indent) else: # Not implemented raise AssertionError def print_parser(name, production, indent): print(''' bool %(prefix)sparse_%(name)s (struct spvbin_input *input, struct %(prefix)s%(name)s **p_) { *p_ = NULL; struct %(prefix)s%(name)s *p = xzalloc (sizeof *p); p->start = input->ofs; ''' % {'prefix': prefix, 'name': name_to_id(name)}) ctx = Parser_Context() print_parser_items(name, production, indent, '', ctx) print(''' p->len = input->ofs - p->start; *p_ = p; return true;''') if ctx.need_error_handler: print(""" error: spvbin_error (input, "%s", p->start); %sfree_%s (p); return false;""" % (name, prefix, name_to_id(name))) print("}") def print_free_items(name, production, indent, accessor, ctx): for item in production: if item.type_ == 'constant': pass elif item.type_ == 'variable': if not item.name: continue if item.content[0] == 'nonterminal': free_func = '%sfree_%s' % (prefix, name_to_id(item.content[1])) elif item.content[0] in ('string', 'bestring', '...'): free_func = 'free' else: free_func = None dst = "p->%s%s" % (accessor, name_to_id(item.name)) if item.n == 1: if free_func: print("%s%s (%s);" % (indent, free_func, dst)) else: if isinstance(item.n, int): count = item.n else: count = 'p->%s%s' % (accessor, name_to_id(item.n)) i_name = ctx.gen_name('i') if free_func: print("%sfor (int %s = 0; %s < %s; %s++)" % ( indent, i_name, i_name, count, i_name)) print("%s %s (%s[%s]);" % ( indent, free_func, dst, i_name)) if not isinstance(item.n, int): print("%sfree (p->%s%s);" % ( indent, accessor, name_to_id(item.name))) elif item.type_ in ('()', 'v1', 'v3', 'vAF', 'vB0', 'count', 'becount'): if item.n != 1: # Not yet implemented raise AssertionError print_free_items(name, item.content, indent, accessor, ctx) elif item.type_ == '|': for choice in item.content: print_free_items(name, choice, indent, accessor, ctx) elif item.type_ == 'case': i = 0 for choice_name, choice in sorted(item.content.items()): if choice_name.endswith('else'): value_name = '-1' else: value_name = '0x%s' % choice_name[-2:] print('%s%sif (p->%s%s == %s) {' % ( indent, '} else ' if i else '', accessor, item.name, value_name)) print_free_items(name, choice, indent + ' ', accessor + choice_name + '.', ctx) i += 1 print("%s}" % indent) else: # Not implemented raise AssertionError def print_free(name, production, indent): print(''' void %(prefix)sfree_%(name)s (struct %(prefix)s%(name)s *p) { if (p == NULL) return; ''' % {'prefix': prefix, 'name': name_to_id(name)}) print_free_items(name, production, indent, '', Parser_Context()) print(" free (p);") print("}") def print_print_items(name, production, indent, accessor, ctx): for item_idx in range(len(production)): if item_idx > 0: print('') item = production[item_idx] if item.type_ == 'constant': if item.name: print('%sspvbin_print_presence ("%s", indent + 1, p->%s);' % ( indent, item.name, item.name)) elif item.type_ == 'variable': if not item.name: continue if item.content[0] == 'nonterminal': func = '%sprint_%s' % (prefix, name_to_id(item.content[1])) else: c_types = {'bool': 'bool', 'byte': 'byte', 'int16': 'int16', 'int32': 'int32', 'int64': 'int64', 'be16': 'int16', 'be32': 'int32', 'be64': 'int64', 'string': 'string', 'bestring': 'string', 'float': 'double', 'double': 'double', '...': ('uint8_t', 1)} func = 'spvbin_print_%s' % c_types[item.content[0]] dst = "p->%s%s" % (accessor, name_to_id(item.name)) if item.n == 1: print('%s%s ("%s", indent + 1, %s);' % (indent, func, item.name, dst)) else: if isinstance(item.n, int): count = item.n else: count = 'p->%s%s' % (accessor, name_to_id(item.n)) i_name = ctx.gen_name('i') elem_name = ctx.gen_name('elem_name') dst += '[%s]' % i_name print("""\ %(indent)sfor (int %(index)s = 0; %(index)s < %(count)s; %(index)s++) { %(indent)s char *%(elem_name)s = xasprintf ("%(item.name)s[%%d]", %(index)s); %(indent)s %(func)s (%(elem_name)s, indent + 1, %(dst)s); %(indent)s free (%(elem_name)s); %(indent)s}""" % {'indent': indent, 'index': i_name, 'count': count, 'elem_name' : elem_name, 'item.name': item.name, 'func': func, 'dst': dst}) elif item.type_ == '()': if item.n != 1: # Not yet implemented raise AssertionError print_print_items(name, item.content, indent, accessor, ctx) elif item.type_ in ('v1', 'v3', 'vAF', 'vB0'): if item.n != 1: # Not yet implemented raise AssertionError print_print_items(name, item.content, indent, accessor, ctx) elif item.type_ in ('count', 'becount'): if item.n != 1: # Not yet implemented raise AssertionError indent += ' ' if (item.content and item.content[-1].type_ == 'variable' and item.content[-1].content[0] == '...'): content = item.content[:-1] else: content = item.content print_print_items(name, content, indent, accessor, ctx) elif item.type_ == '|': for choice in item.content: print_print_items(name, choice, indent, accessor, ctx) elif item.type_ == 'case': i = 0 print("""\ %sspvbin_print_case ("%s", indent + 1, p->%s%s);""" % ( indent, item.name, accessor, name_to_id(item.name))) for choice_name, choice in sorted(item.content.items()): if choice_name.endswith('else'): value_name = '-1' else: value_name = '0x%s' % choice_name[-2:] print('%s%sif (p->%s%s == %s) {' % ( indent, '} else ' if i else '', accessor, item.name, value_name)) print_print_items(name, choice, indent + ' ', accessor + choice_name + '.', ctx) i += 1 print("%s}" % indent) else: # Not implemented raise AssertionError def print_print(name, production, indent): print(''' void %(prefix)sprint_%(name)s (const char *title, int indent, const struct %(prefix)s%(name)s *p) { spvbin_print_header (title, p ? p->start : -1, p ? p->len : -1, indent); if (p == NULL) { printf ("none\\n"); return; } putchar ('\\n'); ''' % {'prefix': prefix, 'rawname': name, 'name': name_to_id(name)}) ctx = Parser_Context() print_print_items(name, production, indent, '', ctx) print("}") def name_to_id(s): return s[0].lower() + ''.join(['_%c' % x.lower() if x.isupper() else x for x in s[1:]]).replace('-', '_') if __name__ == "__main__": argv0 = sys.argv[0] try: options, args = getopt.gnu_getopt(sys.argv[1:], 'h', ['help']) except getopt.GetoptError as e: sys.stderr.write("%s: %s\n" % (argv0, e.msg)) sys.exit(1) for key, value in options: if key in ['-h', '--help']: usage() else: sys.exit(0) if len(args) < 3: sys.stderr.write("%s: bad usage (use --help for help)\n" % argv0) sys.exit(1) global file_name file_name, output_type, prefix = args[:3] input_file = open(file_name) prefix = '%s_' % prefix global line global line_number line = "" line_number = 0 productions = {} global token token = ('start', ) get_token() while True: while match(';'): pass if token[0] == 'eof': break name, production = parse_production() if name in productions: fatal("%s: duplicate production" % name) productions[name] = production print('/* Generated automatically -- do not modify! -*- buffer-read-only: t -*- */') if output_type == 'code' and len(args) == 4: header_name = args[3] print("""\ #include #include %s #include #include #include "libpspp/str.h" #include "gl/xalloc.h"\ """ % header_name) for name, production in productions.items(): print_parser(name, production, ' ' * 4) print_free(name, production, ' ' * 4) print_print(name, production, ' ' * 4) elif output_type == 'header' and len(args) == 3: print("""\ #ifndef %(PREFIX)sPARSER_H #define %(PREFIX)sPARSER_H #include #include #include #include "output/spv/spvbin-helpers.h"\ """ % {'PREFIX': prefix.upper()}) for name, production in productions.items(): print('\nstruct %s%s {' % (prefix, name_to_id(name))) print(" size_t start, len;") print_members(production, ' ' * 4) print('''}; bool %(prefix)sparse_%(name)s (struct spvbin_input *, struct %(prefix)s%(name)s **); void %(prefix)sfree_%(name)s (struct %(prefix)s%(name)s *); void %(prefix)sprint_%(name)s (const char *title, int indent, const struct %(prefix)s%(name)s *);\ ''' % {'prefix': prefix, 'name': name_to_id(name)}) print("""\ #endif /* %(PREFIX)sPARSER_H */""" % {'PREFIX': prefix.upper()}) else: sys.stderr.write("%s: bad usage (use --help for help)" % argv0) pspp-1.4.1/src/output/spv/automake.mk0000644000175000017500000001002613673465023017221 0ustar00blpblp00000000000000# PSPP - a program for statistical analysis. # Copyright (C) 2019, 2020 Free Software Foundation, Inc. # # 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 3 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, see . # ## Process this file with automake to produce Makefile.in -*- makefile -*- src_output_liboutput_la_SOURCES += \ src/output/spv/spv-css-parser.c \ src/output/spv/spv-css-parser.h \ src/output/spv/spv-dump.c \ src/output/spv/spv-legacy-data.c \ src/output/spv/spv-legacy-data.h \ src/output/spv/spv-legacy-decoder.c \ src/output/spv/spv-legacy-decoder.h \ src/output/spv/spv-light-decoder.c \ src/output/spv/spv-light-decoder.h \ src/output/spv/spv-output.c \ src/output/spv/spv-output.h \ src/output/spv/spv-select.c \ src/output/spv/spv-select.h \ src/output/spv/spv-writer.c \ src/output/spv/spv-writer.h \ src/output/spv/spv.c \ src/output/spv/spv.h \ src/output/spv/spvbin-helpers.c \ src/output/spv/spvbin-helpers.h \ src/output/spv/spvxml-helpers.c \ src/output/spv/spvxml-helpers.h AM_CPPFLAGS += -Isrc light_binary_in = \ src/output/spv/binary-parser-generator \ src/output/spv/light-binary.grammar light_binary_out = \ src/output/spv/light-binary-parser.c \ src/output/spv/light-binary-parser.h src/output/spv/light-binary-parser.c: $(light_binary_in) $(AM_V_GEN)$(PYTHON) $^ code spvlb '"output/spv/light-binary-parser.h"' > $@.tmp $(AM_V_at)mv $@.tmp $@ src/output/spv/light-binary-parser.h: $(light_binary_in) $(AM_V_GEN)$(PYTHON) $^ header spvlb > $@.tmp && mv $@.tmp $@ nodist_src_output_liboutput_la_SOURCES += $(light_binary_out) BUILT_SOURCES += $(light_binary_out) CLEANFILES += $(light_binary_out) EXTRA_DIST += $(light_binary_in) old_binary_in = \ src/output/spv/binary-parser-generator \ src/output/spv/old-binary.grammar old_binary_out = \ src/output/spv/old-binary-parser.c \ src/output/spv/old-binary-parser.h src/output/spv/old-binary-parser.c: $(old_binary_in) $(AM_V_GEN)$(PYTHON) $^ code spvob '"output/spv/old-binary-parser.h"' > $@.tmp $(AM_V_at)mv $@.tmp $@ src/output/spv/old-binary-parser.h: $(old_binary_in) $(AM_V_GEN)$(PYTHON) $^ header spvob > $@.tmp && mv $@.tmp $@ nodist_src_output_liboutput_la_SOURCES += $(old_binary_out) BUILT_SOURCES += $(old_binary_out) CLEANFILES += $(old_binary_out) EXTRA_DIST += $(old_binary_in) detail_xml_in = \ src/output/spv/xml-parser-generator \ src/output/spv/detail-xml.grammar detail_xml_out = \ src/output/spv/detail-xml-parser.c \ src/output/spv/detail-xml-parser.h src/output/spv/detail-xml-parser.c: $(detail_xml_in) $(AM_V_GEN)$(PYTHON) $^ code spvdx '"output/spv/detail-xml-parser.h"' > $@.tmp $(AM_V_at)mv $@.tmp $@ src/output/spv/detail-xml-parser.h: $(detail_xml_in) $(AM_V_GEN)$(PYTHON) $^ header spvdx > $@.tmp && mv $@.tmp $@ nodist_src_output_liboutput_la_SOURCES += $(detail_xml_out) BUILT_SOURCES += $(detail_xml_out) CLEANFILES += $(detail_xml_out) EXTRA_DIST += $(detail_xml_in) structure_xml_in = \ src/output/spv/xml-parser-generator \ src/output/spv/structure-xml.grammar structure_xml_out = \ src/output/spv/structure-xml-parser.c \ src/output/spv/structure-xml-parser.h src/output/spv/structure-xml-parser.c: $(structure_xml_in) $(AM_V_GEN)$(PYTHON) $^ code spvsx '"output/spv/structure-xml-parser.h"' > $@.tmp $(AM_V_at)mv $@.tmp $@ src/output/spv/structure-xml-parser.h: $(structure_xml_in) $(AM_V_GEN)$(PYTHON) $^ header spvsx > $@.tmp && mv $@.tmp $@ nodist_src_output_liboutput_la_SOURCES += $(structure_xml_out) BUILT_SOURCES += $(structure_xml_out) CLEANFILES += $(structure_xml_out) EXTRA_DIST += $(structure_xml_in) pspp-1.4.1/src/output/spv/spv-dump.c0000644000175000017500000000436613602145300016774 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2017, 2018 Free Software Foundation, Inc. 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 3 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, see . */ #include #include "output/spv/spv.h" #include #include #include "data/settings.h" #include "output/pivot-table.h" #include "gl/xalloc.h" static void indent (int indentation) { for (int i = 0; i < indentation * 2; i++) putchar (' '); } void spv_item_dump (const struct spv_item *item, int indentation) { indent (indentation); if (item->label) printf ("\"%s\" ", item->label); if (!item->visible) printf ("(hidden) "); switch (item->type) { case SPV_ITEM_HEADING: printf ("heading\n"); for (size_t i = 0; i < item->n_children; i++) spv_item_dump (item->children[i], indentation + 1); break; case SPV_ITEM_TEXT: printf ("text \"%s\"\n", pivot_value_to_string (item->text, SETTINGS_VALUE_SHOW_DEFAULT, SETTINGS_VALUE_SHOW_DEFAULT)); break; case SPV_ITEM_TABLE: if (item->table) pivot_table_dump (item->table, indentation + 1); else { printf ("unloaded table in %s", item->bin_member); if (item->xml_member) printf (" and %s", item->xml_member); putchar ('\n'); } break; case SPV_ITEM_GRAPH: printf ("graph\n"); break; case SPV_ITEM_MODEL: printf ("model\n"); break; case SPV_ITEM_OBJECT: printf ("object type=\"%s\" uri=\"%s\"\n", item->object_type, item->uri); break; case SPV_ITEM_TREE: printf ("tree\n"); break; } } pspp-1.4.1/src/output/spv/light-binary.grammar0000644000175000017500000001321513624301134021012 0ustar00blpblp00000000000000# PSPP - a program for statistical analysis. # Copyright (C) 2017, 2018, 2019 Free Software Foundation, Inc. # # 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 3 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, see . Table => Header Titles Footnotes Areas Borders PrintSettings[ps] TableSettings[ts] Formats Dimensions Axes Cells 01? Header => 01 00 int32[version] bool[x0] bool[x1] bool[rotate-inner-column-labels] bool[rotate-outer-row-labels] bool[x2] int32[x3] int32[min-col-width] int32[max-col-width] int32[min-row-height] int32[max-row-height] int64[table-id] Titles => Value[title] 01? Value[subtype] 01? 31 Value[user-title] 01? (31 Value[corner-text] | 58) (31 Value[caption] | 58) Footnotes => int32[n-footnotes] Footnote*[n-footnotes] Footnote => Value[text] (58 | 31 Value[marker]) int32[show] Areas => 00? Area*8[areas] Area => byte[index] 31 string[typeface] float[size] int32[style] bool[underline] int32[halign] int32[valign] string[fg-color] string[bg-color] bool[alternate] string[alt-fg-color] string[alt-bg-color] v3(int32[left-margin] int32[right-margin] int32[top-margin] int32[bottom-margin]) Borders => count( ib1 be32[n-borders] Border*[n-borders] bool[show-grid-lines] 00 00 00) Border => be32[border-type] be32[stroke-type] be32[color] PrintSettings => count( ib1 bool[all-layers] bool[paginate-layers] bool[fit-width] bool[fit-length] bool[top-continuation] bool[bottom-continuation] be32[n-orphan-lines] bestring[continuation-string]) TableSettings => count( v3( ib1 be32[x5] be32[current-layer] bool[omit-empty] bool[show-row-labels-in-corner] bool[show-alphabetic-markers] bool[footnote-marker-superscripts] byte[x6] becount( Breakpoints[row-breaks] Breakpoints[col-breaks] Keeps[row-keeps] Keeps[col-keeps] PointKeeps[row-point-keeps] PointKeeps[col-point-keeps] ) bestring[notes] bestring[table-look] )...) Breakpoints => be32[n-breaks] be32*[n-breaks] Keeps => be32[n-keeps] Keep*[n-keeps] Keep => be32[offset] be32[n] PointKeeps => be32[n-point-keeps] PointKeep*[n-point-keeps] PointKeep => be32[offset] be32 be32 Formats => int32[n-widths] int32*[n-widths] string[locale] int32[current-layer] bool[x7] bool[x8] bool[x9] Y0 CustomCurrency count( v1(X0?) v3(count(X1 count(X2)) count(X3))) Y0 => int32[epoch] byte[decimal] byte[grouping] CustomCurrency => int32[n-ccs] string*[n-ccs] X0 => byte*14 Y1 Y2 Y1 => string[command] string[command-local] string[language] string[charset] string[locale] bool[x10] bool[x11] bool[x12] bool[x13] Y0 Y2 => CustomCurrency byte[missing] bool[x17] X1 => bool[x14] byte[x15] bool[x16] byte[lang] byte[show-variables] byte[show-values] int32[x18] int32[x19] 00*17 bool[x20] bool[show-caption] X2 => int32[n-row-heights] int32*[n-row-heights] int32[n-style-map] StyleMap*[n-style-map] int32[n-styles] StylePair*[n-styles] count((i0 i0)?) StyleMap => int64[cell-index] int16[style-index] X3 => 01 00 byte[x21] 00 00 00 Y1 double[small] 01 (string[dataset] string[datafile] i0 int32[date] i0)? Y2 (int32[x22] i0)? Dimensions => int32[n-dims] Dimension*[n-dims] Dimension => Value[name] DimProperties[props] int32[n-categories] Category*[n-categories] DimProperties => byte[x1] byte[x2] int32[x3] bool[hide-dim-label] bool[hide-all-labels] 01 int32[dim-index] Category => Value[name] (Leaf | Group) Leaf => 00 00 00 i2 int32[leaf-index] i0 Group => bool[merge] 00 01 int32[x23] i-1 int32[n-subcategories] Category*[n-subcategories] Axes => int32[n-layers] int32[n-rows] int32[n-columns] int32*[n-layers] int32*[n-rows] int32*[n-columns] Cells => int32[n-cells] Cell*[n-cells] Cell => int64[index] v1(00?) Value Value => 00? 00? 00? 00? case( 01 ValueMod int32[format] double[x] | 02 ValueMod int32[format] double[x] string[var-name] string[value-label] byte[show] | 03 string[local] ValueMod string[id] string[c] bool[fixed] | 04 ValueMod int32[format] string[value-label] string[var-name] byte[show] string[s] | 05 ValueMod string[var-name] string[var-label] byte[show] | 06 string[local] ValueMod string[id] string[c] | else ValueMod string[template] int32[n-args] Argument*[n-args] )[type] Argument => i0 Value[value] | int32[n-values] i0 Value*[n-values] ValueMod => 58 | 31 int32[n-refs] int16*[n-refs] int32[n-subscripts] string*[n-subscripts] v1(00 (i1 | i2) 00? 00? int32 00? 00?) v3(count(TemplateString StylePair)) TemplateString => count((count((i0 (58 | 31 55))?) (58 | 31 string[id]))?) StylePair => (31 FontStyle | 58) (31 CellStyle | 58) FontStyle => bool[bold] bool[italic] bool[underline] bool[show] string[fg-color] string[bg-color] string[typeface] byte[size] CellStyle => int32[halign] int32[valign] double[decimal-offset] int16[left-margin] int16[right-margin] int16[top-margin] int16[bottom-margin] pspp-1.4.1/src/output/spv/detail-xml.grammar0000644000175000017500000002043313624301134020461 0ustar00blpblp00000000000000# PSPP - a program for statistical analysis. # Copyright (C) 2017, 2018, 2019 Free Software Foundation, Inc. # # 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 3 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, see . visualization :creator :date :lang :name :style[style_ref]=ref style :type :version :schemaLocation? => visualization_extension? userSource (sourceVariable | derivedVariable)+ categoricalDomain? graph labelFrame[lf1]* container? labelFrame[lf2]* style+ layerController? extension[visualization_extension] :numRows=int? :showGridline=bool? :minWidthSet=(true)? :maxWidthSet=(true)? => EMPTY userSource :missing=(listwise | pairwise)? => EMPTY # Related to omit_empty? categoricalDomain => variableReference simpleSort simpleSort :method[sort_method]=(custom) => categoryOrder sourceVariable :id :categorical=(true) :source :domain=ref categoricalDomain? :sourceName :dependsOn=ref sourceVariable? :label? :labelVariable=ref sourceVariable? => variable_extension* (format | stringFormat)? derivedVariable :id :categorical=(true) :value :dependsOn=ref sourceVariable? => variable_extension* (format | stringFormat)? valueMapEntry* extension[variable_extension] :from :helpId => EMPTY valueMapEntry :from :to => EMPTY categoryOrder => TEXT graph :cellStyle=ref style :style=ref style => location+ coordinates faceting facetLayout interval location :part=(height | width | top | bottom | left | right) :method=(sizeToContent | attach | fixed | same) :min=dimension? :max=dimension? :target=ref (labelFrame | graph | container)? :value? => EMPTY coordinates => EMPTY faceting => layer[layers1]* cross layer[layers2]* cross => (unity | nest) (unity | nest) nest => variableReference[vars]+ unity => EMPTY variableReference :ref=ref (sourceVariable | derivedVariable) => EMPTY layer :variable=ref (sourceVariable | derivedVariable) :value :visible=bool? :method[layer_method]=(nest)? :titleVisible=bool? => EMPTY facetLayout => tableLayout setCellProperties[scp1]* facetLevel+ setCellProperties[scp2]* tableLayout :verticalTitlesInCorner=bool :style=ref style? :fitCells=(ticks both)? => EMPTY facetLevel :level=int :gap=dimension? => axis axis :style=ref style => label? majorTicks label :style=ref style :textFrameStyle=ref style? :purpose=(title | subTitle | subSubTitle | layer | footnote)? => text+ | descriptionGroup descriptionGroup :target=ref faceting :separator? => (description | text)+ description :name=(variable | value) => EMPTY majorTicks :labelAngle=int :length=dimension :style=ref style :tickFrameStyle=ref style :labelFrequency=int? :stagger=bool? => gridline? gridline :style=ref style :zOrder=int => EMPTY setCellProperties :applyToConverse=bool? => (setStyle | setFrameStyle | setFormat | setMetaData)* union[union_]? setStyle :target=ref (labeling | graph | interval | majorTicks) :style=ref style => EMPTY setMetaData :target=ref graph :key :value => EMPTY setFormat :target=ref (majorTicks | labeling) :reset=bool? => format | numberFormat | stringFormat+ | dateTimeFormat | elapsedTimeFormat setFrameStyle :style=ref style :target=ref majorTicks => EMPTY format :baseFormat[f_base_format]=(date | time | dateTime | elapsedTime)? :errorCharacter? :separatorChars? :mdyOrder=(dayMonthYear | monthDayYear | yearMonthDay)? :showYear=bool? :showQuarter=bool? :quarterPrefix? :quarterSuffix? :yearAbbreviation=bool? :showMonth=bool? :monthFormat=(long | short | number | paddedNumber)? :dayPadding=bool? :dayOfMonthPadding=bool? :showWeek=bool? :weekPadding=bool? :weekSuffix? :showDayOfWeek=bool? :dayOfWeekAbbreviation=bool? :hourPadding=bool? :minutePadding=bool? :secondPadding=bool? :showDay=bool? :showHour=bool? :showMinute=bool? :showSecond=bool? :showMillis=bool? :dayType=(month | year)? :hourFormat=(AMPM | AS_24 | AS_12)? :minimumIntegerDigits=int? :maximumFractionDigits=int? :minimumFractionDigits=int? :useGrouping=bool? :scientific=(onlyForSmall | whenNeeded | true | false)? :small=real? :prefix? :suffix? :tryStringsAsNumbers=bool? :negativesOutside=bool? => relabel* affix* numberFormat :minimumIntegerDigits=int? :maximumFractionDigits=int? :minimumFractionDigits=int? :useGrouping=bool? :scientific=(onlyForSmall | whenNeeded | true | false)? :small=real? :prefix? :suffix? => affix* stringFormat => relabel* affix* dateTimeFormat :baseFormat[dt_base_format]=(date | time | dateTime) :separatorChars? :mdyOrder=(dayMonthYear | monthDayYear | yearMonthDay)? :showYear=bool? :yearAbbreviation=bool? :showQuarter=bool? :quarterPrefix? :quarterSuffix? :showMonth=bool? :monthFormat=(long | short | number | paddedNumber)? :showWeek=bool? :weekPadding=bool? :weekSuffix? :showDayOfWeek=bool? :dayOfWeekAbbreviation=bool? :dayPadding=bool? :dayOfMonthPadding=bool? :hourPadding=bool? :minutePadding=bool? :secondPadding=bool? :showDay=bool? :showHour=bool? :showMinute=bool? :showSecond=bool? :showMillis=bool? :dayType=(month | year)? :hourFormat=(AMPM | AS_24 | AS_12)? => affix* elapsedTimeFormat :baseFormat[dt_base_format]=(date | time | dateTime) :dayPadding=bool? :hourPadding=bool? :minutePadding=bool? :secondPadding=bool? :showYear=bool? :showDay=bool? :showHour=bool? :showMinute=bool? :showSecond=bool? :showMillis=bool? => affix* affix :definesReference=int :position=(subscript | superscript) :suffix=bool :value => EMPTY relabel :from=real :to => EMPTY union => intersect+ intersect => where+ | intersectWhere | alternating | EMPTY where :variable=ref (sourceVariable | derivedVariable) :include => EMPTY intersectWhere :variable=ref (sourceVariable | derivedVariable) :variable2=ref (sourceVariable | derivedVariable) => EMPTY alternating => EMPTY text :usesReference=int? :definesReference=int? :position=(subscript | superscript)? :style=ref style => TEXT interval :style=ref style => labeling footnotes? labeling :style=ref style? :variable=ref (sourceVariable | derivedVariable) => (formatting | format | footnotes)* formatting :variable=ref (sourceVariable | derivedVariable) => formatMapping* formatMapping :from=int => format? footnotes :superscript=bool? :variable=ref (sourceVariable | derivedVariable) => footnoteMapping* footnoteMapping :definesReference=int :from=int :to => EMPTY style :color=color? :color2=color? :labelAngle=real? :border-bottom=(solid | thick | thin | double | none)? :border-top=(solid | thick | thin | double | none)? :border-left=(solid | thick | thin | double | none)? :border-right=(solid | thick | thin | double | none)? :border-bottom-color? :border-top-color? :border-left-color? :border-right-color? :font-family? :font-size? :font-weight=(regular | bold)? :font-style=(regular | italic)? :font-underline=(none | underline)? :margin-bottom=dimension? :margin-left=dimension? :margin-right=dimension? :margin-top=dimension? :textAlignment=(left | right | center | decimal | mixed)? :labelLocationHorizontal=(positive | negative | center)? :labelLocationVertical=(positive | negative | center)? :decimal-offset=dimension? :size? :width? :visible=bool? => EMPTY layerController :source=(tableData) :target=ref label? => EMPTY container :style=ref style => container_extension? location+ labelFrame* extension[container_extension] :combinedFootnotes=(true) => EMPTY labelFrame :style=ref style => location+ label? paragraph? paragraph :hangingIndent=dimension? => EMPTY pspp-1.4.1/src/output/spv/structure-xml.grammar0000644000175000017500000001045113624301134021256 0ustar00blpblp00000000000000# PSPP - a program for statistical analysis. # Copyright (C) 2017, 2018, 2019 Free Software Foundation, Inc. # # 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 3 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, see . heading[root_heading] :creator-version? :creator? :creation-date-time? :lockReader=bool? :schemaLocation? => label pageSetup? (container | heading)* heading :creator-version? :commandName? :visibility[heading_visibility]=(collapsed)? :locale? :olang? => label (container | heading)* label => TEXT container :visibility=(visible | hidden) :page-break-before=(always)? :text-align=(left | center)? :width=dimension => label (table | container_text | graph | model | object | image | tree) text[container_text] :type[text_type]=(title | log | text | page-title) :commandName? :creator-version? => html html :lang=(en) => TEXT table :VDPId? :ViZmlSource? :activePageId=int? :commandName :creator-version? :displayFiltering=bool? :maxNumCells=int? :orphanTolerance=int? :rowBreakNumber=int? :subType :tableId :tableLookId? :type[table_type]=(table | note | warning) => tableProperties? tableStructure tableProperties => generalProperties footnoteProperties cellFormatProperties borderProperties printingProperties generalProperties :hideEmptyRows=bool? :maximumColumnWidth=dimension? :maximumRowWidth=dimension? :minimumColumnWidth=dimension? :minimumRowWidth=dimension? :rowDimensionLabels=(inCorner | nested)? => EMPTY footnoteProperties :markerPosition=(superscript | subscript)? :numberFormat=(alphabetic | numeric)? => EMPTY cellFormatProperties => cell_style+ any[cell_style] :alternatingColor=color? :alternatingTextColor=color? => style style :color=color? :color2=color? :font-family? :font-size? :font-style=(regular | italic)? :font-weight=(regular | bold)? :labelLocationVertical=(positive | negative | center)? :margin-bottom=dimension? :margin-left=dimension? :margin-right=dimension? :margin-top=dimension? :textAlignment=(left | right | center | decimal | mixed)? :decimal-offset=dimension? => EMPTY borderProperties => border_style+ any[border_style] :borderStyleType=(none | solid | dashed | thick | thin | double)? :color=color? => EMPTY printingProperties :printAllLayers=bool? :rescaleLongTableToFitPage=bool? :rescaleWideTableToFitPage=bool? :windowOrphanLines=int? :continuationText? :continuationTextAtBottom=bool? :continuationTextAtTop=bool? :printEachLayerOnSeparatePage=bool? => EMPTY tableStructure => path? dataPath graph :VDPId? :ViZmlSource? :commandName? :creator-version? :dataMapId? :dataMapURI? :editor? :refMapId? :refMapURI? :csvFileIds? :csvFileNames? => dataPath? path csvPath? model :PMMLContainerId? :PMMLId :StatXMLContainerId :VDPId :auxiliaryViewName :commandName :creator-version :mainViewName => ViZml? dataPath? path | pmmlContainerPath statsContainerPath tree :commandName :creator-version :name :type => dataPath path pmmlContainerPath => TEXT statsContainerPath => TEXT ViZml :viewName? => TEXT dataPath => TEXT path => TEXT csvPath => TEXT pageSetup :initial-page-number=int? :chart-size=(as-is | full-height | half-height | quarter-height | OTHER)? :margin-left=dimension? :margin-right=dimension? :margin-top=dimension? :margin-bottom=dimension? :paper-height=dimension? :paper-width=dimension? :reference-orientation? :space-after=dimension? => pageHeader pageFooter pageHeader => pageParagraph? pageFooter => pageParagraph? pageParagraph => pageParagraph_text text[pageParagraph_text] :type=(title | text) => TEXT object :type :uri => EMPTY image :VDPId :commandName => dataPath pspp-1.4.1/src/output/spv/spvxml-helpers.c0000644000175000017500000006574713624301134020227 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2018 Free Software Foundation, Inc. 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 3 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, see . */ #include #include "output/spv/spvxml-helpers.h" #include #include #include #include "libpspp/cast.h" #include "libpspp/compiler.h" #include "libpspp/hash-functions.h" #include "libpspp/str.h" #include "gl/xvasprintf.h" char * WARN_UNUSED_RESULT spvxml_context_finish (struct spvxml_context *ctx, struct spvxml_node *root) { if (!ctx->error) root->class_->spvxml_node_collect_ids (ctx, root); if (!ctx->error) root->class_->spvxml_node_resolve_refs (ctx, root); hmap_destroy (&ctx->id_map); return ctx->error; } void spvxml_node_context_uninit (struct spvxml_node_context *nctx) { for (struct spvxml_attribute *a = nctx->attrs; a < &nctx->attrs[nctx->n_attrs]; a++) free (a->value); } static const char * xml_element_type_to_string (xmlElementType type) { switch (type) { case XML_ELEMENT_NODE: return "element"; case XML_ATTRIBUTE_NODE: return "attribute"; case XML_TEXT_NODE: return "text"; case XML_CDATA_SECTION_NODE: return "CDATA section"; case XML_ENTITY_REF_NODE: return "entity reference"; case XML_ENTITY_NODE: return "entity"; case XML_PI_NODE: return "PI"; case XML_COMMENT_NODE: return "comment"; case XML_DOCUMENT_NODE: return "document"; case XML_DOCUMENT_TYPE_NODE: return "document type"; case XML_DOCUMENT_FRAG_NODE: return "document fragment"; case XML_NOTATION_NODE: return "notation"; case XML_HTML_DOCUMENT_NODE: return "HTML document"; case XML_DTD_NODE: return "DTD"; case XML_ELEMENT_DECL: return "element declaration"; case XML_ATTRIBUTE_DECL: return "attribute declaration"; case XML_ENTITY_DECL: return "entity declaration"; case XML_NAMESPACE_DECL: return "namespace declaration"; case XML_XINCLUDE_START: return "XInclude start"; case XML_XINCLUDE_END: return "XInclude end"; case XML_DOCB_DOCUMENT_NODE: return "docb document"; default: return ""; } } static void spvxml_format_node_path (const xmlNode *node, struct string *s) { enum { MAX_STACK = 32 }; const xmlNode *stack[MAX_STACK]; size_t n = 0; while (node != NULL && node->type != XML_DOCUMENT_NODE && n < MAX_STACK) { stack[n++] = node; node = node->parent; } while (n > 0) { node = stack[--n]; ds_put_byte (s, '/'); if (node->name) ds_put_cstr (s, CHAR_CAST (char *, node->name)); if (node->type == XML_ELEMENT_NODE) { if (node->parent) { size_t total = 1; size_t index = 1; for (const xmlNode *sibling = node->parent->children; sibling; sibling = sibling->next) { if (sibling == node) index = total; else if (sibling->type == XML_ELEMENT_NODE && !strcmp (CHAR_CAST (char *, sibling->name), CHAR_CAST (char *, node->name))) total++; } if (total > 1) ds_put_format (s, "[%zu]", index); } } else ds_put_format (s, "(%s)", xml_element_type_to_string (node->type)); } } static struct spvxml_node * spvxml_node_find (struct spvxml_context *ctx, const char *name, unsigned int hash) { struct spvxml_node *node; HMAP_FOR_EACH_WITH_HASH (node, struct spvxml_node, id_node, hash, &ctx->id_map) if (!strcmp (node->id, name)) return node; return NULL; } void spvxml_node_collect_id (struct spvxml_context *ctx, struct spvxml_node *node) { if (!node->id) return; unsigned int hash = hash_string (node->id, 0); struct spvxml_node *other = spvxml_node_find (ctx, node->id, hash); if (other) { if (!ctx->error) { struct string node_path = DS_EMPTY_INITIALIZER; spvxml_format_node_path (node->raw, &node_path); struct string other_path = DS_EMPTY_INITIALIZER; spvxml_format_node_path (other->raw, &other_path); ctx->error = xasprintf ("Nodes %s and %s both have ID \"%s\".", ds_cstr (&node_path), ds_cstr (&other_path), node->id); ds_destroy (&node_path); ds_destroy (&other_path); } return; } hmap_insert (&ctx->id_map, &node->id_node, hash); } struct spvxml_node * spvxml_node_resolve_ref (struct spvxml_context *ctx, const xmlNode *src, const char *attr_name, const struct spvxml_node_class *const *classes, size_t n) { char *dst_id = CHAR_CAST ( char *, xmlGetProp (CONST_CAST (xmlNode *, src), CHAR_CAST (xmlChar *, attr_name))); if (!dst_id) return NULL; struct spvxml_node *dst = spvxml_node_find (ctx, dst_id, hash_string (dst_id, 0)); if (!dst) { struct string node_path = DS_EMPTY_INITIALIZER; spvxml_format_node_path (src, &node_path); ctx->error = xasprintf ( "%s: Attribute %s has unknown target ID \"%s\".", ds_cstr (&node_path), attr_name, dst_id); ds_destroy (&node_path); free (dst_id); return NULL; } if (!n) { free (dst_id); return dst; } for (size_t i = 0; i < n; i++) if (classes[i] == dst->class_) { free (dst_id); return dst; } if (!ctx->error) { struct string s = DS_EMPTY_INITIALIZER; spvxml_format_node_path (src, &s); ds_put_format (&s, ": Attribute \"%s\" should refer to a \"%s\"", attr_name, classes[0]->name); if (n == 2) ds_put_format (&s, " or \"%s\"", classes[1]->name); else if (n > 2) { for (size_t i = 1; i < n - 1; i++) ds_put_format (&s, ", \"%s\"", classes[i]->name); ds_put_format (&s, ", or \"%s\"", classes[n - 1]->name); } ds_put_format (&s, " element, but its target ID \"%s\" " "actually refers to a \"%s\" element.", dst_id, dst->class_->name); ctx->error = ds_steal_cstr (&s); } free (dst_id); return NULL; } void PRINTF_FORMAT (2, 3) spvxml_attr_error (struct spvxml_node_context *nctx, const char *format, ...) { if (nctx->up->error) return; struct string s = DS_EMPTY_INITIALIZER; ds_put_cstr (&s, "error parsing attributes of "); spvxml_format_node_path (nctx->parent, &s); va_list args; va_start (args, format); ds_put_cstr (&s, ": "); ds_put_vformat (&s, format, args); va_end (args); nctx->up->error = ds_steal_cstr (&s); } /* xmlGetPropNodeValueInternal() is from tree.c in libxml2 2.9.4+dfsg1, which is covered by the following copyright and license: Except where otherwise noted in the source code (e.g. the files hash.c, list.c and the trio files, which are covered by a similar licence but with different Copyright notices) all the files are: Copyright (C) 1998-2012 Daniel Veillard. All Rights Reserved. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is fur- nished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FIT- NESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ static xmlChar* xmlGetPropNodeValueInternal(const xmlAttr *prop) { if (prop == NULL) return(NULL); if (prop->type == XML_ATTRIBUTE_NODE) { /* * Note that we return at least the empty string. * TODO: Do we really always want that? */ if (prop->children != NULL) { if ((prop->children->next == NULL) && ((prop->children->type == XML_TEXT_NODE) || (prop->children->type == XML_CDATA_SECTION_NODE))) { /* * Optimization for the common case: only 1 text node. */ return(xmlStrdup(prop->children->content)); } else { xmlChar *ret; ret = xmlNodeListGetString(prop->doc, prop->children, 1); if (ret != NULL) return(ret); } } return(xmlStrdup((xmlChar *)"")); } else if (prop->type == XML_ATTRIBUTE_DECL) { return(xmlStrdup(((xmlAttributePtr)prop)->defaultValue)); } return(NULL); } static struct spvxml_attribute * find_attribute (struct spvxml_node_context *nctx, const char *name) { /* XXX This is linear search but we could use binary search. */ for (struct spvxml_attribute *a = nctx->attrs; a < &nctx->attrs[nctx->n_attrs]; a++) if (!strcmp (a->name, name)) return a; return NULL; } static void format_attribute (struct string *s, const xmlAttr *attr) { const char *name = CHAR_CAST (char *, attr->name); char *value = CHAR_CAST (char *, xmlGetPropNodeValueInternal (attr)); ds_put_format (s, "%s=\"%s\"", name, value); free (value); } void spvxml_parse_attributes (struct spvxml_node_context *nctx) { for (const xmlAttr *node = nctx->parent->properties; node; node = node->next) { const char *node_name = CHAR_CAST (char *, node->name); struct spvxml_attribute *a = find_attribute (nctx, node_name); if (!a) { if (!strcmp (node_name, "id")) continue; struct string unexpected = DS_EMPTY_INITIALIZER; format_attribute (&unexpected, node); int n = 1; for (node = node->next; node; node = node->next) { node_name = CHAR_CAST (char *, node->name); if (!find_attribute (nctx, node_name) && strcmp (node_name, "id")) { ds_put_byte (&unexpected, ' '); format_attribute (&unexpected, node); n++; } } spvxml_attr_error (nctx, "Node has unexpected attribute%s: %s", n > 1 ? "s" : "", ds_cstr (&unexpected)); ds_destroy (&unexpected); return; } if (a->value) { spvxml_attr_error (nctx, "Duplicate attribute \"%s\".", a->name); return; } a->value = CHAR_CAST (char *, xmlGetPropNodeValueInternal (node)); } for (struct spvxml_attribute *a = nctx->attrs; a < &nctx->attrs[nctx->n_attrs]; a++) { if (a->required && !a->value) spvxml_attr_error (nctx, "Missing required attribute \"%s\".", a->name); return; } } int spvxml_attr_parse_enum (struct spvxml_node_context *nctx, const struct spvxml_attribute *a, const struct spvxml_enum enums[]) { if (!a->value) return 0; for (const struct spvxml_enum *e = enums; e->name; e++) if (!strcmp (a->value, e->name)) return e->value; for (const struct spvxml_enum *e = enums; e->name; e++) if (!strcmp (e->name, "OTHER")) return e->value; spvxml_attr_error (nctx, "Attribute %s has unexpected value \"%s\".", a->name, a->value); return 0; } int spvxml_attr_parse_bool (struct spvxml_node_context *nctx, const struct spvxml_attribute *a) { static const struct spvxml_enum bool_enums[] = { { "true", 1 }, { "false", 0 }, { NULL, 0 }, }; return !a->value ? -1 : spvxml_attr_parse_enum (nctx, a, bool_enums); } bool spvxml_attr_parse_fixed (struct spvxml_node_context *nctx, const struct spvxml_attribute *a, const char *attr_value) { const struct spvxml_enum fixed_enums[] = { { attr_value, true }, { NULL, 0 }, }; return spvxml_attr_parse_enum (nctx, a, fixed_enums); } int spvxml_attr_parse_int (struct spvxml_node_context *nctx, const struct spvxml_attribute *a) { if (!a->value) return INT_MIN; char *tail = NULL; int save_errno = errno; errno = 0; long int integer = strtol (a->value, &tail, 10); if (errno || *tail || integer <= INT_MIN || integer > INT_MAX) { spvxml_attr_error (nctx, "Attribute %s has unexpected value " "\"%s\" expecting small integer.", a->name, a->value); integer = INT_MIN; } errno = save_errno; return integer; } static int lookup_color_name (const char *s) { struct color { struct hmap_node hmap_node; const char *name; int code; }; static struct color colors[] = { { .name = "aliceblue", .code = 0xf0f8ff }, { .name = "antiquewhite", .code = 0xfaebd7 }, { .name = "aqua", .code = 0x00ffff }, { .name = "aquamarine", .code = 0x7fffd4 }, { .name = "azure", .code = 0xf0ffff }, { .name = "beige", .code = 0xf5f5dc }, { .name = "bisque", .code = 0xffe4c4 }, { .name = "black", .code = 0x000000 }, { .name = "blanchedalmond", .code = 0xffebcd }, { .name = "blue", .code = 0x0000ff }, { .name = "blueviolet", .code = 0x8a2be2 }, { .name = "brown", .code = 0xa52a2a }, { .name = "burlywood", .code = 0xdeb887 }, { .name = "cadetblue", .code = 0x5f9ea0 }, { .name = "chartreuse", .code = 0x7fff00 }, { .name = "chocolate", .code = 0xd2691e }, { .name = "coral", .code = 0xff7f50 }, { .name = "cornflowerblue", .code = 0x6495ed }, { .name = "cornsilk", .code = 0xfff8dc }, { .name = "crimson", .code = 0xdc143c }, { .name = "cyan", .code = 0x00ffff }, { .name = "darkblue", .code = 0x00008b }, { .name = "darkcyan", .code = 0x008b8b }, { .name = "darkgoldenrod", .code = 0xb8860b }, { .name = "darkgray", .code = 0xa9a9a9 }, { .name = "darkgreen", .code = 0x006400 }, { .name = "darkgrey", .code = 0xa9a9a9 }, { .name = "darkkhaki", .code = 0xbdb76b }, { .name = "darkmagenta", .code = 0x8b008b }, { .name = "darkolivegreen", .code = 0x556b2f }, { .name = "darkorange", .code = 0xff8c00 }, { .name = "darkorchid", .code = 0x9932cc }, { .name = "darkred", .code = 0x8b0000 }, { .name = "darksalmon", .code = 0xe9967a }, { .name = "darkseagreen", .code = 0x8fbc8f }, { .name = "darkslateblue", .code = 0x483d8b }, { .name = "darkslategray", .code = 0x2f4f4f }, { .name = "darkslategrey", .code = 0x2f4f4f }, { .name = "darkturquoise", .code = 0x00ced1 }, { .name = "darkviolet", .code = 0x9400d3 }, { .name = "deeppink", .code = 0xff1493 }, { .name = "deepskyblue", .code = 0x00bfff }, { .name = "dimgray", .code = 0x696969 }, { .name = "dimgrey", .code = 0x696969 }, { .name = "dodgerblue", .code = 0x1e90ff }, { .name = "firebrick", .code = 0xb22222 }, { .name = "floralwhite", .code = 0xfffaf0 }, { .name = "forestgreen", .code = 0x228b22 }, { .name = "fuchsia", .code = 0xff00ff }, { .name = "gainsboro", .code = 0xdcdcdc }, { .name = "ghostwhite", .code = 0xf8f8ff }, { .name = "gold", .code = 0xffd700 }, { .name = "goldenrod", .code = 0xdaa520 }, { .name = "gray", .code = 0x808080 }, { .name = "green", .code = 0x008000 }, { .name = "greenyellow", .code = 0xadff2f }, { .name = "grey", .code = 0x808080 }, { .name = "honeydew", .code = 0xf0fff0 }, { .name = "hotpink", .code = 0xff69b4 }, { .name = "indianred", .code = 0xcd5c5c }, { .name = "indigo", .code = 0x4b0082 }, { .name = "ivory", .code = 0xfffff0 }, { .name = "khaki", .code = 0xf0e68c }, { .name = "lavender", .code = 0xe6e6fa }, { .name = "lavenderblush", .code = 0xfff0f5 }, { .name = "lawngreen", .code = 0x7cfc00 }, { .name = "lemonchiffon", .code = 0xfffacd }, { .name = "lightblue", .code = 0xadd8e6 }, { .name = "lightcoral", .code = 0xf08080 }, { .name = "lightcyan", .code = 0xe0ffff }, { .name = "lightgoldenrodyellow", .code = 0xfafad2 }, { .name = "lightgray", .code = 0xd3d3d3 }, { .name = "lightgreen", .code = 0x90ee90 }, { .name = "lightgrey", .code = 0xd3d3d3 }, { .name = "lightpink", .code = 0xffb6c1 }, { .name = "lightsalmon", .code = 0xffa07a }, { .name = "lightseagreen", .code = 0x20b2aa }, { .name = "lightskyblue", .code = 0x87cefa }, { .name = "lightslategray", .code = 0x778899 }, { .name = "lightslategrey", .code = 0x778899 }, { .name = "lightsteelblue", .code = 0xb0c4de }, { .name = "lightyellow", .code = 0xffffe0 }, { .name = "lime", .code = 0x00ff00 }, { .name = "limegreen", .code = 0x32cd32 }, { .name = "linen", .code = 0xfaf0e6 }, { .name = "magenta", .code = 0xff00ff }, { .name = "maroon", .code = 0x800000 }, { .name = "mediumaquamarine", .code = 0x66cdaa }, { .name = "mediumblue", .code = 0x0000cd }, { .name = "mediumorchid", .code = 0xba55d3 }, { .name = "mediumpurple", .code = 0x9370db }, { .name = "mediumseagreen", .code = 0x3cb371 }, { .name = "mediumslateblue", .code = 0x7b68ee }, { .name = "mediumspringgreen", .code = 0x00fa9a }, { .name = "mediumturquoise", .code = 0x48d1cc }, { .name = "mediumvioletred", .code = 0xc71585 }, { .name = "midnightblue", .code = 0x191970 }, { .name = "mintcream", .code = 0xf5fffa }, { .name = "mistyrose", .code = 0xffe4e1 }, { .name = "moccasin", .code = 0xffe4b5 }, { .name = "navajowhite", .code = 0xffdead }, { .name = "navy", .code = 0x000080 }, { .name = "oldlace", .code = 0xfdf5e6 }, { .name = "olive", .code = 0x808000 }, { .name = "olivedrab", .code = 0x6b8e23 }, { .name = "orange", .code = 0xffa500 }, { .name = "orangered", .code = 0xff4500 }, { .name = "orchid", .code = 0xda70d6 }, { .name = "palegoldenrod", .code = 0xeee8aa }, { .name = "palegreen", .code = 0x98fb98 }, { .name = "paleturquoise", .code = 0xafeeee }, { .name = "palevioletred", .code = 0xdb7093 }, { .name = "papayawhip", .code = 0xffefd5 }, { .name = "peachpuff", .code = 0xffdab9 }, { .name = "peru", .code = 0xcd853f }, { .name = "pink", .code = 0xffc0cb }, { .name = "plum", .code = 0xdda0dd }, { .name = "powderblue", .code = 0xb0e0e6 }, { .name = "purple", .code = 0x800080 }, { .name = "red", .code = 0xff0000 }, { .name = "rosybrown", .code = 0xbc8f8f }, { .name = "royalblue", .code = 0x4169e1 }, { .name = "saddlebrown", .code = 0x8b4513 }, { .name = "salmon", .code = 0xfa8072 }, { .name = "sandybrown", .code = 0xf4a460 }, { .name = "seagreen", .code = 0x2e8b57 }, { .name = "seashell", .code = 0xfff5ee }, { .name = "sienna", .code = 0xa0522d }, { .name = "silver", .code = 0xc0c0c0 }, { .name = "skyblue", .code = 0x87ceeb }, { .name = "slateblue", .code = 0x6a5acd }, { .name = "slategray", .code = 0x708090 }, { .name = "slategrey", .code = 0x708090 }, { .name = "snow", .code = 0xfffafa }, { .name = "springgreen", .code = 0x00ff7f }, { .name = "steelblue", .code = 0x4682b4 }, { .name = "tan", .code = 0xd2b48c }, { .name = "teal", .code = 0x008080 }, { .name = "thistle", .code = 0xd8bfd8 }, { .name = "tomato", .code = 0xff6347 }, { .name = "turquoise", .code = 0x40e0d0 }, { .name = "violet", .code = 0xee82ee }, { .name = "wheat", .code = 0xf5deb3 }, { .name = "white", .code = 0xffffff }, { .name = "whitesmoke", .code = 0xf5f5f5 }, { .name = "yellow", .code = 0xffff00 }, { .name = "yellowgreen", .code = 0x9acd32 }, }; static struct hmap color_table = HMAP_INITIALIZER (color_table); if (hmap_is_empty (&color_table)) for (size_t i = 0; i < sizeof colors / sizeof *colors; i++) hmap_insert (&color_table, &colors[i].hmap_node, hash_string (colors[i].name, 0)); const struct color *color; HMAP_FOR_EACH_WITH_HASH (color, struct color, hmap_node, hash_string (s, 0), &color_table) if (!strcmp (color->name, s)) return color->code; return -1; } int spvxml_attr_parse_color (struct spvxml_node_context *nctx, const struct spvxml_attribute *a) { if (!a->value || !strcmp (a->value, "transparent")) return -1; int r, g, b; if (sscanf (a->value, "#%2x%2x%2x", &r, &g, &b) == 3 || sscanf (a->value, "%2x%2x%2x", &r, &g, &b) == 3) return (r << 16) | (g << 8) | b; int code = lookup_color_name (a->value); if (code >= 0) return code; spvxml_attr_error (nctx, "Attribute %s has unexpected value " "\"%s\" expecting #rrggbb or rrggbb or web color name.", a->name, a->value); return 0; } static bool try_strtod (char *s, char **tail, double *real) { char *comma = strchr (s, ','); if (comma) *comma = '.'; int save_errno = errno; errno = 0; *tail = NULL; *real = strtod (s, tail); bool ok = errno == 0; errno = save_errno; if (!ok) *real = DBL_MAX; return ok; } double spvxml_attr_parse_real (struct spvxml_node_context *nctx, const struct spvxml_attribute *a) { if (!a->value) return DBL_MAX; char *tail; double real; if (!try_strtod (a->value, &tail, &real) || *tail) spvxml_attr_error (nctx, "Attribute %s has unexpected value " "\"%s\" expecting real number.", a->name, a->value); return real; } double spvxml_attr_parse_dimension (struct spvxml_node_context *nctx, const struct spvxml_attribute *a) { if (!a->value) return DBL_MAX; char *tail; double real; if (!try_strtod (a->value, &tail, &real)) goto error; tail += strspn (tail, " \t\r\n"); struct unit { const char *name; double divisor; }; static const struct unit units[] = { /* If you add anything to this table, update the table in doc/dev/spv-file-format.texi also. */ /* Inches. */ { "in", 1.0 }, { "인치", 1.0 }, { "pol.", 1.0 }, { "cala", 1.0 }, { "cali", 1.0 }, /* Device-independent pixels. */ { "px", 96.0 }, /* Points. */ { "pt", 72.0 }, { "пт", 72.0 }, { "", 72.0 }, /* Centimeters. */ { "cm", 2.54 }, { "см", 2.54 }, }; for (size_t i = 0; i < sizeof units / sizeof *units; i++) if (!strcmp (units[i].name, tail)) return real / units[i].divisor; goto error; error: spvxml_attr_error (nctx, "Attribute %s has unexpected value " "\"%s\" expecting dimension.", a->name, a->value); return DBL_MAX; } struct spvxml_node * spvxml_attr_parse_ref (struct spvxml_node_context *nctx UNUSED, const struct spvxml_attribute *a UNUSED) { return NULL; } void PRINTF_FORMAT (3, 4) spvxml_content_error (struct spvxml_node_context *nctx, const xmlNode *node, const char *format, ...) { if (nctx->up->error) return; struct string s = DS_EMPTY_INITIALIZER; ds_put_cstr (&s, "error parsing content of "); spvxml_format_node_path (nctx->parent, &s); if (node) { ds_put_format (&s, " at %s", xml_element_type_to_string (node->type)); if (node->name) ds_put_format (&s, " \"%s\"", node->name); } else ds_put_format (&s, " at end of content"); va_list args; va_start (args, format); ds_put_cstr (&s, ": "); ds_put_vformat (&s, format, args); va_end (args); //puts (ds_cstr (&s)); nctx->up->error = ds_steal_cstr (&s); } bool spvxml_content_parse_element (struct spvxml_node_context *nctx, xmlNode **nodep, const char *elem_name, xmlNode **outp) { xmlNode *node = *nodep; while (node) { if (node->type == XML_ELEMENT_NODE && (!strcmp (CHAR_CAST (char *, node->name), elem_name) || !strcmp (elem_name, "any"))) { *outp = node; *nodep = node->next; return true; } else if (node->type != XML_COMMENT_NODE) break; node = node->next; } spvxml_content_error (nctx, node, "\"%s\" element expected.", elem_name); *outp = NULL; return false; } bool spvxml_content_parse_text (struct spvxml_node_context *nctx UNUSED, xmlNode **nodep, char **textp) { struct string text = DS_EMPTY_INITIALIZER; xmlNode *node = *nodep; while (node) { if (node->type == XML_TEXT_NODE || node->type == XML_CDATA_SECTION_NODE) { char *segment = CHAR_CAST (char *, xmlNodeGetContent (node)); if (!text.ss.string) { text.ss = ss_cstr (segment); text.capacity = text.ss.length; } else { ds_put_cstr (&text, segment); free (segment); } } else if (node->type != XML_COMMENT_NODE) break; node = node->next; } *nodep = node; *textp = ds_steal_cstr (&text); return true; } bool spvxml_content_parse_end (struct spvxml_node_context *nctx, xmlNode *node) { for (;;) { if (!node) return true; else if (node->type != XML_COMMENT_NODE) break; node = node->next; } struct string s = DS_EMPTY_INITIALIZER; for (int i = 0; i < 4 && node; i++, node = node->next) { if (i) ds_put_cstr (&s, ", "); ds_put_cstr (&s, xml_element_type_to_string (node->type)); if (node->name) ds_put_format (&s, " \"%s\"", node->name); } if (node) ds_put_format (&s, ", ..."); spvxml_content_error (nctx, node, "Extra content found expecting end: %s", ds_cstr (&s)); ds_destroy (&s); return false; } pspp-1.4.1/src/output/spv/spvxml-helpers.h0000644000175000017500000001026513624301053020215 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2018 Free Software Foundation, Inc. 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 3 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, see . */ #ifndef SPVXML_HELPERS_H #define SPVXML_HELPERS_H 1 #include #include #include #include "libpspp/compiler.h" #include "libpspp/hmap.h" struct spvxml_node; struct spvxml_context { struct hmap id_map; char *error; bool hard_error; }; #define SPVXML_CONTEXT_INIT(CONTEXT) \ { HMAP_INITIALIZER ((CONTEXT).id_map), NULL, false } char *spvxml_context_finish (struct spvxml_context *, struct spvxml_node *root) WARN_UNUSED_RESULT; struct spvxml_node_context { struct spvxml_context *up; const xmlNode *parent; struct spvxml_attribute *attrs; size_t n_attrs; }; void spvxml_node_context_uninit (struct spvxml_node_context *); struct spvxml_node_class { const char *name; void (*spvxml_node_free) (struct spvxml_node *); void (*spvxml_node_collect_ids) (struct spvxml_context *, struct spvxml_node *); void (*spvxml_node_resolve_refs) (struct spvxml_context *, struct spvxml_node *); }; struct spvxml_node { struct hmap_node id_node; char *id; const struct spvxml_node_class *class_; const xmlNode *raw; }; void spvxml_node_collect_id (struct spvxml_context *, struct spvxml_node *); struct spvxml_node *spvxml_node_resolve_ref ( struct spvxml_context *, const xmlNode *, const char *attr_name, const struct spvxml_node_class *const *, size_t n); /* Attribute parsing. */ struct spvxml_attribute { const char *name; bool required; char *value; }; void spvxml_parse_attributes (struct spvxml_node_context *); void spvxml_attr_error (struct spvxml_node_context *, const char *format, ...) PRINTF_FORMAT (2, 3); struct spvxml_enum { const char *name; int value; }; int spvxml_attr_parse_enum (struct spvxml_node_context *, const struct spvxml_attribute *, const struct spvxml_enum[]); int spvxml_attr_parse_bool (struct spvxml_node_context *, const struct spvxml_attribute *); bool spvxml_attr_parse_fixed (struct spvxml_node_context *, const struct spvxml_attribute *, const char *attr_value); int spvxml_attr_parse_int (struct spvxml_node_context *, const struct spvxml_attribute *); int spvxml_attr_parse_color (struct spvxml_node_context *, const struct spvxml_attribute *); double spvxml_attr_parse_real (struct spvxml_node_context *, const struct spvxml_attribute *); double spvxml_attr_parse_dimension (struct spvxml_node_context *, const struct spvxml_attribute *); struct spvxml_node *spvxml_attr_parse_ref (struct spvxml_node_context *, const struct spvxml_attribute *); /* Content parsing. */ void spvxml_content_error (struct spvxml_node_context *, const xmlNode *, const char *format, ...) PRINTF_FORMAT (3, 4); bool spvxml_content_parse_element (struct spvxml_node_context *, xmlNode **, const char *elem_name, xmlNode **); bool spvxml_content_parse_text (struct spvxml_node_context *, xmlNode **, char **textp); void spvxml_content_parse_etc (xmlNode **); bool spvxml_content_parse_end (struct spvxml_node_context *, xmlNode *); #endif /* output/spv/spvxml-helpers.h */ pspp-1.4.1/src/output/spv/spv-css-parser.h0000644000175000017500000000165513602145300020114 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2018 Free Software Foundation, Inc. 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 3 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, see . */ #ifndef OUTPUT_SPV_CSS_PARSER_H #define OUTPUT_SPV_CSS_PARSER_H 1 struct font_style; char *spv_parse_css_style (char *style, struct font_style *font); #endif /* output/spv/spv-css-parser.h */ pspp-1.4.1/src/output/spv/spvbin-helpers.h0000644000175000017500000000664013602145300020164 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2018 Free Software Foundation, Inc. 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 3 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, see . */ #ifndef SPVBIN_HELPERS_H #define SPVBIN_HELPERS_H 1 #include #include #include struct spvbin_input { const uint8_t *data; size_t ofs; size_t size; int version; #define SPVBIN_MAX_ERRORS 16 struct { const char *name; size_t start; } errors[SPVBIN_MAX_ERRORS]; size_t n_errors; size_t error_ofs; }; void spvbin_input_init (struct spvbin_input *, const void *, size_t); bool spvbin_input_at_end (const struct spvbin_input *); char *spvbin_input_to_error (const struct spvbin_input *, const char *name); bool spvbin_match_bytes (struct spvbin_input *, const void *, size_t); bool spvbin_match_byte (struct spvbin_input *, uint8_t); bool spvbin_parse_bool (struct spvbin_input *, bool *); bool spvbin_parse_byte (struct spvbin_input *, uint8_t *); bool spvbin_parse_int16 (struct spvbin_input *, uint16_t *); bool spvbin_parse_int32 (struct spvbin_input *, uint32_t *); bool spvbin_parse_int64 (struct spvbin_input *, uint64_t *); bool spvbin_parse_be16 (struct spvbin_input *, uint16_t *); bool spvbin_parse_be32 (struct spvbin_input *, uint32_t *); bool spvbin_parse_be64 (struct spvbin_input *, uint64_t *); bool spvbin_parse_double (struct spvbin_input *, double *); bool spvbin_parse_float (struct spvbin_input *, double *); bool spvbin_parse_string (struct spvbin_input *, char **); bool spvbin_parse_bestring (struct spvbin_input *, char **); void spvbin_error (struct spvbin_input *, const char *name, size_t start); void spvbin_print_header (const char *title, size_t start, size_t len, int indent); void spvbin_print_presence (const char *title, int indent, bool); void spvbin_print_bool (const char *title, int indent, bool); void spvbin_print_byte (const char *title, int indent, uint8_t); void spvbin_print_int16 (const char *title, int indent, uint16_t); void spvbin_print_int32 (const char *title, int indent, uint32_t); void spvbin_print_int64 (const char *title, int indent, uint64_t); void spvbin_print_double (const char *title, int indent, double); void spvbin_print_string (const char *title, int indent, const char *); void spvbin_print_case (const char *title, int indent, int); struct spvbin_position { size_t ofs; }; struct spvbin_position spvbin_position_save (const struct spvbin_input *); void spvbin_position_restore (struct spvbin_position *, struct spvbin_input *); struct spvbin_limit { size_t size; }; bool spvbin_limit_parse (struct spvbin_limit *, struct spvbin_input *); bool spvbin_limit_parse_be (struct spvbin_limit *, struct spvbin_input *); void spvbin_limit_pop (struct spvbin_limit *, struct spvbin_input *); #endif /* output/spv/spvbin-helpers.h */ pspp-1.4.1/src/output/spv/spv-select.h0000644000175000017500000000471613602145300017312 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2019 Free Software Foundation, Inc. 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 3 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, see . */ #ifndef OUTPUT_SPV_SELECT_H #define OUTPUT_SPV_SELECT_H 1 #include "libpspp/string-array.h" struct spv_item; struct spv_reader; /* Matching criteria for commands, subtypes, and labels. Each of the members is an array of strings. A string that ends in '*' matches anything that begins with the rest of the string, otherwise a string requires an exact (case-insensitive) match. */ struct spv_criteria_match { struct string_array commands; struct string_array subtypes; struct string_array labels; }; struct spv_criteria { /* Include objects that are not visible? */ bool include_hidden; /* If false, include all objects. If true, include only objects that have an error on loading. */ bool error; /* Bit-mask of SPV_CLASS_* for the classes to include. */ unsigned int classes; /* Include all of the objects that match 'include' and do not match 'exclude', except that objects are included by default if 'include' is empty. */ struct spv_criteria_match include; struct spv_criteria_match exclude; /* Include XML and binary member names that match (except that everything is included by default if empty). */ struct string_array members; /* Include the objects with indexes listed in INSTANCES within each of the commands that are included. Indexes are 1-based. Index -1 means the last object within a command. */ int *instances; size_t n_instances; }; #define SPV_CRITERIA_INITIALIZER { .classes = SPV_ALL_CLASSES } void spv_select (const struct spv_reader *, const struct spv_criteria[], size_t n_criteria, struct spv_item ***items, size_t *n_items); #endif /* output/spv/spv-select.h */ pspp-1.4.1/src/output/spv/spv.h0000644000175000017500000001525413670210420016035 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2017 Free Software Foundation, Inc. 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 3 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, see . */ #ifndef OUTPUT_SPV_H #define OUTPUT_SPV_H 1 /* SPSS Viewer (SPV) file reader. An SPV file, represented as struct spv_reader, contains a number of top-level headings, each of which recursively contains other headings and tables. Here, we model a heading, text, table, or other element as an "item", and a an SPV file as a single root item that contains each of the top-level headings as a child item. */ #include #include #include #include "libpspp/compiler.h" struct fmt_spec; struct pivot_table; struct spv_data; struct spv_reader; struct spvlb_table; struct string; struct _xmlDoc; /* SPV files. */ char *spv_open (const char *filename, struct spv_reader **) WARN_UNUSED_RESULT; void spv_close (struct spv_reader *); char *spv_detect (const char *filename) WARN_UNUSED_RESULT; const char *spv_get_errors (const struct spv_reader *); void spv_clear_errors (struct spv_reader *); struct spv_item *spv_get_root (const struct spv_reader *); void spv_item_dump (const struct spv_item *, int indentation); const struct page_setup *spv_get_page_setup (const struct spv_reader *); /* Items. An spv_item represents of the elements that can occur in an SPV file. Items form a tree because "heading" items can have an arbitrary number of child items, which in turn may also be headings. The root item, that is, the item returned by spv_get_root(), is always a heading. */ enum spv_item_type { SPV_ITEM_HEADING, SPV_ITEM_TEXT, SPV_ITEM_TABLE, SPV_ITEM_GRAPH, SPV_ITEM_MODEL, SPV_ITEM_OBJECT, SPV_ITEM_TREE, }; const char *spv_item_type_to_string (enum spv_item_type); #define SPV_CLASSES \ SPV_CLASS(CHARTS, "charts") \ SPV_CLASS(HEADINGS, "headings") \ SPV_CLASS(LOGS, "logs") \ SPV_CLASS(MODELS, "models") \ SPV_CLASS(TABLES, "tables") \ SPV_CLASS(TEXTS, "texts") \ SPV_CLASS(TREES, "trees") \ SPV_CLASS(WARNINGS, "warnings") \ SPV_CLASS(OUTLINEHEADERS, "outlineheaders") \ SPV_CLASS(PAGETITLE, "pagetitle") \ SPV_CLASS(NOTES, "notes") \ SPV_CLASS(UNKNOWN, "unknown") \ SPV_CLASS(OTHER, "other") enum spv_item_class { #define SPV_CLASS(ENUM, NAME) SPV_CLASS_##ENUM, SPV_CLASSES #undef SPV_CLASS }; enum { #define SPV_CLASS(ENUM, NAME) +1 SPV_N_CLASSES = SPV_CLASSES #undef SPV_CLASS }; #define SPV_ALL_CLASSES ((1u << SPV_N_CLASSES) - 1) const char *spv_item_class_to_string (enum spv_item_class); enum spv_item_class spv_item_class_from_string (const char *); struct spv_item { struct spv_reader *spv; struct spv_item *parent; size_t parent_idx; /* item->parent->children[parent_idx] == item */ bool error; char *structure_member; enum spv_item_type type; char *label; char *command_id; /* Unique command identifier. */ /* Whether the item is visible. For SPV_ITEM_HEADING, false indicates that the item is collapsed. For SPV_ITEM_TABLE, false indicates that the item is not shown. */ bool visible; /* SPV_ITEM_HEADING only. */ struct spv_item **children; size_t n_children, allocated_children; /* SPV_ITEM_TABLE only. */ struct pivot_table *table; /* NULL if not yet loaded. */ struct spv_legacy_properties *legacy_properties; char *bin_member; char *xml_member; char *subtype; /* SPV_ITEM_TEXT only. */ struct pivot_value *text; /* SPV_ITEM_OBJECT only. */ char *object_type; char *uri; }; void spv_item_format_path (const struct spv_item *, struct string *); void spv_item_load (const struct spv_item *); enum spv_item_type spv_item_get_type (const struct spv_item *); enum spv_item_class spv_item_get_class (const struct spv_item *); const char *spv_item_get_label (const struct spv_item *); bool spv_item_is_heading (const struct spv_item *); size_t spv_item_get_n_children (const struct spv_item *); struct spv_item *spv_item_get_child (const struct spv_item *, size_t idx); bool spv_item_is_table (const struct spv_item *); struct pivot_table *spv_item_get_table (const struct spv_item *); bool spv_item_is_text (const struct spv_item *); const struct pivot_value *spv_item_get_text (const struct spv_item *); bool spv_item_is_visible (const struct spv_item *); #define SPV_ITEM_FOR_EACH(ITER, ROOT) \ for ((ITER) = (ROOT); (ITER) != NULL; (ITER) = spv_item_next(ITER)) #define SPV_ITEM_FOR_EACH_SKIP_ROOT(ITER, ROOT) \ for ((ITER) = (ROOT); ((ITER) = spv_item_next(ITER)) != NULL;) struct spv_item *spv_item_next (const struct spv_item *); const struct spv_item *spv_item_get_parent (const struct spv_item *); size_t spv_item_get_level (const struct spv_item *); const char *spv_item_get_member_name (const struct spv_item *); const char *spv_item_get_command_id (const struct spv_item *); const char *spv_item_get_subtype (const struct spv_item *); char *spv_item_get_structure (const struct spv_item *, struct _xmlDoc **) WARN_UNUSED_RESULT; bool spv_item_is_light_table (const struct spv_item *); char *spv_item_get_light_table (const struct spv_item *, struct spvlb_table **) WARN_UNUSED_RESULT; char *spv_item_get_raw_light_table (const struct spv_item *, void **data, size_t *size) WARN_UNUSED_RESULT; bool spv_item_is_legacy_table (const struct spv_item *); char *spv_item_get_raw_legacy_data (const struct spv_item *item, void **data, size_t *size) WARN_UNUSED_RESULT; char *spv_item_get_legacy_data (const struct spv_item *, struct spv_data *) WARN_UNUSED_RESULT; char *spv_item_get_legacy_table (const struct spv_item *, struct _xmlDoc **) WARN_UNUSED_RESULT; char *spv_decode_fmt_spec (uint32_t u32, struct fmt_spec *) WARN_UNUSED_RESULT; #endif /* output/spv/spv.h */ pspp-1.4.1/src/output/spv/spv-output.h0000644000175000017500000000170713602145300017370 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2018 Free Software Foundation, Inc. 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 3 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, see . */ #ifndef OUTPUT_SPV_OUTPUT_H #define OUTPUT_SPV_OUTPUT_H 1 /* Interface between SPVs and the PSPP output engine. */ struct spv_item; void spv_text_submit (const struct spv_item *); #endif /* output/spv/spv-output.h */ pspp-1.4.1/src/output/spv/old-binary.grammar0000644000175000017500000000271413624301134020463 0ustar00blpblp00000000000000# PSPP - a program for statistical analysis. # Copyright (C) 2017, 2018, 2019 Free Software Foundation, Inc. # # 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 3 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, see . LegacyBinary => 00 byte[version] int16[n-sources] int32[member-size] Metadata*[n-sources][metadata] #Data*[n-sources][data] #Strings? Metadata => int32[n-values] int32[n-variables] int32[data-offset] byte*28[source-name] vB0(byte*36[ext-source-name] int32[x]) #Data => Variable*[n-variables] #Variable => byte*288[variable-name] double*[n-values] Strings => SourceMaps[maps] Labels SourceMaps => int32[n-maps] SourceMap*[n-maps] SourceMap => string[source-name] int32[n-variables] VariableMap*[n-variables] VariableMap => string[variable-name] int32[n-data] DatumMap*[n-data] DatumMap => int32[value-idx] int32[label-idx] Labels => int32[n-labels] Label*[n-labels] Label => int32[frequency] string[label] pspp-1.4.1/src/output/spv/spv-css-parser.c0000644000175000017500000000731413602145300020105 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2018 Free Software Foundation, Inc. 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 3 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, see . */ #include #include "spv-css-parser.h" #include #include #include "libpspp/str.h" #include "output/pivot-table.h" #include "spv.h" #include "gl/c-ctype.h" #include "gl/xalloc.h" #include "gl/xmemdup0.h" enum css_token_type { T_EOF, T_ID, T_LCURLY, T_RCURLY, T_COLON, T_SEMICOLON, T_ERROR }; struct css_token { enum css_token_type type; char *s; }; static char * css_skip_spaces (char *p) { for (;;) { if (c_isspace (*p)) p++; else if (!strncmp (p, "", 3)) p += 3; else return p; } } static bool css_is_separator (unsigned char c) { return c_isspace (c) || strchr ("{}:;", c); } static void css_token_get (char **p_, struct css_token *token) { char *p = *p_; free (token->s); token->s = NULL; p = css_skip_spaces (p); if (*p == '\0') token->type = T_EOF; else if (*p == '{') { token->type = T_LCURLY; p++; } else if (*p == '}') { token->type = T_RCURLY; p++; } else if (*p == ':') { token->type = T_COLON; p++; } else if (*p == ';') { token->type = T_SEMICOLON; p++; } else { token->type = T_ID; char *start = p; while (!css_is_separator (*p)) p++; token->s = xmemdup0 (start, p - start); } *p_ = p; } static void css_decode_key_value (const char *key, const char *value, struct font_style *font) { if (!strcmp (key, "font-weight")) font->bold = !strcmp (value, "bold"); else if (!strcmp (key, "font-style")) font->italic = !strcmp (value, "italic"); else if (!strcmp (key, "font-decoration")) font->underline = !strcmp (value, "underline"); else if (!strcmp (key, "font-family")) { free (font->typeface); font->typeface = xstrdup (value); } else if (!strcmp (key, "font-size")) font->size = atoi (value); /* fg_color, bg_color */ } char * spv_parse_css_style (char *style, struct font_style *font) { *font = (struct font_style) FONT_STYLE_INITIALIZER; char *p = style; struct css_token token = { .s = NULL }; css_token_get (&p, &token); while (token.type != T_EOF) { if (token.type != T_ID || !strcmp (token.s, "p")) { css_token_get (&p, &token); continue; } char *key = token.s; token.s = NULL; css_token_get (&p, &token); if (token.type == T_COLON) { struct string value = DS_EMPTY_INITIALIZER; for (;;) { css_token_get (&p, &token); if (token.type != T_ID) break; if (!ds_is_empty (&value)) ds_put_byte (&value, ' '); ds_put_cstr (&value, token.s); } css_decode_key_value (key, ds_cstr (&value), font); ds_destroy (&value); } free (key); } return NULL; } pspp-1.4.1/src/output/spv/spv-legacy-data.c0000644000175000017500000002727313700645725020223 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2018 Free Software Foundation, Inc. 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 3 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, see . */ #include #include "output/spv/spv-legacy-data.h" #include #include #include #include #include "libpspp/cast.h" #include "libpspp/float-format.h" #include "data/val-type.h" #include "output/spv/old-binary-parser.h" #include "gl/minmax.h" #include "gl/xalloc.h" #include "gl/xmemdup0.h" #include "gl/xsize.h" #include "gl/xvasprintf.h" void spv_data_uninit (struct spv_data *data) { if (!data) return; for (size_t i = 0; i < data->n_sources; i++) spv_data_source_uninit (&data->sources[i]); free (data->sources); } void spv_data_dump (const struct spv_data *data, FILE *stream) { for (size_t i = 0; i < data->n_sources; i++) { if (i > 0) putc ('\n', stream); spv_data_source_dump (&data->sources[i], stream); } } struct spv_data_source * spv_data_find_source (const struct spv_data *data, const char *source_name) { for (size_t i = 0; i < data->n_sources; i++) if (!strcmp (data->sources[i].source_name, source_name)) return &data->sources[i]; return NULL; } struct spv_data_variable * spv_data_find_variable (const struct spv_data *data, const char *source_name, const char *variable_name) { struct spv_data_source *source = spv_data_find_source (data, source_name); return source ? spv_data_source_find_variable (source, variable_name) : NULL; } void spv_data_source_uninit (struct spv_data_source *source) { if (!source) return; for (size_t i = 0; i < source->n_vars; i++) spv_data_variable_uninit (&source->vars[i]); free (source->vars); free (source->source_name); } void spv_data_source_dump (const struct spv_data_source *source, FILE *stream) { fprintf (stream, "source \"%s\" (%zu values):\n", source->source_name, source->n_values); for (size_t i = 0; i < source->n_vars; i++) spv_data_variable_dump (&source->vars[i], stream); } struct spv_data_variable * spv_data_source_find_variable (const struct spv_data_source *source, const char *variable_name) { for (size_t i = 0; i < source->n_vars; i++) if (!strcmp (source->vars[i].var_name, variable_name)) return &source->vars[i]; return NULL; } void spv_data_variable_uninit (struct spv_data_variable *var) { if (!var) return; free (var->var_name); for (size_t i = 0; i < var->n_values; i++) spv_data_value_uninit (&var->values[i]); free (var->values); } void spv_data_variable_dump (const struct spv_data_variable *var, FILE *stream) { fprintf (stream, "variable \"%s\":", var->var_name); for (size_t i = 0; i < var->n_values; i++) { if (i) putc (',', stream); putc (' ', stream); spv_data_value_dump (&var->values[i], stream); } putc ('\n', stream); } void spv_data_value_uninit (struct spv_data_value *value) { if (value && value->width >= 0) free (value->s); } bool spv_data_value_equal (const struct spv_data_value *a, const struct spv_data_value *b) { return (a->width == b->width && a->index == b->index && (a->width < 0 ? a->d == b->d : !strcmp (a->s, b->s))); } struct spv_data_value * spv_data_values_clone (const struct spv_data_value *src, size_t n) { struct spv_data_value *dst = xmemdup (src, n * sizeof *src); for (size_t i = 0; i < n; i++) if (dst[i].width >= 0) dst[i].s = xstrdup (dst[i].s); return dst; } void spv_data_value_dump (const struct spv_data_value *value, FILE *stream) { if (value->index != SYSMIS) fprintf (stream, "%.*ge-", DBL_DIG + 1, value->index); if (value->width >= 0) fprintf (stream, "\"%s\"", value->s); else if (value->d == SYSMIS) putc ('.', stream); else fprintf (stream, "%.*g", DBL_DIG + 1, value->d); } static char * decode_fixed_string (const uint8_t *buf_, size_t size) { const char *buf = CHAR_CAST (char *, buf_); return xmemdup0 (buf, strnlen (buf, size)); } static char * decode_var_name (const struct spvob_metadata *md) { int n0 = strnlen ((char *) md->source_name, sizeof md->source_name); int n1 = (n0 < sizeof md->source_name ? 0 : strnlen ((char *) md->ext_source_name, sizeof md->ext_source_name)); return xasprintf ("%.*s%.*s", n0, (char *) md->source_name, n1, (char *) md->ext_source_name); } static char * WARN_UNUSED_RESULT decode_data (const uint8_t *in, size_t size, size_t data_offset, struct spv_data_source *source, size_t *end_offsetp) { size_t var_size = xsum (288, xtimes (source->n_values, 8)); size_t source_size = xtimes (source->n_vars, var_size); size_t end_offset = xsum (data_offset, source_size); if (size_overflow_p (end_offset)) return xasprintf ("Data source \"%s\" exceeds supported %zu-byte size.", source->source_name, SIZE_MAX - 1); if (end_offset > size) return xasprintf ("%zu-byte data source \"%s\" starting at offset %#zx " "runs past end of %zu-byte ZIP member.", source_size, source->source_name, data_offset, size); in += data_offset; for (size_t i = 0; i < source->n_vars; i++) { struct spv_data_variable *var = &source->vars[i]; var->var_name = decode_fixed_string (in, 288); in += 288; var->values = xnmalloc (source->n_values, sizeof *var->values); var->n_values = source->n_values; for (size_t j = 0; j < source->n_values; j++) { var->values[j].index = SYSMIS; var->values[j].width = -1; var->values[j].d = float_get_double (FLOAT_IEEE_DOUBLE_LE, in); in += 8; } } *end_offsetp = end_offset; return NULL; } static char * WARN_UNUSED_RESULT decode_variable_map (const char *source_name, const struct spvob_variable_map *in, const struct spvob_labels *labels, struct spv_data_variable *out) { if (strcmp (in->variable_name, out->var_name)) return xasprintf ("Source \"%s\" variable \"%s\" mapping is associated " "with wrong variable \"%s\".", source_name, out->var_name, in->variable_name); for (size_t i = 0; i < in->n_data; i++) { const struct spvob_datum_map *map = in->data[i]; if (map->value_idx >= out->n_values) return xasprintf ("Source \"%s\" variable \"%s\" mapping %zu " "attempts to set 0-based value %"PRIu32" " "but source has only %zu values.", source_name, out->var_name, i, map->value_idx, out->n_values); struct spv_data_value *value = &out->values[map->value_idx]; if (map->label_idx >= labels->n_labels) return xasprintf ("Source \"%s\" variable \"%s\" mapping %zu " "attempts to set value %"PRIu32" to 0-based label " "%"PRIu32" but only %"PRIu32" labels are present.", source_name, out->var_name, i, map->value_idx, map->label_idx, labels->n_labels); const struct spvob_label *label = labels->labels[map->label_idx]; if (value->width >= 0) return xasprintf ("Source \"%s\" variable \"%s\" mapping %zu " "attempts to change string value %"PRIu32".", source_name, out->var_name, i, map->value_idx); #if 0 else if (value->d != SYSMIS && !isnan (value->d)) { #if 1 return NULL; #else return xasprintf ("Source \"%s\" variable \"%s\" mapping %zu " "attempts to change non-missing value %"PRIu32" " "into \"%s\".", source_name, out->var_name, i, map->value_idx, label->label); #endif } #endif value->width = strlen (label->label); value->s = xmemdup0 (label->label, value->width); } return NULL; } static char * WARN_UNUSED_RESULT decode_source_map (const struct spvob_source_map *in, const struct spvob_labels *labels, struct spv_data_source *out) { if (in->n_variables > out->n_vars) return xasprintf ("source map for \"%s\" has %"PRIu32" variables but " "source has only %zu", out->source_name, in->n_variables, out->n_vars); for (size_t i = 0; i < in->n_variables; i++) { char *error = decode_variable_map (out->source_name, in->variables[i], labels, &out->vars[i]); if (error) return error; } return NULL; } static char * WARN_UNUSED_RESULT decode_strings (const struct spvob_strings *in, struct spv_data *out) { for (size_t i = 0; i < in->maps->n_maps; i++) { const struct spvob_source_map *sm = in->maps->maps[i]; const char *name = sm->source_name; struct spv_data_source *source = spv_data_find_source (out, name); if (!source) return xasprintf ("cannot decode source map for unknown source \"%s\"", name); char *error = decode_source_map (sm, in->labels, source); if (error) return error; } return NULL; } char * WARN_UNUSED_RESULT spv_legacy_data_decode (const uint8_t *in, size_t size, struct spv_data *out) { char *error = NULL; memset (out, 0, sizeof *out); struct spvbin_input input; spvbin_input_init (&input, in, size); struct spvob_legacy_binary *lb; bool ok = spvob_parse_legacy_binary (&input, &lb); if (!ok) { error = spvbin_input_to_error (&input, NULL); goto error; } out->sources = XCALLOC (lb->n_sources, struct spv_data_source); out->n_sources = lb->n_sources; for (size_t i = 0; i < lb->n_sources; i++) { const struct spvob_metadata *md = lb->metadata[i]; struct spv_data_source *source = &out->sources[i]; source->source_name = decode_var_name (md); source->n_vars = md->n_variables; source->n_values = md->n_values; source->vars = xcalloc (md->n_variables, sizeof *source->vars); size_t end; error = decode_data (in, size, md->data_offset, source, &end); if (error) goto error; input.ofs = MAX (input.ofs, end); } if (input.ofs < input.size) { struct spvob_strings *strings; bool ok = spvob_parse_strings (&input, &strings); if (!ok) error = spvbin_input_to_error (&input, NULL); else { if (input.ofs != input.size) error = xasprintf ("expected end of file at offset #%zx", input.ofs); else error = decode_strings (strings, out); spvob_free_strings (strings); } if (error) goto error; } spvob_free_legacy_binary (lb); return NULL; error: spv_data_uninit (out); memset (out, 0, sizeof *out); spvob_free_legacy_binary (lb); return error; } pspp-1.4.1/src/output/spv/spv-legacy-decoder.c0000644000175000017500000022222713700645725020713 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2017, 2018 Free Software Foundation, Inc. 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 3 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, see . */ #include #include "output/spv/spv-legacy-decoder.h" #include #include #include #include #include #include "data/data-out.h" #include "data/calendar.h" #include "data/format.h" #include "data/value.h" #include "libpspp/assertion.h" #include "libpspp/hash-functions.h" #include "libpspp/hmap.h" #include "libpspp/message.h" #include "output/pivot-table.h" #include "output/spv/detail-xml-parser.h" #include "output/spv/spv-legacy-data.h" #include "output/spv/spv.h" #include "output/spv/structure-xml-parser.h" #include "gl/c-strtod.h" #include "gl/xalloc.h" #include "gl/xmemdup0.h" #include #include "gettext.h" #define N_(msgid) msgid #define _(msgid) gettext (msgid) struct spv_legacy_properties { /* General properties. */ bool omit_empty; int width_ranges[TABLE_N_AXES][2]; /* In 1/96" units. */ bool row_labels_in_corner; /* Footnote display settings. */ bool show_numeric_markers; bool footnote_marker_superscripts; /* Styles. */ struct area_style areas[PIVOT_N_AREAS]; struct table_border_style borders[PIVOT_N_BORDERS]; /* Print settings. */ bool print_all_layers; bool paginate_layers; bool shrink_to_width; bool shrink_to_length; bool top_continuation, bottom_continuation; char *continuation; size_t n_orphan_lines; }; struct spv_series { struct hmap_node hmap_node; /* By name. */ char *name; char *label; struct fmt_spec format; struct spv_series *label_series; bool is_label_series; const struct spvxml_node *xml; struct spv_data_value *values; size_t n_values; struct hmap map; /* Contains "struct spv_mapping". */ bool remapped; struct pivot_dimension *dimension; struct pivot_category **index_to_category; size_t n_index; struct spvdx_affix **affixes; size_t n_affixes; }; static void spv_map_destroy (struct hmap *); static struct spv_series * spv_series_first (struct hmap *series_map) { struct spv_series *series; HMAP_FOR_EACH (series, struct spv_series, hmap_node, series_map) return series; return NULL; } static struct spv_series * spv_series_find (const struct hmap *series_map, const char *name) { struct spv_series *series; HMAP_FOR_EACH_WITH_HASH (series, struct spv_series, hmap_node, hash_string (name, 0), series_map) if (!strcmp (name, series->name)) return series; return NULL; } static struct spv_series * spv_series_from_ref (const struct hmap *series_map, const struct spvxml_node *ref) { const struct spvxml_node *node = (spvdx_is_source_variable (ref) ? &spvdx_cast_source_variable (ref)->node_ : &spvdx_cast_derived_variable (ref)->node_); return spv_series_find (series_map, node->id); } static void UNUSED spv_series_dump (const struct spv_series *series) { printf ("series \"%s\"", series->name); if (series->label) printf (" (label \"%s\")", series->label); printf (", %zu values:", series->n_values); for (size_t i = 0; i < series->n_values; i++) { putchar (' '); spv_data_value_dump (&series->values[i], stdout); } putchar ('\n'); } static void spv_series_destroy (struct hmap *series_map) { struct spv_series *series, *next_series; HMAP_FOR_EACH_SAFE (series, next_series, struct spv_series, hmap_node, series_map) { free (series->name); free (series->label); for (size_t i = 0; i < series->n_values; i++) spv_data_value_uninit (&series->values[i]); free (series->values); spv_map_destroy (&series->map); free (series->index_to_category); hmap_delete (series_map, &series->hmap_node); free (series); } hmap_destroy (series_map); } struct spv_mapping { struct hmap_node hmap_node; double from; struct spv_data_value to; }; static struct spv_mapping * spv_map_search (const struct hmap *map, double from) { struct spv_mapping *mapping; HMAP_FOR_EACH_WITH_HASH (mapping, struct spv_mapping, hmap_node, hash_double (from, 0), map) if (mapping->from == from) return mapping; return NULL; } static const struct spv_data_value * spv_map_lookup (const struct hmap *map, const struct spv_data_value *in) { if (in->width >= 0) return in; const struct spv_mapping *m = spv_map_search (map, in->d); return m ? &m->to : in; } static bool parse_real (const char *s, double *real) { int save_errno = errno; errno = 0; char *end; *real = c_strtod (s, &end); bool ok = !errno && end > s && !*end; errno = save_errno; return ok; } static char * WARN_UNUSED_RESULT spv_map_insert (struct hmap *map, double from, const char *to, bool try_strings_as_numbers, const struct fmt_spec *format) { struct spv_mapping *mapping = xmalloc (sizeof *mapping); mapping->from = from; if ((try_strings_as_numbers || (format && fmt_is_numeric (format->type))) && parse_real (to, &mapping->to.d)) { if (try_strings_as_numbers) mapping->to.width = -1; else { union value v = { .f = mapping->to.d }; mapping->to.s = data_out_stretchy (&v, NULL, format, NULL); mapping->to.width = strlen (mapping->to.s); } } else { mapping->to.width = strlen (to); mapping->to.s = xstrdup (to); } struct spv_mapping *old_mapping = spv_map_search (map, from); if (old_mapping) { bool same = spv_data_value_equal (&old_mapping->to, &mapping->to); spv_data_value_uninit (&mapping->to); free (mapping); return (same ? NULL : xasprintf ("Duplicate relabeling differs for from=\"%.*g\"", DBL_DIG + 1, from)); } hmap_insert (map, &mapping->hmap_node, hash_double (from, 0)); return NULL; } static void spv_map_destroy (struct hmap *map) { struct spv_mapping *mapping, *next; HMAP_FOR_EACH_SAFE (mapping, next, struct spv_mapping, hmap_node, map) { spv_data_value_uninit (&mapping->to); hmap_delete (map, &mapping->hmap_node); free (mapping); } hmap_destroy (map); } static char * WARN_UNUSED_RESULT spv_series_parse_relabels (struct hmap *map, struct spvdx_relabel **relabels, size_t n_relabels, bool try_strings_as_numbers, const struct fmt_spec *format) { for (size_t i = 0; i < n_relabels; i++) { const struct spvdx_relabel *relabel = relabels[i]; char *error = spv_map_insert (map, relabel->from, relabel->to, try_strings_as_numbers, format); if (error) return error; } return NULL; } static char * WARN_UNUSED_RESULT spv_series_parse_value_map_entry (struct hmap *map, const struct spvdx_value_map_entry *vme) { for (const char *p = vme->from; ; p++) { int save_errno = errno; errno = 0; char *end; double from = c_strtod (p, &end); bool ok = !errno && end > p && strchr (";", *end); errno = save_errno; if (!ok) return xasprintf ("Syntax error in valueMapEntry from=\"%s\".", vme->from); char *error = spv_map_insert (map, from, vme->to, true, &(struct fmt_spec) { FMT_A, 40, 0 }); if (error) return error; p = end; if (*p == '\0') return NULL; assert (*p == ';'); } } static struct fmt_spec decode_date_time_format (const struct spvdx_date_time_format *dtf) { if (dtf->dt_base_format == SPVDX_DT_BASE_FORMAT_DATE) { enum fmt_type type = (dtf->show_quarter > 0 ? FMT_QYR : dtf->show_week > 0 ? FMT_WKYR : dtf->mdy_order == SPVDX_MDY_ORDER_DAY_MONTH_YEAR ? (dtf->month_format == SPVDX_MONTH_FORMAT_NUMBER || dtf->month_format == SPVDX_MONTH_FORMAT_PADDED_NUMBER ? FMT_EDATE : FMT_DATE) : dtf->mdy_order == SPVDX_MDY_ORDER_YEAR_MONTH_DAY ? FMT_SDATE : FMT_ADATE); int w = fmt_min_output_width (type); if (dtf->year_abbreviation <= 0) w += 2; return (struct fmt_spec) { .type = type, .w = w }; } else { enum fmt_type type = (dtf->dt_base_format == SPVDX_DT_BASE_FORMAT_DATE_TIME ? (dtf->mdy_order == SPVDX_MDY_ORDER_YEAR_MONTH_DAY ? FMT_YMDHMS : FMT_DATETIME) : (dtf->show_day > 0 ? FMT_DTIME : dtf->show_hour > 0 ? FMT_TIME : FMT_MTIME)); int w = fmt_min_output_width (type); int d = 0; if (dtf->show_second > 0) { w += 3; if (dtf->show_millis > 0) { d = 3; w += d + 1; } } return (struct fmt_spec) { .type = type, .w = w, .d = d }; } } static struct fmt_spec decode_elapsed_time_format (const struct spvdx_elapsed_time_format *etf) { enum fmt_type type = (etf->dt_base_format != SPVDX_DT_BASE_FORMAT_TIME ? FMT_DTIME : etf->show_hour > 0 ? FMT_TIME : FMT_MTIME); int w = fmt_min_output_width (type); int d = 0; if (etf->show_second > 0) { w += 3; if (etf->show_millis > 0) { d = 3; w += d + 1; } } return (struct fmt_spec) { .type = type, .w = w, .d = d }; } static struct fmt_spec decode_number_format (const struct spvdx_number_format *nf) { enum fmt_type type = (nf->scientific == SPVDX_SCIENTIFIC_TRUE ? FMT_E : nf->prefix && !strcmp (nf->prefix, "$") ? FMT_DOLLAR : nf->suffix && !strcmp (nf->suffix, "%") ? FMT_PCT : nf->use_grouping ? FMT_COMMA : FMT_F); int d = nf->maximum_fraction_digits; if (d < 0 || d > 15) d = 2; struct fmt_spec f = (struct fmt_spec) { type, 40, d }; fmt_fix_output (&f); return f; } /* Returns an *approximation* of IN as a fmt_spec. Not for use with string formats, which don't have any options anyway. */ static struct fmt_spec decode_format (const struct spvdx_format *in) { if (in->f_base_format == SPVDX_F_BASE_FORMAT_DATE || in->f_base_format == SPVDX_F_BASE_FORMAT_TIME || in->f_base_format == SPVDX_F_BASE_FORMAT_DATE_TIME) { struct spvdx_date_time_format dtf = { .dt_base_format = (in->f_base_format == SPVDX_F_BASE_FORMAT_DATE ? SPVDX_DT_BASE_FORMAT_DATE : in->f_base_format == SPVDX_F_BASE_FORMAT_TIME ? SPVDX_DT_BASE_FORMAT_TIME : SPVDX_DT_BASE_FORMAT_DATE_TIME), .separator_chars = in->separator_chars, .mdy_order = in->mdy_order, .show_year = in->show_year, .year_abbreviation = in->year_abbreviation, .show_quarter = in->show_quarter, .quarter_prefix = in->quarter_prefix, .quarter_suffix = in->quarter_suffix, .show_month = in->show_month, .month_format = in->month_format, .show_week = in->show_week, .week_padding = in->week_padding, .week_suffix = in->week_suffix, .show_day_of_week = in->show_day_of_week, .day_of_week_abbreviation = in->day_of_week_abbreviation, .day_padding = in->day_padding, .day_of_month_padding = in->day_of_month_padding, .hour_padding = in->hour_padding, .minute_padding = in->minute_padding, .second_padding = in->second_padding, .show_day = in->show_day, .show_hour = in->show_hour, .show_minute = in->show_minute, .show_second = in->show_second, .show_millis = in->show_millis, .day_type = in->day_type, .hour_format = in->hour_format, }; return decode_date_time_format (&dtf); } else if (in->f_base_format == SPVDX_F_BASE_FORMAT_ELAPSED_TIME) { struct spvdx_elapsed_time_format etf = { .dt_base_format = (in->f_base_format == SPVDX_F_BASE_FORMAT_DATE ? SPVDX_DT_BASE_FORMAT_DATE : in->f_base_format == SPVDX_F_BASE_FORMAT_TIME ? SPVDX_DT_BASE_FORMAT_TIME : SPVDX_DT_BASE_FORMAT_DATE_TIME), .day_padding = in->day_padding, .minute_padding = in->minute_padding, .second_padding = in->second_padding, .show_year = in->show_year, .show_day = in->show_day, .show_hour = in->show_hour, .show_minute = in->show_minute, .show_second = in->show_second, .show_millis = in->show_millis, }; return decode_elapsed_time_format (&etf); } else { assert (!in->f_base_format); struct spvdx_number_format nf = { .minimum_integer_digits = in->minimum_integer_digits, .maximum_fraction_digits = in->maximum_fraction_digits, .minimum_fraction_digits = in->minimum_fraction_digits, .use_grouping = in->use_grouping, .scientific = in->scientific, .small = in->small, .prefix = in->prefix, .suffix = in->suffix, }; return decode_number_format (&nf); } } static void spv_series_execute_mapping (struct spv_series *series) { if (!hmap_is_empty (&series->map)) { series->remapped = true; for (size_t i = 0; i < series->n_values; i++) { struct spv_data_value *value = &series->values[i]; if (value->width >= 0) continue; const struct spv_mapping *mapping = spv_map_search (&series->map, value->d); if (mapping) { value->index = value->d; assert (value->index == floor (value->index)); value->width = mapping->to.width; if (value->width >= 0) value->s = xmemdup0 (mapping->to.s, mapping->to.width); else value->d = mapping->to.d; } } } } static char * WARN_UNUSED_RESULT spv_series_remap_formats (struct spv_series *series, struct spvxml_node **seq, size_t n_seq) { spv_map_destroy (&series->map); hmap_init (&series->map); for (size_t i = 0; i < n_seq; i++) { struct spvxml_node *node = seq[i]; if (spvdx_is_format (node)) { struct spvdx_format *f = spvdx_cast_format (node); series->format = decode_format (f); char *error = spv_series_parse_relabels ( &series->map, f->relabel, f->n_relabel, f->try_strings_as_numbers > 0, &series->format); if (error) return error; series->affixes = f->affix; series->n_affixes = f->n_affix; } else if (spvdx_is_string_format (node)) { struct spvdx_string_format *sf = spvdx_cast_string_format (node); char *error = spv_series_parse_relabels (&series->map, sf->relabel, sf->n_relabel, false, NULL); if (error) return error; series->affixes = sf->affix; series->n_affixes = sf->n_affix; } else NOT_REACHED (); } spv_series_execute_mapping (series); return NULL; } static char * WARN_UNUSED_RESULT spv_series_remap_vmes (struct spv_series *series, struct spvdx_value_map_entry **vmes, size_t n_vmes) { spv_map_destroy (&series->map); hmap_init (&series->map); for (size_t i = 0; i < n_vmes; i++) { char *error = spv_series_parse_value_map_entry (&series->map, vmes[i]); if (error) return error; } spv_series_execute_mapping (series); return NULL; } static void decode_footnotes (struct pivot_table *table, const struct spvdx_footnotes *f) { if (f->n_footnote_mapping > 0) pivot_table_create_footnote__ (table, f->n_footnote_mapping - 1, NULL, NULL); for (size_t i = 0; i < f->n_footnote_mapping; i++) { const struct spvdx_footnote_mapping *fm = f->footnote_mapping[i]; pivot_table_create_footnote__ (table, fm->defines_reference - 1, pivot_value_new_user_text (fm->to, -1), NULL); } } static struct cell_color optional_color (int color, struct cell_color default_color) { return (color >= 0 ? (struct cell_color) CELL_COLOR (color >> 16, color >> 8, color) : default_color); } static int optional_length (const char *s, int default_length) { /* There is usually a "pt" suffix. We ignore it. */ int length; return s && sscanf (s, "%d", &length) == 1 ? length : default_length; } static int optional_px (double inches, int default_px) { return inches != DBL_MAX ? inches * 96.0 : default_px; } static int optional_pt (double inches, int default_pt) { return inches != DBL_MAX ? inches * 72.0 + .5 : default_pt; } static void decode_spvdx_style_incremental (const struct spvdx_style *in, const struct spvdx_style *bg, struct area_style *out) { if (in && in->font_weight) out->font_style.bold = in->font_weight == SPVDX_FONT_WEIGHT_BOLD; if (in && in->font_style) out->font_style.italic = in->font_style == SPVDX_FONT_STYLE_ITALIC; if (in && in->font_underline) out->font_style.underline = in->font_underline == SPVDX_FONT_UNDERLINE_UNDERLINE; if (in && in->color >= 0) { out->font_style.fg[0] = optional_color ( in->color, (struct cell_color) CELL_COLOR_BLACK); out->font_style.fg[1] = out->font_style.fg[0]; } if (bg && bg->color >= 0) { out->font_style.bg[0] = optional_color ( bg->color, (struct cell_color) CELL_COLOR_WHITE); out->font_style.bg[1] = out->font_style.bg[0]; } if (in && in->font_family) { free (out->font_style.typeface); out->font_style.typeface = xstrdup (in->font_family); } if (in && in->font_size) { int size = optional_length (in->font_size, 0); if (size) out->font_style.size = size; } if (in && in->text_alignment) out->cell_style.halign = (in->text_alignment == SPVDX_TEXT_ALIGNMENT_LEFT ? TABLE_HALIGN_LEFT : in->text_alignment == SPVDX_TEXT_ALIGNMENT_RIGHT ? TABLE_HALIGN_RIGHT : in->text_alignment == SPVDX_TEXT_ALIGNMENT_CENTER ? TABLE_HALIGN_CENTER : in->text_alignment == SPVDX_TEXT_ALIGNMENT_DECIMAL ? TABLE_HALIGN_DECIMAL : TABLE_HALIGN_MIXED); if (in && in->label_location_vertical) out->cell_style.valign = (in->label_location_vertical == SPVDX_LABEL_LOCATION_VERTICAL_NEGATIVE ? TABLE_VALIGN_BOTTOM : in->label_location_vertical == SPVDX_LABEL_LOCATION_VERTICAL_POSITIVE ? TABLE_VALIGN_TOP : TABLE_VALIGN_CENTER); if (in && in->decimal_offset != DBL_MAX) out->cell_style.decimal_offset = optional_px (in->decimal_offset, 0); #if 0 if (in && in->margin_left != DBL_MAX) out->cell_style.margin[TABLE_HORZ][0] = optional_pt (in->margin_left, 8); if (in && in->margin_right != DBL_MAX) out->cell_style.margin[TABLE_HORZ][1] = optional_pt (in->margin_right, 11); if (in && in->margin_top != DBL_MAX) out->cell_style.margin[TABLE_VERT][0] = optional_pt (in->margin_top, 1); if (in && in->margin_bottom != DBL_MAX) out->cell_style.margin[TABLE_VERT][1] = optional_pt (in->margin_bottom, 1); #endif } static void decode_spvdx_style (const struct spvdx_style *in, const struct spvdx_style *bg, struct area_style *out) { *out = (struct area_style) AREA_STYLE_INITIALIZER; decode_spvdx_style_incremental (in, bg, out); } static void add_footnote (struct pivot_value *v, int idx, struct pivot_table *table) { if (idx < 1 || idx > table->n_footnotes) return; pivot_value_add_footnote (v, table->footnotes[idx - 1]); } static char * WARN_UNUSED_RESULT decode_label_frame (struct pivot_table *table, const struct spvdx_label_frame *lf) { if (!lf->label) return NULL; struct pivot_value **target; struct area_style *area; if (lf->label->purpose == SPVDX_PURPOSE_TITLE) { target = &table->title; area = &table->areas[PIVOT_AREA_TITLE]; } else if (lf->label->purpose == SPVDX_PURPOSE_SUB_TITLE) { target = &table->caption; area = &table->areas[PIVOT_AREA_CAPTION]; } else if (lf->label->purpose == SPVDX_PURPOSE_FOOTNOTE) { if (lf->label->n_text > 0 && lf->label->text[0]->uses_reference != INT_MIN) { target = NULL; area = &table->areas[PIVOT_AREA_FOOTER]; } else return NULL; } else if (lf->label->purpose == SPVDX_PURPOSE_LAYER) { target = NULL; area = &table->areas[PIVOT_AREA_LAYERS]; } else return NULL; area_style_uninit (area); decode_spvdx_style (lf->label->style, lf->label->text_frame_style, area); if (target) { struct pivot_value *value = xzalloc (sizeof *value); value->type = PIVOT_VALUE_TEXT; for (size_t i = 0; i < lf->label->n_text; i++) { const struct spvdx_text *in = lf->label->text[i]; if (in->defines_reference != INT_MIN) add_footnote (value, in->defines_reference, table); else if (!value->text.local) value->text.local = xstrdup (in->text); else { char *new = xasprintf ("%s%s", value->text.local, in->text); free (value->text.local); value->text.local = new; } } pivot_value_destroy (*target); *target = value; } else for (size_t i = 0; i < lf->label->n_text; i++) { const struct spvdx_text *in = lf->label->text[i]; if (in->uses_reference == INT_MIN) continue; if (i % 2) { size_t length = strlen (in->text); if (length && in->text[length - 1] == '\n') length--; pivot_table_create_footnote__ ( table, in->uses_reference - 1, NULL, pivot_value_new_user_text (in->text, length)); } else { size_t length = strlen (in->text); if (length && in->text[length - 1] == '.') length--; pivot_table_create_footnote__ ( table, in->uses_reference - 1, pivot_value_new_user_text (in->text, length), NULL); } } return NULL; } /* Special return value for decode_spvdx_variable(). */ static char BAD_REFERENCE; static char * WARN_UNUSED_RESULT decode_spvdx_source_variable (const struct spvxml_node *node, struct spv_data *data, struct hmap *series_map) { const struct spvdx_source_variable *sv = spvdx_cast_source_variable (node); struct spv_series *label_series = NULL; if (sv->label_variable) { label_series = spv_series_find (series_map, sv->label_variable->node_.id); if (!label_series) return &BAD_REFERENCE; label_series->is_label_series = true; } const struct spv_data_variable *var = spv_data_find_variable ( data, sv->source, sv->source_name); if (!var) return xasprintf ("sourceVariable %s references nonexistent " "source %s variable %s.", sv->node_.id, sv->source, sv->source_name); struct spv_series *s = xzalloc (sizeof *s); s->name = xstrdup (node->id); s->xml = node; s->label = sv->label ? xstrdup (sv->label) : NULL; s->label_series = label_series; s->values = spv_data_values_clone (var->values, var->n_values); s->n_values = var->n_values; s->format = F_8_0; hmap_init (&s->map); hmap_insert (series_map, &s->hmap_node, hash_string (s->name, 0)); char *error = spv_series_remap_formats (s, sv->seq, sv->n_seq); if (error) return error; if (label_series && !s->remapped) { for (size_t i = 0; i < s->n_values; i++) if (s->values[i].width < 0) { char *dest; if (label_series->values[i].width < 0) { union value v = { .f = label_series->values[i].d }; dest = data_out_stretchy (&v, "UTF-8", &s->format, NULL); } else dest = label_series->values[i].s; char *error = spv_map_insert (&s->map, s->values[i].d, dest, false, NULL); free (error); /* Duplicates are OK. */ if (label_series->values[i].width < 0) free (dest); } } return NULL; } static char * WARN_UNUSED_RESULT decode_spvdx_derived_variable (const struct spvxml_node *node, struct hmap *series_map) { const struct spvdx_derived_variable *dv = spvdx_cast_derived_variable (node); struct spv_data_value *values; size_t n_values; struct substring value = ss_cstr (dv->value); if (ss_equals (value, ss_cstr ("constant(0)"))) { struct spv_series *existing_series = spv_series_first (series_map); if (!existing_series) return &BAD_REFERENCE; n_values = existing_series->n_values; values = XCALLOC (n_values, struct spv_data_value); for (size_t i = 0; i < n_values; i++) values[i].width = -1; } else if (ss_starts_with (value, ss_cstr ("constant("))) { values = NULL; n_values = 0; } else if (ss_starts_with (value, ss_cstr ("map(")) && ss_ends_with (value, ss_cstr (")"))) { char *dependency_name = ss_xstrdup (ss_substr (value, 4, value.length - 5)); struct spv_series *dependency = spv_series_find (series_map, dependency_name); free (dependency_name); if (!dependency) return &BAD_REFERENCE; values = spv_data_values_clone (dependency->values, dependency->n_values); n_values = dependency->n_values; } else return xasprintf ("Derived variable %s has unknown value \"%s\"", node->id, dv->value); struct spv_series *s = xzalloc (sizeof *s); s->format = F_8_0; s->name = xstrdup (node->id); s->values = values; s->n_values = n_values; hmap_init (&s->map); hmap_insert (series_map, &s->hmap_node, hash_string (s->name, 0)); char *error = spv_series_remap_vmes (s, dv->value_map_entry, dv->n_value_map_entry); if (error) return error; error = spv_series_remap_formats (s, dv->seq, dv->n_seq); if (error) return error; if (n_values > 0) { for (size_t i = 0; i < n_values; i++) if (values[i].width != 0) goto nonempty; for (size_t i = 0; i < n_values; i++) spv_data_value_uninit (&s->values[i]); free (s->values); s->values = NULL; s->n_values = 0; nonempty:; } return NULL; } struct format_mapping { struct hmap_node hmap_node; uint32_t from; struct fmt_spec to; }; static const struct format_mapping * format_map_find (const struct hmap *format_map, uint32_t u32_format) { if (format_map) { const struct format_mapping *fm; HMAP_FOR_EACH_IN_BUCKET (fm, struct format_mapping, hmap_node, hash_int (u32_format, 0), format_map) if (fm->from == u32_format) return fm; } return NULL; } static char * WARN_UNUSED_RESULT spv_format_from_data_value (const struct spv_data_value *data, const struct hmap *format_map, struct fmt_spec *out) { if (!data) { *out = fmt_for_output (FMT_F, 40, 2); return NULL; } uint32_t u32_format = data->width < 0 ? data->d : atoi (data->s); const struct format_mapping *fm = format_map_find (format_map, u32_format); if (fm) { *out = fm->to; return NULL; } return spv_decode_fmt_spec (u32_format, out); } static char * WARN_UNUSED_RESULT pivot_value_from_data_value (const struct spv_data_value *data, const struct spv_data_value *format, const struct hmap *format_map, struct pivot_value **vp) { *vp = NULL; struct fmt_spec f; char *error = spv_format_from_data_value (format, format_map, &f); if (error) return error; struct pivot_value *v = xzalloc (sizeof *v); if (data->width >= 0) { if (format && fmt_get_category (f.type) == FMT_CAT_DATE) { int year, month, day, hour, minute, second, msec, len = -1; if (sscanf (data->s, "%4d-%2d-%2dT%2d:%2d:%2d.%3d%n", &year, &month, &day, &hour, &minute, &second, &msec, &len) == 7 && len == 23 && data->s[len] == '\0') { double date = calendar_gregorian_to_offset (year, month, day, NULL); if (date != SYSMIS) { v->type = PIVOT_VALUE_NUMERIC; v->numeric.x = (date * 60. * 60. * 24. + hour * 60. * 60. + minute * 60. + second + msec / 1000.0); v->numeric.format = f; *vp = v; return NULL; } } } else if (format && fmt_get_category (f.type) == FMT_CAT_TIME) { int hour, minute, second, msec, len = -1; if (sscanf (data->s, "%d:%2d:%2d.%3d%n", &hour, &minute, &second, &msec, &len) == 4 && len > 0 && data->s[len] == '\0') { v->type = PIVOT_VALUE_NUMERIC; v->numeric.x = (hour * 60. * 60. + minute * 60. + second + msec / 1000.0); v->numeric.format = f; *vp = v; return NULL; } } v->type = PIVOT_VALUE_STRING; v->string.s = xstrdup (data->s); } else { v->type = PIVOT_VALUE_NUMERIC; v->numeric.x = data->d; v->numeric.format = f; } *vp = v; return NULL; } static void add_parents (struct pivot_category *cat, struct pivot_category *parent, size_t group_index) { cat->parent = parent; cat->group_index = group_index; if (pivot_category_is_group (cat)) for (size_t i = 0; i < cat->n_subs; i++) add_parents (cat->subs[i], cat, i); } static const struct spvdx_facet_level * find_facet_level (const struct spvdx_visualization *v, int facet_level) { const struct spvdx_facet_layout *layout = v->graph->facet_layout; for (size_t i = 0; i < layout->n_facet_level; i++) { const struct spvdx_facet_level *fl = layout->facet_level[i]; if (facet_level == fl->level) return fl; } return NULL; } static bool should_show_label (const struct spvdx_facet_level *fl) { return fl && fl->axis->label && fl->axis->label->style->visible != 0; } static size_t max_category (const struct spv_series *s) { double max_cat = -DBL_MAX; for (size_t i = 0; i < s->n_values; i++) { const struct spv_data_value *dv = &s->values[i]; double d = dv->width < 0 ? dv->d : dv->index; if (d > max_cat) max_cat = d; } assert (max_cat >= 0 && max_cat < SIZE_MAX - 1); return max_cat; } static void add_affixes (struct pivot_table *table, struct pivot_value *value, struct spvdx_affix **affixes, size_t n_affixes) { for (size_t i = 0; i < n_affixes; i++) add_footnote (value, affixes[i]->defines_reference, table); } static char * WARN_UNUSED_RESULT add_dimension (struct spv_series **series, size_t n, enum pivot_axis_type axis_type, const struct spvdx_visualization *v, struct pivot_table *table, struct spv_series **dim_seriesp, size_t *n_dim_seriesp, int base_facet_level, struct pivot_dimension **dp) { char *error = NULL; const struct spvdx_facet_level *fl = find_facet_level (v, base_facet_level + n); if (fl) { struct area_style *area = (axis_type == PIVOT_AXIS_COLUMN ? &table->areas[PIVOT_AREA_COLUMN_LABELS] : axis_type == PIVOT_AXIS_ROW ? &table->areas[PIVOT_AREA_ROW_LABELS] : NULL); if (area && fl->axis->label) { area_style_uninit (area); decode_spvdx_style (fl->axis->label->style, fl->axis->label->text_frame_style, area); } } if (axis_type == PIVOT_AXIS_ROW) { const struct spvdx_facet_level *fl2 = find_facet_level (v, base_facet_level + (n - 1)); if (fl2) decode_spvdx_style_incremental ( fl2->axis->major_ticks->style, fl2->axis->major_ticks->tick_frame_style, &table->areas[PIVOT_AREA_ROW_LABELS]); } const struct spvdx_facet_level *fl3 = find_facet_level (v, base_facet_level); if (fl3 && fl3->axis->major_ticks->label_angle == -90) { if (axis_type == PIVOT_AXIS_COLUMN) table->rotate_inner_column_labels = true; else table->rotate_outer_row_labels = true; } /* Find the first row for each category. */ size_t max_cat = max_category (series[0]); size_t *cat_rows = xnmalloc (max_cat + 1, sizeof *cat_rows); for (size_t k = 0; k <= max_cat; k++) cat_rows[k] = SIZE_MAX; for (size_t k = 0; k < series[0]->n_values; k++) { const struct spv_data_value *dv = &series[0]->values[k]; double d = dv->width < 0 ? dv->d : dv->index; if (d >= 0 && d < SIZE_MAX - 1) { size_t row = d; if (cat_rows[row] == SIZE_MAX) cat_rows[row] = k; } } /* Drop missing categories and count what's left. */ size_t n_cats = 0; for (size_t k = 0; k <= max_cat; k++) if (cat_rows[k] != SIZE_MAX) cat_rows[n_cats++] = cat_rows[k]; assert (n_cats > 0); /* Make the categories. */ struct pivot_dimension *d = xzalloc (sizeof *d); table->dimensions[table->n_dimensions++] = d; series[0]->n_index = max_cat + 1; series[0]->index_to_category = xcalloc ( max_cat + 1, sizeof *series[0]->index_to_category); struct pivot_category **cats = xnmalloc (n_cats, sizeof **cats); for (size_t k = 0; k < n_cats; k++) { struct spv_data_value *dv = &series[0]->values[cat_rows[k]]; int dv_num = dv ? dv->d : dv->index; struct pivot_category *cat = xzalloc (sizeof *cat); char *retval = pivot_value_from_data_value ( spv_map_lookup (&series[0]->map, dv), NULL, NULL, &cat->name); if (retval) { if (error) free (retval); else error = retval; } cat->parent = NULL; cat->dimension = d; cat->data_index = k; cat->presentation_index = cat_rows[k]; cats[k] = cat; series[0]->index_to_category[dv_num] = cat; if (cat->name) add_affixes (table, cat->name, series[0]->affixes, series[0]->n_affixes); } free (cat_rows); struct pivot_axis *axis = &table->axes[axis_type]; d->axis_type = axis_type; d->level = axis->n_dimensions; d->top_index = table->n_dimensions - 1; d->root = xzalloc (sizeof *d->root); *d->root = (struct pivot_category) { .name = pivot_value_new_user_text ( series[0]->label ? series[0]->label : "", -1), .dimension = d, .show_label = should_show_label (fl), .data_index = SIZE_MAX, .presentation_index = SIZE_MAX, }; d->data_leaves = xmemdup (cats, n_cats * sizeof *cats); d->presentation_leaves = xmemdup (cats, n_cats * sizeof *cats); d->n_leaves = d->allocated_leaves = n_cats; /* Now group them, in one pass per grouping variable, innermost first. */ for (size_t j = 1; j < n; j++) { struct pivot_category **new_cats = xnmalloc (n_cats, sizeof **cats); size_t n_new_cats = 0; /* Allocate a category index. */ size_t max_cat = max_category (series[j]); series[j]->n_index = max_cat + 1; series[j]->index_to_category = xcalloc ( max_cat + 1, sizeof *series[j]->index_to_category); for (size_t cat1 = 0; cat1 < n_cats;) { /* Find a sequence of categories cat1...cat2 (exclusive), that all have the same value in series 'j'. (This might be only a single category; we will drop unnamed 1-category groups later.) */ size_t row1 = cats[cat1]->presentation_index; const struct spv_data_value *dv1 = &series[j]->values[row1]; size_t cat2; for (cat2 = cat1 + 1; cat2 < n_cats; cat2++) { size_t row2 = cats[cat2]->presentation_index; const struct spv_data_value *dv2 = &series[j]->values[row2]; if (!spv_data_value_equal (dv1, dv2)) break; } size_t n_subs = cat2 - cat1; struct pivot_category *new_cat; const struct spv_data_value *name = spv_map_lookup (&series[j]->map, dv1); if (n_subs == 1 && name->width == 0) { /* The existing category stands on its own. */ new_cat = cats[cat1++]; } else { /* Create a new group with cat...cat2 as subcategories. */ new_cat = xzalloc (sizeof *new_cat); *new_cat = (struct pivot_category) { .dimension = d, .subs = xnmalloc (n_subs, sizeof *new_cat->subs), .n_subs = n_subs, .show_label = true, .data_index = SIZE_MAX, .presentation_index = row1, }; char *retval = pivot_value_from_data_value (name, NULL, NULL, &new_cat->name); if (retval) { if (error) free (retval); else error = retval; } for (size_t k = 0; k < n_subs; k++) new_cat->subs[k] = cats[cat1++]; int dv1_num = dv1->width < 0 ? dv1->d : dv1->index; series[j]->index_to_category[dv1_num] = new_cat; } if (new_cat->name) add_affixes (table, new_cat->name, series[j]->affixes, series[j]->n_affixes); /* Append the new group to the list of new groups. */ new_cats[n_new_cats++] = new_cat; } free (cats); cats = new_cats; n_cats = n_new_cats; } /* Now drop unnamed 1-category groups and add parent pointers. */ for (size_t j = 0; j < n_cats; j++) add_parents (cats[j], d->root, j); d->root->subs = cats; d->root->n_subs = n_cats; if (error) { pivot_dimension_destroy (d); return error; } dim_seriesp[(*n_dim_seriesp)++] = series[0]; series[0]->dimension = d; axis->dimensions = xnrealloc (axis->dimensions, axis->n_dimensions + 1, sizeof *axis->dimensions); axis->dimensions[axis->n_dimensions++] = d; axis->extent *= d->n_leaves; *dp = d; return NULL; } static char * WARN_UNUSED_RESULT add_dimensions (struct hmap *series_map, const struct spvdx_nest *nest, enum pivot_axis_type axis_type, const struct spvdx_visualization *v, struct pivot_table *table, struct spv_series **dim_seriesp, size_t *n_dim_seriesp, int level_ofs) { struct pivot_axis *axis = &table->axes[axis_type]; if (!axis->extent) axis->extent = 1; if (!nest) return NULL; struct spv_series **series = xnmalloc (nest->n_vars, sizeof *series); for (size_t i = 0; i < nest->n_vars;) { size_t n; for (n = 0; i + n < nest->n_vars; n++) { series[n] = spv_series_from_ref (series_map, nest->vars[i + n]->ref); if (!series[n] || !series[n]->n_values) break; } if (n > 0) { struct pivot_dimension *d; char *error = add_dimension (series, n, axis_type, v, table, dim_seriesp, n_dim_seriesp, level_ofs + i, &d); if (error) { free (series); return error; } } i += n + 1; } free (series); return NULL; } static char * WARN_UNUSED_RESULT add_layers (struct hmap *series_map, struct spvdx_layer **layers, size_t n_layers, const struct spvdx_visualization *v, struct pivot_table *table, struct spv_series **dim_seriesp, size_t *n_dim_seriesp, int level_ofs) { struct pivot_axis *axis = &table->axes[PIVOT_AXIS_LAYER]; if (!axis->extent) axis->extent = 1; if (!n_layers) return NULL; struct spv_series **series = xnmalloc (n_layers, sizeof *series); for (size_t i = 0; i < n_layers;) { size_t n; for (n = 0; i + n < n_layers; n++) { series[n] = spv_series_from_ref (series_map, layers[i + n]->variable); if (!series[n] || !series[n]->n_values) break; } if (n > 0) { struct pivot_dimension *d; char *error = add_dimension ( series, n, PIVOT_AXIS_LAYER, v, table, dim_seriesp, n_dim_seriesp, level_ofs + i, &d); if (error) { free (series); return error; } int index = atoi (layers[i]->value); assert (index < d->n_leaves); table->current_layer = xrealloc ( table->current_layer, axis->n_dimensions * sizeof *table->current_layer); table->current_layer[axis->n_dimensions - 1] = index; } i += n + 1; } free (series); return NULL; } static int optional_int (int x, int default_value) { return x != INT_MIN ? x : default_value; } static enum pivot_area pivot_area_from_name (const char *name) { static const char *area_names[PIVOT_N_AREAS] = { [PIVOT_AREA_TITLE] = "title", [PIVOT_AREA_CAPTION] = "caption", [PIVOT_AREA_FOOTER] = "footnotes", [PIVOT_AREA_CORNER] = "cornerLabels", [PIVOT_AREA_COLUMN_LABELS] = "columnLabels", [PIVOT_AREA_ROW_LABELS] = "rowLabels", [PIVOT_AREA_DATA] = "data", [PIVOT_AREA_LAYERS] = "layers", }; enum pivot_area area; for (area = 0; area < PIVOT_N_AREAS; area++) if (!strcmp (name, area_names[area])) break; return area; } static enum pivot_border pivot_border_from_name (const char *name) { static const char *border_names[PIVOT_N_BORDERS] = { [PIVOT_BORDER_TITLE] = "titleLayerSeparator", [PIVOT_BORDER_OUTER_LEFT] = "leftOuterFrame", [PIVOT_BORDER_OUTER_TOP] = "topOuterFrame", [PIVOT_BORDER_OUTER_RIGHT] = "rightOuterFrame", [PIVOT_BORDER_OUTER_BOTTOM] = "bottomOuterFrame", [PIVOT_BORDER_INNER_LEFT] = "leftInnerFrame", [PIVOT_BORDER_INNER_TOP] = "topInnerFrame", [PIVOT_BORDER_INNER_RIGHT] = "rightInnerFrame", [PIVOT_BORDER_INNER_BOTTOM] = "bottomInnerFrame", [PIVOT_BORDER_DATA_LEFT] = "dataAreaLeft", [PIVOT_BORDER_DATA_TOP] = "dataAreaTop", [PIVOT_BORDER_DIM_ROW_HORZ] = "horizontalDimensionBorderRows", [PIVOT_BORDER_DIM_ROW_VERT] = "verticalDimensionBorderRows", [PIVOT_BORDER_DIM_COL_HORZ] = "horizontalDimensionBorderColumns", [PIVOT_BORDER_DIM_COL_VERT] = "verticalDimensionBorderColumns", [PIVOT_BORDER_CAT_ROW_HORZ] = "horizontalCategoryBorderRows", [PIVOT_BORDER_CAT_ROW_VERT] = "verticalCategoryBorderRows", [PIVOT_BORDER_CAT_COL_HORZ] = "horizontalCategoryBorderColumns", [PIVOT_BORDER_CAT_COL_VERT] = "verticalCategoryBorderColumns", }; enum pivot_border border; for (border = 0; border < PIVOT_N_BORDERS; border++) if (!strcmp (name, border_names[border])) break; return border; } static struct pivot_category * find_category (struct spv_series *series, int index) { return (index >= 0 && index < series->n_index ? series->index_to_category[index] : NULL); } static bool int_in_array (int value, const int *array, size_t n) { for (size_t i = 0; i < n; i++) if (array[i] == value) return true; return false; } static void apply_styles_to_value (struct pivot_table *table, struct pivot_value *value, const struct spvdx_set_format *sf, const struct area_style *base_area_style, const struct spvdx_style *fg, const struct spvdx_style *bg) { if (sf) { if (sf->reset > 0) { free (value->footnotes); value->footnotes = NULL; value->n_footnotes = 0; } struct fmt_spec format = { .w = 0 }; if (sf->format) { format = decode_format (sf->format); add_affixes (table, value, sf->format->affix, sf->format->n_affix); } else if (sf->number_format) { format = decode_number_format (sf->number_format); add_affixes (table, value, sf->number_format->affix, sf->number_format->n_affix); } else if (sf->n_string_format) { for (size_t i = 0; i < sf->n_string_format; i++) add_affixes (table, value, sf->string_format[i]->affix, sf->string_format[i]->n_affix); } else if (sf->date_time_format) { format = decode_date_time_format (sf->date_time_format); add_affixes (table, value, sf->date_time_format->affix, sf->date_time_format->n_affix); } else if (sf->elapsed_time_format) { format = decode_elapsed_time_format (sf->elapsed_time_format); add_affixes (table, value, sf->elapsed_time_format->affix, sf->elapsed_time_format->n_affix); } if (format.w) { if (value->type == PIVOT_VALUE_NUMERIC) value->numeric.format = format; /* Possibly we should try to apply date and time formats too, but none seem to occur in practice so far. */ } } if (fg || bg) { struct area_style area; pivot_value_get_style ( value, value->font_style ? value->font_style : &base_area_style->font_style, value->cell_style ? value->cell_style : &base_area_style->cell_style, &area); decode_spvdx_style_incremental (fg, bg, &area); pivot_value_set_style (value, &area); area_style_uninit (&area); } } static void decode_set_cell_properties__ (struct pivot_table *table, struct hmap *series_map, const struct spvdx_intersect *intersect, const struct spvdx_style *interval, const struct spvdx_style *graph, const struct spvdx_style *labeling, const struct spvdx_style *frame, const struct spvdx_style *major_ticks, const struct spvdx_set_format *set_format) { if (graph && labeling && intersect->alternating && !interval && !major_ticks && !frame && !set_format) { /* Sets alt_fg_color and alt_bg_color. */ struct area_style area; decode_spvdx_style (labeling, graph, &area); table->areas[PIVOT_AREA_DATA].font_style.fg[1] = area.font_style.fg[0]; table->areas[PIVOT_AREA_DATA].font_style.bg[1] = area.font_style.bg[0]; area_style_uninit (&area); } else if (graph && !labeling && !interval && !major_ticks && !frame && !set_format) { /* 'graph->width' likely just sets the width of the table as a whole. */ } else if (!graph && !labeling && !interval && !frame && !set_format && !major_ticks) { /* No-op. (Presumably there's a setMetaData we don't care about.) */ } else if (((set_format && spvdx_is_major_ticks (set_format->target)) || major_ticks || frame) && intersect->n_where == 1) { /* Formatting for individual row or column labels. */ const struct spvdx_where *w = intersect->where[0]; struct spv_series *s = spv_series_find (series_map, w->variable->id); assert (s); const char *p = w->include; while (*p) { char *tail; int include = strtol (p, &tail, 10); struct pivot_category *c = find_category (s, include); if (c) { const struct area_style *base_area_style = (c->dimension->axis_type == PIVOT_AXIS_ROW ? &table->areas[PIVOT_AREA_ROW_LABELS] : &table->areas[PIVOT_AREA_COLUMN_LABELS]); apply_styles_to_value (table, c->name, set_format, base_area_style, major_ticks, frame); } if (tail == p) break; p = tail; if (*p == ';') p++; } } else if ((set_format && spvdx_is_labeling (set_format->target)) || labeling || interval) { /* Formatting for individual cells or groups of them with some dimensions in common. */ int **indexes = XCALLOC (table->n_dimensions, int *); size_t *n = XCALLOC (table->n_dimensions, size_t); size_t *allocated = XCALLOC (table->n_dimensions, size_t); for (size_t i = 0; i < intersect->n_where; i++) { const struct spvdx_where *w = intersect->where[i]; struct spv_series *s = spv_series_find (series_map, w->variable->id); assert (s); if (!s->dimension) { /* Group indexes may be included even though they are redundant. Ignore them. */ continue; } size_t j = s->dimension->top_index; const char *p = w->include; while (*p) { char *tail; int include = strtol (p, &tail, 10); struct pivot_category *c = find_category (s, include); if (c) { if (n[j] >= allocated[j]) indexes[j] = x2nrealloc (indexes[j], &allocated[j], sizeof *indexes[j]); indexes[j][n[j]++] = c->data_index; } if (tail == p) break; p = tail; if (*p == ';') p++; } } #if 0 printf ("match:"); for (size_t i = 0; i < table->n_dimensions; i++) { if (n[i]) { printf (" %d=(", i); for (size_t j = 0; j < n[i]; j++) { if (j) putchar (','); printf ("%d", indexes[i][j]); } putchar (')'); } } printf ("\n"); #endif /* XXX This is inefficient in the common case where all of the dimensions are matched. We should use a heuristic where if all of the dimensions are matched and the product of n[*] is less than hmap_count(&table->cells) then iterate through all the possibilities rather than all the cells. Or even only do it if there is just one possibility. */ struct pivot_cell *cell; HMAP_FOR_EACH (cell, struct pivot_cell, hmap_node, &table->cells) { for (size_t i = 0; i < table->n_dimensions; i++) { if (n[i] && !int_in_array (cell->idx[i], indexes[i], n[i])) goto skip; } apply_styles_to_value (table, cell->value, set_format, &table->areas[PIVOT_AREA_DATA], labeling, interval); skip: ; } for (size_t i = 0; i < table->n_dimensions; i++) free (indexes[i]); free (indexes); free (n); free (allocated); } else NOT_REACHED (); } static void decode_set_cell_properties (struct pivot_table *table, struct hmap *series_map, struct spvdx_set_cell_properties **scps, size_t n_scps) { for (size_t i = 0; i < n_scps; i++) { const struct spvdx_set_cell_properties *scp = scps[i]; const struct spvdx_style *interval = NULL; const struct spvdx_style *graph = NULL; const struct spvdx_style *labeling = NULL; const struct spvdx_style *frame = NULL; const struct spvdx_style *major_ticks = NULL; const struct spvdx_set_format *set_format = NULL; for (size_t j = 0; j < scp->n_seq; j++) { const struct spvxml_node *node = scp->seq[j]; if (spvdx_is_set_style (node)) { const struct spvdx_set_style *set_style = spvdx_cast_set_style (node); if (spvdx_is_graph (set_style->target)) graph = set_style->style; else if (spvdx_is_labeling (set_style->target)) labeling = set_style->style; else if (spvdx_is_interval (set_style->target)) interval = set_style->style; else if (spvdx_is_major_ticks (set_style->target)) major_ticks = set_style->style; else NOT_REACHED (); } else if (spvdx_is_set_frame_style (node)) frame = spvdx_cast_set_frame_style (node)->style; else if (spvdx_is_set_format (node)) set_format = spvdx_cast_set_format (node); else assert (spvdx_is_set_meta_data (node)); } if (scp->union_ && scp->apply_to_converse <= 0) { for (size_t j = 0; j < scp->union_->n_intersect; j++) decode_set_cell_properties__ ( table, series_map, scp->union_->intersect[j], interval, graph, labeling, frame, major_ticks, set_format); } else if (!scp->union_ && scp->apply_to_converse > 0) { if ((set_format && spvdx_is_labeling (set_format->target)) || labeling || interval) { struct pivot_cell *cell; HMAP_FOR_EACH (cell, struct pivot_cell, hmap_node, &table->cells) apply_styles_to_value (table, cell->value, set_format, &table->areas[PIVOT_AREA_DATA], NULL, NULL); } } else if (!scp->union_ && scp->apply_to_converse <= 0) { /* Appears to be used to set the font for something--but what? */ } else NOT_REACHED (); } } char * WARN_UNUSED_RESULT decode_spvsx_legacy_properties (const struct spvsx_table_properties *in, struct spv_legacy_properties **outp) { struct spv_legacy_properties *out = xzalloc (sizeof *out); char *error; if (!in) { error = xstrdup ("Legacy table lacks tableProperties"); goto error; } const struct spvsx_general_properties *g = in->general_properties; out->omit_empty = g->hide_empty_rows != 0; out->width_ranges[TABLE_HORZ][0] = optional_pt (g->minimum_column_width, -1); out->width_ranges[TABLE_HORZ][1] = optional_pt (g->maximum_column_width, -1); out->width_ranges[TABLE_VERT][0] = optional_pt (g->minimum_row_width, -1); out->width_ranges[TABLE_VERT][1] = optional_pt (g->maximum_row_width, -1); out->row_labels_in_corner = g->row_dimension_labels != SPVSX_ROW_DIMENSION_LABELS_NESTED; const struct spvsx_footnote_properties *f = in->footnote_properties; out->footnote_marker_superscripts = (f->marker_position != SPVSX_MARKER_POSITION_SUBSCRIPT); out->show_numeric_markers = (f->number_format == SPVSX_NUMBER_FORMAT_NUMERIC); for (int i = 0; i < PIVOT_N_AREAS; i++) area_style_copy (NULL, &out->areas[i], pivot_area_get_default_style (i)); const struct spvsx_cell_format_properties *cfp = in->cell_format_properties; for (size_t i = 0; i < cfp->n_cell_style; i++) { const struct spvsx_cell_style *c = cfp->cell_style[i]; const char *name = CHAR_CAST (const char *, c->node_.raw->name); enum pivot_area area = pivot_area_from_name (name); if (area == PIVOT_N_AREAS) { error = xasprintf ("unknown area \"%s\" in cellFormatProperties", name); goto error; } struct area_style *a = &out->areas[area]; const struct spvsx_style *s = c->style; if (s->font_weight) a->font_style.bold = s->font_weight == SPVSX_FONT_WEIGHT_BOLD; if (s->font_style) a->font_style.italic = s->font_style == SPVSX_FONT_STYLE_ITALIC; a->font_style.underline = false; if (s->color >= 0) a->font_style.fg[0] = optional_color ( s->color, (struct cell_color) CELL_COLOR_BLACK); if (c->alternating_text_color >= 0 || s->color >= 0) a->font_style.fg[1] = optional_color (c->alternating_text_color, a->font_style.fg[0]); if (s->color2 >= 0) a->font_style.bg[0] = optional_color ( s->color2, (struct cell_color) CELL_COLOR_WHITE); if (c->alternating_color >= 0 || s->color2 >= 0) a->font_style.bg[1] = optional_color (c->alternating_color, a->font_style.bg[0]); if (s->font_family) { free (a->font_style.typeface); a->font_style.typeface = xstrdup (s->font_family); } if (s->font_size) a->font_style.size = optional_length (s->font_size, 0); if (s->text_alignment) a->cell_style.halign = (s->text_alignment == SPVSX_TEXT_ALIGNMENT_LEFT ? TABLE_HALIGN_LEFT : s->text_alignment == SPVSX_TEXT_ALIGNMENT_RIGHT ? TABLE_HALIGN_RIGHT : s->text_alignment == SPVSX_TEXT_ALIGNMENT_CENTER ? TABLE_HALIGN_CENTER : s->text_alignment == SPVSX_TEXT_ALIGNMENT_DECIMAL ? TABLE_HALIGN_DECIMAL : TABLE_HALIGN_MIXED); if (s->label_location_vertical) a->cell_style.valign = (s->label_location_vertical == SPVSX_LABEL_LOCATION_VERTICAL_NEGATIVE ? TABLE_VALIGN_BOTTOM : s->label_location_vertical == SPVSX_LABEL_LOCATION_VERTICAL_POSITIVE ? TABLE_VALIGN_TOP : TABLE_VALIGN_CENTER); if (s->decimal_offset != DBL_MAX) a->cell_style.decimal_offset = optional_px (s->decimal_offset, 0); if (s->margin_left != DBL_MAX) a->cell_style.margin[TABLE_HORZ][0] = optional_px (s->margin_left, 8); if (s->margin_right != DBL_MAX) a->cell_style.margin[TABLE_HORZ][1] = optional_px (s->margin_right, 11); if (s->margin_top != DBL_MAX) a->cell_style.margin[TABLE_VERT][0] = optional_px (s->margin_top, 1); if (s->margin_bottom != DBL_MAX) a->cell_style.margin[TABLE_VERT][1] = optional_px (s->margin_bottom, 1); } for (int i = 0; i < PIVOT_N_BORDERS; i++) pivot_border_get_default_style (i, &out->borders[i]); const struct spvsx_border_properties *bp = in->border_properties; for (size_t i = 0; i < bp->n_border_style; i++) { const struct spvsx_border_style *bin = bp->border_style[i]; const char *name = CHAR_CAST (const char *, bin->node_.raw->name); enum pivot_border border = pivot_border_from_name (name); if (border == PIVOT_N_BORDERS) { error = xasprintf ("unknown border \"%s\" parsing borderProperties", name); goto error; } struct table_border_style *bout = &out->borders[border]; bout->stroke = (bin->border_style_type == SPVSX_BORDER_STYLE_TYPE_NONE ? TABLE_STROKE_NONE : bin->border_style_type == SPVSX_BORDER_STYLE_TYPE_DASHED ? TABLE_STROKE_DASHED : bin->border_style_type == SPVSX_BORDER_STYLE_TYPE_THICK ? TABLE_STROKE_THICK : bin->border_style_type == SPVSX_BORDER_STYLE_TYPE_THIN ? TABLE_STROKE_THIN : bin->border_style_type == SPVSX_BORDER_STYLE_TYPE_DOUBLE ? TABLE_STROKE_DOUBLE : TABLE_STROKE_SOLID); bout->color = optional_color (bin->color, (struct cell_color) CELL_COLOR_BLACK); } const struct spvsx_printing_properties *pp = in->printing_properties; out->print_all_layers = pp->print_all_layers > 0; out->paginate_layers = pp->print_each_layer_on_separate_page > 0; out->shrink_to_width = pp->rescale_wide_table_to_fit_page > 0; out->shrink_to_length = pp->rescale_long_table_to_fit_page > 0; out->top_continuation = pp->continuation_text_at_top > 0; out->bottom_continuation = pp->continuation_text_at_bottom > 0; out->continuation = xstrdup (pp->continuation_text ? pp->continuation_text : "(cont.)"); out->n_orphan_lines = optional_int (pp->window_orphan_lines, 2); *outp = out; return NULL; error: spv_legacy_properties_destroy (out); *outp = NULL; return error; } void spv_legacy_properties_destroy (struct spv_legacy_properties *props) { if (props) { for (size_t i = 0; i < PIVOT_N_AREAS; i++) area_style_uninit (&props->areas[i]); free (props->continuation); free (props); } } static struct spv_series * parse_formatting (const struct spvdx_visualization *v, const struct hmap *series_map, struct hmap *format_map) { const struct spvdx_labeling *labeling = v->graph->interval->labeling; struct spv_series *cell_format = NULL; for (size_t i = 0; i < labeling->n_seq; i++) { const struct spvdx_formatting *f = spvdx_cast_formatting (labeling->seq[i]); if (!f) continue; cell_format = spv_series_from_ref (series_map, f->variable); for (size_t j = 0; j < f->n_format_mapping; j++) { const struct spvdx_format_mapping *fm = f->format_mapping[j]; if (fm->format) { struct format_mapping *out = xmalloc (sizeof *out); out->from = fm->from; out->to = decode_format (fm->format); hmap_insert (format_map, &out->hmap_node, hash_int (out->from, 0)); } } } return cell_format; } static void format_map_destroy (struct hmap *format_map) { struct format_mapping *fm, *next; HMAP_FOR_EACH_SAFE (fm, next, struct format_mapping, hmap_node, format_map) { hmap_delete (format_map, &fm->hmap_node); free (fm); } hmap_destroy (format_map); } char * WARN_UNUSED_RESULT decode_spvdx_table (const struct spvdx_visualization *v, const char *subtype, const struct spv_legacy_properties *props, struct spv_data *data, struct pivot_table **outp) { struct pivot_table *table = pivot_table_create__ (NULL, subtype); struct hmap series_map = HMAP_INITIALIZER (series_map); struct hmap format_map = HMAP_INITIALIZER (format_map); struct spv_series **dim_series = NULL; char *error; /* First get the legacy properties. */ table->omit_empty = props->omit_empty; for (enum table_axis axis = 0; axis < TABLE_N_AXES; axis++) for (int i = 0; i < 2; i++) if (props->width_ranges[axis][i] > 0) table->sizing[axis].range[i] = props->width_ranges[axis][i]; table->row_labels_in_corner = props->row_labels_in_corner; table->footnote_marker_superscripts = props->footnote_marker_superscripts; table->show_numeric_markers = props->show_numeric_markers; for (size_t i = 0; i < PIVOT_N_AREAS; i++) { area_style_uninit (&table->areas[i]); area_style_copy (NULL, &table->areas[i], &props->areas[i]); } for (size_t i = 0; i < PIVOT_N_BORDERS; i++) table->borders[i] = props->borders[i]; table->print_all_layers = props->print_all_layers; table->paginate_layers = props->paginate_layers; table->shrink_to_fit[TABLE_HORZ] = props->shrink_to_width; table->shrink_to_fit[TABLE_VERT] = props->shrink_to_length; table->top_continuation = props->top_continuation; table->bottom_continuation = props->bottom_continuation; table->continuation = xstrdup (props->continuation); table->n_orphan_lines = props->n_orphan_lines; struct spvdx_visualization_extension *ve = v->visualization_extension; table->show_grid_lines = ve && ve->show_gridline; /* Sizing from the legacy properties can get overridden. */ if (v->graph->cell_style->width) { int min_width, max_width, n = 0; if (sscanf (v->graph->cell_style->width, "%*d%%;%dpt;%dpt%n", &min_width, &max_width, &n) && v->graph->cell_style->width[n] == '\0') { table->sizing[TABLE_HORZ].range[0] = min_width; table->sizing[TABLE_HORZ].range[1] = max_width; } } /* Footnotes. Any pivot_value might refer to footnotes, so it's important to process the footnotes early to ensure that those references can be resolved. There is a possible problem that a footnote might itself reference an as-yet-unprocessed footnote, but that's OK because footnote references don't actually look at the footnote contents but only resolve a pointer to where the footnote will go later. Before we really start, create all the footnotes we'll fill in. This is because sometimes footnotes refer to themselves or to each other and we don't want to reject those references. */ if (v->container) for (size_t i = 0; i < v->container->n_label_frame; i++) { const struct spvdx_label_frame *lf = v->container->label_frame[i]; if (lf->label && lf->label->purpose == SPVDX_PURPOSE_FOOTNOTE && lf->label->n_text > 0 && lf->label->text[0]->uses_reference > 0) { pivot_table_create_footnote__ ( table, lf->label->text[0]->uses_reference - 1, NULL, NULL); } } if (v->graph->interval->footnotes) decode_footnotes (table, v->graph->interval->footnotes); struct spv_series *footnotes = NULL; for (size_t i = 0; i < v->graph->interval->labeling->n_seq; i++) { const struct spvxml_node *node = v->graph->interval->labeling->seq[i]; if (spvdx_is_footnotes (node)) { const struct spvdx_footnotes *f = spvdx_cast_footnotes (node); footnotes = spv_series_from_ref (&series_map, f->variable); decode_footnotes (table, f); } } for (size_t i = 0; i < v->n_lf1; i++) { error = decode_label_frame (table, v->lf1[i]); if (error) goto exit; } for (size_t i = 0; i < v->n_lf2; i++) { error = decode_label_frame (table, v->lf2[i]); if (error) goto exit; } if (v->container) for (size_t i = 0; i < v->container->n_label_frame; i++) { error = decode_label_frame (table, v->container->label_frame[i]); if (error) goto exit; } if (v->graph->interval->labeling->style) { area_style_uninit (&table->areas[PIVOT_AREA_DATA]); decode_spvdx_style (v->graph->interval->labeling->style, v->graph->cell_style, &table->areas[PIVOT_AREA_DATA]); } /* Decode all of the sourceVariable and derivedVariable */ struct spvxml_node **nodes = xmemdup (v->seq, v->n_seq * sizeof *v->seq); size_t n_nodes = v->n_seq; while (n_nodes > 0) { bool progress = false; for (size_t i = 0; i < n_nodes;) { error = (spvdx_is_source_variable (nodes[i]) ? decode_spvdx_source_variable (nodes[i], data, &series_map) : decode_spvdx_derived_variable (nodes[i], &series_map)); if (!error) { nodes[i] = nodes[--n_nodes]; progress = true; } else if (error == &BAD_REFERENCE) i++; else { free (nodes); goto exit; } } if (!progress) { free (nodes); error = xasprintf ("Table has %zu variables with circular or " "unresolved references, including variable %s.", n_nodes, nodes[0]->id); goto exit; } } free (nodes); const struct spvdx_cross *cross = v->graph->faceting->cross; assert (cross->n_seq == 1); const struct spvdx_nest *columns = spvdx_cast_nest (cross->seq[0]); size_t max_columns = columns ? columns->n_vars : 0; assert (cross->n_seq2 == 1); const struct spvdx_nest *rows = spvdx_cast_nest (cross->seq2[0]); size_t max_rows = rows ? rows->n_vars : 0; size_t max_layers = (v->graph->faceting->n_layers1 + v->graph->faceting->n_layers2); size_t max_dims = max_columns + max_rows + max_layers; table->dimensions = xnmalloc (max_dims, sizeof *table->dimensions); dim_series = xnmalloc (max_dims, sizeof *dim_series); size_t n_dim_series = 0; error = add_dimensions (&series_map, columns, PIVOT_AXIS_COLUMN, v, table, dim_series, &n_dim_series, 1); if (error) goto exit; error = add_dimensions (&series_map, rows, PIVOT_AXIS_ROW, v, table, dim_series, &n_dim_series, max_columns + 1); if (error) goto exit; error = add_layers (&series_map, v->graph->faceting->layers1, v->graph->faceting->n_layers1, v, table, dim_series, &n_dim_series, max_rows + max_columns + 1); if (error) goto exit; error = add_layers (&series_map, v->graph->faceting->layers2, v->graph->faceting->n_layers2, v, table, dim_series, &n_dim_series, (max_rows + max_columns + v->graph->faceting->n_layers1 + 1)); if (error) goto exit; struct spv_series *cell = spv_series_find (&series_map, "cell"); if (!cell) { error = xstrdup (_("Table lacks cell data.")); goto exit; } struct spv_series *cell_format = parse_formatting (v, &series_map, &format_map); assert (table->n_dimensions == n_dim_series); size_t *dim_indexes = xnmalloc (table->n_dimensions, sizeof *dim_indexes); for (size_t i = 0; i < cell->n_values; i++) { for (size_t j = 0; j < table->n_dimensions; j++) { const struct spv_data_value *value = &dim_series[j]->values[i]; const struct pivot_category *cat = find_category ( dim_series[j], value->width < 0 ? value->d : value->index); if (!cat) goto skip; dim_indexes[j] = cat->data_index; } struct pivot_value *value; error = pivot_value_from_data_value ( &cell->values[i], cell_format ? &cell_format->values[i] : NULL, &format_map, &value); if (error) goto exit; if (footnotes) { const struct spv_data_value *d = &footnotes->values[i]; if (d->width >= 0) { const char *p = d->s; while (*p) { char *tail; int idx = strtol (p, &tail, 10); add_footnote (value, idx, table); if (tail == p) break; p = tail; if (*p == ',') p++; } } } if (value->type == PIVOT_VALUE_NUMERIC && value->numeric.x == SYSMIS && !value->n_footnotes) { /* Apparently, system-missing values are just empty cells? */ pivot_value_destroy (value); } else pivot_table_put (table, dim_indexes, table->n_dimensions, value); skip:; } free (dim_indexes); decode_set_cell_properties (table, &series_map, v->graph->facet_layout->scp1, v->graph->facet_layout->n_scp1); decode_set_cell_properties (table, &series_map, v->graph->facet_layout->scp2, v->graph->facet_layout->n_scp2); pivot_table_assign_label_depth (table); format_map_destroy (&format_map); exit: free (dim_series); spv_series_destroy (&series_map); if (error) { pivot_table_unref (table); *outp = NULL; } else *outp = table; return error; } pspp-1.4.1/src/output/spv/spvbin-helpers.c0000644000175000017500000002054213670210420020155 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2018 Free Software Foundation, Inc. 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 3 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, see . */ #include #include "output/spv/spvbin-helpers.h" #include #include #include "libpspp/float-format.h" #include "libpspp/integer-format.h" #include "libpspp/str.h" #include "gl/xmemdup0.h" void spvbin_input_init (struct spvbin_input *input, const void *data, size_t size) { *input = (struct spvbin_input) { .data = data, .size = size }; } bool spvbin_input_at_end (const struct spvbin_input *input) { return input->ofs >= input->size; } char * spvbin_input_to_error (const struct spvbin_input *input, const char *name) { struct string s = DS_EMPTY_INITIALIZER; if (name) ds_put_format (&s, "%s: ", name); ds_put_cstr (&s, "parse error decoding "); for (size_t i = input->n_errors; i-- > 0;) if (i < SPVBIN_MAX_ERRORS) ds_put_format (&s, "/%s@%#zx", input->errors[i].name, input->errors[i].start); ds_put_format (&s, " near %#zx", input->error_ofs); return ds_steal_cstr (&s); } bool spvbin_match_bytes (struct spvbin_input *input, const void *bytes, size_t n) { if (input->size - input->ofs < n || memcmp (&input->data[input->ofs], bytes, n)) return false; input->ofs += n; return true; } bool spvbin_match_byte (struct spvbin_input *input, uint8_t byte) { return spvbin_match_bytes (input, &byte, 1); } bool spvbin_parse_bool (struct spvbin_input *input, bool *p) { if (input->ofs >= input->size || input->data[input->ofs] > 1) return false; if (p) *p = input->data[input->ofs]; input->ofs++; return true; } static const void * spvbin_parse__ (struct spvbin_input *input, size_t n) { if (input->size - input->ofs < n) return NULL; const void *src = &input->data[input->ofs]; input->ofs += n; return src; } bool spvbin_parse_byte (struct spvbin_input *input, uint8_t *p) { const void *src = spvbin_parse__ (input, sizeof *p); if (src && p) *p = *(const uint8_t *) src; return src != NULL; } bool spvbin_parse_int16 (struct spvbin_input *input, uint16_t *p) { const void *src = spvbin_parse__ (input, sizeof *p); if (src && p) *p = le_to_native16 (get_uint16 (src)); return src != NULL; } bool spvbin_parse_int32 (struct spvbin_input *input, uint32_t *p) { const void *src = spvbin_parse__ (input, sizeof *p); if (src && p) *p = le_to_native32 (get_uint32 (src)); return src != NULL; } bool spvbin_parse_int64 (struct spvbin_input *input, uint64_t *p) { const void *src = spvbin_parse__ (input, sizeof *p); if (src && p) *p = le_to_native64 (get_uint64 (src)); return src != NULL; } bool spvbin_parse_be16 (struct spvbin_input *input, uint16_t *p) { const void *src = spvbin_parse__ (input, sizeof *p); if (src && p) *p = be_to_native16 (get_uint16 (src)); return src != NULL; } bool spvbin_parse_be32 (struct spvbin_input *input, uint32_t *p) { const void *src = spvbin_parse__ (input, sizeof *p); if (src && p) *p = be_to_native32 (get_uint32 (src)); return src != NULL; } bool spvbin_parse_be64 (struct spvbin_input *input, uint64_t *p) { const void *src = spvbin_parse__ (input, sizeof *p); if (src && p) *p = be_to_native64 (get_uint64 (src)); return src != NULL; } bool spvbin_parse_double (struct spvbin_input *input, double *p) { const void *src = spvbin_parse__ (input, 8); if (src && p) *p = float_get_double (FLOAT_IEEE_DOUBLE_LE, src); return src != NULL; } bool spvbin_parse_float (struct spvbin_input *input, double *p) { const void *src = spvbin_parse__ (input, 4); if (src && p) *p = float_get_double (FLOAT_IEEE_SINGLE_LE, src); return src != NULL; } static bool spvbin_parse_string__ (struct spvbin_input *input, uint32_t (*raw_to_native32) (uint32_t), char **p) { *p = NULL; uint32_t length; if (input->size - input->ofs < sizeof length) return false; const uint8_t *src = &input->data[input->ofs]; length = raw_to_native32 (get_uint32 (src)); if (input->size - input->ofs - sizeof length < length) return false; if (p) *p = xmemdup0 (src + sizeof length, length); input->ofs += sizeof length + length; return true; } bool spvbin_parse_string (struct spvbin_input *input, char **p) { return spvbin_parse_string__ (input, le_to_native32, p); } bool spvbin_parse_bestring (struct spvbin_input *input, char **p) { return spvbin_parse_string__ (input, be_to_native32, p); } void spvbin_error (struct spvbin_input *input, const char *name, size_t start) { if (!input->n_errors) input->error_ofs = input->ofs; /* We keep track of the error depth regardless of whether we can store all of them. The parser needs this to accurately save and restore error state. */ if (input->n_errors < SPVBIN_MAX_ERRORS) { input->errors[input->n_errors].name = name; input->errors[input->n_errors].start = start; } input->n_errors++; } void spvbin_print_header (const char *title, size_t start UNUSED, size_t len UNUSED, int indent) { for (int i = 0; i < indent * 4; i++) putchar (' '); fputs (title, stdout); #if 0 if (start != SIZE_MAX) printf (" (0x%zx, %zu)", start, len); #endif fputs (": ", stdout); } void spvbin_print_presence (const char *title, int indent, bool present) { spvbin_print_header (title, -1, -1, indent); puts (present ? "present" : "absent"); } void spvbin_print_bool (const char *title, int indent, bool x) { spvbin_print_header (title, -1, -1, indent); printf ("%s\n", x ? "true" : "false"); } void spvbin_print_byte (const char *title, int indent, uint8_t x) { spvbin_print_header (title, -1, -1, indent); printf ("%"PRIu8"\n", x); } void spvbin_print_int16 (const char *title, int indent, uint16_t x) { spvbin_print_header (title, -1, -1, indent); printf ("%"PRIu16"\n", x); } void spvbin_print_int32 (const char *title, int indent, uint32_t x) { spvbin_print_header (title, -1, -1, indent); printf ("%"PRIu32"\n", x); } void spvbin_print_int64 (const char *title, int indent, uint64_t x) { spvbin_print_header (title, -1, -1, indent); printf ("%"PRIu64"\n", x); } void spvbin_print_double (const char *title, int indent, double x) { spvbin_print_header (title, -1, -1, indent); printf ("%g\n", x); } void spvbin_print_string (const char *title, int indent, const char *s) { spvbin_print_header (title, -1, -1, indent); if (s) printf ("\"%s\"\n", s); else printf ("none\n"); } void spvbin_print_case (const char *title, int indent, int x) { spvbin_print_header (title, -1, -1, indent); printf ("%d\n", x); } struct spvbin_position spvbin_position_save (const struct spvbin_input *input) { struct spvbin_position pos = { input->ofs }; return pos; } void spvbin_position_restore (struct spvbin_position *pos, struct spvbin_input *input) { input->ofs = pos->ofs; } static bool spvbin_limit_parse__ (struct spvbin_limit *limit, struct spvbin_input *input, uint32_t (*raw_to_native32) (uint32_t)) { limit->size = input->size; uint32_t count; if (input->size - input->ofs < sizeof count) return false; const uint8_t *src = &input->data[input->ofs]; count = raw_to_native32 (get_uint32 (src)); if (input->size - input->ofs - sizeof count < count) return false; input->ofs += sizeof count; input->size = input->ofs + count; return true; } bool spvbin_limit_parse (struct spvbin_limit *limit, struct spvbin_input *input) { return spvbin_limit_parse__ (limit, input, le_to_native32); } bool spvbin_limit_parse_be (struct spvbin_limit *limit, struct spvbin_input *input) { return spvbin_limit_parse__ (limit, input, be_to_native32); } void spvbin_limit_pop (struct spvbin_limit *limit, struct spvbin_input *input) { input->size = limit->size; } pspp-1.4.1/src/output/spv/spv-legacy-data.h0000644000175000017500000000545413602145300020206 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2018 Free Software Foundation, Inc. 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 3 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, see . */ #ifndef OUTPUT_SPV_LEGACY_DATA_H #define OUTPUT_SPV_LEGACY_DATA_H 1 /* SPSS Viewer (SPV) legacy binary data decoder. Used by spv.h, not useful directly. */ #include #include #include #include #include "libpspp/compiler.h" struct spv_data { struct spv_data_source *sources; size_t n_sources; }; void spv_data_uninit (struct spv_data *); void spv_data_dump (const struct spv_data *, FILE *); struct spv_data_source *spv_data_find_source (const struct spv_data *, const char *source_name); struct spv_data_variable *spv_data_find_variable (const struct spv_data *, const char *source_name, const char *variable_name); struct spv_data_source { char *source_name; struct spv_data_variable *vars; size_t n_vars, n_values; }; void spv_data_source_uninit (struct spv_data_source *); void spv_data_source_dump (const struct spv_data_source *, FILE *); struct spv_data_variable *spv_data_source_find_variable ( const struct spv_data_source *, const char *variable_name); struct spv_data_variable { char *var_name; struct spv_data_value *values; size_t n_values; }; void spv_data_variable_uninit (struct spv_data_variable *); void spv_data_variable_dump (const struct spv_data_variable *, FILE *); struct spv_data_value { double index; int width; union { double d; char *s; }; }; void spv_data_value_uninit (struct spv_data_value *); bool spv_data_value_equal (const struct spv_data_value *, const struct spv_data_value *); struct spv_data_value *spv_data_values_clone (const struct spv_data_value *, size_t n); char *spv_legacy_data_decode (const uint8_t *in, size_t size, struct spv_data *out) WARN_UNUSED_RESULT; void spv_data_value_dump (const struct spv_data_value *, FILE *); #endif /* output/spv/spv-legacy-data.h */ pspp-1.4.1/src/output/spv/spv-output.c0000644000175000017500000000342513602145300017362 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2018 Free Software Foundation, Inc. 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 3 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, see . */ #include #include "output/spv/spv-output.h" #include "output/pivot-table.h" #include "output/spv/spv.h" #include "output/text-item.h" #include "gl/xalloc.h" void spv_text_submit (const struct spv_item *in) { enum spv_item_class class = spv_item_get_class (in); enum text_item_type type = (class == SPV_CLASS_HEADINGS ? TEXT_ITEM_TITLE : class == SPV_CLASS_PAGETITLE ? TEXT_ITEM_PAGE_TITLE : TEXT_ITEM_LOG); const struct pivot_value *value = spv_item_get_text (in); char *text = pivot_value_to_string (value, SETTINGS_VALUE_SHOW_DEFAULT, SETTINGS_VALUE_SHOW_DEFAULT); struct text_item *item = text_item_create_nocopy (type, text); const struct font_style *font = value->font_style; if (font) { item->bold = font->bold; item->italic = font->italic; item->underline = font->underline; item->markup = font->markup; if (font->typeface) item->typeface = xstrdup (font->typeface); item->size = font->size; } text_item_submit (item); } pspp-1.4.1/src/output/spv/spv-writer.c0000644000175000017500000006737013602145300017347 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2019 Free Software Foundation, Inc. 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 3 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, see . */ #include #include "output/spv/spv-writer.h" #include #include #include #include #include #include "libpspp/array.h" #include "libpspp/assertion.h" #include "libpspp/cast.h" #include "libpspp/float-format.h" #include "libpspp/integer-format.h" #include "libpspp/temp-file.h" #include "libpspp/version.h" #include "libpspp/zip-writer.h" #include "output/page-setup-item.h" #include "output/pivot-table.h" #include "output/text-item.h" #include "gl/xalloc.h" #include "gl/xvasprintf.h" #include "gettext.h" #define _(msgid) gettext (msgid) #define N_(msgid) (msgid) struct spv_writer { struct zip_writer *zw; FILE *heading; int heading_depth; xmlTextWriter *xml; int n_tables; int n_headings; struct page_setup *page_setup; bool need_page_break; }; char * WARN_UNUSED_RESULT spv_writer_open (const char *filename, struct spv_writer **writerp) { *writerp = NULL; struct zip_writer *zw = zip_writer_create (filename); if (!zw) return xasprintf (_("%s: create failed"), filename); struct spv_writer *w = xmalloc (sizeof *w); *w = (struct spv_writer) { .zw = zw }; *writerp = w; return NULL; } char * WARN_UNUSED_RESULT spv_writer_close (struct spv_writer *w) { if (!w) return NULL; zip_writer_add_string (w->zw, "META-INF/MANIFEST.MF", "allowPivoting=true"); while (w->heading_depth) spv_writer_close_heading (w); char *error = NULL; if (!zip_writer_close (w->zw)) error = xstrdup (_("I/O error writing SPV file")); page_setup_destroy (w->page_setup); free (w); return error; } void spv_writer_set_page_setup (struct spv_writer *w, const struct page_setup *page_setup) { page_setup_destroy (w->page_setup); w->page_setup = page_setup_clone (page_setup); } static void write_attr (struct spv_writer *w, const char *name, const char *value) { xmlTextWriterWriteAttribute (w->xml, CHAR_CAST (xmlChar *, name), CHAR_CAST (xmlChar *, value)); } static void PRINTF_FORMAT (3, 4) write_attr_format (struct spv_writer *w, const char *name, const char *format, ...) { va_list args; va_start (args, format); char *value = xvasprintf (format, args); va_end (args); write_attr (w, name, value); free (value); } static void start_elem (struct spv_writer *w, const char *name) { xmlTextWriterStartElement (w->xml, CHAR_CAST (xmlChar *, name)); } static void end_elem (struct spv_writer *w) { xmlTextWriterEndElement (w->xml); } static void write_text (struct spv_writer *w, const char *text) { xmlTextWriterWriteString (w->xml, CHAR_CAST (xmlChar *, text)); } static void write_page_heading (struct spv_writer *w, const struct page_heading *h, const char *name) { start_elem (w, name); if (h->n) { start_elem (w, "pageParagraph"); for (size_t i = 0; i < h->n; i++) { start_elem (w, "text"); write_attr (w, "type", "title"); write_text (w, h->paragraphs[i].markup); /* XXX */ end_elem (w); } end_elem (w); } end_elem (w); } static void write_page_setup (struct spv_writer *w, const struct page_setup *ps) { start_elem (w, "pageSetup"); write_attr_format (w, "initial-page-number", "%d", ps->initial_page_number); write_attr (w, "chart-size", (ps->chart_size == PAGE_CHART_AS_IS ? "as-is" : ps->chart_size == PAGE_CHART_FULL_HEIGHT ? "full-height" : ps->chart_size == PAGE_CHART_HALF_HEIGHT ? "half-height" : "quarter-height")); write_attr_format (w, "margin-left", "%.2fin", ps->margins[TABLE_HORZ][0]); write_attr_format (w, "margin-right", "%.2fin", ps->margins[TABLE_HORZ][1]); write_attr_format (w, "margin-top", "%.2fin", ps->margins[TABLE_VERT][0]); write_attr_format (w, "margin-bottom", "%.2fin", ps->margins[TABLE_VERT][1]); write_attr_format (w, "paper-height", "%.2fin", ps->paper[TABLE_VERT]); write_attr_format (w, "paper-width", "%.2fin", ps->paper[TABLE_HORZ]); write_attr (w, "reference-orientation", ps->orientation == PAGE_PORTRAIT ? "portrait" : "landscape"); write_attr_format (w, "space-after", "%.1fpt", ps->object_spacing * 72.0); write_page_heading (w, &ps->headings[0], "pageHeader"); write_page_heading (w, &ps->headings[1], "pageFooter"); end_elem (w); } static bool spv_writer_open_file (struct spv_writer *w) { w->heading = create_temp_file (); if (!w->heading) return false; w->xml = xmlNewTextWriter (xmlOutputBufferCreateFile (w->heading, NULL)); xmlTextWriterStartDocument (w->xml, NULL, "UTF-8", NULL); start_elem (w, "heading"); time_t t = time (NULL); struct tm *tm = gmtime (&t); char *tm_s = asctime (tm); write_attr (w, "creation-date-time", tm_s); write_attr (w, "creator", version); write_attr (w, "creator-version", "21"); write_attr (w, "xmlns", "http://xml.spss.com/spss/viewer/viewer-tree"); write_attr (w, "xmlns:vps", "http://xml.spss.com/spss/viewer/viewer-pagesetup"); write_attr (w, "xmlns:vtx", "http://xml.spss.com/spss/viewer/viewer-text"); write_attr (w, "xmlns:vtb", "http://xml.spss.com/spss/viewer/viewer-table"); start_elem (w, "label"); write_text (w, _("Output")); end_elem (w); if (w->page_setup) { write_page_setup (w, w->page_setup); page_setup_destroy (w->page_setup); w->page_setup = NULL; } return true; } void spv_writer_open_heading (struct spv_writer *w, const char *command_id, const char *label) { if (!w->heading) { if (!spv_writer_open_file (w)) return; } w->heading_depth++; start_elem (w, "heading"); write_attr (w, "commandName", command_id); /* XXX locale */ /* XXX olang */ start_elem (w, "label"); write_text (w, label); end_elem (w); } static void spv_writer_close_file (struct spv_writer *w, const char *infix) { if (!w->heading) return; end_elem (w); xmlTextWriterEndDocument (w->xml); xmlFreeTextWriter (w->xml); char *member_name = xasprintf ("outputViewer%010d%s.xml", w->n_headings++, infix); zip_writer_add (w->zw, w->heading, member_name); free (member_name); w->heading = NULL; } void spv_writer_close_heading (struct spv_writer *w) { const char *infix = ""; if (w->heading_depth) { infix = "_heading"; end_elem (w); w->heading_depth--; } if (!w->heading_depth) spv_writer_close_file (w, infix); } static void start_container (struct spv_writer *w) { start_elem (w, "container"); write_attr (w, "visibility", "visible"); if (w->need_page_break) { write_attr (w, "page-break-before", "always"); w->need_page_break = false; } } void spv_writer_put_text (struct spv_writer *w, const struct text_item *text, const char *command_id) { if (text->type == TEXT_ITEM_EJECT_PAGE) w->need_page_break = true; bool initial_depth = w->heading_depth; if (!initial_depth) spv_writer_open_file (w); start_container (w); start_elem (w, "label"); write_text (w, (text->type == TEXT_ITEM_TITLE ? "Title" : text->type == TEXT_ITEM_PAGE_TITLE ? "Page Title" : "Log")); end_elem (w); start_elem (w, "vtx:text"); write_attr (w, "type", (text->type == TEXT_ITEM_TITLE ? "title" : text->type == TEXT_ITEM_PAGE_TITLE ? "page-title" : "log")); if (command_id) write_attr (w, "commandName", command_id); start_elem (w, "html"); write_text (w, text->text); /* XXX */ end_elem (w); /* html */ end_elem (w); /* vtx:text */ end_elem (w); /* container */ if (!initial_depth) spv_writer_close_file (w, ""); } #define H TABLE_HORZ #define V TABLE_VERT struct buf { uint8_t *data; size_t len; size_t allocated; }; static uint8_t * put_uninit (struct buf *b, size_t n) { while (b->allocated - b->len < n) b->data = x2nrealloc (b->data, &b->allocated, sizeof b->data); uint8_t *p = &b->data[b->len]; b->len += n; return p; } static void put_byte (struct buf *b, uint8_t byte) { *put_uninit (b, 1) = byte; } static void put_bool (struct buf *b, bool boolean) { put_byte (b, boolean); } static void put_bytes (struct buf *b, const char *bytes, size_t n) { memcpy (put_uninit (b, n), bytes, n); } static void put_u16 (struct buf *b, uint16_t x) { put_uint16 (native_to_le16 (x), put_uninit (b, sizeof x)); } static void put_u32 (struct buf *b, uint32_t x) { put_uint32 (native_to_le32 (x), put_uninit (b, sizeof x)); } static void put_u64 (struct buf *b, uint64_t x) { put_uint64 (native_to_le64 (x), put_uninit (b, sizeof x)); } static void put_be32 (struct buf *b, uint32_t x) { put_uint32 (native_to_be32 (x), put_uninit (b, sizeof x)); } static void put_double (struct buf *b, double x) { float_convert (FLOAT_NATIVE_DOUBLE, &x, FLOAT_IEEE_DOUBLE_LE, put_uninit (b, 8)); } static void put_float (struct buf *b, float x) { float_convert (FLOAT_NATIVE_FLOAT, &x, FLOAT_IEEE_SINGLE_LE, put_uninit (b, 4)); } static void put_string (struct buf *b, const char *s_) { const char *s = s_ ? s_ : ""; size_t len = strlen (s); put_u32 (b, len); memcpy (put_uninit (b, len), s, len); } static void put_bestring (struct buf *b, const char *s_) { const char *s = s_ ? s_ : ""; size_t len = strlen (s); put_be32 (b, len); memcpy (put_uninit (b, len), s, len); } static size_t start_count (struct buf *b) { put_u32 (b, 0); return b->len; } static void end_count_u32 (struct buf *b, size_t start) { put_uint32 (native_to_le32 (b->len - start), &b->data[start - 4]); } static void end_count_be32 (struct buf *b, size_t start) { put_uint32 (native_to_be32 (b->len - start), &b->data[start - 4]); } static void put_color (struct buf *buf, const struct cell_color *color) { char *s = xasprintf ("#%02"PRIx8"%02"PRIx8"%02"PRIx8, color->r, color->g, color->b); put_string (buf, s); free (s); } static void put_font_style (struct buf *buf, const struct font_style *font_style) { put_bool (buf, font_style->bold); put_bool (buf, font_style->italic); put_bool (buf, font_style->underline); put_bool (buf, 1); put_color (buf, &font_style->fg[0]); put_color (buf, &font_style->bg[0]); put_string (buf, font_style->typeface ? font_style->typeface : "SansSerif"); put_byte (buf, ceil (font_style->size * 1.33)); } static void put_halign (struct buf *buf, enum table_halign halign, uint32_t mixed, uint32_t decimal) { put_u32 (buf, (halign == TABLE_HALIGN_RIGHT ? 4 : halign == TABLE_HALIGN_LEFT ? 2 : halign == TABLE_HALIGN_CENTER ? 0 : halign == TABLE_HALIGN_MIXED ? mixed : decimal)); } static void put_valign (struct buf *buf, enum table_valign valign) { put_u32 (buf, (valign == TABLE_VALIGN_TOP ? 1 : valign == TABLE_VALIGN_CENTER ? 0 : 3)); } static void put_cell_style (struct buf *buf, const struct cell_style *cell_style) { put_halign (buf, cell_style->halign, 0xffffffad, 6); put_valign (buf, cell_style->valign); put_double (buf, cell_style->decimal_offset); put_u16 (buf, cell_style->margin[H][0]); put_u16 (buf, cell_style->margin[H][1]); put_u16 (buf, cell_style->margin[V][0]); put_u16 (buf, cell_style->margin[V][1]); } static void UNUSED put_style_pair (struct buf *buf, const struct font_style *font_style, const struct cell_style *cell_style) { if (font_style) { put_byte (buf, 0x31); put_font_style (buf, font_style); } else put_byte (buf, 0x58); if (cell_style) { put_byte (buf, 0x31); put_cell_style (buf, cell_style); } else put_byte (buf, 0x58); } static void put_value_mod (struct buf *buf, const struct pivot_value *value, const char *template) { if (value->n_footnotes || value->n_subscripts || template || value->font_style || value->cell_style) { put_byte (buf, 0x31); /* Footnotes. */ put_u32 (buf, value->n_footnotes); for (size_t i = 0; i < value->n_footnotes; i++) put_u16 (buf, value->footnotes[i]->idx); /* Subscripts. */ put_u32 (buf, value->n_subscripts); for (size_t i = 0; i < value->n_subscripts; i++) put_string (buf, value->subscripts[i]); /* Template and style. */ uint32_t v3_start = start_count (buf); uint32_t template_string_start = start_count (buf); if (template) { uint32_t inner_start = start_count (buf); end_count_u32 (buf, inner_start); put_byte (buf, 0x31); put_string (buf, template); } end_count_u32 (buf, template_string_start); put_style_pair (buf, value->font_style, value->cell_style); end_count_u32 (buf, v3_start); } else put_byte (buf, 0x58); } static void put_format (struct buf *buf, const struct fmt_spec *f) { put_u32 (buf, (fmt_to_io (f->type) << 16) | (f->w << 8) | f->d); } static int show_values_to_spvlb (enum settings_value_show show) { return (show == SETTINGS_VALUE_SHOW_DEFAULT ? 0 : show == SETTINGS_VALUE_SHOW_VALUE ? 1 : show == SETTINGS_VALUE_SHOW_LABEL ? 2 : 3); } static void put_show_values (struct buf *buf, enum settings_value_show show) { put_byte (buf, show_values_to_spvlb (show)); } static void put_value (struct buf *buf, const struct pivot_value *value) { switch (value->type) { case PIVOT_VALUE_NUMERIC: if (value->numeric.var_name || value->numeric.value_label) { put_byte (buf, 2); put_value_mod (buf, value, NULL); put_format (buf, &value->numeric.format); put_double (buf, value->numeric.x); put_string (buf, value->numeric.var_name); put_string (buf, value->numeric.value_label); put_show_values (buf, value->numeric.show); } else { put_byte (buf, 1); put_value_mod (buf, value, NULL); put_format (buf, &value->numeric.format); put_double (buf, value->numeric.x); } break; case PIVOT_VALUE_STRING: put_byte (buf, 4); put_value_mod (buf, value, NULL); put_format (buf, &(struct fmt_spec) { FMT_A, strlen (value->string.s), 0 }); put_string (buf, value->string.value_label); put_string (buf, value->string.var_name); put_show_values (buf, value->string.show); put_string (buf, value->string.s); break; case PIVOT_VALUE_VARIABLE: put_byte (buf, 5); put_value_mod (buf, value, NULL); put_string (buf, value->variable.var_name); put_string (buf, value->variable.var_label); put_show_values (buf, value->variable.show); break; case PIVOT_VALUE_TEXT: put_byte (buf, 3); put_string (buf, value->text.local); put_value_mod (buf, value, NULL); put_string (buf, value->text.id); put_string (buf, value->text.c); put_byte (buf, 1); /* XXX user-provided */ break; case PIVOT_VALUE_TEMPLATE: put_byte (buf, 0); put_value_mod (buf, value, value->template.id); put_string (buf, value->template.local); put_u32 (buf, value->template.n_args); for (size_t i = 0; i < value->template.n_args; i++) { const struct pivot_argument *arg = &value->template.args[i]; assert (arg->n >= 1); if (arg->n > 1) { put_u32 (buf, arg->n); put_u32 (buf, 0); for (size_t j = 0; j < arg->n; j++) { if (j > 0) put_bytes (buf, "\0\0\0\0", 4); put_value (buf, arg->values[j]); } } else { put_u32 (buf, 0); put_value (buf, arg->values[0]); } } break; default: NOT_REACHED (); } } static void put_optional_value (struct buf *buf, const struct pivot_value *value) { if (value) { put_byte (buf, 0x31); put_value (buf, value); } else put_byte (buf, 0x58); } static void put_category (struct buf *buf, const struct pivot_category *c) { put_value (buf, c->name); if (pivot_category_is_leaf (c)) { put_bytes (buf, "\0\0\0", 3); put_u32 (buf, 2); put_u32 (buf, c->data_index); put_u32 (buf, 0); } else { put_bytes (buf, "\0\0\1", 3); put_u32 (buf, 0); put_u32 (buf, -1); put_u32 (buf, c->n_subs); for (size_t i = 0; i < c->n_subs; i++) put_category (buf, c->subs[i]); } } static void put_y0 (struct buf *buf, const struct pivot_table *table) { put_u32 (buf, table->epoch); put_byte (buf, table->decimal); put_byte (buf, table->grouping); } static void put_custom_currency (struct buf *buf, const struct pivot_table *table) { put_u32 (buf, 5); for (int i = 0; i < 5; i++) put_string (buf, table->ccs[i]); } static void put_x1 (struct buf *buf, const struct pivot_table *table) { put_bytes (buf, "\0\1\0", 3); put_byte (buf, 0); put_show_values (buf, table->show_variables); put_show_values (buf, table->show_values); put_u32 (buf, -1); put_u32 (buf, -1); for (int i = 0; i < 17; i++) put_byte (buf, 0); put_bool (buf, false); put_byte (buf, 1); } static void put_x2 (struct buf *buf) { put_u32 (buf, 0); /* n-row-heights */ put_u32 (buf, 0); /* n-style-map */ put_u32 (buf, 0); /* n-styles */ put_u32 (buf, 0); } static void put_x3 (struct buf *buf, const struct pivot_table *table) { put_bytes (buf, "\1\0\4\0\0\0", 6); put_string (buf, table->command_c); put_string (buf, table->command_local); put_string (buf, table->language); put_string (buf, "UTF-8"); /* XXX */ put_string (buf, table->locale); put_bytes (buf, "\0\0\1\1", 4); put_y0 (buf, table); put_double (buf, table->small); put_byte (buf, 1); put_string (buf, table->dataset); put_string (buf, table->datafile); put_u32 (buf, 0); put_u32 (buf, table->date); put_u32 (buf, 0); /* Y2. */ put_custom_currency (buf, table); put_byte (buf, '.'); put_bool (buf, 0); } static void put_light_table (struct buf *buf, uint64_t table_id, const struct pivot_table *table) { /* Header. */ put_bytes (buf, "\1\0", 2); put_u32 (buf, 3); put_bool (buf, true); put_bool (buf, false); put_bool (buf, table->rotate_inner_column_labels); put_bool (buf, table->rotate_outer_row_labels); put_bool (buf, true); put_u32 (buf, 0x15); put_u32 (buf, table->sizing[H].range[0]); put_u32 (buf, table->sizing[H].range[1]); put_u32 (buf, table->sizing[V].range[0]); put_u32 (buf, table->sizing[V].range[1]); put_u64 (buf, table_id); /* Titles. */ put_value (buf, table->title); put_value (buf, table->subtype); put_optional_value (buf, table->title); put_optional_value (buf, table->corner_text); put_optional_value (buf, table->caption); /* Footnotes. */ put_u32 (buf, table->n_footnotes); for (size_t i = 0; i < table->n_footnotes; i++) { put_value (buf, table->footnotes[i]->content); put_optional_value (buf, table->footnotes[i]->marker); put_u32 (buf, 0); } /* Areas. */ for (size_t i = 0; i < PIVOT_N_AREAS; i++) { const struct area_style *a = &table->areas[i]; put_byte (buf, i + 1); put_byte (buf, 0x31); put_string (buf, (a->font_style.typeface ? a->font_style.typeface : "SansSerif")); put_float (buf, ceil (a->font_style.size * 1.33)); put_u32 (buf, ((a->font_style.bold ? 1 : 0) | (a->font_style.italic ? 2 : 0))); put_bool (buf, a->font_style.underline); put_halign (buf, a->cell_style.halign, 64173, 61453); put_valign (buf, a->cell_style.valign); put_color (buf, &a->font_style.fg[0]); put_color (buf, &a->font_style.bg[0]); bool alt = (!cell_color_equal (&a->font_style.fg[0], &a->font_style.fg[1]) || !cell_color_equal (&a->font_style.bg[0], &a->font_style.bg[1])); put_bool (buf, alt); if (alt) { put_color (buf, &a->font_style.fg[1]); put_color (buf, &a->font_style.bg[1]); } else { put_string (buf, ""); put_string (buf, ""); } put_u32 (buf, a->cell_style.margin[H][0]); put_u32 (buf, a->cell_style.margin[H][1]); put_u32 (buf, a->cell_style.margin[V][0]); put_u32 (buf, a->cell_style.margin[V][1]); } /* Borders. */ uint32_t borders_start = start_count (buf); put_be32 (buf, 1); put_be32 (buf, PIVOT_N_BORDERS); for (size_t i = 0; i < PIVOT_N_BORDERS; i++) { const struct table_border_style *b = &table->borders[i]; put_be32 (buf, i); put_be32 (buf, (b->stroke == TABLE_STROKE_NONE ? 0 : b->stroke == TABLE_STROKE_SOLID ? 1 : b->stroke == TABLE_STROKE_DASHED ? 2 : b->stroke == TABLE_STROKE_THICK ? 3 : b->stroke == TABLE_STROKE_THIN ? 4 : 5)); put_be32 (buf, ((b->color.alpha << 24) | (b->color.r << 16) | (b->color.g << 8) | b->color.b)); } put_bool (buf, table->show_grid_lines); put_bytes (buf, "\0\0\0", 3); end_count_u32 (buf, borders_start); /* Print Settings. */ uint32_t ps_start = start_count (buf); put_be32 (buf, 1); put_bool (buf, table->print_all_layers); put_bool (buf, table->paginate_layers); put_bool (buf, table->shrink_to_fit[H]); put_bool (buf, table->shrink_to_fit[V]); put_bool (buf, table->top_continuation); put_bool (buf, table->bottom_continuation); put_be32 (buf, table->n_orphan_lines); put_bestring (buf, table->continuation); end_count_u32 (buf, ps_start); /* Table Settings. */ uint32_t ts_start = start_count (buf); put_be32 (buf, 1); put_be32 (buf, 4); put_be32 (buf, 0); /* XXX current_layer */ put_bool (buf, table->omit_empty); put_bool (buf, table->row_labels_in_corner); put_bool (buf, !table->show_numeric_markers); put_bool (buf, table->footnote_marker_superscripts); put_byte (buf, 0); uint32_t keep_start = start_count (buf); put_be32 (buf, 0); /* n-row-breaks */ put_be32 (buf, 0); /* n-column-breaks */ put_be32 (buf, 0); /* n-row-keeps */ put_be32 (buf, 0); /* n-column-keeps */ put_be32 (buf, 0); /* n-row-point-keeps */ put_be32 (buf, 0); /* n-column-point-keeps */ end_count_be32 (buf, keep_start); put_bestring (buf, table->notes); put_bestring (buf, table->table_look); for (size_t i = 0; i < 82; i++) put_byte (buf, 0); end_count_u32 (buf, ts_start); /* Formats. */ put_u32 (buf, 0); /* n-widths */ put_string (buf, "en_US.ISO_8859-1:1987"); /* XXX */ put_u32 (buf, 0); /* XXX current-layer */ put_bool (buf, 0); put_bool (buf, 0); put_bool (buf, 1); put_y0 (buf, table); put_custom_currency (buf, table); uint32_t formats_start = start_count (buf); uint32_t x1_start = start_count (buf); put_x1 (buf, table); uint32_t x2_start = start_count (buf); put_x2 (buf); end_count_u32 (buf, x2_start); end_count_u32 (buf, x1_start); uint32_t x3_start = start_count (buf); put_x3 (buf, table); end_count_u32 (buf, x3_start); end_count_u32 (buf, formats_start); /* Dimensions. */ put_u32 (buf, table->n_dimensions); int *x2 = xnmalloc (table->n_dimensions, sizeof *x2); for (size_t i = 0; i < table->axes[PIVOT_AXIS_LAYER].n_dimensions; i++) x2[i] = 2; for (size_t i = 0; i < table->axes[PIVOT_AXIS_ROW].n_dimensions; i++) x2[i + table->axes[PIVOT_AXIS_LAYER].n_dimensions] = 0; for (size_t i = 0; i < table->axes[PIVOT_AXIS_COLUMN].n_dimensions; i++) x2[i + table->axes[PIVOT_AXIS_LAYER].n_dimensions + table->axes[PIVOT_AXIS_ROW].n_dimensions] = 1; for (size_t i = 0; i < table->n_dimensions; i++) { const struct pivot_dimension *d = table->dimensions[i]; put_value (buf, d->root->name); put_byte (buf, 0); put_byte (buf, x2[i]); put_u32 (buf, 2); put_bool (buf, !d->root->show_label); put_bool (buf, d->hide_all_labels); put_bool (buf, 1); put_u32 (buf, i); put_u32 (buf, d->root->n_subs); for (size_t j = 0; j < d->root->n_subs; j++) put_category (buf, d->root->subs[j]); } free (x2); /* Axes. */ put_u32 (buf, table->axes[PIVOT_AXIS_LAYER].n_dimensions); put_u32 (buf, table->axes[PIVOT_AXIS_ROW].n_dimensions); put_u32 (buf, table->axes[PIVOT_AXIS_COLUMN].n_dimensions); for (size_t i = 0; i < table->axes[PIVOT_AXIS_LAYER].n_dimensions; i++) put_u32 (buf, table->axes[PIVOT_AXIS_LAYER].dimensions[i]->top_index); for (size_t i = 0; i < table->axes[PIVOT_AXIS_ROW].n_dimensions; i++) put_u32 (buf, table->axes[PIVOT_AXIS_ROW].dimensions[i]->top_index); for (size_t i = 0; i < table->axes[PIVOT_AXIS_COLUMN].n_dimensions; i++) put_u32 (buf, table->axes[PIVOT_AXIS_COLUMN].dimensions[i]->top_index); /* Cells. */ put_u32 (buf, hmap_count (&table->cells)); const struct pivot_cell *cell; HMAP_FOR_EACH (cell, struct pivot_cell, hmap_node, &table->cells) { uint64_t index = 0; for (size_t j = 0; j < table->n_dimensions; j++) index = (table->dimensions[j]->n_leaves * index) + cell->idx[j]; put_u64 (buf, index); put_value (buf, cell->value); } } void spv_writer_put_table (struct spv_writer *w, const struct pivot_table *table) { struct pivot_table *table_rw = CONST_CAST (struct pivot_table *, table); if (!table_rw->subtype) table_rw->subtype = pivot_value_new_user_text ("unknown", -1); int table_id = ++w->n_tables; bool initial_depth = w->heading_depth; if (!initial_depth) spv_writer_open_file (w); start_container (w); char *title = pivot_value_to_string (table->title, SETTINGS_VALUE_SHOW_DEFAULT, SETTINGS_VALUE_SHOW_DEFAULT); char *subtype = pivot_value_to_string (table->subtype, SETTINGS_VALUE_SHOW_DEFAULT, SETTINGS_VALUE_SHOW_DEFAULT); start_elem (w, "label"); write_text (w, title); end_elem (w); start_elem (w, "vtb:table"); write_attr (w, "commandName", table->command_c); write_attr (w, "type", "table"); /* XXX */ write_attr (w, "subType", subtype); write_attr_format (w, "tableId", "%d", table_id); free (subtype); free (title); start_elem (w, "vtb:tableStructure"); start_elem (w, "vtb:dataPath"); char *data_path = xasprintf ("%010d_lightTableData.bin", table_id); write_text (w, data_path); end_elem (w); /* vtb:dataPath */ end_elem (w); /* vtb:tableStructure */ end_elem (w); /* vtb:table */ end_elem (w); /* container */ if (!initial_depth) spv_writer_close_file (w, ""); struct buf buf = { NULL, 0, 0 }; put_light_table (&buf, table_id, table); zip_writer_add_memory (w->zw, data_path, buf.data, buf.len); free (buf.data); free (data_path); } pspp-1.4.1/src/output/spv/xml-parser-generator0000644000175000017500000011260213723216277021067 0ustar00blpblp00000000000000#! /usr/bin/python # PSPP - a program for statistical analysis. # Copyright (C) 2017, 2018, 2019 Free Software Foundation, Inc. # # 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 3 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, see . import getopt import os import re import struct import sys n_errors = 0 def error(msg): global n_errors sys.stderr.write("%s:%d: %s\n" % (file_name, line_number, msg)) n_errors += 1 def fatal(msg): error(msg) sys.exit(1) def get_line(): global line global line_number line = input_file.readline() line = re.sub('#.*', '\n', line) line_number += 1 def expect(type): if token[0] != type: fatal("syntax error expecting %s" % type) def match(type): if token[0] == type: get_token() return True else: return False def must_match(type): expect(type) get_token() def match_id(id_): if token == ('id', id_): get_token() return True else: return False def is_idchar(c): return c.isalnum() or c in '-_' def get_token(): global token global line prev = token while True: if line == "": if token == ('eof', ): fatal("unexpected end of input") get_line() if not line: token = ('eof', ) break elif line == '\n': token = (';', ) break line = line.lstrip() if line == "": continue if line.startswith('=>'): token = (line[:2],) line = line[2:] elif line[0] in '[]()?|*+=:': token = (line[0],) line = line[1:] elif is_idchar(line[0]): n = 1 while n < len(line) and is_idchar(line[n]): n += 1 s = line[:n] token = ('id', s) line = line[n:] else: fatal("unknown character %c" % line[0]) break def usage(): argv0 = os.path.basename(sys.argv[0]) print('''\ %(argv0)s, parser generator for SPV XML members usage: %(argv0)s GRAMMAR header PREFIX %(argv0)s GRAMMAR code PREFIX HEADER_NAME where GRAMMAR contains grammar definitions\ ''' % {"argv0": argv0}) sys.exit(0) def parse_term(): if match('('): sub = parse_alternation() must_match(')') return sub else: member_name, nonterminal_name = parse_name() if member_name.isupper(): fatal('%s; unknown terminal' % member_name) else: return {'type': 'nonterminal', 'nonterminal_name': nonterminal_name, 'member_name': member_name} def parse_quantified(): item = parse_term() if token[0] in ['*', '+', '?']: item = {'type': token[0], 'item': item} get_token() return item def parse_sequence(): if match_id('EMPTY'): return {'type': 'empty'} items = [] while True: sub = parse_quantified() if sub['type'] == 'sequence': items.extend(sub[1:]) else: items.append(sub) if token[0] in ('|', ';', ')', 'eof'): break return {'type': 'sequence', 'items': items} if len(items) > 1 else items[0] def parse_alternation(): items = [parse_sequence()] while match('|'): items.append(parse_sequence()) if len(items) > 1: return {'type': '|', 'items': items} else: return items[0] def parse_name(): # The name used in XML for the attribute or element always comes # first. expect('id') xml_name = token[1] get_token() # If a different name is needed to disambiguate when the same name # is used in different contexts in XML, it comes later, in # brackets. if match('['): expect('id') unique_name = token[1] get_token() must_match(']') else: unique_name = xml_name return unique_name, xml_name enums = {} def parse_production(): unique_name, xml_name = parse_name() attr_xml_names = set() attributes = {} while match(':'): attr_unique_name, attr_xml_name = parse_name() if match('='): if match('('): attr_value = set() while not match(')'): expect('id') attr_value.add(token[1]) get_token() match('|') global enums if attr_unique_name not in enums: enums[attr_unique_name] = attr_value elif enums[attr_unique_name] != attr_value: sys.stderr.write('%s: different enums with same name\n' % attr_unique_name) sys.exit(1) elif match_id('bool'): attr_value = set(('true', 'false')) elif match_id('dimension'): attr_value = 'dimension' elif match_id('real'): attr_value = 'real' elif match_id('int'): attr_value = 'int' elif match_id('color'): attr_value = 'color' elif match_id('ref'): if token[0] == 'id': ref_type = token[1] attr_value = ('ref', ref_type) get_token() elif match('('): ref_types = set() while not match(')'): expect('id') ref_types.add(token[1]) get_token() match('|') attr_value = ('ref', ref_types) else: attr_value = ('ref', None) else: fatal("unknown attribute value type") else: attr_value = 'string' attr_required = not match('?') if attr_xml_name == 'id': if attr_value != 'string': fatal("id attribute must have string type") attr_value = 'id' if attr_unique_name in attributes: fatal("production %s has two attributes %s" % (unique_name, attr_unique_name)) if attr_xml_name in attr_xml_names: fatal("production %s has two attributes %s" % (unique_name, attr_xml_name)) attr_xml_names.add(attr_xml_name) attributes[attr_unique_name] = (attr_xml_name, attr_value, attr_required) if 'id' not in attributes: attributes["id"] = ('id', 'id', False) must_match('=>') if match_id('TEXT'): rhs = {'type': 'text'} elif match_id('ETC'): rhs = {'type': 'etc'} else: rhs = parse_alternation() n = 0 for a in rhs['items'] if rhs['type'] == '|' else (rhs,): for term in a['items'] if a['type'] == 'sequence' else (a,): if term['type'] == 'empty': pass elif term['type'] == 'nonterminal': pass elif term['type'] == '?' and term['item']['type'] == 'nonterminal': pass elif (term['type'] in ('*', '+') and term['item']['type'] == 'nonterminal'): pass else: n += 1 term['seq_name'] = 'seq' if n == 1 else 'seq%d' % n return unique_name, xml_name, attributes, rhs used_enums = set() def print_members(attributes, rhs, indent): attrs = [] new_enums = set() for unique_name, (xml_name, value, required) in sorted(attributes.items()): c_name = name_to_id(unique_name) if type(value) is set: if len(value) <= 1: if not required: attrs += [('bool %s_present;' % c_name, 'True if attribute present')] elif value == set(('true', 'false')): if required: attrs += [('bool %s;' % c_name, None)] else: attrs += [('int %s;' % c_name, '-1 if not present, otherwise 0 or 1')] else: attrs += [('enum %s%s %s;' % (prefix, c_name, c_name), 'Always nonzero' if required else 'Zero if not present')] global used_enums if unique_name not in used_enums: new_enums.add(unique_name) elif value == 'dimension' or value == 'real': attrs += [('double %s;' % c_name, 'In inches. ' + ('Always present' if required else 'DBL_MAX if not present'))] elif value == 'int': attrs += [('int %s;' % c_name, 'Always present' if required else 'INT_MIN if not present')] elif value == 'color': attrs += [('int %s;' % c_name, 'Always present' if required else '-1 if not present')] elif value == 'string': attrs += [('char *%s;' % c_name, 'Always nonnull' if required else 'Possibly null')] elif value[0] == 'ref': struct = ('spvxml_node' if value[1] is None or type(value[1]) is set else '%s%s' % (prefix, name_to_id(value[1]))) attrs += [('struct %s *%s;' % (struct, c_name), 'Always nonnull' if required else 'Possibly null')] elif value == 'id': pass else: assert False for enum_name in sorted(new_enums): used_enums.add(enum_name) c_name = name_to_id(enum_name) print('\nenum %s%s {' % (prefix, c_name)) i = 0 for value in sorted(enums[enum_name]): print(' %s%s_%s%s,' % (prefix.upper(), c_name.upper(), name_to_id(value).upper(), ' = 1' if i == 0 else '')) i += 1 print('};') print('const char *%s%s_to_string (enum %s%s);' % ( prefix, c_name, prefix, c_name)) print('\nstruct %s%s {' % (prefix, name_to_id(name))) print('%sstruct spvxml_node node_;' % indent) if attrs: print('\n%s/* Attributes. */' % indent) for decl, comment in attrs: line = '%s%s' % (indent, decl) if comment: n_spaces = max(35 - len(line), 1) line += '%s/* %s. */' % (' ' * n_spaces, comment) print(line) if rhs['type'] == 'etc' or rhs['type'] == 'empty': return print('\n%s/* Content. */' % indent) if rhs['type'] == 'text': print('%schar *text; /* Always nonnull. */' % indent) return for a in rhs['items'] if rhs['type'] == '|' else (rhs,): for term in a['items'] if a['type'] == 'sequence' else (a,): if term['type'] == 'empty': pass elif term['type'] == 'nonterminal': nt_name = name_to_id(term['nonterminal_name']) member_name = name_to_id(term['member_name']) print('%sstruct %s%s *%s; /* Always nonnull. */' % ( indent, prefix, nt_name, member_name)) elif term['type'] == '?' and term['item']['type'] == 'nonterminal': nt_name = name_to_id(term['item']['nonterminal_name']) member_name = name_to_id(term['item']['member_name']) print('%sstruct %s%s *%s; /* Possibly null. */' % ( indent, prefix, nt_name, member_name)) elif (term['type'] in ('*', '+') and term['item']['type'] == 'nonterminal'): nt_name = name_to_id(term['item']['nonterminal_name']) member_name = name_to_id(term['item']['member_name']) print('%sstruct %s%s **%s;' % (indent, prefix, nt_name, member_name)) print('%ssize_t n_%s;' % (indent, member_name)) else: seq_name = term['seq_name'] print('%sstruct spvxml_node **%s;' % (indent, seq_name)) print('%ssize_t n_%s;' % (indent, seq_name)) def bytes_to_hex(s): return ''.join(['"'] + ["\\x%02x" % ord(x) for x in s] + ['"']) class Parser_Context(object): def __init__(self, function_name, productions): self.suffixes = {} self.bail = 'error' self.need_error_handler = False self.parsers = {} self.parser_index = 0 self.productions = productions self.function_name = function_name self.functions = [] def gen_name(self, prefix): n = self.suffixes.get(prefix, 0) + 1 self.suffixes[prefix] = n return '%s%d' % (prefix, n) if n > 1 else prefix def new_function(self, type_name): f = Function('%s_%d' % (self.function_name, len(self.functions) + 1), type_name) self.functions += [f] return f def print_attribute_decls(name, attributes): if attributes: print(' enum {') for unique_name, (xml_name, value, required) in sorted(attributes.items()): c_name = name_to_id(unique_name) print(' ATTR_%s,' % c_name.upper()) print(' };') print(' struct spvxml_attribute attrs[] = {') for unique_name, (xml_name, value, required) in sorted(attributes.items()): c_name = name_to_id(unique_name) print(' [ATTR_%s] = { "%s", %s, NULL },' % (c_name.upper(), xml_name, 'true' if required else 'false')) print(' };') print(' enum { N_ATTRS = sizeof attrs / sizeof *attrs };') def print_parser_for_attributes(name, attributes): print(' /* Parse attributes. */') print(' spvxml_parse_attributes (&nctx);') if not attributes: return for unique_name, (xml_name, value, required) in sorted(attributes.items()): c_name = name_to_id(unique_name) params = '&nctx, &attrs[ATTR_%s]' % c_name.upper() if type(value) is set: if len(value) <= 1: if required: print(' spvxml_attr_parse_fixed (%s, "%s");' % (params, tuple(value)[0])) else: print(' p->%s_present = spvxml_attr_parse_fixed (\n' ' %s, "%s");' % (c_name, params, tuple(value)[0])) elif value == set(('true', 'false')): print(' p->%s = spvxml_attr_parse_bool (%s);' % (c_name, params)) else: map_name = '%s%s_map' % (prefix, c_name) print(' p->%s = spvxml_attr_parse_enum (\n' ' %s, %s);' % (c_name, params, map_name)) elif value in ('real', 'dimension', 'int', 'color'): print(' p->%s = spvxml_attr_parse_%s (%s);' % (c_name, value, params)) elif value == 'string': print(' p->%s = attrs[ATTR_%s].value;\n' ' attrs[ATTR_%s].value = NULL;' % (c_name, c_name.upper(), c_name.upper())) elif value == 'id': print(' p->node_.id = attrs[ATTR_%s].value;\n' ' attrs[ATTR_%s].value = NULL;' % (c_name.upper(), c_name.upper())) elif value[0] == 'ref': pass else: assert False print('''\ if (ctx->error) { spvxml_node_context_uninit (&nctx); ctx->hard_error = true; %sfree_%s (p); return false; }''' % (prefix, name_to_id(name))) class Function(object): def __init__(self, function_name, type_name): self.function_name = function_name self.type_name = type_name self.suffixes = {} self.code = [] def gen_name(self, prefix): n = self.suffixes.get(prefix, 0) + 1 self.suffixes[prefix] = n return '%s%d' % (prefix, n) if n > 1 else prefix def print_(self): print(''' static bool %s (struct spvxml_node_context *nctx, xmlNode **input, struct %s *p) {''' % (self.function_name, self.type_name)) while self.code and self.code[0] == '': self.code = self.code[1:] for line in self.code: print(' %s' % line if line else '') print(' return true;') print('}') STATE_START = 0 STATE_ALTERNATION = 1 STATE_SEQUENCE = 2 STATE_REPETITION = 3 STATE_OPTIONAL = 4 STATE_GENERAL = 5 def generate_content_parser(nonterminal, rhs, function, ctx, state, seq_name): seq_name = seq_name if seq_name else rhs.get('seq_name') ctx.parser_index += 1 if rhs['type'] == 'etc': function.code += ['spvxml_content_parse_etc (input);'] elif rhs['type'] == 'text': function.code += ['if (!spvxml_content_parse_text (nctx, input, &p->text))', ' return false;'] elif rhs['type'] == '|': for i in range(len(rhs['items'])): choice = rhs['items'][i] subfunc = ctx.new_function(function.type_name) generate_content_parser(nonterminal, choice, subfunc, ctx, STATE_ALTERNATION if state == STATE_START else STATE_GENERAL, seq_name) function.code += ['%(start)s!%(tryfunc)s (nctx, input, p, %(subfunc)s)%(end)s' % {'start': 'if (' if i == 0 else ' && ', 'subfunc': subfunc.function_name, 'tryfunc': '%stry_parse_%s' % (prefix, name_to_id(nonterminal)), 'end': ')' if i == len(rhs['items']) - 1 else ''}] function.code += [' {', ' spvxml_content_error (nctx, *input, "Syntax error.");', ' return false;', ' }'] elif rhs['type'] == 'sequence': for element in rhs['items']: generate_content_parser(nonterminal, element, function, ctx, STATE_SEQUENCE if state in (STATE_START, STATE_ALTERNATION) else STATE_GENERAL, seq_name) elif rhs['type'] == 'empty': function.code += ['(void) nctx;'] function.code += ['(void) input;'] function.code += ['(void) p;'] elif rhs['type'] in ('*', '+', '?'): subfunc = ctx.new_function(function.type_name) generate_content_parser(nonterminal, rhs['item'], subfunc, ctx, (STATE_OPTIONAL if rhs['type'] == '?' else STATE_REPETITION) if state in (STATE_START, STATE_ALTERNATION, STATE_SEQUENCE) else STATE_GENERAL, seq_name) next_name = function.gen_name('next') args = {'subfunc': subfunc.function_name, 'tryfunc': '%stry_parse_%s' % (prefix, name_to_id (nonterminal))} if rhs['type'] == '?': function.code += [ '%(tryfunc)s (nctx, input, p, %(subfunc)s);' % args] else: if rhs['type'] == '+': function.code += ['if (!%(subfunc)s (nctx, input, p))' % args, ' return false;'] function.code += [ 'while (%(tryfunc)s (nctx, input, p, %(subfunc)s))' % args, ' continue;'] elif rhs['type'] == 'nonterminal': node_name = function.gen_name('node') function.code += [ '', 'xmlNode *%s;' % node_name, 'if (!spvxml_content_parse_element (nctx, input, "%s", &%s))' % (ctx.productions[rhs['nonterminal_name']][0], node_name), ' return false;'] if state in (STATE_START, STATE_ALTERNATION, STATE_SEQUENCE, STATE_OPTIONAL): target = '&p->%s' % name_to_id(rhs['member_name']) else: assert state in (STATE_REPETITION, STATE_GENERAL) member = name_to_id(rhs['member_name']) if state == STATE_REPETITION else seq_name function.code += ['struct %s%s *%s;' % ( prefix, name_to_id(rhs['nonterminal_name']), member)] target = '&%s' % member function.code += [ 'if (!%sparse_%s (nctx->up, %s, %s))' % (prefix, name_to_id(rhs['nonterminal_name']), node_name, target), ' return false;'] if state in (STATE_REPETITION, STATE_GENERAL): function.code += [ 'p->%s = xrealloc (p->%s, sizeof *p->%s * (p->n_%s + 1));' % (member, member, member, member), 'p->%s[p->n_%s++] = %s;' % (member, member, '&%s->node_' % member if state == STATE_GENERAL else member)] else: assert False def print_parser(name, production, productions, indent): xml_name, attributes, rhs = production print(''' static bool UNUSED %(prefix)stry_parse_%(name)s ( struct spvxml_node_context *nctx, xmlNode **input, struct %(prefix)s%(name)s *p, bool (*sub) (struct spvxml_node_context *, xmlNode **, struct %(prefix)s%(name)s *)) { xmlNode *next = *input; bool ok = sub (nctx, &next, p); if (ok) *input = next; else if (!nctx->up->hard_error) { free (nctx->up->error); nctx->up->error = NULL; } return ok; }''' % {'prefix': prefix, 'name': name_to_id(name)}) ctx = Parser_Context('%sparse_%s' % (prefix, name_to_id(name)), productions) if rhs['type'] not in ('empty', 'etc'): function = ctx.new_function('%s%s' % (prefix, name_to_id(name))) generate_content_parser(name, rhs, function, ctx, 0, None) for f in reversed(ctx.functions): f.print_() print(''' bool %(prefix)sparse_%(name)s ( struct spvxml_context *ctx, xmlNode *input, struct %(prefix)s%(name)s **p_) {''' % {'prefix': prefix, 'name': name_to_id(name)}) print_attribute_decls(name, attributes) print(' struct spvxml_node_context nctx = {') print(' .up = ctx,') print(' .parent = input,') print(' .attrs = attrs,') print(' .n_attrs = N_ATTRS,') print(' };') print('') print(' *p_ = NULL;') print(' struct %(prefix)s%(name)s *p = xzalloc (sizeof *p);' % {'prefix': prefix, 'name': name_to_id(name)}) print(' p->node_.raw = input;') print(' p->node_.class_ = &%(prefix)s%(name)s_class;' % {'prefix': prefix, 'name': name_to_id(name)}) print('') print_parser_for_attributes(name, attributes) if rhs['type'] == 'empty': print(''' /* Parse content. */ if (!spvxml_content_parse_end (&nctx, input->children)) { ctx->hard_error = true; spvxml_node_context_uninit (&nctx); %sfree_%s (p); return false; }''' % (prefix, name_to_id(name))) elif rhs['type'] == 'etc': print(''' /* Ignore content. */ ''') else: print(''' /* Parse content. */ input = input->children; if (!%s (&nctx, &input, p) || !spvxml_content_parse_end (&nctx, input)) { ctx->hard_error = true; spvxml_node_context_uninit (&nctx); %sfree_%s (p); return false; }''' % (function.function_name, prefix, name_to_id(name))) print(''' spvxml_node_context_uninit (&nctx); *p_ = p; return true;''') print("}") def print_free_members(attributes, rhs, indent): for unique_name, (xml_name, value, required) in attributes.items(): c_name = name_to_id(unique_name) if (type(value) is set or value in ('dimension', 'real', 'int', 'color', 'id') or value[0] == 'ref'): pass elif value == 'string': print(' free (p->%s);' % c_name); else: assert False if rhs['type'] in ('etc', 'empty'): pass elif rhs['type'] == 'text': print(' free (p->text);') else: n = 0 for a in rhs['items'] if rhs['type'] == '|' else (rhs,): for term in a['items'] if a['type'] == 'sequence' else (a,): if term['type'] == 'empty': pass elif (term['type'] == 'nonterminal' or (term['type'] == '?' and term['item']['type'] == 'nonterminal')): if term['type'] == '?': term = term['item'] nt_name = name_to_id(term['nonterminal_name']) member_name = name_to_id(term['member_name']) print(' %sfree_%s (p->%s);' % (prefix, nt_name, member_name)) elif (term['type'] in ('*', '+') and term['item']['type'] == 'nonterminal'): nt_name = name_to_id(term['item']['nonterminal_name']) member_name = name_to_id(term['item']['member_name']) print('''\ for (size_t i = 0; i < p->n_%s; i++) %sfree_%s (p->%s[i]); free (p->%s);''' % (member_name, prefix, nt_name, member_name, member_name)) else: n += 1 seq_name = 'seq' if n == 1 else 'seq%d' % n print('''\ for (size_t i = 0; i < p->n_%s; i++) p->%s[i]->class_->spvxml_node_free (p->%s[i]); free (p->%s);''' % (seq_name, seq_name, seq_name, seq_name)) print(' free (p->node_.id);') print(' free (p);') def print_free(name, production, indent): xml_name, attributes, rhs = production print(''' void %(prefix)sfree_%(name)s (struct %(prefix)s%(name)s *p) { if (!p) return; ''' % {'prefix': prefix, 'name': name_to_id(name)}) print_free_members(attributes, rhs, ' ' * 4) print('}') def name_to_id(s): return s[0].lower() + ''.join(['_%c' % x.lower() if x.isupper() else x for x in s[1:]]).replace('-', '_') def print_recurse_members(attributes, rhs, function): if rhs['type'] == 'etc' or rhs['type'] == 'empty': pass elif rhs['type'] == 'text': pass else: n = 0 for a in rhs['items'] if rhs['type'] == '|' else (rhs,): for term in a['items'] if a['type'] == 'sequence' else (a,): if term['type'] == 'empty': pass elif (term['type'] == 'nonterminal' or (term['type'] == '?' and term['item']['type'] == 'nonterminal')): if term['type'] == '?': term = term['item'] nt_name = name_to_id(term['nonterminal_name']) member_name = name_to_id(term['member_name']) print(' %s%s_%s (ctx, p->%s);' % (prefix, function, nt_name, member_name)) elif (term['type'] in ('*', '+') and term['item']['type'] == 'nonterminal'): nt_name = name_to_id(term['item']['nonterminal_name']) member_name = name_to_id(term['item']['member_name']) print('''\ for (size_t i = 0; i < p->n_%s; i++) %s%s_%s (ctx, p->%s[i]);''' % (member_name, prefix, function, nt_name, member_name)) else: n += 1 seq_name = 'seq' if n == 1 else 'seq%d' % n print('''\ for (size_t i = 0; i < p->n_%s; i++) p->%s[i]->class_->spvxml_node_%s (ctx, p->%s[i]);''' % (seq_name, seq_name, function, seq_name)) def print_collect_ids(name, production): xml_name, attributes, rhs = production print(''' void %(prefix)scollect_ids_%(name)s (struct spvxml_context *ctx, struct %(prefix)s%(name)s *p) { if (!p) return; spvxml_node_collect_id (ctx, &p->node_); ''' % {'prefix': prefix, 'name': name_to_id(name)}) print_recurse_members(attributes, rhs, 'collect_ids') print('}') def print_resolve_refs(name, production): xml_name, attributes, rhs = production print(''' bool %(prefix)sis_%(name)s (const struct spvxml_node *node) { return node->class_ == &%(prefix)s%(name)s_class; } struct %(prefix)s%(name)s * %(prefix)scast_%(name)s (const struct spvxml_node *node) { return (node && %(prefix)sis_%(name)s (node) ? UP_CAST (node, struct %(prefix)s%(name)s, node_) : NULL); } void %(prefix)sresolve_refs_%(name)s (struct spvxml_context *ctx UNUSED, struct %(prefix)s%(name)s *p UNUSED) { if (!p) return; ''' % {'prefix': prefix, 'name': name_to_id(name)}) i = 0 for unique_name, (xml_name, value, required) in sorted(attributes.items()): c_name = name_to_id(unique_name) if type(value) is set or value[0] != 'ref': continue if value[1] is None: print(' p->%s = spvxml_node_resolve_ref (ctx, p->node_.raw, \"%s\", NULL, 0);' % (c_name, xml_name)) else: i += 1 name = 'classes' if i > 1: name += '%d' % i if type(value[1]) is set: print(' static const struct spvxml_node_class *const %s[] = {' % name) for ref_type in sorted(value[1]): print(' &%(prefix)s%(ref_type)s_class,' % {'prefix': prefix, 'ref_type': name_to_id(ref_type)}) print(' };'); print(' const size_t n_%s = sizeof %s / sizeof *%s;' % (name, name, name)) print(' p->%(member)s = spvxml_node_resolve_ref (ctx, p->node_.raw, \"%(attr)s\", %(name)s, n_%(name)s);' % {"member": c_name, "attr": xml_name, 'prefix': prefix, 'name': name }) else: print(' static const struct spvxml_node_class *const %s' % name) print(' = &%(prefix)s%(ref_type)s_class;' % {'prefix': prefix, 'ref_type': name_to_id(value[1])}) print(' p->%(member)s = %(prefix)scast_%(ref_type)s (spvxml_node_resolve_ref (ctx, p->node_.raw, \"%(attr)s\", &%(name)s, 1));' % {"member": c_name, "attr": xml_name, 'prefix': prefix, 'name': name, 'ref_type': name_to_id(value[1])}) print_recurse_members(attributes, rhs, 'resolve_refs') print('}') def name_to_id(s): return s[0].lower() + ''.join(['_%c' % x.lower() if x.isupper() else x for x in s[1:]]).replace('-', '_') if __name__ == "__main__": argv0 = sys.argv[0] try: options, args = getopt.gnu_getopt(sys.argv[1:], 'h', ['help']) except getopt.GetoptError as e: sys.stderr.write("%s: %s\n" % (argv0, e.msg)) sys.exit(1) for key, value in options: if key in ['-h', '--help']: usage() else: sys.exit(0) if len(args) < 3: sys.stderr.write("%s: bad usage (use --help for help)\n" % argv0) sys.exit(1) global file_name global prefix file_name, output_type, prefix = args[:3] input_file = open(file_name) prefix = '%s_' % prefix global line global line_number line = "" line_number = 0 productions = {} global token token = ('start', ) get_token() while True: while match(';'): pass if token[0] == 'eof': break name, xml_name, attributes, rhs = parse_production() if name in productions: fatal("%s: duplicate production" % name) productions[name] = (xml_name, attributes, rhs) print('/* Generated automatically -- do not modify! -*- buffer-read-only: t -*- */') if output_type == 'code' and len(args) == 4: header_name = args[3] print("""\ #include #include %s #include #include #include #include "libpspp/cast.h" #include "libpspp/str.h" #include "gl/xalloc.h" """ % header_name) for enum_name, values in sorted(enums.items()): if len(values) <= 1: continue c_name = name_to_id(enum_name) print('\nstatic const struct spvxml_enum %s%s_map[] = {' % (prefix, c_name)) for value in sorted(values): print(' { "%s", %s%s_%s },' % (value, prefix.upper(), c_name.upper(), name_to_id(value).upper())) print(' { NULL, 0 },') print('};') print('\nconst char *') print('%s%s_to_string (enum %s%s %s)' % (prefix, c_name, prefix, c_name, c_name)) print('{') print(' switch (%s) {' % c_name) for value in sorted(values): print(' case %s%s_%s: return "%s";' % (prefix.upper(), c_name.upper(), name_to_id(value).upper(), value)) print(' default: return NULL;') print(' }') print('}') for name, (xml_name, attributes, rhs) in sorted(productions.items()): print('static void %(prefix)scollect_ids_%(name)s (struct spvxml_context *, struct %(prefix)s%(name)s *);\n' 'static void %(prefix)sresolve_refs_%(name)s (struct spvxml_context *ctx UNUSED, struct %(prefix)s%(name)s *p UNUSED);\n' % {'prefix': prefix, 'name': name_to_id(name)}) for name, production in sorted(productions.items()): print_parser(name, production, productions, ' ' * 4) print_free(name, production, ' ' * 4) print_collect_ids(name, production) print_resolve_refs(name, production) print(''' static void %(prefix)sdo_free_%(name)s (struct spvxml_node *node) { %(prefix)sfree_%(name)s (UP_CAST (node, struct %(prefix)s%(name)s, node_)); } static void %(prefix)sdo_collect_ids_%(name)s (struct spvxml_context *ctx, struct spvxml_node *node) { %(prefix)scollect_ids_%(name)s (ctx, UP_CAST (node, struct %(prefix)s%(name)s, node_)); } static void %(prefix)sdo_resolve_refs_%(name)s (struct spvxml_context *ctx, struct spvxml_node *node) { %(prefix)sresolve_refs_%(name)s (ctx, UP_CAST (node, struct %(prefix)s%(name)s, node_)); } struct spvxml_node_class %(prefix)s%(name)s_class = { "%(class)s", %(prefix)sdo_free_%(name)s, %(prefix)sdo_collect_ids_%(name)s, %(prefix)sdo_resolve_refs_%(name)s, }; ''' % {'prefix': prefix, 'name': name_to_id(name), 'class': (name if name == production[0] else '%s (%s)' % (name, production[0]))}) elif output_type == 'header' and len(args) == 3: print("""\ #ifndef %(PREFIX)sPARSER_H #define %(PREFIX)sPARSER_H #include #include #include #include "output/spv/spvxml-helpers.h"\ """ % {'PREFIX': prefix.upper()}) for name, (xml_name, attributes, rhs) in sorted(productions.items()): print_members(attributes, rhs, ' ' * 4) print('''}; extern struct spvxml_node_class %(prefix)s%(name)s_class; bool %(prefix)sparse_%(name)s (struct spvxml_context *, xmlNode *input, struct %(prefix)s%(name)s **); void %(prefix)sfree_%(name)s (struct %(prefix)s%(name)s *); bool %(prefix)sis_%(name)s (const struct spvxml_node *); struct %(prefix)s%(name)s *%(prefix)scast_%(name)s (const struct spvxml_node *);''' % {'prefix': prefix, 'name': name_to_id(name)}) print("""\ #endif /* %(PREFIX)sPARSER_H */""" % {'PREFIX': prefix.upper()}) else: sys.stderr.write("%s: bad usage (use --help for help)" % argv0) pspp-1.4.1/src/output/spv/spv-select.c0000644000175000017500000001321313602145300017275 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2018 Free Software Foundation, Inc. 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 3 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, see . */ #include #include "spv-select.h" #include #include "libpspp/assertion.h" #include "libpspp/bit-vector.h" #include "output/spv/spv.h" #include "gl/c-ctype.h" #include "gl/xalloc.h" static struct spv_item * find_command_item (struct spv_item *item) { /* A command item itself does not have a command item. */ if (!item->parent || !item->parent->parent) return NULL; do { item = item->parent; } while (item->parent && item->parent->parent); return item; } static bool string_matches (const char *pattern, const char *s) { /* XXX This should be a Unicode case insensitive comparison. */ while (c_tolower (*pattern) == c_tolower (*s)) { if (*pattern == '\0') return true; pattern++; s++; } return pattern[0] == '*' && pattern[1] == '\0'; } static int string_array_matches (const char *name, const struct string_array *array) { if (!array->n) return -1; else if (!name) return false; for (size_t i = 0; i < array->n; i++) if (string_matches (array->strings[i], name)) return true; return false; } static bool match (const char *name, const struct string_array *white, const struct string_array *black) { return (string_array_matches (name, white) != false && string_array_matches (name, black) != true); } static int match_instance (const int *instances, size_t n_instances, int instance_within_command) { int retval = false; for (size_t i = 0; i < n_instances; i++) { if (instances[i] == instance_within_command) return true; else if (instances[i] == -1) retval = -1; } return retval; } static void select_matches (const struct spv_reader *spv, const struct spv_criteria *c, unsigned long int *include) { struct spv_item *item; struct spv_item *command_item = NULL; int instance_within_command = 0; int last_instance = -1; ssize_t index = -1; SPV_ITEM_FOR_EACH_SKIP_ROOT (item, spv_get_root (spv)) { index++; struct spv_item *new_command_item = find_command_item (item); if (new_command_item != command_item) { if (last_instance >= 0) { bitvector_set1 (include, last_instance); last_instance = -1; } command_item = new_command_item; instance_within_command = 0; } if (!((1u << spv_item_get_class (item)) & c->classes)) continue; if (!c->include_hidden && !spv_item_is_visible (item)) continue; if (c->error) { spv_item_load (item); if (!item->error) continue; } if (!match (spv_item_get_command_id (item), &c->include.commands, &c->exclude.commands)) continue; if (!match (spv_item_get_subtype (item), &c->include.subtypes, &c->exclude.subtypes)) continue; if (!match (spv_item_get_label (item), &c->include.labels, &c->exclude.labels)) continue; if (c->members.n && !((item->xml_member && string_array_matches (item->xml_member, &c->members)) || (item->bin_member && string_array_matches (item->bin_member, &c->members)))) continue; if (c->n_instances) { if (!command_item) continue; instance_within_command++; int include_instance = match_instance (c->instances, c->n_instances, instance_within_command); if (!include_instance) continue; else if (include_instance < 0) { last_instance = index; continue; } } bitvector_set1 (include, index); } if (last_instance >= 0) bitvector_set1 (include, last_instance); } void spv_select (const struct spv_reader *spv, const struct spv_criteria c[], size_t nc, struct spv_item ***itemsp, size_t *n_itemsp) { struct spv_item *item; struct spv_criteria default_criteria = SPV_CRITERIA_INITIALIZER; if (!nc) { nc = 1; c = &default_criteria; } /* Count items. */ size_t max_items = 0; SPV_ITEM_FOR_EACH_SKIP_ROOT (item, spv_get_root (spv)) max_items++; /* Allocate bitmap for items then fill it in with selected items. */ unsigned long int *include = bitvector_allocate (max_items); for (size_t i = 0; i < nc; i++) select_matches (spv, &c[i], include); /* Copy selected items into output array. */ size_t n_items = 0; struct spv_item **items = xnmalloc (bitvector_count (include, max_items), sizeof *items); size_t i = 0; SPV_ITEM_FOR_EACH_SKIP_ROOT (item, spv_get_root (spv)) if (bitvector_is_set (include, i++)) items[n_items++] = item; *itemsp = items; *n_itemsp = n_items; /* Free memory. */ free (include); } pspp-1.4.1/src/output/charts/0000755000175000017500000000000013725012647015535 5ustar00blpblp00000000000000pspp-1.4.1/src/output/charts/roc-chart.c0000644000175000017500000000405213320146056017555 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2009, 2011 Free Software Foundation, Inc. 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 3 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, see . */ #include #include "output/charts/roc-chart.h" #include "data/casereader.h" #include "language/stats/roc.h" #include "output/chart-item-provider.h" #include "gl/xalloc.h" #include "gettext.h" #define _(msgid) gettext (msgid) struct roc_chart * roc_chart_create (bool reference) { struct roc_chart *rc = xmalloc (sizeof *rc); chart_item_init (&rc->chart_item, &roc_chart_class, NULL); rc->reference = reference; rc->vars = NULL; rc->n_vars = 0; rc->allocated_vars = 0; return rc; } void roc_chart_add_var (struct roc_chart *rc, const char *var_name, const struct casereader *cutpoint_reader) { struct roc_var *rv; if (rc->n_vars >= rc->allocated_vars) rc->vars = x2nrealloc (rc->vars, &rc->allocated_vars, sizeof *rc->vars); rv = &rc->vars[rc->n_vars++]; rv->name = xstrdup (var_name); rv->cutpoint_reader = casereader_clone (cutpoint_reader); } static void roc_chart_destroy (struct chart_item *chart_item) { struct roc_chart *rc = UP_CAST (chart_item, struct roc_chart, chart_item); size_t i; for (i = 0; i < rc->n_vars; i++) { struct roc_var *rv = &rc->vars[i]; free (rv->name); casereader_destroy (rv->cutpoint_reader); } free (rc->vars); free (rc); } const struct chart_item_class roc_chart_class = { roc_chart_destroy }; pspp-1.4.1/src/output/charts/scatterplot-cairo.c0000644000175000017500000000712213711575611021342 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2014, 2015 Free Software Foundation, Inc. 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 3 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, see . */ #include #include "output/charts/scatterplot.h" #include "data/case.h" #include "data/casereader.h" #include "data/variable.h" #include "output/cairo-chart.h" #include "libpspp/str.h" #include "libpspp/message.h" #include "gettext.h" #define _(msgid) gettext (msgid) static const struct xrchart_colour black = {0,0,0}; void xrchart_draw_scatterplot (const struct chart_item *chart_item, cairo_t *cr, struct xrchart_geometry *geom) { const struct scatterplot_chart *spc = to_scatterplot_chart (chart_item); struct casereader *data; struct ccase *c; /* While reading the cases, a list with categories of the byvar is build */ /* All distinct values are stored in catvals */ /* Each category will later have a different plot colour */ const int MAX_PLOT_CATS = 20; union value catvals[MAX_PLOT_CATS]; int n_catvals = 0; int byvar_width = 0; int i = 0; const struct xrchart_colour *colour; if (spc->byvar) byvar_width = var_get_width (spc->byvar); if (! xrchart_write_xscale (cr, geom, spc->x_min, spc->x_max)) return; if (! xrchart_write_yscale (cr, geom, spc->y_min, spc->y_max)) return; xrchart_write_title (cr, geom, _("Scatterplot %s"), chart_item->title); xrchart_write_xlabel (cr, geom, spc->xlabel); xrchart_write_ylabel (cr, geom, spc->ylabel); cairo_save (cr); data = casereader_clone (spc->data); for (; (c = casereader_read (data)) != NULL; case_unref (c)) { if (spc->byvar) { const union value *val = case_data_idx (c,SP_IDX_BY); for(i=0;ibyvar,val,MV_ANY)) ds_put_cstr (&label,"missing"); else var_append_value_name (spc->byvar,val,&label); value_clone (&catvals[n_catvals++],val,byvar_width); geom->n_datasets++; geom->dataset = xrealloc (geom->dataset, geom->n_datasets * sizeof (*geom->dataset)); geom->dataset[geom->n_datasets - 1] = strdup (ds_cstr(&label)); ds_destroy (&label); } else /* Use the last plot category */ { *(spc->byvar_overflow) = true; i--; } } colour = &data_colour[i % XRCHART_N_COLOURS]; } else colour = &black; cairo_set_source_rgb (cr, colour->red / 255.0, colour->green / 255.0, colour->blue / 255.0); xrchart_datum (cr, geom, 0, case_data_idx (c, SP_IDX_X)->f, case_data_idx (c, SP_IDX_Y)->f); } casereader_destroy (data); cairo_restore (cr); for(i=0;ibyvar) xrchart_write_legend (cr, geom); } pspp-1.4.1/src/output/charts/plot-hist.h0000644000175000017500000000657013320146056017632 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2004, 2009, 2011 Free Software Foundation, Inc. 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 3 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, see . */ #ifndef OUTPUT_PLOT_HIST_H #define OUTPUT_PLOT_HIST_H #include #include #include "output/chart-item.h" struct histogram_chart { struct chart_item chart_item; gsl_histogram *gsl_hist; double n; double mean; double stddev; bool show_normal; }; /* Creates and returns a new chart that depicts a histogram of the data in HIST with the given LABEL. Labels the histogram with each of N, MEAN, and STDDEV that is not SYSMIS. If all three are not SYSMIS and SHOW_NORMAL is true, also draws a normal curve on the histogram. */ struct chart_item *histogram_chart_create (const gsl_histogram *, const char *label, double n, double mean, double stddev, bool show_normal); /* This boilerplate for histogram_chart, a subclass of chart_item, was autogenerated by mk-class-boilerplate. */ #include #include "libpspp/cast.h" extern const struct chart_item_class histogram_chart_class; /* Returns true if SUPER is a histogram_chart, otherwise false. */ static inline bool is_histogram_chart (const struct chart_item *super) { return super->class == &histogram_chart_class; } /* Returns SUPER converted to histogram_chart. SUPER must be a histogram_chart, as reported by is_histogram_chart. */ static inline struct histogram_chart * to_histogram_chart (const struct chart_item *super) { assert (is_histogram_chart (super)); return UP_CAST (super, struct histogram_chart, chart_item); } /* Returns INSTANCE converted to chart_item. */ static inline struct chart_item * histogram_chart_super (const struct histogram_chart *instance) { return CONST_CAST (struct chart_item *, &instance->chart_item); } /* Increments INSTANCE's reference count and returns INSTANCE. */ static inline struct histogram_chart * histogram_chart_ref (const struct histogram_chart *instance) { return to_histogram_chart (chart_item_ref (&instance->chart_item)); } /* Decrements INSTANCE's reference count, then destroys INSTANCE if the reference count is now zero. */ static inline void histogram_chart_unref (struct histogram_chart *instance) { chart_item_unref (&instance->chart_item); } /* Returns true if INSTANCE's reference count is greater than 1, false otherwise. */ static inline bool histogram_chart_is_shared (const struct histogram_chart *instance) { return chart_item_is_shared (&instance->chart_item); } static inline void histogram_chart_submit (struct histogram_chart *instance) { chart_item_submit (&instance->chart_item); } #endif /* output/plot-hist.h */ pspp-1.4.1/src/output/charts/boxplot-cairo.c0000644000175000017500000001300013711575611020455 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2009, 2011 Free Software Foundation, Inc. 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 3 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, see . */ #include #include "output/cairo-chart.h" #include #include "math/box-whisker.h" #include "math/chart-geometry.h" #include "output/charts/boxplot.h" /* Draw an OUTLIER on the plot CH * at CENTRELINE */ static void draw_case (cairo_t *cr, const struct xrchart_geometry *geom, double centreline, const struct outlier *outlier) { double y = geom->axis[SCALE_ORDINATE].data_min + (outlier->value - geom->axis[SCALE_ORDINATE].min) * geom->axis[SCALE_ORDINATE].scale; xrchart_draw_marker (cr, centreline, y, outlier->extreme ? XRMARKER_ASTERISK : XRMARKER_CIRCLE, 20); cairo_move_to (cr, centreline + 10, y); xrchart_label (cr, 'l', 'c', geom->font_size, ds_cstr (&outlier->label)); } static void boxplot_draw_box (cairo_t *cr, const struct xrchart_geometry *geom, double box_centre, double box_width, const struct box_whisker *bw, const char *name) { double whisker[2]; double hinge[3]; struct ll *ll; const struct ll_list *outliers; const double box_left = box_centre - box_width / 2.0; const double box_right = box_centre + box_width / 2.0; double box_bottom; double box_top; double bottom_whisker; double top_whisker; box_whisker_whiskers (bw, whisker); box_whisker_hinges (bw, hinge); box_bottom = geom->axis[SCALE_ORDINATE].data_min + (hinge[0] - geom->axis[SCALE_ORDINATE].min) * geom->axis[SCALE_ORDINATE].scale; box_top = geom->axis[SCALE_ORDINATE].data_min + (hinge[2] - geom->axis[SCALE_ORDINATE].min) * geom->axis[SCALE_ORDINATE].scale; bottom_whisker = geom->axis[SCALE_ORDINATE].data_min + (whisker[0] - geom->axis[SCALE_ORDINATE].min) * geom->axis[SCALE_ORDINATE].scale; top_whisker = geom->axis[SCALE_ORDINATE].data_min + (whisker[1] - geom->axis[SCALE_ORDINATE].min) * geom->axis[SCALE_ORDINATE].scale; /* Draw the box */ cairo_rectangle (cr, box_left, box_bottom, box_right - box_left, box_top - box_bottom); cairo_save (cr); cairo_set_source_rgb (cr, geom->fill_colour.red / 255.0, geom->fill_colour.green / 255.0, geom->fill_colour.blue / 255.0); cairo_fill (cr); cairo_restore (cr); cairo_stroke (cr); /* Draw the median */ cairo_save (cr); cairo_set_line_width (cr, cairo_get_line_width (cr) * 5); cairo_move_to (cr, box_left, geom->axis[SCALE_ORDINATE].data_min + (hinge[1] - geom->axis[SCALE_ORDINATE].min) * geom->axis[SCALE_ORDINATE].scale); cairo_line_to (cr, box_right, geom->axis[SCALE_ORDINATE].data_min + (hinge[1] - geom->axis[SCALE_ORDINATE].min) * geom->axis[SCALE_ORDINATE].scale); cairo_stroke (cr); cairo_restore (cr); /* Draw the bottom whisker */ cairo_move_to (cr, box_left, bottom_whisker); cairo_line_to (cr, box_right, bottom_whisker); cairo_stroke (cr); /* Draw top whisker */ if (! isnan (top_whisker)) { cairo_move_to (cr, box_left, top_whisker); cairo_line_to (cr, box_right, top_whisker); cairo_stroke (cr); } /* Draw centre line. */ if (! isnan (bottom_whisker) && ! isnan (box_bottom)) { /* (bottom half) */ cairo_move_to (cr, box_centre, bottom_whisker); cairo_line_to (cr, box_centre, box_bottom); cairo_stroke (cr); } if (! isnan (top_whisker) && ! isnan (box_top)) { /* (top half) */ cairo_move_to (cr, box_centre, top_whisker); cairo_line_to (cr, box_centre, box_top); cairo_stroke (cr); } outliers = box_whisker_outliers (bw); for (ll = ll_head (outliers); ll != ll_null (outliers); ll = ll_next (ll)) { const struct outlier *outlier = ll_data (ll, struct outlier, ll); draw_case (cr, geom, box_centre, outlier); } /* Draw tick mark on x axis */ draw_tick (cr, geom, SCALE_ABSCISSA, false, box_centre - geom->axis[SCALE_ABSCISSA].data_min, "%s", name); } void xrchart_draw_boxplot (const struct chart_item *chart_item, cairo_t *cr, struct xrchart_geometry *geom) { const struct boxplot *boxplot = to_boxplot (chart_item); double box_width; size_t i; if (! xrchart_write_yscale (cr, geom, boxplot->y_min, boxplot->y_max)) return; xrchart_write_title (cr, geom, "%s", chart_item->title); box_width = (geom->axis[SCALE_ABSCISSA].data_max - geom->axis[SCALE_ABSCISSA].data_min) / boxplot->n_boxes / 2.0; for (i = 0; i < boxplot->n_boxes; i++) { const struct boxplot_box *box = &boxplot->boxes[i]; const double box_centre = (i * 2 + 1) * box_width + geom->axis[SCALE_ABSCISSA].data_min; boxplot_draw_box (cr, geom, box_centre, box_width, box->bw, box->label); } } pspp-1.4.1/src/output/charts/spreadlevel-cairo.c0000644000175000017500000000316513711575611021307 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2012 Free Software Foundation, Inc. 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 3 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, see . */ #include #include "output/charts/spreadlevel-plot.h" #include #include "output/cairo-chart.h" #include "gettext.h" #define _(msgid) gettext (msgid) void xrchart_draw_spreadlevel (const struct chart_item *chart_item, cairo_t *cr, struct xrchart_geometry *geom) { const struct spreadlevel_plot_chart *sl = to_spreadlevel_plot_chart (chart_item); size_t i; const char *name = chart_item_get_title (chart_item); xrchart_write_title (cr, geom, _("Spread vs. Level Plot of %s"), name); xrchart_write_xlabel (cr, geom, _("Level")); xrchart_write_ylabel (cr, geom, _("Spread")); if (! xrchart_write_xscale (cr, geom, sl->x_lower, sl->x_upper)) return; if (! xrchart_write_yscale (cr, geom, sl->y_lower, sl->y_upper)) return; for (i = 0 ; i < sl->n_data; ++i) { xrchart_datum (cr, geom, 0, sl->data[i].x, sl->data[i].y); } } pspp-1.4.1/src/output/charts/barchart.c0000644000175000017500000002356713717773141017510 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2015 Free Software Foundation, Inc. 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 3 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, see . */ #include #include "output/charts/barchart.h" #include "output/charts/piechart.h" #include #include "libpspp/cast.h" #include "libpspp/str.h" #include "libpspp/array.h" #include "output/chart-item-provider.h" #include "gl/xalloc.h" #include "data/variable.h" #include "data/settings.h" #include "language/stats/freq.h" static int compare_category_3way (const void *a_, const void *b_, const void *bc_) { const struct category *const*a = a_; const struct category *const*b = b_; const struct barchart *bc = bc_; return value_compare_3way (&(*a)->val, &(*b)->val, var_get_width (bc->var[1])); } static int compare_category_by_index_3way (const void *a_, const void *b_, const void *unused UNUSED) { const struct category *const*a = a_; const struct category *const*b = b_; if ( (*a)->idx < (*b)->idx) return -1; return ((*a)->idx > (*b)->idx); } static unsigned int hash_freq_2level_ptr (const void *a_, const void *bc_) { const struct freq *const *ap = a_; const struct barchart *bc = bc_; size_t hash = value_hash (&(*ap)->values[0], bc->widths[0], 0); if (bc->n_vars > 1) hash = value_hash (&(*ap)->values[1], bc->widths[1], hash); return hash; } static int compare_freq_2level_ptr_3way (const void *a_, const void *b_, const void *bc_) { const struct freq *const *ap = a_; const struct freq *const *bp = b_; const struct barchart *bc = bc_; const int level0 = value_compare_3way (&(*ap)->values[0], &(*bp)->values[0], bc->widths[0]); if (level0 == 0 && bc->n_vars > 1) return value_compare_3way (&(*ap)->values[1], &(*bp)->values[1], bc->widths[1]); return level0; } /* Print out a textual representation of a barchart. This is intended only for testing, and not as a means of visualising the data. */ static void barchart_dump (const struct barchart *bc, FILE *fp) { fprintf (fp, "Graphic: Barchart\n"); fprintf (fp, "Percentage: %d\n", bc->percent); fprintf (fp, "Total Categories: %d\n", bc->n_nzcats); fprintf (fp, "Primary Categories: %d\n", bc->n_pcats); fprintf (fp, "Largest Category: %g\n", bc->largest); fprintf (fp, "Total Count: %g\n", bc->total_count); fprintf (fp, "Y Label: \"%s\"\n", bc->ylabel); fprintf (fp, "Categorical Variables:\n"); for (int i = 0; i < bc->n_vars; ++i) { fprintf (fp, " Var: \"%s\"\n", var_get_name (bc->var[i])); } fprintf (fp, "Categories:\n"); struct category *cat; struct category **cats = XCALLOC (hmap_count (&bc->primaries), struct category *); int i = 0; HMAP_FOR_EACH (cat, struct category, node, &bc->primaries) { cats[i++] = cat; } /* HMAP_FOR_EACH is not guaranteed to iterate in any particular order. So we must sort here before we output the results. */ sort (cats, i, sizeof (struct category *), compare_category_by_index_3way, bc); for (i = 0; i < hmap_count (&bc->primaries); ++i) { const struct category *c = cats[i]; fprintf (fp, " %d \"%s\"\n", c->idx, ds_cstr (&c->label)); } free (cats); if (bc->ss) { fprintf (fp, "Sub-categories:\n"); for (int i = 0; i < bc->n_nzcats / bc->n_pcats; ++i) { const struct category *cat = bc->ss[i]; fprintf (fp, " %d \"%s\"\n", cat->idx, ds_cstr(&cat->label)); } } fprintf (fp, "All Categories:\n"); for (int i = 0; i < bc->n_nzcats; ++i) { const struct freq *frq = bc->cats[i]; fprintf (fp, "Count: %g; ", frq->count); struct string s = DS_EMPTY_INITIALIZER; var_append_value_name (bc->var[0], &frq->values[0], &s); fprintf (fp, "Cat: \"%s\"", ds_cstr (&s)); ds_clear (&s); if (bc->ss) { var_append_value_name (bc->var[1], &frq->values[1], &s); fprintf (fp, ", \"%s\"", ds_cstr (&s)); } ds_destroy (&s); fputc ('\n', fp); } fputc ('\n', fp); } /* Creates and returns a chart that will render a barchart with the given TITLE and the N_CATS described in CATS. VAR is an array containing the categorical variables, and N_VAR the number of them. N_VAR must be exactly 1 or 2. CATS are the counts of the values of those variables. N_CATS is the number of distinct values. */ struct chart_item * barchart_create (const struct variable **var, int n_vars, const char *ylabel, bool percent, struct freq *const *cats, int n_cats) { struct barchart *bar; int i; const int pidx = 0; const int sidx = 1; int width = var_get_width (var[pidx]); assert (n_vars >= 1 && n_vars <= 2); bar = xzalloc (sizeof *bar); bar->percent = percent; bar->var = var; bar->n_vars = n_vars; bar->n_nzcats = n_cats; chart_item_init (&bar->chart_item, &barchart_class, var_to_string (var[pidx])); bar->largest = -1; bar->ylabel = strdup (ylabel); { int idx = 0; hmap_init (&bar->primaries); /* Iterate the categories and create a hash table of the primary categories. We need to do this to find out how many there are and to cache the labels. */ for (i = 0; i < n_cats; i++) { const struct freq *src = cats[i]; size_t hash = value_hash (&src->values[pidx], width, 0); struct category *foo; int flag = 0; HMAP_FOR_EACH_WITH_HASH (foo, struct category, node, hash, &bar->primaries) { if (value_equal (&foo->val, &src->values[pidx], width)) { flag = 1; break; } } if (!flag) { struct category *s = xzalloc (sizeof *s); s->idx = idx++; s->width = var_get_width (var[pidx]); value_init (&s->val, s->width); value_copy (&s->val, &src->values[pidx], s->width); ds_init_empty (&s->label); var_append_value_name (var[pidx], &s->val, &s->label); hmap_insert (&bar->primaries, &s->node, hash); } } bar->n_pcats = hmap_count (&bar->primaries); } if (n_vars > 1) { hmap_init (&bar->secondaries); int idx = 0; /* Iterate the categories, and create a hash table of secondary categories */ for (i = 0; i < n_cats; i++) { struct freq *src = cats[i]; struct category *foo; int flag = 0; size_t hash = value_hash (&src->values[sidx], var_get_width (var[sidx]), 0); HMAP_FOR_EACH_WITH_HASH (foo, struct category, node, hash, &bar->secondaries) { if (value_equal (&foo->val, &src->values[sidx], var_get_width (var[sidx]))) { flag = 1; break; } } if (!flag) { struct category *s = xzalloc (sizeof *s); s->idx = idx++; s->width = var_get_width (var[sidx]); value_init (&s->val, s->width); value_copy (&s->val, &src->values[sidx], var_get_width (var[sidx])); ds_init_empty (&s->label); var_append_value_name (var[sidx], &s->val, &s->label); hmap_insert (&bar->secondaries, &s->node, hash); bar->ss = xrealloc (bar->ss, idx * sizeof *bar->ss); bar->ss[idx - 1] = s; } } int n_category = hmap_count (&bar->secondaries); sort (bar->ss, n_category, sizeof *bar->ss, compare_category_3way, bar); } /* Deep copy. Not necessary for cmd line, but essential for the GUI, since an expose callback will access these structs which may not exist. */ bar->cats = xcalloc (n_cats, sizeof *bar->cats); bar->widths[0] = var_get_width (bar->var[0]); if (n_vars > 1) bar->widths[1] = var_get_width (bar->var[1]); { struct hmap level2table; hmap_init (&level2table); int x = 0; for (i = 0; i < n_cats; i++) { struct freq *c = cats[i]; struct freq *foo; bool flag = false; size_t hash = hash_freq_2level_ptr (&c, bar); HMAP_FOR_EACH_WITH_HASH (foo, struct freq, node, hash, &level2table) { if (0 == compare_freq_2level_ptr_3way (&foo, &c, bar)) { foo->count += c->count; bar->total_count += c->count; if (foo->count > bar->largest) bar->largest = foo->count; flag = true; break; } } if (!flag) { struct freq *aggregated_freq = freq_clone (c, n_vars, bar->widths); hmap_insert (&level2table, &aggregated_freq->node, hash); if (c->count > bar->largest) bar->largest = aggregated_freq->count; bar->total_count += c->count; bar->cats[x++] = aggregated_freq; } } bar->n_nzcats = hmap_count (&level2table); hmap_destroy (&level2table); } sort (bar->cats, bar->n_nzcats, sizeof *bar->cats, compare_freq_2level_ptr_3way, bar); if (settings_get_testing_mode ()) barchart_dump (bar, stdout); return &bar->chart_item; } static void destroy_cat_map (struct hmap *m) { struct category *foo = NULL; struct category *next = NULL; HMAP_FOR_EACH_SAFE (foo, next, struct category, node, m) { value_destroy (&foo->val, foo->width); ds_destroy (&foo->label); free (foo); } hmap_destroy (m); } static void barchart_destroy (struct chart_item *chart_item) { struct barchart *bar = to_barchart (chart_item); int i; destroy_cat_map (&bar->primaries); if (bar->ss) { destroy_cat_map (&bar->secondaries); } for (i = 0; i < bar->n_nzcats; i++) { freq_destroy (bar->cats[i], bar->n_vars, bar->widths); } free (bar->cats); free (bar->ylabel); free (bar->ss); free (bar); } const struct chart_item_class barchart_class = { barchart_destroy }; pspp-1.4.1/src/output/charts/np-plot-cairo.c0000644000175000017500000000635113711575611020372 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2009, 2011 Free Software Foundation, Inc. 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 3 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, see . */ #include #include "output/charts/np-plot.h" #include "data/case.h" #include "data/casereader.h" #include "math/np.h" #include "output/cairo-chart.h" #include "gettext.h" #define _(msgid) gettext (msgid) static void np_plot_chart_draw (const struct chart_item *chart_item, cairo_t *cr, struct xrchart_geometry *geom) { const struct np_plot_chart *npp = to_np_plot_chart (chart_item); struct casereader *data; struct ccase *c; xrchart_write_title (cr, geom, _("Normal Q-Q Plot of %s"), chart_item->title); xrchart_write_xlabel (cr, geom, _("Observed Value")); xrchart_write_ylabel (cr, geom, _("Expected Normal")); if (! xrchart_write_xscale (cr, geom, npp->x_lower - npp->slack, npp->x_upper + npp->slack)) return; if (! xrchart_write_yscale (cr, geom, npp->y_first, npp->y_last)) return; data = casereader_clone (npp->data); for (; (c = casereader_read (data)) != NULL; case_unref (c)) xrchart_datum (cr, geom, 0, case_data_idx (c, NP_IDX_Y)->f, case_data_idx (c, NP_IDX_NS)->f); casereader_destroy (data); xrchart_line (cr, geom, npp->slope, npp->intercept, npp->y_first, npp->y_last, XRCHART_DIM_Y); } static void dnp_plot_chart_draw (const struct chart_item *chart_item, cairo_t *cr, struct xrchart_geometry *geom) { const struct np_plot_chart *dnpp = to_np_plot_chart (chart_item); struct casereader *data; struct ccase *c; xrchart_write_title (cr, geom, _("Detrended Normal Q-Q Plot of %s"), chart_item->title); xrchart_write_xlabel (cr, geom, _("Observed Value")); xrchart_write_ylabel (cr, geom, _("Dev from Normal")); if (! xrchart_write_xscale (cr, geom, dnpp->y_min, dnpp->y_max)) return; if (! xrchart_write_yscale (cr, geom, dnpp->dns_min, dnpp->dns_max)) return; data = casereader_clone (dnpp->data); for (; (c = casereader_read (data)) != NULL; case_unref (c)) xrchart_datum (cr, geom, 0, case_data_idx (c, NP_IDX_Y)->f, case_data_idx (c, NP_IDX_DNS)->f); casereader_destroy (data); xrchart_line (cr, geom, 0, 0, dnpp->y_min, dnpp->y_max, XRCHART_DIM_X); } void xrchart_draw_np_plot (const struct chart_item *chart_item, cairo_t *cr, struct xrchart_geometry *geom) { const struct np_plot_chart *npp = to_np_plot_chart (chart_item); if (npp->detrended) dnp_plot_chart_draw (chart_item, cr, geom); else np_plot_chart_draw (chart_item, cr, geom); } pspp-1.4.1/src/output/charts/boxplot.h0000644000175000017500000000624213320146056017372 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2004, 2009, 2011 Free Software Foundation, Inc. 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 3 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, see . */ #ifndef OUTPUT_CHARTS_BOXPLOT_H #define OUTPUT_CHARTS_BOXPLOT_H 1 #include #include "output/chart-item.h" /* Box-whiskers plot. */ struct boxplot { struct chart_item chart_item; /* Data. */ struct boxplot_box *boxes; size_t n_boxes, boxes_allocated; /* Derived from data and convenient for plotting. */ double y_min; /* Minimum Y coordinate of extremum. */ double y_max; /* Maximum Y coordinate of extremum. */ }; /* One box within a box-whiskers plot. */ struct boxplot_box { struct box_whisker *bw; char *label; /* Variable name or factor label. */ }; struct boxplot *boxplot_create (double y_min, double y_max, const char *title); void boxplot_add_box (struct boxplot *, struct box_whisker *, const char *label); /* This boilerplate for boxplot, a subclass of chart_item, was autogenerated by mk-class-boilerplate. */ #include #include "libpspp/cast.h" extern const struct chart_item_class boxplot_class; /* Returns true if SUPER is a boxplot, otherwise false. */ static inline bool is_boxplot (const struct chart_item *super) { return super->class == &boxplot_class; } /* Returns SUPER converted to boxplot. SUPER must be a boxplot, as reported by is_boxplot. */ static inline struct boxplot * to_boxplot (const struct chart_item *super) { assert (is_boxplot (super)); return UP_CAST (super, struct boxplot, chart_item); } /* Returns INSTANCE converted to chart_item. */ static inline struct chart_item * boxplot_super (const struct boxplot *instance) { return CONST_CAST (struct chart_item *, &instance->chart_item); } /* Increments INSTANCE's reference count and returns INSTANCE. */ static inline struct boxplot * boxplot_ref (const struct boxplot *instance) { return to_boxplot (chart_item_ref (&instance->chart_item)); } /* Decrements INSTANCE's reference count, then destroys INSTANCE if the reference count is now zero. */ static inline void boxplot_unref (struct boxplot *instance) { chart_item_unref (&instance->chart_item); } /* Returns true if INSTANCE's reference count is greater than 1, false otherwise. */ static inline bool boxplot_is_shared (const struct boxplot *instance) { return chart_item_is_shared (&instance->chart_item); } static inline void boxplot_submit (struct boxplot *instance) { chart_item_submit (&instance->chart_item); } #endif /* output/charts/boxplot.h */ pspp-1.4.1/src/output/charts/piechart.h0000644000175000017500000000547213320146056017506 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2004, 2009, 2011 Free Software Foundation, Inc. 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 3 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, see . */ #ifndef PIECHART_H #define PIECHART_H #include "libpspp/str.h" #include "output/chart-item.h" #include "language/stats/freq.h" struct piechart { struct chart_item chart_item; struct slice *slices; int n_slices; }; struct slice { struct string label; double magnitude; }; struct variable; struct chart_item *piechart_create (const struct variable *var, const struct freq *, int n_slices); /* This boilerplate for piechart, a subclass of chart_item, was autogenerated by mk-class-boilerplate. */ #include #include "libpspp/cast.h" extern const struct chart_item_class piechart_class; /* Returns true if SUPER is a piechart, otherwise false. */ static inline bool is_piechart (const struct chart_item *super) { return super->class == &piechart_class; } /* Returns SUPER converted to piechart. SUPER must be a piechart, as reported by is_piechart. */ static inline struct piechart * to_piechart (const struct chart_item *super) { assert (is_piechart (super)); return UP_CAST (super, struct piechart, chart_item); } /* Returns INSTANCE converted to chart_item. */ static inline struct chart_item * piechart_super (const struct piechart *instance) { return CONST_CAST (struct chart_item *, &instance->chart_item); } /* Increments INSTANCE's reference count and returns INSTANCE. */ static inline struct piechart * piechart_ref (const struct piechart *instance) { return to_piechart (chart_item_ref (&instance->chart_item)); } /* Decrements INSTANCE's reference count, then destroys INSTANCE if the reference count is now zero. */ static inline void piechart_unref (struct piechart *instance) { chart_item_unref (&instance->chart_item); } /* Returns true if INSTANCE's reference count is greater than 1, false otherwise. */ static inline bool piechart_is_shared (const struct piechart *instance) { return chart_item_is_shared (&instance->chart_item); } static inline void piechart_submit (struct piechart *instance) { chart_item_submit (&instance->chart_item); } #endif /* output/charts/piechart.h */ pspp-1.4.1/src/output/charts/np-plot.h0000644000175000017500000000644113320146056017275 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2004, 2008, 2009, 2011 Free Software Foundation, Inc. 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 3 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, see . */ #ifndef OUTPUT_CHARTS_NP_PLOT_H #define OUTPUT_CHARTS_NP_PLOT_H 1 #include "output/chart-item.h" struct np; /* An NP or DNP plot. */ struct np_plot_chart { struct chart_item chart_item; struct casereader *data; bool detrended; /* Copied directly from struct np. */ double y_min, y_max; double dns_min, dns_max; /* Calculated. */ double slope, intercept; double y_first, y_last; double x_lower, x_upper; double slack; }; struct chart_item *np_plot_create (const struct np *, const struct casereader *, const char *label); struct chart_item *dnp_plot_create (const struct np *, const struct casereader *, const char *label); /* This boilerplate for np_plot_chart, a subclass of chart_item, was autogenerated by mk-class-boilerplate. */ #include #include "libpspp/cast.h" extern const struct chart_item_class np_plot_chart_class; /* Returns true if SUPER is a np_plot_chart, otherwise false. */ static inline bool is_np_plot_chart (const struct chart_item *super) { return super->class == &np_plot_chart_class; } /* Returns SUPER converted to np_plot_chart. SUPER must be a np_plot_chart, as reported by is_np_plot_chart. */ static inline struct np_plot_chart * to_np_plot_chart (const struct chart_item *super) { assert (is_np_plot_chart (super)); return UP_CAST (super, struct np_plot_chart, chart_item); } /* Returns INSTANCE converted to chart_item. */ static inline struct chart_item * np_plot_chart_super (const struct np_plot_chart *instance) { return CONST_CAST (struct chart_item *, &instance->chart_item); } /* Increments INSTANCE's reference count and returns INSTANCE. */ static inline struct np_plot_chart * np_plot_chart_ref (const struct np_plot_chart *instance) { return to_np_plot_chart (chart_item_ref (&instance->chart_item)); } /* Decrements INSTANCE's reference count, then destroys INSTANCE if the reference count is now zero. */ static inline void np_plot_chart_unref (struct np_plot_chart *instance) { chart_item_unref (&instance->chart_item); } /* Returns true if INSTANCE's reference count is greater than 1, false otherwise. */ static inline bool np_plot_chart_is_shared (const struct np_plot_chart *instance) { return chart_item_is_shared (&instance->chart_item); } static inline void np_plot_chart_submit (struct np_plot_chart *instance) { chart_item_submit (&instance->chart_item); } #endif /* output/charts/np-plot.h */ pspp-1.4.1/src/output/charts/np-plot.c0000644000175000017500000000657513507505260017303 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2004, 2008, 2009, 2011 Free Software Foundation, Inc. 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 3 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, see . */ #include #include "output/charts/np-plot.h" #include #include "data/casereader.h" #include "libpspp/cast.h" #include "math/np.h" #include "output/chart-item-provider.h" #include "gl/minmax.h" static struct chart_item * make_np_plot (const struct np *np, const struct casereader *reader, const char *label, bool detrended) { struct np_plot_chart *npp; if (np->n <= 1.0) return NULL; npp = xzalloc (sizeof *npp); chart_item_init (&npp->chart_item, &np_plot_chart_class, label); npp->data = casereader_clone (reader); npp->y_min = np->y_min; npp->y_max = np->y_max; npp->dns_min = np->dns_min; npp->dns_max = np->dns_max; npp->detrended = detrended; /* Slope and intercept of the ideal normal probability line. */ npp->slope = 1.0 / np->stddev; npp->intercept = -np->mean / np->stddev; npp->y_first = gsl_cdf_ugaussian_Pinv (1 / (np->n + 1)); npp->y_last = gsl_cdf_ugaussian_Pinv (np->n / (np->n + 1)); /* Need to make sure that both the scatter plot and the ideal fit into the plot. */ npp->x_lower = MIN (np->y_min, (npp->y_first - npp->intercept) / npp->slope); npp->x_upper = MAX (np->y_max, (npp->y_last - npp->intercept) / npp->slope); npp->slack = (npp->x_upper - npp->x_lower) * 0.05; return &npp->chart_item; } /* Creates and returns a normal probability plot corresponding to the calculations in NP and the data in READER, and label the plot with LABEL. The data in READER must have Y-values in value index NP_IDX_Y and NS-values in value index NP_IDX_NS. Returns a null pointer if the data set is empty. The caller retains ownership of NP and READER. */ struct chart_item * np_plot_create (const struct np *np, const struct casereader *reader, const char *label) { return make_np_plot (np, reader, label, false); } /* Creates and returns a detrended normal probability plot corresponding to the calculations in NP and the data in READER, and label the plot with LABEL. The data in READER must have Y-values in value index NP_IDX_Y and DNS-values in value index NP_IDX_DNS. Returns a null pointer if the data set is empty. The caller retains ownership of NP and READER. */ struct chart_item * dnp_plot_create (const struct np *np, const struct casereader *reader, const char *label) { return make_np_plot (np, reader, label, true); } static void np_plot_chart_destroy (struct chart_item *chart_item) { struct np_plot_chart *npp = to_np_plot_chart (chart_item); casereader_destroy (npp->data); free (npp); } const struct chart_item_class np_plot_chart_class = { np_plot_chart_destroy }; pspp-1.4.1/src/output/charts/plot-hist.c0000644000175000017500000000417613571051220017621 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2004, 2009, 2011 Free Software Foundation, Inc. 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 3 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, see . */ #include #include #include #include #include "libpspp/cast.h" #include "math/histogram.h" #include "math/moments.h" #include "output/chart-item-provider.h" #include "output/charts/plot-hist.h" #include "gettext.h" #define _(msgid) gettext (msgid) /* Plots a histogram of the data in HIST with the given LABEL. Labels the histogram with each of N, MEAN, and STDDEV that is not SYSMIS. If all three are not SYSMIS and SHOW_NORMAL is true, also draws a normal curve on the histogram. */ struct chart_item * histogram_chart_create (const gsl_histogram *hist, const char *label, double n, double mean, double stddev, bool show_normal) { struct histogram_chart *h; h = xmalloc (sizeof *h); chart_item_init (&h->chart_item, &histogram_chart_class, label); h->gsl_hist = hist != NULL ? gsl_histogram_clone (hist) : NULL; h->n = n; h->mean = mean; h->stddev = stddev; h->show_normal = show_normal; return &h->chart_item; } static void histogram_chart_destroy (struct chart_item *chart_item) { struct histogram_chart *h = UP_CAST (chart_item, struct histogram_chart, chart_item); if (h->gsl_hist != NULL) gsl_histogram_free (h->gsl_hist); free (h); } const struct chart_item_class histogram_chart_class = { histogram_chart_destroy }; pspp-1.4.1/src/output/charts/barchart-cairo.c0000644000175000017500000001116013711575611020561 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2015, 2016 Free Software Foundation, Inc. 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 3 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, see . */ #include #include "output/charts/barchart.h" #include "output/charts/piechart.h" #include #include "data/variable.h" #include "output/cairo-chart.h" #include "gl/minmax.h" #include "gettext.h" #define _(msgid) gettext (msgid) static void abscissa_label (const struct barchart *bc, cairo_t *cr, struct xrchart_geometry *geom, const union value *prev, double x_pos, double width, int n_last_cat) { struct category *foo = NULL; size_t hash = value_hash (prev, bc->widths[0], 0); HMAP_FOR_EACH_WITH_HASH (foo, struct category, node, hash, &bc->primaries) { if (value_equal (&foo->val, prev, bc->widths[0])) break; } draw_tick (cr, geom, SCALE_ABSCISSA, false, x_pos - (width * n_last_cat) / 2.0, "%s", ds_cstr (&foo->label)); } void xrchart_draw_barchart (const struct chart_item *chart_item, cairo_t *cr, struct xrchart_geometry *geom) { struct barchart *bc = to_barchart (chart_item); int i; xrchart_write_title (cr, geom, _("Bar Chart")); xrchart_write_ylabel (cr, geom, bc->ylabel); xrchart_write_xlabel (cr, geom, chart_item_get_title (chart_item)); if (! xrchart_write_yscale (cr, geom, 0, bc->percent ? bc->largest * 100.0 / bc->total_count : bc->largest)) return; const double abscale = geom->axis[SCALE_ABSCISSA].data_max - geom->axis[SCALE_ABSCISSA].data_min; const double width = abscale / (double) (bc->n_nzcats + bc->n_pcats); double x_pos = 0.5 * width; union value *prev = NULL; if (bc->ss) { const int blob_size = 13; const int height = blob_size * (hmap_count (&bc->secondaries) * 2); cairo_rectangle (cr, geom->axis[SCALE_ABSCISSA].data_max + 10, geom->axis[SCALE_ORDINATE].data_max - height, 100, height); cairo_stroke (cr); int ypos = blob_size * 1.5; for (i = 0 ; i < hmap_count (&bc->secondaries) ; ++i) { const struct category *foo = bc->ss[i]; cairo_move_to (cr, geom->axis[SCALE_ABSCISSA].data_max + (1.5 * blob_size) + 20, geom->axis[SCALE_ORDINATE].data_max - ypos); xrchart_label (cr, 'l', 'b', geom->font_size, ds_cstr (&foo->label)); cairo_rectangle (cr, geom->axis[SCALE_ABSCISSA].data_max + 20, geom->axis[SCALE_ORDINATE].data_max - ypos, blob_size, blob_size); cairo_save (cr); cairo_set_source_rgb (cr, data_colour[foo->idx].red / 255.0, data_colour[foo->idx].green / 255.0, data_colour[foo->idx].blue / 255.0); cairo_fill_preserve (cr); cairo_restore (cr); cairo_stroke (cr); ypos += blob_size * 2; } } int n_last_cat = 0; for (i = 0; i < bc->n_nzcats; i++) { double height = geom->axis[SCALE_ORDINATE].scale * bc->cats[i]->count; if (bc->percent) height *= 100.0 / bc->total_count ; if (prev && !value_equal (prev, &bc->cats[i]->values[0], bc->widths[0])) { abscissa_label (bc, cr, geom, prev, x_pos, width, n_last_cat); x_pos += width; n_last_cat = 0; } cairo_rectangle (cr, geom->axis[SCALE_ABSCISSA].data_min + x_pos, geom->axis[SCALE_ORDINATE].data_min, width, height); cairo_save (cr); int cidx = 0; if (bc->ss) { struct category *foo; size_t hash = value_hash (&bc->cats[i]->values[1], bc->widths[1], 0); HMAP_FOR_EACH_WITH_HASH (foo, struct category, node, hash, &bc->secondaries) { if (value_equal (&foo->val, &bc->cats[i]->values[1], bc->widths[1])) { cidx = foo->idx; break; } } } cairo_set_source_rgb (cr, data_colour[cidx].red / 255.0, data_colour[cidx].green / 255.0, data_colour[cidx].blue / 255.0); cairo_fill_preserve (cr); cairo_restore (cr); cairo_stroke (cr); x_pos += width; prev = &bc->cats[i]->values[0]; n_last_cat ++; } abscissa_label (bc, cr, geom, prev, x_pos, width, n_last_cat); } pspp-1.4.1/src/output/charts/barchart.h0000644000175000017500000000770513507505260017501 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2015 Free Software Foundation, Inc. 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 3 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, see . */ #ifndef BARCHART_H #define BARCHART_H #include "libpspp/str.h" #include "libpspp/hmap.h" #include "data/value.h" #include "output/chart-item.h" struct category { struct hmap_node node; int idx; /* Unique zero based index */ struct string label; /* The label to be displayed for this category */ union value val; /* The value of this category */ int width; /* The width of VAL */ }; struct barchart { struct chart_item chart_item; /* Should the chart be displayed as percentages */ bool percent; /* The categories */ struct freq **cats; /* The total number of categories (regardless of level) */ int n_nzcats; /* The number of primary categories */ int n_pcats; /* The largest count of all the categories */ double largest; /* The sum of all the counts */ double total_count; /* The label for the ordinate (vertical axis) */ char *ylabel; /* The variables holding the categorical values */ const struct variable **var; int n_vars; int widths[2]; /* A hash table of struct category indexed by VAL */ struct hmap primaries; /* A hash table of struct category indexed by VAL */ struct hmap secondaries; /* A array of pointers to the members of the above hmap, (the secondaries) sorted by VAL */ struct category **ss; }; struct variable; struct freq; struct chart_item *barchart_create (const struct variable **, int n_vars, const char *ylabel, bool percent, struct freq *const *, int n_cats); /* This boilerplate for barchart, a subclass of chart_item, was autogenerated by mk-class-boilerplate. */ #include #include "libpspp/cast.h" extern const struct chart_item_class barchart_class; /* Returns true if SUPER is a barchart, otherwise false. */ static inline bool is_barchart (const struct chart_item *super) { return super->class == &barchart_class; } /* Returns SUPER converted to barchart. SUPER must be a barchart, as reported by is_barchart. */ static inline struct barchart * to_barchart (const struct chart_item *super) { assert (is_barchart (super)); return UP_CAST (super, struct barchart, chart_item); } /* Returns INSTANCE converted to chart_item. */ static inline struct chart_item * barchart_super (const struct barchart *instance) { return CONST_CAST (struct chart_item *, &instance->chart_item); } /* Increments INSTANCE's reference count and returns INSTANCE. */ static inline struct barchart * barchart_ref (const struct barchart *instance) { return to_barchart (chart_item_ref (&instance->chart_item)); } /* Decrements INSTANCE's reference count, then destroys INSTANCE if the reference count is now zero. */ static inline void barchart_unref (struct barchart *instance) { chart_item_unref (&instance->chart_item); } /* Returns true if INSTANCE's reference count is greater than 1, false otherwise. */ static inline bool barchart_is_shared (const struct barchart *instance) { return chart_item_is_shared (&instance->chart_item); } static inline void barchart_submit (struct barchart *instance) { chart_item_submit (&instance->chart_item); } #endif /* output/charts/barchart.h */ pspp-1.4.1/src/output/charts/scatterplot.c0000644000175000017500000000405713700645725020255 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2014, 2015 Free Software Foundation, Inc. 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 3 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, see . */ #include #include "output/charts/scatterplot.h" #include #include "data/casereader.h" #include "data/variable.h" #include "libpspp/cast.h" #include "output/chart-item-provider.h" #include "gl/minmax.h" /* Creates a scatterplot */ struct scatterplot_chart * scatterplot_create (struct casereader *reader, const char *xlabel, const char *ylabel, const struct variable *byvar, bool *byvar_overflow, const char *label, double xmin, double xmax, double ymin, double ymax) { struct scatterplot_chart *spc; spc = xzalloc (sizeof *spc); chart_item_init (&spc->chart_item, &scatterplot_chart_class, label); spc->data = reader; spc->y_min = ymin; spc->y_max = ymax; spc->x_min = xmin; spc->x_max = xmax; spc->xlabel = xstrdup (xlabel); spc->ylabel = xstrdup (ylabel); spc->byvar = byvar != NULL ? var_clone (byvar) : NULL; spc->byvar_overflow = byvar_overflow; return spc; } static void scatterplot_chart_destroy (struct chart_item *chart_item) { struct scatterplot_chart *spc = to_scatterplot_chart (chart_item); casereader_destroy (spc->data); free (spc->xlabel); free (spc->ylabel); if (spc->byvar) var_unref (spc->byvar); free (spc); } const struct chart_item_class scatterplot_chart_class = { scatterplot_chart_destroy }; pspp-1.4.1/src/output/charts/piechart-cairo.c0000644000175000017500000001041413670210420020557 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2009, 2011 Free Software Foundation, Inc. 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 3 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, see . */ #include #include "output/charts/piechart.h" #include #include "output/cairo-chart.h" #include "gl/minmax.h" /* Draw a single slice of the pie */ static void draw_segment(cairo_t *cr, double x0, double y0, double radius, double start_angle, double segment_angle, const struct xrchart_colour *colour) { cairo_move_to (cr, x0, y0); cairo_arc (cr, x0, y0, radius, start_angle, start_angle + segment_angle); cairo_line_to (cr, x0, y0); cairo_save (cr); cairo_set_source_rgb (cr, colour->red / 255.0, colour->green / 255.0, colour->blue / 255.0); cairo_fill_preserve (cr); cairo_restore (cr); cairo_stroke (cr); } void xrchart_draw_piechart (const struct chart_item *chart_item, cairo_t *cr, struct xrchart_geometry *geom) { const struct piechart *pie = to_piechart (chart_item); double total_magnitude; double left_label, right_label; double centre_x, centre_y; double radius; double angle; int i; centre_x = (geom->axis[SCALE_ABSCISSA].data_max + geom->axis[SCALE_ORDINATE].data_min) / 2.0 ; centre_y = (geom->axis[SCALE_ORDINATE].data_max + geom->axis[SCALE_ORDINATE].data_min) / 2.0 ; left_label = geom->axis[SCALE_ORDINATE].data_min + (geom->axis[SCALE_ABSCISSA].data_max - geom->axis[SCALE_ORDINATE].data_min)/10.0; right_label = geom->axis[SCALE_ABSCISSA].data_max - (geom->axis[SCALE_ABSCISSA].data_max - geom->axis[SCALE_ORDINATE].data_min)/10.0; radius = MIN (5.0 / 12.0 * (geom->axis[SCALE_ORDINATE].data_max - geom->axis[SCALE_ORDINATE].data_min), 1.0 / 4.0 * (geom->axis[SCALE_ABSCISSA].data_max - geom->axis[SCALE_ORDINATE].data_min)); xrchart_write_title (cr, geom, "%s", chart_item_get_title (chart_item)); total_magnitude = 0.0; for (i = 0; i < pie->n_slices; i++) total_magnitude += pie->slices[i].magnitude; /* Draw the segments */ angle = 0.0; for (i = 0; i < pie->n_slices ; ++i) { const double segment_angle = pie->slices[i].magnitude / total_magnitude * 2 * M_PI ; /* Fill the segment */ draw_segment (cr, centre_x, centre_y, radius, angle, segment_angle, &data_colour[i % XRCHART_N_COLOURS]); angle += segment_angle; } /* Now add the labels. Don't put this in the loop above; the labels must be put in last, otherwise the segment fill could obscure them. */ angle = 0.0; for (i = 0; i < pie->n_slices ; ++i) { const double segment_angle = pie->slices[i].magnitude / total_magnitude * 2 * M_PI ; const double label_x = centre_x + radius * cos (angle + segment_angle/2.0); const double label_y = centre_y + radius * sin (angle + segment_angle/2.0); if (label_x < centre_x) { cairo_move_to (cr, label_x, label_y); cairo_line_to (cr, left_label, label_y); cairo_stroke (cr); cairo_move_to (cr, left_label, label_y + 5); xrchart_label (cr, 'l', 'x', geom->font_size, ds_cstr (&pie->slices[i].label)); } else { cairo_move_to (cr, label_x, label_y); cairo_line_to (cr, right_label, label_y); cairo_stroke (cr); cairo_move_to (cr, right_label, label_y + 5); xrchart_label (cr, 'r', 'x', geom->font_size, ds_cstr (&pie->slices[i].label)); } angle += segment_angle; } /* Draw an outline to the pie */ cairo_arc (cr, centre_x, centre_y, radius, 0, 2 * M_PI); cairo_stroke (cr); } pspp-1.4.1/src/output/charts/roc-chart-cairo.c0000644000175000017500000000436513711575611020666 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2009, 2011 Free Software Foundation, Inc. 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 3 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, see . */ #include #include "output/charts/roc-chart.h" #include "data/case.h" #include "data/casereader.h" #include "language/stats/roc.h" #include "output/cairo-chart.h" #include "gettext.h" #define _(msgid) gettext (msgid) void xrchart_draw_roc (const struct chart_item *chart_item, cairo_t *cr, struct xrchart_geometry *geom) { const struct roc_chart *rc = to_roc_chart (chart_item); size_t i; xrchart_write_title (cr, geom, _("ROC Curve")); xrchart_write_xlabel (cr, geom, _("1 - Specificity")); xrchart_write_ylabel (cr, geom, _("Sensitivity")); if (! xrchart_write_xscale (cr, geom, 0, 1)) return; if (! xrchart_write_yscale (cr, geom, 0, 1)) return; if (rc->reference) { xrchart_line (cr, geom, 1.0, 0, 0.0, 1.0, XRCHART_DIM_X); } for (i = 0; i < rc->n_vars; ++i) { const struct roc_var *rv = &rc->vars[i]; struct casereader *r = casereader_clone (rv->cutpoint_reader); struct ccase *cc; xrchart_vector_start (cr, geom, rv->name); for (; (cc = casereader_read (r)) != NULL; case_unref (cc)) { double se = case_data_idx (cc, ROC_TP)->f; double sp = case_data_idx (cc, ROC_TN)->f; se /= case_data_idx (cc, ROC_FN)->f + case_data_idx (cc, ROC_TP)->f ; sp /= case_data_idx (cc, ROC_TN)->f + case_data_idx (cc, ROC_FP)->f ; xrchart_vector (cr, geom, 1 - sp, se); } xrchart_vector_end (cr, geom); casereader_destroy (r); } xrchart_write_legend (cr, geom); } pspp-1.4.1/src/output/charts/plot-hist-cairo.c0000644000175000017500000001331613711575611020723 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2009, 2011, 2014, 2015 Free Software Foundation, Inc. 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 3 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, see . */ #include #include "math/chart-geometry.h" #include "output/charts/plot-hist.h" #include #include #include "data/val-type.h" #include "output/cairo-chart.h" #include "gl/xvasprintf.h" #include "gl/minmax.h" #include "gettext.h" #define _(msgid) gettext (msgid) /* Write the legend of the chart */ static void histogram_write_legend (cairo_t *cr, const struct xrchart_geometry *geom, double n, double mean, double stddev) { double y = geom->axis[SCALE_ORDINATE].data_min; cairo_save (cr); if (n != SYSMIS) { char *buf = xasprintf (_("N = %.2f"), n); cairo_move_to (cr, geom->legend_left, y); xrchart_label (cr, 'l', 'b', geom->font_size, buf); y += geom->font_size * 1.5; free (buf); } if (mean != SYSMIS) { char *buf = xasprintf (_("Mean = %.1f"), mean); cairo_move_to (cr,geom->legend_left, y); xrchart_label (cr, 'l', 'b', geom->font_size, buf); y += geom->font_size * 1.5; free (buf); } if (stddev != SYSMIS) { char *buf = xasprintf (_("Std. Dev = %.2f"), stddev); cairo_move_to (cr, geom->legend_left, y); xrchart_label (cr, 'l', 'b', geom->font_size, buf); free (buf); } cairo_restore (cr); } static void hist_draw_bar (cairo_t *cr, const struct xrchart_geometry *geom, const gsl_histogram *h, int bar) { double upper; double lower; double height; assert (0 == gsl_histogram_get_range (h, bar, &lower, &upper)); assert (upper >= lower); const double x_pos = (lower - geom->axis[SCALE_ABSCISSA].min) * geom->axis[SCALE_ABSCISSA].scale + geom->axis[SCALE_ABSCISSA].data_min; const double width = (upper - lower) * geom->axis[SCALE_ABSCISSA].scale; height = geom->axis[SCALE_ORDINATE].scale * gsl_histogram_get (h, bar); cairo_rectangle (cr, x_pos, geom->axis[SCALE_ORDINATE].data_min, width, height); cairo_save (cr); cairo_set_source_rgb (cr, geom->fill_colour.red / 255.0, geom->fill_colour.green / 255.0, geom->fill_colour.blue / 255.0); cairo_fill_preserve (cr); cairo_restore (cr); cairo_stroke (cr); } void xrchart_draw_histogram (const struct chart_item *chart_item, cairo_t *cr, struct xrchart_geometry *geom) { struct histogram_chart *h = to_histogram_chart (chart_item); int i; int bins; xrchart_write_title (cr, geom, _("HISTOGRAM")); xrchart_write_ylabel (cr, geom, _("Frequency")); xrchart_write_xlabel (cr, geom, chart_item_get_title (chart_item)); if (h->gsl_hist == NULL) { /* Probably all values are SYSMIS. */ return; } if (! xrchart_write_yscale (cr, geom, 0, gsl_histogram_max_val (h->gsl_hist))) return; if (! xrchart_write_xscale (cr, geom, gsl_histogram_min (h->gsl_hist), gsl_histogram_max (h->gsl_hist))) return; /* Draw the ticks and compute if the rendered tick text is wider than the bin */ bins = gsl_histogram_bins (h->gsl_hist); for (i = 0; i < bins; i++) { hist_draw_bar (cr, geom, h->gsl_hist, i); } histogram_write_legend (cr, geom, h->n, h->mean, h->stddev); if (h->show_normal && h->n != SYSMIS && h->mean != SYSMIS && h->stddev != SYSMIS) { /* Draw the normal curve */ double x_min, x_max; double ordinate_scale; double binwidth; double x; gsl_histogram_get_range (h->gsl_hist, 0, &x_min, &x_max); binwidth = x_max - x_min; /* The integral over the histogram is binwidth * sum(bin_i), while the integral over the pdf is 1 */ /* Therefore the pdf has to be scaled accordingly such that the integrals are equal */ ordinate_scale = binwidth * gsl_histogram_sum(h->gsl_hist); /* Clip normal curve to the rectangle formed by the axes. */ cairo_save (cr); cairo_rectangle (cr, geom->axis[SCALE_ABSCISSA].data_min, geom->axis[SCALE_ORDINATE].data_min, geom->axis[SCALE_ABSCISSA].data_max - geom->axis[SCALE_ABSCISSA].data_min, geom->axis[SCALE_ORDINATE].data_max - geom->axis[SCALE_ORDINATE].data_min); cairo_clip (cr); cairo_move_to (cr, geom->axis[SCALE_ABSCISSA].data_min, geom->axis[SCALE_ORDINATE].data_min); for (x = geom->axis[SCALE_ABSCISSA].min; x <= geom->axis[SCALE_ABSCISSA].max; x += (geom->axis[SCALE_ABSCISSA].max - geom->axis[SCALE_ABSCISSA].min) / 100.0) { const double y = gsl_ran_gaussian_pdf (x - h->mean, h->stddev) * ordinate_scale; /* Transform to drawing coordinates */ const double x_pos = (x - geom->axis[SCALE_ABSCISSA].min) * geom->axis[SCALE_ABSCISSA].scale + geom->axis[SCALE_ABSCISSA].data_min; const double y_pos = (y - geom->axis[SCALE_ORDINATE].min) * geom->axis[SCALE_ORDINATE].scale + geom->axis[SCALE_ORDINATE].data_min; cairo_line_to (cr, x_pos, y_pos); } cairo_stroke (cr); cairo_restore (cr); } } pspp-1.4.1/src/output/charts/roc-chart.h0000644000175000017500000000567013320146056017571 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2009, 2011 Free Software Foundation, Inc. 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 3 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, see . */ #ifndef OUTPUT_CHARTS_ROC_CHART_H #define OUTPUT_CHARTS_ROC_CHART_H 1 #include #include #include "output/chart-item.h" struct roc_chart { struct chart_item chart_item; bool reference; struct roc_var *vars; size_t n_vars; size_t allocated_vars; }; struct roc_var { char *name; struct casereader *cutpoint_reader; }; struct roc_chart *roc_chart_create (bool reference); void roc_chart_add_var (struct roc_chart *, const char *var_name, const struct casereader *cutpoint_reader); /* This boilerplate for roc_chart, a subclass of chart_item, was autogenerated by mk-class-boilerplate. */ #include #include "libpspp/cast.h" extern const struct chart_item_class roc_chart_class; /* Returns true if SUPER is a roc_chart, otherwise false. */ static inline bool is_roc_chart (const struct chart_item *super) { return super->class == &roc_chart_class; } /* Returns SUPER converted to roc_chart. SUPER must be a roc_chart, as reported by is_roc_chart. */ static inline struct roc_chart * to_roc_chart (const struct chart_item *super) { assert (is_roc_chart (super)); return UP_CAST (super, struct roc_chart, chart_item); } /* Returns INSTANCE converted to chart_item. */ static inline struct chart_item * roc_chart_super (const struct roc_chart *instance) { return CONST_CAST (struct chart_item *, &instance->chart_item); } /* Increments INSTANCE's reference count and returns INSTANCE. */ static inline struct roc_chart * roc_chart_ref (const struct roc_chart *instance) { return to_roc_chart (chart_item_ref (&instance->chart_item)); } /* Decrements INSTANCE's reference count, then destroys INSTANCE if the reference count is now zero. */ static inline void roc_chart_unref (struct roc_chart *instance) { chart_item_unref (&instance->chart_item); } /* Returns true if INSTANCE's reference count is greater than 1, false otherwise. */ static inline bool roc_chart_is_shared (const struct roc_chart *instance) { return chart_item_is_shared (&instance->chart_item); } static inline void roc_chart_submit (struct roc_chart *instance) { chart_item_submit (&instance->chart_item); } #endif /* output/charts/roc-chart.h */ pspp-1.4.1/src/output/charts/spreadlevel-plot.c0000644000175000017500000000462413711575611021171 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2012, 2020 Free Software Foundation, Inc. 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 3 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, see . */ #include #include "output/charts/spreadlevel-plot.h" #include "libpspp/cast.h" #include "output/chart-item-provider.h" #include "gl/xalloc.h" #include "gl/minmax.h" #include #include #include struct chart_item * spreadlevel_plot_create (const char *label, double tx_pwr) { struct spreadlevel_plot_chart *sl = xzalloc (sizeof *sl); chart_item_init (&sl->chart_item, &spreadlevel_plot_chart_class, label); sl->x_lower = DBL_MAX; sl->x_upper = -DBL_MAX; sl->y_lower = DBL_MAX; sl->y_upper = -DBL_MAX; sl->tx_pwr = tx_pwr; sl->n_data = 0; sl->data = NULL; return &sl->chart_item; } void spreadlevel_plot_add (struct chart_item *ci, double spread, double level) { struct spreadlevel_plot_chart *sl = to_spreadlevel_plot_chart (ci); /* Zero has a special meaning, in this implementation. */ if (sl->tx_pwr == 0) { spread = log (fabs (spread)); level = log (fabs (level)); } else { spread = pow (spread, sl->tx_pwr); level = pow (level, sl->tx_pwr); } sl->x_lower = MIN (sl->x_lower, level); sl->x_upper = MAX (sl->x_upper, level); sl->y_lower = MIN (sl->y_lower, spread); sl->y_upper = MAX (sl->y_upper, spread); sl->n_data++; sl->data = xrealloc (sl->data, sizeof (*sl->data) * sl->n_data); sl->data[sl->n_data - 1].x = level; sl->data[sl->n_data - 1].y = spread; } static void spreadlevel_plot_chart_destroy (struct chart_item *chart_item) { struct spreadlevel_plot_chart *sl = to_spreadlevel_plot_chart (chart_item); free (sl->data); free (sl); } const struct chart_item_class spreadlevel_plot_chart_class = { spreadlevel_plot_chart_destroy }; pspp-1.4.1/src/output/charts/scree.c0000644000175000017500000000273413320146056017001 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2009, 2011 Free Software Foundation, Inc. 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 3 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, see . */ #include #include "output/charts/scree.h" #include "output/chart-item-provider.h" #include "gl/xalloc.h" #include "gettext.h" #define _(msgid) gettext (msgid) struct scree * scree_create (const gsl_vector *eigenvalues, const char *xlabel) { struct scree *rc = xmalloc (sizeof *rc); chart_item_init (&rc->chart_item, &scree_class, NULL); rc->eval = gsl_vector_alloc (eigenvalues->size); gsl_vector_memcpy (rc->eval, eigenvalues); rc->xlabel = xstrdup (xlabel); return rc; } static void scree_destroy (struct chart_item *chart_item) { struct scree *rc = to_scree (chart_item); gsl_vector_free (rc->eval); free (rc->xlabel); free (rc); } const struct chart_item_class scree_class = { scree_destroy }; pspp-1.4.1/src/output/charts/spreadlevel-plot.h0000644000175000017500000000624613320146056021171 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2012 Free Software Foundation, Inc. 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 3 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, see . */ #ifndef OUTPUT_CHARTS_SL_PLOT_H #define OUTPUT_CHARTS_SL_PLOT_H 1 #include "output/chart-item.h" struct datum { double x; double y; }; struct spreadlevel_plot_chart { struct chart_item chart_item; /* Calculated parameters */ double y_lower, y_upper; double x_lower, x_upper; double tx_pwr; size_t n_data; struct datum *data; }; struct chart_item *spreadlevel_plot_create (const char *label, double slp); void spreadlevel_plot_add (struct chart_item *, double spread, double level); /* This boilerplate for spreadlevel_plot_chart, a subclass of chart_item, was autogenerated by mk-class-boilerplate. */ #include #include "libpspp/cast.h" extern const struct chart_item_class spreadlevel_plot_chart_class; /* Returns true if SUPER is a spreadlevel_plot_chart, otherwise false. */ static inline bool is_spreadlevel_plot_chart (const struct chart_item *super) { return super->class == &spreadlevel_plot_chart_class; } /* Returns SUPER converted to spreadlevel_plot_chart. SUPER must be a spreadlevel_plot_chart, as reported by is_spreadlevel_plot_chart. */ static inline struct spreadlevel_plot_chart * to_spreadlevel_plot_chart (const struct chart_item *super) { assert (is_spreadlevel_plot_chart (super)); return UP_CAST (super, struct spreadlevel_plot_chart, chart_item); } /* Returns INSTANCE converted to chart_item. */ static inline struct chart_item * spreadlevel_plot_chart_super (const struct spreadlevel_plot_chart *instance) { return CONST_CAST (struct chart_item *, &instance->chart_item); } /* Increments INSTANCE's reference count and returns INSTANCE. */ static inline struct spreadlevel_plot_chart * spreadlevel_plot_chart_ref (const struct spreadlevel_plot_chart *instance) { return to_spreadlevel_plot_chart (chart_item_ref (&instance->chart_item)); } /* Decrements INSTANCE's reference count, then destroys INSTANCE if the reference count is now zero. */ static inline void spreadlevel_plot_chart_unref (struct spreadlevel_plot_chart *instance) { chart_item_unref (&instance->chart_item); } /* Returns true if INSTANCE's reference count is greater than 1, false otherwise. */ static inline bool spreadlevel_plot_chart_is_shared (const struct spreadlevel_plot_chart *instance) { return chart_item_is_shared (&instance->chart_item); } static inline void spreadlevel_plot_chart_submit (struct spreadlevel_plot_chart *instance) { chart_item_submit (&instance->chart_item); } #endif pspp-1.4.1/src/output/charts/scatterplot.h0000644000175000017500000000677213320146056020257 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2014, 2015 Free Software Foundation, Inc. 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 3 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, see . */ #ifndef OUTPUT_CHARTS_SCATTERPLOT_H #define OUTPUT_CHARTS_SCATTERPLOT_H 1 #include "output/chart-item.h" /* Indices for the scatterplot_proto members */ enum { SP_IDX_X, /* x value */ SP_IDX_Y, /* y value */ SP_IDX_BY, /* graph category for xy plot */ }; /* A scatterplot. */ struct scatterplot_chart { struct chart_item chart_item; struct casereader *data; struct variable *byvar; char *xlabel; char *ylabel; double y_min, y_max; double x_min, x_max; /* If the number of distinct values of byvar */ /* exceeds a certain limit, the warning flag */ /* is activated after the chart is drawn */ bool *byvar_overflow; }; struct scatterplot_chart * scatterplot_create (struct casereader *, const char *xlabel, const char *ylabel, const struct variable *, bool *, const char *label, double xmin, double xmax, double ymin, double ymax); /* This boilerplate for scatterplot_chart, a subclass of chart_item, was autogenerated by mk-class-boilerplate. */ #include #include "libpspp/cast.h" extern const struct chart_item_class scatterplot_chart_class; /* Returns true if SUPER is a scatterplot_chart, otherwise false. */ static inline bool is_scatterplot_chart (const struct chart_item *super) { return super->class == &scatterplot_chart_class; } /* Returns SUPER converted to scatterplot_chart. SUPER must be a scatterplot_chart, as reported by is_scatterplot_chart. */ static inline struct scatterplot_chart * to_scatterplot_chart (const struct chart_item *super) { assert (is_scatterplot_chart (super)); return UP_CAST (super, struct scatterplot_chart, chart_item); } /* Returns INSTANCE converted to chart_item. */ static inline struct chart_item * scatterplot_chart_super (const struct scatterplot_chart *instance) { return CONST_CAST (struct chart_item *, &instance->chart_item); } /* Increments INSTANCE's reference count and returns INSTANCE. */ static inline struct scatterplot_chart * scatterplot_chart_ref (const struct scatterplot_chart *instance) { return to_scatterplot_chart (chart_item_ref (&instance->chart_item)); } /* Decrements INSTANCE's reference count, then destroys INSTANCE if the reference count is now zero. */ static inline void scatterplot_chart_unref (struct scatterplot_chart *instance) { chart_item_unref (&instance->chart_item); } /* Returns true if INSTANCE's reference count is greater than 1, false otherwise. */ static inline bool scatterplot_chart_is_shared (const struct scatterplot_chart *instance) { return chart_item_is_shared (&instance->chart_item); } static inline void scatterplot_chart_submit (struct scatterplot_chart *instance) { chart_item_submit (&instance->chart_item); } #endif /* output/charts/scatterplot.h */ pspp-1.4.1/src/output/charts/scree-cairo.c0000644000175000017500000000365613711575611020107 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2009, 2011 Free Software Foundation, Inc. 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 3 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, see . */ #include #include "output/charts/scree.h" #include #include "output/cairo-chart.h" #include "gettext.h" #define _(msgid) gettext (msgid) void xrchart_draw_scree (const struct chart_item *chart_item, cairo_t *cr, struct xrchart_geometry *geom) { const struct scree *rc = to_scree (chart_item); size_t i; double min, max; xrchart_write_title (cr, geom, _("Scree Plot")); xrchart_write_xlabel (cr, geom, rc->xlabel); xrchart_write_ylabel (cr, geom, _("Eigenvalue")); gsl_vector_minmax (rc->eval, &min, &max); if (fabs (max) > fabs (min)) max = fabs (max); else max = fabs (min); if (! xrchart_write_yscale (cr, geom, 0, max)) return; if (! xrchart_write_xscale (cr, geom, 0, rc->eval->size + 1)) return; xrchart_vector_start (cr, geom, ""); for (i = 0 ; i < rc->eval->size; ++i) { const double x = 1 + i; const double y = gsl_vector_get (rc->eval, i); xrchart_vector (cr, geom, x, y); } xrchart_vector_end (cr, geom); for (i = 0 ; i < rc->eval->size; ++i) { const double x = 1 + i; const double y = gsl_vector_get (rc->eval, i); xrchart_datum (cr, geom, 0, x, y); } } pspp-1.4.1/src/output/charts/boxplot.c0000644000175000017500000000450313416510307017363 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2004, 2008, 2009, 2011 Free Software Foundation, Inc. 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 3 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, see . */ #include #include "output/charts/boxplot.h" #include "math/box-whisker.h" #include "output/chart-item-provider.h" struct boxplot * boxplot_create (double y_min, double y_max, const char *title) { if (y_min >= y_max) return NULL; struct boxplot *boxplot = xmalloc (sizeof *boxplot); chart_item_init (&boxplot->chart_item, &boxplot_class, title); boxplot->y_min = y_min; boxplot->y_max = y_max; boxplot->boxes = NULL; boxplot->n_boxes = boxplot->boxes_allocated = 0; return boxplot; } void boxplot_add_box (struct boxplot *boxplot, struct box_whisker *bw, const char *label) { if (boxplot == NULL) { struct statistic *statistic = &bw->parent.parent; statistic->destroy (statistic); return; } struct boxplot_box *box; if (boxplot->n_boxes >= boxplot->boxes_allocated) boxplot->boxes = x2nrealloc (boxplot->boxes, &boxplot->boxes_allocated, sizeof *boxplot->boxes); box = &boxplot->boxes[boxplot->n_boxes++]; box->bw = bw; box->label = xstrdup (label); } static void boxplot_chart_destroy (struct chart_item *chart_item) { struct boxplot *boxplot = to_boxplot (chart_item); if (boxplot == NULL) return; size_t i; for (i = 0; i < boxplot->n_boxes; i++) { struct boxplot_box *box = &boxplot->boxes[i]; struct statistic *statistic = &box->bw->parent.parent; statistic->destroy (statistic); free (box->label); } free (boxplot->boxes); free (boxplot); } const struct chart_item_class boxplot_class = { boxplot_chart_destroy }; pspp-1.4.1/src/output/charts/piechart.c0000644000175000017500000000475613670210420017500 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2004, 2009, 2011 Free Software Foundation, Inc. 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 3 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, see . */ #include #include "output/charts/piechart.h" #include #include "libpspp/cast.h" #include "libpspp/str.h" #include "data/variable.h" #include "output/chart-item-provider.h" #include "gl/xalloc.h" #include "gettext.h" #define _(msgid) gettext (msgid) #define N_(msgid) msgid /* Creates and returns a chart that will render a piechart with the of VAR and the N_SLICES described in SLICES. */ struct chart_item * piechart_create (const struct variable *var, const struct freq *slices, int n_slices) { struct piechart *pie; int i; pie = xmalloc (sizeof *pie); chart_item_init (&pie->chart_item, &piechart_class, var_to_string (var)); pie->slices = xnmalloc (n_slices, sizeof *pie->slices); for (i = 0; i < n_slices; i++) { const struct freq *src = &slices[i]; struct slice *dst = &pie->slices[i]; ds_init_empty (&dst->label); if (var_is_value_missing (var, &src->values[0], MV_ANY)) ds_assign_cstr (&dst->label, _("*MISSING*")); else var_append_value_name (var, &src->values[0], &dst->label); /* Chomp any whitespace from the RHS of the label. Doing this ensures that those labels to the right of the pie, appear right justified. */ ds_rtrim (&dst->label, ss_cstr (" \t")); ds_ltrim (&dst->label, ss_cstr (" \t")); dst->magnitude = src->count; } pie->n_slices = n_slices; return &pie->chart_item; } static void piechart_destroy (struct chart_item *chart_item) { struct piechart *pie = to_piechart (chart_item); int i; for (i = 0; i < pie->n_slices; i++) { struct slice *slice = &pie->slices[i]; ds_destroy (&slice->label); } free (pie->slices); free (pie); } const struct chart_item_class piechart_class = { piechart_destroy }; pspp-1.4.1/src/output/charts/scree.h0000644000175000017500000000540113320146056017000 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2009, 2011 Free Software Foundation, Inc. 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 3 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, see . */ #ifndef OUTPUT_CHARTS_SCREE_H #define OUTPUT_CHARTS_SCREE_H 1 #include #include "output/chart-item.h" /* A scree plot. */ struct scree { struct chart_item chart_item; gsl_vector *eval; char *xlabel; }; /* Create a "Scree Plot" of EIGENVALUES with LABEL on the X Axis */ struct scree *scree_create (const gsl_vector *eigenvalues, const char *label); /* Return the chart underlying SCREE */ struct chart *scree_get_chart (struct scree *scree); /* This boilerplate for scree, a subclass of chart_item, was autogenerated by mk-class-boilerplate. */ #include #include "libpspp/cast.h" extern const struct chart_item_class scree_class; /* Returns true if SUPER is a scree, otherwise false. */ static inline bool is_scree (const struct chart_item *super) { return super->class == &scree_class; } /* Returns SUPER converted to scree. SUPER must be a scree, as reported by is_scree. */ static inline struct scree * to_scree (const struct chart_item *super) { assert (is_scree (super)); return UP_CAST (super, struct scree, chart_item); } /* Returns INSTANCE converted to chart_item. */ static inline struct chart_item * scree_super (const struct scree *instance) { return CONST_CAST (struct chart_item *, &instance->chart_item); } /* Increments INSTANCE's reference count and returns INSTANCE. */ static inline struct scree * scree_ref (const struct scree *instance) { return to_scree (chart_item_ref (&instance->chart_item)); } /* Decrements INSTANCE's reference count, then destroys INSTANCE if the reference count is now zero. */ static inline void scree_unref (struct scree *instance) { chart_item_unref (&instance->chart_item); } /* Returns true if INSTANCE's reference count is greater than 1, false otherwise. */ static inline bool scree_is_shared (const struct scree *instance) { return chart_item_is_shared (&instance->chart_item); } static inline void scree_submit (struct scree *instance) { chart_item_submit (&instance->chart_item); } #endif /* output/charts/scree.h */ pspp-1.4.1/src/output/output-item-provider.h0000644000175000017500000000247413413044256020550 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2009, 2011 Free Software Foundation, Inc. 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 3 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, see . */ #ifndef OUTPUT_ITEM_PROVIDER_H #define OUTPUT_ITEM_PROVIDER_H 1 #include "output/output-item.h" /* Class structure for an output item. This structure must be provided by an output_item subclass to initialize an instance of output_item. */ struct output_item_class { const char *name; /* Destroys and frees ITEM. Called when output_item_unref() drops ITEM's reference count to 0. */ void (*destroy) (struct output_item *item); }; void output_item_init (struct output_item *, const struct output_item_class *); #endif /* output/output-item-provider.h */ pspp-1.4.1/src/output/page-setup-item.c0000644000175000017500000000530213413044256017416 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2018 Free Software Foundation, Inc. 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 3 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, see . */ #include #include "output/page-setup-item.h" #include #include "output/driver-provider.h" #include "output/output-item-provider.h" #include "gl/xalloc.h" void page_heading_copy (struct page_heading *dst, const struct page_heading *src) { dst->n = src->n; dst->paragraphs = xmalloc (dst->n * sizeof *dst->paragraphs); for (size_t i = 0; i < dst->n; i++) { dst->paragraphs[i].markup = xstrdup (src->paragraphs[i].markup); dst->paragraphs[i].halign = src->paragraphs[i].halign; } } void page_heading_uninit (struct page_heading *ph) { if (!ph) return; for (size_t i = 0; i < ph->n; i++) free (ph->paragraphs[i].markup); free (ph->paragraphs); } struct page_setup * page_setup_clone (const struct page_setup *old) { struct page_setup *new = xmalloc (sizeof *new); *new = *old; for (int i = 0; i < 2; i++) page_heading_copy (&new->headings[i], &old->headings[i]); if (new->file_name) new->file_name = xstrdup (new->file_name); return new; } void page_setup_destroy (struct page_setup *ps) { if (ps) { for (int i = 0; i < 2; i++) page_heading_uninit (&ps->headings[i]); free (ps->file_name); free (ps); } } struct page_setup_item * page_setup_item_create (const struct page_setup *ps) { struct page_setup_item *item = xmalloc (sizeof *item); output_item_init (&item->output_item, &page_setup_item_class); item->page_setup = page_setup_clone (ps); return item; } /* Submits ITEM to the configured output drivers, and transfers ownership to the output subsystem. */ void page_setup_item_submit (struct page_setup_item *item) { output_submit (&item->output_item); } static void page_setup_item_destroy (struct output_item *output_item) { struct page_setup_item *item = to_page_setup_item (output_item); page_setup_destroy (item->page_setup); free (item); } const struct output_item_class page_setup_item_class = { "page_setup", page_setup_item_destroy, }; pspp-1.4.1/src/output/page-setup-item.h0000644000175000017500000001105713602145300017417 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2009, 2010, 2011, 2018 Free Sonftware Foundation, Inc. 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 3 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, see . */ #ifndef OUTPUT_PAGE_SETUP_ITEM_H #define OUTPUT_PAGE_SETUP_ITEM_H 1 /* Page setup items. A page setup item configures the paper size, margins, header and footer, and other attributes used for printing. */ #include #include "output/output-item.h" #include "table.h" enum page_orientation { PAGE_PORTRAIT, PAGE_LANDSCAPE }; enum page_chart_size { PAGE_CHART_AS_IS, PAGE_CHART_FULL_HEIGHT, PAGE_CHART_HALF_HEIGHT, PAGE_CHART_QUARTER_HEIGHT, }; struct page_paragraph { char *markup; enum table_halign halign; }; struct page_heading { struct page_paragraph *paragraphs; size_t n; }; void page_heading_copy (struct page_heading *, const struct page_heading *); void page_heading_uninit (struct page_heading *); struct page_setup { int initial_page_number; double paper[TABLE_N_AXES]; /* Paper size in inches. */ double margins[TABLE_N_AXES][2]; /* In inches. */ enum page_orientation orientation; double object_spacing; /* Space between objects, in inches. */ enum page_chart_size chart_size; struct page_heading headings[2]; /* Header and footer. */ char *file_name; }; #define PAGE_SETUP_INITIALIZER \ { \ .initial_page_number = 1, \ .paper = { [TABLE_HORZ] = 8.5, [TABLE_VERT] = 11.0 }, \ .margins = { { 0.5, 0.5 }, { 0.5, 0.5 } }, \ .orientation = PAGE_PORTRAIT, \ .object_spacing = 12.0 / 72.0, \ .chart_size = PAGE_CHART_AS_IS, \ } struct page_setup *page_setup_clone (const struct page_setup *); void page_setup_destroy (struct page_setup *); /* A page setup item. */ struct page_setup_item { struct output_item output_item; struct page_setup *page_setup; }; struct page_setup_item *page_setup_item_create (const struct page_setup *); /* This boilerplate for page_setup_item, a subclass of output_item, was autogenerated by mk-class-boilerplate. */ #include #include "libpspp/cast.h" extern const struct output_item_class page_setup_item_class; /* Returns true if SUPER is a page_setup_item, otherwise false. */ static inline bool is_page_setup_item (const struct output_item *super) { return super->class == &page_setup_item_class; } /* Returns SUPER converted to page_setup_item. SUPER must be a page_setup_item, as reported by is_page_setup_item. */ static inline struct page_setup_item * to_page_setup_item (const struct output_item *super) { assert (is_page_setup_item (super)); return UP_CAST (super, struct page_setup_item, output_item); } /* Returns INSTANCE converted to output_item. */ static inline struct output_item * page_setup_item_super (const struct page_setup_item *instance) { return CONST_CAST (struct output_item *, &instance->output_item); } /* Increments INSTANCE's reference count and returns INSTANCE. */ static inline struct page_setup_item * page_setup_item_ref (const struct page_setup_item *instance) { return to_page_setup_item (output_item_ref (&instance->output_item)); } /* Decrements INSTANCE's reference count, then destroys INSTANCE if the reference count is now zero. */ static inline void page_setup_item_unref (struct page_setup_item *instance) { output_item_unref (&instance->output_item); } /* Returns true if INSTANCE's reference count is greater than 1, false otherwise. */ static inline bool page_setup_item_is_shared (const struct page_setup_item *instance) { return output_item_is_shared (&instance->output_item); } void page_setup_item_submit (struct page_setup_item *); #endif /* output/page-setup-item.h */ pspp-1.4.1/src/output/text-item.c0000644000175000017500000001063413602145300016324 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2009, 2010, 2011 Free Software Foundation, Inc. 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 3 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, see . */ #include #include "output/text-item.h" #include #include #include "libpspp/cast.h" #include "libpspp/pool.h" #include "output/driver.h" #include "output/output-item-provider.h" #include "output/table.h" #include "output/table-item.h" #include "output/table-provider.h" #include "gl/xalloc.h" #include "gl/xvasprintf.h" #include "gettext.h" #define _(msgid) gettext (msgid) const char * text_item_type_to_string (enum text_item_type type) { switch (type) { case TEXT_ITEM_PAGE_TITLE: return _("Page Title"); case TEXT_ITEM_TITLE: return _("Title"); case TEXT_ITEM_SYNTAX: case TEXT_ITEM_LOG: return _("Log"); case TEXT_ITEM_EJECT_PAGE: return _("Page Break"); default: return _("Text"); } } /* Creates and returns a new text item containing TEXT and the specified TYPE. The new text item takes ownership of TEXT. */ struct text_item * text_item_create_nocopy (enum text_item_type type, char *text) { struct text_item *item = xzalloc (sizeof *item); output_item_init (&item->output_item, &text_item_class); item->text = text; item->type = type; return item; } /* Creates and returns a new text item containing a copy of TEXT and the specified TYPE. The caller retains ownership of TEXT. */ struct text_item * text_item_create (enum text_item_type type, const char *text) { return text_item_create_nocopy (type, xstrdup (text)); } /* Creates and returns a new text item containing a copy of FORMAT, which is formatted as if by printf(), and the specified TYPE. The caller retains ownership of FORMAT. */ struct text_item * text_item_create_format (enum text_item_type type, const char *format, ...) { struct text_item *item; va_list args; va_start (args, format); item = text_item_create_nocopy (type, xvasprintf (format, args)); va_end (args); return item; } /* Returns ITEM's type. */ enum text_item_type text_item_get_type (const struct text_item *item) { return item->type; } /* Returns ITEM's text, which the caller may not modify or free. */ const char * text_item_get_text (const struct text_item *item) { return item->text; } /* Submits ITEM to the configured output drivers, and transfers ownership to the output subsystem. */ void text_item_submit (struct text_item *item) { output_submit (&item->output_item); } struct table_item * text_item_to_table_item (struct text_item *text_item) { struct table *tab = table_create (1, 1, 0, 0, 0, 0); struct area_style *style = pool_alloc (tab->container, sizeof *style); *style = (struct area_style) { AREA_STYLE_INITIALIZER__, .cell_style.halign = TABLE_HALIGN_LEFT }; struct font_style *font_style = &style->font_style; if (text_item->typeface) font_style->typeface = pool_strdup (tab->container, text_item->typeface); font_style->size = text_item->size; font_style->bold = text_item->bold; font_style->italic = text_item->italic; font_style->underline = text_item->underline; font_style->markup = text_item->markup; tab->styles[0] = style; int opts = 0; if (text_item->markup) opts |= TAB_MARKUP; if (text_item->type == TEXT_ITEM_SYNTAX || text_item->type == TEXT_ITEM_LOG) opts |= TAB_FIX; table_text (tab, 0, 0, opts, text_item_get_text (text_item)); struct table_item *table_item = table_item_create (tab, NULL, NULL); text_item_unref (text_item); return table_item; } static void text_item_destroy (struct output_item *output_item) { struct text_item *item = to_text_item (output_item); free (item->text); free (item->typeface); free (item); } const struct output_item_class text_item_class = { "text", text_item_destroy, }; pspp-1.4.1/src/output/output-item.c0000644000175000017500000000437213320146056016710 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2009, 2011 Free Software Foundation, Inc. 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 3 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, see . */ #include #include "output/output-item-provider.h" #include #include #include "libpspp/assertion.h" #include "libpspp/cast.h" #include "gl/xalloc.h" /* Increases ITEM's reference count, indicating that it has an additional owner. An output item that is shared among multiple owners must not be modified. */ struct output_item * output_item_ref (const struct output_item *item_) { struct output_item *item = CONST_CAST (struct output_item *, item_); item->ref_cnt++; return item; } /* Decreases ITEM's reference count, indicating that it has one fewer owner. If ITEM no longer has any owners, it is freed. */ void output_item_unref (struct output_item *item) { if (item != NULL) { assert (item->ref_cnt > 0); if (--item->ref_cnt == 0) item->class->destroy (item); } } /* Returns true if ITEM has more than one owner. An output item that is shared among multiple owners must not be modified. */ bool output_item_is_shared (const struct output_item *item) { return item->ref_cnt > 1; } /* Initializes ITEM as an output item of the specified CLASS, initially with a reference count of 1. An output item is an abstract class, that is, a plain output_item is not useful on its own. Thus, this function is normally called from the initialization function of some subclass of output_item. */ void output_item_init (struct output_item *item, const struct output_item_class *class) { item->class = class; item->ref_cnt = 1; } pspp-1.4.1/src/output/ascii.c0000644000175000017500000006603213670210420015500 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 1997-9, 2000, 2007, 2009, 2010, 2011, 2012, 2013, 2014 Free Software Foundation, Inc. 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 3 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, see . */ #include #include #include #include #include #include #include #include #include #include #include #ifdef HAVE_TERMIOS_H # include #endif #ifdef GWINSZ_IN_SYS_IOCTL # include #endif #include "data/file-name.h" #include "data/file-handle-def.h" #include "data/settings.h" #include "libpspp/assertion.h" #include "libpspp/cast.h" #include "libpspp/compiler.h" #include "libpspp/message.h" #include "libpspp/start-date.h" #include "libpspp/string-map.h" #include "libpspp/u8-line.h" #include "libpspp/version.h" #include "output/ascii.h" #include "output/cairo.h" #include "output/chart-item-provider.h" #include "output/driver-provider.h" #include "output/message-item.h" #include "output/options.h" #include "output/render.h" #include "output/table-item.h" #include "output/text-item.h" #include "gl/minmax.h" #include "gl/xalloc.h" #include "gl/xsize.h" #include "gettext.h" #define _(msgid) gettext (msgid) /* This file uses TABLE_HORZ and TABLE_VERT enough to warrant abbreviating. */ #define H TABLE_HORZ #define V TABLE_VERT enum { ASCII_LINE_NONE, ASCII_LINE_SINGLE, ASCII_LINE_DOUBLE, ASCII_N_LINES }; #define N_BOX (ASCII_N_LINES * ASCII_N_LINES \ * ASCII_N_LINES * ASCII_N_LINES) static const ucs4_t ascii_box_chars[N_BOX] = { ' ', '|', '#', '-', '+', '#', '=', '#', '#', '|', '|', '#', '+', '+', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '-', '+', '#', '-', '+', '#', '#', '#', '#', '+', '+', '#', '+', '+', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '=', '#', '#', '#', '#', '#', '=', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', }; static const ucs4_t unicode_box_chars[N_BOX] = { 0x0020, 0x2575, 0x2551, 0x2574, 0x256f, 0x255c, 0x2550, 0x255b, 0x255d, 0x2577, 0x2502, 0x2551, 0x256e, 0x2524, 0x2562, 0x2555, 0x2561, 0x2563, 0x2551, 0x2551, 0x2551, 0x2556, 0x2562, 0x2562, 0x2557, 0x2563, 0x2563, 0x2576, 0x2570, 0x2559, 0x2500, 0x2534, 0x2568, 0x2550, 0x2567, 0x2569, 0x256d, 0x251c, 0x255f, 0x252c, 0x253c, 0x256a, 0x2564, 0x256a, 0x256c, 0x2553, 0x255f, 0x255f, 0x2565, 0x256b, 0x256b, 0x2566, 0x256c, 0x256c, 0x2550, 0x2558, 0x255a, 0x2550, 0x2567, 0x2569, 0x2550, 0x2567, 0x2569, 0x2552, 0x255e, 0x2560, 0x2564, 0x256a, 0x256c, 0x2564, 0x256a, 0x256c, 0x2554, 0x2560, 0x2560, 0x2560, 0x256c, 0x256c, 0x2566, 0x256c, 0x256c, }; static int ascii_line_from_render_line (int render_line) { switch (render_line) { case RENDER_LINE_NONE: return ASCII_LINE_NONE; case RENDER_LINE_SINGLE: case RENDER_LINE_DASHED: case RENDER_LINE_THICK: case RENDER_LINE_THIN: return ASCII_LINE_SINGLE; case RENDER_LINE_DOUBLE: return ASCII_LINE_DOUBLE; default: return ASCII_LINE_NONE; } } static int make_box_index (int left_, int right_, int top_, int bottom_) { bool rtl = render_direction_rtl (); int left = ascii_line_from_render_line (rtl ? right_ : left_); int right = ascii_line_from_render_line (rtl ? left_ : right_); int top = ascii_line_from_render_line (top_); int bottom = ascii_line_from_render_line (bottom_); int idx = right; idx = idx * ASCII_N_LINES + bottom; idx = idx * ASCII_N_LINES + left; idx = idx * ASCII_N_LINES + top; return idx; } /* ASCII output driver. */ struct ascii_driver { struct output_driver driver; /* User parameters. */ bool append; /* Append if output file already exists? */ bool emphasis; /* Enable bold and underline in output? */ char *chart_file_name; /* Name of files used for charts. */ #ifdef HAVE_CAIRO /* Colours for charts */ struct cell_color fg; struct cell_color bg; #endif /* How the page width is determined: */ enum { FIXED_WIDTH, /* Specified by configuration. */ VIEW_WIDTH, /* From SET WIDTH. */ TERMINAL_WIDTH /* From the terminal's width. */ } width_mode; int width; /* Page width. */ int min_hbreak; /* Min cell size to break across pages. */ const ucs4_t *box; /* Line & box drawing characters. */ /* Internal state. */ struct file_handle *handle; FILE *file; /* Output file. */ bool error; /* Output error? */ struct u8_line *lines; /* Page content. */ int allocated_lines; /* Number of lines allocated. */ int chart_cnt; /* Number of charts so far. */ int object_cnt; /* Number of objects so far. */ struct render_params params; }; static const struct output_driver_class ascii_driver_class; static void ascii_submit (struct output_driver *, const struct output_item *); static int get_terminal_width (void); static bool update_page_size (struct ascii_driver *, bool issue_error); static int parse_page_size (struct driver_option *); static void ascii_draw_line (void *, int bb[TABLE_N_AXES][2], enum render_line_style styles[TABLE_N_AXES][2], struct cell_color colors[TABLE_N_AXES][2]); static void ascii_measure_cell_width (void *, const struct table_cell *, int *min, int *max); static int ascii_measure_cell_height (void *, const struct table_cell *, int width); static void ascii_draw_cell (void *, const struct table_cell *, int color_idx, int bb[TABLE_N_AXES][2], int spill[TABLE_N_AXES][2], int clip[TABLE_N_AXES][2]); static struct ascii_driver * ascii_driver_cast (struct output_driver *driver) { assert (driver->class == &ascii_driver_class); return UP_CAST (driver, struct ascii_driver, driver); } static struct driver_option * opt (struct output_driver *d, struct string_map *options, const char *key, const char *default_value) { return driver_option_get (d, options, key, default_value); } /* Return true iff the terminal appears to be an xterm with UTF-8 capabilities */ static bool term_is_utf8_xterm (void) { const char *term = getenv ("TERM"); const char *xterm_locale = getenv ("XTERM_LOCAL"); return (term && xterm_locale && !strcmp (term, "xterm") && (strcasestr (xterm_locale, "utf8") || strcasestr (xterm_locale, "utf-8"))); } static struct output_driver * ascii_create (struct file_handle *fh, enum settings_output_devices device_type, struct string_map *o) { enum { BOX_ASCII, BOX_UNICODE } box; struct output_driver *d; struct ascii_driver *a; a = xzalloc (sizeof *a); d = &a->driver; output_driver_init (&a->driver, &ascii_driver_class, fh_get_file_name (fh), device_type); a->append = parse_boolean (opt (d, o, "append", "false")); a->emphasis = parse_boolean (opt (d, o, "emphasis", "false")); a->chart_file_name = parse_chart_file_name (opt (d, o, "charts", fh_get_file_name (fh))); a->handle = fh; bool terminal = !strcmp (fh_get_file_name (fh), "-") && isatty (1); a->width = parse_page_size (opt (d, o, "width", "-1")); a->width_mode = (a->width > 0 ? FIXED_WIDTH : terminal ? TERMINAL_WIDTH : VIEW_WIDTH); a->min_hbreak = parse_int (opt (d, o, "min-hbreak", "-1"), -1, INT_MAX); #ifdef HAVE_CAIRO parse_color (d, o, "background-color", "#FFFFFFFFFFFF", &a->bg); parse_color (d, o, "foreground-color", "#000000000000", &a->fg); #endif const char *default_box = (terminal && (!strcmp (locale_charset (), "UTF-8") || term_is_utf8_xterm ()) ? "unicode" : "ascii"); box = parse_enum (opt (d, o, "box", default_box), "ascii", BOX_ASCII, "unicode", BOX_UNICODE, NULL_SENTINEL); a->box = box == BOX_ASCII ? ascii_box_chars : unicode_box_chars; a->file = NULL; a->error = false; a->lines = NULL; a->allocated_lines = 0; a->chart_cnt = 0; a->object_cnt = 0; a->params.draw_line = ascii_draw_line; a->params.measure_cell_width = ascii_measure_cell_width; a->params.measure_cell_height = ascii_measure_cell_height; a->params.adjust_break = NULL; a->params.draw_cell = ascii_draw_cell; a->params.aux = a; a->params.size[H] = a->width; a->params.size[V] = INT_MAX; a->params.font_size[H] = 1; a->params.font_size[V] = 1; for (int i = 0; i < RENDER_N_LINES; i++) { int width = i == RENDER_LINE_NONE ? 0 : 1; a->params.line_widths[H][i] = width; a->params.line_widths[V][i] = width; } a->params.supports_margins = false; a->params.rtl = render_direction_rtl (); if (!update_page_size (a, true)) goto error; a->file = fn_open (a->handle, a->append ? "a" : "w"); if (!a->file) { msg_error (errno, _("ascii: opening output file `%s'"), fh_get_file_name (a->handle)); goto error; } return d; error: output_driver_destroy (d); return NULL; } static int parse_page_size (struct driver_option *option) { int dim = atol (option->default_value); if (option->value != NULL) { if (!strcmp (option->value, "auto")) dim = -1; else { int value; char *tail; errno = 0; value = strtol (option->value, &tail, 0); if (value >= 1 && errno != ERANGE && *tail == '\0') dim = value; else msg (MW, _("%s: %s must be positive integer or `auto'"), option->driver_name, option->name); } } driver_option_destroy (option); return dim; } /* Re-calculates the page width based on settings, margins, and, if "auto" is set, the size of the user's terminal window or GUI output window. */ static bool update_page_size (struct ascii_driver *a, bool issue_error) { enum { MIN_WIDTH = 6 }; int want_width = (a->width_mode == VIEW_WIDTH ? settings_get_viewwidth () : a->width_mode == TERMINAL_WIDTH ? get_terminal_width () : a->width); bool ok = want_width >= MIN_WIDTH; if (!ok && issue_error) msg (ME, _("ascii: page must be at least %d characters wide, but " "as configured is only %d characters"), MIN_WIDTH, want_width); a->width = ok ? want_width : MIN_WIDTH; a->params.size[H] = a->width; a->params.min_break[H] = a->min_hbreak >= 0 ? a->min_hbreak : a->width / 2; return ok; } static void ascii_destroy (struct output_driver *driver) { struct ascii_driver *a = ascii_driver_cast (driver); int i; if (a->file != NULL) fn_close (a->handle, a->file); fh_unref (a->handle); free (a->chart_file_name); for (i = 0; i < a->allocated_lines; i++) u8_line_destroy (&a->lines[i]); free (a->lines); free (a); } static void ascii_flush (struct output_driver *driver) { struct ascii_driver *a = ascii_driver_cast (driver); if (a->file) fflush (a->file); } static void ascii_output_lines (struct ascii_driver *a, size_t n_lines) { for (size_t y = 0; y < n_lines; y++) { if (y < a->allocated_lines) { struct u8_line *line = &a->lines[y]; while (ds_chomp_byte (&line->s, ' ')) continue; fwrite (ds_data (&line->s), 1, ds_length (&line->s), a->file); u8_line_clear (&a->lines[y]); } putc ('\n', a->file); } } static void ascii_output_table_item (struct ascii_driver *a, const struct table_item *table_item) { struct render_pager *p; update_page_size (a, false); if (a->object_cnt++) putc ('\n', a->file); p = render_pager_create (&a->params, table_item); for (int i = 0; render_pager_has_next (p); i++) { if (i) putc ('\n', a->file); ascii_output_lines (a, render_pager_draw_next (p, INT_MAX)); } render_pager_destroy (p); } static void ascii_output_table_item_unref (struct ascii_driver *a, struct table_item *table_item) { ascii_output_table_item (a, table_item); table_item_unref (table_item); } static void ascii_output_text (struct ascii_driver *a, const char *text) { ascii_output_table_item_unref ( a, table_item_create (table_from_string (text), NULL, NULL)); } static void ascii_submit (struct output_driver *driver, const struct output_item *output_item) { struct ascii_driver *a = ascii_driver_cast (driver); if (a->error) return; if (is_table_item (output_item)) ascii_output_table_item (a, to_table_item (output_item)); #ifdef HAVE_CAIRO else if (is_chart_item (output_item) && a->chart_file_name != NULL) { struct chart_item *chart_item = to_chart_item (output_item); char *file_name; file_name = xr_draw_png_chart (chart_item, a->chart_file_name, ++a->chart_cnt, &a->fg, &a->bg); if (file_name != NULL) { struct text_item *text_item; text_item = text_item_create_format ( TEXT_ITEM_LOG, _("See %s for a chart."), file_name); ascii_submit (driver, &text_item->output_item); text_item_unref (text_item); free (file_name); } } #endif /* HAVE_CAIRO */ else if (is_text_item (output_item)) { const struct text_item *text_item = to_text_item (output_item); enum text_item_type type = text_item_get_type (text_item); if (type != TEXT_ITEM_PAGE_TITLE && type != TEXT_ITEM_EJECT_PAGE) ascii_output_table_item_unref ( a, text_item_to_table_item (text_item_ref (text_item))); } else if (is_message_item (output_item)) { const struct message_item *message_item = to_message_item (output_item); char *s = msg_to_string (message_item_get_msg (message_item)); ascii_output_text (a, s); free (s); } } const struct output_driver_factory txt_driver_factory = { "txt", "-", ascii_create }; const struct output_driver_factory list_driver_factory = { "list", "-", ascii_create }; static const struct output_driver_class ascii_driver_class = { "text", ascii_destroy, ascii_submit, ascii_flush, }; static char *ascii_reserve (struct ascii_driver *, int y, int x0, int x1, int n); static void ascii_layout_cell (struct ascii_driver *, const struct table_cell *, int bb[TABLE_N_AXES][2], int clip[TABLE_N_AXES][2], int *width, int *height); static void ascii_draw_line (void *a_, int bb[TABLE_N_AXES][2], enum render_line_style styles[TABLE_N_AXES][2], struct cell_color colors[TABLE_N_AXES][2] UNUSED) { struct ascii_driver *a = a_; char mbchar[6]; int x0, y0, x1, y1; ucs4_t uc; int mblen; int x, y; /* Clip to the page. */ x0 = MAX (bb[H][0], 0); y0 = MAX (bb[V][0], 0); x1 = MIN (bb[H][1], a->width); y1 = bb[V][1]; if (x1 <= 0 || y1 <= 0 || x0 >= a->width) return; /* Draw. */ uc = a->box[make_box_index (styles[V][0], styles[V][1], styles[H][0], styles[H][1])]; mblen = u8_uctomb (CHAR_CAST (uint8_t *, mbchar), uc, 6); for (y = y0; y < y1; y++) { char *p = ascii_reserve (a, y, x0, x1, mblen * (x1 - x0)); for (x = x0; x < x1; x++) { memcpy (p, mbchar, mblen); p += mblen; } } } static void ascii_measure_cell_width (void *a_, const struct table_cell *cell, int *min_width, int *max_width) { struct ascii_driver *a = a_; int bb[TABLE_N_AXES][2]; int clip[TABLE_N_AXES][2]; int h; bb[H][0] = 0; bb[H][1] = INT_MAX; bb[V][0] = 0; bb[V][1] = INT_MAX; clip[H][0] = clip[H][1] = clip[V][0] = clip[V][1] = 0; ascii_layout_cell (a, cell, bb, clip, max_width, &h); if (cell->n_footnotes || strchr (cell->text, ' ') || cell->n_subscripts || cell->superscript) { bb[H][1] = 1; ascii_layout_cell (a, cell, bb, clip, min_width, &h); } else *min_width = *max_width; } static int ascii_measure_cell_height (void *a_, const struct table_cell *cell, int width) { struct ascii_driver *a = a_; int bb[TABLE_N_AXES][2]; int clip[TABLE_N_AXES][2]; int w, h; bb[H][0] = 0; bb[H][1] = width; bb[V][0] = 0; bb[V][1] = INT_MAX; clip[H][0] = clip[H][1] = clip[V][0] = clip[V][1] = 0; ascii_layout_cell (a, cell, bb, clip, &w, &h); return h; } static void ascii_draw_cell (void *a_, const struct table_cell *cell, int color_idx UNUSED, int bb[TABLE_N_AXES][2], int spill[TABLE_N_AXES][2] UNUSED, int clip[TABLE_N_AXES][2]) { struct ascii_driver *a = a_; int w, h; ascii_layout_cell (a, cell, bb, clip, &w, &h); } static char * ascii_reserve (struct ascii_driver *a, int y, int x0, int x1, int n) { if (y >= a->allocated_lines) { size_t new_alloc = MAX (25, a->allocated_lines); while (new_alloc <= y) new_alloc = xtimes (new_alloc, 2); a->lines = xnrealloc (a->lines, new_alloc, sizeof *a->lines); for (size_t i = a->allocated_lines; i < new_alloc; i++) u8_line_init (&a->lines[i]); a->allocated_lines = new_alloc; } return u8_line_reserve (&a->lines[y], x0, x1, n); } static void text_draw (struct ascii_driver *a, enum table_halign halign, int options, bool bold, bool underline, int bb[TABLE_N_AXES][2], int clip[TABLE_N_AXES][2], int y, const uint8_t *string, int n, size_t width) { int x0 = MAX (0, clip[H][0]); int y0 = MAX (0, clip[V][0]); int x1 = MIN (a->width, clip[H][1]); int y1 = clip[V][1]; int x; if (y < y0 || y >= y1) return; switch (table_halign_interpret (halign, options & TAB_NUMERIC)) { case TABLE_HALIGN_LEFT: x = bb[H][0]; break; case TABLE_HALIGN_CENTER: x = (bb[H][0] + bb[H][1] - width + 1) / 2; break; case TABLE_HALIGN_RIGHT: case TABLE_HALIGN_DECIMAL: x = bb[H][1] - width; break; default: NOT_REACHED (); } if (x >= x1) return; while (x < x0) { ucs4_t uc; int mblen; int w; if (n == 0) return; mblen = u8_mbtouc (&uc, string, n); string += mblen; n -= mblen; w = uc_width (uc, "UTF-8"); if (w > 0) { x += w; width -= w; } } if (n == 0) return; if (x + width > x1) { int ofs; ofs = width = 0; for (ofs = 0; ofs < n;) { ucs4_t uc; int mblen; int w; mblen = u8_mbtouc (&uc, string + ofs, n - ofs); w = uc_width (uc, "UTF-8"); if (w > 0) { if (width + w > x1 - x) break; width += w; } ofs += mblen; } n = ofs; if (n == 0) return; } if (!a->emphasis || (!bold && !underline)) memcpy (ascii_reserve (a, y, x, x + width, n), string, n); else { size_t n_out; size_t ofs; char *out; int mblen; /* First figure out how many bytes need to be inserted. */ n_out = n; for (ofs = 0; ofs < n; ofs += mblen) { ucs4_t uc; int w; mblen = u8_mbtouc (&uc, string + ofs, n - ofs); w = uc_width (uc, "UTF-8"); if (w > 0) { if (bold) n_out += 1 + mblen; if (underline) n_out += 2; } } /* Then insert them. */ out = ascii_reserve (a, y, x, x + width, n_out); for (ofs = 0; ofs < n; ofs += mblen) { ucs4_t uc; int w; mblen = u8_mbtouc (&uc, string + ofs, n - ofs); w = uc_width (uc, "UTF-8"); if (w > 0) { if (bold) { out = mempcpy (out, string + ofs, mblen); *out++ = '\b'; } if (underline) { *out++ = '_'; *out++ = '\b'; } } out = mempcpy (out, string + ofs, mblen); } } } static char * add_markers (const char *text, const struct table_cell *cell) { struct string s = DS_EMPTY_INITIALIZER; ds_put_cstr (&s, text); for (size_t i = 0; i < cell->n_subscripts; i++) ds_put_format (&s, "%c%s", i ? ',' : '_', cell->subscripts[i]); if (cell->superscript) ds_put_format (&s, "^%s", cell->superscript); for (size_t i = 0; i < cell->n_footnotes; i++) ds_put_format (&s, "[%s]", cell->footnotes[i]->marker); return ds_steal_cstr (&s); } static void ascii_layout_cell (struct ascii_driver *a, const struct table_cell *cell, int bb[TABLE_N_AXES][2], int clip[TABLE_N_AXES][2], int *widthp, int *heightp) { *widthp = 0; *heightp = 0; /* Get the basic textual contents. */ const char *plain_text = (cell->options & TAB_MARKUP ? output_get_text_from_markup (cell->text) : cell->text); /* Append footnotes, subscripts, superscript if any. */ const char *text; if (cell->n_footnotes || cell->n_subscripts || cell->superscript) { text = add_markers (plain_text, cell); if (plain_text != cell->text) free (CONST_CAST (char *, plain_text)); } else text = plain_text; /* Calculate length; if it's zero, then there's nothing to do. */ size_t length = strlen (text); if (!length) { if (text != cell->text) free (CONST_CAST (char *, text)); return; } char *breaks = xmalloc (length + 1); u8_possible_linebreaks (CHAR_CAST (const uint8_t *, text), length, "UTF-8", breaks); breaks[length] = (breaks[length - 1] == UC_BREAK_MANDATORY ? UC_BREAK_PROHIBITED : UC_BREAK_POSSIBLE); size_t pos = 0; int bb_width = bb[H][1] - bb[H][0]; for (int y = bb[V][0]; y < bb[V][1] && pos < length; y++) { const uint8_t *line = CHAR_CAST (const uint8_t *, text + pos); const char *b = breaks + pos; size_t n = length - pos; size_t last_break_ofs = 0; int last_break_width = 0; int width = 0; size_t graph_ofs; size_t ofs; for (ofs = 0; ofs < n;) { ucs4_t uc; int mblen; int w; mblen = u8_mbtouc (&uc, line + ofs, n - ofs); if (b[ofs] == UC_BREAK_MANDATORY) break; else if (b[ofs] == UC_BREAK_POSSIBLE) { last_break_ofs = ofs; last_break_width = width; } w = uc_width (uc, "UTF-8"); if (w > 0) { if (width + w > bb_width) { if (isspace (line[ofs])) break; else if (last_break_ofs != 0) { ofs = last_break_ofs; width = last_break_width; break; } } width += w; } ofs += mblen; } /* Trim any trailing spaces off the end of the text to be drawn. */ for (graph_ofs = ofs; graph_ofs > 0; graph_ofs--) if (!isspace (line[graph_ofs - 1])) break; width -= ofs - graph_ofs; /* Draw text. */ text_draw (a, cell->style->cell_style.halign, cell->options, cell->style->font_style.bold, cell->style->font_style.underline, bb, clip, y, line, graph_ofs, width); /* If a new-line ended the line, just skip the new-line. Otherwise, skip past any spaces past the end of the line (but not past a new-line). */ if (b[ofs] == UC_BREAK_MANDATORY) ofs++; else while (ofs < n && isspace (line[ofs]) && b[ofs] != UC_BREAK_MANDATORY) ofs++; if (width > *widthp) *widthp = width; ++*heightp; pos += ofs; } free (breaks); if (text != cell->text) free (CONST_CAST (char *, text)); } void ascii_test_write (struct output_driver *driver, const char *s, int x, int y, bool bold, bool underline) { struct ascii_driver *a = ascii_driver_cast (driver); int bb[TABLE_N_AXES][2]; int width, height; if (!a->file) return; struct area_style style = { .cell_style.halign = TABLE_HALIGN_LEFT, .font_style.bold = bold, .font_style.underline = underline, }; struct table_cell cell = { .text = CONST_CAST (char *, s), .style = &style, }; bb[TABLE_HORZ][0] = x; bb[TABLE_HORZ][1] = a->width; bb[TABLE_VERT][0] = y; bb[TABLE_VERT][1] = INT_MAX; ascii_layout_cell (a, &cell, bb, bb, &width, &height); } void ascii_test_set_length (struct output_driver *driver, int y, int length) { struct ascii_driver *a = ascii_driver_cast (driver); if (!a->file) return; if (y < 0) return; u8_line_set_length (&a->lines[y], length); } void ascii_test_flush (struct output_driver *driver) { struct ascii_driver *a = ascii_driver_cast (driver); for (size_t i = a->allocated_lines; i-- > 0;) if (a->lines[i].width) { ascii_output_lines (a, i + 1); break; } } static sig_atomic_t terminal_changed = true; static int terminal_width; #if HAVE_DECL_SIGWINCH static void winch_handler (int signum UNUSED) { terminal_changed = true; } #endif int get_terminal_width (void) { #if HAVE_DECL_SIGWINCH static bool setup_signal; if (!setup_signal) { setup_signal = true; struct sigaction action = { .sa_handler = winch_handler }; sigemptyset (&action.sa_mask); sigaction (SIGWINCH, &action, NULL); } #endif if (terminal_changed) { terminal_changed = false; #ifdef HAVE_TERMIOS_H struct winsize ws; if (!ioctl (0, TIOCGWINSZ, &ws)) terminal_width = ws.ws_col; else #endif { if (getenv ("COLUMNS")) terminal_width = atoi (getenv ("COLUMNS")); } if (terminal_width <= 0 || terminal_width > 1024) terminal_width = 79; } return terminal_width; } pspp-1.4.1/src/output/output-item.h0000644000175000017500000000324213320146056016710 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2009, 2011 Free Software Foundation, Inc. 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 3 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, see . */ #ifndef OUTPUT_ITEM_H #define OUTPUT_ITEM_H 1 /* Output items. An output item is a self-contained chunk of output. The following kinds of output items currently exist: - Tables (see output/table-item.h). - Charts (see output/chart-item.h). - Text strings (see output/text-item.h). - Messages (see output/message-item.h). */ #include #include "libpspp/cast.h" /* A single output item. */ struct output_item { const struct output_item_class *class; /* Reference count. An output item may be shared between multiple owners, indicated by a reference count greater than 1. When this is the case, the output item must not be modified. */ int ref_cnt; }; struct output_item *output_item_ref (const struct output_item *); void output_item_unref (struct output_item *); bool output_item_is_shared (const struct output_item *); #endif /* output/output-item.h */ pspp-1.4.1/src/output/journal.h0000644000175000017500000000242113320146056016064 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2007, 2012 Free Software Foundation, Inc. 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 3 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, see . */ /* Journal for commands and errors. The journal file records the commands entered interactively during a PSPP session. It also records, prefixed by "> ", commands from files included with interactive commands and errors. */ #ifndef OUTPUT_JOURNAL_H #define OUTPUT_JOURNAL_H 1 #include void journal_init (void); void journal_enable (void); void journal_disable (void); bool journal_is_enabled (void); void journal_set_file_name (const char *); const char *journal_get_file_name (void); #endif /* output/journal.h */ pspp-1.4.1/src/output/msglog.c0000644000175000017500000000567213412455327015716 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2010 Free Software Foundation, Inc. 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 3 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, see . */ #include #include "output/msglog.h" #include #include #include #include #include "data/file-name.h" #include "data/file-handle-def.h" #include "data/settings.h" #include "libpspp/cast.h" #include "libpspp/message.h" #include "output/driver-provider.h" #include "output/message-item.h" #include "gl/fwriteerror.h" #include "gl/xalloc.h" #include "gettext.h" #define _(msgid) gettext (msgid) struct msglog_driver { struct output_driver driver; FILE *file; struct file_handle *handle; }; static const struct output_driver_class msglog_class; static struct msglog_driver * msglog_driver_cast (struct output_driver *driver) { assert (driver->class == &msglog_class); return UP_CAST (driver, struct msglog_driver, driver); } struct output_driver * msglog_create (const char *file_name) { enum settings_output_devices type; struct msglog_driver *ml; FILE *file; struct file_handle *handle = fh_create_file (NULL, file_name, NULL, fh_default_properties ()); file = fn_open (handle, "w"); if (file == NULL) { msg_error (errno, _("error opening output file `%s'"), file_name); return NULL; } type = (!strcmp (file_name, "-") || isatty (fileno (file)) ? SETTINGS_DEVICE_TERMINAL : SETTINGS_DEVICE_UNFILTERED); ml = xzalloc (sizeof *ml); ml->handle = handle; output_driver_init (&ml->driver, &msglog_class, file_name, type); ml->file = file; output_driver_register (&ml->driver); return &ml->driver; } static void msglog_destroy (struct output_driver *driver) { struct msglog_driver *ml = msglog_driver_cast (driver); fn_close (ml->handle, ml->file); fh_unref (ml->handle); free (ml); } static void msglog_submit (struct output_driver *driver, const struct output_item *item) { struct msglog_driver *ml = msglog_driver_cast (driver); if (is_message_item (item)) { const struct message_item *message_item = to_message_item (item); char *s = msg_to_string (message_item_get_msg (message_item)); fprintf (ml->file, "%s\n", s); free (s); } } static const struct output_driver_class msglog_class = { "msglog", msglog_destroy, msglog_submit, NULL }; pspp-1.4.1/src/output/cairo-chart.h0000644000175000017500000001325413711575611016623 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2009, 2011, 2015 Free Software Foundation, Inc. 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 3 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, see . */ #ifndef OUTPUT_CAIRO_CHART_H #define OUTPUT_CAIRO_CHART_H 1 #include #include #include #include "libpspp/compiler.h" struct chart_item; struct xrchart_colour { uint8_t red; uint8_t green; uint8_t blue; }; struct xrchart_axis { int data_max; int data_min; double scale; double min; double max; }; /* The geometry of a chart. */ struct xrchart_geometry { /* Bottom of the abscissa segment */ int abscissa_bottom; /* Left of the ordinate segment */ int ordinate_left; int title_bottom; /* Legend. */ int legend_left; int legend_right; char **dataset; int n_datasets; /* Default font size for the plot. */ double font_size; struct xrchart_colour fill_colour; /* Stuff particular to cartesians and boxplots. */ struct xrchart_axis axis[2]; /* True iff a path is currently being drawn */ bool in_path; }; void xrchart_geometry_init (cairo_t *, struct xrchart_geometry *, double width, double length); void xrchart_geometry_free (cairo_t *, struct xrchart_geometry *); #define XRCHART_N_COLOURS 27 extern const struct xrchart_colour data_colour[]; enum tick_orientation { SCALE_ABSCISSA=0, SCALE_ORDINATE }; enum xrmarker_type { XRMARKER_CIRCLE, /* Hollow circle. */ XRMARKER_ASTERISK, /* Asterisk (*). */ XRMARKER_SQUARE /* Hollow square. */ }; void xrchart_draw_marker (cairo_t *, double x, double y, enum xrmarker_type, double size); void xrchart_label (cairo_t *, int horz_justify, int vert_justify, double font_size, const char *); void xrchart_label_rotate (cairo_t *cr, int horz_justify, int vert_justify, double font_size, const char *string, double angle); /* Draw a tick mark at position If label is non zero, then print it at the tick mark */ void draw_tick (cairo_t *, const struct xrchart_geometry *, enum tick_orientation orientation, bool rotated, double position, const char *label, ...) PRINTF_FORMAT (6, 7); /* Write the title on a chart*/ void xrchart_write_title (cairo_t *, const struct xrchart_geometry *, const char *title, ...) PRINTF_FORMAT (3, 4); /* Set the scale for the abscissa */ bool xrchart_write_xscale (cairo_t *, struct xrchart_geometry *, double min, double max) WARN_UNUSED_RESULT; /* Set the scale for the ordinate */ bool xrchart_write_yscale (cairo_t *, struct xrchart_geometry *, double smin, double smax) WARN_UNUSED_RESULT; void xrchart_write_xlabel (cairo_t *, const struct xrchart_geometry *, const char *label) ; /* Write the ordinate label */ void xrchart_write_ylabel (cairo_t *, const struct xrchart_geometry *, const char *label); void xrchart_write_legend (cairo_t *, const struct xrchart_geometry *); enum xrchart_dim { XRCHART_DIM_X, XRCHART_DIM_Y }; void xrchart_vector_start (cairo_t *, struct xrchart_geometry *, const char *name); void xrchart_vector_end (cairo_t *, struct xrchart_geometry *); void xrchart_vector (cairo_t *, struct xrchart_geometry *, double x, double y); /* Plot a data point */ void xrchart_datum (cairo_t *, const struct xrchart_geometry *, int dataset UNUSED, double x, double y); /* Draw a line with slope SLOPE and intercept INTERCEPT. between the points limit1 and limit2. If lim_dim is XRCHART_DIM_Y then the limit{1,2} are on the y axis otherwise the x axis */ void xrchart_line (cairo_t *, const struct xrchart_geometry *, double slope, double intercept, double limit1, double limit2, enum xrchart_dim lim_dim); /* Drawing various kinds of charts. */ void xrchart_draw_boxplot (const struct chart_item *, cairo_t *, struct xrchart_geometry *); void xrchart_draw_roc (const struct chart_item *, cairo_t *, struct xrchart_geometry *); void xrchart_draw_piechart (const struct chart_item *, cairo_t *, struct xrchart_geometry *); void xrchart_draw_barchart (const struct chart_item *, cairo_t *, struct xrchart_geometry *); void xrchart_draw_histogram (const struct chart_item *, cairo_t *, struct xrchart_geometry *); void xrchart_draw_np_plot (const struct chart_item *, cairo_t *, struct xrchart_geometry *); void xrchart_draw_scree (const struct chart_item *, cairo_t *, struct xrchart_geometry *); void xrchart_draw_spreadlevel (const struct chart_item *, cairo_t *, struct xrchart_geometry *); void xrchart_draw_scatterplot (const struct chart_item *, cairo_t *, struct xrchart_geometry *); #endif /* output/cairo-chart.h */ pspp-1.4.1/src/output/message-item.h0000644000175000017500000000620413433403043016772 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2010, 2011 Free Sonftware Foundation, Inc. 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 3 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, see . */ #ifndef OUTPUT_MESSAGE_ITEM_H #define OUTPUT_MESSAGE_ITEM_H 1 /* Message items. A message item is a subclass of an output item (see output/output-item.h). A message item is an error, warning, or note to the user. Message items should not be submitted directly to the output subsystem. Instead, use the msg() function in libpspp/message.h, which will ensure that the message gets routed properly for the PSPP user interface in use. */ #include #include "output/output-item.h" /* A message item. */ struct message_item { struct output_item output_item; struct msg *msg; }; struct message_item *message_item_create (const struct msg *); const struct msg *message_item_get_msg (const struct message_item *); /* This boilerplate for message_item, a subclass of output_item, was autogenerated by mk-class-boilerplate. */ #include #include "libpspp/cast.h" extern const struct output_item_class message_item_class; /* Returns true if SUPER is a message_item, otherwise false. */ static inline bool is_message_item (const struct output_item *super) { return super->class == &message_item_class; } /* Returns SUPER converted to message_item. SUPER must be a message_item, as reported by is_message_item. */ static inline struct message_item * to_message_item (const struct output_item *super) { assert (is_message_item (super)); return UP_CAST (super, struct message_item, output_item); } /* Returns INSTANCE converted to output_item. */ static inline struct output_item * message_item_super (const struct message_item *instance) { return CONST_CAST (struct output_item *, &instance->output_item); } /* Increments INSTANCE's reference count and returns INSTANCE. */ static inline struct message_item * message_item_ref (const struct message_item *instance) { return to_message_item (output_item_ref (&instance->output_item)); } /* Decrements INSTANCE's reference count, then destroys INSTANCE if the reference count is now zero. */ static inline void message_item_unref (struct message_item *instance) { output_item_unref (&instance->output_item); } /* Returns true if INSTANCE's reference count is greater than 1, false otherwise. */ static inline bool message_item_is_shared (const struct message_item *instance) { return output_item_is_shared (&instance->output_item); } void message_item_submit (struct message_item *); #endif /* output/message-item.h */ pspp-1.4.1/src/output/table-item.h0000644000175000017500000001213313602145300016430 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2009, 2011, 2014 Free Software Foundation, Inc. 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 3 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, see . */ #ifndef OUTPUT_TABLE_ITEM_H #define OUTPUT_TABLE_ITEM_H 1 /* Table items. A table item is a subclass of an output item (see output-item.h) that contains a table (see table.h) and some formatting properties. Currently the formatting properties are an optional title (a brief description typically displayed above the table) and an optional caption (a more verbose description typically displayed below the table). */ #include "libpspp/compiler.h" #include "output/output-item.h" #include "output/table.h" /* Title or caption in a table item. */ struct table_item_text { char *content; const struct footnote **footnotes; size_t n_footnotes; struct area_style *style; }; struct table_item_text *table_item_text_create (const char *); struct table_item_text *table_item_text_clone (const struct table_item_text *); void table_item_text_destroy (struct table_item_text *); struct table_item_layer { char *content; const struct footnote **footnotes; size_t n_footnotes; }; void table_item_layer_copy (struct table_item_layer *, const struct table_item_layer *); void table_item_layer_uninit (struct table_item_layer *); struct table_item_layers { struct table_item_layer *layers; size_t n_layers; struct area_style *style; }; struct table_item_layers *table_item_layers_clone ( const struct table_item_layers *); void table_item_layers_destroy (struct table_item_layers *); /* A table item. The members of struct table_item should not be accessed directly. Use one of the accessor functions defined below. */ struct table_item { struct output_item output_item; /* Superclass. */ struct table *table; /* The table to be rendered. */ struct table_item_text *title; /* Null if there is no title. */ struct table_item_text *caption; /* Null if there is no caption. */ struct table_item_layers *layers; /* Null if there is no layer info. */ struct pivot_table *pt; }; struct table_item *table_item_create (struct table *, const char *title, const char *caption); const struct table *table_item_get_table (const struct table_item *); const struct table_item_text *table_item_get_title (const struct table_item *); void table_item_set_title (struct table_item *, const struct table_item_text *); const struct table_item_layers *table_item_get_layers ( const struct table_item *); void table_item_set_layers (struct table_item *, const struct table_item_layers *); const struct table_item_text *table_item_get_caption ( const struct table_item *); void table_item_set_caption (struct table_item *, const struct table_item_text *); /* This boilerplate for table_item, a subclass of output_item, was autogenerated by mk-class-boilerplate. */ #include #include "libpspp/cast.h" extern const struct output_item_class table_item_class; /* Returns true if SUPER is a table_item, otherwise false. */ static inline bool is_table_item (const struct output_item *super) { return super->class == &table_item_class; } /* Returns SUPER converted to table_item. SUPER must be a table_item, as reported by is_table_item. */ static inline struct table_item * to_table_item (const struct output_item *super) { assert (is_table_item (super)); return UP_CAST (super, struct table_item, output_item); } /* Returns INSTANCE converted to output_item. */ static inline struct output_item * table_item_super (const struct table_item *instance) { return CONST_CAST (struct output_item *, &instance->output_item); } /* Increments INSTANCE's reference count and returns INSTANCE. */ static inline struct table_item * table_item_ref (const struct table_item *instance) { return to_table_item (output_item_ref (&instance->output_item)); } /* Decrements INSTANCE's reference count, then destroys INSTANCE if the reference count is now zero. */ static inline void table_item_unref (struct table_item *instance) { output_item_unref (&instance->output_item); } /* Returns true if INSTANCE's reference count is greater than 1, false otherwise. */ static inline bool table_item_is_shared (const struct table_item *instance) { return output_item_is_shared (&instance->output_item); } void table_item_submit (struct table_item *); #endif /* output/table-item.h */ pspp-1.4.1/src/output/journal.c0000644000175000017500000001116213670210420016054 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2007, 2010, 2012, 2013 Free Software Foundation, Inc. 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 3 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, see . */ #include #include "output/journal.h" #include #include #include #include #include "data/file-name.h" #include "libpspp/cast.h" #include "libpspp/message.h" #include "libpspp/str.h" #include "output/driver-provider.h" #include "output/message-item.h" #include "output/text-item.h" #include "gl/fwriteerror.h" #include "gl/xalloc.h" #include "gettext.h" #define _(msgid) gettext (msgid) struct journal_driver { struct output_driver driver; FILE *file; /* Name of journal file. */ char *file_name; bool destroyed; }; static const struct output_driver_class journal_class; /* Journal driver, if journaling is enabled. */ static struct journal_driver journal; static struct journal_driver * journal_driver_cast (struct output_driver *driver) { assert (driver->class == &journal_class); return UP_CAST (driver, struct journal_driver, driver); } static void journal_close (void) { if (journal.file != NULL) { if (fwriteerror (journal.file)) msg_error (errno, _("error writing output file `%s'"), journal.file_name); } journal.file = NULL; } static void journal_destroy (struct output_driver *driver) { struct journal_driver *j = journal_driver_cast (driver); if (!j->destroyed) journal_close (); j->destroyed = true; } static void journal_output (struct journal_driver *j, const char *s) { if (j->file == NULL) return; fprintf (j->file, "%s\n", s); /* Flush the journal in case the syntax we're about to write causes a crash. Having the syntax already written to disk makes postmortem analysis of the problem possible. */ fflush (j->file); } static void journal_submit (struct output_driver *driver, const struct output_item *item) { struct journal_driver *j = journal_driver_cast (driver); if (is_text_item (item)) { const struct text_item *text_item = to_text_item (item); enum text_item_type type = text_item_get_type (text_item); if (type == TEXT_ITEM_SYNTAX) journal_output (j, text_item_get_text (text_item)); } else if (is_message_item (item)) { const struct message_item *message_item = to_message_item (item); char *s = msg_to_string (message_item_get_msg (message_item)); journal_output (j, s); free (s); } } static const struct output_driver_class journal_class = { "journal", journal_destroy, journal_submit, NULL /* flush */ }; /* Enables journaling. */ void journal_init (void) { /* Create journal driver. */ output_driver_init (&journal.driver, &journal_class, "journal", SETTINGS_DEVICE_UNFILTERED); journal.file = NULL; /* Register journal driver. */ output_driver_register (&journal.driver); journal_enable (); journal.destroyed = false; } /* Disables journaling. */ void journal_disable (void) { journal_close (); } /* Enable journaling. */ void journal_enable (void) { if (journal.file == NULL) { journal.file = fopen (journal_get_file_name (), "a"); if (journal.file == NULL) { msg_error (errno, _("error opening output file `%s'"), journal_get_file_name ()); journal_close (); } } } /* Returns true if journaling is enabled, false otherwise. */ bool journal_is_enabled (void) { return journal.file != NULL ; } /* Sets the name of the journal file to FILE_NAME. */ void journal_set_file_name (const char *file_name) { journal_close (); free (journal.file_name); journal.file_name = xstrdup (file_name); } /* Returns the name of the journal file. The caller must not modify or free the returned string. */ const char * journal_get_file_name (void) { if (journal.file_name == NULL) { const char *output_path = default_output_path (); journal.file_name = xasprintf ("%s%s", output_path, "pspp.jnl"); } return journal.file_name; } pspp-1.4.1/src/output/pivot-table.c0000644000175000017500000021265513700645725016660 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2017, 2018 Free Software Foundation, Inc. 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 3 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, see . */ #include #include "output/pivot-table.h" #include #include "data/data-out.h" #include "data/settings.h" #include "data/value.h" #include "data/variable.h" #include "libpspp/hash-functions.h" #include "libpspp/i18n.h" #include "output/driver.h" #include "gl/c-ctype.h" #include "gl/intprops.h" #include "gl/minmax.h" #include "gl/xalloc.h" #include "gl/xmemdup0.h" #include "gl/xsize.h" #include "gettext.h" #define _(msgid) gettext (msgid) #define N_(msgid) msgid static const struct fmt_spec *pivot_table_get_format ( const struct pivot_table *, const char *s); /* Pivot table display styling. */ /* Returns the name of AREA. */ const char * pivot_area_to_string (enum pivot_area area) { switch (area) { case PIVOT_AREA_TITLE: return "title"; case PIVOT_AREA_CAPTION: return "caption"; case PIVOT_AREA_FOOTER: return "footer"; case PIVOT_AREA_CORNER: return "corner"; case PIVOT_AREA_COLUMN_LABELS: return "column labels"; case PIVOT_AREA_ROW_LABELS: return "row labels"; case PIVOT_AREA_DATA: return "data"; case PIVOT_AREA_LAYERS: return "layers"; case PIVOT_N_AREAS: default: return "**error**"; } } const struct area_style * pivot_area_get_default_style (enum pivot_area area) { #define STYLE(BOLD, H, V, L, R, T, B) { \ .cell_style = { \ .halign = TABLE_HALIGN_##H, \ .valign = TABLE_VALIGN_##V, \ .margin = { [TABLE_HORZ][0] = L, [TABLE_HORZ][1] = R, \ [TABLE_VERT][0] = T, [TABLE_VERT][1] = B }, \ }, \ .font_style = { \ .bold = BOLD, \ .fg = { [0] = CELL_COLOR_BLACK, [1] = CELL_COLOR_BLACK}, \ .bg = { [0] = CELL_COLOR_WHITE, [1] = CELL_COLOR_WHITE}, \ .size = 9, \ .typeface = (char *) "Sans Serif", \ }, \ } static const struct area_style default_area_styles[PIVOT_N_AREAS] = { [PIVOT_AREA_TITLE] = STYLE(true, CENTER, CENTER, 8,11,1,8), [PIVOT_AREA_CAPTION] = STYLE(false, LEFT, TOP, 8,11,1,1), [PIVOT_AREA_FOOTER] = STYLE(false, LEFT, TOP, 11, 8,2,3), [PIVOT_AREA_CORNER] = STYLE(false, LEFT, BOTTOM, 8,11,1,1), [PIVOT_AREA_COLUMN_LABELS] = STYLE(false, CENTER, BOTTOM, 8,11,1,3), [PIVOT_AREA_ROW_LABELS] = STYLE(false, LEFT, TOP, 8,11,1,3), [PIVOT_AREA_DATA] = STYLE(false, MIXED, TOP, 8,11,1,1), [PIVOT_AREA_LAYERS] = STYLE(false, LEFT, BOTTOM, 8,11,1,3), }; #undef STYLE return &default_area_styles[area]; } void pivot_border_get_default_style (enum pivot_border border, struct table_border_style *style) { static const enum table_stroke default_strokes[PIVOT_N_BORDERS] = { [PIVOT_BORDER_TITLE] = TABLE_STROKE_NONE, [PIVOT_BORDER_OUTER_LEFT] = TABLE_STROKE_NONE, [PIVOT_BORDER_OUTER_TOP] = TABLE_STROKE_NONE, [PIVOT_BORDER_OUTER_RIGHT] = TABLE_STROKE_NONE, [PIVOT_BORDER_OUTER_BOTTOM] = TABLE_STROKE_NONE, [PIVOT_BORDER_INNER_LEFT] = TABLE_STROKE_THICK, [PIVOT_BORDER_INNER_TOP] = TABLE_STROKE_THICK, [PIVOT_BORDER_INNER_RIGHT] = TABLE_STROKE_THICK, [PIVOT_BORDER_INNER_BOTTOM] = TABLE_STROKE_THICK, [PIVOT_BORDER_DATA_LEFT] = TABLE_STROKE_THICK, [PIVOT_BORDER_DATA_TOP] = TABLE_STROKE_THICK, [PIVOT_BORDER_DIM_ROW_HORZ] = TABLE_STROKE_SOLID, [PIVOT_BORDER_DIM_ROW_VERT] = TABLE_STROKE_NONE, [PIVOT_BORDER_DIM_COL_HORZ] = TABLE_STROKE_SOLID, [PIVOT_BORDER_DIM_COL_VERT] = TABLE_STROKE_SOLID, [PIVOT_BORDER_CAT_ROW_HORZ] = TABLE_STROKE_NONE, [PIVOT_BORDER_CAT_ROW_VERT] = TABLE_STROKE_NONE, [PIVOT_BORDER_CAT_COL_HORZ] = TABLE_STROKE_SOLID, [PIVOT_BORDER_CAT_COL_VERT] = TABLE_STROKE_SOLID, }; *style = (struct table_border_style) { .stroke = default_strokes[border], .color = CELL_COLOR_BLACK, }; } /* Returns the name of BORDER. */ const char * pivot_border_to_string (enum pivot_border border) { switch (border) { case PIVOT_BORDER_TITLE: return "title"; case PIVOT_BORDER_OUTER_LEFT: return "left outer frame"; case PIVOT_BORDER_OUTER_TOP: return "top outer frame"; case PIVOT_BORDER_OUTER_RIGHT: return "right outer frame"; case PIVOT_BORDER_OUTER_BOTTOM: return "bottom outer frame"; case PIVOT_BORDER_INNER_LEFT: return "left inner frame"; case PIVOT_BORDER_INNER_TOP: return "top inner frame"; case PIVOT_BORDER_INNER_RIGHT: return "right inner frame"; case PIVOT_BORDER_INNER_BOTTOM: return "bottom inner frame"; case PIVOT_BORDER_DATA_LEFT: return "data area left"; case PIVOT_BORDER_DATA_TOP: return "data area top"; case PIVOT_BORDER_DIM_ROW_HORZ: return "row label horizontal dimension border"; case PIVOT_BORDER_DIM_ROW_VERT: return "row label vertical dimension border"; case PIVOT_BORDER_DIM_COL_HORZ: return "column label horizontal dimension border"; case PIVOT_BORDER_DIM_COL_VERT: return "column label vertical dimension border"; case PIVOT_BORDER_CAT_ROW_HORZ: return "row label horizontal category border"; case PIVOT_BORDER_CAT_ROW_VERT: return "row label vertical category border"; case PIVOT_BORDER_CAT_COL_HORZ: return "column label horizontal category border"; case PIVOT_BORDER_CAT_COL_VERT: return "column label vertical category border"; case PIVOT_N_BORDERS: default: return "**error**"; } } void pivot_table_sizing_uninit (struct pivot_table_sizing *sizing) { if (sizing) { free (sizing->widths); free (sizing->breaks); free (sizing->keeps); } } /* Axes. */ /* Returns the name of AXIS_TYPE. */ const char * pivot_axis_type_to_string (enum pivot_axis_type axis_type) { switch (axis_type) { case PIVOT_AXIS_LAYER: return "layer"; case PIVOT_AXIS_ROW: return "row"; case PIVOT_AXIS_COLUMN: return "column"; default: return ""; } } static enum pivot_axis_type pivot_axis_type_transpose (enum pivot_axis_type axis_type) { assert (axis_type == PIVOT_AXIS_ROW || axis_type == PIVOT_AXIS_COLUMN); return (axis_type == PIVOT_AXIS_ROW ? PIVOT_AXIS_COLUMN : PIVOT_AXIS_ROW); } /* Implementation of PIVOT_AXIS_FOR_EACH. */ size_t * pivot_axis_iterator_next (size_t *indexes, const struct pivot_axis *axis) { if (!indexes) { if (axis->n_dimensions) for (size_t i = 0; i < axis->n_dimensions; i++) if (axis->dimensions[i]->n_leaves == 0) return NULL; return xcalloc (axis->n_dimensions, sizeof *indexes); } for (size_t i = 0; i < axis->n_dimensions; i++) { const struct pivot_dimension *d = axis->dimensions[i]; if (++indexes[i] < d->n_leaves) return indexes; indexes[i] = 0; } free (indexes); return NULL; } /* Dimensions. */ static void pivot_category_set_rc (struct pivot_category *category, const char *s) { const struct fmt_spec *format = pivot_table_get_format ( category->dimension->table, s); if (format) category->format = *format; } static void pivot_category_create_leaves_valist (struct pivot_category *parent, va_list args) { const char *s; while ((s = va_arg (args, const char *))) { if (!strncmp (s, "RC_", 3)) { assert (parent->n_subs); pivot_category_set_rc (parent->subs[parent->n_subs - 1], s); } else pivot_category_create_leaf (parent, pivot_value_new_text (s)); } } /* Creates a new dimension with the given NAME in TABLE and returns it. The dimension is added to axis AXIS_TYPE, becoming the outermost dimension on that axis. NAME should be a translatable name, but not actually translated yet, e.g. enclosed in N_(). To use a different kind of value for a name, use pivot_dimension_create__() instead. The optional varargs parameters may be used to add an initial set of categories to the dimension. Each string should be a translatable category name, but not actually translated yet, e.g. enclosed in N_(). Each string may optionally be followod by a PIVOT_RC_* string that specifies the default numeric format for cells in this category. */ struct pivot_dimension * SENTINEL (0) (pivot_dimension_create) (struct pivot_table *table, enum pivot_axis_type axis_type, const char *name, ...) { struct pivot_dimension *d = pivot_dimension_create__ ( table, axis_type, pivot_value_new_text (name)); va_list args; va_start (args, name); pivot_category_create_leaves_valist (d->root, args); va_end (args); return d; } /* Creates a new dimension with the given NAME in TABLE and returns it. The dimension is added to axis AXIS_TYPE, becoming the outermost dimension on that axis. */ struct pivot_dimension * pivot_dimension_create__ (struct pivot_table *table, enum pivot_axis_type axis_type, struct pivot_value *name) { assert (pivot_table_is_empty (table)); struct pivot_dimension *d = xmalloc (sizeof *d); *d = (struct pivot_dimension) { .table = table, .axis_type = axis_type, .level = table->axes[axis_type].n_dimensions, .top_index = table->n_dimensions, .root = xmalloc (sizeof *d->root), }; struct pivot_category *root = d->root; *root = (struct pivot_category) { .name = name, .parent = NULL, .dimension = d, .show_label = false, .data_index = SIZE_MAX, .presentation_index = SIZE_MAX, }; table->dimensions = xrealloc ( table->dimensions, (table->n_dimensions + 1) * sizeof *table->dimensions); table->dimensions[table->n_dimensions++] = d; struct pivot_axis *axis = &table->axes[axis_type]; axis->dimensions = xrealloc ( axis->dimensions, (axis->n_dimensions + 1) * sizeof *axis->dimensions); axis->dimensions[axis->n_dimensions++] = d; if (axis_type == PIVOT_AXIS_LAYER) { free (table->current_layer); table->current_layer = xcalloc (axis[PIVOT_AXIS_LAYER].n_dimensions, sizeof *table->current_layer); } /* axis->extent and axis->label_depth will be calculated later. */ return d; } void pivot_dimension_destroy (struct pivot_dimension *d) { if (!d) return; pivot_category_destroy (d->root); free (d->data_leaves); free (d->presentation_leaves); free (d); } /* Returns the first leaf node in an in-order traversal that is a child of CAT. */ static const struct pivot_category * UNUSED pivot_category_first_leaf (const struct pivot_category *cat) { if (pivot_category_is_leaf (cat)) return cat; for (size_t i = 0; i < cat->n_subs; i++) { const struct pivot_category *first = pivot_category_first_leaf (cat->subs[i]); if (first) return first; } return NULL; } /* Returns the next leaf node in an in-order traversal starting at CAT, which must be a leaf. */ static const struct pivot_category * UNUSED pivot_category_next_leaf (const struct pivot_category *cat) { assert (pivot_category_is_leaf (cat)); for (;;) { const struct pivot_category *parent = cat->parent; if (!parent) return NULL; for (size_t i = cat->group_index + 1; i < parent->n_subs; i++) { const struct pivot_category *next = pivot_category_first_leaf (parent->subs[i]); if (next) return next; } cat = cat->parent; } } static void pivot_category_add_child (struct pivot_category *child) { struct pivot_category *parent = child->parent; assert (pivot_category_is_group (parent)); if (parent->n_subs >= parent->allocated_subs) parent->subs = x2nrealloc (parent->subs, &parent->allocated_subs, sizeof *parent->subs); parent->subs[parent->n_subs++] = child; } /* Adds leaf categories as a child of PARENT. To create top-level categories within dimension 'd', pass 'd->root' for PARENT. Each of the varargs parameters should be a string, each of which should be a translatable category name, but not actually translated yet, e.g. enclosed in N_(). Each string may optionally be followod by a PIVOT_RC_* string that specifies the default numeric format for cells in this category. Returns the category index, which is just a 0-based array index, for the first new category. Leaves have to be created in in-order, that is, don't create a group and add some leaves, then add leaves outside the group and try to add more leaves inside it. */ int SENTINEL (0) (pivot_category_create_leaves) (struct pivot_category *parent, ...) { int retval = parent->dimension->n_leaves; va_list args; va_start (args, parent); pivot_category_create_leaves_valist (parent, args); va_end (args); return retval; } /* Creates a new leaf category with the given NAME as a child of PARENT. To create a top-level category within dimension 'd', pass 'd->root' for PARENT. Returns the category index, which is just a 0-based array index, for the new category. Leaves have to be created in in-order, that is, don't create a group and add some leaves, then add leaves outside the group and try to add more leaves inside it. */ int pivot_category_create_leaf (struct pivot_category *parent, struct pivot_value *name) { return pivot_category_create_leaf_rc (parent, name, NULL); } /* Creates a new leaf category with the given NAME as a child of PARENT. To create a top-level category within dimension 'd', pass 'd->root' for PARENT. Returns the category index, which is just a 0-based array index, for the new category. If RC is nonnull and the name of a result category, the category is assigned that result category. Leaves have to be created in in-order, that is, don't create a group and add some leaves, then add leaves outside the group and try to add more leaves inside it. */ int pivot_category_create_leaf_rc (struct pivot_category *parent, struct pivot_value *name, const char *rc) { struct pivot_dimension *d = parent->dimension; struct pivot_category *leaf = xmalloc (sizeof *leaf); *leaf = (struct pivot_category) { .name = name, .parent = parent, .dimension = d, .group_index = parent->n_subs, .data_index = d->n_leaves, .presentation_index = d->n_leaves, }; if (d->n_leaves >= d->allocated_leaves) { d->data_leaves = x2nrealloc (d->data_leaves, &d->allocated_leaves, sizeof *d->data_leaves); d->presentation_leaves = xrealloc ( d->presentation_leaves, d->allocated_leaves * sizeof *d->presentation_leaves); } d->data_leaves[d->n_leaves] = leaf; d->presentation_leaves[d->n_leaves] = leaf; d->n_leaves++; pivot_category_add_child (leaf); /* Make sure that the new child is the last in in-order. */ assert (!pivot_category_next_leaf (leaf)); pivot_category_set_rc (leaf, rc); return leaf->data_index; } /* Adds a new category group named NAME as a child of PARENT. To create a top-level group within dimension 'd', pass 'd->root' for PARENT. NAME should be a translatable name, but not actually translated yet, e.g. enclosed in N_(). To use a different kind of value for a name, use pivot_category_create_group__() instead. The optional varargs parameters may be used to add an initial set of categories to the group. Each string should be a translatable category name, but not actually translated yet, e.g. enclosed in N_(). Each string may optionally be followod by a PIVOT_RC_* string that specifies the default numeric format for cells in this category. Returns the new group. */ struct pivot_category * SENTINEL (0) (pivot_category_create_group) (struct pivot_category *parent, const char *name, ...) { struct pivot_category *group = pivot_category_create_group__ ( parent, pivot_value_new_text (name)); va_list args; va_start (args, name); pivot_category_create_leaves_valist (group, args); va_end (args); return group; } /* Adds a new category group named NAME as a child of PARENT. To create a top-level group within dimension 'd', pass 'd->root' for PARENT. Returns the new group. */ struct pivot_category * pivot_category_create_group__ (struct pivot_category *parent, struct pivot_value *name) { struct pivot_dimension *d = parent->dimension; struct pivot_category *group = xmalloc (sizeof *group); *group = (struct pivot_category) { .name = name, .parent = parent, .dimension = d, .show_label = true, .group_index = parent->n_subs, .data_index = SIZE_MAX, .presentation_index = SIZE_MAX, }; pivot_category_add_child (group); return group; } void pivot_category_destroy (struct pivot_category *c) { if (!c) return; pivot_value_destroy (c->name); for (size_t i = 0; i < c->n_subs; i++) pivot_category_destroy (c->subs[i]); free (c->subs); free (c); } /* Result classes. These are usually the easiest way to control the formatting of numeric data in a pivot table. See pivot_dimension_create() for an explanation of their use. */ struct result_class { const char *name; /* "RC_*". */ struct fmt_spec format; }; /* Formats for most of the result classes. */ static struct result_class result_classes[] = { { PIVOT_RC_INTEGER, { FMT_F, 40, 0 } }, { PIVOT_RC_PERCENT, { FMT_PCT, 40, 1 } }, { PIVOT_RC_CORRELATION, { FMT_F, 40, 3 } }, { PIVOT_RC_SIGNIFICANCE, { FMT_F, 40, 3 } }, { PIVOT_RC_RESIDUAL, { FMT_F, 40, 2 } }, { PIVOT_RC_COUNT, { 0, 0, 0 } }, { PIVOT_RC_OTHER, { 0, 0, 0 } }, }; /* Has PIVOT_RC_COUNT been overridden by the user? */ static bool overridden_count_format; static struct result_class * pivot_result_class_find (const char *s) { for (size_t i = 0; i < sizeof result_classes / sizeof *result_classes; i++) if (!strcmp (s, result_classes[i].name)) return &result_classes[i]; return NULL; } static const struct fmt_spec * pivot_table_get_format (const struct pivot_table *table, const char *s) { if (!s) return NULL; else if (!strcmp (s, PIVOT_RC_OTHER)) return settings_get_format (); else if (!strcmp (s, PIVOT_RC_COUNT) && !overridden_count_format) return &table->weight_format; else { const struct result_class *rc = pivot_result_class_find (s); return rc ? &rc->format : NULL; } } /* Sets the format specification for the result class named S (which should not include the RC_ prefix) to *FORMAT. Returns true if successful, false if S does not name a known result class. */ bool pivot_result_class_change (const char *s_, const struct fmt_spec *format) { char *s = xasprintf ("RC_%s", s_); struct result_class *rc = pivot_result_class_find (s); if (rc) { rc->format = *format; if (!strcmp (s, PIVOT_RC_COUNT)) overridden_count_format = true; } free (s); return rc != NULL; } /* Pivot tables. */ /* Creates and returns a new pivot table with the given TITLE. TITLE should be a text string marked for translation but not actually translated yet, e.g. N_("Descriptive Statistics"). The un-translated text string is used as the pivot table's subtype. Operations commonly performed on the new pivot_table: - If empty rows or columns should not be displayed, set ->omit_empty to true. - Set the format to use for "count" values with pivot_table_set_weight_var() or pivot_table_set_weight_format(). This function is a shortcut for pivot_table_create__() for the most common case. Use pivot_table_create__() directly if the title should be some kind of value other than an ordinary text string, or if the subtype should be different from the title. See the large comment at the top of pivot-table.h for general advice on creating pivot tables. */ struct pivot_table * pivot_table_create (const char *title) { return pivot_table_create__ (pivot_value_new_text (title), title); } /* Creates and returns a new pivot table with the given TITLE, and takes ownership of TITLE. The new pivot table's subtype is SUBTYPE, which should be an untranslated English string that describes the contents of the table at a high level without being specific about the variables or other context involved. Operations commonly performed on the new pivot_table: - If empty rows or columns should not be displayed, set ->omit_empty to true. - Set the format to use for "count" values with pivot_table_set_weight_var() or pivot_table_set_weight_format(). See the large comment at the top of pivot-table.h for general advice on creating pivot tables. */ struct pivot_table * pivot_table_create__ (struct pivot_value *title, const char *subtype) { struct pivot_table *table = xzalloc (sizeof *table); table->ref_cnt = 1; table->show_caption = true; table->weight_format = (struct fmt_spec) { FMT_F, 40, 0 }; table->title = title; table->subtype = subtype ? pivot_value_new_text (subtype) : NULL; table->command_c = output_get_command_name (); table->sizing[TABLE_HORZ].range[0] = 50; table->sizing[TABLE_HORZ].range[1] = 72; table->sizing[TABLE_VERT].range[0] = 36; table->sizing[TABLE_VERT].range[1] = 120; for (size_t i = 0; i < PIVOT_N_AREAS; i++) area_style_copy (NULL, &table->areas[i], pivot_area_get_default_style (i)); /* Set default border styles. */ static const enum table_stroke default_strokes[PIVOT_N_BORDERS] = { [PIVOT_BORDER_TITLE] = TABLE_STROKE_NONE, [PIVOT_BORDER_OUTER_LEFT] = TABLE_STROKE_NONE, [PIVOT_BORDER_OUTER_TOP] = TABLE_STROKE_NONE, [PIVOT_BORDER_OUTER_RIGHT] = TABLE_STROKE_NONE, [PIVOT_BORDER_OUTER_BOTTOM] = TABLE_STROKE_NONE, [PIVOT_BORDER_INNER_LEFT] = TABLE_STROKE_THICK, [PIVOT_BORDER_INNER_TOP] = TABLE_STROKE_THICK, [PIVOT_BORDER_INNER_RIGHT] = TABLE_STROKE_THICK, [PIVOT_BORDER_INNER_BOTTOM] = TABLE_STROKE_THICK, [PIVOT_BORDER_DATA_LEFT] = TABLE_STROKE_THICK, [PIVOT_BORDER_DATA_TOP] = TABLE_STROKE_THICK, [PIVOT_BORDER_DIM_ROW_HORZ] = TABLE_STROKE_SOLID, [PIVOT_BORDER_DIM_ROW_VERT] = TABLE_STROKE_NONE, [PIVOT_BORDER_DIM_COL_HORZ] = TABLE_STROKE_SOLID, [PIVOT_BORDER_DIM_COL_VERT] = TABLE_STROKE_SOLID, [PIVOT_BORDER_CAT_ROW_HORZ] = TABLE_STROKE_NONE, [PIVOT_BORDER_CAT_ROW_VERT] = TABLE_STROKE_NONE, [PIVOT_BORDER_CAT_COL_HORZ] = TABLE_STROKE_SOLID, [PIVOT_BORDER_CAT_COL_VERT] = TABLE_STROKE_SOLID, }; for (size_t i = 0; i < PIVOT_N_BORDERS; i++) table->borders[i] = (struct table_border_style) { .stroke = default_strokes[i], .color = CELL_COLOR_BLACK, }; table->row_labels_in_corner = true; hmap_init (&table->cells); return table; } /* Creates and returns a new pivot table with the given TITLE and a single cell with the given CONTENT. This is really just for error handling. */ struct pivot_table * pivot_table_create_for_text (struct pivot_value *title, struct pivot_value *content) { struct pivot_table *table = pivot_table_create__ (title, "Error"); struct pivot_dimension *d = pivot_dimension_create ( table, PIVOT_AXIS_ROW, N_("Error")); d->hide_all_labels = true; pivot_category_create_leaf (d->root, pivot_value_new_text ("null")); pivot_table_put1 (table, 0, content); return table; } /* Increases TABLE's reference count, indicating that it has an additional owner. A pivot table that is shared among multiple owners must not be modified. */ struct pivot_table * pivot_table_ref (const struct pivot_table *table_) { struct pivot_table *table = CONST_CAST (struct pivot_table *, table_); table->ref_cnt++; return table; } /* Decreases TABLE's reference count, indicating that it has one fewer owner. If TABLE no longer has any owners, it is freed. */ void pivot_table_unref (struct pivot_table *table) { if (!table) return; assert (table->ref_cnt > 0); if (--table->ref_cnt) return; free (table->current_layer); free (table->table_look); for (int i = 0; i < TABLE_N_AXES; i++) pivot_table_sizing_uninit (&table->sizing[i]); free (table->continuation); for (int i = 0; i < sizeof table->ccs / sizeof *table->ccs; i++) free (table->ccs[i]); free (table->command_local); free (table->command_c); free (table->language); free (table->locale); free (table->dataset); free (table->datafile); for (size_t i = 0; i < table->n_footnotes; i++) pivot_footnote_destroy (table->footnotes[i]); free (table->footnotes); pivot_value_destroy (table->title); pivot_value_destroy (table->subtype); pivot_value_destroy (table->corner_text); pivot_value_destroy (table->caption); for (size_t i = 0; i < PIVOT_N_AREAS; i++) area_style_uninit (&table->areas[i]); for (size_t i = 0; i < table->n_dimensions; i++) pivot_dimension_destroy (table->dimensions[i]); free (table->dimensions); for (size_t i = 0; i < PIVOT_N_AXES; i++) free (table->axes[i].dimensions); struct pivot_cell *cell, *next_cell; HMAP_FOR_EACH_SAFE (cell, next_cell, struct pivot_cell, hmap_node, &table->cells) { hmap_delete (&table->cells, &cell->hmap_node); pivot_value_destroy (cell->value); free (cell); } hmap_destroy (&table->cells); free (table); } /* Returns true if TABLE has more than one owner. A pivot table that is shared among multiple owners must not be modified. */ bool pivot_table_is_shared (const struct pivot_table *table) { return table->ref_cnt > 1; } /* Sets the format used for PIVOT_RC_COUNT cells to the one used for variable WV, which should be the weight variable for the dictionary whose data or statistics are being put into TABLE. This has no effect if WV is NULL. */ void pivot_table_set_weight_var (struct pivot_table *table, const struct variable *wv) { if (wv) pivot_table_set_weight_format (table, var_get_print_format (wv)); } /* Sets the format used for PIVOT_RC_COUNT cells to WFMT, which should be the format for the dictionary whose data or statistics are being put into TABLE. This has no effect if WFMT is NULL. */ void pivot_table_set_weight_format (struct pivot_table *table, const struct fmt_spec *wfmt) { if (wfmt) table->weight_format = *wfmt; } /* Returns true if TABLE has no cells, false otherwise. */ bool pivot_table_is_empty (const struct pivot_table *table) { return hmap_is_empty (&table->cells); } static unsigned int pivot_cell_hash_indexes (const size_t *indexes, size_t n_idx) { return hash_bytes (indexes, n_idx * sizeof *indexes, 0); } static bool equal_indexes (const size_t *a, const unsigned int *b, size_t n) { for (size_t i = 0; i < n; i++) if (a[i] != b[i]) return false; return true; } static struct pivot_cell * pivot_table_lookup_cell__ (const struct pivot_table *table, const size_t *dindexes, unsigned int hash) { struct pivot_cell *cell; HMAP_FOR_EACH_WITH_HASH (cell, struct pivot_cell, hmap_node, hash, &table->cells) if (equal_indexes (dindexes, cell->idx, table->n_dimensions)) return cell; return false; } static struct pivot_cell * pivot_cell_allocate (size_t n_idx) { struct pivot_cell *cell UNUSED; return xmalloc (sizeof *cell + n_idx * sizeof *cell->idx); } static struct pivot_cell * pivot_table_insert_cell (struct pivot_table *table, const size_t *dindexes) { unsigned int hash = pivot_cell_hash_indexes (dindexes, table->n_dimensions); struct pivot_cell *cell = pivot_table_lookup_cell__ (table, dindexes, hash); if (!cell) { cell = pivot_cell_allocate (table->n_dimensions); for (size_t i = 0; i < table->n_dimensions; i++) cell->idx[i] = dindexes[i]; cell->value = NULL; hmap_insert (&table->cells, &cell->hmap_node, hash); } return cell; } /* Puts VALUE in the cell in TABLE whose indexes are given by the N indexes in DINDEXES. N must be the number of dimensions in TABLE. Takes ownership of VALUE. If VALUE is a numeric value without a specified format, this function checks each of the categories designated by DINDEXES[] and takes the format from the first category with a result class. If none has a result class, uses the overall default numeric format. */ void pivot_table_put (struct pivot_table *table, const size_t *dindexes, size_t n, struct pivot_value *value) { assert (n == table->n_dimensions); if (value->type == PIVOT_VALUE_NUMERIC && !value->numeric.format.w) { for (size_t i = 0; i < table->n_dimensions; i++) { const struct pivot_dimension *d = table->dimensions[i]; if (dindexes[i] < d->n_leaves) { const struct pivot_category *c = d->data_leaves[dindexes[i]]; if (c->format.w) { value->numeric.format = c->format; goto done; } } } value->numeric.format = *settings_get_format (); done:; } struct pivot_cell *cell = pivot_table_insert_cell (table, dindexes); pivot_value_destroy (cell->value); cell->value = value; } /* Puts VALUE in the cell in TABLE with index IDX1. TABLE must have 1 dimension. Takes ownership of VALUE. */ void pivot_table_put1 (struct pivot_table *table, size_t idx1, struct pivot_value *value) { size_t dindexes[] = { idx1 }; pivot_table_put (table, dindexes, sizeof dindexes / sizeof *dindexes, value); } /* Puts VALUE in the cell in TABLE with index (IDX1, IDX2). TABLE must have 2 dimensions. Takes ownership of VALUE. */ void pivot_table_put2 (struct pivot_table *table, size_t idx1, size_t idx2, struct pivot_value *value) { size_t dindexes[] = { idx1, idx2 }; pivot_table_put (table, dindexes, sizeof dindexes / sizeof *dindexes, value); } /* Puts VALUE in the cell in TABLE with index (IDX1, IDX2, IDX3). TABLE must have 3 dimensions. Takes ownership of VALUE. */ void pivot_table_put3 (struct pivot_table *table, size_t idx1, size_t idx2, size_t idx3, struct pivot_value *value) { size_t dindexes[] = { idx1, idx2, idx3 }; pivot_table_put (table, dindexes, sizeof dindexes / sizeof *dindexes, value); } /* Puts VALUE in the cell in TABLE with index (IDX1, IDX2, IDX3, IDX4). TABLE must have 4 dimensions. Takes ownership of VALUE. */ void pivot_table_put4 (struct pivot_table *table, size_t idx1, size_t idx2, size_t idx3, size_t idx4, struct pivot_value *value) { size_t dindexes[] = { idx1, idx2, idx3, idx4 }; pivot_table_put (table, dindexes, sizeof dindexes / sizeof *dindexes, value); } /* Creates and returns a new footnote in TABLE with the given CONTENT and an automatically assigned marker. The footnote will only appear in output if it is referenced. Use pivot_value_add_footnote() to add a reference to the footnote. */ struct pivot_footnote * pivot_table_create_footnote (struct pivot_table *table, struct pivot_value *content) { return pivot_table_create_footnote__ (table, table->n_footnotes, NULL, content); } static struct pivot_value * pivot_make_default_footnote_marker (int idx, bool show_numeric_markers) { char text[INT_BUFSIZE_BOUND (size_t)]; if (show_numeric_markers) snprintf (text, sizeof text, "%d", idx + 1); else str_format_26adic (idx + 1, false, text, sizeof text); return pivot_value_new_user_text (text, -1); } /* Creates or modifies a footnote in TABLE with 0-based number IDX (and creates all lower indexes as a side effect). If MARKER is nonnull, sets the footnote's marker; if CONTENT is nonnull, sets the footnote's content. */ struct pivot_footnote * pivot_table_create_footnote__ (struct pivot_table *table, size_t idx, struct pivot_value *marker, struct pivot_value *content) { if (idx >= table->n_footnotes) { while (idx >= table->allocated_footnotes) table->footnotes = x2nrealloc (table->footnotes, &table->allocated_footnotes, sizeof *table->footnotes); while (idx >= table->n_footnotes) { struct pivot_footnote *f = xmalloc (sizeof *f); f->idx = table->n_footnotes; f->marker = pivot_make_default_footnote_marker ( f->idx, table->show_numeric_markers); f->content = NULL; f->show = true; table->footnotes[table->n_footnotes++] = f; } } struct pivot_footnote *f = table->footnotes[idx]; if (marker) { pivot_value_destroy (f->marker); f->marker = marker; } if (content) { pivot_value_destroy (f->content); f->content = content; } return f; } /* Frees the data owned by F. */ void pivot_footnote_destroy (struct pivot_footnote *f) { if (f) { pivot_value_destroy (f->content); pivot_value_destroy (f->marker); free (f); } } /* Converts per-axis presentation-order indexes, given in PINDEXES, into data indexes for each dimension in TABLE in DINDEXES[]. */ void pivot_table_convert_indexes_ptod (const struct pivot_table *table, const size_t *pindexes[PIVOT_N_AXES], size_t dindexes[/* table->n_dimensions */]) { for (size_t i = 0; i < PIVOT_N_AXES; i++) { const struct pivot_axis *axis = &table->axes[i]; for (size_t j = 0; j < axis->n_dimensions; j++) { const struct pivot_dimension *d = axis->dimensions[j]; dindexes[d->top_index] = d->presentation_leaves[pindexes[i][j]]->data_index; } } } size_t * pivot_table_enumerate_axis (const struct pivot_table *table, enum pivot_axis_type axis_type, const size_t *layer_indexes, bool omit_empty, size_t *n) { const struct pivot_axis *axis = &table->axes[axis_type]; if (!axis->n_dimensions) { size_t *enumeration = xnmalloc (2, sizeof *enumeration); enumeration[0] = 0; enumeration[1] = SIZE_MAX; if (n) *n = 1; return enumeration; } else if (!axis->extent) { size_t *enumeration = xmalloc (sizeof *enumeration); *enumeration = SIZE_MAX; if (n) *n = 0; return enumeration; } size_t *enumeration = xnmalloc (xsum (xtimes (axis->extent, axis->n_dimensions), 1), sizeof *enumeration); size_t *p = enumeration; size_t *dindexes = XCALLOC (table->n_dimensions, size_t); size_t *axis_indexes; PIVOT_AXIS_FOR_EACH (axis_indexes, axis) { if (omit_empty) { enum pivot_axis_type axis2_type = pivot_axis_type_transpose (axis_type); size_t *axis2_indexes; PIVOT_AXIS_FOR_EACH (axis2_indexes, &table->axes[axis2_type]) { const size_t *pindexes[PIVOT_N_AXES]; pindexes[PIVOT_AXIS_LAYER] = layer_indexes; pindexes[axis_type] = axis_indexes; pindexes[axis2_type] = axis2_indexes; pivot_table_convert_indexes_ptod (table, pindexes, dindexes); if (pivot_table_get (table, dindexes)) goto found; } continue; found: free (axis2_indexes); } memcpy (p, axis_indexes, axis->n_dimensions * sizeof *p); p += axis->n_dimensions; } *p = SIZE_MAX; if (n) *n = (p - enumeration) / axis->n_dimensions; free (dindexes); return enumeration; } static const struct pivot_cell * pivot_table_lookup_cell (const struct pivot_table *table, const size_t *dindexes) { unsigned int hash = pivot_cell_hash_indexes (dindexes, table->n_dimensions); return pivot_table_lookup_cell__ (table, dindexes, hash); } const struct pivot_value * pivot_table_get (const struct pivot_table *table, const size_t *dindexes) { const struct pivot_cell *cell = pivot_table_lookup_cell (table, dindexes); return cell ? cell->value : NULL; } struct pivot_value * pivot_table_get_rw (struct pivot_table *table, const size_t *dindexes) { struct pivot_cell *cell = pivot_table_insert_cell (table, dindexes); if (!cell->value) cell->value = pivot_value_new_user_text ("", -1); return cell->value; } static void distribute_extra_depth (struct pivot_category *category, size_t extra_depth) { if (pivot_category_is_group (category) && category->n_subs) for (size_t i = 0; i < category->n_subs; i++) distribute_extra_depth (category->subs[i], extra_depth); else category->extra_depth += extra_depth; } static void pivot_category_assign_label_depth (struct pivot_category *category, bool dimension_labels_in_corner) { category->extra_depth = 0; if (pivot_category_is_group (category)) { size_t depth = 0; for (size_t i = 0; i < category->n_subs; i++) { pivot_category_assign_label_depth (category->subs[i], false); depth = MAX (depth, category->subs[i]->label_depth); } for (size_t i = 0; i < category->n_subs; i++) { struct pivot_category *sub = category->subs[i]; size_t extra_depth = depth - sub->label_depth; if (extra_depth) distribute_extra_depth (sub, extra_depth); sub->label_depth = depth; } category->show_label_in_corner = (category->show_label && dimension_labels_in_corner); category->label_depth = (category->show_label && !category->show_label_in_corner ? depth + 1 : depth); } else category->label_depth = 1; } static bool pivot_axis_assign_label_depth (struct pivot_table *table, enum pivot_axis_type axis_type, bool dimension_labels_in_corner) { struct pivot_axis *axis = &table->axes[axis_type]; bool any_label_shown_in_corner = false; axis->label_depth = 0; axis->extent = 1; for (size_t i = 0; i < axis->n_dimensions; i++) { struct pivot_dimension *d = axis->dimensions[i]; pivot_category_assign_label_depth (d->root, dimension_labels_in_corner); d->label_depth = d->hide_all_labels ? 0 : d->root->label_depth; axis->label_depth += d->label_depth; axis->extent *= d->n_leaves; if (d->root->show_label_in_corner) any_label_shown_in_corner = true; } return any_label_shown_in_corner; } void pivot_table_assign_label_depth (struct pivot_table *table) { pivot_axis_assign_label_depth (table, PIVOT_AXIS_COLUMN, false); if (pivot_axis_assign_label_depth ( table, PIVOT_AXIS_ROW, (table->row_labels_in_corner && !table->corner_text)) && table->axes[PIVOT_AXIS_COLUMN].label_depth == 0) table->axes[PIVOT_AXIS_COLUMN].label_depth = 1; pivot_axis_assign_label_depth (table, PIVOT_AXIS_LAYER, false); } /* Footnotes. */ static void indent (int indentation) { for (int i = 0; i < indentation * 2; i++) putchar (' '); } static void pivot_value_dump (const struct pivot_value *value) { char *s = pivot_value_to_string (value, SETTINGS_VALUE_SHOW_DEFAULT, SETTINGS_VALUE_SHOW_DEFAULT); fputs (s, stdout); free (s); } static void pivot_table_dump_value (const struct pivot_value *value, const char *name, int indentation) { if (value) { indent (indentation); printf ("%s: ", name); pivot_value_dump (value); putchar ('\n'); } } static void pivot_table_dump_string (const char *string, const char *name, int indentation) { if (string) { indent (indentation); printf ("%s: %s\n", name, string); } } static void pivot_category_dump (const struct pivot_category *c, int indentation) { indent (indentation); printf ("%s \"", pivot_category_is_leaf (c) ? "leaf" : "group"); pivot_value_dump (c->name); printf ("\" "); if (pivot_category_is_leaf (c)) printf ("data_index=%zu\n", c->data_index); else { printf (" (label %s)", c->show_label ? "shown" : "hidden"); printf ("\n"); for (size_t i = 0; i < c->n_subs; i++) pivot_category_dump (c->subs[i], indentation + 1); } } void pivot_dimension_dump (const struct pivot_dimension *d, int indentation) { indent (indentation); printf ("%s dimension %zu (where 0=innermost), label_depth=%d:\n", pivot_axis_type_to_string (d->axis_type), d->level, d->label_depth); pivot_category_dump (d->root, indentation + 1); } static void area_style_dump (enum pivot_area area, const struct area_style *a, int indentation) { indent (indentation); printf ("%s: ", pivot_area_to_string (area)); font_style_dump (&a->font_style); putchar (' '); cell_style_dump (&a->cell_style); putchar ('\n'); } static void table_border_style_dump (enum pivot_border border, const struct table_border_style *b, int indentation) { indent (indentation); printf ("%s: %s ", pivot_border_to_string (border), table_stroke_to_string (b->stroke)); cell_color_dump (&b->color); putchar ('\n'); } static char *** compose_headings (const struct pivot_axis *axis, const size_t *column_enumeration, enum settings_value_show show_values, enum settings_value_show show_variables) { if (!axis->n_dimensions || !axis->extent || !axis->label_depth) return NULL; char ***headings = xnmalloc (axis->label_depth, sizeof *headings); for (size_t i = 0; i < axis->label_depth; i++) headings[i] = xcalloc (axis->extent, sizeof **headings); const size_t *indexes; size_t column = 0; PIVOT_ENUMERATION_FOR_EACH (indexes, column_enumeration, axis) { int row = axis->label_depth - 1; for (int dim_index = 0; dim_index < axis->n_dimensions; dim_index++) { const struct pivot_dimension *d = axis->dimensions[dim_index]; if (d->hide_all_labels) continue; for (const struct pivot_category *c = d->presentation_leaves[indexes[dim_index]]; c; c = c->parent) { if (pivot_category_is_leaf (c) || (c->show_label && !c->show_label_in_corner)) { headings[row][column] = pivot_value_to_string ( c->name, show_values, show_variables); if (!*headings[row][column]) headings[row][column] = xstrdup (""); row--; } } } column++; } return headings; } static void free_headings (const struct pivot_axis *axis, char ***headings) { for (size_t i = 0; i < axis->label_depth; i++) { for (size_t j = 0; j < axis->extent; j++) free (headings[i][j]); free (headings[i]); } free (headings); } static void pivot_table_sizing_dump (const char *name, const struct pivot_table_sizing *s, int indentation) { indent (indentation); printf ("%ss: min=%d, max=%d\n", name, s->range[0], s->range[1]); if (s->n_widths) { indent (indentation + 1); printf ("%s widths:", name); for (size_t i = 0; i < s->n_widths; i++) printf (" %d", s->widths[i]); printf ("\n"); } if (s->n_breaks) { indent (indentation + 1); printf ("break after %ss:", name); for (size_t i = 0; i < s->n_breaks; i++) printf (" %zu", s->breaks[i]); printf ("\n"); } if (s->n_keeps) { indent (indentation + 1); printf ("keep %ss together:", name); for (size_t i = 0; i < s->n_keeps; i++) printf (" [%zu,%zu]", s->keeps[i].ofs, s->keeps[i].ofs + s->keeps[i].n - 1); printf ("\n"); } } void pivot_table_dump (const struct pivot_table *table, int indentation) { if (!table) return; int old_decimal = settings_get_decimal_char (FMT_COMMA); if (table->decimal == '.' || table->decimal == ',') settings_set_decimal_char (table->decimal); pivot_table_dump_value (table->title, "title", indentation); pivot_table_dump_string (table->command_c, "command", indentation); pivot_table_dump_string (table->dataset, "dataset", indentation); pivot_table_dump_string (table->datafile, "datafile", indentation); pivot_table_dump_string (table->notes, "notes", indentation); pivot_table_dump_string (table->table_look, "table-look", indentation); if (table->date) { indent (indentation); struct tm *tm = localtime (&table->date); printf ("date: %d-%02d-%02d %d:%02d:%02d\n", tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday, tm->tm_hour, tm->tm_min, tm->tm_sec); } indent (indentation); printf ("sizing:\n"); pivot_table_sizing_dump ("column", &table->sizing[TABLE_HORZ], indentation + 1); pivot_table_sizing_dump ("row", &table->sizing[TABLE_VERT], indentation + 1); indent (indentation); printf ("areas:\n"); for (enum pivot_area area = 0; area < PIVOT_N_AREAS; area++) area_style_dump (area, &table->areas[area], indentation + 1); indent (indentation); printf ("borders:\n"); for (enum pivot_border border = 0; border < PIVOT_N_BORDERS; border++) table_border_style_dump (border, &table->borders[border], indentation + 1); for (size_t i = 0; i < table->n_dimensions; i++) pivot_dimension_dump (table->dimensions[i], indentation); /* Presentation and data indexes. */ size_t *dindexes = XCALLOC (table->n_dimensions, size_t); const struct pivot_axis *layer_axis = &table->axes[PIVOT_AXIS_LAYER]; if (layer_axis->n_dimensions) { indent (indentation); printf ("current layer:"); for (size_t i = 0; i < layer_axis->n_dimensions; i++) { const struct pivot_dimension *d = layer_axis->dimensions[i]; char *name = pivot_value_to_string (d->root->name, table->show_values, table->show_variables); char *value = pivot_value_to_string ( d->data_leaves[table->current_layer[i]]->name, table->show_values, table->show_variables); printf (" %s=%s", name, value); free (value); free (name); } putchar ('\n'); } size_t *layer_indexes; size_t layer_iteration = 0; PIVOT_AXIS_FOR_EACH (layer_indexes, &table->axes[PIVOT_AXIS_LAYER]) { indent (indentation); printf ("layer %zu:", layer_iteration++); const struct pivot_axis *layer_axis = &table->axes[PIVOT_AXIS_LAYER]; for (size_t i = 0; i < layer_axis->n_dimensions; i++) { const struct pivot_dimension *d = layer_axis->dimensions[i]; fputs (i == 0 ? " " : ", ", stdout); pivot_value_dump (d->root->name); fputs (" =", stdout); struct pivot_value **names = xnmalloc (layer_axis->label_depth, sizeof *names); size_t n_names = 0; for (const struct pivot_category *c = d->presentation_leaves[layer_indexes[i]]; c; c = c->parent) { if (pivot_category_is_leaf (c) || c->show_label) names[n_names++] = c->name; } for (size_t i = n_names; i-- > 0;) { putchar (' '); pivot_value_dump (names[i]); } free (names); } putchar ('\n'); size_t *column_enumeration = pivot_table_enumerate_axis ( table, PIVOT_AXIS_COLUMN, layer_indexes, table->omit_empty, NULL); size_t *row_enumeration = pivot_table_enumerate_axis ( table, PIVOT_AXIS_ROW, layer_indexes, table->omit_empty, NULL); char ***column_headings = compose_headings ( &table->axes[PIVOT_AXIS_COLUMN], column_enumeration, table->show_values, table->show_variables); for (size_t y = 0; y < table->axes[PIVOT_AXIS_COLUMN].label_depth; y++) { indent (indentation + 1); for (size_t x = 0; x < table->axes[PIVOT_AXIS_COLUMN].extent; x++) { if (x) fputs ("; ", stdout); if (column_headings[y][x]) fputs (column_headings[y][x], stdout); } putchar ('\n'); } free_headings (&table->axes[PIVOT_AXIS_COLUMN], column_headings); indent (indentation + 1); printf ("-----------------------------------------------\n"); char ***row_headings = compose_headings ( &table->axes[PIVOT_AXIS_ROW], row_enumeration, table->show_values, table->show_variables); size_t x = 0; const size_t *pindexes[PIVOT_N_AXES] = { [PIVOT_AXIS_LAYER] = layer_indexes }; PIVOT_ENUMERATION_FOR_EACH (pindexes[PIVOT_AXIS_ROW], row_enumeration, &table->axes[PIVOT_AXIS_ROW]) { indent (indentation + 1); size_t i = 0; for (size_t y = 0; y < table->axes[PIVOT_AXIS_ROW].label_depth; y++) { if (i++) fputs ("; ", stdout); if (row_headings[y][x]) fputs (row_headings[y][x], stdout); } printf (" | "); i = 0; PIVOT_ENUMERATION_FOR_EACH (pindexes[PIVOT_AXIS_COLUMN], column_enumeration, &table->axes[PIVOT_AXIS_COLUMN]) { if (i++) printf ("; "); pivot_table_convert_indexes_ptod (table, pindexes, dindexes); const struct pivot_value *value = pivot_table_get ( table, dindexes); if (value) pivot_value_dump (value); } printf ("\n"); x++; } free (column_enumeration); free (row_enumeration); free_headings (&table->axes[PIVOT_AXIS_ROW], row_headings); } pivot_table_dump_value (table->caption, "caption", indentation); for (size_t i = 0; i < table->n_footnotes; i++) { const struct pivot_footnote *f = table->footnotes[i]; indent (indentation); putchar ('['); if (f->marker) pivot_value_dump (f->marker); else printf ("%zu", f->idx); putchar (']'); pivot_value_dump (f->content); putchar ('\n'); } free (dindexes); settings_set_decimal_char (old_decimal); } static const char * consume_int (const char *p, size_t *n) { *n = 0; while (c_isdigit (*p)) *n = *n * 10 + (*p++ - '0'); return p; } static size_t pivot_format_inner_template (struct string *out, const char *template, char escape, struct pivot_value **values, size_t n_values, enum settings_value_show show_values, enum settings_value_show show_variables) { size_t args_consumed = 0; while (*template && *template != ':') { if (*template == '\\' && template[1]) { ds_put_byte (out, template[1] == 'n' ? '\n' : template[1]); template += 2; } else if (*template == escape) { size_t index; template = consume_int (template + 1, &index); if (index >= 1 && index <= n_values) { pivot_value_format (values[index - 1], show_values, show_variables, out); args_consumed = MAX (args_consumed, index); } } else ds_put_byte (out, *template++); } return args_consumed; } static const char * pivot_extract_inner_template (const char *template, const char **p) { *p = template; for (;;) { if (*template == '\\' && template[1] != '\0') template += 2; else if (*template == ':') return template + 1; else if (*template == '\0') return template; else template++; } } static void pivot_format_template (struct string *out, const char *template, const struct pivot_argument *args, size_t n_args, enum settings_value_show show_values, enum settings_value_show show_variables) { while (*template) { if (*template == '\\' && template[1] != '\0') { ds_put_byte (out, template[1] == 'n' ? '\n' : template[1]); template += 2; } else if (*template == '^') { size_t index; template = consume_int (template + 1, &index); if (index >= 1 && index <= n_args && args[index - 1].n > 0) pivot_value_format (args[index - 1].values[0], show_values, show_variables, out); } else if (*template == '[') { const char *tmpl[2]; template = pivot_extract_inner_template (template + 1, &tmpl[0]); template = pivot_extract_inner_template (template, &tmpl[1]); template += *template == ']'; size_t index; template = consume_int (template, &index); if (index < 1 || index > n_args) continue; const struct pivot_argument *arg = &args[index - 1]; size_t left = arg->n; while (left) { struct pivot_value **values = arg->values + (arg->n - left); int tmpl_idx = left == arg->n && *tmpl[0] != ':' ? 0 : 1; char escape = "%^"[tmpl_idx]; size_t used = pivot_format_inner_template ( out, tmpl[tmpl_idx], escape, values, left, show_values, show_variables); if (!used || used > left) break; left -= used; } } else ds_put_byte (out, *template++); } } static enum settings_value_show interpret_show (enum settings_value_show global_show, enum settings_value_show table_show, enum settings_value_show value_show, bool has_label) { return (!has_label ? SETTINGS_VALUE_SHOW_VALUE : value_show != SETTINGS_VALUE_SHOW_DEFAULT ? value_show : table_show != SETTINGS_VALUE_SHOW_DEFAULT ? table_show : global_show); } /* Appends a text representation of the body of VALUE to OUT. SHOW_VALUES and SHOW_VARIABLES control whether variable and value labels are included. The "body" omits subscripts and superscripts and footnotes. */ bool pivot_value_format_body (const struct pivot_value *value, enum settings_value_show show_values, enum settings_value_show show_variables, struct string *out) { enum settings_value_show show; bool numeric = false; switch (value->type) { case PIVOT_VALUE_NUMERIC: show = interpret_show (settings_get_show_values (), show_values, value->numeric.show, value->numeric.value_label != NULL); if (show & SETTINGS_VALUE_SHOW_VALUE) { char *s = data_out (&(union value) { .f = value->numeric.x }, "UTF-8", &value->numeric.format); ds_put_cstr (out, s + strspn (s, " ")); free (s); } if (show & SETTINGS_VALUE_SHOW_LABEL) { if (show & SETTINGS_VALUE_SHOW_VALUE) ds_put_byte (out, ' '); ds_put_cstr (out, value->numeric.value_label); } numeric = !(show & SETTINGS_VALUE_SHOW_LABEL); break; case PIVOT_VALUE_STRING: show = interpret_show (settings_get_show_values (), show_values, value->string.show, value->string.value_label != NULL); if (show & SETTINGS_VALUE_SHOW_VALUE) { if (value->string.hex) { for (const uint8_t *p = CHAR_CAST (uint8_t *, value->string.s); *p; p++) ds_put_format (out, "%02X", *p); } else ds_put_cstr (out, value->string.s); } if (show & SETTINGS_VALUE_SHOW_LABEL) { if (show & SETTINGS_VALUE_SHOW_VALUE) ds_put_byte (out, ' '); ds_put_cstr (out, value->string.value_label); } break; case PIVOT_VALUE_VARIABLE: show = interpret_show (settings_get_show_variables (), show_variables, value->variable.show, value->variable.var_label != NULL); if (show & SETTINGS_VALUE_SHOW_VALUE) ds_put_cstr (out, value->variable.var_name); if (show & SETTINGS_VALUE_SHOW_LABEL) { if (show & SETTINGS_VALUE_SHOW_VALUE) ds_put_byte (out, ' '); ds_put_cstr (out, value->variable.var_label); } break; case PIVOT_VALUE_TEXT: ds_put_cstr (out, value->text.local); break; case PIVOT_VALUE_TEMPLATE: pivot_format_template (out, value->template.local, value->template.args, value->template.n_args, show_values, show_variables); break; } return numeric; } /* Appends a text representation of VALUE to OUT. SHOW_VALUES and SHOW_VARIABLES control whether variable and value labels are included. Subscripts and superscripts and footnotes are included. */ void pivot_value_format (const struct pivot_value *value, enum settings_value_show show_values, enum settings_value_show show_variables, struct string *out) { pivot_value_format_body (value, show_values, show_variables, out); if (value->n_subscripts) { for (size_t i = 0; i < value->n_subscripts; i++) ds_put_format (out, "%c%s", i ? ',' : '_', value->subscripts[i]); } if (value->superscript) ds_put_format (out, "^%s", value->superscript); for (size_t i = 0; i < value->n_footnotes; i++) { ds_put_byte (out, '^'); pivot_value_format (value->footnotes[i]->marker, show_values, show_variables, out); } } /* Returns a text representation of VALUE. The caller must free the string, with free(). */ char * pivot_value_to_string (const struct pivot_value *value, enum settings_value_show show_values, enum settings_value_show show_variables) { struct string s = DS_EMPTY_INITIALIZER; pivot_value_format (value, show_values, show_variables, &s); return ds_steal_cstr (&s); } /* Frees the data owned by V. */ void pivot_value_destroy (struct pivot_value *value) { if (value) { font_style_uninit (value->font_style); free (value->font_style); free (value->cell_style); /* Do not free the elements of footnotes because VALUE does not own them. */ free (value->footnotes); for (size_t i = 0; i < value->n_subscripts; i++) free (value->subscripts[i]); free (value->subscripts); free (value->superscript); switch (value->type) { case PIVOT_VALUE_NUMERIC: free (value->numeric.var_name); free (value->numeric.value_label); break; case PIVOT_VALUE_STRING: free (value->string.s); free (value->string.var_name); free (value->string.value_label); break; case PIVOT_VALUE_VARIABLE: free (value->variable.var_name); free (value->variable.var_label); break; case PIVOT_VALUE_TEXT: free (value->text.local); if (value->text.c != value->text.local) free (value->text.c); if (value->text.id != value->text.local && value->text.id != value->text.c) free (value->text.id); break; case PIVOT_VALUE_TEMPLATE: free (value->template.local); if (value->template.id != value->template.local) free (value->template.id); for (size_t i = 0; i < value->template.n_args; i++) pivot_argument_uninit (&value->template.args[i]); free (value->template.args); break; } free (value); } } /* Sets AREA to the style to use for VALUE, with defaults coming from DEFAULT_STYLE for the parts of the style that VALUE doesn't override. */ void pivot_value_get_style (struct pivot_value *value, const struct font_style *base_font_style, const struct cell_style *base_cell_style, struct area_style *area) { font_style_copy (NULL, &area->font_style, (value->font_style ? value->font_style : base_font_style)); area->cell_style = *(value->cell_style ? value->cell_style : base_cell_style); } /* Copies AREA into VALUE's style. */ void pivot_value_set_style (struct pivot_value *value, const struct area_style *area) { if (value->font_style) font_style_uninit (value->font_style); else value->font_style = xmalloc (sizeof *value->font_style); font_style_copy (NULL, value->font_style, &area->font_style); if (!value->cell_style) value->cell_style = xmalloc (sizeof *value->cell_style); *value->cell_style = area->cell_style; } /* Frees the data owned by ARG (but not ARG itself). */ void pivot_argument_uninit (struct pivot_argument *arg) { if (arg) { for (size_t i = 0; i < arg->n; i++) pivot_value_destroy (arg->values[i]); free (arg->values); } } /* Creates and returns a new pivot_value whose contents is the null-terminated string TEXT. Takes ownership of TEXT. This function is for text strings provided by the user (with the exception that pivot_value_new_variable() should be used for variable names). For strings that are part of the PSPP user interface, such as names of procedures, statistics, annotations, error messages, etc., use pivot_value_new_text(). */ struct pivot_value * pivot_value_new_user_text_nocopy (char *text) { struct pivot_value *value = xmalloc (sizeof *value); *value = (struct pivot_value) { .type = PIVOT_VALUE_TEXT, .text = { .local = text, .c = text, .id = text, .user_provided = true, } }; return value; } /* Creates and returns a new pivot_value whose contents is the LENGTH bytes of TEXT. Use SIZE_MAX if TEXT is null-teriminated and its length is not known in advance. This function is for text strings provided by the user (with the exception that pivot_value_new_variable() should be used for variable names). For strings that are part of the PSPP user interface, such as names of procedures, statistics, annotations, error messages, etc., use pivot_value_new_text().j The caller retains ownership of TEXT.*/ struct pivot_value * pivot_value_new_user_text (const char *text, size_t length) { return pivot_value_new_user_text_nocopy ( xmemdup0 (text, length != SIZE_MAX ? length : strlen (text))); } /* Creates and returns new pivot_value whose contents is TEXT, which should be a translatable string, but not actually translated yet, e.g. enclosed in N_(). This function is for text strings that are part of the PSPP user interface, such as names of procedures, statistics, annotations, error messages, etc. For strings that come from the user, use pivot_value_new_user_text(). */ struct pivot_value * pivot_value_new_text (const char *text) { char *c = xstrdup (text); char *local = xstrdup (gettext (c)); struct pivot_value *value = xmalloc (sizeof *value); *value = (struct pivot_value) { .type = PIVOT_VALUE_TEXT, .text = { .local = local, .c = c, .id = c, .user_provided = false, } }; return value; } /* Same as pivot_value_new_text() but its argument is a printf()-like format string. */ struct pivot_value * PRINTF_FORMAT (1, 2) pivot_value_new_text_format (const char *format, ...) { va_list args; va_start (args, format); char *c = xvasprintf (format, args); va_end (args); va_start (args, format); char *local = xvasprintf (gettext (format), args); va_end (args); struct pivot_value *value = xmalloc (sizeof *value); *value = (struct pivot_value) { .type = PIVOT_VALUE_TEXT, .text = { .local = local, .c = c, .id = xstrdup (c), .user_provided = false, } }; return value; } static char * xstrdup_if_nonempty (const char *s) { return s && s[0] ? xstrdup (s) : NULL; } /* Returns a new pivot_value that represents X. The format to use for X is unspecified. Usually the easiest way to specify a format is through assigning a result class to one of the categories that the pivot_value will end up in. If that is not suitable, then the caller can use pivot_value_set_rc() or assign directly to value->numeric.format. */ struct pivot_value * pivot_value_new_number (double x) { struct pivot_value *value = xmalloc (sizeof *value); *value = (struct pivot_value) { .type = PIVOT_VALUE_NUMERIC, .numeric = { .x = x, }, }; return value; } /* Returns a new pivot_value that represents X, formatted as an integer. */ struct pivot_value * pivot_value_new_integer (double x) { struct pivot_value *value = pivot_value_new_number (x); value->numeric.format = (struct fmt_spec) { FMT_F, 40, 0 }; return value; } /* Returns a new pivot_value that represents VALUE, formatted as for VARIABLE. */ struct pivot_value * pivot_value_new_var_value (const struct variable *variable, const union value *value) { struct pivot_value *pv = pivot_value_new_value ( value, var_get_width (variable), var_get_print_format (variable), var_get_encoding (variable)); char *var_name = xstrdup (var_get_name (variable)); if (var_is_alpha (variable)) pv->string.var_name = var_name; else pv->numeric.var_name = var_name; const char *label = var_lookup_value_label (variable, value); if (label) { if (var_is_alpha (variable)) pv->string.value_label = xstrdup (label); else pv->numeric.value_label = xstrdup (label); } return pv; } /* Returns a new pivot_value that represents VALUE, with the given WIDTH, formatted with FORMAT. For a string value, ENCODING must be its character encoding. */ struct pivot_value * pivot_value_new_value (const union value *value, int width, const struct fmt_spec *format, const char *encoding) { struct pivot_value *pv = xzalloc (sizeof *pv); if (width > 0) { char *s = recode_string (UTF8, encoding, CHAR_CAST (char *, value->s), width); size_t n = strlen (s); while (n > 0 && s[n - 1] == ' ') s[--n] = '\0'; pv->type = PIVOT_VALUE_STRING; pv->string.s = s; pv->string.hex = format->type == FMT_AHEX; } else { pv->type = PIVOT_VALUE_NUMERIC; pv->numeric.x = value->f; pv->numeric.format = *format; } return pv; } /* Returns a new pivot_value for VARIABLE. */ struct pivot_value * pivot_value_new_variable (const struct variable *variable) { struct pivot_value *value = xmalloc (sizeof *value); *value = (struct pivot_value) { .type = PIVOT_VALUE_VARIABLE, .variable = { .var_name = xstrdup (var_get_name (variable)), .var_label = xstrdup_if_nonempty (var_get_label (variable)), }, }; return value; } /* Attaches a reference to FOOTNOTE to V. */ void pivot_value_add_footnote (struct pivot_value *v, const struct pivot_footnote *footnote) { /* Some legacy tables include numerous duplicate footnotes. Suppress them. */ for (size_t i = 0; i < v->n_footnotes; i++) if (v->footnotes[i] == footnote) return; v->footnotes = xrealloc (v->footnotes, (v->n_footnotes + 1) * sizeof *v->footnotes); v->footnotes[v->n_footnotes++] = footnote; } /* If VALUE is a numeric value, and RC is a result class such as PIVOT_RC_COUNT, changes VALUE's format to the result class's. */ void pivot_value_set_rc (const struct pivot_table *table, struct pivot_value *value, const char *rc) { if (value->type == PIVOT_VALUE_NUMERIC) { const struct fmt_spec *f = pivot_table_get_format (table, rc); if (f) value->numeric.format = *f; } } pspp-1.4.1/src/output/cairo.c0000644000175000017500000021331513711575611015517 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016 Free Software Foundation, Inc. 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 3 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, see . */ #include #include "output/cairo.h" #include "libpspp/assertion.h" #include "libpspp/cast.h" #include "libpspp/hash-functions.h" #include "libpspp/message.h" #include "libpspp/pool.h" #include "libpspp/start-date.h" #include "libpspp/str.h" #include "libpspp/string-map.h" #include "libpspp/version.h" #include "data/file-handle-def.h" #include "output/cairo-chart.h" #include "output/chart-item-provider.h" #include "output/charts/boxplot.h" #include "output/charts/np-plot.h" #include "output/charts/piechart.h" #include "output/charts/barchart.h" #include "output/charts/plot-hist.h" #include "output/charts/roc-chart.h" #include "output/charts/spreadlevel-plot.h" #include "output/charts/scree.h" #include "output/charts/scatterplot.h" #include "output/driver-provider.h" #include "output/group-item.h" #include "output/message-item.h" #include "output/options.h" #include "output/page-setup-item.h" #include "output/render.h" #include "output/table-item.h" #include "output/table.h" #include "output/text-item.h" #include #include #include #include #include #include #include #include #include #include #include #include "gl/c-ctype.h" #include "gl/c-strcase.h" #include "gl/intprops.h" #include "gl/minmax.h" #include "gl/xalloc.h" #include "gettext.h" #define _(msgid) gettext (msgid) /* This file uses TABLE_HORZ and TABLE_VERT enough to warrant abbreviating. */ #define H TABLE_HORZ #define V TABLE_VERT /* The unit used for internal measurements is inch/(72 * XR_POINT). (Thus, XR_POINT units represent one point.) */ #define XR_POINT PANGO_SCALE /* Conversions to and from points. */ static double xr_to_pt (int x) { return x / (double) XR_POINT; } /* Conversion from 1/96" units ("pixels") to Cairo/Pango units. */ static int px_to_xr (int x) { return x * (PANGO_SCALE * 72 / 96); } /* Dimensions for drawing lines in tables. */ #define XR_LINE_WIDTH (XR_POINT / 2) /* Width of an ordinary line. */ #define XR_LINE_SPACE XR_POINT /* Space between double lines. */ /* Output types. */ enum xr_output_type { XR_PDF, XR_PS, XR_SVG }; /* Cairo fonts. */ enum xr_font_type { XR_FONT_PROPORTIONAL, XR_FONT_EMPHASIS, XR_FONT_FIXED, XR_N_FONTS }; /* A font for use with Cairo. */ struct xr_font { PangoFontDescription *desc; PangoLayout *layout; }; /* An output item whose rendering is in progress. */ struct xr_render_fsm { /* Renders as much of itself as it can on the current page. Returns true if rendering is complete, false if the output item needs another page. */ bool (*render) (struct xr_render_fsm *, struct xr_driver *); /* Destroys the output item. */ void (*destroy) (struct xr_render_fsm *); }; /* Cairo output driver. */ struct xr_driver { struct output_driver driver; /* User parameters. */ struct xr_font fonts[XR_N_FONTS]; int width; /* Page width minus margins. */ int length; /* Page length minus margins and header. */ int left_margin; /* Left margin in inch/(72 * XR_POINT). */ int right_margin; /* Right margin in inch/(72 * XR_POINT). */ int top_margin; /* Top margin in inch/(72 * XR_POINT). */ int bottom_margin; /* Bottom margin in inch/(72 * XR_POINT). */ int line_space; /* Space between lines. */ int line_width; /* Width of lines. */ int min_break[TABLE_N_AXES]; /* Min cell size to break across pages. */ int object_spacing; /* Space between output objects. */ struct cell_color bg; /* Background color */ struct cell_color fg; /* Foreground color */ int initial_page_number; struct page_heading headings[2]; /* Top and bottom headings. */ int headings_height[2]; /* Internal state. */ struct render_params *params; double font_scale; int char_width, char_height; char *command_name; char *title; char *subtitle; cairo_t *cairo; cairo_surface_t *surface; int page_number; /* Current page number. */ int x, y; struct xr_render_fsm *fsm; int nest; struct string_map heading_vars; }; static const struct output_driver_class cairo_driver_class; static void xr_driver_destroy_fsm (struct xr_driver *); static void xr_driver_run_fsm (struct xr_driver *); static void xr_draw_line (void *, int bb[TABLE_N_AXES][2], enum render_line_style styles[TABLE_N_AXES][2], struct cell_color colors[TABLE_N_AXES][2]); static void xr_measure_cell_width (void *, const struct table_cell *, int *min, int *max); static int xr_measure_cell_height (void *, const struct table_cell *, int width); static void xr_draw_cell (void *, const struct table_cell *, int color_idx, int bb[TABLE_N_AXES][2], int spill[TABLE_N_AXES][2], int clip[TABLE_N_AXES][2]); static int xr_adjust_break (void *, const struct table_cell *, int width, int height); static struct xr_render_fsm *xr_render_output_item ( struct xr_driver *, const struct output_item *); /* Output driver basics. */ static struct xr_driver * xr_driver_cast (struct output_driver *driver) { assert (driver->class == &cairo_driver_class); return UP_CAST (driver, struct xr_driver, driver); } static struct driver_option * opt (struct output_driver *d, struct string_map *options, const char *key, const char *default_value) { return driver_option_get (d, options, key, default_value); } static int lookup_color_name (const char *s) { struct color { struct hmap_node hmap_node; const char *name; int code; }; static struct color colors[] = { { .name = "aliceblue", .code = 0xf0f8ff }, { .name = "antiquewhite", .code = 0xfaebd7 }, { .name = "aqua", .code = 0x00ffff }, { .name = "aquamarine", .code = 0x7fffd4 }, { .name = "azure", .code = 0xf0ffff }, { .name = "beige", .code = 0xf5f5dc }, { .name = "bisque", .code = 0xffe4c4 }, { .name = "black", .code = 0x000000 }, { .name = "blanchedalmond", .code = 0xffebcd }, { .name = "blue", .code = 0x0000ff }, { .name = "blueviolet", .code = 0x8a2be2 }, { .name = "brown", .code = 0xa52a2a }, { .name = "burlywood", .code = 0xdeb887 }, { .name = "cadetblue", .code = 0x5f9ea0 }, { .name = "chartreuse", .code = 0x7fff00 }, { .name = "chocolate", .code = 0xd2691e }, { .name = "coral", .code = 0xff7f50 }, { .name = "cornflowerblue", .code = 0x6495ed }, { .name = "cornsilk", .code = 0xfff8dc }, { .name = "crimson", .code = 0xdc143c }, { .name = "cyan", .code = 0x00ffff }, { .name = "darkblue", .code = 0x00008b }, { .name = "darkcyan", .code = 0x008b8b }, { .name = "darkgoldenrod", .code = 0xb8860b }, { .name = "darkgray", .code = 0xa9a9a9 }, { .name = "darkgreen", .code = 0x006400 }, { .name = "darkgrey", .code = 0xa9a9a9 }, { .name = "darkkhaki", .code = 0xbdb76b }, { .name = "darkmagenta", .code = 0x8b008b }, { .name = "darkolivegreen", .code = 0x556b2f }, { .name = "darkorange", .code = 0xff8c00 }, { .name = "darkorchid", .code = 0x9932cc }, { .name = "darkred", .code = 0x8b0000 }, { .name = "darksalmon", .code = 0xe9967a }, { .name = "darkseagreen", .code = 0x8fbc8f }, { .name = "darkslateblue", .code = 0x483d8b }, { .name = "darkslategray", .code = 0x2f4f4f }, { .name = "darkslategrey", .code = 0x2f4f4f }, { .name = "darkturquoise", .code = 0x00ced1 }, { .name = "darkviolet", .code = 0x9400d3 }, { .name = "deeppink", .code = 0xff1493 }, { .name = "deepskyblue", .code = 0x00bfff }, { .name = "dimgray", .code = 0x696969 }, { .name = "dimgrey", .code = 0x696969 }, { .name = "dodgerblue", .code = 0x1e90ff }, { .name = "firebrick", .code = 0xb22222 }, { .name = "floralwhite", .code = 0xfffaf0 }, { .name = "forestgreen", .code = 0x228b22 }, { .name = "fuchsia", .code = 0xff00ff }, { .name = "gainsboro", .code = 0xdcdcdc }, { .name = "ghostwhite", .code = 0xf8f8ff }, { .name = "gold", .code = 0xffd700 }, { .name = "goldenrod", .code = 0xdaa520 }, { .name = "gray", .code = 0x808080 }, { .name = "green", .code = 0x008000 }, { .name = "greenyellow", .code = 0xadff2f }, { .name = "grey", .code = 0x808080 }, { .name = "honeydew", .code = 0xf0fff0 }, { .name = "hotpink", .code = 0xff69b4 }, { .name = "indianred", .code = 0xcd5c5c }, { .name = "indigo", .code = 0x4b0082 }, { .name = "ivory", .code = 0xfffff0 }, { .name = "khaki", .code = 0xf0e68c }, { .name = "lavender", .code = 0xe6e6fa }, { .name = "lavenderblush", .code = 0xfff0f5 }, { .name = "lawngreen", .code = 0x7cfc00 }, { .name = "lemonchiffon", .code = 0xfffacd }, { .name = "lightblue", .code = 0xadd8e6 }, { .name = "lightcoral", .code = 0xf08080 }, { .name = "lightcyan", .code = 0xe0ffff }, { .name = "lightgoldenrodyellow", .code = 0xfafad2 }, { .name = "lightgray", .code = 0xd3d3d3 }, { .name = "lightgreen", .code = 0x90ee90 }, { .name = "lightgrey", .code = 0xd3d3d3 }, { .name = "lightpink", .code = 0xffb6c1 }, { .name = "lightsalmon", .code = 0xffa07a }, { .name = "lightseagreen", .code = 0x20b2aa }, { .name = "lightskyblue", .code = 0x87cefa }, { .name = "lightslategray", .code = 0x778899 }, { .name = "lightslategrey", .code = 0x778899 }, { .name = "lightsteelblue", .code = 0xb0c4de }, { .name = "lightyellow", .code = 0xffffe0 }, { .name = "lime", .code = 0x00ff00 }, { .name = "limegreen", .code = 0x32cd32 }, { .name = "linen", .code = 0xfaf0e6 }, { .name = "magenta", .code = 0xff00ff }, { .name = "maroon", .code = 0x800000 }, { .name = "mediumaquamarine", .code = 0x66cdaa }, { .name = "mediumblue", .code = 0x0000cd }, { .name = "mediumorchid", .code = 0xba55d3 }, { .name = "mediumpurple", .code = 0x9370db }, { .name = "mediumseagreen", .code = 0x3cb371 }, { .name = "mediumslateblue", .code = 0x7b68ee }, { .name = "mediumspringgreen", .code = 0x00fa9a }, { .name = "mediumturquoise", .code = 0x48d1cc }, { .name = "mediumvioletred", .code = 0xc71585 }, { .name = "midnightblue", .code = 0x191970 }, { .name = "mintcream", .code = 0xf5fffa }, { .name = "mistyrose", .code = 0xffe4e1 }, { .name = "moccasin", .code = 0xffe4b5 }, { .name = "navajowhite", .code = 0xffdead }, { .name = "navy", .code = 0x000080 }, { .name = "oldlace", .code = 0xfdf5e6 }, { .name = "olive", .code = 0x808000 }, { .name = "olivedrab", .code = 0x6b8e23 }, { .name = "orange", .code = 0xffa500 }, { .name = "orangered", .code = 0xff4500 }, { .name = "orchid", .code = 0xda70d6 }, { .name = "palegoldenrod", .code = 0xeee8aa }, { .name = "palegreen", .code = 0x98fb98 }, { .name = "paleturquoise", .code = 0xafeeee }, { .name = "palevioletred", .code = 0xdb7093 }, { .name = "papayawhip", .code = 0xffefd5 }, { .name = "peachpuff", .code = 0xffdab9 }, { .name = "peru", .code = 0xcd853f }, { .name = "pink", .code = 0xffc0cb }, { .name = "plum", .code = 0xdda0dd }, { .name = "powderblue", .code = 0xb0e0e6 }, { .name = "purple", .code = 0x800080 }, { .name = "red", .code = 0xff0000 }, { .name = "rosybrown", .code = 0xbc8f8f }, { .name = "royalblue", .code = 0x4169e1 }, { .name = "saddlebrown", .code = 0x8b4513 }, { .name = "salmon", .code = 0xfa8072 }, { .name = "sandybrown", .code = 0xf4a460 }, { .name = "seagreen", .code = 0x2e8b57 }, { .name = "seashell", .code = 0xfff5ee }, { .name = "sienna", .code = 0xa0522d }, { .name = "silver", .code = 0xc0c0c0 }, { .name = "skyblue", .code = 0x87ceeb }, { .name = "slateblue", .code = 0x6a5acd }, { .name = "slategray", .code = 0x708090 }, { .name = "slategrey", .code = 0x708090 }, { .name = "snow", .code = 0xfffafa }, { .name = "springgreen", .code = 0x00ff7f }, { .name = "steelblue", .code = 0x4682b4 }, { .name = "tan", .code = 0xd2b48c }, { .name = "teal", .code = 0x008080 }, { .name = "thistle", .code = 0xd8bfd8 }, { .name = "tomato", .code = 0xff6347 }, { .name = "turquoise", .code = 0x40e0d0 }, { .name = "violet", .code = 0xee82ee }, { .name = "wheat", .code = 0xf5deb3 }, { .name = "white", .code = 0xffffff }, { .name = "whitesmoke", .code = 0xf5f5f5 }, { .name = "yellow", .code = 0xffff00 }, { .name = "yellowgreen", .code = 0x9acd32 }, }; static struct hmap color_table = HMAP_INITIALIZER (color_table); if (hmap_is_empty (&color_table)) for (size_t i = 0; i < sizeof colors / sizeof *colors; i++) hmap_insert (&color_table, &colors[i].hmap_node, hash_string (colors[i].name, 0)); const struct color *color; HMAP_FOR_EACH_WITH_HASH (color, struct color, hmap_node, hash_string (s, 0), &color_table) if (!strcmp (color->name, s)) return color->code; return -1; } static bool parse_color__ (const char *s, struct cell_color *color) { /* #rrrrggggbbbb */ uint16_t r16, g16, b16; int len; if (sscanf (s, "#%4"SCNx16"%4"SCNx16"%4"SCNx16"%n", &r16, &g16, &b16, &len) == 3 && len == 13 && !s[len]) { color->r = r16 >> 8; color->g = g16 >> 8; color->b = b16 >> 8; return true; } /* #rrggbb */ uint8_t r, g, b; if (sscanf (s, "#%2"SCNx8"%2"SCNx8"%2"SCNx8"%n", &r, &g, &b, &len) == 3 && len == 7 && !s[len]) { color->r = r; color->g = g; color->b = b; return true; } /* rrggbb */ if (sscanf (s, "%2"SCNx8"%2"SCNx8"%2"SCNx8"%n", &r, &g, &b, &len) == 3 && len == 6 && !s[len]) { color->r = r; color->g = g; color->b = b; return true; } /* rgb(r,g,b) */ if (sscanf (s, "rgb (%"SCNi8" , %"SCNi8" , %"SCNi8") %n", &r, &g, &b, &len) == 3 && !s[len]) { color->r = r; color->g = g; color->b = b; return true; } /* rgba(r,g,b,a), ignoring a. */ if (sscanf (s, "rgba (%"SCNi8" , %"SCNi8" , %"SCNi8", %*f) %n", &r, &g, &b, &len) == 3 && !s[len]) { color->r = r; color->g = g; color->b = b; return true; } int code = lookup_color_name (s); if (code >= 0) { color->r = code >> 16; color->g = code >> 8; color->b = code; return true; } return false; } /* Parse color information specified by KEY into {RED,GREEN,BLUE}. Currently, the input string must be of the form "#RRRRGGGGBBBB" Future implementations might allow things like "yellow" and "sky-blue-ultra-brown" */ void parse_color (struct output_driver *d, struct string_map *options, const char *key, const char *default_value, struct cell_color *color) { char *string = parse_string (opt (d, options, key, default_value)); if (!parse_color__ (string, color) && !parse_color__ (default_value, color)) *color = (struct cell_color) CELL_COLOR_BLACK; free (string); } static PangoFontDescription * parse_font (const char *font, int default_size, bool bold, bool italic) { if (!c_strcasecmp (font, "Monospaced")) font = "Monospace"; PangoFontDescription *desc = pango_font_description_from_string (font); if (desc == NULL) return NULL; /* If the font description didn't include an explicit font size, then set it to DEFAULT_SIZE, which is in inch/72000 units. */ if (!(pango_font_description_get_set_fields (desc) & PANGO_FONT_MASK_SIZE)) pango_font_description_set_size (desc, (default_size / 1000.0) * PANGO_SCALE); pango_font_description_set_weight (desc, (bold ? PANGO_WEIGHT_BOLD : PANGO_WEIGHT_NORMAL)); pango_font_description_set_style (desc, (italic ? PANGO_STYLE_ITALIC : PANGO_STYLE_NORMAL)); return desc; } static PangoFontDescription * parse_font_option (struct output_driver *d, struct string_map *options, const char *key, const char *default_value, int default_size, bool bold, bool italic) { char *string = parse_string (opt (d, options, key, default_value)); PangoFontDescription *desc = parse_font (string, default_size, bold, italic); if (!desc) { msg (MW, _("`%s': bad font specification"), string); /* Fall back to DEFAULT_VALUE, which had better be a valid font description. */ desc = parse_font (default_value, default_size, bold, italic); assert (desc != NULL); } free (string); return desc; } static void apply_options (struct xr_driver *xr, struct string_map *o) { struct output_driver *d = &xr->driver; /* In inch/72000 units used by parse_paper_size() and parse_dimension(). */ int left_margin, right_margin; int top_margin, bottom_margin; int paper_width, paper_length; int font_size; int min_break[TABLE_N_AXES]; /* Scale factor from inch/72000 to inch/(72 * XR_POINT). */ const double scale = XR_POINT / 1000.; int i; for (i = 0; i < XR_N_FONTS; i++) { struct xr_font *font = &xr->fonts[i]; if (font->desc != NULL) pango_font_description_free (font->desc); } font_size = parse_int (opt (d, o, "font-size", "10000"), 1000, 1000000); xr->fonts[XR_FONT_FIXED].desc = parse_font_option (d, o, "fixed-font", "monospace", font_size, false, false); xr->fonts[XR_FONT_PROPORTIONAL].desc = parse_font_option ( d, o, "prop-font", "sans serif", font_size, false, false); xr->fonts[XR_FONT_EMPHASIS].desc = parse_font_option ( d, o, "emph-font", "sans serif", font_size, false, true); parse_color (d, o, "background-color", "#FFFFFFFFFFFF", &xr->bg); parse_color (d, o, "foreground-color", "#000000000000", &xr->fg); /* Get dimensions. */ parse_paper_size (opt (d, o, "paper-size", ""), &paper_width, &paper_length); left_margin = parse_dimension (opt (d, o, "left-margin", ".5in")); right_margin = parse_dimension (opt (d, o, "right-margin", ".5in")); top_margin = parse_dimension (opt (d, o, "top-margin", ".5in")); bottom_margin = parse_dimension (opt (d, o, "bottom-margin", ".5in")); min_break[H] = parse_dimension (opt (d, o, "min-hbreak", NULL)) * scale; min_break[V] = parse_dimension (opt (d, o, "min-vbreak", NULL)) * scale; int object_spacing = (parse_dimension (opt (d, o, "object-spacing", NULL)) * scale); /* Convert to inch/(XR_POINT * 72). */ xr->left_margin = left_margin * scale; xr->right_margin = right_margin * scale; xr->top_margin = top_margin * scale; xr->bottom_margin = bottom_margin * scale; xr->width = (paper_width - left_margin - right_margin) * scale; xr->length = (paper_length - top_margin - bottom_margin) * scale; xr->min_break[H] = min_break[H] >= 0 ? min_break[H] : xr->width / 2; xr->min_break[V] = min_break[V] >= 0 ? min_break[V] : xr->length / 2; xr->object_spacing = object_spacing >= 0 ? object_spacing : XR_POINT * 12; /* There are no headings so headings_height can stay 0. */ } static struct xr_driver * xr_allocate (const char *name, int device_type, struct string_map *o, double font_scale) { struct xr_driver *xr = xzalloc (sizeof *xr); struct output_driver *d = &xr->driver; output_driver_init (d, &cairo_driver_class, name, device_type); string_map_init (&xr->heading_vars); /* This is a nasty kluge for an issue that does not make sense. On any surface other than a screen (e.g. for output to PDF or PS or SVG), the fonts are way too big by default. A "9-point" font seems to appear about 16 points tall. We use a scale factor for these surfaces to help, but the underlying issue is a mystery. */ xr->font_scale = font_scale; apply_options (xr, o); return xr; } static int pango_to_xr (int pango) { return (XR_POINT != PANGO_SCALE ? ceil (pango * (1. * XR_POINT / PANGO_SCALE)) : pango); } static int xr_to_pango (int xr) { return (XR_POINT != PANGO_SCALE ? ceil (xr * (1. / XR_POINT * PANGO_SCALE)) : xr); } static void xr_measure_fonts (cairo_t *cairo, const struct xr_font fonts[XR_N_FONTS], int *char_width, int *char_height) { *char_width = 0; *char_height = 0; for (int i = 0; i < XR_N_FONTS; i++) { PangoLayout *layout = pango_cairo_create_layout (cairo); pango_layout_set_font_description (layout, fonts[i].desc); pango_layout_set_text (layout, "0", 1); int cw, ch; pango_layout_get_size (layout, &cw, &ch); *char_width = MAX (*char_width, pango_to_xr (cw)); *char_height = MAX (*char_height, pango_to_xr (ch)); g_object_unref (G_OBJECT (layout)); } } static int get_layout_height (PangoLayout *layout) { int w, h; pango_layout_get_size (layout, &w, &h); return h; } static int xr_render_page_heading (cairo_t *cairo, const PangoFontDescription *font, const struct page_heading *ph, int page_number, int width, bool draw, int base_y) { PangoLayout *layout = pango_cairo_create_layout (cairo); pango_layout_set_font_description (layout, font); int y = 0; for (size_t i = 0; i < ph->n; i++) { const struct page_paragraph *pp = &ph->paragraphs[i]; char *markup = output_driver_substitute_heading_vars (pp->markup, page_number); pango_layout_set_markup (layout, markup, -1); free (markup); pango_layout_set_alignment ( layout, (pp->halign == TABLE_HALIGN_LEFT ? PANGO_ALIGN_LEFT : pp->halign == TABLE_HALIGN_CENTER ? PANGO_ALIGN_CENTER : pp->halign == TABLE_HALIGN_MIXED ? PANGO_ALIGN_LEFT : PANGO_ALIGN_RIGHT)); pango_layout_set_width (layout, xr_to_pango (width)); if (draw) { cairo_save (cairo); cairo_translate (cairo, 0, xr_to_pt (y + base_y)); pango_cairo_show_layout (cairo, layout); cairo_restore (cairo); } y += pango_to_xr (get_layout_height (layout)); } g_object_unref (G_OBJECT (layout)); return y; } static int xr_measure_headings (cairo_surface_t *surface, const PangoFontDescription *font, const struct page_heading headings[2], int width, int object_spacing, int height[2]) { cairo_t *cairo = cairo_create (surface); int total = 0; for (int i = 0; i < 2; i++) { int h = xr_render_page_heading (cairo, font, &headings[i], -1, width, false, 0); /* If the top heading is nonempty, add some space below it. */ if (h && i == 0) h += object_spacing; if (height) height[i] = h; total += h; } cairo_destroy (cairo); return total; } static bool xr_check_fonts (cairo_surface_t *surface, const struct xr_font fonts[XR_N_FONTS], int usable_width, int usable_length) { cairo_t *cairo = cairo_create (surface); int char_width, char_height; xr_measure_fonts (cairo, fonts, &char_width, &char_height); cairo_destroy (cairo); bool ok = true; enum { MIN_WIDTH = 3, MIN_LENGTH = 3 }; if (usable_width / char_width < MIN_WIDTH) { msg (ME, _("The defined page is not wide enough to hold at least %d " "characters in the default font. In fact, there's only " "room for %d characters."), MIN_WIDTH, usable_width / char_width); ok = false; } if (usable_length / char_height < MIN_LENGTH) { msg (ME, _("The defined page is not long enough to hold at least %d " "lines in the default font. In fact, there's only " "room for %d lines."), MIN_LENGTH, usable_length / char_height); ok = false; } return ok; } static void xr_set_cairo (struct xr_driver *xr, cairo_t *cairo) { xr->cairo = cairo; cairo_set_line_width (xr->cairo, xr_to_pt (XR_LINE_WIDTH)); xr_measure_fonts (xr->cairo, xr->fonts, &xr->char_width, &xr->char_height); for (int i = 0; i < XR_N_FONTS; i++) { struct xr_font *font = &xr->fonts[i]; font->layout = pango_cairo_create_layout (cairo); pango_layout_set_font_description (font->layout, font->desc); } if (xr->params == NULL) { xr->params = xmalloc (sizeof *xr->params); xr->params->draw_line = xr_draw_line; xr->params->measure_cell_width = xr_measure_cell_width; xr->params->measure_cell_height = xr_measure_cell_height; xr->params->adjust_break = xr_adjust_break; xr->params->draw_cell = xr_draw_cell; xr->params->aux = xr; xr->params->size[H] = xr->width; xr->params->size[V] = xr->length; xr->params->font_size[H] = xr->char_width; xr->params->font_size[V] = xr->char_height; int lw = XR_LINE_WIDTH; int ls = XR_LINE_SPACE; for (int i = 0; i < TABLE_N_AXES; i++) { xr->params->line_widths[i][RENDER_LINE_NONE] = 0; xr->params->line_widths[i][RENDER_LINE_SINGLE] = lw; xr->params->line_widths[i][RENDER_LINE_DASHED] = lw; xr->params->line_widths[i][RENDER_LINE_THICK] = lw * 2; xr->params->line_widths[i][RENDER_LINE_THIN] = lw / 2; xr->params->line_widths[i][RENDER_LINE_DOUBLE] = 2 * lw + ls; } for (int i = 0; i < TABLE_N_AXES; i++) xr->params->min_break[i] = xr->min_break[i]; xr->params->supports_margins = true; xr->params->rtl = render_direction_rtl (); } cairo_set_source_rgb (xr->cairo, xr->fg.r / 255.0, xr->fg.g / 255.0, xr->fg.b / 255.0); } static struct output_driver * xr_create (const char *file_name, enum settings_output_devices device_type, struct string_map *o, enum xr_output_type file_type) { struct xr_driver *xr; cairo_status_t status; double width_pt, length_pt; xr = xr_allocate (file_name, device_type, o, 72.0 / 128.0); width_pt = xr_to_pt (xr->width + xr->left_margin + xr->right_margin); length_pt = xr_to_pt (xr->length + xr->top_margin + xr->bottom_margin); if (file_type == XR_PDF) xr->surface = cairo_pdf_surface_create (file_name, width_pt, length_pt); else if (file_type == XR_PS) xr->surface = cairo_ps_surface_create (file_name, width_pt, length_pt); else if (file_type == XR_SVG) xr->surface = cairo_svg_surface_create (file_name, width_pt, length_pt); else NOT_REACHED (); status = cairo_surface_status (xr->surface); if (status != CAIRO_STATUS_SUCCESS) { msg (ME, _("error opening output file `%s': %s"), file_name, cairo_status_to_string (status)); goto error; } if (!xr_check_fonts (xr->surface, xr->fonts, xr->width, xr->length)) goto error; return &xr->driver; error: output_driver_destroy (&xr->driver); return NULL; } static struct output_driver * xr_pdf_create (struct file_handle *fh, enum settings_output_devices device_type, struct string_map *o) { struct output_driver *od = xr_create (fh_get_file_name (fh), device_type, o, XR_PDF); fh_unref (fh); return od ; } static struct output_driver * xr_ps_create (struct file_handle *fh, enum settings_output_devices device_type, struct string_map *o) { struct output_driver *od = xr_create (fh_get_file_name (fh), device_type, o, XR_PS); fh_unref (fh); return od ; } static struct output_driver * xr_svg_create (struct file_handle *fh, enum settings_output_devices device_type, struct string_map *o) { struct output_driver *od = xr_create (fh_get_file_name (fh), device_type, o, XR_SVG); fh_unref (fh); return od ; } static void xr_destroy (struct output_driver *driver) { struct xr_driver *xr = xr_driver_cast (driver); size_t i; xr_driver_destroy_fsm (xr); if (xr->cairo != NULL) { cairo_surface_finish (xr->surface); cairo_status_t status = cairo_status (xr->cairo); if (status != CAIRO_STATUS_SUCCESS) fprintf (stderr, _("error drawing output for %s driver: %s"), output_driver_get_name (driver), cairo_status_to_string (status)); cairo_surface_destroy (xr->surface); cairo_destroy (xr->cairo); } for (i = 0; i < XR_N_FONTS; i++) { struct xr_font *font = &xr->fonts[i]; if (font->desc != NULL) pango_font_description_free (font->desc); if (font->layout != NULL) g_object_unref (font->layout); } free (xr->params); free (xr); } static void xr_flush (struct output_driver *driver) { struct xr_driver *xr = xr_driver_cast (driver); cairo_surface_flush (cairo_get_target (xr->cairo)); } static void xr_update_page_setup (struct output_driver *driver, const struct page_setup *ps) { struct xr_driver *xr = xr_driver_cast (driver); xr->initial_page_number = ps->initial_page_number; xr->object_spacing = ps->object_spacing * 72 * XR_POINT; if (xr->cairo) return; int usable[TABLE_N_AXES]; for (int i = 0; i < 2; i++) usable[i] = (ps->paper[i] - (ps->margins[i][0] + ps->margins[i][1])) * 72 * XR_POINT; int headings_height[2]; usable[V] -= xr_measure_headings ( xr->surface, xr->fonts[XR_FONT_PROPORTIONAL].desc, ps->headings, usable[H], xr->object_spacing, headings_height); enum table_axis h = ps->orientation == PAGE_LANDSCAPE; enum table_axis v = !h; if (!xr_check_fonts (xr->surface, xr->fonts, usable[h], usable[v])) return; for (int i = 0; i < 2; i++) { page_heading_uninit (&xr->headings[i]); page_heading_copy (&xr->headings[i], &ps->headings[i]); xr->headings_height[i] = headings_height[i]; } xr->width = usable[h]; xr->length = usable[v]; xr->left_margin = ps->margins[h][0] * 72 * XR_POINT; xr->right_margin = ps->margins[h][1] * 72 * XR_POINT; xr->top_margin = ps->margins[v][0] * 72 * XR_POINT; xr->bottom_margin = ps->margins[v][1] * 72 * XR_POINT; cairo_pdf_surface_set_size (xr->surface, ps->paper[h] * 72.0, ps->paper[v] * 72.0); } static void xr_submit (struct output_driver *driver, const struct output_item *output_item) { struct xr_driver *xr = xr_driver_cast (driver); if (is_page_setup_item (output_item)) { xr_update_page_setup (driver, to_page_setup_item (output_item)->page_setup); return; } if (!xr->cairo) { xr->page_number = xr->initial_page_number - 1; xr_set_cairo (xr, cairo_create (xr->surface)); cairo_save (xr->cairo); xr_driver_next_page (xr, xr->cairo); } xr_driver_output_item (xr, output_item); while (xr_driver_need_new_page (xr)) { cairo_restore (xr->cairo); cairo_show_page (xr->cairo); cairo_save (xr->cairo); xr_driver_next_page (xr, xr->cairo); } } /* Functions for rendering a series of output items to a series of Cairo contexts, with pagination. Used by PSPPIRE for printing, and by the basic Cairo output driver above as its underlying implementation. See the big comment in cairo.h for intended usage. */ /* Gives new page CAIRO to XR for output. */ void xr_driver_next_page (struct xr_driver *xr, cairo_t *cairo) { cairo_save (cairo); cairo_set_source_rgb (cairo, xr->bg.r / 255.0, xr->bg.g / 255.0, xr->bg.b / 255.0); cairo_rectangle (cairo, 0, 0, xr->width, xr->length); cairo_fill (cairo); cairo_restore (cairo); cairo_translate (cairo, xr_to_pt (xr->left_margin), xr_to_pt (xr->top_margin + xr->headings_height[0])); xr->page_number++; xr->cairo = cairo; xr->x = xr->y = 0; xr_render_page_heading (xr->cairo, xr->fonts[XR_FONT_PROPORTIONAL].desc, &xr->headings[0], xr->page_number, xr->width, true, -xr->headings_height[0]); xr_render_page_heading (xr->cairo, xr->fonts[XR_FONT_PROPORTIONAL].desc, &xr->headings[1], xr->page_number, xr->width, true, xr->length); xr_driver_run_fsm (xr); } /* Start rendering OUTPUT_ITEM to XR. Only valid if XR is not in the middle of rendering a previous output item, that is, only if xr_driver_need_new_page() returns false. */ void xr_driver_output_item (struct xr_driver *xr, const struct output_item *output_item) { assert (xr->fsm == NULL); xr->fsm = xr_render_output_item (xr, output_item); xr_driver_run_fsm (xr); } /* Returns true if XR is in the middle of rendering an output item and needs a new page to be appended using xr_driver_next_page() to make progress, otherwise false. */ bool xr_driver_need_new_page (const struct xr_driver *xr) { return xr->fsm != NULL; } /* Returns true if the current page doesn't have any content yet. */ bool xr_driver_is_page_blank (const struct xr_driver *xr) { return xr->y == 0; } static void xr_driver_destroy_fsm (struct xr_driver *xr) { if (xr->fsm != NULL) { xr->fsm->destroy (xr->fsm); xr->fsm = NULL; } } static void xr_driver_run_fsm (struct xr_driver *xr) { if (xr->fsm != NULL && !xr->fsm->render (xr->fsm, xr)) xr_driver_destroy_fsm (xr); } static void xr_layout_cell (struct xr_driver *, const struct table_cell *, int bb[TABLE_N_AXES][2], int clip[TABLE_N_AXES][2], int *width, int *height, int *brk); static void set_source_rgba (cairo_t *cairo, const struct cell_color *color) { cairo_set_source_rgba (cairo, color->r / 255., color->g / 255., color->b / 255., color->alpha / 255.); } static void dump_line (struct xr_driver *xr, int x0, int y0, int x1, int y1, int style, const struct cell_color *color) { cairo_new_path (xr->cairo); set_source_rgba (xr->cairo, color); cairo_set_line_width ( xr->cairo, xr_to_pt (style == RENDER_LINE_THICK ? XR_LINE_WIDTH * 2 : style == RENDER_LINE_THIN ? XR_LINE_WIDTH / 2 : XR_LINE_WIDTH)); cairo_move_to (xr->cairo, xr_to_pt (x0 + xr->x), xr_to_pt (y0 + xr->y)); cairo_line_to (xr->cairo, xr_to_pt (x1 + xr->x), xr_to_pt (y1 + xr->y)); cairo_stroke (xr->cairo); } static void UNUSED dump_rectangle (struct xr_driver *xr, int x0, int y0, int x1, int y1) { cairo_new_path (xr->cairo); cairo_set_line_width (xr->cairo, xr_to_pt (XR_LINE_WIDTH)); cairo_move_to (xr->cairo, xr_to_pt (x0 + xr->x), xr_to_pt (y0 + xr->y)); cairo_line_to (xr->cairo, xr_to_pt (x1 + xr->x), xr_to_pt (y0 + xr->y)); cairo_line_to (xr->cairo, xr_to_pt (x1 + xr->x), xr_to_pt (y1 + xr->y)); cairo_line_to (xr->cairo, xr_to_pt (x0 + xr->x), xr_to_pt (y1 + xr->y)); cairo_close_path (xr->cairo); cairo_stroke (xr->cairo); } static void fill_rectangle (struct xr_driver *xr, int x0, int y0, int x1, int y1) { cairo_new_path (xr->cairo); cairo_set_line_width (xr->cairo, xr_to_pt (XR_LINE_WIDTH)); cairo_rectangle (xr->cairo, xr_to_pt (x0 + xr->x), xr_to_pt (y0 + xr->y), xr_to_pt (x1 - x0), xr_to_pt (y1 - y0)); cairo_fill (xr->cairo); } /* Draws a horizontal line X0...X2 at Y if LEFT says so, shortening it to X0...X1 if SHORTEN is true. Draws a horizontal line X1...X3 at Y if RIGHT says so, shortening it to X2...X3 if SHORTEN is true. */ static void horz_line (struct xr_driver *xr, int x0, int x1, int x2, int x3, int y, enum render_line_style left, enum render_line_style right, const struct cell_color *left_color, const struct cell_color *right_color, bool shorten) { if (left != RENDER_LINE_NONE && right != RENDER_LINE_NONE && !shorten && cell_color_equal (left_color, right_color)) dump_line (xr, x0, y, x3, y, left, left_color); else { if (left != RENDER_LINE_NONE) dump_line (xr, x0, y, shorten ? x1 : x2, y, left, left_color); if (right != RENDER_LINE_NONE) dump_line (xr, shorten ? x2 : x1, y, x3, y, right, right_color); } } /* Draws a vertical line Y0...Y2 at X if TOP says so, shortening it to Y0...Y1 if SHORTEN is true. Draws a vertical line Y1...Y3 at X if BOTTOM says so, shortening it to Y2...Y3 if SHORTEN is true. */ static void vert_line (struct xr_driver *xr, int y0, int y1, int y2, int y3, int x, enum render_line_style top, enum render_line_style bottom, const struct cell_color *top_color, const struct cell_color *bottom_color, bool shorten) { if (top != RENDER_LINE_NONE && bottom != RENDER_LINE_NONE && !shorten && cell_color_equal (top_color, bottom_color)) dump_line (xr, x, y0, x, y3, top, top_color); else { if (top != RENDER_LINE_NONE) dump_line (xr, x, y0, x, shorten ? y1 : y2, top, top_color); if (bottom != RENDER_LINE_NONE) dump_line (xr, x, shorten ? y2 : y1, x, y3, bottom, bottom_color); } } static void xr_draw_line (void *xr_, int bb[TABLE_N_AXES][2], enum render_line_style styles[TABLE_N_AXES][2], struct cell_color colors[TABLE_N_AXES][2]) { const int x0 = bb[H][0]; const int y0 = bb[V][0]; const int x3 = bb[H][1]; const int y3 = bb[V][1]; const int top = styles[H][0]; const int bottom = styles[H][1]; int start_side = render_direction_rtl(); int end_side = !start_side; const int start_of_line = styles[V][start_side]; const int end_of_line = styles[V][end_side]; const struct cell_color *top_color = &colors[H][0]; const struct cell_color *bottom_color = &colors[H][1]; const struct cell_color *start_color = &colors[V][start_side]; const struct cell_color *end_color = &colors[V][end_side]; /* The algorithm here is somewhat subtle, to allow it to handle all the kinds of intersections that we need. Three additional ordinates are assigned along the x axis. The first is xc, midway between x0 and x3. The others are x1 and x2; for a single vertical line these are equal to xc, and for a double vertical line they are the ordinates of the left and right half of the double line. yc, y1, and y2 are assigned similarly along the y axis. The following diagram shows the coordinate system and output for double top and bottom lines, single left line, and no right line: x0 x1 xc x2 x3 y0 ________________________ | # # | | # # | | # # | | # # | | # # | y1 = y2 = yc |######### # | | # # | | # # | | # # | | # # | y3 |________#_____#_______| */ struct xr_driver *xr = xr_; /* Offset from center of each line in a pair of double lines. */ int double_line_ofs = (XR_LINE_SPACE + XR_LINE_WIDTH) / 2; /* Are the lines along each axis single or double? (It doesn't make sense to have different kinds of line on the same axis, so we don't try to gracefully handle that case.) */ bool double_vert = top == RENDER_LINE_DOUBLE || bottom == RENDER_LINE_DOUBLE; bool double_horz = start_of_line == RENDER_LINE_DOUBLE || end_of_line == RENDER_LINE_DOUBLE; /* When horizontal lines are doubled, the left-side line along y1 normally runs from x0 to x2, and the right-side line along y1 from x3 to x1. If the top-side line is also doubled, we shorten the y1 lines, so that the left-side line runs only to x1, and the right-side line only to x2. Otherwise, the horizontal line at y = y1 below would cut off the intersection, which looks ugly: x0 x1 x2 x3 y0 ________________________ | # # | | # # | | # # | | # # | y1 |######### ########| | | | | y2 |######################| | | | | y3 |______________________| It is more of a judgment call when the horizontal line is single. We actually choose to cut off the line anyhow, as shown in the first diagram above. */ bool shorten_y1_lines = top == RENDER_LINE_DOUBLE; bool shorten_y2_lines = bottom == RENDER_LINE_DOUBLE; bool shorten_yc_line = shorten_y1_lines && shorten_y2_lines; int horz_line_ofs = double_vert ? double_line_ofs : 0; int xc = (x0 + x3) / 2; int x1 = xc - horz_line_ofs; int x2 = xc + horz_line_ofs; bool shorten_x1_lines = start_of_line == RENDER_LINE_DOUBLE; bool shorten_x2_lines = end_of_line == RENDER_LINE_DOUBLE; bool shorten_xc_line = shorten_x1_lines && shorten_x2_lines; int vert_line_ofs = double_horz ? double_line_ofs : 0; int yc = (y0 + y3) / 2; int y1 = yc - vert_line_ofs; int y2 = yc + vert_line_ofs; if (!double_horz) horz_line (xr, x0, x1, x2, x3, yc, start_of_line, end_of_line, start_color, end_color, shorten_yc_line); else { horz_line (xr, x0, x1, x2, x3, y1, start_of_line, end_of_line, start_color, end_color, shorten_y1_lines); horz_line (xr, x0, x1, x2, x3, y2, start_of_line, end_of_line, start_color, end_color, shorten_y2_lines); } if (!double_vert) vert_line (xr, y0, y1, y2, y3, xc, top, bottom, top_color, bottom_color, shorten_xc_line); else { vert_line (xr, y0, y1, y2, y3, x1, top, bottom, top_color, bottom_color, shorten_x1_lines); vert_line (xr, y0, y1, y2, y3, x2, top, bottom, top_color, bottom_color, shorten_x2_lines); } } static void xr_measure_cell_width (void *xr_, const struct table_cell *cell, int *min_width, int *max_width) { struct xr_driver *xr = xr_; int bb[TABLE_N_AXES][2]; int clip[TABLE_N_AXES][2]; int h; bb[H][0] = 0; bb[H][1] = INT_MAX; bb[V][0] = 0; bb[V][1] = INT_MAX; clip[H][0] = clip[H][1] = clip[V][0] = clip[V][1] = 0; xr_layout_cell (xr, cell, bb, clip, max_width, &h, NULL); bb[H][1] = 1; xr_layout_cell (xr, cell, bb, clip, min_width, &h, NULL); if (*min_width > 0) *min_width += px_to_xr (cell->style->cell_style.margin[H][0] + cell->style->cell_style.margin[H][1]); if (*max_width > 0) *max_width += px_to_xr (cell->style->cell_style.margin[H][0] + cell->style->cell_style.margin[H][1]); } static int xr_measure_cell_height (void *xr_, const struct table_cell *cell, int width) { struct xr_driver *xr = xr_; int bb[TABLE_N_AXES][2]; int clip[TABLE_N_AXES][2]; int w, h; bb[H][0] = 0; bb[H][1] = width - px_to_xr (cell->style->cell_style.margin[H][0] + cell->style->cell_style.margin[H][1]); bb[V][0] = 0; bb[V][1] = INT_MAX; clip[H][0] = clip[H][1] = clip[V][0] = clip[V][1] = 0; xr_layout_cell (xr, cell, bb, clip, &w, &h, NULL); h += px_to_xr (cell->style->cell_style.margin[V][0] + cell->style->cell_style.margin[V][1]); return h; } static void xr_clip (struct xr_driver *, int clip[TABLE_N_AXES][2]); static void xr_draw_cell (void *xr_, const struct table_cell *cell, int color_idx, int bb[TABLE_N_AXES][2], int spill[TABLE_N_AXES][2], int clip[TABLE_N_AXES][2]) { struct xr_driver *xr = xr_; int w, h, brk; cairo_save (xr->cairo); int bg_clip[TABLE_N_AXES][2]; for (int axis = 0; axis < TABLE_N_AXES; axis++) { bg_clip[axis][0] = clip[axis][0]; if (bb[axis][0] == clip[axis][0]) bg_clip[axis][0] -= spill[axis][0]; bg_clip[axis][1] = clip[axis][1]; if (bb[axis][1] == clip[axis][1]) bg_clip[axis][1] += spill[axis][1]; } xr_clip (xr, bg_clip); set_source_rgba (xr->cairo, &cell->style->font_style.bg[color_idx]); fill_rectangle (xr, bb[H][0] - spill[H][0], bb[V][0] - spill[V][0], bb[H][1] + spill[H][1], bb[V][1] + spill[V][1]); cairo_restore (xr->cairo); cairo_save (xr->cairo); set_source_rgba (xr->cairo, &cell->style->font_style.fg[color_idx]); for (int axis = 0; axis < TABLE_N_AXES; axis++) { bb[axis][0] += px_to_xr (cell->style->cell_style.margin[axis][0]); bb[axis][1] -= px_to_xr (cell->style->cell_style.margin[axis][1]); } if (bb[H][0] < bb[H][1] && bb[V][0] < bb[V][1]) xr_layout_cell (xr, cell, bb, clip, &w, &h, &brk); cairo_restore (xr->cairo); } static int xr_adjust_break (void *xr_, const struct table_cell *cell, int width, int height) { struct xr_driver *xr = xr_; int bb[TABLE_N_AXES][2]; int clip[TABLE_N_AXES][2]; int w, h, brk; if (xr_measure_cell_height (xr_, cell, width) < height) return -1; bb[H][0] = 0; bb[H][1] = width - px_to_xr (cell->style->cell_style.margin[H][0] + cell->style->cell_style.margin[H][1]); if (bb[H][1] <= 0) return 0; bb[V][0] = 0; bb[V][1] = height - px_to_xr (cell->style->cell_style.margin[V][0] + cell->style->cell_style.margin[V][1]); clip[H][0] = clip[H][1] = clip[V][0] = clip[V][1] = 0; xr_layout_cell (xr, cell, bb, clip, &w, &h, &brk); return brk; } static void xr_clip (struct xr_driver *xr, int clip[TABLE_N_AXES][2]) { if (clip[H][1] != INT_MAX || clip[V][1] != INT_MAX) { double x0 = xr_to_pt (clip[H][0] + xr->x); double y0 = xr_to_pt (clip[V][0] + xr->y); double x1 = xr_to_pt (clip[H][1] + xr->x); double y1 = xr_to_pt (clip[V][1] + xr->y); cairo_rectangle (xr->cairo, x0, y0, x1 - x0, y1 - y0); cairo_clip (xr->cairo); } } static void add_attr (PangoAttrList *list, PangoAttribute *attr, guint start_index, guint end_index) { attr->start_index = start_index; attr->end_index = end_index; pango_attr_list_insert (list, attr); } static void markup_escape (struct string *out, unsigned int options, const char *in, size_t len) { if (!(options & TAB_MARKUP)) { ds_put_substring (out, ss_buffer (in, len == -1 ? strlen (in) : len)); return; } while (len-- > 0) { int c = *in++; switch (c) { case 0: return; case '&': ds_put_cstr (out, "&"); break; case '<': ds_put_cstr (out, "<"); break; case '>': ds_put_cstr (out, ">"); break; default: ds_put_byte (out, c); break; } } } static int get_layout_dimension (PangoLayout *layout, enum table_axis axis) { int size[TABLE_N_AXES]; pango_layout_get_size (layout, &size[H], &size[V]); return size[axis]; } static int xr_layout_cell_text (struct xr_driver *xr, const struct table_cell *cell, int bb[TABLE_N_AXES][2], int clip[TABLE_N_AXES][2], int *widthp, int *brk) { const struct font_style *font_style = &cell->style->font_style; const struct cell_style *cell_style = &cell->style->cell_style; unsigned int options = cell->options; enum table_axis X = options & TAB_ROTATE ? V : H; enum table_axis Y = !X; int R = options & TAB_ROTATE ? 0 : 1; struct xr_font *font = (options & TAB_FIX ? &xr->fonts[XR_FONT_FIXED] : &xr->fonts[XR_FONT_PROPORTIONAL]); struct xr_font local_font; if (font_style->typeface) { PangoFontDescription *desc = parse_font ( font_style->typeface, font_style->size ? font_style->size * 1000 * xr->font_scale : 10000, font_style->bold, font_style->italic); if (desc) { PangoLayout *layout = pango_cairo_create_layout (xr->cairo); pango_layout_set_font_description (layout, desc); local_font.desc = desc; local_font.layout = layout; font = &local_font; } } const char *text = cell->text; enum table_halign halign = table_halign_interpret ( cell_style->halign, cell->options & TAB_NUMERIC); if (cell_style->halign == TABLE_HALIGN_DECIMAL && !(options & TAB_ROTATE)) { int margin_adjustment = -px_to_xr (cell_style->decimal_offset); const char *decimal = strrchr (text, cell_style->decimal_char); if (decimal) { pango_layout_set_text (font->layout, decimal, strlen (decimal)); pango_layout_set_width (font->layout, -1); margin_adjustment += get_layout_dimension (font->layout, H); } if (margin_adjustment < 0) bb[H][1] += margin_adjustment; } struct string tmp = DS_EMPTY_INITIALIZER; PangoAttrList *attrs = NULL; /* Deal with an oddity of the Unicode line-breaking algorithm (or perhaps in Pango's implementation of it): it will break after a period or a comma that precedes a digit, e.g. in ".000" it will break after the period. This code looks for such a situation and inserts a U+2060 WORD JOINER to prevent the break. This isn't necessary when the decimal point is between two digits (e.g. "0.000" won't be broken) or when the display width is not limited so that word wrapping won't happen. It isn't necessary to look for more than one period or comma, as would happen with grouping like 1,234,567.89 or 1.234.567,89 because if groups are present then there will always be a digit on both sides of every period and comma. */ if (options & TAB_MARKUP) { PangoAttrList *new_attrs; char *new_text; if (pango_parse_markup (text, -1, 0, &new_attrs, &new_text, NULL, NULL)) { attrs = new_attrs; tmp.ss = ss_cstr (new_text); tmp.capacity = tmp.ss.length; } else { /* XXX should we report the error? */ ds_put_cstr (&tmp, text); } } else if (options & TAB_ROTATE || bb[H][1] != INT_MAX) { const char *decimal = text + strcspn (text, ".,"); if (decimal[0] && c_isdigit (decimal[1]) && (decimal == text || !c_isdigit (decimal[-1]))) { ds_extend (&tmp, strlen (text) + 16); markup_escape (&tmp, options, text, decimal - text + 1); ds_put_unichar (&tmp, 0x2060 /* U+2060 WORD JOINER */); markup_escape (&tmp, options, decimal + 1, -1); } } if (font_style->underline) { if (!attrs) attrs = pango_attr_list_new (); pango_attr_list_insert (attrs, pango_attr_underline_new ( PANGO_UNDERLINE_SINGLE)); } if (cell->n_footnotes || cell->n_subscripts || cell->superscript) { /* If we haven't already put TEXT into tmp, do it now. */ if (ds_is_empty (&tmp)) { ds_extend (&tmp, strlen (text) + 16); markup_escape (&tmp, options, text, -1); } size_t subscript_ofs = ds_length (&tmp); for (size_t i = 0; i < cell->n_subscripts; i++) { if (i) ds_put_byte (&tmp, ','); ds_put_cstr (&tmp, cell->subscripts[i]); } size_t superscript_ofs = ds_length (&tmp); if (cell->superscript) ds_put_cstr (&tmp, cell->superscript); size_t footnote_ofs = ds_length (&tmp); for (size_t i = 0; i < cell->n_footnotes; i++) { if (i) ds_put_byte (&tmp, ','); ds_put_cstr (&tmp, cell->footnotes[i]->marker); } /* Allow footnote markers to occupy the right margin. That way, numbers in the column are still aligned. */ if (cell->n_footnotes && halign == TABLE_HALIGN_RIGHT) { /* Measure the width of the footnote marker, so we know how much we need to make room for. */ pango_layout_set_text (font->layout, ds_cstr (&tmp) + footnote_ofs, ds_length (&tmp) - footnote_ofs); PangoAttrList *fn_attrs = pango_attr_list_new (); pango_attr_list_insert ( fn_attrs, pango_attr_scale_new (PANGO_SCALE_SMALL)); pango_attr_list_insert (fn_attrs, pango_attr_rise_new (3000)); pango_layout_set_attributes (font->layout, fn_attrs); pango_attr_list_unref (fn_attrs); int footnote_width = get_layout_dimension (font->layout, X); /* Bound the adjustment by the width of the right margin. */ int right_margin = px_to_xr (cell_style->margin[X][R]); int footnote_adjustment = MIN (footnote_width, right_margin); /* Adjust the bounding box. */ if (options & TAB_ROTATE) footnote_adjustment = -footnote_adjustment; bb[X][R] += footnote_adjustment; /* Clean up. */ pango_layout_set_attributes (font->layout, NULL); } /* Set attributes. */ if (!attrs) attrs = pango_attr_list_new (); add_attr (attrs, pango_attr_font_desc_new (font->desc), subscript_ofs, PANGO_ATTR_INDEX_TO_TEXT_END); add_attr (attrs, pango_attr_scale_new (PANGO_SCALE_SMALL), subscript_ofs, PANGO_ATTR_INDEX_TO_TEXT_END); if (cell->n_subscripts) add_attr (attrs, pango_attr_rise_new (-3000), subscript_ofs, superscript_ofs - subscript_ofs); if (cell->superscript || cell->n_footnotes) add_attr (attrs, pango_attr_rise_new (3000), superscript_ofs, PANGO_ATTR_INDEX_TO_TEXT_END); } /* Set the attributes, if any. */ if (attrs) { pango_layout_set_attributes (font->layout, attrs); pango_attr_list_unref (attrs); } /* Set the text. */ if (ds_is_empty (&tmp)) pango_layout_set_text (font->layout, text, -1); else pango_layout_set_text (font->layout, ds_cstr (&tmp), ds_length (&tmp)); ds_destroy (&tmp); pango_layout_set_alignment (font->layout, (halign == TABLE_HALIGN_RIGHT ? PANGO_ALIGN_RIGHT : halign == TABLE_HALIGN_LEFT ? PANGO_ALIGN_LEFT : PANGO_ALIGN_CENTER)); pango_layout_set_width ( font->layout, bb[X][1] == INT_MAX ? -1 : xr_to_pango (bb[X][1] - bb[X][0])); pango_layout_set_wrap (font->layout, PANGO_WRAP_WORD); if (clip[H][0] != clip[H][1]) { cairo_save (xr->cairo); if (!(options & TAB_ROTATE)) xr_clip (xr, clip); if (options & TAB_ROTATE) { cairo_translate (xr->cairo, xr_to_pt (bb[H][0] + xr->x), xr_to_pt (bb[V][1] + xr->y)); cairo_rotate (xr->cairo, -M_PI_2); } else cairo_translate (xr->cairo, xr_to_pt (bb[H][0] + xr->x), xr_to_pt (bb[V][0] + xr->y)); pango_cairo_show_layout (xr->cairo, font->layout); /* If enabled, this draws a blue rectangle around the extents of each line of text, which can be rather useful for debugging layout issues. */ if (0) { PangoLayoutIter *iter; iter = pango_layout_get_iter (font->layout); do { PangoRectangle extents; pango_layout_iter_get_line_extents (iter, &extents, NULL); cairo_save (xr->cairo); cairo_set_source_rgb (xr->cairo, 1, 0, 0); dump_rectangle (xr, pango_to_xr (extents.x) - xr->x, pango_to_xr (extents.y) - xr->y, pango_to_xr (extents.x + extents.width) - xr->x, pango_to_xr (extents.y + extents.height) - xr->y); cairo_restore (xr->cairo); } while (pango_layout_iter_next_line (iter)); pango_layout_iter_free (iter); } cairo_restore (xr->cairo); } int size[TABLE_N_AXES]; pango_layout_get_size (font->layout, &size[H], &size[V]); int w = pango_to_xr (size[X]); int h = pango_to_xr (size[Y]); if (w > *widthp) *widthp = w; if (bb[V][0] + h >= bb[V][1] && !(options & TAB_ROTATE)) { PangoLayoutIter *iter; int best = 0; /* Choose a breakpoint between lines instead of in the middle of one. */ iter = pango_layout_get_iter (font->layout); do { PangoRectangle extents; int y0, y1; int bottom; pango_layout_iter_get_line_extents (iter, NULL, &extents); pango_layout_iter_get_line_yrange (iter, &y0, &y1); extents.x = pango_to_xr (extents.x); extents.y = pango_to_xr (y0); extents.width = pango_to_xr (extents.width); extents.height = pango_to_xr (y1 - y0); bottom = bb[V][0] + extents.y + extents.height; if (bottom < bb[V][1]) { if (brk && clip[H][0] != clip[H][1]) best = bottom; if (brk) *brk = bottom; } else break; } while (pango_layout_iter_next_line (iter)); pango_layout_iter_free (iter); /* If enabled, draws a green line across the chosen breakpoint, which can be useful for debugging issues with breaking. */ if (0) { if (best && !xr->nest) dump_line (xr, -xr->left_margin, best, xr->width + xr->right_margin, best, RENDER_LINE_SINGLE, &(struct cell_color) CELL_COLOR (0, 255, 0)); } } pango_layout_set_attributes (font->layout, NULL); if (font == &local_font) { g_object_unref (G_OBJECT (font->layout)); pango_font_description_free (font->desc); } return h; } static void xr_layout_cell (struct xr_driver *xr, const struct table_cell *cell, int bb[TABLE_N_AXES][2], int clip[TABLE_N_AXES][2], int *width, int *height, int *brk) { *width = 0; *height = 0; /* If enabled, draws a blue rectangle around the cell extents, which can be useful for debugging layout. */ if (0) { if (clip[H][0] != clip[H][1]) { int offset = (xr->nest) * XR_POINT; cairo_save (xr->cairo); cairo_set_source_rgb (xr->cairo, 0, 0, 1); dump_rectangle (xr, bb[H][0] + offset, bb[V][0] + offset, bb[H][1] - offset, bb[V][1] - offset); cairo_restore (xr->cairo); } } if (brk) *brk = bb[V][0]; *height = xr_layout_cell_text (xr, cell, bb, clip, width, brk); } struct output_driver_factory pdf_driver_factory = { "pdf", "pspp.pdf", xr_pdf_create }; struct output_driver_factory ps_driver_factory = { "ps", "pspp.ps", xr_ps_create }; struct output_driver_factory svg_driver_factory = { "svg", "pspp.svg", xr_svg_create }; static const struct output_driver_class cairo_driver_class = { "cairo", xr_destroy, xr_submit, xr_flush, }; /* GUI rendering helpers. */ struct xr_rendering { struct output_item *item; /* Table items. */ struct render_pager *p; struct xr_driver *xr; }; #define CHART_WIDTH 500 #define CHART_HEIGHT 375 struct xr_driver * xr_driver_create (cairo_t *cairo, struct string_map *options) { struct xr_driver *xr = xr_allocate ("cairo", 0, options, 1.0); xr_set_cairo (xr, cairo); return xr; } /* Destroy XR, which should have been created with xr_driver_create(). Any cairo_t added to XR is not destroyed, because it is owned by the client. */ void xr_driver_destroy (struct xr_driver *xr) { if (xr != NULL) { xr->cairo = NULL; output_driver_destroy (&xr->driver); } } static struct xr_rendering * xr_rendering_create_text (struct xr_driver *xr, const char *text, cairo_t *cr) { struct table_item *table_item; struct xr_rendering *r; table_item = table_item_create (table_from_string (text), NULL, NULL); r = xr_rendering_create (xr, &table_item->output_item, cr); table_item_unref (table_item); return r; } void xr_rendering_apply_options (struct xr_rendering *xr, struct string_map *o) { if (is_table_item (xr->item)) apply_options (xr->xr, o); } struct xr_rendering * xr_rendering_create (struct xr_driver *xr, const struct output_item *item, cairo_t *cr) { struct xr_rendering *r = NULL; if (is_text_item (item)) r = xr_rendering_create_text (xr, text_item_get_text (to_text_item (item)), cr); else if (is_message_item (item)) { const struct message_item *message_item = to_message_item (item); char *s = msg_to_string (message_item_get_msg (message_item)); r = xr_rendering_create_text (xr, s, cr); free (s); } else if (is_table_item (item)) { r = xzalloc (sizeof *r); r->item = output_item_ref (item); r->xr = xr; xr_set_cairo (xr, cr); r->p = render_pager_create (xr->params, to_table_item (item)); } else if (is_chart_item (item)) { r = xzalloc (sizeof *r); r->item = output_item_ref (item); } else if (is_group_open_item (item)) r = xr_rendering_create_text (xr, to_group_open_item (item)->command_name, cr); return r; } void xr_rendering_destroy (struct xr_rendering *r) { if (r) { output_item_unref (r->item); render_pager_destroy (r->p); free (r); } } void xr_rendering_measure (const struct xr_rendering *r, int *wp, int *hp) { int w, h; if (is_table_item (r->item)) { w = render_pager_get_size (r->p, H) / XR_POINT; h = render_pager_get_size (r->p, V) / XR_POINT; } else { w = CHART_WIDTH; h = CHART_HEIGHT; } if (wp) *wp = w; if (hp) *hp = h; } static void xr_draw_chart (const struct chart_item *, cairo_t *, double x, double y, double width, double height); /* Draws onto CR */ void xr_rendering_draw (struct xr_rendering *r, cairo_t *cr, int x0, int y0, int x1, int y1) { if (is_table_item (r->item)) { struct xr_driver *xr = r->xr; xr_set_cairo (xr, cr); render_pager_draw_region (r->p, x0 * XR_POINT, y0 * XR_POINT, (x1 - x0) * XR_POINT, (y1 - y0) * XR_POINT); } else xr_draw_chart (to_chart_item (r->item), cr, 0, 0, CHART_WIDTH, CHART_HEIGHT); } static void xr_draw_chart (const struct chart_item *chart_item, cairo_t *cr, double x, double y, double width, double height) { struct xrchart_geometry geom; cairo_save (cr); cairo_translate (cr, x, y + height); cairo_scale (cr, 1.0, -1.0); xrchart_geometry_init (cr, &geom, width, height); if (is_boxplot (chart_item)) xrchart_draw_boxplot (chart_item, cr, &geom); else if (is_histogram_chart (chart_item)) xrchart_draw_histogram (chart_item, cr, &geom); else if (is_np_plot_chart (chart_item)) xrchart_draw_np_plot (chart_item, cr, &geom); else if (is_piechart (chart_item)) xrchart_draw_piechart (chart_item, cr, &geom); else if (is_barchart (chart_item)) xrchart_draw_barchart (chart_item, cr, &geom); else if (is_roc_chart (chart_item)) xrchart_draw_roc (chart_item, cr, &geom); else if (is_scree (chart_item)) xrchart_draw_scree (chart_item, cr, &geom); else if (is_spreadlevel_plot_chart (chart_item)) xrchart_draw_spreadlevel (chart_item, cr, &geom); else if (is_scatterplot_chart (chart_item)) xrchart_draw_scatterplot (chart_item, cr, &geom); else NOT_REACHED (); xrchart_geometry_free (cr, &geom); cairo_restore (cr); } char * xr_draw_png_chart (const struct chart_item *item, const char *file_name_template, int number, const struct cell_color *fg, const struct cell_color *bg) { const int width = 640; const int length = 480; cairo_surface_t *surface; cairo_status_t status; const char *number_pos; char *file_name; cairo_t *cr; number_pos = strchr (file_name_template, '#'); if (number_pos != NULL) file_name = xasprintf ("%.*s%d%s", (int) (number_pos - file_name_template), file_name_template, number, number_pos + 1); else file_name = xstrdup (file_name_template); surface = cairo_image_surface_create (CAIRO_FORMAT_RGB24, width, length); cr = cairo_create (surface); cairo_set_source_rgb (cr, bg->r / 255.0, bg->g / 255.0, bg->b / 255.0); cairo_paint (cr); cairo_set_source_rgb (cr, fg->r / 255.0, fg->g / 255.0, fg->b / 255.0); xr_draw_chart (item, cr, 0.0, 0.0, width, length); status = cairo_surface_write_to_png (surface, file_name); if (status != CAIRO_STATUS_SUCCESS) msg (ME, _("error writing output file `%s': %s"), file_name, cairo_status_to_string (status)); cairo_destroy (cr); cairo_surface_destroy (surface); return file_name; } struct xr_table_state { struct xr_render_fsm fsm; struct render_pager *p; }; static bool xr_table_render (struct xr_render_fsm *fsm, struct xr_driver *xr) { struct xr_table_state *ts = UP_CAST (fsm, struct xr_table_state, fsm); while (render_pager_has_next (ts->p)) { int used; used = render_pager_draw_next (ts->p, xr->length - xr->y); if (!used) { assert (xr->y > 0); return true; } else xr->y += used; } return false; } static void xr_table_destroy (struct xr_render_fsm *fsm) { struct xr_table_state *ts = UP_CAST (fsm, struct xr_table_state, fsm); render_pager_destroy (ts->p); free (ts); } static struct xr_render_fsm * xr_render_table (struct xr_driver *xr, struct table_item *table_item) { struct xr_table_state *ts; ts = xmalloc (sizeof *ts); ts->fsm.render = xr_table_render; ts->fsm.destroy = xr_table_destroy; if (xr->y > 0) xr->y += xr->char_height; ts->p = render_pager_create (xr->params, table_item); table_item_unref (table_item); return &ts->fsm; } struct xr_chart_state { struct xr_render_fsm fsm; struct chart_item *chart_item; }; static bool xr_chart_render (struct xr_render_fsm *fsm, struct xr_driver *xr) { struct xr_chart_state *cs = UP_CAST (fsm, struct xr_chart_state, fsm); const int chart_height = 0.8 * (xr->length < xr->width ? xr->length : xr->width); if (xr->y > xr->length - chart_height) return true; if (xr->cairo != NULL) { xr_draw_chart (cs->chart_item, xr->cairo, 0.0, xr_to_pt (xr->y), xr_to_pt (xr->width), xr_to_pt (chart_height)); } xr->y += chart_height; return false; } static void xr_chart_destroy (struct xr_render_fsm *fsm) { struct xr_chart_state *cs = UP_CAST (fsm, struct xr_chart_state, fsm); chart_item_unref (cs->chart_item); free (cs); } static struct xr_render_fsm * xr_render_chart (const struct chart_item *chart_item) { struct xr_chart_state *cs; cs = xmalloc (sizeof *cs); cs->fsm.render = xr_chart_render; cs->fsm.destroy = xr_chart_destroy; cs->chart_item = chart_item_ref (chart_item); return &cs->fsm; } static bool xr_eject_render (struct xr_render_fsm *fsm UNUSED, struct xr_driver *xr) { return xr->y > 0; } static void xr_eject_destroy (struct xr_render_fsm *fsm UNUSED) { /* Nothing to do. */ } static struct xr_render_fsm * xr_render_eject (void) { static struct xr_render_fsm eject_renderer = { xr_eject_render, xr_eject_destroy }; return &eject_renderer; } static struct xr_render_fsm * xr_render_text (struct xr_driver *xr, const struct text_item *text_item) { enum text_item_type type = text_item_get_type (text_item); const char *text = text_item_get_text (text_item); switch (type) { case TEXT_ITEM_PAGE_TITLE: string_map_replace (&xr->heading_vars, "PageTitle", text); break; case TEXT_ITEM_EJECT_PAGE: if (xr->y > 0) return xr_render_eject (); break; default: return xr_render_table ( xr, text_item_to_table_item (text_item_ref (text_item))); } return NULL; } static struct xr_render_fsm * xr_render_message (struct xr_driver *xr, const struct message_item *message_item) { char *s = msg_to_string (message_item_get_msg (message_item)); struct text_item *item = text_item_create (TEXT_ITEM_LOG, s); free (s); return xr_render_table (xr, text_item_to_table_item (item)); } static struct xr_render_fsm * xr_render_output_item (struct xr_driver *xr, const struct output_item *output_item) { if (is_table_item (output_item)) return xr_render_table (xr, table_item_ref (to_table_item (output_item))); else if (is_chart_item (output_item)) return xr_render_chart (to_chart_item (output_item)); else if (is_text_item (output_item)) return xr_render_text (xr, to_text_item (output_item)); else if (is_message_item (output_item)) return xr_render_message (xr, to_message_item (output_item)); else return NULL; } pspp-1.4.1/src/output/measure.c0000644000175000017500000002100213320146056016042 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 1997-9, 2000, 2007, 2009, 2010, 2011, 2012, 2014, 2016 Free Software Foundation, Inc. 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 3 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, see . */ #include #include "output/measure.h" #include #include #include #include #if HAVE_LC_PAPER #include #endif #include #include #include "libpspp/str.h" #include "gl/c-strcase.h" #include "libpspp/message.h" #include "gettext.h" #define _(msgid) gettext (msgid) static double parse_unit (const char *); static bool parse_paper_size (const char *, int *h, int *v); static bool get_standard_paper_size (struct substring name, int *h, int *v); static bool read_paper_conf (const char *file_name, int *h, int *v); static bool get_default_paper_size (int *h, int *v); /* Determines the size of a dimensional measurement and returns the size in units of 1/72000". Units are assumed to be millimeters unless otherwise specified. Returns -1 on error. */ int measure_dimension (const char *dimen) { double raw, factor; char *tail; /* Number. */ raw = c_strtod (dimen, &tail); if (raw < 0.0) goto syntax_error; /* Unit. */ factor = parse_unit (tail); if (factor == 0.0) goto syntax_error; return raw * factor; syntax_error: msg (ME, _("`%s' is not a valid length."), dimen); return -1; } /* Stores the dimensions, in 1/72000" units, of paper identified by SIZE into *H and *V. SIZE can be the name of a kind of paper ("a4", "letter", ...) or a pair of dimensions ("210x297", "8.5x11in", ...). Returns true on success, false on failure. On failure, *H and *V are set for A4 paper. */ bool measure_paper (const char *size, int *h, int *v) { struct substring s; bool ok; s = ss_cstr (size); ss_trim (&s, ss_cstr (CC_SPACES)); if (ss_is_empty (s)) { /* Treat empty string as default paper size. */ ok = get_default_paper_size (h, v); } else if (isdigit (ss_first (s))) { /* Treat string that starts with digit as explicit size. */ ok = parse_paper_size (size, h, v); if (!ok) msg (ME, _("syntax error in paper size `%s'"), size); } else { /* Check against standard paper sizes. */ ok = get_standard_paper_size (s, h, v); } /* Default to A4 on error. */ if (!ok) { *h = 210 * (72000 / 25.4); *v = 297 * (72000 / 25.4); } return ok; } /* Parses UNIT as a dimensional unit. Returns the multiplicative factor needed to change a quantity measured in that unit into 1/72000" units. If UNIT is empty, it is treated as millimeters. If the unit is unrecognized, returns 0. */ static double parse_unit (const char *unit) { struct unit { char name[3]; double factor; }; static const struct unit units[] = { {"pt", 72000 / 72}, {"pc", 72000 / 72 * 12.0}, {"in", 72000}, {"cm", 72000 / 2.54}, {"mm", 72000 / 25.4}, {"", 72000 / 25.4}, }; const struct unit *p; unit += strspn (unit, CC_SPACES); for (p = units; p < units + sizeof units / sizeof *units; p++) if (!c_strcasecmp (unit, p->name)) return p->factor; return 0.0; } /* Stores the dimensions in 1/72000" units of paper identified by SIZE, which is of form `HORZ x VERT [UNIT]' where HORZ and VERT are numbers and UNIT is an optional unit of measurement, into *H and *V. Return true on success. */ static bool parse_paper_size (const char *size, int *h, int *v) { double raw_h, raw_v, factor; char *tail; /* Width. */ raw_h = c_strtod (size, &tail); if (raw_h <= 0.0) return false; /* Delimiter. */ tail += strspn (tail, CC_SPACES "x,"); /* Length. */ raw_v = c_strtod (tail, &tail); if (raw_v <= 0.0) return false; /* Unit. */ factor = parse_unit (tail); if (factor == 0.0) return false; *h = raw_h * factor + .5; *v = raw_v * factor + .5; return true; } static bool get_standard_paper_size (struct substring name, int *h, int *v) { static const char *sizes[][2] = { {"a0", "841 x 1189 mm"}, {"a1", "594 x 841 mm"}, {"a2", "420 x 594 mm"}, {"a3", "297 x 420 mm"}, {"a4", "210 x 297 mm"}, {"a5", "148 x 210 mm"}, {"b5", "176 x 250 mm"}, {"a6", "105 x 148 mm"}, {"a7", "74 x 105 mm"}, {"a8", "52 x 74 mm"}, {"a9", "37 x 52 mm"}, {"a10", "26 x 37 mm"}, {"b0", "1000 x 1414 mm"}, {"b1", "707 x 1000 mm"}, {"b2", "500 x 707 mm"}, {"b3", "353 x 500 mm"}, {"b4", "250 x 353 mm"}, {"letter", "612 x 792 pt"}, {"legal", "612 x 1008 pt"}, {"executive", "522 x 756 pt"}, {"note", "612 x 792 pt"}, {"11x17", "792 x 1224 pt"}, {"tabloid", "792 x 1224 pt"}, {"statement", "396 x 612 pt"}, {"halfletter", "396 x 612 pt"}, {"halfexecutive", "378 x 522 pt"}, {"folio", "612 x 936 pt"}, {"quarto", "610 x 780 pt"}, {"ledger", "1224 x 792 pt"}, {"archA", "648 x 864 pt"}, {"archB", "864 x 1296 pt"}, {"archC", "1296 x 1728 pt"}, {"archD", "1728 x 2592 pt"}, {"archE", "2592 x 3456 pt"}, {"flsa", "612 x 936 pt"}, {"flse", "612 x 936 pt"}, {"csheet", "1224 x 1584 pt"}, {"dsheet", "1584 x 2448 pt"}, {"esheet", "2448 x 3168 pt"}, }; size_t i; for (i = 0; i < sizeof sizes / sizeof *sizes; i++) if (ss_equals_case (ss_cstr (sizes[i][0]), name)) { bool ok = parse_paper_size (sizes[i][1], h, v); assert (ok); return ok; } msg (ME, _("unknown paper type `%.*s'"), (int) ss_length (name), ss_data (name)); return false; } /* Reads file FILE_NAME to find a paper size. Stores the dimensions, in 1/72000" units, into *H and *V. Returns true on success, false on failure. */ static bool read_paper_conf (const char *file_name, int *h, int *v) { struct string line = DS_EMPTY_INITIALIZER; int line_number = 0; FILE *file; file = fopen (file_name, "r"); if (file == NULL) { msg_error (errno, _("error opening input file `%s'"), file_name); return false; } for (;;) { struct substring name; if (!ds_read_config_line (&line, &line_number, file)) { if (ferror (file)) msg_error (errno, _("error reading file `%s'"), file_name); break; } name = ds_ss (&line); ss_trim (&name, ss_cstr (CC_SPACES)); if (!ss_is_empty (name)) { bool ok = get_standard_paper_size (name, h, v); fclose (file); ds_destroy (&line); return ok; } } fclose (file); ds_destroy (&line); msg (ME, _("file `%s' does not state a paper size"), file_name); return false; } /* The user didn't specify a paper size, so let's choose a default based on his environment. Stores the dimensions, in 1/72000" units, into *H and *V. Returns true on success, false on failure. */ static bool get_default_paper_size (int *h, int *v) { /* libpaper in Debian (and other distributions?) allows the paper size to be specified in $PAPERSIZE or in a file specified in $PAPERCONF. */ if (getenv ("PAPERSIZE") != NULL) return get_standard_paper_size (ss_cstr (getenv ("PAPERSIZE")), h, v); if (getenv ("PAPERCONF") != NULL) return read_paper_conf (getenv ("PAPERCONF"), h, v); #if HAVE_LC_PAPER /* LC_PAPER is a non-standard glibc extension. The (int)(intptr_t) cast is for 64 Bit Systems where intptr_t translates to 64 Bit long int but the upper 32 Bits have wrong values. The result from nl_langinfo is integer (32 Bit) */ *h = (int)(intptr_t) nl_langinfo(_NL_PAPER_WIDTH) * (72000 / 25.4); *v = (int)(intptr_t) nl_langinfo(_NL_PAPER_HEIGHT) * (72000 / 25.4); if (*h > 0 && *v > 0) return true; #endif /* libpaper defaults to /etc/papersize. */ if (0 == access ("/etc/papersize", R_OK)) return read_paper_conf ("/etc/papersize", h, v); /* Can't find a default. */ return false; } pspp-1.4.1/src/output/spv-driver.c0000644000175000017500000000702713602145300016507 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2019 Free Software Foundation, Inc. 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 3 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, see . */ #include #include "output/driver-provider.h" #include #include "data/file-handle-def.h" #include "libpspp/cast.h" #include "output/group-item.h" #include "output/page-setup-item.h" #include "output/table-item.h" #include "output/text-item.h" #include "output/spv/spv-writer.h" #include "gl/xalloc.h" #include "gettext.h" #define _(msgid) gettext (msgid) struct spv_driver { struct output_driver driver; struct spv_writer *writer; struct file_handle *handle; }; static const struct output_driver_class spv_driver_class; static struct spv_driver * spv_driver_cast (struct output_driver *driver) { assert (driver->class == &spv_driver_class); return UP_CAST (driver, struct spv_driver, driver); } static struct output_driver * spv_create (struct file_handle *fh, enum settings_output_devices device_type, struct string_map *o UNUSED) { struct output_driver *d; struct spv_driver *spv; spv = xzalloc (sizeof *spv); d = &spv->driver; spv->handle = fh; output_driver_init (&spv->driver, &spv_driver_class, fh_get_file_name (fh), device_type); char *error = spv_writer_open (fh_get_file_name (fh), &spv->writer); if (spv->writer == NULL) { msg (ME, "%s", error); goto error; } return d; error: fh_unref (fh); output_driver_destroy (d); return NULL; } static void spv_destroy (struct output_driver *driver) { struct spv_driver *spv = spv_driver_cast (driver); char *error = spv_writer_close (spv->writer); if (error) msg (ME, "%s", error); fh_unref (spv->handle); free (spv); } static void spv_submit (struct output_driver *driver, const struct output_item *output_item) { struct spv_driver *spv = spv_driver_cast (driver); if (is_group_open_item (output_item)) spv_writer_open_heading (spv->writer, to_group_open_item (output_item)->command_name, to_group_open_item (output_item)->command_name); else if (is_group_close_item (output_item)) spv_writer_close_heading (spv->writer); else if (is_table_item (output_item)) { const struct table_item *table_item = to_table_item (output_item); if (table_item->pt) spv_writer_put_table (spv->writer, table_item->pt); } else if (is_text_item (output_item)) spv_writer_put_text (spv->writer, to_text_item (output_item), output_get_command_name ()); else if (is_page_setup_item (output_item)) spv_writer_set_page_setup (spv->writer, to_page_setup_item (output_item)->page_setup); } struct output_driver_factory spv_driver_factory = { "spv", "pspp.spv", spv_create }; static const struct output_driver_class spv_driver_class = { "spv", spv_destroy, spv_submit, NULL, }; pspp-1.4.1/src/output/message-item.c0000644000175000017500000000334213433403043016765 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2010 Free Sonftware Foundation, Inc. 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 3 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, see . */ #include #include "output/message-item.h" #include #include "libpspp/message.h" #include "output/driver.h" #include "output/output-item-provider.h" #include "gl/xalloc.h" struct message_item * message_item_create (const struct msg *msg) { struct message_item *item; item = xmalloc (sizeof *msg); output_item_init (&item->output_item, &message_item_class); item->msg = msg_dup (msg); return item; } const struct msg * message_item_get_msg (const struct message_item *item) { return item->msg; } static void message_item_destroy (struct output_item *output_item) { struct message_item *item = to_message_item (output_item); msg_destroy (item->msg); free (item); } /* Submits ITEM to the configured output drivers, and transfers ownership to the output subsystem. */ void message_item_submit (struct message_item *item) { output_submit (&item->output_item); } const struct output_item_class message_item_class = { "message", message_item_destroy, }; pspp-1.4.1/src/output/driver.c0000644000175000017500000004141113670210420015675 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 1997-9, 2000, 2007, 2009, 2010, 2011, 2012, 2014, 2019 Free Software Foundation, Inc. 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 3 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, see . */ #include #include "output/driver.h" #include "output/driver-provider.h" #include #include #include #include #include #include #include #include #include "data/file-handle-def.h" #include "data/settings.h" #include "libpspp/array.h" #include "libpspp/assertion.h" #include "libpspp/i18n.h" #include "libpspp/message.h" #include "libpspp/llx.h" #include "libpspp/string-map.h" #include "libpspp/string-set.h" #include "libpspp/str.h" #include "output/group-item.h" #include "output/message-item.h" #include "output/output-item.h" #include "output/text-item.h" #include "gl/error.h" #include "gl/xalloc.h" #include "gl/xmemdup0.h" #include "gettext.h" #define _(msgid) gettext (msgid) struct output_engine { struct ll ll; /* Node for this engine. */ struct llx_list drivers; /* Contains "struct output_driver"s. */ struct string deferred_text; /* Output text being accumulated. */ enum text_item_type deferred_type; /* Type of text being accumulated. */ char *command_name; /* Name of command being processed. */ char *title, *subtitle; /* Components of page title. */ /* Output grouping stack. TEXT_ITEM_GROUP_OPEN pushes a group on the stack and TEXT_ITEM_GROUP_CLOSE pops one off. */ char **groups; /* Command names of nested sections. */ size_t n_groups; size_t allocated_groups; struct string_map heading_vars; }; static struct ll_list engine_stack = LL_INITIALIZER (engine_stack); static const struct output_driver_factory *factories[]; static struct output_engine * engine_stack_top (void) { struct ll *head = ll_head (&engine_stack); if (ll_is_empty (&engine_stack)) return NULL; return ll_data (head, struct output_engine, ll); } static void put_strftime (const char *key, const char *format, const struct tm *tm, struct string_map *vars) { if (!string_map_find (vars, key)) { char value[128]; strftime (value, sizeof value, format, tm); string_map_insert (vars, key, value); } } void output_engine_push (void) { struct output_engine *e = xzalloc (sizeof (*e)); llx_init (&e->drivers); ds_init_empty (&e->deferred_text); string_map_init (&e->heading_vars); time_t t = time (NULL); const struct tm *tm = localtime (&t); put_strftime ("Date", "%x", tm, &e->heading_vars); put_strftime ("Time", "%X", tm, &e->heading_vars); ll_push_head (&engine_stack, &e->ll); } void output_engine_pop (void) { struct ll *head = ll_pop_head (&engine_stack); struct output_engine *e =ll_data (head, struct output_engine, ll); while (!llx_is_empty (&e->drivers)) { struct output_driver *d = llx_pop_head (&e->drivers, &llx_malloc_mgr); output_driver_destroy (d); } ds_destroy (&e->deferred_text); free (e->command_name); free (e->title); free (e->subtitle); for (size_t i = 0; i < e->n_groups; i++) free (e->groups[i]); free (e->groups); string_map_destroy (&e->heading_vars); free (e); } void output_get_supported_formats (struct string_set *formats) { const struct output_driver_factory **fp; for (fp = factories; *fp != NULL; fp++) string_set_insert (formats, (*fp)->extension); } static void output_submit__ (struct output_engine *e, struct output_item *item) { struct llx *llx, *next; for (llx = llx_head (&e->drivers); llx != llx_null (&e->drivers); llx = next) { struct output_driver *d = llx_data (llx); enum settings_output_type type; next = llx_next (llx); if (is_message_item (item)) { const struct msg *m = message_item_get_msg (to_message_item (item)); if (m->severity == MSG_S_NOTE) type = SETTINGS_OUTPUT_NOTE; else type = SETTINGS_OUTPUT_ERROR; } else if (is_text_item (item) && text_item_get_type (to_text_item (item)) == TEXT_ITEM_SYNTAX) type = SETTINGS_OUTPUT_SYNTAX; else type = SETTINGS_OUTPUT_RESULT; if (settings_get_output_routing (type) & d->device_type) d->class->submit (d, item); } output_item_unref (item); } static void flush_deferred_text (struct output_engine *e) { if (!ds_is_empty (&e->deferred_text)) { char *text = ds_steal_cstr (&e->deferred_text); output_submit__ (e, text_item_super (text_item_create_nocopy ( e->deferred_type, text))); } } static bool defer_text (struct output_engine *e, struct output_item *item) { if (!is_text_item (item)) return false; struct text_item *text_item = to_text_item (item); if (text_item->markup) /* XXX */ return false; enum text_item_type type = text_item_get_type (text_item); if (type != TEXT_ITEM_SYNTAX && type != TEXT_ITEM_LOG) return false; if (!ds_is_empty (&e->deferred_text) && e->deferred_type != type) flush_deferred_text (e); e->deferred_type = type; if (!ds_is_empty (&e->deferred_text)) ds_put_byte (&e->deferred_text, '\n'); const char *text = text_item_get_text (text_item); ds_put_cstr (&e->deferred_text, text); output_item_unref (item); return true; } /* Submits ITEM to the configured output drivers, and transfers ownership to the output subsystem. */ void output_submit (struct output_item *item) { struct output_engine *e = engine_stack_top (); if (e == NULL) return; if (item == NULL) return; if (defer_text (e, item)) return; flush_deferred_text (e); if (is_group_open_item (item)) { const struct group_open_item *group_open_item = to_group_open_item (item); if (e->n_groups >= e->allocated_groups) e->groups = x2nrealloc (e->groups, &e->allocated_groups, sizeof *e->groups); e->groups[e->n_groups] = (group_open_item->command_name ? xstrdup (group_open_item->command_name) : NULL); e->n_groups++; } else if (is_group_close_item (item)) { assert (e->n_groups > 0); size_t idx = --e->n_groups; free (e->groups[idx]); if (idx >= 1 && idx <= 4) { char *key = xasprintf ("Head%zu", idx); free (string_map_find_and_delete (&e->heading_vars, key)); free (key); } } else if (is_text_item (item)) { const struct text_item *text_item = to_text_item (item); enum text_item_type type = text_item_get_type (text_item); const char *text = text_item_get_text (text_item); if (type == TEXT_ITEM_TITLE && e->n_groups >= 1 && e->n_groups <= 4) { char *key = xasprintf ("Head%zu", e->n_groups); string_map_replace (&e->heading_vars, key, text); free (key); } else if (type == TEXT_ITEM_PAGE_TITLE) string_map_replace (&e->heading_vars, "PageTitle", text); } output_submit__ (e, item); } /* Returns the name of the command currently being parsed, in all uppercase. The caller must free the returned value. Returns NULL if no command is being parsed. */ char * output_get_command_name (void) { struct output_engine *e = engine_stack_top (); if (e == NULL) return NULL; for (size_t i = e->n_groups; i-- > 0;) if (e->groups[i]) return utf8_to_upper (e->groups[i]); return NULL; } /* Flushes output to screen devices, so that the user can see output that doesn't fill up an entire page. */ void output_flush (void) { struct output_engine *e = engine_stack_top (); struct llx *llx; flush_deferred_text (e); for (llx = llx_head (&e->drivers); llx != llx_null (&e->drivers); llx = llx_next (llx)) { struct output_driver *d = llx_data (llx); if (d->device_type & SETTINGS_DEVICE_TERMINAL && d->class->flush != NULL) d->class->flush (d); } } static void output_set_title__ (struct output_engine *e, char **dst, const char *src) { free (*dst); *dst = src ? xstrdup (src) : NULL; char *page_title = (e->title && e->subtitle ? xasprintf ("%s\n%s", e->title, e->subtitle) : e->title ? xstrdup (e->title) : e->subtitle ? xstrdup (e->subtitle) : xzalloc (1)); text_item_submit (text_item_create_nocopy (TEXT_ITEM_PAGE_TITLE, page_title)); } void output_set_title (const char *title) { struct output_engine *e = engine_stack_top (); output_set_title__ (e, &e->title, title); } void output_set_subtitle (const char *subtitle) { struct output_engine *e = engine_stack_top (); output_set_title__ (e, &e->subtitle, subtitle); } void output_set_filename (const char *filename) { struct output_engine *e = engine_stack_top (); string_map_replace (&e->heading_vars, "Filename", filename); } size_t output_get_group_level (void) { struct output_engine *e = engine_stack_top (); return e->n_groups; } void output_driver_init (struct output_driver *driver, const struct output_driver_class *class, const char *name, enum settings_output_devices type) { driver->class = class; driver->name = xstrdup (name); driver->device_type = type; } void output_driver_destroy (struct output_driver *driver) { if (driver != NULL) { char *name = driver->name; if (output_driver_is_registered (driver)) output_driver_unregister (driver); if (driver->class->destroy) driver->class->destroy (driver); free (name); } } const char * output_driver_get_name (const struct output_driver *driver) { return driver->name; } static struct output_engine * output_driver_get_engine (const struct output_driver *driver) { struct output_engine *e; ll_for_each (e, struct output_engine, ll, &engine_stack) { if (llx_find (llx_head (&e->drivers), llx_null (&e->drivers), driver)) return e; } return NULL; } void output_driver_register (struct output_driver *driver) { struct output_engine *e = engine_stack_top (); assert (!output_driver_is_registered (driver)); llx_push_tail (&e->drivers, driver, &llx_malloc_mgr); } void output_driver_unregister (struct output_driver *driver) { struct output_engine *e = output_driver_get_engine (driver); assert (e != NULL); llx_remove (llx_find (llx_head (&e->drivers), llx_null (&e->drivers), driver), &llx_malloc_mgr); } bool output_driver_is_registered (const struct output_driver *driver) { return output_driver_get_engine (driver) != NULL; } extern const struct output_driver_factory txt_driver_factory; extern const struct output_driver_factory list_driver_factory; extern const struct output_driver_factory html_driver_factory; extern const struct output_driver_factory csv_driver_factory; extern const struct output_driver_factory odt_driver_factory; extern const struct output_driver_factory spv_driver_factory; #ifdef HAVE_CAIRO extern const struct output_driver_factory pdf_driver_factory; extern const struct output_driver_factory ps_driver_factory; extern const struct output_driver_factory svg_driver_factory; #endif static const struct output_driver_factory *factories[] = { &txt_driver_factory, &list_driver_factory, &html_driver_factory, &csv_driver_factory, &odt_driver_factory, &spv_driver_factory, #ifdef HAVE_CAIRO &pdf_driver_factory, &ps_driver_factory, &svg_driver_factory, #endif NULL }; static const struct output_driver_factory * find_factory (const char *format) { const struct output_driver_factory **fp; for (fp = factories; *fp != NULL; fp++) { const struct output_driver_factory *f = *fp; if (!strcmp (f->extension, format)) return f; } return &txt_driver_factory; } static enum settings_output_devices default_device_type (const char *file_name) { return (!strcmp (file_name, "-") ? SETTINGS_DEVICE_TERMINAL : SETTINGS_DEVICE_LISTING); } struct output_driver * output_driver_create (struct string_map *options) { enum settings_output_devices device_type; const struct output_driver_factory *f; struct output_driver *driver; char *device_string; char *file_name; char *format; format = string_map_find_and_delete (options, "format"); file_name = string_map_find_and_delete (options, "output-file"); if (format == NULL) { if (file_name != NULL) { const char *extension = strrchr (file_name, '.'); format = xstrdup (extension != NULL ? extension + 1 : ""); } else format = xstrdup ("txt"); } f = find_factory (format); if (file_name == NULL) file_name = xstrdup (f->default_file_name); /* XXX should use parse_enum(). */ device_string = string_map_find_and_delete (options, "device"); if (device_string == NULL || device_string[0] == '\0') device_type = default_device_type (file_name); else if (!strcmp (device_string, "terminal")) device_type = SETTINGS_DEVICE_TERMINAL; else if (!strcmp (device_string, "listing")) device_type = SETTINGS_DEVICE_LISTING; else { msg (MW, _("%s is not a valid device type (the choices are `%s' and `%s')"), device_string, "terminal", "listing"); device_type = default_device_type (file_name); } struct file_handle *fh = fh_create_file (NULL, file_name, NULL, fh_default_properties ()); driver = f->create (fh, device_type, options); if (driver != NULL) { const struct string_map_node *node; const char *key; STRING_MAP_FOR_EACH_KEY (key, node, options) msg (MW, _("%s: unknown option `%s'"), file_name, key); } string_map_clear (options); free (file_name); free (format); free (device_string); return driver; } void output_driver_parse_option (const char *option, struct string_map *options) { const char *equals = strchr (option, '='); if (equals == NULL) { error (0, 0, _("%s: output option missing `='"), option); return; } char *key = xmemdup0 (option, equals - option); if (string_map_contains (options, key)) { error (0, 0, _("%s: output option specified more than once"), key); free (key); return; } char *value = xmemdup0 (equals + 1, strlen (equals + 1)); string_map_insert_nocopy (options, key, value); } /* Extracts the actual text content from the given Pango MARKUP and returns it as as a malloc()'d string. */ char * output_get_text_from_markup (const char *markup) { xmlParserCtxt *parser = xmlCreatePushParserCtxt (NULL, NULL, NULL, 0, NULL); if (!parser) return xstrdup (markup); xmlParseChunk (parser, "", strlen (""), false); xmlParseChunk (parser, markup, strlen (markup), false); xmlParseChunk (parser, "", strlen (""), true); char *content = (parser->wellFormed ? CHAR_CAST (char *, xmlNodeGetContent (xmlDocGetRootElement (parser->myDoc))) : xstrdup (markup)); xmlFreeDoc (parser->myDoc); xmlFreeParserCtxt (parser); return content; } char * output_driver_substitute_heading_vars (const char *src, int page_number) { struct output_engine *e = engine_stack_top (); struct string dst = DS_EMPTY_INITIALIZER; ds_extend (&dst, strlen (src)); for (const char *p = src; *p;) { if (!strncmp (p, "&[", 6)) { if (page_number != INT_MIN) { const char *start = p + 6; const char *end = strchr (start, ']'); if (end) { const char *value = string_map_find__ (&e->heading_vars, start, end - start); if (value) ds_put_cstr (&dst, value); else if (ss_equals (ss_buffer (start, end - start), ss_cstr ("Page"))) ds_put_format (&dst, "%d", page_number); p = end + 1; continue; } } ds_put_cstr (&dst, "&"); p += 5; } else ds_put_byte (&dst, *p++); } return ds_steal_cstr (&dst); } pspp-1.4.1/src/output/html.c0000644000175000017500000004323513717773141015374 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 1997-9, 2000, 2009, 2010, 2011, 2012, 2013, 2014, 2017, 2020 Free Software Foundation, Inc. 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 3 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, see . */ #include #include #include #include #include #include #include #include #include "data/file-name.h" #include "data/file-handle-def.h" #include "libpspp/assertion.h" #include "libpspp/cast.h" #include "libpspp/compiler.h" #include "libpspp/i18n.h" #include "libpspp/message.h" #include "libpspp/version.h" #include "output/cairo.h" #include "output/chart-item.h" #include "output/driver-provider.h" #include "output/message-item.h" #include "output/options.h" #include "output/output-item-provider.h" #include "output/table-provider.h" #include "output/table-item.h" #include "output/text-item.h" #include "gl/minmax.h" #include "gl/xalloc.h" #include "gettext.h" #define _(msgid) gettext (msgid) struct html_driver { struct output_driver driver; #ifdef HAVE_CAIRO struct cell_color fg; struct cell_color bg; #endif struct file_handle *handle; char *chart_file_name; FILE *file; size_t chart_cnt; bool css; bool borders; }; static const struct output_driver_class html_driver_class; static void html_output_table (struct html_driver *, const struct table_item *); static void escape_string (FILE *file, const char *text, const char *space, const char *newline); static void print_title_tag (FILE *file, const char *name, const char *content); static struct html_driver * html_driver_cast (struct output_driver *driver) { assert (driver->class == &html_driver_class); return UP_CAST (driver, struct html_driver, driver); } static struct driver_option * opt (struct output_driver *d, struct string_map *options, const char *key, const char *default_value) { return driver_option_get (d, options, key, default_value); } static struct output_driver * html_create (struct file_handle *fh, enum settings_output_devices device_type, struct string_map *o) { struct output_driver *d; struct html_driver *html; html = xzalloc (sizeof *html); d = &html->driver; output_driver_init (&html->driver, &html_driver_class, fh_get_file_name (fh), device_type); html->css = parse_boolean (opt (d, o, "css", "true")); html->borders = parse_boolean (opt (d, o, "borders", "true")); html->handle = fh; html->chart_file_name = parse_chart_file_name (opt (d, o, "charts", fh_get_file_name (fh))); html->file = NULL; html->chart_cnt = 1; #ifdef HAVE_CAIRO parse_color (d, o, "background-color", "#FFFFFFFFFFFF", &html->bg); parse_color (d, o, "foreground-color", "#000000000000", &html->fg); #endif html->file = fn_open (html->handle, "w"); if (html->file == NULL) { msg_error (errno, _("error opening output file `%s'"), fh_get_file_name (html->handle)); goto error; } fputs ("\n", html->file); fprintf (html->file, "file, " lang=\"%s\"", ln); free (ln); fprintf (html->file, ">\n"); fputs ("\n", html->file); print_title_tag (html->file, "title", _("PSPP Output")); fprintf (html->file, "\n", version); fputs ("\n", html->file); if (html->css) { fputs ("\n", html->file); } fputs ("\n", html->file); fputs ("\n", html->file); return d; error: output_driver_destroy (d); return NULL; } /* Emits CONTENT to the output, escaping CONTENT as necessary for HTML. */ static void print_title_tag (FILE *file, const char *name, const char *content) { if (content != NULL) { fprintf (file, "<%s>", name); escape_string (file, content, " ", " - "); fprintf (file, "\n", name); } } static void html_destroy (struct output_driver *driver) { struct html_driver *html = html_driver_cast (driver); if (html->file != NULL) { fprintf (html->file, "\n" "\n" "\n"); fn_close (html->handle, html->file); } free (html->chart_file_name); fh_unref (html->handle); free (html); } static void html_submit (struct output_driver *driver, const struct output_item *output_item) { struct html_driver *html = html_driver_cast (driver); if (is_table_item (output_item)) { struct table_item *table_item = to_table_item (output_item); html_output_table (html, table_item); } #ifdef HAVE_CAIRO else if (is_chart_item (output_item) && html->chart_file_name != NULL) { struct chart_item *chart_item = to_chart_item (output_item); char *file_name; file_name = xr_draw_png_chart (chart_item, html->chart_file_name, html->chart_cnt++, &html->fg, &html->bg ); if (file_name != NULL) { const char *title = chart_item_get_title (chart_item); fprintf (html->file, "\"chart:", file_name, title ? title : _("No description")); free (file_name); } } #endif /* HAVE_CAIRO */ else if (is_text_item (output_item)) { struct text_item *text_item = to_text_item (output_item); const char *s = text_item_get_text (text_item); switch (text_item_get_type (text_item)) { case TEXT_ITEM_PAGE_TITLE: break; case TEXT_ITEM_TITLE: { int level = MIN (5, output_get_group_level ()) + 1; char tag[3] = { 'H', level + '1', '\0' }; print_title_tag (html->file, tag, s); } break; case TEXT_ITEM_SYNTAX: fprintf (html->file, "
");
          escape_string (html->file, s, " ", "
"); fprintf (html->file, "
\n"); break; case TEXT_ITEM_LOG: print_title_tag (html->file, "pre", s); /* should be

*/ break; case TEXT_ITEM_EJECT_PAGE: /* Nothing to do. */ break; } } else if (is_message_item (output_item)) { const struct message_item *message_item = to_message_item (output_item); char *s = msg_to_string (message_item_get_msg (message_item)); print_title_tag (html->file, "p", s); free (s); } } /* Write TEXT to file F, escaping characters as necessary for HTML. Spaces are replaced by SPACE, which should be " " or " " New-lines are replaced by NEWLINE, which might be "
" or "\n" or something else appropriate. */ static void escape_string (FILE *file, const char *text, const char *space, const char *newline) { for (;;) { char c = *text++; switch (c) { case 0: return; case '\n': fputs (newline, file); break; case '&': fputs ("&", file); break; case '<': fputs ("<", file); break; case '>': fputs (">", file); break; case ' ': fputs (space, file); break; case '"': fputs (""", file); break; default: putc (c, file); break; } } } static void escape_tag (FILE *file, const char *tag, const char *text, const char *space, const char *newline) { if (!text || !*text) return; fprintf (file, "<%s>", tag); escape_string (file, text, space, newline); fprintf (file, "", tag); } static const char * border_to_css (int border) { switch (border) { case TABLE_STROKE_NONE: return NULL; case TABLE_STROKE_SOLID: return "solid"; case TABLE_STROKE_DASHED: return "dashed"; case TABLE_STROKE_THICK: return "thick solid"; case TABLE_STROKE_THIN: return "thin solid"; case TABLE_STROKE_DOUBLE: return "double"; default: return NULL; } } struct css_style { FILE *file; int n_styles; }; static struct css_style * style_start (FILE *file) { struct css_style *cs = XMALLOC (struct css_style); cs->file = file; cs->n_styles = 0; fputs (" style=\"", file); return cs; } static void style_end (struct css_style *cs) { fputs ("\"", cs->file); free (cs); } static void put_style (struct css_style *st, const char *name, const char *value) { if (st->n_styles++ > 0) fputs ("; ", st->file); fprintf (st->file, "%s: %s", name, value); } static void put_border (struct css_style *st, int style, const char *border_name) { const char *css = border_to_css (style); if (css) { if (st->n_styles++ > 0) fputs ("; ", st->file); fprintf (st->file, "border-%s: %s", border_name, css); } } static void put_tfoot (struct html_driver *html, const struct table *t, bool *tfoot) { if (!*tfoot) { fputs ("\n", html->file); fputs ("\n", html->file); fprintf (html->file, "\n", table_nc (t)); *tfoot = true; } else fputs ("\n
", html->file); } static void html_put_footnote_markers (struct html_driver *html, const struct footnote **footnotes, size_t n_footnotes) { if (n_footnotes > 0) { fputs ("", html->file); for (size_t i = 0; i < n_footnotes; i++) { const struct footnote *f = footnotes[i]; if (i > 0) putc (',', html->file); escape_string (html->file, f->marker, " ", "
"); } fputs ("
", html->file); } } static void html_put_table_item_text (struct html_driver *html, const struct table_item_text *text) { escape_string (html->file, text->content, " ", "
"); html_put_footnote_markers (html, text->footnotes, text->n_footnotes); } static void html_put_table_item_layers (struct html_driver *html, const struct table_item_layers *layers) { for (size_t i = 0; i < layers->n_layers; i++) { if (i) fputs ("
\n", html->file); const struct table_item_layer *layer = &layers->layers[i]; escape_string (html->file, layer->content, " ", "
"); html_put_footnote_markers (html, layer->footnotes, layer->n_footnotes); } } static void html_output_table (struct html_driver *html, const struct table_item *item) { const struct table *t = table_item_get_table (item); bool tfoot = false; int y; fputs ("\n", html->file); const struct table_item_text *caption = table_item_get_caption (item); if (caption) { put_tfoot (html, t, &tfoot); html_put_table_item_text (html, caption); } const struct footnote **f; size_t n_footnotes = table_collect_footnotes (item, &f); for (size_t i = 0; i < n_footnotes; i++) { put_tfoot (html, t, &tfoot); escape_tag (html->file, "sup", f[i]->marker, " ", "
"); escape_string (html->file, f[i]->content, " ", "
"); } free (f); if (tfoot) { fputs ("\n", html->file); fputs ("\n", html->file); fputs ("\n", html->file); } const struct table_item_text *title = table_item_get_title (item); const struct table_item_layers *layers = table_item_get_layers (item); if (title || layers) { fputs ("\n", html->file); } fputs ("\n", html->file); for (y = 0; y < table_nr (t); y++) { int x; fputs ("\n", html->file); for (x = 0; x < table_nc (t);) { struct table_cell cell; const char *tag; table_get_cell (t, x, y, &cell); if (x != cell.d[TABLE_HORZ][0] || y != cell.d[TABLE_VERT][0]) goto next_1; /* output or . */ fprintf (html->file, "\n", tag); next_1: x = cell.d[TABLE_HORZ][1]; } fputs ("\n", html->file); } fputs ("\n", html->file); fputs ("
", html->file); if (title) html_put_table_item_text (html, title); if (title && layers) fputs ("
\n", html->file); if (layers) html_put_table_item_layers (html, layers); fputs ("
or tag. */ bool is_header = (y < table_ht (t) || y >= table_nr (t) - table_hb (t) || x < table_hl (t) || x >= table_nc (t) - table_hr (t)); tag = is_header ? "th" : "td"; fprintf (html->file, "<%s", tag); struct css_style *style = style_start (html->file); enum table_halign halign = table_halign_interpret ( cell.style->cell_style.halign, cell.options & TAB_NUMERIC); switch (halign) { case TABLE_HALIGN_RIGHT: put_style (style, "text-align", "right"); break; case TABLE_HALIGN_CENTER: put_style (style, "text-align", "center"); break; default: /* Do nothing */ break; } if (cell.style->cell_style.valign != TABLE_VALIGN_TOP) { put_style (style, "vertical-align", (cell.style->cell_style.valign == TABLE_VALIGN_BOTTOM ? "bottom" : "middle")); } int colspan = table_cell_colspan (&cell); int rowspan = table_cell_rowspan (&cell); if (html->borders) { /* Cell borders. */ struct cell_color color; int top = table_get_rule (t, TABLE_VERT, x, y, &color); put_border (style, top, "top"); if (y + rowspan == table_nr (t)) { int bottom = table_get_rule (t, TABLE_VERT, x, y + rowspan, &color); put_border (style, bottom, "bottom"); } int left = table_get_rule (t, TABLE_HORZ, x, y, &color); put_border (style, left, "left"); if (x + colspan == table_nc (t)) { int right = table_get_rule (t, TABLE_HORZ, x + colspan, y, &color); put_border (style, right, "right"); } } style_end (style); if (colspan > 1) fprintf (html->file, " colspan=\"%d\"", colspan); if (rowspan > 1) fprintf (html->file, " rowspan=\"%d\"", rowspan); putc ('>', html->file); /* Output cell contents. */ const char *s = cell.text; if (cell.options & TAB_FIX) escape_tag (html->file, "tt", s, " ", "
"); else { s += strspn (s, CC_SPACES); escape_string (html->file, s, " ", "
"); } if (cell.n_subscripts) { fputs ("", html->file); for (size_t i = 0; i < cell.n_subscripts; i++) { if (i) putc (',', html->file); escape_string (html->file, cell.subscripts[i], " ", "
"); } fputs ("
", html->file); } if (cell.superscript) escape_tag (html->file, "sup", cell.superscript, " ", "
"); html_put_footnote_markers (html, cell.footnotes, cell.n_footnotes); /* output
\n\n", html->file); } struct output_driver_factory html_driver_factory = { "html", "pspp.html", html_create }; static const struct output_driver_class html_driver_class = { "html", html_destroy, html_submit, NULL, }; pspp-1.4.1/src/output/text-item.h0000644000175000017500000000731113547776540016357 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2009, 2010, 2011 Free Sonftware Foundation, Inc. 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 3 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, see . */ #ifndef OUTPUT_TEXT_ITEM_H #define OUTPUT_TEXT_ITEM_H 1 /* Text items. A text item is a subclass of an output item (see output/output-item.h). A text item is just a text string. */ #include #include "libpspp/compiler.h" #include "output/output-item.h" enum text_item_type { TEXT_ITEM_PAGE_TITLE, /* TITLE and SUBTITLE commands. */ TEXT_ITEM_TITLE, /* Title. */ TEXT_ITEM_SYNTAX, /* Syntax printback logging. */ TEXT_ITEM_LOG, /* Other logging. */ TEXT_ITEM_EJECT_PAGE /* Eject page. */ }; const char *text_item_type_to_string (enum text_item_type); /* A text item. */ struct text_item { struct output_item output_item; char *text; /* The content. */ enum text_item_type type; /* Type. */ bool bold, italic, underline, markup; char *typeface; int size; }; struct text_item *text_item_create (enum text_item_type, const char *text); struct text_item *text_item_create_nocopy (enum text_item_type, char *text); struct text_item *text_item_create_format (enum text_item_type, const char *format, ...) PRINTF_FORMAT (2, 3); enum text_item_type text_item_get_type (const struct text_item *); const char *text_item_get_text (const struct text_item *); struct table_item *text_item_to_table_item (struct text_item *); /* This boilerplate for text_item, a subclass of output_item, was autogenerated by mk-class-boilerplate. */ #include #include "libpspp/cast.h" extern const struct output_item_class text_item_class; /* Returns true if SUPER is a text_item, otherwise false. */ static inline bool is_text_item (const struct output_item *super) { return super->class == &text_item_class; } /* Returns SUPER converted to text_item. SUPER must be a text_item, as reported by is_text_item. */ static inline struct text_item * to_text_item (const struct output_item *super) { assert (is_text_item (super)); return UP_CAST (super, struct text_item, output_item); } /* Returns INSTANCE converted to output_item. */ static inline struct output_item * text_item_super (const struct text_item *instance) { return CONST_CAST (struct output_item *, &instance->output_item); } /* Increments INSTANCE's reference count and returns INSTANCE. */ static inline struct text_item * text_item_ref (const struct text_item *instance) { return to_text_item (output_item_ref (&instance->output_item)); } /* Decrements INSTANCE's reference count, then destroys INSTANCE if the reference count is now zero. */ static inline void text_item_unref (struct text_item *instance) { output_item_unref (&instance->output_item); } /* Returns true if INSTANCE's reference count is greater than 1, false otherwise. */ static inline bool text_item_is_shared (const struct text_item *instance) { return output_item_is_shared (&instance->output_item); } void text_item_submit (struct text_item *); #endif /* output/text-item.h */ pspp-1.4.1/src/output/table-item.c0000644000175000017500000001514513602145300016431 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2009, 2011, 2014 Free Software Foundation, Inc. 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 3 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, see . */ #include #include "output/table-provider.h" #include #include "libpspp/assertion.h" #include "libpspp/cast.h" #include "output/driver.h" #include "output/output-item-provider.h" #include "output/pivot-table.h" #include "output/table-item.h" #include "gl/xalloc.h" struct table_item_text * table_item_text_create (const char *content) { if (!content) return NULL; struct table_item_text *text = xmalloc (sizeof *text); *text = (struct table_item_text) { .content = xstrdup (content) }; return text; } struct table_item_text * table_item_text_clone (const struct table_item_text *old) { if (!old) return NULL; struct table_item_text *new = xmalloc (sizeof *new); *new = (struct table_item_text) { .content = xstrdup (old->content), .footnotes = xmemdup (old->footnotes, old->n_footnotes * sizeof *old->footnotes), .n_footnotes = old->n_footnotes, .style = area_style_clone (NULL, old->style), }; return new; } void table_item_text_destroy (struct table_item_text *text) { if (text) { free (text->content); free (text->footnotes); area_style_free (text->style); free (text); } } void table_item_layer_copy (struct table_item_layer *dst, const struct table_item_layer *src) { dst->content = xstrdup (src->content); dst->footnotes = xmemdup (src->footnotes, src->n_footnotes * sizeof *src->footnotes); dst->n_footnotes = src->n_footnotes; } void table_item_layer_uninit (struct table_item_layer *layer) { if (layer) { free (layer->content); free (layer->footnotes); } } struct table_item_layers * table_item_layers_clone (const struct table_item_layers *old) { if (!old) return NULL; struct table_item_layers *new = xmalloc (sizeof *new); *new = (struct table_item_layers) { .layers = xnmalloc (old->n_layers, sizeof *new->layers), .n_layers = old->n_layers, .style = area_style_clone (NULL, old->style), }; for (size_t i = 0; i < new->n_layers; i++) table_item_layer_copy (&new->layers[i], &old->layers[i]); return new; } void table_item_layers_destroy (struct table_item_layers *layers) { if (layers) { for (size_t i = 0; i < layers->n_layers; i++) table_item_layer_uninit (&layers->layers[i]); free (layers->layers); area_style_free (layers->style); free (layers); } } /* Initializes ITEM as a table item for rendering TABLE. The new table item initially has the specified TITLE and CAPTION, which may each be NULL. The caller retains ownership of TITLE and CAPTION. */ struct table_item * table_item_create (struct table *table, const char *title, const char *caption) { struct table_item *item = xmalloc (sizeof *item); output_item_init (&item->output_item, &table_item_class); item->table = table; item->title = table_item_text_create (title); item->layers = NULL; item->caption = table_item_text_create (caption); item->pt = NULL; return item; } /* Returns the table contained by TABLE_ITEM. The caller must not modify or unref the returned table. */ const struct table * table_item_get_table (const struct table_item *table_item) { return table_item->table; } /* Returns ITEM's title, which is a null pointer if no title has been set. */ const struct table_item_text * table_item_get_title (const struct table_item *item) { return item->title; } /* Sets ITEM's title to TITLE, replacing any previous title. Specify NULL for TITLE to clear any title from ITEM. The caller retains ownership of TITLE. This function may only be used on a table_item that is unshared. */ void table_item_set_title (struct table_item *item, const struct table_item_text *title) { assert (!table_item_is_shared (item)); table_item_text_destroy (item->title); item->title = table_item_text_clone (title); } /* Returns ITEM's layers, which will be a null pointer if no layers have been set. */ const struct table_item_layers * table_item_get_layers (const struct table_item *item) { return item->layers; } /* Sets ITEM's layers to LAYERS, replacing any previous layers. Specify NULL for LAYERS to clear any layers from ITEM. The caller retains ownership of LAYERS. This function may only be used on a table_item that is unshared. */ void table_item_set_layers (struct table_item *item, const struct table_item_layers *layers) { assert (!table_item_is_shared (item)); table_item_layers_destroy (item->layers); item->layers = table_item_layers_clone (layers); } /* Returns ITEM's caption, which is a null pointer if no caption has been set. */ const struct table_item_text * table_item_get_caption (const struct table_item *item) { return item->caption; } /* Sets ITEM's caption to CAPTION, replacing any previous caption. Specify NULL for CAPTION to clear any caption from ITEM. The caller retains ownership of CAPTION. This function may only be used on a table_item that is unshared. */ void table_item_set_caption (struct table_item *item, const struct table_item_text *caption) { assert (!table_item_is_shared (item)); table_item_text_destroy (item->caption); item->caption = table_item_text_clone (caption); } /* Submits TABLE_ITEM to the configured output drivers, and transfers ownership to the output subsystem. */ void table_item_submit (struct table_item *table_item) { output_submit (&table_item->output_item); } static void table_item_destroy (struct output_item *output_item) { struct table_item *item = to_table_item (output_item); table_item_text_destroy (item->title); table_item_text_destroy (item->caption); table_item_layers_destroy (item->layers); pivot_table_unref (item->pt); table_unref (item->table); free (item); } const struct output_item_class table_item_class = { "table", table_item_destroy, }; pspp-1.4.1/src/output/chart-item.h0000644000175000017500000000614213320146056016453 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2009, 2011 Free Software Foundation, Inc. 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 3 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, see . */ #ifndef OUTPUT_CHART_ITEM_H #define OUTPUT_CHART_ITEM_H 1 /* Chart items. A chart item is a subclass of an output item (see output/output-item.h). A chart item is abstract. Every actual chart is a subclass of chart_item. */ #include #include "output/output-item.h" /* A chart item. The members of struct chart_item should not be accessed directly. Use one of the accessor functions defined below. */ struct chart_item { struct output_item output_item; /* Superclass */ const struct chart_item_class *class; /* Subclass. */ char *title; /* May be null if there is no title. */ }; const char *chart_item_get_title (const struct chart_item *); void chart_item_set_title (struct chart_item *, const char *); /* This boilerplate for chart_item, a subclass of output_item, was autogenerated by mk-class-boilerplate. */ #include #include "libpspp/cast.h" extern const struct output_item_class chart_item_class; /* Returns true if SUPER is a chart_item, otherwise false. */ static inline bool is_chart_item (const struct output_item *super) { return super->class == &chart_item_class; } /* Returns SUPER converted to chart_item. SUPER must be a chart_item, as reported by is_chart_item. */ static inline struct chart_item * to_chart_item (const struct output_item *super) { assert (is_chart_item (super)); return UP_CAST (super, struct chart_item, output_item); } /* Returns INSTANCE converted to output_item. */ static inline struct output_item * chart_item_super (const struct chart_item *instance) { return CONST_CAST (struct output_item *, &instance->output_item); } /* Increments INSTANCE's reference count and returns INSTANCE. */ static inline struct chart_item * chart_item_ref (const struct chart_item *instance) { return to_chart_item (output_item_ref (&instance->output_item)); } /* Decrements INSTANCE's reference count, then destroys INSTANCE if the reference count is now zero. */ static inline void chart_item_unref (struct chart_item *instance) { output_item_unref (&instance->output_item); } /* Returns true if INSTANCE's reference count is greater than 1, false otherwise. */ static inline bool chart_item_is_shared (const struct chart_item *instance) { return output_item_is_shared (&instance->output_item); } void chart_item_submit (struct chart_item *); #endif /* output/chart-item.h */ pspp-1.4.1/src/output/ascii.h0000644000175000017500000000206713412455327015516 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2011, 2012 Free Software Foundation, Inc. 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 3 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, see . */ #ifndef ASCII_H #define ASCII_H 1 struct output_driver; void ascii_test_write (struct output_driver *, const char *s, int x, int y, bool bold, bool underline); void ascii_test_set_length (struct output_driver *, int y, int length); void ascii_test_flush (struct output_driver *); #endif /* ascii.h */ pspp-1.4.1/src/output/options.h0000644000175000017500000000442713320146056016115 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 1997-9, 2000, 2007, 2009, 2010 Free Software Foundation, Inc. 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 3 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, see . */ #ifndef OUTPUT_OPTIONS_H #define OUTPUT_OPTIONS_H 1 /* Helper functions for driver option parsing. */ #include #include "libpspp/compiler.h" struct output_driver; struct string_map; /* An option being parsed. */ struct driver_option { char *driver_name; /* Driver's name, for use in error messages. */ char *name; /* Option name, for use in error messages. */ char *value; /* Value supplied by user (NULL if none). */ char *default_value; /* Default value supplied by driver. */ }; struct driver_option *driver_option_create (const char *driver_name, const char *name, const char *value, const char *default_value); struct driver_option *driver_option_get (struct output_driver *, struct string_map *, const char *name, const char *default_value); void driver_option_destroy (struct driver_option *); void parse_paper_size (struct driver_option *, int *h, int *v); bool parse_boolean (struct driver_option *); int parse_enum (struct driver_option *, ...) SENTINEL(0); int parse_int (struct driver_option *, int min_value, int max_value); int parse_dimension (struct driver_option *); char *parse_string (struct driver_option *); char *parse_chart_file_name (struct driver_option *); #endif /* output/options.h */ pspp-1.4.1/src/output/pivot-output.c0000644000175000017500000004565513700645725017135 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2018 Free Software Foundation, Inc. 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 3 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, see . */ #include #include #include "output/pivot-table.h" #include "data/settings.h" #include "libpspp/assertion.h" #include "libpspp/pool.h" #include "output/table.h" #include "output/table-item.h" #include "output/text-item.h" #include "output/table-provider.h" #include "gl/minmax.h" #include "gl/xalloc.h" #define H TABLE_HORZ #define V TABLE_VERT static const struct pivot_category * find_category (const struct pivot_dimension *d, int dim_index, const size_t *indexes, int row_ofs) { size_t index = indexes[dim_index]; assert (index < d->n_leaves); for (const struct pivot_category *c = d->presentation_leaves[index]; c; c = c->parent) { if (!row_ofs) return c; row_ofs -= 1 + c->extra_depth; if (row_ofs < 0) return NULL; } return NULL; } static struct area_style * area_style_override (struct pool *pool, const struct area_style *in, const struct cell_style *cell_, const struct font_style *font_) { const struct cell_style *cell = cell_ ? cell_ : &in->cell_style; const struct font_style *font = font_ ? font_ : &in->font_style; struct area_style *out = (pool ? pool_alloc (pool, sizeof *out) : xmalloc (sizeof *out)); *out = (struct area_style) { .cell_style.halign = cell->halign, .cell_style.valign = cell->valign, .cell_style.decimal_offset = cell->decimal_offset, .cell_style.margin[H][0] = cell->margin[H][0], .cell_style.margin[H][1] = cell->margin[H][1], .cell_style.margin[V][0] = cell->margin[V][0], .cell_style.margin[V][1] = cell->margin[V][1], .font_style.fg[0] = font->fg[0], .font_style.fg[1] = font->fg[1], .font_style.bg[0] = font->bg[0], .font_style.bg[1] = font->bg[1], .font_style.typeface = (font->typeface ? pool_strdup (pool, font->typeface) : NULL), .font_style.size = font->size, .font_style.bold = font->bold, .font_style.italic = font->italic, .font_style.underline = font->underline, .font_style.markup = font->markup, }; return out; } static void fill_cell (struct table *t, int x1, int y1, int x2, int y2, const struct area_style *style, int style_idx, const struct pivot_value *value, struct footnote **footnotes, enum settings_value_show show_values, enum settings_value_show show_variables, bool rotate_label) { struct string s = DS_EMPTY_INITIALIZER; int opts = style_idx << TAB_STYLE_SHIFT; if (value) { bool numeric = pivot_value_format_body (value, show_values, show_variables, &s); if (numeric) opts |= TAB_NUMERIC; if (value->font_style && value->font_style->markup) opts |= TAB_MARKUP; if (rotate_label) opts |= TAB_ROTATE; } table_joint_text (t, x1, y1, x2, y2, opts, ds_cstr (&s)); ds_destroy (&s); if (value) { if (value->cell_style || value->font_style) table_add_style (t, x1, y1, area_style_override (t->container, style, value->cell_style, value->font_style)); for (size_t i = 0; i < value->n_footnotes; i++) { struct footnote *f = footnotes[value->footnotes[i]->idx]; if (f) table_add_footnote (t, x1, y1, f); } if (value->n_subscripts) table_add_subscripts (t, x1, y1, value->subscripts, value->n_subscripts); } } static struct table_item_text * pivot_value_to_table_item_text (const struct pivot_value *value, const struct area_style *area, struct footnote **footnotes, enum settings_value_show show_values, enum settings_value_show show_variables) { if (!value) return NULL; struct string s = DS_EMPTY_INITIALIZER; pivot_value_format_body (value, show_values, show_variables, &s); struct table_item_text *text = xmalloc (sizeof *text); *text = (struct table_item_text) { .content = ds_steal_cstr (&s), .footnotes = xnmalloc (value->n_footnotes, sizeof *text->footnotes), .style = area_style_override ( NULL, area, value->cell_style, value->font_style), }; for (size_t i = 0; i < value->n_footnotes; i++) { struct footnote *f = footnotes[value->footnotes[i]->idx]; if (f) text->footnotes[text->n_footnotes++] = f; } return text; } static int get_table_rule (const struct table_border_style *styles, enum pivot_border style_idx) { return styles[style_idx].stroke | (style_idx << TAB_RULE_STYLE_SHIFT); } static void draw_line (struct table *t, const struct table_border_style *styles, enum pivot_border style_idx, enum table_axis axis, int a, int b0, int b1) { int rule = get_table_rule (styles, style_idx); if (axis == H) table_hline (t, rule, b0, b1, a); else table_vline (t, rule, a, b0, b1); } static void compose_headings (struct table *t, const struct pivot_axis *a_axis, enum table_axis a, const struct pivot_axis *b_axis, const struct table_border_style *borders, enum pivot_border dim_col_horz, enum pivot_border dim_col_vert, enum pivot_border cat_col_horz, enum pivot_border cat_col_vert, const size_t *column_enumeration, size_t n_columns, const struct area_style *label_style, int label_style_idx, const struct area_style *corner_style, struct footnote **footnotes, enum settings_value_show show_values, enum settings_value_show show_variables, bool rotate_inner_labels, bool rotate_outer_labels) { enum table_axis b = !a; int b_size = a_axis->label_depth; int a_ofs = b_axis->label_depth; if (!a_axis->n_dimensions || !n_columns || !b_size) return; int bottom_row = b_size - 1; const int stride = MAX (1, a_axis->n_dimensions); for (int dim_index = 0; dim_index < a_axis->n_dimensions; dim_index++) { const struct pivot_dimension *d = a_axis->dimensions[dim_index]; if (d->hide_all_labels) continue; for (int row_ofs = 0; row_ofs < d->label_depth; row_ofs++) { for (size_t x1 = 0; x1 < n_columns;) { const struct pivot_category *c = find_category ( d, dim_index, column_enumeration + x1 * stride, row_ofs); if (!c) { x1++; continue; } size_t x2; for (x2 = x1 + 1; x2 < n_columns; x2++) { const struct pivot_category *c2 = find_category ( d, dim_index, column_enumeration + x2 * stride, row_ofs); if (c != c2) break; } int y1 = bottom_row - row_ofs - c->extra_depth; int y2 = bottom_row - row_ofs + 1; bool is_outer_row = y1 == 0; bool is_inner_row = y2 == b_size; if (pivot_category_is_leaf (c) || c->show_label) { int bb[TABLE_N_AXES][2]; bb[a][0] = x1 + a_ofs; bb[a][1] = x2 + a_ofs - 1; bb[b][0] = y1; bb[b][1] = y2 - 1; bool rotate = ((rotate_inner_labels && is_inner_row) || (rotate_outer_labels && is_outer_row)); fill_cell (t, bb[H][0], bb[V][0], bb[H][1], bb[V][1], label_style, label_style_idx, c->name, footnotes, show_values, show_variables, rotate); if (pivot_category_is_leaf (c) && x2 + 1 <= n_columns) { enum pivot_border style = (y1 == 0 && a_axis->label_depth > d->label_depth ? dim_col_vert : cat_col_vert); draw_line (t, borders, style, b, x2 + a_ofs, y1, t->n[b] - 1); } if (pivot_category_is_leaf (c) && x1 > 0) { enum pivot_border style = (y1 == 0 && a_axis->label_depth > d->label_depth ? dim_col_vert : cat_col_vert); draw_line (t, borders, style, b, x1 + a_ofs, y1, t->n[b] - 1); } } if (c->parent && c->parent->show_label) draw_line (t, borders, cat_col_horz, a, y1, x1 + a_ofs, x2 + a_ofs - 1); x1 = x2; } } if (d->root->show_label_in_corner && a_ofs > 0) { int bb[TABLE_N_AXES][2]; bb[a][0] = a_ofs - 1; bb[a][1] = a_ofs - 1; bb[b][0] = bottom_row - d->label_depth + 1; bb[b][1] = bottom_row; fill_cell (t, bb[H][0], bb[V][0], bb[H][1], bb[V][1], corner_style, PIVOT_AREA_CORNER, d->root->name, footnotes, show_values, show_variables, false); } if (dim_index > 1) draw_line (t, borders, dim_col_horz, a, bottom_row + 1, a_ofs, t->n[a] - 1); bottom_row -= d->label_depth; } } static void pivot_table_submit_layer (const struct pivot_table *pt, const size_t *layer_indexes) { const size_t *pindexes[PIVOT_N_AXES] = { [PIVOT_AXIS_LAYER] = layer_indexes }; size_t body[TABLE_N_AXES]; size_t *column_enumeration = pivot_table_enumerate_axis ( pt, PIVOT_AXIS_COLUMN, layer_indexes, pt->omit_empty, &body[H]); size_t *row_enumeration = pivot_table_enumerate_axis ( pt, PIVOT_AXIS_ROW, layer_indexes, pt->omit_empty, &body[V]); int stub[TABLE_N_AXES] = { [H] = pt->axes[PIVOT_AXIS_ROW].label_depth, [V] = pt->axes[PIVOT_AXIS_COLUMN].label_depth, }; struct table *table = table_create (body[H] + stub[H], body[V] + stub[V], stub[H], 0, stub[V], 0); for (size_t i = 0; i < PIVOT_N_AREAS; i++) table->styles[i] = area_style_override (table->container, &pt->areas[i], NULL, NULL); for (size_t i = 0; i < PIVOT_N_BORDERS; i++) { const struct table_border_style *in = &pt->borders[i]; table->rule_colors[i] = pool_alloc (table->container, sizeof *table->rule_colors[i]); struct cell_color *out = table->rule_colors[i]; out->alpha = in->color.alpha; out->r = in->color.r; out->g = in->color.g; out->b = in->color.b; } struct footnote **footnotes = XCALLOC (pt->n_footnotes, struct footnote *); for (size_t i = 0; i < pt->n_footnotes; i++) { const struct pivot_footnote *pf = pt->footnotes[i]; if (!pf->show) continue; char *content = pivot_value_to_string (pf->content, pt->show_values, pt->show_variables); char *marker = pivot_value_to_string (pf->marker, pt->show_values, pt->show_variables); footnotes[i] = table_create_footnote ( table, i, content, marker, area_style_override (table->container, &pt->areas[PIVOT_AREA_FOOTER], pf->content->cell_style, pf->content->font_style)); free (marker); free (content); } compose_headings (table, &pt->axes[PIVOT_AXIS_COLUMN], H, &pt->axes[PIVOT_AXIS_ROW], pt->borders, PIVOT_BORDER_DIM_COL_HORZ, PIVOT_BORDER_DIM_COL_VERT, PIVOT_BORDER_CAT_COL_HORZ, PIVOT_BORDER_CAT_COL_VERT, column_enumeration, body[H], &pt->areas[PIVOT_AREA_COLUMN_LABELS], PIVOT_AREA_COLUMN_LABELS, &pt->areas[PIVOT_AREA_CORNER], footnotes, pt->show_values, pt->show_variables, pt->rotate_inner_column_labels, false); compose_headings (table, &pt->axes[PIVOT_AXIS_ROW], V, &pt->axes[PIVOT_AXIS_COLUMN], pt->borders, PIVOT_BORDER_DIM_ROW_VERT, PIVOT_BORDER_DIM_ROW_HORZ, PIVOT_BORDER_CAT_ROW_VERT, PIVOT_BORDER_CAT_ROW_HORZ, row_enumeration, body[V], &pt->areas[PIVOT_AREA_ROW_LABELS], PIVOT_AREA_ROW_LABELS, &pt->areas[PIVOT_AREA_CORNER], footnotes, pt->show_values, pt->show_variables, false, pt->rotate_outer_row_labels); size_t *dindexes = XCALLOC (pt->n_dimensions, size_t); size_t y = 0; PIVOT_ENUMERATION_FOR_EACH (pindexes[PIVOT_AXIS_ROW], row_enumeration, &pt->axes[PIVOT_AXIS_ROW]) { size_t x = 0; PIVOT_ENUMERATION_FOR_EACH (pindexes[PIVOT_AXIS_COLUMN], column_enumeration, &pt->axes[PIVOT_AXIS_COLUMN]) { pivot_table_convert_indexes_ptod (pt, pindexes, dindexes); const struct pivot_value *value = pivot_table_get (pt, dindexes); fill_cell (table, x + stub[H], y + stub[V], x + stub[H], y + stub[V], &pt->areas[PIVOT_AREA_DATA], PIVOT_AREA_DATA, value, footnotes, pt->show_values, pt->show_variables, false); x++; } y++; } free (dindexes); if (pt->corner_text && stub[H] && stub[V]) fill_cell (table, 0, 0, stub[H] - 1, stub[V] - 1, &pt->areas[PIVOT_AREA_CORNER], PIVOT_AREA_CORNER, pt->corner_text, footnotes, pt->show_values, pt->show_variables, false); if (table_nc (table) && table_nr (table)) { table_hline ( table, get_table_rule (pt->borders, PIVOT_BORDER_INNER_TOP), 0, table_nc (table) - 1, 0); table_hline ( table, get_table_rule (pt->borders, PIVOT_BORDER_INNER_BOTTOM), 0, table_nc (table) - 1, table_nr (table)); table_vline ( table, get_table_rule (pt->borders, PIVOT_BORDER_INNER_LEFT), 0, 0, table_nr (table) - 1); table_vline ( table, get_table_rule (pt->borders, PIVOT_BORDER_INNER_RIGHT), table_nc (table), 0, table_nr (table) - 1); if (stub[V]) table_hline ( table, get_table_rule (pt->borders, PIVOT_BORDER_DATA_TOP), 0, table_nc (table) - 1, stub[V]); if (stub[H]) table_vline ( table, get_table_rule (pt->borders, PIVOT_BORDER_DATA_LEFT), stub[H], 0, table_nr (table) - 1); } free (column_enumeration); free (row_enumeration); struct table_item *ti = table_item_create (table, NULL, NULL); if (pt->title) { struct table_item_text *title = pivot_value_to_table_item_text ( pt->title, &pt->areas[PIVOT_AREA_TITLE], footnotes, pt->show_values, pt->show_variables); table_item_set_title (ti, title); table_item_text_destroy (title); } const struct pivot_axis *layer_axis = &pt->axes[PIVOT_AXIS_LAYER]; struct table_item_layers *layers = NULL; for (size_t i = 0; i < layer_axis->n_dimensions; i++) { const struct pivot_dimension *d = layer_axis->dimensions[i]; if (d->n_leaves) { if (!layers) { layers = xzalloc (sizeof *layers); layers->style = area_style_override ( NULL, &pt->areas[PIVOT_AREA_LAYERS], NULL, NULL); layers->layers = xnmalloc (layer_axis->n_dimensions, sizeof *layers->layers); } const struct pivot_value *name = d->data_leaves[layer_indexes[i]]->name; struct table_item_layer *layer = &layers->layers[layers->n_layers++]; struct string s = DS_EMPTY_INITIALIZER; pivot_value_format_body (name, pt->show_values, pt->show_variables, &s); layer->content = ds_steal_cstr (&s); layer->n_footnotes = 0; layer->footnotes = xnmalloc (name->n_footnotes, sizeof *layer->footnotes); for (size_t i = 0; i < name->n_footnotes; i++) { struct footnote *f = footnotes[name->footnotes[i]->idx]; if (f) layer->footnotes[layer->n_footnotes++] = f; } } } if (layers) { table_item_set_layers (ti, layers); table_item_layers_destroy (layers); } if (pt->caption && pt->show_caption) { struct table_item_text *caption = pivot_value_to_table_item_text ( pt->caption, &pt->areas[PIVOT_AREA_CAPTION], footnotes, pt->show_values, pt->show_variables); table_item_set_caption (ti, caption); table_item_text_destroy (caption); } free (footnotes); ti->pt = pivot_table_ref (pt); table_item_submit (ti); } void pivot_table_submit (struct pivot_table *pt) { pivot_table_assign_label_depth (CONST_CAST (struct pivot_table *, pt)); int old_decimal = settings_get_decimal_char (FMT_COMMA); if (pt->decimal == '.' || pt->decimal == ',') settings_set_decimal_char (pt->decimal); if (pt->print_all_layers) { size_t *layer_indexes; PIVOT_AXIS_FOR_EACH (layer_indexes, &pt->axes[PIVOT_AXIS_LAYER]) { if (pt->paginate_layers) text_item_submit (text_item_create (TEXT_ITEM_EJECT_PAGE, "")); pivot_table_submit_layer (pt, layer_indexes); } } else pivot_table_submit_layer (pt, pt->current_layer); settings_set_decimal_char (old_decimal); pivot_table_unref (pt); } pspp-1.4.1/src/language/0000755000175000017500000000000013725012647014474 5ustar00blpblp00000000000000pspp-1.4.1/src/language/dictionary/0000755000175000017500000000000013725012647016641 5ustar00blpblp00000000000000pspp-1.4.1/src/language/dictionary/weight.c0000644000175000017500000000341613320146056020271 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 1997-9, 2000, 2010, 2011 Free Software Foundation, Inc. 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 3 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, see . */ #include #include #include "data/dataset.h" #include "data/dictionary.h" #include "data/variable.h" #include "language/command.h" #include "language/lexer/lexer.h" #include "language/lexer/variable-parser.h" #include "libpspp/message.h" #include "libpspp/str.h" #include "gettext.h" #define _(msgid) gettext (msgid) int cmd_weight (struct lexer *lexer, struct dataset *ds) { struct dictionary *dict = dataset_dict (ds); if (lex_match_id (lexer, "OFF")) dict_set_weight (dataset_dict (ds), NULL); else { struct variable *v; lex_match (lexer, T_BY); v = parse_variable (lexer, dict); if (!v) return CMD_CASCADING_FAILURE; if (var_is_alpha (v)) { msg (SE, _("The weighting variable must be numeric.")); return CMD_CASCADING_FAILURE; } if (dict_class_from_id (var_get_name (v)) == DC_SCRATCH) { msg (SE, _("The weighting variable may not be scratch.")); return CMD_CASCADING_FAILURE; } dict_set_weight (dict, v); } return CMD_SUCCESS; } pspp-1.4.1/src/language/dictionary/sys-file-info.c0000644000175000017500000007777213602145300021500 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 1997-9, 2000, 2006, 2009, 2010, 2011, 2012, 2013, 2014 Free Software Foundation, Inc. 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 3 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, see . */ #include #include #include #include #include #include "data/any-reader.h" #include "data/attributes.h" #include "data/casereader.h" #include "data/dataset.h" #include "data/dictionary.h" #include "data/file-handle-def.h" #include "data/format.h" #include "data/missing-values.h" #include "data/value-labels.h" #include "data/variable.h" #include "data/vector.h" #include "language/command.h" #include "language/data-io/file-handle.h" #include "language/lexer/lexer.h" #include "language/lexer/variable-parser.h" #include "libpspp/array.h" #include "libpspp/hash-functions.h" #include "libpspp/i18n.h" #include "libpspp/message.h" #include "libpspp/misc.h" #include "libpspp/pool.h" #include "libpspp/string-array.h" #include "output/pivot-table.h" #include "output/text-item.h" #include "output/table-item.h" #include "gl/count-one-bits.h" #include "gl/localcharset.h" #include "gl/intprops.h" #include "gl/minmax.h" #include "gl/xalloc.h" #include "gettext.h" #define _(msgid) gettext (msgid) #define N_(msgid) (msgid) /* Information to include in displaying a dictionary. */ enum { /* Variable table. */ DF_NAME = 1 << 0, DF_POSITION = 1 << 1, DF_LABEL = 1 << 2, DF_MEASUREMENT_LEVEL = 1 << 3, DF_ROLE = 1 << 4, DF_WIDTH = 1 << 5, DF_ALIGNMENT = 1 << 6, DF_PRINT_FORMAT = 1 << 7, DF_WRITE_FORMAT = 1 << 8, DF_MISSING_VALUES = 1 << 9, #define DF_ALL_VARIABLE ((1 << 10) - 1) /* Value labels table. */ DF_VALUE_LABELS = 1 << 10, /* Attribute table. */ DF_AT_ATTRIBUTES = 1 << 11, /* Attributes whose names begin with @. */ DF_ATTRIBUTES = 1 << 12, /* All other attributes. */ }; static void display_variables (const struct variable **, size_t, int flags); static void display_value_labels (const struct variable **, size_t); static void display_attributes (const struct attrset *, const struct variable **, size_t, int flags); static void report_encodings (const struct file_handle *, struct pool *, char **titles, bool *ids, char **strings, size_t n_strings); static char *get_documents_as_string (const struct dictionary *); static void add_row (struct pivot_table *table, const char *attribute, struct pivot_value *value) { int row = pivot_category_create_leaf (table->dimensions[0]->root, pivot_value_new_text (attribute)); if (value) pivot_table_put1 (table, row, value); } /* SYSFILE INFO utility. */ int cmd_sysfile_info (struct lexer *lexer, struct dataset *ds) { struct any_reader *any_reader; struct file_handle *h; struct dictionary *d; struct casereader *reader; struct any_read_info info; char *encoding; h = NULL; encoding = NULL; for (;;) { lex_match (lexer, T_SLASH); if (lex_match_id (lexer, "FILE") || lex_is_string (lexer)) { lex_match (lexer, T_EQUALS); fh_unref (h); h = fh_parse (lexer, FH_REF_FILE, NULL); if (h == NULL) goto error; } else if (lex_match_id (lexer, "ENCODING")) { lex_match (lexer, T_EQUALS); if (!lex_force_string (lexer)) goto error; free (encoding); encoding = ss_xstrdup (lex_tokss (lexer)); lex_get (lexer); } else break; } if (h == NULL) { lex_sbc_missing ("FILE"); goto error; } any_reader = any_reader_open (h); if (!any_reader) { free (encoding); return CMD_FAILURE; } if (encoding && !strcasecmp (encoding, "detect")) { char **titles, **strings; struct pool *pool; size_t n_strings; bool *ids; pool = pool_create (); n_strings = any_reader_get_strings (any_reader, pool, &titles, &ids, &strings); any_reader_close (any_reader); report_encodings (h, pool, titles, ids, strings, n_strings); fh_unref (h); pool_destroy (pool); free (encoding); return CMD_SUCCESS; } reader = any_reader_decode (any_reader, encoding, &d, &info); if (!reader) goto error; casereader_destroy (reader); struct pivot_table *table = pivot_table_create (N_("File Information")); pivot_dimension_create (table, PIVOT_AXIS_ROW, N_("Attribute")); add_row (table, N_("File"), pivot_value_new_user_text (fh_get_file_name (h), -1)); const char *label = dict_get_label (d); add_row (table, N_("Label"), label ? pivot_value_new_user_text (label, -1) : NULL); add_row (table, N_("Created"), pivot_value_new_user_text_nocopy ( xasprintf ("%s %s by %s", info.creation_date, info.creation_time, info.product))); if (info.product_ext) add_row (table, N_("Product"), pivot_value_new_user_text (info.product_ext, -1)); add_row (table, N_("Integer Format"), pivot_value_new_text ( info.integer_format == INTEGER_MSB_FIRST ? N_("Big Endian") : info.integer_format == INTEGER_LSB_FIRST ? N_("Little Endian") : N_("Unknown"))); add_row (table, N_("Real Format"), pivot_value_new_text ( info.float_format == FLOAT_IEEE_DOUBLE_LE ? N_("IEEE 754 LE.") : info.float_format == FLOAT_IEEE_DOUBLE_BE ? N_("IEEE 754 BE.") : info.float_format == FLOAT_VAX_D ? N_("VAX D.") : info.float_format == FLOAT_VAX_G ? N_("VAX G.") : info.float_format == FLOAT_Z_LONG ? N_("IBM 390 Hex Long.") : N_("Unknown"))); add_row (table, N_("Variables"), pivot_value_new_integer (dict_get_var_cnt (d))); add_row (table, N_("Cases"), (info.case_cnt == -1 ? pivot_value_new_text (N_("Unknown")) : pivot_value_new_integer (info.case_cnt))); add_row (table, N_("Type"), pivot_value_new_text (info.klass->name)); struct variable *weight_var = dict_get_weight (d); add_row (table, N_("Weight"), (weight_var ? pivot_value_new_variable (weight_var) : pivot_value_new_text (N_("Not weighted")))); add_row (table, N_("Compression"), (info.compression == ANY_COMP_NONE ? pivot_value_new_text (N_("None")) : pivot_value_new_user_text ( info.compression == ANY_COMP_SIMPLE ? "SAV" : "ZSAV", -1))); add_row (table, N_("Encoding"), pivot_value_new_user_text (dict_get_encoding (d), -1)); if (dict_get_document_line_cnt (d) > 0) add_row (table, N_("Documents"), pivot_value_new_user_text_nocopy (get_documents_as_string (d))); pivot_table_submit (table); size_t n_vars = dict_get_var_cnt (d); const struct variable **vars = xnmalloc (n_vars, sizeof *vars); for (size_t i = 0; i < dict_get_var_cnt (d); i++) vars[i] = dict_get_var (d, i); display_variables (vars, n_vars, DF_ALL_VARIABLE); display_value_labels (vars, n_vars); display_attributes (dict_get_attributes (dataset_dict (ds)), vars, n_vars, DF_ATTRIBUTES); free (vars); dict_unref (d); fh_unref (h); free (encoding); any_read_info_destroy (&info); return CMD_SUCCESS; error: fh_unref (h); free (encoding); return CMD_FAILURE; } /* DISPLAY utility. */ static void display_macros (void); static void display_documents (const struct dictionary *dict); static void display_vectors (const struct dictionary *dict, int sorted); int cmd_display (struct lexer *lexer, struct dataset *ds) { /* Whether to sort the list of variables alphabetically. */ int sorted; /* Variables to display. */ size_t n; const struct variable **vl; if (lex_match_id (lexer, "MACROS")) display_macros (); else if (lex_match_id (lexer, "DOCUMENTS")) display_documents (dataset_dict (ds)); else if (lex_match_id (lexer, "FILE")) { if (!lex_force_match_id (lexer, "LABEL")) return CMD_FAILURE; const char *label = dict_get_label (dataset_dict (ds)); struct pivot_table *table = pivot_table_create (N_("File Label")); pivot_dimension_create (table, PIVOT_AXIS_ROW, N_("Label"), N_("Label")); pivot_table_put1 (table, 0, (label ? pivot_value_new_user_text (label, -1) : pivot_value_new_text (N_("(none)")))); pivot_table_submit (table); } else { int flags; sorted = lex_match_id (lexer, "SORTED"); if (lex_match_id (lexer, "VECTORS")) { display_vectors (dataset_dict(ds), sorted); return CMD_SUCCESS; } else if (lex_match_id (lexer, "SCRATCH")) { dict_get_vars (dataset_dict (ds), &vl, &n, DC_ORDINARY); flags = DF_NAME; } else { struct subcommand { const char *name; int flags; }; static const struct subcommand subcommands[] = { {"@ATTRIBUTES", DF_ATTRIBUTES | DF_AT_ATTRIBUTES}, {"ATTRIBUTES", DF_ATTRIBUTES}, {"DICTIONARY", (DF_NAME | DF_POSITION | DF_LABEL | DF_MEASUREMENT_LEVEL | DF_ROLE | DF_WIDTH | DF_ALIGNMENT | DF_PRINT_FORMAT | DF_WRITE_FORMAT | DF_MISSING_VALUES | DF_VALUE_LABELS)}, {"INDEX", DF_NAME | DF_POSITION}, {"LABELS", DF_NAME | DF_POSITION | DF_LABEL}, {"NAMES", DF_NAME}, {"VARIABLES", (DF_NAME | DF_POSITION | DF_PRINT_FORMAT | DF_WRITE_FORMAT | DF_MISSING_VALUES)}, {NULL, 0}, }; const struct subcommand *sbc; struct dictionary *dict = dataset_dict (ds); flags = 0; for (sbc = subcommands; sbc->name != NULL; sbc++) if (lex_match_id (lexer, sbc->name)) { flags = sbc->flags; break; } lex_match (lexer, T_SLASH); lex_match_id (lexer, "VARIABLES"); lex_match (lexer, T_EQUALS); if (lex_token (lexer) != T_ENDCMD) { if (!parse_variables_const (lexer, dict, &vl, &n, PV_NONE)) { free (vl); return CMD_FAILURE; } } else dict_get_vars (dict, &vl, &n, 0); } if (n > 0) { sort (vl, n, sizeof *vl, (sorted ? compare_var_ptrs_by_name : compare_var_ptrs_by_dict_index), NULL); int variable_flags = flags & DF_ALL_VARIABLE; if (variable_flags) display_variables (vl, n, variable_flags); if (flags & DF_VALUE_LABELS) display_value_labels (vl, n); int attribute_flags = flags & (DF_ATTRIBUTES | DF_AT_ATTRIBUTES); if (attribute_flags) display_attributes (dict_get_attributes (dataset_dict (ds)), vl, n, attribute_flags); } else msg (SW, _("No variables to display.")); free (vl); } return CMD_SUCCESS; } static void display_macros (void) { msg (SW, _("Macros not supported.")); } static char * get_documents_as_string (const struct dictionary *dict) { const struct string_array *documents = dict_get_documents (dict); struct string s = DS_EMPTY_INITIALIZER; for (size_t i = 0; i < documents->n; i++) { if (i) ds_put_byte (&s, '\n'); ds_put_cstr (&s, documents->strings[i]); } return ds_steal_cstr (&s); } static void display_documents (const struct dictionary *dict) { struct pivot_table *table = pivot_table_create (N_("Documents")); struct pivot_dimension *d = pivot_dimension_create ( table, PIVOT_AXIS_COLUMN, N_("Documents"), N_("Document")); d->hide_all_labels = true; if (!dict_get_documents (dict)->n) pivot_table_put1 (table, 0, pivot_value_new_text (N_("(none)"))); else { char *docs = get_documents_as_string (dict); pivot_table_put1 (table, 0, pivot_value_new_user_text_nocopy (docs)); } pivot_table_submit (table); } static void display_variables (const struct variable **vl, size_t n, int flags) { struct pivot_table *table = pivot_table_create (N_("Variables")); struct pivot_dimension *attributes = pivot_dimension_create ( table, PIVOT_AXIS_COLUMN, N_("Attributes")); struct heading { int flag; const char *title; }; static const struct heading headings[] = { { DF_POSITION, N_("Position") }, { DF_LABEL, N_("Label") }, { DF_MEASUREMENT_LEVEL, N_("Measurement Level") }, { DF_ROLE, N_("Role") }, { DF_WIDTH, N_("Width") }, { DF_ALIGNMENT, N_("Alignment") }, { DF_PRINT_FORMAT, N_("Print Format") }, { DF_WRITE_FORMAT, N_("Write Format") }, { DF_MISSING_VALUES, N_("Missing Values") }, }; for (size_t i = 0; i < sizeof headings / sizeof *headings; i++) if (flags & headings[i].flag) pivot_category_create_leaf (attributes->root, pivot_value_new_text (headings[i].title)); struct pivot_dimension *names = pivot_dimension_create ( table, PIVOT_AXIS_ROW, N_("Name")); names->root->show_label = true; for (size_t i = 0; i < n; i++) { const struct variable *v = vl[i]; struct pivot_value *name = pivot_value_new_variable (v); name->variable.show = SETTINGS_VALUE_SHOW_VALUE; int row = pivot_category_create_leaf (names->root, name); int x = 0; if (flags & DF_POSITION) pivot_table_put2 (table, x++, row, pivot_value_new_integer ( var_get_dict_index (v) + 1)); if (flags & DF_LABEL) { const char *label = var_get_label (v); if (label) pivot_table_put2 (table, x, row, pivot_value_new_user_text (label, -1)); x++; } if (flags & DF_MEASUREMENT_LEVEL) pivot_table_put2 ( table, x++, row, pivot_value_new_text (measure_to_string (var_get_measure (v)))); if (flags & DF_ROLE) pivot_table_put2 ( table, x++, row, pivot_value_new_text (var_role_to_string (var_get_role (v)))); if (flags & DF_WIDTH) pivot_table_put2 ( table, x++, row, pivot_value_new_integer (var_get_display_width (v))); if (flags & DF_ALIGNMENT) pivot_table_put2 ( table, x++, row, pivot_value_new_text (alignment_to_string ( var_get_alignment (v)))); if (flags & DF_PRINT_FORMAT) { const struct fmt_spec *print = var_get_print_format (v); char s[FMT_STRING_LEN_MAX + 1]; pivot_table_put2 ( table, x++, row, pivot_value_new_user_text (fmt_to_string (print, s), -1)); } if (flags & DF_WRITE_FORMAT) { const struct fmt_spec *write = var_get_write_format (v); char s[FMT_STRING_LEN_MAX + 1]; pivot_table_put2 ( table, x++, row, pivot_value_new_user_text (fmt_to_string (write, s), -1)); } if (flags & DF_MISSING_VALUES) { char *s = mv_to_string (var_get_missing_values (v), var_get_encoding (v)); if (s) pivot_table_put2 ( table, x, row, pivot_value_new_user_text_nocopy (s)); x++; } } pivot_table_submit (table); } static bool any_value_labels (const struct variable **vars, size_t n_vars) { for (size_t i = 0; i < n_vars; i++) if (val_labs_count (var_get_value_labels (vars[i]))) return true; return false; } static void display_value_labels (const struct variable **vars, size_t n_vars) { if (!any_value_labels (vars, n_vars)) return; struct pivot_table *table = pivot_table_create (N_("Value Labels")); pivot_dimension_create (table, PIVOT_AXIS_COLUMN, N_("Label"), N_("Label")); struct pivot_dimension *values = pivot_dimension_create ( table, PIVOT_AXIS_ROW, N_("Variable Value")); values->root->show_label = true; struct pivot_footnote *missing_footnote = pivot_table_create_footnote ( table, pivot_value_new_text (N_("User-missing value"))); for (size_t i = 0; i < n_vars; i++) { const struct val_labs *val_labs = var_get_value_labels (vars[i]); size_t n_labels = val_labs_count (val_labs); if (!n_labels) continue; struct pivot_category *group = pivot_category_create_group__ ( values->root, pivot_value_new_variable (vars[i])); const struct val_lab **labels = val_labs_sorted (val_labs); for (size_t j = 0; j < n_labels; j++) { const struct val_lab *vl = labels[j]; struct pivot_value *value = pivot_value_new_var_value ( vars[i], &vl->value); if (value->type == PIVOT_VALUE_NUMERIC) value->numeric.show = SETTINGS_VALUE_SHOW_VALUE; else value->string.show = SETTINGS_VALUE_SHOW_VALUE; if (var_is_value_missing (vars[i], &vl->value, MV_USER)) pivot_value_add_footnote (value, missing_footnote); int row = pivot_category_create_leaf (group, value); struct pivot_value *label = pivot_value_new_var_value ( vars[i], &vl->value); char *escaped_label = xstrdup (val_lab_get_escaped_label (vl)); if (label->type == PIVOT_VALUE_NUMERIC) { free (label->numeric.value_label); label->numeric.value_label = escaped_label; label->numeric.show = SETTINGS_VALUE_SHOW_LABEL; } else { free (label->string.value_label); label->string.value_label = escaped_label; label->string.show = SETTINGS_VALUE_SHOW_LABEL; } pivot_table_put2 (table, 0, row, label); } free (labels); } pivot_table_submit (table); } static bool is_at_name (const char *name) { return name[0] == '@' || (name[0] == '$' && name[1] == '@'); } static size_t count_attributes (const struct attrset *set, int flags) { struct attrset_iterator i; struct attribute *attr; size_t n_attrs; n_attrs = 0; for (attr = attrset_first (set, &i); attr != NULL; attr = attrset_next (set, &i)) if (flags & DF_AT_ATTRIBUTES || !is_at_name (attribute_get_name (attr))) n_attrs += attribute_get_n_values (attr); return n_attrs; } static void display_attrset (struct pivot_table *table, struct pivot_value *set_name, const struct attrset *set, int flags) { size_t n_total = count_attributes (set, flags); if (!n_total) { pivot_value_destroy (set_name); return; } struct pivot_category *group = pivot_category_create_group__ ( table->dimensions[1]->root, set_name); size_t n_attrs = attrset_count (set); struct attribute **attrs = attrset_sorted (set); for (size_t i = 0; i < n_attrs; i++) { const struct attribute *attr = attrs[i]; const char *name = attribute_get_name (attr); if (!(flags & DF_AT_ATTRIBUTES) && is_at_name (name)) continue; size_t n_values = attribute_get_n_values (attr); for (size_t j = 0; j < n_values; j++) { int row = pivot_category_create_leaf ( group, (n_values > 1 ? pivot_value_new_user_text_nocopy (xasprintf ( "%s[%zu]", name, j + 1)) : pivot_value_new_user_text (name, -1))); pivot_table_put2 (table, 0, row, pivot_value_new_user_text ( attribute_get_value (attr, j), -1)); } } free (attrs); } static void display_attributes (const struct attrset *dict_attrset, const struct variable **vars, size_t n_vars, int flags) { struct pivot_table *table = pivot_table_create ( N_("Variable and Dataset Attributes")); pivot_dimension_create (table, PIVOT_AXIS_COLUMN, N_("Value"), N_("Value")); struct pivot_dimension *variables = pivot_dimension_create ( table, PIVOT_AXIS_ROW, N_("Variable and Name")); variables->root->show_label = true; display_attrset (table, pivot_value_new_text (N_("(dataset)")), dict_attrset, flags); for (size_t i = 0; i < n_vars; i++) display_attrset (table, pivot_value_new_variable (vars[i]), var_get_attributes (vars[i]), flags); if (pivot_table_is_empty (table)) pivot_table_unref (table); else pivot_table_submit (table); } /* Display a list of vectors. If SORTED is nonzero then they are sorted alphabetically. */ static void display_vectors (const struct dictionary *dict, int sorted) { size_t n_vectors = dict_get_vector_cnt (dict); if (n_vectors == 0) { msg (SW, _("No vectors defined.")); return; } const struct vector **vectors = xnmalloc (n_vectors, sizeof *vectors); for (size_t i = 0; i < n_vectors; i++) vectors[i] = dict_get_vector (dict, i); if (sorted) qsort (vectors, n_vectors, sizeof *vectors, compare_vector_ptrs_by_name); struct pivot_table *table = pivot_table_create (N_("Vectors")); pivot_dimension_create (table, PIVOT_AXIS_COLUMN, N_("Attributes"), N_("Variable"), N_("Print Format")); struct pivot_dimension *vector_dim = pivot_dimension_create ( table, PIVOT_AXIS_ROW, N_("Vector and Position")); vector_dim->root->show_label = true; for (size_t i = 0; i < n_vectors; i++) { const struct vector *vec = vectors[i]; struct pivot_category *group = pivot_category_create_group__ ( vector_dim->root, pivot_value_new_user_text ( vector_get_name (vectors[i]), -1)); for (size_t j = 0; j < vector_get_var_cnt (vec); j++) { struct variable *var = vector_get_var (vec, j); int row = pivot_category_create_leaf ( group, pivot_value_new_integer (j + 1)); pivot_table_put2 (table, 0, row, pivot_value_new_variable (var)); char fmt_string[FMT_STRING_LEN_MAX + 1]; fmt_to_string (var_get_print_format (var), fmt_string); pivot_table_put2 (table, 1, row, pivot_value_new_user_text (fmt_string, -1)); } } pivot_table_submit (table); free (vectors); } /* Encoding analysis. */ static const char *encoding_names[] = { /* These encodings are from http://encoding.spec.whatwg.org/, as retrieved February 2014. Encodings not supported by glibc and encodings relevant only to HTML have been removed. */ "utf-8", "windows-1252", "iso-8859-2", "iso-8859-3", "iso-8859-4", "iso-8859-5", "iso-8859-6", "iso-8859-7", "iso-8859-8", "iso-8859-10", "iso-8859-13", "iso-8859-14", "iso-8859-16", "macintosh", "windows-874", "windows-1250", "windows-1251", "windows-1253", "windows-1254", "windows-1255", "windows-1256", "windows-1257", "windows-1258", "koi8-r", "koi8-u", "ibm866", "gb18030", "big5", "euc-jp", "iso-2022-jp", "shift_jis", "euc-kr", /* Added by user request. */ "ibm850", "din_66003", }; #define N_ENCODING_NAMES (sizeof encoding_names / sizeof *encoding_names) struct encoding { uint64_t encodings; char **utf8_strings; unsigned int hash; }; static char ** recode_strings (struct pool *pool, char **strings, bool *ids, size_t n, const char *encoding) { char **utf8_strings; size_t i; utf8_strings = pool_alloc (pool, n * sizeof *utf8_strings); for (i = 0; i < n; i++) { struct substring utf8; int error; error = recode_pedantically ("UTF-8", encoding, ss_cstr (strings[i]), pool, &utf8); if (!error) { ss_rtrim (&utf8, ss_cstr (" ")); utf8.string[utf8.length] = '\0'; if (ids[i] && !id_is_plausible (utf8.string, false)) error = EINVAL; } if (error) return NULL; utf8_strings[i] = utf8.string; } return utf8_strings; } static struct encoding * find_duplicate_encoding (struct encoding *encodings, size_t n_encodings, char **utf8_strings, size_t n_strings, unsigned int hash) { struct encoding *e; for (e = encodings; e < &encodings[n_encodings]; e++) { int i; if (e->hash != hash) goto next_encoding; for (i = 0; i < n_strings; i++) if (strcmp (utf8_strings[i], e->utf8_strings[i])) goto next_encoding; return e; next_encoding:; } return NULL; } static bool all_equal (const struct encoding *encodings, size_t n_encodings, size_t string_idx) { const char *s0; size_t i; s0 = encodings[0].utf8_strings[string_idx]; for (i = 1; i < n_encodings; i++) if (strcmp (s0, encodings[i].utf8_strings[string_idx])) return false; return true; } static int equal_prefix (const struct encoding *encodings, size_t n_encodings, size_t string_idx) { const char *s0; size_t prefix; size_t i; s0 = encodings[0].utf8_strings[string_idx]; prefix = strlen (s0); for (i = 1; i < n_encodings; i++) { const char *si = encodings[i].utf8_strings[string_idx]; size_t j; for (j = 0; j < prefix; j++) if (s0[j] != si[j]) { prefix = j; if (!prefix) return 0; break; } } while (prefix > 0 && s0[prefix - 1] != ' ') prefix--; return prefix; } static int equal_suffix (const struct encoding *encodings, size_t n_encodings, size_t string_idx) { const char *s0; size_t s0_len; size_t suffix; size_t i; s0 = encodings[0].utf8_strings[string_idx]; s0_len = strlen (s0); suffix = s0_len; for (i = 1; i < n_encodings; i++) { const char *si = encodings[i].utf8_strings[string_idx]; size_t si_len = strlen (si); size_t j; if (si_len < suffix) suffix = si_len; for (j = 0; j < suffix; j++) if (s0[s0_len - j - 1] != si[si_len - j - 1]) { suffix = j; if (!suffix) return 0; break; } } while (suffix > 0 && s0[s0_len - suffix] != ' ') suffix--; return suffix; } static void report_encodings (const struct file_handle *h, struct pool *pool, char **titles, bool *ids, char **strings, size_t n_strings) { struct encoding encodings[N_ENCODING_NAMES]; size_t n_encodings, n_unique_strings; n_encodings = 0; for (size_t i = 0; i < N_ENCODING_NAMES; i++) { char **utf8_strings; struct encoding *e; unsigned int hash; utf8_strings = recode_strings (pool, strings, ids, n_strings, encoding_names[i]); if (!utf8_strings) continue; /* Hash utf8_strings. */ hash = 0; for (size_t j = 0; j < n_strings; j++) hash = hash_string (utf8_strings[j], hash); /* If there's a duplicate encoding, just mark it. */ e = find_duplicate_encoding (encodings, n_encodings, utf8_strings, n_strings, hash); if (e) { e->encodings |= UINT64_C (1) << i; continue; } e = &encodings[n_encodings++]; e->encodings = UINT64_C (1) << i; e->utf8_strings = utf8_strings; e->hash = hash; } if (!n_encodings) { msg (SW, _("No valid encodings found.")); return; } /* Table of valid encodings. */ struct pivot_table *table = pivot_table_create__ ( pivot_value_new_text_format (N_("Usable encodings for %s."), fh_get_name (h)), "Usable Encodings"); table->caption = pivot_value_new_text_format ( N_("Encodings that can successfully read %s (by specifying the encoding " "name on the GET command's ENCODING subcommand). Encodings that " "yield identical text are listed together."), fh_get_name (h)); pivot_dimension_create (table, PIVOT_AXIS_COLUMN, N_("Encodings"), N_("Encodings")); struct pivot_dimension *number = pivot_dimension_create__ ( table, PIVOT_AXIS_ROW, pivot_value_new_user_text ("#", -1)); number->root->show_label = true; for (size_t i = 0; i < n_encodings; i++) { struct string s = DS_EMPTY_INITIALIZER; for (size_t j = 0; j < 64; j++) if (encodings[i].encodings & (UINT64_C (1) << j)) ds_put_format (&s, "%s, ", encoding_names[j]); ds_chomp (&s, ss_cstr (", ")); int row = pivot_category_create_leaf (number->root, pivot_value_new_integer (i + 1)); pivot_table_put2 ( table, 0, row, pivot_value_new_user_text_nocopy (ds_steal_cstr (&s))); } pivot_table_submit (table); n_unique_strings = 0; for (size_t i = 0; i < n_strings; i++) if (!all_equal (encodings, n_encodings, i)) n_unique_strings++; if (!n_unique_strings) return; /* Table of alternative interpretations. */ table = pivot_table_create__ ( pivot_value_new_text_format (N_("%s Encoded Text Strings"), fh_get_name (h)), "Alternate Encoded Text Strings"); table->caption = pivot_value_new_text ( N_("Text strings in the file dictionary that the previously listed " "encodings interpret differently, along with the interpretations.")); pivot_dimension_create (table, PIVOT_AXIS_COLUMN, N_("Text"), N_("Text")); number = pivot_dimension_create__ (table, PIVOT_AXIS_ROW, pivot_value_new_user_text ("#", -1)); number->root->show_label = true; for (size_t i = 0; i < n_encodings; i++) pivot_category_create_leaf (number->root, pivot_value_new_integer (i + 1)); struct pivot_dimension *purpose = pivot_dimension_create ( table, PIVOT_AXIS_ROW, N_("Purpose")); purpose->root->show_label = true; for (size_t i = 0; i < n_strings; i++) if (!all_equal (encodings, n_encodings, i)) { int prefix = equal_prefix (encodings, n_encodings, i); int suffix = equal_suffix (encodings, n_encodings, i); int purpose_idx = pivot_category_create_leaf ( purpose->root, pivot_value_new_user_text (titles[i], -1)); for (size_t j = 0; j < n_encodings; j++) { const char *s = encodings[j].utf8_strings[i] + prefix; if (prefix || suffix) { size_t len = strlen (s) - suffix; struct string entry; ds_init_empty (&entry); if (prefix) ds_put_cstr (&entry, "..."); ds_put_substring (&entry, ss_buffer (s, len)); if (suffix) ds_put_cstr (&entry, "..."); pivot_table_put3 (table, 0, j, purpose_idx, pivot_value_new_user_text_nocopy ( ds_steal_cstr (&entry))); } else pivot_table_put3 (table, 0, j, purpose_idx, pivot_value_new_user_text (s, -1)); } } pivot_table_submit (table); } pspp-1.4.1/src/language/dictionary/attributes.c0000644000175000017500000001333613546443556021211 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2008, 2010, 2011 Free Software Foundation, Inc. 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 3 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, see . */ #include #include #include "data/attributes.h" #include "data/dataset.h" #include "data/dictionary.h" #include "data/variable.h" #include "language/command.h" #include "language/lexer/lexer.h" #include "language/lexer/variable-parser.h" #include "libpspp/message.h" #include "gl/xalloc.h" #include "gettext.h" #define _(msgid) gettext (msgid) static enum cmd_result parse_attributes (struct lexer *, const char *dict_encoding, struct attrset **, size_t n); /* Parses the DATAFILE ATTRIBUTE command. */ int cmd_datafile_attribute (struct lexer *lexer, struct dataset *ds) { struct dictionary *dict = dataset_dict (ds); struct attrset *set = dict_get_attributes (dict); return parse_attributes (lexer, dict_get_encoding (dict), &set, 1); } /* Parses the VARIABLE ATTRIBUTE command. */ int cmd_variable_attribute (struct lexer *lexer, struct dataset *ds) { struct dictionary *dict = dataset_dict (ds); const char *dict_encoding = dict_get_encoding (dict); do { struct variable **vars; struct attrset **sets; size_t n_vars, i; bool ok; if (!lex_force_match_id (lexer, "VARIABLES") || !lex_force_match (lexer, T_EQUALS) || !parse_variables (lexer, dict, &vars, &n_vars, PV_NONE)) return CMD_FAILURE; sets = xmalloc (n_vars * sizeof *sets); for (i = 0; i < n_vars; i++) sets[i] = var_get_attributes (vars[i]); ok = parse_attributes (lexer, dict_encoding, sets, n_vars); free (vars); free (sets); if (!ok) return CMD_FAILURE; } while (lex_match (lexer, T_SLASH)); return CMD_SUCCESS; } /* Parses an attribute name and verifies that it is valid in DICT_ENCODING, optionally followed by an index inside square brackets. Returns the attribute name or NULL if there was a parse error. Stores the index into *INDEX. */ static char * parse_attribute_name (struct lexer *lexer, const char *dict_encoding, size_t *index) { char *name; if (!lex_force_id (lexer) || !id_is_valid (lex_tokcstr (lexer), dict_encoding, true)) return NULL; name = xstrdup (lex_tokcstr (lexer)); lex_get (lexer); if (lex_match (lexer, T_LBRACK)) { if (!lex_force_int (lexer)) goto error; if (lex_integer (lexer) < 1 || lex_integer (lexer) > 65535) { msg (SE, _("Attribute array index must be between 1 and 65535.")); goto error; } *index = lex_integer (lexer); lex_get (lexer); if (!lex_force_match (lexer, T_RBRACK)) goto error; } else *index = 0; return name; error: free (name); return NULL; } static bool add_attribute (struct lexer *lexer, const char *dict_encoding, struct attrset **sets, size_t n) { const char *value; size_t index, i; char *name; name = parse_attribute_name (lexer, dict_encoding, &index); if (name == NULL) return false; if (!lex_force_match (lexer, T_LPAREN) || !lex_force_string (lexer)) { free (name); return false; } value = lex_tokcstr (lexer); for (i = 0; i < n; i++) { struct attribute *attr = attrset_lookup (sets[i], name); if (attr == NULL) { attr = attribute_create (name); attrset_add (sets[i], attr); } attribute_set_value (attr, index ? index - 1 : 0, value); } lex_get (lexer); free (name); return lex_force_match (lexer, T_RPAREN); } static bool delete_attribute (struct lexer *lexer, const char *dict_encoding, struct attrset **sets, size_t n) { size_t index, i; char *name; name = parse_attribute_name (lexer, dict_encoding, &index); if (name == NULL) return false; for (i = 0; i < n; i++) { struct attrset *set = sets[i]; if (index == 0) attrset_delete (set, name); else { struct attribute *attr = attrset_lookup (set, name); if (attr != NULL) { attribute_del_value (attr, index - 1); if (attribute_get_n_values (attr) == 0) attrset_delete (set, name); } } } free (name); return true; } static enum cmd_result parse_attributes (struct lexer *lexer, const char *dict_encoding, struct attrset **sets, size_t n) { enum { UNKNOWN, ADD, DELETE } command = UNKNOWN; do { if (lex_match_phrase (lexer, "ATTRIBUTE=")) command = ADD; else if (lex_match_phrase (lexer, "DELETE=")) command = DELETE; else if (command == UNKNOWN) { lex_error_expecting (lexer, "ATTRIBUTE=", "DELETE="); return CMD_FAILURE; } if (!(command == ADD ? add_attribute (lexer, dict_encoding, sets, n) : delete_attribute (lexer, dict_encoding, sets, n))) return CMD_FAILURE; } while (lex_token (lexer) != T_SLASH && lex_token (lexer) != T_ENDCMD); return CMD_SUCCESS; } pspp-1.4.1/src/language/dictionary/apply-dictionary.c0000644000175000017500000000741513507505260022300 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 1997-9, 2000, 2009, 2010, 2011, 2012, 2014, 2016 Free Software Foundation, Inc. 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 3 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, see . */ #include #include #include "data/any-reader.h" #include "data/casereader.h" #include "data/dataset.h" #include "data/dictionary.h" #include "data/file-handle-def.h" #include "data/missing-values.h" #include "data/value-labels.h" #include "data/variable.h" #include "language/command.h" #include "language/data-io/file-handle.h" #include "language/lexer/lexer.h" #include "libpspp/message.h" #include "libpspp/str.h" #include "gettext.h" #define _(msgid) gettext (msgid) /* Parses and executes APPLY DICTIONARY. */ int cmd_apply_dictionary (struct lexer *lexer, struct dataset *ds) { struct file_handle *handle; struct casereader *reader; struct dictionary *dict; int n_matched = 0; int i; lex_match_id (lexer, "FROM"); lex_match (lexer, T_EQUALS); handle = fh_parse (lexer, FH_REF_FILE, dataset_session (ds)); if (!handle) return CMD_FAILURE; reader = any_reader_open_and_decode (handle, NULL, &dict, NULL); fh_unref (handle); if (!reader) return CMD_FAILURE; casereader_destroy (reader); for (i = 0; i < dict_get_var_cnt (dict); i++) { const struct variable *s = dict_get_var (dict, i); struct variable *t = dict_lookup_var (dataset_dict (ds), var_get_name (s)); if (t == NULL) continue; n_matched++; if (var_get_type (s) != var_get_type (t)) { msg (SW, _("Variable %s is %s in target file, but %s in " "source file."), var_get_name (s), var_is_alpha (t) ? _("string") : _("numeric"), var_is_alpha (s) ? _("string") : _("numeric")); continue; } if (var_has_label (s)) var_set_label (t, var_get_label (s)); if (var_has_value_labels (s)) { const struct val_labs *value_labels = var_get_value_labels (s); if (val_labs_can_set_width (value_labels, var_get_width (t))) var_set_value_labels (t, value_labels); } if (var_has_missing_values (s)) { const struct missing_values *miss = var_get_missing_values (s); if (mv_is_resizable (miss, var_get_width (t))) var_set_missing_values (t, miss); } if (var_is_numeric (s)) { var_set_print_format (t, var_get_print_format (s)); var_set_write_format (t, var_get_write_format (s)); } if (var_has_attributes (s)) var_set_attributes (t, var_get_attributes (s)); } if (!n_matched) msg (SW, _("No matching variables found between the source " "and target files.")); /* Data file attributes. */ if (dict_has_attributes (dict)) dict_set_attributes (dataset_dict (ds), dict_get_attributes (dict)); /* Weighting. */ if (dict_get_weight (dict) != NULL) { struct variable *new_weight = dict_lookup_var (dataset_dict (ds), var_get_name (dict_get_weight (dict))); if (new_weight != NULL) dict_set_weight (dataset_dict (ds), new_weight); } dict_unref (dict); return CMD_SUCCESS; } pspp-1.4.1/src/language/dictionary/formats.c0000644000175000017500000000542513546443556020476 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 1997-9, 2000, 2006, 2010, 2011 Free Software Foundation, Inc. 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 3 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, see . */ #include #include #include #include #include "data/dataset.h" #include "data/format.h" #include "data/variable.h" #include "language/command.h" #include "language/lexer/format-parser.h" #include "language/lexer/lexer.h" #include "language/lexer/variable-parser.h" #include "libpspp/message.h" #include "libpspp/misc.h" #include "libpspp/str.h" #include "gettext.h" #define _(msgid) gettext (msgid) enum { FORMATS_PRINT = 001, FORMATS_WRITE = 002 }; static int internal_cmd_formats (struct lexer *, struct dataset *ds, int); int cmd_print_formats (struct lexer *lexer, struct dataset *ds) { return internal_cmd_formats (lexer, ds, FORMATS_PRINT); } int cmd_write_formats (struct lexer *lexer, struct dataset *ds) { return internal_cmd_formats (lexer, ds, FORMATS_WRITE); } int cmd_formats (struct lexer *lexer, struct dataset *ds) { return internal_cmd_formats (lexer, ds, FORMATS_PRINT | FORMATS_WRITE); } static int internal_cmd_formats (struct lexer *lexer, struct dataset *ds, int which) { /* Variables. */ struct variable **v; size_t cv; for (;;) { struct fmt_spec f; int width; size_t i; lex_match (lexer, T_SLASH); if (lex_token (lexer) == T_ENDCMD) break; if (!parse_variables (lexer, dataset_dict (ds), &v, &cv, PV_SAME_WIDTH)) return CMD_FAILURE; width = var_get_width (v[0]); if (!lex_match (lexer, T_LPAREN)) { lex_error_expecting (lexer, "`('"); goto fail; } if (!parse_format_specifier (lexer, &f) || !fmt_check_output (&f) || !fmt_check_width_compat (&f, width)) goto fail; if (!lex_match (lexer, T_RPAREN)) { lex_error_expecting (lexer, "`)'"); goto fail; } for (i = 0; i < cv; i++) { if (which & FORMATS_PRINT) var_set_print_format (v[i], &f); if (which & FORMATS_WRITE) var_set_write_format (v[i], &f); } free (v); v = NULL; } return CMD_SUCCESS; fail: free (v); return CMD_FAILURE; } pspp-1.4.1/src/language/dictionary/rename-variables.c0000644000175000017500000000604513320146056022220 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 1997-9, 2000, 2010, 2011, 2015, 2016 Free Software Foundation, Inc. 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 3 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, see . */ #include #include #include "data/dataset.h" #include "data/dictionary.h" #include "data/variable.h" #include "language/command.h" #include "language/lexer/lexer.h" #include "language/lexer/variable-parser.h" #include "libpspp/message.h" #include "libpspp/str.h" #include "gl/xalloc.h" #include "gettext.h" #define _(msgid) gettext (msgid) /* The code for this function is very similar to the code for the RENAME subcommand of MODIFY VARS. */ int cmd_rename_variables (struct lexer *lexer, struct dataset *ds) { struct variable **vars_to_be_renamed = NULL; size_t n_vars_to_be_renamed = 0; char **new_names = NULL; size_t n_new_names = 0; char *err_name; int status = CMD_CASCADING_FAILURE; if (proc_make_temporary_transformations_permanent (ds)) msg (SE, _("%s may not be used after %s. " "Temporary transformations will be made permanent."), "RENAME VARS", "TEMPORARY"); do { int opts = PV_APPEND | PV_NO_DUPLICATE; if (!lex_match (lexer, T_LPAREN)) opts |= PV_SINGLE; if (!parse_variables (lexer, dataset_dict (ds), &vars_to_be_renamed, &n_vars_to_be_renamed, opts)) { goto lossage; } if (!lex_force_match (lexer, T_EQUALS)) { goto lossage; } if (!parse_DATA_LIST_vars (lexer, dataset_dict (ds), &new_names, &n_new_names, opts)) { goto lossage; } if (n_new_names != n_vars_to_be_renamed) { msg (SE, _("Differing number of variables in old name list " "(%zu) and in new name list (%zu)."), n_vars_to_be_renamed, n_new_names); goto lossage; } if (!(opts & PV_SINGLE) && !lex_force_match (lexer, T_RPAREN)) { goto lossage; } } while (lex_token (lexer) != T_ENDCMD); if (!dict_rename_vars (dataset_dict (ds), vars_to_be_renamed, new_names, n_new_names, &err_name)) { msg (SE, _("Renaming would duplicate variable name %s."), err_name); goto lossage; } status = CMD_SUCCESS; lossage: free (vars_to_be_renamed); if (new_names != NULL) { size_t i; for (i = 0; i < n_new_names; ++i) free (new_names[i]); free (new_names); } return status; } pspp-1.4.1/src/language/dictionary/automake.mk0000644000175000017500000000306713571051220020773 0ustar00blpblp00000000000000# PSPP - a program for statistical analysis. # Copyright (C) 2017 Free Software Foundation, Inc. # # 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 3 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, see . # ## Process this file with automake to produce Makefile.in -*- makefile -*- language_dictionary_sources = \ src/language/dictionary/attributes.c \ src/language/dictionary/apply-dictionary.c \ src/language/dictionary/delete-variables.c \ src/language/dictionary/formats.c \ src/language/dictionary/missing-values.c \ src/language/dictionary/modify-variables.c \ src/language/dictionary/mrsets.c \ src/language/dictionary/numeric.c \ src/language/dictionary/rename-variables.c \ src/language/dictionary/sort-variables.c \ src/language/dictionary/split-file.c \ src/language/dictionary/split-file.h \ src/language/dictionary/sys-file-info.c \ src/language/dictionary/value-labels.c \ src/language/dictionary/variable-label.c \ src/language/dictionary/vector.c \ src/language/dictionary/variable-display.c \ src/language/dictionary/weight.c pspp-1.4.1/src/language/dictionary/missing-values.c0000644000175000017500000001313213320146056021744 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 1997-9, 2000, 2006, 2009, 2010, 2011, 2013, 2016 Free Software Foundation, Inc. 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 3 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, see . */ #include #include #include "data/data-in.h" #include "data/dictionary.h" #include "data/dataset.h" #include "data/format.h" #include "data/missing-values.h" #include "data/value.h" #include "data/variable.h" #include "language/command.h" #include "language/lexer/lexer.h" #include "language/lexer/value-parser.h" #include "language/lexer/variable-parser.h" #include "libpspp/i18n.h" #include "libpspp/message.h" #include "libpspp/str.h" #include "gettext.h" #define _(msgid) gettext (msgid) int cmd_missing_values (struct lexer *lexer, struct dataset *ds) { struct dictionary *dict = dataset_dict (ds); struct variable **v = NULL; size_t nv; bool ok = true; while (lex_token (lexer) != T_ENDCMD) { size_t i; if (!parse_variables (lexer, dict, &v, &nv, PV_NONE)) goto error; if (!lex_force_match (lexer, T_LPAREN)) goto error; for (i = 0; i < nv; i++) var_clear_missing_values (v[i]); if (!lex_match (lexer, T_RPAREN)) { struct missing_values mv; for (i = 0; i < nv; i++) if (var_get_type (v[i]) != var_get_type (v[0])) { const struct variable *n = var_is_numeric (v[0]) ? v[0] : v[i]; const struct variable *s = var_is_numeric (v[0]) ? v[i] : v[0]; msg (SE, _("Cannot mix numeric variables (e.g. %s) and " "string variables (e.g. %s) within a single list."), var_get_name (n), var_get_name (s)); goto error; } if (var_is_numeric (v[0])) { mv_init (&mv, 0); while (!lex_match (lexer, T_RPAREN)) { enum fmt_type type = var_get_print_format (v[0])->type; double x, y; if (!parse_num_range (lexer, &x, &y, &type)) goto error; if (!(x == y ? mv_add_num (&mv, x) : mv_add_range (&mv, x, y))) { msg (SE, _("Too many numeric missing values. At most " "three individual values or one value and " "one range are allowed.")); ok = false; } lex_match (lexer, T_COMMA); } } else { const char *encoding = dict_get_encoding (dict); mv_init (&mv, MV_MAX_STRING); while (!lex_match (lexer, T_RPAREN)) { const char *utf8_s; size_t utf8_trunc_len; size_t utf8_len; char *raw_s; if (!lex_force_string (lexer)) { ok = false; break; } /* Truncate the string to fit in 8 bytes in the dictionary encoding. */ utf8_s = lex_tokcstr (lexer); utf8_len = ss_length (lex_tokss (lexer)); utf8_trunc_len = utf8_encoding_trunc_len (utf8_s, encoding, MV_MAX_STRING); if (utf8_trunc_len < utf8_len) msg (SE, _("Truncating missing value to maximum " "acceptable length (%d bytes)."), MV_MAX_STRING); /* Recode to dictionary encoding and add. */ raw_s = recode_string (encoding, "UTF-8", utf8_s, utf8_trunc_len); if (!mv_add_str (&mv, CHAR_CAST (const uint8_t *, raw_s), strlen (raw_s))) { msg (SE, _("Too many string missing values. " "At most three individual values are allowed.")); ok = false; } free (raw_s); lex_get (lexer); lex_match (lexer, T_COMMA); } } for (i = 0; i < nv; i++) { if (mv_is_resizable (&mv, var_get_width (v[i]))) var_set_missing_values (v[i], &mv); else { msg (SE, _("Missing values provided are too long to assign " "to variable of width %d."), var_get_width (v[i])); ok = false; } } mv_destroy (&mv); } lex_match (lexer, T_SLASH); free (v); v = NULL; } free (v); return ok ? CMD_SUCCESS : CMD_FAILURE; error: free (v); return CMD_FAILURE; } pspp-1.4.1/src/language/dictionary/numeric.c0000644000175000017500000001125013670210420020432 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 1997-9, 2000, 2006, 2010, 2011, 2014 Free Software Foundation, Inc. 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 3 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, see . */ #include #include #include "data/dataset.h" #include "data/dictionary.h" #include "data/variable.h" #include "data/format.h" #include "language/command.h" #include "language/lexer/format-parser.h" #include "language/lexer/lexer.h" #include "language/lexer/variable-parser.h" #include "libpspp/assertion.h" #include "libpspp/message.h" #include "libpspp/str.h" #include "gettext.h" #define _(msgid) gettext (msgid) /* Parses the NUMERIC command. */ int cmd_numeric (struct lexer *lexer, struct dataset *ds) { size_t i; /* Names of variables to create. */ char **v; size_t nv; do { /* Format spec for variables to create. */ struct fmt_spec f; if (!parse_DATA_LIST_vars (lexer, dataset_dict (ds), &v, &nv, PV_NO_DUPLICATE)) return CMD_FAILURE; /* Get the optional format specification. */ if (lex_match (lexer, T_LPAREN)) { if (!parse_format_specifier (lexer, &f)) goto fail; if (! fmt_check_output (&f)) goto fail; if (fmt_is_string (f.type)) { char str[FMT_STRING_LEN_MAX + 1]; msg (SE, _("Format type %s may not be used with a numeric " "variable."), fmt_to_string (&f, str)); goto fail; } if (!lex_match (lexer, T_RPAREN)) { lex_error_expecting (lexer, "`)'"); goto fail; } } else f = var_default_formats (0); /* Create each variable. */ for (i = 0; i < nv; i++) { struct variable *new_var = dict_create_var (dataset_dict (ds), v[i], 0); if (!new_var) msg (SE, _("There is already a variable named %s."), v[i]); else var_set_both_formats (new_var, &f); } /* Clean up. */ for (i = 0; i < nv; i++) free (v[i]); free (v); } while (lex_match (lexer, T_SLASH)); return CMD_SUCCESS; /* If we have an error at a point where cleanup is required, flow-of-control comes here. */ fail: for (i = 0; i < nv; i++) free (v[i]); free (v); return CMD_FAILURE; } /* Parses the STRING command. */ int cmd_string (struct lexer *lexer, struct dataset *ds) { size_t i; /* Names of variables to create. */ char **v; size_t nv; /* Format spec for variables to create. */ struct fmt_spec f; /* Width of variables to create. */ int width; do { if (!parse_DATA_LIST_vars (lexer, dataset_dict (ds), &v, &nv, PV_NO_DUPLICATE)) return CMD_FAILURE; if (!lex_force_match (lexer, T_LPAREN) || !parse_format_specifier (lexer, &f) || !lex_force_match (lexer, T_RPAREN)) goto fail; if (!fmt_is_string (f.type)) { char str[FMT_STRING_LEN_MAX + 1]; msg (SE, _("Format type %s may not be used with a string " "variable."), fmt_to_string (&f, str)); goto fail; } if (!fmt_check_output (&f)) goto fail; width = fmt_var_width (&f); /* Create each variable. */ for (i = 0; i < nv; i++) { struct variable *new_var = dict_create_var (dataset_dict (ds), v[i], width); if (!new_var) msg (SE, _("There is already a variable named %s."), v[i]); else var_set_both_formats (new_var, &f); } /* Clean up. */ for (i = 0; i < nv; i++) free (v[i]); free (v); } while (lex_match (lexer, T_SLASH)); return CMD_SUCCESS; /* If we have an error at a point where cleanup is required, flow-of-control comes here. */ fail: for (i = 0; i < nv; i++) free (v[i]); free (v); return CMD_FAILURE; } /* Parses the LEAVE command. */ int cmd_leave (struct lexer *lexer, struct dataset *ds) { struct variable **v; size_t nv; size_t i; if (!parse_variables (lexer, dataset_dict (ds), &v, &nv, PV_NONE)) return CMD_CASCADING_FAILURE; for (i = 0; i < nv; i++) var_set_leave (v[i], true); free (v); return CMD_SUCCESS; } pspp-1.4.1/src/language/dictionary/variable-display.c0000644000175000017500000001241213670210420022221 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 1997-9, 2000, 2010, 2011, 2013 Free Software Foundation, Inc. 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 3 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, see . */ #include #include #include #include "data/dataset.h" #include "data/variable.h" #include "language/command.h" #include "language/lexer/lexer.h" #include "language/lexer/variable-parser.h" #include "libpspp/message.h" #include "libpspp/str.h" #include "gl/minmax.h" #include "gl/xalloc.h" #include "gettext.h" #define _(msgid) gettext (msgid) /* Set variables' alignment This is the alignment for GUI display only. It affects nothing but GUIs */ int cmd_variable_alignment (struct lexer *lexer, struct dataset *ds) { do { struct variable **v; size_t nv; size_t i; enum alignment align; if (!parse_variables (lexer, dataset_dict (ds), &v, &nv, PV_NONE)) return CMD_FAILURE; if (lex_force_match (lexer, T_LPAREN)) { if (lex_match_id (lexer, "LEFT")) align = ALIGN_LEFT; else if (lex_match_id (lexer, "RIGHT")) align = ALIGN_RIGHT; else if (lex_match_id (lexer, "CENTER")) align = ALIGN_CENTRE; else { free (v); return CMD_FAILURE; } if (!lex_force_match (lexer, T_RPAREN)) return CMD_FAILURE; } else { free (v); return CMD_FAILURE; } for(i = 0 ; i < nv ; ++i) var_set_alignment (v[i], align); while (lex_token (lexer) == T_SLASH) lex_get (lexer); free (v); } while (lex_token (lexer) != T_ENDCMD); return CMD_SUCCESS; } /* Set variables' display width. This is the width for GUI display only. It affects nothing but GUIs */ int cmd_variable_width (struct lexer *lexer, struct dataset *ds) { do { struct variable **v; long int width; size_t nv; size_t i; if (!parse_variables (lexer, dataset_dict (ds), &v, &nv, PV_NONE)) return CMD_FAILURE; if (!lex_force_match (lexer, T_LPAREN) || !lex_force_int (lexer)) { free (v); return CMD_FAILURE; } width = lex_integer (lexer); lex_get (lexer); if (!lex_force_match (lexer, T_RPAREN)) { free (v); return CMD_FAILURE; } if (width < 0) { msg (SE, _("Variable display width must be a positive integer.")); free (v); return CMD_FAILURE; } width = MIN (width, 2 * MAX_STRING); for(i = 0 ; i < nv ; ++i) var_set_display_width (v[i], width); while (lex_token (lexer) == T_SLASH) lex_get (lexer); free (v); } while (lex_token (lexer) != T_ENDCMD); return CMD_SUCCESS; } /* Set variables' measurement level */ int cmd_variable_level (struct lexer *lexer, struct dataset *ds) { do { struct variable **v; size_t nv; enum measure level; size_t i; if (!parse_variables (lexer, dataset_dict (ds), &v, &nv, PV_NONE)) return CMD_FAILURE; if (lex_force_match (lexer, T_LPAREN)) { if (lex_match_id (lexer, "SCALE")) level = MEASURE_SCALE; else if (lex_match_id (lexer, "ORDINAL")) level = MEASURE_ORDINAL; else if (lex_match_id (lexer, "NOMINAL")) level = MEASURE_NOMINAL; else { free (v); return CMD_FAILURE; } if (!lex_force_match (lexer, T_RPAREN)) return CMD_FAILURE; } else { free (v); return CMD_FAILURE; } for(i = 0 ; i < nv ; ++i) var_set_measure (v[i], level); while (lex_token (lexer) == T_SLASH) lex_get (lexer); free (v); } while (lex_token (lexer) != T_ENDCMD); return CMD_SUCCESS; } /* Set variables' role */ int cmd_variable_role (struct lexer *lexer, struct dataset *ds) { while (lex_match (lexer, T_SLASH)) { struct variable **v; size_t nv; enum var_role role; size_t i; if (lex_match_id (lexer, "INPUT")) role = ROLE_INPUT; else if (lex_match_id (lexer, "TARGET")) role = ROLE_TARGET; else if (lex_match_id (lexer, "BOTH")) role = ROLE_BOTH; else if (lex_match_id (lexer, "NONE")) role = ROLE_NONE; else if (lex_match_id (lexer, "PARTITION")) role = ROLE_PARTITION; else if (lex_match_id (lexer, "SPLIT")) role = ROLE_SPLIT; else { lex_error (lexer, NULL); return CMD_FAILURE; } if (!parse_variables (lexer, dataset_dict (ds), &v, &nv, PV_NONE)) return CMD_FAILURE; for (i = 0; i < nv; i++) var_set_role (v[i], role); free (v); } return CMD_SUCCESS; } pspp-1.4.1/src/language/dictionary/sort-variables.c0000644000175000017500000001553613320146056021745 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2016 Free Software Foundation, Inc. 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 3 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, see . */ #include #include #include "data/attributes.h" #include "data/dataset.h" #include "data/dictionary.h" #include "data/format.h" #include "data/variable.h" #include "language/command.h" #include "language/lexer/lexer.h" #include "libpspp/array.h" #include "libpspp/assertion.h" #include "libpspp/i18n.h" #include "libpspp/message.h" #include "libpspp/str.h" #include "gl/xalloc.h" #include "gettext.h" #define _(msgid) gettext (msgid) enum key { K_NAME, K_TYPE, K_FORMAT, K_VAR_LABEL, K_VALUE_LABELS, K_MISSING_VALUES, K_MEASURE, K_ROLE, K_COLUMNS, K_ALIGNMENT, K_ATTRIBUTE, }; struct criterion { enum key key; char *attr_name; bool descending; }; static int compare_ints (int a, int b) { return a < b ? -1 : a > b; } static int compare_formats (const struct fmt_spec *a, const struct fmt_spec *b) { int retval = compare_ints (fmt_to_io (a->type), fmt_to_io (b->type)); if (!retval) retval = compare_ints (a->w, b->w); if (!retval) retval = compare_ints (a->d, b->d); return retval; } static int compare_var_labels (const struct variable *a, const struct variable *b) { const char *a_label = var_get_label (a); const char *b_label = var_get_label (b); return utf8_strcasecmp (a_label ? a_label : "", b_label ? b_label : ""); } static int map_measure (enum measure m) { return (m == MEASURE_NOMINAL ? 0 : m == MEASURE_ORDINAL ? 1 : 2); } static int map_role (enum var_role r) { return (r == ROLE_INPUT ? 0 : r == ROLE_TARGET ? 1 : r == ROLE_BOTH ? 2 : r == ROLE_NONE ? 3 : r == ROLE_PARTITION ? 4 : 5); } static const char * get_attribute (const struct variable *v, const char *name) { const struct attrset *set = var_get_attributes (v); const struct attribute *attr = attrset_lookup (set, name); const char *value = attr ? attribute_get_value (attr, 0) : NULL; return value ? value : ""; } static int map_alignment (enum alignment a) { return (a == ALIGN_LEFT ? 0 : a == ALIGN_RIGHT ? 1 : 2); } static int compare_vars (const void *a_, const void *b_, const void *c_) { const struct variable *const *ap = a_; const struct variable *const *bp = b_; const struct variable *a = *ap; const struct variable *b = *bp; const struct criterion *c = c_; int retval; switch (c->key) { case K_NAME: retval = utf8_strverscasecmp (var_get_name (a), var_get_name (b)); break; case K_TYPE: retval = compare_ints (var_get_width (a), var_get_width (b)); break; case K_FORMAT: retval = compare_formats (var_get_print_format (a), var_get_print_format (b)); break; case K_VAR_LABEL: retval = compare_var_labels (a, b); break; case K_VALUE_LABELS: retval = compare_ints (var_has_value_labels (a), var_has_value_labels (b)); break; case K_MISSING_VALUES: retval = compare_ints (var_has_missing_values (a), var_has_missing_values (b)); break; case K_MEASURE: retval = compare_ints (map_measure (var_get_measure (a)), map_measure (var_get_measure (b))); break; case K_ROLE: retval = compare_ints (map_role (var_get_role (a)), map_role (var_get_role (b))); break; case K_COLUMNS: retval = compare_ints (var_get_display_width (a), var_get_display_width (b)); break; case K_ALIGNMENT: retval = compare_ints (map_alignment (var_get_alignment (a)), map_alignment (var_get_alignment (b))); break; case K_ATTRIBUTE: retval = utf8_strcasecmp (get_attribute (a, c->attr_name), get_attribute (b, c->attr_name)); break; default: NOT_REACHED (); } /* Make this a stable sort. */ if (!retval) { size_t a_index = var_get_dict_index (a); size_t b_index = var_get_dict_index (b); retval = a_index < b_index ? -1 : a_index > b_index; } if (c->descending) retval = -retval; return retval; } /* Performs SORT VARIABLES command. */ int cmd_sort_variables (struct lexer *lexer, struct dataset *ds) { enum cmd_result result = CMD_FAILURE; lex_match (lexer, T_BY); /* Parse sort key. */ struct criterion c = { .attr_name = NULL }; if (lex_match_id (lexer, "NAME")) c.key = K_NAME; else if (lex_match_id (lexer, "TYPE")) c.key = K_TYPE; else if (lex_match_id (lexer, "FORMAT")) c.key = K_FORMAT; else if (lex_match_id (lexer, "LABEL")) c.key = K_VAR_LABEL; else if (lex_match_id (lexer, "VALUES")) c.key = K_VALUE_LABELS; else if (lex_match_id (lexer, "MISSING")) c.key = K_MISSING_VALUES; else if (lex_match_id (lexer, "MEASURE")) c.key = K_MEASURE; else if (lex_match_id (lexer, "ROLE")) c.key = K_ROLE; else if (lex_match_id (lexer, "COLUMNS")) c.key = K_COLUMNS; else if (lex_match_id (lexer, "ALIGNMENT")) c.key = K_ALIGNMENT; else if (lex_match_id (lexer, "ATTRIBUTE")) { if (!lex_force_id (lexer)) goto exit; c.key = K_ATTRIBUTE; c.attr_name = xstrdup (lex_tokcstr (lexer)); lex_get (lexer); } /* Parse sort direction. */ if (lex_match (lexer, T_LPAREN)) { if (lex_match_id (lexer, "A") || lex_match_id (lexer, "UP")) c.descending = false; else if (lex_match_id (lexer, "D") || lex_match_id (lexer, "DOWN")) c.descending = true; else { lex_error (lexer, NULL); goto exit; } if (!lex_force_match (lexer, T_RPAREN)) goto exit; } else c.descending = false; /* Sort variables. */ struct dictionary *d = dataset_dict (ds); struct variable **vars; size_t n_vars; dict_get_vars_mutable (d, &vars, &n_vars, 0); sort (vars, n_vars, sizeof *vars, compare_vars, &c); dict_reorder_vars (d, CONST_CAST (struct variable *const *, vars), n_vars); free (vars); result = CMD_SUCCESS; exit: free (c.attr_name); return result; } pspp-1.4.1/src/language/dictionary/delete-variables.c0000644000175000017500000000403113320146056022204 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2006, 2007, 2010, 2011, 2013 Free Software Foundation, Inc. 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 3 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, see . */ #include #include #include "data/casereader.h" #include "data/dataset.h" #include "data/dictionary.h" #include "language/command.h" #include "language/lexer/variable-parser.h" #include "libpspp/message.h" #include "gettext.h" #define _(msgid) gettext (msgid) /* Performs DELETE VARIABLES command. */ int cmd_delete_variables (struct lexer *lexer, struct dataset *ds) { struct variable **vars; size_t var_cnt; bool ok; if (proc_make_temporary_transformations_permanent (ds)) msg (SE, _("%s may not be used after %s. " "Temporary transformations will be made permanent."), "DELETE VARIABLES", "TEMPORARY"); if (!parse_variables (lexer, dataset_dict (ds), &vars, &var_cnt, PV_NONE)) goto error; if (var_cnt == dict_get_var_cnt (dataset_dict (ds))) { msg (SE, _("%s may not be used to delete all variables " "from the active dataset dictionary. " "Use %s instead."), "DELETE VARIABLES", "NEW FILE"); goto error; } ok = casereader_destroy (proc_open_filtering (ds, false)); ok = proc_commit (ds) && ok; if (!ok) goto error; dict_delete_vars (dataset_dict (ds), vars, var_cnt); free (vars); return CMD_SUCCESS; error: free (vars); return CMD_CASCADING_FAILURE; } pspp-1.4.1/src/language/dictionary/vector.c0000644000175000017500000001363113673465023020315 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 1997-9, 2000, 2010, 2011, 2012, 2016 Free Software Foundation, Inc. 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 3 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, see . */ #include #include #include "data/dataset.h" #include "data/format.h" #include "data/dictionary.h" #include "data/variable.h" #include "language/command.h" #include "language/lexer/format-parser.h" #include "language/lexer/lexer.h" #include "language/lexer/variable-parser.h" #include "libpspp/assertion.h" #include "libpspp/i18n.h" #include "libpspp/message.h" #include "libpspp/misc.h" #include "libpspp/pool.h" #include "libpspp/str.h" #include "gl/intprops.h" #include "gl/xalloc.h" #include "gettext.h" #define _(msgid) gettext (msgid) int cmd_vector (struct lexer *lexer, struct dataset *ds) { struct dictionary *dict = dataset_dict (ds); struct pool *pool = pool_create (); do { char **vectors; size_t vector_cnt, vector_cap; /* Get the name(s) of the new vector(s). */ if (!lex_force_id (lexer) || !dict_id_is_valid (dict, lex_tokcstr (lexer), true)) return CMD_CASCADING_FAILURE; vectors = NULL; vector_cnt = vector_cap = 0; while (lex_token (lexer) == T_ID) { size_t i; if (dict_lookup_vector (dict, lex_tokcstr (lexer))) { msg (SE, _("A vector named %s already exists."), lex_tokcstr (lexer)); goto fail; } for (i = 0; i < vector_cnt; i++) if (!utf8_strcasecmp (vectors[i], lex_tokcstr (lexer))) { msg (SE, _("Vector name %s is given twice."), lex_tokcstr (lexer)); goto fail; } if (vector_cnt == vector_cap) vectors = pool_2nrealloc (pool, vectors, &vector_cap, sizeof *vectors); vectors[vector_cnt++] = pool_strdup (pool, lex_tokcstr (lexer)); lex_get (lexer); lex_match (lexer, T_COMMA); } /* Now that we have the names it's time to check for the short or long forms. */ if (lex_match (lexer, T_EQUALS)) { /* Long form. */ struct variable **v; size_t nv; if (vector_cnt > 1) { msg (SE, _("A slash must separate each vector " "specification in VECTOR's long form.")); goto fail; } if (!parse_variables_pool (lexer, pool, dict, &v, &nv, PV_SAME_WIDTH | PV_DUPLICATE)) goto fail; dict_create_vector (dict, vectors[0], v, nv); } else if (lex_match (lexer, T_LPAREN)) { /* Short form. */ struct fmt_spec format; bool seen_format = false; struct variable **vars; int var_cnt; size_t i; var_cnt = 0; format = fmt_for_output (FMT_F, 8, 2); seen_format = false; while (!lex_match (lexer, T_RPAREN)) { if (lex_is_integer (lexer) && var_cnt == 0) { var_cnt = lex_integer (lexer); lex_get (lexer); if (var_cnt <= 0) { msg (SE, _("Vectors must have at least one element.")); goto fail; } } else if (lex_token (lexer) == T_ID && !seen_format) { seen_format = true; if (!parse_format_specifier (lexer, &format) || !fmt_check_output (&format)) goto fail; } else { lex_error (lexer, NULL); goto fail; } lex_match (lexer, T_COMMA); } if (var_cnt == 0) { lex_error (lexer, _("expecting vector length")); goto fail; } /* Check that none of the variables exist and that their names are not excessively long. */ for (i = 0; i < vector_cnt; i++) { int j; for (j = 0; j < var_cnt; j++) { char *name = xasprintf ("%s%d", vectors[i], j + 1); if (!dict_id_is_valid (dict, name, true)) { free (name); goto fail; } if (dict_lookup_var (dict, name)) { msg (SE, _("%s is an existing variable name."), name); free (name); goto fail; } free (name); } } /* Finally create the variables and vectors. */ vars = pool_nmalloc (pool, var_cnt, sizeof *vars); for (i = 0; i < vector_cnt; i++) { int j; for (j = 0; j < var_cnt; j++) { char *name = xasprintf ("%s%d", vectors[i], j + 1); vars[j] = dict_create_var_assert (dict, name, fmt_var_width (&format)); var_set_both_formats (vars[j], &format); free (name); } dict_create_vector_assert (dict, vectors[i], vars, var_cnt); } } else { lex_error (lexer, NULL); goto fail; } } while (lex_match (lexer, T_SLASH)); pool_destroy (pool); return CMD_SUCCESS; fail: pool_destroy (pool); return CMD_FAILURE; } pspp-1.4.1/src/language/dictionary/split-file.c0000644000175000017500000000556513670210420021054 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 1997-9, 2000, 2009, 2010, 2011 Free Software Foundation, Inc. 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 3 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, see . */ #include #include #include "data/case.h" #include "data/data-out.h" #include "data/dataset.h" #include "data/dictionary.h" #include "data/format.h" #include "data/value-labels.h" #include "data/variable.h" #include "language/command.h" #include "language/dictionary/split-file.h" #include "language/lexer/lexer.h" #include "language/lexer/variable-parser.h" #include "libpspp/message.h" #include "libpspp/str.h" #include "output/pivot-table.h" #include "gl/xalloc.h" #include "gettext.h" #define N_(msgid) msgid #define _(msgid) gettext (msgid) int cmd_split_file (struct lexer *lexer, struct dataset *ds) { if (lex_match_id (lexer, "OFF")) dict_set_split_vars (dataset_dict (ds), NULL, 0); else { struct variable **v; size_t n; /* For now, ignore SEPARATE and LAYERED. */ (void) (lex_match_id (lexer, "SEPARATE") || lex_match_id (lexer, "LAYERED")); lex_match (lexer, T_BY); if (!parse_variables (lexer, dataset_dict (ds), &v, &n, PV_NO_DUPLICATE)) return CMD_CASCADING_FAILURE; dict_set_split_vars (dataset_dict (ds), v, n); free (v); } return CMD_SUCCESS; } /* Dumps out the values of all the split variables for the case C. */ void output_split_file_values (const struct dataset *ds, const struct ccase *c) { const struct dictionary *dict = dataset_dict (ds); size_t n_vars = dict_get_split_cnt (dict); if (n_vars == 0) return; struct pivot_table *table = pivot_table_create (N_("Split Values")); pivot_dimension_create (table, PIVOT_AXIS_COLUMN, N_("Value"), N_("Value")); struct pivot_dimension *variables = pivot_dimension_create ( table, PIVOT_AXIS_ROW, N_("Variable")); variables->root->show_label = true; for (size_t i = 0; i < n_vars; i++) { const struct variable *v = dict_get_split_vars (dict)[i]; int row = pivot_category_create_leaf (variables->root, pivot_value_new_variable (v)); pivot_table_put2 (table, 0, row, pivot_value_new_var_value (v, case_data (c, v))); } pivot_table_submit (table); } pspp-1.4.1/src/language/dictionary/mrsets.c0000644000175000017500000004612213573024421020321 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2010, 2011, 2012 Free Software Foundation, Inc. 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 3 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, see . */ #include #include "data/data-out.h" #include "data/dataset.h" #include "data/dictionary.h" #include "data/mrset.h" #include "data/value-labels.h" #include "data/variable.h" #include "language/command.h" #include "language/lexer/lexer.h" #include "language/lexer/variable-parser.h" #include "libpspp/assertion.h" #include "libpspp/hmap.h" #include "libpspp/i18n.h" #include "libpspp/message.h" #include "libpspp/str.h" #include "libpspp/stringi-map.h" #include "libpspp/stringi-set.h" #include "output/pivot-table.h" #include "gl/xalloc.h" #include "gettext.h" #define N_(msgid) msgid #define _(msgid) gettext (msgid) static bool parse_group (struct lexer *, struct dictionary *, enum mrset_type); static bool parse_delete (struct lexer *, struct dictionary *); static bool parse_display (struct lexer *, struct dictionary *); int cmd_mrsets (struct lexer *lexer, struct dataset *ds) { struct dictionary *dict = dataset_dict (ds); while (lex_match (lexer, T_SLASH)) { bool ok; if (lex_match_id (lexer, "MDGROUP")) ok = parse_group (lexer, dict, MRSET_MD); else if (lex_match_id (lexer, "MCGROUP")) ok = parse_group (lexer, dict, MRSET_MC); else if (lex_match_id (lexer, "DELETE")) ok = parse_delete (lexer, dict); else if (lex_match_id (lexer, "DISPLAY")) ok = parse_display (lexer, dict); else { ok = false; lex_error (lexer, NULL); } if (!ok) return CMD_FAILURE; } return CMD_SUCCESS; } static bool parse_group (struct lexer *lexer, struct dictionary *dict, enum mrset_type type) { const char *subcommand_name = type == MRSET_MD ? "MDGROUP" : "MCGROUP"; struct mrset *mrset; bool labelsource_varlabel; bool has_value; mrset = xzalloc (sizeof *mrset); mrset->type = type; mrset->cat_source = MRSET_VARLABELS; labelsource_varlabel = false; has_value = false; while (lex_token (lexer) != T_SLASH && lex_token (lexer) != T_ENDCMD) { if (lex_match_id (lexer, "NAME")) { if (!lex_force_match (lexer, T_EQUALS) || !lex_force_id (lexer) || !mrset_is_valid_name (lex_tokcstr (lexer), dict_get_encoding (dict), true)) goto error; free (mrset->name); mrset->name = xstrdup (lex_tokcstr (lexer)); lex_get (lexer); } else if (lex_match_id (lexer, "VARIABLES")) { if (!lex_force_match (lexer, T_EQUALS)) goto error; free (mrset->vars); if (!parse_variables (lexer, dict, &mrset->vars, &mrset->n_vars, PV_SAME_TYPE | PV_NO_SCRATCH)) goto error; if (mrset->n_vars < 2) { msg (SE, _("VARIABLES specified only variable %s on %s, but " "at least two variables are required."), var_get_name (mrset->vars[0]), subcommand_name); goto error; } } else if (lex_match_id (lexer, "LABEL")) { if (!lex_force_match (lexer, T_EQUALS) || !lex_force_string (lexer)) goto error; free (mrset->label); mrset->label = ss_xstrdup (lex_tokss (lexer)); lex_get (lexer); } else if (type == MRSET_MD && lex_match_id (lexer, "LABELSOURCE")) { if (!lex_force_match (lexer, T_EQUALS) || !lex_force_match_id (lexer, "VARLABEL")) goto error; labelsource_varlabel = true; } else if (type == MRSET_MD && lex_match_id (lexer, "VALUE")) { if (!lex_force_match (lexer, T_EQUALS)) goto error; has_value = true; if (lex_is_number (lexer)) { if (!lex_is_integer (lexer)) { msg (SE, _("Numeric VALUE must be an integer.")); goto error; } value_destroy (&mrset->counted, mrset->width); mrset->counted.f = lex_integer (lexer); mrset->width = 0; } else if (lex_is_string (lexer)) { size_t width; char *s; s = recode_string (dict_get_encoding (dict), "UTF-8", lex_tokcstr (lexer), -1); width = strlen (s); /* Trim off trailing spaces, but don't trim the string until it's empty because a width of 0 is a numeric type. */ while (width > 1 && s[width - 1] == ' ') width--; value_destroy (&mrset->counted, mrset->width); value_init (&mrset->counted, width); memcpy (mrset->counted.s, s, width); mrset->width = width; free (s); } else { lex_error (lexer, NULL); goto error; } lex_get (lexer); } else if (type == MRSET_MD && lex_match_id (lexer, "CATEGORYLABELS")) { if (!lex_force_match (lexer, T_EQUALS)) goto error; if (lex_match_id (lexer, "VARLABELS")) mrset->cat_source = MRSET_VARLABELS; else if (lex_match_id (lexer, "COUNTEDVALUES")) mrset->cat_source = MRSET_COUNTEDVALUES; else { lex_error (lexer, NULL); goto error; } } else { lex_error (lexer, NULL); goto error; } } if (mrset->name == NULL) { lex_spec_missing (lexer, subcommand_name, "NAME"); goto error; } else if (mrset->n_vars == 0) { lex_spec_missing (lexer, subcommand_name, "VARIABLES"); goto error; } if (type == MRSET_MD) { /* Check that VALUE is specified and is valid for the VARIABLES. */ if (!has_value) { lex_spec_missing (lexer, subcommand_name, "VALUE"); goto error; } else if (var_is_alpha (mrset->vars[0])) { if (mrset->width == 0) { msg (SE, _("MDGROUP subcommand for group %s specifies a string " "VALUE, but the variables specified for this group " "are numeric."), mrset->name); goto error; } else { const struct variable *shortest_var; int min_width; size_t i; shortest_var = NULL; min_width = INT_MAX; for (i = 0; i < mrset->n_vars; i++) { int width = var_get_width (mrset->vars[i]); if (width < min_width) { shortest_var = mrset->vars[i]; min_width = width; } } if (mrset->width > min_width) { msg (SE, _("VALUE string on MDGROUP subcommand for group " "%s is %d bytes long, but it must be no longer " "than the narrowest variable in the group, " "which is %s with a width of %d bytes."), mrset->name, mrset->width, var_get_name (shortest_var), min_width); goto error; } } } else { if (mrset->width != 0) { msg (SE, _("MDGROUP subcommand for group %s specifies a string " "VALUE, but the variables specified for this group " "are numeric."), mrset->name); goto error; } } /* Implement LABELSOURCE=VARLABEL. */ if (labelsource_varlabel) { if (mrset->cat_source != MRSET_COUNTEDVALUES) msg (SW, _("MDGROUP subcommand for group %s specifies " "LABELSOURCE=VARLABEL but not " "CATEGORYLABELS=COUNTEDVALUES. " "Ignoring LABELSOURCE."), mrset->name); else if (mrset->label) msg (SW, _("MDGROUP subcommand for group %s specifies both LABEL " "and LABELSOURCE, but only one of these subcommands " "may be used at a time. Ignoring LABELSOURCE."), mrset->name); else { size_t i; mrset->label_from_var_label = true; for (i = 0; mrset->label == NULL && i < mrset->n_vars; i++) { const char *label = var_get_label (mrset->vars[i]); if (label != NULL) { mrset->label = xstrdup (label); break; } } } } /* Warn if categories cannot be distinguished in output. */ if (mrset->cat_source == MRSET_VARLABELS) { struct stringi_map seen; size_t i; stringi_map_init (&seen); for (i = 0; i < mrset->n_vars; i++) { const struct variable *var = mrset->vars[i]; const char *name = var_get_name (var); const char *label = var_get_label (var); if (label != NULL) { const char *other_name = stringi_map_find (&seen, label); if (other_name == NULL) stringi_map_insert (&seen, label, name); else msg (SW, _("Variables %s and %s specified as part of " "multiple dichotomy group %s have the same " "variable label. Categories represented by " "these variables will not be distinguishable " "in output."), other_name, name, mrset->name); } } stringi_map_destroy (&seen); } else { struct stringi_map seen; size_t i; stringi_map_init (&seen); for (i = 0; i < mrset->n_vars; i++) { const struct variable *var = mrset->vars[i]; const char *name = var_get_name (var); const struct val_labs *val_labs; union value value; const char *label; value_clone (&value, &mrset->counted, mrset->width); value_resize (&value, mrset->width, var_get_width (var)); val_labs = var_get_value_labels (var); label = val_labs_find (val_labs, &value); if (label == NULL) msg (SW, _("Variable %s specified as part of multiple " "dichotomy group %s (which has " "CATEGORYLABELS=COUNTEDVALUES) has no value label " "for its counted value. This category will not " "be distinguishable in output."), name, mrset->name); else { const char *other_name = stringi_map_find (&seen, label); if (other_name == NULL) stringi_map_insert (&seen, label, name); else msg (SW, _("Variables %s and %s specified as part of " "multiple dichotomy group %s (which has " "CATEGORYLABELS=COUNTEDVALUES) have the same " "value label for the group's counted " "value. These categories will not be " "distinguishable in output."), other_name, name, mrset->name); } } stringi_map_destroy (&seen); } } else /* MCGROUP. */ { /* Warn if categories cannot be distinguished in output. */ struct category { struct hmap_node hmap_node; union value value; int width; const char *label; const char *var_name; bool warned; }; struct category *c, *next; struct hmap categories; size_t i; hmap_init (&categories); for (i = 0; i < mrset->n_vars; i++) { const struct variable *var = mrset->vars[i]; const char *name = var_get_name (var); int width = var_get_width (var); const struct val_labs *val_labs; const struct val_lab *vl; val_labs = var_get_value_labels (var); for (vl = val_labs_first (val_labs); vl != NULL; vl = val_labs_next (val_labs, vl)) { const union value *value = val_lab_get_value (vl); const char *label = val_lab_get_label (vl); unsigned int hash = value_hash (value, width, 0); HMAP_FOR_EACH_WITH_HASH (c, struct category, hmap_node, hash, &categories) { if (width == c->width && value_equal (value, &c->value, width)) { if (!c->warned && utf8_strcasecmp (c->label, label)) { char *s = data_out (value, var_get_encoding (var), var_get_print_format (var)); c->warned = true; msg (SW, _("Variables specified on MCGROUP should " "have the same categories, but %s and %s " "(and possibly others) in multiple " "category group %s have different " "value labels for value %s."), c->var_name, name, mrset->name, s); free (s); } goto found; } } c = xmalloc (sizeof *c); value_clone (&c->value, value, width); c->width = width; c->label = label; c->var_name = name; c->warned = false; hmap_insert (&categories, &c->hmap_node, hash); found: ; } } HMAP_FOR_EACH_SAFE (c, next, struct category, hmap_node, &categories) { value_destroy (&c->value, c->width); hmap_delete (&categories, &c->hmap_node); free (c); } hmap_destroy (&categories); } dict_add_mrset (dict, mrset); return true; error: mrset_destroy (mrset); return false; } static bool parse_mrset_names (struct lexer *lexer, struct dictionary *dict, struct stringi_set *mrset_names) { if (!lex_force_match_id (lexer, "NAME") || !lex_force_match (lexer, T_EQUALS)) return false; stringi_set_init (mrset_names); if (lex_match (lexer, T_LBRACK)) { while (!lex_match (lexer, T_RBRACK)) { if (!lex_force_id (lexer)) return false; if (dict_lookup_mrset (dict, lex_tokcstr (lexer)) == NULL) { msg (SE, _("No multiple response set named %s."), lex_tokcstr (lexer)); stringi_set_destroy (mrset_names); return false; } stringi_set_insert (mrset_names, lex_tokcstr (lexer)); lex_get (lexer); } } else if (lex_match (lexer, T_ALL)) { size_t n_sets = dict_get_n_mrsets (dict); size_t i; for (i = 0; i < n_sets; i++) stringi_set_insert (mrset_names, dict_get_mrset (dict, i)->name); } return true; } static bool parse_delete (struct lexer *lexer, struct dictionary *dict) { const struct stringi_set_node *node; struct stringi_set mrset_names; const char *name; if (!parse_mrset_names (lexer, dict, &mrset_names)) return false; STRINGI_SET_FOR_EACH (name, node, &mrset_names) dict_delete_mrset (dict, name); stringi_set_destroy (&mrset_names); return true; } static bool parse_display (struct lexer *lexer, struct dictionary *dict) { struct stringi_set mrset_names_set; if (!parse_mrset_names (lexer, dict, &mrset_names_set)) return false; size_t n = stringi_set_count (&mrset_names_set); if (n == 0) { if (dict_get_n_mrsets (dict) == 0) msg (SN, _("The active dataset dictionary does not contain any " "multiple response sets.")); stringi_set_destroy (&mrset_names_set); return true; } struct pivot_table *table = pivot_table_create ( N_("Multiple Response Sets")); pivot_dimension_create ( table, PIVOT_AXIS_COLUMN, N_("Attributes"), N_("Label"), N_("Encoding"), N_("Counted Value"), N_("Member Variables")); struct pivot_dimension *mrsets = pivot_dimension_create ( table, PIVOT_AXIS_ROW, N_("Name")); mrsets->root->show_label = true; char **mrset_names = stringi_set_get_sorted_array (&mrset_names_set); for (size_t i = 0; i < n; i++) { const struct mrset *mrset = dict_lookup_mrset (dict, mrset_names[i]); int row = pivot_category_create_leaf ( mrsets->root, pivot_value_new_user_text (mrset->name, -1)); if (mrset->label != NULL) pivot_table_put2 (table, 0, row, pivot_value_new_user_text (mrset->label, -1)); pivot_table_put2 (table, 1, row, pivot_value_new_text (mrset->type == MRSET_MD ? _("Dichotomies") : _("Categories"))); if (mrset->type == MRSET_MD) pivot_table_put2 (table, 2, row, pivot_value_new_value ( &mrset->counted, mrset->width, &F_8_0, dict_get_encoding (dict))); /* Variable names. */ struct string var_names = DS_EMPTY_INITIALIZER; for (size_t j = 0; j < mrset->n_vars; j++) ds_put_format (&var_names, "%s\n", var_get_name (mrset->vars[j])); ds_chomp_byte (&var_names, '\n'); pivot_table_put2 (table, 3, row, pivot_value_new_user_text_nocopy ( ds_steal_cstr (&var_names))); } free (mrset_names); stringi_set_destroy (&mrset_names_set); pivot_table_submit (table); return true; } pspp-1.4.1/src/language/dictionary/variable-label.c0000644000175000017500000000332313320146056021641 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 1997-9, 2000, 2010, 2011, 2014 Free Software Foundation, Inc. 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 3 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, see . */ #include #include #include #include "data/dataset.h" #include "data/dictionary.h" #include "data/variable.h" #include "language/command.h" #include "language/lexer/lexer.h" #include "language/lexer/variable-parser.h" #include "libpspp/message.h" #include "gl/xalloc.h" #include "gettext.h" #define _(msgid) gettext (msgid) int cmd_variable_labels (struct lexer *lexer, struct dataset *ds) { struct dictionary *dict = dataset_dict (ds); do { struct variable **v; size_t nv; size_t i; if (!parse_variables (lexer, dict, &v, &nv, PV_NONE)) return CMD_FAILURE; if (!lex_force_string (lexer)) { free (v); return CMD_FAILURE; } for (i = 0; i < nv; i++) var_set_label (v[i], lex_tokcstr (lexer)); lex_get (lexer); while (lex_token (lexer) == T_SLASH) lex_get (lexer); free (v); } while (lex_token (lexer) != T_ENDCMD); return CMD_SUCCESS; } pspp-1.4.1/src/language/dictionary/modify-variables.c0000644000175000017500000003775013673465023022260 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 1997-9, 2000, 2010, 2011, 2012 Free Software Foundation, Inc. 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 3 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, see . */ #include #include #include "data/dataset.h" #include "data/dictionary.h" #include "data/variable.h" #include "language/command.h" #include "language/lexer/lexer.h" #include "language/lexer/variable-parser.h" #include "libpspp/array.h" #include "libpspp/assertion.h" #include "libpspp/compiler.h" #include "libpspp/i18n.h" #include "libpspp/message.h" #include "libpspp/misc.h" #include "libpspp/str.h" #include "gl/xalloc.h" #include "gettext.h" #define _(msgid) gettext (msgid) /* These control the ordering produced by compare_variables_given_ordering(). */ struct ordering { bool forward; /* true=FORWARD, false=BACKWARD. */ bool positional; /* true=POSITIONAL, false=ALPHA. */ }; /* Increasing order of variable index. */ static struct ordering forward_positional_ordering = {1, 1}; static int compare_variables_given_ordering (const void *, const void *, const void *ordering); /* Explains how to modify the variables in a dictionary. */ struct var_modification { /* New variable ordering. */ struct variable **reorder_vars; size_t n_reorder; /* DROP/KEEP information. */ struct variable **drop_vars; size_t n_drop; /* New variable names. */ struct variable **rename_vars; char **new_names; size_t n_rename; }; static bool rearrange_dict (struct dictionary *d, const struct var_modification *vm); /* Performs MODIFY VARS command. */ int cmd_modify_vars (struct lexer *lexer, struct dataset *ds) { if (proc_make_temporary_transformations_permanent (ds)) msg (SE, _("%s may not be used after %s. " "Temporary transformations will be made permanent."), "MODIFY VARS", "TEMPORARY"); /* Bits indicated whether we've already encountered a subcommand of this type. */ unsigned int already_encountered = 0; /* Return code. */ int ret_code = CMD_CASCADING_FAILURE; /* What we are going to do to the active dataset. */ struct var_modification vm = { .reorder_vars = NULL, .n_reorder = 0, .rename_vars = NULL, .new_names = NULL, .n_rename = 0, .drop_vars = NULL, .n_drop = 0, }; /* Parse each subcommand. */ lex_match (lexer, T_SLASH); for (;;) { if (lex_match_id (lexer, "REORDER")) { if (already_encountered & 1) { lex_sbc_only_once ("REORDER"); goto done; } already_encountered |= 1; struct variable **v = NULL; size_t nv = 0; lex_match (lexer, T_EQUALS); do { struct ordering ordering; size_t prev_nv = nv; ordering.forward = ordering.positional = true; for (;;) { if (lex_match_id (lexer, "FORWARD")) ordering.forward = true; else if (lex_match_id (lexer, "BACKWARD")) ordering.forward = false; else if (lex_match_id (lexer, "POSITIONAL")) ordering.positional = true; else if (lex_match_id (lexer, "ALPHA")) ordering.positional = false; else break; } if (lex_match (lexer, T_ALL) || lex_token (lexer) == T_SLASH || lex_token (lexer) == T_ENDCMD) { if (prev_nv != 0) { msg (SE, _("Cannot specify ALL after specifying a set " "of variables.")); goto done; } dict_get_vars_mutable (dataset_dict (ds), &v, &nv, DC_SYSTEM); } else { if (!lex_match (lexer, T_LPAREN)) { lex_error_expecting (lexer, "`('"); free (v); goto done; } if (!parse_variables (lexer, dataset_dict (ds), &v, &nv, PV_APPEND | PV_NO_DUPLICATE)) { free (v); goto done; } if (!lex_match (lexer, T_RPAREN)) { lex_error_expecting (lexer, "`)'"); free (v); goto done; } } if (!ordering.positional) sort (&v[prev_nv], nv - prev_nv, sizeof *v, compare_variables_given_ordering, &ordering); else if (!ordering.forward) reverse_array(&v[prev_nv], nv - prev_nv, sizeof *v); } while (lex_token (lexer) != T_SLASH && lex_token (lexer) != T_ENDCMD); vm.reorder_vars = v; vm.n_reorder = nv; } else if (lex_match_id (lexer, "RENAME")) { if (already_encountered & 2) { lex_sbc_only_once ("RENAME"); goto done; } already_encountered |= 2; lex_match (lexer, T_EQUALS); do { size_t prev_nv_1 = vm.n_rename; size_t prev_nv_2 = vm.n_rename; if (!lex_match (lexer, T_LPAREN)) { lex_error_expecting (lexer, "`('"); goto done; } if (!parse_variables (lexer, dataset_dict (ds), &vm.rename_vars, &vm.n_rename, PV_APPEND | PV_NO_DUPLICATE)) goto done; if (!lex_match (lexer, T_EQUALS)) { lex_error_expecting (lexer, "`='"); goto done; } if (!parse_DATA_LIST_vars (lexer, dataset_dict (ds), &vm.new_names, &prev_nv_1, PV_APPEND)) goto done; if (prev_nv_1 != vm.n_rename) { msg (SE, _("Differing number of variables in old name list " "(%zu) and in new name list (%zu)."), vm.n_rename - prev_nv_2, prev_nv_1 - prev_nv_2); for (size_t i = 0; i < prev_nv_1; i++) free (vm.new_names[i]); free (vm.new_names); vm.new_names = NULL; goto done; } if (!lex_match (lexer, T_RPAREN)) { lex_error_expecting (lexer, "`)'"); goto done; } } while (lex_token (lexer) != T_ENDCMD && lex_token (lexer) != T_SLASH); } else if (lex_match_id (lexer, "KEEP")) { if (already_encountered & 4) { msg (SE, _("%s subcommand may be given at most once. It may " "not be given in conjunction with the %s subcommand."), "KEEP", "DROP"); goto done; } already_encountered |= 4; struct variable **keep_vars, **drop_vars; size_t n_keep, n_drop; lex_match (lexer, T_EQUALS); if (!parse_variables (lexer, dataset_dict (ds), &keep_vars, &n_keep, PV_NONE)) goto done; /* Transform the list of variables to keep into a list of variables to drop. First sort the keep list, then figure out which variables are missing. */ sort (keep_vars, n_keep, sizeof *keep_vars, compare_variables_given_ordering, &forward_positional_ordering); struct variable **all_vars; size_t n_all; dict_get_vars_mutable (dataset_dict (ds), &all_vars, &n_all, 0); assert (n_all >= n_keep); n_drop = n_all - n_keep; drop_vars = xnmalloc (n_drop, sizeof *keep_vars); if (set_difference (all_vars, n_all, keep_vars, n_keep, sizeof *all_vars, drop_vars, compare_variables_given_ordering, &forward_positional_ordering) != n_drop) NOT_REACHED (); free (keep_vars); free (all_vars); vm.drop_vars = drop_vars; vm.n_drop = n_drop; } else if (lex_match_id (lexer, "DROP")) { struct variable **drop_vars; size_t n_drop; if (already_encountered & 4) { msg (SE, _("%s subcommand may be given at most once. It may " "not be given in conjunction with the %s " "subcommand."), "DROP", "KEEP" ); goto done; } already_encountered |= 4; lex_match (lexer, T_EQUALS); if (!parse_variables (lexer, dataset_dict (ds), &drop_vars, &n_drop, PV_NONE)) goto done; vm.drop_vars = drop_vars; vm.n_drop = n_drop; if (n_drop == dict_get_var_cnt (dataset_dict (ds))) { msg (SE, _("%s may not be used to delete all variables " "from the active dataset dictionary. " "Use %s instead."), "MODIFY VARS", "NEW FILE"); goto done; } } else if (lex_match_id (lexer, "MAP")) { struct dictionary *temp = dict_clone (dataset_dict (ds)); int success = rearrange_dict (temp, &vm); if (success) { /* FIXME: display new dictionary. */ } dict_unref (temp); } else { if (lex_token (lexer) == T_ID) msg (SE, _("Unrecognized subcommand name `%s'."), lex_tokcstr (lexer)); else msg (SE, _("Subcommand name expected.")); goto done; } if (lex_token (lexer) == T_ENDCMD) break; if (lex_token (lexer) != T_SLASH) { lex_error_expecting (lexer, "`/'", "`.'"); goto done; } lex_get (lexer); } if (already_encountered & (1 | 4)) { /* Read the data. */ if (!proc_execute (ds)) goto done; } if (!rearrange_dict (dataset_dict (ds), &vm)) goto done; ret_code = CMD_SUCCESS; done: free (vm.reorder_vars); free (vm.rename_vars); if (vm.new_names) for (size_t i = 0; i < vm.n_rename; i++) free (vm.new_names[i]); free (vm.new_names); free (vm.drop_vars); return ret_code; } /* Compares A and B according to the settings in ORDERING, returning a strcmp()-type result. */ static int compare_variables_given_ordering (const void *a_, const void *b_, const void *ordering_) { struct variable *const *pa = a_; struct variable *const *pb = b_; const struct variable *a = *pa; const struct variable *b = *pb; const struct ordering *ordering = ordering_; int result; if (ordering->positional) { size_t a_index = var_get_dict_index (a); size_t b_index = var_get_dict_index (b); result = a_index < b_index ? -1 : a_index > b_index; } else result = utf8_strcasecmp (var_get_name (a), var_get_name (b)); if (!ordering->forward) result = -result; return result; } /* Pairs a variable with a new name. */ struct var_renaming { struct variable *var; const char *new_name; }; /* A algo_compare_func that compares new_name members in struct var_renaming structures A and B. */ static int compare_var_renaming_by_new_name (const void *a_, const void *b_, const void *aux UNUSED) { const struct var_renaming *a = a_; const struct var_renaming *b = b_; return utf8_strcasecmp (a->new_name, b->new_name); } /* Returns true if performing VM on dictionary D would not cause problems such as duplicate variable names. Returns false otherwise, and issues an error message. */ static bool validate_var_modification (const struct dictionary *d, const struct var_modification *vm) { /* Variable reordering can't be a problem, so we don't simulate it. Variable renaming can cause duplicate names, but dropping variables can eliminate them, so we simulate both of those. */ /* All variables, in index order. */ struct variable **all_vars; size_t n_all; dict_get_vars_mutable (d, &all_vars, &n_all, 0); /* Drop variables, in index order. */ size_t n_drop = vm->n_drop; struct variable **drop_vars = xnmalloc (n_drop, sizeof *drop_vars); memcpy (drop_vars, vm->drop_vars, n_drop * sizeof *drop_vars); sort (drop_vars, n_drop, sizeof *drop_vars, compare_variables_given_ordering, &forward_positional_ordering); /* Keep variables, in index order. */ assert (n_all >= n_drop); size_t n_keep = n_all - n_drop; struct variable **keep_vars = xnmalloc (n_keep, sizeof *keep_vars); if (set_difference (all_vars, n_all, drop_vars, n_drop, sizeof *all_vars, keep_vars, compare_variables_given_ordering, &forward_positional_ordering) != n_keep) NOT_REACHED (); /* Copy variables into var_renaming array. */ struct var_renaming *var_renaming = xnmalloc (n_keep, sizeof *var_renaming); for (size_t i = 0; i < n_keep; i++) { var_renaming[i].var = keep_vars[i]; var_renaming[i].new_name = var_get_name (keep_vars[i]); } /* Rename variables in var_renaming array. */ for (size_t i = 0; i < vm->n_rename; i++) { struct variable *const *kv; struct var_renaming *vr; /* Get the var_renaming element. */ kv = binary_search (keep_vars, n_keep, sizeof *keep_vars, &vm->rename_vars[i], compare_variables_given_ordering, &forward_positional_ordering); if (kv == NULL) continue; vr = var_renaming + (kv - keep_vars); vr->new_name = vm->new_names[i]; } /* Sort var_renaming array by new names and check for duplicates. */ sort (var_renaming, n_keep, sizeof *var_renaming, compare_var_renaming_by_new_name, NULL); bool ok = !adjacent_find_equal (var_renaming, n_keep, sizeof *var_renaming, compare_var_renaming_by_new_name, NULL); /* Clean up. */ free (all_vars); free (keep_vars); free (drop_vars); free (var_renaming); return ok; } /* Reorders, removes, and renames variables in dictionary D according to VM. Returns true if successful, false if there would have been duplicate variable names if the modifications had been carried out. In the latter case, the dictionary is not modified. */ static bool rearrange_dict (struct dictionary *d, const struct var_modification *vm) { /* Check whether the modifications will cause duplicate names. */ if (!validate_var_modification (d, vm)) return false; /* Record the old names of variables to rename. After variables are deleted, we can't depend on the variables to still exist, but we can still look them up by name. */ char **rename_old_names = xnmalloc (vm->n_rename, sizeof *rename_old_names); for (size_t i = 0; i < vm->n_rename; i++) rename_old_names[i] = xstrdup (var_get_name (vm->rename_vars[i])); /* Reorder and delete variables. */ dict_reorder_vars (d, vm->reorder_vars, vm->n_reorder); dict_delete_vars (d, vm->drop_vars, vm->n_drop); /* Compose lists of variables to rename and their new names. */ struct variable **rename_vars = xnmalloc (vm->n_rename, sizeof *rename_vars); char **rename_new_names = xnmalloc (vm->n_rename, sizeof *rename_new_names); size_t n_rename = 0; for (size_t i = 0; i < vm->n_rename; i++) { struct variable *var = dict_lookup_var (d, rename_old_names[i]); if (var == NULL) continue; rename_vars[n_rename] = var; rename_new_names[n_rename] = vm->new_names[i]; n_rename++; } /* Do renaming. */ if (dict_rename_vars (d, rename_vars, rename_new_names, n_rename, NULL) == 0) NOT_REACHED (); /* Clean up. */ for (size_t i = 0; i < vm->n_rename; i++) free (rename_old_names[i]); free (rename_old_names); free (rename_vars); free (rename_new_names); return true; } pspp-1.4.1/src/language/dictionary/value-labels.c0000644000175000017500000001077113320146056021360 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 1997-9, 2000, 2009, 2010, 2011 Free Software Foundation, Inc. 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 3 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, see . */ #include #include #include #include "data/dataset.h" #include "data/dictionary.h" #include "data/value-labels.h" #include "data/variable.h" #include "language/command.h" #include "language/lexer/lexer.h" #include "language/lexer/value-parser.h" #include "language/lexer/variable-parser.h" #include "libpspp/i18n.h" #include "libpspp/message.h" #include "libpspp/str.h" #include "gl/xalloc.h" #include "gettext.h" #define _(msgid) gettext (msgid) /* Declarations. */ static int do_value_labels (struct lexer *, const struct dictionary *dict, bool); static void erase_labels (struct variable **vars, size_t var_cnt); static int get_label (struct lexer *, struct variable **vars, size_t var_cnt, const char *dict_encoding); /* Stubs. */ int cmd_value_labels (struct lexer *lexer, struct dataset *ds) { return do_value_labels (lexer, dataset_dict (ds), true); } int cmd_add_value_labels (struct lexer *lexer, struct dataset *ds) { return do_value_labels (lexer, dataset_dict (ds), false); } /* Do it. */ static int do_value_labels (struct lexer *lexer, const struct dictionary *dict, bool erase) { struct variable **vars; /* Variable list. */ size_t var_cnt; /* Number of variables. */ int parse_err=0; /* true if error parsing variables */ lex_match (lexer, T_SLASH); while (lex_token (lexer) != T_ENDCMD) { parse_err = !parse_variables (lexer, dict, &vars, &var_cnt, PV_SAME_WIDTH); if (var_cnt < 1) { free(vars); return CMD_FAILURE; } if (erase) erase_labels (vars, var_cnt); while (lex_token (lexer) != T_SLASH && lex_token (lexer) != T_ENDCMD) if (!get_label (lexer, vars, var_cnt, dict_get_encoding (dict))) goto lossage; if (lex_token (lexer) != T_SLASH) { free (vars); break; } lex_get (lexer); free (vars); } return parse_err ? CMD_FAILURE : CMD_SUCCESS; lossage: free (vars); return CMD_FAILURE; } /* Erases all the labels for the VAR_CNT variables in VARS. */ static void erase_labels (struct variable **vars, size_t var_cnt) { size_t i; /* Erase old value labels if desired. */ for (i = 0; i < var_cnt; i++) var_clear_value_labels (vars[i]); } /* Parse all the labels for the VAR_CNT variables in VARS and add the specified labels to those variables. */ static int get_label (struct lexer *lexer, struct variable **vars, size_t var_cnt, const char *dict_encoding) { /* Parse all the labels and add them to the variables. */ do { enum { MAX_LABEL_LEN = 255 }; int width = var_get_width (vars[0]); union value value; struct string label; size_t trunc_len; size_t i; /* Set value. */ value_init (&value, width); if (!parse_value (lexer, &value, vars[0])) { value_destroy (&value, width); return 0; } lex_match (lexer, T_COMMA); /* Set label. */ if (lex_token (lexer) != T_ID && !lex_force_string (lexer)) { value_destroy (&value, width); return 0; } ds_init_substring (&label, lex_tokss (lexer)); trunc_len = utf8_encoding_trunc_len (ds_cstr (&label), dict_encoding, MAX_LABEL_LEN); if (ds_length (&label) > trunc_len) { msg (SW, _("Truncating value label to %d bytes."), MAX_LABEL_LEN); ds_truncate (&label, trunc_len); } for (i = 0; i < var_cnt; i++) var_replace_value_label (vars[i], &value, ds_cstr (&label)); ds_destroy (&label); value_destroy (&value, width); lex_get (lexer); lex_match (lexer, T_COMMA); } while (lex_token (lexer) != T_SLASH && lex_token (lexer) != T_ENDCMD); return 1; } pspp-1.4.1/src/language/dictionary/split-file.h0000644000175000017500000000160213320146056021052 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2006 Free Software Foundation, Inc. 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 3 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, see . */ #ifndef SPLIT_FILE_H #define SPLIT_FILE_H 1 void output_split_file_values (const struct dataset *ds, const struct ccase *); #endif /* split-file.h */ pspp-1.4.1/src/language/xforms/0000755000175000017500000000000013725012647016012 5ustar00blpblp00000000000000pspp-1.4.1/src/language/xforms/compute.c0000644000175000017500000003104313320146056017624 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 1997-9, 2000, 2009, 2010, 2011, 2014 Free Software Foundation, Inc. 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 3 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, see . */ #include #include #include #include #include "data/case.h" #include "data/dataset.h" #include "data/dictionary.h" #include "data/transformations.h" #include "data/variable.h" #include "data/vector.h" #include "language/command.h" #include "language/expressions/public.h" #include "language/lexer/lexer.h" #include "libpspp/message.h" #include "libpspp/misc.h" #include "libpspp/str.h" #include "gl/xalloc.h" #include "gettext.h" #define _(msgid) gettext (msgid) struct compute_trns; struct lvalue; /* Target of a COMPUTE or IF assignment, either a variable or a vector element. */ static struct lvalue *lvalue_parse (struct lexer *lexer, struct dataset *); static int lvalue_get_type (const struct lvalue *); static bool lvalue_is_vector (const struct lvalue *); static void lvalue_finalize (struct lvalue *, struct compute_trns *, struct dictionary *); static void lvalue_destroy (struct lvalue *, struct dictionary *); /* COMPUTE and IF transformation. */ struct compute_trns { /* Test expression (IF only). */ struct expression *test; /* Test expression. */ /* Variable lvalue, if variable != NULL. */ struct variable *variable; /* Destination variable, if any. */ int width; /* Lvalue string width; 0=numeric. */ /* Vector lvalue, if vector != NULL. */ const struct vector *vector; /* Destination vector, if any. */ struct expression *element; /* Destination vector element expr. */ /* Rvalue. */ struct expression *rvalue; /* Rvalue expression. */ }; static struct expression *parse_rvalue (struct lexer *lexer, const struct lvalue *, struct dataset *); static struct compute_trns *compute_trns_create (void); static trns_proc_func *get_proc_func (const struct lvalue *); static trns_free_func compute_trns_free; /* COMPUTE. */ int cmd_compute (struct lexer *lexer, struct dataset *ds) { struct dictionary *dict = dataset_dict (ds); struct lvalue *lvalue = NULL; struct compute_trns *compute = NULL; compute = compute_trns_create (); lvalue = lvalue_parse (lexer, ds); if (lvalue == NULL) goto fail; if (!lex_force_match (lexer, T_EQUALS)) goto fail; compute->rvalue = parse_rvalue (lexer, lvalue, ds); if (compute->rvalue == NULL) goto fail; add_transformation (ds, get_proc_func (lvalue), compute_trns_free, compute); lvalue_finalize (lvalue, compute, dict); return CMD_SUCCESS; fail: lvalue_destroy (lvalue, dict); compute_trns_free (compute); return CMD_CASCADING_FAILURE; } /* Transformation functions. */ /* Handle COMPUTE or IF with numeric target variable. */ static int compute_num (void *compute_, struct ccase **c, casenumber case_num) { struct compute_trns *compute = compute_; if (compute->test == NULL || expr_evaluate_num (compute->test, *c, case_num) == 1.0) { *c = case_unshare (*c); case_data_rw (*c, compute->variable)->f = expr_evaluate_num (compute->rvalue, *c, case_num); } return TRNS_CONTINUE; } /* Handle COMPUTE or IF with numeric vector element target variable. */ static int compute_num_vec (void *compute_, struct ccase **c, casenumber case_num) { struct compute_trns *compute = compute_; if (compute->test == NULL || expr_evaluate_num (compute->test, *c, case_num) == 1.0) { double index; /* Index into the vector. */ int rindx; /* Rounded index value. */ index = expr_evaluate_num (compute->element, *c, case_num); rindx = floor (index + EPSILON); if (index == SYSMIS || rindx < 1 || rindx > vector_get_var_cnt (compute->vector)) { if (index == SYSMIS) msg (SW, _("When executing COMPUTE: SYSMIS is not a valid value " "as an index into vector %s."), vector_get_name (compute->vector)); else msg (SW, _("When executing COMPUTE: %.*g is not a valid value as " "an index into vector %s."), DBL_DIG + 1, index, vector_get_name (compute->vector)); return TRNS_CONTINUE; } *c = case_unshare (*c); case_data_rw (*c, vector_get_var (compute->vector, rindx - 1))->f = expr_evaluate_num (compute->rvalue, *c, case_num); } return TRNS_CONTINUE; } /* Handle COMPUTE or IF with string target variable. */ static int compute_str (void *compute_, struct ccase **c, casenumber case_num) { struct compute_trns *compute = compute_; if (compute->test == NULL || expr_evaluate_num (compute->test, *c, case_num) == 1.0) { char *s; *c = case_unshare (*c); s = CHAR_CAST_BUG (char *, case_str_rw (*c, compute->variable)); expr_evaluate_str (compute->rvalue, *c, case_num, s, compute->width); } return TRNS_CONTINUE; } /* Handle COMPUTE or IF with string vector element target variable. */ static int compute_str_vec (void *compute_, struct ccase **c, casenumber case_num) { struct compute_trns *compute = compute_; if (compute->test == NULL || expr_evaluate_num (compute->test, *c, case_num) == 1.0) { double index; /* Index into the vector. */ int rindx; /* Rounded index value. */ struct variable *vr; /* Variable reference by indexed vector. */ index = expr_evaluate_num (compute->element, *c, case_num); rindx = floor (index + EPSILON); if (index == SYSMIS) { msg (SW, _("When executing COMPUTE: SYSMIS is not a valid " "value as an index into vector %s."), vector_get_name (compute->vector)); return TRNS_CONTINUE; } else if (rindx < 1 || rindx > vector_get_var_cnt (compute->vector)) { msg (SW, _("When executing COMPUTE: %.*g is not a valid value as " "an index into vector %s."), DBL_DIG + 1, index, vector_get_name (compute->vector)); return TRNS_CONTINUE; } vr = vector_get_var (compute->vector, rindx - 1); *c = case_unshare (*c); expr_evaluate_str (compute->rvalue, *c, case_num, CHAR_CAST_BUG (char *, case_str_rw (*c, vr)), var_get_width (vr)); } return TRNS_CONTINUE; } /* IF. */ int cmd_if (struct lexer *lexer, struct dataset *ds) { struct dictionary *dict = dataset_dict (ds); struct compute_trns *compute = NULL; struct lvalue *lvalue = NULL; compute = compute_trns_create (); /* Test expression. */ compute->test = expr_parse (lexer, ds, EXPR_BOOLEAN); if (compute->test == NULL) goto fail; /* Lvalue variable. */ lvalue = lvalue_parse (lexer, ds); if (lvalue == NULL) goto fail; /* Rvalue expression. */ if (!lex_force_match (lexer, T_EQUALS)) goto fail; compute->rvalue = parse_rvalue (lexer, lvalue, ds); if (compute->rvalue == NULL) goto fail; add_transformation (ds, get_proc_func (lvalue), compute_trns_free, compute); lvalue_finalize (lvalue, compute, dict); return CMD_SUCCESS; fail: lvalue_destroy (lvalue, dict); compute_trns_free (compute); return CMD_CASCADING_FAILURE; } /* Code common to COMPUTE and IF. */ static trns_proc_func * get_proc_func (const struct lvalue *lvalue) { bool is_numeric = lvalue_get_type (lvalue) == VAL_NUMERIC; bool is_vector = lvalue_is_vector (lvalue); return (is_numeric ? (is_vector ? compute_num_vec : compute_num) : (is_vector ? compute_str_vec : compute_str)); } /* Parses and returns an rvalue expression of the same type as LVALUE, or a null pointer on failure. */ static struct expression * parse_rvalue (struct lexer *lexer, const struct lvalue *lvalue, struct dataset *ds) { bool is_numeric = lvalue_get_type (lvalue) == VAL_NUMERIC; return expr_parse (lexer, ds, is_numeric ? EXPR_NUMBER : EXPR_STRING); } /* Returns a new struct compute_trns after initializing its fields. */ static struct compute_trns * compute_trns_create (void) { struct compute_trns *compute = xmalloc (sizeof *compute); compute->test = NULL; compute->variable = NULL; compute->vector = NULL; compute->element = NULL; compute->rvalue = NULL; return compute; } /* Deletes all the fields in COMPUTE. */ static bool compute_trns_free (void *compute_) { struct compute_trns *compute = compute_; if (compute != NULL) { expr_free (compute->test); expr_free (compute->element); expr_free (compute->rvalue); free (compute); } return true; } /* COMPUTE or IF target variable or vector element. For a variable, the `variable' member is non-null. For a vector element, the `vector' member is non-null. */ struct lvalue { struct variable *variable; /* Destination variable. */ bool is_new_variable; /* Did we create the variable? */ const struct vector *vector; /* Destination vector, if any, or NULL. */ struct expression *element; /* Destination vector element, or NULL. */ }; /* Parses the target variable or vector element into a new `struct lvalue', which is returned. */ static struct lvalue * lvalue_parse (struct lexer *lexer, struct dataset *ds) { struct dictionary *dict = dataset_dict (ds); struct lvalue *lvalue; lvalue = xmalloc (sizeof *lvalue); lvalue->variable = NULL; lvalue->is_new_variable = false; lvalue->vector = NULL; lvalue->element = NULL; if (!lex_force_id (lexer)) goto lossage; if (lex_next_token (lexer, 1) == T_LPAREN) { /* Vector. */ lvalue->vector = dict_lookup_vector (dict, lex_tokcstr (lexer)); if (lvalue->vector == NULL) { msg (SE, _("There is no vector named %s."), lex_tokcstr (lexer)); goto lossage; } /* Vector element. */ lex_get (lexer); if (!lex_force_match (lexer, T_LPAREN)) goto lossage; lvalue->element = expr_parse (lexer, ds, EXPR_NUMBER); if (lvalue->element == NULL) goto lossage; if (!lex_force_match (lexer, T_RPAREN)) goto lossage; } else { /* Variable name. */ const char *var_name = lex_tokcstr (lexer); lvalue->variable = dict_lookup_var (dict, var_name); if (lvalue->variable == NULL) { lvalue->variable = dict_create_var_assert (dict, var_name, 0); lvalue->is_new_variable = true; } lex_get (lexer); } return lvalue; lossage: lvalue_destroy (lvalue, dict); return NULL; } /* Returns the type (NUMERIC or ALPHA) of the target variable or vector in LVALUE. */ static int lvalue_get_type (const struct lvalue *lvalue) { return (lvalue->variable != NULL ? var_get_type (lvalue->variable) : vector_get_type (lvalue->vector)); } /* Returns true if LVALUE has a vector as its target. */ static bool lvalue_is_vector (const struct lvalue *lvalue) { return lvalue->vector != NULL; } /* Finalizes making LVALUE the target of COMPUTE, by creating the target variable if necessary and setting fields in COMPUTE. */ static void lvalue_finalize (struct lvalue *lvalue, struct compute_trns *compute, struct dictionary *dict) { if (lvalue->vector == NULL) { compute->variable = lvalue->variable; compute->width = var_get_width (compute->variable); /* Goofy behavior, but compatible: Turn off LEAVE. */ if (!var_must_leave (compute->variable)) var_set_leave (compute->variable, false); /* Prevent lvalue_destroy from deleting variable. */ lvalue->is_new_variable = false; } else { compute->vector = lvalue->vector; compute->element = lvalue->element; lvalue->element = NULL; } lvalue_destroy (lvalue, dict); } /* Destroys LVALUE. */ static void lvalue_destroy (struct lvalue *lvalue, struct dictionary *dict) { if (lvalue == NULL) return; if (lvalue->is_new_variable) dict_delete_var (dict, lvalue->variable); expr_free (lvalue->element); free (lvalue); } pspp-1.4.1/src/language/xforms/automake.mk0000644000175000017500000000201013571051220020127 0ustar00blpblp00000000000000# PSPP - a program for statistical analysis. # Copyright (C) 2017 Free Software Foundation, Inc. # # 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 3 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, see . # ## Process this file with automake to produce Makefile.in -*- makefile -*- language_xforms_sources = \ src/language/xforms/compute.c \ src/language/xforms/count.c \ src/language/xforms/fail.c \ src/language/xforms/sample.c \ src/language/xforms/recode.c \ src/language/xforms/select-if.c pspp-1.4.1/src/language/xforms/count.c0000644000175000017500000002330113320146056017276 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 1997-9, 2000, 2009, 2010, 2011, 2015 Free Software Foundation, Inc. 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 3 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, see . */ #include #include #include "data/case.h" #include "data/dataset.h" #include "data/dictionary.h" #include "data/transformations.h" #include "data/variable.h" #include "language/command.h" #include "language/lexer/lexer.h" #include "language/lexer/value-parser.h" #include "language/lexer/variable-parser.h" #include "libpspp/compiler.h" #include "libpspp/i18n.h" #include "libpspp/message.h" #include "libpspp/pool.h" #include "libpspp/str.h" #include "gl/xalloc.h" #include "gettext.h" #define _(msgid) gettext (msgid) /* Value or range? */ enum value_type { CNT_SINGLE, /* Single value. */ CNT_RANGE /* a <= x <= b. */ }; /* Numeric count criteria. */ struct num_value { enum value_type type; /* How to interpret a, b. */ double a, b; /* Values to count. */ }; struct criteria { struct criteria *next; /* Variables to count. */ const struct variable **vars; size_t var_cnt; /* Count special values? */ bool count_system_missing; /* Count system missing? */ bool count_user_missing; /* Count user missing? */ /* Criterion values. */ size_t value_cnt; union { struct num_value *num; char **str; } values; }; struct dst_var { struct dst_var *next; struct variable *var; /* Destination variable. */ char *name; /* Name of dest var. */ struct criteria *crit; /* The criteria specifications. */ }; struct count_trns { struct dst_var *dst_vars; struct pool *pool; }; static trns_proc_func count_trns_proc; static trns_free_func count_trns_free; static bool parse_numeric_criteria (struct lexer *, struct pool *, struct criteria *); static bool parse_string_criteria (struct lexer *, struct pool *, struct criteria *, const char *dict_encoding); int cmd_count (struct lexer *lexer, struct dataset *ds) { struct dst_var *dv; /* Destination var being parsed. */ struct count_trns *trns; /* Transformation. */ /* Parses each slash-delimited specification. */ trns = pool_create_container (struct count_trns, pool); trns->dst_vars = dv = pool_alloc (trns->pool, sizeof *dv); for (;;) { struct criteria *crit; /* Initialize this struct dst_var to ensure proper cleanup. */ dv->next = NULL; dv->var = NULL; dv->crit = NULL; /* Get destination variable, or at least its name. */ if (!lex_force_id (lexer)) goto fail; dv->var = dict_lookup_var (dataset_dict (ds), lex_tokcstr (lexer)); if (dv->var != NULL) { if (var_is_alpha (dv->var)) { msg (SE, _("Destination cannot be a string variable.")); goto fail; } } else dv->name = pool_strdup (trns->pool, lex_tokcstr (lexer)); lex_get (lexer); if (!lex_force_match (lexer, T_EQUALS)) goto fail; crit = dv->crit = pool_alloc (trns->pool, sizeof *crit); for (;;) { struct dictionary *dict = dataset_dict (ds); bool ok; crit->next = NULL; crit->vars = NULL; if (!parse_variables_const (lexer, dict, &crit->vars, &crit->var_cnt, PV_DUPLICATE | PV_SAME_TYPE)) goto fail; pool_register (trns->pool, free, crit->vars); if (!lex_force_match (lexer, T_LPAREN)) goto fail; crit->value_cnt = 0; if (var_is_numeric (crit->vars[0])) ok = parse_numeric_criteria (lexer, trns->pool, crit); else ok = parse_string_criteria (lexer, trns->pool, crit, dict_get_encoding (dict)); if (!ok) goto fail; if (lex_token (lexer) == T_SLASH || lex_token (lexer) == T_ENDCMD) break; crit = crit->next = pool_alloc (trns->pool, sizeof *crit); } if (lex_token (lexer) == T_ENDCMD) break; if (!lex_force_match (lexer, T_SLASH)) goto fail; dv = dv->next = pool_alloc (trns->pool, sizeof *dv); } /* Create all the nonexistent destination variables. */ for (dv = trns->dst_vars; dv; dv = dv->next) if (dv->var == NULL) { /* It's valid, though motivationally questionable, to count to the same dest var more than once. */ dv->var = dict_lookup_var (dataset_dict (ds), dv->name); if (dv->var == NULL) dv->var = dict_create_var_assert (dataset_dict (ds), dv->name, 0); } add_transformation (ds, count_trns_proc, count_trns_free, trns); return CMD_SUCCESS; fail: count_trns_free (trns); return CMD_FAILURE; } /* Parses a set of numeric criterion values. Returns success. */ static bool parse_numeric_criteria (struct lexer *lexer, struct pool *pool, struct criteria *crit) { size_t allocated = 0; crit->values.num = NULL; crit->count_system_missing = false; crit->count_user_missing = false; for (;;) { double low, high; if (lex_match_id (lexer, "SYSMIS")) crit->count_system_missing = true; else if (lex_match_id (lexer, "MISSING")) crit->count_system_missing = crit->count_user_missing = true; else if (parse_num_range (lexer, &low, &high, NULL)) { struct num_value *cur; if (crit->value_cnt >= allocated) crit->values.num = pool_2nrealloc (pool, crit->values.num, &allocated, sizeof *crit->values.num); cur = &crit->values.num[crit->value_cnt++]; cur->type = low == high ? CNT_SINGLE : CNT_RANGE; cur->a = low; cur->b = high; } else return false; lex_match (lexer, T_COMMA); if (lex_match (lexer, T_RPAREN)) break; } return true; } /* Parses a set of string criteria values. Returns success. */ static bool parse_string_criteria (struct lexer *lexer, struct pool *pool, struct criteria *crit, const char *dict_encoding) { int len = 0; size_t allocated = 0; size_t i; for (i = 0; i < crit->var_cnt; i++) if (var_get_width (crit->vars[i]) > len) len = var_get_width (crit->vars[i]); crit->values.str = NULL; for (;;) { char **cur; char *s; if (crit->value_cnt >= allocated) crit->values.str = pool_2nrealloc (pool, crit->values.str, &allocated, sizeof *crit->values.str); if (!lex_force_string (lexer)) return false; s = recode_string (dict_encoding, "UTF-8", lex_tokcstr (lexer), ss_length (lex_tokss (lexer))); cur = &crit->values.str[crit->value_cnt++]; *cur = pool_alloc (pool, len + 1); str_copy_rpad (*cur, len + 1, s); lex_get (lexer); free (s); lex_match (lexer, T_COMMA); if (lex_match (lexer, T_RPAREN)) break; } return true; } /* Transformation. */ /* Counts the number of values in case C matching CRIT. */ static int count_numeric (struct criteria *crit, const struct ccase *c) { int counter = 0; size_t i; for (i = 0; i < crit->var_cnt; i++) { double x = case_num (c, crit->vars[i]); struct num_value *v; for (v = crit->values.num; v < crit->values.num + crit->value_cnt; v++) if (v->type == CNT_SINGLE ? x == v->a : x >= v->a && x <= v->b) { counter++; break; } if (var_is_num_missing (crit->vars[i], x, MV_ANY) && (x == SYSMIS ? crit->count_system_missing : crit->count_user_missing)) { counter++; continue; } } return counter; } /* Counts the number of values in case C matching CRIT. */ static int count_string (struct criteria *crit, const struct ccase *c) { int counter = 0; size_t i; for (i = 0; i < crit->var_cnt; i++) { char **v; for (v = crit->values.str; v < crit->values.str + crit->value_cnt; v++) if (!memcmp (case_str (c, crit->vars[i]), *v, var_get_width (crit->vars[i]))) { counter++; break; } } return counter; } /* Performs the COUNT transformation T on case C. */ static int count_trns_proc (void *trns_, struct ccase **c, casenumber case_num UNUSED) { struct count_trns *trns = trns_; struct dst_var *dv; *c = case_unshare (*c); for (dv = trns->dst_vars; dv; dv = dv->next) { struct criteria *crit; int counter; counter = 0; for (crit = dv->crit; crit; crit = crit->next) if (var_is_numeric (crit->vars[0])) counter += count_numeric (crit, *c); else counter += count_string (crit, *c); case_data_rw (*c, dv->var)->f = counter; } return TRNS_CONTINUE; } /* Destroys all dynamic data structures associated with TRNS. */ static bool count_trns_free (void *trns_) { struct count_trns *trns = trns_; pool_destroy (trns->pool); return true; } pspp-1.4.1/src/language/xforms/select-if.c0000644000175000017500000000630713320146056020030 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 1997-9, 2000, 2009, 2010, 2011 Free Software Foundation, Inc. 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 3 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, see . */ #include #include #include "data/dataset.h" #include "data/dictionary.h" #include "data/transformations.h" #include "data/variable.h" #include "language/command.h" #include "language/expressions/public.h" #include "language/lexer/lexer.h" #include "language/lexer/variable-parser.h" #include "libpspp/message.h" #include "libpspp/str.h" #include "gl/xalloc.h" #include "gettext.h" #define _(msgid) gettext (msgid) /* SELECT IF transformation. */ struct select_if_trns { struct expression *e; /* Test expression. */ }; static trns_proc_func select_if_proc; static trns_free_func select_if_free; /* Parses the SELECT IF transformation. */ int cmd_select_if (struct lexer *lexer, struct dataset *ds) { struct expression *e; struct select_if_trns *t; e = expr_parse (lexer, ds, EXPR_BOOLEAN); if (!e) return CMD_CASCADING_FAILURE; if (lex_token (lexer) != T_ENDCMD) { expr_free (e); lex_error (lexer, _("expecting end of command")); return CMD_CASCADING_FAILURE; } t = xmalloc (sizeof *t); t->e = e; add_transformation (ds, select_if_proc, select_if_free, t); return CMD_SUCCESS; } /* Performs the SELECT IF transformation T on case C. */ static int select_if_proc (void *t_, struct ccase **c, casenumber case_num) { struct select_if_trns *t = t_; return (expr_evaluate_num (t->e, *c, case_num) == 1.0 ? TRNS_CONTINUE : TRNS_DROP_CASE); } /* Frees SELECT IF transformation T. */ static bool select_if_free (void *t_) { struct select_if_trns *t = t_; expr_free (t->e); free (t); return true; } /* Parses the FILTER command. */ int cmd_filter (struct lexer *lexer, struct dataset *ds) { struct dictionary *dict = dataset_dict (ds); if (lex_match_id (lexer, "OFF")) dict_set_filter (dict, NULL); else if (lex_token (lexer) == T_ENDCMD) { msg (SW, _("Syntax error expecting OFF or BY. " "Turning off case filtering.")); dict_set_filter (dict, NULL); } else { struct variable *v; lex_match (lexer, T_BY); v = parse_variable (lexer, dict); if (!v) return CMD_FAILURE; if (var_is_alpha (v)) { msg (SE, _("The filter variable must be numeric.")); return CMD_FAILURE; } if (dict_class_from_id (var_get_name (v)) == DC_SCRATCH) { msg (SE, _("The filter variable may not be scratch.")); return CMD_FAILURE; } dict_set_filter (dict, v); } return CMD_SUCCESS; } pspp-1.4.1/src/language/xforms/fail.c0000644000175000017500000000261613320146056017067 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2007, 2009, 2010, 2011 Free Software Foundation, Inc. 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 3 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, see . */ #include #include #include "data/case.h" #include "data/dataset.h" #include "data/transformations.h" #include "language/command.h" #include "language/lexer/lexer.h" #include "libpspp/message.h" static int trns_fail (void *x, struct ccase **c, casenumber n); /* A transformation which is guaranteed to fail. */ static int trns_fail (void *x UNUSED, struct ccase **c UNUSED, casenumber n UNUSED) { msg (SE, "DEBUG XFORM FAIL transformation executed"); return TRNS_ERROR; } int cmd_debug_xform_fail (struct lexer *lexer UNUSED, struct dataset *ds) { add_transformation (ds, trns_fail, NULL, NULL); return CMD_SUCCESS; } pspp-1.4.1/src/language/xforms/recode.c0000644000175000017500000005366013670210420017415 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 1997-9, 2000, 2009, 2010, 2011 Free Software Foundation, Inc. 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 3 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, see . */ #include #include #include #include #include "data/case.h" #include "data/data-in.h" #include "data/dataset.h" #include "data/dictionary.h" #include "data/format.h" #include "data/transformations.h" #include "data/variable.h" #include "language/command.h" #include "language/lexer/lexer.h" #include "language/lexer/value-parser.h" #include "language/lexer/variable-parser.h" #include "libpspp/assertion.h" #include "libpspp/cast.h" #include "libpspp/compiler.h" #include "libpspp/i18n.h" #include "libpspp/message.h" #include "libpspp/pool.h" #include "libpspp/str.h" #include "gl/xalloc.h" #include "gettext.h" #define _(msgid) gettext (msgid) /* Definitions. */ /* Type of source value for RECODE. */ enum map_in_type { MAP_SINGLE, /* Specific value. */ MAP_RANGE, /* Range of values. */ MAP_SYSMIS, /* System missing value. */ MAP_MISSING, /* Any missing value. */ MAP_ELSE, /* Any value. */ MAP_CONVERT /* "123" => 123. */ }; /* Describes input values to be mapped. */ struct map_in { enum map_in_type type; /* One of MAP_*. */ union value x, y; /* Source values. */ }; /* Describes the value used as output from a mapping. */ struct map_out { bool copy_input; /* If true, copy input to output. */ union value value; /* If copy_input false, recoded value. */ int width; /* If copy_input false, output value width. */ }; /* Describes how to recode a single value or range of values into a single value. */ struct mapping { struct map_in in; /* Input values. */ struct map_out out; /* Output value. */ }; /* RECODE transformation. */ struct recode_trns { struct pool *pool; /* Variable types, for convenience. */ enum val_type src_type; /* src_vars[*] type. */ enum val_type dst_type; /* dst_vars[*] type. */ /* Variables. */ const struct variable **src_vars; /* Source variables. */ const struct variable **dst_vars; /* Destination variables. */ const struct dictionary *dst_dict; /* Dictionary of dst_vars */ char **dst_names; /* Name of dest variables, if they're new. */ size_t var_cnt; /* Number of variables. */ /* Mappings. */ struct mapping *mappings; /* Value mappings. */ size_t map_cnt; /* Number of mappings. */ int max_src_width; /* Maximum width of src_vars[*]. */ int max_dst_width; /* Maximum width of any map_out in mappings. */ }; static bool parse_src_vars (struct lexer *, struct recode_trns *, const struct dictionary *dict); static bool parse_mappings (struct lexer *, struct recode_trns *, const char *dict_encoding); static bool parse_dst_vars (struct lexer *, struct recode_trns *, const struct dictionary *dict); static void add_mapping (struct recode_trns *, size_t *map_allocated, const struct map_in *); static bool parse_map_in (struct lexer *lexer, struct map_in *, struct pool *, enum val_type src_type, size_t max_src_width, const char *dict_encoding); static void set_map_in_generic (struct map_in *, enum map_in_type); static void set_map_in_num (struct map_in *, enum map_in_type, double, double); static void set_map_in_str (struct map_in *, struct pool *, struct substring, size_t width, const char *dict_encoding); static bool parse_map_out (struct lexer *lexer, struct pool *, struct map_out *); static void set_map_out_num (struct map_out *, double); static void set_map_out_str (struct map_out *, struct pool *, struct substring); static bool enlarge_dst_widths (struct recode_trns *); static void create_dst_vars (struct recode_trns *, struct dictionary *); static trns_proc_func recode_trns_proc; static trns_free_func recode_trns_free; /* Parser. */ /* Parses the RECODE transformation. */ int cmd_recode (struct lexer *lexer, struct dataset *ds) { do { struct dictionary *dict = dataset_dict (ds); struct recode_trns *trns = pool_create_container (struct recode_trns, pool); /* Parse source variable names, then input to output mappings, then destintation variable names. */ if (!parse_src_vars (lexer, trns, dict) || !parse_mappings (lexer, trns, dict_get_encoding (dict)) || !parse_dst_vars (lexer, trns, dict)) { recode_trns_free (trns); return CMD_FAILURE; } /* Ensure that all the output strings are at least as wide as the widest destination variable. */ if (trns->dst_type == VAL_STRING) { if (! enlarge_dst_widths (trns)) { recode_trns_free (trns); return CMD_FAILURE; } } /* Create destination variables, if needed. This must be the final step; otherwise we'd have to delete destination variables on failure. */ trns->dst_dict = dict; if (trns->src_vars != trns->dst_vars) create_dst_vars (trns, dict); /* Done. */ add_transformation (ds, recode_trns_proc, recode_trns_free, trns); } while (lex_match (lexer, T_SLASH)); return CMD_SUCCESS; } /* Parses a set of variables to recode into TRNS->src_vars and TRNS->var_cnt. Sets TRNS->src_type. Returns true if successful, false on parse error. */ static bool parse_src_vars (struct lexer *lexer, struct recode_trns *trns, const struct dictionary *dict) { if (!parse_variables_const (lexer, dict, &trns->src_vars, &trns->var_cnt, PV_SAME_TYPE)) return false; pool_register (trns->pool, free, trns->src_vars); trns->src_type = var_get_type (trns->src_vars[0]); return true; } /* Parses a set of mappings, which take the form (input=output), into TRNS->mappings and TRNS->map_cnt. Sets TRNS->dst_type. Returns true if successful, false on parse error. */ static bool parse_mappings (struct lexer *lexer, struct recode_trns *trns, const char *dict_encoding) { size_t map_allocated; bool have_dst_type; size_t i; /* Find length of longest source variable. */ trns->max_src_width = var_get_width (trns->src_vars[0]); for (i = 1; i < trns->var_cnt; i++) { size_t var_width = var_get_width (trns->src_vars[i]); if (var_width > trns->max_src_width) trns->max_src_width = var_width; } /* Parse the mappings in parentheses. */ trns->mappings = NULL; trns->map_cnt = 0; map_allocated = 0; have_dst_type = false; if (!lex_force_match (lexer, T_LPAREN)) return false; do { enum val_type dst_type; if (!lex_match_id (lexer, "CONVERT")) { struct map_out out; size_t first_map_idx; size_t i; first_map_idx = trns->map_cnt; /* Parse source specifications. */ do { struct map_in in; if (!parse_map_in (lexer, &in, trns->pool, trns->src_type, trns->max_src_width, dict_encoding)) return false; add_mapping (trns, &map_allocated, &in); lex_match (lexer, T_COMMA); } while (!lex_match (lexer, T_EQUALS)); if (!parse_map_out (lexer, trns->pool, &out)) return false; if (out.copy_input) dst_type = trns->src_type; else dst_type = val_type_from_width (out.width); if (have_dst_type && dst_type != trns->dst_type) { msg (SE, _("Inconsistent target variable types. " "Target variables " "must be all numeric or all string.")); return false; } for (i = first_map_idx; i < trns->map_cnt; i++) trns->mappings[i].out = out; } else { /* Parse CONVERT as a special case. */ struct map_in in; set_map_in_generic (&in, MAP_CONVERT); add_mapping (trns, &map_allocated, &in); set_map_out_num (&trns->mappings[trns->map_cnt - 1].out, 0.0); dst_type = VAL_NUMERIC; if (trns->src_type != VAL_STRING || (have_dst_type && trns->dst_type != VAL_NUMERIC)) { msg (SE, _("CONVERT requires string input values and " "numeric output values.")); return false; } } trns->dst_type = dst_type; have_dst_type = true; if (!lex_force_match (lexer, T_RPAREN)) return false; } while (lex_match (lexer, T_LPAREN)); return true; } /* Parses a mapping input value into IN, allocating memory from POOL. The source value type must be provided as SRC_TYPE and, if string, the maximum width of a string source variable must be provided in MAX_SRC_WIDTH. Returns true if successful, false on parse error. */ static bool parse_map_in (struct lexer *lexer, struct map_in *in, struct pool *pool, enum val_type src_type, size_t max_src_width, const char *dict_encoding) { if (lex_match_id (lexer, "ELSE")) set_map_in_generic (in, MAP_ELSE); else if (src_type == VAL_NUMERIC) { if (lex_match_id (lexer, "MISSING")) set_map_in_generic (in, MAP_MISSING); else if (lex_match_id (lexer, "SYSMIS")) set_map_in_generic (in, MAP_SYSMIS); else { double x, y; if (!parse_num_range (lexer, &x, &y, NULL)) return false; set_map_in_num (in, x == y ? MAP_SINGLE : MAP_RANGE, x, y); } } else { if (lex_match_id (lexer, "MISSING")) set_map_in_generic (in, MAP_MISSING); else if (!lex_force_string (lexer)) return false; else { set_map_in_str (in, pool, lex_tokss (lexer), max_src_width, dict_encoding); lex_get (lexer); if (lex_token (lexer) == T_ID && lex_id_match (ss_cstr ("THRU"), lex_tokss (lexer))) { msg (SE, _("%s is not allowed with string variables."), "THRU"); return false; } } } return true; } /* Adds IN to the list of mappings in TRNS. MAP_ALLOCATED is the current number of allocated mappings, which is updated as needed. */ static void add_mapping (struct recode_trns *trns, size_t *map_allocated, const struct map_in *in) { struct mapping *m; if (trns->map_cnt >= *map_allocated) trns->mappings = pool_2nrealloc (trns->pool, trns->mappings, map_allocated, sizeof *trns->mappings); m = &trns->mappings[trns->map_cnt++]; m->in = *in; } /* Sets IN as a mapping of the given TYPE. */ static void set_map_in_generic (struct map_in *in, enum map_in_type type) { in->type = type; } /* Sets IN as a numeric mapping of the given TYPE, with X and Y as the two numeric values. */ static void set_map_in_num (struct map_in *in, enum map_in_type type, double x, double y) { in->type = type; in->x.f = x; in->y.f = y; } /* Sets IN as a string mapping, with STRING as the string, allocated from POOL. The string is padded with spaces on the right to WIDTH characters long. */ static void set_map_in_str (struct map_in *in, struct pool *pool, struct substring string, size_t width, const char *dict_encoding) { char *s = recode_string (dict_encoding, "UTF-8", ss_data (string), ss_length (string)); in->type = MAP_SINGLE; value_init_pool (pool, &in->x, width); value_copy_buf_rpad (&in->x, width, CHAR_CAST (uint8_t *, s), strlen (s), ' '); free (s); } /* Parses a mapping output value into OUT, allocating memory from POOL. Returns true if successful, false on parse error. */ static bool parse_map_out (struct lexer *lexer, struct pool *pool, struct map_out *out) { if (lex_is_number (lexer)) { set_map_out_num (out, lex_number (lexer)); lex_get (lexer); } else if (lex_match_id (lexer, "SYSMIS")) set_map_out_num (out, SYSMIS); else if (lex_is_string (lexer)) { set_map_out_str (out, pool, lex_tokss (lexer)); lex_get (lexer); } else if (lex_match_id (lexer, "COPY")) { out->copy_input = true; out->width = 0; } else { lex_error (lexer, _("expecting output value")); return false; } return true; } /* Sets OUT as a numeric mapping output with the given VALUE. */ static void set_map_out_num (struct map_out *out, double value) { out->copy_input = false; out->value.f = value; out->width = 0; } /* Sets OUT as a string mapping output with the given VALUE. */ static void set_map_out_str (struct map_out *out, struct pool *pool, const struct substring value) { const char *string = ss_data (value); size_t length = ss_length (value); if (length == 0) { /* A length of 0 will yield a numeric value, which is not what we want. */ string = " "; length = 1; } out->copy_input = false; value_init_pool (pool, &out->value, length); memcpy (out->value.s, string, length); out->width = length; } /* Parses a set of target variables into TRNS->dst_vars and TRNS->dst_names. */ static bool parse_dst_vars (struct lexer *lexer, struct recode_trns *trns, const struct dictionary *dict) { size_t i; if (lex_match_id (lexer, "INTO")) { size_t name_cnt; size_t i; if (!parse_mixed_vars_pool (lexer, dict, trns->pool, &trns->dst_names, &name_cnt, PV_NONE)) return false; if (name_cnt != trns->var_cnt) { msg (SE, _("%zu variable(s) cannot be recoded into " "%zu variable(s). Specify the same number " "of variables as source and target variables."), trns->var_cnt, name_cnt); return false; } trns->dst_vars = pool_nalloc (trns->pool, trns->var_cnt, sizeof *trns->dst_vars); for (i = 0; i < trns->var_cnt; i++) { const struct variable *v; v = trns->dst_vars[i] = dict_lookup_var (dict, trns->dst_names[i]); if (v == NULL && trns->dst_type == VAL_STRING) { msg (SE, _("There is no variable named " "%s. (All string variables specified " "on INTO must already exist. Use the " "STRING command to create a string " "variable.)"), trns->dst_names[i]); return false; } } } else { trns->dst_vars = trns->src_vars; if (trns->src_type != trns->dst_type) { msg (SE, _("INTO is required with %s input values " "and %s output values."), trns->src_type == VAL_NUMERIC ? _("numeric") : _("string"), trns->dst_type == VAL_NUMERIC ? _("numeric") : _("string")); return false; } } for (i = 0; i < trns->var_cnt; i++) { const struct variable *v = trns->dst_vars[i]; if (v != NULL && var_get_type (v) != trns->dst_type) { msg (SE, _("Type mismatch. Cannot store %s data in " "%s variable %s."), trns->dst_type == VAL_STRING ? _("string") : _("numeric"), var_is_alpha (v) ? _("string") : _("numeric"), var_get_name (v)); return false; } } return true; } /* Ensures that all the output values in TRNS are as wide as the widest destination variable. */ static bool enlarge_dst_widths (struct recode_trns *trns) { size_t i; const struct variable *narrow_var = NULL; int min_dst_width = INT_MAX; trns->max_dst_width = 0; for (i = 0; i < trns->var_cnt; i++) { const struct variable *v = trns->dst_vars[i]; if (var_get_width (v) > trns->max_dst_width) trns->max_dst_width = var_get_width (v); if (var_get_width (v) < min_dst_width) { min_dst_width = var_get_width (v); narrow_var = v; } } for (i = 0; i < trns->map_cnt; i++) { struct map_out *out = &trns->mappings[i].out; if (!out->copy_input) { if (out->width > min_dst_width) { msg (ME, _("Cannot recode because the variable %s would require a width of %d bytes or greater, but it has a width of only %d bytes."), var_get_name (narrow_var), out->width, min_dst_width); return false; } value_resize_pool (trns->pool, &out->value, out->width, trns->max_dst_width); } } return true; } /* Creates destination variables that don't already exist. */ static void create_dst_vars (struct recode_trns *trns, struct dictionary *dict) { size_t i; for (i = 0; i < trns->var_cnt; i++) { const struct variable **var = &trns->dst_vars[i]; const char *name = trns->dst_names[i]; *var = dict_lookup_var (dict, name); if (*var == NULL) *var = dict_create_var_assert (dict, name, 0); assert (var_get_type (*var) == trns->dst_type); } } /* Data transformation. */ /* Returns the output mapping in TRNS for an input of VALUE on variable V, or a null pointer if there is no mapping. */ static const struct map_out * find_src_numeric (struct recode_trns *trns, double value, const struct variable *v) { struct mapping *m; for (m = trns->mappings; m < trns->mappings + trns->map_cnt; m++) { const struct map_in *in = &m->in; const struct map_out *out = &m->out; bool match; switch (in->type) { case MAP_SINGLE: match = value == in->x.f; break; case MAP_MISSING: match = var_is_num_missing (v, value, MV_ANY); break; case MAP_RANGE: match = value >= in->x.f && value <= in->y.f; break; case MAP_SYSMIS: match = value == SYSMIS; break; case MAP_ELSE: match = true; break; default: NOT_REACHED (); } if (match) return out; } return NULL; } /* Returns the output mapping in TRNS for an input of VALUE with the given WIDTH, or a null pointer if there is no mapping. */ static const struct map_out * find_src_string (struct recode_trns *trns, const uint8_t *value, const struct variable *src_var) { const char *encoding = dict_get_encoding (trns->dst_dict); int width = var_get_width (src_var); struct mapping *m; for (m = trns->mappings; m < trns->mappings + trns->map_cnt; m++) { const struct map_in *in = &m->in; struct map_out *out = &m->out; bool match; switch (in->type) { case MAP_SINGLE: match = !memcmp (value, in->x.s, width); break; case MAP_ELSE: match = true; break; case MAP_CONVERT: { union value uv; char *error; error = data_in (ss_buffer (CHAR_CAST_BUG (char *, value), width), C_ENCODING, FMT_F, &uv, 0, encoding); match = error == NULL; free (error); out->value.f = uv.f; break; } case MAP_MISSING: match = var_is_str_missing (src_var, value, MV_ANY); break; default: NOT_REACHED (); } if (match) return out; } return NULL; } /* Performs RECODE transformation. */ static int recode_trns_proc (void *trns_, struct ccase **c, casenumber case_idx UNUSED) { struct recode_trns *trns = trns_; size_t i; *c = case_unshare (*c); for (i = 0; i < trns->var_cnt; i++) { const struct variable *src_var = trns->src_vars[i]; const struct variable *dst_var = trns->dst_vars[i]; const struct map_out *out; if (trns->src_type == VAL_NUMERIC) out = find_src_numeric (trns, case_num (*c, src_var), src_var); else out = find_src_string (trns, case_str (*c, src_var), src_var); if (trns->dst_type == VAL_NUMERIC) { double *dst = &case_data_rw (*c, dst_var)->f; if (out != NULL) *dst = !out->copy_input ? out->value.f : case_num (*c, src_var); else if (trns->src_vars != trns->dst_vars) *dst = SYSMIS; } else { char *dst = CHAR_CAST_BUG (char *, case_str_rw (*c, dst_var)); if (out != NULL) { if (!out->copy_input) memcpy (dst, out->value.s, var_get_width (dst_var)); else if (trns->src_vars != trns->dst_vars) { union value *dst_data = case_data_rw (*c, dst_var); const union value *src_data = case_data (*c, src_var); value_copy_rpad (dst_data, var_get_width (dst_var), src_data, var_get_width (src_var), ' '); } } else if (trns->src_vars != trns->dst_vars) memset (dst, ' ', var_get_width (dst_var)); } } return TRNS_CONTINUE; } /* Frees a RECODE transformation. */ static bool recode_trns_free (void *trns_) { struct recode_trns *trns = trns_; pool_destroy (trns->pool); return true; } pspp-1.4.1/src/language/xforms/sample.c0000644000175000017500000000707613320146056017442 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 1997-9, 2000, 2009-2011 Free Software Foundation, Inc. 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 3 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, see . */ #include #include #include #include #include #include "data/dataset.h" #include "data/variable.h" #include "language/command.h" #include "language/lexer/lexer.h" #include "libpspp/compiler.h" #include "libpspp/message.h" #include "libpspp/str.h" #include "math/random.h" #include "gl/xalloc.h" #include "gettext.h" #define _(msgid) gettext (msgid) /* The two different types of samples. */ enum { TYPE_A_FROM_B, /* 5 FROM 10 */ TYPE_FRACTION /* 0.5 */ }; /* SAMPLE transformation. */ struct sample_trns { int type; /* One of TYPE_*. */ int n, N; /* TYPE_A_FROM_B: n from N. */ int m, t; /* TYPE_A_FROM_B: # picked so far; # so far. */ unsigned frac; /* TYPE_FRACTION: a fraction of UINT_MAX. */ }; static trns_proc_func sample_trns_proc; static trns_free_func sample_trns_free; int cmd_sample (struct lexer *lexer, struct dataset *ds) { struct sample_trns *trns; int type; int a, b; unsigned frac; if (!lex_force_num (lexer)) return CMD_FAILURE; if (!lex_is_integer (lexer)) { unsigned long min = gsl_rng_min (get_rng ()); unsigned long max = gsl_rng_max (get_rng ()); type = TYPE_FRACTION; if (lex_tokval (lexer) <= 0 || lex_tokval (lexer) >= 1) { msg (SE, _("The sampling factor must be between 0 and 1 " "exclusive.")); return CMD_FAILURE; } frac = lex_tokval (lexer) * (max - min) + min; a = b = 0; } else { type = TYPE_A_FROM_B; a = lex_integer (lexer); lex_get (lexer); if (!lex_force_match_id (lexer, "FROM")) return CMD_FAILURE; if (!lex_force_int (lexer)) return CMD_FAILURE; b = lex_integer (lexer); if (a >= b) { msg (SE, _("Cannot sample %d observations from a population of " "%d."), a, b); return CMD_FAILURE; } frac = 0; } lex_get (lexer); trns = xmalloc (sizeof *trns); trns->type = type; trns->n = a; trns->N = b; trns->m = trns->t = 0; trns->frac = frac; add_transformation (ds, sample_trns_proc, sample_trns_free, trns); return CMD_SUCCESS; } /* Executes a SAMPLE transformation. */ static int sample_trns_proc (void *t_, struct ccase **c UNUSED, casenumber case_num UNUSED) { struct sample_trns *t = t_; double U; if (t->type == TYPE_FRACTION) { if (gsl_rng_get (get_rng ()) <= t->frac) return TRNS_CONTINUE; else return TRNS_DROP_CASE; } if (t->m >= t->n) return TRNS_DROP_CASE; U = gsl_rng_uniform (get_rng ()); if ((t->N - t->t) * U >= t->n - t->m) { t->t++; return TRNS_DROP_CASE; } else { t->m++; t->t++; return TRNS_CONTINUE; } } static bool sample_trns_free (void *t_) { struct sample_trns *t = t_; free (t); return true; } pspp-1.4.1/src/language/automake.mk0000644000175000017500000000372013571051220016622 0ustar00blpblp00000000000000# PSPP - a program for statistical analysis. # Copyright (C) 2017 Free Software Foundation, Inc. # # 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 3 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, see . # ## Process this file with automake to produce Makefile.in -*- makefile -*- include $(top_srcdir)/src/language/lexer/automake.mk include $(top_srcdir)/src/language/xforms/automake.mk include $(top_srcdir)/src/language/control/automake.mk include $(top_srcdir)/src/language/dictionary/automake.mk include $(top_srcdir)/src/language/tests/automake.mk include $(top_srcdir)/src/language/utilities/automake.mk include $(top_srcdir)/src/language/stats/automake.mk include $(top_srcdir)/src/language/data-io/automake.mk include $(top_srcdir)/src/language/expressions/automake.mk noinst_LTLIBRARIES += src/language/liblanguage.la src_language_liblanguage_la_SOURCES = \ src/language/command.c \ src/language/command.h \ src/language/command.def \ $(language_lexer_sources) \ $(language_xforms_sources) \ $(language_control_sources) \ $(language_dictionary_sources) \ $(language_tests_sources) \ $(language_utilities_sources) \ $(language_stats_sources) \ $(language_data_io_sources) \ $(language_expressions_sources) nodist_src_language_liblanguage_la_SOURCES = \ $(src_language_data_io_built_sources) \ $(src_language_utilities_built_sources) \ $(src_language_stats_built_sources) \ $(language_tests_built_sources) \ $(expressions_built_sources) pspp-1.4.1/src/language/command.c0000644000175000017500000003710113670210420016244 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 1997-9, 2000, 2009, 2010, 2011, 2012, 2013, 2014 Free Software Foundation, Inc. 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 3 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, see . */ #include #include "language/command.h" #include #include #include #include #include "data/casereader.h" #include "data/dataset.h" #include "data/dictionary.h" #include "data/session.h" #include "data/settings.h" #include "data/variable.h" #include "language/lexer/command-name.h" #include "language/lexer/lexer.h" #include "libpspp/assertion.h" #include "libpspp/compiler.h" #include "libpspp/i18n.h" #include "libpspp/message.h" #include "libpspp/str.h" #include "output/group-item.h" #include "xmalloca.h" #include "gettext.h" #define _(msgid) gettext (msgid) #define N_(msgid) msgid /* Returns true if RESULT is a valid "enum cmd_result", false otherwise. */ static inline bool cmd_result_is_valid (enum cmd_result result) { switch (result) { case CMD_SUCCESS: case CMD_EOF: case CMD_FINISH: case CMD_DATA_LIST: case CMD_END_CASE: case CMD_END_FILE: case CMD_FAILURE: case CMD_NOT_IMPLEMENTED: case CMD_CASCADING_FAILURE: return true; default: return false; } } /* Returns true if RESULT indicates success, false otherwise. */ bool cmd_result_is_success (enum cmd_result result) { assert (cmd_result_is_valid (result)); return result > 0; } /* Returns true if RESULT indicates failure, false otherwise. */ bool cmd_result_is_failure (enum cmd_result result) { assert (cmd_result_is_valid (result)); return result < 0; } /* Command processing states. */ enum states { S_INITIAL = 0x01, /* Allowed before active dataset defined. */ S_DATA = 0x02, /* Allowed after active dataset defined. */ S_INPUT_PROGRAM = 0x04, /* Allowed in INPUT PROGRAM. */ S_FILE_TYPE = 0x08, /* Allowed in FILE TYPE. */ S_ANY = 0x0f /* Allowed anywhere. */ }; /* Other command requirements. */ enum flags { F_ENHANCED = 0x10, /* Allowed only in enhanced syntax mode. */ F_TESTING = 0x20, /* Allowed only in testing mode. */ F_ABBREV = 0x80 /* Not a candidate for name completion. */ }; /* A single command. */ struct command { enum states states; /* States in which command is allowed. */ enum flags flags; /* Other command requirements. */ const char *name; /* Command name. */ int (*function) (struct lexer *, struct dataset *); /* Function to call. */ }; /* Define the command array. */ #define DEF_CMD(STATES, FLAGS, NAME, FUNCTION) {STATES, FLAGS, NAME, FUNCTION}, #define UNIMPL_CMD(NAME, DESCRIPTION) {S_ANY, 0, NAME, NULL}, static const struct command commands[] = { #include "command.def" }; #undef DEF_CMD #undef UNIMPL_CMD static const size_t command_cnt = sizeof commands / sizeof *commands; static bool in_correct_state (const struct command *, enum cmd_state); static bool report_state_mismatch (const struct command *, enum cmd_state); static void set_completion_state (enum cmd_state); /* Command parser. */ static const struct command *parse_command_name (struct lexer *, int *n_tokens); static enum cmd_result do_parse_command (struct lexer *, struct dataset *, enum cmd_state); /* Parses an entire command, from command name to terminating dot. On failure, skips to the terminating dot. Returns the command's success or failure result. */ enum cmd_result cmd_parse_in_state (struct lexer *lexer, struct dataset *ds, enum cmd_state state) { struct session *session = dataset_session (ds); int result; result = do_parse_command (lexer, ds, state); ds = session_active_dataset (session); assert (!proc_is_open (ds)); unset_cmd_algorithm (); if (!dataset_end_of_command (ds)) result = CMD_CASCADING_FAILURE; return result; } enum cmd_result cmd_parse (struct lexer *lexer, struct dataset *ds) { const struct dictionary *dict = dataset_dict (ds); return cmd_parse_in_state (lexer, ds, dataset_has_source (ds) && dict_get_var_cnt (dict) > 0 ? CMD_STATE_DATA : CMD_STATE_INITIAL); } /* Parses an entire command, from command name to terminating dot. */ static enum cmd_result do_parse_command (struct lexer *lexer, struct dataset *ds, enum cmd_state state) { const struct command *command = NULL; enum cmd_result result; bool opened = false; int n_tokens; /* Read the command's first token. */ set_completion_state (state); if (lex_token (lexer) == T_STOP) { result = CMD_EOF; goto finish; } else if (lex_token (lexer) == T_ENDCMD) { /* Null commands can result from extra empty lines. */ result = CMD_SUCCESS; goto finish; } /* Parse the command name. */ command = parse_command_name (lexer, &n_tokens); if (command == NULL) { result = CMD_FAILURE; goto finish; } group_open_item_submit (group_open_item_create_nocopy ( utf8_to_title (command->name))); opened = true; if (command->function == NULL) { msg (SE, _("%s is not yet implemented."), command->name); result = CMD_NOT_IMPLEMENTED; } else if ((command->flags & F_TESTING) && !settings_get_testing_mode ()) { msg (SE, _("%s may be used only in testing mode."), command->name); result = CMD_FAILURE; } else if ((command->flags & F_ENHANCED) && settings_get_syntax () != ENHANCED) { msg (SE, _("%s may be used only in enhanced syntax mode."), command->name); result = CMD_FAILURE; } else if (!in_correct_state (command, state)) { report_state_mismatch (command, state); result = CMD_FAILURE; } else { /* Execute command. */ int i; for (i = 0; i < n_tokens; i++) lex_get (lexer); result = command->function (lexer, ds); } assert (cmd_result_is_valid (result)); finish: if (cmd_result_is_failure (result)) lex_interactive_reset (lexer); else if (result == CMD_SUCCESS) result = lex_end_of_command (lexer); lex_discard_rest_of_command (lexer); if (result != CMD_EOF && result != CMD_FINISH) while (lex_token (lexer) == T_ENDCMD) lex_get (lexer); if (opened) group_close_item_submit (group_close_item_create ()); return result; } static int find_best_match (struct substring s, const struct command **matchp) { const struct command *cmd; struct command_matcher cm; int missing_words; command_matcher_init (&cm, s); for (cmd = commands; cmd < &commands[command_cnt]; cmd++) command_matcher_add (&cm, ss_cstr (cmd->name), CONST_CAST (void *, cmd)); *matchp = command_matcher_get_match (&cm); missing_words = command_matcher_get_missing_words (&cm); command_matcher_destroy (&cm); return missing_words; } static bool parse_command_word (struct lexer *lexer, struct string *s, int n) { bool need_space = ds_last (s) != EOF && ds_last (s) != '-'; switch (lex_next_token (lexer, n)) { case T_DASH: ds_put_byte (s, '-'); return true; case T_ID: if (need_space) ds_put_byte (s, ' '); ds_put_cstr (s, lex_next_tokcstr (lexer, n)); return true; case T_POS_NUM: if (lex_next_is_integer (lexer, n)) { int integer = lex_next_integer (lexer, n); if (integer >= 0) { if (need_space) ds_put_byte (s, ' '); ds_put_format (s, "%ld", lex_next_integer (lexer, n)); return true; } } return false; default: return false; } } /* Parses the command name. On success returns a pointer to the corresponding struct command and stores the number of tokens in the command name into *N_TOKENS. On failure, returns a null pointer and stores the number of tokens required to determine that no command name was present into *N_TOKENS. */ static const struct command * parse_command_name (struct lexer *lexer, int *n_tokens) { const struct command *command; int missing_words; struct string s; int word; command = NULL; missing_words = 0; ds_init_empty (&s); word = 0; while (parse_command_word (lexer, &s, word)) { missing_words = find_best_match (ds_ss (&s), &command); if (missing_words <= 0) break; word++; } if (command == NULL && missing_words > 0) { ds_put_cstr (&s, " ."); missing_words = find_best_match (ds_ss (&s), &command); ds_truncate (&s, ds_length (&s) - 2); } if (command == NULL) { if (ds_is_empty (&s)) lex_error (lexer, _("expecting command name")); else msg (SE, _("Unknown command `%s'."), ds_cstr (&s)); } ds_destroy (&s); *n_tokens = (word + 1) + missing_words; return command; } /* Returns true if COMMAND is allowed in STATE, false otherwise. */ static bool in_correct_state (const struct command *command, enum cmd_state state) { return ((state == CMD_STATE_INITIAL && command->states & S_INITIAL) || (state == CMD_STATE_DATA && command->states & S_DATA) || (state == CMD_STATE_INPUT_PROGRAM && command->states & S_INPUT_PROGRAM) || (state == CMD_STATE_FILE_TYPE && command->states & S_FILE_TYPE)); } /* Emits an appropriate error message for trying to invoke COMMAND in STATE. */ static bool report_state_mismatch (const struct command *command, enum cmd_state state) { assert (!in_correct_state (command, state)); if (state == CMD_STATE_INITIAL || state == CMD_STATE_DATA) { switch ((int) command->states) { /* One allowed state. */ case S_INITIAL: msg (SE, _("%s is allowed only before the active dataset has " "been defined."), command->name); break; case S_DATA: msg (SE, _("%s is allowed only after the active dataset has " "been defined."), command->name); break; case S_INPUT_PROGRAM: msg (SE, _("%s is allowed only inside %s."), command->name, "INPUT PROGRAM"); break; case S_FILE_TYPE: msg (SE, _("%s is allowed only inside %s."), command->name, "FILE TYPE"); break; /* Two allowed states. */ case S_INITIAL | S_DATA: NOT_REACHED (); case S_INITIAL | S_INPUT_PROGRAM: msg (SE, _("%s is allowed only before the active dataset has been defined or inside %s."), command->name, "INPUT PROGRAM"); break; case S_INITIAL | S_FILE_TYPE: msg (SE, _("%s is allowed only before the active dataset has been defined or inside %s."), command->name, "FILE TYPE"); break; case S_DATA | S_INPUT_PROGRAM: msg (SE, _("%s is allowed only after the active dataset has been defined or inside %s."), command->name, "INPUT PROGRAM"); break; case S_DATA | S_FILE_TYPE: msg (SE, _("%s is allowed only after the active dataset has been defined or inside %s."), command->name, "FILE TYPE"); break; case S_INPUT_PROGRAM | S_FILE_TYPE: msg (SE, _("%s is allowed only inside %s or inside %s."), command->name, "INPUT PROGRAM", "FILE TYPE"); break; /* Three allowed states. */ case S_DATA | S_INPUT_PROGRAM | S_FILE_TYPE: msg (SE, _("%s is allowed only after the active dataset has " "been defined, inside INPUT PROGRAM, or inside " "FILE TYPE."), command->name); break; case S_INITIAL | S_INPUT_PROGRAM | S_FILE_TYPE: msg (SE, _("%s is allowed only before the active dataset has " "been defined, inside INPUT PROGRAM, or inside " "FILE TYPE."), command->name); break; case S_INITIAL | S_DATA | S_FILE_TYPE: NOT_REACHED (); case S_INITIAL | S_DATA | S_INPUT_PROGRAM: NOT_REACHED (); /* Four allowed states. */ case S_INITIAL | S_DATA | S_INPUT_PROGRAM | S_FILE_TYPE: NOT_REACHED (); default: NOT_REACHED (); } } else if (state == CMD_STATE_INPUT_PROGRAM) msg (SE, _("%s is not allowed inside %s."), command->name, "INPUT PROGRAM"); else if (state == CMD_STATE_FILE_TYPE) msg (SE, _("%s is not allowed inside %s."), command->name, "FILE TYPE"); return false; } /* Command name completion. */ static enum cmd_state completion_state = CMD_STATE_INITIAL; static void set_completion_state (enum cmd_state state) { completion_state = state; } /* Returns the next possible completion of a command name that begins with PREFIX, in the current command state, or a null pointer if no completions remain. Before calling the first time, set *CMD to a null pointer. */ const char * cmd_complete (const char *prefix, const struct command **cmd) { if (*cmd == NULL) *cmd = commands; for (; *cmd < commands + command_cnt; (*cmd)++) if (!memcasecmp ((*cmd)->name, prefix, strlen (prefix)) && (!((*cmd)->flags & F_TESTING) || settings_get_testing_mode ()) && (!((*cmd)->flags & F_ENHANCED) || settings_get_syntax () == ENHANCED) && !((*cmd)->flags & F_ABBREV) && ((*cmd)->function != NULL) && in_correct_state (*cmd, completion_state)) return (*cmd)++->name; return NULL; } /* Simple commands. */ /* Parse and execute FINISH command. */ int cmd_finish (struct lexer *lexer UNUSED, struct dataset *ds UNUSED) { return CMD_FINISH; } /* Parses the N command. */ int cmd_n_of_cases (struct lexer *lexer, struct dataset *ds) { /* Value for N. */ int x; if (!lex_force_int (lexer)) return CMD_FAILURE; x = lex_integer (lexer); lex_get (lexer); if (!lex_match_id (lexer, "ESTIMATED")) dict_set_case_limit (dataset_dict (ds), x); return CMD_SUCCESS; } /* Parses, performs the EXECUTE procedure. */ int cmd_execute (struct lexer *lexer UNUSED, struct dataset *ds) { bool ok = casereader_destroy (proc_open (ds)); if (!proc_commit (ds) || !ok) return CMD_CASCADING_FAILURE; return CMD_SUCCESS; } /* Parses, performs the ERASE command. */ int cmd_erase (struct lexer *lexer, struct dataset *ds UNUSED) { char *filename; int retval; if (settings_get_safer_mode ()) { msg (SE, _("This command not allowed when the %s option is set."), "SAFER"); return CMD_FAILURE; } if (!lex_force_match_id (lexer, "FILE")) return CMD_FAILURE; lex_match (lexer, T_EQUALS); if (!lex_force_string (lexer)) return CMD_FAILURE; filename = utf8_to_filename (lex_tokcstr (lexer)); retval = remove (filename); free (filename); if (retval == -1) { msg (SW, _("Error removing `%s': %s."), lex_tokcstr (lexer), strerror (errno)); return CMD_FAILURE; } lex_get (lexer); return CMD_SUCCESS; } /* Parses, performs the NEW FILE command. */ int cmd_new_file (struct lexer *lexer UNUSED, struct dataset *ds) { dataset_clear (ds); return CMD_SUCCESS; } pspp-1.4.1/src/language/lexer/0000755000175000017500000000000013725012647015613 5ustar00blpblp00000000000000pspp-1.4.1/src/language/lexer/automake.mk0000644000175000017500000000352313571051220017742 0ustar00blpblp00000000000000# PSPP - a program for statistical analysis. # Copyright (C) 2017 Free Software Foundation, Inc. # # 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 3 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, see . # ## Process this file with automake to produce Makefile.in -*- makefile -*- language_lexer_sources = \ src/language/lexer/command-name.c \ src/language/lexer/command-name.h \ src/language/lexer/include-path.c \ src/language/lexer/include-path.h \ src/language/lexer/lexer.c \ src/language/lexer/lexer.h \ src/language/lexer/subcommand-list.c \ src/language/lexer/subcommand-list.h \ src/language/lexer/format-parser.c \ src/language/lexer/format-parser.h \ src/language/lexer/scan.c \ src/language/lexer/scan.h \ src/language/lexer/segment.c \ src/language/lexer/segment.h \ src/language/lexer/token.c \ src/language/lexer/token.h \ src/language/lexer/value-parser.c \ src/language/lexer/value-parser.h \ src/language/lexer/variable-parser.c \ src/language/lexer/variable-parser.h EXTRA_DIST += src/language/lexer/q2c.c src/language/lexer/q2c$(EXEEXT_FOR_BUILD): $(top_srcdir)/src/language/lexer/q2c.c @$(MKDIR_P) `dirname $@` $(AM_V_GEN)$(CC_FOR_BUILD) $(top_srcdir)/src/language/lexer/q2c.c -o $(top_builddir)/src/language/lexer/q2c$(EXEEXT_FOR_BUILD) CLEANFILES += src/language/lexer/q2c$(EXEEXT_FOR_BUILD) pspp-1.4.1/src/language/lexer/scan.h0000644000175000017500000000706313360714656016722 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2010, 2011, 2013 Free Software Foundation, Inc. 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 3 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, see . */ #ifndef SCAN_H #define SCAN_H 1 #include "language/lexer/segment.h" #include "libpspp/str.h" struct token; /* PSPP syntax scanning. PSPP divides traditional "lexical analysis" or "tokenization" into two phases: a lower-level phase called "segmentation" and a higher-level phase called "scanning". segment.h provides declarations for the segmentation phase. This header file contains declarations for the scanning phase. Scanning accepts as input a stream of segments, which are UTF-8 strings each labeled with a segment type. It outputs a stream of "scan tokens", which are the same as the tokens used by the PSPP parser with a few additional types. */ #define SCAN_TYPES \ SCAN_TYPE(BAD_HEX_LENGTH) \ SCAN_TYPE(BAD_HEX_DIGIT) \ \ SCAN_TYPE(BAD_UNICODE_LENGTH) \ SCAN_TYPE(BAD_UNICODE_DIGIT) \ SCAN_TYPE(BAD_UNICODE_CODE_POINT) \ \ SCAN_TYPE(EXPECTED_QUOTE) \ SCAN_TYPE(EXPECTED_EXPONENT) \ SCAN_TYPE(UNEXPECTED_DOT) \ SCAN_TYPE(UNEXPECTED_CHAR) \ \ SCAN_TYPE(SKIP) /* Types of scan tokens. Scan token types are a superset of enum token_type. Only the additional scan token types are defined here, so see the definition of enum token_type for the others. */ enum scan_type { #define SCAN_TYPE(TYPE) SCAN_##TYPE, SCAN_FIRST = 255, SCAN_TYPES SCAN_LAST #undef SCAN_TYPE }; const char *scan_type_to_string (enum scan_type); bool is_scan_type (enum scan_type); /* A scanner. Opaque. */ struct scanner { unsigned char state; unsigned char substate; }; /* scanner_push() return type. */ enum scan_result { /* Complete token. */ SCAN_DONE, /* Token successfully scanned. */ SCAN_MORE, /* More segments needed to scan token. */ /* Incomplete token. */ SCAN_BACK, /* Done, but go back to saved position too. */ SCAN_SAVE /* Need more segments, and save position. */ }; void scanner_init (struct scanner *, struct token *); enum scan_result scanner_push (struct scanner *, enum segment_type, struct substring, struct token *); /* A simplified lexer for handling syntax in a string. */ struct string_lexer { const char *input; size_t length; size_t offset; struct segmenter segmenter; }; void string_lexer_init (struct string_lexer *, const char *input, size_t length, enum segmenter_mode); bool string_lexer_next (struct string_lexer *, struct token *); #endif /* scan.h */ pspp-1.4.1/src/language/lexer/value-parser.h0000644000175000017500000000211513320146056020362 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2005, 2009, 2011 Free Software Foundation, Inc. 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 3 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, see . */ #ifndef VALUE_PARSER_H #define VALUE_PARSER_H 1 #include struct lexer; enum fmt_type; struct variable; union value; bool parse_num_range (struct lexer *, double *x, double *y, const enum fmt_type *fmt); bool parse_value (struct lexer *, union value *, const struct variable *); #endif /* value-parser.h */ pspp-1.4.1/src/language/lexer/token.h0000644000175000017500000000270613320146056017102 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2010, 2011 Free Software Foundation, Inc. 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 3 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, see . */ #ifndef TOKEN_H #define TOKEN_H 1 #include #include "libpspp/str.h" #include "data/identifier.h" /* A PSPP syntax token. The 'type' member is used by the scanner (see scan.h) for SCAN_* values as well, which is why it is not declared as type "enum token_type". */ struct token { int type; /* Usually a "enum token_type" value. */ double number; struct substring string; }; #define TOKEN_INITIALIZER(TYPE, NUMBER, STRING) \ { TYPE, NUMBER, SS_LITERAL_INITIALIZER (STRING) } void token_init (struct token *); void token_destroy (struct token *); char *token_to_string (const struct token *); void token_print (const struct token *, FILE *); #endif /* token.h */ pspp-1.4.1/src/language/lexer/subcommand-list.c0000644000175000017500000000477313670210420021057 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2004, 2011 Free Software Foundation, Inc. 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 3 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, see . */ #include #include "language/lexer/subcommand-list.h" #include #include "language/lexer/lexer.h" #include "gl/xalloc.h" #include "gettext.h" #define _(msgid) gettext (msgid) /* I call these objects `lists' but they are in fact simple dynamic arrays */ #define CHUNKSIZE 16 /* Create a list */ void subc_list_double_create(subc_list_double *l) { l->data = xnmalloc (CHUNKSIZE, sizeof *l->data); l->sz = CHUNKSIZE; l->n_data = 0; } void subc_list_int_create(subc_list_int *l) { l->data = xnmalloc (CHUNKSIZE, sizeof *l->data); l->sz = CHUNKSIZE; l->n_data = 0; } /* Push a value onto the list */ void subc_list_double_push(subc_list_double *l, double d) { l->data[l->n_data++] = d; if (l->n_data >= l->sz) { l->sz += CHUNKSIZE; l->data = xnrealloc (l->data, l->sz, sizeof *l->data); } } void subc_list_int_push(subc_list_int *l, int d) { l->data[l->n_data++] = d; if (l->n_data >= l->sz) { l->sz += CHUNKSIZE; l->data = xnrealloc (l->data, l->sz, sizeof *l->data); } } /* Return the number of items in the list */ int subc_list_double_count(const subc_list_double *l) { return l->n_data; } int subc_list_int_count(const subc_list_int *l) { return l->n_data; } /* Index into the list (array) */ double subc_list_double_at(const subc_list_double *l, int idx) { return l->data[idx]; } int subc_list_int_at(const subc_list_int *l, int idx) { return l->data[idx]; } /* Free up the list */ void subc_list_double_destroy(subc_list_double *l) { free(l->data); } void subc_list_int_destroy(subc_list_int *l) { free(l->data); } void subc_list_error (struct lexer *lexer, const char *sbc, int max_list) { lex_error (lexer, _("No more than %d %s subcommands allowed."), max_list, sbc); } pspp-1.4.1/src/language/lexer/command-name.c0000644000175000017500000001505113360714656020321 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2010 Free Software Foundation, Inc. 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 3 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, see . */ #include #include "language/lexer/command-name.h" #include #include #include "data/identifier.h" #include "gl/c-ctype.h" /* Stores the first word in S into WORD and advances S past that word. Returns true if successful, false if no word remained in S to be extracted. A word is a sequence of digits, a letter possibly followed by a sequence of letters or digits, or one character of another type. Words may be delimited by spaces. */ static bool find_word (struct substring *s, struct substring *word) { size_t ofs; ucs4_t c; /* Skip whitespace. */ for (;;) { c = ss_first_mb (*s); if (c == UINT32_MAX) { *word = ss_empty (); return false; } else if (lex_uc_is_space (c)) ss_get_mb (s); else break; } ofs = ss_first_mblen (*s); if (lex_uc_is_id1 (c)) { while (lex_uc_is_idn (ss_at_mb (*s, ofs))) ofs += ss_at_mblen (*s, ofs); } else if (c_isdigit (c)) { while (ofs < s->length && c_isdigit (s->string[ofs])) ofs++; } ss_get_bytes (s, ofs, word); return true; } /* Returns the number of words in S, as extracted by find_word(). */ static int count_words (struct substring s) { struct substring word; int n; n = 0; while (find_word (&s, &word)) n++; return n; } /* Compares STRING obtained from the user against the full name of a COMMAND, using this algorithm: 1. Divide COMMAND into words C[0] through C[n - 1]. 2. Divide STRING into words S[0] through S[m - 1]. 3. Compare word C[i] against S[i] for 0 <= i < min(n, m), using the keyword matching algorithm implemented by lex_id_match(). If any of them fail to match, then STRING does not match COMMAND and the function returns false. 4. Otherwise, STRING and COMMAND match. Set *MISSING_WORDS to n - m. Set *EXACT to false if any of the S[i] were found to be abbreviated in the comparisons done in step 3, or to true if they were all exactly equal (modulo case). Return true. */ bool command_match (struct substring command, struct substring string, bool *exact, int *missing_words) { *exact = true; for (;;) { struct substring cw, sw; int match; if (!find_word (&command, &cw)) { *missing_words = -count_words (string); return true; } else if (!find_word (&string, &sw)) { *missing_words = 1 + count_words (command); return true; } match = lex_id_match (cw, sw); if (sw.length < cw.length) *exact = false; if (match == 0) return false; } } /* Initializes CM for matching STRING against a table of command names. STRING may be ASCII or UTF-8. For sample use, see command.c. Here's a usage outline: // Try each possible command. command_matcher_init (&cm, string); for (cmd = commands; cmd < &commands[command_cnt]; cmd++) command_matcher_add (&cm, cmd->name, cmd); // Get the result. match = command_matcher_get_match (&cm); missing_words = command_matcher_get_missing_words (&cm); if (missing_words > 0) { // Incomplete command name. Add another word to the string // and start over. Or if there are no more words to be added, // add " ." to the string as a sentinel and start over. } else if (match == NULL) { // No valid command with this name. } else if (missing_words == 0) { // The full, correct command name is 'match'. } else if (missing_words < 0) { // The abs(missing_words) last words of 'string' are actually // part of the command's body, not part of its name; they // were only needed to resolve ambiguities. 'match' is the // correct command but those extra words should be put back // for later re-parsing. } */ void command_matcher_init (struct command_matcher *cm, struct substring string) { cm->string = string; cm->extensible = false; cm->exact_match = NULL; cm->n_matches = 0; cm->match = NULL; cm->match_missing_words = 0; } /* Destroys CM's state. */ void command_matcher_destroy (struct command_matcher *cm UNUSED) { /* Nothing to do. */ } /* Considers COMMAND as a candidate for the command name being parsed by CM. If COMMAND is the correct command name, then command_matcher_get_match() will return AUX later. COMMAND must be an ASCII string. */ void command_matcher_add (struct command_matcher *cm, struct substring command, void *aux) { int missing_words; bool exact; assert (aux != NULL); if (command_match (command, cm->string, &exact, &missing_words)) { if (missing_words > 0) cm->extensible = true; else if (exact && missing_words == 0) cm->exact_match = aux; else { if (missing_words > cm->match_missing_words) cm->n_matches = 0; if (missing_words >= cm->match_missing_words || cm->n_matches == 0) { cm->n_matches++; cm->match = aux; cm->match_missing_words = missing_words; } } } } /* Returns the command name matched by CM. */ void * command_matcher_get_match (const struct command_matcher *cm) { return (cm->extensible ? NULL : cm->exact_match != NULL ? cm->exact_match : cm->n_matches == 1 ? cm->match : NULL); } /* Returns the difference between the number of words in the matched command name and the string provided to command_matcher_init(). */ int command_matcher_get_missing_words (const struct command_matcher *cm) { return (cm->extensible ? 1 : cm->exact_match != NULL ? 0 : cm->match_missing_words); } pspp-1.4.1/src/language/lexer/command-name.h0000644000175000017500000000313113320146056020307 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2010 Free Software Foundation, Inc. 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 3 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, see . */ #ifndef COMMAND_NAME_H #define COMMAND_NAME_H 1 #include #include "libpspp/str.h" bool command_match (struct substring command, struct substring string, bool *exact, int *missing_words); /* Allows matching a string against a table of command names. */ struct command_matcher { struct substring string; bool extensible; void *exact_match; int n_matches; void *match; int match_missing_words; }; void command_matcher_init (struct command_matcher *, struct substring string); void command_matcher_destroy (struct command_matcher *); void command_matcher_add (struct command_matcher *, struct substring command, void *aux); void *command_matcher_get_match (const struct command_matcher *); int command_matcher_get_missing_words (const struct command_matcher *); #endif /* command-name.h */ pspp-1.4.1/src/language/lexer/token.c0000644000175000017500000001023713320146056017073 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2010, 2011 Free Software Foundation, Inc. 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 3 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, see . */ #include #include "language/lexer/token.h" #include #include #include #include "data/identifier.h" #include "libpspp/assertion.h" #include "libpspp/cast.h" #include "libpspp/misc.h" #include "gl/ftoastr.h" #include "gl/xalloc.h" /* Initializes TOKEN with an arbitrary type, number 0, and a null string. */ void token_init (struct token *token) { token->type = 0; token->number = 0.0; token->string = ss_empty (); } /* Frees the string that TOKEN contains. */ void token_destroy (struct token *token) { if (token != NULL) ss_dealloc (&token->string); } static char * number_token_to_string (const struct token *token) { char buffer[DBL_BUFSIZE_BOUND]; c_dtoastr (buffer, sizeof buffer, 0, 0, fabs (token->number)); return (token->type == T_POS_NUM ? xstrdup (buffer) : xasprintf ("-%s", buffer)); } static char * quoted_string_representation (struct substring ss, size_t n_quotes) { char *rep; size_t i; char *p; p = rep = xmalloc (1 + ss.length + n_quotes + 1 + 1); *p++ = '\''; for (i = 0; i < ss.length; i++) { uint8_t c = ss.string[i]; if (c == '\'') *p++ = c; *p++ = c; } *p++ = '\''; *p = '\0'; return rep; } static char * hex_string_representation (struct substring ss) { char *rep; size_t i; char *p; p = rep = xmalloc (2 + 2 * ss.length + 1 + 1); *p++ = 'X'; *p++ = '\''; for (i = 0; i < ss.length; i++) { static const char hex_digits[] = "0123456789abcdef"; uint8_t c = ss.string[i]; *p++ = hex_digits[c >> 4]; *p++ = hex_digits[c & 15]; } *p++ = '\''; *p = '\0'; return rep; } static char * string_representation (struct substring ss) { size_t n_quotes; size_t ofs; int mblen; n_quotes = 0; for (ofs = 0; ofs < ss.length; ofs += mblen) { ucs4_t uc; mblen = u8_mbtoucr (&uc, CHAR_CAST (const uint8_t *, ss.string + ofs), ss.length - ofs); if (mblen < 0 || !uc_is_print (uc)) return hex_string_representation (ss); else if (uc == '\'') n_quotes++; } return quoted_string_representation (ss, n_quotes); } /* Returns a UTF-8 string that would yield TOKEN if it appeared in a syntax file. The caller should free the returned string, with free(), when it is no longer needed. The T_STOP token has no representation, so this function returns NULL. */ char * token_to_string (const struct token *token) { const char *name; switch (token->type) { case T_POS_NUM: case T_NEG_NUM: return number_token_to_string (token); case T_ID: return ss_xstrdup (token->string); case T_STRING: return string_representation (token->string); default: name = token_type_to_name (token->type); return name != NULL ? xstrdup (name) : NULL; } } /* Prints TOKEN on STREAM, for debugging. */ void token_print (const struct token *token, FILE *stream) { fputs (token_type_to_name (token->type), stream); if (token->type == T_POS_NUM || token->type == T_NEG_NUM || token->number != 0.0) { char s[DBL_BUFSIZE_BOUND]; c_dtoastr (s, sizeof s, 0, 0, token->number); fprintf (stream, "\t%s", s); } if (token->type == T_ID || token->type == T_STRING || token->string.length) fprintf (stream, "\t\"%.*s\"", (int) token->string.length, token->string.string); putc ('\n', stream); } pspp-1.4.1/src/language/lexer/include-path.c0000644000175000017500000000425213320146056020330 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2010 Free Software Foundation, Inc. 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 3 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, see . */ #include #include "src/language/lexer/include-path.h" #include #include "data/file-name.h" #include "libpspp/string-array.h" #include "gl/configmake.h" #include "gl/relocatable.h" #include "gl/xvasprintf.h" static struct string_array the_include_path; static struct string_array default_include_path; static void include_path_init__ (void); void include_path_clear (void) { include_path_init__ (); string_array_clear (&the_include_path); } void include_path_add (const char *dir) { include_path_init__ (); string_array_append (&the_include_path, dir); } char * include_path_search (const char *base_name) { return fn_search_path (base_name, include_path ()); } const struct string_array * include_path_default (void) { include_path_init__ (); return &default_include_path; } char ** include_path (void) { include_path_init__ (); string_array_terminate_null (&the_include_path); return the_include_path.strings; } static void include_path_init__ (void) { static bool inited; char *home; if (inited) return; inited = true; string_array_init (&the_include_path); string_array_append (&the_include_path, "."); home = getenv ("HOME"); if (home != NULL) string_array_append_nocopy (&the_include_path, xasprintf ("%s/.pspp", home)); string_array_append (&the_include_path, relocate (PKGDATADIR)); string_array_clone (&default_include_path, &the_include_path); } pspp-1.4.1/src/language/lexer/value-parser.c0000644000175000017500000001021113320146056020351 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2005, 2006, 2009, 2010, 2011, 2014 Free Software Foundation, Inc. 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 3 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, see . */ #include #include "value-parser.h" #include #include #include "data/data-in.h" #include "data/format.h" #include "data/value.h" #include "language/lexer/lexer.h" #include "libpspp/cast.h" #include "libpspp/i18n.h" #include "libpspp/message.h" #include "libpspp/str.h" #include "gettext.h" #define _(msgid) gettext (msgid) #define N_(msgid) msgid static bool parse_number (struct lexer *, double *, const enum fmt_type *); /* Parses and stores a numeric value, or a range of the form "x THRU y". Open-ended ranges may be specified as "LO(WEST) THRU y" or "x THRU HI(GHEST)". Sets *X and *Y to the range or the value and returns success. Numeric values are always accepted. If FORMAT is nonnull, then string values are also accepted, and converted to numeric values using *FORMAT. */ bool parse_num_range (struct lexer *lexer, double *x, double *y, const enum fmt_type *format) { if (lex_match_id (lexer, "LO") || lex_match_id (lexer, "LOWEST")) *x = LOWEST; else if (!parse_number (lexer, x, format)) return false; if (lex_match_id (lexer, "THRU")) { if (lex_match_id (lexer, "HI") || lex_match_id (lexer, "HIGHEST")) *y = HIGHEST; else if (!parse_number (lexer, y, format)) return false; if (*y < *x) { double t; msg (SW, _("The high end of the range (%.*g) is below the low end " "(%.*g). The range will be treated as if reversed."), DBL_DIG + 1, *y, DBL_DIG + 1, *x); t = *x; *x = *y; *y = t; } else if (*x == *y) msg (SW, _("Ends of range are equal (%.*g)."), DBL_DIG + 1, *x); return true; } else { if (*x == LOWEST) { msg (SE, _("%s or %s must be part of a range."), "LO", "LOWEST"); return false; } *y = *x; } return true; } /* Parses a number and stores it in *X. Returns success. Numeric values are always accepted. If FORMAT is nonnull, then string values are also accepted, and converted to numeric values using *FORMAT. */ static bool parse_number (struct lexer *lexer, double *x, const enum fmt_type *format) { if (lex_is_string (lexer) && format != NULL) { union value v; assert (fmt_get_category (*format) != FMT_CAT_STRING); if (!data_in_msg (lex_tokss (lexer), "UTF-8", *format, &v, 0, NULL)) return false; lex_get (lexer); *x = v.f; if (*x == SYSMIS) { msg (SE, _("System-missing value is not valid here.")); return false; } return true; } if (lex_force_num (lexer)) { *x = lex_number (lexer); lex_get (lexer); return true; } return false; } /* Parses the current token from LEXER into value V, which must already have been initialized with the specified VAR's WIDTH. Returns true if successful, false otherwise. */ bool parse_value (struct lexer *lexer, union value *v, const struct variable *var) { int width = var_get_width (var); if (width == 0) return parse_number (lexer, &v->f, &var_get_print_format (var)->type); else if (lex_force_string (lexer)) { const char *s = lex_tokcstr (lexer); value_copy_str_rpad (v, width, CHAR_CAST_BUG (const uint8_t *, s), ' '); } else return false; lex_get (lexer); return true; } pspp-1.4.1/src/language/lexer/scan.c0000644000175000017500000003567513360714656016727 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2010, 2011, 2013 Free Software Foundation, Inc. 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 3 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, see . */ #include #include "language/lexer/scan.h" #include #include #include "data/identifier.h" #include "language/lexer/token.h" #include "libpspp/assertion.h" #include "libpspp/cast.h" #include "gl/c-ctype.h" #include "gl/c-strtod.h" #include "gl/xmemdup0.h" enum { S_START, S_DASH, S_STRING }; #define SS_NL_BEFORE_PLUS (1u << 0) #define SS_PLUS (1u << 1) #define SS_NL_AFTER_PLUS (1u << 2) /* Returns the integer value of (hex) digit C. */ static int digit_value (int c) { switch (c) { case '0': return 0; case '1': return 1; case '2': return 2; case '3': return 3; case '4': return 4; case '5': return 5; case '6': return 6; case '7': return 7; case '8': return 8; case '9': return 9; case 'a': case 'A': return 10; case 'b': case 'B': return 11; case 'c': case 'C': return 12; case 'd': case 'D': return 13; case 'e': case 'E': return 14; case 'f': case 'F': return 15; default: return INT_MAX; } } static bool scan_quoted_string__ (struct substring s, struct token *token) { int quote; /* Trim ' or " from front and back. */ quote = s.string[s.length - 1]; s.string++; s.length -= 2; ss_realloc (&token->string, token->string.length + s.length + 1); for (;;) { size_t pos = ss_find_byte (s, quote); if (pos == SIZE_MAX) break; memcpy (ss_end (token->string), s.string, pos + 1); token->string.length += pos + 1; ss_advance (&s, pos + 2); } memcpy (ss_end (token->string), s.string, ss_length (s)); token->string.length += ss_length (s); return true; } static bool scan_hex_string__ (struct substring s, struct token *token) { uint8_t *dst; size_t i; /* Trim X' from front and ' from back. */ s.string += 2; s.length -= 3; if (s.length % 2 != 0) { token->type = SCAN_BAD_HEX_LENGTH; token->number = s.length; return false; } ss_realloc (&token->string, token->string.length + s.length / 2 + 1); dst = CHAR_CAST (uint8_t *, ss_end (token->string)); token->string.length += s.length / 2; for (i = 0; i < s.length; i += 2) { int hi = digit_value (s.string[i]); int lo = digit_value (s.string[i + 1]); if (hi >= 16 || lo >= 16) { token->type = SCAN_BAD_HEX_DIGIT; token->number = s.string[hi >= 16 ? i : i + 1]; return false; } *dst++ = hi * 16 + lo; } return true; } static bool scan_unicode_string__ (struct substring s, struct token *token) { uint8_t *dst; ucs4_t uc; size_t i; /* Trim U' from front and ' from back. */ s.string += 2; s.length -= 3; if (s.length < 1 || s.length > 8) { token->type = SCAN_BAD_UNICODE_LENGTH; token->number = s.length; return 0; } ss_realloc (&token->string, token->string.length + 4 + 1); uc = 0; for (i = 0; i < s.length; i++) { int digit = digit_value (s.string[i]); if (digit >= 16) { token->type = SCAN_BAD_UNICODE_DIGIT; token->number = s.string[i]; return 0; } uc = uc * 16 + digit; } if ((uc >= 0xd800 && uc < 0xe000) || uc > 0x10ffff) { token->type = SCAN_BAD_UNICODE_CODE_POINT; token->number = uc; return 0; } dst = CHAR_CAST (uint8_t *, ss_end (token->string)); token->string.length += u8_uctomb (dst, uc, 4); return true; } static enum scan_result scan_string_segment__ (struct scanner *scanner, enum segment_type type, struct substring s, struct token *token) { bool ok; switch (type) { case SEG_QUOTED_STRING: ok = scan_quoted_string__ (s, token); break; case SEG_HEX_STRING: ok = scan_hex_string__ (s, token); break; case SEG_UNICODE_STRING: ok = scan_unicode_string__ (s, token); break; default: NOT_REACHED (); } if (ok) { token->type = T_STRING; token->string.string[token->string.length] = '\0'; scanner->state = S_STRING; scanner->substate = 0; return SCAN_SAVE; } else { /* The function we called above should have filled in token->type and token->number properly to describe the error. */ ss_dealloc (&token->string); token->string = ss_empty (); return SCAN_DONE; } } static enum scan_result add_bit (struct scanner *scanner, unsigned int bit) { if (!(scanner->substate & bit)) { scanner->substate |= bit; return SCAN_MORE; } else return SCAN_BACK; } static enum scan_result scan_string__ (struct scanner *scanner, enum segment_type type, struct substring s, struct token *token) { switch (type) { case SEG_SPACES: case SEG_COMMENT: return SCAN_MORE; case SEG_NEWLINE: if (scanner->substate & SS_PLUS) return add_bit (scanner, SS_NL_AFTER_PLUS); else return add_bit (scanner, SS_NL_BEFORE_PLUS); case SEG_PUNCT: return (s.length == 1 && s.string[0] == '+' ? add_bit (scanner, SS_PLUS) : SCAN_BACK); case SEG_QUOTED_STRING: case SEG_HEX_STRING: case SEG_UNICODE_STRING: return (scanner->substate & SS_PLUS ? scan_string_segment__ (scanner, type, s, token) : SCAN_BACK); default: return SCAN_BACK; } } static enum token_type scan_reserved_word__ (struct substring word) { switch (c_toupper (word.string[0])) { case 'B': return T_BY; case 'E': return T_EQ; case 'G': return c_toupper (word.string[1]) == 'E' ? T_GE : T_GT; case 'L': return c_toupper (word.string[1]) == 'E' ? T_LE : T_LT; case 'N': return word.length == 2 ? T_NE : T_NOT; case 'O': return T_OR; case 'T': return T_TO; case 'A': return c_toupper (word.string[1]) == 'L' ? T_ALL : T_AND; case 'W': return T_WITH; } NOT_REACHED (); } static enum token_type scan_punct1__ (char c0) { switch (c0) { case '(': return T_LPAREN; case ')': return T_RPAREN; case ',': return T_COMMA; case '=': return T_EQUALS; case '-': return T_DASH; case '[': return T_LBRACK; case ']': return T_RBRACK; case '&': return T_AND; case '|': return T_OR; case '+': return T_PLUS; case '/': return T_SLASH; case '*': return T_ASTERISK; case '<': return T_LT; case '>': return T_GT; case '~': return T_NOT; } NOT_REACHED (); } static enum token_type scan_punct2__ (char c0, char c1) { switch (c0) { case '*': return T_EXP; case '<': return c1 == '=' ? T_LE : T_NE; case '>': return T_GE; case '~': return T_NE; case '&': return T_AND; case '|': return T_OR; } NOT_REACHED (); } static enum token_type scan_punct__ (struct substring s) { return (s.length == 1 ? scan_punct1__ (s.string[0]) : scan_punct2__ (s.string[0], s.string[1])); } static double scan_number__ (struct substring s) { char buf[128]; double number; char *p; if (s.length < sizeof buf) { p = buf; memcpy (buf, s.string, s.length); buf[s.length] = '\0'; } else p = xmemdup0 (s.string, s.length); number = c_strtod (p, NULL); if (p != buf) free (p); return number; } static enum scan_result scan_unexpected_char (const struct substring *s, struct token *token) { ucs4_t uc; token->type = SCAN_UNEXPECTED_CHAR; u8_mbtouc (&uc, CHAR_CAST (const uint8_t *, s->string), s->length); token->number = uc; return SCAN_DONE; } const char * scan_type_to_string (enum scan_type type) { switch (type) { #define SCAN_TYPE(NAME) case SCAN_##NAME: return #NAME; SCAN_TYPES #undef SCAN_TYPE default: return token_type_to_name ((enum token_type) type); } } bool is_scan_type (enum scan_type type) { return type > SCAN_FIRST && type < SCAN_LAST; } static enum scan_result scan_start__ (struct scanner *scanner, enum segment_type type, struct substring s, struct token *token) { switch (type) { case SEG_NUMBER: token->type = T_POS_NUM; token->number = scan_number__ (s); return SCAN_DONE; case SEG_QUOTED_STRING: case SEG_HEX_STRING: case SEG_UNICODE_STRING: return scan_string_segment__ (scanner, type, s, token); case SEG_UNQUOTED_STRING: case SEG_DO_REPEAT_COMMAND: case SEG_INLINE_DATA: case SEG_DOCUMENT: token->type = T_STRING; ss_alloc_substring (&token->string, s); return SCAN_DONE; case SEG_RESERVED_WORD: token->type = scan_reserved_word__ (s); return SCAN_DONE; case SEG_IDENTIFIER: token->type = T_ID; ss_alloc_substring (&token->string, s); return SCAN_DONE; case SEG_PUNCT: if (s.length == 1 && s.string[0] == '-') { scanner->state = S_DASH; return SCAN_SAVE; } else { token->type = scan_punct__ (s); return SCAN_DONE; } case SEG_SHBANG: case SEG_SPACES: case SEG_COMMENT: case SEG_NEWLINE: case SEG_COMMENT_COMMAND: token->type = SCAN_SKIP; return SCAN_DONE; case SEG_START_DOCUMENT: token->type = T_ID; ss_alloc_substring (&token->string, ss_cstr ("DOCUMENT")); return SCAN_DONE; case SEG_START_COMMAND: case SEG_SEPARATE_COMMANDS: case SEG_END_COMMAND: token->type = T_ENDCMD; return SCAN_DONE; case SEG_END: token->type = T_STOP; return SCAN_DONE; case SEG_EXPECTED_QUOTE: token->type = SCAN_EXPECTED_QUOTE; return SCAN_DONE; case SEG_EXPECTED_EXPONENT: token->type = SCAN_EXPECTED_EXPONENT; ss_alloc_substring (&token->string, s); return SCAN_DONE; case SEG_UNEXPECTED_DOT: token->type = SCAN_UNEXPECTED_DOT; return SCAN_DONE; case SEG_UNEXPECTED_CHAR: return scan_unexpected_char (&s, token); } NOT_REACHED (); } static enum scan_result scan_dash__ (enum segment_type type, struct substring s, struct token *token) { switch (type) { case SEG_SPACES: case SEG_COMMENT: return SCAN_MORE; case SEG_NUMBER: token->type = T_NEG_NUM; token->number = -scan_number__ (s); return SCAN_DONE; default: token->type = T_DASH; return SCAN_BACK; } } /* Initializes SCANNER for scanning a token from a sequence of segments. Initializes TOKEN as the output token. (The client retains ownership of TOKEN, but it must be preserved across subsequent calls to scanner_push() for SCANNER.) A scanner only produces a single token. To obtain the next token, re-initialize it by calling this function again. A scanner does not contain any external references, so nothing needs to be done to destroy one. For the same reason, scanners may be copied with plain struct assignment (or memcpy). */ void scanner_init (struct scanner *scanner, struct token *token) { scanner->state = S_START; token_init (token); } /* Adds the segment with type TYPE and UTF-8 text S to SCANNER. TOKEN must be the same token passed to scanner_init() for SCANNER, or a copy of it. scanner_push() may modify TOKEN. The client retains ownership of TOKEN, The possible return values are: - SCAN_DONE: All of the segments that have been passed to scanner_push() form the token now stored in TOKEN. SCANNER is now "used up" and must be reinitialized with scanner_init() if it is to be used again. Most tokens only consist of a single segment, so this is the most common return value. - SCAN_MORE: The segments passed to scanner_push() don't yet determine a token. The caller should call scanner_push() again with the next token. (This won't happen if TYPE is SEG_END indicating the end of input.) - SCAN_SAVE: This is similar to SCAN_MORE, with one difference: the caller needs to "save its place" in the stream of segments for a possible future SCAN_BACK return. This value can be returned more than once in a sequence of scanner_push() calls for SCANNER, but the caller only needs to keep track of the most recent position. - SCAN_BACK: This is similar to SCAN_DONE, but the token consists of only the segments up to and including the segment for which SCAN_SAVE was most recently returned. Segments following that one should be passed to the next scanner to be initialized. */ enum scan_result scanner_push (struct scanner *scanner, enum segment_type type, struct substring s, struct token *token) { switch (scanner->state) { case S_START: return scan_start__ (scanner, type, s, token); case S_DASH: return scan_dash__ (type, s, token); case S_STRING: return scan_string__ (scanner, type, s, token); } NOT_REACHED (); } /* Initializes SLEX for parsing INPUT, which is LENGTH bytes long, in the specified MODE. SLEX has no internal state to free, but it retains a reference to INPUT, so INPUT must not be modified or freed while SLEX is still in use. */ void string_lexer_init (struct string_lexer *slex, const char *input, size_t length, enum segmenter_mode mode) { slex->input = input; slex->length = length; slex->offset = 0; segmenter_init (&slex->segmenter, mode); } /* */ bool string_lexer_next (struct string_lexer *slex, struct token *token) { struct segmenter saved_segmenter; size_t saved_offset = 0; struct scanner scanner; scanner_init (&scanner, token); for (;;) { const char *s = slex->input + slex->offset; size_t left = slex->length - slex->offset; enum segment_type type; int n; n = segmenter_push (&slex->segmenter, s, left, true, &type); assert (n >= 0); slex->offset += n; switch (scanner_push (&scanner, type, ss_buffer (s, n), token)) { case SCAN_BACK: slex->segmenter = saved_segmenter; slex->offset = saved_offset; /* Fall through. */ case SCAN_DONE: return token->type != T_STOP; case SCAN_MORE: break; case SCAN_SAVE: saved_segmenter = slex->segmenter; saved_offset = slex->offset; break; } } } pspp-1.4.1/src/language/lexer/variable-parser.h0000644000175000017500000001165613670210420021040 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 1997-9, 2000, 2006, 2007, 2010 Free Software Foundation, Inc. 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 3 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, see . */ #ifndef VARIABLE_PARSER_H #define VARIABLE_PARSER_H 1 #include #include struct pool; struct dictionary; struct var_set; struct const_var_set; struct variable; struct lexer ; struct var_set *var_set_create_from_dict (const struct dictionary *d); struct var_set *var_set_create_from_array (struct variable *const *var, size_t); size_t var_set_get_cnt (const struct var_set *vs); void var_set_destroy (struct var_set *vs); /* Variable parsers. */ enum { PV_NONE = 0, /* No options. */ PV_SINGLE = 0001, /* Restrict to a single name or TO use. */ PV_DUPLICATE = 0002, /* Don't merge duplicates. */ PV_APPEND = 0004, /* Append to existing list. */ PV_NO_DUPLICATE = 0010, /* Error on duplicates. */ PV_NUMERIC = 0020, /* Vars must be numeric. */ PV_STRING = 0040, /* Vars must be string. */ PV_SAME_TYPE = 00100, /* All vars must be the same type. */ PV_SAME_WIDTH = 00200, /* All vars must be the same type and width. */ PV_NO_SCRATCH = 00400 /* Disallow scratch variables. */ }; struct variable *parse_variable (struct lexer *, const struct dictionary *); bool parse_variables (struct lexer *, const struct dictionary *, struct variable ***, size_t *, int opts); bool parse_variables_pool (struct lexer *, struct pool *, const struct dictionary *, struct variable ***, size_t *, int opts); bool parse_var_set_vars (struct lexer *, const struct var_set *, struct variable ***, size_t *, int opts); char *parse_DATA_LIST_var (struct lexer *, const struct dictionary *); bool parse_DATA_LIST_vars (struct lexer *, const struct dictionary *, char ***names, size_t *cnt, int opts); bool parse_DATA_LIST_vars_pool (struct lexer *, const struct dictionary *, struct pool *, char ***names, size_t *cnt, int opts); bool parse_mixed_vars (struct lexer *, const struct dictionary *dict, char ***names, size_t *cnt, int opts); bool parse_mixed_vars_pool (struct lexer *, const struct dictionary *dict, struct pool *, char ***names, size_t *cnt, int opts); /* Const wrappers */ static inline const struct variable * parse_variable_const (struct lexer *l, const struct dictionary *d) { return parse_variable (l, d); } static inline bool parse_variables_const (struct lexer *l, const struct dictionary *d, const struct variable ***v, size_t *s, int opts) { return parse_variables (l, d, (struct variable ***) v, s, opts); } static inline bool parse_variables_const_pool (struct lexer *l, struct pool *p, const struct dictionary *d, const struct variable ***v, size_t *s, int opts) { return parse_variables_pool (l, p, d, (struct variable ***) v, s, opts); } static inline struct const_var_set * const_var_set_create_from_dict (const struct dictionary *d) { return (struct const_var_set *) var_set_create_from_dict (d); } static inline struct const_var_set * const_var_set_create_from_array (const struct variable *const *var, size_t s) { return (struct const_var_set *) var_set_create_from_array ((struct variable *const *) var, s); } static inline bool parse_const_var_set_vars (struct lexer *l, const struct const_var_set *vs, const struct variable ***v, size_t *s, int opts) { return parse_var_set_vars (l, (const struct var_set *) vs, (struct variable ***) v, s, opts); } static inline void const_var_set_destroy (struct const_var_set *vs) { var_set_destroy ((struct var_set *) vs); } /* Match a variable. If the match succeeds, the variable will be placed in VAR. Returns true if successful */ bool lex_match_variable (struct lexer *lexer, const struct dictionary *dict, const struct variable **var); struct interaction; /* Parse an interaction. If not successful return false. Otherwise, a newly created interaction will be placed in IACT. It is the caller's responsibility to destroy this interaction. */ bool parse_design_interaction (struct lexer *lexer, const struct dictionary *dict, struct interaction **iact); #endif /* variable-parser.h */ pspp-1.4.1/src/language/lexer/lexer.h0000644000175000017500000001610113546443556017112 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 1997-9, 2000, 2010, 2011, 2013, 2014 Free Software Foundation, Inc. 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 3 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, see . */ #ifndef LEXER_H #define LEXER_H 1 #include #include #include #include "data/identifier.h" #include "data/variable.h" #include "libpspp/cast.h" #include "libpspp/compiler.h" #include "libpspp/prompt.h" struct lexer; /* The syntax mode for which a syntax file is intended. */ enum lex_syntax_mode { LEX_SYNTAX_AUTO, /* Try to guess intent. */ LEX_SYNTAX_INTERACTIVE, /* Interactive mode. */ LEX_SYNTAX_BATCH /* Batch mode. */ }; /* Handling of errors. */ enum lex_error_mode { LEX_ERROR_TERMINAL, /* Discard input line and continue reading. */ LEX_ERROR_CONTINUE, /* Continue to next command, except for cascading failures. */ LEX_ERROR_STOP /* Stop processing. */ }; /* Reads a single syntax file as a stream of bytes encoded in UTF-8. Not opaque. */ struct lex_reader { const struct lex_reader_class *class; enum lex_syntax_mode syntax; enum lex_error_mode error; char *encoding; char *file_name; /* NULL if not associated with a file. */ int line_number; /* 1-based initial line number, 0 if none. */ bool eof; }; /* An implementation of a lex_reader. */ struct lex_reader_class { /* Reads up to N bytes of data from READER into N. Returns the positive number of bytes read if successful, or zero at end of input or on error. STYLE provides a hint to interactive readers as to what kind of syntax is being read right now. */ size_t (*read) (struct lex_reader *reader, char *buf, size_t n, enum prompt_style style); /* Closes and destroys READER, releasing any allocated storage. The caller will free the 'file_name' member of READER, so the implementation should not do so. */ void (*destroy) (struct lex_reader *reader); }; /* Helper functions for lex_reader. */ void lex_reader_init (struct lex_reader *, const struct lex_reader_class *); void lex_reader_set_file_name (struct lex_reader *, const char *file_name); /* Creating various kinds of lex_readers. */ struct lex_reader *lex_reader_for_file (const char *file_name, const char *encoding, enum lex_syntax_mode syntax, enum lex_error_mode error); struct lex_reader *lex_reader_for_string (const char *, const char *encoding); struct lex_reader *lex_reader_for_format (const char *, const char *, ...) PRINTF_FORMAT (1, 3); struct lex_reader *lex_reader_for_substring_nocopy (struct substring, const char *encoding); /* Initialization. */ struct lexer *lex_create (void); void lex_destroy (struct lexer *); /* Files. */ void lex_include (struct lexer *, struct lex_reader *); void lex_append (struct lexer *, struct lex_reader *); /* Advancing. */ void lex_get (struct lexer *); /* Token testing functions. */ bool lex_is_number (const struct lexer *); double lex_number (const struct lexer *); bool lex_is_integer (const struct lexer *); long lex_integer (const struct lexer *); bool lex_is_string (const struct lexer *); /* Token testing functions with lookahead. */ bool lex_next_is_number (const struct lexer *, int n); double lex_next_number (const struct lexer *, int n); bool lex_next_is_integer (const struct lexer *, int n); long lex_next_integer (const struct lexer *, int n); bool lex_next_is_string (const struct lexer *, int n); /* Token matching functions. */ bool lex_match (struct lexer *, enum token_type); bool lex_match_id (struct lexer *, const char *); bool lex_match_id_n (struct lexer *, const char *, size_t n); bool lex_match_int (struct lexer *, int); bool lex_match_phrase (struct lexer *, const char *s); /* Forcible matching functions. */ bool lex_force_match (struct lexer *, enum token_type) WARN_UNUSED_RESULT; bool lex_force_match_id (struct lexer *, const char *) WARN_UNUSED_RESULT; bool lex_force_int (struct lexer *) WARN_UNUSED_RESULT; bool lex_force_num (struct lexer *) WARN_UNUSED_RESULT; bool lex_force_id (struct lexer *) WARN_UNUSED_RESULT; bool lex_force_string (struct lexer *) WARN_UNUSED_RESULT; bool lex_force_string_or_id (struct lexer *) WARN_UNUSED_RESULT; /* Token accessors. */ enum token_type lex_token (const struct lexer *); double lex_tokval (const struct lexer *); const char *lex_tokcstr (const struct lexer *); struct substring lex_tokss (const struct lexer *); /* Looking ahead. */ const struct token *lex_next (const struct lexer *, int n); enum token_type lex_next_token (const struct lexer *, int n); const char *lex_next_tokcstr (const struct lexer *, int n); double lex_next_tokval (const struct lexer *, int n); struct substring lex_next_tokss (const struct lexer *, int n); /* Current position. */ int lex_get_first_line_number (const struct lexer *, int n); int lex_get_last_line_number (const struct lexer *, int n); int lex_get_first_column (const struct lexer *, int n); int lex_get_last_column (const struct lexer *, int n); const char *lex_get_file_name (const struct lexer *); const char *lex_get_encoding (const struct lexer *); /* Issuing errors. */ void lex_error (struct lexer *, const char *, ...) PRINTF_FORMAT (2, 3); void lex_next_error (struct lexer *, int n0, int n1, const char *, ...) PRINTF_FORMAT (4, 5); int lex_end_of_command (struct lexer *); void lex_error_expecting (struct lexer *, const char *, ...) SENTINEL(0); #define lex_error_expecting(...) \ lex_error_expecting(__VA_ARGS__, NULL_SENTINEL) void lex_sbc_only_once (const char *); void lex_sbc_missing (const char *); void lex_spec_only_once (struct lexer *, const char *subcommand, const char *specification); void lex_spec_missing (struct lexer *, const char *subcommand, const char *specification); void lex_error_valist (struct lexer *, const char *, va_list) PRINTF_FORMAT (2, 0); void lex_next_error_valist (struct lexer *lexer, int n0, int n1, const char *format, va_list) PRINTF_FORMAT (4, 0); /* Error handling. */ enum lex_syntax_mode lex_get_syntax_mode (const struct lexer *); enum lex_error_mode lex_get_error_mode (const struct lexer *); void lex_discard_rest_of_command (struct lexer *); void lex_interactive_reset (struct lexer *); void lex_discard_noninteractive (struct lexer *); #endif /* lexer.h */ pspp-1.4.1/src/language/lexer/q2c.c0000644000175000017500000013375413670210420016445 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 1997-9, 2000, 2008, 2010, 2011 Free Software Foundation, Inc. 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 3 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, see . */ #include #include #include #include #include #include #include #include #include /* GNU C allows the programmer to declare that certain functions take printf-like arguments, never return, etc. Conditionalize these declarations on whether gcc is in use. */ #if __GNUC__ > 1 #define ATTRIBUTE(X) __attribute__ (X) #else #define ATTRIBUTE(X) #endif /* Marks a function argument as possibly not used. */ #define UNUSED ATTRIBUTE ((unused)) /* Marks a function that will never return. */ #define NO_RETURN ATTRIBUTE ((noreturn)) /* Mark a function as taking a printf- or scanf-like format string as its FMT'th argument and that the FIRST'th argument is the first one to be checked against the format string. */ #define PRINTF_FORMAT(FMT, FIRST) ATTRIBUTE ((format (__printf__, FMT, FIRST))) /* Max length of an input line. */ #define MAX_LINE_LEN 1024 /* Max token length. */ #define MAX_TOK_LEN 1024 /* argv[0]. */ static char *program_name; /* Have the input and output files been opened yet? */ static bool is_open; /* Input, output files. */ static FILE *in, *out; /* Input, output file names. */ static char *ifn, *ofn; /* Input, output file line number. */ static int ln, oln = 1; /* Input line buffer, current position. */ static char *buf, *cp; /* Token types. */ enum { T_STRING = 256, /* String literal. */ T_ID = 257 /* Identifier. */ }; /* Current token: either one of the above, or a single character. */ static int token; /* Token string value. */ static char *tokstr; /* Utility functions. */ /* Close all open files and delete the output file, on failure. */ static void finish_up (void) { if (!is_open) return; is_open = false; fclose (in); fclose (out); if (remove (ofn) == -1) fprintf (stderr, "%s: %s: remove: %s\n", program_name, ofn, strerror (errno)); } void hcf (void) NO_RETURN; /* Terminate unsuccessfully. */ void hcf (void) { finish_up (); exit (EXIT_FAILURE); } int fail (const char *, ...) PRINTF_FORMAT (1, 2) NO_RETURN; int error (const char *, ...) PRINTF_FORMAT (1, 2) NO_RETURN; /* Output an error message and terminate unsuccessfully. */ int fail (const char *format, ...) { va_list args; va_start (args, format); fprintf (stderr, "%s: ", program_name); vfprintf (stderr, format, args); fprintf (stderr, "\n"); va_end (args); hcf (); } /* Output a context-dependent error message and terminate unsuccessfully. */ int error (const char *format,...) { va_list args; va_start (args, format); fprintf (stderr, "%s:%d: (column %d) ", ifn, ln, (int) (cp - buf)); vfprintf (stderr, format, args); fprintf (stderr, "\n"); va_end (args); hcf (); } #define VME "virtual memory exhausted" /* Allocate a block of SIZE bytes and return a pointer to its beginning. */ static void * xmalloc (size_t size) { void *vp; if (size == 0) return NULL; vp = malloc (size); if (!vp) fail ("xmalloc(%lu): %s", (unsigned long) size, VME); return vp; } /* Make a dynamically allocated copy of string S and return a pointer to the first character. */ static char * xstrdup (const char *s) { size_t size; char *t; assert (s != NULL); size = strlen (s) + 1; t = malloc (size); if (!t) fail ("xstrdup(%lu): %s", (unsigned long) strlen (s), VME); memcpy (t, s, size); return t; } /* Returns a pointer to one of 8 static buffers. The buffers are used in rotation. */ static char * get_buffer (void) { static char b[8][256]; static int cb; if (++cb >= 8) cb = 0; return b[cb]; } /* Copies a string to a static buffer, converting it to lowercase in the process, and returns a pointer to the static buffer. */ static char * st_lower (const char *s) { char *p, *cp; p = cp = get_buffer (); while (*s) *cp++ = tolower ((unsigned char) (*s++)); *cp++ = '\0'; return p; } /* Copies a string to a static buffer, converting it to uppercase in the process, and returns a pointer to the static buffer. */ static char * st_upper (const char *s) { char *p, *cp; p = cp = get_buffer (); while (*s) *cp++ = toupper ((unsigned char) (*s++)); *cp++ = '\0'; return p; } /* Returns the address of the first non-whitespace character in S, or the address of the null terminator if none. */ static char * skip_ws (char *s) { while (isspace ((unsigned char) *s)) s++; return s; } /* Read one line from the input file into buf. Lines having special formats are handled specially. */ static bool get_line (void) { ln++; if (0 == fgets (buf, MAX_LINE_LEN, in)) { if (ferror (in)) fail ("%s: fgets: %s", ifn, strerror (errno)); return false; } cp = strchr (buf, '\n'); if (cp != NULL) *cp = '\0'; cp = buf; return true; } /* Symbol table manager. */ /* Symbol table entry. */ typedef struct symbol symbol; struct symbol { symbol *next; /* Next symbol in symbol table. */ char *name; /* Symbol name. */ int unique; /* 1=Name must be unique in this file. */ int ln; /* Line number of definition. */ int value; /* Symbol value. */ }; /* Symbol table. */ symbol *symtab; /* Add a symbol to the symbol table having name NAME, uniqueness UNIQUE, and value VALUE. If a symbol having the same name is found in the symbol table, its sequence number is returned and the symbol table is not modified. Otherwise, the symbol is added and the next available sequence number is returned. */ static int add_symbol (const char *name, int unique, int value) { symbol *iter, *sym; int x; sym = xmalloc (sizeof *sym); sym->name = xstrdup (name); sym->unique = unique; sym->value = value; sym->next = NULL; sym->ln = ln; if (!symtab) { symtab = sym; return 1; } iter = symtab; x = 1; for (;;) { if (!strcmp (iter->name, name)) { if (iter->unique) { fprintf (stderr, "%s:%d: `%s' is already defined above\n", ifn, ln, name); fprintf (stderr, "%s:%d: location of previous definition\n", ifn, iter->ln); hcf (); } free (sym->name); free (sym); return x; } if (!iter->next) break; iter = iter->next; x++; } iter->next = sym; return ++x; } /* Finds the symbol having given sequence number X within the symbol table, and returns the associated symbol structure. */ static symbol * find_symbol (int x) { symbol *iter; iter = symtab; while (x > 1 && iter) { iter = iter->next; x--; } assert (iter); return iter; } #if DUMP_TOKENS /* Writes a printable representation of the current token to stdout. */ static void dump_token (void) { switch (token) { case T_STRING: printf ("STRING\t\"%s\"\n", tokstr); break; case T_ID: printf ("ID\t%s\n", tokstr); break; default: printf ("PUNCT\t%c\n", token); } } #endif /* DUMP_TOKENS */ const char hyphen_proxy = '_'; static void id_cpy (char **cp) { char *dest = tokstr; char *src = *cp; while (*src == '_' || *src == '-' || isalnum ((unsigned char) *src)) { *dest++ = *src == '-' ? hyphen_proxy :toupper ((unsigned char) (*src)); src++; } *cp = src; *dest++ = '\0'; } static char * unmunge (const char *s) { char *dest = xmalloc (strlen (s) + 1); char *d = dest; while (*s) { if (*s == hyphen_proxy) *d = '-'; else *d = *s; s++; d++; } *d = '\0'; return dest; } /* Reads a token from the input file. */ static int lex_get (void) { /* Skip whitespace and check for end of file. */ for (;;) { cp = skip_ws (cp); if (*cp != '\0') break; if (!get_line ()) fail ("%s: Unexpected end of file.", ifn); } if (*cp == '"') { char *dest = tokstr; token = T_STRING; cp++; while (*cp != '"' && *cp) { if (*cp == '\\') { cp++; if (!*cp) error ("Unterminated string literal."); *dest++ = *cp++; } else *dest++ = *cp++; } *dest++ = 0; if (!*cp) error ("Unterminated string literal."); cp++; } else if (*cp == '_' || isalnum ((unsigned char) *cp)) { char *dest = tokstr; token = T_ID; id_cpy (&cp); } else token = *cp++; #if DUMP_TOKENS dump_token (); #endif return token; } /* Force the current token to be an identifier token. */ static void force_id (void) { if (token != T_ID) error ("Identifier expected."); } /* Force the current token to be a string token. */ static void force_string (void) { if (token != T_STRING) error ("String expected."); } /* Checks whether the current token is the identifier S; if so, skips the token and returns true; otherwise, returns false. */ static bool match_id (const char *s) { if (token == T_ID && !strcmp (tokstr, s)) { lex_get (); return true; } return false; } /* Checks whether the current token is T. If so, skips the token and returns true; otherwise, returns false. */ static bool match_token (int t) { if (token == t) { lex_get (); return true; } return false; } /* Force the current token to be T, and skip it. */ static void skip_token (int t) { if (token != t) error ("`%c' expected.", t); lex_get (); } /* Structures. */ /* Some specifiers have associated values. */ enum { VAL_NONE, /* No value. */ VAL_INT, /* Integer value. */ VAL_DBL, /* Floating point value. */ VAL_STRING /* String value. */ }; /* For those specifiers with values, the syntax of those values. */ enum { VT_PLAIN, /* Unadorned value. */ VT_PAREN /* Value must be enclosed in parentheses. */ }; /* Forward definition. */ typedef struct specifier specifier; /* A single setting. */ typedef struct setting setting; struct setting { specifier *parent; /* Owning specifier. */ setting *next; /* Next in the chain. */ char *specname; /* Name of the setting. */ int con; /* Sequence number. */ /* Values. */ int valtype; /* One of VT_*. */ int value; /* One of VAL_*. */ int optvalue; /* 1=value is optional, 0=value is required. */ char *valname; /* Variable name for the value. */ char *restriction; /* !=NULL: expression specifying valid values. */ }; /* A single specifier. */ struct specifier { specifier *next; /* Next in the chain. */ char *varname; /* Variable name. */ setting *s; /* Associated settings. */ setting *def; /* Default setting. */ setting *omit_kw; /* Setting for which the keyword can be omitted. */ int index; /* Next array index. */ }; /* Subcommand types. */ typedef enum { SBC_PLAIN, /* The usual case. */ SBC_VARLIST, /* Variable list. */ SBC_INT, /* Integer value. */ SBC_PINT, /* Integer inside parentheses. */ SBC_DBL, /* Floating point value. */ SBC_INT_LIST, /* List of integers (?). */ SBC_DBL_LIST, /* List of floating points (?). */ SBC_CUSTOM, /* Custom. */ SBC_ARRAY, /* Array of boolean values. */ SBC_STRING, /* String value. */ SBC_VAR /* Single variable name. */ } subcommand_type; typedef enum { ARITY_ONCE_EXACTLY, /* must occur exactly once */ ARITY_ONCE_ONLY, /* zero or once */ ARITY_MANY /* 0, 1, ... , inf */ }subcommand_arity; /* A single subcommand. */ typedef struct subcommand subcommand; struct subcommand { subcommand *next; /* Next in the chain. */ char *name; /* Subcommand name. */ subcommand_type type; /* One of SBC_*. */ subcommand_arity arity; /* How many times should the subcommand occur*/ int narray; /* Index of next array element. */ const char *prefix; /* Prefix for variable and constant names. */ specifier *spec; /* Array of specifiers. */ char *pv_options; /* PV_* options for SBC_VARLIST. */ }; /* Name of the command; i.e., DESCRIPTIVES. */ char *cmdname; /* Short prefix for the command; i.e., `dsc_'. */ char *prefix; /* List of subcommands. */ subcommand *subcommands; /* Default subcommand if any, or NULL. */ subcommand *def; /* Parsing. */ void parse_subcommands (void); /* Parse an entire specification. */ static void parse (void) { /* Get the command name and prefix. */ if (token != T_STRING && token != T_ID) error ("Command name expected."); cmdname = xstrdup (tokstr); lex_get (); skip_token ('('); force_id (); prefix = xstrdup (tokstr); lex_get (); skip_token (')'); skip_token (':'); /* Read all the subcommands. */ subcommands = NULL; def = NULL; parse_subcommands (); } /* Parses a single setting into S, given subcommand information SBC and specifier information SPEC. */ static void parse_setting (setting *s, specifier *spec) { s->parent = spec; if (match_token ('*')) { if (spec->omit_kw) error ("Cannot have two settings with omittable keywords."); else spec->omit_kw = s; } if (match_token ('!')) { if (spec->def) error ("Cannot have two default settings."); else spec->def = s; } force_id (); s->specname = xstrdup (tokstr); s->con = add_symbol (s->specname, 0, 0); s->value = VAL_NONE; lex_get (); /* Parse setting value info if necessary. */ if (token != '/' && token != ';' && token != '.' && token != ',') { if (token == '(') { s->valtype = VT_PAREN; lex_get (); } else s->valtype = VT_PLAIN; s->optvalue = match_token ('*'); if (match_id ("N")) s->value = VAL_INT; else if (match_id ("D")) s->value = VAL_DBL; else if (match_id ("S")) s->value = VAL_STRING; else error ("`n', `d', or `s' expected."); skip_token (':'); force_id (); s->valname = xstrdup (tokstr); lex_get (); if (token == ',') { lex_get (); force_string (); s->restriction = xstrdup (tokstr); lex_get (); } else s->restriction = NULL; if (s->valtype == VT_PAREN) skip_token (')'); } } /* Parse a single specifier into SPEC, given subcommand information SBC. */ static void parse_specifier (specifier *spec, subcommand *sbc) { spec->index = 0; spec->s = NULL; spec->def = NULL; spec->omit_kw = NULL; spec->varname = NULL; if (token == T_ID) { spec->varname = xstrdup (st_lower (tokstr)); lex_get (); } /* Handle array elements. */ if (token != ':') { spec->index = sbc->narray; if (sbc->type == SBC_ARRAY) { if (token == '|') token = ','; else sbc->narray++; } spec->s = NULL; return; } skip_token (':'); if (sbc->type == SBC_ARRAY && token == T_ID) { spec->varname = xstrdup (st_lower (tokstr)); spec->index = sbc->narray; sbc->narray++; } /* Parse all the settings. */ { setting **s = &spec->s; for (;;) { *s = xmalloc (sizeof **s); parse_setting (*s, spec); if (token == ',' || token == ';' || token == '.') break; skip_token ('/'); s = &(*s)->next; } (*s)->next = NULL; } } /* Parse a list of specifiers for subcommand SBC. */ static void parse_specifiers (subcommand *sbc) { specifier **spec = &sbc->spec; if (token == ';' || token == '.') { *spec = NULL; return; } for (;;) { *spec = xmalloc (sizeof **spec); parse_specifier (*spec, sbc); if (token == ';' || token == '.') break; skip_token (','); spec = &(*spec)->next; } (*spec)->next = NULL; } /* Parse a subcommand into SBC. */ static void parse_subcommand (subcommand *sbc) { if (match_token ('*')) { if (def) error ("Multiple default subcommands."); def = sbc; } sbc->arity = ARITY_ONCE_ONLY; if (match_token('+')) sbc->arity = ARITY_MANY; else if (match_token('^')) sbc->arity = ARITY_ONCE_EXACTLY ; force_id (); sbc->name = xstrdup (tokstr); lex_get (); sbc->narray = 0; sbc->type = SBC_PLAIN; sbc->spec = NULL; if (match_token ('[')) { force_id (); sbc->prefix = xstrdup (st_lower (tokstr)); lex_get (); skip_token (']'); skip_token ('='); sbc->type = SBC_ARRAY; parse_specifiers (sbc); } else { if (match_token ('(')) { force_id (); sbc->prefix = xstrdup (st_lower (tokstr)); lex_get (); skip_token (')'); } else sbc->prefix = ""; skip_token ('='); if (match_id ("VAR")) sbc->type = SBC_VAR; if (match_id ("VARLIST")) { if (match_token ('(')) { force_string (); sbc->pv_options = xstrdup (tokstr); lex_get(); skip_token (')'); } else sbc->pv_options = NULL; sbc->type = SBC_VARLIST; } else if (match_id ("INTEGER")) sbc->type = match_id ("LIST") ? SBC_INT_LIST : SBC_INT; else if (match_id ("PINT")) sbc->type = SBC_PINT; else if (match_id ("DOUBLE")) { if (match_id ("LIST")) sbc->type = SBC_DBL_LIST; else sbc->type = SBC_DBL; } else if (match_id ("STRING")) sbc->type = SBC_STRING; else if (match_id ("CUSTOM")) sbc->type = SBC_CUSTOM; else parse_specifiers (sbc); } } /* Parse all the subcommands. */ void parse_subcommands (void) { subcommand **sbc = &subcommands; for (;;) { *sbc = xmalloc (sizeof **sbc); (*sbc)->next = NULL; parse_subcommand (*sbc); if (token == '.') return; skip_token (';'); sbc = &(*sbc)->next; } } /* Output. */ #define BASE_INDENT 2 /* Starting indent. */ #define INC_INDENT 2 /* Indent increment. */ /* Increment the indent. */ #define indent() indent += INC_INDENT #define outdent() indent -= INC_INDENT /* Size of the indent from the left margin. */ int indent; void dump (int, const char *, ...) PRINTF_FORMAT (2, 3); /* Write line FORMAT to the output file, formatted as with printf, indented `indent' characters from the left margin. If INDENTION is greater than 0, indents BASE_INDENT * INDENTION characters after writing the line; if INDENTION is less than 0, dedents BASE_INDENT * INDENTION characters _before_ writing the line. */ void dump (int indention, const char *format, ...) { va_list args; int i; if (indention < 0) indent += BASE_INDENT * indention; oln++; va_start (args, format); for (i = 0; i < indent; i++) putc (' ', out); vfprintf (out, format, args); putc ('\n', out); va_end (args); if (indention > 0) indent += BASE_INDENT * indention; } /* Writes a blank line to the output file and adjusts 'indent' by BASE_INDENT * INDENTION characters. (This is only useful because GCC complains about using "" as a format string, for whatever reason.) */ static void dump_blank_line (int indention) { oln++; indent += BASE_INDENT * indention; putc ('\n', out); } /* Write the structure members for specifier SPEC to the output file. SBC is the including subcommand. */ static void dump_specifier_vars (const specifier *spec, const subcommand *sbc) { if (spec->varname) dump (0, "long %s%s;", sbc->prefix, spec->varname); { setting *s; for (s = spec->s; s; s = s->next) { if (s->value != VAL_NONE) { const char *typename; assert (s->value == VAL_INT || s->value == VAL_DBL || s->value == VAL_STRING); typename = (s->value == VAL_INT ? "long" : s->value == VAL_DBL ? "double" : "char *"); dump (0, "%s %s%s;", typename, sbc->prefix, st_lower (s->valname)); } } } } /* Returns true if string T is a PSPP keyword, false otherwise. */ static bool is_keyword (const char *t) { static const char *kw[] = { "AND", "OR", "NOT", "EQ", "GE", "GT", "LE", "LT", "NE", "ALL", "BY", "TO", "WITH", 0, }; const char **cp; for (cp = kw; *cp; cp++) if (!strcmp (t, *cp)) return true; return false; } /* Transforms a string NAME into a valid C identifier: makes everything lowercase and maps nonalphabetic characters to underscores. Returns a pointer to a static buffer. */ static char * make_identifier (const char *name) { char *p = get_buffer (); char *cp; for (cp = p; *name; name++) if (isalpha ((unsigned char) *name)) *cp++ = tolower ((unsigned char) (*name)); else *cp++ = '_'; *cp = '\0'; return p; } /* Writes the struct and enum declarations for the parser. */ static void dump_declarations (void) { indent = 0; dump (0, "struct dataset;"); /* Write out enums 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 enum is not followed by a comma, as mandated by ANSI C89. */ for (sym = symtab, f = k = 0; sym; sym = sym->next) if (!sym->unique && !is_keyword (sym->name)) { if (!f) { dump (0, "/* Settings for subcommand specifiers. */"); dump (1, "enum"); dump (1, "{"); f = 1; } if (buf == NULL) buf = xmalloc (1024); else dump (0, "%s", buf); if (k) sprintf (buf, "%s%s,", st_upper (prefix), sym->name); else { k = 1; sprintf (buf, "%s%s = 1000,", st_upper (prefix), sym->name); } } if (buf) { buf[strlen (buf) - 1] = 0; dump (0, "%s", buf); free (buf); } if (f) { dump (-1, "};"); dump_blank_line (-1); } } /* Write out some type definitions */ { dump (0, "#define MAXLISTS 10"); } /* For every array subcommand, write out the associated enumerated values. */ { subcommand *sbc; for (sbc = subcommands; sbc; sbc = sbc->next) if (sbc->type == SBC_ARRAY && sbc->narray) { dump (0, "/* Array indices for %s subcommand. */", sbc->name); dump (1, "enum"); dump (1, "{"); { specifier *spec; for (spec = sbc->spec; spec; spec = spec->next) dump (0, "%s%s%s = %d,", st_upper (prefix), st_upper (sbc->prefix), st_upper (spec->varname), spec->index); dump (0, "%s%scount", st_upper (prefix), st_upper (sbc->prefix)); dump (-1, "};"); dump_blank_line (-1); } } } /* Write out structure declaration. */ { subcommand *sbc; dump (0, "/* %s structure. */", cmdname); dump (1, "struct cmd_%s", make_identifier (cmdname)); dump (1, "{"); for (sbc = subcommands; sbc; sbc = sbc->next) { int f = 0; if (sbc != subcommands) dump_blank_line (0); dump (0, "/* %s subcommand. */", sbc->name); dump (0, "int sbc_%s;", st_lower (sbc->name)); switch (sbc->type) { case SBC_ARRAY: case SBC_PLAIN: { specifier *spec; for (spec = sbc->spec; spec; spec = spec->next) { if (spec->s == 0) { if (sbc->type == SBC_PLAIN) dump (0, "long int %s%s;", st_lower (sbc->prefix), spec->varname); else if (f == 0) { dump (0, "int a_%s[%s%scount];", st_lower (sbc->name), st_upper (prefix), st_upper (sbc->prefix) ); f = 1; } } else dump_specifier_vars (spec, sbc); } } break; case SBC_VARLIST: dump (0, "size_t %sn_%s;", st_lower (sbc->prefix), st_lower (sbc->name)); dump (0, "const struct variable **%sv_%s;", st_lower (sbc->prefix), st_lower (sbc->name)); break; case SBC_VAR: dump (0, "const struct variable *%sv_%s;", st_lower (sbc->prefix), st_lower (sbc->name)); break; case SBC_STRING: dump (0, "char *s_%s;", st_lower (sbc->name)); break; case SBC_INT: case SBC_PINT: dump (0, "long n_%s[MAXLISTS];", st_lower (sbc->name)); break; case SBC_DBL: dump (0, "double n_%s[MAXLISTS];", st_lower (sbc->name)); break; case SBC_DBL_LIST: dump (0, "subc_list_double dl_%s[MAXLISTS];", st_lower(sbc->name)); break; case SBC_INT_LIST: dump (0, "subc_list_int il_%s[MAXLISTS];", st_lower(sbc->name)); break; default:; /* nothing */ } } dump (-1, "};"); dump_blank_line (-1); } /* Write out prototypes for custom_*() functions as necessary. */ { bool seen = false; subcommand *sbc; for (sbc = subcommands; sbc; sbc = sbc->next) if (sbc->type == SBC_CUSTOM) { if (!seen) { seen = true; dump (0, "/* Prototype for custom subcommands of %s. */", cmdname); } dump (0, "static int %scustom_%s (struct lexer *, struct dataset *, struct cmd_%s *, void *);", st_lower (prefix), st_lower (sbc->name), make_identifier (cmdname)); } if (seen) dump_blank_line (0); } /* Prototypes for parsing and freeing functions. */ { dump (0, "/* Command parsing functions. */"); dump (0, "static int parse_%s (struct lexer *, struct dataset *, struct cmd_%s *, void *);", make_identifier (cmdname), make_identifier (cmdname)); dump (0, "static void free_%s (struct cmd_%s *);", make_identifier (cmdname), make_identifier (cmdname)); dump_blank_line (0); } } /* Writes out code to initialize all the variables that need initialization for particular specifier SPEC inside subcommand SBC. */ static void dump_specifier_init (const specifier *spec, const subcommand *sbc) { if (spec->varname) { char s[256]; if (spec->def) sprintf (s, "%s%s", st_upper (prefix), find_symbol (spec->def->con)->name); else strcpy (s, "-1"); dump (0, "p->%s%s = %s;", sbc->prefix, spec->varname, s); } { setting *s; for (s = spec->s; s; s = s->next) { if (s->value != VAL_NONE) { const char *init; assert (s->value == VAL_INT || s->value == VAL_DBL || s->value == VAL_STRING); init = (s->value == VAL_INT ? "LONG_MIN" : s->value == VAL_DBL ? "SYSMIS" : "NULL"); dump (0, "p->%s%s = %s;", sbc->prefix, st_lower (s->valname), init); } } } } /* Write code to initialize all variables. */ static 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)); if (! persistent) { switch (sbc->type) { case SBC_INT_LIST: case SBC_DBL_LIST: dump (1, "{"); dump (0, "int i;"); dump (1, "for (i = 0; i < MAXLISTS; ++i)"); dump (0, "subc_list_%s_create(&p->%cl_%s[i]) ;", sbc->type == SBC_INT_LIST ? "int" : "double", sbc->type == SBC_INT_LIST ? 'i' : 'd', st_lower (sbc->name) ); dump (-2, "}"); break; case SBC_DBL: dump (1, "{"); dump (0, "int i;"); dump (1, "for (i = 0; i < MAXLISTS; ++i)"); dump (0, "p->n_%s[i] = SYSMIS;", st_lower (sbc->name)); dump (-2, "}"); break; case SBC_CUSTOM: /* nothing */ break; 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) { 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; 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 (1, "{"); dump (0, "int i;"); dump (1, "for (i = 0; i < MAXLISTS; ++i)"); dump (0, "p->n_%s[i] = LONG_MIN;", st_lower (sbc->name)); dump (-2, "}"); break; default: abort (); } } } } } /* Return a pointer to a static buffer containing an expression that will match token T. */ static char * make_match (const char *t) { char *s; s = get_buffer (); while (*t == '_') t++; if (is_keyword (t)) sprintf (s, "lex_match (lexer, T_%s)", t); else if (!strcmp (t, "ON") || !strcmp (t, "YES")) strcpy (s, "(lex_match_id (lexer, \"ON\") || lex_match_id (lexer, \"YES\") " "|| lex_match_id (lexer, \"TRUE\"))"); else if (!strcmp (t, "OFF") || !strcmp (t, "NO")) strcpy (s, "(lex_match_id (lexer, \"OFF\") || lex_match_id (lexer, \"NO\") " "|| lex_match_id (lexer, \"FALSE\"))"); else if (isdigit ((unsigned char) t[0])) sprintf (s, "lex_match_int (lexer, %s)", t); else if (strchr (t, hyphen_proxy)) { char *c = unmunge (t); sprintf (s, "lex_match_phrase (lexer, \"%s\")", c); free (c); } else sprintf (s, "lex_match_id (lexer, \"%s\")", t); return s; } /* Write out the parsing code for specifier SPEC within subcommand SBC. */ static void dump_specifier_parse (const specifier *spec, const subcommand *sbc) { setting *s; if (spec->omit_kw && spec->omit_kw->next) error ("Omittable setting is not last setting in `%s' specifier.", spec->varname); if (spec->omit_kw && spec->omit_kw->parent->next) error ("Default specifier is not in last specifier in `%s' " "subcommand.", sbc->name); for (s = spec->s; s; s = s->next) { int first = spec == sbc->spec && s == spec->s; /* Match the setting's keyword. */ if (spec->omit_kw == s) { if (!first) { dump (1, "else"); dump (1, "{"); } dump (1, "%s;", make_match (s->specname)); } else dump (1, "%sif (%s)", first ? "" : "else ", make_match (s->specname)); /* Handle values. */ if (s->value == VAL_NONE) dump (0, "p->%s%s = %s%s;", sbc->prefix, spec->varname, st_upper (prefix), find_symbol (s->con)->name); else { if (spec->omit_kw != s) dump (1, "{"); if (spec->varname) { dump (0, "p->%s%s = %s%s;", sbc->prefix, spec->varname, st_upper (prefix), find_symbol (s->con)->name); if (sbc->type == SBC_ARRAY) dump (0, "p->a_%s[%s%s%s] = 1;", st_lower (sbc->name), st_upper (prefix), st_upper (sbc->prefix), st_upper (spec->varname)); } if (s->valtype == VT_PAREN) { if (s->optvalue) { dump (1, "if (lex_match (lexer, T_LPAREN))"); dump (1, "{"); } else { dump (1, "if (!lex_match (lexer, T_LPAREN))"); dump (1, "{"); dump (0, "lex_error_expecting (lexer, \"`('\");"); dump (0, "goto lossage;"); dump (-1, "}"); outdent (); } } if (s->value == VAL_INT) { dump (1, "if (!lex_force_int (lexer))"); dump (0, "goto lossage;"); dump (-1, "p->%s%s = lex_integer (lexer);", sbc->prefix, st_lower (s->valname)); } else if (s->value == VAL_DBL) { dump (1, "if (!lex_force_num (lexer))"); dump (0, "goto lossage;"); dump (-1, "p->%s%s = lex_tokval (lexer);", sbc->prefix, st_lower (s->valname)); } else if (s->value == VAL_STRING) { dump (1, "if (!lex_force_string_or_id (lexer))"); dump (0, "goto lossage;"); dump (-1, "free (p->%s%s);", sbc->prefix, st_lower (s->valname)); dump (0, "p->%s%s = ss_xstrdup (ss_tokss (lexer));", sbc->prefix, st_lower (s->valname)); } else abort (); if (s->restriction) { { char *str, *str2; str = xmalloc (MAX_TOK_LEN); str2 = xmalloc (MAX_TOK_LEN); sprintf (str2, "p->%s%s", sbc->prefix, st_lower (s->valname)); sprintf (str, s->restriction, str2, str2, str2, str2, str2, str2, str2, str2); dump (1, "if (!(%s))", str); free (str); free (str2); } dump (1, "{"); dump (0, "lex_error (lexer, NULL);"); dump (0, "goto lossage;"); dump (-1, "}"); outdent (); } dump (0, "lex_get (lexer);"); if (s->valtype == VT_PAREN) { dump (1, "if (!lex_force_match (lexer, T_RPAREN))"); dump (0, "goto lossage;"); outdent (); if (s->optvalue) { dump (-1, "}"); outdent (); } } if (s != spec->omit_kw) dump (-1, "}"); } if (s == spec->omit_kw) { dump (-1, "}"); outdent (); } outdent (); } } /* Write out the code to parse subcommand SBC. */ static void dump_subcommand (const subcommand *sbc) { if (sbc->type == SBC_PLAIN || sbc->type == SBC_ARRAY) { int count; dump (1, "while (lex_token (lexer) != T_SLASH && lex_token (lexer) != T_ENDCMD)"); dump (1, "{"); { specifier *spec; for (count = 0, spec = sbc->spec; spec; spec = spec->next) { if (spec->s) dump_specifier_parse (spec, sbc); else { count++; dump (1, "%sif (%s)", spec != sbc->spec ? "else " : "", make_match (st_upper (spec->varname))); if (sbc->type == SBC_PLAIN) dump (0, "p->%s%s = 1;", st_lower (sbc->prefix), spec->varname); else dump (0, "p->a_%s[%s%s%s] = 1;", st_lower (sbc->name), st_upper (prefix), st_upper (sbc->prefix), st_upper (spec->varname)); outdent (); } } } { specifier *spec; setting *s; /* This code first finds the last specifier in sbc. Then it finds the last setting within that last specifier. Either or both might be NULL. */ spec = sbc->spec; s = NULL; if (spec) { while (spec->next) spec = spec->next; s = spec->s; if (s) while (s->next) s = s->next; } if (spec && (!spec->s || !spec->omit_kw)) { dump (1, "else"); dump (1, "{"); dump (0, "lex_error (lexer, NULL);"); dump (0, "goto lossage;"); dump (-1, "}"); outdent (); } } dump (0, "lex_match (lexer, T_COMMA);"); dump (-1, "}"); outdent (); } else if (sbc->type == SBC_VARLIST) { dump (1, "if (!parse_variables_const (lexer, dataset_dict (ds), &p->%sv_%s, &p->%sn_%s, " "PV_APPEND%s%s))", st_lower (sbc->prefix), st_lower (sbc->name), st_lower (sbc->prefix), st_lower (sbc->name), sbc->pv_options ? " |" : "", sbc->pv_options ? sbc->pv_options : ""); dump (0, "goto lossage;"); outdent (); } else if (sbc->type == SBC_VAR) { dump (0, "p->%sv_%s = parse_variable (lexer, dataset_dict (ds));", st_lower (sbc->prefix), st_lower (sbc->name)); dump (1, "if (!p->%sv_%s)", st_lower (sbc->prefix), st_lower (sbc->name)); dump (0, "goto lossage;"); outdent (); } else if (sbc->type == SBC_STRING) { dump (1, "if (!lex_force_string (lexer))"); dump (0, "return false;"); outdent (); dump (0, "free(p->s_%s);", st_lower(sbc->name)); dump (0, "p->s_%s = ss_xstrdup (lex_tokss (lexer));", st_lower (sbc->name)); dump (0, "lex_get (lexer);"); } else if (sbc->type == SBC_DBL) { dump (1, "if (!lex_force_num (lexer))"); dump (0, "goto lossage;"); dump (-1, "p->n_%s[p->sbc_%s - 1] = lex_number (lexer);", st_lower (sbc->name), st_lower (sbc->name)); dump (0, "lex_get(lexer);"); } else if (sbc->type == SBC_INT) { dump(1, "{"); dump(0, "int x;"); dump (1, "if (!lex_force_int (lexer))"); dump (0, "goto lossage;"); dump (-1, "x = lex_integer (lexer);"); dump (0, "lex_get(lexer);"); dump (0, "p->n_%s[p->sbc_%s - 1] = x;", st_lower (sbc->name), st_lower(sbc->name)); dump (-1,"}"); } else if (sbc->type == SBC_PINT) { dump (0, "lex_match (lexer, T_LPAREN);"); dump (1, "if (!lex_force_int (lexer))"); dump (0, "goto lossage;"); dump (-1, "p->n_%s = lex_integer (lexer);", st_lower (sbc->name)); dump (0, "lex_match (lexer, T_RPAREN);"); } else if (sbc->type == SBC_DBL_LIST || sbc->type == SBC_INT_LIST) { dump (0, "if (p->sbc_%s > MAXLISTS)",st_lower(sbc->name)); dump (1, "{"); dump (0, "subc_list_error (lexer, \"%s\", MAXLISTS);", st_lower(sbc->name)); dump (0, "goto lossage;"); dump (-1,"}"); dump (1, "while (lex_token (lexer) != T_SLASH && lex_token (lexer) != T_ENDCMD)"); dump (1, "{"); dump (0, "lex_match (lexer, T_COMMA);"); dump (0, "if (!lex_force_num (lexer))"); dump (1, "{"); dump (0, "goto lossage;"); dump (-1,"}"); dump (0, "subc_list_%s_push (&p->%cl_%s[p->sbc_%s-1], lex_number (lexer));", sbc->type == SBC_INT_LIST ? "int" : "double", sbc->type == SBC_INT_LIST ? 'i' : 'd', st_lower (sbc->name), st_lower (sbc->name)); dump (0, "lex_get (lexer);"); dump (-1,"}"); } else if (sbc->type == SBC_CUSTOM) { dump (1, "switch (%scustom_%s (lexer, ds, p, aux))", st_lower (prefix), st_lower (sbc->name)); dump (0, "{"); dump (1, "case 0:"); dump (0, "goto lossage;"); dump (-1, "case 1:"); indent (); dump (0, "break;"); dump (-1, "case 2:"); indent (); dump (0, "lex_error (lexer, NULL);"); dump (0, "goto lossage;"); dump (-1, "default:"); indent (); dump (0, "NOT_REACHED ();"); dump (-1, "}"); outdent (); } } /* Write out entire parser. */ static void dump_parser (int persistent) { int f; indent = 0; dump (0, "static int"); dump (0, "parse_%s (struct lexer *lexer, struct dataset *ds%s, struct cmd_%s *p, void *aux UNUSED)", make_identifier (cmdname), (def && (def->type == SBC_VARLIST || def->type == SBC_CUSTOM))?"":" UNUSED", make_identifier (cmdname)); dump (1, "{"); dump_vars_init (persistent); dump (1, "for (;;)"); dump (1, "{"); f = 0; if (def && (def->type == SBC_VARLIST)) { if (def->type == SBC_VARLIST) dump (1, "if (lex_token (lexer) == T_ID " "&& dict_lookup_var (dataset_dict (ds), lex_tokcstr (lexer)) != NULL " "&& lex_next_token (lexer, 1) != T_EQUALS)"); else { dump (0, "if ((lex_token (lexer) == T_ID " "&& dict_lookup_var (dataset_dict (ds), lex_tokcstr (lexer)) " "&& lex_next_token (lexer, 1) != T_EQUALS)"); dump (1, " || token == T_ALL)"); } dump (1, "{"); dump (0, "p->sbc_%s++;", st_lower (def->name)); dump (1, "if (!parse_variables_const (lexer, dataset_dict (ds), &p->%sv_%s, &p->%sn_%s, " "PV_APPEND))", st_lower (def->prefix), st_lower (def->name), st_lower (def->prefix), st_lower (def->name)); dump (0, "goto lossage;"); dump (-2, "}"); outdent (); f = 1; } else if (def && def->type == SBC_CUSTOM) { dump (1, "switch (%scustom_%s (lexer, ds, p, aux))", st_lower (prefix), st_lower (def->name)); dump (0, "{"); dump (1, "case 0:"); dump (0, "goto lossage;"); dump (-1, "case 1:"); indent (); dump (0, "p->sbc_%s++;", st_lower (def->name)); dump (0, "continue;"); dump (-1, "case 2:"); indent (); dump (0, "break;"); dump (-1, "default:"); indent (); dump (0, "NOT_REACHED ();"); dump (-1, "}"); outdent (); } { subcommand *sbc; for (sbc = subcommands; sbc; sbc = sbc->next) { dump (1, "%sif (%s)", f ? "else " : "", make_match (sbc->name)); f = 1; dump (1, "{"); dump (0, "lex_match (lexer, T_EQUALS);"); dump (0, "p->sbc_%s++;", st_lower (sbc->name)); if (sbc->arity != ARITY_MANY) { dump (1, "if (p->sbc_%s > 1)", st_lower (sbc->name)); dump (1, "{"); dump (0, "lex_sbc_only_once (\"%s\");", sbc->name); dump (0, "goto lossage;"); dump (-1, "}"); outdent (); } dump_subcommand (sbc); dump (-1, "}"); outdent (); } } /* Now deal with the /ALGORITHM subcommand implicit to all commands */ dump(1,"else if (settings_get_syntax () != COMPATIBLE && lex_match_id(lexer, \"ALGORITHM\"))"); dump(1,"{"); dump (0, "lex_match (lexer, T_EQUALS);"); dump(1,"if (lex_match_id(lexer, \"COMPATIBLE\"))"); dump(0,"settings_set_cmd_algorithm (COMPATIBLE);"); outdent(); dump(1,"else if (lex_match_id(lexer, \"ENHANCED\"))"); dump(0,"settings_set_cmd_algorithm (ENHANCED);"); dump (-1, "}"); outdent (); dump (1, "if (!lex_match (lexer, T_SLASH))"); dump (0, "break;"); dump (-2, "}"); outdent (); dump_blank_line (0); dump (1, "if (lex_token (lexer) != T_ENDCMD)"); dump (1, "{"); dump (0, "lex_error (lexer, _(\"expecting end of command\"));"); dump (0, "goto lossage;"); dump (-1, "}"); dump_blank_line (0); outdent (); { /* Check that mandatory subcommands have been specified */ subcommand *sbc; for (sbc = subcommands; sbc; sbc = sbc->next) { if (sbc->arity == ARITY_ONCE_EXACTLY) { dump (0, "if (0 == p->sbc_%s)", st_lower (sbc->name)); dump (1, "{"); dump (0, "lex_sbc_missing (\"%s\");", sbc->name); dump (0, "goto lossage;"); dump (-1, "}"); dump_blank_line (0); } } } dump (-1, "return true;"); dump_blank_line (0); dump (-1, "lossage:"); indent (); dump (0, "free_%s (p);", make_identifier (cmdname)); dump (0, "return false;"); dump (-1, "}"); dump_blank_line (0); } /* Write the output file header. */ static void dump_header (void) { indent = 0; dump (0, "/* %s\t\t-*- mode: c; buffer-read-only: t -*-", ofn); dump_blank_line (0); dump (0, " Generated by q2c from %s.", ifn); dump (0, " Do not modify!"); dump (0, " */"); } /* Write out commands to free variable state. */ static void dump_free (int persistent) { subcommand *sbc; int used; indent = 0; used = 0; if (! persistent) { for (sbc = subcommands; sbc; sbc = sbc->next) used = (sbc->type == SBC_STRING || sbc->type == SBC_DBL_LIST || sbc->type == SBC_INT_LIST); } dump (0, "static void"); dump (0, "free_%s (struct cmd_%s *p%s)", make_identifier (cmdname), make_identifier (cmdname), used ? "" : " UNUSED"); dump (1, "{"); if (! persistent) { for (sbc = subcommands; sbc; sbc = sbc->next) { switch (sbc->type) { case SBC_VARLIST: dump (0, "free (p->v_%s);", st_lower (sbc->name)); break; case SBC_STRING: dump (0, "free (p->s_%s);", st_lower (sbc->name)); break; case SBC_DBL_LIST: case SBC_INT_LIST: dump (0, "{"); dump (1, "int i;"); dump (2, "for(i = 0; i < MAXLISTS ; ++i)"); dump (1, "subc_list_%s_destroy(&p->%cl_%s[i]);", sbc->type == SBC_INT_LIST ? "int" : "double", sbc->type == SBC_INT_LIST ? 'i' : 'd', st_lower (sbc->name)); dump (0, "}"); outdent(); break; case SBC_PLAIN: { specifier *spec; setting *s; for (spec = sbc->spec; spec; spec = spec->next) for (s = spec->s; s; s = s->next) if (s->value == VAL_STRING) dump (0, "free (p->%s%s);", sbc->prefix, st_lower (s->valname)); } default: break; } } } 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 * recognize_directive (void) { static char directive[16]; char *sp, *ep; sp = skip_ws (buf); if (strncmp (sp, "/*", 2)) return NULL; sp = skip_ws (sp + 2); if (*sp != '(') return NULL; sp++; ep = strchr (sp, ')'); if (ep == NULL) return NULL; if (ep - sp > 15) ep = sp + 15; memcpy (directive, sp, ep - sp); directive[ep - sp] = '\0'; return directive; } int main (int argc, char *argv[]) { program_name = argv[0]; if (argc != 3) fail ("Syntax: q2c input.q output.c"); ifn = argv[1]; in = fopen (ifn, "r"); if (!in) fail ("%s: open: %s.", ifn, strerror (errno)); ofn = argv[2]; out = fopen (ofn, "w"); if (!out) fail ("%s: open: %s.", ofn, strerror (errno)); is_open = true; buf = xmalloc (MAX_LINE_LEN); tokstr = xmalloc (MAX_TOK_LEN); dump_header (); indent = 0; dump (0, "#line %d \"%s\"", ln + 1, ifn); while (get_line ()) { const char *directive = recognize_directive (); if (directive == NULL) { dump (0, "%s", buf); continue; } dump (0, "#line %d \"%s\"", oln + 1, ofn); if (!strcmp (directive, "specification")) { /* Skip leading slash-star line. */ get_line (); lex_get (); parse (); /* Skip trailing star-slash line. */ get_line (); } else if (!strcmp (directive, "headers")) { indent = 0; dump (0, "#include "); dump_blank_line (0); dump (0, "#include \"data/settings.h\""); dump (0, "#include \"data/variable.h\""); dump (0, "#include \"language/lexer/lexer.h\""); dump (0, "#include \"language/lexer/subcommand-list.h\""); dump (0, "#include \"language/lexer/variable-parser.h\""); dump (0, "#include \"libpspp/assertion.h\""); dump (0, "#include \"libpspp/cast.h\""); dump (0, "#include \"libpspp/message.h\""); dump (0, "#include \"libpspp/str.h\""); dump_blank_line (0); dump (0, "#include \"gl/xalloc.h\""); dump_blank_line (0); } else if (!strcmp (directive, "declarations")) dump_declarations (); else if (!strcmp (directive, "functions")) { dump_parser (0); dump_free (0); } else if (!strcmp (directive, "_functions")) { dump_parser (1); dump_free (1); } else error ("unknown directive `%s'", directive); indent = 0; dump (0, "#line %d \"%s\"", ln + 1, ifn); } return EXIT_SUCCESS; } pspp-1.4.1/src/language/lexer/include-path.h0000644000175000017500000000203713320146056020334 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2010 Free Software Foundation, Inc. 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 3 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, see . */ #ifndef INCLUDE_PATH_H #define INCLUDE_PATH_H 1 struct string_array; void include_path_clear (void); void include_path_add (const char *dir); char *include_path_search (const char *base_name); const struct string_array *include_path_default (void); char **include_path (void); #endif /* include-path.h */ pspp-1.4.1/src/language/lexer/segment.h0000644000175000017500000001127613360714656017441 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2010, 2011, 2013 Free Software Foundation, Inc. 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 3 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, see . */ #ifndef SEGMENT_H #define SEGMENT_H 1 #include #include #include "libpspp/prompt.h" /* PSPP syntax segmentation. PSPP divides traditional "lexical analysis" or "tokenization" into two phases: a lower-level phase called "segmentation" and a higher-level phase called "scanning". This header file provides declarations for the segmentation phase. scan.h contains declarations for the scanning phase. Segmentation accepts a stream of UTF-8 bytes as input. It outputs a label (a segment type) for each byte or contiguous sequence of bytes in the input. It also, in a few corner cases, outputs zero-width segments that label the boundary between a pair of bytes in the input. Some segment types correspond directly to tokens; for example, an "identifier" segment (SEG_IDENTIFIER) becomes an identifier token (T_ID) later in lexical analysis. Other segments contribute to tokens but do not correspond diectly; for example, multiple quoted string segments (SEG_QUOTED_STRING) separated by spaces (SEG_SPACES) and "+" punctuators (SEG_PUNCT) may be combined to form a single string token (T_STRING). Still other segments are ignored (e.g. SEG_SPACES) or trigger special behavior such as error messages later in tokenization (e.g. SEG_EXPECTED_QUOTE). */ /* Segmentation mode. This corresponds to the syntax mode for which a syntax file is intended. This is the only configuration setting for a segmenter. */ enum segmenter_mode { /* Try to interpret input correctly regardless of whether it is written for interactive or batch mode. */ SEG_MODE_AUTO, /* Interactive or batch syntax mode. */ SEG_MODE_INTERACTIVE, SEG_MODE_BATCH }; #define SEG_TYPES \ SEG_TYPE(NUMBER) \ SEG_TYPE(QUOTED_STRING) \ SEG_TYPE(HEX_STRING) \ SEG_TYPE(UNICODE_STRING) \ SEG_TYPE(UNQUOTED_STRING) \ SEG_TYPE(RESERVED_WORD) \ SEG_TYPE(IDENTIFIER) \ SEG_TYPE(PUNCT) \ \ SEG_TYPE(SHBANG) \ SEG_TYPE(SPACES) \ SEG_TYPE(COMMENT) \ SEG_TYPE(NEWLINE) \ \ SEG_TYPE(COMMENT_COMMAND) \ SEG_TYPE(DO_REPEAT_COMMAND) \ SEG_TYPE(INLINE_DATA) \ \ SEG_TYPE(START_DOCUMENT) \ SEG_TYPE(DOCUMENT) \ \ SEG_TYPE(START_COMMAND) \ SEG_TYPE(SEPARATE_COMMANDS) \ SEG_TYPE(END_COMMAND) \ SEG_TYPE(END) \ \ SEG_TYPE(EXPECTED_QUOTE) \ SEG_TYPE(EXPECTED_EXPONENT) \ SEG_TYPE(UNEXPECTED_DOT) \ SEG_TYPE(UNEXPECTED_CHAR) /* Types of segments. */ enum segment_type { #define SEG_TYPE(NAME) SEG_##NAME, SEG_TYPES #undef SEG_TYPE }; /* Number of segment types. */ #define SEG_TYPE(NAME) + 1 enum { SEG_N_TYPES = SEG_TYPES }; #undef SEG_TYPE const char *segment_type_to_string (enum segment_type); /* A segmenter. Opaque. */ struct segmenter { unsigned char state; unsigned char substate; unsigned char mode; }; void segmenter_init (struct segmenter *, enum segmenter_mode); enum segmenter_mode segmenter_get_mode (const struct segmenter *); int segmenter_push (struct segmenter *, const char *input, size_t n, bool eof, enum segment_type *); enum prompt_style segmenter_get_prompt (const struct segmenter *); #endif /* segment.h */ pspp-1.4.1/src/language/lexer/segment.c0000644000175000017500000012012613401051054017405 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2010, 2011, 2013, 2016 Free Software Foundation, Inc. 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 3 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, see . */ #include #include "language/lexer/segment.h" #include #include #include "data/identifier.h" #include "language/lexer/command-name.h" #include "libpspp/assertion.h" #include "libpspp/cast.h" #include "gl/c-ctype.h" #include "gl/c-strcase.h" enum segmenter_state { S_SHBANG, S_GENERAL, S_COMMENT_1, S_COMMENT_2, S_DOCUMENT_1, S_DOCUMENT_2, S_DOCUMENT_3, S_FILE_LABEL, S_DO_REPEAT_1, S_DO_REPEAT_2, S_DO_REPEAT_3, S_BEGIN_DATA_1, S_BEGIN_DATA_2, S_BEGIN_DATA_3, S_BEGIN_DATA_4, S_TITLE_1, S_TITLE_2 }; #define SS_START_OF_LINE (1u << 0) #define SS_START_OF_COMMAND (1u << 1) static int segmenter_detect_command_name__ (const char *input, size_t n, bool eof, int ofs); static int segmenter_u8_to_uc__ (ucs4_t *puc, const char *input_, size_t n, bool eof, size_t ofs) { const uint8_t *input = CHAR_CAST (const uint8_t *, input_); int mblen; assert (n > ofs); input += ofs; n -= ofs; mblen = u8_mbtoucr (puc, input, n); if (mblen >= 0) return mblen; else if (mblen != -2) return u8_mbtouc (puc, input, n); else if (eof) { *puc = 0xfffd; return n; } else return -1; } static int segmenter_parse_shbang__ (struct segmenter *s, const char *input, size_t n, bool eof, enum segment_type *type) { if (input[0] == '#') { if (n >= 2) { if (input[1] == '!') { for (int ofs = 2; ; ofs++) { if (ofs >= n) { if (!eof) return -1; } else if (input[ofs] == '\n') { if (input[ofs - 1] == '\r') ofs--; } else continue; s->state = S_GENERAL; s->substate = SS_START_OF_COMMAND; *type = SEG_SHBANG; return ofs; } } } else if (!eof) return -1; } s->state = S_GENERAL; s->substate = SS_START_OF_LINE | SS_START_OF_COMMAND; return segmenter_push (s, input, n, eof, type); } static int segmenter_parse_digraph__ (const char *seconds, struct segmenter *s, const char *input, size_t n, bool eof, enum segment_type *type) { assert (s->state == S_GENERAL); *type = SEG_PUNCT; s->substate = 0; return (n < 2 ? (eof ? 1 : -1) : (strchr (seconds, input[1]) != NULL ? 2 : 1)); } static int skip_comment (const char *input, size_t n, bool eof, size_t ofs) { for (; ofs < n; ofs++) { if (input[ofs] == '\n') return ofs; else if (input[ofs] == '*') { if (ofs + 1 >= n) return eof ? ofs + 1 : -1; else if (input[ofs + 1] == '/') return ofs + 2; } } return eof ? ofs : -1; } static int skip_spaces_and_comments (const char *input, size_t n, bool eof, int ofs) { while (ofs < n) { ucs4_t uc; int mblen; mblen = segmenter_u8_to_uc__ (&uc, input, n, eof, ofs); if (mblen < 0) return -1; if (uc == '/') { if (ofs + 1 >= n) return eof ? ofs : -1; else if (input[ofs + 1] != '*') return ofs; ofs = skip_comment (input, n, eof, ofs + 2); if (ofs < 0) return -1; } else if (lex_uc_is_space (uc) && uc != '\n') ofs += mblen; else return ofs; } return eof ? ofs : -1; } static int is_end_of_line (const char *input, size_t n, bool eof, int ofs) { if (ofs >= n) return eof ? 1 : -1; else if (input[ofs] == '\n') return 1; else if (input[ofs] == '\r') { if (ofs + 1 >= n) return eof ? 1 : -1; return input[ofs + 1] == '\n'; } else return 0; } static int at_end_of_line (const char *input, size_t n, bool eof, int ofs) { ofs = skip_spaces_and_comments (input, n, eof, ofs); if (ofs < 0) return -1; return is_end_of_line (input, n, eof, ofs); } static int segmenter_parse_newline__ (const char *input, size_t n, bool eof, enum segment_type *type) { int ofs; if (input[0] == '\n') ofs = 1; else { if (n < 2) { assert (!eof); return -1; } assert (input[0] == '\r'); assert (input[1] == '\n'); ofs = 2; } *type = SEG_NEWLINE; return ofs; } static int skip_spaces (const char *input, size_t n, bool eof, size_t ofs) { while (ofs < n) { ucs4_t uc; int mblen; mblen = segmenter_u8_to_uc__ (&uc, input, n, eof, ofs); if (mblen < 0) return -1; if (!lex_uc_is_space (uc) || uc == '\n') return ofs; ofs += mblen; } return eof ? ofs : -1; } static int skip_digits (const char *input, size_t n, bool eof, int ofs) { for (; ofs < n; ofs++) if (!c_isdigit (input[ofs])) return ofs; return eof ? ofs : -1; } static int segmenter_parse_number__ (struct segmenter *s, const char *input, size_t n, bool eof, enum segment_type *type) { int ofs; assert (s->state == S_GENERAL); ofs = skip_digits (input, n, eof, 0); if (ofs < 0) return -1; if (ofs >= n) { if (!eof) return -1; goto number; }; if (input[ofs] == '.') { ofs = skip_digits (input, n, eof, ofs + 1); if (ofs < 0) return -1; } if (ofs >= n) { if (!eof) return -1; goto number; } if (input[ofs] == 'e' || input[ofs] == 'E') { ofs++; if (ofs >= n) { if (!eof) return -1; goto expected_exponent; } if (input[ofs] == '+' || input[ofs] == '-') { ofs++; if (ofs >= n) { if (!eof) return -1; goto expected_exponent; } } if (!c_isdigit (input[ofs])) goto expected_exponent; ofs = skip_digits (input, n, eof, ofs); if (ofs < 0) return -1; } if (input[ofs - 1] == '.') { int eol = at_end_of_line (input, n, eof, ofs); if (eol < 0) return -1; else if (eol) ofs--; } number: *type = SEG_NUMBER; s->substate = 0; return ofs; expected_exponent: *type = SEG_EXPECTED_EXPONENT; s->substate = 0; return ofs; } static bool is_reserved_word (const char *s, int n) { char s0, s1, s2, s3; s0 = c_toupper (s[0]); switch (n) { case 2: s1 = c_toupper (s[1]); return ((s0 == 'B' && s1 == 'Y') || (s0 == 'E' && s1 == 'Q') || (s0 == 'G' && (s1 == 'E' || s1 == 'T')) || (s0 == 'L' && (s1 == 'E' || s1 == 'T')) || (s0 == 'N' && s1 == 'E') || (s0 == 'O' && s1 == 'R') || (s0 == 'T' && s1 == 'O')); case 3: s1 = c_toupper (s[1]); s2 = c_toupper (s[2]); return ((s0 == 'A' && ((s1 == 'L' && s2 == 'L') || (s1 == 'N' && s2 == 'D'))) || (s0 == 'N' && s1 == 'O' && s2 == 'T')); case 4: s1 = c_toupper (s[1]); s2 = c_toupper (s[2]); s3 = c_toupper (s[3]); return s0 == 'W' && s1 == 'I' && s2 == 'T' && s3 == 'H'; default: return false; } } static int segmenter_parse_comment_1__ (struct segmenter *s, const char *input, size_t n, bool eof, enum segment_type *type) { int endcmd; int ofs; endcmd = -2; ofs = 0; while (ofs < n) { ucs4_t uc; int mblen; mblen = segmenter_u8_to_uc__ (&uc, input, n, eof, ofs); if (mblen < 0) return -1; switch (uc) { case '.': endcmd = ofs; break; case '\n': if (ofs > 1 && input[ofs - 1] == '\r') ofs--; if (endcmd == -2) { /* Blank line ends comment command. */ s->state = S_GENERAL; s->substate = SS_START_OF_COMMAND; *type = SEG_SEPARATE_COMMANDS; return ofs; } else if (endcmd >= 0) { /* '.' at end of line ends comment command. */ s->state = S_GENERAL; s->substate = 0; *type = SEG_COMMENT_COMMAND; return endcmd; } else { /* Comment continues onto next line. */ *type = SEG_COMMENT_COMMAND; s->state = S_COMMENT_2; return ofs; } NOT_REACHED (); default: if (!lex_uc_is_space (uc)) endcmd = -1; break; } ofs += mblen; } if (eof) { /* End of file. */ s->state = S_GENERAL; s->substate = SS_START_OF_COMMAND; *type = SEG_SEPARATE_COMMANDS; return ofs; } return -1; } static int segmenter_parse_comment_2__ (struct segmenter *s, const char *input, size_t n, bool eof, enum segment_type *type) { int ofs = segmenter_parse_newline__ (input, n, eof, type); if (ofs < 0) return -1; int new_cmd; if (ofs >= n) { if (!eof) return -1; new_cmd = false; } else { ucs4_t uc; int mblen = segmenter_u8_to_uc__ (&uc, input, n, eof, ofs); if (mblen < 0) return -1; if (uc == '+' || uc == '-' || uc == '.') new_cmd = true; else if (!lex_uc_is_space (uc)) switch (s->mode) { case SEG_MODE_INTERACTIVE: new_cmd = false; break; case SEG_MODE_BATCH: new_cmd = true; break; case SEG_MODE_AUTO: new_cmd = segmenter_detect_command_name__ (input, n, eof, ofs); if (new_cmd < 0) return -1; break; default: NOT_REACHED (); } else new_cmd = false; } if (new_cmd) { s->state = S_GENERAL; s->substate = SS_START_OF_LINE | SS_START_OF_COMMAND; } else s->state = S_COMMENT_1; return ofs; } static int segmenter_parse_document_1__ (struct segmenter *s, const char *input, size_t n, bool eof, enum segment_type *type) { bool end_cmd; int ofs; end_cmd = false; ofs = 0; while (ofs < n) { ucs4_t uc; int mblen; mblen = segmenter_u8_to_uc__ (&uc, input, n, eof, ofs); if (mblen < 0) return -1; switch (uc) { case '.': end_cmd = true; break; case '\n': if (ofs > 1 && input[ofs - 1] == '\r') ofs--; *type = SEG_DOCUMENT; s->state = end_cmd ? S_DOCUMENT_3 : S_DOCUMENT_2; return ofs; default: if (!lex_uc_is_space (uc)) end_cmd = false; break; } ofs += mblen; } if (eof) { *type = SEG_DOCUMENT; s->state = S_DOCUMENT_3; return ofs; } return -1; } static int segmenter_parse_document_2__ (struct segmenter *s, const char *input, size_t n, bool eof, enum segment_type *type) { int ofs; ofs = segmenter_parse_newline__ (input, n, eof, type); if (ofs < 0) return -1; s->state = S_DOCUMENT_1; return ofs; } static int segmenter_parse_document_3__ (struct segmenter *s, enum segment_type *type) { *type = SEG_END_COMMAND; s->state = S_GENERAL; s->substate = SS_START_OF_COMMAND | SS_START_OF_LINE; return 0; } static int segmenter_unquoted (const char *input, size_t n, bool eof, int ofs) { ofs = skip_spaces_and_comments (input, n, eof, ofs); if (ofs < 0) return -1; else if (ofs < n) { char c = input[ofs]; return c != '\'' && c != '"' && c != '\n'; } else { assert (eof); return 0; } } static int next_id_in_command (const struct segmenter *s, const char *input, size_t n, bool eof, int ofs, char id[], size_t id_size) { struct segmenter sub; assert (id_size > 0); sub.mode = s->mode; sub.state = S_GENERAL; sub.substate = 0; for (;;) { enum segment_type type; int retval; retval = segmenter_push (&sub, input + ofs, n - ofs, eof, &type); if (retval < 0) { id[0] = '\0'; return -1; } switch (type) { case SEG_SHBANG: case SEG_SPACES: case SEG_COMMENT: case SEG_NEWLINE: break; case SEG_IDENTIFIER: if (retval < id_size) { memcpy (id, input + ofs, retval); id[retval] = '\0'; return ofs + retval; } /* fall through */ case SEG_NUMBER: case SEG_QUOTED_STRING: case SEG_HEX_STRING: case SEG_UNICODE_STRING: case SEG_UNQUOTED_STRING: case SEG_RESERVED_WORD: case SEG_PUNCT: case SEG_COMMENT_COMMAND: case SEG_DO_REPEAT_COMMAND: case SEG_INLINE_DATA: case SEG_START_DOCUMENT: case SEG_DOCUMENT: case SEG_START_COMMAND: case SEG_SEPARATE_COMMANDS: case SEG_END_COMMAND: case SEG_END: case SEG_EXPECTED_QUOTE: case SEG_EXPECTED_EXPONENT: case SEG_UNEXPECTED_DOT: case SEG_UNEXPECTED_CHAR: id[0] = '\0'; return ofs + retval; } ofs += retval; } } /* Called when INPUT begins with a character that can start off an ID token. */ static int segmenter_parse_id__ (struct segmenter *s, const char *input, size_t n, bool eof, enum segment_type *type) { ucs4_t uc; int ofs; assert (n > 0); assert (s->state == S_GENERAL); ofs = u8_mbtouc (&uc, CHAR_CAST (const uint8_t *, input), n); for (;;) { int mblen; if (ofs >= n) { if (eof) break; return -1; } mblen = segmenter_u8_to_uc__ (&uc, input, n, eof, ofs); if (mblen < 0) return -1; else if (!lex_uc_is_idn (uc)) break; ofs += mblen; } if (input[ofs - 1] == '.') { int eol = at_end_of_line (input, n, eof, ofs); if (eol < 0) return -1; else if (eol) ofs--; } if (is_reserved_word (input, ofs)) *type = SEG_RESERVED_WORD; else *type = SEG_IDENTIFIER; if (s->substate & SS_START_OF_COMMAND) { struct substring word = ss_buffer (input, ofs); if (lex_id_match_n (ss_cstr ("COMMENT"), word, 4)) { s->state = S_COMMENT_1; return segmenter_parse_comment_1__ (s, input, n, eof, type); } else if (lex_id_match (ss_cstr ("DOCUMENT"), word)) { s->state = S_DOCUMENT_1; *type = SEG_START_DOCUMENT; return 0; } else if (lex_id_match (ss_cstr ("TITLE"), word) || lex_id_match (ss_cstr ("SUBTITLE"), word)) { int result = segmenter_unquoted (input, n, eof, ofs); if (result < 0) return -1; else if (result) { s->state = S_TITLE_1; return ofs; } } else if (lex_id_match (ss_cstr ("FILE"), word)) { char id[16]; if (next_id_in_command (s, input, n, eof, ofs, id, sizeof id) < 0) return -1; else if (lex_id_match (ss_cstr ("LABEL"), ss_cstr (id))) { s->state = S_FILE_LABEL; s->substate = 0; return ofs; } } else if (lex_id_match (ss_cstr ("DO"), word)) { char id[16]; if (next_id_in_command (s, input, n, eof, ofs, id, sizeof id) < 0) return -1; else if (lex_id_match (ss_cstr ("REPEAT"), ss_cstr (id))) { s->state = S_DO_REPEAT_1; s->substate = 0; return ofs; } } else if (lex_id_match (ss_cstr ("BEGIN"), word)) { char id[16]; int ofs2; ofs2 = next_id_in_command (s, input, n, eof, ofs, id, sizeof id); if (ofs2 < 0) return -1; else if (lex_id_match (ss_cstr ("DATA"), ss_cstr (id))) { int eol; ofs2 = skip_spaces_and_comments (input, n, eof, ofs2); if (ofs2 < 0) return -1; if (ofs2 >= n) assert (eof); else if (input[ofs2] == '.') { ofs2 = skip_spaces_and_comments (input, n, eof, ofs2 + 1); if (ofs2 < 0) return -1; } eol = is_end_of_line (input, n, eof, ofs2); if (eol < 0) return -1; else if (eol) { if (memchr (input, '\n', ofs2)) s->state = S_BEGIN_DATA_1; else s->state = S_BEGIN_DATA_2; s->substate = 0; return ofs; } } } } s->substate = 0; return ofs; } static int segmenter_parse_string__ (enum segment_type string_type, int ofs, struct segmenter *s, const char *input, size_t n, bool eof, enum segment_type *type) { int quote = input[ofs]; ofs++; while (ofs < n) if (input[ofs] == quote) { ofs++; if (ofs < n) { if (input[ofs] == quote) { ofs++; continue; } } else if (!eof) return -1; *type = string_type; s->substate = 0; return ofs; } else if (input[ofs] == '\n') goto expected_quote; else ofs++; if (eof) goto expected_quote; return -1; expected_quote: *type = SEG_EXPECTED_QUOTE; s->substate = 0; return ofs; } static int segmenter_maybe_parse_string__ (enum segment_type string_type, struct segmenter *s, const char *input, size_t n, bool eof, enum segment_type *type) { if (n < 2) { if (!eof) return -1; } else if (input[1] == '\'' || input[1] == '"') return segmenter_parse_string__ (string_type, 1, s, input, n, eof, type); return segmenter_parse_id__ (s, input, n, eof, type); } static int segmenter_parse_mid_command__ (struct segmenter *s, const char *input, size_t n, bool eof, enum segment_type *type) { ucs4_t uc; int mblen; int ofs; assert (s->state == S_GENERAL); assert (!(s->substate & SS_START_OF_LINE)); mblen = segmenter_u8_to_uc__ (&uc, input, n, eof, 0); if (mblen < 0) return -1; switch (uc) { case '\n': s->substate |= SS_START_OF_LINE; *type = SEG_NEWLINE; return 1; case '/': if (n < 2) { if (!eof) return -1; } else if (input[1] == '*') { ofs = skip_comment (input, n, eof, 2); if (ofs < 0) return -1; *type = SEG_COMMENT; return ofs; } s->substate = 0; *type = SEG_PUNCT; return 1; case '(': case ')': case ',': case '=': case '-': case '[': case ']': case '&': case '|': case '+': *type = SEG_PUNCT; s->substate = 0; return 1; case '*': if (s->substate & SS_START_OF_COMMAND) { /* '*' at the beginning of a command begins a comment. */ s->state = S_COMMENT_1; return segmenter_parse_comment_1__ (s, input, n, eof, type); } else return segmenter_parse_digraph__ ("*", s, input, n, eof, type); case '<': return segmenter_parse_digraph__ ("=>", s, input, n, eof, type); case '>': return segmenter_parse_digraph__ ("=", s, input, n, eof, type); case '~': return segmenter_parse_digraph__ ("=", s, input, n, eof, type); case '.': if (n < 2) { if (!eof) return -1; } else if (c_isdigit (input[1])) return segmenter_parse_number__ (s, input, n, eof, type); int eol = at_end_of_line (input, n, eof, 1); if (eol < 0) return -1; if (eol) { *type = SEG_END_COMMAND; s->substate = SS_START_OF_COMMAND; } else *type = SEG_UNEXPECTED_DOT; return 1; case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': return segmenter_parse_number__ (s, input, n, eof, type); case 'u': case 'U': return segmenter_maybe_parse_string__ (SEG_UNICODE_STRING, s, input, n, eof, type); case 'x': case 'X': return segmenter_maybe_parse_string__ (SEG_HEX_STRING, s, input, n, eof, type); case '\'': case '"': return segmenter_parse_string__ (SEG_QUOTED_STRING, 0, s, input, n, eof, type); default: if (lex_uc_is_space (uc)) { ofs = skip_spaces (input, n, eof, mblen); if (ofs < 0) return -1; if (input[ofs - 1] == '\r' && input[ofs] == '\n') { if (ofs == 1) { s->substate |= SS_START_OF_LINE; *type = SEG_NEWLINE; return 2; } else ofs--; } *type = SEG_SPACES; return ofs; } else if (lex_uc_is_id1 (uc)) return segmenter_parse_id__ (s, input, n, eof, type); else { *type = SEG_UNEXPECTED_CHAR; s->substate = 0; return mblen; } } } static int compare_commands (const void *a_, const void *b_) { const char *const *ap = a_; const char *const *bp = b_; const char *a = *ap; const char *b = *bp; return c_strcasecmp (a, b); } static const char ** segmenter_get_command_name_candidates (unsigned char first) { #define DEF_CMD(STATES, FLAGS, NAME, FUNCTION) NAME, #define UNIMPL_CMD(NAME, DESCRIPTION) NAME, static const char *commands[] = { #include "language/command.def" "" }; static size_t n_commands = (sizeof commands / sizeof *commands) - 1; #undef DEF_CMD #undef UNIMPL_CMD static bool inited; static const char **cindex[UCHAR_MAX + 1]; if (!inited) { size_t i; inited = true; qsort (commands, n_commands, sizeof *commands, compare_commands); for (i = 0; i < n_commands; i++) { unsigned char c = c_toupper (commands[i][0]); if (cindex[c] == NULL) cindex[c] = &commands[i]; } for (i = 0; i <= UCHAR_MAX; i++) if (cindex[i] == NULL) cindex[i] = &commands[n_commands]; } return cindex[c_toupper (first)]; } static int segmenter_detect_command_name__ (const char *input, size_t n, bool eof, int ofs) { const char **commands; input += ofs; n -= ofs; ofs = 0; for (;;) { ucs4_t uc; int mblen; if (ofs >= n) { if (eof) break; return -1; } mblen = segmenter_u8_to_uc__ (&uc, input, n, eof, ofs); if (mblen < 0) return -1; if (uc == '\n' || !(lex_uc_is_space (uc) || lex_uc_is_idn (uc) || uc == '-')) break; ofs += mblen; } if (!ofs) return 0; if (input[ofs - 1] == '.') ofs--; for (commands = segmenter_get_command_name_candidates (input[0]); c_toupper (input[0]) == c_toupper ((*commands)[0]); commands++) { int missing_words; bool exact; if (command_match (ss_cstr (*commands), ss_buffer (input, ofs), &exact, &missing_words) && missing_words <= 0) return 1; } return 0; } static int is_start_of_string__ (const char *input, size_t n, bool eof, int ofs) { if (ofs >= n) return eof ? 0 : -1; int c = input[ofs]; if (c == 'x' || c == 'X' || c == 'u' || c == 'U') { if (ofs + 1 >= n) return eof ? 0 : -1; return input[ofs + 1] == '\'' || input[ofs + 1] == '"'; } else return c == '\'' || c == '"' || c == '\n'; } static int segmenter_parse_start_of_line__ (struct segmenter *s, const char *input, size_t n, bool eof, enum segment_type *type) { ucs4_t uc; int mblen; int ofs; assert (s->state == S_GENERAL); assert (s->substate & SS_START_OF_LINE); mblen = segmenter_u8_to_uc__ (&uc, input, n, eof, 0); if (mblen < 0) return -1; switch (uc) { case '+': ofs = skip_spaces_and_comments (input, n, eof, 1); if (ofs < 0) return -1; else { int is_string = is_start_of_string__ (input, n, eof, ofs); if (is_string < 0) return -1; else if (is_string) { /* This is punctuation that may separate pieces of a string. */ *type = SEG_PUNCT; s->substate = 0; return 1; } } /* Fall through. */ case '-': case '.': *type = SEG_START_COMMAND; s->substate = SS_START_OF_COMMAND; return 1; default: if (lex_uc_is_space (uc)) { int eol = at_end_of_line (input, n, eof, 0); if (eol < 0) return -1; else if (eol) { s->substate = SS_START_OF_COMMAND; *type = SEG_SEPARATE_COMMANDS; return 0; } break; } if (s->mode == SEG_MODE_INTERACTIVE || s->substate & SS_START_OF_COMMAND) break; else if (s->mode == SEG_MODE_AUTO) { int cmd = segmenter_detect_command_name__ (input, n, eof, 0); if (cmd < 0) return -1; else if (cmd == 0) break; } else assert (s->mode == SEG_MODE_BATCH); s->substate = SS_START_OF_COMMAND; *type = SEG_START_COMMAND; return 0; } s->substate = SS_START_OF_COMMAND; return segmenter_parse_mid_command__ (s, input, n, eof, type); } static int segmenter_parse_file_label__ (struct segmenter *s, const char *input, size_t n, bool eof, enum segment_type *type) { struct segmenter sub; int ofs; sub = *s; sub.state = S_GENERAL; ofs = segmenter_push (&sub, input, n, eof, type); if (ofs < 0) return -1; else if (*type == SEG_IDENTIFIER) { int result; assert (lex_id_match (ss_cstr ("LABEL"), ss_buffer ((char *) input, ofs))); result = segmenter_unquoted (input, n, eof, ofs); if (result < 0) return -1; else { if (result) s->state = S_TITLE_1; else *s = sub; return ofs; } } else { s->substate = sub.substate; return ofs; } } static int segmenter_subparse (struct segmenter *s, const char *input, size_t n, bool eof, enum segment_type *type) { struct segmenter sub; int ofs; sub.mode = s->mode; sub.state = S_GENERAL; sub.substate = s->substate; ofs = segmenter_push (&sub, input, n, eof, type); s->substate = sub.substate; return ofs; } static int segmenter_parse_do_repeat_1__ (struct segmenter *s, const char *input, size_t n, bool eof, enum segment_type *type) { int ofs = segmenter_subparse (s, input, n, eof, type); if (ofs < 0) return -1; if (*type == SEG_START_COMMAND || *type == SEG_SEPARATE_COMMANDS) s->state = S_DO_REPEAT_2; else if (*type == SEG_END_COMMAND) { s->state = S_DO_REPEAT_3; s->substate = 1; } return ofs; } static int segmenter_parse_do_repeat_2__ (struct segmenter *s, const char *input, size_t n, bool eof, enum segment_type *type) { int ofs = segmenter_subparse (s, input, n, eof, type); if (ofs < 0) return -1; if (*type == SEG_NEWLINE) { s->state = S_DO_REPEAT_3; s->substate = 1; } return ofs; } static bool check_repeat_command (struct segmenter *s, const char *input, size_t n, bool eof) { int direction; char id[16]; int ofs; ofs = 0; if (input[ofs] == '+' || input[ofs] == '-') ofs++; ofs = next_id_in_command (s, input, n, eof, ofs, id, sizeof id); if (ofs < 0) return false; else if (lex_id_match (ss_cstr ("DO"), ss_cstr (id))) direction = 1; else if (lex_id_match (ss_cstr ("END"), ss_cstr (id))) direction = -1; else return true; ofs = next_id_in_command (s, input, n, eof, ofs, id, sizeof id); if (ofs < 0) return false; if (lex_id_match (ss_cstr ("REPEAT"), ss_cstr (id))) s->substate += direction; return true; } static int segmenter_parse_full_line__ (const char *input, size_t n, bool eof, enum segment_type *type) { const char *newline = memchr (input, '\n', n); if (!newline) return eof ? n : -1; ptrdiff_t ofs = newline - input; if (ofs == 0 || (ofs == 1 && input[0] == '\r')) { *type = SEG_NEWLINE; return ofs + 1; } else return ofs - (input[ofs - 1] == '\r'); } static int segmenter_parse_do_repeat_3__ (struct segmenter *s, const char *input, size_t n, bool eof, enum segment_type *type) { int ofs; ofs = segmenter_parse_full_line__ (input, n, eof, type); if (ofs < 0 || (ofs > 0 && input[ofs - 1] == '\n')) return ofs; else if (!check_repeat_command (s, input, n, eof) && !eof) return -1; else if (s->substate == 0) { s->state = S_GENERAL; s->substate = SS_START_OF_COMMAND | SS_START_OF_LINE; return segmenter_push (s, input, n, eof, type); } else { *type = SEG_DO_REPEAT_COMMAND; return ofs; } } static int segmenter_parse_begin_data_1__ (struct segmenter *s, const char *input, size_t n, bool eof, enum segment_type *type) { int ofs = segmenter_subparse (s, input, n, eof, type); if (ofs < 0) return -1; if (*type == SEG_NEWLINE) s->state = S_BEGIN_DATA_2; return ofs; } static int segmenter_parse_begin_data_2__ (struct segmenter *s, const char *input, size_t n, bool eof, enum segment_type *type) { int ofs = segmenter_subparse (s, input, n, eof, type); if (ofs < 0) return -1; if (*type == SEG_NEWLINE) s->state = S_BEGIN_DATA_3; return ofs; } static bool is_end_data (const char *input, size_t n) { const uint8_t *u_input = CHAR_CAST (const uint8_t *, input); bool endcmd; ucs4_t uc; int mblen; int ofs; if (n < 4 || c_strncasecmp (input, "END", 3)) return false; ofs = 3; mblen = u8_mbtouc (&uc, u_input + ofs, n - ofs); if (!lex_uc_is_space (uc)) return false; ofs += mblen; if (n - ofs < 4 || c_strncasecmp (input + ofs, "DATA", 4)) return false; ofs += 4; endcmd = false; while (ofs < n) { mblen = u8_mbtouc (&uc, u_input + ofs, n - ofs); if (uc == '.') { if (endcmd) return false; endcmd = true; } else if (!lex_uc_is_space (uc)) return false; ofs += mblen; } return true; } static int segmenter_parse_begin_data_3__ (struct segmenter *s, const char *input, size_t n, bool eof, enum segment_type *type) { int ofs; ofs = segmenter_parse_full_line__ (input, n, eof, type); if (ofs < 0) return -1; else if (is_end_data (input, ofs)) { s->state = S_GENERAL; s->substate = SS_START_OF_COMMAND | SS_START_OF_LINE; return segmenter_push (s, input, n, eof, type); } else { *type = SEG_INLINE_DATA; s->state = S_BEGIN_DATA_4; return input[ofs - 1] == '\n' ? 0 : ofs; } } static int segmenter_parse_begin_data_4__ (struct segmenter *s, const char *input, size_t n, bool eof, enum segment_type *type) { int ofs; ofs = segmenter_parse_newline__ (input, n, eof, type); if (ofs < 0) return -1; s->state = S_BEGIN_DATA_3; return ofs; } static int segmenter_parse_title_1__ (struct segmenter *s, const char *input, size_t n, bool eof, enum segment_type *type) { int ofs; ofs = skip_spaces (input, n, eof, 0); if (ofs < 0) return -1; s->state = S_TITLE_2; *type = SEG_SPACES; return ofs; } static int segmenter_parse_title_2__ (struct segmenter *s, const char *input, size_t n, bool eof, enum segment_type *type) { int endcmd; int ofs; endcmd = -1; ofs = 0; while (ofs < n) { ucs4_t uc; int mblen; mblen = segmenter_u8_to_uc__ (&uc, input, n, eof, ofs); if (mblen < 0) return -1; switch (uc) { case '\n': goto end_of_line; case '.': endcmd = ofs; break; default: if (!lex_uc_is_space (uc)) endcmd = -1; break; } ofs += mblen; } if (eof) { end_of_line: s->state = S_GENERAL; s->substate = 0; *type = SEG_UNQUOTED_STRING; return endcmd >= 0 ? endcmd : ofs; } return -1; } /* Returns the name of segment TYPE as a string. The caller must not modify or free the returned string. This is useful only for debugging and testing. */ const char * segment_type_to_string (enum segment_type type) { switch (type) { #define SEG_TYPE(NAME) case SEG_##NAME: return #NAME; SEG_TYPES #undef SEG_TYPE default: return "unknown segment type"; } } /* Initializes S as a segmenter with the given syntax MODE. A segmenter does not contain any external references, so nothing needs to be done to destroy one. For the same reason, segmenters may be copied with plain struct assignment (or memcpy). */ void segmenter_init (struct segmenter *s, enum segmenter_mode mode) { s->state = S_SHBANG; s->substate = 0; s->mode = mode; } /* Returns the mode passed to segmenter_init() for S. */ enum segmenter_mode segmenter_get_mode (const struct segmenter *s) { return s->mode; } /* Attempts to label a prefix of S's remaining input with a segment type. The caller supplies the first N bytes of the remaining input as INPUT, which must be a UTF-8 encoded string. If EOF is true, then the N bytes supplied are the entire (remainder) of the input; if EOF is false, then further input is potentially available. The input may contain '\n' or '\r\n' line ends in any combination. If successful, returns the number of bytes in the segment at the beginning of INPUT (between 0 and N, inclusive) and stores the type of that segment into *TYPE. The next call to segmenter_push() should not include those bytes as part of INPUT, because they have (figuratively) been consumed by the segmenter. Failure occurs only if the segment type of the N bytes in INPUT cannot yet be determined. In this case segmenter_push() returns -1. If more input is available, the caller should obtain some more, then call again with a larger N. If this is not enough, the process might need to repeat again and agin. If input is exhausted, then the caller may call again setting EOF to true. segmenter_push() will never return -1 when EOF is true. The caller must not, in a sequence of calls, supply contradictory input. That is, bytes provided as part of INPUT in one call, but not consumed, must not be provided with *different* values on subsequent calls. This is because segmenter_push() must often make decisions based on looking ahead beyond the bytes that it consumes. */ int segmenter_push (struct segmenter *s, const char *input, size_t n, bool eof, enum segment_type *type) { if (!n) { if (eof) { *type = SEG_END; return 0; } else return -1; } switch (s->state) { case S_SHBANG: return segmenter_parse_shbang__ (s, input, n, eof, type); case S_GENERAL: return (s->substate & SS_START_OF_LINE ? segmenter_parse_start_of_line__ (s, input, n, eof, type) : segmenter_parse_mid_command__ (s, input, n, eof, type)); case S_COMMENT_1: return segmenter_parse_comment_1__ (s, input, n, eof, type); case S_COMMENT_2: return segmenter_parse_comment_2__ (s, input, n, eof, type); case S_DOCUMENT_1: return segmenter_parse_document_1__ (s, input, n, eof, type); case S_DOCUMENT_2: return segmenter_parse_document_2__ (s, input, n, eof, type); case S_DOCUMENT_3: return segmenter_parse_document_3__ (s, type); case S_FILE_LABEL: return segmenter_parse_file_label__ (s, input, n, eof, type); case S_DO_REPEAT_1: return segmenter_parse_do_repeat_1__ (s, input, n, eof, type); case S_DO_REPEAT_2: return segmenter_parse_do_repeat_2__ (s, input, n, eof, type); case S_DO_REPEAT_3: return segmenter_parse_do_repeat_3__ (s, input, n, eof, type); case S_BEGIN_DATA_1: return segmenter_parse_begin_data_1__ (s, input, n, eof, type); case S_BEGIN_DATA_2: return segmenter_parse_begin_data_2__ (s, input, n, eof, type); case S_BEGIN_DATA_3: return segmenter_parse_begin_data_3__ (s, input, n, eof, type); case S_BEGIN_DATA_4: return segmenter_parse_begin_data_4__ (s, input, n, eof, type); case S_TITLE_1: return segmenter_parse_title_1__ (s, input, n, eof, type); case S_TITLE_2: return segmenter_parse_title_2__ (s, input, n, eof, type); } NOT_REACHED (); } /* Returns the style of command prompt to display to an interactive user for input in S. The return value is most accurate in mode SEG_MODE_INTERACTIVE and at the beginning of a line (that is, if segmenter_push() consumed as much as possible of the input up to a new-line). */ enum prompt_style segmenter_get_prompt (const struct segmenter *s) { switch (s->state) { case S_SHBANG: return PROMPT_FIRST; case S_GENERAL: return s->substate & SS_START_OF_COMMAND ? PROMPT_FIRST : PROMPT_LATER; case S_COMMENT_1: case S_COMMENT_2: return PROMPT_COMMENT; case S_DOCUMENT_1: case S_DOCUMENT_2: return PROMPT_DOCUMENT; case S_DOCUMENT_3: return PROMPT_FIRST; case S_FILE_LABEL: return PROMPT_LATER; case S_DO_REPEAT_1: case S_DO_REPEAT_2: return s->substate & SS_START_OF_COMMAND ? PROMPT_FIRST : PROMPT_LATER; case S_DO_REPEAT_3: return PROMPT_DO_REPEAT; case S_BEGIN_DATA_1: return PROMPT_FIRST; case S_BEGIN_DATA_2: return PROMPT_LATER; case S_BEGIN_DATA_3: case S_BEGIN_DATA_4: return PROMPT_DATA; case S_TITLE_1: case S_TITLE_2: return PROMPT_FIRST; } NOT_REACHED (); } pspp-1.4.1/src/language/lexer/format-parser.c0000644000175000017500000001106213320146056020532 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 1997-9, 2000, 2006, 2010, 2011, 2012 Free Software Foundation, Inc. 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 3 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, see . */ #include #include #include #include #include "data/format.h" #include "data/variable.h" #include "language/lexer/format-parser.h" #include "language/lexer/lexer.h" #include "libpspp/message.h" #include "libpspp/misc.h" #include "libpspp/str.h" #include "gettext.h" #define _(msgid) gettext (msgid) static bool parse_abstract_format_specifier__ (struct lexer *lexer, char type[FMT_TYPE_LEN_MAX + 1], int *width, int *decimals) { struct substring s; struct substring type_ss, width_ss, decimals_ss; bool has_decimals; if (lex_token (lexer) != T_ID && lex_token (lexer) != T_STRING) goto error; /* Extract pieces. */ s = ss_cstr (lex_tokcstr (lexer)); ss_get_bytes (&s, ss_span (s, ss_cstr (CC_LETTERS)), &type_ss); ss_get_bytes (&s, ss_span (s, ss_cstr (CC_DIGITS)), &width_ss); if (ss_match_byte (&s, '.')) { has_decimals = true; ss_get_bytes (&s, ss_span (s, ss_cstr (CC_DIGITS)), &decimals_ss); } else has_decimals = false; /* Check pieces. */ if (ss_is_empty (type_ss) || ss_length (type_ss) > FMT_TYPE_LEN_MAX) goto error; if (has_decimals && ss_is_empty (decimals_ss)) goto error; if (!ss_is_empty (s)) goto error; /* Return pieces. These uses of strtol are valid only because we know that their substrings are followed by non-digit characters. */ str_copy_buf_trunc (type, FMT_TYPE_LEN_MAX + 1, ss_data (type_ss), ss_length (type_ss)); *width = strtol (ss_data (width_ss), NULL, 10); *decimals = has_decimals ? strtol (ss_data (decimals_ss), NULL, 10) : 0; return true; error: lex_error (lexer, _("expecting valid format specifier")); return false; } /* Parses a token taking the form of a format specifier and returns true only if successful. Emits an error message on failure. Stores a null-terminated string representing the format type in TYPE, and the width and number of decimal places in *WIDTH and *DECIMALS. TYPE is not checked as to whether it is really the name of a format. Both width and decimals are considered optional. If missing, *WIDTH or *DECIMALS or both will be set to 0. */ bool parse_abstract_format_specifier (struct lexer *lexer, char type[FMT_TYPE_LEN_MAX + 1], int *width, int *decimals) { bool ok = parse_abstract_format_specifier__ (lexer, type, width, decimals); if (ok) lex_get (lexer); return ok; } /* Parses a format specifier from the token stream and returns true only if successful. Emits an error message on failure. The caller should call check_input_specifier() or check_output_specifier() on the parsed format as necessary. */ bool parse_format_specifier (struct lexer *lexer, struct fmt_spec *format) { char type[FMT_TYPE_LEN_MAX + 1]; if (!parse_abstract_format_specifier__ (lexer, type, &format->w, &format->d)) return false; if (!fmt_from_name (type, &format->type)) { msg (SE, _("Unknown format type `%s'."), type); return false; } if (format->w == 0 && !strchr (lex_tokcstr (lexer), '0')) { msg (SE, _("Format specifier `%s' lacks required width."), lex_tokcstr (lexer)); return false; } lex_get (lexer); return true; } /* Parses a token containing just the name of a format type and returns true if successful. */ bool parse_format_specifier_name (struct lexer *lexer, enum fmt_type *type) { if (lex_token (lexer) != T_ID) { lex_error (lexer, _("expecting format type")); return false; } if (!fmt_from_name (lex_tokcstr (lexer), type)) { msg (SE, _("Unknown format type `%s'."), lex_tokcstr (lexer)); return false; } lex_get (lexer); return true; } pspp-1.4.1/src/language/lexer/format-parser.h0000644000175000017500000000230513320146056020537 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 1997-9, 2000 Free Software Foundation, Inc. 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 3 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, see . */ #ifndef LANGUAGE_LEXER_FORMAT_PARSER_H #define LANGUAGE_LEXER_FORMAT_PARSER_H 1 #include struct lexer; bool parse_abstract_format_specifier (struct lexer *, char *type, int *width, int *decimals); enum fmt_type ; struct fmt_spec; bool parse_format_specifier (struct lexer *, struct fmt_spec *); bool parse_format_specifier_name (struct lexer *, enum fmt_type *type); #endif /* language/lexer/format-parser.h. */ pspp-1.4.1/src/language/lexer/subcommand-list.h0000644000175000017500000000365213320146056021064 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2004, 2011 Free Software Foundation, Inc. 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 3 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, see . */ #ifndef SUBCLIST_H #define SUBCLIST_H #include /* This module provides a rudimentary list class It is intended for use by the command line parser for list subcommands */ struct lexer; struct subc_list_double { double *data ; size_t sz; int n_data; }; struct subc_list_int { int *data ; size_t sz; int n_data; }; typedef struct subc_list_double subc_list_double ; typedef struct subc_list_int subc_list_int ; /* Create a list */ void subc_list_double_create(subc_list_double *l) ; void subc_list_int_create(subc_list_int *l) ; /* Push a value onto the list */ void subc_list_double_push(subc_list_double *l, double d) ; void subc_list_int_push(subc_list_int *l, int i) ; /* Index into the list */ double subc_list_double_at(const subc_list_double *l, int idx); int subc_list_int_at(const subc_list_int *l, int idx); /* Return the number of values in the list */ int subc_list_double_count(const subc_list_double *l); int subc_list_int_count(const subc_list_int *l); /* Destroy the list */ void subc_list_double_destroy(subc_list_double *l) ; void subc_list_int_destroy(subc_list_int *l) ; void subc_list_error (struct lexer *, const char *sbc, int max_list); #endif pspp-1.4.1/src/language/lexer/variable-parser.c0000644000175000017500000006601713673465023021052 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 1997-9, 2000, 2009, 2010, 2011, 2012, 2020 Free Software Foundation, Inc. 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 3 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, see . */ #include #include "language/lexer/variable-parser.h" #include #include #include #include #include "data/dataset.h" #include "data/dictionary.h" #include "data/variable.h" #include "language/lexer/lexer.h" #include "libpspp/assertion.h" #include "libpspp/cast.h" #include "libpspp/hash-functions.h" #include "libpspp/i18n.h" #include "libpspp/hmapx.h" #include "libpspp/message.h" #include "libpspp/misc.h" #include "libpspp/pool.h" #include "libpspp/str.h" #include "libpspp/stringi-set.h" #include "math/interaction.h" #include "gl/c-ctype.h" #include "gl/xalloc.h" #include "gettext.h" #define _(msgid) gettext (msgid) static struct variable *var_set_get_var (const struct var_set *, size_t); static struct variable *var_set_lookup_var (const struct var_set *, const char *); static bool var_set_lookup_var_idx (const struct var_set *, const char *, size_t *); static bool var_set_get_names_must_be_ids (const struct var_set *); static bool is_name_token (const struct lexer *lexer, bool names_must_be_ids) { return (lex_token (lexer) == T_ID || (!names_must_be_ids && lex_token (lexer) == T_STRING)); } static bool is_vs_name_token (const struct lexer *lexer, const struct var_set *vs) { return is_name_token (lexer, var_set_get_names_must_be_ids (vs)); } static bool is_dict_name_token (const struct lexer *lexer, const struct dictionary *d) { return is_name_token (lexer, dict_get_names_must_be_ids (d)); } /* Parses a name as a variable within VS. Sets *IDX to the variable's index and returns true if successful. On failure emits an error message and returns false. */ static bool parse_vs_variable_idx (struct lexer *lexer, const struct var_set *vs, size_t *idx) { assert (idx != NULL); if (!is_vs_name_token (lexer, vs)) { lex_error (lexer, _("expecting variable name")); return false; } else if (var_set_lookup_var_idx (vs, lex_tokcstr (lexer), idx)) { lex_get (lexer); return true; } else { msg (SE, _("%s is not a variable name."), lex_tokcstr (lexer)); return false; } } /* Parses a name as a variable within VS and returns the variable if successful. On failure emits an error message and returns a null pointer. */ static struct variable * parse_vs_variable (struct lexer *lexer, const struct var_set *vs) { size_t idx; return parse_vs_variable_idx (lexer, vs, &idx) ? var_set_get_var (vs, idx) : NULL; } /* Parses a variable name in dictionary D and returns the variable if successful. On failure emits an error message and returns a null pointer. */ struct variable * parse_variable (struct lexer *lexer, const struct dictionary *d) { struct var_set *vs = var_set_create_from_dict (d); struct variable *var = parse_vs_variable (lexer, vs); var_set_destroy (vs); return var; } /* Parses a set of variables from dictionary D given options OPTS. Resulting list of variables stored in *VAR and the number of variables into *CNT. Returns true only if successful. The dictionary D must contain at least one variable. */ bool parse_variables (struct lexer *lexer, const struct dictionary *d, struct variable ***var, size_t *cnt, int opts) { struct var_set *vs; int success; assert (d != NULL); assert (var != NULL); assert (cnt != NULL); vs = var_set_create_from_dict (d); if (var_set_get_cnt (vs) == 0) { *cnt = 0; var_set_destroy (vs); return false; } success = parse_var_set_vars (lexer, vs, var, cnt, opts); var_set_destroy (vs); return success; } /* Parses a set of variables from dictionary D given options OPTS. Resulting list of variables stored in *VARS and the number of variables into *VAR_CNT. Returns true only if successful. Same behavior as parse_variables, except that all allocations are taken from the given POOL. */ bool parse_variables_pool (struct lexer *lexer, struct pool *pool, const struct dictionary *dict, struct variable ***vars, size_t *var_cnt, int opts) { int retval; /* PV_APPEND is unsafe because parse_variables would free the existing names on failure, but those names are presumably already in the pool, which would attempt to re-free it later. */ assert (!(opts & PV_APPEND)); retval = parse_variables (lexer, dict, vars, var_cnt, opts); if (retval) pool_register (pool, free, *vars); return retval; } /* Parses a variable name from VS. If successful, sets *IDX to the variable's index in VS, *CLASS to the variable's dictionary class, and returns true. Returns false on failure. */ static bool parse_var_idx_class (struct lexer *lexer, const struct var_set *vs, size_t *idx, enum dict_class *class) { if (!parse_vs_variable_idx (lexer, vs, idx)) return false; *class = dict_class_from_id (var_get_name (var_set_get_var (vs, *idx))); return true; } /* Add the variable from VS with index IDX to the list of variables V that has *NV elements and room for *MV. Uses and updates INCLUDED to avoid duplicates if indicated by PV_OPTS, which also affects what variables are allowed in appropriate ways. */ static void add_variable (struct variable ***v, size_t *nv, size_t *mv, char *included, int pv_opts, const struct var_set *vs, size_t idx) { struct variable *add = var_set_get_var (vs, idx); const char *add_name = var_get_name (add); if ((pv_opts & PV_NUMERIC) && !var_is_numeric (add)) msg (SW, _("%s is not a numeric variable. It will not be " "included in the variable list."), add_name); else if ((pv_opts & PV_STRING) && !var_is_alpha (add)) msg (SE, _("%s is not a string variable. It will not be " "included in the variable list."), add_name); else if ((pv_opts & PV_NO_SCRATCH) && dict_class_from_id (add_name) == DC_SCRATCH) msg (SE, _("Scratch variables (such as %s) are not allowed " "here."), add_name); else if ((pv_opts & (PV_SAME_TYPE | PV_SAME_WIDTH)) && *nv && var_get_type (add) != var_get_type ((*v)[0])) msg (SE, _("%s and %s are not the same type. All variables in " "this variable list must be of the same type. %s " "will be omitted from the list."), var_get_name ((*v)[0]), add_name, add_name); else if ((pv_opts & PV_SAME_WIDTH) && *nv && var_get_width (add) != var_get_width ((*v)[0])) msg (SE, _("%s and %s are string variables with different widths. " "All variables in this variable list must have the " "same width. %s will be omitted from the list."), var_get_name ((*v)[0]), add_name, add_name); else if ((pv_opts & PV_NO_DUPLICATE) && included && included[idx]) msg (SE, _("Variable %s appears twice in variable list."), add_name); else if ((pv_opts & PV_DUPLICATE) || !included || !included[idx]) { if (*nv >= *mv) { *mv = 2 * (*nv + 1); *v = xnrealloc (*v, *mv, sizeof **v); } (*v)[(*nv)++] = add; if (included != NULL) included[idx] = 1; } } /* Adds the variables in VS with indexes FIRST_IDX through LAST_IDX, inclusive, to the list of variables V that has *NV elements and room for *MV. Uses and updates INCLUDED to avoid duplicates if indicated by PV_OPTS, which also affects what variables are allowed in appropriate ways. */ static void add_variables (struct variable ***v, size_t *nv, size_t *mv, char *included, int pv_opts, const struct var_set *vs, int first_idx, int last_idx, enum dict_class class) { size_t i; for (i = first_idx; i <= last_idx; i++) if (dict_class_from_id (var_get_name (var_set_get_var (vs, i))) == class) add_variable (v, nv, mv, included, pv_opts, vs, i); } /* Note that if parse_variables() returns false, *v is free()'d. Conversely, if parse_variables() returns true, then *nv is nonzero and *v is non-NULL. */ bool parse_var_set_vars (struct lexer *lexer, const struct var_set *vs, struct variable ***v, size_t *nv, int pv_opts) { size_t mv; char *included; assert (vs != NULL); assert (v != NULL); assert (nv != NULL); /* At most one of PV_NUMERIC, PV_STRING, PV_SAME_TYPE, PV_SAME_WIDTH may be specified. */ assert (((pv_opts & PV_NUMERIC) != 0) + ((pv_opts & PV_STRING) != 0) + ((pv_opts & PV_SAME_TYPE) != 0) + ((pv_opts & PV_SAME_WIDTH) != 0) <= 1); /* PV_DUPLICATE and PV_NO_DUPLICATE are incompatible. */ assert (!(pv_opts & PV_DUPLICATE) || !(pv_opts & PV_NO_DUPLICATE)); if (!(pv_opts & PV_APPEND)) { *v = NULL; *nv = 0; mv = 0; } else mv = *nv; if (!(pv_opts & PV_DUPLICATE)) { size_t i; included = xcalloc (var_set_get_cnt (vs), sizeof *included); for (i = 0; i < *nv; i++) { size_t index; if (!var_set_lookup_var_idx (vs, var_get_name ((*v)[i]), &index)) NOT_REACHED (); included[index] = 1; } } else included = NULL; do { if (lex_match (lexer, T_ALL)) add_variables (v, nv, &mv, included, pv_opts, vs, 0, var_set_get_cnt (vs) - 1, DC_ORDINARY); else { enum dict_class class; size_t first_idx; if (!parse_var_idx_class (lexer, vs, &first_idx, &class)) goto fail; if (!lex_match (lexer, T_TO)) add_variable (v, nv, &mv, included, pv_opts, vs, first_idx); else { size_t last_idx; enum dict_class last_class; struct variable *first_var, *last_var; if (!parse_var_idx_class (lexer, vs, &last_idx, &last_class)) goto fail; first_var = var_set_get_var (vs, first_idx); last_var = var_set_get_var (vs, last_idx); if (last_idx < first_idx) { const char *first_name = var_get_name (first_var); const char *last_name = var_get_name (last_var); msg (SE, _("%s TO %s is not valid syntax since %s " "precedes %s in the dictionary."), first_name, last_name, first_name, last_name); goto fail; } if (class != last_class) { msg (SE, _("When using the TO keyword to specify several " "variables, both variables must be from " "the same variable dictionaries, of either " "ordinary, scratch, or system variables. " "%s is a %s variable, whereas %s is %s."), var_get_name (first_var), dict_class_to_name (class), var_get_name (last_var), dict_class_to_name (last_class)); goto fail; } add_variables (v, nv, &mv, included, pv_opts, vs, first_idx, last_idx, class); } } if (pv_opts & PV_SINGLE) break; lex_match (lexer, T_COMMA); } while (lex_token (lexer) == T_ALL || (is_vs_name_token (lexer, vs) && var_set_lookup_var (vs, lex_tokcstr (lexer)) != NULL)); if (*nv == 0) goto fail; free (included); return 1; fail: free (included); free (*v); *v = NULL; *nv = 0; return 0; } char * parse_DATA_LIST_var (struct lexer *lexer, const struct dictionary *d) { if (!is_dict_name_token (lexer, d)) { lex_error (lexer, "expecting variable name"); return NULL; } if (!dict_id_is_valid (d, lex_tokcstr (lexer), true)) return NULL; char *name = xstrdup (lex_tokcstr (lexer)); lex_get (lexer); return name; } /* Attempts to break UTF-8 encoded NAME into a root (whose contents are arbitrary except that it does not end in a digit) followed by an integer numeric suffix. On success, stores the value of the suffix into *NUMBERP, the number of digits in the suffix into *N_DIGITSP, and returns the number of bytes in the root. On failure, returns 0. */ static int extract_numeric_suffix (const char *name, unsigned long int *numberp, int *n_digitsp) { size_t root_len, n_digits; size_t i; /* Count length of root. */ root_len = 1; /* Valid identifier never starts with digit. */ for (i = 1; name[i] != '\0'; i++) if (!c_isdigit (name[i])) root_len = i + 1; n_digits = i - root_len; if (n_digits == 0) { msg (SE, _("`%s' cannot be used with TO because it does not end in " "a digit."), name); return 0; } *numberp = strtoull (name + root_len, NULL, 10); if (*numberp == ULONG_MAX) { msg (SE, _("Numeric suffix on `%s' is larger than supported with TO."), name); return 0; } *n_digitsp = n_digits; return root_len; } static bool add_var_name (char *name, char ***names, size_t *n_vars, size_t *allocated_vars, struct stringi_set *set, int pv_opts) { if (pv_opts & PV_NO_DUPLICATE && !stringi_set_insert (set, name)) { msg (SE, _("Variable %s appears twice in variable list."), name); return false; } if (*n_vars >= *allocated_vars) *names = x2nrealloc (*names, allocated_vars, sizeof **names); (*names)[(*n_vars)++] = name; return true; } /* Parses a list of variable names according to the DATA LIST version of the TO convention. */ bool parse_DATA_LIST_vars (struct lexer *lexer, const struct dictionary *dict, char ***namesp, size_t *n_varsp, int pv_opts) { char **names; size_t n_vars; size_t allocated_vars; struct stringi_set set; char *name1 = NULL; char *name2 = NULL; bool ok = false; assert ((pv_opts & ~(PV_APPEND | PV_SINGLE | PV_NO_SCRATCH | PV_NO_DUPLICATE)) == 0); stringi_set_init (&set); if (pv_opts & PV_APPEND) { n_vars = allocated_vars = *n_varsp; names = *namesp; if (pv_opts & PV_NO_DUPLICATE) { size_t i; for (i = 0; i < n_vars; i++) stringi_set_insert (&set, names[i]); } } else { n_vars = allocated_vars = 0; names = NULL; } do { name1 = parse_DATA_LIST_var (lexer, dict); if (!name1) goto exit; if (dict_class_from_id (name1) == DC_SCRATCH && pv_opts & PV_NO_SCRATCH) { msg (SE, _("Scratch variables not allowed here.")); goto exit; } if (lex_match (lexer, T_TO)) { unsigned long int num1, num2; int n_digits1, n_digits2; int root_len1, root_len2; unsigned long int number; name2 = parse_DATA_LIST_var (lexer, dict); if (!name2) goto exit; root_len1 = extract_numeric_suffix (name1, &num1, &n_digits1); if (root_len1 == 0) goto exit; root_len2 = extract_numeric_suffix (name2, &num2, &n_digits2); if (root_len2 == 0) goto exit; if (root_len1 != root_len2 || memcasecmp (name1, name2, root_len1)) { msg (SE, _("Prefixes don't match in use of TO convention.")); goto exit; } if (num1 > num2) { msg (SE, _("Bad bounds in use of TO convention.")); goto exit; } for (number = num1; number <= num2; number++) { char *name = xasprintf ("%.*s%0*lu", root_len1, name1, n_digits1, number); if (!add_var_name (name, &names, &n_vars, &allocated_vars, &set, pv_opts)) { free (name); goto exit; } } free (name1); name1 = NULL; free (name2); name2 = NULL; } else { if (!add_var_name (name1, &names, &n_vars, &allocated_vars, &set, pv_opts)) goto exit; name1 = NULL; } lex_match (lexer, T_COMMA); if (pv_opts & PV_SINGLE) break; } while (lex_token (lexer) == T_ID); ok = true; exit: stringi_set_destroy (&set); if (ok) { *namesp = names; *n_varsp = n_vars; } else { int i; for (i = 0; i < n_vars; i++) free (names[i]); free (names); *namesp = NULL; *n_varsp = 0; free (name1); free (name2); } return ok; } /* Registers each of the NAMES[0...NNAMES - 1] in POOL, as well as NAMES itself. */ static void register_vars_pool (struct pool *pool, char **names, size_t nnames) { size_t i; for (i = 0; i < nnames; i++) pool_register (pool, free, names[i]); pool_register (pool, free, names); } /* Parses a list of variable names according to the DATA LIST version of the TO convention. Same args as parse_DATA_LIST_vars(), except that all allocations are taken from the given POOL. */ bool parse_DATA_LIST_vars_pool (struct lexer *lexer, const struct dictionary *dict, struct pool *pool, char ***names, size_t *nnames, int pv_opts) { int retval; /* PV_APPEND is unsafe because parse_DATA_LIST_vars would free the existing names on failure, but those names are presumably already in the pool, which would attempt to re-free it later. */ assert (!(pv_opts & PV_APPEND)); retval = parse_DATA_LIST_vars (lexer, dict, names, nnames, pv_opts); if (retval) register_vars_pool (pool, *names, *nnames); return retval; } /* Parses a list of variables where some of the variables may be existing and the rest are to be created. Same args as parse_DATA_LIST_vars(). */ bool parse_mixed_vars (struct lexer *lexer, const struct dictionary *dict, char ***names, size_t *nnames, int pv_opts) { size_t i; assert (names != NULL); assert (nnames != NULL); if (!(pv_opts & PV_APPEND)) { *names = NULL; *nnames = 0; } while (is_dict_name_token (lexer, dict) || lex_token (lexer) == T_ALL) { if (lex_token (lexer) == T_ALL || dict_lookup_var (dict, lex_tokcstr (lexer)) != NULL) { struct variable **v; size_t nv; if (!parse_variables (lexer, dict, &v, &nv, pv_opts)) goto fail; *names = xnrealloc (*names, *nnames + nv, sizeof **names); for (i = 0; i < nv; i++) (*names)[*nnames + i] = xstrdup (var_get_name (v[i])); free (v); *nnames += nv; } else if (!parse_DATA_LIST_vars (lexer, dict, names, nnames, PV_APPEND | pv_opts)) goto fail; } if (*nnames == 0) goto fail; return true; fail: for (i = 0; i < *nnames; i++) free ((*names)[i]); free (*names); *names = NULL; *nnames = 0; return false; } /* Parses a list of variables where some of the variables may be existing and the rest are to be created. Same args as parse_mixed_vars(), except that all allocations are taken from the given POOL. */ bool parse_mixed_vars_pool (struct lexer *lexer, const struct dictionary *dict, struct pool *pool, char ***names, size_t *nnames, int pv_opts) { int retval; /* PV_APPEND is unsafe because parse_mixed_vars_pool would free the existing names on failure, but those names are presumably already in the pool, which would attempt to re-free it later. */ assert (!(pv_opts & PV_APPEND)); retval = parse_mixed_vars (lexer, dict, names, nnames, pv_opts); if (retval) register_vars_pool (pool, *names, *nnames); return retval; } /* A set of variables. */ struct var_set { bool names_must_be_ids; size_t (*get_cnt) (const struct var_set *); struct variable *(*get_var) (const struct var_set *, size_t idx); bool (*lookup_var_idx) (const struct var_set *, const char *, size_t *); void (*destroy) (struct var_set *); void *aux; }; /* Returns the number of variables in VS. */ size_t var_set_get_cnt (const struct var_set *vs) { assert (vs != NULL); return vs->get_cnt (vs); } /* Return variable with index IDX in VS. IDX must be less than the number of variables in VS. */ static struct variable * var_set_get_var (const struct var_set *vs, size_t idx) { assert (vs != NULL); assert (idx < var_set_get_cnt (vs)); return vs->get_var (vs, idx); } /* Returns the variable in VS named NAME, or a null pointer if VS contains no variable with that name. */ struct variable * var_set_lookup_var (const struct var_set *vs, const char *name) { size_t idx; return (var_set_lookup_var_idx (vs, name, &idx) ? var_set_get_var (vs, idx) : NULL); } /* If VS contains a variable named NAME, sets *IDX to its index and returns true. Otherwise, returns false. */ bool var_set_lookup_var_idx (const struct var_set *vs, const char *name, size_t *idx) { assert (vs != NULL); assert (name != NULL); return vs->lookup_var_idx (vs, name, idx); } /* Destroys VS. */ void var_set_destroy (struct var_set *vs) { if (vs != NULL) vs->destroy (vs); } static bool var_set_get_names_must_be_ids (const struct var_set *vs) { return vs->names_must_be_ids; } /* Returns the number of variables in VS. */ static size_t dict_var_set_get_cnt (const struct var_set *vs) { struct dictionary *d = vs->aux; return dict_get_var_cnt (d); } /* Return variable with index IDX in VS. IDX must be less than the number of variables in VS. */ static struct variable * dict_var_set_get_var (const struct var_set *vs, size_t idx) { struct dictionary *d = vs->aux; return dict_get_var (d, idx); } /* If VS contains a variable named NAME, sets *IDX to its index and returns true. Otherwise, returns false. */ static bool dict_var_set_lookup_var_idx (const struct var_set *vs, const char *name, size_t *idx) { struct dictionary *d = vs->aux; struct variable *v = dict_lookup_var (d, name); if (v != NULL) { *idx = var_get_dict_index (v); return true; } else return false; } /* Destroys VS. */ static void dict_var_set_destroy (struct var_set *vs) { free (vs); } /* Returns a variable set based on D. */ struct var_set * var_set_create_from_dict (const struct dictionary *d) { struct var_set *vs = xmalloc (sizeof *vs); vs->names_must_be_ids = dict_get_names_must_be_ids (d); vs->get_cnt = dict_var_set_get_cnt; vs->get_var = dict_var_set_get_var; vs->lookup_var_idx = dict_var_set_lookup_var_idx; vs->destroy = dict_var_set_destroy; vs->aux = (void *) d; return vs; } /* A variable set based on an array. */ struct array_var_set { struct variable *const *var;/* Array of variables. */ size_t var_cnt; /* Number of elements in var. */ struct hmapx vars_by_name; /* Variables hashed by name. */ }; /* Returns the number of variables in VS. */ static size_t array_var_set_get_cnt (const struct var_set *vs) { struct array_var_set *avs = vs->aux; return avs->var_cnt; } /* Return variable with index IDX in VS. IDX must be less than the number of variables in VS. */ static struct variable * array_var_set_get_var (const struct var_set *vs, size_t idx) { struct array_var_set *avs = vs->aux; return CONST_CAST (struct variable *, avs->var[idx]); } /* If VS contains a variable named NAME, sets *IDX to its index and returns true. Otherwise, returns false. */ static bool array_var_set_lookup_var_idx (const struct var_set *vs, const char *name, size_t *idx) { struct array_var_set *avs = vs->aux; struct hmapx_node *node; struct variable **varp; HMAPX_FOR_EACH_WITH_HASH (varp, node, utf8_hash_case_string (name, 0), &avs->vars_by_name) if (!utf8_strcasecmp (name, var_get_name (*varp))) { *idx = varp - avs->var; return true; } return false; } /* Destroys VS. */ static void array_var_set_destroy (struct var_set *vs) { struct array_var_set *avs = vs->aux; hmapx_destroy (&avs->vars_by_name); free (avs); free (vs); } /* Returns a variable set based on the VAR_CNT variables in VAR. */ struct var_set * var_set_create_from_array (struct variable *const *var, size_t var_cnt) { struct var_set *vs; struct array_var_set *avs; size_t i; vs = xmalloc (sizeof *vs); vs->names_must_be_ids = true; vs->get_cnt = array_var_set_get_cnt; vs->get_var = array_var_set_get_var; vs->lookup_var_idx = array_var_set_lookup_var_idx; vs->destroy = array_var_set_destroy; vs->aux = avs = xmalloc (sizeof *avs); avs->var = var; avs->var_cnt = var_cnt; hmapx_init (&avs->vars_by_name); for (i = 0; i < var_cnt; i++) { const char *name = var_get_name (var[i]); size_t idx; if (array_var_set_lookup_var_idx (vs, name, &idx)) { var_set_destroy (vs); return NULL; } hmapx_insert (&avs->vars_by_name, CONST_CAST (void *, &avs->var[i]), utf8_hash_case_string (name, 0)); } return vs; } /* Match a variable. If the match succeeds, the variable will be placed in VAR. Returns true if successful */ bool lex_match_variable (struct lexer *lexer, const struct dictionary *dict, const struct variable **var) { if (lex_token (lexer) != T_ID) return false; *var = parse_variable_const (lexer, dict); if (*var == NULL) return false; return true; } /* An interaction is a variable followed by {*, BY} followed by an interaction */ static bool parse_internal_interaction (struct lexer *lexer, const struct dictionary *dict, struct interaction **iact, struct interaction **it) { const struct variable *v = NULL; assert (iact); switch (lex_next_token (lexer, 1)) { case T_ENDCMD: case T_SLASH: case T_COMMA: case T_ID: case T_BY: case T_ASTERISK: break; default: return false; break; } if (! lex_match_variable (lexer, dict, &v)) { if (it) interaction_destroy (*it); *iact = NULL; return false; } assert (v); if (*iact == NULL) *iact = interaction_create (v); else interaction_add_variable (*iact, v); if (lex_match (lexer, T_ASTERISK) || lex_match (lexer, T_BY)) { return parse_internal_interaction (lexer, dict, iact, iact); } return true; } bool parse_design_interaction (struct lexer *lexer, const struct dictionary *dict, struct interaction **iact) { return parse_internal_interaction (lexer, dict, iact, NULL); } pspp-1.4.1/src/language/lexer/lexer.c0000644000175000017500000014262513673465023017112 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 1997-9, 2000, 2006, 2009, 2010, 2011, 2013, 2016 Free Software Foundation, Inc. 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 3 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, see . */ #include #include "language/lexer/lexer.h" #include #include #include #include #include #include #include #include #include #include #include #include "language/command.h" #include "language/lexer/scan.h" #include "language/lexer/segment.h" #include "language/lexer/token.h" #include "libpspp/assertion.h" #include "libpspp/cast.h" #include "libpspp/deque.h" #include "libpspp/i18n.h" #include "libpspp/ll.h" #include "libpspp/message.h" #include "libpspp/misc.h" #include "libpspp/str.h" #include "libpspp/u8-istream.h" #include "output/journal.h" #include "output/text-item.h" #include "gl/c-ctype.h" #include "gl/minmax.h" #include "gl/xalloc.h" #include "gl/xmemdup0.h" #include "gettext.h" #define _(msgid) gettext (msgid) #define N_(msgid) msgid /* A token within a lex_source. */ struct lex_token { /* The regular token information. */ struct token token; /* Location of token in terms of the lex_source's buffer. src->tail <= line_pos <= token_pos <= src->head. */ size_t token_pos; /* Start of token. */ size_t token_len; /* Length of source for token in bytes. */ size_t line_pos; /* Start of line containing token_pos. */ int first_line; /* Line number at token_pos. */ }; /* A source of tokens, corresponding to a syntax file. This is conceptually a lex_reader wrapped with everything needed to convert its UTF-8 bytes into tokens. */ struct lex_source { struct ll ll; /* In lexer's list of sources. */ struct lex_reader *reader; struct segmenter segmenter; bool eof; /* True if T_STOP was read from 'reader'. */ /* Buffer of UTF-8 bytes. */ char *buffer; size_t allocated; /* Number of bytes allocated. */ size_t tail; /* &buffer[0] offset into UTF-8 source. */ size_t head; /* &buffer[head - tail] offset into source. */ /* Positions in source file, tail <= pos <= head for each member here. */ size_t journal_pos; /* First byte not yet output to journal. */ size_t seg_pos; /* First byte not yet scanned as token. */ size_t line_pos; /* First byte of line containing seg_pos. */ int n_newlines; /* Number of new-lines up to seg_pos. */ bool suppress_next_newline; /* Tokens. */ struct deque deque; /* Indexes into 'tokens'. */ struct lex_token *tokens; /* Lookahead tokens for parser. */ }; static struct lex_source *lex_source_create (struct lex_reader *); static void lex_source_destroy (struct lex_source *); /* Lexer. */ struct lexer { struct ll_list sources; /* Contains "struct lex_source"s. */ }; static struct lex_source *lex_source__ (const struct lexer *); static const struct lex_token *lex_next__ (const struct lexer *, int n); static void lex_source_push_endcmd__ (struct lex_source *); static void lex_source_pop__ (struct lex_source *); static bool lex_source_get__ (const struct lex_source *); static void lex_source_error_valist (struct lex_source *, int n0, int n1, const char *format, va_list) PRINTF_FORMAT (4, 0); static const struct lex_token *lex_source_next__ (const struct lex_source *, int n); /* Initializes READER with the specified CLASS and otherwise some reasonable defaults. The caller should fill in the others members as desired. */ void lex_reader_init (struct lex_reader *reader, const struct lex_reader_class *class) { reader->class = class; reader->syntax = LEX_SYNTAX_AUTO; reader->error = LEX_ERROR_CONTINUE; reader->file_name = NULL; reader->encoding = NULL; reader->line_number = 0; reader->eof = false; } /* Frees any file name already in READER and replaces it by a copy of FILE_NAME, or if FILE_NAME is null then clears any existing name. */ void lex_reader_set_file_name (struct lex_reader *reader, const char *file_name) { free (reader->file_name); reader->file_name = file_name != NULL ? xstrdup (file_name) : NULL; } /* Creates and returns a new lexer. */ struct lexer * lex_create (void) { struct lexer *lexer = xzalloc (sizeof *lexer); ll_init (&lexer->sources); return lexer; } /* Destroys LEXER. */ void lex_destroy (struct lexer *lexer) { if (lexer != NULL) { struct lex_source *source, *next; ll_for_each_safe (source, next, struct lex_source, ll, &lexer->sources) lex_source_destroy (source); free (lexer); } } /* Inserts READER into LEXER so that the next token read by LEXER comes from READER. Before the caller, LEXER must either be empty or at a T_ENDCMD token. */ void lex_include (struct lexer *lexer, struct lex_reader *reader) { assert (ll_is_empty (&lexer->sources) || lex_token (lexer) == T_ENDCMD); ll_push_head (&lexer->sources, &lex_source_create (reader)->ll); } /* Appends READER to LEXER, so that it will be read after all other current readers have already been read. */ void lex_append (struct lexer *lexer, struct lex_reader *reader) { ll_push_tail (&lexer->sources, &lex_source_create (reader)->ll); } /* Advancing. */ static struct lex_token * lex_push_token__ (struct lex_source *src) { struct lex_token *token; if (deque_is_full (&src->deque)) src->tokens = deque_expand (&src->deque, src->tokens, sizeof *src->tokens); token = &src->tokens[deque_push_front (&src->deque)]; token_init (&token->token); return token; } static void lex_source_pop__ (struct lex_source *src) { token_destroy (&src->tokens[deque_pop_back (&src->deque)].token); } static void lex_source_pop_front (struct lex_source *src) { token_destroy (&src->tokens[deque_pop_front (&src->deque)].token); } /* Advances LEXER to the next token, consuming the current token. */ void lex_get (struct lexer *lexer) { struct lex_source *src; src = lex_source__ (lexer); if (src == NULL) return; if (!deque_is_empty (&src->deque)) lex_source_pop__ (src); while (deque_is_empty (&src->deque)) if (!lex_source_get__ (src)) { lex_source_destroy (src); src = lex_source__ (lexer); if (src == NULL) return; } } /* Issuing errors. */ /* Prints a syntax error message containing the current token and given message MESSAGE (if non-null). */ void lex_error (struct lexer *lexer, const char *format, ...) { va_list args; va_start (args, format); lex_next_error_valist (lexer, 0, 0, format, args); va_end (args); } /* Prints a syntax error message containing the current token and given message MESSAGE (if non-null). */ void lex_error_valist (struct lexer *lexer, const char *format, va_list args) { lex_next_error_valist (lexer, 0, 0, format, args); } /* Prints a syntax error message containing the current token and given message MESSAGE (if non-null). */ void lex_next_error (struct lexer *lexer, int n0, int n1, const char *format, ...) { va_list args; va_start (args, format); lex_next_error_valist (lexer, n0, n1, format, args); va_end (args); } /* Prints a syntax error message saying that OPTION0 or one of the other strings following it, up to the first NULL, is expected. */ void (lex_error_expecting) (struct lexer *lexer, const char *option0, ...) { enum { MAX_OPTIONS = 8 }; const char *options[MAX_OPTIONS + 1]; va_list args; int n; va_start (args, option0); options[0] = option0; n = 0; while (n + 1 < MAX_OPTIONS && options[n] != NULL) options[++n] = va_arg (args, const char *); va_end (args); switch (n) { case 0: lex_error (lexer, NULL); break; case 1: lex_error (lexer, _("expecting %s"), options[0]); break; case 2: lex_error (lexer, _("expecting %s or %s"), options[0], options[1]); break; case 3: lex_error (lexer, _("expecting %s, %s, or %s"), options[0], options[1], options[2]); break; case 4: lex_error (lexer, _("expecting %s, %s, %s, or %s"), options[0], options[1], options[2], options[3]); break; case 5: lex_error (lexer, _("expecting %s, %s, %s, %s, or %s"), options[0], options[1], options[2], options[3], options[4]); break; case 6: lex_error (lexer, _("expecting %s, %s, %s, %s, %s, or %s"), options[0], options[1], options[2], options[3], options[4], options[5]); break; case 7: lex_error (lexer, _("expecting %s, %s, %s, %s, %s, %s, or %s"), options[0], options[1], options[2], options[3], options[4], options[5], options[6]); break; case 8: lex_error (lexer, _("expecting %s, %s, %s, %s, %s, %s, %s, or %s"), options[0], options[1], options[2], options[3], options[4], options[5], options[6], options[7]); break; default: NOT_REACHED (); } } /* Reports an error to the effect that subcommand SBC may only be specified once. This function does not take a lexer as an argument or use lex_error(), because the result would ordinarily just be redundant: "Syntax error at SUBCOMMAND: Subcommand SUBCOMMAND may only be specified once.", which does not help the user find the error. */ void lex_sbc_only_once (const char *sbc) { msg (SE, _("Subcommand %s may only be specified once."), sbc); } /* Reports an error to the effect that subcommand SBC is missing. This function does not take a lexer as an argument or use lex_error(), because a missing subcommand can normally be detected only after the whole command has been parsed, and so lex_error() would always report "Syntax error at end of command", which does not help the user find the error. */ void lex_sbc_missing (const char *sbc) { msg (SE, _("Required subcommand %s was not specified."), sbc); } /* Reports an error to the effect that specification SPEC may only be specified once within subcommand SBC. */ void lex_spec_only_once (struct lexer *lexer, const char *sbc, const char *spec) { lex_error (lexer, _("%s may only be specified once within subcommand %s"), spec, sbc); } /* Reports an error to the effect that specification SPEC is missing within subcommand SBC. */ void lex_spec_missing (struct lexer *lexer, const char *sbc, const char *spec) { lex_error (lexer, _("Required %s specification missing from %s subcommand"), sbc, spec); } /* Prints a syntax error message containing the current token and given message MESSAGE (if non-null). */ void lex_next_error_valist (struct lexer *lexer, int n0, int n1, const char *format, va_list args) { struct lex_source *src = lex_source__ (lexer); if (src != NULL) lex_source_error_valist (src, n0, n1, format, args); else { struct string s; ds_init_empty (&s); ds_put_format (&s, _("Syntax error at end of input")); if (format != NULL) { ds_put_cstr (&s, ": "); ds_put_vformat (&s, format, args); } ds_put_byte (&s, '.'); msg (SE, "%s", ds_cstr (&s)); ds_destroy (&s); } } /* Checks that we're at end of command. If so, returns a successful command completion code. If not, flags a syntax error and returns an error command completion code. */ int lex_end_of_command (struct lexer *lexer) { if (lex_token (lexer) != T_ENDCMD && lex_token (lexer) != T_STOP) { lex_error (lexer, _("expecting end of command")); return CMD_FAILURE; } else return CMD_SUCCESS; } /* Token testing functions. */ /* Returns true if the current token is a number. */ bool lex_is_number (const struct lexer *lexer) { return lex_next_is_number (lexer, 0); } /* Returns true if the current token is a string. */ bool lex_is_string (const struct lexer *lexer) { return lex_next_is_string (lexer, 0); } /* Returns the value of the current token, which must be a floating point number. */ double lex_number (const struct lexer *lexer) { return lex_next_number (lexer, 0); } /* Returns true iff the current token is an integer. */ bool lex_is_integer (const struct lexer *lexer) { return lex_next_is_integer (lexer, 0); } /* Returns the value of the current token, which must be an integer. */ long lex_integer (const struct lexer *lexer) { return lex_next_integer (lexer, 0); } /* Token testing functions with lookahead. A value of 0 for N as an argument to any of these functions refers to the current token. Lookahead is limited to the current command. Any N greater than the number of tokens remaining in the current command will be treated as referring to a T_ENDCMD token. */ /* Returns true if the token N ahead of the current token is a number. */ bool lex_next_is_number (const struct lexer *lexer, int n) { enum token_type next_token = lex_next_token (lexer, n); return next_token == T_POS_NUM || next_token == T_NEG_NUM; } /* Returns true if the token N ahead of the current token is a string. */ bool lex_next_is_string (const struct lexer *lexer, int n) { return lex_next_token (lexer, n) == T_STRING; } /* Returns the value of the token N ahead of the current token, which must be a floating point number. */ double lex_next_number (const struct lexer *lexer, int n) { assert (lex_next_is_number (lexer, n)); return lex_next_tokval (lexer, n); } /* Returns true if the token N ahead of the current token is an integer. */ bool lex_next_is_integer (const struct lexer *lexer, int n) { double value; if (!lex_next_is_number (lexer, n)) return false; value = lex_next_tokval (lexer, n); return value > LONG_MIN && value <= LONG_MAX && floor (value) == value; } /* Returns the value of the token N ahead of the current token, which must be an integer. */ long lex_next_integer (const struct lexer *lexer, int n) { assert (lex_next_is_integer (lexer, n)); return lex_next_tokval (lexer, n); } /* Token matching functions. */ /* If the current token has the specified TYPE, skips it and returns true. Otherwise, returns false. */ bool lex_match (struct lexer *lexer, enum token_type type) { if (lex_token (lexer) == type) { lex_get (lexer); return true; } else return false; } /* If the current token matches IDENTIFIER, skips it and returns true. IDENTIFIER may be abbreviated to its first three letters. Otherwise, returns false. IDENTIFIER must be an ASCII string. */ bool lex_match_id (struct lexer *lexer, const char *identifier) { return lex_match_id_n (lexer, identifier, 3); } /* If the current token is IDENTIFIER, skips it and returns true. IDENTIFIER may be abbreviated to its first N letters. Otherwise, returns false. IDENTIFIER must be an ASCII string. */ bool lex_match_id_n (struct lexer *lexer, const char *identifier, size_t n) { if (lex_token (lexer) == T_ID && lex_id_match_n (ss_cstr (identifier), lex_tokss (lexer), n)) { lex_get (lexer); return true; } else return false; } /* If the current token is integer X, skips it and returns true. Otherwise, returns false. */ bool lex_match_int (struct lexer *lexer, int x) { if (lex_is_integer (lexer) && lex_integer (lexer) == x) { lex_get (lexer); return true; } else return false; } /* Forced matches. */ /* If this token is IDENTIFIER, skips it and returns true. IDENTIFIER may be abbreviated to its first 3 letters. Otherwise, reports an error and returns false. IDENTIFIER must be an ASCII string. */ bool lex_force_match_id (struct lexer *lexer, const char *identifier) { if (lex_match_id (lexer, identifier)) return true; else { lex_error_expecting (lexer, identifier); return false; } } /* If the current token has the specified TYPE, skips it and returns true. Otherwise, reports an error and returns false. */ bool lex_force_match (struct lexer *lexer, enum token_type type) { if (lex_token (lexer) == type) { lex_get (lexer); return true; } else { const char *type_string = token_type_to_string (type); if (type_string) { char *s = xasprintf ("`%s'", type_string); lex_error_expecting (lexer, s); free (s); } else lex_error_expecting (lexer, token_type_to_name (type)); return false; } } /* If the current token is a string, does nothing and returns true. Otherwise, reports an error and returns false. */ bool lex_force_string (struct lexer *lexer) { if (lex_is_string (lexer)) return true; else { lex_error (lexer, _("expecting string")); return false; } } /* If the current token is a string or an identifier, does nothing and returns true. Otherwise, reports an error and returns false. This is meant for use in syntactic situations where we want to encourage the user to supply a quoted string, but for compatibility we also accept identifiers. (One example of such a situation is file names.) Therefore, the error message issued when the current token is wrong only says that a string is expected and doesn't mention that an identifier would also be accepted. */ bool lex_force_string_or_id (struct lexer *lexer) { return lex_token (lexer) == T_ID || lex_force_string (lexer); } /* If the current token is an integer, does nothing and returns true. Otherwise, reports an error and returns false. */ bool lex_force_int (struct lexer *lexer) { if (lex_is_integer (lexer)) return true; else { lex_error (lexer, _("expecting integer")); return false; } } /* If the current token is a number, does nothing and returns true. Otherwise, reports an error and returns false. */ bool lex_force_num (struct lexer *lexer) { if (lex_is_number (lexer)) return true; lex_error (lexer, _("expecting number")); return false; } /* If the current token is an identifier, does nothing and returns true. Otherwise, reports an error and returns false. */ bool lex_force_id (struct lexer *lexer) { if (lex_token (lexer) == T_ID) return true; lex_error (lexer, _("expecting identifier")); return false; } /* Token accessors. */ /* Returns the type of LEXER's current token. */ enum token_type lex_token (const struct lexer *lexer) { return lex_next_token (lexer, 0); } /* Returns the number in LEXER's current token. Only T_NEG_NUM and T_POS_NUM tokens have meaningful values. For other tokens this function will always return zero. */ double lex_tokval (const struct lexer *lexer) { return lex_next_tokval (lexer, 0); } /* Returns the null-terminated string in LEXER's current token, UTF-8 encoded. Only T_ID and T_STRING tokens have meaningful strings. For other tokens this functions this function will always return NULL. The UTF-8 encoding of the returned string is correct for variable names and other identifiers. Use filename_to_utf8() to use it as a filename. Use data_in() to use it in a "union value". */ const char * lex_tokcstr (const struct lexer *lexer) { return lex_next_tokcstr (lexer, 0); } /* Returns the string in LEXER's current token, UTF-8 encoded. The string is null-terminated (but the null terminator is not included in the returned substring's 'length'). Only T_ID and T_STRING tokens have meaningful strings. For other tokens this functions this function will always return NULL. The UTF-8 encoding of the returned string is correct for variable names and other identifiers. Use filename_to_utf8() to use it as a filename. Use data_in() to use it in a "union value". */ struct substring lex_tokss (const struct lexer *lexer) { return lex_next_tokss (lexer, 0); } /* Looking ahead. A value of 0 for N as an argument to any of these functions refers to the current token. Lookahead is limited to the current command. Any N greater than the number of tokens remaining in the current command will be treated as referring to a T_ENDCMD token. */ static const struct lex_token * lex_next__ (const struct lexer *lexer_, int n) { struct lexer *lexer = CONST_CAST (struct lexer *, lexer_); struct lex_source *src = lex_source__ (lexer); if (src != NULL) return lex_source_next__ (src, n); else { static const struct lex_token stop_token = { TOKEN_INITIALIZER (T_STOP, 0.0, ""), 0, 0, 0, 0 }; return &stop_token; } } static const struct lex_token * lex_source_next__ (const struct lex_source *src, int n) { while (deque_count (&src->deque) <= n) { if (!deque_is_empty (&src->deque)) { struct lex_token *front; front = &src->tokens[deque_front (&src->deque, 0)]; if (front->token.type == T_STOP || front->token.type == T_ENDCMD) return front; } lex_source_get__ (src); } return &src->tokens[deque_back (&src->deque, n)]; } /* Returns the "struct token" of the token N after the current one in LEXER. The returned pointer can be invalidated by pretty much any succeeding call into the lexer, although the string pointer within the returned token is only invalidated by consuming the token (e.g. with lex_get()). */ const struct token * lex_next (const struct lexer *lexer, int n) { return &lex_next__ (lexer, n)->token; } /* Returns the type of the token N after the current one in LEXER. */ enum token_type lex_next_token (const struct lexer *lexer, int n) { return lex_next (lexer, n)->type; } /* Returns the number in the tokn N after the current one in LEXER. Only T_NEG_NUM and T_POS_NUM tokens have meaningful values. For other tokens this function will always return zero. */ double lex_next_tokval (const struct lexer *lexer, int n) { const struct token *token = lex_next (lexer, n); return token->number; } /* Returns the null-terminated string in the token N after the current one, in UTF-8 encoding. Only T_ID and T_STRING tokens have meaningful strings. For other tokens this functions this function will always return NULL. The UTF-8 encoding of the returned string is correct for variable names and other identifiers. Use filename_to_utf8() to use it as a filename. Use data_in() to use it in a "union value". */ const char * lex_next_tokcstr (const struct lexer *lexer, int n) { return lex_next_tokss (lexer, n).string; } /* Returns the string in the token N after the current one, in UTF-8 encoding. The string is null-terminated (but the null terminator is not included in the returned substring's 'length'). Only T_ID and T_STRING tokens have meaningful strings. For other tokens this functions this function will always return NULL. The UTF-8 encoding of the returned string is correct for variable names and other identifiers. Use filename_to_utf8() to use it as a filename. Use data_in() to use it in a "union value". */ struct substring lex_next_tokss (const struct lexer *lexer, int n) { return lex_next (lexer, n)->string; } static bool lex_tokens_match (const struct token *actual, const struct token *expected) { if (actual->type != expected->type) return false; switch (actual->type) { case T_POS_NUM: case T_NEG_NUM: return actual->number == expected->number; case T_ID: return lex_id_match (expected->string, actual->string); case T_STRING: return (actual->string.length == expected->string.length && !memcmp (actual->string.string, expected->string.string, actual->string.length)); default: return true; } } /* If LEXER is positioned at the sequence of tokens that may be parsed from S, skips it and returns true. Otherwise, returns false. S may consist of an arbitrary sequence of tokens, e.g. "KRUSKAL-WALLIS", "2SLS", or "END INPUT PROGRAM". Identifiers may be abbreviated to their first three letters. */ bool lex_match_phrase (struct lexer *lexer, const char *s) { struct string_lexer slex; struct token token; int i; i = 0; string_lexer_init (&slex, s, strlen (s), SEG_MODE_INTERACTIVE); while (string_lexer_next (&slex, &token)) if (token.type != SCAN_SKIP) { bool match = lex_tokens_match (lex_next (lexer, i++), &token); token_destroy (&token); if (!match) return false; } while (i-- > 0) lex_get (lexer); return true; } static int lex_source_get_first_line_number (const struct lex_source *src, int n) { return lex_source_next__ (src, n)->first_line; } static int count_newlines (char *s, size_t length) { int n_newlines = 0; char *newline; while ((newline = memchr (s, '\n', length)) != NULL) { n_newlines++; length -= (newline + 1) - s; s = newline + 1; } return n_newlines; } static int lex_source_get_last_line_number (const struct lex_source *src, int n) { const struct lex_token *token = lex_source_next__ (src, n); if (token->first_line == 0) return 0; else { char *token_str = &src->buffer[token->token_pos - src->tail]; return token->first_line + count_newlines (token_str, token->token_len) + 1; } } static int count_columns (const char *s_, size_t length) { const uint8_t *s = CHAR_CAST (const uint8_t *, s_); int columns; size_t ofs; int mblen; columns = 0; for (ofs = 0; ofs < length; ofs += mblen) { ucs4_t uc; mblen = u8_mbtouc (&uc, s + ofs, length - ofs); if (uc != '\t') { int width = uc_width (uc, "UTF-8"); if (width > 0) columns += width; } else columns = ROUND_UP (columns + 1, 8); } return columns + 1; } static int lex_source_get_first_column (const struct lex_source *src, int n) { const struct lex_token *token = lex_source_next__ (src, n); return count_columns (&src->buffer[token->line_pos - src->tail], token->token_pos - token->line_pos); } static int lex_source_get_last_column (const struct lex_source *src, int n) { const struct lex_token *token = lex_source_next__ (src, n); char *start, *end, *newline; start = &src->buffer[token->line_pos - src->tail]; end = &src->buffer[(token->token_pos + token->token_len) - src->tail]; newline = memrchr (start, '\n', end - start); if (newline != NULL) start = newline + 1; return count_columns (start, end - start); } /* Returns the 1-based line number of the start of the syntax that represents the token N after the current one in LEXER. Returns 0 for a T_STOP token or if the token is drawn from a source that does not have line numbers. */ int lex_get_first_line_number (const struct lexer *lexer, int n) { const struct lex_source *src = lex_source__ (lexer); return src != NULL ? lex_source_get_first_line_number (src, n) : 0; } /* Returns the 1-based line number of the end of the syntax that represents the token N after the current one in LEXER, plus 1. Returns 0 for a T_STOP token or if the token is drawn from a source that does not have line numbers. Most of the time, a single token is wholly within a single line of syntax, but there are two exceptions: a T_STRING token can be made up of multiple segments on adjacent lines connected with "+" punctuators, and a T_NEG_NUM token can consist of a "-" on one line followed by the number on the next. */ int lex_get_last_line_number (const struct lexer *lexer, int n) { const struct lex_source *src = lex_source__ (lexer); return src != NULL ? lex_source_get_last_line_number (src, n) : 0; } /* Returns the 1-based column number of the start of the syntax that represents the token N after the current one in LEXER. Returns 0 for a T_STOP token. Column numbers are measured according to the width of characters as shown in a typical fixed-width font, in which CJK characters have width 2 and combining characters have width 0. */ int lex_get_first_column (const struct lexer *lexer, int n) { const struct lex_source *src = lex_source__ (lexer); return src != NULL ? lex_source_get_first_column (src, n) : 0; } /* Returns the 1-based column number of the end of the syntax that represents the token N after the current one in LEXER, plus 1. Returns 0 for a T_STOP token. Column numbers are measured according to the width of characters as shown in a typical fixed-width font, in which CJK characters have width 2 and combining characters have width 0. */ int lex_get_last_column (const struct lexer *lexer, int n) { const struct lex_source *src = lex_source__ (lexer); return src != NULL ? lex_source_get_last_column (src, n) : 0; } /* Returns the name of the syntax file from which the current command is drawn. Returns NULL for a T_STOP token or if the command's source does not have line numbers. There is no version of this function that takes an N argument because lookahead only works to the end of a command and any given command is always within a single syntax file. */ const char * lex_get_file_name (const struct lexer *lexer) { struct lex_source *src = lex_source__ (lexer); return src == NULL ? NULL : src->reader->file_name; } const char * lex_get_encoding (const struct lexer *lexer) { struct lex_source *src = lex_source__ (lexer); return src == NULL ? NULL : src->reader->encoding; } /* Returns the syntax mode for the syntax file from which the current drawn is drawn. Returns LEX_SYNTAX_AUTO for a T_STOP token or if the command's source does not have line numbers. There is no version of this function that takes an N argument because lookahead only works to the end of a command and any given command is always within a single syntax file. */ enum lex_syntax_mode lex_get_syntax_mode (const struct lexer *lexer) { struct lex_source *src = lex_source__ (lexer); return src == NULL ? LEX_SYNTAX_AUTO : src->reader->syntax; } /* Returns the error mode for the syntax file from which the current drawn is drawn. Returns LEX_ERROR_TERMINAL for a T_STOP token or if the command's source does not have line numbers. There is no version of this function that takes an N argument because lookahead only works to the end of a command and any given command is always within a single syntax file. */ enum lex_error_mode lex_get_error_mode (const struct lexer *lexer) { struct lex_source *src = lex_source__ (lexer); return src == NULL ? LEX_ERROR_TERMINAL : src->reader->error; } /* If the source that LEXER is currently reading has error mode LEX_ERROR_TERMINAL, discards all buffered input and tokens, so that the next token to be read comes directly from whatever is next read from the stream. It makes sense to call this function after encountering an error in a command entered on the console, because usually the user would prefer not to have cascading errors. */ void lex_interactive_reset (struct lexer *lexer) { struct lex_source *src = lex_source__ (lexer); if (src != NULL && src->reader->error == LEX_ERROR_TERMINAL) { src->head = src->tail = 0; src->journal_pos = src->seg_pos = src->line_pos = 0; src->n_newlines = 0; src->suppress_next_newline = false; segmenter_init (&src->segmenter, segmenter_get_mode (&src->segmenter)); while (!deque_is_empty (&src->deque)) lex_source_pop__ (src); lex_source_push_endcmd__ (src); } } /* Advances past any tokens in LEXER up to a T_ENDCMD or T_STOP. */ void lex_discard_rest_of_command (struct lexer *lexer) { while (lex_token (lexer) != T_STOP && lex_token (lexer) != T_ENDCMD) lex_get (lexer); } /* Discards all lookahead tokens in LEXER, then discards all input sources until it encounters one with error mode LEX_ERROR_TERMINAL or until it runs out of input sources. */ void lex_discard_noninteractive (struct lexer *lexer) { struct lex_source *src = lex_source__ (lexer); if (src != NULL) { while (!deque_is_empty (&src->deque)) lex_source_pop__ (src); for (; src != NULL && src->reader->error != LEX_ERROR_TERMINAL; src = lex_source__ (lexer)) lex_source_destroy (src); } } static size_t lex_source_max_tail__ (const struct lex_source *src) { const struct lex_token *token; size_t max_tail; assert (src->seg_pos >= src->line_pos); max_tail = MIN (src->journal_pos, src->line_pos); /* Use the oldest token also. (We know that src->deque cannot be empty because we are in the process of adding a new token, which is already initialized enough to use here.) */ token = &src->tokens[deque_back (&src->deque, 0)]; assert (token->token_pos >= token->line_pos); max_tail = MIN (max_tail, token->line_pos); return max_tail; } static void lex_source_expand__ (struct lex_source *src) { if (src->head - src->tail >= src->allocated) { size_t max_tail = lex_source_max_tail__ (src); if (max_tail > src->tail) { /* Advance the tail, freeing up room at the head. */ memmove (src->buffer, src->buffer + (max_tail - src->tail), src->head - max_tail); src->tail = max_tail; } else { /* Buffer is completely full. Expand it. */ src->buffer = x2realloc (src->buffer, &src->allocated); } } else { /* There's space available at the head of the buffer. Nothing to do. */ } } static void lex_source_read__ (struct lex_source *src) { do { lex_source_expand__ (src); size_t head_ofs = src->head - src->tail; size_t space = src->allocated - head_ofs; enum prompt_style prompt = segmenter_get_prompt (&src->segmenter); size_t n = src->reader->class->read (src->reader, &src->buffer[head_ofs], space, prompt); assert (n <= space); if (n == 0) { /* End of input. */ src->reader->eof = true; lex_source_expand__ (src); return; } src->head += n; } while (!memchr (&src->buffer[src->seg_pos - src->tail], '\n', src->head - src->seg_pos)); } static struct lex_source * lex_source__ (const struct lexer *lexer) { return (ll_is_empty (&lexer->sources) ? NULL : ll_data (ll_head (&lexer->sources), struct lex_source, ll)); } static struct substring lex_source_get_syntax__ (const struct lex_source *src, int n0, int n1) { const struct lex_token *token0 = lex_source_next__ (src, n0); const struct lex_token *token1 = lex_source_next__ (src, MAX (n0, n1)); size_t start = token0->token_pos; size_t end = token1->token_pos + token1->token_len; return ss_buffer (&src->buffer[start - src->tail], end - start); } static void lex_ellipsize__ (struct substring in, char *out, size_t out_size) { size_t out_maxlen; size_t out_len; int mblen; assert (out_size >= 16); out_maxlen = out_size - 1; if (in.length > out_maxlen - 3) out_maxlen -= 3; for (out_len = 0; out_len < in.length; out_len += mblen) { if (in.string[out_len] == '\n' || in.string[out_len] == '\0' || (in.string[out_len] == '\r' && out_len + 1 < in.length && in.string[out_len + 1] == '\n')) break; mblen = u8_mblen (CHAR_CAST (const uint8_t *, in.string + out_len), in.length - out_len); if (mblen < 0) break; if (out_len + mblen > out_maxlen) break; } memcpy (out, in.string, out_len); strcpy (&out[out_len], out_len < in.length ? "..." : ""); } static void lex_source_error_valist (struct lex_source *src, int n0, int n1, const char *format, va_list args) { const struct lex_token *token; struct string s; ds_init_empty (&s); token = lex_source_next__ (src, n0); if (token->token.type == T_ENDCMD) ds_put_cstr (&s, _("Syntax error at end of command")); else { struct substring syntax = lex_source_get_syntax__ (src, n0, n1); if (!ss_is_empty (syntax)) { char syntax_cstr[64]; lex_ellipsize__ (syntax, syntax_cstr, sizeof syntax_cstr); ds_put_format (&s, _("Syntax error at `%s'"), syntax_cstr); } else ds_put_cstr (&s, _("Syntax error")); } if (format) { ds_put_cstr (&s, ": "); ds_put_vformat (&s, format, args); } ds_put_byte (&s, '.'); struct msg m = { .category = MSG_C_SYNTAX, .severity = MSG_S_ERROR, .file_name = src->reader->file_name, .first_line = lex_source_get_first_line_number (src, n0), .last_line = lex_source_get_last_line_number (src, n1), .first_column = lex_source_get_first_column (src, n0), .last_column = lex_source_get_last_column (src, n1), .text = ds_steal_cstr (&s), }; msg_emit (&m); } static void PRINTF_FORMAT (2, 3) lex_get_error (struct lex_source *src, const char *format, ...) { va_list args; int n; va_start (args, format); n = deque_count (&src->deque) - 1; lex_source_error_valist (src, n, n, format, args); lex_source_pop_front (src); va_end (args); } /* Attempts to append an additional token into SRC's deque, reading more from the underlying lex_reader if necessary.. Returns true if successful, false if the deque already represents (a suffix of) the whole lex_reader's contents, */ static bool lex_source_get__ (const struct lex_source *src_) { struct lex_source *src = CONST_CAST (struct lex_source *, src_); if (src->eof) return false; /* State maintained while scanning tokens. Usually we only need a single state, but scanner_push() can return SCAN_SAVE to indicate that the state needs to be saved and possibly restored later with SCAN_BACK. */ struct state { struct segmenter segmenter; enum segment_type last_segment; int newlines; /* Number of newlines encountered so far. */ /* Maintained here so we can update lex_source's similar members when we finish. */ size_t line_pos; size_t seg_pos; }; /* Initialize state. */ struct state state = { .segmenter = src->segmenter, .newlines = 0, .seg_pos = src->seg_pos, .line_pos = src->line_pos, }; struct state saved = state; /* Append a new token to SRC and initialize it. */ struct lex_token *token = lex_push_token__ (src); struct scanner scanner; scanner_init (&scanner, &token->token); token->line_pos = src->line_pos; token->token_pos = src->seg_pos; if (src->reader->line_number > 0) token->first_line = src->reader->line_number + src->n_newlines; else token->first_line = 0; /* Extract segments and pass them through the scanner until we obtain a token. */ for (;;) { /* Extract a segment. */ const char *segment = &src->buffer[state.seg_pos - src->tail]; size_t seg_maxlen = src->head - state.seg_pos; enum segment_type type; int seg_len = segmenter_push (&state.segmenter, segment, seg_maxlen, src->reader->eof, &type); if (seg_len < 0) { /* The segmenter needs more input to produce a segment. */ assert (!src->reader->eof); lex_source_read__ (src); continue; } /* Update state based on the segment. */ state.last_segment = type; state.seg_pos += seg_len; if (type == SEG_NEWLINE) { state.newlines++; state.line_pos = state.seg_pos; } /* Pass the segment into the scanner and try to get a token out. */ enum scan_result result = scanner_push (&scanner, type, ss_buffer (segment, seg_len), &token->token); if (result == SCAN_SAVE) saved = state; else if (result == SCAN_BACK) { state = saved; break; } else if (result == SCAN_DONE) break; } /* If we've reached the end of a line, or the end of a command, then pass the line to the output engine as a syntax text item. */ int n_lines = state.newlines; if (state.last_segment == SEG_END_COMMAND && !src->suppress_next_newline) { n_lines++; src->suppress_next_newline = true; } else if (n_lines > 0 && src->suppress_next_newline) { n_lines--; src->suppress_next_newline = false; } for (int i = 0; i < n_lines; i++) { /* Beginning of line. */ const char *line = &src->buffer[src->journal_pos - src->tail]; /* Calculate line length, including \n or \r\n end-of-line if present. We use src->head even though that may be beyond what we've actually converted to tokens (which is only through state.line_pos). That's because, if we're emitting the line due to SEG_END_COMMAND, we want to take the whole line through the newline, not just through the '.'. */ size_t max_len = src->head - src->journal_pos; const char *newline = memchr (line, '\n', max_len); size_t line_len = newline ? newline - line + 1 : max_len; /* Calculate line length excluding end-of-line. */ size_t copy_len = line_len; if (copy_len > 0 && line[copy_len - 1] == '\n') copy_len--; if (copy_len > 0 && line[copy_len - 1] == '\r') copy_len--; /* Submit the line as syntax. */ text_item_submit (text_item_create_nocopy (TEXT_ITEM_SYNTAX, xmemdup0 (line, copy_len))); src->journal_pos += line_len; } token->token_len = state.seg_pos - src->seg_pos; src->segmenter = state.segmenter; src->seg_pos = state.seg_pos; src->line_pos = state.line_pos; src->n_newlines += state.newlines; switch (token->token.type) { default: break; case T_STOP: token->token.type = T_ENDCMD; src->eof = true; break; case SCAN_BAD_HEX_LENGTH: lex_get_error (src, _("String of hex digits has %d characters, which " "is not a multiple of 2"), (int) token->token.number); break; case SCAN_BAD_HEX_DIGIT: case SCAN_BAD_UNICODE_DIGIT: lex_get_error (src, _("`%c' is not a valid hex digit"), (int) token->token.number); break; case SCAN_BAD_UNICODE_LENGTH: lex_get_error (src, _("Unicode string contains %d bytes, which is " "not in the valid range of 1 to 8 bytes"), (int) token->token.number); break; case SCAN_BAD_UNICODE_CODE_POINT: lex_get_error (src, _("U+%04X is not a valid Unicode code point"), (int) token->token.number); break; case SCAN_EXPECTED_QUOTE: lex_get_error (src, _("Unterminated string constant")); break; case SCAN_EXPECTED_EXPONENT: lex_get_error (src, _("Missing exponent following `%s'"), token->token.string.string); break; case SCAN_UNEXPECTED_DOT: lex_get_error (src, _("Unexpected `.' in middle of command")); break; case SCAN_UNEXPECTED_CHAR: { char c_name[16]; lex_get_error (src, _("Bad character %s in input"), uc_name (token->token.number, c_name)); } break; case SCAN_SKIP: lex_source_pop_front (src); break; } return true; } static void lex_source_push_endcmd__ (struct lex_source *src) { struct lex_token *token = lex_push_token__ (src); token->token.type = T_ENDCMD; token->token_pos = 0; token->token_len = 0; token->line_pos = 0; token->first_line = 0; } static struct lex_source * lex_source_create (struct lex_reader *reader) { struct lex_source *src; enum segmenter_mode mode; src = xzalloc (sizeof *src); src->reader = reader; if (reader->syntax == LEX_SYNTAX_AUTO) mode = SEG_MODE_AUTO; else if (reader->syntax == LEX_SYNTAX_INTERACTIVE) mode = SEG_MODE_INTERACTIVE; else if (reader->syntax == LEX_SYNTAX_BATCH) mode = SEG_MODE_BATCH; else NOT_REACHED (); segmenter_init (&src->segmenter, mode); src->tokens = deque_init (&src->deque, 4, sizeof *src->tokens); lex_source_push_endcmd__ (src); return src; } static void lex_source_destroy (struct lex_source *src) { char *file_name = src->reader->file_name; char *encoding = src->reader->encoding; if (src->reader->class->destroy != NULL) src->reader->class->destroy (src->reader); free (file_name); free (encoding); free (src->buffer); while (!deque_is_empty (&src->deque)) lex_source_pop__ (src); free (src->tokens); ll_remove (&src->ll); free (src); } struct lex_file_reader { struct lex_reader reader; struct u8_istream *istream; }; static struct lex_reader_class lex_file_reader_class; /* Creates and returns a new lex_reader that will read from file FILE_NAME (or from stdin if FILE_NAME is "-"). The file is expected to be encoded with ENCODING, which should take one of the forms accepted by u8_istream_for_file(). SYNTAX and ERROR become the syntax mode and error mode of the new reader, respectively. Returns a null pointer if FILE_NAME cannot be opened. */ struct lex_reader * lex_reader_for_file (const char *file_name, const char *encoding, enum lex_syntax_mode syntax, enum lex_error_mode error) { struct lex_file_reader *r; struct u8_istream *istream; istream = (!strcmp(file_name, "-") ? u8_istream_for_fd (encoding, STDIN_FILENO) : u8_istream_for_file (encoding, file_name, O_RDONLY)); if (istream == NULL) { msg (ME, _("Opening `%s': %s."), file_name, strerror (errno)); return NULL; } r = xmalloc (sizeof *r); lex_reader_init (&r->reader, &lex_file_reader_class); r->reader.syntax = syntax; r->reader.error = error; r->reader.file_name = xstrdup (file_name); r->reader.encoding = encoding ? xstrdup (encoding) : NULL; r->reader.line_number = 1; r->istream = istream; return &r->reader; } static struct lex_file_reader * lex_file_reader_cast (struct lex_reader *r) { return UP_CAST (r, struct lex_file_reader, reader); } static size_t lex_file_read (struct lex_reader *r_, char *buf, size_t n, enum prompt_style prompt_style UNUSED) { struct lex_file_reader *r = lex_file_reader_cast (r_); ssize_t n_read = u8_istream_read (r->istream, buf, n); if (n_read < 0) { msg (ME, _("Error reading `%s': %s."), r_->file_name, strerror (errno)); return 0; } return n_read; } static void lex_file_close (struct lex_reader *r_) { struct lex_file_reader *r = lex_file_reader_cast (r_); if (u8_istream_fileno (r->istream) != STDIN_FILENO) { if (u8_istream_close (r->istream) != 0) msg (ME, _("Error closing `%s': %s."), r_->file_name, strerror (errno)); } else u8_istream_free (r->istream); free (r); } static struct lex_reader_class lex_file_reader_class = { lex_file_read, lex_file_close }; struct lex_string_reader { struct lex_reader reader; struct substring s; size_t offset; }; static struct lex_reader_class lex_string_reader_class; /* Creates and returns a new lex_reader for the contents of S, which must be encoded in the given ENCODING. The new reader takes ownership of S and will free it with ss_dealloc() when it is closed. */ struct lex_reader * lex_reader_for_substring_nocopy (struct substring s, const char *encoding) { struct lex_string_reader *r; r = xmalloc (sizeof *r); lex_reader_init (&r->reader, &lex_string_reader_class); r->reader.syntax = LEX_SYNTAX_AUTO; r->reader.encoding = encoding ? xstrdup (encoding) : NULL; r->s = s; r->offset = 0; return &r->reader; } /* Creates and returns a new lex_reader for a copy of null-terminated string S, which must be encoded in ENCODING. The caller retains ownership of S. */ struct lex_reader * lex_reader_for_string (const char *s, const char *encoding) { struct substring ss; ss_alloc_substring (&ss, ss_cstr (s)); return lex_reader_for_substring_nocopy (ss, encoding); } /* Formats FORMAT as a printf()-like format string and creates and returns a new lex_reader for the formatted result. */ struct lex_reader * lex_reader_for_format (const char *format, const char *encoding, ...) { struct lex_reader *r; va_list args; va_start (args, encoding); r = lex_reader_for_substring_nocopy (ss_cstr (xvasprintf (format, args)), encoding); va_end (args); return r; } static struct lex_string_reader * lex_string_reader_cast (struct lex_reader *r) { return UP_CAST (r, struct lex_string_reader, reader); } static size_t lex_string_read (struct lex_reader *r_, char *buf, size_t n, enum prompt_style prompt_style UNUSED) { struct lex_string_reader *r = lex_string_reader_cast (r_); size_t chunk; chunk = MIN (n, r->s.length - r->offset); memcpy (buf, r->s.string + r->offset, chunk); r->offset += chunk; return chunk; } static void lex_string_close (struct lex_reader *r_) { struct lex_string_reader *r = lex_string_reader_cast (r_); ss_dealloc (&r->s); free (r); } static struct lex_reader_class lex_string_reader_class = { lex_string_read, lex_string_close }; pspp-1.4.1/src/language/control/0000755000175000017500000000000013725012647016154 5ustar00blpblp00000000000000pspp-1.4.1/src/language/control/automake.mk0000644000175000017500000000203413571051220020277 0ustar00blpblp00000000000000# PSPP - a program for statistical analysis. # Copyright (C) 2017 Free Software Foundation, Inc. # # 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 3 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, see . # ## Process this file with automake to produce Makefile.in -*- makefile -*- language_control_sources = \ src/language/control/control-stack.c \ src/language/control/control-stack.h \ src/language/control/do-if.c \ src/language/control/loop.c \ src/language/control/repeat.c \ src/language/control/temporary.c pspp-1.4.1/src/language/control/repeat.c0000644000175000017500000002654713360714656017622 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 1997-9, 2000, 2007, 2009-2012 Free Software Foundation, Inc. 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 3 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, see . */ #include #include #include "data/dataset.h" #include "data/dictionary.h" #include "data/settings.h" #include "language/command.h" #include "language/lexer/lexer.h" #include "language/lexer/segment.h" #include "language/lexer/token.h" #include "language/lexer/variable-parser.h" #include "libpspp/assertion.h" #include "libpspp/cast.h" #include "libpspp/hash-functions.h" #include "libpspp/hmap.h" #include "libpspp/i18n.h" #include "libpspp/message.h" #include "libpspp/str.h" #include "libpspp/misc.h" #include "gl/ftoastr.h" #include "gl/minmax.h" #include "gl/xalloc.h" #include "gl/xmemdup0.h" #include "gettext.h" #define _(msgid) gettext (msgid) struct dummy_var { struct hmap_node hmap_node; char *name; size_t name_len; char **values; size_t n_values; }; static bool parse_specification (struct lexer *, struct dictionary *, struct hmap *dummies); static bool parse_commands (struct lexer *, struct hmap *dummies); static void destroy_dummies (struct hmap *dummies); static bool parse_ids (struct lexer *, const struct dictionary *, struct dummy_var *); static bool parse_numbers (struct lexer *, struct dummy_var *); static bool parse_strings (struct lexer *, struct dummy_var *); int cmd_do_repeat (struct lexer *lexer, struct dataset *ds) { struct hmap dummies; bool ok; if (!parse_specification (lexer, dataset_dict (ds), &dummies)) return CMD_CASCADING_FAILURE; ok = parse_commands (lexer, &dummies); destroy_dummies (&dummies); return ok ? CMD_SUCCESS : CMD_CASCADING_FAILURE; } static unsigned int hash_dummy (const char *name, size_t name_len) { return utf8_hash_case_bytes (name, name_len, 0); } static const struct dummy_var * find_dummy_var (struct hmap *hmap, const char *name, size_t name_len) { const struct dummy_var *dv; HMAP_FOR_EACH_WITH_HASH (dv, struct dummy_var, hmap_node, hash_dummy (name, name_len), hmap) if (!utf8_strncasecmp (dv->name, dv->name_len, name, name_len)) return dv; return NULL; } /* Parses the whole DO REPEAT command specification. Returns success. */ static bool parse_specification (struct lexer *lexer, struct dictionary *dict, struct hmap *dummies) { struct dummy_var *first_dv = NULL; hmap_init (dummies); do { struct dummy_var *dv; const char *name; bool ok; /* Get a stand-in variable name and make sure it's unique. */ if (!lex_force_id (lexer)) goto error; name = lex_tokcstr (lexer); if (dict_lookup_var (dict, name)) msg (SW, _("Dummy variable name `%s' hides dictionary variable `%s'."), name, name); size_t name_len = strlen (name); if (find_dummy_var (dummies, name, name_len)) { msg (SE, _("Dummy variable name `%s' is given twice."), name); goto error; } /* Make a new macro. */ dv = xmalloc (sizeof *dv); dv->name = xmemdup0 (name, name_len); dv->name_len = name_len; dv->values = NULL; dv->n_values = 0; hmap_insert (dummies, &dv->hmap_node, hash_dummy (name, strlen (name))); /* Skip equals sign. */ lex_get (lexer); if (!lex_force_match (lexer, T_EQUALS)) goto error; /* Get the details of the variable's possible values. */ if (lex_token (lexer) == T_ID || lex_token (lexer) == T_ALL) ok = parse_ids (lexer, dict, dv); else if (lex_is_number (lexer)) ok = parse_numbers (lexer, dv); else if (lex_is_string (lexer)) ok = parse_strings (lexer, dv); else { lex_error (lexer, NULL); goto error; } if (!ok) goto error; assert (dv->n_values > 0); if (lex_token (lexer) != T_SLASH && lex_token (lexer) != T_ENDCMD) { lex_error (lexer, NULL); goto error; } /* If this is the first variable then it defines how many replacements there must be; otherwise enforce this number of replacements. */ if (first_dv == NULL) first_dv = dv; else if (first_dv->n_values != dv->n_values) { msg (SE, _("Dummy variable `%s' had %zu substitutions, so `%s' must " "also, but %zu were specified."), first_dv->name, first_dv->n_values, dv->name, dv->n_values); goto error; } lex_match (lexer, T_SLASH); } while (!lex_match (lexer, T_ENDCMD)); while (lex_match (lexer, T_ENDCMD)) continue; return true; error: destroy_dummies (dummies); return false; } static size_t count_values (struct hmap *dummies) { const struct dummy_var *dv; dv = HMAP_FIRST (struct dummy_var, hmap_node, dummies); return dv->n_values; } static void do_parse_commands (struct substring s, enum segmenter_mode mode, struct hmap *dummies, struct string *outputs, size_t n_outputs) { struct segmenter segmenter; segmenter_init (&segmenter, mode); while (!ss_is_empty (s)) { enum segment_type type; int n; n = segmenter_push (&segmenter, s.string, s.length, true, &type); assert (n >= 0); if (type == SEG_DO_REPEAT_COMMAND) { for (;;) { int k; k = segmenter_push (&segmenter, s.string + n, s.length - n, true, &type); if (type != SEG_NEWLINE && type != SEG_DO_REPEAT_COMMAND) break; n += k; } do_parse_commands (ss_head (s, n), mode, dummies, outputs, n_outputs); } else if (type != SEG_END) { const struct dummy_var *dv; size_t i; dv = (type == SEG_IDENTIFIER ? find_dummy_var (dummies, s.string, n) : NULL); for (i = 0; i < n_outputs; i++) if (dv != NULL) ds_put_cstr (&outputs[i], dv->values[i]); else ds_put_substring (&outputs[i], ss_head (s, n)); } ss_advance (&s, n); } } static bool parse_commands (struct lexer *lexer, struct hmap *dummies) { enum lex_syntax_mode syntax_mode; enum segmenter_mode mode; struct string *outputs; struct string input; size_t n_values; char *file_name; int line_number; bool ok; size_t i; if (lex_get_file_name (lexer) != NULL) file_name = xstrdup (lex_get_file_name (lexer)); else file_name = NULL; line_number = lex_get_first_line_number (lexer, 0); ds_init_empty (&input); while (lex_is_string (lexer)) { ds_put_substring (&input, lex_tokss (lexer)); ds_put_byte (&input, '\n'); lex_get (lexer); } n_values = count_values (dummies); outputs = xmalloc (n_values * sizeof *outputs); for (i = 0; i < n_values; i++) ds_init_empty (&outputs[i]); syntax_mode = lex_get_syntax_mode (lexer); if (syntax_mode == LEX_SYNTAX_AUTO) mode = SEG_MODE_AUTO; else if (syntax_mode == LEX_SYNTAX_INTERACTIVE) mode = SEG_MODE_INTERACTIVE; else if (syntax_mode == LEX_SYNTAX_BATCH) mode = SEG_MODE_BATCH; else NOT_REACHED (); do_parse_commands (ds_ss (&input), mode, dummies, outputs, n_values); ds_destroy (&input); while (lex_match (lexer, T_ENDCMD)) continue; ok = (lex_force_match_id (lexer, "END") && lex_force_match_id (lexer, "REPEAT")); if (ok) lex_match_id (lexer, "PRINT"); /* XXX */ lex_discard_rest_of_command (lexer); for (i = 0; i < n_values; i++) { struct string *output = &outputs[n_values - i - 1]; const char *encoding = lex_get_encoding (lexer); struct lex_reader *reader = lex_reader_for_substring_nocopy (ds_ss (output), encoding); lex_reader_set_file_name (reader, file_name); reader->line_number = line_number; lex_include (lexer, reader); } free (file_name); free (outputs); return ok; } static void destroy_dummies (struct hmap *dummies) { struct dummy_var *dv, *next; HMAP_FOR_EACH_SAFE (dv, next, struct dummy_var, hmap_node, dummies) { size_t i; hmap_delete (dummies, &dv->hmap_node); free (dv->name); for (i = 0; i < dv->n_values; i++) free (dv->values[i]); free (dv->values); free (dv); } hmap_destroy (dummies); } /* Parses a set of ids for DO REPEAT. */ static bool parse_ids (struct lexer *lexer, const struct dictionary *dict, struct dummy_var *dv) { return parse_mixed_vars (lexer, dict, &dv->values, &dv->n_values, PV_NONE); } /* Adds REPLACEMENT to MACRO's list of replacements, which has *USED elements and has room for *ALLOCATED. Allocates memory from POOL. */ static void add_replacement (struct dummy_var *dv, char *value, size_t *allocated) { if (dv->n_values == *allocated) dv->values = x2nrealloc (dv->values, allocated, sizeof *dv->values); dv->values[dv->n_values++] = value; } /* Parses a list or range of numbers for DO REPEAT. */ static bool parse_numbers (struct lexer *lexer, struct dummy_var *dv) { size_t allocated = 0; do { if (!lex_force_num (lexer)) return false; if (lex_next_token (lexer, 1) == T_TO) { long int a, b; long int i; if (!lex_is_integer (lexer)) { msg (SE, _("Ranges may only have integer bounds.")); return false; } a = lex_integer (lexer); lex_get (lexer); lex_get (lexer); if (!lex_force_int (lexer)) return false; b = lex_integer (lexer); if (b < a) { msg (SE, _("%ld TO %ld is an invalid range."), a, b); return false; } lex_get (lexer); for (i = a; i <= b; i++) add_replacement (dv, xasprintf ("%ld", i), &allocated); } else { char s[DBL_BUFSIZE_BOUND]; c_dtoastr (s, sizeof s, 0, 0, lex_number (lexer)); add_replacement (dv, xstrdup (s), &allocated); lex_get (lexer); } lex_match (lexer, T_COMMA); } while (lex_token (lexer) != T_SLASH && lex_token (lexer) != T_ENDCMD); return true; } /* Parses a list of strings for DO REPEAT. */ static bool parse_strings (struct lexer *lexer, struct dummy_var *dv) { size_t allocated = 0; do { if (!lex_force_string (lexer)) { return false; } add_replacement (dv, token_to_string (lex_next (lexer, 0)), &allocated); lex_get (lexer); lex_match (lexer, T_COMMA); } while (lex_token (lexer) != T_SLASH && lex_token (lexer) != T_ENDCMD); return true; } int cmd_end_repeat (struct lexer *lexer UNUSED, struct dataset *ds UNUSED) { msg (SE, _("No matching %s."), "DO REPEAT"); return CMD_CASCADING_FAILURE; } pspp-1.4.1/src/language/control/loop.c0000644000175000017500000002671513571051161017275 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 1997-9, 2000, 2009-2011 Free Software Foundation, Inc. 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 3 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, see . */ #include #include "language/control/control-stack.h" #include "data/case.h" #include "data/dataset.h" #include "data/dictionary.h" #include "data/settings.h" #include "data/transformations.h" #include "data/variable.h" #include "language/command.h" #include "language/expressions/public.h" #include "language/lexer/lexer.h" #include "libpspp/compiler.h" #include "libpspp/message.h" #include "libpspp/misc.h" #include "libpspp/pool.h" #include "libpspp/str.h" #include "gl/xalloc.h" #include "gettext.h" #define _(msgid) gettext (msgid) /* LOOP outputs a transformation that is executed only on the first pass through the loop. On this trip, it initializes for the first pass by resetting the pass number, setting up the indexing clause, and testing the LOOP IF clause. If the loop is not to be entered at all, it jumps forward just past the END LOOP transformation; otherwise, it continues to the transformation following LOOP. END LOOP outputs a transformation that executes at the end of each trip through the loop. It checks the END LOOP IF clause, then updates the pass number, increments the indexing clause, and tests the LOOP IF clause. If another pass through the loop is due, it jumps backward to just after the LOOP transformation; otherwise, it continues to the transformation following END LOOP. */ struct loop_trns { struct pool *pool; struct dataset *ds; /* Iteration limit. */ int max_pass_count; /* Maximum number of passes (-1=unlimited). */ int pass; /* Number of passes through the loop so far. */ /* a=a TO b [BY c]. */ struct variable *index_var; /* Index variable. */ struct expression *first_expr; /* Starting index. */ struct expression *by_expr; /* Index increment (default 1.0 if null). */ struct expression *last_expr; /* Terminal index. */ double cur, by, last; /* Current value, increment, last value. */ /* IF condition for LOOP or END LOOP. */ struct expression *loop_condition; struct expression *end_loop_condition; /* Transformation indexes. */ int past_LOOP_index; /* Just past LOOP transformation. */ int past_END_LOOP_index; /* Just past END LOOP transformation. */ }; static const struct ctl_class loop_class; static trns_finalize_func loop_trns_finalize; static trns_proc_func loop_trns_proc, end_loop_trns_proc, break_trns_proc; static trns_free_func loop_trns_free; static struct loop_trns *create_loop_trns (struct dataset *); static bool parse_if_clause (struct lexer *, struct loop_trns *, struct expression **); static bool parse_index_clause (struct dataset *, struct lexer *, struct loop_trns *, bool *created_index_var); static void close_loop (void *); /* LOOP. */ /* Parses LOOP. */ int cmd_loop (struct lexer *lexer, struct dataset *ds) { struct loop_trns *loop; bool created_index_var = false; bool ok = true; loop = create_loop_trns (ds); while (lex_token (lexer) != T_ENDCMD && ok) { if (lex_match_id (lexer, "IF")) ok = parse_if_clause (lexer, loop, &loop->loop_condition); else ok = parse_index_clause (ds, lexer, loop, &created_index_var); } /* Clean up if necessary. */ if (!ok) { loop->max_pass_count = 0; if (loop->index_var != NULL && created_index_var) { dict_delete_var (dataset_dict (ds), loop->index_var); loop->index_var = NULL; } } return ok ? CMD_SUCCESS : CMD_CASCADING_FAILURE; } /* Parses END LOOP. */ int cmd_end_loop (struct lexer *lexer, struct dataset *ds) { struct loop_trns *loop; bool ok = true; loop = ctl_stack_top (&loop_class); if (loop == NULL) return CMD_CASCADING_FAILURE; assert (loop->ds == ds); /* Parse syntax. */ if (lex_match_id (lexer, "IF")) ok = parse_if_clause (lexer, loop, &loop->end_loop_condition); if (ok) ok = lex_end_of_command (lexer) == CMD_SUCCESS; if (!ok) loop->max_pass_count = 0; ctl_stack_pop (loop); return ok ? CMD_SUCCESS : CMD_FAILURE; } /* Parses BREAK. */ int cmd_break (struct lexer *lexer UNUSED, struct dataset *ds) { struct ctl_stmt *loop = ctl_stack_search (&loop_class); if (loop == NULL) return CMD_CASCADING_FAILURE; add_transformation (ds, break_trns_proc, NULL, loop); return CMD_SUCCESS; } /* Closes a LOOP construct by emitting the END LOOP transformation and finalizing its members appropriately. */ static void close_loop (void *loop_) { struct loop_trns *loop = loop_; add_transformation (loop->ds, end_loop_trns_proc, NULL, loop); loop->past_END_LOOP_index = next_transformation (loop->ds); /* If there's nothing else limiting the number of loops, use MXLOOPS as a limit. */ if (loop->max_pass_count == -1 && loop->index_var == NULL) loop->max_pass_count = settings_get_mxloops (); } /* Parses an IF clause for LOOP or END LOOP and stores the resulting expression to *CONDITION. Returns true if successful, false on failure. */ static bool parse_if_clause (struct lexer *lexer, struct loop_trns *loop, struct expression **condition) { if (*condition != NULL) { lex_sbc_only_once ("IF"); return false; } *condition = expr_parse_pool (lexer, loop->pool, loop->ds, EXPR_BOOLEAN); return *condition != NULL; } /* Parses an indexing clause into LOOP. Stores true in *CREATED_INDEX_VAR if the index clause created a new variable, false otherwise. Returns true if successful, false on failure. */ static bool parse_index_clause (struct dataset *ds, struct lexer *lexer, struct loop_trns *loop, bool *created_index_var) { if (loop->index_var != NULL) { msg (SE, _("Only one index clause may be specified.")); return false; } if (lex_token (lexer) != T_ID) { lex_error (lexer, NULL); return false; } loop->index_var = dict_lookup_var (dataset_dict (ds), lex_tokcstr (lexer)); if (loop->index_var != NULL) *created_index_var = false; else { loop->index_var = dict_create_var_assert (dataset_dict (ds), lex_tokcstr (lexer), 0); *created_index_var = true; } lex_get (lexer); if (!lex_force_match (lexer, T_EQUALS)) return false; loop->first_expr = expr_parse_pool (lexer, loop->pool, loop->ds, EXPR_NUMBER); if (loop->first_expr == NULL) return false; for (;;) { struct expression **e; if (lex_match (lexer, T_TO)) e = &loop->last_expr; else if (lex_match (lexer, T_BY)) e = &loop->by_expr; else break; if (*e != NULL) { lex_sbc_only_once (e == &loop->last_expr ? "TO" : "BY"); return false; } *e = expr_parse_pool (lexer, loop->pool, loop->ds, EXPR_NUMBER); if (*e == NULL) return false; } if (loop->last_expr == NULL) { lex_sbc_missing ("TO"); return false; } if (loop->by_expr == NULL) loop->by = 1.0; return true; } /* Creates, initializes, and returns a new loop_trns. */ static struct loop_trns * create_loop_trns (struct dataset *ds) { struct loop_trns *loop = pool_create_container (struct loop_trns, pool); loop->max_pass_count = -1; loop->pass = 0; loop->index_var = NULL; loop->first_expr = loop->by_expr = loop->last_expr = NULL; loop->loop_condition = loop->end_loop_condition = NULL; loop->ds = ds; add_transformation_with_finalizer (ds, loop_trns_finalize, loop_trns_proc, loop_trns_free, loop); loop->past_LOOP_index = next_transformation (ds); ctl_stack_push (&loop_class, loop); return loop; } /* Finalizes LOOP by clearing the control stack, thus ensuring that all open LOOPs are closed. */ static void loop_trns_finalize (void *do_if_ UNUSED) { /* This will be called multiple times if multiple LOOPs were executed, which is slightly unclean, but at least it's idempotent. */ ctl_stack_clear (); } /* Sets up LOOP for the first pass. */ static int loop_trns_proc (void *loop_, struct ccase **c, casenumber case_num) { struct loop_trns *loop = loop_; if (loop->index_var != NULL) { /* Evaluate loop index expressions. */ loop->cur = expr_evaluate_num (loop->first_expr, *c, case_num); if (loop->by_expr != NULL) loop->by = expr_evaluate_num (loop->by_expr, *c, case_num); loop->last = expr_evaluate_num (loop->last_expr, *c, case_num); /* Even if the loop is never entered, set the index variable to the initial value. */ *c = case_unshare (*c); case_data_rw (*c, loop->index_var)->f = loop->cur; /* Throw out pathological cases. */ if (!isfinite (loop->cur) || !isfinite (loop->by) || !isfinite (loop->last) || loop->by == 0.0 || (loop->by > 0.0 && loop->cur > loop->last) || (loop->by < 0.0 && loop->cur < loop->last)) goto zero_pass; } /* Initialize pass count. */ loop->pass = 0; if (loop->max_pass_count >= 0 && loop->pass >= loop->max_pass_count) goto zero_pass; /* Check condition. */ if (loop->loop_condition != NULL && expr_evaluate_num (loop->loop_condition, *c, case_num) != 1.0) goto zero_pass; return loop->past_LOOP_index; zero_pass: return loop->past_END_LOOP_index; } /* Frees LOOP. */ static bool loop_trns_free (void *loop_) { struct loop_trns *loop = loop_; pool_destroy (loop->pool); return true; } /* Finishes a pass through the loop and starts the next. */ static int end_loop_trns_proc (void *loop_, struct ccase **c, casenumber case_num UNUSED) { struct loop_trns *loop = loop_; if (loop->end_loop_condition != NULL && expr_evaluate_num (loop->end_loop_condition, *c, case_num) != 0.0) goto break_out; /* MXLOOPS limiter. */ if (loop->max_pass_count >= 0 && ++loop->pass >= loop->max_pass_count) goto break_out; /* Indexing clause limiter: counting downward. */ if (loop->index_var != NULL) { loop->cur += loop->by; if ((loop->by > 0.0 && loop->cur > loop->last) || (loop->by < 0.0 && loop->cur < loop->last)) goto break_out; *c = case_unshare (*c); case_data_rw (*c, loop->index_var)->f = loop->cur; } if (loop->loop_condition != NULL && expr_evaluate_num (loop->loop_condition, *c, case_num) != 1.0) goto break_out; return loop->past_LOOP_index; break_out: return loop->past_END_LOOP_index; } /* Executes BREAK. */ static int break_trns_proc (void *loop_, struct ccase **c UNUSED, casenumber case_num UNUSED) { struct loop_trns *loop = loop_; return loop->past_END_LOOP_index; } /* LOOP control structure class definition. */ static const struct ctl_class loop_class = { "LOOP", "END LOOP", close_loop, }; pspp-1.4.1/src/language/control/temporary.c0000644000175000017500000000301313602034551020327 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 1997-9, 2000, 2010, 2011 Free Software Foundation, Inc. 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 3 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, see . */ #include #include #include "data/dataset.h" #include "data/dictionary.h" #include "data/transformations.h" #include "data/value-labels.h" #include "data/variable.h" #include "language/command.h" #include "language/control/control-stack.h" #include "language/lexer/lexer.h" #include "libpspp/message.h" #include "libpspp/str.h" #include "gl/xalloc.h" #include "gettext.h" #define _(msgid) gettext (msgid) /* Parses the TEMPORARY command. */ int cmd_temporary (struct lexer *lexer UNUSED, struct dataset *ds) { if (!proc_in_temporary_transformations (ds)) proc_start_temporary_transformations (ds); else msg (SE, _("This command may only appear once between " "procedures and procedure-like commands.")); return CMD_SUCCESS; } pspp-1.4.1/src/language/control/control-stack.h0000644000175000017500000000314513320146056021104 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 1997-9, 2000, 2011 Free Software Foundation, Inc. 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 3 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, see . */ #ifndef CTL_STACK_H #define CTL_STACK_H 1 #include /* The following #include avoids a potential problem when Gnulib substitutes * for close() by putting "#define close rpl_close" into , by * ensuring that every source file that includes this one sees the #define.. * (It would probably be better to rename the 'close' member of struct * ctl_class.) */ #include struct ctl_class { const char *start_name; /* e.g. LOOP. */ const char *end_name; /* e.g. END LOOP. */ void (*close) (void *); /* Closes the control structure. */ }; void ctl_stack_clear (void); void ctl_stack_push (const struct ctl_class *, void *private); void *ctl_stack_top (const struct ctl_class *); void *ctl_stack_search (const struct ctl_class *); void ctl_stack_pop (void *); bool ctl_stack_is_empty (void); #endif /* ctl_stack.h */ pspp-1.4.1/src/language/control/do-if.c0000644000175000017500000001766513320146056017326 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 1997-9, 2000, 2009-2012 Free Software Foundation, Inc. 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 3 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, see . */ #include #include #include "data/case.h" #include "data/dataset.h" #include "data/transformations.h" #include "data/value.h" #include "language/command.h" #include "language/control/control-stack.h" #include "language/expressions/public.h" #include "language/lexer/lexer.h" #include "libpspp/compiler.h" #include "libpspp/message.h" #include "libpspp/str.h" #include "gl/xalloc.h" #include "gettext.h" #define _(msgid) gettext (msgid) /* DO IF, ELSE IF, and ELSE are translated as a single transformation that evaluates each condition and jumps to the start of the appropriate block of transformations. Each block of transformations (except for the last) ends with a transformation that jumps past the remaining blocks. So, the following code: DO IF a. ...block 1... ELSE IF b. ...block 2... ELSE. ...block 3... END IF. is effectively translated like this: IF a GOTO 1, IF b GOTO 2, ELSE GOTO 3. 1: ...block 1... GOTO 4 2: ...block 2... GOTO 4 3: ...block 3... 4: */ /* A conditional clause. */ struct clause { struct expression *condition; /* Test expression; NULL for ELSE clause. */ int target_index; /* Transformation to jump to if true. */ }; /* DO IF transformation. */ struct do_if_trns { struct dataset *ds; /* The dataset */ struct clause *clauses; /* Clauses. */ size_t clause_cnt; /* Number of clauses. */ int past_END_IF_index; /* Transformation just past last clause. */ }; static const struct ctl_class do_if_class; static int parse_clause (struct lexer *, struct do_if_trns *, struct dataset *ds); static void add_clause (struct do_if_trns *, struct expression *condition); static void add_else (struct do_if_trns *); static bool has_else (struct do_if_trns *); static bool must_not_have_else (struct do_if_trns *); static void close_do_if (void *do_if); static trns_finalize_func do_if_finalize_func; static trns_proc_func do_if_trns_proc, break_trns_proc; static trns_free_func do_if_trns_free; /* Parse DO IF. */ int cmd_do_if (struct lexer *lexer, struct dataset *ds) { struct do_if_trns *do_if = xmalloc (sizeof *do_if); do_if->clauses = NULL; do_if->clause_cnt = 0; do_if->ds = ds; ctl_stack_push (&do_if_class, do_if); add_transformation_with_finalizer (ds, do_if_finalize_func, do_if_trns_proc, do_if_trns_free, do_if); return parse_clause (lexer, do_if, ds); } /* Parse ELSE IF. */ int cmd_else_if (struct lexer *lexer, struct dataset *ds) { struct do_if_trns *do_if = ctl_stack_top (&do_if_class); if (do_if == NULL || !must_not_have_else (do_if)) return CMD_CASCADING_FAILURE; return parse_clause (lexer, do_if, ds); } /* Parse ELSE. */ int cmd_else (struct lexer *lexer UNUSED, struct dataset *ds) { struct do_if_trns *do_if = ctl_stack_top (&do_if_class); if (do_if == NULL || !must_not_have_else (do_if)) return CMD_CASCADING_FAILURE; assert (ds == do_if->ds); add_else (do_if); return CMD_SUCCESS; } /* Parse END IF. */ int cmd_end_if (struct lexer *lexer UNUSED, struct dataset *ds) { struct do_if_trns *do_if = ctl_stack_top (&do_if_class); if (do_if == NULL) return CMD_CASCADING_FAILURE; assert (ds == do_if->ds); ctl_stack_pop (do_if); return CMD_SUCCESS; } /* Closes out DO_IF, by adding a sentinel ELSE clause if necessary and setting past_END_IF_index. */ static void close_do_if (void *do_if_) { struct do_if_trns *do_if = do_if_; if (!has_else (do_if)) add_else (do_if); do_if->past_END_IF_index = next_transformation (do_if->ds); } /* Adds an ELSE clause to DO_IF pointing to the next transformation. */ static void add_else (struct do_if_trns *do_if) { assert (!has_else (do_if)); add_clause (do_if, NULL); } /* Returns true if DO_IF does not yet have an ELSE clause. Reports an error and returns false if it does already. */ static bool must_not_have_else (struct do_if_trns *do_if) { if (has_else (do_if)) { msg (SE, _("This command may not follow %s in %s ... %s."), "ELSE", "DO IF", "END IF"); return false; } else return true; } /* Returns true if DO_IF already has an ELSE clause, false otherwise. */ static bool has_else (struct do_if_trns *do_if) { return (do_if->clause_cnt != 0 && do_if->clauses[do_if->clause_cnt - 1].condition == NULL); } /* Parses a DO IF or ELSE IF expression and appends the corresponding clause to DO_IF. Checks for end of command and returns a command return code. */ static int parse_clause (struct lexer *lexer, struct do_if_trns *do_if, struct dataset *ds) { struct expression *condition; condition = expr_parse (lexer, ds, EXPR_BOOLEAN); if (condition == NULL) return CMD_CASCADING_FAILURE; add_clause (do_if, condition); return CMD_SUCCESS; } /* Adds a clause to DO_IF that tests for the given CONDITION and, if true, jumps to the set of transformations produced by following commands. */ static void add_clause (struct do_if_trns *do_if, struct expression *condition) { struct clause *clause; if (do_if->clause_cnt > 0) add_transformation (do_if->ds, break_trns_proc, NULL, do_if); do_if->clauses = xnrealloc (do_if->clauses, do_if->clause_cnt + 1, sizeof *do_if->clauses); clause = &do_if->clauses[do_if->clause_cnt++]; clause->condition = condition; clause->target_index = next_transformation (do_if->ds); } /* Finalizes DO IF by clearing the control stack, thus ensuring that all open DO IFs are closed. */ static void do_if_finalize_func (void *do_if_ UNUSED) { /* This will be called multiple times if multiple DO IFs were executed, which is slightly unclean, but at least it's idempotent. */ ctl_stack_clear (); } /* DO IF transformation procedure. Checks each clause and jumps to the appropriate transformation. */ static int do_if_trns_proc (void *do_if_, struct ccase **c, casenumber case_num UNUSED) { struct do_if_trns *do_if = do_if_; struct clause *clause; for (clause = do_if->clauses; clause < do_if->clauses + do_if->clause_cnt; clause++) { if (clause->condition != NULL) { double boolean = expr_evaluate_num (clause->condition, *c, case_num); if (boolean == 1.0) return clause->target_index; else if (boolean == SYSMIS) return do_if->past_END_IF_index; } else return clause->target_index; } return do_if->past_END_IF_index; } /* Frees a DO IF transformation. */ static bool do_if_trns_free (void *do_if_) { struct do_if_trns *do_if = do_if_; struct clause *clause; for (clause = do_if->clauses; clause < do_if->clauses + do_if->clause_cnt; clause++) expr_free (clause->condition); free (do_if->clauses); free (do_if); return true; } /* Breaks out of a DO IF construct. */ static int break_trns_proc (void *do_if_, struct ccase **c UNUSED, casenumber case_num UNUSED) { struct do_if_trns *do_if = do_if_; return do_if->past_END_IF_index; } /* DO IF control structure class definition. */ static const struct ctl_class do_if_class = { "DO IF", "END IF", close_do_if, }; pspp-1.4.1/src/language/control/control-stack.c0000644000175000017500000000534113571051220021073 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2017 Free Software Foundation, Inc. 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 3 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, see . */ #include #include "language/control/control-stack.h" #include #include #include "libpspp/compiler.h" #include "libpspp/message.h" #include "gl/xalloc.h" #include "gettext.h" #define _(msgid) gettext (msgid) struct ctl_struct { const struct ctl_class *class; /* Class of control structure. */ struct ctl_struct *down; /* Points toward the bottom of ctl_stack. */ void *private; /* Private data. */ }; static struct ctl_struct *ctl_stack; void ctl_stack_clear (void) { while (ctl_stack != NULL) { struct ctl_struct *top = ctl_stack; msg (SE, _("%s without %s."), top->class->start_name, top->class->end_name); ctl_stack_pop (top->private); } } void ctl_stack_push (const struct ctl_class *class, void *private) { struct ctl_struct *ctl; assert (private != NULL); ctl = xmalloc (sizeof *ctl); ctl->class = class; ctl->down = ctl_stack; ctl->private = private; ctl_stack = ctl; } void * ctl_stack_top (const struct ctl_class *class) { struct ctl_struct *top = ctl_stack; if (top != NULL && top->class == class) return top->private; else { if (ctl_stack_search (class) != NULL) msg (SE, _("This command must appear inside %s...%s, " "without intermediate %s...%s."), class->start_name, class->end_name, top->class->start_name, top->class->end_name); return NULL; } } void * ctl_stack_search (const struct ctl_class *class) { struct ctl_struct *ctl; for (ctl = ctl_stack; ctl != NULL; ctl = ctl->down) if (ctl->class == class) return ctl->private; msg (SE, _("This command cannot appear outside %s...%s."), class->start_name, class->end_name); return NULL; } void ctl_stack_pop (void *private) { struct ctl_struct *top = ctl_stack; assert (top != NULL); assert (top->private == private); top->class->close (top->private); ctl_stack = top->down; free (top); } bool ctl_stack_is_empty (void) { return ctl_stack == NULL; } pspp-1.4.1/src/language/data-io/0000755000175000017500000000000013725012647016012 5ustar00blpblp00000000000000pspp-1.4.1/src/language/data-io/matrix-reader.c0000644000175000017500000001740613700645725020734 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2017, 2019 Free Software Foundation, Inc. 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 3 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, see . */ #include #include "matrix-reader.h" #include #include #include #include #include #include #include #include #include #include "gettext.h" #define _(msgid) gettext (msgid) #define N_(msgid) msgid /* This module interprets a "data matrix", typically generated by the command MATRIX DATA. The dictionary of such a matrix takes the form: s_0, s_1, ... s_m, ROWTYPE_, VARNAME_, v_0, v_1, .... v_n where s_0, s_1 ... s_m are the variables defining the splits, and v_0, v_1 ... v_n are the continuous variables. m >= 0; n >= 0 The ROWTYPE_ variable is of type A8. The VARNAME_ variable is a string type whose width is not predetermined. The variables s_x are of type F4.0 (although this reader accepts any type), and v_x are of any numeric type. The values of the ROWTYPE_ variable are in the set {MEAN, STDDEV, N, CORR, COV} and determine the purpose of that case. The values of the VARNAME_ variable must correspond to the names of the varibles in {v_0, v_1 ... v_n} and indicate the rows of the correlation or covariance matrices. A typical example is as follows: s_0 ROWTYPE_ VARNAME_ v_0 v_1 v_2 0 MEAN 5.0000 4.0000 3.0000 0 STDDEV 1.0000 2.0000 3.0000 0 N 9.0000 9.0000 9.0000 0 CORR V1 1.0000 .6000 .7000 0 CORR V2 .6000 1.0000 .8000 0 CORR V3 .7000 .8000 1.0000 1 MEAN 9.0000 8.0000 7.0000 1 STDDEV 5.0000 6.0000 7.0000 1 N 9.0000 9.0000 9.0000 1 CORR V1 1.0000 .4000 .3000 1 CORR V2 .4000 1.0000 .2000 1 CORR V3 .3000 .2000 1.0000 */ struct matrix_reader { const struct dictionary *dict; const struct variable *varname; const struct variable *rowtype; struct casegrouper *grouper; gsl_matrix *n_vectors; gsl_matrix *mean_vectors; gsl_matrix *var_vectors; }; struct matrix_reader * create_matrix_reader_from_case_reader (const struct dictionary *dict, struct casereader *in_reader, const struct variable ***vars, size_t *n_vars) { struct matrix_reader *mr = xzalloc (sizeof *mr); mr->varname = dict_lookup_var (dict, "varname_"); mr->dict = dict; if (mr->varname == NULL) { msg (ME, _("Matrix dataset lacks a variable called %s."), "VARNAME_"); free (mr); return NULL; } if (!var_is_alpha (mr->varname)) { msg (ME, _("Matrix dataset variable %s should be of string type."), "VARNAME_"); free (mr); return NULL; } mr->rowtype = dict_lookup_var (dict, "rowtype_"); if (mr->rowtype == NULL) { msg (ME, _("Matrix dataset lacks a variable called %s."), "ROWTYPE_"); free (mr); return NULL; } if (!var_is_alpha (mr->rowtype)) { msg (ME, _("Matrix dataset variable %s should be of string type."), "ROWTYPE_"); free (mr); return NULL; } size_t dvarcnt; const struct variable **dvars = NULL; dict_get_vars (dict, &dvars, &dvarcnt, DC_SCRATCH); if (n_vars) *n_vars = dvarcnt - var_get_dict_index (mr->varname) - 1; if (vars) { int i; *vars = xcalloc (*n_vars, sizeof (struct variable **)); for (i = 0; i < *n_vars; ++i) { (*vars)[i] = dvars[i + var_get_dict_index (mr->varname) + 1]; } } /* All the variables before ROWTYPE_ (if any) are split variables */ mr->grouper = casegrouper_create_vars (in_reader, dvars, var_get_dict_index (mr->rowtype)); free (dvars); return mr; } bool destroy_matrix_reader (struct matrix_reader *mr) { if (mr == NULL) return false; bool ret = casegrouper_destroy (mr->grouper); free (mr); return ret; } /* Allocates MATRIX if necessary, and populates row MROW, from the data in C corresponding to variables in VARS. N_VARS is the length of VARS. */ static void matrix_fill_row (gsl_matrix **matrix, const struct ccase *c, int mrow, const struct variable **vars, size_t n_vars) { int col; if (*matrix == NULL) *matrix = gsl_matrix_alloc (n_vars, n_vars); for (col = 0; col < n_vars; ++col) { const struct variable *cv = vars [col]; double x = case_data (c, cv)->f; assert (col < (*matrix)->size2); assert (mrow < (*matrix)->size1); gsl_matrix_set (*matrix, mrow, col, x); } } bool next_matrix_from_reader (struct matrix_material *mm, struct matrix_reader *mr, const struct variable **vars, int n_vars) { struct casereader *group; assert (vars); gsl_matrix_free (mr->n_vectors); gsl_matrix_free (mr->mean_vectors); gsl_matrix_free (mr->var_vectors); if (!casegrouper_get_next_group (mr->grouper, &group)) return false; mr->n_vectors = gsl_matrix_alloc (n_vars, n_vars); mr->mean_vectors = gsl_matrix_alloc (n_vars, n_vars); mr->var_vectors = gsl_matrix_alloc (n_vars, n_vars); mm->n = mr->n_vectors; mm->mean_matrix = mr->mean_vectors; mm->var_matrix = mr->var_vectors; struct substring *var_names = XCALLOC (n_vars, struct substring); for (int i = 0; i < n_vars; ++i) { ss_alloc_substring (var_names + i, ss_cstr (var_get_name (vars[i]))); } struct ccase *c; for (; (c = casereader_read (group)); case_unref (c)) { const union value *uv = case_data (c, mr->rowtype); const char *row_type = CHAR_CAST (const char *, uv->s); int col, row; for (col = 0; col < n_vars; ++col) { const struct variable *cv = vars[col]; double x = case_data (c, cv)->f; if (0 == strncasecmp (row_type, "N ", 8)) for (row = 0; row < n_vars; ++row) gsl_matrix_set (mr->n_vectors, row, col, x); else if (0 == strncasecmp (row_type, "MEAN ", 8)) for (row = 0; row < n_vars; ++row) gsl_matrix_set (mr->mean_vectors, row, col, x); else if (0 == strncasecmp (row_type, "STDDEV ", 8)) for (row = 0; row < n_vars; ++row) gsl_matrix_set (mr->var_vectors, row, col, x * x); } const char *enc = dict_get_encoding (mr->dict); const union value *uvv = case_data (c, mr->varname); int w = var_get_width (mr->varname); struct fmt_spec fmt = {FMT_A, 0, 0}; fmt.w = w; char *vname = data_out (uvv, enc, &fmt); struct substring the_name = ss_cstr (vname); int mrow = -1; for (int i = 0; i < n_vars; ++i) { if (ss_equals (var_names[i], the_name)) { mrow = i; break; } } free (vname); if (mrow == -1) continue; if (0 == strncasecmp (row_type, "CORR ", 8)) { matrix_fill_row (&mm->corr, c, mrow, vars, n_vars); } else if (0 == strncasecmp (row_type, "COV ", 8)) { matrix_fill_row (&mm->cov, c, mrow, vars, n_vars); } } casereader_destroy (group); for (int i = 0; i < n_vars; ++i) ss_dealloc (var_names + i); free (var_names); return true; } pspp-1.4.1/src/language/data-io/list.c0000644000175000017500000001635113670210420017123 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 1997-9, 2000, 2006, 2009-2011, 2013, 2014, 2016 Free Software Foundation, Inc. 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 3 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, see . */ #include #include #include #include #include "data/casegrouper.h" #include "data/casereader.h" #include "data/dataset.h" #include "data/dictionary.h" #include "data/data-out.h" #include "data/format.h" #include "data/subcase.h" #include "data/variable.h" #include "language/command.h" #include "language/dictionary/split-file.h" #include "language/lexer/lexer.h" #include "language/lexer/variable-parser.h" #include "libpspp/compiler.h" #include "libpspp/ll.h" #include "libpspp/message.h" #include "libpspp/misc.h" #include "output/pivot-table.h" #include "output/table-item.h" #include "gl/intprops.h" #include "gl/minmax.h" #include "gl/xalloc.h" #include "gl/xmalloca.h" #include "gettext.h" #define N_(msgid) msgid #define _(msgid) gettext (msgid) enum numbering { format_unnumbered, format_numbered }; struct lst_cmd { long first; long last; long step; const struct variable **v_variables; size_t n_variables; enum numbering numbering; }; static int list_execute (const struct lst_cmd *lcmd, struct dataset *ds) { const struct dictionary *dict = dataset_dict (ds); bool ok; int i; struct casegrouper *grouper; struct casereader *group; struct subcase sc; subcase_init_empty (&sc); for (i = 0; i < lcmd->n_variables; i++) subcase_add_var (&sc, lcmd->v_variables[i], SC_ASCEND); grouper = casegrouper_create_splits (proc_open (ds), dict); while (casegrouper_get_next_group (grouper, &group)) { struct ccase *c = casereader_peek (group, 0); if (c != NULL) { output_split_file_values (ds, c); case_unref (c); } group = casereader_project (group, &sc); group = casereader_select (group, lcmd->first - 1, (lcmd->last != LONG_MAX ? lcmd->last : CASENUMBER_MAX), lcmd->step); struct pivot_table *table = pivot_table_create (N_("Data List")); table->show_values = table->show_variables = SETTINGS_VALUE_SHOW_VALUE; struct pivot_dimension *variables = pivot_dimension_create ( table, PIVOT_AXIS_COLUMN, N_("Variables")); for (int i = 0; i < lcmd->n_variables; i++) pivot_category_create_leaf ( variables->root, pivot_value_new_variable (lcmd->v_variables[i])); struct pivot_dimension *cases = pivot_dimension_create ( table, PIVOT_AXIS_ROW, N_("Case Number")); if (lcmd->numbering == format_numbered) cases->root->show_label = true; else cases->hide_all_labels = true; casenumber case_num = lcmd->first; for (; (c = casereader_read (group)) != NULL; case_unref (c)) { int case_idx = pivot_category_create_leaf ( cases->root, pivot_value_new_integer (case_num)); case_num += lcmd->step; for (int i = 0; i < lcmd->n_variables; i++) pivot_table_put2 (table, i, case_idx, pivot_value_new_var_value ( lcmd->v_variables[i], case_data_idx (c, i))); } casereader_destroy (group); pivot_table_submit (table); } ok = casegrouper_destroy (grouper); ok = proc_commit (ds) && ok; subcase_destroy (&sc); free (lcmd->v_variables); return ok ? CMD_SUCCESS : CMD_CASCADING_FAILURE; } /* Parses and executes the LIST procedure. */ int cmd_list (struct lexer *lexer, struct dataset *ds) { struct lst_cmd cmd; const struct dictionary *dict = dataset_dict (ds); /* Fill in defaults. */ cmd.step = 1; cmd.first = 1; cmd.last = LONG_MAX; cmd.n_variables = 0; cmd.v_variables = NULL; cmd.numbering = format_unnumbered; while (lex_token (lexer) != T_ENDCMD) { lex_match (lexer, T_SLASH); if (lex_match_id (lexer, "VARIABLES")) { lex_match (lexer, T_EQUALS); if (! parse_variables_const (lexer, dict, &cmd.v_variables, &cmd.n_variables, 0)) { msg (SE, _("No variables specified.")); return CMD_FAILURE; } } else if (lex_match_id (lexer, "FORMAT")) { lex_match (lexer, T_EQUALS); if (lex_match_id (lexer, "NUMBERED")) { cmd.numbering = format_numbered; } else if (lex_match_id (lexer, "UNNUMBERED")) { cmd.numbering = format_unnumbered; } else { lex_error (lexer, NULL); goto error; } } /* example: LIST /CASES=FROM 1 TO 25 BY 5. */ else if (lex_match_id (lexer, "CASES")) { lex_match (lexer, T_EQUALS); if (lex_match_id (lexer, "FROM") && lex_force_int (lexer)) { cmd.first = lex_integer (lexer); lex_get (lexer); } if ((lex_match (lexer, T_TO) && lex_force_int (lexer)) || lex_is_integer (lexer)) { cmd.last = lex_integer (lexer); lex_get (lexer); } if (lex_match (lexer, T_BY) && lex_force_int (lexer)) { cmd.step = lex_integer (lexer); lex_get (lexer); } } else if (! parse_variables_const (lexer, dict, &cmd.v_variables, &cmd.n_variables, 0)) { return CMD_FAILURE; } } /* Verify arguments. */ if (cmd.first > cmd.last) { int t; msg (SW, _("The first case (%ld) specified precedes the last case (%ld) " "specified. The values will be swapped."), cmd.first, cmd.last); t = cmd.first; cmd.first = cmd.last; cmd.last = t; } if (cmd.first < 1) { msg (SW, _("The first case (%ld) to list is numbered less than 1. " "The value is being reset to 1."), cmd.first); cmd.first = 1; } if (cmd.last < 1) { msg (SW, _("The last case (%ld) to list is numbered less than 1. " "The value is being reset to 1."), cmd.last); cmd.last = 1; } if (cmd.step < 1) { msg (SW, _("The step value %ld is less than 1. The value is being " "reset to 1."), cmd.step); cmd.step = 1; } /* If no variables were explicitly provided, then default to ALL */ if (cmd.n_variables == 0) dict_get_vars (dict, &cmd.v_variables, &cmd.n_variables, DC_SYSTEM | DC_SCRATCH); return list_execute (&cmd, ds); error: free (cmd.v_variables); return CMD_FAILURE; } pspp-1.4.1/src/language/data-io/data-reader.c0000644000175000017500000005174513670210420020327 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 1997-2004, 2006, 2010, 2011, 2012, 2016 Free Software Foundation, Inc. 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 3 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, see . */ #include #include "language/data-io/data-reader.h" #include #include #include #include #include #include "data/casereader.h" #include "data/dataset.h" #include "data/file-handle-def.h" #include "data/file-name.h" #include "language/command.h" #include "language/data-io/file-handle.h" #include "language/lexer/lexer.h" #include "libpspp/assertion.h" #include "libpspp/cast.h" #include "libpspp/encoding-guesser.h" #include "libpspp/integer-format.h" #include "libpspp/line-reader.h" #include "libpspp/message.h" #include "libpspp/str.h" #include "gl/minmax.h" #include "gl/xalloc.h" #include "gettext.h" #define _(msgid) gettext (msgid) #define N_(msgid) (msgid) /* Flags for DFM readers. */ enum dfm_reader_flags { DFM_ADVANCE = 002, /* Read next line on dfm_get_record() call? */ DFM_SAW_BEGIN_DATA = 004, /* For inline_file only, whether we've already read a BEGIN DATA line. */ DFM_TABS_EXPANDED = 010, /* Tabs have been expanded. */ DFM_CONSUME = 020 /* read_inline_record() should get a token? */ }; /* Data file reader. */ struct dfm_reader { struct file_handle *fh; /* File handle. */ struct fh_lock *lock; /* Mutual exclusion lock for file. */ int line_number; /* Current line or record number. */ struct string line; /* Current line. */ struct string scratch; /* Extra line buffer. */ enum dfm_reader_flags flags; /* Zero or more of DFM_*. */ FILE *file; /* Associated file. */ size_t pos; /* Offset in line of current character. */ unsigned eof_cnt; /* # of attempts to advance past EOF. */ struct lexer *lexer; /* The lexer reading the file */ char *encoding; /* Current encoding. */ /* For FH_MODE_TEXT only. */ struct line_reader *line_reader; /* For FH_MODE_360_VARIABLE and FH_MODE_360_SPANNED files only. */ size_t block_left; /* Bytes left in current block. */ }; /* Closes reader R opened by dfm_open_reader(). */ void dfm_close_reader (struct dfm_reader *r) { if (r == NULL) return; if (fh_unlock (r->lock)) { /* File is still locked by another client. */ return; } /* This was the last client, so close the underlying file. */ if (fh_get_referent (r->fh) != FH_REF_INLINE) fn_close (r->fh, r->file); else { /* Skip any remaining data on the inline file. */ if (r->flags & DFM_SAW_BEGIN_DATA) { dfm_reread_record (r, 0); while (!dfm_eof (r)) dfm_forward_record (r); } } line_reader_free (r->line_reader); free (r->encoding); fh_unref (r->fh); ds_destroy (&r->line); ds_destroy (&r->scratch); free (r); } /* Opens the file designated by file handle FH for reading as a data file. Returns a reader if successful, or a null pointer otherwise. If FH is fh_inline_file() then the new reader reads data included inline in the command file between BEGIN FILE and END FILE, obtaining data from LEXER. LEXER must remain valid as long as the new reader is in use. ENCODING is ignored. If FH is not fh_inline_file(), then the encoding of the file read is by default that of FH itself. If ENCODING is nonnull, then it overrides the default encoding. LEXER is ignored. */ struct dfm_reader * dfm_open_reader (struct file_handle *fh, struct lexer *lexer, const char *encoding) { struct dfm_reader *r; struct fh_lock *lock; /* TRANSLATORS: this fragment will be interpolated into messages in fh_lock() that identify types of files. */ lock = fh_lock (fh, FH_REF_FILE | FH_REF_INLINE, N_("data file"), FH_ACC_READ, false); if (lock == NULL) return NULL; r = fh_lock_get_aux (lock); if (r != NULL) return r; r = xmalloc (sizeof *r); r->fh = fh_ref (fh); r->lock = lock; r->lexer = lexer; ds_init_empty (&r->line); ds_init_empty (&r->scratch); r->flags = DFM_ADVANCE; r->eof_cnt = 0; r->block_left = 0; if (fh_get_referent (fh) != FH_REF_INLINE) { r->line_number = 0; r->file = fn_open (fh, "rb"); if (r->file == NULL) { msg (ME, _("Could not open `%s' for reading as a data file: %s."), fh_get_file_name (r->fh), strerror (errno)); goto error; } } fh_lock_set_aux (lock, r); if (encoding == NULL) encoding = fh_get_encoding (fh); if (fh_get_referent (fh) == FH_REF_FILE && fh_get_mode (fh) == FH_MODE_TEXT) { r->line_reader = line_reader_for_fd (encoding, fileno (r->file)); if (r->line_reader == NULL) { msg (ME, _("Could not read `%s' as a text file with encoding `%s': " "%s."), fh_get_file_name (r->fh), encoding, strerror (errno)); goto error; } r->encoding = xstrdup (line_reader_get_encoding (r->line_reader)); } else { r->line_reader = NULL; r->encoding = xstrdup (encoding_guess_parse_encoding (encoding)); } return r; error: fh_unlock (r->lock); fh_unref (fh); free (r); return NULL; } /* Returns true if an I/O error occurred on READER, false otherwise. */ bool dfm_reader_error (const struct dfm_reader *r) { return (fh_get_referent (r->fh) == FH_REF_FILE && (r->line_reader != NULL ? line_reader_error (r->line_reader) != 0 : ferror (r->file))); } /* Reads a record from the inline file into R. Returns true if successful, false on failure. */ static bool read_inline_record (struct dfm_reader *r) { if ((r->flags & DFM_SAW_BEGIN_DATA) == 0) { r->flags |= DFM_SAW_BEGIN_DATA; r->flags &= ~DFM_CONSUME; while (lex_token (r->lexer) == T_ENDCMD) lex_get (r->lexer); if (!lex_force_match_id (r->lexer, "BEGIN") || !lex_force_match_id (r->lexer, "DATA")) return false; lex_match (r->lexer, T_ENDCMD); } if (r->flags & DFM_CONSUME) lex_get (r->lexer); if (!lex_is_string (r->lexer)) { if (!lex_match_id (r->lexer, "END") || !lex_match_id (r->lexer, "DATA")) { msg (SE, _("Missing %s while reading inline data. " "This probably indicates a missing or incorrectly " "formatted %s command. %s must appear " "by itself on a single line with exactly one space " "between words."), "END DATA", "END DATA", "END DATA"); lex_discard_rest_of_command (r->lexer); } return false; } ds_assign_substring (&r->line, lex_tokss (r->lexer)); r->flags |= DFM_CONSUME; return true; } /* Report a read error on R. */ static void read_error (struct dfm_reader *r) { msg (ME, _("Error reading file %s: %s."), fh_get_name (r->fh), strerror (errno)); } /* Report a partial read at end of file reading R. */ static void partial_record (struct dfm_reader *r) { msg (ME, _("Unexpected end of file in partial record reading %s."), fh_get_name (r->fh)); } /* Tries to read SIZE bytes from R into BUFFER. Returns 1 if successful, 0 if end of file was reached before any bytes could be read, and -1 if some bytes were read but fewer than SIZE due to end of file or an error mid-read. In the latter case, reports an error. */ static int try_to_read_fully (struct dfm_reader *r, void *buffer, size_t size) { size_t bytes_read = fread (buffer, 1, size, r->file); if (bytes_read == size) return 1; else if (bytes_read == 0) return 0; else { partial_record (r); return -1; } } /* Type of a descriptor word. */ enum descriptor_type { BLOCK, RECORD }; /* Reads a block descriptor word or record descriptor word (according to TYPE) from R. Returns 1 if successful, 0 if end of file was reached before any bytes could be read, -1 if an error occurred. Reports an error in the latter case. If successful, stores the number of remaining bytes in the block or record (that is, the block or record length, minus the 4 bytes in the BDW or RDW itself) into *REMAINING_SIZE. If SEGMENT is nonnull, also stores the segment control character (SCC) into *SEGMENT. */ static int read_descriptor_word (struct dfm_reader *r, enum descriptor_type type, size_t *remaining_size, int *segment) { uint8_t raw_descriptor[4]; int status; status = try_to_read_fully (r, raw_descriptor, sizeof raw_descriptor); if (status <= 0) return status; *remaining_size = (raw_descriptor[0] << 8) | raw_descriptor[1]; if (segment != NULL) *segment = raw_descriptor[2]; if (*remaining_size < 4) { msg (ME, (type == BLOCK ? _("Corrupt block descriptor word at offset 0x%lx in %s.") : _("Corrupt record descriptor word at offset 0x%lx in %s.")), (long) ftello (r->file) - 4, fh_get_name (r->fh)); return -1; } *remaining_size -= 4; return 1; } /* Reports that reader R has read a corrupt record size. */ static void corrupt_size (struct dfm_reader *r) { msg (ME, _("Corrupt record size at offset 0x%lx in %s."), (long) ftello (r->file) - 4, fh_get_name (r->fh)); } /* Reads a 32-byte little-endian signed number from R and stores its value into *SIZE_OUT. Returns 1 if successful, 0 if end of file was reached before any bytes could be read, -1 if an error occurred. Reports an error in the latter case. Numbers less than 0 are considered errors. */ static int read_size (struct dfm_reader *r, size_t *size_out) { int32_t size; int status; status = try_to_read_fully (r, &size, sizeof size); if (status <= 0) return status; integer_convert (INTEGER_LSB_FIRST, &size, INTEGER_NATIVE, &size, sizeof size); if (size < 0) { corrupt_size (r); return -1; } *size_out = size; return 1; } static bool read_text_record (struct dfm_reader *r) { bool is_auto; bool ok; /* Read a line. If the line reader's encoding changes, update r->encoding to match. */ is_auto = line_reader_is_auto (r->line_reader); ok = line_reader_read (r->line_reader, &r->line, SIZE_MAX); if (is_auto && !line_reader_is_auto (r->line_reader)) { free (r->encoding); r->encoding = xstrdup (line_reader_get_encoding (r->line_reader)); } /* Detect and report read error. */ if (!ok) { int error = line_reader_error (r->line_reader); if (error != 0) msg (ME, _("Error reading file %s: %s."), fh_get_name (r->fh), strerror (error)); } return ok; } /* Reads a record from a disk file into R. Returns true if successful, false on error or at end of file. */ static bool read_file_record (struct dfm_reader *r) { assert (r->fh != fh_inline_file ()); ds_clear (&r->line); switch (fh_get_mode (r->fh)) { case FH_MODE_TEXT: return read_text_record (r); case FH_MODE_FIXED: if (ds_read_stream (&r->line, 1, fh_get_record_width (r->fh), r->file)) return true; else { if (ferror (r->file)) read_error (r); else if (!ds_is_empty (&r->line)) partial_record (r); return false; } case FH_MODE_VARIABLE: { size_t leading_size; size_t trailing_size; int status; /* Read leading record size. */ status = read_size (r, &leading_size); if (status <= 0) return false; /* Read record data. */ if (!ds_read_stream (&r->line, leading_size, 1, r->file)) { if (ferror (r->file)) read_error (r); else partial_record (r); return false; } /* Read trailing record size and check that it's the same as the leading record size. */ status = read_size (r, &trailing_size); if (status <= 0) { if (status == 0) partial_record (r); return false; } if (leading_size != trailing_size) { corrupt_size (r); return false; } return true; } case FH_MODE_360_VARIABLE: case FH_MODE_360_SPANNED: for (;;) { size_t record_size; int segment; int status; /* If we've exhausted our current block, start another one by reading the new block descriptor word. */ if (r->block_left == 0) { status = read_descriptor_word (r, BLOCK, &r->block_left, NULL); if (status < 0) return false; else if (status == 0) return !ds_is_empty (&r->line); } /* Read record descriptor. */ if (r->block_left < 4) { partial_record (r); return false; } r->block_left -= 4; status = read_descriptor_word (r, RECORD, &record_size, &segment); if (status <= 0) { if (status == 0) partial_record (r); return false; } if (record_size > r->block_left) { msg (ME, _("Record exceeds remaining block length.")); return false; } /* Read record data. */ if (!ds_read_stream (&r->line, record_size, 1, r->file)) { if (ferror (r->file)) read_error (r); else partial_record (r); return false; } r->block_left -= record_size; /* In variable mode, read only a single record. In spanned mode, a segment value of 0 should designate a whole record without spanning, 1 the first segment in a record, 2 the last segment in a record, and 3 an intermediate segment in a record. For compatibility, though, we actually pay attention only to whether the segment value is even or odd. */ if (fh_get_mode (r->fh) == FH_MODE_360_VARIABLE || (segment & 1) == 0) return true; } } NOT_REACHED (); } /* Reads a record from R, setting the current position to the start of the line. If an error occurs or end-of-file is encountered, the current line is set to null. */ static bool read_record (struct dfm_reader *r) { if (fh_get_referent (r->fh) == FH_REF_FILE) { bool ok = read_file_record (r); if (ok) r->line_number++; return ok; } else return read_inline_record (r); } /* Returns the number of attempts, thus far, to advance past end-of-file in reader R. Reads forward in HANDLE's file, if necessary, to find out. Normally, the user stops attempting to read from the file the first time EOF is reached (a return value of 1). If the user tries to read past EOF again (a return value of 2 or more), an error message is issued, and the caller should more forcibly abort to avoid an infinite loop. */ unsigned dfm_eof (struct dfm_reader *r) { if (r->flags & DFM_ADVANCE) { r->flags &= ~DFM_ADVANCE; if (r->eof_cnt == 0 && read_record (r)) { r->pos = 0; return 0; } r->eof_cnt++; if (r->eof_cnt == 2) { if (r->fh != fh_inline_file ()) msg (ME, _("Attempt to read beyond end-of-file on file %s."), fh_get_name (r->fh)); else msg (ME, _("Attempt to read beyond %s."), "END DATA"); } } return r->eof_cnt; } /* Returns the current record in the file corresponding to HANDLE. Aborts if reading from the file is necessary or at end of file, so call dfm_eof() first. */ struct substring dfm_get_record (struct dfm_reader *r) { assert ((r->flags & DFM_ADVANCE) == 0); assert (r->eof_cnt == 0); return ds_substr (&r->line, r->pos, SIZE_MAX); } /* Expands tabs in the current line into the equivalent number of spaces, if appropriate for this kind of file. Aborts if reading from the file is necessary or at end of file, so call dfm_eof() first.*/ void dfm_expand_tabs (struct dfm_reader *r) { size_t ofs, new_pos, tab_width; assert ((r->flags & DFM_ADVANCE) == 0); assert (r->eof_cnt == 0); if (r->flags & DFM_TABS_EXPANDED) return; r->flags |= DFM_TABS_EXPANDED; if (r->fh != fh_inline_file () && (fh_get_mode (r->fh) != FH_MODE_TEXT || fh_get_tab_width (r->fh) == 0 || ds_find_byte (&r->line, '\t') == SIZE_MAX)) return; /* Expand tabs from r->line into r->scratch, and figure out new value for r->pos. */ tab_width = fh_get_tab_width (r->fh); ds_clear (&r->scratch); new_pos = SIZE_MAX; for (ofs = 0; ofs < ds_length (&r->line); ofs++) { unsigned char c; if (ofs == r->pos) new_pos = ds_length (&r->scratch); c = ds_data (&r->line)[ofs]; if (c != '\t') ds_put_byte (&r->scratch, c); else { do ds_put_byte (&r->scratch, ' '); while (ds_length (&r->scratch) % tab_width != 0); } } if (new_pos == SIZE_MAX) { /* Maintain the same relationship between position and line length that we had before. DATA LIST uses a beyond-the-end position to deal with an empty field at the end of the line. */ assert (r->pos >= ds_length (&r->line)); new_pos = (r->pos - ds_length (&r->line)) + ds_length (&r->scratch); } /* Swap r->line and r->scratch and set new r->pos. */ ds_swap (&r->line, &r->scratch); r->pos = new_pos; } /* Returns the character encoding of data read from READER. */ const char * dfm_reader_get_encoding (const struct dfm_reader *reader) { return reader->encoding; } /* Causes dfm_get_record() or dfm_get_whole_record() to read in the next record the next time it is executed on file HANDLE. */ void dfm_forward_record (struct dfm_reader *r) { r->flags |= DFM_ADVANCE; } /* Cancels the effect of any previous dfm_fwd_record() executed on file HANDLE. Sets the current line to begin in the 1-based column COLUMN. */ void dfm_reread_record (struct dfm_reader *r, size_t column) { r->flags &= ~DFM_ADVANCE; r->pos = MAX (column, 1) - 1; } /* Sets the current line to begin COLUMNS characters following the current start. */ void dfm_forward_columns (struct dfm_reader *r, size_t columns) { dfm_reread_record (r, (r->pos + 1) + columns); } /* Returns the 1-based column to which the line pointer in HANDLE is set. Unless dfm_reread_record() or dfm_forward_columns() have been called, this is 1. */ size_t dfm_column_start (const struct dfm_reader *r) { return r->pos + 1; } /* Returns the number of columns we are currently beyond the end of the line. At or before end-of-line, this is 0; one column after end-of-line, this is 1; and so on. */ size_t dfm_columns_past_end (const struct dfm_reader *r) { return r->pos < ds_length (&r->line) ? 0 : ds_length (&r->line) - r->pos; } /* Returns the 1-based column within the current line that P designates. */ size_t dfm_get_column (const struct dfm_reader *r, const char *p) { return ds_pointer_to_position (&r->line, p) + 1; } const char * dfm_get_file_name (const struct dfm_reader *r) { return (fh_get_referent (r->fh) == FH_REF_FILE ? fh_get_file_name (r->fh) : NULL); } int dfm_get_line_number (const struct dfm_reader *r) { return fh_get_referent (r->fh) == FH_REF_FILE ? r->line_number : -1; } /* BEGIN DATA...END DATA procedure. */ /* Perform BEGIN DATA...END DATA as a procedure in itself. */ int cmd_begin_data (struct lexer *lexer, struct dataset *ds) { struct dfm_reader *r; bool ok; if (!fh_is_locked (fh_inline_file (), FH_ACC_READ)) { msg (SE, _("This command is not valid here since the current " "input program does not access the inline file.")); return CMD_CASCADING_FAILURE; } lex_match (lexer, T_ENDCMD); /* Open inline file. */ r = dfm_open_reader (fh_inline_file (), lexer, NULL); r->flags |= DFM_SAW_BEGIN_DATA; r->flags &= ~DFM_CONSUME; /* Input procedure reads from inline file. */ casereader_destroy (proc_open (ds)); ok = proc_commit (ds); dfm_close_reader (r); return ok ? CMD_SUCCESS : CMD_CASCADING_FAILURE; } pspp-1.4.1/src/language/data-io/data-writer.c0000644000175000017500000001632713320146056020403 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 1997-2004, 2006, 2010, 2011, 2012, 2013 Free Software Foundation, Inc. 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 3 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, see . */ #include #include "language/data-io/data-writer.h" #include #include #include #include #include #include "data/file-name.h" #include "data/make-file.h" #include "language/data-io/file-handle.h" #include "libpspp/assertion.h" #include "libpspp/encoding-guesser.h" #include "libpspp/integer-format.h" #include "libpspp/i18n.h" #include "libpspp/message.h" #include "libpspp/str.h" #include "gl/minmax.h" #include "gl/xalloc.h" #include "gettext.h" #define _(msgid) gettext (msgid) #define N_(msgid) (msgid) /* Data file writer. */ struct dfm_writer { struct file_handle *fh; /* File handle. */ struct fh_lock *lock; /* Exclusive access to file. */ FILE *file; /* Associated file. */ struct replace_file *rf; /* Atomic file replacement support. */ char *encoding; /* Encoding. */ enum fh_line_ends line_ends; /* Line ends for text files. */ int unit; /* Unit width, in bytes. */ char cr[MAX_UNIT]; /* \r in encoding, 'unit' bytes long. */ char lf[MAX_UNIT]; /* \n in encoding, 'unit' bytes long. */ char spaces[32]; /* 32 bytes worth of ' ' in encoding. */ }; /* Opens a file handle for writing as a data file. The encoding of the file written is by default that of FH itself. If ENCODING is nonnull, then it overrides the default encoding. *However*: ENCODING directly affects only text strings written by the data writer code itself, that is, new-lines in FH_MODE_TEXT and space padding in FH_MODE_FIXED mode. The client must do its own encoding translation for the data that it writes. (This is unavoidable because sometimes the data written includes binary data that reencoding would mangle.) The client can obtain the encoding to re-encode into with dfm_writer_get_encoding(). */ struct dfm_writer * dfm_open_writer (struct file_handle *fh, const char *encoding) { struct encoding_info ei; struct dfm_writer *w; struct fh_lock *lock; int ofs; lock = fh_lock (fh, FH_REF_FILE, N_("data file"), FH_ACC_WRITE, false); if (lock == NULL) return NULL; w = fh_lock_get_aux (lock); if (w != NULL) return w; encoding = encoding_guess_parse_encoding (encoding != NULL ? encoding : fh_get_encoding (fh)); get_encoding_info (&ei, encoding); w = xmalloc (sizeof *w); w->fh = fh_ref (fh); w->lock = lock; w->rf = replace_file_start (w->fh, "wb", 0666, &w->file); w->encoding = xstrdup (encoding); w->line_ends = fh_get_line_ends (fh); w->unit = ei.unit; memcpy (w->cr, ei.cr, sizeof w->cr); memcpy (w->lf, ei.lf, sizeof w->lf); for (ofs = 0; ofs + ei.unit <= sizeof w->spaces; ofs += ei.unit) memcpy (&w->spaces[ofs], ei.space, ei.unit); if (w->rf == NULL) { msg (ME, _("An error occurred while opening `%s' for writing " "as a data file: %s."), fh_get_file_name (w->fh), strerror (errno)); dfm_close_writer (w); return NULL; } fh_lock_set_aux (lock, w); return w; } /* Returns true if an I/O error occurred on WRITER, false otherwise. */ bool dfm_write_error (const struct dfm_writer *writer) { return ferror (writer->file); } /* Writes record REC (which need not be null-terminated) having length LEN to the file corresponding to HANDLE. Adds any needed formatting, such as a trailing new-line. Returns true on success, false on failure. */ bool dfm_put_record (struct dfm_writer *w, const char *rec, size_t len) { assert (w != NULL); if (dfm_write_error (w)) return false; switch (fh_get_mode (w->fh)) { case FH_MODE_TEXT: fwrite (rec, len, 1, w->file); if (w->line_ends == FH_END_CRLF) fwrite (w->cr, w->unit, 1, w->file); fwrite (w->lf, w->unit, 1, w->file); break; case FH_MODE_FIXED: { size_t record_width = fh_get_record_width (w->fh); size_t write_bytes = MIN (len, record_width); size_t pad_bytes = record_width - write_bytes; fwrite (rec, write_bytes, 1, w->file); while (pad_bytes > 0) { size_t chunk = MIN (pad_bytes, sizeof w->spaces); fwrite (w->spaces, chunk, 1, w->file); pad_bytes -= chunk; } } break; case FH_MODE_VARIABLE: { uint32_t size = len; integer_convert (INTEGER_NATIVE, &size, INTEGER_LSB_FIRST, &size, sizeof size); fwrite (&size, sizeof size, 1, w->file); fwrite (rec, len, 1, w->file); fwrite (&size, sizeof size, 1, w->file); } break; case FH_MODE_360_VARIABLE: case FH_MODE_360_SPANNED: { size_t ofs = 0; if (fh_get_mode (w->fh) == FH_MODE_360_VARIABLE) len = MIN (65527, len); while (ofs < len) { size_t chunk = MIN (65527, len - ofs); uint32_t bdw = (chunk + 8) << 16; int scc = (ofs == 0 && chunk == len ? 0 : ofs == 0 ? 1 : ofs + chunk == len ? 2 : 3); uint32_t rdw = ((chunk + 4) << 16) | (scc << 8); integer_convert (INTEGER_NATIVE, &bdw, INTEGER_MSB_FIRST, &bdw, sizeof bdw); integer_convert (INTEGER_NATIVE, &rdw, INTEGER_MSB_FIRST, &rdw, sizeof rdw); fwrite (&bdw, 1, sizeof bdw, w->file); fwrite (&rdw, 1, sizeof rdw, w->file); fwrite (rec + ofs, 1, chunk, w->file); ofs += chunk; } } break; default: NOT_REACHED (); } return !dfm_write_error (w); } /* Closes data file writer W. */ bool dfm_close_writer (struct dfm_writer *w) { bool ok; if (w == NULL) return true; if (fh_unlock (w->lock)) return true; ok = true; if (w->file != NULL) { const char *file_name = fh_get_file_name (w->fh); ok = !dfm_write_error (w) && !fn_close (w->fh, w->file); if (!ok) msg (ME, _("I/O error occurred writing data file `%s'."), file_name); if (ok ? !replace_file_commit (w->rf) : !replace_file_abort (w->rf)) ok = false; } fh_unref (w->fh); free (w->encoding); free (w); return ok; } /* Returns the encoding of data written to WRITER. */ const char * dfm_writer_get_encoding (const struct dfm_writer *writer) { return writer->encoding; } pspp-1.4.1/src/language/data-io/get.c0000644000175000017500000001004113546443556016741 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 1997-9, 2000, 2006-2007, 2010-15 Free Software Foundation, Inc. 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 3 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, see . */ #include #include #include "data/any-reader.h" #include "data/case-map.h" #include "data/case.h" #include "data/casereader.h" #include "data/dataset.h" #include "data/dictionary.h" #include "data/por-file-writer.h" #include "language/command.h" #include "language/data-io/file-handle.h" #include "language/data-io/trim.h" #include "language/lexer/lexer.h" #include "libpspp/compiler.h" #include "libpspp/misc.h" #include "libpspp/message.h" #include "libpspp/str.h" #include "gl/xalloc.h" #include "gettext.h" #define _(msgid) gettext (msgid) /* Reading system and portable files. */ /* Type of command. */ enum reader_command { GET_CMD, IMPORT_CMD }; static int parse_read_command (struct lexer *, struct dataset *, enum reader_command); /* GET. */ int cmd_get (struct lexer *lexer, struct dataset *ds) { return parse_read_command (lexer, ds, GET_CMD); } /* IMPORT. */ int cmd_import (struct lexer *lexer, struct dataset *ds) { return parse_read_command (lexer, ds, IMPORT_CMD); } /* Parses a GET or IMPORT command. */ static int parse_read_command (struct lexer *lexer, struct dataset *ds, enum reader_command command) { struct casereader *reader = NULL; struct file_handle *fh = NULL; struct dictionary *dict = NULL; struct case_map *map = NULL; struct case_map_stage *stage = NULL; char *encoding = NULL; for (;;) { lex_match (lexer, T_SLASH); if (lex_match_id (lexer, "FILE") || lex_is_string (lexer)) { lex_match (lexer, T_EQUALS); fh_unref (fh); fh = fh_parse (lexer, FH_REF_FILE, NULL); if (fh == NULL) goto error; } else if (command == GET_CMD && lex_match_id (lexer, "ENCODING")) { lex_match (lexer, T_EQUALS); if (!lex_force_string (lexer)) goto error; free (encoding); encoding = ss_xstrdup (lex_tokss (lexer)); lex_get (lexer); } else if (command == IMPORT_CMD && lex_match_id (lexer, "TYPE")) { lex_match (lexer, T_EQUALS); if (!lex_match_id (lexer, "COMM") && !lex_match_id (lexer, "TAPE")) { lex_error_expecting (lexer, "COMM", "TAPE"); goto error; } } else break; } if (fh == NULL) { lex_sbc_missing ("FILE"); goto error; } reader = any_reader_open_and_decode (fh, encoding, &dict, NULL); if (reader == NULL) goto error; if (dict_get_var_cnt (dict) == 0) { msg (SE, _("%s: Data file dictionary has no variables."), fh_get_name (fh)); goto error; } stage = case_map_stage_create (dict); while (lex_token (lexer) != T_ENDCMD) { lex_match (lexer, T_SLASH); if (!parse_dict_trim (lexer, dict, false)) goto error; } dict_compact_values (dict); map = case_map_stage_get_case_map (stage); case_map_stage_destroy (stage); if (map != NULL) reader = case_map_create_input_translator (map, reader); dataset_set_dict (ds, dict); dataset_set_source (ds, reader); fh_unref (fh); free (encoding); return CMD_SUCCESS; error: case_map_stage_destroy (stage); fh_unref (fh); casereader_destroy (reader); if (dict != NULL) dict_unref (dict); free (encoding); return CMD_CASCADING_FAILURE; } pspp-1.4.1/src/language/data-io/automake.mk0000644000175000017500000000344313571051220020142 0ustar00blpblp00000000000000# PSPP - a program for statistical analysis. # Copyright (C) 2017 Free Software Foundation, Inc. # # 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 3 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, see . # ## Process this file with automake to produce Makefile.in -*- makefile -*- language_data_io_sources = \ src/language/data-io/combine-files.c \ src/language/data-io/data-list.c \ src/language/data-io/data-parser.c \ src/language/data-io/data-parser.h \ src/language/data-io/data-reader.c \ src/language/data-io/data-reader.h \ src/language/data-io/data-writer.c \ src/language/data-io/data-writer.h \ src/language/data-io/dataset.c \ src/language/data-io/file-handle.c \ src/language/data-io/file-handle.h \ src/language/data-io/get-data.c \ src/language/data-io/get.c \ src/language/data-io/inpt-pgm.c \ src/language/data-io/inpt-pgm.h \ src/language/data-io/list.c \ src/language/data-io/placement-parser.c \ src/language/data-io/placement-parser.h \ src/language/data-io/print-space.c \ src/language/data-io/print.c \ src/language/data-io/matrix-data.c \ src/language/data-io/matrix-reader.c \ src/language/data-io/matrix-reader.h \ src/language/data-io/save-translate.c \ src/language/data-io/save.c \ src/language/data-io/trim.c \ src/language/data-io/trim.h pspp-1.4.1/src/language/data-io/inpt-pgm.c0000644000175000017500000002454013507505260017712 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 1997-9, 2000, 2009, 2010, 2011, 2012, 2013 Free Software Foundation, Inc. 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 3 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, see . */ #include #include #include #include "data/case.h" #include "data/caseinit.h" #include "data/casereader-provider.h" #include "data/dataset.h" #include "data/dictionary.h" #include "data/session.h" #include "data/transformations.h" #include "data/variable.h" #include "language/command.h" #include "language/data-io/data-reader.h" #include "language/data-io/file-handle.h" #include "language/data-io/inpt-pgm.h" #include "language/expressions/public.h" #include "language/lexer/lexer.h" #include "libpspp/assertion.h" #include "libpspp/compiler.h" #include "libpspp/message.h" #include "libpspp/misc.h" #include "libpspp/str.h" #include "gl/xalloc.h" #include "gettext.h" #define _(msgid) gettext (msgid) /* Indicates how a `union value' should be initialized. */ struct input_program_pgm { struct session *session; struct dataset *ds; struct trns_chain *trns_chain; enum trns_result restart; casenumber case_nr; /* Incremented by END CASE transformation. */ struct caseinit *init; struct caseproto *proto; }; static void destroy_input_program (struct input_program_pgm *); static trns_proc_func end_case_trns_proc; static trns_proc_func reread_trns_proc; static trns_proc_func end_file_trns_proc; static trns_free_func reread_trns_free; static const struct casereader_class input_program_casereader_class; static bool inside_input_program; /* Returns true if we're parsing the inside of a INPUT PROGRAM...END INPUT PROGRAM construct, false otherwise. */ bool in_input_program (void) { return inside_input_program; } /* Emits an END CASE transformation for INP. */ static void emit_END_CASE (struct dataset *ds, struct input_program_pgm *inp) { add_transformation (ds, end_case_trns_proc, NULL, inp); } int cmd_input_program (struct lexer *lexer, struct dataset *ds) { struct input_program_pgm *inp; bool saw_END_CASE = false; bool saw_END_FILE = false; bool saw_DATA_LIST = false; if (!lex_match (lexer, T_ENDCMD)) return lex_end_of_command (lexer); inp = xmalloc (sizeof *inp); inp->session = session_create (dataset_session (ds)); inp->ds = dataset_create (inp->session, "INPUT PROGRAM"); inp->trns_chain = NULL; inp->init = NULL; inp->proto = NULL; inside_input_program = true; while (!lex_match_phrase (lexer, "END INPUT PROGRAM")) { enum cmd_result result; result = cmd_parse_in_state (lexer, inp->ds, CMD_STATE_INPUT_PROGRAM); switch (result) { case CMD_DATA_LIST: saw_DATA_LIST = true; break; case CMD_END_CASE: emit_END_CASE (inp->ds, inp); saw_END_CASE = true; break; case CMD_END_FILE: saw_END_FILE = true; break; case CMD_FAILURE: break; default: if (cmd_result_is_failure (result) && lex_get_error_mode (lexer) != LEX_ERROR_TERMINAL) { if (result == CMD_EOF) msg (SE, _("Unexpected end-of-file within %s."), "INPUT PROGRAM"); inside_input_program = false; destroy_input_program (inp); return result; } } } if (!saw_END_CASE) emit_END_CASE (inp->ds, inp); inside_input_program = false; if (!saw_DATA_LIST && !saw_END_FILE) { msg (SE, _("Input program must contain %s or %s."), "DATA LIST", "END FILE"); destroy_input_program (inp); return CMD_FAILURE; } if (dict_get_next_value_idx (dataset_dict (inp->ds)) == 0) { msg (SE, _("Input program did not create any variables.")); destroy_input_program (inp); return CMD_FAILURE; } inp->trns_chain = proc_capture_transformations (inp->ds); trns_chain_finalize (inp->trns_chain); inp->restart = TRNS_CONTINUE; /* Figure out how to initialize each input case. */ inp->init = caseinit_create (); caseinit_mark_for_init (inp->init, dataset_dict (inp->ds)); inp->proto = caseproto_ref (dict_get_proto (dataset_dict (inp->ds))); dataset_set_dict (ds, dict_clone (dataset_dict (inp->ds))); dataset_set_source ( ds, casereader_create_sequential (NULL, inp->proto, CASENUMBER_MAX, &input_program_casereader_class, inp)); return CMD_SUCCESS; } int cmd_end_input_program (struct lexer *lexer UNUSED, struct dataset *ds UNUSED) { /* Inside INPUT PROGRAM, this should get caught at the top of the loop in cmd_input_program(). Outside of INPUT PROGRAM, the command parser should reject this command. */ NOT_REACHED (); } /* Returns true if STATE is valid given the transformations that are allowed within INPUT PROGRAM. */ static bool is_valid_state (enum trns_result state) { return (state == TRNS_CONTINUE || state == TRNS_ERROR || state == TRNS_END_FILE || state >= 0); } /* Reads and returns one case. Returns the case if successful, null at end of file or if an I/O error occurred. */ static struct ccase * input_program_casereader_read (struct casereader *reader UNUSED, void *inp_) { struct input_program_pgm *inp = inp_; struct ccase *c = case_create (inp->proto); do { assert (is_valid_state (inp->restart)); if (inp->restart == TRNS_ERROR || inp->restart == TRNS_END_FILE) { case_unref (c); return NULL; } c = case_unshare (c); caseinit_init_vars (inp->init, c); inp->restart = trns_chain_execute (inp->trns_chain, inp->restart, &c, inp->case_nr); assert (is_valid_state (inp->restart)); caseinit_update_left_vars (inp->init, c); } while (inp->restart < 0); return c; } static void destroy_input_program (struct input_program_pgm *pgm) { if (pgm != NULL) { session_destroy (pgm->session); trns_chain_destroy (pgm->trns_chain); caseinit_destroy (pgm->init); caseproto_unref (pgm->proto); free (pgm); } } /* Destroys the casereader. */ static void input_program_casereader_destroy (struct casereader *reader, void *inp_) { struct input_program_pgm *inp = inp_; if (inp->restart == TRNS_ERROR) casereader_force_error (reader); destroy_input_program (inp); } static const struct casereader_class input_program_casereader_class = { input_program_casereader_read, input_program_casereader_destroy, NULL, NULL, }; int cmd_end_case (struct lexer *lexer, struct dataset *ds UNUSED) { assert (in_input_program ()); if (lex_token (lexer) == T_ENDCMD) return CMD_END_CASE; return CMD_SUCCESS; } /* Outputs the current case */ int end_case_trns_proc (void *inp_, struct ccase **c UNUSED, casenumber case_nr UNUSED) { struct input_program_pgm *inp = inp_; inp->case_nr++; return TRNS_END_CASE; } /* REREAD transformation. */ struct reread_trns { struct dfm_reader *reader; /* File to move file pointer back on. */ struct expression *column; /* Column to reset file pointer to. */ }; /* Parses REREAD command. */ int cmd_reread (struct lexer *lexer, struct dataset *ds) { struct file_handle *fh; /* File to be re-read. */ struct expression *e; /* Expression for column to set. */ struct reread_trns *t; /* Created transformation. */ char *encoding = NULL; fh = fh_get_default_handle (); e = NULL; while (lex_token (lexer) != T_ENDCMD) { if (lex_match_id (lexer, "COLUMN")) { lex_match (lexer, T_EQUALS); if (e) { lex_sbc_only_once ("COLUMN"); goto error; } e = expr_parse (lexer, ds, EXPR_NUMBER); if (!e) goto error; } else if (lex_match_id (lexer, "FILE")) { lex_match (lexer, T_EQUALS); fh_unref (fh); fh = fh_parse (lexer, FH_REF_FILE | FH_REF_INLINE, NULL); if (fh == NULL) goto error; } else if (lex_match_id (lexer, "ENCODING")) { lex_match (lexer, T_EQUALS); if (!lex_force_string (lexer)) goto error; free (encoding); encoding = ss_xstrdup (lex_tokss (lexer)); lex_get (lexer); } else { lex_error (lexer, NULL); goto error; } } t = xmalloc (sizeof *t); t->reader = dfm_open_reader (fh, lexer, encoding); t->column = e; add_transformation (ds, reread_trns_proc, reread_trns_free, t); fh_unref (fh); free (encoding); return CMD_SUCCESS; error: expr_free (e); free (encoding); return CMD_CASCADING_FAILURE; } /* Executes a REREAD transformation. */ static int reread_trns_proc (void *t_, struct ccase **c, casenumber case_num) { struct reread_trns *t = t_; if (t->column == NULL) dfm_reread_record (t->reader, 1); else { double column = expr_evaluate_num (t->column, *c, case_num); if (!isfinite (column) || column < 1) { msg (SE, _("REREAD: Column numbers must be positive finite " "numbers. Column set to 1.")); dfm_reread_record (t->reader, 1); } else dfm_reread_record (t->reader, column); } return TRNS_CONTINUE; } /* Frees a REREAD transformation. Returns true if successful, false if an I/O error occurred. */ static bool reread_trns_free (void *t_) { struct reread_trns *t = t_; expr_free (t->column); dfm_close_reader (t->reader); return true; } /* Parses END FILE command. */ int cmd_end_file (struct lexer *lexer UNUSED, struct dataset *ds) { assert (in_input_program ()); add_transformation (ds, end_file_trns_proc, NULL, NULL); return CMD_END_FILE; } /* Executes an END FILE transformation. */ static int end_file_trns_proc (void *trns_ UNUSED, struct ccase **c UNUSED, casenumber case_num UNUSED) { return TRNS_END_FILE; } pspp-1.4.1/src/language/data-io/inpt-pgm.h0000644000175000017500000000160213320146056017706 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2006 Free Software Foundation, Inc. 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 3 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, see . */ #ifndef INPT_PGM_H #define INPT_PGM_H 1 #include bool in_input_program (void); void cancel_input_program (void); #endif /* inpt-pgm.h */ pspp-1.4.1/src/language/data-io/trim.c0000644000175000017500000002160213700645725017134 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 1997-9, 2000, 2006, 2007, 2008, 2010, 2011, 2019, 2020 Free Software Foundation, Inc. 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 3 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, see . */ #include #include "language/data-io/trim.h" #include #include "data/dictionary.h" #include "data/variable.h" #include "language/lexer/lexer.h" #include "language/lexer/variable-parser.h" #include "libpspp/message.h" #include "libpspp/misc.h" #include "gl/xalloc.h" #include "gettext.h" #define _(msgid) gettext (msgid) /* Commands that read and write system files share a great deal of common syntactic structure for rearranging and dropping variables. This function parses this syntax and modifies DICT appropriately. If RELAX is true, then the modified dictionary need not conform to the usual variable name rules. Returns true on success, false on failure. */ bool parse_dict_trim (struct lexer *lexer, struct dictionary *dict, bool relax) { if (lex_match_id (lexer, "MAP")) { /* FIXME. */ return true; } else if (lex_match_id (lexer, "DROP")) return parse_dict_drop (lexer, dict); else if (lex_match_id (lexer, "KEEP")) return parse_dict_keep (lexer, dict); else if (lex_match_id (lexer, "RENAME")) return parse_dict_rename (lexer, dict, relax); else { lex_error (lexer, _("expecting a valid subcommand")); return false; } } /* Check that OLD_NAME can be renamed to NEW_NAME in DICT. */ static bool check_rename (const struct dictionary *dict, const char *old_name, const char *new_name) { if (dict_lookup_var (dict, new_name) != NULL) { msg (SE, _("Cannot rename %s as %s because there already exists " "a variable named %s. To rename variables with " "overlapping names, use a single RENAME subcommand " "such as `/RENAME (A=B)(B=C)(C=A)', or equivalently, " "`/RENAME (A B C=B C A)'."), old_name, new_name, new_name); return false; } return true; } /* Parse a "VarX TO VarY" sequence where X and Y are integers such that X >= Y. If successfull, returns a string to the prefix Var and sets FIRST to X and LAST to Y. Returns NULL on failure. The caller must free the return value. */ static char * try_to_sequence (struct lexer *lexer, const struct dictionary *dict, int *first, int *last) { /* Check that the next 3 tokens are of the correct type. */ if (lex_token (lexer) != T_ID || lex_next_token (lexer, 1) != T_TO || lex_next_token (lexer, 2) != T_ID) return NULL; /* Check that the first and last tokens are suitable as variable names. */ const char *s0 = lex_tokcstr (lexer); if (!id_is_valid (s0, dict_get_encoding (dict), true)) return NULL; const char *s1 = lex_next_tokcstr (lexer, 2); if (!id_is_valid (s1, dict_get_encoding (dict), true)) return NULL; int x0 = strcspn (s0, "0123456789"); int x1 = strcspn (s1, "0123456789"); /* The non-digit parts of s0 and s1 must be the same length. */ if (x0 != x1) return NULL; /* Both s0 and s1 must have some digits. */ if (strlen (s0) <= x0) return NULL; if (strlen (s1) <= x1) return NULL; /* The non-digit parts of s0 and s1 must be identical. */ if (0 != strncmp (s0, s1, x0)) return NULL; /* Both names must end with digits. */ int len_s0_pfx = strspn (s0 + x0, "0123456789"); if (len_s0_pfx + x0 != strlen (s0)) return NULL; int len_s1_pfx = strspn (s1 + x1, "0123456789"); if (len_s1_pfx + x1 != strlen (s1)) return NULL; const char *n_start = s0 + x0; const char *n_stop = s1 + x1; /* The first may not be greater than the last. */ if (atoi (n_start) > atoi (n_stop)) return NULL; char *prefix = xstrndup (s0, x1); *first = atoi (n_start); *last = atoi (n_stop); return prefix; } /* Parses and performs the RENAME subcommand of GET, SAVE, and related commands. If RELAX is true, then the new variable names need not conform to the normal dictionary rules. */ bool parse_dict_rename (struct lexer *lexer, struct dictionary *dict, bool relax) { struct variable **oldvars = NULL; size_t n_newvars = 0; int group = 0; char **newnames = NULL; lex_match (lexer, T_EQUALS); while (lex_token (lexer) != T_SLASH && lex_token (lexer) != T_ENDCMD) { size_t n_oldvars = 0; oldvars = NULL; n_newvars = 0; n_oldvars = 0; oldvars = NULL; bool paren = lex_match (lexer, T_LPAREN); group++; if (!parse_variables (lexer, dict, &oldvars, &n_oldvars, PV_NO_DUPLICATE)) goto fail; if (!lex_force_match (lexer, T_EQUALS)) goto fail; newnames = xmalloc (sizeof *newnames * n_oldvars); char *prefix = NULL; int first, last; /* First attempt to parse v1 TO v10 format. */ if ((prefix = try_to_sequence (lexer, dict, &first, &last))) { /* These 3 tokens have already been checked in the try_to_sequence function. */ lex_get (lexer); lex_get (lexer); lex_get (lexer); /* Make sure the new names are suitable. */ for (int i = first; i <= last; ++i) { int sz = strlen (prefix) + intlog10 (last) + 1; char *vn = malloc (sz); snprintf (vn, sz, "%s%d", prefix, i); if (!check_rename (dict, var_get_name (oldvars[n_newvars]), vn)) { free (prefix); goto fail; } newnames[i - first] = vn; n_newvars++; } } else while (lex_token (lexer) == T_ID || lex_token (lexer) == T_STRING) { if (n_newvars >= n_oldvars) break; const char *new_name = lex_tokcstr (lexer); if (!relax && ! id_is_plausible (new_name, true)) goto fail; if (!check_rename (dict, var_get_name (oldvars[n_newvars]), new_name)) goto fail; newnames[n_newvars] = strdup (new_name); lex_get (lexer); n_newvars++; } free (prefix); if (n_newvars != n_oldvars) { msg (SE, _("Number of variables on left side of `=' (%zu) does not " "match number of variables on right side (%zu), in " "parenthesized group %d of RENAME subcommand."), n_oldvars, n_newvars, group); goto fail; } if (paren) if (!lex_force_match (lexer, T_RPAREN)) goto fail; char *errname = 0; if (!dict_rename_vars (dict, oldvars, newnames, n_newvars, &errname)) { msg (SE, _("Requested renaming duplicates variable name %s."), errname); goto fail; } free (oldvars); for (int i = 0; i < n_newvars; ++i) free (newnames[i]); free (newnames); newnames = NULL; } return true; fail: free (oldvars); for (int i = 0; i < n_newvars; ++i) free (newnames[i]); free (newnames); newnames = NULL; return false; } /* Parses and performs the DROP subcommand of GET, SAVE, and related commands. Returns true if successful, false on failure.*/ bool parse_dict_drop (struct lexer *lexer, struct dictionary *dict) { struct variable **v; size_t nv; lex_match (lexer, T_EQUALS); if (!parse_variables (lexer, dict, &v, &nv, PV_NONE)) return false; dict_delete_vars (dict, v, nv); free (v); if (dict_get_var_cnt (dict) == 0) { msg (SE, _("Cannot DROP all variables from dictionary.")); return false; } return true; } /* Parses and performs the KEEP subcommand of GET, SAVE, and related commands. Returns true if successful, false on failure.*/ bool parse_dict_keep (struct lexer *lexer, struct dictionary *dict) { struct variable **v; size_t nv; size_t i; lex_match (lexer, T_EQUALS); if (!parse_variables (lexer, dict, &v, &nv, PV_NONE)) return false; /* Move the specified variables to the beginning. */ dict_reorder_vars (dict, v, nv); /* Delete the remaining variables. */ if (dict_get_var_cnt (dict) == nv) { free (v); return true; } v = xnrealloc (v, dict_get_var_cnt (dict) - nv, sizeof *v); for (i = nv; i < dict_get_var_cnt (dict); i++) v[i - nv] = dict_get_var (dict, i); dict_delete_vars (dict, v, dict_get_var_cnt (dict) - nv); free (v); return true; } pspp-1.4.1/src/language/data-io/data-list.c0000644000175000017500000004026213507505260020040 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 1997-9, 2000, 2006, 2007, 2009, 2010, 2011, 2012, 2013 Free Software Foundation, Inc. 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 3 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, see . */ #include #include #include #include #include #include #include "data/case.h" #include "data/casereader.h" #include "data/data-in.h" #include "data/dataset.h" #include "data/dictionary.h" #include "data/format.h" #include "data/settings.h" #include "data/transformations.h" #include "data/variable.h" #include "language/command.h" #include "language/data-io/data-parser.h" #include "language/data-io/data-reader.h" #include "language/data-io/file-handle.h" #include "language/data-io/inpt-pgm.h" #include "language/data-io/placement-parser.h" #include "language/lexer/format-parser.h" #include "language/lexer/lexer.h" #include "language/lexer/variable-parser.h" #include "libpspp/assertion.h" #include "libpspp/compiler.h" #include "libpspp/i18n.h" #include "libpspp/message.h" #include "libpspp/misc.h" #include "libpspp/pool.h" #include "libpspp/str.h" #include "gl/xsize.h" #include "gl/xalloc.h" #include "gettext.h" #define _(msgid) gettext (msgid) /* DATA LIST transformation data. */ struct data_list_trns { struct data_parser *parser; /* Parser. */ struct dfm_reader *reader; /* Data file reader. */ struct variable *end; /* Variable specified on END subcommand. */ }; static bool parse_fixed (struct lexer *, struct dictionary *, struct pool *, struct data_parser *); static bool parse_free (struct lexer *, struct dictionary *, struct pool *, struct data_parser *); static trns_free_func data_list_trns_free; static trns_proc_func data_list_trns_proc; int cmd_data_list (struct lexer *lexer, struct dataset *ds) { struct dictionary *dict; struct data_parser *parser; struct dfm_reader *reader; struct variable *end = NULL; struct file_handle *fh = NULL; char *encoding = NULL; int table; enum data_parser_type type; bool has_type; struct pool *tmp_pool; bool ok; dict = (in_input_program () ? dataset_dict (ds) : dict_create (get_default_encoding ())); parser = data_parser_create (dict); reader = NULL; table = -1; /* Print table if nonzero, -1=undecided. */ has_type = false; while (lex_token (lexer) != T_SLASH) { if (lex_match_id (lexer, "FILE")) { lex_match (lexer, T_EQUALS); fh_unref (fh); fh = fh_parse (lexer, FH_REF_FILE | FH_REF_INLINE, NULL); if (fh == NULL) goto error; } else if (lex_match_id (lexer, "ENCODING")) { lex_match (lexer, T_EQUALS); if (!lex_force_string (lexer)) goto error; free (encoding); encoding = ss_xstrdup (lex_tokss (lexer)); lex_get (lexer); } else if (lex_match_id (lexer, "RECORDS")) { lex_match (lexer, T_EQUALS); lex_match (lexer, T_LPAREN); if (!lex_force_int (lexer)) goto error; int records = lex_integer (lexer); if (records < 0) { msg (SE, _("The %s value must be non-negative."), "RECORDS"); goto error; } data_parser_set_records (parser, records); lex_get (lexer); lex_match (lexer, T_RPAREN); } else if (lex_match_id (lexer, "SKIP")) { lex_match (lexer, T_EQUALS); if (!lex_force_int (lexer)) goto error; int skip = lex_integer (lexer); if (skip < 0) { msg (SE, _("The %s value must be non-negative."), "SKIP"); goto error; } data_parser_set_skip (parser, skip); lex_get (lexer); } else if (lex_match_id (lexer, "END")) { if (!in_input_program ()) { msg (SE, _("The %s subcommand may only be used within %s."), "END", "INPUT PROGRAM"); goto error; } if (end) { msg (SE, _("The %s subcommand may only be specified once."), "END"); goto error; } lex_match (lexer, T_EQUALS); if (!lex_force_id (lexer)) goto error; end = dict_lookup_var (dict, lex_tokcstr (lexer)); if (!end) end = dict_create_var_assert (dict, lex_tokcstr (lexer), 0); lex_get (lexer); } else if (lex_match_id (lexer, "NOTABLE")) table = 0; else if (lex_match_id (lexer, "TABLE")) table = 1; else if (lex_token (lexer) == T_ID) { if (lex_match_id (lexer, "FIXED")) data_parser_set_type (parser, DP_FIXED); else if (lex_match_id (lexer, "FREE")) { data_parser_set_type (parser, DP_DELIMITED); data_parser_set_span (parser, true); } else if (lex_match_id (lexer, "LIST")) { data_parser_set_type (parser, DP_DELIMITED); data_parser_set_span (parser, false); } else { lex_error (lexer, NULL); goto error; } if (has_type) { msg (SE, _("Only one of FIXED, FREE, or LIST may " "be specified.")); goto error; } has_type = true; if (data_parser_get_type (parser) == DP_DELIMITED) { if (lex_match (lexer, T_LPAREN)) { struct string delims = DS_EMPTY_INITIALIZER; while (!lex_match (lexer, T_RPAREN)) { int delim; if (lex_match_id (lexer, "TAB")) delim = '\t'; else if (lex_is_string (lexer) && ss_length (lex_tokss (lexer)) == 1) { delim = ss_first (lex_tokss (lexer)); lex_get (lexer); } else { /* XXX should support multibyte UTF-8 characters */ lex_error (lexer, NULL); ds_destroy (&delims); goto error; } ds_put_byte (&delims, delim); lex_match (lexer, T_COMMA); } data_parser_set_empty_line_has_field (parser, true); data_parser_set_quotes (parser, ss_empty ()); data_parser_set_soft_delimiters (parser, ss_empty ()); data_parser_set_hard_delimiters (parser, ds_ss (&delims)); ds_destroy (&delims); } else { data_parser_set_empty_line_has_field (parser, false); data_parser_set_quotes (parser, ss_cstr ("'\"")); data_parser_set_soft_delimiters (parser, ss_cstr (CC_SPACES)); const char decimal = settings_get_decimal_char (FMT_F); data_parser_set_hard_delimiters (parser, ss_buffer (",", (decimal == '.') ? 1 : 0)); } } } else { lex_error (lexer, NULL); goto error; } } type = data_parser_get_type (parser); if (encoding && NULL == fh) msg (MW, _("Encoding should not be specified for inline data. It will be " "ignored.")); if (fh == NULL) fh = fh_inline_file (); fh_set_default_handle (fh); if (type != DP_FIXED && end != NULL) { msg (SE, _("The %s subcommand may be used only with %s."), "END", "DATA LIST FIXED"); goto error; } tmp_pool = pool_create (); if (type == DP_FIXED) ok = parse_fixed (lexer, dict, tmp_pool, parser); else ok = parse_free (lexer, dict, tmp_pool, parser); pool_destroy (tmp_pool); if (!ok) goto error; if (!data_parser_any_fields (parser)) { msg (SE, _("At least one variable must be specified.")); goto error; } if (lex_end_of_command (lexer) != CMD_SUCCESS) goto error; if (table == -1) table = type == DP_FIXED || !data_parser_get_span (parser); if (table) data_parser_output_description (parser, fh); reader = dfm_open_reader (fh, lexer, encoding); if (reader == NULL) goto error; if (in_input_program ()) { struct data_list_trns *trns = xmalloc (sizeof *trns); trns->parser = parser; trns->reader = reader; trns->end = end; add_transformation (ds, data_list_trns_proc, data_list_trns_free, trns); } else data_parser_make_active_file (parser, ds, reader, dict, NULL, NULL); fh_unref (fh); free (encoding); return CMD_DATA_LIST; error: data_parser_destroy (parser); if (!in_input_program ()) dict_unref (dict); fh_unref (fh); free (encoding); return CMD_CASCADING_FAILURE; } /* Fixed-format parsing. */ /* Parses all the variable specifications for DATA LIST FIXED, storing them into DLS. Uses TMP_POOL for temporary storage; the caller may destroy it. Returns true only if successful. */ static bool parse_fixed (struct lexer *lexer, struct dictionary *dict, struct pool *tmp_pool, struct data_parser *parser) { int max_records = data_parser_get_records (parser); int record = 0; int column = 1; while (lex_token (lexer) != T_ENDCMD) { char **names; size_t name_cnt, name_idx; struct fmt_spec *formats, *f; size_t format_cnt; /* Parse everything. */ if (!parse_record_placement (lexer, &record, &column) || !parse_DATA_LIST_vars_pool (lexer, dict, tmp_pool, &names, &name_cnt, PV_NONE) || !parse_var_placements (lexer, tmp_pool, name_cnt, FMT_FOR_INPUT, &formats, &format_cnt)) return false; /* Create variables and var specs. */ name_idx = 0; for (f = formats; f < &formats[format_cnt]; f++) if (!execute_placement_format (f, &record, &column)) { char *name; int width; struct variable *v; name = names[name_idx++]; /* Create variable. */ width = fmt_var_width (f); v = dict_create_var (dict, name, width); if (v != NULL) { /* Success. */ struct fmt_spec output = fmt_for_output_from_input (f); var_set_both_formats (v, &output); } else { /* Failure. This can be acceptable if we're in INPUT PROGRAM, but only if the existing variable has the same width as the one we would have created. */ if (!in_input_program ()) { msg (SE, _("%s is a duplicate variable name."), name); return false; } v = dict_lookup_var_assert (dict, name); if ((width != 0) != (var_get_width (v) != 0)) { msg (SE, _("There is already a variable %s of a " "different type."), name); return false; } if (width != 0 && width != var_get_width (v)) { msg (SE, _("There is already a string variable %s of a " "different width."), name); return false; } } if (max_records && record > max_records) { msg (SE, _("Cannot place variable %s on record %d when " "RECORDS=%d is specified."), var_get_name (v), record, data_parser_get_records (parser)); } data_parser_add_fixed_field (parser, f, var_get_case_index (v), var_get_name (v), record, column); column += f->w; } assert (name_idx == name_cnt); } return true; } /* Free-format parsing. */ /* Parses variable specifications for DATA LIST FREE and adds them to DLS. Uses TMP_POOL for temporary storage; the caller may destroy it. Returns true only if successful. */ static bool parse_free (struct lexer *lexer, struct dictionary *dict, struct pool *tmp_pool, struct data_parser *parser) { lex_get (lexer); while (lex_token (lexer) != T_ENDCMD) { struct fmt_spec input, output; char **name; size_t name_cnt; size_t i; if (!parse_DATA_LIST_vars_pool (lexer, dict, tmp_pool, &name, &name_cnt, PV_NONE)) return false; if (lex_match (lexer, T_LPAREN)) { char type[FMT_TYPE_LEN_MAX + 1]; if (!parse_abstract_format_specifier (lexer, type, &input.w, &input.d)) return NULL; if (!fmt_from_name (type, &input.type)) { msg (SE, _("Unknown format type `%s'."), type); return NULL; } /* If no width was included, use the minimum width for the type. This isn't quite right, because DATETIME by itself seems to become DATETIME20 (see bug #30690), whereas this will become DATETIME17. The correct behavior is not documented. */ if (input.w == 0) { input.w = fmt_min_input_width (input.type); input.d = 0; } if (!fmt_check_input (&input) || !lex_force_match (lexer, T_RPAREN)) return NULL; /* As a special case, N format is treated as F format for free-field input. */ if (input.type == FMT_N) input.type = FMT_F; output = fmt_for_output_from_input (&input); } else { lex_match (lexer, T_ASTERISK); input = fmt_for_input (FMT_F, 8, 0); output = *settings_get_format (); } for (i = 0; i < name_cnt; i++) { struct variable *v; v = dict_create_var (dict, name[i], fmt_var_width (&input)); if (v == NULL) { msg (SE, _("%s is a duplicate variable name."), name[i]); return false; } var_set_both_formats (v, &output); data_parser_add_delimited_field (parser, &input, var_get_case_index (v), var_get_name (v)); } } return true; } /* Input procedure. */ /* Destroys DATA LIST transformation TRNS. Returns true if successful, false if an I/O error occurred. */ static bool data_list_trns_free (void *trns_) { struct data_list_trns *trns = trns_; data_parser_destroy (trns->parser); dfm_close_reader (trns->reader); free (trns); return true; } /* Handle DATA LIST transformation TRNS, parsing data into *C. */ static int data_list_trns_proc (void *trns_, struct ccase **c, casenumber case_num UNUSED) { struct data_list_trns *trns = trns_; int retval; *c = case_unshare (*c); if (data_parser_parse (trns->parser, trns->reader, *c)) retval = TRNS_CONTINUE; else if (dfm_reader_error (trns->reader) || dfm_eof (trns->reader) > 1) { /* An I/O error, or encountering end of file for a second time, should be escalated into a more serious error. */ retval = TRNS_ERROR; } else retval = TRNS_END_FILE; /* If there was an END subcommand handle it. */ if (trns->end != NULL) { double *end = &case_data_rw (*c, trns->end)->f; if (retval == TRNS_END_FILE) { *end = 1.0; retval = TRNS_CONTINUE; } else *end = 0.0; } return retval; } pspp-1.4.1/src/language/data-io/data-parser.c0000644000175000017500000006540613700645725020376 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2007, 2009, 2010, 2011, 2012, 2013, 2016 Free Software Foundation, Inc. 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 3 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, see . */ #include #include "language/data-io/data-parser.h" #include #include #include "data/casereader-provider.h" #include "data/data-in.h" #include "data/dataset.h" #include "data/dictionary.h" #include "data/format.h" #include "data/file-handle-def.h" #include "data/settings.h" #include "language/data-io/data-reader.h" #include "libpspp/message.h" #include "libpspp/str.h" #include "output/pivot-table.h" #include "gl/xalloc.h" #include "gettext.h" #define N_(msgid) msgid #define _(msgid) gettext (msgid) /* Data parser for textual data like that read by DATA LIST. */ struct data_parser { struct dictionary *dict; /* Dictionary of destination */ enum data_parser_type type; /* Type of data to parse. */ int skip_records; /* Records to skip before first real data. */ struct field *fields; /* Fields to parse. */ size_t field_cnt; /* Number of fields. */ size_t field_allocated; /* Number of fields spaced allocated for. */ /* DP_DELIMITED parsers only. */ bool span; /* May cases span multiple records? */ bool empty_line_has_field; /* Does an empty line have an (empty) field? */ bool warn_missing_fields; /* Should missing fields be considered errors? */ struct substring quotes; /* Characters that can quote separators. */ bool quote_escape; /* Doubled quote acts as escape? */ struct substring soft_seps; /* Two soft separators act like just one. */ struct substring hard_seps; /* Two hard separators yield empty fields. */ struct string any_sep; /* Concatenation of soft_seps and hard_seps. */ /* DP_FIXED parsers only. */ int records_per_case; /* Number of records in each case. */ }; /* How to parse one variable. */ struct field { struct fmt_spec format; /* Input format of this field. */ int case_idx; /* First value in case. */ char *name; /* Var name for error messages and tables. */ /* DP_FIXED only. */ int record; /* Record number (1-based). */ int first_column; /* First column in record (1-based). */ }; static void set_any_sep (struct data_parser *parser); /* Creates and returns a new data parser. */ struct data_parser * data_parser_create (struct dictionary *dict) { struct data_parser *parser = xmalloc (sizeof *parser); parser->type = DP_FIXED; parser->skip_records = 0; parser->fields = NULL; parser->field_cnt = 0; parser->field_allocated = 0; parser->dict = dict_ref (dict); parser->span = true; parser->empty_line_has_field = false; parser->warn_missing_fields = true; ss_alloc_substring (&parser->quotes, ss_cstr ("\"'")); parser->quote_escape = false; ss_alloc_substring (&parser->soft_seps, ss_cstr (CC_SPACES)); ss_alloc_substring (&parser->hard_seps, ss_cstr (",")); ds_init_empty (&parser->any_sep); set_any_sep (parser); parser->records_per_case = 0; return parser; } /* Destroys PARSER. */ void data_parser_destroy (struct data_parser *parser) { if (parser != NULL) { size_t i; dict_unref (parser->dict); for (i = 0; i < parser->field_cnt; i++) free (parser->fields[i].name); free (parser->fields); ss_dealloc (&parser->quotes); ss_dealloc (&parser->soft_seps); ss_dealloc (&parser->hard_seps); ds_destroy (&parser->any_sep); free (parser); } } /* Returns the type of PARSER (either DP_DELIMITED or DP_FIXED). */ enum data_parser_type data_parser_get_type (const struct data_parser *parser) { return parser->type; } /* Sets the type of PARSER to TYPE (either DP_DELIMITED or DP_FIXED). */ void data_parser_set_type (struct data_parser *parser, enum data_parser_type type) { assert (parser->field_cnt == 0); assert (type == DP_FIXED || type == DP_DELIMITED); parser->type = type; } /* Configures PARSER to skip the specified number of INITIAL_RECORDS_TO_SKIP before parsing any data. By default, no records are skipped. */ void data_parser_set_skip (struct data_parser *parser, int initial_records_to_skip) { assert (initial_records_to_skip >= 0); parser->skip_records = initial_records_to_skip; } /* Returns true if PARSER is configured to allow cases to span multiple records. */ bool data_parser_get_span (const struct data_parser *parser) { return parser->span; } /* If MAY_CASES_SPAN_RECORDS is true, configures PARSER to allow a single case to span multiple records and multiple cases to occupy a single record. If MAY_CASES_SPAN_RECORDS is false, configures PARSER to require each record to contain exactly one case. This setting affects parsing of DP_DELIMITED files only. */ void data_parser_set_span (struct data_parser *parser, bool may_cases_span_records) { parser->span = may_cases_span_records; } /* If EMPTY_LINE_HAS_FIELD is true, configures PARSER to parse an empty line as an empty field and to treat a hard delimiter followed by end-of-line as an empty field. If EMPTY_LINE_HAS_FIELD is false, PARSER will skip empty lines and hard delimiters at the end of lines without emitting empty fields. This setting affects parsing of DP_DELIMITED files only. */ void data_parser_set_empty_line_has_field (struct data_parser *parser, bool empty_line_has_field) { parser->empty_line_has_field = empty_line_has_field; } /* If WARN_MISSING_FIELDS is true, configures PARSER to emit a warning and cause an error condition when a missing field is encountered. If WARN_MISSING_FIELDS is false, PARSER will silently fill such fields with the system missing value. This setting affects parsing of DP_DELIMITED files only. */ void data_parser_set_warn_missing_fields (struct data_parser *parser, bool warn_missing_fields) { parser->warn_missing_fields = warn_missing_fields; } /* Sets the characters that may be used for quoting field contents to QUOTES. If QUOTES is empty, quoting will be disabled. The caller retains ownership of QUOTES. This setting affects parsing of DP_DELIMITED files only. */ void data_parser_set_quotes (struct data_parser *parser, struct substring quotes) { ss_dealloc (&parser->quotes); ss_alloc_substring (&parser->quotes, quotes); } /* If ESCAPE is false (the default setting), a character used for quoting cannot itself be embedded within a quoted field. If ESCAPE is true, then a quote character can be embedded within a quoted field by doubling it. This setting affects parsing of DP_DELIMITED files only, and only when at least one quote character has been set (with data_parser_set_quotes). */ void data_parser_set_quote_escape (struct data_parser *parser, bool escape) { parser->quote_escape = escape; } /* Sets PARSER's soft delimiters to DELIMITERS. Soft delimiters separate fields, but consecutive soft delimiters do not yield empty fields. (Ordinarily, only white space characters are appropriate soft delimiters.) The caller retains ownership of DELIMITERS. This setting affects parsing of DP_DELIMITED files only. */ void data_parser_set_soft_delimiters (struct data_parser *parser, struct substring delimiters) { ss_dealloc (&parser->soft_seps); ss_alloc_substring (&parser->soft_seps, delimiters); set_any_sep (parser); } /* Sets PARSER's hard delimiters to DELIMITERS. Hard delimiters separate fields. A consecutive pair of hard delimiters yield an empty field. The caller retains ownership of DELIMITERS. This setting affects parsing of DP_DELIMITED files only. */ void data_parser_set_hard_delimiters (struct data_parser *parser, struct substring delimiters) { ss_dealloc (&parser->hard_seps); ss_alloc_substring (&parser->hard_seps, delimiters); set_any_sep (parser); } /* Returns the number of records per case. */ int data_parser_get_records (const struct data_parser *parser) { return parser->records_per_case; } /* Sets the number of records per case to RECORDS_PER_CASE. This setting affects parsing of DP_FIXED files only. */ void data_parser_set_records (struct data_parser *parser, int records_per_case) { assert (records_per_case >= 0); assert (records_per_case >= parser->records_per_case); parser->records_per_case = records_per_case; } static void add_field (struct data_parser *p, const struct fmt_spec *format, int case_idx, const char *name, int record, int first_column) { struct field *field; if (p->field_cnt == p->field_allocated) p->fields = x2nrealloc (p->fields, &p->field_allocated, sizeof *p->fields); field = &p->fields[p->field_cnt++]; field->format = *format; field->case_idx = case_idx; field->name = xstrdup (name); field->record = record; field->first_column = first_column; } /* Adds a delimited field to the field parsed by PARSER, which must be configured as a DP_DELIMITED parser. The field is parsed as input format FORMAT. Its data will be stored into case index CASE_INDEX. Errors in input data will be reported against variable NAME. */ void data_parser_add_delimited_field (struct data_parser *parser, const struct fmt_spec *format, int case_idx, const char *name) { assert (parser->type == DP_DELIMITED); add_field (parser, format, case_idx, name, 0, 0); } /* Adds a fixed field to the field parsed by PARSER, which must be configured as a DP_FIXED parser. The field is parsed as input format FORMAT. Its data will be stored into case index CASE_INDEX. Errors in input data will be reported against variable NAME. The field will be drawn from the FORMAT->w columns in 1-based RECORD starting at 1-based column FIRST_COLUMN. RECORD must be at least as great as that of any field already added; that is, fields must be added in increasing order of record number. If RECORD is greater than the current number of records per case, the number of records per case are increased as needed. */ void data_parser_add_fixed_field (struct data_parser *parser, const struct fmt_spec *format, int case_idx, const char *name, int record, int first_column) { assert (parser->type == DP_FIXED); assert (parser->field_cnt == 0 || record >= parser->fields[parser->field_cnt - 1].record); if (record > parser->records_per_case) parser->records_per_case = record; add_field (parser, format, case_idx, name, record, first_column); } /* Returns true if any fields have been added to PARSER, false otherwise. */ bool data_parser_any_fields (const struct data_parser *parser) { return parser->field_cnt > 0; } static void set_any_sep (struct data_parser *parser) { ds_assign_substring (&parser->any_sep, parser->soft_seps); ds_put_substring (&parser->any_sep, parser->hard_seps); } static bool parse_delimited_span (const struct data_parser *, struct dfm_reader *, struct ccase *); static bool parse_delimited_no_span (const struct data_parser *, struct dfm_reader *, struct ccase *); static bool parse_fixed (const struct data_parser *, struct dfm_reader *, struct ccase *); /* Reads a case from DFM into C, parsing it with PARSER. Returns true if successful, false at end of file or on I/O error. Case C must not be shared. */ bool data_parser_parse (struct data_parser *parser, struct dfm_reader *reader, struct ccase *c) { bool retval; assert (!case_is_shared (c)); assert (data_parser_any_fields (parser)); /* Skip the requested number of records before reading the first case. */ for (; parser->skip_records > 0; parser->skip_records--) { if (dfm_eof (reader)) return false; dfm_forward_record (reader); } /* Limit cases. */ if (parser->type == DP_DELIMITED) { if (parser->span) retval = parse_delimited_span (parser, reader, c); else retval = parse_delimited_no_span (parser, reader, c); } else retval = parse_fixed (parser, reader, c); return retval; } /* Extracts a delimited field from the current position in the current record according to PARSER, reading data from READER. *FIELD is set to the field content. The caller must not or destroy this constant string. Sets *FIRST_COLUMN to the 1-based column number of the start of the extracted field, and *LAST_COLUMN to the end of the extracted field. Returns true on success, false on failure. */ static bool cut_field (const struct data_parser *parser, struct dfm_reader *reader, int *first_column, int *last_column, struct string *tmp, struct substring *field) { size_t length_before_separators; struct substring line, p; bool quoted; if (dfm_eof (reader)) return false; if (ss_is_empty (parser->hard_seps)) dfm_expand_tabs (reader); line = p = dfm_get_record (reader); /* Skip leading soft separators. */ ss_ltrim (&p, parser->soft_seps); /* Handle empty or completely consumed lines. */ if (ss_is_empty (p)) { if (!parser->empty_line_has_field || dfm_columns_past_end (reader) > 0) return false; else { *field = p; *first_column = dfm_column_start (reader); *last_column = *first_column + 1; dfm_forward_columns (reader, 1); return true; } } *first_column = dfm_column_start (reader); quoted = ss_find_byte (parser->quotes, ss_first (p)) != SIZE_MAX; if (quoted) { /* Quoted field. */ int quote = ss_get_byte (&p); if (!ss_get_until (&p, quote, field)) msg (DW, _("Quoted string extends beyond end of line.")); if (parser->quote_escape && ss_first (p) == quote) { ds_assign_substring (tmp, *field); while (ss_match_byte (&p, quote)) { struct substring ss; ds_put_byte (tmp, quote); if (!ss_get_until (&p, quote, &ss)) msg (DW, _("Quoted string extends beyond end of line.")); ds_put_substring (tmp, ss); } *field = ds_ss (tmp); } *last_column = *first_column + (ss_length (line) - ss_length (p)); } else { /* Regular field. */ ss_get_bytes (&p, ss_cspan (p, ds_ss (&parser->any_sep)), field); *last_column = *first_column + ss_length (*field); } /* Skip trailing soft separator and a single hard separator if present. */ length_before_separators = ss_length (p); ss_ltrim (&p, parser->soft_seps); if (!ss_is_empty (p) && ss_find_byte (parser->hard_seps, ss_first (p)) != SIZE_MAX) { ss_advance (&p, 1); ss_ltrim (&p, parser->soft_seps); } if (ss_is_empty (p)) dfm_forward_columns (reader, 1); else if (quoted && length_before_separators == ss_length (p)) msg (DW, _("Missing delimiter following quoted string.")); dfm_forward_columns (reader, ss_length (line) - ss_length (p)); return true; } static void parse_error (const struct dfm_reader *reader, const struct field *field, int first_column, int last_column, char *error) { struct msg m = { .category = MSG_C_DATA, .severity = MSG_S_WARNING, .file_name = CONST_CAST (char *, dfm_get_file_name (reader)), .first_line = dfm_get_line_number (reader), .last_line = m.first_line + 1, .first_column = first_column, .last_column = last_column, .text = xasprintf (_("Data for variable %s is not valid as format %s: %s"), field->name, fmt_name (field->format.type), error), }; msg_emit (&m); free (error); } /* Reads a case from READER into C, parsing it according to fixed-format syntax rules in PARSER. Returns true if successful, false at end of file or on I/O error. */ static bool parse_fixed (const struct data_parser *parser, struct dfm_reader *reader, struct ccase *c) { const char *input_encoding = dfm_reader_get_encoding (reader); const char *output_encoding = dict_get_encoding (parser->dict); struct field *f; int row; if (dfm_eof (reader)) return false; f = parser->fields; for (row = 1; row <= parser->records_per_case; row++) { struct substring line; if (dfm_eof (reader)) { msg (DW, _("Partial case of %d of %d records discarded."), row - 1, parser->records_per_case); return false; } dfm_expand_tabs (reader); line = dfm_get_record (reader); for (; f < &parser->fields[parser->field_cnt] && f->record == row; f++) { struct substring s = ss_substr (line, f->first_column - 1, f->format.w); union value *value = case_data_rw_idx (c, f->case_idx); char *error = data_in (s, input_encoding, f->format.type, value, fmt_var_width (&f->format), output_encoding); if (error == NULL) data_in_imply_decimals (s, input_encoding, f->format.type, f->format.d, value); else parse_error (reader, f, f->first_column, f->first_column + f->format.w, error); } dfm_forward_record (reader); } return true; } /* Reads a case from READER into C, parsing it according to free-format syntax rules in PARSER. Returns true if successful, false at end of file or on I/O error. */ static bool parse_delimited_span (const struct data_parser *parser, struct dfm_reader *reader, struct ccase *c) { const char *output_encoding = dict_get_encoding (parser->dict); struct string tmp = DS_EMPTY_INITIALIZER; struct field *f; for (f = parser->fields; f < &parser->fields[parser->field_cnt]; f++) { struct substring s; int first_column, last_column; char *error; /* Cut out a field and read in a new record if necessary. */ while (!cut_field (parser, reader, &first_column, &last_column, &tmp, &s)) { if (!dfm_eof (reader)) dfm_forward_record (reader); if (dfm_eof (reader)) { if (f > parser->fields) msg (DW, _("Partial case discarded. The first variable " "missing was %s."), f->name); ds_destroy (&tmp); return false; } } const char *input_encoding = dfm_reader_get_encoding (reader); error = data_in (s, input_encoding, f->format.type, case_data_rw_idx (c, f->case_idx), fmt_var_width (&f->format), output_encoding); if (error != NULL) parse_error (reader, f, first_column, last_column, error); } ds_destroy (&tmp); return true; } /* Reads a case from READER into C, parsing it according to delimited syntax rules with one case per record in PARSER. Returns true if successful, false at end of file or on I/O error. */ static bool parse_delimited_no_span (const struct data_parser *parser, struct dfm_reader *reader, struct ccase *c) { const char *output_encoding = dict_get_encoding (parser->dict); struct string tmp = DS_EMPTY_INITIALIZER; struct substring s; struct field *f, *end; if (dfm_eof (reader)) return false; end = &parser->fields[parser->field_cnt]; for (f = parser->fields; f < end; f++) { int first_column, last_column; char *error; if (!cut_field (parser, reader, &first_column, &last_column, &tmp, &s)) { if (f < end - 1 && settings_get_undefined () && parser->warn_missing_fields) msg (DW, _("Missing value(s) for all variables from %s onward. " "These will be filled with the system-missing value " "or blanks, as appropriate."), f->name); for (; f < end; f++) value_set_missing (case_data_rw_idx (c, f->case_idx), fmt_var_width (&f->format)); goto exit; } const char *input_encoding = dfm_reader_get_encoding (reader); error = data_in (s, input_encoding, f->format.type, case_data_rw_idx (c, f->case_idx), fmt_var_width (&f->format), output_encoding); if (error != NULL) parse_error (reader, f, first_column, last_column, error); } s = dfm_get_record (reader); ss_ltrim (&s, parser->soft_seps); if (!ss_is_empty (s)) msg (DW, _("Record ends in data not part of any field.")); exit: dfm_forward_record (reader); ds_destroy (&tmp); return true; } /* Displays a table giving information on fixed-format variable parsing on DATA LIST. */ static void dump_fixed_table (const struct data_parser *parser, const struct file_handle *fh) { /* XXX This should not be preformatted. */ char *title = xasprintf (ngettext ("Reading %d record from %s.", "Reading %d records from %s.", parser->records_per_case), parser->records_per_case, fh_get_name (fh)); struct pivot_table *table = pivot_table_create__ ( pivot_value_new_user_text (title, -1), "Fixed Data Records"); free (title); pivot_dimension_create ( table, PIVOT_AXIS_COLUMN, N_("Attributes"), N_("Record"), N_("Columns"), N_("Format")); struct pivot_dimension *variables = pivot_dimension_create ( table, PIVOT_AXIS_ROW, N_("Variable")); variables->root->show_label = true; for (size_t i = 0; i < parser->field_cnt; i++) { struct field *f = &parser->fields[i]; /* XXX It would be better to have the actual variable here. */ int variable_idx = pivot_category_create_leaf ( variables->root, pivot_value_new_user_text (f->name, -1)); pivot_table_put2 (table, 0, variable_idx, pivot_value_new_integer (f->record)); int first_column = f->first_column; int last_column = f->first_column + f->format.w - 1; char *columns = xasprintf ("%3d-%3d", first_column, last_column); pivot_table_put2 (table, 1, variable_idx, pivot_value_new_user_text (columns, -1)); free (columns); char str[FMT_STRING_LEN_MAX + 1]; pivot_table_put2 (table, 2, variable_idx, pivot_value_new_user_text ( fmt_to_string (&f->format, str), -1)); } pivot_table_submit (table); } /* Displays a table giving information on free-format variable parsing on DATA LIST. */ static void dump_delimited_table (const struct data_parser *parser, const struct file_handle *fh) { struct pivot_table *table = pivot_table_create__ ( pivot_value_new_text_format (N_("Reading free-form data from %s."), fh_get_name (fh)), "Free-Form Data Records"); pivot_dimension_create ( table, PIVOT_AXIS_COLUMN, N_("Attributes"), N_("Format")); struct pivot_dimension *variables = pivot_dimension_create ( table, PIVOT_AXIS_ROW, N_("Variable")); variables->root->show_label = true; for (size_t i = 0; i < parser->field_cnt; i++) { struct field *f = &parser->fields[i]; /* XXX It would be better to have the actual variable here. */ int variable_idx = pivot_category_create_leaf ( variables->root, pivot_value_new_user_text (f->name, -1)); char str[FMT_STRING_LEN_MAX + 1]; pivot_table_put2 (table, 0, variable_idx, pivot_value_new_user_text ( fmt_to_string (&f->format, str), -1)); } pivot_table_submit (table); } /* Displays a table giving information on how PARSER will read data from FH. */ void data_parser_output_description (struct data_parser *parser, const struct file_handle *fh) { if (parser->type == DP_FIXED) dump_fixed_table (parser, fh); else dump_delimited_table (parser, fh); } /* Data parser input program. */ struct data_parser_casereader { struct data_parser *parser; /* Parser. */ struct dfm_reader *reader; /* Data file reader. */ struct caseproto *proto; /* Format of cases. */ }; static const struct casereader_class data_parser_casereader_class; /* Replaces DS's active dataset by an input program that reads data from READER according to the rules in PARSER, using DICT as the underlying dictionary. Ownership of PARSER and READER is transferred to the input program, and ownership of DICT is transferred to the dataset. */ void data_parser_make_active_file (struct data_parser *parser, struct dataset *ds, struct dfm_reader *reader, struct dictionary *dict, struct casereader* (*func)(struct casereader *, const struct dictionary *, void *), void *ud) { struct data_parser_casereader *r; struct casereader *casereader0; struct casereader *casereader1; r = xmalloc (sizeof *r); r->parser = parser; r->reader = reader; r->proto = caseproto_ref (dict_get_proto (dict)); casereader0 = casereader_create_sequential (NULL, r->proto, CASENUMBER_MAX, &data_parser_casereader_class, r); if (func) casereader1 = func (casereader0, dict, ud); else casereader1 = casereader0; dataset_set_dict (ds, dict); dataset_set_source (ds, casereader1); } static struct ccase * data_parser_casereader_read (struct casereader *reader UNUSED, void *r_) { struct data_parser_casereader *r = r_; struct ccase *c = case_create (r->proto); if (data_parser_parse (r->parser, r->reader, c)) return c; else { case_unref (c); return NULL; } } static void data_parser_casereader_destroy (struct casereader *reader, void *r_) { struct data_parser_casereader *r = r_; if (dfm_reader_error (r->reader)) casereader_force_error (reader); dfm_close_reader (r->reader); caseproto_unref (r->proto); data_parser_destroy (r->parser); free (r); } static const struct casereader_class data_parser_casereader_class = { data_parser_casereader_read, data_parser_casereader_destroy, NULL, NULL, }; pspp-1.4.1/src/language/data-io/print-space.c0000644000175000017500000000765213547776540020430 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2006, 2009, 2010, 2011, 2012 Free Software Foundation, Inc. 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 3 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, see . */ #include #include #include #include "data/dataset.h" #include "data/value.h" #include "language/command.h" #include "language/data-io/data-writer.h" #include "language/data-io/file-handle.h" #include "language/expressions/public.h" #include "language/lexer/lexer.h" #include "libpspp/message.h" #include "output/text-item.h" #include "gl/xalloc.h" #include "gettext.h" #define _(msgid) gettext (msgid) /* PRINT SPACE transformation. */ struct print_space_trns { struct dfm_writer *writer; /* Output data file. */ struct expression *expr; /* Number of lines; NULL means 1. */ }; static trns_proc_func print_space_trns_proc; static trns_free_func print_space_trns_free; int cmd_print_space (struct lexer *lexer, struct dataset *ds) { struct print_space_trns *trns; struct file_handle *handle = NULL; struct expression *expr = NULL; struct dfm_writer *writer; char *encoding = NULL; if (lex_match_id (lexer, "OUTFILE")) { lex_match (lexer, T_EQUALS); handle = fh_parse (lexer, FH_REF_FILE, NULL); if (handle == NULL) return CMD_FAILURE; if (lex_match_id (lexer, "ENCODING")) { lex_match (lexer, T_EQUALS); if (!lex_force_string (lexer)) goto error; encoding = ss_xstrdup (lex_tokss (lexer)); lex_get (lexer); } } else handle = NULL; if (lex_token (lexer) != T_ENDCMD) { expr = expr_parse (lexer, ds, EXPR_NUMBER); if (lex_token (lexer) != T_ENDCMD) { lex_error (lexer, _("expecting end of command")); goto error; } } else expr = NULL; if (handle != NULL) { writer = dfm_open_writer (handle, encoding); if (writer == NULL) goto error; } else writer = NULL; trns = xmalloc (sizeof *trns); trns->writer = writer; trns->expr = expr; add_transformation (ds, print_space_trns_proc, print_space_trns_free, trns); fh_unref (handle); return CMD_SUCCESS; error: fh_unref (handle); expr_free (expr); return CMD_FAILURE; } /* Executes a PRINT SPACE transformation. */ static int print_space_trns_proc (void *t_, struct ccase **c, casenumber case_num UNUSED) { struct print_space_trns *trns = t_; int n; n = 1; if (trns->expr) { double f = expr_evaluate_num (trns->expr, *c, case_num); if (f == SYSMIS) msg (SW, _("The expression on %s evaluated to the " "system-missing value."), "PRINT SPACE"); else if (f < 0 || f > INT_MAX) msg (SW, _("The expression on %s evaluated to %g."), "PRINT SPACE", f); else n = f; } while (n--) if (trns->writer == NULL) text_item_submit (text_item_create (TEXT_ITEM_LOG, "")); else dfm_put_record (trns->writer, " ", 1); /* XXX */ if (trns->writer != NULL && dfm_write_error (trns->writer)) return TRNS_ERROR; return TRNS_CONTINUE; } /* Frees a PRINT SPACE transformation. Returns true if successful, false if an I/O error occurred. */ static bool print_space_trns_free (void *trns_) { struct print_space_trns *trns = trns_; bool ok = dfm_close_writer (trns->writer); expr_free (trns->expr); free (trns); return ok; } pspp-1.4.1/src/language/data-io/print.c0000644000175000017500000005061513602145300017304 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 1997-9, 2000, 2006, 2009, 2010, 2011, 2012 Free Software Foundation, Inc. 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 3 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, see . */ #include #include #include #include "data/case.h" #include "data/dataset.h" #include "data/data-out.h" #include "data/format.h" #include "data/transformations.h" #include "data/variable.h" #include "language/command.h" #include "language/data-io/data-writer.h" #include "language/data-io/file-handle.h" #include "language/data-io/placement-parser.h" #include "language/lexer/format-parser.h" #include "language/lexer/lexer.h" #include "language/lexer/variable-parser.h" #include "libpspp/assertion.h" #include "libpspp/compiler.h" #include "libpspp/i18n.h" #include "libpspp/ll.h" #include "libpspp/message.h" #include "libpspp/misc.h" #include "libpspp/pool.h" #include "libpspp/u8-line.h" #include "output/pivot-table.h" #include "output/table.h" #include "output/text-item.h" #include "gl/xalloc.h" #include "gettext.h" #define N_(msgid) msgid #define _(msgid) gettext (msgid) /* Describes what to do when an output field is encountered. */ enum field_type { PRT_LITERAL, /* Literal string. */ PRT_VAR /* Variable. */ }; /* Describes how to output one field. */ struct prt_out_spec { /* All fields. */ struct ll ll; /* In struct print_trns `specs' list. */ enum field_type type; /* What type of field this is. */ int record; /* 1-based record number. */ int first_column; /* 0-based first column. */ /* PRT_VAR only. */ const struct variable *var; /* Associated variable. */ struct fmt_spec format; /* Output spec. */ bool add_space; /* Add trailing space? */ bool sysmis_as_spaces; /* Output SYSMIS as spaces? */ /* PRT_LITERAL only. */ struct string string; /* String to output. */ int width; /* Width of 'string', in display columns. */ }; /* PRINT, PRINT EJECT, WRITE private data structure. */ struct print_trns { struct pool *pool; /* Stores related data. */ bool eject; /* Eject page before printing? */ bool include_prefix; /* Prefix lines with space? */ const char *encoding; /* Encoding to use for output. */ struct dfm_writer *writer; /* Output file, NULL=listing file. */ struct ll_list specs; /* List of struct prt_out_specs. */ size_t record_cnt; /* Number of records to write. */ }; enum which_formats { PRINT, WRITE }; static int internal_cmd_print (struct lexer *, struct dataset *ds, enum which_formats, bool eject); static trns_proc_func print_text_trns_proc, print_binary_trns_proc; static trns_free_func print_trns_free; static bool parse_specs (struct lexer *, struct pool *tmp_pool, struct print_trns *, struct dictionary *dict, enum which_formats); static void dump_table (struct print_trns *); /* Basic parsing. */ /* Parses PRINT command. */ int cmd_print (struct lexer *lexer, struct dataset *ds) { return internal_cmd_print (lexer, ds, PRINT, false); } /* Parses PRINT EJECT command. */ int cmd_print_eject (struct lexer *lexer, struct dataset *ds) { return internal_cmd_print (lexer, ds, PRINT, true); } /* Parses WRITE command. */ int cmd_write (struct lexer *lexer, struct dataset *ds) { return internal_cmd_print (lexer, ds, WRITE, false); } /* Parses the output commands. */ static int internal_cmd_print (struct lexer *lexer, struct dataset *ds, enum which_formats which_formats, bool eject) { bool print_table = false; const struct prt_out_spec *spec; struct print_trns *trns; struct file_handle *fh = NULL; char *encoding = NULL; struct pool *tmp_pool; bool binary; /* Fill in prt to facilitate error-handling. */ trns = pool_create_container (struct print_trns, pool); trns->eject = eject; trns->writer = NULL; trns->record_cnt = 0; ll_init (&trns->specs); tmp_pool = pool_create_subpool (trns->pool); /* Parse the command options. */ while (lex_token (lexer) != T_SLASH && lex_token (lexer) != T_ENDCMD) { if (lex_match_id (lexer, "OUTFILE")) { lex_match (lexer, T_EQUALS); fh = fh_parse (lexer, FH_REF_FILE, NULL); if (fh == NULL) goto error; } else if (lex_match_id (lexer, "ENCODING")) { lex_match (lexer, T_EQUALS); if (!lex_force_string (lexer)) goto error; free (encoding); encoding = ss_xstrdup (lex_tokss (lexer)); lex_get (lexer); } else if (lex_match_id (lexer, "RECORDS")) { lex_match (lexer, T_EQUALS); lex_match (lexer, T_LPAREN); if (!lex_force_int (lexer)) goto error; trns->record_cnt = lex_integer (lexer); lex_get (lexer); lex_match (lexer, T_RPAREN); } else if (lex_match_id (lexer, "TABLE")) print_table = true; else if (lex_match_id (lexer, "NOTABLE")) print_table = false; else { lex_error (lexer, _("expecting a valid subcommand")); goto error; } } /* When PRINT or PRINT EJECT writes to an external file, we prefix each line with a space for compatibility. */ trns->include_prefix = which_formats == PRINT && fh != NULL; /* Parse variables and strings. */ if (!parse_specs (lexer, tmp_pool, trns, dataset_dict (ds), which_formats)) goto error; /* Are there any binary formats? There are real difficulties figuring out what to do when both binary formats and nontrivial encodings enter the picture. So when binary formats are present we fall back to much simpler handling. */ binary = false; ll_for_each (spec, struct prt_out_spec, ll, &trns->specs) { if (spec->type == PRT_VAR && fmt_get_category (spec->format.type) == FMT_CAT_BINARY) { binary = true; break; } } if (binary && fh == NULL) { msg (SE, _("%s is required when binary formats are specified."), "OUTFILE"); goto error; } if (lex_end_of_command (lexer) != CMD_SUCCESS) goto error; if (fh != NULL) { trns->writer = dfm_open_writer (fh, encoding); if (trns->writer == NULL) goto error; trns->encoding = dfm_writer_get_encoding (trns->writer); } else trns->encoding = UTF8; /* Output the variable table if requested. */ if (print_table) dump_table (trns); /* Put the transformation in the queue. */ add_transformation (ds, (binary ? print_binary_trns_proc : print_text_trns_proc), print_trns_free, trns); pool_destroy (tmp_pool); fh_unref (fh); return CMD_SUCCESS; error: print_trns_free (trns); fh_unref (fh); return CMD_FAILURE; } static bool parse_string_argument (struct lexer *, struct print_trns *, int record, int *column); static bool parse_variable_argument (struct lexer *, const struct dictionary *, struct print_trns *, struct pool *tmp_pool, int *record, int *column, enum which_formats); /* Parses all the variable and string specifications on a single PRINT, PRINT EJECT, or WRITE command into the prt structure. Returns success. */ static bool parse_specs (struct lexer *lexer, struct pool *tmp_pool, struct print_trns *trns, struct dictionary *dict, enum which_formats which_formats) { int record = 0; int column = 1; if (lex_token (lexer) == T_ENDCMD) { trns->record_cnt = 1; return true; } while (lex_token (lexer) != T_ENDCMD) { bool ok; if (!parse_record_placement (lexer, &record, &column)) return false; if (lex_is_string (lexer)) ok = parse_string_argument (lexer, trns, record, &column); else ok = parse_variable_argument (lexer, dict, trns, tmp_pool, &record, &column, which_formats); if (!ok) return 0; lex_match (lexer, T_COMMA); } if (trns->record_cnt != 0 && trns->record_cnt != record) msg (SW, _("Output calls for %d records but %zu specified on RECORDS " "subcommand."), record, trns->record_cnt); trns->record_cnt = record; return true; } /* Parses a string argument to the PRINT commands. Returns success. */ static bool parse_string_argument (struct lexer *lexer, struct print_trns *trns, int record, int *column) { struct prt_out_spec *spec = pool_alloc (trns->pool, sizeof *spec); spec->type = PRT_LITERAL; spec->record = record; spec->first_column = *column; ds_init_substring (&spec->string, lex_tokss (lexer)); ds_register_pool (&spec->string, trns->pool); lex_get (lexer); /* Parse the included column range. */ if (lex_is_number (lexer)) { int first_column, last_column; bool range_specified; if (!parse_column_range (lexer, 1, &first_column, &last_column, &range_specified)) return false; spec->first_column = first_column; if (range_specified) ds_set_length (&spec->string, last_column - first_column + 1, ' '); } spec->width = u8_strwidth (CHAR_CAST (const uint8_t *, ds_cstr (&spec->string)), UTF8); *column = spec->first_column + spec->width; ll_push_tail (&trns->specs, &spec->ll); return true; } /* Parses a variable argument to the PRINT commands by passing it off to fixed_parse_compatible() or fixed_parse_fortran() as appropriate. Returns success. */ static bool parse_variable_argument (struct lexer *lexer, const struct dictionary *dict, struct print_trns *trns, struct pool *tmp_pool, int *record, int *column, enum which_formats which_formats) { const struct variable **vars; size_t var_cnt, var_idx; struct fmt_spec *formats, *f; size_t format_cnt; bool add_space; if (!parse_variables_const_pool (lexer, tmp_pool, dict, &vars, &var_cnt, PV_DUPLICATE)) return false; if (lex_is_number (lexer) || lex_token (lexer) == T_LPAREN) { if (!parse_var_placements (lexer, tmp_pool, var_cnt, FMT_FOR_OUTPUT, &formats, &format_cnt)) return false; add_space = false; } else { size_t i; lex_match (lexer, T_ASTERISK); formats = pool_nmalloc (tmp_pool, var_cnt, sizeof *formats); format_cnt = var_cnt; for (i = 0; i < var_cnt; i++) { const struct variable *v = vars[i]; formats[i] = (which_formats == PRINT ? *var_get_print_format (v) : *var_get_write_format (v)); } add_space = which_formats == PRINT; } var_idx = 0; for (f = formats; f < &formats[format_cnt]; f++) if (!execute_placement_format (f, record, column)) { const struct variable *var; struct prt_out_spec *spec; var = vars[var_idx++]; if (!fmt_check_width_compat (f, var_get_width (var))) return false; spec = pool_alloc (trns->pool, sizeof *spec); spec->type = PRT_VAR; spec->record = *record; spec->first_column = *column; spec->var = var; spec->format = *f; spec->add_space = add_space; /* This is a completely bizarre twist for compatibility: WRITE outputs the system-missing value as a field filled with spaces, instead of using the normal format that usually contains a period. */ spec->sysmis_as_spaces = (which_formats == WRITE && var_is_numeric (var) && (fmt_get_category (spec->format.type) != FMT_CAT_BINARY)); ll_push_tail (&trns->specs, &spec->ll); *column += f->w + add_space; } assert (var_idx == var_cnt); return true; } /* Prints the table produced by the TABLE subcommand to the listing file. */ static void dump_table (struct print_trns *trns) { struct pivot_table *table = pivot_table_create (N_("Print Summary")); pivot_dimension_create (table, PIVOT_AXIS_COLUMN, N_("Attributes"), N_("Record"), N_("Columns"), N_("Format")); struct pivot_dimension *variables = pivot_dimension_create ( table, PIVOT_AXIS_ROW, N_("Variable")); struct prt_out_spec *spec; ll_for_each (spec, struct prt_out_spec, ll, &trns->specs) { if (spec->type != PRT_VAR) continue; int row = pivot_category_create_leaf ( variables->root, pivot_value_new_variable (spec->var)); pivot_table_put2 (table, 0, row, pivot_value_new_integer (spec->record)); int last_column = spec->first_column + spec->format.w - 1; pivot_table_put2 (table, 1, row, pivot_value_new_user_text_nocopy ( xasprintf ("%3d-%3d", spec->first_column, last_column))); char fmt_string[FMT_STRING_LEN_MAX + 1]; pivot_table_put2 (table, 2, row, pivot_value_new_user_text ( fmt_to_string (&spec->format, fmt_string), -1)); } int row = pivot_category_create_leaf ( variables->root, pivot_value_new_text (N_("N of Records"))); pivot_table_put2 (table, 0, row, pivot_value_new_integer (trns->record_cnt)); pivot_table_submit (table); } /* Transformation, for all-text output. */ static void print_text_flush_records (struct print_trns *, struct u8_line *, int target_record, bool *eject, int *record); /* Performs the transformation inside print_trns T on case C. */ static int print_text_trns_proc (void *trns_, struct ccase **c, casenumber case_num UNUSED) { struct print_trns *trns = trns_; struct prt_out_spec *spec; struct u8_line line; bool eject = trns->eject; int record = 1; u8_line_init (&line); ll_for_each (spec, struct prt_out_spec, ll, &trns->specs) { int x0 = spec->first_column; print_text_flush_records (trns, &line, spec->record, &eject, &record); u8_line_set_length (&line, spec->first_column); if (spec->type == PRT_VAR) { const union value *input = case_data (*c, spec->var); int x1; if (!spec->sysmis_as_spaces || input->f != SYSMIS) { size_t len; int width; char *s; s = data_out (input, var_get_encoding (spec->var), &spec->format); len = strlen (s); width = u8_width (CHAR_CAST (const uint8_t *, s), len, UTF8); x1 = x0 + width; u8_line_put (&line, x0, x1, s, len); free (s); } else { int n = spec->format.w; x1 = x0 + n; memset (u8_line_reserve (&line, x0, x1, n), ' ', n); } if (spec->add_space) *u8_line_reserve (&line, x1, x1 + 1, 1) = ' '; } else { const struct string *s = &spec->string; u8_line_put (&line, x0, x0 + spec->width, ds_data (s), ds_length (s)); } } print_text_flush_records (trns, &line, trns->record_cnt + 1, &eject, &record); u8_line_destroy (&line); if (trns->writer != NULL && dfm_write_error (trns->writer)) return TRNS_ERROR; return TRNS_CONTINUE; } /* Advance from *RECORD to TARGET_RECORD, outputting records along the way. If *EJECT is true, then the first record output is preceded by ejecting the page (and *EJECT is set false). */ static void print_text_flush_records (struct print_trns *trns, struct u8_line *line, int target_record, bool *eject, int *record) { for (; target_record > *record; (*record)++) { char leader = ' '; if (*eject) { *eject = false; if (trns->writer == NULL) text_item_submit (text_item_create (TEXT_ITEM_EJECT_PAGE, "")); else leader = '1'; } *u8_line_reserve (line, 0, 1, 1) = leader; if (trns->writer == NULL) table_output_text (TAB_FIX, ds_cstr (&line->s) + 1); else { size_t len = ds_length (&line->s); char *s = ds_cstr (&line->s); if (!trns->include_prefix) { s++; len--; } if (is_encoding_utf8 (trns->encoding)) dfm_put_record (trns->writer, s, len); else { char *recoded = recode_string (trns->encoding, UTF8, s, len); dfm_put_record (trns->writer, recoded, strlen (recoded)); free (recoded); } } } } /* Transformation, for output involving binary. */ static void print_binary_flush_records (struct print_trns *, struct string *line, int target_record, bool *eject, int *record); /* Performs the transformation inside print_trns T on case C. */ static int print_binary_trns_proc (void *trns_, struct ccase **c, casenumber case_num UNUSED) { struct print_trns *trns = trns_; bool eject = trns->eject; char encoded_space = recode_byte (trns->encoding, C_ENCODING, ' '); int record = 1; struct prt_out_spec *spec; struct string line; ds_init_empty (&line); ds_put_byte (&line, ' '); ll_for_each (spec, struct prt_out_spec, ll, &trns->specs) { print_binary_flush_records (trns, &line, spec->record, &eject, &record); ds_set_length (&line, spec->first_column, encoded_space); if (spec->type == PRT_VAR) { const union value *input = case_data (*c, spec->var); if (!spec->sysmis_as_spaces || input->f != SYSMIS) data_out_recode (input, var_get_encoding (spec->var), &spec->format, &line, trns->encoding); else ds_put_byte_multiple (&line, encoded_space, spec->format.w); if (spec->add_space) ds_put_byte (&line, encoded_space); } else { ds_put_substring (&line, ds_ss (&spec->string)); if (0 != strcmp (trns->encoding, UTF8)) { size_t length = ds_length (&spec->string); char *data = ss_data (ds_tail (&line, length)); char *s = recode_string (trns->encoding, UTF8, data, length); memcpy (data, s, length); free (s); } } } print_binary_flush_records (trns, &line, trns->record_cnt + 1, &eject, &record); ds_destroy (&line); if (trns->writer != NULL && dfm_write_error (trns->writer)) return TRNS_ERROR; return TRNS_CONTINUE; } /* Advance from *RECORD to TARGET_RECORD, outputting records along the way. If *EJECT is true, then the first record output is preceded by ejecting the page (and *EJECT is set false). */ static void print_binary_flush_records (struct print_trns *trns, struct string *line, int target_record, bool *eject, int *record) { for (; target_record > *record; (*record)++) { char *s = ds_cstr (line); size_t length = ds_length (line); char leader = ' '; if (*eject) { *eject = false; leader = '1'; } s[0] = recode_byte (trns->encoding, C_ENCODING, leader); if (!trns->include_prefix) { s++; length--; } dfm_put_record (trns->writer, s, length); ds_truncate (line, 1); } } /* Frees TRNS. */ static bool print_trns_free (void *trns_) { struct print_trns *trns = trns_; bool ok = true; if (trns->writer != NULL) ok = dfm_close_writer (trns->writer); pool_destroy (trns->pool); return ok; } pspp-1.4.1/src/language/data-io/save.c0000644000175000017500000002567313546443556017141 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 1997-9, 2000, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014 Free Software Foundation, Inc. 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 3 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, see . */ #include #include #include "data/any-writer.h" #include "data/case-map.h" #include "data/case.h" #include "data/casereader.h" #include "data/casewriter.h" #include "data/dataset.h" #include "data/dictionary.h" #include "data/mdd-writer.h" #include "data/por-file-writer.h" #include "data/sys-file-writer.h" #include "data/transformations.h" #include "data/variable.h" #include "language/command.h" #include "language/data-io/file-handle.h" #include "language/data-io/trim.h" #include "language/lexer/lexer.h" #include "libpspp/assertion.h" #include "libpspp/compiler.h" #include "libpspp/message.h" #include "gl/xalloc.h" #include "gettext.h" #define _(msgid) gettext (msgid) /* Writing system and portable files. */ /* Type of output file. */ enum writer_type { SYSFILE_WRITER, /* System file. */ PORFILE_WRITER /* Portable file. */ }; /* Type of a command. */ enum command_type { XFORM_CMD, /* Transformation. */ PROC_CMD /* Procedure. */ }; static int parse_output_proc (struct lexer *, struct dataset *, enum writer_type); static int parse_output_trns (struct lexer *, struct dataset *, enum writer_type); int cmd_save (struct lexer *lexer, struct dataset *ds) { return parse_output_proc (lexer, ds, SYSFILE_WRITER); } int cmd_save_data_collection (struct lexer *lexer, struct dataset *ds) { return parse_output_proc (lexer, ds, SYSFILE_WRITER); } int cmd_export (struct lexer *lexer, struct dataset *ds) { return parse_output_proc (lexer, ds, PORFILE_WRITER); } int cmd_xsave (struct lexer *lexer, struct dataset *ds) { return parse_output_trns (lexer, ds, SYSFILE_WRITER); } int cmd_xexport (struct lexer *lexer, struct dataset *ds) { return parse_output_trns (lexer, ds, PORFILE_WRITER); } struct output_trns { struct casewriter *writer; /* Writer. */ }; static trns_proc_func output_trns_proc; static trns_free_func output_trns_free; static struct casewriter *parse_write_command (struct lexer *, struct dataset *, enum writer_type, enum command_type, bool *retain_unselected); /* Parses and performs the SAVE or EXPORT procedure. */ static int parse_output_proc (struct lexer *lexer, struct dataset *ds, enum writer_type writer_type) { bool retain_unselected; struct casewriter *output; bool ok; output = parse_write_command (lexer, ds, writer_type, PROC_CMD, &retain_unselected); if (output == NULL) return CMD_CASCADING_FAILURE; casereader_transfer (proc_open_filtering (ds, !retain_unselected), output); ok = casewriter_destroy (output); ok = proc_commit (ds) && ok; return ok ? CMD_SUCCESS : CMD_CASCADING_FAILURE; } /* Parses the XSAVE or XEXPORT transformation command. */ static int parse_output_trns (struct lexer *lexer, struct dataset *ds, enum writer_type writer_type) { struct output_trns *t = xmalloc (sizeof *t); t->writer = parse_write_command (lexer, ds, writer_type, XFORM_CMD, NULL); if (t->writer == NULL) { free (t); return CMD_CASCADING_FAILURE; } add_transformation (ds, output_trns_proc, output_trns_free, t); return CMD_SUCCESS; } /* Parses SAVE or XSAVE or EXPORT or XEXPORT command. WRITER_TYPE identifies the type of file to write, and COMMAND_TYPE identifies the type of command. On success, returns a writer. For procedures only, sets *RETAIN_UNSELECTED to true if cases that would otherwise be excluded by FILTER or USE should be included. On failure, returns a null pointer. */ static struct casewriter * parse_write_command (struct lexer *lexer, struct dataset *ds, enum writer_type writer_type, enum command_type command_type, bool *retain_unselected) { /* Common data. */ struct file_handle *handle; /* Output file. */ struct file_handle *metadata; /* MDD output file. */ struct dictionary *dict; /* Dictionary for output file. */ struct casewriter *writer; /* Writer. */ struct case_map_stage *stage; /* Preparation for 'map'. */ struct case_map *map; /* Map from input data to data for writer. */ const char *sav_name = ""; /* Common options. */ struct sfm_write_options sysfile_opts; struct pfm_write_options porfile_opts; assert (writer_type == SYSFILE_WRITER || writer_type == PORFILE_WRITER); assert (command_type == XFORM_CMD || command_type == PROC_CMD); assert ((retain_unselected != NULL) == (command_type == PROC_CMD)); if (command_type == PROC_CMD) *retain_unselected = true; handle = NULL; metadata = NULL; dict = dict_clone (dataset_dict (ds)); writer = NULL; stage = NULL; map = NULL; sysfile_opts = sfm_writer_default_options (); porfile_opts = pfm_writer_default_options (); stage = case_map_stage_create (dict); dict_delete_scratch_vars (dict); lex_match (lexer, T_SLASH); for (;;) { if (lex_match_id (lexer, "OUTFILE")) { if (handle != NULL) { lex_sbc_only_once ("OUTFILE"); goto error; } lex_match (lexer, T_EQUALS); handle = fh_parse (lexer, FH_REF_FILE, NULL); if (handle == NULL) goto error; } else if (lex_match_id (lexer, "METADATA")) { if (metadata != NULL) { lex_sbc_only_once ("METADATA"); goto error; } lex_match (lexer, T_EQUALS); metadata = fh_parse (lexer, FH_REF_FILE, NULL); if (metadata == NULL) goto error; } else if (lex_match_id (lexer, "NAMES")) { /* Not yet implemented. */ } else if (lex_match_id (lexer, "PERMISSIONS")) { bool cw; lex_match (lexer, T_EQUALS); if (lex_match_id (lexer, "READONLY")) cw = false; else if (lex_match_id (lexer, "WRITEABLE")) cw = true; else { lex_error_expecting (lexer, "READONLY", "WRITEABLE"); goto error; } sysfile_opts.create_writeable = porfile_opts.create_writeable = cw; } else if (command_type == PROC_CMD && lex_match_id (lexer, "UNSELECTED")) { lex_match (lexer, T_EQUALS); if (lex_match_id (lexer, "RETAIN")) *retain_unselected = true; else if (lex_match_id (lexer, "DELETE")) *retain_unselected = false; else { lex_error_expecting (lexer, "RETAIN", "DELETE"); goto error; } } else if (writer_type == SYSFILE_WRITER && lex_match_id (lexer, "COMPRESSED")) sysfile_opts.compression = ANY_COMP_SIMPLE; else if (writer_type == SYSFILE_WRITER && lex_match_id (lexer, "UNCOMPRESSED")) sysfile_opts.compression = ANY_COMP_NONE; else if (writer_type == SYSFILE_WRITER && lex_match_id (lexer, "ZCOMPRESSED")) sysfile_opts.compression = ANY_COMP_ZLIB; else if (writer_type == SYSFILE_WRITER && lex_match_id (lexer, "VERSION")) { lex_match (lexer, T_EQUALS); if (!lex_force_int (lexer)) goto error; sysfile_opts.version = lex_integer (lexer); lex_get (lexer); } else if (writer_type == PORFILE_WRITER && lex_match_id (lexer, "TYPE")) { lex_match (lexer, T_EQUALS); if (lex_match_id (lexer, "COMMUNICATIONS")) porfile_opts.type = PFM_COMM; else if (lex_match_id (lexer, "TAPE")) porfile_opts.type = PFM_TAPE; else { lex_error_expecting (lexer, "COMM", "TAPE"); goto error; } } else if (writer_type == PORFILE_WRITER && lex_match_id (lexer, "DIGITS")) { lex_match (lexer, T_EQUALS); if (!lex_force_int (lexer)) goto error; porfile_opts.digits = lex_integer (lexer); lex_get (lexer); } else if (!parse_dict_trim (lexer, dict, false)) goto error; if (!lex_match (lexer, T_SLASH)) break; } if (lex_end_of_command (lexer) != CMD_SUCCESS) goto error; if (!handle && !metadata) { msg (SE, _("The OUTFILE or METADATA subcommand is required.")); goto error; } dict_delete_scratch_vars (dict); dict_compact_values (dict); if (handle) { if (metadata) sav_name = (fh_get_referent (handle) == FH_REF_FILE ? fh_get_file_name (handle) : fh_get_name (handle)); if (fh_get_referent (handle) == FH_REF_FILE) { switch (writer_type) { case SYSFILE_WRITER: writer = sfm_open_writer (handle, dict, sysfile_opts); break; case PORFILE_WRITER: writer = pfm_open_writer (handle, dict, porfile_opts); break; } } else writer = any_writer_open (handle, dict); if (writer == NULL) goto error; } if (metadata) { if (!mdd_write (metadata, dict, sav_name)) goto error; } map = case_map_stage_get_case_map (stage); case_map_stage_destroy (stage); if (map != NULL) writer = case_map_create_output_translator (map, writer); dict_unref (dict); fh_unref (handle); fh_unref (metadata); return writer; error: case_map_stage_destroy (stage); fh_unref (handle); fh_unref (metadata); casewriter_destroy (writer); dict_unref (dict); case_map_destroy (map); return NULL; } /* Writes case *C to the system file specified on XSAVE or XEXPORT. */ static int output_trns_proc (void *trns_, struct ccase **c, casenumber case_num UNUSED) { struct output_trns *t = trns_; casewriter_write (t->writer, case_ref (*c)); return TRNS_CONTINUE; } /* Frees an XSAVE or XEXPORT transformation. Returns true if successful, false if an I/O error occurred. */ static bool output_trns_free (void *trns_) { struct output_trns *t = trns_; bool ok = casewriter_destroy (t->writer); free (t); return ok; } pspp-1.4.1/src/language/data-io/data-writer.h0000644000175000017500000000237113320146056020402 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 1997-9, 2000, 2011, 2012 Free Software Foundation, Inc. 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 3 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, see . */ #ifndef DFM_WRITE_H #define DFM_WRITE_H /* Writing data files. */ #include #include struct file_handle; struct dfm_writer *dfm_open_writer (struct file_handle *, const char *encoding); bool dfm_close_writer (struct dfm_writer *); bool dfm_write_error (const struct dfm_writer *); bool dfm_put_record (struct dfm_writer *, const char *rec, size_t len); const char *dfm_writer_get_encoding (const struct dfm_writer *); #endif /* data-writer.h */ pspp-1.4.1/src/language/data-io/get-data.c0000644000175000017500000004474713670210420017650 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2015, 2016 Free Software Foundation, Inc. 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 3 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, see . */ #include #include #include #include "data/dataset.h" #include "data/dictionary.h" #include "data/format.h" #include "data/gnumeric-reader.h" #include "data/ods-reader.h" #include "data/spreadsheet-reader.h" #include "data/psql-reader.h" #include "data/settings.h" #include "language/command.h" #include "language/data-io/data-parser.h" #include "language/data-io/data-reader.h" #include "language/data-io/file-handle.h" #include "language/data-io/placement-parser.h" #include "language/lexer/format-parser.h" #include "language/lexer/lexer.h" #include "libpspp/cast.h" #include "libpspp/i18n.h" #include "libpspp/message.h" #include "gl/xalloc.h" #include "gettext.h" #define _(msgid) gettext (msgid) #define N_(msgid) (msgid) static bool parse_spreadsheet (struct lexer *lexer, char **filename, struct spreadsheet_read_options *opts); static void destroy_spreadsheet_read_info (struct spreadsheet_read_options *); static int parse_get_txt (struct lexer *lexer, struct dataset *); static int parse_get_psql (struct lexer *lexer, struct dataset *); int cmd_get_data (struct lexer *lexer, struct dataset *ds) { char *tok = NULL; struct spreadsheet_read_options opts; opts.sheet_name = NULL; opts.sheet_index = -1; opts.cell_range = NULL; opts.read_names = false; opts.asw = -1; if (! lex_force_match (lexer, T_SLASH)) goto error; if (!lex_force_match_id (lexer, "TYPE")) goto error; if (!lex_force_match (lexer, T_EQUALS)) goto error; const char *s = lex_tokcstr (lexer); if (s) tok = strdup (s); if (lex_match_id (lexer, "TXT")) { free (tok); return parse_get_txt (lexer, ds); } else if (lex_match_id (lexer, "PSQL")) { free (tok); return parse_get_psql (lexer, ds); } else if (lex_match_id (lexer, "GNM") || lex_match_id (lexer, "ODS")) { char *filename = NULL; if (!parse_spreadsheet (lexer, &filename, &opts)) goto error; struct spreadsheet *spreadsheet = NULL; if (0 == strncasecmp (tok, "GNM", 3)) spreadsheet = gnumeric_probe (filename, true); else if (0 == strncasecmp (tok, "ODS", 3)) spreadsheet = ods_probe (filename, true); if (spreadsheet == NULL) { msg (SE, _("error reading file `%s'"), filename); free (filename); goto error; } free (filename); struct casereader *reader = spreadsheet_make_reader (spreadsheet, &opts); if (reader) { dataset_set_dict (ds, dict_clone (spreadsheet->dict)); dataset_set_source (ds, reader); free (tok); destroy_spreadsheet_read_info (&opts); spreadsheet_unref (spreadsheet); return CMD_SUCCESS; } spreadsheet_unref (spreadsheet); } else msg (SE, _("Unsupported TYPE %s."), tok); error: destroy_spreadsheet_read_info (&opts); free (tok); return CMD_FAILURE; } static int parse_get_psql (struct lexer *lexer, struct dataset *ds) { struct psql_read_info psql; psql.allow_clear = false; psql.conninfo = NULL; psql.str_width = -1; psql.bsize = -1; ds_init_empty (&psql.sql); if (! lex_force_match (lexer, T_SLASH)) goto error; if (!lex_force_match_id (lexer, "CONNECT")) goto error; if (! lex_force_match (lexer, T_EQUALS)) goto error; if (!lex_force_string (lexer)) goto error; psql.conninfo = ss_xstrdup (lex_tokss (lexer)); lex_get (lexer); while (lex_match (lexer, T_SLASH)) { if (lex_match_id (lexer, "ASSUMEDSTRWIDTH")) { lex_match (lexer, T_EQUALS); if (lex_force_int (lexer)) { psql.str_width = lex_integer (lexer); lex_get (lexer); } } else if (lex_match_id (lexer, "BSIZE")) { lex_match (lexer, T_EQUALS); if (lex_force_int (lexer)) { psql.bsize = lex_integer (lexer); lex_get (lexer); } } else if (lex_match_id (lexer, "UNENCRYPTED")) { psql.allow_clear = true; } else if (lex_match_id (lexer, "SQL")) { lex_match (lexer, T_EQUALS); if (! lex_force_string (lexer)) goto error; ds_put_substring (&psql.sql, lex_tokss (lexer)); lex_get (lexer); } } { struct dictionary *dict = NULL; struct casereader *reader = psql_open_reader (&psql, &dict); if (reader) { dataset_set_dict (ds, dict); dataset_set_source (ds, reader); } } ds_destroy (&psql.sql); free (psql.conninfo); return CMD_SUCCESS; error: ds_destroy (&psql.sql); free (psql.conninfo); return CMD_FAILURE; } static bool parse_spreadsheet (struct lexer *lexer, char **filename, struct spreadsheet_read_options *opts) { opts->sheet_index = 1; opts->sheet_name = NULL; opts->cell_range = NULL; opts->read_names = true; opts->asw = -1; if (! lex_force_match (lexer, T_SLASH)) goto error; if (!lex_force_match_id (lexer, "FILE")) goto error; if (! lex_force_match (lexer, T_EQUALS)) goto error; if (!lex_force_string (lexer)) goto error; *filename = utf8_to_filename (lex_tokcstr (lexer)); lex_get (lexer); while (lex_match (lexer, T_SLASH)) { if (lex_match_id (lexer, "ASSUMEDSTRWIDTH")) { lex_match (lexer, T_EQUALS); if (lex_force_int (lexer)) { opts->asw = lex_integer (lexer); lex_get (lexer); } } else if (lex_match_id (lexer, "SHEET")) { lex_match (lexer, T_EQUALS); if (lex_match_id (lexer, "NAME")) { if (! lex_force_string (lexer)) goto error; opts->sheet_name = ss_xstrdup (lex_tokss (lexer)); opts->sheet_index = -1; lex_get (lexer); } else if (lex_match_id (lexer, "INDEX")) { if (!lex_force_int (lexer)) goto error; opts->sheet_index = lex_integer (lexer); if (opts->sheet_index <= 0) { msg (SE, _("The sheet index must be greater than or equal to 1")); goto error; } lex_get (lexer); } else { msg (SE, _("%s must be followed by either \"%s\" or \"%s\"."), "/SHEET", "NAME", "INDEX"); goto error; } } else if (lex_match_id (lexer, "CELLRANGE")) { lex_match (lexer, T_EQUALS); if (lex_match_id (lexer, "FULL")) { opts->cell_range = NULL; } else if (lex_match_id (lexer, "RANGE")) { if (! lex_force_string (lexer)) goto error; opts->cell_range = ss_xstrdup (lex_tokss (lexer)); lex_get (lexer); } else { msg (SE, _("%s must be followed by either \"%s\" or \"%s\"."), "/CELLRANGE", "FULL", "RANGE"); goto error; } } else if (lex_match_id (lexer, "READNAMES")) { lex_match (lexer, T_EQUALS); if (lex_match_id (lexer, "ON")) { opts->read_names = true; } else if (lex_match_id (lexer, "OFF")) { opts->read_names = false; } else { msg (SE, _("%s must be followed by either \"%s\" or \"%s\"."), "/READNAMES", "ON", "OFF"); goto error; } } else { lex_error (lexer, NULL); goto error; } } return true; error: return false; } static bool set_type (struct data_parser *parser, const char *subcommand, enum data_parser_type type, bool *has_type) { if (!*has_type) { data_parser_set_type (parser, type); *has_type = true; } else if (type != data_parser_get_type (parser)) { msg (SE, _("%s is allowed only with %s arrangement, but %s arrangement " "was stated or implied earlier in this command."), subcommand, type == DP_FIXED ? "FIXED" : "DELIMITED", type == DP_FIXED ? "DELIMITED" : "FIXED"); return false; } return true; } static int parse_get_txt (struct lexer *lexer, struct dataset *ds) { struct data_parser *parser = NULL; struct dictionary *dict = dict_create (get_default_encoding ()); struct file_handle *fh = NULL; struct dfm_reader *reader = NULL; char *encoding = NULL; char *name = NULL; int record; enum data_parser_type type; bool has_type; if (! lex_force_match (lexer, T_SLASH)) goto error; if (!lex_force_match_id (lexer, "FILE")) goto error; if (! lex_force_match (lexer, T_EQUALS)) goto error; fh = fh_parse (lexer, FH_REF_FILE | FH_REF_INLINE, NULL); if (fh == NULL) goto error; parser = data_parser_create (dict); has_type = false; data_parser_set_type (parser, DP_DELIMITED); data_parser_set_span (parser, false); data_parser_set_quotes (parser, ss_empty ()); data_parser_set_quote_escape (parser, true); data_parser_set_empty_line_has_field (parser, true); for (;;) { if (!lex_force_match (lexer, T_SLASH)) goto error; if (lex_match_id (lexer, "ENCODING")) { lex_match (lexer, T_EQUALS); if (!lex_force_string (lexer)) goto error; free (encoding); encoding = ss_xstrdup (lex_tokss (lexer)); lex_get (lexer); } else if (lex_match_id (lexer, "ARRANGEMENT")) { bool ok; lex_match (lexer, T_EQUALS); if (lex_match_id (lexer, "FIXED")) ok = set_type (parser, "ARRANGEMENT=FIXED", DP_FIXED, &has_type); else if (lex_match_id (lexer, "DELIMITED")) ok = set_type (parser, "ARRANGEMENT=DELIMITED", DP_DELIMITED, &has_type); else { lex_error_expecting (lexer, "FIXED", "DELIMITED"); goto error; } if (!ok) goto error; } else if (lex_match_id (lexer, "FIRSTCASE")) { lex_match (lexer, T_EQUALS); if (!lex_force_int (lexer)) goto error; if (lex_integer (lexer) < 1) { msg (SE, _("Value of %s must be 1 or greater."), "FIRSTCASE"); goto error; } data_parser_set_skip (parser, lex_integer (lexer) - 1); lex_get (lexer); } else if (lex_match_id_n (lexer, "DELCASE", 4)) { if (!set_type (parser, "DELCASE", DP_DELIMITED, &has_type)) goto error; lex_match (lexer, T_EQUALS); if (lex_match_id (lexer, "LINE")) data_parser_set_span (parser, false); else if (lex_match_id (lexer, "VARIABLES")) { data_parser_set_span (parser, true); /* VARIABLES takes an integer argument, but for no good reason. We just ignore it. */ if (!lex_force_int (lexer)) goto error; lex_get (lexer); } else { lex_error_expecting (lexer, "LINE", "VARIABLES"); goto error; } } else if (lex_match_id (lexer, "FIXCASE")) { if (!set_type (parser, "FIXCASE", DP_FIXED, &has_type)) goto error; lex_match (lexer, T_EQUALS); if (!lex_force_int (lexer)) goto error; if (lex_integer (lexer) < 1) { msg (SE, _("Value of %s must be 1 or greater."), "FIXCASE"); goto error; } data_parser_set_records (parser, lex_integer (lexer)); lex_get (lexer); } else if (lex_match_id (lexer, "IMPORTCASES")) { lex_match (lexer, T_EQUALS); if (lex_match (lexer, T_ALL)) { /* Nothing to do. */ } else if (lex_match_id (lexer, "FIRST")) { if (!lex_force_int (lexer)) goto error; lex_get (lexer); } else if (lex_match_id (lexer, "PERCENT")) { if (!lex_force_int (lexer)) goto error; lex_get (lexer); } msg (SW, _("Ignoring obsolete IMPORTCASES subcommand. (N OF CASES " "or SAMPLE may be used to substitute.)")); } else if (lex_match_id_n (lexer, "DELIMITERS", 4)) { struct string hard_seps = DS_EMPTY_INITIALIZER; const char *soft_seps = ""; struct substring s; int c; if (!set_type (parser, "DELIMITERS", DP_DELIMITED, &has_type)) goto error; lex_match (lexer, T_EQUALS); if (!lex_force_string (lexer)) goto error; /* XXX should support multibyte UTF-8 characters */ s = lex_tokss (lexer); if (ss_match_string (&s, ss_cstr ("\\t"))) ds_put_cstr (&hard_seps, "\t"); if (ss_match_string (&s, ss_cstr ("\\\\"))) ds_put_cstr (&hard_seps, "\\"); while ((c = ss_get_byte (&s)) != EOF) if (c == ' ') soft_seps = " "; else ds_put_byte (&hard_seps, c); data_parser_set_soft_delimiters (parser, ss_cstr (soft_seps)); data_parser_set_hard_delimiters (parser, ds_ss (&hard_seps)); ds_destroy (&hard_seps); lex_get (lexer); } else if (lex_match_id (lexer, "QUALIFIERS")) { if (!set_type (parser, "QUALIFIERS", DP_DELIMITED, &has_type)) goto error; lex_match (lexer, T_EQUALS); if (!lex_force_string (lexer)) goto error; /* XXX should support multibyte UTF-8 characters */ if (settings_get_syntax () == COMPATIBLE && ss_length (lex_tokss (lexer)) != 1) { msg (SE, _("In compatible syntax mode, the QUALIFIER string " "must contain exactly one character.")); goto error; } data_parser_set_quotes (parser, lex_tokss (lexer)); lex_get (lexer); } else if (lex_match_id (lexer, "VARIABLES")) break; else { lex_error_expecting (lexer, "VARIABLES"); goto error; } } lex_match (lexer, T_EQUALS); record = 1; type = data_parser_get_type (parser); do { struct fmt_spec input, output; struct variable *v; int fc, lc; while (type == DP_FIXED && lex_match (lexer, T_SLASH)) { if (!lex_force_int (lexer)) goto error; if (lex_integer (lexer) < record) { msg (SE, _("The record number specified, %ld, is at or " "before the previous record, %d. Data " "fields must be listed in order of " "increasing record number."), lex_integer (lexer), record); goto error; } if (lex_integer (lexer) > data_parser_get_records (parser)) { msg (SE, _("The record number specified, %ld, exceeds " "the number of records per case specified " "on FIXCASE, %d."), lex_integer (lexer), data_parser_get_records (parser)); goto error; } record = lex_integer (lexer); lex_get (lexer); } const char * tstr = lex_tokcstr (lexer); if (tstr == NULL) { lex_error (lexer, NULL); goto error; } name = xstrdup (tstr); if (!lex_force_id (lexer) || !dict_id_is_valid (dict, name, true)) { goto error; } lex_get (lexer); if (type == DP_DELIMITED) { if (!parse_format_specifier (lexer, &input) || !fmt_check_input (&input)) { goto error; } output = fmt_for_output_from_input (&input); } else { char fmt_type_name[FMT_TYPE_LEN_MAX + 1]; enum fmt_type fmt_type; int w, d; if (!parse_column_range (lexer, 0, &fc, &lc, NULL)) goto error; /* Accept a format (e.g. F8.2) or just a type name (e.g. DOLLAR). */ if (!parse_abstract_format_specifier (lexer, fmt_type_name, &w, &d)) goto error; if (!fmt_from_name (fmt_type_name, &fmt_type)) { msg (SE, _("Unknown format type `%s'."), fmt_type_name); goto error; } /* Compose input format. */ input.type = fmt_type; input.w = lc - fc + 1; input.d = 0; if (!fmt_check_input (&input)) goto error; /* Compose output format. */ if (w != 0) { output.type = fmt_type; output.w = w; output.d = d; if (!fmt_check_output (&output)) goto error; } else output = fmt_for_output_from_input (&input); } v = dict_create_var (dict, name, fmt_var_width (&input)); if (v == NULL) { msg (SE, _("%s is a duplicate variable name."), name); goto error; } var_set_both_formats (v, &output); if (type == DP_DELIMITED) data_parser_add_delimited_field (parser, &input, var_get_case_index (v), name); else data_parser_add_fixed_field (parser, &input, var_get_case_index (v), name, record, fc); free (name); name = NULL; } while (lex_token (lexer) != T_ENDCMD); reader = dfm_open_reader (fh, lexer, encoding); if (reader == NULL) goto error; data_parser_make_active_file (parser, ds, reader, dict, NULL, NULL); fh_unref (fh); free (encoding); return CMD_SUCCESS; error: data_parser_destroy (parser); dict_unref (dict); fh_unref (fh); free (name); free (encoding); return CMD_CASCADING_FAILURE; } static void destroy_spreadsheet_read_info (struct spreadsheet_read_options *opts) { free (opts->cell_range); free (opts->sheet_name); } pspp-1.4.1/src/language/data-io/save-translate.c0000644000175000017500000002070613602175052021106 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2010, 2011, 2013, 2016 Free Software Foundation, Inc. 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 3 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, see . */ #include #include #include "data/case-map.h" #include "data/casereader.h" #include "data/casewriter.h" #include "data/csv-file-writer.h" #include "data/dataset.h" #include "data/dictionary.h" #include "data/file-name.h" #include "data/format.h" #include "data/settings.h" #include "language/command.h" #include "language/data-io/file-handle.h" #include "language/data-io/trim.h" #include "language/lexer/lexer.h" #include "libpspp/message.h" #include "gettext.h" #define _(msgid) gettext (msgid) #define N_(msgid) (msgid) int cmd_save_translate (struct lexer *lexer, struct dataset *ds) { enum { CSV_FILE = 1, TAB_FILE } type; struct dictionary *dict; struct case_map_stage *stage; struct case_map *map; struct casewriter *writer; struct file_handle *handle; bool replace; bool retain_unselected; bool recode_user_missing; bool include_var_names; bool use_value_labels; bool use_print_formats; char decimal; char delimiter; char qualifier; bool ok; type = 0; dict = dict_clone (dataset_dict (ds)); dict_set_names_must_be_ids (dict, false); stage = NULL; map = NULL; handle = NULL; replace = false; retain_unselected = true; recode_user_missing = false; include_var_names = false; use_value_labels = false; use_print_formats = false; decimal = settings_get_decimal_char (FMT_F); delimiter = 0; qualifier = '"'; stage = case_map_stage_create (dict); dict_delete_scratch_vars (dict); while (lex_token (lexer) != T_ENDCMD) { if (!lex_force_match (lexer, T_SLASH)) goto error; if (lex_match_id (lexer, "OUTFILE")) { if (handle != NULL) { lex_sbc_only_once ("OUTFILE"); goto error; } lex_match (lexer, T_EQUALS); handle = fh_parse (lexer, FH_REF_FILE, NULL); if (handle == NULL) goto error; } else if (lex_match_id (lexer, "TYPE")) { if (type != 0) { lex_sbc_only_once ("TYPE"); goto error; } lex_match (lexer, T_EQUALS); if (lex_match_id (lexer, "CSV")) type = CSV_FILE; else if (lex_match_id (lexer, "TAB")) type = TAB_FILE; else { lex_error_expecting (lexer, "CSV", "TAB"); goto error; } } else if (lex_match_id (lexer, "REPLACE")) replace = true; else if (lex_match_id (lexer, "FIELDNAMES")) include_var_names = true; else if (lex_match_id (lexer, "MISSING")) { lex_match (lexer, T_EQUALS); if (lex_match_id (lexer, "IGNORE")) recode_user_missing = false; else if (lex_match_id (lexer, "RECODE")) recode_user_missing = true; else { lex_error_expecting (lexer, "IGNORE", "RECODE"); goto error; } } else if (lex_match_id (lexer, "CELLS")) { lex_match (lexer, T_EQUALS); if (lex_match_id (lexer, "VALUES")) use_value_labels = false; else if (lex_match_id (lexer, "LABELS")) use_value_labels = true; else { lex_error_expecting (lexer, "VALUES", "LABELS"); goto error; } } else if (lex_match_id (lexer, "TEXTOPTIONS")) { lex_match (lexer, T_EQUALS); for (;;) { if (lex_match_id (lexer, "DELIMITER")) { lex_match (lexer, T_EQUALS); if (!lex_force_string (lexer)) goto error; /* XXX should support multibyte UTF-8 delimiters */ if (ss_length (lex_tokss (lexer)) != 1) { msg (SE, _("The %s string must contain exactly one " "character."), "DELIMITER"); goto error; } delimiter = ss_first (lex_tokss (lexer)); lex_get (lexer); } else if (lex_match_id (lexer, "QUALIFIER")) { lex_match (lexer, T_EQUALS); if (!lex_force_string (lexer)) goto error; /* XXX should support multibyte UTF-8 qualifiers */ if (ss_length (lex_tokss (lexer)) != 1) { msg (SE, _("The %s string must contain exactly one " "character."), "QUALIFIER"); goto error; } qualifier = ss_first (lex_tokss (lexer)); lex_get (lexer); } else if (lex_match_id (lexer, "DECIMAL")) { lex_match (lexer, T_EQUALS); if (lex_match_id (lexer, "DOT")) decimal = '.'; else if (lex_match_id (lexer, "COMMA")) decimal = ','; else { lex_error_expecting (lexer, "DOT", "COMMA"); goto error; } } else if (lex_match_id (lexer, "FORMAT")) { lex_match (lexer, T_EQUALS); if (lex_match_id (lexer, "PLAIN")) use_print_formats = false; else if (lex_match_id (lexer, "VARIABLE")) use_print_formats = true; else { lex_error_expecting (lexer, "PLAIN", "VARIABLE"); goto error; } } else break; } } else if (lex_match_id (lexer, "UNSELECTED")) { lex_match (lexer, T_EQUALS); if (lex_match_id (lexer, "RETAIN")) retain_unselected = true; else if (lex_match_id (lexer, "DELETE")) retain_unselected = false; else { lex_error_expecting (lexer, "RETAIN", "DELETE"); goto error; } } else if (!parse_dict_trim (lexer, dict, true)) goto error; } if (type == 0) { lex_sbc_missing ("TYPE"); goto error; } else if (handle == NULL) { lex_sbc_missing ("OUTFILE"); goto error; } else if (!replace && fn_exists (handle)) { msg (SE, _("Output file `%s' exists but %s was not specified."), fh_get_file_name (handle), "REPLACE"); goto error; } dict_delete_scratch_vars (dict); dict_compact_values (dict); struct csv_writer_options csv_opts = { .recode_user_missing = recode_user_missing, .include_var_names = include_var_names, .use_value_labels = use_value_labels, .use_print_formats = use_print_formats, .decimal = decimal, .delimiter = (delimiter ? delimiter : type == TAB_FILE ? '\t' : decimal == '.' ? ',' : ';'), .qualifier = qualifier, }; writer = csv_writer_open (handle, dict, &csv_opts); if (writer == NULL) goto error; fh_unref (handle); map = case_map_stage_get_case_map (stage); case_map_stage_destroy (stage); if (map != NULL) writer = case_map_create_output_translator (map, writer); dict_unref (dict); casereader_transfer (proc_open_filtering (ds, !retain_unselected), writer); ok = casewriter_destroy (writer); ok = proc_commit (ds) && ok; return ok ? CMD_SUCCESS : CMD_CASCADING_FAILURE; error: case_map_stage_destroy (stage); fh_unref (handle); dict_unref (dict); case_map_destroy (map); return CMD_FAILURE; } pspp-1.4.1/src/language/data-io/trim.h0000644000175000017500000000221713546443556017150 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 1997-9, 2000, 2006, 2007, 2008 Free Software Foundation, Inc. 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 3 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, see . */ #ifndef LANGUAGE_DATA_IO_TRIM_H #define LANGUAGE_DATA_IO_TRIM_H #include struct lexer; struct dictionary; bool parse_dict_trim (struct lexer *, struct dictionary *, bool); bool parse_dict_rename (struct lexer *, struct dictionary *, bool); bool parse_dict_drop (struct lexer *, struct dictionary *); bool parse_dict_keep (struct lexer *, struct dictionary *); #endif /* trim.c */ pspp-1.4.1/src/language/data-io/matrix-data.c0000644000175000017500000004175713700645725020411 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2017 Free Software Foundation, Inc. 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 3 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, see . */ #include #include "data/case.h" #include "data/casereader.h" #include "data/casewriter.h" #include "data/dataset.h" #include "data/dictionary.h" #include "data/format.h" #include "data/transformations.h" #include "data/variable.h" #include "language/command.h" #include "language/data-io/data-parser.h" #include "language/data-io/data-reader.h" #include "language/data-io/file-handle.h" #include "language/data-io/inpt-pgm.h" #include "language/data-io/placement-parser.h" #include "language/lexer/lexer.h" #include "language/lexer/variable-parser.h" #include "libpspp/i18n.h" #include "libpspp/message.h" #include "libpspp/misc.h" #include "gl/xsize.h" #include "gl/xalloc.h" #include "gettext.h" #define _(msgid) gettext (msgid) /* DATA LIST transformation data. */ struct data_list_trns { struct data_parser *parser; /* Parser. */ struct dfm_reader *reader; /* Data file reader. */ struct variable *end; /* Variable specified on END subcommand. */ }; static trns_free_func data_list_trns_free; static trns_proc_func data_list_trns_proc; enum diagonal { DIAGONAL, NO_DIAGONAL }; enum triangle { LOWER, UPPER, FULL }; static const int ROWTYPE_WIDTH = 8; struct matrix_format { enum triangle triangle; enum diagonal diagonal; const struct variable *rowtype; const struct variable *varname; int n_continuous_vars; struct variable **split_vars; size_t n_split_vars; long n; }; /* valid rowtype_ values: CORR, COV, MAT, MSE, DFE, MEAN, STDDEV (or SD), N_VECTOR (or N), N_SCALAR, N_MATRIX, COUNT, PROX. */ /* Sets the value of OUTCASE which corresponds to VNAME to the value STR. VNAME must be of type string. */ static void set_varname_column (struct ccase *outcase, const struct variable *vname, const char *str) { int len = var_get_width (vname); uint8_t *s = case_str_rw (outcase, vname); strncpy (CHAR_CAST (char *, s), str, len); } static void blank_varname_column (struct ccase *outcase, const struct variable *vname) { int len = var_get_width (vname); uint8_t *s = case_str_rw (outcase, vname); memset (s, ' ', len); } static struct casereader * preprocess (struct casereader *casereader0, const struct dictionary *dict, void *aux) { struct matrix_format *mformat = aux; const struct caseproto *proto = casereader_get_proto (casereader0); struct casewriter *writer = autopaging_writer_create (proto); struct ccase *prev_case = NULL; double **matrices = NULL; size_t n_splits = 0; const size_t sizeof_matrix = sizeof (double) * mformat->n_continuous_vars * mformat->n_continuous_vars; /* Make an initial pass to populate our temporary matrix */ struct casereader *pass0 = casereader_clone (casereader0); struct ccase *c; union value *prev_values = XCALLOC (mformat->n_split_vars, union value); int row = (mformat->triangle == LOWER && mformat->diagonal == NO_DIAGONAL) ? 1 : 0; bool first_case = true; for (; (c = casereader_read (pass0)) != NULL; case_unref (c)) { int s; bool match = false; if (!first_case) { match = true; for (s = 0; s < mformat->n_split_vars; ++s) { const struct variable *svar = mformat->split_vars[s]; const union value *sv = case_data (c, svar); if (! value_equal (prev_values + s, sv, var_get_width (svar))) { match = false; break; } } } first_case = false; if (matrices == NULL || ! match) { row = (mformat->triangle == LOWER && mformat->diagonal == NO_DIAGONAL) ? 1 : 0; n_splits++; matrices = xrealloc (matrices, sizeof (double*) * n_splits); matrices[n_splits - 1] = xmalloc (sizeof_matrix); } for (s = 0; s < mformat->n_split_vars; ++s) { const struct variable *svar = mformat->split_vars[s]; const union value *sv = case_data (c, svar); value_clone (prev_values + s, sv, var_get_width (svar)); } int c_offset = (mformat->triangle == UPPER) ? row : 0; if (mformat->triangle == UPPER && mformat->diagonal == NO_DIAGONAL) c_offset++; const union value *v = case_data (c, mformat->rowtype); const char *val = CHAR_CAST (const char *, v->s); if (0 == strncasecmp (val, "corr ", ROWTYPE_WIDTH) || 0 == strncasecmp (val, "cov ", ROWTYPE_WIDTH)) { if (row >= mformat->n_continuous_vars) { msg (SE, _("There are %d variable declared but the data has at least %d matrix rows."), mformat->n_continuous_vars, row + 1); case_unref (c); casereader_destroy (pass0); free (prev_values); goto error; } int col; for (col = c_offset; col < mformat->n_continuous_vars; ++col) { const struct variable *var = dict_get_var (dict, 1 + col - c_offset + var_get_dict_index (mformat->varname)); double e = case_data (c, var)->f; if (e == SYSMIS) continue; /* Fill in the lower triangle */ (matrices[n_splits-1])[col + mformat->n_continuous_vars * row] = e; if (mformat->triangle != FULL) /* Fill in the upper triangle */ (matrices[n_splits-1]) [row + mformat->n_continuous_vars * col] = e; } row++; } } casereader_destroy (pass0); free (prev_values); if (!matrices) goto error; /* Now make a second pass to fill in the other triangle from our temporary matrix */ const int idx = var_get_dict_index (mformat->varname); row = 0; if (mformat->n >= 0) { int col; struct ccase *outcase = case_create (proto); union value *v = case_data_rw (outcase, mformat->rowtype); memcpy (v->s, "N ", ROWTYPE_WIDTH); blank_varname_column (outcase, mformat->varname); for (col = 0; col < mformat->n_continuous_vars; ++col) { union value *dest_val = case_data_rw_idx (outcase, 1 + col + var_get_dict_index (mformat->varname)); dest_val->f = mformat->n; } casewriter_write (writer, outcase); } n_splits = 0; prev_values = xcalloc (mformat->n_split_vars, sizeof *prev_values); first_case = true; for (; (c = casereader_read (casereader0)) != NULL; prev_case = c) { int s; bool match = false; if (!first_case) { match = true; for (s = 0; s < mformat->n_split_vars; ++s) { const struct variable *svar = mformat->split_vars[s]; const union value *sv = case_data (c, svar); if (! value_equal (prev_values + s, sv, var_get_width (svar))) { match = false; break; } } } first_case = false; if (! match) { n_splits++; row = 0; } for (s = 0; s < mformat->n_split_vars; ++s) { const struct variable *svar = mformat->split_vars[s]; const union value *sv = case_data (c, svar); value_clone (prev_values + s, sv, var_get_width (svar)); } case_unref (prev_case); const union value *v = case_data (c, mformat->rowtype); const char *val = CHAR_CAST (const char *, v->s); if (mformat->n >= 0) { if (0 == strncasecmp (val, "n ", ROWTYPE_WIDTH) || 0 == strncasecmp (val, "n_vector", ROWTYPE_WIDTH)) { msg (SW, _("The N subcommand was specified, but a N record was also found in the data. The N record will be ignored.")); continue; } } struct ccase *outcase = case_create (proto); case_copy (outcase, 0, c, 0, caseproto_get_n_widths (proto)); if (0 == strncasecmp (val, "corr ", ROWTYPE_WIDTH) || 0 == strncasecmp (val, "cov ", ROWTYPE_WIDTH)) { int col; const struct variable *var = dict_get_var (dict, idx + 1 + row); set_varname_column (outcase, mformat->varname, var_get_name (var)); value_copy (case_data_rw (outcase, mformat->rowtype), v, ROWTYPE_WIDTH); for (col = 0; col < mformat->n_continuous_vars; ++col) { union value *dest_val = case_data_rw_idx (outcase, 1 + col + var_get_dict_index (mformat->varname)); dest_val->f = (matrices[n_splits - 1])[col + mformat->n_continuous_vars * row]; if (col == row && mformat->diagonal == NO_DIAGONAL) dest_val->f = 1.0; } row++; } else { blank_varname_column (outcase, mformat->varname); } /* Special case for SD and N_VECTOR: Rewrite as STDDEV and N respectively */ if (0 == strncasecmp (val, "sd ", ROWTYPE_WIDTH)) { value_copy_buf_rpad (case_data_rw (outcase, mformat->rowtype), ROWTYPE_WIDTH, (uint8_t *) "STDDEV", 6, ' '); } else if (0 == strncasecmp (val, "n_vector", ROWTYPE_WIDTH)) { value_copy_buf_rpad (case_data_rw (outcase, mformat->rowtype), ROWTYPE_WIDTH, (uint8_t *) "N", 1, ' '); } casewriter_write (writer, outcase); } /* If NODIAGONAL is specified, then a final case must be written */ if (mformat->diagonal == NO_DIAGONAL) { int col; struct ccase *outcase = case_create (proto); if (prev_case) case_copy (outcase, 0, prev_case, 0, caseproto_get_n_widths (proto)); const struct variable *var = dict_get_var (dict, idx + 1 + row); set_varname_column (outcase, mformat->varname, var_get_name (var)); for (col = 0; col < mformat->n_continuous_vars; ++col) { union value *dest_val = case_data_rw_idx (outcase, 1 + col + var_get_dict_index (mformat->varname)); dest_val->f = (matrices[n_splits - 1]) [col + mformat->n_continuous_vars * row]; if (col == row && mformat->diagonal == NO_DIAGONAL) dest_val->f = 1.0; } casewriter_write (writer, outcase); } free (prev_values); if (prev_case) case_unref (prev_case); int i; for (i = 0 ; i < n_splits; ++i) free (matrices[i]); free (matrices); struct casereader *reader1 = casewriter_make_reader (writer); casereader_destroy (casereader0); return reader1; error: if (prev_case) case_unref (prev_case); if (matrices) for (i = 0 ; i < n_splits; ++i) free (matrices[i]); free (matrices); casereader_destroy (casereader0); casewriter_destroy (writer); return NULL; } int cmd_matrix (struct lexer *lexer, struct dataset *ds) { struct dictionary *dict; struct data_parser *parser; struct dfm_reader *reader; struct file_handle *fh = NULL; char *encoding = NULL; struct matrix_format mformat; int i; size_t n_names; char **names = NULL; mformat.triangle = LOWER; mformat.diagonal = DIAGONAL; mformat.n_split_vars = 0; mformat.split_vars = NULL; mformat.n = -1; dict = (in_input_program () ? dataset_dict (ds) : dict_create (get_default_encoding ())); parser = data_parser_create (dict); reader = NULL; data_parser_set_type (parser, DP_DELIMITED); data_parser_set_warn_missing_fields (parser, false); data_parser_set_span (parser, false); mformat.rowtype = dict_create_var (dict, "ROWTYPE_", ROWTYPE_WIDTH); mformat.n_continuous_vars = 0; mformat.n_split_vars = 0; if (! lex_force_match_id (lexer, "VARIABLES")) goto error; lex_match (lexer, T_EQUALS); if (! parse_mixed_vars (lexer, dict, &names, &n_names, PV_NO_DUPLICATE)) { int i; for (i = 0; i < n_names; ++i) free (names[i]); free (names); goto error; } int longest_name = 0; for (i = 0; i < n_names; ++i) { maximize_int (&longest_name, strlen (names[i])); } mformat.varname = dict_create_var (dict, "VARNAME_", 8 * DIV_RND_UP (longest_name, 8)); for (i = 0; i < n_names; ++i) { if (0 == strcasecmp (names[i], "ROWTYPE_")) { const struct fmt_spec fmt = fmt_for_input (FMT_A, 8, 0); data_parser_add_delimited_field (parser, &fmt, var_get_case_index (mformat.rowtype), "ROWTYPE_"); } else { const struct fmt_spec fmt = fmt_for_input (FMT_F, 10, 4); struct variable *v = dict_create_var (dict, names[i], 0); var_set_both_formats (v, &fmt); data_parser_add_delimited_field (parser, &fmt, var_get_case_index (mformat.varname) + ++mformat.n_continuous_vars, names[i]); } } for (i = 0; i < n_names; ++i) free (names[i]); free (names); while (lex_token (lexer) != T_ENDCMD) { if (! lex_force_match (lexer, T_SLASH)) goto error; if (lex_match_id (lexer, "N")) { lex_match (lexer, T_EQUALS); if (! lex_force_int (lexer)) goto error; mformat.n = lex_integer (lexer); if (mformat.n < 0) { msg (SE, _("%s must not be negative."), "N"); goto error; } lex_get (lexer); } else if (lex_match_id (lexer, "FORMAT")) { lex_match (lexer, T_EQUALS); while (lex_token (lexer) != T_SLASH && (lex_token (lexer) != T_ENDCMD)) { if (lex_match_id (lexer, "LIST")) { data_parser_set_span (parser, false); } else if (lex_match_id (lexer, "FREE")) { data_parser_set_span (parser, true); } else if (lex_match_id (lexer, "UPPER")) { mformat.triangle = UPPER; } else if (lex_match_id (lexer, "LOWER")) { mformat.triangle = LOWER; } else if (lex_match_id (lexer, "FULL")) { mformat.triangle = FULL; } else if (lex_match_id (lexer, "DIAGONAL")) { mformat.diagonal = DIAGONAL; } else if (lex_match_id (lexer, "NODIAGONAL")) { mformat.diagonal = NO_DIAGONAL; } else { lex_error (lexer, NULL); goto error; } } } else if (lex_match_id (lexer, "FILE")) { lex_match (lexer, T_EQUALS); fh_unref (fh); fh = fh_parse (lexer, FH_REF_FILE | FH_REF_INLINE, NULL); if (fh == NULL) goto error; } else if (lex_match_id (lexer, "SPLIT")) { lex_match (lexer, T_EQUALS); if (! parse_variables (lexer, dict, &mformat.split_vars, &mformat.n_split_vars, 0)) { free (mformat.split_vars); goto error; } int i; for (i = 0; i < mformat.n_split_vars; ++i) { const struct fmt_spec fmt = fmt_for_input (FMT_F, 4, 0); var_set_both_formats (mformat.split_vars[i], &fmt); } dict_reorder_vars (dict, mformat.split_vars, mformat.n_split_vars); mformat.n_continuous_vars -= mformat.n_split_vars; } else { lex_error (lexer, NULL); goto error; } } if (mformat.diagonal == NO_DIAGONAL && mformat.triangle == FULL) { msg (SE, _("FORMAT = FULL and FORMAT = NODIAGONAL are mutually exclusive.")); goto error; } if (fh == NULL) fh = fh_inline_file (); fh_set_default_handle (fh); if (!data_parser_any_fields (parser)) { msg (SE, _("At least one variable must be specified.")); goto error; } if (lex_end_of_command (lexer) != CMD_SUCCESS) goto error; reader = dfm_open_reader (fh, lexer, encoding); if (reader == NULL) goto error; if (in_input_program ()) { struct data_list_trns *trns = xmalloc (sizeof *trns); trns->parser = parser; trns->reader = reader; trns->end = NULL; add_transformation (ds, data_list_trns_proc, data_list_trns_free, trns); } else { data_parser_make_active_file (parser, ds, reader, dict, preprocess, &mformat); } fh_unref (fh); free (encoding); free (mformat.split_vars); return CMD_DATA_LIST; error: data_parser_destroy (parser); if (!in_input_program ()) dict_unref (dict); fh_unref (fh); free (encoding); free (mformat.split_vars); return CMD_CASCADING_FAILURE; } /* Input procedure. */ /* Destroys DATA LIST transformation TRNS. Returns true if successful, false if an I/O error occurred. */ static bool data_list_trns_free (void *trns_) { struct data_list_trns *trns = trns_; data_parser_destroy (trns->parser); dfm_close_reader (trns->reader); free (trns); return true; } /* Handle DATA LIST transformation TRNS, parsing data into *C. */ static int data_list_trns_proc (void *trns_, struct ccase **c, casenumber case_num UNUSED) { struct data_list_trns *trns = trns_; int retval; *c = case_unshare (*c); if (data_parser_parse (trns->parser, trns->reader, *c)) retval = TRNS_CONTINUE; else if (dfm_reader_error (trns->reader) || dfm_eof (trns->reader) > 1) { /* An I/O error, or encountering end of file for a second time, should be escalated into a more serious error. */ retval = TRNS_ERROR; } else retval = TRNS_END_FILE; /* If there was an END subcommand handle it. */ if (trns->end != NULL) { double *end = &case_data_rw (*c, trns->end)->f; if (retval == TRNS_END_FILE) { *end = 1.0; retval = TRNS_CONTINUE; } else *end = 0.0; } return retval; } pspp-1.4.1/src/language/data-io/file-handle.c0000644000175000017500000002375113320146056020327 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 1997-2000, 2006, 2010-2013, 2016 Free Software Foundation, Inc. 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 3 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, see . */ #include #include "data/file-handle-def.h" #include #include #include #include "data/file-name.h" #include "data/session.h" #include "data/variable.h" #include "language/command.h" #include "language/data-io/file-handle.h" #include "language/lexer/lexer.h" #include "libpspp/assertion.h" #include "libpspp/cast.h" #include "libpspp/message.h" #include "libpspp/str.h" #include "gl/xalloc.h" #include "gettext.h" #define _(msgid) gettext (msgid) int cmd_file_handle (struct lexer *lexer, struct dataset *ds UNUSED) { enum cmd_result result = CMD_CASCADING_FAILURE; char *handle_name = NULL; char *file_name = NULL; int lrecl = 0; int tabwidth = -1; enum { MODE_DEFAULT, MODE_CHARACTER, MODE_BINARY, MODE_IMAGE, MODE_360 } mode = MODE_DEFAULT; int ends = -1; enum { RECFORM_FIXED = 1, RECFORM_VARIABLE, RECFORM_SPANNED } recform = 0; char *encoding = NULL; if (!lex_force_id (lexer)) goto exit; handle_name = xstrdup (lex_tokcstr (lexer)); if (fh_from_id (handle_name)) { msg (SE, _("File handle %s is already defined. " "Use %s before redefining a file handle."), handle_name, "CLOSE FILE HANDLE"); goto exit; } lex_get (lexer); if (!lex_force_match (lexer, T_SLASH)) goto exit; while (lex_token (lexer) != T_ENDCMD) { if (lex_match_id (lexer, "NAME")) { if (file_name) { lex_sbc_only_once ("NAME"); goto exit; } lex_match (lexer, T_EQUALS); if (!lex_force_string (lexer)) goto exit; free (file_name); file_name = ss_xstrdup (lex_tokss (lexer)); lex_get (lexer); } else if (lex_match_id (lexer, "LRECL")) { if (lrecl) { lex_sbc_only_once ("LRECL"); goto exit; } lex_match (lexer, T_EQUALS); if (!lex_force_int (lexer)) goto exit; lrecl = lex_integer (lexer); lex_get (lexer); } else if (lex_match_id (lexer, "TABWIDTH")) { if (tabwidth >= 0) { lex_sbc_only_once ("TABWIDTH"); goto exit; } lex_match (lexer, T_EQUALS); if (!lex_force_int (lexer)) goto exit; tabwidth = lex_integer (lexer); lex_get (lexer); } else if (lex_match_id (lexer, "MODE")) { if (mode != MODE_DEFAULT) { lex_sbc_only_once ("MODE"); goto exit; } lex_match (lexer, T_EQUALS); if (lex_match_id (lexer, "CHARACTER")) mode = MODE_CHARACTER; else if (lex_match_id (lexer, "BINARY")) mode = MODE_BINARY; else if (lex_match_id (lexer, "IMAGE")) mode = MODE_IMAGE; else if (lex_match_int (lexer, 360)) mode = MODE_360; else { lex_error (lexer, NULL); goto exit; } } else if (lex_match_id (lexer, "ENDS")) { if (ends >= 0) { lex_sbc_only_once ("ENDS"); goto exit; } lex_match (lexer, T_EQUALS); if (lex_match_id (lexer, "LF")) ends = FH_END_LF; else if (lex_match_id (lexer, "CRLF")) ends = FH_END_CRLF; else { lex_error (lexer, NULL); goto exit; } } else if (lex_match_id (lexer, "RECFORM")) { if (recform) { lex_sbc_only_once ("RECFORM"); goto exit; } lex_match (lexer, T_EQUALS); if (lex_match_id (lexer, "FIXED") || lex_match_id (lexer, "F")) recform = RECFORM_FIXED; else if (lex_match_id (lexer, "VARIABLE") || lex_match_id (lexer, "V")) recform = RECFORM_VARIABLE; else if (lex_match_id (lexer, "SPANNED") || lex_match_id (lexer, "VS")) recform = RECFORM_SPANNED; else { lex_error (lexer, NULL); goto exit; } } else if (lex_match_id (lexer, "ENCODING")) { if (encoding) { lex_sbc_only_once ("ENCODING"); goto exit; } lex_match (lexer, T_EQUALS); if (!lex_force_string (lexer)) goto exit; free (encoding); encoding = ss_xstrdup (lex_tokss (lexer)); lex_get (lexer); } if (!lex_match (lexer, T_SLASH)) break; } if (lex_end_of_command (lexer) != CMD_SUCCESS) goto exit; struct fh_properties properties = *fh_default_properties (); if (file_name == NULL) { lex_sbc_missing ("NAME"); goto exit; } switch (mode) { case MODE_DEFAULT: case MODE_CHARACTER: properties.mode = FH_MODE_TEXT; if (tabwidth >= 0) properties.tab_width = tabwidth; if (ends) properties.line_ends = ends; break; case MODE_IMAGE: properties.mode = FH_MODE_FIXED; break; case MODE_BINARY: properties.mode = FH_MODE_VARIABLE; break; case MODE_360: properties.encoding = CONST_CAST (char *, "EBCDIC-US"); if (recform == RECFORM_FIXED) properties.mode = FH_MODE_FIXED; else if (recform == RECFORM_VARIABLE) { properties.mode = FH_MODE_360_VARIABLE; properties.record_width = 8192; } else if (recform == RECFORM_SPANNED) { properties.mode = FH_MODE_360_SPANNED; properties.record_width = 8192; } else { msg (SE, _("%s must be specified with %s."), "RECFORM", "MODE=360"); goto exit; } break; default: NOT_REACHED (); } if (properties.mode == FH_MODE_FIXED || lrecl) { if (!lrecl) msg (SE, _("The specified file mode requires LRECL. " "Assuming %zu-character records."), properties.record_width); else if (lrecl < 1 || lrecl >= (1UL << 31)) msg (SE, _("Record length (%d) must be between 1 and %lu bytes. " "Assuming %zu-character records."), lrecl, (1UL << 31) - 1, properties.record_width); else properties.record_width = lrecl; } if (encoding) properties.encoding = encoding; fh_create_file (handle_name, file_name, lex_get_encoding (lexer), &properties); result = CMD_SUCCESS; exit: free (handle_name); free (file_name); free (encoding); return result; } int cmd_close_file_handle (struct lexer *lexer, struct dataset *ds UNUSED) { struct file_handle *handle; if (!lex_force_id (lexer)) return CMD_CASCADING_FAILURE; handle = fh_from_id (lex_tokcstr (lexer)); if (handle == NULL) return CMD_CASCADING_FAILURE; fh_unname (handle); return CMD_SUCCESS; } /* Returns the name for REFERENT. */ static const char * referent_name (enum fh_referent referent) { switch (referent) { case FH_REF_FILE: return _("file"); case FH_REF_INLINE: return _("inline file"); case FH_REF_DATASET: return _("dataset"); default: NOT_REACHED (); } } /* Parses a file handle name: - If SESSION is nonnull, then the parsed syntax may be the name of a dataset within SESSION. Dataset names take precedence over file handle names. - If REFERENT_MASK includes FH_REF_FILE, the parsed syntax may be a file name as a string or a file handle name as an identifier. - If REFERENT_MASK includes FH_REF_INLINE, the parsed syntax may be the identifier INLINE to represent inline data. Returns the file handle when successful, a null pointer on failure. The caller is responsible for fh_unref()'ing the returned file handle when it is no longer needed. */ struct file_handle * fh_parse (struct lexer *lexer, enum fh_referent referent_mask, struct session *session) { struct file_handle *handle; if (session != NULL && lex_token (lexer) == T_ID) { struct dataset *ds; ds = session_lookup_dataset (session, lex_tokcstr (lexer)); if (ds != NULL) { lex_get (lexer); return fh_create_dataset (ds); } } if (lex_match_id (lexer, "INLINE")) handle = fh_inline_file (); else { if (lex_token (lexer) != T_ID && !lex_is_string (lexer)) { lex_error (lexer, _("expecting a file name or handle name")); return NULL; } handle = NULL; if (lex_token (lexer) == T_ID) handle = fh_from_id (lex_tokcstr (lexer)); if (handle == NULL) handle = fh_create_file (NULL, lex_tokcstr (lexer), lex_get_encoding (lexer), fh_default_properties ()); lex_get (lexer); } if (!(fh_get_referent (handle) & referent_mask)) { msg (SE, _("Handle for %s not allowed here."), referent_name (fh_get_referent (handle))); fh_unref (handle); return NULL; } return handle; } /* Local variables: mode: c End: */ pspp-1.4.1/src/language/data-io/placement-parser.c0000644000175000017500000003077413723216277021436 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2006, 2010, 2011, 2012 Free Software Foundation, Inc. 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 3 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, see . */ #include #include "language/data-io/placement-parser.h" #include #include "data/format.h" #include "language/lexer/format-parser.h" #include "language/lexer/lexer.h" #include "libpspp/message.h" #include "libpspp/pool.h" #include "libpspp/str.h" #include "gl/c-strcase.h" #include "gl/xalloc.h" #include "gl/xsize.h" #include "gettext.h" #define _(msgid) gettext (msgid) /* Extensions to the format specifiers used only for placement. */ enum { PRS_TYPE_T = SCHAR_MAX - 3, /* Tab to absolute column. */ PRS_TYPE_X, /* Skip columns. */ PRS_TYPE_NEW_REC /* Next record. */ }; static bool fixed_parse_columns (struct lexer *, struct pool *, size_t var_cnt, enum fmt_use, struct fmt_spec **, size_t *); static bool fixed_parse_fortran (struct lexer *l, struct pool *, enum fmt_use, struct fmt_spec **, size_t *); /* Parses Fortran-like or column-based specifications for placing variable data in fixed positions in columns and rows, that is, formats like those parsed by DATA LIST or PRINT. Returns true only if successful. The formats parsed are either input or output formats, according to USE. If USE is FMT_FOR_INPUT, then T, X, and / "formats" are parsed, in addition to regular formats. If USE is FMT_FOR_OUTPUT, then T and X "formats" are parsed but not /. If successful, formats for VAR_CNT variables are stored in *FORMATS, and the number of formats required is stored in *FORMAT_CNT. *FORMAT_CNT may be greater than VAR_CNT because of T, X, and / "formats", but success guarantees that exactly VAR_CNT variables will be placed by the output formats. The caller should call execute_placement_format to process those "formats" in interpreting the output. Uses POOL for allocation. When the caller is finished interpreting *FORMATS, POOL may be destroyed. */ bool parse_var_placements (struct lexer *lexer, struct pool *pool, size_t var_cnt, enum fmt_use use, struct fmt_spec **formats, size_t *format_cnt) { assert (var_cnt > 0); if (lex_is_number (lexer)) return fixed_parse_columns (lexer, pool, var_cnt, use, formats, format_cnt); else if (lex_match (lexer, T_LPAREN)) { size_t assignment_cnt; size_t i; if (!fixed_parse_fortran (lexer, pool, use, formats, format_cnt)) return false; assignment_cnt = 0; for (i = 0; i < *format_cnt; i++) assignment_cnt += (*formats)[i].type < FMT_NUMBER_OF_FORMATS; if (assignment_cnt != var_cnt) { msg (SE, _("Number of variables specified (%zu) " "differs from number of variable formats (%zu)."), var_cnt, assignment_cnt); return false; } return true; } else { msg (SE, _("SPSS-like or Fortran-like format " "specification expected after variable names.")); return false; } } /* Implements parse_var_placements for column-based formats. */ static bool fixed_parse_columns (struct lexer *lexer, struct pool *pool, size_t var_cnt, enum fmt_use use, struct fmt_spec **formats, size_t *format_cnt) { struct fmt_spec format; int fc, lc; size_t i; if (!parse_column_range (lexer, 1, &fc, &lc, NULL)) return false; /* Divide columns evenly. */ format.w = (lc - fc + 1) / var_cnt; if ((lc - fc + 1) % var_cnt) { msg (SE, _("The %d columns %d-%d " "can't be evenly divided into %zu fields."), lc - fc + 1, fc, lc, var_cnt); return false; } /* Format specifier. */ if (lex_match (lexer, T_LPAREN)) { /* Get format type. */ if (lex_token (lexer) == T_ID) { if (!parse_format_specifier_name (lexer, &format.type)) return false; lex_match (lexer, T_COMMA); } else format.type = FMT_F; /* Get decimal places. */ if (lex_is_integer (lexer)) { format.d = lex_integer (lexer); lex_get (lexer); } else format.d = 0; if (!lex_force_match (lexer, T_RPAREN)) return false; } else { format.type = FMT_F; format.d = 0; } if (!fmt_check (&format, use)) return false; *formats = pool_nalloc (pool, var_cnt + 1, sizeof **formats); *format_cnt = var_cnt + 1; (*formats)[0].type = (enum fmt_type) PRS_TYPE_T; (*formats)[0].w = fc; for (i = 1; i <= var_cnt; i++) (*formats)[i] = format; return true; } /* Implements parse_var_placements for Fortran-like formats. */ static bool fixed_parse_fortran (struct lexer *lexer, struct pool *pool, enum fmt_use use, struct fmt_spec **formats, size_t *format_cnt) { size_t formats_allocated = 0; size_t formats_used = 0; *formats = NULL; while (!lex_match (lexer, T_RPAREN)) { struct fmt_spec f; struct fmt_spec *new_formats; size_t new_format_cnt; size_t count; size_t formats_needed; /* Parse count. */ if (lex_is_integer (lexer)) { count = lex_integer (lexer); lex_get (lexer); } else count = 1; /* Parse format specifier. */ if (lex_match (lexer, T_LPAREN)) { /* Call ourselves recursively to handle parentheses. */ if (!fixed_parse_fortran (lexer, pool, use, &new_formats, &new_format_cnt)) return false; } else { new_formats = &f; new_format_cnt = 1; if (use == FMT_FOR_INPUT && lex_match (lexer, T_SLASH)) f.type = (enum fmt_type) PRS_TYPE_NEW_REC; else { char type[FMT_TYPE_LEN_MAX + 1]; if (!parse_abstract_format_specifier (lexer, type, &f.w, &f.d)) return false; if (!c_strcasecmp (type, "T")) f.type = (enum fmt_type) PRS_TYPE_T; else if (!c_strcasecmp (type, "X")) { f.type = (enum fmt_type) PRS_TYPE_X; f.w = count; count = 1; } else { if (!fmt_from_name (type, &f.type)) { msg (SE, _("Unknown format type `%s'."), type); return false; } if (!fmt_check (&f, use)) return false; } } } /* Add COUNT copies of the NEW_FORMAT_CNT formats in NEW_FORMATS to FORMATS. */ if (new_format_cnt != 0 && size_overflow_p (xtimes (xsum (formats_used, xtimes (count, new_format_cnt)), sizeof *formats))) xalloc_die (); formats_needed = count * new_format_cnt; if (formats_used + formats_needed > formats_allocated) { formats_allocated = formats_used + formats_needed; *formats = pool_2nrealloc (pool, *formats, &formats_allocated, sizeof **formats); } for (; count > 0; count--) { memcpy (&(*formats)[formats_used], new_formats, sizeof **formats * new_format_cnt); formats_used += new_format_cnt; } lex_match (lexer, T_COMMA); } *format_cnt = formats_used; return true; } /* Checks whether FORMAT represents one of the special "formats" for T, X, or /. If so, updates *RECORD or *COLUMN (or both) as appropriate, and returns true. Otherwise, returns false without any side effects. */ bool execute_placement_format (const struct fmt_spec *format, int *record, int *column) { switch ((int) format->type) { case PRS_TYPE_X: *column += format->w; return true; case PRS_TYPE_T: *column = format->w; return true; case PRS_TYPE_NEW_REC: (*record)++; *column = 1; return true; default: assert (format->type < FMT_NUMBER_OF_FORMATS); return false; } } static bool parse_column__ (int value, int base, int *column) { assert (base == 0 || base == 1); *column = value - base + 1; if (*column < 1) { if (base == 1) msg (SE, _("Column positions for fields must be positive.")); else msg (SE, _("Column positions for fields must not be negative.")); return false; } return true; } /* Parses a BASE-based column using LEXER. Returns true and stores a 1-based column number into *COLUMN if successful, otherwise emits an error message and returns false. If BASE is 0, zero-based column numbers are parsed; if BASE is 1, 1-based column numbers are parsed. Regardless of BASE, the values stored in *FIRST_COLUMN and *LAST_COLUMN are 1-based. */ bool parse_column (struct lexer *lexer, int base, int *column) { assert (base == 0 || base == 1); if (!lex_force_int (lexer) || !parse_column__ (lex_integer (lexer), base, column)) return false; lex_get (lexer); return true; } /* Parse a column or a range of columns, specified as a single integer or two integers delimited by a dash. Stores the range in *FIRST_COLUMN and *LAST_COLUMN. (If only a single integer is given, it is stored in both.) If RANGE_SPECIFIED is non-null, then *RANGE_SPECIFIED is set to true if the syntax contained a dash, false otherwise. Returns true if successful, false if the syntax was invalid or the values specified did not make sense. If BASE is 0, zero-based column numbers are parsed; if BASE is 1, 1-based column numbers are parsed. Regardless of BASE, the values stored in *FIRST_COLUMN and *LAST_COLUMN are 1-based. */ bool parse_column_range (struct lexer *lexer, int base, int *first_column, int *last_column, bool *range_specified) { /* First column. */ if (!lex_force_int (lexer) || !parse_column__ (lex_integer (lexer), base, first_column)) return false; lex_get (lexer); /* Last column. */ if (lex_is_integer (lexer) && lex_integer (lexer) < 0) { if (!parse_column__ (-lex_integer (lexer), base, last_column)) return false; lex_get (lexer); if (*last_column < *first_column) { msg (SE, _("The ending column for a field must be " "greater than the starting column.")); return false; } if (range_specified) *range_specified = true; } else { *last_column = *first_column; if (range_specified) *range_specified = false; } return true; } /* Parses a (possibly empty) sequence of slashes, each of which may be followed by an integer. A slash on its own increases *RECORD by 1 and sets *COLUMN to 1. A slash followed by an integer sets *RECORD to the integer, as long as that increases *RECORD, and sets *COLUMN to 1. Returns true if successful, false on syntax error. */ bool parse_record_placement (struct lexer *lexer, int *record, int *column) { while (lex_match (lexer, T_SLASH)) { if (lex_is_number (lexer)) { double orignum = lex_number (lexer); long n = (lex_is_integer (lexer)?lex_integer (lexer):*record); bool out_of_range = orignum > INT_MAX || orignum < INT_MIN; if (n <= *record || out_of_range) { msg (SE, _("The record number specified, %.0f, is at or " "before the previous record, %d. Data " "fields must be listed in order of " "increasing record number."), orignum, *record); return false; } *record = n; lex_get (lexer); } else (*record)++; *column = 1; } assert (*record >= 1); return true; } pspp-1.4.1/src/language/data-io/data-reader.h0000644000175000017500000000403513320146056020327 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 1997-9, 2000, 2010, 2011, 2012, 2016 Free Software Foundation, Inc. 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 3 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, see . */ #ifndef DFM_READ_H #define DFM_READ_H /* Data file manager (dfm). This module is in charge of reading and writing data files (other than system files). dfm is an fhuser, so see file-handle.h for the fhuser interface. */ #include #include struct file_handle; struct string; struct lexer; /* Input. */ struct dfm_reader *dfm_open_reader (struct file_handle *, struct lexer *, const char *encoding); void dfm_close_reader (struct dfm_reader *); bool dfm_reader_error (const struct dfm_reader *); unsigned dfm_eof (struct dfm_reader *); struct substring dfm_get_record (struct dfm_reader *); void dfm_expand_tabs (struct dfm_reader *); const char *dfm_reader_get_encoding (const struct dfm_reader *); /* Line control. */ void dfm_forward_record (struct dfm_reader *); void dfm_reread_record (struct dfm_reader *, size_t column); void dfm_forward_columns (struct dfm_reader *, size_t columns); size_t dfm_column_start (const struct dfm_reader *); size_t dfm_columns_past_end (const struct dfm_reader *); size_t dfm_get_column (const struct dfm_reader *, const char *); /* Information. */ const char *dfm_get_file_name (const struct dfm_reader *); int dfm_get_line_number (const struct dfm_reader *); #endif /* data-reader.h */ pspp-1.4.1/src/language/data-io/matrix-reader.h0000644000175000017500000000314013320146056020716 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2017 Free Software Foundation, Inc. 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 3 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, see . */ #ifndef MATRIX_READER_H #define MATRIX_READER_H #include #include struct matrix_material { gsl_matrix *corr ; /* The correlation matrix */ gsl_matrix *cov ; /* The covariance matrix */ /* Moment matrices */ const gsl_matrix *n ; /* MOMENT 0 */ const gsl_matrix *mean_matrix; /* MOMENT 1 */ const gsl_matrix *var_matrix; /* MOMENT 2 */ }; struct dictionary; struct variable; struct casereader; struct matrix_reader; struct matrix_reader *create_matrix_reader_from_case_reader (const struct dictionary *dict, struct casereader *in_reader, const struct variable ***vars, size_t *n_vars); bool destroy_matrix_reader (struct matrix_reader *mr); bool next_matrix_from_reader (struct matrix_material *mm, struct matrix_reader *mr, const struct variable **vars, int n_vars); #endif pspp-1.4.1/src/language/data-io/combine-files.c0000644000175000017500000007133413670210420020666 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 1997-9, 2000, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014 Free Software Foundation, Inc. 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 3 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, see . */ #include #include #include "data/any-reader.h" #include "data/case-matcher.h" #include "data/case.h" #include "data/casereader.h" #include "data/casewriter.h" #include "data/dataset.h" #include "data/dictionary.h" #include "data/format.h" #include "data/subcase.h" #include "data/variable.h" #include "language/command.h" #include "language/data-io/file-handle.h" #include "language/data-io/trim.h" #include "language/lexer/lexer.h" #include "language/lexer/variable-parser.h" #include "language/stats/sort-criteria.h" #include "libpspp/assertion.h" #include "libpspp/i18n.h" #include "libpspp/message.h" #include "libpspp/string-array.h" #include "libpspp/taint.h" #include "math/sort.h" #include "gl/xalloc.h" #include "gettext.h" #define _(msgid) gettext (msgid) enum comb_command_type { COMB_ADD, COMB_MATCH, COMB_UPDATE }; /* File types. */ enum comb_file_type { COMB_FILE, /* Specified on FILE= subcommand. */ COMB_TABLE /* Specified on TABLE= subcommand. */ }; /* One FILE or TABLE subcommand. */ struct comb_file { /* Basics. */ enum comb_file_type type; /* COMB_FILE or COMB_TABLE. */ /* Variables. */ struct subcase by_vars; /* BY variables in this input file. */ struct subcase src, dst; /* Data to copy to output; where to put it. */ const struct missing_values **mv; /* Each variable's missing values. */ /* Input files. */ struct file_handle *handle; /* Input file handle. */ struct dictionary *dict; /* Input file dictionary. */ struct casereader *reader; /* Input data source. */ struct ccase *data; /* The current input case. */ bool is_minimal; /* Does 'data' have minimum BY values across all input files? */ bool is_sorted; /* Is file presorted on the BY variables? */ /* IN subcommand. */ char *in_name; struct variable *in_var; }; struct comb_proc { struct comb_file *files; /* All the files being merged. */ size_t n_files; /* Number of files. */ struct dictionary *dict; /* Dictionary of output file. */ struct subcase by_vars; /* BY variables in the output. */ struct casewriter *output; /* Destination for output. */ struct case_matcher *matcher; /* FIRST, LAST. Only if "first" or "last" is nonnull are the remaining members used. */ struct variable *first; /* Variable specified on FIRST (if any). */ struct variable *last; /* Variable specified on LAST (if any). */ struct ccase *buffered_case; /* Case ready for output except that we don't know the value for the LAST var yet. */ union value *prev_BY; /* Values of BY vars in buffered_case. */ }; static int combine_files (enum comb_command_type, struct lexer *, struct dataset *); static void free_comb_proc (struct comb_proc *); static void close_all_comb_files (struct comb_proc *); static bool merge_dictionary (struct dictionary *const, struct comb_file *); static void execute_update (struct comb_proc *); static void execute_match_files (struct comb_proc *); static void execute_add_files (struct comb_proc *); static bool create_flag_var (const char *subcommand_name, const char *var_name, struct dictionary *, struct variable **); static void output_case (struct comb_proc *, struct ccase *, union value *by); static void output_buffered_case (struct comb_proc *); int cmd_add_files (struct lexer *lexer, struct dataset *ds) { return combine_files (COMB_ADD, lexer, ds); } int cmd_match_files (struct lexer *lexer, struct dataset *ds) { return combine_files (COMB_MATCH, lexer, ds); } int cmd_update (struct lexer *lexer, struct dataset *ds) { return combine_files (COMB_UPDATE, lexer, ds); } static int combine_files (enum comb_command_type command, struct lexer *lexer, struct dataset *ds) { struct comb_proc proc; bool saw_by = false; bool saw_sort = false; struct casereader *active_file = NULL; char *first_name = NULL; char *last_name = NULL; struct taint *taint = NULL; size_t n_tables = 0; size_t allocated_files = 0; size_t i; proc.files = NULL; proc.n_files = 0; proc.dict = dict_create (get_default_encoding ()); proc.output = NULL; proc.matcher = NULL; subcase_init_empty (&proc.by_vars); proc.first = NULL; proc.last = NULL; proc.buffered_case = NULL; proc.prev_BY = NULL; dict_set_case_limit (proc.dict, dict_get_case_limit (dataset_dict (ds))); lex_match (lexer, T_SLASH); for (;;) { struct comb_file *file; enum comb_file_type type; if (lex_match_id (lexer, "FILE")) type = COMB_FILE; else if (command == COMB_MATCH && lex_match_id (lexer, "TABLE")) { type = COMB_TABLE; n_tables++; } else break; lex_match (lexer, T_EQUALS); if (proc.n_files >= allocated_files) proc.files = x2nrealloc (proc.files, &allocated_files, sizeof *proc.files); file = &proc.files[proc.n_files++]; file->type = type; subcase_init_empty (&file->by_vars); subcase_init_empty (&file->src); subcase_init_empty (&file->dst); file->mv = NULL; file->handle = NULL; file->dict = NULL; file->reader = NULL; file->data = NULL; file->is_sorted = true; file->in_name = NULL; file->in_var = NULL; if (lex_match (lexer, T_ASTERISK)) { if (!dataset_has_source (ds)) { msg (SE, _("Cannot specify the active dataset since none " "has been defined.")); goto error; } if (proc_make_temporary_transformations_permanent (ds)) msg (SE, _("This command may not be used after TEMPORARY when " "the active dataset is an input source. " "Temporary transformations will be made permanent.")); file->dict = dict_clone (dataset_dict (ds)); } else { file->handle = fh_parse (lexer, FH_REF_FILE, dataset_session (ds)); if (file->handle == NULL) goto error; file->reader = any_reader_open_and_decode (file->handle, NULL, &file->dict, NULL); if (file->reader == NULL) goto error; } while (lex_match (lexer, T_SLASH)) if (lex_match_id (lexer, "RENAME")) { if (!parse_dict_rename (lexer, file->dict, false)) goto error; } else if (lex_match_id (lexer, "IN")) { lex_match (lexer, T_EQUALS); if (lex_token (lexer) != T_ID) { lex_error (lexer, NULL); goto error; } if (file->in_name) { msg (SE, _("Multiple IN subcommands for a single FILE or " "TABLE.")); goto error; } file->in_name = xstrdup (lex_tokcstr (lexer)); lex_get (lexer); } else if (lex_match_id (lexer, "SORT")) { file->is_sorted = false; saw_sort = true; } if (!merge_dictionary (proc.dict, file)) goto error; } while (lex_token (lexer) != T_ENDCMD) { if (lex_match (lexer, T_BY)) { const struct variable **by_vars; size_t i; bool ok; if (saw_by) { lex_sbc_only_once ("BY"); goto error; } saw_by = true; lex_match (lexer, T_EQUALS); if (!parse_sort_criteria (lexer, proc.dict, &proc.by_vars, &by_vars, NULL)) goto error; ok = true; for (i = 0; i < proc.n_files; i++) { struct comb_file *file = &proc.files[i]; size_t j; for (j = 0; j < subcase_get_n_fields (&proc.by_vars); j++) { const char *name = var_get_name (by_vars[j]); struct variable *var = dict_lookup_var (file->dict, name); if (var != NULL) subcase_add_var (&file->by_vars, var, subcase_get_direction (&proc.by_vars, j)); else { if (file->handle != NULL) msg (SE, _("File %s lacks BY variable %s."), fh_get_name (file->handle), name); else msg (SE, _("Active dataset lacks BY variable %s."), name); ok = false; } } assert (!ok || subcase_conformable (&file->by_vars, &proc.files[0].by_vars)); } free (by_vars); if (!ok) goto error; } else if (command != COMB_UPDATE && lex_match_id (lexer, "FIRST")) { if (first_name != NULL) { lex_sbc_only_once ("FIRST"); goto error; } lex_match (lexer, T_EQUALS); if (!lex_force_id (lexer)) goto error; first_name = xstrdup (lex_tokcstr (lexer)); lex_get (lexer); } else if (command != COMB_UPDATE && lex_match_id (lexer, "LAST")) { if (last_name != NULL) { lex_sbc_only_once ("LAST"); goto error; } lex_match (lexer, T_EQUALS); if (!lex_force_id (lexer)) goto error; last_name = xstrdup (lex_tokcstr (lexer)); lex_get (lexer); } else if (lex_match_id (lexer, "MAP")) { /* FIXME. */ } else if (lex_match_id (lexer, "DROP")) { if (!parse_dict_drop (lexer, proc.dict)) goto error; } else if (lex_match_id (lexer, "KEEP")) { if (!parse_dict_keep (lexer, proc.dict)) goto error; } else { lex_error (lexer, NULL); goto error; } if (!lex_match (lexer, T_SLASH) && lex_token (lexer) != T_ENDCMD) { lex_end_of_command (lexer); goto error; } } if (!saw_by) { if (command == COMB_UPDATE) { lex_sbc_missing ("BY"); goto error; } if (n_tables) { msg (SE, _("BY is required when %s is specified."), "TABLE"); goto error; } if (saw_sort) { msg (SE, _("BY is required when %s is specified."), "SORT"); goto error; } } /* Add IN, FIRST, and LAST variables to master dictionary. */ for (i = 0; i < proc.n_files; i++) { struct comb_file *file = &proc.files[i]; if (!create_flag_var ("IN", file->in_name, proc.dict, &file->in_var)) goto error; } if (!create_flag_var ("FIRST", first_name, proc.dict, &proc.first) || !create_flag_var ("LAST", last_name, proc.dict, &proc.last)) goto error; dict_delete_scratch_vars (proc.dict); dict_compact_values (proc.dict); /* Set up mapping from each file's variables to master variables. */ for (i = 0; i < proc.n_files; i++) { struct comb_file *file = &proc.files[i]; size_t src_var_cnt = dict_get_var_cnt (file->dict); size_t j; file->mv = xnmalloc (src_var_cnt, sizeof *file->mv); for (j = 0; j < src_var_cnt; j++) { struct variable *src_var = dict_get_var (file->dict, j); struct variable *dst_var = dict_lookup_var (proc.dict, var_get_name (src_var)); if (dst_var != NULL) { size_t n = subcase_get_n_fields (&file->src); file->mv[n] = var_get_missing_values (src_var); subcase_add_var (&file->src, src_var, SC_ASCEND); subcase_add_var (&file->dst, dst_var, SC_ASCEND); } } } proc.output = autopaging_writer_create (dict_get_proto (proc.dict)); taint = taint_clone (casewriter_get_taint (proc.output)); /* Set up case matcher. */ proc.matcher = case_matcher_create (); for (i = 0; i < proc.n_files; i++) { struct comb_file *file = &proc.files[i]; if (file->reader == NULL) { if (active_file == NULL) { proc_discard_output (ds); file->reader = active_file = proc_open_filtering (ds, false); } else file->reader = casereader_clone (active_file); } if (!file->is_sorted) file->reader = sort_execute (file->reader, &file->by_vars); taint_propagate (casereader_get_taint (file->reader), taint); file->data = casereader_read (file->reader); if (file->type == COMB_FILE) case_matcher_add_input (proc.matcher, &file->by_vars, &file->data, &file->is_minimal); } if (command == COMB_ADD) execute_add_files (&proc); else if (command == COMB_MATCH) execute_match_files (&proc); else if (command == COMB_UPDATE) execute_update (&proc); else NOT_REACHED (); case_matcher_destroy (proc.matcher); proc.matcher = NULL; close_all_comb_files (&proc); if (active_file != NULL) proc_commit (ds); dataset_set_dict (ds, proc.dict); dataset_set_source (ds, casewriter_make_reader (proc.output)); proc.dict = NULL; proc.output = NULL; free_comb_proc (&proc); free (first_name); free (last_name); return taint_destroy (taint) ? CMD_SUCCESS : CMD_CASCADING_FAILURE; error: if (active_file != NULL) proc_commit (ds); free_comb_proc (&proc); taint_destroy (taint); free (first_name); free (last_name); return CMD_CASCADING_FAILURE; } /* Merge the dictionary for file F into master dictionary M. */ static bool merge_dictionary (struct dictionary *const m, struct comb_file *f) { struct dictionary *d = f->dict; const struct string_array *d_docs, *m_docs; int i; if (dict_get_label (m) == NULL) dict_set_label (m, dict_get_label (d)); d_docs = dict_get_documents (d); m_docs = dict_get_documents (m); /* FIXME: If the input files have different encodings, then the result is undefined. The correct thing to do would be to convert to an encoding which can cope with all the input files (eg UTF-8). */ if (0 != strcmp (dict_get_encoding (f->dict), dict_get_encoding (m))) msg (MW, _("Combining files with incompatible encodings. String data may " "not be represented correctly.")); if (d_docs != NULL) { if (m_docs == NULL) dict_set_documents (m, d_docs); else { struct string_array new_docs; size_t i; new_docs.n = m_docs->n + d_docs->n; new_docs.strings = xmalloc (new_docs.n * sizeof *new_docs.strings); for (i = 0; i < m_docs->n; i++) new_docs.strings[i] = m_docs->strings[i]; for (i = 0; i < d_docs->n; i++) new_docs.strings[m_docs->n + i] = d_docs->strings[i]; dict_set_documents (m, &new_docs); free (new_docs.strings); } } for (i = 0; i < dict_get_var_cnt (d); i++) { struct variable *dv = dict_get_var (d, i); struct variable *mv = dict_lookup_var (m, var_get_name (dv)); if (dict_class_from_id (var_get_name (dv)) == DC_SCRATCH) continue; if (mv != NULL) { if (var_get_width (mv) != var_get_width (dv)) { const char *var_name = var_get_name (dv); struct string s = DS_EMPTY_INITIALIZER; const char *file_name; file_name = f->handle ? fh_get_name (f->handle) : "*"; ds_put_format (&s, _("Variable %s in file %s has different " "type or width from the same variable in " "earlier file."), var_name, file_name); ds_put_cstr (&s, " "); if (var_is_numeric (dv)) ds_put_format (&s, _("In file %s, %s is numeric."), file_name, var_name); else ds_put_format (&s, _("In file %s, %s is a string variable " "with width %d."), file_name, var_name, var_get_width (dv)); ds_put_cstr (&s, " "); if (var_is_numeric (mv)) ds_put_format (&s, _("In an earlier file, %s was numeric."), var_name); else ds_put_format (&s, _("In an earlier file, %s was a string " "variable with width %d."), var_name, var_get_width (mv)); msg (SE, "%s", ds_cstr (&s)); ds_destroy (&s); return false; } if (var_has_value_labels (dv) && !var_has_value_labels (mv)) var_set_value_labels (mv, var_get_value_labels (dv)); if (var_has_missing_values (dv) && !var_has_missing_values (mv)) var_set_missing_values (mv, var_get_missing_values (dv)); if (var_get_label (dv) && !var_get_label (mv)) var_set_label (mv, var_get_label (dv)); } else mv = dict_clone_var_assert (m, dv); } return true; } /* If VAR_NAME is non-NULL, attempts to create a variable named VAR_NAME, with format F1.0, in DICT, and stores a pointer to the variable in *VAR. Returns true if successful, false if the variable name is a duplicate (in which case a message saying that the variable specified on the given SUBCOMMAND is a duplicate is emitted). Does nothing and returns true if VAR_NAME is null. */ static bool create_flag_var (const char *subcommand, const char *var_name, struct dictionary *dict, struct variable **var) { if (var_name != NULL) { struct fmt_spec format = fmt_for_output (FMT_F, 1, 0); *var = dict_create_var (dict, var_name, 0); if (*var == NULL) { msg (SE, _("Variable name %s specified on %s subcommand " "duplicates an existing variable name."), subcommand, var_name); return false; } var_set_both_formats (*var, &format); } else *var = NULL; return true; } /* Closes all the files in PROC and frees their associated data. */ static void close_all_comb_files (struct comb_proc *proc) { size_t i; for (i = 0; i < proc->n_files; i++) { struct comb_file *file = &proc->files[i]; subcase_destroy (&file->by_vars); subcase_destroy (&file->src); subcase_destroy (&file->dst); free (file->mv); fh_unref (file->handle); dict_unref (file->dict); casereader_destroy (file->reader); case_unref (file->data); free (file->in_name); } free (proc->files); proc->files = NULL; proc->n_files = 0; } /* Frees all the data for the procedure. */ static void free_comb_proc (struct comb_proc *proc) { close_all_comb_files (proc); dict_unref (proc->dict); casewriter_destroy (proc->output); case_matcher_destroy (proc->matcher); if (proc->prev_BY) { caseproto_destroy_values (subcase_get_proto (&proc->by_vars), proc->prev_BY); free (proc->prev_BY); } subcase_destroy (&proc->by_vars); case_unref (proc->buffered_case); } static bool scan_table (struct comb_file *, union value by[]); static struct ccase *create_output_case (const struct comb_proc *); static void apply_case (const struct comb_file *, struct ccase *); static void apply_nonmissing_case (const struct comb_file *, struct ccase *); static void advance_file (struct comb_file *, union value by[]); static void output_case (struct comb_proc *, struct ccase *, union value by[]); static void output_buffered_case (struct comb_proc *); /* Executes the ADD FILES command. */ static void execute_add_files (struct comb_proc *proc) { union value *by; while (case_matcher_match (proc->matcher, &by)) { size_t i; for (i = 0; i < proc->n_files; i++) { struct comb_file *file = &proc->files[i]; while (file->is_minimal) { struct ccase *output = create_output_case (proc); apply_case (file, output); advance_file (file, by); output_case (proc, output, by); } } } output_buffered_case (proc); } /* Executes the MATCH FILES command. */ static void execute_match_files (struct comb_proc *proc) { union value *by; while (case_matcher_match (proc->matcher, &by)) { struct ccase *output; size_t i; output = create_output_case (proc); for (i = proc->n_files; i-- > 0;) { struct comb_file *file = &proc->files[i]; if (file->type == COMB_FILE) { if (file->is_minimal) { apply_case (file, output); advance_file (file, NULL); } } else { if (scan_table (file, by)) apply_case (file, output); } } output_case (proc, output, by); } output_buffered_case (proc); } /* Executes the UPDATE command. */ static void execute_update (struct comb_proc *proc) { union value *by; size_t n_duplicates = 0; while (case_matcher_match (proc->matcher, &by)) { struct comb_file *first, *file; struct ccase *output; /* Find first nonnull case in array and make an output case from it. */ output = create_output_case (proc); for (first = &proc->files[0]; ; first++) if (first->is_minimal) break; apply_case (first, output); advance_file (first, by); /* Read additional cases and update the output case from them. (Don't update the output case from any duplicate cases in the master file.) */ for (file = first + (first == proc->files); file < &proc->files[proc->n_files]; file++) { while (file->is_minimal) { apply_nonmissing_case (file, output); advance_file (file, by); } } casewriter_write (proc->output, output); /* Write duplicate cases in the master file directly to the output. */ if (first == proc->files && first->is_minimal) { n_duplicates++; while (first->is_minimal) { output = create_output_case (proc); apply_case (first, output); advance_file (first, by); casewriter_write (proc->output, output); } } } if (n_duplicates) msg (SW, _("Encountered %zu sets of duplicate cases in the master file."), n_duplicates); } /* Reads FILE, which must be of type COMB_TABLE, until it encounters a case with BY or greater for its BY variables. Returns true if a case with exactly BY for its BY variables was found, otherwise false. */ static bool scan_table (struct comb_file *file, union value by[]) { while (file->data != NULL) { int cmp = subcase_compare_3way_xc (&file->by_vars, by, file->data); if (cmp > 0) { case_unref (file->data); file->data = casereader_read (file->reader); } else return cmp == 0; } return false; } /* Creates and returns an output case for PROC, initializing each of its values to system-missing or blanks, except that the values of IN variables are set to 0. */ static struct ccase * create_output_case (const struct comb_proc *proc) { size_t n_vars = dict_get_var_cnt (proc->dict); struct ccase *output; size_t i; output = case_create (dict_get_proto (proc->dict)); for (i = 0; i < n_vars; i++) { struct variable *v = dict_get_var (proc->dict, i); value_set_missing (case_data_rw (output, v), var_get_width (v)); } for (i = 0; i < proc->n_files; i++) { struct comb_file *file = &proc->files[i]; if (file->in_var != NULL) case_data_rw (output, file->in_var)->f = false; } return output; } static void mark_file_used (const struct comb_file *file, struct ccase *output) { if (file->in_var != NULL) case_data_rw (output, file->in_var)->f = true; } /* Copies the data from FILE's case into output case OUTPUT. If FILE has an IN variable, then it is set to 1 in OUTPUT. */ static void apply_case (const struct comb_file *file, struct ccase *output) { subcase_copy (&file->src, file->data, &file->dst, output); mark_file_used (file, output); } /* Copies the data from FILE's case into output case OUTPUT, skipping values that are missing or all spaces. If FILE has an IN variable, then it is set to 1 in OUTPUT. */ static void apply_nonmissing_case (const struct comb_file *file, struct ccase *output) { size_t i; for (i = 0; i < subcase_get_n_fields (&file->src); i++) { const struct subcase_field *src_field = &file->src.fields[i]; const struct subcase_field *dst_field = &file->dst.fields[i]; const union value *src_value = case_data_idx (file->data, src_field->case_index); int width = src_field->width; if (!mv_is_value_missing (file->mv[i], src_value, MV_ANY) && !(width > 0 && value_is_spaces (src_value, width))) value_copy (case_data_rw_idx (output, dst_field->case_index), src_value, width); } mark_file_used (file, output); } /* Advances FILE to its next case. If BY is nonnull, then FILE's is_minimal member is updated based on whether the new case's BY values still match those in BY. */ static void advance_file (struct comb_file *file, union value by[]) { case_unref (file->data); file->data = casereader_read (file->reader); if (by) file->is_minimal = (file->data != NULL && subcase_equal_cx (&file->by_vars, file->data, by)); } /* Writes OUTPUT, whose BY values has been extracted into BY, to PROC's output file, first initializing any FIRST or LAST variables in OUTPUT to the correct values. */ static void output_case (struct comb_proc *proc, struct ccase *output, union value by[]) { if (proc->first == NULL && proc->last == NULL) casewriter_write (proc->output, output); else { /* It's harder with LAST, because we can't know whether this case is the last in a group until we've prepared the *next* case also. Thus, we buffer the previous output case until the next one is ready. */ bool new_BY; if (proc->prev_BY != NULL) { new_BY = !subcase_equal_xx (&proc->by_vars, proc->prev_BY, by); if (proc->last != NULL) case_data_rw (proc->buffered_case, proc->last)->f = new_BY; casewriter_write (proc->output, proc->buffered_case); } else new_BY = true; proc->buffered_case = output; if (proc->first != NULL) case_data_rw (proc->buffered_case, proc->first)->f = new_BY; if (new_BY) { size_t n_values = subcase_get_n_fields (&proc->by_vars); const struct caseproto *proto = subcase_get_proto (&proc->by_vars); if (proc->prev_BY == NULL) { proc->prev_BY = xmalloc (n_values * sizeof *proc->prev_BY); caseproto_init_values (proto, proc->prev_BY); } caseproto_copy (subcase_get_proto (&proc->by_vars), 0, n_values, proc->prev_BY, by); } } } /* Writes a trailing buffered case to the output, if FIRST or LAST is in use. */ static void output_buffered_case (struct comb_proc *proc) { if (proc->prev_BY != NULL) { if (proc->last != NULL) case_data_rw (proc->buffered_case, proc->last)->f = 1.0; casewriter_write (proc->output, proc->buffered_case); proc->buffered_case = NULL; } } pspp-1.4.1/src/language/data-io/placement-parser.h0000644000175000017500000000305713320146056021423 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2006, 2012 Free Software Foundation, Inc. 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 3 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, see . */ #ifndef LANGUAGE_DATA_IO_PLACEMENT_PARSER_H #define LANGUAGE_DATA_IO_PLACEMENT_PARSER_H 1 #include #include #include "data/format.h" struct pool; struct lexer; bool parse_record_placement (struct lexer *, int *record, int *column); bool parse_var_placements (struct lexer *, struct pool *, size_t var_cnt, enum fmt_use, struct fmt_spec **, size_t *format_cnt); bool execute_placement_format (const struct fmt_spec *, int *record, int *column); bool parse_column (struct lexer *lexer, int base, int *column); bool parse_column_range (struct lexer *, int base, int *first_column, int *last_column, bool *range_specified); #endif /* language/data-io/placement-parser.h */ pspp-1.4.1/src/language/data-io/data-parser.h0000644000175000017500000000721613700645725020376 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2007, 2011, 2016 Free Software Foundation, Inc. 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 3 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, see . */ #ifndef LANGUAGE_DATA_IO_DATA_PARSER_H #define LANGUAGE_DATA_IO_DATA_PARSER_H /* Abstraction of a DATA LIST or GET DATA TYPE=TXT data parser. */ #include #include "data/case.h" #include "libpspp/str.h" struct dataset; struct dfm_reader; struct dictionary; struct file_handle; struct fmt_spec; struct substring; /* Type of data read by a data parser. */ enum data_parser_type { DP_FIXED, /* Fields in fixed column positions. */ DP_DELIMITED /* Fields delimited by e.g. commas. */ }; /* Creating and configuring any parser. */ struct data_parser *data_parser_create (struct dictionary *dict); void data_parser_destroy (struct data_parser *); enum data_parser_type data_parser_get_type (const struct data_parser *); void data_parser_set_type (struct data_parser *, enum data_parser_type); void data_parser_set_skip (struct data_parser *, int initial_records_to_skip); /* For configuring delimited parsers only. */ bool data_parser_get_span (const struct data_parser *); void data_parser_set_span (struct data_parser *, bool may_cases_span_records); void data_parser_set_empty_line_has_field (struct data_parser *, bool empty_line_has_field); void data_parser_set_warn_missing_fields (struct data_parser *parser, bool warn_missing_fields); void data_parser_set_quotes (struct data_parser *, struct substring); void data_parser_set_quote_escape (struct data_parser *, bool escape); void data_parser_set_soft_delimiters (struct data_parser *, struct substring); void data_parser_set_hard_delimiters (struct data_parser *, struct substring); /* For configuring fixed parsers only. */ int data_parser_get_records (const struct data_parser *); void data_parser_set_records (struct data_parser *, int records_per_case); /* Field setup and parsing. */ void data_parser_add_delimited_field (struct data_parser *, const struct fmt_spec *, int fv, const char *name); void data_parser_add_fixed_field (struct data_parser *, const struct fmt_spec *, int fv, const char *name, int record, int first_column); bool data_parser_any_fields (const struct data_parser *); bool data_parser_parse (struct data_parser *, struct dfm_reader *, struct ccase *); /* Uses for a configured parser. */ void data_parser_output_description (struct data_parser *, const struct file_handle *); struct casereader; void data_parser_make_active_file (struct data_parser *, struct dataset *, struct dfm_reader *, struct dictionary *, struct casereader* (*func)(struct casereader *, const struct dictionary *, void *), void *ud); #endif /* language/data-io/data-parser.h */ pspp-1.4.1/src/language/data-io/file-handle.h0000644000175000017500000000216613320146056020331 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 1997-9, 2000, 2010, 2011 Free Software Foundation, Inc. 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 3 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, see . */ #ifndef LANGUAGE_DATA_IO_FILE_HANDLE_H #define LANGUAGE_DATA_IO_FILE_HANDLE_H 1 /* Parsing file handles. */ #include #include #include "data/file-handle-def.h" struct lexer; struct session; struct file_handle *fh_parse (struct lexer *, enum fh_referent, struct session *); #endif /* language/data-io/file-handle.h */ pspp-1.4.1/src/language/data-io/dataset.c0000644000175000017500000001634413573024421017605 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2010, 2011 Free Software Foundation, Inc. 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 3 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, see . */ #include #include "language/command.h" #include "data/dataset.h" #include "data/session.h" #include "language/lexer/lexer.h" #include "libpspp/message.h" #include "output/pivot-table.h" #include "gettext.h" #define N_(msgid) msgid #define _(msgid) gettext (msgid) static int parse_window (struct lexer *lexer, unsigned int allowed, enum dataset_display def) { if (!lex_match_id (lexer, "WINDOW")) return def; lex_match (lexer, T_EQUALS); if (allowed & (1 << DATASET_MINIMIZED) && lex_match_id (lexer, "MINIMIZED")) return DATASET_MINIMIZED; else if (allowed & (1 << DATASET_ASIS) && lex_match_id (lexer, "ASIS")) return DATASET_ASIS; else if (allowed & (1 << DATASET_FRONT) && lex_match_id (lexer, "FRONT")) return DATASET_FRONT; else if (allowed & (1 << DATASET_HIDDEN) && lex_match_id (lexer, "HIDDEN")) return DATASET_HIDDEN; lex_error (lexer, NULL); return -1; } static struct dataset * parse_dataset_name (struct lexer *lexer, struct session *session) { struct dataset *ds; if (!lex_force_id (lexer)) return NULL; ds = session_lookup_dataset (session, lex_tokcstr (lexer)); if (ds != NULL) lex_get (lexer); else msg (SE, _("There is no dataset named %s."), lex_tokcstr (lexer)); return ds; } int cmd_dataset_name (struct lexer *lexer, struct dataset *active) { int display; if (!lex_force_id (lexer)) return CMD_FAILURE; dataset_set_name (active, lex_tokcstr (lexer)); lex_get (lexer); display = parse_window (lexer, (1 << DATASET_ASIS) | (1 << DATASET_FRONT), DATASET_ASIS); if (display < 0) return CMD_FAILURE; else if (display != DATASET_ASIS) dataset_set_display (active, display); return CMD_SUCCESS; } int cmd_dataset_activate (struct lexer *lexer, struct dataset *active) { struct session *session = dataset_session (active); struct dataset *ds; int display; ds = parse_dataset_name (lexer, session); if (ds == NULL) return CMD_FAILURE; if (ds != active) { proc_execute (active); session_set_active_dataset (session, ds); if (dataset_name (active)[0] == '\0') dataset_destroy (active); return CMD_SUCCESS; } display = parse_window (lexer, (1 << DATASET_ASIS) | (1 << DATASET_FRONT), DATASET_ASIS); if (display < 0) return CMD_FAILURE; else if (display != DATASET_ASIS) dataset_set_display (ds, display); return CMD_SUCCESS; } int cmd_dataset_copy (struct lexer *lexer, struct dataset *old) { struct session *session = dataset_session (old); struct dataset *new; int display; char *name; /* Parse the entire command first. proc_execute() can attempt to parse BEGIN DATA...END DATA and it will fail confusingly if we are in the middle of the command at the point. */ if (!lex_force_id (lexer)) return CMD_FAILURE; name = xstrdup (lex_tokcstr (lexer)); lex_get (lexer); display = parse_window (lexer, ((1 << DATASET_MINIMIZED) | (1 << DATASET_HIDDEN) | (1 << DATASET_FRONT)), DATASET_MINIMIZED); if (display < 0) { free (name); return CMD_FAILURE; } if (session_lookup_dataset (session, name) == old) { new = old; dataset_set_name (old, ""); } else { proc_execute (old); new = dataset_clone (old, name); } dataset_set_display (new, display); free (name); return CMD_SUCCESS; } int cmd_dataset_declare (struct lexer *lexer, struct dataset *ds) { struct session *session = dataset_session (ds); struct dataset *new; int display; if (!lex_force_id (lexer)) return CMD_FAILURE; new = session_lookup_dataset (session, lex_tokcstr (lexer)); if (new == NULL) new = dataset_create (session, lex_tokcstr (lexer)); lex_get (lexer); display = parse_window (lexer, ((1 << DATASET_MINIMIZED) | (1 << DATASET_HIDDEN) | (1 << DATASET_FRONT)), DATASET_MINIMIZED); if (display < 0) return CMD_FAILURE; dataset_set_display (new, display); return CMD_SUCCESS; } static void dataset_close_cb (struct dataset *ds, void *session_) { struct session *session = session_; if (ds != session_active_dataset (session)) dataset_destroy (ds); } int cmd_dataset_close (struct lexer *lexer, struct dataset *ds) { struct session *session = dataset_session (ds); if (lex_match (lexer, T_ALL)) { session_for_each_dataset (session, dataset_close_cb, session); dataset_set_name (session_active_dataset (session), ""); } else { if (!lex_match (lexer, T_ASTERISK)) { ds = parse_dataset_name (lexer, session); if (ds == NULL) return CMD_FAILURE; } if (ds == session_active_dataset (session)) dataset_set_name (ds, ""); else dataset_destroy (ds); } return CMD_SUCCESS; } static void dataset_display_cb (struct dataset *ds, void *p_) { struct dataset ***p = p_; **p = ds; (*p)++; } static int sort_datasets (const void *a_, const void *b_) { struct dataset *const *a = a_; struct dataset *const *b = b_; return strcmp (dataset_name (*a), dataset_name (*b)); } int cmd_dataset_display (struct lexer *lexer UNUSED, struct dataset *ds) { struct session *session = dataset_session (ds); size_t n = session_n_datasets (session); struct dataset **datasets = xmalloc (n * sizeof *datasets); struct dataset **p = datasets; session_for_each_dataset (session, dataset_display_cb, &p); qsort (datasets, n, sizeof *datasets, sort_datasets); struct pivot_table *table = pivot_table_create (N_("Datasets")); struct pivot_dimension *datasets_dim = pivot_dimension_create ( table, PIVOT_AXIS_ROW, N_("Dataset")); datasets_dim->hide_all_labels = true; for (size_t i = 0; i < n; i++) { struct dataset *ds = datasets[i]; const char *name; name = dataset_name (ds); if (name[0] == '\0') name = _("unnamed dataset"); char *text = (ds == session_active_dataset (session) ? xasprintf ("%s (%s)", name, _("active dataset")) : xstrdup (name)); int dataset_idx = pivot_category_create_leaf ( datasets_dim->root, pivot_value_new_integer (i)); pivot_table_put1 (table, dataset_idx, pivot_value_new_user_text_nocopy (text)); } free (datasets); pivot_table_submit (table); return CMD_SUCCESS; } pspp-1.4.1/src/language/tests/0000755000175000017500000000000013725012647015636 5ustar00blpblp00000000000000pspp-1.4.1/src/language/tests/automake.mk0000644000175000017500000000200013571051220017752 0ustar00blpblp00000000000000# PSPP - a program for statistical analysis. # Copyright (C) 2017 Free Software Foundation, Inc. # # 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 3 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, see . # ## Process this file with automake to produce Makefile.in -*- makefile -*- language_tests_sources = \ src/language/tests/format-guesser-test.c \ src/language/tests/float-format.c \ src/language/tests/moments-test.c \ src/language/tests/paper-size.c \ src/language/tests/pool-test.c pspp-1.4.1/src/language/tests/moments-test.c0000644000175000017500000000700213320146056020431 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 1997-9, 2000, 2010, 2011 Free Software Foundation, Inc. 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 3 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, see . */ #include #include #include #include #include "language/command.h" #include "language/lexer/lexer.h" #include "libpspp/compiler.h" #include "math/moments.h" #include "gl/xalloc.h" #include "gettext.h" #define _(msgid) gettext (msgid) static bool read_values (struct lexer *lexer, double **values, double **weights, size_t *cnt) { size_t cap = 0; *values = NULL; *weights = NULL; *cnt = 0; while (lex_is_number (lexer)) { double value = lex_tokval (lexer); double weight = 1.; lex_get (lexer); if (lex_match (lexer, T_ASTERISK)) { if (!lex_is_number (lexer)) { lex_error (lexer, _("expecting weight value")); return false; } weight = lex_tokval (lexer); lex_get (lexer); } if (*cnt >= cap) { cap = 2 * (cap + 8); *values = xnrealloc (*values, cap, sizeof **values); *weights = xnrealloc (*weights, cap, sizeof **weights); } (*values)[*cnt] = value; (*weights)[*cnt] = weight; (*cnt)++; } return true; } int cmd_debug_moments (struct lexer *lexer, struct dataset *ds UNUSED) { int retval = CMD_FAILURE; double *values = NULL; double *weights = NULL; double weight, M[4]; int two_pass = 1; size_t cnt; size_t i; if (lex_match_id (lexer, "ONEPASS")) two_pass = 0; if (!lex_force_match (lexer, T_SLASH)) goto done; if (two_pass) { struct moments *m = NULL; m = moments_create (MOMENT_KURTOSIS); if (!read_values (lexer, &values, &weights, &cnt)) { moments_destroy (m); goto done; } for (i = 0; i < cnt; i++) moments_pass_one (m, values[i], weights[i]); for (i = 0; i < cnt; i++) moments_pass_two (m, values[i], weights[i]); moments_calculate (m, &weight, &M[0], &M[1], &M[2], &M[3]); moments_destroy (m); } else { struct moments1 *m = NULL; m = moments1_create (MOMENT_KURTOSIS); if (!read_values (lexer, &values, &weights, &cnt)) { moments1_destroy (m); goto done; } for (i = 0; i < cnt; i++) moments1_add (m, values[i], weights[i]); moments1_calculate (m, &weight, &M[0], &M[1], &M[2], &M[3]); moments1_destroy (m); } fprintf (stderr, "W=%.3f", weight); for (i = 0; i < 4; i++) { fprintf (stderr, " M%zu=", i + 1); if (M[i] == SYSMIS) fprintf (stderr, "sysmis"); else if (fabs (M[i]) <= 0.0005) fprintf (stderr, "0.000"); else fprintf (stderr, "%.3f", M[i]); } fprintf (stderr, "\n"); retval = CMD_SUCCESS; done: free (values); free (weights); return retval; } pspp-1.4.1/src/language/tests/pool-test.c0000644000175000017500000000575713320146056017737 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2000, 2011 Free Software Foundation, Inc. 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 3 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, see . */ #include #include #include #include #include #include #include "libpspp/pool.h" #include "language/command.h" #define N_ITERATIONS 8192 #define N_FILES 16 /* Self-test routine. This is not exhaustive, but it can be useful. */ int cmd_debug_pool (struct lexer *lexer UNUSED, struct dataset *ds UNUSED) { int seed = time (0) * 257 % 32768; for (;;) { struct pool *pool; struct pool_mark m1, m2; FILE *files[N_FILES]; int cur_file; long i; printf ("Random number seed: %d\n", seed); srand (seed++); printf ("Creating pool...\n"); pool = pool_create (); printf ("Marking pool state...\n"); pool_mark (pool, &m1); printf (" Populating pool with random-sized small objects...\n"); for (i = 0; i < N_ITERATIONS; i++) { size_t size = rand () % MAX_SUBALLOC; void *p = pool_alloc (pool, size); memset (p, 0, size); } printf (" Marking pool state...\n"); pool_mark (pool, &m2); printf (" Populating pool with random-sized small " "and large objects...\n"); for (i = 0; i < N_ITERATIONS; i++) { size_t size = rand () % (2 * MAX_SUBALLOC); void *p = pool_alloc (pool, size); memset (p, 0, size); } printf (" Releasing pool state...\n"); pool_release (pool, &m2); printf (" Populating pool with random objects and gizmos...\n"); for (i = 0; i < N_FILES; i++) files[i] = NULL; cur_file = 0; for (i = 0; i < N_ITERATIONS; i++) { int type = rand () % 32; if (type == 0) { if (files[cur_file] != NULL && EOF == pool_fclose (pool, files[cur_file])) printf ("error on fclose: %s\n", strerror (errno)); files[cur_file] = pool_fopen (pool, "/dev/null", "r"); if (++cur_file >= N_FILES) cur_file = 0; } else if (type == 1) pool_create_subpool (pool); else { size_t size = rand () % (2 * MAX_SUBALLOC); void *p = pool_alloc (pool, size); memset (p, 0, size); } } printf ("Releasing pool state...\n"); pool_release (pool, &m1); printf ("Destroying pool...\n"); pool_destroy (pool); putchar ('\n'); } return CMD_SUCCESS; } pspp-1.4.1/src/language/tests/format-guesser-test.c0000644000175000017500000000336213320146056021717 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2008, 2010, 2011 Free Software Foundation, Inc. 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 3 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, see . */ #include #include #include "data/format.h" #include "data/format-guesser.h" #include "language/command.h" #include "language/lexer/lexer.h" #include "libpspp/message.h" /* Executes the DEBUG FORMAT GUESSER command. */ int cmd_debug_format_guesser (struct lexer *lexer, struct dataset *ds UNUSED) { struct fmt_guesser *g; struct fmt_spec format; char format_string[FMT_STRING_LEN_MAX + 1]; g = fmt_guesser_create (); while (lex_is_string (lexer)) { fprintf (stderr, "\"%s\" ", lex_tokcstr (lexer)); fmt_guesser_add (g, lex_tokss (lexer)); lex_get (lexer); } fmt_guesser_guess (g, &format); fmt_to_string (&format, format_string); fprintf (stderr, "=> %s", format_string); msg_disable (); if (!fmt_check_input (&format)) { fmt_fix_input (&format); fmt_to_string (&format, format_string); fprintf (stderr, " (%s)", format_string); } msg_enable (); putc ('\n', stderr); fmt_guesser_destroy (g); return CMD_SUCCESS; } pspp-1.4.1/src/language/tests/paper-size.c0000644000175000017500000000273413320146056020060 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2007, 2010, 2011 Free Software Foundation, Inc. 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 3 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, see . */ #include #include #include "language/command.h" #include "language/lexer/lexer.h" #include "libpspp/assertion.h" #include "libpspp/string-map.h" #include "output/measure.h" /* Executes the DEBUG PAPER SIZE command. */ int cmd_debug_paper_size (struct lexer *lexer, struct dataset *ds UNUSED) { const char *paper_size; int h, v; if (!lex_force_string (lexer)) return CMD_FAILURE; paper_size = lex_tokcstr (lexer); printf ("\"%s\" => ", paper_size); if (measure_paper (paper_size, &h, &v)) printf ("%.1f x %.1f in, %.0f x %.0f mm\n", h / 72000., v / 72000., h / (72000 / 25.4), v / (72000 / 25.4)); else printf ("error\n"); lex_get (lexer); return CMD_SUCCESS; } pspp-1.4.1/src/language/tests/float-format.c0000644000175000017500000002217313320146056020373 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2006, 2010 Free Software Foundation, Inc. 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 3 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, see . */ #include #include "libpspp/float-format.h" #include #include #include #include "language/command.h" #include "language/lexer/lexer.h" #include "libpspp/assertion.h" #include "libpspp/cast.h" #include "libpspp/message.h" #include "libpspp/str.h" /* Maximum supported size of a floating-point number, in bytes. */ #define FP_MAX_SIZE 32 /* A floating-point number tagged with its representation. */ struct fp { enum float_format format; /* Format. */ uint8_t data[FP_MAX_SIZE]; /* Representation. */ }; /* Associates a format name with its identifier. */ struct assoc { char name[4]; enum float_format format; }; /* List of floating-point formats. */ static const struct assoc fp_formats[] = { {"ISL", FLOAT_IEEE_SINGLE_LE}, {"ISB", FLOAT_IEEE_SINGLE_BE}, {"IDL", FLOAT_IEEE_DOUBLE_LE}, {"IDB", FLOAT_IEEE_DOUBLE_BE}, {"VF", FLOAT_VAX_F}, {"VD", FLOAT_VAX_D}, {"VG", FLOAT_VAX_G}, {"ZS", FLOAT_Z_SHORT}, {"ZL", FLOAT_Z_LONG}, {"X", FLOAT_HEX}, {"FP", FLOAT_FP}, }; static const size_t format_cnt = sizeof fp_formats / sizeof *fp_formats; /* Parses a floating-point format name into *FORMAT, and returns success. */ static bool parse_float_format (struct lexer *lexer, enum float_format *format) { size_t i; for (i = 0; i < format_cnt; i++) if (lex_match_id (lexer, fp_formats[i].name)) { *format = fp_formats[i].format; return true; } lex_error (lexer, "expecting floating-point format identifier"); return false; } /* Returns the name for the given FORMAT. */ static const char * get_float_format_name (enum float_format format) { size_t i; for (i = 0; i < format_cnt; i++) if (fp_formats[i].format == format) return fp_formats[i].name; NOT_REACHED (); } /* Returns the integer value of (hex) digit C. */ static int digit_value (int c) { switch (c) { case '0': return 0; case '1': return 1; case '2': return 2; case '3': return 3; case '4': return 4; case '5': return 5; case '6': return 6; case '7': return 7; case '8': return 8; case '9': return 9; case 'a': case 'A': return 10; case 'b': case 'B': return 11; case 'c': case 'C': return 12; case 'd': case 'D': return 13; case 'e': case 'E': return 14; case 'f': case 'F': return 15; default: return INT_MAX; } } /* Parses a number in the form FORMAT(STRING), where FORMAT is the name of the format and STRING gives the number's representation. Also supports ordinary floating-point numbers written in decimal notation. Returns success. */ static bool parse_fp (struct lexer *lexer, struct fp *fp) { memset (fp, 0, sizeof *fp); if (lex_is_number (lexer)) { double number = lex_number (lexer); fp->format = FLOAT_NATIVE_DOUBLE; memcpy (fp->data, &number, sizeof number); lex_get (lexer); } else if (lex_token (lexer) == T_ID) { struct substring s; if (!parse_float_format (lexer, &fp->format) || !lex_force_match (lexer, T_LPAREN) || !lex_force_string (lexer)) return false; s = lex_tokss (lexer); if (fp->format != FLOAT_HEX) { size_t i; if (s.length != float_get_size (fp->format) * 2) { msg (SE, "%zu-byte string needed but %zu-byte string " "supplied.", float_get_size (fp->format), s.length); return false; } assert (s.length / 2 <= sizeof fp->data); for (i = 0; i < s.length / 2; i++) { int hi = digit_value (s.string[i * 2]); int lo = digit_value (s.string[i * 2 + 1]); if (hi >= 16 || lo >= 16) { msg (SE, "Invalid hex digit in string."); return false; } fp->data[i] = hi * 16 + lo; } } else { if (s.length >= sizeof fp->data) { msg (SE, "Hexadecimal floating constant too long."); return false; } memcpy (fp->data, s.string, s.length); } lex_get (lexer); if (!lex_force_match (lexer, T_RPAREN)) return false; } else { lex_error (lexer, NULL); return false; } return true; } /* Renders SRC, which contains SRC_SIZE bytes of a floating-point number in the given FORMAT, as relatively human-readable null-terminated string in the DST_SIZE bytes in DST. DST_SIZE must be be large enough to hold the output. */ static void make_printable (enum float_format format, const void *src_, size_t src_size, char *dst, size_t dst_size) { assert (dst_size >= 2 * src_size + 1); if (format != FLOAT_HEX) { const uint8_t *src = src_; while (src_size-- > 0) { sprintf (dst, "%02x", *src++); dst += 2; } *dst = '\0'; } else strncpy (dst, src_, src_size + 1); } /* Checks that RESULT is identical to TO. If so, returns false. If not, issues a helpful error message that includes the given CONVERSION_TYPE and the value that was converted FROM, and returns true. */ static bool mismatch (const struct fp *from, const struct fp *to, char *result, const char *conversion_type) { size_t to_size = float_get_size (to->format); if (!memcmp (to->data, result, to_size)) return false; else { size_t from_size = float_get_size (from->format); char original[FP_MAX_SIZE * 2 + 1]; char expected[FP_MAX_SIZE * 2 + 1]; char actual[FP_MAX_SIZE * 2 + 1]; make_printable (from->format, from->data, from_size, original, sizeof original); make_printable (to->format, to->data, to_size, expected, sizeof expected); make_printable (to->format, result, to_size, actual, sizeof actual); msg (SE, "%s conversion of %s from %s to %s should have produced %s " "but actually produced %s.", conversion_type, original, get_float_format_name (from->format), get_float_format_name (to->format), expected, actual); return true; } } /* Checks that converting FROM into the format of TO yields exactly the data in TO. */ static bool verify_conversion (const struct fp *from, const struct fp *to) { char tmp1[FP_MAX_SIZE], tmp2[FP_MAX_SIZE]; /* First try converting directly. */ float_convert (from->format, from->data, to->format, tmp1); if (mismatch (from, to, tmp1, "Direct")) return false; /* Then convert via FLOAT_FP to prevent short-circuiting that float_convert() does for some conversions (e.g. little<->big endian for IEEE formats). */ float_convert (from->format, from->data, FLOAT_FP, tmp1); float_convert (FLOAT_FP, tmp1, to->format, tmp2); if (mismatch (from, to, tmp2, "Indirect")) return false; return true; } /* Executes the DEBUG FLOAT FORMAT command. */ int cmd_debug_float_format (struct lexer *lexer, struct dataset *ds UNUSED) { struct fp fp[16]; size_t fp_cnt = 0; bool bijective = false; bool ok; for (;;) { if (fp_cnt >= sizeof fp / sizeof *fp) { msg (SE, "Too many values in single command."); return CMD_FAILURE; } if (!parse_fp (lexer, &fp[fp_cnt++])) return CMD_FAILURE; if (lex_token (lexer) == T_ENDCMD && fp_cnt > 1) break; else if (!lex_force_match (lexer, T_EQUALS)) return CMD_FAILURE; if (fp_cnt == 1) { if (lex_match (lexer, T_EQUALS)) bijective = true; else if (lex_match (lexer, T_GT)) bijective = false; else { lex_error (lexer, NULL); return CMD_FAILURE; } } else { if ((bijective && !lex_force_match (lexer, T_EQUALS)) || (!bijective && !lex_force_match (lexer, T_GT))) return CMD_FAILURE; } } ok = true; if (bijective) { size_t i, j; for (i = 0; i < fp_cnt; i++) for (j = 0; j < fp_cnt; j++) if (!verify_conversion (&fp[i], &fp[j])) ok = false; } else { size_t i; for (i = 1; i < fp_cnt; i++) if (!verify_conversion (&fp[i - 1], &fp[i])) ok = false; } return ok ? CMD_SUCCESS : CMD_FAILURE; } pspp-1.4.1/src/language/utilities/0000755000175000017500000000000013725012647016507 5ustar00blpblp00000000000000pspp-1.4.1/src/language/utilities/automake.mk0000644000175000017500000000257113571051220020640 0ustar00blpblp00000000000000# PSPP - a program for statistical analysis. # Copyright (C) 2017 Free Software Foundation, Inc. # # 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 3 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, see . # ## Process this file with automake to produce Makefile.in -*- makefile -*- src_language_utilities_built_sources = \ src/language/utilities/set.c language_utilities_sources = \ src/language/utilities/cache.c \ src/language/utilities/cd.c \ src/language/utilities/date.c \ src/language/utilities/echo.c \ src/language/utilities/host.c \ src/language/utilities/title.c \ src/language/utilities/include.c \ src/language/utilities/output.c \ src/language/utilities/permissions.c all_q_sources += $(src_language_utilities_built_sources:.c=.q) EXTRA_DIST += $(src_language_utilities_built_sources:.c=.q) CLEANFILES += $(src_language_utilities_built_sources) pspp-1.4.1/src/language/utilities/cd.c0000644000175000017500000000270413717773141017250 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2008, 2010, 2011 Free Software Foundation, Inc. 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 3 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, see . */ #include #include "language/command.h" #include #include #include "language/lexer/lexer.h" #include "libpspp/i18n.h" #include "libpspp/message.h" #include "gettext.h" #define _(msgid) gettext (msgid) /* Parses the CD command. */ int cmd_cd (struct lexer *lexer, struct dataset *ds UNUSED) { char *path = 0; if (! lex_force_string (lexer)) goto error; path = utf8_to_filename (lex_tokcstr (lexer)); if (-1 == chdir (path)) { int err = errno; msg (SE, _("Cannot change directory to %s: %s"), path, strerror (err)); goto error; } free (path); lex_get (lexer); return CMD_SUCCESS; error: free(path); return CMD_FAILURE; } pspp-1.4.1/src/language/utilities/permissions.c0000644000175000017500000000576213670210420021224 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2004, 2010, 2011 Free Software Foundation, Inc. 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 3 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, see . */ #include #include #include #include #include #include #include "data/settings.h" #include "language/command.h" #include "language/lexer/lexer.h" #include "libpspp/cast.h" #include "libpspp/i18n.h" #include "libpspp/message.h" #include "libpspp/misc.h" #include "libpspp/str.h" #include "gettext.h" #define _(msgid) gettext (msgid) enum PER {PER_RO, PER_RW}; int change_permissions(const char *file_name, enum PER per); /* Parses the PERMISSIONS command. */ int cmd_permissions (struct lexer *lexer, struct dataset *ds UNUSED) { char *fn = NULL; const char *str = NULL; lex_match (lexer, T_SLASH); if (lex_match_id (lexer, "FILE")) lex_match (lexer, T_EQUALS); str = lex_tokcstr (lexer); if (str) fn = strdup (str); if (!lex_force_match (lexer, T_STRING) || str == NULL) goto error; lex_match (lexer, T_SLASH); if (! lex_match_id (lexer, "PERMISSIONS")) goto error; lex_match (lexer, T_EQUALS); if (lex_match_id (lexer, "READONLY")) { if (! change_permissions (fn, PER_RO)) goto error; } else if (lex_match_id (lexer, "WRITEABLE")) { if (! change_permissions (fn, PER_RW)) goto error; } else { lex_error_expecting (lexer, "WRITEABLE", "READONLY"); goto error; } free (fn); return CMD_SUCCESS; error: free(fn); return CMD_FAILURE; } int change_permissions (const char *file_name, enum PER per) { char *locale_file_name; struct stat buf; mode_t mode; if (settings_get_safer_mode ()) { msg (SE, _("This command not allowed when the %s option is set."), "SAFER"); return 0; } locale_file_name = utf8_to_filename (file_name); if (-1 == stat(locale_file_name, &buf)) { const int errnum = errno; msg (SE, _("Cannot stat %s: %s"), file_name, strerror(errnum)); free (locale_file_name); return 0; } if (per == PER_RW) mode = buf.st_mode | 0200; else mode = buf.st_mode & ~0222; if (-1 == chmod(locale_file_name, mode)) { const int errnum = errno; msg (SE, _("Cannot change mode of %s: %s"), file_name, strerror(errnum)); free (locale_file_name); return 0; } free (locale_file_name); return 1; } pspp-1.4.1/src/language/utilities/host.c0000644000175000017500000002026713723574721017643 0ustar00blpblp00000000000000/* pspp - a program for statistical analysis. Copyright (C) 1997-9, 2000, 2009, 2010, 2011 Free Software Foundation, Inc. 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 3 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, see . */ #include #include #include #include #include #include #include #include #include #if HAVE_SYS_WAIT_H #include #endif #include "data/settings.h" #include "language/command.h" #include "language/lexer/lexer.h" #include "libpspp/assertion.h" #include "libpspp/compiler.h" #include "libpspp/i18n.h" #include "libpspp/message.h" #include "libpspp/str.h" #include "libpspp/string-array.h" #include "libpspp/temp-file.h" #include "output/text-item.h" #include "gl/intprops.h" #include "gl/localcharset.h" #include "gl/read-file.h" #include "gl/timespec.h" #include "gl/xalloc.h" #include "gl/xmalloca.h" #include "gettext.h" #define _(msgid) gettext (msgid) #define N_(msgid) msgid #if !HAVE_FORK static bool run_commands (const struct string_array *commands, double time_limit) { if (time_limit != DBL_MAX) { msg (SE, _("Time limit not supported on this platform.")); return false; } for (size_t i = 0; i < commands->n; i++) { /* XXX No way to capture command output */ char *s = recode_string (locale_charset (), "UTF-8", commands->strings[i], -1); int retval = system (s); free (s); if (retval) { msg (SE, _("%s: Command exited with status %d."), commands->strings[i], retval); return false; } } return true; } #else static bool run_command (const char *command, struct timespec timeout) { /* Same exit codes used by 'sh'. */ enum { EXIT_CANNOT_INVOKE = 126, EXIT_ENOENT = 127, }; /* Create a temporary file to capture command output. */ FILE *output_file = create_temp_file (); if (!output_file) { msg (SE, _("Failed to create temporary file (%s)."), strerror (errno)); return false; } int dev_null_fd = open ("/dev/null", O_RDONLY); if (dev_null_fd < 0) { msg (SE, _("/dev/null: Failed to open (%s)."), strerror (errno)); fclose (output_file); return false; } char *locale_command = recode_string (locale_charset (), "UTF-8", command, -1); pid_t pid = fork (); if (pid < 0) { close (dev_null_fd); fclose (output_file); free (locale_command); msg (SE, _("Couldn't fork: %s."), strerror (errno)); return false; } else if (!pid) { /* Running in the child. */ /* Set up timeout. */ if (timeout.tv_sec < TYPE_MAXIMUM (time_t)) { signal (SIGALRM, SIG_DFL); struct timespec left = timespec_sub (timeout, current_timespec ()); if (timespec_sign (left) <= 0) raise (SIGALRM); struct itimerval it = { .it_value = { .tv_sec = left.tv_sec, .tv_usec = left.tv_nsec / 1000 } }; setitimer (ITIMER_REAL, &it, NULL); } /* Set up file descriptors: - /dev/null for stdin - Temporary file to capture stdout and stderr. - Close everything else. */ dup2 (dev_null_fd, 0); dup2 (fileno (output_file), 1); dup2 (fileno (output_file), 2); close (dev_null_fd); for (int fd = 3; fd < 256; fd++) close (fd); /* Choose the shell. */ const char *shell = getenv ("SHELL"); if (shell == NULL) shell = "/bin/sh"; /* Run subprocess. */ execl (shell, shell, "-c", locale_command, NULL); /* Failed to start the shell. */ _exit (errno == ENOENT ? EXIT_ENOENT : EXIT_CANNOT_INVOKE); } /* Running in the parent. */ close (dev_null_fd); free (locale_command); /* Wait for child to exit. */ int status = 0; int error = 0; for (;;) { pid_t retval = waitpid (pid, &status, 0); if (retval == pid) break; else if (retval < 0) { if (errno != EINTR) { error = errno; break; } } else NOT_REACHED (); } bool ok = true; if (error) { msg (SW, _("While running \"%s\", waiting for child process " "failed (%s)."), command, strerror (errno)); ok = false; } if (WIFSIGNALED (status)) { int signum = WTERMSIG (status); if (signum == SIGALRM) msg (SW, _("Command \"%s\" timed out."), command); else msg (SW, _("Command \"%s\" terminated by signal %d."), command, signum); ok = false; } else if (WIFEXITED (status) && WEXITSTATUS (status)) { int exit_code = WEXITSTATUS (status); const char *detail = (exit_code == EXIT_ENOENT ? _("Command or shell not found") : exit_code == EXIT_CANNOT_INVOKE ? _("Could not invoke command or shell") : NULL); if (detail) msg (SW, _("Command \"%s\" exited with status %d (%s)."), command, exit_code, detail); else msg (SW, _("Command \"%s\" exited with status %d."), command, exit_code); ok = false; } rewind (output_file); size_t length; char *locale_output = fread_file (output_file, 0, &length); if (!locale_output) { msg (SW, _("Command \"%s\" output could not be read (%s)."), command, strerror (errno)); ok = false; } else if (length > 0) { char *output = recode_string ("UTF-8", locale_charset (), locale_output, -1); /* Drop final new-line, if any. */ char *end = strchr (output, '\0'); if (end > output && end[-1] == '\n') end[-1] = '\0'; text_item_submit (text_item_create_nocopy (TEXT_ITEM_LOG, output)); } free (locale_output); return ok; } static bool run_commands (const struct string_array *commands, double time_limit) { struct timespec timeout = timespec_add (dtotimespec (time_limit), current_timespec ()); for (size_t i = 0; i < commands->n; i++) { if (!run_command (commands->strings[i], timeout)) return false; } return true; } #endif int cmd_host (struct lexer *lexer, struct dataset *ds UNUSED) { if (settings_get_safer_mode ()) { msg (SE, _("This command not allowed when the %s option is set."), "SAFER"); return CMD_FAILURE; } if (!lex_force_match_id (lexer, "COMMAND") || !lex_force_match (lexer, T_EQUALS) || !lex_force_match (lexer, T_LBRACK) || !lex_force_string (lexer)) return CMD_FAILURE; struct string_array commands = STRING_ARRAY_INITIALIZER; while (lex_token (lexer) == T_STRING) { string_array_append (&commands, lex_tokcstr (lexer)); lex_get (lexer); } if (!lex_force_match (lexer, T_RBRACK)) { string_array_destroy (&commands); return CMD_FAILURE; } double time_limit = DBL_MAX; if (lex_match_id (lexer, "TIMELIMIT")) { if (!lex_force_match (lexer, T_EQUALS) || !lex_force_num (lexer)) { string_array_destroy (&commands); return CMD_FAILURE; } double num = lex_number (lexer); lex_get (lexer); time_limit = num < 0.0 ? 0.0 : num; } enum cmd_result result = lex_end_of_command (lexer); if (result == CMD_SUCCESS && !run_commands (&commands, time_limit)) result = CMD_FAILURE; string_array_destroy (&commands); return result; } pspp-1.4.1/src/language/utilities/cache.c0000644000175000017500000000204013320146056017703 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2010 Free Software Foundation, Inc. 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 3 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, see . */ #include #include #include #include "language/command.h" #include "language/lexer/lexer.h" #include "gettext.h" #define _(msgid) gettext (msgid) /* Parses the CACHE command. */ int cmd_cache (struct lexer *lexer UNUSED, struct dataset *ds UNUSED) { return CMD_SUCCESS; } pspp-1.4.1/src/language/utilities/title.c0000644000175000017500000000526013412455327017776 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 1997-9, 2000, 2007, 2010, 2011 Free Software Foundation, Inc. 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 3 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, see . */ #include #include #include #include "data/dataset.h" #include "data/dictionary.h" #include "data/variable.h" #include "language/command.h" #include "language/lexer/lexer.h" #include "libpspp/message.h" #include "libpspp/start-date.h" #include "libpspp/version.h" #include "output/driver.h" #include "gl/xalloc.h" #include "gettext.h" #define _(msgid) gettext (msgid) static int parse_title (struct lexer *lexer, void (*set_title) (const char *)) { if (!lex_force_string (lexer)) return CMD_FAILURE; set_title (lex_tokcstr (lexer)); lex_get (lexer); return CMD_SUCCESS; } int cmd_title (struct lexer *lexer, struct dataset *ds UNUSED) { return parse_title (lexer, output_set_title); } int cmd_subtitle (struct lexer *lexer, struct dataset *ds UNUSED) { return parse_title (lexer, output_set_subtitle); } /* Performs the FILE LABEL command. */ int cmd_file_label (struct lexer *lexer, struct dataset *ds) { if (!lex_force_string (lexer)) return CMD_FAILURE; dict_set_label (dataset_dict (ds), lex_tokcstr (lexer)); lex_get (lexer); return CMD_SUCCESS; } /* Performs the DOCUMENT command. */ int cmd_document (struct lexer *lexer, struct dataset *ds) { struct dictionary *dict = dataset_dict (ds); char *trailer; if (!lex_force_string (lexer)) return CMD_FAILURE; while (lex_is_string (lexer)) { dict_add_document_line (dict, lex_tokcstr (lexer), true); lex_get (lexer); } trailer = xasprintf (_(" (Entered %s)"), get_start_date ()); dict_add_document_line (dict, trailer, true); free (trailer); return CMD_SUCCESS; } /* Performs the ADD DOCUMENTS command. */ int cmd_add_documents (struct lexer *lexer, struct dataset *ds) { return cmd_document (lexer, ds); } /* Performs the DROP DOCUMENTS command. */ int cmd_drop_documents (struct lexer *lexer UNUSED, struct dataset *ds) { dict_clear_documents (dataset_dict (ds)); return CMD_SUCCESS; } pspp-1.4.1/src/language/utilities/echo.c0000644000175000017500000000232413412603174017564 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2005, 2009, 2010 Free Software Foundation, Inc. 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 3 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, see . */ #include #include "language/command.h" #include "language/lexer/lexer.h" #include "libpspp/message.h" #include "libpspp/str.h" #include "output/text-item.h" #include "gl/xalloc.h" /* Echos a string to the output stream */ int cmd_echo (struct lexer *lexer, struct dataset *ds UNUSED) { if (!lex_force_string (lexer)) return CMD_FAILURE; text_item_submit (text_item_create (TEXT_ITEM_LOG, lex_tokcstr (lexer))); lex_get (lexer); return CMD_SUCCESS; } pspp-1.4.1/src/language/utilities/date.c0000644000175000017500000000221313320146056017557 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2004, 2010, 2011 Free Software Foundation, Inc. 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 3 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, see . */ #include #include "language/command.h" #include "language/lexer/lexer.h" #include "libpspp/message.h" #include "gettext.h" #define _(msgid) gettext (msgid) /* Stub for USE command. */ int cmd_use (struct lexer *lexer, struct dataset *ds UNUSED) { if (lex_match (lexer, T_ALL)) return CMD_SUCCESS; msg (SW, _("Only %s is currently implemented."), "USE ALL"); return CMD_FAILURE; } pspp-1.4.1/src/language/utilities/output.c0000644000175000017500000000703013416510306020203 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2014 Free Software Foundation, Inc. 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 3 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, see . */ #include #include #include #include "data/dataset.h" #include "data/settings.h" #include "data/format.h" #include "language/command.h" #include "language/lexer/lexer.h" #include "language/lexer/format-parser.h" #include "libpspp/message.h" #include "libpspp/string-set.h" #include "libpspp/version.h" #include "output/pivot-table.h" #include "gl/xalloc.h" #include "gettext.h" #define _(msgid) gettext (msgid) int cmd_output (struct lexer *lexer, struct dataset *ds UNUSED) { struct string_set rc_names = STRING_SET_INITIALIZER (rc_names); if (!lex_force_match_id (lexer, "MODIFY")) { lex_error (lexer, NULL); goto error; } while (lex_token (lexer) != T_ENDCMD) { lex_match (lexer, T_SLASH); if (lex_match_id (lexer, "SELECT")) { if (!lex_match_id (lexer, "TABLES")) { lex_error (lexer, NULL); goto error; } } else if (lex_match_id (lexer, "TABLECELLS")) { string_set_clear (&rc_names); struct fmt_spec fmt = { 0, 0, 0 }; while (lex_token (lexer) != T_SLASH && lex_token (lexer) != T_ENDCMD) { if (lex_match_id (lexer, "SELECT")) { if (! lex_force_match (lexer, T_EQUALS)) goto error; if (! lex_force_match (lexer, T_LBRACK)) goto error; while (lex_token (lexer) == T_ID) { string_set_insert (&rc_names, lex_tokcstr (lexer)); lex_get (lexer); } if (! lex_force_match (lexer, T_RBRACK)) goto error; } else if (lex_match_id (lexer, "FORMAT")) { char type[FMT_TYPE_LEN_MAX + 1]; int width = -1; int decimals = -1; if (! lex_force_match (lexer, T_EQUALS)) goto error; if (! parse_abstract_format_specifier (lexer, type, &width, &decimals)) { lex_error (lexer, NULL); goto error; } if (width <= 0) { const struct fmt_spec *dflt = settings_get_format (); width = dflt->w; } if (!fmt_from_name (type, &fmt.type)) { lex_error (lexer, _("Unknown format type `%s'."), type); goto error; } fmt.w = width; fmt.d = decimals; } else { lex_error (lexer, NULL); goto error; } } if (fmt.w) { const struct string_set_node *node; const char *s; STRING_SET_FOR_EACH (s, node, &rc_names) if (!pivot_result_class_change (s, &fmt)) lex_error (lexer, _("Unknown cell class %s."), s); } } else { lex_error (lexer, NULL); goto error; } } string_set_destroy (&rc_names); return CMD_SUCCESS; error: string_set_destroy (&rc_names); return CMD_SUCCESS; } pspp-1.4.1/src/language/utilities/set.q0000644000175000017500000006446313546443556017511 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 1997-9, 2000, 2006, 2009, 2010, 2011, 2012, 2013, 2014, 2015 Free Software Foundation, Inc. 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 3 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, see . */ #include #include #include #include #include #include #include #include "gl/vasnprintf.h" #include "data/casereader.h" #include "data/data-in.h" #include "data/data-out.h" #include "data/dataset.h" #include "data/dictionary.h" #include "data/format.h" #include "data/settings.h" #include "data/value.h" #include "data/variable.h" #include "language/command.h" #include "language/lexer/format-parser.h" #include "language/lexer/lexer.h" #include "libpspp/compiler.h" #include "libpspp/copyleft.h" #include "libpspp/temp-file.h" #include "libpspp/version.h" #include "libpspp/float-format.h" #include "libpspp/i18n.h" #include "libpspp/integer-format.h" #include "libpspp/message.h" #include "math/random.h" #include "output/driver.h" #include "output/journal.h" #if HAVE_LIBTERMCAP #if HAVE_TERMCAP_H #include #else /* !HAVE_TERMCAP_H */ int tgetent (char *, const char *); int tgetnum (const char *); #endif /* !HAVE_TERMCAP_H */ #endif /* !HAVE_LIBTERMCAP */ #include "xalloc.h" #include "gettext.h" #define _(msgid) gettext (msgid) /* (specification) "SET" (stc_): blanks=custom; block=string; boxstring=string; case=size:upper/uplow; cca=string; ccb=string; ccc=string; ccd=string; cce=string; compression=compress:on/off; cpi=integer; decimal=dec:dot/comma; epoch=custom; errors=custom; format=custom; fuzzbits=integer; headers=headers:no/yes/blank; highres=hires:on/off; histogram=string; include=inc:on/off; journal=custom; log=custom; length=custom; locale=custom; lowres=lores:auto/on/off; lpi=integer; menus=menus:standard/extended; messages=custom; mexpand=mexp:on/off; miterate=integer; mnest=integer; mprint=mprint:on/off; mxerrs=integer; mxloops=integer; mxmemory=integer; mxwarns=integer; printback=custom; results=custom; rib=rib:msbfirst/lsbfirst/vax/native; rrb=rrb:native/isl/isb/idl/idb/vf/vd/vg/zs/zl; safer=safe:on; scompression=scompress:on/off; scripttab=string; seed=custom; tnumbers=custom; tvars=custom; tb1=string; tbfonts=string; undefined=undef:warn/nowarn; wib=wib:msbfirst/lsbfirst/vax/native; wrb=wrb:native/isl/isb/idl/idb/vf/vd/vg/zs/zl; width=custom; workspace=integer; xsort=xsort:yes/no. */ /* (headers) */ /* (declarations) */ /* (functions) */ static enum integer_format stc_to_integer_format (int stc); static enum float_format stc_to_float_format (int stc); int cmd_set (struct lexer *lexer, struct dataset *ds) { struct cmd_set cmd; if (!parse_set (lexer, ds, &cmd, NULL)) { return CMD_FAILURE; } if (cmd.sbc_cca) settings_set_cc ( cmd.s_cca, FMT_CCA); if (cmd.sbc_ccb) settings_set_cc ( cmd.s_ccb, FMT_CCB); if (cmd.sbc_ccc) settings_set_cc ( cmd.s_ccc, FMT_CCC); if (cmd.sbc_ccd) settings_set_cc ( cmd.s_ccd, FMT_CCD); if (cmd.sbc_cce) settings_set_cc ( cmd.s_cce, FMT_CCE); if (cmd.sbc_decimal) settings_set_decimal_char (cmd.dec == STC_DOT ? '.' : ','); if (cmd.sbc_fuzzbits) { int fuzzbits = cmd.n_fuzzbits[0]; if (fuzzbits >= 0 && fuzzbits <= 20) settings_set_fuzzbits (fuzzbits); else msg (SE, _("%s must be between 0 and 20."), "FUZZBITS"); } if (cmd.sbc_include) settings_set_include (cmd.inc == STC_ON); if (cmd.sbc_mxerrs) { if (cmd.n_mxerrs[0] >= 1) settings_set_max_messages (MSG_S_ERROR, cmd.n_mxerrs[0]); else msg (SE, _("%s must be at least 1."), "MXERRS"); } if (cmd.sbc_mxloops) { if (cmd.n_mxloops[0] >= 1) settings_set_mxloops (cmd.n_mxloops[0]); else msg (SE, _("%s must be at least 1."), "MXLOOPS"); } if (cmd.sbc_mxwarns) { if (cmd.n_mxwarns[0] >= 0) settings_set_max_messages (MSG_S_WARNING, cmd.n_mxwarns[0]); else msg (SE, _("%s must not be negative."), "MXWARNS"); } if (cmd.sbc_rib) settings_set_input_integer_format (stc_to_integer_format (cmd.rib)); if (cmd.sbc_rrb) settings_set_input_float_format (stc_to_float_format (cmd.rrb)); if (cmd.sbc_safer) settings_set_safer_mode (); if (cmd.sbc_scompression) settings_set_scompression (cmd.scompress == STC_ON); if (cmd.sbc_undefined) settings_set_undefined (cmd.undef == STC_WARN); if (cmd.sbc_wib) settings_set_output_integer_format (stc_to_integer_format (cmd.wib)); if (cmd.sbc_wrb) settings_set_output_float_format (stc_to_float_format (cmd.wrb)); if (cmd.sbc_workspace) { if ( cmd.n_workspace[0] < 1024 && ! settings_get_testing_mode ()) msg (SE, _("%s must be at least 1MB"), "WORKSPACE"); else if (cmd.n_workspace[0] <= 0) msg (SE, _("%s must be positive"), "WORKSPACE"); else settings_set_workspace (cmd.n_workspace[0] * 1024L); } if (cmd.sbc_block) msg (SW, _("%s is obsolete."), "BLOCK"); if (cmd.sbc_boxstring) msg (SW, _("%s is obsolete."), "BOXSTRING"); if (cmd.sbc_cpi) msg (SW, _("%s is obsolete."), "CPI"); if (cmd.sbc_histogram) msg (SW, _("%s is obsolete."), "HISTOGRAM"); if (cmd.sbc_lpi) msg (SW, _("%s is obsolete."), "LPI"); if (cmd.sbc_menus) msg (SW, _("%s is obsolete."), "MENUS"); 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"); if (cmd.sbc_tbfonts) msg (SW, _("%s is obsolete."), "TBFONTS"); if (cmd.sbc_tb1 && cmd.s_tb1) msg (SW, _("%s is obsolete."), "TB1"); if (cmd.sbc_case) msg (SW, _("%s is not yet implemented."), "CASE"); if (cmd.sbc_compression) msg (SW, _("Active file compression is not implemented.")); free_set (&cmd); return CMD_SUCCESS; } /* Returns the integer_format value corresponding to STC, which should be the value of cmd.rib or cmd.wib. */ static enum integer_format stc_to_integer_format (int stc) { return (stc == STC_MSBFIRST ? INTEGER_MSB_FIRST : stc == STC_LSBFIRST ? INTEGER_LSB_FIRST : stc == STC_VAX ? INTEGER_VAX : INTEGER_NATIVE); } /* Returns the float_format value corresponding to STC, which should be the value of cmd.rrb or cmd.wrb. */ static enum float_format stc_to_float_format (int stc) { switch (stc) { case STC_NATIVE: return FLOAT_NATIVE_DOUBLE; case STC_ISL: return FLOAT_IEEE_SINGLE_LE; case STC_ISB: return FLOAT_IEEE_SINGLE_BE; case STC_IDL: return FLOAT_IEEE_DOUBLE_LE; case STC_IDB: return FLOAT_IEEE_DOUBLE_BE; case STC_VF: return FLOAT_VAX_F; case STC_VD: return FLOAT_VAX_D; case STC_VG: return FLOAT_VAX_G; case STC_ZS: return FLOAT_Z_SHORT; case STC_ZL: return FLOAT_Z_LONG; } NOT_REACHED (); } static int set_output_routing (struct lexer *lexer, enum settings_output_type type) { enum settings_output_devices devices; lex_match (lexer, T_EQUALS); if (lex_match_id (lexer, "ON") || lex_match_id (lexer, "BOTH")) devices = SETTINGS_DEVICE_LISTING | SETTINGS_DEVICE_TERMINAL; else if (lex_match_id (lexer, "TERMINAL")) devices = SETTINGS_DEVICE_TERMINAL; else if (lex_match_id (lexer, "LISTING")) devices = SETTINGS_DEVICE_LISTING; else if (lex_match_id (lexer, "OFF") || lex_match_id (lexer, "NONE")) devices = 0; else { lex_error (lexer, NULL); return 0; } settings_set_output_routing (type, devices); return 1; } /* Parses the BLANKS subcommand, which controls the value that completely blank fields in numeric data imply. X, Wnd: Syntax is SYSMIS or a numeric value. */ static int stc_custom_blanks (struct lexer *lexer, struct dataset *ds UNUSED, struct cmd_set *cmd UNUSED, void *aux UNUSED) { lex_match (lexer, T_EQUALS); if (lex_match_id (lexer, "SYSMIS")) { lex_get (lexer); settings_set_blanks (SYSMIS); } else { if (!lex_force_num (lexer)) return 0; settings_set_blanks (lex_number (lexer)); lex_get (lexer); } return 1; } static int stc_custom_tnumbers (struct lexer *lexer, struct dataset *ds UNUSED, struct cmd_set *cmd UNUSED, void *aux UNUSED) { lex_match (lexer, T_EQUALS); if (lex_match_id (lexer, "VALUES")) settings_set_show_values (SETTINGS_VALUE_SHOW_VALUE); else if (lex_match_id (lexer, "LABELS")) settings_set_show_values (SETTINGS_VALUE_SHOW_LABEL); else if (lex_match_id (lexer, "BOTH")) settings_set_show_values (SETTINGS_VALUE_SHOW_BOTH); else { lex_error_expecting (lexer, "VALUES", "LABELS", "BOTH"); return 0; } return 1; } static int stc_custom_tvars (struct lexer *lexer, struct dataset *ds UNUSED, struct cmd_set *cmd UNUSED, void *aux UNUSED) { lex_match (lexer, T_EQUALS); if (lex_match_id (lexer, "NAMES")) settings_set_show_variables (SETTINGS_VALUE_SHOW_VALUE); else if (lex_match_id (lexer, "LABELS")) settings_set_show_variables (SETTINGS_VALUE_SHOW_LABEL); else if (lex_match_id (lexer, "BOTH")) settings_set_show_variables (SETTINGS_VALUE_SHOW_BOTH); else { lex_error_expecting (lexer, "NAMES", "LABELS", "BOTH"); return 0; } return 1; } /* Parses the EPOCH subcommand, which controls the epoch used for parsing 2-digit years. */ static int stc_custom_epoch (struct lexer *lexer, struct dataset *ds UNUSED, struct cmd_set *cmd UNUSED, void *aux UNUSED) { lex_match (lexer, T_EQUALS); if (lex_match_id (lexer, "AUTOMATIC")) settings_set_epoch (-1); else if (lex_is_integer (lexer)) { int new_epoch = lex_integer (lexer); lex_get (lexer); if (new_epoch < 1500) { msg (SE, _("%s must be 1500 or later."), "EPOCH"); return 0; } settings_set_epoch (new_epoch); } else { lex_error (lexer, _("expecting %s or year"), "AUTOMATIC"); return 0; } return 1; } static int stc_custom_errors (struct lexer *lexer, struct dataset *ds UNUSED, struct cmd_set *cmd UNUSED, void *aux UNUSED) { return set_output_routing (lexer, SETTINGS_OUTPUT_ERROR); } static int stc_custom_length (struct lexer *lexer, struct dataset *ds UNUSED, struct cmd_set *cmd UNUSED, void *aux UNUSED) { int page_length; lex_match (lexer, T_EQUALS); if (lex_match_id (lexer, "NONE")) page_length = -1; else { if (!lex_force_int (lexer)) return 0; if (lex_integer (lexer) < 1) { msg (SE, _("%s must be at least %d."), "LENGTH", 1); return 0; } page_length = lex_integer (lexer); lex_get (lexer); } if (page_length != -1) settings_set_viewlength (page_length); return 1; } static int stc_custom_locale (struct lexer *lexer, struct dataset *ds UNUSED, struct cmd_set *cmd UNUSED, void *aux UNUSED) { const char *s; lex_match (lexer, T_EQUALS); if ( !lex_force_string (lexer)) return 0; s = lex_tokcstr (lexer); /* First try this string as an encoding name */ if ( valid_encoding (s)) set_default_encoding (s); /* Now try as a locale name (or alias) */ else if (set_encoding_from_locale (s)) { } else { msg (ME, _("%s is not a recognized encoding or locale name"), s); return 0; } lex_get (lexer); return 1; } static int stc_custom_messages (struct lexer *lexer, struct dataset *ds UNUSED, struct cmd_set *cmd UNUSED, void *aux UNUSED) { return set_output_routing (lexer, SETTINGS_OUTPUT_NOTE); } static int stc_custom_printback (struct lexer *lexer, struct dataset *ds UNUSED, struct cmd_set *cmd UNUSED, void *aux UNUSED) { return set_output_routing (lexer, SETTINGS_OUTPUT_SYNTAX); } static int stc_custom_results (struct lexer *lexer, struct dataset *ds UNUSED, struct cmd_set *cmd UNUSED, void *aux UNUSED) { return set_output_routing (lexer, SETTINGS_OUTPUT_RESULT); } static int stc_custom_seed (struct lexer *lexer, struct dataset *ds UNUSED, struct cmd_set *cmd UNUSED, void *aux UNUSED) { lex_match (lexer, T_EQUALS); if (lex_match_id (lexer, "RANDOM")) set_rng (time (0)); else { if (!lex_force_num (lexer)) return 0; set_rng (lex_number (lexer)); lex_get (lexer); } return 1; } static int stc_custom_width (struct lexer *lexer, struct dataset *ds UNUSED, struct cmd_set *cmd UNUSED, void *aux UNUSED) { lex_match (lexer, T_EQUALS); if (lex_match_id (lexer, "NARROW")) settings_set_viewwidth (79); else if (lex_match_id (lexer, "WIDE")) settings_set_viewwidth (131); else { if (!lex_force_int (lexer)) return 0; if (lex_integer (lexer) < 40) { msg (SE, _("%s must be at least %d."), "WIDTH", 40); return 0; } settings_set_viewwidth (lex_integer (lexer)); lex_get (lexer); } return 1; } /* Parses FORMAT subcommand, which consists of a numeric format specifier. */ static int stc_custom_format (struct lexer *lexer, struct dataset *ds UNUSED, struct cmd_set *cmd UNUSED, void *aux UNUSED) { struct fmt_spec fmt; lex_match (lexer, T_EQUALS); if (!parse_format_specifier (lexer, &fmt)) return 0; if (!fmt_check_output (&fmt)) return 0; if (fmt_is_string (fmt.type)) { char str[FMT_STRING_LEN_MAX + 1]; msg (SE, _("%s requires numeric output format as an argument. " "Specified format %s is of type string."), "FORMAT", fmt_to_string (&fmt, str)); return 0; } settings_set_format (&fmt); return 1; } static int stc_custom_journal (struct lexer *lexer, struct dataset *ds UNUSED, struct cmd_set *cmd UNUSED, void *aux UNUSED) { lex_match (lexer, T_EQUALS); if (lex_match_id (lexer, "ON") || lex_match_id (lexer, "YES")) journal_enable (); else if (lex_match_id (lexer, "OFF") || lex_match_id (lexer, "NO")) journal_disable (); else if (lex_is_string (lexer) || lex_token (lexer) == T_ID) { char *filename = utf8_to_filename (lex_tokcstr (lexer)); journal_set_file_name (filename); free (filename); lex_get (lexer); } else { lex_error (lexer, NULL); return 0; } return 1; } static int stc_custom_log (struct lexer *lexer, struct dataset *ds UNUSED, struct cmd_set *cmd UNUSED, void *aux UNUSED) { return stc_custom_journal (lexer, ds, cmd, aux); } static char * show_output_routing (enum settings_output_type type) { enum settings_output_devices devices; const char *s; devices = settings_get_output_routing (type); if (devices & SETTINGS_DEVICE_LISTING) s = devices & SETTINGS_DEVICE_TERMINAL ? "BOTH" : "LISTING"; else if (devices & SETTINGS_DEVICE_TERMINAL) s = "TERMINAL"; else s = "NONE"; return xstrdup (s); } static char * show_blanks (const struct dataset *ds UNUSED) { return (settings_get_blanks () == SYSMIS ? xstrdup ("SYSMIS") : xasprintf ("%.*g", DBL_DIG + 1, settings_get_blanks ())); } static void format_cc (struct string *out, const char *in, char grouping) { while (*in != '\0') { char c = *in++; if (c == grouping || c == '\'') ds_put_byte (out, '\''); else if (c == '"') ds_put_byte (out, '"'); ds_put_byte (out, c); } } static char * show_cc (enum fmt_type type) { const struct fmt_number_style *cc = settings_get_style (type); struct string out; ds_init_empty (&out); format_cc (&out, cc->neg_prefix.s, cc->grouping); ds_put_byte (&out, cc->grouping); format_cc (&out, cc->prefix.s, cc->grouping); ds_put_byte (&out, cc->grouping); format_cc (&out, cc->suffix.s, cc->grouping); ds_put_byte (&out, cc->grouping); format_cc (&out, cc->neg_suffix.s, cc->grouping); return ds_cstr (&out); } static char * show_cca (const struct dataset *ds UNUSED) { return show_cc (FMT_CCA); } static char * show_ccb (const struct dataset *ds UNUSED) { return show_cc (FMT_CCB); } static char * show_ccc (const struct dataset *ds UNUSED) { return show_cc (FMT_CCC); } static char * show_ccd (const struct dataset *ds UNUSED) { return show_cc (FMT_CCD); } static char * show_cce (const struct dataset *ds UNUSED) { return show_cc (FMT_CCE); } static char * show_decimals (const struct dataset *ds UNUSED) { return xasprintf ("`%c'", settings_get_decimal_char (FMT_F)); } static char * show_errors (const struct dataset *ds UNUSED) { return show_output_routing (SETTINGS_OUTPUT_ERROR); } static char * show_format (const struct dataset *ds UNUSED) { char str[FMT_STRING_LEN_MAX + 1]; return xstrdup (fmt_to_string (settings_get_format (), str)); } static char * show_fuzzbits (const struct dataset *ds UNUSED) { return xasprintf ("%d", settings_get_fuzzbits ()); } static char * show_journal (const struct dataset *ds UNUSED) { return (journal_is_enabled () ? xasprintf ("\"%s\"", journal_get_file_name ()) : xstrdup ("disabled")); } static char * show_length (const struct dataset *ds UNUSED) { return xasprintf ("%d", settings_get_viewlength ()); } static char * show_locale (const struct dataset *ds UNUSED) { return xstrdup (get_default_encoding ()); } static char * show_messages (const struct dataset *ds UNUSED) { return show_output_routing (SETTINGS_OUTPUT_NOTE); } static char * show_printback (const struct dataset *ds UNUSED) { return show_output_routing (SETTINGS_OUTPUT_SYNTAX); } static char * show_results (const struct dataset *ds UNUSED) { return show_output_routing (SETTINGS_OUTPUT_RESULT); } static char * show_mxerrs (const struct dataset *ds UNUSED) { return xasprintf ("%d", settings_get_max_messages (MSG_S_ERROR)); } static char * show_mxloops (const struct dataset *ds UNUSED) { return xasprintf ("%d", settings_get_mxloops ()); } static char * show_mxwarns (const struct dataset *ds UNUSED) { return xasprintf ("%d", settings_get_max_messages (MSG_S_WARNING)); } /* Returns a name for the given INTEGER_FORMAT value. */ static char * show_integer_format (enum integer_format integer_format) { return xasprintf ("%s (%s)", (integer_format == INTEGER_MSB_FIRST ? "MSBFIRST" : integer_format == INTEGER_LSB_FIRST ? "LSBFIRST" : "VAX"), integer_format == INTEGER_NATIVE ? "NATIVE" : "nonnative"); } /* Returns a name for the given FLOAT_FORMAT value. */ static char * show_float_format (enum float_format float_format) { const char *format_name = ""; switch (float_format) { case FLOAT_IEEE_SINGLE_LE: format_name = _("ISL (32-bit IEEE 754 single, little-endian)"); break; case FLOAT_IEEE_SINGLE_BE: format_name = _("ISB (32-bit IEEE 754 single, big-endian)"); break; case FLOAT_IEEE_DOUBLE_LE: format_name = _("IDL (64-bit IEEE 754 double, little-endian)"); break; case FLOAT_IEEE_DOUBLE_BE: format_name = _("IDB (64-bit IEEE 754 double, big-endian)"); break; case FLOAT_VAX_F: format_name = _("VF (32-bit VAX F, VAX-endian)"); break; case FLOAT_VAX_D: format_name = _("VD (64-bit VAX D, VAX-endian)"); break; case FLOAT_VAX_G: format_name = _("VG (64-bit VAX G, VAX-endian)"); break; case FLOAT_Z_SHORT: format_name = _("ZS (32-bit IBM Z hexadecimal short, big-endian)"); break; case FLOAT_Z_LONG: format_name = _("ZL (64-bit IBM Z hexadecimal long, big-endian)"); break; case FLOAT_FP: case FLOAT_HEX: NOT_REACHED (); } return xasprintf ("%s (%s)", format_name, (float_format == FLOAT_NATIVE_DOUBLE ? "NATIVE" : "nonnative")); } static char * show_rib (const struct dataset *ds UNUSED) { return show_integer_format (settings_get_input_integer_format ()); } static char * show_rrb (const struct dataset *ds UNUSED) { return show_float_format (settings_get_input_float_format ()); } static char * show_scompression (const struct dataset *ds UNUSED) { return xstrdup (settings_get_scompression () ? "ON" : "OFF"); } static char * show_undefined (const struct dataset *ds UNUSED) { return xstrdup (settings_get_undefined () ? "WARN" : "NOWARN"); } static char * show_weight (const struct dataset *ds) { const struct variable *var = dict_get_weight (dataset_dict (ds)); return xstrdup (var != NULL ? var_get_name (var) : "OFF"); } static char * show_wib (const struct dataset *ds UNUSED) { return show_integer_format (settings_get_output_integer_format ()); } static char * show_wrb (const struct dataset *ds UNUSED) { return show_float_format (settings_get_output_float_format ()); } static char * show_width (const struct dataset *ds UNUSED) { return xasprintf ("%d", settings_get_viewwidth ()); } static char * show_workspace (const struct dataset *ds UNUSED) { size_t ws = settings_get_workspace () / 1024L; return xasprintf ("%zu", ws); } static char * show_current_directory (const struct dataset *ds UNUSED) { char *buf = NULL; char *wd = NULL; size_t len = 256; do { len <<= 1; buf = xrealloc (buf, len); } while (NULL == (wd = getcwd (buf, len))); return wd; } static char * show_tempdir (const struct dataset *ds UNUSED) { return strdup (temp_dir_name ()); } static char * show_version (const struct dataset *ds UNUSED) { return strdup (announced_version); } static char * show_system (const struct dataset *ds UNUSED) { return strdup (host_system); } static char * show_n (const struct dataset *ds) { casenumber n; size_t l; const struct casereader *reader = dataset_source (ds); if (reader == NULL) return strdup (_("Unknown")); n = casereader_count_cases (reader); return asnprintf (NULL, &l, "%ld", n); } struct show_sbc { const char *name; char *(*function) (const struct dataset *); }; const struct show_sbc show_table[] = { {"BLANKS", show_blanks}, {"CCA", show_cca}, {"CCB", show_ccb}, {"CCC", show_ccc}, {"CCD", show_ccd}, {"CCE", show_cce}, {"DECIMALS", show_decimals}, {"DIRECTORY", show_current_directory}, {"ENVIRONMENT", show_system}, {"ERRORS", show_errors}, {"FORMAT", show_format}, {"FUZZBITS", show_fuzzbits}, {"JOURNAL", show_journal}, {"LENGTH", show_length}, {"LOCALE", show_locale}, {"MESSAGES", show_messages}, {"MXERRS", show_mxerrs}, {"MXLOOPS", show_mxloops}, {"MXWARNS", show_mxwarns}, {"N", show_n}, {"PRINTBACk", show_printback}, {"RESULTS", show_results}, {"RIB", show_rib}, {"RRB", show_rrb}, {"SCOMPRESSION", show_scompression}, {"TEMPDIR", show_tempdir}, {"UNDEFINED", show_undefined}, {"VERSION", show_version}, {"WEIGHT", show_weight}, {"WIB", show_wib}, {"WRB", show_wrb}, {"WIDTH", show_width}, {"WORKSPACE", show_workspace}, }; static void do_show (const struct dataset *ds, const struct show_sbc *sbc) { char *value = sbc->function (ds); msg (SN, _("%s is %s."), sbc->name, value); free (value); } static void show_all (const struct dataset *ds) { size_t i; for (i = 0; i < sizeof show_table / sizeof *show_table; i++) do_show (ds, &show_table[i]); } static void show_all_cc (const struct dataset *ds) { int i; for (i = 0; i < sizeof show_table / sizeof *show_table; i++) { const struct show_sbc *sbc = &show_table[i]; if (!strncmp (sbc->name, "CC", 2)) do_show (ds, sbc); } } static void show_warranty (const struct dataset *ds UNUSED) { fputs (lack_of_warranty, stdout); } static void show_copying (const struct dataset *ds UNUSED) { fputs (copyleft, stdout); } int cmd_show (struct lexer *lexer, struct dataset *ds) { if (lex_token (lexer) == T_ENDCMD) { show_all (ds); return CMD_SUCCESS; } do { if (lex_match (lexer, T_ALL)) show_all (ds); else if (lex_match_id (lexer, "CC")) show_all_cc (ds); else if (lex_match_id (lexer, "WARRANTY")) show_warranty (ds); else if (lex_match_id (lexer, "COPYING") || lex_match_id (lexer, "LICENSE")) show_copying (ds); else if (lex_token (lexer) == T_ID) { int i; for (i = 0; i < sizeof show_table / sizeof *show_table; i++) { const struct show_sbc *sbc = &show_table[i]; if (lex_match_id (lexer, sbc->name)) { do_show (ds, sbc); goto found; } } lex_error (lexer, NULL); return CMD_FAILURE; found: ; } else { lex_error (lexer, NULL); return CMD_FAILURE; } lex_match (lexer, T_SLASH); } while (lex_token (lexer) != T_ENDCMD); return CMD_SUCCESS; } #define MAX_SAVED_SETTINGS 5 static struct settings *saved_settings[MAX_SAVED_SETTINGS]; static int n_saved_settings; int cmd_preserve (struct lexer *lexer UNUSED, struct dataset *ds UNUSED) { if (n_saved_settings < MAX_SAVED_SETTINGS) { saved_settings[n_saved_settings++] = settings_get (); return CMD_SUCCESS; } else { msg (SE, _("Too many %s commands without a %s: at most " "%d levels of saved settings are allowed."), "PRESERVE", "RESTORE", MAX_SAVED_SETTINGS); return CMD_CASCADING_FAILURE; } } int cmd_restore (struct lexer *lexer UNUSED, struct dataset *ds UNUSED) { if (n_saved_settings > 0) { struct settings *s = saved_settings[--n_saved_settings]; settings_set (s); settings_destroy (s); return CMD_SUCCESS; } else { msg (SE, _("%s without matching %s."), "RESTORE", "PRESERVE"); return CMD_FAILURE; } } /* Local Variables: mode: c End: */ pspp-1.4.1/src/language/utilities/include.c0000644000175000017500000001144513717773141020307 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 1997-9, 2000, 2007, 2010, 2011, 2020 Free Software Foundation, Inc. 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 3 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, see . */ #include #include #include #include #include #include #include "data/dataset.h" #include "data/session.h" #include "language/command.h" #include "language/lexer/include-path.h" #include "language/lexer/lexer.h" #include "libpspp/i18n.h" #include "libpspp/message.h" #include "libpspp/str.h" #include "gl/dirname.h" #include "gl/xalloc.h" #include "gettext.h" #define _(msgid) gettext (msgid) enum variant { INSERT, INCLUDE }; static int do_insert (struct lexer *lexer, struct dataset *ds, enum variant variant) { enum lex_syntax_mode syntax_mode; enum lex_error_mode error_mode; char *relative_name; char *filename; char *encoding; int status; bool cd; /* Skip optional FILE=. */ if (lex_match_id (lexer, "FILE")) lex_match (lexer, T_EQUALS); if (!lex_force_string_or_id (lexer)) return CMD_FAILURE; relative_name = utf8_to_filename (lex_tokcstr (lexer)); if (NULL == relative_name) return CMD_FAILURE; filename = include_path_search (relative_name); free (relative_name); if (! filename) { msg (SE, _("Can't find `%s' in include file search path."), lex_tokcstr (lexer)); return CMD_FAILURE; } lex_get (lexer); syntax_mode = LEX_SYNTAX_INTERACTIVE; error_mode = LEX_ERROR_CONTINUE; cd = false; status = CMD_FAILURE; encoding = xstrdup (session_get_default_syntax_encoding ( dataset_session (ds))); while (T_ENDCMD != lex_token (lexer)) { if (lex_match_id (lexer, "ENCODING")) { lex_match (lexer, T_EQUALS); if (!lex_force_string (lexer)) goto exit; free (encoding); encoding = xstrdup (lex_tokcstr (lexer)); lex_get (lexer); } else if (variant == INSERT && lex_match_id (lexer, "SYNTAX")) { lex_match (lexer, T_EQUALS); if (lex_match_id (lexer, "INTERACTIVE")) syntax_mode = LEX_SYNTAX_INTERACTIVE; else if (lex_match_id (lexer, "BATCH")) syntax_mode = LEX_SYNTAX_BATCH; else if (lex_match_id (lexer, "AUTO")) syntax_mode = LEX_SYNTAX_AUTO; else { lex_error_expecting (lexer, "BATCH", "INTERACTIVE", "AUTO"); goto exit; } } else if (variant == INSERT && lex_match_id (lexer, "CD")) { lex_match (lexer, T_EQUALS); if (lex_match_id (lexer, "YES")) { cd = true; } else if (lex_match_id (lexer, "NO")) { cd = false; } else { lex_error_expecting (lexer, "YES", "NO"); goto exit; } } else if (variant == INSERT && lex_match_id (lexer, "ERROR")) { lex_match (lexer, T_EQUALS); if (lex_match_id (lexer, "CONTINUE")) { error_mode = LEX_ERROR_CONTINUE; } else if (lex_match_id (lexer, "STOP")) { error_mode = LEX_ERROR_STOP; } else { lex_error_expecting (lexer, "CONTINUE", "STOP"); goto exit; } } else { lex_error (lexer, NULL); goto exit; } } status = lex_end_of_command (lexer); if (status == CMD_SUCCESS) { struct lex_reader *reader; reader = lex_reader_for_file (filename, encoding, syntax_mode, error_mode); if (reader != NULL) { lex_discard_rest_of_command (lexer); lex_include (lexer, reader); if (cd) { char *directory = dir_name (filename); int ret = chdir (directory); if (0 != ret) { int err = errno; msg (SE, _("Cannot change directory to %s: %s"), directory, strerror (err)); status = CMD_FAILURE; } free (directory); } } } exit: free (encoding); free (filename); return status; } int cmd_include (struct lexer *lexer, struct dataset *ds) { return do_insert (lexer, ds, INCLUDE); } int cmd_insert (struct lexer *lexer, struct dataset *ds) { return do_insert (lexer, ds, INSERT); } pspp-1.4.1/src/language/stats/0000755000175000017500000000000013725012647015632 5ustar00blpblp00000000000000pspp-1.4.1/src/language/stats/autorecode.c0000644000175000017500000004436113670210420020124 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 1997-9, 2000, 2009, 2010, 2012, 2013, 2014 Free Software Foundation, Inc. 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 3 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, see . */ #include #include #include #include "data/case.h" #include "data/casereader.h" #include "data/dataset.h" #include "data/dictionary.h" #include "data/transformations.h" #include "data/variable.h" #include "language/command.h" #include "language/lexer/lexer.h" #include "language/lexer/variable-parser.h" #include "libpspp/array.h" #include "libpspp/compiler.h" #include "libpspp/hash-functions.h" #include "libpspp/hmap.h" #include "libpspp/i18n.h" #include "libpspp/message.h" #include "libpspp/pool.h" #include "libpspp/str.h" #include "output/pivot-table.h" #include "gl/xalloc.h" #include "gl/c-xvasprintf.h" #include "gl/mbiter.h" #include "gl/size_max.h" #include "gettext.h" #define _(msgid) gettext (msgid) #define N_(msgid) (msgid) /* Explains how to recode one value. */ struct arc_item { struct hmap_node hmap_node; /* Element in "struct arc_spec" hash table. */ union value from; /* Original value. */ int width; /* Width of the original value */ bool missing; /* Is 'from' missing in its source varible? */ char *value_label; /* Value label in source variable, if any. */ double to; /* Recoded value. */ }; /* Explains how to recode an AUTORECODE variable. */ struct arc_spec { int width; /* Variable width. */ int src_idx; /* Case index of source variable. */ char *src_name; /* Name of source variable. */ struct fmt_spec format; /* Print format in source variable. */ struct variable *dst; /* Target variable. */ struct missing_values mv; /* Missing values of source variable. */ char *label; /* Variable label of source variable. */ struct rec_items *items; }; /* Descending or ascending sort order. */ enum arc_direction { ASCENDING, DESCENDING }; struct rec_items { struct hmap ht; /* Hash table of "struct arc_item"s. */ }; /* AUTORECODE data. */ struct autorecode_pgm { struct arc_spec *specs; size_t n_specs; bool blank_valid; }; static trns_proc_func autorecode_trns_proc; static trns_free_func autorecode_trns_free; static int compare_arc_items (const void *, const void *, const void *aux); static void arc_free (struct autorecode_pgm *); static struct arc_item *find_arc_item ( const struct rec_items *, const union value *, int width, size_t hash); /* Returns WIDTH with any trailing spaces in VALUE trimmed off (except that a minimum width of 1 is always returned because otherwise the width would indicate a numeric type). */ static int value_trim_spaces (const union value *value, int width) { while (width > 1 && value->s[width - 1] == ' ') width--; return width; } /* Performs the AUTORECODE procedure. */ int cmd_autorecode (struct lexer *lexer, struct dataset *ds) { struct dictionary *dict = dataset_dict (ds); const struct variable **src_vars = NULL; size_t n_srcs = 0; char **dst_names = NULL; size_t n_dsts = 0; enum arc_direction direction = ASCENDING; bool print = false; /* Create procedure. */ struct autorecode_pgm *arc = xzalloc (sizeof *arc); arc->blank_valid = true; /* Parse variable lists. */ lex_match_id (lexer, "VARIABLES"); lex_match (lexer, T_EQUALS); if (!parse_variables_const (lexer, dict, &src_vars, &n_srcs, PV_NO_DUPLICATE | PV_NO_SCRATCH)) goto error; lex_match (lexer, T_SLASH); if (!lex_force_match_id (lexer, "INTO")) goto error; lex_match (lexer, T_EQUALS); if (!parse_DATA_LIST_vars (lexer, dict, &dst_names, &n_dsts, PV_NO_DUPLICATE)) goto error; if (n_dsts != n_srcs) { msg (SE, _("Source variable count (%zu) does not match " "target variable count (%zu)."), n_srcs, n_dsts); goto error; } for (size_t i = 0; i < n_dsts; i++) { const char *name = dst_names[i]; if (dict_lookup_var (dict, name) != NULL) { msg (SE, _("Target variable %s duplicates existing variable %s."), name, name); goto error; } } /* Parse options. */ bool group = false; while (lex_match (lexer, T_SLASH)) { if (lex_match_id (lexer, "DESCENDING")) direction = DESCENDING; else if (lex_match_id (lexer, "PRINT")) print = true; else if (lex_match_id (lexer, "GROUP")) group = true; else if (lex_match_id (lexer, "BLANK")) { lex_match (lexer, T_EQUALS); if (lex_match_id (lexer, "VALID")) { arc->blank_valid = true; } else if (lex_match_id (lexer, "MISSING")) { arc->blank_valid = false; } else { lex_error_expecting (lexer, "VALID", "MISSING"); goto error; } } else { lex_error_expecting (lexer, "DESCENDING", "PRINT", "GROUP", "BLANK"); goto error; } } if (lex_token (lexer) != T_ENDCMD) { lex_error (lexer, _("expecting end of command")); goto error; } /* If GROUP is specified, verify that the variables are all string or all numeric. */ if (group) { enum val_type type = var_get_type (src_vars[0]); for (size_t i = 1; i < n_dsts; i++) { if (var_get_type (src_vars[i]) != type) { size_t string_idx = type == VAL_STRING ? 0 : i; size_t numeric_idx = type == VAL_STRING ? i : 0; lex_error (lexer, _("With GROUP, variables may not mix string " "variables (such as %s) and numeric " "variables (such as %s)."), var_get_name (src_vars[string_idx]), var_get_name (src_vars[numeric_idx])); goto error; } } } /* Allocate all the specs and the rec_items that they point to. If GROUP is specified, there is only a single global rec_items, with the maximum width 'width', and all of the specs point to it; otherwise each spec has its own rec_items. */ arc->specs = xmalloc (n_dsts * sizeof *arc->specs); arc->n_specs = n_dsts; for (size_t i = 0; i < n_dsts; i++) { struct arc_spec *spec = &arc->specs[i]; spec->width = var_get_width (src_vars[i]); spec->src_idx = var_get_case_index (src_vars[i]); spec->src_name = xstrdup (var_get_name (src_vars[i])); spec->format = *var_get_print_format (src_vars[i]); const char *label = var_get_label (src_vars[i]); spec->label = label ? xstrdup (label) : NULL; if (group && i > 0) spec->items = arc->specs[0].items; else { spec->items = xzalloc (sizeof (*spec->items)); hmap_init (&spec->items->ht); } } /* Initialize specs[*]->mv to the user-missing values for each source variable. */ if (group) { /* Use the first source variable that has any user-missing values. */ size_t mv_idx = 0; for (size_t i = 0; i < n_dsts; i++) if (var_has_missing_values (src_vars[i])) { mv_idx = i; break; } for (size_t i = 0; i < n_dsts; i++) mv_copy (&arc->specs[i].mv, var_get_missing_values (src_vars[mv_idx])); } else { /* Each variable uses its own user-missing values. */ for (size_t i = 0; i < n_dsts; i++) mv_copy (&arc->specs[i].mv, var_get_missing_values (src_vars[i])); } /* Execute procedure. */ struct casereader *input = proc_open (ds); struct ccase *c; for (; (c = casereader_read (input)) != NULL; case_unref (c)) for (size_t i = 0; i < arc->n_specs; i++) { struct arc_spec *spec = &arc->specs[i]; const union value *value = case_data_idx (c, spec->src_idx); if (spec->width == 0 && value->f == SYSMIS) { /* AUTORECODE never changes the system-missing value. (Leaving it out of the translation table has this effect automatically because values not found in the translation table get translated to system-missing.) */ continue; } int width = value_trim_spaces (value, spec->width); if (width == 1 && value->s[0] == ' ' && !arc->blank_valid) continue; size_t hash = value_hash (value, width, 0); if (find_arc_item (spec->items, value, width, hash)) continue; struct string value_label = DS_EMPTY_INITIALIZER; var_append_value_name__ (src_vars[i], value, SETTINGS_VALUE_SHOW_LABEL, &value_label); struct arc_item *item = xmalloc (sizeof *item); item->width = width; value_clone (&item->from, value, width); item->missing = mv_is_value_missing_varwidth (&spec->mv, value, spec->width, MV_ANY); item->value_label = ds_steal_cstr (&value_label); hmap_insert (&spec->items->ht, &item->hmap_node, hash); ds_destroy (&value_label); } bool ok = casereader_destroy (input); ok = proc_commit (ds) && ok; /* Re-fetch dictionary because it might have changed (if TEMPORARY was in use). */ dict = dataset_dict (ds); /* Create transformation. */ for (size_t i = 0; i < arc->n_specs; i++) { struct arc_spec *spec = &arc->specs[i]; /* Create destination variable. */ spec->dst = dict_create_var_assert (dict, dst_names[i], 0); var_set_label (spec->dst, spec->label); /* Set print format. */ size_t n_items = hmap_count (&spec->items->ht); char *longest_value = xasprintf ("%zu", n_items); struct fmt_spec format = { .type = FMT_F, .w = strlen (longest_value) }; var_set_both_formats (spec->dst, &format); free (longest_value); /* Create array of pointers to items. */ struct arc_item **items = xmalloc (n_items * sizeof *items); struct arc_item *item; size_t j = 0; HMAP_FOR_EACH (item, struct arc_item, hmap_node, &spec->items->ht) items[j++] = item; assert (j == n_items); /* Sort array by value. */ sort (items, n_items, sizeof *items, compare_arc_items, &direction); /* Assign recoded values in sorted order. */ for (j = 0; j < n_items; j++) items[j]->to = j + 1; if (print && (!group || i == 0)) { struct pivot_value *title = (group ? pivot_value_new_text (N_("Recoding grouped variables.")) : spec->label && spec->label[0] ? pivot_value_new_text_format (N_("Recoding %s into %s (%s)."), spec->src_name, var_get_name (spec->dst), spec->label) : pivot_value_new_text_format (N_("Recoding %s into %s."), spec->src_name, var_get_name (spec->dst))); struct pivot_table *table = pivot_table_create__ (title, "Recoding"); pivot_dimension_create ( table, PIVOT_AXIS_COLUMN, N_("Attributes"), N_("New Value"), N_("Value Label")); struct pivot_dimension *old_values = pivot_dimension_create ( table, PIVOT_AXIS_ROW, N_("Old Value")); old_values->root->show_label = true; for (size_t k = 0; k < n_items; k++) { const struct arc_item *item = items[k]; int old_value_idx = pivot_category_create_leaf ( old_values->root, pivot_value_new_value ( &item->from, item->width, (item->width ? &(struct fmt_spec) { FMT_F, item->width, 0 } : &spec->format), dict_get_encoding (dict))); pivot_table_put2 (table, 0, old_value_idx, pivot_value_new_integer (item->to)); const char *value_label = item->value_label; if (value_label && value_label[0]) pivot_table_put2 (table, 1, old_value_idx, pivot_value_new_user_text (value_label, -1)); } pivot_table_submit (table); } /* Assign user-missing values. User-missing values in the source variable(s) must be marked as user-missing values in the destination variable. There might be an arbitrary number of missing values, since the source variable might have a range. Our sort function always puts missing values together at the top of the range, so that means that we can use a missing value range to cover all of the user-missing values in any case (but we avoid it unless necessary because user-missing value ranges are an obscure feature). */ size_t n_missing = n_items; for (size_t k = 0; k < n_items; k++) if (!items[n_items - k - 1]->missing) { n_missing = k; break; } if (n_missing > 0) { size_t lo = n_items - (n_missing - 1); size_t hi = n_items; struct missing_values mv; mv_init (&mv, 0); if (n_missing > 3) mv_add_range (&mv, lo, hi); else if (n_missing > 0) for (size_t k = 0; k < n_missing; k++) mv_add_num (&mv, lo + k); var_set_missing_values (spec->dst, &mv); mv_destroy (&mv); } /* Add value labels to the destination variable. */ for (j = 0; j < n_items; j++) { const char *value_label = items[j]->value_label; if (value_label && value_label[0]) { union value to_val = { .f = items[j]->to }; var_add_value_label (spec->dst, &to_val, value_label); } } /* Free array. */ free (items); } add_transformation (ds, autorecode_trns_proc, autorecode_trns_free, arc); for (size_t i = 0; i < n_dsts; i++) free (dst_names[i]); free (dst_names); free (src_vars); return ok ? CMD_SUCCESS : CMD_CASCADING_FAILURE; error: for (size_t i = 0; i < n_dsts; i++) free (dst_names[i]); free (dst_names); free (src_vars); arc_free (arc); return CMD_CASCADING_FAILURE; } static void arc_free (struct autorecode_pgm *arc) { if (arc != NULL) { for (size_t i = 0; i < arc->n_specs; i++) { struct arc_spec *spec = &arc->specs[i]; struct arc_item *item, *next; HMAP_FOR_EACH_SAFE (item, next, struct arc_item, hmap_node, &spec->items->ht) { value_destroy (&item->from, item->width); free (item->value_label); hmap_delete (&spec->items->ht, &item->hmap_node); free (item); } free (spec->label); free (spec->src_name); mv_destroy (&spec->mv); } size_t n_rec_items = (arc->n_specs >= 2 && arc->specs[0].items == arc->specs[1].items ? 1 : arc->n_specs); for (size_t i = 0; i < n_rec_items; i++) { struct arc_spec *spec = &arc->specs[i]; hmap_destroy (&spec->items->ht); free (spec->items); } free (arc->specs); free (arc); } } static struct arc_item * find_arc_item (const struct rec_items *items, const union value *value, int width, size_t hash) { struct arc_item *item; HMAP_FOR_EACH_WITH_HASH (item, struct arc_item, hmap_node, hash, &items->ht) if (item->width == width && value_equal (value, &item->from, width)) return item; return NULL; } static int compare_arc_items (const void *a_, const void *b_, const void *direction_) { const struct arc_item *const *ap = a_; const struct arc_item *const *bp = b_; const struct arc_item *a = *ap; const struct arc_item *b = *bp; /* User-missing values always sort to the highest target values (regardless of sort direction). */ if (a->missing != b->missing) return a->missing < b->missing ? -1 : 1; /* Otherwise, compare the data. */ int aw = a->width; int bw = b->width; int cmp; if (aw == bw) cmp = value_compare_3way (&a->from, &b->from, aw); else { assert (aw && bw); cmp = buf_compare_rpad (CHAR_CAST_BUG (const char *, a->from.s), aw, CHAR_CAST_BUG (const char *, b->from.s), bw); } /* Then apply sort direction. */ const enum arc_direction *directionp = direction_; enum arc_direction direction = *directionp; return direction == ASCENDING ? cmp : -cmp; } static int autorecode_trns_proc (void *arc_, struct ccase **c, casenumber case_idx UNUSED) { struct autorecode_pgm *arc = arc_; *c = case_unshare (*c); for (size_t i = 0; i < arc->n_specs; i++) { const struct arc_spec *spec = &arc->specs[i]; const union value *value = case_data_idx (*c, spec->src_idx); int width = value_trim_spaces (value, spec->width); size_t hash = value_hash (value, width, 0); const struct arc_item *item = find_arc_item (spec->items, value, width, hash); case_data_rw (*c, spec->dst)->f = item ? item->to : SYSMIS; } return TRNS_CONTINUE; } static bool autorecode_trns_free (void *arc_) { struct autorecode_pgm *arc = arc_; arc_free (arc); return true; } pspp-1.4.1/src/language/stats/graph.c0000644000175000017500000005721413670210420017074 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2012, 2013, 2015, 2019 Free Software Foundation, Inc. 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 3 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, see . */ /* * This module implements the graph command */ #include #include #include "gl/xalloc.h" #include #include "libpspp/assertion.h" #include "libpspp/message.h" #include "libpspp/pool.h" #include "data/dataset.h" #include "data/dictionary.h" #include "data/casegrouper.h" #include "data/casereader.h" #include "data/casewriter.h" #include "data/caseproto.h" #include "data/subcase.h" #include "data/format.h" #include "math/chart-geometry.h" #include "math/histogram.h" #include "math/moments.h" #include "math/sort.h" #include "math/order-stats.h" #include "output/charts/plot-hist.h" #include "output/charts/scatterplot.h" #include "output/charts/barchart.h" #include "language/command.h" #include "language/lexer/lexer.h" #include "language/lexer/value-parser.h" #include "language/lexer/variable-parser.h" #include "language/stats/freq.h" #include "language/stats/chart-category.h" #include "gettext.h" #define _(msgid) gettext (msgid) #define N_(msgid) msgid enum chart_type { CT_NONE, CT_BAR, CT_LINE, CT_PIE, CT_ERRORBAR, CT_HILO, CT_HISTOGRAM, CT_SCATTERPLOT, CT_PARETO }; enum scatter_type { ST_BIVARIATE, ST_OVERLAY, ST_MATRIX, ST_XYZ }; enum bar_type { CBT_SIMPLE, CBT_GROUPED, CBT_STACKED, CBT_RANGE }; /* Variable index for histogram case */ enum { HG_IDX_X, HG_IDX_WT }; struct exploratory_stats { double missing; double non_missing; struct moments *mom; double minimum; double maximum; /* Total weight */ double cc; /* The minimum weight */ double cmin; }; struct graph { struct pool *pool; size_t n_dep_vars; const struct variable **dep_vars; struct exploratory_stats *es; enum mv_class dep_excl; enum mv_class fctr_excl; const struct dictionary *dict; bool missing_pw; /* ------------ Graph ---------------- */ bool normal; /* For histograms, draw the normal curve */ enum chart_type chart_type; enum scatter_type scatter_type; enum bar_type bar_type; const struct variable *by_var[2]; size_t n_by_vars; struct subcase ordering; /* Ordering for aggregation */ int agr; /* Index into ag_func */ /* A caseproto that contains the plot data */ struct caseproto *gr_proto; }; static double calc_mom1 (double acc, double x, double w) { return acc + x * w; } static double calc_mom0 (double acc, double x UNUSED, double w) { return acc + w; } static double pre_low_extreme (void) { return -DBL_MAX; } static double calc_max (double acc, double x, double w UNUSED) { return (acc > x) ? acc : x; } static double pre_high_extreme (void) { return DBL_MAX; } static double calc_min (double acc, double x, double w UNUSED) { return (acc < x) ? acc : x; } static double post_normalise (double acc, double cc) { return acc / cc; } static double post_percentage (double acc, double ccc) { return acc / ccc * 100.0; } const struct ag_func ag_func[] = { {"COUNT", N_("Count"), 0, 0, NULL, calc_mom0, 0, 0}, {"PCT", N_("Percentage"), 0, 0, NULL, calc_mom0, 0, post_percentage}, {"CUFREQ", N_("Cumulative Count"), 0, 1, NULL, calc_mom0, 0, 0}, {"CUPCT", N_("Cumulative Percent"), 0, 1, NULL, calc_mom0, 0, post_percentage}, {"MEAN", N_("Mean"), 1, 0, NULL, calc_mom1, post_normalise, 0}, {"SUM", N_("Sum"), 1, 0, NULL, calc_mom1, 0, 0}, {"MAXIMUM", N_("Maximum"), 1, 0, pre_low_extreme, calc_max, 0, 0}, {"MINIMUM", N_("Minimum"), 1, 0, pre_high_extreme, calc_min, 0, 0}, }; const int N_AG_FUNCS = sizeof (ag_func) / sizeof (ag_func[0]); static bool parse_function (struct lexer *lexer, struct graph *graph) { int i; for (i = 0 ; i < N_AG_FUNCS; ++i) { if (lex_match_id (lexer, ag_func[i].name)) { graph->agr = i; break; } } if (i == N_AG_FUNCS) { goto error; } graph->n_dep_vars = ag_func[i].arity; if (ag_func[i].arity > 0) { int v; if (!lex_force_match (lexer, T_LPAREN)) goto error; graph->dep_vars = xzalloc (sizeof (graph->dep_vars) * graph->n_dep_vars); for (v = 0; v < ag_func[i].arity; ++v) { graph->dep_vars[v] = parse_variable (lexer, graph->dict); if (! graph->dep_vars[v]) goto error; } if (!lex_force_match (lexer, T_RPAREN)) goto error; } if (!lex_force_match (lexer, T_BY)) goto error; graph->by_var[0] = parse_variable (lexer, graph->dict); if (!graph->by_var[0]) { goto error; } subcase_add_var (&graph->ordering, graph->by_var[0], SC_ASCEND); graph->n_by_vars++; if (lex_match (lexer, T_BY)) { graph->by_var[1] = parse_variable (lexer, graph->dict); if (!graph->by_var[1]) { goto error; } subcase_add_var (&graph->ordering, graph->by_var[1], SC_ASCEND); graph->n_by_vars++; } return true; error: lex_error (lexer, NULL); return false; } static void show_scatterplot (const struct graph *cmd, struct casereader *input) { struct string title; struct scatterplot_chart *scatterplot; bool byvar_overflow = false; ds_init_empty (&title); if (cmd->n_by_vars > 0) { ds_put_format (&title, _("%s vs. %s by %s"), var_to_string (cmd->dep_vars[1]), var_to_string (cmd->dep_vars[0]), var_to_string (cmd->by_var[0])); } else { ds_put_format (&title, _("%s vs. %s"), var_to_string (cmd->dep_vars[1]), var_to_string (cmd->dep_vars[0])); } scatterplot = scatterplot_create (input, var_to_string(cmd->dep_vars[0]), var_to_string(cmd->dep_vars[1]), (cmd->n_by_vars > 0) ? cmd->by_var[0] : NULL, &byvar_overflow, ds_cstr (&title), cmd->es[0].minimum, cmd->es[0].maximum, cmd->es[1].minimum, cmd->es[1].maximum); scatterplot_chart_submit (scatterplot); ds_destroy (&title); if (byvar_overflow) { msg (MW, _("Maximum number of scatterplot categories reached. " "Your BY variable has too many distinct values. " "The coloring of the plot will not be correct.")); } } static void show_histogr (const struct graph *cmd, struct casereader *input) { struct histogram *histogram; struct ccase *c; if (cmd->es[0].cc <= 0) { casereader_destroy (input); return; } { /* Sturges Rule */ double bin_width = fabs (cmd->es[0].minimum - cmd->es[0].maximum) / (1 + log2 (cmd->es[0].cc)) ; histogram = histogram_create (bin_width, cmd->es[0].minimum, cmd->es[0].maximum); } if (NULL == histogram) { casereader_destroy (input); return; } for (;(c = casereader_read (input)) != NULL; case_unref (c)) { const double x = case_data_idx (c, HG_IDX_X)->f; const double weight = case_data_idx (c, HG_IDX_WT)->f; moments_pass_two (cmd->es[0].mom, x, weight); histogram_add (histogram, x, weight); } casereader_destroy (input); { double n, mean, var; struct string label; ds_init_cstr (&label, var_to_string (cmd->dep_vars[0])); moments_calculate (cmd->es[0].mom, &n, &mean, &var, NULL, NULL); chart_item_submit (histogram_chart_create (histogram->gsl_hist, ds_cstr (&label), n, mean, sqrt (var), cmd->normal)); statistic_destroy (&histogram->parent); ds_destroy (&label); } } static void cleanup_exploratory_stats (struct graph *cmd) { int v; for (v = 0; v < cmd->n_dep_vars; ++v) { moments_destroy (cmd->es[v].mom); } } static void run_barchart (struct graph *cmd, struct casereader *input) { struct casegrouper *grouper; struct casereader *group; double ccc = 0.0; if (cmd->missing_pw == false) input = casereader_create_filter_missing (input, cmd->dep_vars, cmd->n_dep_vars, cmd->dep_excl, NULL, NULL); input = sort_execute (input, &cmd->ordering); struct freq **cells = NULL; int n_cells = 0; struct hmap columns = HMAP_INITIALIZER (columns); assert (cmd->n_by_vars <= 2); for (grouper = casegrouper_create_vars (input, cmd->by_var, cmd->n_by_vars); casegrouper_get_next_group (grouper, &group); casereader_destroy (group)) { int v; struct ccase *c = casereader_peek (group, 0); /* Deal with missing values in the categorical variables */ for (v = 0; v < cmd->n_by_vars; ++v) { if (var_is_value_missing (cmd->by_var[v], case_data (c, cmd->by_var[v]), cmd->fctr_excl)) break; } if (v < cmd->n_by_vars) { case_unref (c); continue; } cells = xrealloc (cells, sizeof (*cells) * ++n_cells); cells[n_cells - 1] = xzalloc (sizeof (**cells) + sizeof (union value) * (cmd->n_by_vars - 1)); if (ag_func[cmd->agr].cumulative && n_cells >= 2) cells[n_cells - 1]->count = cells[n_cells - 2]->count; else cells[n_cells - 1]->count = 0; if (ag_func[cmd->agr].pre) cells[n_cells - 1]->count = ag_func[cmd->agr].pre(); if (cmd->n_by_vars > 1) { const union value *vv = case_data (c, cmd->by_var[1]); const double weight = dict_get_case_weight (cmd->dict, c, NULL); int v1_width = var_get_width (cmd->by_var[1]); size_t hash = value_hash (vv, v1_width, 0); struct freq *fcol = NULL; HMAP_FOR_EACH_WITH_HASH (fcol, struct freq, node, hash, &columns) if (value_equal (vv, &fcol->values[0], v1_width)) break; if (fcol) fcol->count += weight; else { fcol = xzalloc (sizeof *fcol); fcol->count = weight; value_clone (&fcol->values[0], vv, v1_width); hmap_insert (&columns, &fcol->node, hash); } } for (v = 0; v < cmd->n_by_vars; ++v) { value_clone (&cells[n_cells - 1]->values[v], case_data (c, cmd->by_var[v]), var_get_width (cmd->by_var[v])); } case_unref (c); double cc = 0; for (;(c = casereader_read (group)) != NULL; case_unref (c)) { const double weight = dict_get_case_weight (cmd->dict,c,NULL); const double x = (cmd->n_dep_vars > 0) ? case_data (c, cmd->dep_vars[0])->f : SYSMIS; cc += weight; cells[n_cells - 1]->count = ag_func[cmd->agr].calc (cells[n_cells - 1]->count, x, weight); } if (ag_func[cmd->agr].post) cells[n_cells - 1]->count = ag_func[cmd->agr].post (cells[n_cells - 1]->count, cc); ccc += cc; } casegrouper_destroy (grouper); for (int i = 0; i < n_cells; ++i) { if (ag_func[cmd->agr].ppost) { struct freq *cell = cells[i]; if (cmd->n_by_vars > 1) { const union value *vv = &cell->values[1]; int v1_width = var_get_width (cmd->by_var[1]); size_t hash = value_hash (vv, v1_width, 0); struct freq *fcol = NULL; HMAP_FOR_EACH_WITH_HASH (fcol, struct freq, node, hash, &columns) if (value_equal (vv, &fcol->values[0], v1_width)) break; cell->count = ag_func[cmd->agr].ppost (cell->count, fcol->count); } else cell->count = ag_func[cmd->agr].ppost (cell->count, ccc); } } if (cmd->n_by_vars > 1) { struct freq *col_cell; struct freq *next; HMAP_FOR_EACH_SAFE (col_cell, next, struct freq, node, &columns) { value_destroy (col_cell->values, var_get_width (cmd->by_var[1])); free (col_cell); } } hmap_destroy (&columns); { struct string label; ds_init_empty (&label); if (cmd->n_dep_vars > 0) ds_put_format (&label, _("%s of %s"), ag_func[cmd->agr].description, var_get_name (cmd->dep_vars[0])); else ds_put_cstr (&label, ag_func[cmd->agr].description); chart_item_submit (barchart_create (cmd->by_var, cmd->n_by_vars, ds_cstr (&label), false, cells, n_cells)); ds_destroy (&label); } for (int i = 0; i < n_cells; ++i) free (cells[i]); free (cells); } static void run_graph (struct graph *cmd, struct casereader *input) { struct ccase *c; struct casereader *reader; struct casewriter *writer; cmd->es = pool_calloc (cmd->pool,cmd->n_dep_vars, sizeof *cmd->es); for(int v=0;vn_dep_vars;v++) { cmd->es[v].mom = moments_create (MOMENT_KURTOSIS); cmd->es[v].cmin = DBL_MAX; cmd->es[v].maximum = -DBL_MAX; cmd->es[v].minimum = DBL_MAX; } /* Always remove cases listwise. This is correct for */ /* the histogram because there is only one variable */ /* and a simple bivariate scatterplot */ /* if (cmd->missing_pw == false) */ input = casereader_create_filter_missing (input, cmd->dep_vars, cmd->n_dep_vars, cmd->dep_excl, NULL, NULL); writer = autopaging_writer_create (cmd->gr_proto); /* The case data is copied to a new writer */ /* The setup of the case depends on the Charttype */ /* For Scatterplot x is assumed in dep_vars[0] */ /* y is assumed in dep_vars[1] */ /* For Histogram x is assumed in dep_vars[0] */ assert(SP_IDX_X == 0 && SP_IDX_Y == 1 && HG_IDX_X == 0); for (;(c = casereader_read (input)) != NULL; case_unref (c)) { struct ccase *outcase = case_create (cmd->gr_proto); const double weight = dict_get_case_weight (cmd->dict,c,NULL); if (cmd->chart_type == CT_HISTOGRAM) case_data_rw_idx (outcase, HG_IDX_WT)->f = weight; if (cmd->chart_type == CT_SCATTERPLOT && cmd->n_by_vars > 0) value_copy (case_data_rw_idx (outcase, SP_IDX_BY), case_data (c, cmd->by_var[0]), var_get_width (cmd->by_var[0])); for(int v=0;vn_dep_vars;v++) { const struct variable *var = cmd->dep_vars[v]; const double x = case_data (c, var)->f; if (var_is_value_missing (var, case_data (c, var), cmd->dep_excl)) { cmd->es[v].missing += weight; continue; } /* Magically v value fits to SP_IDX_X, SP_IDX_Y, HG_IDX_X */ case_data_rw_idx (outcase, v)->f = x; if (x > cmd->es[v].maximum) cmd->es[v].maximum = x; if (x < cmd->es[v].minimum) cmd->es[v].minimum = x; cmd->es[v].non_missing += weight; moments_pass_one (cmd->es[v].mom, x, weight); cmd->es[v].cc += weight; if (cmd->es[v].cmin > weight) cmd->es[v].cmin = weight; } casewriter_write (writer,outcase); } reader = casewriter_make_reader (writer); switch (cmd->chart_type) { case CT_HISTOGRAM: show_histogr (cmd,reader); break; case CT_SCATTERPLOT: show_scatterplot (cmd,reader); break; default: NOT_REACHED (); break; }; casereader_destroy (input); cleanup_exploratory_stats (cmd); } int cmd_graph (struct lexer *lexer, struct dataset *ds) { struct graph graph; graph.missing_pw = false; graph.pool = pool_create (); graph.dep_excl = MV_ANY; graph.fctr_excl = MV_ANY; graph.dict = dataset_dict (ds); graph.dep_vars = NULL; graph.chart_type = CT_NONE; graph.scatter_type = ST_BIVARIATE; graph.n_by_vars = 0; graph.gr_proto = caseproto_create (); subcase_init_empty (&graph.ordering); while (lex_token (lexer) != T_ENDCMD) { lex_match (lexer, T_SLASH); if (lex_match_id (lexer, "HISTOGRAM")) { if (graph.chart_type != CT_NONE) { lex_error (lexer, _("Only one chart type is allowed.")); goto error; } graph.normal = false; if (lex_match (lexer, T_LPAREN)) { if (!lex_force_match_id (lexer, "NORMAL")) goto error; if (!lex_force_match (lexer, T_RPAREN)) goto error; graph.normal = true; } if (!lex_force_match (lexer, T_EQUALS)) goto error; graph.chart_type = CT_HISTOGRAM; if (!parse_variables_const (lexer, graph.dict, &graph.dep_vars, &graph.n_dep_vars, PV_NO_DUPLICATE | PV_NUMERIC)) goto error; if (graph.n_dep_vars > 1) { lex_error (lexer, _("Only one variable is allowed.")); goto error; } } else if (lex_match_id (lexer, "BAR")) { if (graph.chart_type != CT_NONE) { lex_error (lexer, _("Only one chart type is allowed.")); goto error; } graph.chart_type = CT_BAR; graph.bar_type = CBT_SIMPLE; if (lex_match (lexer, T_LPAREN)) { if (lex_match_id (lexer, "SIMPLE")) { /* This is the default anyway */ } else if (lex_match_id (lexer, "GROUPED")) { graph.bar_type = CBT_GROUPED; goto error; } else if (lex_match_id (lexer, "STACKED")) { graph.bar_type = CBT_STACKED; lex_error (lexer, _("%s is not yet implemented."), "STACKED"); goto error; } else if (lex_match_id (lexer, "RANGE")) { graph.bar_type = CBT_RANGE; lex_error (lexer, _("%s is not yet implemented."), "RANGE"); goto error; } else { lex_error (lexer, NULL); goto error; } if (!lex_force_match (lexer, T_RPAREN)) goto error; } if (!lex_force_match (lexer, T_EQUALS)) goto error; if (! parse_function (lexer, &graph)) goto error; } else if (lex_match_id (lexer, "SCATTERPLOT")) { if (graph.chart_type != CT_NONE) { lex_error (lexer, _("Only one chart type is allowed.")); goto error; } graph.chart_type = CT_SCATTERPLOT; if (lex_match (lexer, T_LPAREN)) { if (lex_match_id (lexer, "BIVARIATE")) { /* This is the default anyway */ } else if (lex_match_id (lexer, "OVERLAY")) { lex_error (lexer, _("%s is not yet implemented."),"OVERLAY"); goto error; } else if (lex_match_id (lexer, "MATRIX")) { lex_error (lexer, _("%s is not yet implemented."),"MATRIX"); goto error; } else if (lex_match_id (lexer, "XYZ")) { lex_error(lexer, _("%s is not yet implemented."),"XYZ"); goto error; } else { lex_error_expecting (lexer, "BIVARIATE"); goto error; } if (!lex_force_match (lexer, T_RPAREN)) goto error; } if (!lex_force_match (lexer, T_EQUALS)) goto error; if (!parse_variables_const (lexer, graph.dict, &graph.dep_vars, &graph.n_dep_vars, PV_NO_DUPLICATE | PV_NUMERIC)) goto error; if (graph.scatter_type == ST_BIVARIATE && graph.n_dep_vars != 1) { lex_error(lexer, _("Only one variable is allowed.")); goto error; } if (!lex_force_match (lexer, T_WITH)) goto error; if (!parse_variables_const (lexer, graph.dict, &graph.dep_vars, &graph.n_dep_vars, PV_NO_DUPLICATE | PV_NUMERIC | PV_APPEND)) goto error; if (graph.scatter_type == ST_BIVARIATE && graph.n_dep_vars != 2) { lex_error (lexer, _("Only one variable is allowed.")); goto error; } if (lex_match (lexer, T_BY)) { const struct variable *v = NULL; if (!lex_match_variable (lexer,graph.dict,&v)) { lex_error (lexer, _("Variable expected")); goto error; } graph.by_var[0] = v; graph.n_by_vars = 1; } } else if (lex_match_id (lexer, "LINE")) { lex_error (lexer, _("%s is not yet implemented."),"LINE"); goto error; } else if (lex_match_id (lexer, "PIE")) { lex_error (lexer, _("%s is not yet implemented."),"PIE"); goto error; } else if (lex_match_id (lexer, "ERRORBAR")) { lex_error (lexer, _("%s is not yet implemented."),"ERRORBAR"); goto error; } else if (lex_match_id (lexer, "PARETO")) { lex_error (lexer, _("%s is not yet implemented."),"PARETO"); goto error; } else if (lex_match_id (lexer, "TITLE")) { lex_error (lexer, _("%s is not yet implemented."),"TITLE"); goto error; } else if (lex_match_id (lexer, "SUBTITLE")) { lex_error (lexer, _("%s is not yet implemented."),"SUBTITLE"); goto error; } else if (lex_match_id (lexer, "FOOTNOTE")) { lex_error (lexer, _("%s is not yet implemented."),"FOOTNOTE"); lex_error (lexer, _("FOOTNOTE is not implemented yet for GRAPH")); goto error; } else if (lex_match_id (lexer, "MISSING")) { lex_match (lexer, T_EQUALS); while (lex_token (lexer) != T_ENDCMD && lex_token (lexer) != T_SLASH) { if (lex_match_id (lexer, "LISTWISE")) { graph.missing_pw = false; } else if (lex_match_id (lexer, "VARIABLE")) { graph.missing_pw = true; } else if (lex_match_id (lexer, "EXCLUDE")) { graph.dep_excl = MV_ANY; } else if (lex_match_id (lexer, "INCLUDE")) { graph.dep_excl = MV_SYSTEM; } else if (lex_match_id (lexer, "REPORT")) { graph.fctr_excl = MV_NEVER; } else if (lex_match_id (lexer, "NOREPORT")) { graph.fctr_excl = MV_ANY; } else { lex_error (lexer, NULL); goto error; } } } else { lex_error (lexer, NULL); goto error; } } switch (graph.chart_type) { case CT_SCATTERPLOT: /* See scatterplot.h for the setup of the case prototype */ /* x value - SP_IDX_X*/ graph.gr_proto = caseproto_add_width (graph.gr_proto, 0); /* y value - SP_IDX_Y*/ graph.gr_proto = caseproto_add_width (graph.gr_proto, 0); /* The by_var contains the plot categories for the different xy plot colors */ if (graph.n_by_vars > 0) /* SP_IDX_BY */ graph.gr_proto = caseproto_add_width (graph.gr_proto, var_get_width(graph.by_var[0])); break; case CT_HISTOGRAM: /* x value */ graph.gr_proto = caseproto_add_width (graph.gr_proto, 0); /* weight value */ graph.gr_proto = caseproto_add_width (graph.gr_proto, 0); break; case CT_BAR: break; case CT_NONE: lex_error_expecting (lexer, "HISTOGRAM", "SCATTERPLOT", "BAR"); goto error; default: NOT_REACHED (); break; }; { struct casegrouper *grouper; struct casereader *group; bool ok; grouper = casegrouper_create_splits (proc_open (ds), graph.dict); while (casegrouper_get_next_group (grouper, &group)) { if (graph.chart_type == CT_BAR) run_barchart (&graph, group); else run_graph (&graph, group); } ok = casegrouper_destroy (grouper); ok = proc_commit (ds) && ok; } subcase_destroy (&graph.ordering); free (graph.dep_vars); pool_destroy (graph.pool); caseproto_unref (graph.gr_proto); return CMD_SUCCESS; error: subcase_destroy (&graph.ordering); caseproto_unref (graph.gr_proto); free (graph.dep_vars); pool_destroy (graph.pool); return CMD_FAILURE; } pspp-1.4.1/src/language/stats/t-test.h0000644000175000017500000000313313320146056017214 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2011 Free Software Foundation, Inc. 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 3 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, see . */ #ifndef T_TEST_H #define T_TEST_H 1 #include "data/missing-values.h" struct variable; typedef const struct variable *vp[2]; enum missing_type { MISS_LISTWISE, MISS_ANALYSIS, }; enum mode { MODE_undef, MODE_PAIRED, MODE_INDEP, MODE_SINGLE, }; struct tt { size_t n_vars; const struct variable **vars; enum mode mode; enum missing_type missing_type; enum mv_class exclude; double confidence; const struct variable *wv; const struct dictionary *dict; }; struct casereader; union value; void one_sample_run (const struct tt *tt, double testval, struct casereader *reader); void paired_run (const struct tt *tt, size_t n_pairs, vp *pairs, struct casereader *reader); void indep_run (struct tt *tt, const struct variable *gvar, bool cut, const union value *gval0, const union value *gval1, struct casereader *reader); #endif pspp-1.4.1/src/language/stats/npar.h0000644000175000017500000000316013320146056016734 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2006, 2011 Free Software Foundation, Inc. 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 3 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, see . */ #if !npar_h #define npar_h 1 #include #include #include "data/missing-values.h" #include "data/value.h" typedef const struct variable *variable_pair[2]; struct hmapx; struct casefilter; struct casereader; struct dataset; struct npar_test { void (*execute) (const struct dataset *, struct casereader *, enum mv_class exclude, const struct npar_test *, bool, double); void (*insert_variables) (const struct npar_test *, struct hmapx *); }; struct one_sample_test { struct npar_test parent; const struct variable **vars; size_t n_vars; }; struct two_sample_test { struct npar_test parent; variable_pair *pairs; size_t n_pairs; }; struct n_sample_test { struct npar_test parent; const struct variable **vars; size_t n_vars; union value val1, val2; const struct variable *indep_var; }; #endif pspp-1.4.1/src/language/stats/kruskal-wallis.c0000644000175000017500000002206513700645725020752 0ustar00blpblp00000000000000/* Pspp - a program for statistical analysis. Copyright (C) 2010, 2011 Free Software Foundation, Inc. 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 3 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, see . */ #include #include "kruskal-wallis.h" #include #include #include "data/casereader.h" #include "data/casewriter.h" #include "data/dataset.h" #include "data/dictionary.h" #include "data/format.h" #include "data/subcase.h" #include "data/variable.h" #include "libpspp/assertion.h" #include "libpspp/hmap.h" #include "libpspp/bt.h" #include "libpspp/message.h" #include "libpspp/misc.h" #include "math/sort.h" #include "output/pivot-table.h" #include "gl/minmax.h" #include "gl/xalloc.h" #include "gettext.h" #define N_(msgid) msgid #define _(msgid) gettext (msgid) /* Returns true iff the independent variable lies in the range [nst->val1, nst->val2] */ static bool include_func (const struct ccase *c, void *aux) { const struct n_sample_test *nst = aux; if (0 < value_compare_3way (&nst->val1, case_data (c, nst->indep_var), var_get_width (nst->indep_var))) return false; if (0 > value_compare_3way (&nst->val2, case_data (c, nst->indep_var), var_get_width (nst->indep_var))) return false; return true; } struct rank_entry { struct hmap_node node; struct bt_node btn; union value group; double sum_of_ranks; double n; }; static int compare_rank_entries_3way (const struct bt_node *a, const struct bt_node *b, const void *aux) { const struct variable *var = aux; const struct rank_entry *rea = BT_DATA (a, struct rank_entry, btn); const struct rank_entry *reb = BT_DATA (b, struct rank_entry, btn); return value_compare_3way (&rea->group, &reb->group, var_get_width (var)); } /* Return the entry with the key GROUP or null if there is no such entry */ static struct rank_entry * find_rank_entry (const struct hmap *map, const union value *group, size_t width) { struct rank_entry *re = NULL; size_t hash = value_hash (group, width, 0); HMAP_FOR_EACH_WITH_HASH (re, struct rank_entry, node, hash, map) { if (0 == value_compare_3way (group, &re->group, width)) return re; } return re; } /* Calculates the adjustment necessary for tie compensation */ static void distinct_callback (double v UNUSED, casenumber t, double w UNUSED, void *aux) { double *tiebreaker = aux; *tiebreaker += pow3 (t) - t; } struct kw { struct hmap map; double h; }; static void show_ranks_box (const struct n_sample_test *, const struct kw *); static void show_sig_box (const struct n_sample_test *, const struct kw *); void kruskal_wallis_execute (const struct dataset *ds, struct casereader *input, enum mv_class exclude, const struct npar_test *test, bool exact UNUSED, double timer UNUSED) { int i; struct ccase *c; bool warn = true; const struct dictionary *dict = dataset_dict (ds); const struct n_sample_test *nst = UP_CAST (test, const struct n_sample_test, parent); const struct caseproto *proto ; size_t rank_idx ; int total_n_groups = 0.0; struct kw *kw = XCALLOC (nst->n_vars, struct kw); /* If the independent variable is missing, then we ignore the case */ input = casereader_create_filter_missing (input, &nst->indep_var, 1, exclude, NULL, NULL); input = casereader_create_filter_weight (input, dict, &warn, NULL); /* Remove all those cases which are outside the range (val1, val2) */ input = casereader_create_filter_func (input, include_func, NULL, CONST_CAST (struct n_sample_test *, nst), NULL); proto = casereader_get_proto (input); rank_idx = caseproto_get_n_widths (proto); /* Rank cases by the v value */ for (i = 0; i < nst->n_vars; ++i) { double tiebreaker = 0.0; bool warn = true; enum rank_error rerr = 0; struct casereader *rr; struct casereader *r = casereader_clone (input); r = sort_execute_1var (r, nst->vars[i]); /* Ignore missings in the test variable */ r = casereader_create_filter_missing (r, &nst->vars[i], 1, exclude, NULL, NULL); rr = casereader_create_append_rank (r, nst->vars[i], dict_get_weight (dict), &rerr, distinct_callback, &tiebreaker); hmap_init (&kw[i].map); for (; (c = casereader_read (rr)); case_unref (c)) { const union value *group = case_data (c, nst->indep_var); const size_t group_var_width = var_get_width (nst->indep_var); struct rank_entry *rank = find_rank_entry (&kw[i].map, group, group_var_width); if (NULL == rank) { rank = xzalloc (sizeof *rank); value_clone (&rank->group, group, group_var_width); hmap_insert (&kw[i].map, &rank->node, value_hash (&rank->group, group_var_width, 0)); } rank->sum_of_ranks += case_data_idx (c, rank_idx)->f; rank->n += dict_get_case_weight (dict, c, &warn); /* If this assertion fires, then either the data wasn't sorted or some other problem occurred */ assert (rerr == 0); } casereader_destroy (rr); /* Calculate the value of h */ { struct rank_entry *mre; double n = 0.0; HMAP_FOR_EACH (mre, struct rank_entry, node, &kw[i].map) { kw[i].h += pow2 (mre->sum_of_ranks) / mre->n; n += mre->n; total_n_groups ++; } kw[i].h *= 12 / (n * (n + 1)); kw[i].h -= 3 * (n + 1) ; kw[i].h /= 1 - tiebreaker/ (pow3 (n) - n); } } casereader_destroy (input); show_ranks_box (nst, kw); show_sig_box (nst, kw); /* Cleanup allocated memory */ for (i = 0 ; i < nst->n_vars; ++i) { struct rank_entry *mre, *next; HMAP_FOR_EACH_SAFE (mre, next, struct rank_entry, node, &kw[i].map) { hmap_delete (&kw[i].map, &mre->node); free (mre); } hmap_destroy (&kw[i].map); } free (kw); } static void show_ranks_box (const struct n_sample_test *nst, const struct kw *kw) { struct pivot_table *table = pivot_table_create (N_("Ranks")); pivot_dimension_create (table, PIVOT_AXIS_COLUMN, N_("Statistics"), N_("N"), PIVOT_RC_INTEGER, N_("Mean Rank"), PIVOT_RC_OTHER); struct pivot_dimension *variables = pivot_dimension_create ( table, PIVOT_AXIS_ROW, N_("Variables")); for (size_t i = 0 ; i < nst->n_vars ; ++i) { /* Sort the rank entries, by iteratin the hash and putting the entries into a binary tree. */ struct bt bt = BT_INITIALIZER(compare_rank_entries_3way, nst->vars[i]); struct rank_entry *re_x; HMAP_FOR_EACH (re_x, struct rank_entry, node, &kw[i].map) bt_insert (&bt, &re_x->btn); /* Report the rank entries in sorted order. */ struct pivot_category *group = pivot_category_create_group__ ( variables->root, pivot_value_new_variable (nst->vars[i])); int tot = 0; const struct rank_entry *re; BT_FOR_EACH (re, struct rank_entry, btn, &bt) { struct string str = DS_EMPTY_INITIALIZER; var_append_value_name (nst->indep_var, &re->group, &str); int row = pivot_category_create_leaf ( group, pivot_value_new_user_text_nocopy (ds_steal_cstr (&str))); double entries[] = { re->n, re->sum_of_ranks / re->n }; for (size_t j = 0; j < sizeof entries / sizeof *entries; j++) pivot_table_put2 (table, j, row, pivot_value_new_number (entries[j])); tot += re->n; } int row = pivot_category_create_leaves (group, N_("Total")); pivot_table_put2 (table, 0, row, pivot_value_new_number (tot)); } pivot_table_submit (table); } static void show_sig_box (const struct n_sample_test *nst, const struct kw *kw) { struct pivot_table *table = pivot_table_create (N_("Test Statistics")); pivot_dimension_create (table, PIVOT_AXIS_ROW, N_("Statistics"), N_("Chi-Square"), PIVOT_RC_OTHER, N_("df"), PIVOT_RC_INTEGER, N_("Asymp. Sig."), PIVOT_RC_SIGNIFICANCE); struct pivot_dimension *variables = pivot_dimension_create ( table, PIVOT_AXIS_COLUMN, N_("Variables")); for (size_t i = 0 ; i < nst->n_vars; ++i) { int col = pivot_category_create_leaf ( variables->root, pivot_value_new_variable (nst->vars[i])); double df = hmap_count (&kw[i].map) - 1; double sig = gsl_cdf_chisq_Q (kw[i].h, df); double entries[] = { kw[i].h, df, sig }; for (size_t j = 0; j < sizeof entries / sizeof *entries; j++) pivot_table_put2 (table, j, col, pivot_value_new_number (entries[j])); } pivot_table_submit (table); } pspp-1.4.1/src/language/stats/crosstabs.q0000644000175000017500000024267113717773141020037 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 1997-9, 2000, 2006, 2009, 2010, 2011, 2012, 2013, 2014, 2016 Free Software Foundation, Inc. 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 3 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, see . */ /* FIXME: - How to calculate significance of some symmetric and directional measures? - How to calculate ASE for symmetric Somers ' d? - How to calculate ASE for Goodman and Kruskal's tau? - How to calculate approx. T of symmetric uncertainty coefficient? */ #include #include #include #include #include #include #include "data/case.h" #include "data/casegrouper.h" #include "data/casereader.h" #include "data/data-out.h" #include "data/dataset.h" #include "data/dictionary.h" #include "data/format.h" #include "data/value-labels.h" #include "data/variable.h" #include "language/command.h" #include "language/stats/freq.h" #include "language/dictionary/split-file.h" #include "language/lexer/lexer.h" #include "language/lexer/variable-parser.h" #include "libpspp/array.h" #include "libpspp/assertion.h" #include "libpspp/compiler.h" #include "libpspp/hash-functions.h" #include "libpspp/hmap.h" #include "libpspp/hmapx.h" #include "libpspp/message.h" #include "libpspp/misc.h" #include "libpspp/pool.h" #include "libpspp/str.h" #include "output/pivot-table.h" #include "output/chart-item.h" #include "output/charts/barchart.h" #include "gl/minmax.h" #include "gl/xalloc.h" #include "gl/xsize.h" #include "gettext.h" #define _(msgid) gettext (msgid) #define N_(msgid) msgid /* (headers) */ /* (specification) crosstabs (crs_): *^tables=custom; +variables=custom; missing=miss:!table/include/report; count=roundwhat:asis/case/!cell, roundhow:!round/truncate; +write[wr_]=none,cells,all; +format=val:!avalue/dvalue, indx:!noindex/index, tabl:!tables/notables, box:!box/nobox, pivot:!pivot/nopivot; +barchart=; +cells[cl_]=count,expected,row,column,total,residual,sresidual, asresidual,all,none; +statistics[st_]=chisq,phi,cc,lambda,uc,none,btau,ctau,risk,gamma,d, kappa,eta,corr,all. */ /* (declarations) */ /* (functions) */ /* Number of chi-square statistics. */ #define N_CHISQ 5 /* Number of symmetric statistics. */ #define N_SYMMETRIC 9 /* Number of directional statistics. */ #define N_DIRECTIONAL 13 /* Indexes into the 'vars' member of struct crosstabulation and struct crosstab member. */ enum { ROW_VAR = 0, /* Row variable. */ COL_VAR = 1 /* Column variable. */ /* Higher indexes cause multiple tables to be output. */ }; struct xtab_var { const struct variable *var; union value *values; size_t n_values; }; /* A crosstabulation of 2 or more variables. */ struct crosstabulation { struct crosstabs_proc *proc; struct fmt_spec weight_format; /* Format for weight variable. */ double missing; /* Weight of missing cases. */ /* Variables (2 or more). */ int n_vars; struct xtab_var *vars; /* Constants (0 or more). */ int n_consts; struct xtab_var *const_vars; size_t *const_indexes; /* Data. */ struct hmap data; struct freq **entries; size_t n_entries; /* Number of statistically interesting columns/rows (columns/rows with data in them). */ int ns_cols, ns_rows; /* Matrix contents. */ double *mat; /* Matrix proper. */ double *row_tot; /* Row totals. */ double *col_tot; /* Column totals. */ double total; /* Grand total. */ }; /* Integer mode variable info. */ struct var_range { struct hmap_node hmap_node; /* In struct crosstabs_proc var_ranges map. */ const struct variable *var; /* The variable. */ int min; /* Minimum value. */ int max; /* Maximum value + 1. */ int count; /* max - min. */ }; struct crosstabs_proc { const struct dictionary *dict; enum { INTEGER, GENERAL } mode; enum mv_class exclude; bool pivot; bool barchart; bool bad_warn; struct fmt_spec weight_format; /* Variables specifies on VARIABLES. */ const struct variable **variables; size_t n_variables; struct hmap var_ranges; /* TABLES. */ struct crosstabulation *pivots; int n_pivots; /* CELLS. */ int n_cells; /* Number of cells requested. */ unsigned int cells; /* Bit k is 1 if cell k is requested. */ int a_cells[CRS_CL_count]; /* 0...n_cells-1 are the requested cells. */ /* Rounding of cells. */ bool round_case_weights; /* Round case weights? */ bool round_cells; /* If !round_case_weights, round cells? */ bool round_down; /* Round down? (otherwise to nearest) */ /* STATISTICS. */ unsigned int statistics; /* Bit k is 1 if statistic k is requested. */ bool descending; /* True if descending sort order is requested. */ }; const struct var_range *get_var_range (const struct crosstabs_proc *, const struct variable *); static bool should_tabulate_case (const struct crosstabulation *, const struct ccase *, enum mv_class exclude); static void tabulate_general_case (struct crosstabulation *, const struct ccase *, double weight); static void tabulate_integer_case (struct crosstabulation *, const struct ccase *, double weight); static void postcalc (struct crosstabs_proc *); static double round_weight (const struct crosstabs_proc *proc, double weight) { return proc->round_down ? floor (weight) : floor (weight + 0.5); } #define FOR_EACH_POPULATED_COLUMN(C, XT) \ for (int C = next_populated_column (0, XT); \ C < (XT)->vars[COL_VAR].n_values; \ C = next_populated_column (C + 1, XT)) static int next_populated_column (int c, const struct crosstabulation *xt) { int n_columns = xt->vars[COL_VAR].n_values; for (; c < n_columns; c++) if (xt->col_tot[c]) break; return c; } #define FOR_EACH_POPULATED_ROW(R, XT) \ for (int R = next_populated_row (0, XT); R < (XT)->vars[ROW_VAR].n_values; \ R = next_populated_row (R + 1, XT)) static int next_populated_row (int r, const struct crosstabulation *xt) { int n_rows = xt->vars[ROW_VAR].n_values; for (; r < n_rows; r++) if (xt->row_tot[r]) break; return r; } /* Parses and executes the CROSSTABS procedure. */ int cmd_crosstabs (struct lexer *lexer, struct dataset *ds) { struct var_range *range, *next_range; struct crosstabs_proc proc; struct casegrouper *grouper; struct casereader *input, *group; struct cmd_crosstabs cmd; struct crosstabulation *xt; int result; bool ok; int i; proc.dict = dataset_dict (ds); proc.bad_warn = true; proc.variables = NULL; proc.n_variables = 0; hmap_init (&proc.var_ranges); proc.pivots = NULL; proc.n_pivots = 0; proc.descending = false; proc.weight_format = *dict_get_weight_format (dataset_dict (ds)); if (!parse_crosstabs (lexer, ds, &cmd, &proc)) { result = CMD_FAILURE; goto exit; } proc.mode = proc.n_variables ? INTEGER : GENERAL; proc.barchart = cmd.sbc_barchart > 0; proc.descending = cmd.val == CRS_DVALUE; proc.round_case_weights = cmd.sbc_count && cmd.roundwhat == CRS_CASE; proc.round_cells = cmd.sbc_count && cmd.roundwhat == CRS_CELL; proc.round_down = cmd.roundhow == CRS_TRUNCATE; /* CELLS. */ if (!cmd.sbc_cells) proc.cells = 1u << CRS_CL_COUNT; else if (cmd.a_cells[CRS_CL_ALL]) proc.cells = UINT_MAX; else { proc.cells = 0; for (i = 0; i < CRS_CL_count; i++) if (cmd.a_cells[i]) proc.cells |= 1u << i; if (proc.cells == 0) proc.cells = ((1u << CRS_CL_COUNT) | (1u << CRS_CL_ROW) | (1u << CRS_CL_COLUMN) | (1u << CRS_CL_TOTAL)); } proc.cells &= ((1u << CRS_CL_count) - 1); proc.cells &= ~((1u << CRS_CL_NONE) | (1u << CRS_CL_ALL)); proc.n_cells = 0; for (i = 0; i < CRS_CL_count; i++) if (proc.cells & (1u << i)) proc.a_cells[proc.n_cells++] = i; /* STATISTICS. */ if (cmd.a_statistics[CRS_ST_ALL]) proc.statistics = UINT_MAX; else if (cmd.sbc_statistics) { int i; proc.statistics = 0; for (i = 0; i < CRS_ST_count; i++) if (cmd.a_statistics[i]) proc.statistics |= 1u << i; if (proc.statistics == 0) proc.statistics |= 1u << CRS_ST_CHISQ; } else proc.statistics = 0; /* MISSING. */ proc.exclude = (cmd.miss == CRS_TABLE ? MV_ANY : cmd.miss == CRS_INCLUDE ? MV_SYSTEM : MV_NEVER); if (proc.mode == GENERAL && proc.exclude == MV_NEVER) { msg (SE, _("Missing mode %s not allowed in general mode. " "Assuming %s."), "REPORT", "MISSING=TABLE"); proc.exclude = MV_ANY; } /* PIVOT. */ proc.pivot = cmd.pivot == CRS_PIVOT; input = casereader_create_filter_weight (proc_open (ds), dataset_dict (ds), NULL, NULL); grouper = casegrouper_create_splits (input, dataset_dict (ds)); while (casegrouper_get_next_group (grouper, &group)) { struct ccase *c; /* Output SPLIT FILE variables. */ c = casereader_peek (group, 0); if (c != NULL) { output_split_file_values (ds, c); case_unref (c); } /* Initialize hash tables. */ for (xt = &proc.pivots[0]; xt < &proc.pivots[proc.n_pivots]; xt++) hmap_init (&xt->data); /* Tabulate. */ for (; (c = casereader_read (group)) != NULL; case_unref (c)) for (xt = &proc.pivots[0]; xt < &proc.pivots[proc.n_pivots]; xt++) { double weight = dict_get_case_weight (dataset_dict (ds), c, &proc.bad_warn); if (cmd.roundwhat == CRS_CASE) { weight = round_weight (&proc, weight); if (weight == 0.) continue; } if (should_tabulate_case (xt, c, proc.exclude)) { if (proc.mode == GENERAL) tabulate_general_case (xt, c, weight); else tabulate_integer_case (xt, c, weight); } else xt->missing += weight; } casereader_destroy (group); /* Output. */ postcalc (&proc); } ok = casegrouper_destroy (grouper); ok = proc_commit (ds) && ok; result = ok ? CMD_SUCCESS : CMD_CASCADING_FAILURE; exit: free (proc.variables); HMAP_FOR_EACH_SAFE (range, next_range, struct var_range, hmap_node, &proc.var_ranges) { hmap_delete (&proc.var_ranges, &range->hmap_node); free (range); } for (xt = &proc.pivots[0]; xt < &proc.pivots[proc.n_pivots]; xt++) { free (xt->vars); free (xt->const_vars); free (xt->const_indexes); } free (proc.pivots); return result; } /* Parses the TABLES subcommand. */ static int crs_custom_tables (struct lexer *lexer, struct dataset *ds, struct cmd_crosstabs *cmd UNUSED, void *proc_) { struct crosstabs_proc *proc = proc_; struct const_var_set *var_set; int n_by; const struct variable ***by = NULL; int *by_iter; size_t *by_nvar = NULL; size_t nx = 1; bool ok = false; int i; /* Ensure that this is a TABLES subcommand. */ if (!lex_match_id (lexer, "TABLES") && (lex_token (lexer) != T_ID || dict_lookup_var (dataset_dict (ds), lex_tokcstr (lexer)) == NULL) && lex_token (lexer) != T_ALL) return 2; lex_match (lexer, T_EQUALS); if (proc->variables != NULL) var_set = const_var_set_create_from_array (proc->variables, proc->n_variables); else var_set = const_var_set_create_from_dict (dataset_dict (ds)); assert (var_set != NULL); for (n_by = 0; ;) { by = xnrealloc (by, n_by + 1, sizeof *by); by_nvar = xnrealloc (by_nvar, n_by + 1, sizeof *by_nvar); if (!parse_const_var_set_vars (lexer, var_set, &by[n_by], &by_nvar[n_by], PV_NO_DUPLICATE | PV_NO_SCRATCH)) goto done; if (xalloc_oversized (nx, by_nvar[n_by])) { msg (SE, _("Too many cross-tabulation variables or dimensions.")); goto done; } nx *= by_nvar[n_by]; n_by++; if (!lex_match (lexer, T_BY)) { if (n_by < 2) goto done; else break; } } by_iter = xcalloc (n_by, sizeof *by_iter); proc->pivots = xnrealloc (proc->pivots, proc->n_pivots + nx, sizeof *proc->pivots); for (i = 0; i < nx; i++) { struct crosstabulation *xt = &proc->pivots[proc->n_pivots++]; int j; xt->proc = proc; xt->weight_format = proc->weight_format; xt->missing = 0.; xt->n_vars = n_by; xt->vars = xcalloc (n_by, sizeof *xt->vars); xt->n_consts = 0; xt->const_vars = NULL; xt->const_indexes = NULL; for (j = 0; j < n_by; j++) xt->vars[j].var = by[j][by_iter[j]]; for (j = n_by - 1; j >= 0; j--) { if (++by_iter[j] < by_nvar[j]) break; by_iter[j] = 0; } } free (by_iter); ok = true; done: /* All return paths lead here. */ for (i = 0; i < n_by; i++) free (by[i]); free (by); free (by_nvar); const_var_set_destroy (var_set); return ok; } /* Parses the VARIABLES subcommand. */ static int crs_custom_variables (struct lexer *lexer, struct dataset *ds, struct cmd_crosstabs *cmd UNUSED, void *proc_) { struct crosstabs_proc *proc = proc_; if (proc->n_pivots) { msg (SE, _("%s must be specified before %s."), "VARIABLES", "TABLES"); return 0; } lex_match (lexer, T_EQUALS); for (;;) { size_t orig_nv = proc->n_variables; size_t i; long min, max; if (!parse_variables_const (lexer, dataset_dict (ds), &proc->variables, &proc->n_variables, (PV_APPEND | PV_NUMERIC | PV_NO_DUPLICATE | PV_NO_SCRATCH))) return 0; if (!lex_force_match (lexer, T_LPAREN)) goto lossage; if (!lex_force_int (lexer)) goto lossage; min = lex_integer (lexer); lex_get (lexer); lex_match (lexer, T_COMMA); if (!lex_force_int (lexer)) goto lossage; max = lex_integer (lexer); if (max < min) { msg (SE, _("Maximum value (%ld) less than minimum value (%ld)."), max, min); goto lossage; } lex_get (lexer); if (!lex_force_match (lexer, T_RPAREN)) goto lossage; for (i = orig_nv; i < proc->n_variables; i++) { const struct variable *var = proc->variables[i]; struct var_range *vr = xmalloc (sizeof *vr); vr->var = var; vr->min = min; vr->max = max; vr->count = max - min + 1; hmap_insert (&proc->var_ranges, &vr->hmap_node, hash_pointer (var, 0)); } if (lex_token (lexer) == T_SLASH) break; } return 1; lossage: free (proc->variables); proc->variables = NULL; proc->n_variables = 0; return 0; } /* Data file processing. */ const struct var_range * get_var_range (const struct crosstabs_proc *proc, const struct variable *var) { if (!hmap_is_empty (&proc->var_ranges)) { const struct var_range *range; HMAP_FOR_EACH_IN_BUCKET (range, struct var_range, hmap_node, hash_pointer (var, 0), &proc->var_ranges) if (range->var == var) return range; } return NULL; } static bool should_tabulate_case (const struct crosstabulation *xt, const struct ccase *c, enum mv_class exclude) { int j; for (j = 0; j < xt->n_vars; j++) { const struct variable *var = xt->vars[j].var; const struct var_range *range = get_var_range (xt->proc, var); if (var_is_value_missing (var, case_data (c, var), exclude)) return false; if (range != NULL) { double num = case_num (c, var); if (num < range->min || num >= range->max + 1.) return false; } } return true; } static void tabulate_integer_case (struct crosstabulation *xt, const struct ccase *c, double weight) { struct freq *te; size_t hash; int j; hash = 0; for (j = 0; j < xt->n_vars; j++) { /* Throw away fractional parts of values. */ hash = hash_int (case_num (c, xt->vars[j].var), hash); } HMAP_FOR_EACH_WITH_HASH (te, struct freq, node, hash, &xt->data) { for (j = 0; j < xt->n_vars; j++) if ((int) case_num (c, xt->vars[j].var) != (int) te->values[j].f) goto no_match; /* Found an existing entry. */ te->count += weight; return; no_match: ; } /* No existing entry. Create a new one. */ te = xmalloc (table_entry_size (xt->n_vars)); te->count = weight; for (j = 0; j < xt->n_vars; j++) te->values[j].f = (int) case_num (c, xt->vars[j].var); hmap_insert (&xt->data, &te->node, hash); } static void tabulate_general_case (struct crosstabulation *xt, const struct ccase *c, double weight) { struct freq *te; size_t hash; int j; hash = 0; for (j = 0; j < xt->n_vars; j++) { const struct variable *var = xt->vars[j].var; hash = value_hash (case_data (c, var), var_get_width (var), hash); } HMAP_FOR_EACH_WITH_HASH (te, struct freq, node, hash, &xt->data) { for (j = 0; j < xt->n_vars; j++) { const struct variable *var = xt->vars[j].var; if (!value_equal (case_data (c, var), &te->values[j], var_get_width (var))) goto no_match; } /* Found an existing entry. */ te->count += weight; return; no_match: ; } /* No existing entry. Create a new one. */ te = xmalloc (table_entry_size (xt->n_vars)); te->count = weight; for (j = 0; j < xt->n_vars; j++) { const struct variable *var = xt->vars[j].var; value_clone (&te->values[j], case_data (c, var), var_get_width (var)); } hmap_insert (&xt->data, &te->node, hash); } /* Post-data reading calculations. */ static int compare_table_entry_vars_3way (const struct freq *a, const struct freq *b, const struct crosstabulation *xt, int idx0, int idx1); static int compare_table_entry_3way (const void *ap_, const void *bp_, const void *xt_); static int compare_table_entry_3way_inv (const void *ap_, const void *bp_, const void *xt_); static void enum_var_values (const struct crosstabulation *, int var_idx, bool descending); static void free_var_values (const struct crosstabulation *, int var_idx); static void output_crosstabulation (struct crosstabs_proc *, struct crosstabulation *); static void make_crosstabulation_subset (struct crosstabulation *xt, size_t row0, size_t row1, struct crosstabulation *subset); static void make_summary_table (struct crosstabs_proc *); static bool find_crosstab (struct crosstabulation *, size_t *row0p, size_t *row1p); static void postcalc (struct crosstabs_proc *proc) { /* Round hash table entries, if requested If this causes any of the cell counts to fall to zero, delete those cells. */ if (proc->round_cells) for (struct crosstabulation *xt = proc->pivots; xt < &proc->pivots[proc->n_pivots]; xt++) { struct freq *e, *next; HMAP_FOR_EACH_SAFE (e, next, struct freq, node, &xt->data) { e->count = round_weight (proc, e->count); if (e->count == 0.0) { hmap_delete (&xt->data, &e->node); free (e); } } } /* Convert hash tables into sorted arrays of entries. */ for (struct crosstabulation *xt = proc->pivots; xt < &proc->pivots[proc->n_pivots]; xt++) { struct freq *e; xt->n_entries = hmap_count (&xt->data); xt->entries = xnmalloc (xt->n_entries, sizeof *xt->entries); size_t i = 0; HMAP_FOR_EACH (e, struct freq, node, &xt->data) xt->entries[i++] = e; hmap_destroy (&xt->data); sort (xt->entries, xt->n_entries, sizeof *xt->entries, proc->descending ? compare_table_entry_3way_inv : compare_table_entry_3way, xt); } make_summary_table (proc); /* Output each pivot table. */ for (struct crosstabulation *xt = proc->pivots; xt < &proc->pivots[proc->n_pivots]; xt++) { if (proc->pivot || xt->n_vars == 2) output_crosstabulation (proc, xt); else { size_t row0 = 0, row1 = 0; while (find_crosstab (xt, &row0, &row1)) { struct crosstabulation subset; make_crosstabulation_subset (xt, row0, row1, &subset); output_crosstabulation (proc, &subset); free (subset.const_indexes); } } if (proc->barchart) { int n_vars = (xt->n_vars > 2 ? 2 : xt->n_vars); const struct variable **vars = xcalloc (n_vars, sizeof *vars); for (size_t i = 0; i < n_vars; i++) vars[i] = xt->vars[i].var; chart_item_submit (barchart_create (vars, n_vars, _("Count"), false, xt->entries, xt->n_entries)); free (vars); } } /* Free output and prepare for next split file. */ for (struct crosstabulation *xt = proc->pivots; xt < &proc->pivots[proc->n_pivots]; xt++) { xt->missing = 0.0; /* Free the members that were allocated in this function(and the values owned by the entries. The other pointer members are either both allocated and destroyed at a lower level (in output_crosstabulation), or both allocated and destroyed at a higher level (in crs_custom_tables and free_proc, respectively). */ for (size_t i = 0; i < xt->n_vars; i++) { int width = var_get_width (xt->vars[i].var); if (value_needs_init (width)) { size_t j; for (j = 0; j < xt->n_entries; j++) value_destroy (&xt->entries[j]->values[i], width); } } for (size_t i = 0; i < xt->n_entries; i++) free (xt->entries[i]); free (xt->entries); } } static void make_crosstabulation_subset (struct crosstabulation *xt, size_t row0, size_t row1, struct crosstabulation *subset) { *subset = *xt; if (xt->n_vars > 2) { assert (xt->n_consts == 0); subset->n_vars = 2; subset->vars = xt->vars; subset->n_consts = xt->n_vars - 2; subset->const_vars = xt->vars + 2; subset->const_indexes = xcalloc (subset->n_consts, sizeof *subset->const_indexes); for (size_t i = 0; i < subset->n_consts; i++) { const union value *value = &xt->entries[row0]->values[2 + i]; for (size_t j = 0; j < xt->vars[2 + i].n_values; j++) if (value_equal (&xt->vars[2 + i].values[j], value, var_get_width (xt->vars[2 + i].var))) { subset->const_indexes[i] = j; goto found; } NOT_REACHED (); found: ; } } subset->entries = &xt->entries[row0]; subset->n_entries = row1 - row0; } static int compare_table_entry_var_3way (const struct freq *a, const struct freq *b, const struct crosstabulation *xt, int idx) { return value_compare_3way (&a->values[idx], &b->values[idx], var_get_width (xt->vars[idx].var)); } static int compare_table_entry_vars_3way (const struct freq *a, const struct freq *b, const struct crosstabulation *xt, int idx0, int idx1) { int i; for (i = idx1 - 1; i >= idx0; i--) { int cmp = compare_table_entry_var_3way (a, b, xt, i); if (cmp != 0) return cmp; } return 0; } /* Compare the struct freq at *AP to the one at *BP and return a strcmp()-type result. */ static int compare_table_entry_3way (const void *ap_, const void *bp_, const void *xt_) { const struct freq *const *ap = ap_; const struct freq *const *bp = bp_; const struct freq *a = *ap; const struct freq *b = *bp; const struct crosstabulation *xt = xt_; int cmp; cmp = compare_table_entry_vars_3way (a, b, xt, 2, xt->n_vars); if (cmp != 0) return cmp; cmp = compare_table_entry_var_3way (a, b, xt, ROW_VAR); if (cmp != 0) return cmp; return compare_table_entry_var_3way (a, b, xt, COL_VAR); } /* Inverted version of compare_table_entry_3way */ static int compare_table_entry_3way_inv (const void *ap_, const void *bp_, const void *xt_) { return -compare_table_entry_3way (ap_, bp_, xt_); } /* Output a table summarizing the cases processed. */ static void make_summary_table (struct crosstabs_proc *proc) { struct pivot_table *table = pivot_table_create (N_("Summary")); pivot_table_set_weight_var (table, dict_get_weight (proc->dict)); pivot_dimension_create (table, PIVOT_AXIS_COLUMN, N_("Statistics"), N_("N"), PIVOT_RC_COUNT, N_("Percent"), PIVOT_RC_PERCENT); struct pivot_dimension *cases = pivot_dimension_create ( table, PIVOT_AXIS_COLUMN, N_("Cases"), N_("Valid"), N_("Missing"), N_("Total")); cases->root->show_label = true; struct pivot_dimension *tables = pivot_dimension_create ( table, PIVOT_AXIS_ROW, N_("Crosstabulation")); for (struct crosstabulation *xt = &proc->pivots[0]; xt < &proc->pivots[proc->n_pivots]; xt++) { struct string name = DS_EMPTY_INITIALIZER; for (size_t i = 0; i < xt->n_vars; i++) { if (i > 0) ds_put_cstr (&name, " × "); ds_put_cstr (&name, var_to_string (xt->vars[i].var)); } int row = pivot_category_create_leaf ( tables->root, pivot_value_new_user_text_nocopy (ds_steal_cstr (&name))); double valid = 0.; for (size_t i = 0; i < xt->n_entries; i++) valid += xt->entries[i]->count; double n[3]; n[0] = valid; n[1] = xt->missing; n[2] = n[0] + n[1]; for (int i = 0; i < 3; i++) { pivot_table_put3 (table, 0, i, row, pivot_value_new_number (n[i])); pivot_table_put3 (table, 1, i, row, pivot_value_new_number (n[i] / n[2] * 100.0)); } } pivot_table_submit (table); } /* Output. */ static struct pivot_table *create_crosstab_table ( struct crosstabs_proc *, struct crosstabulation *, size_t crs_leaves[CRS_CL_count]); static struct pivot_table *create_chisq_table (struct crosstabulation *); static struct pivot_table *create_sym_table (struct crosstabulation *); static struct pivot_table *create_risk_table ( struct crosstabulation *, struct pivot_dimension **risk_statistics); static struct pivot_table *create_direct_table (struct crosstabulation *); static void display_crosstabulation (struct crosstabs_proc *, struct crosstabulation *, struct pivot_table *, size_t crs_leaves[CRS_CL_count]); static void display_chisq (struct crosstabulation *, struct pivot_table *); static void display_symmetric (struct crosstabs_proc *, struct crosstabulation *, struct pivot_table *); static void display_risk (struct crosstabulation *, struct pivot_table *, struct pivot_dimension *risk_statistics); static void display_directional (struct crosstabs_proc *, struct crosstabulation *, struct pivot_table *); static void delete_missing (struct crosstabulation *); static void build_matrix (struct crosstabulation *); /* Output pivot table XT in the context of PROC. */ static void output_crosstabulation (struct crosstabs_proc *proc, struct crosstabulation *xt) { for (size_t i = 0; i < xt->n_vars; i++) enum_var_values (xt, i, proc->descending); if (xt->vars[COL_VAR].n_values == 0) { struct string vars; int i; ds_init_cstr (&vars, var_to_string (xt->vars[0].var)); for (i = 1; i < xt->n_vars; i++) ds_put_format (&vars, " × %s", var_to_string (xt->vars[i].var)); /* TRANSLATORS: The %s here describes a crosstabulation. It takes the form "var1 * var2 * var3 * ...". */ msg (SW, _("Crosstabulation %s contained no non-missing cases."), ds_cstr (&vars)); ds_destroy (&vars); for (size_t i = 0; i < xt->n_vars; i++) free_var_values (xt, i); return; } size_t crs_leaves[CRS_CL_count]; struct pivot_table *table = (proc->cells ? create_crosstab_table (proc, xt, crs_leaves) : NULL); struct pivot_table *chisq = (proc->statistics & (1u << CRS_ST_CHISQ) ? create_chisq_table (xt) : NULL); struct pivot_table *sym = (proc->statistics & ((1u << CRS_ST_PHI) | (1u << CRS_ST_CC) | (1u << CRS_ST_BTAU) | (1u << CRS_ST_CTAU) | (1u << CRS_ST_GAMMA) | (1u << CRS_ST_CORR) | (1u << CRS_ST_KAPPA)) ? create_sym_table (xt) : NULL); struct pivot_dimension *risk_statistics = NULL; struct pivot_table *risk = (proc->statistics & (1u << CRS_ST_RISK) ? create_risk_table (xt, &risk_statistics) : NULL); struct pivot_table *direct = (proc->statistics & ((1u << CRS_ST_LAMBDA) | (1u << CRS_ST_UC) | (1u << CRS_ST_D) | (1u << CRS_ST_ETA)) ? create_direct_table (xt) : NULL); size_t row0 = 0; size_t row1 = 0; while (find_crosstab (xt, &row0, &row1)) { struct crosstabulation x; make_crosstabulation_subset (xt, row0, row1, &x); size_t n_rows = x.vars[ROW_VAR].n_values; size_t n_cols = x.vars[COL_VAR].n_values; if (size_overflow_p (xtimes (xtimes (n_rows, n_cols), sizeof (double)))) xalloc_die (); x.row_tot = xmalloc (n_rows * sizeof *x.row_tot); x.col_tot = xmalloc (n_cols * sizeof *x.col_tot); x.mat = xmalloc (n_rows * n_cols * sizeof *x.mat); build_matrix (&x); /* Find the first variable that differs from the last subtable. */ if (table) display_crosstabulation (proc, &x, table, crs_leaves); if (proc->exclude == MV_NEVER) delete_missing (&x); if (chisq) display_chisq (&x, chisq); if (sym) display_symmetric (proc, &x, sym); if (risk) display_risk (&x, risk, risk_statistics); if (direct) display_directional (proc, &x, direct); free (x.mat); free (x.row_tot); free (x.col_tot); free (x.const_indexes); } if (table) pivot_table_submit (table); if (chisq) pivot_table_submit (chisq); if (sym) pivot_table_submit (sym); if (risk) { if (!pivot_table_is_empty (risk)) pivot_table_submit (risk); else pivot_table_unref (risk); } if (direct) pivot_table_submit (direct); for (size_t i = 0; i < xt->n_vars; i++) free_var_values (xt, i); } static void build_matrix (struct crosstabulation *x) { const int col_var_width = var_get_width (x->vars[COL_VAR].var); const int row_var_width = var_get_width (x->vars[ROW_VAR].var); size_t n_rows = x->vars[ROW_VAR].n_values; size_t n_cols = x->vars[COL_VAR].n_values; int col, row; double *mp; struct freq **p; mp = x->mat; col = row = 0; for (p = x->entries; p < &x->entries[x->n_entries]; p++) { const struct freq *te = *p; while (!value_equal (&x->vars[ROW_VAR].values[row], &te->values[ROW_VAR], row_var_width)) { for (; col < n_cols; col++) *mp++ = 0.0; col = 0; row++; } while (!value_equal (&x->vars[COL_VAR].values[col], &te->values[COL_VAR], col_var_width)) { *mp++ = 0.0; col++; } *mp++ = te->count; if (++col >= n_cols) { col = 0; row++; } } while (mp < &x->mat[n_cols * n_rows]) *mp++ = 0.0; assert (mp == &x->mat[n_cols * n_rows]); /* Column totals, row totals, ns_rows. */ mp = x->mat; for (col = 0; col < n_cols; col++) x->col_tot[col] = 0.0; for (row = 0; row < n_rows; row++) x->row_tot[row] = 0.0; x->ns_rows = 0; for (row = 0; row < n_rows; row++) { bool row_is_empty = true; for (col = 0; col < n_cols; col++) { if (*mp != 0.0) { row_is_empty = false; x->col_tot[col] += *mp; x->row_tot[row] += *mp; } mp++; } if (!row_is_empty) x->ns_rows++; } assert (mp == &x->mat[n_cols * n_rows]); /* ns_cols. */ x->ns_cols = 0; for (col = 0; col < n_cols; col++) for (row = 0; row < n_rows; row++) if (x->mat[col + row * n_cols] != 0.0) { x->ns_cols++; break; } /* Grand total. */ x->total = 0.0; for (col = 0; col < n_cols; col++) x->total += x->col_tot[col]; } static void add_var_dimension (struct pivot_table *table, const struct xtab_var *var, enum pivot_axis_type axis_type, bool total) { struct pivot_dimension *d = pivot_dimension_create__ ( table, axis_type, pivot_value_new_variable (var->var)); struct pivot_footnote *missing_footnote = pivot_table_create_footnote ( table, pivot_value_new_text (N_("Missing value"))); struct pivot_category *group = pivot_category_create_group__ ( d->root, pivot_value_new_variable (var->var)); for (size_t j = 0; j < var->n_values; j++) { struct pivot_value *value = pivot_value_new_var_value ( var->var, &var->values[j]); if (var_is_value_missing (var->var, &var->values[j], MV_ANY)) pivot_value_add_footnote (value, missing_footnote); pivot_category_create_leaf (group, value); } if (total) pivot_category_create_leaf (d->root, pivot_value_new_text (N_("Total"))); } static struct pivot_table * create_crosstab_table (struct crosstabs_proc *proc, struct crosstabulation *xt, size_t crs_leaves[CRS_CL_count]) { /* Title. */ struct string title = DS_EMPTY_INITIALIZER; for (size_t i = 0; i < xt->n_vars; i++) { if (i) ds_put_cstr (&title, " × "); ds_put_cstr (&title, var_to_string (xt->vars[i].var)); } for (size_t i = 0; i < xt->n_consts; i++) { const struct variable *var = xt->const_vars[i].var; const union value *value = &xt->entries[0]->values[2 + i]; char *s; ds_put_format (&title, ", %s=", var_to_string (var)); /* Insert the formatted value of VAR without any leading spaces. */ s = data_out (value, var_get_encoding (var), var_get_print_format (var)); ds_put_cstr (&title, s + strspn (s, " ")); free (s); } struct pivot_table *table = pivot_table_create__ ( pivot_value_new_user_text_nocopy (ds_steal_cstr (&title)), "Crosstabulation"); pivot_table_set_weight_format (table, &proc->weight_format); table->omit_empty = true; struct pivot_dimension *statistics = pivot_dimension_create ( table, PIVOT_AXIS_ROW, N_("Statistics")); struct statistic { const char *label; const char *rc; }; static const struct statistic stats[CRS_CL_count] = { [CRS_CL_COUNT] = { N_("Count"), PIVOT_RC_COUNT }, [CRS_CL_ROW] = { N_("Row %"), PIVOT_RC_PERCENT }, [CRS_CL_COLUMN] = { N_("Column %"), PIVOT_RC_PERCENT }, [CRS_CL_TOTAL] = { N_("Total %"), PIVOT_RC_PERCENT }, [CRS_CL_EXPECTED] = { N_("Expected"), PIVOT_RC_OTHER }, [CRS_CL_RESIDUAL] = { N_("Residual"), PIVOT_RC_RESIDUAL }, [CRS_CL_SRESIDUAL] = { N_("Std. Residual"), PIVOT_RC_RESIDUAL }, [CRS_CL_ASRESIDUAL] = { N_("Adjusted Residual"), PIVOT_RC_RESIDUAL }, }; for (size_t i = 0; i < CRS_CL_count; i++) if (proc->cells & (1u << i) && stats[i].label) crs_leaves[i] = pivot_category_create_leaf_rc ( statistics->root, pivot_value_new_text (stats[i].label), stats[i].rc); for (size_t i = 0; i < xt->n_vars; i++) add_var_dimension (table, &xt->vars[i], i == COL_VAR ? PIVOT_AXIS_COLUMN : PIVOT_AXIS_ROW, true); return table; } static struct pivot_table * create_chisq_table (struct crosstabulation *xt) { struct pivot_table *chisq = pivot_table_create (N_("Chi-Square Tests")); pivot_table_set_weight_format (chisq, &xt->weight_format); chisq->omit_empty = true; pivot_dimension_create ( chisq, PIVOT_AXIS_ROW, N_("Statistics"), N_("Pearson Chi-Square"), N_("Likelihood Ratio"), N_("Fisher's Exact Test"), N_("Continuity Correction"), N_("Linear-by-Linear Association"), N_("N of Valid Cases"), PIVOT_RC_COUNT); pivot_dimension_create ( chisq, PIVOT_AXIS_COLUMN, N_("Statistics"), N_("Value"), PIVOT_RC_OTHER, N_("df"), PIVOT_RC_COUNT, N_("Asymptotic Sig. (2-tailed)"), PIVOT_RC_SIGNIFICANCE, N_("Exact Sig. (2-tailed)"), PIVOT_RC_SIGNIFICANCE, N_("Exact Sig. (1-tailed)"), PIVOT_RC_SIGNIFICANCE); for (size_t i = 2; i < xt->n_vars; i++) add_var_dimension (chisq, &xt->vars[i], PIVOT_AXIS_ROW, false); return chisq; } /* Symmetric measures. */ static struct pivot_table * create_sym_table (struct crosstabulation *xt) { struct pivot_table *sym = pivot_table_create (N_("Symmetric Measures")); pivot_table_set_weight_format (sym, &xt->weight_format); sym->omit_empty = true; pivot_dimension_create ( sym, PIVOT_AXIS_COLUMN, N_("Values"), N_("Value"), PIVOT_RC_OTHER, N_("Asymp. Std. Error"), PIVOT_RC_OTHER, N_("Approx. T"), PIVOT_RC_OTHER, N_("Approx. Sig."), PIVOT_RC_SIGNIFICANCE); struct pivot_dimension *statistics = pivot_dimension_create ( sym, PIVOT_AXIS_ROW, N_("Statistics")); pivot_category_create_group ( statistics->root, N_("Nominal by Nominal"), N_("Phi"), N_("Cramer's V"), N_("Contingency Coefficient")); pivot_category_create_group ( statistics->root, N_("Ordinal by Ordinal"), N_("Kendall's tau-b"), N_("Kendall's tau-c"), N_("Gamma"), N_("Spearman Correlation")); pivot_category_create_group ( statistics->root, N_("Interval by Interval"), N_("Pearson's R")); pivot_category_create_group ( statistics->root, N_("Measure of Agreement"), N_("Kappa")); pivot_category_create_leaves (statistics->root, N_("N of Valid Cases"), PIVOT_RC_COUNT); for (size_t i = 2; i < xt->n_vars; i++) add_var_dimension (sym, &xt->vars[i], PIVOT_AXIS_ROW, false); return sym; } /* Risk estimate. */ static struct pivot_table * create_risk_table (struct crosstabulation *xt, struct pivot_dimension **risk_statistics) { struct pivot_table *risk = pivot_table_create (N_("Risk Estimate")); pivot_table_set_weight_format (risk, &xt->weight_format); risk->omit_empty = true; struct pivot_dimension *values = pivot_dimension_create ( risk, PIVOT_AXIS_COLUMN, N_("Values"), N_("Value"), PIVOT_RC_OTHER); pivot_category_create_group ( /* xgettext:no-c-format */ values->root, N_("95% Confidence Interval"), N_("Lower"), PIVOT_RC_OTHER, N_("Upper"), PIVOT_RC_OTHER); *risk_statistics = pivot_dimension_create ( risk, PIVOT_AXIS_ROW, N_("Statistics")); for (size_t i = 2; i < xt->n_vars; i++) add_var_dimension (risk, &xt->vars[i], PIVOT_AXIS_ROW, false); return risk; } static void create_direct_stat (struct pivot_category *parent, const struct crosstabulation *xt, const char *name, bool symmetric) { struct pivot_category *group = pivot_category_create_group ( parent, name); if (symmetric) pivot_category_create_leaf (group, pivot_value_new_text (N_("Symmetric"))); char *row_label = xasprintf (_("%s Dependent"), var_to_string (xt->vars[ROW_VAR].var)); pivot_category_create_leaf (group, pivot_value_new_user_text_nocopy ( row_label)); char *col_label = xasprintf (_("%s Dependent"), var_to_string (xt->vars[COL_VAR].var)); pivot_category_create_leaf (group, pivot_value_new_user_text_nocopy ( col_label)); } /* Directional measures. */ static struct pivot_table * create_direct_table (struct crosstabulation *xt) { struct pivot_table *direct = pivot_table_create (N_("Directional Measures")); pivot_table_set_weight_format (direct, &xt->weight_format); direct->omit_empty = true; pivot_dimension_create ( direct, PIVOT_AXIS_COLUMN, N_("Values"), N_("Value"), PIVOT_RC_OTHER, N_("Asymp. Std. Error"), PIVOT_RC_OTHER, N_("Approx. T"), PIVOT_RC_OTHER, N_("Approx. Sig."), PIVOT_RC_SIGNIFICANCE); struct pivot_dimension *statistics = pivot_dimension_create ( direct, PIVOT_AXIS_ROW, N_("Statistics")); struct pivot_category *nn = pivot_category_create_group ( statistics->root, N_("Nominal by Nominal")); create_direct_stat (nn, xt, N_("Lambda"), true); create_direct_stat (nn, xt, N_("Goodman and Kruskal tau"), false); create_direct_stat (nn, xt, N_("Uncertainty Coefficient"), true); struct pivot_category *oo = pivot_category_create_group ( statistics->root, N_("Ordinal by Ordinal")); create_direct_stat (oo, xt, N_("Somers' d"), true); struct pivot_category *ni = pivot_category_create_group ( statistics->root, N_("Nominal by Interval")); create_direct_stat (ni, xt, N_("Eta"), false); for (size_t i = 2; i < xt->n_vars; i++) add_var_dimension (direct, &xt->vars[i], PIVOT_AXIS_ROW, false); return direct; } /* Delete missing rows and columns for statistical analysis when /MISSING=REPORT. */ static void delete_missing (struct crosstabulation *xt) { size_t n_rows = xt->vars[ROW_VAR].n_values; size_t n_cols = xt->vars[COL_VAR].n_values; int r, c; for (r = 0; r < n_rows; r++) if (var_is_num_missing (xt->vars[ROW_VAR].var, xt->vars[ROW_VAR].values[r].f, MV_USER)) { for (c = 0; c < n_cols; c++) xt->mat[c + r * n_cols] = 0.; xt->ns_rows--; } for (c = 0; c < n_cols; c++) if (var_is_num_missing (xt->vars[COL_VAR].var, xt->vars[COL_VAR].values[c].f, MV_USER)) { for (r = 0; r < n_rows; r++) xt->mat[c + r * n_cols] = 0.; xt->ns_cols--; } } static bool find_crosstab (struct crosstabulation *xt, size_t *row0p, size_t *row1p) { size_t row0 = *row1p; size_t row1; if (row0 >= xt->n_entries) return false; for (row1 = row0 + 1; row1 < xt->n_entries; row1++) { struct freq *a = xt->entries[row0]; struct freq *b = xt->entries[row1]; if (compare_table_entry_vars_3way (a, b, xt, 2, xt->n_vars) != 0) break; } *row0p = row0; *row1p = row1; return true; } /* Compares `union value's A_ and B_ and returns a strcmp()-like result. WIDTH_ points to an int which is either 0 for a numeric value or a string width for a string value. */ static int compare_value_3way (const void *a_, const void *b_, const void *width_) { const union value *a = a_; const union value *b = b_; const int *width = width_; return value_compare_3way (a, b, *width); } /* Inverted version of the above */ static int compare_value_3way_inv (const void *a_, const void *b_, const void *width_) { return -compare_value_3way (a_, b_, width_); } /* Given an array of ENTRY_CNT table_entry structures starting at ENTRIES, creates a sorted list of the values that the variable with index VAR_IDX takes on. Stores the array of the values in XT->values and the number of values in XT->n_values. */ static void enum_var_values (const struct crosstabulation *xt, int var_idx, bool descending) { struct xtab_var *xv = &xt->vars[var_idx]; const struct var_range *range = get_var_range (xt->proc, xv->var); if (range) { xv->values = xnmalloc (range->count, sizeof *xv->values); xv->n_values = range->count; for (size_t i = 0; i < range->count; i++) xv->values[i].f = range->min + i; } else { int width = var_get_width (xv->var); struct hmapx_node *node; const union value *iter; struct hmapx set; hmapx_init (&set); for (size_t i = 0; i < xt->n_entries; i++) { const struct freq *te = xt->entries[i]; const union value *value = &te->values[var_idx]; size_t hash = value_hash (value, width, 0); HMAPX_FOR_EACH_WITH_HASH (iter, node, hash, &set) if (value_equal (iter, value, width)) goto next_entry; hmapx_insert (&set, (union value *) value, hash); next_entry: ; } xv->n_values = hmapx_count (&set); xv->values = xnmalloc (xv->n_values, sizeof *xv->values); size_t i = 0; HMAPX_FOR_EACH (iter, node, &set) xv->values[i++] = *iter; hmapx_destroy (&set); sort (xv->values, xv->n_values, sizeof *xv->values, descending ? compare_value_3way_inv : compare_value_3way, &width); } } static void free_var_values (const struct crosstabulation *xt, int var_idx) { struct xtab_var *xv = &xt->vars[var_idx]; free (xv->values); xv->values = NULL; xv->n_values = 0; } /* Displays the crosstabulation table. */ static void display_crosstabulation (struct crosstabs_proc *proc, struct crosstabulation *xt, struct pivot_table *table, size_t crs_leaves[CRS_CL_count]) { size_t n_rows = xt->vars[ROW_VAR].n_values; size_t n_cols = xt->vars[COL_VAR].n_values; size_t *indexes = xnmalloc (table->n_dimensions, sizeof *indexes); assert (xt->n_vars == 2); for (size_t i = 0; i < xt->n_consts; i++) indexes[i + 3] = xt->const_indexes[i]; /* Put in the actual cells. */ double *mp = xt->mat; for (size_t r = 0; r < n_rows; r++) { if (!xt->row_tot[r] && proc->mode != INTEGER) continue; indexes[ROW_VAR + 1] = r; for (size_t c = 0; c < n_cols; c++) { if (!xt->col_tot[c] && proc->mode != INTEGER) continue; indexes[COL_VAR + 1] = c; double expected_value = xt->row_tot[r] * xt->col_tot[c] / xt->total; double residual = *mp - expected_value; double sresidual = residual / sqrt (expected_value); double asresidual = (sresidual * (1. - xt->row_tot[r] / xt->total) * (1. - xt->col_tot[c] / xt->total)); double entries[] = { [CRS_CL_COUNT] = *mp, [CRS_CL_ROW] = *mp / xt->row_tot[r] * 100., [CRS_CL_COLUMN] = *mp / xt->col_tot[c] * 100., [CRS_CL_TOTAL] = *mp / xt->total * 100., [CRS_CL_EXPECTED] = expected_value, [CRS_CL_RESIDUAL] = residual, [CRS_CL_SRESIDUAL] = sresidual, [CRS_CL_ASRESIDUAL] = asresidual, }; for (size_t i = 0; i < proc->n_cells; i++) { int cell = proc->a_cells[i]; indexes[0] = crs_leaves[cell]; pivot_table_put (table, indexes, table->n_dimensions, pivot_value_new_number (entries[cell])); } mp++; } } /* Row totals. */ for (size_t r = 0; r < n_rows; r++) { if (!xt->row_tot[r] && proc->mode != INTEGER) continue; double expected_value = xt->row_tot[r] / xt->total; double entries[] = { [CRS_CL_COUNT] = xt->row_tot[r], [CRS_CL_ROW] = 100.0, [CRS_CL_COLUMN] = expected_value * 100., [CRS_CL_TOTAL] = expected_value * 100., [CRS_CL_EXPECTED] = expected_value, [CRS_CL_RESIDUAL] = SYSMIS, [CRS_CL_SRESIDUAL] = SYSMIS, [CRS_CL_ASRESIDUAL] = SYSMIS, }; for (size_t i = 0; i < proc->n_cells; i++) { int cell = proc->a_cells[i]; double entry = entries[cell]; if (entry != SYSMIS) { indexes[ROW_VAR + 1] = r; indexes[COL_VAR + 1] = n_cols; indexes[0] = crs_leaves[cell]; pivot_table_put (table, indexes, table->n_dimensions, pivot_value_new_number (entry)); } } } for (size_t c = 0; c <= n_cols; c++) { if (c < n_cols && !xt->col_tot[c] && proc->mode != INTEGER) continue; double ct = c < n_cols ? xt->col_tot[c] : xt->total; double expected_value = ct / xt->total; double entries[] = { [CRS_CL_COUNT] = ct, [CRS_CL_ROW] = expected_value * 100.0, [CRS_CL_COLUMN] = 100.0, [CRS_CL_TOTAL] = expected_value * 100., [CRS_CL_EXPECTED] = expected_value, [CRS_CL_RESIDUAL] = SYSMIS, [CRS_CL_SRESIDUAL] = SYSMIS, [CRS_CL_ASRESIDUAL] = SYSMIS, }; for (size_t i = 0; i < proc->n_cells; i++) { int cell = proc->a_cells[i]; double entry = entries[cell]; if (entry != SYSMIS) { indexes[ROW_VAR + 1] = n_rows; indexes[COL_VAR + 1] = c; indexes[0] = crs_leaves[cell]; pivot_table_put (table, indexes, table->n_dimensions, pivot_value_new_number (entry)); } } } free (indexes); } static void calc_r (struct crosstabulation *, double *XT, double *Y, double *, double *, double *); static void calc_chisq (struct crosstabulation *, double[N_CHISQ], int[N_CHISQ], double *, double *); /* Display chi-square statistics. */ static void display_chisq (struct crosstabulation *xt, struct pivot_table *chisq) { double chisq_v[N_CHISQ]; double fisher1, fisher2; int df[N_CHISQ]; calc_chisq (xt, chisq_v, df, &fisher1, &fisher2); size_t *indexes = xnmalloc (chisq->n_dimensions, sizeof *indexes); assert (xt->n_vars == 2); for (size_t i = 0; i < xt->n_consts; i++) indexes[i + 2] = xt->const_indexes[i]; for (int i = 0; i < N_CHISQ; i++) { indexes[0] = i; double entries[5] = { SYSMIS, SYSMIS, SYSMIS, SYSMIS, SYSMIS }; if (i == 2) { entries[3] = fisher2; entries[4] = fisher1; } else if (chisq_v[i] != SYSMIS) { entries[0] = chisq_v[i]; entries[1] = df[i]; entries[2] = gsl_cdf_chisq_Q (chisq_v[i], df[i]); } for (size_t j = 0; j < sizeof entries / sizeof *entries; j++) if (entries[j] != SYSMIS) { indexes[1] = j; pivot_table_put (chisq, indexes, chisq->n_dimensions, pivot_value_new_number (entries[j])); } } indexes[0] = 5; indexes[1] = 0; pivot_table_put (chisq, indexes, chisq->n_dimensions, pivot_value_new_number (xt->total)); free (indexes); } static int calc_symmetric (struct crosstabs_proc *, struct crosstabulation *, double[N_SYMMETRIC], double[N_SYMMETRIC], double[N_SYMMETRIC], double[3], double[3], double[3]); /* Display symmetric measures. */ static void display_symmetric (struct crosstabs_proc *proc, struct crosstabulation *xt, struct pivot_table *sym) { double sym_v[N_SYMMETRIC], sym_ase[N_SYMMETRIC], sym_t[N_SYMMETRIC]; double somers_d_v[3], somers_d_ase[3], somers_d_t[3]; if (!calc_symmetric (proc, xt, sym_v, sym_ase, sym_t, somers_d_v, somers_d_ase, somers_d_t)) return; size_t *indexes = xnmalloc (sym->n_dimensions, sizeof *indexes); assert (xt->n_vars == 2); for (size_t i = 0; i < xt->n_consts; i++) indexes[i + 2] = xt->const_indexes[i]; for (int i = 0; i < N_SYMMETRIC; i++) { if (sym_v[i] == SYSMIS) continue; indexes[1] = i; double entries[] = { sym_v[i], sym_ase[i], sym_t[i] }; for (size_t j = 0; j < sizeof entries / sizeof *entries; j++) if (entries[j] != SYSMIS) { indexes[0] = j; pivot_table_put (sym, indexes, sym->n_dimensions, pivot_value_new_number (entries[j])); } } indexes[1] = N_SYMMETRIC; indexes[0] = 0; struct pivot_value *total = pivot_value_new_number (xt->total); pivot_value_set_rc (sym, total, PIVOT_RC_COUNT); pivot_table_put (sym, indexes, sym->n_dimensions, total); free (indexes); } static bool calc_risk (struct crosstabulation *, double[], double[], double[], union value *, double *); /* Display risk estimate. */ static void display_risk (struct crosstabulation *xt, struct pivot_table *risk, struct pivot_dimension *risk_statistics) { double risk_v[3], lower[3], upper[3], n_valid; union value c[2]; if (!calc_risk (xt, risk_v, upper, lower, c, &n_valid)) return; size_t *indexes = xnmalloc (risk->n_dimensions, sizeof *indexes); assert (xt->n_vars == 2); for (size_t i = 0; i < xt->n_consts; i++) indexes[i + 2] = xt->const_indexes[i]; for (int i = 0; i < 3; i++) { const struct variable *cv = xt->vars[COL_VAR].var; const struct variable *rv = xt->vars[ROW_VAR].var; if (risk_v[i] == SYSMIS) continue; struct string label = DS_EMPTY_INITIALIZER; switch (i) { case 0: ds_put_format (&label, _("Odds Ratio for %s"), var_to_string (rv)); ds_put_cstr (&label, " ("); var_append_value_name (rv, &c[0], &label); ds_put_cstr (&label, " / "); var_append_value_name (rv, &c[1], &label); ds_put_cstr (&label, ")"); break; case 1: case 2: ds_put_format (&label, _("For cohort %s = "), var_to_string (cv)); var_append_value_name (cv, &xt->vars[ROW_VAR].values[i - 1], &label); break; } indexes[1] = pivot_category_create_leaf ( risk_statistics->root, pivot_value_new_user_text_nocopy (ds_steal_cstr (&label))); double entries[] = { risk_v[i], lower[i], upper[i] }; for (size_t j = 0; j < sizeof entries / sizeof *entries; j++) { indexes[0] = j; pivot_table_put (risk, indexes, risk->n_dimensions, pivot_value_new_number (entries[i])); } } indexes[1] = pivot_category_create_leaf ( risk_statistics->root, pivot_value_new_text (N_("N of Valid Cases"))); indexes[0] = 0; pivot_table_put (risk, indexes, risk->n_dimensions, pivot_value_new_number (n_valid)); free (indexes); } static int calc_directional (struct crosstabs_proc *, struct crosstabulation *, double[N_DIRECTIONAL], double[N_DIRECTIONAL], double[N_DIRECTIONAL], double[N_DIRECTIONAL]); /* Display directional measures. */ static void display_directional (struct crosstabs_proc *proc, struct crosstabulation *xt, struct pivot_table *direct) { double direct_v[N_DIRECTIONAL]; double direct_ase[N_DIRECTIONAL]; double direct_t[N_DIRECTIONAL]; double sig[N_DIRECTIONAL]; if (!calc_directional (proc, xt, direct_v, direct_ase, direct_t, sig)) return; size_t *indexes = xnmalloc (direct->n_dimensions, sizeof *indexes); assert (xt->n_vars == 2); for (size_t i = 0; i < xt->n_consts; i++) indexes[i + 2] = xt->const_indexes[i]; for (int i = 0; i < N_DIRECTIONAL; i++) { if (direct_v[i] == SYSMIS) continue; indexes[1] = i; double entries[] = { direct_v[i], direct_ase[i], direct_t[i], sig[i], }; for (size_t j = 0; j < sizeof entries / sizeof *entries; j++) if (entries[j] != SYSMIS) { indexes[0] = j; pivot_table_put (direct, indexes, direct->n_dimensions, pivot_value_new_number (entries[j])); } } free (indexes); } /* Statistical calculations. */ /* Returns the value of the logarithm of gamma (factorial) function for an integer argument XT. */ static double log_gamma_int (double xt) { double r = 0; int i; for (i = 2; i < xt; i++) r += log(i); return r; } /* Calculate P_r as specified in _SPSS Statistical Algorithms_, Appendix 5. */ static inline double Pr (int a, int b, int c, int d) { return exp (log_gamma_int (a + b + 1.) - log_gamma_int (a + 1.) + log_gamma_int (c + d + 1.) - log_gamma_int (b + 1.) + log_gamma_int (a + c + 1.) - log_gamma_int (c + 1.) + log_gamma_int (b + d + 1.) - log_gamma_int (d + 1.) - log_gamma_int (a + b + c + d + 1.)); } /* Swap the contents of A and B. */ static inline void swap (int *a, int *b) { int t = *a; *a = *b; *b = t; } /* Calculate significance for Fisher's exact test as specified in _SPSS Statistical Algorithms_, Appendix 5. */ static void calc_fisher (int a, int b, int c, int d, double *fisher1, double *fisher2) { int xt; double pn1; if (MIN (c, d) < MIN (a, b)) swap (&a, &c), swap (&b, &d); if (MIN (b, d) < MIN (a, c)) swap (&a, &b), swap (&c, &d); if (b * c < a * d) { if (b < c) swap (&a, &b), swap (&c, &d); else swap (&a, &c), swap (&b, &d); } pn1 = Pr (a, b, c, d); *fisher1 = pn1; for (xt = 1; xt <= a; xt++) { *fisher1 += Pr (a - xt, b + xt, c + xt, d - xt); } *fisher2 = *fisher1; for (xt = 1; xt <= b; xt++) { double p = Pr (a + xt, b - xt, c - xt, d + xt); if (p < pn1) *fisher2 += p; } } /* Calculates chi-squares into CHISQ. MAT is a matrix with N_COLS columns with values COLS and N_ROWS rows with values ROWS. Values in the matrix sum to xt->total. */ static void calc_chisq (struct crosstabulation *xt, double chisq[N_CHISQ], int df[N_CHISQ], double *fisher1, double *fisher2) { chisq[0] = chisq[1] = 0.; chisq[2] = chisq[3] = chisq[4] = SYSMIS; *fisher1 = *fisher2 = SYSMIS; df[0] = df[1] = (xt->ns_cols - 1) * (xt->ns_rows - 1); if (xt->ns_rows <= 1 || xt->ns_cols <= 1) { chisq[0] = chisq[1] = SYSMIS; return; } size_t n_cols = xt->vars[COL_VAR].n_values; FOR_EACH_POPULATED_ROW (r, xt) FOR_EACH_POPULATED_COLUMN (c, xt) { const double expected = xt->row_tot[r] * xt->col_tot[c] / xt->total; const double freq = xt->mat[n_cols * r + c]; const double residual = freq - expected; chisq[0] += residual * residual / expected; if (freq) chisq[1] += freq * log (expected / freq); } if (chisq[0] == 0.) chisq[0] = SYSMIS; if (chisq[1] != 0.) chisq[1] *= -2.; else chisq[1] = SYSMIS; /* Calculate Yates and Fisher exact test. */ if (xt->ns_cols == 2 && xt->ns_rows == 2) { double f11, f12, f21, f22; { int nz_cols[2]; int j = 0; FOR_EACH_POPULATED_COLUMN (c, xt) { nz_cols[j++] = c; if (j == 2) break; } assert (j == 2); f11 = xt->mat[nz_cols[0]]; f12 = xt->mat[nz_cols[1]]; f21 = xt->mat[nz_cols[0] + n_cols]; f22 = xt->mat[nz_cols[1] + n_cols]; } /* Yates. */ { const double xt_ = fabs (f11 * f22 - f12 * f21) - 0.5 * xt->total; if (xt_ > 0.) chisq[3] = (xt->total * pow2 (xt_) / (f11 + f12) / (f21 + f22) / (f11 + f21) / (f12 + f22)); else chisq[3] = 0.; df[3] = 1.; } /* Fisher. */ calc_fisher (f11 + .5, f12 + .5, f21 + .5, f22 + .5, fisher1, fisher2); } /* Calculate Mantel-Haenszel. */ if (var_is_numeric (xt->vars[ROW_VAR].var) && var_is_numeric (xt->vars[COL_VAR].var)) { double r, ase_0, ase_1; calc_r (xt, (double *) xt->vars[ROW_VAR].values, (double *) xt->vars[COL_VAR].values, &r, &ase_0, &ase_1); chisq[4] = (xt->total - 1.) * r * r; df[4] = 1; } } /* Calculate the value of Pearson's r. r is stored into R, its T value into T, and standard error into ERROR. The row and column values must be passed in XT and Y. */ static void calc_r (struct crosstabulation *xt, double *XT, double *Y, double *r, double *t, double *error) { size_t n_rows = xt->vars[ROW_VAR].n_values; size_t n_cols = xt->vars[COL_VAR].n_values; double SX, SY, S, T; double Xbar, Ybar; double sum_XYf, sum_X2Y2f; double sum_Xr, sum_X2r; double sum_Yc, sum_Y2c; int i, j; for (sum_X2Y2f = sum_XYf = 0., i = 0; i < n_rows; i++) for (j = 0; j < n_cols; j++) { double fij = xt->mat[j + i * n_cols]; double product = XT[i] * Y[j]; double temp = fij * product; sum_XYf += temp; sum_X2Y2f += temp * product; } for (sum_Xr = sum_X2r = 0., i = 0; i < n_rows; i++) { sum_Xr += XT[i] * xt->row_tot[i]; sum_X2r += pow2 (XT[i]) * xt->row_tot[i]; } Xbar = sum_Xr / xt->total; for (sum_Yc = sum_Y2c = 0., i = 0; i < n_cols; i++) { sum_Yc += Y[i] * xt->col_tot[i]; sum_Y2c += Y[i] * Y[i] * xt->col_tot[i]; } Ybar = sum_Yc / xt->total; S = sum_XYf - sum_Xr * sum_Yc / xt->total; SX = sum_X2r - pow2 (sum_Xr) / xt->total; SY = sum_Y2c - pow2 (sum_Yc) / xt->total; T = sqrt (SX * SY); *r = S / T; *t = *r / sqrt (1 - pow2 (*r)) * sqrt (xt->total - 2); { double s, c, y, t; for (s = c = 0., i = 0; i < n_rows; i++) for (j = 0; j < n_cols; j++) { double Xresid, Yresid; double temp; Xresid = XT[i] - Xbar; Yresid = Y[j] - Ybar; temp = (T * Xresid * Yresid - ((S / (2. * T)) * (Xresid * Xresid * SY + Yresid * Yresid * SX))); y = xt->mat[j + i * n_cols] * temp * temp - c; t = s + y; c = (t - s) - y; s = t; } *error = sqrt (s) / (T * T); } } /* Calculate symmetric statistics and their asymptotic standard errors. Returns 0 if none could be calculated. */ static int calc_symmetric (struct crosstabs_proc *proc, struct crosstabulation *xt, double v[N_SYMMETRIC], double ase[N_SYMMETRIC], double t[N_SYMMETRIC], double somers_d_v[3], double somers_d_ase[3], double somers_d_t[3]) { size_t n_rows = xt->vars[ROW_VAR].n_values; size_t n_cols = xt->vars[COL_VAR].n_values; int q, i; q = MIN (xt->ns_rows, xt->ns_cols); if (q <= 1) return 0; for (i = 0; i < N_SYMMETRIC; i++) v[i] = ase[i] = t[i] = SYSMIS; /* Phi, Cramer's V, contingency coefficient. */ if (proc->statistics & ((1u << CRS_ST_PHI) | (1u << CRS_ST_CC))) { double Xp = 0.; /* Pearson chi-square. */ FOR_EACH_POPULATED_ROW (r, xt) FOR_EACH_POPULATED_COLUMN (c, xt) { double expected = xt->row_tot[r] * xt->col_tot[c] / xt->total; double freq = xt->mat[n_cols * r + c]; double residual = freq - expected; Xp += residual * residual / expected; } if (proc->statistics & (1u << CRS_ST_PHI)) { v[0] = sqrt (Xp / xt->total); v[1] = sqrt (Xp / (xt->total * (q - 1))); } if (proc->statistics & (1u << CRS_ST_CC)) v[2] = sqrt (Xp / (Xp + xt->total)); } if (proc->statistics & ((1u << CRS_ST_BTAU) | (1u << CRS_ST_CTAU) | (1u << CRS_ST_GAMMA) | (1u << CRS_ST_D))) { double *cum; double Dr, Dc; double P, Q; double btau_cum, ctau_cum, gamma_cum, d_yx_cum, d_xy_cum; double btau_var; int r, c; Dr = Dc = pow2 (xt->total); for (r = 0; r < n_rows; r++) Dr -= pow2 (xt->row_tot[r]); for (c = 0; c < n_cols; c++) Dc -= pow2 (xt->col_tot[c]); cum = xnmalloc (n_cols * n_rows, sizeof *cum); for (c = 0; c < n_cols; c++) { double ct = 0.; for (r = 0; r < n_rows; r++) cum[c + r * n_cols] = ct += xt->mat[c + r * n_cols]; } /* P and Q. */ { int i, j; double Cij, Dij; P = Q = 0.; for (i = 0; i < n_rows; i++) { Cij = Dij = 0.; for (j = 1; j < n_cols; j++) Cij += xt->col_tot[j] - cum[j + i * n_cols]; if (i > 0) for (j = 1; j < n_cols; j++) Dij += cum[j + (i - 1) * n_cols]; for (j = 0;;) { double fij = xt->mat[j + i * n_cols]; P += fij * Cij; Q += fij * Dij; if (++j == n_cols) break; assert (j < n_cols); Cij -= xt->col_tot[j] - cum[j + i * n_cols]; Dij += xt->col_tot[j - 1] - cum[j - 1 + i * n_cols]; if (i > 0) { Cij += cum[j - 1 + (i - 1) * n_cols]; Dij -= cum[j + (i - 1) * n_cols]; } } } } if (proc->statistics & (1u << CRS_ST_BTAU)) v[3] = (P - Q) / sqrt (Dr * Dc); if (proc->statistics & (1u << CRS_ST_CTAU)) v[4] = (q * (P - Q)) / (pow2 (xt->total) * (q - 1)); if (proc->statistics & (1u << CRS_ST_GAMMA)) v[5] = (P - Q) / (P + Q); /* ASE for tau-b, tau-c, gamma. Calculations could be eliminated here, at expense of memory. */ { int i, j; double Cij, Dij; btau_cum = ctau_cum = gamma_cum = d_yx_cum = d_xy_cum = 0.; for (i = 0; i < n_rows; i++) { Cij = Dij = 0.; for (j = 1; j < n_cols; j++) Cij += xt->col_tot[j] - cum[j + i * n_cols]; if (i > 0) for (j = 1; j < n_cols; j++) Dij += cum[j + (i - 1) * n_cols]; for (j = 0;;) { double fij = xt->mat[j + i * n_cols]; if (proc->statistics & (1u << CRS_ST_BTAU)) { const double temp = (2. * sqrt (Dr * Dc) * (Cij - Dij) + v[3] * (xt->row_tot[i] * Dc + xt->col_tot[j] * Dr)); btau_cum += fij * temp * temp; } { const double temp = Cij - Dij; ctau_cum += fij * temp * temp; } if (proc->statistics & (1u << CRS_ST_GAMMA)) { const double temp = Q * Cij - P * Dij; gamma_cum += fij * temp * temp; } if (proc->statistics & (1u << CRS_ST_D)) { d_yx_cum += fij * pow2 (Dr * (Cij - Dij) - (P - Q) * (xt->total - xt->row_tot[i])); d_xy_cum += fij * pow2 (Dc * (Dij - Cij) - (Q - P) * (xt->total - xt->col_tot[j])); } if (++j == n_cols) break; assert (j < n_cols); Cij -= xt->col_tot[j] - cum[j + i * n_cols]; Dij += xt->col_tot[j - 1] - cum[j - 1 + i * n_cols]; if (i > 0) { Cij += cum[j - 1 + (i - 1) * n_cols]; Dij -= cum[j + (i - 1) * n_cols]; } } } } btau_var = ((btau_cum - (xt->total * pow2 (xt->total * (P - Q) / sqrt (Dr * Dc) * (Dr + Dc)))) / pow2 (Dr * Dc)); if (proc->statistics & (1u << CRS_ST_BTAU)) { ase[3] = sqrt (btau_var); t[3] = v[3] / (2 * sqrt ((ctau_cum - (P - Q) * (P - Q) / xt->total) / (Dr * Dc))); } if (proc->statistics & (1u << CRS_ST_CTAU)) { ase[4] = ((2 * q / ((q - 1) * pow2 (xt->total))) * sqrt (ctau_cum - (P - Q) * (P - Q) / xt->total)); t[4] = v[4] / ase[4]; } if (proc->statistics & (1u << CRS_ST_GAMMA)) { ase[5] = ((4. / ((P + Q) * (P + Q))) * sqrt (gamma_cum)); t[5] = v[5] / (2. / (P + Q) * sqrt (ctau_cum - (P - Q) * (P - Q) / xt->total)); } if (proc->statistics & (1u << CRS_ST_D)) { somers_d_v[0] = (P - Q) / (.5 * (Dc + Dr)); somers_d_ase[0] = SYSMIS; somers_d_t[0] = (somers_d_v[0] / (4 / (Dc + Dr) * sqrt (ctau_cum - pow2 (P - Q) / xt->total))); somers_d_v[1] = (P - Q) / Dc; somers_d_ase[1] = 2. / pow2 (Dc) * sqrt (d_xy_cum); somers_d_t[1] = (somers_d_v[1] / (2. / Dc * sqrt (ctau_cum - pow2 (P - Q) / xt->total))); somers_d_v[2] = (P - Q) / Dr; somers_d_ase[2] = 2. / pow2 (Dr) * sqrt (d_yx_cum); somers_d_t[2] = (somers_d_v[2] / (2. / Dr * sqrt (ctau_cum - pow2 (P - Q) / xt->total))); } free (cum); } /* Spearman correlation, Pearson's r. */ if (proc->statistics & (1u << CRS_ST_CORR)) { double *R = xmalloc (sizeof *R * n_rows); double *C = xmalloc (sizeof *C * n_cols); { double y, t, c = 0., s = 0.; int i = 0; for (;;) { R[i] = s + (xt->row_tot[i] + 1.) / 2.; y = xt->row_tot[i] - c; t = s + y; c = (t - s) - y; s = t; if (++i == n_rows) break; assert (i < n_rows); } } { double y, t, c = 0., s = 0.; int j = 0; for (;;) { C[j] = s + (xt->col_tot[j] + 1.) / 2; y = xt->col_tot[j] - c; t = s + y; c = (t - s) - y; s = t; if (++j == n_cols) break; assert (j < n_cols); } } calc_r (xt, R, C, &v[6], &t[6], &ase[6]); free (R); free (C); calc_r (xt, (double *) xt->vars[ROW_VAR].values, (double *) xt->vars[COL_VAR].values, &v[7], &t[7], &ase[7]); } /* Cohen's kappa. */ if (proc->statistics & (1u << CRS_ST_KAPPA) && xt->ns_rows == xt->ns_cols) { double ase_under_h0; double sum_fii, sum_rici, sum_fiiri_ci, sum_fijri_ci2, sum_riciri_ci; int i, j; for (sum_fii = sum_rici = sum_fiiri_ci = sum_riciri_ci = 0., i = j = 0; i < xt->ns_rows; i++, j++) { double prod, sum; while (xt->col_tot[j] == 0.) j++; prod = xt->row_tot[i] * xt->col_tot[j]; sum = xt->row_tot[i] + xt->col_tot[j]; sum_fii += xt->mat[j + i * n_cols]; sum_rici += prod; sum_fiiri_ci += xt->mat[j + i * n_cols] * sum; sum_riciri_ci += prod * sum; } for (sum_fijri_ci2 = 0., i = 0; i < xt->ns_rows; i++) for (j = 0; j < xt->ns_cols; j++) { double sum = xt->row_tot[i] + xt->col_tot[j]; sum_fijri_ci2 += xt->mat[j + i * n_cols] * sum * sum; } v[8] = (xt->total * sum_fii - sum_rici) / (pow2 (xt->total) - sum_rici); ase_under_h0 = sqrt ((pow2 (xt->total) * sum_rici + sum_rici * sum_rici - xt->total * sum_riciri_ci) / (xt->total * (pow2 (xt->total) - sum_rici) * (pow2 (xt->total) - sum_rici))); ase[8] = sqrt (xt->total * (((sum_fii * (xt->total - sum_fii)) / pow2 (pow2 (xt->total) - sum_rici)) + ((2. * (xt->total - sum_fii) * (2. * sum_fii * sum_rici - xt->total * sum_fiiri_ci)) / pow3 (pow2 (xt->total) - sum_rici)) + (pow2 (xt->total - sum_fii) * (xt->total * sum_fijri_ci2 - 4. * sum_rici * sum_rici) / pow4 (pow2 (xt->total) - sum_rici)))); t[8] = v[8] / ase_under_h0; } return 1; } /* Calculate risk estimate. */ static bool calc_risk (struct crosstabulation *xt, double *value, double *upper, double *lower, union value *c, double *n_valid) { size_t n_cols = xt->vars[COL_VAR].n_values; double f11, f12, f21, f22; double v; for (int i = 0; i < 3; i++) value[i] = upper[i] = lower[i] = SYSMIS; if (xt->ns_rows != 2 || xt->ns_cols != 2) return false; { /* Find populated columns. */ int nz_cols[2]; int n = 0; FOR_EACH_POPULATED_COLUMN (c, xt) nz_cols[n++] = c; assert (n == 2); /* Find populated rows. */ int nz_rows[2]; n = 0; FOR_EACH_POPULATED_ROW (r, xt) nz_rows[n++] = r; assert (n == 2); f11 = xt->mat[nz_cols[0] + n_cols * nz_rows[0]]; f12 = xt->mat[nz_cols[1] + n_cols * nz_rows[0]]; f21 = xt->mat[nz_cols[0] + n_cols * nz_rows[1]]; f22 = xt->mat[nz_cols[1] + n_cols * nz_rows[1]]; *n_valid = f11 + f12 + f21 + f22; c[0] = xt->vars[COL_VAR].values[nz_cols[0]]; c[1] = xt->vars[COL_VAR].values[nz_cols[1]]; } value[0] = (f11 * f22) / (f12 * f21); v = sqrt (1. / f11 + 1. / f12 + 1. / f21 + 1. / f22); lower[0] = value[0] * exp (-1.960 * v); upper[0] = value[0] * exp (1.960 * v); value[1] = (f11 * (f21 + f22)) / (f21 * (f11 + f12)); v = sqrt ((f12 / (f11 * (f11 + f12))) + (f22 / (f21 * (f21 + f22)))); lower[1] = value[1] * exp (-1.960 * v); upper[1] = value[1] * exp (1.960 * v); value[2] = (f12 * (f21 + f22)) / (f22 * (f11 + f12)); v = sqrt ((f11 / (f12 * (f11 + f12))) + (f21 / (f22 * (f21 + f22)))); lower[2] = value[2] * exp (-1.960 * v); upper[2] = value[2] * exp (1.960 * v); return true; } /* Calculate directional measures. */ static int calc_directional (struct crosstabs_proc *proc, struct crosstabulation *xt, double v[N_DIRECTIONAL], double ase[N_DIRECTIONAL], double t[N_DIRECTIONAL], double sig[N_DIRECTIONAL]) { size_t n_rows = xt->vars[ROW_VAR].n_values; size_t n_cols = xt->vars[COL_VAR].n_values; for (int i = 0; i < N_DIRECTIONAL; i++) v[i] = ase[i] = t[i] = sig[i] = SYSMIS; /* Lambda. */ if (proc->statistics & (1u << CRS_ST_LAMBDA)) { /* Find maximum for each row and their sum. */ double *fim = xnmalloc (n_rows, sizeof *fim); int *fim_index = xnmalloc (n_rows, sizeof *fim_index); double sum_fim = 0.0; for (int i = 0; i < n_rows; i++) { double max = xt->mat[i * n_cols]; int index = 0; for (int j = 1; j < n_cols; j++) if (xt->mat[j + i * n_cols] > max) { max = xt->mat[j + i * n_cols]; index = j; } fim[i] = max; sum_fim += max; fim_index[i] = index; } /* Find maximum for each column. */ double *fmj = xnmalloc (n_cols, sizeof *fmj); int *fmj_index = xnmalloc (n_cols, sizeof *fmj_index); double sum_fmj = 0.0; for (int j = 0; j < n_cols; j++) { double max = xt->mat[j]; int index = 0; for (int i = 1; i < n_rows; i++) if (xt->mat[j + i * n_cols] > max) { max = xt->mat[j + i * n_cols]; index = i; } fmj[j] = max; sum_fmj += max; fmj_index[j] = index; } /* Find maximum row total. */ double rm = xt->row_tot[0]; int rm_index = 0; for (int i = 1; i < n_rows; i++) if (xt->row_tot[i] > rm) { rm = xt->row_tot[i]; rm_index = i; } /* Find maximum column total. */ double cm = xt->col_tot[0]; int cm_index = 0; for (int j = 1; j < n_cols; j++) if (xt->col_tot[j] > cm) { cm = xt->col_tot[j]; cm_index = j; } v[0] = (sum_fim + sum_fmj - cm - rm) / (2. * xt->total - rm - cm); v[1] = (sum_fmj - rm) / (xt->total - rm); v[2] = (sum_fim - cm) / (xt->total - cm); /* ASE1 for Y given XT. */ { double accum = 0.0; for (int i = 0; i < n_rows; i++) if (cm_index == fim_index[i]) accum += fim[i]; ase[2] = sqrt ((xt->total - sum_fim) * (sum_fim + cm - 2. * accum) / pow3 (xt->total - cm)); } /* ASE0 for Y given XT. */ { double accum = 0.0; for (int i = 0; i < n_rows; i++) if (cm_index != fim_index[i]) accum += (xt->mat[i * n_cols + fim_index[i]] + xt->mat[i * n_cols + cm_index]); t[2] = v[2] / (sqrt (accum - pow2 (sum_fim - cm) / xt->total) / (xt->total - cm)); } /* ASE1 for XT given Y. */ { double accum = 0.0; for (int j = 0; j < n_cols; j++) if (rm_index == fmj_index[j]) accum += fmj[j]; ase[1] = sqrt ((xt->total - sum_fmj) * (sum_fmj + rm - 2. * accum) / pow3 (xt->total - rm)); } /* ASE0 for XT given Y. */ { double accum = 0.0; for (int j = 0; j < n_cols; j++) if (rm_index != fmj_index[j]) accum += (xt->mat[j + n_cols * fmj_index[j]] + xt->mat[j + n_cols * rm_index]); t[1] = v[1] / (sqrt (accum - pow2 (sum_fmj - rm) / xt->total) / (xt->total - rm)); } /* Symmetric ASE0 and ASE1. */ { double accum0 = 0.0; double accum1 = 0.0; for (int i = 0; i < n_rows; i++) for (int j = 0; j < n_cols; j++) { int temp0 = (fmj_index[j] == i) + (fim_index[i] == j); int temp1 = (i == rm_index) + (j == cm_index); accum0 += xt->mat[j + i * n_cols] * pow2 (temp0 - temp1); accum1 += (xt->mat[j + i * n_cols] * pow2 (temp0 + (v[0] - 1.) * temp1)); } ase[0] = sqrt (accum1 - 4. * xt->total * v[0] * v[0]) / (2. * xt->total - rm - cm); t[0] = v[0] / (sqrt (accum0 - pow2 (sum_fim + sum_fmj - cm - rm) / xt->total) / (2. * xt->total - rm - cm)); } for (int i = 0; i < 3; i++) sig[i] = 2 * gsl_cdf_ugaussian_Q (t[i]); free (fim); free (fim_index); free (fmj); free (fmj_index); /* Tau. */ { double sum_fij2_ri = 0.0; double sum_fij2_ci = 0.0; FOR_EACH_POPULATED_ROW (i, xt) FOR_EACH_POPULATED_COLUMN (j, xt) { double temp = pow2 (xt->mat[j + i * n_cols]); sum_fij2_ri += temp / xt->row_tot[i]; sum_fij2_ci += temp / xt->col_tot[j]; } double sum_ri2 = 0.0; for (int i = 0; i < n_rows; i++) sum_ri2 += pow2 (xt->row_tot[i]); double sum_cj2 = 0.0; for (int j = 0; j < n_cols; j++) sum_cj2 += pow2 (xt->col_tot[j]); v[3] = (xt->total * sum_fij2_ci - sum_ri2) / (pow2 (xt->total) - sum_ri2); v[4] = (xt->total * sum_fij2_ri - sum_cj2) / (pow2 (xt->total) - sum_cj2); } } if (proc->statistics & (1u << CRS_ST_UC)) { double UX = 0.0; FOR_EACH_POPULATED_ROW (i, xt) UX -= xt->row_tot[i] / xt->total * log (xt->row_tot[i] / xt->total); double UY = 0.0; FOR_EACH_POPULATED_COLUMN (j, xt) UY -= xt->col_tot[j] / xt->total * log (xt->col_tot[j] / xt->total); double UXY = 0.0; double P = 0.0; for (int i = 0; i < n_rows; i++) for (int j = 0; j < n_cols; j++) { double entry = xt->mat[j + i * n_cols]; if (entry <= 0.) continue; P += entry * pow2 (log (xt->col_tot[j] * xt->row_tot[i] / (xt->total * entry))); UXY -= entry / xt->total * log (entry / xt->total); } double ase1_yx = 0.0; double ase1_xy = 0.0; double ase1_sym = 0.0; for (int i = 0; i < n_rows; i++) for (int j = 0; j < n_cols; j++) { double entry = xt->mat[j + i * n_cols]; if (entry <= 0.) continue; ase1_yx += entry * pow2 (UY * log (entry / xt->row_tot[i]) + (UX - UXY) * log (xt->col_tot[j] / xt->total)); ase1_xy += entry * pow2 (UX * log (entry / xt->col_tot[j]) + (UY - UXY) * log (xt->row_tot[i] / xt->total)); ase1_sym += entry * pow2 ((UXY * log (xt->row_tot[i] * xt->col_tot[j] / pow2 (xt->total))) - (UX + UY) * log (entry / xt->total)); } v[5] = 2. * ((UX + UY - UXY) / (UX + UY)); ase[5] = (2. / (xt->total * pow2 (UX + UY))) * sqrt (ase1_sym); t[5] = SYSMIS; v[6] = (UX + UY - UXY) / UX; ase[6] = sqrt (ase1_xy) / (xt->total * UX * UX); t[6] = v[6] / (sqrt (P - xt->total * pow2 (UX + UY - UXY)) / (xt->total * UX)); v[7] = (UX + UY - UXY) / UY; ase[7] = sqrt (ase1_yx) / (xt->total * UY * UY); t[7] = v[7] / (sqrt (P - xt->total * pow2 (UX + UY - UXY)) / (xt->total * UY)); } /* Somers' D. */ if (proc->statistics & (1u << CRS_ST_D)) { double v_dummy[N_SYMMETRIC]; double ase_dummy[N_SYMMETRIC]; double t_dummy[N_SYMMETRIC]; double somers_d_v[3]; double somers_d_ase[3]; double somers_d_t[3]; if (calc_symmetric (proc, xt, v_dummy, ase_dummy, t_dummy, somers_d_v, somers_d_ase, somers_d_t)) { for (int i = 0; i < 3; i++) { v[8 + i] = somers_d_v[i]; ase[8 + i] = somers_d_ase[i]; t[8 + i] = somers_d_t[i]; sig[8 + i] = 2 * gsl_cdf_ugaussian_Q (fabs (somers_d_t[i])); } } } /* Eta. */ if (proc->statistics & (1u << CRS_ST_ETA)) { /* X dependent. */ double sum_Xr = 0.0; double sum_X2r = 0.0; for (int i = 0; i < n_rows; i++) { sum_Xr += xt->vars[ROW_VAR].values[i].f * xt->row_tot[i]; sum_X2r += pow2 (xt->vars[ROW_VAR].values[i].f) * xt->row_tot[i]; } double SX = sum_X2r - pow2 (sum_Xr) / xt->total; double SXW = 0.0; FOR_EACH_POPULATED_COLUMN (j, xt) { double cum = 0.0; for (int i = 0; i < n_rows; i++) { SXW += (pow2 (xt->vars[ROW_VAR].values[i].f) * xt->mat[j + i * n_cols]); cum += (xt->vars[ROW_VAR].values[i].f * xt->mat[j + i * n_cols]); } SXW -= cum * cum / xt->col_tot[j]; } v[11] = sqrt (1. - SXW / SX); /* Y dependent. */ double sum_Yc = 0.0; double sum_Y2c = 0.0; for (int i = 0; i < n_cols; i++) { sum_Yc += xt->vars[COL_VAR].values[i].f * xt->col_tot[i]; sum_Y2c += pow2 (xt->vars[COL_VAR].values[i].f) * xt->col_tot[i]; } double SY = sum_Y2c - pow2 (sum_Yc) / xt->total; double SYW = 0.0; FOR_EACH_POPULATED_ROW (i, xt) { double cum = 0.0; for (int j = 0; j < n_cols; j++) { SYW += (pow2 (xt->vars[COL_VAR].values[j].f) * xt->mat[j + i * n_cols]); cum += (xt->vars[COL_VAR].values[j].f * xt->mat[j + i * n_cols]); } SYW -= cum * cum / xt->row_tot[i]; } v[12] = sqrt (1. - SYW / SY); } return 1; } /* Local Variables: mode: c End: */ pspp-1.4.1/src/language/stats/mann-whitney.h0000644000175000017500000000224513670210420020410 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2010, 2011 Free Software Foundation, Inc. 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 3 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, see . */ #if !mann_whitney_h #define mann_whitney_h 1 #include #include #include "language/stats/npar.h" struct mann_whitney_test { struct two_sample_test parent; }; struct casereader; struct dataset; void mann_whitney_execute (const struct dataset *ds, struct casereader *input, enum mv_class exclude, const struct npar_test *test, bool exact, double timer ); #endif pspp-1.4.1/src/language/stats/t-test-paired.c0000644000175000017500000002303513670210420020447 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2011 Free Software Foundation, Inc. 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 3 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, see . */ #include #include #include #include "t-test.h" #include "math/moments.h" #include "math/correlation.h" #include "data/casereader.h" #include "data/dictionary.h" #include "data/format.h" #include "data/variable.h" #include "output/pivot-table.h" #include "gettext.h" #define N_(msgid) msgid #define _(msgid) gettext (msgid) struct pair_stats { double sum_of_prod; struct moments *mom0; const struct variable *var0; struct moments *mom1; const struct variable *var1; struct moments *mom_diff; }; struct paired_samp { struct pair_stats *ps; size_t n_ps; }; static void paired_summary (const struct tt *tt, struct paired_samp *os); static void paired_correlations (const struct tt *tt, struct paired_samp *os); static void paired_test (const struct tt *tt, const struct paired_samp *os); void paired_run (const struct tt *tt, size_t n_pairs, vp *pairs, struct casereader *reader) { struct ccase *c; struct paired_samp ps; struct casereader *r; ps.ps = xcalloc (n_pairs, sizeof *ps.ps); ps.n_ps = n_pairs; for (size_t i = 0; i < n_pairs; ++i) { vp *pair = &pairs[i]; struct pair_stats *pp = &ps.ps[i]; pp->var0 = (*pair)[0]; pp->var1 = (*pair)[1]; pp->mom0 = moments_create (MOMENT_VARIANCE); pp->mom1 = moments_create (MOMENT_VARIANCE); pp->mom_diff = moments_create (MOMENT_VARIANCE); } r = casereader_clone (reader); for (; (c = casereader_read (r)); case_unref (c)) { double w = dict_get_case_weight (tt->dict, c, NULL); for (int i = 0; i < ps.n_ps; i++) { struct pair_stats *pp = &ps.ps[i]; const union value *val0 = case_data (c, pp->var0); const union value *val1 = case_data (c, pp->var1); if (var_is_value_missing (pp->var0, val0, tt->exclude)) continue; if (var_is_value_missing (pp->var1, val1, tt->exclude)) continue; moments_pass_one (pp->mom0, val0->f, w); moments_pass_one (pp->mom1, val1->f, w); moments_pass_one (pp->mom_diff, val0->f - val1->f, w); } } casereader_destroy (r); r = reader; for (; (c = casereader_read (r)); case_unref (c)) { double w = dict_get_case_weight (tt->dict, c, NULL); for (int i = 0; i < ps.n_ps; i++) { struct pair_stats *pp = &ps.ps[i]; const union value *val0 = case_data (c, pp->var0); const union value *val1 = case_data (c, pp->var1); if (var_is_value_missing (pp->var0, val0, tt->exclude)) continue; if (var_is_value_missing (pp->var1, val1, tt->exclude)) continue; moments_pass_two (pp->mom0, val0->f, w); moments_pass_two (pp->mom1, val1->f, w); moments_pass_two (pp->mom_diff, val0->f - val1->f, w); pp->sum_of_prod += val0->f * val1->f * w; } } casereader_destroy (r); paired_summary (tt, &ps); paired_correlations (tt, &ps); paired_test (tt, &ps); /* Clean up */ for (int i = 0; i < ps.n_ps; i++) { struct pair_stats *pp = &ps.ps[i]; moments_destroy (pp->mom0); moments_destroy (pp->mom1); moments_destroy (pp->mom_diff); } free (ps.ps); } static void paired_summary (const struct tt *tt, struct paired_samp *os) { struct pivot_table *table = pivot_table_create ( N_("Paired Sample Statistics")); pivot_table_set_weight_var (table, tt->wv); pivot_dimension_create (table, PIVOT_AXIS_COLUMN, N_("Statistics"), N_("N"), PIVOT_RC_COUNT, N_("Mean"), PIVOT_RC_OTHER, N_("Std. Deviation"), PIVOT_RC_OTHER, N_("S.E. Mean"), PIVOT_RC_OTHER); struct pivot_dimension *variables = pivot_dimension_create ( table, PIVOT_AXIS_ROW, N_("Variables")); for (size_t i = 0; i < os->n_ps; i++) { struct pair_stats *pp = &os->ps[i]; struct pivot_category *pair = pivot_category_create_group__ ( variables->root, pivot_value_new_text_format (N_("Pair %zu"), i + 1)); for (int j = 0; j < 2; j++) { const struct variable *var = j ? pp->var1 : pp->var0; const struct moments *mom = j ? pp->mom1 : pp->mom0; double cc, mean, sigma; moments_calculate (mom, &cc, &mean, &sigma, NULL, NULL); int var_idx = pivot_category_create_leaf ( pair, pivot_value_new_variable (var)); double entries[] = { cc, mean, sqrt (sigma), sqrt (sigma / cc) }; for (size_t j = 0; j < sizeof entries / sizeof *entries; j++) pivot_table_put2 (table, j, var_idx, pivot_value_new_number (entries[j])); } } pivot_table_submit (table); } static void paired_correlations (const struct tt *tt, struct paired_samp *os) { struct pivot_table *table = pivot_table_create ( N_("Paired Samples Correlations")); pivot_table_set_weight_var (table, tt->wv); pivot_dimension_create (table, PIVOT_AXIS_COLUMN, N_("Statistics"), N_("N"), PIVOT_RC_COUNT, N_("Correlation"), PIVOT_RC_CORRELATION, N_("Sig."), PIVOT_RC_SIGNIFICANCE); struct pivot_dimension *pairs = pivot_dimension_create ( table, PIVOT_AXIS_ROW, N_("Pairs")); for (size_t i = 0; i < os->n_ps; i++) { struct pair_stats *pp = &os->ps[i]; struct pivot_category *group = pivot_category_create_group__ ( pairs->root, pivot_value_new_text_format (N_("Pair %zu"), i + 1)); int row = pivot_category_create_leaf ( group, pivot_value_new_text_format (N_("%s & %s"), var_to_string (pp->var0), var_to_string (pp->var1))); double cc0, mean0, sigma0; double cc1, mean1, sigma1; moments_calculate (pp->mom0, &cc0, &mean0, &sigma0, NULL, NULL); moments_calculate (pp->mom1, &cc1, &mean1, &sigma1, NULL, NULL); /* If this fails, then we're not dealing with missing values properly */ assert (cc0 == cc1); double corr = ((pp->sum_of_prod / cc0 - mean0 * mean1) / sqrt (sigma0 * sigma1) * cc0 / (cc0 - 1)); double sig = 2.0 * significance_of_correlation (corr, cc0); double entries[] = { cc0, corr, sig }; for (size_t i = 0; i < sizeof entries / sizeof *entries; i++) pivot_table_put2 (table, i, row, pivot_value_new_number (entries[i])); } pivot_table_submit (table); } static void paired_test (const struct tt *tt, const struct paired_samp *os) { struct pivot_table *table = pivot_table_create (N_("Paired Samples Test")); pivot_table_set_weight_var (table, tt->wv); struct pivot_dimension *statistics = pivot_dimension_create ( table, PIVOT_AXIS_COLUMN, N_("Statistics")); struct pivot_category *group = pivot_category_create_group ( statistics->root, N_("Paired Differences"), N_("Mean"), PIVOT_RC_OTHER, N_("Std. Deviation"), PIVOT_RC_OTHER, N_("S.E. Mean"), PIVOT_RC_OTHER); struct pivot_category *interval = pivot_category_create_group__ ( group, pivot_value_new_text_format ( N_("%g%% Confidence Interval of the Difference"), tt->confidence * 100.0)); pivot_category_create_leaves (interval, N_("Lower"), PIVOT_RC_OTHER, N_("Upper"), PIVOT_RC_OTHER); pivot_category_create_leaves (statistics->root, N_("t"), PIVOT_RC_OTHER, N_("df"), PIVOT_RC_COUNT, N_("Sig. (2-tailed)"), PIVOT_RC_SIGNIFICANCE); struct pivot_dimension *pairs = pivot_dimension_create ( table, PIVOT_AXIS_ROW, N_("Pairs")); for (size_t i = 0; i < os->n_ps; i++) { struct pair_stats *pp = &os->ps[i]; struct pivot_category *group = pivot_category_create_group__ ( pairs->root, pivot_value_new_text_format (N_("Pair %zu"), i + 1)); int row = pivot_category_create_leaf ( group, pivot_value_new_text_format (N_("%s - %s"), var_to_string (pp->var0), var_to_string (pp->var1))); double cc, mean, sigma; moments_calculate (pp->mom_diff, &cc, &mean, &sigma, NULL, NULL); double df = cc - 1.0; double t = mean * sqrt (cc / sigma); double se_mean = sqrt (sigma / cc); double p = gsl_cdf_tdist_P (t, df); double q = gsl_cdf_tdist_Q (t, df); double sig = 2.0 * (t > 0 ? q : p); double t_qinv = gsl_cdf_tdist_Qinv ((1.0 - tt->confidence) / 2.0, df); double entries[] = { mean, sqrt (sigma), se_mean, mean - t_qinv * se_mean, mean + t_qinv * se_mean, t, df, sig, }; for (size_t i = 0; i < sizeof entries / sizeof *entries; i++) pivot_table_put2 (table, i, row, pivot_value_new_number (entries[i])); } pivot_table_submit (table); } pspp-1.4.1/src/language/stats/npar-summary.c0000644000175000017500000000751413412603263020431 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2006, 2009, 2010, 2011 Free Software Foundation, Inc. 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 3 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, see . */ #include #include "language/stats/npar-summary.h" #include #include "data/case.h" #include "data/casereader.h" #include "data/dictionary.h" #include "data/format.h" #include "data/variable.h" #include "math/moments.h" #include "output/pivot-table.h" #include "gl/minmax.h" #include "gettext.h" #define N_(msgid) msgid #define _(msgid) gettext (msgid) void npar_summary_calc_descriptives (struct descriptives *desc, struct casereader *input, const struct dictionary *dict, const struct variable *const *vv, int n_vars, enum mv_class filter) { int i = 0; for (i = 0 ; i < n_vars; ++i) { double minimum = DBL_MAX; double maximum = -DBL_MAX; double var; struct moments1 *moments = moments1_create (MOMENT_VARIANCE); struct ccase *c; const struct variable *v = vv[i]; struct casereader *pass; pass = casereader_clone (input); pass = casereader_create_filter_missing (pass, &v, 1, filter, NULL, NULL); pass = casereader_create_filter_weight (pass, dict, NULL, NULL); while ((c = casereader_read (pass)) != NULL) { double val = case_num (c, v); double w = dict_get_case_weight (dict, c, NULL); minimum = MIN (minimum, val); maximum = MAX (maximum, val); moments1_add (moments, val, w); case_unref (c); } casereader_destroy (pass); moments1_calculate (moments, &desc[i].n, &desc[i].mean, &var, NULL, NULL); desc[i].std_dev = sqrt (var); moments1_destroy (moments); desc[i].min = minimum; desc[i].max = maximum; } casereader_destroy (input); } void do_summary_box (const struct descriptives *desc, const struct variable *const *vv, int n_vars, const struct fmt_spec *wfmt) { if (!desc) return; struct pivot_table *table = pivot_table_create ( N_("Descriptive Statistics")); pivot_table_set_weight_format (table, wfmt); pivot_dimension_create ( table, PIVOT_AXIS_COLUMN, N_("Statistics"), N_("N"), PIVOT_RC_COUNT, N_("Mean"), PIVOT_RC_OTHER, N_("Std. Deviation"), PIVOT_RC_OTHER, N_("Minimum"), N_("Maximum")); struct pivot_dimension *variables = pivot_dimension_create ( table, PIVOT_AXIS_ROW, N_("Variable")); for (int v = 0; v < n_vars; ++v) { const struct variable *var = vv[v]; int row = pivot_category_create_leaf (variables->root, pivot_value_new_variable (var)); double entries[] = { desc[v].n, desc[v].mean, desc[v].std_dev }; for (size_t j = 0; j < sizeof entries / sizeof *entries; j++) pivot_table_put2 (table, j, row, pivot_value_new_number (entries[j])); union value extrema[2] = { { .f = desc[v].min }, { .f = desc[v].max } }; for (size_t j = 0; j < 2; j++) pivot_table_put2 (table, 3 + j, row, pivot_value_new_var_value (var, &extrema[j])); } pivot_table_submit (table); } pspp-1.4.1/src/language/stats/means.h0000644000175000017500000000745213507505260017112 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2011, 2012, 2013, 2019 Free Software Foundation, Inc. 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 3 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, see . */ #ifndef MEANS_H #define MEANS_H #include "libpspp/hmap.h" #include "libpspp/bt.h" #include "libpspp/compiler.h" struct cell_container { /* A hash table containing the cells. The table is indexed by a hash based on the cell's categorical value. */ struct hmap map; /* A binary tree containing the cells. This is used to sort the elements in order of their categorical values. */ struct bt bt; }; struct layer { size_t n_factor_vars; const struct variable **factor_vars; }; struct statistic; typedef struct statistic *stat_create (struct pool *pool); typedef void stat_update (struct statistic *stat, double w, double x); typedef double stat_get (const struct statistic *); typedef void stat_destroy (struct statistic *); struct cell_spec { /* Printable title for output */ const char *title; /* Keyword for syntax */ const char *keyword; /* The result class for the datum. */ const char *rc; stat_create *sc; stat_update *su; stat_get *sd; stat_destroy *sf; }; struct summary { double n_total; double n_missing; }; /* Intermediate data per table. */ struct workspace { /* An array of n_layers integers which are used to permute access into the factor_vars of each layer. */ int *control_idx; /* An array of n_layers cell_containers which hold the union of instances used respectively by each layer. */ struct cell_container *instances; struct cell *root_cell; }; /* The thing parsed after TABLES= */ struct mtable { size_t n_dep_vars; const struct variable **dep_vars; struct layer **layers; int n_layers; int n_combinations; /* An array of n_combinations workspaces. */ struct workspace *ws; /* An array of n_combinations * n_dep_vars summaries. These are displayed in the Case Processing Summary box. */ struct summary *summ; }; /* A structure created by the parser. Contains the definition of the what the procedure should calculate. */ struct means { const struct dictionary *dict; /* The "tables" (ie, a definition of how the data should be broken down). */ struct mtable *table; size_t n_tables; /* Missing value class for categorical variables. */ enum mv_class ctrl_exclude; /* Missing value class for dependent variables */ enum mv_class dep_exclude; /* The statistics to be calculated for each cell. */ int *statistics; int n_statistics; /* Pool on which cell functions may allocate data. */ struct pool *pool; }; #define n_MEANS_STATISTICS 17 extern const struct cell_spec cell_spec[n_MEANS_STATISTICS]; /* This enum must be consistent with the array cell_spec (in means-calc.c). A bitfield instead of enums would in my opinion be more elegent. However we want the order of the specified statistics to be retained in the output. */ enum { MEANS_MEAN = 0, MEANS_N, MEANS_STDDEV }; struct dataset; struct casereader; void run_means (struct means *cmd, struct casereader *input, const struct dataset *ds UNUSED); struct lexer; bool means_parse (struct lexer *lexer, struct means *means); #endif pspp-1.4.1/src/language/stats/means-calc.c0000644000175000017500000002601013670210420017764 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2011, 2012, 2013, 2019 Free Software Foundation, Inc. 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 3 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, see . */ #include #include "data/case.h" #include "data/format.h" #include "data/variable.h" #include "libpspp/bt.h" #include "libpspp/hmap.h" #include "libpspp/misc.h" #include "libpspp/pool.h" #include "math/moments.h" #include "output/pivot-table.h" #include #include "means.h" #include "gettext.h" #define _(msgid) gettext (msgid) #define N_(msgid) (msgid) /* A base struct for all statistics. */ struct statistic { }; /* Statistics which accumulate a single value. */ struct statistic_simple { struct statistic parent; double acc; }; /* Statistics based on moments. */ struct statistic_moment { struct statistic parent; struct moments1 *mom; }; static struct statistic * default_create (struct pool *pool) { struct statistic_moment *pvd = pool_alloc (pool, sizeof *pvd); pvd->mom = moments1_create (MOMENT_KURTOSIS); return (struct statistic *) pvd; } static void default_update (struct statistic *stat, double w, double x) { struct statistic_moment *pvd = (struct statistic_moment *) stat; moments1_add (pvd->mom, x, w); } static void default_destroy (struct statistic *stat) { struct statistic_moment *pvd = (struct statistic_moment *) stat; moments1_destroy (pvd->mom); } /* Simple statistics have nothing to destroy. */ static void simple_destroy (struct statistic *stat UNUSED) { } /* HARMONIC MEAN: The reciprocal of the sum of the reciprocals: 1 / (1/(x_0) + 1/(x_1) + ... + 1/(x_{n-1})) */ struct harmonic_mean { struct statistic parent; double rsum; double n; }; static struct statistic * harmonic_create (struct pool *pool) { struct harmonic_mean *hm = pool_alloc (pool, sizeof *hm); hm->rsum = 0; hm->n = 0; return (struct statistic *) hm; } static void harmonic_update (struct statistic *stat, double w, double x) { struct harmonic_mean *hm = (struct harmonic_mean *) stat; hm->rsum += w / x; hm->n += w; } static double harmonic_get (const struct statistic *pvd) { const struct harmonic_mean *hm = (const struct harmonic_mean *) pvd; return hm->n / hm->rsum; } /* GEOMETRIC MEAN: The nth root of the product of all n observations pow ((x_0 * x_1 * ... x_{n - 1}), 1/n) */ struct geometric_mean { struct statistic parent; double prod; double n; }; static struct statistic * geometric_create (struct pool *pool) { struct geometric_mean *gm = pool_alloc (pool, sizeof *gm); gm->prod = 1.0; gm->n = 0; return (struct statistic *) gm; } static void geometric_update (struct statistic *pvd, double w, double x) { struct geometric_mean *gm = (struct geometric_mean *)pvd; gm->prod *= pow (x, w); gm->n += w; } static double geometric_get (const struct statistic *pvd) { const struct geometric_mean *gm = (const struct geometric_mean *)pvd; return pow (gm->prod, 1.0 / gm->n); } /* The getters for moment based statistics simply calculate the moment. The only exception is Std Dev. which needs to call sqrt as well. */ static double sum_get (const struct statistic *pvd) { double n, mean; moments1_calculate (((struct statistic_moment *)pvd)->mom, &n, &mean, 0, 0, 0); return mean * n; } static double n_get (const struct statistic *pvd) { double n; moments1_calculate (((struct statistic_moment *)pvd)->mom, &n, 0, 0, 0, 0); return n; } static double arithmean_get (const struct statistic *pvd) { double n, mean; moments1_calculate (((struct statistic_moment *)pvd)->mom, &n, &mean, 0, 0, 0); return mean; } static double variance_get (const struct statistic *pvd) { double n, mean, variance; moments1_calculate (((struct statistic_moment *)pvd)->mom, &n, &mean, &variance, 0, 0); return variance; } static double stddev_get (const struct statistic *pvd) { return sqrt (variance_get (pvd)); } static double skew_get (const struct statistic *pvd) { double skew; moments1_calculate (((struct statistic_moment *)pvd)->mom, NULL, NULL, NULL, &skew, 0); return skew; } static double sekurt_get (const struct statistic *pvd) { double n; moments1_calculate (((struct statistic_moment *)pvd)->mom, &n, NULL, NULL, NULL, NULL); return calc_sekurt (n); } static double seskew_get (const struct statistic *pvd) { double n; moments1_calculate (((struct statistic_moment *)pvd)->mom, &n, NULL, NULL, NULL, NULL); return calc_seskew (n); } static double kurt_get (const struct statistic *pvd) { double kurt; moments1_calculate (((struct statistic_moment *)pvd)->mom, NULL, NULL, NULL, NULL, &kurt); return kurt; } static double semean_get (const struct statistic *pvd) { double n, var; moments1_calculate (((struct statistic_moment *)pvd)->mom, &n, NULL, &var, NULL, NULL); return sqrt (var / n); } /* MIN: The smallest (closest to minus infinity) value. */ static struct statistic * min_create (struct pool *pool) { struct statistic_simple *pvd = pool_alloc (pool, sizeof *pvd); pvd->acc = DBL_MAX; return (struct statistic *) pvd; } static void min_update (struct statistic *pvd, double w UNUSED, double x) { double *r = &((struct statistic_simple *)pvd)->acc; if (x < *r) *r = x; } static double min_get (const struct statistic *pvd) { double *r = &((struct statistic_simple *)pvd)->acc; return *r; } /* MAX: The largest (closest to plus infinity) value. */ static struct statistic * max_create (struct pool *pool) { struct statistic_simple *pvd = pool_alloc (pool, sizeof *pvd); pvd->acc = -DBL_MAX; return (struct statistic *) pvd; } static void max_update (struct statistic *pvd, double w UNUSED, double x) { double *r = &((struct statistic_simple *)pvd)->acc; if (x > *r) *r = x; } static double max_get (const struct statistic *pvd) { double *r = &((struct statistic_simple *)pvd)->acc; return *r; } struct range { struct statistic parent; double min; double max; }; /* Initially min and max are set to their most (inverted) extreme possible values. */ static struct statistic * range_create (struct pool *pool) { struct range *r = pool_alloc (pool, sizeof *r); r->min = DBL_MAX; r->max = -DBL_MAX; return (struct statistic *) r; } /* On each update, set min and max to X or leave unchanged, as appropriate. */ static void range_update (struct statistic *pvd, double w UNUSED, double x) { struct range *r = (struct range *) pvd; if (x > r->max) r->max = x; if (x < r->min) r->min = x; } /* Get the difference between min and max. */ static double range_get (const struct statistic *pvd) { const struct range *r = (struct range *) pvd; return r->max - r->min; } /* LAST: The last value (the one closest to the end of the file). */ static struct statistic * last_create (struct pool *pool) { struct statistic_simple *pvd = pool_alloc (pool, sizeof *pvd); return (struct statistic *) pvd; } static void last_update (struct statistic *pvd, double w UNUSED, double x) { struct statistic_simple *stat = (struct statistic_simple *) pvd; stat->acc = x; } static double last_get (const struct statistic *pvd) { const struct statistic_simple *stat = (struct statistic_simple *) pvd; return stat->acc; } /* FIRST: The first value (the one closest to the start of the file). */ static struct statistic * first_create (struct pool *pool) { struct statistic_simple *pvd = pool_alloc (pool, sizeof *pvd); pvd->acc = SYSMIS; return (struct statistic *) pvd; } static void first_update (struct statistic *pvd, double w UNUSED, double x) { struct statistic_simple *stat = (struct statistic_simple *) pvd; if (stat->acc == SYSMIS) stat->acc = x; } static double first_get (const struct statistic *pvd) { const struct statistic_simple *stat = (struct statistic_simple *) pvd; return stat->acc; } /* Table of cell_specs */ const struct cell_spec cell_spec[n_MEANS_STATISTICS] = { {N_("Mean"), "MEAN", NULL , default_create, default_update, arithmean_get, default_destroy}, {N_("N"), "COUNT", PIVOT_RC_COUNT, default_create, default_update, n_get, default_destroy}, {N_("Std. Deviation"), "STDDEV", NULL , default_create, default_update, stddev_get, default_destroy}, #if 0 {N_("Median"), "MEDIAN", NULL , default_create, default_update, NULL, default_destroy}, {N_("Group Median"), "GMEDIAN", NULL , default_create, default_update, NULL, default_destroy}, #endif {N_("S.E. Mean"), "SEMEAN", NULL , default_create, default_update, semean_get, default_destroy}, {N_("Sum"), "SUM", NULL , default_create, default_update, sum_get, default_destroy}, {N_("Minimum"), "MIN", NULL , min_create, min_update, min_get, simple_destroy}, {N_("Maximum"), "MAX", NULL , max_create, max_update, max_get, simple_destroy}, {N_("Range"), "RANGE", NULL , range_create, range_update, range_get, simple_destroy}, {N_("Variance"), "VARIANCE", PIVOT_RC_OTHER, default_create, default_update, variance_get, default_destroy}, {N_("Kurtosis"), "KURT", PIVOT_RC_OTHER, default_create, default_update, kurt_get, default_destroy}, {N_("S.E. Kurt"), "SEKURT", PIVOT_RC_OTHER, default_create, default_update, sekurt_get, default_destroy}, {N_("Skewness"), "SKEW", PIVOT_RC_OTHER, default_create, default_update, skew_get, default_destroy}, {N_("S.E. Skew"), "SESKEW", PIVOT_RC_OTHER, default_create, default_update, seskew_get, default_destroy}, {N_("First"), "FIRST", NULL , first_create, first_update, first_get, simple_destroy}, {N_("Last"), "LAST", NULL , last_create, last_update, last_get, simple_destroy}, #if 0 {N_("Percent N"), "NPCT", PIVOT_RC_PERCENT, default_create, default_update, NULL, default_destroy}, {N_("Percent Sum"), "SPCT", PIVOT_RC_PERCENT, default_create, default_update, NULL, default_destroy}, #endif {N_("Harmonic Mean"), "HARMONIC", NULL , harmonic_create, harmonic_update, harmonic_get, simple_destroy}, {N_("Geom. Mean"), "GEOMETRIC", NULL , geometric_create, geometric_update, geometric_get, simple_destroy} }; pspp-1.4.1/src/language/stats/glm.c0000644000175000017500000005431113700645725016563 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2010, 2011, 2012 Free Software Foundation, Inc. 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 3 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, see . */ #include #include #include #include #include #include "data/case.h" #include "data/casegrouper.h" #include "data/casereader.h" #include "data/dataset.h" #include "data/dictionary.h" #include "data/format.h" #include "data/value.h" #include "language/command.h" #include "language/dictionary/split-file.h" #include "language/lexer/lexer.h" #include "language/lexer/value-parser.h" #include "language/lexer/variable-parser.h" #include "libpspp/assertion.h" #include "libpspp/ll.h" #include "libpspp/message.h" #include "libpspp/misc.h" #include "libpspp/taint.h" #include "linreg/sweep.h" #include "math/categoricals.h" #include "math/covariance.h" #include "math/interaction.h" #include "math/moments.h" #include "output/pivot-table.h" #include "gettext.h" #define N_(msgid) msgid #define _(msgid) gettext (msgid) struct glm_spec { size_t n_dep_vars; const struct variable **dep_vars; size_t n_factor_vars; const struct variable **factor_vars; size_t n_interactions; struct interaction **interactions; enum mv_class exclude; /* The weight variable */ const struct variable *wv; const struct dictionary *dict; int ss_type; bool intercept; double alpha; bool dump_coding; }; struct glm_workspace { double total_ssq; struct moments *totals; struct categoricals *cats; /* Sums of squares due to different variables. Element 0 is the SSE for the entire model. For i > 0, element i is the SS due to variable i. */ gsl_vector *ssq; }; /* Default design: all possible interactions */ static void design_full (struct glm_spec *glm) { int sz; int i = 0; glm->n_interactions = (1 << glm->n_factor_vars) - 1; glm->interactions = xcalloc (glm->n_interactions, sizeof *glm->interactions); /* All subsets, with exception of the empty set, of [0, glm->n_factor_vars) */ for (sz = 1; sz <= glm->n_factor_vars; ++sz) { gsl_combination *c = gsl_combination_calloc (glm->n_factor_vars, sz); do { struct interaction *iact = interaction_create (NULL); int e; for (e = 0 ; e < gsl_combination_k (c); ++e) interaction_add_variable (iact, glm->factor_vars [gsl_combination_get (c, e)]); glm->interactions[i++] = iact; } while (gsl_combination_next (c) == GSL_SUCCESS); gsl_combination_free (c); } } static void output_glm (const struct glm_spec *, const struct glm_workspace *ws); static void run_glm (struct glm_spec *cmd, struct casereader *input, const struct dataset *ds); static bool parse_design_spec (struct lexer *lexer, struct glm_spec *glm); int cmd_glm (struct lexer *lexer, struct dataset *ds) { int i; struct const_var_set *factors = NULL; struct glm_spec glm; bool design = false; glm.dict = dataset_dict (ds); glm.n_dep_vars = 0; glm.n_factor_vars = 0; glm.n_interactions = 0; glm.interactions = NULL; glm.dep_vars = NULL; glm.factor_vars = NULL; glm.exclude = MV_ANY; glm.intercept = true; glm.wv = dict_get_weight (glm.dict); glm.alpha = 0.05; glm.dump_coding = false; glm.ss_type = 3; if (!parse_variables_const (lexer, glm.dict, &glm.dep_vars, &glm.n_dep_vars, PV_NO_DUPLICATE | PV_NUMERIC)) goto error; if (! lex_force_match (lexer, T_BY)) goto error; if (!parse_variables_const (lexer, glm.dict, &glm.factor_vars, &glm.n_factor_vars, PV_NO_DUPLICATE | PV_NUMERIC)) goto error; if (glm.n_dep_vars > 1) { msg (ME, _("Multivariate analysis is not yet implemented")); return CMD_FAILURE; } factors = const_var_set_create_from_array (glm.factor_vars, glm.n_factor_vars); while (lex_token (lexer) != T_ENDCMD) { lex_match (lexer, T_SLASH); if (lex_match_id (lexer, "MISSING")) { lex_match (lexer, T_EQUALS); while (lex_token (lexer) != T_ENDCMD && lex_token (lexer) != T_SLASH) { if (lex_match_id (lexer, "INCLUDE")) { glm.exclude = MV_SYSTEM; } else if (lex_match_id (lexer, "EXCLUDE")) { glm.exclude = MV_ANY; } else { lex_error (lexer, NULL); goto error; } } } else if (lex_match_id (lexer, "INTERCEPT")) { lex_match (lexer, T_EQUALS); while (lex_token (lexer) != T_ENDCMD && lex_token (lexer) != T_SLASH) { if (lex_match_id (lexer, "INCLUDE")) { glm.intercept = true; } else if (lex_match_id (lexer, "EXCLUDE")) { glm.intercept = false; } else { lex_error (lexer, NULL); goto error; } } } else if (lex_match_id (lexer, "CRITERIA")) { lex_match (lexer, T_EQUALS); if (lex_match_id (lexer, "ALPHA")) { if (lex_force_match (lexer, T_LPAREN)) { if (! lex_force_num (lexer)) { lex_error (lexer, NULL); goto error; } glm.alpha = lex_number (lexer); lex_get (lexer); if (! lex_force_match (lexer, T_RPAREN)) { lex_error (lexer, NULL); goto error; } } } else { lex_error (lexer, NULL); goto error; } } else if (lex_match_id (lexer, "METHOD")) { lex_match (lexer, T_EQUALS); if (!lex_force_match_id (lexer, "SSTYPE")) { lex_error (lexer, NULL); goto error; } if (! lex_force_match (lexer, T_LPAREN)) { lex_error (lexer, NULL); goto error; } if (! lex_force_int (lexer)) { lex_error (lexer, NULL); goto error; } glm.ss_type = lex_integer (lexer); if (1 > glm.ss_type || 3 < glm.ss_type) { msg (ME, _("Only types 1, 2 & 3 sums of squares are currently implemented")); goto error; } lex_get (lexer); if (! lex_force_match (lexer, T_RPAREN)) { lex_error (lexer, NULL); goto error; } } else if (lex_match_id (lexer, "DESIGN")) { lex_match (lexer, T_EQUALS); if (! parse_design_spec (lexer, &glm)) goto error; if (glm.n_interactions > 0) design = true; } else if (lex_match_id (lexer, "SHOWCODES")) /* Undocumented debug option */ { lex_match (lexer, T_EQUALS); glm.dump_coding = true; } else { lex_error (lexer, NULL); goto error; } } if (! design) { design_full (&glm); } { struct casegrouper *grouper; struct casereader *group; bool ok; grouper = casegrouper_create_splits (proc_open (ds), glm.dict); while (casegrouper_get_next_group (grouper, &group)) run_glm (&glm, group, ds); ok = casegrouper_destroy (grouper); ok = proc_commit (ds) && ok; } const_var_set_destroy (factors); free (glm.factor_vars); for (i = 0 ; i < glm.n_interactions; ++i) interaction_destroy (glm.interactions[i]); free (glm.interactions); free (glm.dep_vars); return CMD_SUCCESS; error: const_var_set_destroy (factors); free (glm.factor_vars); for (i = 0 ; i < glm.n_interactions; ++i) interaction_destroy (glm.interactions[i]); free (glm.interactions); free (glm.dep_vars); return CMD_FAILURE; } static inline bool not_dropped (size_t j, const bool *ff) { return ! ff[j]; } static void fill_submatrix (const gsl_matrix * cov, gsl_matrix * submatrix, bool *dropped_f) { size_t i; size_t j; size_t n = 0; size_t m = 0; for (i = 0; i < cov->size1; i++) { if (not_dropped (i, dropped_f)) { m = 0; for (j = 0; j < cov->size2; j++) { if (not_dropped (j, dropped_f)) { gsl_matrix_set (submatrix, n, m, gsl_matrix_get (cov, i, j)); m++; } } n++; } } } /* Type 1 sums of squares. Populate SSQ with the Type 1 sums of squares according to COV */ static void ssq_type1 (struct covariance *cov, gsl_vector *ssq, const struct glm_spec *cmd) { const gsl_matrix *cm = covariance_calculate_unnormalized (cov); size_t i; size_t k; bool *model_dropped = XCALLOC (covariance_dim (cov), bool); bool *submodel_dropped = XCALLOC (covariance_dim (cov), bool); const struct categoricals *cats = covariance_get_categoricals (cov); size_t n_dropped_model = 0; size_t n_dropped_submodel = 0; for (i = cmd->n_dep_vars; i < covariance_dim (cov); i++) { n_dropped_model++; n_dropped_submodel++; model_dropped[i] = true; submodel_dropped[i] = true; } for (k = 0; k < cmd->n_interactions; k++) { gsl_matrix *model_cov = NULL; gsl_matrix *submodel_cov = NULL; n_dropped_submodel = n_dropped_model; for (i = cmd->n_dep_vars; i < covariance_dim (cov); i++) { submodel_dropped[i] = model_dropped[i]; } for (i = cmd->n_dep_vars; i < covariance_dim (cov); i++) { const struct interaction * x = categoricals_get_interaction_by_subscript (cats, i - cmd->n_dep_vars); if (x == cmd->interactions [k]) { model_dropped[i] = false; n_dropped_model--; } } model_cov = gsl_matrix_alloc (cm->size1 - n_dropped_model, cm->size2 - n_dropped_model); submodel_cov = gsl_matrix_alloc (cm->size1 - n_dropped_submodel, cm->size2 - n_dropped_submodel); fill_submatrix (cm, model_cov, model_dropped); fill_submatrix (cm, submodel_cov, submodel_dropped); reg_sweep (model_cov, 0); reg_sweep (submodel_cov, 0); gsl_vector_set (ssq, k + 1, gsl_matrix_get (submodel_cov, 0, 0) - gsl_matrix_get (model_cov, 0, 0) ); gsl_matrix_free (model_cov); gsl_matrix_free (submodel_cov); } free (model_dropped); free (submodel_dropped); } /* Type 2 sums of squares. Populate SSQ with the Type 2 sums of squares according to COV */ static void ssq_type2 (struct covariance *cov, gsl_vector *ssq, const struct glm_spec *cmd) { const gsl_matrix *cm = covariance_calculate_unnormalized (cov); size_t i; size_t k; bool *model_dropped = XCALLOC (covariance_dim (cov), bool); bool *submodel_dropped = XCALLOC (covariance_dim (cov), bool); const struct categoricals *cats = covariance_get_categoricals (cov); for (k = 0; k < cmd->n_interactions; k++) { gsl_matrix *model_cov = NULL; gsl_matrix *submodel_cov = NULL; size_t n_dropped_model = 0; size_t n_dropped_submodel = 0; for (i = cmd->n_dep_vars; i < covariance_dim (cov); i++) { const struct interaction * x = categoricals_get_interaction_by_subscript (cats, i - cmd->n_dep_vars); model_dropped[i] = false; submodel_dropped[i] = false; if (interaction_is_subset (cmd->interactions [k], x)) { assert (n_dropped_submodel < covariance_dim (cov)); n_dropped_submodel++; submodel_dropped[i] = true; if (cmd->interactions [k]->n_vars < x->n_vars) { assert (n_dropped_model < covariance_dim (cov)); n_dropped_model++; model_dropped[i] = true; } } } model_cov = gsl_matrix_alloc (cm->size1 - n_dropped_model, cm->size2 - n_dropped_model); submodel_cov = gsl_matrix_alloc (cm->size1 - n_dropped_submodel, cm->size2 - n_dropped_submodel); fill_submatrix (cm, model_cov, model_dropped); fill_submatrix (cm, submodel_cov, submodel_dropped); reg_sweep (model_cov, 0); reg_sweep (submodel_cov, 0); gsl_vector_set (ssq, k + 1, gsl_matrix_get (submodel_cov, 0, 0) - gsl_matrix_get (model_cov, 0, 0) ); gsl_matrix_free (model_cov); gsl_matrix_free (submodel_cov); } free (model_dropped); free (submodel_dropped); } /* Type 3 sums of squares. Populate SSQ with the Type 2 sums of squares according to COV */ static void ssq_type3 (struct covariance *cov, gsl_vector *ssq, const struct glm_spec *cmd) { const gsl_matrix *cm = covariance_calculate_unnormalized (cov); size_t i; size_t k; bool *model_dropped = XCALLOC (covariance_dim (cov), bool); bool *submodel_dropped = XCALLOC (covariance_dim (cov), bool); const struct categoricals *cats = covariance_get_categoricals (cov); double ss0; gsl_matrix *submodel_cov = gsl_matrix_alloc (cm->size1, cm->size2); fill_submatrix (cm, submodel_cov, submodel_dropped); reg_sweep (submodel_cov, 0); ss0 = gsl_matrix_get (submodel_cov, 0, 0); gsl_matrix_free (submodel_cov); free (submodel_dropped); for (k = 0; k < cmd->n_interactions; k++) { gsl_matrix *model_cov = NULL; size_t n_dropped_model = 0; for (i = cmd->n_dep_vars; i < covariance_dim (cov); i++) { const struct interaction * x = categoricals_get_interaction_by_subscript (cats, i - cmd->n_dep_vars); model_dropped[i] = false; if (cmd->interactions [k] == x) { assert (n_dropped_model < covariance_dim (cov)); n_dropped_model++; model_dropped[i] = true; } } model_cov = gsl_matrix_alloc (cm->size1 - n_dropped_model, cm->size2 - n_dropped_model); fill_submatrix (cm, model_cov, model_dropped); reg_sweep (model_cov, 0); gsl_vector_set (ssq, k + 1, gsl_matrix_get (model_cov, 0, 0) - ss0); gsl_matrix_free (model_cov); } free (model_dropped); } //static void dump_matrix (const gsl_matrix *m); static void run_glm (struct glm_spec *cmd, struct casereader *input, const struct dataset *ds) { bool warn_bad_weight = true; int v; struct taint *taint; struct dictionary *dict = dataset_dict (ds); struct casereader *reader; struct ccase *c; struct glm_workspace ws; struct covariance *cov; input = casereader_create_filter_missing (input, cmd->dep_vars, cmd->n_dep_vars, cmd->exclude, NULL, NULL); input = casereader_create_filter_missing (input, cmd->factor_vars, cmd->n_factor_vars, cmd->exclude, NULL, NULL); ws.cats = categoricals_create (cmd->interactions, cmd->n_interactions, cmd->wv, MV_ANY); cov = covariance_2pass_create (cmd->n_dep_vars, cmd->dep_vars, ws.cats, cmd->wv, cmd->exclude, true); c = casereader_peek (input, 0); if (c == NULL) { casereader_destroy (input); return; } output_split_file_values (ds, c); case_unref (c); taint = taint_clone (casereader_get_taint (input)); ws.totals = moments_create (MOMENT_VARIANCE); for (reader = casereader_clone (input); (c = casereader_read (reader)) != NULL; case_unref (c)) { double weight = dict_get_case_weight (dict, c, &warn_bad_weight); for (v = 0; v < cmd->n_dep_vars; ++v) moments_pass_one (ws.totals, case_data (c, cmd->dep_vars[v])->f, weight); covariance_accumulate_pass1 (cov, c); } casereader_destroy (reader); if (cmd->dump_coding) reader = casereader_clone (input); else reader = input; for (; (c = casereader_read (reader)) != NULL; case_unref (c)) { double weight = dict_get_case_weight (dict, c, &warn_bad_weight); for (v = 0; v < cmd->n_dep_vars; ++v) moments_pass_two (ws.totals, case_data (c, cmd->dep_vars[v])->f, weight); covariance_accumulate_pass2 (cov, c); } casereader_destroy (reader); if (cmd->dump_coding) { struct pivot_table *t = covariance_dump_enc_header (cov); for (reader = input; (c = casereader_read (reader)) != NULL; case_unref (c)) { covariance_dump_enc (cov, c, t); } pivot_table_submit (t); } { const gsl_matrix *ucm = covariance_calculate_unnormalized (cov); gsl_matrix *cm = gsl_matrix_alloc (ucm->size1, ucm->size2); gsl_matrix_memcpy (cm, ucm); // dump_matrix (cm); ws.total_ssq = gsl_matrix_get (cm, 0, 0); reg_sweep (cm, 0); /* Store the overall SSE. */ ws.ssq = gsl_vector_alloc (cm->size1); gsl_vector_set (ws.ssq, 0, gsl_matrix_get (cm, 0, 0)); switch (cmd->ss_type) { case 1: ssq_type1 (cov, ws.ssq, cmd); break; case 2: ssq_type2 (cov, ws.ssq, cmd); break; case 3: ssq_type3 (cov, ws.ssq, cmd); break; default: NOT_REACHED (); break; } // dump_matrix (cm); gsl_matrix_free (cm); } if (!taint_has_tainted_successor (taint)) output_glm (cmd, &ws); gsl_vector_free (ws.ssq); covariance_destroy (cov); moments_destroy (ws.totals); taint_destroy (taint); } static void put_glm_row (struct pivot_table *table, int row, double a, double b, double c, double d, double e) { double entries[] = { a, b, c, d, e }; for (size_t col = 0; col < sizeof entries / sizeof *entries; col++) if (entries[col] != SYSMIS) pivot_table_put2 (table, col, row, pivot_value_new_number (entries[col])); } static void output_glm (const struct glm_spec *cmd, const struct glm_workspace *ws) { struct pivot_table *table = pivot_table_create ( N_("Tests of Between-Subjects Effects")); pivot_dimension_create (table, PIVOT_AXIS_COLUMN, N_("Statistics"), (cmd->ss_type == 1 ? N_("Type I Sum Of Squares") : cmd->ss_type == 2 ? N_("Type II Sum Of Squares") : N_("Type III Sum Of Squares")), PIVOT_RC_OTHER, N_("df"), PIVOT_RC_COUNT, N_("Mean Square"), PIVOT_RC_OTHER, N_("F"), PIVOT_RC_OTHER, N_("Sig."), PIVOT_RC_SIGNIFICANCE); struct pivot_dimension *source = pivot_dimension_create ( table, PIVOT_AXIS_ROW, N_("Source"), cmd->intercept ? N_("Corrected Model") : N_("Model")); double n_total, mean; moments_calculate (ws->totals, &n_total, &mean, NULL, NULL, NULL); double df_corr = 1.0 + categoricals_df_total (ws->cats); double mse = gsl_vector_get (ws->ssq, 0) / (n_total - df_corr); double intercept_ssq = pow2 (mean * n_total) / n_total; if (cmd->intercept) { int row = pivot_category_create_leaf ( source->root, pivot_value_new_text (N_("Intercept"))); /* The intercept for unbalanced models is of limited use and nobody knows how to calculate it properly */ if (categoricals_isbalanced (ws->cats)) { const double df = 1.0; const double F = intercept_ssq / df / mse; put_glm_row (table, row, intercept_ssq, 1.0, intercept_ssq / df, F, gsl_cdf_fdist_Q (F, df, n_total - df_corr)); } } double ssq_effects = 0.0; for (int f = 0; f < cmd->n_interactions; ++f) { double df = categoricals_df (ws->cats, f); double ssq = gsl_vector_get (ws->ssq, f + 1); ssq_effects += ssq; if (!cmd->intercept) { df++; ssq += intercept_ssq; } double F = ssq / df / mse; struct string str = DS_EMPTY_INITIALIZER; interaction_to_string (cmd->interactions[f], &str); int row = pivot_category_create_leaf ( source->root, pivot_value_new_user_text_nocopy (ds_steal_cstr (&str))); put_glm_row (table, row, ssq, df, ssq / df, F, gsl_cdf_fdist_Q (F, df, n_total - df_corr)); } { /* Model / Corrected Model */ double df = df_corr; double ssq = ws->total_ssq - gsl_vector_get (ws->ssq, 0); if (cmd->intercept) df--; else ssq += intercept_ssq; double F = ssq / df / mse; put_glm_row (table, 0, ssq, df, ssq / df, F, gsl_cdf_fdist_Q (F, df, n_total - df_corr)); } { int row = pivot_category_create_leaf (source->root, pivot_value_new_text (N_("Error"))); const double df = n_total - df_corr; const double ssq = gsl_vector_get (ws->ssq, 0); const double mse = ssq / df; put_glm_row (table, row, ssq, df, mse, SYSMIS, SYSMIS); } { int row = pivot_category_create_leaf (source->root, pivot_value_new_text (N_("Total"))); put_glm_row (table, row, ws->total_ssq + intercept_ssq, n_total, SYSMIS, SYSMIS, SYSMIS); } if (cmd->intercept) { int row = pivot_category_create_leaf ( source->root, pivot_value_new_text (N_("Corrected Total"))); put_glm_row (table, row, ws->total_ssq, n_total - 1.0, SYSMIS, SYSMIS, SYSMIS); } pivot_table_submit (table); } #if 0 static void dump_matrix (const gsl_matrix * m) { size_t i, j; for (i = 0; i < m->size1; ++i) { for (j = 0; j < m->size2; ++j) { double x = gsl_matrix_get (m, i, j); printf ("%.3f ", x); } printf ("\n"); } printf ("\n"); } #endif static bool parse_nested_variable (struct lexer *lexer, struct glm_spec *glm) { const struct variable *v = NULL; if (! lex_match_variable (lexer, glm->dict, &v)) return false; if (lex_match (lexer, T_LPAREN)) { if (! parse_nested_variable (lexer, glm)) return false; if (! lex_force_match (lexer, T_RPAREN)) return false; } lex_error (lexer, "Nested variables are not yet implemented"); return false; return true; } /* A design term is an interaction OR a nested variable */ static bool parse_design_term (struct lexer *lexer, struct glm_spec *glm) { struct interaction *iact = NULL; if (parse_design_interaction (lexer, glm->dict, &iact)) { /* Interaction parsing successful. Add to list of interactions */ glm->interactions = xrealloc (glm->interactions, sizeof *glm->interactions * ++glm->n_interactions); glm->interactions[glm->n_interactions - 1] = iact; return true; } if (parse_nested_variable (lexer, glm)) return true; return false; } /* Parse a complete DESIGN specification. A design spec is a design term, optionally followed by a comma, and another design spec. */ static bool parse_design_spec (struct lexer *lexer, struct glm_spec *glm) { if (lex_token (lexer) == T_ENDCMD || lex_token (lexer) == T_SLASH) return true; if (! parse_design_term (lexer, glm)) return false; lex_match (lexer, T_COMMA); return parse_design_spec (lexer, glm); } pspp-1.4.1/src/language/stats/automake.mk0000644000175000017500000000640613571051220017764 0ustar00blpblp00000000000000# PSPP - a program for statistical analysis. # Copyright (C) 2017 Free Software Foundation, Inc. # # 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 3 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, see . # ## Process this file with automake to produce Makefile.in -*- makefile -*- AM_CPPFLAGS += -I$(top_srcdir)/src/language/stats src_language_stats_built_sources = \ src/language/stats/crosstabs.c language_stats_sources = \ src/language/stats/aggregate.c \ src/language/stats/aggregate.h \ src/language/stats/autorecode.c \ src/language/stats/binomial.c \ src/language/stats/binomial.h \ src/language/stats/chart-category.h \ src/language/stats/chisquare.c \ src/language/stats/chisquare.h \ src/language/stats/cochran.c \ src/language/stats/cochran.h \ src/language/stats/correlations.c \ src/language/stats/descriptives.c \ src/language/stats/examine.c \ src/language/stats/factor.c \ src/language/stats/flip.c \ src/language/stats/freq.c \ src/language/stats/freq.h \ src/language/stats/frequencies.c \ src/language/stats/friedman.c \ src/language/stats/friedman.h \ src/language/stats/glm.c \ src/language/stats/graph.c \ src/language/stats/kruskal-wallis.c \ src/language/stats/kruskal-wallis.h \ src/language/stats/ks-one-sample.c \ src/language/stats/ks-one-sample.h \ src/language/stats/logistic.c \ src/language/stats/jonckheere-terpstra.c \ src/language/stats/jonckheere-terpstra.h \ src/language/stats/mann-whitney.c \ src/language/stats/mann-whitney.h \ src/language/stats/means.c \ src/language/stats/means.h \ src/language/stats/means-calc.c \ src/language/stats/means-parser.c \ src/language/stats/mcnemar.c \ src/language/stats/mcnemar.h \ src/language/stats/median.c \ src/language/stats/median.h \ src/language/stats/npar.c \ src/language/stats/npar.h \ src/language/stats/npar-summary.c \ src/language/stats/npar-summary.h \ src/language/stats/oneway.c \ src/language/stats/quick-cluster.c \ src/language/stats/rank.c \ src/language/stats/reliability.c \ src/language/stats/roc.c \ src/language/stats/roc.h \ src/language/stats/regression.c \ src/language/stats/runs.h \ src/language/stats/runs.c \ src/language/stats/sign.c \ src/language/stats/sign.h \ src/language/stats/sort-cases.c \ src/language/stats/sort-criteria.c \ src/language/stats/sort-criteria.h \ src/language/stats/t-test.h \ src/language/stats/t-test-indep.c \ src/language/stats/t-test-one-sample.c \ src/language/stats/t-test-paired.c \ src/language/stats/t-test-parser.c \ src/language/stats/wilcoxon.c \ src/language/stats/wilcoxon.h EXTRA_DIST += src/language/stats/glm.c all_q_sources += $(src_language_stats_built_sources:.c=.q) EXTRA_DIST += $(src_language_stats_built_sources:.c=.q) CLEANFILES += $(src_language_stats_built_sources) pspp-1.4.1/src/language/stats/ks-one-sample.c0000644000175000017500000002113013700645725020450 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2011 Free Software Foundation, Inc. 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 3 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, see . */ #include #include "language/stats/ks-one-sample.h" #include #include #include #include "math/sort.h" #include "data/case.h" #include "data/casereader.h" #include "data/dataset.h" #include "data/dictionary.h" #include "data/format.h" #include "data/value-labels.h" #include "data/variable.h" #include "language/stats/freq.h" #include "language/stats/npar.h" #include "libpspp/array.h" #include "libpspp/assertion.h" #include "libpspp/cast.h" #include "libpspp/compiler.h" #include "libpspp/hash-functions.h" #include "libpspp/message.h" #include "libpspp/misc.h" #include "output/pivot-table.h" #include "gl/xalloc.h" #include "gettext.h" #define N_(msgid) msgid #define _(msgid) gettext (msgid) /* The per test variable statistics */ struct ks { double obs_cc; double test_min ; double test_max; double mu; double sigma; double diff_pos; double diff_neg; double ssq; double sum; }; typedef double theoretical (const struct ks *ks, double x); typedef theoretical *theoreticalfp; static double theoretical_uniform (const struct ks *ks, double x) { return gsl_cdf_flat_P (x, ks->test_min, ks->test_max); } static double theoretical_normal (const struct ks *ks, double x) { return gsl_cdf_gaussian_P (x - ks->mu, ks->sigma); } static double theoretical_poisson (const struct ks *ks, double x) { return gsl_cdf_poisson_P (x, ks->mu); } static double theoretical_exponential (const struct ks *ks, double x) { return gsl_cdf_exponential_P (x, 1/ks->mu); } static const theoreticalfp theoreticalf[4] = { theoretical_normal, theoretical_uniform, theoretical_poisson, theoretical_exponential }; /* Return the assymptotic approximation to the significance of Z */ static double ks_asymp_sig (double z) { if (z < 0.27) return 1; if (z >= 3.1) return 0; if (z < 1) { double q = exp (-1.233701 * pow (z, -2)); return 1 - 2.506628 * (q + pow (q, 9) + pow (q, 25))/ z ; } else { double q = exp (-2 * z * z); return 2 * (q - pow (q, 4) + pow (q, 9) - pow (q, 16))/ z ; } } static void show_results (const struct ks *, const struct ks_one_sample_test *, const struct fmt_spec *); void ks_one_sample_execute (const struct dataset *ds, struct casereader *input, enum mv_class exclude, const struct npar_test *test, bool x UNUSED, double y UNUSED) { const struct dictionary *dict = dataset_dict (ds); const struct ks_one_sample_test *kst = UP_CAST (test, const struct ks_one_sample_test, parent.parent); const struct one_sample_test *ost = &kst->parent; struct ccase *c; const struct fmt_spec *wfmt = dict_get_weight_format (dict); bool warn = true; int v; struct casereader *r = casereader_clone (input); struct ks *ks = XCALLOC (ost->n_vars, struct ks); for (v = 0; v < ost->n_vars; ++v) { ks[v].obs_cc = 0; ks[v].test_min = DBL_MAX; ks[v].test_max = -DBL_MAX; ks[v].diff_pos = -DBL_MAX; ks[v].diff_neg = DBL_MAX; ks[v].sum = 0; ks[v].ssq = 0; } for (; (c = casereader_read (r)) != NULL; case_unref (c)) { const double weight = dict_get_case_weight (dict, c, &warn); for (v = 0; v < ost->n_vars; ++v) { const struct variable *var = ost->vars[v]; const union value *val = case_data (c, var); if (var_is_value_missing (var, val, exclude)) continue; minimize (&ks[v].test_min, val->f); maximize (&ks[v].test_max, val->f); ks[v].obs_cc += weight; ks[v].sum += val->f; ks[v].ssq += pow2 (val->f); } } casereader_destroy (r); for (v = 0; v < ost->n_vars; ++v) { const struct variable *var = ost->vars[v]; double cc = 0; double prev_empirical = 0; switch (kst->dist) { case KS_UNIFORM: if (kst->p[0] != SYSMIS) ks[v].test_min = kst->p[0]; if (kst->p[1] != SYSMIS) ks[v].test_max = kst->p[1]; break; case KS_NORMAL: if (kst->p[0] != SYSMIS) ks[v].mu = kst->p[0]; else ks[v].mu = ks[v].sum / ks[v].obs_cc; if (kst->p[1] != SYSMIS) ks[v].sigma = kst->p[1]; else { ks[v].sigma = ks[v].ssq - pow2 (ks[v].sum) / ks[v].obs_cc; ks[v].sigma /= ks[v].obs_cc - 1; ks[v].sigma = sqrt (ks[v].sigma); } break; case KS_POISSON: case KS_EXPONENTIAL: if (kst->p[0] != SYSMIS) ks[v].mu = ks[v].sigma = kst->p[0]; else ks[v].mu = ks[v].sigma = ks[v].sum / ks[v].obs_cc; break; default: NOT_REACHED (); } r = sort_execute_1var (casereader_clone (input), var); for (; (c = casereader_read (r)) != NULL; case_unref (c)) { double theoretical, empirical; double d, dp; const double weight = dict_get_case_weight (dict, c, &warn); const union value *val = case_data (c, var); if (var_is_value_missing (var, val, exclude)) continue; cc += weight; empirical = cc / ks[v].obs_cc; theoretical = theoreticalf[kst->dist] (&ks[v], val->f); d = empirical - theoretical; dp = prev_empirical - theoretical; if (d > 0) maximize (&ks[v].diff_pos, d); else minimize (&ks[v].diff_neg, d); if (dp > 0) maximize (&ks[v].diff_pos, dp); else minimize (&ks[v].diff_neg, dp); prev_empirical = empirical; } casereader_destroy (r); } show_results (ks, kst, wfmt); free (ks); casereader_destroy (input); } static void show_results (const struct ks *ks, const struct ks_one_sample_test *kst, const struct fmt_spec *wfmt) { struct pivot_table *table = pivot_table_create ( N_("One-Sample Kolmogorov-Smirnov Test")); pivot_table_set_weight_format (table, wfmt); struct pivot_dimension *statistics = pivot_dimension_create ( table, PIVOT_AXIS_ROW, N_("Statistics"), N_("N"), PIVOT_RC_COUNT); switch (kst->dist) { case KS_UNIFORM: pivot_category_create_group (statistics->root, N_("Uniform Parameters"), N_("Minimum"), N_("Maximum")); break; case KS_NORMAL: pivot_category_create_group (statistics->root, N_("Normal Parameters"), N_("Mean"), N_("Std. Deviation")); break; case KS_POISSON: pivot_category_create_group (statistics->root, N_("Poisson Parameters"), N_("Lambda")); break; case KS_EXPONENTIAL: pivot_category_create_group (statistics->root, N_("Exponential Parameters"), N_("Scale")); break; default: NOT_REACHED (); } pivot_category_create_group ( statistics->root, N_("Most Extreme Differences"), N_("Absolute"), N_("Positive"), N_("Negative")); pivot_category_create_leaves ( statistics->root, N_("Kolmogorov-Smirnov Z"), _("Asymp. Sig. (2-tailed)"), PIVOT_RC_SIGNIFICANCE); struct pivot_dimension *variables = pivot_dimension_create ( table, PIVOT_AXIS_COLUMN, N_("Variables")); for (size_t i = 0; i < kst->parent.n_vars; ++i) { int col = pivot_category_create_leaf ( variables->root, pivot_value_new_variable (kst->parent.vars[i])); double values[10]; size_t n = 0; values[n++] = ks[i].obs_cc; switch (kst->dist) { case KS_UNIFORM: values[n++] = ks[i].test_min; values[n++] = ks[i].test_max; break; case KS_NORMAL: values[n++] = ks[i].mu; values[n++] = ks[i].sigma; break; case KS_POISSON: case KS_EXPONENTIAL: values[n++] = ks[i].mu; break; default: NOT_REACHED (); } double abs = ks[i].diff_pos; maximize (&abs, -ks[i].diff_neg); double z = sqrt (ks[i].obs_cc) * abs; values[n++] = abs; values[n++] = ks[i].diff_pos; values[n++] = ks[i].diff_neg; values[n++] = z; values[n++] = ks_asymp_sig (z); for (size_t j = 0; j < n; j++) pivot_table_put2 (table, j, col, pivot_value_new_number (values[j])); } pivot_table_submit (table); } pspp-1.4.1/src/language/stats/mcnemar.c0000644000175000017500000001525413700645725017431 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2011 Free Software Foundation, Inc. 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 3 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, see . */ #include #include "mcnemar.h" #include #include #include "data/casereader.h" #include "data/dataset.h" #include "data/dictionary.h" #include "data/format.h" #include "data/missing-values.h" #include "data/variable.h" #include "language/stats/npar.h" #include "libpspp/str.h" #include "output/pivot-table.h" #include "libpspp/message.h" #include "gl/minmax.h" #include "gl/xalloc.h" #include "data/value.h" #include "gettext.h" #define N_(msgid) msgid #define _(msgid) gettext (msgid) struct mcnemar { union value val0; union value val1; double n00; double n01; double n10; double n11; }; static void output_freq_table (variable_pair *vp, const struct mcnemar *param, const struct dictionary *dict); static void output_statistics_table (const struct two_sample_test *t2s, const struct mcnemar *param, const struct dictionary *dict); void mcnemar_execute (const struct dataset *ds, struct casereader *input, enum mv_class exclude, const struct npar_test *test, bool exact UNUSED, double timer UNUSED) { int i; bool warn = true; const struct dictionary *dict = dataset_dict (ds); const struct two_sample_test *t2s = UP_CAST (test, const struct two_sample_test, parent); struct ccase *c; struct casereader *r = input; struct mcnemar *mc = XCALLOC (t2s->n_pairs, struct mcnemar); for (i = 0 ; i < t2s->n_pairs; ++i) { mc[i].val0.f = mc[i].val1.f = SYSMIS; } for (; (c = casereader_read (r)) != NULL; case_unref (c)) { const double weight = dict_get_case_weight (dict, c, &warn); for (i = 0 ; i < t2s->n_pairs; ++i) { variable_pair *vp = &t2s->pairs[i]; const union value *value0 = case_data (c, (*vp)[0]); const union value *value1 = case_data (c, (*vp)[1]); if (var_is_value_missing ((*vp)[0], value0, exclude)) continue; if (var_is_value_missing ((*vp)[1], value1, exclude)) continue; if (mc[i].val0.f == SYSMIS) { if (mc[i].val1.f != value0->f) mc[i].val0.f = value0->f; else if (mc[i].val1.f != value1->f) mc[i].val0.f = value1->f; } if (mc[i].val1.f == SYSMIS) { if (mc[i].val0.f != value1->f) mc[i].val1.f = value1->f; else if (mc[i].val0.f != value0->f) mc[i].val1.f = value0->f; } if (mc[i].val0.f == value0->f && mc[i].val0.f == value1->f) { mc[i].n00 += weight; } else if (mc[i].val0.f == value0->f && mc[i].val1.f == value1->f) { mc[i].n10 += weight; } else if (mc[i].val1.f == value0->f && mc[i].val0.f == value1->f) { mc[i].n01 += weight; } else if (mc[i].val1.f == value0->f && mc[i].val1.f == value1->f) { mc[i].n11 += weight; } else { msg (ME, _("The McNemar test is appropriate only for dichotomous variables")); } } } casereader_destroy (r); for (i = 0 ; i < t2s->n_pairs ; ++i) output_freq_table (&t2s->pairs[i], mc + i, dict); output_statistics_table (t2s, mc, dict); free (mc); } static char * make_pair_name (const variable_pair *pair) { return xasprintf ("%s & %s", var_to_string ((*pair)[0]), var_to_string ((*pair)[1])); } static void output_freq_table (variable_pair *vp, const struct mcnemar *param, const struct dictionary *dict) { struct pivot_table *table = pivot_table_create__ ( pivot_value_new_user_text_nocopy (make_pair_name (vp)), "Frequencies"); pivot_table_set_weight_var (table, dict_get_weight (dict)); struct pivot_dimension *vars[2]; for (int i = 0; i < 2; i++) { vars[i] = pivot_dimension_create__ ( table, i ? PIVOT_AXIS_COLUMN : PIVOT_AXIS_ROW, pivot_value_new_variable ((*vp)[i])); vars[i]->root->show_label = true; for (int j = 0; j < 2; j++) { const union value *val = j ? ¶m->val1 : ¶m->val0; pivot_category_create_leaf_rc ( vars[i]->root, pivot_value_new_var_value ((*vp)[0], val), PIVOT_RC_COUNT); } } struct entry { int idx0; int idx1; double x; } entries[] = { { 0, 0, param->n00 }, { 1, 0, param->n01 }, { 0, 1, param->n10 }, { 1, 1, param->n11 }, }; for (size_t i = 0; i < sizeof entries / sizeof *entries; i++) { const struct entry *e = &entries[i]; pivot_table_put2 (table, e->idx0, e->idx1, pivot_value_new_number (e->x)); } pivot_table_submit (table); } static void output_statistics_table (const struct two_sample_test *t2s, const struct mcnemar *mc, const struct dictionary *dict) { struct pivot_table *table = pivot_table_create (N_("Test Statistics")); pivot_table_set_weight_var (table, dict_get_weight (dict)); pivot_dimension_create (table, PIVOT_AXIS_COLUMN, N_("Statistics"), N_("N"), PIVOT_RC_COUNT, N_("Exact Sig. (2-tailed)"), PIVOT_RC_SIGNIFICANCE, N_("Exact Sig. (1-tailed)"), PIVOT_RC_SIGNIFICANCE, N_("Point Probability"), PIVOT_RC_OTHER); struct pivot_dimension *pairs = pivot_dimension_create ( table, PIVOT_AXIS_ROW, N_("Pairs")); for (size_t i = 0 ; i < t2s->n_pairs; ++i) { variable_pair *vp = &t2s->pairs[i]; int pair_idx = pivot_category_create_leaf ( pairs->root, pivot_value_new_user_text_nocopy (make_pair_name (vp))); double n = mc[i].n00 + mc[i].n01 + mc[i].n10 + mc[i].n11; double sig = gsl_cdf_binomial_P ((mc[i].n01 > mc[i].n10) ? mc[i].n10: mc[i].n01, 0.5, mc[i].n01 + mc[i].n10); double point = gsl_ran_binomial_pdf (mc[i].n01, 0.5, mc[i].n01 + mc[i].n10); double entries[] = { n, 2.0 * sig, sig, point }; for (size_t j = 0; j < sizeof entries / sizeof *entries; j++) pivot_table_put2 (table, j, pair_idx, pivot_value_new_number (entries[j])); } pivot_table_submit (table); } pspp-1.4.1/src/language/stats/aggregate.h0000644000175000017500000000336613320146056017732 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2010, 2011 Free Software Foundation, Inc. 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 3 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, see . */ #ifndef AGGREGATE_H #define AGGREGATE_H #include #include "data/format.h" #include "data/val-type.h" enum agr_src_vars { AGR_SV_NO, AGR_SV_YES, AGR_SV_OPT }; /* Aggregation functions. */ enum { SUM, MEAN, MEDIAN, SD, MAX, MIN, PGT, PLT, PIN, POUT, FGT, FLT, FIN, FOUT, N, NU, NMISS, NUMISS, FIRST, LAST, FUNC = 0x1f, /* Function mask. */ FSTRING = 1<<5, /* String function bit. */ }; /* Attributes of an aggregation function. */ struct agr_func { const char *name; /* Aggregation function name. */ const char *description; /* Translatable string describing the function. */ enum agr_src_vars src_vars; /* Whether source variables are a parameter of the function */ size_t n_args; /* Number of arguments (not including src vars). */ enum val_type alpha_type; /* When given ALPHA arguments, output type. */ struct fmt_spec format; /* Format spec if alpha_type != ALPHA. */ }; extern const struct agr_func agr_func_tab[]; #endif pspp-1.4.1/src/language/stats/means-parser.c0000644000175000017500000001432613670210420020365 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2011, 2012, 2013, 2019 Free Software Foundation, Inc. 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 3 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, see . */ #include #include "data/case.h" #include "data/casegrouper.h" #include "data/casereader.h" #include "data/dataset.h" #include "data/dictionary.h" #include "data/format.h" #include "data/variable.h" #include "language/lexer/lexer.h" #include "language/lexer/variable-parser.h" #include "libpspp/pool.h" #include "means.h" /* Parse the /TABLES stanza of the command. */ static bool parse_means_table_syntax (struct lexer *lexer, const struct means *cmd, struct mtable *table) { memset (table, 0, sizeof *table); /* Dependent variable (s) */ if (!parse_variables_const_pool (lexer, cmd->pool, cmd->dict, &table->dep_vars, &table->n_dep_vars, PV_NO_DUPLICATE | PV_NUMERIC)) return false; /* Factor variable (s) */ while (lex_match (lexer, T_BY)) { struct layer *layer = pool_zalloc (cmd->pool, sizeof *layer); table->layers = pool_nrealloc (cmd->pool, table->layers, table->n_layers + 1, sizeof *table->layers); table->layers[table->n_layers] = layer; table->n_layers++; if (!parse_variables_const_pool (lexer, cmd->pool, cmd->dict, &layer->factor_vars, &layer->n_factor_vars, PV_NO_DUPLICATE)) return false; } return true; } /* Match a variable. If the match succeeds, the variable will be placed in VAR. Returns true if successful */ static bool lex_is_variable (struct lexer *lexer, const struct dictionary *dict, int n) { const char *tstr; if (lex_next_token (lexer, n) != T_ID) return false; tstr = lex_next_tokcstr (lexer, n); if (NULL == dict_lookup_var (dict, tstr)) return false; return true; } bool means_parse (struct lexer *lexer, struct means *means) { /* Optional TABLES = */ if (lex_match_id (lexer, "TABLES")) { if (! lex_force_match (lexer, T_EQUALS)) return false; } bool more_tables = true; /* Parse the "tables" */ while (more_tables) { means->table = pool_realloc (means->pool, means->table, (means->n_tables + 1) * sizeof (*means->table)); if (! parse_means_table_syntax (lexer, means, &means->table[means->n_tables])) { return false; } means->n_tables ++; /* Look ahead to see if there are more tables to be parsed */ more_tables = false; if (T_SLASH == lex_next_token (lexer, 0)) { if (lex_is_variable (lexer, means->dict, 1)) { more_tables = true; lex_match (lexer, T_SLASH); } } } /* /MISSING subcommand */ while (lex_token (lexer) != T_ENDCMD) { lex_match (lexer, T_SLASH); if (lex_match_id (lexer, "MISSING")) { /* If no MISSING subcommand is specified, each combination of a dependent variable and categorical variables is handled separately. */ lex_match (lexer, T_EQUALS); if (lex_match_id (lexer, "INCLUDE")) { /* Use the subcommand "/MISSING=INCLUDE" to include user-missing values in the analysis. */ means->ctrl_exclude = MV_SYSTEM; means->dep_exclude = MV_SYSTEM; } else if (lex_match_id (lexer, "DEPENDENT")) /* Use the command "/MISSING=DEPENDENT" to include user-missing values for the categorical variables, while excluding them for the dependent variables. Cases are dropped only when user-missing values appear in dependent variables. User-missing values for categorical variables are treated according to their face value. Cases are ALWAYS dropped when System Missing values appear in the categorical variables. */ { means->dep_exclude = MV_ANY; means->ctrl_exclude = MV_SYSTEM; } else { lex_error (lexer, NULL); return false; } } else if (lex_match_id (lexer, "CELLS")) { lex_match (lexer, T_EQUALS); /* The default values become overwritten */ means->n_statistics = 0; pool_free (means->pool, means->statistics); means->statistics = 0; while (lex_token (lexer) != T_ENDCMD && lex_token (lexer) != T_SLASH) { if (lex_match (lexer, T_ALL)) { pool_free (means->pool, means->statistics); means->statistics = pool_calloc (means->pool, n_MEANS_STATISTICS, sizeof (*means->statistics)); means->n_statistics = n_MEANS_STATISTICS; int i; for (i = 0; i < n_MEANS_STATISTICS; ++i) { means->statistics[i] = i; } } else if (lex_match_id (lexer, "NONE")) { means->n_statistics = 0; pool_free (means->pool, means->statistics); means->statistics = 0; } else if (lex_match_id (lexer, "DEFAULT")) { pool_free (means->pool, means->statistics); means->statistics = pool_calloc (means->pool, 3, sizeof *means->statistics); means->statistics[0] = MEANS_MEAN; means->statistics[1] = MEANS_N; means->statistics[2] = MEANS_STDDEV; } else { int i; for (i = 0; i < n_MEANS_STATISTICS; ++i) { const struct cell_spec *cs = cell_spec + i; if (lex_match_id (lexer, cs->keyword)) { means->statistics = pool_realloc (means->pool, means->statistics, (means->n_statistics + 1) * sizeof (*means->statistics)); means->statistics[means->n_statistics] = i; means->n_statistics++; break; } } if (i >= n_MEANS_STATISTICS) { lex_error (lexer, NULL); return false; } } } } else { lex_error (lexer, NULL); return false; } } return true; } pspp-1.4.1/src/language/stats/examine.c0000644000175000017500000015134013670210420017414 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2012, 2013, 2016, 2019 Free Software Foundation, Inc. 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 3 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, see . */ #include #include #include #include "libpspp/assertion.h" #include "libpspp/message.h" #include "libpspp/pool.h" #include "data/dataset.h" #include "data/dictionary.h" #include "data/casegrouper.h" #include "data/casereader.h" #include "data/casewriter.h" #include "data/caseproto.h" #include "data/subcase.h" #include "data/format.h" #include "math/interaction.h" #include "math/box-whisker.h" #include "math/categoricals.h" #include "math/chart-geometry.h" #include "math/histogram.h" #include "math/moments.h" #include "math/np.h" #include "math/sort.h" #include "math/order-stats.h" #include "math/percentiles.h" #include "math/shapiro-wilk.h" #include "math/tukey-hinges.h" #include "math/trimmed-mean.h" #include "output/charts/boxplot.h" #include "output/charts/np-plot.h" #include "output/charts/spreadlevel-plot.h" #include "output/charts/plot-hist.h" #include "language/command.h" #include "language/lexer/lexer.h" #include "language/lexer/value-parser.h" #include "language/lexer/variable-parser.h" #include "output/pivot-table.h" #include "gettext.h" #define _(msgid) gettext (msgid) #define N_(msgid) msgid static void append_value_name (const struct variable *var, const union value *val, struct string *str) { var_append_value_name (var, val, str); if (var_is_value_missing (var, val, MV_ANY)) ds_put_cstr (str, _(" (missing)")); } enum bp_mode { BP_GROUPS, BP_VARIABLES }; /* Indices for the ex_proto member (below) */ enum { EX_VAL, /* value */ EX_ID, /* identity */ EX_WT /* weight */ }; #define PLOT_HISTOGRAM 0x1 #define PLOT_BOXPLOT 0x2 #define PLOT_NPPLOT 0x4 #define PLOT_SPREADLEVEL 0x8 struct examine { struct pool *pool; /* A caseproto used to contain the data subsets under examination, see (enum above) */ struct caseproto *ex_proto; size_t n_dep_vars; const struct variable **dep_vars; size_t n_iacts; struct interaction **iacts; enum mv_class dep_excl; enum mv_class fctr_excl; const struct dictionary *dict; struct categoricals *cats; /* how many extremities to display */ int disp_extremes; int calc_extremes; bool descriptives; double conf; bool missing_pw; /* The case index of the ID value (or -1) if not applicable */ size_t id_idx; int id_width; enum pc_alg pc_alg; double *ptiles; size_t n_percentiles; unsigned int plot; int sl_power; enum bp_mode boxplot_mode; const struct variable *id_var; const struct variable *wv; }; struct extremity { /* The value of this extremity */ double val; /* Either the casenumber or the value of the variable specified by the /ID subcommand which corresponds to this extremity */ union value identity; }; struct exploratory_stats { double missing; double non_missing; struct moments *mom; /* Most operations need a sorted reader/writer */ struct casewriter *sorted_writer; struct casereader *sorted_reader; struct extremity *minima; struct extremity *maxima; /* Minimum should alway equal mimima[0].val. Likewise, maximum should alway equal maxima[0].val. This redundancy exists as an optimisation effort. Some statistics (eg histogram) require early calculation of the min and max */ double minimum; double maximum; struct trimmed_mean *trimmed_mean; struct percentile *quartiles[3]; struct percentile **percentiles; struct shapiro_wilk *shapiro_wilk; struct tukey_hinges *hinges; /* The data for the NP Plots */ struct np *np; struct histogram *histogram; /* The data for the box plots */ struct box_whisker *box_whisker; /* Total weight */ double cc; /* The minimum weight */ double cmin; }; static void show_boxplot_grouped (const struct examine *cmd, int iact_idx) { int v; const struct interaction *iact = cmd->iacts[iact_idx]; const size_t n_cats = categoricals_n_count (cmd->cats, iact_idx); for (v = 0; v < cmd->n_dep_vars; ++v) { double y_min = DBL_MAX; double y_max = -DBL_MAX; int grp; struct boxplot *boxplot; struct string title; ds_init_empty (&title); if (iact->n_vars > 0) { struct string istr; ds_init_empty (&istr); interaction_to_string (iact, &istr); ds_put_format (&title, _("Boxplot of %s vs. %s"), var_to_string (cmd->dep_vars[v]), ds_cstr (&istr)); ds_destroy (&istr); } else ds_put_format (&title, _("Boxplot of %s"), var_to_string (cmd->dep_vars[v])); for (grp = 0; grp < n_cats; ++grp) { const struct exploratory_stats *es = categoricals_get_user_data_by_category_real (cmd->cats, iact_idx, grp); if (y_min > es[v].minimum) y_min = es[v].minimum; if (y_max < es[v].maximum) y_max = es[v].maximum; } boxplot = boxplot_create (y_min, y_max, ds_cstr (&title)); ds_destroy (&title); for (grp = 0; grp < n_cats; ++grp) { int ivar_idx; struct string label; const struct ccase *c = categoricals_get_case_by_category_real (cmd->cats, iact_idx, grp); struct exploratory_stats *es = categoricals_get_user_data_by_category_real (cmd->cats, iact_idx, grp); ds_init_empty (&label); for (ivar_idx = 0; ivar_idx < iact->n_vars; ++ivar_idx) { struct string l; const struct variable *ivar = iact->vars[ivar_idx]; const union value *val = case_data (c, ivar); ds_init_empty (&l); append_value_name (ivar, val, &l); ds_ltrim (&l, ss_cstr (" ")); ds_put_substring (&label, l.ss); if (ivar_idx < iact->n_vars - 1) ds_put_cstr (&label, "; "); ds_destroy (&l); } boxplot_add_box (boxplot, es[v].box_whisker, ds_cstr (&label)); es[v].box_whisker = NULL; ds_destroy (&label); } boxplot_submit (boxplot); } } static void show_boxplot_variabled (const struct examine *cmd, int iact_idx) { int grp; const struct interaction *iact = cmd->iacts[iact_idx]; const size_t n_cats = categoricals_n_count (cmd->cats, iact_idx); for (grp = 0; grp < n_cats; ++grp) { struct boxplot *boxplot; int v; double y_min = DBL_MAX; double y_max = -DBL_MAX; const struct ccase *c = categoricals_get_case_by_category_real (cmd->cats, iact_idx, grp); struct string title; ds_init_empty (&title); for (v = 0; v < cmd->n_dep_vars; ++v) { const struct exploratory_stats *es = categoricals_get_user_data_by_category_real (cmd->cats, iact_idx, grp); if (y_min > es[v].minimum) y_min = es[v].minimum; if (y_max < es[v].maximum) y_max = es[v].maximum; } if (iact->n_vars == 0) ds_put_format (&title, _("Boxplot")); else { int ivar_idx; struct string label; ds_init_empty (&label); for (ivar_idx = 0; ivar_idx < iact->n_vars; ++ivar_idx) { const struct variable *ivar = iact->vars[ivar_idx]; const union value *val = case_data (c, ivar); ds_put_cstr (&label, var_to_string (ivar)); ds_put_cstr (&label, " = "); append_value_name (ivar, val, &label); ds_put_cstr (&label, "; "); } ds_put_format (&title, _("Boxplot of %s"), ds_cstr (&label)); ds_destroy (&label); } boxplot = boxplot_create (y_min, y_max, ds_cstr (&title)); ds_destroy (&title); for (v = 0; v < cmd->n_dep_vars; ++v) { struct exploratory_stats *es = categoricals_get_user_data_by_category_real (cmd->cats, iact_idx, grp); boxplot_add_box (boxplot, es[v].box_whisker, var_to_string (cmd->dep_vars[v])); es[v].box_whisker = NULL; } boxplot_submit (boxplot); } } static void show_npplot (const struct examine *cmd, int iact_idx) { const struct interaction *iact = cmd->iacts[iact_idx]; const size_t n_cats = categoricals_n_count (cmd->cats, iact_idx); int v; for (v = 0; v < cmd->n_dep_vars; ++v) { int grp; for (grp = 0; grp < n_cats; ++grp) { struct chart_item *npp, *dnpp; struct casereader *reader; struct np *np; int ivar_idx; const struct ccase *c = categoricals_get_case_by_category_real (cmd->cats, iact_idx, grp); const struct exploratory_stats *es = categoricals_get_user_data_by_category_real (cmd->cats, iact_idx, grp); struct string label; ds_init_cstr (&label, var_to_string (cmd->dep_vars[v])); if (iact->n_vars > 0) { ds_put_cstr (&label, " ("); for (ivar_idx = 0; ivar_idx < iact->n_vars; ++ivar_idx) { const struct variable *ivar = iact->vars[ivar_idx]; const union value *val = case_data (c, ivar); ds_put_cstr (&label, var_to_string (ivar)); ds_put_cstr (&label, " = "); append_value_name (ivar, val, &label); ds_put_cstr (&label, "; "); } ds_put_cstr (&label, ")"); } np = es[v].np; reader = casewriter_make_reader (np->writer); np->writer = NULL; npp = np_plot_create (np, reader, ds_cstr (&label)); dnpp = dnp_plot_create (np, reader, ds_cstr (&label)); if (npp == NULL || dnpp == NULL) { msg (MW, _("Not creating NP plot because data set is empty.")); chart_item_unref (npp); chart_item_unref (dnpp); } else { chart_item_submit (npp); chart_item_submit (dnpp); } casereader_destroy (reader); ds_destroy (&label); } } } static void show_spreadlevel (const struct examine *cmd, int iact_idx) { const struct interaction *iact = cmd->iacts[iact_idx]; const size_t n_cats = categoricals_n_count (cmd->cats, iact_idx); int v; /* Spreadlevel when there are no levels is not useful */ if (iact->n_vars == 0) return; for (v = 0; v < cmd->n_dep_vars; ++v) { int grp; struct chart_item *sl; struct string label; ds_init_cstr (&label, var_to_string (cmd->dep_vars[v])); if (iact->n_vars > 0) { ds_put_cstr (&label, " ("); interaction_to_string (iact, &label); ds_put_cstr (&label, ")"); } sl = spreadlevel_plot_create (ds_cstr (&label), cmd->sl_power); for (grp = 0; grp < n_cats; ++grp) { const struct exploratory_stats *es = categoricals_get_user_data_by_category_real (cmd->cats, iact_idx, grp); double median = percentile_calculate (es[v].quartiles[1], cmd->pc_alg); double iqr = percentile_calculate (es[v].quartiles[2], cmd->pc_alg) - percentile_calculate (es[v].quartiles[0], cmd->pc_alg); spreadlevel_plot_add (sl, iqr, median); } if (sl == NULL) msg (MW, _("Not creating spreadlevel chart for %s"), ds_cstr (&label)); else chart_item_submit (sl); ds_destroy (&label); } } static void show_histogram (const struct examine *cmd, int iact_idx) { const struct interaction *iact = cmd->iacts[iact_idx]; const size_t n_cats = categoricals_n_count (cmd->cats, iact_idx); int v; for (v = 0; v < cmd->n_dep_vars; ++v) { int grp; for (grp = 0; grp < n_cats; ++grp) { double n, mean, var; int ivar_idx; const struct ccase *c = categoricals_get_case_by_category_real (cmd->cats, iact_idx, grp); const struct exploratory_stats *es = categoricals_get_user_data_by_category_real (cmd->cats, iact_idx, grp); struct string label; if (es[v].histogram == NULL) continue; ds_init_cstr (&label, var_to_string (cmd->dep_vars[v])); if (iact->n_vars > 0) { ds_put_cstr (&label, " ("); for (ivar_idx = 0; ivar_idx < iact->n_vars; ++ivar_idx) { const struct variable *ivar = iact->vars[ivar_idx]; const union value *val = case_data (c, ivar); ds_put_cstr (&label, var_to_string (ivar)); ds_put_cstr (&label, " = "); append_value_name (ivar, val, &label); ds_put_cstr (&label, "; "); } ds_put_cstr (&label, ")"); } moments_calculate (es[v].mom, &n, &mean, &var, NULL, NULL); chart_item_submit (histogram_chart_create (es[v].histogram->gsl_hist, ds_cstr (&label), n, mean, sqrt (var), false)); ds_destroy (&label); } } } static struct pivot_value * new_value_with_missing_footnote (const struct variable *var, const union value *value, struct pivot_footnote *missing_footnote) { struct pivot_value *pv = pivot_value_new_var_value (var, value); if (var_is_value_missing (var, value, MV_USER)) pivot_value_add_footnote (pv, missing_footnote); return pv; } static void create_interaction_dimensions (struct pivot_table *table, const struct categoricals *cats, const struct interaction *iact, struct pivot_footnote *missing_footnote) { for (size_t i = iact->n_vars; i-- > 0;) { const struct variable *var = iact->vars[i]; struct pivot_dimension *d = pivot_dimension_create__ ( table, PIVOT_AXIS_ROW, pivot_value_new_variable (var)); d->root->show_label = true; size_t n; union value *values = categoricals_get_var_values (cats, var, &n); for (size_t j = 0; j < n; j++) pivot_category_create_leaf ( d->root, new_value_with_missing_footnote (var, &values[j], missing_footnote)); } } static struct pivot_footnote * create_missing_footnote (struct pivot_table *table) { return pivot_table_create_footnote ( table, pivot_value_new_text (N_("User-missing value."))); } static void percentiles_report (const struct examine *cmd, int iact_idx) { struct pivot_table *table = pivot_table_create (N_("Percentiles")); table->omit_empty = true; struct pivot_dimension *percentiles = pivot_dimension_create ( table, PIVOT_AXIS_COLUMN, N_("Percentiles")); percentiles->root->show_label = true; for (int i = 0; i < cmd->n_percentiles; ++i) pivot_category_create_leaf ( percentiles->root, pivot_value_new_user_text_nocopy (xasprintf ("%g", cmd->ptiles[i]))); pivot_dimension_create (table, PIVOT_AXIS_ROW, N_("Statistics"), N_("Weighted Average"), N_("Tukey's Hinges")); const struct interaction *iact = cmd->iacts[iact_idx]; struct pivot_footnote *missing_footnote = create_missing_footnote (table); create_interaction_dimensions (table, cmd->cats, iact, missing_footnote); struct pivot_dimension *dep_dim = pivot_dimension_create ( table, PIVOT_AXIS_ROW, N_("Dependent Variables")); size_t *indexes = xnmalloc (table->n_dimensions, sizeof *indexes); size_t n_cats = categoricals_n_count (cmd->cats, iact_idx); for (size_t v = 0; v < cmd->n_dep_vars; ++v) { indexes[table->n_dimensions - 1] = pivot_category_create_leaf ( dep_dim->root, pivot_value_new_variable (cmd->dep_vars[v])); for (size_t i = 0; i < n_cats; ++i) { for (size_t j = 0; j < iact->n_vars; j++) { int idx = categoricals_get_value_index_by_category_real ( cmd->cats, iact_idx, i, j); indexes[table->n_dimensions - 2 - j] = idx; } const struct exploratory_stats *ess = categoricals_get_user_data_by_category_real ( cmd->cats, iact_idx, i); const struct exploratory_stats *es = ess + v; double hinges[3]; tukey_hinges_calculate (es->hinges, hinges); for (size_t pc_idx = 0; pc_idx < cmd->n_percentiles; ++pc_idx) { indexes[0] = pc_idx; indexes[1] = 0; double value = percentile_calculate (es->percentiles[pc_idx], cmd->pc_alg); pivot_table_put (table, indexes, table->n_dimensions, pivot_value_new_number (value)); double hinge = (cmd->ptiles[pc_idx] == 25.0 ? hinges[0] : cmd->ptiles[pc_idx] == 50.0 ? hinges[1] : cmd->ptiles[pc_idx] == 75.0 ? hinges[2] : SYSMIS); if (hinge != SYSMIS) { indexes[1] = 1; pivot_table_put (table, indexes, table->n_dimensions, pivot_value_new_number (hinge)); } } } } free (indexes); pivot_table_submit (table); } static void normality_report (const struct examine *cmd, int iact_idx) { struct pivot_table *table = pivot_table_create (N_("Tests of Normality")); table->omit_empty = true; struct pivot_dimension *test = pivot_dimension_create (table, PIVOT_AXIS_COLUMN, N_("Shapiro-Wilk"), N_("Statistic"), N_("df"), PIVOT_RC_COUNT, N_("Sig.")); test->root->show_label = true; const struct interaction *iact = cmd->iacts[iact_idx]; struct pivot_footnote *missing_footnote = create_missing_footnote (table); create_interaction_dimensions (table, cmd->cats, iact, missing_footnote); struct pivot_dimension *dep_dim = pivot_dimension_create ( table, PIVOT_AXIS_ROW, N_("Dependent Variables")); size_t *indexes = xnmalloc (table->n_dimensions, sizeof *indexes); size_t n_cats = categoricals_n_count (cmd->cats, iact_idx); for (size_t v = 0; v < cmd->n_dep_vars; ++v) { indexes[table->n_dimensions - 1] = pivot_category_create_leaf (dep_dim->root, pivot_value_new_variable (cmd->dep_vars[v])); for (size_t i = 0; i < n_cats; ++i) { indexes[1] = i; const struct exploratory_stats *es = categoricals_get_user_data_by_category_real ( cmd->cats, iact_idx, i); struct shapiro_wilk *sw = es[v].shapiro_wilk; if (sw == NULL) continue; double w = shapiro_wilk_calculate (sw); int j = 0; indexes[0] = j; pivot_table_put (table, indexes, table->n_dimensions, pivot_value_new_number (w)); indexes[0] = ++j; pivot_table_put (table, indexes, table->n_dimensions, pivot_value_new_number (sw->n)); indexes[0] = ++j; pivot_table_put (table, indexes, table->n_dimensions, pivot_value_new_number (shapiro_wilk_significance (sw->n, w))); } } free (indexes); pivot_table_submit (table); } static void descriptives_report (const struct examine *cmd, int iact_idx) { struct pivot_table *table = pivot_table_create (N_("Descriptives")); table->omit_empty = true; pivot_dimension_create (table, PIVOT_AXIS_COLUMN, N_("Aspect"), N_("Statistic"), N_("Std. Error")); struct pivot_dimension *statistics = pivot_dimension_create ( table, PIVOT_AXIS_ROW, N_("Statistics"), N_("Mean")); struct pivot_category *interval = pivot_category_create_group__ ( statistics->root, pivot_value_new_text_format (N_("%g%% Confidence Interval for Mean"), cmd->conf * 100.0)); pivot_category_create_leaves (interval, N_("Lower Bound"), N_("Upper Bound")); pivot_category_create_leaves ( statistics->root, N_("5% Trimmed Mean"), N_("Median"), N_("Variance"), N_("Std. Deviation"), N_("Minimum"), N_("Maximum"), N_("Range"), N_("Interquartile Range"), N_("Skewness"), N_("Kurtosis")); const struct interaction *iact = cmd->iacts[iact_idx]; struct pivot_footnote *missing_footnote = create_missing_footnote (table); create_interaction_dimensions (table, cmd->cats, iact, missing_footnote); struct pivot_dimension *dep_dim = pivot_dimension_create ( table, PIVOT_AXIS_ROW, N_("Dependent Variables")); size_t *indexes = xnmalloc (table->n_dimensions, sizeof *indexes); size_t n_cats = categoricals_n_count (cmd->cats, iact_idx); for (size_t v = 0; v < cmd->n_dep_vars; ++v) { indexes[table->n_dimensions - 1] = pivot_category_create_leaf ( dep_dim->root, pivot_value_new_variable (cmd->dep_vars[v])); for (size_t i = 0; i < n_cats; ++i) { for (size_t j = 0; j < iact->n_vars; j++) { int idx = categoricals_get_value_index_by_category_real ( cmd->cats, iact_idx, i, j); indexes[table->n_dimensions - 2 - j] = idx; } const struct exploratory_stats *ess = categoricals_get_user_data_by_category_real (cmd->cats, iact_idx, i); const struct exploratory_stats *es = ess + v; double m0, m1, m2, m3, m4; moments_calculate (es->mom, &m0, &m1, &m2, &m3, &m4); double tval = gsl_cdf_tdist_Qinv ((1.0 - cmd->conf) / 2.0, m0 - 1.0); struct entry { int stat_idx; int aspect_idx; double x; } entries[] = { { 0, 0, m1 }, { 0, 1, calc_semean (m2, m0) }, { 1, 0, m1 - tval * calc_semean (m2, m0) }, { 2, 0, m1 + tval * calc_semean (m2, m0) }, { 3, 0, trimmed_mean_calculate (es->trimmed_mean) }, { 4, 0, percentile_calculate (es->quartiles[1], cmd->pc_alg) }, { 5, 0, m2 }, { 6, 0, sqrt (m2) }, { 7, 0, es->minima[0].val }, { 8, 0, es->maxima[0].val }, { 9, 0, es->maxima[0].val - es->minima[0].val }, { 10, 0, (percentile_calculate (es->quartiles[2], cmd->pc_alg) - percentile_calculate (es->quartiles[0], cmd->pc_alg)) }, { 11, 0, m3 }, { 11, 1, calc_seskew (m0) }, { 12, 0, m4 }, { 12, 1, calc_sekurt (m0) }, }; for (size_t j = 0; j < sizeof entries / sizeof *entries; j++) { const struct entry *e = &entries[j]; indexes[0] = e->aspect_idx; indexes[1] = e->stat_idx; pivot_table_put (table, indexes, table->n_dimensions, pivot_value_new_number (e->x)); } } } free (indexes); pivot_table_submit (table); } static void extremes_report (const struct examine *cmd, int iact_idx) { struct pivot_table *table = pivot_table_create (N_("Extreme Values")); table->omit_empty = true; struct pivot_dimension *statistics = pivot_dimension_create ( table, PIVOT_AXIS_COLUMN, N_("Statistics")); pivot_category_create_leaf (statistics->root, (cmd->id_var ? pivot_value_new_variable (cmd->id_var) : pivot_value_new_text (N_("Case Number")))); pivot_category_create_leaves (statistics->root, N_("Value")); struct pivot_dimension *order = pivot_dimension_create ( table, PIVOT_AXIS_ROW, N_("Order")); for (size_t i = 0; i < cmd->disp_extremes; i++) pivot_category_create_leaf (order->root, pivot_value_new_integer (i + 1)); pivot_dimension_create (table, PIVOT_AXIS_ROW, /* TRANSLATORS: This is a noun, not an adjective. */ N_("Extreme"), N_("Highest"), N_("Lowest")); const struct interaction *iact = cmd->iacts[iact_idx]; struct pivot_footnote *missing_footnote = create_missing_footnote (table); create_interaction_dimensions (table, cmd->cats, iact, missing_footnote); struct pivot_dimension *dep_dim = pivot_dimension_create ( table, PIVOT_AXIS_ROW, N_("Dependent Variables")); size_t *indexes = xnmalloc (table->n_dimensions, sizeof *indexes); size_t n_cats = categoricals_n_count (cmd->cats, iact_idx); for (size_t v = 0; v < cmd->n_dep_vars; ++v) { indexes[table->n_dimensions - 1] = pivot_category_create_leaf ( dep_dim->root, pivot_value_new_variable (cmd->dep_vars[v])); for (size_t i = 0; i < n_cats; ++i) { for (size_t j = 0; j < iact->n_vars; j++) { int idx = categoricals_get_value_index_by_category_real ( cmd->cats, iact_idx, i, j); indexes[table->n_dimensions - 2 - j] = idx; } const struct exploratory_stats *ess = categoricals_get_user_data_by_category_real (cmd->cats, iact_idx, i); const struct exploratory_stats *es = ess + v; for (int e = 0 ; e < cmd->disp_extremes; ++e) { indexes[1] = e; for (size_t j = 0; j < 2; j++) { const struct extremity *extremity = j ? &es->minima[e] : &es->maxima[e]; indexes[2] = j; indexes[0] = 0; pivot_table_put ( table, indexes, table->n_dimensions, (cmd->id_var ? new_value_with_missing_footnote (cmd->id_var, &extremity->identity, missing_footnote) : pivot_value_new_integer (extremity->identity.f))); indexes[0] = 1; union value val = { .f = extremity->val }; pivot_table_put ( table, indexes, table->n_dimensions, new_value_with_missing_footnote (cmd->dep_vars[v], &val, missing_footnote)); } } } } free (indexes); pivot_table_submit (table); } static void summary_report (const struct examine *cmd, int iact_idx) { struct pivot_table *table = pivot_table_create ( N_("Case Processing Summary")); table->omit_empty = true; pivot_table_set_weight_var (table, dict_get_weight (cmd->dict)); pivot_dimension_create (table, PIVOT_AXIS_COLUMN, N_("Statistics"), N_("N"), PIVOT_RC_COUNT, N_("Percent"), PIVOT_RC_PERCENT); struct pivot_dimension *cases = pivot_dimension_create ( table, PIVOT_AXIS_COLUMN, N_("Cases"), N_("Valid"), N_("Missing"), N_("Total")); cases->root->show_label = true; const struct interaction *iact = cmd->iacts[iact_idx]; struct pivot_footnote *missing_footnote = create_missing_footnote (table); create_interaction_dimensions (table, cmd->cats, iact, missing_footnote); struct pivot_dimension *dep_dim = pivot_dimension_create ( table, PIVOT_AXIS_ROW, N_("Dependent Variables")); size_t *indexes = xnmalloc (table->n_dimensions, sizeof *indexes); size_t n_cats = categoricals_n_count (cmd->cats, iact_idx); for (size_t v = 0; v < cmd->n_dep_vars; ++v) { indexes[table->n_dimensions - 1] = pivot_category_create_leaf ( dep_dim->root, pivot_value_new_variable (cmd->dep_vars[v])); for (size_t i = 0; i < n_cats; ++i) { for (size_t j = 0; j < iact->n_vars; j++) { int idx = categoricals_get_value_index_by_category_real ( cmd->cats, iact_idx, i, j); indexes[table->n_dimensions - 2 - j] = idx; } const struct exploratory_stats *es = categoricals_get_user_data_by_category_real ( cmd->cats, iact_idx, i); double total = es[v].missing + es[v].non_missing; struct entry { int stat_idx; int case_idx; double x; } entries[] = { { 0, 0, es[v].non_missing }, { 1, 0, 100.0 * es[v].non_missing / total }, { 0, 1, es[v].missing }, { 1, 1, 100.0 * es[v].missing / total }, { 0, 2, total }, { 1, 2, 100.0 }, }; for (size_t j = 0; j < sizeof entries / sizeof *entries; j++) { const struct entry *e = &entries[j]; indexes[0] = e->stat_idx; indexes[1] = e->case_idx; pivot_table_put (table, indexes, table->n_dimensions, pivot_value_new_number (e->x)); } } } free (indexes); pivot_table_submit (table); } /* Attempt to parse an interaction from LEXER */ static struct interaction * parse_interaction (struct lexer *lexer, struct examine *ex) { const struct variable *v = NULL; struct interaction *iact = NULL; if (lex_match_variable (lexer, ex->dict, &v)) { iact = interaction_create (v); while (lex_match (lexer, T_BY)) { if (!lex_match_variable (lexer, ex->dict, &v)) { interaction_destroy (iact); return NULL; } interaction_add_variable (iact, v); } lex_match (lexer, T_COMMA); } return iact; } static void * create_n (const void *aux1, void *aux2 UNUSED) { int v; const struct examine *examine = aux1; struct exploratory_stats *es = pool_calloc (examine->pool, examine->n_dep_vars, sizeof (*es)); struct subcase ordering; subcase_init (&ordering, 0, 0, SC_ASCEND); for (v = 0; v < examine->n_dep_vars; v++) { es[v].sorted_writer = sort_create_writer (&ordering, examine->ex_proto); es[v].sorted_reader = NULL; es[v].mom = moments_create (MOMENT_KURTOSIS); es[v].cmin = DBL_MAX; es[v].maximum = -DBL_MAX; es[v].minimum = DBL_MAX; } subcase_destroy (&ordering); return es; } static void update_n (const void *aux1, void *aux2 UNUSED, void *user_data, const struct ccase *c, double weight) { int v; const struct examine *examine = aux1; struct exploratory_stats *es = user_data; bool this_case_is_missing = false; /* LISTWISE missing must be dealt with here */ if (!examine->missing_pw) { for (v = 0; v < examine->n_dep_vars; v++) { const struct variable *var = examine->dep_vars[v]; if (var_is_value_missing (var, case_data (c, var), examine->dep_excl)) { es[v].missing += weight; this_case_is_missing = true; } } } if (this_case_is_missing) return; for (v = 0; v < examine->n_dep_vars; v++) { struct ccase *outcase ; const struct variable *var = examine->dep_vars[v]; const double x = case_data (c, var)->f; if (var_is_value_missing (var, case_data (c, var), examine->dep_excl)) { es[v].missing += weight; continue; } outcase = case_create (examine->ex_proto); if (x > es[v].maximum) es[v].maximum = x; if (x < es[v].minimum) es[v].minimum = x; es[v].non_missing += weight; moments_pass_one (es[v].mom, x, weight); /* Save the value and the ID to the writer */ assert (examine->id_idx != -1); case_data_rw_idx (outcase, EX_VAL)->f = x; value_copy (case_data_rw_idx (outcase, EX_ID), case_data_idx (c, examine->id_idx), examine->id_width); case_data_rw_idx (outcase, EX_WT)->f = weight; es[v].cc += weight; if (es[v].cmin > weight) es[v].cmin = weight; casewriter_write (es[v].sorted_writer, outcase); } } static void calculate_n (const void *aux1, void *aux2 UNUSED, void *user_data) { int v; const struct examine *examine = aux1; struct exploratory_stats *es = user_data; for (v = 0; v < examine->n_dep_vars; v++) { int i; casenumber imin = 0; casenumber imax; struct casereader *reader; struct ccase *c; if (examine->plot & PLOT_HISTOGRAM && es[v].non_missing > 0) { /* Sturges Rule */ double bin_width = fabs (es[v].minimum - es[v].maximum) / (1 + log2 (es[v].cc)) ; es[v].histogram = histogram_create (bin_width, es[v].minimum, es[v].maximum); } es[v].sorted_reader = casewriter_make_reader (es[v].sorted_writer); es[v].sorted_writer = NULL; imax = casereader_get_case_cnt (es[v].sorted_reader); es[v].maxima = pool_calloc (examine->pool, examine->calc_extremes, sizeof (*es[v].maxima)); es[v].minima = pool_calloc (examine->pool, examine->calc_extremes, sizeof (*es[v].minima)); for (i = 0; i < examine->calc_extremes; ++i) { value_init_pool (examine->pool, &es[v].maxima[i].identity, examine->id_width) ; value_init_pool (examine->pool, &es[v].minima[i].identity, examine->id_width) ; } bool warn = true; for (reader = casereader_clone (es[v].sorted_reader); (c = casereader_read (reader)) != NULL; case_unref (c)) { const double val = case_data_idx (c, EX_VAL)->f; double wt = case_data_idx (c, EX_WT)->f; wt = var_force_valid_weight (examine->wv, wt, &warn); moments_pass_two (es[v].mom, val, wt); if (es[v].histogram) histogram_add (es[v].histogram, val, wt); if (imin < examine->calc_extremes) { int x; for (x = imin; x < examine->calc_extremes; ++x) { struct extremity *min = &es[v].minima[x]; min->val = val; value_copy (&min->identity, case_data_idx (c, EX_ID), examine->id_width); } imin ++; } imax --; if (imax < examine->calc_extremes) { int x; for (x = imax; x < imax + 1; ++x) { struct extremity *max; if (x >= examine->calc_extremes) break; max = &es[v].maxima[x]; max->val = val; value_copy (&max->identity, case_data_idx (c, EX_ID), examine->id_width); } } } casereader_destroy (reader); if (examine->calc_extremes > 0 && es[v].non_missing > 0) { assert (es[v].minima[0].val == es[v].minimum); assert (es[v].maxima[0].val == es[v].maximum); } { const int n_os = 5 + examine->n_percentiles; struct order_stats **os ; es[v].percentiles = pool_calloc (examine->pool, examine->n_percentiles, sizeof (*es[v].percentiles)); es[v].trimmed_mean = trimmed_mean_create (es[v].cc, 0.05); es[v].shapiro_wilk = NULL; os = xcalloc (n_os, sizeof *os); os[0] = &es[v].trimmed_mean->parent; es[v].quartiles[0] = percentile_create (0.25, es[v].cc); es[v].quartiles[1] = percentile_create (0.5, es[v].cc); es[v].quartiles[2] = percentile_create (0.75, es[v].cc); os[1] = &es[v].quartiles[0]->parent; os[2] = &es[v].quartiles[1]->parent; os[3] = &es[v].quartiles[2]->parent; es[v].hinges = tukey_hinges_create (es[v].cc, es[v].cmin); os[4] = &es[v].hinges->parent; for (i = 0; i < examine->n_percentiles; ++i) { es[v].percentiles[i] = percentile_create (examine->ptiles[i] / 100.00, es[v].cc); os[5 + i] = &es[v].percentiles[i]->parent; } order_stats_accumulate_idx (os, n_os, casereader_clone (es[v].sorted_reader), EX_WT, EX_VAL); free (os); } if (examine->plot & PLOT_BOXPLOT) { struct order_stats *os; es[v].box_whisker = box_whisker_create (es[v].hinges, EX_ID, examine->id_var); os = &es[v].box_whisker->parent; order_stats_accumulate_idx (&os, 1, casereader_clone (es[v].sorted_reader), EX_WT, EX_VAL); } if (examine->plot) { double mean; moments_calculate (es[v].mom, NULL, &mean, NULL, NULL, NULL); es[v].shapiro_wilk = shapiro_wilk_create (es[v].non_missing, mean); if (es[v].shapiro_wilk) { struct order_stats *os = &es[v].shapiro_wilk->parent; order_stats_accumulate_idx (&os, 1, casereader_clone (es[v].sorted_reader), EX_WT, EX_VAL); } } if (examine->plot & PLOT_NPPLOT) { double n, mean, var; struct order_stats *os; moments_calculate (es[v].mom, &n, &mean, &var, NULL, NULL); es[v].np = np_create (n, mean, var); os = &es[v].np->parent; order_stats_accumulate_idx (&os, 1, casereader_clone (es[v].sorted_reader), EX_WT, EX_VAL); } } } static void cleanup_exploratory_stats (struct examine *cmd) { int i; for (i = 0; i < cmd->n_iacts; ++i) { int v; const size_t n_cats = categoricals_n_count (cmd->cats, i); for (v = 0; v < cmd->n_dep_vars; ++v) { int grp; for (grp = 0; grp < n_cats; ++grp) { int q; const struct exploratory_stats *es = categoricals_get_user_data_by_category_real (cmd->cats, i, grp); struct order_stats *os = &es[v].hinges->parent; struct statistic *stat = &os->parent; stat->destroy (stat); for (q = 0; q < 3 ; q++) { os = &es[v].quartiles[q]->parent; stat = &os->parent; stat->destroy (stat); } for (q = 0; q < cmd->n_percentiles ; q++) { os = &es[v].percentiles[q]->parent; stat = &os->parent; stat->destroy (stat); } if (es[v].shapiro_wilk) { stat = &es[v].shapiro_wilk->parent.parent; stat->destroy (stat); } os = &es[v].trimmed_mean->parent; stat = &os->parent; stat->destroy (stat); os = &es[v].np->parent; if (os) { stat = &os->parent; stat->destroy (stat); } statistic_destroy (&es[v].histogram->parent); moments_destroy (es[v].mom); if (es[v].box_whisker) { stat = &es[v].box_whisker->parent.parent; stat->destroy (stat); } casereader_destroy (es[v].sorted_reader); } } } } static void run_examine (struct examine *cmd, struct casereader *input) { int i; struct ccase *c; struct casereader *reader; struct payload payload; payload.create = create_n; payload.update = update_n; payload.calculate = calculate_n; payload.destroy = NULL; cmd->wv = dict_get_weight (cmd->dict); cmd->cats = categoricals_create (cmd->iacts, cmd->n_iacts, cmd->wv, cmd->fctr_excl); categoricals_set_payload (cmd->cats, &payload, cmd, NULL); if (cmd->id_var == NULL) { struct ccase *c = casereader_peek (input, 0); cmd->id_idx = case_get_value_cnt (c); input = casereader_create_arithmetic_sequence (input, 1.0, 1.0); case_unref (c); } for (reader = input; (c = casereader_read (reader)) != NULL; case_unref (c)) { categoricals_update (cmd->cats, c); } casereader_destroy (reader); categoricals_done (cmd->cats); for (i = 0; i < cmd->n_iacts; ++i) { summary_report (cmd, i); const size_t n_cats = categoricals_n_count (cmd->cats, i); if (n_cats == 0) continue; if (cmd->disp_extremes > 0) extremes_report (cmd, i); if (cmd->n_percentiles > 0) percentiles_report (cmd, i); if (cmd->plot & PLOT_BOXPLOT) { switch (cmd->boxplot_mode) { case BP_GROUPS: show_boxplot_grouped (cmd, i); break; case BP_VARIABLES: show_boxplot_variabled (cmd, i); break; default: NOT_REACHED (); break; } } if (cmd->plot & PLOT_HISTOGRAM) show_histogram (cmd, i); if (cmd->plot & PLOT_NPPLOT) show_npplot (cmd, i); if (cmd->plot & PLOT_SPREADLEVEL) show_spreadlevel (cmd, i); if (cmd->descriptives) descriptives_report (cmd, i); if (cmd->plot) normality_report (cmd, i); } cleanup_exploratory_stats (cmd); categoricals_destroy (cmd->cats); } int cmd_examine (struct lexer *lexer, struct dataset *ds) { int i; bool nototals_seen = false; bool totals_seen = false; struct interaction **iacts_mem = NULL; struct examine examine; bool percentiles_seen = false; examine.missing_pw = false; examine.disp_extremes = 0; examine.calc_extremes = 0; examine.descriptives = false; examine.conf = 0.95; examine.pc_alg = PC_HAVERAGE; examine.ptiles = NULL; examine.n_percentiles = 0; examine.id_idx = -1; examine.id_width = 0; examine.id_var = NULL; examine.boxplot_mode = BP_GROUPS; examine.ex_proto = caseproto_create (); examine.pool = pool_create (); /* Allocate space for the first interaction. This is interaction is an empty one (for the totals). If no totals are requested, we will simply ignore this interaction. */ examine.n_iacts = 1; examine.iacts = iacts_mem = pool_zalloc (examine.pool, sizeof (struct interaction *)); examine.iacts[0] = interaction_create (NULL); examine.dep_excl = MV_ANY; examine.fctr_excl = MV_ANY; examine.plot = 0; examine.sl_power = 0; examine.dep_vars = NULL; examine.n_dep_vars = 0; examine.dict = dataset_dict (ds); /* Accept an optional, completely pointless "/VARIABLES=" */ lex_match (lexer, T_SLASH); if (lex_match_id (lexer, "VARIABLES")) { if (! lex_force_match (lexer, T_EQUALS)) goto error; } if (!parse_variables_const (lexer, examine.dict, &examine.dep_vars, &examine.n_dep_vars, PV_NO_DUPLICATE | PV_NUMERIC)) goto error; if (lex_match (lexer, T_BY)) { struct interaction *iact = NULL; do { iact = parse_interaction (lexer, &examine); if (iact) { examine.n_iacts++; iacts_mem = pool_nrealloc (examine.pool, iacts_mem, examine.n_iacts, sizeof (*iacts_mem)); iacts_mem[examine.n_iacts - 1] = iact; } } while (iact); } while (lex_token (lexer) != T_ENDCMD) { lex_match (lexer, T_SLASH); if (lex_match_id (lexer, "STATISTICS")) { lex_match (lexer, T_EQUALS); while (lex_token (lexer) != T_ENDCMD && lex_token (lexer) != T_SLASH) { if (lex_match_id (lexer, "DESCRIPTIVES")) { examine.descriptives = true; } else if (lex_match_id (lexer, "EXTREME")) { int extr = 5; if (lex_match (lexer, T_LPAREN)) { if (!lex_force_int (lexer)) goto error; extr = lex_integer (lexer); if (extr < 0) { msg (MW, _("%s may not be negative. Using default value (%g)."), "EXTREME", 5.0); extr = 5; } lex_get (lexer); if (! lex_force_match (lexer, T_RPAREN)) goto error; } examine.disp_extremes = extr; } else if (lex_match_id (lexer, "NONE")) { } else if (lex_match (lexer, T_ALL)) { if (examine.disp_extremes == 0) examine.disp_extremes = 5; } else { lex_error (lexer, NULL); goto error; } } } else if (lex_match_id (lexer, "PERCENTILES")) { percentiles_seen = true; if (lex_match (lexer, T_LPAREN)) { while (lex_is_number (lexer)) { double p = lex_number (lexer); if (p <= 0 || p >= 100.0) { lex_error (lexer, _("Percentiles must lie in the range (0, 100)")); goto error; } examine.n_percentiles++; examine.ptiles = xrealloc (examine.ptiles, sizeof (*examine.ptiles) * examine.n_percentiles); examine.ptiles[examine.n_percentiles - 1] = p; lex_get (lexer); lex_match (lexer, T_COMMA); } if (!lex_force_match (lexer, T_RPAREN)) goto error; } lex_match (lexer, T_EQUALS); while (lex_token (lexer) != T_ENDCMD && lex_token (lexer) != T_SLASH) { if (lex_match_id (lexer, "HAVERAGE")) { examine.pc_alg = PC_HAVERAGE; } else if (lex_match_id (lexer, "WAVERAGE")) { examine.pc_alg = PC_WAVERAGE; } else if (lex_match_id (lexer, "ROUND")) { examine.pc_alg = PC_ROUND; } else if (lex_match_id (lexer, "EMPIRICAL")) { examine.pc_alg = PC_EMPIRICAL; } else if (lex_match_id (lexer, "AEMPIRICAL")) { examine.pc_alg = PC_AEMPIRICAL; } else if (lex_match_id (lexer, "NONE")) { examine.pc_alg = PC_NONE; } else { lex_error (lexer, NULL); goto error; } } } else if (lex_match_id (lexer, "TOTAL")) { totals_seen = true; } else if (lex_match_id (lexer, "NOTOTAL")) { nototals_seen = true; } else if (lex_match_id (lexer, "MISSING")) { lex_match (lexer, T_EQUALS); while (lex_token (lexer) != T_ENDCMD && lex_token (lexer) != T_SLASH) { if (lex_match_id (lexer, "LISTWISE")) { examine.missing_pw = false; } else if (lex_match_id (lexer, "PAIRWISE")) { examine.missing_pw = true; } else if (lex_match_id (lexer, "EXCLUDE")) { examine.dep_excl = MV_ANY; } else if (lex_match_id (lexer, "INCLUDE")) { examine.dep_excl = MV_SYSTEM; } else if (lex_match_id (lexer, "REPORT")) { examine.fctr_excl = MV_NEVER; } else if (lex_match_id (lexer, "NOREPORT")) { examine.fctr_excl = MV_ANY; } else { lex_error (lexer, NULL); goto error; } } } else if (lex_match_id (lexer, "COMPARE")) { lex_match (lexer, T_EQUALS); if (lex_match_id (lexer, "VARIABLES")) { examine.boxplot_mode = BP_VARIABLES; } else if (lex_match_id (lexer, "GROUPS")) { examine.boxplot_mode = BP_GROUPS; } else { lex_error (lexer, NULL); goto error; } } else if (lex_match_id (lexer, "PLOT")) { lex_match (lexer, T_EQUALS); while (lex_token (lexer) != T_ENDCMD && lex_token (lexer) != T_SLASH) { if (lex_match_id (lexer, "BOXPLOT")) { examine.plot |= PLOT_BOXPLOT; } else if (lex_match_id (lexer, "NPPLOT")) { examine.plot |= PLOT_NPPLOT; } else if (lex_match_id (lexer, "HISTOGRAM")) { examine.plot |= PLOT_HISTOGRAM; } else if (lex_match_id (lexer, "SPREADLEVEL")) { examine.plot |= PLOT_SPREADLEVEL; examine.sl_power = 0; if (lex_match (lexer, T_LPAREN) && lex_force_int (lexer)) { examine.sl_power = lex_integer (lexer); lex_get (lexer); if (! lex_force_match (lexer, T_RPAREN)) goto error; } } else if (lex_match_id (lexer, "NONE")) { examine.plot = 0; } else if (lex_match (lexer, T_ALL)) { examine.plot = ~0; } else { lex_error (lexer, NULL); goto error; } lex_match (lexer, T_COMMA); } } else if (lex_match_id (lexer, "CINTERVAL")) { if (!lex_force_num (lexer)) goto error; examine.conf = lex_number (lexer); lex_get (lexer); } else if (lex_match_id (lexer, "ID")) { lex_match (lexer, T_EQUALS); examine.id_var = parse_variable_const (lexer, examine.dict); } else { lex_error (lexer, NULL); goto error; } } if (totals_seen && nototals_seen) { msg (SE, _("%s and %s are mutually exclusive"), "TOTAL", "NOTOTAL"); goto error; } /* If totals have been requested or if there are no factors in this analysis, then the totals need to be included. */ if (!nototals_seen || examine.n_iacts == 1) { examine.iacts = &iacts_mem[0]; } else { examine.n_iacts--; examine.iacts = &iacts_mem[1]; interaction_destroy (iacts_mem[0]); } if (examine.id_var) { examine.id_idx = var_get_case_index (examine.id_var); examine.id_width = var_get_width (examine.id_var); } examine.ex_proto = caseproto_add_width (examine.ex_proto, 0); /* value */ examine.ex_proto = caseproto_add_width (examine.ex_proto, examine.id_width); /* id */ examine.ex_proto = caseproto_add_width (examine.ex_proto, 0); /* weight */ if (examine.disp_extremes > 0) { examine.calc_extremes = examine.disp_extremes; } if (examine.descriptives && examine.calc_extremes == 0) { /* Descriptives always displays the max and min */ examine.calc_extremes = 1; } if (percentiles_seen && examine.n_percentiles == 0) { examine.n_percentiles = 7; examine.ptiles = xcalloc (examine.n_percentiles, sizeof (*examine.ptiles)); examine.ptiles[0] = 5; examine.ptiles[1] = 10; examine.ptiles[2] = 25; examine.ptiles[3] = 50; examine.ptiles[4] = 75; examine.ptiles[5] = 90; examine.ptiles[6] = 95; } assert (examine.calc_extremes >= examine.disp_extremes); { struct casegrouper *grouper; struct casereader *group; bool ok; grouper = casegrouper_create_splits (proc_open (ds), examine.dict); while (casegrouper_get_next_group (grouper, &group)) run_examine (&examine, group); ok = casegrouper_destroy (grouper); ok = proc_commit (ds) && ok; } caseproto_unref (examine.ex_proto); for (i = 0; i < examine.n_iacts; ++i) interaction_destroy (examine.iacts[i]); free (examine.ptiles); free (examine.dep_vars); pool_destroy (examine.pool); return CMD_SUCCESS; error: caseproto_unref (examine.ex_proto); examine.iacts = iacts_mem; for (i = 0; i < examine.n_iacts; ++i) interaction_destroy (examine.iacts[i]); free (examine.dep_vars); free (examine.ptiles); pool_destroy (examine.pool); return CMD_FAILURE; } pspp-1.4.1/src/language/stats/binomial.c0000644000175000017500000001602013670210420017553 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2006, 2009, 2010, 2011, 2014 Free Software Foundation, Inc. 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 3 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, see . */ #include #include "language/stats/binomial.h" #include #include #include #include "data/case.h" #include "data/casereader.h" #include "data/dataset.h" #include "data/dictionary.h" #include "data/format.h" #include "data/value-labels.h" #include "data/value.h" #include "data/variable.h" #include "language/stats/freq.h" #include "libpspp/assertion.h" #include "libpspp/compiler.h" #include "libpspp/message.h" #include "libpspp/misc.h" #include "output/pivot-table.h" #include "gl/xalloc.h" #include "gl/minmax.h" #include "gettext.h" #define N_(msgid) msgid #define _(msgid) gettext (msgid) static double calculate_binomial_internal (double n1, double n2, double p); static void swap (double *i1, double *i2) { double temp = *i1; *i1 = *i2; *i2 = temp; } static double calculate_binomial (double n1, double n2, double p) { const double n = n1 + n2; const bool test_reversed = (n1 / n > p) ; if (test_reversed) { p = 1 - p ; swap (&n1, &n2); } return calculate_binomial_internal (n1, n2, p); } static double calculate_binomial_internal (double n1, double n2, double p) { /* SPSS Statistical Algorithms has completely different and WRONG advice here. */ double sig1tailed = gsl_cdf_binomial_P (n1, p, n1 + n2); if (p == 0.5) return sig1tailed > 0.5 ? 1.0 :sig1tailed * 2.0; return sig1tailed ; } static bool do_binomial (const struct dictionary *dict, struct casereader *input, const struct one_sample_test *ost, struct freq *cat1, struct freq *cat2, enum mv_class exclude ) { const struct binomial_test *bst = UP_CAST (ost, const struct binomial_test, parent); bool warn = true; struct ccase *c; for (; (c = casereader_read (input)) != NULL; case_unref (c)) { int v; double w = dict_get_case_weight (dict, c, &warn); for (v = 0 ; v < ost->n_vars ; ++v) { const struct variable *var = ost->vars[v]; double value = case_num (c, var); if (var_is_num_missing (var, value, exclude)) continue; if (bst->cutpoint != SYSMIS) { if (cat1[v].values[0].f >= value) cat1[v].count += w; else cat2[v].count += w; } else { if (SYSMIS == cat1[v].values[0].f) { cat1[v].values[0].f = value; cat1[v].count = w; } else if (cat1[v].values[0].f == value) cat1[v].count += w; else if (SYSMIS == cat2[v].values[0].f) { cat2[v].values[0].f = value; cat2[v].count = w; } else if (cat2[v].values[0].f == value) cat2[v].count += w; else if (bst->category1 == SYSMIS) msg (ME, _("Variable %s is not dichotomous"), var_get_name (var)); } } } return casereader_destroy (input); } void binomial_execute (const struct dataset *ds, struct casereader *input, enum mv_class exclude, const struct npar_test *test, bool exact UNUSED, double timer UNUSED) { const struct dictionary *dict = dataset_dict (ds); const struct one_sample_test *ost = UP_CAST (test, const struct one_sample_test, parent); const struct binomial_test *bst = UP_CAST (ost, const struct binomial_test, parent); struct freq *cat[2]; int i; assert ((bst->category1 == SYSMIS) == (bst->category2 == SYSMIS) || bst->cutpoint != SYSMIS); for (i = 0; i < 2; i++) { double value; if (i == 0) value = bst->cutpoint != SYSMIS ? bst->cutpoint : bst->category1; else value = bst->category2; cat[i] = xnmalloc (ost->n_vars, sizeof *cat[i]); for (size_t v = 0; v < ost->n_vars; v++) { cat[i][v].values[0].f = value; cat[i][v].count = 0; } } if (do_binomial (dataset_dict (ds), input, ost, cat[0], cat[1], exclude)) { struct pivot_table *table = pivot_table_create (N_("Binomial Test")); pivot_table_set_weight_var (table, dict_get_weight (dict)); pivot_dimension_create ( table, PIVOT_AXIS_COLUMN, N_("Statistics"), N_("Category"), N_("N"), PIVOT_RC_COUNT, N_("Observed Prop."), PIVOT_RC_OTHER, N_("Test Prop."), PIVOT_RC_OTHER, (bst->p == 0.5 ? N_("Exact Sig. (2-tailed)") : N_("Exact Sig. (1-tailed)")), PIVOT_RC_SIGNIFICANCE); pivot_dimension_create (table, PIVOT_AXIS_ROW, N_("Groups"), N_("Group 1"), N_("Group 2"), N_("Total")); struct pivot_dimension *variables = pivot_dimension_create ( table, PIVOT_AXIS_ROW, N_("Variables")); for (size_t v = 0; v < ost->n_vars; ++v) { const struct variable *var = ost->vars[v]; int var_idx = pivot_category_create_leaf ( variables->root, pivot_value_new_variable (var)); /* Category. */ if (bst->cutpoint != SYSMIS) pivot_table_put3 ( table, 0, 0, var_idx, pivot_value_new_user_text_nocopy ( xasprintf ("<= %.*g", DBL_DIG + 1, bst->cutpoint))); else for (int i = 0; i < 2; i++) pivot_table_put3 ( table, 0, i, var_idx, pivot_value_new_var_value (var, cat[i][v].values)); double n_total = cat[0][v].count + cat[1][v].count; double sig = calculate_binomial (cat[0][v].count, cat[1][v].count, bst->p); struct entry { int stat_idx; int group_idx; double x; } entries[] = { /* N. */ { 1, 0, cat[0][v].count }, { 1, 1, cat[1][v].count }, { 1, 2, n_total }, /* Observed Prop. */ { 2, 0, cat[0][v].count / n_total }, { 2, 1, cat[1][v].count / n_total }, { 2, 2, 1.0 }, /* Test Prop. */ { 3, 0, bst->p }, /* Significance. */ { 4, 0, sig } }; for (size_t i = 0; i < sizeof entries / sizeof *entries; i++) { const struct entry *e = &entries[i]; pivot_table_put3 (table, e->stat_idx, e->group_idx, var_idx, pivot_value_new_number (e->x)); } } pivot_table_submit (table); } for (i = 0; i < 2; i++) free (cat[i]); } pspp-1.4.1/src/language/stats/flip.c0000644000175000017500000003276213670210420016726 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 1997-9, 2000, 2009, 2010, 2011, 2013 Free Software Foundation, Inc. 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 3 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, see . */ #include #include #include #include #include #include #include "data/case.h" #include "data/casereader.h" #include "data/casereader-provider.h" #include "data/dataset.h" #include "data/dictionary.h" #include "data/settings.h" #include "data/short-names.h" #include "data/value.h" #include "data/variable.h" #include "language/command.h" #include "language/lexer/lexer.h" #include "language/lexer/variable-parser.h" #include "libpspp/array.h" #include "libpspp/assertion.h" #include "libpspp/message.h" #include "libpspp/misc.h" #include "libpspp/pool.h" #include "libpspp/str.h" #include "data/data-in.h" #include "data/data-out.h" #include "gl/intprops.h" #include "gl/minmax.h" #include "gl/xalloc.h" #include "gettext.h" #define _(msgid) gettext (msgid) /* List of variable names. */ struct var_names { const char **names; size_t n_names, allocated_names; }; static void var_names_init (struct var_names *); static void var_names_add (struct pool *, struct var_names *, const char *); /* Represents a FLIP input program. */ struct flip_pgm { struct pool *pool; /* Pool containing FLIP data. */ size_t n_vars; /* Pre-flip number of variables. */ int n_cases; /* Pre-flip number of cases. */ struct variable *new_names_var; /* Variable with new variable names. */ const char *encoding; /* Variable names' encoding. */ struct var_names old_names; /* Variable names before FLIP. */ struct var_names new_names; /* Variable names after FLIP. */ FILE *file; /* Temporary file containing data. */ size_t cases_read; /* Number of cases already read. */ bool error; /* Error reading temporary file? */ }; static const struct casereader_class flip_casereader_class; static void destroy_flip_pgm (struct flip_pgm *); static bool flip_file (struct flip_pgm *); static void make_new_var (struct dictionary *, const char *name); /* Parses and executes FLIP. */ int cmd_flip (struct lexer *lexer, struct dataset *ds) { struct dictionary *old_dict = dataset_dict (ds); struct dictionary *new_dict = NULL; const struct variable **vars; struct flip_pgm *flip; struct casereader *input, *reader; struct ccase *c; size_t i; bool ok; if (proc_make_temporary_transformations_permanent (ds)) msg (SW, _("%s ignores %s. " "Temporary transformations will be made permanent."), "FLIP", "TEMPORARY"); flip = pool_create_container (struct flip_pgm, pool); flip->n_vars = 0; flip->n_cases = 0; flip->new_names_var = NULL; var_names_init (&flip->old_names); var_names_init (&flip->new_names); flip->file = NULL; flip->cases_read = 0; flip->error = false; lex_match (lexer, T_SLASH); if (lex_match_id (lexer, "VARIABLES")) { lex_match (lexer, T_EQUALS); if (!parse_variables_const (lexer, old_dict, &vars, &flip->n_vars, PV_NO_DUPLICATE)) goto error; lex_match (lexer, T_SLASH); } else dict_get_vars (old_dict, &vars, &flip->n_vars, DC_SYSTEM); pool_register (flip->pool, free, vars); lex_match (lexer, T_SLASH); if (lex_match_id (lexer, "NEWNAMES")) { lex_match (lexer, T_EQUALS); flip->new_names_var = parse_variable (lexer, old_dict); if (!flip->new_names_var) goto error; } else flip->new_names_var = dict_lookup_var (old_dict, "CASE_LBL"); if (flip->new_names_var) { for (i = 0; i < flip->n_vars; i++) if (vars[i] == flip->new_names_var) { remove_element (vars, flip->n_vars, sizeof *vars, i); flip->n_vars--; break; } } if (flip->n_vars <= 0) goto error; flip->file = pool_create_temp_file (flip->pool); if (flip->file == NULL) { msg (SE, _("Could not create temporary file for %s."), "FLIP"); goto error; } /* Save old variable names for use as values of CASE_LBL variable in flipped file. */ for (i = 0; i < flip->n_vars; i++) var_names_add (flip->pool, &flip->old_names, pool_strdup (flip->pool, var_get_name (vars[i]))); /* Read the active dataset into a flip_sink. */ proc_discard_output (ds); /* Save old dictionary. */ new_dict = dict_clone (old_dict); flip->encoding = dict_get_encoding (new_dict); dict_clear (new_dict); input = proc_open_filtering (ds, false); while ((c = casereader_read (input)) != NULL) { flip->n_cases++; for (i = 0; i < flip->n_vars; i++) { const struct variable *v = vars[i]; double out = var_is_numeric (v) ? case_num (c, v) : SYSMIS; fwrite (&out, sizeof out, 1, flip->file); } if (flip->new_names_var != NULL) { const union value *value = case_data (c, flip->new_names_var); const char *name; if (var_is_numeric (flip->new_names_var)) { double f = value->f; name = (f == SYSMIS ? "VSYSMIS" : f < INT_MIN ? "VNEGINF" : f > INT_MAX ? "VPOSINF" : pool_asprintf (flip->pool, "V%d", (int) f)); } else { name = data_out_pool (value, dict_get_encoding (old_dict), var_get_write_format (flip->new_names_var), flip->pool); } var_names_add (flip->pool, &flip->new_names, name); } case_unref (c); } ok = casereader_destroy (input); ok = proc_commit (ds) && ok; /* Flip the data we read. */ if (!ok || !flip_file (flip)) { dataset_clear (ds); goto error; } /* Flip the dictionary. */ dict_create_var_assert (new_dict, "CASE_LBL", 8); for (i = 0; i < flip->n_cases; i++) if (flip->new_names.n_names) make_new_var (new_dict, flip->new_names.names[i]); else { char s[3 + INT_STRLEN_BOUND (i) + 1]; sprintf (s, "VAR%03zu", i); dict_create_var_assert (new_dict, s, 0); } /* Set up flipped data for reading. */ reader = casereader_create_sequential (NULL, dict_get_proto (new_dict), flip->n_vars, &flip_casereader_class, flip); dataset_set_dict (ds, new_dict); dataset_set_source (ds, reader); return CMD_SUCCESS; error: dict_unref (new_dict); destroy_flip_pgm (flip); return CMD_CASCADING_FAILURE; } /* Destroys FLIP. */ static void destroy_flip_pgm (struct flip_pgm *flip) { if (flip != NULL) pool_destroy (flip->pool); } /* Make a new variable with base name NAME, which is bowdlerized and mangled until acceptable. */ static void make_new_var (struct dictionary *dict, const char *name_) { char *name = xstrdup (name_); char *cp; /* Trim trailing spaces. */ cp = strchr (name, '\0'); while (cp > name && isspace ((unsigned char) cp[-1])) *--cp = '\0'; /* Fix invalid characters. */ for (cp = name; *cp && cp < name + ID_MAX_LEN; cp++) if (cp == name) { if (!lex_is_id1 (*cp) || *cp == '$') *cp = 'V'; } else { if (!lex_is_idn (*cp)) *cp = '_'; } *cp = '\0'; if (strlen (name) == 0) { free (name); name = xstrdup ("v"); } /* Use the mangled name, if it is available, or add numeric extensions until we find one that is. */ if (!id_is_plausible (name, false) || !dict_create_var (dict, name, 0)) { int len = strlen (name); int i; for (i = 1; ; i++) { char n[ID_MAX_LEN + 1]; int ofs = MIN (ID_MAX_LEN - 1 - intlog10 (i), len); strncpy (n, name, ofs); sprintf (&n[ofs], "%d", i); if (id_is_plausible (n, false) && dict_create_var (dict, n, 0)) break; } } free (name); } /* Transposes the external file into a new file. */ static bool flip_file (struct flip_pgm *flip) { size_t case_bytes; size_t case_capacity; size_t case_idx; double *input_buf, *output_buf; FILE *input_file, *output_file; /* Allocate memory for many cases. */ case_bytes = flip->n_vars * sizeof *input_buf; case_capacity = settings_get_workspace () / case_bytes; if (case_capacity > flip->n_cases * 2) case_capacity = flip->n_cases * 2; if (case_capacity < 2) case_capacity = 2; for (;;) { size_t bytes = case_bytes * case_capacity; if (case_capacity > 2) input_buf = malloc (bytes); else input_buf = xmalloc (bytes); if (input_buf != NULL) break; case_capacity /= 2; if (case_capacity < 2) case_capacity = 2; } pool_register (flip->pool, free, input_buf); /* Use half the allocated memory for input_buf, half for output_buf. */ case_capacity /= 2; output_buf = input_buf + flip->n_vars * case_capacity; input_file = flip->file; if (fseeko (input_file, 0, SEEK_SET) != 0) { msg (SE, _("Error rewinding %s file: %s."), "FLIP", strerror (errno)); return false; } output_file = pool_create_temp_file (flip->pool); if (output_file == NULL) { msg (SE, _("Error creating %s source file."), "FLIP"); return false; } for (case_idx = 0; case_idx < flip->n_cases;) { unsigned long read_cases = MIN (flip->n_cases - case_idx, case_capacity); size_t i; if (read_cases != fread (input_buf, case_bytes, read_cases, input_file)) { if (ferror (input_file)) msg (SE, _("Error reading %s file: %s."), "FLIP", strerror (errno)); else msg (SE, _("Unexpected end of file reading %s file."), "FLIP"); return false; } for (i = 0; i < flip->n_vars; i++) { unsigned long j; for (j = 0; j < read_cases; j++) output_buf[j] = input_buf[i + j * flip->n_vars]; if (fseeko (output_file, sizeof *input_buf * (case_idx + (off_t) i * flip->n_cases), SEEK_SET) != 0) { msg (SE, _("Error seeking %s source file: %s."), "FLIP", strerror (errno)); return false; } if (fwrite (output_buf, sizeof *output_buf, read_cases, output_file) != read_cases) { msg (SE, _("Error writing %s source file: %s."), "FLIP", strerror (errno)); return false; } } case_idx += read_cases; } pool_fclose_temp_file (flip->pool, input_file); pool_unregister (flip->pool, input_buf); free (input_buf); if (fseeko (output_file, 0, SEEK_SET) != 0) { msg (SE, _("Error rewinding %s source file: %s."), "FLIP", strerror (errno)); return false; } flip->file = output_file; return true; } /* Reads and returns one case. Returns a null pointer at end of file or if an I/O error occurred. */ static struct ccase * flip_casereader_read (struct casereader *reader, void *flip_) { struct flip_pgm *flip = flip_; struct ccase *c; size_t i; if (flip->error || flip->cases_read >= flip->n_vars) return false; c = case_create (casereader_get_proto (reader)); data_in (ss_cstr (flip->old_names.names[flip->cases_read]), flip->encoding, FMT_A, case_data_rw_idx (c, 0), 8, flip->encoding); for (i = 0; i < flip->n_cases; i++) { double in; if (fread (&in, sizeof in, 1, flip->file) != 1) { case_unref (c); if (ferror (flip->file)) msg (SE, _("Error reading %s temporary file: %s."), "FLIP", strerror (errno)); else if (feof (flip->file)) msg (SE, _("Unexpected end of file reading %s temporary file."), "FLIP"); else NOT_REACHED (); flip->error = true; return NULL; } case_data_rw_idx (c, i + 1)->f = in; } flip->cases_read++; return c; } /* Destroys the source. Returns true if successful read, false if an I/O occurred during destruction or previously. */ static void flip_casereader_destroy (struct casereader *reader, void *flip_) { struct flip_pgm *flip = flip_; if (flip->error) casereader_force_error (reader); destroy_flip_pgm (flip); } static const struct casereader_class flip_casereader_class = { flip_casereader_read, flip_casereader_destroy, NULL, NULL, }; static void var_names_init (struct var_names *vn) { vn->names = NULL; vn->n_names = 0; vn->allocated_names = 0; } static void var_names_add (struct pool *pool, struct var_names *vn, const char *name) { if (vn->n_names >= vn->allocated_names) vn->names = pool_2nrealloc (pool, vn->names, &vn->allocated_names, sizeof *vn->names); vn->names[vn->n_names++] = name; } pspp-1.4.1/src/language/stats/freq.c0000644000175000017500000000641413405120506016725 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2006, 2009, 2010 Free Software Foundation, Inc. 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 3 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, see . */ #include #include "language/stats/freq.h" #include #include "data/variable.h" #include "data/value.h" #include "libpspp/array.h" #include "libpspp/compiler.h" struct freq * freq_clone (const struct freq *in, int values, int *widths) { int i; struct freq *f = xmalloc (sizeof (struct freq) + (sizeof (union value) * (values - 1))); f->node = in->node; f->count = in->count; for (i = 0; i < values; ++i) { value_init (&f->values[i], widths[i]); value_copy (&f->values[i], &in->values[i], widths[i]); } return f; } void freq_destroy (struct freq *f, int values, int *widths) { int i; for (i = 0; i < values; ++i) { value_destroy (&f->values[i], widths[i]); } free (f); } void freq_hmap_destroy (struct hmap *hmap, int width) { struct freq *f, *next; HMAP_FOR_EACH_SAFE (f, next, struct freq, node, hmap) { value_destroy (&f->values[0], width); hmap_delete (hmap, &f->node); free (f); } hmap_destroy (hmap); } struct freq * freq_hmap_search (struct hmap *hmap, const union value *value, int width, size_t hash) { struct freq *f; HMAP_FOR_EACH_WITH_HASH (f, struct freq, node, hash, hmap) if (value_equal (value, &f->values[0], width)) return f; return NULL; } struct freq * freq_hmap_insert (struct hmap *hmap, const union value *value, int width, size_t hash) { struct freq *f = xmalloc (sizeof *f); value_clone (&f->values[0], value, width); f->count = 0; hmap_insert (hmap, &f->node, hash); return f; } int compare_freq_ptr_3way (const void *a_, const void *b_, const void *width_) { const struct freq *const *ap = a_; const struct freq *const *bp = b_; const int *widthp = width_; return value_compare_3way (&(*ap)->values[0], &(*bp)->values[0], *widthp); } struct freq ** freq_hmap_sort (struct hmap *hmap, int width) { size_t n_entries = hmap_count (hmap); struct freq **entries; struct freq *f; size_t i; entries = xnmalloc (n_entries, sizeof *entries); i = 0; HMAP_FOR_EACH (f, struct freq, node, hmap) entries[i++] = f; assert (i == n_entries); sort (entries, n_entries, sizeof *entries, compare_freq_ptr_3way, &width); return entries; } struct freq * freq_hmap_extract (struct hmap *hmap) { struct freq *freqs, *f; size_t n_freqs; size_t i; n_freqs = hmap_count (hmap); freqs = xnmalloc (n_freqs, sizeof *freqs); i = 0; HMAP_FOR_EACH (f, struct freq, node, hmap) freqs[i++] = *f; assert (i == n_freqs); return freqs; } pspp-1.4.1/src/language/stats/descriptives.c0000644000175000017500000007752413670210420020505 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 1997-2000, 2009-2014 Free Software Foundation, Inc. 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 3 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, see . */ #include #include #include #include #include #include "data/casegrouper.h" #include "data/casereader.h" #include "data/casewriter.h" #include "data/dataset.h" #include "data/dictionary.h" #include "data/transformations.h" #include "data/variable.h" #include "language/command.h" #include "language/dictionary/split-file.h" #include "language/lexer/lexer.h" #include "language/lexer/variable-parser.h" #include "libpspp/array.h" #include "libpspp/assertion.h" #include "libpspp/compiler.h" #include "libpspp/i18n.h" #include "libpspp/message.h" #include "math/moments.h" #include "output/pivot-table.h" #include "gl/xalloc.h" #include "gettext.h" #define _(msgid) gettext (msgid) #define N_(msgid) msgid /* DESCRIPTIVES private data. */ struct dsc_proc; /* Handling of missing values. */ enum dsc_missing_type { DSC_VARIABLE, /* Handle missing values on a per-variable basis. */ DSC_LISTWISE /* Discard entire case if any variable is missing. */ }; /* Describes properties of a distribution for the purpose of calculating a Z-score. */ struct dsc_z_score { const struct variable *src_var; /* Variable on which z-score is based. */ struct variable *z_var; /* New z-score variable. */ double mean; /* Distribution mean. */ double std_dev; /* Distribution standard deviation. */ }; /* DESCRIPTIVES transformation (for calculating Z-scores). */ struct dsc_trns { struct dsc_z_score *z_scores; /* Array of Z-scores. */ int z_score_cnt; /* Number of Z-scores. */ const struct variable **vars; /* Variables for listwise missing checks. */ size_t var_cnt; /* Number of variables. */ enum dsc_missing_type missing_type; /* Treatment of missing values. */ enum mv_class exclude; /* Classes of missing values to exclude. */ const struct variable *filter; /* Dictionary FILTER BY variable. */ struct casereader *z_reader; /* Reader for count, mean, stddev. */ casenumber count; /* Number left in this SPLIT FILE group.*/ bool ok; }; /* Statistics. Used as bit indexes, so must be 32 or fewer. */ enum dsc_statistic { DSC_MEAN = 0, DSC_SEMEAN, DSC_STDDEV, DSC_VARIANCE, DSC_KURTOSIS, DSC_SEKURT, DSC_SKEWNESS, DSC_SESKEW, DSC_RANGE, DSC_MIN, DSC_MAX, DSC_SUM, DSC_N_STATS, /* Only valid as sort criteria. */ DSC_NAME = -2, /* Sort by name. */ DSC_NONE = -1 /* Unsorted. */ }; /* Describes one statistic. */ struct dsc_statistic_info { const char *identifier; /* Identifier. */ const char *name; /* Full name. */ enum moment moment; /* Highest moment needed to calculate. */ }; /* Table of statistics, indexed by DSC_*. */ static const struct dsc_statistic_info dsc_info[DSC_N_STATS] = { {"MEAN", N_("Mean"), MOMENT_MEAN}, {"SEMEAN", N_("S.E. Mean"), MOMENT_VARIANCE}, {"STDDEV", N_("Std Dev"), MOMENT_VARIANCE}, {"VARIANCE", N_("Variance"), MOMENT_VARIANCE}, {"KURTOSIS", N_("Kurtosis"), MOMENT_KURTOSIS}, {"SEKURTOSIS", N_("S.E. Kurt"), MOMENT_NONE}, {"SKEWNESS", N_("Skewness"), MOMENT_SKEWNESS}, {"SESKEWNESS", N_("S.E. Skew"), MOMENT_NONE}, {"RANGE", N_("Range"), MOMENT_NONE}, {"MINIMUM", N_("Minimum"), MOMENT_NONE}, {"MAXIMUM", N_("Maximum"), MOMENT_NONE}, {"SUM", N_("Sum"), MOMENT_MEAN}, }; /* Statistics calculated by default if none are explicitly requested. */ #define DEFAULT_STATS \ ((1ul << DSC_MEAN) | (1ul << DSC_STDDEV) | (1ul << DSC_MIN) \ | (1ul << DSC_MAX)) /* A variable specified on DESCRIPTIVES. */ struct dsc_var { const struct variable *v; /* Variable to calculate on. */ char *z_name; /* Name for z-score variable. */ double valid, missing; /* Valid, missing counts. */ struct moments *moments; /* Moments. */ double min, max; /* Maximum and mimimum values. */ double stats[DSC_N_STATS]; /* All the stats' values. */ }; /* A DESCRIPTIVES procedure. */ struct dsc_proc { /* Per-variable info. */ struct dictionary *dict; /* Dictionary. */ struct dsc_var *vars; /* Variables. */ size_t var_cnt; /* Number of variables. */ /* User options. */ enum dsc_missing_type missing_type; /* Treatment of missing values. */ enum mv_class exclude; /* Classes of missing values to exclude. */ /* Accumulated results. */ double missing_listwise; /* Sum of weights of cases missing listwise. */ double valid; /* Sum of weights of valid cases. */ bool bad_warn; /* Warn if bad weight found. */ enum dsc_statistic sort_by_stat; /* Statistic to sort by; -1: name. */ int sort_ascending; /* !0: ascending order; 0: descending. */ unsigned long show_stats; /* Statistics to display. */ unsigned long calc_stats; /* Statistics to calculate. */ enum moment max_moment; /* Highest moment needed for stats. */ /* Z scores. */ struct casewriter *z_writer; /* Mean and stddev per SPLIT FILE group. */ }; /* Parsing. */ static enum dsc_statistic match_statistic (struct lexer *); static void free_dsc_proc (struct dsc_proc *); /* Z-score functions. */ static bool try_name (const struct dictionary *dict, struct dsc_proc *dsc, const char *name); static char *generate_z_varname (const struct dictionary *dict, struct dsc_proc *dsc, const char *name, int *z_cnt); static void dump_z_table (struct dsc_proc *); static void setup_z_trns (struct dsc_proc *, struct dataset *); /* Procedure execution functions. */ static void calc_descriptives (struct dsc_proc *, struct casereader *, struct dataset *); static void display (struct dsc_proc *dsc); /* Parser and outline. */ /* Handles DESCRIPTIVES. */ int cmd_descriptives (struct lexer *lexer, struct dataset *ds) { struct dictionary *dict = dataset_dict (ds); struct dsc_proc *dsc; const struct variable **vars = NULL; size_t var_cnt = 0; int save_z_scores = 0; int z_cnt = 0; size_t i; bool ok; struct casegrouper *grouper; struct casereader *group; /* Create and initialize dsc. */ dsc = xmalloc (sizeof *dsc); dsc->dict = dict; dsc->vars = NULL; dsc->var_cnt = 0; dsc->missing_type = DSC_VARIABLE; dsc->exclude = MV_ANY; dsc->missing_listwise = 0.; dsc->valid = 0.; dsc->bad_warn = 1; dsc->sort_by_stat = DSC_NONE; dsc->sort_ascending = 1; dsc->show_stats = dsc->calc_stats = DEFAULT_STATS; dsc->z_writer = NULL; /* Parse DESCRIPTIVES. */ while (lex_token (lexer) != T_ENDCMD) { if (lex_match_id (lexer, "MISSING")) { lex_match (lexer, T_EQUALS); while (lex_token (lexer) != T_ENDCMD && lex_token (lexer) != T_SLASH) { if (lex_match_id (lexer, "VARIABLE")) dsc->missing_type = DSC_VARIABLE; else if (lex_match_id (lexer, "LISTWISE")) dsc->missing_type = DSC_LISTWISE; else if (lex_match_id (lexer, "INCLUDE")) dsc->exclude = MV_SYSTEM; else { lex_error (lexer, NULL); goto error; } lex_match (lexer, T_COMMA); } } else if (lex_match_id (lexer, "SAVE")) save_z_scores = 1; else if (lex_match_id (lexer, "FORMAT")) { lex_match (lexer, T_EQUALS); while (lex_token (lexer) != T_ENDCMD && lex_token (lexer) != T_SLASH) { if (lex_match_id (lexer, "LABELS") || lex_match_id (lexer, "NOLABELS") || lex_match_id (lexer, "INDEX") || lex_match_id (lexer, "NOINDEX") || lex_match_id (lexer, "LINE") || lex_match_id (lexer, "SERIAL")) { /* Ignore. */ } else { lex_error (lexer, NULL); goto error; } lex_match (lexer, T_COMMA); } } else if (lex_match_id (lexer, "STATISTICS")) { lex_match (lexer, T_EQUALS); dsc->show_stats = 0; while (lex_token (lexer) != T_ENDCMD && lex_token (lexer) != T_SLASH) { if (lex_match (lexer, T_ALL)) dsc->show_stats |= (1ul << DSC_N_STATS) - 1; else if (lex_match_id (lexer, "DEFAULT")) dsc->show_stats |= DEFAULT_STATS; else { enum dsc_statistic s = match_statistic (lexer); if (s == DSC_NONE) { lex_error (lexer, NULL); goto error; } dsc->show_stats |= 1ul << s; } lex_match (lexer, T_COMMA); } if (dsc->show_stats == 0) dsc->show_stats = DEFAULT_STATS; } else if (lex_match_id (lexer, "SORT")) { lex_match (lexer, T_EQUALS); if (lex_match_id (lexer, "NAME")) dsc->sort_by_stat = DSC_NAME; else { dsc->sort_by_stat = match_statistic (lexer); if (dsc->sort_by_stat == DSC_NONE) dsc->sort_by_stat = DSC_MEAN; } if (lex_match (lexer, T_LPAREN)) { if (lex_match_id (lexer, "A")) dsc->sort_ascending = 1; else if (lex_match_id (lexer, "D")) dsc->sort_ascending = 0; else lex_error (lexer, NULL); if (! lex_force_match (lexer, T_RPAREN)) goto error; } } else if (var_cnt == 0) { if (lex_next_token (lexer, 1) == T_EQUALS) { lex_match_id (lexer, "VARIABLES"); lex_match (lexer, T_EQUALS); } while (lex_token (lexer) != T_ENDCMD && lex_token (lexer) != T_SLASH) { int i; if (!parse_variables_const (lexer, dict, &vars, &var_cnt, PV_APPEND | PV_NO_DUPLICATE | PV_NUMERIC)) goto error; dsc->vars = xnrealloc ((void *)dsc->vars, var_cnt, sizeof *dsc->vars); for (i = dsc->var_cnt; i < var_cnt; i++) { struct dsc_var *dv = &dsc->vars[i]; dv->v = vars[i]; dv->z_name = NULL; dv->moments = NULL; } dsc->var_cnt = var_cnt; if (lex_match (lexer, T_LPAREN)) { if (lex_token (lexer) != T_ID) { lex_error (lexer, NULL); goto error; } if (try_name (dict, dsc, lex_tokcstr (lexer))) { struct dsc_var *dsc_var = &dsc->vars[dsc->var_cnt - 1]; dsc_var->z_name = xstrdup (lex_tokcstr (lexer)); z_cnt++; } else msg (SE, _("Z-score variable name %s would be" " a duplicate variable name."), lex_tokcstr (lexer)); lex_get (lexer); if (!lex_force_match (lexer, T_RPAREN)) goto error; } } } else { lex_error (lexer, NULL); goto error; } lex_match (lexer, T_SLASH); } if (var_cnt == 0) { msg (SE, _("No variables specified.")); goto error; } /* Construct z-score varnames, show translation table. */ if (z_cnt || save_z_scores) { struct caseproto *proto; if (save_z_scores) { int gen_cnt = 0; for (i = 0; i < dsc->var_cnt; i++) { struct dsc_var *dsc_var = &dsc->vars[i]; if (dsc_var->z_name == NULL) { const char *name = var_get_name (dsc_var->v); dsc_var->z_name = generate_z_varname (dict, dsc, name, &gen_cnt); if (dsc_var->z_name == NULL) goto error; z_cnt++; } } } /* It would be better to handle Z scores correctly (however we define that) when TEMPORARY is in effect, but in the meantime this at least prevents a use-after-free error. See bug #38786. */ if (proc_make_temporary_transformations_permanent (ds)) msg (SW, _("DESCRIPTIVES with Z scores ignores TEMPORARY. " "Temporary transformations will be made permanent.")); proto = caseproto_create (); for (i = 0; i < 1 + 2 * z_cnt; i++) proto = caseproto_add_width (proto, 0); dsc->z_writer = autopaging_writer_create (proto); caseproto_unref (proto); dump_z_table (dsc); } /* Figure out statistics to display. */ if (dsc->show_stats & (1ul << DSC_SKEWNESS)) dsc->show_stats |= 1ul << DSC_SESKEW; if (dsc->show_stats & (1ul << DSC_KURTOSIS)) dsc->show_stats |= 1ul << DSC_SEKURT; /* Figure out which statistics to calculate. */ dsc->calc_stats = dsc->show_stats; if (z_cnt > 0) dsc->calc_stats |= (1ul << DSC_MEAN) | (1ul << DSC_STDDEV); if (dsc->sort_by_stat >= 0) dsc->calc_stats |= 1ul << dsc->sort_by_stat; if (dsc->show_stats & (1ul << DSC_SESKEW)) dsc->calc_stats |= 1ul << DSC_SKEWNESS; if (dsc->show_stats & (1ul << DSC_SEKURT)) dsc->calc_stats |= 1ul << DSC_KURTOSIS; /* Figure out maximum moment needed and allocate moments for the variables. */ dsc->max_moment = MOMENT_NONE; for (i = 0; i < DSC_N_STATS; i++) if (dsc->calc_stats & (1ul << i) && dsc_info[i].moment > dsc->max_moment) dsc->max_moment = dsc_info[i].moment; if (dsc->max_moment != MOMENT_NONE) for (i = 0; i < dsc->var_cnt; i++) dsc->vars[i].moments = moments_create (dsc->max_moment); /* Data pass. */ grouper = casegrouper_create_splits (proc_open_filtering (ds, false), dict); while (casegrouper_get_next_group (grouper, &group)) calc_descriptives (dsc, group, ds); ok = casegrouper_destroy (grouper); ok = proc_commit (ds) && ok; /* Z-scoring! */ if (ok && z_cnt) setup_z_trns (dsc, ds); /* Done. */ free (vars); free_dsc_proc (dsc); return ok ? CMD_SUCCESS : CMD_CASCADING_FAILURE; error: free (vars); free_dsc_proc (dsc); return CMD_FAILURE; } /* Returns the statistic named by the current token and skips past the token. Returns DSC_NONE if no statistic is given (e.g., subcommand with no specifiers). Emits an error if the current token ID does not name a statistic. */ static enum dsc_statistic match_statistic (struct lexer *lexer) { if (lex_token (lexer) == T_ID) { enum dsc_statistic stat; for (stat = 0; stat < DSC_N_STATS; stat++) if (lex_match_id (lexer, dsc_info[stat].identifier)) return stat; lex_get (lexer); lex_error (lexer, _("expecting statistic name: reverting to default")); } return DSC_NONE; } /* Frees DSC. */ static void free_dsc_proc (struct dsc_proc *dsc) { size_t i; if (dsc == NULL) return; for (i = 0; i < dsc->var_cnt; i++) { struct dsc_var *dsc_var = &dsc->vars[i]; free (dsc_var->z_name); moments_destroy (dsc_var->moments); } casewriter_destroy (dsc->z_writer); free (dsc->vars); free (dsc); } /* Z scores. */ /* Returns false if NAME is a duplicate of any existing variable name or of any previously-declared z-var name; otherwise returns true. */ static bool try_name (const struct dictionary *dict, struct dsc_proc *dsc, const char *name) { size_t i; if (dict_lookup_var (dict, name) != NULL) return false; for (i = 0; i < dsc->var_cnt; i++) { struct dsc_var *dsc_var = &dsc->vars[i]; if (dsc_var->z_name != NULL && !utf8_strcasecmp (dsc_var->z_name, name)) return false; } return true; } /* Generates a name for a Z-score variable based on a variable named VAR_NAME, given that *Z_CNT generated variable names are known to already exist. If successful, returns the new name as a dynamically allocated string. On failure, returns NULL. */ static char * generate_z_varname (const struct dictionary *dict, struct dsc_proc *dsc, const char *var_name, int *z_cnt) { char *z_name, *trunc_name; /* Try a name based on the original variable name. */ z_name = xasprintf ("Z%s", var_name); trunc_name = utf8_encoding_trunc (z_name, dict_get_encoding (dict), ID_MAX_LEN); free (z_name); if (try_name (dict, dsc, trunc_name)) return trunc_name; free (trunc_name); /* Generate a synthetic name. */ for (;;) { char name[16]; (*z_cnt)++; if (*z_cnt <= 99) sprintf (name, "ZSC%03d", *z_cnt); else if (*z_cnt <= 108) sprintf (name, "STDZ%02d", *z_cnt - 99); else if (*z_cnt <= 117) sprintf (name, "ZZZZ%02d", *z_cnt - 108); else if (*z_cnt <= 126) sprintf (name, "ZQZQ%02d", *z_cnt - 117); else { msg (SE, _("Ran out of generic names for Z-score variables. " "There are only 126 generic names: ZSC001-ZSC0999, " "STDZ01-STDZ09, ZZZZ01-ZZZZ09, ZQZQ01-ZQZQ09.")); return NULL; } if (try_name (dict, dsc, name)) return xstrdup (name); } NOT_REACHED(); } /* Outputs a table describing the mapping between source variables and Z-score variables. */ static void dump_z_table (struct dsc_proc *dsc) { struct pivot_table *table = pivot_table_create ( N_("Mapping of Variables to Z-scores")); pivot_dimension_create (table, PIVOT_AXIS_COLUMN, N_("Names"), N_("Source"), N_("Target")); struct pivot_dimension *names = pivot_dimension_create ( table, PIVOT_AXIS_ROW, N_("Variables")); names->hide_all_labels = true; for (size_t i = 0; i < dsc->var_cnt; i++) if (dsc->vars[i].z_name != NULL) { int row = pivot_category_create_leaf (names->root, pivot_value_new_number (i)); pivot_table_put2 (table, 0, row, pivot_value_new_variable (dsc->vars[i].v)); pivot_table_put2 (table, 1, row, pivot_value_new_user_text (dsc->vars[i].z_name, -1)); } pivot_table_submit (table); } static void descriptives_set_all_sysmis_zscores (const struct dsc_trns *t, struct ccase *c) { const struct dsc_z_score *z; for (z = t->z_scores; z < t->z_scores + t->z_score_cnt; z++) case_data_rw (c, z->z_var)->f = SYSMIS; } /* Transformation function to calculate Z-scores. Will return SYSMIS if any of the following are true: 1) mean or standard deviation is SYSMIS 2) score is SYSMIS 3) score is user missing and they were not included in the original analyis. 4) any of the variables in the original analysis were missing (either system or user-missing values that weren't included). */ static int descriptives_trns_proc (void *trns_, struct ccase **c, casenumber case_idx UNUSED) { struct dsc_trns *t = trns_; struct dsc_z_score *z; const struct variable **vars; *c = case_unshare (*c); if (t->filter) { double f = case_num (*c, t->filter); if (f == 0.0 || var_is_num_missing (t->filter, f, MV_ANY)) { descriptives_set_all_sysmis_zscores (t, *c); return TRNS_CONTINUE; } } if (t->count <= 0) { struct ccase *z_case; z_case = casereader_read (t->z_reader); if (z_case) { size_t z_idx = 0; t->count = case_num_idx (z_case, z_idx++); for (z = t->z_scores; z < t->z_scores + t->z_score_cnt; z++) { z->mean = case_num_idx (z_case, z_idx++); z->std_dev = case_num_idx (z_case, z_idx++); } case_unref (z_case); } else { if (t->ok) { msg (SE, _("Internal error processing Z scores. " "Please report this to %s."), PACKAGE_BUGREPORT); t->ok = false; } descriptives_set_all_sysmis_zscores (t, *c); return TRNS_CONTINUE; } } t->count--; if (t->missing_type == DSC_LISTWISE) { assert(t->vars); for (vars = t->vars; vars < t->vars + t->var_cnt; vars++) { double score = case_num (*c, *vars); if (var_is_num_missing (*vars, score, t->exclude)) { descriptives_set_all_sysmis_zscores (t, *c); return TRNS_CONTINUE; } } } for (z = t->z_scores; z < t->z_scores + t->z_score_cnt; z++) { double input = case_num (*c, z->src_var); double *output = &case_data_rw (*c, z->z_var)->f; if (z->mean == SYSMIS || z->std_dev == SYSMIS || var_is_num_missing (z->src_var, input, t->exclude)) *output = SYSMIS; else *output = (input - z->mean) / z->std_dev; } return TRNS_CONTINUE; } /* Frees a descriptives_trns struct. */ static bool descriptives_trns_free (void *trns_) { struct dsc_trns *t = trns_; bool ok = t->ok && !casereader_error (t->z_reader); free (t->z_scores); casereader_destroy (t->z_reader); assert((t->missing_type != DSC_LISTWISE) ^ (t->vars != NULL)); free (t->vars); free (t); return ok; } /* Sets up a transformation to calculate Z scores. */ static void setup_z_trns (struct dsc_proc *dsc, struct dataset *ds) { struct dsc_trns *t; size_t cnt, i; for (cnt = i = 0; i < dsc->var_cnt; i++) if (dsc->vars[i].z_name != NULL) cnt++; t = xmalloc (sizeof *t); t->z_scores = xnmalloc (cnt, sizeof *t->z_scores); t->z_score_cnt = cnt; t->missing_type = dsc->missing_type; t->exclude = dsc->exclude; if (t->missing_type == DSC_LISTWISE) { t->var_cnt = dsc->var_cnt; t->vars = xnmalloc (t->var_cnt, sizeof *t->vars); for (i = 0; i < t->var_cnt; i++) t->vars[i] = dsc->vars[i].v; } else { t->var_cnt = 0; t->vars = NULL; } t->filter = dict_get_filter (dataset_dict (ds)); t->z_reader = casewriter_make_reader (dsc->z_writer); t->count = 0; t->ok = true; dsc->z_writer = NULL; for (cnt = i = 0; i < dsc->var_cnt; i++) { struct dsc_var *dv = &dsc->vars[i]; if (dv->z_name != NULL) { struct dsc_z_score *z; struct variable *dst_var; char *label; dst_var = dict_create_var_assert (dataset_dict (ds), dv->z_name, 0); label = xasprintf (_("Z-score of %s"),var_to_string (dv->v)); var_set_label (dst_var, label); free (label); z = &t->z_scores[cnt++]; z->src_var = dv->v; z->z_var = dst_var; } } add_transformation (ds, descriptives_trns_proc, descriptives_trns_free, t); } /* Statistical calculation. */ static bool listwise_missing (struct dsc_proc *dsc, const struct ccase *c); /* Calculates and displays descriptive statistics for the cases in CF. */ static void calc_descriptives (struct dsc_proc *dsc, struct casereader *group, struct dataset *ds) { const struct variable *filter = dict_get_filter (dataset_dict (ds)); struct casereader *pass1, *pass2; casenumber count; struct ccase *c; size_t z_idx; size_t i; c = casereader_peek (group, 0); if (c == NULL) { casereader_destroy (group); return; } output_split_file_values (ds, c); case_unref (c); group = casereader_create_filter_weight (group, dataset_dict (ds), NULL, NULL); pass1 = group; pass2 = dsc->max_moment <= MOMENT_MEAN ? NULL : casereader_clone (pass1); for (i = 0; i < dsc->var_cnt; i++) { struct dsc_var *dv = &dsc->vars[i]; dv->valid = dv->missing = 0.0; if (dv->moments != NULL) moments_clear (dv->moments); dv->min = DBL_MAX; dv->max = -DBL_MAX; } dsc->missing_listwise = 0.; dsc->valid = 0.; /* First pass to handle most of the work. */ count = 0; for (; (c = casereader_read (pass1)) != NULL; case_unref (c)) { double weight = dict_get_case_weight (dataset_dict (ds), c, NULL); if (filter) { double f = case_num (c, filter); if (f == 0.0 || var_is_num_missing (filter, f, MV_ANY)) continue; } /* Check for missing values. */ if (listwise_missing (dsc, c)) { dsc->missing_listwise += weight; if (dsc->missing_type == DSC_LISTWISE) continue; } dsc->valid += weight; for (i = 0; i < dsc->var_cnt; i++) { struct dsc_var *dv = &dsc->vars[i]; double x = case_num (c, dv->v); if (var_is_num_missing (dv->v, x, dsc->exclude)) { dv->missing += weight; continue; } if (dv->moments != NULL) moments_pass_one (dv->moments, x, weight); if (x < dv->min) dv->min = x; if (x > dv->max) dv->max = x; } count++; } if (!casereader_destroy (pass1)) { casereader_destroy (pass2); return; } /* Second pass for higher-order moments. */ if (dsc->max_moment > MOMENT_MEAN) { for (; (c = casereader_read (pass2)) != NULL; case_unref (c)) { double weight = dict_get_case_weight (dataset_dict (ds), c, NULL); if (filter) { double f = case_num (c, filter); if (f == 0.0 || var_is_num_missing (filter, f, MV_ANY)) continue; } /* Check for missing values. */ if (dsc->missing_type == DSC_LISTWISE && listwise_missing (dsc, c)) continue; for (i = 0; i < dsc->var_cnt; i++) { struct dsc_var *dv = &dsc->vars[i]; double x = case_num (c, dv->v); if (var_is_num_missing (dv->v, x, dsc->exclude)) continue; if (dv->moments != NULL) moments_pass_two (dv->moments, x, weight); } } if (!casereader_destroy (pass2)) return; } /* Calculate results. */ if (dsc->z_writer && count > 0) { c = case_create (casewriter_get_proto (dsc->z_writer)); z_idx = 0; case_data_rw_idx (c, z_idx++)->f = count; } else c = NULL; for (i = 0; i < dsc->var_cnt; i++) { struct dsc_var *dv = &dsc->vars[i]; double W; int j; for (j = 0; j < DSC_N_STATS; j++) dv->stats[j] = SYSMIS; dv->valid = W = dsc->valid - dv->missing; if (dv->moments != NULL) moments_calculate (dv->moments, NULL, &dv->stats[DSC_MEAN], &dv->stats[DSC_VARIANCE], &dv->stats[DSC_SKEWNESS], &dv->stats[DSC_KURTOSIS]); if (dsc->calc_stats & (1ul << DSC_SEMEAN) && dv->stats[DSC_VARIANCE] != SYSMIS && W > 0.) dv->stats[DSC_SEMEAN] = sqrt (dv->stats[DSC_VARIANCE]) / sqrt (W); if (dsc->calc_stats & (1ul << DSC_STDDEV) && dv->stats[DSC_VARIANCE] != SYSMIS) dv->stats[DSC_STDDEV] = sqrt (dv->stats[DSC_VARIANCE]); if (dsc->calc_stats & (1ul << DSC_SEKURT)) if (dv->stats[DSC_KURTOSIS] != SYSMIS) dv->stats[DSC_SEKURT] = calc_sekurt (W); if (dsc->calc_stats & (1ul << DSC_SESKEW) && dv->stats[DSC_SKEWNESS] != SYSMIS) dv->stats[DSC_SESKEW] = calc_seskew (W); dv->stats[DSC_RANGE] = ((dv->min == DBL_MAX || dv->max == -DBL_MAX) ? SYSMIS : dv->max - dv->min); dv->stats[DSC_MIN] = dv->min == DBL_MAX ? SYSMIS : dv->min; dv->stats[DSC_MAX] = dv->max == -DBL_MAX ? SYSMIS : dv->max; if (dsc->calc_stats & (1ul << DSC_SUM)) dv->stats[DSC_SUM] = W * dv->stats[DSC_MEAN]; if (dv->z_name && c != NULL) { case_data_rw_idx (c, z_idx++)->f = dv->stats[DSC_MEAN]; case_data_rw_idx (c, z_idx++)->f = dv->stats[DSC_STDDEV]; } } if (c != NULL) casewriter_write (dsc->z_writer, c); /* Output results. */ display (dsc); } /* Returns true if any of the descriptives variables in DSC's variable list have missing values in case C, false otherwise. */ static bool listwise_missing (struct dsc_proc *dsc, const struct ccase *c) { size_t i; for (i = 0; i < dsc->var_cnt; i++) { struct dsc_var *dv = &dsc->vars[i]; double x = case_num (c, dv->v); if (var_is_num_missing (dv->v, x, dsc->exclude)) return true; } return false; } /* Statistical display. */ static algo_compare_func descriptives_compare_dsc_vars; /* Displays a table of descriptive statistics for DSC. */ static void display (struct dsc_proc *dsc) { struct pivot_table *table = pivot_table_create ( N_("Descriptive Statistics")); pivot_table_set_weight_var (table, dict_get_weight (dsc->dict)); struct pivot_dimension *statistics = pivot_dimension_create ( table, PIVOT_AXIS_COLUMN, N_("Statistics")); pivot_category_create_leaf_rc ( statistics->root, pivot_value_new_text (N_("N")), PIVOT_RC_COUNT); for (int i = 0; i < DSC_N_STATS; i++) if (dsc->show_stats & (1ul << i)) pivot_category_create_leaf (statistics->root, pivot_value_new_text (dsc_info[i].name)); if (dsc->sort_by_stat != DSC_NONE) sort (dsc->vars, dsc->var_cnt, sizeof *dsc->vars, descriptives_compare_dsc_vars, dsc); struct pivot_dimension *variables = pivot_dimension_create ( table, PIVOT_AXIS_ROW, N_("Variable")); for (size_t i = 0; i < dsc->var_cnt; i++) { const struct dsc_var *dv = &dsc->vars[i]; int row = pivot_category_create_leaf (variables->root, pivot_value_new_variable (dv->v)); int column = 0; pivot_table_put2 (table, column++, row, pivot_value_new_number (dv->valid)); for (int j = 0; j < DSC_N_STATS; j++) if (dsc->show_stats & (1ul << j)) { union value v = { .f = dv->stats[j] }; struct pivot_value *pv = (j == DSC_MIN || j == DSC_MAX ? pivot_value_new_var_value (dv->v, &v) : pivot_value_new_number (dv->stats[j])); pivot_table_put2 (table, column++, row, pv); } } int row = pivot_category_create_leaves ( variables->root, N_("Valid N (listwise)"), N_("Missing N (listwise)")); pivot_table_put2 (table, 0, row, pivot_value_new_number (dsc->valid)); pivot_table_put2 (table, 0, row + 1, pivot_value_new_number (dsc->missing_listwise)); pivot_table_submit (table); } /* Compares `struct dsc_var's A and B according to the ordering specified by CMD. */ static int descriptives_compare_dsc_vars (const void *a_, const void *b_, const void *dsc_) { const struct dsc_var *a = a_; const struct dsc_var *b = b_; const struct dsc_proc *dsc = dsc_; int result; if (dsc->sort_by_stat == DSC_NAME) result = utf8_strcasecmp (var_get_name (a->v), var_get_name (b->v)); else { double as = a->stats[dsc->sort_by_stat]; double bs = b->stats[dsc->sort_by_stat]; result = as < bs ? -1 : as > bs; } if (!dsc->sort_ascending) result = -result; return result; } pspp-1.4.1/src/language/stats/chart-category.h0000644000175000017500000000214313717773141020723 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2017 Free Software Foundation, Inc. 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 3 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, see . */ #ifndef BARCHART_DEF_H #define BARCHART_DEF_H 1 #include struct ag_func { const char *name; const char *description; int arity; bool cumulative; double (*pre) (void); double (*calc) (double acc, double x, double w); double (*post) (double acc, double cc); double (*ppost) (double acc, double ccc); }; extern const struct ag_func ag_func[]; extern const int N_AG_FUNCS; #endif pspp-1.4.1/src/language/stats/binomial.h0000644000175000017500000000225513320146056017572 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2006 Free Software Foundation, Inc. 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 3 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, see . */ #if !binomial_h #define binomial_h 1 #include #include #include "npar.h" struct binomial_test { struct one_sample_test parent; double p; double category1; double category2; double cutpoint; }; struct casereader; struct dataset; void binomial_execute (const struct dataset *, struct casereader *, enum mv_class, const struct npar_test *, bool, double); #endif pspp-1.4.1/src/language/stats/sort-criteria.c0000644000175000017500000000610413546443556020576 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 1997-9, 2000, 2006, 2010, 2011 Free Software Foundation, Inc. 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 3 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, see . */ #include #include "language/stats/sort-criteria.h" #include #include "data/dictionary.h" #include "data/subcase.h" #include "data/variable.h" #include "language/lexer/lexer.h" #include "language/lexer/variable-parser.h" #include "libpspp/message.h" #include "gettext.h" #define _(msgid) gettext (msgid) /* Parses a list of sort fields and appends them to ORDERING, which the caller must already have initialized. Returns true if successful, false on error. If SAW_DIRECTION is nonnull, sets *SAW_DIRECTION to true if at least one parenthesized sort direction was specified, false otherwise. */ bool parse_sort_criteria (struct lexer *lexer, const struct dictionary *dict, struct subcase *ordering, const struct variable ***vars, bool *saw_direction) { const struct variable **local_vars = NULL; size_t var_cnt = 0; if (vars == NULL) vars = &local_vars; *vars = NULL; if (saw_direction != NULL) *saw_direction = false; do { size_t prev_var_cnt = var_cnt; enum subcase_direction direction; size_t i; /* Variables. */ if (!parse_variables_const (lexer, dict, vars, &var_cnt, PV_APPEND | PV_NO_SCRATCH)) goto error; /* Sort direction. */ if (lex_match (lexer, T_LPAREN)) { if (lex_match_id (lexer, "D") || lex_match_id (lexer, "DOWN")) direction = SC_DESCEND; else if (lex_match_id (lexer, "A") || lex_match_id (lexer, "UP")) direction = SC_ASCEND; else { lex_error_expecting (lexer, "A", "D"); goto error; } if (!lex_force_match (lexer, T_RPAREN)) goto error; if (saw_direction != NULL) *saw_direction = true; } else direction = SC_ASCEND; for (i = prev_var_cnt; i < var_cnt; i++) { const struct variable *var = (*vars)[i]; if (!subcase_add_var (ordering, var, direction)) msg (SW, _("Variable %s specified twice in sort criteria."), var_get_name (var)); } } while (lex_token (lexer) == T_ID && dict_lookup_var (dict, lex_tokcstr (lexer)) != NULL); free (local_vars); return true; error: free (local_vars); if (vars) *vars = NULL; return false; } pspp-1.4.1/src/language/stats/sort-criteria.h0000644000175000017500000000215713320146056020570 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 1997-9, 2000 Free Software Foundation, Inc. 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 3 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, see . */ #ifndef SORT_CRITERIA_H #define SORT_CRITERIA_H #include #include struct dictionary; struct lexer; struct variable; struct subcase; bool parse_sort_criteria (struct lexer *, const struct dictionary *, struct subcase *, const struct variable ***vars, bool *saw_direction); #endif /* sort-criteria.h */ pspp-1.4.1/src/language/stats/cochran.c0000644000175000017500000001244113670210420017401 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2010, 2011, 2014 Free Software Foundation, Inc. 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 3 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, see . */ #include #include "language/stats/cochran.h" #include #include #include #include "data/casereader.h" #include "data/dataset.h" #include "data/dictionary.h" #include "data/format.h" #include "data/val-type.h" #include "data/variable.h" #include "language/stats/npar.h" #include "libpspp/cast.h" #include "libpspp/message.h" #include "libpspp/misc.h" #include "output/pivot-table.h" #include "gettext.h" #define N_(msgid) msgid #define _(msgid) gettext (msgid) struct cochran { double success; double failure; double *hits; double *misses; const struct dictionary *dict; double cc; double df; double q; }; static void show_freqs_box (const struct one_sample_test *ost, const struct cochran *ch); static void show_sig_box (const struct cochran *ch); void cochran_execute (const struct dataset *ds, struct casereader *input, enum mv_class exclude, const struct npar_test *test, bool exact UNUSED, double timer UNUSED) { struct one_sample_test *ct = UP_CAST (test, struct one_sample_test, parent); int v; struct cochran ch; const struct dictionary *dict = dataset_dict (ds); const struct variable *weight = dict_get_weight (dict); struct ccase *c; double rowsq = 0; ch.cc = 0.0; ch.dict = dict; ch.success = SYSMIS; ch.failure = SYSMIS; ch.hits = xcalloc (ct->n_vars, sizeof *ch.hits); ch.misses = xcalloc (ct->n_vars, sizeof *ch.misses); for (; (c = casereader_read (input)); case_unref (c)) { double case_hits = 0.0; const double w = weight ? case_data (c, weight)->f: 1.0; for (v = 0; v < ct->n_vars; ++v) { const struct variable *var = ct->vars[v]; const union value *val = case_data (c, var); if (var_is_value_missing (var, val, exclude)) continue; if (ch.success == SYSMIS) { ch.success = val->f; } else if (ch.failure == SYSMIS && val->f != ch.success) { ch.failure = val->f; } if (ch.success == val->f) { ch.hits[v] += w; case_hits += w; } else if (ch.failure == val->f) { ch.misses[v] += w; } else { msg (MW, _("More than two values encountered. Cochran Q test will not be run.")); goto finish; } } ch.cc += w; rowsq += pow2 (case_hits); } casereader_destroy (input); { double c_l = 0; double c_l2 = 0; for (v = 0; v < ct->n_vars; ++v) { c_l += ch.hits[v]; c_l2 += pow2 (ch.hits[v]); } ch.q = ct->n_vars * c_l2; ch.q -= pow2 (c_l); ch.q *= ct->n_vars - 1; ch.q /= ct->n_vars * c_l - rowsq; ch.df = ct->n_vars - 1; } show_freqs_box (ct, &ch); show_sig_box (&ch); finish: free (ch.hits); free (ch.misses); } static void show_freqs_box (const struct one_sample_test *ost, const struct cochran *ct) { struct pivot_table *table = pivot_table_create (N_("Frequencies")); pivot_table_set_weight_var (table, dict_get_weight (ct->dict)); char *success = xasprintf (_("Success (%.*g)"), DBL_DIG + 1, ct->success); char *failure = xasprintf (_("Failure (%.*g)"), DBL_DIG + 1, ct->failure); struct pivot_dimension *values = pivot_dimension_create ( table, PIVOT_AXIS_COLUMN, N_("Value"), success, PIVOT_RC_COUNT, failure, PIVOT_RC_COUNT); values->root->show_label = true; free (failure); free (success); struct pivot_dimension *variables = pivot_dimension_create ( table, PIVOT_AXIS_ROW, N_("Variable")); for (size_t i = 0 ; i < ost->n_vars ; ++i) { int row = pivot_category_create_leaf ( variables->root, pivot_value_new_variable (ost->vars[i])); pivot_table_put2 (table, 0, row, pivot_value_new_number (ct->hits[i])); pivot_table_put2 (table, 1, row, pivot_value_new_number (ct->misses[i])); } pivot_table_submit (table); } static void show_sig_box (const struct cochran *ch) { struct pivot_table *table = pivot_table_create (N_("Test Statistics")); pivot_table_set_weight_format (table, dict_get_weight_format (ch->dict)); pivot_dimension_create (table, PIVOT_AXIS_COLUMN, N_("Value"), N_("Value")); pivot_dimension_create ( table, PIVOT_AXIS_ROW, N_("Statistics"), N_("N"), PIVOT_RC_COUNT, N_("Cochran's Q"), PIVOT_RC_SIGNIFICANCE, N_("df"), PIVOT_RC_INTEGER, N_("Asymp. Sig."), PIVOT_RC_SIGNIFICANCE); double sig = gsl_cdf_chisq_Q (ch->q, ch->df); double entries[] = { ch->cc, ch->q, ch->df, sig }; for (size_t i = 0; i < sizeof entries / sizeof *entries; i++) pivot_table_put2 (table, 0, i, pivot_value_new_number (entries[i])); pivot_table_submit (table); } pspp-1.4.1/src/language/stats/runs.c0000644000175000017500000002126413700645725016774 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. -*-c-*- Copyright (C) 2010, 2011, 2014 Free Software Foundation, Inc. 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 3 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, see . */ #include #include "language/stats/runs.h" #include #include #include #include "data/casegrouper.h" #include "data/casereader.h" #include "data/casewriter.h" #include "data/dataset.h" #include "data/dictionary.h" #include "data/format.h" #include "data/subcase.h" #include "data/variable.h" #include "libpspp/message.h" #include "libpspp/misc.h" #include "math/percentiles.h" #include "math/sort.h" #include "output/pivot-table.h" #include "gettext.h" #define N_(msgid) msgid #define _(msgid) gettext (msgid) struct run_state { /* The value used to dichotimise the data */ double cutpoint; /* The number of cases not less than cutpoint */ double np; /* The number of cases less than cutpoint */ double nn; /* The sum of np and nn */ double n; /* The number of runs */ long runs; /* The sign of the last case seen */ short last_sign; }; /* Return the Z statistic representing the assympototic distribution of the number of runs */ static double runs_statistic (const struct run_state *rs) { double z; double sigma; double mu = 2 * rs->np * rs->nn; mu /= rs->np + rs->nn; mu += 1.0; z = rs->runs - mu; if (rs->n < 50) { if (z <= -0.5) z += 0.5; else if (z >= 0.5) z -= 0.5; else return 0; } sigma = 2 * rs->np * rs->nn; sigma *= 2 * rs->np * rs->nn - rs->nn - rs->np; sigma /= pow2 (rs->np + rs->nn); sigma /= rs->np + rs->nn - 1.0; sigma = sqrt (sigma); z /= sigma; return z; } static void show_runs_result (const struct runs_test *, const struct run_state *, const struct dictionary *); void runs_execute (const struct dataset *ds, struct casereader *input, enum mv_class exclude, const struct npar_test *test, bool exact UNUSED, double timer UNUSED) { int v; struct ccase *c; const struct dictionary *dict = dataset_dict (ds); const struct variable *weight = dict_get_weight (dict); struct one_sample_test *otp = UP_CAST (test, struct one_sample_test, parent); struct runs_test *rt = UP_CAST (otp, struct runs_test, parent); struct run_state *rs = XCALLOC (otp->n_vars, struct run_state); switch (rt->cp_mode) { case CP_MODE: { for (v = 0; v < otp->n_vars; ++v) { bool multimodal = false; struct run_state *run = &rs[v]; double last_cc; struct casereader *group = NULL; struct casegrouper *grouper; struct casereader *reader = casereader_clone (input); const struct variable *var = otp->vars[v]; reader = sort_execute_1var (reader, var); grouper = casegrouper_create_vars (reader, &var, 1); last_cc = SYSMIS; while (casegrouper_get_next_group (grouper, &group)) { double x = SYSMIS; double cc = 0.0; struct ccase *c; for (; (c = casereader_read (group)); case_unref (c)) { const double w = weight ? case_data (c, weight)->f: 1.0; const union value *val = case_data (c, var); if (var_is_value_missing (var, val, exclude)) continue; x = val->f; cc += w; } if (cc > last_cc) { run->cutpoint = x; } else if (cc == last_cc) { multimodal = true; if (x > run->cutpoint) run->cutpoint = x; } last_cc = cc; casereader_destroy (group); } casegrouper_destroy (grouper); if (multimodal) msg (MW, _("Multiple modes exist for variable `%s'. " "Using %.*g as the threshold value."), var_get_name (var), DBL_DIG + 1, run->cutpoint); } } break; case CP_MEDIAN: { for (v = 0; v < otp->n_vars; ++v) { double cc = 0.0; struct ccase *c; struct run_state *run = &rs[v]; struct casereader *reader = casereader_clone (input); const struct variable *var = otp->vars[v]; struct casewriter *writer; struct percentile *median; struct order_stats *os; struct subcase sc; subcase_init_var (&sc, var, SC_ASCEND); writer = sort_create_writer (&sc, casereader_get_proto (reader)); for (; (c = casereader_read (reader));) { const union value *val = case_data (c, var); const double w = weight ? case_data (c, weight)->f: 1.0; if (var_is_value_missing (var, val, exclude)) { case_unref (c); continue; } cc += w; casewriter_write (writer, c); } subcase_destroy (&sc); casereader_destroy (reader); reader = casewriter_make_reader (writer); median = percentile_create (0.5, cc); os = &median->parent; order_stats_accumulate (&os, 1, reader, weight, var, exclude); run->cutpoint = percentile_calculate (median, PC_HAVERAGE); statistic_destroy (&median->parent.parent); } } break; case CP_MEAN: { struct casereader *reader = casereader_clone (input); for (; (c = casereader_read (reader)); case_unref (c)) { const double w = weight ? case_data (c, weight)->f: 1.0; for (v = 0; v < otp->n_vars; ++v) { const struct variable *var = otp->vars[v]; const union value *val = case_data (c, var); const double x = val->f; struct run_state *run = &rs[v]; if (var_is_value_missing (var, val, exclude)) continue; run->cutpoint += x * w; run->n += w; } } casereader_destroy (reader); for (v = 0; v < otp->n_vars; ++v) { struct run_state *run = &rs[v]; run->cutpoint /= run->n; } } break; case CP_CUSTOM: { for (v = 0; v < otp->n_vars; ++v) { struct run_state *run = &rs[v]; run->cutpoint = rt->cutpoint; } } break; } for (; (c = casereader_read (input)); case_unref (c)) { const double w = weight ? case_data (c, weight)->f: 1.0; for (v = 0; v < otp->n_vars; ++v) { struct run_state *run = &rs[v]; const struct variable *var = otp->vars[v]; const union value *val = case_data (c, var); double x = val->f; double d = x - run->cutpoint; short sign = 0; if (var_is_value_missing (var, val, exclude)) continue; if (d >= 0) { sign = +1; run->np += w; } else { sign = -1; run->nn += w; } if (sign != run->last_sign) run->runs++; run->last_sign = sign; } } casereader_destroy (input); for (v = 0; v < otp->n_vars; ++v) { struct run_state *run = &rs[v]; run->n = run->np + run->nn; } show_runs_result (rt, rs, dict); free (rs); } static void show_runs_result (const struct runs_test *rt, const struct run_state *rs, const struct dictionary *dict) { const struct one_sample_test *otp = &rt->parent; struct pivot_table *table = pivot_table_create (N_("Runs Test")); pivot_table_set_weight_var (table, dict_get_weight (dict)); pivot_dimension_create ( table, PIVOT_AXIS_ROW, N_("Statistics"), (rt->cp_mode == CP_CUSTOM ? N_("Test Value") : rt->cp_mode == CP_MODE ? N_("Test Value (mode)") : rt->cp_mode == CP_MEAN ? N_("Test Value (mean)") : N_("Test Value (median)")), PIVOT_RC_OTHER, N_("Cases < Test Value"), PIVOT_RC_COUNT, N_("Cases ≥ Test Value"), PIVOT_RC_COUNT, N_("Total Cases"), PIVOT_RC_COUNT, N_("Number of Runs"), PIVOT_RC_INTEGER, N_("Z"), PIVOT_RC_OTHER, N_("Asymp. Sig. (2-tailed)"), PIVOT_RC_SIGNIFICANCE); struct pivot_dimension *variables = pivot_dimension_create ( table, PIVOT_AXIS_COLUMN, N_("Variable")); for (size_t i = 0 ; i < otp->n_vars; ++i) { const struct run_state *run = &rs[i]; int col = pivot_category_create_leaf ( variables->root, pivot_value_new_variable (otp->vars[i])); double z = runs_statistic (run); double rows[] = { run->cutpoint, run->nn, run->np, run->n, run->runs, z, 2.0 * (1.0 - gsl_cdf_ugaussian_P (fabs (z))), }; for (int row = 0; row < sizeof rows / sizeof *rows; row++) pivot_table_put2 (table, row, col, pivot_value_new_number (rows[row])); } pivot_table_submit (table); } pspp-1.4.1/src/language/stats/sign.c0000644000175000017500000001276013700645725016746 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2009, 2010, 2011 Free Software Foundation, Inc. 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 3 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, see . */ #include #include "language/stats/sign.h" #include #include #include "data/casereader.h" #include "data/dataset.h" #include "data/dictionary.h" #include "data/format.h" #include "data/missing-values.h" #include "data/variable.h" #include "language/stats/npar.h" #include "libpspp/str.h" #include "output/pivot-table.h" #include "gl/minmax.h" #include "gl/xalloc.h" #include "gettext.h" #define N_(msgid) msgid #define _(msgid) gettext (msgid) struct sign_test_params { double pos; double ties; double neg; double one_tailed_sig; double point_prob; }; static int add_pair_leaf (struct pivot_dimension *dimension, variable_pair *pair) { char *label = xasprintf ("%s - %s", var_to_string ((*pair)[0]), var_to_string ((*pair)[1])); return pivot_category_create_leaf ( dimension->root, pivot_value_new_user_text_nocopy (label)); } static void output_frequency_table (const struct two_sample_test *t2s, const struct sign_test_params *param, const struct dictionary *dict) { struct pivot_table *table = pivot_table_create (N_("Frequencies")); pivot_table_set_weight_var (table, dict_get_weight (dict)); pivot_dimension_create (table, PIVOT_AXIS_COLUMN, N_("N"), N_("N"), PIVOT_RC_COUNT); pivot_dimension_create (table, PIVOT_AXIS_ROW, N_("Differences"), N_("Negative Differences"), N_("Positive Differences"), N_("Ties"), N_("Total")); struct pivot_dimension *pairs = pivot_dimension_create ( table, PIVOT_AXIS_ROW, N_("Pairs")); for (size_t i = 0 ; i < t2s->n_pairs; ++i) { variable_pair *vp = &t2s->pairs[i]; int pair_idx = add_pair_leaf (pairs, vp); const struct sign_test_params *p = ¶m[i]; double values[] = { p->neg, p->pos, p->ties, p->ties + p->neg + p->pos }; for (size_t j = 0; j < sizeof values / sizeof *values; j++) pivot_table_put3 (table, 0, j, pair_idx, pivot_value_new_number (values[j])); } pivot_table_submit (table); } static void output_statistics_table (const struct two_sample_test *t2s, const struct sign_test_params *param) { struct pivot_table *table = pivot_table_create (N_("Test Statistics")); pivot_dimension_create (table, PIVOT_AXIS_ROW, N_("Statistics"), N_("Exact Sig. (2-tailed)"), PIVOT_RC_SIGNIFICANCE, N_("Exact Sig. (1-tailed)"), PIVOT_RC_SIGNIFICANCE, N_("Point Probability"), PIVOT_RC_SIGNIFICANCE); struct pivot_dimension *pairs = pivot_dimension_create ( table, PIVOT_AXIS_COLUMN, N_("Pairs")); for (size_t i = 0 ; i < t2s->n_pairs; ++i) { variable_pair *vp = &t2s->pairs[i]; int pair_idx = add_pair_leaf (pairs, vp); const struct sign_test_params *p = ¶m[i]; double values[] = { p->one_tailed_sig * 2, p->one_tailed_sig, p->point_prob }; for (size_t j = 0; j < sizeof values / sizeof *values; j++) pivot_table_put2 (table, j, pair_idx, pivot_value_new_number (values[j])); } pivot_table_submit (table); } void sign_execute (const struct dataset *ds, struct casereader *input, enum mv_class exclude, const struct npar_test *test, bool exact UNUSED, double timer UNUSED) { int i; bool warn = true; const struct dictionary *dict = dataset_dict (ds); const struct two_sample_test *t2s = UP_CAST (test, const struct two_sample_test, parent); struct ccase *c; struct sign_test_params *stp = XCALLOC (t2s->n_pairs, struct sign_test_params); struct casereader *r = input; for (; (c = casereader_read (r)) != NULL; case_unref (c)) { const double weight = dict_get_case_weight (dict, c, &warn); for (i = 0 ; i < t2s->n_pairs; ++i) { variable_pair *vp = &t2s->pairs[i]; const union value *value0 = case_data (c, (*vp)[0]); const union value *value1 = case_data (c, (*vp)[1]); const double diff = value0->f - value1->f; if (var_is_value_missing ((*vp)[0], value0, exclude)) continue; if (var_is_value_missing ((*vp)[1], value1, exclude)) continue; if (diff > 0) stp[i].pos += weight; else if (diff < 0) stp[i].neg += weight; else stp[i].ties += weight; } } casereader_destroy (r); for (i = 0 ; i < t2s->n_pairs; ++i) { int r = MIN (stp[i].pos, stp[i].neg); stp[i].one_tailed_sig = gsl_cdf_binomial_P (r, 0.5, stp[i].pos + stp[i].neg); stp[i].point_prob = gsl_ran_binomial_pdf (r, 0.5, stp[i].pos + stp[i].neg); } output_frequency_table (t2s, stp, dict); output_statistics_table (t2s, stp); free (stp); } pspp-1.4.1/src/language/stats/chisquare.h0000644000175000017500000000261213320146056017761 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2006, 2011 Free Software Foundation, Inc. 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 3 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, see . */ #if !chisquare_h #define chisquare_h 1 #include #include #include "language/stats/npar.h" struct chisquare_test { struct one_sample_test parent; bool ranged ; /* True if this test has a range specified */ int lo; /* Lower bound of range (undefined if RANGED is false) */ int hi; /* Upper bound of range (undefined if RANGED is false) */ double *expected; int n_expected; }; struct casereader; struct dataset; void chisquare_execute (const struct dataset *ds, struct casereader *input, enum mv_class exclude, const struct npar_test *test, bool, double); #endif pspp-1.4.1/src/language/stats/t-test-one-sample.c0000644000175000017500000001534613670210420021251 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2011 Free Software Foundation, Inc. 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 3 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, see . */ #include #include "t-test.h" #include #include #include "data/variable.h" #include "data/format.h" #include "data/casereader.h" #include "data/dictionary.h" #include "libpspp/hash-functions.h" #include "libpspp/hmapx.h" #include "math/moments.h" #include "output/pivot-table.h" #include "gettext.h" #define N_(msgid) msgid #define _(msgid) gettext (msgid) struct per_var_stats { const struct variable *var; /* N, Mean, Variance */ struct moments *mom; /* Sum of the differences */ double sum_diff; }; struct one_samp { struct per_var_stats *stats; size_t n_stats; double testval; }; static void one_sample_test (const struct tt *tt, const struct one_samp *os) { struct pivot_table *table = pivot_table_create (N_("One-Sample Test")); pivot_table_set_weight_var (table, tt->wv); struct pivot_dimension *statistics = pivot_dimension_create ( table, PIVOT_AXIS_COLUMN, N_("Statistics")); struct pivot_category *group = pivot_category_create_group__ ( statistics->root, pivot_value_new_user_text_nocopy ( xasprintf (_("Test Value = %.*g"), DBL_DIG + 1, os->testval))); pivot_category_create_leaves ( group, N_("t"), PIVOT_RC_OTHER, N_("df"), PIVOT_RC_COUNT, N_("Sig. (2-tailed)"), PIVOT_RC_SIGNIFICANCE, N_("Mean Difference"), PIVOT_RC_OTHER); struct pivot_category *subgroup = pivot_category_create_group__ ( group, pivot_value_new_user_text_nocopy ( xasprintf (_("%g%% Confidence Interval of the Difference"), tt->confidence * 100.0))); pivot_category_create_leaves (subgroup, N_("Lower"), PIVOT_RC_OTHER, N_("Upper"), PIVOT_RC_OTHER); struct pivot_dimension *dep_vars = pivot_dimension_create ( table, PIVOT_AXIS_ROW, N_("Dependent Variables")); for (size_t i = 0; i < os->n_stats; i++) { const struct per_var_stats *per_var_stats = &os->stats[i]; const struct moments *m = per_var_stats->mom; int dep_var_idx = pivot_category_create_leaf ( dep_vars->root, pivot_value_new_variable (per_var_stats->var)); double cc, mean, sigma; moments_calculate (m, &cc, &mean, &sigma, NULL, NULL); double tval = (mean - os->testval) * sqrt (cc / sigma); double mean_diff = per_var_stats->sum_diff / cc; double se_mean = sqrt (sigma / cc); double df = cc - 1.0; double p = gsl_cdf_tdist_P (tval, df); double q = gsl_cdf_tdist_Q (tval, df); double sig = 2.0 * (tval > 0 ? q : p); double tval_qinv = gsl_cdf_tdist_Qinv ((1.0 - tt->confidence) / 2.0, df); double lower = mean_diff - tval_qinv * se_mean; double upper = mean_diff + tval_qinv * se_mean; double entries[] = { tval, df, sig, mean_diff, lower, upper }; for (size_t j = 0; j < sizeof entries / sizeof *entries; j++) pivot_table_put2 (table, j, dep_var_idx, pivot_value_new_number (entries[j])); } pivot_table_submit (table); } static void one_sample_summary (const struct tt *tt, const struct one_samp *os) { struct pivot_table *table = pivot_table_create (N_("One-Sample Statistics")); pivot_table_set_weight_var (table, tt->wv); pivot_dimension_create (table, PIVOT_AXIS_COLUMN, N_("Statistics"), N_("N"), PIVOT_RC_COUNT, N_("Mean"), PIVOT_RC_OTHER, N_("Std. Deviation"), PIVOT_RC_OTHER, N_("S.E. Mean"), PIVOT_RC_OTHER); struct pivot_dimension *variables = pivot_dimension_create ( table, PIVOT_AXIS_ROW, N_("Variables")); for (size_t i = 0; i < os->n_stats; i++) { const struct per_var_stats *per_var_stats = &os->stats[i]; const struct moments *m = per_var_stats->mom; int var_idx = pivot_category_create_leaf ( variables->root, pivot_value_new_variable (per_var_stats->var)); double cc, mean, sigma; moments_calculate (m, &cc, &mean, &sigma, NULL, NULL); double entries[] = { cc, mean, sqrt (sigma), sqrt (sigma / cc) }; for (size_t j = 0; j < sizeof entries / sizeof *entries; j++) pivot_table_put2 (table, j, var_idx, pivot_value_new_number (entries[j])); } pivot_table_submit (table); } void one_sample_run (const struct tt *tt, double testval, struct casereader *reader) { struct one_samp os; os.testval = testval; os.stats = xcalloc (tt->n_vars, sizeof *os.stats); os.n_stats = tt->n_vars; for (size_t i = 0; i < tt->n_vars; ++i) { struct per_var_stats *per_var_stats = &os.stats[i]; per_var_stats->var = tt->vars[i]; per_var_stats->mom = moments_create (MOMENT_VARIANCE); } struct casereader *r = casereader_clone (reader); struct ccase *c; for (; (c = casereader_read (r)); case_unref (c)) { double w = dict_get_case_weight (tt->dict, c, NULL); for (size_t i = 0; i < os.n_stats; i++) { const struct per_var_stats *per_var_stats = &os.stats[i]; const struct variable *var = per_var_stats->var; const union value *val = case_data (c, var); if (var_is_value_missing (var, val, tt->exclude)) continue; moments_pass_one (per_var_stats->mom, val->f, w); } } casereader_destroy (r); r = reader; for (; (c = casereader_read (r)); case_unref (c)) { double w = dict_get_case_weight (tt->dict, c, NULL); for (size_t i = 0; i < os.n_stats; i++) { struct per_var_stats *per_var_stats = &os.stats[i]; const struct variable *var = per_var_stats->var; const union value *val = case_data (c, var); if (var_is_value_missing (var, val, tt->exclude)) continue; moments_pass_two (per_var_stats->mom, val->f, w); per_var_stats->sum_diff += w * (val->f - os.testval); } } casereader_destroy (r); one_sample_summary (tt, &os); one_sample_test (tt, &os); for (size_t i = 0; i < os.n_stats; i++) { const struct per_var_stats *per_var_stats = &os.stats[i]; moments_destroy (per_var_stats->mom); } free (os.stats); } pspp-1.4.1/src/language/stats/cochran.h0000644000175000017500000000204013320146056017405 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2010, 2011 Free Software Foundation, Inc. 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 3 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, see . */ #if !cochran_h #define cochran_h 1 #include #include #include "language/stats/npar.h" void cochran_execute (const struct dataset *ds, struct casereader *input, enum mv_class exclude, const struct npar_test *test, bool, double); #endif pspp-1.4.1/src/language/stats/aggregate.c0000644000175000017500000007402213670210420017715 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 1997-9, 2000, 2006, 2008, 2009, 2010, 2011, 2012, 2014 Free Software Foundation, Inc. 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 3 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, see . */ #include #include "language/stats/aggregate.h" #include #include "data/any-writer.h" #include "data/case.h" #include "data/casegrouper.h" #include "data/casereader.h" #include "data/casewriter.h" #include "data/dataset.h" #include "data/dictionary.h" #include "data/file-handle-def.h" #include "data/format.h" #include "data/settings.h" #include "data/subcase.h" #include "data/sys-file-writer.h" #include "data/variable.h" #include "language/command.h" #include "language/data-io/file-handle.h" #include "language/lexer/lexer.h" #include "language/lexer/variable-parser.h" #include "language/stats/sort-criteria.h" #include "libpspp/assertion.h" #include "libpspp/i18n.h" #include "libpspp/message.h" #include "libpspp/misc.h" #include "libpspp/pool.h" #include "libpspp/str.h" #include "math/moments.h" #include "math/percentiles.h" #include "math/sort.h" #include "math/statistic.h" #include "gl/c-strcase.h" #include "gl/minmax.h" #include "gl/xalloc.h" #include "gettext.h" #define _(msgid) gettext (msgid) #define N_(msgid) msgid /* Argument for AGGREGATE function. */ union agr_argument { double f; /* Numeric. */ char *c; /* Short or long string. */ }; /* Specifies how to make an aggregate variable. */ struct agr_var { struct agr_var *next; /* Next in list. */ /* Collected during parsing. */ const struct variable *src; /* Source variable. */ struct variable *dest; /* Target variable. */ int function; /* Function. */ enum mv_class exclude; /* Classes of missing values to exclude. */ union agr_argument arg[2]; /* Arguments. */ /* Accumulated during AGGREGATE execution. */ double dbl[3]; int int1, int2; char *string; bool saw_missing; struct moments1 *moments; double cc; struct variable *subject; struct variable *weight; struct casewriter *writer; }; /* Attributes of aggregation functions. */ const struct agr_func agr_func_tab[] = { {"SUM", N_("Sum of values"), AGR_SV_YES, 0, -1, {FMT_F, 8, 2}}, {"MEAN", N_("Mean average"), AGR_SV_YES, 0, -1, {FMT_F, 8, 2}}, {"MEDIAN", N_("Median average"), AGR_SV_YES, 0, -1, {FMT_F, 8, 2}}, {"SD", N_("Standard deviation"), AGR_SV_YES, 0, -1, {FMT_F, 8, 2}}, {"MAX", N_("Maximum value"), AGR_SV_YES, 0, VAL_STRING, {-1, -1, -1}}, {"MIN", N_("Minimum value"), AGR_SV_YES, 0, VAL_STRING, {-1, -1, -1}}, {"PGT", N_("Percentage greater than"), AGR_SV_YES, 1, VAL_NUMERIC, {FMT_F, 5, 1}}, {"PLT", N_("Percentage less than"), AGR_SV_YES, 1, VAL_NUMERIC, {FMT_F, 5, 1}}, {"PIN", N_("Percentage included in range"), AGR_SV_YES, 2, VAL_NUMERIC, {FMT_F, 5, 1}}, {"POUT", N_("Percentage excluded from range"), AGR_SV_YES, 2, VAL_NUMERIC, {FMT_F, 5, 1}}, {"FGT", N_("Fraction greater than"), AGR_SV_YES, 1, VAL_NUMERIC, {FMT_F, 5, 3}}, {"FLT", N_("Fraction less than"), AGR_SV_YES, 1, VAL_NUMERIC, {FMT_F, 5, 3}}, {"FIN", N_("Fraction included in range"), AGR_SV_YES, 2, VAL_NUMERIC, {FMT_F, 5, 3}}, {"FOUT", N_("Fraction excluded from range"), AGR_SV_YES, 2, VAL_NUMERIC, {FMT_F, 5, 3}}, {"N", N_("Number of cases"), AGR_SV_NO, 0, VAL_NUMERIC, {FMT_F, 7, 0}}, {"NU", N_("Number of cases (unweighted)"), AGR_SV_OPT, 0, VAL_NUMERIC, {FMT_F, 7, 0}}, {"NMISS", N_("Number of missing values"), AGR_SV_YES, 0, VAL_NUMERIC, {FMT_F, 7, 0}}, {"NUMISS", N_("Number of missing values (unweighted)"), AGR_SV_YES, 0, VAL_NUMERIC, {FMT_F, 7, 0}}, {"FIRST", N_("First non-missing value"), AGR_SV_YES, 0, VAL_STRING, {-1, -1, -1}}, {"LAST", N_("Last non-missing value"), AGR_SV_YES, 0, VAL_STRING, {-1, -1, -1}}, {NULL, NULL, AGR_SV_NO, 0, -1, {-1, -1, -1}}, }; /* Missing value types. */ enum missing_treatment { ITEMWISE, /* Missing values item by item. */ COLUMNWISE /* Missing values column by column. */ }; /* An entire AGGREGATE procedure. */ struct agr_proc { /* Break variables. */ struct subcase sort; /* Sort criteria (break variables). */ const struct variable **break_vars; /* Break variables. */ size_t break_var_cnt; /* Number of break variables. */ enum missing_treatment missing; /* How to treat missing values. */ struct agr_var *agr_vars; /* First aggregate variable. */ struct dictionary *dict; /* Aggregate dictionary. */ const struct dictionary *src_dict; /* Dict of the source */ int case_cnt; /* Counts aggregated cases. */ bool add_variables; /* True iff the aggregated variables should be appended to the existing dictionary */ }; static void initialize_aggregate_info (struct agr_proc *); static void accumulate_aggregate_info (struct agr_proc *, const struct ccase *); /* Prototypes. */ static bool parse_aggregate_functions (struct lexer *, const struct dictionary *, struct agr_proc *); static void agr_destroy (struct agr_proc *); static void dump_aggregate_info (const struct agr_proc *agr, struct casewriter *output, const struct ccase *break_case); /* Parsing. */ /* Parses and executes the AGGREGATE procedure. */ int cmd_aggregate (struct lexer *lexer, struct dataset *ds) { struct dictionary *dict = dataset_dict (ds); struct agr_proc agr; struct file_handle *out_file = NULL; struct casereader *input = NULL, *group; struct casegrouper *grouper; struct casewriter *output = NULL; bool copy_documents = false; bool presorted = false; bool saw_direction; bool ok; memset(&agr, 0 , sizeof (agr)); agr.missing = ITEMWISE; agr.src_dict = dict; subcase_init_empty (&agr.sort); /* OUTFILE subcommand must be first. */ lex_match (lexer, T_SLASH); if (!lex_force_match_id (lexer, "OUTFILE")) goto error; lex_match (lexer, T_EQUALS); if (!lex_match (lexer, T_ASTERISK)) { out_file = fh_parse (lexer, FH_REF_FILE, dataset_session (ds)); if (out_file == NULL) goto error; } if (out_file == NULL && lex_match_id (lexer, "MODE")) { lex_match (lexer, T_EQUALS); if (lex_match_id (lexer, "ADDVARIABLES")) { agr.add_variables = true; /* presorted is assumed in ADDVARIABLES mode */ presorted = true; } else if (lex_match_id (lexer, "REPLACE")) { agr.add_variables = false; } else goto error; } if (agr.add_variables) agr.dict = dict_clone (dict); else agr.dict = dict_create (dict_get_encoding (dict)); dict_set_label (agr.dict, dict_get_label (dict)); dict_set_documents (agr.dict, dict_get_documents (dict)); /* Read most of the subcommands. */ for (;;) { lex_match (lexer, T_SLASH); if (lex_match_id (lexer, "MISSING")) { lex_match (lexer, T_EQUALS); if (!lex_match_id (lexer, "COLUMNWISE")) { lex_error_expecting (lexer, "COLUMNWISE"); goto error; } agr.missing = COLUMNWISE; } else if (lex_match_id (lexer, "DOCUMENT")) copy_documents = true; else if (lex_match_id (lexer, "PRESORTED")) presorted = true; else if (lex_force_match_id (lexer, "BREAK")) { int i; lex_match (lexer, T_EQUALS); if (!parse_sort_criteria (lexer, dict, &agr.sort, &agr.break_vars, &saw_direction)) goto error; agr.break_var_cnt = subcase_get_n_fields (&agr.sort); if (! agr.add_variables) for (i = 0; i < agr.break_var_cnt; i++) dict_clone_var_assert (agr.dict, agr.break_vars[i]); /* BREAK must follow the options. */ break; } else goto error; } if (presorted && saw_direction) msg (SW, _("When PRESORTED is specified, specifying sorting directions " "with (A) or (D) has no effect. Output data will be sorted " "the same way as the input data.")); /* Read in the aggregate functions. */ lex_match (lexer, T_SLASH); if (!parse_aggregate_functions (lexer, dict, &agr)) goto error; /* Delete documents. */ if (!copy_documents) dict_clear_documents (agr.dict); /* Cancel SPLIT FILE. */ dict_set_split_vars (agr.dict, NULL, 0); /* Initialize. */ agr.case_cnt = 0; if (out_file == NULL) { /* The active dataset will be replaced by the aggregated data, so TEMPORARY is moot. */ proc_cancel_temporary_transformations (ds); proc_discard_output (ds); output = autopaging_writer_create (dict_get_proto (agr.dict)); } else { output = any_writer_open (out_file, agr.dict); if (output == NULL) goto error; } input = proc_open (ds); if (!subcase_is_empty (&agr.sort) && !presorted) { input = sort_execute (input, &agr.sort); subcase_clear (&agr.sort); } for (grouper = casegrouper_create_vars (input, agr.break_vars, agr.break_var_cnt); casegrouper_get_next_group (grouper, &group); casereader_destroy (group)) { struct casereader *placeholder = NULL; struct ccase *c = casereader_peek (group, 0); if (c == NULL) { casereader_destroy (group); continue; } initialize_aggregate_info (&agr); if (agr.add_variables) placeholder = casereader_clone (group); { struct ccase *cg; for (; (cg = casereader_read (group)) != NULL; case_unref (cg)) accumulate_aggregate_info (&agr, cg); } if (agr.add_variables) { struct ccase *cg; for (; (cg = casereader_read (placeholder)) != NULL; case_unref (cg)) dump_aggregate_info (&agr, output, cg); casereader_destroy (placeholder); } else { dump_aggregate_info (&agr, output, c); } case_unref (c); } if (!casegrouper_destroy (grouper)) goto error; if (!proc_commit (ds)) { input = NULL; goto error; } input = NULL; if (out_file == NULL) { struct casereader *next_input = casewriter_make_reader (output); if (next_input == NULL) goto error; dataset_set_dict (ds, agr.dict); dataset_set_source (ds, next_input); agr.dict = NULL; } else { ok = casewriter_destroy (output); output = NULL; if (!ok) goto error; } agr_destroy (&agr); fh_unref (out_file); return CMD_SUCCESS; error: if (input != NULL) proc_commit (ds); casewriter_destroy (output); agr_destroy (&agr); fh_unref (out_file); return CMD_CASCADING_FAILURE; } /* Parse all the aggregate functions. */ static bool parse_aggregate_functions (struct lexer *lexer, const struct dictionary *dict, struct agr_proc *agr) { struct agr_var *tail; /* Tail of linked list starting at agr->vars. */ /* Parse everything. */ tail = NULL; for (;;) { char **dest; char **dest_label; size_t n_dest; struct string function_name; enum mv_class exclude; const struct agr_func *function; int func_index; union agr_argument arg[2]; const struct variable **src; size_t n_src; size_t i; dest = NULL; dest_label = NULL; n_dest = 0; src = NULL; function = NULL; n_src = 0; arg[0].c = NULL; arg[1].c = NULL; ds_init_empty (&function_name); /* Parse the list of target variables. */ while (!lex_match (lexer, T_EQUALS)) { size_t n_dest_prev = n_dest; if (!parse_DATA_LIST_vars (lexer, dict, &dest, &n_dest, (PV_APPEND | PV_SINGLE | PV_NO_SCRATCH | PV_NO_DUPLICATE))) goto error; /* Assign empty labels. */ { int j; dest_label = xnrealloc (dest_label, n_dest, sizeof *dest_label); for (j = n_dest_prev; j < n_dest; j++) dest_label[j] = NULL; } if (lex_is_string (lexer)) { dest_label[n_dest - 1] = xstrdup (lex_tokcstr (lexer)); lex_get (lexer); } } /* Get the name of the aggregation function. */ if (lex_token (lexer) != T_ID) { lex_error (lexer, _("expecting aggregation function")); goto error; } ds_assign_substring (&function_name, lex_tokss (lexer)); exclude = ds_chomp_byte (&function_name, '.') ? MV_SYSTEM : MV_ANY; for (function = agr_func_tab; function->name; function++) if (!c_strcasecmp (function->name, ds_cstr (&function_name))) break; if (NULL == function->name) { msg (SE, _("Unknown aggregation function %s."), ds_cstr (&function_name)); goto error; } ds_destroy (&function_name); func_index = function - agr_func_tab; lex_get (lexer); /* Check for leading lparen. */ if (!lex_match (lexer, T_LPAREN)) { if (function->src_vars == AGR_SV_YES) { goto error; } } else { /* Parse list of source variables. */ { int pv_opts = PV_NO_SCRATCH; if (func_index == SUM || func_index == MEAN || func_index == SD) pv_opts |= PV_NUMERIC; else if (function->n_args) pv_opts |= PV_SAME_TYPE; if (!parse_variables_const (lexer, dict, &src, &n_src, pv_opts)) goto error; } /* Parse function arguments, for those functions that require arguments. */ if (function->n_args != 0) for (i = 0; i < function->n_args; i++) { int type; lex_match (lexer, T_COMMA); if (lex_is_string (lexer)) { arg[i].c = recode_string (dict_get_encoding (agr->dict), "UTF-8", lex_tokcstr (lexer), -1); type = VAL_STRING; } else if (lex_is_number (lexer)) { arg[i].f = lex_tokval (lexer); type = VAL_NUMERIC; } else { msg (SE, _("Missing argument %zu to %s."), i + 1, function->name); goto error; } lex_get (lexer); if (type != var_get_type (src[0])) { msg (SE, _("Arguments to %s must be of same type as " "source variables."), function->name); goto error; } } /* Trailing rparen. */ if (!lex_force_match (lexer, T_RPAREN)) goto error; /* Now check that the number of source variables match the number of target variables. If we check earlier than this, the user can get very misleading error message, i.e. `AGGREGATE x=SUM(y t).' will get this error message when a proper message would be more like `unknown variable t'. */ if (n_src != n_dest) { msg (SE, _("Number of source variables (%zu) does not match " "number of target variables (%zu)."), n_src, n_dest); goto error; } if ((func_index == PIN || func_index == POUT || func_index == FIN || func_index == FOUT) && (var_is_numeric (src[0]) ? arg[0].f > arg[1].f : str_compare_rpad (arg[0].c, arg[1].c) > 0)) { union agr_argument t = arg[0]; arg[0] = arg[1]; arg[1] = t; msg (SW, _("The value arguments passed to the %s function " "are out-of-order. They will be treated as if " "they had been specified in the correct order."), function->name); } } /* Finally add these to the linked list of aggregation variables. */ for (i = 0; i < n_dest; i++) { struct agr_var *v = xzalloc (sizeof *v); /* Add variable to chain. */ if (agr->agr_vars != NULL) tail->next = v; else agr->agr_vars = v; tail = v; tail->next = NULL; v->moments = NULL; /* Create the target variable in the aggregate dictionary. */ { struct variable *destvar; v->function = func_index; if (src) { v->src = src[i]; if (var_is_alpha (src[i])) { v->function |= FSTRING; v->string = xmalloc (var_get_width (src[i])); } if (function->alpha_type == VAL_STRING) destvar = dict_clone_var_as (agr->dict, v->src, dest[i]); else { assert (var_is_numeric (v->src) || function->alpha_type == VAL_NUMERIC); destvar = dict_create_var (agr->dict, dest[i], 0); if (destvar != NULL) { struct fmt_spec f; if ((func_index == N || func_index == NMISS) && dict_get_weight (dict) != NULL) f = fmt_for_output (FMT_F, 8, 2); else f = function->format; var_set_both_formats (destvar, &f); } } } else { struct fmt_spec f; v->src = NULL; destvar = dict_create_var (agr->dict, dest[i], 0); if (destvar != NULL) { if ((func_index == N || func_index == NMISS) && dict_get_weight (dict) != NULL) f = fmt_for_output (FMT_F, 8, 2); else f = function->format; var_set_both_formats (destvar, &f); } } if (!destvar) { msg (SE, _("Variable name %s is not unique within the " "aggregate file dictionary, which contains " "the aggregate variables and the break " "variables."), dest[i]); goto error; } free (dest[i]); if (dest_label[i]) var_set_label (destvar, dest_label[i]); v->dest = destvar; } v->exclude = exclude; if (v->src != NULL) { int j; if (var_is_numeric (v->src)) for (j = 0; j < function->n_args; j++) v->arg[j].f = arg[j].f; else for (j = 0; j < function->n_args; j++) v->arg[j].c = xstrdup (arg[j].c); } } if (src != NULL && var_is_alpha (src[0])) for (i = 0; i < function->n_args; i++) { free (arg[i].c); arg[i].c = NULL; } free (src); free (dest); free (dest_label); if (!lex_match (lexer, T_SLASH)) { if (lex_token (lexer) == T_ENDCMD) return true; lex_error (lexer, "expecting end of command"); return false; } continue; error: ds_destroy (&function_name); for (i = 0; i < n_dest; i++) { free (dest[i]); free (dest_label[i]); } free (dest); free (dest_label); free (arg[0].c); free (arg[1].c); if (src && n_src && var_is_alpha (src[0])) for (i = 0; i < function->n_args; i++) { free (arg[i].c); arg[i].c = NULL; } free (src); return false; } } /* Destroys AGR. */ static void agr_destroy (struct agr_proc *agr) { struct agr_var *iter, *next; subcase_destroy (&agr->sort); free (agr->break_vars); for (iter = agr->agr_vars; iter; iter = next) { next = iter->next; if (iter->function & FSTRING) { size_t n_args; size_t i; n_args = agr_func_tab[iter->function & FUNC].n_args; for (i = 0; i < n_args; i++) free (iter->arg[i].c); free (iter->string); } else if (iter->function == SD) moments1_destroy (iter->moments); dict_destroy_internal_var (iter->subject); dict_destroy_internal_var (iter->weight); free (iter); } if (agr->dict != NULL) dict_unref (agr->dict); } /* Execution. */ /* Accumulates aggregation data from the case INPUT. */ static void accumulate_aggregate_info (struct agr_proc *agr, const struct ccase *input) { struct agr_var *iter; double weight; bool bad_warn = true; weight = dict_get_case_weight (agr->src_dict, input, &bad_warn); for (iter = agr->agr_vars; iter; iter = iter->next) if (iter->src) { const union value *v = case_data (input, iter->src); int src_width = var_get_width (iter->src); if (var_is_value_missing (iter->src, v, iter->exclude)) { switch (iter->function) { case NMISS: case NMISS | FSTRING: iter->dbl[0] += weight; break; case NUMISS: case NUMISS | FSTRING: iter->int1++; break; } iter->saw_missing = true; continue; } /* This is horrible. There are too many possibilities. */ switch (iter->function) { case SUM: iter->dbl[0] += v->f * weight; iter->int1 = 1; break; case MEAN: iter->dbl[0] += v->f * weight; iter->dbl[1] += weight; break; case MEDIAN: { double wv ; struct ccase *cout; cout = case_create (casewriter_get_proto (iter->writer)); case_data_rw (cout, iter->subject)->f = case_data (input, iter->src)->f; wv = dict_get_case_weight (agr->src_dict, input, NULL); case_data_rw (cout, iter->weight)->f = wv; iter->cc += wv; casewriter_write (iter->writer, cout); } break; case SD: moments1_add (iter->moments, v->f, weight); break; case MAX: iter->dbl[0] = MAX (iter->dbl[0], v->f); iter->int1 = 1; break; case MAX | FSTRING: /* Need to do some kind of Unicode collation thingy here */ if (memcmp (iter->string, v->s, src_width) < 0) memcpy (iter->string, v->s, src_width); iter->int1 = 1; break; case MIN: iter->dbl[0] = MIN (iter->dbl[0], v->f); iter->int1 = 1; break; case MIN | FSTRING: if (memcmp (iter->string, v->s, src_width) > 0) memcpy (iter->string, v->s, src_width); iter->int1 = 1; break; case FGT: case PGT: if (v->f > iter->arg[0].f) iter->dbl[0] += weight; iter->dbl[1] += weight; break; case FGT | FSTRING: case PGT | FSTRING: if (memcmp (iter->arg[0].c, v->s, src_width) < 0) iter->dbl[0] += weight; iter->dbl[1] += weight; break; case FLT: case PLT: if (v->f < iter->arg[0].f) iter->dbl[0] += weight; iter->dbl[1] += weight; break; case FLT | FSTRING: case PLT | FSTRING: if (memcmp (iter->arg[0].c, v->s, src_width) > 0) iter->dbl[0] += weight; iter->dbl[1] += weight; break; case FIN: case PIN: if (iter->arg[0].f <= v->f && v->f <= iter->arg[1].f) iter->dbl[0] += weight; iter->dbl[1] += weight; break; case FIN | FSTRING: case PIN | FSTRING: if (memcmp (iter->arg[0].c, v->s, src_width) <= 0 && memcmp (iter->arg[1].c, v->s, src_width) >= 0) iter->dbl[0] += weight; iter->dbl[1] += weight; break; case FOUT: case POUT: if (iter->arg[0].f > v->f || v->f > iter->arg[1].f) iter->dbl[0] += weight; iter->dbl[1] += weight; break; case FOUT | FSTRING: case POUT | FSTRING: if (memcmp (iter->arg[0].c, v->s, src_width) > 0 || memcmp (iter->arg[1].c, v->s, src_width) < 0) iter->dbl[0] += weight; iter->dbl[1] += weight; break; case N: case N | FSTRING: iter->dbl[0] += weight; break; case NU: case NU | FSTRING: iter->int1++; break; case FIRST: if (iter->int1 == 0) { iter->dbl[0] = v->f; iter->int1 = 1; } break; case FIRST | FSTRING: if (iter->int1 == 0) { memcpy (iter->string, v->s, src_width); iter->int1 = 1; } break; case LAST: iter->dbl[0] = v->f; iter->int1 = 1; break; case LAST | FSTRING: memcpy (iter->string, v->s, src_width); iter->int1 = 1; break; case NMISS: case NMISS | FSTRING: case NUMISS: case NUMISS | FSTRING: /* Our value is not missing or it would have been caught earlier. Nothing to do. */ break; default: NOT_REACHED (); } } else { switch (iter->function) { case N: iter->dbl[0] += weight; break; case NU: iter->int1++; break; default: NOT_REACHED (); } } } /* Writes an aggregated record to OUTPUT. */ static void dump_aggregate_info (const struct agr_proc *agr, struct casewriter *output, const struct ccase *break_case) { struct ccase *c = case_create (dict_get_proto (agr->dict)); if (agr->add_variables) { case_copy (c, 0, break_case, 0, dict_get_var_cnt (agr->src_dict)); } else { int value_idx = 0; int i; for (i = 0; i < agr->break_var_cnt; i++) { const struct variable *v = agr->break_vars[i]; value_copy (case_data_rw_idx (c, value_idx), case_data (break_case, v), var_get_width (v)); value_idx++; } } { struct agr_var *i; for (i = agr->agr_vars; i; i = i->next) { union value *v = case_data_rw (c, i->dest); int width = var_get_width (i->dest); if (agr->missing == COLUMNWISE && i->saw_missing && (i->function & FUNC) != N && (i->function & FUNC) != NU && (i->function & FUNC) != NMISS && (i->function & FUNC) != NUMISS) { value_set_missing (v, width); casewriter_destroy (i->writer); continue; } switch (i->function) { case SUM: v->f = i->int1 ? i->dbl[0] : SYSMIS; break; case MEAN: v->f = i->dbl[1] != 0.0 ? i->dbl[0] / i->dbl[1] : SYSMIS; break; case MEDIAN: { if (i->writer) { struct percentile *median = percentile_create (0.5, i->cc); struct order_stats *os = &median->parent; struct casereader *sorted_reader = casewriter_make_reader (i->writer); i->writer = NULL; order_stats_accumulate (&os, 1, sorted_reader, i->weight, i->subject, i->exclude); i->dbl[0] = percentile_calculate (median, PC_HAVERAGE); statistic_destroy (&median->parent.parent); } v->f = i->dbl[0]; } break; case SD: { double variance; /* FIXME: we should use two passes. */ moments1_calculate (i->moments, NULL, NULL, &variance, NULL, NULL); if (variance != SYSMIS) v->f = sqrt (variance); else v->f = SYSMIS; } break; case MAX: case MIN: v->f = i->int1 ? i->dbl[0] : SYSMIS; break; case MAX | FSTRING: case MIN | FSTRING: if (i->int1) memcpy (v->s, i->string, width); else value_set_missing (v, width); break; case FGT: case FGT | FSTRING: case FLT: case FLT | FSTRING: case FIN: case FIN | FSTRING: case FOUT: case FOUT | FSTRING: v->f = i->dbl[1] ? i->dbl[0] / i->dbl[1] : SYSMIS; break; case PGT: case PGT | FSTRING: case PLT: case PLT | FSTRING: case PIN: case PIN | FSTRING: case POUT: case POUT | FSTRING: v->f = i->dbl[1] ? i->dbl[0] / i->dbl[1] * 100.0 : SYSMIS; break; case N: case N | FSTRING: v->f = i->dbl[0]; break; case NU: case NU | FSTRING: v->f = i->int1; break; case FIRST: case LAST: v->f = i->int1 ? i->dbl[0] : SYSMIS; break; case FIRST | FSTRING: case LAST | FSTRING: if (i->int1) memcpy (v->s, i->string, width); else value_set_missing (v, width); break; case NMISS: case NMISS | FSTRING: v->f = i->dbl[0]; break; case NUMISS: case NUMISS | FSTRING: v->f = i->int1; break; default: NOT_REACHED (); } } } casewriter_write (output, c); } /* Resets the state for all the aggregate functions. */ static void initialize_aggregate_info (struct agr_proc *agr) { struct agr_var *iter; for (iter = agr->agr_vars; iter; iter = iter->next) { iter->saw_missing = false; iter->dbl[0] = iter->dbl[1] = iter->dbl[2] = 0.0; iter->int1 = iter->int2 = 0; switch (iter->function) { case MIN: iter->dbl[0] = DBL_MAX; break; case MIN | FSTRING: memset (iter->string, 255, var_get_width (iter->src)); break; case MAX: iter->dbl[0] = -DBL_MAX; break; case MAX | FSTRING: memset (iter->string, 0, var_get_width (iter->src)); break; case MEDIAN: { struct caseproto *proto; struct subcase ordering; proto = caseproto_create (); proto = caseproto_add_width (proto, 0); proto = caseproto_add_width (proto, 0); if (! iter->subject) iter->subject = dict_create_internal_var (0, 0); if (! iter->weight) iter->weight = dict_create_internal_var (1, 0); subcase_init_var (&ordering, iter->subject, SC_ASCEND); iter->writer = sort_create_writer (&ordering, proto); subcase_destroy (&ordering); caseproto_unref (proto); iter->cc = 0; } break; case SD: if (iter->moments == NULL) iter->moments = moments1_create (MOMENT_VARIANCE); else moments1_clear (iter->moments); break; default: break; } } } pspp-1.4.1/src/language/stats/median.c0000644000175000017500000002407713700645725017247 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2011 Free Software Foundation, Inc. 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 3 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, see . */ #include #include "median.h" #include #include "data/format.h" #include "data/variable.h" #include "data/case.h" #include "data/dictionary.h" #include "data/dataset.h" #include "data/casereader.h" #include "data/casewriter.h" #include "data/subcase.h" #include "data/value.h" #include "math/percentiles.h" #include "math/sort.h" #include "libpspp/cast.h" #include "libpspp/hmap.h" #include "libpspp/array.h" #include "libpspp/str.h" #include "libpspp/misc.h" #include "output/pivot-table.h" #include "gettext.h" #define N_(msgid) msgid #define _(msgid) gettext (msgid) struct val_node { struct hmap_node node; union value val; casenumber le; casenumber gt; }; struct results { const struct variable *var; struct val_node **sorted_array; double n; double median; double chisq; }; static int val_node_cmp_3way (const void *a_, const void *b_, const void *aux) { const struct variable *indep_var = aux; const struct val_node *const *a = a_; const struct val_node *const *b = b_; return value_compare_3way (&(*a)->val, &(*b)->val, var_get_width (indep_var)); } static void show_frequencies (const struct n_sample_test *nst, const struct results *results, int n_vals, const struct dictionary *); static void show_test_statistics (const struct n_sample_test *nst, const struct results *results, int, const struct dictionary *); static struct val_node * find_value (const struct hmap *map, const union value *val, const struct variable *var) { struct val_node *foo = NULL; size_t hash = value_hash (val, var_get_width (var), 0); HMAP_FOR_EACH_WITH_HASH (foo, struct val_node, node, hash, map) if (value_equal (val, &foo->val, var_get_width (var))) break; return foo; } void median_execute (const struct dataset *ds, struct casereader *input, enum mv_class exclude, const struct npar_test *test, bool exact UNUSED, double timer UNUSED) { const struct dictionary *dict = dataset_dict (ds); const struct variable *wvar = dict_get_weight (dict); bool warn = true; int v; const struct median_test *mt = UP_CAST (test, const struct median_test, parent.parent); const struct n_sample_test *nst = UP_CAST (test, const struct n_sample_test, parent); const bool n_sample_test = (value_compare_3way (&nst->val2, &nst->val1, var_get_width (nst->indep_var)) > 0); struct results *results = XCALLOC (nst->n_vars, struct results); int n_vals = 0; for (v = 0; v < nst->n_vars; ++v) { double count = 0; double cc = 0; double median = mt->median; const struct variable *var = nst->vars[v]; struct ccase *c; struct hmap map = HMAP_INITIALIZER (map); struct casereader *r = casereader_clone (input); if (n_sample_test == false) { struct val_node *vn = xzalloc (sizeof *vn); value_clone (&vn->val, &nst->val1, var_get_width (nst->indep_var)); hmap_insert (&map, &vn->node, value_hash (&nst->val1, var_get_width (nst->indep_var), 0)); vn = xzalloc (sizeof *vn); value_clone (&vn->val, &nst->val2, var_get_width (nst->indep_var)); hmap_insert (&map, &vn->node, value_hash (&nst->val2, var_get_width (nst->indep_var), 0)); } if (median == SYSMIS) { struct percentile *ptl; struct order_stats *os; struct casereader *rr; struct subcase sc; struct casewriter *writer; subcase_init_var (&sc, var, SC_ASCEND); rr = casereader_clone (r); writer = sort_create_writer (&sc, casereader_get_proto (rr)); for (; (c = casereader_read (rr)) != NULL;) { if (var_is_value_missing (var, case_data (c, var), exclude)) { case_unref (c); continue; } cc += dict_get_case_weight (dict, c, &warn); casewriter_write (writer, c); } subcase_destroy (&sc); casereader_destroy (rr); rr = casewriter_make_reader (writer); ptl = percentile_create (0.5, cc); os = &ptl->parent; order_stats_accumulate (&os, 1, rr, wvar, var, exclude); median = percentile_calculate (ptl, PC_HAVERAGE); statistic_destroy (&ptl->parent.parent); } results[v].median = median; for (; (c = casereader_read (r)) != NULL; case_unref (c)) { struct val_node *vn ; const double weight = dict_get_case_weight (dict, c, &warn); const union value *val = case_data (c, var); const union value *indep_val = case_data (c, nst->indep_var); if (var_is_value_missing (var, case_data (c, var), exclude)) { continue; } if (n_sample_test) { int width = var_get_width (nst->indep_var); /* Ignore out of range values */ if ( value_compare_3way (indep_val, &nst->val1, width) < 0 || value_compare_3way (indep_val, &nst->val2, width) > 0 ) { continue; } } vn = find_value (&map, indep_val, nst->indep_var); if (vn == NULL) { if (n_sample_test == true) { int width = var_get_width (nst->indep_var); vn = xzalloc (sizeof *vn); value_clone (&vn->val, indep_val, width); hmap_insert (&map, &vn->node, value_hash (indep_val, width, 0)); } else { continue; } } if (val->f <= median) vn->le += weight; else vn->gt += weight; count += weight; } casereader_destroy (r); { int x = 0; struct val_node *vn = NULL; double r_0 = 0; double r_1 = 0; HMAP_FOR_EACH (vn, struct val_node, node, &map) { r_0 += vn->le; r_1 += vn->gt; } results[v].n = count; results[v].sorted_array = xcalloc (hmap_count (&map), sizeof (void*)); results[v].var = var; HMAP_FOR_EACH (vn, struct val_node, node, &map) { double e_0j = r_0 * (vn->le + vn->gt) / count; double e_1j = r_1 * (vn->le + vn->gt) / count; results[v].chisq += pow2 (vn->le - e_0j) / e_0j; results[v].chisq += pow2 (vn->gt - e_1j) / e_1j; results[v].sorted_array[x++] = vn; } n_vals = x; hmap_destroy (&map); sort (results[v].sorted_array, x, sizeof (*results[v].sorted_array), val_node_cmp_3way, nst->indep_var); } } casereader_destroy (input); show_frequencies (nst, results, n_vals, dict); show_test_statistics (nst, results, n_vals, dict); for (v = 0; v < nst->n_vars; ++v) { int i; const struct results *rs = results + v; for (i = 0; i < n_vals; ++i) { struct val_node *vn = rs->sorted_array[i]; value_destroy (&vn->val, var_get_width (nst->indep_var)); free (vn); } free (rs->sorted_array); } free (results); } static void show_frequencies (const struct n_sample_test *nst, const struct results *results, int n_vals, const struct dictionary *dict) { struct pivot_table *table = pivot_table_create (N_("Frequencies")); pivot_table_set_weight_var (table, dict_get_weight (dict)); struct pivot_dimension *indep = pivot_dimension_create__ ( table, PIVOT_AXIS_COLUMN, pivot_value_new_variable (nst->indep_var)); indep->root->show_label = true; for (int i = 0; i < n_vals; ++i) pivot_category_create_leaf_rc ( indep->root, pivot_value_new_var_value ( nst->indep_var, &results->sorted_array[i]->val), PIVOT_RC_COUNT); pivot_dimension_create (table, PIVOT_AXIS_ROW, N_("Statistics"), N_("> Median"), N_("≤ Median")); struct pivot_dimension *dep = pivot_dimension_create ( table, PIVOT_AXIS_ROW, N_("Dependent Variables")); for (int v = 0; v < nst->n_vars; ++v) { const struct results *rs = &results[v]; int dep_idx = pivot_category_create_leaf ( dep->root, pivot_value_new_variable (rs->var)); for (int indep_idx = 0; indep_idx < n_vals; indep_idx++) { const struct val_node *vn = rs->sorted_array[indep_idx]; pivot_table_put3 (table, indep_idx, 0, dep_idx, pivot_value_new_number (vn->gt)); pivot_table_put3 (table, indep_idx, 1, dep_idx, pivot_value_new_number (vn->le)); } } pivot_table_submit (table); } static void show_test_statistics (const struct n_sample_test *nst, const struct results *results, int n_vals, const struct dictionary *dict) { struct pivot_table *table = pivot_table_create (N_("Test Statistics")); pivot_table_set_weight_var (table, dict_get_weight (dict)); pivot_dimension_create (table, PIVOT_AXIS_COLUMN, N_("Statistics"), N_("N"), PIVOT_RC_COUNT, N_("Median"), N_("Chi-Square"), PIVOT_RC_OTHER, N_("df"), PIVOT_RC_COUNT, N_("Asymp. Sig."), PIVOT_RC_SIGNIFICANCE); struct pivot_dimension *variables = pivot_dimension_create ( table, PIVOT_AXIS_ROW, N_("Variables")); for (int v = 0; v < nst->n_vars; ++v) { double df = n_vals - 1; const struct results *rs = &results[v]; int var_idx = pivot_category_create_leaf ( variables->root, pivot_value_new_variable (rs->var)); double entries[] = { rs->n, rs->median, rs->chisq, df, gsl_cdf_chisq_Q (rs->chisq, df), }; for (size_t i = 0; i < sizeof entries / sizeof *entries; i++) { struct pivot_value *value = pivot_value_new_number (entries[i]); if (i == 1) value->numeric.format = *var_get_print_format (rs->var); pivot_table_put2 (table, i, var_idx, value); } } pivot_table_submit (table); } pspp-1.4.1/src/language/stats/jonckheere-terpstra.c0000644000175000017500000002470713670210420021753 0ustar00blpblp00000000000000/* Pspp - a program for statistical analysis. Copyright (C) 2012 Free Software Foundation, Inc. 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 3 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, see . */ #include #include "jonckheere-terpstra.h" #include #include #include "data/casegrouper.h" #include "data/casereader.h" #include "data/casewriter.h" #include "data/dataset.h" #include "data/dictionary.h" #include "data/format.h" #include "data/subcase.h" #include "data/variable.h" #include "libpspp/assertion.h" #include "libpspp/hmap.h" #include "libpspp/message.h" #include "libpspp/misc.h" #include "math/sort.h" #include "output/pivot-table.h" #include "gl/minmax.h" #include "gl/xalloc.h" #include "gettext.h" #define N_(msgid) msgid #define _(msgid) gettext (msgid) /* Returns true iff the independent variable lies in the between val1 and val2. Regardless of which is the greater value. */ static bool include_func_bi (const struct ccase *c, void *aux) { const struct n_sample_test *nst = aux; const union value *bigger = NULL; const union value *smaller = NULL; if (0 > value_compare_3way (&nst->val1, &nst->val2, var_get_width (nst->indep_var))) { bigger = &nst->val2; smaller = &nst->val1; } else { smaller = &nst->val2; bigger = &nst->val1; } if (0 < value_compare_3way (smaller, case_data (c, nst->indep_var), var_get_width (nst->indep_var))) return false; if (0 > value_compare_3way (bigger, case_data (c, nst->indep_var), var_get_width (nst->indep_var))) return false; return true; } struct group_data { /* The total of the caseweights in the group */ double cc; /* A casereader containing the group data. This casereader contains just two values: 0: The raw value of the data 1: The cumulative caseweight */ struct casereader *reader; }; static double u (const struct group_data *grp0, const struct group_data *grp1) { struct ccase *c0; struct casereader *r0 = casereader_clone (grp0->reader); double usum = 0; double prev_cc0 = 0.0; for (; (c0 = casereader_read (r0)); case_unref (c0)) { struct ccase *c1; struct casereader *r1 = casereader_clone (grp1->reader); double x0 = case_data_idx (c0, 0)->f; double cc0 = case_data_idx (c0, 1)->f; double w0 = cc0 - prev_cc0; double prev_cc1 = 0; for (; (c1 = casereader_read (r1)); case_unref (c1)) { double x1 = case_data_idx (c1, 0)->f; double cc1 = case_data_idx (c1, 1)->f; if (x0 > x1) { /* Do nothing */ } else if (x0 < x1) { usum += w0 * (grp1->cc - prev_cc1); case_unref (c1); break; } else { #if 1 usum += w0 * ((grp1->cc - prev_cc1) / 2.0); #else usum += w0 * (grp1->cc - (prev_cc1 + cc1) / 2.0); #endif case_unref (c1); break; } prev_cc1 = cc1; } casereader_destroy (r1); prev_cc0 = cc0; } casereader_destroy (r0); return usum; } typedef double func_f (double e_l); /* These 3 functions are used repeatedly in the calculation of the variance of the JT statistic. Having them explicitly defined makes the variance calculation a lot simpler. */ static double ff1 (double e) { return e * (e - 1) * (2*e + 5); } static double ff2 (double e) { return e * (e - 1) * (e - 2); } static double ff3 (double e) { return e * (e - 1) ; } static func_f *mff[3] = { ff1, ff2, ff3 }; /* This function does the following: It creates an ordered set of *distinct* values from IR. For each case in that set, it calls f[0..N] passing it the caseweight. It returns the sum of f[j] in result[j]. result and f must be allocated prior to calling this function. */ static void variance_calculation (struct casereader *ir, const struct variable *var, const struct dictionary *dict, func_f **f, double *result, size_t n) { int i; struct casereader *r = casereader_clone (ir); struct ccase *c; const struct variable *wv = dict_get_weight (dict); const int w_idx = wv ? var_get_case_index (wv) : caseproto_get_n_widths (casereader_get_proto (r)) ; r = sort_execute_1var (r, var); r = casereader_create_distinct (r, var, dict_get_weight (dict)); for (; (c = casereader_read (r)); case_unref (c)) { double w = case_data_idx (c, w_idx)->f; for (i = 0; i < n; ++i) result[i] += f[i] (w); } casereader_destroy (r); } struct jt { int levels; double n; double obs; double mean; double stddev; }; static void show_jt (const struct n_sample_test *, const struct jt *, const struct fmt_spec *wfmt); void jonckheere_terpstra_execute (const struct dataset *ds, struct casereader *input, enum mv_class exclude, const struct npar_test *test, bool exact UNUSED, double timer UNUSED) { int v; bool warn = true; const struct dictionary *dict = dataset_dict (ds); const struct n_sample_test *nst = UP_CAST (test, const struct n_sample_test, parent); struct caseproto *proto = caseproto_create (); proto = caseproto_add_width (proto, 0); proto = caseproto_add_width (proto, 0); /* If the independent variable is missing, then we ignore the case */ input = casereader_create_filter_missing (input, &nst->indep_var, 1, exclude, NULL, NULL); /* Remove cases with invalid weigths */ input = casereader_create_filter_weight (input, dict, &warn, NULL); /* Remove all those cases which are outside the range (val1, val2) */ input = casereader_create_filter_func (input, include_func_bi, NULL, CONST_CAST (struct n_sample_test *, nst), NULL); /* Sort the data by the independent variable */ input = sort_execute_1var (input, nst->indep_var); for (v = 0; v < nst->n_vars ; ++v) { struct jt jt; double variance; int g0; double nn = 0; int i; double sums[3] = {0,0,0}; double e_sum[3] = {0,0,0}; struct group_data *grp = NULL; double ccsq_sum = 0; struct casegrouper *grouper; struct casereader *group; struct casereader *vreader= casereader_clone (input); /* Get a few values into e_sum - we'll be needing these later */ variance_calculation (vreader, nst->vars[v], dict, mff, e_sum, 3); grouper = casegrouper_create_vars (vreader, &nst->indep_var, 1); jt.obs = 0; jt.levels = 0; jt.n = 0; for (; casegrouper_get_next_group (grouper, &group); casereader_destroy (group)) { struct casewriter *writer = autopaging_writer_create (proto); struct ccase *c; double cc = 0; group = sort_execute_1var (group, nst->vars[v]); for (; (c = casereader_read (group)); case_unref (c)) { struct ccase *c_out = case_create (proto); const union value *x = case_data (c, nst->vars[v]); case_data_rw_idx (c_out, 0)->f = x->f; cc += dict_get_case_weight (dict, c, &warn); case_data_rw_idx (c_out, 1)->f = cc; casewriter_write (writer, c_out); } grp = xrealloc (grp, sizeof *grp * (jt.levels + 1)); grp[jt.levels].reader = casewriter_make_reader (writer); grp[jt.levels].cc = cc; jt.levels++; jt.n += cc; ccsq_sum += pow2 (cc); } casegrouper_destroy (grouper); for (g0 = 0; g0 < jt.levels; ++g0) { int g1; for (g1 = g0 +1 ; g1 < jt.levels; ++g1) { double uu = u (&grp[g0], &grp[g1]); jt.obs += uu; } nn += pow2 (grp[g0].cc) * (2 * grp[g0].cc + 3); for (i = 0; i < 3; ++i) sums[i] += mff[i] (grp[g0].cc); casereader_destroy (grp[g0].reader); } free (grp); variance = (mff[0](jt.n) - sums[0] - e_sum[0]) / 72.0; variance += sums[1] * e_sum[1] / (36.0 * mff[1] (jt.n)); variance += sums[2] * e_sum[2] / (8.0 * mff[2] (jt.n)); jt.stddev = sqrt (variance); jt.mean = (pow2 (jt.n) - ccsq_sum) / 4.0; show_jt (nst, &jt, dict_get_weight_format (dict)); } casereader_destroy (input); caseproto_unref (proto); } static void show_jt (const struct n_sample_test *nst, const struct jt *jt, const struct fmt_spec *wfmt) { struct pivot_table *table = pivot_table_create ( N_("Jonckheere-Terpstra Test")); pivot_table_set_weight_format (table, wfmt); struct pivot_dimension *statistics = pivot_dimension_create ( table, PIVOT_AXIS_COLUMN, N_("Statistics")); pivot_category_create_leaf_rc ( statistics->root, pivot_value_new_text_format (N_("Number of levels in %s"), var_to_string (nst->indep_var)), PIVOT_RC_INTEGER); pivot_category_create_leaves ( statistics->root, N_("N"), PIVOT_RC_COUNT, N_("Observed J-T Statistic"), PIVOT_RC_OTHER, N_("Mean J-T Statistic"), PIVOT_RC_OTHER, N_("Std. Deviation of J-T Statistic"), PIVOT_RC_OTHER, N_("Std. J-T Statistic"), PIVOT_RC_OTHER, N_("Asymp. Sig. (2-tailed)"), PIVOT_RC_SIGNIFICANCE); struct pivot_dimension *variables = pivot_dimension_create ( table, PIVOT_AXIS_ROW, N_("Variable")); for (size_t i = 0; i < nst->n_vars; ++i) { int row = pivot_category_create_leaf ( variables->root, pivot_value_new_variable (nst->vars[i])); double std_jt = (jt[0].obs - jt[0].mean) / jt[0].stddev; double sig = (2.0 * (std_jt > 0 ? gsl_cdf_ugaussian_Q (std_jt) : gsl_cdf_ugaussian_P (std_jt))); double entries[] = { jt[0].levels, jt[0].n, jt[0].obs, jt[0].mean, jt[0].stddev, std_jt, sig, }; for (size_t j = 0; j < sizeof entries / sizeof *entries; j++) pivot_table_put2 (table, j, row, pivot_value_new_number (entries[j])); } pivot_table_submit (table); } pspp-1.4.1/src/language/stats/chisquare.c0000644000175000017500000002712413670210420017754 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2006, 2007, 2009, 2010, 2011 Free Software Foundation, Inc. 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 3 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, see . */ #include #include "language/stats/chisquare.h" #include #include #include #include "data/case.h" #include "data/casereader.h" #include "data/dataset.h" #include "data/dictionary.h" #include "data/format.h" #include "data/value-labels.h" #include "data/variable.h" #include "language/stats/freq.h" #include "language/stats/npar.h" #include "libpspp/array.h" #include "libpspp/assertion.h" #include "libpspp/cast.h" #include "libpspp/compiler.h" #include "libpspp/hash-functions.h" #include "libpspp/message.h" #include "libpspp/taint.h" #include "output/pivot-table.h" #include "gl/xalloc.h" #include "gettext.h" #define N_(msgid) msgid #define _(msgid) gettext (msgid) /* Adds frequency counts of each value of VAR in INPUT between LO and HI to FREQ_HASH. LO and HI and each input value is truncated to an integer. Returns true if successful, false on input error. It is the caller's responsibility to initialize FREQ_HASH and to free it when no longer required, even on failure. */ static bool create_freq_hash_with_range (const struct dictionary *dict, struct casereader *input, const struct variable *var, double lo_, double hi_, struct hmap *freq_hash) { struct freq **entries; bool warn = true; struct ccase *c; double lo, hi; double i_d; assert (var_is_numeric (var)); lo = trunc (lo_); hi = trunc (hi_); /* Populate the hash with zero entries */ entries = xnmalloc (hi - lo + 1, sizeof *entries); for (i_d = lo; i_d <= hi; i_d += 1.0) { size_t ofs = i_d - lo; union value value = { i_d }; entries[ofs] = freq_hmap_insert (freq_hash, &value, 0, value_hash (&value, 0, 0)); } for (; (c = casereader_read (input)) != NULL; case_unref (c)) { double x = trunc (case_num (c, var)); if (x >= lo && x <= hi) { size_t ofs = x - lo; struct freq *fr = entries[ofs]; fr->count += dict_get_case_weight (dict, c, &warn); } } free (entries); return casereader_destroy (input); } /* Adds frequency counts of each value of VAR in INPUT to FREQ_HASH. LO and HI and each input value is truncated to an integer. Returns true if successful, false on input error. It is the caller's responsibility to initialize FREQ_HASH and to free it when no longer required, even on failure. */ static bool create_freq_hash (const struct dictionary *dict, struct casereader *input, const struct variable *var, struct hmap *freq_hash) { int width = var_get_width (var); bool warn = true; struct ccase *c; for (; (c = casereader_read (input)) != NULL; case_unref (c)) { const union value *value = case_data (c, var); size_t hash = value_hash (value, width, 0); double weight = dict_get_case_weight (dict, c, &warn); struct freq *f; f = freq_hmap_search (freq_hash, value, width, hash); if (f == NULL) f = freq_hmap_insert (freq_hash, value, width, hash); f->count += weight; } return casereader_destroy (input); } void chisquare_execute (const struct dataset *ds, struct casereader *input, enum mv_class exclude, const struct npar_test *test, bool exact UNUSED, double timer UNUSED) { const struct dictionary *dict = dataset_dict (ds); int v, i; struct chisquare_test *cst = UP_CAST (test, struct chisquare_test, parent.parent); struct one_sample_test *ost = &cst->parent; double total_expected = 0.0; double *df = xzalloc (sizeof (*df) * ost->n_vars); double *xsq = xzalloc (sizeof (*df) * ost->n_vars); bool ok; for (i = 0 ; i < cst->n_expected ; ++i) total_expected += cst->expected[i]; if (cst->ranged == false) { for (v = 0 ; v < ost->n_vars ; ++v) { const struct variable *var = ost->vars[v]; struct hmap freq_hash = HMAP_INITIALIZER (freq_hash); struct casereader *reader = casereader_create_filter_missing (casereader_clone (input), &var, 1, exclude, NULL, NULL); if (!create_freq_hash (dict, reader, var, &freq_hash)) { freq_hmap_destroy (&freq_hash, var_get_width (var)); return; } size_t n_cells = hmap_count (&freq_hash); if (cst->n_expected > 0 && n_cells != cst->n_expected) { msg (ME, _("CHISQUARE test specified %d expected values, but " "variable %s has %zu distinct values."), cst->n_expected, var_get_name (var), n_cells); freq_hmap_destroy (&freq_hash, var_get_width (var)); continue; } struct pivot_table *table = pivot_table_create__ ( pivot_value_new_variable (var), "Chisquare"); pivot_table_set_weight_var (table, dict_get_weight (dict)); pivot_dimension_create ( table, PIVOT_AXIS_COLUMN, N_("Statistics"), N_("Observed N"), PIVOT_RC_COUNT, N_("Expected N"), PIVOT_RC_OTHER, N_("Residual"), PIVOT_RC_RESIDUAL); struct freq **ff = freq_hmap_sort (&freq_hash, var_get_width (var)); double total_obs = 0.0; for (size_t i = 0; i < n_cells; i++) total_obs += ff[i]->count; struct pivot_dimension *values = pivot_dimension_create ( table, PIVOT_AXIS_ROW, N_("Value")); values->root->show_label = true; xsq[v] = 0.0; for (size_t i = 0; i < n_cells; i++) { int row = pivot_category_create_leaf ( values->root, pivot_value_new_var_value ( var, &ff[i]->values[0])); double exp = (cst->n_expected > 0 ? cst->expected[i] * total_obs / total_expected : total_obs / (double) n_cells); double entries[] = { ff[i]->count, exp, ff[i]->count - exp, }; for (size_t j = 0; j < sizeof entries / sizeof *entries; j++) pivot_table_put2 ( table, j, row, pivot_value_new_number (entries[j])); xsq[v] += (ff[i]->count - exp) * (ff[i]->count - exp) / exp; } df[v] = n_cells - 1.0; int row = pivot_category_create_leaf ( values->root, pivot_value_new_text (N_("Total"))); pivot_table_put2 (table, 0, row, pivot_value_new_number (total_obs)); pivot_table_submit (table); freq_hmap_destroy (&freq_hash, var_get_width (var)); free (ff); } } else /* ranged == true */ { struct pivot_table *table = pivot_table_create (N_("Frequencies")); pivot_table_set_weight_var (table, dict_get_weight (dict)); pivot_dimension_create ( table, PIVOT_AXIS_COLUMN, N_("Statistics"), N_("Category"), N_("Observed N"), PIVOT_RC_COUNT, N_("Expected N"), PIVOT_RC_OTHER, N_("Residual"), PIVOT_RC_RESIDUAL); struct pivot_dimension *var_dim = pivot_dimension_create (table, PIVOT_AXIS_COLUMN, N_("Variable")); for (size_t i = 0 ; i < ost->n_vars ; ++i) pivot_category_create_leaf (var_dim->root, pivot_value_new_variable (ost->vars[i])); struct pivot_dimension *category_dim = pivot_dimension_create (table, PIVOT_AXIS_ROW, N_("Category")); size_t n_cells = cst->hi - cst->lo + 1; for (size_t i = 0 ; i < n_cells; ++i) pivot_category_create_leaf (category_dim->root, pivot_value_new_integer (i + 1)); pivot_category_create_leaves (category_dim->root, N_("Total")); for (size_t v = 0 ; v < ost->n_vars ; ++v) { const struct variable *var = ost->vars[v]; struct casereader *reader = casereader_create_filter_missing (casereader_clone (input), &var, 1, exclude, NULL, NULL); struct hmap freq_hash = HMAP_INITIALIZER (freq_hash); if (!create_freq_hash_with_range (dict, reader, var, cst->lo, cst->hi, &freq_hash)) { freq_hmap_destroy (&freq_hash, var_get_width (var)); continue; } struct freq **ff = freq_hmap_sort (&freq_hash, var_get_width (var)); double total_obs = 0.0; for (size_t i = 0 ; i < hmap_count (&freq_hash) ; ++i) total_obs += ff[i]->count; xsq[v] = 0.0; for (size_t i = 0 ; i < hmap_count (&freq_hash) ; ++i) { /* Category. */ pivot_table_put3 (table, 0, v, i, pivot_value_new_var_value ( var, &ff[i]->values[0])); double exp = (cst->n_expected > 0 ? cst->expected[i] * total_obs / total_expected : total_obs / (double) hmap_count (&freq_hash)); double entries[] = { ff[i]->count, exp, ff[i]->count - exp, }; for (size_t j = 0; j < sizeof entries / sizeof *entries; j++) pivot_table_put3 (table, j + 1, v, i, pivot_value_new_number (entries[j])); xsq[v] += (ff[i]->count - exp) * (ff[i]->count - exp) / exp; } df[v] = n_cells - 1.0; freq_hmap_destroy (&freq_hash, var_get_width (var)); free (ff); pivot_table_put3 (table, 1, v, n_cells, pivot_value_new_number (total_obs)); } pivot_table_submit (table); } ok = !taint_has_tainted_successor (casereader_get_taint (input)); casereader_destroy (input); if (ok) { struct pivot_table *table = pivot_table_create (N_("Test Statistics")); pivot_dimension_create (table, PIVOT_AXIS_COLUMN, N_("Statistics"), N_("Chi-square"), PIVOT_RC_OTHER, N_("df"), PIVOT_RC_INTEGER, N_("Asymp. Sig."), PIVOT_RC_SIGNIFICANCE); struct pivot_dimension *variables = pivot_dimension_create ( table, PIVOT_AXIS_ROW, N_("Variable")); for (size_t v = 0 ; v < ost->n_vars ; ++v) { const struct variable *var = ost->vars[v]; int row = pivot_category_create_leaf ( variables->root, pivot_value_new_variable (var)); double sig = gsl_cdf_chisq_Q (xsq[v], df[v]); double entries[] = { xsq[v], df[v], sig }; for (size_t i = 0; i < sizeof entries / sizeof *entries; i++) pivot_table_put2 (table, i, row, pivot_value_new_number (entries[i])); } pivot_table_submit (table); } free (xsq); free (df); } pspp-1.4.1/src/language/stats/friedman.h0000644000175000017500000000225513320146056017565 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2010, 2011 Free Software Foundation, Inc. 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 3 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, see . */ #if !friedman_h #define friedman_h 1 #include #include #include "language/stats/npar.h" struct friedman_test { struct one_sample_test parent; /* Calculate and display the Kendall W statistic */ bool kendalls_w; }; void friedman_execute (const struct dataset *ds, struct casereader *input, enum mv_class exclude, const struct npar_test *test, bool, double); #endif pspp-1.4.1/src/language/stats/reliability.c0000644000175000017500000004350413670210420020301 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2009, 2010, 2011, 2013, 2015, 2016 Free Software Foundation, Inc. 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 3 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, see . */ #include #include #include "data/casegrouper.h" #include "data/casereader.h" #include "data/dataset.h" #include "data/dictionary.h" #include "data/format.h" #include "data/missing-values.h" #include "language/command.h" #include "language/lexer/lexer.h" #include "language/lexer/variable-parser.h" #include "libpspp/message.h" #include "libpspp/misc.h" #include "libpspp/str.h" #include "math/moments.h" #include "output/pivot-table.h" #include "output/text-item.h" #include "gettext.h" #define _(msgid) gettext (msgid) #define N_(msgid) msgid struct cronbach { const struct variable **items; size_t n_items; double alpha; double sum_of_variances; double variance_of_sums; int totals_idx; /* Casereader index into the totals */ struct moments1 **m ; /* Moments of the items */ struct moments1 *total ; /* Moments of the totals */ }; #if 0 static void dump_cronbach (const struct cronbach *s) { int i; printf ("N items %d\n", s->n_items); for (i = 0 ; i < s->n_items; ++i) { printf ("%s\n", var_get_name (s->items[i])); } printf ("Totals idx %d\n", s->totals_idx); printf ("scale variance %g\n", s->variance_of_sums); printf ("alpha %g\n", s->alpha); putchar ('\n'); } #endif enum model { MODEL_ALPHA, MODEL_SPLIT }; enum summary_opts { SUMMARY_TOTAL = 0x0001, }; struct reliability { const struct variable **variables; size_t n_variables; enum mv_class exclude; struct cronbach *sc; int n_sc; int total_start; struct string scale_name; enum model model; int split_point; enum summary_opts summary; const struct variable *wv; }; static bool run_reliability (struct dataset *ds, const struct reliability *reliability); static void reliability_destroy (struct reliability *rel) { int j; ds_destroy (&rel->scale_name); if (rel->sc) for (j = 0; j < rel->n_sc ; ++j) { int x; free (rel->sc[j].items); moments1_destroy (rel->sc[j].total); if (rel->sc[j].m) for (x = 0; x < rel->sc[j].n_items; ++x) free (rel->sc[j].m[x]); free (rel->sc[j].m); } free (rel->sc); free (rel->variables); } int cmd_reliability (struct lexer *lexer, struct dataset *ds) { const struct dictionary *dict = dataset_dict (ds); struct reliability reliability; reliability.n_variables = 0; reliability.variables = NULL; reliability.model = MODEL_ALPHA; reliability.exclude = MV_ANY; reliability.summary = 0; reliability.n_sc = 0; reliability.sc = NULL; reliability.wv = dict_get_weight (dict); reliability.total_start = 0; ds_init_empty (&reliability.scale_name); lex_match (lexer, T_SLASH); if (!lex_force_match_id (lexer, "VARIABLES")) { goto error; } lex_match (lexer, T_EQUALS); if (!parse_variables_const (lexer, dict, &reliability.variables, &reliability.n_variables, PV_NO_DUPLICATE | PV_NUMERIC)) goto error; if (reliability.n_variables < 2) msg (MW, _("Reliability on a single variable is not useful.")); { int i; struct cronbach *c; /* Create a default Scale */ reliability.n_sc = 1; reliability.sc = xzalloc (sizeof (struct cronbach) * reliability.n_sc); ds_assign_cstr (&reliability.scale_name, "ANY"); c = &reliability.sc[0]; c->n_items = reliability.n_variables; c->items = xzalloc (sizeof (struct variable*) * c->n_items); for (i = 0 ; i < c->n_items ; ++i) c->items[i] = reliability.variables[i]; } while (lex_token (lexer) != T_ENDCMD) { lex_match (lexer, T_SLASH); if (lex_match_id (lexer, "SCALE")) { struct const_var_set *vs; if (! lex_force_match (lexer, T_LPAREN)) goto error; if (! lex_force_string (lexer)) goto error; ds_assign_substring (&reliability.scale_name, lex_tokss (lexer)); lex_get (lexer); if (! lex_force_match (lexer, T_RPAREN)) goto error; lex_match (lexer, T_EQUALS); vs = const_var_set_create_from_array (reliability.variables, reliability.n_variables); free (reliability.sc->items); if (!parse_const_var_set_vars (lexer, vs, &reliability.sc->items, &reliability.sc->n_items, 0)) { const_var_set_destroy (vs); goto error; } const_var_set_destroy (vs); } else if (lex_match_id (lexer, "MODEL")) { lex_match (lexer, T_EQUALS); if (lex_match_id (lexer, "ALPHA")) { reliability.model = MODEL_ALPHA; } else if (lex_match_id (lexer, "SPLIT")) { reliability.model = MODEL_SPLIT; reliability.split_point = -1; if (lex_match (lexer, T_LPAREN) && lex_force_num (lexer)) { reliability.split_point = lex_number (lexer); lex_get (lexer); if (! lex_force_match (lexer, T_RPAREN)) goto error; } } else goto error; } else if (lex_match_id (lexer, "SUMMARY")) { lex_match (lexer, T_EQUALS); if (lex_match_id (lexer, "TOTAL")) { reliability.summary |= SUMMARY_TOTAL; } else if (lex_match (lexer, T_ALL)) { reliability.summary = 0xFFFF; } else goto error; } else if (lex_match_id (lexer, "MISSING")) { lex_match (lexer, T_EQUALS); while (lex_token (lexer) != T_ENDCMD && lex_token (lexer) != T_SLASH) { if (lex_match_id (lexer, "INCLUDE")) { reliability.exclude = MV_SYSTEM; } else if (lex_match_id (lexer, "EXCLUDE")) { reliability.exclude = MV_ANY; } else { lex_error (lexer, NULL); goto error; } } } else if (lex_match_id (lexer, "STATISTICS")) { lex_match (lexer, T_EQUALS); msg (SW, _("The STATISTICS subcommand is not yet implemented. " "No statistics will be produced.")); while (lex_match (lexer, T_ID)) continue; } else { lex_error (lexer, NULL); goto error; } } if (reliability.model == MODEL_SPLIT) { int i; const struct cronbach *s; if (reliability.split_point >= reliability.n_variables) { msg (ME, _("The split point must be less than the number of variables")); goto error; } reliability.n_sc += 2 ; reliability.sc = xrealloc (reliability.sc, sizeof (struct cronbach) * reliability.n_sc); s = &reliability.sc[0]; reliability.sc[1].n_items = (reliability.split_point == -1) ? s->n_items / 2 : reliability.split_point; reliability.sc[2].n_items = s->n_items - reliability.sc[1].n_items; reliability.sc[1].items = xzalloc (sizeof (struct variable *) * reliability.sc[1].n_items); reliability.sc[2].items = xzalloc (sizeof (struct variable *) * reliability.sc[2].n_items); for (i = 0; i < reliability.sc[1].n_items ; ++i) reliability.sc[1].items[i] = s->items[i]; while (i < s->n_items) { reliability.sc[2].items[i - reliability.sc[1].n_items] = s->items[i]; i++; } } if (reliability.summary & SUMMARY_TOTAL) { int i; const int base_sc = reliability.n_sc; reliability.total_start = base_sc; reliability.n_sc += reliability.sc[0].n_items ; reliability.sc = xrealloc (reliability.sc, sizeof (struct cronbach) * reliability.n_sc); for (i = 0 ; i < reliability.sc[0].n_items; ++i) { int v_src; int v_dest = 0; struct cronbach *s = &reliability.sc[i + base_sc]; s->n_items = reliability.sc[0].n_items - 1; s->items = xzalloc (sizeof (struct variable *) * s->n_items); for (v_src = 0 ; v_src < reliability.sc[0].n_items ; ++v_src) { if (v_src != i) s->items[v_dest++] = reliability.sc[0].items[v_src]; } } } if (! run_reliability (ds, &reliability)) goto error; reliability_destroy (&reliability); return CMD_SUCCESS; error: reliability_destroy (&reliability); return CMD_FAILURE; } static void do_reliability (struct casereader *group, struct dataset *ds, const struct reliability *rel); static void reliability_summary_total (const struct reliability *rel); static void reliability_statistics (const struct reliability *rel); static bool run_reliability (struct dataset *ds, const struct reliability *reliability) { struct dictionary *dict = dataset_dict (ds); bool ok; struct casereader *group; struct casegrouper *grouper = casegrouper_create_splits (proc_open (ds), dict); int si; for (si = 0 ; si < reliability->n_sc; ++si) { struct cronbach *s = &reliability->sc[si]; int i; s->m = xzalloc (sizeof *s->m * s->n_items); s->total = moments1_create (MOMENT_VARIANCE); for (i = 0 ; i < s->n_items ; ++i) s->m[i] = moments1_create (MOMENT_VARIANCE); } while (casegrouper_get_next_group (grouper, &group)) { do_reliability (group, ds, reliability); reliability_statistics (reliability); if (reliability->summary & SUMMARY_TOTAL) reliability_summary_total (reliability); } ok = casegrouper_destroy (grouper); ok = proc_commit (ds) && ok; return ok; } /* Return the sum of all the item variables in S */ static double append_sum (const struct ccase *c, casenumber n UNUSED, void *aux) { double sum = 0; const struct cronbach *s = aux; int v; for (v = 0 ; v < s->n_items; ++v) { sum += case_data (c, s->items[v])->f; } return sum; }; static void case_processing_summary (casenumber n_valid, casenumber n_missing, const struct dictionary *dict); static double alpha (int k, double sum_of_variances, double variance_of_sums) { return k / (k - 1.0) * (1 - sum_of_variances / variance_of_sums); } static void do_reliability (struct casereader *input, struct dataset *ds, const struct reliability *rel) { int i; int si; struct ccase *c; casenumber n_missing ; casenumber n_valid = 0; for (si = 0 ; si < rel->n_sc; ++si) { struct cronbach *s = &rel->sc[si]; moments1_clear (s->total); for (i = 0 ; i < s->n_items ; ++i) moments1_clear (s->m[i]); } input = casereader_create_filter_missing (input, rel->variables, rel->n_variables, rel->exclude, &n_missing, NULL); for (si = 0 ; si < rel->n_sc; ++si) { struct cronbach *s = &rel->sc[si]; s->totals_idx = caseproto_get_n_widths (casereader_get_proto (input)); input = casereader_create_append_numeric (input, append_sum, s, NULL); } for (; (c = casereader_read (input)) != NULL; case_unref (c)) { double weight = 1.0; n_valid ++; for (si = 0; si < rel->n_sc; ++si) { struct cronbach *s = &rel->sc[si]; for (i = 0 ; i < s->n_items ; ++i) moments1_add (s->m[i], case_data (c, s->items[i])->f, weight); moments1_add (s->total, case_data_idx (c, s->totals_idx)->f, weight); } } casereader_destroy (input); for (si = 0; si < rel->n_sc; ++si) { struct cronbach *s = &rel->sc[si]; s->sum_of_variances = 0; for (i = 0 ; i < s->n_items ; ++i) { double weight, mean, variance; moments1_calculate (s->m[i], &weight, &mean, &variance, NULL, NULL); s->sum_of_variances += variance; } moments1_calculate (s->total, NULL, NULL, &s->variance_of_sums, NULL, NULL); s->alpha = alpha (s->n_items, s->sum_of_variances, s->variance_of_sums); } text_item_submit (text_item_create_format (TEXT_ITEM_TITLE, _("Scale: %s"), ds_cstr (&rel->scale_name))); case_processing_summary (n_valid, n_missing, dataset_dict (ds)); } static void case_processing_summary (casenumber n_valid, casenumber n_missing, const struct dictionary *dict) { struct pivot_table *table = pivot_table_create ( N_("Case Processing Summary")); pivot_table_set_weight_var (table, dict_get_weight (dict)); pivot_dimension_create (table, PIVOT_AXIS_COLUMN, N_("Statistics"), N_("N"), PIVOT_RC_COUNT, N_("Percent"), PIVOT_RC_PERCENT); struct pivot_dimension *cases = pivot_dimension_create ( table, PIVOT_AXIS_ROW, N_("Cases"), N_("Valid"), N_("Excluded"), N_("Total")); cases->root->show_label = true; casenumber total = n_missing + n_valid; struct entry { int stat_idx; int case_idx; double x; } entries[] = { { 0, 0, n_valid }, { 0, 1, n_missing }, { 0, 2, total }, { 1, 0, 100.0 * n_valid / total }, { 1, 1, 100.0 * n_missing / total }, { 1, 2, 100.0 } }; for (size_t i = 0; i < sizeof entries / sizeof *entries; i++) { const struct entry *e = &entries[i]; pivot_table_put2 (table, e->stat_idx, e->case_idx, pivot_value_new_number (e->x)); } pivot_table_submit (table); } static void reliability_summary_total (const struct reliability *rel) { struct pivot_table *table = pivot_table_create (N_("Item-Total Statistics")); pivot_dimension_create (table, PIVOT_AXIS_COLUMN, N_("Statistics"), N_("Scale Mean if Item Deleted"), N_("Scale Variance if Item Deleted"), N_("Corrected Item-Total Correlation"), N_("Cronbach's Alpha if Item Deleted")); struct pivot_dimension *variables = pivot_dimension_create ( table, PIVOT_AXIS_ROW, N_("Variables")); for (size_t i = 0 ; i < rel->sc[0].n_items; ++i) { const struct cronbach *s = &rel->sc[rel->total_start + i]; int var_idx = pivot_category_create_leaf ( variables->root, pivot_value_new_variable (rel->sc[0].items[i])); double mean; moments1_calculate (s->total, NULL, &mean, NULL, NULL, NULL); double var; moments1_calculate (rel->sc[0].m[i], NULL, NULL, &var, NULL, NULL); double cov = (rel->sc[0].variance_of_sums + var - s->variance_of_sums) / 2.0; double entries[] = { mean, s->variance_of_sums, (cov - var) / sqrt (var * s->variance_of_sums), s->alpha, }; for (size_t i = 0; i < sizeof entries / sizeof *entries; i++) pivot_table_put2 (table, i, var_idx, pivot_value_new_number (entries[i])); } pivot_table_submit (table); } static void reliability_statistics (const struct reliability *rel) { struct pivot_table *table = pivot_table_create ( N_("Reliability Statistics")); pivot_table_set_weight_var (table, rel->wv); if (rel->model == MODEL_ALPHA) { pivot_dimension_create (table, PIVOT_AXIS_COLUMN, N_("Statistics"), N_("Cronbach's Alpha"), PIVOT_RC_OTHER, N_("N of Items"), PIVOT_RC_COUNT); const struct cronbach *s = &rel->sc[0]; pivot_table_put1 (table, 0, pivot_value_new_number (s->alpha)); pivot_table_put1 (table, 1, pivot_value_new_number (s->n_items)); } else { struct pivot_dimension *statistics = pivot_dimension_create ( table, PIVOT_AXIS_ROW, N_("Statistics")); struct pivot_category *alpha = pivot_category_create_group ( statistics->root, N_("Cronbach's Alpha")); pivot_category_create_group (alpha, N_("Part 1"), N_("Value"), PIVOT_RC_OTHER, N_("N of Items"), PIVOT_RC_COUNT); pivot_category_create_group (alpha, N_("Part 2"), N_("Value"), PIVOT_RC_OTHER, N_("N of Items"), PIVOT_RC_COUNT); pivot_category_create_leaves (alpha, N_("Total N of Items"), PIVOT_RC_COUNT); pivot_category_create_leaves (statistics->root, N_("Correlation Between Forms"), PIVOT_RC_OTHER); pivot_category_create_group (statistics->root, N_("Spearman-Brown Coefficient"), N_("Equal Length"), PIVOT_RC_OTHER, N_("Unequal Length"), PIVOT_RC_OTHER); pivot_category_create_leaves (statistics->root, N_("Guttman Split-Half Coefficient"), PIVOT_RC_OTHER); /* R is the correlation between the two parts */ double r0 = rel->sc[0].variance_of_sums - rel->sc[1].variance_of_sums - rel->sc[2].variance_of_sums ; double r1 = (r0 / sqrt (rel->sc[1].variance_of_sums) / sqrt (rel->sc[2].variance_of_sums) / 2.0); /* Guttman Split Half Coefficient */ double g = 2 * r0 / rel->sc[0].variance_of_sums; double tmp = (1.0 - r1*r1) * rel->sc[1].n_items * rel->sc[2].n_items / pow2 (rel->sc[0].n_items); double entries[] = { rel->sc[1].alpha, rel->sc[1].n_items, rel->sc[2].alpha, rel->sc[2].n_items, rel->sc[1].n_items + rel->sc[2].n_items, r1, 2 * r1 / (1.0 + r1), (sqrt (pow4 (r1) + 4 * pow2 (r1) * tmp) - pow2 (r1)) / (2 * tmp), g, }; for (size_t i = 0; i < sizeof entries / sizeof *entries; i++) pivot_table_put1 (table, i, pivot_value_new_number (entries[i])); } pivot_table_submit (table); } pspp-1.4.1/src/language/stats/npar.c0000644000175000017500000011271613670210420016732 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. -*-c-*- Copyright (C) 2006, 2008, 2009, 2010, 2011, 2016 Free Software Foundation, Inc. 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 3 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, see . */ #include #include "language/stats/npar.h" #include #include #include "data/case.h" #include "data/casegrouper.h" #include "data/casereader.h" #include "data/dataset.h" #include "data/dictionary.h" #include "data/settings.h" #include "data/variable.h" #include "language/command.h" #include "language/lexer/lexer.h" #include "language/lexer/value-parser.h" #include "language/lexer/variable-parser.h" #include "language/stats/binomial.h" #include "language/stats/chisquare.h" #include "language/stats/ks-one-sample.h" #include "language/stats/cochran.h" #include "language/stats/friedman.h" #include "language/stats/jonckheere-terpstra.h" #include "language/stats/kruskal-wallis.h" #include "language/stats/mann-whitney.h" #include "language/stats/mcnemar.h" #include "language/stats/median.h" #include "language/stats/npar-summary.h" #include "language/stats/runs.h" #include "language/stats/sign.h" #include "language/stats/wilcoxon.h" #include "libpspp/array.h" #include "libpspp/assertion.h" #include "libpspp/cast.h" #include "libpspp/hash-functions.h" #include "libpspp/hmapx.h" #include "libpspp/message.h" #include "libpspp/pool.h" #include "libpspp/str.h" #include "libpspp/taint.h" #include "math/moments.h" #include "gl/xalloc.h" #include "gettext.h" #define _(msgid) gettext (msgid) /* Settings for subcommand specifiers. */ enum missing_type { MISS_ANALYSIS, MISS_LISTWISE, }; /* Array indices for STATISTICS subcommand. */ enum { NPAR_ST_DESCRIPTIVES = 0, NPAR_ST_QUARTILES = 1, NPAR_ST_ALL = 2, NPAR_ST_count }; /* NPAR TESTS structure. */ struct cmd_npar_tests { /* Count variables indicating how many of the subcommands have been given. */ int chisquare; int cochran; int binomial; int ks_one_sample; int wilcoxon; int sign; int runs; int friedman; int kendall; int kruskal_wallis; int mann_whitney; int mcnemar; int median; int jonckheere_terpstra; int missing; int method; int statistics; /* How missing values should be treated */ long miss; /* Which statistics have been requested */ int a_statistics[NPAR_ST_count]; }; struct npar_specs { struct pool *pool; struct npar_test **test; size_t n_tests; const struct variable **vv; /* Compendium of all variables (those mentioned on ANY subcommand */ int n_vars; /* Number of variables in vv */ enum mv_class filter; /* Missing values to filter. */ bool descriptives; /* Descriptive statistics should be calculated */ bool quartiles; /* Quartiles should be calculated */ bool exact; /* Whether exact calculations have been requested */ double timer; /* Maximum time (in minutes) to wait for exact calculations */ }; /* Prototype for custom subcommands of NPAR TESTS. */ static int npar_chisquare (struct lexer *, struct dataset *, struct npar_specs *); static int npar_binomial (struct lexer *, struct dataset *, struct npar_specs *); static int npar_ks_one_sample (struct lexer *, struct dataset *, struct npar_specs *); static int npar_runs (struct lexer *, struct dataset *, struct npar_specs *); static int npar_friedman (struct lexer *, struct dataset *, struct npar_specs *); static int npar_kendall (struct lexer *, struct dataset *, struct npar_specs *); static int npar_cochran (struct lexer *, struct dataset *, struct npar_specs *); static int npar_wilcoxon (struct lexer *, struct dataset *, struct npar_specs *); static int npar_sign (struct lexer *, struct dataset *, struct npar_specs *); static int npar_kruskal_wallis (struct lexer *, struct dataset *, struct npar_specs *); static int npar_jonckheere_terpstra (struct lexer *, struct dataset *, struct npar_specs *); static int npar_mann_whitney (struct lexer *, struct dataset *, struct npar_specs *); static int npar_mcnemar (struct lexer *, struct dataset *, struct npar_specs *); static int npar_median (struct lexer *, struct dataset *, struct npar_specs *); static int npar_method (struct lexer *, struct npar_specs *); /* Command parsing functions. */ static int parse_npar_tests (struct lexer *lexer, struct dataset *ds, struct cmd_npar_tests *p, struct npar_specs *npar_specs); static int parse_npar_tests (struct lexer *lexer, struct dataset *ds, struct cmd_npar_tests *npt, struct npar_specs *nps) { npt->chisquare = 0; npt->cochran = 0; npt->binomial = 0; npt->ks_one_sample = 0; npt->wilcoxon = 0; npt->sign = 0; npt->runs = 0; npt->friedman = 0; npt->kendall = 0; npt->kruskal_wallis = 0; npt->mann_whitney = 0; npt->mcnemar = 0; npt->median = 0; npt->jonckheere_terpstra = 0; npt->miss = MISS_ANALYSIS; npt->missing = 0; npt->method = 0; npt->statistics = 0; memset (npt->a_statistics, 0, sizeof npt->a_statistics); for (;;) { if (lex_match_id (lexer, "COCHRAN")) { npt->cochran++; switch (npar_cochran (lexer, ds, nps)) { case 0: goto lossage; case 1: break; case 2: lex_error (lexer, NULL); goto lossage; default: NOT_REACHED (); } } else if (lex_match_id (lexer, "FRIEDMAN")) { npt->friedman++; switch (npar_friedman (lexer, ds, nps)) { case 0: goto lossage; case 1: break; case 2: lex_error (lexer, NULL); goto lossage; default: NOT_REACHED (); } } else if (lex_match_id (lexer, "KENDALL")) { npt->kendall++; switch (npar_kendall (lexer, ds, nps)) { case 0: goto lossage; case 1: break; case 2: lex_error (lexer, NULL); goto lossage; default: NOT_REACHED (); } } else if (lex_match_id (lexer, "RUNS")) { npt->runs++; switch (npar_runs (lexer, ds, nps)) { case 0: goto lossage; case 1: break; case 2: lex_error (lexer, NULL); goto lossage; default: NOT_REACHED (); } } else if (lex_match_id (lexer, "CHISQUARE")) { lex_match (lexer, T_EQUALS); npt->chisquare++; switch (npar_chisquare (lexer, ds, nps)) { case 0: goto lossage; case 1: break; case 2: lex_error (lexer, NULL); goto lossage; case 3: continue; default: NOT_REACHED (); } } else if (lex_match_id (lexer, "BINOMIAL")) { lex_match (lexer, T_EQUALS); npt->binomial++; switch (npar_binomial (lexer, ds, nps)) { case 0: goto lossage; case 1: break; case 2: lex_error (lexer, NULL); goto lossage; default: NOT_REACHED (); } } else if (lex_match_phrase (lexer, "K-S") || lex_match_phrase (lexer, "KOLMOGOROV-SMIRNOV")) { lex_match (lexer, T_EQUALS); npt->ks_one_sample++; switch (npar_ks_one_sample (lexer, ds, nps)) { case 0: goto lossage; case 1: break; case 2: lex_error (lexer, NULL); goto lossage; default: NOT_REACHED (); } } else if (lex_match_phrase (lexer, "J-T") || lex_match_phrase (lexer, "JONCKHEERE-TERPSTRA")) { lex_match (lexer, T_EQUALS); npt->jonckheere_terpstra++; switch (npar_jonckheere_terpstra (lexer, ds, nps)) { case 0: goto lossage; case 1: break; case 2: lex_error (lexer, NULL); goto lossage; default: NOT_REACHED (); } } else if (lex_match_phrase (lexer, "K-W") || lex_match_phrase (lexer, "KRUSKAL-WALLIS")) { lex_match (lexer, T_EQUALS); npt->kruskal_wallis++; switch (npar_kruskal_wallis (lexer, ds, nps)) { case 0: goto lossage; case 1: break; case 2: lex_error (lexer, NULL); goto lossage; default: NOT_REACHED (); } } else if (lex_match_phrase (lexer, "MCNEMAR")) { lex_match (lexer, T_EQUALS); npt->mcnemar++; switch (npar_mcnemar (lexer, ds, nps)) { case 0: goto lossage; case 1: break; case 2: lex_error (lexer, NULL); goto lossage; default: NOT_REACHED (); } } else if (lex_match_phrase (lexer, "M-W") || lex_match_phrase (lexer, "MANN-WHITNEY")) { lex_match (lexer, T_EQUALS); npt->mann_whitney++; switch (npar_mann_whitney (lexer, ds, nps)) { case 0: goto lossage; case 1: break; case 2: lex_error (lexer, NULL); goto lossage; default: NOT_REACHED (); } } else if (lex_match_phrase (lexer, "MEDIAN")) { npt->median++; switch (npar_median (lexer, ds, nps)) { case 0: goto lossage; case 1: break; case 2: lex_error (lexer, NULL); goto lossage; default: NOT_REACHED (); } } else if (lex_match_id (lexer, "WILCOXON")) { lex_match (lexer, T_EQUALS); npt->wilcoxon++; switch (npar_wilcoxon (lexer, ds, nps)) { case 0: goto lossage; case 1: break; case 2: lex_error (lexer, NULL); goto lossage; default: NOT_REACHED (); } } else if (lex_match_id (lexer, "SIGN")) { lex_match (lexer, T_EQUALS); npt->sign++; switch (npar_sign (lexer, ds, nps)) { case 0: goto lossage; case 1: break; case 2: lex_error (lexer, NULL); goto lossage; default: NOT_REACHED (); } } else if (lex_match_id (lexer, "MISSING")) { lex_match (lexer, T_EQUALS); npt->missing++; if (npt->missing > 1) { lex_sbc_only_once ("MISSING"); goto lossage; } while (lex_token (lexer) != T_SLASH && lex_token (lexer) != T_ENDCMD) { if (lex_match_id (lexer, "ANALYSIS")) npt->miss = MISS_ANALYSIS; else if (lex_match_id (lexer, "LISTWISE")) npt->miss = MISS_LISTWISE; else if (lex_match_id (lexer, "INCLUDE")) nps->filter = MV_SYSTEM; else if (lex_match_id (lexer, "EXCLUDE")) nps->filter = MV_ANY; else { lex_error (lexer, NULL); goto lossage; } lex_match (lexer, T_COMMA); } } else if (lex_match_id (lexer, "METHOD")) { lex_match (lexer, T_EQUALS); npt->method++; if (npt->method > 1) { lex_sbc_only_once ("METHOD"); goto lossage; } switch (npar_method (lexer, nps)) { case 0: goto lossage; case 1: break; case 2: lex_error (lexer, NULL); goto lossage; default: NOT_REACHED (); } } else if (lex_match_id (lexer, "STATISTICS")) { lex_match (lexer, T_EQUALS); npt->statistics++; while (lex_token (lexer) != T_SLASH && lex_token (lexer) != T_ENDCMD) { if (lex_match_id (lexer, "DESCRIPTIVES")) npt->a_statistics[NPAR_ST_DESCRIPTIVES] = 1; else if (lex_match_id (lexer, "QUARTILES")) npt->a_statistics[NPAR_ST_QUARTILES] = 1; else if (lex_match (lexer, T_ALL)) npt->a_statistics[NPAR_ST_ALL] = 1; else { lex_error (lexer, NULL); goto lossage; } lex_match (lexer, T_COMMA); } } else if (settings_get_syntax () != COMPATIBLE && lex_match_id (lexer, "ALGORITHM")) { lex_match (lexer, T_EQUALS); if (lex_match_id (lexer, "COMPATIBLE")) settings_set_cmd_algorithm (COMPATIBLE); else if (lex_match_id (lexer, "ENHANCED")) settings_set_cmd_algorithm (ENHANCED); } if (!lex_match (lexer, T_SLASH)) break; } if (lex_token (lexer) != T_ENDCMD) { lex_error (lexer, _("expecting end of command")); goto lossage; } return true; lossage: return false; } static void one_sample_insert_variables (const struct npar_test *test, struct hmapx *); static void two_sample_insert_variables (const struct npar_test *test, struct hmapx *); static void n_sample_insert_variables (const struct npar_test *test, struct hmapx *); static void npar_execute (struct casereader *input, const struct npar_specs *specs, const struct dataset *ds) { int t; struct descriptives *summary_descriptives = NULL; for (t = 0 ; t < specs->n_tests; ++t) { const struct npar_test *test = specs->test[t]; if (NULL == test->execute) { msg (SW, _("%s subcommand not currently implemented."), "NPAR"); continue; } test->execute (ds, casereader_clone (input), specs->filter, test, specs->exact, specs->timer); } if (specs->descriptives && specs->n_vars > 0) { summary_descriptives = xnmalloc (sizeof (*summary_descriptives), specs->n_vars); npar_summary_calc_descriptives (summary_descriptives, casereader_clone (input), dataset_dict (ds), specs->vv, specs->n_vars, specs->filter); } if ((specs->descriptives || specs->quartiles) && !taint_has_tainted_successor (casereader_get_taint (input))) do_summary_box (summary_descriptives, specs->vv, specs->n_vars, dict_get_weight_format (dataset_dict (ds))); free (summary_descriptives); casereader_destroy (input); } int cmd_npar_tests (struct lexer *lexer, struct dataset *ds) { struct cmd_npar_tests cmd; bool ok; int i; struct npar_specs npar_specs = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; struct casegrouper *grouper; struct casereader *input, *group; struct hmapx var_map = HMAPX_INITIALIZER (var_map); npar_specs.pool = pool_create (); npar_specs.filter = MV_ANY; npar_specs.n_vars = -1; npar_specs.vv = NULL; if (! parse_npar_tests (lexer, ds, &cmd, &npar_specs)) { pool_destroy (npar_specs.pool); return CMD_FAILURE; } for (i = 0; i < npar_specs.n_tests; ++i) { const struct npar_test *test = npar_specs.test[i]; test->insert_variables (test, &var_map); } { struct hmapx_node *node; struct variable *var; npar_specs.n_vars = 0; HMAPX_FOR_EACH (var, node, &var_map) { npar_specs.n_vars ++; npar_specs.vv = pool_nrealloc (npar_specs.pool, npar_specs.vv, npar_specs.n_vars, sizeof (*npar_specs.vv)); npar_specs.vv[npar_specs.n_vars - 1] = var; } } sort (npar_specs.vv, npar_specs.n_vars, sizeof (*npar_specs.vv), compare_var_ptrs_by_name, NULL); if (cmd.statistics) { int i; for (i = 0 ; i < NPAR_ST_count; ++i) { if (cmd.a_statistics[i]) { switch (i) { case NPAR_ST_DESCRIPTIVES: npar_specs.descriptives = true; break; case NPAR_ST_QUARTILES: npar_specs.quartiles = true; break; case NPAR_ST_ALL: npar_specs.quartiles = true; npar_specs.descriptives = true; break; default: NOT_REACHED (); }; } } } input = proc_open (ds); if (cmd.miss == MISS_LISTWISE) { input = casereader_create_filter_missing (input, npar_specs.vv, npar_specs.n_vars, npar_specs.filter, NULL, NULL); } grouper = casegrouper_create_splits (input, dataset_dict (ds)); while (casegrouper_get_next_group (grouper, &group)) npar_execute (group, &npar_specs, ds); ok = casegrouper_destroy (grouper); ok = proc_commit (ds) && ok; pool_destroy (npar_specs.pool); hmapx_destroy (&var_map); return ok ? CMD_SUCCESS : CMD_CASCADING_FAILURE; } static int npar_runs (struct lexer *lexer, struct dataset *ds, struct npar_specs *specs) { struct runs_test *rt = pool_alloc (specs->pool, sizeof (*rt)); struct one_sample_test *tp = &rt->parent; struct npar_test *nt = &tp->parent; nt->execute = runs_execute; nt->insert_variables = one_sample_insert_variables; if (lex_force_match (lexer, T_LPAREN)) { if (lex_match_id (lexer, "MEAN")) { rt->cp_mode = CP_MEAN; } else if (lex_match_id (lexer, "MEDIAN")) { rt->cp_mode = CP_MEDIAN; } else if (lex_match_id (lexer, "MODE")) { rt->cp_mode = CP_MODE; } else if (lex_is_number (lexer)) { rt->cutpoint = lex_number (lexer); rt->cp_mode = CP_CUSTOM; lex_get (lexer); } else { lex_error (lexer, _("Expecting %s, %s, %s or a number."), "MEAN", "MEDIAN", "MODE"); return 0; } if (! lex_force_match (lexer, T_RPAREN)) return 2; if (! lex_force_match (lexer, T_EQUALS)) return 2; if (!parse_variables_const_pool (lexer, specs->pool, dataset_dict (ds), &tp->vars, &tp->n_vars, PV_NO_SCRATCH | PV_NO_DUPLICATE | PV_NUMERIC)) { return 2; } } specs->n_tests++; specs->test = pool_realloc (specs->pool, specs->test, sizeof (*specs->test) * specs->n_tests); specs->test[specs->n_tests - 1] = nt; return 1; } static int npar_friedman (struct lexer *lexer, struct dataset *ds, struct npar_specs *specs) { struct friedman_test *ft = pool_alloc (specs->pool, sizeof (*ft)); struct one_sample_test *ost = &ft->parent; struct npar_test *nt = &ost->parent; ft->kendalls_w = false; nt->execute = friedman_execute; nt->insert_variables = one_sample_insert_variables; lex_match (lexer, T_EQUALS); if (!parse_variables_const_pool (lexer, specs->pool, dataset_dict (ds), &ost->vars, &ost->n_vars, PV_NO_SCRATCH | PV_NO_DUPLICATE | PV_NUMERIC)) { return 2; } specs->n_tests++; specs->test = pool_realloc (specs->pool, specs->test, sizeof (*specs->test) * specs->n_tests); specs->test[specs->n_tests - 1] = nt; return 1; } static int npar_kendall (struct lexer *lexer, struct dataset *ds, struct npar_specs *specs) { struct friedman_test *kt = pool_alloc (specs->pool, sizeof (*kt)); struct one_sample_test *ost = &kt->parent; struct npar_test *nt = &ost->parent; kt->kendalls_w = true; nt->execute = friedman_execute; nt->insert_variables = one_sample_insert_variables; lex_match (lexer, T_EQUALS); if (!parse_variables_const_pool (lexer, specs->pool, dataset_dict (ds), &ost->vars, &ost->n_vars, PV_NO_SCRATCH | PV_NO_DUPLICATE | PV_NUMERIC)) { return 2; } specs->n_tests++; specs->test = pool_realloc (specs->pool, specs->test, sizeof (*specs->test) * specs->n_tests); specs->test[specs->n_tests - 1] = nt; return 1; } static int npar_cochran (struct lexer *lexer, struct dataset *ds, struct npar_specs *specs) { struct one_sample_test *ft = pool_alloc (specs->pool, sizeof (*ft)); struct npar_test *nt = &ft->parent; nt->execute = cochran_execute; nt->insert_variables = one_sample_insert_variables; lex_match (lexer, T_EQUALS); if (!parse_variables_const_pool (lexer, specs->pool, dataset_dict (ds), &ft->vars, &ft->n_vars, PV_NO_SCRATCH | PV_NO_DUPLICATE | PV_NUMERIC)) { return 2; } specs->n_tests++; specs->test = pool_realloc (specs->pool, specs->test, sizeof (*specs->test) * specs->n_tests); specs->test[specs->n_tests - 1] = nt; return 1; } static int npar_chisquare (struct lexer *lexer, struct dataset *ds, struct npar_specs *specs) { struct chisquare_test *cstp = pool_alloc (specs->pool, sizeof (*cstp)); struct one_sample_test *tp = &cstp->parent; struct npar_test *nt = &tp->parent; int retval = 1; nt->execute = chisquare_execute; nt->insert_variables = one_sample_insert_variables; if (!parse_variables_const_pool (lexer, specs->pool, dataset_dict (ds), &tp->vars, &tp->n_vars, PV_NO_SCRATCH | PV_NO_DUPLICATE)) { return 2; } cstp->ranged = false; if (lex_match (lexer, T_LPAREN)) { cstp->ranged = true; if (! lex_force_num (lexer)) return 0; cstp->lo = lex_number (lexer); lex_get (lexer); if (! lex_force_match (lexer, T_COMMA)) return 0; if (! lex_force_num (lexer)) return 0; cstp->hi = lex_number (lexer); if (cstp->lo >= cstp->hi) { msg (ME, _("The specified value of HI (%d) is " "lower than the specified value of LO (%d)"), cstp->hi, cstp->lo); return 0; } lex_get (lexer); if (! lex_force_match (lexer, T_RPAREN)) return 0; } cstp->n_expected = 0; cstp->expected = NULL; if (lex_match_phrase (lexer, "/EXPECTED")) { if (! lex_force_match (lexer, T_EQUALS)) return 0; if (! lex_match_id (lexer, "EQUAL")) { double f; int n; while (lex_is_number (lexer)) { int i; n = 1; f = lex_number (lexer); lex_get (lexer); if (lex_match (lexer, T_ASTERISK)) { n = f; if (!lex_force_num (lexer)) return 0; f = lex_number (lexer); lex_get (lexer); } lex_match (lexer, T_COMMA); cstp->n_expected += n; cstp->expected = pool_realloc (specs->pool, cstp->expected, sizeof (double) * cstp->n_expected); for (i = cstp->n_expected - n ; i < cstp->n_expected; ++i) cstp->expected[i] = f; } } } if (cstp->ranged && cstp->n_expected > 0 && cstp->n_expected != cstp->hi - cstp->lo + 1) { msg (ME, _("%d expected values were given, but the specified " "range (%d-%d) requires exactly %d values."), cstp->n_expected, cstp->lo, cstp->hi, cstp->hi - cstp->lo +1); return 0; } specs->n_tests++; specs->test = pool_realloc (specs->pool, specs->test, sizeof (*specs->test) * specs->n_tests); specs->test[specs->n_tests - 1] = nt; return retval; } static int npar_binomial (struct lexer *lexer, struct dataset *ds, struct npar_specs *specs) { struct binomial_test *btp = pool_alloc (specs->pool, sizeof (*btp)); struct one_sample_test *tp = &btp->parent; struct npar_test *nt = &tp->parent; bool equals = false; nt->execute = binomial_execute; nt->insert_variables = one_sample_insert_variables; btp->category1 = btp->category2 = btp->cutpoint = SYSMIS; btp->p = 0.5; if (lex_match (lexer, T_LPAREN)) { equals = false; if (lex_force_num (lexer)) { btp->p = lex_number (lexer); lex_get (lexer); if (!lex_force_match (lexer, T_RPAREN)) return 0; } else return 0; } else equals = true; if (!equals) if (!lex_force_match (lexer, T_EQUALS)) return 0; { if (parse_variables_const_pool (lexer, specs->pool, dataset_dict (ds), &tp->vars, &tp->n_vars, PV_NUMERIC | PV_NO_SCRATCH | PV_NO_DUPLICATE)) { if (lex_match (lexer, T_LPAREN)) { if (! lex_force_num (lexer)) return 2; btp->category1 = lex_number (lexer); lex_get (lexer); if (lex_match (lexer, T_COMMA)) { if (! lex_force_num (lexer)) return 2; btp->category2 = lex_number (lexer); lex_get (lexer); } else { btp->cutpoint = btp->category1; } if (! lex_force_match (lexer, T_RPAREN)) return 0; } } else { return 2; } } specs->n_tests++; specs->test = pool_realloc (specs->pool, specs->test, sizeof (*specs->test) * specs->n_tests); specs->test[specs->n_tests - 1] = nt; return 1; } static void ks_one_sample_parse_params (struct lexer *lexer, struct ks_one_sample_test *kst, int params) { assert (params == 1 || params == 2); if (lex_is_number (lexer)) { kst->p[0] = lex_number (lexer); lex_get (lexer); if (params == 2) { lex_match (lexer, T_COMMA); if (lex_force_num (lexer)) { kst->p[1] = lex_number (lexer); lex_get (lexer); } } } } static int npar_ks_one_sample (struct lexer *lexer, struct dataset *ds, struct npar_specs *specs) { struct ks_one_sample_test *kst = pool_alloc (specs->pool, sizeof (*kst)); struct one_sample_test *tp = &kst->parent; struct npar_test *nt = &tp->parent; nt->execute = ks_one_sample_execute; nt->insert_variables = one_sample_insert_variables; kst->p[0] = kst->p[1] = SYSMIS; if (! lex_force_match (lexer, T_LPAREN)) return 2; if (lex_match_id (lexer, "NORMAL")) { kst->dist = KS_NORMAL; ks_one_sample_parse_params (lexer, kst, 2); } else if (lex_match_id (lexer, "POISSON")) { kst->dist = KS_POISSON; ks_one_sample_parse_params (lexer, kst, 1); } else if (lex_match_id (lexer, "UNIFORM")) { kst->dist = KS_UNIFORM; ks_one_sample_parse_params (lexer, kst, 2); } else if (lex_match_id (lexer, "EXPONENTIAL")) { kst->dist = KS_EXPONENTIAL; ks_one_sample_parse_params (lexer, kst, 1); } else return 2; if (! lex_force_match (lexer, T_RPAREN)) return 2; lex_match (lexer, T_EQUALS); if (! parse_variables_const_pool (lexer, specs->pool, dataset_dict (ds), &tp->vars, &tp->n_vars, PV_NUMERIC | PV_NO_SCRATCH | PV_NO_DUPLICATE)) return 2; specs->n_tests++; specs->test = pool_realloc (specs->pool, specs->test, sizeof (*specs->test) * specs->n_tests); specs->test[specs->n_tests - 1] = nt; return 1; } static bool parse_two_sample_related_test (struct lexer *lexer, const struct dictionary *dict, struct two_sample_test *test_parameters, struct pool *pool) { int n = 0; bool paired = false; bool with = false; const struct variable **vlist1; size_t n_vlist1; const struct variable **vlist2; size_t n_vlist2; test_parameters->parent.insert_variables = two_sample_insert_variables; if (!parse_variables_const_pool (lexer, pool, dict, &vlist1, &n_vlist1, PV_NUMERIC | PV_NO_SCRATCH | PV_DUPLICATE)) return false; if (lex_match (lexer, T_WITH)) { with = true; if (!parse_variables_const_pool (lexer, pool, dict, &vlist2, &n_vlist2, PV_NUMERIC | PV_NO_SCRATCH | PV_DUPLICATE)) return false; paired = (lex_match (lexer, T_LPAREN) && lex_match_id (lexer, "PAIRED") && lex_match (lexer, T_RPAREN)); } if (with) { if (paired) { if (n_vlist1 != n_vlist2) { msg (SE, _("PAIRED was specified but the number of variables " "preceding WITH (%zu) did not match the number " "following (%zu)."), n_vlist1, n_vlist2); return false; } test_parameters->n_pairs = n_vlist1 ; } else { test_parameters->n_pairs = n_vlist1 * n_vlist2; } } else { test_parameters->n_pairs = (n_vlist1 * (n_vlist1 - 1)) / 2 ; } test_parameters->pairs = pool_alloc (pool, sizeof (variable_pair) * test_parameters->n_pairs); if (with) { if (paired) { int i; assert (n_vlist1 == n_vlist2); for (i = 0 ; i < n_vlist1; ++i) { test_parameters->pairs[n][0] = vlist1[i]; test_parameters->pairs[n][1] = vlist2[i]; n++; } } else { int i,j; for (i = 0 ; i < n_vlist1; ++i) { for (j = 0 ; j < n_vlist2; ++j) { test_parameters->pairs[n][0] = vlist1[i]; test_parameters->pairs[n][1] = vlist2[j]; n++; } } } } else { int i,j; for (i = 0 ; i < n_vlist1 - 1; ++i) { for (j = i + 1 ; j < n_vlist1; ++j) { assert (n < test_parameters->n_pairs); test_parameters->pairs[n][0] = vlist1[i]; test_parameters->pairs[n][1] = vlist1[j]; n++; } } } assert (n == test_parameters->n_pairs); return true; } static bool parse_n_sample_related_test (struct lexer *lexer, const struct dictionary *dict, struct n_sample_test *nst, struct pool *pool ) { if (!parse_variables_const_pool (lexer, pool, dict, &nst->vars, &nst->n_vars, PV_NUMERIC | PV_NO_SCRATCH | PV_NO_DUPLICATE)) return false; if (! lex_force_match (lexer, T_BY)) return false; nst->indep_var = parse_variable_const (lexer, dict); if (!nst->indep_var) return false; if (! lex_force_match (lexer, T_LPAREN)) return false; value_init (&nst->val1, var_get_width (nst->indep_var)); if (! parse_value (lexer, &nst->val1, nst->indep_var)) { value_destroy (&nst->val1, var_get_width (nst->indep_var)); return false; } lex_match (lexer, T_COMMA); value_init (&nst->val2, var_get_width (nst->indep_var)); if (! parse_value (lexer, &nst->val2, nst->indep_var)) { value_destroy (&nst->val2, var_get_width (nst->indep_var)); return false; } if (! lex_force_match (lexer, T_RPAREN)) return false; return true; } static int npar_wilcoxon (struct lexer *lexer, struct dataset *ds, struct npar_specs *specs) { struct two_sample_test *tp = pool_alloc (specs->pool, sizeof (*tp)); struct npar_test *nt = &tp->parent; nt->execute = wilcoxon_execute; if (!parse_two_sample_related_test (lexer, dataset_dict (ds), tp, specs->pool)) return 0; specs->n_tests++; specs->test = pool_realloc (specs->pool, specs->test, sizeof (*specs->test) * specs->n_tests); specs->test[specs->n_tests - 1] = nt; return 1; } static int npar_mann_whitney (struct lexer *lexer, struct dataset *ds, struct npar_specs *specs) { struct n_sample_test *tp = pool_alloc (specs->pool, sizeof (*tp)); struct npar_test *nt = &tp->parent; nt->insert_variables = n_sample_insert_variables; nt->execute = mann_whitney_execute; if (!parse_n_sample_related_test (lexer, dataset_dict (ds), tp, specs->pool)) return 0; specs->n_tests++; specs->test = pool_realloc (specs->pool, specs->test, sizeof (*specs->test) * specs->n_tests); specs->test[specs->n_tests - 1] = nt; return 1; } static int npar_median (struct lexer *lexer, struct dataset *ds, struct npar_specs *specs) { struct median_test *mt = pool_alloc (specs->pool, sizeof (*mt)); struct n_sample_test *tp = &mt->parent; struct npar_test *nt = &tp->parent; mt->median = SYSMIS; if (lex_match (lexer, T_LPAREN) && lex_force_num (lexer)) { mt->median = lex_number (lexer); lex_get (lexer); if (! lex_force_match (lexer, T_RPAREN)) return 0; } lex_match (lexer, T_EQUALS); nt->insert_variables = n_sample_insert_variables; nt->execute = median_execute; if (!parse_n_sample_related_test (lexer, dataset_dict (ds), tp, specs->pool)) return 0; specs->n_tests++; specs->test = pool_realloc (specs->pool, specs->test, sizeof (*specs->test) * specs->n_tests); specs->test[specs->n_tests - 1] = nt; return 1; } static int npar_sign (struct lexer *lexer, struct dataset *ds, struct npar_specs *specs) { struct two_sample_test *tp = pool_alloc (specs->pool, sizeof (*tp)); struct npar_test *nt = &tp->parent; nt->execute = sign_execute; if (!parse_two_sample_related_test (lexer, dataset_dict (ds), tp, specs->pool)) return 0; specs->n_tests++; specs->test = pool_realloc (specs->pool, specs->test, sizeof (*specs->test) * specs->n_tests); specs->test[specs->n_tests - 1] = nt; return 1; } static int npar_mcnemar (struct lexer *lexer, struct dataset *ds, struct npar_specs *specs) { struct two_sample_test *tp = pool_alloc (specs->pool, sizeof (*tp)); struct npar_test *nt = &tp->parent; nt->execute = mcnemar_execute; if (!parse_two_sample_related_test (lexer, dataset_dict (ds), tp, specs->pool)) return 0; specs->n_tests++; specs->test = pool_realloc (specs->pool, specs->test, sizeof (*specs->test) * specs->n_tests); specs->test[specs->n_tests - 1] = nt; return 1; } static int npar_jonckheere_terpstra (struct lexer *lexer, struct dataset *ds, struct npar_specs *specs) { struct n_sample_test *tp = pool_alloc (specs->pool, sizeof (*tp)); struct npar_test *nt = &tp->parent; nt->insert_variables = n_sample_insert_variables; nt->execute = jonckheere_terpstra_execute; if (!parse_n_sample_related_test (lexer, dataset_dict (ds), tp, specs->pool)) return 0; specs->n_tests++; specs->test = pool_realloc (specs->pool, specs->test, sizeof (*specs->test) * specs->n_tests); specs->test[specs->n_tests - 1] = nt; return 1; } static int npar_kruskal_wallis (struct lexer *lexer, struct dataset *ds, struct npar_specs *specs) { struct n_sample_test *tp = pool_alloc (specs->pool, sizeof (*tp)); struct npar_test *nt = &tp->parent; nt->insert_variables = n_sample_insert_variables; nt->execute = kruskal_wallis_execute; if (!parse_n_sample_related_test (lexer, dataset_dict (ds), tp, specs->pool)) return 0; specs->n_tests++; specs->test = pool_realloc (specs->pool, specs->test, sizeof (*specs->test) * specs->n_tests); specs->test[specs->n_tests - 1] = nt; return 1; } static void insert_variable_into_map (struct hmapx *var_map, const struct variable *var) { size_t hash = hash_pointer (var, 0); struct hmapx_node *node; const struct variable *v = NULL; HMAPX_FOR_EACH_WITH_HASH (v, node, hash, var_map) { if (v == var) return ; } hmapx_insert (var_map, CONST_CAST (struct variable *, var), hash); } /* Insert the variables for TEST into VAR_MAP */ static void one_sample_insert_variables (const struct npar_test *test, struct hmapx *var_map) { int i; const struct one_sample_test *ost = UP_CAST (test, const struct one_sample_test, parent); for (i = 0 ; i < ost->n_vars ; ++i) insert_variable_into_map (var_map, ost->vars[i]); } static void two_sample_insert_variables (const struct npar_test *test, struct hmapx *var_map) { int i; const struct two_sample_test *tst = UP_CAST (test, const struct two_sample_test, parent); for (i = 0 ; i < tst->n_pairs ; ++i) { variable_pair *pair = &tst->pairs[i]; insert_variable_into_map (var_map, (*pair)[0]); insert_variable_into_map (var_map, (*pair)[1]); } } static void n_sample_insert_variables (const struct npar_test *test, struct hmapx *var_map) { int i; const struct n_sample_test *tst = UP_CAST (test, const struct n_sample_test, parent); for (i = 0 ; i < tst->n_vars ; ++i) insert_variable_into_map (var_map, tst->vars[i]); insert_variable_into_map (var_map, tst->indep_var); } static int npar_method (struct lexer *lexer, struct npar_specs *specs) { if (lex_match_id (lexer, "EXACT")) { specs->exact = true; specs->timer = 0.0; if (lex_match_id (lexer, "TIMER")) { specs->timer = 5.0; if (lex_match (lexer, T_LPAREN)) { if (lex_force_num (lexer)) { specs->timer = lex_number (lexer); lex_get (lexer); } if (lex_force_match (lexer, T_RPAREN)) return 0; } } } return 1; } pspp-1.4.1/src/language/stats/frequencies.c0000644000175000017500000012310713670210420020277 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 1997-9, 2000, 2007, 2009, 2010, 2011, 2014, 2015 Free Software Foundation, Inc. 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 3 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, see . */ #include #include #include #include "data/case.h" #include "data/casegrouper.h" #include "data/casereader.h" #include "data/dataset.h" #include "data/dictionary.h" #include "data/format.h" #include "data/missing-values.h" #include "data/settings.h" #include "data/value-labels.h" #include "data/variable.h" #include "language/dictionary/split-file.h" #include "language/command.h" #include "language/lexer/lexer.h" #include "language/lexer/variable-parser.h" #include "language/stats/freq.h" #include "libpspp/array.h" #include "libpspp/bit-vector.h" #include "libpspp/compiler.h" #include "libpspp/hmap.h" #include "libpspp/message.h" #include "libpspp/misc.h" #include "libpspp/pool.h" #include "math/histogram.h" #include "math/moments.h" #include "math/chart-geometry.h" #include "output/chart-item.h" #include "output/charts/barchart.h" #include "output/charts/piechart.h" #include "output/charts/plot-hist.h" #include "output/pivot-table.h" #include "gl/minmax.h" #include "gl/xalloc.h" #include "gettext.h" #define _(msgid) gettext (msgid) #define N_(msgid) msgid /* Percentiles to calculate. */ struct percentile { double p; /* the %ile to be calculated */ double value; /* the %ile's value */ bool show; /* True to show this percentile in the statistics box. */ }; static int ptile_3way (const void *_p1, const void *_p2) { const struct percentile *p1 = _p1; const struct percentile *p2 = _p2; if (p1->p < p2->p) return -1; if (p1->p == p2->p) { if (p1->show > p2->show) return -1; return (p1->show < p2->show); } return (p1->p > p2->p); } enum { FRQ_NONORMAL, FRQ_NORMAL }; enum { FRQ_FREQ, FRQ_PERCENT }; enum sortprops { FRQ_AFREQ, FRQ_DFREQ, FRQ_AVALUE, FRQ_DVALUE }; /* Array indices for STATISTICS subcommand. */ enum { FRQ_ST_MEAN, FRQ_ST_SEMEAN, FRQ_ST_MEDIAN, FRQ_ST_MODE, FRQ_ST_STDDEV, FRQ_ST_VARIANCE, FRQ_ST_KURTOSIS, FRQ_ST_SEKURTOSIS, FRQ_ST_SKEWNESS, FRQ_ST_SESKEWNESS, FRQ_ST_RANGE, FRQ_ST_MINIMUM, FRQ_ST_MAXIMUM, FRQ_ST_SUM, FRQ_ST_count }; /* Description of statistics. */ static const char *st_name[FRQ_ST_count] = { N_("Mean"), N_("S.E. Mean"), N_("Median"), N_("Mode"), N_("Std Dev"), N_("Variance"), N_("Kurtosis"), N_("S.E. Kurt"), N_("Skewness"), N_("S.E. Skew"), N_("Range"), N_("Minimum"), N_("Maximum"), N_("Sum") }; struct freq_tab { struct hmap data; /* Hash table for accumulating counts. */ struct freq *valid; /* Valid freqs. */ int n_valid; /* Number of total freqs. */ const struct dictionary *dict; /* Source of entries in the table. */ struct freq *missing; /* Missing freqs. */ int n_missing; /* Number of missing freqs. */ /* Statistics. */ double total_cases; /* Sum of weights of all cases. */ double valid_cases; /* Sum of weights of valid cases. */ }; struct frq_chart { double x_min; /* X axis minimum value. */ double x_max; /* X axis maximum value. */ int y_scale; /* Y axis scale: FRQ_FREQ or FRQ_PERCENT. */ /* Histograms only. */ double y_max; /* Y axis maximum value. */ bool draw_normal; /* Whether to draw normal curve. */ /* Pie charts only. */ bool include_missing; /* Whether to include missing values. */ }; /* Per-variable frequency data. */ struct var_freqs { const struct variable *var; /* Freqency table. */ struct freq_tab tab; /* Frequencies table to use. */ /* Percentiles. */ int n_groups; /* Number of groups. */ double *groups; /* Groups. */ /* Statistics. */ double stat[FRQ_ST_count]; /* Variable attributes. */ int width; }; struct frq_proc { struct pool *pool; struct var_freqs *vars; size_t n_vars; /* Percentiles to calculate and possibly display. */ struct percentile *percentiles; const struct percentile *median; int n_percentiles; /* Frequency table display. */ long int max_categories; /* Maximum categories to show. */ int sort; /* FRQ_AVALUE or FRQ_DVALUE or FRQ_AFREQ or FRQ_DFREQ. */ /* Statistics; number of statistics. */ unsigned long stats; int n_stats; /* Histogram and pie chart settings. */ struct frq_chart *hist, *pie, *bar; bool warn; }; struct freq_compare_aux { bool by_freq; bool ascending_freq; int width; bool ascending_value; }; static void calc_stats (const struct frq_proc *, const struct var_freqs *, double d[FRQ_ST_count]); static void do_piechart(const struct frq_chart *pie, const struct variable *var, const struct freq_tab *frq_tab); static void do_barchart(const struct frq_chart *bar, const struct variable **var, const struct freq_tab *frq_tab); static void dump_statistics (const struct frq_proc *frq, const struct variable *wv); static int compare_freq (const void *a_, const void *b_, const void *aux_) { const struct freq_compare_aux *aux = aux_; const struct freq *a = a_; const struct freq *b = b_; if (aux->by_freq && a->count != b->count) { int cmp = a->count > b->count ? 1 : -1; return aux->ascending_freq ? cmp : -cmp; } else { int cmp = value_compare_3way (a->values, b->values, aux->width); return aux->ascending_value ? cmp : -cmp; } } /* Create a gsl_histogram from a freq_tab */ static struct histogram * freq_tab_to_hist (const struct frq_proc *frq, const struct freq_tab *ft, const struct variable *var); static void put_freq_row (struct pivot_table *table, int var_idx, double frequency, double percent, double valid_percent, double cum_percent) { double entries[] = { frequency, percent, valid_percent, cum_percent }; for (size_t i = 0; i < sizeof entries / sizeof *entries; i++) if (entries[i] != SYSMIS) pivot_table_put2 (table, i, var_idx, pivot_value_new_number (entries[i])); } /* Displays a full frequency table for variable V. */ static void dump_freq_table (const struct var_freqs *vf, const struct variable *wv) { const struct freq_tab *ft = &vf->tab; struct pivot_table *table = pivot_table_create__ (pivot_value_new_variable ( vf->var), "Frequencies"); pivot_table_set_weight_var (table, wv); pivot_dimension_create (table, PIVOT_AXIS_COLUMN, N_("Statistics"), N_("Frequency"), PIVOT_RC_COUNT, N_("Percent"), PIVOT_RC_PERCENT, N_("Valid Percent"), PIVOT_RC_PERCENT, N_("Cumulative Percent"), PIVOT_RC_PERCENT); struct pivot_dimension *variable = pivot_dimension_create__ ( table, PIVOT_AXIS_ROW, pivot_value_new_variable (vf->var)); double cum_freq = 0.0; double cum_percent = 0.0; struct pivot_category *valid = NULL; for (const struct freq *f = ft->valid; f < ft->missing; f++) { cum_freq += f->count; double valid_percent = f->count / ft->valid_cases * 100.0; cum_percent += valid_percent; if (!valid) valid = pivot_category_create_group (variable->root, N_("Valid")); int var_idx = pivot_category_create_leaf ( valid, pivot_value_new_var_value (vf->var, &f->values[0])); put_freq_row (table, var_idx, f->count, f->count / ft->total_cases * 100.0, valid_percent, cum_percent); } struct pivot_category *missing = NULL; size_t n_categories = ft->n_valid + ft->n_missing; for (const struct freq *f = ft->missing; f < &ft->valid[n_categories]; f++) { cum_freq += f->count; if (!missing) missing = pivot_category_create_group (variable->root, N_("Missing")); int var_idx = pivot_category_create_leaf ( missing, pivot_value_new_var_value (vf->var, &f->values[0])); put_freq_row (table, var_idx, f->count, f->count / ft->total_cases * 100.0, SYSMIS, SYSMIS); } int var_idx = pivot_category_create_leaf ( variable->root, pivot_value_new_text (N_("Total"))); put_freq_row (table, var_idx, cum_freq, cum_percent, SYSMIS, SYSMIS); pivot_table_submit (table); } /* Statistical display. */ static double calc_percentile (double p, double valid_cases, double x1, double x2) { double s, dummy; s = (settings_get_algorithm () != COMPATIBLE ? modf ((valid_cases - 1) * p, &dummy) : modf ((valid_cases + 1) * p - 1, &dummy)); return x1 + (x2 - x1) * s; } /* Calculates all of the percentiles for VF within FRQ. */ static void calc_percentiles (const struct frq_proc *frq, const struct var_freqs *vf) { const struct freq_tab *ft = &vf->tab; double W = ft->valid_cases; const struct freq *f; int percentile_idx = 0; double rank = 0; for (f = ft->valid; f < ft->missing; f++) { rank += f->count; for (; percentile_idx < frq->n_percentiles; percentile_idx++) { struct percentile *pc = &frq->percentiles[percentile_idx]; double tp; tp = (settings_get_algorithm () == ENHANCED ? (W - 1) * pc->p : (W + 1) * pc->p - 1); if (rank <= tp) break; if (tp + 1 < rank || f + 1 >= ft->missing) pc->value = f->values[0].f; else pc->value = calc_percentile (pc->p, W, f->values[0].f, f[1].values[0].f); } } for (; percentile_idx < frq->n_percentiles; percentile_idx++) { struct percentile *pc = &frq->percentiles[percentile_idx]; pc->value = (ft->n_valid > 0 ? ft->valid[ft->n_valid - 1].values[0].f : SYSMIS); } } /* Returns true iff the value in struct freq F is non-missing for variable V. */ static bool not_missing (const void *f_, const void *v_) { const struct freq *f = f_; const struct variable *v = v_; return !var_is_value_missing (v, f->values, MV_ANY); } /* Summarizes the frequency table data for variable V. */ static void postprocess_freq_tab (const struct frq_proc *frq, struct var_freqs *vf) { struct freq_tab *ft = &vf->tab; struct freq_compare_aux aux; size_t count; struct freq *freqs, *f; size_t i; /* Extract data from hash table. */ count = hmap_count (&ft->data); freqs = freq_hmap_extract (&ft->data); /* Put data into ft. */ ft->valid = freqs; ft->n_valid = partition (freqs, count, sizeof *freqs, not_missing, vf->var); ft->missing = freqs + ft->n_valid; ft->n_missing = count - ft->n_valid; /* Sort data. */ aux.by_freq = frq->sort == FRQ_AFREQ || frq->sort == FRQ_DFREQ; aux.ascending_freq = frq->sort != FRQ_DFREQ; aux.width = vf->width; aux.ascending_value = frq->sort != FRQ_DVALUE; sort (ft->valid, ft->n_valid, sizeof *ft->valid, compare_freq, &aux); sort (ft->missing, ft->n_missing, sizeof *ft->missing, compare_freq, &aux); /* Summary statistics. */ ft->valid_cases = 0.0; for(i = 0 ; i < ft->n_valid ; ++i) { f = &ft->valid[i]; ft->valid_cases += f->count; } ft->total_cases = ft->valid_cases ; for(i = 0 ; i < ft->n_missing ; ++i) { f = &ft->missing[i]; ft->total_cases += f->count; } } /* Frees the frequency table for variable V. */ static void cleanup_freq_tab (struct var_freqs *vf) { free (vf->tab.valid); freq_hmap_destroy (&vf->tab.data, vf->width); } /* Add data from case C to the frequency table. */ static void calc (struct frq_proc *frq, const struct ccase *c, const struct dataset *ds) { double weight = dict_get_case_weight (dataset_dict (ds), c, &frq->warn); size_t i; for (i = 0; i < frq->n_vars; i++) { struct var_freqs *vf = &frq->vars[i]; const union value *value = case_data (c, vf->var); size_t hash = value_hash (value, vf->width, 0); struct freq *f; f = freq_hmap_search (&vf->tab.data, value, vf->width, hash); if (f == NULL) f = freq_hmap_insert (&vf->tab.data, value, vf->width, hash); f->count += weight; } } /* Prepares each variable that is the target of FREQUENCIES by setting up its hash table. */ static void precalc (struct frq_proc *frq, struct casereader *input, struct dataset *ds) { struct ccase *c; size_t i; c = casereader_peek (input, 0); if (c != NULL) { output_split_file_values (ds, c); case_unref (c); } for (i = 0; i < frq->n_vars; i++) hmap_init (&frq->vars[i].tab.data); } /* Finishes up with the variables after frequencies have been calculated. Displays statistics, percentiles, ... */ static void postcalc (struct frq_proc *frq, const struct dataset *ds) { const struct dictionary *dict = dataset_dict (ds); const struct variable *wv = dict_get_weight (dict); size_t i; for (i = 0; i < frq->n_vars; i++) { struct var_freqs *vf = &frq->vars[i]; postprocess_freq_tab (frq, vf); calc_percentiles (frq, vf); } if (frq->n_stats) dump_statistics (frq, wv); for (i = 0; i < frq->n_vars; i++) { struct var_freqs *vf = &frq->vars[i]; /* Frequencies tables. */ if (vf->tab.n_valid + vf->tab.n_missing <= frq->max_categories) dump_freq_table (vf, wv); if (frq->hist && var_is_numeric (vf->var) && vf->tab.n_valid > 0) { double d[FRQ_ST_count]; struct histogram *histogram; calc_stats (frq, vf, d); histogram = freq_tab_to_hist (frq, &vf->tab, vf->var); if (histogram) { chart_item_submit (histogram_chart_create ( histogram->gsl_hist, var_to_string(vf->var), vf->tab.valid_cases, d[FRQ_ST_MEAN], d[FRQ_ST_STDDEV], frq->hist->draw_normal)); statistic_destroy (&histogram->parent); } } if (frq->pie) do_piechart(frq->pie, vf->var, &vf->tab); if (frq->bar) do_barchart(frq->bar, &vf->var, &vf->tab); cleanup_freq_tab (vf); } } int cmd_frequencies (struct lexer *lexer, struct dataset *ds) { int i; struct frq_proc frq; const struct variable **vars = NULL; bool sbc_barchart = false; bool sbc_piechart = false; bool sbc_histogram = false; double pie_min = -DBL_MAX; double pie_max = DBL_MAX; bool pie_missing = true; double bar_min = -DBL_MAX; double bar_max = DBL_MAX; bool bar_freq = true; double hi_min = -DBL_MAX; double hi_max = DBL_MAX; int hi_scale = FRQ_FREQ; int hi_freq = INT_MIN; int hi_pcnt = INT_MIN; int hi_norm = FRQ_NONORMAL; frq.pool = pool_create (); frq.sort = FRQ_AVALUE; frq.vars = NULL; frq.n_vars = 0; frq.stats = BIT_INDEX (FRQ_ST_MEAN) | BIT_INDEX (FRQ_ST_STDDEV) | BIT_INDEX (FRQ_ST_MINIMUM) | BIT_INDEX (FRQ_ST_MAXIMUM); frq.n_stats = 4; frq.max_categories = LONG_MAX; frq.percentiles = NULL; frq.n_percentiles = 0; frq.hist = NULL; frq.pie = NULL; frq.bar = NULL; frq.warn = true; /* Accept an optional, completely pointless "/VARIABLES=" */ lex_match (lexer, T_SLASH); if (lex_match_id (lexer, "VARIABLES")) { if (! lex_force_match (lexer, T_EQUALS)) goto error; } if (!parse_variables_const (lexer, dataset_dict (ds), &vars, &frq.n_vars, PV_NO_DUPLICATE)) goto error; frq.vars = xzalloc (frq.n_vars * sizeof (*frq.vars)); for (i = 0; i < frq.n_vars; ++i) { frq.vars[i].var = vars[i]; frq.vars[i].width = var_get_width (vars[i]); } while (lex_token (lexer) != T_ENDCMD) { lex_match (lexer, T_SLASH); if (lex_match_id (lexer, "STATISTICS")) { frq.stats = BIT_INDEX (FRQ_ST_MEAN) | BIT_INDEX (FRQ_ST_STDDEV) | BIT_INDEX (FRQ_ST_MINIMUM) | BIT_INDEX (FRQ_ST_MAXIMUM); frq.n_stats = 4; if (lex_match (lexer, T_EQUALS)) { frq.n_stats = 0; frq.stats = 0; } while (lex_token (lexer) != T_ENDCMD && lex_token (lexer) != T_SLASH) { if (lex_match_id (lexer, "DEFAULT")) { frq.stats = BIT_INDEX (FRQ_ST_MEAN) | BIT_INDEX (FRQ_ST_STDDEV) | BIT_INDEX (FRQ_ST_MINIMUM) | BIT_INDEX (FRQ_ST_MAXIMUM); frq.n_stats = 4; } else if (lex_match_id (lexer, "MEAN")) { frq.stats |= BIT_INDEX (FRQ_ST_MEAN); frq.n_stats++; } else if (lex_match_id (lexer, "SEMEAN")) { frq.stats |= BIT_INDEX (FRQ_ST_SEMEAN); frq.n_stats++; } else if (lex_match_id (lexer, "MEDIAN")) { frq.stats |= BIT_INDEX (FRQ_ST_MEDIAN); frq.n_stats++; } else if (lex_match_id (lexer, "MODE")) { frq.stats |= BIT_INDEX (FRQ_ST_MODE); frq.n_stats++; } else if (lex_match_id (lexer, "STDDEV")) { frq.stats |= BIT_INDEX (FRQ_ST_STDDEV); frq.n_stats++; } else if (lex_match_id (lexer, "VARIANCE")) { frq.stats |= BIT_INDEX (FRQ_ST_VARIANCE); frq.n_stats++; } else if (lex_match_id (lexer, "KURTOSIS")) { frq.stats |= BIT_INDEX (FRQ_ST_KURTOSIS); frq.n_stats++; } else if (lex_match_id (lexer, "SKEWNESS")) { frq.stats |= BIT_INDEX (FRQ_ST_SKEWNESS); frq.n_stats++; } else if (lex_match_id (lexer, "RANGE")) { frq.stats |= BIT_INDEX (FRQ_ST_RANGE); frq.n_stats++; } else if (lex_match_id (lexer, "MINIMUM")) { frq.stats |= BIT_INDEX (FRQ_ST_MINIMUM); frq.n_stats++; } else if (lex_match_id (lexer, "MAXIMUM")) { frq.stats |= BIT_INDEX (FRQ_ST_MAXIMUM); frq.n_stats++; } else if (lex_match_id (lexer, "SUM")) { frq.stats |= BIT_INDEX (FRQ_ST_SUM); frq.n_stats++; } else if (lex_match_id (lexer, "SESKEWNESS")) { frq.stats |= BIT_INDEX (FRQ_ST_SESKEWNESS); frq.n_stats++; } else if (lex_match_id (lexer, "SEKURTOSIS")) { frq.stats |= BIT_INDEX (FRQ_ST_SEKURTOSIS); frq.n_stats++; } else if (lex_match_id (lexer, "NONE")) { frq.stats = 0; frq.n_stats = 0; } else if (lex_match (lexer, T_ALL)) { frq.stats = ~0; frq.n_stats = FRQ_ST_count; } else { lex_error (lexer, NULL); goto error; } } } else if (lex_match_id (lexer, "PERCENTILES")) { lex_match (lexer, T_EQUALS); while (lex_token (lexer) != T_ENDCMD && lex_token (lexer) != T_SLASH) { if (lex_force_num (lexer)) { frq.percentiles = xrealloc (frq.percentiles, (frq.n_percentiles + 1) * sizeof (*frq.percentiles)); frq.percentiles[frq.n_percentiles].p = lex_number (lexer) / 100.0; frq.percentiles[frq.n_percentiles].show = true; lex_get (lexer); frq.n_percentiles++; } else { lex_error (lexer, NULL); goto error; } lex_match (lexer, T_COMMA); } } else if (lex_match_id (lexer, "FORMAT")) { lex_match (lexer, T_EQUALS); while (lex_token (lexer) != T_ENDCMD && lex_token (lexer) != T_SLASH) { if (lex_match_id (lexer, "TABLE")) { } else if (lex_match_id (lexer, "NOTABLE")) { frq.max_categories = 0; } else if (lex_match_id (lexer, "LIMIT")) { if (!lex_force_match (lexer, T_LPAREN) || !lex_force_int (lexer)) goto error; frq.max_categories = lex_integer (lexer); lex_get (lexer); if (!lex_force_match (lexer, T_RPAREN)) goto error; } else if (lex_match_id (lexer, "AVALUE")) { frq.sort = FRQ_AVALUE; } else if (lex_match_id (lexer, "DVALUE")) { frq.sort = FRQ_DVALUE; } else if (lex_match_id (lexer, "AFREQ")) { frq.sort = FRQ_AFREQ; } else if (lex_match_id (lexer, "DFREQ")) { frq.sort = FRQ_DFREQ; } else { lex_error (lexer, NULL); goto error; } } } else if (lex_match_id (lexer, "NTILES")) { lex_match (lexer, T_EQUALS); if (lex_force_int (lexer)) { int i; int n = lex_integer (lexer); lex_get (lexer); for (i = 0; i < n + 1; ++i) { frq.percentiles = xrealloc (frq.percentiles, (frq.n_percentiles + 1) * sizeof (*frq.percentiles)); frq.percentiles[frq.n_percentiles].p = i / (double) n ; frq.percentiles[frq.n_percentiles].show = true; frq.n_percentiles++; } } else { lex_error (lexer, NULL); goto error; } } else if (lex_match_id (lexer, "ALGORITHM")) { lex_match (lexer, T_EQUALS); if (lex_match_id (lexer, "COMPATIBLE")) { settings_set_cmd_algorithm (COMPATIBLE); } else if (lex_match_id (lexer, "ENHANCED")) { settings_set_cmd_algorithm (ENHANCED); } else { lex_error (lexer, NULL); goto error; } } else if (lex_match_id (lexer, "HISTOGRAM")) { lex_match (lexer, T_EQUALS); sbc_histogram = true; while (lex_token (lexer) != T_ENDCMD && lex_token (lexer) != T_SLASH) { if (lex_match_id (lexer, "NORMAL")) { hi_norm = FRQ_NORMAL; } else if (lex_match_id (lexer, "NONORMAL")) { hi_norm = FRQ_NONORMAL; } else if (lex_match_id (lexer, "FREQ")) { hi_scale = FRQ_FREQ; if (lex_match (lexer, T_LPAREN)) { if (lex_force_int (lexer)) { hi_freq = lex_integer (lexer); if (hi_freq <= 0) { lex_error (lexer, _("Histogram frequency must be greater than zero.")); } lex_get (lexer); if (! lex_force_match (lexer, T_RPAREN)) goto error; } } } else if (lex_match_id (lexer, "PERCENT")) { hi_scale = FRQ_PERCENT; if (lex_match (lexer, T_LPAREN)) { if (lex_force_int (lexer)) { hi_pcnt = lex_integer (lexer); if (hi_pcnt <= 0) { lex_error (lexer, _("Histogram percentage must be greater than zero.")); } lex_get (lexer); if (! lex_force_match (lexer, T_RPAREN)) goto error; } } } else if (lex_match_id (lexer, "MINIMUM")) { if (! lex_force_match (lexer, T_LPAREN)) goto error; if (lex_force_num (lexer)) { hi_min = lex_number (lexer); lex_get (lexer); } if (! lex_force_match (lexer, T_RPAREN)) goto error; } else if (lex_match_id (lexer, "MAXIMUM")) { if (! lex_force_match (lexer, T_LPAREN)) goto error; if (lex_force_num (lexer)) { hi_max = lex_number (lexer); lex_get (lexer); } if (! lex_force_match (lexer, T_RPAREN)) goto error; } else { lex_error (lexer, NULL); goto error; } } } else if (lex_match_id (lexer, "PIECHART")) { lex_match (lexer, T_EQUALS); while (lex_token (lexer) != T_ENDCMD && lex_token (lexer) != T_SLASH) { if (lex_match_id (lexer, "MINIMUM")) { if (! lex_force_match (lexer, T_LPAREN)) goto error; if (lex_force_num (lexer)) { pie_min = lex_number (lexer); lex_get (lexer); } if (! lex_force_match (lexer, T_RPAREN)) goto error; } else if (lex_match_id (lexer, "MAXIMUM")) { if (! lex_force_match (lexer, T_LPAREN)) goto error; if (lex_force_num (lexer)) { pie_max = lex_number (lexer); lex_get (lexer); } if (! lex_force_match (lexer, T_RPAREN)) goto error; } else if (lex_match_id (lexer, "MISSING")) { pie_missing = true; } else if (lex_match_id (lexer, "NOMISSING")) { pie_missing = false; } else { lex_error (lexer, NULL); goto error; } } sbc_piechart = true; } else if (lex_match_id (lexer, "BARCHART")) { lex_match (lexer, T_EQUALS); while (lex_token (lexer) != T_ENDCMD && lex_token (lexer) != T_SLASH) { if (lex_match_id (lexer, "MINIMUM")) { if (! lex_force_match (lexer, T_LPAREN)) goto error; if (lex_force_num (lexer)) { bar_min = lex_number (lexer); lex_get (lexer); } if (! lex_force_match (lexer, T_RPAREN)) goto error; } else if (lex_match_id (lexer, "MAXIMUM")) { if (! lex_force_match (lexer, T_LPAREN)) goto error; if (lex_force_num (lexer)) { bar_max = lex_number (lexer); lex_get (lexer); } if (! lex_force_match (lexer, T_RPAREN)) goto error; } else if (lex_match_id (lexer, "FREQ")) { if (lex_match (lexer, T_LPAREN)) { if (lex_force_num (lexer)) { lex_number (lexer); lex_get (lexer); } if (! lex_force_match (lexer, T_RPAREN)) goto error; } bar_freq = true; } else if (lex_match_id (lexer, "PERCENT")) { if (lex_match (lexer, T_LPAREN)) { if (lex_force_num (lexer)) { lex_number (lexer); lex_get (lexer); } if (! lex_force_match (lexer, T_RPAREN)) goto error; } bar_freq = false; } else { lex_error (lexer, NULL); goto error; } } sbc_barchart = true; } else if (lex_match_id (lexer, "MISSING")) { lex_match (lexer, T_EQUALS); while (lex_token (lexer) != T_ENDCMD && lex_token (lexer) != T_SLASH) { if (lex_match_id (lexer, "EXCLUDE")) { } else if (lex_match_id (lexer, "INCLUDE")) { } else { lex_error (lexer, NULL); goto error; } } } else if (lex_match_id (lexer, "ORDER")) { lex_match (lexer, T_EQUALS); if (!lex_match_id (lexer, "ANALYSIS")) lex_match_id (lexer, "VARIABLE"); } else { lex_error (lexer, NULL); goto error; } } if (frq.stats & BIT_INDEX (FRQ_ST_MEDIAN)) { frq.percentiles = xrealloc (frq.percentiles, (frq.n_percentiles + 1) * sizeof (*frq.percentiles)); frq.percentiles[frq.n_percentiles].p = 0.50; frq.percentiles[frq.n_percentiles].show = false; frq.n_percentiles++; } /* Figure out which charts the user requested. */ { if (sbc_histogram) { struct frq_chart *hist; hist = frq.hist = xmalloc (sizeof *frq.hist); hist->x_min = hi_min; hist->x_max = hi_max; hist->y_scale = hi_scale; hist->y_max = hi_scale == FRQ_FREQ ? hi_freq : hi_pcnt; hist->draw_normal = hi_norm != FRQ_NONORMAL; hist->include_missing = false; if (hist->x_min != SYSMIS && hist->x_max != SYSMIS && hist->x_min >= hist->x_max) { msg (SE, _("%s for histogram must be greater than or equal to %s, " "but %s was specified as %.15g and %s as %.15g. " "%s and %s will be ignored."), "MAX", "MIN", "MIN", hist->x_min, "MAX", hist->x_max, "MIN", "MAX"); hist->x_min = hist->x_max = SYSMIS; } frq.percentiles = xrealloc (frq.percentiles, (frq.n_percentiles + 2) * sizeof (*frq.percentiles)); frq.percentiles[frq.n_percentiles].p = 0.25; frq.percentiles[frq.n_percentiles].show = false; frq.percentiles[frq.n_percentiles + 1].p = 0.75; frq.percentiles[frq.n_percentiles + 1].show = false; frq.n_percentiles+=2; } if (sbc_barchart) { frq.bar = xmalloc (sizeof *frq.bar); frq.bar->x_min = bar_min; frq.bar->x_max = bar_max; frq.bar->include_missing = false; frq.bar->y_scale = bar_freq ? FRQ_FREQ : FRQ_PERCENT; } if (sbc_piechart) { struct frq_chart *pie; pie = frq.pie = xmalloc (sizeof *frq.pie); pie->x_min = pie_min; pie->x_max = pie_max; pie->include_missing = pie_missing; if (pie->x_min != SYSMIS && pie->x_max != SYSMIS && pie->x_min >= pie->x_max) { msg (SE, _("%s for pie chart must be greater than or equal to %s, " "but %s was specified as %.15g and %s as %.15g. " "%s and %s will be ignored."), "MAX", "MIN", "MIN", pie->x_min, "MAX", pie->x_max, "MIN", "MAX"); pie->x_min = pie->x_max = SYSMIS; } } } { int i,o; double previous_p = -1; qsort (frq.percentiles, frq.n_percentiles, sizeof (*frq.percentiles), ptile_3way); for (i = o = 0; i < frq.n_percentiles; ++i) { if (frq.percentiles[i].p != previous_p) { frq.percentiles[o].p = frq.percentiles[i].p; frq.percentiles[o].show = frq.percentiles[i].show; o++; } else if (frq.percentiles[i].show && !frq.percentiles[o].show) { frq.percentiles[o].show = true; } previous_p = frq.percentiles[i].p; } frq.n_percentiles = o; frq.median = NULL; for (i = 0; i < frq.n_percentiles; i++) if (frq.percentiles[i].p == 0.5) { frq.median = &frq.percentiles[i]; break; } } { struct casegrouper *grouper; struct casereader *group; bool ok; grouper = casegrouper_create_splits (proc_open (ds), dataset_dict (ds)); while (casegrouper_get_next_group (grouper, &group)) { struct ccase *c; precalc (&frq, group, ds); for (; (c = casereader_read (group)) != NULL; case_unref (c)) calc (&frq, c, ds); postcalc (&frq, ds); casereader_destroy (group); } ok = casegrouper_destroy (grouper); ok = proc_commit (ds) && ok; } free (vars); free (frq.vars); free (frq.bar); free (frq.pie); free (frq.hist); free (frq.percentiles); pool_destroy (frq.pool); return CMD_SUCCESS; error: free (vars); free (frq.vars); free (frq.bar); free (frq.pie); free (frq.hist); free (frq.percentiles); pool_destroy (frq.pool); return CMD_FAILURE; } static double calculate_iqr (const struct frq_proc *frq) { double q1 = SYSMIS; double q3 = SYSMIS; int i; /* This cannot work unless the 25th and 75th percentile are calculated */ assert (frq->n_percentiles >= 2); for (i = 0; i < frq->n_percentiles; i++) { struct percentile *pc = &frq->percentiles[i]; if (fabs (0.25 - pc->p) < DBL_EPSILON) q1 = pc->value; else if (fabs (0.75 - pc->p) < DBL_EPSILON) q3 = pc->value; } return q1 == SYSMIS || q3 == SYSMIS ? SYSMIS : q3 - q1; } static bool chart_includes_value (const struct frq_chart *chart, const struct variable *var, const union value *value) { if (!chart->include_missing && var_is_value_missing (var, value, MV_ANY)) return false; if (var_is_numeric (var) && ((chart->x_min != SYSMIS && value->f < chart->x_min) || (chart->x_max != SYSMIS && value->f > chart->x_max))) return false; return true; } /* Create a gsl_histogram from a freq_tab */ static struct histogram * freq_tab_to_hist (const struct frq_proc *frq, const struct freq_tab *ft, const struct variable *var) { double x_min, x_max, valid_freq; int i; double bin_width; struct histogram *histogram; double iqr; /* Find out the extremes of the x value, within the range to be included in the histogram, and sum the total frequency of those values. */ x_min = DBL_MAX; x_max = -DBL_MAX; valid_freq = 0; for (i = 0; i < ft->n_valid; i++) { const struct freq *f = &ft->valid[i]; if (chart_includes_value (frq->hist, var, f->values)) { x_min = MIN (x_min, f->values[0].f); x_max = MAX (x_max, f->values[0].f); valid_freq += f->count; } } if (valid_freq <= 0) return NULL; iqr = calculate_iqr (frq); if (iqr > 0) /* Freedman-Diaconis' choice of bin width. */ bin_width = 2 * iqr / pow (valid_freq, 1.0 / 3.0); else /* Sturges Rule */ bin_width = (x_max - x_min) / (1 + log2 (valid_freq)); histogram = histogram_create (bin_width, x_min, x_max); if (histogram == NULL) return NULL; for (i = 0; i < ft->n_valid; i++) { const struct freq *f = &ft->valid[i]; if (chart_includes_value (frq->hist, var, f->values)) histogram_add (histogram, f->values[0].f, f->count); } return histogram; } /* Allocate an array of struct freqs and fill them from the data in FRQ_TAB, according to the parameters of CATCHART N_SLICES will contain the number of slices allocated. The caller is responsible for freeing slices */ static struct freq * pick_cat_counts (const struct frq_chart *catchart, const struct freq_tab *frq_tab, int *n_slicesp) { int n_slices = 0; int i; struct freq *slices = xnmalloc (frq_tab->n_valid + frq_tab->n_missing, sizeof *slices); for (i = 0; i < frq_tab->n_valid; i++) { const struct freq *f = &frq_tab->valid[i]; if (f->count > catchart->x_max) continue; if (f->count < catchart->x_min) continue; slices[n_slices] = *f; n_slices++; } if (catchart->include_missing) { for (i = 0; i < frq_tab->n_missing; i++) { const struct freq *f = &frq_tab->missing[i]; slices[n_slices].count += f->count; if (i == 0) slices[n_slices].values[0] = f->values[0]; } if (frq_tab->n_missing > 0) n_slices++; } *n_slicesp = n_slices; return slices; } /* Allocate an array of struct freqs and fill them from the data in FRQ_TAB, according to the parameters of CATCHART N_SLICES will contain the number of slices allocated. The caller is responsible for freeing slices */ static struct freq ** pick_cat_counts_ptr (const struct frq_chart *catchart, const struct freq_tab *frq_tab, int *n_slicesp) { int n_slices = 0; int i; struct freq **slices = xnmalloc (frq_tab->n_valid + frq_tab->n_missing, sizeof *slices); for (i = 0; i < frq_tab->n_valid; i++) { struct freq *f = &frq_tab->valid[i]; if (f->count > catchart->x_max) continue; if (f->count < catchart->x_min) continue; slices[n_slices] = f; n_slices++; } if (catchart->include_missing) { for (i = 0; i < frq_tab->n_missing; i++) { const struct freq *f = &frq_tab->missing[i]; if (i == 0) { slices[n_slices] = xmalloc (sizeof (struct freq)); slices[n_slices]->values[0] = f->values[0]; } slices[n_slices]->count += f->count; } } *n_slicesp = n_slices; return slices; } static void do_piechart(const struct frq_chart *pie, const struct variable *var, const struct freq_tab *frq_tab) { int n_slices; struct freq *slices = pick_cat_counts (pie, frq_tab, &n_slices); if (n_slices < 2) msg (SW, _("Omitting pie chart for %s, which has only %d unique values."), var_get_name (var), n_slices); else if (n_slices > 50) msg (SW, _("Omitting pie chart for %s, which has over 50 unique values."), var_get_name (var)); else chart_item_submit (piechart_create (var, slices, n_slices)); free (slices); } static void do_barchart(const struct frq_chart *bar, const struct variable **var, const struct freq_tab *frq_tab) { int n_slices; struct freq **slices = pick_cat_counts_ptr (bar, frq_tab, &n_slices); chart_item_submit (barchart_create (var, 1, (bar->y_scale == FRQ_FREQ) ? _("Count") : _("Percent"), (bar->y_scale == FRQ_PERCENT), slices, n_slices)); free (slices); } /* Calculates all the pertinent statistics for VF, putting them in array D[]. */ static void calc_stats (const struct frq_proc *frq, const struct var_freqs *vf, double d[FRQ_ST_count]) { const struct freq_tab *ft = &vf->tab; double W = ft->valid_cases; const struct freq *f; struct moments *m; int most_often = -1; double X_mode = SYSMIS; /* Calculate the mode. */ for (f = ft->valid; f < ft->missing; f++) { if (most_often < f->count) { most_often = f->count; X_mode = f->values[0].f; } else if (most_often == f->count) { /* A duplicate mode is undefined. FIXME: keep track of *all* the modes. */ X_mode = SYSMIS; } } /* Calculate moments. */ m = moments_create (MOMENT_KURTOSIS); for (f = ft->valid; f < ft->missing; f++) moments_pass_one (m, f->values[0].f, f->count); for (f = ft->valid; f < ft->missing; f++) moments_pass_two (m, f->values[0].f, f->count); moments_calculate (m, NULL, &d[FRQ_ST_MEAN], &d[FRQ_ST_VARIANCE], &d[FRQ_ST_SKEWNESS], &d[FRQ_ST_KURTOSIS]); moments_destroy (m); /* Formulae below are taken from _SPSS Statistical Algorithms_. */ if (ft->n_valid > 0) { d[FRQ_ST_MINIMUM] = ft->valid[0].values[0].f; d[FRQ_ST_MAXIMUM] = ft->valid[ft->n_valid - 1].values[0].f; d[FRQ_ST_RANGE] = d[FRQ_ST_MAXIMUM] - d[FRQ_ST_MINIMUM]; } else { d[FRQ_ST_MINIMUM] = SYSMIS; d[FRQ_ST_MAXIMUM] = SYSMIS; d[FRQ_ST_RANGE] = SYSMIS; } d[FRQ_ST_MODE] = X_mode; d[FRQ_ST_SUM] = d[FRQ_ST_MEAN] * W; d[FRQ_ST_STDDEV] = sqrt (d[FRQ_ST_VARIANCE]); d[FRQ_ST_SEMEAN] = d[FRQ_ST_STDDEV] / sqrt (W); d[FRQ_ST_SESKEWNESS] = calc_seskew (W); d[FRQ_ST_SEKURTOSIS] = calc_sekurt (W); d[FRQ_ST_MEDIAN] = frq->median ? frq->median->value : SYSMIS; } static bool all_string_variables (const struct frq_proc *frq) { for (size_t i = 0; i < frq->n_vars; i++) if (var_is_numeric (frq->vars[i].var)) return false; return true; } /* Displays a table of all the statistics requested. */ static void dump_statistics (const struct frq_proc *frq, const struct variable *wv) { if (all_string_variables (frq)) return; struct pivot_table *table = pivot_table_create (N_("Statistics")); pivot_table_set_weight_var (table, wv); struct pivot_dimension *variables = pivot_dimension_create (table, PIVOT_AXIS_COLUMN, N_("Variables")); struct pivot_dimension *statistics = pivot_dimension_create ( table, PIVOT_AXIS_ROW, N_("Statistics")); struct pivot_category *n = pivot_category_create_group ( statistics->root, N_("N")); pivot_category_create_leaves (n, N_("Valid"), PIVOT_RC_COUNT, N_("Missing"), PIVOT_RC_COUNT); for (int i = 0; i < FRQ_ST_count; i++) if (frq->stats & BIT_INDEX (i)) pivot_category_create_leaf (statistics->root, pivot_value_new_text (st_name[i])); struct pivot_category *percentiles = NULL; for (size_t i = 0; i < frq->n_percentiles; i++) { const struct percentile *pc = &frq->percentiles[i]; if (!pc->show) continue; if (!percentiles) percentiles = pivot_category_create_group ( statistics->root, N_("Percentiles")); pivot_category_create_leaf (percentiles, pivot_value_new_integer ( pc->p * 100.0)); } for (size_t i = 0; i < frq->n_vars; i++) { struct var_freqs *vf = &frq->vars[i]; if (var_is_alpha (vf->var)) continue; const struct freq_tab *ft = &vf->tab; int var_idx = pivot_category_create_leaf ( variables->root, pivot_value_new_variable (vf->var)); int row = 0; pivot_table_put2 (table, var_idx, row++, pivot_value_new_number (ft->valid_cases)); pivot_table_put2 (table, var_idx, row++, pivot_value_new_number ( ft->total_cases - ft->valid_cases)); double stat_values[FRQ_ST_count]; calc_stats (frq, vf, stat_values); for (int j = 0; j < FRQ_ST_count; j++) { if (!(frq->stats & BIT_INDEX (j))) continue; union value v = { .f = vf->tab.n_valid ? stat_values[j] : SYSMIS }; struct pivot_value *pv = (j == FRQ_ST_MODE || j == FRQ_ST_MINIMUM || j == FRQ_ST_MAXIMUM ? pivot_value_new_var_value (vf->var, &v) : pivot_value_new_number (v.f)); pivot_table_put2 (table, var_idx, row++, pv); } for (size_t j = 0; j < frq->n_percentiles; j++) { const struct percentile *pc = &frq->percentiles[j]; if (!pc->show) continue; union value v = { .f = vf->tab.n_valid ? pc->value : SYSMIS }; pivot_table_put2 (table, var_idx, row++, pivot_value_new_var_value (vf->var, &v)); } } pivot_table_submit (table); } pspp-1.4.1/src/language/stats/factor.c0000644000175000017500000016370113717773141017270 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2009, 2010, 2011, 2012, 2014, 2015, 2016, 2017 Free Software Foundation, Inc. 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 3 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, see . */ #include #include #include #include #include #include #include #include #include "data/any-reader.h" #include "data/casegrouper.h" #include "data/casereader.h" #include "data/casewriter.h" #include "data/dataset.h" #include "data/dictionary.h" #include "data/format.h" #include "data/subcase.h" #include "language/command.h" #include "language/lexer/lexer.h" #include "language/lexer/value-parser.h" #include "language/lexer/variable-parser.h" #include "language/data-io/file-handle.h" #include "language/data-io/matrix-reader.h" #include "libpspp/cast.h" #include "libpspp/message.h" #include "libpspp/misc.h" #include "math/correlation.h" #include "math/covariance.h" #include "math/moments.h" #include "output/chart-item.h" #include "output/charts/scree.h" #include "output/pivot-table.h" #include "gettext.h" #define _(msgid) gettext (msgid) #define N_(msgid) msgid enum method { METHOD_CORR, METHOD_COV }; enum missing_type { MISS_LISTWISE, MISS_PAIRWISE, MISS_MEANSUB, }; enum extraction_method { EXTRACTION_PC, EXTRACTION_PAF, }; enum plot_opts { PLOT_SCREE = 0x0001, PLOT_ROTATION = 0x0002 }; enum print_opts { PRINT_UNIVARIATE = 0x0001, PRINT_DETERMINANT = 0x0002, PRINT_INV = 0x0004, PRINT_AIC = 0x0008, PRINT_SIG = 0x0010, PRINT_COVARIANCE = 0x0020, PRINT_CORRELATION = 0x0040, PRINT_ROTATION = 0x0080, PRINT_EXTRACTION = 0x0100, PRINT_INITIAL = 0x0200, PRINT_KMO = 0x0400, PRINT_REPR = 0x0800, PRINT_FSCORE = 0x1000 }; enum rotation_type { ROT_VARIMAX = 0, ROT_EQUAMAX, ROT_QUARTIMAX, ROT_PROMAX, ROT_NONE }; typedef void (*rotation_coefficients) (double *x, double *y, double a, double b, double c, double d, const gsl_matrix *loadings); static void varimax_coefficients (double *x, double *y, double a, double b, double c, double d, const gsl_matrix *loadings) { *x = d - 2 * a * b / loadings->size1; *y = c - (a * a - b * b) / loadings->size1; } static void equamax_coefficients (double *x, double *y, double a, double b, double c, double d, const gsl_matrix *loadings) { *x = d - loadings->size2 * a * b / loadings->size1; *y = c - loadings->size2 * (a * a - b * b) / (2 * loadings->size1); } static void quartimax_coefficients (double *x, double *y, double a UNUSED, double b UNUSED, double c, double d, const gsl_matrix *loadings UNUSED) { *x = d ; *y = c ; } static const rotation_coefficients rotation_coeff[] = { varimax_coefficients, equamax_coefficients, quartimax_coefficients, varimax_coefficients /* PROMAX is identical to VARIMAX */ }; /* return diag (C'C) ^ {-0.5} */ static gsl_matrix * diag_rcp_sqrt (const gsl_matrix *C) { int j; gsl_matrix *d = gsl_matrix_calloc (C->size1, C->size2); gsl_matrix *r = gsl_matrix_calloc (C->size1, C->size2); assert (C->size1 == C->size2); gsl_linalg_matmult_mod (C, GSL_LINALG_MOD_TRANSPOSE, C, GSL_LINALG_MOD_NONE, d); for (j = 0 ; j < d->size2; ++j) { double e = gsl_matrix_get (d, j, j); e = 1.0 / sqrt (e); gsl_matrix_set (r, j, j, e); } gsl_matrix_free (d); return r; } /* return diag ((C'C)^-1) ^ {-0.5} */ static gsl_matrix * diag_rcp_inv_sqrt (const gsl_matrix *CCinv) { int j; gsl_matrix *r = gsl_matrix_calloc (CCinv->size1, CCinv->size2); assert (CCinv->size1 == CCinv->size2); for (j = 0 ; j < CCinv->size2; ++j) { double e = gsl_matrix_get (CCinv, j, j); e = 1.0 / sqrt (e); gsl_matrix_set (r, j, j, e); } return r; } struct cmd_factor { size_t n_vars; const struct variable **vars; const struct variable *wv; enum method method; enum missing_type missing_type; enum mv_class exclude; enum print_opts print; enum extraction_method extraction; enum plot_opts plot; enum rotation_type rotation; int rotation_iterations; int promax_power; /* Extraction Criteria */ int n_factors; double min_eigen; double econverge; int extraction_iterations; double rconverge; /* Format */ double blank; bool sort; }; struct idata { /* Intermediate values used in calculation */ struct matrix_material mm; gsl_matrix *analysis_matrix; /* A pointer to either mm.corr or mm.cov */ gsl_vector *eval ; /* The eigenvalues */ gsl_matrix *evec ; /* The eigenvectors */ int n_extractions; gsl_vector *msr ; /* Multiple Squared Regressions */ double detR; /* The determinant of the correlation matrix */ gsl_matrix *ai_cov; /* The anti-image covariance matrix */ gsl_matrix *ai_cor; /* The anti-image correlation matrix */ struct covariance *cvm; }; static struct idata * idata_alloc (size_t n_vars) { struct idata *id = xzalloc (sizeof (*id)); id->n_extractions = 0; id->msr = gsl_vector_alloc (n_vars); id->eval = gsl_vector_alloc (n_vars); id->evec = gsl_matrix_alloc (n_vars, n_vars); return id; } static void idata_free (struct idata *id) { gsl_vector_free (id->msr); gsl_vector_free (id->eval); gsl_matrix_free (id->evec); gsl_matrix_free (id->ai_cov); gsl_matrix_free (id->ai_cor); free (id); } /* Return the sum of squares of all the elements in row J excluding column J */ static double ssq_row_od_n (const gsl_matrix *m, int j) { int i; double ss = 0; assert (m->size1 == m->size2); assert (j < m->size1); for (i = 0; i < m->size1; ++i) { if (i == j) continue; ss += pow2 (gsl_matrix_get (m, i, j)); } return ss; } /* Return the sum of squares of all the elements excluding row N */ static double ssq_od_n (const gsl_matrix *m, int n) { int i, j; double ss = 0; assert (m->size1 == m->size2); assert (n < m->size1); for (i = 0; i < m->size1; ++i) { for (j = 0; j < m->size2; ++j) { if (i == j) continue; ss += pow2 (gsl_matrix_get (m, i, j)); } } return ss; } static gsl_matrix * anti_image_corr (const gsl_matrix *m, const struct idata *idata) { int i, j; gsl_matrix *a; assert (m->size1 == m->size2); a = gsl_matrix_alloc (m->size1, m->size2); for (i = 0; i < m->size1; ++i) { for (j = 0; j < m->size2; ++j) { double *p = gsl_matrix_ptr (a, i, j); *p = gsl_matrix_get (m, i, j); *p /= sqrt (gsl_matrix_get (m, i, i) * gsl_matrix_get (m, j, j)); } } for (i = 0; i < m->size1; ++i) { double r = ssq_row_od_n (idata->mm.corr, i); double u = ssq_row_od_n (a, i); gsl_matrix_set (a, i, i, r / (r + u)); } return a; } static gsl_matrix * anti_image_cov (const gsl_matrix *m) { int i, j; gsl_matrix *a; assert (m->size1 == m->size2); a = gsl_matrix_alloc (m->size1, m->size2); for (i = 0; i < m->size1; ++i) { for (j = 0; j < m->size2; ++j) { double *p = gsl_matrix_ptr (a, i, j); *p = gsl_matrix_get (m, i, j); *p /= gsl_matrix_get (m, i, i); *p /= gsl_matrix_get (m, j, j); } } return a; } #if 0 static void dump_matrix (const gsl_matrix *m) { size_t i, j; for (i = 0 ; i < m->size1; ++i) { for (j = 0 ; j < m->size2; ++j) printf ("%02f ", gsl_matrix_get (m, i, j)); printf ("\n"); } } static void dump_matrix_permute (const gsl_matrix *m, const gsl_permutation *p) { size_t i, j; for (i = 0 ; i < m->size1; ++i) { for (j = 0 ; j < m->size2; ++j) printf ("%02f ", gsl_matrix_get (m, gsl_permutation_get (p, i), j)); printf ("\n"); } } static void dump_vector (const gsl_vector *v) { size_t i; for (i = 0 ; i < v->size; ++i) { printf ("%02f\n", gsl_vector_get (v, i)); } printf ("\n"); } #endif static int n_extracted_factors (const struct cmd_factor *factor, struct idata *idata) { int i; /* If there is a cached value, then return that. */ if (idata->n_extractions != 0) return idata->n_extractions; /* Otherwise, if the number of factors has been explicitly requested, use that. */ if (factor->n_factors > 0) { idata->n_extractions = factor->n_factors; goto finish; } /* Use the MIN_EIGEN setting. */ for (i = 0 ; i < idata->eval->size; ++i) { double evali = fabs (gsl_vector_get (idata->eval, i)); idata->n_extractions = i; if (evali < factor->min_eigen) goto finish; } finish: return idata->n_extractions; } /* Returns a newly allocated matrix identical to M. It it the callers responsibility to free the returned value. */ static gsl_matrix * matrix_dup (const gsl_matrix *m) { gsl_matrix *n = gsl_matrix_alloc (m->size1, m->size2); gsl_matrix_memcpy (n, m); return n; } struct smr_workspace { /* Copy of the subject */ gsl_matrix *m; gsl_matrix *inverse; gsl_permutation *perm; gsl_matrix *result1; gsl_matrix *result2; }; static struct smr_workspace *ws_create (const gsl_matrix *input) { struct smr_workspace *ws = xmalloc (sizeof (*ws)); ws->m = gsl_matrix_alloc (input->size1, input->size2); ws->inverse = gsl_matrix_calloc (input->size1 - 1, input->size2 - 1); ws->perm = gsl_permutation_alloc (input->size1 - 1); ws->result1 = gsl_matrix_calloc (input->size1 - 1, 1); ws->result2 = gsl_matrix_calloc (1, 1); return ws; } static void ws_destroy (struct smr_workspace *ws) { gsl_matrix_free (ws->result2); gsl_matrix_free (ws->result1); gsl_permutation_free (ws->perm); gsl_matrix_free (ws->inverse); gsl_matrix_free (ws->m); free (ws); } /* Return the square of the regression coefficient for VAR regressed against all other variables. */ static double squared_multiple_correlation (const gsl_matrix *corr, int var, struct smr_workspace *ws) { /* For an explanation of what this is doing, see http://www.visualstatistics.net/Visual%20Statistics%20Multimedia/multiple_regression_analysis.htm */ int signum = 0; gsl_matrix_view rxx; gsl_matrix_memcpy (ws->m, corr); gsl_matrix_swap_rows (ws->m, 0, var); gsl_matrix_swap_columns (ws->m, 0, var); rxx = gsl_matrix_submatrix (ws->m, 1, 1, ws->m->size1 - 1, ws->m->size1 - 1); gsl_linalg_LU_decomp (&rxx.matrix, ws->perm, &signum); gsl_linalg_LU_invert (&rxx.matrix, ws->perm, ws->inverse); { gsl_matrix_const_view rxy = gsl_matrix_const_submatrix (ws->m, 1, 0, ws->m->size1 - 1, 1); gsl_matrix_const_view ryx = gsl_matrix_const_submatrix (ws->m, 0, 1, 1, ws->m->size1 - 1); gsl_blas_dgemm (CblasNoTrans, CblasNoTrans, 1.0, ws->inverse, &rxy.matrix, 0.0, ws->result1); gsl_blas_dgemm (CblasNoTrans, CblasNoTrans, 1.0, &ryx.matrix, ws->result1, 0.0, ws->result2); } return gsl_matrix_get (ws->result2, 0, 0); } static double the_communality (const gsl_matrix *evec, const gsl_vector *eval, int n, int n_factors); struct factor_matrix_workspace { size_t n_factors; gsl_eigen_symmv_workspace *eigen_ws; gsl_vector *eval ; gsl_matrix *evec ; gsl_matrix *gamma ; gsl_matrix *r; }; static struct factor_matrix_workspace * factor_matrix_workspace_alloc (size_t n, size_t nf) { struct factor_matrix_workspace *ws = xmalloc (sizeof (*ws)); ws->n_factors = nf; ws->gamma = gsl_matrix_calloc (nf, nf); ws->eigen_ws = gsl_eigen_symmv_alloc (n); ws->eval = gsl_vector_alloc (n); ws->evec = gsl_matrix_alloc (n, n); ws->r = gsl_matrix_alloc (n, n); return ws; } static void factor_matrix_workspace_free (struct factor_matrix_workspace *ws) { gsl_eigen_symmv_free (ws->eigen_ws); gsl_vector_free (ws->eval); gsl_matrix_free (ws->evec); gsl_matrix_free (ws->gamma); gsl_matrix_free (ws->r); free (ws); } /* Shift P left by OFFSET places, and overwrite TARGET with the shifted result. Positions in TARGET less than OFFSET are unchanged. */ static void perm_shift_apply (gsl_permutation *target, const gsl_permutation *p, size_t offset) { size_t i; assert (target->size == p->size); assert (offset <= target->size); for (i = 0; i < target->size - offset; ++i) { target->data[i] = p->data [i + offset]; } } /* Indirectly sort the rows of matrix INPUT, storing the sort order in PERM. The sort criteria are as follows: Rows are sorted on the first column, until the absolute value of an element in a subsequent column is greater than that of the first column. Thereafter, rows will be sorted on the second column, until the absolute value of an element in a subsequent column exceeds that of the second column ... */ static void sort_matrix_indirect (const gsl_matrix *input, gsl_permutation *perm) { const size_t n = perm->size; const size_t m = input->size2; int i, j; gsl_matrix *mat ; int column_n = 0; int row_n = 0; gsl_permutation *p; assert (perm->size == input->size1); p = gsl_permutation_alloc (n); /* Copy INPUT into MAT, discarding the sign */ mat = gsl_matrix_alloc (n, m); for (i = 0 ; i < mat->size1; ++i) { for (j = 0 ; j < mat->size2; ++j) { double x = gsl_matrix_get (input, i, j); gsl_matrix_set (mat, i, j, fabs (x)); } } while (column_n < m && row_n < n) { gsl_vector_const_view columni = gsl_matrix_const_column (mat, column_n); gsl_sort_vector_index (p, &columni.vector); for (i = 0 ; i < n; ++i) { gsl_vector_view row = gsl_matrix_row (mat, p->data[n - 1 - i]); size_t maxindex = gsl_vector_max_index (&row.vector); if (maxindex > column_n) break; /* All subsequent elements of this row, are of no interest. So set them all to a highly negative value */ for (j = column_n + 1; j < row.vector.size ; ++j) gsl_vector_set (&row.vector, j, -DBL_MAX); } perm_shift_apply (perm, p, row_n); row_n += i; column_n++; } gsl_permutation_free (p); gsl_matrix_free (mat); assert (0 == gsl_permutation_valid (perm)); /* We want the biggest value to be first */ gsl_permutation_reverse (perm); } static void drot_go (double phi, double *l0, double *l1) { double r0 = cos (phi) * *l0 + sin (phi) * *l1; double r1 = - sin (phi) * *l0 + cos (phi) * *l1; *l0 = r0; *l1 = r1; } static gsl_matrix * clone_matrix (const gsl_matrix *m) { int j, k; gsl_matrix *c = gsl_matrix_calloc (m->size1, m->size2); for (j = 0 ; j < c->size1; ++j) { for (k = 0 ; k < c->size2; ++k) { const double *v = gsl_matrix_const_ptr (m, j, k); gsl_matrix_set (c, j, k, *v); } } return c; } static double initial_sv (const gsl_matrix *fm) { int j, k; double sv = 0.0; for (j = 0 ; j < fm->size2; ++j) { double l4s = 0; double l2s = 0; for (k = j + 1 ; k < fm->size2; ++k) { double lambda = gsl_matrix_get (fm, k, j); double lambda_sq = lambda * lambda; double lambda_4 = lambda_sq * lambda_sq; l4s += lambda_4; l2s += lambda_sq; } sv += (fm->size1 * l4s - (l2s * l2s)) / (fm->size1 * fm->size1); } return sv; } static void rotate (const struct cmd_factor *cf, const gsl_matrix *unrot, const gsl_vector *communalities, gsl_matrix *result, gsl_vector *rotated_loadings, gsl_matrix *pattern_matrix, gsl_matrix *factor_correlation_matrix ) { int j, k; int i; double prev_sv; /* First get a normalised version of UNROT */ gsl_matrix *normalised = gsl_matrix_calloc (unrot->size1, unrot->size2); gsl_matrix *h_sqrt = gsl_matrix_calloc (communalities->size, communalities->size); gsl_matrix *h_sqrt_inv ; /* H is the diagonal matrix containing the absolute values of the communalities */ for (i = 0 ; i < communalities->size ; ++i) { double *ptr = gsl_matrix_ptr (h_sqrt, i, i); *ptr = fabs (gsl_vector_get (communalities, i)); } /* Take the square root of the communalities */ gsl_linalg_cholesky_decomp (h_sqrt); /* Save a copy of h_sqrt and invert it */ h_sqrt_inv = clone_matrix (h_sqrt); gsl_linalg_cholesky_decomp (h_sqrt_inv); gsl_linalg_cholesky_invert (h_sqrt_inv); /* normalised vertion is H^{1/2} x UNROT */ gsl_blas_dgemm (CblasNoTrans, CblasNoTrans, 1.0, h_sqrt_inv, unrot, 0.0, normalised); gsl_matrix_free (h_sqrt_inv); /* Now perform the rotation iterations */ prev_sv = initial_sv (normalised); for (i = 0 ; i < cf->rotation_iterations ; ++i) { double sv = 0.0; for (j = 0 ; j < normalised->size2; ++j) { /* These variables relate to the convergence criterium */ double l4s = 0; double l2s = 0; for (k = j + 1 ; k < normalised->size2; ++k) { int p; double a = 0.0; double b = 0.0; double c = 0.0; double d = 0.0; double x, y; double phi; for (p = 0; p < normalised->size1; ++p) { double jv = gsl_matrix_get (normalised, p, j); double kv = gsl_matrix_get (normalised, p, k); double u = jv * jv - kv * kv; double v = 2 * jv * kv; a += u; b += v; c += u * u - v * v; d += 2 * u * v; } rotation_coeff [cf->rotation] (&x, &y, a, b, c, d, normalised); phi = atan2 (x, y) / 4.0 ; /* Don't bother rotating if the angle is small */ if (fabs (sin (phi)) <= pow (10.0, -15.0)) continue; for (p = 0; p < normalised->size1; ++p) { double *lambda0 = gsl_matrix_ptr (normalised, p, j); double *lambda1 = gsl_matrix_ptr (normalised, p, k); drot_go (phi, lambda0, lambda1); } /* Calculate the convergence criterium */ { double lambda = gsl_matrix_get (normalised, k, j); double lambda_sq = lambda * lambda; double lambda_4 = lambda_sq * lambda_sq; l4s += lambda_4; l2s += lambda_sq; } } sv += (normalised->size1 * l4s - (l2s * l2s)) / (normalised->size1 * normalised->size1); } if (fabs (sv - prev_sv) <= cf->rconverge) break; prev_sv = sv; } gsl_blas_dgemm (CblasNoTrans, CblasNoTrans, 1.0, h_sqrt, normalised, 0.0, result); gsl_matrix_free (h_sqrt); gsl_matrix_free (normalised); if (cf->rotation == ROT_PROMAX) { /* general purpose m by m matrix, where m is the number of factors */ gsl_matrix *mm1 = gsl_matrix_calloc (unrot->size2, unrot->size2); gsl_matrix *mm2 = gsl_matrix_calloc (unrot->size2, unrot->size2); /* general purpose m by p matrix, where p is the number of variables */ gsl_matrix *mp1 = gsl_matrix_calloc (unrot->size2, unrot->size1); gsl_matrix *pm1 = gsl_matrix_calloc (unrot->size1, unrot->size2); gsl_permutation *perm = gsl_permutation_alloc (unrot->size2); int signum; int i, j; /* The following variables follow the notation by SPSS Statistical Algorithms page 342 */ gsl_matrix *L = gsl_matrix_calloc (unrot->size2, unrot->size2); gsl_matrix *P = clone_matrix (result); gsl_matrix *D ; gsl_matrix *Q ; /* Vector of length p containing (indexed by i) \Sum^m_j {\lambda^2_{ij}} */ gsl_vector *rssq = gsl_vector_calloc (unrot->size1); for (i = 0; i < P->size1; ++i) { double sum = 0; for (j = 0; j < P->size2; ++j) { sum += gsl_matrix_get (result, i, j) * gsl_matrix_get (result, i, j); } gsl_vector_set (rssq, i, sqrt (sum)); } for (i = 0; i < P->size1; ++i) { for (j = 0; j < P->size2; ++j) { double l = gsl_matrix_get (result, i, j); double r = gsl_vector_get (rssq, i); gsl_matrix_set (P, i, j, pow (fabs (l / r), cf->promax_power + 1) * r / l); } } gsl_vector_free (rssq); gsl_linalg_matmult_mod (result, GSL_LINALG_MOD_TRANSPOSE, result, GSL_LINALG_MOD_NONE, mm1); gsl_linalg_LU_decomp (mm1, perm, &signum); gsl_linalg_LU_invert (mm1, perm, mm2); gsl_linalg_matmult_mod (mm2, GSL_LINALG_MOD_NONE, result, GSL_LINALG_MOD_TRANSPOSE, mp1); gsl_linalg_matmult_mod (mp1, GSL_LINALG_MOD_NONE, P, GSL_LINALG_MOD_NONE, L); D = diag_rcp_sqrt (L); Q = gsl_matrix_calloc (unrot->size2, unrot->size2); gsl_linalg_matmult_mod (L, GSL_LINALG_MOD_NONE, D, GSL_LINALG_MOD_NONE, Q); gsl_matrix *QQinv = gsl_matrix_calloc (unrot->size2, unrot->size2); gsl_linalg_matmult_mod (Q, GSL_LINALG_MOD_TRANSPOSE, Q, GSL_LINALG_MOD_NONE, QQinv); gsl_linalg_cholesky_decomp (QQinv); gsl_linalg_cholesky_invert (QQinv); gsl_matrix *C = diag_rcp_inv_sqrt (QQinv); gsl_matrix *Cinv = clone_matrix (C); gsl_linalg_cholesky_decomp (Cinv); gsl_linalg_cholesky_invert (Cinv); gsl_linalg_matmult_mod (result, GSL_LINALG_MOD_NONE, Q, GSL_LINALG_MOD_NONE, pm1); gsl_linalg_matmult_mod (pm1, GSL_LINALG_MOD_NONE, Cinv, GSL_LINALG_MOD_NONE, pattern_matrix); gsl_linalg_matmult_mod (C, GSL_LINALG_MOD_NONE, QQinv, GSL_LINALG_MOD_NONE, mm1); gsl_linalg_matmult_mod (mm1, GSL_LINALG_MOD_NONE, C, GSL_LINALG_MOD_TRANSPOSE, factor_correlation_matrix); gsl_linalg_matmult_mod (pattern_matrix, GSL_LINALG_MOD_NONE, factor_correlation_matrix, GSL_LINALG_MOD_NONE, pm1); gsl_matrix_memcpy (result, pm1); gsl_matrix_free (QQinv); gsl_matrix_free (C); gsl_matrix_free (Cinv); gsl_matrix_free (D); gsl_matrix_free (Q); gsl_matrix_free (L); gsl_matrix_free (P); gsl_permutation_free (perm); gsl_matrix_free (mm1); gsl_matrix_free (mm2); gsl_matrix_free (mp1); gsl_matrix_free (pm1); } /* reflect negative sums and populate the rotated loadings vector*/ for (i = 0 ; i < result->size2; ++i) { double ssq = 0.0; double sum = 0.0; for (j = 0 ; j < result->size1; ++j) { double s = gsl_matrix_get (result, j, i); ssq += s * s; sum += s; } gsl_vector_set (rotated_loadings, i, ssq); if (sum < 0) for (j = 0 ; j < result->size1; ++j) { double *lambda = gsl_matrix_ptr (result, j, i); *lambda = - *lambda; } } } /* Get an approximation for the factor matrix into FACTORS, and the communalities into COMMUNALITIES. R is the matrix to be analysed. WS is a pointer to a structure which must have been initialised with factor_matrix_workspace_init. */ static void iterate_factor_matrix (const gsl_matrix *r, gsl_vector *communalities, gsl_matrix *factors, struct factor_matrix_workspace *ws) { size_t i; gsl_matrix_view mv ; assert (r->size1 == r->size2); assert (r->size1 == communalities->size); assert (factors->size1 == r->size1); assert (factors->size2 == ws->n_factors); gsl_matrix_memcpy (ws->r, r); /* Apply Communalities to diagonal of correlation matrix */ for (i = 0 ; i < communalities->size ; ++i) { double *x = gsl_matrix_ptr (ws->r, i, i); *x = gsl_vector_get (communalities, i); } gsl_eigen_symmv (ws->r, ws->eval, ws->evec, ws->eigen_ws); mv = gsl_matrix_submatrix (ws->evec, 0, 0, ws->evec->size1, ws->n_factors); /* Gamma is the diagonal matrix containing the absolute values of the eigenvalues */ for (i = 0 ; i < ws->n_factors ; ++i) { double *ptr = gsl_matrix_ptr (ws->gamma, i, i); *ptr = fabs (gsl_vector_get (ws->eval, i)); } /* Take the square root of gamma */ gsl_linalg_cholesky_decomp (ws->gamma); gsl_blas_dgemm (CblasNoTrans, CblasNoTrans, 1.0, &mv.matrix, ws->gamma, 0.0, factors); for (i = 0 ; i < r->size1 ; ++i) { double h = the_communality (ws->evec, ws->eval, i, ws->n_factors); gsl_vector_set (communalities, i, h); } } static bool run_factor (struct dataset *ds, const struct cmd_factor *factor); static void do_factor_by_matrix (const struct cmd_factor *factor, struct idata *idata); int cmd_factor (struct lexer *lexer, struct dataset *ds) { struct dictionary *dict = NULL; int n_iterations = 25; struct cmd_factor factor; factor.n_vars = 0; factor.vars = NULL; factor.method = METHOD_CORR; factor.missing_type = MISS_LISTWISE; factor.exclude = MV_ANY; factor.print = PRINT_INITIAL | PRINT_EXTRACTION | PRINT_ROTATION; factor.extraction = EXTRACTION_PC; factor.n_factors = 0; factor.min_eigen = SYSMIS; factor.extraction_iterations = 25; factor.rotation_iterations = 25; factor.econverge = 0.001; factor.blank = 0; factor.sort = false; factor.plot = 0; factor.rotation = ROT_VARIMAX; factor.wv = NULL; factor.rconverge = 0.0001; lex_match (lexer, T_SLASH); struct matrix_reader *mr = NULL; struct casereader *matrix_reader = NULL; if (lex_match_id (lexer, "VARIABLES")) { lex_match (lexer, T_EQUALS); dict = dataset_dict (ds); factor.wv = dict_get_weight (dict); if (!parse_variables_const (lexer, dict, &factor.vars, &factor.n_vars, PV_NO_DUPLICATE | PV_NUMERIC)) goto error; } else if (lex_match_id (lexer, "MATRIX")) { lex_match (lexer, T_EQUALS); if (! lex_force_match_id (lexer, "IN")) goto error; if (!lex_force_match (lexer, T_LPAREN)) { goto error; } if (lex_match_id (lexer, "CORR")) { } else if (lex_match_id (lexer, "COV")) { } else { lex_error (lexer, _("Matrix input for %s must be either COV or CORR"), "FACTOR"); goto error; } if (! lex_force_match (lexer, T_EQUALS)) goto error; if (lex_match (lexer, T_ASTERISK)) { dict = dataset_dict (ds); matrix_reader = casereader_clone (dataset_source (ds)); } else { struct file_handle *fh = fh_parse (lexer, FH_REF_FILE, NULL); if (fh == NULL) goto error; matrix_reader = any_reader_open_and_decode (fh, NULL, &dict, NULL); if (! (matrix_reader && dict)) { goto error; } } if (! lex_force_match (lexer, T_RPAREN)) goto error; mr = create_matrix_reader_from_case_reader (dict, matrix_reader, &factor.vars, &factor.n_vars); } else { goto error; } while (lex_token (lexer) != T_ENDCMD) { lex_match (lexer, T_SLASH); if (lex_match_id (lexer, "ANALYSIS")) { struct const_var_set *vs; const struct variable **vars; size_t n_vars; bool ok; lex_match (lexer, T_EQUALS); vs = const_var_set_create_from_array (factor.vars, factor.n_vars); ok = parse_const_var_set_vars (lexer, vs, &vars, &n_vars, PV_NO_DUPLICATE | PV_NUMERIC); const_var_set_destroy (vs); if (!ok) goto error; free (factor.vars); factor.vars = vars; factor.n_vars = n_vars; } else if (lex_match_id (lexer, "PLOT")) { lex_match (lexer, T_EQUALS); while (lex_token (lexer) != T_ENDCMD && lex_token (lexer) != T_SLASH) { if (lex_match_id (lexer, "EIGEN")) { factor.plot |= PLOT_SCREE; } #if FACTOR_FULLY_IMPLEMENTED else if (lex_match_id (lexer, "ROTATION")) { } #endif else { lex_error (lexer, NULL); goto error; } } } else if (lex_match_id (lexer, "METHOD")) { lex_match (lexer, T_EQUALS); while (lex_token (lexer) != T_ENDCMD && lex_token (lexer) != T_SLASH) { if (lex_match_id (lexer, "COVARIANCE")) { factor.method = METHOD_COV; } else if (lex_match_id (lexer, "CORRELATION")) { factor.method = METHOD_CORR; } else { lex_error (lexer, NULL); goto error; } } } else if (lex_match_id (lexer, "ROTATION")) { lex_match (lexer, T_EQUALS); while (lex_token (lexer) != T_ENDCMD && lex_token (lexer) != T_SLASH) { /* VARIMAX and DEFAULT are defaults */ if (lex_match_id (lexer, "VARIMAX") || lex_match_id (lexer, "DEFAULT")) { factor.rotation = ROT_VARIMAX; } else if (lex_match_id (lexer, "EQUAMAX")) { factor.rotation = ROT_EQUAMAX; } else if (lex_match_id (lexer, "QUARTIMAX")) { factor.rotation = ROT_QUARTIMAX; } else if (lex_match_id (lexer, "PROMAX")) { factor.promax_power = 5; if (lex_match (lexer, T_LPAREN) && lex_force_int (lexer)) { factor.promax_power = lex_integer (lexer); lex_get (lexer); if (! lex_force_match (lexer, T_RPAREN)) goto error; } factor.rotation = ROT_PROMAX; } else if (lex_match_id (lexer, "NOROTATE")) { factor.rotation = ROT_NONE; } else { lex_error (lexer, NULL); goto error; } } factor.rotation_iterations = n_iterations; } else if (lex_match_id (lexer, "CRITERIA")) { lex_match (lexer, T_EQUALS); while (lex_token (lexer) != T_ENDCMD && lex_token (lexer) != T_SLASH) { if (lex_match_id (lexer, "FACTORS")) { if (lex_force_match (lexer, T_LPAREN) && lex_force_int (lexer)) { factor.n_factors = lex_integer (lexer); lex_get (lexer); if (! lex_force_match (lexer, T_RPAREN)) goto error; } } else if (lex_match_id (lexer, "MINEIGEN")) { if (lex_force_match (lexer, T_LPAREN) && lex_force_num (lexer)) { factor.min_eigen = lex_number (lexer); lex_get (lexer); if (! lex_force_match (lexer, T_RPAREN)) goto error; } } else if (lex_match_id (lexer, "ECONVERGE")) { if (lex_force_match (lexer, T_LPAREN) && lex_force_num (lexer)) { factor.econverge = lex_number (lexer); lex_get (lexer); if (! lex_force_match (lexer, T_RPAREN)) goto error; } } else if (lex_match_id (lexer, "RCONVERGE")) { if (lex_force_match (lexer, T_LPAREN) && lex_force_num (lexer)) { factor.rconverge = lex_number (lexer); lex_get (lexer); if (! lex_force_match (lexer, T_RPAREN)) goto error; } } else if (lex_match_id (lexer, "ITERATE")) { if (lex_force_match (lexer, T_LPAREN) && lex_force_int (lexer)) { n_iterations = lex_integer (lexer); lex_get (lexer); if (! lex_force_match (lexer, T_RPAREN)) goto error; } } else if (lex_match_id (lexer, "DEFAULT")) { factor.n_factors = 0; factor.min_eigen = 1; n_iterations = 25; } else { lex_error (lexer, NULL); goto error; } } } else if (lex_match_id (lexer, "EXTRACTION")) { lex_match (lexer, T_EQUALS); while (lex_token (lexer) != T_ENDCMD && lex_token (lexer) != T_SLASH) { if (lex_match_id (lexer, "PAF")) { factor.extraction = EXTRACTION_PAF; } else if (lex_match_id (lexer, "PC")) { factor.extraction = EXTRACTION_PC; } else if (lex_match_id (lexer, "PA1")) { factor.extraction = EXTRACTION_PC; } else if (lex_match_id (lexer, "DEFAULT")) { factor.extraction = EXTRACTION_PC; } else { lex_error (lexer, NULL); goto error; } } factor.extraction_iterations = n_iterations; } else if (lex_match_id (lexer, "FORMAT")) { lex_match (lexer, T_EQUALS); while (lex_token (lexer) != T_ENDCMD && lex_token (lexer) != T_SLASH) { if (lex_match_id (lexer, "SORT")) { factor.sort = true; } else if (lex_match_id (lexer, "BLANK")) { if (lex_force_match (lexer, T_LPAREN) && lex_force_num (lexer)) { factor.blank = lex_number (lexer); lex_get (lexer); if (! lex_force_match (lexer, T_RPAREN)) goto error; } } else if (lex_match_id (lexer, "DEFAULT")) { factor.blank = 0; factor.sort = false; } else { lex_error (lexer, NULL); goto error; } } } else if (lex_match_id (lexer, "PRINT")) { factor.print = 0; lex_match (lexer, T_EQUALS); while (lex_token (lexer) != T_ENDCMD && lex_token (lexer) != T_SLASH) { if (lex_match_id (lexer, "UNIVARIATE")) { factor.print |= PRINT_UNIVARIATE; } else if (lex_match_id (lexer, "DET")) { factor.print |= PRINT_DETERMINANT; } #if FACTOR_FULLY_IMPLEMENTED else if (lex_match_id (lexer, "INV")) { } #endif else if (lex_match_id (lexer, "AIC")) { factor.print |= PRINT_AIC; } else if (lex_match_id (lexer, "SIG")) { factor.print |= PRINT_SIG; } else if (lex_match_id (lexer, "CORRELATION")) { factor.print |= PRINT_CORRELATION; } else if (lex_match_id (lexer, "COVARIANCE")) { factor.print |= PRINT_COVARIANCE; } else if (lex_match_id (lexer, "ROTATION")) { factor.print |= PRINT_ROTATION; } else if (lex_match_id (lexer, "EXTRACTION")) { factor.print |= PRINT_EXTRACTION; } else if (lex_match_id (lexer, "INITIAL")) { factor.print |= PRINT_INITIAL; } else if (lex_match_id (lexer, "KMO")) { factor.print |= PRINT_KMO; } #if FACTOR_FULLY_IMPLEMENTED else if (lex_match_id (lexer, "REPR")) { } else if (lex_match_id (lexer, "FSCORE")) { } #endif else if (lex_match (lexer, T_ALL)) { factor.print = 0xFFFF; } else if (lex_match_id (lexer, "DEFAULT")) { factor.print |= PRINT_INITIAL ; factor.print |= PRINT_EXTRACTION ; factor.print |= PRINT_ROTATION ; } else { lex_error (lexer, NULL); goto error; } } } else if (lex_match_id (lexer, "MISSING")) { lex_match (lexer, T_EQUALS); while (lex_token (lexer) != T_ENDCMD && lex_token (lexer) != T_SLASH) { if (lex_match_id (lexer, "INCLUDE")) { factor.exclude = MV_SYSTEM; } else if (lex_match_id (lexer, "EXCLUDE")) { factor.exclude = MV_ANY; } else if (lex_match_id (lexer, "LISTWISE")) { factor.missing_type = MISS_LISTWISE; } else if (lex_match_id (lexer, "PAIRWISE")) { factor.missing_type = MISS_PAIRWISE; } else if (lex_match_id (lexer, "MEANSUB")) { factor.missing_type = MISS_MEANSUB; } else { lex_error (lexer, NULL); goto error; } } } else { lex_error (lexer, NULL); goto error; } } if (factor.rotation == ROT_NONE) factor.print &= ~PRINT_ROTATION; if (factor.n_vars < 2) msg (MW, _("Factor analysis on a single variable is not useful.")); if (factor.n_vars < 1) { msg (ME, _("Factor analysis without variables is not possible.")); goto error; } if (matrix_reader) { struct idata *id = idata_alloc (factor.n_vars); while (next_matrix_from_reader (&id->mm, mr, factor.vars, factor.n_vars)) { do_factor_by_matrix (&factor, id); gsl_matrix_free (id->ai_cov); id->ai_cov = NULL; gsl_matrix_free (id->ai_cor); id->ai_cor = NULL; gsl_matrix_free (id->mm.corr); id->mm.corr = NULL; gsl_matrix_free (id->mm.cov); id->mm.cov = NULL; } idata_free (id); } else if (! run_factor (ds, &factor)) goto error; destroy_matrix_reader (mr); free (factor.vars); return CMD_SUCCESS; error: destroy_matrix_reader (mr); free (factor.vars); return CMD_FAILURE; } static void do_factor (const struct cmd_factor *factor, struct casereader *group); static bool run_factor (struct dataset *ds, const struct cmd_factor *factor) { struct dictionary *dict = dataset_dict (ds); bool ok; struct casereader *group; struct casegrouper *grouper = casegrouper_create_splits (proc_open (ds), dict); while (casegrouper_get_next_group (grouper, &group)) { if (factor->missing_type == MISS_LISTWISE) group = casereader_create_filter_missing (group, factor->vars, factor->n_vars, factor->exclude, NULL, NULL); do_factor (factor, group); } ok = casegrouper_destroy (grouper); ok = proc_commit (ds) && ok; return ok; } /* Return the communality of variable N, calculated to N_FACTORS */ static double the_communality (const gsl_matrix *evec, const gsl_vector *eval, int n, int n_factors) { size_t i; double comm = 0; assert (n >= 0); assert (n < eval->size); assert (n < evec->size1); assert (n_factors <= eval->size); for (i = 0 ; i < n_factors; ++i) { double evali = fabs (gsl_vector_get (eval, i)); double eveci = gsl_matrix_get (evec, n, i); comm += pow2 (eveci) * evali; } return comm; } /* Return the communality of variable N, calculated to N_FACTORS */ static double communality (const struct idata *idata, int n, int n_factors) { return the_communality (idata->evec, idata->eval, n, n_factors); } static void show_scree (const struct cmd_factor *f, const struct idata *idata) { struct scree *s; const char *label ; if (!(f->plot & PLOT_SCREE)) return; label = f->extraction == EXTRACTION_PC ? _("Component Number") : _("Factor Number"); s = scree_create (idata->eval, label); scree_submit (s); } static void show_communalities (const struct cmd_factor * factor, const gsl_vector *initial, const gsl_vector *extracted) { if (!(factor->print & (PRINT_INITIAL | PRINT_EXTRACTION))) return; struct pivot_table *table = pivot_table_create (N_("Communalities")); struct pivot_dimension *communalities = pivot_dimension_create ( table, PIVOT_AXIS_COLUMN, N_("Communalities")); if (factor->print & PRINT_INITIAL) pivot_category_create_leaves (communalities->root, N_("Initial")); if (factor->print & PRINT_EXTRACTION) pivot_category_create_leaves (communalities->root, N_("Extraction")); struct pivot_dimension *variables = pivot_dimension_create ( table, PIVOT_AXIS_ROW, N_("Variables")); for (size_t i = 0 ; i < factor->n_vars; ++i) { int row = pivot_category_create_leaf ( variables->root, pivot_value_new_variable (factor->vars[i])); int col = 0; if (factor->print & PRINT_INITIAL) pivot_table_put2 (table, col++, row, pivot_value_new_number ( gsl_vector_get (initial, i))); if (factor->print & PRINT_EXTRACTION) pivot_table_put2 (table, col++, row, pivot_value_new_number ( gsl_vector_get (extracted, i))); } pivot_table_submit (table); } static struct pivot_dimension * create_numeric_dimension (struct pivot_table *table, enum pivot_axis_type axis_type, const char *name, size_t n, bool show_label) { struct pivot_dimension *d = pivot_dimension_create (table, axis_type, name); d->root->show_label = show_label; for (int i = 0 ; i < n; ++i) pivot_category_create_leaf (d->root, pivot_value_new_integer (i + 1)); return d; } static void show_factor_matrix (const struct cmd_factor *factor, const struct idata *idata, const char *title, const gsl_matrix *fm) { struct pivot_table *table = pivot_table_create (title); const int n_factors = idata->n_extractions; create_numeric_dimension ( table, PIVOT_AXIS_COLUMN, factor->extraction == EXTRACTION_PC ? N_("Component") : N_("Factor"), n_factors, true); struct pivot_dimension *variables = pivot_dimension_create ( table, PIVOT_AXIS_ROW, N_("Variables")); /* Initialise to the identity permutation */ gsl_permutation *perm = gsl_permutation_calloc (factor->n_vars); if (factor->sort) sort_matrix_indirect (fm, perm); for (size_t i = 0 ; i < factor->n_vars; ++i) { const int matrix_row = perm->data[i]; int var_idx = pivot_category_create_leaf ( variables->root, pivot_value_new_variable (factor->vars[matrix_row])); for (size_t j = 0 ; j < n_factors; ++j) { double x = gsl_matrix_get (fm, matrix_row, j); if (fabs (x) < factor->blank) continue; pivot_table_put2 (table, j, var_idx, pivot_value_new_number (x)); } } gsl_permutation_free (perm); pivot_table_submit (table); } static void put_variance (struct pivot_table *table, int row, int phase_idx, double lambda, double percent, double cum) { double entries[] = { lambda, percent, cum }; for (size_t i = 0; i < sizeof entries / sizeof *entries; i++) pivot_table_put3 (table, i, phase_idx, row, pivot_value_new_number (entries[i])); } static void show_explained_variance (const struct cmd_factor * factor, const struct idata *idata, const gsl_vector *initial_eigenvalues, const gsl_vector *extracted_eigenvalues, const gsl_vector *rotated_loadings) { if (!(factor->print & (PRINT_INITIAL | PRINT_EXTRACTION | PRINT_ROTATION))) return; struct pivot_table *table = pivot_table_create ( N_("Total Variance Explained")); table->omit_empty = true; pivot_dimension_create (table, PIVOT_AXIS_COLUMN, N_("Statistics"), N_("Total"), PIVOT_RC_OTHER, /* xgettext:no-c-format */ N_("% of Variance"), PIVOT_RC_PERCENT, /* xgettext:no-c-format */ N_("Cumulative %"), PIVOT_RC_PERCENT); struct pivot_dimension *phase = pivot_dimension_create ( table, PIVOT_AXIS_COLUMN, N_("Phase")); if (factor->print & PRINT_INITIAL) pivot_category_create_leaves (phase->root, N_("Initial Eigenvalues")); if (factor->print & PRINT_EXTRACTION) pivot_category_create_leaves (phase->root, N_("Extraction Sums of Squared Loadings")); if (factor->print & PRINT_ROTATION) pivot_category_create_leaves (phase->root, N_("Rotation Sums of Squared Loadings")); struct pivot_dimension *components = pivot_dimension_create ( table, PIVOT_AXIS_ROW, factor->extraction == EXTRACTION_PC ? N_("Component") : N_("Factor")); double i_total = 0.0; for (size_t i = 0 ; i < initial_eigenvalues->size; ++i) i_total += gsl_vector_get (initial_eigenvalues, i); double e_total = (factor->extraction == EXTRACTION_PAF ? factor->n_vars : i_total); double i_cum = 0.0; double e_cum = 0.0; double r_cum = 0.0; for (size_t i = 0 ; i < factor->n_vars; ++i) { const double i_lambda = gsl_vector_get (initial_eigenvalues, i); double i_percent = 100.0 * i_lambda / i_total ; i_cum += i_percent; const double e_lambda = gsl_vector_get (extracted_eigenvalues, i); double e_percent = 100.0 * e_lambda / e_total ; e_cum += e_percent; int row = pivot_category_create_leaf ( components->root, pivot_value_new_integer (i + 1)); int phase_idx = 0; /* Initial Eigenvalues */ if (factor->print & PRINT_INITIAL) put_variance (table, row, phase_idx++, i_lambda, i_percent, i_cum); if (i < idata->n_extractions) { if (factor->print & PRINT_EXTRACTION) put_variance (table, row, phase_idx++, e_lambda, e_percent, e_cum); if (rotated_loadings != NULL && factor->print & PRINT_ROTATION) { double r_lambda = gsl_vector_get (rotated_loadings, i); double r_percent = 100.0 * r_lambda / e_total ; if (factor->rotation == ROT_PROMAX) r_lambda = r_percent = SYSMIS; r_cum += r_percent; put_variance (table, row, phase_idx++, r_lambda, r_percent, r_cum); } } } pivot_table_submit (table); } static void show_factor_correlation (const struct cmd_factor * factor, const gsl_matrix *fcm) { struct pivot_table *table = pivot_table_create ( N_("Factor Correlation Matrix")); create_numeric_dimension ( table, PIVOT_AXIS_ROW, factor->extraction == EXTRACTION_PC ? N_("Component") : N_("Factor"), fcm->size2, true); create_numeric_dimension (table, PIVOT_AXIS_COLUMN, N_("Factor 2"), fcm->size1, false); for (size_t i = 0 ; i < fcm->size1; ++i) for (size_t j = 0 ; j < fcm->size2; ++j) pivot_table_put2 (table, j, i, pivot_value_new_number (gsl_matrix_get (fcm, i, j))); pivot_table_submit (table); } static void add_var_dims (struct pivot_table *table, const struct cmd_factor *factor) { for (int i = 0; i < 2; i++) { struct pivot_dimension *d = pivot_dimension_create ( table, i ? PIVOT_AXIS_ROW : PIVOT_AXIS_COLUMN, N_("Variables")); for (size_t j = 0; j < factor->n_vars; j++) pivot_category_create_leaf ( d->root, pivot_value_new_variable (factor->vars[j])); } } static void show_aic (const struct cmd_factor *factor, const struct idata *idata) { if ((factor->print & PRINT_AIC) == 0) return; struct pivot_table *table = pivot_table_create (N_("Anti-Image Matrices")); add_var_dims (table, factor); pivot_dimension_create (table, PIVOT_AXIS_ROW, N_("Statistics"), N_("Anti-image Covariance"), N_("Anti-image Correlation")); for (size_t i = 0; i < factor->n_vars; ++i) for (size_t j = 0; j < factor->n_vars; ++j) { double cov = gsl_matrix_get (idata->ai_cov, i, j); pivot_table_put3 (table, i, j, 0, pivot_value_new_number (cov)); double corr = gsl_matrix_get (idata->ai_cor, i, j); pivot_table_put3 (table, i, j, 1, pivot_value_new_number (corr)); } pivot_table_submit (table); } static void show_correlation_matrix (const struct cmd_factor *factor, const struct idata *idata) { if (!(factor->print & (PRINT_CORRELATION | PRINT_SIG | PRINT_DETERMINANT))) return; struct pivot_table *table = pivot_table_create (N_("Correlation Matrix")); if (factor->print & (PRINT_CORRELATION | PRINT_SIG)) { add_var_dims (table, factor); struct pivot_dimension *statistics = pivot_dimension_create ( table, PIVOT_AXIS_ROW, N_("Statistics")); if (factor->print & PRINT_CORRELATION) pivot_category_create_leaves (statistics->root, N_("Correlation"), PIVOT_RC_CORRELATION); if (factor->print & PRINT_SIG) pivot_category_create_leaves (statistics->root, N_("Sig. (1-tailed)"), PIVOT_RC_SIGNIFICANCE); int stat_idx = 0; if (factor->print & PRINT_CORRELATION) { for (int i = 0; i < factor->n_vars; ++i) for (int j = 0; j < factor->n_vars; ++j) { double corr = gsl_matrix_get (idata->mm.corr, i, j); pivot_table_put3 (table, j, i, stat_idx, pivot_value_new_number (corr)); } stat_idx++; } if (factor->print & PRINT_SIG) { for (int i = 0; i < factor->n_vars; ++i) for (int j = 0; j < factor->n_vars; ++j) if (i != j) { double rho = gsl_matrix_get (idata->mm.corr, i, j); double w = gsl_matrix_get (idata->mm.n, i, j); double sig = significance_of_correlation (rho, w); pivot_table_put3 (table, j, i, stat_idx, pivot_value_new_number (sig)); } stat_idx++; } } if (factor->print & PRINT_DETERMINANT) table->caption = pivot_value_new_user_text_nocopy ( xasprintf ("%s: %.2f", _("Determinant"), idata->detR)); pivot_table_submit (table); } static void show_covariance_matrix (const struct cmd_factor *factor, const struct idata *idata) { if (!(factor->print & PRINT_COVARIANCE)) return; struct pivot_table *table = pivot_table_create (N_("Covariance Matrix")); add_var_dims (table, factor); for (int i = 0; i < factor->n_vars; ++i) for (int j = 0; j < factor->n_vars; ++j) { double cov = gsl_matrix_get (idata->mm.cov, i, j); pivot_table_put2 (table, j, i, pivot_value_new_number (cov)); } pivot_table_submit (table); } static void do_factor (const struct cmd_factor *factor, struct casereader *r) { struct ccase *c; struct idata *idata = idata_alloc (factor->n_vars); idata->cvm = covariance_1pass_create (factor->n_vars, factor->vars, factor->wv, factor->exclude, true); for (; (c = casereader_read (r)); case_unref (c)) { covariance_accumulate (idata->cvm, c); } idata->mm.cov = covariance_calculate (idata->cvm); if (idata->mm.cov == NULL) { msg (MW, _("The dataset contains no complete observations. No analysis will be performed.")); covariance_destroy (idata->cvm); goto finish; } idata->mm.var_matrix = covariance_moments (idata->cvm, MOMENT_VARIANCE); idata->mm.mean_matrix = covariance_moments (idata->cvm, MOMENT_MEAN); idata->mm.n = covariance_moments (idata->cvm, MOMENT_NONE); do_factor_by_matrix (factor, idata); finish: gsl_matrix_free (idata->mm.corr); gsl_matrix_free (idata->mm.cov); idata_free (idata); casereader_destroy (r); } static void do_factor_by_matrix (const struct cmd_factor *factor, struct idata *idata) { if (!idata->mm.cov && !idata->mm.corr) { msg (ME, _("The dataset has no complete covariance or correlation matrix.")); return; } if (idata->mm.cov && !idata->mm.corr) idata->mm.corr = correlation_from_covariance (idata->mm.cov, idata->mm.var_matrix); if (idata->mm.corr && !idata->mm.cov) idata->mm.cov = covariance_from_correlation (idata->mm.corr, idata->mm.var_matrix); if (factor->method == METHOD_CORR) idata->analysis_matrix = idata->mm.corr; else idata->analysis_matrix = idata->mm.cov; gsl_matrix *r_inv; r_inv = clone_matrix (idata->mm.corr); gsl_linalg_cholesky_decomp (r_inv); gsl_linalg_cholesky_invert (r_inv); idata->ai_cov = anti_image_cov (r_inv); idata->ai_cor = anti_image_corr (r_inv, idata); int i; double sum_ssq_r = 0; double sum_ssq_a = 0; for (i = 0; i < r_inv->size1; ++i) { sum_ssq_r += ssq_od_n (idata->mm.corr, i); sum_ssq_a += ssq_od_n (idata->ai_cor, i); } gsl_matrix_free (r_inv); if (factor->print & PRINT_DETERMINANT || factor->print & PRINT_KMO) { int sign = 0; const int size = idata->mm.corr->size1; gsl_permutation *p = gsl_permutation_calloc (size); gsl_matrix *tmp = gsl_matrix_calloc (size, size); gsl_matrix_memcpy (tmp, idata->mm.corr); gsl_linalg_LU_decomp (tmp, p, &sign); idata->detR = gsl_linalg_LU_det (tmp, sign); gsl_permutation_free (p); gsl_matrix_free (tmp); } if (factor->print & PRINT_UNIVARIATE) { struct pivot_table *table = pivot_table_create ( N_("Descriptive Statistics")); pivot_table_set_weight_var (table, factor->wv); pivot_dimension_create (table, PIVOT_AXIS_COLUMN, N_("Statistics"), N_("Mean"), PIVOT_RC_OTHER, N_("Std. Deviation"), PIVOT_RC_OTHER, N_("Analysis N"), PIVOT_RC_COUNT); struct pivot_dimension *variables = pivot_dimension_create ( table, PIVOT_AXIS_ROW, N_("Variables")); for (i = 0 ; i < factor->n_vars; ++i) { const struct variable *v = factor->vars[i]; int row = pivot_category_create_leaf ( variables->root, pivot_value_new_variable (v)); double entries[] = { gsl_matrix_get (idata->mm.mean_matrix, i, i), sqrt (gsl_matrix_get (idata->mm.var_matrix, i, i)), gsl_matrix_get (idata->mm.n, i, i), }; for (size_t j = 0; j < sizeof entries / sizeof *entries; j++) pivot_table_put2 (table, j, row, pivot_value_new_number (entries[j])); } pivot_table_submit (table); } if (factor->print & PRINT_KMO) { struct pivot_table *table = pivot_table_create ( N_("KMO and Bartlett's Test")); struct pivot_dimension *statistics = pivot_dimension_create ( table, PIVOT_AXIS_ROW, N_("Statistics"), N_("Kaiser-Meyer-Olkin Measure of Sampling Adequacy"), PIVOT_RC_OTHER); pivot_category_create_group ( statistics->root, N_("Bartlett's Test of Sphericity"), N_("Approx. Chi-Square"), PIVOT_RC_OTHER, N_("df"), PIVOT_RC_INTEGER, N_("Sig."), PIVOT_RC_SIGNIFICANCE); /* The literature doesn't say what to do for the value of W when missing values are involved. The best thing I can think of is to take the mean average. */ double w = 0; for (i = 0; i < idata->mm.n->size1; ++i) w += gsl_matrix_get (idata->mm.n, i, i); w /= idata->mm.n->size1; double xsq = ((w - 1 - (2 * factor->n_vars + 5) / 6.0) * -log (idata->detR)); double df = factor->n_vars * (factor->n_vars - 1) / 2; double entries[] = { sum_ssq_r / (sum_ssq_r + sum_ssq_a), xsq, df, gsl_cdf_chisq_Q (xsq, df) }; for (size_t i = 0; i < sizeof entries / sizeof *entries; i++) pivot_table_put1 (table, i, pivot_value_new_number (entries[i])); pivot_table_submit (table); } show_correlation_matrix (factor, idata); show_covariance_matrix (factor, idata); if (idata->cvm) covariance_destroy (idata->cvm); { gsl_matrix *am = matrix_dup (idata->analysis_matrix); gsl_eigen_symmv_workspace *workspace = gsl_eigen_symmv_alloc (factor->n_vars); gsl_eigen_symmv (am, idata->eval, idata->evec, workspace); gsl_eigen_symmv_free (workspace); gsl_matrix_free (am); } gsl_eigen_symmv_sort (idata->eval, idata->evec, GSL_EIGEN_SORT_ABS_DESC); idata->n_extractions = n_extracted_factors (factor, idata); if (idata->n_extractions == 0) { msg (MW, _("The %s criteria result in zero factors extracted. Therefore no analysis will be performed."), "FACTOR"); return; } if (idata->n_extractions > factor->n_vars) { msg (MW, _("The %s criteria result in more factors than variables, which is not meaningful. No analysis will be performed."), "FACTOR"); return; } { gsl_matrix *rotated_factors = NULL; gsl_matrix *pattern_matrix = NULL; gsl_matrix *fcm = NULL; gsl_vector *rotated_loadings = NULL; const gsl_vector *extracted_eigenvalues = NULL; gsl_vector *initial_communalities = gsl_vector_alloc (factor->n_vars); gsl_vector *extracted_communalities = gsl_vector_alloc (factor->n_vars); size_t i; struct factor_matrix_workspace *fmw = factor_matrix_workspace_alloc (idata->msr->size, idata->n_extractions); gsl_matrix *factor_matrix = gsl_matrix_calloc (factor->n_vars, fmw->n_factors); if (factor->extraction == EXTRACTION_PAF) { gsl_vector *diff = gsl_vector_alloc (idata->msr->size); struct smr_workspace *ws = ws_create (idata->analysis_matrix); for (i = 0 ; i < factor->n_vars ; ++i) { double r2 = squared_multiple_correlation (idata->analysis_matrix, i, ws); gsl_vector_set (idata->msr, i, r2); } ws_destroy (ws); gsl_vector_memcpy (initial_communalities, idata->msr); for (i = 0; i < factor->extraction_iterations; ++i) { double min, max; gsl_vector_memcpy (diff, idata->msr); iterate_factor_matrix (idata->analysis_matrix, idata->msr, factor_matrix, fmw); gsl_vector_sub (diff, idata->msr); gsl_vector_minmax (diff, &min, &max); if (fabs (min) < factor->econverge && fabs (max) < factor->econverge) break; } gsl_vector_free (diff); gsl_vector_memcpy (extracted_communalities, idata->msr); extracted_eigenvalues = fmw->eval; } else if (factor->extraction == EXTRACTION_PC) { for (i = 0; i < factor->n_vars; ++i) gsl_vector_set (initial_communalities, i, communality (idata, i, factor->n_vars)); gsl_vector_memcpy (extracted_communalities, initial_communalities); iterate_factor_matrix (idata->analysis_matrix, extracted_communalities, factor_matrix, fmw); extracted_eigenvalues = idata->eval; } show_aic (factor, idata); show_communalities (factor, initial_communalities, extracted_communalities); if (factor->rotation != ROT_NONE) { rotated_factors = gsl_matrix_calloc (factor_matrix->size1, factor_matrix->size2); rotated_loadings = gsl_vector_calloc (factor_matrix->size2); if (factor->rotation == ROT_PROMAX) { pattern_matrix = gsl_matrix_calloc (factor_matrix->size1, factor_matrix->size2); fcm = gsl_matrix_calloc (factor_matrix->size2, factor_matrix->size2); } rotate (factor, factor_matrix, extracted_communalities, rotated_factors, rotated_loadings, pattern_matrix, fcm); } show_explained_variance (factor, idata, idata->eval, extracted_eigenvalues, rotated_loadings); factor_matrix_workspace_free (fmw); show_scree (factor, idata); show_factor_matrix (factor, idata, (factor->extraction == EXTRACTION_PC ? N_("Component Matrix") : N_("Factor Matrix")), factor_matrix); if (factor->rotation == ROT_PROMAX) { show_factor_matrix (factor, idata, N_("Pattern Matrix"), pattern_matrix); gsl_matrix_free (pattern_matrix); } if (factor->rotation != ROT_NONE) { show_factor_matrix (factor, idata, (factor->rotation == ROT_PROMAX ? N_("Structure Matrix") : factor->extraction == EXTRACTION_PC ? N_("Rotated Component Matrix") : N_("Rotated Factor Matrix")), rotated_factors); gsl_matrix_free (rotated_factors); } if (factor->rotation == ROT_PROMAX) { show_factor_correlation (factor, fcm); gsl_matrix_free (fcm); } gsl_matrix_free (factor_matrix); gsl_vector_free (rotated_loadings); gsl_vector_free (initial_communalities); gsl_vector_free (extracted_communalities); } } pspp-1.4.1/src/language/stats/wilcoxon.h0000644000175000017500000000266113670210420017636 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2008, 2011 Free Software Foundation, Inc. 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 3 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, see . */ #if !wilcoxon_h #define wilcoxon_h 1 #include #include #include "data/case.h" #include "language/stats/npar.h" struct rank_sum { double n; double sum; }; struct wilcoxon_state { struct casereader *reader; struct variable *sign; struct variable *absdiff; struct rank_sum positives; struct rank_sum negatives; double n_zeros; double tiebreaker; }; struct wilcoxon_test { struct two_sample_test parent; }; struct casereader; struct dataset; void wilcoxon_execute (const struct dataset *ds, struct casereader *input, enum mv_class exclude, const struct npar_test *test, bool exact, double timer ); #endif pspp-1.4.1/src/language/stats/t-test-parser.c0000644000175000017500000002652013670210420020501 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2011, 2015 Free Software Foundation, Inc. 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 3 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, see . */ #include #include "libpspp/message.h" #include "data/casegrouper.h" #include "data/casereader.h" #include "data/dictionary.h" #include "data/dataset.h" #include "data/missing-values.h" #include "language/lexer/lexer.h" #include "language/command.h" #include "language/lexer/variable-parser.h" #include "language/lexer/value-parser.h" #include "gettext.h" #define _(msgid) gettext (msgid) #include "t-test.h" int cmd_t_test (struct lexer *lexer, struct dataset *ds) { bool ok = false; const struct dictionary *dict = dataset_dict (ds); struct tt tt; int mode_count = 0; /* Variables pertaining to the paired mode */ const struct variable **v1 = NULL; size_t n_v1 = 0; const struct variable **v2 = NULL; size_t n_v2 = 0; size_t n_pairs = 0; vp *pairs = NULL; /* One sample mode */ double testval = SYSMIS; /* Independent samples mode */ const struct variable *gvar; union value gval0; union value gval1; int gval_width = -1; bool cut = false; tt.wv = dict_get_weight (dict); tt.dict = dict; tt.confidence = 0.95; tt.exclude = MV_ANY; tt.missing_type = MISS_ANALYSIS; tt.n_vars = 0; tt.vars = NULL; tt.mode = MODE_undef; lex_match (lexer, T_EQUALS); for (; lex_token (lexer) != T_ENDCMD;) { lex_match (lexer, T_SLASH); if (lex_match_id (lexer, "TESTVAL")) { mode_count++; tt.mode = MODE_SINGLE; lex_match (lexer, T_EQUALS); if (!lex_force_num (lexer)) goto exit; testval = lex_number (lexer); lex_get (lexer); } else if (lex_match_id (lexer, "GROUPS")) { mode_count++; cut = false; tt.mode = MODE_INDEP; lex_match (lexer, T_EQUALS); if (NULL == (gvar = parse_variable (lexer, dict))) goto exit; gval_width = var_get_width (gvar); value_init (&gval0, gval_width); value_init (&gval1, gval_width); int n; if (lex_match (lexer, T_LPAREN)) { parse_value (lexer, &gval0, gvar); if (lex_token (lexer) != T_RPAREN) { lex_match (lexer, T_COMMA); parse_value (lexer, &gval1, gvar); cut = false; n = 2; } else { cut = true; n = 1; } if (! lex_force_match (lexer, T_RPAREN)) goto exit; } else { gval0.f = 1.0; gval1.f = 2.0; cut = false; n = 0; } if (n != 2 && var_is_alpha (gvar)) { msg (SE, _("When applying %s to a string variable, two " "values must be specified."), "GROUPS"); goto exit; } } else if (lex_match_id (lexer, "PAIRS")) { bool with = false; bool paired = false; if (tt.n_vars > 0) { msg (SE, _("%s subcommand may not be used with %s."), "VARIABLES", "PAIRS"); goto exit; } mode_count++; tt.mode = MODE_PAIRED; lex_match (lexer, T_EQUALS); if (!parse_variables_const (lexer, dict, &v1, &n_v1, PV_NO_DUPLICATE | PV_NUMERIC)) goto exit; if (lex_match (lexer, T_WITH)) { with = true; if (!parse_variables_const (lexer, dict, &v2, &n_v2, PV_NO_DUPLICATE | PV_NUMERIC)) goto exit; if (lex_match (lexer, T_LPAREN) && lex_match_id (lexer, "PAIRED") && lex_match (lexer, T_RPAREN)) { paired = true; if (n_v1 != n_v2) { msg (SE, _("PAIRED was specified but the number of variables " "preceding WITH (%zu) did not match the number " "following (%zu)."), n_v1, n_v2); goto exit; } } } { int i; if (!with) n_pairs = (n_v1 * (n_v1 - 1)) / 2.0; else if (paired) n_pairs = n_v1; else n_pairs = n_v1 * n_v2; pairs = xcalloc (n_pairs, sizeof *pairs); if (with) { int x = 0; if (paired) { for (i = 0 ; i < n_v1; ++i) { vp *pair = &pairs[i]; (*pair)[0] = v1[i]; (*pair)[1] = v2[i]; } } else { for (i = 0 ; i < n_v1; ++i) { int j; for (j = 0 ; j < n_v2; ++j) { vp *pair = &pairs[x++]; (*pair)[0] = v1[i]; (*pair)[1] = v2[j]; } } } } else { int x = 0; for (i = 0 ; i < n_v1; ++i) { int j; for (j = i + 1 ; j < n_v1; ++j) { vp *pair = &pairs[x++]; (*pair)[0] = v1[i]; (*pair)[1] = v1[j]; } } } } } else if (lex_match_id (lexer, "VARIABLES")) { if (tt.mode == MODE_PAIRED) { msg (SE, _("%s subcommand may not be used with %s."), "VARIABLES", "PAIRS"); goto exit; } lex_match (lexer, T_EQUALS); if (!parse_variables_const (lexer, dict, &tt.vars, &tt.n_vars, PV_NO_DUPLICATE | PV_NUMERIC)) goto exit; } else if (lex_match_id (lexer, "MISSING")) { lex_match (lexer, T_EQUALS); while (lex_token (lexer) != T_ENDCMD && lex_token (lexer) != T_SLASH) { if (lex_match_id (lexer, "INCLUDE")) { tt.exclude = MV_SYSTEM; } else if (lex_match_id (lexer, "EXCLUDE")) { tt.exclude = MV_ANY; } else if (lex_match_id (lexer, "LISTWISE")) { tt.missing_type = MISS_LISTWISE; } else if (lex_match_id (lexer, "ANALYSIS")) { tt.missing_type = MISS_ANALYSIS; } else { lex_error (lexer, NULL); goto exit; } lex_match (lexer, T_COMMA); } } else if (lex_match_id (lexer, "CRITERIA")) { lex_match (lexer, T_EQUALS); if (lex_match_id (lexer, "CIN") || lex_force_match_id (lexer, "CI")) if (lex_force_match (lexer, T_LPAREN)) { if (!lex_force_num (lexer)) goto exit; tt.confidence = lex_number (lexer); lex_get (lexer); if (! lex_force_match (lexer, T_RPAREN)) goto exit; } } else { lex_error (lexer, NULL); goto exit; } } if (mode_count != 1) { msg (SE, _("Exactly one of TESTVAL, GROUPS and PAIRS subcommands " "must be specified.")); goto exit; } if (tt.n_vars == 0 && tt.mode != MODE_PAIRED) { lex_sbc_missing ("VARIABLES"); goto exit; } /* Deal with splits etc */ { struct casereader *group; struct casegrouper *grouper = casegrouper_create_splits (proc_open (ds), dict); while (casegrouper_get_next_group (grouper, &group)) { if (tt.mode == MODE_SINGLE) { if (tt.missing_type == MISS_LISTWISE) group = casereader_create_filter_missing (group, tt.vars, tt.n_vars, tt.exclude, NULL, NULL); one_sample_run (&tt, testval, group); } else if (tt.mode == MODE_PAIRED) { if (tt.missing_type == MISS_LISTWISE) { group = casereader_create_filter_missing (group, v1, n_v1, tt.exclude, NULL, NULL); group = casereader_create_filter_missing (group, v2, n_v2, tt.exclude, NULL, NULL); } paired_run (&tt, n_pairs, pairs, group); } else /* tt.mode == MODE_INDEP */ { if (tt.missing_type == MISS_LISTWISE) { group = casereader_create_filter_missing (group, tt.vars, tt.n_vars, tt.exclude, NULL, NULL); group = casereader_create_filter_missing (group, &gvar, 1, tt.exclude, NULL, NULL); } indep_run (&tt, gvar, cut, &gval0, &gval1, group); } } ok = casegrouper_destroy (grouper); ok = proc_commit (ds) && ok; } exit: if (gval_width != -1) { value_destroy (&gval0, gval_width); value_destroy (&gval1, gval_width); } free (pairs); free (v1); free (v2); free (tt.vars); return ok ? CMD_SUCCESS : CMD_FAILURE; } pspp-1.4.1/src/language/stats/kruskal-wallis.h0000644000175000017500000000230313670210420020732 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2010, 2011 Free Software Foundation, Inc. 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 3 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, see . */ #if !kruskal_wallis_h #define kruskal_wallis_h 1 #include #include #include "data/case.h" #include "language/stats/npar.h" struct kruskal_wallis_test { struct two_sample_test parent; }; struct casereader; struct dataset; void kruskal_wallis_execute (const struct dataset *ds, struct casereader *input, enum mv_class exclude, const struct npar_test *test, bool exact, double timer ); #endif pspp-1.4.1/src/language/stats/friedman.c0000644000175000017500000001530213700645725017566 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. -*-c-*- Copyright (C) 2010, 2011 Free Software Foundation, Inc. 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 3 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, see . */ #include #include "language/stats/friedman.h" #include #include #include "data/casereader.h" #include "data/dataset.h" #include "data/dictionary.h" #include "data/format.h" #include "data/variable.h" #include "libpspp/message.h" #include "libpspp/misc.h" #include "output/pivot-table.h" #include "gettext.h" #define N_(msgid) msgid #define _(msgid) gettext (msgid) struct friedman { double *rank_sum; double cc; double chi_sq; double w; const struct dictionary *dict; }; static void show_ranks_box (const struct one_sample_test *ost, const struct friedman *fr); static void show_sig_box (const struct one_sample_test *ost, const struct friedman *fr); struct datum { long posn; double x; }; static int cmp_x (const void *a_, const void *b_) { const struct datum *a = a_; const struct datum *b = b_; if (a->x < b->x) return -1; return (a->x > b->x); } static int cmp_posn (const void *a_, const void *b_) { const struct datum *a = a_; const struct datum *b = b_; if (a->posn < b->posn) return -1; return (a->posn > b->posn); } void friedman_execute (const struct dataset *ds, struct casereader *input, enum mv_class exclude, const struct npar_test *test, bool exact UNUSED, double timer UNUSED) { double numerator = 0.0; double denominator = 0.0; int v; struct ccase *c; const struct dictionary *dict = dataset_dict (ds); const struct variable *weight = dict_get_weight (dict); struct one_sample_test *ost = UP_CAST (test, struct one_sample_test, parent); struct friedman_test *ft = UP_CAST (ost, struct friedman_test, parent); bool warn = true; double sigma_t = 0.0; struct datum *row = XCALLOC (ost->n_vars, struct datum); double rsq; struct friedman fr; fr.rank_sum = xcalloc (ost->n_vars, sizeof *fr.rank_sum); fr.cc = 0.0; fr.dict = dict; for (v = 0; v < ost->n_vars; ++v) { row[v].posn = v; fr.rank_sum[v] = 0.0; } input = casereader_create_filter_weight (input, dict, &warn, NULL); input = casereader_create_filter_missing (input, ost->vars, ost->n_vars, exclude, 0, 0); for (; (c = casereader_read (input)); case_unref (c)) { double prev_x = SYSMIS; int run_length = 0; const double w = weight ? case_data (c, weight)->f: 1.0; fr.cc += w; for (v = 0; v < ost->n_vars; ++v) { const struct variable *var = ost->vars[v]; const union value *val = case_data (c, var); row[v].x = val->f; } qsort (row, ost->n_vars, sizeof *row, cmp_x); for (v = 0; v < ost->n_vars; ++v) { double x = row[v].x; /* Replace value by the Rank */ if (prev_x == x) { /* Deal with ties */ int i; run_length++; for (i = v - run_length; i < v; ++i) { row[i].x *= run_length ; row[i].x += v + 1; row[i].x /= run_length + 1; } row[v].x = row[v-1].x; } else { row[v].x = v + 1; if (run_length > 0) { double t = run_length + 1; sigma_t += w * (pow3 (t) - t); } run_length = 0; } prev_x = x; } if (run_length > 0) { double t = run_length + 1; sigma_t += w * (pow3 (t) - t); } qsort (row, ost->n_vars, sizeof *row, cmp_posn); for (v = 0; v < ost->n_vars; ++v) fr.rank_sum[v] += row[v].x * w; } casereader_destroy (input); free (row); for (v = 0; v < ost->n_vars; ++v) { numerator += pow2 (fr.rank_sum[v]); } rsq = numerator; numerator *= 12.0 / (fr.cc * ost->n_vars * (ost->n_vars + 1)); numerator -= 3 * fr.cc * (ost->n_vars + 1); denominator = 1 - sigma_t / (fr.cc * ost->n_vars * (pow2 (ost->n_vars) - 1)); fr.chi_sq = numerator / denominator; if (ft->kendalls_w) { fr.w = 12 * rsq ; fr.w -= 3 * pow2 (fr.cc) * ost->n_vars * pow2 (ost->n_vars + 1); fr.w /= pow2 (fr.cc) * (pow3 (ost->n_vars) - ost->n_vars) - fr.cc * sigma_t; } else fr.w = SYSMIS; show_ranks_box (ost, &fr); show_sig_box (ost, &fr); free (fr.rank_sum); } static void show_ranks_box (const struct one_sample_test *ost, const struct friedman *fr) { struct pivot_table *table = pivot_table_create (N_("Ranks")); pivot_dimension_create (table, PIVOT_AXIS_COLUMN, N_("Mean Rank"), N_("Mean Rank"), PIVOT_RC_OTHER); struct pivot_dimension *variables = pivot_dimension_create ( table, PIVOT_AXIS_ROW, N_("Variable")); for (size_t i = 0 ; i < ost->n_vars ; ++i) { int row = pivot_category_create_leaf ( variables->root, pivot_value_new_variable (ost->vars[i])); pivot_table_put2 (table, 0, row, pivot_value_new_number (fr->rank_sum[i] / fr->cc)); } pivot_table_submit (table); } static void show_sig_box (const struct one_sample_test *ost, const struct friedman *fr) { const struct friedman_test *ft = UP_CAST (ost, const struct friedman_test, parent); struct pivot_table *table = pivot_table_create (N_("Test Statistics")); pivot_table_set_weight_var (table, dict_get_weight (fr->dict)); struct pivot_dimension *statistics = pivot_dimension_create ( table, PIVOT_AXIS_ROW, N_("Statistics"), N_("N"), PIVOT_RC_COUNT); if (ft->kendalls_w) pivot_category_create_leaves (statistics->root, N_("Kendall's W"), PIVOT_RC_OTHER); pivot_category_create_leaves (statistics->root, N_("Chi-Square"), PIVOT_RC_OTHER, N_("df"), PIVOT_RC_INTEGER, N_("Asymp. Sig."), PIVOT_RC_SIGNIFICANCE); double entries[5]; int n = 0; entries[n++] = fr->cc; if (ft->kendalls_w) entries[n++] = fr->w; entries[n++] = fr->chi_sq; entries[n++] = ost->n_vars - 1; entries[n++] = gsl_cdf_chisq_Q (fr->chi_sq, ost->n_vars - 1); assert (n <= sizeof entries / sizeof *entries); for (size_t i = 0; i < n; i++) pivot_table_put1 (table, i, pivot_value_new_number (entries[i])); pivot_table_submit (table); } pspp-1.4.1/src/language/stats/jonckheere-terpstra.h0000644000175000017500000000232113670210420021744 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2012 Free Software Foundation, Inc. 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 3 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, see . */ #if !jonckheere_terpstra_h #define jonckheere_terpstra_h 1 #include #include #include "data/case.h" #include "language/stats/npar.h" struct jonckheere_terpstra_test { struct two_sample_test parent; }; struct casereader; struct dataset; void jonckheere_terpstra_execute (const struct dataset *ds, struct casereader *input, enum mv_class exclude, const struct npar_test *test, bool exact, double timer ); #endif pspp-1.4.1/src/language/stats/means.c0000644000175000017500000010214513700645725017106 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2019 Free Software Foundation, Inc. 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 3 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, see . */ #include #include "data/case.h" #include "data/casegrouper.h" #include "data/casereader.h" #include "data/dataset.h" #include "data/dictionary.h" #include "data/format.h" #include "data/variable.h" #include "libpspp/hmap.h" #include "libpspp/bt.h" #include "libpspp/hash-functions.h" #include "libpspp/misc.h" #include "libpspp/pool.h" #include "language/command.h" #include "count-one-bits.h" #include "count-leading-zeros.h" #include "output/pivot-table.h" #include "means.h" #include "gettext.h" #define _(msgid) gettext (msgid) #define N_(msgid) (msgid) /* A "cell" in this procedure represents a distinct value of the procedure's categorical variables, and a set of summary statistics of all cases which whose categorical variables have that set of values. For example, the dataset v1 v2 cat1 cat2 100 202 0 1 100 202 0 2 100 202 1 0 100 202 0 1 has three cells in layer 0 and two cells in layer 1 in addition to a "grand summary" cell to which all (non-missing) cases contribute. The cells form a n-ary tree structure with the "grand summary" cell at the root. */ struct cell { struct hmap_node hmap_node; /* Element in hash table. */ struct bt_node bt_node; /* Element in binary tree */ int n_children; struct cell_container *children; /* The statistics to be calculated for the cell. */ struct statistic **stat; /* The parent of this cell, or NULL if this is the root cell. */ const struct cell *parent_cell; /* A bit-field variable which indicates which control variables are allocated a fixed value (for this cell), and which are "wildcards". A one indicates a fixed value. A zero indicates a wildcard. Wildcard values are used to calculate totals and sub-totals. */ unsigned int not_wild; /* The value(s). */ union value *values; /* The variables corresponding to the above values. */ const struct variable **vars; }; /* A structure used to find the union of all values used within a layer, and to sort those values. */ struct instance { struct hmap_node hmap_node; /* Element in hash table. */ struct bt_node bt_node; /* Element in binary tree */ /* A unique, consecutive, zero based index identifying this instance. */ int index; /* The top level value of this instance. */ union value value; const struct variable *var; }; static void destroy_workspace (const struct mtable *mt, struct workspace *ws) { for (int l = 0; l < mt->n_layers; ++l) { struct cell_container *instances = ws->instances + l; struct instance *inst; struct instance *next; HMAP_FOR_EACH_SAFE (inst, next, struct instance, hmap_node, &instances->map) { int width = var_get_width (inst->var); value_destroy (&inst->value, width); free (inst); } hmap_destroy (&instances->map); } free (ws->control_idx); free (ws->instances); } /* Destroy CELL. */ static void destroy_cell (const struct means *means, const struct mtable *mt, struct cell *cell) { int idx = 0; for (int i = 0; i < mt->n_layers; ++i) { if (0 == ((cell->not_wild >> i) & 0x1)) continue; const struct layer *layer = mt->layers[i]; for (int cmb = 0; cmb < mt->n_combinations; ++cmb) { struct workspace *ws = mt->ws + cmb; const struct variable *var = layer->factor_vars[ws->control_idx[i]]; int width = var_get_width (var); value_destroy (&cell->values[idx++], width); } } for (int i = 0; i < cell->n_children; ++i) { struct cell_container *container = cell->children + i; hmap_destroy (&container->map); } for (int v = 0; v < mt->n_dep_vars; ++v) { for (int s = 0; s < means->n_statistics; ++s) { stat_destroy *des = cell_spec[means->statistics[s]].sf; des (cell->stat[s + v * means->n_statistics]); } } free (cell->stat); free (cell->children); free (cell->values); free (cell->vars); free (cell); } /* Walk the tree in postorder starting from CELL and destroy all the cells. */ static void means_destroy_cells (const struct means *means, struct cell *cell, const struct mtable *table) { for (int i = 0; i < cell->n_children; ++i) { struct cell_container *container = cell->children + i; struct cell *sub_cell; struct cell *next; HMAP_FOR_EACH_SAFE (sub_cell, next, struct cell, hmap_node, &container->map) { means_destroy_cells (means, sub_cell, table); } } destroy_cell (means, table, cell); } #if 0 static void dump_cell (const struct cell *cell, const struct mtable *mt, int level) { for (int l = 0; l < level; ++l) putchar (' '); printf ("%p: ", cell); for (int i = 0; i < mt->n_layers; ++i) { putchar (((cell->not_wild >> i) & 0x1) ? 'w' : '.'); } printf (" - "); int x = 0; for (int i = 0; i < mt->n_layers; ++i) { if ((cell->not_wild >> i) & 0x1) { printf ("%s: ", var_get_name (cell->vars[x])); printf ("%g ", cell->values[x++].f); } else printf ("x "); } stat_get *sg = cell_spec[MEANS_N].sd; printf ("--- S1: %g", sg (cell->stat[0])); printf ("--- N Children: %d", cell->n_children); // printf ("--- Level: %d", level); printf ("--- Parent: %p", cell->parent_cell); printf ("\n"); } static void dump_indeces (const size_t *indexes, int n) { for (int i = 0 ; i < n; ++i) { printf ("%ld; ", indexes[i]); } printf ("\n"); } /* Dump the tree in pre-order. */ static void dump_tree (const struct cell *cell, const struct mtable *table, int level, const struct cell *parent) { assert (cell->parent_cell == parent); dump_cell (cell, table, level); for (int i = 0; i < cell->n_children; ++i) { struct cell_container *container = cell->children + i; struct cell *sub_cell; BT_FOR_EACH (sub_cell, struct cell, bt_node, &container->bt) { dump_tree (sub_cell, table, level + 1, cell); } } } #endif /* Generate a hash based on the values of the N variables in the array VARS which are taken from the case C. */ static unsigned int generate_hash (const struct mtable *mt, const struct ccase *c, unsigned int not_wild, const struct workspace *ws) { unsigned int hash = 0; for (int i = 0; i < mt->n_layers; ++i) { if (0 == ((not_wild >> i) & 0x1)) continue; const struct layer *layer = mt->layers[i]; const struct variable *var = layer->factor_vars[ws->control_idx[i]]; const union value *vv = case_data (c, var); int width = var_get_width (var); hash = hash_int (i, hash); hash = value_hash (vv, width, hash); } return hash; } /* Create a cell based on the N variables in the array VARS, which are indeces into the case C. The caller is responsible for destroying this cell when no longer needed. */ static struct cell * generate_cell (const struct means *means, const struct mtable *mt, const struct ccase *c, unsigned int not_wild, const struct cell *pcell, const struct workspace *ws) { int n_vars = count_one_bits (not_wild); struct cell *cell = xzalloc ((sizeof *cell)); cell->values = xcalloc (n_vars, sizeof *cell->values); cell->vars = xcalloc (n_vars, sizeof *cell->vars); cell->not_wild = not_wild; cell->parent_cell = pcell; cell->n_children = mt->n_layers - (sizeof (cell->not_wild) * CHAR_BIT) + count_leading_zeros (cell->not_wild); int idx = 0; for (int i = 0; i < mt->n_layers; ++i) { if (0 == ((not_wild >> i) & 0x1)) continue; const struct layer *layer = mt->layers[i]; const struct variable *var = layer->factor_vars[ws->control_idx[i]]; const union value *vv = case_data (c, var); int width = var_get_width (var); cell->vars[idx] = var; value_clone (&cell->values[idx++], vv, width); } assert (idx == n_vars); cell->children = xcalloc (cell->n_children, sizeof *cell->children); for (int i = 0; i < cell->n_children; ++i) { struct cell_container *container = cell->children + i; hmap_init (&container->map); } cell->stat = xcalloc (means->n_statistics * mt->n_dep_vars, sizeof *cell->stat); for (int v = 0; v < mt->n_dep_vars; ++v) { for (int stat = 0; stat < means->n_statistics; ++stat) { stat_create *sc = cell_spec[means->statistics[stat]].sc; cell->stat[stat + v * means->n_statistics] = sc (means->pool); } } return cell; } /* If a cell based on the N variables in the array VARS, which are indeces into the case C and whose hash is HASH, exists in HMAP, then return that cell. Otherwise, return NULL. */ static struct cell * lookup_cell (const struct mtable *mt, struct hmap *hmap, unsigned int hash, const struct ccase *c, unsigned int not_wild, const struct workspace *ws) { struct cell *cell = NULL; HMAP_FOR_EACH_WITH_HASH (cell, struct cell, hmap_node, hash, hmap) { bool match = true; int idx = 0; if (cell->not_wild != not_wild) continue; for (int i = 0; i < mt->n_layers; ++i) { if (0 == ((cell->not_wild >> i) & 0x1)) continue; const struct layer *layer = mt->layers[i]; const struct variable *var = layer->factor_vars[ws->control_idx[i]]; const union value *vv = case_data (c, var); int width = var_get_width (var); assert (var == cell->vars[idx]); if (!value_equal (vv, &cell->values[idx++], width)) { match = false; break; } } if (match) return cell; } return NULL; } /* A comparison function used to sort cells in a binary tree. Only the innermost value needs to be compared, because no two cells with similar outer values will appear in the same tree/map. */ static int cell_compare_3way (const struct bt_node *a, const struct bt_node *b, const void *aux UNUSED) { const struct cell *fa = BT_DATA (a, struct cell, bt_node); const struct cell *fb = BT_DATA (b, struct cell, bt_node); assert (fa->not_wild == fb->not_wild); int vidx = count_one_bits (fa->not_wild) - 1; assert (fa->vars[vidx] == fb->vars[vidx]); return value_compare_3way (&fa->values[vidx], &fb->values[vidx], var_get_width (fa->vars[vidx])); } /* A comparison function used to sort cells in a binary tree. */ static int compare_instance_3way (const struct bt_node *a, const struct bt_node *b, const void *aux UNUSED) { const struct instance *fa = BT_DATA (a, struct instance, bt_node); const struct instance *fb = BT_DATA (b, struct instance, bt_node); assert (fa->var == fb->var); return value_compare_3way (&fa->value, &fb->value, var_get_width (fa->var)); } static void arrange_cells (struct workspace *ws, struct cell *cell, const struct mtable *table); /* Iterate CONTAINER's map inserting a copy of its elements into CONTAINER's binary tree. Also, for each layer in TABLE, create an instance container, containing the union of all elements in CONTAINER. */ static void arrange_cell (struct workspace *ws, struct cell_container *container, const struct mtable *mt) { struct bt *bt = &container->bt; struct hmap *map = &container->map; bt_init (bt, cell_compare_3way, NULL); struct cell *cell; HMAP_FOR_EACH (cell, struct cell, hmap_node, map) { bt_insert (bt, &cell->bt_node); int idx = 0; for (int i = 0; i < mt->n_layers; ++i) { if (0 == ((cell->not_wild >> i) & 0x1)) continue; struct cell_container *instances = ws->instances + i; const struct variable *var = cell->vars[idx]; int width = var_get_width (var); unsigned int hash = value_hash (&cell->values[idx], width, 0); struct instance *inst = NULL; struct instance *next = NULL; HMAP_FOR_EACH_WITH_HASH_SAFE (inst, next, struct instance, hmap_node, hash, &instances->map) { assert (cell->vars[idx] == var); if (value_equal (&inst->value, &cell->values[idx], width)) { break; } } if (!inst) { inst = xzalloc (sizeof *inst); inst->index = -1; inst->var = var; value_clone (&inst->value, &cell->values[idx], width); hmap_insert (&instances->map, &inst->hmap_node, hash); } idx++; } arrange_cells (ws, cell, mt); } } /* Arrange the children and then all the subtotals. */ static void arrange_cells (struct workspace *ws, struct cell *cell, const struct mtable *table) { for (int i = 0; i < cell->n_children; ++i) { struct cell_container *container = cell->children + i; arrange_cell (ws, container, table); } } /* If the top level value in CELL, has an instance in the L_IDX'th layer, then return that instance. Otherwise return NULL. */ static const struct instance * lookup_instance (const struct mtable *mt, const struct workspace *ws, int l_idx, const struct cell *cell) { const struct layer *layer = mt->layers[l_idx]; int n_vals = count_one_bits (cell->not_wild); const struct variable *var = layer->factor_vars[ws->control_idx[l_idx]]; const union value *val = cell->values + n_vals - 1; int width = var_get_width (var); unsigned int hash = value_hash (val, width, 0); const struct cell_container *instances = ws->instances + l_idx; struct instance *inst = NULL; struct instance *next; HMAP_FOR_EACH_WITH_HASH_SAFE (inst, next, struct instance, hmap_node, hash, &instances->map) { if (value_equal (val, &inst->value, width)) break; } return inst; } /* Enter the values into PT. */ static void populate_table (const struct means *means, const struct mtable *mt, const struct workspace *ws, const struct cell *cell, struct pivot_table *pt) { size_t *indexes = XCALLOC (pt->n_dimensions, size_t); for (int v = 0; v < mt->n_dep_vars; ++v) { for (int s = 0; s < means->n_statistics; ++s) { int i = 0; if (mt->n_dep_vars > 1) indexes[i++] = v; indexes[i++] = s; int stat = means->statistics[s]; stat_get *sg = cell_spec[stat].sd; { const struct cell *pc = cell; for (; i < pt->n_dimensions; ++i) { int l_idx = pt->n_dimensions - i - 1; const struct cell_container *instances = ws->instances + l_idx; if (0 == (cell->not_wild >> l_idx & 0x1U)) { indexes [i] = hmap_count (&instances->map); } else { assert (pc); const struct instance *inst = lookup_instance (mt, ws, l_idx, pc); assert (inst); indexes [i] = inst->index; pc = pc->parent_cell; } } } int idx = s + v * means->n_statistics; struct pivot_value *pv = pivot_value_new_number (sg (cell->stat[idx])); if (NULL == cell_spec[stat].rc) { const struct variable *dv = mt->dep_vars[v]; pv->numeric.format = * var_get_print_format (dv); } pivot_table_put (pt, indexes, pt->n_dimensions, pv); } } free (indexes); for (int i = 0; i < cell->n_children; ++i) { struct cell_container *container = cell->children + i; struct cell *child = NULL; BT_FOR_EACH (child, struct cell, bt_node, &container->bt) { populate_table (means, mt, ws, child, pt); } } } static void create_table_structure (const struct mtable *mt, struct pivot_table *pt, const struct workspace *ws) { int * lindexes = ws->control_idx; /* The inner layers are situated rightmost in the table. So this iteration is in reverse order. */ for (int l = mt->n_layers -1; l >=0 ; --l) { const struct layer *layer = mt->layers[l]; const struct cell_container *instances = ws->instances + l; const struct variable *var = layer->factor_vars[lindexes[l]]; struct pivot_dimension *dim_layer = pivot_dimension_create (pt, PIVOT_AXIS_ROW, var_to_string (var)); dim_layer->root->show_label = true; /* Place the values of the control variables as table headings. */ { struct instance *inst = NULL; BT_FOR_EACH (inst, struct instance, bt_node, &instances->bt) { struct substring space = SS_LITERAL_INITIALIZER ("\t "); struct string str; ds_init_empty (&str); var_append_value_name (var, &inst->value, &str); ds_ltrim (&str, space); pivot_category_create_leaf (dim_layer->root, pivot_value_new_text (ds_cstr (&str))); ds_destroy (&str); } } pivot_category_create_leaf (dim_layer->root, pivot_value_new_text ("Total")); } } /* Initialise C_DES with a string describing the control variable relating to MT, LINDEXES. */ static void layers_to_string (const struct mtable *mt, const int *lindexes, struct string *c_des) { for (int l = 0; l < mt->n_layers; ++l) { const struct layer *layer = mt->layers[l]; const struct variable *ctrl_var = layer->factor_vars[lindexes[l]]; if (l > 0) ds_put_cstr (c_des, " * "); ds_put_cstr (c_des, var_get_name (ctrl_var)); } } static void populate_case_processing_summary (struct pivot_category *pc, const struct mtable *mt, const int *lindexes) { struct string ds; ds_init_empty (&ds); int l = 0; for (l = 0; l < mt->n_layers; ++l) { const struct layer *layer = mt->layers[l]; const struct variable *ctrl_var = layer->factor_vars[lindexes[l]]; if (l > 0) ds_put_cstr (&ds, " * "); ds_put_cstr (&ds, var_get_name (ctrl_var)); } for (int dv = 0; dv < mt->n_dep_vars; ++dv) { struct string dss; ds_init_empty (&dss); ds_put_cstr (&dss, var_get_name (mt->dep_vars[dv])); if (mt->n_layers > 0) { ds_put_cstr (&dss, " * "); ds_put_substring (&dss, ds.ss); } pivot_category_create_leaf (pc, pivot_value_new_text (ds_cstr (&dss))); ds_destroy (&dss); } ds_destroy (&ds); } /* Create the "Case Processing Summary" table. */ static void means_case_processing_summary (const struct mtable *mt) { struct pivot_table *pt = pivot_table_create (N_("Case Processing Summary")); struct pivot_dimension *dim_cases = pivot_dimension_create (pt, PIVOT_AXIS_COLUMN, N_("Cases")); dim_cases->root->show_label = true; struct pivot_category *cats[3]; cats[0] = pivot_category_create_group (dim_cases->root, N_("Included"), NULL); cats[1] = pivot_category_create_group (dim_cases->root, N_("Excluded"), NULL); cats[2] = pivot_category_create_group (dim_cases->root, N_("Total"), NULL); for (int i = 0; i < 3; ++i) { pivot_category_create_leaf_rc (cats[i], pivot_value_new_text (N_("N")), PIVOT_RC_COUNT); pivot_category_create_leaf_rc (cats[i], pivot_value_new_text (N_("Percent")), PIVOT_RC_PERCENT); } struct pivot_dimension *rows = pivot_dimension_create (pt, PIVOT_AXIS_ROW, N_("Variables")); for (int cmb = 0; cmb < mt->n_combinations; ++cmb) { const struct workspace *ws = mt->ws + cmb; populate_case_processing_summary (rows->root, mt, ws->control_idx); for (int dv = 0; dv < mt->n_dep_vars; ++dv) { int idx = cmb * mt->n_dep_vars + dv; const struct summary *summ = mt->summ + idx; double n_included = summ->n_total - summ->n_missing; pivot_table_put2 (pt, 5, idx, pivot_value_new_number (100.0 * summ->n_total / summ->n_total)); pivot_table_put2 (pt, 4, idx, pivot_value_new_number (summ->n_total)); pivot_table_put2 (pt, 3, idx, pivot_value_new_number (100.0 * summ->n_missing / summ->n_total)); pivot_table_put2 (pt, 2, idx, pivot_value_new_number (summ->n_missing)); pivot_table_put2 (pt, 1, idx, pivot_value_new_number (100.0 * n_included / summ->n_total)); pivot_table_put2 (pt, 0, idx, pivot_value_new_number (n_included)); } } pivot_table_submit (pt); } static void means_shipout_single (const struct mtable *mt, const struct means *means, const struct workspace *ws) { struct pivot_table *pt = pivot_table_create (N_("Report")); pt->omit_empty = true; struct pivot_dimension *dim_cells = pivot_dimension_create (pt, PIVOT_AXIS_COLUMN, N_("Statistics")); /* Set the statistics headings, eg "Mean", "Std. Dev" etc. */ for (int i = 0; i < means->n_statistics; ++i) { const struct cell_spec *cs = cell_spec + means->statistics[i]; pivot_category_create_leaf_rc (dim_cells->root, pivot_value_new_text (gettext (cs->title)), cs->rc); } create_table_structure (mt, pt, ws); populate_table (means, mt, ws, ws->root_cell, pt); pivot_table_submit (pt); } static void means_shipout_multivar (const struct mtable *mt, const struct means *means, const struct workspace *ws) { struct string dss; ds_init_empty (&dss); for (int dv = 0; dv < mt->n_dep_vars; ++dv) { if (dv > 0) ds_put_cstr (&dss, " * "); ds_put_cstr (&dss, var_get_name (mt->dep_vars[dv])); } for (int l = 0; l < mt->n_layers; ++l) { ds_put_cstr (&dss, " * "); const struct layer *layer = mt->layers[l]; const struct variable *var = layer->factor_vars[ws->control_idx[l]]; ds_put_cstr (&dss, var_get_name (var)); } struct pivot_table *pt = pivot_table_create (ds_cstr (&dss)); pt->omit_empty = true; ds_destroy (&dss); struct pivot_dimension *dim_cells = pivot_dimension_create (pt, PIVOT_AXIS_COLUMN, N_("Variables")); for (int i = 0; i < mt->n_dep_vars; ++i) { pivot_category_create_leaf (dim_cells->root, pivot_value_new_variable (mt->dep_vars[i])); } struct pivot_dimension *dim_stats = pivot_dimension_create (pt, PIVOT_AXIS_ROW, N_ ("Statistics")); dim_stats->root->show_label = false; for (int i = 0; i < means->n_statistics; ++i) { const struct cell_spec *cs = cell_spec + means->statistics[i]; pivot_category_create_leaf_rc (dim_stats->root, pivot_value_new_text (gettext (cs->title)), cs->rc); } create_table_structure (mt, pt, ws); populate_table (means, mt, ws, ws->root_cell, pt); pivot_table_submit (pt); } static void means_shipout (const struct mtable *mt, const struct means *means) { for (int cmb = 0; cmb < mt->n_combinations; ++cmb) { const struct workspace *ws = mt->ws + cmb; if (ws->root_cell == NULL) { struct string des; ds_init_empty (&des); layers_to_string (mt, ws->control_idx, &des); msg (MW, _("The table \"%s\" has no non-empty control variables." " No result for this table will be displayed."), ds_cstr (&des)); ds_destroy (&des); continue; } if (mt->n_dep_vars > 1) means_shipout_multivar (mt, means, ws); else means_shipout_single (mt, means, ws); } } static bool control_var_missing (const struct means *means, const struct mtable *mt, unsigned int not_wild UNUSED, const struct ccase *c, const struct workspace *ws) { bool miss = false; for (int l = 0; l < mt->n_layers; ++l) { /* if (0 == ((not_wild >> l) & 0x1)) */ /* { */ /* continue; */ /* } */ const struct layer *layer = mt->layers[l]; const struct variable *var = layer->factor_vars[ws->control_idx[l]]; const union value *vv = case_data (c, var); miss = var_is_value_missing (var, vv, means->ctrl_exclude); if (miss) break; } return miss; } /* Lookup the set of control variables described by MT, C and NOT_WILD, in the hash table MAP. If there is no such entry, then create a cell with these paremeters and add is to MAP. If the generated cell has childen, repeat for all the children. Returns the root cell. */ static struct cell * service_cell_map (const struct means *means, const struct mtable *mt, const struct ccase *c, unsigned int not_wild, struct hmap *map, const struct cell *pcell, int level, const struct workspace *ws) { struct cell *cell = NULL; if (map) { if (!control_var_missing (means, mt, not_wild, c, ws)) { /* Lookup this set of values in the cell's hash table. */ unsigned int hash = generate_hash (mt, c, not_wild, ws); cell = lookup_cell (mt, map, hash, c, not_wild, ws); /* If it has not been seen before, then create a new subcell, with this set of values, and insert it into the table. */ if (cell == NULL) { cell = generate_cell (means, mt, c, not_wild, pcell, ws); hmap_insert (map, &cell->hmap_node, hash); } } } else { /* This condition should only happen in the root node case. */ cell = ws->root_cell; if (cell == NULL && !control_var_missing (means, mt, not_wild, c, ws)) cell = generate_cell (means, mt, c, not_wild, pcell, ws); } if (cell) { /* Here is where the business really happens! After testing for missing values, the cell's statistics are accumulated. */ if (!control_var_missing (means, mt, not_wild, c, ws)) { for (int v = 0; v < mt->n_dep_vars; ++v) { const struct variable *dep_var = mt->dep_vars[v]; const union value *vv = case_data (c, dep_var); if (var_is_value_missing (dep_var, vv, means->dep_exclude)) continue; for (int stat = 0; stat < means->n_statistics; ++stat) { const double weight = dict_get_case_weight (means->dict, c, NULL); stat_update *su = cell_spec[means->statistics[stat]].su; su (cell->stat[stat + v * means->n_statistics], weight, case_data (c, dep_var)->f); } } } /* Recurse into all the children (if there are any). */ for (int i = 0; i < cell->n_children; ++i) { struct cell_container *cc = cell->children + i; service_cell_map (means, mt, c, not_wild | (0x1U << (i + level)), &cc->map, cell, level + i + 1, ws); } } return cell; } /* Do all the necessary preparation and pre-calculation that needs to be done before iterating the data. */ static void prepare_means (struct means *cmd) { for (int t = 0; t < cmd->n_tables; ++t) { struct mtable *mt = cmd->table + t; for (int i = 0; i < mt->n_combinations; ++i) { struct workspace *ws = mt->ws + i; ws->root_cell = NULL; ws->control_idx = xzalloc (mt->n_layers * sizeof *ws->control_idx); ws->instances = xzalloc (mt->n_layers * sizeof *ws->instances); int cmb = i; for (int l = mt->n_layers - 1; l >= 0; --l) { struct cell_container *instances = ws->instances + l; const struct layer *layer = mt->layers[l]; ws->control_idx[l] = cmb % layer->n_factor_vars; cmb /= layer->n_factor_vars; hmap_init (&instances->map); } } } } /* Do all the necessary calculations that occur AFTER iterating the data. */ static void post_means (struct means *cmd) { for (int t = 0; t < cmd->n_tables; ++t) { struct mtable *mt = cmd->table + t; for (int cmb = 0; cmb < mt->n_combinations; ++cmb) { struct workspace *ws = mt->ws + cmb; if (ws->root_cell == NULL) continue; arrange_cells (ws, ws->root_cell, mt); /* The root cell should have no parent. */ assert (ws->root_cell->parent_cell == 0); for (int l = 0; l < mt->n_layers; ++l) { struct cell_container *instances = ws->instances + l; bt_init (&instances->bt, compare_instance_3way, NULL); /* Iterate the instance hash table, and insert each instance into the binary tree BT. */ struct instance *inst; HMAP_FOR_EACH (inst, struct instance, hmap_node, &instances->map) { bt_insert (&instances->bt, &inst->bt_node); } /* Iterate the binary tree (in order) and assign the index member accordingly. */ int index = 0; BT_FOR_EACH (inst, struct instance, bt_node, &instances->bt) { inst->index = index++; } } } } } /* Update the summary information (the missings and the totals). */ static void update_summaries (const struct means *means, struct mtable *mt, const struct ccase *c, double weight) { for (int dv = 0; dv < mt->n_dep_vars; ++dv) { for (int cmb = 0; cmb < mt->n_combinations; ++cmb) { struct workspace *ws = mt->ws + cmb; struct summary *summ = mt->summ + cmb * mt->n_dep_vars + dv; summ->n_total += weight; const struct variable *var = mt->dep_vars[dv]; const union value *vv = case_data (c, var); /* First check if the dependent variable is missing. */ if (var_is_value_missing (var, vv, means->dep_exclude)) summ->n_missing += weight; /* If the dep var is not missing, then check each control variable. */ else for (int l = 0; l < mt->n_layers; ++l) { const struct layer *layer = mt->layers [l]; const struct variable *var = layer->factor_vars[ws->control_idx[l]]; const union value *vv = case_data (c, var); if (var_is_value_missing (var, vv, means->ctrl_exclude)) { summ->n_missing += weight; break; } } } } } void run_means (struct means *cmd, struct casereader *input, const struct dataset *ds UNUSED) { struct ccase *c = NULL; struct casereader *reader; prepare_means (cmd); for (reader = input; (c = casereader_read (reader)) != NULL; case_unref (c)) { const double weight = dict_get_case_weight (cmd->dict, c, NULL); for (int t = 0; t < cmd->n_tables; ++t) { struct mtable *mt = cmd->table + t; update_summaries (cmd, mt, c, weight); for (int cmb = 0; cmb < mt->n_combinations; ++cmb) { struct workspace *ws = mt->ws + cmb; ws->root_cell = service_cell_map (cmd, mt, c, 0U, NULL, NULL, 0, ws); } } } casereader_destroy (reader); post_means (cmd); } struct lexer; int cmd_means (struct lexer *lexer, struct dataset *ds) { struct means means; means.pool = pool_create (); means.ctrl_exclude = MV_ANY; means.dep_exclude = MV_ANY; means.table = NULL; means.n_tables = 0; means.dict = dataset_dict (ds); means.n_statistics = 3; means.statistics = pool_calloc (means.pool, 3, sizeof *means.statistics); means.statistics[0] = MEANS_MEAN; means.statistics[1] = MEANS_N; means.statistics[2] = MEANS_STDDEV; if (! means_parse (lexer, &means)) goto error; /* Calculate some constant data for each table. */ for (int t = 0; t < means.n_tables; ++t) { struct mtable *mt = means.table + t; mt->n_combinations = 1; for (int l = 0; l < mt->n_layers; ++l) mt->n_combinations *= mt->layers[l]->n_factor_vars; } { struct casegrouper *grouper; struct casereader *group; bool ok; grouper = casegrouper_create_splits (proc_open (ds), means.dict); while (casegrouper_get_next_group (grouper, &group)) { /* Allocate the workspaces. */ for (int t = 0; t < means.n_tables; ++t) { struct mtable *mt = means.table + t; mt->summ = xzalloc (mt->n_combinations * mt->n_dep_vars * sizeof (*mt->summ)); mt->ws = xzalloc (mt->n_combinations * sizeof (*mt->ws)); } run_means (&means, group, ds); for (int t = 0; t < means.n_tables; ++t) { const struct mtable *mt = means.table + t; means_case_processing_summary (mt); means_shipout (mt, &means); for (int i = 0; i < mt->n_combinations; ++i) { struct workspace *ws = mt->ws + i; if (ws->root_cell == NULL) continue; means_destroy_cells (&means, ws->root_cell, mt); } } /* Destroy the workspaces. */ for (int t = 0; t < means.n_tables; ++t) { struct mtable *mt = means.table + t; free (mt->summ); for (int i = 0; i < mt->n_combinations; ++i) { struct workspace *ws = mt->ws + i; destroy_workspace (mt, ws); } free (mt->ws); } } ok = casegrouper_destroy (grouper); ok = proc_commit (ds) && ok; } pool_destroy (means.pool); return CMD_SUCCESS; error: pool_destroy (means.pool); return CMD_FAILURE; } pspp-1.4.1/src/language/stats/regression.c0000644000175000017500000007525613673465023020177 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2005, 2009, 2010, 2011, 2012, 2013, 2014, 2016, 2017, 2019 Free Software Foundation, Inc. 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 3 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, see . */ #include #include #include #include #include #include #include #include #include "language/command.h" #include "language/lexer/lexer.h" #include "language/lexer/value-parser.h" #include "language/lexer/variable-parser.h" #include "data/casegrouper.h" #include "data/casereader.h" #include "data/dictionary.h" #include "math/covariance.h" #include "math/linreg.h" #include "math/moments.h" #include "libpspp/message.h" #include "libpspp/taint.h" #include "output/pivot-table.h" #include "gl/intprops.h" #include "gl/minmax.h" #include "gettext.h" #define _(msgid) gettext (msgid) #define N_(msgid) msgid #define STATS_R 1 #define STATS_COEFF 2 #define STATS_ANOVA 4 #define STATS_OUTS 8 #define STATS_CI 16 #define STATS_BCOV 32 #define STATS_TOL 64 #define STATS_DEFAULT (STATS_R | STATS_COEFF | STATS_ANOVA | STATS_OUTS) struct regression { struct dataset *ds; const struct variable **vars; size_t n_vars; const struct variable **dep_vars; size_t n_dep_vars; unsigned int stats; double ci; bool resid; bool pred; bool origin; }; struct regression_workspace { /* The new variables which will be introduced by /SAVE */ const struct variable **predvars; const struct variable **residvars; /* A reader/writer pair to temporarily hold the values of the new variables */ struct casewriter *writer; struct casereader *reader; /* Indeces of the new values in the reader/writer (-1 if not applicable) */ int res_idx; int pred_idx; /* 0, 1 or 2 depending on what new variables are to be created */ int extras; }; static void run_regression (const struct regression *cmd, struct regression_workspace *ws, struct casereader *input); /* Return a string based on PREFIX which may be used as the name of a new variable in DICT */ static char * reg_get_name (const struct dictionary *dict, const char *prefix) { char *name; int i; /* XXX handle too-long prefixes */ name = xmalloc (strlen (prefix) + INT_BUFSIZE_BOUND (i) + 1); for (i = 1;; i++) { sprintf (name, "%s%d", prefix, i); if (dict_lookup_var (dict, name) == NULL) return name; } } static const struct variable * create_aux_var (struct dataset *ds, const char *prefix) { struct variable *var; struct dictionary *dict = dataset_dict (ds); char *name = reg_get_name (dict, prefix); var = dict_create_var_assert (dict, name, 0); free (name); return var; } /* Auxiliary data for transformation when /SAVE is entered */ struct save_trans_data { int n_dep_vars; struct regression_workspace *ws; }; static bool save_trans_free (void *aux) { struct save_trans_data *save_trans_data = aux; free (save_trans_data->ws->predvars); free (save_trans_data->ws->residvars); casereader_destroy (save_trans_data->ws->reader); free (save_trans_data->ws); free (save_trans_data); return true; } static int save_trans_func (void *aux, struct ccase **c, casenumber x UNUSED) { struct save_trans_data *save_trans_data = aux; struct regression_workspace *ws = save_trans_data->ws; struct ccase *in = casereader_read (ws->reader); if (in) { int k; *c = case_unshare (*c); for (k = 0; k < save_trans_data->n_dep_vars; ++k) { if (ws->pred_idx != -1) { double pred = case_data_idx (in, ws->extras * k + ws->pred_idx)->f; case_data_rw (*c, ws->predvars[k])->f = pred; } if (ws->res_idx != -1) { double resid = case_data_idx (in, ws->extras * k + ws->res_idx)->f; case_data_rw (*c, ws->residvars[k])->f = resid; } } case_unref (in); } return TRNS_CONTINUE; } int cmd_regression (struct lexer *lexer, struct dataset *ds) { struct regression_workspace workspace; struct regression regression; const struct dictionary *dict = dataset_dict (ds); bool save; memset (®ression, 0, sizeof (struct regression)); regression.ci = 0.95; regression.stats = STATS_DEFAULT; regression.pred = false; regression.resid = false; regression.ds = ds; regression.origin = false; bool variables_seen = false; bool method_seen = false; bool dependent_seen = false; while (lex_token (lexer) != T_ENDCMD) { lex_match (lexer, T_SLASH); if (lex_match_id (lexer, "VARIABLES")) { if (method_seen) { msg (SE, _("VARIABLES may not appear after %s"), "METHOD"); goto error; } if (dependent_seen) { msg (SE, _("VARIABLES may not appear after %s"), "DEPENDENT"); goto error; } variables_seen = true; lex_match (lexer, T_EQUALS); if (!parse_variables_const (lexer, dict, ®ression.vars, ®ression.n_vars, PV_NO_DUPLICATE | PV_NUMERIC)) goto error; } else if (lex_match_id (lexer, "DEPENDENT")) { dependent_seen = true; lex_match (lexer, T_EQUALS); free (regression.dep_vars); regression.n_dep_vars = 0; if (!parse_variables_const (lexer, dict, ®ression.dep_vars, ®ression.n_dep_vars, PV_NO_DUPLICATE | PV_NUMERIC)) goto error; } else if (lex_match_id (lexer, "ORIGIN")) { regression.origin = true; } else if (lex_match_id (lexer, "NOORIGIN")) { regression.origin = false; } else if (lex_match_id (lexer, "METHOD")) { method_seen = true; lex_match (lexer, T_EQUALS); if (!lex_force_match_id (lexer, "ENTER")) { goto error; } if (! variables_seen) { if (!parse_variables_const (lexer, dict, ®ression.vars, ®ression.n_vars, PV_NO_DUPLICATE | PV_NUMERIC)) goto error; } } else if (lex_match_id (lexer, "STATISTICS")) { unsigned long statistics = 0; lex_match (lexer, T_EQUALS); while (lex_token (lexer) != T_ENDCMD && lex_token (lexer) != T_SLASH) { if (lex_match (lexer, T_ALL)) { statistics = ~0; } else if (lex_match_id (lexer, "DEFAULTS")) { statistics |= STATS_DEFAULT; } else if (lex_match_id (lexer, "R")) { statistics |= STATS_R; } else if (lex_match_id (lexer, "COEFF")) { statistics |= STATS_COEFF; } else if (lex_match_id (lexer, "ANOVA")) { statistics |= STATS_ANOVA; } else if (lex_match_id (lexer, "BCOV")) { statistics |= STATS_BCOV; } else if (lex_match_id (lexer, "TOL")) { statistics |= STATS_TOL; } else if (lex_match_id (lexer, "CI")) { statistics |= STATS_CI; if (lex_match (lexer, T_LPAREN) && lex_force_num (lexer)) { regression.ci = lex_number (lexer) / 100.0; lex_get (lexer); if (! lex_force_match (lexer, T_RPAREN)) goto error; } } else { lex_error (lexer, NULL); goto error; } } if (statistics) regression.stats = statistics; } else if (lex_match_id (lexer, "SAVE")) { lex_match (lexer, T_EQUALS); while (lex_token (lexer) != T_ENDCMD && lex_token (lexer) != T_SLASH) { if (lex_match_id (lexer, "PRED")) { regression.pred = true; } else if (lex_match_id (lexer, "RESID")) { regression.resid = true; } else { lex_error (lexer, NULL); goto error; } } } else { lex_error (lexer, NULL); goto error; } } if (!regression.vars) { dict_get_vars (dict, ®ression.vars, ®ression.n_vars, 0); } save = regression.pred || regression.resid; workspace.extras = 0; workspace.res_idx = -1; workspace.pred_idx = -1; workspace.writer = NULL; workspace.reader = NULL; workspace.residvars = NULL; workspace.predvars = NULL; if (save) { int i; struct caseproto *proto = caseproto_create (); if (regression.resid) { workspace.res_idx = workspace.extras ++; workspace.residvars = xcalloc (regression.n_dep_vars, sizeof (*workspace.residvars)); for (i = 0; i < regression.n_dep_vars; ++i) { workspace.residvars[i] = create_aux_var (ds, "RES"); proto = caseproto_add_width (proto, 0); } } if (regression.pred) { workspace.pred_idx = workspace.extras ++; workspace.predvars = xcalloc (regression.n_dep_vars, sizeof (*workspace.predvars)); for (i = 0; i < regression.n_dep_vars; ++i) { workspace.predvars[i] = create_aux_var (ds, "PRED"); proto = caseproto_add_width (proto, 0); } } if (proc_make_temporary_transformations_permanent (ds)) msg (SW, _("REGRESSION with SAVE ignores TEMPORARY. " "Temporary transformations will be made permanent.")); if (dict_get_filter (dict)) msg (SW, _("REGRESSION with SAVE ignores FILTER. " "All cases will be processed.")); workspace.writer = autopaging_writer_create (proto); caseproto_unref (proto); } { struct casegrouper *grouper; struct casereader *group; bool ok; grouper = casegrouper_create_splits (proc_open_filtering (ds, !save), dict); while (casegrouper_get_next_group (grouper, &group)) { run_regression (®ression, &workspace, group); } ok = casegrouper_destroy (grouper); ok = proc_commit (ds) && ok; } if (workspace.writer) { struct save_trans_data *save_trans_data = xmalloc (sizeof *save_trans_data); struct casereader *r = casewriter_make_reader (workspace.writer); workspace.writer = NULL; workspace.reader = r; save_trans_data->ws = xmalloc (sizeof (workspace)); memcpy (save_trans_data->ws, &workspace, sizeof (workspace)); save_trans_data->n_dep_vars = regression.n_dep_vars; add_transformation (ds, save_trans_func, save_trans_free, save_trans_data); } free (regression.vars); free (regression.dep_vars); return CMD_SUCCESS; error: free (regression.vars); free (regression.dep_vars); return CMD_FAILURE; } /* Return the size of the union of dependent and independent variables */ static size_t get_n_all_vars (const struct regression *cmd) { size_t result = cmd->n_vars; size_t i; size_t j; result += cmd->n_dep_vars; for (i = 0; i < cmd->n_dep_vars; i++) { for (j = 0; j < cmd->n_vars; j++) { if (cmd->vars[j] == cmd->dep_vars[i]) { result--; } } } return result; } /* Fill VARS with the union of dependent and independent variables */ static void fill_all_vars (const struct variable **vars, const struct regression *cmd) { size_t x = 0; size_t i; for (i = 0; i < cmd->n_vars; i++) { vars[i] = cmd->vars[i]; } for (i = 0; i < cmd->n_dep_vars; i++) { size_t j; bool absent = true; for (j = 0; j < cmd->n_vars; j++) { if (cmd->dep_vars[i] == cmd->vars[j]) { absent = false; break; } } if (absent) { vars[cmd->n_vars + x++] = cmd->dep_vars[i]; } } } /* Fill the array VARS, with all the predictor variables from CMD, except variable X */ static void fill_predictor_x (const struct variable **vars, const struct variable *x, const struct regression *cmd) { size_t i; size_t n = 0; for (i = 0; i < cmd->n_vars; i++) { if (cmd->vars[i] == x) continue; vars[n++] = cmd->vars[i]; } } /* Is variable k the dependent variable? */ static bool is_depvar (const struct regression *cmd, size_t k, const struct variable *v) { return v == cmd->vars[k]; } /* Identify the explanatory variables in v_variables. Returns the number of independent variables. */ static int identify_indep_vars (const struct regression *cmd, const struct variable **indep_vars, const struct variable *depvar) { int n_indep_vars = 0; int i; for (i = 0; i < cmd->n_vars; i++) if (!is_depvar (cmd, i, depvar)) indep_vars[n_indep_vars++] = cmd->vars[i]; if ((n_indep_vars < 1) && is_depvar (cmd, 0, depvar)) { /* There is only one independent variable, and it is the same as the dependent variable. Print a warning and continue. */ msg (SW, gettext ("The dependent variable is equal to the independent variable. " "The least squares line is therefore Y=X. " "Standard errors and related statistics may be meaningless.")); n_indep_vars = 1; indep_vars[0] = cmd->vars[0]; } return n_indep_vars; } static double fill_covariance (gsl_matrix * cov, struct covariance *all_cov, const struct variable **vars, size_t n_vars, const struct variable *dep_var, const struct variable **all_vars, size_t n_all_vars, double *means) { size_t i; size_t j; size_t dep_subscript = SIZE_MAX; size_t *rows; const gsl_matrix *ssizes; const gsl_matrix *mean_matrix; const gsl_matrix *ssize_matrix; double result = 0.0; const gsl_matrix *cm = covariance_calculate_unnormalized (all_cov); if (cm == NULL) return 0; rows = xnmalloc (cov->size1 - 1, sizeof (*rows)); for (i = 0; i < n_all_vars; i++) { for (j = 0; j < n_vars; j++) { if (vars[j] == all_vars[i]) { rows[j] = i; } } if (all_vars[i] == dep_var) { dep_subscript = i; } } assert (dep_subscript != SIZE_MAX); mean_matrix = covariance_moments (all_cov, MOMENT_MEAN); ssize_matrix = covariance_moments (all_cov, MOMENT_NONE); for (i = 0; i < cov->size1 - 1; i++) { means[i] = gsl_matrix_get (mean_matrix, rows[i], 0) / gsl_matrix_get (ssize_matrix, rows[i], 0); for (j = 0; j < cov->size2 - 1; j++) { gsl_matrix_set (cov, i, j, gsl_matrix_get (cm, rows[i], rows[j])); gsl_matrix_set (cov, j, i, gsl_matrix_get (cm, rows[j], rows[i])); } } means[cov->size1 - 1] = gsl_matrix_get (mean_matrix, dep_subscript, 0) / gsl_matrix_get (ssize_matrix, dep_subscript, 0); ssizes = covariance_moments (all_cov, MOMENT_NONE); result = gsl_matrix_get (ssizes, dep_subscript, rows[0]); for (i = 0; i < cov->size1 - 1; i++) { gsl_matrix_set (cov, i, cov->size1 - 1, gsl_matrix_get (cm, rows[i], dep_subscript)); gsl_matrix_set (cov, cov->size1 - 1, i, gsl_matrix_get (cm, rows[i], dep_subscript)); if (result > gsl_matrix_get (ssizes, rows[i], dep_subscript)) { result = gsl_matrix_get (ssizes, rows[i], dep_subscript); } } gsl_matrix_set (cov, cov->size1 - 1, cov->size1 - 1, gsl_matrix_get (cm, dep_subscript, dep_subscript)); free (rows); return result; } struct model_container { struct linreg **models; }; /* STATISTICS subcommand output functions. */ static void reg_stats_r (const struct linreg *, const struct variable *); static void reg_stats_coeff (const struct regression *, const struct linreg *, const struct model_container *, const gsl_matrix *, const struct variable *); static void reg_stats_anova (const struct linreg *, const struct variable *); static void reg_stats_bcov (const struct linreg *, const struct variable *); static struct linreg ** run_regression_get_models (const struct regression *cmd, struct casereader *input, bool output) { size_t i; struct linreg **models = NULL; struct model_container *model_container = xzalloc (sizeof (*model_container) * cmd->n_vars); struct ccase *c; struct covariance *cov; struct casereader *reader; if (cmd->stats & STATS_TOL) { for (i = 0; i < cmd->n_vars; i++) { struct regression subreg; subreg.origin = cmd->origin; subreg.ds = cmd->ds; subreg.n_vars = cmd->n_vars - 1; subreg.n_dep_vars = 1; subreg.vars = xmalloc (sizeof (*subreg.vars) * cmd->n_vars - 1); subreg.dep_vars = xmalloc (sizeof (*subreg.dep_vars)); fill_predictor_x (subreg.vars, cmd->vars[i], cmd); subreg.dep_vars[0] = cmd->vars[i]; subreg.stats = STATS_R; subreg.ci = 0; subreg.resid = false; subreg.pred = false; model_container[i].models = run_regression_get_models (&subreg, input, false); free (subreg.vars); free (subreg.dep_vars); } } size_t n_all_vars = get_n_all_vars (cmd); const struct variable **all_vars = xnmalloc (n_all_vars, sizeof (*all_vars)); /* In the (rather pointless) case where the dependent variable is the independent variable, n_all_vars == 1. However this would result in a buffer overflow so we must over-allocate the space required in this malloc call. See bug #58599 */ double *means = xnmalloc (n_all_vars <= 1 ? 2 : n_all_vars, sizeof (*means)); fill_all_vars (all_vars, cmd); cov = covariance_1pass_create (n_all_vars, all_vars, dict_get_weight (dataset_dict (cmd->ds)), MV_ANY, cmd->origin == false); reader = casereader_clone (input); reader = casereader_create_filter_missing (reader, all_vars, n_all_vars, MV_ANY, NULL, NULL); { struct casereader *r = casereader_clone (reader); for (; (c = casereader_read (r)) != NULL; case_unref (c)) { covariance_accumulate (cov, c); } casereader_destroy (r); } models = xcalloc (cmd->n_dep_vars, sizeof (*models)); for (int k = 0; k < cmd->n_dep_vars; k++) { const struct variable **vars = xnmalloc (cmd->n_vars, sizeof (*vars)); const struct variable *dep_var = cmd->dep_vars[k]; int n_indep = identify_indep_vars (cmd, vars, dep_var); gsl_matrix *cov_matrix = gsl_matrix_alloc (n_indep + 1, n_indep + 1); double n_data = fill_covariance (cov_matrix, cov, vars, n_indep, dep_var, all_vars, n_all_vars, means); models[k] = linreg_alloc (dep_var, vars, n_data, n_indep, cmd->origin); for (i = 0; i < n_indep; i++) { linreg_set_indep_variable_mean (models[k], i, means[i]); } linreg_set_depvar_mean (models[k], means[i]); if (n_data > 0) { linreg_fit (cov_matrix, models[k]); if (output && !taint_has_tainted_successor (casereader_get_taint (input))) { /* Find the least-squares estimates and other statistics. */ if (cmd->stats & STATS_R) reg_stats_r (models[k], dep_var); if (cmd->stats & STATS_ANOVA) reg_stats_anova (models[k], dep_var); if (cmd->stats & STATS_COEFF) reg_stats_coeff (cmd, models[k], model_container, cov_matrix, dep_var); if (cmd->stats & STATS_BCOV) reg_stats_bcov (models[k], dep_var); } } else { msg (SE, _("No valid data found. This command was skipped.")); } free (vars); gsl_matrix_free (cov_matrix); } casereader_destroy (reader); for (int i = 0; i < cmd->n_vars; i++) { if (model_container[i].models) { linreg_unref (model_container[i].models[0]); } free (model_container[i].models); } free (model_container); free (all_vars); free (means); covariance_destroy (cov); return models; } static void run_regression (const struct regression *cmd, struct regression_workspace *ws, struct casereader *input) { struct linreg **models = run_regression_get_models (cmd, input, true); if (ws->extras > 0) { struct ccase *c; struct casereader *r = casereader_clone (input); for (; (c = casereader_read (r)) != NULL; case_unref (c)) { struct ccase *outc = case_create (casewriter_get_proto (ws->writer)); for (int k = 0; k < cmd->n_dep_vars; k++) { const struct variable **vars = xnmalloc (cmd->n_vars, sizeof (*vars)); const struct variable *dep_var = cmd->dep_vars[k]; int n_indep = identify_indep_vars (cmd, vars, dep_var); double *vals = xnmalloc (n_indep, sizeof (*vals)); for (int i = 0; i < n_indep; i++) { const union value *tmp = case_data (c, vars[i]); vals[i] = tmp->f; } if (cmd->pred) { double pred = linreg_predict (models[k], vals, n_indep); case_data_rw_idx (outc, k * ws->extras + ws->pred_idx)->f = pred; } if (cmd->resid) { double obs = case_data (c, linreg_dep_var (models[k]))->f; double res = linreg_residual (models[k], obs, vals, n_indep); case_data_rw_idx (outc, k * ws->extras + ws->res_idx)->f = res; } free (vals); free (vars); } casewriter_write (ws->writer, outc); } casereader_destroy (r); } for (int k = 0; k < cmd->n_dep_vars; k++) { linreg_unref (models[k]); } free (models); casereader_destroy (input); } static void reg_stats_r (const struct linreg * c, const struct variable *var) { struct pivot_table *table = pivot_table_create__ ( pivot_value_new_text_format (N_("Model Summary (%s)"), var_to_string (var)), "Model Summary"); pivot_dimension_create (table, PIVOT_AXIS_COLUMN, N_("Statistics"), N_("R"), N_("R Square"), N_("Adjusted R Square"), N_("Std. Error of the Estimate")); double rsq = linreg_ssreg (c) / linreg_sst (c); double adjrsq = (rsq - (1.0 - rsq) * linreg_n_coeffs (c) / (linreg_n_obs (c) - linreg_n_coeffs (c) - 1)); double std_error = sqrt (linreg_mse (c)); double entries[] = { sqrt (rsq), rsq, adjrsq, std_error }; for (size_t i = 0; i < sizeof entries / sizeof *entries; i++) pivot_table_put1 (table, i, pivot_value_new_number (entries[i])); pivot_table_submit (table); } /* Table showing estimated regression coefficients. */ static void reg_stats_coeff (const struct regression *cmd, const struct linreg *c, const struct model_container *mc, const gsl_matrix *cov, const struct variable *var) { struct pivot_table *table = pivot_table_create__ ( pivot_value_new_text_format (N_("Coefficients (%s)"), var_to_string (var)), "Coefficients"); struct pivot_dimension *statistics = pivot_dimension_create ( table, PIVOT_AXIS_COLUMN, N_("Statistics")); pivot_category_create_group (statistics->root, N_("Unstandardized Coefficients"), N_("B"), N_("Std. Error")); pivot_category_create_group (statistics->root, N_("Standardized Coefficients"), N_("Beta")); pivot_category_create_leaves (statistics->root, N_("t"), N_("Sig."), PIVOT_RC_SIGNIFICANCE); if (cmd->stats & STATS_CI) { struct pivot_category *interval = pivot_category_create_group__ ( statistics->root, pivot_value_new_text_format ( N_("%g%% Confidence Interval for B"), cmd->ci * 100.0)); pivot_category_create_leaves (interval, N_("Lower Bound"), N_("Upper Bound")); } if (cmd->stats & STATS_TOL) pivot_category_create_group (statistics->root, N_("Collinearity Statistics"), N_("Tolerance"), N_("VIF")); struct pivot_dimension *variables = pivot_dimension_create ( table, PIVOT_AXIS_ROW, N_("Variables")); double df = linreg_n_obs (c) - linreg_n_coeffs (c) - 1; double q = (1 - cmd->ci) / 2.0; /* 2-tailed test */ double tval = gsl_cdf_tdist_Qinv (q, df); if (!cmd->origin) { int var_idx = pivot_category_create_leaf ( variables->root, pivot_value_new_text (N_("(Constant)"))); double std_err = sqrt (gsl_matrix_get (linreg_cov (c), 0, 0)); double t_stat = linreg_intercept (c) / std_err; double base_entries[] = { linreg_intercept (c), std_err, 0.0, t_stat, 2.0 * gsl_cdf_tdist_Q (fabs (t_stat), linreg_n_obs (c) - linreg_n_coeffs (c)), }; size_t col = 0; for (size_t i = 0; i < sizeof base_entries / sizeof *base_entries; i++) pivot_table_put2 (table, col++, var_idx, pivot_value_new_number (base_entries[i])); if (cmd->stats & STATS_CI) { double interval_entries[] = { linreg_intercept (c) - tval * std_err, linreg_intercept (c) + tval * std_err, }; for (size_t i = 0; i < sizeof interval_entries / sizeof *interval_entries; i++) pivot_table_put2 (table, col++, var_idx, pivot_value_new_number (interval_entries[i])); } } for (size_t j = 0; j < linreg_n_coeffs (c); j++) { const struct variable *v = linreg_indep_var (c, j); int var_idx = pivot_category_create_leaf ( variables->root, pivot_value_new_variable (v)); double std_err = sqrt (gsl_matrix_get (linreg_cov (c), j + 1, j + 1)); double t_stat = linreg_coeff (c, j) / std_err; double base_entries[] = { linreg_coeff (c, j), sqrt (gsl_matrix_get (linreg_cov (c), j + 1, j + 1)), (sqrt (gsl_matrix_get (cov, j, j)) * linreg_coeff (c, j) / sqrt (gsl_matrix_get (cov, cov->size1 - 1, cov->size2 - 1))), t_stat, 2 * gsl_cdf_tdist_Q (fabs (t_stat), df) }; size_t col = 0; for (size_t i = 0; i < sizeof base_entries / sizeof *base_entries; i++) pivot_table_put2 (table, col++, var_idx, pivot_value_new_number (base_entries[i])); if (cmd->stats & STATS_CI) { double interval_entries[] = { linreg_coeff (c, j) - tval * std_err, linreg_coeff (c, j) + tval * std_err, }; for (size_t i = 0; i < sizeof interval_entries / sizeof *interval_entries; i++) pivot_table_put2 (table, col++, var_idx, pivot_value_new_number (interval_entries[i])); } if (cmd->stats & STATS_TOL) { { struct linreg *m = mc[j].models[0]; double rsq = linreg_ssreg (m) / linreg_sst (m); pivot_table_put2 (table, col++, var_idx, pivot_value_new_number (1.0 - rsq)); pivot_table_put2 (table, col++, var_idx, pivot_value_new_number (1.0 / (1.0 - rsq))); } } } pivot_table_submit (table); } /* Display the ANOVA table. */ static void reg_stats_anova (const struct linreg * c, const struct variable *var) { struct pivot_table *table = pivot_table_create__ ( pivot_value_new_text_format (N_("ANOVA (%s)"), var_to_string (var)), "ANOVA"); pivot_dimension_create (table, PIVOT_AXIS_COLUMN, N_("Statistics"), N_("Sum of Squares"), PIVOT_RC_OTHER, N_("df"), PIVOT_RC_INTEGER, N_("Mean Square"), PIVOT_RC_OTHER, N_("F"), PIVOT_RC_OTHER, N_("Sig."), PIVOT_RC_SIGNIFICANCE); pivot_dimension_create (table, PIVOT_AXIS_ROW, N_("Source"), N_("Regression"), N_("Residual"), N_("Total")); double msm = linreg_ssreg (c) / linreg_dfmodel (c); double mse = linreg_mse (c); double F = msm / mse; struct entry { int stat_idx; int source_idx; double x; } entries[] = { /* Sums of Squares. */ { 0, 0, linreg_ssreg (c) }, { 0, 1, linreg_sse (c) }, { 0, 2, linreg_sst (c) }, /* Degrees of freedom. */ { 1, 0, linreg_dfmodel (c) }, { 1, 1, linreg_dferror (c) }, { 1, 2, linreg_dftotal (c) }, /* Mean Squares. */ { 2, 0, msm }, { 2, 1, mse }, /* F */ { 3, 0, F }, /* Significance. */ { 4, 0, gsl_cdf_fdist_Q (F, linreg_dfmodel (c), linreg_dferror (c)) }, }; for (size_t i = 0; i < sizeof entries / sizeof *entries; i++) { const struct entry *e = &entries[i]; pivot_table_put2 (table, e->stat_idx, e->source_idx, pivot_value_new_number (e->x)); } pivot_table_submit (table); } static void reg_stats_bcov (const struct linreg * c, const struct variable *var) { struct pivot_table *table = pivot_table_create__ ( pivot_value_new_text_format (N_("Coefficient Correlations (%s)"), var_to_string (var)), "Coefficient Correlations"); for (size_t i = 0; i < 2; i++) { struct pivot_dimension *models = pivot_dimension_create ( table, i ? PIVOT_AXIS_ROW : PIVOT_AXIS_COLUMN, N_("Models")); for (size_t j = 0; j < linreg_n_coeffs (c); j++) pivot_category_create_leaf ( models->root, pivot_value_new_variable ( linreg_indep_var (c, j))); } pivot_dimension_create (table, PIVOT_AXIS_ROW, N_("Statistics"), N_("Covariances")); for (size_t i = 0; i < linreg_n_coeffs (c); i++) for (size_t k = 0; k < linreg_n_coeffs (c); k++) { double cov = gsl_matrix_get (linreg_cov (c), MIN (i, k), MAX (i, k)); pivot_table_put3 (table, k, i, 0, pivot_value_new_number (cov)); } pivot_table_submit (table); } pspp-1.4.1/src/language/stats/roc.h0000644000175000017500000000202313320146056016554 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2009 Free Software Foundation, Inc. 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 3 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, see . */ #ifndef LANGUAGE_STATS_ROC_H #define LANGUAGE_STATS_ROC_H 1 /* These are case indexes into the cutpoint case readers for ROC output, used by roc.c and roc-chart.c. */ #define ROC_CUTPOINT 0 #define ROC_TP 1 #define ROC_FN 2 #define ROC_TN 3 #define ROC_FP 4 #endif /* language/stats/roc.h */ pspp-1.4.1/src/language/stats/mcnemar.h0000644000175000017500000000206713320146056017423 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2011 Free Software Foundation, Inc. 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 3 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, see . */ #if !mcnemar_h #define mcnemar_h 1 #include #include "data/missing-values.h" struct casereader; struct dataset; struct npar_test; void mcnemar_execute (const struct dataset *ds, struct casereader *input, enum mv_class exclude, const struct npar_test *test, bool exact, double timer); #endif pspp-1.4.1/src/language/stats/rank.c0000644000175000017500000007050413670210420016723 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2005, 2006, 2007, 2009, 2010, 2011, 2012, 2013, 2014, 2016 Free Software Foundation, Inc 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 3 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, see . */ #include #include #include #include "data/case.h" #include "data/casegrouper.h" #include "data/casereader.h" #include "data/dataset.h" #include "data/dictionary.h" #include "data/format.h" #include "data/variable.h" #include "data/subcase.h" #include "data/casewriter.h" #include "data/short-names.h" #include "language/command.h" #include "language/lexer/lexer.h" #include "language/lexer/variable-parser.h" #include "language/stats/sort-criteria.h" #include "math/sort.h" #include "libpspp/assertion.h" #include "libpspp/i18n.h" #include "libpspp/message.h" #include "libpspp/misc.h" #include "libpspp/pool.h" #include "libpspp/string-set.h" #include "libpspp/taint.h" #include "output/pivot-table.h" #include "gettext.h" #define _(msgid) gettext (msgid) #define N_(msgid) (msgid) struct rank; typedef double (*rank_function_t) (const struct rank*, double c, double cc, double cc_1, int i, double w); static double rank_proportion (const struct rank *, double c, double cc, double cc_1, int i, double w); static double rank_normal (const struct rank *, double c, double cc, double cc_1, int i, double w); static double rank_percent (const struct rank *, double c, double cc, double cc_1, int i, double w); static double rank_rfraction (const struct rank *, double c, double cc, double cc_1, int i, double w); static double rank_rank (const struct rank *, double c, double cc, double cc_1, int i, double w); static double rank_n (const struct rank *, double c, double cc, double cc_1, int i, double w); static double rank_savage (const struct rank *, double c, double cc, double cc_1, int i, double w); static double rank_ntiles (const struct rank *, double c, double cc, double cc_1, int i, double w); enum rank_func { RANK, NORMAL, PERCENT, RFRACTION, PROPORTION, N, NTILES, SAVAGE, n_RANK_FUNCS }; static const struct fmt_spec dest_format[n_RANK_FUNCS] = { {FMT_F, 9, 3}, /* rank */ {FMT_F, 6, 4}, /* normal */ {FMT_F, 6, 2}, /* percent */ {FMT_F, 6, 4}, /* rfraction */ {FMT_F, 6, 4}, /* proportion */ {FMT_F, 6, 0}, /* n */ {FMT_F, 3, 0}, /* ntiles */ {FMT_F, 8, 4} /* savage */ }; static const char * const function_name[n_RANK_FUNCS] = { "RANK", "NORMAL", "PERCENT", "RFRACTION", "PROPORTION", "N", "NTILES", "SAVAGE" }; static const rank_function_t rank_func[n_RANK_FUNCS] = { rank_rank, rank_normal, rank_percent, rank_rfraction, rank_proportion, rank_n, rank_ntiles, rank_savage }; enum ties { TIES_LOW, TIES_HIGH, TIES_MEAN, TIES_CONDENSE }; enum fraction { FRAC_BLOM, FRAC_RANKIT, FRAC_TUKEY, FRAC_VW }; struct rank_spec { enum rank_func rfunc; const char **dest_names; const char **dest_labels; }; /* If NEW_NAME exists in DICT or NEW_NAMES, returns NULL without changing anything. Otherwise, inserts NEW_NAME in NEW_NAMES and returns the copy of NEW_NAME now in NEW_NAMES. */ static const char * try_new_name (const char *new_name, const struct dictionary *dict, struct string_set *new_names) { return (!dict_lookup_var (dict, new_name) && string_set_insert (new_names, new_name) ? string_set_find_node (new_names, new_name)->string : NULL); } /* Returns a variable name for storing ranks of a variable named SRC_NAME according to the rank function F. The name chosen will not be one already in DICT or NEW_NAMES. If successful, adds the new name to NEW_NAMES and returns the name added. If no name can be generated, returns NULL. */ static const char * rank_choose_dest_name (struct dictionary *dict, struct string_set *new_names, enum rank_func f, const char *src_name) { char *src_name_7; char name[128]; const char *s; int i; /* Try the first character of the ranking function followed by the first 7 bytes of the srcinal variable name. */ src_name_7 = utf8_encoding_trunc (src_name, dict_get_encoding (dict), 7); snprintf (name, sizeof name, "%c%s", function_name[f][0], src_name_7); free (src_name_7); s = try_new_name (name, dict, new_names); if (s != NULL) return s; /* Try "fun###". */ for (i = 1; i <= 999; i++) { sprintf (name, "%.3s%03d", function_name[f], i); s = try_new_name (name, dict, new_names); if (s != NULL) return s; } /* Try "RNKfn##". */ for (i = 1; i <= 99; i++) { sprintf (name, "RNK%.2s%02d", function_name[f], i); s = try_new_name (name, dict, new_names); if (s != NULL) return s; } msg (ME, _("Cannot generate variable name for ranking %s with %s. " "All candidates in use."), src_name, function_name[f]); return NULL; } struct rank { struct dictionary *dict; struct subcase sc; const struct variable **vars; size_t n_vars; const struct variable **group_vars; size_t n_group_vars; enum mv_class exclude; struct rank_spec *rs; size_t n_rs; enum ties ties; enum fraction fraction; int k_ntiles; bool print; /* Pool on which cell functions may allocate data */ struct pool *pool; }; static void destroy_rank (struct rank *rank) { free (rank->vars); free (rank->group_vars); subcase_destroy (&rank->sc); pool_destroy (rank->pool); } static bool parse_into (struct lexer *lexer, struct rank *cmd, struct string_set *new_names) { int var_count = 0; struct rank_spec *rs = NULL; cmd->rs = pool_realloc (cmd->pool, cmd->rs, sizeof (*cmd->rs) * (cmd->n_rs + 1)); rs = &cmd->rs[cmd->n_rs]; if (lex_match_id (lexer, "RANK")) { rs->rfunc = RANK; } else if (lex_match_id (lexer, "NORMAL")) { rs->rfunc = NORMAL; } else if (lex_match_id (lexer, "RFRACTION")) { rs->rfunc = RFRACTION; } else if (lex_match_id (lexer, "N")) { rs->rfunc = N; } else if (lex_match_id (lexer, "SAVAGE")) { rs->rfunc = SAVAGE; } else if (lex_match_id (lexer, "PERCENT")) { rs->rfunc = PERCENT; } else if (lex_match_id (lexer, "PROPORTION")) { rs->rfunc = PROPORTION; } else if (lex_match_id (lexer, "NTILES")) { if (!lex_force_match (lexer, T_LPAREN)) return false; if (! lex_force_int (lexer)) return false; cmd->k_ntiles = lex_integer (lexer); lex_get (lexer); if (!lex_force_match (lexer, T_RPAREN)) return false; rs->rfunc = NTILES; } else { lex_error (lexer, NULL); return false; } cmd->n_rs++; rs->dest_names = pool_calloc (cmd->pool, cmd->n_vars, sizeof *rs->dest_names); if (lex_match_id (lexer, "INTO")) { while(lex_token (lexer) == T_ID) { const char *name = lex_tokcstr (lexer); if (var_count >= subcase_get_n_fields (&cmd->sc)) msg (SE, _("Too many variables in %s clause."), "INTO"); else if (dict_lookup_var (cmd->dict, name) != NULL) msg (SE, _("Variable %s already exists."), name); else if (string_set_contains (new_names, name)) msg (SE, _("Duplicate variable name %s."), name); else { string_set_insert (new_names, name); rs->dest_names[var_count++] = pool_strdup (cmd->pool, name); lex_get (lexer); continue; } /* Error path. */ return false; } } return true; } /* Hardly a rank function !! */ static double rank_n (const struct rank *cmd UNUSED, double c UNUSED, double cc UNUSED, double cc_1 UNUSED, int i UNUSED, double w) { return w; } static double rank_rank (const struct rank *cmd, double c, double cc, double cc_1, int i, double w UNUSED) { double rank; if (c >= 1.0) { switch (cmd->ties) { case TIES_LOW: rank = cc_1 + 1; break; case TIES_HIGH: rank = cc; break; case TIES_MEAN: rank = cc_1 + (c + 1.0)/ 2.0; break; case TIES_CONDENSE: rank = i; break; default: NOT_REACHED (); } } else { switch (cmd->ties) { case TIES_LOW: rank = cc_1; break; case TIES_HIGH: rank = cc; break; case TIES_MEAN: rank = cc_1 + c / 2.0 ; break; case TIES_CONDENSE: rank = i; break; default: NOT_REACHED (); } } return rank; } static double rank_rfraction (const struct rank *cmd, double c, double cc, double cc_1, int i, double w) { return rank_rank (cmd, c, cc, cc_1, i, w) / w ; } static double rank_percent (const struct rank *cmd, double c, double cc, double cc_1, int i, double w) { return rank_rank (cmd, c, cc, cc_1, i, w) * 100.0 / w ; } static double rank_proportion (const struct rank *cmd, double c, double cc, double cc_1, int i, double w) { const double r = rank_rank (cmd, c, cc, cc_1, i, w) ; double f; switch (cmd->fraction) { case FRAC_BLOM: f = (r - 3.0/8.0) / (w + 0.25); break; case FRAC_RANKIT: f = (r - 0.5) / w ; break; case FRAC_TUKEY: f = (r - 1.0/3.0) / (w + 1.0/3.0); break; case FRAC_VW: f = r / (w + 1.0); break; default: NOT_REACHED (); } return (f > 0) ? f : SYSMIS; } static double rank_normal (const struct rank *cmd, double c, double cc, double cc_1, int i, double w) { double f = rank_proportion (cmd, c, cc, cc_1, i, w); return gsl_cdf_ugaussian_Pinv (f); } static double rank_ntiles (const struct rank *cmd, double c, double cc, double cc_1, int i, double w) { double r = rank_rank (cmd, c, cc, cc_1, i, w); return (floor ((r * cmd->k_ntiles) / (w + 1)) + 1); } /* Expected value of the order statistics from an exponential distribution */ static double ee (int j, double w_star) { int k; double sum = 0.0; for (k = 1 ; k <= j; k++) sum += 1.0 / (w_star + 1 - k); return sum; } static double rank_savage (const struct rank *cmd UNUSED, double c, double cc, double cc_1, int i UNUSED, double w) { double int_part; const int i_1 = floor (cc_1); const int i_2 = floor (cc); const double w_star = (modf (w, &int_part) == 0) ? w : floor (w) + 1; const double g_1 = cc_1 - i_1; const double g_2 = cc - i_2; /* The second factor is infinite, when the first is zero. Therefore, evaluate the second, only when the first is non-zero */ const double expr1 = (1 - g_1) ? (1 - g_1) * ee(i_1+1, w_star) : (1 - g_1); const double expr2 = g_2 ? g_2 * ee (i_2+1, w_star) : g_2 ; if (i_1 == i_2) return ee (i_1 + 1, w_star) - 1; if (i_1 + 1 == i_2) return ((expr1 + expr2)/c) - 1; if (i_1 + 2 <= i_2) { int j; double sigma = 0.0; for (j = i_1 + 2 ; j <= i_2; ++j) sigma += ee (j, w_star); return ((expr1 + expr2 + sigma) / c) -1; } NOT_REACHED(); } static double sum_weights (const struct casereader *input, int weight_idx) { if (weight_idx == -1) return casereader_count_cases (input); else { struct casereader *pass; struct ccase *c; double w; w = 0.0; pass = casereader_clone (input); for (; (c = casereader_read (pass)) != NULL; case_unref (c)) w += case_num_idx (c, weight_idx); casereader_destroy (pass); return w; } } static void rank_sorted_file (struct casereader *input, struct casewriter *output, int weight_idx, const struct rank *cmd) { struct casegrouper *tie_grouper; struct casereader *tied_cases; struct subcase input_var; int tie_group = 1; struct ccase *c; double cc = 0.0; double w; /* Get total group weight. */ w = sum_weights (input, weight_idx); /* Do ranking. */ subcase_init (&input_var, 0, 0, SC_ASCEND); tie_grouper = casegrouper_create_subcase (input, &input_var); subcase_destroy (&input_var); for (; casegrouper_get_next_group (tie_grouper, &tied_cases); casereader_destroy (tied_cases)) { double tw = sum_weights (tied_cases, weight_idx); double cc_1 = cc; cc += tw; taint_propagate (casereader_get_taint (tied_cases), casewriter_get_taint (output)); /* Rank tied cases. */ for (; (c = casereader_read (tied_cases)) != NULL; case_unref (c)) { struct ccase *out_case; size_t i; out_case = case_create (casewriter_get_proto (output)); case_data_rw_idx (out_case, 0)->f = case_num_idx (c, 1); for (i = 0; i < cmd->n_rs; ++i) { rank_function_t func = rank_func[cmd->rs[i].rfunc]; double rank = func (cmd, tw, cc, cc_1, tie_group, w); case_data_rw_idx (out_case, i + 1)->f = rank; } casewriter_write (output, out_case); } tie_group++; } casegrouper_destroy (tie_grouper); } static bool rank_cmd (struct dataset *ds, const struct rank *cmd); static const char * fraction_name (const struct rank *cmd) { switch (cmd->fraction) { case FRAC_BLOM: return "BLOM"; case FRAC_RANKIT: return "RANKIT"; case FRAC_TUKEY: return "TUKEY"; case FRAC_VW: return "VW"; default: NOT_REACHED (); } } /* Returns a label for a variable derived from SRC_VAR with function F. */ static const char * create_var_label (struct rank *cmd, const struct variable *src_var, enum rank_func f) { struct string label; const char *pool_label; ds_init_empty (&label); if (cmd->n_group_vars > 0) { struct string group_var_str; int g; ds_init_empty (&group_var_str); for (g = 0 ; g < cmd->n_group_vars ; ++g) { if (g > 0) ds_put_cstr (&group_var_str, " "); ds_put_cstr (&group_var_str, var_get_name (cmd->group_vars[g])); } ds_put_format (&label, _("%s of %s by %s"), function_name[f], var_get_name (src_var), ds_cstr (&group_var_str)); ds_destroy (&group_var_str); } else ds_put_format (&label, _("%s of %s"), function_name[f], var_get_name (src_var)); pool_label = pool_strdup (cmd->pool, ds_cstr (&label)); ds_destroy (&label); return pool_label; } int cmd_rank (struct lexer *lexer, struct dataset *ds) { struct string_set new_names; struct rank rank; struct rank_spec *rs; subcase_init_empty (&rank.sc); rank.rs = NULL; rank.n_rs = 0; rank.exclude = MV_ANY; rank.n_group_vars = 0; rank.group_vars = NULL; rank.dict = dataset_dict (ds); rank.ties = TIES_MEAN; rank.fraction = FRAC_BLOM; rank.print = true; rank.pool = pool_create (); string_set_init (&new_names); if (lex_match_id (lexer, "VARIABLES")) if (! lex_force_match (lexer, T_EQUALS)) goto error; if (!parse_sort_criteria (lexer, rank.dict, &rank.sc, &rank.vars, NULL)) goto error; rank.n_vars = rank.sc.n_fields; if (lex_match (lexer, T_BY)) { if (! parse_variables_const (lexer, rank.dict, &rank.group_vars, &rank.n_group_vars, PV_NO_DUPLICATE | PV_NO_SCRATCH)) goto error; } while (lex_token (lexer) != T_ENDCMD) { if (! lex_force_match (lexer, T_SLASH)) goto error; if (lex_match_id (lexer, "TIES")) { if (! lex_force_match (lexer, T_EQUALS)) goto error; if (lex_match_id (lexer, "MEAN")) { rank.ties = TIES_MEAN; } else if (lex_match_id (lexer, "LOW")) { rank.ties = TIES_LOW; } else if (lex_match_id (lexer, "HIGH")) { rank.ties = TIES_HIGH; } else if (lex_match_id (lexer, "CONDENSE")) { rank.ties = TIES_CONDENSE; } else { lex_error (lexer, NULL); goto error; } } else if (lex_match_id (lexer, "FRACTION")) { if (! lex_force_match (lexer, T_EQUALS)) goto error; if (lex_match_id (lexer, "BLOM")) { rank.fraction = FRAC_BLOM; } else if (lex_match_id (lexer, "TUKEY")) { rank.fraction = FRAC_TUKEY; } else if (lex_match_id (lexer, "VW")) { rank.fraction = FRAC_VW; } else if (lex_match_id (lexer, "RANKIT")) { rank.fraction = FRAC_RANKIT; } else { lex_error (lexer, NULL); goto error; } } else if (lex_match_id (lexer, "PRINT")) { if (! lex_force_match (lexer, T_EQUALS)) goto error; if (lex_match_id (lexer, "YES")) { rank.print = true; } else if (lex_match_id (lexer, "NO")) { rank.print = false; } else { lex_error (lexer, NULL); goto error; } } else if (lex_match_id (lexer, "MISSING")) { if (! lex_force_match (lexer, T_EQUALS)) goto error; if (lex_match_id (lexer, "INCLUDE")) { rank.exclude = MV_SYSTEM; } else if (lex_match_id (lexer, "EXCLUDE")) { rank.exclude = MV_ANY; } else { lex_error (lexer, NULL); goto error; } } else if (! parse_into (lexer, &rank, &new_names)) goto error; } /* If no rank specs are given, then apply a default */ if (rank.n_rs == 0) { struct rank_spec *rs; rs = pool_calloc (rank.pool, 1, sizeof *rs); rs->rfunc = RANK; rs->dest_names = pool_calloc (rank.pool, rank.n_vars, sizeof *rs->dest_names); rank.rs = rs; rank.n_rs = 1; } /* Choose variable names for all rank destinations which haven't already been created with INTO. */ for (rs = rank.rs; rs < &rank.rs[rank.n_rs]; rs++) { rs->dest_labels = pool_calloc (rank.pool, rank.n_vars, sizeof *rs->dest_labels); for (int v = 0 ; v < rank.n_vars ; v ++) { const char **dst_name = &rs->dest_names[v]; if (*dst_name == NULL) { *dst_name = rank_choose_dest_name (rank.dict, &new_names, rs->rfunc, var_get_name (rank.vars[v])); if (*dst_name == NULL) goto error; } rs->dest_labels[v] = create_var_label (&rank, rank.vars[v], rs->rfunc); } } if (rank.print) { struct pivot_table *table = pivot_table_create ( N_("Variables Created by RANK")); table->omit_empty = true; pivot_dimension_create (table, PIVOT_AXIS_COLUMN, N_("New Variable"), N_("New Variable"), N_("Function"), N_("Fraction"), N_("Grouping Variables")); struct pivot_dimension *variables = pivot_dimension_create ( table, PIVOT_AXIS_ROW, N_("Existing Variable"), N_("Existing Variable")); variables->root->show_label = true; for (size_t i = 0 ; i < rank.n_rs ; ++i) { for (size_t v = 0 ; v < rank.n_vars ; v ++) { int row_idx = pivot_category_create_leaf ( variables->root, pivot_value_new_variable (rank.vars[v])); struct string group_vars = DS_EMPTY_INITIALIZER; for (int g = 0 ; g < rank.n_group_vars ; ++g) { if (g) ds_put_byte (&group_vars, ' '); ds_put_cstr (&group_vars, var_get_name (rank.group_vars[g])); } enum rank_func rfunc = rank.rs[i].rfunc; bool has_fraction = rfunc == NORMAL || rfunc == PROPORTION; const char *entries[] = { rank.rs[i].dest_names[v], function_name[rank.rs[i].rfunc], has_fraction ? fraction_name (&rank) : NULL, rank.n_group_vars ? ds_cstr (&group_vars) : NULL, }; for (size_t j = 0; j < sizeof entries / sizeof *entries; j++) { const char *entry = entries[j]; if (entry) pivot_table_put2 (table, j, row_idx, pivot_value_new_user_text (entry, -1)); } ds_destroy (&group_vars); } } pivot_table_submit (table); } /* Do the ranking */ rank_cmd (ds, &rank); destroy_rank (&rank); string_set_destroy (&new_names); return CMD_SUCCESS; error: destroy_rank (&rank); string_set_destroy (&new_names); return CMD_FAILURE; } /* RANK transformation. */ struct rank_trns { int order_case_idx; struct rank_trns_input_var *input_vars; size_t n_input_vars; size_t n_funcs; }; struct rank_trns_input_var { struct casereader *input; struct ccase *current; struct variable **output_vars; }; static void advance_ranking (struct rank_trns_input_var *iv) { case_unref (iv->current); iv->current = casereader_read (iv->input); } static int rank_trns_proc (void *trns_, struct ccase **c, casenumber case_idx UNUSED) { struct rank_trns *trns = trns_; double order = case_num_idx (*c, trns->order_case_idx); struct rank_trns_input_var *iv; *c = case_unshare (*c); for (iv = trns->input_vars; iv < &trns->input_vars[trns->n_input_vars]; iv++) while (iv->current != NULL) { double iv_order = case_num_idx (iv->current, 0); if (iv_order == order) { size_t i; for (i = 0; i < trns->n_funcs; i++) case_data_rw (*c, iv->output_vars[i])->f = case_num_idx (iv->current, i + 1); advance_ranking (iv); break; } else if (iv_order > order) break; else advance_ranking (iv); } return TRNS_CONTINUE; } static bool rank_trns_free (void *trns_) { struct rank_trns *trns = trns_; struct rank_trns_input_var *iv; for (iv = trns->input_vars; iv < &trns->input_vars[trns->n_input_vars]; iv++) { casereader_destroy (iv->input); case_unref (iv->current); free (iv->output_vars); } free (trns->input_vars); free (trns); return true; } static bool rank_cmd (struct dataset *ds, const struct rank *cmd) { struct dictionary *d = dataset_dict (ds); struct variable *weight_var = dict_get_weight (d); struct casewriter **outputs; struct variable *order_var; struct casereader *input; struct rank_trns *trns; bool ok = true; int i; order_var = add_permanent_ordering_transformation (ds); /* Create output files. */ { struct caseproto *output_proto; struct subcase by_order; output_proto = caseproto_create (); for (i = 0; i < cmd->n_rs + 1; i++) output_proto = caseproto_add_width (output_proto, 0); subcase_init (&by_order, 0, 0, SC_ASCEND); outputs = xnmalloc (cmd->n_vars, sizeof *outputs); for (i = 0; i < cmd->n_vars; i++) outputs[i] = sort_create_writer (&by_order, output_proto); subcase_destroy (&by_order); caseproto_unref (output_proto); } /* Open the active file and make one pass per input variable. */ input = proc_open (ds); input = casereader_create_filter_weight (input, d, NULL, NULL); for (i = 0 ; i < cmd->n_vars ; ++i) { const struct variable *input_var = cmd->vars[i]; struct casereader *input_pass; struct casegrouper *split_grouper; struct casereader *split_group; struct subcase rank_ordering; struct subcase projection; struct subcase split_vars; struct subcase group_vars; int weight_idx; int j; /* Discard cases that have missing values of input variable. */ input_pass = i == cmd->n_vars - 1 ? input : casereader_clone (input); input_pass = casereader_create_filter_missing (input_pass, &input_var, 1, cmd->exclude, NULL, NULL); /* Keep only the columns we really need, to save time and space when we sort them just below. After this projection, the input_pass case indexes look like: - 0: input_var. - 1: order_var. - 2 and up: cmd->n_group_vars group variables - 2 + cmd->n_group_vars and up: split variables - 2 + cmd->n_group_vars + n_split_vars: weight var */ subcase_init_empty (&projection); subcase_add_var_always (&projection, input_var, SC_ASCEND); subcase_add_var_always (&projection, order_var, SC_ASCEND); subcase_add_vars_always (&projection, cmd->group_vars, cmd->n_group_vars); subcase_add_vars_always (&projection, dict_get_split_vars (d), dict_get_split_cnt (d)); if (weight_var != NULL) { subcase_add_var_always (&projection, weight_var, SC_ASCEND); weight_idx = 2 + cmd->n_group_vars + dict_get_split_cnt (d); } else weight_idx = -1; input_pass = casereader_project (input_pass, &projection); subcase_destroy (&projection); /* Prepare 'group_vars' as the set of grouping variables. */ subcase_init_empty (&group_vars); for (j = 0; j < cmd->n_group_vars; j++) subcase_add_always (&group_vars, j + 2, var_get_width (cmd->group_vars[j]), SC_ASCEND); /* Prepare 'rank_ordering' for sorting with the group variables as primary key and the input variable as secondary key. */ subcase_clone (&rank_ordering, &group_vars); subcase_add (&rank_ordering, 0, 0, subcase_get_direction (&cmd->sc, i)); /* Group by split variables */ subcase_init_empty (&split_vars); for (j = 0; j < dict_get_split_cnt (d); j++) subcase_add_always (&split_vars, 2 + j + cmd->n_group_vars, var_get_width (dict_get_split_vars (d)[j]), SC_ASCEND); split_grouper = casegrouper_create_subcase (input_pass, &split_vars); subcase_destroy (&split_vars); while (casegrouper_get_next_group (split_grouper, &split_group)) { struct casereader *ordered; struct casegrouper *by_grouper; struct casereader *by_group; ordered = sort_execute (split_group, &rank_ordering); by_grouper = casegrouper_create_subcase (ordered, &group_vars); while (casegrouper_get_next_group (by_grouper, &by_group)) rank_sorted_file (by_group, outputs[i], weight_idx, cmd); ok = casegrouper_destroy (by_grouper) && ok; } subcase_destroy (&group_vars); subcase_destroy (&rank_ordering); ok = casegrouper_destroy (split_grouper) && ok; } ok = proc_commit (ds) && ok; /* Re-fetch the dictionary and order variable, because if TEMPORARY was in effect then there's a new dictionary. */ d = dataset_dict (ds); order_var = dict_lookup_var_assert (d, "$ORDER"); /* Merge the original data set with the ranks (which we already sorted on $ORDER). */ trns = xmalloc (sizeof *trns); trns->order_case_idx = var_get_case_index (order_var); trns->input_vars = xnmalloc (cmd->n_vars, sizeof *trns->input_vars); trns->n_input_vars = cmd->n_vars; trns->n_funcs = cmd->n_rs; for (i = 0; i < trns->n_input_vars; i++) { struct rank_trns_input_var *iv = &trns->input_vars[i]; int j; iv->input = casewriter_make_reader (outputs[i]); iv->current = casereader_read (iv->input); iv->output_vars = xnmalloc (trns->n_funcs, sizeof *iv->output_vars); for (j = 0; j < trns->n_funcs; j++) { struct rank_spec *rs = &cmd->rs[j]; struct variable *var; var = dict_create_var_assert (d, rs->dest_names[i], 0); var_set_both_formats (var, &dest_format[rs->rfunc]); var_set_label (var, rs->dest_labels[i]); iv->output_vars[j] = var; } } free (outputs); add_transformation (ds, rank_trns_proc, rank_trns_free, trns); /* Delete our sort key, which we don't need anymore. */ dict_delete_var (d, order_var); return ok; } pspp-1.4.1/src/language/stats/oneway.c0000644000175000017500000012122613670210420017270 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 1997-9, 2000, 2007, 2009, 2010, 2011, 2012, 2013, 2014 Free Software Foundation, Inc. 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 3 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, see . */ #include #include #include #include #include #include "data/case.h" #include "data/casegrouper.h" #include "data/casereader.h" #include "data/dataset.h" #include "data/dictionary.h" #include "data/format.h" #include "data/value.h" #include "language/command.h" #include "language/dictionary/split-file.h" #include "language/lexer/lexer.h" #include "language/lexer/value-parser.h" #include "language/lexer/variable-parser.h" #include "libpspp/ll.h" #include "libpspp/message.h" #include "libpspp/misc.h" #include "libpspp/taint.h" #include "linreg/sweep.h" #include "tukey/tukey.h" #include "math/categoricals.h" #include "math/interaction.h" #include "math/covariance.h" #include "math/levene.h" #include "math/moments.h" #include "output/pivot-table.h" #include "gettext.h" #define _(msgid) gettext (msgid) #define N_(msgid) msgid /* Workspace variable for each dependent variable */ struct per_var_ws { struct interaction *iact; struct categoricals *cat; struct covariance *cov; struct levene *nl; double n; double sst; double sse; double ssa; int n_groups; double mse; }; /* Per category data */ struct descriptive_data { const struct variable *var; struct moments1 *mom; double minimum; double maximum; }; enum missing_type { MISS_LISTWISE, MISS_ANALYSIS, }; enum statistics { STATS_DESCRIPTIVES = 0x0001, STATS_HOMOGENEITY = 0x0002 }; struct coeff_node { struct ll ll; double coeff; }; struct contrasts_node { struct ll ll; struct ll_list coefficient_list; }; struct oneway_spec; typedef double df_func (const struct per_var_ws *pvw, const struct moments1 *mom_i, const struct moments1 *mom_j); typedef double ts_func (int k, const struct moments1 *mom_i, const struct moments1 *mom_j, double std_err); typedef double p1tail_func (double ts, double df1, double df2); typedef double pinv_func (double std_err, double alpha, double df, int k, const struct moments1 *mom_i, const struct moments1 *mom_j); struct posthoc { const char *syntax; const char *label; df_func *dff; ts_func *tsf; p1tail_func *p1f; pinv_func *pinv; }; struct oneway_spec { size_t n_vars; const struct variable **vars; const struct variable *indep_var; enum statistics stats; enum missing_type missing_type; enum mv_class exclude; /* List of contrasts */ struct ll_list contrast_list; /* The weight variable */ const struct variable *wv; const struct fmt_spec *wfmt; /* The confidence level for multiple comparisons */ double alpha; int *posthoc; int n_posthoc; }; static double df_common (const struct per_var_ws *pvw, const struct moments1 *mom_i UNUSED, const struct moments1 *mom_j UNUSED) { return pvw->n - pvw->n_groups; } static double df_individual (const struct per_var_ws *pvw UNUSED, const struct moments1 *mom_i, const struct moments1 *mom_j) { double n_i, var_i; double n_j, var_j; double nom,denom; moments1_calculate (mom_i, &n_i, NULL, &var_i, 0, 0); moments1_calculate (mom_j, &n_j, NULL, &var_j, 0, 0); if (n_i <= 1.0 || n_j <= 1.0) return SYSMIS; nom = pow2 (var_i/n_i + var_j/n_j); denom = pow2 (var_i/n_i) / (n_i - 1) + pow2 (var_j/n_j) / (n_j - 1); return nom / denom; } static double lsd_pinv (double std_err, double alpha, double df, int k UNUSED, const struct moments1 *mom_i UNUSED, const struct moments1 *mom_j UNUSED) { return std_err * gsl_cdf_tdist_Pinv (1.0 - alpha / 2.0, df); } static double bonferroni_pinv (double std_err, double alpha, double df, int k, const struct moments1 *mom_i UNUSED, const struct moments1 *mom_j UNUSED) { const int m = k * (k - 1) / 2; return std_err * gsl_cdf_tdist_Pinv (1.0 - alpha / (2.0 * m), df); } static double sidak_pinv (double std_err, double alpha, double df, int k, const struct moments1 *mom_i UNUSED, const struct moments1 *mom_j UNUSED) { const double m = k * (k - 1) / 2; double lp = 1.0 - exp (log (1.0 - alpha) / m) ; return std_err * gsl_cdf_tdist_Pinv (1.0 - lp / 2.0, df); } static double tukey_pinv (double std_err, double alpha, double df, int k, const struct moments1 *mom_i UNUSED, const struct moments1 *mom_j UNUSED) { if (k < 2 || df < 2) return SYSMIS; return std_err / sqrt (2.0) * qtukey (1 - alpha, 1.0, k, df, 1, 0); } static double scheffe_pinv (double std_err, double alpha, double df, int k, const struct moments1 *mom_i UNUSED, const struct moments1 *mom_j UNUSED) { double x = (k - 1) * gsl_cdf_fdist_Pinv (1.0 - alpha, k - 1, df); return std_err * sqrt (x); } static double gh_pinv (double std_err UNUSED, double alpha, double df, int k, const struct moments1 *mom_i, const struct moments1 *mom_j) { double n_i, mean_i, var_i; double n_j, mean_j, var_j; double m; moments1_calculate (mom_i, &n_i, &mean_i, &var_i, 0, 0); moments1_calculate (mom_j, &n_j, &mean_j, &var_j, 0, 0); m = sqrt ((var_i/n_i + var_j/n_j) / 2.0); if (k < 2 || df < 2) return SYSMIS; return m * qtukey (1 - alpha, 1.0, k, df, 1, 0); } static double multiple_comparison_sig (double std_err, const struct per_var_ws *pvw, const struct descriptive_data *dd_i, const struct descriptive_data *dd_j, const struct posthoc *ph) { int k = pvw->n_groups; double df = ph->dff (pvw, dd_i->mom, dd_j->mom); double ts = ph->tsf (k, dd_i->mom, dd_j->mom, std_err); if (df == SYSMIS) return SYSMIS; return ph->p1f (ts, k - 1, df); } static double mc_half_range (const struct oneway_spec *cmd, const struct per_var_ws *pvw, double std_err, const struct descriptive_data *dd_i, const struct descriptive_data *dd_j, const struct posthoc *ph) { int k = pvw->n_groups; double df = ph->dff (pvw, dd_i->mom, dd_j->mom); if (df == SYSMIS) return SYSMIS; return ph->pinv (std_err, cmd->alpha, df, k, dd_i->mom, dd_j->mom); } static double tukey_1tailsig (double ts, double df1, double df2) { double twotailedsig; if (df2 < 2 || df1 < 1) return SYSMIS; twotailedsig = 1.0 - ptukey (ts, 1.0, df1 + 1, df2, 1, 0); return twotailedsig / 2.0; } static double lsd_1tailsig (double ts, double df1 UNUSED, double df2) { return ts < 0 ? gsl_cdf_tdist_P (ts, df2) : gsl_cdf_tdist_Q (ts, df2); } static double sidak_1tailsig (double ts, double df1, double df2) { double ex = (df1 + 1.0) * df1 / 2.0; double lsd_sig = 2 * lsd_1tailsig (ts, df1, df2); return 0.5 * (1.0 - pow (1.0 - lsd_sig, ex)); } static double bonferroni_1tailsig (double ts, double df1, double df2) { const int m = (df1 + 1) * df1 / 2; double p = ts < 0 ? gsl_cdf_tdist_P (ts, df2) : gsl_cdf_tdist_Q (ts, df2); p *= m; return p > 0.5 ? 0.5 : p; } static double scheffe_1tailsig (double ts, double df1, double df2) { return 0.5 * gsl_cdf_fdist_Q (ts, df1, df2); } static double tukey_test_stat (int k UNUSED, const struct moments1 *mom_i, const struct moments1 *mom_j, double std_err) { double ts; double n_i, mean_i, var_i; double n_j, mean_j, var_j; moments1_calculate (mom_i, &n_i, &mean_i, &var_i, 0, 0); moments1_calculate (mom_j, &n_j, &mean_j, &var_j, 0, 0); ts = (mean_i - mean_j) / std_err; ts = fabs (ts) * sqrt (2.0); return ts; } static double lsd_test_stat (int k UNUSED, const struct moments1 *mom_i, const struct moments1 *mom_j, double std_err) { double n_i, mean_i, var_i; double n_j, mean_j, var_j; moments1_calculate (mom_i, &n_i, &mean_i, &var_i, 0, 0); moments1_calculate (mom_j, &n_j, &mean_j, &var_j, 0, 0); return (mean_i - mean_j) / std_err; } static double scheffe_test_stat (int k, const struct moments1 *mom_i, const struct moments1 *mom_j, double std_err) { double t; double n_i, mean_i, var_i; double n_j, mean_j, var_j; moments1_calculate (mom_i, &n_i, &mean_i, &var_i, 0, 0); moments1_calculate (mom_j, &n_j, &mean_j, &var_j, 0, 0); t = (mean_i - mean_j) / std_err; t = pow2 (t); t /= k - 1; return t; } static double gh_test_stat (int k UNUSED, const struct moments1 *mom_i, const struct moments1 *mom_j, double std_err UNUSED) { double ts; double thing; double n_i, mean_i, var_i; double n_j, mean_j, var_j; moments1_calculate (mom_i, &n_i, &mean_i, &var_i, 0, 0); moments1_calculate (mom_j, &n_j, &mean_j, &var_j, 0, 0); thing = var_i / n_i + var_j / n_j; thing /= 2.0; thing = sqrt (thing); ts = (mean_i - mean_j) / thing; return fabs (ts); } static const struct posthoc ph_tests [] = { { "LSD", N_("LSD"), df_common, lsd_test_stat, lsd_1tailsig, lsd_pinv}, { "TUKEY", N_("Tukey HSD"), df_common, tukey_test_stat, tukey_1tailsig, tukey_pinv}, { "BONFERRONI", N_("Bonferroni"), df_common, lsd_test_stat, bonferroni_1tailsig, bonferroni_pinv}, { "SCHEFFE", N_("Scheffé"), df_common, scheffe_test_stat, scheffe_1tailsig, scheffe_pinv}, { "GH", N_("Games-Howell"), df_individual, gh_test_stat, tukey_1tailsig, gh_pinv}, { "SIDAK", N_("Šidák"), df_common, lsd_test_stat, sidak_1tailsig, sidak_pinv} }; struct oneway_workspace { /* The number of distinct values of the independent variable, when all missing values are disregarded */ int actual_number_of_groups; struct per_var_ws *vws; /* An array of descriptive data. One for each dependent variable */ struct descriptive_data **dd_total; }; /* Routines to show the output tables */ static void show_anova_table (const struct oneway_spec *, const struct oneway_workspace *); static void show_descriptives (const struct oneway_spec *, const struct oneway_workspace *); static void show_homogeneity (const struct oneway_spec *, const struct oneway_workspace *); static void output_oneway (const struct oneway_spec *, struct oneway_workspace *ws); static void run_oneway (const struct oneway_spec *cmd, struct casereader *input, const struct dataset *ds); static void destroy_coeff_list (struct contrasts_node *coeff_list) { struct coeff_node *cn = NULL; struct coeff_node *cnx = NULL; struct ll_list *cl = &coeff_list->coefficient_list; ll_for_each_safe (cn, cnx, struct coeff_node, ll, cl) { free (cn); } free (coeff_list); } static void oneway_cleanup (struct oneway_spec *cmd) { struct contrasts_node *coeff_list = NULL; struct contrasts_node *coeff_next = NULL; ll_for_each_safe (coeff_list, coeff_next, struct contrasts_node, ll, &cmd->contrast_list) { destroy_coeff_list (coeff_list); } free (cmd->posthoc); } int cmd_oneway (struct lexer *lexer, struct dataset *ds) { const struct dictionary *dict = dataset_dict (ds); struct oneway_spec oneway ; oneway.n_vars = 0; oneway.vars = NULL; oneway.indep_var = NULL; oneway.stats = 0; oneway.missing_type = MISS_ANALYSIS; oneway.exclude = MV_ANY; oneway.wv = dict_get_weight (dict); oneway.wfmt = dict_get_weight_format (dict); oneway.alpha = 0.05; oneway.posthoc = NULL; oneway.n_posthoc = 0; ll_init (&oneway.contrast_list); if (lex_match (lexer, T_SLASH)) { if (!lex_force_match_id (lexer, "VARIABLES")) { goto error; } lex_match (lexer, T_EQUALS); } if (!parse_variables_const (lexer, dict, &oneway.vars, &oneway.n_vars, PV_NO_DUPLICATE | PV_NUMERIC)) goto error; if (!lex_force_match (lexer, T_BY)) goto error; oneway.indep_var = parse_variable_const (lexer, dict); if (oneway.indep_var == NULL) goto error; while (lex_token (lexer) != T_ENDCMD) { lex_match (lexer, T_SLASH); if (lex_match_id (lexer, "STATISTICS")) { lex_match (lexer, T_EQUALS); while (lex_token (lexer) != T_ENDCMD && lex_token (lexer) != T_SLASH) { if (lex_match_id (lexer, "DESCRIPTIVES")) { oneway.stats |= STATS_DESCRIPTIVES; } else if (lex_match_id (lexer, "HOMOGENEITY")) { oneway.stats |= STATS_HOMOGENEITY; } else { lex_error (lexer, NULL); goto error; } } } else if (lex_match_id (lexer, "POSTHOC")) { lex_match (lexer, T_EQUALS); while (lex_token (lexer) != T_ENDCMD && lex_token (lexer) != T_SLASH) { int p; bool method = false; for (p = 0 ; p < sizeof (ph_tests) / sizeof (struct posthoc); ++p) { if (lex_match_id (lexer, ph_tests[p].syntax)) { oneway.n_posthoc++; oneway.posthoc = xrealloc (oneway.posthoc, sizeof (*oneway.posthoc) * oneway.n_posthoc); oneway.posthoc[oneway.n_posthoc - 1] = p; method = true; break; } } if (method == false) { if (lex_match_id (lexer, "ALPHA")) { if (!lex_force_match (lexer, T_LPAREN)) goto error; if (! lex_force_num (lexer)) goto error; oneway.alpha = lex_number (lexer); lex_get (lexer); if (!lex_force_match (lexer, T_RPAREN)) goto error; } else { msg (SE, _("The post hoc analysis method %s is not supported."), lex_tokcstr (lexer)); lex_error (lexer, NULL); goto error; } } } } else if (lex_match_id (lexer, "CONTRAST")) { struct contrasts_node *cl = xzalloc (sizeof *cl); struct ll_list *coefficient_list = &cl->coefficient_list; lex_match (lexer, T_EQUALS); ll_init (coefficient_list); while (lex_token (lexer) != T_ENDCMD && lex_token (lexer) != T_SLASH) { if (lex_is_number (lexer)) { struct coeff_node *cc = xmalloc (sizeof *cc); cc->coeff = lex_number (lexer); ll_push_tail (coefficient_list, &cc->ll); lex_get (lexer); } else { destroy_coeff_list (cl); lex_error (lexer, NULL); goto error; } } if (ll_count (coefficient_list) <= 0) { destroy_coeff_list (cl); goto error; } ll_push_tail (&oneway.contrast_list, &cl->ll); } else if (lex_match_id (lexer, "MISSING")) { lex_match (lexer, T_EQUALS); while (lex_token (lexer) != T_ENDCMD && lex_token (lexer) != T_SLASH) { if (lex_match_id (lexer, "INCLUDE")) { oneway.exclude = MV_SYSTEM; } else if (lex_match_id (lexer, "EXCLUDE")) { oneway.exclude = MV_ANY; } else if (lex_match_id (lexer, "LISTWISE")) { oneway.missing_type = MISS_LISTWISE; } else if (lex_match_id (lexer, "ANALYSIS")) { oneway.missing_type = MISS_ANALYSIS; } else { lex_error (lexer, NULL); goto error; } } } else { lex_error (lexer, NULL); goto error; } } { struct casegrouper *grouper; struct casereader *group; bool ok; grouper = casegrouper_create_splits (proc_open (ds), dict); while (casegrouper_get_next_group (grouper, &group)) run_oneway (&oneway, group, ds); ok = casegrouper_destroy (grouper); ok = proc_commit (ds) && ok; } oneway_cleanup (&oneway); free (oneway.vars); return CMD_SUCCESS; error: oneway_cleanup (&oneway); free (oneway.vars); return CMD_FAILURE; } static struct descriptive_data * dd_create (const struct variable *var) { struct descriptive_data *dd = xmalloc (sizeof *dd); dd->mom = moments1_create (MOMENT_VARIANCE); dd->minimum = DBL_MAX; dd->maximum = -DBL_MAX; dd->var = var; return dd; } static void dd_destroy (struct descriptive_data *dd) { moments1_destroy (dd->mom); free (dd); } static void * makeit (const void *aux1, void *aux2 UNUSED) { const struct variable *var = aux1; struct descriptive_data *dd = dd_create (var); return dd; } static void killit (const void *aux1 UNUSED, void *aux2 UNUSED, void *user_data) { struct descriptive_data *dd = user_data; dd_destroy (dd); } static void updateit (const void *aux1, void *aux2, void *user_data, const struct ccase *c, double weight) { struct descriptive_data *dd = user_data; const struct variable *varp = aux1; const union value *valx = case_data (c, varp); struct descriptive_data *dd_total = aux2; moments1_add (dd->mom, valx->f, weight); if (valx->f < dd->minimum) dd->minimum = valx->f; if (valx->f > dd->maximum) dd->maximum = valx->f; { const struct variable *var = dd_total->var; const union value *val = case_data (c, var); moments1_add (dd_total->mom, val->f, weight); if (val->f < dd_total->minimum) dd_total->minimum = val->f; if (val->f > dd_total->maximum) dd_total->maximum = val->f; } } static void run_oneway (const struct oneway_spec *cmd, struct casereader *input, const struct dataset *ds) { int v; struct taint *taint; struct dictionary *dict = dataset_dict (ds); struct casereader *reader; struct ccase *c; struct oneway_workspace ws; ws.actual_number_of_groups = 0; ws.vws = xzalloc (cmd->n_vars * sizeof (*ws.vws)); ws.dd_total = xmalloc (sizeof (struct descriptive_data) * cmd->n_vars); for (v = 0 ; v < cmd->n_vars; ++v) ws.dd_total[v] = dd_create (cmd->vars[v]); for (v = 0; v < cmd->n_vars; ++v) { static const struct payload payload = { .create = makeit, .update = updateit, .calculate = NULL, .destroy = killit }; ws.vws[v].iact = interaction_create (cmd->indep_var); ws.vws[v].cat = categoricals_create (&ws.vws[v].iact, 1, cmd->wv, cmd->exclude); categoricals_set_payload (ws.vws[v].cat, &payload, CONST_CAST (struct variable *, cmd->vars[v]), ws.dd_total[v]); ws.vws[v].cov = covariance_2pass_create (1, &cmd->vars[v], ws.vws[v].cat, cmd->wv, cmd->exclude, true); ws.vws[v].nl = levene_create (var_get_width (cmd->indep_var), NULL); } c = casereader_peek (input, 0); if (c == NULL) { casereader_destroy (input); goto finish; } output_split_file_values (ds, c); case_unref (c); taint = taint_clone (casereader_get_taint (input)); input = casereader_create_filter_missing (input, &cmd->indep_var, 1, cmd->exclude, NULL, NULL); if (cmd->missing_type == MISS_LISTWISE) input = casereader_create_filter_missing (input, cmd->vars, cmd->n_vars, cmd->exclude, NULL, NULL); input = casereader_create_filter_weight (input, dict, NULL, NULL); reader = casereader_clone (input); for (; (c = casereader_read (reader)) != NULL; case_unref (c)) { int i; double w = dict_get_case_weight (dict, c, NULL); for (i = 0; i < cmd->n_vars; ++i) { struct per_var_ws *pvw = &ws.vws[i]; const struct variable *v = cmd->vars[i]; const union value *val = case_data (c, v); if (MISS_ANALYSIS == cmd->missing_type) { if (var_is_value_missing (v, val, cmd->exclude)) continue; } covariance_accumulate_pass1 (pvw->cov, c); levene_pass_one (pvw->nl, val->f, w, case_data (c, cmd->indep_var)); } } casereader_destroy (reader); reader = casereader_clone (input); for (; (c = casereader_read (reader)); case_unref (c)) { int i; double w = dict_get_case_weight (dict, c, NULL); for (i = 0; i < cmd->n_vars; ++i) { struct per_var_ws *pvw = &ws.vws[i]; const struct variable *v = cmd->vars[i]; const union value *val = case_data (c, v); if (MISS_ANALYSIS == cmd->missing_type) { if (var_is_value_missing (v, val, cmd->exclude)) continue; } covariance_accumulate_pass2 (pvw->cov, c); levene_pass_two (pvw->nl, val->f, w, case_data (c, cmd->indep_var)); } } casereader_destroy (reader); reader = casereader_clone (input); for (; (c = casereader_read (reader)); case_unref (c)) { int i; double w = dict_get_case_weight (dict, c, NULL); for (i = 0; i < cmd->n_vars; ++i) { struct per_var_ws *pvw = &ws.vws[i]; const struct variable *v = cmd->vars[i]; const union value *val = case_data (c, v); if (MISS_ANALYSIS == cmd->missing_type) { if (var_is_value_missing (v, val, cmd->exclude)) continue; } levene_pass_three (pvw->nl, val->f, w, case_data (c, cmd->indep_var)); } } casereader_destroy (reader); for (v = 0; v < cmd->n_vars; ++v) { const gsl_matrix *ucm; gsl_matrix *cm; struct per_var_ws *pvw = &ws.vws[v]; const struct categoricals *cats = covariance_get_categoricals (pvw->cov); const bool ok = categoricals_sane (cats); if (! ok) { msg (MW, _("Dependent variable %s has no non-missing values. No analysis for this variable will be done."), var_get_name (cmd->vars[v])); continue; } ucm = covariance_calculate_unnormalized (pvw->cov); cm = gsl_matrix_alloc (ucm->size1, ucm->size2); gsl_matrix_memcpy (cm, ucm); moments1_calculate (ws.dd_total[v]->mom, &pvw->n, NULL, NULL, NULL, NULL); pvw->sst = gsl_matrix_get (cm, 0, 0); reg_sweep (cm, 0); pvw->sse = gsl_matrix_get (cm, 0, 0); gsl_matrix_free (cm); pvw->ssa = pvw->sst - pvw->sse; pvw->n_groups = categoricals_n_total (cats); pvw->mse = (pvw->sst - pvw->ssa) / (pvw->n - pvw->n_groups); } for (v = 0; v < cmd->n_vars; ++v) { const struct categoricals *cats = covariance_get_categoricals (ws.vws[v].cov); if (! categoricals_is_complete (cats)) { continue; } if (categoricals_n_total (cats) > ws.actual_number_of_groups) ws.actual_number_of_groups = categoricals_n_total (cats); } casereader_destroy (input); if (!taint_has_tainted_successor (taint)) output_oneway (cmd, &ws); taint_destroy (taint); finish: for (v = 0; v < cmd->n_vars; ++v) { covariance_destroy (ws.vws[v].cov); levene_destroy (ws.vws[v].nl); dd_destroy (ws.dd_total[v]); interaction_destroy (ws.vws[v].iact); } free (ws.vws); free (ws.dd_total); } static void show_contrast_coeffs (const struct oneway_spec *cmd, const struct oneway_workspace *ws); static void show_contrast_tests (const struct oneway_spec *cmd, const struct oneway_workspace *ws); static void show_comparisons (const struct oneway_spec *cmd, const struct oneway_workspace *ws, int depvar); static void output_oneway (const struct oneway_spec *cmd, struct oneway_workspace *ws) { size_t i = 0; /* Check the sanity of the given contrast values */ struct contrasts_node *coeff_list = NULL; struct contrasts_node *coeff_next = NULL; ll_for_each_safe (coeff_list, coeff_next, struct contrasts_node, ll, &cmd->contrast_list) { struct coeff_node *cn = NULL; double sum = 0; struct ll_list *cl = &coeff_list->coefficient_list; ++i; if (ll_count (cl) != ws->actual_number_of_groups) { msg (SW, _("In contrast list %zu, the number of coefficients (%zu) does not equal the number of groups (%d). This contrast list will be ignored."), i, ll_count (cl), ws->actual_number_of_groups); ll_remove (&coeff_list->ll); destroy_coeff_list (coeff_list); continue; } ll_for_each (cn, struct coeff_node, ll, cl) sum += cn->coeff; if (sum != 0.0) msg (SW, _("Coefficients for contrast %zu do not total zero"), i); } if (cmd->stats & STATS_DESCRIPTIVES) show_descriptives (cmd, ws); if (cmd->stats & STATS_HOMOGENEITY) show_homogeneity (cmd, ws); show_anova_table (cmd, ws); if (ll_count (&cmd->contrast_list) > 0) { show_contrast_coeffs (cmd, ws); show_contrast_tests (cmd, ws); } if (cmd->posthoc) { int v; for (v = 0 ; v < cmd->n_vars; ++v) { const struct categoricals *cats = covariance_get_categoricals (ws->vws[v].cov); if (categoricals_is_complete (cats)) show_comparisons (cmd, ws, v); } } } /* Show the ANOVA table */ static void show_anova_table (const struct oneway_spec *cmd, const struct oneway_workspace *ws) { struct pivot_table *table = pivot_table_create (N_("ANOVA")); pivot_dimension_create (table, PIVOT_AXIS_COLUMN, N_("Statistics"), N_("Sum of Squares"), PIVOT_RC_OTHER, N_("df"), PIVOT_RC_INTEGER, N_("Mean Square"), PIVOT_RC_OTHER, N_("F"), PIVOT_RC_OTHER, N_("Sig."), PIVOT_RC_SIGNIFICANCE); pivot_dimension_create (table, PIVOT_AXIS_ROW, N_("Type"), N_("Between Groups"), N_("Within Groups"), N_("Total")); struct pivot_dimension *variables = pivot_dimension_create ( table, PIVOT_AXIS_ROW, N_("Variables")); for (size_t i = 0; i < cmd->n_vars; ++i) { int var_idx = pivot_category_create_leaf ( variables->root, pivot_value_new_variable (cmd->vars[i])); const struct per_var_ws *pvw = &ws->vws[i]; double n; moments1_calculate (ws->dd_total[i]->mom, &n, NULL, NULL, NULL, NULL); double df1 = pvw->n_groups - 1; double df2 = n - pvw->n_groups; double msa = pvw->ssa / df1; double F = msa / pvw->mse ; struct entry { int stat_idx; int type_idx; double x; } entries[] = { /* Sums of Squares. */ { 0, 0, pvw->ssa }, { 0, 1, pvw->sse }, { 0, 2, pvw->sst }, /* Degrees of Freedom. */ { 1, 0, df1 }, { 1, 1, df2 }, { 1, 2, n - 1 }, /* Mean Squares. */ { 2, 0, msa }, { 2, 1, pvw->mse }, /* F. */ { 3, 0, F }, /* Significance. */ { 4, 0, gsl_cdf_fdist_Q (F, df1, df2) }, }; for (size_t j = 0; j < sizeof entries / sizeof *entries; j++) { const struct entry *e = &entries[j]; pivot_table_put3 (table, e->stat_idx, e->type_idx, var_idx, pivot_value_new_number (e->x)); } } pivot_table_submit (table); } /* Show the descriptives table */ static void show_descriptives (const struct oneway_spec *cmd, const struct oneway_workspace *ws) { if (!cmd->n_vars) return; const struct categoricals *cats = covariance_get_categoricals ( ws->vws[0].cov); struct pivot_table *table = pivot_table_create (N_("Descriptives")); pivot_table_set_weight_format (table, cmd->wfmt); const double confidence = 0.95; struct pivot_dimension *statistics = pivot_dimension_create ( table, PIVOT_AXIS_COLUMN, N_("Statistics"), N_("N"), PIVOT_RC_COUNT, N_("Mean"), N_("Std. Deviation"), N_("Std. Error")); struct pivot_category *interval = pivot_category_create_group__ ( statistics->root, pivot_value_new_text_format (N_("%g%% Confidence Interval for Mean"), confidence * 100.0)); pivot_category_create_leaves (interval, N_("Lower Bound"), N_("Upper Bound")); pivot_category_create_leaves (statistics->root, N_("Minimum"), N_("Maximum")); struct pivot_dimension *indep_var = pivot_dimension_create__ ( table, PIVOT_AXIS_ROW, pivot_value_new_variable (cmd->indep_var)); indep_var->root->show_label = true; size_t n; union value *values = categoricals_get_var_values (cats, cmd->indep_var, &n); for (size_t j = 0; j < n; j++) pivot_category_create_leaf ( indep_var->root, pivot_value_new_var_value (cmd->indep_var, &values[j])); pivot_category_create_leaf ( indep_var->root, pivot_value_new_text_format (N_("Total"))); struct pivot_dimension *dep_var = pivot_dimension_create ( table, PIVOT_AXIS_ROW, N_("Dependent Variable")); const double q = (1.0 - confidence) / 2.0; for (int v = 0; v < cmd->n_vars; ++v) { int dep_var_idx = pivot_category_create_leaf ( dep_var->root, pivot_value_new_variable (cmd->vars[v])); struct per_var_ws *pvw = &ws->vws[v]; const struct categoricals *cats = covariance_get_categoricals (pvw->cov); int count; for (count = 0; count < categoricals_n_total (cats); ++count) { const struct descriptive_data *dd = categoricals_get_user_data_by_category (cats, count); double n, mean, variance; moments1_calculate (dd->mom, &n, &mean, &variance, NULL, NULL); double std_dev = sqrt (variance); double std_error = std_dev / sqrt (n) ; double T = gsl_cdf_tdist_Qinv (q, n - 1); double entries[] = { n, mean, std_dev, std_error, mean - T * std_error, mean + T * std_error, dd->minimum, dd->maximum, }; for (size_t i = 0; i < sizeof entries / sizeof *entries; i++) pivot_table_put3 (table, i, count, dep_var_idx, pivot_value_new_number (entries[i])); } if (categoricals_is_complete (cats)) { double n, mean, variance; moments1_calculate (ws->dd_total[v]->mom, &n, &mean, &variance, NULL, NULL); double std_dev = sqrt (variance); double std_error = std_dev / sqrt (n) ; double T = gsl_cdf_tdist_Qinv (q, n - 1); double entries[] = { n, mean, std_dev, std_error, mean - T * std_error, mean + T * std_error, ws->dd_total[v]->minimum, ws->dd_total[v]->maximum, }; for (size_t i = 0; i < sizeof entries / sizeof *entries; i++) pivot_table_put3 (table, i, count, dep_var_idx, pivot_value_new_number (entries[i])); } } pivot_table_submit (table); } /* Show the homogeneity table */ static void show_homogeneity (const struct oneway_spec *cmd, const struct oneway_workspace *ws) { struct pivot_table *table = pivot_table_create ( N_("Test of Homogeneity of Variances")); pivot_dimension_create (table, PIVOT_AXIS_COLUMN, N_("Statistics"), N_("Levene Statistic"), PIVOT_RC_OTHER, N_("df1"), PIVOT_RC_INTEGER, N_("df2"), PIVOT_RC_INTEGER, N_("Sig."), PIVOT_RC_SIGNIFICANCE); struct pivot_dimension *variables = pivot_dimension_create ( table, PIVOT_AXIS_ROW, N_("Variables")); for (int v = 0; v < cmd->n_vars; ++v) { int var_idx = pivot_category_create_leaf ( variables->root, pivot_value_new_variable (cmd->vars[v])); double n; moments1_calculate (ws->dd_total[v]->mom, &n, NULL, NULL, NULL, NULL); const struct per_var_ws *pvw = &ws->vws[v]; double df1 = pvw->n_groups - 1; double df2 = n - pvw->n_groups; double F = levene_calculate (pvw->nl); double entries[] = { F, df1, df2, gsl_cdf_fdist_Q (F, df1, df2), }; for (size_t i = 0; i < sizeof entries / sizeof *entries; i++) pivot_table_put2 (table, i, var_idx, pivot_value_new_number (entries[i])); } pivot_table_submit (table); } /* Show the contrast coefficients table */ static void show_contrast_coeffs (const struct oneway_spec *cmd, const struct oneway_workspace *ws) { struct pivot_table *table = pivot_table_create (N_("Contrast Coefficients")); struct pivot_dimension *indep_var = pivot_dimension_create__ ( table, PIVOT_AXIS_COLUMN, pivot_value_new_variable (cmd->indep_var)); indep_var->root->show_label = true; struct pivot_dimension *contrast = pivot_dimension_create ( table, PIVOT_AXIS_ROW, N_("Contrast")); contrast->root->show_label = true; const struct covariance *cov = ws->vws[0].cov; const struct contrasts_node *cn; int c_num = 1; ll_for_each (cn, struct contrasts_node, ll, &cmd->contrast_list) { int contrast_idx = pivot_category_create_leaf ( contrast->root, pivot_value_new_integer (c_num++)); const struct coeff_node *coeffn; int indep_idx = 0; ll_for_each (coeffn, struct coeff_node, ll, &cn->coefficient_list) { const struct categoricals *cats = covariance_get_categoricals (cov); const struct ccase *gcc = categoricals_get_case_by_category ( cats, indep_idx); if (!contrast_idx) pivot_category_create_leaf ( indep_var->root, pivot_value_new_var_value ( cmd->indep_var, case_data (gcc, cmd->indep_var))); pivot_table_put2 (table, indep_idx++, contrast_idx, pivot_value_new_integer (coeffn->coeff)); } } pivot_table_submit (table); } /* Show the results of the contrast tests */ static void show_contrast_tests (const struct oneway_spec *cmd, const struct oneway_workspace *ws) { struct pivot_table *table = pivot_table_create (N_("Contrast Tests")); pivot_dimension_create (table, PIVOT_AXIS_COLUMN, N_("Statistics"), N_("Value of Contrast"), PIVOT_RC_OTHER, N_("Std. Error"), PIVOT_RC_OTHER, N_("t"), PIVOT_RC_OTHER, N_("df"), PIVOT_RC_OTHER, N_("Sig. (2-tailed)"), PIVOT_RC_SIGNIFICANCE); struct pivot_dimension *contrasts = pivot_dimension_create ( table, PIVOT_AXIS_ROW, N_("Contrast")); contrasts->root->show_label = true; int n_contrasts = ll_count (&cmd->contrast_list); for (int i = 1; i <= n_contrasts; i++) pivot_category_create_leaf (contrasts->root, pivot_value_new_integer (i)); pivot_dimension_create (table, PIVOT_AXIS_ROW, N_("Assumption"), N_("Assume equal variances"), N_("Does not assume equal variances")); struct pivot_dimension *variables = pivot_dimension_create ( table, PIVOT_AXIS_ROW, N_("Dependent Variable")); for (int v = 0; v < cmd->n_vars; ++v) { const struct per_var_ws *pvw = &ws->vws[v]; const struct categoricals *cats = covariance_get_categoricals (pvw->cov); if (!categoricals_is_complete (cats)) continue; int var_idx = pivot_category_create_leaf ( variables->root, pivot_value_new_variable (cmd->vars[v])); struct contrasts_node *cn; int contrast_idx = 0; ll_for_each (cn, struct contrasts_node, ll, &cmd->contrast_list) { /* Note: The calculation of the degrees of freedom in the "variances not equal" case is painfull!! The following formula may help to understand it: \frac{\left (\sum_{i=1}^k{c_i^2\frac{s_i^2}{n_i}}\right)^2} { \sum_{i=1}^k\left ( \frac{\left (c_i^2\frac{s_i^2}{n_i}\right)^2} {n_i-1} \right) } */ double grand_n; moments1_calculate (ws->dd_total[v]->mom, &grand_n, NULL, NULL, NULL, NULL); double df = grand_n - pvw->n_groups; double contrast_value = 0.0; double coef_msq = 0.0; double sec_vneq = 0.0; double df_denominator = 0.0; double df_numerator = 0.0; struct coeff_node *coeffn; int ci = 0; ll_for_each (coeffn, struct coeff_node, ll, &cn->coefficient_list) { const struct descriptive_data *dd = categoricals_get_user_data_by_category (cats, ci); const double coef = coeffn->coeff; double n, mean, variance; moments1_calculate (dd->mom, &n, &mean, &variance, NULL, NULL); double winv = variance / n; contrast_value += coef * mean; coef_msq += pow2 (coef) / n; sec_vneq += pow2 (coef) * variance / n; df_numerator += pow2 (coef) * winv; df_denominator += pow2(pow2 (coef) * winv) / (n - 1); ci++; } sec_vneq = sqrt (sec_vneq); df_numerator = pow2 (df_numerator); double std_error_contrast = sqrt (pvw->mse * coef_msq); double T = fabs (contrast_value / std_error_contrast); double T_ne = contrast_value / sec_vneq; double df_ne = df_numerator / df_denominator; double p_ne = gsl_cdf_tdist_P (T_ne, df_ne); double q_ne = gsl_cdf_tdist_Q (T_ne, df_ne); struct entry { int stat_idx; int assumption_idx; double x; } entries[] = { /* Assume equal. */ { 0, 0, contrast_value }, { 1, 0, std_error_contrast }, { 2, 0, T }, { 3, 0, df }, { 4, 0, 2 * gsl_cdf_tdist_Q (T, df) }, /* Do not assume equal. */ { 0, 1, contrast_value }, { 1, 1, sec_vneq }, { 2, 1, T_ne }, { 3, 1, df_ne }, { 4, 1, 2 * (T > 0 ? q_ne : p_ne) }, }; for (size_t i = 0; i < sizeof entries / sizeof *entries; i++) { const struct entry *e = &entries[i]; pivot_table_put4 ( table, e->stat_idx, contrast_idx, e->assumption_idx, var_idx, pivot_value_new_number (e->x)); } contrast_idx++; } } pivot_table_submit (table); } static void show_comparisons (const struct oneway_spec *cmd, const struct oneway_workspace *ws, int v) { struct pivot_table *table = pivot_table_create__ ( pivot_value_new_user_text_nocopy (xasprintf ( _("Multiple Comparisons (%s)"), var_to_string (cmd->vars[v]))), "Multiple Comparisons"); table->omit_empty = true; struct pivot_dimension *statistics = pivot_dimension_create ( table, PIVOT_AXIS_COLUMN, N_("Statistics"), N_("Mean Difference (I - J)"), PIVOT_RC_OTHER, N_("Std. Error"), PIVOT_RC_OTHER, N_("Sig."), PIVOT_RC_SIGNIFICANCE); struct pivot_category *interval = pivot_category_create_group__ ( statistics->root, pivot_value_new_text_format (N_("%g%% Confidence Interval"), (1 - cmd->alpha) * 100.0)); pivot_category_create_leaves (interval, N_("Lower Bound"), PIVOT_RC_OTHER, N_("Upper Bound"), PIVOT_RC_OTHER); struct pivot_dimension *j_family = pivot_dimension_create ( table, PIVOT_AXIS_ROW, N_("(J) Family")); j_family->root->show_label = true; struct pivot_dimension *i_family = pivot_dimension_create ( table, PIVOT_AXIS_ROW, N_("(J) Family")); i_family->root->show_label = true; const struct per_var_ws *pvw = &ws->vws[v]; const struct categoricals *cat = pvw->cat; for (int i = 0; i < pvw->n_groups; i++) { const struct ccase *gcc = categoricals_get_case_by_category (cat, i); for (int j = 0; j < 2; j++) pivot_category_create_leaf ( j ? j_family->root : i_family->root, pivot_value_new_var_value (cmd->indep_var, case_data (gcc, cmd->indep_var))); } struct pivot_dimension *test = pivot_dimension_create ( table, PIVOT_AXIS_ROW, N_("Test")); for (int p = 0; p < cmd->n_posthoc; ++p) { const struct posthoc *ph = &ph_tests[cmd->posthoc[p]]; int test_idx = pivot_category_create_leaf ( test->root, pivot_value_new_text (ph->label)); for (int i = 0; i < pvw->n_groups ; ++i) { struct descriptive_data *dd_i = categoricals_get_user_data_by_category (cat, i); double weight_i, mean_i, var_i; moments1_calculate (dd_i->mom, &weight_i, &mean_i, &var_i, 0, 0); for (int j = 0 ; j < pvw->n_groups; ++j) { if (j == i) continue; struct descriptive_data *dd_j = categoricals_get_user_data_by_category (cat, j); double weight_j, mean_j, var_j; moments1_calculate (dd_j->mom, &weight_j, &mean_j, &var_j, 0, 0); double std_err = pvw->mse; std_err *= weight_i + weight_j; std_err /= weight_i * weight_j; std_err = sqrt (std_err); double sig = 2 * multiple_comparison_sig (std_err, pvw, dd_i, dd_j, ph); double half_range = mc_half_range (cmd, pvw, std_err, dd_i, dd_j, ph); double entries[] = { mean_i - mean_j, std_err, sig, (mean_i - mean_j) - half_range, (mean_i - mean_j) + half_range, }; for (size_t k = 0; k < sizeof entries / sizeof *entries; k++) pivot_table_put4 (table, k, j, i, test_idx, pivot_value_new_number (entries[k])); } } } pivot_table_submit (table); } pspp-1.4.1/src/language/stats/freq.h0000644000175000017500000000356513405120551016736 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2006, 2010, 2015 Free Software Foundation, Inc. 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 3 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, see . */ #ifndef LANGUAGE_STATS_FREQ_H #define LANGUAGE_STATS_FREQ_H 1 #include "data/value.h" #include "libpspp/hmap.h" /* Frequency table entry. */ struct freq { struct hmap_node node; /* Element in hash table. */ double count; /* The number of occurrences of the value. */ union value values[1]; /* The value. */ }; struct freq *freq_clone (const struct freq *, int values, int *widths); void freq_destroy (struct freq *f, int values, int *widths); static inline size_t table_entry_size (size_t n_values) { return (offsetof (struct freq, values) + n_values * sizeof (union value)); } int compare_freq_ptr_3way (const void *a_, const void *b_, const void *width_); void freq_hmap_destroy (struct hmap *, int width); struct freq *freq_hmap_search (struct hmap *, const union value *, int width, size_t hash); struct freq *freq_hmap_insert (struct hmap *, const union value *, int width, size_t hash); struct freq **freq_hmap_sort (struct hmap *, int width); struct freq *freq_hmap_extract (struct hmap *); #endif /* language/stats/freq.h */ pspp-1.4.1/src/language/stats/logistic.c0000644000175000017500000011525013670210420017603 0ustar00blpblp00000000000000/* pspp - a program for statistical analysis. Copyright (C) 2012 Free Software Foundation, Inc. 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 3 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, see . */ /* References: 1. "Coding Logistic Regression with Newton-Raphson", James McCaffrey http://msdn.microsoft.com/en-us/magazine/jj618304.aspx 2. "SPSS Statistical Algorithms" Chapter LOGISTIC REGRESSION Algorithms The Newton Raphson method finds successive approximations to $\bf b$ where approximation ${\bf b}_t$ is (hopefully) better than the previous ${\bf b}_{t-1}$. $ {\bf b}_t = {\bf b}_{t -1} + ({\bf X}^T{\bf W}_{t-1}{\bf X})^{-1}{\bf X}^T({\bf y} - {\bf \pi}_{t-1})$ where: $\bf X$ is the $n \times p$ design matrix, $n$ being the number of cases, $p$ the number of parameters, \par $\bf W$ is the diagonal matrix whose diagonal elements are $\hat{\pi}_0(1 - \hat{\pi}_0), \, \hat{\pi}_1(1 - \hat{\pi}_2)\dots \hat{\pi}_{n-1}(1 - \hat{\pi}_{n-1})$ \par */ #include #include #include #include #include #include #include #include "data/case.h" #include "data/casegrouper.h" #include "data/casereader.h" #include "data/dataset.h" #include "data/dictionary.h" #include "data/format.h" #include "data/value.h" #include "language/command.h" #include "language/dictionary/split-file.h" #include "language/lexer/lexer.h" #include "language/lexer/value-parser.h" #include "language/lexer/variable-parser.h" #include "libpspp/assertion.h" #include "libpspp/hash-functions.h" #include "libpspp/hmap.h" #include "libpspp/ll.h" #include "libpspp/message.h" #include "libpspp/misc.h" #include "math/categoricals.h" #include "math/interaction.h" #include "output/pivot-table.h" #include "gettext.h" #define N_(msgid) msgid #define _(msgid) gettext (msgid) #define PRINT_EACH_STEP 0x01 #define PRINT_SUMMARY 0x02 #define PRINT_CORR 0x04 #define PRINT_ITER 0x08 #define PRINT_GOODFIT 0x10 #define PRINT_CI 0x20 #define PRINT_DEFAULT (PRINT_SUMMARY | PRINT_EACH_STEP) /* The constant parameters of the procedure. That is, those which are set by the user. */ struct lr_spec { /* The dependent variable */ const struct variable *dep_var; /* The predictor variables (excluding categorical ones) */ const struct variable **predictor_vars; size_t n_predictor_vars; /* The categorical predictors */ struct interaction **cat_predictors; size_t n_cat_predictors; /* The union of the categorical and non-categorical variables */ const struct variable **indep_vars; size_t n_indep_vars; /* Which classes of missing vars are to be excluded */ enum mv_class exclude; /* The weight variable */ const struct variable *wv; /* The dictionary of the dataset */ const struct dictionary *dict; /* True iff the constant (intercept) is to be included in the model */ bool constant; /* Ths maximum number of iterations */ int max_iter; /* Other iteration limiting conditions */ double bcon; double min_epsilon; double lcon; /* The confidence interval (in percent) */ int confidence; /* What results should be presented */ unsigned int print; /* Inverse logit of the cut point */ double ilogit_cut_point; }; /* The results and intermediate result of the procedure. These are mutated as the procedure runs. Used for temporary variables etc. */ struct lr_result { /* Used to indicate if a pass should flag a warning when invalid (ie negative or missing) weight values are encountered */ bool warn_bad_weight; /* The two values of the dependent variable. */ union value y0; union value y1; /* The sum of caseweights */ double cc; /* The number of missing and nonmissing cases */ casenumber n_missing; casenumber n_nonmissing; gsl_matrix *hessian; /* The categoricals and their payload. Null if the analysis has no categorical predictors */ struct categoricals *cats; struct payload cp; /* The estimates of the predictor coefficients */ gsl_vector *beta_hat; /* The predicted classifications: True Negative, True Positive, False Negative, False Positive */ double tn, tp, fn, fp; }; /* Convert INPUT into a dichotomous scalar, according to how the dependent variable's values are mapped. For simple cases, this is a 1:1 mapping The return value is always either 0 or 1 */ static double map_dependent_var (const struct lr_spec *cmd, const struct lr_result *res, const union value *input) { const int width = var_get_width (cmd->dep_var); if (value_equal (input, &res->y0, width)) return 0; if (value_equal (input, &res->y1, width)) return 1; /* This should never happen. If it does, then y0 and/or y1 have probably not been set */ NOT_REACHED (); return SYSMIS; } static void output_classification_table (const struct lr_spec *cmd, const struct lr_result *res); static void output_categories (const struct lr_spec *cmd, const struct lr_result *res); static void output_depvarmap (const struct lr_spec *cmd, const struct lr_result *); static void output_variables (const struct lr_spec *cmd, const struct lr_result *); static void output_model_summary (const struct lr_result *, double initial_likelihood, double likelihood); static void case_processing_summary (const struct lr_result *); /* Return the value of case C corresponding to the INDEX'th entry in the model */ static double predictor_value (const struct ccase *c, const struct variable **x, size_t n_x, const struct categoricals *cats, size_t index) { /* Values of the scalar predictor variables */ if (index < n_x) return case_data (c, x[index])->f; /* Coded values of categorical predictor variables (or interactions) */ if (cats && index - n_x < categoricals_df_total (cats)) { double x = categoricals_get_dummy_code_for_case (cats, index - n_x, c); return x; } /* The constant term */ return 1.0; } /* Return the probability beta_hat (that is the estimator logit(y)) corresponding to the coefficient estimator for case C */ static double pi_hat (const struct lr_spec *cmd, const struct lr_result *res, const struct variable **x, size_t n_x, const struct ccase *c) { int v0; double pi = 0; size_t n_coeffs = res->beta_hat->size; if (cmd->constant) { pi += gsl_vector_get (res->beta_hat, res->beta_hat->size - 1); n_coeffs--; } for (v0 = 0; v0 < n_coeffs; ++v0) { pi += gsl_vector_get (res->beta_hat, v0) * predictor_value (c, x, n_x, res->cats, v0); } pi = 1.0 / (1.0 + exp(-pi)); return pi; } /* Calculates the Hessian matrix X' V X, where: X is the n by N_X matrix comprising the n cases in INPUT V is a diagonal matrix { (pi_hat_0)(1 - pi_hat_0), (pi_hat_1)(1 - pi_hat_1), ... (pi_hat_{N-1})(1 - pi_hat_{N-1})} (the partial derivative of the predicted values) If ALL predicted values derivatives are close to zero or one, then CONVERGED will be set to true. */ static void hessian (const struct lr_spec *cmd, struct lr_result *res, struct casereader *input, const struct variable **x, size_t n_x, bool *converged) { struct casereader *reader; struct ccase *c; double max_w = -DBL_MAX; gsl_matrix_set_zero (res->hessian); for (reader = casereader_clone (input); (c = casereader_read (reader)) != NULL; case_unref (c)) { int v0, v1; double pi = pi_hat (cmd, res, x, n_x, c); double weight = dict_get_case_weight (cmd->dict, c, &res->warn_bad_weight); double w = pi * (1 - pi); if (w > max_w) max_w = w; w *= weight; for (v0 = 0; v0 < res->beta_hat->size; ++v0) { double in0 = predictor_value (c, x, n_x, res->cats, v0); for (v1 = 0; v1 < res->beta_hat->size; ++v1) { double in1 = predictor_value (c, x, n_x, res->cats, v1); double *o = gsl_matrix_ptr (res->hessian, v0, v1); *o += in0 * w * in1; } } } casereader_destroy (reader); if (max_w < cmd->min_epsilon) { *converged = true; msg (MN, _("All predicted values are either 1 or 0")); } } /* Calculates the value X' (y - pi) where X is the design model, y is the vector of observed independent variables pi is the vector of estimates for y Side effects: the likelihood is stored in LIKELIHOOD; the predicted values are placed in the respective tn, fn, tp fp values in RES */ static gsl_vector * xt_times_y_pi (const struct lr_spec *cmd, struct lr_result *res, struct casereader *input, const struct variable **x, size_t n_x, const struct variable *y_var, double *llikelihood) { struct casereader *reader; struct ccase *c; gsl_vector *output = gsl_vector_calloc (res->beta_hat->size); *llikelihood = 0.0; res->tn = res->tp = res->fn = res->fp = 0; for (reader = casereader_clone (input); (c = casereader_read (reader)) != NULL; case_unref (c)) { double pred_y = 0; int v0; double pi = pi_hat (cmd, res, x, n_x, c); double weight = dict_get_case_weight (cmd->dict, c, &res->warn_bad_weight); double y = map_dependent_var (cmd, res, case_data (c, y_var)); *llikelihood += (weight * y) * log (pi) + log (1 - pi) * weight * (1 - y); for (v0 = 0; v0 < res->beta_hat->size; ++v0) { double in0 = predictor_value (c, x, n_x, res->cats, v0); double *o = gsl_vector_ptr (output, v0); *o += in0 * (y - pi) * weight; pred_y += gsl_vector_get (res->beta_hat, v0) * in0; } /* Count the number of cases which would be correctly/incorrectly classified by this estimated model */ if (pred_y <= cmd->ilogit_cut_point) { if (y == 0) res->tn += weight; else res->fn += weight; } else { if (y == 0) res->fp += weight; else res->tp += weight; } } casereader_destroy (reader); return output; } /* "payload" functions for the categoricals. The only function is to accumulate the frequency of each category. */ static void * frq_create (const void *aux1 UNUSED, void *aux2 UNUSED) { return xzalloc (sizeof (double)); } static void frq_update (const void *aux1 UNUSED, void *aux2 UNUSED, void *ud, const struct ccase *c UNUSED , double weight) { double *freq = ud; *freq += weight; } static void frq_destroy (const void *aux1 UNUSED, void *aux2 UNUSED, void *user_data) { free (user_data); } /* Makes an initial pass though the data, doing the following: * Checks that the dependent variable is dichotomous, * Creates and initialises the categoricals, * Accumulates summary results, * Calculates necessary initial values. * Creates an initial value for \hat\beta the vector of beta_hats of \beta Returns true if successful */ static bool initial_pass (const struct lr_spec *cmd, struct lr_result *res, struct casereader *input) { const int width = var_get_width (cmd->dep_var); struct ccase *c; struct casereader *reader; double sum; double sumA = 0.0; double sumB = 0.0; bool v0set = false; bool v1set = false; size_t n_coefficients = cmd->n_predictor_vars; if (cmd->constant) n_coefficients++; /* Create categoricals if appropriate */ if (cmd->n_cat_predictors > 0) { res->cp.create = frq_create; res->cp.update = frq_update; res->cp.calculate = NULL; res->cp.destroy = frq_destroy; res->cats = categoricals_create (cmd->cat_predictors, cmd->n_cat_predictors, cmd->wv, MV_ANY); categoricals_set_payload (res->cats, &res->cp, cmd, res); } res->cc = 0; for (reader = casereader_clone (input); (c = casereader_read (reader)) != NULL; case_unref (c)) { int v; bool missing = false; double weight = dict_get_case_weight (cmd->dict, c, &res->warn_bad_weight); const union value *depval = case_data (c, cmd->dep_var); if (var_is_value_missing (cmd->dep_var, depval, cmd->exclude)) { missing = true; } else for (v = 0; v < cmd->n_indep_vars; ++v) { const union value *val = case_data (c, cmd->indep_vars[v]); if (var_is_value_missing (cmd->indep_vars[v], val, cmd->exclude)) { missing = true; break; } } /* Accumulate the missing and non-missing counts */ if (missing) { res->n_missing++; continue; } res->n_nonmissing++; /* Find the values of the dependent variable */ if (!v0set) { value_clone (&res->y0, depval, width); v0set = true; } else if (!v1set) { if (!value_equal (&res->y0, depval, width)) { value_clone (&res->y1, depval, width); v1set = true; } } else { if (! value_equal (&res->y0, depval, width) && ! value_equal (&res->y1, depval, width) ) { msg (ME, _("Dependent variable's values are not dichotomous.")); case_unref (c); goto error; } } if (v0set && value_equal (&res->y0, depval, width)) sumA += weight; if (v1set && value_equal (&res->y1, depval, width)) sumB += weight; res->cc += weight; categoricals_update (res->cats, c); } casereader_destroy (reader); categoricals_done (res->cats); sum = sumB; /* Ensure that Y0 is less than Y1. Otherwise the mapping gets inverted, which is confusing to users */ if (var_is_numeric (cmd->dep_var) && value_compare_3way (&res->y0, &res->y1, width) > 0) { union value tmp; value_clone (&tmp, &res->y0, width); value_copy (&res->y0, &res->y1, width); value_copy (&res->y1, &tmp, width); value_destroy (&tmp, width); sum = sumA; } n_coefficients += categoricals_df_total (res->cats); res->beta_hat = gsl_vector_calloc (n_coefficients); if (cmd->constant) { double mean = sum / res->cc; gsl_vector_set (res->beta_hat, res->beta_hat->size - 1, log (mean / (1 - mean))); } return true; error: casereader_destroy (reader); return false; } /* Start of the logistic regression routine proper */ static bool run_lr (const struct lr_spec *cmd, struct casereader *input, const struct dataset *ds UNUSED) { int i; bool converged = false; /* Set the log likelihoods to a sentinel value */ double log_likelihood = SYSMIS; double prev_log_likelihood = SYSMIS; double initial_log_likelihood = SYSMIS; struct lr_result work; work.n_missing = 0; work.n_nonmissing = 0; work.warn_bad_weight = true; work.cats = NULL; work.beta_hat = NULL; work.hessian = NULL; /* Get the initial estimates of \beta and their standard errors. And perform other auxiliary initialisation. */ if (! initial_pass (cmd, &work, input)) goto error; for (i = 0; i < cmd->n_cat_predictors; ++i) { if (1 >= categoricals_n_count (work.cats, i)) { struct string str; ds_init_empty (&str); interaction_to_string (cmd->cat_predictors[i], &str); msg (ME, _("Category %s does not have at least two distinct values. Logistic regression will not be run."), ds_cstr(&str)); ds_destroy (&str); goto error; } } output_depvarmap (cmd, &work); case_processing_summary (&work); input = casereader_create_filter_missing (input, cmd->indep_vars, cmd->n_indep_vars, cmd->exclude, NULL, NULL); input = casereader_create_filter_missing (input, &cmd->dep_var, 1, cmd->exclude, NULL, NULL); work.hessian = gsl_matrix_calloc (work.beta_hat->size, work.beta_hat->size); /* Start the Newton Raphson iteration process... */ for(i = 0 ; i < cmd->max_iter ; ++i) { double min, max; gsl_vector *v ; hessian (cmd, &work, input, cmd->predictor_vars, cmd->n_predictor_vars, &converged); gsl_linalg_cholesky_decomp (work.hessian); gsl_linalg_cholesky_invert (work.hessian); v = xt_times_y_pi (cmd, &work, input, cmd->predictor_vars, cmd->n_predictor_vars, cmd->dep_var, &log_likelihood); { /* delta = M.v */ gsl_vector *delta = gsl_vector_alloc (v->size); gsl_blas_dgemv (CblasNoTrans, 1.0, work.hessian, v, 0, delta); gsl_vector_free (v); gsl_vector_add (work.beta_hat, delta); gsl_vector_minmax (delta, &min, &max); if (fabs (min) < cmd->bcon && fabs (max) < cmd->bcon) { msg (MN, _("Estimation terminated at iteration number %d because parameter estimates changed by less than %g"), i + 1, cmd->bcon); converged = true; } gsl_vector_free (delta); } if (i > 0) { if (-log_likelihood > -(1.0 - cmd->lcon) * prev_log_likelihood) { msg (MN, _("Estimation terminated at iteration number %d because Log Likelihood decreased by less than %g%%"), i + 1, 100 * cmd->lcon); converged = true; } } if (i == 0) initial_log_likelihood = log_likelihood; prev_log_likelihood = log_likelihood; if (converged) break; } if (! converged) msg (MW, _("Estimation terminated at iteration number %d because maximum iterations has been reached"), i); output_model_summary (&work, initial_log_likelihood, log_likelihood); if (work.cats) output_categories (cmd, &work); output_classification_table (cmd, &work); output_variables (cmd, &work); casereader_destroy (input); gsl_matrix_free (work.hessian); gsl_vector_free (work.beta_hat); categoricals_destroy (work.cats); return true; error: casereader_destroy (input); gsl_matrix_free (work.hessian); gsl_vector_free (work.beta_hat); categoricals_destroy (work.cats); return false; } struct variable_node { struct hmap_node node; /* Node in hash map. */ const struct variable *var; /* The variable */ }; static struct variable_node * lookup_variable (const struct hmap *map, const struct variable *var, unsigned int hash) { struct variable_node *vn = NULL; HMAP_FOR_EACH_WITH_HASH (vn, struct variable_node, node, hash, map) { if (vn->var == var) break; } return vn; } /* Parse the LOGISTIC REGRESSION command syntax */ int cmd_logistic (struct lexer *lexer, struct dataset *ds) { int i; /* Temporary location for the predictor variables. These may or may not include the categorical predictors */ const struct variable **pred_vars; size_t n_pred_vars; double cp = 0.5; int v, x; struct lr_spec lr; lr.dict = dataset_dict (ds); lr.n_predictor_vars = 0; lr.predictor_vars = NULL; lr.exclude = MV_ANY; lr.wv = dict_get_weight (lr.dict); lr.max_iter = 20; lr.lcon = 0.0000; lr.bcon = 0.001; lr.min_epsilon = 0.00000001; lr.constant = true; lr.confidence = 95; lr.print = PRINT_DEFAULT; lr.cat_predictors = NULL; lr.n_cat_predictors = 0; lr.indep_vars = NULL; if (lex_match_id (lexer, "VARIABLES")) lex_match (lexer, T_EQUALS); if (! (lr.dep_var = parse_variable_const (lexer, lr.dict))) goto error; if (! lex_force_match (lexer, T_WITH)) goto error; if (!parse_variables_const (lexer, lr.dict, &pred_vars, &n_pred_vars, PV_NO_DUPLICATE)) goto error; while (lex_token (lexer) != T_ENDCMD) { lex_match (lexer, T_SLASH); if (lex_match_id (lexer, "MISSING")) { lex_match (lexer, T_EQUALS); while (lex_token (lexer) != T_ENDCMD && lex_token (lexer) != T_SLASH) { if (lex_match_id (lexer, "INCLUDE")) { lr.exclude = MV_SYSTEM; } else if (lex_match_id (lexer, "EXCLUDE")) { lr.exclude = MV_ANY; } else { lex_error (lexer, NULL); goto error; } } } else if (lex_match_id (lexer, "ORIGIN")) { lr.constant = false; } else if (lex_match_id (lexer, "NOORIGIN")) { lr.constant = true; } else if (lex_match_id (lexer, "NOCONST")) { lr.constant = false; } else if (lex_match_id (lexer, "EXTERNAL")) { /* This is for compatibility. It does nothing */ } else if (lex_match_id (lexer, "CATEGORICAL")) { lex_match (lexer, T_EQUALS); do { lr.cat_predictors = xrealloc (lr.cat_predictors, sizeof (*lr.cat_predictors) * ++lr.n_cat_predictors); lr.cat_predictors[lr.n_cat_predictors - 1] = 0; } while (parse_design_interaction (lexer, lr.dict, lr.cat_predictors + lr.n_cat_predictors - 1)); lr.n_cat_predictors--; } else if (lex_match_id (lexer, "PRINT")) { lex_match (lexer, T_EQUALS); while (lex_token (lexer) != T_ENDCMD && lex_token (lexer) != T_SLASH) { if (lex_match_id (lexer, "DEFAULT")) { lr.print |= PRINT_DEFAULT; } else if (lex_match_id (lexer, "SUMMARY")) { lr.print |= PRINT_SUMMARY; } #if 0 else if (lex_match_id (lexer, "CORR")) { lr.print |= PRINT_CORR; } else if (lex_match_id (lexer, "ITER")) { lr.print |= PRINT_ITER; } else if (lex_match_id (lexer, "GOODFIT")) { lr.print |= PRINT_GOODFIT; } #endif else if (lex_match_id (lexer, "CI")) { lr.print |= PRINT_CI; if (lex_force_match (lexer, T_LPAREN)) { if (! lex_force_num (lexer)) { lex_error (lexer, NULL); goto error; } lr.confidence = lex_number (lexer); lex_get (lexer); if (! lex_force_match (lexer, T_RPAREN)) { lex_error (lexer, NULL); goto error; } } } else if (lex_match_id (lexer, "ALL")) { lr.print = ~0x0000; } else { lex_error (lexer, NULL); goto error; } } } else if (lex_match_id (lexer, "CRITERIA")) { lex_match (lexer, T_EQUALS); while (lex_token (lexer) != T_ENDCMD && lex_token (lexer) != T_SLASH) { if (lex_match_id (lexer, "BCON")) { if (lex_force_match (lexer, T_LPAREN)) { if (! lex_force_num (lexer)) { lex_error (lexer, NULL); goto error; } lr.bcon = lex_number (lexer); lex_get (lexer); if (! lex_force_match (lexer, T_RPAREN)) { lex_error (lexer, NULL); goto error; } } } else if (lex_match_id (lexer, "ITERATE")) { if (lex_force_match (lexer, T_LPAREN)) { if (! lex_force_int (lexer)) { lex_error (lexer, NULL); goto error; } lr.max_iter = lex_integer (lexer); lex_get (lexer); if (! lex_force_match (lexer, T_RPAREN)) { lex_error (lexer, NULL); goto error; } } } else if (lex_match_id (lexer, "LCON")) { if (lex_force_match (lexer, T_LPAREN)) { if (! lex_force_num (lexer)) { lex_error (lexer, NULL); goto error; } lr.lcon = lex_number (lexer); lex_get (lexer); if (! lex_force_match (lexer, T_RPAREN)) { lex_error (lexer, NULL); goto error; } } } else if (lex_match_id (lexer, "EPS")) { if (lex_force_match (lexer, T_LPAREN)) { if (! lex_force_num (lexer)) { lex_error (lexer, NULL); goto error; } lr.min_epsilon = lex_number (lexer); lex_get (lexer); if (! lex_force_match (lexer, T_RPAREN)) { lex_error (lexer, NULL); goto error; } } } else if (lex_match_id (lexer, "CUT")) { if (lex_force_match (lexer, T_LPAREN)) { if (! lex_force_num (lexer)) { lex_error (lexer, NULL); goto error; } cp = lex_number (lexer); if (cp < 0 || cp > 1.0) { msg (ME, _("Cut point value must be in the range [0,1]")); goto error; } lex_get (lexer); if (! lex_force_match (lexer, T_RPAREN)) { lex_error (lexer, NULL); goto error; } } } else { lex_error (lexer, NULL); goto error; } } } else { lex_error (lexer, NULL); goto error; } } lr.ilogit_cut_point = - log (1/cp - 1); /* Copy the predictor variables from the temporary location into the final one, dropping any categorical variables which appear there. FIXME: This is O(NxM). */ { struct variable_node *vn, *next; struct hmap allvars; hmap_init (&allvars); for (v = x = 0; v < n_pred_vars; ++v) { bool drop = false; const struct variable *var = pred_vars[v]; int cv = 0; unsigned int hash = hash_pointer (var, 0); struct variable_node *vn = lookup_variable (&allvars, var, hash); if (vn == NULL) { vn = xmalloc (sizeof *vn); vn->var = var; hmap_insert (&allvars, &vn->node, hash); } for (cv = 0; cv < lr.n_cat_predictors ; ++cv) { int iv; const struct interaction *iact = lr.cat_predictors[cv]; for (iv = 0 ; iv < iact->n_vars ; ++iv) { const struct variable *ivar = iact->vars[iv]; unsigned int hash = hash_pointer (ivar, 0); struct variable_node *vn = lookup_variable (&allvars, ivar, hash); if (vn == NULL) { vn = xmalloc (sizeof *vn); vn->var = ivar; hmap_insert (&allvars, &vn->node, hash); } if (var == ivar) { drop = true; } } } if (drop) continue; lr.predictor_vars = xrealloc (lr.predictor_vars, sizeof *lr.predictor_vars * (x + 1)); lr.predictor_vars[x++] = var; lr.n_predictor_vars++; } free (pred_vars); lr.n_indep_vars = hmap_count (&allvars); lr.indep_vars = xmalloc (lr.n_indep_vars * sizeof *lr.indep_vars); /* Interate over each variable and push it into the array */ x = 0; HMAP_FOR_EACH_SAFE (vn, next, struct variable_node, node, &allvars) { lr.indep_vars[x++] = vn->var; free (vn); } hmap_destroy (&allvars); } /* logistical regression for each split group */ { struct casegrouper *grouper; struct casereader *group; bool ok; grouper = casegrouper_create_splits (proc_open (ds), lr.dict); while (casegrouper_get_next_group (grouper, &group)) ok = run_lr (&lr, group, ds); ok = casegrouper_destroy (grouper); ok = proc_commit (ds) && ok; } for (i = 0 ; i < lr.n_cat_predictors; ++i) { interaction_destroy (lr.cat_predictors[i]); } free (lr.predictor_vars); free (lr.cat_predictors); free (lr.indep_vars); return CMD_SUCCESS; error: for (i = 0 ; i < lr.n_cat_predictors; ++i) { interaction_destroy (lr.cat_predictors[i]); } free (lr.predictor_vars); free (lr.cat_predictors); free (lr.indep_vars); return CMD_FAILURE; } /* Show the Dependent Variable Encoding box. This indicates how the dependent variable is mapped to the internal zero/one values. */ static void output_depvarmap (const struct lr_spec *cmd, const struct lr_result *res) { struct pivot_table *table = pivot_table_create ( N_("Dependent Variable Encoding")); pivot_dimension_create (table, PIVOT_AXIS_COLUMN, N_("Mapping"), N_("Internal Value")); struct pivot_dimension *original = pivot_dimension_create ( table, PIVOT_AXIS_ROW, N_("Original Value")); original->root->show_label = true; for (int i = 0; i < 2; i++) { const union value *v = i ? &res->y1 : &res->y0; int orig_idx = pivot_category_create_leaf ( original->root, pivot_value_new_var_value (cmd->dep_var, v)); pivot_table_put2 (table, 0, orig_idx, pivot_value_new_number ( map_dependent_var (cmd, res, v))); } pivot_table_submit (table); } /* Show the Variables in the Equation box */ static void output_variables (const struct lr_spec *cmd, const struct lr_result *res) { struct pivot_table *table = pivot_table_create ( N_("Variables in the Equation")); struct pivot_dimension *statistics = pivot_dimension_create ( table, PIVOT_AXIS_COLUMN, N_("Statistics"), N_("B"), PIVOT_RC_OTHER, N_("S.E."), PIVOT_RC_OTHER, N_("Wald"), PIVOT_RC_OTHER, N_("df"), PIVOT_RC_INTEGER, N_("Sig."), PIVOT_RC_SIGNIFICANCE, N_("Exp(B)"), PIVOT_RC_OTHER); if (cmd->print & PRINT_CI) { struct pivot_category *group = pivot_category_create_group__ ( statistics->root, pivot_value_new_text_format (N_("%d%% CI for Exp(B)"), cmd->confidence)); pivot_category_create_leaves (group, N_("Lower"), N_("Upper")); } struct pivot_dimension *variables = pivot_dimension_create ( table, PIVOT_AXIS_ROW, N_("Variables")); struct pivot_category *step1 = pivot_category_create_group ( variables->root, N_("Step 1")); int ivar = 0; int idx_correction = 0; int i = 0; int nr = cmd->n_predictor_vars; if (cmd->constant) nr++; if (res->cats) nr += categoricals_df_total (res->cats) + cmd->n_cat_predictors; for (int row = 0; row < nr; row++) { const int idx = row - idx_correction; int var_idx; if (idx < cmd->n_predictor_vars) var_idx = pivot_category_create_leaf ( step1, pivot_value_new_variable (cmd->predictor_vars[idx])); else if (i < cmd->n_cat_predictors) { const struct interaction *cat_predictors = cmd->cat_predictors[i]; struct string str = DS_EMPTY_INITIALIZER; interaction_to_string (cat_predictors, &str); if (ivar != 0) ds_put_format (&str, "(%d)", ivar); var_idx = pivot_category_create_leaf ( step1, pivot_value_new_user_text_nocopy (ds_steal_cstr (&str))); int df = categoricals_df (res->cats, i); bool summary = ivar == 0; if (summary) { /* Calculate the Wald statistic, which is \beta' C^-1 \beta . where \beta is the vector of the coefficient estimates comprising this categorial variable. and C is the corresponding submatrix of the hessian matrix. */ gsl_matrix_const_view mv = gsl_matrix_const_submatrix (res->hessian, idx, idx, df, df); gsl_matrix *subhessian = gsl_matrix_alloc (mv.matrix.size1, mv.matrix.size2); gsl_vector_const_view vv = gsl_vector_const_subvector (res->beta_hat, idx, df); gsl_vector *temp = gsl_vector_alloc (df); gsl_matrix_memcpy (subhessian, &mv.matrix); gsl_linalg_cholesky_decomp (subhessian); gsl_linalg_cholesky_invert (subhessian); gsl_blas_dgemv (CblasTrans, 1.0, subhessian, &vv.vector, 0, temp); double wald; gsl_blas_ddot (temp, &vv.vector, &wald); double entries[] = { wald, df, gsl_cdf_chisq_Q (wald, df) }; for (size_t j = 0; j < sizeof entries / sizeof *entries; j++) pivot_table_put2 (table, j + 2, var_idx, pivot_value_new_number (entries[j])); idx_correction++; gsl_matrix_free (subhessian); gsl_vector_free (temp); } if (ivar++ == df) { ++i; /* next interaction */ ivar = 0; } if (summary) continue; } else var_idx = pivot_category_create_leaves (step1, N_("Constant")); double b = gsl_vector_get (res->beta_hat, idx); double sigma2 = gsl_matrix_get (res->hessian, idx, idx); double wald = pow2 (b) / sigma2; double df = 1; double wc = (gsl_cdf_ugaussian_Pinv (0.5 + cmd->confidence / 200.0) * sqrt (sigma2)); bool show_ci = cmd->print & PRINT_CI && row < nr - cmd->constant; double entries[] = { b, sqrt (sigma2), wald, df, gsl_cdf_chisq_Q (wald, df), exp (b), show_ci ? exp (b - wc) : SYSMIS, show_ci ? exp (b + wc) : SYSMIS, }; for (size_t j = 0; j < sizeof entries / sizeof *entries; j++) if (entries[j] != SYSMIS) pivot_table_put2 (table, j, var_idx, pivot_value_new_number (entries[j])); } pivot_table_submit (table); } /* Show the model summary box */ static void output_model_summary (const struct lr_result *res, double initial_log_likelihood, double log_likelihood) { struct pivot_table *table = pivot_table_create (N_("Model Summary")); pivot_dimension_create (table, PIVOT_AXIS_COLUMN, N_("Statistics"), N_("-2 Log likelihood"), PIVOT_RC_OTHER, N_("Cox & Snell R Square"), PIVOT_RC_OTHER, N_("Nagelkerke R Square"), PIVOT_RC_OTHER); struct pivot_dimension *step = pivot_dimension_create ( table, PIVOT_AXIS_ROW, N_("Step")); step->root->show_label = true; pivot_category_create_leaf (step->root, pivot_value_new_integer (1)); double cox = (1.0 - exp ((initial_log_likelihood - log_likelihood) * (2 / res->cc))); double entries[] = { -2 * log_likelihood, cox, cox / (1.0 - exp(initial_log_likelihood * (2 / res->cc))) }; for (size_t i = 0; i < sizeof entries / sizeof *entries; i++) pivot_table_put2 (table, i, 0, pivot_value_new_number (entries[i])); pivot_table_submit (table); } /* Show the case processing summary box */ static void case_processing_summary (const struct lr_result *res) { struct pivot_table *table = pivot_table_create ( N_("Case Processing Summary")); pivot_dimension_create (table, PIVOT_AXIS_COLUMN, N_("Statistics"), N_("N"), PIVOT_RC_COUNT, N_("Percent"), PIVOT_RC_PERCENT); struct pivot_dimension *cases = pivot_dimension_create ( table, PIVOT_AXIS_ROW, N_("Unweighted Cases"), N_("Included in Analysis"), N_("Missing Cases"), N_("Total")); cases->root->show_label = true; double total = res->n_nonmissing + res->n_missing; struct entry { int stat_idx; int case_idx; double x; } entries[] = { { 0, 0, res->n_nonmissing }, { 0, 1, res->n_missing }, { 0, 2, total }, { 1, 0, 100.0 * res->n_nonmissing / total }, { 1, 1, 100.0 * res->n_missing / total }, { 1, 2, 100.0 }, }; for (size_t i = 0; i < sizeof entries / sizeof *entries; i++) pivot_table_put2 (table, entries[i].stat_idx, entries[i].case_idx, pivot_value_new_number (entries[i].x)); pivot_table_submit (table); } static void output_categories (const struct lr_spec *cmd, const struct lr_result *res) { struct pivot_table *table = pivot_table_create ( N_("Categorical Variables' Codings")); pivot_table_set_weight_var (table, dict_get_weight (cmd->dict)); int max_df = 0; int total_cats = 0; for (int i = 0; i < cmd->n_cat_predictors; ++i) { size_t n = categoricals_n_count (res->cats, i); size_t df = categoricals_df (res->cats, i); if (max_df < df) max_df = df; total_cats += n; } struct pivot_dimension *codings = pivot_dimension_create ( table, PIVOT_AXIS_COLUMN, N_("Codings"), N_("Frequency"), PIVOT_RC_COUNT); struct pivot_category *coding_group = pivot_category_create_group ( codings->root, N_("Parameter coding")); for (int i = 0; i < max_df; ++i) pivot_category_create_leaf_rc ( coding_group, pivot_value_new_user_text_nocopy (xasprintf ("(%d)", i + 1)), PIVOT_RC_INTEGER); struct pivot_dimension *categories = pivot_dimension_create ( table, PIVOT_AXIS_ROW, N_("Categories")); int cumulative_df = 0; for (int v = 0; v < cmd->n_cat_predictors; ++v) { int cat; const struct interaction *cat_predictors = cmd->cat_predictors[v]; int df = categoricals_df (res->cats, v); struct string str = DS_EMPTY_INITIALIZER; interaction_to_string (cat_predictors, &str); struct pivot_category *var_group = pivot_category_create_group__ ( categories->root, pivot_value_new_user_text_nocopy (ds_steal_cstr (&str))); for (cat = 0; cat < categoricals_n_count (res->cats, v) ; ++cat) { const struct ccase *c = categoricals_get_case_by_category_real ( res->cats, v, cat); struct string label = DS_EMPTY_INITIALIZER; for (int x = 0; x < cat_predictors->n_vars; ++x) { if (!ds_is_empty (&label)) ds_put_byte (&label, ' '); const union value *val = case_data (c, cat_predictors->vars[x]); var_append_value_name (cat_predictors->vars[x], val, &label); } int cat_idx = pivot_category_create_leaf ( var_group, pivot_value_new_user_text_nocopy (ds_steal_cstr (&label))); double *freq = categoricals_get_user_data_by_category_real ( res->cats, v, cat); pivot_table_put2 (table, 0, cat_idx, pivot_value_new_number (*freq)); for (int x = 0; x < df; ++x) pivot_table_put2 (table, x + 1, cat_idx, pivot_value_new_number (cat == x)); } cumulative_df += df; } pivot_table_submit (table); } static void create_classification_dimension (const struct lr_spec *cmd, const struct lr_result *res, struct pivot_table *table, enum pivot_axis_type axis_type, const char *label, const char *total) { struct pivot_dimension *d = pivot_dimension_create ( table, axis_type, label); d->root->show_label = true; struct pivot_category *pred_group = pivot_category_create_group__ ( d->root, pivot_value_new_variable (cmd->dep_var)); for (int i = 0; i < 2; i++) { const union value *y = i ? &res->y1 : &res->y0; pivot_category_create_leaf_rc ( pred_group, pivot_value_new_var_value (cmd->dep_var, y), PIVOT_RC_COUNT); } pivot_category_create_leaves (d->root, total, PIVOT_RC_PERCENT); } static void output_classification_table (const struct lr_spec *cmd, const struct lr_result *res) { struct pivot_table *table = pivot_table_create (N_("Classification Table")); pivot_table_set_weight_var (table, cmd->wv); create_classification_dimension (cmd, res, table, PIVOT_AXIS_COLUMN, N_("Predicted"), N_("Percentage Correct")); create_classification_dimension (cmd, res, table, PIVOT_AXIS_ROW, N_("Observed"), N_("Overall Percentage")); pivot_dimension_create (table, PIVOT_AXIS_ROW, N_("Step"), N_("Step 1")); struct entry { int pred_idx; int obs_idx; double x; } entries[] = { { 0, 0, res->tn }, { 0, 1, res->fn }, { 1, 0, res->fp }, { 1, 1, res->tp }, { 2, 0, 100 * res->tn / (res->tn + res->fp) }, { 2, 1, 100 * res->tp / (res->tp + res->fn) }, { 2, 2, 100 * (res->tp + res->tn) / (res->tp + res->tn + res->fp + res->fn)}, }; for (size_t i = 0; i < sizeof entries / sizeof *entries; i++) { const struct entry *e = &entries[i]; pivot_table_put3 (table, e->pred_idx, e->obs_idx, 0, pivot_value_new_number (e->x)); } pivot_table_submit (table); } pspp-1.4.1/src/language/stats/ks-one-sample.h0000644000175000017500000000237313320146056020454 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2011 Free Software Foundation, Inc. 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 3 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, see . */ #if !ks_one_sample_h #define ks_one_sample_h 1 #include #include #include "language/stats/npar.h" enum dist { KS_NORMAL, KS_UNIFORM, KS_POISSON, KS_EXPONENTIAL }; struct ks_one_sample_test { struct one_sample_test parent; double p[2]; enum dist dist; }; struct casereader; struct dataset; void ks_one_sample_execute (const struct dataset *ds, struct casereader *input, enum mv_class exclude, const struct npar_test *test, bool, double); #endif pspp-1.4.1/src/language/stats/mann-whitney.c0000644000175000017500000001724613700645725020430 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2010, 2011 Free Software Foundation, Inc. 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 3 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, see . */ #include #include "language/stats/mann-whitney.h" #include #include "data/case.h" #include "data/casereader.h" #include "data/dataset.h" #include "data/dictionary.h" #include "data/format.h" #include "data/variable.h" #include "libpspp/cast.h" #include "libpspp/misc.h" #include "math/sort.h" #include "output/pivot-table.h" #include "gettext.h" #define N_(msgid) msgid #define _(msgid) gettext (msgid) /* Calculates the adjustment necessary for tie compensation */ static void distinct_callback (double v UNUSED, casenumber t, double w UNUSED, void *aux) { double *tiebreaker = aux; *tiebreaker += (pow3 (t) - t) / 12.0; } struct mw { double rank_sum[2]; double n[2]; double u; /* The Mann-Whitney U statistic */ double w; /* The Wilcoxon Rank Sum W statistic */ double z; }; static void show_ranks_box (const struct n_sample_test *, const struct mw *); static void show_statistics_box (const struct n_sample_test *, const struct mw *); static bool belongs_to_test (const struct ccase *c, void *aux) { const struct n_sample_test *nst = aux; const union value *group = case_data (c, nst->indep_var); const size_t group_var_width = var_get_width (nst->indep_var); if (value_equal (group, &nst->val1, group_var_width)) return true; if (value_equal (group, &nst->val2, group_var_width)) return true; return false; } void mann_whitney_execute (const struct dataset *ds, struct casereader *input, enum mv_class exclude, const struct npar_test *test, bool exact UNUSED, double timer UNUSED) { int i; const struct dictionary *dict = dataset_dict (ds); const struct n_sample_test *nst = UP_CAST (test, const struct n_sample_test, parent); const struct caseproto *proto = casereader_get_proto (input); size_t rank_idx = caseproto_get_n_widths (proto); struct mw *mw = XCALLOC (nst->n_vars, struct mw); for (i = 0; i < nst->n_vars; ++i) { double tiebreaker = 0.0; bool warn = true; enum rank_error rerr = 0; struct casereader *rr; struct ccase *c; const struct variable *var = nst->vars[i]; struct casereader *reader = casereader_create_filter_func (casereader_clone (input), belongs_to_test, NULL, CONST_CAST (struct n_sample_test *, nst), NULL); reader = casereader_create_filter_missing (reader, &var, 1, exclude, NULL, NULL); reader = sort_execute_1var (reader, var); rr = casereader_create_append_rank (reader, var, dict_get_weight (dict), &rerr, distinct_callback, &tiebreaker); for (; (c = casereader_read (rr)); case_unref (c)) { const union value *group = case_data (c, nst->indep_var); const size_t group_var_width = var_get_width (nst->indep_var); const double rank = case_data_idx (c, rank_idx)->f; if (value_equal (group, &nst->val1, group_var_width)) { mw[i].rank_sum[0] += rank; mw[i].n[0] += dict_get_case_weight (dict, c, &warn); } else if (value_equal (group, &nst->val2, group_var_width)) { mw[i].rank_sum[1] += rank; mw[i].n[1] += dict_get_case_weight (dict, c, &warn); } } casereader_destroy (rr); { double n; double denominator; struct mw *mwv = &mw[i]; mwv->u = mwv->n[0] * mwv->n[1] ; mwv->u += mwv->n[0] * (mwv->n[0] + 1) / 2.0; mwv->u -= mwv->rank_sum[0]; mwv->w = mwv->rank_sum[1]; if (mwv->u > mwv->n[0] * mwv->n[1] / 2.0) { mwv->u = mwv->n[0] * mwv->n[1] - mwv->u; mwv->w = mwv->rank_sum[0]; } mwv->z = mwv->u - mwv->n[0] * mwv->n[1] / 2.0; n = mwv->n[0] + mwv->n[1]; denominator = pow3(n) - n; denominator /= 12; denominator -= tiebreaker; denominator *= mwv->n[0] * mwv->n[1]; denominator /= n * (n - 1); mwv->z /= sqrt (denominator); } } casereader_destroy (input); show_ranks_box (nst, mw); show_statistics_box (nst, mw); free (mw); } static void show_ranks_box (const struct n_sample_test *nst, const struct mw *mwv) { struct pivot_table *table = pivot_table_create (N_("Ranks")); pivot_dimension_create (table, PIVOT_AXIS_COLUMN, N_("Statistics"), N_("N"), PIVOT_RC_COUNT, N_("Mean Rank"), PIVOT_RC_OTHER, N_("Sum of Ranks"), PIVOT_RC_OTHER); struct pivot_dimension *indep = pivot_dimension_create__ ( table, PIVOT_AXIS_ROW, pivot_value_new_variable (nst->indep_var)); pivot_category_create_leaf (indep->root, pivot_value_new_var_value (nst->indep_var, &nst->val1)); pivot_category_create_leaf (indep->root, pivot_value_new_var_value (nst->indep_var, &nst->val2)); pivot_category_create_leaves (indep->root, N_("Total")); struct pivot_dimension *dep = pivot_dimension_create ( table, PIVOT_AXIS_ROW, N_("Dependent Variables")); for (size_t i = 0 ; i < nst->n_vars ; ++i) { const struct mw *mw = &mwv[i]; int dep_idx = pivot_category_create_leaf ( dep->root, pivot_value_new_variable (nst->vars[i])); struct entry { int stat_idx; int indep_idx; double x; } entries[] = { /* N. */ { 0, 0, mw->n[0] }, { 0, 1, mw->n[1] }, { 0, 2, mw->n[0] + mw->n[1] }, /* Mean Rank. */ { 1, 0, mw->rank_sum[0] / mw->n[0] }, { 1, 1, mw->rank_sum[1] / mw->n[1] }, /* Sum of Ranks. */ { 2, 0, mw->rank_sum[0] }, { 2, 1, mw->rank_sum[1] }, }; for (size_t j = 0; j < sizeof entries / sizeof *entries; j++) { const struct entry *e = &entries[j]; pivot_table_put3 (table, e->stat_idx, e->indep_idx, dep_idx, pivot_value_new_number (e->x)); } } pivot_table_submit (table); } static void show_statistics_box (const struct n_sample_test *nst, const struct mw *mwv) { struct pivot_table *table = pivot_table_create (N_("Test Statistics")); pivot_dimension_create ( table, PIVOT_AXIS_COLUMN, N_("Statistics"), _("Mann-Whitney U"), PIVOT_RC_OTHER, _("Wilcoxon W"), PIVOT_RC_OTHER, _("Z"), PIVOT_RC_OTHER, _("Asymp. Sig. (2-tailed)"), PIVOT_RC_SIGNIFICANCE); struct pivot_dimension *variables = pivot_dimension_create ( table, PIVOT_AXIS_ROW, N_("Variables")); for (size_t i = 0 ; i < nst->n_vars ; ++i) { const struct mw *mw = &mwv[i]; int row = pivot_category_create_leaf ( variables->root, pivot_value_new_variable (nst->vars[i])); double entries[] = { mw->u, mw->w, mw->z, 2.0 * gsl_cdf_ugaussian_P (mw->z), }; for (size_t i = 0; i < sizeof entries / sizeof *entries; i++) pivot_table_put2 (table, i, row, pivot_value_new_number (entries[i])); } pivot_table_submit (table); } pspp-1.4.1/src/language/stats/sign.h0000644000175000017500000000206413320146056016736 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2009, 2011 Free Software Foundation, Inc. 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 3 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, see . */ #if !sign_h #define sign_h 1 #include #include "data/missing-values.h" struct casereader; struct dataset; struct npar_test; void sign_execute (const struct dataset *ds, struct casereader *input, enum mv_class exclude, const struct npar_test *test, bool exact, double timer); #endif pspp-1.4.1/src/language/stats/correlations.c0000644000175000017500000003102613670210420020470 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2009, 2010, 2011 Free Software Foundation, Inc. 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 3 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, see . */ #include #include #include #include #include "data/casegrouper.h" #include "data/casereader.h" #include "data/dataset.h" #include "data/dictionary.h" #include "data/format.h" #include "data/variable.h" #include "language/command.h" #include "language/dictionary/split-file.h" #include "language/lexer/lexer.h" #include "language/lexer/variable-parser.h" #include "libpspp/assertion.h" #include "libpspp/message.h" #include "libpspp/misc.h" #include "math/correlation.h" #include "math/covariance.h" #include "math/moments.h" #include "output/pivot-table.h" #include "gl/xalloc.h" #include "gl/minmax.h" #include "gettext.h" #define _(msgid) gettext (msgid) #define N_(msgid) msgid struct corr { size_t n_vars_total; size_t n_vars1; const struct variable **vars; }; /* Handling of missing values. */ enum corr_missing_type { CORR_PAIRWISE, /* Handle missing values on a per-variable-pair basis. */ CORR_LISTWISE /* Discard entire case if any variable is missing. */ }; enum stats_opts { STATS_DESCRIPTIVES = 0x01, STATS_XPROD = 0x02, STATS_ALL = STATS_XPROD | STATS_DESCRIPTIVES }; struct corr_opts { enum corr_missing_type missing_type; enum mv_class exclude; /* Classes of missing values to exclude. */ bool sig; /* Flag significant values or not */ int tails; /* Report significance with how many tails ? */ enum stats_opts statistics; const struct variable *wv; /* The weight variable (if any) */ }; static void output_descriptives (const struct corr *corr, const struct corr_opts *opts, const gsl_matrix *means, const gsl_matrix *vars, const gsl_matrix *ns) { struct pivot_table *table = pivot_table_create ( N_("Descriptive Statistics")); pivot_table_set_weight_var (table, opts->wv); pivot_dimension_create (table, PIVOT_AXIS_COLUMN, N_("Statistics"), N_("Mean"), PIVOT_RC_OTHER, N_("Std. Deviation"), PIVOT_RC_OTHER, N_("N"), PIVOT_RC_COUNT); struct pivot_dimension *variables = pivot_dimension_create ( table, PIVOT_AXIS_ROW, N_("Variable")); for (size_t r = 0 ; r < corr->n_vars_total ; ++r) { const struct variable *v = corr->vars[r]; int row = pivot_category_create_leaf (variables->root, pivot_value_new_variable (v)); double mean = gsl_matrix_get (means, r, 0); /* Here we want to display the non-biased estimator */ double n = gsl_matrix_get (ns, r, 0); double stddev = sqrt (gsl_matrix_get (vars, r, 0) * n / (n - 1)); double entries[] = { mean, stddev, n }; for (size_t i = 0; i < sizeof entries / sizeof *entries; i++) pivot_table_put2 (table, i, row, pivot_value_new_number (entries[i])); } pivot_table_submit (table); } static void output_correlation (const struct corr *corr, const struct corr_opts *opts, const gsl_matrix *cm, const gsl_matrix *samples, const gsl_matrix *cv) { struct pivot_table *table = pivot_table_create (N_("Correlations")); pivot_table_set_weight_var (table, opts->wv); /* Column variable dimension. */ struct pivot_dimension *columns = pivot_dimension_create ( table, PIVOT_AXIS_COLUMN, N_("Variables")); int matrix_cols = (corr->n_vars_total > corr->n_vars1 ? corr->n_vars_total - corr->n_vars1 : corr->n_vars1); for (int c = 0; c < matrix_cols; c++) { const struct variable *v = corr->n_vars_total > corr->n_vars1 ? corr->vars[corr->n_vars1 + c] : corr->vars[c]; pivot_category_create_leaf (columns->root, pivot_value_new_variable (v)); } /* Statistics dimension. */ struct pivot_dimension *statistics = pivot_dimension_create ( table, PIVOT_AXIS_ROW, N_("Statistics"), N_("Pearson Correlation"), PIVOT_RC_CORRELATION, opts->tails == 2 ? N_("Sig. (2-tailed)") : N_("Sig. (1-tailed)"), PIVOT_RC_SIGNIFICANCE); if (opts->statistics & STATS_XPROD) pivot_category_create_leaves (statistics->root, N_("Cross-products"), N_("Covariance")); if (opts->missing_type != CORR_LISTWISE) pivot_category_create_leaves (statistics->root, N_("N"), PIVOT_RC_COUNT); /* Row variable dimension. */ struct pivot_dimension *rows = pivot_dimension_create ( table, PIVOT_AXIS_ROW, N_("Variables")); for (size_t r = 0; r < corr->n_vars1; r++) pivot_category_create_leaf (rows->root, pivot_value_new_variable (corr->vars[r])); struct pivot_footnote *sig_footnote = pivot_table_create_footnote ( table, pivot_value_new_text (N_("Significant at .05 level"))); for (int r = 0; r < corr->n_vars1; r++) for (int c = 0; c < matrix_cols; c++) { const int col_index = (corr->n_vars_total > corr->n_vars1 ? corr->n_vars1 + c : c); double pearson = gsl_matrix_get (cm, r, col_index); double w = gsl_matrix_get (samples, r, col_index); double sig = opts->tails * significance_of_correlation (pearson, w); double entries[5]; int n = 0; entries[n++] = pearson; entries[n++] = col_index != r ? sig : SYSMIS; if (opts->statistics & STATS_XPROD) { double cov = gsl_matrix_get (cv, r, col_index); const double xprod_dev = cov * w; cov *= w / (w - 1.0); entries[n++] = xprod_dev; entries[n++] = cov; } if (opts->missing_type != CORR_LISTWISE) entries[n++] = w; for (int i = 0; i < n; i++) if (entries[i] != SYSMIS) { struct pivot_value *v = pivot_value_new_number (entries[i]); if (!i && opts->sig && col_index != r && sig < 0.05) pivot_value_add_footnote (v, sig_footnote); pivot_table_put3 (table, c, i, r, v); } } pivot_table_submit (table); } static void run_corr (struct casereader *r, const struct corr_opts *opts, const struct corr *corr) { struct ccase *c; const gsl_matrix *var_matrix, *samples_matrix, *mean_matrix; gsl_matrix *cov_matrix = NULL; gsl_matrix *corr_matrix = NULL; struct covariance *cov = covariance_2pass_create (corr->n_vars_total, corr->vars, NULL, opts->wv, opts->exclude, true); struct casereader *rc = casereader_clone (r); for (; (c = casereader_read (r)); case_unref (c)) { covariance_accumulate_pass1 (cov, c); } for (; (c = casereader_read (rc)); case_unref (c)) { covariance_accumulate_pass2 (cov, c); } casereader_destroy (rc); cov_matrix = covariance_calculate (cov); if (! cov_matrix) { msg (SE, _("The data for the chosen variables are all missing or empty.")); goto error; } samples_matrix = covariance_moments (cov, MOMENT_NONE); var_matrix = covariance_moments (cov, MOMENT_VARIANCE); mean_matrix = covariance_moments (cov, MOMENT_MEAN); corr_matrix = correlation_from_covariance (cov_matrix, var_matrix); if (opts->statistics & STATS_DESCRIPTIVES) output_descriptives (corr, opts, mean_matrix, var_matrix, samples_matrix); output_correlation (corr, opts, corr_matrix, samples_matrix, cov_matrix); error: covariance_destroy (cov); gsl_matrix_free (corr_matrix); gsl_matrix_free (cov_matrix); } int cmd_correlation (struct lexer *lexer, struct dataset *ds) { int i; int n_all_vars = 0; /* Total number of variables involved in this command */ const struct variable **all_vars ; const struct dictionary *dict = dataset_dict (ds); bool ok = true; struct casegrouper *grouper; struct casereader *group; struct corr *corr = NULL; size_t n_corrs = 0; struct corr_opts opts; opts.missing_type = CORR_PAIRWISE; opts.wv = dict_get_weight (dict); opts.tails = 2; opts.sig = false; opts.exclude = MV_ANY; opts.statistics = 0; /* Parse CORRELATIONS. */ while (lex_token (lexer) != T_ENDCMD) { lex_match (lexer, T_SLASH); if (lex_match_id (lexer, "MISSING")) { lex_match (lexer, T_EQUALS); while (lex_token (lexer) != T_ENDCMD && lex_token (lexer) != T_SLASH) { if (lex_match_id (lexer, "PAIRWISE")) opts.missing_type = CORR_PAIRWISE; else if (lex_match_id (lexer, "LISTWISE")) opts.missing_type = CORR_LISTWISE; else if (lex_match_id (lexer, "INCLUDE")) opts.exclude = MV_SYSTEM; else if (lex_match_id (lexer, "EXCLUDE")) opts.exclude = MV_ANY; else { lex_error (lexer, NULL); goto error; } lex_match (lexer, T_COMMA); } } else if (lex_match_id (lexer, "PRINT")) { lex_match (lexer, T_EQUALS); while (lex_token (lexer) != T_ENDCMD && lex_token (lexer) != T_SLASH) { if (lex_match_id (lexer, "TWOTAIL")) opts.tails = 2; else if (lex_match_id (lexer, "ONETAIL")) opts.tails = 1; else if (lex_match_id (lexer, "SIG")) opts.sig = false; else if (lex_match_id (lexer, "NOSIG")) opts.sig = true; else { lex_error (lexer, NULL); goto error; } lex_match (lexer, T_COMMA); } } else if (lex_match_id (lexer, "STATISTICS")) { lex_match (lexer, T_EQUALS); while (lex_token (lexer) != T_ENDCMD && lex_token (lexer) != T_SLASH) { if (lex_match_id (lexer, "DESCRIPTIVES")) opts.statistics = STATS_DESCRIPTIVES; else if (lex_match_id (lexer, "XPROD")) opts.statistics = STATS_XPROD; else if (lex_token (lexer) == T_ALL) { opts.statistics = STATS_ALL; lex_get (lexer); } else { lex_error (lexer, NULL); goto error; } lex_match (lexer, T_COMMA); } } else { if (lex_match_id (lexer, "VARIABLES")) { lex_match (lexer, T_EQUALS); } corr = xrealloc (corr, sizeof (*corr) * (n_corrs + 1)); corr[n_corrs].n_vars_total = corr[n_corrs].n_vars1 = 0; if (! parse_variables_const (lexer, dict, &corr[n_corrs].vars, &corr[n_corrs].n_vars_total, PV_NUMERIC)) { ok = false; break; } corr[n_corrs].n_vars1 = corr[n_corrs].n_vars_total; if (lex_match (lexer, T_WITH)) { if (! parse_variables_const (lexer, dict, &corr[n_corrs].vars, &corr[n_corrs].n_vars_total, PV_NUMERIC | PV_APPEND)) { ok = false; break; } } n_all_vars += corr[n_corrs].n_vars_total; n_corrs++; } } if (n_corrs == 0) { msg (SE, _("No variables specified.")); goto error; } all_vars = xmalloc (sizeof (*all_vars) * n_all_vars); { /* FIXME: Using a hash here would make more sense */ const struct variable **vv = all_vars; for (i = 0 ; i < n_corrs; ++i) { int v; const struct corr *c = &corr[i]; for (v = 0 ; v < c->n_vars_total; ++v) *vv++ = c->vars[v]; } } grouper = casegrouper_create_splits (proc_open (ds), dict); while (casegrouper_get_next_group (grouper, &group)) { for (i = 0 ; i < n_corrs; ++i) { /* FIXME: No need to iterate the data multiple times */ struct casereader *r = casereader_clone (group); if (opts.missing_type == CORR_LISTWISE) r = casereader_create_filter_missing (r, all_vars, n_all_vars, opts.exclude, NULL, NULL); run_corr (r, &opts, &corr[i]); casereader_destroy (r); } casereader_destroy (group); } ok = casegrouper_destroy (grouper); ok = proc_commit (ds) && ok; free (all_vars); /* Done. */ free (corr->vars); free (corr); return ok ? CMD_SUCCESS : CMD_CASCADING_FAILURE; error: if (corr) free (corr->vars); free (corr); return CMD_FAILURE; } pspp-1.4.1/src/language/stats/median.h0000644000175000017500000000222513670210420017225 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2011 Free Software Foundation, Inc. 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 3 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, see . */ #if !median_h #define median_h 1 #include #include #include "language/stats/npar.h" struct median_test { struct n_sample_test parent; double median; }; struct casereader; struct dataset; void median_execute (const struct dataset *ds, struct casereader *input, enum mv_class exclude, const struct npar_test *test, bool exact, double timer ); #endif pspp-1.4.1/src/language/stats/wilcoxon.c0000644000175000017500000002252213700645725017645 0ustar00blpblp00000000000000/* Pspp - a program for statistical analysis. Copyright (C) 2008, 2009, 2010, 2011 Free Software Foundation, Inc. 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 3 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, see . */ #include #include "language/stats/wilcoxon.h" #include #include #include "data/casereader.h" #include "data/casewriter.h" #include "data/dataset.h" #include "data/dictionary.h" #include "data/format.h" #include "data/subcase.h" #include "data/variable.h" #include "libpspp/assertion.h" #include "libpspp/message.h" #include "libpspp/misc.h" #include "math/sort.h" #include "math/wilcoxon-sig.h" #include "output/pivot-table.h" #include "gl/minmax.h" #include "gl/xalloc.h" #include "gettext.h" #define N_(msgid) msgid #define _(msgid) gettext (msgid) static double append_difference (const struct ccase *c, casenumber n UNUSED, void *aux) { const variable_pair *vp = aux; return case_data (c, (*vp)[0])->f - case_data (c, (*vp)[1])->f; } static void show_ranks_box (const struct wilcoxon_state *, const struct two_sample_test *, const struct dictionary *); static void show_tests_box (const struct wilcoxon_state *, const struct two_sample_test *, bool exact, double timer); static void distinct_callback (double v UNUSED, casenumber n, double w UNUSED, void *aux) { struct wilcoxon_state *ws = aux; ws->tiebreaker += pow3 (n) - n; } #define WEIGHT_IDX 2 void wilcoxon_execute (const struct dataset *ds, struct casereader *input, enum mv_class exclude, const struct npar_test *test, bool exact, double timer) { int i; bool warn = true; const struct dictionary *dict = dataset_dict (ds); const struct two_sample_test *t2s = UP_CAST (test, const struct two_sample_test, parent); struct wilcoxon_state *ws = XCALLOC (t2s->n_pairs, struct wilcoxon_state); const struct variable *weight = dict_get_weight (dict); struct variable *weightx = dict_create_internal_var (WEIGHT_IDX, 0); struct caseproto *proto; input = casereader_create_filter_weight (input, dict, &warn, NULL); proto = caseproto_create (); proto = caseproto_add_width (proto, 0); proto = caseproto_add_width (proto, 0); if (weight != NULL) proto = caseproto_add_width (proto, 0); for (i = 0 ; i < t2s->n_pairs; ++i) { struct casereader *r = casereader_clone (input); struct casewriter *writer; struct ccase *c; struct subcase ordering; variable_pair *vp = &t2s->pairs[i]; ws[i].sign = dict_create_internal_var (0, 0); ws[i].absdiff = dict_create_internal_var (1, 0); r = casereader_create_filter_missing (r, *vp, 2, exclude, NULL, NULL); subcase_init_var (&ordering, ws[i].absdiff, SC_ASCEND); writer = sort_create_writer (&ordering, proto); subcase_destroy (&ordering); for (; (c = casereader_read (r)) != NULL; case_unref (c)) { struct ccase *output = case_create (proto); double d = append_difference (c, 0, vp); if (d > 0) { case_data_rw (output, ws[i].sign)->f = 1.0; } else if (d < 0) { case_data_rw (output, ws[i].sign)->f = -1.0; } else { double w = 1.0; if (weight) w = case_data (c, weight)->f; /* Central point values should be dropped */ ws[i].n_zeros += w; case_unref (output); continue; } case_data_rw (output, ws[i].absdiff)->f = fabs (d); if (weight) case_data_rw (output, weightx)->f = case_data (c, weight)->f; casewriter_write (writer, output); } casereader_destroy (r); ws[i].reader = casewriter_make_reader (writer); } caseproto_unref (proto); for (i = 0 ; i < t2s->n_pairs; ++i) { struct casereader *rr ; struct ccase *c; enum rank_error err = 0; rr = casereader_create_append_rank (ws[i].reader, ws[i].absdiff, weight ? weightx : NULL, &err, distinct_callback, &ws[i] ); for (; (c = casereader_read (rr)) != NULL; case_unref (c)) { double sign = case_data (c, ws[i].sign)->f; double rank = case_data_idx (c, weight ? 3 : 2)->f; double w = 1.0; if (weight) w = case_data (c, weightx)->f; if (sign > 0) { ws[i].positives.sum += rank * w; ws[i].positives.n += w; } else if (sign < 0) { ws[i].negatives.sum += rank * w; ws[i].negatives.n += w; } else NOT_REACHED (); } casereader_destroy (rr); } casereader_destroy (input); dict_destroy_internal_var (weightx); show_ranks_box (ws, t2s, dict); show_tests_box (ws, t2s, exact, timer); for (i = 0 ; i < t2s->n_pairs; ++i) { dict_destroy_internal_var (ws[i].sign); dict_destroy_internal_var (ws[i].absdiff); } free (ws); } static void put_row (struct pivot_table *table, int var_idx, int sign_idx, double n, double sum) { pivot_table_put3 (table, 0, sign_idx, var_idx, pivot_value_new_number (n)); if (sum != SYSMIS) { pivot_table_put3 (table, 1, sign_idx, var_idx, pivot_value_new_number (sum / n)); pivot_table_put3 (table, 2, sign_idx, var_idx, pivot_value_new_number (sum)); } } static int add_pair_leaf (struct pivot_dimension *dimension, variable_pair *pair) { char *label = xasprintf ("%s - %s", var_to_string ((*pair)[0]), var_to_string ((*pair)[1])); return pivot_category_create_leaf ( dimension->root, pivot_value_new_user_text_nocopy (label)); } static void show_ranks_box (const struct wilcoxon_state *ws, const struct two_sample_test *t2s, const struct dictionary *dict) { struct pivot_table *table = pivot_table_create (N_("Ranks")); pivot_table_set_weight_var (table, dict_get_weight (dict)); pivot_dimension_create (table, PIVOT_AXIS_COLUMN, N_("Statistics"), N_("N"), PIVOT_RC_COUNT, N_("Mean Rank"), PIVOT_RC_OTHER, N_("Sum of Ranks"), PIVOT_RC_OTHER); pivot_dimension_create (table, PIVOT_AXIS_ROW, N_("Sign"), N_("Negative Ranks"), N_("Positive Ranks"), N_("Ties"), N_("Total")); struct pivot_dimension *pairs = pivot_dimension_create ( table, PIVOT_AXIS_ROW, N_("Pairs")); for (size_t i = 0 ; i < t2s->n_pairs; ++i) { variable_pair *vp = &t2s->pairs[i]; int pair_idx = add_pair_leaf (pairs, vp); const struct wilcoxon_state *w = &ws[i]; put_row (table, pair_idx, 0, w->negatives.n, w->negatives.sum); put_row (table, pair_idx, 1, w->positives.n, w->positives.sum); put_row (table, pair_idx, 2, w->n_zeros, SYSMIS); put_row (table, pair_idx, 3, w->n_zeros + w->positives.n + w->negatives.n, SYSMIS); } pivot_table_submit (table); } static void show_tests_box (const struct wilcoxon_state *ws, const struct two_sample_test *t2s, bool exact, double timer UNUSED ) { struct pivot_table *table = pivot_table_create (N_("Test Statistics")); struct pivot_dimension *statistics = pivot_dimension_create ( table, PIVOT_AXIS_ROW, N_("Statistics"), N_("Z"), PIVOT_RC_OTHER, N_("Asymp. Sig. (2-tailed)"), PIVOT_RC_SIGNIFICANCE); if (exact) pivot_category_create_leaves ( statistics->root, N_("Exact Sig. (2-tailed)"), PIVOT_RC_SIGNIFICANCE, N_("Exact Sig. (1-tailed)"), PIVOT_RC_SIGNIFICANCE); struct pivot_dimension *pairs = pivot_dimension_create ( table, PIVOT_AXIS_COLUMN, N_("Pairs")); struct pivot_footnote *too_many_pairs = pivot_table_create_footnote ( table, pivot_value_new_text ( N_("Too many pairs to calculate exact significance"))); for (size_t i = 0 ; i < t2s->n_pairs; ++i) { variable_pair *vp = &t2s->pairs[i]; int pair_idx = add_pair_leaf (pairs, vp); double n = ws[i].positives.n + ws[i].negatives.n; double z = MIN (ws[i].positives.sum, ws[i].negatives.sum); z -= n * (n + 1)/ 4.0; z /= sqrt (n * (n + 1) * (2*n + 1)/24.0 - ws[i].tiebreaker / 48.0); double entries[4]; int n_entries = 0; entries[n_entries++] = z; entries[n_entries++] = 2.0 * gsl_cdf_ugaussian_P (z); int footnote_idx = -1; if (exact) { double p = LevelOfSignificanceWXMPSR (ws[i].positives.sum, n); if (p < 0) { footnote_idx = n_entries; entries[n_entries++] = SYSMIS; } else { entries[n_entries++] = p; entries[n_entries++] = p / 2.0; } } for (int j = 0; j < n_entries; j++) { struct pivot_value *value = pivot_value_new_number (entries[j]); if (j == footnote_idx) pivot_value_add_footnote (value, too_many_pairs); pivot_table_put2 (table, j, pair_idx, value); } } pivot_table_submit (table); } pspp-1.4.1/src/language/stats/quick-cluster.c0000644000175000017500000007025213670210420020563 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2011, 2012, 2015, 2019 Free Software Foundation, Inc. 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 3 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, see . */ #include #include #include #include #include #include #include #include "data/case.h" #include "data/casegrouper.h" #include "data/casereader.h" #include "data/casewriter.h" #include "data/dataset.h" #include "data/dictionary.h" #include "data/format.h" #include "data/missing-values.h" #include "language/command.h" #include "language/lexer/lexer.h" #include "language/lexer/variable-parser.h" #include "libpspp/message.h" #include "libpspp/misc.h" #include "libpspp/assertion.h" #include "libpspp/str.h" #include "math/random.h" #include "output/pivot-table.h" #include "output/text-item.h" #include "gettext.h" #define _(msgid) gettext (msgid) #define N_(msgid) msgid enum missing_type { MISS_LISTWISE, MISS_PAIRWISE, }; struct save_trans_data { /* A writer which contains the values (if any) to be appended to each case in the active dataset */ struct casewriter *writer; /* A reader created from the writer above. */ struct casereader *appending_reader; /* The indices to be used to access values in the above, reader/writer */ int CASE_IDX_MEMBERSHIP; int CASE_IDX_DISTANCE; /* The variables created to hold the values appended to the dataset */ struct variable *membership; struct variable *distance; }; #define SAVE_MEMBERSHIP 0x1 #define SAVE_DISTANCE 0x2 struct qc { struct dataset *dataset; struct dictionary *dict; const struct variable **vars; size_t n_vars; double epsilon; /* The convergence criterion */ int ngroups; /* Number of group. (Given by the user) */ int maxiter; /* Maximum iterations (Given by the user) */ bool print_cluster_membership; /* true => print membership */ bool print_initial_clusters; /* true => print initial cluster */ bool no_initial; /* true => simplified initial cluster selection */ bool no_update; /* true => do not iterate */ const struct variable *wv; /* Weighting variable. */ enum missing_type missing_type; enum mv_class exclude; /* Which values are to be saved? */ int save_values; /* The name of the new variable to contain the cluster of each case. */ char *var_membership; /* The name of the new variable to contain the distance of each case from its cluster centre. */ char *var_distance; struct save_trans_data *save_trans_data; }; /* Holds all of the information for the functions. int n, holds the number of observation and its default value is -1. We set it in kmeans_recalculate_centers in first invocation. */ struct Kmeans { gsl_matrix *centers; /* Centers for groups. */ gsl_matrix *updated_centers; casenumber n; gsl_vector_long *num_elements_groups; gsl_matrix *initial_centers; /* Initial random centers. */ double convergence_criteria; gsl_permutation *group_order; /* Group order for reporting. */ }; static struct Kmeans *kmeans_create (const struct qc *qc); static void kmeans_get_nearest_group (const struct Kmeans *kmeans, struct ccase *c, const struct qc *, int *, double *, int *, double *); static void kmeans_order_groups (struct Kmeans *kmeans, const struct qc *); static void kmeans_cluster (struct Kmeans *kmeans, struct casereader *reader, const struct qc *); static void quick_cluster_show_centers (struct Kmeans *kmeans, bool initial, const struct qc *); static void quick_cluster_show_membership (struct Kmeans *kmeans, const struct casereader *reader, struct qc *); static void quick_cluster_show_number_cases (struct Kmeans *kmeans, const struct qc *); static void quick_cluster_show_results (struct Kmeans *kmeans, const struct casereader *reader, struct qc *); int cmd_quick_cluster (struct lexer *lexer, struct dataset *ds); static void kmeans_destroy (struct Kmeans *kmeans); /* Creates and returns a struct of Kmeans with given casereader 'cs', parsed variables 'variables', number of cases 'n', number of variables 'm', number of clusters and amount of maximum iterations. */ static struct Kmeans * kmeans_create (const struct qc *qc) { struct Kmeans *kmeans = xmalloc (sizeof (struct Kmeans)); kmeans->centers = gsl_matrix_alloc (qc->ngroups, qc->n_vars); kmeans->updated_centers = gsl_matrix_alloc (qc->ngroups, qc->n_vars); kmeans->num_elements_groups = gsl_vector_long_alloc (qc->ngroups); kmeans->group_order = gsl_permutation_alloc (kmeans->centers->size1); kmeans->initial_centers = NULL; return (kmeans); } static void kmeans_destroy (struct Kmeans *kmeans) { gsl_matrix_free (kmeans->centers); gsl_matrix_free (kmeans->updated_centers); gsl_matrix_free (kmeans->initial_centers); gsl_vector_long_free (kmeans->num_elements_groups); gsl_permutation_free (kmeans->group_order); free (kmeans); } static double diff_matrix (const gsl_matrix *m1, const gsl_matrix *m2) { int i,j; double max_diff = -INFINITY; for (i = 0; i < m1->size1; ++i) { double diff = 0; for (j = 0; j < m1->size2; ++j) { diff += pow2 (gsl_matrix_get (m1,i,j) - gsl_matrix_get (m2,i,j)); } if (diff > max_diff) max_diff = diff; } return max_diff; } static double matrix_mindist (const gsl_matrix *m, int *mn, int *mm) { int i, j; double mindist = INFINITY; for (i = 0; i < m->size1 - 1; ++i) { for (j = i + 1; j < m->size1; ++j) { int k; double diff_sq = 0; for (k = 0; k < m->size2; ++k) { diff_sq += pow2 (gsl_matrix_get (m, j, k) - gsl_matrix_get (m, i, k)); } if (diff_sq < mindist) { mindist = diff_sq; if (mn) *mn = i; if (mm) *mm = j; } } } return mindist; } /* Return the distance of C from the group whose index is WHICH */ static double dist_from_case (const struct Kmeans *kmeans, const struct ccase *c, const struct qc *qc, int which) { int j; double dist = 0; for (j = 0; j < qc->n_vars; j++) { const union value *val = case_data (c, qc->vars[j]); if (var_is_value_missing (qc->vars[j], val, qc->exclude)) NOT_REACHED (); dist += pow2 (gsl_matrix_get (kmeans->centers, which, j) - val->f); } return dist; } /* Return the minimum distance of the group WHICH and all other groups */ static double min_dist_from (const struct Kmeans *kmeans, const struct qc *qc, int which) { int j, i; double mindist = INFINITY; for (i = 0; i < qc->ngroups; i++) { if (i == which) continue; double dist = 0; for (j = 0; j < qc->n_vars; j++) { dist += pow2 (gsl_matrix_get (kmeans->centers, i, j) - gsl_matrix_get (kmeans->centers, which, j)); } if (dist < mindist) { mindist = dist; } } return mindist; } /* Calculate the initial cluster centers. */ static void kmeans_initial_centers (struct Kmeans *kmeans, const struct casereader *reader, const struct qc *qc) { struct ccase *c; int nc = 0, j; struct casereader *cs = casereader_clone (reader); for (; (c = casereader_read (cs)) != NULL; case_unref (c)) { bool missing = false; for (j = 0; j < qc->n_vars; ++j) { const union value *val = case_data (c, qc->vars[j]); if (var_is_value_missing (qc->vars[j], val, qc->exclude)) { missing = true; break; } if (nc < qc->ngroups) gsl_matrix_set (kmeans->centers, nc, j, val->f); } if (missing) continue; if (nc++ < qc->ngroups) continue; if (!qc->no_initial) { int mq, mp; double delta; int mn, mm; double m = matrix_mindist (kmeans->centers, &mn, &mm); kmeans_get_nearest_group (kmeans, c, qc, &mq, &delta, &mp, NULL); if (delta > m) /* If the distance between C and the nearest group, is greater than the distance between the two groups which are clostest to each other, then one group must be replaced. */ { /* Out of mn and mm, which is the clostest of the two groups to C ? */ int which = (dist_from_case (kmeans, c, qc, mn) > dist_from_case (kmeans, c, qc, mm)) ? mm : mn; for (j = 0; j < qc->n_vars; ++j) { const union value *val = case_data (c, qc->vars[j]); gsl_matrix_set (kmeans->centers, which, j, val->f); } } else if (dist_from_case (kmeans, c, qc, mp) > min_dist_from (kmeans, qc, mq)) /* If the distance between C and the second nearest group (MP) is greater than the smallest distance between the nearest group (MQ) and any other group, then replace MQ with C. */ { for (j = 0; j < qc->n_vars; ++j) { const union value *val = case_data (c, qc->vars[j]); gsl_matrix_set (kmeans->centers, mq, j, val->f); } } } } casereader_destroy (cs); kmeans->convergence_criteria = qc->epsilon * matrix_mindist (kmeans->centers, NULL, NULL); /* As it is the first iteration, the variable kmeans->initial_centers is NULL and it is created once for reporting issues. */ kmeans->initial_centers = gsl_matrix_alloc (qc->ngroups, qc->n_vars); gsl_matrix_memcpy (kmeans->initial_centers, kmeans->centers); } /* Return the index of the group which is nearest to the case C */ static void kmeans_get_nearest_group (const struct Kmeans *kmeans, struct ccase *c, const struct qc *qc, int *g_q, double *delta_q, int *g_p, double *delta_p) { int result0 = -1; int result1 = -1; int i, j; double mindist0 = INFINITY; double mindist1 = INFINITY; for (i = 0; i < qc->ngroups; i++) { double dist = 0; for (j = 0; j < qc->n_vars; j++) { const union value *val = case_data (c, qc->vars[j]); if (var_is_value_missing (qc->vars[j], val, qc->exclude)) continue; dist += pow2 (gsl_matrix_get (kmeans->centers, i, j) - val->f); } if (dist < mindist0) { mindist1 = mindist0; result1 = result0; mindist0 = dist; result0 = i; } else if (dist < mindist1) { mindist1 = dist; result1 = i; } } if (delta_q) *delta_q = mindist0; if (g_q) *g_q = result0; if (delta_p) *delta_p = mindist1; if (g_p) *g_p = result1; } static void kmeans_order_groups (struct Kmeans *kmeans, const struct qc *qc) { gsl_vector *v = gsl_vector_alloc (qc->ngroups); gsl_matrix_get_col (v, kmeans->centers, 0); gsl_sort_vector_index (kmeans->group_order, v); gsl_vector_free (v); } /* Main algorithm. Does iterations, checks convergency. */ static void kmeans_cluster (struct Kmeans *kmeans, struct casereader *reader, const struct qc *qc) { int j; kmeans_initial_centers (kmeans, reader, qc); gsl_matrix_memcpy (kmeans->updated_centers, kmeans->centers); for (int xx = 0 ; xx < qc->maxiter ; ++xx) { gsl_vector_long_set_all (kmeans->num_elements_groups, 0.0); kmeans->n = 0; if (!qc->no_update) { struct casereader *r = casereader_clone (reader); struct ccase *c; for (; (c = casereader_read (r)) != NULL; case_unref (c)) { int group = -1; int g; bool missing = false; for (j = 0; j < qc->n_vars; j++) { const union value *val = case_data (c, qc->vars[j]); if (var_is_value_missing (qc->vars[j], val, qc->exclude)) missing = true; } if (missing) continue; double mindist = INFINITY; for (g = 0; g < qc->ngroups; ++g) { double d = dist_from_case (kmeans, c, qc, g); if (d < mindist) { mindist = d; group = g; } } long *n = gsl_vector_long_ptr (kmeans->num_elements_groups, group); *n += qc->wv ? case_data (c, qc->wv)->f : 1.0; kmeans->n++; for (j = 0; j < qc->n_vars; ++j) { const union value *val = case_data (c, qc->vars[j]); if (var_is_value_missing (qc->vars[j], val, qc->exclude)) continue; double *x = gsl_matrix_ptr (kmeans->updated_centers, group, j); *x += val->f * (qc->wv ? case_data (c, qc->wv)->f : 1.0); } } casereader_destroy (r); } int g; /* Divide the cluster sums by the number of items in each cluster */ for (g = 0; g < qc->ngroups; ++g) { for (j = 0; j < qc->n_vars; ++j) { long n = gsl_vector_long_get (kmeans->num_elements_groups, g); double *x = gsl_matrix_ptr (kmeans->updated_centers, g, j); *x /= n + 1; // Plus 1 for the initial centers } } gsl_matrix_memcpy (kmeans->centers, kmeans->updated_centers); { kmeans->n = 0; /* Step 3 */ gsl_vector_long_set_all (kmeans->num_elements_groups, 0.0); gsl_matrix_set_all (kmeans->updated_centers, 0.0); struct ccase *c; struct casereader *cs = casereader_clone (reader); for (; (c = casereader_read (cs)) != NULL; case_unref (c)) { int group = -1; kmeans_get_nearest_group (kmeans, c, qc, &group, NULL, NULL, NULL); for (j = 0; j < qc->n_vars; ++j) { const union value *val = case_data (c, qc->vars[j]); if (var_is_value_missing (qc->vars[j], val, qc->exclude)) continue; double *x = gsl_matrix_ptr (kmeans->updated_centers, group, j); *x += val->f; } long *n = gsl_vector_long_ptr (kmeans->num_elements_groups, group); *n += qc->wv ? case_data (c, qc->wv)->f : 1.0; kmeans->n++; } casereader_destroy (cs); /* Divide the cluster sums by the number of items in each cluster */ for (g = 0; g < qc->ngroups; ++g) { for (j = 0; j < qc->n_vars; ++j) { long n = gsl_vector_long_get (kmeans->num_elements_groups, g); double *x = gsl_matrix_ptr (kmeans->updated_centers, g, j); *x /= n ; } } double d = diff_matrix (kmeans->updated_centers, kmeans->centers); if (d < kmeans->convergence_criteria) break; } if (qc->no_update) break; } } /* Reports centers of clusters. Initial parameter is optional for future use. If initial is true, initial cluster centers are reported. Otherwise, resulted centers are reported. */ static void quick_cluster_show_centers (struct Kmeans *kmeans, bool initial, const struct qc *qc) { struct pivot_table *table = pivot_table_create (initial ? N_("Initial Cluster Centers") : N_("Final Cluster Centers")); struct pivot_dimension *clusters = pivot_dimension_create (table, PIVOT_AXIS_COLUMN, N_("Cluster")); clusters->root->show_label = true; for (size_t i = 0; i < qc->ngroups; i++) pivot_category_create_leaf (clusters->root, pivot_value_new_integer (i + 1)); struct pivot_dimension *variables = pivot_dimension_create (table, PIVOT_AXIS_ROW, N_("Variable")); for (size_t i = 0; i < qc->n_vars; i++) pivot_category_create_leaf (variables->root, pivot_value_new_variable (qc->vars[i])); const gsl_matrix *matrix = (initial ? kmeans->initial_centers : kmeans->centers); for (size_t i = 0; i < qc->ngroups; i++) for (size_t j = 0; j < qc->n_vars; j++) { double x = gsl_matrix_get (matrix, kmeans->group_order->data[i], j); union value v = { .f = x }; pivot_table_put2 (table, i, j, pivot_value_new_var_value (qc->vars[j], &v)); } pivot_table_submit (table); } /* A transformation function which juxtaposes the dataset with the (pre-prepared) dataset containing membership and/or distance values. */ static int save_trans_func (void *aux, struct ccase **c, casenumber x UNUSED) { const struct save_trans_data *std = aux; struct ccase *ca = casereader_read (std->appending_reader); if (ca == NULL) return TRNS_CONTINUE; *c = case_unshare (*c); if (std->CASE_IDX_MEMBERSHIP >= 0) case_data_rw (*c, std->membership)->f = case_data_idx (ca, std->CASE_IDX_MEMBERSHIP)->f; if (std->CASE_IDX_DISTANCE >= 0) case_data_rw (*c, std->distance)->f = case_data_idx (ca, std->CASE_IDX_DISTANCE)->f; case_unref (ca); return TRNS_CONTINUE; } /* Free the resources of the transformation. */ static bool save_trans_destroy (void *aux) { struct save_trans_data *std = aux; casereader_destroy (std->appending_reader); free (std); return true; } /* Reports cluster membership for each case, and is requested saves the membership and the distance of the case from the cluster centre. */ static void quick_cluster_show_membership (struct Kmeans *kmeans, const struct casereader *reader, struct qc *qc) { struct pivot_table *table = NULL; struct pivot_dimension *cases = NULL; if (qc->print_cluster_membership) { table = pivot_table_create (N_("Cluster Membership")); pivot_dimension_create (table, PIVOT_AXIS_COLUMN, N_("Cluster"), N_("Cluster")); cases = pivot_dimension_create (table, PIVOT_AXIS_ROW, N_("Case Number")); cases->root->show_label = true; } gsl_permutation *ip = gsl_permutation_alloc (qc->ngroups); gsl_permutation_inverse (ip, kmeans->group_order); struct caseproto *proto = caseproto_create (); if (qc->save_values) { /* Prepare data which may potentially be used in a transformation appending new variables to the active dataset. */ qc->save_trans_data = xzalloc (sizeof *qc->save_trans_data); qc->save_trans_data->CASE_IDX_MEMBERSHIP = -1; qc->save_trans_data->CASE_IDX_DISTANCE = -1; qc->save_trans_data->writer = autopaging_writer_create (proto); int idx = 0; if (qc->save_values & SAVE_MEMBERSHIP) { proto = caseproto_add_width (proto, 0); qc->save_trans_data->CASE_IDX_MEMBERSHIP = idx++; } if (qc->save_values & SAVE_DISTANCE) { proto = caseproto_add_width (proto, 0); qc->save_trans_data->CASE_IDX_DISTANCE = idx++; } } struct casereader *cs = casereader_clone (reader); struct ccase *c; for (int i = 0; (c = casereader_read (cs)) != NULL; i++, case_unref (c)) { assert (i < kmeans->n); int clust; kmeans_get_nearest_group (kmeans, c, qc, &clust, NULL, NULL, NULL); int cluster = ip->data[clust]; if (qc->save_trans_data) { /* Calculate the membership and distance values. */ struct ccase *outc = case_create (proto); if (qc->save_values & SAVE_MEMBERSHIP) case_data_rw_idx (outc, qc->save_trans_data->CASE_IDX_MEMBERSHIP)->f = cluster + 1; if (qc->save_values & SAVE_DISTANCE) case_data_rw_idx (outc, qc->save_trans_data->CASE_IDX_DISTANCE)->f = sqrt (dist_from_case (kmeans, c, qc, clust)); casewriter_write (qc->save_trans_data->writer, outc); } if (qc->print_cluster_membership) { /* Print the cluster membership to the table. */ int case_idx = pivot_category_create_leaf (cases->root, pivot_value_new_integer (i + 1)); pivot_table_put2 (table, 0, case_idx, pivot_value_new_integer (cluster + 1)); } } caseproto_unref (proto); gsl_permutation_free (ip); if (qc->print_cluster_membership) pivot_table_submit (table); casereader_destroy (cs); } /* Reports number of cases of each single cluster. */ static void quick_cluster_show_number_cases (struct Kmeans *kmeans, const struct qc *qc) { struct pivot_table *table = pivot_table_create (N_("Number of Cases in each Cluster")); pivot_dimension_create (table, PIVOT_AXIS_COLUMN, N_("Statistics"), N_("Count")); struct pivot_dimension *clusters = pivot_dimension_create (table, PIVOT_AXIS_ROW, N_("Clusters")); struct pivot_category *group = pivot_category_create_group (clusters->root, N_("Cluster")); long int total = 0; for (int i = 0; i < qc->ngroups; i++) { int cluster_idx = pivot_category_create_leaf (group, pivot_value_new_integer (i + 1)); int count = kmeans->num_elements_groups->data [kmeans->group_order->data[i]]; pivot_table_put2 (table, 0, cluster_idx, pivot_value_new_integer (count)); total += count; } int cluster_idx = pivot_category_create_leaf (clusters->root, pivot_value_new_text (N_("Valid"))); pivot_table_put2 (table, 0, cluster_idx, pivot_value_new_integer (total)); pivot_table_submit (table); } /* Reports. */ static void quick_cluster_show_results (struct Kmeans *kmeans, const struct casereader *reader, struct qc *qc) { kmeans_order_groups (kmeans, qc); /* what does this do? */ if (qc->print_initial_clusters) quick_cluster_show_centers (kmeans, true, qc); quick_cluster_show_centers (kmeans, false, qc); quick_cluster_show_number_cases (kmeans, qc); quick_cluster_show_membership (kmeans, reader, qc); } /* Parse the QUICK CLUSTER command and populate QC accordingly. Returns false on error. */ static bool quick_cluster_parse (struct lexer *lexer, struct qc *qc) { if (!parse_variables_const (lexer, qc->dict, &qc->vars, &qc->n_vars, PV_NO_DUPLICATE | PV_NUMERIC)) { return (CMD_FAILURE); } while (lex_token (lexer) != T_ENDCMD) { lex_match (lexer, T_SLASH); if (lex_match_id (lexer, "MISSING")) { lex_match (lexer, T_EQUALS); while (lex_token (lexer) != T_ENDCMD && lex_token (lexer) != T_SLASH) { if (lex_match_id (lexer, "LISTWISE") || lex_match_id (lexer, "DEFAULT")) { qc->missing_type = MISS_LISTWISE; } else if (lex_match_id (lexer, "PAIRWISE")) { qc->missing_type = MISS_PAIRWISE; } else if (lex_match_id (lexer, "INCLUDE")) { qc->exclude = MV_SYSTEM; } else if (lex_match_id (lexer, "EXCLUDE")) { qc->exclude = MV_ANY; } else { lex_error (lexer, NULL); return false; } } } else if (lex_match_id (lexer, "PRINT")) { lex_match (lexer, T_EQUALS); while (lex_token (lexer) != T_ENDCMD && lex_token (lexer) != T_SLASH) { if (lex_match_id (lexer, "CLUSTER")) qc->print_cluster_membership = true; else if (lex_match_id (lexer, "INITIAL")) qc->print_initial_clusters = true; else { lex_error (lexer, NULL); return false; } } } else if (lex_match_id (lexer, "SAVE")) { lex_match (lexer, T_EQUALS); while (lex_token (lexer) != T_ENDCMD && lex_token (lexer) != T_SLASH) { if (lex_match_id (lexer, "CLUSTER")) { qc->save_values |= SAVE_MEMBERSHIP; if (lex_match (lexer, T_LPAREN)) { if (!lex_force_id (lexer)) return false; free (qc->var_membership); qc->var_membership = xstrdup (lex_tokcstr (lexer)); if (NULL != dict_lookup_var (qc->dict, qc->var_membership)) { lex_error (lexer, _("A variable called `%s' already exists."), qc->var_membership); free (qc->var_membership); qc->var_membership = NULL; return false; } lex_get (lexer); if (!lex_force_match (lexer, T_RPAREN)) return false; } } else if (lex_match_id (lexer, "DISTANCE")) { qc->save_values |= SAVE_DISTANCE; if (lex_match (lexer, T_LPAREN)) { if (!lex_force_id (lexer)) return false; free (qc->var_distance); qc->var_distance = xstrdup (lex_tokcstr (lexer)); if (NULL != dict_lookup_var (qc->dict, qc->var_distance)) { lex_error (lexer, _("A variable called `%s' already exists."), qc->var_distance); free (qc->var_distance); qc->var_distance = NULL; return false; } lex_get (lexer); if (!lex_force_match (lexer, T_RPAREN)) return false; } } else { lex_error (lexer, _("Expecting %s or %s."), "CLUSTER", "DISTANCE"); return false; } } } else if (lex_match_id (lexer, "CRITERIA")) { lex_match (lexer, T_EQUALS); while (lex_token (lexer) != T_ENDCMD && lex_token (lexer) != T_SLASH) { if (lex_match_id (lexer, "CLUSTERS")) { if (lex_force_match (lexer, T_LPAREN) && lex_force_int (lexer)) { qc->ngroups = lex_integer (lexer); if (qc->ngroups <= 0) { lex_error (lexer, _("The number of clusters must be positive")); return false; } lex_get (lexer); if (!lex_force_match (lexer, T_RPAREN)) return false; } } else if (lex_match_id (lexer, "CONVERGE")) { if (lex_force_match (lexer, T_LPAREN) && lex_force_num (lexer)) { qc->epsilon = lex_number (lexer); if (qc->epsilon <= 0) { lex_error (lexer, _("The convergence criterion must be positive")); return false; } lex_get (lexer); if (!lex_force_match (lexer, T_RPAREN)) return false; } } else if (lex_match_id (lexer, "MXITER")) { if (lex_force_match (lexer, T_LPAREN) && lex_force_int (lexer)) { qc->maxiter = lex_integer (lexer); if (qc->maxiter <= 0) { lex_error (lexer, _("The number of iterations must be positive")); return false; } lex_get (lexer); if (!lex_force_match (lexer, T_RPAREN)) return false; } } else if (lex_match_id (lexer, "NOINITIAL")) { qc->no_initial = true; } else if (lex_match_id (lexer, "NOUPDATE")) { qc->no_update = true; } else { lex_error (lexer, NULL); return false; } } } else { lex_error (lexer, NULL); return false; } } return true; } int cmd_quick_cluster (struct lexer *lexer, struct dataset *ds) { struct qc qc; struct Kmeans *kmeans; bool ok; memset (&qc, 0, sizeof qc); qc.dataset = ds; qc.dict = dataset_dict (ds); qc.ngroups = 2; qc.maxiter = 10; qc.epsilon = DBL_EPSILON; qc.missing_type = MISS_LISTWISE; qc.exclude = MV_ANY; if (!quick_cluster_parse (lexer, &qc)) goto error; qc.wv = dict_get_weight (qc.dict); { struct casereader *group; struct casegrouper *grouper = casegrouper_create_splits (proc_open (ds), qc.dict); while (casegrouper_get_next_group (grouper, &group)) { if (qc.missing_type == MISS_LISTWISE) { group = casereader_create_filter_missing (group, qc.vars, qc.n_vars, qc.exclude, NULL, NULL); } kmeans = kmeans_create (&qc); kmeans_cluster (kmeans, group, &qc); quick_cluster_show_results (kmeans, group, &qc); kmeans_destroy (kmeans); casereader_destroy (group); } ok = casegrouper_destroy (grouper); } ok = proc_commit (ds) && ok; /* If requested, set a transformation to append the cluster and distance values to the current dataset. */ if (qc.save_trans_data) { struct save_trans_data *std = qc.save_trans_data; std->appending_reader = casewriter_make_reader (std->writer); std->writer = NULL; if (qc.save_values & SAVE_MEMBERSHIP) { /* Invent a variable name if necessary. */ int idx = 0; struct string name; ds_init_empty (&name); while (qc.var_membership == NULL) { ds_clear (&name); ds_put_format (&name, "QCL_%d", idx++); if (!dict_lookup_var (qc.dict, ds_cstr (&name))) { qc.var_membership = strdup (ds_cstr (&name)); break; } } ds_destroy (&name); std->membership = dict_create_var_assert (qc.dict, qc.var_membership, 0); } if (qc.save_values & SAVE_DISTANCE) { /* Invent a variable name if necessary. */ int idx = 0; struct string name; ds_init_empty (&name); while (qc.var_distance == NULL) { ds_clear (&name); ds_put_format (&name, "QCL_%d", idx++); if (!dict_lookup_var (qc.dict, ds_cstr (&name))) { qc.var_distance = strdup (ds_cstr (&name)); break; } } ds_destroy (&name); std->distance = dict_create_var_assert (qc.dict, qc.var_distance, 0); } add_transformation (qc.dataset, save_trans_func, save_trans_destroy, std); } free (qc.var_distance); free (qc.var_membership); free (qc.vars); return (ok); error: free (qc.var_distance); free (qc.var_membership); free (qc.vars); return CMD_FAILURE; } pspp-1.4.1/src/language/stats/sort-cases.c0000644000175000017500000000443113571051220020050 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 1997-9, 2000, 2010, 2011 Free Software Foundation, Inc. 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 3 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, see . */ #include #include #include #include #include "data/dataset.h" #include "data/settings.h" #include "data/subcase.h" #include "data/variable.h" #include "language/command.h" #include "language/lexer/lexer.h" #include "language/stats/sort-criteria.h" #include "libpspp/message.h" #include "math/sort.h" #include "gl/xalloc.h" #include "gettext.h" #define _(msgid) gettext (msgid) /* Performs the SORT CASES procedures. */ int cmd_sort_cases (struct lexer *lexer, struct dataset *ds) { struct subcase ordering; struct casereader *output; bool ok = false; lex_match (lexer, T_BY); proc_cancel_temporary_transformations (ds); subcase_init_empty (&ordering); if (!parse_sort_criteria (lexer, dataset_dict (ds), &ordering, NULL, NULL)) return CMD_CASCADING_FAILURE; if (settings_get_testing_mode () && lex_match (lexer, T_SLASH)) { if (!lex_force_match_id (lexer, "BUFFERS") || !lex_match (lexer, T_EQUALS) || !lex_force_int (lexer)) goto done; min_buffers = max_buffers = lex_integer (lexer); if (max_buffers < 2) { msg (SE, _("Buffer limit must be at least 2.")); goto done; } lex_get (lexer); } proc_discard_output (ds); output = sort_execute (proc_open_filtering (ds, false), &ordering); ok = proc_commit (ds); ok = dataset_set_source (ds, output) && ok; done: min_buffers = 64; max_buffers = INT_MAX; subcase_destroy (&ordering); return ok ? CMD_SUCCESS : CMD_CASCADING_FAILURE; } pspp-1.4.1/src/language/stats/t-test-indep.c0000644000175000017500000002476613717773141020336 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2011, 2020 Free Software Foundation, Inc. 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 3 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, see . */ #include #include "t-test.h" #include #include #include "libpspp/misc.h" #include "libpspp/str.h" #include "data/casereader.h" #include "data/dictionary.h" #include "data/format.h" #include "data/variable.h" #include "math/moments.h" #include "math/levene.h" #include "output/pivot-table.h" #include "gettext.h" #define N_(msgid) msgid #define _(msgid) gettext (msgid) struct indep_samples { const struct variable *gvar; bool cut; const union value *gval0; const union value *gval1; }; struct pair_stats { struct moments *mom[2]; double lev ; struct levene *nl; }; static void indep_summary (const struct tt *tt, struct indep_samples *is, const struct pair_stats *ps); static void indep_test (const struct tt *tt, const struct pair_stats *ps); static int which_group (const union value *v, const struct indep_samples *is) { int width = var_get_width (is->gvar); int cmp = value_compare_3way (v, is->gval0, width); if (is->cut) return (cmp < 0); if (cmp == 0) return 0; if (0 == value_compare_3way (v, is->gval1, width)) return 1; return -1; } void indep_run (struct tt *tt, const struct variable *gvar, bool cut, const union value *gval0, const union value *gval1, struct casereader *reader) { struct indep_samples is; struct ccase *c; struct casereader *r; struct pair_stats *ps = XCALLOC (tt->n_vars, struct pair_stats); int v; for (v = 0; v < tt->n_vars; ++v) { ps[v].mom[0] = moments_create (MOMENT_VARIANCE); ps[v].mom[1] = moments_create (MOMENT_VARIANCE); ps[v].nl = levene_create (var_get_width (gvar), cut ? gval0: NULL); } is.gvar = gvar; is.gval0 = gval0; is.gval1 = gval1; is.cut = cut; r = casereader_clone (reader); for (; (c = casereader_read (r)); case_unref (c)) { double w = dict_get_case_weight (tt->dict, c, NULL); const union value *gv = case_data (c, gvar); int grp = which_group (gv, &is); if (grp < 0) continue; for (v = 0; v < tt->n_vars; ++v) { const union value *val = case_data (c, tt->vars[v]); if (var_is_value_missing (tt->vars[v], val, tt->exclude)) continue; moments_pass_one (ps[v].mom[grp], val->f, w); levene_pass_one (ps[v].nl, val->f, w, gv); } } casereader_destroy (r); r = casereader_clone (reader); for (; (c = casereader_read (r)); case_unref (c)) { double w = dict_get_case_weight (tt->dict, c, NULL); const union value *gv = case_data (c, gvar); int grp = which_group (gv, &is); if (grp < 0) continue; for (v = 0; v < tt->n_vars; ++v) { const union value *val = case_data (c, tt->vars[v]); if (var_is_value_missing (tt->vars[v], val, tt->exclude)) continue; moments_pass_two (ps[v].mom[grp], val->f, w); levene_pass_two (ps[v].nl, val->f, w, gv); } } casereader_destroy (r); r = reader; for (; (c = casereader_read (r)); case_unref (c)) { double w = dict_get_case_weight (tt->dict, c, NULL); const union value *gv = case_data (c, gvar); int grp = which_group (gv, &is); if (grp < 0) continue; for (v = 0; v < tt->n_vars; ++v) { const union value *val = case_data (c, tt->vars[v]); if (var_is_value_missing (tt->vars[v], val, tt->exclude)) continue; levene_pass_three (ps[v].nl, val->f, w, gv); } } casereader_destroy (r); for (v = 0; v < tt->n_vars; ++v) ps[v].lev = levene_calculate (ps[v].nl); indep_summary (tt, &is, ps); indep_test (tt, ps); for (v = 0; v < tt->n_vars; ++v) { moments_destroy (ps[v].mom[0]); moments_destroy (ps[v].mom[1]); levene_destroy (ps[v].nl); } free (ps); } static void indep_summary (const struct tt *tt, struct indep_samples *is, const struct pair_stats *ps) { struct pivot_table *table = pivot_table_create (N_("Group Statistics")); pivot_table_set_weight_var (table, tt->wv); pivot_dimension_create (table, PIVOT_AXIS_COLUMN, N_("Statistics"), N_("N"), PIVOT_RC_COUNT, N_("Mean"), PIVOT_RC_OTHER, N_("Std. Deviation"), PIVOT_RC_OTHER, N_("S.E. Mean"), PIVOT_RC_OTHER); struct pivot_dimension *group = pivot_dimension_create ( table, PIVOT_AXIS_ROW, N_("Group")); group->root->show_label = true; if (is->cut) { struct string vallab0 = DS_EMPTY_INITIALIZER; ds_put_cstr (&vallab0, "≥"); var_append_value_name (is->gvar, is->gval0, &vallab0); pivot_category_create_leaf (group->root, pivot_value_new_user_text_nocopy ( ds_steal_cstr (&vallab0))); struct string vallab1 = DS_EMPTY_INITIALIZER; ds_put_cstr (&vallab1, "<"); var_append_value_name (is->gvar, is->gval0, &vallab1); pivot_category_create_leaf (group->root, pivot_value_new_user_text_nocopy ( ds_steal_cstr (&vallab1))); } else { pivot_category_create_leaf ( group->root, pivot_value_new_var_value (is->gvar, is->gval0)); pivot_category_create_leaf ( group->root, pivot_value_new_var_value (is->gvar, is->gval1)); } struct pivot_dimension *dep_vars = pivot_dimension_create ( table, PIVOT_AXIS_ROW, N_("Dependent Variables")); for (size_t v = 0; v < tt->n_vars; ++v) { const struct variable *var = tt->vars[v]; int dep_var_idx = pivot_category_create_leaf ( dep_vars->root, pivot_value_new_variable (var)); for (int i = 0 ; i < 2; ++i) { double cc, mean, sigma; moments_calculate (ps[v].mom[i], &cc, &mean, &sigma, NULL, NULL); double entries[] = { cc, mean, sqrt (sigma), sqrt (sigma / cc) }; for (size_t j = 0; j < sizeof entries / sizeof *entries; j++) pivot_table_put3 (table, j, i, dep_var_idx, pivot_value_new_number (entries[j])); } } pivot_table_submit (table); } static void indep_test (const struct tt *tt, const struct pair_stats *ps) { struct pivot_table *table = pivot_table_create ( N_("Independent Samples Test")); struct pivot_dimension *statistics = pivot_dimension_create ( table, PIVOT_AXIS_COLUMN, N_("Statistics")); pivot_category_create_group ( statistics->root, N_("Levene's Test for Equality of Variances"), N_("F"), PIVOT_RC_OTHER, N_("Sig."), PIVOT_RC_SIGNIFICANCE); struct pivot_category *group = pivot_category_create_group ( statistics->root, N_("T-Test for Equality of Means"), N_("t"), PIVOT_RC_OTHER, N_("df"), PIVOT_RC_OTHER, N_("Sig. (2-tailed)"), PIVOT_RC_SIGNIFICANCE, N_("Mean Difference"), PIVOT_RC_OTHER, N_("Std. Error Difference"), PIVOT_RC_OTHER); pivot_category_create_group ( /* xgettext:no-c-format */ group, N_("95% Confidence Interval of the Difference"), N_("Lower"), PIVOT_RC_OTHER, N_("Upper"), PIVOT_RC_OTHER); pivot_dimension_create (table, PIVOT_AXIS_ROW, N_("Assumptions"), N_("Equal variances assumed"), N_("Equal variances not assumed")); struct pivot_dimension *dep_vars = pivot_dimension_create ( table, PIVOT_AXIS_ROW, N_("Dependent Variables")); for (size_t v = 0; v < tt->n_vars; ++v) { int dep_var_idx = pivot_category_create_leaf ( dep_vars->root, pivot_value_new_variable (tt->vars[v])); double cc0, mean0, sigma0; double cc1, mean1, sigma1; moments_calculate (ps[v].mom[0], &cc0, &mean0, &sigma0, NULL, NULL); moments_calculate (ps[v].mom[1], &cc1, &mean1, &sigma1, NULL, NULL); double mean_diff = mean0 - mean1; /* Equal variances assumed. */ double e_df = cc0 + cc1 - 2.0; double e_pooled_variance = ((cc0 - 1)* sigma0 + (cc1 - 1) * sigma1) / e_df; double e_tval = ((mean0 - mean1) / sqrt (e_pooled_variance) / sqrt ((cc0 + cc1) / (cc0 * cc1))); double e_p = gsl_cdf_tdist_P (e_tval, e_df); double e_q = gsl_cdf_tdist_Q (e_tval, e_df); double e_sig = 2.0 * (e_tval > 0 ? e_q : e_p); double e_std_err_diff = sqrt (e_pooled_variance * (1.0/cc0 + 1.0/cc1)); double e_tval_qinv = gsl_cdf_tdist_Qinv ((1 - tt->confidence) / 2.0, e_df); /* Equal variances not assumed */ const double s0 = sigma0 / cc0; const double s1 = sigma1 / cc1; double d_df = (pow2 (s0 + s1) / (pow2 (s0) / (cc0 - 1) + pow2 (s1) / (cc1 - 1))); double d_tval = mean_diff / sqrt (sigma0 / cc0 + sigma1 / cc1); double d_p = gsl_cdf_tdist_P (d_tval, d_df); double d_q = gsl_cdf_tdist_Q (d_tval, d_df); double d_sig = 2.0 * (d_tval > 0 ? d_q : d_p); double d_std_err_diff = sqrt ((sigma0 / cc0) + (sigma1 / cc1)); double d_tval_qinv = gsl_cdf_tdist_Qinv ((1 - tt->confidence) / 2.0, d_df); struct entry { int assumption_idx; int stat_idx; double x; } entries[] = { { 0, 0, ps[v].lev }, { 0, 1, gsl_cdf_fdist_Q (ps[v].lev, 1, cc0 + cc1 - 2) }, { 0, 2, e_tval }, { 0, 3, e_df }, { 0, 4, e_sig }, { 0, 5, mean_diff }, { 0, 6, e_std_err_diff }, { 0, 7, mean_diff - e_tval_qinv * e_std_err_diff }, { 0, 8, mean_diff + e_tval_qinv * e_std_err_diff }, { 1, 2, d_tval }, { 1, 3, d_df }, { 1, 4, d_sig }, { 1, 5, mean_diff }, { 1, 6, d_std_err_diff }, { 1, 7, mean_diff - d_tval_qinv * d_std_err_diff }, { 1, 8, mean_diff + d_tval_qinv * d_std_err_diff }, }; for (size_t i = 0; i < sizeof entries / sizeof *entries; i++) { const struct entry *e = &entries[i]; pivot_table_put3 (table, e->stat_idx, e->assumption_idx, dep_var_idx, pivot_value_new_number (e->x)); } } pivot_table_submit (table); } pspp-1.4.1/src/language/stats/npar-summary.h0000644000175000017500000000262613412603263020435 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2006, 2011 Free Software Foundation, Inc. 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 3 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, see . */ #if !n_par_summary_h #define n_par_summary_h 1 #include "data/missing-values.h" struct variable ; struct casereader ; struct dictionary; struct fmt_spec; struct descriptives { double n; double mean; double std_dev; double min; double max; }; void do_summary_box (const struct descriptives *desc, const struct variable *const *vv, int n_vars, const struct fmt_spec *wfmt); void npar_summary_calc_descriptives (struct descriptives *desc, struct casereader *input, const struct dictionary *dict, const struct variable *const *vv, int n_vars, enum mv_class filter); #endif pspp-1.4.1/src/language/stats/runs.h0000644000175000017500000000231013320146056016757 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2006, 2011 Free Software Foundation, Inc. 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 3 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, see . */ #if !runs_h #define runs_h 1 #include #include #include "language/stats/npar.h" enum cp_mode { CP_MEAN, CP_MEDIAN, CP_MODE, CP_CUSTOM }; struct runs_test { struct one_sample_test parent; double cutpoint; enum cp_mode cp_mode; }; void runs_execute (const struct dataset *ds, struct casereader *input, enum mv_class exclude, const struct npar_test *test, bool, double); #endif pspp-1.4.1/src/language/stats/roc.c0000644000175000017500000007211513700645725016571 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2009, 2010, 2011 Free Software Foundation, Inc. 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 3 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, see . */ #include #include "language/stats/roc.h" #include #include "data/casegrouper.h" #include "data/casereader.h" #include "data/casewriter.h" #include "data/dataset.h" #include "data/dictionary.h" #include "data/format.h" #include "data/subcase.h" #include "language/command.h" #include "language/lexer/lexer.h" #include "language/lexer/value-parser.h" #include "language/lexer/variable-parser.h" #include "libpspp/misc.h" #include "math/sort.h" #include "output/chart-item.h" #include "output/charts/roc-chart.h" #include "output/pivot-table.h" #include "gettext.h" #define _(msgid) gettext (msgid) #define N_(msgid) msgid struct cmd_roc { size_t n_vars; const struct variable **vars; const struct dictionary *dict; const struct variable *state_var; union value state_value; size_t state_var_width; /* Plot the roc curve */ bool curve; /* Plot the reference line */ bool reference; double ci; bool print_coords; bool print_se; bool bi_neg_exp; /* True iff the bi-negative exponential critieria should be used */ enum mv_class exclude; bool invert ; /* True iff a smaller test result variable indicates a positive result */ double pos; double neg; double pos_weighted; double neg_weighted; }; static int run_roc (struct dataset *ds, struct cmd_roc *roc); int cmd_roc (struct lexer *lexer, struct dataset *ds) { struct cmd_roc roc ; const struct dictionary *dict = dataset_dict (ds); roc.vars = NULL; roc.n_vars = 0; roc.print_se = false; roc.print_coords = false; roc.exclude = MV_ANY; roc.curve = true; roc.reference = false; roc.ci = 95; roc.bi_neg_exp = false; roc.invert = false; roc.pos = roc.pos_weighted = 0; roc.neg = roc.neg_weighted = 0; roc.dict = dataset_dict (ds); roc.state_var = NULL; roc.state_var_width = -1; lex_match (lexer, T_SLASH); if (!parse_variables_const (lexer, dict, &roc.vars, &roc.n_vars, PV_APPEND | PV_NO_DUPLICATE | PV_NUMERIC)) goto error; if (! lex_force_match (lexer, T_BY)) { goto error; } roc.state_var = parse_variable (lexer, dict); if (! roc.state_var) { goto error; } if (!lex_force_match (lexer, T_LPAREN)) { goto error; } roc.state_var_width = var_get_width (roc.state_var); value_init (&roc.state_value, roc.state_var_width); parse_value (lexer, &roc.state_value, roc.state_var); if (!lex_force_match (lexer, T_RPAREN)) { goto error; } while (lex_token (lexer) != T_ENDCMD) { lex_match (lexer, T_SLASH); if (lex_match_id (lexer, "MISSING")) { lex_match (lexer, T_EQUALS); while (lex_token (lexer) != T_ENDCMD && lex_token (lexer) != T_SLASH) { if (lex_match_id (lexer, "INCLUDE")) { roc.exclude = MV_SYSTEM; } else if (lex_match_id (lexer, "EXCLUDE")) { roc.exclude = MV_ANY; } else { lex_error (lexer, NULL); goto error; } } } else if (lex_match_id (lexer, "PLOT")) { lex_match (lexer, T_EQUALS); if (lex_match_id (lexer, "CURVE")) { roc.curve = true; if (lex_match (lexer, T_LPAREN)) { roc.reference = true; if (! lex_force_match_id (lexer, "REFERENCE")) goto error; if (! lex_force_match (lexer, T_RPAREN)) goto error; } } else if (lex_match_id (lexer, "NONE")) { roc.curve = false; } else { lex_error (lexer, NULL); goto error; } } else if (lex_match_id (lexer, "PRINT")) { lex_match (lexer, T_EQUALS); while (lex_token (lexer) != T_ENDCMD && lex_token (lexer) != T_SLASH) { if (lex_match_id (lexer, "SE")) { roc.print_se = true; } else if (lex_match_id (lexer, "COORDINATES")) { roc.print_coords = true; } else { lex_error (lexer, NULL); goto error; } } } else if (lex_match_id (lexer, "CRITERIA")) { lex_match (lexer, T_EQUALS); while (lex_token (lexer) != T_ENDCMD && lex_token (lexer) != T_SLASH) { if (lex_match_id (lexer, "CUTOFF")) { if (! lex_force_match (lexer, T_LPAREN)) goto error; if (lex_match_id (lexer, "INCLUDE")) { roc.exclude = MV_SYSTEM; } else if (lex_match_id (lexer, "EXCLUDE")) { roc.exclude = MV_USER | MV_SYSTEM; } else { lex_error (lexer, NULL); goto error; } if (! lex_force_match (lexer, T_RPAREN)) goto error; } else if (lex_match_id (lexer, "TESTPOS")) { if (! lex_force_match (lexer, T_LPAREN)) goto error; if (lex_match_id (lexer, "LARGE")) { roc.invert = false; } else if (lex_match_id (lexer, "SMALL")) { roc.invert = true; } else { lex_error (lexer, NULL); goto error; } if (! lex_force_match (lexer, T_RPAREN)) goto error; } else if (lex_match_id (lexer, "CI")) { if (!lex_force_match (lexer, T_LPAREN)) goto error; if (! lex_force_num (lexer)) goto error; roc.ci = lex_number (lexer); lex_get (lexer); if (!lex_force_match (lexer, T_RPAREN)) goto error; } else if (lex_match_id (lexer, "DISTRIBUTION")) { if (!lex_force_match (lexer, T_LPAREN)) goto error; if (lex_match_id (lexer, "FREE")) { roc.bi_neg_exp = false; } else if (lex_match_id (lexer, "NEGEXPO")) { roc.bi_neg_exp = true; } else { lex_error (lexer, NULL); goto error; } if (!lex_force_match (lexer, T_RPAREN)) goto error; } else { lex_error (lexer, NULL); goto error; } } } else { lex_error (lexer, NULL); break; } } if (! run_roc (ds, &roc)) goto error; if (roc.state_var) value_destroy (&roc.state_value, roc.state_var_width); free (roc.vars); return CMD_SUCCESS; error: if (roc.state_var) value_destroy (&roc.state_value, roc.state_var_width); free (roc.vars); return CMD_FAILURE; } static void do_roc (struct cmd_roc *roc, struct casereader *group, struct dictionary *dict); static int run_roc (struct dataset *ds, struct cmd_roc *roc) { struct dictionary *dict = dataset_dict (ds); bool ok; struct casereader *group; struct casegrouper *grouper = casegrouper_create_splits (proc_open (ds), dict); while (casegrouper_get_next_group (grouper, &group)) { do_roc (roc, group, dataset_dict (ds)); } ok = casegrouper_destroy (grouper); ok = proc_commit (ds) && ok; return ok; } #if 0 static void dump_casereader (struct casereader *reader) { struct ccase *c; struct casereader *r = casereader_clone (reader); for (; (c = casereader_read (r)); case_unref (c)) { int i; for (i = 0 ; i < case_get_value_cnt (c); ++i) { printf ("%g ", case_data_idx (c, i)->f); } printf ("\n"); } casereader_destroy (r); } #endif /* Return true iff the state variable indicates that C has positive actual state. As a side effect, this function also accumulates the roc->{pos,neg} and roc->{pos,neg}_weighted counts. */ static bool match_positives (const struct ccase *c, void *aux) { struct cmd_roc *roc = aux; const struct variable *wv = dict_get_weight (roc->dict); const double weight = wv ? case_data (c, wv)->f : 1.0; const bool positive = (0 == value_compare_3way (case_data (c, roc->state_var), &roc->state_value, var_get_width (roc->state_var))); if (positive) { roc->pos++; roc->pos_weighted += weight; } else { roc->neg++; roc->neg_weighted += weight; } return positive; } #define VALUE 0 #define N_EQ 1 #define N_PRED 2 /* Some intermediate state for calculating the cutpoints and the standard error values */ struct roc_state { double auc; /* Area under the curve */ double n1; /* total weight of positives */ double n2; /* total weight of negatives */ /* intermediates for standard error */ double q1hat; double q2hat; /* intermediates for cutpoints */ struct casewriter *cutpoint_wtr; struct casereader *cutpoint_rdr; double prev_result; double min; double max; }; /* Return a new casereader based upon CUTPOINT_RDR. The number of "positive" cases are placed into the position TRUE_INDEX, and the number of "negative" cases into FALSE_INDEX. POS_COND and RESULT determine the semantics of what is "positive". WEIGHT is the value of a single count. */ static struct casereader * accumulate_counts (struct casereader *input, double result, double weight, bool (*pos_cond) (double, double), int true_index, int false_index) { const struct caseproto *proto = casereader_get_proto (input); struct casewriter *w = autopaging_writer_create (proto); struct ccase *cpc; double prev_cp = SYSMIS; for (; (cpc = casereader_read (input)); case_unref (cpc)) { struct ccase *new_case; const double cp = case_data_idx (cpc, ROC_CUTPOINT)->f; assert (cp != SYSMIS); /* We don't want duplicates here */ if (cp == prev_cp) continue; new_case = case_clone (cpc); if (pos_cond (result, cp)) case_data_rw_idx (new_case, true_index)->f += weight; else case_data_rw_idx (new_case, false_index)->f += weight; prev_cp = cp; casewriter_write (w, new_case); } casereader_destroy (input); return casewriter_make_reader (w); } static void output_roc (struct roc_state *rs, const struct cmd_roc *roc); /* This function does 3 things: 1. Counts the number of cases which are equal to every other case in READER, and those cases for which the relationship between it and every other case satifies PRED (normally either > or <). VAR is variable defining a case's value for this purpose. 2. Counts the number of true and false cases in reader, and populates CUTPOINT_RDR accordingly. TRUE_INDEX and FALSE_INDEX are the indices which receive these values. POS_COND is the condition defining true and false. 3. CC is filled with the cumulative weight of all cases of READER. */ static struct casereader * process_group (const struct variable *var, struct casereader *reader, bool (*pred) (double, double), const struct dictionary *dict, double *cc, struct casereader **cutpoint_rdr, bool (*pos_cond) (double, double), int true_index, int false_index) { const struct variable *w = dict_get_weight (dict); struct casereader *r1 = casereader_create_distinct (sort_execute_1var (reader, var), var, w); const int weight_idx = w ? var_get_case_index (w) : caseproto_get_n_widths (casereader_get_proto (r1)) - 1; struct ccase *c1; struct casereader *rclone = casereader_clone (r1); struct casewriter *wtr; struct caseproto *proto = caseproto_create (); proto = caseproto_add_width (proto, 0); proto = caseproto_add_width (proto, 0); proto = caseproto_add_width (proto, 0); wtr = autopaging_writer_create (proto); *cc = 0; for (; (c1 = casereader_read (r1)); case_unref (c1)) { struct ccase *new_case = case_create (proto); struct ccase *c2; struct casereader *r2 = casereader_clone (rclone); const double weight1 = case_data_idx (c1, weight_idx)->f; const double d1 = case_data (c1, var)->f; double n_eq = 0.0; double n_pred = 0.0; *cutpoint_rdr = accumulate_counts (*cutpoint_rdr, d1, weight1, pos_cond, true_index, false_index); *cc += weight1; for (; (c2 = casereader_read (r2)); case_unref (c2)) { const double d2 = case_data (c2, var)->f; const double weight2 = case_data_idx (c2, weight_idx)->f; if (d1 == d2) { n_eq += weight2; continue; } else if (pred (d2, d1)) { n_pred += weight2; } } case_data_rw_idx (new_case, VALUE)->f = d1; case_data_rw_idx (new_case, N_EQ)->f = n_eq; case_data_rw_idx (new_case, N_PRED)->f = n_pred; casewriter_write (wtr, new_case); casereader_destroy (r2); } casereader_destroy (r1); casereader_destroy (rclone); caseproto_unref (proto); return casewriter_make_reader (wtr); } /* Some more indeces into case data */ #define N_POS_EQ 1 /* number of positive cases with values equal to n */ #define N_POS_GT 2 /* number of positive cases with values greater than n */ #define N_NEG_EQ 3 /* number of negative cases with values equal to n */ #define N_NEG_LT 4 /* number of negative cases with values less than n */ static bool gt (double d1, double d2) { return d1 > d2; } static bool ge (double d1, double d2) { return d1 > d2; } static bool lt (double d1, double d2) { return d1 < d2; } /* Return a casereader with width 3, populated with cases based upon READER. The cases will have the values: (N, number of cases equal to N, number of cases greater than N) As a side effect, update RS->n1 with the number of positive cases. */ static struct casereader * process_positive_group (const struct variable *var, struct casereader *reader, const struct dictionary *dict, struct roc_state *rs) { return process_group (var, reader, gt, dict, &rs->n1, &rs->cutpoint_rdr, ge, ROC_TP, ROC_FN); } /* Return a casereader with width 3, populated with cases based upon READER. The cases will have the values: (N, number of cases equal to N, number of cases less than N) As a side effect, update RS->n2 with the number of negative cases. */ static struct casereader * process_negative_group (const struct variable *var, struct casereader *reader, const struct dictionary *dict, struct roc_state *rs) { return process_group (var, reader, lt, dict, &rs->n2, &rs->cutpoint_rdr, lt, ROC_TN, ROC_FP); } static void append_cutpoint (struct casewriter *writer, double cutpoint) { struct ccase *cc = case_create (casewriter_get_proto (writer)); case_data_rw_idx (cc, ROC_CUTPOINT)->f = cutpoint; case_data_rw_idx (cc, ROC_TP)->f = 0; case_data_rw_idx (cc, ROC_FN)->f = 0; case_data_rw_idx (cc, ROC_TN)->f = 0; case_data_rw_idx (cc, ROC_FP)->f = 0; casewriter_write (writer, cc); } /* Create and initialise the rs[x].cutpoint_rdr casereaders. That is, the readers will be created with width 5, ready to take the values (cutpoint, ROC_TP, ROC_FN, ROC_TN, ROC_FP), and the reader will be populated with its final number of cases. However on exit from this function, only ROC_CUTPOINT entries will be set to their final value. The other entries will be initialised to zero. */ static void prepare_cutpoints (struct cmd_roc *roc, struct roc_state *rs, struct casereader *input) { int i; struct casereader *r = casereader_clone (input); struct ccase *c; { struct caseproto *proto = caseproto_create (); struct subcase ordering; subcase_init (&ordering, ROC_CUTPOINT, 0, SC_ASCEND); proto = caseproto_add_width (proto, 0); /* cutpoint */ proto = caseproto_add_width (proto, 0); /* ROC_TP */ proto = caseproto_add_width (proto, 0); /* ROC_FN */ proto = caseproto_add_width (proto, 0); /* ROC_TN */ proto = caseproto_add_width (proto, 0); /* ROC_FP */ for (i = 0 ; i < roc->n_vars; ++i) { rs[i].cutpoint_wtr = sort_create_writer (&ordering, proto); rs[i].prev_result = SYSMIS; rs[i].max = -DBL_MAX; rs[i].min = DBL_MAX; } caseproto_unref (proto); subcase_destroy (&ordering); } for (; (c = casereader_read (r)) != NULL; case_unref (c)) { for (i = 0 ; i < roc->n_vars; ++i) { const union value *v = case_data (c, roc->vars[i]); const double result = v->f; if (mv_is_value_missing (var_get_missing_values (roc->vars[i]), v, roc->exclude)) continue; minimize (&rs[i].min, result); maximize (&rs[i].max, result); if (rs[i].prev_result != SYSMIS && rs[i].prev_result != result) { const double mean = (result + rs[i].prev_result) / 2.0; append_cutpoint (rs[i].cutpoint_wtr, mean); } rs[i].prev_result = result; } } casereader_destroy (r); /* Append the min and max cutpoints */ for (i = 0 ; i < roc->n_vars; ++i) { append_cutpoint (rs[i].cutpoint_wtr, rs[i].min - 1); append_cutpoint (rs[i].cutpoint_wtr, rs[i].max + 1); rs[i].cutpoint_rdr = casewriter_make_reader (rs[i].cutpoint_wtr); } } static void do_roc (struct cmd_roc *roc, struct casereader *reader, struct dictionary *dict) { int i; struct roc_state *rs = XCALLOC (roc->n_vars, struct roc_state); struct casereader *negatives = NULL; struct casereader *positives = NULL; struct caseproto *n_proto = NULL; struct subcase up_ordering; struct subcase down_ordering; struct casewriter *neg_wtr = NULL; struct casereader *input = casereader_create_filter_missing (reader, roc->vars, roc->n_vars, roc->exclude, NULL, NULL); input = casereader_create_filter_missing (input, &roc->state_var, 1, roc->exclude, NULL, NULL); neg_wtr = autopaging_writer_create (casereader_get_proto (input)); prepare_cutpoints (roc, rs, input); /* Separate the positive actual state cases from the negative ones */ positives = casereader_create_filter_func (input, match_positives, NULL, roc, neg_wtr); n_proto = caseproto_create (); n_proto = caseproto_add_width (n_proto, 0); n_proto = caseproto_add_width (n_proto, 0); n_proto = caseproto_add_width (n_proto, 0); n_proto = caseproto_add_width (n_proto, 0); n_proto = caseproto_add_width (n_proto, 0); subcase_init (&up_ordering, VALUE, 0, SC_ASCEND); subcase_init (&down_ordering, VALUE, 0, SC_DESCEND); for (i = 0 ; i < roc->n_vars; ++i) { struct casewriter *w = NULL; struct casereader *r = NULL; struct ccase *c; struct ccase *cpos; struct casereader *n_neg_reader ; const struct variable *var = roc->vars[i]; struct casereader *neg ; struct casereader *pos = casereader_clone (positives); struct casereader *n_pos_reader = process_positive_group (var, pos, dict, &rs[i]); if (negatives == NULL) { negatives = casewriter_make_reader (neg_wtr); } neg = casereader_clone (negatives); n_neg_reader = process_negative_group (var, neg, dict, &rs[i]); /* Merge the n_pos and n_neg casereaders */ w = sort_create_writer (&up_ordering, n_proto); for (; (cpos = casereader_read (n_pos_reader)); case_unref (cpos)) { struct ccase *pos_case = case_create (n_proto); struct ccase *cneg; const double jpos = case_data_idx (cpos, VALUE)->f; while ((cneg = casereader_read (n_neg_reader))) { struct ccase *nc = case_create (n_proto); const double jneg = case_data_idx (cneg, VALUE)->f; case_data_rw_idx (nc, VALUE)->f = jneg; case_data_rw_idx (nc, N_POS_EQ)->f = 0; case_data_rw_idx (nc, N_POS_GT)->f = SYSMIS; *case_data_rw_idx (nc, N_NEG_EQ) = *case_data_idx (cneg, N_EQ); *case_data_rw_idx (nc, N_NEG_LT) = *case_data_idx (cneg, N_PRED); casewriter_write (w, nc); case_unref (cneg); if (jneg > jpos) break; } case_data_rw_idx (pos_case, VALUE)->f = jpos; *case_data_rw_idx (pos_case, N_POS_EQ) = *case_data_idx (cpos, N_EQ); *case_data_rw_idx (pos_case, N_POS_GT) = *case_data_idx (cpos, N_PRED); case_data_rw_idx (pos_case, N_NEG_EQ)->f = 0; case_data_rw_idx (pos_case, N_NEG_LT)->f = SYSMIS; casewriter_write (w, pos_case); } casereader_destroy (n_pos_reader); casereader_destroy (n_neg_reader); /* These aren't used anymore */ #undef N_EQ #undef N_PRED r = casewriter_make_reader (w); /* Propagate the N_POS_GT values from the positive cases to the negative ones */ { double prev_pos_gt = rs[i].n1; w = sort_create_writer (&down_ordering, n_proto); for (; (c = casereader_read (r)); case_unref (c)) { double n_pos_gt = case_data_idx (c, N_POS_GT)->f; struct ccase *nc = case_clone (c); if (n_pos_gt == SYSMIS) { n_pos_gt = prev_pos_gt; case_data_rw_idx (nc, N_POS_GT)->f = n_pos_gt; } casewriter_write (w, nc); prev_pos_gt = n_pos_gt; } casereader_destroy (r); r = casewriter_make_reader (w); } /* Propagate the N_NEG_LT values from the negative cases to the positive ones */ { double prev_neg_lt = rs[i].n2; w = sort_create_writer (&up_ordering, n_proto); for (; (c = casereader_read (r)); case_unref (c)) { double n_neg_lt = case_data_idx (c, N_NEG_LT)->f; struct ccase *nc = case_clone (c); if (n_neg_lt == SYSMIS) { n_neg_lt = prev_neg_lt; case_data_rw_idx (nc, N_NEG_LT)->f = n_neg_lt; } casewriter_write (w, nc); prev_neg_lt = n_neg_lt; } casereader_destroy (r); r = casewriter_make_reader (w); } { struct ccase *prev_case = NULL; for (; (c = casereader_read (r)); case_unref (c)) { struct ccase *next_case = casereader_peek (r, 0); const double j = case_data_idx (c, VALUE)->f; double n_pos_eq = case_data_idx (c, N_POS_EQ)->f; double n_pos_gt = case_data_idx (c, N_POS_GT)->f; double n_neg_eq = case_data_idx (c, N_NEG_EQ)->f; double n_neg_lt = case_data_idx (c, N_NEG_LT)->f; if (prev_case && j == case_data_idx (prev_case, VALUE)->f) { if (0 == case_data_idx (c, N_POS_EQ)->f) { n_pos_eq = case_data_idx (prev_case, N_POS_EQ)->f; n_pos_gt = case_data_idx (prev_case, N_POS_GT)->f; } if (0 == case_data_idx (c, N_NEG_EQ)->f) { n_neg_eq = case_data_idx (prev_case, N_NEG_EQ)->f; n_neg_lt = case_data_idx (prev_case, N_NEG_LT)->f; } } if (NULL == next_case || j != case_data_idx (next_case, VALUE)->f) { rs[i].auc += n_pos_gt * n_neg_eq + (n_pos_eq * n_neg_eq) / 2.0; rs[i].q1hat += n_neg_eq * (pow2 (n_pos_gt) + n_pos_gt * n_pos_eq + pow2 (n_pos_eq) / 3.0); rs[i].q2hat += n_pos_eq * (pow2 (n_neg_lt) + n_neg_lt * n_neg_eq + pow2 (n_neg_eq) / 3.0); } case_unref (next_case); case_unref (prev_case); prev_case = case_clone (c); } casereader_destroy (r); case_unref (prev_case); rs[i].auc /= rs[i].n1 * rs[i].n2; if (roc->invert) rs[i].auc = 1 - rs[i].auc; if (roc->bi_neg_exp) { rs[i].q1hat = rs[i].auc / (2 - rs[i].auc); rs[i].q2hat = 2 * pow2 (rs[i].auc) / (1 + rs[i].auc); } else { rs[i].q1hat /= rs[i].n2 * pow2 (rs[i].n1); rs[i].q2hat /= rs[i].n1 * pow2 (rs[i].n2); } } } casereader_destroy (positives); casereader_destroy (negatives); caseproto_unref (n_proto); subcase_destroy (&up_ordering); subcase_destroy (&down_ordering); output_roc (rs, roc); for (i = 0 ; i < roc->n_vars; ++i) casereader_destroy (rs[i].cutpoint_rdr); free (rs); } static void show_auc (struct roc_state *rs, const struct cmd_roc *roc) { struct pivot_table *table = pivot_table_create (N_("Area Under the Curve")); struct pivot_dimension *statistics = pivot_dimension_create ( table, PIVOT_AXIS_COLUMN, N_("Statistics"), N_("Area"), PIVOT_RC_OTHER); if (roc->print_se) { pivot_category_create_leaves ( statistics->root, N_("Std. Error"), PIVOT_RC_OTHER, N_("Asymptotic Sig."), PIVOT_RC_SIGNIFICANCE); struct pivot_category *interval = pivot_category_create_group__ ( statistics->root, pivot_value_new_text_format (N_("Asymp. %g%% Confidence Interval"), roc->ci)); pivot_category_create_leaves (interval, N_("Lower Bound"), PIVOT_RC_OTHER, N_("Upper Bound"), PIVOT_RC_OTHER); } struct pivot_dimension *variables = pivot_dimension_create ( table, PIVOT_AXIS_ROW, N_("Variable under test")); variables->root->show_label = true; for (size_t i = 0 ; i < roc->n_vars ; ++i) { int var_idx = pivot_category_create_leaf ( variables->root, pivot_value_new_variable (roc->vars[i])); pivot_table_put2 (table, 0, var_idx, pivot_value_new_number (rs[i].auc)); if (roc->print_se) { double se = (rs[i].auc * (1 - rs[i].auc) + (rs[i].n1 - 1) * (rs[i].q1hat - pow2 (rs[i].auc)) + (rs[i].n2 - 1) * (rs[i].q2hat - pow2 (rs[i].auc))); se /= rs[i].n1 * rs[i].n2; se = sqrt (se); double ci = 1 - roc->ci / 100.0; double yy = gsl_cdf_gaussian_Qinv (ci, se); double sd_0_5 = sqrt ((rs[i].n1 + rs[i].n2 + 1) / (12 * rs[i].n1 * rs[i].n2)); double sig = 2.0 * gsl_cdf_ugaussian_Q (fabs ((rs[i].auc - 0.5) / sd_0_5)); double entries[] = { se, sig, rs[i].auc - yy, rs[i].auc + yy }; for (size_t i = 0; i < sizeof entries / sizeof *entries; i++) pivot_table_put2 (table, i + 1, var_idx, pivot_value_new_number (entries[i])); } } pivot_table_submit (table); } static void show_summary (const struct cmd_roc *roc) { struct pivot_table *table = pivot_table_create (N_("Case Summary")); struct pivot_dimension *statistics = pivot_dimension_create ( table, PIVOT_AXIS_COLUMN, N_("Valid N (listwise)"), N_("Unweighted"), PIVOT_RC_INTEGER, N_("Weighted"), PIVOT_RC_OTHER); statistics->root->show_label = true; struct pivot_dimension *cases = pivot_dimension_create__ ( table, PIVOT_AXIS_ROW, pivot_value_new_variable (roc->state_var)); cases->root->show_label = true; pivot_category_create_leaves (cases->root, N_("Positive"), N_("Negative")); struct entry { int stat_idx; int case_idx; double x; } entries[] = { { 0, 0, roc->pos }, { 0, 1, roc->neg }, { 1, 0, roc->pos_weighted }, { 1, 1, roc->neg_weighted }, }; for (size_t i = 0; i < sizeof entries / sizeof *entries; i++) { const struct entry *e = &entries[i]; pivot_table_put2 (table, e->stat_idx, e->case_idx, pivot_value_new_number (e->x)); } pivot_table_submit (table); } static void show_coords (struct roc_state *rs, const struct cmd_roc *roc) { struct pivot_table *table = pivot_table_create ( N_("Coordinates of the Curve")); table->omit_empty = true; pivot_dimension_create (table, PIVOT_AXIS_COLUMN, N_("Statistics"), N_("Positive if greater than or equal to"), N_("Sensitivity"), N_("1 - Specificity")); struct pivot_dimension *coordinates = pivot_dimension_create ( table, PIVOT_AXIS_ROW, N_("Coordinates")); coordinates->hide_all_labels = true; struct pivot_dimension *variables = pivot_dimension_create ( table, PIVOT_AXIS_ROW, N_("Test variable")); variables->root->show_label = true; int n_coords = 0; for (size_t i = 0; i < roc->n_vars; ++i) { struct casereader *r = casereader_clone (rs[i].cutpoint_rdr); int var_idx = pivot_category_create_leaf ( variables->root, pivot_value_new_variable (roc->vars[i])); struct ccase *cc; int coord_idx = 0; for (; (cc = casereader_read (r)) != NULL; case_unref (cc)) { const double se = case_data_idx (cc, ROC_TP)->f / (case_data_idx (cc, ROC_TP)->f + case_data_idx (cc, ROC_FN)->f); const double sp = case_data_idx (cc, ROC_TN)->f / (case_data_idx (cc, ROC_TN)->f + case_data_idx (cc, ROC_FP)->f); pivot_table_put3 ( table, 0, coord_idx, var_idx, pivot_value_new_var_value (roc->vars[i], case_data_idx (cc, ROC_CUTPOINT))); pivot_table_put3 (table, 1, coord_idx, var_idx, pivot_value_new_number (se)); pivot_table_put3 (table, 2, coord_idx, var_idx, pivot_value_new_number (1 - sp)); coord_idx++; } if (coord_idx > n_coords) n_coords = coord_idx; casereader_destroy (r); } for (size_t i = 0; i < n_coords; i++) pivot_category_create_leaf (coordinates->root, pivot_value_new_integer (i + 1)); pivot_table_submit (table); } static void output_roc (struct roc_state *rs, const struct cmd_roc *roc) { show_summary (roc); if (roc->curve) { struct roc_chart *rc; size_t i; rc = roc_chart_create (roc->reference); for (i = 0; i < roc->n_vars; i++) roc_chart_add_var (rc, var_get_name (roc->vars[i]), rs[i].cutpoint_rdr); roc_chart_submit (rc); } show_auc (rs, roc); if (roc->print_coords) show_coords (rs, roc); } pspp-1.4.1/src/language/command.h0000644000175000017500000000464713320146056016267 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 1997-9, 2000, 2006, 2010, 2013 Free Software Foundation, Inc. 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 3 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, see . */ #ifndef COMMAND_H #define COMMAND_H 1 #include /* Command return values. */ enum cmd_result { /* Successful return values. */ CMD_SUCCESS = 1, /* Successfully parsed and executed. */ CMD_EOF = 2, /* End of input. */ CMD_FINISH = 3, /* FINISH was executed. */ /* Successful return values returned by specific commands to let INPUT PROGRAM function properly. */ CMD_DATA_LIST, CMD_END_CASE, CMD_END_FILE, /* Various kinds of failures. */ CMD_FAILURE = -1, /* Not executed at all. */ CMD_NOT_IMPLEMENTED = -2, /* Command not implemented. */ CMD_CASCADING_FAILURE = -3 /* Serious error: don't continue. */ }; bool cmd_result_is_success (enum cmd_result); bool cmd_result_is_failure (enum cmd_result); /* Command processing state. */ enum cmd_state { CMD_STATE_INITIAL, /* No active dataset yet defined. */ CMD_STATE_DATA, /* Active dataset has been defined. */ CMD_STATE_INPUT_PROGRAM, /* Inside INPUT PROGRAM. */ CMD_STATE_FILE_TYPE /* Inside FILE TYPE. */ }; struct dataset; struct lexer; enum cmd_result cmd_parse_in_state (struct lexer *lexer, struct dataset *ds, enum cmd_state); enum cmd_result cmd_parse (struct lexer *lexer, struct dataset *ds); struct command; const char *cmd_complete (const char *, const struct command **); struct dataset; /* Prototype all the command functions. */ #define DEF_CMD(STATES, FLAGS, NAME, FUNCTION) int FUNCTION (struct lexer *, struct dataset *); #define UNIMPL_CMD(NAME, DESCRIPTION) #include "command.def" #undef DEF_CMD #undef UNIMPL_CMD #endif /* command.h */ pspp-1.4.1/src/language/expressions/0000755000175000017500000000000013725012647017056 5ustar00blpblp00000000000000pspp-1.4.1/src/language/expressions/public.h0000644000175000017500000000371013320146056020477 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 1997-9, 2000 Free Software Foundation, Inc. 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 3 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, see . */ #if !expr_h #define expr_h 1 #include /* Expression parsing flags. */ enum expr_type { EXPR_NUMBER = 0xf000, /* Number. */ EXPR_STRING, /* String. */ EXPR_BOOLEAN, /* Boolean (number limited to 0, 1, SYSMIS). */ }; struct dictionary; struct expression; struct ccase; struct pool; union value; struct dataset ; struct lexer ; struct expression *expr_parse (struct lexer *lexer, struct dataset *, enum expr_type); struct expression *expr_parse_pool (struct lexer *, struct pool *, struct dataset *, enum expr_type); void expr_free (struct expression *); struct dataset; double expr_evaluate_num (struct expression *, const struct ccase *, int case_idx); void expr_evaluate_str (struct expression *, const struct ccase *, int case_idx, char *dst, size_t dst_size); const struct operation *expr_get_function (size_t idx); size_t expr_get_function_cnt (void); const char *expr_operation_get_name (const struct operation *); const char *expr_operation_get_prototype (const struct operation *); int expr_operation_get_arg_cnt (const struct operation *); #endif /* expr.h */ pspp-1.4.1/src/language/expressions/automake.mk0000644000175000017500000000347113571051220021207 0ustar00blpblp00000000000000# PSPP - a program for statistical analysis. # Copyright (C) 2017 Free Software Foundation, Inc. # # 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 3 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, see . # ## Process this file with automake to produce Makefile.in -*- makefile -*- language_expressions_sources = \ src/language/expressions/evaluate.c \ src/language/expressions/helpers.c \ src/language/expressions/helpers.h \ src/language/expressions/optimize.c \ src/language/expressions/parse.c \ src/language/expressions/private.h \ src/language/expressions/public.h expressions_built_sources = \ src/language/expressions/evaluate.h \ src/language/expressions/evaluate.inc \ src/language/expressions/operations.h \ src/language/expressions/optimize.inc \ src/language/expressions/parse.inc BUILT_SOURCES += $(expressions_built_sources) CLEANFILES += $(expressions_built_sources) helpers = src/language/expressions/generate.pl \ src/language/expressions/operations.def EXTRA_DIST += $(helpers) $(expressions_built_sources): $(helpers) $(AV_V_GEN)$(MKDIR_P) `dirname $@` && \ $(PERL) $< -o $@ -i $(top_srcdir)/src/language/expressions/operations.def AM_CPPFLAGS += -I$(top_builddir)/src/language/expressions \ -I$(top_srcdir)/src/language/expressions EXTRA_DIST += src/language/expressions/TODO pspp-1.4.1/src/language/expressions/helpers.c0000644000175000017500000004466713320146056020676 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2008, 2010, 2011, 2015, 2016 Free Software Foundation, Inc. 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 3 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, see . */ #include #include "language/expressions/helpers.h" #include #include #include "language/expressions/private.h" #include "libpspp/assertion.h" #include "libpspp/pool.h" #include "gl/minmax.h" const struct substring empty_string = {NULL, 0}; double expr_ymd_to_ofs (double year, double month, double day) { int y = year; int m = month; int d = day; char *error; double ofs; if (y != year || m != month || d != day) { msg (SE, _("One of the arguments to a DATE function is not an integer. " "The result will be system-missing.")); return SYSMIS; } ofs = calendar_gregorian_to_offset (y, m, d, &error); if (error != NULL) { msg (SE, "%s", error); free (error); } return ofs; } double expr_ymd_to_date (double year, double month, double day) { double ofs = expr_ymd_to_ofs (year, month, day); return ofs != SYSMIS ? ofs * DAY_S : SYSMIS; } double expr_wkyr_to_date (double week, double year) { int w = week; if (w != week) { msg (SE, _("The week argument to DATE.WKYR is not an integer. " "The result will be system-missing.")); return SYSMIS; } else if (w < 1 || w > 53) { msg (SE, _("The week argument to DATE.WKYR is outside the acceptable " "range of 1 to 53. " "The result will be system-missing.")); return SYSMIS; } else { double yr_1_1 = expr_ymd_to_ofs (year, 1, 1); if (yr_1_1 != SYSMIS) return DAY_S * (yr_1_1 + WEEK_DAY * (w - 1)); else return SYSMIS; } } double expr_yrday_to_date (double year, double yday) { int yd = yday; if (yd != yday) { msg (SE, _("The day argument to DATE.YRDAY is not an integer. " "The result will be system-missing.")); return SYSMIS; } else if (yd < 1 || yd > 366) { msg (SE, _("The day argument to DATE.YRDAY is outside the acceptable " "range of 1 to 366. " "The result will be system-missing.")); return SYSMIS; } else { double yr_1_1 = expr_ymd_to_ofs (year, 1, 1); if (yr_1_1 != SYSMIS) return DAY_S * (yr_1_1 + yd - 1.); else return SYSMIS; } } double expr_yrmoda (double year, double month, double day) { if (year >= 0 && year <= 99) year += 1900; else if (year != (int) year && year > 47516) { msg (SE, _("The year argument to YRMODA is greater than 47516. " "The result will be system-missing.")); return SYSMIS; } return expr_ymd_to_ofs (year, month, day); } /* A date unit. */ enum date_unit { DATE_YEARS, DATE_QUARTERS, DATE_MONTHS, DATE_WEEKS, DATE_DAYS, DATE_HOURS, DATE_MINUTES, DATE_SECONDS }; /* Stores in *UNIT the unit whose name is NAME. Return success. */ static enum date_unit recognize_unit (struct substring name, enum date_unit *unit) { struct unit_name { enum date_unit unit; const struct substring name; }; static const struct unit_name unit_names[] = { { DATE_YEARS, SS_LITERAL_INITIALIZER ("years") }, { DATE_QUARTERS, SS_LITERAL_INITIALIZER ("quarters") }, { DATE_MONTHS, SS_LITERAL_INITIALIZER ("months") }, { DATE_WEEKS, SS_LITERAL_INITIALIZER ("weeks") }, { DATE_DAYS, SS_LITERAL_INITIALIZER ("days") }, { DATE_HOURS, SS_LITERAL_INITIALIZER ("hours") }, { DATE_MINUTES, SS_LITERAL_INITIALIZER ("minutes") }, { DATE_SECONDS, SS_LITERAL_INITIALIZER ("seconds") }, }; const int unit_name_cnt = sizeof unit_names / sizeof *unit_names; const struct unit_name *un; for (un = unit_names; un < &unit_names[unit_name_cnt]; un++) if (ss_equals_case (un->name, name)) { *unit = un->unit; return true; } msg (SE, _("Unrecognized date unit `%.*s'. " "Valid date units are `%s', `%s', `%s', " "`%s', `%s', `%s', `%s', and `%s'."), (int) ss_length (name), ss_data (name), "years", "quarters", "months", "weeks", "days", "hours", "minutes", "seconds"); return false; } /* Returns the number of whole years from DATE1 to DATE2, where a year is defined as the same or later month, day, and time of day. */ static int year_diff (double date1, double date2) { int y1, m1, d1, yd1; int y2, m2, d2, yd2; int diff; assert (date2 >= date1); calendar_offset_to_gregorian (date1 / DAY_S, &y1, &m1, &d1, &yd1); calendar_offset_to_gregorian (date2 / DAY_S, &y2, &m2, &d2, &yd2); diff = y2 - y1; if (diff > 0) { int yd1 = 32 * m1 + d1; int yd2 = 32 * m2 + d2; if (yd2 < yd1 || (yd2 == yd1 && fmod (date2, DAY_S) < fmod (date1, DAY_S))) diff--; } return diff; } /* Returns the number of whole months from DATE1 to DATE2, where a month is defined as the same or later day and time of day. */ static int month_diff (double date1, double date2) { int y1, m1, d1, yd1; int y2, m2, d2, yd2; int diff; assert (date2 >= date1); calendar_offset_to_gregorian (date1 / DAY_S, &y1, &m1, &d1, &yd1); calendar_offset_to_gregorian (date2 / DAY_S, &y2, &m2, &d2, &yd2); diff = ((y2 * 12) + m2) - ((y1 * 12) + m1); if (diff > 0 && (d2 < d1 || (d2 == d1 && fmod (date2, DAY_S) < fmod (date1, DAY_S)))) diff--; return diff; } /* Returns the number of whole quarter from DATE1 to DATE2, where a quarter is defined as three months. */ static int quarter_diff (double date1, double date2) { return month_diff (date1, date2) / 3; } /* Returns the number of seconds in the given UNIT. */ static int date_unit_duration (enum date_unit unit) { switch (unit) { case DATE_WEEKS: return WEEK_S; case DATE_DAYS: return DAY_S; case DATE_HOURS: return H_S; case DATE_MINUTES: return MIN_S; case DATE_SECONDS: return 1; default: NOT_REACHED (); } } /* Returns the span from DATE1 to DATE2 in terms of UNIT_NAME. */ double expr_date_difference (double date1, double date2, struct substring unit_name) { enum date_unit unit; if (!recognize_unit (unit_name, &unit)) return SYSMIS; switch (unit) { case DATE_YEARS: return (date2 >= date1 ? year_diff (date1, date2) : -year_diff (date2, date1)); case DATE_QUARTERS: return (date2 >= date1 ? quarter_diff (date1, date2) : -quarter_diff (date2, date1)); case DATE_MONTHS: return (date2 >= date1 ? month_diff (date1, date2) : -month_diff (date2, date1)); case DATE_WEEKS: case DATE_DAYS: case DATE_HOURS: case DATE_MINUTES: case DATE_SECONDS: return trunc ((date2 - date1) / date_unit_duration (unit)); } NOT_REACHED (); } /* How to deal with days out of range for a given month. */ enum date_sum_method { SUM_ROLLOVER, /* Roll them over to the next month. */ SUM_CLOSEST /* Use the last day of the month. */ }; /* Stores in *METHOD the method whose name is NAME. Return success. */ static bool recognize_method (struct substring method_name, enum date_sum_method *method) { if (ss_equals_case (method_name, ss_cstr ("closest"))) { *method = SUM_CLOSEST; return true; } else if (ss_equals_case (method_name, ss_cstr ("rollover"))) { *method = SUM_ROLLOVER; return true; } else { msg (SE, _("Invalid DATESUM method. " "Valid choices are `%s' and `%s'."), "closest", "rollover"); return false; } } /* Returns DATE advanced by the given number of MONTHS, with day-of-month overflow resolved using METHOD. */ static double add_months (double date, int months, enum date_sum_method method) { int y, m, d, yd; double output; char *error; calendar_offset_to_gregorian (date / DAY_S, &y, &m, &d, &yd); y += months / 12; m += months % 12; if (m < 1) { m += 12; y--; } else if (m > 12) { m -= 12; y++; } assert (m >= 1 && m <= 12); if (method == SUM_CLOSEST && d > calendar_days_in_month (y, m)) d = calendar_days_in_month (y, m); output = calendar_gregorian_to_offset (y, m, d, &error); if (output != SYSMIS) output = (output * DAY_S) + fmod (date, DAY_S); else { msg (SE, "%s", error); free (error); } return output; } /* Returns DATE advanced by the given QUANTITY of units given in UNIT_NAME, with day-of-month overflow resolved using METHOD_NAME. */ double expr_date_sum (double date, double quantity, struct substring unit_name, struct substring method_name) { enum date_unit unit; enum date_sum_method method; if (!recognize_unit (unit_name, &unit) || !recognize_method (method_name, &method)) return SYSMIS; switch (unit) { case DATE_YEARS: return add_months (date, trunc (quantity) * 12, method); case DATE_QUARTERS: return add_months (date, trunc (quantity) * 3, method); case DATE_MONTHS: return add_months (date, trunc (quantity), method); case DATE_WEEKS: case DATE_DAYS: case DATE_HOURS: case DATE_MINUTES: case DATE_SECONDS: return date + quantity * date_unit_duration (unit); } NOT_REACHED (); } int compare_string_3way (const struct substring *a, const struct substring *b) { size_t i; for (i = 0; i < a->length && i < b->length; i++) if (a->string[i] != b->string[i]) return a->string[i] < b->string[i] ? -1 : 1; for (; i < a->length; i++) if (a->string[i] != ' ') return 1; for (; i < b->length; i++) if (b->string[i] != ' ') return -1; return 0; } size_t count_valid (double *d, size_t d_cnt) { size_t valid_cnt; size_t i; valid_cnt = 0; for (i = 0; i < d_cnt; i++) valid_cnt += is_valid (d[i]); return valid_cnt; } struct substring alloc_string (struct expression *e, size_t length) { struct substring s; s.length = length; s.string = pool_alloc (e->eval_pool, length); return s; } struct substring copy_string (struct expression *e, const char *old, size_t length) { struct substring s = alloc_string (e, length); memcpy (s.string, old, length); return s; } /* Returns the noncentral beta cumulative distribution function value for the given arguments. FIXME: The accuracy of this function is not entirely satisfactory. We only match the example values given in AS 310 to the first 5 significant digits. */ double ncdf_beta (double x, double a, double b, double lambda) { double c; if (x <= 0. || x >= 1. || a <= 0. || b <= 0. || lambda <= 0.) return SYSMIS; c = lambda / 2.; if (lambda < 54.) { /* Algorithm AS 226. */ double x0, a0, beta, temp, gx, q, ax, sumq, sum; double err_max = 2 * DBL_EPSILON; double err_bound; int iter_max = 100; int iter; x0 = floor (c - 5.0 * sqrt (c)); if (x0 < 0.) x0 = 0.; a0 = a + x0; beta = (gsl_sf_lngamma (a0) + gsl_sf_lngamma (b) - gsl_sf_lngamma (a0 + b)); temp = gsl_sf_beta_inc (a0, b, x); gx = exp (a0 * log (x) + b * log (1. - x) - beta - log (a0)); if (a0 >= a) q = exp (-c + x0 * log (c)) - gsl_sf_lngamma (x0 + 1.); else q = exp (-c); ax = q * temp; sumq = 1. - q; sum = ax; iter = 0; do { iter++; temp -= gx; gx = x * (a + b + iter - 1.) * gx / (a + iter); q *= c / iter; sumq -= q; ax = temp * q; sum += ax; err_bound = (temp - gx) * sumq; } while (iter < iter_max && err_bound > err_max); return sum; } else { /* Algorithm AS 310. */ double m, m_sqrt; int iter, iter_lower, iter_upper, iter1, iter2, j; double t, q, r, psum, beta, s1, gx, fx, temp, ftemp, t0, s0, sum, s; double err_bound; double err_max = 2 * DBL_EPSILON; iter = 0; m = floor (c + .5); m_sqrt = sqrt (m); iter_lower = m - 5. * m_sqrt; iter_upper = m + 5. * m_sqrt; t = -c + m * log (c) - gsl_sf_lngamma (m + 1.); q = exp (t); r = q; psum = q; beta = (gsl_sf_lngamma (a + m) + gsl_sf_lngamma (b) - gsl_sf_lngamma (a + m + b)); s1 = (a + m) * log (x) + b * log (1. - x) - log (a + m) - beta; fx = gx = exp (s1); ftemp = temp = gsl_sf_beta_inc (a + m, b, x); iter++; sum = q * temp; iter1 = m; while (iter1 >= iter_lower && q >= err_max) { q = q * iter1 / c; iter++; gx = (a + iter1) / (x * (a + b + iter1 - 1.)) * gx; iter1--; temp += gx; psum += q; sum += q * temp; } t0 = (gsl_sf_lngamma (a + b) - gsl_sf_lngamma (a + 1.) - gsl_sf_lngamma (b)); s0 = a * log (x) + b * log (1. - x); s = 0.; for (j = 0; j < iter1; j++) { double t1; s += exp (t0 + s0 + j * log (x)); t1 = log (a + b + j) - log (a + 1. + j) + t0; t0 = t1; } err_bound = (1. - gsl_sf_gamma_inc_P (iter1, c)) * (temp + s); q = r; temp = ftemp; gx = fx; iter2 = m; for (;;) { double ebd = err_bound + (1. - psum) * temp; if (ebd < err_max || iter >= iter_upper) break; iter2++; iter++; q = q * c / iter2; psum += q; temp -= gx; gx = x * (a + b + iter2 - 1.) / (a + iter2) * gx; sum += q * temp; } return sum; } } double cdf_bvnor (double x0, double x1, double r) { double z = pow2 (x0) - 2. * r * x0 * x1 + pow2 (x1); return exp (-z / (2. * (1 - r * r))) * (2. * M_PI * sqrt (1 - r * r)); } double idf_fdist (double P, double df1, double df2) { double temp = gsl_cdf_beta_Pinv (P, df1 / 2, df2 / 2); return temp * df2 / ((1. - temp) * df1); } /* * Mathlib : A C Library of Special Functions * Copyright (C) 1998 Ross Ihaka * Copyright (C) 2000 The R Development Core Team * * 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., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA. */ /* Returns the density of the noncentral beta distribution with noncentrality parameter LAMBDA. */ double npdf_beta (double x, double a, double b, double lambda) { if (lambda < 0. || a <= 0. || b <= 0.) return SYSMIS; else if (lambda == 0.) return gsl_ran_beta_pdf (x, a, b); else { double max_error = 2 * DBL_EPSILON; int max_iter = 200; double term = gsl_ran_beta_pdf (x, a, b); double lambda2 = 0.5 * lambda; double weight = exp (-lambda2); double sum = weight * term; double psum = weight; int k; for (k = 1; k <= max_iter && 1 - psum < max_error; k++) { weight *= lambda2 / k; term *= x * (a + b) / a; sum += weight * term; psum += weight; a += 1; } return sum; } } static double round__ (double x, double mult, double fuzzbits, double adjustment) { if (fuzzbits <= 0) fuzzbits = settings_get_fuzzbits (); adjustment += exp2 (fuzzbits - DBL_MANT_DIG); x /= mult; x = x >= 0. ? floor (x + adjustment) : -floor (-x + adjustment); return x * mult; } double round_nearest (double x, double mult, double fuzzbits) { return round__ (x, mult, fuzzbits, .5); } double round_zero (double x, double mult, double fuzzbits) { return round__ (x, mult, fuzzbits, 0); } struct substring replace_string (struct expression *e, struct substring haystack, struct substring needle, struct substring replacement, double n) { if (!needle.length || haystack.length < needle.length || n <= 0 || n == SYSMIS) return haystack; struct substring result = alloc_string (e, MAX_STRING); result.length = 0; size_t i = 0; while (i <= haystack.length - needle.length) if (!memcmp (&haystack.string[i], needle.string, needle.length)) { size_t copy_len = MIN (replacement.length, MAX_STRING - result.length); memcpy (&result.string[result.length], replacement.string, copy_len); result.length += copy_len; i += needle.length; if (--n < 1) break; } else { if (result.length < MAX_STRING) result.string[result.length++] = haystack.string[i]; i++; } while (i < haystack.length && result.length < MAX_STRING) result.string[result.length++] = haystack.string[i++]; return result; } static int compare_doubles (const void *a_, const void *b_) { const double *ap = a_; const double *bp = b_; double a = *ap; double b = *bp; /* Sort SYSMIS to the end. */ return (a == b ? 0 : a == SYSMIS ? 1 : b == SYSMIS ? -1 : a > b ? 1 : -1); } double median (double *a, size_t n) { /* Sort the array in-place, sorting SYSMIS to the end. */ qsort (a, n, sizeof *a, compare_doubles); /* Drop SYSMIS. */ n = count_valid (a, n); return (!n ? SYSMIS : n % 2 ? a[n / 2] : (a[n / 2 - 1] + a[n / 2]) / 2.0); } pspp-1.4.1/src/language/expressions/evaluate.c0000644000175000017500000001671413670210420021025 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 1997-9, 2000, 2006, 2007, 2009, 2010, 2011, 2012 Free Software Foundation, Inc. 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 3 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, see . */ #include #include "evaluate.h" #include #include "libpspp/assertion.h" #include "libpspp/message.h" #include "language/expressions/helpers.h" #include "language/expressions/private.h" #include "language/lexer/value-parser.h" #include "libpspp/pool.h" #include "xalloc.h" static void expr_evaluate (struct expression *e, const struct ccase *c, int case_idx, void *result) { struct dataset *ds = e->ds; union operation_data *op = e->ops; double *ns = e->number_stack; struct substring *ss = e->string_stack; /* Without a dictionary/dataset, the expression can't refer to variables, and you don't need to specify a case when you evaluate the expression. With a dictionary/dataset, the expression can refer to variables, so you must specify a case when you evaluate the expression. */ assert ((c != NULL) == (e->ds != NULL)); pool_clear (e->eval_pool); for (;;) { assert (op < e->ops + e->op_cnt); switch (op++->operation) { case OP_number: case OP_boolean: *ns++ = op++->number; break; case OP_string: { const struct substring *s = &op++->string; *ss++ = copy_string (e, s->string, s->length); } break; case OP_return_number: *(double *) result = isfinite (ns[-1]) ? ns[-1] : SYSMIS; return; case OP_return_string: *(struct substring *) result = ss[-1]; return; #include "evaluate.inc" default: NOT_REACHED (); } } } double expr_evaluate_num (struct expression *e, const struct ccase *c, int case_idx) { double d; assert (e->type == OP_number || e->type == OP_boolean); expr_evaluate (e, c, case_idx, &d); return d; } void expr_evaluate_str (struct expression *e, const struct ccase *c, int case_idx, char *dst, size_t dst_size) { struct substring s; assert (e->type == OP_string); assert ((dst == NULL) == (dst_size == 0)); expr_evaluate (e, c, case_idx, &s); buf_copy_rpad (dst, dst_size, s.string, s.length, ' '); } #include "language/lexer/lexer.h" #include "language/command.h" int cmd_debug_evaluate (struct lexer *lexer, struct dataset *dsother UNUSED) { bool optimize = true; int retval = CMD_FAILURE; bool dump_postfix = false; struct ccase *c = NULL; struct dataset *ds = NULL; char *name = NULL; struct expression *expr; for (;;) { struct dictionary *d = NULL; if (lex_match_id (lexer, "NOOPTIMIZE")) optimize = 0; else if (lex_match_id (lexer, "POSTFIX")) dump_postfix = 1; else if (lex_match (lexer, T_LPAREN)) { struct variable *v; int width; if (!lex_force_id (lexer)) goto done; name = xstrdup (lex_tokcstr (lexer)); lex_get (lexer); if (!lex_force_match (lexer, T_EQUALS)) goto done; if (lex_is_number (lexer)) width = 0; else if (lex_is_string (lexer)) width = ss_length (lex_tokss (lexer)); else { lex_error (lexer, _("expecting number or string")); goto done; } if (ds == NULL) { ds = dataset_create (NULL, ""); d = dataset_dict (ds); } v = dict_create_var (d, name, width); if (v == NULL) { msg (SE, _("Duplicate variable name %s."), name); goto done; } free (name); name = NULL; if (c == NULL) c = case_create (dict_get_proto (d)); else c = case_unshare_and_resize (c, dict_get_proto (d)); if (!parse_value (lexer, case_data_rw (c, v), v)) NOT_REACHED (); if (!lex_force_match (lexer, T_RPAREN)) goto done; } else break; } if (!lex_force_match (lexer, T_SLASH)) goto done; expr = expr_parse_any (lexer, ds, optimize); if (!expr || lex_end_of_command (lexer) != CMD_SUCCESS) { if (expr != NULL) expr_free (expr); printf ("error\n"); goto done; } if (dump_postfix) expr_debug_print_postfix (expr); else switch (expr->type) { case OP_number: { double d = expr_evaluate_num (expr, c, 0); if (d == SYSMIS) printf ("sysmis\n"); else printf ("%.2f\n", d); } break; case OP_boolean: { double b = expr_evaluate_num (expr, c, 0); printf ("%s\n", b == SYSMIS ? "sysmis" : b == 0.0 ? "false" : "true"); } break; case OP_string: { struct substring s; expr_evaluate (expr, c, 0, &s); putchar ('"'); fwrite (s.string, s.length, 1, stdout); puts ("\""); break; } default: NOT_REACHED (); } expr_free (expr); retval = CMD_SUCCESS; done: dataset_destroy (ds); case_unref (c); free (name); return retval; } void expr_debug_print_postfix (const struct expression *e) { size_t i; for (i = 0; i < e->op_cnt; i++) { union operation_data *op = &e->ops[i]; if (i > 0) putc (' ', stderr); switch (e->op_types[i]) { case OP_operation: if (op->operation == OP_return_number) printf ("return_number"); else if (op->operation == OP_return_string) printf ("return_string"); else if (is_function (op->operation)) printf ("%s", operations[op->operation].prototype); else if (is_composite (op->operation)) printf ("%s", operations[op->operation].name); else printf ("%s:", operations[op->operation].name); break; case OP_number: if (op->number != SYSMIS) printf ("n<%g>", op->number); else printf ("n"); break; case OP_string: printf ("s<%.*s>", (int) op->string.length, op->string.string != NULL ? op->string.string : ""); break; case OP_format: { char str[FMT_STRING_LEN_MAX + 1]; fmt_to_string (op->format, str); printf ("f<%s>", str); } break; case OP_variable: printf ("v<%s>", var_get_name (op->variable)); break; case OP_vector: printf ("vec<%s>", vector_get_name (op->vector)); break; case OP_integer: printf ("i<%d>", op->integer); break; default: NOT_REACHED (); } } printf ("\n"); } pspp-1.4.1/src/language/expressions/TODO0000644000175000017500000000071513320146056017542 0ustar00blpblp00000000000000Needed: - Warnings on domain errors (see "Domain Errors" in SPSS manual) and documentation of such. - Finish polishing code. Many functions need comments. - Test the remaining statistical distributions. - Implement unimplemented functions. - Check treatment of 0 bytes in expressions is correct. Extension ideas: - Short-circuit evaluation of logical ops - Conditional operator with ? : - User-defined functions. pspp-1.4.1/src/language/expressions/operations.def0000644000175000017500000007776313723216277021750 0ustar00blpblp00000000000000// -*- c -*- // // PSPP - a program for statistical analysis. // Copyright (C) 2005, 2006, 2009, 2010, 2011, 2012, 2015, 2016 Free Software Foundation, Inc. // // 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 3 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, see . operator NEG (x) = -x; operator ADD (a, b) = a + b; operator SUB (a, b) = a - b; absorb_miss operator MUL (a, b) = (a == 0. || b == 0. ? 0. : a == SYSMIS || b == SYSMIS ? SYSMIS : a * b); absorb_miss operator DIV (a, b) = (a == 0. ? 0. : a == SYSMIS || b == SYSMIS ? SYSMIS : a / b); absorb_miss operator POW (a, b) = (a == SYSMIS ? (b == 0. ? 1. : a) : b == SYSMIS ? (a == 0. ? 0. : SYSMIS) : a == 0. && b <= 0. ? SYSMIS : pow (a, b)); absorb_miss boolean operator AND (boolean a, boolean b) = (a == 0. ? 0. : b == 0. ? 0. : b == SYSMIS ? SYSMIS : a); absorb_miss boolean operator OR (boolean a, boolean b) = (a == 1. ? 1. : b == 1. ? 1. : b == SYSMIS ? SYSMIS : a); boolean operator NOT (boolean a) = (a == 0. ? 1. : a == 1. ? 0. : SYSMIS); // Numeric relational operators. boolean operator EQ (a, b) = a == b; boolean operator GE (a, b) = a >= b; boolean operator GT (a, b) = a > b; boolean operator LE (a, b) = a <= b; boolean operator LT (a, b) = a < b; boolean operator NE (a, b) = a != b; // String relational operators. boolean operator EQ_STRING (string a, string b) = compare_string_3way (&a, &b) == 0; boolean operator GE_STRING (string a, string b) = compare_string_3way (&a, &b) >= 0; boolean operator GT_STRING (string a, string b) = compare_string_3way (&a, &b) > 0; boolean operator LE_STRING (string a, string b) = compare_string_3way (&a, &b) <= 0; boolean operator LT_STRING (string a, string b) = compare_string_3way (&a, &b) < 0; boolean operator NE_STRING (string a, string b) = compare_string_3way (&a, &b) != 0; // Unary functions. function ABS (x) = fabs (x); extension function ACOS (x >= -1 && x <= 1) = acos (x); function ASIN (x >= -1 && x <= 1) = asin (x); function ATAN (x) = atan (x); extension function ARCOS (x >= -1 && x <= 1) = acos (x); function ARSIN (x >= -1 && x <= 1) = asin (x); function ARTAN (x) = atan (x); function COS (x) = cos (x); function EXP (x) = check_errno (exp (x)); function LG10(x) = check_errno (log10 (x)); function LN (x) = check_errno (log (x)); function LNGAMMA (x >= 0) = gsl_sf_lngamma (x); function MOD10 (x) = fmod (x, 10); function RND (x) = round_nearest (x, 1, 0); function RND (x, mult != 0) = round_nearest (x, mult, 0); function RND (x, mult != 0, fuzzbits >= 0) = round_nearest (x, mult, fuzzbits); function SIN (x) = sin (x); function SQRT (x >= 0) = sqrt (x); function TAN (x) = check_errno (tan (x)); function TRUNC (x) = round_zero (x, 1, 0); function TRUNC (x, mult != 0) = round_zero (x, mult, 0); function TRUNC (x, mult != 0, fuzzbits >= 0) = round_zero (x, mult, fuzzbits); absorb_miss function MOD (n, d) { if (d != SYSMIS) return n != SYSMIS ? fmod (n, d) : SYSMIS; else return n != 0. ? SYSMIS : 0.; } // N-ary numeric functions. absorb_miss boolean function ANY (x != SYSMIS, a[n]) { int sysmis = 0; size_t i; for (i = 0; i < n; i++) if (a[i] == x) return 1.; else if (a[i] == SYSMIS) sysmis = 1; return sysmis ? SYSMIS : 0.; } boolean function ANY (string x, string a[n]) { size_t i; for (i = 0; i < n; i++) if (!compare_string_3way (&x, &a[i])) return 1.; return 0.; } function CFVAR.2 (a[n]) { double mean, variance; moments_of_doubles (a, n, NULL, &mean, &variance, NULL, NULL); if (mean == SYSMIS || mean == 0 || variance == SYSMIS) return SYSMIS; else return sqrt (variance) / mean; } function MAX.1 (a[n]) { double max; size_t i; max = -DBL_MAX; for (i = 0; i < n; i++) if (a[i] != SYSMIS && a[i] > max) max = a[i]; return max; } string function MAX (string a[n]) { struct substring *max; size_t i; max = &a[0]; for (i = 1; i < n; i++) if (compare_string_3way (&a[i], max) > 0) max = &a[i]; return *max; } function MEAN.1 (a[n]) { double mean; moments_of_doubles (a, n, NULL, &mean, NULL, NULL, NULL); return mean; } function MEDIAN.1 (a[n]) { return median (a, n); } function MIN.1 (a[n]) { double min; size_t i; min = DBL_MAX; for (i = 0; i < n; i++) if (a[i] != SYSMIS && a[i] < min) min = a[i]; return min; } string function MIN (string a[n]) { struct substring *min; size_t i; min = &a[0]; for (i = 1; i < n; i++) if (compare_string_3way (&a[i], min) < 0) min = &a[i]; return *min; } absorb_miss function NMISS (a[n]) { size_t i; size_t missing_cnt = 0; for (i = 0; i < n; i++) missing_cnt += a[i] == SYSMIS; return missing_cnt; } absorb_miss function NVALID (a[n]) { size_t i; size_t valid_cnt = 0; for (i = 0; i < n; i++) valid_cnt += a[i] != SYSMIS; return valid_cnt; } absorb_miss boolean function RANGE (x != SYSMIS, a[n*2]) { size_t i; int sysmis = 0; for (i = 0; i < n; i++) { double w = a[2 * i]; double y = a[2 * i + 1]; if (w != SYSMIS && y != SYSMIS) { if (w <= x && x <= y) return 1.0; } else sysmis = 1; } return sysmis ? SYSMIS : 0.; } boolean function RANGE (string x, string a[n*2]) { int i; for (i = 0; i < n; i++) { struct substring *w = &a[2 * i]; struct substring *y = &a[2 * i + 1]; if (compare_string_3way (w, &x) <= 0 && compare_string_3way (&x, y) <= 0) return 1.; } return 0.; } function SD.2 (a[n]) { double variance; moments_of_doubles (a, n, NULL, NULL, &variance, NULL, NULL); return sqrt (variance); } function SUM.1 (a[n]) { double sum; size_t i; sum = 0.; for (i = 0; i < n; i++) if (a[i] != SYSMIS) sum += a[i]; return sum; } function VARIANCE.2 (a[n]) { double variance; moments_of_doubles (a, n, NULL, NULL, &variance, NULL, NULL); return variance; } // Time construction & extraction functions. function TIME.HMS (h, m, s) { if ((h > 0. || m > 0. || s > 0.) && (h < 0. || m < 0. || s < 0.)) { msg (SW, _("TIME.HMS cannot mix positive and negative arguments.")); return SYSMIS; } else return H_S * h + MIN_S * m + s; } function TIME.DAYS (days) = days * DAY_S; function CTIME.DAYS (time) = time / DAY_S; function CTIME.HOURS (time) = time / H_S; function CTIME.MINUTES (time) = time / MIN_S; function CTIME.SECONDS (time) = time; // Date construction functions. function DATE.DMY (d, m, y) = expr_ymd_to_date (y, m, d); function DATE.MDY (m, d, y) = expr_ymd_to_date (y, m, d); function DATE.MOYR (m, y) = expr_ymd_to_date (y, m, 1); function DATE.QYR (q, y) { if (q < 1.0 || q > 4.0 || q != (int) q) { msg (SW, _("The first argument to DATE.QYR must be 1, 2, 3, or 4.")); return SYSMIS; } return expr_ymd_to_date (y, q * 3 - 2, 1); } function DATE.WKYR (w, y) = expr_wkyr_to_date (w, y); function DATE.YRDAY (y, yday) = expr_yrday_to_date (y, yday); function YRMODA (y, m, d) = expr_yrmoda (y, m, d); // Date extraction functions. function XDATE.TDAY (date) = floor (date / DAY_S); function XDATE.HOUR (date) = fmod (floor (date / H_S), DAY_H); function XDATE.MINUTE (date) = fmod (floor (date / H_MIN), H_MIN); function XDATE.SECOND (date) = fmod (date, MIN_S); function XDATE.DATE (date) = floor (date / DAY_S) * DAY_S; function XDATE.TIME (date) = fmod (date, DAY_S); function XDATE.JDAY (date >= DAY_S) = calendar_offset_to_yday (date / DAY_S); function XDATE.MDAY (date >= DAY_S) = calendar_offset_to_mday (date / DAY_S); function XDATE.MONTH (date >= DAY_S) = calendar_offset_to_month (date / DAY_S); function XDATE.QUARTER (date >= DAY_S) = (calendar_offset_to_month (date / DAY_S) - 1) / 3 + 1; function XDATE.WEEK (date >= DAY_S) = (calendar_offset_to_yday (date / DAY_S) - 1) / 7 + 1; function XDATE.WKDAY (date >= DAY_S) = calendar_offset_to_wday (date / DAY_S); function XDATE.YEAR (date >= DAY_S) = calendar_offset_to_year (date / DAY_S); // Date arithmetic functions. no_abbrev function DATEDIFF (date2 >= DAY_S, date1 >= DAY_S, string unit) = expr_date_difference (date1, date2, unit); no_abbrev function DATESUM (date, quantity, string unit) = expr_date_sum (date, quantity, unit, ss_cstr ("closest")); no_abbrev function DATESUM (date, quantity, string unit, string method) = expr_date_sum (date, quantity, unit, method); // String functions. string function CONCAT (string a[n]) expression e; { struct substring dst; size_t i; dst = alloc_string (e, MAX_STRING); dst.length = 0; for (i = 0; i < n; i++) { struct substring *src = &a[i]; size_t copy_len; copy_len = src->length; if (dst.length + copy_len > MAX_STRING) copy_len = MAX_STRING - dst.length; memcpy (&dst.string[dst.length], src->string, copy_len); dst.length += copy_len; } return dst; } function INDEX (string haystack, string needle) { if (needle.length == 0) return SYSMIS; else { int limit = haystack.length - needle.length + 1; int i; for (i = 1; i <= limit; i++) if (!memcmp (&haystack.string[i - 1], needle.string, needle.length)) return i; return 0; } } function INDEX (string haystack, string needles, needle_len_d) { if (needle_len_d <= INT_MIN || needle_len_d >= INT_MAX || (int) needle_len_d != needle_len_d || needles.length == 0) return SYSMIS; else { int needle_len = needle_len_d; if (needle_len < 0 || needle_len > needles.length || needles.length % needle_len != 0) return SYSMIS; else { int limit = haystack.length - needle_len + 1; int i, j; for (i = 1; i <= limit; i++) for (j = 0; j < needles.length; j += needle_len) if (!memcmp (&haystack.string[i - 1], &needles.string[j], needle_len)) return i; return 0; } } } function RINDEX (string haystack, string needle) { if (needle.length == 0) return SYSMIS; else { int limit = haystack.length - needle.length + 1; int i; for (i = limit; i >= 1; i--) if (!memcmp (&haystack.string[i - 1], needle.string, needle.length)) return i; return 0; } } function RINDEX (string haystack, string needles, needle_len_d) { if (needle_len_d <= 0 || needle_len_d >= INT_MAX || (int) needle_len_d != needle_len_d || needles.length == 0) return SYSMIS; else { int needle_len = needle_len_d; if (needle_len < 0 || needle_len > needles.length || needles.length % needle_len != 0) return SYSMIS; else { int limit = haystack.length - needle_len + 1; int i, j; for (i = limit; i >= 1; i--) for (j = 0; j < needles.length; j += needle_len) if (!memcmp (&haystack.string[i - 1], &needles.string[j], needle_len)) return i; return 0; } } } function LENGTH (string s) { return s.length; } string function LOWER (string s) { int i; for (i = 0; i < s.length; i++) s.string[i] = tolower ((unsigned char) s.string[i]); return s; } function MBLEN.BYTE (string s, idx) { if (idx < 0 || idx >= s.length || (int) idx != idx) return SYSMIS; else return 1; } string function UPCASE (string s) { int i; for (i = 0; i < s.length; i++) s.string[i] = toupper ((unsigned char) s.string[i]); return s; } absorb_miss string function LPAD (string s, n) expression e; { if (n < 0 || n > MAX_STRING || (int) n != n) return empty_string; else if (s.length >= n) return s; else { struct substring t = alloc_string (e, n); memset (t.string, ' ', n - s.length); memcpy (&t.string[(int) n - s.length], s.string, s.length); return t; } } absorb_miss string function LPAD (string s, n, string c) expression e; { if (n < 0 || n > MAX_STRING || (int) n != n || c.length != 1) return empty_string; else if (s.length >= n) return s; else { struct substring t = alloc_string (e, n); memset (t.string, c.string[0], n - s.length); memcpy (&t.string[(int) n - s.length], s.string, s.length); return t; } } string function REPLACE (string haystack, string needle, string replacement) expression e; = replace_string (e, haystack, needle, replacement, DBL_MAX); absorb_miss string function REPLACE (string haystack, string needle, string replacement, n) expression e; = replace_string (e, haystack, needle, replacement, n); absorb_miss string function RPAD (string s, n) expression e; { if (n < 0 || n > MAX_STRING || (int) n != n) return empty_string; else if (s.length >= n) return s; else { struct substring t = alloc_string (e, n); memcpy (t.string, s.string, s.length); memset (&t.string[s.length], ' ', n - s.length); return t; } } absorb_miss string function RPAD (string s, n, string c) expression e; { if (n < 0 || n > MAX_STRING || (int) n != n || c.length != 1) return empty_string; else if (s.length >= n) return s; else { struct substring t = alloc_string (e, n); memcpy (t.string, s.string, s.length); memset (&t.string[s.length], c.string[0], n - s.length); return t; } } string function LTRIM (string s) { while (s.length > 0 && s.string[0] == ' ') { s.length--; s.string++; } return s; } string function LTRIM (string s, string c) { if (c.length == 1) { while (s.length > 0 && s.string[0] == c.string[0]) { s.length--; s.string++; } return s; } else return empty_string; } string function RTRIM (string s) { while (s.length > 0 && s.string[s.length - 1] == ' ') s.length--; return s; } string function RTRIM (string s, string c) { if (c.length == 1) { while (s.length > 0 && s.string[s.length - 1] == c.string[0]) s.length--; return s; } else return empty_string; } function NUMBER (string s, ni_format f) { union value out; char *error; if (s.length > f->w) s.length = f->w; error = data_in (s, C_ENCODING, f->type, &out, 0, NULL); if (error == NULL) data_in_imply_decimals (s, C_ENCODING, f->type, f->d, &out); else { msg (SE, "Cannot parse `%.*s' as format %s: %s", (int) s.length, s.string, fmt_name (f->type), error); free (error); } return out.f; } absorb_miss string function STRING (x, no_format f) expression e; { union value v; struct substring dst; char *s; v.f = x; assert (!fmt_is_string (f->type)); s = data_out (&v, C_ENCODING, f); dst = alloc_string (e, strlen (s)); strcpy (dst.string, s); free (s); return dst; } absorb_miss string function STRUNC (string s, n) { if (n < 1 || n == SYSMIS) return empty_string; if (n < s.length) s.length = n; while (s.length > 0 && s.string[s.length - 1] == ' ') s.length--; return s; } absorb_miss string function SUBSTR (string s, ofs) expression e; { if (ofs >= 1 && ofs <= s.length && (int) ofs == ofs) return copy_string (e, &s.string[(int) ofs - 1], s.length - ofs + 1); else return empty_string; } absorb_miss string function SUBSTR (string s, ofs, cnt) expression e; { if (ofs >= 1 && ofs <= s.length && (int) ofs == ofs && cnt >= 1 && cnt <= INT_MAX && (int) cnt == cnt) { int cnt_max = s.length - (int) ofs + 1; return copy_string (e, &s.string[(int) ofs - 1], cnt <= cnt_max ? cnt : cnt_max); } else return empty_string; } absorb_miss no_opt no_abbrev string function VALUELABEL (var v) expression e; case c; { const char *label = var_lookup_value_label (v, case_data (c, v)); if (label != NULL) return copy_string (e, label, strlen (label)); else return empty_string; } // Artificial. operator SQUARE (x) = x * x; boolean operator NUM_TO_BOOLEAN (x, string op_name) { if (x == 0. || x == 1. || x == SYSMIS) return x; if (!ss_is_empty (op_name)) msg (SE, _("An operand of the %.*s operator was found to have a value " "other than 0 (false), 1 (true), or the system-missing " "value. The result was forced to 0."), (int) op_name.length, op_name.string); else msg (SE, _("A logical expression was found to have a value other than 0 " "(false), 1 (true), or the system-missing value. The result " "was forced to 0.")); return 0.; } operator BOOLEAN_TO_NUM (boolean x) = x; // Beta distribution. function PDF.BETA (x >= 0 && x <= 1, a > 0, b > 0) = gsl_ran_beta_pdf (x, a, b); function CDF.BETA (x >= 0 && x <= 1, a > 0, b > 0) = gsl_cdf_beta_P (x, a, b); function IDF.BETA (P >= 0 && P <= 1, a > 0, b > 0) = gsl_cdf_beta_Pinv (P, a, b); no_opt function RV.BETA (a > 0, b > 0) = gsl_ran_beta (get_rng (), a, b); function NCDF.BETA (x >= 0, a > 0, b > 0, lambda > 0) = ncdf_beta (x, a, b, lambda); function NPDF.BETA (x >= 0, a > 0, b > 0, lambda > 0) = npdf_beta (x, a, b, lambda); // Bivariate normal distribution. function CDF.BVNOR (x0, x1, r >= -1 && r <= 1) = cdf_bvnor (x0, x1, r); function PDF.BVNOR (x0, x1, r >= -1 && r <= 1) = gsl_ran_bivariate_gaussian_pdf (x0, x1, 1, 1, r); // Cauchy distribution. function CDF.CAUCHY (x, a, b > 0) = gsl_cdf_cauchy_P ((x - a) / b, 1); function IDF.CAUCHY (P > 0 && P < 1, a, b > 0) = a + b * gsl_cdf_cauchy_Pinv (P, 1); function PDF.CAUCHY (x, a, b > 0) = gsl_ran_cauchy_pdf ((x - a) / b, 1) / b; no_opt function RV.CAUCHY (a, b > 0) = a + b * gsl_ran_cauchy (get_rng (), 1); // Chi-square distribution. function CDF.CHISQ (x >= 0, df > 0) = gsl_cdf_chisq_P (x, df); function IDF.CHISQ (P >= 0 && P < 1, df > 0) = gsl_cdf_chisq_Pinv (P, df); function PDF.CHISQ (x >= 0, df > 0) = gsl_ran_chisq_pdf (x, df); no_opt function RV.CHISQ (df > 0) = gsl_ran_chisq (get_rng (), df); function NCDF.CHISQ (x >= 0, df > 0, c) = unimplemented; function NPDF.CHISQ (x >= 0, df > 0, c) = unimplemented; function SIG.CHISQ (x >= 0, df > 0) = gsl_cdf_chisq_Q (x, df); // Exponential distribution. function CDF.EXP (x >= 0, a > 0) = gsl_cdf_exponential_P (x, 1. / a); function IDF.EXP (P >= 0 && P < 1, a > 0) = gsl_cdf_exponential_Pinv (P, 1. / a); function PDF.EXP (x >= 0, a > 0) = gsl_ran_exponential_pdf (x, 1. / a); no_opt function RV.EXP (a > 0) = gsl_ran_exponential (get_rng (), 1. / a); // Exponential power distribution. extension function PDF.XPOWER (x, a > 0, b >= 0) = gsl_ran_exppow_pdf (x, a, b); no_opt extension function RV.XPOWER (a > 0, b >= 0) = gsl_ran_exppow (get_rng (), a, b); // F distribution. function CDF.F (x >= 0, df1 > 0, df2 > 0) = gsl_cdf_fdist_P (x, df1, df2); function IDF.F (P >= 0 && P < 1, df1 > 0, df2 > 0) = idf_fdist (P, df1, df2); function PDF.F (x >= 0, df1 > 0, df2 > 0) = gsl_ran_fdist_pdf (x, df1, df2); no_opt function RV.F (df1 > 0, df2 > 0) = gsl_ran_fdist (get_rng (), df1, df2); function NCDF.F (x >= 0, df1 > 0, df2 > 0, lambda >= 0) = unimplemented; function NPDF.F (x >= 0, df1 > 0, df2 > 0, lmabda >= 0) = unimplemented; function SIG.F (x >= 0, df1 > 0, df2 > 0) = gsl_cdf_fdist_Q (x, df1, df2); // Gamma distribution. function CDF.GAMMA (x >= 0, a > 0, b > 0) = gsl_cdf_gamma_P (x, a, 1. / b); function IDF.GAMMA (P >= 0 && P <= 1, a > 0, b > 0) = gsl_cdf_gamma_Pinv (P, a, 1. / b); function PDF.GAMMA (x >= 0, a > 0, b > 0) = gsl_ran_gamma_pdf (x, a, 1. / b); no_opt function RV.GAMMA (a > 0, b > 0) = gsl_ran_gamma (get_rng (), a, 1. / b); // Half-normal distribution. function CDF.HALFNRM (x, a, b > 0) = unimplemented; function IDF.HALFNRM (P > 0 && P < 1, a, b > 0) = unimplemented; function PDF.HALFNRM (x, a, b > 0) = unimplemented; no_opt function RV.HALFNRM (a, b > 0) = unimplemented; // Inverse Gaussian distribution. function CDF.IGAUSS (x > 0, a > 0, b > 0) = unimplemented; function IDF.IGAUSS (P >= 0 && P < 1, a > 0, b > 0) = unimplemented; function PDF.IGAUSS (x > 0, a > 0, b > 0) = unimplemented; no_opt function RV.IGAUSS (a > 0, b > 0) = unimplemented; // Landau distribution. extension function PDF.LANDAU (x) = gsl_ran_landau_pdf (x); no_opt extension function RV.LANDAU () = gsl_ran_landau (get_rng ()); // Laplace distribution. function CDF.LAPLACE (x, a, b > 0) = gsl_cdf_laplace_P ((x - a) / b, 1); function IDF.LAPLACE (P > 0 && P < 1, a, b > 0) = a + b * gsl_cdf_laplace_Pinv (P, 1); function PDF.LAPLACE (x, a, b > 0) = gsl_ran_laplace_pdf ((x - a) / b, 1) / b; no_opt function RV.LAPLACE (a, b > 0) = a + b * gsl_ran_laplace (get_rng (), 1); // Levy alpha-stable distribution. no_opt extension function RV.LEVY (c, alpha > 0 && alpha <= 2) = gsl_ran_levy (get_rng (), c, alpha); // Levy skew alpha-stable distribution. no_opt extension function RV.LVSKEW (c, alpha > 0 && alpha <= 2, beta >= -1 && beta <= 1) = gsl_ran_levy_skew (get_rng (), c, alpha, beta); // Logistic distribution. function CDF.LOGISTIC (x, a, b > 0) = gsl_cdf_logistic_P ((x - a) / b, 1); function IDF.LOGISTIC (P > 0 && P < 1, a, b > 0) = a + b * gsl_cdf_logistic_Pinv (P, 1); function PDF.LOGISTIC (x, a, b > 0) = gsl_ran_logistic_pdf ((x - a) / b, 1) / b; no_opt function RV.LOGISTIC (a, b > 0) = a + b * gsl_ran_logistic (get_rng (), 1); // Lognormal distribution. function CDF.LNORMAL (x >= 0, m > 0, s > 0) = gsl_cdf_lognormal_P (x, log (m), s); function IDF.LNORMAL (P >= 0 && P < 1, m > 0, s > 0) = gsl_cdf_lognormal_Pinv (P, log (m), s); function PDF.LNORMAL (x >= 0, m > 0, s > 0) = gsl_ran_lognormal_pdf (x, log (m), s); no_opt function RV.LNORMAL (m > 0, s > 0) = gsl_ran_lognormal (get_rng (), log (m), s); // Normal distribution. function CDF.NORMAL (x, u, s > 0) = gsl_cdf_gaussian_P (x - u, s); function IDF.NORMAL (P > 0 && P < 1, u, s > 0) = u + gsl_cdf_gaussian_Pinv (P, s); function PDF.NORMAL (x, u, s > 0) = gsl_ran_gaussian_pdf ((x - u) / s, 1) / s; no_opt function RV.NORMAL (u, s > 0) = u + gsl_ran_gaussian (get_rng (), s); function CDFNORM (x) = gsl_cdf_ugaussian_P (x); function PROBIT (P > 0 && P < 1) = gsl_cdf_ugaussian_Pinv (P); no_opt function NORMAL (s > 0) = gsl_ran_gaussian (get_rng (), s); // Normal tail distribution. function PDF.NTAIL (x, a > 0, sigma > 0) = gsl_ran_gaussian_tail_pdf (x, a, sigma); no_opt function RV.NTAIL (a > 0, sigma > 0) = gsl_ran_gaussian_tail (get_rng (), a, sigma); // Pareto distribution. function CDF.PARETO (x >= a, a > 0, b > 0) = gsl_cdf_pareto_P (x, b, a); function IDF.PARETO (P >= 0 && P < 1, a > 0, b > 0) = gsl_cdf_pareto_Pinv (P, b, a); function PDF.PARETO (x >= a, a > 0, b > 0) = gsl_ran_pareto_pdf (x, b, a); no_opt function RV.PARETO (a > 0, b > 0) = gsl_ran_pareto (get_rng (), b, a); // Rayleigh distribution. extension function CDF.RAYLEIGH (x, sigma > 0) = gsl_cdf_rayleigh_P (x, sigma); extension function IDF.RAYLEIGH (P >= 0 && P <= 1, sigma > 0) = gsl_cdf_rayleigh_Pinv (P, sigma); extension function PDF.RAYLEIGH (x, sigma > 0) = gsl_ran_rayleigh_pdf (x, sigma); no_opt extension function RV.RAYLEIGH (sigma > 0) = gsl_ran_rayleigh (get_rng (), sigma); // Rayleigh tail distribution. extension function PDF.RTAIL (x, a, sigma) = gsl_ran_rayleigh_tail_pdf (x, a, sigma); no_opt extension function RV.RTAIL (a, sigma) = gsl_ran_rayleigh_tail (get_rng (), a, sigma); // Studentized maximum modulus distribution. function CDF.SMOD (x > 0, a >= 1, b >= 1) = unimplemented; function IDF.SMOD (P >= 0 && P < 1, a >= 1, b >= 1) = unimplemented; // Studentized range distribution. function CDF.SRANGE (x > 0, a >= 1, b >= 1) = unimplemented; function IDF.SRANGE (P >= 0 && P < 1, a >= 1, b >= 1) = unimplemented; // Student t distribution. function CDF.T (x, df > 0) = gsl_cdf_tdist_P (x, df); function IDF.T (P > 0 && P < 1, df > 0) = gsl_cdf_tdist_Pinv (P, df); function PDF.T (x, df > 0) = gsl_ran_tdist_pdf (x, df); no_opt function RV.T (df > 0) = gsl_ran_tdist (get_rng (), df); function NCDF.T (x, df > 0, nc) = unimplemented; function NPDF.T (x, df > 0, nc) = unimplemented; // Type-1 Gumbel distribution. extension function CDF.T1G (x, a, b) = gsl_cdf_gumbel1_P (x, a, b); extension function IDF.T1G (P >= 0 && P <= 1, a, b) = gsl_cdf_gumbel1_P (P, a, b); extension function PDF.T1G (x, a, b) = gsl_ran_gumbel1_pdf (x, a, b); no_opt extension function RV.T1G (a, b) = gsl_ran_gumbel1 (get_rng (), a, b); // Type-2 Gumbel distribution. extension function CDF.T2G (x, a, b) = gsl_cdf_gumbel2_P (x, a, b); extension function IDF.T2G (P >= 0 && P <= 1, a, b) = gsl_cdf_gumbel2_P (P, a, b); extension function PDF.T2G (x, a, b) = gsl_ran_gumbel2_pdf (x, a, b); no_opt extension function RV.T2G (a, b) = gsl_ran_gumbel2 (get_rng (), a, b); // Uniform distribution. function CDF.UNIFORM (x <= b, a <= x, b) = gsl_cdf_flat_P (x, a, b); function IDF.UNIFORM (P >= 0 && P <= 1, a <= b, b) = gsl_cdf_flat_Pinv (P, a, b); function PDF.UNIFORM (x <= b, a <= x, b) = gsl_ran_flat_pdf (x, a, b); no_opt function RV.UNIFORM (a <= b, b) = gsl_ran_flat (get_rng (), a, b); no_opt function UNIFORM (b >= 0) = gsl_ran_flat (get_rng (), 0, b); // Weibull distribution. function CDF.WEIBULL (x >= 0, a > 0, b > 0) = gsl_cdf_weibull_P (x, a, b); function IDF.WEIBULL (P >= 0 && P < 1, a > 0, b > 0) = gsl_cdf_weibull_Pinv (P, a, b); function PDF.WEIBULL (x >= 0, a > 0, b > 0) = gsl_ran_weibull_pdf (x, a, b); no_opt function RV.WEIBULL (a > 0, b > 0) = gsl_ran_weibull (get_rng (), a, b); // Bernoulli distribution. function CDF.BERNOULLI (k == 0 || k == 1, p >= 0 && p <= 1) = k ? 1 : 1 - p; function PDF.BERNOULLI (k == 0 || k == 1, p >= 0 && p <= 1) = gsl_ran_bernoulli_pdf (k, p); no_opt function RV.BERNOULLI (p >= 0 && p <= 1) = gsl_ran_bernoulli (get_rng (), p); // Binomial distribution. function CDF.BINOM (k, n > 0 && n == floor (n), p >= 0 && p <= 1) = gsl_cdf_binomial_P (k, p, n); function PDF.BINOM (k >= 0 && k == floor (k) && k <= n, n > 0 && n == floor (n), p >= 0 && p <= 1) = gsl_ran_binomial_pdf (k, p, n); no_opt function RV.BINOM (p > 0 && p == floor (p), n >= 0 && n <= 1) = gsl_ran_binomial (get_rng (), p, n); // Geometric distribution. function CDF.GEOM (k >= 1 && k == floor (k), p >= 0 && p <= 1) = gsl_cdf_geometric_P (k, p); function PDF.GEOM (k >= 1 && k == floor (k), p >= 0 && p <= 1) = gsl_ran_geometric_pdf (k, p); no_opt function RV.GEOM (p >= 0 && p <= 1) = gsl_ran_geometric (get_rng (), p); // Hypergeometric distribution. function CDF.HYPER (k >= 0 && k == floor (k) && k <= c, a > 0 && a == floor (a), b > 0 && b == floor (b) && b <= a, c > 0 && c == floor (c) && c <= a) = gsl_cdf_hypergeometric_P (k, c, a - c, b); function PDF.HYPER (k >= 0 && k == floor (k) && k <= c, a > 0 && a == floor (a), b > 0 && b == floor (b) && b <= a, c > 0 && c == floor (c) && c <= a) = gsl_ran_hypergeometric_pdf (k, c, a - c, b); no_opt function RV.HYPER (a > 0 && a == floor (a), b > 0 && b == floor (b) && b <= a, c > 0 && c == floor (c) && c <= a) = gsl_ran_hypergeometric (get_rng (), c, a - c, b); // Logarithmic distribution. extension function PDF.LOG (k >= 1, p > 0 && p <= 1) = gsl_ran_logarithmic_pdf (k, p); no_opt extension function RV.LOG (p > 0 && p <= 1) = gsl_ran_logarithmic (get_rng (), p); // Negative binomial distribution. function CDF.NEGBIN (k >= 1, n == floor (n), p > 0 && p <= 1) = gsl_cdf_negative_binomial_P (k, p, n); function PDF.NEGBIN (k >= 1, n == floor (n), p > 0 && p <= 1) = gsl_ran_negative_binomial_pdf (k, p, n); no_opt function RV.NEGBIN (n == floor (n), p > 0 && p <= 1) = gsl_ran_negative_binomial (get_rng (), p, n); // Poisson distribution. function CDF.POISSON (k >= 0 && k == floor (k), mu > 0) = gsl_cdf_poisson_P (k, mu); function PDF.POISSON (k >= 0 && k == floor (k), mu > 0) = gsl_ran_poisson_pdf (k, mu); no_opt function RV.POISSON (mu > 0) = gsl_ran_poisson (get_rng (), mu); // Weirdness. absorb_miss boolean function MISSING (x) = x == SYSMIS || !isfinite (x); absorb_miss boolean function SYSMIS (x) = x == SYSMIS || !isfinite (x); no_opt boolean function SYSMIS (num_var v) case c; { return case_num (c, v) == SYSMIS; } no_opt boolean function VALUE (num_var v) case c; { return case_num (c, v); } no_opt operator VEC_ELEM_NUM (idx) vector v; case c; { if (idx >= 1 && idx <= vector_get_var_cnt (v)) { const struct variable *var = vector_get_var (v, (size_t) idx - 1); double value = case_num (c, var); return !var_is_num_missing (var, value, MV_USER) ? value : SYSMIS; } else { if (idx == SYSMIS) msg (SE, _("SYSMIS is not a valid index value for vector " "%s. The result will be set to SYSMIS."), vector_get_name (v)); else msg (SE, _("%g is not a valid index value for vector %s. " "The result will be set to SYSMIS."), idx, vector_get_name (v)); return SYSMIS; } } absorb_miss no_opt string operator VEC_ELEM_STR (idx) expression e; vector v; case c; { if (idx >= 1 && idx <= vector_get_var_cnt (v)) { struct variable *var = vector_get_var (v, (size_t) idx - 1); return copy_string (e, CHAR_CAST_BUG (char *, case_str (c, var)), var_get_width (var)); } else { if (idx == SYSMIS) msg (SE, _("SYSMIS is not a valid index value for vector " "%s. The result will be set to the empty string."), vector_get_name (v)); else msg (SE, _("%g is not a valid index value for vector %s. " "The result will be set to the empty string."), idx, vector_get_name (v)); return empty_string; } } // Terminals. no_opt operator NUM_VAR () case c; num_var v; { double d = case_num (c, v); return !var_is_num_missing (v, d, MV_USER) ? d : SYSMIS; } no_opt string operator STR_VAR () case c; expression e; str_var v; { struct substring s = alloc_string (e, var_get_width (v)); memcpy (s.string, case_str (c, v), var_get_width (v)); return s; } no_opt perm_only function LAG (num_var v, pos_int n_before) dataset ds; { const struct ccase *c = lagged_case (ds, n_before); if (c != NULL) { double x = case_num (c, v); return !var_is_num_missing (v, x, MV_USER) ? x : SYSMIS; } else return SYSMIS; } no_opt perm_only function LAG (num_var v) dataset ds; { const struct ccase *c = lagged_case (ds, 1); if (c != NULL) { double x = case_num (c, v); return !var_is_num_missing (v, x, MV_USER) ? x : SYSMIS; } else return SYSMIS; } no_opt perm_only string function LAG (str_var v, pos_int n_before) expression e; dataset ds; { const struct ccase *c = lagged_case (ds, n_before); if (c != NULL) return copy_string (e, CHAR_CAST_BUG (char *, case_str (c, v)), var_get_width (v)); else return empty_string; } no_opt perm_only string function LAG (str_var v) expression e; dataset ds; { const struct ccase *c = lagged_case (ds, 1); if (c != NULL) return copy_string (e, CHAR_CAST_BUG (char *, case_str (c, v)), var_get_width (v)); else return empty_string; } no_opt operator NUM_SYS () case c; num_var v; { return case_num (c, v) == SYSMIS; } no_opt operator NUM_VAL () case c; num_var v; { return case_num (c, v); } no_opt operator CASENUM () case_idx idx; { return idx; } pspp-1.4.1/src/language/expressions/parse.c0000644000175000017500000012615713670210420020334 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 1997-9, 2000, 2006, 2010, 2011, 2012, 2014 Free Software Foundation, Inc. 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 3 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, see . */ #include #include "private.h" #include #include #include #include #include "data/case.h" #include "data/dictionary.h" #include "data/settings.h" #include "data/variable.h" #include "language/expressions/helpers.h" #include "language/lexer/format-parser.h" #include "language/lexer/lexer.h" #include "language/lexer/variable-parser.h" #include "libpspp/array.h" #include "libpspp/assertion.h" #include "libpspp/i18n.h" #include "libpspp/message.h" #include "libpspp/misc.h" #include "libpspp/pool.h" #include "libpspp/str.h" #include "gl/c-strcase.h" #include "gl/xalloc.h" /* Declarations. */ /* Recursive descent parser in order of increasing precedence. */ typedef union any_node *parse_recursively_func (struct lexer *, struct expression *); static parse_recursively_func parse_or, parse_and, parse_not; static parse_recursively_func parse_rel, parse_add, parse_mul; static parse_recursively_func parse_neg, parse_exp; static parse_recursively_func parse_primary; static parse_recursively_func parse_vector_element, parse_function; /* Utility functions. */ static struct expression *expr_create (struct dataset *ds); atom_type expr_node_returns (const union any_node *); static const char *atom_type_name (atom_type); static struct expression *finish_expression (union any_node *, struct expression *); static bool type_check (struct expression *, union any_node **, enum expr_type expected_type); static union any_node *allocate_unary_variable (struct expression *, const struct variable *); /* Public functions. */ /* Parses an expression of the given TYPE. If DICT is nonnull then variables and vectors within it may be referenced within the expression; otherwise, the expression must not reference any variables or vectors. Returns the new expression if successful or a null pointer otherwise. */ struct expression * expr_parse (struct lexer *lexer, struct dataset *ds, enum expr_type type) { union any_node *n; struct expression *e; assert (type == EXPR_NUMBER || type == EXPR_STRING || type == EXPR_BOOLEAN); e = expr_create (ds); n = parse_or (lexer, e); if (n != NULL && type_check (e, &n, type)) return finish_expression (expr_optimize (n, e), e); else { expr_free (e); return NULL; } } /* Parses and returns an expression of the given TYPE, as expr_parse(), and sets up so that destroying POOL will free the expression as well. */ struct expression * expr_parse_pool (struct lexer *lexer, struct pool *pool, struct dataset *ds, enum expr_type type) { struct expression *e = expr_parse (lexer, ds, type); if (e != NULL) pool_add_subpool (pool, e->expr_pool); return e; } /* Free expression E. */ void expr_free (struct expression *e) { if (e != NULL) pool_destroy (e->expr_pool); } struct expression * expr_parse_any (struct lexer *lexer, struct dataset *ds, bool optimize) { union any_node *n; struct expression *e; e = expr_create (ds); n = parse_or (lexer, e); if (n == NULL) { expr_free (e); return NULL; } if (optimize) n = expr_optimize (n, e); return finish_expression (n, e); } /* Finishing up expression building. */ /* Height of an expression's stacks. */ struct stack_heights { int number_height; /* Height of number stack. */ int string_height; /* Height of string stack. */ }; /* Stack heights used by different kinds of arguments. */ static const struct stack_heights on_number_stack = {1, 0}; static const struct stack_heights on_string_stack = {0, 1}; static const struct stack_heights not_on_stack = {0, 0}; /* Returns the stack heights used by an atom of the given TYPE. */ static const struct stack_heights * atom_type_stack (atom_type type) { assert (is_atom (type)); switch (type) { case OP_number: case OP_boolean: return &on_number_stack; case OP_string: return &on_string_stack; case OP_format: case OP_ni_format: case OP_no_format: case OP_num_var: case OP_str_var: case OP_integer: case OP_pos_int: case OP_vector: return ¬_on_stack; default: NOT_REACHED (); } } /* Measures the stack height needed for node N, supposing that the stack height is initially *HEIGHT and updating *HEIGHT to the final stack height. Updates *MAX, if necessary, to reflect the maximum intermediate or final height. */ static void measure_stack (const union any_node *n, struct stack_heights *height, struct stack_heights *max) { const struct stack_heights *return_height; if (is_composite (n->type)) { struct stack_heights args; int i; args = *height; for (i = 0; i < n->composite.arg_cnt; i++) measure_stack (n->composite.args[i], &args, max); return_height = atom_type_stack (operations[n->type].returns); } else return_height = atom_type_stack (n->type); height->number_height += return_height->number_height; height->string_height += return_height->string_height; if (height->number_height > max->number_height) max->number_height = height->number_height; if (height->string_height > max->string_height) max->string_height = height->string_height; } /* Allocates stacks within E sufficient for evaluating node N. */ static void allocate_stacks (union any_node *n, struct expression *e) { struct stack_heights initial = {0, 0}; struct stack_heights max = {0, 0}; measure_stack (n, &initial, &max); e->number_stack = pool_alloc (e->expr_pool, sizeof *e->number_stack * max.number_height); e->string_stack = pool_alloc (e->expr_pool, sizeof *e->string_stack * max.string_height); } /* Finalizes expression E for evaluating node N. */ static struct expression * finish_expression (union any_node *n, struct expression *e) { /* Allocate stacks. */ allocate_stacks (n, e); /* Output postfix representation. */ expr_flatten (n, e); /* The eval_pool might have been used for allocating strings during optimization. We need to keep those strings around for all subsequent evaluations, so start a new eval_pool. */ e->eval_pool = pool_create_subpool (e->expr_pool); return e; } /* Verifies that expression E, whose root node is *N, can be converted to type EXPECTED_TYPE, inserting a conversion at *N if necessary. Returns true if successful, false on failure. */ static bool type_check (struct expression *e, union any_node **n, enum expr_type expected_type) { atom_type actual_type = expr_node_returns (*n); switch (expected_type) { case EXPR_BOOLEAN: case EXPR_NUMBER: if (actual_type != OP_number && actual_type != OP_boolean) { msg (SE, _("Type mismatch: expression has %s type, " "but a numeric value is required here."), atom_type_name (actual_type)); return false; } if (actual_type == OP_number && expected_type == EXPR_BOOLEAN) *n = expr_allocate_binary (e, OP_NUM_TO_BOOLEAN, *n, expr_allocate_string (e, ss_empty ())); break; case EXPR_STRING: if (actual_type != OP_string) { msg (SE, _("Type mismatch: expression has %s type, " "but a string value is required here."), atom_type_name (actual_type)); return false; } break; default: NOT_REACHED (); } return true; } /* Recursive-descent expression parser. */ /* Considers whether *NODE may be coerced to type REQUIRED_TYPE. Returns true if possible, false if disallowed. If DO_COERCION is false, then *NODE is not modified and there are no side effects. If DO_COERCION is true, we perform the coercion if possible, modifying *NODE if necessary. If the coercion is not possible then we free *NODE and set *NODE to a null pointer. This function's interface is somewhat awkward. Use one of the wrapper functions type_coercion(), type_coercion_assert(), or is_coercible() instead. */ static bool type_coercion_core (struct expression *e, atom_type required_type, union any_node **node, const char *operator_name, bool do_coercion) { atom_type actual_type; assert (!!do_coercion == (e != NULL)); if (*node == NULL) { /* Propagate error. Whatever caused the original error already emitted an error message. */ return false; } actual_type = expr_node_returns (*node); if (actual_type == required_type) { /* Type match. */ return true; } switch (required_type) { case OP_number: if (actual_type == OP_boolean) { /* To enforce strict typing rules, insert Boolean to numeric "conversion". This conversion is a no-op, so it will be removed later. */ if (do_coercion) *node = expr_allocate_unary (e, OP_BOOLEAN_TO_NUM, *node); return true; } break; case OP_string: /* No coercion to string. */ break; case OP_boolean: if (actual_type == OP_number) { /* Convert numeric to boolean. */ if (do_coercion) { union any_node *op_name; op_name = expr_allocate_string (e, ss_cstr (operator_name)); *node = expr_allocate_binary (e, OP_NUM_TO_BOOLEAN, *node, op_name); } return true; } break; case OP_format: NOT_REACHED (); case OP_ni_format: msg_disable (); if ((*node)->type == OP_format && fmt_check_input (&(*node)->format.f) && fmt_check_type_compat (&(*node)->format.f, VAL_NUMERIC)) { msg_enable (); if (do_coercion) (*node)->type = OP_ni_format; return true; } msg_enable (); break; case OP_no_format: msg_disable (); if ((*node)->type == OP_format && fmt_check_output (&(*node)->format.f) && fmt_check_type_compat (&(*node)->format.f, VAL_NUMERIC)) { msg_enable (); if (do_coercion) (*node)->type = OP_no_format; return true; } msg_enable (); break; case OP_num_var: if ((*node)->type == OP_NUM_VAR) { if (do_coercion) *node = (*node)->composite.args[0]; return true; } break; case OP_str_var: if ((*node)->type == OP_STR_VAR) { if (do_coercion) *node = (*node)->composite.args[0]; return true; } break; case OP_var: if ((*node)->type == OP_NUM_VAR || (*node)->type == OP_STR_VAR) { if (do_coercion) *node = (*node)->composite.args[0]; return true; } break; case OP_pos_int: if ((*node)->type == OP_number && floor ((*node)->number.n) == (*node)->number.n && (*node)->number.n > 0 && (*node)->number.n < INT_MAX) { if (do_coercion) *node = expr_allocate_pos_int (e, (*node)->number.n); return true; } break; default: NOT_REACHED (); } if (do_coercion) { msg (SE, _("Type mismatch while applying %s operator: " "cannot convert %s to %s."), operator_name, atom_type_name (actual_type), atom_type_name (required_type)); *node = NULL; } return false; } /* Coerces *NODE to type REQUIRED_TYPE, and returns success. If *NODE cannot be coerced to the desired type then we issue an error message about operator OPERATOR_NAME and free *NODE. */ static bool type_coercion (struct expression *e, atom_type required_type, union any_node **node, const char *operator_name) { return type_coercion_core (e, required_type, node, operator_name, true); } /* Coerces *NODE to type REQUIRED_TYPE. Assert-fails if the coercion is disallowed. */ static void type_coercion_assert (struct expression *e, atom_type required_type, union any_node **node) { int success = type_coercion_core (e, required_type, node, NULL, true); assert (success); } /* Returns true if *NODE may be coerced to type REQUIRED_TYPE, false otherwise. */ static bool is_coercible (atom_type required_type, union any_node *const *node) { return type_coercion_core (NULL, required_type, (union any_node **) node, NULL, false); } /* Returns true if ACTUAL_TYPE is a kind of REQUIRED_TYPE, false otherwise. */ static bool is_compatible (atom_type required_type, atom_type actual_type) { return (required_type == actual_type || (required_type == OP_var && (actual_type == OP_num_var || actual_type == OP_str_var))); } /* How to parse an operator. */ struct operator { int token; /* Token representing operator. */ operation_type type; /* Operation type representing operation. */ const char *name; /* Name of operator. */ }; /* Attempts to match the current token against the tokens for the OP_CNT operators in OPS[]. If successful, returns true and, if OPERATOR is non-null, sets *OPERATOR to the operator. On failure, returns false and, if OPERATOR is non-null, sets *OPERATOR to a null pointer. */ static bool match_operator (struct lexer *lexer, const struct operator ops[], size_t op_cnt, const struct operator **operator) { const struct operator *op; for (op = ops; op < ops + op_cnt; op++) if (lex_token (lexer) == op->token) { if (op->token != T_NEG_NUM) lex_get (lexer); if (operator != NULL) *operator = op; return true; } if (operator != NULL) *operator = NULL; return false; } static bool check_operator (const struct operator *op, int arg_cnt, atom_type arg_type) { const struct operation *o; size_t i; assert (op != NULL); o = &operations[op->type]; assert (o->arg_cnt == arg_cnt); assert ((o->flags & OPF_ARRAY_OPERAND) == 0); for (i = 0; i < arg_cnt; i++) assert (is_compatible (arg_type, o->args[i])); return true; } static bool check_binary_operators (const struct operator ops[], size_t op_cnt, atom_type arg_type) { size_t i; for (i = 0; i < op_cnt; i++) check_operator (&ops[i], 2, arg_type); return true; } static atom_type get_operand_type (const struct operator *op) { return operations[op->type].args[0]; } /* Parses a chain of left-associative operator/operand pairs. There are OP_CNT operators, specified in OPS[]. The operators' operands must all be the same type. The next higher level is parsed by PARSE_NEXT_LEVEL. If CHAIN_WARNING is non-null, then it will be issued as a warning if more than one operator/operand pair is parsed. */ static union any_node * parse_binary_operators (struct lexer *lexer, struct expression *e, union any_node *node, const struct operator ops[], size_t op_cnt, parse_recursively_func *parse_next_level, const char *chain_warning) { atom_type operand_type = get_operand_type (&ops[0]); int op_count; const struct operator *operator; assert (check_binary_operators (ops, op_cnt, operand_type)); if (node == NULL) return node; for (op_count = 0; match_operator (lexer, ops, op_cnt, &operator); op_count++) { union any_node *rhs; /* Convert the left-hand side to type OPERAND_TYPE. */ if (!type_coercion (e, operand_type, &node, operator->name)) return NULL; /* Parse the right-hand side and coerce to type OPERAND_TYPE. */ rhs = parse_next_level (lexer, e); if (!type_coercion (e, operand_type, &rhs, operator->name)) return NULL; node = expr_allocate_binary (e, operator->type, node, rhs); } if (op_count > 1 && chain_warning != NULL) msg (SW, "%s", chain_warning); return node; } static union any_node * parse_inverting_unary_operator (struct lexer *lexer, struct expression *e, const struct operator *op, parse_recursively_func *parse_next_level) { union any_node *node; unsigned op_count; check_operator (op, 1, get_operand_type (op)); op_count = 0; while (match_operator (lexer, op, 1, NULL)) op_count++; node = parse_next_level (lexer, e); if (op_count > 0 && type_coercion (e, get_operand_type (op), &node, op->name) && op_count % 2 != 0) return expr_allocate_unary (e, op->type, node); else return node; } /* Parses the OR level. */ static union any_node * parse_or (struct lexer *lexer, struct expression *e) { static const struct operator op = { T_OR, OP_OR, "logical disjunction (`OR')" }; return parse_binary_operators (lexer, e, parse_and (lexer, e), &op, 1, parse_and, NULL); } /* Parses the AND level. */ static union any_node * parse_and (struct lexer *lexer, struct expression *e) { static const struct operator op = { T_AND, OP_AND, "logical conjunction (`AND')" }; return parse_binary_operators (lexer, e, parse_not (lexer, e), &op, 1, parse_not, NULL); } /* Parses the NOT level. */ static union any_node * parse_not (struct lexer *lexer, struct expression *e) { static const struct operator op = { T_NOT, OP_NOT, "logical negation (`NOT')" }; return parse_inverting_unary_operator (lexer, e, &op, parse_rel); } /* Parse relational operators. */ static union any_node * parse_rel (struct lexer *lexer, struct expression *e) { const char *chain_warning = _("Chaining relational operators (e.g. `a < b < c') will " "not produce the mathematically expected result. " "Use the AND logical operator to fix the problem " "(e.g. `a < b AND b < c'). " "If chaining is really intended, parentheses will disable " "this warning (e.g. `(a < b) < c'.)"); union any_node *node = parse_add (lexer, e); if (node == NULL) return NULL; switch (expr_node_returns (node)) { case OP_number: case OP_boolean: { static const struct operator ops[] = { { T_EQUALS, OP_EQ, "numeric equality (`=')" }, { T_EQ, OP_EQ, "numeric equality (`EQ')" }, { T_GE, OP_GE, "numeric greater-than-or-equal-to (`>=')" }, { T_GT, OP_GT, "numeric greater than (`>')" }, { T_LE, OP_LE, "numeric less-than-or-equal-to (`<=')" }, { T_LT, OP_LT, "numeric less than (`<')" }, { T_NE, OP_NE, "numeric inequality (`<>')" }, }; return parse_binary_operators (lexer, e, node, ops, sizeof ops / sizeof *ops, parse_add, chain_warning); } case OP_string: { static const struct operator ops[] = { { T_EQUALS, OP_EQ_STRING, "string equality (`=')" }, { T_EQ, OP_EQ_STRING, "string equality (`EQ')" }, { T_GE, OP_GE_STRING, "string greater-than-or-equal-to (`>=')" }, { T_GT, OP_GT_STRING, "string greater than (`>')" }, { T_LE, OP_LE_STRING, "string less-than-or-equal-to (`<=')" }, { T_LT, OP_LT_STRING, "string less than (`<')" }, { T_NE, OP_NE_STRING, "string inequality (`<>')" }, }; return parse_binary_operators (lexer, e, node, ops, sizeof ops / sizeof *ops, parse_add, chain_warning); } default: return node; } } /* Parses the addition and subtraction level. */ static union any_node * parse_add (struct lexer *lexer, struct expression *e) { static const struct operator ops[] = { { T_PLUS, OP_ADD, "addition (`+')" }, { T_DASH, OP_SUB, "subtraction (`-')" }, { T_NEG_NUM, OP_ADD, "subtraction (`-')" }, }; return parse_binary_operators (lexer, e, parse_mul (lexer, e), ops, sizeof ops / sizeof *ops, parse_mul, NULL); } /* Parses the multiplication and division level. */ static union any_node * parse_mul (struct lexer *lexer, struct expression *e) { static const struct operator ops[] = { { T_ASTERISK, OP_MUL, "multiplication (`*')" }, { T_SLASH, OP_DIV, "division (`/')" }, }; return parse_binary_operators (lexer, e, parse_neg (lexer, e), ops, sizeof ops / sizeof *ops, parse_neg, NULL); } /* Parses the unary minus level. */ static union any_node * parse_neg (struct lexer *lexer, struct expression *e) { static const struct operator op = { T_DASH, OP_NEG, "negation (`-')" }; return parse_inverting_unary_operator (lexer, e, &op, parse_exp); } static union any_node * parse_exp (struct lexer *lexer, struct expression *e) { static const struct operator op = { T_EXP, OP_POW, "exponentiation (`**')" }; const char *chain_warning = _("The exponentiation operator (`**') is left-associative, " "even though right-associative semantics are more useful. " "That is, `a**b**c' equals `(a**b)**c', not as `a**(b**c)'. " "To disable this warning, insert parentheses."); union any_node *lhs, *node; bool negative = false; if (lex_token (lexer) == T_NEG_NUM) { lhs = expr_allocate_number (e, -lex_tokval (lexer)); negative = true; lex_get (lexer); } else lhs = parse_primary (lexer, e); node = parse_binary_operators (lexer, e, lhs, &op, 1, parse_primary, chain_warning); return negative ? expr_allocate_unary (e, OP_NEG, node) : node; } /* Parses system variables. */ static union any_node * parse_sysvar (struct lexer *lexer, struct expression *e) { if (lex_match_id (lexer, "$CASENUM")) return expr_allocate_nullary (e, OP_CASENUM); else if (lex_match_id (lexer, "$DATE")) { static const char *months[12] = { "JAN", "FEB", "MAR", "APR", "MAY", "JUN", "JUL", "AUG", "SEP", "OCT", "NOV", "DEC", }; time_t last_proc_time = time_of_last_procedure (e->ds); struct tm *time; char temp_buf[10]; struct substring s; time = localtime (&last_proc_time); sprintf (temp_buf, "%02d %s %02d", abs (time->tm_mday) % 100, months[abs (time->tm_mon) % 12], abs (time->tm_year) % 100); ss_alloc_substring (&s, ss_cstr (temp_buf)); return expr_allocate_string (e, s); } else if (lex_match_id (lexer, "$TRUE")) return expr_allocate_boolean (e, 1.0); else if (lex_match_id (lexer, "$FALSE")) return expr_allocate_boolean (e, 0.0); else if (lex_match_id (lexer, "$SYSMIS")) return expr_allocate_number (e, SYSMIS); else if (lex_match_id (lexer, "$JDATE")) { time_t time = time_of_last_procedure (e->ds); struct tm *tm = localtime (&time); return expr_allocate_number (e, expr_ymd_to_ofs (tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday)); } else if (lex_match_id (lexer, "$TIME")) { time_t time = time_of_last_procedure (e->ds); struct tm *tm = localtime (&time); return expr_allocate_number (e, expr_ymd_to_date (tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday) + tm->tm_hour * 60 * 60. + tm->tm_min * 60. + tm->tm_sec); } else if (lex_match_id (lexer, "$LENGTH")) return expr_allocate_number (e, settings_get_viewlength ()); else if (lex_match_id (lexer, "$WIDTH")) return expr_allocate_number (e, settings_get_viewwidth ()); else { msg (SE, _("Unknown system variable %s."), lex_tokcstr (lexer)); return NULL; } } /* Parses numbers, varnames, etc. */ static union any_node * parse_primary (struct lexer *lexer, struct expression *e) { switch (lex_token (lexer)) { case T_ID: if (lex_next_token (lexer, 1) == T_LPAREN) { /* An identifier followed by a left parenthesis may be a vector element reference. If not, it's a function call. */ if (e->ds != NULL && dict_lookup_vector (dataset_dict (e->ds), lex_tokcstr (lexer)) != NULL) return parse_vector_element (lexer, e); else return parse_function (lexer, e); } else if (lex_tokcstr (lexer)[0] == '$') { /* $ at the beginning indicates a system variable. */ return parse_sysvar (lexer, e); } else if (e->ds != NULL && dict_lookup_var (dataset_dict (e->ds), lex_tokcstr (lexer))) { /* It looks like a user variable. (It could be a format specifier, but we'll assume it's a variable unless proven otherwise. */ return allocate_unary_variable (e, parse_variable (lexer, dataset_dict (e->ds))); } else { /* Try to parse it as a format specifier. */ struct fmt_spec fmt; bool ok; msg_disable (); ok = parse_format_specifier (lexer, &fmt); msg_enable (); if (ok) return expr_allocate_format (e, &fmt); /* All attempts failed. */ msg (SE, _("Unknown identifier %s."), lex_tokcstr (lexer)); return NULL; } break; case T_POS_NUM: case T_NEG_NUM: { union any_node *node = expr_allocate_number (e, lex_tokval (lexer)); lex_get (lexer); return node; } case T_STRING: { const char *dict_encoding; union any_node *node; char *s; dict_encoding = (e->ds != NULL ? dict_get_encoding (dataset_dict (e->ds)) : "UTF-8"); s = recode_string_pool (dict_encoding, "UTF-8", lex_tokcstr (lexer), ss_length (lex_tokss (lexer)), e->expr_pool); node = expr_allocate_string (e, ss_cstr (s)); lex_get (lexer); return node; } case T_LPAREN: { union any_node *node; lex_get (lexer); node = parse_or (lexer, e); if (node != NULL && !lex_force_match (lexer, T_RPAREN)) return NULL; return node; } default: lex_error (lexer, NULL); return NULL; } } static union any_node * parse_vector_element (struct lexer *lexer, struct expression *e) { const struct vector *vector; union any_node *element; /* Find vector, skip token. The caller must already have verified that the current token is the name of a vector. */ vector = dict_lookup_vector (dataset_dict (e->ds), lex_tokcstr (lexer)); assert (vector != NULL); lex_get (lexer); /* Skip left parenthesis token. The caller must have verified that the lookahead is a left parenthesis. */ assert (lex_token (lexer) == T_LPAREN); lex_get (lexer); element = parse_or (lexer, e); if (!type_coercion (e, OP_number, &element, "vector indexing") || !lex_match (lexer, T_RPAREN)) return NULL; return expr_allocate_binary (e, (vector_get_type (vector) == VAL_NUMERIC ? OP_VEC_ELEM_NUM : OP_VEC_ELEM_STR), element, expr_allocate_vector (e, vector)); } /* Individual function parsing. */ const struct operation operations[OP_first + OP_cnt] = { #include "parse.inc" }; static bool word_matches (const char **test, const char **name) { size_t test_len = strcspn (*test, "."); size_t name_len = strcspn (*name, "."); if (test_len == name_len) { if (buf_compare_case (*test, *name, test_len)) return false; } else if (test_len < 3 || test_len > name_len) return false; else { if (buf_compare_case (*test, *name, test_len)) return false; } *test += test_len; *name += name_len; if (**test != **name) return false; if (**test == '.') { (*test)++; (*name)++; } return true; } static int compare_names (const char *test, const char *name, bool abbrev_ok) { if (!abbrev_ok) return true; for (;;) { if (!word_matches (&test, &name)) return true; if (*name == '\0' && *test == '\0') return false; } } static int compare_strings (const char *test, const char *name, bool abbrev_ok UNUSED) { return c_strcasecmp (test, name); } static bool lookup_function_helper (const char *name, int (*compare) (const char *test, const char *name, bool abbrev_ok), const struct operation **first, const struct operation **last) { const struct operation *f; for (f = operations + OP_function_first; f <= operations + OP_function_last; f++) if (!compare (name, f->name, !(f->flags & OPF_NO_ABBREV))) { *first = f; while (f <= operations + OP_function_last && !compare (name, f->name, !(f->flags & OPF_NO_ABBREV))) f++; *last = f; return true; } return false; } static bool lookup_function (const char *name, const struct operation **first, const struct operation **last) { *first = *last = NULL; return (lookup_function_helper (name, compare_strings, first, last) || lookup_function_helper (name, compare_names, first, last)); } static int extract_min_valid (const char *s) { char *p = strrchr (s, '.'); if (p == NULL || p[1] < '0' || p[1] > '9' || strspn (p + 1, "0123456789") != strlen (p + 1)) return -1; *p = '\0'; return atoi (p + 1); } static atom_type function_arg_type (const struct operation *f, size_t arg_idx) { assert (arg_idx < f->arg_cnt || (f->flags & OPF_ARRAY_OPERAND)); return f->args[arg_idx < f->arg_cnt ? arg_idx : f->arg_cnt - 1]; } static bool match_function (union any_node **args, int arg_cnt, const struct operation *f) { size_t i; if (arg_cnt < f->arg_cnt || (arg_cnt > f->arg_cnt && (f->flags & OPF_ARRAY_OPERAND) == 0) || arg_cnt - (f->arg_cnt - 1) < f->array_min_elems) return false; for (i = 0; i < arg_cnt; i++) if (!is_coercible (function_arg_type (f, i), &args[i])) return false; return true; } static void coerce_function_args (struct expression *e, const struct operation *f, union any_node **args, size_t arg_cnt) { int i; for (i = 0; i < arg_cnt; i++) type_coercion_assert (e, function_arg_type (f, i), &args[i]); } static bool validate_function_args (const struct operation *f, int arg_cnt, int min_valid) { int array_arg_cnt = arg_cnt - (f->arg_cnt - 1); if (array_arg_cnt < f->array_min_elems) { msg (SE, _("%s must have at least %d arguments in list."), f->prototype, f->array_min_elems); return false; } if ((f->flags & OPF_ARRAY_OPERAND) && array_arg_cnt % f->array_granularity != 0) { if (f->array_granularity == 2) msg (SE, _("%s must have an even number of arguments in list."), f->prototype); else msg (SE, _("%s must have multiple of %d arguments in list."), f->prototype, f->array_granularity); return false; } if (min_valid != -1) { if (f->array_min_elems == 0) { assert ((f->flags & OPF_MIN_VALID) == 0); msg (SE, _("%s function does not accept a minimum valid " "argument count."), f->prototype); return false; } else { assert (f->flags & OPF_MIN_VALID); if (array_arg_cnt < f->array_min_elems) { msg (SE, _("%s requires at least %d valid arguments in list."), f->prototype, f->array_min_elems); return false; } else if (min_valid > array_arg_cnt) { msg (SE, _("With %s, " "using minimum valid argument count of %d " "does not make sense when passing only %d " "arguments in list."), f->prototype, min_valid, array_arg_cnt); return false; } } } return true; } static void add_arg (union any_node ***args, int *arg_cnt, int *arg_cap, union any_node *arg) { if (*arg_cnt >= *arg_cap) { *arg_cap += 8; *args = xrealloc (*args, sizeof **args * *arg_cap); } (*args)[(*arg_cnt)++] = arg; } static void put_invocation (struct string *s, const char *func_name, union any_node **args, size_t arg_cnt) { size_t i; ds_put_format (s, "%s(", func_name); for (i = 0; i < arg_cnt; i++) { if (i > 0) ds_put_cstr (s, ", "); ds_put_cstr (s, operations[expr_node_returns (args[i])].prototype); } ds_put_byte (s, ')'); } static void no_match (const char *func_name, union any_node **args, size_t arg_cnt, const struct operation *first, const struct operation *last) { struct string s; const struct operation *f; ds_init_empty (&s); if (last - first == 1) { ds_put_format (&s, _("Type mismatch invoking %s as "), first->prototype); put_invocation (&s, func_name, args, arg_cnt); } else { ds_put_cstr (&s, _("Function invocation ")); put_invocation (&s, func_name, args, arg_cnt); ds_put_cstr (&s, _(" does not match any known function. Candidates are:")); for (f = first; f < last; f++) ds_put_format (&s, "\n%s", f->prototype); } ds_put_byte (&s, '.'); msg (SE, "%s", ds_cstr (&s)); ds_destroy (&s); } static union any_node * parse_function (struct lexer *lexer, struct expression *e) { int min_valid; const struct operation *f, *first, *last; union any_node **args = NULL; int arg_cnt = 0; int arg_cap = 0; struct string func_name; union any_node *n; ds_init_substring (&func_name, lex_tokss (lexer)); min_valid = extract_min_valid (lex_tokcstr (lexer)); if (!lookup_function (lex_tokcstr (lexer), &first, &last)) { msg (SE, _("No function or vector named %s."), lex_tokcstr (lexer)); ds_destroy (&func_name); return NULL; } lex_get (lexer); if (!lex_force_match (lexer, T_LPAREN)) { ds_destroy (&func_name); return NULL; } args = NULL; arg_cnt = arg_cap = 0; if (lex_token (lexer) != T_RPAREN) for (;;) { if (lex_token (lexer) == T_ID && lex_next_token (lexer, 1) == T_TO) { const struct variable **vars; size_t var_cnt; size_t i; if (!parse_variables_const (lexer, dataset_dict (e->ds), &vars, &var_cnt, PV_SINGLE)) goto fail; for (i = 0; i < var_cnt; i++) add_arg (&args, &arg_cnt, &arg_cap, allocate_unary_variable (e, vars[i])); free (vars); } else { union any_node *arg = parse_or (lexer, e); if (arg == NULL) goto fail; add_arg (&args, &arg_cnt, &arg_cap, arg); } if (lex_match (lexer, T_RPAREN)) break; else if (!lex_match (lexer, T_COMMA)) { lex_error_expecting (lexer, "`,'", "`)'"); goto fail; } } for (f = first; f < last; f++) if (match_function (args, arg_cnt, f)) break; if (f >= last) { no_match (ds_cstr (&func_name), args, arg_cnt, first, last); goto fail; } coerce_function_args (e, f, args, arg_cnt); if (!validate_function_args (f, arg_cnt, min_valid)) goto fail; if ((f->flags & OPF_EXTENSION) && settings_get_syntax () == COMPATIBLE) msg (SW, _("%s is a PSPP extension."), f->prototype); if (f->flags & OPF_UNIMPLEMENTED) { msg (SE, _("%s is not available in this version of PSPP."), f->prototype); goto fail; } if ((f->flags & OPF_PERM_ONLY) && proc_in_temporary_transformations (e->ds)) { msg (SE, _("%s may not appear after %s."), f->prototype, "TEMPORARY"); goto fail; } n = expr_allocate_composite (e, f - operations, args, arg_cnt); n->composite.min_valid = min_valid != -1 ? min_valid : f->array_min_elems; if (n->type == OP_LAG_Vn || n->type == OP_LAG_Vs) dataset_need_lag (e->ds, 1); else if (n->type == OP_LAG_Vnn || n->type == OP_LAG_Vsn) { int n_before; assert (n->composite.arg_cnt == 2); assert (n->composite.args[1]->type == OP_pos_int); n_before = n->composite.args[1]->integer.i; dataset_need_lag (e->ds, n_before); } free (args); ds_destroy (&func_name); return n; fail: free (args); ds_destroy (&func_name); return NULL; } /* Utility functions. */ static struct expression * expr_create (struct dataset *ds) { struct pool *pool = pool_create (); struct expression *e = pool_alloc (pool, sizeof *e); e->expr_pool = pool; e->ds = ds; e->eval_pool = pool_create_subpool (e->expr_pool); e->ops = NULL; e->op_types = NULL; e->op_cnt = e->op_cap = 0; return e; } atom_type expr_node_returns (const union any_node *n) { assert (n != NULL); assert (is_operation (n->type)); if (is_atom (n->type)) return n->type; else if (is_composite (n->type)) return operations[n->type].returns; else NOT_REACHED (); } static const char * atom_type_name (atom_type type) { assert (is_atom (type)); return operations[type].name; } union any_node * expr_allocate_nullary (struct expression *e, operation_type op) { return expr_allocate_composite (e, op, NULL, 0); } union any_node * expr_allocate_unary (struct expression *e, operation_type op, union any_node *arg0) { return expr_allocate_composite (e, op, &arg0, 1); } union any_node * expr_allocate_binary (struct expression *e, operation_type op, union any_node *arg0, union any_node *arg1) { union any_node *args[2]; args[0] = arg0; args[1] = arg1; return expr_allocate_composite (e, op, args, 2); } static bool is_valid_node (union any_node *n) { const struct operation *op; size_t i; assert (n != NULL); assert (is_operation (n->type)); op = &operations[n->type]; if (!is_atom (n->type)) { struct composite_node *c = &n->composite; assert (is_composite (n->type)); assert (c->arg_cnt >= op->arg_cnt); for (i = 0; i < op->arg_cnt; i++) assert (is_compatible (op->args[i], expr_node_returns (c->args[i]))); if (c->arg_cnt > op->arg_cnt && !is_operator (n->type)) { assert (op->flags & OPF_ARRAY_OPERAND); for (i = 0; i < c->arg_cnt; i++) assert (is_compatible (op->args[op->arg_cnt - 1], expr_node_returns (c->args[i]))); } } return true; } union any_node * expr_allocate_composite (struct expression *e, operation_type op, union any_node **args, size_t arg_cnt) { union any_node *n; size_t i; n = pool_alloc (e->expr_pool, sizeof n->composite); n->type = op; n->composite.arg_cnt = arg_cnt; n->composite.args = pool_alloc (e->expr_pool, sizeof *n->composite.args * arg_cnt); for (i = 0; i < arg_cnt; i++) { if (args[i] == NULL) return NULL; n->composite.args[i] = args[i]; } memcpy (n->composite.args, args, sizeof *n->composite.args * arg_cnt); n->composite.min_valid = 0; assert (is_valid_node (n)); return n; } union any_node * expr_allocate_number (struct expression *e, double d) { union any_node *n = pool_alloc (e->expr_pool, sizeof n->number); n->type = OP_number; n->number.n = d; return n; } union any_node * expr_allocate_boolean (struct expression *e, double b) { union any_node *n = pool_alloc (e->expr_pool, sizeof n->number); assert (b == 0.0 || b == 1.0 || b == SYSMIS); n->type = OP_boolean; n->number.n = b; return n; } union any_node * expr_allocate_integer (struct expression *e, int i) { union any_node *n = pool_alloc (e->expr_pool, sizeof n->integer); n->type = OP_integer; n->integer.i = i; return n; } union any_node * expr_allocate_pos_int (struct expression *e, int i) { union any_node *n = pool_alloc (e->expr_pool, sizeof n->integer); assert (i > 0); n->type = OP_pos_int; n->integer.i = i; return n; } union any_node * expr_allocate_vector (struct expression *e, const struct vector *vector) { union any_node *n = pool_alloc (e->expr_pool, sizeof n->vector); n->type = OP_vector; n->vector.v = vector; return n; } union any_node * expr_allocate_string (struct expression *e, struct substring s) { union any_node *n = pool_alloc (e->expr_pool, sizeof n->string); n->type = OP_string; n->string.s = s; return n; } union any_node * expr_allocate_variable (struct expression *e, const struct variable *v) { union any_node *n = pool_alloc (e->expr_pool, sizeof n->variable); n->type = var_is_numeric (v) ? OP_num_var : OP_str_var; n->variable.v = v; return n; } union any_node * expr_allocate_format (struct expression *e, const struct fmt_spec *format) { union any_node *n = pool_alloc (e->expr_pool, sizeof n->format); n->type = OP_format; n->format.f = *format; return n; } /* Allocates a unary composite node that represents the value of variable V in expression E. */ static union any_node * allocate_unary_variable (struct expression *e, const struct variable *v) { assert (v != NULL); return expr_allocate_unary (e, var_is_numeric (v) ? OP_NUM_VAR : OP_STR_VAR, expr_allocate_variable (e, v)); } /* Export function details to other modules. */ /* Returns the operation structure for the function with the given IDX. */ const struct operation * expr_get_function (size_t idx) { assert (idx < OP_function_cnt); return &operations[OP_function_first + idx]; } /* Returns the number of expression functions. */ size_t expr_get_function_cnt (void) { return OP_function_cnt; } /* Returns the name of operation OP. */ const char * expr_operation_get_name (const struct operation *op) { return op->name; } /* Returns the human-readable prototype for operation OP. */ const char * expr_operation_get_prototype (const struct operation *op) { return op->prototype; } /* Returns the number of arguments for operation OP. */ int expr_operation_get_arg_cnt (const struct operation *op) { return op->arg_cnt; } pspp-1.4.1/src/language/expressions/helpers.h0000644000175000017500000000733713571051220020670 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2017 Free Software Foundation, Inc. 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 3 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, see . */ #ifndef EXPRESSIONS_HELPERS_H #define EXPRESSIONS_HELPERS_H #include #include #include #include #include #include #include #include #include "data/calendar.h" #include "data/case.h" #include "data/data-in.h" #include "data/data-out.h" #include "data/dataset.h" #include "data/dictionary.h" #include "data/settings.h" #include "data/value.h" #include "data/variable.h" #include "data/vector.h" #include "language/expressions/public.h" #include "libpspp/compiler.h" #include "libpspp/i18n.h" #include "libpspp/message.h" #include "libpspp/misc.h" #include "libpspp/str.h" #include "math/moments.h" #include "math/random.h" #include "gettext.h" #define _(msgid) gettext (msgid) static inline double check_errno (double x) { return errno == 0 ? x : SYSMIS; } #define check_errno(EXPRESSION) (errno = 0, check_errno (EXPRESSION)) #define DAY_S (60. * 60. * 24.) /* Seconds per day. */ #define DAY_H 24. /* Hours per day. */ #define H_S (60 * 60.) /* Seconds per hour. */ #define H_MIN 60. /* Minutes per hour. */ #define MIN_S 60. /* Seconds per minute. */ #define WEEK_DAY 7. /* Days per week. */ #define WEEK_S (WEEK_DAY * DAY_S) /* Seconds per week. */ extern const struct substring empty_string; int compare_string_3way (const struct substring *, const struct substring *); double expr_ymd_to_date (double year, double month, double day); double expr_ymd_to_ofs (double year, double month, double day); double expr_wkyr_to_date (double wk, double yr); double expr_yrday_to_date (double yr, double day); double expr_yrmoda (double year, double month, double day); double expr_date_difference (double date1, double date2, struct substring unit); double expr_date_sum (double date, double quantity, struct substring unit_name, struct substring method_name); struct substring alloc_string (struct expression *, size_t length); struct substring copy_string (struct expression *, const char *, size_t length); static inline bool is_valid (double d) { return isfinite (d) && d != SYSMIS; } size_t count_valid (double *, size_t); double idf_beta (double P, double a, double b); double ncdf_beta (double x, double a, double b, double lambda); double npdf_beta (double x, double a, double b, double lambda); double cdf_bvnor (double x0, double x1, double r); double idf_fdist (double P, double a, double b); double round_nearest (double x, double mult, double fuzzbits); double round_zero (double x, double mult, double fuzzbits); struct substring replace_string (struct expression *, struct substring haystack, struct substring needle, struct substring replacement, double n); double median (double *, size_t n); #endif /* expressions/helpers.h */ pspp-1.4.1/src/language/expressions/private.h0000644000175000017500000001444713320146056020704 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 1997-9, 2000, 2011 Free Software Foundation, Inc. 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 3 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, see . */ #ifndef EXPRESSIONS_PRIVATE_H #define EXPRESSIONS_PRIVATE_H #include #include #include "data/format.h" #include "operations.h" #include "public.h" #include "libpspp/str.h" enum operation_flags { /* Most operations produce a missing output value if any input value is missing. Setting this bit indicates that this operation may produce a non-missing result given missing input values (although it is not obliged to do so). Unless this bit is set, the operation's evaluation function will never be passed a missing argument. */ OPF_ABSORB_MISS = 004, /* If set, this operation's final operand is an array of one or more elements. */ OPF_ARRAY_OPERAND = 001, /* If set, the user can specify the minimum number of array elements that must be non-missing for the function result to be non-missing. The operation must have an array operand and the array must contain `double's. Both OPF_ABSORB_MISS and OPF_ARRAY_OPERAND must also be set. */ OPF_MIN_VALID = 002, /* If set, operation is non-optimizable in general. Unless combined with OPF_ABSORB_MISS, missing input values are still assumed to yield missing results. */ OPF_NONOPTIMIZABLE = 010, /* If set, this operation is not implemented. */ OPF_UNIMPLEMENTED = 020, /* If set, this operation is a PSPP extension. */ OPF_EXTENSION = 040, /* If set, this operation may not occur after TEMPORARY. (Currently this applies only to LAG.) */ OPF_PERM_ONLY = 0100, /* If set, this operation's name may not be abbreviated. */ OPF_NO_ABBREV = 0200 }; #define EXPR_ARG_MAX 4 struct operation { const char *name; const char *prototype; enum operation_flags flags; atom_type returns; int arg_cnt; atom_type args[EXPR_ARG_MAX]; int array_min_elems; int array_granularity; }; extern const struct operation operations[]; /* Tree structured expressions. */ /* Atoms. */ struct number_node { operation_type type; /* OP_number. */ double n; }; struct string_node { operation_type type; /* OP_string. */ struct substring s; }; struct variable_node { operation_type type; /* OP_variable. */ const struct variable *v; }; struct integer_node { operation_type type; /* OP_integer. */ int i; }; struct vector_node { operation_type type; /* OP_vector. */ const struct vector *v; }; struct format_node { operation_type type; /* OP_format. */ struct fmt_spec f; }; /* Any composite node. */ struct composite_node { operation_type type; /* One of OP_*. */ size_t arg_cnt; /* Number of arguments. */ union any_node **args; /* Arguments. */ size_t min_valid; /* Min valid array args to get valid result. */ }; /* Any node. */ union any_node { operation_type type; struct number_node number; struct string_node string; struct variable_node variable; struct integer_node integer; struct vector_node vector; struct format_node format; struct composite_node composite; }; union operation_data { operation_type operation; double number; struct substring string; const struct variable *variable; const struct vector *vector; struct fmt_spec *format; int integer; }; /* An expression. */ struct expression { struct pool *expr_pool; /* Pool for expression static data. */ struct dataset *ds ; /* The dataset */ atom_type type; /* Type of expression result. */ union operation_data *ops; /* Expression data. */ operation_type *op_types; /* ops[] element types (for debugging). */ size_t op_cnt, op_cap; /* Number of ops, amount of allocated space. */ double *number_stack; /* Evaluation stack: numerics, Booleans. */ struct substring *string_stack; /* Evaluation stack: strings. */ struct pool *eval_pool; /* Pool for evaluation temporaries. */ }; struct expression *expr_parse_any (struct lexer *lexer, struct dataset *, bool optimize); void expr_debug_print_postfix (const struct expression *); union any_node *expr_optimize (union any_node *, struct expression *); void expr_flatten (union any_node *, struct expression *); atom_type expr_node_returns (const union any_node *); union any_node *expr_allocate_nullary (struct expression *e, operation_type); union any_node *expr_allocate_unary (struct expression *e, operation_type, union any_node *); union any_node *expr_allocate_binary (struct expression *e, operation_type, union any_node *, union any_node *); union any_node *expr_allocate_composite (struct expression *e, operation_type, union any_node **, size_t); union any_node *expr_allocate_number (struct expression *e, double); union any_node *expr_allocate_boolean (struct expression *e, double); union any_node *expr_allocate_integer (struct expression *e, int); union any_node *expr_allocate_pos_int (struct expression *e, int); union any_node *expr_allocate_string (struct expression *e, struct substring); union any_node *expr_allocate_variable (struct expression *e, const struct variable *); union any_node *expr_allocate_format (struct expression *e, const struct fmt_spec *); union any_node *expr_allocate_vector (struct expression *e, const struct vector *); #endif /* expressions/private.h */ pspp-1.4.1/src/language/expressions/generate.pl0000644000175000017500000006513713571051220021206 0ustar00blpblp00000000000000# PSPP - a program for statistical analysis. # Copyright (C) 2017 Free Software Foundation, Inc. # # 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 3 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, see . # use strict; use warnings 'all'; use Getopt::Long; # Parse command line. our ($input_file); our ($output_file); parse_cmd_line (); # Initialize type system. our (%type, @types); init_all_types (); # Parse input file. our (%ops); our (@funcs, @opers, @order); parse_input (); # Produce output. print_header (); if ($output_file =~ /evaluate\.h$/) { generate_evaluate_h (); } elsif ($output_file =~ /evaluate\.inc$/) { generate_evaluate_inc (); } elsif ($output_file =~ /operations\.h$/) { generate_operations_h (); } elsif ($output_file =~ /optimize\.inc$/) { generate_optimize_inc (); } elsif ($output_file =~ /parse\.inc$/) { generate_parse_inc (); } else { die "$output_file: unknown output type\n"; } print_trailer (); # Command line. # Parses the command line. # # Initializes $input_file, $output_file. sub parse_cmd_line { GetOptions ("i|input=s" => \$input_file, "o|output=s" => \$output_file, "h|help" => sub { usage (); }) or exit 1; $input_file = "operations.def" if !defined $input_file; die "$0: output file must be specified\n" if !defined $output_file; open (INPUT, "<$input_file") or die "$input_file: open: $!\n"; open (OUTPUT, ">$output_file") or die "$output_file: create: $!\n"; select (OUTPUT); } sub usage { print < 'double', ATOM => 'number', MANGLE => 'n', HUMAN_NAME => 'number', STACK => 'ns', MISSING_VALUE => 'SYSMIS'); init_type ('string', 'any', C_TYPE => 'struct substring', ATOM => 'string', MANGLE => 's', HUMAN_NAME => 'string', STACK => 'ss', MISSING_VALUE => 'empty_string'); init_type ('boolean', 'any', C_TYPE => 'double', ATOM => 'number', MANGLE => 'n', HUMAN_NAME => 'boolean', STACK => 'ns', MISSING_VALUE => 'SYSMIS'); # Format types. init_type ('format', 'atom'); init_type ('ni_format', 'leaf', C_TYPE => 'const struct fmt_spec *', ATOM => 'format', MANGLE => 'f', HUMAN_NAME => 'num_input_format'); init_type ('no_format', 'leaf', C_TYPE => 'const struct fmt_spec *', ATOM => 'format', MANGLE => 'f', HUMAN_NAME => 'num_output_format'); # Integer types. init_type ('integer', 'leaf', C_TYPE => 'int', ATOM => 'integer', MANGLE => 'n', HUMAN_NAME => 'integer'); init_type ('pos_int', 'leaf', C_TYPE => 'int', ATOM => 'integer', MANGLE => 'n', HUMAN_NAME => 'positive_integer_constant'); # Variable names. init_type ('variable', 'atom'); init_type ('num_var', 'leaf', C_TYPE => 'const struct variable *', ATOM => 'variable', MANGLE => 'Vn', HUMAN_NAME => 'num_variable'); init_type ('str_var', 'leaf', C_TYPE => 'const struct variable *', ATOM => 'variable', MANGLE => 'Vs', HUMAN_NAME => 'string_variable'); init_type ('var', 'leaf', C_TYPE => 'const struct variable *', ATOM => 'variable', MANGLE => 'V', HUMAN_NAME => 'variable'); # Vectors. init_type ('vector', 'leaf', C_TYPE => 'const struct vector *', ATOM => 'vector', MANGLE => 'v', HUMAN_NAME => 'vector'); # Fixed types. init_type ('expression', 'fixed', C_TYPE => 'struct expression *', FIXED_VALUE => 'e'); init_type ('case', 'fixed', C_TYPE => 'const struct ccase *', FIXED_VALUE => 'c'); init_type ('case_idx', 'fixed', C_TYPE => 'size_t', FIXED_VALUE => 'case_idx'); init_type ('dataset', 'fixed', C_TYPE => 'struct dataset *', FIXED_VALUE => 'ds'); # One of these is emitted at the end of each expression as a sentinel # that tells expr_evaluate() to return the value on the stack. init_type ('return_number', 'atom'); init_type ('return_string', 'atom'); # Used only for debugging purposes. init_type ('operation', 'atom'); } # init_type has 2 required arguments: # # NAME: Type name. # # `$name' is the type's name in operations.def. # # `OP_$name' is the terminal's type in operations.h. # # `expr_allocate_$name()' allocates a node of the given type. # # ROLE: How the type may be used: # # "any": Usable as operands and function arguments, and # function and operator results. # # "leaf": Usable as operands and function arguments, but # not function arguments or results. (Thus, they appear # only in leaf nodes in the parse type.) # # "fixed": Not allowed either as an operand or argument # type or a result type. Used only as auxiliary data. # # "atom": Not allowed anywhere; just adds the name to # the list of atoms. # # All types except those with "atom" as their role also require: # # C_TYPE: The C type that represents this abstract type. # # Types with "any" or "leaf" role require: # # ATOM: # # `$atom' is the `struct operation_data' member name. # # get_$atom_name() obtains the corresponding data from a # node. # # MANGLE: Short string for name mangling. Use identical strings # if two types should not be overloaded. # # HUMAN_NAME: Name for a type when we describe it to the user. # # Types with role "any" require: # # STACK: Name of the local variable in expr_evaluate(), used for # maintaining the stack for this type. # # MISSING_VALUE: Expression used for the missing value of this # type. # # Types with role "fixed" require: # # FIXED_VALUE: Expression used for the value of this type. sub init_type { my ($name, $role, %rest) = @_; my ($type) = $type{"\U$name"} = {NAME => $name, ROLE => $role, %rest}; my (@need_keys) = qw (NAME ROLE); if ($role eq 'any') { push (@need_keys, qw (C_TYPE ATOM MANGLE HUMAN_NAME STACK MISSING_VALUE)); } elsif ($role eq 'leaf') { push (@need_keys, qw (C_TYPE ATOM MANGLE HUMAN_NAME)); } elsif ($role eq 'fixed') { push (@need_keys, qw (C_TYPE FIXED_VALUE)); } elsif ($role eq 'atom') { } else { die "no role `$role'"; } my (%have_keys); $have_keys{$_} = 1 foreach keys %$type; for my $key (@need_keys) { defined $type->{$key} or die "$name lacks $key"; delete $have_keys{$key}; } scalar (keys (%have_keys)) == 0 or die "$name has superfluous key(s) " . join (', ', keys (%have_keys)); push (@types, $type); } # c_type(type). # # Returns the C type of the given type as a string designed to be # prepended to a variable name to produce a declaration. (That won't # work in general but it works well enough for our types.) sub c_type { my ($type) = @_; my ($c_type) = $type->{C_TYPE}; defined $c_type or die; # Append a space unless (typically) $c_type ends in `*'. $c_type .= ' ' if $c_type =~ /\w$/; return $c_type; } # Input parsing. # Parses the entire input. # # Initializes %ops, @funcs, @opers. sub parse_input { get_line (); get_token (); while ($toktype ne 'eof') { my (%op); $op{OPTIMIZABLE} = 1; $op{UNIMPLEMENTED} = 0; $op{EXTENSION} = 0; $op{PERM_ONLY} = 0; for (;;) { if (match ('extension')) { $op{EXTENSION} = 1; } elsif (match ('no_opt')) { $op{OPTIMIZABLE} = 0; } elsif (match ('absorb_miss')) { $op{ABSORB_MISS} = 1; } elsif (match ('perm_only')) { $op{PERM_ONLY} = 1; } elsif (match ('no_abbrev')) { $op{NO_ABBREV} = 1; } else { last; } } $op{RETURNS} = parse_type () || $type{NUMBER}; die "$op{RETURNS} is not a valid return type" if !any ($op{RETURNS}, @type{qw (NUMBER STRING BOOLEAN)}); $op{CATEGORY} = $token; if (!any ($op{CATEGORY}, qw (operator function))) { die "`operator' or `function' expected at `$token'"; } get_token (); my ($name) = force ("id"); die "function name may not contain underscore" if $op{CATEGORY} eq 'function' && $name =~ /_/; die "operator name may not contain period" if $op{CATEGORY} eq 'operator' && $name =~ /\./; if (my ($prefix, $suffix) = $name =~ /^(.*)\.(\d+)$/) { $name = $prefix; $op{MIN_VALID} = $suffix; $op{ABSORB_MISS} = 1; } $op{NAME} = $name; force_match ('('); @{$op{ARGS}} = (); while (!match (')')) { my ($arg) = parse_arg (); push (@{$op{ARGS}}, $arg); if (defined ($arg->{IDX})) { last if match (')'); die "array must be last argument"; } if (!match (',')) { force_match (')'); last; } } for my $arg (@{$op{ARGS}}) { next if !defined $arg->{CONDITION}; my ($any_arg) = join ('|', map ($_->{NAME}, @{$op{ARGS}})); $arg->{CONDITION} =~ s/\b($any_arg)\b/arg_$1/g; } my ($opname) = "OP_$op{NAME}"; $opname =~ tr/./_/; if ($op{CATEGORY} eq 'function') { my ($mangle) = join ('', map ($_->{TYPE}{MANGLE}, @{$op{ARGS}})); $op{MANGLE} = $mangle; $opname .= "_$mangle"; } $op{OPNAME} = $opname; if ($op{MIN_VALID}) { my ($array_arg) = array_arg (\%op); die "can't have minimum valid count without array arg" if !defined $array_arg; die "minimum valid count allowed only with double array" if $array_arg->{TYPE} ne $type{NUMBER}; die "can't have minimum valid count if array has multiplication factor" if $array_arg->{TIMES} != 1; } while ($toktype eq 'id') { my ($type) = parse_type () or die "parse error"; die "`$type->{NAME}' is not allowed as auxiliary data" unless $type->{ROLE} eq 'leaf' || $type->{ROLE} eq 'fixed'; my ($name) = force ("id"); push (@{$op{AUX}}, {TYPE => $type, NAME => $name}); force_match (';'); } if ($op{OPTIMIZABLE}) { die "random variate functions must be marked `no_opt'" if $op{NAME} =~ /^RV\./; for my $aux (@{$op{AUX}}) { if (any ($aux->{TYPE}, @type{qw (CASE CASE_IDX)})) { die "operators with $aux->{TYPE} aux data must be " . "marked `no_opt'"; } } } if ($op{RETURNS} eq $type{STRING} && !defined ($op{ABSORB_MISS})) { my (@args); for my $arg (@{$op{ARGS}}) { if (any ($arg->{TYPE}, @type{qw (NUMBER BOOLEAN)})) { die "$op{NAME} returns string and has double or bool " . "argument, but is not marked ABSORB_MISS"; } if (defined $arg->{CONDITION}) { die "$op{NAME} returns string but has argument with condition"; } } } if ($toktype eq 'block') { $op{BLOCK} = force ('block'); } elsif ($toktype eq 'expression') { if ($token eq 'unimplemented') { $op{UNIMPLEMENTED} = 1; } else { $op{EXPRESSION} = $token; } get_token (); } else { die "block or expression expected"; } die "duplicate operation name $opname" if defined $ops{$opname}; $ops{$opname} = \%op; if ($op{CATEGORY} eq 'function') { push (@funcs, $opname); } else { push (@opers, $opname); } } close(INPUT); @funcs = sort {$ops{$a}->{NAME} cmp $ops{$b}->{NAME} || $ops{$a}->{OPNAME} cmp $ops{$b}->{OPNAME}} @funcs; @opers = sort {$ops{$a}->{NAME} cmp $ops{$b}->{NAME}} @opers; @order = (@funcs, @opers); } # Reads the next token into $token, $toktype. sub get_token { our ($line); lookahead (); return if defined ($toktype) && $toktype eq 'eof'; $toktype = 'id', $token = $1, return if $line =~ /\G([a-zA-Z_][a-zA-Z_.0-9]*)/gc; $toktype = 'int', $token = $1, return if $line =~ /\G([0-9]+)/gc; $toktype = 'punct', $token = $1, return if $line =~ /\G([][(),*;.])/gc; if ($line =~ /\G=/gc) { $toktype = "expression"; $line =~ /\G\s+/gc; $token = accumulate_balanced (';'); } elsif ($line =~ /\G\{/gc) { $toktype = "block"; $token = accumulate_balanced ('}'); $token =~ s/^\n+//; } else { die "bad character `" . substr ($line, pos $line, 1) . "' in input"; } } # Skip whitespace, then return the remainder of the line. sub lookahead { our ($line); die "unexpected end of file" if !defined ($line); for (;;) { $line =~ /\G\s+/gc; last if pos ($line) < length ($line); get_line (); $token = $toktype = 'eof', return if !defined ($line); } return substr ($line, pos ($line)); } # accumulate_balanced($chars) # # Accumulates input until a character in $chars is encountered, except # that balanced pairs of (), [], or {} cause $chars to be ignored. # # Returns the input read. sub accumulate_balanced { my ($end) = @_; my ($s) = ""; my ($nest) = 0; our ($line); for (;;) { my ($start) = pos ($line); if ($line =~ /\G([^][(){};,]*)([][(){};,])/gc) { $s .= substr ($line, $start, pos ($line) - $start - 1) if pos ($line) > $start; my ($last) = substr ($line, pos ($line) - 1, 1); if ($last =~ /[[({]/) { $nest++; $s .= $last; } elsif ($last =~ /[])}]/) { if ($nest > 0) { $nest--; $s .= $last; } elsif (index ($end, $last) >= 0) { return $s; } else { die "unbalanced parentheses"; } } elsif (index ($end, $last) >= 0) { return $s if !$nest; $s .= $last; } else { $s .= $last; } } else { $s .= substr ($line, pos ($line)) . "\n"; get_line (); } } } # Reads the next line from INPUT into $line. sub get_line { our ($line); $line = ; if (defined ($line)) { chomp $line; $line =~ s%//.*%%; pos ($line) = 0; } } # If the current token is an identifier that names a type, # returns the type and skips to the next token. # Otherwise, returns undef. sub parse_type { if ($toktype eq 'id') { foreach my $type (values (%type)) { get_token (), return $type if defined ($type->{NAME}) && $type->{NAME} eq $token; } } return; } # force($type). # # Makes sure that $toktype equals $type, reads the next token, and # returns the previous $token. sub force { my ($type) = @_; die "parse error at `$token' expecting $type" if $type ne $toktype; my ($tok) = $token; get_token (); return $tok; } # force($tok). # # If $token equals $tok, reads the next token and returns true. # Otherwise, returns false. sub match { my ($tok) = @_; if ($token eq $tok) { get_token (); return 1; } else { return 0; } } # force_match($tok). # # If $token equals $tok, reads the next token. # Otherwise, flags an error in the input. sub force_match { my ($tok) = @_; die "parse error at `$token' expecting `$tok'" if !match ($tok); } # Parses and returns a function argument. sub parse_arg { my (%arg); $arg{TYPE} = parse_type () || $type{NUMBER}; die "argument name expected at `$token'" if $toktype ne 'id'; $arg{NAME} = $token; if (lookahead () =~ /^[[,)]/) { get_token (); if (match ('[')) { die "only double and string arrays supported" if !any ($arg{TYPE}, @type{qw (NUMBER STRING)}); $arg{IDX} = force ('id'); if (match ('*')) { $arg{TIMES} = force ('int'); die "multiplication factor must be positive" if $arg{TIMES} < 1; } else { $arg{TIMES} = 1; } force_match (']'); } } else { $arg{CONDITION} = $arg{NAME} . ' ' . accumulate_balanced (',)'); our ($line); pos ($line) -= 1; get_token (); } return \%arg; } # Output. # Prints the output file header. sub print_header { print <{UNIMPLEMENTED}; my (@args); for my $arg (@{$op->{ARGS}}) { if (!defined $arg->{IDX}) { push (@args, c_type ($arg->{TYPE}) . $arg->{NAME}); } else { push (@args, c_type ($arg->{TYPE}) . "$arg->{NAME}" . "[]"); push (@args, "size_t $arg->{IDX}"); } } for my $aux (@{$op->{AUX}}) { push (@args, c_type ($aux->{TYPE}) . $aux->{NAME}); } push (@args, "void") if !@args; my ($statements) = $op->{BLOCK} || " return $op->{EXPRESSION};\n"; print "static inline ", c_type ($op->{RETURNS}), "\n"; print "eval_$opname (", join (', ', @args), ")\n"; print "{\n"; print "$statements"; print "}\n\n"; } } sub generate_evaluate_inc { for my $opname (@order) { my ($op) = $ops{$opname}; if ($op->{UNIMPLEMENTED}) { print "case $opname:\n"; print " NOT_REACHED ();\n\n"; next; } my (@decls); my (@args); for my $arg (@{$op->{ARGS}}) { my ($name) = $arg->{NAME}; my ($type) = $arg->{TYPE}; my ($c_type) = c_type ($type); my ($idx) = $arg->{IDX}; push (@args, "arg_$arg->{NAME}"); if (!defined ($idx)) { my ($decl) = "${c_type}arg_$name"; if ($type->{ROLE} eq 'any') { unshift (@decls, "$decl = *--$type->{STACK}"); } elsif ($type->{ROLE} eq 'leaf') { push (@decls, "$decl = op++->$type->{ATOM}"); } else { die; } } else { my ($stack) = $type->{STACK}; defined $stack or die; unshift (@decls, "$c_type*arg_$arg->{NAME} = $stack -= arg_$idx"); unshift (@decls, "size_t arg_$arg->{IDX} = op++->integer"); my ($idx) = "arg_$idx"; if ($arg->{TIMES} != 1) { $idx .= " / $arg->{TIMES}"; } push (@args, $idx); } } for my $aux (@{$op->{AUX}}) { my ($type) = $aux->{TYPE}; my ($name) = $aux->{NAME}; if ($type->{ROLE} eq 'leaf') { my ($c_type) = c_type ($type); push (@decls, "${c_type}aux_$name = op++->$type->{ATOM}"); push (@args, "aux_$name"); } elsif ($type->{ROLE} eq 'fixed') { push (@args, $type->{FIXED_VALUE}); } } my ($sysmis_cond) = make_sysmis_decl ($op, "op++->integer"); push (@decls, $sysmis_cond) if defined $sysmis_cond; my ($result) = "eval_$op->{OPNAME} (" . join (', ', @args) . ")"; my ($stack) = $op->{RETURNS}{STACK}; print "case $opname:\n"; if (@decls) { print " {\n"; print " $_;\n" foreach @decls; if (defined $sysmis_cond) { my ($miss_ret) = $op->{RETURNS}{MISSING_VALUE}; print " *$stack++ = force_sysmis ? $miss_ret : $result;\n"; } else { print " *$stack++ = $result;\n"; } print " }\n"; } else { print " *$stack++ = $result;\n"; } print " break;\n\n"; } } sub generate_operations_h { print "#include \n"; print "#include \n\n"; print "typedef enum"; print " {\n"; my (@atoms); foreach my $type (@types) { next if $type->{ROLE} eq 'fixed'; push (@atoms, "OP_$type->{NAME}"); } print_operations ('atom', 1, \@atoms); print_operations ('function', "OP_atom_last + 1", \@funcs); print_operations ('operator', "OP_function_last + 1", \@opers); print_range ("OP_composite", "OP_function_first", "OP_operator_last"); print ",\n\n"; print_range ("OP", "OP_atom_first", "OP_composite_last"); print "\n }\n"; print "operation_type, atom_type;\n"; print_predicate ('is_operation', 'OP'); print_predicate ("is_$_", "OP_$_") foreach qw (atom composite function operator); } sub print_operations { my ($type, $first, $names) = @_; print " /* \u$type types. */\n"; print " $names->[0] = $first,\n"; print " $_,\n" foreach @$names[1...$#{$names}]; print_range ("OP_$type", $names->[0], $names->[$#{$names}]); print ",\n\n"; } sub print_range { my ($prefix, $first, $last) = @_; print " ${prefix}_first = $first,\n"; print " ${prefix}_last = $last,\n"; print " ${prefix}_cnt = ${prefix}_last - ${prefix}_first + 1"; } sub print_predicate { my ($function, $category) = @_; my ($assertion) = ""; print "\nstatic inline bool\n"; print "$function (operation_type op)\n"; print "{\n"; print " assert (is_operation (op));\n" if $function ne 'is_operation'; print " return op >= ${category}_first && op <= ${category}_last;\n"; print "}\n"; } sub generate_optimize_inc { for my $opname (@order) { my ($op) = $ops{$opname}; if (!$op->{OPTIMIZABLE} || $op->{UNIMPLEMENTED}) { print "case $opname:\n"; print " NOT_REACHED ();\n\n"; next; } my (@decls); my ($arg_idx) = 0; for my $arg (@{$op->{ARGS}}) { my ($decl); my ($name) = $arg->{NAME}; my ($type) = $arg->{TYPE}; my ($ctype) = c_type ($type); my ($idx) = $arg->{IDX}; if (!defined ($idx)) { my ($func) = "get_$type->{ATOM}_arg"; push (@decls, "${ctype}arg_$name = $func (node, $arg_idx)"); } else { my ($decl) = "size_t arg_$idx = node->arg_cnt"; $decl .= " - $arg_idx" if $arg_idx; push (@decls, $decl); push (@decls, "${ctype}*arg_$name = " . "get_$type->{ATOM}_args " . " (node, $arg_idx, arg_$idx, e)"); } $arg_idx++; } my ($sysmis_cond) = make_sysmis_decl ($op, "node->min_valid"); push (@decls, $sysmis_cond) if defined $sysmis_cond; my (@args); for my $arg (@{$op->{ARGS}}) { push (@args, "arg_$arg->{NAME}"); if (defined $arg->{IDX}) { my ($idx) = "arg_$arg->{IDX}"; $idx .= " / $arg->{TIMES}" if $arg->{TIMES} != 1; push (@args, $idx); } } for my $aux (@{$op->{AUX}}) { my ($type) = $aux->{TYPE}; if ($type->{ROLE} eq 'leaf') { my ($func) = "get_$type->{ATOM}_arg"; push (@args, "$func (node, $arg_idx)"); $arg_idx++; } elsif ($type->{ROLE} eq 'fixed') { push (@args, $type->{FIXED_VALUE}); } else { die; } } my ($result) = "eval_$op->{OPNAME} (" . join (', ', @args) . ")"; if (@decls && defined ($sysmis_cond)) { my ($miss_ret) = $op->{RETURNS}{MISSING_VALUE}; push (@decls, c_type ($op->{RETURNS}) . "result = " . "force_sysmis ? $miss_ret : $result"); $result = "result"; } print "case $opname:\n"; my ($alloc_func) = "expr_allocate_$op->{RETURNS}{NAME}"; if (@decls) { print " {\n"; print " $_;\n" foreach @decls; print " return $alloc_func (e, $result);\n"; print " }\n"; } else { print " return $alloc_func (e, $result);\n"; } print "\n"; } } sub generate_parse_inc { my (@members) = ("\"\"", "\"\"", 0, 0, 0, "{}", 0, 0); print "{", join (', ', @members), "},\n"; for my $type (@types) { next if $type->{ROLE} eq 'fixed'; my ($human_name) = $type->{HUMAN_NAME}; $human_name = $type->{NAME} if !defined $human_name; my (@members) = ("\"$type->{NAME}\"", "\"$human_name\"", 0, "OP_$type->{NAME}", 0, "{}", 0, 0); print "{", join (', ', @members), "},\n"; } for my $opname (@order) { my ($op) = $ops{$opname}; my (@members); push (@members, "\"$op->{NAME}\""); if ($op->{CATEGORY} eq 'function') { my (@args, @opt_args); for my $arg (@{$op->{ARGS}}) { push (@args, $arg->{TYPE}{HUMAN_NAME}) if !defined $arg->{IDX}; } if (my ($array) = array_arg ($op)) { if (!defined $op->{MIN_VALID}) { my (@array_args); for (my $i = 0; $i < $array->{TIMES}; $i++) { push (@array_args, $array->{TYPE}{HUMAN_NAME}); } push (@args, @array_args); @opt_args = @array_args; } else { for (my $i = 0; $i < $op->{MIN_VALID}; $i++) { push (@args, $array->{TYPE}{HUMAN_NAME}); } push (@opt_args, $array->{TYPE}{HUMAN_NAME}); } } my ($human) = "$op->{NAME}(" . join (', ', @args); $human .= '[, ' . join (', ', @opt_args) . ']...' if @opt_args; $human .= ')'; push (@members, "\"$human\""); } else { push (@members, "NULL"); } my (@flags); push (@flags, "OPF_ABSORB_MISS") if defined $op->{ABSORB_MISS}; push (@flags, "OPF_ARRAY_OPERAND") if array_arg ($op); push (@flags, "OPF_MIN_VALID") if defined $op->{MIN_VALID}; push (@flags, "OPF_NONOPTIMIZABLE") if !$op->{OPTIMIZABLE}; push (@flags, "OPF_EXTENSION") if $op->{EXTENSION}; push (@flags, "OPF_UNIMPLEMENTED") if $op->{UNIMPLEMENTED}; push (@flags, "OPF_PERM_ONLY") if $op->{PERM_ONLY}; push (@flags, "OPF_NO_ABBREV") if $op->{NO_ABBREV}; push (@members, @flags ? join (' | ', @flags) : 0); push (@members, "OP_$op->{RETURNS}{NAME}"); push (@members, scalar (@{$op->{ARGS}})); my (@arg_types) = map ("OP_$_->{TYPE}{NAME}", @{$op->{ARGS}}); push (@members, "{" . join (', ', @arg_types) . "}"); push (@members, $op->{MIN_VALID} || 0); push (@members, array_arg ($op) ? ${array_arg ($op)}{TIMES} : 0); print "{", join (', ', @members), "},\n"; } } # Utilities. # any($target, @list) # # Returns true if $target appears in @list, # false otherwise. sub any { $_ eq $_[0] and return 1 foreach @_[1...$#_]; return 0; } # make_sysmis_decl($op, $min_valid_src) # # Returns a declaration for a boolean variable called `force_sysmis', # which will be true when operation $op should be system-missing. # Returns undef if there are no such circumstances. # # If $op has a minimum number of valid arguments, $min_valid_src # should be an an expression that evaluates to the minimum number of # valid arguments for $op. sub make_sysmis_decl { my ($op, $min_valid_src) = @_; my (@sysmis_cond); if (!$op->{ABSORB_MISS}) { for my $arg (@{$op->{ARGS}}) { my ($arg_name) = "arg_$arg->{NAME}"; if (!defined $arg->{IDX}) { if (any ($arg->{TYPE}, @type{qw (NUMBER BOOLEAN)})) { push (@sysmis_cond, "!is_valid ($arg_name)"); } } elsif ($arg->{TYPE} eq $type{NUMBER}) { my ($a) = "$arg_name"; my ($n) = "arg_$arg->{IDX}"; push (@sysmis_cond, "count_valid ($a, $n) < $n"); } } } elsif (defined $op->{MIN_VALID}) { my ($args) = $op->{ARGS}; my ($arg) = ${$args}[$#{$args}]; my ($a) = "arg_$arg->{NAME}"; my ($n) = "arg_$arg->{IDX}"; push (@sysmis_cond, "count_valid ($a, $n) < $min_valid_src"); } for my $arg (@{$op->{ARGS}}) { push (@sysmis_cond, "!($arg->{CONDITION})") if defined $arg->{CONDITION}; } return "bool force_sysmis = " . join (' || ', @sysmis_cond) if @sysmis_cond; return; } # array_arg($op) # # If $op has an array argument, return it. # Otherwise, returns undef. sub array_arg { my ($op) = @_; my ($args) = $op->{ARGS}; return if !@$args; my ($last_arg) = $args->[@$args - 1]; return $last_arg if defined $last_arg->{IDX}; return; } pspp-1.4.1/src/language/expressions/optimize.c0000644000175000017500000002403013320146056021052 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 1997-9, 2000, 2011 Free Software Foundation, Inc. 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 3 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, see . */ #include #include "language/expressions/private.h" #include #include #include #include #include "data/calendar.h" #include "data/data-in.h" #include "data/variable.h" #include "evaluate.h" #include "language/expressions/helpers.h" #include "language/expressions/public.h" #include "libpspp/assertion.h" #include "libpspp/message.h" #include "libpspp/misc.h" #include "libpspp/pool.h" #include "libpspp/str.h" #include "gl/xalloc.h" static union any_node *evaluate_tree (struct composite_node *, struct expression *); static union any_node *optimize_tree (union any_node *, struct expression *); union any_node * expr_optimize (union any_node *node, struct expression *e) { int nonconst_cnt = 0; /* Number of nonconstant children. */ int sysmis_cnt = 0; /* Number of system-missing children. */ const struct operation *op; struct composite_node *c; int i; /* We can't optimize an atom. */ if (is_atom (node->type)) return node; /* Start by optimizing all the children. */ c = &node->composite; for (i = 0; i < c->arg_cnt; i++) { c->args[i] = expr_optimize (c->args[i], e); if (c->args[i]->type == OP_number) { if (c->args[i]->number.n == SYSMIS) sysmis_cnt++; } if (!is_atom (c->args[i]->type)) nonconst_cnt++; } op = &operations[c->type]; if (sysmis_cnt && (op->flags & OPF_ABSORB_MISS) == 0) { /* Most operations produce SYSMIS given any SYSMIS argument. */ assert (op->returns == OP_number || op->returns == OP_boolean); if (op->returns == OP_number) return expr_allocate_number (e, SYSMIS); else return expr_allocate_boolean (e, SYSMIS); } else if (!nonconst_cnt && (op->flags & OPF_NONOPTIMIZABLE) == 0) { /* Evaluate constant expressions. */ return evaluate_tree (&node->composite, e); } else { /* A few optimization possibilities are still left. */ return optimize_tree (node, e); } } static int eq_double (union any_node *node, double n) { return node->type == OP_number && node->number.n == n; } static union any_node * optimize_tree (union any_node *node, struct expression *e) { struct composite_node *n = &node->composite; assert (is_composite (node->type)); /* If you add to these optimizations, please also add a correctness test in tests/expressions/expressions.sh. */ /* x+0, x-0, 0+x => x. */ if ((n->type == OP_ADD || n->type == OP_SUB) && eq_double (n->args[1], 0.)) return n->args[0]; else if (n->type == OP_ADD && eq_double (n->args[0], 0.)) return n->args[1]; /* x*1, x/1, 1*x => x. */ else if ((n->type == OP_MUL || n->type == OP_DIV) && eq_double (n->args[1], 1.)) return n->args[0]; else if (n->type == OP_MUL && eq_double (n->args[0], 1.)) return n->args[1]; /* 0*x, 0/x, x*0, MOD(0,x) => 0. */ else if (((n->type == OP_MUL || n->type == OP_DIV || n->type == OP_MOD_nn) && eq_double (n->args[0], 0.)) || (n->type == OP_MUL && eq_double (n->args[1], 0.))) return expr_allocate_number (e, 0.); /* x**1 => x. */ else if (n->type == OP_POW && eq_double (n->args[1], 1)) return n->args[0]; /* x**2 => SQUARE(x). */ else if (n->type == OP_POW && eq_double (n->args[1], 2)) return expr_allocate_unary (e, OP_SQUARE, n->args[0]); /* Otherwise, nothing to do. */ else return node; } static double get_number_arg (struct composite_node *, size_t arg_idx); static double *get_number_args (struct composite_node *, size_t arg_idx, size_t arg_cnt, struct expression *); static struct substring get_string_arg (struct composite_node *, size_t arg_idx); static struct substring *get_string_args (struct composite_node *, size_t arg_idx, size_t arg_cnt, struct expression *); static const struct fmt_spec *get_format_arg (struct composite_node *, size_t arg_idx); static union any_node * evaluate_tree (struct composite_node *node, struct expression *e) { switch (node->type) { #include "optimize.inc" default: NOT_REACHED (); } NOT_REACHED (); } static double get_number_arg (struct composite_node *c, size_t arg_idx) { assert (arg_idx < c->arg_cnt); assert (c->args[arg_idx]->type == OP_number || c->args[arg_idx]->type == OP_boolean); return c->args[arg_idx]->number.n; } static double * get_number_args (struct composite_node *c, size_t arg_idx, size_t arg_cnt, struct expression *e) { double *d; size_t i; d = pool_alloc (e->expr_pool, sizeof *d * arg_cnt); for (i = 0; i < arg_cnt; i++) d[i] = get_number_arg (c, i + arg_idx); return d; } static struct substring get_string_arg (struct composite_node *c, size_t arg_idx) { assert (arg_idx < c->arg_cnt); assert (c->args[arg_idx]->type == OP_string); return c->args[arg_idx]->string.s; } static struct substring * get_string_args (struct composite_node *c, size_t arg_idx, size_t arg_cnt, struct expression *e) { struct substring *s; size_t i; s = pool_alloc (e->expr_pool, sizeof *s * arg_cnt); for (i = 0; i < arg_cnt; i++) s[i] = get_string_arg (c, i + arg_idx); return s; } static const struct fmt_spec * get_format_arg (struct composite_node *c, size_t arg_idx) { assert (arg_idx < c->arg_cnt); assert (c->args[arg_idx]->type == OP_ni_format || c->args[arg_idx]->type == OP_no_format); return &c->args[arg_idx]->format.f; } /* Expression flattening. */ static union operation_data *allocate_aux (struct expression *, operation_type); static void flatten_node (union any_node *, struct expression *); static void emit_operation (struct expression *e, operation_type type) { allocate_aux (e, OP_operation)->operation = type; } static void emit_number (struct expression *e, double n) { allocate_aux (e, OP_number)->number = n; } static void emit_string (struct expression *e, struct substring s) { allocate_aux (e, OP_string)->string = s; } static void emit_format (struct expression *e, const struct fmt_spec *f) { allocate_aux (e, OP_format)->format = pool_clone (e->expr_pool, f, sizeof *f); } static void emit_variable (struct expression *e, const struct variable *v) { allocate_aux (e, OP_variable)->variable = v; } static void emit_vector (struct expression *e, const struct vector *v) { allocate_aux (e, OP_vector)->vector = v; } static void emit_integer (struct expression *e, int i) { allocate_aux (e, OP_integer)->integer = i; } void expr_flatten (union any_node *n, struct expression *e) { flatten_node (n, e); e->type = expr_node_returns (n); emit_operation (e, (e->type == OP_string ? OP_return_string : OP_return_number)); } static void flatten_atom (union any_node *n, struct expression *e) { switch (n->type) { case OP_number: case OP_boolean: emit_operation (e, OP_number); emit_number (e, n->number.n); break; case OP_string: emit_operation (e, OP_string); emit_string (e, n->string.s); break; case OP_num_var: case OP_str_var: case OP_vector: case OP_no_format: case OP_ni_format: case OP_pos_int: /* These are passed as aux data following the operation. */ break; default: NOT_REACHED (); } } static void flatten_composite (union any_node *n, struct expression *e) { const struct operation *op = &operations[n->type]; size_t i; for (i = 0; i < n->composite.arg_cnt; i++) flatten_node (n->composite.args[i], e); if (n->type != OP_BOOLEAN_TO_NUM) emit_operation (e, n->type); for (i = 0; i < n->composite.arg_cnt; i++) { union any_node *arg = n->composite.args[i]; switch (arg->type) { case OP_num_var: case OP_str_var: emit_variable (e, arg->variable.v); break; case OP_vector: emit_vector (e, arg->vector.v); break; case OP_ni_format: case OP_no_format: emit_format (e, &arg->format.f); break; case OP_pos_int: emit_integer (e, arg->integer.i); break; default: /* Nothing to do. */ break; } } if (op->flags & OPF_ARRAY_OPERAND) emit_integer (e, n->composite.arg_cnt - op->arg_cnt + 1); if (op->flags & OPF_MIN_VALID) emit_integer (e, n->composite.min_valid); } void flatten_node (union any_node *n, struct expression *e) { assert (is_operation (n->type)); if (is_atom (n->type)) flatten_atom (n, e); else if (is_composite (n->type)) flatten_composite (n, e); else NOT_REACHED (); } static union operation_data * allocate_aux (struct expression *e, operation_type type) { if (e->op_cnt >= e->op_cap) { e->op_cap = (e->op_cap + 8) * 3 / 2; e->ops = pool_realloc (e->expr_pool, e->ops, sizeof *e->ops * e->op_cap); e->op_types = pool_realloc (e->expr_pool, e->op_types, sizeof *e->op_types * e->op_cap); } e->op_types[e->op_cnt] = type; return &e->ops[e->op_cnt++]; } pspp-1.4.1/src/language/command.def0000644000175000017500000003376013320146056016574 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2006, 2009, 2010, 2011, 2013, 2016 Free Software Foundation, Inc. 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 3 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, see . */ /* Utility commands acceptable anywhere. */ DEF_CMD (S_ANY, F_ENHANCED, "CLOSE FILE HANDLE", cmd_close_file_handle) DEF_CMD (S_ANY, 0, "CACHE", cmd_cache) DEF_CMD (S_ANY, 0, "CD", cmd_cd) DEF_CMD (S_ANY, 0, "DO REPEAT", cmd_do_repeat) DEF_CMD (S_ANY, 0, "END REPEAT", cmd_end_repeat) DEF_CMD (S_ANY, 0, "ECHO", cmd_echo) DEF_CMD (S_ANY, 0, "ERASE", cmd_erase) DEF_CMD (S_ANY, 0, "EXIT", cmd_finish) DEF_CMD (S_ANY, 0, "FILE HANDLE", cmd_file_handle) DEF_CMD (S_ANY, 0, "FILE LABEL", cmd_file_label) DEF_CMD (S_ANY, 0, "FINISH", cmd_finish) DEF_CMD (S_ANY, 0, "HOST", cmd_host) DEF_CMD (S_ANY, 0, "INCLUDE", cmd_include) DEF_CMD (S_ANY, 0, "INSERT", cmd_insert) DEF_CMD (S_ANY, 0, "N OF CASES", cmd_n_of_cases) DEF_CMD (S_ANY, F_ABBREV, "N", cmd_n_of_cases) DEF_CMD (S_ANY, 0, "NEW FILE", cmd_new_file) DEF_CMD (S_ANY, 0, "OUTPUT", cmd_output) DEF_CMD (S_ANY, 0, "PERMISSIONS", cmd_permissions) DEF_CMD (S_ANY, 0, "PRESERVE", cmd_preserve) DEF_CMD (S_ANY, F_ABBREV, "Q", cmd_finish) DEF_CMD (S_ANY, 0, "QUIT", cmd_finish) DEF_CMD (S_ANY, 0, "RESTORE", cmd_restore) DEF_CMD (S_ANY, 0, "SET", cmd_set) DEF_CMD (S_ANY, 0, "SHOW", cmd_show) DEF_CMD (S_ANY, 0, "SUBTITLE", cmd_subtitle) DEF_CMD (S_ANY, 0, "SYSFILE INFO", cmd_sysfile_info) DEF_CMD (S_ANY, 0, "TITLE", cmd_title) /* Commands that define (or replace) the active dataset. */ DEF_CMD (S_INITIAL | S_DATA, 0, "ADD FILES", cmd_add_files) DEF_CMD (S_INITIAL | S_DATA | S_INPUT_PROGRAM | S_FILE_TYPE, 0, "DATA LIST", cmd_data_list) DEF_CMD (S_INITIAL | S_DATA, 0, "GET", cmd_get) DEF_CMD (S_INITIAL | S_DATA, 0, "GET DATA", cmd_get_data) DEF_CMD (S_INITIAL | S_DATA, 0, "IMPORT", cmd_import) DEF_CMD (S_INITIAL | S_DATA, 0, "INPUT PROGRAM", cmd_input_program) DEF_CMD (S_INITIAL | S_DATA, 0, "MATCH FILES", cmd_match_files) DEF_CMD (S_INITIAL | S_DATA | S_INPUT_PROGRAM | S_FILE_TYPE, 0, "MATRIX DATA", cmd_matrix) DEF_CMD (S_INITIAL | S_DATA, 0, "UPDATE", cmd_update) DEF_CMD (S_INITIAL | S_DATA, 0, "DATASET ACTIVATE", cmd_dataset_activate) DEF_CMD (S_INITIAL | S_DATA, 0, "DATASET DECLARE", cmd_dataset_declare) DEF_CMD (S_INITIAL | S_DATA, 0, "DATASET CLOSE", cmd_dataset_close) DEF_CMD (S_INITIAL | S_DATA, 0, "DATASET COPY", cmd_dataset_copy) DEF_CMD (S_INITIAL | S_DATA, 0, "DATASET NAME", cmd_dataset_name) DEF_CMD (S_INITIAL | S_DATA, 0, "DATASET DISPLAY", cmd_dataset_display) /* Transformations and utilities that may appear after active file definition or within INPUT PROGRAM. */ DEF_CMD (S_DATA | S_INPUT_PROGRAM, 0, "ADD VALUE LABELS", cmd_add_value_labels) DEF_CMD (S_DATA | S_INPUT_PROGRAM, 0, "ADD DOCUMENT", cmd_add_documents) DEF_CMD (S_DATA | S_INPUT_PROGRAM, 0, "APPLY DICTIONARY", cmd_apply_dictionary) DEF_CMD (S_DATA | S_INPUT_PROGRAM, 0, "BREAK", cmd_break) DEF_CMD (S_DATA | S_INPUT_PROGRAM, 0, "COMPUTE", cmd_compute) DEF_CMD (S_DATA | S_INPUT_PROGRAM, 0, "DATAFILE ATTRIBUTE", cmd_datafile_attribute) DEF_CMD (S_DATA | S_INPUT_PROGRAM, 0, "DISPLAY", cmd_display) DEF_CMD (S_DATA | S_INPUT_PROGRAM, 0, "DOCUMENT", cmd_document) DEF_CMD (S_DATA | S_INPUT_PROGRAM, 0, "DO IF", cmd_do_if) DEF_CMD (S_DATA | S_INPUT_PROGRAM, 0, "DROP DOCUMENTS", cmd_drop_documents) DEF_CMD (S_DATA | S_INPUT_PROGRAM, 0, "ELSE IF", cmd_else_if) DEF_CMD (S_DATA | S_INPUT_PROGRAM, 0, "ELSE", cmd_else) DEF_CMD (S_DATA | S_INPUT_PROGRAM, 0, "END IF", cmd_end_if) DEF_CMD (S_DATA | S_INPUT_PROGRAM, 0, "END LOOP", cmd_end_loop) DEF_CMD (S_DATA | S_INPUT_PROGRAM, 0, "FORMATS", cmd_formats) DEF_CMD (S_DATA | S_INPUT_PROGRAM, 0, "IF", cmd_if) DEF_CMD (S_DATA | S_INPUT_PROGRAM, 0, "LEAVE", cmd_leave) DEF_CMD (S_DATA | S_INPUT_PROGRAM, 0, "LOOP", cmd_loop) DEF_CMD (S_DATA | S_INPUT_PROGRAM, 0, "MISSING VALUES", cmd_missing_values) DEF_CMD (S_DATA | S_INPUT_PROGRAM, 0, "MRSETS", cmd_mrsets) DEF_CMD (S_DATA | S_INPUT_PROGRAM, 0, "NUMERIC", cmd_numeric) DEF_CMD (S_DATA | S_INPUT_PROGRAM, 0, "PRINT EJECT", cmd_print_eject) DEF_CMD (S_DATA | S_INPUT_PROGRAM, 0, "PRINT FORMATS", cmd_print_formats) DEF_CMD (S_DATA | S_INPUT_PROGRAM, 0, "PRINT SPACE", cmd_print_space) DEF_CMD (S_DATA | S_INPUT_PROGRAM, 0, "PRINT", cmd_print) DEF_CMD (S_DATA | S_INPUT_PROGRAM, 0, "RECODE", cmd_recode) DEF_CMD (S_DATA | S_INPUT_PROGRAM, 0, "SELECT IF", cmd_select_if) DEF_CMD (S_DATA | S_INPUT_PROGRAM, 0, "SPLIT FILE", cmd_split_file) DEF_CMD (S_DATA | S_INPUT_PROGRAM, 0, "STRING", cmd_string) DEF_CMD (S_DATA | S_INPUT_PROGRAM, 0, "VALUE LABELS", cmd_value_labels) DEF_CMD (S_DATA | S_INPUT_PROGRAM, 0, "VARIABLE ALIGNMENT", cmd_variable_alignment) DEF_CMD (S_DATA | S_INPUT_PROGRAM, 0, "VARIABLE ATTRIBUTE", cmd_variable_attribute) DEF_CMD (S_DATA | S_INPUT_PROGRAM, 0, "VARIABLE LABELS", cmd_variable_labels) DEF_CMD (S_DATA | S_INPUT_PROGRAM, 0, "VARIABLE LEVEL", cmd_variable_level) DEF_CMD (S_DATA | S_INPUT_PROGRAM, 0, "VARIABLE ROLE", cmd_variable_role) DEF_CMD (S_DATA | S_INPUT_PROGRAM, 0, "VARIABLE WIDTH", cmd_variable_width) DEF_CMD (S_DATA | S_INPUT_PROGRAM, 0, "VECTOR", cmd_vector) DEF_CMD (S_DATA | S_INPUT_PROGRAM, 0, "WEIGHT", cmd_weight) DEF_CMD (S_DATA | S_INPUT_PROGRAM, 0, "WRITE FORMATS", cmd_write_formats) DEF_CMD (S_DATA | S_INPUT_PROGRAM, 0, "WRITE", cmd_write) DEF_CMD (S_DATA | S_INPUT_PROGRAM, F_ENHANCED, "XEXPORT", cmd_xexport) DEF_CMD (S_DATA | S_INPUT_PROGRAM, 0, "XSAVE", cmd_xsave) /* Commands that may appear after active dataset definition. */ DEF_CMD (S_DATA, 0, "AGGREGATE", cmd_aggregate) DEF_CMD (S_DATA, 0, "AUTORECODE", cmd_autorecode) DEF_CMD (S_DATA, 0, "BEGIN DATA", cmd_begin_data) DEF_CMD (S_DATA, 0, "COUNT", cmd_count) DEF_CMD (S_DATA, 0, "CROSSTABS", cmd_crosstabs) DEF_CMD (S_DATA, 0, "CORRELATIONS", cmd_correlation) DEF_CMD (S_DATA, 0, "DELETE VARIABLES", cmd_delete_variables) DEF_CMD (S_DATA, 0, "DESCRIPTIVES", cmd_descriptives) DEF_CMD (S_DATA, 0, "EXAMINE", cmd_examine) DEF_CMD (S_DATA, 0, "EXECUTE", cmd_execute) DEF_CMD (S_DATA, 0, "EXPORT", cmd_export) DEF_CMD (S_DATA, 0, "FACTOR", cmd_factor) DEF_CMD (S_DATA, 0, "FILTER", cmd_filter) DEF_CMD (S_DATA, 0, "FLIP", cmd_flip) DEF_CMD (S_DATA, 0, "FREQUENCIES", cmd_frequencies) DEF_CMD (S_DATA, 0, "GLM", cmd_glm) DEF_CMD (S_DATA, 0, "GRAPH", cmd_graph) DEF_CMD (S_DATA, 0, "LIST", cmd_list) DEF_CMD (S_DATA, 0, "LOGISTIC REGRESSION", cmd_logistic) DEF_CMD (S_DATA, 0, "MEANS", cmd_means) DEF_CMD (S_DATA, 0, "MODIFY VARS", cmd_modify_vars) DEF_CMD (S_DATA, 0, "NPAR TESTS", cmd_npar_tests) DEF_CMD (S_DATA, 0, "ONEWAY", cmd_oneway) DEF_CMD (S_DATA, 0, "PEARSON CORRELATIONS", cmd_correlation) DEF_CMD (S_DATA, 0, "QUICK CLUSTER", cmd_quick_cluster) DEF_CMD (S_DATA, 0, "RANK", cmd_rank) DEF_CMD (S_DATA, 0, "REGRESSION", cmd_regression) DEF_CMD (S_DATA, 0, "RELIABILITY", cmd_reliability) DEF_CMD (S_DATA, 0, "RENAME VARIABLES", cmd_rename_variables) DEF_CMD (S_DATA, 0, "ROC", cmd_roc) DEF_CMD (S_DATA, 0, "SAMPLE", cmd_sample) DEF_CMD (S_DATA, 0, "SAVE", cmd_save) DEF_CMD (S_DATA, 0, "SAVE DATA COLLECTION", cmd_save_data_collection) DEF_CMD (S_DATA, 0, "SAVE TRANSLATE", cmd_save_translate) DEF_CMD (S_DATA, 0, "SORT CASES", cmd_sort_cases) DEF_CMD (S_DATA, 0, "SORT VARIABLES", cmd_sort_variables) DEF_CMD (S_DATA, 0, "T-TEST", cmd_t_test) DEF_CMD (S_DATA, 0, "TEMPORARY", cmd_temporary) DEF_CMD (S_DATA, 0, "USE", cmd_use) /* Commands valid only with INPUT PROGRAM. */ DEF_CMD (S_INPUT_PROGRAM, 0, "END CASE", cmd_end_case) DEF_CMD (S_INPUT_PROGRAM, 0, "END FILE", cmd_end_file) DEF_CMD (S_INPUT_PROGRAM, 0, "END INPUT PROGRAM", cmd_end_input_program) DEF_CMD (S_INPUT_PROGRAM, 0, "REREAD", cmd_reread) /* Commands for testing PSPP. */ DEF_CMD (S_ANY, F_TESTING, "DEBUG EVALUATE", cmd_debug_evaluate) DEF_CMD (S_ANY, F_TESTING, "DEBUG FORMAT GUESSER", cmd_debug_format_guesser) DEF_CMD (S_ANY, F_TESTING, "DEBUG MOMENTS", cmd_debug_moments) DEF_CMD (S_ANY, F_TESTING, "DEBUG PAPER SIZE", cmd_debug_paper_size) DEF_CMD (S_ANY, F_TESTING, "DEBUG POOL", cmd_debug_pool) DEF_CMD (S_ANY, F_TESTING, "DEBUG FLOAT FORMAT", cmd_debug_float_format) DEF_CMD (S_ANY, F_TESTING, "DEBUG XFORM FAIL", cmd_debug_xform_fail) /* Unimplemented commands. */ UNIMPL_CMD ("2SLS", "Two stage least squares regression") UNIMPL_CMD ("ACF", "Autocorrelation function") UNIMPL_CMD ("ALSCAL", "Multidimensional scaling") UNIMPL_CMD ("ANACOR", "Correspondence analysis") UNIMPL_CMD ("ANOVA", "Factorial analysis of variance") UNIMPL_CMD ("CASEPLOT", "Plot time series") UNIMPL_CMD ("CASESTOVARS", "Restructure complex data") UNIMPL_CMD ("CATPCA", "Categorical principle components analysis") UNIMPL_CMD ("CATREG", "Categorical regression") UNIMPL_CMD ("CCF", "Time series cross correlation") UNIMPL_CMD ("CLEAR TRANSFORMATIONS", "Clears transformations from active dataset") UNIMPL_CMD ("CLUSTER", "Hierarchical clustering") UNIMPL_CMD ("CONJOINT", "Analyse full concept data") UNIMPL_CMD ("CORRESPONDENCE", "Show correspondence") UNIMPL_CMD ("COXREG", "Cox proportional hazards regression") UNIMPL_CMD ("CREATE", "Create time series data") UNIMPL_CMD ("CSDESCRIPTIVES", "Complex samples descriptives") UNIMPL_CMD ("CSGLM", "Complex samples GLM") UNIMPL_CMD ("CSLOGISTIC", "Complex samples logistic regression") UNIMPL_CMD ("CSPLAN", "Complex samples design") UNIMPL_CMD ("CSSELECT", "Select complex samples") UNIMPL_CMD ("CSTABULATE", "Tabulate complex samples") UNIMPL_CMD ("CTABLES", "Display complex samples") UNIMPL_CMD ("CURVEFIT", "Fit curve to line plot") UNIMPL_CMD ("DATE", "Create time series data") UNIMPL_CMD ("DEFINE", "Syntax macros") UNIMPL_CMD ("DETECTANOMALY", "Find unusual cases") UNIMPL_CMD ("DISCRIMINANT", "Linear discriminant analysis") UNIMPL_CMD ("EDIT", "obsolete") UNIMPL_CMD ("END FILE TYPE", "Ends complex data input") UNIMPL_CMD ("FILE TYPE", "Complex data input") UNIMPL_CMD ("FIT", "Goodness of Fit") UNIMPL_CMD ("GENLOG", "Categorical model fitting") UNIMPL_CMD ("GET TRANSLATE", "Read other file formats") UNIMPL_CMD ("GGRAPH", "Custom defined graphs") UNIMPL_CMD ("HILOGLINEAR", "Hierarchical loglinear models") UNIMPL_CMD ("HOMALS", "Homogeneity analysis") UNIMPL_CMD ("IGRAPH", "Interactive graphs") UNIMPL_CMD ("INFO", "Local Documentation") UNIMPL_CMD ("KEYED DATA LIST", "Read nonsequential data") UNIMPL_CMD ("KM", "Kaplan-Meier") UNIMPL_CMD ("LOGLINEAR", "General model fitting") UNIMPL_CMD ("MANOVA", "Multivariate analysis of variance") UNIMPL_CMD ("MAPS", "Geographical display") UNIMPL_CMD ("MATRIX", "Matrix processing") UNIMPL_CMD ("MCONVERT", "Convert covariance/correlation matrices") UNIMPL_CMD ("MIXED", "Mixed linear models") UNIMPL_CMD ("MODEL CLOSE", "Close server connection") UNIMPL_CMD ("MODEL HANDLE", "Define server connection") UNIMPL_CMD ("MODEL LIST", "Show existing models") UNIMPL_CMD ("MODEL NAME", "Specify model label") UNIMPL_CMD ("MULTIPLE CORRESPONDENCE", "Multiple correspondence analysis") UNIMPL_CMD ("MULT RESPONSE", "Multiple response analysis") UNIMPL_CMD ("MVA", "Missing value analysis") UNIMPL_CMD ("NAIVEBAYES", "Small sample bayesian prediction") UNIMPL_CMD ("NLR", "Non Linear Regression") UNIMPL_CMD ("NOMREG", "Multinomial logistic regression") UNIMPL_CMD ("NONPAR CORR", "Nonparametric correlation") UNIMPL_CMD ("NUMBERED", "") UNIMPL_CMD ("OLAP CUBES", "On-line analytical processing") UNIMPL_CMD ("OMS", "Output management") UNIMPL_CMD ("ORTHOPLAN", "Orthogonal effects design") UNIMPL_CMD ("OVERALS", "Nonlinear canonical correlation") UNIMPL_CMD ("PACF", "Partial autocorrelation") UNIMPL_CMD ("PARTIAL CORR", "Partial correlation") UNIMPL_CMD ("PLANCARDS", "Conjoint analysis planning") UNIMPL_CMD ("PLUM", "Estimate ordinal regression models") UNIMPL_CMD ("POINT", "Marker in keyed file") UNIMPL_CMD ("PPLOT", "Plot time series variables") UNIMPL_CMD ("PREDICT", "Specify forecast period") UNIMPL_CMD ("PREFSCAL", "Multidimensional unfolding") UNIMPL_CMD ("PRINCALS", "PCA by alternating least squares") UNIMPL_CMD ("PROBIT", "Probit analysis") UNIMPL_CMD ("PROCEDURE OUTPUT", "Specify output file") UNIMPL_CMD ("PROXIMITIES", "Pairwise similarity") UNIMPL_CMD ("PROXSCAL", "Multidimensional scaling of proximity data") UNIMPL_CMD ("RATIO STATISTICS", "Descriptives of ratios") UNIMPL_CMD ("READ MODEL", "Read new model") UNIMPL_CMD ("RECORD TYPE", "Defines a type of record within FILE TYPE") UNIMPL_CMD ("REFORMAT", "Read obsolete files") UNIMPL_CMD ("REPEATING DATA", "Specify multiple cases per input record") UNIMPL_CMD ("REPORT", "Pretty print working file") UNIMPL_CMD ("RMV", "Replace missing values") UNIMPL_CMD ("SCRIPT", "Run script file") UNIMPL_CMD ("SEASON", "Estimate seasonal factors") UNIMPL_CMD ("SELECTPRED", "Select predictor variables") UNIMPL_CMD ("SPCHART", "Plot control charts") UNIMPL_CMD ("SPECTRA", "Plot spectral density") UNIMPL_CMD ("STEMLEAF", "Plot stem-and-leaf display") UNIMPL_CMD ("SUMMARIZE", "Univariate statistics") UNIMPL_CMD ("SURVIVAL", "Survival analysis") UNIMPL_CMD ("TDISPLAY", "Display active models") UNIMPL_CMD ("TREE", "Create classification tree") UNIMPL_CMD ("TSAPPLY", "Apply time series model") UNIMPL_CMD ("TSET", "Set time sequence variables") UNIMPL_CMD ("TSHOW", "Show time sequence variables") UNIMPL_CMD ("TSMODEL", "Estimate time series model") UNIMPL_CMD ("TSPLOT", "Plot time sequence variables") UNIMPL_CMD ("TWOSTEP CLUSTER", "Cluster observations") UNIMPL_CMD ("UNIANOVA", "Univariate analysis") UNIMPL_CMD ("UNNUMBERED", "obsolete") UNIMPL_CMD ("VALIDATEDATA", "Identify suspicious cases") UNIMPL_CMD ("VARCOMP", "Estimate variance") UNIMPL_CMD ("VARSTOCASES", "Restructure complex data") UNIMPL_CMD ("VERIFY", "Report time series") UNIMPL_CMD ("WLS", "Weighted least squares regression") UNIMPL_CMD ("XGRAPH", "High resolution charts") pspp-1.4.1/src/ui/0000755000175000017500000000000013725012647013326 5ustar00blpblp00000000000000pspp-1.4.1/src/ui/source-init-opts.h0000644000175000017500000000165513320146056016723 0ustar00blpblp00000000000000/* PSPPIRE - a graphical user interface for PSPP. Copyright (C) 2008, 2010 Free Software Foundation, Inc. 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 3 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, see . */ #ifndef UI_SOURCE_INIT_OPTS #define UI_SOURCE_INIT_OPTS struct argv_parser; void source_init_register_argv_parser (struct argv_parser *); #endif /* ui/source/source-init-opts.h */ pspp-1.4.1/src/ui/automake.mk0000644000175000017500000000212313725004300015446 0ustar00blpblp00000000000000# PSPP - a program for statistical analysis. # Copyright (C) 2017, 2020 Free Software Foundation, Inc. # # 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 3 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, see . # ## Process this file with automake to produce Makefile.in -*- makefile -*- include $(top_srcdir)/src/ui/terminal/automake.mk if HAVE_GUI include $(top_srcdir)/src/ui/gui/automake.mk endif noinst_LTLIBRARIES += src/ui/libuicommon.la src_ui_libuicommon_la_SOURCES = \ src/ui/source-init-opts.c src/ui/source-init-opts.h \ src/ui/syntax-gen.c src/ui/syntax-gen.h pspp-1.4.1/src/ui/source-init-opts.c0000644000175000017500000000562313670210420016710 0ustar00blpblp00000000000000/* PSPPIRE - a graphical user interface for PSPP. Copyright (C) 2008, 2010, 2014 Free Software Foundation 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 3 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, see . */ #include #include "source-init-opts.h" #include #include #include #include "data/settings.h" #include "language/lexer/include-path.h" #include "language/lexer/lexer.h" #include "libpspp/assertion.h" #include "libpspp/argv-parser.h" #include "libpspp/llx.h" #include "libpspp/message.h" #include "ui/syntax-gen.h" #include "gl/error.h" #include "gl/xalloc.h" #include "gettext.h" #define _(msgid) gettext (msgid) #define N_(msgid) msgid enum { OPT_ALGORITHM, OPT_INCLUDE, OPT_NO_INCLUDE, OPT_SAFER, OPT_SYNTAX, N_SOURCE_INIT_OPTIONS }; static const struct argv_option source_init_options[N_SOURCE_INIT_OPTIONS] = { {"algorithm", 'a', required_argument, OPT_ALGORITHM}, {"include", 'I', required_argument, OPT_INCLUDE}, {"no-include", 0, no_argument, OPT_NO_INCLUDE}, {"safer", 's', no_argument, OPT_SAFER}, {"syntax", 'x', required_argument, OPT_SYNTAX}, }; static void source_init_option_callback (int id, void *aux UNUSED) { switch (id) { case OPT_ALGORITHM: if (!strcmp (optarg, "compatible")) settings_set_algorithm (COMPATIBLE); else if (!strcmp (optarg, "enhanced")) settings_set_algorithm (ENHANCED); else error (1, 0, _("Algorithm must be either `%s' or `%s'."), "compatible", "enhanced"); break; case OPT_INCLUDE: if (!strcmp (optarg, "-")) include_path_clear (); else include_path_add (optarg); break; case OPT_NO_INCLUDE: include_path_clear (); break; case OPT_SAFER: settings_set_safer_mode (); break; case OPT_SYNTAX: if (!strcmp (optarg, "compatible")) settings_set_syntax (COMPATIBLE); else if (!strcmp (optarg, "enhanced")) settings_set_syntax (ENHANCED); else error (1, 0, _("Syntax must be either `%s' or `%s'."), "compatible", "enhanced"); break; default: NOT_REACHED (); } } void source_init_register_argv_parser (struct argv_parser *ap) { argv_parser_add_options (ap, source_init_options, N_SOURCE_INIT_OPTIONS, source_init_option_callback, NULL); } pspp-1.4.1/src/ui/syntax-gen.h0000644000175000017500000000330313320146056015564 0ustar00blpblp00000000000000/* PSPPIRE - a graphical user interface for PSPP. Copyright (C) 2007, 2008, 2011 Free Software Foundation, Inc. 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 3 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, see . */ #ifndef SYNTAX_GEN_H #define SYNTAX_GEN_H 1 /* These functions aid in composing PSPP syntax. */ #include #include #include "libpspp/compiler.h" #include "libpspp/str.h" struct fmt_spec; struct substring; struct string; union value; void syntax_gen_string (struct string *output, struct substring in); void syntax_gen_number (struct string *output, double, const struct fmt_spec *format); void syntax_gen_value (struct string *output, const union value *value, int width, const struct fmt_spec *format); void syntax_gen_num_range (struct string *output, double low, double high, const struct fmt_spec *format); void syntax_gen_pspp_valist (struct string *output, const char *format, va_list) PRINTF_FORMAT (2, 0); void syntax_gen_pspp (struct string *output, const char *format, ...) PRINTF_FORMAT (2, 3); #endif /* format-syntax.h */ pspp-1.4.1/src/ui/gui/0000755000175000017500000000000013725012647014112 5ustar00blpblp00000000000000pspp-1.4.1/src/ui/gui/find.ui0000644000175000017500000004276513717773141015413 0ustar00blpblp00000000000000 False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK Find Case True True False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 2 True False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 5 5 True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK never etched-in 300 True True 0 False True True True 0 True False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK vertical True True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 5 find-variable-treeview find-variable-entry False False 0 False False 1 True False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK vertical True False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK vertical True False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 0 Variable: False False 5 0 True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK False False 1 False True 0 True False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK vertical True False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 0 Value: False False 5 0 True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK False False 1 Search value labels True False True False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 0.5 True False True 2 False True 1 vertical True False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK Regular expression Match True False True False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 0.5 True False False 0 Search substrings True False True False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 0.5 True False False 1 Wrap around True True False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 0.5 True False False 2 Search backward True True False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 0.5 True False False 3 False True 2 False True 3 True True 0 vertical True False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 5 PSPPIRE_BUTTON_CLOSE_MASK | PSPPIRE_BUTTON_HELP_MASK | PSPPIRE_BUTTON_RESET_MASK False False end 1 pspp-1.4.1/src/ui/gui/psppire.xml0000644000175000017500000000216613717773141016327 0ustar00blpblp00000000000000 pspp-1.4.1/src/ui/gui/psppire-dialog-action-indep-samps.c0000644000175000017500000003065413700645726022701 0ustar00blpblp00000000000000/* PSPPIRE - a graphical user interface for PSPP. Copyright (C) 2007, 2009, 2010, 2011, 2012, 2016 Free Software Foundation 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 3 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, see . */ #include #include "psppire-dialog-action-indep-samps.h" #include "psppire-value-entry.h" #include "dialog-common.h" #include #include "psppire-var-view.h" #include "t-test-options.h" #include "psppire-dialog.h" #include "builder-wrapper.h" #include "psppire-dict.h" #include "libpspp/str.h" static void psppire_dialog_action_indep_samps_class_init (PsppireDialogActionIndepSampsClass *class); G_DEFINE_TYPE (PsppireDialogActionIndepSamps, psppire_dialog_action_indep_samps, PSPPIRE_TYPE_DIALOG_ACTION); static gboolean dialog_state_valid (gpointer data) { PsppireDialogActionIndepSamps *act = PSPPIRE_DIALOG_ACTION_INDEP_SAMPS (data); GtkTreeModel *vars = gtk_tree_view_get_model (GTK_TREE_VIEW (act->test_vars_tv)); GtkTreeIter notused; if (NULL == act->grp_var) return FALSE; if (0 == gtk_tree_model_get_iter_first (vars, ¬used)) return FALSE; if (act->group_defn == GROUPS_UNDEF) return FALSE; return TRUE; } static void refresh (PsppireDialogAction *da) { PsppireDialogActionIndepSamps *act = PSPPIRE_DIALOG_ACTION_INDEP_SAMPS (da); GtkTreeModel *model = gtk_tree_view_get_model (GTK_TREE_VIEW (act->test_vars_tv)); act->group_defn = GROUPS_UNDEF; if (act->grp_var) { const int width = act->grp_var_width; value_destroy (&act->cut_point, width); value_destroy (&act->grp_val[0], width); value_destroy (&act->grp_val[1], width); var_unref (act->grp_var); act->grp_var = NULL; act->grp_var_width = -1; } psppire_value_entry_set_variable (PSPPIRE_VALUE_ENTRY (act->dg_grp_entry[0]), NULL); psppire_value_entry_set_variable (PSPPIRE_VALUE_ENTRY (act->dg_grp_entry[1]), NULL); psppire_value_entry_set_variable (PSPPIRE_VALUE_ENTRY (act->dg_cut_point_entry), NULL); gtk_entry_set_text (GTK_ENTRY (act->group_var_entry), ""); gtk_list_store_clear (GTK_LIST_STORE (model)); gtk_widget_set_sensitive (act->define_groups_button, FALSE); } /* Return TRUE if VE contains a text which is not valid for VAR or if it contains the SYSMIS value */ static gboolean value_entry_contains_invalid (PsppireValueEntry *ve, const struct variable *var) { gboolean result = FALSE; if (var) { union value val; const int width = var_get_width (var); value_init (&val, width); if (psppire_value_entry_get_value (ve, &val, width)) { if (var_is_value_missing (var, &val, MV_SYSTEM)) { result = TRUE; } } else result = TRUE; value_destroy (&val, width); } return result; } /* Returns TRUE iff the define groups subdialog has a state which defines a valid group criterion */ static gboolean define_groups_state_valid (gpointer data) { PsppireDialogActionIndepSamps *act = data; if (act->grp_var == NULL) return FALSE; if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (act->dg_values_toggle_button))) { if (value_entry_contains_invalid (PSPPIRE_VALUE_ENTRY (act->dg_grp_entry[0]), act->grp_var)) return FALSE; if (value_entry_contains_invalid (PSPPIRE_VALUE_ENTRY (act->dg_grp_entry[1]), act->grp_var)) return FALSE; } else { if (value_entry_contains_invalid (PSPPIRE_VALUE_ENTRY (act->dg_cut_point_entry), act->grp_var)) return FALSE; } return TRUE; } static void run_define_groups (PsppireDialogActionIndepSamps *act) { gint response; PsppireDialogAction *da = PSPPIRE_DIALOG_ACTION (act); GtkWidget *parent1 = gtk_widget_get_parent (act->dg_table1); GtkWidget *parent2 = gtk_widget_get_parent (act->dg_table2); g_return_if_fail (act->grp_var); if (parent1) gtk_container_remove (GTK_CONTAINER (parent1), act->dg_table1); if (parent2) gtk_container_remove (GTK_CONTAINER (parent2), act->dg_table2); if (var_is_numeric (act->grp_var)) { gtk_grid_attach (GTK_GRID (act->dg_table1), act->dg_table2, 1, 1, 1, 1); gtk_container_add (GTK_CONTAINER (act->dg_box), act->dg_table1); } else { gtk_container_add (GTK_CONTAINER (act->dg_box), act->dg_table2); act->group_defn = GROUPS_VALUES; } psppire_dialog_set_valid_predicate (PSPPIRE_DIALOG (act->dg_dialog), define_groups_state_valid, act); psppire_value_entry_set_variable (PSPPIRE_VALUE_ENTRY (act->dg_grp_entry[0]), act->grp_var); psppire_value_entry_set_variable (PSPPIRE_VALUE_ENTRY (act->dg_grp_entry[1]), act->grp_var); psppire_value_entry_set_variable (PSPPIRE_VALUE_ENTRY (act->dg_cut_point_entry), act->grp_var); if (act->group_defn != GROUPS_CUT_POINT) { gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (act->dg_cut_point_toggle_button), TRUE); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (act->dg_values_toggle_button), TRUE); } else { gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (act->dg_values_toggle_button), TRUE); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (act->dg_cut_point_toggle_button), TRUE); } g_signal_emit_by_name (act->dg_grp_entry[0], "changed"); g_signal_emit_by_name (act->dg_grp_entry[1], "changed"); g_signal_emit_by_name (act->dg_cut_point_entry, "changed"); response = psppire_dialog_run (PSPPIRE_DIALOG (act->def_grps_dialog)); if (response == PSPPIRE_RESPONSE_CONTINUE) { const int width = var_get_width (act->grp_var); if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (act->dg_values_toggle_button))) { act->group_defn = GROUPS_VALUES; psppire_value_entry_get_value (PSPPIRE_VALUE_ENTRY (act->dg_grp_entry[0]), &act->grp_val[0], width); psppire_value_entry_get_value (PSPPIRE_VALUE_ENTRY (act->dg_grp_entry[1]), &act->grp_val[1], width); } else { act->group_defn = GROUPS_CUT_POINT; psppire_value_entry_get_value (PSPPIRE_VALUE_ENTRY (act->dg_cut_point_entry), &act->cut_point, width); } psppire_dialog_notify_change (PSPPIRE_DIALOG (da->dialog)); } } /* Called whenever the group variable entry widget's contents change */ static void on_grp_var_change (GtkEntry *entry, PsppireDialogActionIndepSamps *act) { PsppireDialogAction *da = PSPPIRE_DIALOG_ACTION (act); const gchar *text = gtk_entry_get_text (entry); struct variable *v = da->dict ? psppire_dict_lookup_var (da->dict, text) : NULL; gtk_widget_set_sensitive (act->define_groups_button, v != NULL); if (act->grp_var) { const int width = act->grp_var_width; value_destroy (&act->cut_point, width); value_destroy (&act->grp_val[0], width); value_destroy (&act->grp_val[1], width); } if (v) { const int width = var_get_width (v); value_init (&act->cut_point, width); value_init (&act->grp_val[0], width); value_init (&act->grp_val[1], width); if (width == 0) { act->cut_point.f = SYSMIS; act->grp_val[0].f = SYSMIS; act->grp_val[1].f = SYSMIS; } else { act->cut_point.s[0] = '\0'; act->grp_val[0].s[0] = '\0'; act->grp_val[1].s[0] = '\0'; } } struct variable *old_grp_var = act->grp_var; if (v) act->grp_var = var_ref (v); if (old_grp_var) var_unref (old_grp_var); act->grp_var_width = v ? var_get_width (v) : -1; } static void set_group_criterion_type (GtkToggleButton *button, PsppireDialogActionIndepSamps *act) { gboolean by_values = gtk_toggle_button_get_active (button); gtk_widget_set_sensitive (act->dg_label, by_values); gtk_widget_set_sensitive (act->dg_table2, by_values); gtk_widget_set_sensitive (act->dg_hbox1, !by_values); } static GtkBuilder * psppire_dialog_action_indep_samps_activate (PsppireDialogAction *a, GVariant *param) { PsppireDialogActionIndepSamps *act = PSPPIRE_DIALOG_ACTION_INDEP_SAMPS (a); PsppireDialogAction *pda = PSPPIRE_DIALOG_ACTION (a); GtkBuilder *xml = builder_new ("indep-samples.ui"); pda->dialog = get_widget_assert (xml,"independent-samples-dialog"); pda->source = get_widget_assert (xml, "indep-samples-treeview1"); act->define_groups_button = get_widget_assert (xml, "define-groups-button"); act->options_button = get_widget_assert (xml, "indep-samples-options-button"); act->def_grps_dialog = get_widget_assert (xml, "define-groups-dialog"); act->group_var_entry = get_widget_assert (xml, "indep-samples-entry"); act->test_vars_tv = get_widget_assert (xml, "indep-samples-treeview2"); act->dg_dialog = get_widget_assert (xml, "define-groups-dialog"); act->dg_grp_entry[0] = get_widget_assert (xml, "group1-entry"); act->dg_grp_entry[1] = get_widget_assert (xml, "group2-entry"); act->dg_cut_point_entry = get_widget_assert (xml, "cut-point-entry"); act->dg_box = get_widget_assert (xml, "dialog-hbox2"); act->dg_table1 = get_widget_assert (xml, "table1"); act->dg_table2 = get_widget_assert (xml, "table2"); act->dg_label = get_widget_assert (xml, "label4"); act->dg_hbox1 = get_widget_assert (xml, "hbox1"); act->dg_values_toggle_button = get_widget_assert (xml, "radiobutton3"); act->dg_cut_point_toggle_button = get_widget_assert (xml, "radiobutton4"); act->opts = tt_options_dialog_create (GTK_WINDOW (pda->toplevel)); g_object_ref (act->dg_table1); g_object_ref (act->dg_table2); g_signal_connect (act->dg_values_toggle_button, "toggled", G_CALLBACK (set_group_criterion_type), act); psppire_dialog_action_set_refresh (pda, refresh); psppire_dialog_action_set_valid_predicate (pda, dialog_state_valid); g_signal_connect_swapped (act->define_groups_button, "clicked", G_CALLBACK (run_define_groups), act); g_signal_connect_swapped (act->options_button, "clicked", G_CALLBACK (tt_options_dialog_run), act->opts); g_signal_connect (act->group_var_entry, "changed", G_CALLBACK (on_grp_var_change), act); on_grp_var_change (GTK_ENTRY (act->group_var_entry), act); return xml; } static char * generate_syntax (const PsppireDialogAction *a) { PsppireDialogActionIndepSamps *act = PSPPIRE_DIALOG_ACTION_INDEP_SAMPS (a); gchar *text; GString *str = g_string_new ("T-TEST /VARIABLES="); psppire_var_view_append_names (PSPPIRE_VAR_VIEW (act->test_vars_tv), 0, str); g_string_append (str, "\n\t/GROUPS="); g_string_append (str, var_get_name (act->grp_var)); if (act->group_defn != GROUPS_UNDEF) { g_string_append (str, "("); { const union value *val = (act->group_defn == GROUPS_VALUES) ? &act->grp_val[0] : &act->cut_point; struct string strx; ds_init_empty (&strx); syntax_gen_value (&strx, val, var_get_width (act->grp_var), var_get_print_format (act->grp_var)); g_string_append (str, ds_cstr (&strx)); ds_destroy (&strx); } if (act->group_defn == GROUPS_VALUES) { g_string_append (str, ","); { struct string strx; ds_init_empty (&strx); syntax_gen_value (&strx, &act->grp_val[1], var_get_width (act->grp_var), var_get_print_format (act->grp_var)); g_string_append (str, ds_cstr (&strx)); ds_destroy (&strx); } } g_string_append (str, ")"); } tt_options_dialog_append_syntax (act->opts, str); g_string_append (str, ".\n"); text = str->str; g_string_free (str, FALSE); return text; } static void psppire_dialog_action_indep_samps_class_init (PsppireDialogActionIndepSampsClass *class) { PSPPIRE_DIALOG_ACTION_CLASS (class)->initial_activate = psppire_dialog_action_indep_samps_activate; PSPPIRE_DIALOG_ACTION_CLASS (class)->generate_syntax = generate_syntax; } static void psppire_dialog_action_indep_samps_init (PsppireDialogActionIndepSamps *act) { act->grp_var = NULL; act->grp_var_width = -1; act->group_defn = GROUPS_UNDEF; } pspp-1.4.1/src/ui/gui/psppire-dialog-action-var-info.c0000644000175000017500000001326313670210420022160 0ustar00blpblp00000000000000/* PSPPIRE - a graphical user interface for PSPP. Copyright (C) 2007, 2009, 2010, 2011, 2012, 2013, 2014, 2016 Free Software Foundation 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 3 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, see . */ #include #include "ui/gui/psppire-dialog-action-var-info.h" #include #include "data/format.h" #include "data/value-labels.h" #include "data/variable.h" #include "libpspp/i18n.h" #include "output/driver.h" #include "ui/gui/builder-wrapper.h" #include "ui/gui/executor.h" #include "ui/gui/helper.h" #include "ui/gui/psppire-data-window.h" #include "ui/gui/psppire-dialog.h" #include "ui/gui/psppire-dictview.h" #include "ui/gui/psppire-output-view.h" #include "ui/gui/var-display.h" static void psppire_dialog_action_var_info_init (PsppireDialogActionVarInfo *act); static void psppire_dialog_action_var_info_class_init (PsppireDialogActionVarInfoClass *class); G_DEFINE_TYPE (PsppireDialogActionVarInfo, psppire_dialog_action_var_info, PSPPIRE_TYPE_DIALOG_ACTION); #include #define _(msgid) gettext (msgid) #define N_(msgid) msgid static gboolean treeview_item_selected (gpointer data) { PsppireDialogAction *pda = data; GtkTreeView *tv = GTK_TREE_VIEW (pda->source); GtkTreeSelection *selection = gtk_tree_view_get_selection (tv); return gtk_tree_selection_count_selected_rows (selection) >= 1; } static gchar * generate_syntax__ (const PsppireDialogAction *act, const char *prefix) { struct variable **vars; size_t n_vars; size_t line_len; GString *s; char *str; size_t i; psppire_dict_view_get_selected_variables (PSPPIRE_DICT_VIEW (act->source), &vars, &n_vars); s = g_string_new (prefix); line_len = 0; for (i = 0; i < n_vars; i++) { const char *name = var_get_name (vars[i]); size_t name_len = strlen (name); if (line_len > 0) { if (line_len + 1 + name_len > 69) { g_string_append_c (s, '\n'); line_len = 0; } else { g_string_append_c (s, ' '); line_len++; } } g_string_append (s, name); line_len += name_len; } g_free (vars); str = s->str; g_string_free (s, FALSE); return str; } static gchar * generate_syntax (const PsppireDialogAction *act) { return generate_syntax__ (act, ""); } static void populate_output (GtkTreeSelection *selection, gpointer data) { PsppireDialogActionVarInfo *act = data; GtkTreeView *treeview = gtk_tree_selection_get_tree_view (selection); PsppireDict *dict; size_t n_vars; struct variable **vars; g_object_get (treeview, "model", &dict, NULL); psppire_dict_view_get_selected_variables (PSPPIRE_DICT_VIEW (treeview), &vars, &n_vars); if (n_vars > 0) { PsppireDataWindow *dw; g_object_get (act, "top-level", &dw, NULL); psppire_output_view_clear (act->output); output_engine_push (); psppire_output_view_register_driver (act->output); g_free (execute_syntax_string ( dw, generate_syntax__ (&act->parent, "DISPLAY DICTIONARY /VARIABLES="))); output_engine_pop (); } } static void jump_to (PsppireDialog *d, gint response, gpointer data) { PsppireDataWindow *dw; PsppireDialogAction *pda = PSPPIRE_DIALOG_ACTION (data); struct variable **vars; size_t n_vars; if (response != PSPPIRE_RESPONSE_GOTO) return; psppire_dict_view_get_selected_variables (PSPPIRE_DICT_VIEW (pda->source), &vars, &n_vars); if (n_vars > 0) { g_object_get (pda, "top-level", &dw, NULL); psppire_data_editor_goto_variable (dw->data_editor, var_get_dict_index (vars[0])); } g_free (vars); } static GtkBuilder * psppire_dialog_action_var_info_activate (PsppireDialogAction *a, GVariant *param) { PsppireDialogAction *pda = PSPPIRE_DIALOG_ACTION (a); PsppireDialogActionVarInfo *act = PSPPIRE_DIALOG_ACTION_VAR_INFO (pda); GtkBuilder *xml = builder_new ("variable-info.ui"); act->output = psppire_output_view_new (GTK_LAYOUT (get_widget_assert (xml, "layout1")), NULL); pda->dialog = get_widget_assert (xml, "variable-info-dialog"); pda->source = get_widget_assert (xml, "treeview2"); g_object_set (pda->source, "selection-mode", GTK_SELECTION_MULTIPLE, NULL); g_signal_connect (gtk_tree_view_get_selection (GTK_TREE_VIEW (pda->source)), "changed", G_CALLBACK (populate_output), act); g_signal_connect (pda->dialog, "response", G_CALLBACK (jump_to), pda); psppire_dialog_action_set_valid_predicate (pda, treeview_item_selected); return xml; } static void psppire_dialog_action_var_info_class_init (PsppireDialogActionVarInfoClass *class) { PSPPIRE_DIALOG_ACTION_CLASS (class)->initial_activate = psppire_dialog_action_var_info_activate; PSPPIRE_DIALOG_ACTION_CLASS (class)->generate_syntax = generate_syntax; } static void psppire_dialog_action_var_info_init (PsppireDialogActionVarInfo *act) { } pspp-1.4.1/src/ui/gui/psppire-dialog-action-descriptives.h0000644000175000017500000000520213320146056023147 0ustar00blpblp00000000000000/* PSPPIRE - a graphical user interface for PSPP. Copyright (C) 2012 Free Software Foundation 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 3 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, see . */ #ifndef __PSPPIRE_DIALOG_ACTION_DESCRIPTIVES_H__ #define __PSPPIRE_DIALOG_ACTION_DESCRIPTIVES_H__ #include #include #include "psppire-dialog-action.h" G_BEGIN_DECLS #define PSPPIRE_TYPE_DIALOG_ACTION_DESCRIPTIVES (psppire_dialog_action_descriptives_get_type ()) #define PSPPIRE_DIALOG_ACTION_DESCRIPTIVES(obj) \ (G_TYPE_CHECK_INSTANCE_CAST ((obj), \ PSPPIRE_TYPE_DIALOG_ACTION_DESCRIPTIVES, PsppireDialogActionDescriptives)) #define PSPPIRE_DIALOG_ACTION_DESCRIPTIVES_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST ((klass), \ PSPPIRE_TYPE_DIALOG_ACTION_DESCRIPTIVES, \ PsppireDialogActionDescriptivesClass)) #define PSPPIRE_IS_DIALOG_ACTION_DESCRIPTIVES(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE ((obj), PSPPIRE_TYPE_DIALOG_ACTION_DESCRIPTIVES)) #define PSPPIRE_IS_DIALOG_ACTION_DESCRIPTIVES_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE ((klass), PSPPIRE_TYPE_DIALOG_ACTION_DESCRIPTIVES)) #define PSPPIRE_DIALOG_ACTION_DESCRIPTIVES_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), \ PSPPIRE_TYPE_DIALOG_ACTION_DESCRIPTIVES, \ PsppireDialogActionDescriptivesClass)) typedef struct _PsppireDialogActionDescriptives PsppireDialogActionDescriptives; typedef struct _PsppireDialogActionDescriptivesClass PsppireDialogActionDescriptivesClass; struct _PsppireDialogActionDescriptives { PsppireDialogAction parent; /*< private >*/ gboolean dispose_has_run ; GtkWidget *variables; GtkTreeView *stat_vars; GtkTreeModel *stats; GtkToggleButton *exclude_missing_listwise; GtkToggleButton *include_user_missing; GtkToggleButton *save_z_scores; }; struct _PsppireDialogActionDescriptivesClass { PsppireDialogActionClass parent_class; }; GType psppire_dialog_action_descriptives_get_type (void) ; G_END_DECLS #endif /* __PSPPIRE_DIALOG_ACTION_DESCRIPTIVES_H__ */ pspp-1.4.1/src/ui/gui/windows-menu.h0000644000175000017500000000155513320146056016716 0ustar00blpblp00000000000000/* PSPPIRE - a graphical user interface for PSPP. Copyright (C) 2016 Free Software Foundation 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 3 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, see . */ #ifndef WINDOWS_MENU_H #define WINDOWS_MENU_H #include GtkWidget * create_windows_menu (GtkWindow *toplevel); #endif pspp-1.4.1/src/ui/gui/psppire-dialog-action-factor.h0000644000175000017500000000656213320146056021733 0ustar00blpblp00000000000000/* PSPPIRE - a graphical user interface for PSPP. Copyright (C) 2012 Free Software Foundation 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 3 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, see . */ #ifndef __PSPPIRE_DIALOG_ACTION_FACTOR_H__ #define __PSPPIRE_DIALOG_ACTION_FACTOR_H__ #include #include #include "psppire-dialog-action.h" G_BEGIN_DECLS #define PSPPIRE_TYPE_DIALOG_ACTION_FACTOR (psppire_dialog_action_factor_get_type ()) #define PSPPIRE_DIALOG_ACTION_FACTOR(obj) \ (G_TYPE_CHECK_INSTANCE_CAST ((obj), \ PSPPIRE_TYPE_DIALOG_ACTION_FACTOR, PsppireDialogActionFactor)) #define PSPPIRE_DIALOG_ACTION_FACTOR_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST ((klass), \ PSPPIRE_TYPE_DIALOG_ACTION_FACTOR, \ PsppireDialogActionFactorClass)) #define PSPPIRE_IS_DIALOG_ACTION_FACTOR(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE ((obj), PSPPIRE_TYPE_DIALOG_ACTION_FACTOR)) #define PSPPIRE_IS_DIALOG_ACTION_FACTOR_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE ((klass), PSPPIRE_TYPE_DIALOG_ACTION_FACTOR)) #define PSPPIRE_DIALOG_ACTION_FACTOR_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), \ PSPPIRE_TYPE_DIALOG_ACTION_FACTOR, \ PsppireDialogActionFactorClass)) typedef struct _PsppireDialogActionFactor PsppireDialogActionFactor; typedef struct _PsppireDialogActionFactorClass PsppireDialogActionFactorClass; enum rotation_type { ROT_NONE, ROT_VARIMAX, ROT_QUARTIMAX, ROT_EQUIMAX }; struct rotation_parameters { gboolean rotated_solution; gint iterations; enum rotation_type method; }; struct extraction_parameters { gdouble mineigen; gint n_factors; gint n_iterations; gboolean explicit_nfactors; gboolean covariance; gboolean scree; gboolean unrotated; gboolean paf; }; struct _PsppireDialogActionFactor { PsppireDialogAction parent; /*< private >*/ GtkWidget *variables ; /* The Extraction subdialog */ GtkWidget *extraction_dialog; GtkWidget *rotation_dialog; GtkWidget *n_factors; GtkWidget *mineigen; GtkWidget *extract_iterations; GtkWidget *nfactors_toggle; GtkWidget *mineigen_toggle; GtkWidget *covariance_toggle; GtkWidget *correlation_toggle; GtkWidget *scree_button; GtkWidget *unrotated_button; GtkWidget *extraction_combo; /* Rotation Widgets */ GtkWidget *rotate_iterations; GtkWidget *display_rotated_solution; GtkWidget *rotation_none; GtkWidget *rotation_varimax; GtkWidget *rotation_quartimax; GtkWidget *rotation_equimax; struct extraction_parameters extraction; struct rotation_parameters rotation; }; struct _PsppireDialogActionFactorClass { PsppireDialogActionClass parent_class; }; GType psppire_dialog_action_factor_get_type (void) ; G_END_DECLS #endif /* __PSPPIRE_DIALOG_ACTION_FACTOR_H__ */ pspp-1.4.1/src/ui/gui/psppire-syntax-window.c0000644000175000017500000010110613723216277020573 0ustar00blpblp00000000000000/* PSPPIRE - a graphical user interface for PSPP. Copyright (C) 2008, 2009, 2010, 2011, 2012, 2014, 2016, 2020 Free Software Foundation 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 3 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, see . */ #include #include #include #include #include "language/lexer/lexer.h" #include "libpspp/encoding-guesser.h" #include "libpspp/i18n.h" #include "libpspp/message.h" #include "ui/gui/executor.h" #include "ui/gui/help-menu.h" #include "ui/gui/helper.h" #include "ui/gui/builder-wrapper.h" #include "ui/gui/psppire-data-window.h" #include "ui/gui/psppire-encoding-selector.h" #include "ui/gui/psppire-lex-reader.h" #include "ui/gui/psppire-syntax-window.h" #include "ui/gui/psppire.h" #include "ui/gui/windows-menu.h" #include "gl/localcharset.h" #include "gl/xalloc.h" #include "gl/xvasprintf.h" #include #define _(msgid) gettext (msgid) #define N_(msgid) msgid static void psppire_syntax_window_class_init (PsppireSyntaxWindowClass *class); static void psppire_syntax_window_init (PsppireSyntaxWindow *syntax_editor); static void psppire_syntax_window_iface_init (PsppireWindowIface *iface); /* Properties */ enum { PROP_0, PROP_ENCODING }; static void psppire_syntax_window_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) { PsppireSyntaxWindow *window = PSPPIRE_SYNTAX_WINDOW (object); switch (prop_id) { case PROP_ENCODING: g_free (window->encoding); window->encoding = g_value_dup_string (value); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; }; } static void psppire_syntax_window_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) { PsppireSyntaxWindow *window = PSPPIRE_SYNTAX_WINDOW (object); switch (prop_id) { case PROP_ENCODING: g_value_set_string (value, window->encoding); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; }; } G_DEFINE_TYPE_WITH_CODE (PsppireSyntaxWindow, psppire_syntax_window, PSPPIRE_TYPE_WINDOW, G_IMPLEMENT_INTERFACE (PSPPIRE_TYPE_WINDOW_MODEL, psppire_syntax_window_iface_init)) static GObjectClass *parent_class ; static void psppire_syntax_window_finalize (GObject *object) { if (G_OBJECT_CLASS (parent_class)->finalize) (*G_OBJECT_CLASS (parent_class)->finalize) (object); } static void psppire_syntax_window_dispose (GObject *obj) { PsppireSyntaxWindow *sw = PSPPIRE_SYNTAX_WINDOW (obj); GtkClipboard *clip_selection; GtkClipboard *clip_primary; if (sw->dispose_has_run) return; g_object_unref (sw->search_text_buffer); g_free (sw->encoding); sw->encoding = NULL; clip_selection = gtk_widget_get_clipboard (GTK_WIDGET (sw), GDK_SELECTION_CLIPBOARD); clip_primary = gtk_widget_get_clipboard (GTK_WIDGET (sw), GDK_SELECTION_PRIMARY); g_signal_handler_disconnect (clip_primary, sw->sel_handler); g_signal_handler_disconnect (clip_selection, sw->ps_handler); /* Make sure dispose does not run twice. */ sw->dispose_has_run = TRUE; /* Chain up to the parent class */ G_OBJECT_CLASS (parent_class)->dispose (obj); } static void psppire_syntax_window_class_init (PsppireSyntaxWindowClass *class) { GParamSpec *encoding_spec; GObjectClass *gobject_class = G_OBJECT_CLASS (class); gobject_class->finalize = psppire_syntax_window_finalize; GtkSourceLanguageManager *lm = gtk_source_language_manager_get_default (); const gchar * const *existing_paths = gtk_source_language_manager_get_search_path (lm); gchar **new_paths = g_strdupv ((gchar **)existing_paths); int n = g_strv_length ((gchar **) existing_paths); new_paths = g_realloc (new_paths, (n + 2) * sizeof (*new_paths)); new_paths[n] = g_strdup (relocate (PKGDATADIR)); new_paths[n+1] = NULL; lm = gtk_source_language_manager_new (); gtk_source_language_manager_set_search_path (lm, new_paths); class->lan = gtk_source_language_manager_get_language (lm, "pspp"); if (class->lan == NULL) g_warning ("pspp.lang file not found. Syntax highlighting will not be available."); parent_class = g_type_class_peek_parent (class); g_strfreev (new_paths); encoding_spec = null_if_empty_param ("encoding", "Character encoding", "IANA character encoding in this syntax file", NULL, G_PARAM_CONSTRUCT | G_PARAM_READWRITE); parent_class = g_type_class_peek_parent (class); gobject_class->set_property = psppire_syntax_window_set_property; gobject_class->get_property = psppire_syntax_window_get_property; gobject_class->dispose = psppire_syntax_window_dispose; g_object_class_install_property (gobject_class, PROP_ENCODING, encoding_spec); } static void editor_execute_syntax (const PsppireSyntaxWindow *sw, GtkTextIter start, GtkTextIter stop) { PsppireWindow *win = PSPPIRE_WINDOW (sw); struct lex_reader *reader = lex_reader_for_gtk_text_buffer (GTK_TEXT_BUFFER (sw->buffer), start, stop); lex_reader_set_file_name (reader, psppire_window_get_filename (win)); execute_syntax (psppire_default_data_window (), reader); } /* Delete the currently selected text */ static void on_edit_delete (PsppireSyntaxWindow *sw) { GtkTextIter begin, end; GtkTextBuffer *buffer = GTK_TEXT_BUFFER (sw->buffer); if (gtk_text_buffer_get_selection_bounds (buffer, &begin, &end)) gtk_text_buffer_delete (buffer, &begin, &end); } /* Create and run a dialog to collect the search string. In future this might be expanded to include options, for example backward searching, case sensitivity etc. */ static const char * get_search_text (PsppireSyntaxWindow *parent) { const char *search_text = NULL; GtkDialogFlags flags = GTK_DIALOG_DESTROY_WITH_PARENT | GTK_DIALOG_MODAL; GtkWidget *dialog = gtk_dialog_new_with_buttons (_("Text Search"), GTK_WINDOW (parent), flags, _("_OK"), GTK_RESPONSE_OK, _("_Cancel"), GTK_RESPONSE_CANCEL, NULL); GtkWidget *content_area = gtk_dialog_get_content_area (GTK_DIALOG (dialog)); GtkWidget *box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 5); GtkWidget *label = gtk_label_new (_("Text to search for:")); GtkWidget *entry = gtk_entry_new_with_buffer (parent->search_text_buffer); /* Add the label, and show everything we have added. */ gtk_container_add (GTK_CONTAINER (content_area), box); gtk_container_add (GTK_CONTAINER (box), label); gtk_container_add (GTK_CONTAINER (box), entry); gtk_widget_show_all (content_area); int result = gtk_dialog_run (GTK_DIALOG (dialog)); switch (result) { case GTK_RESPONSE_OK: search_text = gtk_entry_get_text (GTK_ENTRY (entry)); break; default: search_text = NULL; }; gtk_widget_destroy (dialog); return search_text; } /* What to do when the Find menuitem is called. */ static void on_edit_find (PsppireSyntaxWindow *sw) { GtkTextBuffer *buffer = GTK_TEXT_BUFFER (sw->buffer); GtkTextIter begin; GtkTextIter loc; const char *target = get_search_text (sw); if (target == NULL) return; /* This is a wrap-around search. So start searching one character after the current char. */ GtkTextMark *mark = gtk_text_buffer_get_insert (buffer); gtk_text_buffer_get_iter_at_mark (buffer, &begin, mark); gtk_text_iter_forward_char (&begin); if (gtk_text_iter_forward_search (&begin, target, 0, &loc, 0, 0)) { gtk_text_buffer_place_cursor (buffer, &loc); } else { /* If not found, then continue the search from the top of the buffer. */ gtk_text_buffer_get_start_iter (buffer, &begin); if (gtk_text_iter_forward_search (&begin, target, 0, &loc, 0, 0)) { gtk_text_buffer_place_cursor (buffer, &loc); } } } /* The syntax editor's clipboard deals only with text */ enum { SELECT_FMT_NULL, SELECT_FMT_TEXT, }; static void selection_changed (PsppireSyntaxWindow *sw) { gboolean sel = gtk_text_buffer_get_has_selection (GTK_TEXT_BUFFER (sw->buffer)); g_object_set (sw->edit_copy, "enabled", sel, NULL); g_object_set (sw->edit_cut, "enabled", sel, NULL); g_object_set (sw->edit_delete, "enabled", sel, NULL); } /* The callback which runs when something request clipboard data */ static void clipboard_get_cb (GtkClipboard *clipboard, GtkSelectionData *selection_data, guint info, gpointer data) { PsppireSyntaxWindow *sw = data; g_assert (info == SELECT_FMT_TEXT); gtk_selection_data_set (selection_data, gtk_selection_data_get_target (selection_data), 8, (const guchar *) sw->cliptext, strlen (sw->cliptext)); } static void clipboard_clear_cb (GtkClipboard *clipboard, gpointer data) { PsppireSyntaxWindow *sw = data; g_free (sw->cliptext); sw->cliptext = NULL; } static gchar tn1[] = "UTF8_STRING"; static gchar tn2[] = "STRING"; static gchar tn3[] = "TEXT"; static gchar tn4[] = "COMPOUND_TEXT"; static gchar tn5[] = "text/plain;charset=utf-8"; static gchar tn6[] = "text/plain"; static const GtkTargetEntry targets[] = { { tn1, 0, SELECT_FMT_TEXT }, { tn2, 0, SELECT_FMT_TEXT }, { tn3, 0, SELECT_FMT_TEXT }, { tn4, 0, SELECT_FMT_TEXT }, { tn5, 0, SELECT_FMT_TEXT }, { tn6, 0, SELECT_FMT_TEXT } }; /* Store a clip containing the currently selected text. Returns true iff something was set. As a side effect, begin and end will be set to indicate the limits of the selected text. */ static gboolean set_clip (PsppireSyntaxWindow *sw, GtkTextIter *begin, GtkTextIter *end) { GtkClipboard *clipboard ; GtkTextBuffer *buffer = GTK_TEXT_BUFFER (sw->buffer); if (! gtk_text_buffer_get_selection_bounds (buffer, begin, end)) return FALSE; g_free (sw->cliptext); sw->cliptext = gtk_text_buffer_get_text (buffer, begin, end, FALSE); clipboard = gtk_widget_get_clipboard (GTK_WIDGET (sw), GDK_SELECTION_CLIPBOARD); if (!gtk_clipboard_set_with_owner (clipboard, targets, G_N_ELEMENTS (targets), clipboard_get_cb, clipboard_clear_cb, G_OBJECT (sw))) clipboard_clear_cb (clipboard, sw); return TRUE; } static void on_edit_cut (PsppireSyntaxWindow *sw) { GtkTextIter begin, end; if (set_clip (sw, &begin, &end)) gtk_text_buffer_delete (GTK_TEXT_BUFFER (sw->buffer), &begin, &end); } static void on_edit_copy (PsppireSyntaxWindow *sw) { GtkTextIter begin, end; set_clip (sw, &begin, &end); } static void on_edit_paste (PsppireSyntaxWindow *sw) { GdkDisplay *display = gtk_widget_get_display (GTK_WIDGET (sw)); GtkClipboard *clipboard = gtk_clipboard_get_for_display (display, GDK_SELECTION_CLIPBOARD); gtk_text_buffer_paste_clipboard (GTK_TEXT_BUFFER (sw->buffer), clipboard, NULL, TRUE); } /* Check to see if CLIP holds a target which we know how to paste, and set the sensitivity of the Paste action accordingly. */ static void set_paste_sensitivity (GtkClipboard *clip, GdkEventOwnerChange *event, gpointer data) { gint i; gboolean compatible_target = FALSE; PsppireSyntaxWindow *sw = PSPPIRE_SYNTAX_WINDOW (data); for (i = 0 ; i < sizeof (targets) / sizeof (targets[0]) ; ++i) { GdkAtom atom = gdk_atom_intern (targets[i].target, TRUE); if (gtk_clipboard_wait_is_target_available (clip, atom)) { compatible_target = TRUE; break; } } g_object_set (sw->edit_paste, "enabled", compatible_target, NULL); } /* Parse and execute all the text in the buffer */ static void on_run_all (PsppireSyntaxWindow *se) { GtkTextIter begin, end; gtk_text_buffer_get_iter_at_offset (GTK_TEXT_BUFFER (se->buffer), &begin, 0); gtk_text_buffer_get_iter_at_offset (GTK_TEXT_BUFFER (se->buffer), &end, -1); editor_execute_syntax (se, begin, end); } /* Parse and execute the currently selected text */ static void on_run_selection (PsppireSyntaxWindow *se) { GtkTextIter begin, end; if (gtk_text_buffer_get_selection_bounds (GTK_TEXT_BUFFER (se->buffer), &begin, &end)) editor_execute_syntax (se, begin, end); } /* Parse and execute the from the current line, to the end of the buffer */ static void on_run_to_end (PsppireSyntaxWindow *se) { GtkTextIter begin, end; GtkTextIter here; gint line; /* Get the current line */ gtk_text_buffer_get_iter_at_mark (GTK_TEXT_BUFFER (se->buffer), &here, gtk_text_buffer_get_insert (GTK_TEXT_BUFFER (se->buffer)) ); line = gtk_text_iter_get_line (&here) ; /* Now set begin and end to the start of this line, and end of buffer respectively */ gtk_text_buffer_get_iter_at_line (GTK_TEXT_BUFFER (se->buffer), &begin, line); gtk_text_buffer_get_iter_at_line (GTK_TEXT_BUFFER (se->buffer), &end, -1); editor_execute_syntax (se, begin, end); } /* Parse and execute the current line */ static void on_run_current_line (PsppireSyntaxWindow *se) { GtkTextIter begin, end; GtkTextIter here; gint line; /* Get the current line */ gtk_text_buffer_get_iter_at_mark (GTK_TEXT_BUFFER (se->buffer), &here, gtk_text_buffer_get_insert (GTK_TEXT_BUFFER (se->buffer)) ); line = gtk_text_iter_get_line (&here) ; /* Now set begin and end to the start of this line, and start of following line respectively */ gtk_text_buffer_get_iter_at_line (GTK_TEXT_BUFFER (se->buffer), &begin, line); gtk_text_buffer_get_iter_at_line (GTK_TEXT_BUFFER (se->buffer), &end, line + 1); editor_execute_syntax (se, begin, end); } /* Append ".sps" to FILENAME if necessary. The returned result must be freed when no longer required. */ static gchar * append_suffix (const gchar *filename) { if (! g_str_has_suffix (filename, ".sps") && ! g_str_has_suffix (filename, ".SPS")) { return g_strdup_printf ("%s.sps", filename); } return xstrdup (filename); } /* Save BUFFER to the file called FILENAME. FILENAME must be encoded in Glib filename encoding. If successful, clears the buffer's modified flag. */ static gboolean save_editor_to_file (PsppireSyntaxWindow *se, const gchar *filename, GError **err) { GtkTextBuffer *buffer = GTK_TEXT_BUFFER (se->buffer); struct substring text_locale; gboolean result ; GtkTextIter start, stop; gchar *text; gchar *suffixedname; g_assert (filename); suffixedname = append_suffix (filename); gtk_text_buffer_get_iter_at_line (buffer, &start, 0); gtk_text_buffer_get_iter_at_offset (buffer, &stop, -1); text = gtk_text_buffer_get_text (buffer, &start, &stop, FALSE); text_locale = recode_substring_pool (se->encoding, "UTF-8", ss_cstr (text), NULL); result = g_file_set_contents (suffixedname, ss_data (text_locale), ss_length (text_locale), err); ss_dealloc (&text_locale); g_free (suffixedname); if (result) { char *fn = g_filename_display_name (filename); gchar *msg = g_strdup_printf (_("Saved file `%s'"), fn); g_free (fn); gtk_statusbar_push (GTK_STATUSBAR (se->sb), se->text_context, msg); gtk_text_buffer_set_modified (buffer, FALSE); g_free (msg); } return result; } /* PsppireWindow 'pick_Filename' callback. */ static void syntax_pick_filename (PsppireWindow *window) { PsppireSyntaxWindow *se = PSPPIRE_SYNTAX_WINDOW (window); const char *default_encoding; GtkFileFilter *filter; gint response; GtkWidget *dialog = gtk_file_chooser_dialog_new (_("Save Syntax"), GTK_WINDOW (se), GTK_FILE_CHOOSER_ACTION_SAVE, _("Cancel"), GTK_RESPONSE_CANCEL, _("Save"), GTK_RESPONSE_ACCEPT, NULL); g_object_set (dialog, "local-only", FALSE, NULL); filter = gtk_file_filter_new (); gtk_file_filter_set_name (filter, _("Syntax Files (*.sps) ")); gtk_file_filter_add_pattern (filter, "*.sps"); gtk_file_filter_add_pattern (filter, "*.SPS"); gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (dialog), filter); filter = gtk_file_filter_new (); gtk_file_filter_set_name (filter, _("All Files")); gtk_file_filter_add_pattern (filter, "*"); gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (dialog), filter); gtk_file_chooser_set_do_overwrite_confirmation (GTK_FILE_CHOOSER (dialog), TRUE); default_encoding = se->encoding != NULL ? se->encoding : locale_charset (); gtk_file_chooser_set_extra_widget ( GTK_FILE_CHOOSER (dialog), psppire_encoding_selector_new (default_encoding, false)); response = gtk_dialog_run (GTK_DIALOG (dialog)); if (response == GTK_RESPONSE_ACCEPT) { gchar *encoding; char *filename; filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dialog)); psppire_window_set_filename (window, filename); free (filename); encoding = psppire_encoding_selector_get_encoding ( gtk_file_chooser_get_extra_widget (GTK_FILE_CHOOSER (dialog))); if (encoding != NULL) { g_free (se->encoding); se->encoding = encoding; } } gtk_widget_destroy (dialog); } /* PsppireWindow 'save' callback. */ static void syntax_save (PsppireWindow *se) { const gchar *filename = psppire_window_get_filename (se); GError *err = NULL; save_editor_to_file (PSPPIRE_SYNTAX_WINDOW (se), filename, &err); if (err) { msg (ME, "%s", err->message); g_error_free (err); } } static void load_and_show_syntax_window (GtkWidget *se, const gchar *filename, const gchar *encoding) { gboolean ok; gtk_source_buffer_begin_not_undoable_action (PSPPIRE_SYNTAX_WINDOW (se)->buffer); ok = psppire_window_load (PSPPIRE_WINDOW (se), filename, encoding, NULL); gtk_source_buffer_end_not_undoable_action (PSPPIRE_SYNTAX_WINDOW (se)->buffer); if (ok) gtk_widget_show (se); else gtk_widget_destroy (se); } void create_syntax_window (void) { GtkWidget *w = psppire_syntax_window_new (NULL); gtk_widget_show (w); } GtkWindow * open_syntax_window (const char *file_name, const gchar *encoding) { GtkWidget *se = psppire_syntax_window_new (NULL); if (file_name) load_and_show_syntax_window (se, file_name, encoding); return GTK_WINDOW (se); } static void psppire_syntax_window_print (PsppireSyntaxWindow *window); static void on_modified_changed (GtkTextBuffer *buffer, PsppireWindow *window) { if (gtk_text_buffer_get_modified (buffer)) psppire_window_set_unsaved (window); } static void undo_redo_update (PsppireSyntaxWindow *window); static void undo_last_edit (PsppireSyntaxWindow *window); static void redo_last_edit (PsppireSyntaxWindow *window); static void on_text_changed (GtkTextBuffer *buffer, PsppireSyntaxWindow *window) { gtk_statusbar_pop (GTK_STATUSBAR (window->sb), window->text_context); undo_redo_update (window); } static void psppire_syntax_window_init (PsppireSyntaxWindow *window) { GtkBuilder *xml = builder_new ("syntax-editor.ui"); GtkWidget *box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0); GObject *menu = get_object_assert (xml, "syntax-window-menu", G_TYPE_MENU); GtkWidget *menubar = gtk_menu_bar_new_from_model (G_MENU_MODEL (menu)); GtkWidget *sw = get_widget_assert (xml, "scrolledwindow8"); GtkWidget *text_view = get_widget_assert (xml, "syntax_text_view"); PsppireSyntaxWindowClass *class = PSPPIRE_SYNTAX_WINDOW_CLASS (G_OBJECT_GET_CLASS (window)); GtkClipboard *clip_selection = gtk_widget_get_clipboard (GTK_WIDGET (window), GDK_SELECTION_CLIPBOARD); GtkClipboard *clip_primary = gtk_widget_get_clipboard (GTK_WIDGET (window), GDK_SELECTION_PRIMARY); window->print_settings = NULL; window->undo_menuitem = g_simple_action_new ("undo", NULL); window->redo_menuitem = g_simple_action_new ("redo", NULL); g_action_map_add_action (G_ACTION_MAP (window), G_ACTION (window->undo_menuitem)); g_action_map_add_action (G_ACTION_MAP (window), G_ACTION (window->redo_menuitem)); if (class->lan) window->buffer = gtk_source_buffer_new_with_language (class->lan); else window->buffer = gtk_source_buffer_new (NULL); gtk_text_view_set_buffer (GTK_TEXT_VIEW (text_view), GTK_TEXT_BUFFER (window->buffer)); g_object_set (window->buffer, "highlight-matching-brackets", TRUE, NULL); g_object_set (text_view, "show-line-numbers", TRUE, "show-line-marks", TRUE, "auto-indent", TRUE, "indent-width", 4, "highlight-current-line", TRUE, NULL); window->encoding = NULL; window->cliptext = NULL; window->dispose_has_run = FALSE; window->search_text_buffer = gtk_entry_buffer_new (NULL, -1); window->edit_delete = g_simple_action_new ("delete", NULL); g_action_map_add_action (G_ACTION_MAP (window), G_ACTION (window->edit_delete)); window->edit_copy = g_simple_action_new ("copy", NULL); g_action_map_add_action (G_ACTION_MAP (window), G_ACTION (window->edit_copy)); window->edit_cut = g_simple_action_new ("cut", NULL); g_action_map_add_action (G_ACTION_MAP (window), G_ACTION (window->edit_cut)); window->edit_paste = g_simple_action_new ("paste", NULL); g_action_map_add_action (G_ACTION_MAP (window), G_ACTION (window->edit_paste)); window->edit_find = g_simple_action_new ("find", NULL); g_action_map_add_action (G_ACTION_MAP (window), G_ACTION (window->edit_find)); window->buffer = GTK_SOURCE_BUFFER (gtk_text_view_get_buffer (GTK_TEXT_VIEW (text_view))); window->sb = get_widget_assert (xml, "statusbar2"); window->text_context = gtk_statusbar_get_context_id (GTK_STATUSBAR (window->sb), "Text Context"); g_signal_connect (window->buffer, "changed", G_CALLBACK (on_text_changed), window); g_signal_connect (window->buffer, "modified-changed", G_CALLBACK (on_modified_changed), window); { GSimpleAction *print = g_simple_action_new ("print", NULL); g_signal_connect_swapped (print, "activate", G_CALLBACK (psppire_syntax_window_print), window); g_action_map_add_action (G_ACTION_MAP (window), G_ACTION (print)); } g_signal_connect_swapped (window->undo_menuitem, "activate", G_CALLBACK (undo_last_edit), window); g_signal_connect_swapped (window->redo_menuitem, "activate", G_CALLBACK (redo_last_edit), window); undo_redo_update (window); window->sel_handler = g_signal_connect_swapped (clip_primary, "owner-change", G_CALLBACK (selection_changed), window); window->ps_handler = g_signal_connect (clip_selection, "owner-change", G_CALLBACK (set_paste_sensitivity), window); gtk_container_add (GTK_CONTAINER (window), box); g_object_ref (sw); g_object_ref (window->sb); gtk_box_pack_start (GTK_BOX (box), menubar, FALSE, TRUE, 0); gtk_box_pack_start (GTK_BOX (box), sw, TRUE, TRUE, 0); gtk_box_pack_start (GTK_BOX (box), window->sb, FALSE, TRUE, 0); gtk_widget_show_all (box); GtkApplication *app = GTK_APPLICATION (g_application_get_default ()); { GSimpleAction *open = g_simple_action_new ("open", NULL); g_action_map_add_action (G_ACTION_MAP (window), G_ACTION (open)); g_signal_connect_swapped (open, "activate", G_CALLBACK (psppire_window_open), window); } { GSimpleAction *save = g_simple_action_new ("save", NULL); g_action_map_add_action (G_ACTION_MAP (window), G_ACTION (save)); g_signal_connect_swapped (save, "activate", G_CALLBACK (psppire_window_save), window); const gchar *accels[2] = { "S", NULL}; gtk_application_set_accels_for_action (app, "win.save", accels); } { GSimpleAction *save_as = g_simple_action_new ("save_as", NULL); g_action_map_add_action (G_ACTION_MAP (window), G_ACTION (save_as)); g_signal_connect_swapped (save_as, "activate", G_CALLBACK (psppire_window_save_as), window); const gchar *accels[2] = { "S", NULL}; gtk_application_set_accels_for_action (app, "win.save_as", accels); } g_signal_connect_swapped (window->edit_delete, "activate", G_CALLBACK (on_edit_delete), window); g_signal_connect_swapped (window->edit_copy, "activate", G_CALLBACK (on_edit_copy), window); g_signal_connect_swapped (window->edit_cut, "activate", G_CALLBACK (on_edit_cut), window); g_signal_connect_swapped (window->edit_paste, "activate", G_CALLBACK (on_edit_paste), window); g_signal_connect_swapped (window->edit_find, "activate", G_CALLBACK (on_edit_find), window); { GSimpleAction *run_all = g_simple_action_new ("run-all", NULL); g_signal_connect_swapped (run_all, "activate", G_CALLBACK (on_run_all), window); g_action_map_add_action (G_ACTION_MAP (window), G_ACTION (run_all)); } { GSimpleAction *run_current_line = g_simple_action_new ("run-current-line", NULL); g_signal_connect_swapped (run_current_line, "activate", G_CALLBACK (on_run_current_line), window); g_action_map_add_action (G_ACTION_MAP (window), G_ACTION (run_current_line)); GtkApplication *app = GTK_APPLICATION (g_application_get_default ()); const gchar *accels[2] = { "R", NULL}; gtk_application_set_accels_for_action (app, "win.run-current-line", accels); } { GSimpleAction *run_selection = g_simple_action_new ("run-selection", NULL); g_signal_connect_swapped (run_selection, "activate", G_CALLBACK (on_run_selection), window); g_action_map_add_action (G_ACTION_MAP (window), G_ACTION (run_selection)); } { GSimpleAction *run_to_end = g_simple_action_new ("run-to-end", NULL); g_signal_connect_swapped (run_to_end, "activate", G_CALLBACK (on_run_to_end), window); g_action_map_add_action (G_ACTION_MAP (window), G_ACTION (run_to_end)); } gtk_menu_shell_append (GTK_MENU_SHELL (menubar), create_windows_menu (GTK_WINDOW (window))); gtk_menu_shell_append (GTK_MENU_SHELL (menubar), create_help_menu (GTK_WINDOW (window))); g_object_unref (xml); } GtkWidget * psppire_syntax_window_new (const char *encoding) { GObject *sw = g_object_new (psppire_syntax_window_get_type (), "description", _("Syntax Editor"), "encoding", encoding, NULL); GApplication *app = g_application_get_default (); gtk_application_add_window (GTK_APPLICATION (app), GTK_WINDOW (sw)); return GTK_WIDGET (sw); } static void error_dialog (GtkWindow *w, const gchar *filename, GError *err) { gchar *fn = g_filename_display_basename (filename); GtkWidget *dialog = gtk_message_dialog_new (w, GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE, _("Cannot load syntax file `%s'"), fn); g_free (fn); g_object_set (dialog, "icon-name", "pspp", NULL); gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog), "%s", err->message); gtk_dialog_run (GTK_DIALOG (dialog)); gtk_widget_destroy (dialog); } /* Loads the buffer from the file called FILENAME */ static gboolean syntax_load (PsppireWindow *window, const gchar *filename, const gchar *encoding, gpointer not_used) { GError *err = NULL; gchar *text_locale = NULL; gchar *text_utf8 = NULL; gsize len_locale = -1; gsize len_utf8 = -1; GtkTextIter iter; PsppireSyntaxWindow *sw = PSPPIRE_SYNTAX_WINDOW (window); GtkTextBuffer *buffer = GTK_TEXT_BUFFER (sw->buffer); /* FIXME: What if it's a very big file ? */ if (! g_file_get_contents (filename, &text_locale, &len_locale, &err)) { error_dialog (GTK_WINDOW (window), filename, err); g_clear_error (&err); return FALSE; } if (!encoding || !encoding[0]) { /* Determine the file's encoding and update sw->encoding. (The ordering is important here because encoding_guess_whole_file() often returns its argument instead of a copy of it.) */ char *guessed_encoding; guessed_encoding = g_strdup (encoding_guess_whole_file (sw->encoding, text_locale, len_locale)); g_free (sw->encoding); sw->encoding = guessed_encoding; } else { g_free (sw->encoding); sw->encoding = g_strdup (encoding); } text_utf8 = recode_substring_pool ("UTF-8", sw->encoding, ss_buffer (text_locale, len_locale), NULL).string; free (text_locale); if (text_utf8 == NULL) { error_dialog (GTK_WINDOW (window), filename, err); g_clear_error (&err); return FALSE; } gtk_text_buffer_get_iter_at_line (buffer, &iter, 0); gtk_text_buffer_insert (buffer, &iter, text_utf8, len_utf8); gtk_text_buffer_set_modified (buffer, FALSE); free (text_utf8); add_most_recent (filename, "text/x-spss-syntax", sw->encoding); return TRUE; } static void psppire_syntax_window_iface_init (PsppireWindowIface *iface) { iface->save = syntax_save; iface->pick_filename = syntax_pick_filename; iface->load = syntax_load; } static void undo_redo_update (PsppireSyntaxWindow *window) { g_object_set (window->undo_menuitem, "enabled", gtk_source_buffer_can_undo (window->buffer), NULL); g_object_set (window->redo_menuitem, "enabled", gtk_source_buffer_can_redo (window->buffer), NULL); } static void undo_last_edit (PsppireSyntaxWindow *window) { gtk_source_buffer_undo (window->buffer); undo_redo_update (window); } static void redo_last_edit (PsppireSyntaxWindow *window) { gtk_source_buffer_redo (window->buffer); undo_redo_update (window); } /* Printing related stuff */ static void begin_print (GtkPrintOperation *operation, GtkPrintContext *context, PsppireSyntaxWindow *window) { window->compositor = gtk_source_print_compositor_new (window->buffer); } static void end_print (GtkPrintOperation *operation, GtkPrintContext *context, PsppireSyntaxWindow *window) { g_object_unref (window->compositor); window->compositor = NULL; } static gboolean paginate (GtkPrintOperation *operation, GtkPrintContext *context, PsppireSyntaxWindow *window) { if (gtk_source_print_compositor_paginate (window->compositor, context)) { gint n_pages = gtk_source_print_compositor_get_n_pages (window->compositor); gtk_print_operation_set_n_pages (operation, n_pages); return TRUE; } return FALSE; } static void draw_page (GtkPrintOperation *operation, GtkPrintContext *context, gint page_nr, PsppireSyntaxWindow *window) { gtk_source_print_compositor_draw_page (window->compositor, context, page_nr); } static void psppire_syntax_window_print (PsppireSyntaxWindow *window) { GtkPrintOperationResult res; GtkPrintOperation *print = gtk_print_operation_new (); if (window->print_settings != NULL) gtk_print_operation_set_print_settings (print, window->print_settings); g_signal_connect (print, "begin_print", G_CALLBACK (begin_print), window); g_signal_connect (print, "end_print", G_CALLBACK (end_print), window); g_signal_connect (print, "draw_page", G_CALLBACK (draw_page), window); g_signal_connect (print, "paginate", G_CALLBACK (paginate), window); res = gtk_print_operation_run (print, GTK_PRINT_OPERATION_ACTION_PRINT_DIALOG, GTK_WINDOW (window), NULL); if (res == GTK_PRINT_OPERATION_RESULT_APPLY) { if (window->print_settings != NULL) g_object_unref (window->print_settings); window->print_settings = g_object_ref (gtk_print_operation_get_print_settings (print)); } g_object_unref (print); } pspp-1.4.1/src/ui/gui/psppire-dialog-action-roc.h0000644000175000017500000000465413320146056021240 0ustar00blpblp00000000000000/* PSPPIRE - a graphical user interface for PSPP. Copyright (C) 2012 Free Software Foundation 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 3 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, see . */ #include #include #include "psppire-dialog-action.h" #ifndef __PSPPIRE_DIALOG_ACTION_ROC_H__ #define __PSPPIRE_DIALOG_ACTION_ROC_H__ G_BEGIN_DECLS #define PSPPIRE_TYPE_DIALOG_ACTION_ROC (psppire_dialog_action_roc_get_type ()) #define PSPPIRE_DIALOG_ACTION_ROC(obj) \ (G_TYPE_CHECK_INSTANCE_CAST ((obj), \ PSPPIRE_TYPE_DIALOG_ACTION_ROC, PsppireDialogActionRoc)) #define PSPPIRE_DIALOG_ACTION_ROC_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST ((klass), \ PSPPIRE_TYPE_DIALOG_ACTION_ROC, \ PsppireDialogActionRocClass)) #define PSPPIRE_IS_DIALOG_ACTION_ROC(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE ((obj), PSPPIRE_TYPE_DIALOG_ACTION_ROC)) #define PSPPIRE_IS_DIALOG_ACTION_ROC_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE ((klass), PSPPIRE_TYPE_DIALOG_ACTION_ROC)) #define PSPPIRE_DIALOG_ACTION_ROC_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), \ PSPPIRE_TYPE_DIALOG_ACTION_ROC, \ PsppireDialogActionRocClass)) typedef struct _PsppireDialogActionRoc PsppireDialogActionRoc; typedef struct _PsppireDialogActionRocClass PsppireDialogActionRocClass; struct _PsppireDialogActionRoc { PsppireDialogAction parent; /*< private >*/ gboolean dispose_has_run ; GtkWidget *test_variables; GtkWidget *state_variable; GtkWidget *state_value ; GtkWidget *curve ; GtkWidget *reference ; GtkWidget *standard_error; GtkWidget *coordinates ; }; struct _PsppireDialogActionRocClass { PsppireDialogActionClass parent_class; }; GType psppire_dialog_action_roc_get_type (void) ; G_END_DECLS #endif /* __PSPPIRE_DIALOG_ACTION_ROC_H__ */ pspp-1.4.1/src/ui/gui/psppire-dialog-action-recode-different.h0000644000175000017500000000511513320146056023653 0ustar00blpblp00000000000000/* PSPPIRE - a graphical user interface for PSPP. Copyright (C) 2012 Free Software Foundation 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 3 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, see . */ #include #include #include "psppire-dialog-action-recode.h" #ifndef __PSPPIRE_DIALOG_ACTION_RECODE_DIFFERENT_H__ #define __PSPPIRE_DIALOG_ACTION_RECODE_DIFFERENT_H__ G_BEGIN_DECLS #define PSPPIRE_TYPE_DIALOG_ACTION_RECODE_DIFFERENT (psppire_dialog_action_recode_different_get_type ()) #define PSPPIRE_DIALOG_ACTION_RECODE_DIFFERENT(obj) \ (G_TYPE_CHECK_INSTANCE_CAST ((obj), \ PSPPIRE_TYPE_DIALOG_ACTION_RECODE_DIFFERENT, PsppireDialogActionRecodeDifferent)) #define PSPPIRE_DIALOG_ACTION_RECODE_DIFFERENT_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST ((klass), \ PSPPIRE_TYPE_DIALOG_ACTION_RECODE_DIFFERENT, \ PsppireDialogActionRecodeDifferentClass)) #define PSPPIRE_IS_DIALOG_ACTION_RECODE_DIFFERENT(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE ((obj), PSPPIRE_TYPE_DIALOG_ACTION_RECODE_DIFFERENT)) #define PSPPIRE_IS_DIALOG_ACTION_RECODE_DIFFERENT_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE ((klass), PSPPIRE_TYPE_DIALOG_ACTION_RECODE_DIFFERENT)) #define PSPPIRE_DIALOG_ACTION_RECODE_DIFFERENT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), \ PSPPIRE_TYPE_DIALOG_ACTION_RECODE_DIFFERENT, \ PsppireDialogActionRecodeDifferentClass)) typedef struct _PsppireDialogActionRecodeDifferent PsppireDialogActionRecodeDifferent; typedef struct _PsppireDialogActionRecodeDifferentClass PsppireDialogActionRecodeDifferentClass; struct _PsppireDialogActionRecodeDifferent { PsppireDialogActionRecode parent; /* A hash table of struct nlp's indexed by variable */ GHashTable *varmap; }; struct _PsppireDialogActionRecodeDifferentClass { PsppireDialogActionRecodeClass parent_class; }; GType psppire_dialog_action_recode_different_get_type (void) ; G_END_DECLS #endif /* __PSPPIRE_DIALOG_ACTION_RECODE_DIFFERENT_H__ */ pspp-1.4.1/src/ui/gui/var-display.h0000644000175000017500000000175013320146056016512 0ustar00blpblp00000000000000/* PSPPIRE - a graphical user interface for PSPP. Copyright (C) 2007, 2011, 2013 Free Software Foundation 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 3 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, see . */ #ifndef VAR_DISPLAY_H #define VAR_DISPLAY 1 #include #include #include "psppire-dict.h" struct variable; #define n_ALIGNMENTS 3 gchar *missing_values_to_string (const struct variable *pv, GError **err); #endif pspp-1.4.1/src/ui/gui/psppire-dialog-action-paired.h0000644000175000017500000000464213320146056021716 0ustar00blpblp00000000000000/* PSPPIRE - a graphical user interface for PSPP. Copyright (C) 2013 Free Software Foundation 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 3 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, see . */ #include #include #include "psppire-dialog-action.h" #ifndef __PSPPIRE_DIALOG_ACTION_PAIRED_H__ #define __PSPPIRE_DIALOG_ACTION_PAIRED_H__ G_BEGIN_DECLS #define PSPPIRE_TYPE_DIALOG_ACTION_PAIRED (psppire_dialog_action_paired_get_type ()) #define PSPPIRE_DIALOG_ACTION_PAIRED(obj) \ (G_TYPE_CHECK_INSTANCE_CAST ((obj), \ PSPPIRE_TYPE_DIALOG_ACTION_PAIRED, PsppireDialogActionPaired)) #define PSPPIRE_DIALOG_ACTION_PAIRED_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST ((klass), \ PSPPIRE_TYPE_DIALOG_ACTION_PAIRED, \ PsppireDialogActionPairedClass)) #define PSPPIRE_IS_DIALOG_ACTION_PAIRED(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE ((obj), PSPPIRE_TYPE_DIALOG_ACTION_PAIRED)) #define PSPPIRE_IS_DIALOG_ACTION_PAIRED_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE ((klass), PSPPIRE_TYPE_DIALOG_ACTION_PAIRED)) #define PSPPIRE_DIALOG_ACTION_PAIRED_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), \ PSPPIRE_TYPE_DIALOG_ACTION_PAIRED, \ PsppireDialogActionPairedClass)) typedef struct _PsppireDialogActionPaired PsppireDialogActionPaired; typedef struct _PsppireDialogActionPairedClass PsppireDialogActionPairedClass; struct tt_options_dialog; struct _PsppireDialogActionPaired { PsppireDialogAction parent; /*< private >*/ gboolean dispose_has_run; GtkWidget *pairs_treeview ; GtkListStore *list_store ; struct tt_options_dialog *opt; }; struct _PsppireDialogActionPairedClass { PsppireDialogActionClass parent_class; }; GType psppire_dialog_action_paired_get_type (void) ; G_END_DECLS #endif /* __PSPPIRE_DIALOG_ACTION_PAIRED_H__ */ pspp-1.4.1/src/ui/gui/psppire-dialog-action-kmeans.c0000644000175000017500000000654013670210420021715 0ustar00blpblp00000000000000/* PSPPIRE - a graphical user interface for PSPP. Copyright (C) 2012 Free Software Foundation 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 3 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, see . */ #include #include "psppire-dialog-action-kmeans.h" #include "psppire-var-view.h" #include #include "psppire-dialog.h" #include "builder-wrapper.h" static void psppire_dialog_action_kmeans_init (PsppireDialogActionKmeans *act); static void psppire_dialog_action_kmeans_class_init (PsppireDialogActionKmeansClass *class); G_DEFINE_TYPE (PsppireDialogActionKmeans, psppire_dialog_action_kmeans, PSPPIRE_TYPE_DIALOG_ACTION); static char * generate_syntax (const PsppireDialogAction *act) { PsppireDialogActionKmeans *km = PSPPIRE_DIALOG_ACTION_KMEANS (act); gchar *text; GString *string = g_string_new ("QUICK CLUSTER "); psppire_var_view_append_names (PSPPIRE_VAR_VIEW (km->variables), 0, string); g_string_append_printf (string, "\n\t/CRITERIA=CLUSTERS(%d)", atoi (gtk_entry_get_text (GTK_ENTRY (km->entry)))); g_string_append (string, ".\n"); text = string->str; g_string_free (string, FALSE); return text; } static gboolean dialog_state_valid (gpointer user_data) { PsppireDialogActionKmeans *fd = user_data; GtkTreeModel *liststore = gtk_tree_view_get_model (GTK_TREE_VIEW (fd->variables)); if (gtk_tree_model_iter_n_children (liststore, NULL) < 2) return FALSE; if (atoi (gtk_entry_get_text (GTK_ENTRY (fd->entry))) < 2) return FALSE; return TRUE; } static void refresh (PsppireDialogAction *fd_) { PsppireDialogActionKmeans *fd = PSPPIRE_DIALOG_ACTION_KMEANS (fd_); GtkTreeModel *liststore = gtk_tree_view_get_model (GTK_TREE_VIEW (fd->variables)); gtk_list_store_clear (GTK_LIST_STORE (liststore)); gtk_entry_set_text (GTK_ENTRY (fd->entry), ""); } static GtkBuilder * psppire_dialog_action_kmeans_activate (PsppireDialogAction *a, GVariant *param) { PsppireDialogActionKmeans *act = PSPPIRE_DIALOG_ACTION_KMEANS (a); PsppireDialogAction *pda = PSPPIRE_DIALOG_ACTION (a); GtkBuilder *xml = builder_new ("k-means.ui"); pda->dialog = get_widget_assert (xml, "k-means-dialog"); pda->source = get_widget_assert (xml, "dict-view"); act->entry = get_widget_assert (xml, "entry1"); act->variables = get_widget_assert (xml, "psppire-var-view1"); psppire_dialog_action_set_refresh (pda, refresh); psppire_dialog_action_set_valid_predicate (pda, dialog_state_valid); return xml; } static void psppire_dialog_action_kmeans_class_init (PsppireDialogActionKmeansClass *class) { PSPPIRE_DIALOG_ACTION_CLASS (class)->initial_activate = psppire_dialog_action_kmeans_activate; PSPPIRE_DIALOG_ACTION_CLASS (class)->generate_syntax = generate_syntax; } static void psppire_dialog_action_kmeans_init (PsppireDialogActionKmeans *act) { } pspp-1.4.1/src/ui/gui/psppire-dialog-action-comments.h0000644000175000017500000000452713320146056022301 0ustar00blpblp00000000000000/* PSPPIRE - a graphical user interface for PSPP. Copyright (C) 2015 Free Software Foundation 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 3 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, see . */ #include #include #include "psppire-dialog-action.h" #ifndef __PSPPIRE_DIALOG_ACTION_COMMENTS_H__ #define __PSPPIRE_DIALOG_ACTION_COMMENTS_H__ G_BEGIN_DECLS #define PSPPIRE_TYPE_DIALOG_ACTION_COMMENTS (psppire_dialog_action_comments_get_type ()) #define PSPPIRE_DIALOG_ACTION_COMMENTS(obj) \ (G_TYPE_CHECK_INSTANCE_CAST ((obj), \ PSPPIRE_TYPE_DIALOG_ACTION_COMMENTS, PsppireDialogActionComments)) #define PSPPIRE_DIALOG_ACTION_COMMENTS_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST ((klass), \ PSPPIRE_TYPE_DIALOG_ACTION_COMMENTS, \ PsppireDialogActionCommentsClass)) #define PSPPIRE_IS_DIALOG_ACTION_COMMENTS(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE ((obj), PSPPIRE_TYPE_DIALOG_ACTION_COMMENTS)) #define PSPPIRE_IS_DIALOG_ACTION_COMMENTS_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE ((klass), PSPPIRE_TYPE_DIALOG_ACTION_COMMENTS)) #define PSPPIRE_DIALOG_ACTION_COMMENTS_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), \ PSPPIRE_TYPE_DIALOG_ACTION_COMMENTS, \ PsppireDialogActionCommentsClass)) typedef struct _PsppireDialogActionComments PsppireDialogActionComments; typedef struct _PsppireDialogActionCommentsClass PsppireDialogActionCommentsClass; struct _PsppireDialogActionComments { PsppireDialogAction parent; GtkWidget *textview; GtkWidget *check; }; struct _PsppireDialogActionCommentsClass { PsppireDialogActionClass parent_class; }; GType psppire_dialog_action_comments_get_type (void) ; G_END_DECLS #endif /* __PSPPIRE_DIALOG_ACTION_COMMENTS_H__ */ pspp-1.4.1/src/ui/gui/psppire-dialog-action-binomial.h0000644000175000017500000000473713320146056022251 0ustar00blpblp00000000000000/* PSPPIRE - a graphical user interface for PSPP. Copyright (C) 2012 Free Software Foundation 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 3 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, see . */ #include #include #include "psppire-dialog-action.h" #ifndef __PSPPIRE_DIALOG_ACTION_BINOMIAL_H__ #define __PSPPIRE_DIALOG_ACTION_BINOMIAL_H__ G_BEGIN_DECLS #define PSPPIRE_TYPE_DIALOG_ACTION_BINOMIAL (psppire_dialog_action_binomial_get_type ()) #define PSPPIRE_DIALOG_ACTION_BINOMIAL(obj) \ (G_TYPE_CHECK_INSTANCE_CAST ((obj), \ PSPPIRE_TYPE_DIALOG_ACTION_BINOMIAL, PsppireDialogActionBinomial)) #define PSPPIRE_DIALOG_ACTION_BINOMIAL_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST ((klass), \ PSPPIRE_TYPE_DIALOG_ACTION_BINOMIAL, \ PsppireDialogActionBinomialClass)) #define PSPPIRE_IS_DIALOG_ACTION_BINOMIAL(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE ((obj), PSPPIRE_TYPE_DIALOG_ACTION_BINOMIAL)) #define PSPPIRE_IS_DIALOG_ACTION_BINOMIAL_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE ((klass), PSPPIRE_TYPE_DIALOG_ACTION_BINOMIAL)) #define PSPPIRE_DIALOG_ACTION_BINOMIAL_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), \ PSPPIRE_TYPE_DIALOG_ACTION_BINOMIAL, \ PsppireDialogActionBinomialClass)) typedef struct _PsppireDialogActionBinomial PsppireDialogActionBinomial; typedef struct _PsppireDialogActionBinomialClass PsppireDialogActionBinomialClass; struct _PsppireDialogActionBinomial { PsppireDialogAction parent; /*< private >*/ gboolean dispose_has_run ; GtkWidget *var_view; GtkWidget *button1; GtkWidget *prop_entry; GtkWidget *cutpoint_entry; GtkWidget *cutpoint_button; }; struct _PsppireDialogActionBinomialClass { PsppireDialogActionClass parent_class; }; GType psppire_dialog_action_binomial_get_type (void) ; G_END_DECLS #endif /* __PSPPIRE_DIALOG_ACTION_BINOMIAL_H__ */ pspp-1.4.1/src/ui/gui/psppire-dialog-action-means.c0000644000175000017500000001011713670210420021535 0ustar00blpblp00000000000000/* PSPPIRE - a graphical user interface for PSPP. Copyright (C) 2012 Free Software Foundation 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 3 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, see . */ #include #include "psppire-dialog-action-means.h" #include "psppire-means-layer.h" #include "psppire-var-view.h" #include "psppire-dict.h" #include "psppire-dialog.h" #include "builder-wrapper.h" #include "gettext.h" #define _(msgid) gettext (msgid) #define N_(msgid) msgid static void psppire_dialog_action_means_class_init (PsppireDialogActionMeansClass *class); G_DEFINE_TYPE (PsppireDialogActionMeans, psppire_dialog_action_means, PSPPIRE_TYPE_DIALOG_ACTION); static char * generate_syntax (const PsppireDialogAction *act) { gint l; PsppireDialogActionMeans *scd = PSPPIRE_DIALOG_ACTION_MEANS (act); gchar *text; GString *string = g_string_new ("MEANS TABLES = "); PsppireMeansLayer *layer = PSPPIRE_MEANS_LAYER (scd->layer); psppire_var_view_append_names (PSPPIRE_VAR_VIEW (scd->variables), 0, string); for (l = 0; l < layer->n_layers; ++l) { GtkTreeIter iter; GtkTreeModel *m = psppire_means_layer_get_model_n (layer, l); gboolean ok = gtk_tree_model_get_iter_first (m, &iter); if (ok) g_string_append (string, "\n\tBY"); for (; ok; ok = gtk_tree_model_iter_next (m, &iter)) { const struct variable *var = psppire_var_view_get_var_from_model (m, 0, &iter); g_string_append (string, " "); g_string_append (string, var_get_name (var)); } } g_string_append (string, ".\n"); text = string->str; g_string_free (string, FALSE); return text; } static gboolean dialog_state_valid (PsppireDialogAction *da) { PsppireDialogActionMeans *pdm = PSPPIRE_DIALOG_ACTION_MEANS (da); GtkTreeIter notused; GtkTreeModel *vars = gtk_tree_view_get_model (GTK_TREE_VIEW (pdm->variables)); return gtk_tree_model_get_iter_first (vars, ¬used); } static void dialog_refresh (PsppireDialogAction *da) { PsppireDialogActionMeans *pdm = PSPPIRE_DIALOG_ACTION_MEANS (da); GtkTreeModel *liststore = gtk_tree_view_get_model (GTK_TREE_VIEW (pdm->variables)); gtk_list_store_clear (GTK_LIST_STORE (liststore)); psppire_means_layer_clear (PSPPIRE_MEANS_LAYER (pdm->layer)); } static GtkBuilder * psppire_dialog_action_means_activate (PsppireDialogAction *a, GVariant *param) { PsppireDialogAction *pda = PSPPIRE_DIALOG_ACTION (a); PsppireDialogActionMeans *act = PSPPIRE_DIALOG_ACTION_MEANS (a); GtkBuilder *xml = builder_new ("means.ui"); GtkWidget *vb = get_widget_assert (xml, "frame2"); act->layer = psppire_means_layer_new (); gtk_container_add (GTK_CONTAINER (vb), act->layer); gtk_widget_show (act->layer); GtkWidget *selector = get_widget_assert (xml, "layer-selector"); pda->dialog = get_widget_assert (xml, "means-dialog"); pda->source = get_widget_assert (xml, "all-variables"); act->variables = get_widget_assert (xml, "stat-variables"); g_object_set (pda->source, "predicate", var_is_numeric, NULL); g_object_set (selector, "dest-widget", act->layer, NULL); psppire_dialog_action_set_valid_predicate (pda, (void *) dialog_state_valid); psppire_dialog_action_set_refresh (pda, dialog_refresh); return xml; } static void psppire_dialog_action_means_class_init (PsppireDialogActionMeansClass *class) { PSPPIRE_DIALOG_ACTION_CLASS (class)->initial_activate = psppire_dialog_action_means_activate; PSPPIRE_DIALOG_ACTION_CLASS (class)->generate_syntax = generate_syntax; } static void psppire_dialog_action_means_init (PsppireDialogActionMeans *act) { } pspp-1.4.1/src/ui/gui/psppire-dialog-action-aggregate.c0000644000175000017500000004655713670210420022401 0ustar00blpblp00000000000000/* PSPPIRE - a graphical user interface for PSPP. Copyright (C) 2015 Free Software Foundation 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 3 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, see . */ #include #include "psppire-dialog-action-aggregate.h" #include "dialog-common.h" #include #include "psppire-var-view.h" #include "psppire-selector.h" #include "psppire-acr.h" #include #include "psppire-dialog.h" #include "builder-wrapper.h" #include #include #include #include "gettext.h" #define _(msgid) gettext (msgid) #define N_(msgid) msgid static void psppire_dialog_action_aggregate_init (PsppireDialogActionAggregate *act); static void psppire_dialog_action_aggregate_class_init (PsppireDialogActionAggregateClass *class); G_DEFINE_TYPE (PsppireDialogActionAggregate, psppire_dialog_action_aggregate, PSPPIRE_TYPE_DIALOG_ACTION); static void append_summary_spec (const PsppireDialogActionAggregate *agg, GtkTreeIter *iter, GString *string); static void append_summary_variable_syntax (const PsppireDialogActionAggregate *agg, GString *string) { GtkTreeIter iter; GtkTreeModel *acr_model = GTK_TREE_MODEL (PSPPIRE_ACR (agg->summary_acr)->list_store); gboolean ok; for (ok = gtk_tree_model_get_iter_first (GTK_TREE_MODEL (acr_model), &iter); ok ; ok = gtk_tree_model_iter_next (GTK_TREE_MODEL (acr_model), &iter) ) { g_string_append (string, "\n\t/"); append_summary_spec (agg, &iter, string); } } static void append_destination_filename (const PsppireDialogActionAggregate *agg, GString *gs) { if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (agg->filename_radiobutton))) { struct string ss; const gchar *s = gtk_label_get_text (GTK_LABEL (agg->filename_label)); ds_init_empty (&ss); syntax_gen_string (&ss, ss_cstr (s)); g_string_append (gs, ds_cstr (&ss)); ds_destroy (&ss); } else { g_string_append (gs, "* "); if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (agg->replace_radiobutton))) g_string_append (gs, "MODE=REPLACE"); else g_string_append (gs, "MODE=ADDVARIABLES"); } } static char * generate_syntax (const PsppireDialogAction *act) { PsppireDialogActionAggregate *agg = PSPPIRE_DIALOG_ACTION_AGGREGATE (act); gchar *text; GString *string = g_string_new ("AGGREGATE OUTFILE="); append_destination_filename (agg, string); if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (agg->sorted_button))) g_string_append (string, "\n\t/PRESORTED"); g_string_append (string, "\n\t/BREAK="); psppire_var_view_append_names (PSPPIRE_VAR_VIEW (agg->break_variables), 0, string); append_summary_variable_syntax (agg, string); g_string_append (string, ".\n"); text = string->str; g_string_free (string, FALSE); return text; } static gboolean dialog_state_valid (gpointer user_data) { PsppireDialogActionAggregate *agg = user_data; GtkTreeIter iter; GtkTreeModel *liststore = gtk_tree_view_get_model (GTK_TREE_VIEW (agg->break_variables)); if (! gtk_tree_model_get_iter_first (liststore, &iter)) return FALSE; liststore = GTK_TREE_MODEL (PSPPIRE_ACR (agg->summary_acr)->list_store); if (! gtk_tree_model_get_iter_first (liststore, &iter)) return FALSE; return TRUE; } static void update_arguments (PsppireDialogActionAggregate *agg); static void refresh (PsppireDialogAction *fd_) { PsppireDialogActionAggregate *agg = PSPPIRE_DIALOG_ACTION_AGGREGATE (fd_); GtkTreeModel *liststore = gtk_tree_view_get_model (GTK_TREE_VIEW (agg->break_variables)); gtk_list_store_clear (GTK_LIST_STORE (liststore)); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (agg->add_radiobutton), TRUE); gtk_label_set_text (GTK_LABEL (agg->filename_label), ""); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (agg->needs_sort_button), TRUE); gtk_entry_set_text (GTK_ENTRY (agg->summary_sv_entry), ""); gtk_entry_set_text (GTK_ENTRY (agg->summary_arg1_entry), ""); gtk_entry_set_text (GTK_ENTRY (agg->summary_arg2_entry), ""); gtk_entry_set_text (GTK_ENTRY (agg->summary_var_label_entry), ""); gtk_entry_set_text (GTK_ENTRY (agg->summary_var_name_entry), "N_BREAK"); gtk_editable_select_region (GTK_EDITABLE (agg->summary_var_name_entry), 0, -1); gtk_combo_box_set_active (GTK_COMBO_BOX (agg->function_combo), N); gtk_list_store_clear (PSPPIRE_ACR (agg->summary_acr)->list_store); update_arguments (agg); } enum { COMBO_MODEL_COL_DESC = 0, COMBO_MODEL_COL_SYNTAX, COMBO_MODEL_COL_SRC_VARS, COMBO_MODEL_COL_ARITY }; static void render_summary (GtkTreeViewColumn *tree_column, GtkCellRenderer *cell, GtkTreeModel *tree_model, GtkTreeIter *iter, gpointer data) { PsppireDialogActionAggregate *agg = data; GString *string = g_string_new (""); append_summary_spec (agg, iter, string); g_object_set (cell, "text", string->str, NULL); g_string_free (string, TRUE); } static void choose_filename (PsppireDialogActionAggregate *fd) { GtkFileFilter *filter; GtkWidget *dialog = gtk_file_chooser_dialog_new (_("Aggregate destination file"), GTK_WINDOW (PSPPIRE_DIALOG_ACTION (fd)->toplevel), GTK_FILE_CHOOSER_ACTION_SAVE, _("Cancel"), GTK_RESPONSE_CANCEL, _("Save"), GTK_RESPONSE_ACCEPT, NULL); g_object_set (dialog, "local-only", FALSE, NULL); gtk_file_chooser_set_do_overwrite_confirmation (GTK_FILE_CHOOSER (dialog), TRUE); filter = gtk_file_filter_new (); gtk_file_filter_set_name (filter, _("System Files (*.sav)")); gtk_file_filter_add_mime_type (filter, "application/x-spss-sav"); gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (dialog), filter); filter = gtk_file_filter_new (); gtk_file_filter_set_name (filter, _("Compressed System Files (*.zsav)")); gtk_file_filter_add_pattern (filter, "*.zsav"); gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (dialog), filter); filter = gtk_file_filter_new (); gtk_file_filter_set_name (filter, _("Portable Files (*.por) ")); gtk_file_filter_add_mime_type (filter, "application/x-spss-por"); gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (dialog), filter); if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_ACCEPT) { char *filename; filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dialog)); gtk_label_set_text (GTK_LABEL (fd->filename_label), filename); g_free (filename); } gtk_widget_destroy (dialog); } static void populate_combo_model (GtkComboBox *cb) { GtkListStore *list = gtk_list_store_new (4, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_INT, G_TYPE_INT); GtkTreeIter iter; const struct agr_func *af = agr_func_tab; GtkCellRenderer *renderer ; for (af = agr_func_tab; af->name; ++af) { const gchar *s = af->description; if (s == NULL) continue; gtk_list_store_append (list, &iter); gtk_list_store_set (list, &iter, COMBO_MODEL_COL_DESC, gettext (s), COMBO_MODEL_COL_SYNTAX, af->name, COMBO_MODEL_COL_SRC_VARS, af->src_vars, COMBO_MODEL_COL_ARITY, af->n_args, -1); } renderer = gtk_cell_renderer_text_new (); gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (cb), renderer, FALSE); gtk_cell_layout_add_attribute (GTK_CELL_LAYOUT (cb), renderer, "text", 0); gtk_combo_box_set_model (GTK_COMBO_BOX (cb), GTK_TREE_MODEL (list)); g_object_unref (list); } enum { SUMMARY_COL_VARNAME = 0, SUMMARY_COL_VARLABEL, SUMMARY_COL_FUNCIDX, SUMMARY_COL_SRCVAR, SUMMARY_COL_ARG1, SUMMARY_COL_ARG2 }; /* Set VAL to the value appropriate for COL according to the current state of the dialog */ static gboolean get_summary_spec (gint col, GValue *val, gpointer data) { PsppireDialogActionAggregate *agg = PSPPIRE_DIALOG_ACTION_AGGREGATE (data); switch (col) { case SUMMARY_COL_VARNAME: g_value_init (val, G_TYPE_STRING); g_value_set_string (val, gtk_entry_get_text (GTK_ENTRY (agg->summary_var_name_entry))); break; case SUMMARY_COL_VARLABEL: g_value_init (val, G_TYPE_STRING); g_value_set_string (val, gtk_entry_get_text (GTK_ENTRY (agg->summary_var_label_entry))); break; case SUMMARY_COL_SRCVAR: g_value_init (val, G_TYPE_STRING); g_value_set_string (val, gtk_entry_get_text (GTK_ENTRY (agg->summary_sv_entry))); break; case SUMMARY_COL_FUNCIDX: g_value_init (val, G_TYPE_INT); g_value_set_int (val, gtk_combo_box_get_active (GTK_COMBO_BOX (agg->function_combo))); break; case SUMMARY_COL_ARG1: { const gchar *text = gtk_entry_get_text (GTK_ENTRY (agg->summary_arg1_entry)); g_value_init (val, G_TYPE_DOUBLE); g_value_set_double (val, g_strtod (text, 0)); } break; case SUMMARY_COL_ARG2: { const gchar *text = gtk_entry_get_text (GTK_ENTRY (agg->summary_arg2_entry)); g_value_init (val, G_TYPE_DOUBLE); g_value_set_double (val, g_strtod (text, 0)); } break; default: g_assert_not_reached (); break; } return TRUE; } /* Returns TRUE iff all the necessary controls have been set to completely specify a summary function */ static gboolean summary_complete (const PsppireDialogActionAggregate *agg) { GtkTreeIter iter; int n_args; enum agr_src_vars src_vars; gboolean ok; GtkTreeModel *model = gtk_combo_box_get_model (GTK_COMBO_BOX (agg->function_combo)); if (0 == strcmp ("", gtk_entry_get_text (GTK_ENTRY (agg->summary_var_name_entry)))) return FALSE; ok = gtk_combo_box_get_active_iter (GTK_COMBO_BOX (agg->function_combo), &iter); if (! ok) return FALSE; gtk_tree_model_get (model, &iter, COMBO_MODEL_COL_ARITY, &n_args, COMBO_MODEL_COL_SRC_VARS, &src_vars, -1); if (src_vars == AGR_SV_YES) { if (0 == strcmp ("", gtk_entry_get_text (GTK_ENTRY (agg->summary_sv_entry)))) return FALSE; } if (n_args >= 2) { if (0 == strcmp ("", gtk_entry_get_text (GTK_ENTRY (agg->summary_arg2_entry)))) return FALSE; } if (n_args >= 1) { if (0 == strcmp ("", gtk_entry_get_text (GTK_ENTRY (agg->summary_arg1_entry)))) return FALSE; } return TRUE; } /* Enable/Disable the summary variable ACR */ static void update_acr (PsppireDialogActionAggregate *agg) { gboolean ready = summary_complete (agg); psppire_acr_set_enabled (PSPPIRE_ACR (agg->summary_acr), ready); } /* Update the status of the dialog box according to what row of the ACR's treeview is selected */ static void on_acr_change (const PsppireDialogActionAggregate *agg, GtkTreeView *tv) { const gchar *varname = ""; const gchar *label = ""; const gchar *srcvar = ""; gint f_idx = 0; double arg1, arg2; gchar *text1 = g_strdup (""); gchar *text2 = g_strdup (""); GtkTreeIter iter; GtkTreeModel *model = gtk_tree_view_get_model (tv); GtkTreeSelection *sel = gtk_tree_view_get_selection (tv); if (gtk_tree_selection_get_selected (sel, &model, &iter)) { gtk_tree_model_get (model, &iter, SUMMARY_COL_VARNAME, &varname, SUMMARY_COL_VARLABEL, &label, SUMMARY_COL_FUNCIDX, &f_idx, SUMMARY_COL_SRCVAR, &srcvar, SUMMARY_COL_ARG1, &arg1, SUMMARY_COL_ARG2, &arg2, -1); gtk_entry_set_text (GTK_ENTRY (agg->summary_var_name_entry), varname); gtk_entry_set_text (GTK_ENTRY (agg->summary_var_label_entry), label); gtk_entry_set_text (GTK_ENTRY (agg->summary_sv_entry), srcvar); text1 = c_xasprintf ("%.*g", DBL_DIG + 1, arg1); text2 = c_xasprintf ("%.*g", DBL_DIG + 1, arg2); } gtk_entry_set_text (GTK_ENTRY (agg->summary_arg1_entry), text1); g_free (text1); gtk_entry_set_text (GTK_ENTRY (agg->summary_arg2_entry), text2); g_free (text2); gtk_combo_box_set_active (GTK_COMBO_BOX (agg->function_combo), f_idx); } /* Update the sensitivity of the summary variable argument fields */ static void update_arguments (PsppireDialogActionAggregate *agg) { GtkTreeIter iter; gboolean ok = gtk_combo_box_get_active_iter (GTK_COMBO_BOX (agg->function_combo), &iter); if (ok) { GtkTreeModel *model = gtk_combo_box_get_model (GTK_COMBO_BOX (agg->function_combo)); int n_args; enum agr_src_vars src_vars; gtk_tree_model_get (model, &iter, COMBO_MODEL_COL_ARITY, &n_args, COMBO_MODEL_COL_SRC_VARS, &src_vars, -1); gtk_widget_set_sensitive (agg->summary_sv, src_vars != AGR_SV_NO); gtk_widget_set_sensitive (agg->summary_arg2, n_args >= 2); gtk_widget_set_sensitive (agg->summary_arg1, n_args >= 1); } else { gtk_widget_set_sensitive (agg->summary_sv, FALSE); gtk_widget_set_sensitive (agg->summary_arg2, FALSE); gtk_widget_set_sensitive (agg->summary_arg1, FALSE); } } static GtkBuilder * psppire_dialog_action_aggregate_activate (PsppireDialogAction *a, GVariant *param) { PsppireDialogActionAggregate *act = PSPPIRE_DIALOG_ACTION_AGGREGATE (a); PsppireDialogAction *pda = PSPPIRE_DIALOG_ACTION (a); GtkBuilder *xml = builder_new ("aggregate.ui"); pda->dialog = get_widget_assert (xml, "aggregate-dialog"); pda->source = get_widget_assert (xml, "dict-view"); GtkWidget *break_selector = get_widget_assert (xml, "break-selector"); act->pane = get_widget_assert (xml, "hbox1"); act->break_variables = get_widget_assert (xml, "psppire-var-view1"); act->filename_radiobutton = get_widget_assert (xml, "filename-radiobutton"); act->filename_button = get_widget_assert (xml, "filename-button"); act->filename_box = get_widget_assert (xml, "filename-box"); act->filename_label = get_widget_assert (xml, "filename-label"); act->replace_radiobutton = get_widget_assert (xml, "replace-radiobutton"); act->add_radiobutton = get_widget_assert (xml, "add-radiobutton"); act->function_combo = get_widget_assert (xml, "function-combo"); act->summary_acr = get_widget_assert (xml, "psppire-acr1"); act->summary_var_name_entry = get_widget_assert (xml, "summary-var-name-entry"); act->summary_arg1 = get_widget_assert (xml, "summary-arg1"); act->summary_arg2 = get_widget_assert (xml, "summary-arg2"); act->summary_arg1_entry = get_widget_assert (xml, "summary-arg-entry1"); act->summary_arg2_entry = get_widget_assert (xml, "summary-arg-entry2"); act->summary_var_label_entry = get_widget_assert (xml, "summary-var-label-entry"); act->summary_sv = get_widget_assert (xml, "source-var"); act->summary_sv_entry = get_widget_assert (xml, "source-var-entry"); act->sorted_button = get_widget_assert (xml, "sorted-radiobutton"); act->needs_sort_button = get_widget_assert (xml, "needs-sort-radiobutton"); { GtkTreeViewColumn *column ; GList *l ; GtkCellRenderer *cell_renderer ; GtkListStore *list = gtk_list_store_new (6, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_INT, G_TYPE_STRING, G_TYPE_DOUBLE, G_TYPE_DOUBLE); psppire_acr_set_model (PSPPIRE_ACR (act->summary_acr), list); g_object_unref (list); psppire_acr_set_get_value_func (PSPPIRE_ACR (act->summary_acr), get_summary_spec, act); column = gtk_tree_view_get_column (PSPPIRE_ACR (act->summary_acr)->tv, 0); l = gtk_cell_layout_get_cells (GTK_CELL_LAYOUT (column)); cell_renderer = l->data; gtk_tree_view_column_set_cell_data_func (column, cell_renderer, render_summary, act, NULL); g_signal_connect_swapped (PSPPIRE_ACR (act->summary_acr)->tv, "cursor-changed", G_CALLBACK (on_acr_change), act); } g_signal_connect_swapped (act->summary_var_name_entry, "changed", G_CALLBACK (update_acr), act); g_signal_connect_swapped (act->function_combo, "changed", G_CALLBACK (update_acr), act); g_signal_connect_swapped (act->summary_sv_entry, "changed", G_CALLBACK (update_acr), act); g_signal_connect_swapped (act->summary_arg1_entry, "changed", G_CALLBACK (update_acr), act); g_signal_connect_swapped (act->summary_arg2_entry, "changed", G_CALLBACK (update_acr), act); g_signal_connect_swapped (act->function_combo, "changed", G_CALLBACK (update_arguments), act); populate_combo_model (GTK_COMBO_BOX (act->function_combo)); psppire_selector_set_filter_func (PSPPIRE_SELECTOR (break_selector), NULL); g_signal_connect (act->filename_radiobutton, "toggled", G_CALLBACK (set_sensitivity_from_toggle), act->filename_box); g_signal_connect_swapped (act->filename_button, "clicked", G_CALLBACK (choose_filename), act); psppire_dialog_action_set_refresh (pda, refresh); psppire_dialog_action_set_valid_predicate (pda, dialog_state_valid); return xml; } static void psppire_dialog_action_aggregate_class_init (PsppireDialogActionAggregateClass *class) { PSPPIRE_DIALOG_ACTION_CLASS (class)->initial_activate = psppire_dialog_action_aggregate_activate; PSPPIRE_DIALOG_ACTION_CLASS (class)->generate_syntax = generate_syntax; } static void psppire_dialog_action_aggregate_init (PsppireDialogActionAggregate *act) { } /* Append the syntax of the summary function pointed to by ITER to STRING */ static void append_summary_spec (const PsppireDialogActionAggregate *agg, GtkTreeIter *iter, GString *string) { GtkTreeIter combo_iter; char *varname = NULL; char *funcname = NULL; GtkTreeModel *acr_model = GTK_TREE_MODEL (PSPPIRE_ACR (agg->summary_acr)->list_store); GtkTreeModel *combo_model = gtk_combo_box_get_model (GTK_COMBO_BOX (agg->function_combo)); /* This is an index into the combo_model. Its used to get the function name */ int f_idx; double arg1, arg2; int arity; enum agr_src_vars has_src_vars; gchar *label = NULL; gchar *srcvar = NULL; gtk_tree_model_get (acr_model, iter, SUMMARY_COL_VARNAME, &varname, SUMMARY_COL_VARLABEL, &label, SUMMARY_COL_FUNCIDX, &f_idx, SUMMARY_COL_SRCVAR, &srcvar, SUMMARY_COL_ARG1, &arg1, SUMMARY_COL_ARG2, &arg2, -1); gtk_tree_model_iter_nth_child (combo_model, &combo_iter, NULL, f_idx); gtk_tree_model_get (combo_model, &combo_iter, COMBO_MODEL_COL_SYNTAX, &funcname, COMBO_MODEL_COL_ARITY, &arity, COMBO_MODEL_COL_SRC_VARS, &has_src_vars, -1); g_string_append (string, varname); if (0 != strcmp ("", label)) { struct string ss; ds_init_empty (&ss); syntax_gen_string (&ss, ss_cstr (label)); g_string_append (string, " "); g_string_append (string, ds_cstr (&ss)); ds_destroy (&ss); } g_string_append_printf (string, " = %s", funcname); if (has_src_vars != AGR_SV_NO) { struct string dss; ds_init_cstr (&dss, " ("); ds_put_cstr (&dss, srcvar); if (arity > 0) ds_put_c_format (&dss, ", %.*g", DBL_DIG + 1, arg1); if (arity > 1) ds_put_c_format (&dss, ", %.*g", DBL_DIG + 1, arg2); ds_put_cstr (&dss, ")"); g_string_append (string, ds_cstr (&dss)); ds_destroy (&dss); } free (label); free (srcvar); free (varname); free (funcname); } pspp-1.4.1/src/ui/gui/missing-val-dialog.ui0000644000175000017500000002651513717773141020154 0ustar00blpblp00000000000000 True False 5 5 5 5 vertical 12 True False 0 none True False _No missing values True True False True 0.5 True True True True 0 horizontal True False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 5 PSPPIRE_BUTTON_OK_MASK | PSPPIRE_BUTTON_CANCEL_MASK | PSPPIRE_BUTTON_HELP_MASK False False end 1 True False 0 none True False 12 12 5 6 True 75 True True False False 0 75 True True False False 1 75 True True False False 2 _Discrete missing values True True False True False 0 True no_missing True True 2 True False 0 none True False 12 12 6 6 True False _Low: True mv-low 0 0 75 True True True 1 0 True False _High: True mv-high 0 1 75 True True 1 1 True False Di_screte value: True mv-discrete 0 2 75 True True 1 2 _Range plus one optional discrete missing value True True False True False 0 True no_missing False True 3 pspp-1.4.1/src/ui/gui/psppire-text-file.h0000644000175000017500000000550513320146056017642 0ustar00blpblp00000000000000/* PSPPIRE - a graphical user interface for PSPP. Copyright (C) 2017 Free Software Foundation 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 3 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, see . */ #ifndef __PSPPIRE_TEXT_FILE_H__ #define __PSPPIRE_TEXT_FILE_H__ #include "libpspp/str.h" #include G_BEGIN_DECLS #define PSPPIRE_TYPE_TEXT_FILE (psppire_text_file_get_type ()) #define PSPPIRE_TEXT_FILE(obj) \ (G_TYPE_CHECK_INSTANCE_CAST ((obj), \ PSPPIRE_TYPE_TEXT_FILE, PsppireTextFile)) #define PSPPIRE_TEXT_FILE_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST ((klass), \ PSPPIRE_TYPE_TEXT_FILE, \ PsppireTextFileClass)) #define PSPPIRE_IS_TEXT_FILE(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE ((obj), PSPPIRE_TYPE_TEXT_FILE)) #define PSPPIRE_IS_TEXT_FILE_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE ((klass), PSPPIRE_TYPE_TEXT_FILE)) #define PSPPIRE_TEXT_FILE_GET_CLASS(obj) \ (G_TYPE_INSTANCE_GET_CLASS ((obj), \ PSPPIRE_TYPE_TEXT_FILE, \ PsppireTextFileClass)) enum { MAX_PREVIEW_LINES = 1000 }; /* Max number of lines to read. */ struct _PsppireTextFile { GObject parent; gchar *file_name; gchar *encoding; gint maximum_lines; /* The first several lines of the file. These copies which are UTF8 encoded, regardless of the file encoding. */ struct substring lines[MAX_PREVIEW_LINES]; size_t line_cnt; gulong total_lines; /* Number of lines in file. */ gboolean total_is_exact; /* Is total_lines exact (or an estimate)? */ /*< private >*/ gboolean dispose_has_run ; gint stamp; }; struct _PsppireTextFileClass { GObjectClass parent_class; }; typedef struct _PsppireTextFile PsppireTextFile; typedef struct _PsppireTextFileClass PsppireTextFileClass; GType psppire_text_file_get_type (void) G_GNUC_CONST; PsppireTextFile *psppire_text_file_new (const gchar *file_name, const gchar *encoding); gboolean psppire_text_file_get_total_exact (PsppireTextFile *tf); gulong psppire_text_file_get_n_lines (PsppireTextFile *tf); G_END_DECLS #endif /* __PSPPIRE_TEXT_FILE_H__ */ pspp-1.4.1/src/ui/gui/psppire-dialog-action-histogram.h0000644000175000017500000000464013320146056022445 0ustar00blpblp00000000000000/* PSPPIRE - a graphical user interface for PSPP. Copyright (C) 2015 Free Software Foundation 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 3 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, see . */ #include #include #include "psppire-dialog-action.h" #ifndef __PSPPIRE_DIALOG_ACTION_HISTOGRAM_H__ #define __PSPPIRE_DIALOG_ACTION_HISTOGRAM_H__ G_BEGIN_DECLS #define PSPPIRE_TYPE_DIALOG_ACTION_HISTOGRAM (psppire_dialog_action_histogram_get_type ()) #define PSPPIRE_DIALOG_ACTION_HISTOGRAM(obj) \ (G_TYPE_CHECK_INSTANCE_CAST ((obj), \ PSPPIRE_TYPE_DIALOG_ACTION_HISTOGRAM, PsppireDialogActionHistogram)) #define PSPPIRE_DIALOG_ACTION_HISTOGRAM_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST ((klass), \ PSPPIRE_TYPE_DIALOG_ACTION_HISTOGRAM, \ PsppireDialogActionHistogramClass)) #define PSPPIRE_IS_DIALOG_ACTION_HISTOGRAM(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE ((obj), PSPPIRE_TYPE_DIALOG_ACTION_HISTOGRAM)) #define PSPPIRE_IS_DIALOG_ACTION_HISTOGRAM_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE ((klass), PSPPIRE_TYPE_DIALOG_ACTION_HISTOGRAM)) #define PSPPIRE_DIALOG_ACTION_HISTOGRAM_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), \ PSPPIRE_TYPE_DIALOG_ACTION_HISTOGRAM, \ PsppireDialogActionHistogramClass)) typedef struct _PsppireDialogActionHistogram PsppireDialogActionHistogram; typedef struct _PsppireDialogActionHistogramClass PsppireDialogActionHistogramClass; struct _PsppireDialogActionHistogram { PsppireDialogAction parent; /*< private >*/ gboolean dispose_has_run ; GtkWidget *variable; GtkWidget *curve; }; struct _PsppireDialogActionHistogramClass { PsppireDialogActionClass parent_class; }; GType psppire_dialog_action_histogram_get_type (void) ; G_END_DECLS #endif /* __PSPPIRE_DIALOG_ACTION_HISTOGRAM_H__ */ pspp-1.4.1/src/ui/gui/psppire-var-view.c0000644000175000017500000002234613723216277017510 0ustar00blpblp00000000000000/* PSPPIRE - a graphical user interface for PSPP. Copyright (C) 2009, 2010, 2011 Free Software Foundation 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 3 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, see . */ #include #include #include "psppire-var-view.h" #include "psppire-var-ptr.h" #include "psppire-select-dest.h" #include #include #include #include #define _(msgid) gettext (msgid) #define N_(msgid) msgid static void psppire_var_view_class_init (PsppireVarViewClass *class); static void psppire_var_view_init (PsppireVarView *var_view); /* Returns TRUE iff VV contains the item V. V must be an initialised value containing a PSPPIRE_VAR_PTR_TYPE. */ static gboolean var_view_contains_var (PsppireSelectDestWidget *sdm, const GValue *v) { gboolean ok; GtkTreeIter iter; PsppireVarView *vv = PSPPIRE_VAR_VIEW (sdm); g_return_val_if_fail (G_VALUE_HOLDS (v, PSPPIRE_VAR_PTR_TYPE), FALSE); for (ok = psppire_var_view_get_iter_first (vv, &iter); ok; ok = psppire_var_view_get_iter_next (vv, &iter)) { const struct variable *var = psppire_var_view_get_variable (vv, 0, &iter); if (var == g_value_get_boxed (v)) return TRUE; } return FALSE; } static void model_init (PsppireSelectDestWidgetIface *iface) { iface->contains_var = var_view_contains_var; } G_DEFINE_TYPE_WITH_CODE (PsppireVarView, psppire_var_view, GTK_TYPE_TREE_VIEW, G_IMPLEMENT_INTERFACE (PSPPIRE_TYPE_SELECT_DEST_WIDGET, model_init)) void psppire_var_view_clear (PsppireVarView *vv) { GtkListStore *l = gtk_list_store_newv (vv->n_cols, vv->cols); gtk_tree_view_set_model (GTK_TREE_VIEW (vv), GTK_TREE_MODEL (l)); } static void psppire_var_view_finalize (GObject *object) { PsppireVarView *var_view = PSPPIRE_VAR_VIEW (object); g_free (var_view->nums); g_free (var_view->cols); } /* Properties */ enum { PROP_0, PROP_N_COLS }; /* A (*GtkTreeCellDataFunc) function. This function expects TREEMODEL to hold PSPPIRE_VAR_PTR_TYPE. It renders the name of the variable into CELL. */ static void display_cell_var_name (GtkTreeViewColumn *tree_column, GtkCellRenderer *cell, GtkTreeModel *treemodel, GtkTreeIter *iter, gpointer data) { struct variable *var; GValue value = {0}; gint *col = data; GtkTreePath *path = gtk_tree_model_get_path (treemodel, iter); gtk_tree_model_get_value (treemodel, iter, *col, &value); gtk_tree_path_free (path); var = g_value_get_boxed (&value); g_value_unset (&value); g_object_set (cell, "text", var ? var_get_name (var) : "", NULL); } static void psppire_var_view_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) { PsppireVarView *var_view = PSPPIRE_VAR_VIEW (object); switch (prop_id) { case PROP_N_COLS: g_value_set_int (value, var_view->n_cols); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; }; } static void set_renderers (PsppireVarView *var_view) { gint c; var_view->nums = g_malloc (sizeof *var_view->nums * var_view->n_cols); for (c = 0 ; c < var_view->n_cols; ++c) { GtkCellRenderer *renderer = gtk_cell_renderer_text_new (); GtkTreeViewColumn *col = gtk_tree_view_column_new (); gchar *label = g_strdup_printf (_("Var%d"), c + 1); gtk_tree_view_column_set_min_width (col, 100); gtk_tree_view_column_set_sizing (col, GTK_TREE_VIEW_COLUMN_FIXED); gtk_tree_view_column_set_resizable (col, TRUE); gtk_tree_view_column_set_title (col, label); g_free (label); var_view->nums[c] = c; gtk_tree_view_column_pack_start (col, renderer, TRUE); gtk_tree_view_column_set_cell_data_func (col, renderer, display_cell_var_name, &var_view->nums[c], 0); gtk_tree_view_append_column (GTK_TREE_VIEW (var_view), col); } } GtkTreeModel * psppire_var_view_get_current_model (PsppireVarView *vv) { return gtk_tree_view_get_model (GTK_TREE_VIEW (vv)); } static void psppire_var_view_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) { PsppireVarView *var_view = PSPPIRE_VAR_VIEW (object); switch (prop_id) { case PROP_N_COLS: { gint c; var_view->n_cols = g_value_get_int (value); var_view->cols = g_realloc (var_view->cols, sizeof (GType) * var_view->n_cols); for (c = 0 ; c < var_view->n_cols; ++c) var_view->cols[c] = PSPPIRE_VAR_PTR_TYPE; set_renderers (var_view); psppire_var_view_clear (var_view); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; }; } static void psppire_var_view_class_init (PsppireVarViewClass *class) { GObjectClass *object_class = G_OBJECT_CLASS (class); object_class->finalize = psppire_var_view_finalize; GParamSpec *n_cols_spec = g_param_spec_int ("n-cols", "Number of columns", "The Number of Columns in the Variable View", 1, 20, 1, G_PARAM_CONSTRUCT_ONLY | G_PARAM_READABLE | G_PARAM_WRITABLE); object_class->set_property = psppire_var_view_set_property; object_class->get_property = psppire_var_view_get_property; g_object_class_install_property (object_class, PROP_N_COLS, n_cols_spec); } static void psppire_var_view_init (PsppireVarView *vv) { GtkTreeSelection* selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (vv)); vv->cols = 0; gtk_tree_selection_set_mode (selection, GTK_SELECTION_MULTIPLE); } GtkWidget* psppire_var_view_new (void) { return GTK_WIDGET (g_object_new (psppire_var_view_get_type (), NULL)); } gboolean psppire_var_view_get_iter_first (PsppireVarView *vv, GtkTreeIter *iter) { GtkTreeIter dummy; GtkTreeModel *model = gtk_tree_view_get_model (GTK_TREE_VIEW (vv)); return gtk_tree_model_get_iter_first (model, iter ? iter : &dummy); } gboolean psppire_var_view_get_iter_next (PsppireVarView *vv, GtkTreeIter *iter) { GtkTreeModel *model = gtk_tree_view_get_model (GTK_TREE_VIEW (vv)); return gtk_tree_model_iter_next (model, iter); } const struct variable * psppire_var_view_get_var_from_model (GtkTreeModel *model, gint column, GtkTreeIter *iter) { const struct variable *var = NULL; GValue value = {0}; gtk_tree_model_get_value (model, iter, column, &value); if (G_VALUE_TYPE (&value) == PSPPIRE_VAR_PTR_TYPE) var = g_value_get_boxed (&value); else g_critical ("Unsupported type `%s', in variable name treeview.", G_VALUE_TYPE_NAME (&value)); g_value_unset (&value); return var; } const struct variable * psppire_var_view_get_variable (PsppireVarView *vv, gint column, GtkTreeIter *iter) { GtkTreeModel *model = gtk_tree_view_get_model (GTK_TREE_VIEW (vv)); return psppire_var_view_get_var_from_model (model, column, iter); } /* Append the names of selected variables to STRING. Returns the number of variables appended. */ gint psppire_var_view_append_names (PsppireVarView *vv, gint column, GString *string) { gint n_vars = 0; GtkTreeIter iter; if (psppire_var_view_get_iter_first (vv, &iter)) { do { const struct variable *var = psppire_var_view_get_variable (vv, column, &iter); g_string_append (string, " "); g_string_append (string, var_get_name (var)); n_vars++; } while (psppire_var_view_get_iter_next (vv, &iter)); } return n_vars; } /* Return a linked list of struct variables which are contained in VV. The caller is responsible for freeing the returned list. The variables however are owned by their dictionary and should not be freed. */ GSList * psppire_var_view_list_names (PsppireVarView *vv, gint column) { GtkTreeIter iter; GSList *list = NULL; if (psppire_var_view_get_iter_first (vv, &iter)) { do { const struct variable *var = psppire_var_view_get_variable (vv, column, &iter); list = g_slist_prepend (list, CONST_CAST (struct variable *, var)); } while (psppire_var_view_get_iter_next (vv, &iter)); } return list; } /* Append the names of selected variables to STR Returns the number of variables appended. */ gint psppire_var_view_append_names_str (PsppireVarView *vv, gint column, struct string *str) { gint n_vars = 0; GtkTreeIter iter; if (psppire_var_view_get_iter_first (vv, &iter)) { do { const struct variable *var = psppire_var_view_get_variable (vv, column, &iter); ds_put_cstr (str, " "); ds_put_cstr (str, var_get_name (var)); n_vars++; } while (psppire_var_view_get_iter_next (vv, &iter)); } return n_vars; } pspp-1.4.1/src/ui/gui/psppire-dialog-action-flip.h0000644000175000017500000000443713320146056021406 0ustar00blpblp00000000000000/* PSPPIRE - a graphical user interface for PSPP. Copyright (C) 2013 Free Software Foundation 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 3 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, see . */ #include #include #include "psppire-dialog-action.h" #ifndef __PSPPIRE_DIALOG_ACTION_FLIP_H__ #define __PSPPIRE_DIALOG_ACTION_FLIP_H__ G_BEGIN_DECLS #define PSPPIRE_TYPE_DIALOG_ACTION_FLIP (psppire_dialog_action_flip_get_type ()) #define PSPPIRE_DIALOG_ACTION_FLIP(obj) \ (G_TYPE_CHECK_INSTANCE_CAST ((obj), \ PSPPIRE_TYPE_DIALOG_ACTION_FLIP, PsppireDialogActionFlip)) #define PSPPIRE_DIALOG_ACTION_FLIP_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST ((klass), \ PSPPIRE_TYPE_DIALOG_ACTION_FLIP, \ PsppireDialogActionFlipClass)) #define PSPPIRE_IS_DIALOG_ACTION_FLIP(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE ((obj), PSPPIRE_TYPE_DIALOG_ACTION_FLIP)) #define PSPPIRE_IS_DIALOG_ACTION_FLIP_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE ((klass), PSPPIRE_TYPE_DIALOG_ACTION_FLIP)) #define PSPPIRE_DIALOG_ACTION_FLIP_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), \ PSPPIRE_TYPE_DIALOG_ACTION_FLIP, \ PsppireDialogActionFlipClass)) typedef struct _PsppireDialogActionFlip PsppireDialogActionFlip; typedef struct _PsppireDialogActionFlipClass PsppireDialogActionFlipClass; struct _PsppireDialogActionFlip { PsppireDialogAction parent; /*< private >*/ gboolean dispose_has_run ; GtkWidget *dest; GtkWidget *entry; }; struct _PsppireDialogActionFlipClass { PsppireDialogActionClass parent_class; }; GType psppire_dialog_action_flip_get_type (void) ; G_END_DECLS #endif /* __PSPPIRE_DIALOG_ACTION_FLIP_H__ */ pspp-1.4.1/src/ui/gui/psppire-dialog-action-weight.c0000644000175000017500000001157513670210420021732 0ustar00blpblp00000000000000/* PSPPIRE - a graphical user interface for PSPP. Copyright (C) 2015 Free Software Foundation 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 3 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, see . */ #include #include "psppire-dialog-action-weight.h" #include "psppire-selector.h" #include "psppire-var-view.h" #include "dict-display.h" #include "psppire-dialog.h" #include "builder-wrapper.h" #include #define _(msgid) gettext (msgid) #define N_(msgid) msgid static void psppire_dialog_action_weight_init (PsppireDialogActionWeight *act); static void psppire_dialog_action_weight_class_init (PsppireDialogActionWeightClass *class); G_DEFINE_TYPE (PsppireDialogActionWeight, psppire_dialog_action_weight, PSPPIRE_TYPE_DIALOG_ACTION); static char * generate_syntax (const PsppireDialogAction *pda) { gchar *syntax = NULL; PsppireDialogActionWeight *wcd = PSPPIRE_DIALOG_ACTION_WEIGHT (pda); const gchar *text = gtk_entry_get_text (GTK_ENTRY (wcd->entry)); const struct variable *var = psppire_dict_lookup_var (pda->dict, text); if (var == NULL) syntax = g_strdup ("WEIGHT OFF.\n"); else syntax = g_strdup_printf ("WEIGHT BY %s.\n", var_get_name (var)); return syntax; } static gboolean dialog_state_valid (gpointer data) { return TRUE; } static void refresh (PsppireDialogAction *pda) { PsppireDialogActionWeight *wcd = PSPPIRE_DIALOG_ACTION_WEIGHT (pda); const struct variable *var = dict_get_weight (pda->dict->dict); if (! var) { gtk_entry_set_text (GTK_ENTRY (wcd->entry), ""); gtk_label_set_text (GTK_LABEL (wcd->status), _("Do not weight cases")); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (wcd->off), TRUE); } else { gchar *text = g_strdup_printf (_("Weight cases by %s"), var_get_name (var)); gtk_entry_set_text (GTK_ENTRY (wcd->entry), var_get_name (var)); gtk_label_set_text (GTK_LABEL (wcd->status), text); g_free (text); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (wcd->on), TRUE); } g_signal_emit_by_name (wcd->entry, "activate"); } static void on_select (PsppireSelector *sel, gpointer data) { PsppireDialogActionWeight *wcd = data; gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (wcd->on), TRUE); gtk_widget_set_sensitive (GTK_WIDGET (wcd->on), TRUE); } static void on_deselect (PsppireSelector *sel, gpointer data) { PsppireDialogActionWeight *wcd = data; gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (wcd->off), TRUE); gtk_widget_set_sensitive (GTK_WIDGET (wcd->on), FALSE); } static void on_toggle (GtkToggleButton *off, gpointer data) { PsppireDialogActionWeight *wcd = data; if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (wcd->off))) { gtk_entry_set_text (GTK_ENTRY (wcd->entry), ""); } } static GtkBuilder * psppire_dialog_action_weight_activate (PsppireDialogAction *pda, GVariant *param) { PsppireDialogActionWeight *act = PSPPIRE_DIALOG_ACTION_WEIGHT (pda); GtkBuilder *xml = builder_new ("weight.ui"); pda->dialog = get_widget_assert (xml, "weight-cases-dialog"); pda->source = get_widget_assert (xml, "weight-cases-treeview"); act->entry = get_widget_assert (xml, "weight-cases-entry"); act->off = get_widget_assert (xml,"weight-cases-radiobutton1"); act->on = get_widget_assert (xml, "radiobutton2"); act->status = get_widget_assert (xml, "weight-status-label"); GtkWidget *selector = get_widget_assert (xml, "weight-cases-selector"); g_signal_connect (selector, "selected", G_CALLBACK (on_select), act); g_signal_connect (selector, "de-selected", G_CALLBACK (on_deselect), act); g_signal_connect (act->off, "toggled", G_CALLBACK (on_toggle), act); g_object_set (pda->source, "selection-mode", GTK_SELECTION_SINGLE, "predicate", var_is_numeric, NULL); psppire_selector_set_filter_func (PSPPIRE_SELECTOR (selector), is_currently_in_entry); psppire_dialog_action_set_valid_predicate (pda, dialog_state_valid); psppire_dialog_action_set_refresh (pda, refresh); return xml; } static void psppire_dialog_action_weight_class_init (PsppireDialogActionWeightClass *class) { PSPPIRE_DIALOG_ACTION_CLASS (class)->initial_activate = psppire_dialog_action_weight_activate; PSPPIRE_DIALOG_ACTION_CLASS (class)->generate_syntax = generate_syntax; } static void psppire_dialog_action_weight_init (PsppireDialogActionWeight *act) { } pspp-1.4.1/src/ui/gui/psppire-dialog-action-var-info.h0000644000175000017500000000475613320146056022201 0ustar00blpblp00000000000000/* PSPPIRE - a graphical user interface for PSPP. Copyright (C) 2012, 2013, 2014 Free Software Foundation 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 3 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, see . */ #include #include #include "psppire-dialog-action.h" #ifndef __PSPPIRE_DIALOG_ACTION_VAR_INFO_H__ #define __PSPPIRE_DIALOG_ACTION_VAR_INFO_H__ G_BEGIN_DECLS #define PSPPIRE_TYPE_DIALOG_ACTION_VAR_INFO (psppire_dialog_action_var_info_get_type ()) #define PSPPIRE_DIALOG_ACTION_VAR_INFO(obj) \ (G_TYPE_CHECK_INSTANCE_CAST ((obj), \ PSPPIRE_TYPE_DIALOG_ACTION_VAR_INFO, PsppireDialogActionVarInfo)) #define PSPPIRE_DIALOG_ACTION_VAR_INFO_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST ((klass), \ PSPPIRE_TYPE_DIALOG_ACTION_VAR_INFO, \ PsppireDialogActionVarInfoClass)) #define PSPPIRE_IS_DIALOG_ACTION_VAR_INFO(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE ((obj), PSPPIRE_TYPE_DIALOG_ACTION_VAR_INFO)) #define PSPPIRE_IS_DIALOG_ACTION_VAR_INFO_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE ((klass), PSPPIRE_TYPE_DIALOG_ACTION_VAR_INFO)) #define PSPPIRE_DIALOG_ACTION_VAR_INFO_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), \ PSPPIRE_TYPE_DIALOG_ACTION_VAR_INFO, \ PsppireDialogActionVarInfoClass)) typedef struct _PsppireDialogActionVarInfo PsppireDialogActionVarInfo; typedef struct _PsppireDialogActionVarInfoClass PsppireDialogActionVarInfoClass; struct _PsppireDialogActionVarInfo { PsppireDialogAction parent; /*< private >*/ gboolean dispose_has_run ; GtkWidget *variables; /* Treeview of selected variables. */ struct psppire_output_view *output; /* Manages output layout. */ }; struct _PsppireDialogActionVarInfoClass { PsppireDialogActionClass parent_class; }; GType psppire_dialog_action_var_info_get_type (void) ; G_END_DECLS #endif /* __PSPPIRE_DIALOG_ACTION_VAR_INFO_H__ */ pspp-1.4.1/src/ui/gui/psppire-buttonbox.h0000644000175000017500000000424113717773141017774 0ustar00blpblp00000000000000/* PSPPIRE - a graphical user interface for PSPP. Copyright (C) 2007, 2010, 2011, 2012 Free Software Foundation 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 3 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, see . */ #ifndef __PSPPIRE_BUTTON_BOX_H__ #define __PSPPIRE_BUTTON_BOX_H__ #include #include #include G_BEGIN_DECLS #define PSPPIRE_BUTTON_BOX_TYPE (psppire_button_box_get_type ()) #define PSPPIRE_BUTTON_BOX(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), PSPPIRE_BUTTON_BOX_TYPE, PsppireButtonBox)) #define PSPPIRE_BUTTON_BOX_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), PSPPIRE_BUTTON_BOX_TYPE, PsppireButtonBoxClass)) #define PSPPIRE_IS_BUTTON_BOX(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), PSPPIRE_BUTTON_BOX_TYPE)) #define PSPPIRE_IS_BUTTON_BOX_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), PSPPIRE_BUTTON_BOX_TYPE)) typedef struct _PsppireButtonBox PsppireButtonBox; typedef struct _PsppireButtonBoxClass PsppireButtonBoxClass; enum { PSPPIRE_BUTTON_OK = 0, PSPPIRE_BUTTON_GOTO, PSPPIRE_BUTTON_CONTINUE, PSPPIRE_BUTTON_CANCEL, PSPPIRE_BUTTON_CLOSE, PSPPIRE_BUTTON_HELP, PSPPIRE_BUTTON_RESET, PSPPIRE_BUTTON_PASTE, n_PsppireButtonBoxButtons }; struct _PsppireButtonBox { GtkButtonBox parent; /* */ GtkWidget *button[n_PsppireButtonBoxButtons]; guint def; }; struct _PsppireButtonBoxClass { GtkButtonBoxClass parent_class; }; GType psppire_button_box_get_type (void); #define PSPPIRE_TYPE_BUTTON_MASK psppire_button_flags_get_type() G_END_DECLS #endif /* __PSPPIRE_BUTTON_BOX_H__ */ pspp-1.4.1/src/ui/gui/find-dialog.c0000644000175000017500000004376213723216277016452 0ustar00blpblp00000000000000/* PSPPIRE - a graphical user interface for PSPP. Copyright (C) 2007, 2009, 2011, 2012, 2015, 2020 Free Software Foundation 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 3 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, see . */ /* This module implements the "Find" dialog; a dialog box to locate cases which match particular strings */ #include #include #include #include #include #include #include #include "data/data-in.h" #include "data/datasheet.h" #include "data/format.h" #include "data/value.h" #include "libpspp/cast.h" #include "libpspp/message.h" #include "ui/gui/builder-wrapper.h" #include "ui/gui/dict-display.h" #include "ui/gui/find-dialog.h" #include "ui/gui/helper.h" #include "ui/gui/psppire-data-store.h" #include "ui/gui/psppire-data-window.h" #include "ui/gui/psppire-dialog.h" #include "ui/gui/psppire-selector.h" #include #include "gl/xalloc.h" #include #define _(msgid) gettext (msgid) #define N_(msgid) msgid struct find_dialog { GtkBuilder *xml; PsppireDict *dict; struct datasheet *data; PsppireDataWindow *de; GtkWidget *variable_entry; GtkWidget *value_entry; GtkWidget *value_labels_checkbox; GtkWidget *match_regexp_checkbox; GtkWidget *match_substring_checkbox; }; static void find_value (const struct find_dialog *fd, casenumber current_row, casenumber *row, int *column); /* A callback which occurs whenever the "Refresh" button is clicked, and when the dialog pops up. It restores the dialog to its default state. */ static void refresh (GObject *obj, const struct find_dialog *fd) { gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (get_widget_assert (fd->xml, "find-wrap")), FALSE); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (get_widget_assert (fd->xml, "find-backwards")), FALSE); gtk_entry_set_text (GTK_ENTRY (fd->variable_entry), ""); gtk_entry_set_text (GTK_ENTRY (fd->value_entry), ""); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (fd->match_regexp_checkbox), FALSE); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (fd->match_substring_checkbox), FALSE); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (fd->match_substring_checkbox), FALSE); } /* Callback on the "Find" button */ static void do_find (GObject *obj, const struct find_dialog *fd) { SswSheet *sheet = SSW_SHEET (fd->de->data_editor->data_sheet); casenumber x = -1; gint column = -1; gint unused; gint row = 0; ssw_sheet_get_active_cell (sheet, &unused, &row); find_value (fd, row, &x, &column); if (x != -1) { gtk_notebook_set_current_page (GTK_NOTEBOOK (fd->de->data_editor), PSPPIRE_DATA_EDITOR_DATA_VIEW); ssw_sheet_scroll_to (sheet, column, x); ssw_sheet_set_active_cell (sheet, column, x, NULL); } } /* Callback on the selector. It gets invoked whenever a variable is selected */ static void on_select (GtkEntry *entry, gpointer data) { struct find_dialog *fd = data; const char *var_name = gtk_entry_get_text (GTK_ENTRY (fd->variable_entry)); struct variable *var = dict_lookup_var (fd->dict->dict, var_name); gboolean search_labels ; g_return_if_fail (var); gtk_widget_set_sensitive (fd->value_labels_checkbox, var_has_value_labels (var)); search_labels = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (fd->value_labels_checkbox)); gtk_widget_set_sensitive (fd->match_regexp_checkbox, var_is_alpha (var) || search_labels); gtk_widget_set_sensitive (fd->match_substring_checkbox, var_is_alpha (var) || search_labels); } /* Callback on the selector. It gets invoked whenever a variable is unselected */ static void on_deselect (GtkEntry *entry, gpointer data) { struct find_dialog *fd = data; gtk_widget_set_sensitive (fd->value_labels_checkbox, FALSE); gtk_widget_set_sensitive (fd->match_substring_checkbox, FALSE); gtk_widget_set_sensitive (fd->match_regexp_checkbox, FALSE); } static void value_labels_toggled (GtkToggleButton *tb, gpointer data) { struct find_dialog *fd = data; const char *var_name = gtk_entry_get_text (GTK_ENTRY (fd->variable_entry)); const struct variable *var = dict_lookup_var (fd->dict->dict, var_name); gboolean active = gtk_toggle_button_get_active (tb) ; gtk_widget_set_sensitive (fd->match_substring_checkbox, active || (var && var_is_alpha (var))); gtk_widget_set_sensitive (fd->match_regexp_checkbox, active || (var && var_is_alpha (var))); } /* Pops up the Find dialog box */ void find_dialog (PsppireDataWindow *de) { struct find_dialog fd; GtkWidget *dialog ; GtkWidget *source ; GtkWidget *selector; GtkWidget *find_button; GtkWidget *buttonbox; PsppireDataStore *ds ; fd.xml = builder_new ("find.ui"); fd.de = de; find_button = gtk_button_new_with_label (_("Find")); gtk_widget_show (find_button); buttonbox = get_widget_assert (fd.xml, "find-buttonbox"); psppire_box_pack_start_defaults (GTK_BOX (buttonbox), find_button); gtk_box_reorder_child (GTK_BOX (buttonbox), find_button, 0); dialog = get_widget_assert (fd.xml, "find-dialog"); source = get_widget_assert (fd.xml, "find-variable-treeview"); selector = get_widget_assert (fd.xml, "find-selector"); g_object_get (de->data_editor, "dictionary", &fd.dict, "data-store", &ds, NULL); fd.data = ds->datasheet; fd.variable_entry = get_widget_assert (fd.xml, "find-variable-entry"); fd.value_entry = get_widget_assert (fd.xml, "find-value-entry"); fd.value_labels_checkbox = get_widget_assert (fd.xml, "find-value-labels-checkbutton"); fd.match_regexp_checkbox = get_widget_assert (fd.xml, "find-match-regexp-checkbutton"); fd.match_substring_checkbox = get_widget_assert (fd.xml, "find-match-substring-checkbutton"); gtk_window_set_transient_for (GTK_WINDOW (dialog), GTK_WINDOW (de)); g_object_set (source, "model", fd.dict, "selection-mode", GTK_SELECTION_SINGLE, NULL); psppire_selector_set_filter_func (PSPPIRE_SELECTOR (selector), is_currently_in_entry); g_signal_connect (dialog, "refresh", G_CALLBACK (refresh), &fd); g_signal_connect (find_button, "clicked", G_CALLBACK (do_find), &fd); g_signal_connect (selector, "selected", G_CALLBACK (on_select), &fd); g_signal_connect (selector, "de-selected", G_CALLBACK (on_deselect), &fd); g_signal_connect (fd.value_labels_checkbox, "toggled", G_CALLBACK (value_labels_toggled), &fd); psppire_dialog_run (PSPPIRE_DIALOG (dialog)); g_object_unref (fd.xml); } /* Iterators */ static void forward (casenumber *i, struct datasheet *data UNUSED) { ++*i; } static void forward_wrap (casenumber *i, struct datasheet *data) { if (++*i >= datasheet_get_n_rows (data)) *i = 0; } static void backward (casenumber *i, struct datasheet *data UNUSED) { --*i; } static void backward_wrap (casenumber *i, struct datasheet *data) { if (--*i < 0) *i = datasheet_get_n_rows (data) - 1; } /* Current plus one */ static casenumber cp1 (casenumber current, struct datasheet *data) { return current + 1; } /* Current plus one, circular */ static casenumber cp1c (casenumber current, struct datasheet *data) { casenumber next = current; forward_wrap (&next, data); return next; } /* Current minus one */ static casenumber cm1 (casenumber current, struct datasheet *data) { if (current == 0) return datasheet_get_n_rows (data) - 1; return current - 1; } /* Current minus one, circular */ static casenumber cm1c (casenumber current, struct datasheet *data) { casenumber next = current; backward_wrap (&next, data); return next; } static casenumber last (casenumber current, struct datasheet *data) { return datasheet_get_n_rows (data) ; } static casenumber minus1 (casenumber current, struct datasheet *data) { return -1; } /* An type to facilitate iterating through casenumbers */ struct casenum_iterator { /* returns the first case to access */ casenumber (*start) (casenumber, struct datasheet *); /* Returns one past the last case to access */ casenumber (*end) (casenumber, struct datasheet *); /* Sets the first arg to the next case to access */ void (*next) (casenumber *, struct datasheet *); }; enum iteration_type{ FORWARD = 0, FORWARD_WRAP, REVERSE, REVERSE_WRAP, n_iterators }; static const struct casenum_iterator ip[n_iterators] = { /* Forward iterator (linear) */ {cp1, last, forward}, /* Forward iterator (circular) */ {cp1c, cm1, forward_wrap}, /* Reverse iterator (linear) */ {cm1, minus1, backward}, /* Reverse iterator (circular */ {cm1c, cp1, backward_wrap} }; /* A factory returning an iterator according to the dialog box's settings */ static const struct casenum_iterator * get_iteration_params (const struct find_dialog *fd) { gboolean wrap = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (get_widget_assert (fd->xml, "find-wrap"))); gboolean reverse = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (get_widget_assert (fd->xml, "find-backwards"))); if (wrap) { if (reverse) return &ip[REVERSE_WRAP]; else return &ip[FORWARD_WRAP]; } else { if (reverse) return &ip[REVERSE]; else return &ip[FORWARD]; } } enum string_cmp_flags { STR_CMP_SUBSTR = 0x01, /* Find strings which are substrings of the values */ STR_CMP_REGEXP = 0x02, /* Match against a regular expression */ STR_CMP_LABELS = 0x04 /* Match against the values' labels instead of the data */ }; /* An abstract base type for comparing union values against a reference */ struct comparator { const struct variable *var; enum string_cmp_flags flags; bool (*compare) (const struct comparator *, const union value *); void (*destroy) (struct comparator *); }; /* A comparator which operates on the numerical values, rounded to the number of decimal places indicated by the variable's format. */ struct numeric_comparator { struct comparator parent; double rounded_ref; }; /* A comparator which matches string values or parts thereof */ struct string_comparator { struct comparator parent; const char *pattern; }; /* A comparator to match string values against a POSIX.2 regular expression */ struct regexp_comparator { struct comparator parent; regex_t re; }; /* Returns 10 raised to the power of X. X must be a non-negative integer. */ static inline int int_pow10 (int x) { int ret = 1; assert (x >= 0); while (x--) ret *= 10; return ret; } static bool value_compare (const struct comparator *cmptr, const union value *v) { const struct numeric_comparator *nc = (const struct numeric_comparator *) cmptr; const struct fmt_spec *fs = var_get_print_format (cmptr->var); double c = nearbyint (v->f * int_pow10 (fs->d)); return c == nc->rounded_ref; } /* Return true if the label of VAL matches the reference string*/ static bool string_label_compare (const struct comparator *cmptr, const union value *val) { const struct string_comparator *ssc = (const struct string_comparator *) cmptr; int width; const char *text = var_lookup_value_label (cmptr->var, val); if (text == NULL) return false; width = strlen (text); assert (cmptr->flags & STR_CMP_LABELS); g_return_val_if_fail (width > 0, false); if (cmptr->flags & STR_CMP_SUBSTR) return (NULL != g_strstr_len (text, width, ssc->pattern)); else return (0 == strncmp (text, ssc->pattern, width)); } /* Return true if VAL matches the reference string*/ static bool string_value_compare (const struct comparator *cmptr, const union value *val) { bool found; char *text; const struct string_comparator *ssc = (const struct string_comparator *) cmptr; int width = var_get_width (cmptr->var); g_return_val_if_fail (width > 0, false); assert (! (cmptr->flags & STR_CMP_LABELS)); text = value_to_text (*val, cmptr->var); if (cmptr->flags & STR_CMP_SUBSTR) found = (NULL != g_strstr_len (text, width, ssc->pattern)); else found = (0 == strncmp (text, ssc->pattern, width)); free (text); return found; } /* Return true if VAL matched the regexp */ static bool regexp_value_compare (const struct comparator *cmptr, const union value *val) { char *text; bool retval; const struct regexp_comparator *rec = (const struct regexp_comparator *) cmptr; int width = var_get_width (cmptr->var); assert (! (cmptr->flags & STR_CMP_LABELS)); g_return_val_if_fail (width > 0, false); text = value_to_text (*val, cmptr->var); /* We must remove trailing whitespace, otherwise $ will not match where one would expect */ g_strchomp (text); retval = (0 == regexec (&rec->re, text, 0, 0, 0)); g_free (text); return retval; } /* Return true if the label of VAL matched the regexp */ static bool regexp_label_compare (const struct comparator *cmptr, const union value *val) { const char *text; const struct regexp_comparator *rec = (const struct regexp_comparator *) cmptr; int width ; assert (cmptr->flags & STR_CMP_LABELS); text = var_lookup_value_label (cmptr->var, val); width = strlen (text); g_return_val_if_fail (width > 0, false); return (0 == regexec (&rec->re, text, 0, 0, 0)); } static void regexp_destroy (struct comparator *cmptr) { struct regexp_comparator *rec = UP_CAST (cmptr, struct regexp_comparator, parent); regfree (&rec->re); } static struct comparator * numeric_comparator_create (const struct variable *var, const char *target) { struct numeric_comparator *nc = xzalloc (sizeof (*nc)); struct comparator *cmptr = &nc->parent; cmptr->flags = 0; cmptr->var = var; cmptr->compare = value_compare; const struct fmt_spec *fs = var_get_write_format (var); union value val; text_to_value (target, var, &val); nc->rounded_ref = nearbyint (val.f * int_pow10 (fs->d)); value_destroy (&val, var_get_width (var)); return cmptr; } static struct comparator * string_comparator_create (const struct variable *var, const char *target, enum string_cmp_flags flags) { struct string_comparator *ssc = xzalloc (sizeof (*ssc)); struct comparator *cmptr = &ssc->parent; cmptr->flags = flags; cmptr->var = var; if (flags & STR_CMP_LABELS) cmptr->compare = string_label_compare; else cmptr->compare = string_value_compare; ssc->pattern = target; return cmptr; } static struct comparator * regexp_comparator_create (const struct variable *var, const char *target, enum string_cmp_flags flags) { int code; struct regexp_comparator *rec = xzalloc (sizeof (*rec)); struct comparator *cmptr = &rec->parent; cmptr->flags = flags; cmptr->var = var; cmptr->compare = (flags & STR_CMP_LABELS) ? regexp_label_compare : regexp_value_compare ; cmptr->destroy = regexp_destroy; code = regcomp (&rec->re, target, 0); if (code != 0) { char *errbuf = NULL; size_t errbuf_size = regerror (code, &rec->re, errbuf, 0); errbuf = xmalloc (errbuf_size); regerror (code, &rec->re, errbuf, errbuf_size); msg (ME, _("Bad regular expression: %s"), errbuf); free (cmptr); free (errbuf); return NULL; } return cmptr; } /* Compare V against CMPTR's reference */ static bool comparator_compare (const struct comparator *cmptr, const union value *v) { return cmptr->compare (cmptr, v); } /* Destroy CMPTR */ static void comparator_destroy (struct comparator *cmptr) { if (! cmptr) return ; if (cmptr->destroy) cmptr->destroy (cmptr); free (cmptr); } static struct comparator * comparator_factory (const struct variable *var, const char *str, enum string_cmp_flags flags) { if (flags & STR_CMP_REGEXP) return regexp_comparator_create (var, str, flags); if (flags & (STR_CMP_SUBSTR | STR_CMP_LABELS)) return string_comparator_create (var, str, flags); return numeric_comparator_create (var, str); } /* Find the row and column specified by the dialog FD, starting at CURRENT_ROW. After the function returns, *ROW contains the row and *COLUMN the column. If no such case is found, then *ROW will be set to -1 */ static void find_value (const struct find_dialog *fd, casenumber current_row, casenumber *row, int *column) { int width; const struct variable *var; const char *var_name = gtk_entry_get_text (GTK_ENTRY (fd->variable_entry)); const char *target_string = gtk_entry_get_text (GTK_ENTRY (fd->value_entry)); enum string_cmp_flags flags = 0; var = dict_lookup_var (fd->dict->dict, var_name); if (! var) return ; width = var_get_width (var); *column = var_get_dict_index (var); *row = -1; if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (fd->match_substring_checkbox))) flags |= STR_CMP_SUBSTR; if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (fd->match_regexp_checkbox))) flags |= STR_CMP_REGEXP; if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (fd->value_labels_checkbox))) flags |= STR_CMP_LABELS; { union value val; casenumber i; const struct casenum_iterator *ip = get_iteration_params (fd); struct comparator *cmptr = comparator_factory (var, target_string, flags); value_init (&val, width); if (! cmptr) goto finish; for (i = ip->start (current_row, fd->data); i != ip->end (current_row, fd->data); ip->next (&i, fd->data)) { datasheet_get_value (fd->data, i, var_get_case_index (var), &val); if (comparator_compare (cmptr, &val)) { *row = i; break; } } finish: comparator_destroy (cmptr); value_destroy (&val, width); } } pspp-1.4.1/src/ui/gui/histogram.ui0000644000175000017500000002263413717773141016461 0ustar00blpblp00000000000000 False Histogram True GRAPH#HISTOGRAM True False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 2 True False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True center 5 dict-view entry1 1 0 True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True never etched-in True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 0 False 0 0 2 True False 0 none True True 12 True False _Variable: True True entry1 2 0 True False center 0 True False 12 vertical _Display normal curve True True False True 0.5 True False False 0 True False Display True 2 1 True False True 1 1 True True 0 vertical True False 5 vertical False False end 1 pspp-1.4.1/src/ui/gui/psppire-dialog-action-logistic.h0000644000175000017500000000523713320146056022270 0ustar00blpblp00000000000000/* PSPPIRE - a graphical user interface for PSPP. Copyright (C) 2012 Free Software Foundation 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 3 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, see . */ #include #include #include "psppire-dialog-action.h" #ifndef __PSPPIRE_DIALOG_ACTION_LOGISTIC_H__ #define __PSPPIRE_DIALOG_ACTION_LOGISTIC_H__ G_BEGIN_DECLS #define PSPPIRE_TYPE_DIALOG_ACTION_LOGISTIC (psppire_dialog_action_logistic_get_type ()) #define PSPPIRE_DIALOG_ACTION_LOGISTIC(obj) \ (G_TYPE_CHECK_INSTANCE_CAST ((obj), \ PSPPIRE_TYPE_DIALOG_ACTION_LOGISTIC, PsppireDialogActionLogistic)) #define PSPPIRE_DIALOG_ACTION_LOGISTIC_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST ((klass), \ PSPPIRE_TYPE_DIALOG_ACTION_LOGISTIC, \ PsppireDialogActionLogisticClass)) #define PSPPIRE_IS_DIALOG_ACTION_LOGISTIC(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE ((obj), PSPPIRE_TYPE_DIALOG_ACTION_LOGISTIC)) #define PSPPIRE_IS_DIALOG_ACTION_LOGISTIC_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE ((klass), PSPPIRE_TYPE_DIALOG_ACTION_LOGISTIC)) #define PSPPIRE_DIALOG_ACTION_LOGISTIC_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), \ PSPPIRE_TYPE_DIALOG_ACTION_LOGISTIC, \ PsppireDialogActionLogisticClass)) typedef struct _PsppireDialogActionLogistic PsppireDialogActionLogistic; typedef struct _PsppireDialogActionLogisticClass PsppireDialogActionLogisticClass; struct _PsppireDialogActionLogistic { PsppireDialogAction parent; /*< private >*/ gboolean dispose_has_run ; GtkWidget *dep_var; GtkWidget *indep_vars; GtkWidget *opts_dialog; GtkWidget *conf_checkbox; GtkWidget *conf_entry; GtkWidget *const_checkbox; GtkWidget *iterations_entry; GtkWidget *cut_point_entry; gdouble cut_point; gint max_iterations; gboolean constant; gboolean conf; gdouble conf_level; }; struct _PsppireDialogActionLogisticClass { PsppireDialogActionClass parent_class; }; GType psppire_dialog_action_logistic_get_type (void) ; G_END_DECLS #endif /* __PSPPIRE_DIALOG_ACTION_LOGISTIC_H__ */ pspp-1.4.1/src/ui/gui/psppire-dialog-action-tt1s.c0000644000175000017500000001043013670210420021323 0ustar00blpblp00000000000000/* PSPPIRE - a graphical user interface for PSPP. Copyright (C) 2012, 2013 Free Software Foundation 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 3 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, see . */ #include #include "psppire-dialog-action-tt1s.h" #include "psppire-var-view.h" #include "t-test-options.h" #include "psppire-dialog.h" #include "builder-wrapper.h" static void psppire_dialog_action_tt1s_init (PsppireDialogActionTt1s *act); static void psppire_dialog_action_tt1s_class_init (PsppireDialogActionTt1sClass *class); G_DEFINE_TYPE (PsppireDialogActionTt1s, psppire_dialog_action_tt1s, PSPPIRE_TYPE_DIALOG_ACTION); static char * generate_syntax (const PsppireDialogAction *act) { PsppireDialogActionTt1s *d = PSPPIRE_DIALOG_ACTION_TT1S (act); gchar *text; GString *str = g_string_new ("T-TEST "); g_string_append_printf (str, "/TESTVAL=%s", gtk_entry_get_text (GTK_ENTRY (d->test_value_entry))); g_string_append (str, "\n\t/VARIABLES="); psppire_var_view_append_names (PSPPIRE_VAR_VIEW (d->vars_treeview), 0, str); tt_options_dialog_append_syntax (d->opt, str); g_string_append (str, ".\n"); text = str->str; g_string_free (str, FALSE); return text; } static gboolean dialog_state_valid (gpointer data) { PsppireDialogActionTt1s *tt_d = PSPPIRE_DIALOG_ACTION_TT1S (data); gchar *s = NULL; const gchar *text; GtkTreeModel *vars = gtk_tree_view_get_model (GTK_TREE_VIEW (tt_d->vars_treeview)); GtkTreeIter notused; text = gtk_entry_get_text (GTK_ENTRY (tt_d->test_value_entry)); if (0 == strcmp ("", text)) return FALSE; /* Check to see if the entry is numeric */ g_strtod (text, &s); if (s - text != strlen (text)) return FALSE; if (0 == gtk_tree_model_get_iter_first (vars, ¬used)) return FALSE; return TRUE; } static void refresh (PsppireDialogAction *rd_) { PsppireDialogActionTt1s *d = PSPPIRE_DIALOG_ACTION_TT1S (rd_); GtkTreeModel *model = gtk_tree_view_get_model (GTK_TREE_VIEW (d->vars_treeview)); gtk_entry_set_text (GTK_ENTRY (d->test_value_entry), ""); gtk_list_store_clear (GTK_LIST_STORE (model)); } static GtkBuilder * psppire_dialog_action_tt1s_activate (PsppireDialogAction *a, GVariant *param) { PsppireDialogAction *pda = PSPPIRE_DIALOG_ACTION (a); PsppireDialogActionTt1s *act = PSPPIRE_DIALOG_ACTION_TT1S (a); GtkBuilder *xml = builder_new ("t-test.ui"); GtkWidget *options_button = get_widget_assert (xml, "button1"); pda->dialog = get_widget_assert (xml, "t-test-one-sample-dialog"); pda->source = get_widget_assert (xml, "one-sample-t-test-treeview2"); g_object_set (pda->source, "predicate", var_is_numeric, NULL); act->vars_treeview = get_widget_assert (xml, "one-sample-t-test-treeview1"); act->test_value_entry = get_widget_assert (xml, "test-value-entry"); act->opt = tt_options_dialog_create (GTK_WINDOW (pda->toplevel)); psppire_dialog_action_set_valid_predicate (pda, dialog_state_valid); psppire_dialog_action_set_refresh (pda, refresh); g_signal_connect_swapped (options_button, "clicked", G_CALLBACK (tt_options_dialog_run), act->opt); return xml; } static void psppire_dialog_action_tt1s_finalize (GObject *a) { PsppireDialogActionTt1s *act = PSPPIRE_DIALOG_ACTION_TT1S (a); tt_options_dialog_destroy (act->opt); } static void psppire_dialog_action_tt1s_class_init (PsppireDialogActionTt1sClass *class) { GObjectClass *object_class = G_OBJECT_CLASS (class); PSPPIRE_DIALOG_ACTION_CLASS (class)->initial_activate = psppire_dialog_action_tt1s_activate; object_class->finalize = psppire_dialog_action_tt1s_finalize; PSPPIRE_DIALOG_ACTION_CLASS (class)->generate_syntax = generate_syntax; } static void psppire_dialog_action_tt1s_init (PsppireDialogActionTt1s *act) { } pspp-1.4.1/src/ui/gui/k-means.ui0000644000175000017500000002100313717773141016004 0ustar00blpblp00000000000000 False K-Means Cluster Analysis True QUICK-CLUSTER True False vertical 2 True False 5 5 5 5 5 5 5 True True True center center 5 dict-view psppire-var-view1 1 0 True True True True never in True True 5 False False 0 0 2 True True False True in True True 5 False False 2 0 True False 5 True False 1 N_umber of Clusters: True entry1 False False 0 True True 5 True True 1 2 1 True False 1 1 True True 0 horizontal True False 5 PSPPIRE_BUTTON_GOTO_MASK False False end 1 pspp-1.4.1/src/ui/gui/psppire-dialog-action-crosstabs.c0000644000175000017500000002701313723216277022457 0ustar00blpblp00000000000000/* PSPPIRE - a graphical user interface for PSPP. Copyright (C) 2012 Free Software Foundation 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 3 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, see . */ #include #include "psppire-dialog-action-crosstabs.h" #include "psppire-value-entry.h" #include "dialog-common.h" #include "helper.h" #include #include "psppire-var-view.h" #include "psppire-dialog.h" #include "builder-wrapper.h" #include "psppire-checkbox-treeview.h" #include "psppire-dict.h" #include "libpspp/str.h" #include "gettext.h" #define _(msgid) gettext (msgid) #define N_(msgid) msgid static void psppire_dialog_action_crosstabs_class_init (PsppireDialogActionCrosstabsClass *class); G_DEFINE_TYPE (PsppireDialogActionCrosstabs, psppire_dialog_action_crosstabs, PSPPIRE_TYPE_DIALOG_ACTION); static gboolean dialog_state_valid (gpointer data) { PsppireDialogActionCrosstabs *cd = PSPPIRE_DIALOG_ACTION_CROSSTABS (data); GtkTreeModel *row_vars = gtk_tree_view_get_model (GTK_TREE_VIEW (cd->dest_rows)); GtkTreeModel *col_vars = gtk_tree_view_get_model (GTK_TREE_VIEW (cd->dest_cols)); GtkTreeIter notused; return (gtk_tree_model_get_iter_first (row_vars, ¬used) && gtk_tree_model_get_iter_first (col_vars, ¬used)); } static void refresh (PsppireDialogAction *rd_) { PsppireDialogActionCrosstabs *cd = PSPPIRE_DIALOG_ACTION_CROSSTABS (rd_); GtkTreeModel *liststore = gtk_tree_view_get_model (GTK_TREE_VIEW (cd->dest_rows)); gtk_list_store_clear (GTK_LIST_STORE (liststore)); liststore = gtk_tree_view_get_model (GTK_TREE_VIEW (cd->dest_cols)); gtk_list_store_clear (GTK_LIST_STORE (liststore)); } #define CROSSTABS_STATS \ CS (CHISQ, N_("Chisq"), N_("Pearson chi-square, " \ "likelihood ratio, Fisher’s exact test, continuity correction, " \ "linear-by-linear association.")) \ CS (PHI, N_("Phi"), NULL) \ CS (CC, N_("CC"), N_("Contingency coefficient")) \ CS (LAMBDA, N_("Lambda"), NULL) \ CS (UC, N_("UC"), N_("Uncertainty coefficient")) \ CS (BTAU, N_("BTau"), N_("Kendall's Tau-b")) \ CS (CTAU, N_("CTau"), N_("Kendall's Tau-c")) \ CS (RISK, N_("Risk"), N_("Relative Risk estimate")) \ CS (GAMMA, N_("Gamma"), NULL) \ CS (D, N_("D"), N_("Somer's d")) \ CS (KAPPA, N_("Kappa"), N_("Cohen's Kappa")) \ CS (ETA, N_("Eta"), NULL) \ CS (CORR, N_("Corr"), N_("Spearman correlation, Pearson's r")) \ CS (STATS_NONE, N_("None"), NULL) #define CROSSTABS_CELLS \ CS (COUNT, N_("Count"), N_("Frequency Count")) \ CS (ROW, N_("Row"), N_("Row percent")) \ CS (COLUMN, N_("Column"), N_("Column percent")) \ CS (TOTAL, N_("Total"), N_("Total percent")) \ CS (EXPECTED, N_("Expected"), N_("Expected value")) \ CS (RESIDUAL, N_("Residual"), NULL) \ CS (SRESIDUAL, N_("Std. Residual"), N_("Standardized Residual")) \ CS (ASRESIDUAL, N_("Adjusted Std. Residual"), NULL) \ CS (CELLS_NONE, N_("None"), NULL) enum { #define CS(NAME, LABEL, TOOLTIP) CS_##NAME, CROSSTABS_STATS #undef CS N_CROSSTABS_STATS }; enum { #define CS(NAME, LABEL, TOOLTIP) CS_##NAME, CROSSTABS_CELLS #undef CS N_CROSSTABS_CELLS }; enum { #define CS(NAME, LABEL, TOOLTIP) B_CS_##NAME = 1u << CS_##NAME, CROSSTABS_STATS CROSSTABS_CELLS #undef CS B_CS_STATS_ALL = (1u << N_CROSSTABS_STATS) - 1, B_CS_CELLS_ALL = (1u << N_CROSSTABS_CELLS) - 1, B_CS_STATS_DEFAULT = B_CS_CHISQ, B_CS_CELL_DEFAULT = B_CS_COUNT | B_CS_ROW | B_CS_COLUMN | B_CS_TOTAL, B_CS_NONE }; static const struct checkbox_entry_item stats[] = { #define CS(NAME, LABEL, TOOLTIP) {#NAME, LABEL, TOOLTIP}, CROSSTABS_STATS \ CS(NONE, N_("None"), NULL) #undef CS }; static const struct checkbox_entry_item cells[] = { #define CS(NAME, LABEL, TOOLTIP) {#NAME, LABEL, TOOLTIP}, CROSSTABS_CELLS \ CS(NONE, N_("None"), NULL) #undef CS }; static void on_format_clicked (PsppireDialogActionCrosstabs *cd) { int ret; gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (cd->avalue_button), cd->format_options_avalue); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (cd->table_button), cd->format_options_table); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (cd->pivot_button), cd->format_options_pivot); ret = psppire_dialog_run (PSPPIRE_DIALOG (cd->format_dialog)); if (ret == PSPPIRE_RESPONSE_CONTINUE) { cd->format_options_avalue = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (cd->avalue_button)); cd->format_options_table = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (cd->table_button)); cd->format_options_pivot = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (cd->pivot_button)); } } static void on_cell_clicked (PsppireDialogActionCrosstabs *cd) { GtkListStore *liststore = clone_list_store (GTK_LIST_STORE (cd->cell)); gint ret = psppire_dialog_run (PSPPIRE_DIALOG (cd->cell_dialog)); if (ret == PSPPIRE_RESPONSE_CONTINUE) { g_object_unref (liststore); } else { gtk_tree_view_set_model (GTK_TREE_VIEW (cd->cell_view) , GTK_TREE_MODEL (liststore)); cd->cell = GTK_TREE_MODEL (liststore); } } static void on_statistics_clicked (PsppireDialogActionCrosstabs *cd) { GtkListStore *liststore = clone_list_store (GTK_LIST_STORE (cd->stat)); gint ret = psppire_dialog_run (PSPPIRE_DIALOG (cd->stat_dialog)); if (ret == PSPPIRE_RESPONSE_CONTINUE) { g_object_unref (liststore); } else { gtk_tree_view_set_model (GTK_TREE_VIEW (cd->stat_view) , GTK_TREE_MODEL (liststore)); cd->stat = GTK_TREE_MODEL (liststore); } } static GtkBuilder * psppire_dialog_action_crosstabs_activate (PsppireDialogAction *a, GVariant *param) { PsppireDialogActionCrosstabs *act = PSPPIRE_DIALOG_ACTION_CROSSTABS (a); PsppireDialogAction *pda = PSPPIRE_DIALOG_ACTION (a); GtkBuilder *xml = builder_new ("crosstabs.ui"); pda->dialog = get_widget_assert (xml, "crosstabs-dialog"); pda->source = get_widget_assert (xml, "dict-treeview"); act->dest_rows = get_widget_assert (xml, "rows"); act->dest_cols = get_widget_assert (xml, "cols"); act->format_button = get_widget_assert (xml, "format-button"); act->stat_button = get_widget_assert (xml, "stats-button"); act->cell_button = get_widget_assert (xml, "cell-button"); act->stat_view = get_widget_assert (xml, "stats-view"); act->cell_view = get_widget_assert (xml, "cell-view"); act->cell_dialog = get_widget_assert (xml, "cell-dialog"); act->stat_dialog = get_widget_assert (xml, "stat-dialog"); act->format_dialog = get_widget_assert (xml, "format-dialog"); act->avalue_button = get_widget_assert (xml, "ascending"); act->table_button = get_widget_assert (xml, "print-tables"); act->pivot_button = get_widget_assert (xml, "pivot"); act->format_options_avalue = TRUE; act->format_options_table = TRUE; act->format_options_pivot = TRUE; psppire_checkbox_treeview_populate (PSPPIRE_CHECKBOX_TREEVIEW (act->cell_view), B_CS_CELL_DEFAULT, N_CROSSTABS_CELLS, cells); act->cell = gtk_tree_view_get_model (GTK_TREE_VIEW (act->cell_view)); psppire_checkbox_treeview_populate (PSPPIRE_CHECKBOX_TREEVIEW (act->stat_view), B_CS_STATS_DEFAULT, N_CROSSTABS_STATS, stats); act->stat = gtk_tree_view_get_model (GTK_TREE_VIEW (act->stat_view)); psppire_dialog_action_set_refresh (pda, refresh); psppire_dialog_action_set_valid_predicate (pda, dialog_state_valid); g_signal_connect_swapped (act->cell_button, "clicked", G_CALLBACK (on_cell_clicked), act); g_signal_connect_swapped (act->stat_button, "clicked", G_CALLBACK (on_statistics_clicked), act); g_signal_connect_swapped (act->format_button, "clicked", G_CALLBACK (on_format_clicked), act); return xml; } static char * generate_syntax (const PsppireDialogAction *a) { PsppireDialogActionCrosstabs *cd = PSPPIRE_DIALOG_ACTION_CROSSTABS (a); gchar *text = NULL; int i, n; guint selected; GString *string = g_string_new ("CROSSTABS "); gboolean ok; GtkTreeIter iter; g_string_append (string, "\n\t/TABLES="); psppire_var_view_append_names (PSPPIRE_VAR_VIEW (cd->dest_rows), 0, string); g_string_append (string, "\tBY\t"); psppire_var_view_append_names (PSPPIRE_VAR_VIEW (cd->dest_cols), 0, string); g_string_append (string, "\n\t/FORMAT="); if (cd->format_options_avalue) g_string_append (string, "AVALUE"); else g_string_append (string, "DVALUE"); g_string_append (string, " "); if (cd->format_options_table) g_string_append (string, "TABLES"); else g_string_append (string, "NOTABLES"); g_string_append (string, " "); if (cd->format_options_pivot) g_string_append (string, "PIVOT"); else g_string_append (string, "NOPIVOT"); selected = 0; for (i = 0, ok = gtk_tree_model_get_iter_first (cd->stat, &iter); ok; i++, ok = gtk_tree_model_iter_next (cd->stat, &iter)) { gboolean toggled; gtk_tree_model_get (cd->stat, &iter, CHECKBOX_COLUMN_SELECTED, &toggled, -1); if (toggled) selected |= 1u << i; else selected &= ~(1u << i); } if (!(selected & (1u << CS_STATS_NONE))) { if (selected) { g_string_append (string, "\n\t/STATISTICS="); n = 0; for (i = 0; i < N_CROSSTABS_STATS; i++) if (selected & (1u << i)) { if (n++) g_string_append (string, " "); g_string_append (string, stats[i].name); } } } selected = 0; for (i = 0, ok = gtk_tree_model_get_iter_first (cd->cell, &iter); ok; i++, ok = gtk_tree_model_iter_next (cd->cell, &iter)) { gboolean toggled; gtk_tree_model_get (cd->cell, &iter, CHECKBOX_COLUMN_SELECTED, &toggled, -1); if (toggled) selected |= 1u << i; else selected &= ~(1u << i); } g_string_append (string, "\n\t/CELLS="); if (selected & (1u << CS_CELLS_NONE)) g_string_append (string, "NONE"); else { n = 0; for (i = 0; i < N_CROSSTABS_CELLS; i++) if (selected & (1u << i)) { if (n++) g_string_append (string, " "); g_string_append (string, cells[i].name); } } g_string_append (string, ".\n"); text = string->str; g_string_free (string, FALSE); return text; } static void psppire_dialog_action_crosstabs_class_init (PsppireDialogActionCrosstabsClass *class) { PSPPIRE_DIALOG_ACTION_CLASS (class)->initial_activate = psppire_dialog_action_crosstabs_activate; PSPPIRE_DIALOG_ACTION_CLASS (class)->generate_syntax = generate_syntax; } static void psppire_dialog_action_crosstabs_init (PsppireDialogActionCrosstabs *act) { } pspp-1.4.1/src/ui/gui/automake.mk0000644000175000017500000003743613725006041016255 0ustar00blpblp00000000000000# PSPP - a program for statistical analysis. # Copyright (C) 2017, 2020 Free Software Foundation, Inc. # # 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 3 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, see . # ## Process this file with automake to produce Makefile.in -*- makefile -*- UI_FILES = \ src/ui/gui/aggregate.ui \ src/ui/gui/autorecode.ui \ src/ui/gui/binomial.ui \ src/ui/gui/compute.ui \ src/ui/gui/barchart.ui \ src/ui/gui/correlation.ui \ src/ui/gui/count.ui \ src/ui/gui/comments.ui \ src/ui/gui/crosstabs.ui \ src/ui/gui/chi-square.ui \ src/ui/gui/descriptives.ui \ src/ui/gui/entry-dialog.ui \ src/ui/gui/examine.ui \ src/ui/gui/goto-case.ui \ src/ui/gui/factor.ui \ src/ui/gui/find.ui \ src/ui/gui/frequencies.ui \ src/ui/gui/histogram.ui \ src/ui/gui/indep-samples.ui \ src/ui/gui/k-independent.ui \ src/ui/gui/k-means.ui \ src/ui/gui/k-related.ui \ src/ui/gui/ks-one-sample.ui \ src/ui/gui/logistic.ui \ src/ui/gui/means.ui \ src/ui/gui/missing-val-dialog.ui \ src/ui/gui/oneway.ui \ src/ui/gui/options.ui \ src/ui/gui/paired-samples.ui \ src/ui/gui/rank.ui \ src/ui/gui/runs.ui \ src/ui/gui/sort.ui \ src/ui/gui/split-file.ui \ src/ui/gui/recode.ui \ src/ui/gui/regression.ui \ src/ui/gui/reliability.ui \ src/ui/gui/roc.ui \ src/ui/gui/scatterplot.ui \ src/ui/gui/select-cases.ui \ src/ui/gui/t-test.ui \ src/ui/gui/text-data-import.ui \ src/ui/gui/transpose.ui \ src/ui/gui/univariate.ui \ src/ui/gui/val-labs-dialog.ui \ src/ui/gui/variable-info.ui \ src/ui/gui/data-editor.ui \ src/ui/gui/output-window.ui \ src/ui/gui/syntax-editor.ui \ src/ui/gui/var-type-dialog.ui \ src/ui/gui/weight.ui $(top_srcdir)/doc/help-pages-list: $(UI_FILES) $(AM_V_GEN)cat $^ | grep '"help[-_]page"' | \ $(SED) -e 's% *\([^<]*\)%//*[@id='"'"'\1'"'"']%' \ -e 's%#%'"'"']/*[@id='"'"'%g' > $@,tmp test -s $@,tmp mv $@,tmp $@ EXTRA_DIST += doc/help-pages-list EXTRA_DIST += \ src/ui/gui/org.fsf.pspp.metainfo.xml.in \ src/ui/gui/org.fsf.pspp.desktop.in \ src/ui/gui/marshaller-list \ src/ui/gui/pspplogo.svg src_ui_gui_psppire_CPPFLAGS= bin_PROGRAMS += src/ui/gui/psppire noinst_PROGRAMS += src/ui/gui/spreadsheet-test src_ui_gui_psppire_CFLAGS = $(GTK_CFLAGS) $(GTKSOURCEVIEW_CFLAGS) $(SPREAD_SHEET_WIDGET_CFLAGS) $(AM_CFLAGS) -DGDK_MULTIHEAD_SAFE=1 src_ui_gui_spreadsheet_test_CFLAGS = $(GTK_CFLAGS) $(AM_CFLAGS) -DGDK_MULTIHEAD_SAFE=1 if cc_is_gcc src_ui_gui_psppire_CFLAGS+=-Wno-unused-parameter src_ui_gui_spreadsheet_test_CFLAGS+=-Wno-unused-parameter endif src_ui_gui_psppire_LDFLAGS = \ $(PSPPIRE_LDFLAGS) \ $(PG_LDFLAGS) if RELOCATABLE_VIA_LD src_ui_gui_psppire_LDFLAGS += `$(RELOCATABLE_LDFLAGS) $(bindir)` else src_ui_gui_psppire_LDFLAGS += -rpath $(pkglibdir) endif src_ui_gui_psppire_LDADD = \ src/ui/gui/libwidgets-essential.la \ src/ui/libuicommon.la \ src/libpspp.la \ src/libpspp-core.la \ $(GTK_LIBS) \ $(GTHREAD_LIBS) \ $(GTKSOURCEVIEW_LIBS) \ $(SPREAD_SHEET_WIDGET_LIBS) \ $(CAIRO_LIBS) \ $(LIBINTL) \ $(GSL_LIBS) src_ui_gui_spreadsheet_test_LDADD = \ src/libpspp-core.la \ $(GTK_LIBS) \ $(GTHREAD_LIBS) src_ui_gui_spreadsheet_test_SOURCES = src/ui/gui/spreadsheet-test.c src/ui/gui/psppire-spreadsheet-model.c src_ui_gui_psppiredir = $(pkgdatadir) install-lang: $(INSTALL_DATA) $(top_srcdir)/src/ui/gui/pspp.lang $(DESTDIR)$(pkgdatadir) INSTALL_DATA_HOOKS += install-lang dist_src_ui_gui_psppire_DATA = \ $(UI_FILES) \ $(top_srcdir)/src/ui/gui/pspp.lang src_ui_gui_psppire_SOURCES = \ src/ui/gui/builder-wrapper.c \ src/ui/gui/builder-wrapper.h \ src/ui/gui/entry-dialog.c \ src/ui/gui/entry-dialog.h \ src/ui/gui/executor.c \ src/ui/gui/executor.h \ src/ui/gui/find-dialog.c \ src/ui/gui/find-dialog.h \ src/ui/gui/goto-case-dialog.c \ src/ui/gui/goto-case-dialog.h \ src/ui/gui/helper.c \ src/ui/gui/helper.h \ src/ui/gui/help-menu.c \ src/ui/gui/help-menu.h \ src/ui/gui/main.c \ src/ui/gui/missing-val-dialog.c \ src/ui/gui/missing-val-dialog.h \ src/ui/gui/options-dialog.c \ src/ui/gui/options-dialog.h \ src/ui/gui/psppire.c \ src/ui/gui/psppire-data-editor.c \ src/ui/gui/psppire-data-editor.h \ src/ui/gui/psppire-data-sheet.c \ src/ui/gui/psppire-data-sheet.h \ src/ui/gui/psppire-data-store.c \ src/ui/gui/psppire-data-store.h \ src/ui/gui/psppire-data-window.c \ src/ui/gui/psppire-data-window.h \ src/ui/gui/psppire-delimited-text.c \ src/ui/gui/psppire-delimited-text.h \ src/ui/gui/psppire-encoding-selector.c \ src/ui/gui/psppire-encoding-selector.h \ src/ui/gui/psppire.h \ src/ui/gui/psppire-import-assistant.c \ src/ui/gui/psppire-import-assistant.h \ src/ui/gui/psppire-lex-reader.c \ src/ui/gui/psppire-lex-reader.h \ src/ui/gui/psppire-output-view.c \ src/ui/gui/psppire-output-view.h \ src/ui/gui/psppire-output-window.c \ src/ui/gui/psppire-output-window.h \ src/ui/gui/psppire-scanf.c \ src/ui/gui/psppire-scanf.h \ src/ui/gui/psppire-spreadsheet-model.c \ src/ui/gui/psppire-spreadsheet-model.h \ src/ui/gui/psppire-syntax-window.c \ src/ui/gui/psppire-syntax-window.h \ src/ui/gui/psppire-value-entry.c \ src/ui/gui/psppire-value-entry.h \ src/ui/gui/psppire-variable-sheet.c \ src/ui/gui/psppire-variable-sheet.h \ src/ui/gui/psppire-var-sheet-header.c \ src/ui/gui/psppire-var-sheet-header.h \ src/ui/gui/psppire-window.c \ src/ui/gui/psppire-window.h \ src/ui/gui/psppire-window-register.c \ src/ui/gui/psppire-window-register.h \ src/ui/gui/t-test-options.c \ src/ui/gui/t-test-options.h \ src/ui/gui/val-labs-dialog.c \ src/ui/gui/val-labs-dialog.h \ src/ui/gui/value-variant.c \ src/ui/gui/value-variant.h \ src/ui/gui/var-display.c \ src/ui/gui/var-display.h \ src/ui/gui/var-type-dialog.c \ src/ui/gui/var-type-dialog.h \ src/ui/gui/widget-io.c \ src/ui/gui/widget-io.h \ src/ui/gui/windows-menu.c \ src/ui/gui/windows-menu.h noinst_LTLIBRARIES += src/ui/gui/libwidgets-essential.la src_ui_gui_libwidgets_essential_la_SOURCES = \ src/ui/gui/psppire-acr.c \ src/ui/gui/psppire-acr.h \ src/ui/gui/psppire-buttonbox.c \ src/ui/gui/psppire-buttonbox.h \ src/ui/gui/psppire-checkbox-treeview.c \ src/ui/gui/psppire-checkbox-treeview.h \ src/ui/gui/psppire-conf.c \ src/ui/gui/psppire-conf.h \ src/ui/gui/psppire-dialog-action-1sks.c \ src/ui/gui/psppire-dialog-action-1sks.h \ src/ui/gui/psppire-dialog-action-aggregate.c \ src/ui/gui/psppire-dialog-action-aggregate.h \ src/ui/gui/psppire-dialog-action-autorecode.c \ src/ui/gui/psppire-dialog-action-autorecode.h \ src/ui/gui/psppire-dialog-action-barchart.c \ src/ui/gui/psppire-dialog-action-barchart.h \ src/ui/gui/psppire-dialog-action-binomial.c \ src/ui/gui/psppire-dialog-action-binomial.h \ src/ui/gui/psppire-dialog-action.c \ src/ui/gui/psppire-dialog-action-chisquare.c \ src/ui/gui/psppire-dialog-action-chisquare.h \ src/ui/gui/psppire-dialog-action-comments.c \ src/ui/gui/psppire-dialog-action-comments.h \ src/ui/gui/psppire-dialog-action-compute.c \ src/ui/gui/psppire-dialog-action-compute.h \ src/ui/gui/psppire-dialog-action-correlation.c \ src/ui/gui/psppire-dialog-action-correlation.h \ src/ui/gui/psppire-dialog-action-count.c \ src/ui/gui/psppire-dialog-action-count.h \ src/ui/gui/psppire-dialog-action-crosstabs.c \ src/ui/gui/psppire-dialog-action-crosstabs.h \ src/ui/gui/psppire-dialog-action-descriptives.c \ src/ui/gui/psppire-dialog-action-descriptives.h \ src/ui/gui/psppire-dialog-action-examine.c \ src/ui/gui/psppire-dialog-action-examine.h \ src/ui/gui/psppire-dialog-action-factor.c \ src/ui/gui/psppire-dialog-action-factor.h \ src/ui/gui/psppire-dialog-action-flip.c \ src/ui/gui/psppire-dialog-action-flip.h \ src/ui/gui/psppire-dialog-action-frequencies.c \ src/ui/gui/psppire-dialog-action-frequencies.h \ src/ui/gui/psppire-dialog-action.h \ src/ui/gui/psppire-dialog-action-histogram.c \ src/ui/gui/psppire-dialog-action-histogram.h \ src/ui/gui/psppire-dialog-action-indep-samps.c \ src/ui/gui/psppire-dialog-action-indep-samps.h \ src/ui/gui/psppire-dialog-action-k-independent.c \ src/ui/gui/psppire-dialog-action-k-independent.h \ src/ui/gui/psppire-dialog-action-kmeans.c \ src/ui/gui/psppire-dialog-action-kmeans.h \ src/ui/gui/psppire-dialog-action-k-related.c \ src/ui/gui/psppire-dialog-action-k-related.h \ src/ui/gui/psppire-dialog-action-logistic.c \ src/ui/gui/psppire-dialog-action-logistic.h \ src/ui/gui/psppire-dialog-action-means.c \ src/ui/gui/psppire-dialog-action-means.h \ src/ui/gui/psppire-dialog-action-oneway.c \ src/ui/gui/psppire-dialog-action-oneway.h \ src/ui/gui/psppire-dialog-action-paired.c \ src/ui/gui/psppire-dialog-action-paired.h \ src/ui/gui/psppire-dialog-action-rank.c \ src/ui/gui/psppire-dialog-action-rank.h \ src/ui/gui/psppire-dialog-action-recode.c \ src/ui/gui/psppire-dialog-action-recode-different.c \ src/ui/gui/psppire-dialog-action-recode-different.h \ src/ui/gui/psppire-dialog-action-recode.h \ src/ui/gui/psppire-dialog-action-recode-same.c \ src/ui/gui/psppire-dialog-action-recode-same.h \ src/ui/gui/psppire-dialog-action-regression.c \ src/ui/gui/psppire-dialog-action-regression.h \ src/ui/gui/psppire-dialog-action-reliability.c \ src/ui/gui/psppire-dialog-action-reliability.h \ src/ui/gui/psppire-dialog-action-roc.c \ src/ui/gui/psppire-dialog-action-roc.h \ src/ui/gui/psppire-dialog-action-runs.c \ src/ui/gui/psppire-dialog-action-runs.h \ src/ui/gui/psppire-dialog-action-scatterplot.c \ src/ui/gui/psppire-dialog-action-scatterplot.h \ src/ui/gui/psppire-dialog-action-select.c \ src/ui/gui/psppire-dialog-action-select.h \ src/ui/gui/psppire-dialog-action-sort.c \ src/ui/gui/psppire-dialog-action-sort.h \ src/ui/gui/psppire-dialog-action-split.c \ src/ui/gui/psppire-dialog-action-split.h \ src/ui/gui/psppire-dialog-action-tt1s.c \ src/ui/gui/psppire-dialog-action-tt1s.h \ src/ui/gui/psppire-dialog-action-two-sample.c \ src/ui/gui/psppire-dialog-action-two-sample.h \ src/ui/gui/psppire-dialog-action-univariate.c \ src/ui/gui/psppire-dialog-action-univariate.h \ src/ui/gui/psppire-dialog-action-var-info.c \ src/ui/gui/psppire-dialog-action-var-info.h \ src/ui/gui/psppire-dialog-action-weight.c \ src/ui/gui/psppire-dialog-action-weight.h \ src/ui/gui/psppire-dialog.c \ src/ui/gui/psppire-dialog.h \ src/ui/gui/psppire-dict.c \ src/ui/gui/psppire-dict.h \ src/ui/gui/psppire-dictview.c \ src/ui/gui/psppire-dictview.h \ src/ui/gui/psppire-format.c \ src/ui/gui/psppire-format.h \ src/ui/gui/psppire-keypad.c \ src/ui/gui/psppire-keypad.h \ src/ui/gui/psppire-means-layer.c \ src/ui/gui/psppire-means-layer.h \ src/ui/gui/psppire-select-dest.c \ src/ui/gui/psppire-select-dest.h \ src/ui/gui/psppire-selector.c \ src/ui/gui/psppire-selector.h \ src/ui/gui/psppire-text-file.c \ src/ui/gui/psppire-text-file.h \ src/ui/gui/psppire-val-chooser.c \ src/ui/gui/psppire-val-chooser.h \ src/ui/gui/psppire-var-ptr.c \ src/ui/gui/psppire-var-ptr.h \ src/ui/gui/psppire-var-view.c \ src/ui/gui/psppire-var-view.h \ src/ui/gui/psppire-window-base.c \ src/ui/gui/psppire-window-base.h \ src/ui/gui/dialog-common.c \ src/ui/gui/dialog-common.h \ src/ui/gui/widgets.c \ src/ui/gui/widgets.h \ src/ui/gui/dict-display.c \ src/ui/gui/dict-display.h src_ui_gui_libwidgets_essential_la_CFLAGS = \ $(GTK_CFLAGS) \ $(GTKSOURCEVIEW_CFLAGS) \ $(AM_CFLAGS) # The unused-parameter warning is not by default disabled # in AM_CFLAGS because the core pspp code has this enabled. # This is only disabled in the gui code where we have many # callbacks from gtk3 which have fixed parameters if cc_is_gcc src_ui_gui_libwidgets_essential_la_CFLAGS += -Wno-unused-parameter endif nodist_src_ui_gui_psppire_SOURCES = \ src/ui/gui/psppire-marshal.c \ src/ui/gui/psppire-marshal.h \ src/ui/gui/resources.c AM_CPPFLAGS += -Isrc src/ui/gui/org.fsf.pspp.metainfo.xml: src/ui/gui/org.fsf.pspp.metainfo.xml.in $(POFILES) $(AM_V_GEN)$(MSGFMT) --xml --template $< -o $@ -d $(top_srcdir)/po || \ $(MSGFMT) -L appdata --xml --template $< -o $@ -d $(top_srcdir)/po src/ui/gui/org.fsf.pspp.desktop: src/ui/gui/org.fsf.pspp.desktop.in $(POFILES) $(AM_V_GEN)$(MSGFMT) --desktop --template $< -o $@ -d $(top_srcdir)/po CLEANFILES+=src/ui/gui/org.fsf.pspp.desktop \ src/ui/gui/org.fsf.pspp.metainfo.xml src/ui/gui/resources.c: src/ui/gui/resources.xml $(AM_V_at)$(GLIB_COMPILE_RESOURCES) --sourcedir=$(top_srcdir)/src/ui/gui --generate-source $< --target=$@,out $(AM_V_GEN)echo '#include ' > $@,tmp cat $@,out >> $@,tmp $(RM) $@,out mv $@,tmp $@ src/ui/gui/psppire-marshal.c: src/ui/gui/marshaller-list $(AM_V_GEN)echo '#include ' > $@ $(AM_V_at)$(GLIB_GENMARSHAL) --body --include-header=ui/gui/psppire-marshal.h --prefix=psppire_marshal $? >> $@ src/ui/gui/psppire-marshal.h: src/ui/gui/marshaller-list $(AM_V_GEN)$(GLIB_GENMARSHAL) --header --prefix=psppire_marshal $? > $@ mimedir = $(datadir)/mime/packages mime_DATA = src/ui/gui/pspp.xml EXTRA_DIST += src/ui/gui/pspp.xml desktopdir = $(datadir)/applications desktop_DATA = src/ui/gui/org.fsf.pspp.desktop appdatadir = $(datadir)/metainfo dist_appdata_DATA = src/ui/gui/org.fsf.pspp.metainfo.xml BUILT_SOURCES += src/ui/gui/psppire-marshal.c src/ui/gui/psppire-marshal.h src/ui/gui/resources.c CLEANFILES += src/ui/gui/psppire-marshal.c src/ui/gui/psppire-marshal.h \ src/ui/gui/.deps/psppire-marshal.Plo \ src/ui/gui/resources.c $(nodist_src_ui_gui_psppire_DATA) #ensure the installcheck passes even if there is no X server available installcheck-local: DISPLAY=/invalid/port $(MAKE) $(AM_MAKEFLAGS) installcheck-binPROGRAMS # wrapper src_ui_gui_psppire_CPPFLAGS += $(AM_CPPFLAGS) -Isrc/ui/gui/include BUILT_SOURCES += src/ui/gui/include/gtk/gtk.h src/ui/gui/include/gtk/gtk.h: src/ui/gui/include/gtk/gtk.in.h @$(MKDIR_P) src/ui/gui/include/gtk $(AM_V_GEN)rm -f $@-t $@ && \ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \ $(SED) -e 's|%''INCLUDE_NEXT''%|$(INCLUDE_NEXT)|g' \ -e 's|%''PRAGMA_SYSTEM_HEADER''%|$(PRAGMA_SYSTEM_HEADER)|g' \ -e 's|%''PRAGMA_COLUMNS''%|$(PRAGMA_COLUMNS)|g' \ -e 's|%''NEXT_GTK_GTK_H''%|$(NEXT_GTK_GTK_H)|g' \ < $(srcdir)/src/ui/gui/include/gtk/gtk.in.h; \ } > $@-t && \ mv $@-t $@ CLEANFILES += src/ui/gui/include/gtk/gtk.h EXTRA_DIST += src/ui/gui/include/gtk/gtk.in.h src/ui/gui/resources.xml include $(top_srcdir)/src/ui/gui/icons/automake.mk UNINSTALL_DATA_HOOKS += update-icon-cache INSTALL_DATA_HOOKS += update-icon-cache #### Build the tools needed to run glade on our .ui files EXTRA_pkgdir = $(abs_builddir)/src/ui/gui EXTRA_pkg_LTLIBRARIES = src/ui/gui/libpsppire-glade.la src_ui_gui_libpsppire_glade_la_SOURCES = \ src/ui/gui/dummy.c src_ui_gui_libpsppire_glade_la_LIBADD = \ src/ui/gui/libwidgets-essential.la \ src/ui/gui/psppire-marshal.lo src_ui_gui_libpsppire_glade_la_CFLAGS = $(GTK_CFLAGS) $(AM_CFLAGS) if cc_is_gcc src_ui_gui_libpsppire_glade_la_CFLAGS += -Wno-unused-parameter endif src_ui_gui_libpsppire_glade_la_LDFLAGS = -release $(VERSION) EXTRA_DIST += src/ui/gui/psppire.xml src/ui/gui/glade-wrapper.in src/ui/gui/glade-wrapper: src/ui/gui/glade-wrapper.in $(SED) -e 's%\@abs_top_srcdir\@%@abs_top_srcdir@%g' -e 's%\@abs_top_builddir\@%@abs_top_builddir@%g' $< > $@ chmod a+x $@ PHONY += glade-tools glade-tools: src/ui/gui/glade-wrapper src/ui/gui/libpsppire-glade.la # This works around a possible bug in Automake 1.16.1 which installs # EXTRA_pkgLTLIBRARIES if DESTDIR is set. It should not do that. install-EXTRA_pkgLTLIBRARIES: true pspp-1.4.1/src/ui/gui/psppire-conf.c0000644000175000017500000002115713723216277016674 0ustar00blpblp00000000000000/* PSPPIRE - a graphical user interface for PSPP. Copyright (C) 2009, 2010 Free Software Foundation 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 3 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, see . */ /* This module provides an interface for simple user preference config parameters. */ #include #include #include #include #include #include "psppire-conf.h" G_DEFINE_TYPE (PsppireConf, psppire_conf, G_TYPE_OBJECT) static void psppire_conf_finalize (GObject *object); static void psppire_conf_dispose (GObject *object); static GObjectClass *parent_class = NULL; static void conf_read (PsppireConf *conf) { g_key_file_load_from_file (conf->keyfile, conf->filename, G_KEY_FILE_KEEP_COMMENTS, NULL); } static gboolean flush_conf (PsppireConf *conf) { gsize length = 0; gchar *kf = g_key_file_to_data (conf->keyfile, &length, NULL); GError *err = NULL; if (! g_file_set_contents (conf->filename, kf, length, &err)) { g_warning ("Cannot open %s for writing: %s", conf->filename, err->message); g_error_free (err); } g_free (kf); conf->idle = 0; return FALSE; } static void conf_write (PsppireConf *conf) { if (conf->idle == 0) conf->idle = g_idle_add_full (G_PRIORITY_LOW, (GSourceFunc) flush_conf, conf, NULL); } static void psppire_conf_dispose (GObject *object) { } static void psppire_conf_finalize (GObject *object) { PsppireConf *conf = PSPPIRE_CONF (object); g_key_file_free (conf->keyfile); g_free (conf->filename); } static PsppireConf *the_instance = NULL; static GObject* psppire_conf_construct (GType type, guint n_construct_params, GObjectConstructParam *construct_params) { GObject *object; if (!the_instance) { object = G_OBJECT_CLASS (parent_class)->constructor (type, n_construct_params, construct_params); the_instance = PSPPIRE_CONF (object); } else object = g_object_ref (G_OBJECT (the_instance)); return object; } static void psppire_conf_class_init (PsppireConfClass *class) { GObjectClass *object_class; parent_class = g_type_class_peek_parent (class); object_class = G_OBJECT_CLASS (class); object_class->finalize = psppire_conf_finalize; object_class->dispose = psppire_conf_dispose; object_class->constructor = psppire_conf_construct; } static void psppire_conf_init (PsppireConf *conf) { const gchar *dirname; struct stat s; /* Get the name of the directory for user configuration files, then, if it doesn't already exist, create it, since we might be the first program to want to put files there. */ dirname = g_get_user_config_dir (); if (stat (dirname, &s) == -1 && errno == ENOENT) mkdir (dirname, 0700); conf->filename = g_strdup_printf ("%s/%s", dirname, "psppirerc"); conf->keyfile = g_key_file_new (); conf->idle = 0; } PsppireConf * psppire_conf_new (void) { return g_object_new (psppire_conf_get_type (), NULL); } gboolean psppire_conf_get_int (PsppireConf *conf, const gchar *base, const gchar *name, gint *value) { gboolean ok; GError *err = NULL; conf_read (conf); *value = g_key_file_get_integer (conf->keyfile, base, name, &err); ok = (err == NULL); if (err != NULL) g_error_free (err); return ok; } gboolean psppire_conf_get_boolean (PsppireConf *conf, const gchar *base, const gchar *name, gboolean *value) { gboolean ok; gboolean b; GError *err = NULL; conf_read (conf); b = g_key_file_get_boolean (conf->keyfile, base, name, &err); ok = (err == NULL); if (err != NULL) g_error_free (err); if (ok) *value = b; return ok; } gboolean psppire_conf_get_string (PsppireConf *conf, const gchar *base, const gchar *name, gchar **value) { gboolean ok; gchar *b; GError *err = NULL; conf_read (conf); b = g_key_file_get_string (conf->keyfile, base, name, &err); ok = (err == NULL); if (err != NULL) g_error_free (err); if (ok) *value = b; return ok; } gboolean psppire_conf_get_variant (PsppireConf *conf, const gchar *base, const gchar *name, GVariant **v) { gboolean ok; gchar *b; GError *err = NULL; conf_read (conf); b = g_key_file_get_string (conf->keyfile, base, name, &err); ok = (err == NULL); if (err != NULL) g_error_free (err); if (ok) { *v = g_variant_parse (NULL, b, NULL, NULL, NULL); g_free (b); } return ok; } gboolean psppire_conf_get_enum (PsppireConf *conf, const gchar *base, const gchar *name, GType t, int *v) { gboolean ok; gchar *b; GError *err = NULL; conf_read (conf); b = g_key_file_get_string (conf->keyfile, base, name, &err); ok = (err == NULL); if (err != NULL) g_error_free (err); if (ok) { GEnumClass *ec = g_type_class_ref (t); GEnumValue *ev = g_enum_get_value_by_nick (ec, b); *v = ev->value; g_type_class_unref (ec); g_free (b); } return ok; } void psppire_conf_set_int (PsppireConf *conf, const gchar *base, const gchar *name, gint value) { g_key_file_set_integer (conf->keyfile, base, name, value); conf_write (conf); } void psppire_conf_set_boolean (PsppireConf *conf, const gchar *base, const gchar *name, gboolean value) { g_key_file_set_boolean (conf->keyfile, base, name, value); conf_write (conf); } void psppire_conf_set_string (PsppireConf *conf, const gchar *base, const gchar *name, const gchar *value) { g_key_file_set_string (conf->keyfile, base, name, value); conf_write (conf); } void psppire_conf_set_variant (PsppireConf *conf, const gchar *base, const gchar *name, GVariant *value) { gchar *v = g_variant_print (value, FALSE); g_key_file_set_string (conf->keyfile, base, name, v); conf_write (conf); g_free (v); } void psppire_conf_set_enum (PsppireConf *conf, const gchar *base, const gchar *name, GType enum_type, int value) { GEnumClass *ec = g_type_class_ref (enum_type); GEnumValue *ev = g_enum_get_value (ec, value); g_key_file_set_string (conf->keyfile, base, name, ev->value_nick); g_type_class_unref (ec); conf_write (conf); } /* A convenience function to set the geometry of a window from from a saved config */ void psppire_conf_set_window_geometry (PsppireConf *conf, const gchar *base, GtkWindow *window) { gint height, width; gint x, y; gboolean maximize; if (psppire_conf_get_int (conf, base, "height", &height) && psppire_conf_get_int (conf, base, "width", &width)) { gtk_window_set_default_size (window, width, height); } if (psppire_conf_get_int (conf, base, "x", &x) && psppire_conf_get_int (conf, base, "y", &y)) { gtk_window_move (window, x, y); } if (psppire_conf_get_boolean (conf, base, "maximize", &maximize)) { if (maximize) gtk_window_maximize (window); else gtk_window_unmaximize (window); } } /* A convenience function to save the window geometry. This should typically be called from a window's "configure-event" and "window-state-event" signal handlers */ void psppire_conf_save_window_geometry (PsppireConf *conf, const gchar *base, GtkWindow *gtk_window) { gboolean maximized; GdkWindow *w; w = gtk_widget_get_window (GTK_WIDGET (gtk_window)); if (w == NULL) return; maximized = (gdk_window_get_state (w) & GDK_WINDOW_STATE_MAXIMIZED) != 0; psppire_conf_set_boolean (conf, base, "maximize", maximized); if (!maximized) { gint x, y; gint width = gdk_window_get_width (w); gint height= gdk_window_get_height (w); gdk_window_get_position (w, &x, &y); psppire_conf_set_int (conf, base, "height", height); psppire_conf_set_int (conf, base, "width", width); psppire_conf_set_int (conf, base, "x", x); psppire_conf_set_int (conf, base, "y", y); } } pspp-1.4.1/src/ui/gui/psppire-dialog-action-univariate.c0000644000175000017500000000667713670210420022621 0ustar00blpblp00000000000000/* PSPPIRE - a graphical user interface for PSPP. Copyright (C) 2012, 2013 Free Software Foundation 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 3 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, see . */ #include #include "psppire-dialog-action-univariate.h" #include "psppire-var-view.h" #include "psppire-dialog.h" #include "builder-wrapper.h" static void psppire_dialog_action_univariate_init (PsppireDialogActionUnivariate *act); static void psppire_dialog_action_univariate_class_init (PsppireDialogActionUnivariateClass *class); G_DEFINE_TYPE (PsppireDialogActionUnivariate, psppire_dialog_action_univariate, PSPPIRE_TYPE_DIALOG_ACTION); static char * generate_syntax (const PsppireDialogAction *act) { PsppireDialogActionUnivariate *uvd = PSPPIRE_DIALOG_ACTION_UNIVARIATE (act); gchar *text = NULL; GString *str = g_string_new ("GLM "); g_string_append (str, gtk_entry_get_text (GTK_ENTRY (uvd->dep_entry))); g_string_append (str, " BY "); psppire_var_view_append_names (PSPPIRE_VAR_VIEW (uvd->factor_list), 0, str); g_string_append (str, ".\n"); text = str->str; g_string_free (str, FALSE); return text; } static gboolean dialog_state_valid (gpointer data) { PsppireDialogActionUnivariate *ud = PSPPIRE_DIALOG_ACTION_UNIVARIATE (data); GtkTreeModel *vars; GtkTreeIter notused; if (0 == strcmp ("", gtk_entry_get_text (GTK_ENTRY (ud->dep_entry)))) return false; vars = gtk_tree_view_get_model (GTK_TREE_VIEW (ud->factor_list)); return gtk_tree_model_get_iter_first (vars, ¬used); } static void refresh (PsppireDialogAction *rd_) { PsppireDialogActionUnivariate *uv = PSPPIRE_DIALOG_ACTION_UNIVARIATE (rd_); GtkTreeModel *liststore ; gtk_entry_set_text (GTK_ENTRY (uv->dep_entry), ""); liststore = gtk_tree_view_get_model (GTK_TREE_VIEW (uv->factor_list)); gtk_list_store_clear (GTK_LIST_STORE (liststore)); } static GtkBuilder * psppire_dialog_action_univariate_activate (PsppireDialogAction *a, GVariant *param) { PsppireDialogAction *pda = PSPPIRE_DIALOG_ACTION (a); PsppireDialogActionUnivariate *act = PSPPIRE_DIALOG_ACTION_UNIVARIATE (a); GtkBuilder *xml = builder_new ("univariate.ui"); pda->dialog = get_widget_assert (xml, "univariate-dialog"); pda->source = get_widget_assert (xml, "dict-view"); act->dep_entry = get_widget_assert (xml, "dep-entry"); act->factor_list = get_widget_assert (xml, "factors-view"); psppire_dialog_action_set_valid_predicate (pda, dialog_state_valid); psppire_dialog_action_set_refresh (pda, refresh); return xml; } static void psppire_dialog_action_univariate_class_init (PsppireDialogActionUnivariateClass *class) { PSPPIRE_DIALOG_ACTION_CLASS (class)->initial_activate = psppire_dialog_action_univariate_activate; PSPPIRE_DIALOG_ACTION_CLASS (class)->generate_syntax = generate_syntax; } static void psppire_dialog_action_univariate_init (PsppireDialogActionUnivariate *act) { } pspp-1.4.1/src/ui/gui/autorecode.ui0000644000175000017500000004247613717773141016624 0ustar00blpblp00000000000000 False Automatic Recode True AUTORECODE True False 5 5 5 5 2 True False vertical True False 5 True True True never in True True True 5 False False 0 0 3 True True True center center 5 dict-view var-view 1 0 True False True True 0 none True True 12 in True True 5 False True False Variable -> New Name True 2 0 True False 0 True False 5 5 5 5 _Lowest value True True False 12 True 0.5 True True False False 0 _Highest value True True False True 0.5 True True radiobutton1 False False 1 True False Recode starting from True 2 2 True False 3 True False _New Name True entry1 0 0 True True True 1 0 _Add New Name True True True True 1 1 True False 0 1 2 1 True False 1 1 2 True True 0 True False vertical _Use the same recoding scheme for all variables True True False True 0.5 True False False 0 Treat _blank string values as missing True True False True 0.5 True False False 1 False False 1 True True 0 vertical True False 5 PSPPIRE_BUTTON_GOTO_MASK False False end 1 pspp-1.4.1/src/ui/gui/psppire-dialog-action-k-independent.c0000644000175000017500000001463613723216277023210 0ustar00blpblp00000000000000/* PSPPIRE - a graphical user interface for PSPP. Copyright (C) 2017 Free Software Foundation 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 3 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, see . */ #include #include "psppire-dialog-action-k-independent.h" #include "psppire-var-view.h" #include "psppire-value-entry.h" #include "psppire-acr.h" #include "psppire-dialog.h" #include "builder-wrapper.h" #include "helper.h" #include "gettext.h" #define _(msgid) gettext (msgid) #define N_(msgid) msgid static void psppire_dialog_action_k_independent_init (PsppireDialogActionKIndependent *act); static void psppire_dialog_action_k_independent_class_init (PsppireDialogActionKIndependentClass *class); G_DEFINE_TYPE (PsppireDialogActionKIndependent, psppire_dialog_action_k_independent, PSPPIRE_TYPE_DIALOG_ACTION); static const char *keyword[n_KIDS] = { "KRUSKAL-WALLIS", "MEDIAN" }; static char * generate_syntax (const PsppireDialogAction *act) { gchar *text; PsppireDialogActionKIndependent *kid = PSPPIRE_DIALOG_ACTION_K_INDEPENDENT (act); GString *string = g_string_new ("NPAR TEST"); int i; for (i = 0; i < n_KIDS; ++i) { g_string_append (string, "\n\t"); if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (kid->checkbutton[i]))) { g_string_append_printf (string, "/%s = ", keyword[i]); psppire_var_view_append_names (PSPPIRE_VAR_VIEW (kid->vars_treeview), 0, string); g_string_append (string, " BY "); g_string_append (string, gtk_entry_get_text (GTK_ENTRY (kid->groupvar_entry))); g_string_append_printf (string, " (%g, %g)", kid->lower_limit_value.f, kid->upper_limit_value.f); } } g_string_append (string, ".\n"); text = string->str; g_string_free (string, FALSE); return text; } static gboolean dialog_state_valid (gpointer data) { PsppireDialogActionKIndependent *kid = PSPPIRE_DIALOG_ACTION_K_INDEPENDENT (data); GtkTreeModel *vars = gtk_tree_view_get_model (GTK_TREE_VIEW (kid->vars_treeview)); GtkTreeIter notused; if (!gtk_tree_model_get_iter_first (vars, ¬used)) return FALSE; if (0 == strcmp ("", gtk_entry_get_text (GTK_ENTRY (kid->groupvar_entry)))) return FALSE; gboolean method_set = FALSE; gint i; for (i = 0; i < n_KIDS; ++i) { if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (kid->checkbutton[i]))) method_set = TRUE; } return method_set; } static void refresh (PsppireDialogAction *rd_) { PsppireDialogActionKIndependent *kid = PSPPIRE_DIALOG_ACTION_K_INDEPENDENT (rd_); GtkTreeModel *model = gtk_tree_view_get_model (GTK_TREE_VIEW (kid->vars_treeview)); gtk_entry_set_text (GTK_ENTRY (kid->groupvar_entry), ""); gtk_list_store_clear (GTK_LIST_STORE (model)); gint i; for (i = 0; i < n_KIDS; ++i) { gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (kid->checkbutton[i]), FALSE); } } static void run_define_groups_dialog (PsppireDialogActionKIndependent *kid) { if (kid->lower_limit_value.f != SYSMIS) psppire_value_entry_set_value (PSPPIRE_VALUE_ENTRY (kid->lower_limit_entry), &kid->lower_limit_value, 0); if (kid->upper_limit_value.f != SYSMIS) psppire_value_entry_set_value (PSPPIRE_VALUE_ENTRY (kid->upper_limit_entry), &kid->upper_limit_value, 0); if (PSPPIRE_RESPONSE_CONTINUE == psppire_dialog_run (PSPPIRE_DIALOG (kid->subdialog))) { psppire_value_entry_get_value (PSPPIRE_VALUE_ENTRY (kid->lower_limit_entry), &kid->lower_limit_value, 0); psppire_value_entry_get_value (PSPPIRE_VALUE_ENTRY (kid->upper_limit_entry), &kid->upper_limit_value, 0); } } static void set_value_entry_variable (PsppireDialogActionKIndependent *kid, GtkEntry *entry) { PsppireDialogAction *da = PSPPIRE_DIALOG_ACTION (kid); const gchar *text = gtk_entry_get_text (entry); const struct variable *v = da->dict ? psppire_dict_lookup_var (da->dict, text) : NULL; psppire_value_entry_set_variable (PSPPIRE_VALUE_ENTRY (kid->lower_limit_entry), v); psppire_value_entry_set_variable (PSPPIRE_VALUE_ENTRY (kid->upper_limit_entry), v); } static GtkBuilder * psppire_dialog_action_k_independent_activate (PsppireDialogAction *a, GVariant *param) { PsppireDialogAction *pda = PSPPIRE_DIALOG_ACTION (a); PsppireDialogActionKIndependent *kid = PSPPIRE_DIALOG_ACTION_K_INDEPENDENT (a); GtkBuilder *xml = builder_new ("k-independent.ui"); pda->dialog = get_widget_assert (xml, "k-independent-dialog"); pda->source = get_widget_assert (xml, "k-independent-treeview1"); kid->vars_treeview = get_widget_assert (xml, "k-independent-treeview2"); kid->groupvar_entry = get_widget_assert (xml, "k-independent-entry"); kid->subdialog = get_widget_assert (xml, "define-groups-dialog"); kid->lower_limit_entry = get_widget_assert (xml, "lower-limit-entry"); kid->upper_limit_entry = get_widget_assert (xml, "upper-limit-entry"); kid->checkbutton[KID_KRUSKAL_WALLIS] = get_widget_assert (xml, "kruskal-wallis"); kid->checkbutton[KID_MEDIAN] = get_widget_assert (xml, "median"); g_signal_connect_swapped (get_widget_assert (xml, "define-groups-button"), "clicked", G_CALLBACK (run_define_groups_dialog), kid); g_signal_connect_swapped (kid->groupvar_entry, "changed", G_CALLBACK (set_value_entry_variable), kid); psppire_dialog_action_set_valid_predicate (pda, dialog_state_valid); psppire_dialog_action_set_refresh (pda, refresh); return xml; } static void psppire_dialog_action_k_independent_class_init (PsppireDialogActionKIndependentClass *class) { PSPPIRE_DIALOG_ACTION_CLASS (class)->initial_activate = psppire_dialog_action_k_independent_activate; PSPPIRE_DIALOG_ACTION_CLASS (class)->generate_syntax = generate_syntax; } static void psppire_dialog_action_k_independent_init (PsppireDialogActionKIndependent *kid) { kid->lower_limit_value.f = SYSMIS; kid->upper_limit_value.f = SYSMIS; } pspp-1.4.1/src/ui/gui/psppire-var-sheet-header.c0000644000175000017500000000536513723216277021076 0ustar00blpblp00000000000000/* PSPPIRE - a graphical user interface for PSPP. Copyright (C) 2016 John Darrington 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 3 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, see . */ #include #include #include "psppire-var-sheet-header.h" #include #define _(msgid) gettext (msgid) #define N_(msgid) msgid enum {CHANGED, n_SIGNALS}; static guint signals [n_SIGNALS]; static guint gni (GListModel *list) { return 11; } static GType git (GListModel *list) { return GTK_TYPE_BUTTON; } static gpointer gi (GListModel *list, guint position) { GtkWidget *button = gtk_button_new (); const gchar *text = NULL; switch (position) { case 0: text = N_("Name"); break; case 1: text = N_("Type"); break; case 2: text = N_("Width"); break; case 3: text = N_("Decimal"); break; case 4: text = N_("Label"); break; case 5: text = N_("Value Labels"); break; case 6: text = N_("Missing Values"); break; case 7: text = N_("Columns"); break; case 8: text = N_("Align"); break; case 9: text = N_("Measure"); break; case 10: text = N_("Role"); break; default: break; } if (text) gtk_button_set_label (GTK_BUTTON (button), gettext (text)); return button; } static void psppire_init_iface (GListModelInterface *iface) { iface->get_n_items = gni; iface->get_item = gi; iface->get_item_type = git; } G_DEFINE_TYPE_WITH_CODE (PsppireVarSheetHeader, psppire_var_sheet_header, G_TYPE_OBJECT, G_IMPLEMENT_INTERFACE (G_TYPE_LIST_MODEL, psppire_init_iface)); static void psppire_var_sheet_header_init (PsppireVarSheetHeader *d) { } static void psppire_var_sheet_header_class_init (PsppireVarSheetHeaderClass *dc) { GObjectClass *object_class = G_OBJECT_CLASS (dc); /* This signal is never emitted. It is just to satisfy the interface. */ signals [CHANGED] = g_signal_new ("changed", G_TYPE_FROM_CLASS (object_class), G_SIGNAL_RUN_FIRST, 0, NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); } pspp-1.4.1/src/ui/gui/psppire-dialog-action-select.c0000644000175000017500000004025613670210420021720 0ustar00blpblp00000000000000/* PSPPIRE - a graphical user interface for PSPP. Copyright (C) 2007, 2008, 2009, 2010, 2011, 2014, 2015 Free Software Foundation, Inc. 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 3 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, see . */ #include #include "builder-wrapper.h" #include "dialog-common.h" #include "dict-display.h" #include "libpspp/str.h" #include "psppire-data-store.h" #include "psppire-data-window.h" #include "psppire-dialog-action-select.h" #include "psppire-dialog.h" #include "psppire-dict.h" #include "psppire-scanf.h" #include "psppire-value-entry.h" #include "psppire-var-view.h" #include "widget-io.h" #include #include #define _(msgid) gettext (msgid) #define N_(msgid) msgid static void psppire_dialog_action_select_class_init (PsppireDialogActionSelectClass *class); G_DEFINE_TYPE (PsppireDialogActionSelect, psppire_dialog_action_select, PSPPIRE_TYPE_DIALOG_ACTION); static gboolean dialog_state_valid (gpointer data) { PsppireDialogActionSelect *act = PSPPIRE_DIALOG_ACTION_SELECT (data); if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (act->radiobutton_all))) { return TRUE; } else if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (act->radiobutton_filter_variable))) { const gchar *text = gtk_entry_get_text (GTK_ENTRY (act->entry)); if (!psppire_dict_lookup_var (PSPPIRE_DIALOG_ACTION (act)->dict, text)) return FALSE; } return TRUE; } static void refresh (PsppireDialogAction *pda) { PsppireDialogActionSelect *act = PSPPIRE_DIALOG_ACTION_SELECT (pda); gtk_entry_set_text (GTK_ENTRY (act->entry), ""); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (act->radiobutton_all), TRUE); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (act->radiobutton_filter), TRUE); gtk_label_set_text (GTK_LABEL (act->l1), ""); gtk_label_set_text (GTK_LABEL (act->l0), ""); } static void set_radiobutton (GtkWidget *button, gpointer data) { GtkToggleButton *toggle = data; gtk_toggle_button_set_active (toggle, TRUE); } static const gchar label1[] = N_("Approximately %3d%% of all cases."); static const gchar label2[] = N_("Exactly %3d cases from the first %3d cases."); /* Ensure that the range "first" and "last" spinbuttons are self consistent */ static void sample_consistent (GtkSpinButton *spin, PsppireDialogActionSelect *act) { gdouble size = gtk_spin_button_get_value (GTK_SPIN_BUTTON (act->spin_sample_size)); gdouble limit = gtk_spin_button_get_value (GTK_SPIN_BUTTON (act->spin_sample_limit)); if (limit < size) { if (spin == GTK_SPIN_BUTTON (act->spin_sample_size)) gtk_spin_button_set_value (GTK_SPIN_BUTTON (act->spin_sample_limit), size); if (spin == GTK_SPIN_BUTTON (act->spin_sample_limit)) gtk_spin_button_set_value (GTK_SPIN_BUTTON (act->spin_sample_size), limit); } } static void sample_subdialog (GtkButton *b, gpointer data) { gint response; PsppireDialogActionSelect *scd = PSPPIRE_DIALOG_ACTION_SELECT (data); PsppireDialogAction *pda = PSPPIRE_DIALOG_ACTION (data); PsppireDataStore *data_store = NULL; g_object_get (PSPPIRE_DATA_WINDOW (pda->toplevel)->data_editor, "data-store", &data_store, NULL); gint case_count = psppire_data_store_get_case_count (data_store); if (!scd->hbox1) { scd->hbox1 = psppire_scanf_new (gettext (label1), &scd->spinbutton); gtk_widget_show (scd->hbox1); gtk_grid_attach (GTK_GRID (scd->table), scd->hbox1, 1, 0, 1, 1); g_signal_connect (scd->percent, "toggled", G_CALLBACK (set_sensitivity_from_toggle), scd->hbox1); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (scd->percent), TRUE); } if (!scd->hbox2) { scd->hbox2 = psppire_scanf_new (gettext (label2), &scd->spin_sample_size, &scd->spin_sample_limit); gtk_spin_button_set_range (GTK_SPIN_BUTTON (scd->spin_sample_size), 1, case_count); gtk_spin_button_set_range (GTK_SPIN_BUTTON (scd->spin_sample_limit), 1, case_count); g_signal_connect (scd->spin_sample_size, "value-changed", G_CALLBACK (sample_consistent), scd); g_signal_connect (scd->spin_sample_limit, "value-changed", G_CALLBACK (sample_consistent), scd); gtk_widget_show (scd->hbox2); gtk_widget_set_sensitive (scd->hbox2, FALSE); gtk_grid_attach (GTK_GRID (scd->table), scd->hbox2, 1, 1, 1, 1); g_signal_connect (scd->sample_n_cases, "toggled", G_CALLBACK (set_sensitivity_from_toggle), scd->hbox2); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (scd->sample_n_cases), FALSE); } gtk_window_set_transient_for (GTK_WINDOW (scd->rsample_dialog), GTK_WINDOW (pda->dialog)); response = psppire_dialog_run (PSPPIRE_DIALOG (scd->rsample_dialog)); if (response != PSPPIRE_RESPONSE_CONTINUE) { g_signal_handlers_disconnect_by_func (G_OBJECT (scd->percent), G_CALLBACK (set_sensitivity_from_toggle), scd->hbox1); g_signal_handlers_disconnect_by_func (G_OBJECT (scd->sample_n_cases), G_CALLBACK (set_sensitivity_from_toggle), scd->hbox2); gtk_widget_destroy(scd->hbox1); gtk_widget_destroy(scd->hbox2); scd->hbox1 = scd->hbox2 = NULL; } else { gchar *text; if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (scd->percent))) { text = widget_printf (gettext(label1), scd->spinbutton); gtk_label_set_text (GTK_LABEL (scd->l0), text); } else { text = widget_printf (gettext(label2), scd->spin_sample_size, scd->spin_sample_limit); gtk_label_set_text (GTK_LABEL (scd->l0), text); } g_free (text); } } static void range_subdialog (GtkButton *b, gpointer data) { gint response; PsppireDialogActionSelect *scd = PSPPIRE_DIALOG_ACTION_SELECT (data); PsppireDialogAction *pda = PSPPIRE_DIALOG_ACTION (data); PsppireDataStore *data_store = NULL; g_object_get (PSPPIRE_DATA_WINDOW (pda->toplevel)->data_editor, "data-store", &data_store, NULL); gint n_cases = psppire_data_store_get_case_count (data_store); gtk_spin_button_set_range (GTK_SPIN_BUTTON (scd->last), 1, n_cases); gtk_spin_button_set_range (GTK_SPIN_BUTTON (scd->first), 1, n_cases); gtk_window_set_transient_for (GTK_WINDOW (scd->range_subdialog), GTK_WINDOW (pda->dialog)); response = psppire_dialog_run (PSPPIRE_DIALOG (scd->range_subdialog)); if (response == PSPPIRE_RESPONSE_CONTINUE) { gchar *text = widget_printf (_("%d thru %d"), scd->first, scd->last); gtk_label_set_text (GTK_LABEL (scd->l1), text); g_free (text); } } /* Ensure that the range "first" and "last" spinbuttons are self consistent */ static void consistency (GtkSpinButton *spin, PsppireDialogActionSelect *act) { gdouble first = gtk_spin_button_get_value (GTK_SPIN_BUTTON (act->first)); gdouble last = gtk_spin_button_get_value (GTK_SPIN_BUTTON (act->last)); if (last < first) { if (spin == GTK_SPIN_BUTTON (act->first)) gtk_spin_button_set_value (GTK_SPIN_BUTTON (act->last), first); if (spin == GTK_SPIN_BUTTON (act->last)) gtk_spin_button_set_value (GTK_SPIN_BUTTON (act->first), last); } } static GtkBuilder * psppire_dialog_action_select_activate (PsppireDialogAction *a, GVariant *param) { PsppireDialogActionSelect *act = PSPPIRE_DIALOG_ACTION_SELECT (a); PsppireDialogAction *pda = PSPPIRE_DIALOG_ACTION (a); GtkBuilder *xml = builder_new ("select-cases.ui"); pda->dialog = get_widget_assert (xml, "select-cases-dialog"); pda->source = get_widget_assert (xml, "select-cases-treeview"); g_object_set (pda->source, "selection-mode", GTK_SELECTION_SINGLE, NULL); act->entry = get_widget_assert (xml, "filter-variable-entry"); GtkWidget *selector = get_widget_assert (xml, "psppire-selector-filter"); psppire_selector_set_filter_func (PSPPIRE_SELECTOR (selector), is_currently_in_entry); act->rsample_dialog = get_widget_assert (xml, "select-cases-random-sample-dialog"); act->percent = get_widget_assert (xml, "radiobutton-sample-percent"); act->sample_n_cases = get_widget_assert (xml, "radiobutton-sample-n-cases"); act->table = get_widget_assert (xml, "select-cases-random-sample-table"); act->l0 = get_widget_assert (xml, "random-sample-label"); act->radiobutton_range = get_widget_assert (xml, "radiobutton-range"); act->range_subdialog = get_widget_assert (xml, "select-cases-range-dialog"); act->first = get_widget_assert (xml, "range-dialog-first"); act->last = get_widget_assert (xml, "range-dialog-last"); g_signal_connect (act->first, "value-changed", G_CALLBACK (consistency), act); g_signal_connect (act->last, "value-changed", G_CALLBACK (consistency), act); act->l1 = get_widget_assert (xml, "range-sample-label"); act->radiobutton_sample = get_widget_assert (xml, "radiobutton-sample"); act->radiobutton_all = get_widget_assert (xml, "radiobutton-all"); act->radiobutton_filter_variable = get_widget_assert (xml, "radiobutton-filter-variable"); act->radiobutton_filter = get_widget_assert (xml, "radiobutton-filter"); act->radiobutton_delete = get_widget_assert (xml, "radiobutton-delete"); GtkWidget *button_range = get_widget_assert (xml, "button-range"); GtkWidget *button_sample = get_widget_assert (xml, "button-sample"); GtkWidget *button_if =get_widget_assert (xml, "button-if"); GtkWidget *radiobutton_if = get_widget_assert (xml, "radiobutton-if"); GtkWidget *sample_label = get_widget_assert (xml, "random-sample-label"); g_signal_connect (act->radiobutton_all, "toggled", G_CALLBACK (set_sensitivity_from_toggle_invert), get_widget_assert (xml, "filter-delete-button-box")); g_signal_connect (button_if, "clicked", G_CALLBACK (set_radiobutton), radiobutton_if); g_signal_connect (button_sample, "clicked", G_CALLBACK (set_radiobutton), act->radiobutton_sample); g_signal_connect (button_range, "clicked", G_CALLBACK (set_radiobutton), act->radiobutton_range); g_signal_connect (selector, "clicked", G_CALLBACK (set_radiobutton), act->radiobutton_filter_variable); g_signal_connect (selector, "selected", G_CALLBACK (set_radiobutton), act->radiobutton_filter_variable); g_signal_connect (act->radiobutton_range, "toggled", G_CALLBACK (set_sensitivity_from_toggle), act->l1); g_signal_connect (act->radiobutton_sample, "toggled", G_CALLBACK (set_sensitivity_from_toggle), sample_label); g_signal_connect (act->radiobutton_filter_variable, "toggled", G_CALLBACK (set_sensitivity_from_toggle), act->entry); g_signal_connect (button_range, "clicked", G_CALLBACK (range_subdialog), act); g_signal_connect (button_sample, "clicked", G_CALLBACK (sample_subdialog), act); psppire_dialog_action_set_refresh (pda, refresh); psppire_dialog_action_set_valid_predicate (pda, dialog_state_valid); return xml; } static char * generate_syntax_filter (const PsppireDialogAction *a) { PsppireDialogActionSelect *scd = PSPPIRE_DIALOG_ACTION_SELECT (a); gchar *text = NULL; struct string dss; const gchar *filter = "filter_$"; const gchar key[]="case_$"; ds_init_empty (&dss); if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (scd->radiobutton_range))) { ds_put_c_format (&dss, "COMPUTE filter_$ = ($CASENUM >= %ld " "AND $CASENUM <= %ld).\n", (long) gtk_spin_button_get_value (GTK_SPIN_BUTTON (scd->first)), (long) gtk_spin_button_get_value (GTK_SPIN_BUTTON (scd->last))); ds_put_cstr (&dss, "EXECUTE.\n"); } else if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (scd->radiobutton_sample))) { if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (scd->percent))) { const double percentage = gtk_spin_button_get_value (GTK_SPIN_BUTTON (scd->spinbutton)); ds_put_c_format (&dss, "COMPUTE %s = RV.UNIFORM (0,1) < %.*g.\n", filter, DBL_DIG + 1, percentage / 100.0); } else { const gint n_cases = gtk_spin_button_get_value (GTK_SPIN_BUTTON (scd->spin_sample_size)); const gint from_n_cases = gtk_spin_button_get_value (GTK_SPIN_BUTTON (scd->spin_sample_limit)); const gchar ranvar[]="rv_$"; ds_put_c_format (&dss, "COMPUTE %s = $CASENUM.\n", key); ds_put_c_format (&dss, "COMPUTE %s = %s > %d.\n", filter, key, from_n_cases); ds_put_c_format (&dss, "COMPUTE %s = RV.UNIFORM (0, 1).\n", ranvar); ds_put_c_format (&dss, "SORT CASES BY %s, %s.\n", filter, ranvar); ds_put_cstr (&dss, "EXECUTE.\n"); ds_put_c_format (&dss, "COMPUTE %s = $CASENUM.\n", filter); ds_put_c_format (&dss, "COMPUTE %s = %s <= %d\n", filter, filter, n_cases); ds_put_cstr (&dss, "EXECUTE.\n"); ds_put_c_format (&dss, "SORT CASES BY %s.\n", key); ds_put_c_format (&dss, "DELETE VARIABLES %s, %s.\n", key, ranvar); } ds_put_cstr (&dss, "EXECUTE.\n"); } else { filter = gtk_entry_get_text (GTK_ENTRY (scd->entry)); } ds_put_c_format (&dss, "FILTER BY %s.\n", filter); text = ds_steal_cstr (&dss); ds_destroy (&dss); return text; } static gchar * generate_syntax_delete (const PsppireDialogAction *a) { PsppireDialogActionSelect *scd = PSPPIRE_DIALOG_ACTION_SELECT (a); gchar *text = NULL; struct string dss; if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (scd->radiobutton_all))) { return xstrdup ("\n"); } ds_init_empty (&dss); if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (scd->radiobutton_sample))) { ds_put_cstr (&dss, "SAMPLE "); if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (scd->percent))) { const double percentage = gtk_spin_button_get_value (GTK_SPIN_BUTTON (scd->spinbutton)); ds_put_c_format (&dss, "%g.", percentage / 100.0); } else { const gint n_cases = gtk_spin_button_get_value (GTK_SPIN_BUTTON (scd->spin_sample_size)); const gint from_n_cases = gtk_spin_button_get_value (GTK_SPIN_BUTTON (scd->spin_sample_limit)); ds_put_c_format (&dss, "%d FROM %d .", n_cases, from_n_cases); } } else if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (scd->radiobutton_range))) { ds_put_c_format (&dss, "COMPUTE filter_$ = ($CASENUM >= %ld " "AND $CASENUM <= %ld).\n", (long) gtk_spin_button_get_value (GTK_SPIN_BUTTON (scd->first)), (long) gtk_spin_button_get_value (GTK_SPIN_BUTTON (scd->last))); ds_put_cstr (&dss, "EXECUTE.\n"); ds_put_c_format (&dss, "SELECT IF filter_$.\n"); } else if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (scd->radiobutton_filter_variable))) { ds_put_c_format (&dss, "SELECT IF (%s <> 0).", gtk_entry_get_text (GTK_ENTRY (scd->entry))); } ds_put_cstr (&dss, "\n"); text = ds_steal_cstr (&dss); ds_destroy (&dss); return text; } static gchar * generate_syntax (const PsppireDialogAction *a) { PsppireDialogActionSelect *scd = PSPPIRE_DIALOG_ACTION_SELECT (a); /* In the simple case, all we need to do is cancel any existing filter */ if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (scd->radiobutton_all))) { return g_strdup ("FILTER OFF.\n"); } /* Are we filtering or deleting ? */ if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (scd->radiobutton_delete))) { return generate_syntax_delete (a); } else { return generate_syntax_filter (a); } } static void psppire_dialog_action_select_class_init (PsppireDialogActionSelectClass *class) { PSPPIRE_DIALOG_ACTION_CLASS (class)->initial_activate = psppire_dialog_action_select_activate; PSPPIRE_DIALOG_ACTION_CLASS (class)->generate_syntax = generate_syntax; } static void psppire_dialog_action_select_init (PsppireDialogActionSelect *act) { } pspp-1.4.1/src/ui/gui/missing-val-dialog.c0000644000175000017500000003634013700645726017755 0ustar00blpblp00000000000000/* PSPPIRE - a graphical user interface for PSPP. Copyright (C) 2005, 2006, 2009, 2011, 2012, 2015, 2016, 2020 Free Software Foundation 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 3 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, see . */ /* This module describes the behaviour of the Missing Values dialog box, used for input of the missing values in the variable sheet */ #include #include "ui/gui/missing-val-dialog.h" #include "builder-wrapper.h" #include "helper.h" #include #include "missing-val-dialog.h" #include #include #include #include #include #include #define _(msgid) gettext (msgid) #define N_(msgid) msgid static GObject *psppire_missing_val_dialog_constructor ( GType type, guint, GObjectConstructParam *); static void psppire_missing_val_dialog_finalize (GObject *); G_DEFINE_TYPE (PsppireMissingValDialog, psppire_missing_val_dialog, PSPPIRE_TYPE_DIALOG); enum { PROP_0, PROP_VARIABLE, PROP_MISSING_VALUES }; static void psppire_missing_val_dialog_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) { PsppireMissingValDialog *obj = PSPPIRE_MISSING_VAL_DIALOG (object); switch (prop_id) { case PROP_VARIABLE: psppire_missing_val_dialog_set_variable (obj, g_value_get_pointer (value)); break; case PROP_MISSING_VALUES: default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static void psppire_missing_val_dialog_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) { PsppireMissingValDialog *obj = PSPPIRE_MISSING_VAL_DIALOG (object); switch (prop_id) { case PROP_MISSING_VALUES: g_value_set_pointer (value, &obj->mvl); break; case PROP_VARIABLE: default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static void psppire_missing_val_dialog_class_init (PsppireMissingValDialogClass *class) { GObjectClass *gobject_class; gobject_class = G_OBJECT_CLASS (class); gobject_class->constructor = psppire_missing_val_dialog_constructor; gobject_class->finalize = psppire_missing_val_dialog_finalize; gobject_class->set_property = psppire_missing_val_dialog_set_property; gobject_class->get_property = psppire_missing_val_dialog_get_property; g_object_class_install_property ( gobject_class, PROP_VARIABLE, g_param_spec_pointer ("variable", "Variable", "Variable whose missing values are to be edited. " "The variable's print format and encoding are also " "used for editing.", G_PARAM_WRITABLE)); g_object_class_install_property ( gobject_class, PROP_MISSING_VALUES, g_param_spec_pointer ("missing-values", "Missing Values", "Edited missing values.", G_PARAM_READABLE)); } static void psppire_missing_val_dialog_init (PsppireMissingValDialog *dialog) { /* We do all of our work on widgets in the constructor function, because that runs after the construction properties have been set. Otherwise PsppireDialog's "orientation" property hasn't been set and therefore we have no box to populate. */ mv_init (&dialog->mvl, 0); dialog->encoding = NULL; } static void psppire_missing_val_dialog_finalize (GObject *obj) { PsppireMissingValDialog *dialog = PSPPIRE_MISSING_VAL_DIALOG (obj); mv_destroy (&dialog->mvl); g_free (dialog->encoding); G_OBJECT_CLASS (psppire_missing_val_dialog_parent_class)->finalize (obj); } PsppireMissingValDialog * psppire_missing_val_dialog_new (const struct variable *var) { return PSPPIRE_MISSING_VAL_DIALOG ( g_object_new (PSPPIRE_TYPE_MISSING_VAL_DIALOG, "variable", var, NULL)); } gint psppire_missing_val_dialog_run (GtkWindow *parent_window, const struct variable *var, struct missing_values *mv) { PsppireMissingValDialog *dialog; dialog = psppire_missing_val_dialog_new (var); gtk_window_set_transient_for (GTK_WINDOW (dialog), parent_window); gtk_window_set_modal (GTK_WINDOW (dialog), TRUE); gtk_widget_show (GTK_WIDGET (dialog)); gint result = psppire_dialog_run (PSPPIRE_DIALOG (dialog)); if (result == GTK_RESPONSE_OK) mv_copy (mv, psppire_missing_val_dialog_get_missing_values (dialog)); else mv_copy (mv, var_get_missing_values (var)); gtk_widget_destroy (GTK_WIDGET (dialog)); return result; } /* A simple (sub) dialog box for displaying user input errors */ static void err_dialog (const gchar *msg, GtkWindow *window) { GtkWidget *dialog = gtk_message_dialog_new (window, GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE, "%s",msg); gtk_dialog_run (GTK_DIALOG (dialog)); gtk_widget_destroy (dialog); } /* Interpret text, display error dialog If parsing is o.k., the value is initialized and it is the responsibility of the caller to destroy the variable. */ static gboolean try_missing_value(const PsppireMissingValDialog *dialog, const gchar *text, union value *vp) { const int var_width = fmt_var_width (&dialog->format); char *error_txt = NULL; value_init(vp, var_width); error_txt = data_in (ss_cstr(text), "UTF-8", dialog->format.type, vp, var_width, dialog->encoding); if (error_txt) { err_dialog (error_txt, GTK_WINDOW (dialog)); free (error_txt); goto error; } else { if (mv_is_acceptable (vp, var_width)) return TRUE; else { err_dialog (_("The maximum length of a missing value" " for a string variable is 8 in UTF-8."), GTK_WINDOW (dialog)); goto error; } } error: value_destroy (vp, var_width); return FALSE; } /* Acceptability predicate for PsppireMissingValDialog. This function is also the only place that dialog->mvl gets updated. */ static gboolean missing_val_dialog_acceptable (gpointer data) { PsppireMissingValDialog *dialog = data; int var_width = fmt_var_width (&dialog->format); if (gtk_toggle_button_get_active (dialog->button_discrete)) { gint nvals = 0; gint i; mv_clear(&dialog->mvl); for(i = 0 ; i < 3 ; ++i) { gchar *text = g_strdup (gtk_entry_get_text (GTK_ENTRY (dialog->mv[i]))); union value v; if (!text || strlen (g_strstrip (text)) == 0) { g_free (text); continue; } if (!try_missing_value (dialog, text, &v)) { g_free (text); gtk_widget_grab_focus (dialog->mv[i]); return FALSE; } mv_add_value (&dialog->mvl, &v); nvals++; g_free (text); value_destroy (&v, var_width); } if (nvals == 0) { err_dialog (_("At least one value must be specified"), GTK_WINDOW (dialog)); gtk_widget_grab_focus (dialog->mv[0]); return FALSE; } } if (gtk_toggle_button_get_active (dialog->button_range)) { gchar *discrete_text; union value low_val ; union value high_val; const gchar *low_text = gtk_entry_get_text (GTK_ENTRY (dialog->low)); const gchar *high_text = gtk_entry_get_text (GTK_ENTRY (dialog->high)); assert (var_width == 0); /* Ranges are only for numeric variables */ if (!try_missing_value(dialog, low_text, &low_val)) { gtk_widget_grab_focus (dialog->low); return FALSE; } if (!try_missing_value (dialog, high_text, &high_val)) { gtk_widget_grab_focus (dialog->high); value_destroy (&low_val, var_width); return FALSE; } if (low_val.f > high_val.f) { err_dialog (_("Incorrect range specification"), GTK_WINDOW (dialog)); value_destroy (&low_val, var_width); value_destroy (&high_val, var_width); gtk_widget_grab_focus (dialog->low); return FALSE; } mv_clear (&dialog->mvl); mv_add_range (&dialog->mvl, low_val.f, high_val.f); value_destroy (&low_val, var_width); value_destroy (&high_val, var_width); discrete_text = g_strdup (gtk_entry_get_text (GTK_ENTRY (dialog->discrete))); if (discrete_text && strlen (g_strstrip (discrete_text)) > 0) { union value discrete_val; if (!try_missing_value (dialog, discrete_text, &discrete_val)) { g_free (discrete_text); gtk_widget_grab_focus (dialog->discrete); return FALSE; } mv_add_value (&dialog->mvl, &discrete_val); value_destroy (&discrete_val, var_width); } g_free (discrete_text); } if (gtk_toggle_button_get_active (dialog->button_none)) mv_clear (&dialog->mvl); return TRUE; } /* Callback which occurs when the 'discrete' radiobutton is toggled */ static void discrete (GtkToggleButton *button, gpointer data) { gint i; PsppireMissingValDialog *dialog = data; for (i = 0 ; i < 3 ; ++i) { gtk_widget_set_sensitive (dialog->mv[i], gtk_toggle_button_get_active (button)); } } /* Callback which occurs when the 'range' radiobutton is toggled */ static void range (GtkToggleButton *button, gpointer data) { PsppireMissingValDialog *dialog = data; const gboolean active = gtk_toggle_button_get_active (button); gtk_widget_set_sensitive (dialog->low, active); gtk_widget_set_sensitive (dialog->high, active); gtk_widget_set_sensitive (dialog->discrete, active); } /* Shows the dialog box and sets default values */ static GObject * psppire_missing_val_dialog_constructor (GType type, guint n_properties, GObjectConstructParam *properties) { PsppireMissingValDialog *dialog; GtkContainer *content_area; GtkBuilder *xml; GObject *obj; obj = G_OBJECT_CLASS (psppire_missing_val_dialog_parent_class)->constructor ( type, n_properties, properties); dialog = PSPPIRE_MISSING_VAL_DIALOG (obj); g_object_set (dialog, "help-page", "Missing-Observations", "title", _("Missing Values"), NULL); content_area = GTK_CONTAINER (PSPPIRE_DIALOG (dialog)); xml = builder_new ("missing-val-dialog.ui"); gtk_container_add (GTK_CONTAINER (content_area), get_widget_assert (xml, "missing-values-dialog")); dialog->mv[0] = get_widget_assert (xml, "mv0"); dialog->mv[1] = get_widget_assert (xml, "mv1"); dialog->mv[2] = get_widget_assert (xml, "mv2"); dialog->low = get_widget_assert (xml, "mv-low"); dialog->high = get_widget_assert (xml, "mv-high"); dialog->discrete = get_widget_assert (xml, "mv-discrete"); dialog->button_none = GTK_TOGGLE_BUTTON (get_widget_assert (xml, "no_missing")); dialog->button_discrete = GTK_TOGGLE_BUTTON (get_widget_assert (xml, "discrete_missing")); dialog->button_range = GTK_TOGGLE_BUTTON (get_widget_assert (xml, "range_missing")); psppire_dialog_set_accept_predicate (PSPPIRE_DIALOG (dialog), missing_val_dialog_acceptable, dialog); g_signal_connect (dialog->button_discrete, "toggled", G_CALLBACK (discrete), dialog); g_signal_connect (dialog->button_range, "toggled", G_CALLBACK (range), dialog); g_object_unref (xml); return obj; } void psppire_missing_val_dialog_set_variable (PsppireMissingValDialog *dialog, const struct variable *var) { enum val_type var_type; gint i; mv_destroy (&dialog->mvl); g_free (dialog->encoding); if (var != NULL) { const struct missing_values *vmv = var_get_missing_values (var); if (mv_is_empty(vmv)) mv_init (&dialog->mvl, var_get_width(var)); else mv_copy (&dialog->mvl, vmv); dialog->encoding = g_strdup (var_get_encoding (var)); dialog->format = *var_get_print_format (var); } else { mv_init (&dialog->mvl, 0); dialog->encoding = NULL; dialog->format = F_8_0; } /* Blank all entry boxes and make them insensitive */ gtk_entry_set_text (GTK_ENTRY (dialog->low), ""); gtk_entry_set_text (GTK_ENTRY (dialog->high), ""); gtk_entry_set_text (GTK_ENTRY (dialog->discrete), ""); gtk_widget_set_sensitive (dialog->low, FALSE); gtk_widget_set_sensitive (dialog->high, FALSE); gtk_widget_set_sensitive (dialog->discrete, FALSE); var_type = val_type_from_width (fmt_var_width (&dialog->format)); gtk_widget_set_sensitive (GTK_WIDGET (dialog->button_range), var_type == VAL_NUMERIC); if (var == NULL) return; for (i = 0 ; i < 3 ; ++i) { gtk_entry_set_text (GTK_ENTRY (dialog->mv[i]), ""); gtk_widget_set_sensitive (dialog->mv[i], FALSE); } if (mv_has_range (&dialog->mvl)) { union value low, high; gchar *low_text; gchar *high_text; mv_get_range (&dialog->mvl, &low.f, &high.f); low_text = value_to_text__ (low, &dialog->format, dialog->encoding); high_text = value_to_text__ (high, &dialog->format, dialog->encoding); gtk_entry_set_text (GTK_ENTRY (dialog->low), low_text); gtk_entry_set_text (GTK_ENTRY (dialog->high), high_text); g_free (low_text); g_free (high_text); if (mv_has_value (&dialog->mvl)) { gchar *text; text = value_to_text__ (*mv_get_value (&dialog->mvl, 0), &dialog->format, dialog->encoding); gtk_entry_set_text (GTK_ENTRY (dialog->discrete), text); g_free (text); } gtk_toggle_button_set_active (dialog->button_range, TRUE); gtk_widget_set_sensitive (dialog->low, TRUE); gtk_widget_set_sensitive (dialog->high, TRUE); gtk_widget_set_sensitive (dialog->discrete, TRUE); } else if (mv_has_value (&dialog->mvl)) { const int n = mv_n_values (&dialog->mvl); for (i = 0 ; i < 3 ; ++i) { if (i < n) { gchar *text ; text = value_to_text__ (*mv_get_value (&dialog->mvl, i), &dialog->format, dialog->encoding); gtk_entry_set_text (GTK_ENTRY (dialog->mv[i]), text); g_free (text); } gtk_widget_set_sensitive (dialog->mv[i], TRUE); } gtk_toggle_button_set_active (dialog->button_discrete, TRUE); } else if (mv_is_empty (&dialog->mvl)) { gtk_toggle_button_set_active (dialog->button_none, TRUE); } } const struct missing_values * psppire_missing_val_dialog_get_missing_values ( const PsppireMissingValDialog *dialog) { return &dialog->mvl; } pspp-1.4.1/src/ui/gui/psppire-variable-sheet.h0000644000175000017500000000312013320146056020623 0ustar00blpblp00000000000000/* PSPPIRE - a graphical user interface for PSPP. Copyright (C) 2017 John Darrington 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 3 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, see . */ #ifndef _PSPPIRE_VARIABLE_SHEET_H #define _PSPPIRE_VARIABLE_SHEET_H #include #include struct dispatch; struct _PsppireVariableSheet { SswSheet parent_instance; GtkCellRenderer *value_label_renderer; GtkCellRenderer *missing_values_renderer; GtkCellRenderer *var_type_renderer; struct dispatch *value_label_dispatch; struct dispatch *missing_values_dispatch; struct dispatch *var_type_dispatch; /* Row header popup menu */ GtkWidget *row_popup; GtkWidget *clear_variables_menu_item; gboolean dispose_has_run; }; struct _PsppireVariableSheetClass { SswSheetClass parent_class; }; #define PSPPIRE_TYPE_VARIABLE_SHEET psppire_variable_sheet_get_type () G_DECLARE_FINAL_TYPE (PsppireVariableSheet, psppire_variable_sheet, PSPPIRE, VARIABLE_SHEET, SswSheet) GtkWidget *psppire_variable_sheet_new (void); #endif pspp-1.4.1/src/ui/gui/psppire-window-register.h0000644000175000017500000000534413700645726021105 0ustar00blpblp00000000000000/* PSPPIRE - a graphical user interface for PSPP. Copyright (C) 2008 Free Software Foundation 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 3 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, see . */ #include #include #include "psppire-window.h" #ifndef __PSPPIRE_WINDOW_REGISTER_H__ #define __PSPPIRE_WINDOW_REGISTER_H__ G_BEGIN_DECLS #define PSPPIRE_TYPE_WINDOW_REGISTER (psppire_window_register_get_type ()) #define PSPPIRE_WINDOW_REGISTER(obj) \ (G_TYPE_CHECK_INSTANCE_CAST ((obj), \ PSPPIRE_TYPE_WINDOW_REGISTER, PsppireWindowRegister)) #define PSPPIRE_WINDOW_REGISTER_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST ((klass), \ PSPPIRE_TYPE_WINDOW_REGISTER, \ PsppireWindowRegisterClass)) #define PSPPIRE_IS_WINDOW_REGISTER(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE ((obj), PSPPIRE_TYPE_WINDOW_REGISTER)) #define PSPPIRE_IS_WINDOW_REGISTER_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE ((klass), PSPPIRE_TYPE_WINDOW_REGISTER)) #define PSPPIRE_WINDOW_REGISTER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), \ PSPPIRE_TYPE_WINDOW_REGISTER, \ PsppireWindowRegisterClass)) typedef struct _PsppireWindowRegister PsppireWindowRegister; typedef struct _PsppireWindowRegisterClass PsppireWindowRegisterClass; struct _PsppireWindowRegister { GObject parent; /*< private >*/ GHashTable *name_table; }; struct _PsppireWindowRegisterClass { GObjectClass parent_class; }; GType psppire_window_register_get_type (void) G_GNUC_CONST; PsppireWindowRegister * psppire_window_register_new (void); void psppire_window_register_insert (PsppireWindowRegister *wr, PsppireWindow *window, const gchar *name); void psppire_window_register_remove (PsppireWindowRegister *wr, const gchar *name); PsppireWindow *psppire_window_register_lookup (PsppireWindowRegister *wr, const gchar *name); void psppire_window_register_foreach (PsppireWindowRegister *wr, GHFunc func, gpointer); gint psppire_window_register_n_items (PsppireWindowRegister *wr); GtkWidget *create_windows_menu (GtkWindow *toplevel); G_END_DECLS #endif /* __PSPPIRE_WINDOW_REGISTER_H__ */ pspp-1.4.1/src/ui/gui/psppire-dialog-action-1sks.c0000644000175000017500000001074213670210420021317 0ustar00blpblp00000000000000/* PSPPIRE - a graphical user interface for PSPP. Copyright (C) 2012, 2013 Free Software Foundation 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 3 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, see . */ #include #include "psppire-dialog-action-1sks.h" #include "psppire-var-view.h" #include "psppire-dialog.h" #include "builder-wrapper.h" static void psppire_dialog_action_1sks_init (PsppireDialogAction1sks *act); static void psppire_dialog_action_1sks_class_init (PsppireDialogAction1sksClass *class); G_DEFINE_TYPE (PsppireDialogAction1sks, psppire_dialog_action_1sks, PSPPIRE_TYPE_DIALOG_ACTION); enum { CB_NORMAL, CB_POISSON, CB_UNIFORM, CB_EXPONENTIAL }; static void append_fragment (GString *string, const gchar *dist, PsppireVarView *vv) { g_string_append (string, "\n\t/KOLMOGOROV-SMIRNOV"); g_string_append (string, " ("); g_string_append (string, dist); g_string_append (string, ") = "); psppire_var_view_append_names (vv, 0, string); } static char * generate_syntax (const PsppireDialogAction *act) { PsppireDialogAction1sks *rd = PSPPIRE_DIALOG_ACTION_1SKS (act); gchar *text; GString *string = g_string_new ("NPAR TEST"); if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (rd->cb[CB_NORMAL]))) append_fragment (string, "NORMAL", PSPPIRE_VAR_VIEW (rd->variables)); if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (rd->cb[CB_UNIFORM]))) append_fragment (string, "UNIFORM", PSPPIRE_VAR_VIEW (rd->variables)); if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (rd->cb[CB_POISSON]))) append_fragment (string, "POISSON", PSPPIRE_VAR_VIEW (rd->variables)); if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (rd->cb[CB_EXPONENTIAL]))) append_fragment (string, "EXPONENTIAL", PSPPIRE_VAR_VIEW (rd->variables)); g_string_append (string, ".\n"); text = string->str; g_string_free (string, FALSE); return text; } static gboolean dialog_state_valid (gpointer data) { int i; PsppireDialogAction1sks *fd = PSPPIRE_DIALOG_ACTION_1SKS (data); GtkTreeModel *liststore = gtk_tree_view_get_model (GTK_TREE_VIEW (fd->variables)); if (gtk_tree_model_iter_n_children (liststore, NULL) < 1) return FALSE; for (i = 0; i < 4; ++i) { if (TRUE == gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (fd->cb[i]))) break; } if (i >= 4) return FALSE; return TRUE; } static void refresh (PsppireDialogAction *rd_) { PsppireDialogAction1sks *fd = PSPPIRE_DIALOG_ACTION_1SKS (rd_); int i; GtkTreeModel *liststore = gtk_tree_view_get_model (GTK_TREE_VIEW (fd->variables)); gtk_list_store_clear (GTK_LIST_STORE (liststore)); for (i = 0; i < 4; ++i) gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (fd->cb[i]), FALSE); } static GtkBuilder * psppire_dialog_action_1sks_activate (PsppireDialogAction *a, GVariant *param) { PsppireDialogAction *pda = PSPPIRE_DIALOG_ACTION (a); PsppireDialogAction1sks *act = PSPPIRE_DIALOG_ACTION_1SKS (a); GtkBuilder *xml = builder_new ("ks-one-sample.ui"); pda->dialog = get_widget_assert (xml, "ks-one-sample-dialog"); pda->source = get_widget_assert (xml, "dict-view"); act->variables = get_widget_assert (xml, "psppire-var-view1"); act->cb[CB_NORMAL] = get_widget_assert (xml, "checkbutton-normal"); act->cb[CB_POISSON] = get_widget_assert (xml, "checkbutton-poisson"); act->cb[CB_UNIFORM] = get_widget_assert (xml, "checkbutton-uniform"); act->cb[CB_EXPONENTIAL] = get_widget_assert (xml, "checkbutton-exp"); psppire_dialog_action_set_valid_predicate (pda, dialog_state_valid); psppire_dialog_action_set_refresh (pda, refresh); return xml; } static void psppire_dialog_action_1sks_class_init (PsppireDialogAction1sksClass *class) { PSPPIRE_DIALOG_ACTION_CLASS (class)->initial_activate = psppire_dialog_action_1sks_activate; PSPPIRE_DIALOG_ACTION_CLASS (class)->generate_syntax = generate_syntax; } static void psppire_dialog_action_1sks_init (PsppireDialogAction1sks *act) { } pspp-1.4.1/src/ui/gui/psppire-encoding-selector.h0000644000175000017500000000231313320146056021337 0ustar00blpblp00000000000000/* PSPPIRE - a graphical user interface for PSPP. Copyright (C) 2011 Free Software Foundation, Inc. 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 3 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, see . */ #ifndef PSPPIRE_ENCODING_SELECTOR_H #define PSPPIRE_ENCODING_SELECTOR_H 1 #include GtkWidget *psppire_encoding_selector_new (const char *default_encoding, gboolean allow_auto); /* Return a string describing the currently selected encoding. The caller should free this string when no longer required. */ gchar *psppire_encoding_selector_get_encoding (GtkWidget *selector); #endif /* PSPPIRE_ENCODING_SELECTOR_H */ pspp-1.4.1/src/ui/gui/psppire-import-assistant.c0000644000175000017500000014451013717773141021270 0ustar00blpblp00000000000000/* PSPPIRE - a graphical user interface for PSPP. Copyright (C) 2015, 2016, 2017, 2018, 2020 Free Software Foundation 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 3 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, see . */ #include #include #include "data/casereader.h" #include "data/data-in.h" #include "data/data-out.h" #include "data/dictionary.h" #include "data/format-guesser.h" #include "data/format.h" #include "data/gnumeric-reader.h" #include "data/ods-reader.h" #include "data/spreadsheet-reader.h" #include "data/value-labels.h" #include "data/casereader-provider.h" #include "libpspp/i18n.h" #include "libpspp/line-reader.h" #include "libpspp/message.h" #include "libpspp/hmap.h" #include "libpspp/hash-functions.h" #include "libpspp/str.h" #include "builder-wrapper.h" #include "psppire-data-sheet.h" #include "psppire-data-store.h" #include "psppire-dialog.h" #include "psppire-delimited-text.h" #include "psppire-dict.h" #include "psppire-encoding-selector.h" #include "psppire-import-assistant.h" #include "psppire-scanf.h" #include "psppire-spreadsheet-model.h" #include "psppire-text-file.h" #include "psppire-variable-sheet.h" #include "ui/syntax-gen.h" #include #define _(msgid) gettext (msgid) #define N_(msgid) msgid enum { MAX_LINE_LEN = 16384 }; /* Max length of an acceptable line. */ /* Chooses a name for each column on the separators page */ static void choose_column_names (PsppireImportAssistant *ia); static void intro_page_create (PsppireImportAssistant *ia); static void first_line_page_create (PsppireImportAssistant *ia); static void separators_page_create (PsppireImportAssistant *ia); static void formats_page_create (PsppireImportAssistant *ia); static void psppire_import_assistant_init (PsppireImportAssistant *act); static void psppire_import_assistant_class_init (PsppireImportAssistantClass *class); G_DEFINE_TYPE (PsppireImportAssistant, psppire_import_assistant, GTK_TYPE_ASSISTANT); /* Properties */ enum { PROP_0, }; static void psppire_import_assistant_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) { // PsppireImportAssistant *act = PSPPIRE_IMPORT_ASSISTANT (object); switch (prop_id) { default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; }; } static void psppire_import_assistant_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) { // PsppireImportAssistant *assistant = PSPPIRE_IMPORT_ASSISTANT (object); switch (prop_id) { default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; }; } static GObjectClass * parent_class = NULL; static void psppire_import_assistant_finalize (GObject *object) { PsppireImportAssistant *ia = PSPPIRE_IMPORT_ASSISTANT (object); if (ia->spreadsheet) spreadsheet_unref (ia->spreadsheet); ds_destroy (&ia->quotes); dict_unref (ia->dict); dict_unref (ia->casereader_dict); g_object_unref (ia->builder); ia->response = -1; g_main_loop_unref (ia->main_loop); if (G_OBJECT_CLASS (parent_class)->finalize) G_OBJECT_CLASS (parent_class)->finalize (object); } static void psppire_import_assistant_class_init (PsppireImportAssistantClass *class) { GObjectClass *object_class = G_OBJECT_CLASS (class); parent_class = g_type_class_peek_parent (class); object_class->set_property = psppire_import_assistant_set_property; object_class->get_property = psppire_import_assistant_get_property; object_class->finalize = psppire_import_assistant_finalize; } /* Causes the assistant to close, returning RESPONSE for interpretation by text_data_import_assistant. */ static void close_assistant (PsppireImportAssistant *ia, int response) { ia->response = response; g_main_loop_quit (ia->main_loop); gtk_widget_hide (GTK_WIDGET (ia)); } /* Called when the Paste button on the last page of the assistant is clicked. */ static void on_paste (GtkButton *button, PsppireImportAssistant *ia) { close_assistant (ia, PSPPIRE_RESPONSE_PASTE); } /* Revises the contents of the fields tree view based on the currently chosen set of separators. */ static void revise_fields_preview (PsppireImportAssistant *ia) { choose_column_names (ia); } struct separator { const char *name; /* Name (for use with get_widget_assert). */ gunichar c; /* Separator character. */ }; /* All the separators in the dialog box. */ static const struct separator separators[] = { {"space", ' '}, {"tab", '\t'}, {"bang", '!'}, {"colon", ':'}, {"comma", ','}, {"hyphen", '-'}, {"pipe", '|'}, {"semicolon", ';'}, {"slash", '/'}, }; #define SEPARATOR_CNT (sizeof separators / sizeof *separators) struct separator_count_node { struct hmap_node node; int occurance; /* The number of times the separator occurs in a line */ int quantity; /* The number of lines with this occurance */ }; /* Picks the most likely separator and quote characters based on IA's file data. */ static void choose_likely_separators (PsppireImportAssistant *ia) { gint first_line = 0; g_object_get (ia->delimiters_model, "first-line", &first_line, NULL); gboolean valid; GtkTreeIter iter; int j; struct hmap count_map[SEPARATOR_CNT]; for (j = 0; j < SEPARATOR_CNT; ++j) hmap_init (count_map + j); GtkTreePath *p = gtk_tree_path_new_from_indices (first_line, -1); for (valid = gtk_tree_model_get_iter (GTK_TREE_MODEL (ia->text_file), &iter, p); valid; valid = gtk_tree_model_iter_next (GTK_TREE_MODEL (ia->text_file), &iter)) { gchar *line_text = NULL; gtk_tree_model_get (GTK_TREE_MODEL (ia->text_file), &iter, 1, &line_text, -1); gint *counts = xzalloc (sizeof *counts * SEPARATOR_CNT); struct substring cs = ss_cstr (line_text); for (; UINT32_MAX != ss_first_mb (cs); ss_get_mb (&cs)) { ucs4_t character = ss_first_mb (cs); int s; for (s = 0; s < SEPARATOR_CNT; ++s) { if (character == separators[s].c) counts[s]++; } } int j; for (j = 0; j < SEPARATOR_CNT; ++j) { if (counts[j] > 0) { struct separator_count_node *cn = NULL; unsigned int hash = hash_int (counts[j], 0); HMAP_FOR_EACH_WITH_HASH (cn, struct separator_count_node, node, hash, &count_map[j]) { if (cn->occurance == counts[j]) break; } if (cn == NULL) { struct separator_count_node *new_cn = xzalloc (sizeof *new_cn); new_cn->occurance = counts[j]; new_cn->quantity = 1; hmap_insert (&count_map[j], &new_cn->node, hash); } else cn->quantity++; } } free (line_text); free (counts); } gtk_tree_path_free (p); if (hmap_count (count_map) > 0) { int most_frequent = -1; int largest = 0; for (j = 0; j < SEPARATOR_CNT; ++j) { struct separator_count_node *cn; HMAP_FOR_EACH (cn, struct separator_count_node, node, &count_map[j]) { if (largest < cn->quantity) { largest = cn->quantity; most_frequent = j; } } hmap_destroy (&count_map[j]); } g_return_if_fail (most_frequent >= 0); GtkWidget *toggle = get_widget_assert (ia->builder, separators[most_frequent].name); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (toggle), TRUE); } } static void repopulate_delimiter_columns (PsppireImportAssistant *ia) { /* Remove all the columns */ while (gtk_tree_view_get_n_columns (GTK_TREE_VIEW (ia->fields_tree_view)) > 0) { GtkTreeViewColumn *tvc = gtk_tree_view_get_column (GTK_TREE_VIEW (ia->fields_tree_view), 0); gtk_tree_view_remove_column (GTK_TREE_VIEW (ia->fields_tree_view), tvc); } gint n_fields = gtk_tree_model_get_n_columns (GTK_TREE_MODEL (ia->delimiters_model)); /* ... and put them back again. */ gint f; for (f = gtk_tree_view_get_n_columns (GTK_TREE_VIEW (ia->fields_tree_view)); f < n_fields; f++) { GtkCellRenderer *renderer = gtk_cell_renderer_text_new (); const gchar *title = NULL; if (f == 0) title = _("line"); else { if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (ia->variable_names_cb))) { title = psppire_delimited_text_get_header_title (PSPPIRE_DELIMITED_TEXT (ia->delimiters_model), f - 1); } if (title == NULL) title = _("var"); } GtkTreeViewColumn *column = gtk_tree_view_column_new_with_attributes (title, renderer, "text", f, NULL); g_object_set (column, "resizable", TRUE, "sizing", GTK_TREE_VIEW_COLUMN_AUTOSIZE, NULL); gtk_tree_view_append_column (GTK_TREE_VIEW (ia->fields_tree_view), column); } } static void reset_tree_view_model (PsppireImportAssistant *ia) { GtkTreeModel *tm = gtk_tree_view_get_model (GTK_TREE_VIEW (ia->fields_tree_view)); g_object_ref (tm); gtk_tree_view_set_model (GTK_TREE_VIEW (ia->fields_tree_view), NULL); repopulate_delimiter_columns (ia); gtk_tree_view_set_model (GTK_TREE_VIEW (ia->fields_tree_view), tm); // gtk_tree_view_columns_autosize (GTK_TREE_VIEW (ia->fields_tree_view)); g_object_unref (tm); } /* Called just before the separators page becomes visible in the assistant, and when the Reset button is clicked. */ static void prepare_separators_page (PsppireImportAssistant *ia, GtkWidget *page) { gtk_tree_view_set_model (GTK_TREE_VIEW (ia->fields_tree_view), GTK_TREE_MODEL (ia->delimiters_model)); g_signal_connect_swapped (GTK_TREE_MODEL (ia->delimiters_model), "notify::delimiters", G_CALLBACK (reset_tree_view_model), ia); repopulate_delimiter_columns (ia); revise_fields_preview (ia); choose_likely_separators (ia); } /* Resets IA's intro page to its initial state. */ static void reset_intro_page (PsppireImportAssistant *ia) { gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (ia->all_cases_button), TRUE); } /* Clears the set of user-modified variables from IA's formats substructure. This discards user modifications to variable formats, thereby causing formats to revert to their defaults. */ static void reset_formats_page (PsppireImportAssistant *ia, GtkWidget *page) { } static void prepare_formats_page (PsppireImportAssistant *ia); /* Called when the Reset button is clicked. */ static void on_reset (GtkButton *button, PsppireImportAssistant *ia) { gint pn = gtk_assistant_get_current_page (GTK_ASSISTANT (ia)); { GtkWidget *page = gtk_assistant_get_nth_page (GTK_ASSISTANT (ia), pn); page_func *on_reset = g_object_get_data (G_OBJECT (page), "on-reset"); if (on_reset) on_reset (ia, page); } } static gint next_page_func (gint old_page, gpointer data) { return old_page + 1; } /* Called just before PAGE is displayed as the current page of IMPORT_ASSISTANT, this updates IA content according to the new page. */ static void on_prepare (GtkAssistant *assistant, GtkWidget *page, PsppireImportAssistant *ia) { gtk_widget_show (ia->reset_button); gtk_widget_hide (ia->paste_button); gint pn = gtk_assistant_get_current_page (assistant); gint previous_page_index = ia->current_page; if (previous_page_index >= 0) { GtkWidget *closing_page = gtk_assistant_get_nth_page (GTK_ASSISTANT (ia), previous_page_index); if (pn > previous_page_index) { page_func *on_forward = g_object_get_data (G_OBJECT (closing_page), "on-forward"); if (on_forward) on_forward (ia, closing_page); } else { page_func *on_back = g_object_get_data (G_OBJECT (closing_page), "on-back"); if (on_back) on_back (ia, closing_page); } } { GtkWidget *new_page = gtk_assistant_get_nth_page (GTK_ASSISTANT (ia), pn); page_func *on_entering = g_object_get_data (G_OBJECT (new_page), "on-entering"); if (on_entering) on_entering (ia, new_page); } ia->current_page = pn; } /* Called when the Cancel button in the assistant is clicked. */ static void on_cancel (GtkAssistant *assistant, PsppireImportAssistant *ia) { close_assistant (ia, GTK_RESPONSE_CANCEL); } /* Called when the Apply button on the last page of the assistant is clicked. */ static void on_close (GtkAssistant *assistant, PsppireImportAssistant *ia) { close_assistant (ia, GTK_RESPONSE_APPLY); } static GtkWidget * add_page_to_assistant (PsppireImportAssistant *ia, GtkWidget *page, GtkAssistantPageType type, const gchar *); static void on_sheet_combo_changed (GtkComboBox *cb, PsppireImportAssistant *ia) { GtkTreeIter iter; gchar *range = NULL; GtkTreeModel *model = gtk_combo_box_get_model (cb); GtkBuilder *builder = ia->builder; GtkWidget *range_entry = get_widget_assert (builder, "cell-range-entry"); gtk_combo_box_get_active_iter (cb, &iter); gtk_tree_model_get (model, &iter, PSPPIRE_SPREADSHEET_MODEL_COL_RANGE, &range, -1); gtk_entry_set_text (GTK_ENTRY (range_entry), range ? range : ""); g_free (range); } /* Prepares IA's sheet_spec page. */ static void prepare_sheet_spec_page (PsppireImportAssistant *ia) { GtkBuilder *builder = ia->builder; GtkWidget *sheet_entry = get_widget_assert (builder, "sheet-entry"); GtkWidget *readnames_checkbox = get_widget_assert (builder, "readnames-checkbox"); GtkTreeModel *model = psppire_spreadsheet_model_new (ia->spreadsheet); gtk_combo_box_set_model (GTK_COMBO_BOX (sheet_entry), model); gint items = gtk_tree_model_iter_n_children (model, NULL); gtk_widget_set_sensitive (sheet_entry, items > 1); gtk_combo_box_set_active (GTK_COMBO_BOX (sheet_entry), 0); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (readnames_checkbox), FALSE); } /* Initializes IA's sheet_spec substructure. */ static void sheet_spec_page_create (PsppireImportAssistant *ia) { GtkBuilder *builder = ia->builder; GtkWidget *page = get_widget_assert (builder, "Spreadsheet-Importer"); GtkWidget *combo_box = get_widget_assert (builder, "sheet-entry"); GtkCellRenderer *renderer = gtk_cell_renderer_text_new (); gtk_cell_layout_clear (GTK_CELL_LAYOUT (combo_box)); gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (combo_box), renderer, TRUE); gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (combo_box), renderer, "text", 0, NULL); g_signal_connect (combo_box, "changed", G_CALLBACK (on_sheet_combo_changed), ia); add_page_to_assistant (ia, page, GTK_ASSISTANT_PAGE_CONTENT, _("Importing Spreadsheet Data")); g_object_set_data (G_OBJECT (page), "on-entering", prepare_sheet_spec_page); } static void on_chosen (PsppireImportAssistant *ia, GtkWidget *page) { GtkFileChooser *fc = GTK_FILE_CHOOSER (page); gchar *f = gtk_file_chooser_get_filename (fc); int i; for(i = gtk_assistant_get_n_pages (GTK_ASSISTANT (ia)); i > 0; --i) gtk_assistant_remove_page (GTK_ASSISTANT (ia), i); gtk_assistant_set_page_complete (GTK_ASSISTANT(ia), GTK_WIDGET (fc), FALSE); if (f && g_file_test (f, G_FILE_TEST_IS_REGULAR)) { gtk_assistant_set_page_complete (GTK_ASSISTANT(ia), GTK_WIDGET (fc), TRUE); if (ia->spreadsheet) spreadsheet_unref (ia->spreadsheet); ia->spreadsheet = gnumeric_probe (f, FALSE); if (!ia->spreadsheet) ia->spreadsheet = ods_probe (f, FALSE); if (ia->spreadsheet) { sheet_spec_page_create (ia); } else { intro_page_create (ia); first_line_page_create (ia); separators_page_create (ia); } formats_page_create (ia); } g_free (f); } /* This has to be done on a map signal callback, because GtkFileChooserWidget resets everything when it is mapped. */ static void on_map (PsppireImportAssistant *ia, GtkWidget *page) { #if TEXT_FILE GtkFileChooser *fc = GTK_FILE_CHOOSER (page); if (ia->file_name) gtk_file_chooser_set_filename (fc, ia->file_name); #endif on_chosen (ia, page); } static void chooser_page_enter (PsppireImportAssistant *ia, GtkWidget *page) { } static void chooser_page_leave (PsppireImportAssistant *ia, GtkWidget *page) { g_free (ia->file_name); ia->file_name = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (page)); gchar *encoding = psppire_encoding_selector_get_encoding (ia->encoding_selector); if (!ia->spreadsheet) { ia->text_file = psppire_text_file_new (ia->file_name, encoding); gtk_tree_view_set_model (GTK_TREE_VIEW (ia->first_line_tree_view), GTK_TREE_MODEL (ia->text_file)); } g_free (encoding); } static void chooser_page_reset (PsppireImportAssistant *ia, GtkWidget *page) { GtkFileChooser *fc = GTK_FILE_CHOOSER (page); gtk_file_chooser_set_filter (fc, ia->default_filter); gtk_file_chooser_unselect_all (fc); on_chosen (ia, page); } static void on_file_activated (GtkFileChooser *chooser, PsppireImportAssistant *ia) { gtk_assistant_next_page (GTK_ASSISTANT (ia)); } static void chooser_page_create (PsppireImportAssistant *ia) { GtkFileFilter *filter = NULL; GtkWidget *chooser = gtk_file_chooser_widget_new (GTK_FILE_CHOOSER_ACTION_OPEN); g_signal_connect (chooser, "file-activated", G_CALLBACK (on_file_activated), ia); g_object_set_data (G_OBJECT (chooser), "on-forward", chooser_page_leave); g_object_set_data (G_OBJECT (chooser), "on-reset", chooser_page_reset); g_object_set_data (G_OBJECT (chooser), "on-entering",chooser_page_enter); g_object_set (chooser, "local-only", FALSE, NULL); ia->default_filter = gtk_file_filter_new (); gtk_file_filter_set_name (ia->default_filter, _("All Files")); gtk_file_filter_add_pattern (ia->default_filter, "*"); gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (chooser), ia->default_filter); filter = gtk_file_filter_new (); gtk_file_filter_set_name (filter, _("Text Files")); gtk_file_filter_add_mime_type (filter, "text/*"); gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (chooser), filter); filter = gtk_file_filter_new (); gtk_file_filter_set_name (filter, _("Text (*.txt) Files")); gtk_file_filter_add_pattern (filter, "*.txt"); gtk_file_filter_add_pattern (filter, "*.TXT"); gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (chooser), filter); filter = gtk_file_filter_new (); gtk_file_filter_set_name (filter, _("Plain Text (ASCII) Files")); gtk_file_filter_add_mime_type (filter, "text/plain"); gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (chooser), filter); filter = gtk_file_filter_new (); gtk_file_filter_set_name (filter, _("Comma Separated Value Files")); gtk_file_filter_add_mime_type (filter, "text/csv"); gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (chooser), filter); /* I've never encountered one of these, but it's listed here: http://www.iana.org/assignments/media-types/text/tab-separated-values */ filter = gtk_file_filter_new (); gtk_file_filter_set_name (filter, _("Tab Separated Value Files")); gtk_file_filter_add_mime_type (filter, "text/tab-separated-values"); gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (chooser), filter); filter = gtk_file_filter_new (); gtk_file_filter_set_name (filter, _("Gnumeric Spreadsheet Files")); gtk_file_filter_add_mime_type (filter, "application/x-gnumeric"); gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (chooser), filter); filter = gtk_file_filter_new (); gtk_file_filter_set_name (filter, _("OpenDocument Spreadsheet Files")); gtk_file_filter_add_mime_type (filter, "application/vnd.oasis.opendocument.spreadsheet"); gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (chooser), filter); filter = gtk_file_filter_new (); gtk_file_filter_set_name (filter, _("All Spreadsheet Files")); gtk_file_filter_add_mime_type (filter, "application/x-gnumeric"); gtk_file_filter_add_mime_type (filter, "application/vnd.oasis.opendocument.spreadsheet"); gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (chooser), filter); ia->encoding_selector = psppire_encoding_selector_new ("Auto", TRUE); gtk_file_chooser_set_extra_widget (GTK_FILE_CHOOSER (chooser), ia->encoding_selector); add_page_to_assistant (ia, chooser, GTK_ASSISTANT_PAGE_INTRO, _("Select File to Import")); g_signal_connect_swapped (chooser, "selection-changed", G_CALLBACK (on_chosen), ia); g_signal_connect_swapped (chooser, "map", G_CALLBACK (on_map), ia); } static void psppire_import_assistant_init (PsppireImportAssistant *ia) { ia->builder = builder_new ("text-data-import.ui"); ia->current_page = -1 ; ia->file_name = NULL; ia->spreadsheet = NULL; ia->dict = NULL; ia->casereader_dict = NULL; ia->main_loop = g_main_loop_new (NULL, TRUE); g_signal_connect (ia, "prepare", G_CALLBACK (on_prepare), ia); g_signal_connect (ia, "cancel", G_CALLBACK (on_cancel), ia); g_signal_connect (ia, "close", G_CALLBACK (on_close), ia); ia->paste_button = gtk_button_new_with_label (_("Paste")); ia->reset_button = gtk_button_new_with_label (_("Reset")); gtk_assistant_add_action_widget (GTK_ASSISTANT(ia), ia->paste_button); g_signal_connect (ia->paste_button, "clicked", G_CALLBACK (on_paste), ia); g_signal_connect (ia->reset_button, "clicked", G_CALLBACK (on_reset), ia); gtk_assistant_add_action_widget (GTK_ASSISTANT(ia), ia->reset_button); gtk_window_set_title (GTK_WINDOW (ia), _("Importing Delimited Text Data")); gtk_window_set_icon_name (GTK_WINDOW (ia), "pspp"); chooser_page_create (ia); gtk_assistant_set_forward_page_func (GTK_ASSISTANT (ia), next_page_func, NULL, NULL); gtk_window_maximize (GTK_WINDOW (ia)); } /* Appends a page of the given TYPE, with PAGE as its content, to the GtkAssistant encapsulated by IA. Returns the GtkWidget that represents the page. */ static GtkWidget * add_page_to_assistant (PsppireImportAssistant *ia, GtkWidget *page, GtkAssistantPageType type, const gchar *title) { GtkWidget *content = page; gtk_assistant_append_page (GTK_ASSISTANT (ia), content); gtk_assistant_set_page_type (GTK_ASSISTANT(ia), content, type); gtk_assistant_set_page_title (GTK_ASSISTANT(ia), content, title); gtk_assistant_set_page_complete (GTK_ASSISTANT(ia), content, TRUE); return content; } /* Called when one of the radio buttons is clicked. */ static void on_intro_amount_changed (PsppireImportAssistant *p) { gtk_widget_set_sensitive (p->n_cases_spin, gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (p->n_cases_button))); gtk_widget_set_sensitive (p->percent_spin, gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (p->percent_button))); } static void on_treeview_selection_change (PsppireImportAssistant *ia) { GtkTreeSelection *selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (ia->first_line_tree_view)); GtkTreeModel *model = NULL; GtkTreeIter iter; if (gtk_tree_selection_get_selected (selection, &model, &iter)) { gint max_lines; int n; GtkTreePath *path = gtk_tree_model_get_path (model, &iter); gint *index = gtk_tree_path_get_indices (path); n = *index; gtk_tree_path_free (path); g_object_get (model, "maximum-lines", &max_lines, NULL); gtk_widget_set_sensitive (ia->variable_names_cb, (n > 0 && n < max_lines)); ia->delimiters_model = psppire_delimited_text_new (GTK_TREE_MODEL (ia->text_file)); g_object_set (ia->delimiters_model, "first-line", n, NULL); } } static void render_text_preview_line (GtkTreeViewColumn *tree_column, GtkCellRenderer *cell, GtkTreeModel *tree_model, GtkTreeIter *iter, gpointer data) { /* Set the text to a "insensitive" state if the row is greater than what the user declared to be the maximum. */ GtkTreePath *path = gtk_tree_model_get_path (tree_model, iter); gint *ii = gtk_tree_path_get_indices (path); gint max_lines; g_object_get (tree_model, "maximum-lines", &max_lines, NULL); g_object_set (cell, "sensitive", (*ii < max_lines), NULL); gtk_tree_path_free (path); } /* Initializes IA's first_line substructure. */ static void first_line_page_create (PsppireImportAssistant *ia) { GtkWidget *w = get_widget_assert (ia->builder, "FirstLine"); g_object_set_data (G_OBJECT (w), "on-entering", on_treeview_selection_change); add_page_to_assistant (ia, w, GTK_ASSISTANT_PAGE_CONTENT, _("Select the First Line")); GtkWidget *scrolled_window = get_widget_assert (ia->builder, "first-line-scroller"); if (ia->first_line_tree_view == NULL) { ia->first_line_tree_view = gtk_tree_view_new (); g_object_set (ia->first_line_tree_view, "enable-search", FALSE, NULL); gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (ia->first_line_tree_view), TRUE); GtkCellRenderer *renderer = gtk_cell_renderer_text_new (); GtkTreeViewColumn *column = gtk_tree_view_column_new_with_attributes (_("Line"), renderer, "text", 0, NULL); gtk_tree_view_column_set_cell_data_func (column, renderer, render_text_preview_line, ia, 0); gtk_tree_view_append_column (GTK_TREE_VIEW (ia->first_line_tree_view), column); renderer = gtk_cell_renderer_text_new (); column = gtk_tree_view_column_new_with_attributes (_("Text"), renderer, "text", 1, NULL); gtk_tree_view_column_set_cell_data_func (column, renderer, render_text_preview_line, ia, 0); gtk_tree_view_append_column (GTK_TREE_VIEW (ia->first_line_tree_view), column); g_signal_connect_swapped (ia->first_line_tree_view, "cursor-changed", G_CALLBACK (on_treeview_selection_change), ia); gtk_container_add (GTK_CONTAINER (scrolled_window), ia->first_line_tree_view); } gtk_widget_show_all (scrolled_window); ia->variable_names_cb = get_widget_assert (ia->builder, "variable-names"); } static void intro_on_leave (PsppireImportAssistant *ia) { gint lc = 0; g_object_get (ia->text_file, "line-count", &lc, NULL); if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (ia->n_cases_button))) { gint max_lines = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (ia->n_cases_spin)); g_object_set (ia->text_file, "maximum-lines", max_lines, NULL); } else if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (ia->percent_button))) { gdouble percent = gtk_spin_button_get_value (GTK_SPIN_BUTTON (ia->percent_spin)); g_object_set (ia->text_file, "maximum-lines", (gint) (lc * percent / 100.0), NULL); } else { g_object_set (ia->text_file, "maximum-lines", lc, NULL); } } static void intro_on_enter (PsppireImportAssistant *ia) { GtkBuilder *builder = ia->builder; GtkWidget *table = get_widget_assert (builder, "button-table"); struct string s; ds_init_empty (&s); ds_put_cstr (&s, _("This assistant will guide you through the process of " "importing data into PSPP from a text file with one line " "per case, in which fields are separated by tabs, " "commas, or other delimiters.\n\n")); if (ia->text_file) { if (ia->text_file->total_is_exact) { ds_put_format ( &s, ngettext ("The selected file contains %'lu line of text. ", "The selected file contains %'lu lines of text. ", ia->text_file->total_lines), ia->text_file->total_lines); } else if (ia->text_file->total_lines > 0) { ds_put_format ( &s, ngettext ( "The selected file contains approximately %'lu line of text. ", "The selected file contains approximately %'lu lines of text. ", ia->text_file->total_lines), ia->text_file->total_lines); ds_put_format ( &s, ngettext ( "Only the first %zu line of the file will be shown for " "preview purposes in the following screens. ", "Only the first %zu lines of the file will be shown for " "preview purposes in the following screens. ", ia->text_file->line_cnt), ia->text_file->line_cnt); } } ds_put_cstr (&s, _("You may choose below how much of the file should " "actually be imported.")); gtk_label_set_text (GTK_LABEL (get_widget_assert (builder, "intro-label")), ds_cstr (&s)); ds_destroy (&s); if (gtk_grid_get_child_at (GTK_GRID (table), 1, 1) == NULL) { GtkWidget *hbox_n_cases = psppire_scanf_new (_("Only the first %4d cases"), &ia->n_cases_spin); gtk_grid_attach (GTK_GRID (table), hbox_n_cases, 1, 1, 1, 1); } GtkAdjustment *adj = gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON (ia->n_cases_spin)); gtk_adjustment_set_lower (adj, 1.0); if (gtk_grid_get_child_at (GTK_GRID (table), 1, 2) == NULL) { GtkWidget *hbox_percent = psppire_scanf_new (_("Only the first %3d %% of file (approximately)"), &ia->percent_spin); gtk_grid_attach (GTK_GRID (table), hbox_percent, 1, 2, 1, 1); } gtk_widget_show_all (table); on_intro_amount_changed (ia); } /* Initializes IA's intro substructure. */ static void intro_page_create (PsppireImportAssistant *ia) { GtkBuilder *builder = ia->builder; GtkWidget *w = get_widget_assert (builder, "Intro"); ia->percent_spin = gtk_spin_button_new_with_range (0, 100, 10); add_page_to_assistant (ia, w, GTK_ASSISTANT_PAGE_CONTENT, _("Select the Lines to Import")); ia->all_cases_button = get_widget_assert (builder, "import-all-cases"); ia->n_cases_button = get_widget_assert (builder, "import-n-cases"); ia->percent_button = get_widget_assert (builder, "import-percent"); g_signal_connect_swapped (ia->all_cases_button, "toggled", G_CALLBACK (on_intro_amount_changed), ia); g_signal_connect_swapped (ia->n_cases_button, "toggled", G_CALLBACK (on_intro_amount_changed), ia); g_signal_connect_swapped (ia->percent_button, "toggled", G_CALLBACK (on_intro_amount_changed), ia); g_object_set_data (G_OBJECT (w), "on-forward", intro_on_leave); g_object_set_data (G_OBJECT (w), "on-entering", intro_on_enter); g_object_set_data (G_OBJECT (w), "on-reset", reset_intro_page); } GtkWidget * psppire_import_assistant_new (GtkWindow *toplevel) { return GTK_WIDGET (g_object_new (PSPPIRE_TYPE_IMPORT_ASSISTANT, /* Some window managers (notably ratpoison) ignore the maximise command when a window is transient. This causes problems for this window. */ /* "transient-for", toplevel, */ NULL)); } /* Chooses a name for each column on the separators page */ static void choose_column_names (PsppireImportAssistant *ia) { int i; unsigned long int generated_name_count = 0; dict_clear (ia->dict); for (i = 0; i < gtk_tree_model_get_n_columns (GTK_TREE_MODEL (ia->delimiters_model)) - 1; ++i) { const gchar *candidate_name = NULL; if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (ia->variable_names_cb))) { candidate_name = psppire_delimited_text_get_header_title (PSPPIRE_DELIMITED_TEXT (ia->delimiters_model), i); } char *name = dict_make_unique_var_name (ia->dict, candidate_name, &generated_name_count); dict_create_var_assert (ia->dict, name, 0); free (name); } } /* Called when the user toggles one of the separators checkboxes. */ static void on_separator_toggle (GtkToggleButton *toggle UNUSED, PsppireImportAssistant *ia) { int i; GSList *delimiters = NULL; for (i = 0; i < SEPARATOR_CNT; i++) { const struct separator *s = &separators[i]; GtkWidget *button = get_widget_assert (ia->builder, s->name); if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (button))) { delimiters = g_slist_prepend (delimiters, GINT_TO_POINTER (s->c)); } } g_object_set (ia->delimiters_model, "delimiters", delimiters, NULL); revise_fields_preview (ia); } /* Called when the user changes the entry field for custom separators. */ static void on_separators_custom_entry_notify (GObject *gobject UNUSED, GParamSpec *arg1 UNUSED, PsppireImportAssistant *ia) { revise_fields_preview (ia); } /* Called when the user toggles the checkbox that enables custom separators. */ static void on_separators_custom_cb_toggle (GtkToggleButton *custom_cb, PsppireImportAssistant *ia) { bool is_active = gtk_toggle_button_get_active (custom_cb); gtk_widget_set_sensitive (ia->custom_entry, is_active); revise_fields_preview (ia); } /* Called when the user changes the selection in the combo box that selects a quote character. */ static void on_quote_combo_change (GtkComboBox *combo, PsppireImportAssistant *ia) { // revise_fields_preview (ia); } /* Called when the user toggles the checkbox that enables quoting. */ static void on_quote_cb_toggle (GtkToggleButton *quote_cb, PsppireImportAssistant *ia) { bool is_active = gtk_toggle_button_get_active (quote_cb); gtk_widget_set_sensitive (ia->quote_combo, is_active); revise_fields_preview (ia); } /* Initializes IA's separators substructure. */ static void separators_page_create (PsppireImportAssistant *ia) { GtkBuilder *builder = ia->builder; size_t i; GtkWidget *w = get_widget_assert (builder, "Separators"); g_object_set_data (G_OBJECT (w), "on-entering", prepare_separators_page); g_object_set_data (G_OBJECT (w), "on-reset", prepare_separators_page); add_page_to_assistant (ia, w, GTK_ASSISTANT_PAGE_CONTENT, _("Choose Separators")); ia->custom_cb = get_widget_assert (builder, "custom-cb"); ia->custom_entry = get_widget_assert (builder, "custom-entry"); ia->quote_combo = get_widget_assert (builder, "quote-combo"); ia->quote_cb = get_widget_assert (builder, "quote-cb"); gtk_combo_box_set_active (GTK_COMBO_BOX (ia->quote_combo), 0); if (ia->fields_tree_view == NULL) { GtkWidget *scroller = get_widget_assert (ia->builder, "fields-scroller"); ia->fields_tree_view = gtk_tree_view_new (); g_object_set (ia->fields_tree_view, "enable-search", FALSE, NULL); gtk_container_add (GTK_CONTAINER (scroller), GTK_WIDGET (ia->fields_tree_view)); gtk_widget_show_all (scroller); } g_signal_connect (ia->quote_combo, "changed", G_CALLBACK (on_quote_combo_change), ia); g_signal_connect (ia->quote_cb, "toggled", G_CALLBACK (on_quote_cb_toggle), ia); g_signal_connect (ia->custom_entry, "notify::text", G_CALLBACK (on_separators_custom_entry_notify), ia); g_signal_connect (ia->custom_cb, "toggled", G_CALLBACK (on_separators_custom_cb_toggle), ia); for (i = 0; i < SEPARATOR_CNT; i++) g_signal_connect (get_widget_assert (builder, separators[i].name), "toggled", G_CALLBACK (on_separator_toggle), ia); } static struct casereader_random_class my_casereader_class; static struct ccase * my_read (struct casereader *reader, void *aux, casenumber idx) { PsppireImportAssistant *ia = PSPPIRE_IMPORT_ASSISTANT (aux); GtkTreeModel *tm = GTK_TREE_MODEL (ia->delimiters_model); GtkTreePath *tp = gtk_tree_path_new_from_indices (idx, -1); const struct caseproto *proto = casereader_get_proto (reader); GtkTreeIter iter; struct ccase *c = NULL; if (gtk_tree_model_get_iter (tm, &iter, tp)) { c = case_create (proto); int i; for (i = 0 ; i < caseproto_get_n_widths (proto); ++i) { GValue value = {0}; gtk_tree_model_get_value (tm, &iter, i + 1, &value); const struct variable *var = dict_get_var (ia->casereader_dict, i); const gchar *ss = g_value_get_string (&value); if (ss) { union value *v = case_data_rw (c, var); /* In this reader we derive the union value from the string in the tree_model. We retrieve the width and format from a dictionary which is stored directly after the reader creation. Changes in ia->dict in the variable window are not reflected here and therefore this is always compatible with the width in the caseproto. See bug #58298 */ char *xx = data_in (ss_cstr (ss), "UTF-8", var_get_write_format (var)->type, v, var_get_width (var), "UTF-8"); /* if (xx) */ /* g_print ("%s:%d Err %s\n", __FILE__, __LINE__, xx); */ free (xx); } g_value_unset (&value); } } gtk_tree_path_free (tp); return c; } static void my_destroy (struct casereader *reader, void *aux) { g_print ("%s:%d %p\n", __FILE__, __LINE__, reader); } static void my_advance (struct casereader *reader, void *aux, casenumber cnt) { g_print ("%s:%d\n", __FILE__, __LINE__); } static struct casereader * textfile_create_reader (PsppireImportAssistant *ia) { int n_vars = dict_get_var_cnt (ia->dict); int i; struct fmt_guesser **fg = XCALLOC (n_vars, struct fmt_guesser *); for (i = 0 ; i < n_vars; ++i) { fg[i] = fmt_guesser_create (); } gint n_rows = gtk_tree_model_iter_n_children (GTK_TREE_MODEL (ia->delimiters_model), NULL); GtkTreeIter iter; gboolean ok; for (ok = gtk_tree_model_get_iter_first (GTK_TREE_MODEL (ia->delimiters_model), &iter); ok; ok = gtk_tree_model_iter_next (GTK_TREE_MODEL (ia->delimiters_model), &iter)) { for (i = 0 ; i < n_vars; ++i) { gchar *s = NULL; gtk_tree_model_get (GTK_TREE_MODEL (ia->delimiters_model), &iter, i+1, &s, -1); if (s) fmt_guesser_add (fg[i], ss_cstr (s)); free (s); } } struct caseproto *proto = caseproto_create (); for (i = 0 ; i < n_vars; ++i) { struct fmt_spec fs; fmt_guesser_guess (fg[i], &fs); fmt_fix (&fs, FMT_FOR_INPUT); struct variable *var = dict_get_var (ia->dict, i); int width = fmt_var_width (&fs); var_set_width_and_formats (var, width, &fs, &fs); proto = caseproto_add_width (proto, width); fmt_guesser_destroy (fg[i]); } free (fg); struct casereader *cr = casereader_create_random (proto, n_rows, &my_casereader_class, ia); /* Store the dictionary at this point when the casereader is created. my_read depends on the dictionary to interpret the strings in the treeview. This guarantees that the union value is produced according to the caseproto in the reader. */ ia->casereader_dict = dict_clone (ia->dict); caseproto_unref (proto); return cr; } /* When during import the variable type is changed, the reader is reinitialized based on the new dictionary with a fresh caseprototype. The default behaviour when a variable type is changed and the column is resized is that the union value is interpreted with new variable type and an overlay for that column is generated. Here we reinit to the original reader based on strings. As a result you can switch from string to numeric to string without loosing the string information. */ static void ia_variable_changed_cb (GObject *obj, gint var_num, guint what, const struct variable *oldvar, gpointer data) { PsppireImportAssistant *ia = PSPPIRE_IMPORT_ASSISTANT (data); struct caseproto *proto = caseproto_create(); for (int i = 0; i < dict_get_var_cnt (ia->dict); i++) { const struct variable *var = dict_get_var (ia->dict, i); int width = var_get_width (var); proto = caseproto_add_width (proto, width); } gint n_rows = gtk_tree_model_iter_n_children (GTK_TREE_MODEL (ia->delimiters_model), NULL); PsppireDataStore *store = NULL; g_object_get (ia->data_sheet, "data-model", &store, NULL); struct casereader *cr = casereader_create_random (proto, n_rows, &my_casereader_class, ia); psppire_data_store_set_reader (store, cr); dict_unref (ia->casereader_dict); ia->casereader_dict = dict_clone (ia->dict); } /* Called just before the formats page of the assistant is displayed. */ static void prepare_formats_page (PsppireImportAssistant *ia) { my_casereader_class.read = my_read; my_casereader_class.destroy = my_destroy; my_casereader_class.advance = my_advance; if (ia->spreadsheet) { GtkBuilder *builder = ia->builder; GtkWidget *range_entry = get_widget_assert (builder, "cell-range-entry"); GtkWidget *rnc = get_widget_assert (builder, "readnames-checkbox"); GtkWidget *combo_box = get_widget_assert (builder, "sheet-entry"); struct spreadsheet_read_options opts; opts.sheet_name = NULL; opts.sheet_index = gtk_combo_box_get_active (GTK_COMBO_BOX (combo_box)) + 1; opts.read_names = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (rnc)); opts.cell_range = g_strdup (gtk_entry_get_text (GTK_ENTRY (range_entry))); opts.asw = 8; struct casereader *reader = spreadsheet_make_reader (ia->spreadsheet, &opts); PsppireDict *dict = psppire_dict_new_from_dict (ia->spreadsheet->dict); PsppireDataStore *store = psppire_data_store_new (dict); psppire_data_store_set_reader (store, reader); g_object_set (ia->data_sheet, "data-model", store, NULL); g_object_set (ia->var_sheet, "data-model", dict, NULL); } else { struct casereader *reader = textfile_create_reader (ia); PsppireDict *dict = psppire_dict_new_from_dict (ia->dict); PsppireDataStore *store = psppire_data_store_new (dict); psppire_data_store_set_reader (store, reader); g_signal_connect (dict, "variable-changed", G_CALLBACK (ia_variable_changed_cb), ia); g_object_set (ia->data_sheet, "data-model", store, NULL); g_object_set (ia->var_sheet, "data-model", dict, NULL); } gint pmax; g_object_get (get_widget_assert (ia->builder, "vpaned1"), "max-position", &pmax, NULL); g_object_set (get_widget_assert (ia->builder, "vpaned1"), "position", pmax / 2, NULL); gtk_widget_show (ia->paste_button); } static void formats_page_create (PsppireImportAssistant *ia) { GtkBuilder *builder = ia->builder; GtkWidget *w = get_widget_assert (builder, "Formats"); g_object_set_data (G_OBJECT (w), "on-entering", prepare_formats_page); g_object_set_data (G_OBJECT (w), "on-reset", reset_formats_page); GtkWidget *vars_scroller = get_widget_assert (builder, "vars-scroller"); if (ia->var_sheet == NULL) { ia->var_sheet = psppire_variable_sheet_new (); gtk_container_add (GTK_CONTAINER (vars_scroller), ia->var_sheet); ia->dict = dict_create (get_default_encoding ()); gtk_widget_show_all (vars_scroller); } GtkWidget *data_scroller = get_widget_assert (builder, "data-scroller"); if (ia->data_sheet == NULL) { ia->data_sheet = psppire_data_sheet_new (); g_object_set (ia->data_sheet, "editable", FALSE, NULL); gtk_container_add (GTK_CONTAINER (data_scroller), ia->data_sheet); gtk_widget_show_all (data_scroller); } add_page_to_assistant (ia, w, GTK_ASSISTANT_PAGE_CONFIRM, _("Adjust Variable Formats")); } static void separators_append_syntax (const PsppireImportAssistant *ia, struct string *s) { int i; ds_put_cstr (s, " /DELIMITERS=\""); if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (get_widget_assert (ia->builder, "tab")))) ds_put_cstr (s, "\\t"); for (i = 0; i < SEPARATOR_CNT; i++) { const struct separator *seps = &separators[i]; GtkWidget *button = get_widget_assert (ia->builder, seps->name); if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (button))) { if (seps->c == '\t') continue; ds_put_byte (s, seps->c); } } ds_put_cstr (s, "\"\n"); if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (ia->quote_cb))) { GtkComboBoxText *cbt = GTK_COMBO_BOX_TEXT (ia->quote_combo); gchar *quotes = gtk_combo_box_text_get_active_text (cbt); if (quotes && *quotes) syntax_gen_pspp (s, " /QUALIFIER=%sq\n", quotes); free (quotes); } } static void formats_append_syntax (const PsppireImportAssistant *ia, struct string *s) { int i; int var_cnt; g_return_if_fail (ia->dict); ds_put_cstr (s, " /VARIABLES=\n"); var_cnt = dict_get_var_cnt (ia->dict); for (i = 0; i < var_cnt; i++) { struct variable *var = dict_get_var (ia->dict, i); char format_string[FMT_STRING_LEN_MAX + 1]; fmt_to_string (var_get_print_format (var), format_string); ds_put_format (s, " %s %s%s\n", var_get_name (var), format_string, i == var_cnt - 1 ? "." : ""); } } static void first_line_append_syntax (const PsppireImportAssistant *ia, struct string *s) { gint first_case = 0; g_object_get (ia->delimiters_model, "first-line", &first_case, NULL); if (first_case > 0) ds_put_format (s, " /FIRSTCASE=%d\n", first_case + 1); } static void intro_append_syntax (const PsppireImportAssistant *ia, struct string *s) { gint first_line = 0; g_object_get (ia->delimiters_model, "first-line", &first_line, NULL); if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (ia->n_cases_button))) ds_put_format (s, "SELECT IF ($CASENUM <= %d).\n", gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (ia->n_cases_spin)) - first_line); else if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (ia->percent_button))) ds_put_format (s, "SAMPLE %.4g.\n", gtk_spin_button_get_value (GTK_SPIN_BUTTON (ia->percent_spin)) / 100.0); } /* Emits PSPP syntax to S that applies the dictionary attributes (such as missing values and value labels) of the variables in DICT. */ static void apply_dict (const struct dictionary *dict, struct string *s) { size_t var_cnt = dict_get_var_cnt (dict); size_t i; for (i = 0; i < var_cnt; i++) { struct variable *var = dict_get_var (dict, i); const char *name = var_get_name (var); enum val_type type = var_get_type (var); int width = var_get_width (var); enum measure measure = var_get_measure (var); enum var_role role = var_get_role (var); enum alignment alignment = var_get_alignment (var); const struct fmt_spec *format = var_get_print_format (var); if (var_has_missing_values (var)) { const struct missing_values *mv = var_get_missing_values (var); size_t j; syntax_gen_pspp (s, "MISSING VALUES %ss (", name); for (j = 0; j < mv_n_values (mv); j++) { if (j) ds_put_cstr (s, ", "); syntax_gen_value (s, mv_get_value (mv, j), width, format); } if (mv_has_range (mv)) { double low, high; if (mv_has_value (mv)) ds_put_cstr (s, ", "); mv_get_range (mv, &low, &high); syntax_gen_num_range (s, low, high, format); } ds_put_cstr (s, ").\n"); } if (var_has_value_labels (var)) { const struct val_labs *vls = var_get_value_labels (var); const struct val_lab **labels = val_labs_sorted (vls); size_t n_labels = val_labs_count (vls); size_t i; syntax_gen_pspp (s, "VALUE LABELS %ss", name); for (i = 0; i < n_labels; i++) { const struct val_lab *vl = labels[i]; ds_put_cstr (s, "\n "); syntax_gen_value (s, &vl->value, width, format); ds_put_byte (s, ' '); syntax_gen_string (s, ss_cstr (val_lab_get_escaped_label (vl))); } free (labels); ds_put_cstr (s, ".\n"); } if (var_has_label (var)) syntax_gen_pspp (s, "VARIABLE LABELS %ss %sq.\n", name, var_get_label (var)); if (measure != var_default_measure (type)) syntax_gen_pspp (s, "VARIABLE LEVEL %ss (%ss).\n", name, measure_to_syntax (measure)); if (role != ROLE_INPUT) syntax_gen_pspp (s, "VARIABLE ROLE /%ss %ss.\n", var_role_to_syntax (role), name); if (alignment != var_default_alignment (type)) syntax_gen_pspp (s, "VARIABLE ALIGNMENT %ss (%ss).\n", name, alignment_to_syntax (alignment)); if (var_get_display_width (var) != var_default_display_width (width)) syntax_gen_pspp (s, "VARIABLE WIDTH %ss (%d).\n", name, var_get_display_width (var)); } } static void sheet_spec_gen_syntax (PsppireImportAssistant *ia, struct string *s) { GtkBuilder *builder = ia->builder; GtkWidget *range_entry = get_widget_assert (builder, "cell-range-entry"); GtkWidget *sheet_entry = get_widget_assert (builder, "sheet-entry"); GtkWidget *rnc = get_widget_assert (builder, "readnames-checkbox"); const gchar *range = gtk_entry_get_text (GTK_ENTRY (range_entry)); int sheet_index = 1 + gtk_combo_box_get_active (GTK_COMBO_BOX (sheet_entry)); gboolean read_names = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (rnc)); char *filename; if (ia->spreadsheet) filename = ia->spreadsheet->file_name; else g_object_get (ia->text_file, "file-name", &filename, NULL); syntax_gen_pspp (s, "GET DATA" "\n /TYPE=%ss" "\n /FILE=%sq" "\n /SHEET=index %d" "\n /READNAMES=%ss", (ia->spreadsheet->type == SPREADSHEET_GNUMERIC) ? "GNM" : "ODS", filename, sheet_index, read_names ? "ON" : "OFF"); if (range && 0 != strcmp ("", range)) { syntax_gen_pspp (s, "\n /CELLRANGE=RANGE %sq", range); } else { syntax_gen_pspp (s, "\n /CELLRANGE=FULL"); } syntax_gen_pspp (s, ".\n"); } gchar * psppire_import_assistant_generate_syntax (PsppireImportAssistant *ia) { struct string s = DS_EMPTY_INITIALIZER; if (!ia->spreadsheet) { gchar *file_name = NULL; gchar *encoding = NULL; g_object_get (ia->text_file, "file-name", &file_name, "encoding", &encoding, NULL); if (file_name == NULL) return NULL; syntax_gen_pspp (&s, "GET DATA" "\n /TYPE=TXT" "\n /FILE=%sq\n", file_name); if (encoding && strcmp (encoding, "Auto")) syntax_gen_pspp (&s, " /ENCODING=%sq\n", encoding); ds_put_cstr (&s, " /ARRANGEMENT=DELIMITED\n" " /DELCASE=LINE\n"); first_line_append_syntax (ia, &s); separators_append_syntax (ia, &s); formats_append_syntax (ia, &s); apply_dict (ia->dict, &s); intro_append_syntax (ia, &s); } else { sheet_spec_gen_syntax (ia, &s); } return ds_cstr (&s); } int psppire_import_assistant_run (PsppireImportAssistant *asst) { g_main_loop_run (asst->main_loop); return asst->response; } pspp-1.4.1/src/ui/gui/pspp.lang0000644000175000017500000000553513320146056015740 0ustar00blpblp00000000000000
Descriptives]]> 00000000001_lightNotesData.bin
00000000002_lightTableData.bin
* Menu: * SPV Structure heading Element:: * SPV Structure label Element:: * SPV Structure container Element:: * SPV Structure text Element (Inside container):: * SPV Structure html Element:: * SPV Structure table Element:: * SPV Structure graph Element:: * SPV Structure model Element:: * SPV Structure tree Element:: * SPV Structure Path Elements:: * SPV Structure pageSetup Element:: * SPV Structure text Element (Inside pageParagraph)::  File: pspp-dev.info, Node: SPV Structure heading Element, Next: SPV Structure label Element, Up: SPV Structure Member Format D.1.1 The 'heading' Element --------------------------- heading[root_heading] :creator-version? :creator? :creation-date-time? :lockReader=bool? :schemaLocation? => label pageSetup? (container | heading)* heading :creator-version? :commandName? :visibility[heading_visibility]=(collapsed)? :locale? :olang? => label (container | heading)* The root of a structure member is a 'heading', which represents a section of output beginning with a title (the 'label') and ordinarily followed by content containers or further nested (sub)-sections of output. Unlike heading elements in HTML and other common document formats, which precede the content that they head, 'heading' contains the elements that appear below the heading. The document root heading, only, may contain a 'pageSetup' element. The following attributes have been observed on both document root and nested 'heading' elements. -- Attribute: creator-version The version of the software that created this SPV file. A string of the form 'xxyyzzww' represents software version xx.yy.zz.ww, e.g. '21000001' is version 21.0.0.1. Trailing pairs of zeros are sometimes omitted, so that '21', '210000', and '21000000' are all version 21.0.0.0 (and the corpus contains all three of those forms). The following attributes have been observed on document root 'heading' elements only: -- Attribute: 'creator' The directory in the file system of the software that created this SPV file. -- Attribute: 'creation-date-time' The date and time at which the SPV file was written, in a locale-specific format, e.g. 'Friday, May 16, 2014 6:47:37 PM PDT' or 'lunedì 17 marzo 2014 3.15.48 CET' or even 'Friday, December 5, 2014 5:00:19 o'clock PM EST'. -- Attribute: 'lockReader' Whether a reader should be allowed to edit the output. The possible values are 'true' and 'false'. The value 'false' is by far the most common. -- Attribute: 'schemaLocation' This is actually an XML Namespace attribute. A reader may ignore it. The following attributes have been observed only on nested 'heading' elements: -- Attribute: 'commandName' A locale-invariant identifier for the command that produced the output, e.g. 'Frequencies', 'T-Test', 'Non Par Corr'. -- Attribute: 'visibility' To what degree the output represented by the element is visible. -- Attribute: 'locale' The locale used for output, in Windows format, which is similar to the format used in Unix with the underscore replaced by a hyphen, e.g. 'en-US', 'en-GB', 'el-GR', 'sr-Cryl-RS'. -- Attribute: 'olang' The output language, e.g. 'en', 'it', 'es', 'de', 'pt-BR'.  File: pspp-dev.info, Node: SPV Structure label Element, Next: SPV Structure container Element, Prev: SPV Structure heading Element, Up: SPV Structure Member Format D.1.2 The 'label' Element ------------------------- label => TEXT Every 'heading' and 'container' holds a 'label' as its first child. The root 'heading' in a structure member always contains the string "Output" (localized). Otherwise, the text in 'label' describes what it labels, often by naming the statistical procedure that was executed, e.g. "Frequencies" or "T-Test". Labels are often very generic, especially within a 'container', e.g. "Title" or "Warnings" or "Notes". Label text is localized according to the output language, e.g. in Italian a frequency table procedure is labeled "Frequenze". The corpus contains a few examples of empty labels, ones that contain no text.  File: pspp-dev.info, Node: SPV Structure container Element, Next: SPV Structure text Element (Inside container), Prev: SPV Structure label Element, Up: SPV Structure Member Format D.1.3 The 'container' Element ----------------------------- container :visibility=(visible | hidden) :page-break-before=(always)? :text-align=(left | center)? :width=dimension => label (table | container_text | graph | model | object | image | tree) A 'container' serves to contain and label a 'table', 'text', or other kind of item. This element has the following attributes. -- Attribute: 'visibility' Whether the container's content is displayed. "Notes" tables are often hidden; other data is usually -- Attribute: 'text-align' Alignment of text within the container. Observed with nested 'table' and 'text' elements. -- Attribute: 'width' The width of the container, e.g. '1097px'.  File: pspp-dev.info, Node: SPV Structure text Element (Inside container), Next: SPV Structure html Element, Prev: SPV Structure container Element, Up: SPV Structure Member Format D.1.4 The 'text' Element (Inside 'container') --------------------------------------------- text[container_text] :type[text_type]=(title | log | text | page-title) :commandName? :creator-version? => html This 'text' element is nested inside a 'container'. There is a different 'text' element that is nested inside a 'pageParagraph'. This element has the following attributes. -- Attribute: 'type' The semantics of the text. -- Attribute: 'commandName' As on the 'heading' element. For output not specific to a command, this is simply 'log'. The corpus contains one example of where 'commandName' is present but set to the empty string. -- Attribute: 'creator-version' As on the 'heading' element.  File: pspp-dev.info, Node: SPV Structure html Element, Next: SPV Structure table Element, Prev: SPV Structure text Element (Inside container), Up: SPV Structure Member Format D.1.5 The 'html' Element ------------------------ html :lang=(en) => TEXT The element contains an HTML document as text (or, in practice, as CDATA). In some cases, the document starts with '' and ends with ''; in others the 'html' element is implied. Generally the HTML includes a 'head' element with a CSS stylesheet. The HTML body often begins with '
'. The HTML document uses only the following elements: 'html' Sometimes, the document is enclosed with ''...''. 'br' The HTML body often begins with '
' and may contain it as well. 'b' 'i' 'u' Styling. 'font' The attributes 'face', 'color', and 'size' are observed. The value of 'color' takes one of the forms '#RRGGBB' or 'rgb (R, G, B)'. The value of 'size' is a number between 1 and 7, inclusive. The CSS in the corpus is simple. To understand it, a parser only needs to be able to skip white space, '', and parse style only for 'p' elements. Only 'font-weight', 'font-style', 'font-decoration', 'font-family', and 'font-size' matter. This element has the following attributes. -- Attribute: 'lang' This always contains 'en' in the corpus.  File: pspp-dev.info, Node: SPV Structure table Element, Next: SPV Structure graph Element, Prev: SPV Structure html Element, Up: SPV Structure Member Format D.1.6 The 'table' Element ------------------------- table :VDPId? :ViZmlSource? :activePageId=int? :commandName :creator-version? :displayFiltering=bool? :maxNumCells=int? :orphanTolerance=int? :rowBreakNumber=int? :subType :tableId :tableLookId? :type[table_type]=(table | note | warning) => tableProperties? tableStructure tableStructure => path? dataPath csvPath? This element has the following attributes. -- Attribute: 'commandName' As on the 'heading' element. -- Attribute: 'type' One of 'table', 'note', or 'warning'. -- Attribute: 'subType' The locale-invariant command ID for the particular kind of output that this table represents in the procedure. This can be the same as 'commandName' e.g. 'Frequencies', or different, e.g. 'Case Processing Summary'. Generic subtypes 'Notes' and 'Warnings' are often used. -- Attribute: 'tableId' A number that uniquely identifies the table within the SPV file, typically a large negative number such as '-4147135649387905023'. -- Attribute: 'creator-version' As on the 'heading' element. In the corpus, this is only present for version 21 and up and always includes all 8 digits. *Note SPV Detail Legacy Properties::, for details on the 'tableProperties' element.  File: pspp-dev.info, Node: SPV Structure graph Element, Next: SPV Structure model Element, Prev: SPV Structure table Element, Up: SPV Structure Member Format D.1.7 The 'graph' Element ------------------------- graph :VDPId? :ViZmlSource? :commandName? :creator-version? :dataMapId? :dataMapURI? :editor? :refMapId? :refMapURI? :csvFileIds? :csvFileNames? => dataPath? path csvPath? This element represents a graph. The 'dataPath' and 'path' elements name the Zip members that give the details of the graph. Normally, both elements are present; there is only one counterexample in the corpus. 'csvPath' only appears in one SPV file in the corpus, for two graphs. In these two cases, 'dataPath', 'path', and 'csvPath' all appear. These 'csvPath' name Zip members with names of the form 'NUMBER_csv.bin', where NUMBER is a many-digit number and the same as the 'csvFileIds'. The named Zip members are CSV text files (despite the '.bin' extension). The CSV files are encoded in UTF-8 and begin with a U+FEFF byte-order marker.  File: pspp-dev.info, Node: SPV Structure model Element, Next: SPV Structure tree Element, Prev: SPV Structure graph Element, Up: SPV Structure Member Format D.1.8 The 'model' Element ------------------------- model :PMMLContainerId? :PMMLId :StatXMLContainerId :VDPId :auxiliaryViewName :commandName :creator-version :mainViewName => ViZml? dataPath? path | pmmlContainerPath statsContainerPath pmmlContainerPath => TEXT statsContainerPath => TEXT ViZml :viewName? => TEXT This element represents a model. The 'dataPath' and 'path' elements name the Zip members that give the details of the model. Normally, both elements are present; there is only one counterexample in the corpus. The details are unexplored. The 'ViZml' element contains base-64 encoded text, that decodes to a binary format with some embedded text strings, and 'path' names an Zip member that contains XML. Alternatively, 'pmmlContainerPath' and 'statsContainerPath' name Zip members with '.scf' extension.  File: pspp-dev.info, Node: SPV Structure tree Element, Next: SPV Structure Path Elements, Prev: SPV Structure model Element, Up: SPV Structure Member Format D.1.9 The 'tree' Element ------------------------ tree :commandName :creator-version :name :type => dataPath path This element represents a tree. The 'dataPath' and 'path' elements name the Zip members that give the details of the tree. The details are unexplored.  File: pspp-dev.info, Node: SPV Structure Path Elements, Next: SPV Structure pageSetup Element, Prev: SPV Structure tree Element, Up: SPV Structure Member Format D.1.10 Path Elements -------------------- dataPath => TEXT path => TEXT csvPath => TEXT These element contain the name of the Zip members that hold details for a container. For tables: * When a "light" format is used, only 'dataPath' is present, and it names a '.bin' member of the Zip file that has 'light' in its name, e.g. '0000000001437_lightTableData.bin' (*note SPV Light Detail Member Format::). * When the legacy format is used, both are present. In this case, 'dataPath' names a Zip member with a legacy binary format that contains relevant data (*note SPV Legacy Detail Member Binary Format::), and 'path' names a Zip member that uses an XML format (*note SPV Legacy Detail Member XML Format::). Graphs normally follow the legacy approach described above. The corpus contains one example of a graph with 'path' but not 'dataPath'. The reason is unexplored. Models use 'path' but not 'dataPath'. *Note SPV Structure graph Element::, for more information. These elements have no attributes.  File: pspp-dev.info, Node: SPV Structure pageSetup Element, Next: SPV Structure text Element (Inside pageParagraph), Prev: SPV Structure Path Elements, Up: SPV Structure Member Format D.1.11 The 'pageSetup' Element ------------------------------ pageSetup :initial-page-number=int? :chart-size=(as-is | full-height | half-height | quarter-height | OTHER)? :margin-left=dimension? :margin-right=dimension? :margin-top=dimension? :margin-bottom=dimension? :paper-height=dimension? :paper-width=dimension? :reference-orientation? :space-after=dimension? => pageHeader pageFooter pageHeader => pageParagraph? pageFooter => pageParagraph? pageParagraph => pageParagraph_text The 'pageSetup' element has the following attributes. -- Attribute: 'initial-page-number' The page number to put on the first page of printed output. Usually '1'. -- Attribute: 'chart-size' One of the listed, self-explanatory chart sizes, 'quarter-height', or a localization (!) of one of these (e.g. 'dimensione attuale', 'Wie vorgegeben'). -- Attribute: 'margin-left' -- Attribute: 'margin-right' -- Attribute: 'margin-top' -- Attribute: 'margin-bottom' Margin sizes, e.g. '0.25in'. -- Attribute: 'paper-height' -- Attribute: 'paper-width' Paper sizes. -- Attribute: 'reference-orientation' Indicates the orientation of the output page. Either '0deg' (portrait) or '90deg' (landscape), -- Attribute: 'space-after' The amount of space between printed objects, typically '12pt'.  File: pspp-dev.info, Node: SPV Structure text Element (Inside pageParagraph), Prev: SPV Structure pageSetup Element, Up: SPV Structure Member Format D.1.12 The 'text' Element (Inside 'pageParagraph') -------------------------------------------------- text[pageParagraph_text] :type=(title | text) => TEXT This 'text' element is nested inside a 'pageParagraph'. There is a different 'text' element that is nested inside a 'container'. The element is either empty, or contains CDATA that holds almost-XHTML text: in the corpus, either an 'html' or 'p' element. It is _almost_-XHTML because the 'html' element designates the default namespace as 'http://xml.spss.com/spss/viewer/viewer-tree' instead of an XHTML namespace, and because the CDATA can contain substitution variables. The following variables are supported: '&[Date]' '&[Time]' The current date or time in the preferred format for the locale. '&[Head1]' '&[Head2]' '&[Head3]' '&[Head4]' First-, second-, third-, or fourth-level heading. '&[PageTitle]' The page title. '&[Filename]' Name of the output file. '&[Page]' The page number. '&[Page]' for the page number and '&[PageTitle]' for the page title. Typical contents (indented for clarity):

Page &[Page]

This element has the following attributes. -- Attribute: 'type' Always 'text'.  File: pspp-dev.info, Node: SPV Light Detail Member Format, Next: SPV Legacy Detail Member Binary Format, Prev: SPV Structure Member Format, Up: SPSS Viewer File Format D.2 Light Detail Member Format ============================== This section describes the format of "light" detail '.bin' members. These members have a binary format which we describe here in terms of a context-free grammar using the following conventions: NonTerminal => ... Nonterminals have CamelCaps names, and => indicates a production. The right-hand side of a production is often broken across multiple lines. Break points are chosen for aesthetics only and have no semantic significance. 00, 01, ..., ff. A bytes with a fixed value, written as a pair of hexadecimal digits. i0, i1, ..., i9, i10, i11, ... ib0, ib1, ..., ib9, ib10, ib11, ... A 32-bit integer in little-endian or big-endian byte order, respectively, with a fixed value, written in decimal. Prefixed by 'i' for little-endian or 'ib' for big-endian. byte A byte. bool A byte with value 0 or 1. int16 be16 A 16-bit unsigned integer in little-endian or big-endian byte order, respectively. int32 be32 A 32-bit unsigned integer in little-endian or big-endian byte order, respectively. int64 be64 A 64-bit unsigned integer in little-endian or big-endian byte order, respectively. double A 64-bit IEEE floating-point number. float A 32-bit IEEE floating-point number. string bestring A 32-bit unsigned integer, in little-endian or big-endian byte order, respectively, followed by the specified number of bytes of character data. (The encoding is indicated by the Formats nonterminal.) X? X is optional, e.g. 00? is an optional zero byte. X*N X is repeated N times, e.g. byte*10 for ten arbitrary bytes. X[NAME] Gives X the specified NAME. Names are used in textual explanations. They are also used, also bracketed, to indicate counts, e.g. 'int32[n] byte*[n]' for a 32-bit integer followed by the specified number of arbitrary bytes. A | B Either A or B. (X) Parentheses are used for grouping to make precedence clear, especially in the presence of |, e.g. in 00 (01 | 02 | 03) 00. count(X) becount(X) A 32-bit unsigned integer, in little-endian or big-endian byte order, respectively, that indicates the number of bytes in X, followed by X itself. v1(X) In a version 1 '.bin' member, X; in version 3, nothing. (The '.bin' header indicates the version.) v3(X) In a version 3 '.bin' member, X; in version 1, nothing. PSPP uses this grammar to parse light detail members. See 'src/output/spv/light-binary.grammar' in the PSPP source tree for the full grammar. Little-endian byte order is far more common in this format, but a few pieces of the format use big-endian byte order. Light detail members express linear units in two ways: points (pt), at 72/inch, and "device-independent pixels" (px), at 96/inch. To convert from pt to px, multiply by 1.33 and round up. To convert from px to pt, divide by 1.33 and round down. A "light" detail member '.bin' consists of a number of sections concatenated together, terminated by an optional byte 01: LightMember => Header Titles Footnotes Areas Borders PrintSettings TableSettings Formats Dimensions Axes Cells 01? The following sections go into more detail. * Menu: * SPV Light Member Header:: * SPV Light Member Titles:: * SPV Light Member Footnotes:: * SPV Light Member Areas:: * SPV Light Member Borders:: * SPV Light Member Print Settings:: * SPV Light Member Table Settings:: * SPV Light Member Formats:: * SPV Light Member Dimensions:: * SPV Light Member Categories:: * SPV Light Member Axes:: * SPV Light Member Cells:: * SPV Light Member Value:: * SPV Light Member ValueMod::  File: pspp-dev.info, Node: SPV Light Member Header, Next: SPV Light Member Titles, Up: SPV Light Detail Member Format D.2.1 Header ------------ An SPV light member begins with a 39-byte header: Header => 01 00 (i1 | i3)[version] bool[x0] bool[x1] bool[rotate-inner-column-labels] bool[rotate-outer-row-labels] bool[x2] int32[x3] int32[min-col-width] int32[max-col-width] int32[min-row-width] int32[max-row-width] int64[table-id] 'version' is a version number that affects the interpretation of some of the other data in the member. We will refer to "version 1" and "version 3" later on and use v1(...) and v3(...) for version-specific formatting (as described previously). If 'rotate-inner-column-labels' is 1, then column labels closest to the data are rotated to be vertical; otherwise, they are shown in the normal way. If 'rotate-outer-row-labels' is 1, then row labels farthest from the data are rotated to be vertical; otherwise, they are shown in the normal way. 'table-id' is a binary version of the 'tableId' attribute in the structure member that refers to the detail member. For example, if 'tableId' is '-4122591256483201023', then 'table-id' would be 0xc6c99d183b300001. 'min-col-width' is the minimum width that a column will be assigned automatically. 'max-col-width' is the maximum width that a column will be assigned to accommodate a long column label. 'min-row-width' and 'max-row-width' are a similar range for the width of row labels. All of these measurements are in 1/96 inch units (called a "device independent pixel" unit in Windows). The meaning of the other variable parts of the header is not known. A writer may safely use version 3, true for 'x0', false for 'x1', true for 'x2', and 0x15 for 'x3'.  File: pspp-dev.info, Node: SPV Light Member Titles, Next: SPV Light Member Footnotes, Prev: SPV Light Member Header, Up: SPV Light Detail Member Format D.2.2 Titles ------------ Titles => Value[title] 01? Value[subtype] 01? 31 Value[user-title] 01? (31 Value[corner-text] | 58) (31 Value[caption] | 58) The Titles follow the Header and specify the table's title, caption, and corner text. The 'user-title' is shown above the title and reflects any user editing of the title text or style. The 'title' is the title originally generated by the procedure. Both of these are appropriate for presentation and localized to the user's language. For example, for a frequency table, 'title' and 'user-title' normally name the variable and 'c' is simply "Frequencies". 'subtype' is the same as the 'subType' attribute in the 'table' structure XML element that referred to this member. *Note SPV Structure table Element::, for details. The 'corner-text', if present, is shown in the upper-left corner of the table, above the row headings and to the left of the column headings. It is usually absent. Corner text prevents row dimension labels from being displayed above the dimension's group and category labels (see 'show-row-labels-in-corner'). The 'caption', if present, is shown below the table. 'caption' reflects user editing of the caption.  File: pspp-dev.info, Node: SPV Light Member Footnotes, Next: SPV Light Member Areas, Prev: SPV Light Member Titles, Up: SPV Light Detail Member Format D.2.3 Footnotes --------------- Footnotes => int32[n-footnotes] Footnote*[n-footnotes] Footnote => Value[text] (58 | 31 Value[marker]) int32[show] Each footnote has 'text' and an optional custom 'marker' (such as '*'). 'show' is a 32-bit signed integer. It is positive to show the footnote or negative to hide it. Its magnitude is often 1, and in other cases tends to be the number of references to the footnote.  File: pspp-dev.info, Node: SPV Light Member Areas, Next: SPV Light Member Borders, Prev: SPV Light Member Footnotes, Up: SPV Light Detail Member Format D.2.4 Areas ----------- Areas => 00? Area*8 Area => byte[index] 31 string[typeface] float[size] int32[style] bool[underline] int32[halign] int32[valign] string[fg-color] string[bg-color] bool[alternate] string[alt-fg-color] string[alt-bg-color] v3(int32[left-margin] int32[right-margin] int32[top-margin] int32[bottom-margin]) Each Area represents the style for a different area of the table, in the following order: title, caption, footer, corner, column labels, row labels, data, and layers. 'index' is the 1-based index of the Area, i.e. 1 for the first Area, through 8 for the final Area. 'typeface' is the string name of the font used in the area. In the corpus, this is 'SansSerif' in over 99% of instances and 'Times New Roman' in the rest. 'size' is the size of the font, in px (*note SPV Light Detail Member Format::) The most common size in the corpus is 12 px. Even though 'size' has a floating-point type, in the corpus its values are always integers. 'style' is a bit mask. Bit 0 (with value 1) is set for bold, bit 1 (with value 2) is set for italic. 'underline' is 1 if the font is underlined, 0 otherwise. 'halign' specifies horizontal alignment: 0 for center, 2 for left, 4 for right, 61453 for decimal, 64173 for mixed. Mixed alignment varies according to type: string data is left-justified, numbers and most other formats are right-justified. 'valign' specifies vertical alignment: 0 for center, 1 for top, 3 for bottom. 'fg-color' and 'bg-color' are the foreground color and background color, respectively. In the corpus, these are always '#000000' and '#ffffff', respectively. 'alternate' is 1 if rows should alternate colors, 0 if all rows should be the same color. When 'alternate' is 1, 'alt-fg-color' and 'alt-bg-color' specify the colors for the alternate rows; otherwise they are empty strings. 'left-margin', 'right-margin', 'top-margin', and 'bottom-margin' are measured in px.  File: pspp-dev.info, Node: SPV Light Member Borders, Next: SPV Light Member Print Settings, Prev: SPV Light Member Areas, Up: SPV Light Detail Member Format D.2.5 Borders ------------- Borders => count( ib1[endian] be32[n-borders] Border*[n-borders] bool[show-grid-lines] 00 00 00) Border => be32[border-type] be32[stroke-type] be32[color] The Borders reflect how borders between regions are drawn. The fixed value of 'endian' can be used to validate the endianness. 'show-grid-lines' is 1 to draw grid lines, otherwise 0. Each Border describes one kind of border. 'n-borders' seems to always be 19. Each 'border-type' appears once (although in an unpredictable order) and correspond to the following borders: 0 Title. 1...4 Left, top, right, and bottom outer frame. 5...8 Left, top, right, and bottom inner frame. 9, 10 Left and top of data area. 11, 12 Horizontal and vertical dimension rows. 13, 14 Horizontal and vertical dimension columns. 15, 16 Horizontal and vertical category rows. 17, 18 Horizontal and vertical category columns. 'stroke-type' describes how a border is drawn, as one of: 0 No line. 1 Solid line. 2 Dashed line. 3 Thick line. 4 Thin line. 5 Double line. 'color' is an RGB color. Bits 24-31 are alpha, bits 16-23 are red, 8-15 are green, 0-7 are blue. An alpha of 255 indicates an opaque color, therefore opaque black is 0xff000000.  File: pspp-dev.info, Node: SPV Light Member Print Settings, Next: SPV Light Member Table Settings, Prev: SPV Light Member Borders, Up: SPV Light Detail Member Format D.2.6 Print Settings -------------------- PrintSettings => count( ib1[endian] bool[all-layers] bool[paginate-layers] bool[fit-width] bool[fit-length] bool[top-continuation] bool[bottom-continuation] be32[n-orphan-lines] bestring[continuation-string]) The PrintSettings reflect settings for printing. The fixed value of 'endian' can be used to validate the endianness. 'all-layers' is 1 to print all layers, 0 to print only the visible layers. 'paginate-layers' is 1 to print each layer at the start of a new page, 0 otherwise. (This setting is honored only 'all-layers' is 1, since otherwise only one layer is printed.) 'fit-width' and 'fit-length' control whether the table is shrunk to fit within a page's width or length, respectively. 'n-orphan-lines' is the minimum number of rows or columns to put in one part of a table that is broken across pages. If 'top-continuation' is 1, then 'continuation-string' is printed at the top of a page when a table is broken across pages for printing; similarly for 'bottom-continuation' and the bottom of a page. Usually, 'continuation-string' is empty.  File: pspp-dev.info, Node: SPV Light Member Table Settings, Next: SPV Light Member Formats, Prev: SPV Light Member Print Settings, Up: SPV Light Detail Member Format D.2.7 Table Settings -------------------- TableSettings => count( v3( ib1[endian] be32[x5] be32[current-layer] bool[omit-empty] bool[show-row-labels-in-corner] bool[show-alphabetic-markers] bool[footnote-marker-superscripts] byte[x6] becount( Breakpoints[row-breaks] Breakpoints[column-breaks] Keeps[row-keeps] Keeps[column-keeps] PointKeeps[row-point-keeps] PointKeeps[column-point-keeps] ) bestring[notes] bestring[table-look] 00...)) Breakpoints => be32[n-breaks] be32*[n-breaks] Keeps => be32[n-keeps] Keep*[n-keeps] Keep => be32[offset] be32[n] PointKeeps => be32[n-point-keeps] PointKeep*[n-point-keeps] PointKeep => be32[offset] be32 be32 The TableSettings reflect display settings. The fixed value of 'endian' can be used to validate the endianness. 'current-layer' is the displayed layer. The interpretation when there is more than one layer dimension is not yet known. If 'omit-empty' is 1, empty rows or columns (ones with nothing in any cell) are hidden; otherwise, they are shown. If 'show-row-labels-in-corner' is 1, then row labels are shown in the upper left corner; otherwise, they are shown nested. If 'show-alphabetic-markers' is 1, markers are shown as letters (e.g. 'a', 'b', 'c', ...); otherwise, they are shown as numbers starting from 1. When 'footnote-marker-superscripts' is 1, footnote markers are shown as superscripts, otherwise as subscripts. The Breakpoints are rows or columns after which there is a page break; for example, a row break of 1 requests a page break after the second row. Usually no breakpoints are specified, indicating that page breaks should be selected automatically. The Keeps are ranges of rows or columns to be kept together without a page break; for example, a row Keep with 'offset' 1 and 'n' 10 requests that the 10 rows starting with the second row be kept together. Usually no Keeps are specified. The PointKeeps seem to be generated automatically based on user-specified Keeps. They seems to indicate a conversion from rows or columns to pixel or point offsets. 'notes' is a text string that contains user-specified notes. It is displayed when the user hovers the cursor over the table, like "alt text" on a webpage. It is not printed. It is usually empty. 'table-look' is the name of a SPSS "TableLook" table style, such as "Default" or "Academic"; it is often empty. TableSettings ends with an arbitrary number of null bytes. A writer may safely write 82 null bytes. A writer may safely use 4 for 'x5' and 0 for 'x6'.  File: pspp-dev.info, Node: SPV Light Member Formats, Next: SPV Light Member Dimensions, Prev: SPV Light Member Table Settings, Up: SPV Light Detail Member Format D.2.8 Formats ------------- Formats => int32[n-widths] int32*[n-widths] string[locale] int32[current-layer] bool bool bool Y0 CustomCurrency count( v1(X0?) v3(count(X1 count(X2)) count(X3))) Y0 => int32[epoch] byte[decimal] byte[grouping] CustomCurrency => int32[n-ccs] string*[n-ccs] If 'n-widths' is nonzero, then the accompanying integers are column widths as manually adjusted by the user. 'locale' is a locale including an encoding, such as 'en_US.windows-1252' or 'it_IT.windows-1252'. The rest of the character strings in the member use this encoding. The encoding string is itself encoded in US-ASCII. 'epoch' is the year that starts the epoch. A 2-digit year is interpreted as belonging to the 100 years beginning at the epoch. The default epoch year is 69 years prior to the current year; thus, in 2017 this field by default contains 1948. In the corpus, 'epoch' ranges from 1943 to 1948, plus some contain -1. 'decimal' is the decimal point character. The observed values are '.' and ','. 'grouping' is the grouping character. Usually, it is ',' if 'decimal' is '.', and vice versa. Other observed values are ''' (apostrophe), ' ' (space), and zero (presumably indicating that digits should not be grouped). 'n-ccs' is observed as either 0 or 5. When it is 5, the following strings are CCA through CCE format strings. *Note (pspp)Custom Currency Formats::. Most commonly these are all '-,,,' but other strings occur. X0 .. X0 only appears, optionally, in version 1 members. X0 => byte*14 Y1 Y2 Y1 => string[command] string[command-local] string[language] string[charset] string[locale] bool bool bool bool Y0 Y2 => CustomCurrency byte[missing] bool[x17] 'command' describes the statistical procedure that generated the output, in English. It is not necessarily the literal syntax name of the procedure: for example, NPAR TESTS becomes "Nonparametric Tests." 'command-local' is the procedure's name, translated into the output language; it is often empty and, when it is not, sometimes the same as 'command'. 'dataset' is the name of the dataset analyzed to produce the output, e.g. 'DataSet1', and 'datafile' the name of the file it was read from, e.g. 'C:\Users\foo\bar.sav'. The latter is sometimes the empty string. 'missing' is the character used to indicate that a cell contains a missing value. It is always observed as '.'. X0 repeats 'decimal', 'grouping', CustomCurrency, and 'missing' already included in Formats. A writer may safely use false for 'x17'. X1 .. X1 only appears in version 3 members. X1 => bool byte[x15] bool[x16] byte[lang] byte[show-variables] byte[show-values] int32[x18] int32[x19] 00*17 bool[x20] bool[show-caption] 'lang' may indicate the language in use. Some values seem to be 0: en, 1: de, 2: es, 3: it, 5: ko, 6: pl, 8: zh-tw, 10: pt_BR, 11: fr. The 'locale' in Formats and the 'language', 'charset', and 'locale' in X0 are more likely to be useful in practice. 'show-variables' determines how variables are displayed by default. A value of 1 means to display variable names, 2 to display variable labels when available, 3 to display both (name followed by label, separated by a space). The most common value is 0, which probably means to use a global default. 'show-values' is a similar setting for values. A value of 1 means to display the value, 2 to display the value label when available, 3 to display both. Again, the most common value is 0, which probably means to use a global default. 'show-caption' is true to show the caption, false to hide it. A writer may safely use false for 'x14', 1 for 'x15', false for 'x16', -1 for 'x18' and 'x19', and false for 'x20'. X2 .. X2 only appears in version 3 members. X2 => int32[n-row-heights] int32*[n-row-heights] int32[n-style-map] StyleMap*[n-style-map] int32[n-styles] StylePair*[n-styles] count((i0 i0)?) StyleMap => int64[cell-index] int16[style-index] If present, 'n-row-heights' and the accompanying integers are row heights as manually adjusted by the user. The rest of X2 specifies styles for data cells. At first glance this is odd, because each data cell can have its own style embedded as part of the data, but in practice X2 specifies a style for a cell only if that cell is empty (and thus does not appear in the data at all). Each StyleMap specifies the index of a blank cell, calculated the same was as in the Cells (*note SPV Light Member Cells::), along with a 0-based index into the accompanying StylePair array. A writer may safely omit the optional 'i0 i0' inside the 'count(...)'. X3 .. X3 only appears in version 3 members. X3 => 01 00 byte[x21] 00 00 00 Y1 double[small] 01 (string[dataset] string[datafile] i0 int32[date] i0)? Y2 (int32[x22] i0)? 'date' is a date, as seconds since the epoch, i.e. since January 1, 1970. Pivot tables within an SPV file often have dates a few minutes apart, so this is probably a creation date for the table rather than for the file. X3 repeats 'decimal', 'grouping', CustomCurrency, and 'missing' already included in Formats. 'command', 'command-local', 'language', 'charset', and 'locale' have the same meaning as in X0. 'small' is a small real number, e.g. .001. Numbers smaller than this in absolute value are displayed in scientific notation. Sometimes 'dataset', 'datafile', and 'date' are present and other times they are absent. The reader can distinguish by assuming that they are present and then checking whether the presumptive 'dataset' contains a null byte (a valid string never will). 'x22' is usually 0 or 2000000. A writer may safely use 4 for 'x21' and omit 'x22' and the other optional bytes at the end.  File: pspp-dev.info, Node: SPV Light Member Dimensions, Next: SPV Light Member Categories, Prev: SPV Light Member Formats, Up: SPV Light Detail Member Format D.2.9 Dimensions ---------------- A pivot table presents multidimensional data. A Dimension identifies the categories associated with each dimension. Dimensions => int32[n-dims] Dimension*[n-dims] Dimension => Value[name] DimProperties int32[n-categories] Category*[n-categories] DimProperties => byte[x1] byte[x2] int32[x3] bool[hide-dim-label] bool[hide-all-labels] 01 int32[dim-index] 'name' is the name of the dimension, e.g. 'Variables', 'Statistics', or a variable name. The meanings of 'x1' and 'x3' are unknown. 'x1' is usually 0 but many other values have been observed. A writer may safely use 0 for 'x1' and 2 for 'x3'. 'x2' is 0, 1, or 2. For a pivot table with L layer dimensions, R row dimensions, and C column dimensions, 'x2' is 2 for the first L dimensions, 0 for the next R dimensions, and 1 for the remaining C dimensions. This does not mean that the layer dimensions must be presented first, followed by the row dimensions, followed by the column dimensions--on the contrary, they are frequently in a different order--but 'x2' must follow this pattern to prevent the pivot table from being misinterpreted. If 'hide-dim-label' is 00, the pivot table displays a label for the dimension itself. Because usually the group and category labels are enough explanation, it is usually 01. If 'hide-all-labels' is 01, the pivot table omits all labels for the dimension, including group and category labels. It is usually 00. When 'hide-all-labels' is 01, 'show-dim-label' is ignored. 'dim-index' is usually the 0-based index of the dimension, e.g. 0 for the first dimension, 1 for the second, and so on. Sometimes it is -1. There is no visible difference.  File: pspp-dev.info, Node: SPV Light Member Categories, Next: SPV Light Member Axes, Prev: SPV Light Member Dimensions, Up: SPV Light Detail Member Format D.2.10 Categories ----------------- Categories are arranged in a tree. Only the leaf nodes in the tree are really categories; the others just serve as grouping constructs. Category => Value[name] (Leaf | Group) Leaf => 00 00 00 i2 int32[leaf-index] i0 Group => bool[merge] 00 01 int32[x23] i-1 int32[n-subcategories] Category*[n-subcategories] 'name' is the name of the category (or group). A Leaf represents a leaf category. The Leaf's 'leaf-index' is a nonnegative integer unique within the Dimension and less than 'n-categories' in the Dimension. If the user does not sort or rearrange the categories, then 'leaf-index' starts at 0 for the first Leaf in the dimension and increments by 1 with each successive Leaf. If the user does sorts or rearrange the categories, then the order of categories in the file reflects that change and 'leaf-index' reflects the original order. Occasionally a dimension has no leaf categories at all. A table that contains such a dimension necessarily has no data at all. A Group is a group of nested categories. Usually a Group contains at least one Category, so that 'n-subcategories' is positive, but a few Groups with 'n-subcategories' 0 has been observed. If a Group's 'merge' is 00, the most common value, then the group is really a distinct group that should be represented as such in the visual representation and user interface. If 'merge' is 01, the categories in this group should be shown and treated as if they were direct children of the group's containing group (or if it has no parent group, then direct children of the dimension), and this group's name is irrelevant and should not be displayed. (Merged groups can be nested!) (For writing an SPV file, there is no need to use the 'merge' feature unless it is convenient.) A Group's 'x23' appears to be i2 when all of the categories within a group are leaf categories that directly represent data values for a variable (e.g. in a frequency table or crosstabulation, a group of values in a variable being tabulated) and i0 otherwise. A writer may safely write a constant 0 in this field.  File: pspp-dev.info, Node: SPV Light Member Axes, Next: SPV Light Member Cells, Prev: SPV Light Member Categories, Up: SPV Light Detail Member Format D.2.11 Axes ----------- After the dimensions come assignment of each dimension to one of the axes: layers, rows, and columns. Axes => int32[n-layers] int32[n-rows] int32[n-columns] int32*[n-layers] int32*[n-rows] int32*[n-columns] The values of 'n-layers', 'n-rows', and 'n-columns' each specifies the number of dimensions displayed in layers, rows, and columns, respectively. Any of them may be zero. Their values sum to 'n-dimensions' from Dimensions (*note SPV Light Member Dimensions::). The following 'n-dimensions' integers, in three groups, are a permutation of the 0-based dimension numbers. The first 'n-layers' integers specify each of the dimensions represented by layers, the next 'n-rows' integers specify the dimensions represented by rows, and the final 'n-columns' integers specify the dimensions represented by columns. When there is more than one dimension of a given kind, the inner dimensions are given first.  File: pspp-dev.info, Node: SPV Light Member Cells, Next: SPV Light Member Value, Prev: SPV Light Member Axes, Up: SPV Light Detail Member Format D.2.12 Cells ------------ The final part of an SPV light member contains the actual data. Cells => int32[n-cells] Cell*[n-cells] Cell => int64[index] v1(00?) Value A Cell consists of an 'index' and a Value. Suppose there are d dimensions, numbered 1 through d in the order given in the Dimensions previously, and that dimension i, has n_i categories. Consider the cell at coordinates x_i, 1 \le i \le d, and note that 0 \le x_i < n_i. Then the index is calculated by the following algorithm: let index = 0 for each i from 1 to d: index = (n_i \times index) + x_i For example, suppose there are 3 dimensions with 3, 4, and 5 categories, respectively. The cell at coordinates (1, 2, 3) has index 5 \times (4 \times (3 \times 0 + 1) + 2) + 3 = 33. Within a given dimension, the index is the 'leaf-index' in a Leaf.  File: pspp-dev.info, Node: SPV Light Member Value, Next: SPV Light Member ValueMod, Prev: SPV Light Member Cells, Up: SPV Light Detail Member Format D.2.13 Value ------------ Value is used throughout the SPV light member format. It boils down to a number or a string. Value => 00? 00? 00? 00? RawValue RawValue => 01 ValueMod int32[format] double[x] | 02 ValueMod int32[format] double[x] string[var-name] string[value-label] byte[show] | 03 string[local] ValueMod string[id] string[c] bool[fixed] | 04 ValueMod int32[format] string[value-label] string[var-name] byte[show] string[s] | 05 ValueMod string[var-name] string[var-label] byte[show] | ValueMod string[template] int32[n-args] Argument*[n-args] Argument => i0 Value | int32[x] i0 Value*[x] /* x > 0 */ There are several possible encodings, which one can distinguish by the first nonzero byte in the encoding. 01 The numeric value 'x', intended to be presented to the user formatted according to 'format', which is in the format described for system files, except that format 40 is a synonym for F format instead of MTIME. *Note System File Output Formats::, for details. Most commonly, 'format' has width 40 (the maximum). An 'x' with the maximum negative double value '-DBL_MAX' represents the system-missing value SYSMIS. (HIGHEST and LOWEST have not been observed.) *Note System File Format::, for more about these special values. 02 Similar to '01', with the additional information that 'x' is a value of variable 'var-name' and has value label 'value-label'. Both 'var-name' and 'value-label' can be the empty string, the latter very commonly. 'show' determines whether to show the numeric value or the value label. A value of 1 means to show the value, 2 to show the label, 3 to show both, and 0 means to use the default specified in 'show-values' (*note SPV Light Member Formats::). 03 A text string, in two forms: 'c' is in English, and sometimes abbreviated or obscure, and 'local' is localized to the user's locale. In an English-language locale, the two strings are often the same, and in the cases where they differ, 'local' is more appropriate for a user interface, e.g. 'c' of "Not a PxP table for MCN..." versus 'local' of "Computed only for a PxP table, where P must be greater than 1." 'c' and 'local' are always either both empty or both nonempty. 'id' is a brief identifying string whose form seems to resemble a programming language identifier, e.g. 'cumulative_percent' or 'factor_14'. It is not unique. 'fixed' is 00 for text taken from user input, such as syntax fragment, expressions, file names, data set names, and 01 for fixed text strings such as names of procedures or statistics. In the former case, 'id' is always the empty string; in the latter case, 'id' is still sometimes empty. 04 The string value 's', intended to be presented to the user formatted according to 'format'. The format for a string is not too interesting, and the corpus contains many clearly invalid formats like A16.39 or A255.127 or A134.1, so readers should probably ignore the format entirely. 's' is a value of variable 'var-name' and has value label 'value-label'. 'var-name' is never empty but 'value-label' is commonly empty. 'show' has the same meaning as in the encoding for 02. 05 Variable 'var-name', which is rarely observed as empty in the corpus, with variable label 'var-label', which is often empty. 'show' determines whether to show the variable name or the variable label. A value of 1 means to show the name, 2 to show the label, 3 to show both, and 0 means to use the default specified in 'show-variables' (*note SPV Light Member Formats::). otherwise When the first byte of a RawValue is not one of the above, the RawValue starts with a ValueMod, whose syntax is described in the next section. (A ValueMod always begins with byte 31 or 58.) This case is a template string, analogous to 'printf', followed by one or more Arguments, each of which has one or more values. The template string is copied directly into the output except for the following special syntax, '\%' '\:' '\[' '\]' Each of these expands to the character following '\\', to escape characters that have special meaning in template strings. These are effective inside and outside the '[...]' syntax forms described below. '\n' Expands to a new-line, inside or outside the '[...]' forms described below. '^I' Expands to a formatted version of argument I, which must have only a single value. For example, '^1' expands to the first argument's 'value'. '[:A:]I' Expands A for each of the values in I. A should contain one or more '^J' conversions, which are drawn from the values for argument I in order. Some examples from the corpus: '[:^1:]1' All of the values for the first argument, concatenated. '[:^1\n:]1' Expands to the values for the first argument, each followed by a new-line. '[:^1 = ^2:]2' Expands to 'X = Y' where X is the second argument's first value and Y is its second value. (This would be used only if the argument has two values. If there were more values, the second and third values would be directly concatenated, which would look funny.) '[A:B:]I' This extends the previous form so that the first values are expanded using A and later values are expanded using B. For an unknown reason, within A the '^J' conversions are instead written as '%J'. Some examples from the corpus: '[%1:*^1:]1' Expands to all of the values for the first argument, separated by '*'. '[%1 = %2:, ^1 = ^2:]1' Given appropriate values for the first argument, expands to 'X = 1, Y = 2, Z = 3'. '[%1:, ^1:]1' Given appropriate values, expands to '1, 2, 3'. The template string is localized to the user's locale. A writer may safely omit all of the optional 00 bytes at the beginning of a Value, except that it should write a single 00 byte before a templated Value.  File: pspp-dev.info, Node: SPV Light Member ValueMod, Prev: SPV Light Member Value, Up: SPV Light Detail Member Format D.2.14 ValueMod --------------- A ValueMod can specify special modifications to a Value. ValueMod => 58 | 31 int32[n-refs] int16*[n-refs] int32[n-subscripts] string*[n-subscripts] v1(00 (i1 | i2) 00? 00? int32 00? 00?) v3(count(TemplateString StylePair)) TemplateString => count((count((i0 (58 | 31 55))?) (58 | 31 string[id]))?) StylePair => (31 FontStyle | 58) (31 CellStyle | 58) FontStyle => bool[bold] bool[italic] bool[underline] bool[show] string[fg-color] string[bg-color] string[typeface] byte[size] CellStyle => int32[halign] int32[valign] double[decimal-offset] int16[left-margin] int16[right-margin] int16[top-margin] int16[bottom-margin] A ValueMod that begins with "31" specifies special modifications to a Value. Each of the 'n-refs' integers is a reference to a Footnote (*note SPV Light Member Footnotes::) by 0-based index. Footnote markers are shown appended to the main text of the Value, as superscripts. The 'subscripts', if present, are strings to append to the main text of the Value, as subscripts. Each subscript text is a brief indicator, e.g. 'a' or 'b', with its meaning indicated by the table caption. When multiple subscripts are present, they are displayed separated by commas. The 'id' inside the TemplateString, if present, is a template string for substitutions using the syntax explained previously. It appears to be an English-language version of the localized template string in the Value in which the Template is nested. A writer may safely omit the optional fixed data in TemplateString. FontStyle and CellStyle, if present, change the style for this individual Value. In FontStyle, 'bold', 'italic', and 'underline' control the particular style. 'show' is ordinarily 1; if it is 0, then the cell data is not shown. 'fg-color' and 'bg-color' are strings in the format '#rrggbb', e.g. '#ff0000' for red or '#ffffff' for white. The empty string is occasionally observed also. The 'size' is a font size in units of 1/128 inch. In CellStyle, 'halign' is 0 for center, 2 for left, 4 for right, 6 for decimal, 0xffffffad for mixed. For decimal alignment, 'decimal-offset' is the decimal point's offset from the right side of the cell, in pt (*note SPV Light Detail Member Format::). 'valign' specifies vertical alignment: 0 for center, 1 for top, 3 for bottom. 'left-margin', 'right-margin', 'top-margin', and 'bottom-margin' are in pt.  File: pspp-dev.info, Node: SPV Legacy Detail Member Binary Format, Next: SPV Legacy Detail Member XML Format, Prev: SPV Light Detail Member Format, Up: SPSS Viewer File Format D.3 Legacy Detail Member Binary Format ====================================== Whereas the light binary format represents everything about a given pivot table, the legacy binary format conceptually consists of a number of named sources, each of which consists of a number of named variables, each of which is a 1-dimensional array of numbers or strings or a mix. Thus, the legacy binary member format is quite simple. This section uses the same context-free grammar notation as in the previous section, with the following additions: vAF(X) In a version 0xaf legacy member, X; in other versions, nothing. (The legacy member header indicates the version; see below.) vB0(X) In a version 0xb0 legacy member, X; in other versions, nothing. A legacy detail member '.bin' has the following overall format: LegacyBinary => 00 byte[version] int16[n-sources] int32[member-size] Metadata*[n-sources] #Data*[n-sources] #Strings? 'version' is a version number that affects the interpretation of some of the other data in the member. Versions 0xaf and 0xb0 are known. We will refer to "version 0xaf" and "version 0xb0" members later on. A legacy member consists of 'n-sources' data sources, each of which has Metadata and Data. 'member-size' is the size of the legacy binary member, in bytes. The Data and Strings above are commented out because the Metadata has some oddities that mean that the Data sometimes seems to start at an unexpected place. The following section goes into detail. * Menu: * SPV Legacy Member Metadata:: * SPV Legacy Member Numeric Data:: * SPV Legacy Member String Data::  File: pspp-dev.info, Node: SPV Legacy Member Metadata, Next: SPV Legacy Member Numeric Data, Up: SPV Legacy Detail Member Binary Format D.3.1 Metadata -------------- Metadata => int32[n-values] int32[n-variables] int32[data-offset] vAF(byte*28[source-name]) vB0(byte*64[source-name] int32[x]) A data source has 'n-variables' variables, each with 'n-values' data values. 'source-name' is a 28- or 64-byte string padded on the right with 0-bytes. The names that appear in the corpus are very generic: usually 'tableData' for pivot table data or 'source0' for chart data. A given Metadata's 'data-offset' is the offset, in bytes, from the beginning of the member to the start of the corresponding Data. This allows programs to skip to the beginning of the data for a particular source. In every case in the corpus, the Data follow the Metadata in the same order, but it is important to use 'data-offset' instead of reading sequentially through the file because of the exception described below. One SPV file in the corpus has legacy binary members with version 0xb0 but a 28-byte 'source-name' field (and only a single source). In practice, this means that the 64-byte 'source-name' used in version 0xb0 has a lot of 0-bytes in the middle followed by the 'variable-name' of the following Data. As long as a reader treats the first 0-byte in the 'source-name' as terminating the string, it can properly interpret these members. The meaning of 'x' in version 0xb0 is unknown.  File: pspp-dev.info, Node: SPV Legacy Member Numeric Data, Next: SPV Legacy Member String Data, Prev: SPV Legacy Member Metadata, Up: SPV Legacy Detail Member Binary Format D.3.2 Numeric Data ------------------ Data => Variable*[n-variables] Variable => byte*288[variable-name] double*[n-values] Data follow the Metadata in the legacy binary format, with sources in the same order (but readers should use the 'data-offset' in Metadata records, rather than reading sequentially). Each Variable begins with a 'variable-name' that generally indicates its role in the pivot table, e.g. "cell", "cellFormat", "dimension0categories", "dimension0group0", followed by the numeric data, one double per datum. A double with the maximum negative double '-DBL_MAX' represents the system-missing value SYSMIS.  File: pspp-dev.info, Node: SPV Legacy Member String Data, Prev: SPV Legacy Member Numeric Data, Up: SPV Legacy Detail Member Binary Format D.3.3 String Data ----------------- Strings => SourceMaps[maps] Labels SourceMaps => int32[n-maps] SourceMap*[n-maps] SourceMap => string[source-name] int32[n-variables] VariableMap*[n-variables] VariableMap => string[variable-name] int32[n-data] DatumMap*[n-data] DatumMap => int32[value-idx] int32[label-idx] Labels => int32[n-labels] Label*[n-labels] Label => int32[frequency] string[label] Each variable may include a mix of numeric and string data values. If a legacy binary member contains any string data, Strings is present; otherwise, it ends just after the last Data element. The string data overlays the numeric data. When a variable includes any string data, its Variable represents the string values with a SYSMIS or NaN placeholder. (Not all such values need be placeholders.) Each SourceMap provides a mapping between SYSMIS or NaN values in source 'source-name' and the string data that they represent. 'n-variables' is the number of variables in the source that include string data. More precisely, it is the 1-based index of the last variable in the source that includes any string data; thus, it would be 4 if there are 5 variables and only the fourth one includes string data. A VariableMap repeats its variable's name, but variables are always present in the same order as the source, starting from the first variable, without skipping any even if they have no string values. Each VariableMap contains DatumMap nonterminals, each of which maps from a 0-based index within its variable's data to a 0-based label index, e.g. pair 'value-idx' = 2, 'label-idx' = 3, means that the third data value (which must be SYSMIS or NaN) is to be replaced by the string of the fourth Label. The labels themselves follow the pairs. The valuable part of each label is the string 'label'. Each label also includes a 'frequency' that reports the number of DatumMaps that reference it (although this is not useful). pspp-1.4.1/doc/pspp.info0000644000175000017500000002050513725007454014530 0ustar00blpblp00000000000000This is pspp.info, produced by makeinfo version 6.7 from pspp.texi. This manual is for GNU PSPP version 1.4.1, software for statistical analysis. Copyright (C) 1997, 1998, 2004, 2005, 2009, 2012, 2013, 2014, 2016, 2019 Free Software Foundation, Inc. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included in the section entitled "GNU Free Documentation License". INFO-DIR-SECTION Math START-INFO-DIR-ENTRY * PSPP: (pspp). Statistical analysis package. * PSPPIRE: (pspp). Graphical user interface to PSPP. END-INFO-DIR-ENTRY The authors wish to thank Network Theory Ltd for their financial support in the production of this manual.  Indirect: pspp.info-1: 983 pspp.info-2: 308861  Tag Table: (Indirect) Node: Top983 Node: Introduction3322 Node: License4360 Node: Invoking PSPP6552 Node: Main Options7168 Node: PDF PostScript and SVG Output Options13241 Node: Plain Text Output Options16323 Node: HTML Output Options18732 Node: OpenDocument Output Options19725 Node: Comma-Separated Value Output Options20290 Node: Invoking PSPPIRE22989 Node: Using PSPP23801 Ref: Using PSPP-Footnote-125777 Node: Preparation of Data Files25877 Node: Defining Variables27028 Ref: data-list27611 Node: Listing the data30027 Node: Reading data from a text file30949 Node: Reading data from a pre-prepared PSPP file32190 Node: Saving data to a PSPP file.33010 Node: Reading data from other sources33658 Node: Exiting PSPP34082 Node: Data Screening and Transformation34292 Node: Identifying incorrect data34874 Ref: ex-descriptives35742 Ref: ex137627 Node: Dealing with suspicious data38974 Node: Inverting negatively coded variables40326 Node: Testing data consistency42007 Ref: ex-reliability42877 Node: Testing for normality44043 Ref: normality46024 Node: Hypothesis Testing50847 Ref: Hypothesis Testing-Footnote-152115 Node: Testing for differences of means52200 Ref: ex-t-test54484 Node: Linear Regression59816 Ref: ex-regression60788 Node: Language63905 Node: Tokens64777 Node: Commands69561 Node: Syntax Variants70801 Node: Types of Commands72379 Node: Order of Commands73872 Node: Missing Observations76229 Node: Datasets77560 Node: Attributes78670 Node: System Variables81673 Node: Sets of Variables82720 Node: Input and Output Formats84117 Node: Basic Numeric Formats86239 Node: Custom Currency Formats94060 Node: Legacy Numeric Formats96340 Node: Binary and Hexadecimal Numeric Formats99437 Node: Time and Date Formats103631 Node: Date Component Formats110100 Node: String Formats111183 Node: Scratch Variables111919 Node: Files113145 Node: File Handles114470 Node: BNF116547 Node: Expressions118760 Node: Boolean Values119898 Node: Missing Values in Expressions120591 Node: Grouping Operators121427 Node: Arithmetic Operators121844 Node: Logical Operators122721 Node: Relational Operators123662 Node: Functions124589 Node: Mathematics126114 Node: Miscellaneous Mathematics127004 Node: Trigonometry128698 Node: Missing Value Functions129852 Node: Set Membership131462 Node: Statistical Functions132636 Node: String Functions134817 Node: Time and Date141158 Node: Time and Date Concepts141969 Node: Time Construction143106 Node: Time Extraction143726 Node: Date Construction144494 Node: Date Extraction146690 Node: Time and Date Arithmetic149316 Node: Miscellaneous Functions152054 Ref: LAG152281 Node: Statistical Distribution Functions154297 Node: Continuous Distributions156685 Node: Discrete Distributions163507 Node: Order of Operations165313 Node: Data Input and Output165811 Node: BEGIN DATA167842 Node: CLOSE FILE HANDLE168409 Node: DATAFILE ATTRIBUTE168998 Node: DATASET171191 Node: DATA LIST174206 Node: DATA LIST FIXED175237 Node: DATA LIST FIXED Examples180670 Node: DATA LIST FREE182646 Node: DATA LIST LIST184952 Node: END CASE185687 Node: END FILE185945 Node: FILE HANDLE186204 Node: INPUT PROGRAM194544 Node: LIST199442 Node: NEW FILE200794 Node: MATRIX DATA201023 Node: PRINT205831 Node: PRINT EJECT208919 Node: PRINT SPACE210111 Node: REREAD210998 Node: REPEATING DATA212336 Node: WRITE216065 Node: System and Portable File IO217337 Node: APPLY DICTIONARY218351 Node: EXPORT221042 Node: GET222761 Node: GET DATA225259 Node: GET DATA /TYPE=GNM/ODS226475 Node: GET DATA /TYPE=PSQL229000 Node: GET DATA /TYPE=TXT231496 Node: GET DATA /TYPE=TXT /ARRANGEMENT=DELIMITED233332 Node: GET DATA /TYPE=TXT /ARRANGEMENT=FIXED238685 Node: IMPORT241144 Node: SAVE242089 Node: SAVE DATA COLLECTION245873 Node: SAVE TRANSLATE247223 Node: SAVE TRANSLATE /TYPE=CSV and TYPE=TAB249388 Node: SYSFILE INFO252561 Node: XEXPORT253613 Node: XSAVE254433 Node: Combining Data Files255253 Node: Combining Files Common Syntax256688 Node: ADD FILES263164 Node: MATCH FILES264538 Node: UPDATE267202 Node: Variable Attributes269411 Node: ADD VALUE LABELS271117 Node: DELETE VARIABLES271521 Node: DISPLAY272177 Node: FORMATS274519 Node: LEAVE275319 Node: MISSING VALUES276636 Node: MODIFY VARS277940 Node: MRSETS279924 Node: NUMERIC284050 Node: PRINT FORMATS284670 Node: RENAME VARIABLES285127 Node: SORT VARIABLES286010 Node: VALUE LABELS288450 Node: STRING289670 Node: VARIABLE ATTRIBUTE290906 Node: VARIABLE LABELS293431 Node: VARIABLE ALIGNMENT294176 Node: VARIABLE WIDTH294770 Node: VARIABLE LEVEL295289 Node: VARIABLE ROLE295811 Node: VECTOR296738 Node: WRITE FORMATS298330 Node: Data Manipulation298758 Node: AGGREGATE299634 Node: AUTORECODE308861 Node: COMPUTE311509 Node: COUNT313102 Node: FLIP316123 Node: IF318145 Node: RECODE319684 Node: SORT CASES326963 Node: Data Selection328155 Node: FILTER328947 Node: N OF CASES330026 Node: SAMPLE331437 Node: SELECT IF333181 Node: SPLIT FILE334054 Node: TEMPORARY335343 Node: WEIGHT336387 Node: Conditionals and Looping337725 Node: BREAK338251 Node: DO IF338542 Node: DO REPEAT339456 Node: LOOP342009 Node: Statistics344731 Node: DESCRIPTIVES345990 Node: FREQUENCIES349241 Ref: FREQUENCIES-Footnote-1353893 Node: EXAMINE354145 Ref: EXAMINE-Footnote-1361093 Node: GRAPH361304 Node: SCATTERPLOT362052 Node: HISTOGRAM362737 Node: BAR CHART363287 Node: CORRELATIONS365270 Node: CROSSTABS367970 Node: FACTOR373911 Node: GLM380333 Node: LOGISTIC REGRESSION382466 Node: MEANS385681 Node: NPAR TESTS389352 Node: BINOMIAL391247 Node: CHISQUARE393115 Node: COCHRAN394182 Node: FRIEDMAN394646 Node: KENDALL395138 Node: KOLMOGOROV-SMIRNOV395700 Node: KRUSKAL-WALLIS397464 Node: MANN-WHITNEY398278 Node: MCNEMAR399151 Node: MEDIAN400133 Node: RUNS401174 Node: SIGN401869 Node: WILCOXON402743 Node: T-TEST403736 Node: One Sample Mode405551 Node: Independent Samples Mode406015 Node: Paired Samples Mode407281 Node: ONEWAY408130 Node: QUICK CLUSTER410975 Node: RANK414444 Node: REGRESSION416989 Node: Syntax418395 Node: Examples421257 Node: RELIABILITY422012 Node: ROC423760 Node: Utilities426891 Node: ADD DOCUMENT428752 Node: CACHE429336 Node: CD429524 Node: COMMENT429746 Node: DOCUMENT430589 Node: DISPLAY DOCUMENTS431430 Node: DISPLAY FILE LABEL431776 Node: DROP DOCUMENTS432111 Node: ECHO432511 Node: ERASE432819 Node: EXECUTE433112 Node: FILE LABEL433339 Node: FINISH433776 Node: HOST433993 Node: INCLUDE435821 Node: INSERT436598 Node: OUTPUT439597 Node: PERMISSIONS441200 Node: PRESERVE and RESTORE441937 Node: SET442310 Ref: SET BLANKS445057 Ref: SET DECIMAL445330 Ref: SET FORMAT445809 Ref: SET EPOCH445946 Ref: SET RIB446358 Ref: SET RRB446941 Ref: SET FUZZBITS449871 Ref: CCx Settings450736 Ref: SET WIB451133 Ref: SET WRB451716 Node: SHOW456679 Node: SUBTITLE458387 Node: TITLE458926 Node: Invoking pspp-convert459403 Node: Invoking pspp-output465506 Node: The pspp-output detect Command466549 Node: The pspp-output dir Command466978 Node: The pspp-output convert Command467655 Node: Input Selection Options468962 Node: Invoking pspp-dump-sav472477 Node: Not Implemented473812 Node: Bugs478480 Node: Function Index482823 Node: Command Index505561 Node: Concept Index516602 Node: GNU Free Documentation License560866  End Tag Table  Local Variables: coding: utf-8 End: pspp-1.4.1/doc/flow-control.texi0000644000175000017500000001661213602320036016201 0ustar00blpblp00000000000000@c PSPP - a program for statistical analysis. @c Copyright (C) 2017 Free Software Foundation, Inc. @c Permission is granted to copy, distribute and/or modify this document @c under the terms of the GNU Free Documentation License, Version 1.3 @c or any later version published by the Free Software Foundation; @c with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. @c A copy of the license is included in the section entitled "GNU @c Free Documentation License". @c @node Conditionals and Looping @chapter Conditional and Looping Constructs @cindex conditionals @cindex loops @cindex flow of control @cindex control flow This chapter documents @pspp{} commands used for conditional execution, looping, and flow of control. @menu * BREAK:: Exit a loop. * DO IF:: Conditionally execute a block of code. * DO REPEAT:: Textually repeat a code block. * LOOP:: Repeat a block of code. @end menu @node BREAK @section BREAK @vindex BREAK @display BREAK. @end display @cmd{BREAK} terminates execution of the innermost currently executing @cmd{LOOP} construct. @cmd{BREAK} is allowed only inside @cmd{LOOP}@dots{}@cmd{END LOOP}. @xref{LOOP}, for more details. @node DO IF @section DO IF @vindex DO IF @display DO IF condition. @dots{} [ELSE IF condition. @dots{} ]@dots{} [ELSE. @dots{}] END IF. @end display @cmd{DO IF} allows one of several sets of transformations to be executed, depending on user-specified conditions. If the specified boolean expression evaluates as true, then the block of code following @cmd{DO IF} is executed. If it evaluates as missing, then none of the code blocks is executed. If it is false, then the boolean expression on the first @cmd{ELSE IF}, if present, is tested in turn, with the same rules applied. If all expressions evaluate to false, then the @cmd{ELSE} code block is executed, if it is present. When @cmd{DO IF} or @cmd{ELSE IF} is specified following @cmd{TEMPORARY} (@pxref{TEMPORARY}), the @cmd{LAG} function may not be used (@pxref{LAG}). @node DO REPEAT @section DO REPEAT @vindex DO REPEAT @display DO REPEAT dummy_name=expansion@dots{}. @dots{} END REPEAT [PRINT]. expansion takes one of the following forms: var_list num_or_range@dots{} 'string'@dots{} ALL num_or_range takes one of the following forms: number num1 TO num2 @end display @cmd{DO REPEAT} repeats a block of code, textually substituting different variables, numbers, or strings into the block with each repetition. Specify a dummy variable name followed by an equals sign (@samp{=}) and the list of replacements. Replacements can be a list of existing or new variables, numbers, strings, or @code{ALL} to specify all existing variables. When numbers are specified, runs of increasing integers may be indicated as @code{@var{num1} TO @var{num2}}, so that @samp{1 TO 5} is short for @samp{1 2 3 4 5}. Multiple dummy variables can be specified. Each variable must have the same number of replacements. The code within @cmd{DO REPEAT} is repeated as many times as there are replacements for each variable. The first time, the first value for each dummy variable is substituted; the second time, the second value for each dummy variable is substituted; and so on. Dummy variable substitutions work like macros. They take place anywhere in a line that the dummy variable name occurs. This includes command and subcommand names, so command and subcommand names that appear in the code block should not be used as dummy variable identifiers. Dummy variable substitutions do not occur inside quoted strings, comments, unquoted strings (such as the text on the @cmd{TITLE} or @cmd{DOCUMENT} command), or inside @cmd{BEGIN DATA}@dots{}@cmd{END DATA}. Substitution occurs only on whole words, so that, for example, a dummy variable PRINT would not be substituted into the word PRINTOUT. New variable names used as replacements are not automatically created as variables, but only if used in the code block in a context that would create them, e.g.@: on a @cmd{NUMERIC} or @cmd{STRING} command or on the left side of a @cmd{COMPUTE} assignment. Any command may appear within @subcmd{DO REPEAT}, including nested @subcmd{DO REPEAT} commands. If @cmd{INCLUDE} or @cmd{INSERT} appears within @subcmd{DO REPEAT}, the substitutions do not apply to the included file. If @subcmd{PRINT} is specified on @cmd{END REPEAT}, the commands after substitutions are made should be printed to the listing file, prefixed by a plus sign (@samp{+}). This feature is not yet implemented. @node LOOP @section LOOP @vindex LOOP @display LOOP [@var{index_var}=@var{start} TO @var{end} [BY @var{incr}]] [IF @var{condition}]. @dots{} END LOOP [IF @var{condition}]. @end display @cmd{LOOP} iterates a group of commands. A number of termination options are offered. Specify index_var to make that variable count from one value to another by a particular increment. @var{index_var} must be a pre-existing numeric variable. @var{start}, @var{end}, and @var{incr} are numeric expressions (@pxref{Expressions}.) During the first iteration, @var{index_var} is set to the value of @var{start}. During each successive iteration, @var{index_var} is increased by the value of @var{incr}. If @var{end} > @var{start}, then the loop terminates when @var{index_var} > @var{end}; otherwise it terminates when @var{index_var} < @var{end}. If @var{incr} is not specified then it defaults to +1 or -1 as appropriate. If @var{end} > @var{start} and @var{incr} < 0, or if @var{end} < @var{start} and @var{incr} > 0, then the loop is never executed. @var{index_var} is nevertheless set to the value of start. Modifying @var{index_var} within the loop is allowed, but it has no effect on the value of @var{index_var} in the next iteration. Specify a boolean expression for the condition on @cmd{LOOP} to cause the loop to be executed only if the condition is true. If the condition is false or missing before the loop contents are executed the first time, the loop contents are not executed at all. If index and condition clauses are both present on @cmd{LOOP}, the index variable is always set before the condition is evaluated. Thus, a condition that makes use of the index variable will always see the index value to be used in the next execution of the body. Specify a boolean expression for the condition on @cmd{END LOOP} to cause the loop to terminate if the condition is true after the enclosed code block is executed. The condition is evaluated at the end of the loop, not at the beginning, so that the body of a loop with only a condition on @cmd{END LOOP} will always execute at least once. If the index clause is not present, then the loop is executed at most @var{max_loops} (@pxref{SET}) times (but possibly fewer, if a condition clause evaluates to false or if @cmd{BREAK} executes). The default value of @var{max_loops} is 40. @cmd{BREAK} also terminates @cmd{LOOP} execution (@pxref{BREAK}). Loop index variables are by default reset to system-missing from one case to another, not left, unless a scratch variable is used as index. When loops are nested, this is usually undesired behavior, which can be corrected with @cmd{LEAVE} (@pxref{LEAVE}) or by using a scratch variable as the loop index. When @cmd{LOOP} or @cmd{END LOOP} is specified following @cmd{TEMPORARY} (@pxref{TEMPORARY}), the @cmd{LAG} function may not be used (@pxref{LAG}). pspp-1.4.1/doc/pspp-dev.info-20000644000175000017500000027365713725007453015464 0ustar00blpblp00000000000000This is pspp-dev.info, produced by makeinfo version 6.7 from pspp-dev.texi. This manual is for GNU PSPP version 1.4.1, software for statistical analysis. Copyright (C) 1997, 1998, 2004, 2005, 2007, 2010, 2014, 2015, 2016 Free Software Foundation, Inc. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included in the section entitled "GNU Free Documentation License". INFO-DIR-SECTION Math START-INFO-DIR-ENTRY * PSPP Developers Guide: (pspp-dev). Tutorial and reference for PSPP developers. END-INFO-DIR-ENTRY  File: pspp-dev.info, Node: SPV Legacy Detail Member XML Format, Prev: SPV Legacy Detail Member Binary Format, Up: SPSS Viewer File Format D.4 Legacy Detail Member XML Format =================================== The design of the detail XML format is not what one would end up with for describing pivot tables. This is because it is a special case of a much more general format ("visualization XML" or "VizML") that can describe a wide range of visualizations. Most of this generality is overkill for tables, and so we end up with a funny subset of a general-purpose format. An XML Schema for VizML is available, distributed with SPSS binaries, under a nonfree license. It contains documentation that is occasionally helpful. This section describes the detail XML format using the same notation already used for the structure XML format (*note SPV Structure Member Format::). See 'src/output/spv/detail-xml.grammar' in the PSPP source tree for the full grammar that it uses for parsing. The important elements of the detail XML format are: * Variables. *Note SPV Detail Variable Elements::. * Assignment of variables to axes. A variable can appear as columns, or rows, or layers. The 'faceting' element and its sub-elements describe this assignment. * Styles and other annotations. This description is not detailed enough to write legacy tables. Instead, write tables in the light binary format. * Menu: * SPV Detail visualization Element:: * SPV Detail Variable Elements:: * SPV Detail extension Element:: * SPV Detail graph Element:: * SPV Detail location Element:: * SPV Detail faceting Element:: * SPV Detail facetLayout Element:: * SPV Detail label Element:: * SPV Detail setCellProperties Element:: * SPV Detail setFormat Element:: * SPV Detail interval Element:: * SPV Detail style Element:: * SPV Detail labelFrame Element:: * SPV Detail Legacy Properties::  File: pspp-dev.info, Node: SPV Detail visualization Element, Next: SPV Detail Variable Elements, Up: SPV Legacy Detail Member XML Format D.4.1 The 'visualization' Element --------------------------------- visualization :creator :date :lang :name :style[style_ref]=ref style :type :version :schemaLocation? => visualization_extension? userSource (sourceVariable | derivedVariable)+ categoricalDomain? graph labelFrame[lf1]* container? labelFrame[lf2]* style+ layerController? extension[visualization_extension] :numRows=int? :showGridline=bool? :minWidthSet=(true)? :maxWidthSet=(true)? => EMPTY userSource :missing=(listwise | pairwise)? => EMPTY categoricalDomain => variableReference simpleSort simpleSort :method[sort_method]=(custom) => categoryOrder container :style=ref style => container_extension? location+ labelFrame* extension[container_extension] :combinedFootnotes=(true) => EMPTY layerController :source=(tableData) :target=ref label? => EMPTY The 'visualization' element is the root of detail XML member. It has the following attributes: -- Attribute: creator The version of the software that created this SPV file, as a string of the form 'xxyyzz', which represents software version xx.yy.zz, e.g. '160001' is version 16.0.1. The corpus includes major versions 16 through 19. -- Attribute: date The date on the which the file was created, as a string of the form 'YYYY-MM-DD'. -- Attribute: lang The locale used for output, in Windows format, which is similar to the format used in Unix with the underscore replaced by a hyphen, e.g. 'en-US', 'en-GB', 'el-GR', 'sr-Cryl-RS'. -- Attribute: name The title of the pivot table, localized to the output language. -- Attribute: style The base style for the pivot table. In every example in the corpus, the 'style' element has no attributes other than 'id'. -- Attribute: type A floating-point number. The meaning is unknown. -- Attribute: version The visualization schema version number. In the corpus, the value is one of 2.4, 2.5, 2.7, and 2.8. The 'userSource' element has no visible effect. The 'extension' element as a child of 'visualization' has the following attributes. -- Attribute: numRows An integer that presumably defines the number of rows in the displayed pivot table. -- Attribute: showGridline Always set to 'false' in the corpus. -- Attribute: minWidthSet -- Attribute: maxWidthSet Always set to 'true' in the corpus. The 'extension' element as a child of 'container' has the following attribute -- Attribute: combinedFootnotes Meaning unknown. The 'categoricalDomain' and 'simpleSort' elements have no visible effect. The 'layerController' element has no visible effect.  File: pspp-dev.info, Node: SPV Detail Variable Elements, Next: SPV Detail extension Element, Prev: SPV Detail visualization Element, Up: SPV Legacy Detail Member XML Format D.4.2 Variable Elements ----------------------- A "variable" in detail XML is a 1-dimensional array of data. Each element of the array may, independently, have string or numeric content. All of the variables in a given detail XML member either have the same number of elements or have zero elements. Two different elements define variables and their content: 'sourceVariable' These variables' data comes from the associated 'tableData.bin' member. 'derivedVariable' These variables are defined in terms of a mapping function from a source variable, or they are empty. A variable named 'cell' always exists. This variable holds the data displayed in the table. Variables in detail XML roughly correspond to the dimensions in a light detail member. Each dimension has the following variables with stylized names, where N is a number for the dimension starting from 0: 'dimensionNcategories' The dimension's leaf categories (*note SPV Light Member Categories::). 'dimensionNgroup0' Present only if the dimension's categories are grouped, this variable holds the group labels for the categories. Grouping is inferred through adjacent identical labels. Categories that are not part of a group have empty-string data in this variable. 'dimensionNgroup1' Present only if the first-level groups are further grouped, this variable holds the labels for the second-level groups. There can be additional variables with further levels of grouping. 'dimensionN' An empty variable. Determining the data for a (non-empty) variable is a multi-step process: 1. Draw initial data from its source, for a 'sourceVariable', or from another named variable, for a 'derivedVariable'. 2. Apply mappings from 'valueMapEntry' elements within the 'derivedVariable' element, if any. 3. Apply mappings from 'relabel' elements within a 'format' or 'stringFormat' element in the 'sourceVariable' or 'derivedVariable' element, if any. 4. If the variable is a 'sourceVariable' with a 'labelVariable' attribute, and there were no mappings to apply in previous steps, then replace each element of the variable by the corresponding value in the label variable. A single variable's data can be modified in two of the steps, if both 'valueMapEntry' and 'relabel' are used. The following example from the corpus maps several integers to 2, then maps 2 in turn to the string "Input": * Menu: * SPV Detail sourceVariable Element:: * SPV Detail derivedVariable Element:: * SPV Detail valueMapEntry Element::  File: pspp-dev.info, Node: SPV Detail sourceVariable Element, Next: SPV Detail derivedVariable Element, Up: SPV Detail Variable Elements D.4.2.1 The 'sourceVariable' Element .................................... sourceVariable :id :categorical=(true) :source :domain=ref categoricalDomain? :sourceName :dependsOn=ref sourceVariable? :label? :labelVariable=ref sourceVariable? => variable_extension* (format | stringFormat)? This element defines a variable whose data comes from the 'tableData.bin' member that corresponds to this '.xml'. This element has the following attributes. -- Attribute: id An 'id' is always present because this element exists to be referenced from other elements. -- Attribute: categorical Always set to 'true'. -- Attribute: source Always set to 'tableData', the 'source-name' in the corresponding 'tableData.bin' member (*note SPV Legacy Member Metadata::). -- Attribute: sourceName The name of a variable within the source, corresponding to the 'variable-name' in the 'tableData.bin' member (*note SPV Legacy Member Numeric Data::). -- Attribute: label The variable label, if any. -- Attribute: labelVariable The 'variable-name' of a variable whose string values correspond one-to-one with the values of this variable and are suitable for use as value labels. -- Attribute: dependsOn This attribute doesn't affect the display of a table.  File: pspp-dev.info, Node: SPV Detail derivedVariable Element, Next: SPV Detail valueMapEntry Element, Prev: SPV Detail sourceVariable Element, Up: SPV Detail Variable Elements D.4.2.2 The 'derivedVariable' Element ..................................... derivedVariable :id :categorical=(true) :value :dependsOn=ref sourceVariable? => variable_extension* (format | stringFormat)? valueMapEntry* Like 'sourceVariable', this element defines a variable whose values can be used elsewhere in the visualization. Instead of being read from a data source, the variable's data are defined by a mathematical expression. This element has the following attributes. -- Attribute: id An 'id' is always present because this element exists to be referenced from other elements. -- Attribute: categorical Always set to 'true'. -- Attribute: value An expression that defines the variable's value. In theory this could be an arbitrary expression in terms of constants, functions, and other variables, e.g. (VAR1 + VAR2) / 2. In practice, the corpus contains only the following forms of expressions: 'constant(0)' 'constant(VARIABLE)' All zeros. The reason why a variable is sometimes named is unknown. Sometimes the "variable name" has spaces in it. 'map(VARIABLE)' Transforms the values in the named VARIABLE using the 'valueMapEntry's contained within the element. -- Attribute: dependsOn This attribute doesn't affect the display of a table.  File: pspp-dev.info, Node: SPV Detail valueMapEntry Element, Prev: SPV Detail derivedVariable Element, Up: SPV Detail Variable Elements D.4.2.3 The 'valueMapEntry' Element ................................... valueMapEntry :from :to => EMPTY A 'valueMapEntry' element defines a mapping from one or more values of a source expression to a target value. (In the corpus, the source expression is always just the name of a variable.) Each target value requires a separate 'valueMapEntry'. If multiple source values map to the same target value, they can be combined or separate. In the corpus, all of the source and target values are integers. 'valueMapEntry' has the following attributes. -- Attribute: from A source value, or multiple source values separated by semicolons, e.g. '0' or '13;14;15;16'. -- Attribute: to The target value, e.g. '0'.  File: pspp-dev.info, Node: SPV Detail extension Element, Next: SPV Detail graph Element, Prev: SPV Detail Variable Elements, Up: SPV Legacy Detail Member XML Format D.4.3 The 'extension' Element ----------------------------- This is a general-purpose "extension" element. Readers that don't understand a given extension should be able to safely ignore it. The attributes on this element, and their meanings, vary based on the context. Each known usage is described separately below. The current extensions use attributes exclusively, without any nested elements. 'container' Parent Element .......................... extension[container_extension] :combinedFootnotes=(true) => EMPTY With 'container' as its parent element, 'extension' has the following attributes. -- Attribute: combinedFootnotes Always set to 'true' in the corpus. 'sourceVariable' and 'derivedVariable' Parent Element ..................................................... extension[variable_extension] :from :helpId => EMPTY With 'sourceVariable' or 'derivedVariable' as its parent element, 'extension' has the following attributes. A given parent element often contains several 'extension' elements that specify the meaning of the source data's variables or sources, e.g. More commonly they are less helpful, e.g. -- Attribute: from An integer or a name like "dimension0". -- Attribute: helpId An identifier.  File: pspp-dev.info, Node: SPV Detail graph Element, Next: SPV Detail location Element, Prev: SPV Detail extension Element, Up: SPV Legacy Detail Member XML Format D.4.4 The 'graph' Element ------------------------- graph :cellStyle=ref style :style=ref style => location+ coordinates faceting facetLayout interval coordinates => EMPTY 'graph' has the following attributes. -- Attribute: cellStyle -- Attribute: style Each of these is the 'id' of a 'style' element (*note SPV Detail style Element::). The former is the default style for individual cells, the latter for the entire table.  File: pspp-dev.info, Node: SPV Detail location Element, Next: SPV Detail faceting Element, Prev: SPV Detail graph Element, Up: SPV Legacy Detail Member XML Format D.4.5 The 'location' Element ---------------------------- location :part=(height | width | top | bottom | left | right) :method=(sizeToContent | attach | fixed | same) :min=dimension? :max=dimension? :target=ref (labelFrame | graph | container)? :value? => EMPTY Each instance of this element specifies where some part of the table frame is located. All the examples in the corpus have four instances of this element, one for each of the parts 'height', 'width', 'left', and 'top'. Some examples in the corpus add a fifth for part 'bottom', even though it is not clear how all of 'top', 'bottom', and 'height' can be honored at the same time. In any case, 'location' seems to have little importance in representing tables; a reader can safely ignore it. -- Attribute: part The part of the table being located. -- Attribute: method How the location is determined: 'sizeToContent' Based on the natural size of the table. Observed only for parts 'height' and 'width'. 'attach' Based on the location specified in 'target'. Observed only for parts 'top' and 'bottom'. 'fixed' Using the value in 'value'. Observed only for parts 'top', 'bottom', and 'left'. 'same' Same as the specified 'target'. Observed only for part 'left'. -- Attribute: min Minimum size. Only observed with value '100pt'. Only observed for part 'width'. -- Dependent: target Required when 'method' is 'attach' or 'same', not observed otherwise. This identifies an element to attach to. Observed with the ID of 'title', 'footnote', 'graph', and other elements. -- Dependent: value Required when 'method' is 'fixed', not observed otherwise. Observed values are '0%', '0px', '1px', and '3px' on parts 'top' and 'left', and '100%' on part 'bottom'.  File: pspp-dev.info, Node: SPV Detail faceting Element, Next: SPV Detail facetLayout Element, Prev: SPV Detail location Element, Up: SPV Legacy Detail Member XML Format D.4.6 The 'faceting' Element ---------------------------- faceting => layer[layers1]* cross layer[layers2]* cross => (unity | nest) (unity | nest) unity => EMPTY nest => variableReference[vars]+ variableReference :ref=ref (sourceVariable | derivedVariable) => EMPTY layer :variable=ref (sourceVariable | derivedVariable) :value :visible=bool? :method[layer_method]=(nest)? :titleVisible=bool? => EMPTY The 'faceting' element describes the row, column, and layer structure of the table. Its 'cross' child determines the row and column structure, and each 'layer' child (if any) represents a layer. Layers may appear before or after 'cross'. The 'cross' element describes the row and column structure of the table. It has exactly two children, the first of which describes the table's columns and the second the table's rows. Each child is a 'nest' element if the table has any dimensions along the axis in question, otherwise a 'unity' element. A 'nest' element contains of one or more dimensions listed from innermost to outermost, each represented by 'variableReference' child elements. Each variable in a dimension is listed in order. *Note SPV Detail Variable Elements::, for information on the variables that comprise a dimension. A 'nest' can contain a single dimension, e.g.: A 'nest' can contain multiple dimensions, e.g.: A 'nest' may have no dimensions, in which case it still has one 'variableReference' child, which references a 'derivedVariable' whose 'value' attribute is 'constant(0)'. In the corpus, such a 'derivedVariable' has 'row' or 'column', respectively, as its 'id'. This is equivalent to using a 'unity' element in place of 'nest'. A 'variableReference' element refers to a variable through its 'ref' attribute. Each 'layer' element represents a dimension, e.g.: 'layer' has the following attributes. -- Attribute: variable Refers to a 'sourceVariable' or 'derivedVariable' element. -- Attribute: value The value to select. For a category variable, this is always '0'; for a data variable, it is the same as the 'variable' attribute. -- Attribute: visible Whether the layer is visible. Generally, category layers are visible and data layers are not, but sometimes this attribute is omitted. -- Attribute: method When present, this is always 'nest'.  File: pspp-dev.info, Node: SPV Detail facetLayout Element, Next: SPV Detail label Element, Prev: SPV Detail faceting Element, Up: SPV Legacy Detail Member XML Format D.4.7 The 'facetLayout' Element ------------------------------- facetLayout => tableLayout setCellProperties[scp1]* facetLevel+ setCellProperties[scp2]* tableLayout :verticalTitlesInCorner=bool :style=ref style? :fitCells=(ticks both)? => EMPTY The 'facetLayout' element and its descendants control styling for the table. Its 'tableLayout' child has the following attributes -- Attribute: verticalTitlesInCorner If true, in the absence of corner text, row headings will be displayed in the corner. -- Attribute: style Refers to a 'style' element. -- Attribute: fitCells Meaning unknown. The 'facetLevel' Element ........................ facetLevel :level=int :gap=dimension? => axis axis :style=ref style => label? majorTicks majorTicks :labelAngle=int :length=dimension :style=ref style :tickFrameStyle=ref style :labelFrequency=int? :stagger=bool? => gridline? gridline :style=ref style :zOrder=int => EMPTY Each 'facetLevel' describes a 'variableReference' or 'layer', and a table has one 'facetLevel' element for each such element. For example, an SPV detail member that contains four 'variableReference' elements and two 'layer' elements will contain six 'facetLevel' elements. In the corpus, 'facetLevel' elements and the elements that they describe are always in the same order. The correspondence may also be observed in two other ways. First, one may use the 'level' attribute, described below. Second, in the corpus, a 'facetLevel' always has an 'id' that is the same as the 'id' of the element it describes with '_facetLevel' appended. One should not formally rely on this, of course, but it is usefully indicative. -- Attribute: level A 1-based index into the 'variableReference' and 'layer' elements, e.g. a 'facetLayout' with a 'level' of 1 describes the first 'variableReference' in the SPV detail member, and in a member with four 'variableReference' elements, a 'facetLayout' with a 'level' of 5 describes the first 'layer' in the member. -- Attribute: gap Always observed as '0pt'. Each 'facetLevel' contains an 'axis', which in turn may contain a 'label' for the 'facetLevel' (*note SPV Detail label Element::) and does contain a 'majorTicks' element. -- Attribute: labelAngle Normally 0. The value -90 causes inner column or outer row labels to be rotated vertically. -- Attribute: style -- Attribute: tickFrameStyle Each refers to a 'style' element. 'style' is the style of the tick labels, 'tickFrameStyle' the style for the frames around the labels.  File: pspp-dev.info, Node: SPV Detail label Element, Next: SPV Detail setCellProperties Element, Prev: SPV Detail facetLayout Element, Up: SPV Legacy Detail Member XML Format D.4.8 The 'label' Element ------------------------- label :style=ref style :textFrameStyle=ref style? :purpose=(title | subTitle | subSubTitle | layer | footnote)? => text+ | descriptionGroup descriptionGroup :target=ref faceting :separator? => (description | text)+ description :name=(variable | value) => EMPTY text :usesReference=int? :definesReference=int? :position=(subscript | superscript)? :style=ref style => TEXT This element represents a label on some aspect of the table. -- Attribute: style -- Attribute: textFrameStyle Each of these refers to a 'style' element. 'style' is the style of the label text, 'textFrameStyle' the style for the frame around the label. -- Attribute: purpose The kind of entity being labeled. A 'descriptionGroup' concatenates one or more elements to form a label. Each element can be a 'text' element, which contains literal text, or a 'description' element that substitutes a value or a variable name. -- Attribute: target The 'id' of an element being described. In the corpus, this is always 'faceting'. -- Attribute: separator A string to separate the description of multiple groups, if the 'target' has more than one. In the corpus, this is always a new-line. Typical contents for a 'descriptionGroup' are a value by itself: or a variable and its value, separated by a colon: : A 'description' is like a macro that expands to some property of the target of its parent 'descriptionGroup'. The 'name' attribute specifies the property.  File: pspp-dev.info, Node: SPV Detail setCellProperties Element, Next: SPV Detail setFormat Element, Prev: SPV Detail label Element, Up: SPV Legacy Detail Member XML Format D.4.9 The 'setCellProperties' Element ------------------------------------- setCellProperties :applyToConverse=bool? => (setStyle | setFrameStyle | setFormat | setMetaData)* union[union_]? The 'setCellProperties' element sets style properties of cells or row or column labels. Interpreting 'setCellProperties' requires answering two questions: which cells or labels to style, and what styles to use. Which Cells? ............ union => intersect+ intersect => where+ | intersectWhere | alternating | EMPTY where :variable=ref (sourceVariable | derivedVariable) :include => EMPTY intersectWhere :variable=ref (sourceVariable | derivedVariable) :variable2=ref (sourceVariable | derivedVariable) => EMPTY alternating => EMPTY When 'union' is present with 'intersect' children, each of those children specifies a group of cells that should be styled, and the total group is all those cells taken together. When 'union' is absent, every cell is styled. One attribute on 'setCellProperties' affects the choice of cells: -- Attribute: applyToConverse If true, this inverts the meaning of the cell selection: the selected cells are the ones _not_ designated. This is confusing, given the additional restrictions of 'union', but in the corpus 'applyToConverse' is never present along with 'union'. An 'intersect' specifies restrictions on the cells to be matched. Each 'where' child specifies which values of a given variable to include. The attributes of 'intersect' are: -- Attribute: variable Refers to a variable, e.g. 'dimension0categories'. Only "categories" variables make sense here, but other variables, e.g. 'dimension0group0map', are sometimes seen. The reader may ignore these. -- Attribute: include A value, or multiple values separated by semicolons, e.g. '0' or '13;14;15;16'. PSPP ignores 'setCellProperties' when 'intersectWhere' is present. What Styles? ............ setStyle :target=ref (labeling | graph | interval | majorTicks) :style=ref style => EMPTY setMetaData :target=ref graph :key :value => EMPTY setFormat :target=ref (majorTicks | labeling) :reset=bool? => format | numberFormat | stringFormat+ | dateTimeFormat | elapsedTimeFormat setFrameStyle :style=ref style :target=ref majorTicks => EMPTY The 'set*' children of 'setCellProperties' determine the styles to set. When 'setCellProperties' contains a 'setFormat' whose 'target' references a 'labeling' element, or if it contains a 'setStyle' that references a 'labeling' or 'interval' element, the 'setCellProperties' sets the style for table cells. The format from the 'setFormat', if present, replaces the cells' format. The style from the 'setStyle' that references 'labeling', if present, replaces the label's font and cell styles, except that the background color is taken instead from the 'interval''s style, if present. When 'setCellProperties' contains a 'setFormat' whose 'target' references a 'majorTicks' element, or if it contains a 'setStyle' whose 'target' references a 'majorTicks', or if it contains a 'setFrameStyle' element, the 'setCellProperties' sets the style for row or column labels. In this case, the 'setCellProperties' always contains a single 'where' element whose 'variable' designates the variable whose labels are to be styled. The format from the 'setFormat', if present, replaces the labels' format. The style from the 'setStyle' that references 'majorTicks', if present, replaces the labels' font and cell styles, except that the background color is taken instead from the 'setFrameStyle''s style, if present. When 'setCellProperties' contains a 'setStyle' whose 'target' references a 'graph' element, and one that references a 'labeling' element, and the 'union' element contains 'alternating', the 'setCellProperties' sets the alternate foreground and background colors for the data area. The foreground color is taken from the style referenced by the 'setStyle' that targets the 'graph', the background color from the 'setStyle' for 'labeling'. A reader may ignore a 'setCellProperties' that only contains 'setMetaData', as well as 'setMetaData' within other 'setCellProperties'. A reader may ignore a 'setCellProperties' whose only 'set*' child is a 'setStyle' that targets the 'graph' element. The 'setStyle' Element ...................... setStyle :target=ref (labeling | graph | interval | majorTicks) :style=ref style => EMPTY This element associates a style with the target. -- Attribute: target The 'id' of an element whose style is to be set. -- Attribute: style The 'id' of a 'style' element that identifies the style to set on the target.  File: pspp-dev.info, Node: SPV Detail setFormat Element, Next: SPV Detail interval Element, Prev: SPV Detail setCellProperties Element, Up: SPV Legacy Detail Member XML Format D.4.10 The 'setFormat' Element ------------------------------ setFormat :target=ref (majorTicks | labeling) :reset=bool? => format | numberFormat | stringFormat+ | dateTimeFormat | elapsedTimeFormat This element sets the format of the target, "format" in this case meaning the SPSS print format for a variable. The details of this element vary depending on the schema version, as declared in the root 'visualization' element's 'version' attribute (*note SPV Detail visualization Element::). A reader can interpret the content without knowing the schema version. The 'setFormat' element itself has the following attributes. -- Attribute: target Refers to an element whose style is to be set. -- Attribute: reset If this is 'true', this format replaces the target's previous format. If it is 'false', the modifies the previous format. * Menu: * SPV Detail numberFormat Element:: * SPV Detail stringFormat Element:: * SPV Detail dateTimeFormat Element:: * SPV Detail elapsedTimeFormat Element:: * SPV Detail format Element:: * SPV Detail affix Element::  File: pspp-dev.info, Node: SPV Detail numberFormat Element, Next: SPV Detail stringFormat Element, Up: SPV Detail setFormat Element D.4.10.1 The 'numberFormat' Element ................................... numberFormat :minimumIntegerDigits=int? :maximumFractionDigits=int? :minimumFractionDigits=int? :useGrouping=bool? :scientific=(onlyForSmall | whenNeeded | true | false)? :small=real? :prefix? :suffix? => affix* Specifies a format for displaying a number. The available options are a superset of those available from PSPP print formats. PSPP chooses a print format type for a 'numberFormat' as follows: 1. If 'scientific' is 'true', uses 'E' format. 2. If 'prefix' is '$', uses 'DOLLAR' format. 3. If 'suffix' is '%', uses 'PCT' format. 4. If 'useGrouping' is 'true', uses 'COMMA' format. 5. Otherwise, uses 'F' format. For translating to a print format, PSPP uses 'maximumFractionDigits' as the number of decimals, unless that attribute is missing or out of the range [0,15], in which case it uses 2 decimals. -- Attribute: minimumIntegerDigits Minimum number of digits to display before the decimal point. Always observed as '0'. -- Attribute: maximumFractionDigits -- Attribute: minimumFractionDigits Maximum or minimum, respectively, number of digits to display after the decimal point. The observed values of each attribute range from 0 to 9. -- Attribute: useGrouping Whether to use the grouping character to group digits in large numbers. -- Attribute: scientific This attribute controls when and whether the number is formatted in scientific notation. It takes the following values: 'onlyForSmall' Use scientific notation only when the number's magnitude is smaller than the value of the 'small' attribute. 'whenNeeded' Use scientific notation when the number will not otherwise fit in the available space. 'true' Always use scientific notation. Not observed in the corpus. 'false' Never use scientific notation. A number that won't otherwise fit will be replaced by an error indication (see the 'errorCharacter' attribute). Not observed in the corpus. -- Attribute: small Only present when the 'scientific' attribute is 'onlyForSmall', this is a numeric magnitude below which the number will be formatted in scientific notation. The values '0' and '0.0001' have been observed. The value '0' seems like a pathological choice, since no real number has a magnitude less than 0; perhaps in practice such a choice is equivalent to setting 'scientific' to 'false'. -- Attribute: prefix -- Attribute: suffix Specifies a prefix or a suffix to apply to the formatted number. Only 'suffix' has been observed, with value '%'.  File: pspp-dev.info, Node: SPV Detail stringFormat Element, Next: SPV Detail dateTimeFormat Element, Prev: SPV Detail numberFormat Element, Up: SPV Detail setFormat Element D.4.10.2 The 'stringFormat' Element ................................... stringFormat => relabel* affix* relabel :from=real :to => EMPTY The 'stringFormat' element specifies how to display a string. By default, a string is displayed verbatim, but 'relabel' can change it. The 'relabel' element appears as a child of 'stringFormat' (and of 'format', when it is used to format strings). It specifies how to display a given value. It is used to implement value labels and to display the system-missing value in a human-readable way. It has the following attributes: -- Attribute: from The value to map. In the corpus this is an integer or the system-missing value '-1.797693134862316E300'. -- Attribute: to The string to display in place of the value of 'from'. In the corpus this is a wide variety of value labels; the system-missing value is mapped to '.'.  File: pspp-dev.info, Node: SPV Detail dateTimeFormat Element, Next: SPV Detail elapsedTimeFormat Element, Prev: SPV Detail stringFormat Element, Up: SPV Detail setFormat Element D.4.10.3 The 'dateTimeFormat' Element ..................................... dateTimeFormat :baseFormat[dt_base_format]=(date | time | dateTime) :separatorChars? :mdyOrder=(dayMonthYear | monthDayYear | yearMonthDay)? :showYear=bool? :yearAbbreviation=bool? :showQuarter=bool? :quarterPrefix? :quarterSuffix? :showMonth=bool? :monthFormat=(long | short | number | paddedNumber)? :showWeek=bool? :weekPadding=bool? :weekSuffix? :showDayOfWeek=bool? :dayOfWeekAbbreviation=bool? :dayPadding=bool? :dayOfMonthPadding=bool? :hourPadding=bool? :minutePadding=bool? :secondPadding=bool? :showDay=bool? :showHour=bool? :showMinute=bool? :showSecond=bool? :showMillis=bool? :dayType=(month | year)? :hourFormat=(AMPM | AS_24 | AS_12)? => affix* This element appears only in schema version 2.5 and earlier (*note SPV Detail visualization Element::). Data to be formatted in date formats is stored as strings in legacy data, in the format 'yyyy-mm-ddTHH:MM:SS.SSS' and must be parsed and reformatted by the reader. The following attribute is required. -- Attribute: baseFormat Specifies whether a date and time are both to be displayed, or just one of them. Many of the attributes' meanings are obvious. The following seem to be worth documenting. -- Attribute: separatorChars Exactly four characters. In order, these are used for: decimal point, grouping, date separator, time separator. Always '.,-:'. -- Attribute: mdyOrder Within a date, the order of the days, months, and years. 'dayMonthYear' is the only observed value, but one would expect that 'monthDayYear' and 'yearMonthDay' to be reasonable as well. -- Attribute: showYear -- Attribute: yearAbbreviation Whether to include the year and, if so, whether the year should be shown abbreviated, that is, with only 2 digits. Each is 'true' or 'false'; only values of 'true' and 'false', respectively, have been observed. -- Attribute: showMonth -- Attribute: monthFormat Whether to include the month ('true' or 'false') and, if so, how to format it. 'monthFormat' is one of the following: 'long' The full name of the month, e.g. in an English locale, 'September'. 'short' The abbreviated name of the month, e.g. in an English locale, 'Sep'. 'number' The number representing the month, e.g. 9 for September. 'paddedNumber' A two-digit number representing the month, e.g. 09 for September. Only values of 'true' and 'short', respectively, have been observed. -- Attribute: dayType This attribute is always 'month' in the corpus, specifying that the day of the month is to be displayed; a value of 'year' is supposed to indicate that the day of the year, where 1 is January 1, is to be displayed instead. -- Attribute: hourFormat 'hourFormat', if present, is one of: 'AMPM' The time is displayed with an 'am' or 'pm' suffix, e.g. '10:15pm'. 'AS_24' The time is displayed in a 24-hour format, e.g. '22:15'. This is the only value observed in the corpus. 'AS_12' The time is displayed in a 12-hour format, without distinguishing morning or evening, e.g. '10;15'. 'hourFormat' is sometimes present for 'elapsedTime' formats, which is confusing since a time duration does not have a concept of AM or PM. This might indicate a bug in the code that generated the XML in the corpus, or it might indicate that 'elapsedTime' is sometimes used to format a time of day. For a 'baseFormat' of 'date', PSPP chooses a print format type based on the following rules: 1. If 'showQuarter' is true: 'QYR'. 2. Otherwise, if 'showWeek' is true: 'WKYR'. 3. Otherwise, if 'mdyOrder' is 'dayMonthYear': a. If 'monthFormat' is 'number' or 'paddedNumber': 'EDATE'. b. Otherwise: 'DATE'. 4. Otherwise, if 'mdyOrder' is 'yearMonthDay': 'SDATE'. 5. Otherwise, 'ADATE'. For a 'baseFormat' of 'dateTime', PSPP uses 'YMDHMS' if 'mdyOrder' is 'yearMonthDay' and 'DATETIME' otherwise. For a 'baseFormat' of 'time', PSPP uses 'DTIME' if 'showDay' is true, otherwise 'TIME' if 'showHour' is true, otherwise 'MTIME'. For a 'baseFormat' of 'date', the chosen width is the minimum for the format type, adding 2 if 'yearAbbreviation' is false or omitted. For other base formats, the chosen width is the minimum for its type, plus 3 if 'showSecond' is true, plus 4 more if 'showMillis' is also true. Decimals are 0 by default, or 3 if 'showMillis' is true.  File: pspp-dev.info, Node: SPV Detail elapsedTimeFormat Element, Next: SPV Detail format Element, Prev: SPV Detail dateTimeFormat Element, Up: SPV Detail setFormat Element D.4.10.4 The 'elapsedTimeFormat' Element ........................................ elapsedTimeFormat :baseFormat[dt_base_format]=(date | time | dateTime) :dayPadding=bool? :hourPadding=bool? :minutePadding=bool? :secondPadding=bool? :showYear=bool? :showDay=bool? :showHour=bool? :showMinute=bool? :showSecond=bool? :showMillis=bool? => affix* This element specifies the way to display a time duration. Data to be formatted in elapsed time formats is stored as strings in legacy data, in the format 'H:MM:SS.SSS', with additional hour digits as needed for long durations, and must be parsed and reformatted by the reader. The following attribute is required. -- Attribute: baseFormat Specifies whether a day and a time are both to be displayed, or just one of them. The remaining attributes specify exactly how to display the elapsed time. For 'baseFormat' of 'time', PSPP converts this element to print format type 'DTIME'; otherwise, if 'showHour' is true, to 'TIME'; otherwise, to 'MTIME'. The chosen width is the minimum for the chosen type, adding 3 if 'showSecond' is true, adding 4 more if 'showMillis' is also true. Decimals are 0 by default, or 3 if 'showMillis' is true.  File: pspp-dev.info, Node: SPV Detail format Element, Next: SPV Detail affix Element, Prev: SPV Detail elapsedTimeFormat Element, Up: SPV Detail setFormat Element D.4.10.5 The 'format' Element ............................. format :baseFormat[f_base_format]=(date | time | dateTime | elapsedTime)? :errorCharacter? :separatorChars? :mdyOrder=(dayMonthYear | monthDayYear | yearMonthDay)? :showYear=bool? :showQuarter=bool? :quarterPrefix? :quarterSuffix? :yearAbbreviation=bool? :showMonth=bool? :monthFormat=(long | short | number | paddedNumber)? :dayPadding=bool? :dayOfMonthPadding=bool? :showWeek=bool? :weekPadding=bool? :weekSuffix? :showDayOfWeek=bool? :dayOfWeekAbbreviation=bool? :hourPadding=bool? :minutePadding=bool? :secondPadding=bool? :showDay=bool? :showHour=bool? :showMinute=bool? :showSecond=bool? :showMillis=bool? :dayType=(month | year)? :hourFormat=(AMPM | AS_24 | AS_12)? :minimumIntegerDigits=int? :maximumFractionDigits=int? :minimumFractionDigits=int? :useGrouping=bool? :scientific=(onlyForSmall | whenNeeded | true | false)? :small=real? :prefix? :suffix? :tryStringsAsNumbers=bool? :negativesOutside=bool? => relabel* affix* This element is the union of all of the more-specific format elements. It is interpreted in the same way as one of those format elements, using 'baseFormat' to determine which kind of format to use. There are a few attributes not present in the more specific formats: -- Attribute: tryStringsAsNumbers When this is 'true', it is supposed to indicate that string values should be parsed as numbers and then displayed according to numeric formatting rules. However, in the corpus it is always 'false'. -- Attribute: negativesOutside If true, the negative sign should be shown before the prefix; if false, it should be shown after.  File: pspp-dev.info, Node: SPV Detail affix Element, Prev: SPV Detail format Element, Up: SPV Detail setFormat Element D.4.10.6 The 'affix' Element ............................ affix :definesReference=int :position=(subscript | superscript) :suffix=bool :value => EMPTY This defines a suffix (or, theoretically, a prefix) for a formatted value. It is used to insert a reference to a footnote. It has the following attributes: -- Attribute: definesReference This specifies the footnote number as a natural number: 1 for the first footnote, 2 for the second, and so on. -- Attribute: position Position for the footnote label. Always 'superscript'. -- Attribute: suffix Whether the affix is a suffix ('true') or a prefix ('false'). Always 'true'. -- Attribute: value The text of the suffix or prefix. Typically a letter, e.g. 'a' for footnote 1, 'b' for footnote 2, ... The corpus contains other values: '*', '**', and a few that begin with at least one comma: ',b', ',c', ',,b', and ',,c'.  File: pspp-dev.info, Node: SPV Detail interval Element, Next: SPV Detail style Element, Prev: SPV Detail setFormat Element, Up: SPV Legacy Detail Member XML Format D.4.11 The 'interval' Element ----------------------------- interval :style=ref style => labeling footnotes? labeling :style=ref style? :variable=ref (sourceVariable | derivedVariable) => (formatting | format | footnotes)* formatting :variable=ref (sourceVariable | derivedVariable) => formatMapping* formatMapping :from=int => format? footnotes :superscript=bool? :variable=ref (sourceVariable | derivedVariable) => footnoteMapping* footnoteMapping :definesReference=int :from=int :to => EMPTY The 'interval' element and its descendants determine the basic formatting and labeling for the table's cells. These basic styles are overridden by more specific styles set using 'setCellProperties' (*note SPV Detail setCellProperties Element::). The 'style' attribute of 'interval' itself may be ignored. The 'labeling' element may have a single 'formatting' child. If present, its 'variable' attribute refers to a variable whose values are format specifiers as numbers, e.g. value 0x050802 for F8.2. However, the numbers are not actually interpreted that way. Instead, each number actually present in the variable's data is mapped by a 'formatMapping' child of 'formatting' to a 'format' that specifies how to display it. The 'labeling' element may also have a 'footnotes' child element. The 'variable' attribute of this element refers to a variable whose values are comma-delimited strings that list the 1-based indexes of footnote references. (Cells without any footnote references are numeric 0 instead of strings.) Each 'footnoteMapping' child of the 'footnotes' element defines the footnote marker to be its 'to' attribute text for the footnote whose 1-based index is given in its 'definesReference' attribute.  File: pspp-dev.info, Node: SPV Detail style Element, Next: SPV Detail labelFrame Element, Prev: SPV Detail interval Element, Up: SPV Legacy Detail Member XML Format D.4.12 The 'style' Element -------------------------- style :color=color? :color2=color? :labelAngle=real? :border-bottom=(solid | thick | thin | double | none)? :border-top=(solid | thick | thin | double | none)? :border-left=(solid | thick | thin | double | none)? :border-right=(solid | thick | thin | double | none)? :border-bottom-color? :border-top-color? :border-left-color? :border-right-color? :font-family? :font-size? :font-weight=(regular | bold)? :font-style=(regular | italic)? :font-underline=(none | underline)? :margin-bottom=dimension? :margin-left=dimension? :margin-right=dimension? :margin-top=dimension? :textAlignment=(left | right | center | decimal | mixed)? :labelLocationHorizontal=(positive | negative | center)? :labelLocationVertical=(positive | negative | center)? :decimal-offset=dimension? :size? :width? :visible=bool? => EMPTY A 'style' element has an effect only when it is referenced by another element to set some aspect of the table's style. Most of the attributes are self-explanatory. The rest are described below. -- Attribute: color In some cases, the text color; in others, the background color. -- Attribute: color2 Not used. -- Attribute: labelAngle Normally 0. The value -90 causes inner column or outer row labels to be rotated vertically. -- Attribute: labelLocationHorizontal Not used. -- Attribute: labelLocationVertical The value 'positive' corresponds to vertically aligning text to the top of a cell, 'negative' to the bottom, 'center' to the middle.  File: pspp-dev.info, Node: SPV Detail labelFrame Element, Next: SPV Detail Legacy Properties, Prev: SPV Detail style Element, Up: SPV Legacy Detail Member XML Format D.4.13 The 'labelFrame' Element ------------------------------- labelFrame :style=ref style => location+ label? paragraph? paragraph :hangingIndent=dimension? => EMPTY A 'labelFrame' element specifies content and style for some aspect of a table. Only 'labelFrame' elements that have a 'label' child are important. The 'purpose' attribute in the 'label' determines what the 'labelFrame' affects: 'title' The table's title and its style. 'subTitle' The table's caption and its style. 'footnote' The table's footnotes and the style for the footer area. 'layer' The style for the layer area. 'subSubTitle' Ignored. The 'style' attribute references the style to use for the area. The 'label', if present, specifies the text to put into the title or caption or footnotes. For footnotes, the label has two 'text' children for every footnote, each of which has a 'usesReference' attribute identifying the 1-based index of a footnote. The first, third, fifth, ... 'text' child specifies the content for a footnote; the second, fourth, sixth, ... child specifies the marker. Content tends to end in a new-line, which the reader may wish to trim; similarly, markers tend to end in '.'. The 'paragraph', if present, may be ignored, since it is always empty.  File: pspp-dev.info, Node: SPV Detail Legacy Properties, Prev: SPV Detail labelFrame Element, Up: SPV Legacy Detail Member XML Format D.4.14 Legacy Properties ------------------------ The detail XML format has features for styling most of the aspects of a table. It also inherits defaults for many aspects from structure XML, which has the following 'tableProperties' element: tableProperties => generalProperties footnoteProperties cellFormatProperties borderProperties printingProperties generalProperties :hideEmptyRows=bool? :maximumColumnWidth=dimension? :maximumRowWidth=dimension? :minimumColumnWidth=dimension? :minimumRowWidth=dimension? :rowDimensionLabels=(inCorner | nested)? => EMPTY footnoteProperties :markerPosition=(superscript | subscript)? :numberFormat=(alphabetic | numeric)? => EMPTY cellFormatProperties => cell_style+ any[cell_style] :alternatingColor=color? :alternatingTextColor=color? => style style :color=color? :color2=color? :font-family? :font-size? :font-style=(regular | italic)? :font-weight=(regular | bold)? :labelLocationVertical=(positive | negative | center)? :margin-bottom=dimension? :margin-left=dimension? :margin-right=dimension? :margin-top=dimension? :textAlignment=(left | right | center | decimal | mixed)? :decimal-offset=dimension? => EMPTY borderProperties => border_style+ any[border_style] :borderStyleType=(none | solid | dashed | thick | thin | double)? :color=color? => EMPTY printingProperties :printAllLayers=bool? :rescaleLongTableToFitPage=bool? :rescaleWideTableToFitPage=bool? :windowOrphanLines=int? :continuationText? :continuationTextAtBottom=bool? :continuationTextAtTop=bool? :printEachLayerOnSeparatePage=bool? => EMPTY  File: pspp-dev.info, Node: Encrypted File Wrappers, Next: q2c Input Format, Prev: SPSS Viewer File Format, Up: Top E Encrypted File Wrappers ************************* SPSS 21 and later can package multiple kinds of files inside an encrypted wrapper. The wrapper has a common format, regardless of the kind of the file that it contains. Warning: The SPSS encryption wrapper is poorly designed. When the password is unknown, it is much cheaper and faster to decrypt a file encrypted this way than if a well designed alternative were used. If you must use this format, use a 10-byte randomly generated password. * Menu: * Common Wrapper Format:: * Password Encoding::  File: pspp-dev.info, Node: Common Wrapper Format, Next: Password Encoding, Up: Encrypted File Wrappers E.1 Common Wrapper Format ========================= An encrypted file wrapper begins with the following 36-byte header, where xxx identifies the type of file encapsulated: 'SAV' for a system file, 'SPS' for a syntax file, 'SPV' for a viewer file. PSPP code for identifying these files just checks for the 'ENCRYPTED' keyword at offset 8, but the other bytes are also fixed in practice: 0000 1c 00 00 00 00 00 00 00 45 4e 43 52 59 50 54 45 |........ENCRYPTE| 0010 44 xx xx xx 15 00 00 00 00 00 00 00 00 00 00 00 |Dxxx............| 0020 00 00 00 00 |....| Following the fixed header is essentially the regular contents of the encapsulated file in its usual format, with each 16-byte block encrypted with AES-256 in ECB mode. To make the plaintext an even multiple of 16 bytes in length, the encryption process appends PKCS #7 padding, as specified in RFC 5652 section 6.3. Padding appends 1 to 16 bytes to the plaintext, in which each byte of padding is the number of padding bytes added. If the plaintext is, for example, 2 bytes short of a multiple of 16, the padding is 2 bytes with value 02; if the plaintext is a multiple of 16 bytes in length, the padding is 16 bytes with value 0x10. The AES-256 key is derived from a password in the following way: 1. Start from the literal password typed by the user. Truncate it to at most 10 bytes, then append as many null bytes as necessary until there are exactly 32 bytes. Call this PASSWORD. 2. Let CONSTANT be the following 73-byte constant: 0000 00 00 00 01 35 27 13 cc 53 a7 78 89 87 53 22 11 0010 d6 5b 31 58 dc fe 2e 7e 94 da 2f 00 cc 15 71 80 0020 0a 6c 63 53 00 38 c3 38 ac 22 f3 63 62 0e ce 85 0030 3f b8 07 4c 4e 2b 77 c7 21 f5 1a 80 1d 67 fb e1 0040 e1 83 07 d8 0d 00 00 01 00 3. Compute CMAC-AES-256(PASSWORD, CONSTANT). Call the 16-byte result CMAC. 4. The 32-byte AES-256 key is CMAC || CMAC, that is, CMAC repeated twice. Example ------- Consider the password 'pspp'. PASSWORD is: 0000 70 73 70 70 00 00 00 00 00 00 00 00 00 00 00 00 |pspp............| 0010 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| CMAC is: 0000 3e da 09 8e 66 04 d4 fd f9 63 0c 2c a8 6f b0 45 The AES-256 key is: 0000 3e da 09 8e 66 04 d4 fd f9 63 0c 2c a8 6f b0 45 0010 3e da 09 8e 66 04 d4 fd f9 63 0c 2c a8 6f b0 45 * Menu: * Checking Passwords::  File: pspp-dev.info, Node: Checking Passwords, Up: Common Wrapper Format E.1.1 Checking Passwords ------------------------ A program reading an encrypted file may wish to verify that the password it was given is the correct one. One way is to verify that the PKCS #7 padding at the end of the file is well formed. However, any plaintext that ends in byte 01 is well formed PKCS #7, meaning that about 1 in 256 keys will falsely pass this test. This might be acceptable for interactive use, but the false positive rate is too high for a brute-force search of the password space. A better test requires some knowledge of the file format being wrapped, to obtain a "magic number" for the beginning of the file. * The plaintext of system files begins with '$FL2@(#)' or '$FL3@(#)'. * Before encryption, a syntax file is prefixed with a line at the beginning of the form '* Encoding: ENCODING.', where ENCODING is the encoding used for the rest of the file, e.g. 'windows-1252'. Thus, '* Encoding' may be used as a magic number for system files. * The plaintext of viewer files begins with 50 4b 03 04 14 00 08 (50 4b is 'PK').  File: pspp-dev.info, Node: Password Encoding, Prev: Common Wrapper Format, Up: Encrypted File Wrappers E.2 Password Encoding ===================== SPSS also supports what it calls "encrypted passwords." These are not encrypted. They are encoded with a simple, fixed scheme. An encoded password is always a multiple of 2 characters long, and never longer than 20 characters. The characters in an encoded password are always in the graphic ASCII range 33 through 126. Each successive pair of characters in the password encodes a single byte in the plaintext password. Use the following algorithm to decode a pair of characters: 1. Let A be the ASCII code of the first character, and B be the ASCII code of the second character. 2. Let AH be the most significant 4 bits of A. Find the line in the table below that has AH on the left side. The right side of the line is a set of possible values for the most significant 4 bits of the decoded byte. 2 => 2367 3 => 0145 47 => 89cd 56 => abef 3. Let BH be the most significant 4 bits of B. Find the line in the second table below that has BH on the left side. The right side of the line is a set of possible values for the most significant 4 bits of the decoded byte. Together with the results of the previous step, only a single possibility is left. 2 => 139b 3 => 028a 47 => 46ce 56 => 57df 4. Let AL be the least significant 4 bits of A. Find the line in the table below that has AL on the left side. The right side of the line is a set of possible values for the least significant 4 bits of the decoded byte. 03cf => 0145 12de => 2367 478b => 89cd 569a => abef 5. Let BL be the least significant 4 bits of B. Find the line in the table below that has BL on the left side. The right side of the line is a set of possible values for the least significant 4 bits of the decoded byte. Together with the results of the previous step, only a single possibility is left. 03cf => 028a 12de => 139b 478b => 46ce 569a => 57df Example ------- Consider the encoded character pair '-|'. A is 0x2d and B is 0x7c, so AH is 2, BH is 7, AL is 0xd, and BL is 0xc. AH means that the most significant four bits of the decoded character is 2, 3, 6, or 7, and BH means that they are 4, 6, 0xc, or 0xe. The single possibility in common is 6, so the most significant four bits are 6. Similarly, AL means that the least significant four bits are 2, 3, 6, or 7, and BL means they are 0, 2, 8, or 0xa, so the least significant four bits are 2. The decoded character is therefore 0x62, the letter 'b'.  File: pspp-dev.info, Node: q2c Input Format, Next: GNU Free Documentation License, Prev: Encrypted File Wrappers, Up: Top Appendix F 'q2c' Input Format ***************************** PSPP statistical procedures have a bizarre and somewhat irregular syntax. Despite this, a parser generator has been written that adequately addresses many of the possibilities and tries to provide hooks for the exceptional cases. This parser generator is named 'q2c'. * Menu: * Invoking q2c:: q2c command-line syntax. * q2c Input Structure:: High-level layout of the input file. * Grammar Rules:: Syntax of the grammar rules.  File: pspp-dev.info, Node: Invoking q2c, Next: q2c Input Structure, Up: q2c Input Format F.1 Invoking q2c ================ q2c INPUT.Q OUTPUT.C 'q2c' translates a '.q' file into a '.c' file. It takes exactly two command-line arguments, which are the input file name and output file name, respectively. 'q2c' does not accept any command-line options.  File: pspp-dev.info, Node: q2c Input Structure, Next: Grammar Rules, Prev: Invoking q2c, Up: q2c Input Format F.2 'q2c' Input Structure ========================= 'q2c' input files are divided into two sections: the grammar rules and the supporting code. The "grammar rules", which make up the first part of the input, are used to define the syntax of the statistical procedure to be parsed. The "supporting code", following the grammar rules, are copied largely unchanged to the output file, except for certain escapes. The most important lines in the grammar rules are used for defining procedure syntax. These lines can be prefixed with a dollar sign ('$'), which prevents Emacs' CC-mode from munging them. Besides this, a bang ('!') at the beginning of a line causes the line, minus the bang, to be written verbatim to the output file (useful for comments). As a third special case, any line that begins with the exact characters '/* *INDENT' is ignored and not written to the output. This allows '.q' files to be processed through 'indent' without being munged. The syntax of the grammar rules themselves is given in the following sections. The supporting code is passed into the output file largely unchanged. However, the following escapes are supported. Each escape must appear on a line by itself. '/* (header) */' Expands to a series of C '#include' directives which include the headers that are required for the parser generated by 'q2c'. '/* (decls SCOPE) */' Expands to C variable and data type declarations for the variables and 'enum's input and output by the 'q2c' parser. SCOPE must be either 'local' or 'global'. 'local' causes the declarations to be output as function locals. 'global' causes them to be declared as 'static' module variables; thus, 'global' is a bit of a misnomer. '/* (parser) */' Expands to the entire parser. Must be enclosed within a C function. '/* (free) */' Expands to a set of calls to the 'free' function for variables declared by the parser. Only needs to be invoked if subcommands of type 'string' are used in the grammar rules.  File: pspp-dev.info, Node: Grammar Rules, Prev: q2c Input Structure, Up: q2c Input Format F.3 Grammar Rules ================= The grammar rules describe the format of the syntax that the parser generated by 'q2c' will understand. The way that the grammar rules are included in 'q2c' input file are described above. The grammar rules are divided into tokens of the following types: Identifier ('ID') An identifier token is a sequence of letters, digits, and underscores ('_'). Identifiers are _not_ case-sensitive. String ('STRING') String tokens are initiated by a double-quote character ('"') and consist of all the characters between that double quote and the next double quote, which must be on the same line as the first. Within a string, a backslash can be used as a "literal escape". The only reasons to use a literal escape are to include a double quote or a backslash within a string. Special character Other characters, other than white space, constitute tokens in themselves. The syntax of the grammar rules is as follows: grammar-rules ::= command-name opt-prefix : subcommands . command-name ::= ID ::= STRING opt-prefix ::= ::= ( ID ) subcommands ::= subcommand ::= subcommands ; subcommand The syntax begins with an ID token that gives the name of the procedure to be parsed. For command names that contain multiple words, a STRING token may be used instead, e.g. '"FILE HANDLE"'. Optionally, an ID in parentheses specifies a prefix used for all file-scope identifiers declared by the emitted code. The rest of the syntax consists of subcommands separated by semicolons (';') and terminated with a full stop ('.'). subcommand ::= default-opt arity-opt ID sbc-defn default-opt ::= ::= * arity-opt ::= ::= + ::= ^ sbc-defn ::= opt-prefix = specifiers ::= [ ID ] = array-sbc ::= opt-prefix = sbc-special-form A subcommand that begins with an asterisk ('*') is the default subcommand. The keyword used for the default subcommand can be omitted in the PSPP syntax file. A plus sign ('+') indicates that a subcommand can appear more than once. A caret ('^') indicate that a subcommand must appear exactly once. A subcommand marked with neither character may appear once or not at all, but not more than once. The subcommand name appears after the leading option characters. There are three forms of subcommands. The first and most common form simply gives an equals sign ('=') and a list of specifiers, which can each be set to a single setting. The second form declares an array, which is a set of flags that can be individually turned on by the user. There are also several special forms that do not take a list of specifiers. Arrays require an additional 'ID' argument. This is used as a prefix, prepended to the variable names constructed from the specifiers. The other forms also allow an optional prefix to be specified. array-sbc ::= alternatives ::= array-sbc , alternatives alternatives ::= ID ::= alternatives | ID An array subcommand is a set of Boolean values that can independently be turned on by the user, listed separated by commas (','). If an value has more than one name then these names are separated by pipes ('|'). specifiers ::= specifier ::= specifiers , specifier specifier ::= opt-id : settings opt-id ::= ::= ID Ordinary subcommands (other than arrays and special forms) require a list of specifiers. Each specifier has an optional name and a list of settings. If the name is given then a correspondingly named variable will be used to store the user's choice of setting. If no name is given then there is no way to tell which setting the user picked; in this case the settings should probably have values attached. settings ::= setting ::= settings / setting setting ::= setting-options ID setting-value setting-options ::= ::= * ::= ! ::= * ! Individual settings are separated by forward slashes ('/'). Each setting can be as little as an 'ID' token, but options and values can optionally be included. The '*' option means that, for this setting, the 'ID' can be omitted. The '!' option means that this option is the default for its specifier. setting-value ::= ::= ( setting-value-2 ) ::= setting-value-2 setting-value-2 ::= setting-value-options setting-value-type : ID setting-value-options ::= ::= * setting-value-type ::= N ::= D ::= S Settings may have values. If the value must be enclosed in parentheses, then enclose the value declaration in parentheses. Declare the setting type as 'n', 'd', or 's' for integer, floating-point, or string type, respectively. The given 'ID' is used to construct a variable name. If option '*' is given, then the value is optional; otherwise it must be specified whenever the corresponding setting is specified. sbc-special-form ::= VAR ::= VARLIST varlist-options ::= INTEGER opt-list ::= DOUBLE opt-list ::= PINT ::= STRING (the literal word STRING) ::= CUSTOM varlist-options ::= ::= ( STRING ) opt-list ::= ::= LIST The special forms are of the following types: 'VAR' A single variable name. 'VARLIST' A list of variables. If given, the string can be used to provide 'PV_*' options to the call to 'parse_variables'. 'INTEGER' A single integer value. 'INTEGER LIST' A list of integers separated by spaces or commas. 'DOUBLE' A single floating-point value. 'DOUBLE LIST' A list of floating-point values. 'PINT' A single positive integer value. 'STRING' A string value. 'CUSTOM' A custom function is used to parse this subcommand. The function must have prototype 'int custom_NAME (void)'. It should return 0 on failure (when it has already issued an appropriate diagnostic), 1 on success, or 2 if it fails and the calling function should issue a syntax error on behalf of the custom handler.  File: pspp-dev.info, Node: GNU Free Documentation License, Prev: q2c Input Format, Up: Top Appendix G GNU Free Documentation License ***************************************** Version 1.3, 3 November 2008 Copyright (C) 2000, 2001, 2002, 2007, 2008 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. 0. PREAMBLE The purpose of this License is to make a manual, textbook, or other functional and useful document "free" in the sense of freedom: to assure everyone the effective freedom to copy and redistribute it, with or without modifying it, either commercially or noncommercially. Secondarily, this License preserves for the author and publisher a way to get credit for their work, while not being considered responsible for modifications made by others. This License is a kind of "copyleft", which means that derivative works of the document must themselves be free in the same sense. It complements the GNU General Public License, which is a copyleft license designed for free software. We have designed this License in order to use it for manuals for free software, because free software needs free documentation: a free program should come with manuals providing the same freedoms that the software does. But this License is not limited to software manuals; it can be used for any textual work, regardless of subject matter or whether it is published as a printed book. We recommend this License principally for works whose purpose is instruction or reference. 1. APPLICABILITY AND DEFINITIONS This License applies to any manual or other work, in any medium, that contains a notice placed by the copyright holder saying it can be distributed under the terms of this License. Such a notice grants a world-wide, royalty-free license, unlimited in duration, to use that work under the conditions stated herein. The "Document", below, refers to any such manual or work. Any member of the public is a licensee, and is addressed as "you". You accept the license if you copy, modify or distribute the work in a way requiring permission under copyright law. A "Modified Version" of the Document means any work containing the Document or a portion of it, either copied verbatim, or with modifications and/or translated into another language. A "Secondary Section" is a named appendix or a front-matter section of the Document that deals exclusively with the relationship of the publishers or authors of the Document to the Document's overall subject (or to related matters) and contains nothing that could fall directly within that overall subject. (Thus, if the Document is in part a textbook of mathematics, a Secondary Section may not explain any mathematics.) The relationship could be a matter of historical connection with the subject or with related matters, or of legal, commercial, philosophical, ethical or political position regarding them. The "Invariant Sections" are certain Secondary Sections whose titles are designated, as being those of Invariant Sections, in the notice that says that the Document is released under this License. If a section does not fit the above definition of Secondary then it is not allowed to be designated as Invariant. The Document may contain zero Invariant Sections. If the Document does not identify any Invariant Sections then there are none. The "Cover Texts" are certain short passages of text that are listed, as Front-Cover Texts or Back-Cover Texts, in the notice that says that the Document is released under this License. A Front-Cover Text may be at most 5 words, and a Back-Cover Text may be at most 25 words. A "Transparent" copy of the Document means a machine-readable copy, represented in a format whose specification is available to the general public, that is suitable for revising the document straightforwardly with generic text editors or (for images composed of pixels) generic paint programs or (for drawings) some widely available drawing editor, and that is suitable for input to text formatters or for automatic translation to a variety of formats suitable for input to text formatters. A copy made in an otherwise Transparent file format whose markup, or absence of markup, has been arranged to thwart or discourage subsequent modification by readers is not Transparent. An image format is not Transparent if used for any substantial amount of text. A copy that is not "Transparent" is called "Opaque". Examples of suitable formats for Transparent copies include plain ASCII without markup, Texinfo input format, LaTeX input format, SGML or XML using a publicly available DTD, and standard-conforming simple HTML, PostScript or PDF designed for human modification. Examples of transparent image formats include PNG, XCF and JPG. Opaque formats include proprietary formats that can be read and edited only by proprietary word processors, SGML or XML for which the DTD and/or processing tools are not generally available, and the machine-generated HTML, PostScript or PDF produced by some word processors for output purposes only. The "Title Page" means, for a printed book, the title page itself, plus such following pages as are needed to hold, legibly, the material this License requires to appear in the title page. For works in formats which do not have any title page as such, "Title Page" means the text near the most prominent appearance of the work's title, preceding the beginning of the body of the text. The "publisher" means any person or entity that distributes copies of the Document to the public. A section "Entitled XYZ" means a named subunit of the Document whose title either is precisely XYZ or contains XYZ in parentheses following text that translates XYZ in another language. (Here XYZ stands for a specific section name mentioned below, such as "Acknowledgements", "Dedications", "Endorsements", or "History".) To "Preserve the Title" of such a section when you modify the Document means that it remains a section "Entitled XYZ" according to this definition. The Document may include Warranty Disclaimers next to the notice which states that this License applies to the Document. These Warranty Disclaimers are considered to be included by reference in this License, but only as regards disclaiming warranties: any other implication that these Warranty Disclaimers may have is void and has no effect on the meaning of this License. 2. VERBATIM COPYING You may copy and distribute the Document in any medium, either commercially or noncommercially, provided that this License, the copyright notices, and the license notice saying this License applies to the Document are reproduced in all copies, and that you add no other conditions whatsoever to those of this License. You may not use technical measures to obstruct or control the reading or further copying of the copies you make or distribute. However, you may accept compensation in exchange for copies. If you distribute a large enough number of copies you must also follow the conditions in section 3. You may also lend copies, under the same conditions stated above, and you may publicly display copies. 3. COPYING IN QUANTITY If you publish printed copies (or copies in media that commonly have printed covers) of the Document, numbering more than 100, and the Document's license notice requires Cover Texts, you must enclose the copies in covers that carry, clearly and legibly, all these Cover Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on the back cover. Both covers must also clearly and legibly identify you as the publisher of these copies. The front cover must present the full title with all words of the title equally prominent and visible. You may add other material on the covers in addition. Copying with changes limited to the covers, as long as they preserve the title of the Document and satisfy these conditions, can be treated as verbatim copying in other respects. If the required texts for either cover are too voluminous to fit legibly, you should put the first ones listed (as many as fit reasonably) on the actual cover, and continue the rest onto adjacent pages. If you publish or distribute Opaque copies of the Document numbering more than 100, you must either include a machine-readable Transparent copy along with each Opaque copy, or state in or with each Opaque copy a computer-network location from which the general network-using public has access to download using public-standard network protocols a complete Transparent copy of the Document, free of added material. If you use the latter option, you must take reasonably prudent steps, when you begin distribution of Opaque copies in quantity, to ensure that this Transparent copy will remain thus accessible at the stated location until at least one year after the last time you distribute an Opaque copy (directly or through your agents or retailers) of that edition to the public. It is requested, but not required, that you contact the authors of the Document well before redistributing any large number of copies, to give them a chance to provide you with an updated version of the Document. 4. MODIFICATIONS You may copy and distribute a Modified Version of the Document under the conditions of sections 2 and 3 above, provided that you release the Modified Version under precisely this License, with the Modified Version filling the role of the Document, thus licensing distribution and modification of the Modified Version to whoever possesses a copy of it. In addition, you must do these things in the Modified Version: A. Use in the Title Page (and on the covers, if any) a title distinct from that of the Document, and from those of previous versions (which should, if there were any, be listed in the History section of the Document). You may use the same title as a previous version if the original publisher of that version gives permission. B. List on the Title Page, as authors, one or more persons or entities responsible for authorship of the modifications in the Modified Version, together with at least five of the principal authors of the Document (all of its principal authors, if it has fewer than five), unless they release you from this requirement. C. State on the Title page the name of the publisher of the Modified Version, as the publisher. D. Preserve all the copyright notices of the Document. E. Add an appropriate copyright notice for your modifications adjacent to the other copyright notices. F. Include, immediately after the copyright notices, a license notice giving the public permission to use the Modified Version under the terms of this License, in the form shown in the Addendum below. G. Preserve in that license notice the full lists of Invariant Sections and required Cover Texts given in the Document's license notice. H. Include an unaltered copy of this License. I. Preserve the section Entitled "History", Preserve its Title, and add to it an item stating at least the title, year, new authors, and publisher of the Modified Version as given on the Title Page. If there is no section Entitled "History" in the Document, create one stating the title, year, authors, and publisher of the Document as given on its Title Page, then add an item describing the Modified Version as stated in the previous sentence. J. Preserve the network location, if any, given in the Document for public access to a Transparent copy of the Document, and likewise the network locations given in the Document for previous versions it was based on. These may be placed in the "History" section. You may omit a network location for a work that was published at least four years before the Document itself, or if the original publisher of the version it refers to gives permission. K. For any section Entitled "Acknowledgements" or "Dedications", Preserve the Title of the section, and preserve in the section all the substance and tone of each of the contributor acknowledgements and/or dedications given therein. L. Preserve all the Invariant Sections of the Document, unaltered in their text and in their titles. Section numbers or the equivalent are not considered part of the section titles. M. Delete any section Entitled "Endorsements". Such a section may not be included in the Modified Version. N. Do not retitle any existing section to be Entitled "Endorsements" or to conflict in title with any Invariant Section. O. Preserve any Warranty Disclaimers. If the Modified Version includes new front-matter sections or appendices that qualify as Secondary Sections and contain no material copied from the Document, you may at your option designate some or all of these sections as invariant. To do this, add their titles to the list of Invariant Sections in the Modified Version's license notice. These titles must be distinct from any other section titles. You may add a section Entitled "Endorsements", provided it contains nothing but endorsements of your Modified Version by various parties--for example, statements of peer review or that the text has been approved by an organization as the authoritative definition of a standard. You may add a passage of up to five words as a Front-Cover Text, and a passage of up to 25 words as a Back-Cover Text, to the end of the list of Cover Texts in the Modified Version. Only one passage of Front-Cover Text and one of Back-Cover Text may be added by (or through arrangements made by) any one entity. If the Document already includes a cover text for the same cover, previously added by you or by arrangement made by the same entity you are acting on behalf of, you may not add another; but you may replace the old one, on explicit permission from the previous publisher that added the old one. The author(s) and publisher(s) of the Document do not by this License give permission to use their names for publicity for or to assert or imply endorsement of any Modified Version. 5. COMBINING DOCUMENTS You may combine the Document with other documents released under this License, under the terms defined in section 4 above for modified versions, provided that you include in the combination all of the Invariant Sections of all of the original documents, unmodified, and list them all as Invariant Sections of your combined work in its license notice, and that you preserve all their Warranty Disclaimers. The combined work need only contain one copy of this License, and multiple identical Invariant Sections may be replaced with a single copy. If there are multiple Invariant Sections with the same name but different contents, make the title of each such section unique by adding at the end of it, in parentheses, the name of the original author or publisher of that section if known, or else a unique number. Make the same adjustment to the section titles in the list of Invariant Sections in the license notice of the combined work. In the combination, you must combine any sections Entitled "History" in the various original documents, forming one section Entitled "History"; likewise combine any sections Entitled "Acknowledgements", and any sections Entitled "Dedications". You must delete all sections Entitled "Endorsements." 6. COLLECTIONS OF DOCUMENTS You may make a collection consisting of the Document and other documents released under this License, and replace the individual copies of this License in the various documents with a single copy that is included in the collection, provided that you follow the rules of this License for verbatim copying of each of the documents in all other respects. You may extract a single document from such a collection, and distribute it individually under this License, provided you insert a copy of this License into the extracted document, and follow this License in all other respects regarding verbatim copying of that document. 7. AGGREGATION WITH INDEPENDENT WORKS A compilation of the Document or its derivatives with other separate and independent documents or works, in or on a volume of a storage or distribution medium, is called an "aggregate" if the copyright resulting from the compilation is not used to limit the legal rights of the compilation's users beyond what the individual works permit. When the Document is included in an aggregate, this License does not apply to the other works in the aggregate which are not themselves derivative works of the Document. If the Cover Text requirement of section 3 is applicable to these copies of the Document, then if the Document is less than one half of the entire aggregate, the Document's Cover Texts may be placed on covers that bracket the Document within the aggregate, or the electronic equivalent of covers if the Document is in electronic form. Otherwise they must appear on printed covers that bracket the whole aggregate. 8. TRANSLATION Translation is considered a kind of modification, so you may distribute translations of the Document under the terms of section 4. Replacing Invariant Sections with translations requires special permission from their copyright holders, but you may include translations of some or all Invariant Sections in addition to the original versions of these Invariant Sections. You may include a translation of this License, and all the license notices in the Document, and any Warranty Disclaimers, provided that you also include the original English version of this License and the original versions of those notices and disclaimers. In case of a disagreement between the translation and the original version of this License or a notice or disclaimer, the original version will prevail. If a section in the Document is Entitled "Acknowledgements", "Dedications", or "History", the requirement (section 4) to Preserve its Title (section 1) will typically require changing the actual title. 9. TERMINATION You may not copy, modify, sublicense, or distribute the Document except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, or distribute it is void, and will automatically terminate your rights under this License. However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, receipt of a copy of some or all of the same material does not give you any rights to use it. 10. FUTURE REVISIONS OF THIS LICENSE The Free Software Foundation may publish new, revised versions of the GNU Free Documentation 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. See . Each version of the License is given a distinguishing version number. If the Document specifies that a particular numbered version of this License "or any later version" applies to it, you have the option of following the terms and conditions either of that specified version or of any later version that has been published (not as a draft) by the Free Software Foundation. If the Document does not specify a version number of this License, you may choose any version ever published (not as a draft) by the Free Software Foundation. If the Document specifies that a proxy can decide which future versions of this License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Document. 11. RELICENSING "Massive Multiauthor Collaboration Site" (or "MMC Site") means any World Wide Web server that publishes copyrightable works and also provides prominent facilities for anybody to edit those works. A public wiki that anybody can edit is an example of such a server. A "Massive Multiauthor Collaboration" (or "MMC") contained in the site means any set of copyrightable works thus published on the MMC site. "CC-BY-SA" means the Creative Commons Attribution-Share Alike 3.0 license published by Creative Commons Corporation, a not-for-profit corporation with a principal place of business in San Francisco, California, as well as future copyleft versions of that license published by that same organization. "Incorporate" means to publish or republish a Document, in whole or in part, as part of another Document. An MMC is "eligible for relicensing" if it is licensed under this License, and if all works that were first published under this License somewhere other than this MMC, and subsequently incorporated in whole or in part into the MMC, (1) had no cover texts or invariant sections, and (2) were thus incorporated prior to November 1, 2008. The operator of an MMC Site may republish an MMC contained in the site under CC-BY-SA on the same site at any time before August 1, 2009, provided the MMC is eligible for relicensing. ADDENDUM: How to use this License for your documents ==================================================== To use this License in a document you have written, include a copy of the License in the document and put the following copyright and license notices just after the title page: Copyright (C) YEAR YOUR NAME. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included in the section entitled ``GNU Free Documentation License''. If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts, replace the "with...Texts." line with this: with the Invariant Sections being LIST THEIR TITLES, with the Front-Cover Texts being LIST, and with the Back-Cover Texts being LIST. If you have Invariant Sections without Cover Texts, or some other combination of the three, merge those two alternatives to suit the situation. If your document contains nontrivial examples of program code, we recommend releasing these examples in parallel under your choice of free software license, such as the GNU General Public License, to permit their use in free software. pspp-1.4.1/doc/concept-index.texi0000644000175000017500000000104213320146056016310 0ustar00blpblp00000000000000@c PSPP - a program for statistical analysis. @c Copyright (C) 2017 Free Software Foundation, Inc. @c Permission is granted to copy, distribute and/or modify this document @c under the terms of the GNU Free Documentation License, Version 1.3 @c or any later version published by the Free Software Foundation; @c with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. @c A copy of the license is included in the section entitled "GNU @c Free Documentation License". @c @node Concept Index @chapter Concept Index @printindex cp pspp-1.4.1/doc/installing.texi0000644000175000017500000000452713320146056015727 0ustar00blpblp00000000000000@c PSPP - a program for statistical analysis. @c Copyright (C) 2017 Free Software Foundation, Inc. @c Permission is granted to copy, distribute and/or modify this document @c under the terms of the GNU Free Documentation License, Version 1.3 @c or any later version published by the Free Software Foundation; @c with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. @c A copy of the license is included in the section entitled "GNU @c Free Documentation License". @c @node Installation @appendix Installing @pspp{} @cindex installation @cindex @pspp{}, installing @cindex GNU C compiler @cindex gcc @cindex compiler, recommended @cindex compiler, gcc @pspp{} is written in ISO C and primarily targeted at UNIX-like environments. To install @pspp{} under a UNIX-like operating system, follow the steps below. @enumerate @item @code{cd} to the directory containing the @pspp{} source. @cindex configure, GNU @cindex GNU configure @item Type @samp{./configure} to configure for your particular operating system and compiler. Running @code{configure} takes a while. While running, it displays some messages telling which features it is checking for. You can optionally supply some options to @code{configure} to give it hints about how to do its job. Type @code{./configure --help} to see a list of options. @cindex compiling @item Type @samp{make} to compile the package. If there are any errors during compilation, try to fix them. If modifications are necessary to compile correctly under your configuration, contact the author. @xref{Bugs,,Submitting Bug Reports}, for details. @cindex self-tests, running @item Type @samp{make check} to run self-tests on the compiled @pspp{} package. @cindex installation @cindex @pspp{}, installing @cindex @file{/usr/local/share/pspp/} @cindex @file{/usr/local/bin/} @cindex @file{/usr/local/info/} @cindex documentation, installing @item Become the superuser and type @samp{make install} to install the @pspp{} binaries, by default in @file{/usr/local/bin/}. The directory @file{/usr/local/share/pspp/} is created and populated with files needed by @pspp{} at runtime. This step will also cause the @pspp{} documentation to be installed in @file{/usr/local/info/}, but only if that directory already exists. @item (optional) Type @samp{make clean} to delete the @pspp{} binaries from the source tree. @end enumerate pspp-1.4.1/doc/license.texi0000644000175000017500000000523313320146056015200 0ustar00blpblp00000000000000@c PSPP - a program for statistical analysis. @c Copyright (C) 2017 Free Software Foundation, Inc. @c Permission is granted to copy, distribute and/or modify this document @c under the terms of the GNU Free Documentation License, Version 1.3 @c or any later version published by the Free Software Foundation; @c with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. @c A copy of the license is included in the section entitled "GNU @c Free Documentation License". @c @node License @chapter Your rights and obligations @cindex license @cindex licence @cindex your rights and obligations @cindex rights, your @cindex copyright @cindex obligations, your @pspp{} is not in the public domain. It is copyrighted and there are restrictions on its distribution, but these restrictions are designed to permit everything that a good cooperating citizen would want to do. What is not allowed is to try to prevent others from further sharing any version of this program that they might get from you. Specifically, we want to make sure that you have the right to give away copies of @pspp{}, that you receive source code or else can get it if you want it, that you can change these programs or use pieces of them in new free programs, and that you know you can do these things. To make sure that everyone has such rights, we have to forbid you to deprive anyone else of these rights. For example, if you distribute copies of @pspp{}, 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 tell them their rights. Also, for our own protection, we must make certain that everyone finds out that there is no warranty for @pspp{}. If these programs are modified by someone else and passed on, we want their recipients to know that what they have is not what we distributed, so that any problems introduced by others will not reflect on our reputation. 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. The precise conditions of the license for @pspp{} are found in the GNU General Public License. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. This manual specifically is covered by the GNU Free Documentation License (@pxref{GNU Free Documentation License}). pspp-1.4.1/doc/regression.texi0000644000175000017500000001271313571051220015733 0ustar00blpblp00000000000000@c PSPP - a program for statistical analysis. @c Copyright (C) 2017 Free Software Foundation, Inc. @c Permission is granted to copy, distribute and/or modify this document @c under the terms of the GNU Free Documentation License, Version 1.3 @c or any later version published by the Free Software Foundation; @c with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. @c A copy of the license is included in the section entitled "GNU @c Free Documentation License". @c @node REGRESSION @section REGRESSION @cindex regression @cindex linear regression The @cmd{REGRESSION} procedure fits linear models to data via least-squares estimation. The procedure is appropriate for data which satisfy those assumptions typical in linear regression: @itemize @bullet @item The data set contains @math{n} observations of a dependent variable, say @math{Y_1,@dots{},Y_n}, and @math{n} observations of one or more explanatory variables. Let @math{X_{11}, X_{12}}, @dots{}, @math{X_{1n}} denote the @math{n} observations of the first explanatory variable; @math{X_{21}},@dots{},@math{X_{2n}} denote the @math{n} observations of the second explanatory variable; @math{X_{k1}},@dots{},@math{X_{kn}} denote the @math{n} observations of the @math{k}th explanatory variable. @item The dependent variable @math{Y} has the following relationship to the explanatory variables: @math{Y_i = b_0 + b_1 X_{1i} + ... + b_k X_{ki} + Z_i} where @math{b_0, b_1, @dots{}, b_k} are unknown coefficients, and @math{Z_1,@dots{},Z_n} are independent, normally distributed @dfn{noise} terms with mean zero and common variance. The noise, or @dfn{error} terms are unobserved. This relationship is called the @dfn{linear model}. @end itemize The @cmd{REGRESSION} procedure estimates the coefficients @math{b_0,@dots{},b_k} and produces output relevant to inferences for the linear model. @menu * Syntax:: Syntax definition. * Examples:: Using the REGRESSION procedure. @end menu @node Syntax @subsection Syntax @vindex REGRESSION @display REGRESSION /VARIABLES=@var{var_list} /DEPENDENT=@var{var_list} /STATISTICS=@{ALL, DEFAULTS, R, COEFF, ANOVA, BCOV, CI[@var{conf}, TOL]@} @{ /ORIGIN | /NOORIGIN @} /SAVE=@{PRED, RESID@} @end display The @cmd{REGRESSION} procedure reads the active dataset and outputs statistics relevant to the linear model specified by the user. The @subcmd{VARIABLES} subcommand, which is required, specifies the list of variables to be analyzed. Keyword @subcmd{VARIABLES} is required. The @subcmd{DEPENDENT} subcommand specifies the dependent variable of the linear model. The @subcmd{DEPENDENT} subcommand is required. All variables listed in the @subcmd{VARIABLES} subcommand, but not listed in the @subcmd{DEPENDENT} subcommand, are treated as explanatory variables in the linear model. All other subcommands are optional: The @subcmd{STATISTICS} subcommand specifies which statistics are to be displayed. The following keywords are accepted: @table @subcmd @item ALL All of the statistics below. @item R The ratio of the sums of squares due to the model to the total sums of squares for the dependent variable. @item COEFF A table containing the estimated model coefficients and their standard errors. @item CI (@var{conf}) This item is only relevant if COEFF has also been selected. It specifies that the confidence interval for the coefficients should be printed. The optional value @var{conf}, which must be in parentheses, is the desired confidence level expressed as a percentage. @item ANOVA Analysis of variance table for the model. @item BCOV The covariance matrix for the estimated model coefficients. @item TOL The variance inflation factor and its reciprocal. This has no effect unless COEFF is also given. @item DEFAULT The same as if R, COEFF, and ANOVA had been selected. This is what you get if the /STATISTICS command is not specified, or if it is specified without any parameters. @end table The @subcmd{ORIGIN} and @subcmd{NOORIGIN} subcommands are mutually exclusive. @subcmd{ORIGIN} indicates that the regression should be performed through the origin. You should use this option if, and only if you have reason to believe that the regression does indeed pass through the origin --- that is to say, the value @math{b_0} above, is zero. The default is @subcmd{NOORIGIN}. The @subcmd{SAVE} subcommand causes @pspp{} to save the residuals or predicted values from the fitted model to the active dataset. @pspp{} will store the residuals in a variable called @samp{RES1} if no such variable exists, @samp{RES2} if @samp{RES1} already exists, @samp{RES3} if @samp{RES1} and @samp{RES2} already exist, etc. It will choose the name of the variable for the predicted values similarly, but with @samp{PRED} as a prefix. When @subcmd{SAVE} is used, @pspp{} ignores @cmd{TEMPORARY}, treating temporary transformations as permanent. @node Examples @subsection Examples The following @pspp{} syntax will generate the default output and save the predicted values and residuals to the active dataset. @example title 'Demonstrate REGRESSION procedure'. data list / v0 1-2 (A) v1 v2 3-22 (10). begin data. b 7.735648 -23.97588 b 6.142625 -19.63854 a 7.651430 -25.26557 c 6.125125 -16.57090 a 8.245789 -25.80001 c 6.031540 -17.56743 a 9.832291 -28.35977 c 5.343832 -16.79548 a 8.838262 -29.25689 b 6.200189 -18.58219 end data. list. regression /variables=v0 v1 v2 /statistics defaults /dependent=v2 /save pred resid /method=enter. @end example pspp-1.4.1/doc/transformation.texi0000644000175000017500000007262513571051220016631 0ustar00blpblp00000000000000@c PSPP - a program for statistical analysis. @c Copyright (C) 2017 Free Software Foundation, Inc. @c Permission is granted to copy, distribute and/or modify this document @c under the terms of the GNU Free Documentation License, Version 1.3 @c or any later version published by the Free Software Foundation; @c with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. @c A copy of the license is included in the section entitled "GNU @c Free Documentation License". @c @node Data Manipulation @chapter Data transformations @cindex transformations The @pspp{} procedures examined in this chapter manipulate data and prepare the active dataset for later analyses. They do not produce output, as a rule. @menu * AGGREGATE:: Summarize multiple cases into a single case. * AUTORECODE:: Automatic recoding of variables. * COMPUTE:: Assigning a variable a calculated value. * COUNT:: Counting variables with particular values. * FLIP:: Exchange variables with cases. * IF:: Conditionally assigning a calculated value. * RECODE:: Mapping values from one set to another. * SORT CASES:: Sort the active dataset. @end menu @node AGGREGATE @section AGGREGATE @vindex AGGREGATE @display AGGREGATE OUTFILE=@{*,'@var{file_name}',@var{file_handle}@} [MODE=@{REPLACE, ADDVARIABLES@}] /PRESORTED /DOCUMENT /MISSING=COLUMNWISE /BREAK=@var{var_list} /@var{dest_var}['@var{label}']@dots{}=@var{agr_func}(@var{src_vars}, @var{args}@dots{})@dots{} @end display @cmd{AGGREGATE} summarizes groups of cases into single cases. Cases are divided into groups that have the same values for one or more variables called @dfn{break variables}. Several functions are available for summarizing case contents. The @subcmd{OUTFILE} subcommand is required and must appear first. Specify a system file or portable file by file name or file handle (@pxref{File Handles}), or a dataset by its name (@pxref{Datasets}). The aggregated cases are written to this file. If @samp{*} is specified, then the aggregated cases replace the active dataset's data. Use of @subcmd{OUTFILE} to write a portable file is a @pspp{} extension. If @subcmd{OUTFILE=*} is given, then the subcommand @subcmd{MODE} may also be specified. The mode subcommand has two possible values: @subcmd{ADDVARIABLES} or @subcmd{REPLACE}. In @subcmd{REPLACE} mode, the entire active dataset is replaced by a new dataset which contains just the break variables and the destination varibles. In this mode, the new file will contain as many cases as there are unique combinations of the break variables. In @subcmd{ADDVARIABLES} mode, the destination variables will be appended to the existing active dataset. Cases which have identical combinations of values in their break variables, will receive identical values for the destination variables. The number of cases in the active dataset will remain unchanged. Note that if @subcmd{ADDVARIABLES} is specified, then the data @emph{must} be sorted on the break variables. By default, the active dataset will be sorted based on the break variables before aggregation takes place. If the active dataset is already sorted or otherwise grouped in terms of the break variables, specify @subcmd{PRESORTED} to save time. @subcmd{PRESORTED} is assumed if @subcmd{MODE=ADDVARIABLES} is used. Specify @subcmd{DOCUMENT} to copy the documents from the active dataset into the aggregate file (@pxref{DOCUMENT}). Otherwise, the aggregate file will not contain any documents, even if the aggregate file replaces the active dataset. Normally, only a single case (for @subcmd{SD} and @subcmd{SD}., two cases) need be non-missing in each group for the aggregate variable to be non-missing. Specifying @subcmd{/MISSING=COLUMNWISE} inverts this behavior, so that the aggregate variable becomes missing if any aggregated value is missing. If @subcmd{PRESORTED}, @subcmd{DOCUMENT}, or @subcmd{MISSING} are specified, they must appear between @subcmd{OUTFILE} and @subcmd{BREAK}. At least one break variable must be specified on @subcmd{BREAK}, a required subcommand. The values of these variables are used to divide the active dataset into groups to be summarized. In addition, at least one @var{dest_var} must be specified. One or more sets of aggregation variables must be specified. Each set comprises a list of aggregation variables, an equals sign (@samp{=}), the name of an aggregation function (see the list below), and a list of source variables in parentheses. Some aggregation functions expect additional arguments following the source variable names. Aggregation variables typically are created with no variable label, value labels, or missing values. Their default print and write formats depend on the aggregation function used, with details given in the table below. A variable label for an aggregation variable may be specified just after the variable's name in the aggregation variable list. Each set must have exactly as many source variables as aggregation variables. Each aggregation variable receives the results of applying the specified aggregation function to the corresponding source variable. The @subcmd{MEAN}, @subcmd{MEDIAN}, @subcmd{SD}, and @subcmd{SUM} aggregation functions may only be applied to numeric variables. All the rest may be applied to numeric and string variables. The available aggregation functions are as follows: @table @asis @item @subcmd{FGT(@var{var_name}, @var{value})} Fraction of values greater than the specified constant. The default format is F5.3. @item @subcmd{FIN(@var{var_name}, @var{low}, @var{high})} Fraction of values within the specified inclusive range of constants. The default format is F5.3. @item @subcmd{FLT(@var{var_name}, @var{value})} Fraction of values less than the specified constant. The default format is F5.3. @item @subcmd{FIRST(@var{var_name})} First non-missing value in break group. The aggregation variable receives the complete dictionary information from the source variable. The sort performed by @cmd{AGGREGATE} (and by @cmd{SORT CASES}) is stable, so that the first case with particular values for the break variables before sorting will also be the first case in that break group after sorting. @item @subcmd{FOUT(@var{var_name}, @var{low}, @var{high})} Fraction of values strictly outside the specified range of constants. The default format is F5.3. @item @subcmd{LAST(@var{var_name})} Last non-missing value in break group. The aggregation variable receives the complete dictionary information from the source variable. The sort performed by @cmd{AGGREGATE} (and by @cmd{SORT CASES}) is stable, so that the last case with particular values for the break variables before sorting will also be the last case in that break group after sorting. @item @subcmd{MAX(@var{var_name})} Maximum value. The aggregation variable receives the complete dictionary information from the source variable. @item @subcmd{MEAN(@var{var_name})} Arithmetic mean. Limited to numeric values. The default format is F8.2. @item @subcmd{MEDIAN(@var{var_name})} The median value. Limited to numeric values. The default format is F8.2. @item @subcmd{MIN(@var{var_name})} Minimum value. The aggregation variable receives the complete dictionary information from the source variable. @item @subcmd{N(@var{var_name})} Number of non-missing values. The default format is F7.0 if weighting is not enabled, F8.2 if it is (@pxref{WEIGHT}). @item @subcmd{N} Number of cases aggregated to form this group. The default format is F7.0 if weighting is not enabled, F8.2 if it is (@pxref{WEIGHT}). @item @subcmd{NMISS(@var{var_name})} Number of missing values. The default format is F7.0 if weighting is not enabled, F8.2 if it is (@pxref{WEIGHT}). @item @subcmd{NU(@var{var_name})} Number of non-missing values. Each case is considered to have a weight of 1, regardless of the current weighting variable (@pxref{WEIGHT}). The default format is F7.0. @item @subcmd{NU} Number of cases aggregated to form this group. Each case is considered to have a weight of 1, regardless of the current weighting variable. The default format is F7.0. @item @subcmd{NUMISS(@var{var_name})} Number of missing values. Each case is considered to have a weight of 1, regardless of the current weighting variable. The default format is F7.0. @item @subcmd{PGT(@var{var_name}, @var{value})} Percentage between 0 and 100 of values greater than the specified constant. The default format is F5.1. @item @subcmd{PIN(@var{var_name}, @var{low}, @var{high})} Percentage of values within the specified inclusive range of constants. The default format is F5.1. @item @subcmd{PLT(@var{var_name}, @var{value})} Percentage of values less than the specified constant. The default format is F5.1. @item @subcmd{POUT(@var{var_name}, @var{low}, @var{high})} Percentage of values strictly outside the specified range of constants. The default format is F5.1. @item @subcmd{SD(@var{var_name})} Standard deviation of the mean. Limited to numeric values. The default format is F8.2. @item @subcmd{SUM(@var{var_name})} Sum. Limited to numeric values. The default format is F8.2. @end table Aggregation functions compare string values in terms of internal character codes. On most modern computers, this is @acronym{ASCII} or a superset thereof. The aggregation functions listed above exclude all user-missing values from calculations. To include user-missing values, insert a period (@samp{.}) at the end of the function name. (e.g.@: @samp{SUM.}). (Be aware that specifying such a function as the last token on a line will cause the period to be interpreted as the end of the command.) @cmd{AGGREGATE} both ignores and cancels the current @cmd{SPLIT FILE} settings (@pxref{SPLIT FILE}). @node AUTORECODE @section AUTORECODE @vindex AUTORECODE @display AUTORECODE VARIABLES=@var{src_vars} INTO @var{dest_vars} [ /DESCENDING ] [ /PRINT ] [ /GROUP ] [ /BLANK = @{VALID, MISSING@} ] @end display The @cmd{AUTORECODE} procedure considers the @var{n} values that a variable takes on and maps them onto values 1@dots{}@var{n} on a new numeric variable. Subcommand @subcmd{VARIABLES} is the only required subcommand and must come first. Specify @subcmd{VARIABLES}, an equals sign (@samp{=}), a list of source variables, @subcmd{INTO}, and a list of target variables. There must the same number of source and target variables. The target variables must not already exist. @cmd{AUTORECODE} ordinarily assigns each increasing non-missing value of a source variable (for a string, this is based on character code comparisons) to consecutive values of its target variable. For example, the smallest non-missing value of the source variable is recoded to value 1, the next smallest to 2, and so on. If the source variable has user-missing values, they are recoded to consecutive values just above the non-missing values. For example, if a source variables has seven distinct non-missing values, then the smallest missing value would be recoded to 8, the next smallest to 9, and so on. Use @subcmd{DESCENDING} to reverse the sort order for non-missing values, so that the largest non-missing value is recoded to 1, the second-largest to 2, and so on. Even with @subcmd{DESCENDING}, user-missing values are still recoded in ascending order just above the non-missing values. The system-missing value is always recoded into the system-missing variable in target variables. If a source value has a value label, then that value label is retained for the new value in the target variable. Otherwise, the source value itself becomes each new value's label. Variable labels are copied from the source to target variables. @subcmd{PRINT} is currently ignored. The @subcmd{GROUP} subcommand is relevant only if more than one variable is to be recoded. It causes a single mapping between source and target values to be used, instead of one map per variable. With @subcmd{GROUP}, user-missing values are taken from the first source variable that has any user-missing values. If @subcmd{/BLANK=MISSING} is given, then string variables which contain only whitespace are recoded as SYSMIS. If @subcmd{/BLANK=VALID} is given then they will be allocated a value like any other. @subcmd{/BLANK} is not relevant to numeric values. @subcmd{/BLANK=VALID} is the default. @cmd{AUTORECODE} is a procedure. It causes the data to be read. @node COMPUTE @section COMPUTE @vindex COMPUTE @display COMPUTE @var{variable} = @var{expression}. @end display or @display COMPUTE vector(@var{index}) = @var{expression}. @end display @cmd{COMPUTE} assigns the value of an expression to a target variable. For each case, the expression is evaluated and its value assigned to the target variable. Numeric and string variables may be assigned. When a string expression's width differs from the target variable's width, the string result of the expression is truncated or padded with spaces on the right as necessary. The expression and variable types must match. For numeric variables only, the target variable need not already exist. Numeric variables created by @cmd{COMPUTE} are assigned an @code{F8.2} output format. String variables must be declared before they can be used as targets for @cmd{COMPUTE}. The target variable may be specified as an element of a vector (@pxref{VECTOR}). In this case, an expression @var{index} must be specified in parentheses following the vector name. The expression @var{index} must evaluate to a numeric value that, after rounding down to the nearest integer, is a valid index for the named vector. Using @cmd{COMPUTE} to assign to a variable specified on @cmd{LEAVE} (@pxref{LEAVE}) resets the variable's left state. Therefore, @code{LEAVE} should be specified following @cmd{COMPUTE}, not before. @cmd{COMPUTE} is a transformation. It does not cause the active dataset to be read. When @cmd{COMPUTE} is specified following @cmd{TEMPORARY} (@pxref{TEMPORARY}), the @cmd{LAG} function may not be used (@pxref{LAG}). @node COUNT @section COUNT @vindex COUNT @display COUNT @var{var_name} = @var{var}@dots{} (@var{value}@dots{}) [/@var{var_name} = @var{var}@dots{} (@var{value}@dots{})]@dots{} Each @var{value} takes one of the following forms: @var{number} @var{string} @var{num1} THRU @var{num2} MISSING SYSMIS where @var{num1} is a numeric expression or the words @subcmd{LO} or @subcmd{LOWEST} and @var{num2} is a numeric expression or @subcmd{HI} or @subcmd{HIGHEST}. @end display @cmd{COUNT} creates or replaces a numeric @dfn{target} variable that counts the occurrence of a @dfn{criterion} value or set of values over one or more @dfn{test} variables for each case. The target variable values are always nonnegative integers. They are never missing. The target variable is assigned an F8.2 output format. @xref{Input and Output Formats}. Any variables, including string variables, may be test variables. User-missing values of test variables are treated just like any other values. They are @strong{not} treated as system-missing values. User-missing values that are criterion values or inside ranges of criterion values are counted as any other values. However (for numeric variables), keyword @subcmd{MISSING} may be used to refer to all system- and user-missing values. @cmd{COUNT} target variables are assigned values in the order specified. In the command @subcmd{COUNT @var{A}=@var{A} @var{B}(1) /@var{B}=@var{A} @var{B}(2).}, the following actions occur: @itemize @minus @item The number of occurrences of 1 between @var{A} and @var{B} is counted. @item @var{A} is assigned this value. @item The number of occurrences of 1 between @var{B} and the @strong{new} value of @var{A} is counted. @item @var{B} is assigned this value. @end itemize Despite this ordering, all @cmd{COUNT} criterion variables must exist before the procedure is executed---they may not be created as target variables earlier in the command! Break such a command into two separate commands. The examples below may help to clarify. @enumerate A @item Assuming @code{Q0}, @code{Q2}, @dots{}, @code{Q9} are numeric variables, the following commands: @enumerate @item Count the number of times the value 1 occurs through these variables for each case and assigns the count to variable @code{QCOUNT}. @item Print out the total number of times the value 1 occurs throughout @emph{all} cases using @cmd{DESCRIPTIVES}. @xref{DESCRIPTIVES}, for details. @end enumerate @example COUNT QCOUNT=Q0 TO Q9(1). DESCRIPTIVES QCOUNT /STATISTICS=SUM. @end example @item Given these same variables, the following commands: @enumerate @item Count the number of valid values of these variables for each case and assigns the count to variable @code{QVALID}. @item Multiplies each value of @code{QVALID} by 10 to obtain a percentage of valid values, using @cmd{COMPUTE}. @xref{COMPUTE}, for details. @item Print out the percentage of valid values across all cases, using @cmd{DESCRIPTIVES}. @xref{DESCRIPTIVES}, for details. @end enumerate @example COUNT QVALID=Q0 TO Q9 (LO THRU HI). COMPUTE QVALID=QVALID*10. DESCRIPTIVES QVALID /STATISTICS=MEAN. @end example @end enumerate @node FLIP @section FLIP @vindex FLIP @display FLIP /VARIABLES=@var{var_list} /NEWNAMES=@var{var_name}. @end display @cmd{FLIP} transposes rows and columns in the active dataset. It causes cases to be swapped with variables, and vice versa. All variables in the transposed active dataset are numeric. String variables take on the system-missing value in the transposed file. @subcmd{N} subcommands are required. If specified, the @subcmd{VARIABLES} subcommand selects variables to be transformed into cases, and variables not specified are discarded. If the @subcmd{VARIABLES} subcommand is omitted, all variables are selected for transposition. The variables specified by @subcmd{NEWNAMES}, which must be a string variable, is used to give names to the variables created by @cmd{FLIP}. Only the first 8 characters of the variable are used. If @subcmd{NEWNAMES} is not specified then the default is a variable named CASE_LBL, if it exists. If it does not then the variables created by @cmd{FLIP} are named VAR000 through VAR999, then VAR1000, VAR1001, and so on. When a @subcmd{NEWNAMES} variable is available, the names must be canonicalized before becoming variable names. Invalid characters are replaced by letter @samp{V} in the first position, or by @samp{_} in subsequent positions. If the name thus generated is not unique, then numeric extensions are added, starting with 1, until a unique name is found or there are no remaining possibilities. If the latter occurs then the @cmd{FLIP} operation aborts. The resultant dictionary contains a CASE_LBL variable, a string variable of width 8, which stores the names of the variables in the dictionary before the transposition. Variables names longer than 8 characters are truncated. If the active dataset is subsequently transposed using @cmd{FLIP}, this variable can be used to recreate the original variable names. @cmd{FLIP} honors @cmd{N OF CASES} (@pxref{N OF CASES}). It ignores @cmd{TEMPORARY} (@pxref{TEMPORARY}), so that ``temporary'' transformations become permanent. @node IF @section IF @vindex IF @display IF @var{condition} @var{variable}=@var{expression}. @end display or @display IF @var{condition} vector(@var{index})=@var{expression}. @end display The @cmd{IF} transformation conditionally assigns the value of a target expression to a target variable, based on the truth of a test expression. Specify a boolean-valued expression (@pxref{Expressions}) to be tested following the @cmd{IF} keyword. This expression is evaluated for each case. If the value is true, then the value of the expression is computed and assigned to the specified variable. If the value is false or missing, nothing is done. Numeric and string variables may be assigned. When a string expression's width differs from the target variable's width, the string result of the expression is truncated or padded with spaces on the right as necessary. The expression and variable types must match. The target variable may be specified as an element of a vector (@pxref{VECTOR}). In this case, a vector index expression must be specified in parentheses following the vector name. The index expression must evaluate to a numeric value that, after rounding down to the nearest integer, is a valid index for the named vector. Using @cmd{IF} to assign to a variable specified on @cmd{LEAVE} (@pxref{LEAVE}) resets the variable's left state. Therefore, @code{LEAVE} should be specified following @cmd{IF}, not before. When @cmd{IF} is specified following @cmd{TEMPORARY} (@pxref{TEMPORARY}), the @cmd{LAG} function may not be used (@pxref{LAG}). @node RECODE @section RECODE @vindex RECODE The @cmd{RECODE} command is used to transform existing values into other, user specified values. The general form is: @display RECODE @var{src_vars} (@var{src_value} @var{src_value} @dots{} = @var{dest_value}) (@var{src_value} @var{src_value} @dots{} = @var{dest_value}) (@var{src_value} @var{src_value} @dots{} = @var{dest_value}) @dots{} [INTO @var{dest_vars}]. @end display Following the @cmd{RECODE} keyword itself comes @var{src_vars} which is a list of variables whose values are to be transformed. These variables may be string variables or they may be numeric. However the list must be homogeneous; you may not mix string variables and numeric variables in the same recoding. After the list of source variables, there should be one or more @dfn{mappings}. Each mapping is enclosed in parentheses, and contains the source values and a destination value separated by a single @samp{=}. The source values are used to specify the values in the dataset which need to change, and the destination value specifies the new value to which they should be changed. Each @var{src_value} may take one of the following forms: @table @asis @item @var{number} If the source variables are numeric then @var{src_value} may be a literal number. @item @var{string} If the source variables are string variables then @var{src_value} may be a literal string (like all strings, enclosed in single or double quotes). @item @var{num1} THRU @var{num2} This form is valid only when the source variables are numeric. It specifies all values in the range between @var{num1} and @var{num2}, including both endpoints of the range. By convention, @var{num1} should be less than @var{num2}. Open-ended ranges may be specified using @samp{LO} or @samp{LOWEST} for @var{num1} or @samp{HI} or @samp{HIGHEST} for @var{num2}. @item @samp{MISSING} The literal keyword @samp{MISSING} matches both system missing and user missing values. It is valid for both numeric and string variables. @item @samp{SYSMIS} The literal keyword @samp{SYSMIS} matches system missing values. It is valid for both numeric variables only. @item @samp{ELSE} The @samp{ELSE} keyword may be used to match any values which are not matched by any other @var{src_value} appearing in the command. If this keyword appears, it should be used in the last mapping of the command. @end table After the source variables comes an @samp{=} and then the @var{dest_value}. The @var{dest_value} may take any of the following forms: @table @asis @item @var{number} A literal numeric value to which the source values should be changed. This implies the destination variable must be numeric. @item @var{string} A literal string value (enclosed in quotation marks) to which the source values should be changed. This implies the destination variable must be a string variable. @item @samp{SYSMIS} The keyword @samp{SYSMIS} changes the value to the system missing value. This implies the destination variable must be numeric. @item @samp{COPY} The special keyword @samp{COPY} means that the source value should not be modified, but copied directly to the destination value. This is meaningful only if @samp{INTO @var{dest_vars}} is specified. @end table Mappings are considered from left to right. Therefore, if a value is matched by a @var{src_value} from more than one mapping, the first (leftmost) mapping which matches will be considered. Any subsequent matches will be ignored. The clause @samp{INTO @var{dest_vars}} is optional. The behaviour of the command is slightly different depending on whether it appears or not. If @samp{INTO @var{dest_vars}} does not appear, then values will be recoded ``in place''. This means that the recoded values are written back to the source variables from whence the original values came. In this case, the @var{dest_value} for every mapping must imply a value which has the same type as the @var{src_value}. For example, if the source value is a string value, it is not permissible for @var{dest_value} to be @samp{SYSMIS} or another forms which implies a numeric result. It is also not permissible for @var{dest_value} to be longer than the width of the source variable. The following example two numeric variables @var{x} and @var{y} are recoded in place. Zero is recoded to 99, the values 1 to 10 inclusive are unchanged, values 1000 and higher are recoded to the system-missing value and all other values are changed to 999: @example recode @var{x} @var{y} (0 = 99) (1 THRU 10 = COPY) (1000 THRU HIGHEST = SYSMIS) (ELSE = 999). @end example If @samp{INTO @var{dest_vars}} is given, then recoded values are written into the variables specified in @var{dest_vars}, which must therefore contain a list of valid variable names. The number of variables in @var{dest_vars} must be the same as the number of variables in @var{src_vars} and the respective order of the variables in @var{dest_vars} corresponds to the order of @var{src_vars}. That is to say, recoded values whose original value came from the @var{n}th variable in @var{src_vars} will be placed into the @var{n}th variable in @var{dest_vars}. The source variables will be unchanged. If any mapping implies a string as its destination value, then the respective destination variable must already exist, or have been declared using @cmd{STRING} or another transformation. Numeric variables however will be automatically created if they don't already exist. The following example deals with two source variables, @var{a} and @var{b} which contain string values. Hence there are two destination variables @var{v1} and @var{v2}. Any cases where @var{a} or @var{b} contain the values @samp{apple}, @samp{pear} or @samp{pomegranate} will result in @var{v1} or @var{v2} being filled with the string @samp{fruit} whilst cases with @samp{tomato}, @samp{lettuce} or @samp{carrot} will result in @samp{vegetable}. Any other values will produce the result @samp{unknown}: @example string @var{v1} (a20). string @var{v2} (a20). recode @var{a} @var{b} ("apple" "pear" "pomegranate" = "fruit") ("tomato" "lettuce" "carrot" = "vegetable") (ELSE = "unknown") into @var{v1} @var{v2}. @end example There is one very special mapping, not mentioned above. If the source variable is a string variable then a mapping may be specified as @samp{(CONVERT)}. This mapping, if it appears must be the last mapping given and the @samp{INTO @var{dest_vars}} clause must also be given and must not refer to a string variable. @samp{CONVERT} causes a number specified as a string to be converted to a numeric value. For example it will convert the string @samp{"3"} into the numeric value 3 (note that it will not convert @samp{three} into 3). If the string cannot be parsed as a number, then the system-missing value is assigned instead. In the following example, cases where the value of @var{x} (a string variable) is the empty string, are recoded to 999 and all others are converted to the numeric equivalent of the input value. The results are placed into the numeric variable @var{y}: @example recode @var{x} ("" = 999) (convert) into @var{y}. @end example It is possible to specify multiple recodings on a single command. Introduce additional recodings with a slash (@samp{/}) to separate them from the previous recodings: @example recode @var{a} (2 = 22) (else = 99) /@var{b} (1 = 3) into @var{z} . @end example @noindent Here we have two recodings. The first affects the source variable @var{a} and recodes in-place the value 2 into 22 and all other values to 99. The second recoding copies the values of @var{b} into the variable @var{z}, changing any instances of 1 into 3. @node SORT CASES @section SORT CASES @vindex SORT CASES @display SORT CASES BY @var{var_list}[(@{D|A@}] [ @var{var_list}[(@{D|A@}] ] ... @end display @cmd{SORT CASES} sorts the active dataset by the values of one or more variables. Specify @subcmd{BY} and a list of variables to sort by. By default, variables are sorted in ascending order. To override sort order, specify @subcmd{(D)} or @subcmd{(DOWN)} after a list of variables to get descending order, or @subcmd{(A)} or @subcmd{(UP)} for ascending order. These apply to all the listed variables up until the preceding @subcmd{(A)}, @subcmd{(D)}, @subcmd{(UP)} or @subcmd{(DOWN)}. The sort algorithms used by @cmd{SORT CASES} are stable. That is, records that have equal values of the sort variables will have the same relative order before and after sorting. As a special case, re-sorting an already sorted file will not affect the ordering of cases. @cmd{SORT CASES} is a procedure. It causes the data to be read. @cmd{SORT CASES} attempts to sort the entire active dataset in main memory. If workspace is exhausted, it falls back to a merge sort algorithm that involves creates numerous temporary files. @cmd{SORT CASES} may not be specified following @cmd{TEMPORARY}. pspp-1.4.1/doc/dev/0000755000175000017500000000000013725012647013445 5ustar00blpblp00000000000000pspp-1.4.1/doc/dev/syntax.texi0000644000175000017500000000104613546443556015677 0ustar00blpblp00000000000000@c PSPP - a program for statistical analysis. @c Copyright (C) 2019 Free Software Foundation, Inc. @c Permission is granted to copy, distribute and/or modify this document @c under the terms of the GNU Free Documentation License, Version 1.3 @c or any later version published by the Free Software Foundation; @c with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. @c A copy of the license is included in the section entitled "GNU @c Free Documentation License". @c @node Parsing Command Syntax @chapter Parsing Command Syntax pspp-1.4.1/doc/dev/q2c.texi0000644000175000017500000002343413546443556015043 0ustar00blpblp00000000000000@c PSPP - a program for statistical analysis. @c Copyright (C) 2019 Free Software Foundation, Inc. @c Permission is granted to copy, distribute and/or modify this document @c under the terms of the GNU Free Documentation License, Version 1.3 @c or any later version published by the Free Software Foundation; @c with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. @c A copy of the license is included in the section entitled "GNU @c Free Documentation License". @c @node q2c Input Format @appendix @code{q2c} Input Format PSPP statistical procedures have a bizarre and somewhat irregular syntax. Despite this, a parser generator has been written that adequately addresses many of the possibilities and tries to provide hooks for the exceptional cases. This parser generator is named @code{q2c}. @menu * Invoking q2c:: q2c command-line syntax. * q2c Input Structure:: High-level layout of the input file. * Grammar Rules:: Syntax of the grammar rules. @end menu @node Invoking q2c @section Invoking q2c @example q2c @var{input.q} @var{output.c} @end example @code{q2c} translates a @samp{.q} file into a @samp{.c} file. It takes exactly two command-line arguments, which are the input file name and output file name, respectively. @code{q2c} does not accept any command-line options. @node q2c Input Structure @section @code{q2c} Input Structure @code{q2c} input files are divided into two sections: the grammar rules and the supporting code. The @dfn{grammar rules}, which make up the first part of the input, are used to define the syntax of the statistical procedure to be parsed. The @dfn{supporting code}, following the grammar rules, are copied largely unchanged to the output file, except for certain escapes. The most important lines in the grammar rules are used for defining procedure syntax. These lines can be prefixed with a dollar sign (@samp{$}), which prevents Emacs' CC-mode from munging them. Besides this, a bang (@samp{!}) at the beginning of a line causes the line, minus the bang, to be written verbatim to the output file (useful for comments). As a third special case, any line that begins with the exact characters @code{/* *INDENT} is ignored and not written to the output. This allows @code{.q} files to be processed through @code{indent} without being munged. The syntax of the grammar rules themselves is given in the following sections. The supporting code is passed into the output file largely unchanged. However, the following escapes are supported. Each escape must appear on a line by itself. @table @code @item /* (header) */ Expands to a series of C @code{#include} directives which include the headers that are required for the parser generated by @code{q2c}. @item /* (decls @var{scope}) */ Expands to C variable and data type declarations for the variables and @code{enum}s input and output by the @code{q2c} parser. @var{scope} must be either @code{local} or @code{global}. @code{local} causes the declarations to be output as function locals. @code{global} causes them to be declared as @code{static} module variables; thus, @code{global} is a bit of a misnomer. @item /* (parser) */ Expands to the entire parser. Must be enclosed within a C function. @item /* (free) */ Expands to a set of calls to the @code{free} function for variables declared by the parser. Only needs to be invoked if subcommands of type @code{string} are used in the grammar rules. @end table @node Grammar Rules @section Grammar Rules The grammar rules describe the format of the syntax that the parser generated by @code{q2c} will understand. The way that the grammar rules are included in @code{q2c} input file are described above. The grammar rules are divided into tokens of the following types: @table @asis @item Identifier (@code{ID}) An identifier token is a sequence of letters, digits, and underscores (@samp{_}). Identifiers are @emph{not} case-sensitive. @item String (@code{STRING}) String tokens are initiated by a double-quote character (@samp{"}) and consist of all the characters between that double quote and the next double quote, which must be on the same line as the first. Within a string, a backslash can be used as a ``literal escape''. The only reasons to use a literal escape are to include a double quote or a backslash within a string. @item Special character Other characters, other than white space, constitute tokens in themselves. @end table The syntax of the grammar rules is as follows: @example grammar-rules ::= command-name opt-prefix : subcommands . command-name ::= ID ::= STRING opt-prefix ::= ::= ( ID ) subcommands ::= subcommand ::= subcommands ; subcommand @end example The syntax begins with an ID token that gives the name of the procedure to be parsed. For command names that contain multiple words, a STRING token may be used instead, e.g.@: @samp{"FILE HANDLE"}. Optionally, an ID in parentheses specifies a prefix used for all file-scope identifiers declared by the emitted code. The rest of the syntax consists of subcommands separated by semicolons (@samp{;}) and terminated with a full stop (@samp{.}). @example subcommand ::= default-opt arity-opt ID sbc-defn default-opt ::= ::= * arity-opt ::= ::= + ::= ^ sbc-defn ::= opt-prefix = specifiers ::= [ ID ] = array-sbc ::= opt-prefix = sbc-special-form @end example A subcommand that begins with an asterisk (@samp{*}) is the default subcommand. The keyword used for the default subcommand can be omitted in the PSPP syntax file. A plus sign (@samp{+}) indicates that a subcommand can appear more than once. A caret (@samp{^}) indicate that a subcommand must appear exactly once. A subcommand marked with neither character may appear once or not at all, but not more than once. The subcommand name appears after the leading option characters. There are three forms of subcommands. The first and most common form simply gives an equals sign (@samp{=}) and a list of specifiers, which can each be set to a single setting. The second form declares an array, which is a set of flags that can be individually turned on by the user. There are also several special forms that do not take a list of specifiers. Arrays require an additional @code{ID} argument. This is used as a prefix, prepended to the variable names constructed from the specifiers. The other forms also allow an optional prefix to be specified. @example array-sbc ::= alternatives ::= array-sbc , alternatives alternatives ::= ID ::= alternatives | ID @end example An array subcommand is a set of Boolean values that can independently be turned on by the user, listed separated by commas (@samp{,}). If an value has more than one name then these names are separated by pipes (@samp{|}). @example specifiers ::= specifier ::= specifiers , specifier specifier ::= opt-id : settings opt-id ::= ::= ID @end example Ordinary subcommands (other than arrays and special forms) require a list of specifiers. Each specifier has an optional name and a list of settings. If the name is given then a correspondingly named variable will be used to store the user's choice of setting. If no name is given then there is no way to tell which setting the user picked; in this case the settings should probably have values attached. @example settings ::= setting ::= settings / setting setting ::= setting-options ID setting-value setting-options ::= ::= * ::= ! ::= * ! @end example Individual settings are separated by forward slashes (@samp{/}). Each setting can be as little as an @code{ID} token, but options and values can optionally be included. The @samp{*} option means that, for this setting, the @code{ID} can be omitted. The @samp{!} option means that this option is the default for its specifier. @example setting-value ::= ::= ( setting-value-2 ) ::= setting-value-2 setting-value-2 ::= setting-value-options setting-value-type : ID setting-value-options ::= ::= * setting-value-type ::= N ::= D ::= S @end example Settings may have values. If the value must be enclosed in parentheses, then enclose the value declaration in parentheses. Declare the setting type as @samp{n}, @samp{d}, or @samp{s} for integer, floating-point, or string type, respectively. The given @code{ID} is used to construct a variable name. If option @samp{*} is given, then the value is optional; otherwise it must be specified whenever the corresponding setting is specified. @example sbc-special-form ::= VAR ::= VARLIST varlist-options ::= INTEGER opt-list ::= DOUBLE opt-list ::= PINT ::= STRING @r{(the literal word STRING)} ::= CUSTOM varlist-options ::= ::= ( STRING ) opt-list ::= ::= LIST @end example The special forms are of the following types: @table @code @item VAR A single variable name. @item VARLIST A list of variables. If given, the string can be used to provide @code{PV_@var{*}} options to the call to @code{parse_variables}. @item INTEGER A single integer value. @item INTEGER LIST A list of integers separated by spaces or commas. @item DOUBLE A single floating-point value. @item DOUBLE LIST A list of floating-point values. @item PINT A single positive integer value. @item STRING A string value. @item CUSTOM A custom function is used to parse this subcommand. The function must have prototype @code{int custom_@var{name} (void)}. It should return 0 on failure (when it has already issued an appropriate diagnostic), 1 on success, or 2 if it fails and the calling function should issue a syntax error on behalf of the custom handler. @end table @setfilename ignored pspp-1.4.1/doc/dev/i18n.texi0000644000175000017500000001442013571051220015105 0ustar00blpblp00000000000000@c PSPP - a program for statistical analysis. @c Copyright (C) 2019 Free Software Foundation, Inc. @c Permission is granted to copy, distribute and/or modify this document @c under the terms of the GNU Free Documentation License, Version 1.3 @c or any later version published by the Free Software Foundation; @c with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. @c A copy of the license is included in the section entitled "GNU @c Free Documentation License". @c @node Internationalisation @chapter Internationalisation Internationalisation in pspp is complicated. The most annoying aspect is that of character-encoding. This chapter attempts to describe the problems and current ways in which they are addressed. @section The working locales Pspp has three ``working'' locales: @itemize @item The locale of the user interface. @item The locale of the output. @item The locale of the data. Only the character encoding is relevant. @end itemize Each of these locales may, at different times take separate (or identical) values. So for example, a French statistician can use pspp to prepare a report in the English language, using a datafile which has been created by a Japanese researcher hence uses a Japanese character set. It's rarely, if ever, necessary to interrogate the system to find out the values of the 3 locales. However it's important to be aware of the source (destination) locale when reading (writing) string data. When transferring data between a source and a destination, the appropriate recoding must be performed. @subsection The user interface locale This is the locale which is visible to the person using pspp. Error messages and confidence indications are written in this locale. For example ``Cannot open file'' will be written in the user interface locale. This locale is set from the environment of the user who starts pspp@{ire@} or from the system locale if not set. @subsection The output locale This locale is the one that should be visible to the person reading a report generated by pspp. Non-data related strings (Eg: ``Page number'', ``Standard Deviation'' etc.) will appear in this locale. @subsection The data locale This locale is the one associated with the data being analysed with pspp. The only important aspect of this locale is the character encoding. @footnote{It might also be desirable for the LC_COLLATE category to be used for the purposes of sorting data.} The dictionary pertaining to the data contains a field denoting the encoding. Any string data stored in a @union{value} will be encoded in the dictionary's character set. @section System files @file{*.sav} files contain a field which is supposed to identify the encoding of the data they contain (@pxref{Machine Integer Info Record}). However, many files produced by early versions of spss set this to ``2'' (ASCII) regardless of the encoding of the data. Later versions contain an additional record (@pxref{Character Encoding Record}) describing the encoding. When a system file is read, the dictionary's encoding is set using information gleened from the system file. If the encoding cannot be determined or would be unreliable, then it remains unset. @section GUI The psppire graphic user interface is written using the Gtk+ api, for which all strings must be encoded in UTF8. All strings passed to the GTK+/GLib library functions (except for filenames) must be UTF-8 encoded otherwise errors will occur. Thus, for the purposes of the programming psppire, the user interface locale should be assumed to be UTF8, even if setlocale and/or nl_langinfo indicates otherwise. @subsection Filenames The GLib API has some special functions for dealing with filenames. Strings returned from functions like gtk_file_chooser_dialog_get_name are not, in general, encoded in UTF8, but in ``filename'' encoding. If that filename is passed to another GLib function which expects a filename, no conversion is necessary. If it's passed to a function for the purposes of displaying it (eg. in a window's title-bar) it must be converted to UTF8 --- there is a special function for this: g_filename_display_name or g_filename_basename. If however, a filename needs to be passed outside of GTK+/GLib (for example to fopen) it must be converted to the local system encoding. @section Existing locale handling functions The major aspect of locale handling which the programmer has to consider is that of character encoding. The following function is used to recode strings: @deftypefun char * recode_string (const char *@var{to}, const char *@var{from}, const char *@var{text}, int @var{len}); Converts the string @var{text}, which is encoded in @var{from} to a new string encoded in @var{to} encoding. If @var{len} is not -1, then it must be the number of bytes in @var{text}. It is the caller's responsibility to free the returned string when no longer required. @end deftypefun In order to minimise the number of conversions required, and to simplify design, PSPP attempts to store all internal strings in UTF8 encoding. Thus, when reading system and portable files (or any other data source), the following items are immediately converted to UTF8 encoding: @itemize @item Variable names @item Variable labels @item Value labels @end itemize Conversely, when writing system files, these are converted back to the encoding of that system file. String data stored in union values are left in their original encoding. These will be converted by the data_in/data_out functions. @section Quirks For historical reasons, not all locale handling follows posix conventions. This makes it difficult (impossible?) to elegantly handle the issues. For example, it would make sense for the gui's datasheet to display numbers formatted according to the LC_NUMERIC category of the data locale. Instead however there is the @func{data_out} function (@pxref{Obtaining Properties of Format Types}) which uses the @func{settings_get_decimal_char} function instead of the decimal separator of the locale. Similarly, formatting of monetary values is displayed in a pspp/spss specific fashion instead of using the LC_MONETARY category. @c LocalWords: pspp itemize Eg LC Spss cmd sav pxref spss GUI psppire Gtk api @c LocalWords: UTF gtk setlocale nl langinfo deftypefun enum conv var const @c LocalWords: int len gui struct val utf GtkWidget posix gui's datasheet @c LocalWords: func pspp-1.4.1/doc/dev/system-file-format.texi0000644000175000017500000015423313571051220020064 0ustar00blpblp00000000000000@c PSPP - a program for statistical analysis. @c Copyright (C) 2019 Free Software Foundation, Inc. @c Permission is granted to copy, distribute and/or modify this document @c under the terms of the GNU Free Documentation License, Version 1.3 @c or any later version published by the Free Software Foundation; @c with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. @c A copy of the license is included in the section entitled "GNU @c Free Documentation License". @c @node System File Format @appendix System File Format A system file encapsulates a set of cases and dictionary information that describes how they may be interpreted. This chapter describes the format of a system file. System files use four data types: 8-bit characters, 32-bit integers, 64-bit integers, and 64-bit floating points, called here @code{char}, @code{int32}, @code{int64}, and @code{flt64}, respectively. Data is not necessarily aligned on a word or double-word boundary: the long variable name record (@pxref{Long Variable Names Record}) and very long string records (@pxref{Very Long String Record}) have arbitrary byte length and can therefore cause all data coming after them in the file to be misaligned. Integer data in system files may be big-endian or little-endian. A reader may detect the endianness of a system file by examining @code{layout_code} in the file header record (@pxref{layout_code,,@code{layout_code}}). Floating-point data in system files may nominally be in IEEE 754, IBM, or VAX formats. A reader may detect the floating-point format in use by examining @code{bias} in the file header record (@pxref{bias,,@code{bias}}). PSPP detects big-endian and little-endian integer formats in system files and translates as necessary. PSPP also detects the floating-point format in use, as well as the endianness of IEEE 754 floating-point numbers, and translates as needed. However, only IEEE 754 numbers with the same endianness as integer data in the same file have actually been observed in system files, and it is likely that other formats are obsolete or were never used. System files use a few floating point values for special purposes: @table @asis @item SYSMIS The system-missing value is represented by the largest possible negative number in the floating point format (@code{-DBL_MAX}). @item HIGHEST HIGHEST is used as the high end of a missing value range with an unbounded maximum. It is represented by the largest possible positive number (@code{DBL_MAX}). @item LOWEST LOWEST is used as the low end of a missing value range with an unbounded minimum. It was originally represented by the second-largest negative number (in IEEE 754 format, @code{0xffeffffffffffffe}). System files written by SPSS 21 and later instead use the largest negative number (@code{-DBL_MAX}), the same value as SYSMIS. This does not lead to ambiguity because LOWEST appears in system files only in missing value ranges, which never contain SYSMIS. @end table System files may use most character encodings based on an 8-bit unit. UTF-16 and UTF-32, based on wider units, appear to be unacceptable. @code{rec_type} in the file header record is sufficient to distinguish between ASCII and EBCDIC based encodings. The best way to determine the specific encoding in use is to consult the character encoding record (@pxref{Character Encoding Record}), if present, and failing that the @code{character_code} in the machine integer info record (@pxref{Machine Integer Info Record}). The same encoding should be used for the dictionary and the data in the file, although it is possible to artificially synthesize files that use different encodings (@pxref{Character Encoding Record}). @menu * System File Record Structure:: * File Header Record:: * Variable Record:: * Value Labels Records:: * Document Record:: * Machine Integer Info Record:: * Machine Floating-Point Info Record:: * Multiple Response Sets Records:: * Extra Product Info Record:: * Variable Display Parameter Record:: * Long Variable Names Record:: * Very Long String Record:: * Character Encoding Record:: * Long String Value Labels Record:: * Long String Missing Values Record:: * Data File and Variable Attributes Records:: * Extended Number of Cases Record:: * Other Informational Records:: * Dictionary Termination Record:: * Data Record:: @end menu @node System File Record Structure @section System File Record Structure System files are divided into records with the following format: @example int32 type; char data[]; @end example This header does not identify the length of the @code{data} or any information about what it contains, so the system file reader must understand the format of @code{data} based on @code{type}. However, records with type 7, called @dfn{extension records}, have a stricter format: @example int32 type; int32 subtype; int32 size; int32 count; char data[size * count]; @end example @table @code @item int32 rec_type; Record type. Always set to 7. @item int32 subtype; Record subtype. This value identifies a particular kind of extension record. @item int32 size; The size of each piece of data that follows the header, in bytes. Known extension records use 1, 4, or 8, for @code{char}, @code{int32}, and @code{flt64} format data, respectively. @item int32 count; The number of pieces of data that follow the header. @item char data[size * count]; Data, whose format and interpretation depend on the subtype. @end table An extension record contains exactly @code{size * count} bytes of data, which allows a reader that does not understand an extension record to skip it. Extension records provide only nonessential information, so this allows for files written by newer software to preserve backward compatibility with older or less capable readers. Records in a system file must appear in the following order: @itemize @bullet @item File header record. @item Variable records. @item All pairs of value labels records and value label variables records, if present. @item Document record, if present. @item Extension (type 7) records, in ascending numerical order of their subtypes. System files written by SPSS include at most one of each kind of extension record. This is generally true of system files written by other software as well, with known exceptions noted below in the individual sections about each type of record. @item Dictionary termination record. @item Data record. @end itemize We advise authors of programs that read system files to tolerate format variations. Various kinds of misformatting and corruption have been observed in system files written by SPSS and other software alike. In particular, because extension records provide nonessential information, it is generally better to ignore an extension record entirely than to refuse to read a system file. The following sections describe the known kinds of records. @node File Header Record @section File Header Record A system file begins with the file header, with the following format: @example char rec_type[4]; char prod_name[60]; int32 layout_code; int32 nominal_case_size; int32 compression; int32 weight_index; int32 ncases; flt64 bias; char creation_date[9]; char creation_time[8]; char file_label[64]; char padding[3]; @end example @table @code @item char rec_type[4]; Record type code, either @samp{$FL2} for system files with uncompressed data or data compressed with simple bytecode compression, or @samp{$FL3} for system files with ZLIB compressed data. This is truly a character field that uses the character encoding as other strings. Thus, in a file with an ASCII-based character encoding this field contains @code{24 46 4c 32} or @code{24 46 4c 33}, and in a file with an EBCDIC-based encoding this field contains @code{5b c6 d3 f2}. (No EBCDIC-based ZLIB-compressed files have been observed.) @item char prod_name[60]; Product identification string. This always begins with the characters @samp{@@(#) SPSS DATA FILE}. PSPP uses the remaining characters to give its version and the operating system name; for example, @samp{GNU pspp 0.1.4 - sparc-sun-solaris2.5.2}. The string is truncated if it would be longer than 60 characters; otherwise it is padded on the right with spaces. The product name field allow readers to behave differently based on quirks in the way that particular software writes system files. @xref{Value Labels Records}, for the detail of the quirk that the PSPP system file reader tolerates in files written by ReadStat, which has @code{https://github.com/WizardMac/ReadStat} in @code{prod_name}. @anchor{layout_code} @item int32 layout_code; Normally set to 2, although a few system files have been spotted in the wild with a value of 3 here. PSPP use this value to determine the file's integer endianness (@pxref{System File Format}). @item int32 nominal_case_size; Number of data elements per case. This is the number of variables, except that long string variables add extra data elements (one for every 8 characters after the first 8). However, string variables do not contribute to this value beyond the first 255 bytes. Further, some software always writes -1 or 0 in this field. In general, it is unsafe for systems reading system files to rely upon this value. @item int32 compression; Set to 0 if the data in the file is not compressed, 1 if the data is compressed with simple bytecode compression, 2 if the data is ZLIB compressed. This field has value 2 if and only if @code{rec_type} is @samp{$FL3}. @item int32 weight_index; If one of the variables in the data set is used as a weighting variable, set to the dictionary index of that variable, plus 1 (@pxref{Dictionary Index}). Otherwise, set to 0. @item int32 ncases; Set to the number of cases in the file if it is known, or -1 otherwise. In the general case it is not possible to determine the number of cases that will be output to a system file at the time that the header is written. The way that this is dealt with is by writing the entire system file, including the header, then seeking back to the beginning of the file and writing just the @code{ncases} field. For files in which this is not valid, the seek operation fails. In this case, @code{ncases} remains -1. @anchor{bias} @item flt64 bias; Compression bias, ordinarily set to 100. Only integers between @code{1 - bias} and @code{251 - bias} can be compressed. By assuming that its value is 100, PSPP uses @code{bias} to determine the file's floating-point format and endianness (@pxref{System File Format}). If the compression bias is not 100, PSPP cannot auto-detect the floating-point format and assumes that it is IEEE 754 format with the same endianness as the system file's integers, which is correct for all known system files. @item char creation_date[9]; Date of creation of the system file, in @samp{dd mmm yy} format, with the month as standard English abbreviations, using an initial capital letter and following with lowercase. If the date is not available then this field is arbitrarily set to @samp{01 Jan 70}. @item char creation_time[8]; Time of creation of the system file, in @samp{hh:mm:ss} format and using 24-hour time. If the time is not available then this field is arbitrarily set to @samp{00:00:00}. @item char file_label[64]; File label declared by the user, if any (@pxref{FILE LABEL,,,pspp, PSPP Users Guide}). Padded on the right with spaces. A product that identifies itself as @code{VOXCO INTERVIEWER 4.3} uses CR-only line ends in this field, rather than the more usual LF-only or CR LF line ends. @item char padding[3]; Ignored padding bytes to make the structure a multiple of 32 bits in length. Set to zeros. @end table @node Variable Record @section Variable Record There must be one variable record for each numeric variable and each string variable with width 8 bytes or less. String variables wider than 8 bytes have one variable record for each 8 bytes, rounding up. The first variable record for a long string specifies the variable's correct dictionary information. Subsequent variable records for a long string are filled with dummy information: a type of -1, no variable label or missing values, print and write formats that are ignored, and an empty string as name. A few system files have been encountered that include a variable label on dummy variable records, so readers should take care to parse dummy variable records in the same way as other variable records. @anchor{Dictionary Index} The @dfn{dictionary index} of a variable is a 1-based offset in the set of variable records, including dummy variable records for long string variables. The first variable record has a dictionary index of 1, the second has a dictionary index of 2, and so on. The system file format does not directly support string variables wider than 255 bytes. Such very long string variables are represented by a number of narrower string variables. @xref{Very Long String Record}, for details. A system file should contain at least one variable and thus at least one variable record, but system files have been observed in the wild without any variables (thus, no data either). @example int32 rec_type; int32 type; int32 has_var_label; int32 n_missing_values; int32 print; int32 write; char name[8]; /* @r{Present only if @code{has_var_label} is 1.} */ int32 label_len; char label[]; /* @r{Present only if @code{n_missing_values} is nonzero}. */ flt64 missing_values[]; @end example @table @code @item int32 rec_type; Record type code. Always set to 2. @item int32 type; Variable type code. Set to 0 for a numeric variable. For a short string variable or the first part of a long string variable, this is set to the width of the string. For the second and subsequent parts of a long string variable, set to -1, and the remaining fields in the structure are ignored. @item int32 has_var_label; If this variable has a variable label, set to 1; otherwise, set to 0. @item int32 n_missing_values; If the variable has no missing values, set to 0. If the variable has one, two, or three discrete missing values, set to 1, 2, or 3, respectively. If the variable has a range for missing variables, set to -2; if the variable has a range for missing variables plus a single discrete value, set to -3. A long string variable always has the value 0 here. A separate record indicates missing values for long string variables (@pxref{Long String Missing Values Record}). @item int32 print; Print format for this variable. See below. @item int32 write; Write format for this variable. See below. @item char name[8]; Variable name. The variable name must begin with a capital letter or the at-sign (@samp{@@}). Subsequent characters may also be digits, octothorpes (@samp{#}), dollar signs (@samp{$}), underscores (@samp{_}), or full stops (@samp{.}). The variable name is padded on the right with spaces. The @samp{name} fields should be unique within a system file. System files written by SPSS that contain very long string variables with similar names sometimes contain duplicate names that are later eliminated by resolving the very long string names (@pxref{Very Long String Record}). PSPP handles duplicates by assigning them new, unique names. @item int32 label_len; This field is present only if @code{has_var_label} is set to 1. It is set to the length, in characters, of the variable label. The documented maximum length varies from 120 to 255 based on SPSS version, but some files have been seen with longer labels. PSPP accepts labels of any length. @item char label[]; This field is present only if @code{has_var_label} is set to 1. It has length @code{label_len}, rounded up to the nearest multiple of 32 bits. The first @code{label_len} characters are the variable's variable label. @item flt64 missing_values[]; This field is present only if @code{n_missing_values} is nonzero. It has the same number of 8-byte elements as the absolute value of @code{n_missing_values}. Each element is interpreted as a number for numeric variables (with HIGHEST and LOWEST indicated as described in the chapter introduction). For string variables of width less than 8 bytes, elements are right-padded with spaces; for string variables wider than 8 bytes, only the first 8 bytes of each missing value are specified, with the remainder implicitly all spaces. For discrete missing values, each element represents one missing value. When a range is present, the first element denotes the minimum value in the range, and the second element denotes the maximum value in the range. When a range plus a value are present, the third element denotes the additional discrete missing value. @end table @anchor{System File Output Formats} The @code{print} and @code{write} members of sysfile_variable are output formats coded into @code{int32} types. The least-significant byte of the @code{int32} represents the number of decimal places, and the next two bytes in order of increasing significance represent field width and format type, respectively. The most-significant byte is not used and should be set to zero. Format types are defined as follows: @quotation @multitable {Value} {@code{DATETIME}} @headitem Value @tab Meaning @item 0 @tab Not used. @item 1 @tab @code{A} @item 2 @tab @code{AHEX} @item 3 @tab @code{COMMA} @item 4 @tab @code{DOLLAR} @item 5 @tab @code{F} @item 6 @tab @code{IB} @item 7 @tab @code{PIBHEX} @item 8 @tab @code{P} @item 9 @tab @code{PIB} @item 10 @tab @code{PK} @item 11 @tab @code{RB} @item 12 @tab @code{RBHEX} @item 13 @tab Not used. @item 14 @tab Not used. @item 15 @tab @code{Z} @item 16 @tab @code{N} @item 17 @tab @code{E} @item 18 @tab Not used. @item 19 @tab Not used. @item 20 @tab @code{DATE} @item 21 @tab @code{TIME} @item 22 @tab @code{DATETIME} @item 23 @tab @code{ADATE} @item 24 @tab @code{JDATE} @item 25 @tab @code{DTIME} @item 26 @tab @code{WKDAY} @item 27 @tab @code{MONTH} @item 28 @tab @code{MOYR} @item 29 @tab @code{QYR} @item 30 @tab @code{WKYR} @item 31 @tab @code{PCT} @item 32 @tab @code{DOT} @item 33 @tab @code{CCA} @item 34 @tab @code{CCB} @item 35 @tab @code{CCC} @item 36 @tab @code{CCD} @item 37 @tab @code{CCE} @item 38 @tab @code{EDATE} @item 39 @tab @code{SDATE} @item 40 @tab @code{MTIME} @item 41 @tab @code{YMDHMS} @end multitable @end quotation A few system files have been observed in the wild with invalid @code{write} fields, in particular with value 0. Readers should probably treat invalid @code{print} or @code{write} fields as some default format. @node Value Labels Records @section Value Labels Records The value label records documented in this section are used for numeric and short string variables only. Long string variables may have value labels, but their value labels are recorded using a different record type (@pxref{Long String Value Labels Record}). ReadStat (@pxref{File Header Record}) writes value labels that label a single value more than once. In more detail, it emits value labels whose values are longer than string variables' widths, that are identical in the actual width of the variable, e.g.@: labels for values @code{ABC123} and @code{ABC456} for a string variable with width 3. For files written by this software, PSPP ignores such labels. The value label record has the following format: @example int32 rec_type; int32 label_count; /* @r{Repeated @code{label_cnt} times}. */ char value[8]; char label_len; char label[]; @end example @table @code @item int32 rec_type; Record type. Always set to 3. @item int32 label_count; Number of value labels present in this record. @end table The remaining fields are repeated @code{count} times. Each repetition specifies one value label. @table @code @item char value[8]; A numeric value or a short string value padded as necessary to 8 bytes in length. Its type and width cannot be determined until the following value label variables record (see below) is read. @item char label_len; The label's length, in bytes. The documented maximum length varies from 60 to 120 based on SPSS version. PSPP supports value labels up to 255 bytes long. @item char label[]; @code{label_len} bytes of the actual label, followed by up to 7 bytes of padding to bring @code{label} and @code{label_len} together to a multiple of 8 bytes in length. @end table The value label record is always immediately followed by a value label variables record with the following format: @example int32 rec_type; int32 var_count; int32 vars[]; @end example @table @code @item int32 rec_type; Record type. Always set to 4. @item int32 var_count; Number of variables that the associated value labels from the value label record are to be applied. @item int32 vars[]; A list of 1-based dictionary indexes of variables to which to apply the value labels (@pxref{Dictionary Index}). There are @code{var_count} elements. String variables wider than 8 bytes may not be specified in this list. @end table @node Document Record @section Document Record The document record, if present, has the following format: @example int32 rec_type; int32 n_lines; char lines[][80]; @end example @table @code @item int32 rec_type; Record type. Always set to 6. @item int32 n_lines; Number of lines of documents present. This should be greater than zero, but ReadStats writes system files with zero @code{n_lines}. @item char lines[][80]; Document lines. The number of elements is defined by @code{n_lines}. Lines shorter than 80 characters are padded on the right with spaces. @end table @node Machine Integer Info Record @section Machine Integer Info Record The integer info record, if present, has the following format: @example /* @r{Header.} */ int32 rec_type; int32 subtype; int32 size; int32 count; /* @r{Data.} */ int32 version_major; int32 version_minor; int32 version_revision; int32 machine_code; int32 floating_point_rep; int32 compression_code; int32 endianness; int32 character_code; @end example @table @code @item int32 rec_type; Record type. Always set to 7. @item int32 subtype; Record subtype. Always set to 3. @item int32 size; Size of each piece of data in the data part, in bytes. Always set to 4. @item int32 count; Number of pieces of data in the data part. Always set to 8. @item int32 version_major; PSPP major version number. In version @var{x}.@var{y}.@var{z}, this is @var{x}. @item int32 version_minor; PSPP minor version number. In version @var{x}.@var{y}.@var{z}, this is @var{y}. @item int32 version_revision; PSPP version revision number. In version @var{x}.@var{y}.@var{z}, this is @var{z}. @item int32 machine_code; Machine code. PSPP always set this field to value to -1, but other values may appear. @item int32 floating_point_rep; Floating point representation code. For IEEE 754 systems this is 1. IBM 370 sets this to 2, and DEC VAX E to 3. @item int32 compression_code; Compression code. Always set to 1, regardless of whether or how the file is compressed. @item int32 endianness; Machine endianness. 1 indicates big-endian, 2 indicates little-endian. @item int32 character_code; @anchor{character-code} Character code. The following values have been actually observed in system files: @table @asis @item 1 EBCDIC. @item 2 7-bit ASCII. @item 1250 The @code{windows-1250} code page for Central European and Eastern European languages. @item 1252 The @code{windows-1252} code page for Western European languages. @item 28591 ISO 8859-1. @item 65001 UTF-8. @end table The following additional values are known to be defined: @table @asis @item 3 8-bit ``ASCII''. @item 4 DEC Kanji. @end table Other Windows code page numbers are known to be generally valid. Old versions of SPSS for Unix and Windows always wrote value 2 in this field, regardless of the encoding in use. Newer versions also write the character encoding as a string (see @ref{Character Encoding Record}). @end table @node Machine Floating-Point Info Record @section Machine Floating-Point Info Record The floating-point info record, if present, has the following format: @example /* @r{Header.} */ int32 rec_type; int32 subtype; int32 size; int32 count; /* @r{Data.} */ flt64 sysmis; flt64 highest; flt64 lowest; @end example @table @code @item int32 rec_type; Record type. Always set to 7. @item int32 subtype; Record subtype. Always set to 4. @item int32 size; Size of each piece of data in the data part, in bytes. Always set to 8. @item int32 count; Number of pieces of data in the data part. Always set to 3. @item flt64 sysmis; @itemx flt64 highest; @itemx flt64 lowest; The system missing value, the value used for HIGHEST in missing values, and the value used for LOWEST in missing values, respectively. @xref{System File Format}, for more information. The SPSSWriter library in PHP, which identifies itself as @code{FOM SPSS 1.0.0} in the file header record @code{prod_name} field, writes unexpected values to these fields, but it uses the same values consistently throughout the rest of the file. @end table @node Multiple Response Sets Records @section Multiple Response Sets Records The system file format has two different types of records that represent multiple response sets (@pxref{MRSETS,,,pspp, PSPP Users Guide}). The first type of record describes multiple response sets that can be understood by SPSS before version 14. The second type of record, with a closely related format, is used for multiple dichotomy sets that use the CATEGORYLABELS=COUNTEDVALUES feature added in version 14. @example /* @r{Header.} */ int32 rec_type; int32 subtype; int32 size; int32 count; /* @r{Exactly @code{count} bytes of data.} */ char mrsets[]; @end example @table @code @item int32 rec_type; Record type. Always set to 7. @item int32 subtype; Record subtype. Set to 7 for records that describe multiple response sets understood by SPSS before version 14, or to 19 for records that describe dichotomy sets that use the CATEGORYLABELS=COUNTEDVALUES feature added in version 14. @item int32 size; The size of each element in the @code{mrsets} member. Always set to 1. @item int32 count; The total number of bytes in @code{mrsets}. @item char mrsets[]; Zero or more line feeds (byte 0x0a), followed by a series of multiple response sets, each of which consists of the following: @itemize @bullet @item The set's name (an identifier that begins with @samp{$}), in mixed upper and lower case. @item An equals sign (@samp{=}). @item @samp{C} for a multiple category set, @samp{D} for a multiple dichotomy set with CATEGORYLABELS=VARLABELS, or @samp{E} for a multiple dichotomy set with CATEGORYLABELS=COUNTEDVALUES. @item For a multiple dichotomy set with CATEGORYLABELS=COUNTEDVALUES, a space, followed by a number expressed as decimal digits, followed by a space. If LABELSOURCE=VARLABEL was specified on MRSETS, then the number is 11; otherwise it is 1.@footnote{This part of the format may not be fully understood, because only a single example of each possibility has been examined.} @item For either kind of multiple dichotomy set, the counted value, as a positive integer count specified as decimal digits, followed by a space, followed by as many string bytes as specified in the count. If the set contains numeric variables, the string consists of the counted integer value expressed as decimal digits. If the set contains string variables, the string contains the counted string value. Either way, the string may be padded on the right with spaces (older versions of SPSS seem to always pad to a width of 8 bytes; newer versions don't). @item A space. @item The multiple response set's label, using the same format as for the counted value for multiple dichotomy sets. A string of length 0 means that the set does not have a label. A string of length 0 is also written if LABELSOURCE=VARLABEL was specified. @item A space. @item The short names of the variables in the set, converted to lowercase, each separated from the previous by a single space. Even though a multiple response set must have at least two variables, some system files contain multiple response sets with no variables or one variable. The source and meaning of these multiple response sets is unknown. (Perhaps they arise from creating a multiple response set then deleting all the variables that it contains?) @item One line feed (byte 0x0a). Sometimes multiple, even hundreds, of line feeds are present. @end itemize @end table Example: Given appropriate variable definitions, consider the following MRSETS command: @example MRSETS /MCGROUP NAME=$a LABEL='my mcgroup' VARIABLES=a b c /MDGROUP NAME=$b VARIABLES=g e f d VALUE=55 /MDGROUP NAME=$c LABEL='mdgroup #2' VARIABLES=h i j VALUE='Yes' /MDGROUP NAME=$d LABEL='third mdgroup' CATEGORYLABELS=COUNTEDVALUES VARIABLES=k l m VALUE=34 /MDGROUP NAME=$e CATEGORYLABELS=COUNTEDVALUES LABELSOURCE=VARLABEL VARIABLES=n o p VALUE='choice'. @end example The above would generate the following multiple response set record of subtype 7: @example $a=C 10 my mcgroup a b c $b=D2 55 0 g e f d $c=D3 Yes 10 mdgroup #2 h i j @end example It would also generate the following multiple response set record with subtype 19: @example $d=E 1 2 34 13 third mdgroup k l m $e=E 11 6 choice 0 n o p @end example @node Extra Product Info Record @section Extra Product Info Record This optional record appears to contain a text string that describes the program that wrote the file and the source of the data. (This is redundant with the file label and product info found in the file header record.) @example /* @r{Header.} */ int32 rec_type; int32 subtype; int32 size; int32 count; /* @r{Exactly @code{count} bytes of data.} */ char info[]; @end example @table @code @item int32 rec_type; Record type. Always set to 7. @item int32 subtype; Record subtype. Always set to 10. @item int32 size; The size of each element in the @code{info} member. Always set to 1. @item int32 count; The total number of bytes in @code{info}. @item char info[]; A text string. A product that identifies itself as @code{VOXCO INTERVIEWER 4.3} uses CR-only line ends in this field, rather than the more usual LF-only or CR LF line ends. @end table @node Variable Display Parameter Record @section Variable Display Parameter Record The variable display parameter record, if present, has the following format: @example /* @r{Header.} */ int32 rec_type; int32 subtype; int32 size; int32 count; /* @r{Repeated @code{count} times}. */ int32 measure; int32 width; /* @r{Not always present.} */ int32 alignment; @end example @table @code @item int32 rec_type; Record type. Always set to 7. @item int32 subtype; Record subtype. Always set to 11. @item int32 size; The size of @code{int32}. Always set to 4. @item int32 count; The number of sets of variable display parameters (ordinarily the number of variables in the dictionary), times 2 or 3. @end table The remaining members are repeated @code{count} times, in the same order as the variable records. No element corresponds to variable records that continue long string variables. The meanings of these members are as follows: @table @code @item int32 measure; The measurement type of the variable: @table @asis @item 1 Nominal Scale @item 2 Ordinal Scale @item 3 Continuous Scale @end table SPSS sometimes writes a @code{measure} of 0. PSPP interprets this as nominal scale. @item int32 width; The width of the display column for the variable in characters. This field is present if @var{count} is 3 times the number of variables in the dictionary. It is omitted if @var{count} is 2 times the number of variables. @item int32 alignment; The alignment of the variable for display purposes: @table @asis @item 0 Left aligned @item 1 Right aligned @item 2 Centre aligned @end table @end table @node Long Variable Names Record @section Long Variable Names Record If present, the long variable names record has the following format: @example /* @r{Header.} */ int32 rec_type; int32 subtype; int32 size; int32 count; /* @r{Exactly @code{count} bytes of data.} */ char var_name_pairs[]; @end example @table @code @item int32 rec_type; Record type. Always set to 7. @item int32 subtype; Record subtype. Always set to 13. @item int32 size; The size of each element in the @code{var_name_pairs} member. Always set to 1. @item int32 count; The total number of bytes in @code{var_name_pairs}. @item char var_name_pairs[]; A list of @var{key}--@var{value} tuples, where @var{key} is the name of a variable, and @var{value} is its long variable name. The @var{key} field is at most 8 bytes long and must match the name of a variable which appears in the variable record (@pxref{Variable Record}). The @var{value} field is at most 64 bytes long. The @var{key} and @var{value} fields are separated by a @samp{=} byte. Each tuple is separated by a byte whose value is 09. There is no trailing separator following the last tuple. The total length is @code{count} bytes. @end table @node Very Long String Record @section Very Long String Record Old versions of SPSS limited string variables to a width of 255 bytes. For backward compatibility with these older versions, the system file format represents a string longer than 255 bytes, called a @dfn{very long string}, as a collection of strings no longer than 255 bytes each. The strings concatenated to make a very long string are called its @dfn{segments}; for consistency, variables other than very long strings are considered to have a single segment. A very long string with a width of @var{w} has @var{n} = (@var{w} + 251) / 252 segments, that is, one segment for every 252 bytes of width, rounding up. It would be logical, then, for each of the segments except the last to have a width of 252 and the last segment to have the remainder, but this is not the case. In fact, each segment except the last has a width of 255 bytes. The last segment has width @var{w} - (@var{n} - 1) * 252; some versions of SPSS make it slightly wider, but not wide enough to make the last segment require another 8 bytes of data. Data is packed tightly into segments of a very long string, 255 bytes per segment. Because 255 bytes of segment data are allocated for every 252 bytes of the very long string's width (approximately), some unused space is left over at the end of the allocated segments. Data in unused space is ignored. Example: Consider a very long string of width 20,000. Such a very long string has 20,000 / 252 = 80 (rounding up) segments. The first 79 segments have width 255; the last segment has width 20,000 - 79 * 252 = 92 or slightly wider (up to 96 bytes, the next multiple of 8). The very long string's data is actually stored in the 19,890 bytes in the first 78 segments, plus the first 110 bytes of the 79th segment (19,890 + 110 = 20,000). The remaining 145 bytes of the 79th segment and all 92 bytes of the 80th segment are unused. The very long string record explains how to stitch together segments to obtain very long string data. For each of the very long string variables in the dictionary, it specifies the name of its first segment's variable and the very long string variable's actual width. The remaining segments immediately follow the named variable in the system file's dictionary. The very long string record, which is present only if the system file contains very long string variables, has the following format: @example /* @r{Header.} */ int32 rec_type; int32 subtype; int32 size; int32 count; /* @r{Exactly @code{count} bytes of data.} */ char string_lengths[]; @end example @table @code @item int32 rec_type; Record type. Always set to 7. @item int32 subtype; Record subtype. Always set to 14. @item int32 size; The size of each element in the @code{string_lengths} member. Always set to 1. @item int32 count; The total number of bytes in @code{string_lengths}. @item char string_lengths[]; A list of @var{key}--@var{value} tuples, where @var{key} is the name of a variable, and @var{value} is its length. The @var{key} field is at most 8 bytes long and must match the name of a variable which appears in the variable record (@pxref{Variable Record}). The @var{value} field is exactly 5 bytes long. It is a zero-padded, ASCII-encoded string that is the length of the variable. The @var{key} and @var{value} fields are separated by a @samp{=} byte. Tuples are delimited by a two-byte sequence @{00, 09@}. After the last tuple, there may be a single byte 00, or @{00, 09@}. The total length is @code{count} bytes. @end table @node Character Encoding Record @section Character Encoding Record This record, if present, indicates the character encoding for string data, long variable names, variable labels, value labels and other strings in the file. @example /* @r{Header.} */ int32 rec_type; int32 subtype; int32 size; int32 count; /* @r{Exactly @code{count} bytes of data.} */ char encoding[]; @end example @table @code @item int32 rec_type; Record type. Always set to 7. @item int32 subtype; Record subtype. Always set to 20. @item int32 size; The size of each element in the @code{encoding} member. Always set to 1. @item int32 count; The total number of bytes in @code{encoding}. @item char encoding[]; The name of the character encoding. Normally this will be an official IANA character set name or alias. See @url{http://www.iana.org/assignments/character-sets}. Character set names are not case-sensitive, but SPSS appears to write them in all-uppercase. @end table This record is not present in files generated by older software. See also the @code{character_code} field in the machine integer info record (@pxref{character-code}). When the character encoding record and the machine integer info record are both present, all system files observed in practice indicate the same character encoding, e.g.@: 1252 as @code{character_code} and @code{windows-1252} as @code{encoding}, 65001 and @code{UTF-8}, etc. If, for testing purposes, a file is crafted with different @code{character_code} and @code{encoding}, it seems that @code{character_code} controls the encoding for all strings in the system file before the dictionary termination record, including strings in data (e.g.@: string missing values), and @code{encoding} controls the encoding for strings following the dictionary termination record. @node Long String Value Labels Record @section Long String Value Labels Record This record, if present, specifies value labels for long string variables. @example /* @r{Header.} */ int32 rec_type; int32 subtype; int32 size; int32 count; /* @r{Repeated up to exactly @code{count} bytes.} */ int32 var_name_len; char var_name[]; int32 var_width; int32 n_labels; long_string_label labels[]; @end example @table @code @item int32 rec_type; Record type. Always set to 7. @item int32 subtype; Record subtype. Always set to 21. @item int32 size; Always set to 1. @item int32 count; The number of bytes following the header until the next header. @item int32 var_name_len; @itemx char var_name[]; The number of bytes in the name of the variable that has long string value labels, plus the variable name itself, which consists of exactly @code{var_name_len} bytes. The variable name is not padded to any particular boundary, nor is it null-terminated. @item int32 var_width; The width of the variable, in bytes, which will be between 9 and 32767. @item int32 n_labels; @itemx long_string_label labels[]; The long string labels themselves. The @code{labels} array contains exactly @code{n_labels} elements, each of which has the following substructure: @example int32 value_len; char value[]; int32 label_len; char label[]; @end example @table @code @item int32 value_len; @itemx char value[]; The string value being labeled. @code{value_len} is the number of bytes in @code{value}; it is equal to @code{var_width}. The @code{value} array is not padded or null-terminated. @item int32 label_len; @itemx char label[]; The label for the string value. @code{label_len}, which must be between 0 and 120, is the number of bytes in @code{label}. The @code{label} array is not padded or null-terminated. @end table @end table @node Long String Missing Values Record @section Long String Missing Values Record This record, if present, specifies missing values for long string variables. @example /* @r{Header.} */ int32 rec_type; int32 subtype; int32 size; int32 count; /* @r{Repeated up to exactly @code{count} bytes.} */ int32 var_name_len; char var_name[]; char n_missing_values; long_string_missing_value values[]; @end example @table @code @item int32 rec_type; Record type. Always set to 7. @item int32 subtype; Record subtype. Always set to 22. @item int32 size; Always set to 1. @item int32 count; The number of bytes following the header until the next header. @item int32 var_name_len; @itemx char var_name[]; The number of bytes in the name of the long string variable that has missing values, plus the variable name itself, which consists of exactly @code{var_name_len} bytes. The variable name is not padded to any particular boundary, nor is it null-terminated. @item char n_missing_values; The number of missing values, either 1, 2, or 3. (This is, unusually, a single byte instead of a 32-bit number.) @item long_string_missing_value values[]; The missing values themselves. This array contains exactly @code{n_missing_values} elements, each of which has the following substructure: @example int32 value_len; char value[]; @end example @table @code @item int32 value_len; The length of the missing value string, in bytes. This value should be 8, because long string variables are at least 8 bytes wide (by definition), only the first 8 bytes of a long string variable's missing values are allowed to be non-spaces, and any spaces within the first 8 bytes are included in the missing value here. @item char value[]; The missing value string, exactly @code{value_len} bytes, without any padding or null terminator. @end table @end table @node Data File and Variable Attributes Records @section Data File and Variable Attributes Records The data file and variable attributes records represent custom attributes for the system file or for individual variables in the system file, as defined on the DATAFILE ATTRIBUTE (@pxref{DATAFILE ATTRIBUTE,,,pspp, PSPP Users Guide}) and VARIABLE ATTRIBUTE commands (@pxref{VARIABLE ATTRIBUTE,,,pspp, PSPP Users Guide}), respectively. @example /* @r{Header.} */ int32 rec_type; int32 subtype; int32 size; int32 count; /* @r{Exactly @code{count} bytes of data.} */ char attributes[]; @end example @table @code @item int32 rec_type; Record type. Always set to 7. @item int32 subtype; Record subtype. Always set to 17 for a data file attribute record or to 18 for a variable attributes record. @item int32 size; The size of each element in the @code{attributes} member. Always set to 1. @item int32 count; The total number of bytes in @code{attributes}. @item char attributes[]; The attributes, in a text-based format. In record subtype 17, this field contains a single attribute set. An attribute set is a sequence of one or more attributes concatenated together. Each attribute consists of a name, which has the same syntax as a variable name, followed by, inside parentheses, a sequence of one or more values. Each value consists of a string enclosed in single quotes (@code{'}) followed by a line feed (byte 0x0a). A value may contain single quote characters, which are not themselves escaped or quoted or required to be present in pairs. There is no apparent way to embed a line feed in a value. There is no distinction between an attribute with a single value and an attribute array with one element. In record subtype 18, this field contains a sequence of one or more variable attribute sets. If more than one variable attribute set is present, each one after the first is delimited from the previous by @code{/}. Each variable attribute set consists of a long variable name, followed by @code{:}, followed by an attribute set with the same syntax as on record subtype 17. System files written by @code{Stata 14.1/-savespss- 1.77 by S.Radyakin} may include multiple records with subtype 18, one per variable that has variable attributes. The total length is @code{count} bytes. @end table @subheading Example A system file produced with the following VARIABLE ATTRIBUTE commands in effect: @example VARIABLE ATTRIBUTE VARIABLES=dummy ATTRIBUTE=fred[1]('23') fred[2]('34'). VARIABLE ATTRIBUTE VARIABLES=dummy ATTRIBUTE=bert('123'). @end example @noindent will contain a variable attribute record with the following contents: @example 0000 07 00 00 00 12 00 00 00 01 00 00 00 22 00 00 00 |............"...| 0010 64 75 6d 6d 79 3a 66 72 65 64 28 27 32 33 27 0a |dummy:fred('23'.| 0020 27 33 34 27 0a 29 62 65 72 74 28 27 31 32 33 27 |'34'.)bert('123'| 0030 0a 29 |.) | @end example @menu * Variable Roles:: @end menu @node Variable Roles @subsection Variable Roles A variable's role is represented as an attribute named @code{$@@Role}. This attribute has a single element whose values and their meanings are: @table @code @item 0 Input. This, the default, is the most common role. @item 1 Output. @item 2 Both. @item 3 None. @item 4 Partition. @item 5 Split. @end table @node Extended Number of Cases Record @section Extended Number of Cases Record The file header record expresses the number of cases in the system file as an int32 (@pxref{File Header Record}). This record allows the number of cases in the system file to be expressed as a 64-bit number. @example int32 rec_type; int32 subtype; int32 size; int32 count; int64 unknown; int64 ncases64; @end example @table @code @item int32 rec_type; Record type. Always set to 7. @item int32 subtype; Record subtype. Always set to 16. @item int32 size; Size of each element. Always set to 8. @item int32 count; Number of pieces of data in the data part. Alway set to 2. @item int64 unknown; Meaning unknown. Always set to 1. @item int64 ncases64; Number of cases in the file as a 64-bit integer. Presumably this could be -1 to indicate that the number of cases is unknown, for the same reason as @code{ncases} in the file header record, but this has not been observed in the wild. @end table @node Other Informational Records @section Other Informational Records This chapter documents many specific types of extension records are documented here, but others are known to exist. PSPP ignores unknown extension records when reading system files. The following extension record subtypes have also been observed, with the following believed meanings: @table @asis @item 5 A set of grouped variables (according to Aapi H@"am@"al@"ainen). @item 6 Date info, probably related to USE (according to Aapi H@"am@"al@"ainen). @item 12 A UUID in the format described in RFC 4122. Only two examples observed, both written by SPSS 13, and in each case the UUID contained both upper and lower case. @item 24 XML that describes how data in the file should be displayed on-screen. @end table @node Dictionary Termination Record @section Dictionary Termination Record The dictionary termination record separates all other records from the data records. @example int32 rec_type; int32 filler; @end example @table @code @item int32 rec_type; Record type. Always set to 999. @item int32 filler; Ignored padding. Should be set to 0. @end table @node Data Record @section Data Record The data record must follow all other records in the system file. Every system file must have a data record that specifies data for at least one case. The format of the data record varies depending on the value of @code{compression} in the file header record: @table @asis @item 0: no compression Data is arranged as a series of 8-byte elements. Each element corresponds to the variable declared in the respective variable record (@pxref{Variable Record}). Numeric values are given in @code{flt64} format; string values are literal characters string, padded on the right when necessary to fill out 8-byte units. @item 1: bytecode compression The first 8 bytes of the data record is divided into a series of 1-byte command codes. These codes have meanings as described below: @table @asis @item 0 Ignored. If the program writing the system file accumulates compressed data in blocks of fixed length, 0 bytes can be used to pad out extra bytes remaining at the end of a fixed-size block. @item 1 through 251 A number with value @var{code} - @var{bias}, where @var{code} is the value of the compression code and @var{bias} is the variable @code{bias} from the file header. For example, code 105 with bias 100.0 (the normal value) indicates a numeric variable of value 5. A code of 0 (after subtracting the bias) in a string field encodes null bytes. This is unusual, since a string field normally encodes text data, but it exists in real system files. @item 252 End of file. This code may or may not appear at the end of the data stream. PSPP always outputs this code but its use is not required. @item 253 A numeric or string value that is not compressible. The value is stored in the 8 bytes following the current block of command bytes. If this value appears twice in a block of command bytes, then it indicates the second group of 8 bytes following the command bytes, and so on. @item 254 An 8-byte string value that is all spaces. @item 255 The system-missing value. @end table The end of the 8-byte group of bytecodes is followed by any 8-byte blocks of non-compressible values indicated by code 253. After that follows another 8-byte group of bytecodes, then those bytecodes' non-compressible values. The pattern repeats to the end of the file or a code with value 252. @item 2: ZLIB compression The data record consists of the following, in order: @itemize @bullet @item ZLIB data header, 24 bytes long. @item One or more variable-length blocks of ZLIB compressed data. @item ZLIB data trailer, with a 24-byte fixed header plus an additional 24 bytes for each preceding ZLIB compressed data block. @end itemize The ZLIB data header has the following format: @example int64 zheader_ofs; int64 ztrailer_ofs; int64 ztrailer_len; @end example @table @code @item int64 zheader_ofs; The offset, in bytes, of the beginning of this structure within the system file. @item int64 ztrailer_ofs; The offset, in bytes, of the first byte of the ZLIB data trailer. @item int64 ztrailer_len; The number of bytes in the ZLIB data trailer. This and the previous field sum to the size of the system file in bytes. @end table The data header is followed by @code{(ztrailer_len - 24) / 24} ZLIB compressed data blocks. Each ZLIB compressed data block begins with a ZLIB header as specified in RFC@tie{}1950, e.g.@: hex bytes @code{78 01} (the only header yet observed in practice). Each block decompresses to a fixed number of bytes (in practice only @code{0x3ff000}-byte blocks have been observed), except that the last block of data may be shorter. The last ZLIB compressed data block gends just before offset @code{ztrailer_ofs}. The result of ZLIB decompression is bytecode compressed data as described above for compression format 1. The ZLIB data trailer begins with the following 24-byte fixed header: @example int64 bias; int64 zero; int32 block_size; int32 n_blocks; @end example @table @code @item int64 int_bias; The compression bias as a negative integer, e.g.@: if @code{bias} in the file header record is 100.0, then @code{int_bias} is @minus{}100 (this is the only value yet observed in practice). @item int64 zero; Always observed to be zero. @item int32 block_size; The number of bytes in each ZLIB compressed data block, except possibly the last, following decompression. Only @code{0x3ff000} has been observed so far. @item int32 n_blocks; The number of ZLIB compressed data blocks, always exactly @code{(ztrailer_len - 24) / 24}. @end table The fixed header is followed by @code{n_blocks} 24-byte ZLIB data block descriptors, each of which describes the compressed data block corresponding to its offset. Each block descriptor has the following format: @example int64 uncompressed_ofs; int64 compressed_ofs; int32 uncompressed_size; int32 compressed_size; @end example @table @code @item int64 uncompressed_ofs; The offset, in bytes, that this block of data would have in a similar system file that uses compression format 1. This is @code{zheader_ofs} in the first block descriptor, and in each succeeding block descriptor it is the sum of the previous desciptor's @code{uncompressed_ofs} and @code{uncompressed_size}. @item int64 compressed_ofs; The offset, in bytes, of the actual beginning of this compressed data block. This is @code{zheader_ofs + 24} in the first block descriptor, and in each succeeding block descriptor it is the sum of the previous descriptor's @code{compressed_ofs} and @code{compressed_size}. The final block descriptor's @code{compressed_ofs} and @code{compressed_size} sum to @code{ztrailer_ofs}. @item int32 uncompressed_size; The number of bytes in this data block, after decompression. This is @code{block_size} in every data block except the last, which may be smaller. @item int32 compressed_size; The number of bytes in this data block, as stored compressed in this system file. @end table @end table @setfilename ignored pspp-1.4.1/doc/dev/output.texi0000644000175000017500000000103413546443556015706 0ustar00blpblp00000000000000@c PSPP - a program for statistical analysis. @c Copyright (C) 2019 Free Software Foundation, Inc. @c Permission is granted to copy, distribute and/or modify this document @c under the terms of the GNU Free Documentation License, Version 1.3 @c or any later version published by the Free Software Foundation; @c with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. @c A copy of the license is included in the section entitled "GNU @c Free Documentation License". @c @node Presenting Output @chapter Presenting Output pspp-1.4.1/doc/dev/pc+-file-format.texi0000644000175000017500000003363113546443556017236 0ustar00blpblp00000000000000@c PSPP - a program for statistical analysis. @c Copyright (C) 2019 Free Software Foundation, Inc. @c Permission is granted to copy, distribute and/or modify this document @c under the terms of the GNU Free Documentation License, Version 1.3 @c or any later version published by the Free Software Foundation; @c with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. @c A copy of the license is included in the section entitled "GNU @c Free Documentation License". @c @node SPSS/PC+ System File Format @appendix SPSS/PC+ System File Format SPSS/PC+, first released in 1984, was a simplified version of SPSS for IBM PC and compatible computers. It used a data file format related to the one described in the previous chapter, but simplified and incompatible. The SPSS/PC+ software became obsolete in the 1990s, so files in this format are rarely encountered today. Nevertheless, for completeness, and because it is not very difficult, it seems worthwhile to support at least reading these files. This chapter documents this format, based on examination of a corpus of about 60 files from a variety of sources. System files use four data types: 8-bit characters, 16-bit unsigned integers, 32-bit unsigned integers, and 64-bit floating points, called here @code{char}, @code{uint16}, @code{uint32}, and @code{flt64}, respectively. Data is not necessarily aligned on a word or double-word boundary. SPSS/PC+ ran only on IBM PC and compatible computers. Therefore, values in these files are always in little-endian byte order. Floating-point numbers are always in IEEE 754 format. SPSS/PC+ system files represent the system-missing value as -1.66e308, or @code{f5 1e 26 02 8a 8c ed ff} expressed as hexadecimal. (This is an unusual choice: it is close to, but not equal to, the largest negative 64-bit IEEE 754, which is about -1.8e308.) Text in SPSS/PC+ system file is encoded in ASCII-based 8-bit MS DOS codepages. The corpus used for investigating the format were all ASCII-only. An SPSS/PC+ system file begins with the following 256-byte directory: @example uint32 two; uint32 zero; struct @{ uint32 ofs; uint32 len; @} records[15]; char filename[128]; @end example @table @code @item uint32 two; @itemx uint32 zero; Always set to 2 and 0, respectively. These fields could be used as a signature for the file format, but the @code{product} field in record 0 seems more likely to be unique (@pxref{Record 0 Main Header Record}). @item struct @{ @dots{} @} records[15]; Each of the elements in this array identifies a record in the system file. The @code{ofs} is a byte offset, from the beginning of the file, that identifies the start of the record. @code{len} specifies the length of the record, in bytes. Many records are optional or not used. If a record is not present, @code{ofs} and @code{len} for that record are both are zero. @item char filename[128]; In most files in the corpus, this field is entirely filled with spaces. In one file, it contains a file name, followed by a null bytes, followed by spaces to fill the remainder of the field. The meaning is unknown. @end table The following sections describe the contents of each record, identified by the index into the @code{records} array. @menu * Record 0 Main Header Record:: * Record 1 Variables Record:: * Record 2 Labels Record:: * Record 3 Data Record:: * Records 4 and 5 Data Entry:: @end menu @node Record 0 Main Header Record @section Record 0: Main Header Record All files in the corpus have this record at offset 0x100 with length 0xb0 (but readers should find this record, like the others, via the @code{records} table in the directory). Its format is: @example uint16 one0; char product[62]; flt64 sysmis; uint32 zero0; uint32 zero1; uint16 one1; uint16 compressed; uint16 nominal_case_size; uint16 n_cases0; uint16 weight_index; uint16 zero2; uint16 n_cases1; uint16 zero3; char creation_date[8]; char creation_time[8]; char label[64]; @end example @table @code @item uint16 one0; @itemx uint16 one1; Always set to 1. @item uint32 zero0; @itemx uint32 zero1; @itemx uint16 zero2; @itemx uint16 zero3; Always set to 0. It seems likely that one of these variables is set to 1 if weighting is enabled, but none of the files in the corpus is weighted. @item char product[62]; Name of the program that created the file. Only the following unique values have been observed, in each case padded on the right with spaces: @example DESPSS/PC+ System File Written by Data Entry II PCSPSS SYSTEM FILE. IBM PC DOS, SPSS/PC+ PCSPSS SYSTEM FILE. IBM PC DOS, SPSS/PC+ V3.0 PCSPSS SYSTEM FILE. IBM PC DOS, SPSS for Windows @end example Thus, it is reasonable to use the presence of the string @samp{SPSS} at offset 0x104 as a simple test for an SPSS/PC+ data file. @item flt64 sysmis; The system-missing value, as described previously (@pxref{SPSS/PC+ System File Format}). @item uint16 compressed; Set to 0 if the data in the file is not compressed, 1 if the data is compressed with simple bytecode compression. @item uint16 nominal_case_size; Number of data elements per case. This is the number of variables, except that long string variables add extra data elements (one for every 8 bytes after the first 8). String variables in SPSS/PC+ system files are limited to 255 bytes. @item uint16 n_cases0; @itemx uint16 n_cases1; The number of cases in the data record. Both values are the same. Some files in the corpus contain data for the number of cases noted here, followed by garbage that somewhat resembles data. @item uint16 weight_index; 0, if the file is unweighted, otherwise a 1-based index into the data record of the weighting variable, e.g.@: 4 for the first variable after the 3 system-defined variables. @item char creation_date[8]; The date that the file was created, in @samp{mm/dd/yy} format. Single-digit days and months are not prefixed by zeros. The string is padded with spaces on right or left or both, e.g. @samp{_2/4/93_}, @samp{10/5/87_}, and @samp{_1/11/88} (with @samp{_} standing in for a space) are all actual examples from the corpus. @item char creation_time[8]; The time that the file was created, in @samp{HH:MM:SS} format. Single-digit hours are padded on a left with a space. Minutes and seconds are always written as two digits. @item char file_label[64]; File label declared by the user, if any (@pxref{FILE LABEL,,,pspp, PSPP Users Guide}). Padded on the right with spaces. @end table @node Record 1 Variables Record @section Record 1: Variables Record The variables record most commonly starts at offset 0x1b0, but it can be placed elsewhere. The record contains instances of the following 32-byte structure: @example uint32 value_label_start; uint32 value_label_end; uint32 var_label_ofs; uint32 format; char name[8]; union @{ flt64 f; char s[8]; @} missing; @end example The number of instances is the @code{nominal_case_size} specified in the main header record. There is one instance for each numeric variable and each string variable with width 8 bytes or less. String variables wider than 8 bytes have one instance for each 8 bytes, rounding up. The first instance for a long string specifies the variable's correct dictionary information. Subsequent instances for a long string are generally filled with all-zero bytes, although the @code{missing} field contains the numeric system-missing value, and some writers also fill in @code{var_label_ofs}, @code{format}, and @code{name}, sometimes filling the latter with the numeric system-missing value rather than a text string. Regardless of the values used, readers should ignore the contents of these additional instances for long strings. @table @code @item uint32 value_label_start; @itemx uint32 value_label_end; For a variable with value labels, these specify offsets into the label record of the start and end of this variable's value labels, respectively. @xref{Record 2 Labels Record}, for more information. For a variable without any value labels, these are both zero. A long string variable may not have value labels. @item uint32 var_label_ofs; For a variable with a variable label, this specifies an offset into the label record. @xref{Record 2 Labels Record}, for more information. For a variable without a variable label, this is zero. @item uint32 format; The variable's output format, in the same format used in system files. @xref{System File Output Formats}, for details. SPSS/PC+ system files only use format types 5 (F, for numeric variables) and 1 (A, for string variables). @item char name[8]; The variable's name, padded on the right with spaces. @item union @{ @dots{} @} missing; A user-missing value. For numeric variables, @code{missing.f} is the variable's user-missing value. For string variables, @code{missing.s} is a string missing value. A variable without a user-missing value is indicated with @code{missing.f} set to the system-missing value, even for string variables (!). A Long string variable may not have a missing value. @end table In addition to the user-defined variables, every SPSS/PC+ system file contains, as its first three variables, the following system-defined variables, in the following order. The system-defined variables have no variable label, value labels, or missing values. @table @code @item $CASENUM A numeric variable with format F8.0. Most of the time this is a sequence number, starting with 1 for the first case and counting up for each subsequent case. Some files skip over values, which probably reflects cases that were deleted. @item $DATE A string variable with format A8. Same format (including varying padding) as the @code{creation_date} field in the main header record (@pxref{Record 0 Main Header Record}). The actual date can differ from @code{creation_date} and from record to record. This may reflect when individual cases were added or updated. @item $WEIGHT A numeric variable with format F8.2. This represents the case's weight; SPSS/PC+ files do not have a user-defined weighting variable. If weighting has not been enabled, every case has value 1.0. @end table @node Record 2 Labels Record @section Record 2: Labels Record The labels record holds value labels and variable labels. Unlike the other records, it is not meant to be read directly and sequentially. Instead, this record must be interpreted one piece at a time, by following pointers from the variables record. The @code{value_label_start}, @code{value_label_end}, and @code{var_label_ofs} fields in a variable record are all offsets relative to the beginning of the labels record, with an additional 7-byte offset. That is, if the labels record starts at byte offset @code{labels_ofs} and a variable has a given @code{var_label_ofs}, then the variable label begins at byte offset @math{@code{labels_ofs} + @code{var_label_ofs} + 7} in the file. A variable label, starting at the offset indicated by @code{var_label_ofs}, consists of a one-byte length followed by the specified number of bytes of the variable label string, like this: @example uint8 length; char s[length]; @end example A set of value labels, extending from @code{value_label_start} to @code{value_label_end} (exclusive), consists of a numeric or string value followed by a string in the format just described. String values are padded on the right with spaces to fill the 8-byte field, like this: @example union @{ flt64 f; char s[8]; @} value; uint8 length; char s[length]; @end example The labels record begins with a pair of uint32 values. The first of these is always 3. The second is between 8 and 16 less than the number of bytes in the record. Neither value is important for interpreting the file. @node Record 3 Data Record @section Record 3: Data Record The format of the data record varies depending on the value of @code{compressed} in the file header record: @table @asis @item 0: no compression Data is arranged as a series of 8-byte elements, one per variable instance variable in the variable record (@pxref{Record 1 Variables Record}). Numeric values are given in @code{flt64} format; string values are literal characters string, padded on the right with spaces when necessary to fill out 8-byte units. @item 1: bytecode compression The first 8 bytes of the data record is divided into a series of 1-byte command codes. These codes have meanings as described below: @table @asis @item 0 The system-missing value. @item 1 A numeric or string value that is not compressible. The value is stored in the 8 bytes following the current block of command bytes. If this value appears twice in a block of command bytes, then it indicates the second group of 8 bytes following the command bytes, and so on. @item 2 through 255 A number with value @var{code} - 100, where @var{code} is the value of the compression code. For example, code 105 indicates a numeric variable of value 5. @end table The end of the 8-byte group of bytecodes is followed by any 8-byte blocks of non-compressible values indicated by code 1. After that follows another 8-byte group of bytecodes, then those bytecodes' non-compressible values. The pattern repeats up to the number of cases specified by the main header record have been seen. The corpus does not contain any files with command codes 2 through 95, so it is possible that some of these codes are used for special purposes. @end table Cases of data often, but not always, fill the entire data record. Readers should stop reading after the number of cases specified in the main header record. Otherwise, readers may try to interpret garbage following the data as additional cases. @node Records 4 and 5 Data Entry @section Records 4 and 5: Data Entry Records 4 and 5 appear to be related to SPSS/PC+ Data Entry. pspp-1.4.1/doc/dev/data.texi0000644000175000017500000000322013546443556015256 0ustar00blpblp00000000000000@c PSPP - a program for statistical analysis. @c Copyright (C) 2019 Free Software Foundation, Inc. @c Permission is granted to copy, distribute and/or modify this document @c under the terms of the GNU Free Documentation License, Version 1.3 @c or any later version published by the Free Software Foundation; @c with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. @c A copy of the license is included in the section entitled "GNU @c Free Documentation License". @c @node Processing Data @chapter Processing Data Developer's Guide Proposed outline: @example * Introduction * Basic concepts ** Data sets ** Variables ** Dictionaries ** Coding conventions ** Pools * Syntax parsing * Data processing ** Reading data *** Casereaders generalities *** Casereaders from data files *** Casereaders from the active dataset *** Other casereaders ** Writing data *** Casewriters generally *** Casewriters to data files *** Modifying the active dataset **** Modifying cases obtained from active dataset casereaders has no real effect **** Transformations; procedures that transform ** Transforming data *** Sorting and merging *** Filtering *** Grouping **** Ordering and interaction of filtering and grouping *** Multiple passes over data *** Counting cases and case weights ** Best practices *** Multiple passes with filters versus single pass with loops *** Sequential versus random access *** Managing memory *** Passing cases around *** Renaming casereaders *** Avoiding excessive buffering *** Propagating errors *** Avoid static/global data *** Don't worry about null filters, groups, etc. *** Be aware of reference counting semantics for cases @end example pspp-1.4.1/doc/dev/portable-file-format.texi0000644000175000017500000003154613546443556020374 0ustar00blpblp00000000000000@c PSPP - a program for statistical analysis. @c Copyright (C) 2019 Free Software Foundation, Inc. @c Permission is granted to copy, distribute and/or modify this document @c under the terms of the GNU Free Documentation License, Version 1.3 @c or any later version published by the Free Software Foundation; @c with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. @c A copy of the license is included in the section entitled "GNU @c Free Documentation License". @c @node Portable File Format @appendix Portable File Format These days, most computers use the same internal data formats for integer and floating-point data, if one ignores little differences like big- versus little-endian byte ordering. However, occasionally it is necessary to exchange data between systems with incompatible data formats. This is what portable files are designed to do. @strong{Please note:} This information is gleaned from examination of ASCII-formatted portable files only, so some of it may be incorrect for portable files formatted in EBCDIC or other character sets. @menu * Portable File Characters:: * Portable File Structure:: * Portable File Header:: * Version and Date Info Record:: * Identification Records:: * Variable Count Record:: * Precision Record:: * Case Weight Variable Record:: * Variable Records:: * Value Label Records:: * Portable File Document Record:: * Portable File Data:: @end menu @node Portable File Characters @section Portable File Characters Portable files are arranged as a series of lines of 80 characters each. Each line is terminated by a carriage-return, line-feed sequence (``new-lines''). New-lines are only used to avoid line length limits imposed by some OSes; they are not meaningful. Most lines in portable files are exactly 80 characters long. The only exception is a line that ends in one or more spaces, in which the spaces may optionally be omitted. Thus, a portable file reader must act as though a line shorter than 80 characters is padded to that length with spaces. The file must be terminated with a @samp{Z} character. In addition, if the final line in the file does not have exactly 80 characters, then it is padded on the right with @samp{Z} characters. (The file contents may be in any character set; the file contains a description of its own character set, as explained in the next section. Therefore, the @samp{Z} character is not necessarily an ASCII @samp{Z}.) For the rest of the description of the portable file format, new-lines and the trailing @samp{Z}s will be ignored, as if they did not exist, because they are not an important part of understanding the file contents. @node Portable File Structure @section Portable File Structure Every portable file consists of the following records, in sequence: @itemize @bullet @item File header. @item Version and date info. @item Product identification. @item Author identification (optional). @item Subproduct identification (optional). @item Variable count. @item Case weight variable (optional). @item Variables. Each variable record may optionally be followed by a missing value record and a variable label record. @item Value labels (optional). @item Documents (optional). @item Data. @end itemize Most records are identified by a single-character tag code. The file header and version info record do not have a tag. Other than these single-character codes, there are three types of fields in a portable file: floating-point, integer, and string. Floating-point fields have the following format: @itemize @bullet @item Zero or more leading spaces. @item Optional asterisk (@samp{*}), which indicates a missing value. The asterisk must be followed by a single character, generally a period (@samp{.}), but it appears that other characters may also be possible. This completes the specification of a missing value. @item Optional minus sign (@samp{-}) to indicate a negative number. @item A whole number, consisting of one or more base-30 digits: @samp{0} through @samp{9} plus capital letters @samp{A} through @samp{T}. @item Optional fraction, consisting of a radix point (@samp{.}) followed by one or more base-30 digits. @item Optional exponent, consisting of a plus or minus sign (@samp{+} or @samp{-}) followed by one or more base-30 digits. @item A forward slash (@samp{/}). @end itemize Integer fields take a form identical to floating-point fields, but they may not contain a fraction. String fields take the form of a integer field having value @var{n}, followed by exactly @var{n} characters, which are the string content. @node Portable File Header @section Portable File Header Every portable file begins with a 464-byte header, consisting of a 200-byte collection of vanity splash strings, followed by a 256-byte character set translation table, followed by an 8-byte tag string. The 200-byte segment is divided into five 40-byte sections, each of which represents the string @code{@var{charset} SPSS PORT FILE} in a different character set encoding, where @var{charset} is the name of the character set used in the file, e.g.@: @code{ASCII} or @code{EBCDIC}. Each string is padded on the right with spaces in its respective character set. It appears that these strings exist only to inform those who might view the file on a screen, and that they are not parsed by SPSS products. Thus, they can be safely ignored. For those interested, the strings are supposed to be in the following character sets, in the specified order: EBCDIC, 7-bit ASCII, CDC 6-bit ASCII, 6-bit ASCII, Honeywell 6-bit ASCII. The 256-byte segment describes a mapping from the character set used in the portable file to an arbitrary character set having characters at the following positions: @table @asis @item 0--60 Control characters. Not important enough to describe in full here. @item 61--63 Reserved. @item 64--73 Digits @samp{0} through @samp{9}. @item 74--99 Capital letters @samp{A} through @samp{Z}. @item 100--125 Lowercase letters @samp{a} through @samp{z}. @item 126 Space. @item 127--130 Symbols @code{.<(+} @item 131 Solid vertical pipe. @item 132--142 Symbols @code{&[]!$*);^-/} @item 143 Broken vertical pipe. @item 144--150 Symbols @code{,%_>}?@code{`:} @c @code{?} is an inverted question mark @item 151 British pound symbol. @item 152--155 Symbols @code{@@'="}. @item 156 Less than or equal symbol. @item 157 Empty box. @item 158 Plus or minus. @item 159 Filled box. @item 160 Degree symbol. @item 161 Dagger. @item 162 Symbol @samp{~}. @item 163 En dash. @item 164 Lower left corner box draw. @item 165 Upper left corner box draw. @item 166 Greater than or equal symbol. @item 167--176 Superscript @samp{0} through @samp{9}. @item 177 Lower right corner box draw. @item 178 Upper right corner box draw. @item 179 Not equal symbol. @item 180 Em dash. @item 181 Superscript @samp{(}. @item 182 Superscript @samp{)}. @item 183 Horizontal dagger (?). @item 184--186 Symbols @samp{@{@}\}. @item 187 Cents symbol. @item 188 Centered dot, or bullet. @item 189--255 Reserved. @end table Symbols that are not defined in a particular character set are set to the same value as symbol 64; i.e., to @samp{0}. The 8-byte tag string consists of the exact characters @code{SPSSPORT} in the portable file's character set, which can be used to verify that the file is indeed a portable file. @node Version and Date Info Record @section Version and Date Info Record This record does not have a tag code. It has the following structure: @itemize @bullet @item A single character identifying the file format version. The letter A represents version 0, and so on. @item An 8-character string field giving the file creation date in the format YYYYMMDD. @item A 6-character string field giving the file creation time in the format HHMMSS. @end itemize @node Identification Records @section Identification Records The product identification record has tag code @samp{1}. It consists of a single string field giving the name of the product that wrote the portable file. The author identification record has tag code @samp{2}. It is optional. If present, it consists of a single string field giving the name of the person who caused the portable file to be written. The subproduct identification record has tag code @samp{3}. It is optional. If present, it consists of a single string field giving additional information on the product that wrote the portable file. @node Variable Count Record @section Variable Count Record The variable count record has tag code @samp{4}. It consists of a single integer field giving the number of variables in the file dictionary. @node Precision Record @section Precision Record The precision record has tag code @samp{5}. It consists of a single integer field specifying the maximum number of base-30 digits used in data in the file. @node Case Weight Variable Record @section Case Weight Variable Record The case weight variable record is optional. If it is present, it indicates the variable used for weighting cases; if it is absent, cases are unweighted. It has tag code @samp{6}. It consists of a single string field that names the weighting variable. @node Variable Records @section Variable Records Each variable record represents a single variable. Variable records have tag code @samp{7}. They have the following structure: @itemize @bullet @item Width (integer). This is 0 for a numeric variable, and a number between 1 and 255 for a string variable. @item Name (string). 1--8 characters long. Must be in all capitals. A few portable files that contain duplicate variable names have been spotted in the wild. PSPP handles these by renaming the duplicates with numeric extensions: @code{@var{var}_1}, @code{@var{var}_2}, and so on. @item Print format. This is a set of three integer fields: @itemize @minus @item Format type (@pxref{Variable Record}). @item Format width. 1--40. @item Number of decimal places. 1--40. @end itemize A few portable files with invalid format types or formats that are not of the appropriate width for their variables have been spotted in the wild. PSPP assigns a default F or A format to a variable with an invalid format. @item Write format. Same structure as the print format described above. @end itemize Each variable record can optionally be followed by a missing value record, which has tag code @samp{8}. A missing value record has one field, the missing value itself (a floating-point or string, as appropriate). Up to three of these missing value records can be used. There is also a record for missing value ranges, which has tag code @samp{B}. It is followed by two fields representing the range, which are floating-point or string as appropriate. If a missing value range is present, it may be followed by a single missing value record. Tag codes @samp{9} and @samp{A} represent @code{LO THRU @var{x}} and @code{@var{x} THRU HI} ranges, respectively. Each is followed by a single field representing @var{x}. If one of the ranges is present, it may be followed by a single missing value record. In addition, each variable record can optionally be followed by a variable label record, which has tag code @samp{C}. A variable label record has one field, the variable label itself (string). @node Value Label Records @section Value Label Records Value label records have tag code @samp{D}. They have the following format: @itemize @bullet @item Variable count (integer). @item List of variables (strings). The variable count specifies the number in the list. Variables are specified by their names. All variables must be of the same type (numeric or string), but string variables do not necessarily have the same width. @item Label count (integer). @item List of (value, label) tuples. The label count specifies the number of tuples. Each tuple consists of a value, which is numeric or string as appropriate to the variables, followed by a label (string). @end itemize A few portable files that specify duplicate value labels, that is, two different labels for a single value of a single variable, have been spotted in the wild. PSPP uses the last value label specified in these cases. @node Portable File Document Record @section Document Record One document record may optionally follow the value label record. The document record consists of tag code @samp{E}, following by the number of document lines as an integer, followed by that number of strings, each of which represents one document line. Document lines must be 80 bytes long or shorter. @node Portable File Data @section Portable File Data The data record has tag code @samp{F}. There is only one tag for all the data; thus, all the data must follow the dictionary. The data is terminated by the end-of-file marker @samp{Z}, which is not valid as the beginning of a data element. Data elements are output in the same order as the variable records describing them. String variables are output as string fields, and numeric variables are output as floating-point fields. @setfilename ignored pspp-1.4.1/doc/dev/spv-file-format.texi0000644000175000017500000035142413602034607017356 0ustar00blpblp00000000000000@c PSPP - a program for statistical analysis. @c Copyright (C) 2019 Free Software Foundation, Inc. @c Permission is granted to copy, distribute and/or modify this document @c under the terms of the GNU Free Documentation License, Version 1.3 @c or any later version published by the Free Software Foundation; @c with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. @c A copy of the license is included in the section entitled "GNU @c Free Documentation License". @c @node SPSS Viewer File Format @appendix SPSS Viewer File Format SPSS Viewer or @file{.spv} files, here called SPV files, are written by SPSS 16 and later to represent the contents of its output editor. This chapter documents the format, based on examination of a corpus of about 8,000 files from a variety of sources. This description is detailed enough to both read and write SPV files. SPSS 15 and earlier versions instead use @file{.spo} files, which have a completely different output format based on the Microsoft Compound Document Format. This format is not documented here. An SPV file is a Zip archive that can be read with @command{zipinfo} and @command{unzip} and similar programs. The final member in the Zip archive is the @dfn{manifest}, a file named @file{META-INF/MANIFEST.MF}. This structure makes SPV files resemble Java ``JAR'' files (and ODF files), but whereas a JAR manifest contains a sequence of colon-delimited key/value pairs, an SPV manifest contains the string @samp{allowPivoting=true}, without a new-line. PSPP uses this string to identify an SPV file; it is invariant across the corpus.@footnote{SPV files always begin with the 7-byte sequence 50 4b 03 04 14 00 08, but this is not a useful magic number because most Zip archives start the same way.} The rest of the members in an SPV file's Zip archive fall into two categories: @dfn{structure} and @dfn{detail} members. Structure member names begin with @file{outputViewer@var{nnnnnnnnnn}}, where each @var{n} is a decimal digit, and end with @file{.xml}, and often include the string @file{_heading} in between. Each of these members represents some kind of output item (a table, a heading, a block of text, etc.) or a group of them. The member whose output goes at the beginning of the document is numbered 0, the next member in the output is numbered 1, and so on. Structure members contain XML. This XML is sometimes self-contained, but it often references detail members in the Zip archive, which are named as follows: @table @asis @item @file{@var{prefix}_table.xml} and @file{@var{prefix}_tableData.bin} @itemx @file{@var{prefix}_lightTableData.bin} The structure of a table plus its data. Older SPV files pair a @file{@var{prefix}_table.xml} file that describes the table's structure with a binary @file{@var{prefix}_tableData.bin} file that gives its data. Newer SPV files (the majority of those in the corpus) instead include a single @file{@var{prefix}_lightTableData.bin} file that incorporates both into a single binary format. @item @file{@var{prefix}_warning.xml} and @file{@var{prefix}_warningData.bin} @itemx @file{@var{prefix}_lightWarningData.bin} Same format used for tables, with a different name. @item @file{@var{prefix}_notes.xml} and @file{@var{prefix}_notesData.bin} @itemx @file{@var{prefix}_lightNotesData.bin} Same format used for tables, with a different name. @item @file{@var{prefix}_chartData.bin} and @file{@var{prefix}_chart.xml} The structure of a chart plus its data. Charts do not have a ``light'' format. @item @file{@var{prefix}_pmml.scf} @itemx @file{@var{prefix}_stats.scf} @item @file{@var{prefix}_model.xml} Not yet investigated. The corpus contains few examples. @end table The @file{@var{prefix}} in the names of the detail members is typically an 11-digit decimal number that increases for each item, tending to skip values. Older SPV files use different naming conventions. Structure member refer to detail members by name, and so their exact names do not matter to readers as long as they are unique. SPSS tolerates corrupted Zip archives that Zip reader libraries tend to reject. These can be fixed up with @command{zip -FF}. @menu * SPV Structure Member Format:: * SPV Light Detail Member Format:: * SPV Legacy Detail Member Binary Format:: * SPV Legacy Detail Member XML Format:: @end menu @node SPV Structure Member Format @section Structure Member Format A structure member lays out the high-level structure for a group of output items such as heading, tables, and charts. Structure members do not include the details of tables and charts but instead refer to them by their member names. Structure members' XML files claim conformance with a collection of XML Schemas. These schemas are distributed, under a nonfree license, with SPSS binaries. Fortunately, the schemas are not necessary to understand the structure members. The schemas can even be deceptive because they document elements and attributes that are not in the corpus and do not document elements and attributes that are commonly found in the corpus. Structure members use a different XML namespace for each schema, but these namespaces are not entirely consistent. In some SPV files, for example, the @code{viewer-tree} schema is associated with namespace @indicateurl{http://xml.spss.com/spss/viewer-tree} and in others with @indicateurl{http://xml.spss.com/spss/viewer/viewer-tree} (note the additional @file{viewer/}). Under either name, the schema URIs are not resolvable to obtain the schemas themselves. One may ignore all of the above in interpreting a structure member. The actual XML has a simple and straightforward form that does not require a reader to take schemas or namespaces into account. A structure member's root is @code{heading} element, which contains @code{heading} or @code{container} elements (or a mix), forming a tree. In turn, @code{container} holds a @code{label} and one more child, usually @code{text} or @code{table}. The following sections document the elements found in structure members in a context-free grammar-like fashion. Consider the following example, which specifies the attributes and content for the @code{container} element: @example container :visibility=(visible | hidden) :page-break-before=(always)? :text-align=(left | center)? :width=dimension => label (table | container_text | graph | model | object | image | tree) @end example Each attribute specification begins with @samp{:} followed by the attribute's name. If the attribute's value has an easily specified form, then @samp{=} and its description follows the name. Finally, if the attribute is optional, the specification ends with @samp{?}. The following value specifications are defined: @table @code @item (@var{a} | @var{b} | @dots{}) One of the listed literal strings. If only one string is listed, it is the only acceptable value. If @code{OTHER} is listed, then any string not explicitly listed is also accepted. @item bool Either @code{true} or @code{false}. @item dimension A floating-point number followed by a unit, e.g.@: @code{10pt}. Units in the corpus include @code{in} (inch), @code{pt} (points, 72/inch), @code{px} (``device-independent pixels'', 96/inch), and @code{cm}. If the unit is omitted then points should be assumed. The number and unit may be separated by white space. The corpus also includes localized names for units. A reader must understand these to properly interpret the dimension: @table @asis @item inch @code{인치}, @code{pol.}, @code{cala}, @code{cali} @item point @code{пт} @item centimeter @code{см} @end table @item real A floating-point number. @item int An integer. @item color A color in one of the forms @code{#@var{rr}@var{gg}@var{bb}} or @code{@var{rr}@var{gg}@var{bb}}, or the string @code{transparent}, or one of the standard Web color names. @item ref @item ref @var{element} @itemx ref(@var{elem1} | @var{elem2} | @dots{}) The name from the @code{id} attribute in some element. If one or more elements are named, the name must refer to one of those elements, otherwise any element is acceptable. @end table All elements have an optional @code{id} attribute. If present, its value must be unique. In practice many elements are assigned @code{id} attributes that are never referenced. The content specification for an element supports the following syntax: @table @code @item @var{element} An element. @item @var{a} @var{b} @var{a} followed by @var{b}. @item @var{a} | @var{b} | @var{c} One of @var{a} or @var{b} or @var{c}. @item @var{a}? Zero or one instances of @var{a}. @item @var{a}* Zero or more instances of @var{a}. @item @var{b}+ One or more instances of @var{a}. @item (@var{subexpression}) Grouping for a subexpression. @item EMPTY No content. @item TEXT Text and CDATA. @end table Element and attribute names are sometimes suffixed by another name in square brackets to distinguish different uses of the same name. For example, structure XML has two @code{text} elements, one inside @code{container}, the other inside @code{pageParagraph}. The former is defined as @code{text[container_text]} and referenced as @code{container_text}, the latter defined as @code{text[pageParagraph_text]} and referenced as @code{pageParagraph_text}. This language is used in the PSPP source code for parsing structure and detail XML members. Refer to @file{src/output/spv/structure-xml.grammar} and @file{src/output/spv/detail-xml.grammar} for the full grammars. The following example shows the contents of a typical structure member for a @cmd{DESCRIPTIVES} procedure. A real structure member is not indented. This example also omits most attributes, all XML namespace information, and the CSS from the embedded HTML: @example
Descriptives]]>
00000000001_lightNotesData.bin
00000000002_lightTableData.bin
@end example @menu * SPV Structure heading Element:: * SPV Structure label Element:: * SPV Structure container Element:: * SPV Structure text Element (Inside @code{container}):: * SPV Structure html Element:: * SPV Structure table Element:: * SPV Structure graph Element:: * SPV Structure model Element:: * SPV Structure tree Element:: * SPV Structure Path Elements:: * SPV Structure pageSetup Element:: * SPV Structure @code{text} Element (Inside @code{pageParagraph}):: @end menu @node SPV Structure heading Element @subsection The @code{heading} Element @example heading[root_heading] :creator-version? :creator? :creation-date-time? :lockReader=bool? :schemaLocation? => label pageSetup? (container | heading)* heading :creator-version? :commandName? :visibility[heading_visibility]=(collapsed)? :locale? :olang? => label (container | heading)* @end example The root of a structure member is a @code{heading}, which represents a section of output beginning with a title (the @code{label}) and ordinarily followed by content containers or further nested (sub)-sections of output. Unlike heading elements in HTML and other common document formats, which precede the content that they head, @code{heading} contains the elements that appear below the heading. The document root heading, only, may contain a @code{pageSetup} element. The following attributes have been observed on both document root and nested @code{heading} elements. @defvr {Attribute} creator-version The version of the software that created this SPV file. A string of the form @code{xxyyzzww} represents software version xx.yy.zz.ww, e.g.@: @code{21000001} is version 21.0.0.1. Trailing pairs of zeros are sometimes omitted, so that @code{21}, @code{210000}, and @code{21000000} are all version 21.0.0.0 (and the corpus contains all three of those forms). @end defvr @noindent The following attributes have been observed on document root @code{heading} elements only: @defvr {Attribute} @code{creator} The directory in the file system of the software that created this SPV file. @end defvr @defvr {Attribute} @code{creation-date-time} The date and time at which the SPV file was written, in a locale-specific format, e.g.@: @code{Friday, May 16, 2014 6:47:37 PM PDT} or @code{lunedì 17 marzo 2014 3.15.48 CET} or even @code{Friday, December 5, 2014 5:00:19 o'clock PM EST}. @end defvr @defvr {Attribute} @code{lockReader} Whether a reader should be allowed to edit the output. The possible values are @code{true} and @code{false}. The value @code{false} is by far the most common. @end defvr @defvr {Attribute} @code{schemaLocation} This is actually an XML Namespace attribute. A reader may ignore it. @end defvr @noindent The following attributes have been observed only on nested @code{heading} elements: @defvr {Attribute} @code{commandName} A locale-invariant identifier for the command that produced the output, e.g.@: @code{Frequencies}, @code{T-Test}, @code{Non Par Corr}. @end defvr @defvr {Attribute} @code{visibility} To what degree the output represented by the element is visible. @end defvr @defvr {Attribute} @code{locale} The locale used for output, in Windows format, which is similar to the format used in Unix with the underscore replaced by a hyphen, e.g.@: @code{en-US}, @code{en-GB}, @code{el-GR}, @code{sr-Cryl-RS}. @end defvr @defvr {Attribute} @code{olang} The output language, e.g.@: @code{en}, @code{it}, @code{es}, @code{de}, @code{pt-BR}. @end defvr @node SPV Structure label Element @subsection The @code{label} Element @example label => TEXT @end example Every @code{heading} and @code{container} holds a @code{label} as its first child. The root @code{heading} in a structure member always contains the string ``Output'' (localized). Otherwise, the text in @code{label} describes what it labels, often by naming the statistical procedure that was executed, e.g.@: ``Frequencies'' or ``T-Test''. Labels are often very generic, especially within a @code{container}, e.g.@: ``Title'' or ``Warnings'' or ``Notes''. Label text is localized according to the output language, e.g.@: in Italian a frequency table procedure is labeled ``Frequenze''. The corpus contains a few examples of empty labels, ones that contain no text. @node SPV Structure container Element @subsection The @code{container} Element @example container :visibility=(visible | hidden) :page-break-before=(always)? :text-align=(left | center)? :width=dimension => label (table | container_text | graph | model | object | image | tree) @end example A @code{container} serves to contain and label a @code{table}, @code{text}, or other kind of item. This element has the following attributes. @defvr {Attribute} @code{visibility} Whether the container's content is displayed. ``Notes'' tables are often hidden; other data is usually @end defvr @defvr {Attribute} @code{text-align} Alignment of text within the container. Observed with nested @code{table} and @code{text} elements. @end defvr @defvr {Attribute} @code{width} The width of the container, e.g.@: @code{1097px}. @end defvr @node SPV Structure text Element (Inside @code{container}) @subsection The @code{text} Element (Inside @code{container}) @example text[container_text] :type[text_type]=(title | log | text | page-title) :commandName? :creator-version? => html @end example This @code{text} element is nested inside a @code{container}. There is a different @code{text} element that is nested inside a @code{pageParagraph}. This element has the following attributes. @defvr {Attribute} @code{type} The semantics of the text. @end defvr @defvr {Attribute} @code{commandName} As on the @code{heading} element. For output not specific to a command, this is simply @code{log}. The corpus contains one example of where @code{commandName} is present but set to the empty string. @end defvr @defvr {Attribute} @code{creator-version} As on the @code{heading} element. @end defvr @node SPV Structure html Element @subsection The @code{html} Element @example html :lang=(en) => TEXT @end example The element contains an HTML document as text (or, in practice, as CDATA). In some cases, the document starts with @code{} and ends with @code{}; in others the @code{html} element is implied. Generally the HTML includes a @code{head} element with a CSS stylesheet. The HTML body often begins with @code{
}. The HTML document uses only the following elements: @table @code @item html Sometimes, the document is enclosed with @code{}@dots{}@code{}. @item br The HTML body often begins with @code{
} and may contain it as well. @item b @itemx i @itemx u Styling. @item font The attributes @code{face}, @code{color}, and @code{size} are observed. The value of @code{color} takes one of the forms @code{#@var{rr}@var{gg}@var{bb}} or @code{rgb (@var{r}, @var{g}, @var{b})}. The value of @code{size} is a number between 1 and 7, inclusive. @end table The CSS in the corpus is simple. To understand it, a parser only needs to be able to skip white space, @code{}, and parse style only for @code{p} elements. Only @code{font-weight}, @code{font-style}, @code{font-decoration}, @code{font-family}, and @code{font-size} matter. This element has the following attributes. @defvr {Attribute} @code{lang} This always contains @code{en} in the corpus. @end defvr @node SPV Structure table Element @subsection The @code{table} Element @example table :VDPId? :ViZmlSource? :activePageId=int? :commandName :creator-version? :displayFiltering=bool? :maxNumCells=int? :orphanTolerance=int? :rowBreakNumber=int? :subType :tableId :tableLookId? :type[table_type]=(table | note | warning) => tableProperties? tableStructure tableStructure => path? dataPath csvPath? @end example This element has the following attributes. @defvr {Attribute} @code{commandName} As on the @code{heading} element. @end defvr @defvr {Attribute} @code{type} One of @code{table}, @code{note}, or @code{warning}. @end defvr @defvr {Attribute} @code{subType} The locale-invariant command ID for the particular kind of output that this table represents in the procedure. This can be the same as @code{commandName} e.g.@: @code{Frequencies}, or different, e.g.@: @code{Case Processing Summary}. Generic subtypes @code{Notes} and @code{Warnings} are often used. @end defvr @defvr {Attribute} @code{tableId} A number that uniquely identifies the table within the SPV file, typically a large negative number such as @code{-4147135649387905023}. @end defvr @defvr {Attribute} @code{creator-version} As on the @code{heading} element. In the corpus, this is only present for version 21 and up and always includes all 8 digits. @end defvr @xref{SPV Detail Legacy Properties}, for details on the @code{tableProperties} element. @node SPV Structure graph Element @subsection The @code{graph} Element @example graph :VDPId? :ViZmlSource? :commandName? :creator-version? :dataMapId? :dataMapURI? :editor? :refMapId? :refMapURI? :csvFileIds? :csvFileNames? => dataPath? path csvPath? @end example This element represents a graph. The @code{dataPath} and @code{path} elements name the Zip members that give the details of the graph. Normally, both elements are present; there is only one counterexample in the corpus. @code{csvPath} only appears in one SPV file in the corpus, for two graphs. In these two cases, @code{dataPath}, @code{path}, and @code{csvPath} all appear. These @code{csvPath} name Zip members with names of the form @file{@var{number}_csv.bin}, where @var{number} is a many-digit number and the same as the @code{csvFileIds}. The named Zip members are CSV text files (despite the @file{.bin} extension). The CSV files are encoded in UTF-8 and begin with a U+FEFF byte-order marker. @node SPV Structure model Element @subsection The @code{model} Element @example model :PMMLContainerId? :PMMLId :StatXMLContainerId :VDPId :auxiliaryViewName :commandName :creator-version :mainViewName => ViZml? dataPath? path | pmmlContainerPath statsContainerPath pmmlContainerPath => TEXT statsContainerPath => TEXT ViZml :viewName? => TEXT @end example This element represents a model. The @code{dataPath} and @code{path} elements name the Zip members that give the details of the model. Normally, both elements are present; there is only one counterexample in the corpus. The details are unexplored. The @code{ViZml} element contains base-64 encoded text, that decodes to a binary format with some embedded text strings, and @code{path} names an Zip member that contains XML. Alternatively, @code{pmmlContainerPath} and @code{statsContainerPath} name Zip members with @file{.scf} extension. @node SPV Structure tree Element @subsection The @code{tree} Element @example tree :commandName :creator-version :name :type => dataPath path @end example This element represents a tree. The @code{dataPath} and @code{path} elements name the Zip members that give the details of the tree. The details are unexplored. @node SPV Structure Path Elements @subsection Path Elements @example dataPath => TEXT path => TEXT csvPath => TEXT @end example These element contain the name of the Zip members that hold details for a container. For tables: @itemize @bullet @item When a ``light'' format is used, only @code{dataPath} is present, and it names a @file{.bin} member of the Zip file that has @code{light} in its name, e.g.@: @code{0000000001437_lightTableData.bin} (@pxref{SPV Light Detail Member Format}). @item When the legacy format is used, both are present. In this case, @code{dataPath} names a Zip member with a legacy binary format that contains relevant data (@pxref{SPV Legacy Detail Member Binary Format}), and @code{path} names a Zip member that uses an XML format (@pxref{SPV Legacy Detail Member XML Format}). @end itemize Graphs normally follow the legacy approach described above. The corpus contains one example of a graph with @code{path} but not @code{dataPath}. The reason is unexplored. Models use @code{path} but not @code{dataPath}. @xref{SPV Structure graph Element}, for more information. These elements have no attributes. @node SPV Structure pageSetup Element @subsection The @code{pageSetup} Element @example pageSetup :initial-page-number=int? :chart-size=(as-is | full-height | half-height | quarter-height | OTHER)? :margin-left=dimension? :margin-right=dimension? :margin-top=dimension? :margin-bottom=dimension? :paper-height=dimension? :paper-width=dimension? :reference-orientation? :space-after=dimension? => pageHeader pageFooter pageHeader => pageParagraph? pageFooter => pageParagraph? pageParagraph => pageParagraph_text @end example The @code{pageSetup} element has the following attributes. @defvr {Attribute} @code{initial-page-number} The page number to put on the first page of printed output. Usually @code{1}. @end defvr @defvr {Attribute} @code{chart-size} One of the listed, self-explanatory chart sizes, @code{quarter-height}, or a localization (!) of one of these (e.g.@: @code{dimensione attuale}, @code{Wie vorgegeben}). @end defvr @defvr {Attribute} @code{margin-left} @defvrx {Attribute} @code{margin-right} @defvrx {Attribute} @code{margin-top} @defvrx {Attribute} @code{margin-bottom} Margin sizes, e.g.@: @code{0.25in}. @end defvr @defvr {Attribute} @code{paper-height} @defvrx {Attribute} @code{paper-width} Paper sizes. @end defvr @defvr {Attribute} @code{reference-orientation} Indicates the orientation of the output page. Either @code{0deg} (portrait) or @code{90deg} (landscape), @end defvr @defvr {Attribute} @code{space-after} The amount of space between printed objects, typically @code{12pt}. @end defvr @node SPV Structure @code{text} Element (Inside @code{pageParagraph}) @subsection The @code{text} Element (Inside @code{pageParagraph}) @example text[pageParagraph_text] :type=(title | text) => TEXT @end example This @code{text} element is nested inside a @code{pageParagraph}. There is a different @code{text} element that is nested inside a @code{container}. The element is either empty, or contains CDATA that holds almost-XHTML text: in the corpus, either an @code{html} or @code{p} element. It is @emph{almost}-XHTML because the @code{html} element designates the default namespace as @indicateurl{http://xml.spss.com/spss/viewer/viewer-tree} instead of an XHTML namespace, and because the CDATA can contain substitution variables. The following variables are supported: @table @code @item &[Date] @itemx &[Time] The current date or time in the preferred format for the locale. @item &[Head1] @itemx &[Head2] @itemx &[Head3] @itemx &[Head4] First-, second-, third-, or fourth-level heading. @item &[PageTitle] The page title. @item &[Filename] Name of the output file. @item &[Page] The page number. @end table @code{&[Page]} for the page number and @code{&[PageTitle]} for the page title. Typical contents (indented for clarity): @example

Page &[Page]

@end example This element has the following attributes. @defvr {Attribute} @code{type} Always @code{text}. @end defvr @node SPV Light Detail Member Format @section Light Detail Member Format This section describes the format of ``light'' detail @file{.bin} members. These members have a binary format which we describe here in terms of a context-free grammar using the following conventions: @table @asis @item NonTerminal @result{} @dots{} Nonterminals have CamelCaps names, and @result{} indicates a production. The right-hand side of a production is often broken across multiple lines. Break points are chosen for aesthetics only and have no semantic significance. @item 00, 01, @dots{}, ff. A bytes with a fixed value, written as a pair of hexadecimal digits. @item i0, i1, @dots{}, i9, i10, i11, @dots{} @itemx ib0, ib1, @dots{}, ib9, ib10, ib11, @dots{} A 32-bit integer in little-endian or big-endian byte order, respectively, with a fixed value, written in decimal. Prefixed by @samp{i} for little-endian or @samp{ib} for big-endian. @item byte A byte. @item bool A byte with value 0 or 1. @item int16 @itemx be16 A 16-bit unsigned integer in little-endian or big-endian byte order, respectively. @item int32 @itemx be32 A 32-bit unsigned integer in little-endian or big-endian byte order, respectively. @item int64 @itemx be64 A 64-bit unsigned integer in little-endian or big-endian byte order, respectively. @item double A 64-bit IEEE floating-point number. @item float A 32-bit IEEE floating-point number. @item string @itemx bestring A 32-bit unsigned integer, in little-endian or big-endian byte order, respectively, followed by the specified number of bytes of character data. (The encoding is indicated by the Formats nonterminal.) @item @var{x}? @var{x} is optional, e.g.@: 00? is an optional zero byte. @item @var{x}*@var{n} @var{x} is repeated @var{n} times, e.g.@: byte*10 for ten arbitrary bytes. @item @var{x}[@var{name}] Gives @var{x} the specified @var{name}. Names are used in textual explanations. They are also used, also bracketed, to indicate counts, e.g.@: @code{int32[n] byte*[n]} for a 32-bit integer followed by the specified number of arbitrary bytes. @item @var{a} @math{|} @var{b} Either @var{a} or @var{b}. @item (@var{x}) Parentheses are used for grouping to make precedence clear, especially in the presence of @math{|}, e.g.@: in 00 (01 @math{|} 02 @math{|} 03) 00. @item count(@var{x}) @itemx becount(@var{x}) A 32-bit unsigned integer, in little-endian or big-endian byte order, respectively, that indicates the number of bytes in @var{x}, followed by @var{x} itself. @item v1(@var{x}) In a version 1 @file{.bin} member, @var{x}; in version 3, nothing. (The @file{.bin} header indicates the version.) @item v3(@var{x}) In a version 3 @file{.bin} member, @var{x}; in version 1, nothing. @end table PSPP uses this grammar to parse light detail members. See @file{src/output/spv/light-binary.grammar} in the PSPP source tree for the full grammar. Little-endian byte order is far more common in this format, but a few pieces of the format use big-endian byte order. Light detail members express linear units in two ways: points (pt), at 72/inch, and ``device-independent pixels'' (px), at 96/inch. To convert from pt to px, multiply by 1.33 and round up. To convert from px to pt, divide by 1.33 and round down. A ``light'' detail member @file{.bin} consists of a number of sections concatenated together, terminated by an optional byte 01: @example LightMember => Header Titles Footnotes Areas Borders PrintSettings TableSettings Formats Dimensions Axes Cells 01? @end example The following sections go into more detail. @menu * SPV Light Member Header:: * SPV Light Member Titles:: * SPV Light Member Footnotes:: * SPV Light Member Areas:: * SPV Light Member Borders:: * SPV Light Member Print Settings:: * SPV Light Member Table Settings:: * SPV Light Member Formats:: * SPV Light Member Dimensions:: * SPV Light Member Categories:: * SPV Light Member Axes:: * SPV Light Member Cells:: * SPV Light Member Value:: * SPV Light Member ValueMod:: @end menu @node SPV Light Member Header @subsection Header An SPV light member begins with a 39-byte header: @example Header => 01 00 (i1 @math{|} i3)[version] bool[x0] bool[x1] bool[rotate-inner-column-labels] bool[rotate-outer-row-labels] bool[x2] int32[x3] int32[min-col-width] int32[max-col-width] int32[min-row-width] int32[max-row-width] int64[table-id] @end example @code{version} is a version number that affects the interpretation of some of the other data in the member. We will refer to ``version 1'' and ``version 3'' later on and use v1(@dots{}) and v3(@dots{}) for version-specific formatting (as described previously). If @code{rotate-inner-column-labels} is 1, then column labels closest to the data are rotated to be vertical; otherwise, they are shown in the normal way. If @code{rotate-outer-row-labels} is 1, then row labels farthest from the data are rotated to be vertical; otherwise, they are shown in the normal way. @code{table-id} is a binary version of the @code{tableId} attribute in the structure member that refers to the detail member. For example, if @code{tableId} is @code{-4122591256483201023}, then @code{table-id} would be 0xc6c99d183b300001. @code{min-col-width} is the minimum width that a column will be assigned automatically. @code{max-col-width} is the maximum width that a column will be assigned to accommodate a long column label. @code{min-row-width} and @code{max-row-width} are a similar range for the width of row labels. All of these measurements are in 1/96 inch units (called a ``device independent pixel'' unit in Windows). The meaning of the other variable parts of the header is not known. A writer may safely use version 3, true for @code{x0}, false for @code{x1}, true for @code{x2}, and 0x15 for @code{x3}. @node SPV Light Member Titles @subsection Titles @example Titles => Value[title] 01? Value[subtype] 01? 31 Value[user-title] 01? (31 Value[corner-text] @math{|} 58) (31 Value[caption] @math{|} 58) @end example The Titles follow the Header and specify the table's title, caption, and corner text. The @code{user-title} is shown above the title and reflects any user editing of the title text or style. The @code{title} is the title originally generated by the procedure. Both of these are appropriate for presentation and localized to the user's language. For example, for a frequency table, @code{title} and @code{user-title} normally name the variable and @code{c} is simply ``Frequencies''. @code{subtype} is the same as the @code{subType} attribute in the @code{table} structure XML element that referred to this member. @xref{SPV Structure table Element}, for details. The @code{corner-text}, if present, is shown in the upper-left corner of the table, above the row headings and to the left of the column headings. It is usually absent. Corner text prevents row dimension labels from being displayed above the dimension's group and category labels (see @code{show-row-labels-in-corner}). The @code{caption}, if present, is shown below the table. @code{caption} reflects user editing of the caption. @node SPV Light Member Footnotes @subsection Footnotes @example Footnotes => int32[n-footnotes] Footnote*[n-footnotes] Footnote => Value[text] (58 @math{|} 31 Value[marker]) int32[show] @end example Each footnote has @code{text} and an optional custom @code{marker} (such as @samp{*}). @code{show} is a 32-bit signed integer. It is positive to show the footnote or negative to hide it. Its magnitude is often 1, and in other cases tends to be the number of references to the footnote. @node SPV Light Member Areas @subsection Areas @example Areas => 00? Area*8 Area => byte[index] 31 string[typeface] float[size] int32[style] bool[underline] int32[halign] int32[valign] string[fg-color] string[bg-color] bool[alternate] string[alt-fg-color] string[alt-bg-color] v3(int32[left-margin] int32[right-margin] int32[top-margin] int32[bottom-margin]) @end example Each Area represents the style for a different area of the table, in the following order: title, caption, footer, corner, column labels, row labels, data, and layers. @code{index} is the 1-based index of the Area, i.e. 1 for the first Area, through 8 for the final Area. @code{typeface} is the string name of the font used in the area. In the corpus, this is @code{SansSerif} in over 99% of instances and @code{Times New Roman} in the rest. @code{size} is the size of the font, in px (@pxref{SPV Light Detail Member Format}) The most common size in the corpus is 12 px. Even though @code{size} has a floating-point type, in the corpus its values are always integers. @code{style} is a bit mask. Bit 0 (with value 1) is set for bold, bit 1 (with value 2) is set for italic. @code{underline} is 1 if the font is underlined, 0 otherwise. @code{halign} specifies horizontal alignment: 0 for center, 2 for left, 4 for right, 61453 for decimal, 64173 for mixed. Mixed alignment varies according to type: string data is left-justified, numbers and most other formats are right-justified. @code{valign} specifies vertical alignment: 0 for center, 1 for top, 3 for bottom. @code{fg-color} and @code{bg-color} are the foreground color and background color, respectively. In the corpus, these are always @code{#000000} and @code{#ffffff}, respectively. @code{alternate} is 1 if rows should alternate colors, 0 if all rows should be the same color. When @code{alternate} is 1, @code{alt-fg-color} and @code{alt-bg-color} specify the colors for the alternate rows; otherwise they are empty strings. @code{left-margin}, @code{right-margin}, @code{top-margin}, and @code{bottom-margin} are measured in px. @node SPV Light Member Borders @subsection Borders @example Borders => count( ib1[endian] be32[n-borders] Border*[n-borders] bool[show-grid-lines] 00 00 00) Border => be32[border-type] be32[stroke-type] be32[color] @end example The Borders reflect how borders between regions are drawn. The fixed value of @code{endian} can be used to validate the endianness. @code{show-grid-lines} is 1 to draw grid lines, otherwise 0. Each Border describes one kind of border. @code{n-borders} seems to always be 19. Each @code{border-type} appears once (although in an unpredictable order) and correspond to the following borders: @table @asis @item 0 Title. @item 1@dots{}4 Left, top, right, and bottom outer frame. @item 5@dots{}8 Left, top, right, and bottom inner frame. @item 9, 10 Left and top of data area. @item 11, 12 Horizontal and vertical dimension rows. @item 13, 14 Horizontal and vertical dimension columns. @item 15, 16 Horizontal and vertical category rows. @item 17, 18 Horizontal and vertical category columns. @end table @code{stroke-type} describes how a border is drawn, as one of: @table @asis @item 0 No line. @item 1 Solid line. @item 2 Dashed line. @item 3 Thick line. @item 4 Thin line. @item 5 Double line. @end table @code{color} is an RGB color. Bits 24--31 are alpha, bits 16--23 are red, 8--15 are green, 0--7 are blue. An alpha of 255 indicates an opaque color, therefore opaque black is 0xff000000. @node SPV Light Member Print Settings @subsection Print Settings @example PrintSettings => count( ib1[endian] bool[all-layers] bool[paginate-layers] bool[fit-width] bool[fit-length] bool[top-continuation] bool[bottom-continuation] be32[n-orphan-lines] bestring[continuation-string]) @end example The PrintSettings reflect settings for printing. The fixed value of @code{endian} can be used to validate the endianness. @code{all-layers} is 1 to print all layers, 0 to print only the visible layers. @code{paginate-layers} is 1 to print each layer at the start of a new page, 0 otherwise. (This setting is honored only @code{all-layers} is 1, since otherwise only one layer is printed.) @code{fit-width} and @code{fit-length} control whether the table is shrunk to fit within a page's width or length, respectively. @code{n-orphan-lines} is the minimum number of rows or columns to put in one part of a table that is broken across pages. If @code{top-continuation} is 1, then @code{continuation-string} is printed at the top of a page when a table is broken across pages for printing; similarly for @code{bottom-continuation} and the bottom of a page. Usually, @code{continuation-string} is empty. @node SPV Light Member Table Settings @subsection Table Settings @example TableSettings => count( v3( ib1[endian] be32[x5] be32[current-layer] bool[omit-empty] bool[show-row-labels-in-corner] bool[show-alphabetic-markers] bool[footnote-marker-superscripts] byte[x6] becount( Breakpoints[row-breaks] Breakpoints[column-breaks] Keeps[row-keeps] Keeps[column-keeps] PointKeeps[row-point-keeps] PointKeeps[column-point-keeps] ) bestring[notes] bestring[table-look] 00...)) Breakpoints => be32[n-breaks] be32*[n-breaks] Keeps => be32[n-keeps] Keep*[n-keeps] Keep => be32[offset] be32[n] PointKeeps => be32[n-point-keeps] PointKeep*[n-point-keeps] PointKeep => be32[offset] be32 be32 @end example The TableSettings reflect display settings. The fixed value of @code{endian} can be used to validate the endianness. @code{current-layer} is the displayed layer. The interpretation when there is more than one layer dimension is not yet known. If @code{omit-empty} is 1, empty rows or columns (ones with nothing in any cell) are hidden; otherwise, they are shown. If @code{show-row-labels-in-corner} is 1, then row labels are shown in the upper left corner; otherwise, they are shown nested. If @code{show-alphabetic-markers} is 1, markers are shown as letters (e.g.@: @samp{a}, @samp{b}, @samp{c}, @dots{}); otherwise, they are shown as numbers starting from 1. When @code{footnote-marker-superscripts} is 1, footnote markers are shown as superscripts, otherwise as subscripts. The Breakpoints are rows or columns after which there is a page break; for example, a row break of 1 requests a page break after the second row. Usually no breakpoints are specified, indicating that page breaks should be selected automatically. The Keeps are ranges of rows or columns to be kept together without a page break; for example, a row Keep with @code{offset} 1 and @code{n} 10 requests that the 10 rows starting with the second row be kept together. Usually no Keeps are specified. The PointKeeps seem to be generated automatically based on user-specified Keeps. They seems to indicate a conversion from rows or columns to pixel or point offsets. @code{notes} is a text string that contains user-specified notes. It is displayed when the user hovers the cursor over the table, like ``alt text'' on a webpage. It is not printed. It is usually empty. @code{table-look} is the name of a SPSS ``TableLook'' table style, such as ``Default'' or ``Academic''; it is often empty. TableSettings ends with an arbitrary number of null bytes. A writer may safely write 82 null bytes. A writer may safely use 4 for @code{x5} and 0 for @code{x6}. @node SPV Light Member Formats @subsection Formats @example Formats => int32[n-widths] int32*[n-widths] string[locale] int32[current-layer] bool bool bool Y0 CustomCurrency count( v1(X0?) v3(count(X1 count(X2)) count(X3))) Y0 => int32[epoch] byte[decimal] byte[grouping] CustomCurrency => int32[n-ccs] string*[n-ccs] @end example If @code{n-widths} is nonzero, then the accompanying integers are column widths as manually adjusted by the user. @code{locale} is a locale including an encoding, such as @code{en_US.windows-1252} or @code{it_IT.windows-1252}. The rest of the character strings in the member use this encoding. The encoding string is itself encoded in US-ASCII. @code{epoch} is the year that starts the epoch. A 2-digit year is interpreted as belonging to the 100 years beginning at the epoch. The default epoch year is 69 years prior to the current year; thus, in 2017 this field by default contains 1948. In the corpus, @code{epoch} ranges from 1943 to 1948, plus some contain -1. @code{decimal} is the decimal point character. The observed values are @samp{.} and @samp{,}. @code{grouping} is the grouping character. Usually, it is @samp{,} if @code{decimal} is @samp{.}, and vice versa. Other observed values are @samp{'} (apostrophe), @samp{ } (space), and zero (presumably indicating that digits should not be grouped). @code{n-ccs} is observed as either 0 or 5. When it is 5, the following strings are CCA through CCE format strings. @xref{Custom Currency Formats,,, pspp, PSPP}. Most commonly these are all @code{-,,,} but other strings occur. @subsubheading X0 X0 only appears, optionally, in version 1 members. @example X0 => byte*14 Y1 Y2 Y1 => string[command] string[command-local] string[language] string[charset] string[locale] bool bool bool bool Y0 Y2 => CustomCurrency byte[missing] bool[x17] @end example @code{command} describes the statistical procedure that generated the output, in English. It is not necessarily the literal syntax name of the procedure: for example, NPAR TESTS becomes ``Nonparametric Tests.'' @code{command-local} is the procedure's name, translated into the output language; it is often empty and, when it is not, sometimes the same as @code{command}. @code{dataset} is the name of the dataset analyzed to produce the output, e.g.@: @code{DataSet1}, and @code{datafile} the name of the file it was read from, e.g.@: @file{C:\Users\foo\bar.sav}. The latter is sometimes the empty string. @code{missing} is the character used to indicate that a cell contains a missing value. It is always observed as @samp{.}. X0 repeats @code{decimal}, @code{grouping}, CustomCurrency, and @code{missing} already included in Formats. A writer may safely use false for @code{x17}. @subsubheading X1 X1 only appears in version 3 members. @example X1 => bool byte[x15] bool[x16] byte[lang] byte[show-variables] byte[show-values] int32[x18] int32[x19] 00*17 bool[x20] bool[show-caption] @end example @code{lang} may indicate the language in use. Some values seem to be 0: @t{en}, 1: @t{de}, 2: @t{es}, 3: @t{it}, 5: @t{ko}, 6: @t{pl}, 8: @t{zh-tw}, 10: @t{pt_BR}, 11: @t{fr}. The @code{locale} in Formats and the @code{language}, @code{charset}, and @code{locale} in X0 are more likely to be useful in practice. @code{show-variables} determines how variables are displayed by default. A value of 1 means to display variable names, 2 to display variable labels when available, 3 to display both (name followed by label, separated by a space). The most common value is 0, which probably means to use a global default. @code{show-values} is a similar setting for values. A value of 1 means to display the value, 2 to display the value label when available, 3 to display both. Again, the most common value is 0, which probably means to use a global default. @code{show-caption} is true to show the caption, false to hide it. A writer may safely use false for @code{x14}, 1 for @code{x15}, false for @code{x16}, -1 for @code{x18} and @code{x19}, and false for @code{x20}. @subsubheading X2 X2 only appears in version 3 members. @example X2 => int32[n-row-heights] int32*[n-row-heights] int32[n-style-map] StyleMap*[n-style-map] int32[n-styles] StylePair*[n-styles] count((i0 i0)?) StyleMap => int64[cell-index] int16[style-index] @end example If present, @code{n-row-heights} and the accompanying integers are row heights as manually adjusted by the user. The rest of X2 specifies styles for data cells. At first glance this is odd, because each data cell can have its own style embedded as part of the data, but in practice X2 specifies a style for a cell only if that cell is empty (and thus does not appear in the data at all). Each StyleMap specifies the index of a blank cell, calculated the same was as in the Cells (@pxref{SPV Light Member Cells}), along with a 0-based index into the accompanying StylePair array. A writer may safely omit the optional @code{i0 i0} inside the @code{count(@dots{})}. @subsubheading X3 X3 only appears in version 3 members. @example X3 => 01 00 byte[x21] 00 00 00 Y1 double[small] 01 (string[dataset] string[datafile] i0 int32[date] i0)? Y2 (int32[x22] i0)? @end example @code{date} is a date, as seconds since the epoch, i.e.@: since January 1, 1970. Pivot tables within an SPV file often have dates a few minutes apart, so this is probably a creation date for the table rather than for the file. X3 repeats @code{decimal}, @code{grouping}, CustomCurrency, and @code{missing} already included in Formats. @code{command}, @code{command-local}, @code{language}, @code{charset}, and @code{locale} have the same meaning as in X0. @code{small} is a small real number, e.g.@: .001. Numbers smaller than this in absolute value are displayed in scientific notation. Sometimes @code{dataset}, @code{datafile}, and @code{date} are present and other times they are absent. The reader can distinguish by assuming that they are present and then checking whether the presumptive @code{dataset} contains a null byte (a valid string never will). @code{x22} is usually 0 or 2000000. A writer may safely use 4 for @code{x21} and omit @code{x22} and the other optional bytes at the end. @node SPV Light Member Dimensions @subsection Dimensions A pivot table presents multidimensional data. A Dimension identifies the categories associated with each dimension. @example Dimensions => int32[n-dims] Dimension*[n-dims] Dimension => Value[name] DimProperties int32[n-categories] Category*[n-categories] DimProperties => byte[x1] byte[x2] int32[x3] bool[hide-dim-label] bool[hide-all-labels] 01 int32[dim-index] @end example @code{name} is the name of the dimension, e.g.@: @code{Variables}, @code{Statistics}, or a variable name. The meanings of @code{x1} and @code{x3} are unknown. @code{x1} is usually 0 but many other values have been observed. A writer may safely use 0 for @code{x1} and 2 for @code{x3}. @code{x2} is 0, 1, or 2. For a pivot table with @var{L} layer dimensions, @var{R} row dimensions, and @var{C} column dimensions, @code{x2} is 2 for the first @var{L} dimensions, 0 for the next @var{R} dimensions, and 1 for the remaining @var{C} dimensions. This does not mean that the layer dimensions must be presented first, followed by the row dimensions, followed by the column dimensions---on the contrary, they are frequently in a different order---but @code{x2} must follow this pattern to prevent the pivot table from being misinterpreted. If @code{hide-dim-label} is 00, the pivot table displays a label for the dimension itself. Because usually the group and category labels are enough explanation, it is usually 01. If @code{hide-all-labels} is 01, the pivot table omits all labels for the dimension, including group and category labels. It is usually 00. When @code{hide-all-labels} is 01, @code{show-dim-label} is ignored. @code{dim-index} is usually the 0-based index of the dimension, e.g.@: 0 for the first dimension, 1 for the second, and so on. Sometimes it is -1. There is no visible difference. @node SPV Light Member Categories @subsection Categories Categories are arranged in a tree. Only the leaf nodes in the tree are really categories; the others just serve as grouping constructs. @example Category => Value[name] (Leaf @math{|} Group) Leaf => 00 00 00 i2 int32[leaf-index] i0 Group => bool[merge] 00 01 int32[x23] i-1 int32[n-subcategories] Category*[n-subcategories] @end example @code{name} is the name of the category (or group). A Leaf represents a leaf category. The Leaf's @code{leaf-index} is a nonnegative integer unique within the Dimension and less than @code{n-categories} in the Dimension. If the user does not sort or rearrange the categories, then @code{leaf-index} starts at 0 for the first Leaf in the dimension and increments by 1 with each successive Leaf. If the user does sorts or rearrange the categories, then the order of categories in the file reflects that change and @code{leaf-index} reflects the original order. Occasionally a dimension has no leaf categories at all. A table that contains such a dimension necessarily has no data at all. A Group is a group of nested categories. Usually a Group contains at least one Category, so that @code{n-subcategories} is positive, but a few Groups with @code{n-subcategories} 0 has been observed. If a Group's @code{merge} is 00, the most common value, then the group is really a distinct group that should be represented as such in the visual representation and user interface. If @code{merge} is 01, the categories in this group should be shown and treated as if they were direct children of the group's containing group (or if it has no parent group, then direct children of the dimension), and this group's name is irrelevant and should not be displayed. (Merged groups can be nested!) (For writing an SPV file, there is no need to use the @code{merge} feature unless it is convenient.) A Group's @code{x23} appears to be i2 when all of the categories within a group are leaf categories that directly represent data values for a variable (e.g.@: in a frequency table or crosstabulation, a group of values in a variable being tabulated) and i0 otherwise. A writer may safely write a constant 0 in this field. @node SPV Light Member Axes @subsection Axes After the dimensions come assignment of each dimension to one of the axes: layers, rows, and columns. @example Axes => int32[n-layers] int32[n-rows] int32[n-columns] int32*[n-layers] int32*[n-rows] int32*[n-columns] @end example The values of @code{n-layers}, @code{n-rows}, and @code{n-columns} each specifies the number of dimensions displayed in layers, rows, and columns, respectively. Any of them may be zero. Their values sum to @code{n-dimensions} from Dimensions (@pxref{SPV Light Member Dimensions}). The following @code{n-dimensions} integers, in three groups, are a permutation of the 0-based dimension numbers. The first @code{n-layers} integers specify each of the dimensions represented by layers, the next @code{n-rows} integers specify the dimensions represented by rows, and the final @code{n-columns} integers specify the dimensions represented by columns. When there is more than one dimension of a given kind, the inner dimensions are given first. @node SPV Light Member Cells @subsection Cells The final part of an SPV light member contains the actual data. @example Cells => int32[n-cells] Cell*[n-cells] Cell => int64[index] v1(00?) Value @end example A Cell consists of an @code{index} and a Value. Suppose there are @math{d} dimensions, numbered 1 through @math{d} in the order given in the Dimensions previously, and that dimension @math{i}, has @math{n_i} categories. Consider the cell at coordinates @math{x_i}, @math{1 \le i \le d}, and note that @math{0 \le x_i < n_i}. Then the index is calculated by the following algorithm: @display let @i{index} = 0 for each @math{i} from 1 to @math{d}: @i{index} = (@math{n_i \times} @i{index}) @math{+} @math{x_i} @end display For example, suppose there are 3 dimensions with 3, 4, and 5 categories, respectively. The cell at coordinates (1, 2, 3) has index @math{5 \times (4 \times (3 \times 0 + 1) + 2) + 3 = 33}. Within a given dimension, the index is the @code{leaf-index} in a Leaf. @node SPV Light Member Value @subsection Value Value is used throughout the SPV light member format. It boils down to a number or a string. @example Value => 00? 00? 00? 00? RawValue RawValue => 01 ValueMod int32[format] double[x] @math{|} 02 ValueMod int32[format] double[x] string[var-name] string[value-label] byte[show] @math{|} 03 string[local] ValueMod string[id] string[c] bool[fixed] @math{|} 04 ValueMod int32[format] string[value-label] string[var-name] byte[show] string[s] @math{|} 05 ValueMod string[var-name] string[var-label] byte[show] @math{|} ValueMod string[template] int32[n-args] Argument*[n-args] Argument => i0 Value @math{|} int32[x] i0 Value*[x] /* x > 0 */ @end example There are several possible encodings, which one can distinguish by the first nonzero byte in the encoding. @table @asis @item 01 The numeric value @code{x}, intended to be presented to the user formatted according to @code{format}, which is in the format described for system files, except that format 40 is a synonym for F format instead of MTIME. @xref{System File Output Formats}, for details. Most commonly, @code{format} has width 40 (the maximum). An @code{x} with the maximum negative double value @code{-DBL_MAX} represents the system-missing value SYSMIS. (HIGHEST and LOWEST have not been observed.) @xref{System File Format}, for more about these special values. @item 02 Similar to @code{01}, with the additional information that @code{x} is a value of variable @code{var-name} and has value label @code{value-label}. Both @code{var-name} and @code{value-label} can be the empty string, the latter very commonly. @code{show} determines whether to show the numeric value or the value label. A value of 1 means to show the value, 2 to show the label, 3 to show both, and 0 means to use the default specified in @code{show-values} (@pxref{SPV Light Member Formats}). @item 03 A text string, in two forms: @code{c} is in English, and sometimes abbreviated or obscure, and @code{local} is localized to the user's locale. In an English-language locale, the two strings are often the same, and in the cases where they differ, @code{local} is more appropriate for a user interface, e.g.@: @code{c} of ``Not a PxP table for MCN...'' versus @code{local} of ``Computed only for a PxP table, where P must be greater than 1.'' @code{c} and @code{local} are always either both empty or both nonempty. @code{id} is a brief identifying string whose form seems to resemble a programming language identifier, e.g.@: @code{cumulative_percent} or @code{factor_14}. It is not unique. @code{fixed} is 00 for text taken from user input, such as syntax fragment, expressions, file names, data set names, and 01 for fixed text strings such as names of procedures or statistics. In the former case, @code{id} is always the empty string; in the latter case, @code{id} is still sometimes empty. @item 04 The string value @code{s}, intended to be presented to the user formatted according to @code{format}. The format for a string is not too interesting, and the corpus contains many clearly invalid formats like A16.39 or A255.127 or A134.1, so readers should probably ignore the format entirely. @code{s} is a value of variable @code{var-name} and has value label @code{value-label}. @code{var-name} is never empty but @code{value-label} is commonly empty. @code{show} has the same meaning as in the encoding for 02. @item 05 Variable @code{var-name}, which is rarely observed as empty in the corpus, with variable label @code{var-label}, which is often empty. @code{show} determines whether to show the variable name or the variable label. A value of 1 means to show the name, 2 to show the label, 3 to show both, and 0 means to use the default specified in @code{show-variables} (@pxref{SPV Light Member Formats}). @item otherwise When the first byte of a RawValue is not one of the above, the RawValue starts with a ValueMod, whose syntax is described in the next section. (A ValueMod always begins with byte 31 or 58.) This case is a template string, analogous to @code{printf}, followed by one or more Arguments, each of which has one or more values. The template string is copied directly into the output except for the following special syntax, @table @code @item \% @itemx \: @itemx \[ @itemx \] Each of these expands to the character following @samp{\\}, to escape characters that have special meaning in template strings. These are effective inside and outside the @code{[@dots{}]} syntax forms described below. @item \n Expands to a new-line, inside or outside the @code{[@dots{}]} forms described below. @item ^@var{i} Expands to a formatted version of argument @var{i}, which must have only a single value. For example, @code{^1} expands to the first argument's @code{value}. @item [:@var{a}:]@var{i} Expands @var{a} for each of the values in @var{i}. @var{a} should contain one or more @code{^@var{j}} conversions, which are drawn from the values for argument @var{i} in order. Some examples from the corpus: @table @code @item [:^1:]1 All of the values for the first argument, concatenated. @item [:^1\n:]1 Expands to the values for the first argument, each followed by a new-line. @item [:^1 = ^2:]2 Expands to @code{@var{x} = @var{y}} where @var{x} is the second argument's first value and @var{y} is its second value. (This would be used only if the argument has two values. If there were more values, the second and third values would be directly concatenated, which would look funny.) @end table @item [@var{a}:@var{b}:]@var{i} This extends the previous form so that the first values are expanded using @var{a} and later values are expanded using @var{b}. For an unknown reason, within @var{a} the @code{^@var{j}} conversions are instead written as @code{%@var{j}}. Some examples from the corpus: @table @code @item [%1:*^1:]1 Expands to all of the values for the first argument, separated by @samp{*}. @item [%1 = %2:, ^1 = ^2:]1 Given appropriate values for the first argument, expands to @code{X = 1, Y = 2, Z = 3}. @item [%1:, ^1:]1 Given appropriate values, expands to @code{1, 2, 3}. @end table @end table The template string is localized to the user's locale. @end table A writer may safely omit all of the optional 00 bytes at the beginning of a Value, except that it should write a single 00 byte before a templated Value. @node SPV Light Member ValueMod @subsection ValueMod A ValueMod can specify special modifications to a Value. @example ValueMod => 58 @math{|} 31 int32[n-refs] int16*[n-refs] int32[n-subscripts] string*[n-subscripts] v1(00 (i1 | i2) 00? 00? int32 00? 00?) v3(count(TemplateString StylePair)) TemplateString => count((count((i0 (58 @math{|} 31 55))?) (58 @math{|} 31 string[id]))?) StylePair => (31 FontStyle | 58) (31 CellStyle | 58) FontStyle => bool[bold] bool[italic] bool[underline] bool[show] string[fg-color] string[bg-color] string[typeface] byte[size] CellStyle => int32[halign] int32[valign] double[decimal-offset] int16[left-margin] int16[right-margin] int16[top-margin] int16[bottom-margin] @end example A ValueMod that begins with ``31'' specifies special modifications to a Value. Each of the @code{n-refs} integers is a reference to a Footnote (@pxref{SPV Light Member Footnotes}) by 0-based index. Footnote markers are shown appended to the main text of the Value, as superscripts. The @code{subscripts}, if present, are strings to append to the main text of the Value, as subscripts. Each subscript text is a brief indicator, e.g.@: @samp{a} or @samp{b}, with its meaning indicated by the table caption. When multiple subscripts are present, they are displayed separated by commas. The @code{id} inside the TemplateString, if present, is a template string for substitutions using the syntax explained previously. It appears to be an English-language version of the localized template string in the Value in which the Template is nested. A writer may safely omit the optional fixed data in TemplateString. FontStyle and CellStyle, if present, change the style for this individual Value. In FontStyle, @code{bold}, @code{italic}, and @code{underline} control the particular style. @code{show} is ordinarily 1; if it is 0, then the cell data is not shown. @code{fg-color} and @code{bg-color} are strings in the format @code{#rrggbb}, e.g.@: @code{#ff0000} for red or @code{#ffffff} for white. The empty string is occasionally observed also. The @code{size} is a font size in units of 1/128 inch. In CellStyle, @code{halign} is 0 for center, 2 for left, 4 for right, 6 for decimal, 0xffffffad for mixed. For decimal alignment, @code{decimal-offset} is the decimal point's offset from the right side of the cell, in pt (@pxref{SPV Light Detail Member Format}). @code{valign} specifies vertical alignment: 0 for center, 1 for top, 3 for bottom. @code{left-margin}, @code{right-margin}, @code{top-margin}, and @code{bottom-margin} are in pt. @node SPV Legacy Detail Member Binary Format @section Legacy Detail Member Binary Format Whereas the light binary format represents everything about a given pivot table, the legacy binary format conceptually consists of a number of named sources, each of which consists of a number of named variables, each of which is a 1-dimensional array of numbers or strings or a mix. Thus, the legacy binary member format is quite simple. This section uses the same context-free grammar notation as in the previous section, with the following additions: @table @asis @item vAF(@var{x}) In a version 0xaf legacy member, @var{x}; in other versions, nothing. (The legacy member header indicates the version; see below.) @item vB0(@var{x}) In a version 0xb0 legacy member, @var{x}; in other versions, nothing. @end table A legacy detail member @file{.bin} has the following overall format: @example LegacyBinary => 00 byte[version] int16[n-sources] int32[member-size] Metadata*[n-sources] #Data*[n-sources] #Strings? @end example @code{version} is a version number that affects the interpretation of some of the other data in the member. Versions 0xaf and 0xb0 are known. We will refer to ``version 0xaf'' and ``version 0xb0'' members later on. A legacy member consists of @code{n-sources} data sources, each of which has Metadata and Data. @code{member-size} is the size of the legacy binary member, in bytes. The Data and Strings above are commented out because the Metadata has some oddities that mean that the Data sometimes seems to start at an unexpected place. The following section goes into detail. @menu * SPV Legacy Member Metadata:: * SPV Legacy Member Numeric Data:: * SPV Legacy Member String Data:: @end menu @node SPV Legacy Member Metadata @subsection Metadata @example Metadata => int32[n-values] int32[n-variables] int32[data-offset] vAF(byte*28[source-name]) vB0(byte*64[source-name] int32[x]) @end example A data source has @code{n-variables} variables, each with @code{n-values} data values. @code{source-name} is a 28- or 64-byte string padded on the right with 0-bytes. The names that appear in the corpus are very generic: usually @code{tableData} for pivot table data or @code{source0} for chart data. A given Metadata's @code{data-offset} is the offset, in bytes, from the beginning of the member to the start of the corresponding Data. This allows programs to skip to the beginning of the data for a particular source. In every case in the corpus, the Data follow the Metadata in the same order, but it is important to use @code{data-offset} instead of reading sequentially through the file because of the exception described below. One SPV file in the corpus has legacy binary members with version 0xb0 but a 28-byte @code{source-name} field (and only a single source). In practice, this means that the 64-byte @code{source-name} used in version 0xb0 has a lot of 0-bytes in the middle followed by the @code{variable-name} of the following Data. As long as a reader treats the first 0-byte in the @code{source-name} as terminating the string, it can properly interpret these members. The meaning of @code{x} in version 0xb0 is unknown. @node SPV Legacy Member Numeric Data @subsection Numeric Data @example Data => Variable*[n-variables] Variable => byte*288[variable-name] double*[n-values] @end example Data follow the Metadata in the legacy binary format, with sources in the same order (but readers should use the @code{data-offset} in Metadata records, rather than reading sequentially). Each Variable begins with a @code{variable-name} that generally indicates its role in the pivot table, e.g.@: ``cell'', ``cellFormat'', ``dimension0categories'', ``dimension0group0'', followed by the numeric data, one double per datum. A double with the maximum negative double @code{-DBL_MAX} represents the system-missing value SYSMIS. @node SPV Legacy Member String Data @subsection String Data @example Strings => SourceMaps[maps] Labels SourceMaps => int32[n-maps] SourceMap*[n-maps] SourceMap => string[source-name] int32[n-variables] VariableMap*[n-variables] VariableMap => string[variable-name] int32[n-data] DatumMap*[n-data] DatumMap => int32[value-idx] int32[label-idx] Labels => int32[n-labels] Label*[n-labels] Label => int32[frequency] string[label] @end example Each variable may include a mix of numeric and string data values. If a legacy binary member contains any string data, Strings is present; otherwise, it ends just after the last Data element. The string data overlays the numeric data. When a variable includes any string data, its Variable represents the string values with a SYSMIS or NaN placeholder. (Not all such values need be placeholders.) Each SourceMap provides a mapping between SYSMIS or NaN values in source @code{source-name} and the string data that they represent. @code{n-variables} is the number of variables in the source that include string data. More precisely, it is the 1-based index of the last variable in the source that includes any string data; thus, it would be 4 if there are 5 variables and only the fourth one includes string data. A VariableMap repeats its variable's name, but variables are always present in the same order as the source, starting from the first variable, without skipping any even if they have no string values. Each VariableMap contains DatumMap nonterminals, each of which maps from a 0-based index within its variable's data to a 0-based label index, e.g.@: pair @code{value-idx} = 2, @code{label-idx} = 3, means that the third data value (which must be SYSMIS or NaN) is to be replaced by the string of the fourth Label. The labels themselves follow the pairs. The valuable part of each label is the string @code{label}. Each label also includes a @code{frequency} that reports the number of DatumMaps that reference it (although this is not useful). @node SPV Legacy Detail Member XML Format @section Legacy Detail Member XML Format The design of the detail XML format is not what one would end up with for describing pivot tables. This is because it is a special case of a much more general format (``visualization XML'' or ``VizML'') that can describe a wide range of visualizations. Most of this generality is overkill for tables, and so we end up with a funny subset of a general-purpose format. An XML Schema for VizML is available, distributed with SPSS binaries, under a nonfree license. It contains documentation that is occasionally helpful. This section describes the detail XML format using the same notation already used for the structure XML format (@pxref{SPV Structure Member Format}). See @file{src/output/spv/detail-xml.grammar} in the PSPP source tree for the full grammar that it uses for parsing. The important elements of the detail XML format are: @itemize @bullet @item Variables. @xref{SPV Detail Variable Elements}. @item Assignment of variables to axes. A variable can appear as columns, or rows, or layers. The @code{faceting} element and its sub-elements describe this assignment. @item Styles and other annotations. @end itemize This description is not detailed enough to write legacy tables. Instead, write tables in the light binary format. @menu * SPV Detail visualization Element:: * SPV Detail Variable Elements:: * SPV Detail extension Element:: * SPV Detail graph Element:: * SPV Detail location Element:: * SPV Detail faceting Element:: * SPV Detail facetLayout Element:: * SPV Detail label Element:: * SPV Detail setCellProperties Element:: * SPV Detail setFormat Element:: * SPV Detail interval Element:: * SPV Detail style Element:: * SPV Detail labelFrame Element:: * SPV Detail Legacy Properties:: @end menu @node SPV Detail visualization Element @subsection The @code{visualization} Element @example visualization :creator :date :lang :name :style[style_ref]=ref style :type :version :schemaLocation? => visualization_extension? userSource (sourceVariable | derivedVariable)+ categoricalDomain? graph labelFrame[lf1]* container? labelFrame[lf2]* style+ layerController? extension[visualization_extension] :numRows=int? :showGridline=bool? :minWidthSet=(true)? :maxWidthSet=(true)? => EMPTY userSource :missing=(listwise | pairwise)? => EMPTY categoricalDomain => variableReference simpleSort simpleSort :method[sort_method]=(custom) => categoryOrder container :style=ref style => container_extension? location+ labelFrame* extension[container_extension] :combinedFootnotes=(true) => EMPTY layerController :source=(tableData) :target=ref label? => EMPTY @end example The @code{visualization} element is the root of detail XML member. It has the following attributes: @defvr {Attribute} creator The version of the software that created this SPV file, as a string of the form @code{xxyyzz}, which represents software version xx.yy.zz, e.g.@: @code{160001} is version 16.0.1. The corpus includes major versions 16 through 19. @end defvr @defvr {Attribute} date The date on the which the file was created, as a string of the form @code{YYYY-MM-DD}. @end defvr @defvr {Attribute} lang The locale used for output, in Windows format, which is similar to the format used in Unix with the underscore replaced by a hyphen, e.g.@: @code{en-US}, @code{en-GB}, @code{el-GR}, @code{sr-Cryl-RS}. @end defvr @defvr {Attribute} name The title of the pivot table, localized to the output language. @end defvr @defvr {Attribute} style The base style for the pivot table. In every example in the corpus, the @code{style} element has no attributes other than @code{id}. @end defvr @defvr {Attribute} type A floating-point number. The meaning is unknown. @end defvr @defvr {Attribute} version The visualization schema version number. In the corpus, the value is one of 2.4, 2.5, 2.7, and 2.8. @end defvr The @code{userSource} element has no visible effect. The @code{extension} element as a child of @code{visualization} has the following attributes. @defvr {Attribute} numRows An integer that presumably defines the number of rows in the displayed pivot table. @end defvr @defvr {Attribute} showGridline Always set to @code{false} in the corpus. @end defvr @defvr {Attribute} minWidthSet @defvrx {Attribute} maxWidthSet Always set to @code{true} in the corpus. @end defvr The @code{extension} element as a child of @code{container} has the following attribute @defvr {Attribute} combinedFootnotes Meaning unknown. @end defvr The @code{categoricalDomain} and @code{simpleSort} elements have no visible effect. The @code{layerController} element has no visible effect. @node SPV Detail Variable Elements @subsection Variable Elements A ``variable'' in detail XML is a 1-dimensional array of data. Each element of the array may, independently, have string or numeric content. All of the variables in a given detail XML member either have the same number of elements or have zero elements. Two different elements define variables and their content: @table @code @item sourceVariable These variables' data comes from the associated @code{tableData.bin} member. @item derivedVariable These variables are defined in terms of a mapping function from a source variable, or they are empty. @end table A variable named @code{cell} always exists. This variable holds the data displayed in the table. Variables in detail XML roughly correspond to the dimensions in a light detail member. Each dimension has the following variables with stylized names, where @var{n} is a number for the dimension starting from 0: @table @code @item dimension@var{n}categories The dimension's leaf categories (@pxref{SPV Light Member Categories}). @item dimension@var{n}group0 Present only if the dimension's categories are grouped, this variable holds the group labels for the categories. Grouping is inferred through adjacent identical labels. Categories that are not part of a group have empty-string data in this variable. @item dimension@var{n}group1 Present only if the first-level groups are further grouped, this variable holds the labels for the second-level groups. There can be additional variables with further levels of grouping. @item dimension@var{n} An empty variable. @end table Determining the data for a (non-empty) variable is a multi-step process: @enumerate @item Draw initial data from its source, for a @code{sourceVariable}, or from another named variable, for a @code{derivedVariable}. @item Apply mappings from @code{valueMapEntry} elements within the @code{derivedVariable} element, if any. @item Apply mappings from @code{relabel} elements within a @code{format} or @code{stringFormat} element in the @code{sourceVariable} or @code{derivedVariable} element, if any. @item If the variable is a @code{sourceVariable} with a @code{labelVariable} attribute, and there were no mappings to apply in previous steps, then replace each element of the variable by the corresponding value in the label variable. @end enumerate A single variable's data can be modified in two of the steps, if both @code{valueMapEntry} and @code{relabel} are used. The following example from the corpus maps several integers to 2, then maps 2 in turn to the string ``Input'': @example @end example @menu * SPV Detail sourceVariable Element:: * SPV Detail derivedVariable Element:: * SPV Detail valueMapEntry Element:: @end menu @node SPV Detail sourceVariable Element @subsubsection The @code{sourceVariable} Element @example sourceVariable :id :categorical=(true) :source :domain=ref categoricalDomain? :sourceName :dependsOn=ref sourceVariable? :label? :labelVariable=ref sourceVariable? => variable_extension* (format | stringFormat)? @end example This element defines a variable whose data comes from the @file{tableData.bin} member that corresponds to this @file{.xml}. This element has the following attributes. @defvr {Attribute} id An @code{id} is always present because this element exists to be referenced from other elements. @end defvr @defvr {Attribute} categorical Always set to @code{true}. @end defvr @defvr {Attribute} source Always set to @code{tableData}, the @code{source-name} in the corresponding @file{tableData.bin} member (@pxref{SPV Legacy Member Metadata}). @end defvr @defvr {Attribute} sourceName The name of a variable within the source, corresponding to the @code{variable-name} in the @file{tableData.bin} member (@pxref{SPV Legacy Member Numeric Data}). @end defvr @defvr {Attribute} label The variable label, if any. @end defvr @defvr {Attribute} labelVariable The @code{variable-name} of a variable whose string values correspond one-to-one with the values of this variable and are suitable for use as value labels. @end defvr @defvr {Attribute} dependsOn This attribute doesn't affect the display of a table. @end defvr @node SPV Detail derivedVariable Element @subsubsection The @code{derivedVariable} Element @example derivedVariable :id :categorical=(true) :value :dependsOn=ref sourceVariable? => variable_extension* (format | stringFormat)? valueMapEntry* @end example Like @code{sourceVariable}, this element defines a variable whose values can be used elsewhere in the visualization. Instead of being read from a data source, the variable's data are defined by a mathematical expression. This element has the following attributes. @defvr {Attribute} id An @code{id} is always present because this element exists to be referenced from other elements. @end defvr @defvr {Attribute} categorical Always set to @code{true}. @end defvr @defvr {Attribute} value An expression that defines the variable's value. In theory this could be an arbitrary expression in terms of constants, functions, and other variables, e.g.@: @math{(@var{var1} + @var{var2}) / 2}. In practice, the corpus contains only the following forms of expressions: @table @code @item constant(0) @itemx constant(@var{variable}) All zeros. The reason why a variable is sometimes named is unknown. Sometimes the ``variable name'' has spaces in it. @item map(@var{variable}) Transforms the values in the named @var{variable} using the @code{valueMapEntry}s contained within the element. @end table @end defvr @defvr {Attribute} dependsOn This attribute doesn't affect the display of a table. @end defvr @node SPV Detail valueMapEntry Element @subsubsection The @code{valueMapEntry} Element @example valueMapEntry :from :to => EMPTY @end example A @code{valueMapEntry} element defines a mapping from one or more values of a source expression to a target value. (In the corpus, the source expression is always just the name of a variable.) Each target value requires a separate @code{valueMapEntry}. If multiple source values map to the same target value, they can be combined or separate. In the corpus, all of the source and target values are integers. @code{valueMapEntry} has the following attributes. @defvr {Attribute} from A source value, or multiple source values separated by semicolons, e.g.@: @code{0} or @code{13;14;15;16}. @end defvr @defvr {Attribute} to The target value, e.g.@: @code{0}. @end defvr @node SPV Detail extension Element @subsection The @code{extension} Element This is a general-purpose ``extension'' element. Readers that don't understand a given extension should be able to safely ignore it. The attributes on this element, and their meanings, vary based on the context. Each known usage is described separately below. The current extensions use attributes exclusively, without any nested elements. @subsubheading @code{container} Parent Element @example extension[container_extension] :combinedFootnotes=(true) => EMPTY @end example With @code{container} as its parent element, @code{extension} has the following attributes. @defvr {Attribute} combinedFootnotes Always set to @code{true} in the corpus. @end defvr @subsubheading @code{sourceVariable} and @code{derivedVariable} Parent Element @example extension[variable_extension] :from :helpId => EMPTY @end example With @code{sourceVariable} or @code{derivedVariable} as its parent element, @code{extension} has the following attributes. A given parent element often contains several @code{extension} elements that specify the meaning of the source data's variables or sources, e.g.@: @example @end example More commonly they are less helpful, e.g.@: @example @end example @defvr {Attribute} from An integer or a name like ``dimension0''. @end defvr @defvr {Attribute} helpId An identifier. @end defvr @node SPV Detail graph Element @subsection The @code{graph} Element @example graph :cellStyle=ref style :style=ref style => location+ coordinates faceting facetLayout interval coordinates => EMPTY @end example @code{graph} has the following attributes. @defvr {Attribute} cellStyle @defvrx {Attribute} style Each of these is the @code{id} of a @code{style} element (@pxref{SPV Detail style Element}). The former is the default style for individual cells, the latter for the entire table. @end defvr @node SPV Detail location Element @subsection The @code{location} Element @example location :part=(height | width | top | bottom | left | right) :method=(sizeToContent | attach | fixed | same) :min=dimension? :max=dimension? :target=ref (labelFrame | graph | container)? :value? => EMPTY @end example Each instance of this element specifies where some part of the table frame is located. All the examples in the corpus have four instances of this element, one for each of the parts @code{height}, @code{width}, @code{left}, and @code{top}. Some examples in the corpus add a fifth for part @code{bottom}, even though it is not clear how all of @code{top}, @code{bottom}, and @code{height} can be honored at the same time. In any case, @code{location} seems to have little importance in representing tables; a reader can safely ignore it. @defvr {Attribute} part The part of the table being located. @end defvr @defvr {Attribute} method How the location is determined: @table @code @item sizeToContent Based on the natural size of the table. Observed only for parts @code{height} and @code{width}. @item attach Based on the location specified in @code{target}. Observed only for parts @code{top} and @code{bottom}. @item fixed Using the value in @code{value}. Observed only for parts @code{top}, @code{bottom}, and @code{left}. @item same Same as the specified @code{target}. Observed only for part @code{left}. @end table @end defvr @defvr {Attribute} min Minimum size. Only observed with value @code{100pt}. Only observed for part @code{width}. @end defvr @defvr {Dependent} target Required when @code{method} is @code{attach} or @code{same}, not observed otherwise. This identifies an element to attach to. Observed with the ID of @code{title}, @code{footnote}, @code{graph}, and other elements. @end defvr @defvr {Dependent} value Required when @code{method} is @code{fixed}, not observed otherwise. Observed values are @code{0%}, @code{0px}, @code{1px}, and @code{3px} on parts @code{top} and @code{left}, and @code{100%} on part @code{bottom}. @end defvr @node SPV Detail faceting Element @subsection The @code{faceting} Element @example faceting => layer[layers1]* cross layer[layers2]* cross => (unity | nest) (unity | nest) unity => EMPTY nest => variableReference[vars]+ variableReference :ref=ref (sourceVariable | derivedVariable) => EMPTY layer :variable=ref (sourceVariable | derivedVariable) :value :visible=bool? :method[layer_method]=(nest)? :titleVisible=bool? => EMPTY @end example The @code{faceting} element describes the row, column, and layer structure of the table. Its @code{cross} child determines the row and column structure, and each @code{layer} child (if any) represents a layer. Layers may appear before or after @code{cross}. The @code{cross} element describes the row and column structure of the table. It has exactly two children, the first of which describes the table's columns and the second the table's rows. Each child is a @code{nest} element if the table has any dimensions along the axis in question, otherwise a @code{unity} element. A @code{nest} element contains of one or more dimensions listed from innermost to outermost, each represented by @code{variableReference} child elements. Each variable in a dimension is listed in order. @xref{SPV Detail Variable Elements}, for information on the variables that comprise a dimension. A @code{nest} can contain a single dimension, e.g.: @example @end example @noindent A @code{nest} can contain multiple dimensions, e.g.: @example @end example A @code{nest} may have no dimensions, in which case it still has one @code{variableReference} child, which references a @code{derivedVariable} whose @code{value} attribute is @code{constant(0)}. In the corpus, such a @code{derivedVariable} has @code{row} or @code{column}, respectively, as its @code{id}. This is equivalent to using a @code{unity} element in place of @code{nest}. A @code{variableReference} element refers to a variable through its @code{ref} attribute. Each @code{layer} element represents a dimension, e.g.: @example @end example @noindent @code{layer} has the following attributes. @defvr {Attribute} variable Refers to a @code{sourceVariable} or @code{derivedVariable} element. @end defvr @defvr {Attribute} value The value to select. For a category variable, this is always @code{0}; for a data variable, it is the same as the @code{variable} attribute. @end defvr @defvr {Attribute} visible Whether the layer is visible. Generally, category layers are visible and data layers are not, but sometimes this attribute is omitted. @end defvr @defvr {Attribute} method When present, this is always @code{nest}. @end defvr @node SPV Detail facetLayout Element @subsection The @code{facetLayout} Element @example facetLayout => tableLayout setCellProperties[scp1]* facetLevel+ setCellProperties[scp2]* tableLayout :verticalTitlesInCorner=bool :style=ref style? :fitCells=(ticks both)? => EMPTY @end example The @code{facetLayout} element and its descendants control styling for the table. Its @code{tableLayout} child has the following attributes @defvr {Attribute} verticalTitlesInCorner If true, in the absence of corner text, row headings will be displayed in the corner. @end defvr @defvr {Attribute} style Refers to a @code{style} element. @end defvr @defvr {Attribute} fitCells Meaning unknown. @end defvr @subsubheading The @code{facetLevel} Element @example facetLevel :level=int :gap=dimension? => axis axis :style=ref style => label? majorTicks majorTicks :labelAngle=int :length=dimension :style=ref style :tickFrameStyle=ref style :labelFrequency=int? :stagger=bool? => gridline? gridline :style=ref style :zOrder=int => EMPTY @end example Each @code{facetLevel} describes a @code{variableReference} or @code{layer}, and a table has one @code{facetLevel} element for each such element. For example, an SPV detail member that contains four @code{variableReference} elements and two @code{layer} elements will contain six @code{facetLevel} elements. In the corpus, @code{facetLevel} elements and the elements that they describe are always in the same order. The correspondence may also be observed in two other ways. First, one may use the @code{level} attribute, described below. Second, in the corpus, a @code{facetLevel} always has an @code{id} that is the same as the @code{id} of the element it describes with @code{_facetLevel} appended. One should not formally rely on this, of course, but it is usefully indicative. @defvr {Attribute} level A 1-based index into the @code{variableReference} and @code{layer} elements, e.g.@: a @code{facetLayout} with a @code{level} of 1 describes the first @code{variableReference} in the SPV detail member, and in a member with four @code{variableReference} elements, a @code{facetLayout} with a @code{level} of 5 describes the first @code{layer} in the member. @end defvr @defvr {Attribute} gap Always observed as @code{0pt}. @end defvr Each @code{facetLevel} contains an @code{axis}, which in turn may contain a @code{label} for the @code{facetLevel} (@pxref{SPV Detail label Element}) and does contain a @code{majorTicks} element. @defvr {Attribute} labelAngle Normally 0. The value -90 causes inner column or outer row labels to be rotated vertically. @end defvr @defvr {Attribute} style @defvrx {Attribute} tickFrameStyle Each refers to a @code{style} element. @code{style} is the style of the tick labels, @code{tickFrameStyle} the style for the frames around the labels. @end defvr @node SPV Detail label Element @subsection The @code{label} Element @example label :style=ref style :textFrameStyle=ref style? :purpose=(title | subTitle | subSubTitle | layer | footnote)? => text+ | descriptionGroup descriptionGroup :target=ref faceting :separator? => (description | text)+ description :name=(variable | value) => EMPTY text :usesReference=int? :definesReference=int? :position=(subscript | superscript)? :style=ref style => TEXT @end example This element represents a label on some aspect of the table. @defvr {Attribute} style @defvrx {Attribute} textFrameStyle Each of these refers to a @code{style} element. @code{style} is the style of the label text, @code{textFrameStyle} the style for the frame around the label. @end defvr @defvr {Attribute} purpose The kind of entity being labeled. @end defvr A @code{descriptionGroup} concatenates one or more elements to form a label. Each element can be a @code{text} element, which contains literal text, or a @code{description} element that substitutes a value or a variable name. @defvr {Attribute} target The @code{id} of an element being described. In the corpus, this is always @code{faceting}. @end defvr @defvr {Attribute} separator A string to separate the description of multiple groups, if the @code{target} has more than one. In the corpus, this is always a new-line. @end defvr Typical contents for a @code{descriptionGroup} are a value by itself: @example @end example @noindent or a variable and its value, separated by a colon: @example : @end example A @code{description} is like a macro that expands to some property of the target of its parent @code{descriptionGroup}. The @code{name} attribute specifies the property. @node SPV Detail setCellProperties Element @subsection The @code{setCellProperties} Element @example setCellProperties :applyToConverse=bool? => (setStyle | setFrameStyle | setFormat | setMetaData)* union[union_]? @end example The @code{setCellProperties} element sets style properties of cells or row or column labels. Interpreting @code{setCellProperties} requires answering two questions: which cells or labels to style, and what styles to use. @subsubheading Which Cells? @example union => intersect+ intersect => where+ | intersectWhere | alternating | EMPTY where :variable=ref (sourceVariable | derivedVariable) :include => EMPTY intersectWhere :variable=ref (sourceVariable | derivedVariable) :variable2=ref (sourceVariable | derivedVariable) => EMPTY alternating => EMPTY @end example When @code{union} is present with @code{intersect} children, each of those children specifies a group of cells that should be styled, and the total group is all those cells taken together. When @code{union} is absent, every cell is styled. One attribute on @code{setCellProperties} affects the choice of cells: @defvr {Attribute} applyToConverse If true, this inverts the meaning of the cell selection: the selected cells are the ones @emph{not} designated. This is confusing, given the additional restrictions of @code{union}, but in the corpus @code{applyToConverse} is never present along with @code{union}. @end defvr An @code{intersect} specifies restrictions on the cells to be matched. Each @code{where} child specifies which values of a given variable to include. The attributes of @code{intersect} are: @defvr {Attribute} variable Refers to a variable, e.g.@: @code{dimension0categories}. Only ``categories'' variables make sense here, but other variables, e.g.@: @code{dimension0group0map}, are sometimes seen. The reader may ignore these. @end defvr @defvr {Attribute} include A value, or multiple values separated by semicolons, e.g.@: @code{0} or @code{13;14;15;16}. @end defvr PSPP ignores @code{setCellProperties} when @code{intersectWhere} is present. @subsubheading What Styles? @example setStyle :target=ref (labeling | graph | interval | majorTicks) :style=ref style => EMPTY setMetaData :target=ref graph :key :value => EMPTY setFormat :target=ref (majorTicks | labeling) :reset=bool? => format | numberFormat | stringFormat+ | dateTimeFormat | elapsedTimeFormat setFrameStyle :style=ref style :target=ref majorTicks => EMPTY @end example The @code{set*} children of @code{setCellProperties} determine the styles to set. When @code{setCellProperties} contains a @code{setFormat} whose @code{target} references a @code{labeling} element, or if it contains a @code{setStyle} that references a @code{labeling} or @code{interval} element, the @code{setCellProperties} sets the style for table cells. The format from the @code{setFormat}, if present, replaces the cells' format. The style from the @code{setStyle} that references @code{labeling}, if present, replaces the label's font and cell styles, except that the background color is taken instead from the @code{interval}'s style, if present. When @code{setCellProperties} contains a @code{setFormat} whose @code{target} references a @code{majorTicks} element, or if it contains a @code{setStyle} whose @code{target} references a @code{majorTicks}, or if it contains a @code{setFrameStyle} element, the @code{setCellProperties} sets the style for row or column labels. In this case, the @code{setCellProperties} always contains a single @code{where} element whose @code{variable} designates the variable whose labels are to be styled. The format from the @code{setFormat}, if present, replaces the labels' format. The style from the @code{setStyle} that references @code{majorTicks}, if present, replaces the labels' font and cell styles, except that the background color is taken instead from the @code{setFrameStyle}'s style, if present. When @code{setCellProperties} contains a @code{setStyle} whose @code{target} references a @code{graph} element, and one that references a @code{labeling} element, and the @code{union} element contains @code{alternating}, the @code{setCellProperties} sets the alternate foreground and background colors for the data area. The foreground color is taken from the style referenced by the @code{setStyle} that targets the @code{graph}, the background color from the @code{setStyle} for @code{labeling}. A reader may ignore a @code{setCellProperties} that only contains @code{setMetaData}, as well as @code{setMetaData} within other @code{setCellProperties}. A reader may ignore a @code{setCellProperties} whose only @code{set*} child is a @code{setStyle} that targets the @code{graph} element. @subsubheading The @code{setStyle} Element @example setStyle :target=ref (labeling | graph | interval | majorTicks) :style=ref style => EMPTY @end example This element associates a style with the target. @defvr {Attribute} target The @code{id} of an element whose style is to be set. @end defvr @defvr {Attribute} style The @code{id} of a @code{style} element that identifies the style to set on the target. @end defvr @node SPV Detail setFormat Element @subsection The @code{setFormat} Element @example setFormat :target=ref (majorTicks | labeling) :reset=bool? => format | numberFormat | stringFormat+ | dateTimeFormat | elapsedTimeFormat @end example This element sets the format of the target, ``format'' in this case meaning the SPSS print format for a variable. The details of this element vary depending on the schema version, as declared in the root @code{visualization} element's @code{version} attribute (@pxref{SPV Detail visualization Element}). A reader can interpret the content without knowing the schema version. The @code{setFormat} element itself has the following attributes. @defvr {Attribute} target Refers to an element whose style is to be set. @end defvr @defvr {Attribute} reset If this is @code{true}, this format replaces the target's previous format. If it is @code{false}, the modifies the previous format. @end defvr @menu * SPV Detail numberFormat Element:: * SPV Detail stringFormat Element:: * SPV Detail dateTimeFormat Element:: * SPV Detail elapsedTimeFormat Element:: * SPV Detail format Element:: * SPV Detail affix Element:: @end menu @node SPV Detail numberFormat Element @subsubsection The @code{numberFormat} Element @example numberFormat :minimumIntegerDigits=int? :maximumFractionDigits=int? :minimumFractionDigits=int? :useGrouping=bool? :scientific=(onlyForSmall | whenNeeded | true | false)? :small=real? :prefix? :suffix? => affix* @end example Specifies a format for displaying a number. The available options are a superset of those available from PSPP print formats. PSPP chooses a print format type for a @code{numberFormat} as follows: @enumerate @item If @code{scientific} is @code{true}, uses @code{E} format. @item If @code{prefix} is @code{$}, uses @code{DOLLAR} format. @item If @code{suffix} is @code{%}, uses @code{PCT} format. @item If @code{useGrouping} is @code{true}, uses @code{COMMA} format. @item Otherwise, uses @code{F} format. @end enumerate For translating to a print format, PSPP uses @code{maximumFractionDigits} as the number of decimals, unless that attribute is missing or out of the range [0,15], in which case it uses 2 decimals. @defvr {Attribute} minimumIntegerDigits Minimum number of digits to display before the decimal point. Always observed as @code{0}. @end defvr @defvr {Attribute} maximumFractionDigits @defvrx {Attribute} minimumFractionDigits Maximum or minimum, respectively, number of digits to display after the decimal point. The observed values of each attribute range from 0 to 9. @end defvr @defvr {Attribute} useGrouping Whether to use the grouping character to group digits in large numbers. @end defvr @defvr {Attribute} scientific This attribute controls when and whether the number is formatted in scientific notation. It takes the following values: @table @code @item onlyForSmall Use scientific notation only when the number's magnitude is smaller than the value of the @code{small} attribute. @item whenNeeded Use scientific notation when the number will not otherwise fit in the available space. @item true Always use scientific notation. Not observed in the corpus. @item false Never use scientific notation. A number that won't otherwise fit will be replaced by an error indication (see the @code{errorCharacter} attribute). Not observed in the corpus. @end table @end defvr @defvr {Attribute} small Only present when the @code{scientific} attribute is @code{onlyForSmall}, this is a numeric magnitude below which the number will be formatted in scientific notation. The values @code{0} and @code{0.0001} have been observed. The value @code{0} seems like a pathological choice, since no real number has a magnitude less than 0; perhaps in practice such a choice is equivalent to setting @code{scientific} to @code{false}. @end defvr @defvr {Attribute} prefix @defvrx {Attribute} suffix Specifies a prefix or a suffix to apply to the formatted number. Only @code{suffix} has been observed, with value @samp{%}. @end defvr @node SPV Detail stringFormat Element @subsubsection The @code{stringFormat} Element @example stringFormat => relabel* affix* relabel :from=real :to => EMPTY @end example The @code{stringFormat} element specifies how to display a string. By default, a string is displayed verbatim, but @code{relabel} can change it. The @code{relabel} element appears as a child of @code{stringFormat} (and of @code{format}, when it is used to format strings). It specifies how to display a given value. It is used to implement value labels and to display the system-missing value in a human-readable way. It has the following attributes: @defvr {Attribute} from The value to map. In the corpus this is an integer or the system-missing value @code{-1.797693134862316E300}. @end defvr @defvr {Attribute} to The string to display in place of the value of @code{from}. In the corpus this is a wide variety of value labels; the system-missing value is mapped to @samp{.}. @end defvr @node SPV Detail dateTimeFormat Element @subsubsection The @code{dateTimeFormat} Element @example dateTimeFormat :baseFormat[dt_base_format]=(date | time | dateTime) :separatorChars? :mdyOrder=(dayMonthYear | monthDayYear | yearMonthDay)? :showYear=bool? :yearAbbreviation=bool? :showQuarter=bool? :quarterPrefix? :quarterSuffix? :showMonth=bool? :monthFormat=(long | short | number | paddedNumber)? :showWeek=bool? :weekPadding=bool? :weekSuffix? :showDayOfWeek=bool? :dayOfWeekAbbreviation=bool? :dayPadding=bool? :dayOfMonthPadding=bool? :hourPadding=bool? :minutePadding=bool? :secondPadding=bool? :showDay=bool? :showHour=bool? :showMinute=bool? :showSecond=bool? :showMillis=bool? :dayType=(month | year)? :hourFormat=(AMPM | AS_24 | AS_12)? => affix* @end example This element appears only in schema version 2.5 and earlier (@pxref{SPV Detail visualization Element}). Data to be formatted in date formats is stored as strings in legacy data, in the format @code{yyyy-mm-ddTHH:MM:SS.SSS} and must be parsed and reformatted by the reader. The following attribute is required. @defvr {Attribute} baseFormat Specifies whether a date and time are both to be displayed, or just one of them. @end defvr Many of the attributes' meanings are obvious. The following seem to be worth documenting. @defvr {Attribute} separatorChars Exactly four characters. In order, these are used for: decimal point, grouping, date separator, time separator. Always @samp{.,-:}. @end defvr @defvr {Attribute} mdyOrder Within a date, the order of the days, months, and years. @code{dayMonthYear} is the only observed value, but one would expect that @code{monthDayYear} and @code{yearMonthDay} to be reasonable as well. @end defvr @defvr {Attribute} showYear @defvrx {Attribute} yearAbbreviation Whether to include the year and, if so, whether the year should be shown abbreviated, that is, with only 2 digits. Each is @code{true} or @code{false}; only values of @code{true} and @code{false}, respectively, have been observed. @end defvr @defvr {Attribute} showMonth @defvrx {Attribute} monthFormat Whether to include the month (@code{true} or @code{false}) and, if so, how to format it. @code{monthFormat} is one of the following: @table @code @item long The full name of the month, e.g.@: in an English locale, @code{September}. @item short The abbreviated name of the month, e.g.@: in an English locale, @code{Sep}. @item number The number representing the month, e.g.@: 9 for September. @item paddedNumber A two-digit number representing the month, e.g.@: 09 for September. @end table Only values of @code{true} and @code{short}, respectively, have been observed. @end defvr @defvr {Attribute} dayType This attribute is always @code{month} in the corpus, specifying that the day of the month is to be displayed; a value of @code{year} is supposed to indicate that the day of the year, where 1 is January 1, is to be displayed instead. @end defvr @defvr {Attribute} hourFormat @code{hourFormat}, if present, is one of: @table @code @item AMPM The time is displayed with an @code{am} or @code{pm} suffix, e.g.@: @code{10:15pm}. @item AS_24 The time is displayed in a 24-hour format, e.g.@: @code{22:15}. This is the only value observed in the corpus. @item AS_12 The time is displayed in a 12-hour format, without distinguishing morning or evening, e.g.@: @code{10;15}. @end table @code{hourFormat} is sometimes present for @code{elapsedTime} formats, which is confusing since a time duration does not have a concept of AM or PM. This might indicate a bug in the code that generated the XML in the corpus, or it might indicate that @code{elapsedTime} is sometimes used to format a time of day. @end defvr For a @code{baseFormat} of @code{date}, PSPP chooses a print format type based on the following rules: @enumerate @item If @code{showQuarter} is true: @code{QYR}. @item Otherwise, if @code{showWeek} is true: @code{WKYR}. @item Otherwise, if @code{mdyOrder} is @code{dayMonthYear}: @enumerate a @item If @code{monthFormat} is @code{number} or @code{paddedNumber}: @code{EDATE}. @item Otherwise: @code{DATE}. @end enumerate @item Otherwise, if @code{mdyOrder} is @code{yearMonthDay}: @code{SDATE}. @item Otherwise, @code{ADATE}. @end enumerate For a @code{baseFormat} of @code{dateTime}, PSPP uses @code{YMDHMS} if @code{mdyOrder} is @code{yearMonthDay} and @code{DATETIME} otherwise. For a @code{baseFormat} of @code{time}, PSPP uses @code{DTIME} if @code{showDay} is true, otherwise @code{TIME} if @code{showHour} is true, otherwise @code{MTIME}. For a @code{baseFormat} of @code{date}, the chosen width is the minimum for the format type, adding 2 if @code{yearAbbreviation} is false or omitted. For other base formats, the chosen width is the minimum for its type, plus 3 if @code{showSecond} is true, plus 4 more if @code{showMillis} is also true. Decimals are 0 by default, or 3 if @code{showMillis} is true. @node SPV Detail elapsedTimeFormat Element @subsubsection The @code{elapsedTimeFormat} Element @example elapsedTimeFormat :baseFormat[dt_base_format]=(date | time | dateTime) :dayPadding=bool? :hourPadding=bool? :minutePadding=bool? :secondPadding=bool? :showYear=bool? :showDay=bool? :showHour=bool? :showMinute=bool? :showSecond=bool? :showMillis=bool? => affix* @end example This element specifies the way to display a time duration. Data to be formatted in elapsed time formats is stored as strings in legacy data, in the format @code{H:MM:SS.SSS}, with additional hour digits as needed for long durations, and must be parsed and reformatted by the reader. The following attribute is required. @defvr {Attribute} baseFormat Specifies whether a day and a time are both to be displayed, or just one of them. @end defvr The remaining attributes specify exactly how to display the elapsed time. For @code{baseFormat} of @code{time}, PSPP converts this element to print format type @code{DTIME}; otherwise, if @code{showHour} is true, to @code{TIME}; otherwise, to @code{MTIME}. The chosen width is the minimum for the chosen type, adding 3 if @code{showSecond} is true, adding 4 more if @code{showMillis} is also true. Decimals are 0 by default, or 3 if @code{showMillis} is true. @node SPV Detail format Element @subsubsection The @code{format} Element @example format :baseFormat[f_base_format]=(date | time | dateTime | elapsedTime)? :errorCharacter? :separatorChars? :mdyOrder=(dayMonthYear | monthDayYear | yearMonthDay)? :showYear=bool? :showQuarter=bool? :quarterPrefix? :quarterSuffix? :yearAbbreviation=bool? :showMonth=bool? :monthFormat=(long | short | number | paddedNumber)? :dayPadding=bool? :dayOfMonthPadding=bool? :showWeek=bool? :weekPadding=bool? :weekSuffix? :showDayOfWeek=bool? :dayOfWeekAbbreviation=bool? :hourPadding=bool? :minutePadding=bool? :secondPadding=bool? :showDay=bool? :showHour=bool? :showMinute=bool? :showSecond=bool? :showMillis=bool? :dayType=(month | year)? :hourFormat=(AMPM | AS_24 | AS_12)? :minimumIntegerDigits=int? :maximumFractionDigits=int? :minimumFractionDigits=int? :useGrouping=bool? :scientific=(onlyForSmall | whenNeeded | true | false)? :small=real? :prefix? :suffix? :tryStringsAsNumbers=bool? :negativesOutside=bool? => relabel* affix* @end example This element is the union of all of the more-specific format elements. It is interpreted in the same way as one of those format elements, using @code{baseFormat} to determine which kind of format to use. There are a few attributes not present in the more specific formats: @defvr {Attribute} tryStringsAsNumbers When this is @code{true}, it is supposed to indicate that string values should be parsed as numbers and then displayed according to numeric formatting rules. However, in the corpus it is always @code{false}. @end defvr @defvr {Attribute} negativesOutside If true, the negative sign should be shown before the prefix; if false, it should be shown after. @end defvr @node SPV Detail affix Element @subsubsection The @code{affix} Element @example affix :definesReference=int :position=(subscript | superscript) :suffix=bool :value => EMPTY @end example This defines a suffix (or, theoretically, a prefix) for a formatted value. It is used to insert a reference to a footnote. It has the following attributes: @defvr {Attribute} definesReference This specifies the footnote number as a natural number: 1 for the first footnote, 2 for the second, and so on. @end defvr @defvr {Attribute} position Position for the footnote label. Always @code{superscript}. @end defvr @defvr {Attribute} suffix Whether the affix is a suffix (@code{true}) or a prefix (@code{false}). Always @code{true}. @end defvr @defvr {Attribute} value The text of the suffix or prefix. Typically a letter, e.g.@: @code{a} for footnote 1, @code{b} for footnote 2, @enddots{} The corpus contains other values: @code{*}, @code{**}, and a few that begin with at least one comma: @code{,b}, @code{,c}, @code{,,b}, and @code{,,c}. @end defvr @node SPV Detail interval Element @subsection The @code{interval} Element @example interval :style=ref style => labeling footnotes? labeling :style=ref style? :variable=ref (sourceVariable | derivedVariable) => (formatting | format | footnotes)* formatting :variable=ref (sourceVariable | derivedVariable) => formatMapping* formatMapping :from=int => format? footnotes :superscript=bool? :variable=ref (sourceVariable | derivedVariable) => footnoteMapping* footnoteMapping :definesReference=int :from=int :to => EMPTY @end example The @code{interval} element and its descendants determine the basic formatting and labeling for the table's cells. These basic styles are overridden by more specific styles set using @code{setCellProperties} (@pxref{SPV Detail setCellProperties Element}). The @code{style} attribute of @code{interval} itself may be ignored. The @code{labeling} element may have a single @code{formatting} child. If present, its @code{variable} attribute refers to a variable whose values are format specifiers as numbers, e.g. value 0x050802 for F8.2. However, the numbers are not actually interpreted that way. Instead, each number actually present in the variable's data is mapped by a @code{formatMapping} child of @code{formatting} to a @code{format} that specifies how to display it. The @code{labeling} element may also have a @code{footnotes} child element. The @code{variable} attribute of this element refers to a variable whose values are comma-delimited strings that list the 1-based indexes of footnote references. (Cells without any footnote references are numeric 0 instead of strings.) Each @code{footnoteMapping} child of the @code{footnotes} element defines the footnote marker to be its @code{to} attribute text for the footnote whose 1-based index is given in its @code{definesReference} attribute. @node SPV Detail style Element @subsection The @code{style} Element @example style :color=color? :color2=color? :labelAngle=real? :border-bottom=(solid | thick | thin | double | none)? :border-top=(solid | thick | thin | double | none)? :border-left=(solid | thick | thin | double | none)? :border-right=(solid | thick | thin | double | none)? :border-bottom-color? :border-top-color? :border-left-color? :border-right-color? :font-family? :font-size? :font-weight=(regular | bold)? :font-style=(regular | italic)? :font-underline=(none | underline)? :margin-bottom=dimension? :margin-left=dimension? :margin-right=dimension? :margin-top=dimension? :textAlignment=(left | right | center | decimal | mixed)? :labelLocationHorizontal=(positive | negative | center)? :labelLocationVertical=(positive | negative | center)? :decimal-offset=dimension? :size? :width? :visible=bool? => EMPTY @end example A @code{style} element has an effect only when it is referenced by another element to set some aspect of the table's style. Most of the attributes are self-explanatory. The rest are described below. @defvr {Attribute} {color} In some cases, the text color; in others, the background color. @end defvr @defvr {Attribute} {color2} Not used. @end defvr @defvr {Attribute} {labelAngle} Normally 0. The value -90 causes inner column or outer row labels to be rotated vertically. @end defvr @defvr {Attribute} {labelLocationHorizontal} Not used. @end defvr @defvr {Attribute} {labelLocationVertical} The value @code{positive} corresponds to vertically aligning text to the top of a cell, @code{negative} to the bottom, @code{center} to the middle. @end defvr @node SPV Detail labelFrame Element @subsection The @code{labelFrame} Element @example labelFrame :style=ref style => location+ label? paragraph? paragraph :hangingIndent=dimension? => EMPTY @end example A @code{labelFrame} element specifies content and style for some aspect of a table. Only @code{labelFrame} elements that have a @code{label} child are important. The @code{purpose} attribute in the @code{label} determines what the @code{labelFrame} affects: @table @code @item title The table's title and its style. @item subTitle The table's caption and its style. @item footnote The table's footnotes and the style for the footer area. @item layer The style for the layer area. @item subSubTitle Ignored. @end table The @code{style} attribute references the style to use for the area. The @code{label}, if present, specifies the text to put into the title or caption or footnotes. For footnotes, the label has two @code{text} children for every footnote, each of which has a @code{usesReference} attribute identifying the 1-based index of a footnote. The first, third, fifth, @dots{} @code{text} child specifies the content for a footnote; the second, fourth, sixth, @dots{} child specifies the marker. Content tends to end in a new-line, which the reader may wish to trim; similarly, markers tend to end in @samp{.}. The @code{paragraph}, if present, may be ignored, since it is always empty. @node SPV Detail Legacy Properties @subsection Legacy Properties The detail XML format has features for styling most of the aspects of a table. It also inherits defaults for many aspects from structure XML, which has the following @code{tableProperties} element: @example tableProperties => generalProperties footnoteProperties cellFormatProperties borderProperties printingProperties generalProperties :hideEmptyRows=bool? :maximumColumnWidth=dimension? :maximumRowWidth=dimension? :minimumColumnWidth=dimension? :minimumRowWidth=dimension? :rowDimensionLabels=(inCorner | nested)? => EMPTY footnoteProperties :markerPosition=(superscript | subscript)? :numberFormat=(alphabetic | numeric)? => EMPTY cellFormatProperties => cell_style+ any[cell_style] :alternatingColor=color? :alternatingTextColor=color? => style style :color=color? :color2=color? :font-family? :font-size? :font-style=(regular | italic)? :font-weight=(regular | bold)? :labelLocationVertical=(positive | negative | center)? :margin-bottom=dimension? :margin-left=dimension? :margin-right=dimension? :margin-top=dimension? :textAlignment=(left | right | center | decimal | mixed)? :decimal-offset=dimension? => EMPTY borderProperties => border_style+ any[border_style] :borderStyleType=(none | solid | dashed | thick | thin | double)? :color=color? => EMPTY printingProperties :printAllLayers=bool? :rescaleLongTableToFitPage=bool? :rescaleWideTableToFitPage=bool? :windowOrphanLines=int? :continuationText? :continuationTextAtBottom=bool? :continuationTextAtTop=bool? :printEachLayerOnSeparatePage=bool? => EMPTY @end example pspp-1.4.1/doc/dev/encrypted-file-wrappers.texi0000644000175000017500000001736713571051236021125 0ustar00blpblp00000000000000@c PSPP - a program for statistical analysis. @c Copyright (C) 2019 Free Software Foundation, Inc. @c Permission is granted to copy, distribute and/or modify this document @c under the terms of the GNU Free Documentation License, Version 1.3 @c or any later version published by the Free Software Foundation; @c with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. @c A copy of the license is included in the section entitled "GNU @c Free Documentation License". @c @node Encrypted File Wrappers @chapter Encrypted File Wrappers SPSS 21 and later can package multiple kinds of files inside an encrypted wrapper. The wrapper has a common format, regardless of the kind of the file that it contains. @quotation Warning The SPSS encryption wrapper is poorly designed. When the password is unknown, it is much cheaper and faster to decrypt a file encrypted this way than if a well designed alternative were used. If you must use this format, use a 10-byte randomly generated password. @end quotation @menu * Common Wrapper Format:: * Password Encoding:: @end menu @node Common Wrapper Format @section Common Wrapper Format An encrypted file wrapper begins with the following 36-byte header, where @i{xxx} identifies the type of file encapsulated: @code{SAV} for a system file, @code{SPS} for a syntax file, @code{SPV} for a viewer file. PSPP code for identifying these files just checks for the @code{ENCRYPTED} keyword at offset 8, but the other bytes are also fixed in practice: @example 0000 1c 00 00 00 00 00 00 00 45 4e 43 52 59 50 54 45 |........ENCRYPTE| 0010 44 @i{xx} @i{xx} @i{xx} 15 00 00 00 00 00 00 00 00 00 00 00 |D@i{xxx}............| 0020 00 00 00 00 |....| @end example Following the fixed header is essentially the regular contents of the encapsulated file in its usual format, with each 16-byte block encrypted with AES-256 in ECB mode. To make the plaintext an even multiple of 16 bytes in length, the encryption process appends PKCS #7 padding, as specified in RFC 5652 section 6.3. Padding appends 1 to 16 bytes to the plaintext, in which each byte of padding is the number of padding bytes added. If the plaintext is, for example, 2 bytes short of a multiple of 16, the padding is 2 bytes with value 02; if the plaintext is a multiple of 16 bytes in length, the padding is 16 bytes with value 0x10. The AES-256 key is derived from a password in the following way: @enumerate @item Start from the literal password typed by the user. Truncate it to at most 10 bytes, then append as many null bytes as necessary until there are exactly 32 bytes. Call this @var{password}. @item Let @var{constant} be the following 73-byte constant: @example 0000 00 00 00 01 35 27 13 cc 53 a7 78 89 87 53 22 11 0010 d6 5b 31 58 dc fe 2e 7e 94 da 2f 00 cc 15 71 80 0020 0a 6c 63 53 00 38 c3 38 ac 22 f3 63 62 0e ce 85 0030 3f b8 07 4c 4e 2b 77 c7 21 f5 1a 80 1d 67 fb e1 0040 e1 83 07 d8 0d 00 00 01 00 @end example @item Compute CMAC-AES-256(@var{password}, @var{constant}). Call the 16-byte result @var{cmac}. @item The 32-byte AES-256 key is @var{cmac} || @var{cmac}, that is, @var{cmac} repeated twice. @end enumerate @subheading Example Consider the password @samp{pspp}. @var{password} is: @example 0000 70 73 70 70 00 00 00 00 00 00 00 00 00 00 00 00 |pspp............| 0010 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| @end example @noindent @var{cmac} is: @example 0000 3e da 09 8e 66 04 d4 fd f9 63 0c 2c a8 6f b0 45 @end example @noindent The AES-256 key is: @example 0000 3e da 09 8e 66 04 d4 fd f9 63 0c 2c a8 6f b0 45 0010 3e da 09 8e 66 04 d4 fd f9 63 0c 2c a8 6f b0 45 @end example @menu * Checking Passwords:: @end menu @node Checking Passwords @subsection Checking Passwords A program reading an encrypted file may wish to verify that the password it was given is the correct one. One way is to verify that the PKCS #7 padding at the end of the file is well formed. However, any plaintext that ends in byte 01 is well formed PKCS #7, meaning that about 1 in 256 keys will falsely pass this test. This might be acceptable for interactive use, but the false positive rate is too high for a brute-force search of the password space. A better test requires some knowledge of the file format being wrapped, to obtain a ``magic number'' for the beginning of the file. @itemize @bullet @item The plaintext of system files begins with @code{$FL2@@(#)} or @code{$FL3@@(#)}. @item Before encryption, a syntax file is prefixed with a line at the beginning of the form @code{* Encoding: @var{encoding}.}, where @var{encoding} is the encoding used for the rest of the file, e.g.@: @code{windows-1252}. Thus, @code{* Encoding} may be used as a magic number for system files. @item The plaintext of viewer files begins with 50 4b 03 04 14 00 08 (50 4b is @code{PK}). @end itemize @node Password Encoding @section Password Encoding SPSS also supports what it calls ``encrypted passwords.'' These are not encrypted. They are encoded with a simple, fixed scheme. An encoded password is always a multiple of 2 characters long, and never longer than 20 characters. The characters in an encoded password are always in the graphic ASCII range 33 through 126. Each successive pair of characters in the password encodes a single byte in the plaintext password. Use the following algorithm to decode a pair of characters: @enumerate @item Let @var{a} be the ASCII code of the first character, and @var{b} be the ASCII code of the second character. @item Let @var{ah} be the most significant 4 bits of @var{a}. Find the line in the table below that has @var{ah} on the left side. The right side of the line is a set of possible values for the most significant 4 bits of the decoded byte. @display @t{2 } @result{} @t{2367} @t{3 } @result{} @t{0145} @t{47} @result{} @t{89cd} @t{56} @result{} @t{abef} @end display @item Let @var{bh} be the most significant 4 bits of @var{b}. Find the line in the second table below that has @var{bh} on the left side. The right side of the line is a set of possible values for the most significant 4 bits of the decoded byte. Together with the results of the previous step, only a single possibility is left. @display @t{2 } @result{} @t{139b} @t{3 } @result{} @t{028a} @t{47} @result{} @t{46ce} @t{56} @result{} @t{57df} @end display @item Let @var{al} be the least significant 4 bits of @var{a}. Find the line in the table below that has @var{al} on the left side. The right side of the line is a set of possible values for the least significant 4 bits of the decoded byte. @display @t{03cf} @result{} @t{0145} @t{12de} @result{} @t{2367} @t{478b} @result{} @t{89cd} @t{569a} @result{} @t{abef} @end display @item Let @var{bl} be the least significant 4 bits of @var{b}. Find the line in the table below that has @var{bl} on the left side. The right side of the line is a set of possible values for the least significant 4 bits of the decoded byte. Together with the results of the previous step, only a single possibility is left. @display @t{03cf} @result{} @t{028a} @t{12de} @result{} @t{139b} @t{478b} @result{} @t{46ce} @t{569a} @result{} @t{57df} @end display @end enumerate @subheading Example Consider the encoded character pair @samp{-|}. @var{a} is 0x2d and @var{b} is 0x7c, so @var{ah} is 2, @var{bh} is 7, @var{al} is 0xd, and @var{bl} is 0xc. @var{ah} means that the most significant four bits of the decoded character is 2, 3, 6, or 7, and @var{bh} means that they are 4, 6, 0xc, or 0xe. The single possibility in common is 6, so the most significant four bits are 6. Similarly, @var{al} means that the least significant four bits are 2, 3, 6, or 7, and @var{bl} means they are 0, 2, 8, or 0xa, so the least significant four bits are 2. The decoded character is therefore 0x62, the letter @samp{b}. pspp-1.4.1/doc/dev/concepts.texi0000644000175000017500000030602013571051220016144 0ustar00blpblp00000000000000@c PSPP - a program for statistical analysis. @c Copyright (C) 2019 Free Software Foundation, Inc. @c Permission is granted to copy, distribute and/or modify this document @c under the terms of the GNU Free Documentation License, Version 1.3 @c or any later version published by the Free Software Foundation; @c with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. @c A copy of the license is included in the section entitled "GNU @c Free Documentation License". @c @node Basic Concepts @chapter Basic Concepts This chapter introduces basic data structures and other concepts needed for developing in PSPP. @menu * Values:: * Input and Output Formats:: * User-Missing Values:: * Value Labels:: * Variables:: * Dictionaries:: * Coding Conventions:: * Cases:: * Data Sets:: * Pools:: @end menu @node Values @section Values @cindex value The unit of data in PSPP is a @dfn{value}. @cindex width @cindex string value @cindex numeric value @cindex MAX_STRING Values are classified by @dfn{type} and @dfn{width}. The type of a value is either @dfn{numeric} or @dfn{string} (sometimes called alphanumeric). The width of a string value ranges from 1 to @code{MAX_STRING} bytes. The width of a numeric value is artificially defined to be 0; thus, the type of a value can be inferred from its width. Some support is provided for working with value types and widths, in @file{data/val-type.h}: @deftypefn Macro int MAX_STRING Maximum width of a string value, in bytes, currently 32,767. @end deftypefn @deftypefun bool val_type_is_valid (enum val_type @var{val_type}) Returns true if @var{val_type} is a valid value type, that is, either @code{VAL_NUMERIC} or @code{VAL_STRING}. Useful for assertions. @end deftypefun @deftypefun {enum val_type} val_type_from_width (int @var{width}) Returns @code{VAL_NUMERIC} if @var{width} is 0 and thus represents the width of a numeric value, otherwise @code{VAL_STRING} to indicate that @var{width} is the width of a string value. @end deftypefun The following subsections describe how values of each type are represented. @menu * Numeric Values:: * String Values:: * Runtime Typed Values:: @end menu @node Numeric Values @subsection Numeric Values A value known to be numeric at compile time is represented as a @code{double}. PSPP provides three values of @code{double} for special purposes, defined in @file{data/val-type.h}: @deftypefn Macro double SYSMIS The @dfn{system-missing value}, used to represent a datum whose true value is unknown, such as a survey question that was not answered by the respondent, or undefined, such as the result of division by zero. PSPP propagates the system-missing value through calculations and compensates for missing values in statistical analyses. @xref{Missing Observations,,,pspp, PSPP Users Guide}, for a PSPP user's view of missing values. PSPP currently defines @code{SYSMIS} as @code{-DBL_MAX}, that is, the greatest finite negative value of @code{double}. It is best not to depend on this definition, because PSPP may transition to using an IEEE NaN (not a number) instead at some point in the future. @end deftypefn @deftypefn Macro double LOWEST @deftypefnx Macro double HIGHEST The greatest finite negative (except for @code{SYSMIS}) and positive values of @code{double}, respectively. These values do not ordinarily appear in user data files. Instead, they are used to implement endpoints of open-ended ranges that are occasionally permitted in PSPP syntax, e.g.@: @code{5 THRU HI} as a range of missing values (@pxref{MISSING VALUES,,,pspp, PSPP Users Guide}). @end deftypefn @node String Values @subsection String Values A value known at compile time to have string type is represented as an array of @code{char}. String values do not necessarily represent readable text strings and may contain arbitrary 8-bit data, including null bytes, control codes, and bytes with the high bit set. Thus, string values are not null-terminated strings, but rather opaque arrays of bytes. @code{SYSMIS}, @code{LOWEST}, and @code{HIGHEST} have no equivalents as string values. Usually, PSPP fills an unknown or undefined string values with spaces, but PSPP does not treat such a string as a special case when it processes it later. @cindex MAX_STRING @code{MAX_STRING}, the maximum length of a string value, is defined in @file{data/val-type.h}. @node Runtime Typed Values @subsection Runtime Typed Values When a value's type is only known at runtime, it is often represented as a @union{value}, defined in @file{data/value.h}. A @union{value} does not identify the type or width of the data it contains. Code that works with @union{values}s must therefore have external knowledge of its content, often through the type and width of a @struct{variable} (@pxref{Variables}). @union{value} has one member that clients are permitted to access directly, a @code{double} named @samp{f} that stores the content of a numeric @union{value}. It has other members that store the content of string @union{value}, but client code should use accessor functions instead of referring to these directly. PSPP provides some functions for working with @union{value}s. The most useful are described below. To use these functions, recall that a numeric value has a width of 0. @deftypefun void value_init (union value *@var{value}, int @var{width}) Initializes @var{value} as a value of the given @var{width}. After initialization, the data in @var{value} are indeterminate; the caller is responsible for storing initial data in it. @end deftypefun @deftypefun void value_destroy (union value *@var{value}, int @var{width}) Frees auxiliary storage associated with @var{value}, which must have the given @var{width}. @end deftypefun @deftypefun bool value_needs_init (int @var{width}) For some widths, @func{value_init} and @func{value_destroy} do not actually do anything, because no additional storage is needed beyond the size of @union{value}. This function returns true if @var{width} is such a width, which case there is no actual need to call those functions. This can be a useful optimization if a large number of @union{value}s of such a width are to be initialized or destroyed. This function returns false if @func{value_init} and @func{value_destroy} are actually required for the given @var{width}. @end deftypefun @deftypefun void value_copy (union value *@var{dst}, @ const union value *@var{src}, @ int @var{width}) Copies the contents of @union{value} @var{src} to @var{dst}. Both @var{dst} and @var{src} must have been initialized with the specified @var{width}. @end deftypefun @deftypefun void value_set_missing (union value *@var{value}, int @var{width}) Sets @var{value} to @code{SYSMIS} if it is numeric or to all spaces if it is alphanumeric, according to @var{width}. @var{value} must have been initialized with the specified @var{width}. @end deftypefun @anchor{value_is_resizable} @deftypefun bool value_is_resizable (const union value *@var{value}, int @var{old_width}, int @var{new_width}) Determines whether @var{value}, which must have been initialized with the specified @var{old_width}, may be resized to @var{new_width}. Resizing is possible if the following criteria are met. First, @var{old_width} and @var{new_width} must be both numeric or both string widths. Second, if @var{new_width} is a short string width and less than @var{old_width}, resizing is allowed only if bytes @var{new_width} through @var{old_width} in @var{value} contain only spaces. These rules are part of those used by @func{mv_is_resizable} and @func{val_labs_can_set_width}. @end deftypefun @deftypefun void value_resize (union value *@var{value}, int @var{old_width}, int @var{new_width}) Resizes @var{value} from @var{old_width} to @var{new_width}, which must be allowed by the rules stated above. @var{value} must have been initialized with the specified @var{old_width} before calling this function. After resizing, @var{value} has width @var{new_width}. If @var{new_width} is greater than @var{old_width}, @var{value} will be padded on the right with spaces to the new width. If @var{new_width} is less than @var{old_width}, the rightmost bytes of @var{value} are truncated. @end deftypefun @deftypefun bool value_equal (const union value *@var{a}, const union value *@var{b}, int @var{width}) Compares of @var{a} and @var{b}, which must both have width @var{width}. Returns true if their contents are the same, false if they differ. @end deftypefun @deftypefun int value_compare_3way (const union value *@var{a}, const union value *@var{b}, int @var{width}) Compares of @var{a} and @var{b}, which must both have width @var{width}. Returns -1 if @var{a} is less than @var{b}, 0 if they are equal, or 1 if @var{a} is greater than @var{b}. Numeric values are compared numerically, with @code{SYSMIS} comparing less than any real number. String values are compared lexicographically byte-by-byte. @end deftypefun @deftypefun size_t value_hash (const union value *@var{value}, int @var{width}, unsigned int @var{basis}) Computes and returns a hash of @var{value}, which must have the specified @var{width}. The value in @var{basis} is folded into the hash. @end deftypefun @node Input and Output Formats @section Input and Output Formats Input and output formats specify how to convert data fields to and from data values (@pxref{Input and Output Formats,,,pspp, PSPP Users Guide}). PSPP uses @struct{fmt_spec} to represent input and output formats. Function prototypes and other declarations related to formats are in the @file{} header. @deftp {Structure} {struct fmt_spec} An input or output format, with the following members: @table @code @item enum fmt_type type The format type (see below). @item int w Field width, in bytes. The width of numeric fields is always between 1 and 40 bytes, and the width of string fields is always between 1 and 65534 bytes. However, many individual types of formats place stricter limits on field width (see @ref{fmt_max_input_width}, @ref{fmt_max_output_width}). @item int d Number of decimal places, in character positions. For format types that do not allow decimal places to be specified, this value must be 0. Format types that do allow decimal places have type-specific and often width-specific restrictions on @code{d} (see @ref{fmt_max_input_decimals}, @ref{fmt_max_output_decimals}). @end table @end deftp @deftp {Enumeration} {enum fmt_type} An enumerated type representing an input or output format type. Each PSPP input and output format has a corresponding enumeration constant prefixed by @samp{FMT}: @code{FMT_F}, @code{FMT_COMMA}, @code{FMT_DOT}, and so on. @end deftp The following sections describe functions for manipulating formats and the data in fields represented by formats. @menu * Constructing and Verifying Formats:: * Format Utility Functions:: * Obtaining Properties of Format Types:: * Numeric Formatting Styles:: * Formatted Data Input and Output:: @end menu @node Constructing and Verifying Formats @subsection Constructing and Verifying Formats These functions construct @struct{fmt_spec}s and verify that they are valid. @deftypefun {struct fmt_spec} fmt_for_input (enum fmt_type @var{type}, int @var{w}, int @var{d}) @deftypefunx {struct fmt_spec} fmt_for_output (enum fmt_type @var{type}, int @var{w}, int @var{d}) Constructs a @struct{fmt_spec} with the given @var{type}, @var{w}, and @var{d}, asserts that the result is a valid input (or output) format, and returns it. @end deftypefun @anchor{fmt_for_output_from_input} @deftypefun {struct fmt_spec} fmt_for_output_from_input (const struct fmt_spec *@var{input}) Given @var{input}, which must be a valid input format, returns the equivalent output format. @xref{Input and Output Formats,,,pspp, PSPP Users Guide}, for the rules for converting input formats into output formats. @end deftypefun @deftypefun {struct fmt_spec} fmt_default_for_width (int @var{width}) Returns the default output format for a variable of the given @var{width}. For a numeric variable, this is F8.2 format; for a string variable, it is the A format of the given @var{width}. @end deftypefun The following functions check whether a @struct{fmt_spec} is valid for various uses and return true if so, false otherwise. When any of them returns false, it also outputs an explanatory error message using @func{msg}. To suppress error output, enclose a call to one of these functions by a @func{msg_disable}/@func{msg_enable} pair. @deftypefun bool fmt_check (const struct fmt_spec *@var{format}, bool @var{for_input}) @deftypefunx bool fmt_check_input (const struct fmt_spec *@var{format}) @deftypefunx bool fmt_check_output (const struct fmt_spec *@var{format}) Checks whether @var{format} is a valid input format (for @func{fmt_check_input}, or @func{fmt_check} if @var{for_input}) or output format (for @func{fmt_check_output}, or @func{fmt_check} if not @var{for_input}). @end deftypefun @deftypefun bool fmt_check_type_compat (const struct fmt_spec *@var{format}, enum val_type @var{type}) Checks whether @var{format} matches the value type @var{type}, that is, if @var{type} is @code{VAL_NUMERIC} and @var{format} is a numeric format or @var{type} is @code{VAL_STRING} and @var{format} is a string format. @end deftypefun @deftypefun bool fmt_check_width_compat (const struct fmt_spec *@var{format}, int @var{width}) Checks whether @var{format} may be used as an output format for a value of the given @var{width}. @func{fmt_var_width}, described in the following section, can be also be used to determine the value width needed by a format. @end deftypefun @node Format Utility Functions @subsection Format Utility Functions These functions work with @struct{fmt_spec}s. @deftypefun int fmt_var_width (const struct fmt_spec *@var{format}) Returns the width for values associated with @var{format}. If @var{format} is a numeric format, the width is 0; if @var{format} is an A format, then the width @code{@var{format}->w}; otherwise, @var{format} is an AHEX format and its width is @code{@var{format}->w / 2}. @end deftypefun @deftypefun char *fmt_to_string (const struct fmt_spec *@var{format}, char @var{s}[FMT_STRING_LEN_MAX + 1]) Converts @var{format} to a human-readable format specifier in @var{s} and returns @var{s}. @var{format} need not be a valid input or output format specifier, e.g.@: it is allowed to have an excess width or decimal places. In particular, if @var{format} has decimals, they are included in the output string, even if @var{format}'s type does not allow decimals, to allow accurately presenting incorrect formats to the user. @end deftypefun @deftypefun bool fmt_equal (const struct fmt_spec *@var{a}, const struct fmt_spec *@var{b}) Compares @var{a} and @var{b} memberwise and returns true if they are identical, false otherwise. @var{format} need not be a valid input or output format specifier. @end deftypefun @deftypefun void fmt_resize (struct fmt_spec *@var{fmt}, int @var{width}) Sets the width of @var{fmt} to a valid format for a @union{value} of size @var{width}. @end deftypefun @node Obtaining Properties of Format Types @subsection Obtaining Properties of Format Types These functions work with @enum{fmt_type}s instead of the higher-level @struct{fmt_spec}s. Their primary purpose is to report properties of each possible format type, which in turn allows clients to abstract away many of the details of the very heterogeneous requirements of each format type. The first group of functions works with format type names. @deftypefun const char *fmt_name (enum fmt_type @var{type}) Returns the name for the given @var{type}, e.g.@: @code{"COMMA"} for @code{FMT_COMMA}. @end deftypefun @deftypefun bool fmt_from_name (const char *@var{name}, enum fmt_type *@var{type}) Tries to find the @enum{fmt_type} associated with @var{name}. If successful, sets @code{*@var{type}} to the type and returns true; otherwise, returns false without modifying @code{*@var{type}}. @end deftypefun The functions below query basic limits on width and decimal places for each kind of format. @deftypefun bool fmt_takes_decimals (enum fmt_type @var{type}) Returns true if a format of the given @var{type} is allowed to have a nonzero number of decimal places (the @code{d} member of @struct{fmt_spec}), false if not. @end deftypefun @anchor{fmt_min_input_width} @anchor{fmt_max_input_width} @anchor{fmt_min_output_width} @anchor{fmt_max_output_width} @deftypefun int fmt_min_input_width (enum fmt_type @var{type}) @deftypefunx int fmt_max_input_width (enum fmt_type @var{type}) @deftypefunx int fmt_min_output_width (enum fmt_type @var{type}) @deftypefunx int fmt_max_output_width (enum fmt_type @var{type}) Returns the minimum or maximum width (the @code{w} member of @struct{fmt_spec}) allowed for an input or output format of the specified @var{type}. @end deftypefun @anchor{fmt_max_input_decimals} @anchor{fmt_max_output_decimals} @deftypefun int fmt_max_input_decimals (enum fmt_type @var{type}, int @var{width}) @deftypefunx int fmt_max_output_decimals (enum fmt_type @var{type}, int @var{width}) Returns the maximum number of decimal places allowed for an input or output format, respectively, of the given @var{type} and @var{width}. Returns 0 if the specified @var{type} does not allow any decimal places or if @var{width} is too narrow to allow decimal places. @end deftypefun @deftypefun int fmt_step_width (enum fmt_type @var{type}) Returns the ``width step'' for a @struct{fmt_spec} of the given @var{type}. A @struct{fmt_spec}'s width must be a multiple of its type's width step. Most format types have a width step of 1, so that their formats' widths may be any integer within the valid range, but hexadecimal numeric formats and AHEX string formats have a width step of 2. @end deftypefun These functions allow clients to broadly determine how each kind of input or output format behaves. @deftypefun bool fmt_is_string (enum fmt_type @var{type}) @deftypefunx bool fmt_is_numeric (enum fmt_type @var{type}) Returns true if @var{type} is a format for numeric or string values, respectively, false otherwise. @end deftypefun @deftypefun enum fmt_category fmt_get_category (enum fmt_type @var{type}) Returns the category within which @var{type} falls. @deftp {Enumeration} {enum fmt_category} A group of format types. Format type categories correspond to the input and output categories described in the PSPP user documentation (@pxref{Input and Output Formats,,,pspp, PSPP Users Guide}). Each format is in exactly one category. The categories have bitwise disjoint values to make it easy to test whether a format type is in one of multiple categories, e.g.@: @example if (fmt_get_category (type) & (FMT_CAT_DATE | FMT_CAT_TIME)) @{ /* @dots{}@r{@code{type} is a date or time format}@dots{} */ @} @end example The format categories are: @table @code @item FMT_CAT_BASIC Basic numeric formats. @item FMT_CAT_CUSTOM Custom currency formats. @item FMT_CAT_LEGACY Legacy numeric formats. @item FMT_CAT_BINARY Binary formats. @item FMT_CAT_HEXADECIMAL Hexadecimal formats. @item FMT_CAT_DATE Date formats. @item FMT_CAT_TIME Time formats. @item FMT_CAT_DATE_COMPONENT Date component formats. @item FMT_CAT_STRING String formats. @end table @end deftp @end deftypefun The PSPP input and output routines use the following pair of functions to convert @enum{fmt_type}s to and from the separate set of codes used in system and portable files: @deftypefun int fmt_to_io (enum fmt_type @var{type}) Returns the format code used in system and portable files that corresponds to @var{type}. @end deftypefun @deftypefun bool fmt_from_io (int @var{io}, enum fmt_type *@var{type}) Converts @var{io}, a format code used in system and portable files, into a @enum{fmt_type} in @code{*@var{type}}. Returns true if successful, false if @var{io} is not valid. @end deftypefun These functions reflect the relationship between input and output formats. @deftypefun enum fmt_type fmt_input_to_output (enum fmt_type @var{type}) Returns the output format type that is used by default by DATA LIST and other input procedures when @var{type} is specified as an input format. The conversion from input format to output format is more complicated than simply changing the format. @xref{fmt_for_output_from_input}, for a function that performs the entire conversion. @end deftypefun @deftypefun bool fmt_usable_for_input (enum fmt_type @var{type}) Returns true if @var{type} may be used as an input format type, false otherwise. The custom currency formats, in particular, may be used for output but not for input. All format types are valid for output. @end deftypefun The final group of format type property functions obtain human-readable templates that illustrate the formats graphically. @deftypefun const char *fmt_date_template (enum fmt_type @var{type}) Returns a formatting template for @var{type}, which must be a date or time format type. These formats are used by @func{data_in} and @func{data_out} to guide parsing and formatting date and time data. @end deftypefun @deftypefun char *fmt_dollar_template (const struct fmt_spec *@var{format}) Returns a string of the form @code{$#,###.##} according to @var{format}, which must be of type @code{FMT_DOLLAR}. The caller must free the string with @code{free}. @end deftypefun @node Numeric Formatting Styles @subsection Numeric Formatting Styles Each of the basic numeric formats (F, E, COMMA, DOT, DOLLAR, PCT) and custom currency formats (CCA, CCB, CCC, CCD, CCE) has an associated numeric formatting style, represented by @struct{fmt_number_style}. Input and output conversion of formats that have numeric styles is determined mainly by the style, although the formatting rules have special cases that are not represented within the style. @deftp {Structure} {struct fmt_number_style} A structure type with the following members: @table @code @item struct substring neg_prefix @itemx struct substring prefix @itemx struct substring suffix @itemx struct substring neg_suffix A set of strings used a prefix to negative numbers, a prefix to every number, a suffix to every number, and a suffix to negative numbers, respectively. Each of these strings is no more than @code{FMT_STYLE_AFFIX_MAX} bytes (currently 16) bytes in length. These strings must be freed with @func{ss_dealloc} when no longer needed. @item decimal The character used as a decimal point. It must be either @samp{.} or @samp{,}. @item grouping The character used for grouping digits to the left of the decimal point. It may be @samp{.} or @samp{,}, in which case it must not be equal to @code{decimal}, or it may be set to 0 to disable grouping. @end table @end deftp The following functions are provided for working with numeric formatting styles. @deftypefun void fmt_number_style_init (struct fmt_number_style *@var{style}) Initialises a @struct{fmt_number_style} with all of the prefixes and suffixes set to the empty string, @samp{.} as the decimal point character, and grouping disables. @end deftypefun @deftypefun void fmt_number_style_destroy (struct fmt_number_style *@var{style}) Destroys @var{style}, freeing its storage. @end deftypefun @deftypefun {struct fmt_number_style} *fmt_create (void) A function which creates an array of all the styles used by pspp, and calls fmt_number_style_init on each of them. @end deftypefun @deftypefun void fmt_done (struct fmt_number_style *@var{styles}) A wrapper function which takes an array of @struct{fmt_number_style}, calls fmt_number_style_destroy on each of them, and then frees the array. @end deftypefun @deftypefun int fmt_affix_width (const struct fmt_number_style *@var{style}) Returns the total length of @var{style}'s @code{prefix} and @code{suffix}. @end deftypefun @deftypefun int fmt_neg_affix_width (const struct fmt_number_style *@var{style}) Returns the total length of @var{style}'s @code{neg_prefix} and @code{neg_suffix}. @end deftypefun PSPP maintains a global set of number styles for each of the basic numeric formats and custom currency formats. The following functions work with these global styles: @deftypefun {const struct fmt_number_style *} fmt_get_style (enum fmt_type @var{type}) Returns the numeric style for the given format @var{type}. @end deftypefun @deftypefun {const char *} fmt_name (enum fmt_type @var{type}) Returns the name of the given format @var{type}. @end deftypefun @node Formatted Data Input and Output @subsection Formatted Data Input and Output These functions provide the ability to convert data fields into @union{value}s and vice versa. @deftypefun bool data_in (struct substring @var{input}, const char *@var{encoding}, enum fmt_type @var{type}, int @var{implied_decimals}, int @var{first_column}, const struct dictionary *@var{dict}, union value *@var{output}, int @var{width}) Parses @var{input} as a field containing data in the given format @var{type}. The resulting value is stored in @var{output}, which the caller must have initialized with the given @var{width}. For consistency, @var{width} must be 0 if @var{type} is a numeric format type and greater than 0 if @var{type} is a string format type. @var{encoding} should be set to indicate the character encoding of @var{input}. @var{dict} must be a pointer to the dictionary with which @var{output} is associated. If @var{input} is the empty string (with length 0), @var{output} is set to the value set on SET BLANKS (@pxref{SET BLANKS,,,pspp, PSPP Users Guide}) for a numeric value, or to all spaces for a string value. This applies regardless of the usual parsing requirements for @var{type}. If @var{implied_decimals} is greater than zero, then the numeric result is shifted right by @var{implied_decimals} decimal places if @var{input} does not contain a decimal point character or an exponent. Only certain numeric format types support implied decimal places; for string formats and other numeric formats, @var{implied_decimals} has no effect. DATA LIST FIXED is the primary user of this feature (@pxref{DATA LIST FIXED,,,pspp, PSPP Users Guide}). Other callers should generally specify 0 for @var{implied_decimals}, to disable this feature. When @var{input} contains invalid input data, @func{data_in} outputs a message using @func{msg}. @c (@pxref{msg}). If @var{first_column} is nonzero, it is included in any such error message as the 1-based column number of the start of the field. The last column in the field is calculated as @math{@var{first_column} + @var{input} - 1}. To suppress error output, enclose the call to @func{data_in} by calls to @func{msg_disable} and @func{msg_enable}. This function returns true on success, false if a message was output (even if suppressed). Overflow and underflow provoke warnings but are not propagated to the caller as errors. This function is declared in @file{data/data-in.h}. @end deftypefun @deftypefun char * data_out (const union value *@var{input}, const struct fmt_spec *@var{format}) @deftypefunx char * data_out_legacy (const union value *@var{input}, const char *@var{encoding}, const struct fmt_spec *@var{format}) Converts the data pointed to by @var{input} into a string value, which will be encoded in UTF-8, according to output format specifier @var{format}. Format must be a valid output format. The width of @var{input} is inferred from @var{format} using an algorithm equivalent to @func{fmt_var_width}. When @var{input} contains data that cannot be represented in the given @var{format}, @func{data_out} may output a message using @func{msg}, @c (@pxref{msg}), although the current implementation does not consistently do so. To suppress error output, enclose the call to @func{data_out} by calls to @func{msg_disable} and @func{msg_enable}. This function is declared in @file{data/data-out.h}. @end deftypefun @node User-Missing Values @section User-Missing Values In addition to the system-missing value for numeric values, each variable has a set of user-missing values (@pxref{MISSING VALUES,,,pspp, PSPP Users Guide}). A set of user-missing values is represented by @struct{missing_values}. It is rarely necessary to interact directly with a @struct{missing_values} object. Instead, the most common operation, querying whether a particular value is a missing value for a given variable, is most conveniently executed through functions on @struct{variable}. @xref{Variable Missing Values}, for details. A @struct{missing_values} is essentially a set of @union{value}s that have a common value width (@pxref{Values}). For a set of missing values associated with a variable (the common case), the set's width is the same as the variable's width. Function prototypes and other declarations related to missing values are declared in @file{data/missing-values.h}. @deftp {Structure} {struct missing_values} Opaque type that represents a set of missing values. @end deftp The contents of a set of missing values is subject to some restrictions. Regardless of width, a set of missing values is allowed to be empty. A set of numeric missing values may contain up to three discrete numeric values, or a range of numeric values (which includes both ends of the range), or a range plus one discrete numeric value. A set of string missing values may contain up to three discrete string values (with the same width as the set), but ranges are not supported. In addition, values in string missing values wider than @code{MV_MAX_STRING} bytes may contain non-space characters only in their first @code{MV_MAX_STRING} bytes; all the bytes after the first @code{MV_MAX_STRING} must be spaces. @xref{mv_is_acceptable}, for a function that tests a value against these constraints. @deftypefn Macro int MV_MAX_STRING Number of bytes in a string missing value that are not required to be spaces. The current value is 8, a value which is fixed by the system file format. In PSPP we could easily eliminate this restriction, but doing so would also require us to extend the system file format in an incompatible way, which we consider a bad tradeoff. @end deftypefn The most often useful functions for missing values are those for testing whether a given value is missing, described in the following section. Several other functions for creating, inspecting, and modifying @struct{missing_values} objects are described afterward, but these functions are much more rarely useful. @menu * Testing for Missing Values:: * Creating and Destroying User-Missing Values:: * Changing User-Missing Value Set Width:: * Inspecting User-Missing Value Sets:: * Modifying User-Missing Value Sets:: @end menu @node Testing for Missing Values @subsection Testing for Missing Values The most often useful functions for missing values are those for testing whether a given value is missing, described here. However, using one of the corresponding missing value testing functions for variables can be even easier (@pxref{Variable Missing Values}). @deftypefun bool mv_is_value_missing (const struct missing_values *@var{mv}, const union value *@var{value}, enum mv_class @var{class}) @deftypefunx bool mv_is_num_missing (const struct missing_values *@var{mv}, double @var{value}, enum mv_class @var{class}) @deftypefunx bool mv_is_str_missing (const struct missing_values *@var{mv}, const char @var{value}[], enum mv_class @var{class}) Tests whether @var{value} is in one of the categories of missing values given by @var{class}. Returns true if so, false otherwise. @var{mv} determines the width of @var{value} and provides the set of user-missing values to test. The only difference among these functions in the form in which @var{value} is provided, so you may use whichever function is most convenient. The @var{class} argument determines the exact kinds of missing values that the functions test for: @deftp Enumeration {enum mv_class} @table @t @item MV_USER Returns true if @var{value} is in the set of user-missing values given by @var{mv}. @item MV_SYSTEM Returns true if @var{value} is system-missing. (If @var{mv} represents a set of string values, then @var{value} is never system-missing.) @item MV_ANY @itemx MV_USER | MV_SYSTEM Returns true if @var{value} is user-missing or system-missing. @item MV_NONE Always returns false, that is, @var{value} is never considered missing. @end table @end deftp @end deftypefun @node Creating and Destroying User-Missing Values @subsection Creation and Destruction These functions create and destroy @struct{missing_values} objects. @deftypefun void mv_init (struct missing_values *@var{mv}, int @var{width}) Initializes @var{mv} as a set of user-missing values. The set is initially empty. Any values added to it must have the specified @var{width}. @end deftypefun @deftypefun void mv_destroy (struct missing_values *@var{mv}) Destroys @var{mv}, which must not be referred to again. @end deftypefun @deftypefun void mv_copy (struct missing_values *@var{mv}, const struct missing_values *@var{old}) Initializes @var{mv} as a copy of the existing set of user-missing values @var{old}. @end deftypefun @deftypefun void mv_clear (struct missing_values *@var{mv}) Empties the user-missing value set @var{mv}, retaining its existing width. @end deftypefun @node Changing User-Missing Value Set Width @subsection Changing User-Missing Value Set Width A few PSPP language constructs copy sets of user-missing values from one variable to another. When the source and target variables have the same width, this is simple. But when the target variable's width might be different from the source variable's, it takes a little more work. The functions described here can help. In fact, it is usually unnecessary to call these functions directly. Most of the time @func{var_set_missing_values}, which uses @func{mv_resize} internally to resize the new set of missing values to the required width, may be used instead. @xref{var_set_missing_values}, for more information. @deftypefun bool mv_is_resizable (const struct missing_values *@var{mv}, int @var{new_width}) Tests whether @var{mv}'s width may be changed to @var{new_width} using @func{mv_resize}. Returns true if it is allowed, false otherwise. If @var{mv} contains any missing values, then it may be resized only if each missing value may be resized, as determined by @func{value_is_resizable} (@pxref{value_is_resizable}). @end deftypefun @anchor{mv_resize} @deftypefun void mv_resize (struct missing_values *@var{mv}, int @var{width}) Changes @var{mv}'s width to @var{width}. @var{mv} and @var{width} must satisfy the constraints explained above. When a string missing value set's width is increased, each user-missing value is padded on the right with spaces to the new width. @end deftypefun @node Inspecting User-Missing Value Sets @subsection Inspecting User-Missing Value Sets These functions inspect the properties and contents of @struct{missing_values} objects. The first set of functions inspects the discrete values that sets of user-missing values may contain: @deftypefun bool mv_is_empty (const struct missing_values *@var{mv}) Returns true if @var{mv} contains no user-missing values, false if it contains at least one user-missing value (either a discrete value or a numeric range). @end deftypefun @deftypefun int mv_get_width (const struct missing_values *@var{mv}) Returns the width of the user-missing values that @var{mv} represents. @end deftypefun @deftypefun int mv_n_values (const struct missing_values *@var{mv}) Returns the number of discrete user-missing values included in @var{mv}. The return value will be between 0 and 3. For sets of numeric user-missing values that include a range, the return value will be 0 or 1. @end deftypefun @deftypefun bool mv_has_value (const struct missing_values *@var{mv}) Returns true if @var{mv} has at least one discrete user-missing values, that is, if @func{mv_n_values} would return nonzero for @var{mv}. @end deftypefun @deftypefun {const union value *} mv_get_value (const struct missing_values *@var{mv}, int @var{index}) Returns the discrete user-missing value in @var{mv} with the given @var{index}. The caller must not modify or free the returned value or refer to it after modifying or freeing @var{mv}. The index must be less than the number of discrete user-missing values in @var{mv}, as reported by @func{mv_n_values}. @end deftypefun The second set of functions inspects the single range of values that numeric sets of user-missing values may contain: @deftypefun bool mv_has_range (const struct missing_values *@var{mv}) Returns true if @var{mv} includes a range, false otherwise. @end deftypefun @deftypefun void mv_get_range (const struct missing_values *@var{mv}, double *@var{low}, double *@var{high}) Stores the low endpoint of @var{mv}'s range in @code{*@var{low}} and the high endpoint of the range in @code{*@var{high}}. @var{mv} must include a range. @end deftypefun @node Modifying User-Missing Value Sets @subsection Modifying User-Missing Value Sets These functions modify the contents of @struct{missing_values} objects. The next set of functions applies to all sets of user-missing values: @deftypefun bool mv_add_value (struct missing_values *@var{mv}, const union value *@var{value}) @deftypefunx bool mv_add_str (struct missing_values *@var{mv}, const char @var{value}[]) @deftypefunx bool mv_add_num (struct missing_values *@var{mv}, double @var{value}) Attempts to add the given discrete @var{value} to set of user-missing values @var{mv}. @var{value} must have the same width as @var{mv}. Returns true if @var{value} was successfully added, false if the set could not accept any more discrete values or if @var{value} is not an acceptable user-missing value (see @func{mv_is_acceptable} below). These functions are equivalent, except for the form in which @var{value} is provided, so you may use whichever function is most convenient. @end deftypefun @deftypefun void mv_pop_value (struct missing_values *@var{mv}, union value *@var{value}) Removes a discrete value from @var{mv} (which must contain at least one discrete value) and stores it in @var{value}. @end deftypefun @deftypefun bool mv_replace_value (struct missing_values *@var{mv}, const union value *@var{value}, int @var{index}) Attempts to replace the discrete value with the given @var{index} in @var{mv} (which must contain at least @var{index} + 1 discrete values) by @var{value}. Returns true if successful, false if @var{value} is not an acceptable user-missing value (see @func{mv_is_acceptable} below). @end deftypefun @deftypefun bool mv_is_acceptable (const union value *@var{value}, int @var{width}) @anchor{mv_is_acceptable} Returns true if @var{value}, which must have the specified @var{width}, may be added to a missing value set of the same @var{width}, false if it cannot. As described above, all numeric values and string values of width @code{MV_MAX_STRING} or less may be added, but string value of greater width may be added only if bytes beyond the first @code{MV_MAX_STRING} are all spaces. @end deftypefun The second set of functions applies only to numeric sets of user-missing values: @deftypefun bool mv_add_range (struct missing_values *@var{mv}, double @var{low}, double @var{high}) Attempts to add a numeric range covering @var{low}@dots{}@var{high} (inclusive on both ends) to @var{mv}, which must be a numeric set of user-missing values. Returns true if the range is successful added, false on failure. Fails if @var{mv} already contains a range, or if @var{mv} contains more than one discrete value, or if @var{low} > @var{high}. @end deftypefun @deftypefun void mv_pop_range (struct missing_values *@var{mv}, double *@var{low}, double *@var{high}) Given @var{mv}, which must be a numeric set of user-missing values that contains a range, removes that range from @var{mv} and stores its low endpoint in @code{*@var{low}} and its high endpoint in @code{*@var{high}}. @end deftypefun @node Value Labels @section Value Labels Each variable has a set of value labels (@pxref{VALUE LABELS,,,pspp, PSPP Users Guide}), represented as @struct{val_labs}. A @struct{val_labs} is essentially a map from @union{value}s to strings. All of the values in a set of value labels have the same width, which for a set of value labels owned by a variable (the common case) is the same as its variable. Sets of value labels may contain any number of entries. It is rarely necessary to interact directly with a @struct{val_labs} object. Instead, the most common operation, looking up the label for a value of a given variable, can be conveniently executed through functions on @struct{variable}. @xref{Variable Value Labels}, for details. Function prototypes and other declarations related to missing values are declared in @file{data/value-labels.h}. @deftp {Structure} {struct val_labs} Opaque type that represents a set of value labels. @end deftp The most often useful function for value labels is @func{val_labs_find}, for looking up the label associated with a value. @deftypefun {char *} val_labs_find (const struct val_labs *@var{val_labs}, union value @var{value}) Looks in @var{val_labs} for a label for the given @var{value}. Returns the label, if one is found, or a null pointer otherwise. @end deftypefun Several other functions for working with value labels are described in the following section, but these are more rarely useful. @menu * Value Labels Creation and Destruction:: * Value Labels Properties:: * Value Labels Adding and Removing Labels:: * Value Labels Iteration:: @end menu @node Value Labels Creation and Destruction @subsection Creation and Destruction These functions create and destroy @struct{val_labs} objects. @deftypefun {struct val_labs *} val_labs_create (int @var{width}) Creates and returns an initially empty set of value labels with the given @var{width}. @end deftypefun @deftypefun {struct val_labs *} val_labs_clone (const struct val_labs *@var{val_labs}) Creates and returns a set of value labels whose width and contents are the same as those of @var{var_labs}. @end deftypefun @deftypefun void val_labs_clear (struct val_labs *@var{var_labs}) Deletes all value labels from @var{var_labs}. @end deftypefun @deftypefun void val_labs_destroy (struct val_labs *@var{var_labs}) Destroys @var{var_labs}, which must not be referenced again. @end deftypefun @node Value Labels Properties @subsection Value Labels Properties These functions inspect and manipulate basic properties of @struct{val_labs} objects. @deftypefun size_t val_labs_count (const struct val_labs *@var{val_labs}) Returns the number of value labels in @var{val_labs}. @end deftypefun @deftypefun bool val_labs_can_set_width (const struct val_labs *@var{val_labs}, int @var{new_width}) Tests whether @var{val_labs}'s width may be changed to @var{new_width} using @func{val_labs_set_width}. Returns true if it is allowed, false otherwise. A set of value labels may be resized to a given width only if each value in it may be resized to that width, as determined by @func{value_is_resizable} (@pxref{value_is_resizable}). @end deftypefun @deftypefun void val_labs_set_width (struct val_labs *@var{val_labs}, int @var{new_width}) Changes the width of @var{val_labs}'s values to @var{new_width}, which must be a valid new width as determined by @func{val_labs_can_set_width}. @end deftypefun @node Value Labels Adding and Removing Labels @subsection Adding and Removing Labels These functions add and remove value labels from a @struct{val_labs} object. @deftypefun bool val_labs_add (struct val_labs *@var{val_labs}, union value @var{value}, const char *@var{label}) Adds @var{label} to in @var{var_labs} as a label for @var{value}, which must have the same width as the set of value labels. Returns true if successful, false if @var{value} already has a label. @end deftypefun @deftypefun void val_labs_replace (struct val_labs *@var{val_labs}, union value @var{value}, const char *@var{label}) Adds @var{label} to in @var{var_labs} as a label for @var{value}, which must have the same width as the set of value labels. If @var{value} already has a label in @var{var_labs}, it is replaced. @end deftypefun @deftypefun bool val_labs_remove (struct val_labs *@var{val_labs}, union value @var{value}) Removes from @var{val_labs} any label for @var{value}, which must have the same width as the set of value labels. Returns true if a label was removed, false otherwise. @end deftypefun @node Value Labels Iteration @subsection Iterating through Value Labels These functions allow iteration through the set of value labels represented by a @struct{val_labs} object. They may be used in the context of a @code{for} loop: @example struct val_labs val_labs; const struct val_lab *vl; @dots{} for (vl = val_labs_first (val_labs); vl != NULL; vl = val_labs_next (val_labs, vl)) @{ @dots{}@r{do something with @code{vl}}@dots{} @} @end example Value labels should not be added or deleted from a @struct{val_labs} as it is undergoing iteration. @deftypefun {const struct val_lab *} val_labs_first (const struct val_labs *@var{val_labs}) Returns the first value label in @var{var_labs}, if it contains at least one value label, or a null pointer if it does not contain any value labels. @end deftypefun @deftypefun {const struct val_lab *} val_labs_next (const struct val_labs *@var{val_labs}, const struct val_labs_iterator **@var{vl}) Returns the value label in @var{var_labs} following @var{vl}, if @var{vl} is not the last value label in @var{val_labs}, or a null pointer if there are no value labels following @var{vl}. @end deftypefun @deftypefun {const struct val_lab **} val_labs_sorted (const struct val_labs *@var{val_labs}) Allocates and returns an array of pointers to value labels, which are sorted in increasing order by value. The array has @code{val_labs_count (@var{val_labs})} elements. The caller is responsible for freeing the array with @func{free} (but must not free any of the @struct{val_lab} elements that the array points to). @end deftypefun The iteration functions above work with pointers to @struct{val_lab} which is an opaque data structure that users of @struct{val_labs} must not modify or free directly. The following functions work with objects of this type: @deftypefun {const union value *} val_lab_get_value (const struct val_lab *@var{vl}) Returns the value of value label @var{vl}. The caller must not modify or free the returned value. (To achieve a similar result, remove the value label with @func{val_labs_remove}, then add the new value with @func{val_labs_add}.) The width of the returned value cannot be determined directly from @var{vl}. It may be obtained by calling @func{val_labs_get_width} on the @struct{val_labs} that @var{vl} is in. @end deftypefun @deftypefun {const char *} val_lab_get_label (const struct val_lab *@var{vl}) Returns the label in @var{vl} as a null-terminated string. The caller must not modify or free the returned string. (Use @func{val_labs_replace} to change a value label.) @end deftypefun @node Variables @section Variables A PSPP variable is represented by @struct{variable}, an opaque type declared in @file{data/variable.h} along with related declarations. @xref{Variables,,,pspp, PSPP Users Guide}, for a description of PSPP variables from a user perspective. PSPP is unusual among computer languages in that, by itself, a PSPP variable does not have a value. Instead, a variable in PSPP takes on a value only in the context of a case, which supplies one value for each variable in a set of variables (@pxref{Cases}). The set of variables in a case, in turn, are ordinarily part of a dictionary (@pxref{Dictionaries}). Every variable has several attributes, most of which correspond directly to one of the variable attributes visible to PSPP users (@pxref{Attributes,,,pspp, PSPP Users Guide}). The following sections describe variable-related functions and macros. @menu * Variable Name:: * Variable Type and Width:: * Variable Missing Values:: * Variable Value Labels:: * Variable Print and Write Formats:: * Variable Labels:: * Variable GUI Attributes:: * Variable Leave Status:: * Dictionary Class:: * Variable Creation and Destruction:: * Variable Short Names:: * Variable Relationships:: * Variable Auxiliary Data:: * Variable Categorical Values:: @end menu @node Variable Name @subsection Variable Name A variable name is a string between 1 and @code{ID_MAX_LEN} bytes long that satisfies the rules for PSPP identifiers (@pxref{Tokens,,,pspp, PSPP Users Guide}). Variable names are mixed-case and treated case-insensitively. @deftypefn Macro int ID_MAX_LEN Maximum length of a variable name, in bytes, currently 64. @end deftypefn Only one commonly useful function relates to variable names: @deftypefun {const char *} var_get_name (const struct variable *@var{var}) Returns @var{var}'s variable name as a C string. @end deftypefun A few other functions are much more rarely used. Some of these functions are used internally by the dictionary implementation: @anchor{var_set_name} @deftypefun {void} var_set_name (struct variable *@var{var}, const char *@var{new_name}) Changes the name of @var{var} to @var{new_name}, which must be a ``plausible'' name as defined below. This function cannot be applied to a variable that is part of a dictionary. Use @func{dict_rename_var} instead (@pxref{Dictionary Renaming Variables}). @end deftypefun @deftypefun {enum dict_class} var_get_dict_class (const struct variable *@var{var}) Returns the dictionary class of @var{var}'s name (@pxref{Dictionary Class}). @end deftypefun @node Variable Type and Width @subsection Variable Type and Width A variable's type and width are the type and width of its values (@pxref{Values}). @deftypefun {enum val_type} var_get_type (const struct variable *@var{var}) Returns the type of variable @var{var}. @end deftypefun @deftypefun int var_get_width (const struct variable *@var{var}) Returns the width of variable @var{var}. @end deftypefun @deftypefun void var_set_width (struct variable *@var{var}, int @var{width}) Sets the width of variable @var{var} to @var{width}. The width of a variable should not normally be changed after the variable is created, so this function is rarely used. This function cannot be applied to a variable that is part of a dictionary. @end deftypefun @deftypefun bool var_is_numeric (const struct variable *@var{var}) Returns true if @var{var} is a numeric variable, false otherwise. @end deftypefun @deftypefun bool var_is_alpha (const struct variable *@var{var}) Returns true if @var{var} is an alphanumeric (string) variable, false otherwise. @end deftypefun @node Variable Missing Values @subsection Variable Missing Values A numeric or short string variable may have a set of user-missing values (@pxref{MISSING VALUES,,,pspp, PSPP Users Guide}), represented as a @struct{missing_values} (@pxref{User-Missing Values}). The most frequent operation on a variable's missing values is to query whether a value is user- or system-missing: @deftypefun bool var_is_value_missing (const struct variable *@var{var}, const union value *@var{value}, enum mv_class @var{class}) @deftypefunx bool var_is_num_missing (const struct variable *@var{var}, double @var{value}, enum mv_class @var{class}) @deftypefunx bool var_is_str_missing (const struct variable *@var{var}, const char @var{value}[], enum mv_class @var{class}) Tests whether @var{value} is a missing value of the given @var{class} for variable @var{var} and returns true if so, false otherwise. @func{var_is_num_missing} may only be applied to numeric variables; @func{var_is_str_missing} may only be applied to string variables. @var{value} must have been initialized with the same width as @var{var}. @code{var_is_@var{type}_missing (@var{var}, @var{value}, @var{class})} is equivalent to @code{mv_is_@var{type}_missing (var_get_missing_values (@var{var}), @var{value}, @var{class})}. @end deftypefun In addition, a few functions are provided to work more directly with a variable's @struct{missing_values}: @deftypefun {const struct missing_values *} var_get_missing_values (const struct variable *@var{var}) Returns the @struct{missing_values} associated with @var{var}. The caller must not modify the returned structure. The return value is always non-null. @end deftypefun @anchor{var_set_missing_values} @deftypefun {void} var_set_missing_values (struct variable *@var{var}, const struct missing_values *@var{miss}) Changes @var{var}'s missing values to a copy of @var{miss}, or if @var{miss} is a null pointer, clears @var{var}'s missing values. If @var{miss} is non-null, it must have the same width as @var{var} or be resizable to @var{var}'s width (@pxref{mv_resize}). The caller retains ownership of @var{miss}. @end deftypefun @deftypefun void var_clear_missing_values (struct variable *@var{var}) Clears @var{var}'s missing values. Equivalent to @code{var_set_missing_values (@var{var}, NULL)}. @end deftypefun @deftypefun bool var_has_missing_values (const struct variable *@var{var}) Returns true if @var{var} has any missing values, false if it has none. Equivalent to @code{mv_is_empty (var_get_missing_values (@var{var}))}. @end deftypefun @node Variable Value Labels @subsection Variable Value Labels A numeric or short string variable may have a set of value labels (@pxref{VALUE LABELS,,,pspp, PSPP Users Guide}), represented as a @struct{val_labs} (@pxref{Value Labels}). The most commonly useful functions for value labels return the value label associated with a value: @deftypefun {const char *} var_lookup_value_label (const struct variable *@var{var}, const union value *@var{value}) Looks for a label for @var{value} in @var{var}'s set of value labels. @var{value} must have the same width as @var{var}. Returns the label if one exists, otherwise a null pointer. @end deftypefun @deftypefun void var_append_value_name (const struct variable *@var{var}, const union value *@var{value}, struct string *@var{str}) Looks for a label for @var{value} in @var{var}'s set of value labels. @var{value} must have the same width as @var{var}. If a label exists, it will be appended to the string pointed to by @var{str}. Otherwise, it formats @var{value} using @var{var}'s print format (@pxref{Input and Output Formats}) and appends the formatted string. @end deftypefun The underlying @struct{val_labs} structure may also be accessed directly using the functions described below. @deftypefun bool var_has_value_labels (const struct variable *@var{var}) Returns true if @var{var} has at least one value label, false otherwise. @end deftypefun @deftypefun {const struct val_labs *} var_get_value_labels (const struct variable *@var{var}) Returns the @struct{val_labs} associated with @var{var}. If @var{var} has no value labels, then the return value may or may not be a null pointer. The variable retains ownership of the returned @struct{val_labs}, which the caller must not attempt to modify. @end deftypefun @deftypefun void var_set_value_labels (struct variable *@var{var}, const struct val_labs *@var{val_labs}) Replaces @var{var}'s value labels by a copy of @var{val_labs}. The caller retains ownership of @var{val_labs}. If @var{val_labs} is a null pointer, then @var{var}'s value labels, if any, are deleted. @end deftypefun @deftypefun void var_clear_value_labels (struct variable *@var{var}) Deletes @var{var}'s value labels. Equivalent to @code{var_set_value_labels (@var{var}, NULL)}. @end deftypefun A final group of functions offers shorthands for operations that would otherwise require getting the value labels from a variable, copying them, modifying them, and then setting the modified value labels into the variable (making a second copy): @deftypefun bool var_add_value_label (struct variable *@var{var}, const union value *@var{value}, const char *@var{label}) Attempts to add a copy of @var{label} as a label for @var{value} for the given @var{var}. @var{value} must have the same width as @var{var}. If @var{value} already has a label, then the old label is retained. Returns true if a label is added, false if there was an existing label for @var{value}. Either way, the caller retains ownership of @var{value} and @var{label}. @end deftypefun @deftypefun void var_replace_value_label (struct variable *@var{var}, const union value *@var{value}, const char *@var{label}) Attempts to add a copy of @var{label} as a label for @var{value} for the given @var{var}. @var{value} must have the same width as @var{var}. If @var{value} already has a label, then @var{label} replaces the old label. Either way, the caller retains ownership of @var{value} and @var{label}. @end deftypefun @node Variable Print and Write Formats @subsection Variable Print and Write Formats Each variable has an associated pair of output formats, called its @dfn{print format} and @dfn{write format}. @xref{Input and Output Formats,,,pspp, PSPP Users Guide}, for an introduction to formats. @xref{Input and Output Formats}, for a developer's description of format representation. The print format is used to convert a variable's data values to strings for human-readable output. The write format is used similarly for machine-readable output, primarily by the WRITE transformation (@pxref{WRITE,,,pspp, PSPP Users Guide}). Most often a variable's print and write formats are the same. A newly created variable by default has format F8.2 if it is numeric or an A format with the same width as the variable if it is string. Many creators of variables override these defaults. Both the print format and write format are output formats. Input formats are not part of @struct{variable}. Instead, input programs and transformations keep track of variable input formats themselves. The following functions work with variable print and write formats. @deftypefun {const struct fmt_spec *} var_get_print_format (const struct variable *@var{var}) @deftypefunx {const struct fmt_spec *} var_get_write_format (const struct variable *@var{var}) Returns @var{var}'s print or write format, respectively. @end deftypefun @deftypefun void var_set_print_format (struct variable *@var{var}, const struct fmt_spec *@var{format}) @deftypefunx void var_set_write_format (struct variable *@var{var}, const struct fmt_spec *@var{format}) @deftypefunx void var_set_both_formats (struct variable *@var{var}, const struct fmt_spec *@var{format}) Sets @var{var}'s print format, write format, or both formats, respectively, to a copy of @var{format}. @end deftypefun @node Variable Labels @subsection Variable Labels A variable label is a string that describes a variable. Variable labels may contain spaces and punctuation not allowed in variable names. @xref{VARIABLE LABELS,,,pspp, PSPP Users Guide}, for a user-level description of variable labels. The most commonly useful functions for variable labels are those to retrieve a variable's label: @deftypefun {const char *} var_to_string (const struct variable *@var{var}) Returns @var{var}'s variable label, if it has one, otherwise @var{var}'s name. In either case the caller must not attempt to modify or free the returned string. This function is useful for user output. @end deftypefun @deftypefun {const char *} var_get_label (const struct variable *@var{var}) Returns @var{var}'s variable label, if it has one, or a null pointer otherwise. @end deftypefun A few other variable label functions are also provided: @deftypefun void var_set_label (struct variable *@var{var}, const char *@var{label}) Sets @var{var}'s variable label to a copy of @var{label}, or removes any label from @var{var} if @var{label} is a null pointer or contains only spaces. Leading and trailing spaces are removed from the variable label and its remaining content is truncated at 255 bytes. @end deftypefun @deftypefun void var_clear_label (struct variable *@var{var}) Removes any variable label from @var{var}. @end deftypefun @deftypefun bool var_has_label (const struct variable *@var{var}) Returns true if @var{var} has a variable label, false otherwise. @end deftypefun @node Variable GUI Attributes @subsection GUI Attributes These functions and types access and set attributes that are mainly used by graphical user interfaces. Their values are also stored in and retrieved from system files (but not portable files). The first group of functions relate to the measurement level of numeric data. New variables are assigned a nominal level of measurement by default. @deftp {Enumeration} {enum measure} Measurement level. Available values are: @table @code @item MEASURE_NOMINAL Numeric data values are arbitrary. Arithmetic operations and numerical comparisons of such data are not meaningful. @item MEASURE_ORDINAL Numeric data values indicate progression along a rank order. Arbitrary arithmetic operations such as addition are not meaningful on such data, but inequality comparisons (less, greater, etc.) have straightforward interpretations. @item MEASURE_SCALE Ratios, sums, etc. of numeric data values have meaningful interpretations. @end table PSPP does not have a separate category for interval data, which would naturally fall between the ordinal and scale measurement levels. @end deftp @deftypefun bool measure_is_valid (enum measure @var{measure}) Returns true if @var{measure} is a valid level of measurement, that is, if it is one of the @code{enum measure} constants listed above, and false otherwise. @end deftypefun @deftypefun enum measure var_get_measure (const struct variable *@var{var}) @deftypefunx void var_set_measure (struct variable *@var{var}, enum measure @var{measure}) Gets or sets @var{var}'s measurement level. @end deftypefun The following set of functions relates to the width of on-screen columns used for displaying variable data in a graphical user interface environment. The unit of measurement is the width of a character. For proportionally spaced fonts, this is based on the average width of a character. @deftypefun int var_get_display_width (const struct variable *@var{var}) @deftypefunx void var_set_display_width (struct variable *@var{var}, int @var{display_width}) Gets or sets @var{var}'s display width. @end deftypefun @anchor{var_default_display_width} @deftypefun int var_default_display_width (int @var{width}) Returns the default display width for a variable with the given @var{width}. The default width of a numeric variable is 8. The default width of a string variable is @var{width} or 32, whichever is less. @end deftypefun The final group of functions work with the justification of data when it is displayed in on-screen columns. New variables are by default right-justified. @deftp {Enumeration} {enum alignment} Text justification. Possible values are @code{ALIGN_LEFT}, @code{ALIGN_RIGHT}, and @code{ALIGN_CENTRE}. @end deftp @deftypefun bool alignment_is_valid (enum alignment @var{alignment}) Returns true if @var{alignment} is a valid alignment, that is, if it is one of the @code{enum alignment} constants listed above, and false otherwise. @end deftypefun @deftypefun enum alignment var_get_alignment (const struct variable *@var{var}) @deftypefunx void var_set_alignment (struct variable *@var{var}, enum alignment @var{alignment}) Gets or sets @var{var}'s alignment. @end deftypefun @node Variable Leave Status @subsection Variable Leave Status Commonly, most or all data in a case come from an input file, read with a command such as DATA LIST or GET, but data can also be generated with transformations such as COMPUTE. In the latter case the question of a datum's ``initial value'' can arise. For example, the value of a piece of generated data can recursively depend on its own value: @example COMPUTE X = X + 1. @end example Another situation where the initial value of a variable arises is when its value is not set at all for some cases, e.g.@: below, @code{Y} is set only for the first 10 cases: @example DO IF #CASENUM <= 10. + COMPUTE Y = 1. END IF. @end example By default, the initial value of a datum in either of these situations is the system-missing value for numeric values and spaces for string values. This means that, above, X would be system-missing and that Y would be 1 for the first 10 cases and system-missing for the remainder. PSPP also supports retaining the value of a variable from one case to another, using the LEAVE command (@pxref{LEAVE,,,pspp, PSPP Users Guide}). The initial value of such a variable is 0 if it is numeric and spaces if it is a string. If the command @samp{LEAVE X Y} is appended to the above example, then X would have value 1 in the first case and increase by 1 in every succeeding case, and Y would have value 1 for the first 10 cases and 0 for later cases. The LEAVE command has no effect on data that comes from an input file or whose values do not depend on a variable's initial value. The value of scratch variables (@pxref{Scratch Variables,,,pspp, PSPP Users Guide}) are always left from one case to another. The following functions work with a variable's leave status. @deftypefun bool var_get_leave (const struct variable *@var{var}) Returns true if @var{var}'s value is to be retained from case to case, false if it is reinitialized to system-missing or spaces. @end deftypefun @deftypefun void var_set_leave (struct variable *@var{var}, bool @var{leave}) If @var{leave} is true, marks @var{var} to be left from case to case; if @var{leave} is false, marks @var{var} to be reinitialized for each case. If @var{var} is a scratch variable, @var{leave} must be true. @end deftypefun @deftypefun bool var_must_leave (const struct variable *@var{var}) Returns true if @var{var} must be left from case to case, that is, if @var{var} is a scratch variable. @end deftypefun @node Dictionary Class @subsection Dictionary Class Occasionally it is useful to classify variables into @dfn{dictionary classes} based on their names. Dictionary classes are represented by @enum{dict_class}. This type and other declarations for dictionary classes are in the @file{} header. @deftp {Enumeration} {enum dict_class} The dictionary classes are: @table @code @item DC_ORDINARY An ordinary variable, one whose name does not begin with @samp{$} or @samp{#}. @item DC_SYSTEM A system variable, one whose name begins with @samp{$}. @xref{System Variables,,,pspp, PSPP Users Guide}. @item DC_SCRATCH A scratch variable, one whose name begins with @samp{#}. @xref{Scratch Variables,,,pspp, PSPP Users Guide}. @end table The values for dictionary classes are bitwise disjoint, which allows them to be used in bit-masks. An extra enumeration constant @code{DC_ALL}, whose value is the bitwise-@i{or} of all of the above constants, is provided to aid in this purpose. @end deftp One example use of dictionary classes arises in connection with PSPP syntax that uses @code{@var{a} TO @var{b}} to name the variables in a dictionary from @var{a} to @var{b} (@pxref{Sets of Variables,,,pspp, PSPP Users Guide}). This syntax requires @var{a} and @var{b} to be in the same dictionary class. It limits the variables that it includes to those in that dictionary class. The following functions relate to dictionary classes. @deftypefun {enum dict_class} dict_class_from_id (const char *@var{name}) Returns the ``dictionary class'' for the given variable @var{name}, by looking at its first letter. @end deftypefun @deftypefun {const char *} dict_class_to_name (enum dict_class @var{dict_class}) Returns a name for the given @var{dict_class} as an adjective, e.g.@: @code{"scratch"}. This function should probably not be used in new code as it can lead to difficulties for internationalization. @end deftypefun @node Variable Creation and Destruction @subsection Variable Creation and Destruction Only rarely should PSPP code create or destroy variables directly. Ordinarily, variables are created within a dictionary and destroying by individual deletion from the dictionary or by destroying the entire dictionary at once. The functions here enable the exceptional case, of creation and destruction of variables that are not associated with any dictionary. These functions are used internally in the dictionary implementation. @anchor{var_create} @deftypefun {struct variable *} var_create (const char *@var{name}, int @var{width}) Creates and returns a new variable with the given @var{name} and @var{width}. The new variable is not part of any dictionary. Use @func{dict_create_var}, instead, to create a variable in a dictionary (@pxref{Dictionary Creating Variables}). @var{name} should be a valid variable name and must be a ``plausible'' variable name (@pxref{Variable Name}). @var{width} must be between 0 and @code{MAX_STRING}, inclusive (@pxref{Values}). The new variable has no user-missing values, value labels, or variable label. Numeric variables initially have F8.2 print and write formats, right-justified display alignment, and scale level of measurement. String variables are created with A print and write formats, left-justified display alignment, and nominal level of measurement. The initial display width is determined by @func{var_default_display_width} (@pxref{var_default_display_width}). The new variable initially has no short name (@pxref{Variable Short Names}) and no auxiliary data (@pxref{Variable Auxiliary Data}). @end deftypefun @anchor{var_clone} @deftypefun {struct variable *} var_clone (const struct variable *@var{old_var}) Creates and returns a new variable with the same attributes as @var{old_var}, with a few exceptions. First, the new variable is not part of any dictionary, regardless of whether @var{old_var} was in a dictionary. Use @func{dict_clone_var}, instead, to add a clone of a variable to a dictionary. Second, the new variable is not given any short name, even if @var{old_var} had a short name. This is because the new variable is likely to be immediately renamed, in which case the short name would be incorrect (@pxref{Variable Short Names}). Finally, @var{old_var}'s auxiliary data, if any, is not copied to the new variable (@pxref{Variable Auxiliary Data}). @end deftypefun @deftypefun {void} var_destroy (struct variable *@var{var}) Destroys @var{var} and frees all associated storage, including its auxiliary data, if any. @var{var} must not be part of a dictionary. To delete a variable from a dictionary and destroy it, use @func{dict_delete_var} (@pxref{Dictionary Deleting Variables}). @end deftypefun @node Variable Short Names @subsection Variable Short Names PSPP variable names may be up to 64 (@code{ID_MAX_LEN}) bytes long. The system and portable file formats, however, were designed when variable names were limited to 8 bytes in length. Since then, the system file format has been augmented with an extension record that explains how the 8-byte short names map to full-length names (@pxref{Long Variable Names Record}), but the short names are still present. Thus, the continued presence of the short names is more or less invisible to PSPP users, but every variable in a system file still has a short name that must be unique. PSPP can generate unique short names for variables based on their full names at the time it creates the data file. If all variables' full names are unique in their first 8 bytes, then the short names are simply prefixes of the full names; otherwise, PSPP changes them so that they are unique. By itself this algorithm interoperates well with other software that can read system files, as long as that software understands the extension record that maps short names to long names. When the other software does not understand the extension record, it can produce surprising results. Consider a situation where PSPP reads a system file that contains two variables named RANKINGSCORE, then the user adds a new variable named RANKINGSTATUS, then saves the modified data as a new system file. A program that does not understand long names would then see one of these variables under the name RANKINGS---either one, depending on the algorithm's details---and the other under a different name. The effect could be very confusing: by adding a new and apparently unrelated variable in PSPP, the user effectively renamed the existing variable. To counteract this potential problem, every @struct{variable} may have a short name. A variable created by the system or portable file reader receives the short name from that data file. When a variable with a short name is written to a system or portable file, that variable receives priority over other long names whose names begin with the same 8 bytes but which were not read from a data file under that short name. Variables not created by the system or portable file reader have no short name by default. A variable with a full name of 8 bytes or less in length has absolute priority for that name when the variable is written to a system file, even over a second variable with that assigned short name. PSPP does not enforce uniqueness of short names, although the short names read from any given data file will always be unique. If two variables with the same short name are written to a single data file, neither one receives priority. The following macros and functions relate to short names. @defmac SHORT_NAME_LEN Maximum length of a short name, in bytes. Its value is 8. @end defmac @deftypefun {const char *} var_get_short_name (const struct variable *@var{var}) Returns @var{var}'s short name, or a null pointer if @var{var} has not been assigned a short name. @end deftypefun @deftypefun void var_set_short_name (struct variable *@var{var}, const char *@var{short_name}) Sets @var{var}'s short name to @var{short_name}, or removes @var{var}'s short name if @var{short_name} is a null pointer. If it is non-null, then @var{short_name} must be a plausible name for a variable. The name will be truncated to 8 bytes in length and converted to all-uppercase. @end deftypefun @deftypefun void var_clear_short_name (struct variable *@var{var}) Removes @var{var}'s short name. @end deftypefun @node Variable Relationships @subsection Variable Relationships Variables have close relationships with dictionaries (@pxref{Dictionaries}) and cases (@pxref{Cases}). A variable is usually a member of some dictionary, and a case is often used to store data for the set of variables in a dictionary. These functions report on these relationships. They may be applied only to variables that are in a dictionary. @deftypefun size_t var_get_dict_index (const struct variable *@var{var}) Returns @var{var}'s index within its dictionary. The first variable in a dictionary has index 0, the next variable index 1, and so on. The dictionary index can be influenced using dictionary functions such as dict_reorder_var (@pxref{dict_reorder_var}). @end deftypefun @deftypefun size_t var_get_case_index (const struct variable *@var{var}) Returns @var{var}'s index within a case. The case index is an index into an array of @union{value} large enough to contain all the data in the dictionary. The returned case index can be used to access the value of @var{var} within a case for its dictionary, as in e.g.@: @code{case_data_idx (case, var_get_case_index (@var{var}))}, but ordinarily it is more convenient to use the data access functions that do variable-to-index translation internally, as in e.g.@: @code{case_data (case, @var{var})}. @end deftypefun @node Variable Auxiliary Data @subsection Variable Auxiliary Data Each @struct{variable} can have a single pointer to auxiliary data of type @code{void *}. These functions manipulate a variable's auxiliary data. Use of auxiliary data is discouraged because of its lack of flexibility. Only one client can make use of auxiliary data on a given variable at any time, even though many clients could usefully associate data with a variable. To prevent multiple clients from attempting to use a variable's single auxiliary data field at the same time, we adopt the convention that use of auxiliary data in the active dataset dictionary is restricted to the currently executing command. In particular, transformations must not attach auxiliary data to a variable in the active dataset in the expectation that it can be used later when the active dataset is read and the transformation is executed. To help enforce this restriction, auxiliary data is deleted from all variables in the active dataset dictionary after the execution of each PSPP command. This convention for safe use of auxiliary data applies only to the active dataset dictionary. Rules for other dictionaries may be established separately. Auxiliary data should be replaced by a more flexible mechanism at some point, but no replacement mechanism has been designed or implemented so far. The following functions work with variable auxiliary data. @deftypefun {void *} var_get_aux (const struct variable *@var{var}) Returns @var{var}'s auxiliary data, or a null pointer if none has been assigned. @end deftypefun @deftypefun {void *} var_attach_aux (const struct variable *@var{var}, void *@var{aux}, void (*@var{aux_dtor}) (struct variable *)) Sets @var{var}'s auxiliary data to @var{aux}, which must not be null. @var{var} must not already have auxiliary data. Before @var{var}'s auxiliary data is cleared by @code{var_clear_aux}, @var{aux_dtor}, if non-null, will be called with @var{var} as its argument. It should free any storage associated with @var{aux}, if necessary. @code{var_dtor_free} may be appropriate for use as @var{aux_dtor}: @deffn {Function} void var_dtor_free (struct variable *@var{var}) Frees @var{var}'s auxiliary data by calling @code{free}. @end deffn @end deftypefun @deftypefun void var_clear_aux (struct variable *@var{var}) Removes auxiliary data, if any, from @var{var}, first calling the destructor passed to @code{var_attach_aux}, if one was provided. Use @code{dict_clear_aux} to remove auxiliary data from every variable in a dictionary. @c (@pxref{dict_clear_aux}). @end deftypefun @deftypefun {void *} var_detach_aux (struct variable *@var{var}) Removes auxiliary data, if any, from @var{var}, and returns it. Returns a null pointer if @var{var} had no auxiliary data. Any destructor passed to @code{var_attach_aux} is not called, so the caller is responsible for freeing storage associated with the returned auxiliary data. @end deftypefun @node Variable Categorical Values @subsection Variable Categorical Values Some statistical procedures require a list of all the values that a categorical variable takes on. Arranging such a list requires making a pass through the data, so PSPP caches categorical values in @struct{variable}. When variable auxiliary data is revamped to support multiple clients as described in the previous section, categorical values are an obvious candidate. The form in which they are currently supported is inelegant. Categorical values are not robust against changes in the data. That is, there is currently no way to detect that a transformation has changed data values, meaning that categorical values lists for the changed variables must be recomputed. PSPP is in fact in need of a general-purpose caching and cache-invalidation mechanism, but none has yet been designed and built. The following functions work with cached categorical values. @deftypefun {struct cat_vals *} var_get_obs_vals (const struct variable *@var{var}) Returns @var{var}'s set of categorical values. Yields undefined behavior if @var{var} does not have any categorical values. @end deftypefun @deftypefun void var_set_obs_vals (const struct variable *@var{var}, struct cat_vals *@var{cat_vals}) Destroys @var{var}'s categorical values, if any, and replaces them by @var{cat_vals}, ownership of which is transferred to @var{var}. If @var{cat_vals} is a null pointer, then @var{var}'s categorical values are cleared. @end deftypefun @deftypefun bool var_has_obs_vals (const struct variable *@var{var}) Returns true if @var{var} has a set of categorical values, false otherwise. @end deftypefun @node Dictionaries @section Dictionaries Each data file in memory or on disk has an associated dictionary, whose primary purpose is to describe the data in the file. @xref{Variables,,,pspp, PSPP Users Guide}, for a PSPP user's view of a dictionary. A data file stored in a PSPP format, either as a system or portable file, has a representation of its dictionary embedded in it. Other kinds of data files are usually not self-describing enough to construct a dictionary unassisted, so the dictionaries for these files must be specified explicitly with PSPP commands such as @cmd{DATA LIST}. The most important content of a dictionary is an array of variables, which must have unique names. A dictionary also conceptually contains a mapping from each of its variables to a location within a case (@pxref{Cases}), although in fact these mappings are stored within individual variables. System variables are not members of any dictionary (@pxref{System Variables,,,pspp, PSPP Users Guide}). Dictionaries are represented by @struct{dictionary}. Declarations related to dictionaries are in the @file{} header. The following sections describe functions for use with dictionaries. @menu * Dictionary Variable Access:: * Dictionary Creating Variables:: * Dictionary Deleting Variables:: * Dictionary Reordering Variables:: * Dictionary Renaming Variables:: * Dictionary Weight Variable:: * Dictionary Filter Variable:: * Dictionary Case Limit:: * Dictionary Split Variables:: * Dictionary File Label:: * Dictionary Documents:: @end menu @node Dictionary Variable Access @subsection Accessing Variables The most common operations on a dictionary simply retrieve a @code{struct variable *} of an individual variable based on its name or position. @deftypefun {struct variable *} dict_lookup_var (const struct dictionary *@var{dict}, const char *@var{name}) @deftypefunx {struct variable *} dict_lookup_var_assert (const struct dictionary *@var{dict}, const char *@var{name}) Looks up and returns the variable with the given @var{name} within @var{dict}. Name lookup is not case-sensitive. @code{dict_lookup_var} returns a null pointer if @var{dict} does not contain a variable named @var{name}. @code{dict_lookup_var_assert} asserts that such a variable exists. @end deftypefun @deftypefun {struct variable *} dict_get_var (const struct dictionary *@var{dict}, size_t @var{position}) Returns the variable at the given @var{position} in @var{dict}. @var{position} must be less than the number of variables in @var{dict} (see below). @end deftypefun @deftypefun size_t dict_get_var_cnt (const struct dictionary *@var{dict}) Returns the number of variables in @var{dict}. @end deftypefun Another pair of functions allows retrieving a number of variables at once. These functions are more rarely useful. @deftypefun void dict_get_vars (const struct dictionary *@var{dict}, const struct variable ***@var{vars}, size_t *@var{cnt}, enum dict_class @var{exclude}) @deftypefunx void dict_get_vars_mutable (const struct dictionary *@var{dict}, struct variable ***@var{vars}, size_t *@var{cnt}, enum dict_class @var{exclude}) Retrieves all of the variables in @var{dict}, in their original order, except that any variables in the dictionary classes specified @var{exclude}, if any, are excluded (@pxref{Dictionary Class}). Pointers to the variables are stored in an array allocated with @code{malloc}, and a pointer to the first element of this array is stored in @code{*@var{vars}}. The caller is responsible for freeing this memory when it is no longer needed. The number of variables retrieved is stored in @code{*@var{cnt}}. The presence or absence of @code{DC_SYSTEM} in @var{exclude} has no effect, because dictionaries never include system variables. @end deftypefun One additional function is available. This function is most often used in assertions, but it is not restricted to such use. @deftypefun bool dict_contains_var (const struct dictionary *@var{dict}, const struct variable *@var{var}) Tests whether @var{var} is one of the variables in @var{dict}. Returns true if so, false otherwise. @end deftypefun @node Dictionary Creating Variables @subsection Creating Variables These functions create a new variable and insert it into a dictionary in a single step. There is no provision for inserting an already created variable into a dictionary. There is no reason that such a function could not be written, but so far there has been no need for one. The names provided to one of these functions should be valid variable names and must be plausible variable names. @c (@pxref{Variable Names}). If a variable with the same name already exists in the dictionary, the non-@code{assert} variants of these functions return a null pointer, without modifying the dictionary. The @code{assert} variants, on the other hand, assert that no duplicate name exists. A variable may be in only one dictionary at any given time. @deftypefun {struct variable *} dict_create_var (struct dictionary *@var{dict}, const char *@var{name}, int @var{width}) @deftypefunx {struct variable *} dict_create_var_assert (struct dictionary *@var{dict}, const char *@var{name}, int @var{width}) Creates a new variable with the given @var{name} and @var{width}, as if through a call to @code{var_create} with those arguments (@pxref{var_create}), appends the new variable to @var{dict}'s array of variables, and returns the new variable. @end deftypefun @deftypefun {struct variable *} dict_clone_var (struct dictionary *@var{dict}, const struct variable *@var{old_var}) @deftypefunx {struct variable *} dict_clone_var_assert (struct dictionary *@var{dict}, const struct variable *@var{old_var}) Creates a new variable as a clone of @var{var}, inserts the new variable into @var{dict}, and returns the new variable. Other properties of the new variable are copied from @var{old_var}, except for those not copied by @code{var_clone} (@pxref{var_clone}). @var{var} does not need to be a member of any dictionary. @end deftypefun @deftypefun {struct variable *} dict_clone_var_as (struct dictionary *@var{dict}, const struct variable *@var{old_var}, const char *@var{name}) @deftypefunx {struct variable *} dict_clone_var_as_assert (struct dictionary *@var{dict}, const struct variable *@var{old_var}, const char *@var{name}) These functions are similar to @code{dict_clone_var} and @code{dict_clone_var_assert}, respectively, except that the new variable is named @var{name} instead of keeping @var{old_var}'s name. @end deftypefun @node Dictionary Deleting Variables @subsection Deleting Variables These functions remove variables from a dictionary's array of variables. They also destroy the removed variables and free their associated storage. Deleting a variable to which there might be external pointers is a bad idea. In particular, deleting variables from the active dataset dictionary is a risky proposition, because transformations can retain references to arbitrary variables. Therefore, no variable should be deleted from the active dataset dictionary when any transformations are active, because those transformations might reference the variable to be deleted. The safest time to delete a variable is just after a procedure has been executed, as done by @cmd{DELETE VARIABLES}. Deleting a variable automatically removes references to that variable from elsewhere in the dictionary as a weighting variable, filter variable, @cmd{SPLIT FILE} variable, or member of a vector. No functions are provided for removing a variable from a dictionary without destroying that variable. As with insertion of an existing variable, there is no reason that this could not be implemented, but so far there has been no need. @deftypefun void dict_delete_var (struct dictionary *@var{dict}, struct variable *@var{var}) Deletes @var{var} from @var{dict}, of which it must be a member. @end deftypefun @deftypefun void dict_delete_vars (struct dictionary *@var{dict}, struct variable *const *@var{vars}, size_t @var{count}) Deletes the @var{count} variables in array @var{vars} from @var{dict}. All of the variables in @var{vars} must be members of @var{dict}. No variable may be included in @var{vars} more than once. @end deftypefun @deftypefun void dict_delete_consecutive_vars (struct dictionary *@var{dict}, size_t @var{idx}, size_t @var{count}) Deletes the variables in sequential positions @var{idx}@dots{}@var{idx} + @var{count} (exclusive) from @var{dict}, which must contain at least @var{idx} + @var{count} variables. @end deftypefun @deftypefun void dict_delete_scratch_vars (struct dictionary *@var{dict}) Deletes all scratch variables from @var{dict}. @end deftypefun @node Dictionary Reordering Variables @subsection Changing Variable Order The variables in a dictionary are stored in an array. These functions change the order of a dictionary's array of variables without changing which variables are in the dictionary. @anchor{dict_reorder_var} @deftypefun void dict_reorder_var (struct dictionary *@var{dict}, struct variable *@var{var}, size_t @var{new_index}) Moves @var{var}, which must be in @var{dict}, so that it is at position @var{new_index} in @var{dict}'s array of variables. Other variables in @var{dict}, if any, retain their relative positions. @var{new_index} must be less than the number of variables in @var{dict}. @end deftypefun @deftypefun void dict_reorder_vars (struct dictionary *@var{dict}, struct variable *const *@var{new_order}, size_t @var{count}) Moves the @var{count} variables in @var{new_order} to the beginning of @var{dict}'s array of variables in the specified order. Other variables in @var{dict}, if any, retain their relative positions. All of the variables in @var{new_order} must be in @var{dict}. No duplicates are allowed within @var{new_order}, which means that @var{count} must be no greater than the number of variables in @var{dict}. @end deftypefun @node Dictionary Renaming Variables @subsection Renaming Variables These functions change the names of variables within a dictionary. The @func{var_set_name} function (@pxref{var_set_name}) cannot be applied directly to a variable that is in a dictionary, because @struct{dictionary} contains an index by name that @func{var_set_name} would not update. The following functions take care to update the index as well. They also ensure that variable renaming does not cause a dictionary to contain a duplicate variable name. @deftypefun void dict_rename_var (struct dictionary *@var{dict}, struct variable *@var{var}, const char *@var{new_name}) Changes the name of @var{var}, which must be in @var{dict}, to @var{new_name}. A variable named @var{new_name} must not already be in @var{dict}, unless @var{new_name} is the same as @var{var}'s current name. @end deftypefun @deftypefun bool dict_rename_vars (struct dictionary *@var{dicT}, struct variable **@var{vars}, char **@var{new_names}, size_t @var{count}, char **@var{err_name}) Renames each of the @var{count} variables in @var{vars} to the name in the corresponding position of @var{new_names}. If the renaming would result in a duplicate variable name, returns false and stores one of the names that would be be duplicated into @code{*@var{err_name}}, if @var{err_name} is non-null. Otherwise, the renaming is successful, and true is returned. @end deftypefun @node Dictionary Weight Variable @subsection Weight Variable A data set's cases may optionally be weighted by the value of a numeric variable. @xref{WEIGHT,,,pspp, PSPP Users Guide}, for a user view of weight variables. The weight variable is written to and read from system and portable files. The most commonly useful function related to weighting is a convenience function to retrieve a weighting value from a case. @deftypefun double dict_get_case_weight (const struct dictionary *@var{dict}, const struct ccase *@var{case}, bool *@var{warn_on_invalid}) Retrieves and returns the value of the weighting variable specified by @var{dict} from @var{case}. Returns 1.0 if @var{dict} has no weighting variable. Returns 0.0 if @var{c}'s weight value is user- or system-missing, zero, or negative. In such a case, if @var{warn_on_invalid} is non-null and @code{*@var{warn_on_invalid}} is true, @func{dict_get_case_weight} also issues an error message and sets @code{*@var{warn_on_invalid}} to false. To disable error reporting, pass a null pointer or a pointer to false as @var{warn_on_invalid} or use a @func{msg_disable}/@func{msg_enable} pair. @end deftypefun The dictionary also has a pair of functions for getting and setting the weight variable. @deftypefun {struct variable *} dict_get_weight (const struct dictionary *@var{dict}) Returns @var{dict}'s current weighting variable, or a null pointer if the dictionary does not have a weighting variable. @end deftypefun @deftypefun void dict_set_weight (struct dictionary *@var{dict}, struct variable *@var{var}) Sets @var{dict}'s weighting variable to @var{var}. If @var{var} is non-null, it must be a numeric variable in @var{dict}. If @var{var} is null, then @var{dict}'s weighting variable, if any, is cleared. @end deftypefun @node Dictionary Filter Variable @subsection Filter Variable When the active dataset is read by a procedure, cases can be excluded from analysis based on the values of a @dfn{filter variable}. @xref{FILTER,,,pspp, PSPP Users Guide}, for a user view of filtering. These functions store and retrieve the filter variable. They are rarely useful, because the data analysis framework automatically excludes from analysis the cases that should be filtered. @deftypefun {struct variable *} dict_get_filter (const struct dictionary *@var{dict}) Returns @var{dict}'s current filter variable, or a null pointer if the dictionary does not have a filter variable. @end deftypefun @deftypefun void dict_set_filter (struct dictionary *@var{dict}, struct variable *@var{var}) Sets @var{dict}'s filter variable to @var{var}. If @var{var} is non-null, it must be a numeric variable in @var{dict}. If @var{var} is null, then @var{dict}'s filter variable, if any, is cleared. @end deftypefun @node Dictionary Case Limit @subsection Case Limit The limit on cases analyzed by a procedure, set by the @cmd{N OF CASES} command (@pxref{N OF CASES,,,pspp, PSPP Users Guide}), is stored as part of the dictionary. The dictionary does not, on the other hand, play any role in enforcing the case limit (a job done by data analysis framework code). A case limit of 0 means that the number of cases is not limited. These functions are rarely useful, because the data analysis framework automatically excludes from analysis any cases beyond the limit. @deftypefun casenumber dict_get_case_limit (const struct dictionary *@var{dict}) Returns the current case limit for @var{dict}. @end deftypefun @deftypefun void dict_set_case_limit (struct dictionary *@var{dict}, casenumber @var{limit}) Sets @var{dict}'s case limit to @var{limit}. @end deftypefun @node Dictionary Split Variables @subsection Split Variables The user may use the @cmd{SPLIT FILE} command (@pxref{SPLIT FILE,,,pspp, PSPP Users Guide}) to select a set of variables on which to split the active dataset into groups of cases to be analyzed independently in each statistical procedure. The set of split variables is stored as part of the dictionary, although the effect on data analysis is implemented by each individual statistical procedure. Split variables may be numeric or short or long string variables. The most useful functions for split variables are those to retrieve them. Even these functions are rarely useful directly: for the purpose of breaking cases into groups based on the values of the split variables, it is usually easier to use @func{casegrouper_create_splits}. @deftypefun {const struct variable *const *} dict_get_split_vars (const struct dictionary *@var{dict}) Returns a pointer to an array of pointers to split variables. If and only if there are no split variables, returns a null pointer. The caller must not modify or free the returned array. @end deftypefun @deftypefun size_t dict_get_split_cnt (const struct dictionary *@var{dict}) Returns the number of split variables. @end deftypefun The following functions are also available for working with split variables. @deftypefun void dict_set_split_vars (struct dictionary *@var{dict}, struct variable *const *@var{vars}, size_t @var{cnt}) Sets @var{dict}'s split variables to the @var{cnt} variables in @var{vars}. If @var{cnt} is 0, then @var{dict} will not have any split variables. The caller retains ownership of @var{vars}. @end deftypefun @deftypefun void dict_unset_split_var (struct dictionary *@var{dict}, struct variable *@var{var}) Removes @var{var}, which must be a variable in @var{dict}, from @var{dict}'s split of split variables. @end deftypefun @node Dictionary File Label @subsection File Label A dictionary may optionally have an associated string that describes its contents, called its file label. The user may set the file label with the @cmd{FILE LABEL} command (@pxref{FILE LABEL,,,pspp, PSPP Users Guide}). These functions set and retrieve the file label. @deftypefun {const char *} dict_get_label (const struct dictionary *@var{dict}) Returns @var{dict}'s file label. If @var{dict} does not have a label, returns a null pointer. @end deftypefun @deftypefun void dict_set_label (struct dictionary *@var{dict}, const char *@var{label}) Sets @var{dict}'s label to @var{label}. If @var{label} is non-null, then its content, truncated to at most 60 bytes, becomes the new file label. If @var{label} is null, then @var{dict}'s label is removed. The caller retains ownership of @var{label}. @end deftypefun @node Dictionary Documents @subsection Documents A dictionary may include an arbitrary number of lines of explanatory text, called the dictionary's documents. For compatibility, document lines have a fixed width, and lines that are not exactly this width are truncated or padded with spaces as necessary to bring them to the correct width. PSPP users can use the @cmd{DOCUMENT} (@pxref{DOCUMENT,,,pspp, PSPP Users Guide}), @cmd{ADD DOCUMENT} (@pxref{ADD DOCUMENT,,,pspp, PSPP Users Guide}), and @cmd{DROP DOCUMENTS} (@pxref{DROP DOCUMENTS,,,pspp, PSPP Users Guide}) commands to manipulate documents. @deftypefn Macro int DOC_LINE_LENGTH The fixed length of a document line, in bytes, defined to 80. @end deftypefn The following functions work with whole sets of documents. They accept or return sets of documents formatted as null-terminated strings that are an exact multiple of @code{DOC_LINE_LENGTH} bytes in length. @deftypefun {const char *} dict_get_documents (const struct dictionary *@var{dict}) Returns the documents in @var{dict}, or a null pointer if @var{dict} has no documents. @end deftypefun @deftypefun void dict_set_documents (struct dictionary *@var{dict}, const char *@var{new_documents}) Sets @var{dict}'s documents to @var{new_documents}. If @var{new_documents} is a null pointer or an empty string, then @var{dict}'s documents are cleared. The caller retains ownership of @var{new_documents}. @end deftypefun @deftypefun void dict_clear_documents (struct dictionary *@var{dict}) Clears the documents from @var{dict}. @end deftypefun The following functions work with individual lines in a dictionary's set of documents. @deftypefun void dict_add_document_line (struct dictionary *@var{dict}, const char *@var{content}) Appends @var{content} to the documents in @var{dict}. The text in @var{content} will be truncated or padded with spaces as necessary to make it exactly @code{DOC_LINE_LENGTH} bytes long. The caller retains ownership of @var{content}. If @var{content} is over @code{DOC_LINE_LENGTH}, this function also issues a warning using @func{msg}. To suppress the warning, enclose a call to one of this function in a @func{msg_disable}/@func{msg_enable} pair. @end deftypefun @deftypefun size_t dict_get_document_line_cnt (const struct dictionary *@var{dict}) Returns the number of line of documents in @var{dict}. If the dictionary contains no documents, returns 0. @end deftypefun @deftypefun void dict_get_document_line (const struct dictionary *@var{dict}, size_t @var{idx}, struct string *@var{content}) Replaces the text in @var{content} (which must already have been initialized by the caller) by the document line in @var{dict} numbered @var{idx}, which must be less than the number of lines of documents in @var{dict}. Any trailing white space in the document line is trimmed, so that @var{content} will have a length between 0 and @code{DOC_LINE_LENGTH}. @end deftypefun @node Coding Conventions @section Coding Conventions Every @file{.c} file should have @samp{#include } as its first non-comment line. No @file{.h} file should include @file{config.h}. This section needs to be finished. @node Cases @section Cases This section needs to be written. @node Data Sets @section Data Sets This section needs to be written. @node Pools @section Pools This section needs to be written. @c LocalWords: bool pspp-1.4.1/doc/dev/intro.texi0000644000175000017500000000311013546443556015476 0ustar00blpblp00000000000000@c PSPP - a program for statistical analysis. @c Copyright (C) 2019 Free Software Foundation, Inc. @c Permission is granted to copy, distribute and/or modify this document @c under the terms of the GNU Free Documentation License, Version 1.3 @c or any later version published by the Free Software Foundation; @c with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. @c A copy of the license is included in the section entitled "GNU @c Free Documentation License". @c @node Introduction @chapter Introduction This manual is a guide to PSPP internals. Its intended audience is developers who wish to modify or extend PSPP's capabilities. The use of PSPP is documented in a separate manual. @xref{Top, , Introduction, pspp, PSPP Users Guide}. This manual is both a tutorial and a reference manual for PSPP developers. It is ultimately intended to cover everything that developers who wish to implement new PSPP statistical procedures and other commands should know. It is currently incomplete, partly because existing developers have not yet spent enough time on writing, and partly because the interfaces not yet documented are not yet mature enough to making documenting them worthwhile. PSPP developers should have some familiarity with the basics of PSPP from a user's perspective. This manual attempts to refer to the PSPP user manual's descriptions of concepts that PSPP users should find familiar at the time of their first reference. However, it is probably a good idea to at least skim the PSPP manual before reading this one, if you are not already familiar with PSPP. pspp-1.4.1/doc/pspp.info-10000644000175000017500000113124613725007453014673 0ustar00blpblp00000000000000This is pspp.info, produced by makeinfo version 6.7 from pspp.texi. This manual is for GNU PSPP version 1.4.1, software for statistical analysis. Copyright (C) 1997, 1998, 2004, 2005, 2009, 2012, 2013, 2014, 2016, 2019 Free Software Foundation, Inc. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included in the section entitled "GNU Free Documentation License". INFO-DIR-SECTION Math START-INFO-DIR-ENTRY * PSPP: (pspp). Statistical analysis package. * PSPPIRE: (pspp). Graphical user interface to PSPP. END-INFO-DIR-ENTRY The authors wish to thank Network Theory Ltd for their financial support in the production of this manual.  File: pspp.info, Node: Top, Next: Introduction, Up: (dir) GNU PSPP ******** This manual is for GNU PSPP version 1.4.1, software for statistical analysis. Copyright (C) 1997, 1998, 2004, 2005, 2009, 2012, 2013, 2014, 2016, 2019 Free Software Foundation, Inc. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included in the section entitled "GNU Free Documentation License". * Menu: * Introduction:: Description of the package. * License:: Your rights and obligations. * Invoking PSPP:: Starting the PSPP text-based interface. * Invoking PSPPIRE:: Starting the PSPP graphical user interface. * Using PSPP:: How to use PSPP -- A brief tutorial. * Language:: Basics of the PSPP command language. * Expressions:: Numeric and string expression syntax. * Data Input and Output:: Reading data from user files. * System and Portable File IO:: Reading and writing system & portable files. * Combining Data Files:: Combining data from multiple files. * Variable Attributes:: Adjusting and examining variables. * Data Manipulation:: Simple operations on data. * Data Selection:: Select certain cases for analysis. * Conditionals and Looping:: Doing things many times or not at all. * Statistics:: Basic statistical procedures. * Utilities:: Other commands. * Invoking pspp-convert:: Utility for converting among file formats. * Invoking pspp-output:: Utility for working with viewer (SPV) files. * Invoking pspp-dump-sav:: Utility for examining raw .sav files. * Not Implemented:: What's not here yet * Bugs:: Known problems; submitting bug reports. * Function Index:: Index of PSPP functions for expressions. * Command Index:: Index of PSPP procedures. * Concept Index:: Index of concepts. * GNU Free Documentation License:: License for copying this manual.  File: pspp.info, Node: Introduction, Next: License, Prev: Top, Up: Top 1 Introduction ************** PSPP is a tool for statistical analysis of sampled data. It reads the data, analyzes the data according to commands provided, and writes the results to a listing file, to the standard output or to a window of the graphical display. The language accepted by PSPP is similar to those accepted by SPSS statistical products. The details of PSPP's language are given later in this manual. PSPP produces tables and charts as output, which it can produce in several formats; currently, ASCII, PostScript, PDF, HTML, and DocBook are supported. The current version of PSPP, 1.4.1, is incomplete in terms of its statistical procedure support. PSPP is a work in progress. The authors hope to fully support all features in the products that PSPP replaces, eventually. The authors welcome questions, comments, donations, and code submissions. *Note Submitting Bug Reports: Bugs, for instructions on contacting the authors.  File: pspp.info, Node: License, Next: Invoking PSPP, Prev: Introduction, Up: Top 2 Your rights and obligations ***************************** PSPP is not in the public domain. It is copyrighted and there are restrictions on its distribution, but these restrictions are designed to permit everything that a good cooperating citizen would want to do. What is not allowed is to try to prevent others from further sharing any version of this program that they might get from you. Specifically, we want to make sure that you have the right to give away copies of PSPP, that you receive source code or else can get it if you want it, that you can change these programs or use pieces of them in new free programs, and that you know you can do these things. To make sure that everyone has such rights, we have to forbid you to deprive anyone else of these rights. For example, if you distribute copies of PSPP, 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 tell them their rights. Also, for our own protection, we must make certain that everyone finds out that there is no warranty for PSPP. If these programs are modified by someone else and passed on, we want their recipients to know that what they have is not what we distributed, so that any problems introduced by others will not reflect on our reputation. 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. The precise conditions of the license for PSPP are found in the GNU General Public License. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. This manual specifically is covered by the GNU Free Documentation License (*note GNU Free Documentation License::).  File: pspp.info, Node: Invoking PSPP, Next: Invoking PSPPIRE, Prev: License, Up: Top 3 Invoking 'pspp' ***************** PSPP has two separate user interfaces. This chapter describes 'pspp', PSPP's command-line driven text-based user interface. The following chapter briefly describes PSPPIRE, the graphical user interface to PSPP. The sections below describe the 'pspp' program's command-line interface. * Menu: * Main Options:: * PDF PostScript and SVG Output Options:: * Plain Text Output Options:: * HTML Output Options:: * OpenDocument Output Options:: * Comma-Separated Value Output Options::  File: pspp.info, Node: Main Options, Next: PDF PostScript and SVG Output Options, Up: Invoking PSPP 3.1 Main Options ================ Here is a summary of all the options, grouped by type, followed by explanations in the same order. In the table, arguments to long options also apply to any corresponding short options. _Non-option arguments_ SYNTAX-FILE _Output options_ -o, --output=OUTPUT-FILE -O OPTION=VALUE -O format=FORMAT -O device={terminal|listing} --no-output -e, --error-file=ERROR-FILE _Language options_ -I, --include=DIR -I-, --no-include -b, --batch -i, --interactive -r, --no-statrc -a, --algorithm={compatible|enhanced} -x, --syntax={compatible|enhanced} --syntax-encoding=ENCODING _Informational options_ -h, --help -V, --version _Other options_ -s, --safer --testing-mode SYNTAX-FILE Read and execute the named syntax file. If no syntax files are specified, PSPP prompts for commands. If any syntax files are specified, PSPP by default exits after it runs them, but you may make it prompt for commands by specifying '-' as an additional syntax file. '-o OUTPUT-FILE' Write output to OUTPUT-FILE. PSPP has several different output drivers that support output in various formats (use '--help' to list the available formats). Specify this option more than once to produce multiple output files, presumably in different formats. Use '-' as OUTPUT-FILE to write output to standard output. If no '-o' option is used, then PSPP writes text and CSV output to standard output and other kinds of output to whose name is based on the format, e.g. 'pspp.pdf' for PDF output. '-O OPTION=VALUE' Sets an option for the output file configured by a preceding '-o'. Most options are specific to particular output formats. A few options that apply generically are listed below. '-O format=FORMAT' PSPP uses the extension of the file name given on '-o' to select an output format. Use this option to override this choice by specifying an alternate format, e.g. '-o pspp.out -O html' to write HTML to a file named 'pspp.out'. Use '--help' to list the available formats. '-O device={terminal|listing}' Sets whether PSPP considers the output device configured by the preceding '-o' to be a terminal or a listing device. This affects what output will be sent to the device, as configured by the SET command's output routing subcommands (*note SET::). By default, output written to standard output is considered a terminal device and other output is considered a listing device. '--no-output' Disables output entirely, if neither '-o' nor '-O' is also used. If one of those options is used, '--no-output' has no effect. '-e ERROR-FILE' '--error-file=ERROR-FILE' Configures a file to receive PSPP error, warning, and note messages in plain text format. Use '-' as ERROR-FILE to write messages to standard output. The default error file is standard output in the absence of these options, but this is suppressed if an output device writes to standard output (or another terminal), to avoid printing every message twice. Use 'none' as ERROR-FILE to explicitly suppress the default. '-I DIR' '--include=DIR' Appends DIR to the set of directories searched by the 'INCLUDE' (*note INCLUDE::) and 'INSERT' (*note INSERT::) commands. '-I-' '--no-include' Clears all directories from the include path, including directories inserted in the include path by default. The default include path is '.' (the current directory), followed by '.pspp' in the user's home directory, followed by PSPP's system configuration directory (usually '/etc/pspp' or '/usr/local/etc/pspp'). '-b' '--batch' '-i' '--interactive' These options forces syntax files to be interpreted in batch mode or interactive mode, respectively, rather than the default "auto" mode. *Note Syntax Variants::, for a description of the differences. '-r' '--no-statrc' By default, at startup PSPP searches for a file named 'rc' in the include path (described above) and, if it finds one, runs the commands in it. This option disables this behavior. '-a {enhanced|compatible}' '--algorithm={enhanced|compatible}' With 'enhanced', the default, PSPP uses the best implemented algorithms for statistical procedures. With 'compatible', however, PSPP will in some cases use inferior algorithms to produce the same results as the proprietary program SPSS. Some commands have subcommands that override this setting on a per command basis. '-x {enhanced|compatible}' '--syntax={enhanced|compatible}' With 'enhanced', the default, PSPP accepts its own extensions beyond those compatible with the proprietary program SPSS. With 'compatible', PSPP rejects syntax that uses these extensions. '--syntax-encoding=ENCODING' Specifies ENCODING as the encoding for syntax files named on the command line. The ENCODING also becomes the default encoding for other syntax files read during the PSPP session by the 'INCLUDE' and 'INSERT' commands. *Note INSERT::, for the accepted forms of ENCODING. '--help' Prints a message describing PSPP command-line syntax and the available device formats, then exits. '-V' '--version' Prints a brief message listing PSPP's version, warranties you don't have, copying conditions and copyright, and e-mail address for bug reports, then exits. '-s' '--safer' Disables certain unsafe operations. This includes the 'ERASE' and 'HOST' commands, as well as use of pipes as input and output files. '--testing-mode' Invoke heuristics to assist with testing PSPP. For use by 'make check' and similar scripts.  File: pspp.info, Node: PDF PostScript and SVG Output Options, Next: Plain Text Output Options, Prev: Main Options, Up: Invoking PSPP 3.2 PDF, PostScript, and SVG Output Options =========================================== To produce output in PDF, PostScript, and SVG formats, specify '-o FILE' on the PSPP command line, optionally followed by any of the options shown in the table below to customize the output format. PDF, PostScript, and SVG output is only available if your installation of PSPP was compiled with the Cairo library. '-O format={pdf|ps|svg}' Specify the output format. This is only necessary if the file name given on '-o' does not end in '.pdf', '.ps', or '.svg'. '-O paper-size=PAPER-SIZE' Paper size, as a name (e.g. 'a4', 'letter') or measurements (e.g. '210x297', '8.5x11in'). The default paper size is taken from the 'PAPERSIZE' environment variable or the file indicated by the 'PAPERCONF' environment variable, if either variable is set. If not, and your system supports the 'LC_PAPER' locale category, then the default paper size is taken from the locale. Otherwise, if '/etc/papersize' exists, the default paper size is read from it. As a last resort, A4 paper is assumed. '-O foreground-color=COLOR' '-O background-color=COLOR' Sets COLOR as the color to be used for the background or foreground. Color should be given in the format '#RRRRGGGGBBBB', where RRRR, GGGG and BBBB are 4 character hexadecimal representations of the red, green and blue components respectively. '-O orientation=ORIENTATION' Either 'portrait' or 'landscape'. Default: 'portrait'. '-O left-margin=DIMENSION' '-O right-margin=DIMENSION' '-O top-margin=DIMENSION' '-O bottom-margin=DIMENSION' Sets the margins around the page. See below for the allowed forms of DIMENSION Default: '0.5in'. '-O prop-font=FONT-NAME' '-O emph-font=FONT-NAME' '-O fixed-font=FONT-NAME' Sets the font used for proportional, emphasized, or fixed-pitch text. Most systems support CSS-like font names such as "serif" and "monospace", but a wide range of system-specific font are likely to be supported as well. Default: proportional font 'serif', emphasis font 'serif italic', fixed-pitch font 'monospace'. '-O font-size=FONT-SIZE' Sets the size of the default fonts, in thousandths of a point. Default: 10000 (10 point). '-O line-gutter=DIMENSION' Sets the width of white space on either side of lines that border text or graphics objects. Default: '1pt'. '-O line-spacing=DIMENSION' Sets the spacing between the lines in a double line in a table. Default: '1pt'. '-O line-width=DIMENSION' Sets the width of the lines used in tables. Default: '0.5pt'. Each DIMENSION value above may be specified in various units based on its suffix: 'mm' for millimeters, 'in' for inches, or 'pt' for points. Lacking a suffix, numbers below 50 are assumed to be in inches and those about 50 are assumed to be in millimeters.  File: pspp.info, Node: Plain Text Output Options, Next: HTML Output Options, Prev: PDF PostScript and SVG Output Options, Up: Invoking PSPP 3.3 Plain Text Output Options ============================= PSPP can produce plain text output, drawing boxes using ASCII or Unicode line drawing characters. To produce plain text output, specify '-o FILE' on the PSPP command line, optionally followed by options from the table below to customize the output format. Plain text output is encoded in UTF-8. '-O format=txt' Specify the output format. This is only necessary if the file name given on '-o' does not end in '.txt' or '.list'. '-O charts={TEMPLATE.png|none}' Name for chart files included in output. The value should be a file name that includes a single '#' and ends in 'png'. When a chart is output, the '#' is replaced by the chart number. The default is the file name specified on '-o' with the extension stripped off and replaced by '-#.png'. Specify 'none' to disable chart output. Charts are always disabled if your installation of PSPP was compiled without the Cairo library. '-O foreground-color=COLOR' '-O background-color=COLOR' Sets COLOR as the color to be used for the background or foreground to be used for charts. Color should be given in the format '#RRRRGGGGBBBB', where RRRR, GGGG and BBBB are 4 character hexadecimal representations of the red, green and blue components respectively. If charts are disabled, this option has no effect. '-O width=COLUMNS' Width of a page, in columns. If unspecified or given as 'auto', the default is the width of the terminal, for interactive output, or the WIDTH setting (*note SET::), for output to a file. '-O box={ascii|unicode}' Sets the characters used for lines in tables. If set to 'ascii' the characters '-', '|', and '+' for single-width lines and '=' and '#' for double-width lines are used. If set to 'unicode' then Unicode box drawing characters will be used. The default is 'unicode' if the locale's character encoding is "UTF-8" or 'ascii' otherwise. '-O emphasis={none|bold|underline}' How to emphasize text. Bold and underline emphasis are achieved with overstriking, which may not be supported by all the software to which you might pass the output. Default: 'none'.  File: pspp.info, Node: HTML Output Options, Next: OpenDocument Output Options, Prev: Plain Text Output Options, Up: Invoking PSPP 3.4 HTML Output Options ======================= To produce output in HTML format, specify '-o FILE' on the PSPP command line, optionally followed by any of the options shown in the table below to customize the output format. '-O format=html' Specify the output format. This is only necessary if the file name given on '-o' does not end in '.html'. '-O charts={TEMPLATE.png|none}' Sets the name used for chart files. *Note Plain Text Output Options::, for details. '-O borders=BOOLEAN' Decorate the tables with borders. If set to false, the tables produced will have no borders. The default value is true. '-O css=BOOLEAN' Use cascading style sheets. Cascading style sheets give an improved appearance and can be used to produce pages which fit a certain web site's style. The default value is true.  File: pspp.info, Node: OpenDocument Output Options, Next: Comma-Separated Value Output Options, Prev: HTML Output Options, Up: Invoking PSPP 3.5 OpenDocument Output Options =============================== To produce output as an OpenDocument text (ODT) document, specify '-o FILE' on the PSPP command line. If FILE does not end in '.odt', you must also specify '-O format=odt'. ODT support is only available if your installation of PSPP was compiled with the libxml2 library. The OpenDocument output format does not have any configurable options.  File: pspp.info, Node: Comma-Separated Value Output Options, Prev: OpenDocument Output Options, Up: Invoking PSPP 3.6 Comma-Separated Value Output Options ======================================== To produce output in comma-separated value (CSV) format, specify '-o FILE' on the PSPP command line, optionally followed by any of the options shown in the table below to customize the output format. '-O format=csv' Specify the output format. This is only necessary if the file name given on '-o' does not end in '.csv'. '-O separator=FIELD-SEPARATOR' Sets the character used to separate fields. Default: a comma (','). '-O quote=QUALIFIER' Sets QUALIFIER as the character used to quote fields that contain white space, the separator (or any of the characters in the separator, if it contains more than one character), or the quote character itself. If QUALIFIER is longer than one character, only the first character is used; if QUALIFIER is the empty string, then fields are never quoted. '-O titles=BOOLEAN' Whether table titles (brief descriptions) should be printed. Default: 'on'. '-O captions=BOOLEAN' Whether table captions (more extensive descriptions) should be printed. Default: on. The CSV format used is an extension to that specified in RFC 4180: Tables Each table row is output on a separate line, and each column is output as a field. The contents of a cell that spans multiple rows or columns is output only for the top-left row and column; the rest are output as empty fields. Titles When a table has a title and titles are enabled, the title is output just above the table as a single field prefixed by 'Table:'. Captions When a table has a caption and captions are enabled, the caption is output just below the table as a single field prefixed by 'Caption:'. Footnotes Within a table, footnote markers are output as bracketed letters following the cell's contents, e.g. '[a]', '[b]', ... The footnotes themselves are output following the body of the table, as a separate two-column table introduced with a line that says 'Footnotes:'. Each row in the table represent one footnote: the first column is the marker, the second column is the text. Text Text in output is printed as a field on a line by itself. The TITLE and SUBTITLE produce similar output, prefixed by 'Title:' or 'Subtitle:', respectively. Messages Errors, warnings, and notes are printed the same way as text. Charts Charts are not included in CSV output. Successive output items are separated by a blank line.  File: pspp.info, Node: Invoking PSPPIRE, Next: Using PSPP, Prev: Invoking PSPP, Up: Top 4 Invoking 'psppire' ******************** 4.1 The graphic user interface ============================== The PSPPIRE graphic user interface for PSPP can perform all functionality of the command line interface. In addition it gives an instantaneous view of the data, variables and statistical output. The graphic user interface can be started by typing 'psppire' at a command prompt. Alternatively many systems have a system of interactive menus or buttons from which 'psppire' can be started by a series of mouse clicks. Once the principles of the PSPP system are understood, the graphic user interface is designed to be largely intuitive, and for this reason is covered only very briefly by this manual.  File: pspp.info, Node: Using PSPP, Next: Language, Prev: Invoking PSPPIRE, Up: Top 5 Using PSPP ************ PSPP is a tool for the statistical analysis of sampled data. You can use it to discover patterns in the data, to explain differences in one subset of data in terms of another subset and to find out whether certain beliefs about the data are justified. This chapter does not attempt to introduce the theory behind the statistical analysis, but it shows how such analysis can be performed using PSPP. For the purposes of this tutorial, it is assumed that you are using PSPP in its interactive mode from the command line. However, the example commands can also be typed into a file and executed in a post-hoc mode by typing 'pspp FILENAME' at a shell prompt, where FILENAME is the name of the file containing the commands. Alternatively, from the graphical interface, you can select File -> New -> Syntax to open a new syntax window and use the Run menu when a syntax fragment is ready to be executed. Whichever method you choose, the syntax is identical. When using the interactive method, PSPP tells you that it's waiting for your data with a string like PSPP> or data>. In the examples of this chapter, whenever you see text like this, it indicates the prompt displayed by PSPP, _not_ something that you should type. Throughout this chapter reference is made to a number of sample data files. So that you can try the examples for yourself, you should have received these files along with your copy of PSPP.(1) *Please note:* Normally these files are installed in the directory '/usr/local/share/pspp/examples'. If however your system administrator or operating system vendor has chosen to install them in a different location, you will have to adjust the examples accordingly. * Menu: * Preparation of Data Files:: * Data Screening and Transformation:: * Hypothesis Testing:: ---------- Footnotes ---------- (1) These files contain purely fictitious data. They should not be used for research purposes.  File: pspp.info, Node: Preparation of Data Files, Next: Data Screening and Transformation, Up: Using PSPP 5.1 Preparation of Data Files ============================= Before analysis can commence, the data must be loaded into PSPP and arranged such that both PSPP and humans can understand what the data represents. There are two aspects of data: * The variables -- these are the parameters of a quantity which has been measured or estimated in some way. For example height, weight and geographic location are all variables. * The observations (also called 'cases') of the variables -- each observation represents an instance when the variables were measured or observed. For example, a data set which has the variables HEIGHT, WEIGHT, and NAME, might have the observations: 1881 89.2 Ahmed 1192 107.01 Frank 1230 67 Julie The following sections explain how to define a dataset. * Menu: * Defining Variables:: * Listing the data:: * Reading data from a text file:: * Reading data from a pre-prepared PSPP file:: * Saving data to a PSPP file.:: * Reading data from other sources:: * Exiting PSPP::  File: pspp.info, Node: Defining Variables, Next: Listing the data, Up: Preparation of Data Files 5.1.1 Defining Variables ------------------------ Variables come in two basic types, viz: "numeric" and "string". Variables such as age, height and satisfaction are numeric, whereas name is a string variable. String variables are best reserved for commentary data to assist the human observer. However they can also be used for nominal or categorical data. *note Example 5.1: data-list. defines two variables FORENAME and HEIGHT, and reads data into them by manual input. PSPP> data list list /forename (A12) height. PSPP> begin data. data> Ahmed 188 data> Bertram 167 data> Catherine 134.231 data> David 109.1 data> end data PSPP> Example 5.1: Manual entry of data using the 'DATA LIST' command. Two variables FORENAME and HEIGHT are defined and subsequently filled with manually entered data. There are several things to note about this example. * The words 'data list list' are an example of the 'DATA LIST' command. *Note DATA LIST::. It tells PSPP to prepare for reading data. The word 'list' intentionally appears twice. The first occurrence is part of the 'DATA LIST' call, whilst the second tells PSPP that the data is to be read as free format data with one record per line. * The '/' character is important. It marks the start of the list of variables which you wish to define. * The text 'forename' is the name of the first variable, and '(A12)' says that the variable FORENAME is a string variable and that its maximum length is 12 bytes. The second variable's name is specified by the text 'height'. Since no format is given, this variable has the default format. Normally the default format expects numeric data, which should be entered in the locale of the operating system. Thus, the example is correct for English locales and other locales which use a period ('.') as the decimal separator. However if you are using a system with a locale which uses the comma (',') as the decimal separator, then you should in the subsequent lines substitute '.' with ','. Alternatively, you could explicitly tell PSPP that the HEIGHT variable is to be read using a period as its decimal separator by appending the text 'DOT8.3' after the word 'height'. For more information on data formats, *note Input and Output Formats::. * Normally, PSPP displays the prompt PSPP> whenever it's expecting a command. However, when it's expecting data, the prompt changes to data> so that you know to enter data and not a command. * At the end of every command there is a terminating '.' which tells PSPP that the end of a command has been encountered. You should not enter '.' when data is expected (ie. when the data> prompt is current) since it is appropriate only for terminating commands.  File: pspp.info, Node: Listing the data, Next: Reading data from a text file, Prev: Defining Variables, Up: Preparation of Data Files 5.1.2 Listing the data ---------------------- Once the data has been entered, you could type PSPP> list /format=numbered. to list the data. The optional text '/format=numbered' requests the case numbers to be shown along with the data. It should show the following output: Data List +-----------+---------+------+ |Case Number| forename|height| +-----------+---------+------+ |1 |Ahmed |188.00| |2 |Bertram |167.00| |3 |Catherine|134.23| |4 |David |109.10| +-----------+---------+------+ Note that the numeric variable HEIGHT is displayed to 2 decimal places, because the format for that variable is 'F8.2'. For a complete description of the 'LIST' command, *note LIST::.  File: pspp.info, Node: Reading data from a text file, Next: Reading data from a pre-prepared PSPP file, Prev: Listing the data, Up: Preparation of Data Files 5.1.3 Reading data from a text file ----------------------------------- The previous example showed how to define a set of variables and to manually enter the data for those variables. Manual entering of data is tedious work, and often a file containing the data will be have been previously prepared. Let us assume that you have a file called 'mydata.dat' containing the ascii encoded data: Ahmed 188.00 Bertram 167.00 Catherine 134.23 David 109.10 . . . Zachariah 113.02 You can can tell the 'DATA LIST' command to read the data directly from this file instead of by manual entry, with a command like: PSPP> data list file='mydata.dat' list /forename (A12) height. Notice however, that it is still necessary to specify the names of the variables and their formats, since this information is not contained in the file. It is also possible to specify the file's character encoding and other parameters. For full details refer to *note DATA LIST::.  File: pspp.info, Node: Reading data from a pre-prepared PSPP file, Next: Saving data to a PSPP file., Prev: Reading data from a text file, Up: Preparation of Data Files 5.1.4 Reading data from a pre-prepared PSPP file ------------------------------------------------ When working with other PSPP users, or users of other software which uses the PSPP data format, you may be given the data in a pre-prepared PSPP file. Such files contain not only the data, but the variable definitions, along with their formats, labels and other meta-data. Conventionally, these files (sometimes called "system" files) have the suffix '.sav', but that is not mandatory. The following syntax loads a file called 'my-file.sav'. PSPP> get file='my-file.sav'. You will encounter several instances of this in future examples.  File: pspp.info, Node: Saving data to a PSPP file., Next: Reading data from other sources, Prev: Reading data from a pre-prepared PSPP file, Up: Preparation of Data Files 5.1.5 Saving data to a PSPP file. --------------------------------- If you want to save your data, along with the variable definitions so that you or other PSPP users can use it later, you can do this with the 'SAVE' command. The following syntax will save the existing data and variables to a file called 'my-new-file.sav'. PSPP> save outfile='my-new-file.sav'. If 'my-new-file.sav' already exists, then it will be overwritten. Otherwise it will be created.  File: pspp.info, Node: Reading data from other sources, Next: Exiting PSPP, Prev: Saving data to a PSPP file., Up: Preparation of Data Files 5.1.6 Reading data from other sources ------------------------------------- Sometimes it's useful to be able to read data from comma separated text, from spreadsheets, databases or other sources. In these instances you should use the 'GET DATA' command (*note GET DATA::).  File: pspp.info, Node: Exiting PSPP, Prev: Reading data from other sources, Up: Preparation of Data Files 5.1.7 Exiting PSPP ------------------ Use the 'FINISH' command to exit PSPP: PSPP> finish.  File: pspp.info, Node: Data Screening and Transformation, Next: Hypothesis Testing, Prev: Preparation of Data Files, Up: Using PSPP 5.2 Data Screening and Transformation ===================================== Once data has been entered, it is often desirable, or even necessary, to transform it in some way before performing analysis upon it. At the very least, it's good practice to check for errors. * Menu: * Identifying incorrect data:: * Dealing with suspicious data:: * Inverting negatively coded variables:: * Testing data consistency:: * Testing for normality ::  File: pspp.info, Node: Identifying incorrect data, Next: Dealing with suspicious data, Up: Data Screening and Transformation 5.2.1 Identifying incorrect data -------------------------------- Data from real sources is rarely error free. PSPP has a number of procedures which can be used to help identify data which might be incorrect. The 'DESCRIPTIVES' command (*note DESCRIPTIVES::) is used to generate simple linear statistics for a dataset. It is also useful for identifying potential problems in the data. The example file 'physiology.sav' contains a number of physiological measurements of a sample of healthy adults selected at random. However, the data entry clerk made a number of mistakes when entering the data. *note Example 5.2: ex-descriptives. illustrates the use of 'DESCRIPTIVES' to screen this data and identify the erroneous values. PSPP> get file='/usr/local/share/pspp/examples/physiology.sav'. PSPP> descriptives sex, weight, height. Output: Descriptive Statistics +---------------------+--+-------+-------+-------+-------+ | | N| Mean |Std Dev|Minimum|Maximum| +---------------------+--+-------+-------+-------+-------+ |Sex of subject |40| .45| .50|Male |Female | |Weight in kilograms |40| 72.12| 26.70| -55.6| 92.1| |Height in millimeters|40|1677.12| 262.87| 179| 1903| |Valid N (listwise) |40| | | | | |Missing N (listwise) | 0| | | | | +---------------------+--+-------+-------+-------+-------+ Example 5.2: Using the 'DESCRIPTIVES' command to display simple summary information about the data. In this case, the results show unexpectedly low values in the Minimum column, suggesting incorrect data entry. In the output of *note Example 5.2: ex-descriptives, the most interesting column is the minimum value. The WEIGHT variable has a minimum value of less than zero, which is clearly erroneous. Similarly, the HEIGHT variable's minimum value seems to be very low. In fact, it is more than 5 standard deviations from the mean, and is a seemingly bizarre height for an adult person. We can examine the data in more detail with the 'EXAMINE' command (*note EXAMINE::): In *note Example 5.3: ex1. you can see that the lowest value of HEIGHT is 179 (which we suspect to be erroneous), but the second lowest is 1598 which we know from the 'DESCRIPTIVES' command is within 1 standard deviation from the mean. Similarly the WEIGHT variable has a lowest value which is negative but a plausible value for the second lowest value. This suggests that the two extreme values are outliers and probably represent data entry errors. [... continue from *note Example 5.2: ex-descriptives.] PSPP> examine height, weight /statistics=extreme(3). Output: Extreme Values +-------------------------------+-----------+-----+ | |Case Number|Value| +-------------------------------+-----------+-----+ |Height in millimeters Highest 1| 14| 1903| | 2| 15| 1884| | 3| 12| 1802| | Lowest 1| 30| 179| | 2| 31| 1598| | 3| 28| 1601| +-------------------------------+-----------+-----+ |Weight in kilograms Highest 1| 13| 92.1| | 2| 5| 92.1| | 3| 17| 91.7| | Lowest 1| 38|-55.6| | 2| 39| 54.5| | 3| 33| 55.4| +-------------------------------+-----------+-----+ Example 5.3: Using the 'EXAMINE' command to see the extremities of the data for different variables. Cases 30 and 38 seem to contain values very much lower than the rest of the data. They are possibly erroneous.  File: pspp.info, Node: Dealing with suspicious data, Next: Inverting negatively coded variables, Prev: Identifying incorrect data, Up: Data Screening and Transformation 5.2.2 Dealing with suspicious data ---------------------------------- If possible, suspect data should be checked and re-measured. However, this may not always be feasible, in which case the researcher may decide to disregard these values. PSPP has a feature whereby data can assume the special value 'SYSMIS', and will be disregarded in future analysis. *Note Missing Observations::. You can set the two suspect values to the 'SYSMIS' value using the 'RECODE' command. PSPP> recode height (179 = SYSMIS). PSPP> recode weight (LOWEST THRU 0 = SYSMIS). The first command says that for any observation which has a HEIGHT value of 179, that value should be changed to the SYSMIS value. The second command says that any WEIGHT values of zero or less should be changed to SYSMIS. From now on, they will be ignored in analysis. For detailed information about the 'RECODE' command *note RECODE::. If you now re-run the 'DESCRIPTIVES' or 'EXAMINE' commands in *note Example 5.2: ex-descriptives. and *note Example 5.3: ex1. you will see a data summary with more plausible parameters. You will also notice that the data summaries indicate the two missing values.  File: pspp.info, Node: Inverting negatively coded variables, Next: Testing data consistency, Prev: Dealing with suspicious data, Up: Data Screening and Transformation 5.2.3 Inverting negatively coded variables ------------------------------------------ Data entry errors are not the only reason for wanting to recode data. The sample file 'hotel.sav' comprises data gathered from a customer satisfaction survey of clients at a particular hotel. In *note Example 5.4: ex-reliability, this file is loaded for analysis. The line 'display dictionary.' tells PSPP to display the variables and associated data. The output from this command has been omitted from the example for the sake of clarity, but you will notice that each of the variables V1, V2 ... V5 are measured on a 5 point Likert scale, with 1 meaning "Strongly disagree" and 5 meaning "Strongly agree". Whilst variables V1, V2 and V4 record responses to a positively posed question, variables V3 and V5 are responses to negatively worded questions. In order to perform meaningful analysis, we need to recode the variables so that they all measure in the same direction. We could use the 'RECODE' command, with syntax such as: recode v3 (1 = 5) (2 = 4) (4 = 2) (5 = 1). However an easier and more elegant way uses the 'COMPUTE' command (*note COMPUTE::). Since the variables are Likert variables in the range (1 ... 5), subtracting their value from 6 has the effect of inverting them: compute VAR = 6 - VAR. *note Example 5.4: ex-reliability. uses this technique to recode the variables V3 and V5. After applying 'COMPUTE' for both variables, all subsequent commands will use the inverted values.  File: pspp.info, Node: Testing data consistency, Next: Testing for normality, Prev: Inverting negatively coded variables, Up: Data Screening and Transformation 5.2.4 Testing data consistency ------------------------------ A sensible check to perform on survey data is the calculation of reliability. This gives the statistician some confidence that the questionnaires have been completed thoughtfully. If you examine the labels of variables V1, V3 and V4, you will notice that they ask very similar questions. One would therefore expect the values of these variables (after recoding) to closely follow one another, and we can test that with the 'RELIABILITY' command (*note RELIABILITY::). *note Example 5.4: ex-reliability. shows a PSPP session where the user (after recoding negatively scaled variables) requests reliability statistics for V1, V3 and V4. PSPP> get file='/usr/local/share/pspp/examples/hotel.sav'. PSPP> display dictionary. PSPP> * recode negatively worded questions. PSPP> compute v3 = 6 - v3. PSPP> compute v5 = 6 - v5. PSPP> reliability v1, v3, v4. Output (dictionary information omitted for clarity): Scale: ANY Case Processing Summary +--------+--+-------+ |Cases | N|Percent| +--------+--+-------+ |Valid |17| 100.0%| |Excluded| 0| .0%| |Total |17| 100.0%| +--------+--+-------+ Reliability Statistics +----------------+----------+ |Cronbach's Alpha|N of Items| +----------------+----------+ | .81| 3| +----------------+----------+ Example 5.4: Recoding negatively scaled variables, and testing for reliability with the 'RELIABILITY' command. The Cronbach Alpha coefficient suggests a high degree of reliability among variables V1, V3 and V4. As a rule of thumb, many statisticians consider a value of Cronbach's Alpha of 0.7 or higher to indicate reliable data. Here, the value is 0.81 so the data and the recoding that we performed are vindicated.  File: pspp.info, Node: Testing for normality, Prev: Testing data consistency, Up: Data Screening and Transformation 5.2.5 Testing for normality --------------------------- Many statistical tests rely upon certain properties of the data. One common property, upon which many linear tests depend, is that of normality -- the data must have been drawn from a normal distribution. It is necessary then to ensure normality before deciding upon the test procedure to use. One way to do this uses the 'EXAMINE' command. In *note Example 5.5: normality, a researcher was examining the failure rates of equipment produced by an engineering company. The file 'repairs.sav' contains the mean time between failures (MTBF) of some items of equipment subject to the study. Before performing linear analysis on the data, the researcher wanted to ascertain that the data is normally distributed. A normal distribution has a skewness and kurtosis of zero. Looking at the skewness of MTBF in *note Example 5.5: normality. it is clear that the mtbf figures have a lot of positive skew and are therefore not drawn from a normally distributed variable. Positive skew can often be compensated for by applying a logarithmic transformation. This is done with the 'COMPUTE' command in the line compute mtbf_ln = ln (mtbf). Rather than redefining the existing variable, this use of 'COMPUTE' defines a new variable MTBF_LN which is the natural logarithm of MTBF. The final command in this example calls 'EXAMINE' on this new variable, and it can be seen from the results that both the skewness and kurtosis for MTBF_LN are very close to zero. This provides some confidence that the MTBF_LN variable is normally distributed and thus safe for linear analysis. In the event that no suitable transformation can be found, then it would be worth considering an appropriate non-parametric test instead of a linear one. *Note NPAR TESTS::, for information about non-parametric tests. PSPP> get file='/usr/local/share/pspp/examples/repairs.sav'. PSPP> examine mtbf /statistics=descriptives. PSPP> compute mtbf_ln = ln (mtbf). PSPP> examine mtbf_ln /statistics=descriptives. Output: Case Processing Summary +-----------------------------------+-------------------------------+ | | Cases | | +----------+---------+----------+ | | Valid | Missing | Total | | | N|Percent|N|Percent| N|Percent| +-----------------------------------+--+-------+-+-------+--+-------+ |Mean time between failures (months)|15| 100.0%|0| .0%|15| 100.0%| +-----------------------------------+--+-------+-+-------+--+-------+ Descriptives +----------------------------------------------------------+---------+--------+ | | | Std. | | |Statistic| Error | +----------------------------------------------------------+---------+--------+ |Mean time between Mean | 8.32| 1.62| |failures (months) 95% Confidence Interval Lower | 4.85| | | for Mean Bound | | | | Upper | 11.79| | | Bound | | | | 5% Trimmed Mean | 7.69| | | Median | 8.12| | | Variance | 39.21| | | Std. Deviation | 6.26| | | Minimum | 1.63| | | Maximum | 26.47| | | Range | 24.84| | | Interquartile Range | 5.83| | | Skewness | 1.85| .58| | Kurtosis | 4.49| 1.12| +----------------------------------------------------------+---------+--------+ Case Processing Summary +-------+-------------------------------+ | | Cases | | +----------+---------+----------+ | | Valid | Missing | Total | | | N|Percent|N|Percent| N|Percent| +-------+--+-------+-+-------+--+-------+ |mtbf_ln|15| 100.0%|0| .0%|15| 100.0%| +-------+--+-------+-+-------+--+-------+ Descriptives +----------------------------------------------------+---------+----------+ | |Statistic|Std. Error| +----------------------------------------------------+---------+----------+ |mtbf_ln Mean | 1.88| .19| | 95% Confidence Interval for Mean Lower Bound| 1.47| | | Upper Bound| 2.29| | | 5% Trimmed Mean | 1.88| | | Median | 2.09| | | Variance | .54| | | Std. Deviation | .74| | | Minimum | .49| | | Maximum | 3.28| | | Range | 2.79| | | Interquartile Range | .92| | | Skewness | -.16| .58| | Kurtosis | -.09| 1.12| +----------------------------------------------------+---------+----------+ Example 5.5: Testing for normality using the 'EXAMINE' command and applying a logarithmic transformation. The MTBF variable has a large positive skew and is therefore unsuitable for linear statistical analysis. However the transformed variable (MTBF_LN) is close to normal and would appear to be more suitable.  File: pspp.info, Node: Hypothesis Testing, Prev: Data Screening and Transformation, Up: Using PSPP 5.3 Hypothesis Testing ====================== One of the most fundamental purposes of statistical analysis is hypothesis testing. Researchers commonly need to test hypotheses about a set of data. For example, she might want to test whether one set of data comes from the same distribution as another, or whether the mean of a dataset significantly differs from a particular value. This section presents just some of the possible tests that PSPP offers. The researcher starts by making a "null hypothesis". Often this is a hypothesis which he suspects to be false. For example, if he suspects that A is greater than B he will state the null hypothesis as A = B.(1) The "p-value" is a recurring concept in hypothesis testing. It is the highest acceptable probability that the evidence implying a null hypothesis is false, could have been obtained when the null hypothesis is in fact true. Note that this is not the same as "the probability of making an error" nor is it the same as "the probability of rejecting a hypothesis when it is true". * Menu: * Testing for differences of means:: * Linear Regression:: ---------- Footnotes ---------- (1) This example assumes that it is already proven that B is not greater than A.  File: pspp.info, Node: Testing for differences of means, Next: Linear Regression, Up: Hypothesis Testing 5.3.1 Testing for differences of means -------------------------------------- A common statistical test involves hypotheses about means. The 'T-TEST' command is used to find out whether or not two separate subsets have the same mean. *note Example 5.6: ex-t-test. uses the file 'physiology.sav' previously encountered. A researcher suspected that the heights and core body temperature of persons might be different depending upon their sex. To investigate this, he posed two null hypotheses: * The mean heights of males and females in the population are equal. * The mean body temperature of males and females in the population are equal. For the purposes of the investigation the researcher decided to use a p-value of 0.05. In addition to the T-test, the 'T-TEST' command also performs the Levene test for equal variances. If the variances are equal, then a more powerful form of the T-test can be used. However if it is unsafe to assume equal variances, then an alternative calculation is necessary. PSPP performs both calculations. For the HEIGHT variable, the output shows the significance of the Levene test to be 0.33 which means there is a 33% probability that the Levene test produces this outcome when the variances are equal. Had the significance been less than 0.05, then it would have been unsafe to assume that the variances were equal. However, because the value is higher than 0.05 the homogeneity of variances assumption is safe and the "Equal Variances" row (the more powerful test) can be used. Examining this row, the two tailed significance for the HEIGHT t-test is less than 0.05, so it is safe to reject the null hypothesis and conclude that the mean heights of males and females are unequal. For the TEMPERATURE variable, the significance of the Levene test is 0.58 so again, it is safe to use the row for equal variances. The equal variances row indicates that the two tailed significance for TEMPERATURE is 0.20. Since this is greater than 0.05 we must reject the null hypothesis and conclude that there is insufficient evidence to suggest that the body temperature of male and female persons are different. PSPP> get file='/usr/local/share/pspp/examples/physiology.sav'. PSPP> recode height (179 = SYSMIS). PSPP> t-test group=sex(0,1) /variables = height temperature. Output: Group Statistics +-------------------------------------------+--+-------+-------------+--------+ | | | | Std. | S.E. | | Group | N| Mean | Deviation | Mean | +-------------------------------------------+--+-------+-------------+--------+ |Height in millimeters Male |22|1796.49| 49.71| 10.60| | Female|17|1610.77| 25.43| 6.17| +-------------------------------------------+--+-------+-------------+--------+ |Internal body temperature in degrees Male |22| 36.68| 1.95| .42| |Celcius Female|18| 37.43| 1.61| .38| +-------------------------------------------+--+-------+-------------+--------+ Independent Samples Test +---------------------+----------------------------------------------------- | | Levene's | | Test for | | Equality | | of | | Variances T-Test for Equality of Means | +----+-----+-----+-----+-------+----------+----------+ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Sig. | | | | | | | | | (2- | Mean |Std. Error| | | F | Sig.| t | df |tailed)|Difference|Difference| +---------------------+----+-----+-----+-----+-------+----------+----------+ |Height in Equal | .97| .331|14.02|37.00| .000| 185.72| 13.24| |millimeters variances| | | | | | | | | assumed | | | | | | | | | Equal | | |15.15|32.71| .000| 185.72| 12.26| | variances| | | | | | | | | not | | | | | | | | | assumed | | | | | | | | +---------------------+----+-----+-----+-----+-------+----------+----------+ |Internal Equal | .31| .581|-1.31|38.00| .198| -.75| .57| |body variances| | | | | | | | |temperature assumed | | | | | | | | |in degrees Equal | | |-1.33|37.99| .190| -.75| .56| |Celcius variances| | | | | | | | | not | | | | | | | | | assumed | | | | | | | | +---------------------+----+-----+-----+-----+-------+----------+----------+ +---------------------+-------------+ | | | | | | | | | | | | | | | | +-------------+ | | 95% | | | Confidence | | | Interval of | | | the | | | Difference | | +------+------+ | | Lower| Upper| +---------------------+------+------+ |Height in Equal |158.88|212.55| |millimeters variances| | | | assumed | | | | Equal |160.76|210.67| | variances| | | | not | | | | assumed | | | +---------------------+------+------+ |Internal Equal | -1.91| .41| |body variances| | | |temperature assumed | | | |in degrees Equal | -1.89| .39| |Celcius variances| | | | not | | | | assumed | | | +---------------------+------+------+ Example 5.6: The 'T-TEST' command tests for differences of means. Here, the HEIGHT variable's two tailed significance is less than 0.05, so the null hypothesis can be rejected. Thus, the evidence suggests there is a difference between the heights of male and female persons. However the significance of the test for the TEMPERATURE variable is greater than 0.05 so the null hypothesis cannot be rejected, and there is insufficient evidence to suggest a difference in body temperature.  File: pspp.info, Node: Linear Regression, Prev: Testing for differences of means, Up: Hypothesis Testing 5.3.2 Linear Regression ----------------------- Linear regression is a technique used to investigate if and how a variable is linearly related to others. If a variable is found to be linearly related, then this can be used to predict future values of that variable. In example *note Example 5.7: ex-regression, the service department of the company wanted to be able to predict the time to repair equipment, in order to improve the accuracy of their quotations. It was suggested that the time to repair might be related to the time between failures and the duty cycle of the equipment. The p-value of 0.1 was chosen for this investigation. In order to investigate this hypothesis, the 'REGRESSION' command was used. This command not only tests if the variables are related, but also identifies the potential linear relationship. *Note REGRESSION::. PSPP> get file='/usr/local/share/pspp/examples/repairs.sav'. PSPP> regression /variables = mtbf duty_cycle /dependent = mttr. PSPP> regression /variables = mtbf /dependent = mttr. Output (excerpts): Coefficients (Mean time to repair (hours) ) +------------------------+-----------------------------------------+-----+----+ | | Unstandardized Standardized | | | | | Coefficients Coefficients | | | | +---------+-----------+-------------------+ | | | | B | Std. Error| Beta | t |Sig.| +------------------------+---------+-----------+-------------------+-----+----+ |(Constant) | 9.81| 1.50| .00| 6.54|.000| |Mean time between | 3.10| .10| .99|32.43|.000| |failures (months) | | | | | | |Ratio of working to non-| 1.09| 1.78| .02| .61|.552| |working time | | | | | | +------------------------+---------+-----------+-------------------+-----+----+ Coefficients (Mean time to repair (hours) ) +-----------------------+------------------------------------------+-----+----+ | | Unstandardized Standardized | | | | | Coefficients Coefficients | | | | +---------+------------+-------------------+ | | | | B | Std. Error | Beta | t |Sig.| +-----------------------+---------+------------+-------------------+-----+----+ |(Constant) | 10.50| .96| .00|10.96|.000| |Mean time between | 3.11| .09| .99|33.39|.000| |failures (months) | | | | | | +-----------------------+---------+------------+-------------------+-----+----+ Example 5.7: Linear regression analysis to find a predictor for MTTR. The first attempt, including DUTY_CYCLE, produces some unacceptable high significance values. However the second attempt, which excludes DUTY_CYCLE, produces significance values no higher than 0.06. This suggests that MTBF alone may be a suitable predictor for MTTR. The coefficients in the first table suggest that the formula MTTR = 9.81 + 3.1 \times MTBF + 1.09 \times DUTY_CYCLE can be used to predict the time to repair. However, the significance value for the DUTY_CYCLE coefficient is very high, which would make this an unsafe predictor. For this reason, the test was repeated, but omitting the DUTY_CYCLE variable. This time, the significance of all coefficients no higher than 0.06, suggesting that at the 0.06 level, the formula MTTR = 10.5 + 3.11 \times MTBF is a reliable predictor of the time to repair.  File: pspp.info, Node: Language, Next: Expressions, Prev: Using PSPP, Up: Top 6 The PSPP language ******************* This chapter discusses elements common to many PSPP commands. Later chapters will describe individual commands in detail. * Menu: * Tokens:: Characters combine to form tokens. * Commands:: Tokens combine to form commands. * Syntax Variants:: Batch vs. Interactive mode * Types of Commands:: Commands come in several flavors. * Order of Commands:: Commands combine to form syntax files. * Missing Observations:: Handling missing observations. * Datasets:: Data organization. * Files:: Files used by PSPP. * File Handles:: How files are named. * BNF:: How command syntax is described.  File: pspp.info, Node: Tokens, Next: Commands, Up: Language 6.1 Tokens ========== PSPP divides most syntax file lines into series of short chunks called "tokens". Tokens are then grouped to form commands, each of which tells PSPP to take some action--read in data, write out data, perform a statistical procedure, etc. Each type of token is described below. *Identifiers* Identifiers are names that typically specify variables, commands, or subcommands. The first character in an identifier must be a letter, '#', or '@'. The remaining characters in the identifier must be letters, digits, or one of the following special characters: . _ $ # @ Identifiers may be any length, but only the first 64 bytes are significant. Identifiers are not case-sensitive: 'foobar', 'Foobar', 'FooBar', 'FOOBAR', and 'FoObaR' are different representations of the same identifier. Some identifiers are reserved. Reserved identifiers may not be used in any context besides those explicitly described in this manual. The reserved identifiers are: ALL AND BY EQ GE GT LE LT NE NOT OR TO WITH *Keywords* Keywords are a subclass of identifiers that form a fixed part of command syntax. For example, command and subcommand names are keywords. Keywords may be abbreviated to their first 3 characters if this abbreviation is unambiguous. (Unique abbreviations of 3 or more characters are also accepted: 'FRE', 'FREQ', and 'FREQUENCIES' are equivalent when the last is a keyword.) Reserved identifiers are always used as keywords. Other identifiers may be used both as keywords and as user-defined identifiers, such as variable names. *Numbers* Numbers are expressed in decimal. A decimal point is optional. Numbers may be expressed in scientific notation by adding 'e' and a base-10 exponent, so that '1.234e3' has the value 1234. Here are some more examples of valid numbers: -5 3.14159265359 1e100 -.707 8945. Negative numbers are expressed with a '-' prefix. However, in situations where a literal '-' token is expected, what appears to be a negative number is treated as '-' followed by a positive number. No white space is allowed within a number token, except for horizontal white space between '-' and the rest of the number. The last example above, '8945.' will be interpreted as two tokens, '8945' and '.', if it is the last token on a line. *Note Forming commands of tokens: Commands. *Strings* Strings are literal sequences of characters enclosed in pairs of single quotes (''') or double quotes ('"'). To include the character used for quoting in the string, double it, e.g. ''it''s an apostrophe''. White space and case of letters are significant inside strings. Strings can be concatenated using '+', so that '"a" + 'b' + 'c'' is equivalent to ''abc''. So that a long string may be broken across lines, a line break may precede or follow, or both precede and follow, the '+'. (However, an entirely blank line preceding or following the '+' is interpreted as ending the current command.) Strings may also be expressed as hexadecimal character values by prefixing the initial quote character by 'x' or 'X'. Regardless of the syntax file or active dataset's encoding, the hexadecimal digits in the string are interpreted as Unicode characters in UTF-8 encoding. Individual Unicode code points may also be expressed by specifying the hexadecimal code point number in single or double quotes preceded by 'u' or 'U'. For example, Unicode code point U+1D11E, the musical G clef character, could be expressed as 'U'1D11E''. Invalid Unicode code points (above U+10FFFF or in between U+D800 and U+DFFF) are not allowed. When strings are concatenated with '+', each segment's prefix is considered individually. For example, ''The G clef symbol is:' + u"1d11e" + "."' inserts a G clef symbol in the middle of an otherwise plain text string. *Punctuators and Operators* These tokens are the punctuators and operators: , / = ( ) + - * / ** < <= <> > >= ~= & | . Most of these appear within the syntax of commands, but the period ('.') punctuator is used only at the end of a command. It is a punctuator only as the last character on a line (except white space). When it is the last non-space character on a line, a period is not treated as part of another token, even if it would otherwise be part of, e.g., an identifier or a floating-point number.  File: pspp.info, Node: Commands, Next: Syntax Variants, Prev: Tokens, Up: Language 6.2 Forming commands of tokens ============================== Most PSPP commands share a common structure. A command begins with a command name, such as 'FREQUENCIES', 'DATA LIST', or 'N OF CASES'. The command name may be abbreviated to its first word, and each word in the command name may be abbreviated to its first three or more characters, where these abbreviations are unambiguous. The command name may be followed by one or more "subcommands". Each subcommand begins with a subcommand name, which may be abbreviated to its first three letters. Some subcommands accept a series of one or more specifications, which follow the subcommand name, optionally separated from it by an equals sign ('='). Specifications may be separated from each other by commas or spaces. Each subcommand must be separated from the next (if any) by a forward slash ('/'). There are multiple ways to mark the end of a command. The most common way is to end the last line of the command with a period ('.') as described in the previous section (*note Tokens::). A blank line, or one that consists only of white space or comments, also ends a command.  File: pspp.info, Node: Syntax Variants, Next: Types of Commands, Prev: Commands, Up: Language 6.3 Syntax Variants =================== There are three variants of command syntax, which vary only in how they detect the end of one command and the start of the next. In "interactive mode", which is the default for syntax typed at a command prompt, a period as the last non-blank character on a line ends a command. A blank line also ends a command. In "batch mode", an end-of-line period or a blank line also ends a command. Additionally, it treats any line that has a non-blank character in the leftmost column as beginning a new command. Thus, in batch mode the second and subsequent lines in a command must be indented. Regardless of the syntax mode, a plus sign, minus sign, or period in the leftmost column of a line is ignored and causes that line to begin a new command. This is most useful in batch mode, in which the first line of a new command could not otherwise be indented, but it is accepted regardless of syntax mode. The default mode for reading commands from a file is "auto mode". It is the same as batch mode, except that a line with a non-blank in the leftmost column only starts a new command if that line begins with the name of a PSPP command. This correctly interprets most valid PSPP syntax files regardless of the syntax mode for which they are intended. The '--interactive' (or '-i') or '--batch' (or '-b') options set the syntax mode for files listed on the PSPP command line. *Note Main Options::, for more details.  File: pspp.info, Node: Types of Commands, Next: Order of Commands, Prev: Syntax Variants, Up: Language 6.4 Types of Commands ===================== Commands in PSPP are divided roughly into six categories: *Utility commands* Set or display various global options that affect PSPP operations. May appear anywhere in a syntax file. *Note Utility commands: Utilities. *File definition commands* Give instructions for reading data from text files or from special binary "system files". Most of these commands replace any previous data or variables with new data or variables. At least one file definition command must appear before the first command in any of the categories below. *Note Data Input and Output::. *Input program commands* Though rarely used, these provide tools for reading data files in arbitrary textual or binary formats. *Note INPUT PROGRAM::. *Transformations* Perform operations on data and write data to output files. Transformations are not carried out until a procedure is executed. *Restricted transformations* Transformations that cannot appear in certain contexts. *Note Order of Commands::, for details. *Procedures* Analyze data, writing results of analyses to the listing file. Cause transformations specified earlier in the file to be performed. In a more general sense, a "procedure" is any command that causes the active dataset (the data) to be read.  File: pspp.info, Node: Order of Commands, Next: Missing Observations, Prev: Types of Commands, Up: Language 6.5 Order of Commands ===================== PSPP does not place many restrictions on ordering of commands. The main restriction is that variables must be defined before they are otherwise referenced. This section describes the details of command ordering, but most users will have no need to refer to them. PSPP possesses five internal states, called "initial", "input-program" "file-type", "transformation", and "procedure" states. (Please note the distinction between the 'INPUT PROGRAM' and 'FILE TYPE' _commands_ and the "input-program" and "file-type" _states_.) PSPP starts in the initial state. Each successful completion of a command may cause a state transition. Each type of command has its own rules for state transitions: *Utility commands* * Valid in any state. * Do not cause state transitions. Exception: when 'N OF CASES' is executed in the procedure state, it causes a transition to the transformation state. *'DATA LIST'* * Valid in any state. * When executed in the initial or procedure state, causes a transition to the transformation state. * Clears the active dataset if executed in the procedure or transformation state. *'INPUT PROGRAM'* * Invalid in input-program and file-type states. * Causes a transition to the intput-program state. * Clears the active dataset. *'FILE TYPE'* * Invalid in intput-program and file-type states. * Causes a transition to the file-type state. * Clears the active dataset. *Other file definition commands* * Invalid in input-program and file-type states. * Cause a transition to the transformation state. * Clear the active dataset, except for 'ADD FILES', 'MATCH FILES', and 'UPDATE'. *Transformations* * Invalid in initial and file-type states. * Cause a transition to the transformation state. *Restricted transformations* * Invalid in initial, input-program, and file-type states. * Cause a transition to the transformation state. *Procedures* * Invalid in initial, input-program, and file-type states. * Cause a transition to the procedure state.  File: pspp.info, Node: Missing Observations, Next: Datasets, Prev: Order of Commands, Up: Language 6.6 Handling missing observations ================================= PSPP includes special support for unknown numeric data values. Missing observations are assigned a special value, called the "system-missing value". This "value" actually indicates the absence of a value; it means that the actual value is unknown. Procedures automatically exclude from analyses those observations or cases that have missing values. Details of missing value exclusion depend on the procedure and can often be controlled by the user; refer to descriptions of individual procedures for details. The system-missing value exists only for numeric variables. String variables always have a defined value, even if it is only a string of spaces. Variables, whether numeric or string, can have designated "user-missing values". Every user-missing value is an actual value for that variable. However, most of the time user-missing values are treated in the same way as the system-missing value. For more information on missing values, see the following sections: *note Datasets::, *note MISSING VALUES::, *note Expressions::. See also the documentation on individual procedures for information on how they handle missing values.  File: pspp.info, Node: Datasets, Next: Files, Prev: Missing Observations, Up: Language 6.7 Datasets ============ PSPP works with data organized into "datasets". A dataset consists of a set of "variables", which taken together are said to form a "dictionary", and one or more "cases", each of which has one value for each variable. At any given time PSPP has exactly one distinguished dataset, called the "active dataset". Most PSPP commands work only with the active dataset. In addition to the active dataset, PSPP also supports any number of additional open datasets. The 'DATASET' commands can choose a new active dataset from among those that are open, as well as create and destroy datasets (*note DATASET::). The sections below describe variables in more detail. * Menu: * Attributes:: Attributes of variables. * System Variables:: Variables automatically defined by PSPP. * Sets of Variables:: Lists of variable names. * Input and Output Formats:: Input and output formats. * Scratch Variables:: Variables deleted by procedures.  File: pspp.info, Node: Attributes, Next: System Variables, Up: Datasets 6.7.1 Attributes of Variables ----------------------------- Each variable has a number of attributes, including: *Name* An identifier, up to 64 bytes long. Each variable must have a different name. *Note Tokens::. Some system variable names begin with '$', but user-defined variables' names may not begin with '$'. The final character in a variable name should not be '.', because such an identifier will be misinterpreted when it is the final token on a line: 'FOO.' will be divided into two separate tokens, 'FOO' and '.', indicating end-of-command. *Note Tokens::. The final character in a variable name should not be '_', because some such identifiers are used for special purposes by PSPP procedures. As with all PSPP identifiers, variable names are not case-sensitive. PSPP capitalizes variable names on output the same way they were capitalized at their point of definition in the input. *Type* Numeric or string. *Width* (string variables only) String variables with a width of 8 characters or fewer are called "short string variables". Short string variables may be used in a few contexts where "long string variables" (those with widths greater than 8) are not allowed. *Position* Variables in the dictionary are arranged in a specific order. 'DISPLAY' can be used to show this order: see *note DISPLAY::. *Initialization* Either reinitialized to 0 or spaces for each case, or left at its existing value. *Note LEAVE::. *Missing values* Optionally, up to three values, or a range of values, or a specific value plus a range, can be specified as "user-missing values". There is also a "system-missing value" that is assigned to an observation when there is no other obvious value for that observation. Observations with missing values are automatically excluded from analyses. User-missing values are actual data values, while the system-missing value is not a value at all. *Note Missing Observations::. *Variable label* A string that describes the variable. *Note VARIABLE LABELS::. *Value label* Optionally, these associate each possible value of the variable with a string. *Note VALUE LABELS::. *Print format* Display width, format, and (for numeric variables) number of decimal places. This attribute does not affect how data are stored, just how they are displayed. Example: a width of 8, with 2 decimal places. *Note Input and Output Formats::. *Write format* Similar to print format, but used by the 'WRITE' command (*note WRITE::). *Custom attributes* User-defined associations between names and values. *Note VARIABLE ATTRIBUTE::. *Role* The intended role of a variable for use in dialog boxes in graphical user interfaces. *Note VARIABLE ROLE::.  File: pspp.info, Node: System Variables, Next: Sets of Variables, Prev: Attributes, Up: Datasets 6.7.2 Variables Automatically Defined by PSPP --------------------------------------------- There are seven system variables. These are not like ordinary variables because system variables are not always stored. They can be used only in expressions. These system variables, whose values and output formats cannot be modified, are described below. '$CASENUM' Case number of the case at the moment. This changes as cases are shuffled around. '$DATE' Date the PSPP process was started, in format A9, following the pattern 'DD MMM YY'. '$JDATE' Number of days between 15 Oct 1582 and the time the PSPP process was started. '$LENGTH' Page length, in lines, in format F11. '$SYSMIS' System missing value, in format F1. '$TIME' Number of seconds between midnight 14 Oct 1582 and the time the active dataset was read, in format F20. '$WIDTH' Page width, in characters, in format F3.  File: pspp.info, Node: Sets of Variables, Next: Input and Output Formats, Prev: System Variables, Up: Datasets 6.7.3 Lists of variable names ----------------------------- To refer to a set of variables, list their names one after another. Optionally, their names may be separated by commas. To include a range of variables from the dictionary in the list, write the name of the first and last variable in the range, separated by 'TO'. For instance, if the dictionary contains six variables with the names 'ID', 'X1', 'X2', 'GOAL', 'MET', and 'NEXTGOAL', in that order, then 'X2 TO MET' would include variables 'X2', 'GOAL', and 'MET'. Commands that define variables, such as 'DATA LIST', give 'TO' an alternate meaning. With these commands, 'TO' define sequences of variables whose names end in consecutive integers. The syntax is two identifiers that begin with the same root and end with numbers, separated by 'TO'. The syntax 'X1 TO X5' defines 5 variables, named 'X1', 'X2', 'X3', 'X4', and 'X5'. The syntax 'ITEM0008 TO ITEM0013' defines 6 variables, named 'ITEM0008', 'ITEM0009', 'ITEM0010', 'ITEM0011', 'ITEM0012', and 'ITEM00013'. The syntaxes 'QUES001 TO QUES9' and 'QUES6 TO QUES3' are invalid. After a set of variables has been defined with 'DATA LIST' or another command with this method, the same set can be referenced on later commands using the same syntax.  File: pspp.info, Node: Input and Output Formats, Next: Scratch Variables, Prev: Sets of Variables, Up: Datasets 6.7.4 Input and Output Formats ------------------------------ An "input format" describes how to interpret the contents of an input field as a number or a string. It might specify that the field contains an ordinary decimal number, a time or date, a number in binary or hexadecimal notation, or one of several other notations. Input formats are used by commands such as 'DATA LIST' that read data or syntax files into the PSPP active dataset. Every input format corresponds to a default "output format" that specifies the formatting used when the value is output later. It is always possible to explicitly specify an output format that resembles the input format. Usually, this is the default, but in cases where the input format is unfriendly to human readability, such as binary or hexadecimal formats, the default output format is an easier-to-read decimal format. Every variable has two output formats, called its "print format" and "write format". Print formats are used in most output contexts; write formats are used only by 'WRITE' (*note WRITE::). Newly created variables have identical print and write formats, and 'FORMATS', the most commonly used command for changing formats (*note FORMATS::), sets both of them to the same value as well. Thus, most of the time, the distinction between print and write formats is unimportant. Input and output formats are specified to PSPP with a "format specification" of the form 'TYPEW' or 'TYPEW.D', where TYPE is one of the format types described later, W is a field width measured in columns, and D is an optional number of decimal places. If D is omitted, a value of 0 is assumed. Some formats do not allow a nonzero D to be specified. The following sections describe the input and output formats supported by PSPP. * Menu: * Basic Numeric Formats:: * Custom Currency Formats:: * Legacy Numeric Formats:: * Binary and Hexadecimal Numeric Formats:: * Time and Date Formats:: * Date Component Formats:: * String Formats::  File: pspp.info, Node: Basic Numeric Formats, Next: Custom Currency Formats, Up: Input and Output Formats 6.7.4.1 Basic Numeric Formats ............................. The basic numeric formats are used for input and output of real numbers in standard or scientific notation. The following table shows an example of how each format displays positive and negative numbers with the default decimal point setting: Format ' 3141.59' '-3141.59' ------------------------------------------- F8.2 ' 3141.59' '-3141.59' COMMA9.2 ' 3,141.59' '-3,141.59' DOT9.2 ' 3.141,59' '-3.141,59' DOLLAR10.2 ' $3,141.59' '-$3,141.59' PCT9.2 ' 3141.59%' '-3141.59%' E8.1 ' 3.1E+003' '-3.1E+003' On output, numbers in F format are expressed in standard decimal notation with the requested number of decimal places. The other formats output some variation on this style: * Numbers in COMMA format are additionally grouped every three digits by inserting a grouping character. The grouping character is ordinarily a comma, but it can be changed to a period (*note SET DECIMAL::). * DOT format is like COMMA format, but it interchanges the role of the decimal point and grouping characters. That is, the current grouping character is used as a decimal point and vice versa. * DOLLAR format is like COMMA format, but it prefixes the number with '$'. * PCT format is like F format, but adds '%' after the number. * The E format always produces output in scientific notation. On input, the basic numeric formats accept positive and numbers in standard decimal notation or scientific notation. Leading and trailing spaces are allowed. An empty or all-spaces field, or one that contains only a single period, is treated as the system missing value. In scientific notation, the exponent may be introduced by a sign ('+' or '-'), or by one of the letters 'e' or 'd' (in uppercase or lowercase), or by a letter followed by a sign. A single space may follow the letter or the sign or both. On fixed-format 'DATA LIST' (*note DATA LIST FIXED::) and in a few other contexts, decimals are implied when the field does not contain a decimal point. In F6.5 format, for example, the field '314159' is taken as the value 3.14159 with implied decimals. Decimals are never implied if an explicit decimal point is present or if scientific notation is used. E and F formats accept the basic syntax already described. The other formats allow some additional variations: * COMMA, DOLLAR, and DOT formats ignore grouping characters within the integer part of the input field. The identity of the grouping character depends on the format. * DOLLAR format allows a dollar sign to precede the number. In a negative number, the dollar sign may precede or follow the minus sign. * PCT format allows a percent sign to follow the number. All of the basic number formats have a maximum field width of 40 and accept no more than 16 decimal places, on both input and output. Some additional restrictions apply: * As input formats, the basic numeric formats allow no more decimal places than the field width. As output formats, the field width must be greater than the number of decimal places; that is, large enough to allow for a decimal point and the number of requested decimal places. DOLLAR and PCT formats must allow an additional column for '$' or '%'. * The default output format for a given input format increases the field width enough to make room for optional input characters. If an input format calls for decimal places, the width is increased by 1 to make room for an implied decimal point. COMMA, DOT, and DOLLAR formats also increase the output width to make room for grouping characters. DOLLAR and PCT further increase the output field width by 1 to make room for '$' or '%'. The increased output width is capped at 40, the maximum field width. * The E format is exceptional. For output, E format has a minimum width of 7 plus the number of decimal places. The default output format for an E input format is an E format with at least 3 decimal places and thus a minimum width of 10. More details of basic numeric output formatting are given below: * Output rounds to nearest, with ties rounded away from zero. Thus, 2.5 is output as '3' in F1.0 format, and -1.125 as '-1.13' in F5.1 format. * The system-missing value is output as a period in a field of spaces, placed in the decimal point's position, or in the rightmost column if no decimal places are requested. A period is used even if the decimal point character is a comma. * A number that does not fill its field is right-justified within the field. * A number is too large for its field causes decimal places to be dropped to make room. If dropping decimals does not make enough room, scientific notation is used if the field is wide enough. If a number does not fit in the field, even in scientific notation, the overflow is indicated by filling the field with asterisks ('*'). * COMMA, DOT, and DOLLAR formats insert grouping characters only if space is available for all of them. Grouping characters are never inserted when all decimal places must be dropped. Thus, 1234.56 in COMMA5.2 format is output as ' 1235' without a comma, even though there is room for one, because all decimal places were dropped. * DOLLAR or PCT format drop the '$' or '%' only if the number would not fit at all without it. Scientific notation with '$' or '%' is preferred to ordinary decimal notation without it. * Except in scientific notation, a decimal point is included only when it is followed by a digit. If the integer part of the number being output is 0, and a decimal point is included, then the zero before the decimal point is dropped. In scientific notation, the number always includes a decimal point, even if it is not followed by a digit. * A negative number includes a minus sign only in the presence of a nonzero digit: -0.01 is output as '-.01' in F4.2 format but as ' .0' in F4.1 format. Thus, a "negative zero" never includes a minus sign. * In negative numbers output in DOLLAR format, the dollar sign follows the negative sign. Thus, -9.99 in DOLLAR6.2 format is output as '-$9.99'. * In scientific notation, the exponent is output as 'E' followed by '+' or '-' and exactly three digits. Numbers with magnitude less than 10**-999 or larger than 10**999 are not supported by most computers, but if they are supported then their output is considered to overflow the field and will be output as asterisks. * On most computers, no more than 15 decimal digits are significant in output, even if more are printed. In any case, output precision cannot be any higher than input precision; few data sets are accurate to 15 digits of precision. Unavoidable loss of precision in intermediate calculations may also reduce precision of output. * Special values such as infinities and "not a number" values are usually converted to the system-missing value before printing. In a few circumstances, these values are output directly. In fields of width 3 or greater, special values are output as however many characters will fit from '+Infinity' or '-Infinity' for infinities, from 'NaN' for "not a number," or from 'Unknown' for other values (if any are supported by the system). In fields under 3 columns wide, special values are output as asterisks.  File: pspp.info, Node: Custom Currency Formats, Next: Legacy Numeric Formats, Prev: Basic Numeric Formats, Up: Input and Output Formats 6.7.4.2 Custom Currency Formats ............................... The custom currency formats are closely related to the basic numeric formats, but they allow users to customize the output format. The SET command configures custom currency formats, using the syntax SET CCX="STRING". where X is A, B, C, D, or E, and STRING is no more than 16 characters long. STRING must contain exactly three commas or exactly three periods (but not both), except that a single quote character may be used to "escape" a following comma, period, or single quote. If three commas are used, commas will be used for grouping in output, and a period will be used as the decimal point. Uses of periods reverses these roles. The commas or periods divide STRING into four fields, called the "negative prefix", "prefix", "suffix", and "negative suffix", respectively. The prefix and suffix are added to output whenever space is available. The negative prefix and negative suffix are always added to a negative number when the output includes a nonzero digit. The following syntax shows how custom currency formats could be used to reproduce basic numeric formats: SET CCA="-,,,". /* Same as COMMA. SET CCB="-...". /* Same as DOT. SET CCC="-,$,,". /* Same as DOLLAR. SET CCD="-,,%,". /* Like PCT, but groups with commas. Here are some more examples of custom currency formats. The final example shows how to use a single quote to escape a delimiter: SET CCA=",EUR,,-". /* Euro. SET CCB="(,USD ,,)". /* US dollar. SET CCC="-.R$..". /* Brazilian real. SET CCD="-,, NIS,". /* Israel shekel. SET CCE="-.Rp'. ..". /* Indonesia Rupiah. These formats would yield the following output: Format ' 3145.59' '-3145.59' ------------------------------------------------ CCA12.2 ' EUR3,145.59' 'EUR3,145.59-' CCB14.2 ' USD 3,145.59' '(USD 3,145.59)' CCC11.2 ' R$3.145,59' '-R$3.145,59' CCD13.2 ' 3,145.59 NIS' '-3,145.59 NIS' CCE10.0 ' Rp. 3.146' '-Rp. 3.146' The default for all the custom currency formats is '-,,,', equivalent to COMMA format.  File: pspp.info, Node: Legacy Numeric Formats, Next: Binary and Hexadecimal Numeric Formats, Prev: Custom Currency Formats, Up: Input and Output Formats 6.7.4.3 Legacy Numeric Formats .............................. The N and Z numeric formats provide compatibility with legacy file formats. They have much in common: * Output is rounded to the nearest representable value, with ties rounded away from zero. * Numbers too large to display are output as a field filled with asterisks ('*'). * The decimal point is always implicitly the specified number of digits from the right edge of the field, except that Z format input allows an explicit decimal point. * Scientific notation may not be used. * The system-missing value is output as a period in a field of spaces. The period is placed just to the right of the implied decimal point in Z format, or at the right end in N format or in Z format if no decimal places are requested. A period is used even if the decimal point character is a comma. * Field width may range from 1 to 40. Decimal places may range from 0 up to the field width, to a maximum of 16. * When a legacy numeric format used for input is converted to an output format, it is changed into the equivalent F format. The field width is increased by 1 if any decimal places are specified, to make room for a decimal point. For Z format, the field width is increased by 1 more column, to make room for a negative sign. The output field width is capped at 40 columns. N Format ........ The N format supports input and output of fields that contain only digits. On input, leading or trailing spaces, a decimal point, or any other non-digit character causes the field to be read as the system-missing value. As a special exception, an N format used on 'DATA LIST FREE' or 'DATA LIST LIST' is treated as the equivalent F format. On output, N pads the field on the left with zeros. Negative numbers are output like the system-missing value. Z Format ........ The Z format is a "zoned decimal" format used on IBM mainframes. Z format encodes the sign as part of the final digit, which must be one of the following: 0123456789 {ABCDEFGHI }JKLMNOPQR where the characters in each row represent digits 0 through 9 in order. Characters in the first two rows indicate a positive sign; those in the third indicate a negative sign. On output, Z fields are padded on the left with spaces. On input, leading and trailing spaces are ignored. Any character in an input field other than spaces, the digit characters above, and '.' causes the field to be read as system-missing. The decimal point character for input and output is always '.', even if the decimal point character is a comma (*note SET DECIMAL::). Nonzero, negative values output in Z format are marked as negative even when no nonzero digits are output. For example, -0.2 is output in Z1.0 format as 'J'. The "negative zero" value supported by most machines is output as positive.  File: pspp.info, Node: Binary and Hexadecimal Numeric Formats, Next: Time and Date Formats, Prev: Legacy Numeric Formats, Up: Input and Output Formats 6.7.4.4 Binary and Hexadecimal Numeric Formats .............................................. The binary and hexadecimal formats are primarily designed for compatibility with existing machine formats, not for human readability. All of them therefore have a F format as default output format. Some of these formats are only portable between machines with compatible byte ordering (endianness) or floating-point format. Binary formats use byte values that in text files are interpreted as special control functions, such as carriage return and line feed. Thus, data in binary formats should not be included in syntax files or read from data files with variable-length records, such as ordinary text files. They may be read from or written to data files with fixed-length records. *Note FILE HANDLE::, for information on working with fixed-length records. P and PK Formats ................ These are binary-coded decimal formats, in which every byte (except the last, in P format) represents two decimal digits. The most-significant 4 bits of the first byte is the most-significant decimal digit, the least-significant 4 bits of the first byte is the next decimal digit, and so on. In P format, the most-significant 4 bits of the last byte are the least-significant decimal digit. The least-significant 4 bits represent the sign: decimal 15 indicates a negative value, decimal 13 indicates a positive value. Numbers are rounded downward on output. The system-missing value and numbers outside representable range are output as zero. The maximum field width is 16. Decimal places may range from 0 up to the number of decimal digits represented by the field. The default output format is an F format with twice the input field width, plus one column for a decimal point (if decimal places were requested). IB and PIB Formats .................. These are integer binary formats. IB reads and writes 2's complement binary integers, and PIB reads and writes unsigned binary integers. The byte ordering is by default the host machine's, but SET RIB may be used to select a specific byte ordering for reading (*note SET RIB::) and SET WIB, similarly, for writing (*note SET WIB::). The maximum field width is 8. Decimal places may range from 0 up to the number of decimal digits in the largest value representable in the field width. The default output format is an F format whose width is the number of decimal digits in the largest value representable in the field width, plus 1 if the format has decimal places. RB Format ......... This is a binary format for real numbers. By default it reads and writes the host machine's floating-point format, but SET RRB may be used to select an alternate floating-point format for reading (*note SET RRB::) and SET WRB, similarly, for writing (*note SET WRB::). The recommended field width depends on the floating-point format. NATIVE (the default format), IDL, IDB, VD, VG, and ZL formats should use a field width of 8. ISL, ISB, VF, and ZS formats should use a field width of 4. Other field widths will not produce useful results. The maximum field width is 8. No decimal places may be specified. The default output format is F8.2. PIBHEX and RBHEX Formats ........................ These are hexadecimal formats, for reading and writing binary formats where each byte has been recoded as a pair of hexadecimal digits. A hexadecimal field consists solely of hexadecimal digits '0'...'9' and 'A'...'F'. Uppercase and lowercase are accepted on input; output is in uppercase. Other than the hexadecimal representation, these formats are equivalent to PIB and RB formats, respectively. However, bytes in PIBHEX format are always ordered with the most-significant byte first (big-endian order), regardless of the host machine's native byte order or PSPP settings. Field widths must be even and between 2 and 16. RBHEX format allows no decimal places; PIBHEX allows as many decimal places as a PIB format with half the given width.  File: pspp.info, Node: Time and Date Formats, Next: Date Component Formats, Prev: Binary and Hexadecimal Numeric Formats, Up: Input and Output Formats 6.7.4.5 Time and Date Formats ............................. In PSPP, a "time" is an interval. The time formats translate between human-friendly descriptions of time intervals and PSPP's internal representation of time intervals, which is simply the number of seconds in the interval. PSPP has three time formats: Time Format Template Example ---------------------------------------------------------------------- MTIME 'MM:SS.ss' '91:17.01' TIME 'hh:MM:SS.ss' '01:31:17.01' DTIME 'DD HH:MM:SS.ss' '00 04:31:17.01' A "date" is a moment in the past or the future. Internally, PSPP represents a date as the number of seconds since the "epoch", midnight, Oct. 14, 1582. The date formats translate between human-readable dates and PSPP's numeric representation of dates and times. PSPP has several date formats: Date Format Template Example ---------------------------------------------------------------------- DATE 'dd-mmm-yyyy' '01-OCT-1978' ADATE 'mm/dd/yyyy' '10/01/1978' EDATE 'dd.mm.yyyy' '01.10.1978' JDATE 'yyyyjjj' '1978274' SDATE 'yyyy/mm/dd' '1978/10/01' QYR 'q Q yyyy' '3 Q 1978' MOYR 'mmm yyyy' 'OCT 1978' WKYR 'ww WK yyyy' '40 WK 1978' DATETIME 'dd-mmm-yyyy HH:MM:SS.ss' '01-OCT-1978 04:31:17.01' YMDHMS 'yyyy-mm-dd HH:MM:SS.ss' '1978-01-OCT 04:31:17.01' The templates in the preceding tables describe how the time and date formats are input and output: 'dd' Day of month, from 1 to 31. Always output as two digits. 'mm' 'mmm' Month. In output, 'mm' is output as two digits, 'mmm' as the first three letters of an English month name (January, February, ...). In input, both of these formats, plus Roman numerals, are accepted. 'yyyy' Year. In output, DATETIME and YMDHMS always produce 4-digit years; other formats can produce a 2- or 4-digit year. The century assumed for 2-digit years depends on the EPOCH setting (*note SET EPOCH::). In output, a year outside the epoch causes the whole field to be filled with asterisks ('*'). 'jjj' Day of year (Julian day), from 1 to 366. This is exactly three digits giving the count of days from the start of the year. January 1 is considered day 1. 'q' Quarter of year, from 1 to 4. Quarters start on January 1, April 1, July 1, and October 1. 'ww' Week of year, from 1 to 53. Output as exactly two digits. January 1 is the first day of week 1. 'DD' Count of days, which may be positive or negative. Output as at least two digits. 'hh' Count of hours, which may be positive or negative. Output as at least two digits. 'HH' Hour of day, from 0 to 23. Output as exactly two digits. 'MM' In MTIME, count of minutes, which may be positive or negative. Output as at least two digits. In other formats, minute of hour, from 0 to 59. Output as exactly two digits. 'SS.ss' Seconds within minute, from 0 to 59. The integer part is output as exactly two digits. On output, seconds and fractional seconds may or may not be included, depending on field width and decimal places. On input, seconds and fractional seconds are optional. The DECIMAL setting controls the character accepted and displayed as the decimal point (*note SET DECIMAL::). For output, the date and time formats use the delimiters indicated in the table. For input, date components may be separated by spaces or by one of the characters '-', '/', '.', or ',', and time components may be separated by spaces or ':'. On input, the 'Q' separating quarter from year and the 'WK' separating week from year may be uppercase or lowercase, and the spaces around them are optional. On input, all time and date formats accept any amount of leading and trailing white space. The maximum width for time and date formats is 40 columns. Minimum input and output width for each of the time and date formats is shown below: Format Min. Input Width Min. Output Width Option ------------------------------------------------------------------- DATE 8 9 4-digit year ADATE 8 8 4-digit year EDATE 8 8 4-digit year JDATE 5 5 4-digit year SDATE 8 8 4-digit year QYR 4 6 4-digit year MOYR 6 6 4-digit year WKYR 6 8 4-digit year DATETIME 17 17 seconds YMDHMS 12 16 seconds MTIME 4 5 TIME 5 5 seconds DTIME 8 8 seconds In the table, "Option" describes what increased output width enables: 4-digit year A field 2 columns wider than minimum will include a 4-digit year. (DATETIME and YMDHMS formats always include a 4-digit year.) seconds A field 3 columns wider than minimum will include seconds as well as minutes. A field 5 columns wider than minimum, or more, can also include a decimal point and fractional seconds (but no more than allowed by the format's decimal places). For the time and date formats, the default output format is the same as the input format, except that PSPP increases the field width, if necessary, to the minimum allowed for output. Time or dates narrower than the field width are right-justified within the field. When a time or date exceeds the field width, characters are trimmed from the end until it fits. This can occur in an unusual situation, e.g. with a year greater than 9999 (which adds an extra digit), or for a negative value on MTIME, TIME, or DTIME (which adds a leading minus sign). The system-missing value is output as a period at the right end of the field.  File: pspp.info, Node: Date Component Formats, Next: String Formats, Prev: Time and Date Formats, Up: Input and Output Formats 6.7.4.6 Date Component Formats .............................. The WKDAY and MONTH formats provide input and output for the names of weekdays and months, respectively. On output, these formats convert a number between 1 and 7, for WKDAY, or between 1 and 12, for MONTH, into the English name of a day or month, respectively. If the name is longer than the field, it is trimmed to fit. If the name is shorter than the field, it is padded on the right with spaces. Values outside the valid range, and the system-missing value, are output as all spaces. On input, English weekday or month names (in uppercase or lowercase) are converted back to their corresponding numbers. Weekday and month names may be abbreviated to their first 2 or 3 letters, respectively. The field width may range from 2 to 40, for WKDAY, or from 3 to 40, for MONTH. No decimal places are allowed. The default output format is the same as the input format.  File: pspp.info, Node: String Formats, Prev: Date Component Formats, Up: Input and Output Formats 6.7.4.7 String Formats ...................... The A and AHEX formats are the only ones that may be assigned to string variables. Neither format allows any decimal places. In A format, the entire field is treated as a string value. The field width may range from 1 to 32,767, the maximum string width. The default output format is the same as the input format. In AHEX format, the field is composed of characters in a string encoded as hex digit pairs. On output, hex digits are output in uppercase; on input, uppercase and lowercase are both accepted. The default output format is A format with half the input width.  File: pspp.info, Node: Scratch Variables, Prev: Input and Output Formats, Up: Datasets 6.7.5 Scratch Variables ----------------------- Most of the time, variables don't retain their values between cases. Instead, either they're being read from a data file or the active dataset, in which case they assume the value read, or, if created with 'COMPUTE' or another transformation, they're initialized to the system-missing value or to blanks, depending on type. However, sometimes it's useful to have a variable that keeps its value between cases. You can do this with 'LEAVE' (*note LEAVE::), or you can use a "scratch variable". Scratch variables are variables whose names begin with an octothorpe ('#'). Scratch variables have the same properties as variables left with 'LEAVE': they retain their values between cases, and for the first case they are initialized to 0 or blanks. They have the additional property that they are deleted before the execution of any procedure. For this reason, scratch variables can't be used for analysis. To use a scratch variable in an analysis, use 'COMPUTE' (*note COMPUTE::) to copy its value into an ordinary variable, then use that ordinary variable in the analysis.  File: pspp.info, Node: Files, Next: File Handles, Prev: Datasets, Up: Language 6.8 Files Used by PSPP ====================== PSPP makes use of many files each time it runs. Some of these it reads, some it writes, some it creates. Here is a table listing the most important of these files: *command file* *syntax file* These names (synonyms) refer to the file that contains instructions that tell PSPP what to do. The syntax file's name is specified on the PSPP command line. Syntax files can also be read with 'INCLUDE' (*note INCLUDE::). *data file* Data files contain raw data in text or binary format. Data can also be embedded in a syntax file with 'BEGIN DATA' and 'END DATA'. *listing file* One or more output files are created by PSPP each time it is run. The output files receive the tables and charts produced by statistical procedures. The output files may be in any number of formats, depending on how PSPP is configured. *system file* System files are binary files that store a dictionary and a set of cases. 'GET' and 'SAVE' read and write system files. *portable file* Portable files are files in a text-based format that store a dictionary and a set of cases. 'IMPORT' and 'EXPORT' read and write portable files.  File: pspp.info, Node: File Handles, Next: BNF, Prev: Files, Up: Language 6.9 File Handles ================ A "file handle" is a reference to a data file, system file, or portable file. Most often, a file handle is specified as the name of a file as a string, that is, enclosed within ''' or '"'. A file name string that begins or ends with '|' is treated as the name of a command to pipe data to or from. You can use this feature to read data over the network using a program such as 'curl' (e.g. 'GET '|curl -s -S http://example.com/mydata.sav''), to read compressed data from a file using a program such as 'zcat' (e.g. 'GET '|zcat mydata.sav.gz''), and for many other purposes. PSPP also supports declaring named file handles with the 'FILE HANDLE' command. This command associates an identifier of your choice (the file handle's name) with a file. Later, the file handle name can be substituted for the name of the file. When PSPP syntax accesses a file multiple times, declaring a named file handle simplifies updating the syntax later to use a different file. Use of 'FILE HANDLE' is also required to read data files in binary formats. *Note FILE HANDLE::, for more information. In some circumstances, PSPP must distinguish whether a file handle refers to a system file or a portable file. When this is necessary to read a file, e.g. as an input file for 'GET' or 'MATCH FILES', PSPP uses the file's contents to decide. In the context of writing a file, e.g. as an output file for 'SAVE' or 'AGGREGATE', PSPP decides based on the file's name: if it ends in '.por' (with any capitalization), then PSPP writes a portable file; otherwise, PSPP writes a system file. INLINE is reserved as a file handle name. It refers to the "data file" embedded into the syntax file between 'BEGIN DATA' and 'END DATA'. *Note BEGIN DATA::, for more information. The file to which a file handle refers may be reassigned on a later 'FILE HANDLE' command if it is first closed using 'CLOSE FILE HANDLE'. *Note CLOSE FILE HANDLE::, for more information.  File: pspp.info, Node: BNF, Prev: File Handles, Up: Language 6.10 Backus-Naur Form ===================== The syntax of some parts of the PSPP language is presented in this manual using the formalism known as "Backus-Naur Form", or BNF. The following table describes BNF: * Words in all-uppercase are PSPP keyword tokens. In BNF, these are often called "terminals". There are some special terminals, which are written in lowercase for clarity: 'number' A real number. 'integer' An integer number. 'string' A string. 'var-name' A single variable name. '=', '/', '+', '-', etc. Operators and punctuators. '.' The end of the command. This is not necessarily an actual dot in the syntax file (*note Commands::). * Other words in all lowercase refer to BNF definitions, called "productions". These productions are also known as "nonterminals". Some nonterminals are very common, so they are defined here in English for clarity: 'var-list' A list of one or more variable names or the keyword 'ALL'. 'expression' An expression. *Note Expressions::, for details. * '::=' means "is defined as". The left side of '::=' gives the name of the nonterminal being defined. The right side of '::=' gives the definition of that nonterminal. If the right side is empty, then one possible expansion of that nonterminal is nothing. A BNF definition is called a "production". * So, the key difference between a terminal and a nonterminal is that a terminal cannot be broken into smaller parts--in fact, every terminal is a single token (*note Tokens::). On the other hand, nonterminals are composed of a (possibly empty) sequence of terminals and nonterminals. Thus, terminals indicate the deepest level of syntax description. (In parsing theory, terminals are the leaves of the parse tree; nonterminals form the branches.) * The first nonterminal defined in a set of productions is called the "start symbol". The start symbol defines the entire syntax for that command.  File: pspp.info, Node: Expressions, Next: Data Input and Output, Prev: Language, Up: Top 7 Mathematical Expressions ************************** Expressions share a common syntax each place they appear in PSPP commands. Expressions are made up of "operands", which can be numbers, strings, or variable names, separated by "operators". There are five types of operators: grouping, arithmetic, logical, relational, and functions. Every operator takes one or more operands as input and yields exactly one result as output. Depending on the operator, operands accept strings or numbers as operands. With few exceptions, operands may be full-fledged expressions in themselves. * Menu: * Boolean Values:: Boolean values * Missing Values in Expressions:: Using missing values in expressions * Grouping Operators:: parentheses * Arithmetic Operators:: add sub mul div pow * Logical Operators:: AND NOT OR * Relational Operators:: EQ GE GT LE LT NE * Functions:: More-sophisticated operators * Order of Operations:: Operator precedence  File: pspp.info, Node: Boolean Values, Next: Missing Values in Expressions, Up: Expressions 7.1 Boolean Values ================== Some PSPP operators and expressions work with Boolean values, which represent true/false conditions. Booleans have only three possible values: 0 (false), 1 (true), and system-missing (unknown). System-missing is neither true nor false and indicates that the true value is unknown. Boolean-typed operands or function arguments must take on one of these three values. Other values are considered false, but provoke a warning when the expression is evaluated. Strings and Booleans are not compatible, and neither may be used in place of the other.  File: pspp.info, Node: Missing Values in Expressions, Next: Grouping Operators, Prev: Boolean Values, Up: Expressions 7.2 Missing Values in Expressions ================================= Most numeric operators yield system-missing when given any system-missing operand. A string operator given any system-missing operand typically results in the empty string. Exceptions are listed under particular operator descriptions. String user-missing values are not treated specially in expressions. User-missing values for numeric variables are always transformed into the system-missing value, except inside the arguments to the 'VALUE' and 'SYSMIS' functions. The missing-value functions can be used to precisely control how missing values are treated in expressions. *Note Missing Value Functions::, for more details.  File: pspp.info, Node: Grouping Operators, Next: Arithmetic Operators, Prev: Missing Values in Expressions, Up: Expressions 7.3 Grouping Operators ====================== Parentheses ('()') are the grouping operators. Surround an expression with parentheses to force early evaluation. Parentheses also surround the arguments to functions, but in that situation they act as punctuators, not as operators.  File: pspp.info, Node: Arithmetic Operators, Next: Logical Operators, Prev: Grouping Operators, Up: Expressions 7.4 Arithmetic Operators ======================== The arithmetic operators take numeric operands and produce numeric results. 'A + B' Yields the sum of A and B. 'A - B' Subtracts B from A and yields the difference. 'A * B' Yields the product of A and B. If either A or B is 0, then the result is 0, even if the other operand is missing. 'A / B' Divides A by B and yields the quotient. If A is 0, then the result is 0, even if B is missing. If B is zero, the result is system-missing. 'A ** B' Yields the result of raising A to the power B. If A is negative and B is not an integer, the result is system-missing. The result of '0**0' is system-missing as well. '- A' Reverses the sign of A.  File: pspp.info, Node: Logical Operators, Next: Relational Operators, Prev: Arithmetic Operators, Up: Expressions 7.5 Logical Operators ===================== The logical operators take logical operands and produce logical results, meaning "true or false." Logical operators are not true Boolean operators because they may also result in a system-missing value. *Note Boolean Values::, for more information. 'A AND B' 'A & B' True if both A and B are true, false otherwise. If one operand is false, the result is false even if the other is missing. If both operands are missing, the result is missing. 'A OR B' 'A | B' True if at least one of A and B is true. If one operand is true, the result is true even if the other operand is missing. If both operands are missing, the result is missing. 'NOT A' '~ A' True if A is false. If the operand is missing, then the result is missing.  File: pspp.info, Node: Relational Operators, Next: Functions, Prev: Logical Operators, Up: Expressions 7.6 Relational Operators ======================== The relational operators take numeric or string operands and produce Boolean results. Strings cannot be compared to numbers. When strings of different lengths are compared, the shorter string is right-padded with spaces to match the length of the longer string. The results of string comparisons, other than tests for equality or inequality, depend on the character set in use. String comparisons are case-sensitive. 'A EQ B' 'A = B' True if A is equal to B. 'A LE B' 'A <= B' True if A is less than or equal to B. 'A LT B' 'A < B' True if A is less than B. 'A GE B' 'A >= B' True if A is greater than or equal to B. 'A GT B' 'A > B' True if A is greater than B. 'A NE B' 'A ~= B' 'A <> B' True if A is not equal to B.  File: pspp.info, Node: Functions, Next: Order of Operations, Prev: Relational Operators, Up: Expressions 7.7 Functions ============= PSPP functions provide mathematical abilities above and beyond those possible using simple operators. Functions have a common syntax: each is composed of a function name followed by a left parenthesis, one or more arguments, and a right parenthesis. Function names are not reserved. Their names are specially treated only when followed by a left parenthesis, so that 'EXP(10)' refers to the constant value e raised to the 10th power, but 'EXP' by itself refers to the value of a variable called 'EXP'. The sections below describe each function in detail. * Menu: * Mathematics:: EXP LG10 LN LNGAMMA SQRT * Miscellaneous Mathematics:: ABS MOD MOD10 RND TRUNC * Trigonometry:: ACOS ARCOS ARSIN ARTAN ASIN ATAN COS SIN TAN * Missing Value Functions:: MISSING NMISS NVALID SYSMIS VALUE * Set Membership:: ANY RANGE * Statistical Functions:: CFVAR MAX MEAN MEDIAN MIN SD SUM VARIANCE * String Functions:: CONCAT INDEX LENGTH LOWER LPAD LTRIM NUMBER REPLACE RINDEX RPAD RTRIM STRING STRUNC SUBSTR UPCASE * Time and Date:: CTIME.xxx DATE.xxx TIME.xxx XDATE.xxx DATEDIFF DATESUM * Miscellaneous Functions:: LAG YRMODA VALUELABEL * Statistical Distribution Functions:: PDF CDF SIG IDF RV NPDF NCDF  File: pspp.info, Node: Mathematics, Next: Miscellaneous Mathematics, Up: Functions 7.7.1 Mathematical Functions ---------------------------- Advanced mathematical functions take numeric arguments and produce numeric results. -- Function: EXP (EXPONENT) Returns e (approximately 2.71828) raised to power EXPONENT. -- Function: LG10 (NUMBER) Takes the base-10 logarithm of NUMBER. If NUMBER is not positive, the result is system-missing. -- Function: LN (NUMBER) Takes the base-e logarithm of NUMBER. If NUMBER is not positive, the result is system-missing. -- Function: LNGAMMA (NUMBER) Yields the base-e logarithm of the complete gamma of NUMBER. If NUMBER is a negative integer, the result is system-missing. -- Function: SQRT (NUMBER) Takes the square root of NUMBER. If NUMBER is negative, the result is system-missing.  File: pspp.info, Node: Miscellaneous Mathematics, Next: Trigonometry, Prev: Mathematics, Up: Functions 7.7.2 Miscellaneous Mathematical Functions ------------------------------------------ Miscellaneous mathematical functions take numeric arguments and produce numeric results. -- Function: ABS (NUMBER) Results in the absolute value of NUMBER. -- Function: MOD (NUMERATOR, DENOMINATOR) Returns the remainder (modulus) of NUMERATOR divided by DENOMINATOR. If NUMERATOR is 0, then the result is 0, even if DENOMINATOR is missing. If DENOMINATOR is 0, the result is system-missing. -- Function: MOD10 (NUMBER) Returns the remainder when NUMBER is divided by 10. If NUMBER is negative, MOD10(NUMBER) is negative or zero. -- Function: RND (NUMBER [, MULT[, FUZZBITS]]) Rounds NUMBER and rounds it to a multiple of MULT (by default 1). Halves are rounded away from zero, as are values that fall short of halves by less than FUZZBITS of errors in the least-significant bits of NUMBER. If FUZZBITS is not specified then the default is taken from SET FUZZBITS (*note SET FUZZBITS::), which is 6 unless overridden. -- Function: TRUNC (NUMBER [, MULT[, FUZZBITS]]) Rounds NUMBER to a multiple of MULT, toward zero. For the default MULT of 1, this is equivalent to discarding the fractional part of NUMBER. Values that fall short of a multiple of MULT by less than FUZZBITS of errors in the least-significant bits of NUMBER are rounded away from zero. If FUZZBITS is not specified then the default is taken from SET FUZZBITS (*note SET FUZZBITS::), which is 6 unless overridden.  File: pspp.info, Node: Trigonometry, Next: Missing Value Functions, Prev: Miscellaneous Mathematics, Up: Functions 7.7.3 Trigonometric Functions ----------------------------- Trigonometric functions take numeric arguments and produce numeric results. -- Function: ARCOS (NUMBER) -- Function: ACOS (NUMBER) Takes the arccosine, in radians, of NUMBER. Results in system-missing if NUMBER is not between -1 and 1 inclusive. This function is a PSPP extension. -- Function: ARSIN (NUMBER) -- Function: ASIN (NUMBER) Takes the arcsine, in radians, of NUMBER. Results in system-missing if NUMBER is not between -1 and 1 inclusive. -- Function: ARTAN (NUMBER) -- Function: ATAN (NUMBER) Takes the arctangent, in radians, of NUMBER. -- Function: COS (ANGLE) Takes the cosine of ANGLE which should be in radians. -- Function: SIN (ANGLE) Takes the sine of ANGLE which should be in radians. -- Function: TAN (ANGLE) Takes the tangent of ANGLE which should be in radians. Results in system-missing at values of ANGLE that are too close to odd multiples of \pi/2. Portability: none.  File: pspp.info, Node: Missing Value Functions, Next: Set Membership, Prev: Trigonometry, Up: Functions 7.7.4 Missing-Value Functions ----------------------------- Missing-value functions take various numeric arguments and yield various types of results. Except where otherwise stated below, the normal rules of evaluation apply within expression arguments to these functions. In particular, user-missing values for numeric variables are converted to system-missing values. -- Function: MISSING (EXPR) When EXPR is simply the name of a numeric variable, returns 1 if the variable has the system-missing value or if it is user-missing. For any other value 0 is returned. If EXPR takes another form, the function returns 1 if the value is system-missing, 0 otherwise. -- Function: NMISS (EXPR [, EXPR]...) Each argument must be a numeric expression. Returns the number of system-missing values in the list, which may include variable ranges using the 'VAR1 TO VAR2' syntax. -- Function: NVALID (EXPR [, EXPR]...) Each argument must be a numeric expression. Returns the number of values in the list that are not system-missing. The list may include variable ranges using the 'VAR1 TO VAR2' syntax. -- Function: SYSMIS (EXPR) Returns 1 if EXPR has the system-missing value, 0 otherwise. -- Function: VALUE (VARIABLE) Prevents the user-missing values of VARIABLE from being transformed into system-missing values, and always results in the actual value of VARIABLE, whether it is valid, user-missing, or system-missing.  File: pspp.info, Node: Set Membership, Next: Statistical Functions, Prev: Missing Value Functions, Up: Functions 7.7.5 Set-Membership Functions ------------------------------ Set membership functions determine whether a value is a member of a set. They take a set of numeric arguments or a set of string arguments, and produce Boolean results. String comparisons are performed according to the rules given in *note Relational Operators::. -- Function: ANY (VALUE, SET [, SET]...) Results in true if VALUE is equal to any of the SET values. Otherwise, results in false. If VALUE is system-missing, returns system-missing. System-missing values in SET do not cause 'ANY' to return system-missing. -- Function: RANGE (VALUE, LOW, HIGH [, LOW, HIGH]...) Results in true if VALUE is in any of the intervals bounded by LOW and HIGH inclusive. Otherwise, results in false. Each LOW must be less than or equal to its corresponding HIGH value. LOW and HIGH must be given in pairs. If VALUE is system-missing, returns system-missing. System-missing values in SET do not cause 'RANGE' to return system-missing.  File: pspp.info, Node: Statistical Functions, Next: String Functions, Prev: Set Membership, Up: Functions 7.7.6 Statistical Functions --------------------------- Statistical functions compute descriptive statistics on a list of values. Some statistics can be computed on numeric or string values; other can only be computed on numeric values. Their results have the same type as their arguments. The current case's weighting factor (*note WEIGHT::) has no effect on statistical functions. These functions' argument lists may include entire ranges of variables using the 'VAR1 TO VAR2' syntax. Unlike most functions, statistical functions can return non-missing values even when some of their arguments are missing. Most statistical functions, by default, require only 1 non-missing value to have a non-missing return, but 'CFVAR', 'SD', and 'VARIANCE' require 2. These defaults can be increased (but not decreased) by appending a dot and the minimum number of valid arguments to the function name. For example, 'MEAN.3(X, Y, Z)' would only return non-missing if all of 'X', 'Y', and 'Z' were valid. -- Function: CFVAR (NUMBER, NUMBER[, ...]) Results in the coefficient of variation of the values of NUMBER. (The coefficient of variation is the standard deviation divided by the mean.) -- Function: MAX (VALUE, VALUE[, ...]) Results in the value of the greatest VALUE. The VALUEs may be numeric or string. -- Function: MEAN (NUMBER, NUMBER[, ...]) Results in the mean of the values of NUMBER. -- Function: MEDIAN (NUMBER, NUMBER[, ...]) Results in the median of the values of NUMBER. Given an even number of nonmissing arguments, yields the mean of the two middle values. -- Function: MIN (NUMBER, NUMBER[, ...]) Results in the value of the least VALUE. The VALUEs may be numeric or string. -- Function: SD (NUMBER, NUMBER[, ...]) Results in the standard deviation of the values of NUMBER. -- Function: SUM (NUMBER, NUMBER[, ...]) Results in the sum of the values of NUMBER. -- Function: VARIANCE (NUMBER, NUMBER[, ...]) Results in the variance of the values of NUMBER.  File: pspp.info, Node: String Functions, Next: Time and Date, Prev: Statistical Functions, Up: Functions 7.7.7 String Functions ---------------------- String functions take various arguments and return various results. -- Function: CONCAT (STRING, STRING[, ...]) Returns a string consisting of each STRING in sequence. 'CONCAT("abc", "def", "ghi")' has a value of '"abcdefghi"'. The resultant string is truncated to a maximum of 255 characters. -- Function: INDEX (HAYSTACK, NEEDLE) Returns a positive integer indicating the position of the first occurrence of NEEDLE in HAYSTACK. Returns 0 if HAYSTACK does not contain NEEDLE. Returns system-missing if NEEDLE is an empty string. -- Function: INDEX (HAYSTACK, NEEDLES, NEEDLE_LEN) Divides NEEDLES into one or more needles, each with length NEEDLE_LEN. Searches HAYSTACK for the first occurrence of each needle, and returns the smallest value. Returns 0 if HAYSTACK does not contain any part in NEEDLE. It is an error if NEEDLE_LEN does not evenly divide the length of NEEDLES. Returns system-missing if NEEDLES is an empty string. -- Function: LENGTH (STRING) Returns the number of characters in STRING. -- Function: LOWER (STRING) Returns a string identical to STRING except that all uppercase letters are changed to lowercase letters. The definitions of "uppercase" and "lowercase" are system-dependent. -- Function: LPAD (STRING, LENGTH) If STRING is at least LENGTH characters in length, returns STRING unchanged. Otherwise, returns STRING padded with spaces on the left side to length LENGTH. Returns an empty string if LENGTH is system-missing, negative, or greater than 255. -- Function: LPAD (STRING, LENGTH, PADDING) If STRING is at least LENGTH characters in length, returns STRING unchanged. Otherwise, returns STRING padded with PADDING on the left side to length LENGTH. Returns an empty string if LENGTH is system-missing, negative, or greater than 255, or if PADDING does not contain exactly one character. -- Function: LTRIM (STRING) Returns STRING, after removing leading spaces. Other white space, such as tabs, carriage returns, line feeds, and vertical tabs, is not removed. -- Function: LTRIM (STRING, PADDING) Returns STRING, after removing leading PADDING characters. If PADDING does not contain exactly one character, returns an empty string. -- Function: NUMBER (STRING, FORMAT) Returns the number produced when STRING is interpreted according to format specifier FORMAT. If the format width W is less than the length of STRING, then only the first W characters in STRING are used, e.g. 'NUMBER("123", F3.0)' and 'NUMBER("1234", F3.0)' both have value 123. If W is greater than STRING's length, then it is treated as if it were right-padded with spaces. If STRING is not in the correct format for FORMAT, system-missing is returned. -- Function: REPLACE (HAYSTACK, NEEDLE, REPLACEMENT[, N]) Returns string HAYSTACK with instances of NEEDLE replaced by REPLACEMENT. If nonnegative integer N is specified, it limits the maximum number of replacements; otherwise, all instances of NEEDLE are replaced. -- Function: RINDEX (HAYSTACK, NEEDLE) Returns a positive integer indicating the position of the last occurrence of NEEDLE in HAYSTACK. Returns 0 if HAYSTACK does not contain NEEDLE. Returns system-missing if NEEDLE is an empty string. -- Function: RINDEX (HAYSTACK, NEEDLE, NEEDLE_LEN) Divides NEEDLE into parts, each with length NEEDLE_LEN. Searches HAYSTACK for the last occurrence of each part, and returns the largest value. Returns 0 if HAYSTACK does not contain any part in NEEDLE. It is an error if NEEDLE_LEN does not evenly divide the length of NEEDLE. Returns system-missing if NEEDLE is an empty string or if needle_len is less than 1. -- Function: RPAD (STRING, LENGTH) If STRING is at least LENGTH characters in length, returns STRING unchanged. Otherwise, returns STRING padded with spaces on the right to length LENGTH. Returns an empty string if LENGTH is system-missing, negative, or greater than 255. -- Function: RPAD (STRING, LENGTH, PADDING) If STRING is at least LENGTH characters in length, returns STRING unchanged. Otherwise, returns STRING padded with PADDING on the right to length LENGTH. Returns an empty string if LENGTH is system-missing, negative, or greater than 255, or if PADDING does not contain exactly one character. -- Function: RTRIM (STRING) Returns STRING, after removing trailing spaces. Other types of white space are not removed. -- Function: RTRIM (STRING, PADDING) Returns STRING, after removing trailing PADDING characters. If PADDING does not contain exactly one character, returns an empty string. -- Function: STRING (NUMBER, FORMAT) Returns a string corresponding to NUMBER in the format given by format specifier FORMAT. For example, 'STRING(123.56, F5.1)' has the value '"123.6"'. -- Function: STRUNC (STRING, N) Returns STRING, first trimming it to at most N bytes, then removing trailing spaces. Returns an empty string if N is missing or negative. -- Function: SUBSTR (STRING, START) Returns a string consisting of the value of STRING from position START onward. Returns an empty string if START is system-missing, less than 1, or greater than the length of STRING. -- Function: SUBSTR (STRING, START, COUNT) Returns a string consisting of the first COUNT characters from STRING beginning at position START. Returns an empty string if START or COUNT is system-missing, if START is less than 1 or greater than the number of characters in STRING, or if COUNT is less than 1. Returns a string shorter than COUNT characters if START + COUNT - 1 is greater than the number of characters in STRING. Examples: 'SUBSTR("abcdefg", 3, 2)' has value '"cd"'; 'SUBSTR("nonsense", 4, 10)' has the value '"sense"'. -- Function: UPCASE (STRING) Returns STRING, changing lowercase letters to uppercase letters.  File: pspp.info, Node: Time and Date, Next: Miscellaneous Functions, Prev: String Functions, Up: Functions 7.7.8 Time & Date Functions --------------------------- For compatibility, PSPP considers dates before 15 Oct 1582 invalid. Most time and date functions will not accept earlier dates. * Menu: * Time and Date Concepts:: How times & dates are defined and represented * Time Construction:: TIME.{DAYS HMS} * Time Extraction:: CTIME.{DAYS HOURS MINUTES SECONDS} * Date Construction:: DATE.{DMY MDY MOYR QYR WKYR YRDAY} * Date Extraction:: XDATE.{DATE HOUR JDAY MDAY MINUTE MONTH QUARTER SECOND TDAY TIME WEEK WKDAY YEAR} * Time and Date Arithmetic:: DATEDIFF DATESUM  File: pspp.info, Node: Time and Date Concepts, Next: Time Construction, Up: Time and Date 7.7.8.1 How times & dates are defined and represented ..................................................... Times and dates are handled by PSPP as single numbers. A "time" is an interval. PSPP measures times in seconds. Thus, the following intervals correspond with the numeric values given: 10 minutes 600 1 hour 3,600 1 day, 3 hours, 10 seconds 97,210 40 days 3,456,000 A "date", on the other hand, is a particular instant in the past or the future. PSPP represents a date as a number of seconds since midnight preceding 14 Oct 1582. Because midnight preceding the dates given below correspond with the numeric PSPP dates given: 15 Oct 1582 86,400 4 Jul 1776 6,113,318,400 1 Jan 1900 10,010,390,400 1 Oct 1978 12,495,427,200 24 Aug 1995 13,028,601,600  File: pspp.info, Node: Time Construction, Next: Time Extraction, Prev: Time and Date Concepts, Up: Time and Date 7.7.8.2 Functions that Produce Times .................................... These functions take numeric arguments and return numeric values that represent times. -- Function: TIME.DAYS (NDAYS) Returns a time corresponding to NDAYS days. -- Function: TIME.HMS (NHOURS, NMINS, NSECS) Returns a time corresponding to NHOURS hours, NMINS minutes, and NSECS seconds. The arguments may not have mixed signs: if any of them are positive, then none may be negative, and vice versa.  File: pspp.info, Node: Time Extraction, Next: Date Construction, Prev: Time Construction, Up: Time and Date 7.7.8.3 Functions that Examine Times .................................... These functions take numeric arguments in PSPP time format and give numeric results. -- Function: CTIME.DAYS (TIME) Results in the number of days and fractional days in TIME. -- Function: CTIME.HOURS (TIME) Results in the number of hours and fractional hours in TIME. -- Function: CTIME.MINUTES (TIME) Results in the number of minutes and fractional minutes in TIME. -- Function: CTIME.SECONDS (TIME) Results in the number of seconds and fractional seconds in TIME. ('CTIME.SECONDS' does nothing; 'CTIME.SECONDS(X)' is equivalent to 'X'.)  File: pspp.info, Node: Date Construction, Next: Date Extraction, Prev: Time Extraction, Up: Time and Date 7.7.8.4 Functions that Produce Dates .................................... These functions take numeric arguments and give numeric results that represent dates. Arguments taken by these functions are: DAY Refers to a day of the month between 1 and 31. Day 0 is also accepted and refers to the final day of the previous month. Days 29, 30, and 31 are accepted even in months that have fewer days and refer to a day near the beginning of the following month. MONTH Refers to a month of the year between 1 and 12. Months 0 and 13 are also accepted and refer to the last month of the preceding year and the first month of the following year, respectively. QUARTER Refers to a quarter of the year between 1 and 4. The quarters of the year begin on the first day of months 1, 4, 7, and 10. WEEK Refers to a week of the year between 1 and 53. YDAY Refers to a day of the year between 1 and 366. YEAR Refers to a year, 1582 or greater. Years between 0 and 99 are treated according to the epoch set on SET EPOCH, by default beginning 69 years before the current date (*note SET EPOCH::). If these functions' arguments are out-of-range, they are correctly normalized before conversion to date format. Non-integers are rounded toward zero. -- Function: DATE.DMY (DAY, MONTH, YEAR) -- Function: DATE.MDY (MONTH, DAY, YEAR) Results in a date value corresponding to the midnight before day DAY of month MONTH of year YEAR. -- Function: DATE.MOYR (MONTH, YEAR) Results in a date value corresponding to the midnight before the first day of month MONTH of year YEAR. -- Function: DATE.QYR (QUARTER, YEAR) Results in a date value corresponding to the midnight before the first day of quarter QUARTER of year YEAR. -- Function: DATE.WKYR (WEEK, YEAR) Results in a date value corresponding to the midnight before the first day of week WEEK of year YEAR. -- Function: DATE.YRDAY (YEAR, YDAY) Results in a date value corresponding to the day YDAY of year YEAR.  File: pspp.info, Node: Date Extraction, Next: Time and Date Arithmetic, Prev: Date Construction, Up: Time and Date 7.7.8.5 Functions that Examine Dates .................................... These functions take numeric arguments in PSPP date or time format and give numeric results. These names are used for arguments: DATE A numeric value in PSPP date format. TIME A numeric value in PSPP time format. TIME-OR-DATE A numeric value in PSPP time or date format. -- Function: XDATE.DATE (TIME-OR-DATE) For a time, results in the time corresponding to the number of whole days DATE-OR-TIME includes. For a date, results in the date corresponding to the latest midnight at or before DATE-OR-TIME; that is, gives the date that DATE-OR-TIME is in. -- Function: XDATE.HOUR (TIME-OR-DATE) For a time, results in the number of whole hours beyond the number of whole days represented by DATE-OR-TIME. For a date, results in the hour (as an integer between 0 and 23) corresponding to DATE-OR-TIME. -- Function: XDATE.JDAY (DATE) Results in the day of the year (as an integer between 1 and 366) corresponding to DATE. -- Function: XDATE.MDAY (DATE) Results in the day of the month (as an integer between 1 and 31) corresponding to DATE. -- Function: XDATE.MINUTE (TIME-OR-DATE) Results in the number of minutes (as an integer between 0 and 59) after the last hour in TIME-OR-DATE. -- Function: XDATE.MONTH (DATE) Results in the month of the year (as an integer between 1 and 12) corresponding to DATE. -- Function: XDATE.QUARTER (DATE) Results in the quarter of the year (as an integer between 1 and 4) corresponding to DATE. -- Function: XDATE.SECOND (TIME-OR-DATE) Results in the number of whole seconds after the last whole minute (as an integer between 0 and 59) in TIME-OR-DATE. -- Function: XDATE.TDAY (DATE) Results in the number of whole days from 14 Oct 1582 to DATE. -- Function: XDATE.TIME (DATE) Results in the time of day at the instant corresponding to DATE, as a time value. This is the number of seconds since midnight on the day corresponding to DATE. -- Function: XDATE.WEEK (DATE) Results in the week of the year (as an integer between 1 and 53) corresponding to DATE. -- Function: XDATE.WKDAY (DATE) Results in the day of week (as an integer between 1 and 7) corresponding to DATE, where 1 represents Sunday. -- Function: XDATE.YEAR (DATE) Returns the year (as an integer 1582 or greater) corresponding to DATE.  File: pspp.info, Node: Time and Date Arithmetic, Prev: Date Extraction, Up: Time and Date 7.7.8.6 Time and Date Arithmetic ................................ Ordinary arithmetic operations on dates and times often produce sensible results. Adding a time to, or subtracting one from, a date produces a new date that much earlier or later. The difference of two dates yields the time between those dates. Adding two times produces the combined time. Multiplying a time by a scalar produces a time that many times longer. Since times and dates are just numbers, the ordinary addition and subtraction operators are employed for these purposes. Adding two dates does not produce a useful result. Dates and times may have very large values. Thus, it is not a good idea to take powers of these values; also, the accuracy of some procedures may be affected. If necessary, convert times or dates in seconds to some other unit, like days or years, before performing analysis. PSPP supplies a few functions for date arithmetic: -- Function: DATEDIFF (DATE2, DATE1, UNIT) Returns the span of time from DATE1 to DATE2 in terms of UNIT, which must be a quoted string, one of 'years', 'quarters', 'months', 'weeks', 'days', 'hours', 'minutes', and 'seconds'. The result is an integer, truncated toward zero. One year is considered to span from a given date to the same month, day, and time of day the next year. Thus, from Jan. 1 of one year to Jan. 1 the next year is considered to be a full year, but Feb. 29 of a leap year to the following Feb. 28 is not. Similarly, one month spans from a given day of the month to the same day of the following month. Thus, there is never a full month from Jan. 31 of a given year to any day in the following February. -- Function: DATESUM (DATE, QUANTITY, UNIT[, METHOD]) Returns DATE advanced by the given QUANTITY of the specified UNIT, which must be one of the strings 'years', 'quarters', 'months', 'weeks', 'days', 'hours', 'minutes', and 'seconds'. When UNIT is 'years', 'quarters', or 'months', only the integer part of QUANTITY is considered. Adding one of these units can cause the day of the month to exceed the number of days in the month. In this case, the METHOD comes into play: if it is omitted or specified as 'closest' (as a quoted string), then the resulting day is the last day of the month; otherwise, if it is specified as 'rollover', then the extra days roll over into the following month. When UNIT is 'weeks', 'days', 'hours', 'minutes', or 'seconds', the QUANTITY is not rounded to an integer and METHOD, if specified, is ignored.  File: pspp.info, Node: Miscellaneous Functions, Next: Statistical Distribution Functions, Prev: Time and Date, Up: Functions 7.7.9 Miscellaneous Functions ----------------------------- -- Function: LAG (VARIABLE[, N]) VARIABLE must be a numeric or string variable name. 'LAG' yields the value of that variable for the case N before the current one. Results in system-missing (for numeric variables) or blanks (for string variables) for the first N cases. 'LAG' obtains values from the cases that become the new active dataset after a procedure executes. Thus, 'LAG' will not return values from cases dropped by transformations such as 'SELECT IF', and transformations like 'COMPUTE' that modify data will change the values returned by 'LAG'. These are both the case whether these transformations precede or follow the use of 'LAG'. If 'LAG' is used before 'TEMPORARY', then the values it returns are those in cases just before 'TEMPORARY'. 'LAG' may not be used after 'TEMPORARY'. If omitted, NCASES defaults to 1. Otherwise, NCASES must be a small positive constant integer. There is no explicit limit, but use of a large value will increase memory consumption. -- Function: YRMODA (YEAR, MONTH, DAY) YEAR is a year, either between 0 and 99 or at least 1582. Unlike other PSPP date functions, years between 0 and 99 always correspond to 1900 through 1999. MONTH is a month between 1 and 13. DAY is a day between 0 and 31. A DAY of 0 refers to the last day of the previous month, and a MONTH of 13 refers to the first month of the next year. YEAR must be in range. YEAR, MONTH, and DAY must all be integers. 'YRMODA' results in the number of days between 15 Oct 1582 and the date specified, plus one. The date passed to 'YRMODA' must be on or after 15 Oct 1582. 15 Oct 1582 has a value of 1. -- Function: VALUELABEL (VARIABLE) Returns a string matching the label associated with the current value of VARIABLE. If the current value of VARIABLE has no associated label, then this function returns the empty string. VARIABLE may be a numeric or string variable.  File: pspp.info, Node: Statistical Distribution Functions, Prev: Miscellaneous Functions, Up: Functions 7.7.10 Statistical Distribution Functions ----------------------------------------- PSPP can calculate several functions of standard statistical distributions. These functions are named systematically based on the function and the distribution. The table below describes the statistical distribution functions in general: PDF.DIST (X[, PARAM...]) Probability density function for DIST. The domain of X depends on DIST. For continuous distributions, the result is the density of the probability function at X, and the range is nonnegative real numbers. For discrete distributions, the result is the probability of X. CDF.DIST (X[, PARAM...]) Cumulative distribution function for DIST, that is, the probability that a random variate drawn from the distribution is less than X. The domain of X depends DIST. The result is a probability. SIG.DIST (X[, PARAM...) Tail probability function for DIST, that is, the probability that a random variate drawn from the distribution is greater than X. The domain of X depends DIST. The result is a probability. Only a few distributions include an 'SIG' function. IDF.DIST (P[, PARAM...]) Inverse distribution function for DIST, the value of X for which the CDF would yield P. The value of P is a probability. The range depends on DIST and is identical to the domain for the corresponding CDF. RV.DIST ([PARAM...]) Random variate function for DIST. The range depends on the distribution. NPDF.DIST (X[, PARAM...]) Noncentral probability density function. The result is the density of the given noncentral distribution at X. The domain of X depends on DIST. The range is nonnegative real numbers. Only a few distributions include an 'NPDF' function. NCDF.DIST (X[, PARAM...]) Noncentral cumulative distribution function for DIST, that is, the probability that a random variate drawn from the given noncentral distribution is less than X. The domain of X depends DIST. The result is a probability. Only a few distributions include an NCDF function. The individual distributions are described individually below. * Menu: * Continuous Distributions:: * Discrete Distributions::  File: pspp.info, Node: Continuous Distributions, Next: Discrete Distributions, Up: Statistical Distribution Functions 7.7.10.1 Continuous Distributions ................................. The following continuous distributions are available: -- Function: PDF.BETA (X) -- Function: CDF.BETA (X, A, B) -- Function: IDF.BETA (P, A, B) -- Function: RV.BETA (A, B) -- Function: NPDF.BETA (X, A, B, LAMBDA) -- Function: NCDF.BETA (X, A, B, LAMBDA) Beta distribution with shape parameters A and B. The noncentral distribution takes an additional parameter LAMBDA. Constraints: A > 0, B > 0, LAMBDA >= 0, 0 <= X <= 1, 0 <= P <= 1. -- Function: PDF.BVNOR (X0, X1, RHO) -- Function: CDF.VBNOR (X0, X1, RHO) Bivariate normal distribution of two standard normal variables with correlation coefficient RHO. Two variates X0 and X1 must be provided. Constraints: 0 <= RHO <= 1, 0 <= P <= 1. -- Function: PDF.CAUCHY (X, A, B) -- Function: CDF.CAUCHY (X, A, B) -- Function: IDF.CAUCHY (P, A, B) -- Function: RV.CAUCHY (A, B) Cauchy distribution with location parameter A and scale parameter B. Constraints: B > 0, 0 < P < 1. -- Function: CDF.CHISQ (X, DF) -- Function: SIG.CHISQ (X, DF) -- Function: IDF.CHISQ (P, DF) -- Function: RV.CHISQ (DF) -- Function: NCDF.CHISQ (X, DF, LAMBDA) Chi-squared distribution with DF degrees of freedom. The noncentral distribution takes an additional parameter LAMBDA. Constraints: DF > 0, LAMBDA > 0, X >= 0, 0 <= P < 1. -- Function: PDF.EXP (X, A) -- Function: CDF.EXP (X, A) -- Function: IDF.EXP (P, A) -- Function: RV.EXP (A) Exponential distribution with scale parameter A. The inverse of A represents the rate of decay. Constraints: A > 0, X >= 0, 0 <= P < 1. -- Function: PDF.XPOWER (X, A, B) -- Function: RV.XPOWER (A, B) Exponential power distribution with positive scale parameter A and nonnegative power parameter B. Constraints: A > 0, B >= 0, X >= 0, 0 <= P <= 1. This distribution is a PSPP extension. -- Function: PDF.F (X, DF1, DF2) -- Function: CDF.F (X, DF1, DF2) -- Function: SIG.F (X, DF1, DF2) -- Function: IDF.F (P, DF1, DF2) -- Function: RV.F (DF1, DF2) F-distribution of two chi-squared deviates with DF1 and DF2 degrees of freedom. The noncentral distribution takes an additional parameter LAMBDA. Constraints: DF1 > 0, DF2 > 0, LAMBDA >= 0, X >= 0, 0 <= P < 1. -- Function: PDF.GAMMA (X, A, B) -- Function: CDF.GAMMA (X, A, B) -- Function: IDF.GAMMA (P, A, B) -- Function: RV.GAMMA (A, B) Gamma distribution with shape parameter A and scale parameter B. Constraints: A > 0, B > 0, X >= 0, 0 <= P < 1. -- Function: PDF.LANDAU (X) -- Function: RV.LANDAU () Landau distribution. -- Function: PDF.LAPLACE (X, A, B) -- Function: CDF.LAPLACE (X, A, B) -- Function: IDF.LAPLACE (P, A, B) -- Function: RV.LAPLACE (A, B) Laplace distribution with location parameter A and scale parameter B. Constraints: B > 0, 0 < P < 1. -- Function: RV.LEVY (C, ALPHA) Levy symmetric alpha-stable distribution with scale C and exponent ALPHA. Constraints: 0 < ALPHA <= 2. -- Function: RV.LVSKEW (C, ALPHA, BETA) Levy skew alpha-stable distribution with scale C, exponent ALPHA, and skewness parameter BETA. Constraints: 0 < ALPHA <= 2, -1 <= BETA <= 1. -- Function: PDF.LOGISTIC (X, A, B) -- Function: CDF.LOGISTIC (X, A, B) -- Function: IDF.LOGISTIC (P, A, B) -- Function: RV.LOGISTIC (A, B) Logistic distribution with location parameter A and scale parameter B. Constraints: B > 0, 0 < P < 1. -- Function: PDF.LNORMAL (X, A, B) -- Function: CDF.LNORMAL (X, A, B) -- Function: IDF.LNORMAL (P, A, B) -- Function: RV.LNORMAL (A, B) Lognormal distribution with parameters A and B. Constraints: A > 0, B > 0, X >= 0, 0 <= P < 1. -- Function: PDF.NORMAL (X, MU, SIGMA) -- Function: CDF.NORMAL (X, MU, SIGMA) -- Function: IDF.NORMAL (P, MU, SIGMA) -- Function: RV.NORMAL (MU, SIGMA) Normal distribution with mean MU and standard deviation SIGMA. Constraints: B > 0, 0 < P < 1. Three additional functions are available as shorthand: -- Function: CDFNORM (X) Equivalent to CDF.NORMAL(X, 0, 1). -- Function: PROBIT (P) Equivalent to IDF.NORMAL(P, 0, 1). -- Function: NORMAL (SIGMA) Equivalent to RV.NORMAL(0, SIGMA). -- Function: PDF.NTAIL (X, A, SIGMA) -- Function: RV.NTAIL (A, SIGMA) Normal tail distribution with lower limit A and standard deviation SIGMA. This distribution is a PSPP extension. Constraints: A > 0, X > A, 0 < P < 1. -- Function: PDF.PARETO (X, A, B) -- Function: CDF.PARETO (X, A, B) -- Function: IDF.PARETO (P, A, B) -- Function: RV.PARETO (A, B) Pareto distribution with threshold parameter A and shape parameter B. Constraints: A > 0, B > 0, X >= A, 0 <= P < 1. -- Function: PDF.RAYLEIGH (X, SIGMA) -- Function: CDF.RAYLEIGH (X, SIGMA) -- Function: IDF.RAYLEIGH (P, SIGMA) -- Function: RV.RAYLEIGH (SIGMA) Rayleigh distribution with scale parameter SIGMA. This distribution is a PSPP extension. Constraints: SIGMA > 0, X > 0. -- Function: PDF.RTAIL (X, A, SIGMA) -- Function: RV.RTAIL (A, SIGMA) Rayleigh tail distribution with lower limit A and scale parameter SIGMA. This distribution is a PSPP extension. Constraints: A > 0, SIGMA > 0, X > A. -- Function: PDF.T (X, DF) -- Function: CDF.T (X, DF) -- Function: IDF.T (P, DF) -- Function: RV.T (DF) T-distribution with DF degrees of freedom. The noncentral distribution takes an additional parameter LAMBDA. Constraints: DF > 0, 0 < P < 1. -- Function: PDF.T1G (X, A, B) -- Function: CDF.T1G (X, A, B) -- Function: IDF.T1G (P, A, B) Type-1 Gumbel distribution with parameters A and B. This distribution is a PSPP extension. Constraints: 0 < P < 1. -- Function: PDF.T2G (X, A, B) -- Function: CDF.T2G (X, A, B) -- Function: IDF.T2G (P, A, B) Type-2 Gumbel distribution with parameters A and B. This distribution is a PSPP extension. Constraints: X > 0, 0 < P < 1. -- Function: PDF.UNIFORM (X, A, B) -- Function: CDF.UNIFORM (X, A, B) -- Function: IDF.UNIFORM (P, A, B) -- Function: RV.UNIFORM (A, B) Uniform distribution with parameters A and B. Constraints: A <= X <= B, 0 <= P <= 1. An additional function is available as shorthand: -- Function: UNIFORM (B) Equivalent to RV.UNIFORM(0, B). -- Function: PDF.WEIBULL (X, A, B) -- Function: CDF.WEIBULL (X, A, B) -- Function: IDF.WEIBULL (P, A, B) -- Function: RV.WEIBULL (A, B) Weibull distribution with parameters A and B. Constraints: A > 0, B > 0, X >= 0, 0 <= P < 1.  File: pspp.info, Node: Discrete Distributions, Prev: Continuous Distributions, Up: Statistical Distribution Functions 7.7.10.2 Discrete Distributions ............................... The following discrete distributions are available: -- Function: PDF.BERNOULLI (X) -- Function: CDF.BERNOULLI (X, P) -- Function: RV.BERNOULLI (P) Bernoulli distribution with probability of success P. Constraints: X = 0 or 1, 0 <= P <= 1. -- Function: PDF.BINOM (X, N, P) -- Function: CDF.BINOM (X, N, P) -- Function: RV.BINOM (N, P) Binomial distribution with N trials and probability of success P. Constraints: integer N > 0, 0 <= P <= 1, integer X <= N. -- Function: PDF.GEOM (X, N, P) -- Function: CDF.GEOM (X, N, P) -- Function: RV.GEOM (N, P) Geometric distribution with probability of success P. Constraints: 0 <= P <= 1, integer X > 0. -- Function: PDF.HYPER (X, A, B, C) -- Function: CDF.HYPER (X, A, B, C) -- Function: RV.HYPER (A, B, C) Hypergeometric distribution when B objects out of A are drawn and C of the available objects are distinctive. Constraints: integer A > 0, integer B <= A, integer C <= A, integer X >= 0. -- Function: PDF.LOG (X, P) -- Function: RV.LOG (P) Logarithmic distribution with probability parameter P. Constraints: 0 <= P < 1, X >= 1. -- Function: PDF.NEGBIN (X, N, P) -- Function: CDF.NEGBIN (X, N, P) -- Function: RV.NEGBIN (N, P) Negative binomial distribution with number of successes parameter N and probability of success parameter P. Constraints: integer N >= 0, 0 < P <= 1, integer X >= 1. -- Function: PDF.POISSON (X, MU) -- Function: CDF.POISSON (X, MU) -- Function: RV.POISSON (MU) Poisson distribution with mean MU. Constraints: MU > 0, integer X >= 0.  File: pspp.info, Node: Order of Operations, Prev: Functions, Up: Expressions 7.8 Operator Precedence ======================= The following table describes operator precedence. Smaller-numbered levels in the table have higher precedence. Within a level, operations are always performed from left to right. The first occurrence of '-' represents unary negation, the second binary subtraction. 1. '( )' 2. '**' 3. '-' 4. '* /' 5. '+ -' 6. 'EQ GE GT LE LT NE' 7. 'AND NOT OR'  File: pspp.info, Node: Data Input and Output, Next: System and Portable File IO, Prev: Expressions, Up: Top 8 Data Input and Output *********************** Data are the focus of the PSPP language. Each datum belongs to a "case" (also called an "observation"). Each case represents an individual or "experimental unit". For example, in the results of a survey, the names of the respondents, their sex, age, etc. and their responses are all data and the data pertaining to single respondent is a case. This chapter examines the PSPP commands for defining variables and reading and writing data. There are alternative commands to read data from predefined sources such as system files or databases (*Note GET DATA: GET.) Note: These commands tell PSPP how to read data, but the data will not actually be read until a procedure is executed. * Menu: * BEGIN DATA:: Embed data within a syntax file. * CLOSE FILE HANDLE:: Close a file handle. * DATAFILE ATTRIBUTE:: Set custom attributes on data files. * DATASET:: Manage multiple datasets. * DATA LIST:: Fundamental data reading command. * END CASE:: Output the current case. * END FILE:: Terminate the current input program. * FILE HANDLE:: Support for special file formats. * INPUT PROGRAM:: Support for complex input programs. * LIST:: List cases in the active dataset. * NEW FILE:: Clear the active dataset. * MATRIX DATA:: Defining matrix material for procedures. * PRINT:: Display values in print formats. * PRINT EJECT:: Eject the current page then print. * PRINT SPACE:: Print blank lines. * REREAD:: Take another look at the previous input line. * REPEATING DATA:: Multiple cases on a single line. * WRITE:: Display values in write formats.  File: pspp.info, Node: BEGIN DATA, Next: CLOSE FILE HANDLE, Up: Data Input and Output 8.1 BEGIN DATA ============== BEGIN DATA. ... END DATA. 'BEGIN DATA' and 'END DATA' can be used to embed raw ASCII data in a PSPP syntax file. 'DATA LIST' or another input procedure must be used before 'BEGIN DATA' (*note DATA LIST::). 'BEGIN DATA' and 'END DATA' must be used together. 'END DATA' must appear by itself on a single line, with no leading white space and exactly one space between the words 'END' and 'DATA', like this: END DATA.  File: pspp.info, Node: CLOSE FILE HANDLE, Next: DATAFILE ATTRIBUTE, Prev: BEGIN DATA, Up: Data Input and Output 8.2 CLOSE FILE HANDLE ===================== CLOSE FILE HANDLE HANDLE_NAME. 'CLOSE FILE HANDLE' disassociates the name of a file handle with a given file. The only specification is the name of the handle to close. Afterward 'FILE HANDLE'. The file named INLINE, which represents data entered between 'BEGIN DATA' and 'END DATA', cannot be closed. Attempts to close it with 'CLOSE FILE HANDLE' have no effect. 'CLOSE FILE HANDLE' is a PSPP extension.  File: pspp.info, Node: DATAFILE ATTRIBUTE, Next: DATASET, Prev: CLOSE FILE HANDLE, Up: Data Input and Output 8.3 DATAFILE ATTRIBUTE ====================== DATAFILE ATTRIBUTE ATTRIBUTE=NAME('VALUE') [NAME('VALUE')]... ATTRIBUTE=NAME[INDEX]('VALUE') [NAME[INDEX]('VALUE')]... DELETE=NAME [NAME]... DELETE=NAME[INDEX] [NAME[INDEX]]... 'DATAFILE ATTRIBUTE' adds, modifies, or removes user-defined attributes associated with the active dataset. Custom data file attributes are not interpreted by PSPP, but they are saved as part of system files and may be used by other software that reads them. Use the 'ATTRIBUTE' subcommand to add or modify a custom data file attribute. Specify the name of the attribute as an identifier (*note Tokens::), followed by the desired value, in parentheses, as a quoted string. Attribute names that begin with '$' are reserved for PSPP's internal use, and attribute names that begin with '@' or '$@' are not displayed by most PSPP commands that display other attributes. Other attribute names are not treated specially. Attributes may also be organized into arrays. To assign to an array element, add an integer array index enclosed in square brackets ('[' and ']') between the attribute name and value. Array indexes start at 1, not 0. An attribute array that has a single element (number 1) is not distinguished from a non-array attribute. Use the 'DELETE' subcommand to delete an attribute. Specify an attribute name by itself to delete an entire attribute, including all array elements for attribute arrays. Specify an attribute name followed by an array index in square brackets to delete a single element of an attribute array. In the latter case, all the array elements numbered higher than the deleted element are shifted down, filling the vacated position. To associate custom attributes with particular variables, instead of with the entire active dataset, use 'VARIABLE ATTRIBUTE' (*note VARIABLE ATTRIBUTE::) instead. 'DATAFILE ATTRIBUTE' takes effect immediately. It is not affected by conditional and looping structures such as 'DO IF' or 'LOOP'.  File: pspp.info, Node: DATASET, Next: DATA LIST, Prev: DATAFILE ATTRIBUTE, Up: Data Input and Output 8.4 DATASET commands ==================== DATASET NAME NAME [WINDOW={ASIS,FRONT}]. DATASET ACTIVATE NAME [WINDOW={ASIS,FRONT}]. DATASET COPY NAME [WINDOW={MINIMIZED,HIDDEN,FRONT}]. DATASET DECLARE NAME [WINDOW={MINIMIZED,HIDDEN,FRONT}]. DATASET CLOSE {NAME,*,ALL}. DATASET DISPLAY. The 'DATASET' commands simplify use of multiple datasets within a PSPP session. They allow datasets to be created and destroyed. At any given time, most PSPP commands work with a single dataset, called the active dataset. The DATASET NAME command gives the active dataset the specified name, or if it already had a name, it renames it. If another dataset already had the given name, that dataset is deleted. The DATASET ACTIVATE command selects the named dataset, which must already exist, as the active dataset. Before switching the active dataset, any pending transformations are executed, as if 'EXECUTE' had been specified. If the active dataset is unnamed before switching, then it is deleted and becomes unavailable after switching. The DATASET COPY command creates a new dataset with the specified name, whose contents are a copy of the active dataset. Any pending transformations are executed, as if 'EXECUTE' had been specified, before making the copy. If a dataset with the given name already exists, it is replaced. If the name is the name of the active dataset, then the active dataset becomes unnamed. The DATASET DECLARE command creates a new dataset that is initially "empty," that is, it has no dictionary or data. If a dataset with the given name already exists, this has no effect. The new dataset can be used with commands that support output to a dataset, e.g. AGGREGATE (*note AGGREGATE::). The DATASET CLOSE command deletes a dataset. If the active dataset is specified by name, or if '*' is specified, then the active dataset becomes unnamed. If a different dataset is specified by name, then it is deleted and becomes unavailable. Specifying ALL deletes all datasets except for the active dataset, which becomes unnamed. The DATASET DISPLAY command lists all the currently defined datasets. Many DATASET commands accept an optional 'WINDOW' subcommand. In the PSPPIRE GUI, the value given for this subcommand influences how the dataset's window is displayed. Outside the GUI, the 'WINDOW' subcommand has no effect. The valid values are: ASIS Do not change how the window is displayed. This is the default for DATASET NAME and DATASET ACTIVATE. FRONT Raise the dataset's window to the top. Make it the default dataset for running syntax. MINIMIZED Display the window "minimized" to an icon. Prefer other datasets for running syntax. This is the default for DATASET COPY and DATASET DECLARE. HIDDEN Hide the dataset's window. Prefer other datasets for running syntax.  File: pspp.info, Node: DATA LIST, Next: END CASE, Prev: DATASET, Up: Data Input and Output 8.5 DATA LIST ============= Used to read text or binary data, 'DATA LIST' is the most fundamental data-reading command. Even the more sophisticated input methods use 'DATA LIST' commands as a building block. Understanding 'DATA LIST' is important to understanding how to use PSPP to read your data files. There are two major variants of 'DATA LIST', which are fixed format and free format. In addition, free format has a minor variant, list format, which is discussed in terms of its differences from vanilla free format. Each form of 'DATA LIST' is described in detail below. *Note GET DATA::, for a command that offers a few enhancements over DATA LIST and that may be substituted for DATA LIST in many situations. * Menu: * DATA LIST FIXED:: Fixed columnar locations for data. * DATA LIST FREE:: Any spacing you like. * DATA LIST LIST:: Each case must be on a single line.  File: pspp.info, Node: DATA LIST FIXED, Next: DATA LIST FREE, Up: DATA LIST 8.5.1 DATA LIST FIXED --------------------- DATA LIST [FIXED] {TABLE,NOTABLE} [FILE='FILE_NAME' [ENCODING='ENCODING']] [RECORDS=RECORD_COUNT] [END=END_VAR] [SKIP=RECORD_COUNT] /[line_no] VAR_SPEC... where each VAR_SPEC takes one of the forms VAR_LIST START-END [TYPE_SPEC] VAR_LIST (FORTRAN_SPEC) 'DATA LIST FIXED' is used to read data files that have values at fixed positions on each line of single-line or multiline records. The keyword FIXED is optional. The 'FILE' subcommand must be used if input is to be taken from an external file. It may be used to specify a file name as a string or a file handle (*note File Handles::). If the 'FILE' subcommand is not used, then input is assumed to be specified within the command file using 'BEGIN DATA'...'END DATA' (*note BEGIN DATA::). The 'ENCODING' subcommand may only be used if the 'FILE' subcommand is also used. It specifies the character encoding of the file. *Note INSERT::, for information on supported encodings. The optional 'RECORDS' subcommand, which takes a single integer as an argument, is used to specify the number of lines per record. If 'RECORDS' is not specified, then the number of lines per record is calculated from the list of variable specifications later in 'DATA LIST'. The 'END' subcommand is only useful in conjunction with 'INPUT PROGRAM'. *Note INPUT PROGRAM::, for details. The optional 'SKIP' subcommand specifies a number of records to skip at the beginning of an input file. It can be used to skip over a row that contains variable names, for example. 'DATA LIST' can optionally output a table describing how the data file will be read. The 'TABLE' subcommand enables this output, and 'NOTABLE' disables it. The default is to output the table. The list of variables to be read from the data list must come last. Each line in the data record is introduced by a slash ('/'). Optionally, a line number may follow the slash. Following, any number of variable specifications may be present. Each variable specification consists of a list of variable names followed by a description of their location on the input line. Sets of variables may be specified using the 'DATA LIST' 'TO' convention (*note Sets of Variables::). There are two ways to specify the location of the variable on the line: columnar style and FORTRAN style. In columnar style, the starting column and ending column for the field are specified after the variable name, separated by a dash ('-'). For instance, the third through fifth columns on a line would be specified '3-5'. By default, variables are considered to be in 'F' format (*note Input and Output Formats::). (This default can be changed; see *note SET:: for more information.) In columnar style, to use a variable format other than the default, specify the format type in parentheses after the column numbers. For instance, for alphanumeric 'A' format, use '(A)'. In addition, implied decimal places can be specified in parentheses after the column numbers. As an example, suppose that a data file has a field in which the characters '1234' should be interpreted as having the value 12.34. Then this field has two implied decimal places, and the corresponding specification would be '(2)'. If a field that has implied decimal places contains a decimal point, then the implied decimal places are not applied. Changing the variable format and adding implied decimal places can be done together; for instance, '(N,5)'. When using columnar style, the input and output width of each variable is computed from the field width. The field width must be evenly divisible into the number of variables specified. FORTRAN style is an altogether different approach to specifying field locations. With this approach, a list of variable input format specifications, separated by commas, are placed after the variable names inside parentheses. Each format specifier advances as many characters into the input line as it uses. Implied decimal places also exist in FORTRAN style. A format specification with D decimal places also has D implied decimal places. In addition to the standard format specifiers (*note Input and Output Formats::), FORTRAN style defines some extensions: 'X' Advance the current column on this line by one character position. 'T'X Set the current column on this line to column X, with column numbers considered to begin with 1 at the left margin. 'NEWREC'X Skip forward X lines in the current record, resetting the active column to the left margin. Repeat count Any format specifier may be preceded by a number. This causes the action of that format specifier to be repeated the specified number of times. (SPEC1, ..., SPECN) Group the given specifiers together. This is most useful when preceded by a repeat count. Groups may be nested arbitrarily. FORTRAN and columnar styles may be freely intermixed. Columnar style leaves the active column immediately after the ending column specified. Record motion using 'NEWREC' in FORTRAN style also applies to later FORTRAN and columnar specifiers. * Menu: * DATA LIST FIXED Examples:: Examples of DATA LIST FIXED.  File: pspp.info, Node: DATA LIST FIXED Examples, Up: DATA LIST FIXED Examples ........ 1. DATA LIST TABLE /NAME 1-10 (A) INFO1 TO INFO3 12-17 (1). BEGIN DATA. John Smith 102311 Bob Arnold 122015 Bill Yates 918 6 END DATA. Defines the following variables: * 'NAME', a 10-character-wide string variable, in columns 1 through 10. * 'INFO1', a numeric variable, in columns 12 through 13. * 'INFO2', a numeric variable, in columns 14 through 15. * 'INFO3', a numeric variable, in columns 16 through 17. The 'BEGIN DATA'/'END DATA' commands cause three cases to be defined: Case NAME INFO1 INFO2 INFO3 1 John Smith 10 23 11 2 Bob Arnold 12 20 15 3 Bill Yates 9 18 6 The 'TABLE' keyword causes PSPP to print out a table describing the four variables defined. 2. DAT LIS FIL="survey.dat" /ID 1-5 NAME 7-36 (A) SURNAME 38-67 (A) MINITIAL 69 (A) /Q01 TO Q50 7-56 /. Defines the following variables: * 'ID', a numeric variable, in columns 1-5 of the first record. * 'NAME', a 30-character string variable, in columns 7-36 of the first record. * 'SURNAME', a 30-character string variable, in columns 38-67 of the first record. * 'MINITIAL', a 1-character string variable, in column 69 of the first record. * Fifty variables 'Q01', 'Q02', 'Q03', ..., 'Q49', 'Q50', all numeric, 'Q01' in column 7, 'Q02' in column 8, ..., 'Q49' in column 55, 'Q50' in column 56, all in the second record. Cases are separated by a blank record. Data is read from file 'survey.dat' in the current directory. This example shows keywords abbreviated to their first 3 letters.  File: pspp.info, Node: DATA LIST FREE, Next: DATA LIST LIST, Prev: DATA LIST FIXED, Up: DATA LIST 8.5.2 DATA LIST FREE -------------------- DATA LIST FREE [({TAB,'C'}, ...)] [{NOTABLE,TABLE}] [FILE='FILE_NAME' [ENCODING='ENCODING']] [SKIP=RECORD_CNT] /VAR_SPEC... where each VAR_SPEC takes one of the forms VAR_LIST [(TYPE_SPEC)] VAR_LIST * In free format, the input data is, by default, structured as a series of fields separated by spaces, tabs, or line breaks. If the current 'DECIMAL' separator is 'DOT' (*note SET::), then commas are also treated as field separators. Each field's content may be unquoted, or it may be quoted with a pairs of apostrophes (''') or double quotes ('"'). Unquoted white space separates fields but is not part of any field. Any mix of spaces, tabs, and line breaks is equivalent to a single space for the purpose of separating fields, but consecutive commas will skip a field. Alternatively, delimiters can be specified explicitly, as a parenthesized, comma-separated list of single-character strings immediately following FREE. The word TAB may also be used to specify a tab character as a delimiter. When delimiters are specified explicitly, only the given characters, plus line breaks, separate fields. Furthermore, leading spaces at the beginnings of fields are not trimmed, consecutive delimiters define empty fields, and no form of quoting is allowed. The 'NOTABLE' and 'TABLE' subcommands are as in 'DATA LIST FIXED' above. 'NOTABLE' is the default. The 'FILE', 'SKIP', and 'ENCODING' subcommands are as in 'DATA LIST FIXED' above. The variables to be parsed are given as a single list of variable names. This list must be introduced by a single slash ('/'). The set of variable names may contain format specifications in parentheses (*note Input and Output Formats::). Format specifications apply to all variables back to the previous parenthesized format specification. In addition, an asterisk may be used to indicate that all variables preceding it are to have input/output format 'F8.0'. Specified field widths are ignored on input, although all normal limits on field width apply, but they are honored on output.  File: pspp.info, Node: DATA LIST LIST, Prev: DATA LIST FREE, Up: DATA LIST 8.5.3 DATA LIST LIST -------------------- DATA LIST LIST [({TAB,'C'}, ...)] [{NOTABLE,TABLE}] [FILE='FILE_NAME' [ENCODING='ENCODING']] [SKIP=RECORD_COUNT] /VAR_SPEC... where each VAR_SPEC takes one of the forms VAR_LIST [(TYPE_SPEC)] VAR_LIST * With one exception, 'DATA LIST LIST' is syntactically and semantically equivalent to 'DATA LIST FREE'. The exception is that each input line is expected to correspond to exactly one input record. If more or fewer fields are found on an input line than expected, an appropriate diagnostic is issued.  File: pspp.info, Node: END CASE, Next: END FILE, Prev: DATA LIST, Up: Data Input and Output 8.6 END CASE ============ END CASE. 'END CASE' is used only within 'INPUT PROGRAM' to output the current case. *Note INPUT PROGRAM::, for details.  File: pspp.info, Node: END FILE, Next: FILE HANDLE, Prev: END CASE, Up: Data Input and Output 8.7 END FILE ============ END FILE. 'END FILE' is used only within 'INPUT PROGRAM' to terminate the current input program. *Note INPUT PROGRAM::.  File: pspp.info, Node: FILE HANDLE, Next: INPUT PROGRAM, Prev: END FILE, Up: Data Input and Output 8.8 FILE HANDLE =============== For text files: FILE HANDLE HANDLE_NAME /NAME='FILE_NAME [/MODE=CHARACTER] [/ENDS={CR,CRLF}] /TABWIDTH=TAB_WIDTH [ENCODING='ENCODING'] For binary files in native encoding with fixed-length records: FILE HANDLE HANDLE_NAME /NAME='FILE_NAME' /MODE=IMAGE [/LRECL=REC_LEN] [ENCODING='ENCODING'] For binary files in native encoding with variable-length records: FILE HANDLE HANDLE_NAME /NAME='FILE_NAME' /MODE=BINARY [/LRECL=REC_LEN] [ENCODING='ENCODING'] For binary files encoded in EBCDIC: FILE HANDLE HANDLE_NAME /NAME='FILE_NAME' /MODE=360 /RECFORM={FIXED,VARIABLE,SPANNED} [/LRECL=REC_LEN] [ENCODING='ENCODING'] Use 'FILE HANDLE' to associate a file handle name with a file and its attributes, so that later commands can refer to the file by its handle name. Names of text files can be specified directly on commands that access files, so that 'FILE HANDLE' is only needed when a file is not an ordinary file containing lines of text. However, 'FILE HANDLE' may be used even for text files, and it may be easier to specify a file's name once and later refer to it by an abstract handle. Specify the file handle name as the identifier immediately following the 'FILE HANDLE' command name. The identifier INLINE is reserved for representing data embedded in the syntax file (*note BEGIN DATA::) The file handle name must not already have been used in a previous invocation of 'FILE HANDLE', unless it has been closed by an intervening command (*note CLOSE FILE HANDLE::). The effect and syntax of 'FILE HANDLE' depends on the selected MODE: * In CHARACTER mode, the default, the data file is read as a text file. Each text line is read as one record. In CHARACTER mode only, tabs are expanded to spaces by input programs, except by 'DATA LIST FREE' with explicitly specified delimiters. Each tab is 4 characters wide by default, but TABWIDTH (a PSPP extension) may be used to specify an alternate width. Use a TABWIDTH of 0 to suppress tab expansion. A file written in CHARACTER mode by default uses the line ends of the system on which PSPP is running, that is, on Windows, the default is CR LF line ends, and on other systems the default is LF only. Specify ENDS as CR or CRLF to override the default. PSPP reads files using either convention on any kind of system, regardless of ENDS. * In IMAGE mode, the data file is treated as a series of fixed-length binary records. LRECL should be used to specify the record length in bytes, with a default of 1024. On input, it is an error if an IMAGE file's length is not a integer multiple of the record length. On output, each record is padded with spaces or truncated, if necessary, to make it exactly the correct length. * In BINARY mode, the data file is treated as a series of variable-length binary records. LRECL may be specified, but its value is ignored. The data for each record is both preceded and followed by a 32-bit signed integer in little-endian byte order that specifies the length of the record. (This redundancy permits records in these files to be efficiently read in reverse order, although PSPP always reads them in forward order.) The length does not include either integer. * Mode 360 reads and writes files in formats first used for tapes in the 1960s on IBM mainframe operating systems and still supported today by the modern successors of those operating systems. For more information, see 'OS/400 Tape and Diskette Device Programming', available on IBM's website. Alphanumeric data in mode 360 files are encoded in EBCDIC. PSPP translates EBCDIC to or from the host's native format as necessary on input or output, using an ASCII/EBCDIC translation that is one-to-one, so that a "round trip" from ASCII to EBCDIC back to ASCII, or vice versa, always yields exactly the original data. The 'RECFORM' subcommand is required in mode 360. The precise file format depends on its setting: F FIXED This record format is equivalent to IMAGE mode, except for EBCDIC translation. IBM documentation calls this '*F' (fixed-length, deblocked) format. V VARIABLE The file comprises a sequence of zero or more variable-length blocks. Each block begins with a 4-byte "block descriptor word" (BDW). The first two bytes of the BDW are an unsigned integer in big-endian byte order that specifies the length of the block, including the BDW itself. The other two bytes of the BDW are ignored on input and written as zeros on output. Following the BDW, the remainder of each block is a sequence of one or more variable-length records, each of which in turn begins with a 4-byte "record descriptor word" (RDW) that has the same format as the BDW. Following the RDW, the remainder of each record is the record data. The maximum length of a record in VARIABLE mode is 65,527 bytes: 65,535 bytes (the maximum value of a 16-bit unsigned integer), minus 4 bytes for the BDW, minus 4 bytes for the RDW. In mode VARIABLE, LRECL specifies a maximum, not a fixed, record length, in bytes. The default is 8,192. IBM documentation calls this '*VB' (variable-length, blocked, unspanned) format. VS SPANNED The file format is like that of VARIABLE mode, except that logical records may be split among multiple physical records (called "segments") or blocks. In SPANNED mode, the third byte of each RDW is called the segment control character (SCC). Odd SCC values cause the segment to be appended to a record buffer maintained in memory; even values also append the segment and then flush its contents to the input procedure. Canonically, SCC value 0 designates a record not spanned among multiple segments, and values 1 through 3 designate the first segment, the last segment, or an intermediate segment, respectively, within a multi-segment record. The record buffer is also flushed at end of file regardless of the final record's SCC. The maximum length of a logical record in VARIABLE mode is limited only by memory available to PSPP. Segments are limited to 65,527 bytes, as in VARIABLE mode. This format is similar to what IBM documentation call '*VS' (variable-length, deblocked, spanned) format. In mode 360, fields of type A that extend beyond the end of a record read from disk are padded with spaces in the host's native character set, which are then translated from EBCDIC to the native character set. Thus, when the host's native character set is based on ASCII, these fields are effectively padded with character 'X'80''. This wart is implemented for compatibility. The 'NAME' subcommand specifies the name of the file associated with the handle. It is required in all modes but SCRATCH mode, in which its use is forbidden. The ENCODING subcommand specifies the encoding of text in the file. For reading text files in CHARACTER mode, all of the forms described for ENCODING on the INSERT command are supported (*note INSERT::). For reading in other file-based modes, encoding autodetection is not supported; if the specified encoding requests autodetection then the default encoding will be used. This is also true when a file handle is used for writing a file in any mode.  File: pspp.info, Node: INPUT PROGRAM, Next: LIST, Prev: FILE HANDLE, Up: Data Input and Output 8.9 INPUT PROGRAM ================= INPUT PROGRAM. ... input commands ... END INPUT PROGRAM. 'INPUT PROGRAM'...'END INPUT PROGRAM' specifies a complex input program. By placing data input commands within 'INPUT PROGRAM', PSPP programs can take advantage of more complex file structures than available with only 'DATA LIST'. The first sort of extended input program is to simply put multiple 'DATA LIST' commands within the 'INPUT PROGRAM'. This will cause all of the data files to be read in parallel. Input will stop when end of file is reached on any of the data files. Transformations, such as conditional and looping constructs, can also be included within 'INPUT PROGRAM'. These can be used to combine input from several data files in more complex ways. However, input will still stop when end of file is reached on any of the data files. To prevent 'INPUT PROGRAM' from terminating at the first end of file, use the 'END' subcommand on 'DATA LIST'. This subcommand takes a variable name, which should be a numeric scratch variable (*note Scratch Variables::). (It need not be a scratch variable but otherwise the results can be surprising.) The value of this variable is set to 0 when reading the data file, or 1 when end of file is encountered. Two additional commands are useful in conjunction with 'INPUT PROGRAM'. 'END CASE' is the first. Normally each loop through the 'INPUT PROGRAM' structure produces one case. 'END CASE' controls exactly when cases are output. When 'END CASE' is used, looping from the end of 'INPUT PROGRAM' to the beginning does not cause a case to be output. 'END FILE' is the second. When the 'END' subcommand is used on 'DATA LIST', there is no way for the 'INPUT PROGRAM' construct to stop looping, so an infinite loop results. 'END FILE', when executed, stops the flow of input data and passes out of the 'INPUT PROGRAM' structure. 'INPUT PROGRAM' must contain at least one 'DATA LIST' or 'END FILE' command. All this is very confusing. A few examples should help to clarify. INPUT PROGRAM. DATA LIST NOTABLE FILE='a.data'/X 1-10. DATA LIST NOTABLE FILE='b.data'/Y 1-10. END INPUT PROGRAM. LIST. The example above reads variable X from file 'a.data' and variable Y from file 'b.data'. If one file is shorter than the other then the extra data in the longer file is ignored. INPUT PROGRAM. NUMERIC #A #B. DO IF NOT #A. DATA LIST NOTABLE END=#A FILE='a.data'/X 1-10. END IF. DO IF NOT #B. DATA LIST NOTABLE END=#B FILE='b.data'/Y 1-10. END IF. DO IF #A AND #B. END FILE. END IF. END CASE. END INPUT PROGRAM. LIST. The above example reads variable X from 'a.data' and variable Y from 'b.data'. If one file is shorter than the other then the missing field is set to the system-missing value alongside the present value for the remaining length of the longer file. INPUT PROGRAM. NUMERIC #A #B. DO IF #A. DATA LIST NOTABLE END=#B FILE='b.data'/X 1-10. DO IF #B. END FILE. ELSE. END CASE. END IF. ELSE. DATA LIST NOTABLE END=#A FILE='a.data'/X 1-10. DO IF NOT #A. END CASE. END IF. END IF. END INPUT PROGRAM. LIST. The above example reads data from file 'a.data', then from 'b.data', and concatenates them into a single active dataset. INPUT PROGRAM. NUMERIC #EOF. LOOP IF NOT #EOF. DATA LIST NOTABLE END=#EOF FILE='a.data'/X 1-10. DO IF NOT #EOF. END CASE. END IF. END LOOP. COMPUTE #EOF = 0. LOOP IF NOT #EOF. DATA LIST NOTABLE END=#EOF FILE='b.data'/X 1-10. DO IF NOT #EOF. END CASE. END IF. END LOOP. END FILE. END INPUT PROGRAM. LIST. The above example does the same thing as the previous example, in a different way. INPUT PROGRAM. LOOP #I=1 TO 50. COMPUTE X=UNIFORM(10). END CASE. END LOOP. END FILE. END INPUT PROGRAM. LIST/FORMAT=NUMBERED. The above example causes an active dataset to be created consisting of 50 random variates between 0 and 10.  File: pspp.info, Node: LIST, Next: NEW FILE, Prev: INPUT PROGRAM, Up: Data Input and Output 8.10 LIST ========= LIST /VARIABLES=VAR_LIST /CASES=FROM START_INDEX TO END_INDEX BY INCR_INDEX /FORMAT={UNNUMBERED,NUMBERED} {WRAP,SINGLE} The 'LIST' procedure prints the values of specified variables to the listing file. The 'VARIABLES' subcommand specifies the variables whose values are to be printed. Keyword VARIABLES is optional. If 'VARIABLES' subcommand is not specified then all variables in the active dataset are printed. The 'CASES' subcommand can be used to specify a subset of cases to be printed. Specify 'FROM' and the case number of the first case to print, 'TO' and the case number of the last case to print, and 'BY' and the number of cases to advance between printing cases, or any subset of those settings. If 'CASES' is not specified then all cases are printed. The 'FORMAT' subcommand can be used to change the output format. 'NUMBERED' will print case numbers along with each case; 'UNNUMBERED', the default, causes the case numbers to be omitted. The 'WRAP' and 'SINGLE' settings are currently not used. Case numbers start from 1. They are counted after all transformations have been considered. 'LIST' is a procedure. It causes the data to be read.  File: pspp.info, Node: NEW FILE, Next: MATRIX DATA, Prev: LIST, Up: Data Input and Output 8.11 NEW FILE ============= NEW FILE. 'NEW FILE' command clears the dictionary and data from the current active dataset.  File: pspp.info, Node: MATRIX DATA, Next: PRINT, Prev: NEW FILE, Up: Data Input and Output 8.12 MATRIX DATA ================ MATRIX DATA VARIABLES = COLUMNS [FILE='FILE_NAME'| INLINE } [/FORMAT= [{LIST | FREE}] [{UPPER | LOWER | FULL}] [{DIAGONAL | NODIAGONAL}]] [/N= N] [/SPLIT= SPLIT_VARIABLES]. The 'MATRIX DATA' command is used to input data in the form of matrices which can subsequently be used by other commands. If the 'FILE' is omitted or takes the value 'INLINE' then the command should immediately followed by 'BEGIN DATA' (*note BEGIN DATA::). There is one mandatory subcommand, viz: 'VARIABLES', which defines the COLUMNS of the matrix. Normally, the COLUMNS should include an item called 'ROWTYPE_'. The 'ROWTYPE_' column is used to specify the purpose of a row in the matrix. matrix data variables = rowtype_ var01 TO var08. begin data. mean 24.3 5.4 69.7 20.1 13.4 2.7 27.9 3.7 sd 5.7 1.5 23.5 5.8 2.8 4.5 5.4 1.5 n 92 92 92 92 92 92 92 92 corr 1.00 corr .18 1.00 corr -.22 -.17 1.00 corr .36 .31 -.14 1.00 corr .27 .16 -.12 .22 1.00 corr .33 .15 -.17 .24 .21 1.00 corr .50 .29 -.20 .32 .12 .38 1.00 corr .17 .29 -.05 .20 .27 .20 .04 1.00 end data. In the above example, the first three rows have ROWTYPE_ values of 'mean', 'sd', and 'n'. These indicate that the rows contain mean values, standard deviations and counts, respectively. All subsequent rows have a ROWTYPE_ of 'corr' which indicates that the values are correlation coefficients. Note that in this example, the upper right values of the 'corr' values are blank, and in each case, the rightmost value is unity. This is because, the 'FORMAT' subcommand defaults to 'LOWER DIAGONAL', which indicates that only the lower triangle is provided in the data. The opposite triangle is automatically inferred. One could instead specify the upper triangle as follows: matrix data variables = rowtype_ var01 TO var08 /format = upper nodiagonal. begin data. mean 24.3 5.4 69.7 20.1 13.4 2.7 27.9 3.7 sd 5.7 1.5 23.5 5.8 2.8 4.5 5.4 1.5 n 92 92 92 92 92 92 92 92 corr .17 .50 -.33 .27 .36 -.22 .18 corr .29 .29 -.20 .32 .12 .38 corr .05 .20 -.15 .16 .21 corr .20 .32 -.17 .12 corr .27 .12 -.24 corr -.20 -.38 corr .04 end data. In this example the 'NODIAGONAL' keyword is used. Accordingly the diagonal values of the matrix are omitted. This implies that there is one less 'corr' line than there are variables. If the 'FULL' option is passed to the 'FORMAT' subcommand, then all the matrix elements must be provided, including the diagonal elements. In the preceding examples, each matrix row has been specified on a single line. If you pass the keyword FREE to 'FORMAT' then the data may be data for several matrix rows may be specified on the same line, or a single row may be split across lines. The 'N' subcommand may be used to specify the number of valid cases for each variable. It should not be used if the data contains a record whose ROWTYPE_ column is 'N' or 'N_VECTOR'. It implies a 'N' record whose values are all N. That is to say, matrix data variables = rowtype_ var01 TO var04 /format = upper nodiagonal /n = 99. begin data mean 34 35 36 37 sd 22 11 55 66 corr 9 8 7 corr 6 5 corr 4 end data. produces an effect identical to matrix data variables = rowtype_ var01 TO var04 /format = upper nodiagonal begin data n 99 99 99 99 mean 34 35 36 37 sd 22 11 55 66 corr 9 8 7 corr 6 5 corr 4 end data. The 'SPLIT' is used to indicate that variables are to be considered as split variables. For example, the following defines two matrices using the variable 'S1' to distinguish between them. matrix data variables = s1 rowtype_ var01 TO var04 /split = s1 /format = full diagonal. begin data 0 mean 34 35 36 37 0 sd 22 11 55 66 0 n 99 98 99 92 0 corr 1 9 8 7 0 corr 9 1 6 5 0 corr 8 6 1 4 0 corr 7 5 4 1 1 mean 44 45 34 39 1 sd 23 15 51 46 1 n 98 34 87 23 1 corr 1 2 3 4 1 corr 2 1 5 6 1 corr 3 5 1 7 1 corr 4 6 7 1 end data.  File: pspp.info, Node: PRINT, Next: PRINT EJECT, Prev: MATRIX DATA, Up: Data Input and Output 8.13 PRINT ========== PRINT [OUTFILE='FILE_NAME'] [RECORDS=N_LINES] [{NOTABLE,TABLE}] [ENCODING='ENCODING'] [/[LINE_NO] ARG...] ARG takes one of the following forms: 'STRING' [START] VAR_LIST START-END [TYPE_SPEC] VAR_LIST (FORTRAN_SPEC) VAR_LIST * The 'PRINT' transformation writes variable data to the listing file or an output file. 'PRINT' is executed when a procedure causes the data to be read. Follow 'PRINT' by 'EXECUTE' to print variable data without invoking a procedure (*note EXECUTE::). All 'PRINT' subcommands are optional. If no strings or variables are specified, 'PRINT' outputs a single blank line. The 'OUTFILE' subcommand specifies the file to receive the output. The file may be a file name as a string or a file handle (*note File Handles::). If 'OUTFILE' is not present then output will be sent to PSPP's output listing file. When 'OUTFILE' is present, the output is written to FILE_NAME in a plain text format, with a space inserted at beginning of each output line, even lines that otherwise would be blank. The 'ENCODING' subcommand may only be used if the 'OUTFILE' subcommand is also used. It specifies the character encoding of the file. *Note INSERT::, for information on supported encodings. The 'RECORDS' subcommand specifies the number of lines to be output. The number of lines may optionally be surrounded by parentheses. 'TABLE' will cause the 'PRINT' command to output a table to the listing file that describes what it will print to the output file. 'NOTABLE', the default, suppresses this output table. Introduce the strings and variables to be printed with a slash ('/'). Optionally, the slash may be followed by a number indicating which output line will be specified. In the absence of this line number, the next line number will be specified. Multiple lines may be specified using multiple slashes with the intended output for a line following its respective slash. Literal strings may be printed. Specify the string itself. Optionally the string may be followed by a column number, specifying the column on the line where the string should start. Otherwise, the string will be printed at the current position on the line. Variables to be printed can be specified in the same ways as available for 'DATA LIST FIXED' (*note DATA LIST FIXED::). In addition, a variable list may be followed by an asterisk ('*'), which indicates that the variables should be printed in their dictionary print formats, separated by spaces. A variable list followed by a slash or the end of command will be interpreted the same way. If a FORTRAN type specification is used to move backwards on the current line, then text is written at that point on the line, the line will be truncated to that length, although additional text being added will again extend the line to that length.  File: pspp.info, Node: PRINT EJECT, Next: PRINT SPACE, Prev: PRINT, Up: Data Input and Output 8.14 PRINT EJECT ================ PRINT EJECT OUTFILE='FILE_NAME' RECORDS=N_LINES {NOTABLE,TABLE} /[LINE_NO] ARG... ARG takes one of the following forms: 'STRING' [START-END] VAR_LIST START-END [TYPE_SPEC] VAR_LIST (FORTRAN_SPEC) VAR_LIST * 'PRINT EJECT' advances to the beginning of a new output page in the listing file or output file. It can also output data in the same way as 'PRINT'. All 'PRINT EJECT' subcommands are optional. Without 'OUTFILE', 'PRINT EJECT' ejects the current page in the listing file, then it produces other output, if any is specified. With 'OUTFILE', 'PRINT EJECT' writes its output to the specified file. The first line of output is written with '1' inserted in the first column. Commonly, this is the only line of output. If additional lines of output are specified, these additional lines are written with a space inserted in the first column, as with 'PRINT'. *Note PRINT::, for more information on syntax and usage.  File: pspp.info, Node: PRINT SPACE, Next: REREAD, Prev: PRINT EJECT, Up: Data Input and Output 8.15 PRINT SPACE ================ PRINT SPACE [OUTFILE='file_name'] [ENCODING='ENCODING'] [n_lines]. 'PRINT SPACE' prints one or more blank lines to an output file. The 'OUTFILE' subcommand is optional. It may be used to direct output to a file specified by file name as a string or file handle (*note File Handles::). If OUTFILE is not specified then output will be directed to the listing file. The 'ENCODING' subcommand may only be used if 'OUTFILE' is also used. It specifies the character encoding of the file. *Note INSERT::, for information on supported encodings. n_lines is also optional. If present, it is an expression (*note Expressions::) specifying the number of blank lines to be printed. The expression must evaluate to a nonnegative value.  File: pspp.info, Node: REREAD, Next: REPEATING DATA, Prev: PRINT SPACE, Up: Data Input and Output 8.16 REREAD =========== REREAD [FILE=handle] [COLUMN=column] [ENCODING='ENCODING']. The 'REREAD' transformation allows the previous input line in a data file already processed by 'DATA LIST' or another input command to be re-read for further processing. The 'FILE' subcommand, which is optional, is used to specify the file to have its line re-read. The file must be specified as the name of a file handle (*note File Handles::). If FILE is not specified then the last file specified on 'DATA LIST' will be assumed (last file specified lexically, not in terms of flow-of-control). By default, the line re-read is re-read in its entirety. With the 'COLUMN' subcommand, a prefix of the line can be exempted from re-reading. Specify an expression (*note Expressions::) evaluating to the first column that should be included in the re-read line. Columns are numbered from 1 at the left margin. The 'ENCODING' subcommand may only be used if the 'FILE' subcommand is also used. It specifies the character encoding of the file. *Note INSERT::, for information on supported encodings. Issuing 'REREAD' multiple times will not back up in the data file. Instead, it will re-read the same line multiple times.  File: pspp.info, Node: REPEATING DATA, Next: WRITE, Prev: REREAD, Up: Data Input and Output 8.17 REPEATING DATA =================== REPEATING DATA /STARTS=START-END /OCCURS=N_OCCURS /FILE='FILE_NAME' /LENGTH=LENGTH /CONTINUED[=CONT_START-CONT_END] /ID=ID_START-ID_END=ID_VAR /{TABLE,NOTABLE} /DATA=VAR_SPEC... where each VAR_SPEC takes one of the forms VAR_LIST START-END [TYPE_SPEC] VAR_LIST (FORTRAN_SPEC) 'REPEATING DATA' parses groups of data repeating in a uniform format, possibly with several groups on a single line. Each group of data corresponds with one case. 'REPEATING DATA' may only be used within an 'INPUT PROGRAM' structure (*note INPUT PROGRAM::). When used with 'DATA LIST', it can be used to parse groups of cases that share a subset of variables but differ in their other data. The 'STARTS' subcommand is required. Specify a range of columns, using literal numbers or numeric variable names. This range specifies the columns on the first line that are used to contain groups of data. The ending column is optional. If it is not specified, then the record width of the input file is used. For the inline file (*note BEGIN DATA::) this is 80 columns; for a file with fixed record widths it is the record width; for other files it is 1024 characters by default. The 'OCCURS' subcommand is required. It must be a number or the name of a numeric variable. Its value is the number of groups present in the current record. The 'DATA' subcommand is required. It must be the last subcommand specified. It is used to specify the data present within each repeating group. Column numbers are specified relative to the beginning of a group at column 1. Data is specified in the same way as with 'DATA LIST FIXED' (*note DATA LIST FIXED::). All other subcommands are optional. FILE specifies the file to read, either a file name as a string or a file handle (*note File Handles::). If FILE is not present then the default is the last file handle used on 'DATA LIST' (lexically, not in terms of flow of control). By default 'REPEATING DATA' will output a table describing how it will parse the input data. Specifying 'NOTABLE' will disable this behavior; specifying TABLE will explicitly enable it. The 'LENGTH' subcommand specifies the length in characters of each group. If it is not present then length is inferred from the 'DATA' subcommand. LENGTH can be a number or a variable name. Normally all the data groups are expected to be present on a single line. Use the 'CONTINUED' command to indicate that data can be continued onto additional lines. If data on continuation lines starts at the left margin and continues through the entire field width, no column specifications are necessary on 'CONTINUED'. Otherwise, specify the possible range of columns in the same way as on STARTS. When data groups are continued from line to line, it is easy for cases to get out of sync through careless hand editing. The 'ID' subcommand allows a case identifier to be present on each line of repeating data groups. 'REPEATING DATA' will check for the same identifier on each line and report mismatches. Specify the range of columns that the identifier will occupy, followed by an equals sign ('=') and the identifier variable name. The variable must already have been declared with 'NUMERIC' or another command. 'REPEATING DATA' should be the last command given within an 'INPUT PROGRAM'. It should not be enclosed within a 'LOOP' structure (*note LOOP::). Use 'DATA LIST' before, not after, 'REPEATING DATA'.  File: pspp.info, Node: WRITE, Prev: REPEATING DATA, Up: Data Input and Output 8.18 WRITE ========== WRITE OUTFILE='FILE_NAME' RECORDS=N_LINES {NOTABLE,TABLE} /[LINE_NO] ARG... ARG takes one of the following forms: 'STRING' [START-END] VAR_LIST START-END [TYPE_SPEC] VAR_LIST (FORTRAN_SPEC) VAR_LIST * 'WRITE' writes text or binary data to an output file. *Note PRINT::, for more information on syntax and usage. 'PRINT' and 'WRITE' differ in only a few ways: * 'WRITE' uses write formats by default, whereas 'PRINT' uses print formats. * 'PRINT' inserts a space between variables unless a format is explicitly specified, but 'WRITE' never inserts space between variables in output. * 'PRINT' inserts a space at the beginning of each line that it writes to an output file (and 'PRINT EJECT' inserts '1' at the beginning of each line that should begin a new page), but 'WRITE' does not. * 'PRINT' outputs the system-missing value according to its specified output format, whereas 'WRITE' outputs the system-missing value as a field filled with spaces. Binary formats are an exception.  File: pspp.info, Node: System and Portable File IO, Next: Combining Data Files, Prev: Data Input and Output, Up: Top 9 System and Portable File I/O ****************************** The commands in this chapter read, write, and examine system files and portable files. * Menu: * APPLY DICTIONARY:: Apply system file dictionary to active dataset. * EXPORT:: Write to a portable file. * GET:: Read from a system file. * GET DATA:: Read from foreign files. * IMPORT:: Read from a portable file. * SAVE:: Write to a system file. * SAVE DATA COLLECTION:: Write to a system file and metadata file. * SAVE TRANSLATE:: Write data in foreign file formats. * SYSFILE INFO:: Display system file dictionary. * XEXPORT:: Write to a portable file, as a transformation. * XSAVE:: Write to a system file, as a transformation.  File: pspp.info, Node: APPLY DICTIONARY, Next: EXPORT, Up: System and Portable File IO 9.1 APPLY DICTIONARY ==================== APPLY DICTIONARY FROM={'FILE_NAME',FILE_HANDLE}. 'APPLY DICTIONARY' applies the variable labels, value labels, and missing values taken from a file to corresponding variables in the active dataset. In some cases it also updates the weighting variable. Specify a system file or portable file's name, a data set name (*note Datasets::), or a file handle name (*note File Handles::). The dictionary in the file will be read, but it will not replace the active dataset's dictionary. The file's data will not be read. Only variables with names that exist in both the active dataset and the system file are considered. Variables with the same name but different types (numeric, string) will cause an error message. Otherwise, the system file variables' attributes will replace those in their matching active dataset variables: * If a system file variable has a variable label, then it will replace the variable label of the active dataset variable. If the system file variable does not have a variable label, then the active dataset variable's variable label, if any, will be retained. * If the system file variable has custom attributes (*note VARIABLE ATTRIBUTE::), then those attributes replace the active dataset variable's custom attributes. If the system file variable does not have custom attributes, then the active dataset variable's custom attributes, if any, will be retained. * If the active dataset variable is numeric or short string, then value labels and missing values, if any, will be copied to the active dataset variable. If the system file variable does not have value labels or missing values, then those in the active dataset variable, if any, will not be disturbed. In addition to properties of variables, some properties of the active file dictionary as a whole are updated: * If the system file has custom attributes (*note DATAFILE ATTRIBUTE::), then those attributes replace the active dataset variable's custom attributes. * If the active dataset has a weighting variable (*note WEIGHT::), and the system file does not, or if the weighting variable in the system file does not exist in the active dataset, then the active dataset weighting variable, if any, is retained. Otherwise, the weighting variable in the system file becomes the active dataset weighting variable. 'APPLY DICTIONARY' takes effect immediately. It does not read the active dataset. The system file is not modified.  File: pspp.info, Node: EXPORT, Next: GET, Prev: APPLY DICTIONARY, Up: System and Portable File IO 9.2 EXPORT ========== EXPORT /OUTFILE='FILE_NAME' /UNSELECTED={RETAIN,DELETE} /DIGITS=N /DROP=VAR_LIST /KEEP=VAR_LIST /RENAME=(SRC_NAMES=TARGET_NAMES)... /TYPE={COMM,TAPE} /MAP The 'EXPORT' procedure writes the active dataset's dictionary and data to a specified portable file. By default, cases excluded with FILTER are written to the file. These can be excluded by specifying DELETE on the 'UNSELECTED' subcommand. Specifying RETAIN makes the default explicit. Portable files express real numbers in base 30. Integers are always expressed to the maximum precision needed to make them exact. Non-integers are, by default, expressed to the machine's maximum natural precision (approximately 15 decimal digits on many machines). If many numbers require this many digits, the portable file may significantly increase in size. As an alternative, the 'DIGITS' subcommand may be used to specify the number of decimal digits of precision to write. 'DIGITS' applies only to non-integers. The 'OUTFILE' subcommand, which is the only required subcommand, specifies the portable file to be written as a file name string or a file handle (*note File Handles::). 'DROP', 'KEEP', and 'RENAME' follow the same format as the 'SAVE' procedure (*note SAVE::). The 'TYPE' subcommand specifies the character set for use in the portable file. Its value is currently not used. The 'MAP' subcommand is currently ignored. 'EXPORT' is a procedure. It causes the active dataset to be read.  File: pspp.info, Node: GET, Next: GET DATA, Prev: EXPORT, Up: System and Portable File IO 9.3 GET ======= GET /FILE={'FILE_NAME',FILE_HANDLE} /DROP=VAR_LIST /KEEP=VAR_LIST /RENAME=(SRC_NAMES=TARGET_NAMES)... /ENCODING='ENCODING' 'GET' clears the current dictionary and active dataset and replaces them with the dictionary and data from a specified file. The 'FILE' subcommand is the only required subcommand. Specify the SPSS system file, SPSS/PC+ system file, or SPSS portable file to be read as a string file name or a file handle (*note File Handles::). By default, all the variables in a file are read. The DROP subcommand can be used to specify a list of variables that are not to be read. By contrast, the 'KEEP' subcommand can be used to specify variable that are to be read, with all other variables not read. Normally variables in a file retain the names that they were saved under. Use the 'RENAME' subcommand to change these names. Specify, within parentheses, a list of variable names followed by an equals sign ('=') and the names that they should be renamed to. Multiple parenthesized groups of variable names can be included on a single 'RENAME' subcommand. Variables' names may be swapped using a 'RENAME' subcommand of the form '/RENAME=(A B=B A)'. Alternate syntax for the 'RENAME' subcommand allows the parentheses to be eliminated. When this is done, only a single variable may be renamed at once. For instance, '/RENAME=A=B'. This alternate syntax is deprecated. 'DROP', 'KEEP', and 'RENAME' are executed in left-to-right order. Each may be present any number of times. 'GET' never modifies a file on disk. Only the active dataset read from the file is affected by these subcommands. PSPP automatically detects the encoding of string data in the file, when possible. The character encoding of old SPSS system files cannot always be guessed correctly, and SPSS/PC+ system files do not include any indication of their encoding. Specify the 'ENCODING' subcommand with an IANA character set name as its string argument to override the default. Use 'SYSFILE INFO' to analyze the encodings that might be valid for a system file. The 'ENCODING' subcommand is a PSPP extension. 'GET' does not cause the data to be read, only the dictionary. The data is read later, when a procedure is executed. Use of 'GET' to read a portable file is a PSPP extension.  File: pspp.info, Node: GET DATA, Next: IMPORT, Prev: GET, Up: System and Portable File IO 9.4 GET DATA ============ GET DATA /TYPE={GNM,ODS,PSQL,TXT} ...additional subcommands depending on TYPE... The 'GET DATA' command is used to read files and other data sources created by other applications. When this command is executed, the current dictionary and active dataset are replaced with variables and data read from the specified source. The 'TYPE' subcommand is mandatory and must be the first subcommand specified. It determines the type of the file or source to read. PSPP currently supports the following file types: GNM Spreadsheet files created by Gnumeric (). ODS Spreadsheet files in OpenDocument format (). PSQL Relations from PostgreSQL databases (). TXT Textual data files in columnar and delimited formats. Each supported file type has additional subcommands, explained in separate sections below. * Menu: * GET DATA /TYPE=GNM/ODS:: Spreadsheets * GET DATA /TYPE=PSQL:: Databases * GET DATA /TYPE=TXT:: Delimited Text Files  File: pspp.info, Node: GET DATA /TYPE=GNM/ODS, Next: GET DATA /TYPE=PSQL, Up: GET DATA 9.4.1 Spreadsheet Files ----------------------- GET DATA /TYPE={GNM, ODS} /FILE={'FILE_NAME'} /SHEET={NAME 'SHEET_NAME', INDEX N} /CELLRANGE={RANGE 'RANGE', FULL} /READNAMES={ON, OFF} /ASSUMEDSTRWIDTH=N. Gnumeric spreadsheets (), and spreadsheets in OpenDocument format () can be read using the 'GET DATA' command. Use the 'TYPE' subcommand to indicate the file's format. /TYPE=GNM indicates Gnumeric files, /TYPE=ODS indicates OpenDocument. The 'FILE' subcommand is mandatory. Use it to specify the name file to be read. All other subcommands are optional. The format of each variable is determined by the format of the spreadsheet cell containing the first datum for the variable. If this cell is of string (text) format, then the width of the variable is determined from the length of the string it contains, unless the 'ASSUMEDSTRWIDTH' subcommand is given. The 'SHEET' subcommand specifies the sheet within the spreadsheet file to read. There are two forms of the 'SHEET' subcommand. In the first form, '/SHEET=name SHEET_NAME', the string SHEET_NAME is the name of the sheet to read. In the second form, '/SHEET=index IDX', IDX is a integer which is the index of the sheet to read. The first sheet has the index 1. If the 'SHEET' subcommand is omitted, then the command will read the first sheet in the file. The 'CELLRANGE' subcommand specifies the range of cells within the sheet to read. If the subcommand is given as '/CELLRANGE=FULL', then the entire sheet is read. To read only part of a sheet, use the form '/CELLRANGE=range 'TOP_LEFT_CELL:BOTTOM_RIGHT_CELL''. For example, the subcommand '/CELLRANGE=range 'C3:P19'' reads columns C-P, and rows 3-19 inclusive. If no 'CELLRANGE' subcommand is given, then the entire sheet is read. If '/READNAMES=ON' is specified, then the contents of cells of the first row are used as the names of the variables in which to store the data from subsequent rows. This is the default. If '/READNAMES=OFF' is used, then the variables receive automatically assigned names. The 'ASSUMEDSTRWIDTH' subcommand specifies the maximum width of string variables read from the file. If omitted, the default value is determined from the length of the string in the first spreadsheet cell for each variable.  File: pspp.info, Node: GET DATA /TYPE=PSQL, Next: GET DATA /TYPE=TXT, Prev: GET DATA /TYPE=GNM/ODS, Up: GET DATA 9.4.2 Postgres Database Queries ------------------------------- GET DATA /TYPE=PSQL /CONNECT={CONNECTION INFO} /SQL={QUERY} [/ASSUMEDSTRWIDTH=W] [/UNENCRYPTED] [/BSIZE=N]. The PSQL type is used to import data from a postgres database server. The server may be located locally or remotely. Variables are automatically created based on the table column names or the names specified in the SQL query. Postgres data types of high precision, will loose precision when imported into PSPP. Not all the postgres data types are able to be represented in PSPP. If a datum cannot be represented a warning will be issued and that datum will be set to SYSMIS. The 'CONNECT' subcommand is mandatory. It is a string specifying the parameters of the database server from which the data should be fetched. The format of the string is given in the postgres manual . The 'SQL' subcommand is mandatory. It must be a valid SQL string to retrieve data from the database. The 'ASSUMEDSTRWIDTH' subcommand specifies the maximum width of string variables read from the database. If omitted, the default value is determined from the length of the string in the first value read for each variable. The 'UNENCRYPTED' subcommand allows data to be retrieved over an insecure connection. If the connection is not encrypted, and the 'UNENCRYPTED' subcommand is not given, then an error will occur. Whether or not the connection is encrypted depends upon the underlying psql library and the capabilities of the database server. The 'BSIZE' subcommand serves only to optimise the speed of data transfer. It specifies an upper limit on number of cases to fetch from the database at once. The default value is 4096. If your SQL statement fetches a large number of cases but only a small number of variables, then the data transfer may be faster if you increase this value. Conversely, if the number of variables is large, or if the machine on which PSPP is running has only a small amount of memory, then a smaller value will be better. The following syntax is an example: GET DATA /TYPE=PSQL /CONNECT='host=example.com port=5432 dbname=product user=fred passwd=xxxx' /SQL='select * from manufacturer'.  File: pspp.info, Node: GET DATA /TYPE=TXT, Prev: GET DATA /TYPE=PSQL, Up: GET DATA 9.4.3 Textual Data Files ------------------------ GET DATA /TYPE=TXT /FILE={'FILE_NAME',FILE_HANDLE} [ENCODING='ENCODING'] [/ARRANGEMENT={DELIMITED,FIXED}] [/FIRSTCASE={FIRST_CASE}] [/IMPORTCASES=...] ...additional subcommands depending on ARRANGEMENT... When TYPE=TXT is specified, GET DATA reads data in a delimited or fixed columnar format, much like DATA LIST (*note DATA LIST::). The 'FILE' subcommand is mandatory. Specify the file to be read as a string file name or (for textual data only) a file handle (*note File Handles::). The 'ENCODING' subcommand specifies the character encoding of the file to be read. *Note INSERT::, for information on supported encodings. The 'ARRANGEMENT' subcommand determines the file's basic format. DELIMITED, the default setting, specifies that fields in the input data are separated by spaces, tabs, or other user-specified delimiters. FIXED specifies that fields in the input data appear at particular fixed column positions within records of a case. By default, cases are read from the input file starting from the first line. To skip lines at the beginning of an input file, set 'FIRSTCASE' to the number of the first line to read: 2 to skip the first line, 3 to skip the first two lines, and so on. 'IMPORTCASES' is ignored, for compatibility. Use 'N OF CASES' to limit the number of cases read from a file (*note N OF CASES::), or 'SAMPLE' to obtain a random sample of cases (*note SAMPLE::). The remaining subcommands apply only to one of the two file arrangements, described below. * Menu: * GET DATA /TYPE=TXT /ARRANGEMENT=DELIMITED:: * GET DATA /TYPE=TXT /ARRANGEMENT=FIXED::  File: pspp.info, Node: GET DATA /TYPE=TXT /ARRANGEMENT=DELIMITED, Next: GET DATA /TYPE=TXT /ARRANGEMENT=FIXED, Up: GET DATA /TYPE=TXT 9.4.3.1 Reading Delimited Data .............................. GET DATA /TYPE=TXT /FILE={'FILE_NAME',FILE_HANDLE} [/ARRANGEMENT={DELIMITED,FIXED}] [/FIRSTCASE={FIRST_CASE}] [/IMPORTCASE={ALL,FIRST MAX_CASES,PERCENT PERCENT}] /DELIMITERS="DELIMITERS" [/QUALIFIER="QUOTES" [/DELCASE={LINE,VARIABLES N_VARIABLES}] /VARIABLES=DEL_VAR1 [DEL_VAR2]... where each DEL_VAR takes the form: variable format The GET DATA command with TYPE=TXT and ARRANGEMENT=DELIMITED reads input data from text files in delimited format, where fields are separated by a set of user-specified delimiters. Its capabilities are similar to those of DATA LIST FREE (*note DATA LIST FREE::), with a few enhancements. The required 'FILE' subcommand and optional 'FIRSTCASE' and 'IMPORTCASE' subcommands are described above (*note GET DATA /TYPE=TXT::). 'DELIMITERS', which is required, specifies the set of characters that may separate fields. Each character in the string specified on 'DELIMITERS' separates one field from the next. The end of a line also separates fields, regardless of 'DELIMITERS'. Two consecutive delimiters in the input yield an empty field, as does a delimiter at the end of a line. A space character as a delimiter is an exception: consecutive spaces do not yield an empty field and neither does any number of spaces at the end of a line. To use a tab as a delimiter, specify '\t' at the beginning of the 'DELIMITERS' string. To use a backslash as a delimiter, specify '\\' as the first delimiter or, if a tab should also be a delimiter, immediately following '\t'. To read a data file in which each field appears on a separate line, specify the empty string for 'DELIMITERS'. The optional 'QUALIFIER' subcommand names one or more characters that can be used to quote values within fields in the input. A field that begins with one of the specified quote characters ends at the next matching quote. Intervening delimiters become part of the field, instead of terminating it. The ability to specify more than one quote character is a PSPP extension. The character specified on 'QUALIFIER' can be embedded within a field that it quotes by doubling the qualifier. For example, if ''' is specified on 'QUALIFIER', then ''a''b'' specifies a field that contains 'a'b'. The 'DELCASE' subcommand controls how data may be broken across lines in the data file. With LINE, the default setting, each line must contain all the data for exactly one case. For additional flexibility, to allow a single case to be split among lines or multiple cases to be contained on a single line, specify VARIABLES n_variables, where n_variables is the number of variables per case. The 'VARIABLES' subcommand is required and must be the last subcommand. Specify the name of each variable and its input format (*note Input and Output Formats::) in the order they should be read from the input file. Examples ........ On a Unix-like system, the '/etc/passwd' file has a format similar to this: root:$1$nyeSP5gD$pDq/:0:0:,,,:/root:/bin/bash blp:$1$BrP/pFg4$g7OG:1000:1000:Ben Pfaff,,,:/home/blp:/bin/bash john:$1$JBuq/Fioq$g4A:1001:1001:John Darrington,,,:/home/john:/bin/bash jhs:$1$D3li4hPL$88X1:1002:1002:Jason Stover,,,:/home/jhs:/bin/csh The following syntax reads a file in the format used by '/etc/passwd': GET DATA /TYPE=TXT /FILE='/etc/passwd' /DELIMITERS=':' /VARIABLES=username A20 password A40 uid F10 gid F10 gecos A40 home A40 shell A40. Consider the following data on used cars: model year mileage price type age Civic 2002 29883 15900 Si 2 Civic 2003 13415 15900 EX 1 Civic 1992 107000 3800 n/a 12 Accord 2002 26613 17900 EX 1 The following syntax can be used to read the used car data: GET DATA /TYPE=TXT /FILE='cars.data' /DELIMITERS=' ' /FIRSTCASE=2 /VARIABLES=model A8 year F4 mileage F6 price F5 type A4 age F2. Consider the following information on animals in a pet store: 'Pet''s Name', "Age", "Color", "Date Received", "Price", "Height", "Type" , (Years), , , (Dollars), , "Rover", 4.5, Brown, "12 Feb 2004", 80, '1''4"', "Dog" "Charlie", , Gold, "5 Apr 2007", 12.3, "3""", "Fish" "Molly", 2, Black, "12 Dec 2006", 25, '5"', "Cat" "Gilly", , White, "10 Apr 2007", 10, "3""", "Guinea Pig" The following syntax can be used to read the pet store data: GET DATA /TYPE=TXT /FILE='pets.data' /DELIMITERS=', ' /QUALIFIER='''"' /ESCAPE /FIRSTCASE=3 /VARIABLES=name A10 age F3.1 color A5 received EDATE10 price F5.2 height a5 type a10.  File: pspp.info, Node: GET DATA /TYPE=TXT /ARRANGEMENT=FIXED, Prev: GET DATA /TYPE=TXT /ARRANGEMENT=DELIMITED, Up: GET DATA /TYPE=TXT 9.4.3.2 Reading Fixed Columnar Data ................................... GET DATA /TYPE=TXT /FILE={'file_name',FILE_HANDLE} [/ARRANGEMENT={DELIMITED,FIXED}] [/FIRSTCASE={FIRST_CASE}] [/IMPORTCASE={ALL,FIRST MAX_CASES,PERCENT PERCENT}] [/FIXCASE=N] /VARIABLES FIXED_VAR [FIXED_VAR]... [/rec# FIXED_VAR [FIXED_VAR]...]... where each FIXED_VAR takes the form: VARIABLE START-END FORMAT The 'GET DATA' command with TYPE=TXT and ARRANGEMENT=FIXED reads input data from text files in fixed format, where each field is located in particular fixed column positions within records of a case. Its capabilities are similar to those of DATA LIST FIXED (*note DATA LIST FIXED::), with a few enhancements. The required 'FILE' subcommand and optional 'FIRSTCASE' and 'IMPORTCASE' subcommands are described above (*note GET DATA /TYPE=TXT::). The optional 'FIXCASE' subcommand may be used to specify the positive integer number of input lines that make up each case. The default value is 1. The 'VARIABLES' subcommand, which is required, specifies the positions at which each variable can be found. For each variable, specify its name, followed by its start and end column separated by '-' (e.g. '0-9'), followed by an input format type (e.g. 'F') or a full format specification (e.g. 'DOLLAR12.2'). For this command, columns are numbered starting from 0 at the left column. Introduce the variables in the second and later lines of a case by a slash followed by the number of the line within the case, e.g. '/2' for the second line. Examples ........ Consider the following data on used cars: model year mileage price type age Civic 2002 29883 15900 Si 2 Civic 2003 13415 15900 EX 1 Civic 1992 107000 3800 n/a 12 Accord 2002 26613 17900 EX 1 The following syntax can be used to read the used car data: GET DATA /TYPE=TXT /FILE='cars.data' /ARRANGEMENT=FIXED /FIRSTCASE=2 /VARIABLES=model 0-7 A year 8-15 F mileage 16-23 F price 24-31 F type 32-40 A age 40-47 F.  File: pspp.info, Node: IMPORT, Next: SAVE, Prev: GET DATA, Up: System and Portable File IO 9.5 IMPORT ========== IMPORT /FILE='FILE_NAME' /TYPE={COMM,TAPE} /DROP=VAR_LIST /KEEP=VAR_LIST /RENAME=(SRC_NAMES=TARGET_NAMES)... The 'IMPORT' transformation clears the active dataset dictionary and data and replaces them with a dictionary and data from a system file or portable file. The 'FILE' subcommand, which is the only required subcommand, specifies the portable file to be read as a file name string or a file handle (*note File Handles::). The 'TYPE' subcommand is currently not used. 'DROP', 'KEEP', and 'RENAME' follow the syntax used by 'GET' (*note GET::). 'IMPORT' does not cause the data to be read; only the dictionary. The data is read later, when a procedure is executed. Use of 'IMPORT' to read a system file is a PSPP extension.  File: pspp.info, Node: SAVE, Next: SAVE DATA COLLECTION, Prev: IMPORT, Up: System and Portable File IO 9.6 SAVE ======== SAVE /OUTFILE={'FILE_NAME',FILE_HANDLE} /UNSELECTED={RETAIN,DELETE} /{UNCOMPRESSED,COMPRESSED,ZCOMPRESSED} /PERMISSIONS={WRITEABLE,READONLY} /DROP=VAR_LIST /KEEP=VAR_LIST /VERSION=VERSION /RENAME=(SRC_NAMES=TARGET_NAMES)... /NAMES /MAP The 'SAVE' procedure causes the dictionary and data in the active dataset to be written to a system file. OUTFILE is the only required subcommand. Specify the system file to be written as a string file name or a file handle (*note File Handles::). By default, cases excluded with FILTER are written to the system file. These can be excluded by specifying 'DELETE' on the 'UNSELECTED' subcommand. Specifying 'RETAIN' makes the default explicit. The 'UNCOMPRESSED', 'COMPRESSED', and 'ZCOMPRESSED' subcommand determine the system file's compression level: 'UNCOMPRESSED' Data is not compressed. Each numeric value uses 8 bytes of disk space. Each string value uses one byte per column width, rounded up to a multiple of 8 bytes. 'COMPRESSED' Data is compressed with a simple algorithm. Each integer numeric value between -99 and 151, inclusive, or system missing value uses one byte of disk space. Each 8-byte segment of a string that consists only of spaces uses 1 byte. Any other numeric value or 8-byte string segment uses 9 bytes of disk space. 'ZCOMPRESSED' Data is compressed with the "deflate" compression algorithm specified in RFC 1951 (the same algorithm used by 'gzip'). Files written with this compression level cannot be read by PSPP 0.8.1 or earlier or by SPSS 20 or earlier. 'COMPRESSED' is the default compression level. The SET command (*note SET::) can change this default. The 'PERMISSIONS' subcommand specifies permissions for the new system file. WRITEABLE, the default, creates the file with read and write permission. READONLY creates the file for read-only access. By default, all the variables in the active dataset dictionary are written to the system file. The 'DROP' subcommand can be used to specify a list of variables not to be written. In contrast, KEEP specifies variables to be written, with all variables not specified not written. Normally variables are saved to a system file under the same names they have in the active dataset. Use the 'RENAME' subcommand to change these names. Specify, within parentheses, a list of variable names followed by an equals sign ('=') and the names that they should be renamed to. Multiple parenthesized groups of variable names can be included on a single 'RENAME' subcommand. Variables' names may be swapped using a 'RENAME' subcommand of the form '/RENAME=(A B=B A)'. Alternate syntax for the 'RENAME' subcommand allows the parentheses to be eliminated. When this is done, only a single variable may be renamed at once. For instance, '/RENAME=A=B'. This alternate syntax is deprecated. 'DROP', 'KEEP', and 'RENAME' are performed in left-to-right order. They each may be present any number of times. 'SAVE' never modifies the active dataset. 'DROP', 'KEEP', and 'RENAME' only affect the system file written to disk. The 'VERSION' subcommand specifies the version of the file format. Valid versions are 2 and 3. The default version is 3. In version 2 system files, variable names longer than 8 bytes will be truncated. The two versions are otherwise identical. The 'NAMES' and 'MAP' subcommands are currently ignored. 'SAVE' causes the data to be read. It is a procedure.  File: pspp.info, Node: SAVE DATA COLLECTION, Next: SAVE TRANSLATE, Prev: SAVE, Up: System and Portable File IO 9.7 SAVE DATA COLLECTION ======================== SAVE DATA COLLECTION /OUTFILE={'FILE_NAME',FILE_HANDLE} /METADATA={'FILE_NAME',FILE_HANDLE} /{UNCOMPRESSED,COMPRESSED,ZCOMPRESSED} /PERMISSIONS={WRITEABLE,READONLY} /DROP=VAR_LIST /KEEP=VAR_LIST /VERSION=VERSION /RENAME=(SRC_NAMES=TARGET_NAMES)... /NAMES /MAP Like 'SAVE', 'SAVE DATA COLLECTION' writes the dictionary and data in the active dataset to a system file. In addition, it writes metadata to an additional XML metadata file. OUTFILE is required. Specify the system file to be written as a string file name or a file handle (*note File Handles::). METADATA is also required. Specify the metadata file to be written as a string file name or a file handle. Metadata files customarily use a '.mdd' extension. The current implementation of this command is experimental. It only outputs an approximation of the metadata file format. Please report bugs. Other subcommands are optional. They have the same meanings as in the 'SAVE' command. 'SAVE DATA COLLECTION' causes the data to be read. It is a procedure.  File: pspp.info, Node: SAVE TRANSLATE, Next: SYSFILE INFO, Prev: SAVE DATA COLLECTION, Up: System and Portable File IO 9.8 SAVE TRANSLATE ================== SAVE TRANSLATE /OUTFILE={'FILE_NAME',FILE_HANDLE} /TYPE={CSV,TAB} [/REPLACE] [/MISSING={IGNORE,RECODE}] [/DROP=VAR_LIST] [/KEEP=VAR_LIST] [/RENAME=(SRC_NAMES=TARGET_NAMES)...] [/UNSELECTED={RETAIN,DELETE}] [/MAP] ...additional subcommands depending on TYPE... The 'SAVE TRANSLATE' command is used to save data into various formats understood by other applications. The 'OUTFILE' and 'TYPE' subcommands are mandatory. 'OUTFILE' specifies the file to be written, as a string file name or a file handle (*note File Handles::). 'TYPE' determines the type of the file or source to read. It must be one of the following: CSV Comma-separated value format, TAB Tab-delimited format. By default, 'SAVE TRANSLATE' will not overwrite an existing file. Use 'REPLACE' to force an existing file to be overwritten. With MISSING=IGNORE, the default, 'SAVE TRANSLATE' treats user-missing values as if they were not missing. Specify MISSING=RECODE to output numeric user-missing values like system-missing values and string user-missing values as all spaces. By default, all the variables in the active dataset dictionary are saved to the system file, but 'DROP' or 'KEEP' can select a subset of variable to save. The 'RENAME' subcommand can also be used to change the names under which variables are saved; because they are used only in the output, these names do not have to conform to the usual PSPP variable naming rules. 'UNSELECTED' determines whether cases filtered out by the 'FILTER' command are written to the output file. These subcommands have the same syntax and meaning as on the 'SAVE' command (*note SAVE::). Each supported file type has additional subcommands, explained in separate sections below. 'SAVE TRANSLATE' causes the data to be read. It is a procedure. * Menu: * SAVE TRANSLATE /TYPE=CSV and TYPE=TAB::  File: pspp.info, Node: SAVE TRANSLATE /TYPE=CSV and TYPE=TAB, Up: SAVE TRANSLATE 9.8.1 Writing Comma- and Tab-Separated Data Files ------------------------------------------------- SAVE TRANSLATE /OUTFILE={'FILE_NAME',FILE_HANDLE} /TYPE=CSV [/REPLACE] [/MISSING={IGNORE,RECODE}] [/DROP=VAR_LIST] [/KEEP=VAR_LIST] [/RENAME=(SRC_NAMES=TARGET_NAMES)...] [/UNSELECTED={RETAIN,DELETE}] [/FIELDNAMES] [/CELLS={VALUES,LABELS}] [/TEXTOPTIONS DELIMITER='DELIMITER'] [/TEXTOPTIONS QUALIFIER='QUALIFIER'] [/TEXTOPTIONS DECIMAL={DOT,COMMA}] [/TEXTOPTIONS FORMAT={PLAIN,VARIABLE}] The SAVE TRANSLATE command with TYPE=CSV or TYPE=TAB writes data in a comma- or tab-separated value format similar to that described by RFC 4180. Each variable becomes one output column, and each case becomes one line of output. If FIELDNAMES is specified, an additional line at the top of the output file lists variable names. The CELLS and TEXTOPTIONS FORMAT settings determine how values are written to the output file: CELLS=VALUES FORMAT=PLAIN (the default settings) Writes variables to the output in "plain" formats that ignore the details of variable formats. Numeric values are written as plain decimal numbers with enough digits to indicate their exact values in machine representation. Numeric values include 'e' followed by an exponent if the exponent value would be less than -4 or greater than 16. Dates are written in MM/DD/YYYY format and times in HH:MM:SS format. WKDAY and MONTH values are written as decimal numbers. Numeric values use, by default, the decimal point character set with SET DECIMAL (*note SET DECIMAL::). Use DECIMAL=DOT or DECIMAL=COMMA to force a particular decimal point character. CELLS=VALUES FORMAT=VARIABLE Writes variables using their print formats. Leading and trailing spaces are removed from numeric values, and trailing spaces are removed from string values. CELLS=LABEL FORMAT=PLAIN CELLS=LABEL FORMAT=VARIABLE Writes value labels where they exist, and otherwise writes the values themselves as described above. Regardless of CELLS and TEXTOPTIONS FORMAT, numeric system-missing values are output as a single space. For TYPE=TAB, tab characters delimit values. For TYPE=CSV, the TEXTOPTIONS DELIMITER and DECIMAL settings determine the character that separate values within a line. If DELIMITER is specified, then the specified string separate values. If DELIMITER is not specified, then the default is a comma with DECIMAL=DOT or a semicolon with DECIMAL=COMMA. If DECIMAL is not given either, it is implied by the decimal point character set with SET DECIMAL (*note SET DECIMAL::). The TEXTOPTIONS QUALIFIER setting specifies a character that is output before and after a value that contains the delimiter character or the qualifier character. The default is a double quote ('"'). A qualifier character that appears within a value is doubled.  File: pspp.info, Node: SYSFILE INFO, Next: XEXPORT, Prev: SAVE TRANSLATE, Up: System and Portable File IO 9.9 SYSFILE INFO ================ SYSFILE INFO FILE='FILE_NAME' [ENCODING='ENCODING']. 'SYSFILE INFO' reads the dictionary in an SPSS system file, SPSS/PC+ system file, or SPSS portable file, and displays the information in its dictionary. Specify a file name or file handle. 'SYSFILE INFO' reads that file and displays information on its dictionary. PSPP automatically detects the encoding of string data in the file, when possible. The character encoding of old SPSS system files cannot always be guessed correctly, and SPSS/PC+ system files do not include any indication of their encoding. Specify the 'ENCODING' subcommand with an IANA character set name as its string argument to override the default, or specify 'ENCODING='DETECT'' to analyze and report possibly valid encodings for the system file. The 'ENCODING' subcommand is a PSPP extension. 'SYSFILE INFO' does not affect the current active dataset.  File: pspp.info, Node: XEXPORT, Next: XSAVE, Prev: SYSFILE INFO, Up: System and Portable File IO 9.10 XEXPORT ============ XEXPORT /OUTFILE='FILE_NAME' /DIGITS=N /DROP=VAR_LIST /KEEP=VAR_LIST /RENAME=(SRC_NAMES=TARGET_NAMES)... /TYPE={COMM,TAPE} /MAP The 'XEXPORT' transformation writes the active dataset dictionary and data to a specified portable file. This transformation is a PSPP extension. It is similar to the 'EXPORT' procedure, with two differences: * 'XEXPORT' is a transformation, not a procedure. It is executed when the data is read by a procedure or procedure-like command. * 'XEXPORT' does not support the 'UNSELECTED' subcommand. *Note EXPORT::, for more information.  File: pspp.info, Node: XSAVE, Prev: XEXPORT, Up: System and Portable File IO 9.11 XSAVE ========== XSAVE /OUTFILE='FILE_NAME' /{UNCOMPRESSED,COMPRESSED,ZCOMPRESSED} /PERMISSIONS={WRITEABLE,READONLY} /DROP=VAR_LIST /KEEP=VAR_LIST /VERSION=VERSION /RENAME=(SRC_NAMES=TARGET_NAMES)... /NAMES /MAP The 'XSAVE' transformation writes the active dataset's dictionary and data to a system file. It is similar to the 'SAVE' procedure, with two differences: * 'XSAVE' is a transformation, not a procedure. It is executed when the data is read by a procedure or procedure-like command. * 'XSAVE' does not support the 'UNSELECTED' subcommand. *Note SAVE::, for more information.  File: pspp.info, Node: Combining Data Files, Next: Variable Attributes, Prev: System and Portable File IO, Up: Top 10 Combining Data Files *********************** This chapter describes commands that allow data from system files, portable files, and open datasets to be combined to form a new active dataset. These commands can combine data files in the following ways: * 'ADD FILES' interleaves or appends the cases from each input file. It is used with input files that have variables in common, but distinct sets of cases. * 'MATCH FILES' adds the data together in cases that match across multiple input files. It is used with input files that have cases in common, but different information about each case. * 'UPDATE' updates a master data file from data in a set of transaction files. Each case in a transaction data file modifies a matching case in the primary data file, or it adds a new case if no matching case can be found. These commands share the majority of their syntax, which is described in the following section, followed by one section for each command that describes its specific syntax and semantics. * Menu: * Combining Files Common Syntax:: * ADD FILES:: Interleave cases from multiple files. * MATCH FILES:: Merge cases from multiple files. * UPDATE:: Update cases using transactional data.  File: pspp.info, Node: Combining Files Common Syntax, Next: ADD FILES, Up: Combining Data Files 10.1 Common Syntax ================== Per input file: /FILE={*,'FILE_NAME'} [/RENAME=(SRC_NAMES=TARGET_NAMES)...] [/IN=VAR_NAME] [/SORT] Once per command: /BY VAR_LIST[({D|A})] [VAR_LIST[({D|A}]]... [/DROP=VAR_LIST] [/KEEP=VAR_LIST] [/FIRST=VAR_NAME] [/LAST=VAR_NAME] [/MAP] This section describes the syntactical features in common among the 'ADD FILES', 'MATCH FILES', and 'UPDATE' commands. The following sections describe details specific to each command. Each of these commands reads two or more input files and combines them. The command's output becomes the new active dataset. None of the commands actually change the input files. Therefore, if you want the changes to become permanent, you must explicitly save them using an appropriate procedure or transformation (*note System and Portable File IO::). The syntax of each command begins with a specification of the files to be read as input. For each input file, specify FILE with a system file or portable file's name as a string, a dataset (*note Datasets::) or file handle name, (*note File Handles::), or an asterisk ('*') to use the active dataset as input. Use of portable files on 'FILE' is a PSPP extension. At least two 'FILE' subcommands must be specified. If the active dataset is used as an input source, then 'TEMPORARY' must not be in effect. Each 'FILE' subcommand may be followed by any number of 'RENAME' subcommands that specify a parenthesized group or groups of variable names as they appear in the input file, followed by those variables' new names, separated by an equals sign ('='), e.g. '/RENAME=(OLD1=NEW1)(OLD2=NEW2)'. To rename a single variable, the parentheses may be omitted: '/RENAME=OLD=NEW'. Within a parenthesized group, variables are renamed simultaneously, so that '/RENAME=(A B=B A)' exchanges the names of variables A and B. Otherwise, renaming occurs in left-to-right order. Each 'FILE' subcommand may optionally be followed by a single 'IN' subcommand, which creates a numeric variable with the specified name and format F1.0. The IN variable takes value 1 in an output case if the given input file contributed to that output case, and 0 otherwise. The 'DROP', 'KEEP', and 'RENAME' subcommands have no effect on IN variables. If 'BY' is used (see below), the 'SORT' keyword must be specified after a 'FILE' if that input file is not already sorted on the 'BY' variables. When 'SORT' is specified, PSPP sorts the input file's data on the 'BY' variables before it applies it to the command. When 'SORT' is used, 'BY' is required. 'SORT' is a PSPP extension. PSPP merges the dictionaries of all of the input files to form the dictionary of the new active dataset, like so: * The variables in the new active dataset are the union of all the input files' variables, matched based on their name. When a single input file contains a variable with a given name, the output file will contain exactly that variable. When more than one input file contains a variable with a given name, those variables must all have the same type (numeric or string) and, for string variables, the same width. Variables are matched after renaming with the 'RENAME' subcommand. Thus, 'RENAME' can be used to resolve conflicts. * The variable label for each output variable is taken from the first specified input file that has a variable label for that variable, and similarly for value labels and missing values. * The file label of the new active dataset (*note FILE LABEL::) is that of the first specified 'FILE' that has a file label. * The documents in the new active dataset (*note DOCUMENT::) are the concatenation of all the input files' documents, in the order in which the 'FILE' subcommands are specified. * If all of the input files are weighted on the same variable, then the new active dataset is weighted on that variable. Otherwise, the new active dataset is not weighted. The remaining subcommands apply to the output file as a whole, rather than to individual input files. They must be specified at the end of the command specification, following all of the 'FILE' and related subcommands. The most important of these subcommands is 'BY', which specifies a set of one or more variables that may be used to find corresponding cases in each of the input files. The variables specified on 'BY' must be present in all of the input files. Furthermore, if any of the input files are not sorted on the 'BY' variables, then 'SORT' must be specified for those input files. The variables listed on 'BY' may include (A) or (D) annotations to specify ascending or descending sort order. *Note SORT CASES::, for more details on this notation. Adding (A) or (D) to the 'BY' subcommand specification is a PSPP extension. The 'DROP' subcommand can be used to specify a list of variables to exclude from the output. By contrast, the 'KEEP' subcommand can be used to specify variables to include in the output; all variables not listed are dropped. 'DROP' and 'KEEP' are executed in left-to-right order and may be repeated any number of times. 'DROP' and 'KEEP' do not affect variables created by the 'IN', 'FIRST', and 'LAST' subcommands, which are always included in the new active dataset, but they can be used to drop 'BY' variables. The 'FIRST' and 'LAST' subcommands are optional. They may only be specified on 'MATCH FILES' and 'ADD FILES', and only when 'BY' is used. 'FIRST' and 'LIST' each adds a numeric variable to the new active dataset, with the name given as the subcommand's argument and F1.0 print and write formats. The value of the 'FIRST' variable is 1 in the first output case with a given set of values for the 'BY' variables, and 0 in other cases. Similarly, the 'LAST' variable is 1 in the last case with a given of 'BY' values, and 0 in other cases. When any of these commands creates an output case, variables that are only in files that are not present for the current case are set to the system-missing value for numeric variables or spaces for string variables. These commands may combine any number of files, limited only by the machine's memory.  File: pspp.info, Node: ADD FILES, Next: MATCH FILES, Prev: Combining Files Common Syntax, Up: Combining Data Files 10.2 ADD FILES ============== ADD FILES Per input file: /FILE={*,'FILE_NAME'} [/RENAME=(SRC_NAMES=TARGET_NAMES)...] [/IN=VAR_NAME] [/SORT] Once per command: [/BY VAR_LIST[({D|A})] [VAR_LIST[({D|A})]...]] [/DROP=VAR_LIST] [/KEEP=VAR_LIST] [/FIRST=VAR_NAME] [/LAST=VAR_NAME] [/MAP] 'ADD FILES' adds cases from multiple input files. The output, which replaces the active dataset, consists all of the cases in all of the input files. 'ADD FILES' shares the bulk of its syntax with other PSPP commands for combining multiple data files. *Note Combining Files Common Syntax::, above, for an explanation of this common syntax. When 'BY' is not used, the output of 'ADD FILES' consists of all the cases from the first input file specified, followed by all the cases from the second file specified, and so on. When 'BY' is used, the output is additionally sorted on the 'BY' variables. When 'ADD FILES' creates an output case, variables that are not part of the input file from which the case was drawn are set to the system-missing value for numeric variables or spaces for string variables.  File: pspp.info, Node: MATCH FILES, Next: UPDATE, Prev: ADD FILES, Up: Combining Data Files 10.3 MATCH FILES ================ MATCH FILES Per input file: /{FILE,TABLE}={*,'FILE_NAME'} [/RENAME=(SRC_NAMES=TARGET_NAMES)...] [/IN=VAR_NAME] [/SORT] Once per command: /BY VAR_LIST[({D|A}] [VAR_LIST[({D|A})]...] [/DROP=VAR_LIST] [/KEEP=VAR_LIST] [/FIRST=VAR_NAME] [/LAST=VAR_NAME] [/MAP] 'MATCH FILES' merges sets of corresponding cases in multiple input files into single cases in the output, combining their data. 'MATCH FILES' shares the bulk of its syntax with other PSPP commands for combining multiple data files. *Note Combining Files Common Syntax::, above, for an explanation of this common syntax. How 'MATCH FILES' matches up cases from the input files depends on whether 'BY' is specified: * If 'BY' is not used, 'MATCH FILES' combines the first case from each input file to produce the first output case, then the second case from each input file for the second output case, and so on. If some input files have fewer cases than others, then the shorter files do not contribute to cases output after their input has been exhausted. * If 'BY' is used, 'MATCH FILES' combines cases from each input file that have identical values for the 'BY' variables. When 'BY' is used, 'TABLE' subcommands may be used to introduce "table lookup file". 'TABLE' has same syntax as 'FILE', and the 'RENAME', 'IN', and 'SORT' subcommands may follow a 'TABLE' in the same way as 'FILE'. Regardless of the number of 'TABLE's, at least one 'FILE' must specified. Table lookup files are treated in the same way as other input files for most purposes and, in particular, table lookup files must be sorted on the 'BY' variables or the 'SORT' subcommand must be specified for that 'TABLE'. Cases in table lookup files are not consumed after they have been used once. This means that data in table lookup files can correspond to any number of cases in 'FILE' input files. Table lookup files are analogous to lookup tables in traditional relational database systems. If a table lookup file contains more than one case with a given set of 'BY' variables, only the first case is used. When 'MATCH FILES' creates an output case, variables that are only in files that are not present for the current case are set to the system-missing value for numeric variables or spaces for string variables.  File: pspp.info, Node: UPDATE, Prev: MATCH FILES, Up: Combining Data Files 10.4 UPDATE =========== UPDATE Per input file: /FILE={*,'FILE_NAME'} [/RENAME=(SRC_NAMES=TARGET_NAMES)...] [/IN=VAR_NAME] [/SORT] Once per command: /BY VAR_LIST[({D|A})] [VAR_LIST[({D|A})]]... [/DROP=VAR_LIST] [/KEEP=VAR_LIST] [/MAP] 'UPDATE' updates a "master file" by applying modifications from one or more "transaction files". 'UPDATE' shares the bulk of its syntax with other PSPP commands for combining multiple data files. *Note Combining Files Common Syntax::, above, for an explanation of this common syntax. At least two 'FILE' subcommands must be specified. The first 'FILE' subcommand names the master file, and the rest name transaction files. Every input file must either be sorted on the variables named on the 'BY' subcommand, or the 'SORT' subcommand must be used just after the 'FILE' subcommand for that input file. 'UPDATE' uses the variables specified on the 'BY' subcommand, which is required, to attempt to match each case in a transaction file with a case in the master file: * When a match is found, then the values of the variables present in the transaction file replace those variables' values in the new active file. If there are matching cases in more than more transaction file, PSPP applies the replacements from the first transaction file, then from the second transaction file, and so on. Similarly, if a single transaction file has cases with duplicate 'BY' values, then those are applied in order to the master file. When a variable in a transaction file has a missing value or when a string variable's value is all blanks, that value is never used to update the master file. * If a case in the master file has no matching case in any transaction file, then it is copied unchanged to the output. * If a case in a transaction file has no matching case in the master file, then it causes a new case to be added to the output, initialized from the values in the transaction file.  File: pspp.info, Node: Variable Attributes, Next: Data Manipulation, Prev: Combining Data Files, Up: Top 11 Manipulating variables ************************* The variables in the active dataset dictionary are important. There are several utility functions for examining and adjusting them. * Menu: * ADD VALUE LABELS:: Add value labels to variables. * DELETE VARIABLES:: Delete variables. * DISPLAY:: Display information about the active dataset. * FORMATS:: Set print and write formats. * LEAVE:: Don't clear variables between cases. * MISSING VALUES:: Set missing values for variables. * MODIFY VARS:: Rename, reorder, and drop variables. * MRSETS:: Add, modify, and list multiple response sets. * NUMERIC:: Create new numeric variables. * PRINT FORMATS:: Set variable print formats. * RENAME VARIABLES:: Rename variables. * SORT VARIABLES:: Reorder variables. * VALUE LABELS:: Set value labels for variables. * STRING:: Create new string variables. * VARIABLE ATTRIBUTE:: Set custom attributes on variables. * VARIABLE LABELS:: Set variable labels for variables. * VARIABLE ALIGNMENT:: Set the alignment for display. * VARIABLE WIDTH:: Set the display width. * VARIABLE LEVEL:: Set the measurement level. * VARIABLE ROLE:: Set the role that a variable fills in analysis. * VECTOR:: Declare an array of variables. * WRITE FORMATS:: Set variable write formats.  File: pspp.info, Node: ADD VALUE LABELS, Next: DELETE VARIABLES, Up: Variable Attributes 11.1 ADD VALUE LABELS ===================== ADD VALUE LABELS /VAR_LIST VALUE 'LABEL' [VALUE 'LABEL']... 'ADD VALUE LABELS' has the same syntax and purpose as 'VALUE LABELS' (*note VALUE LABELS::), but it does not clear value labels from the variables before adding the ones specified.  File: pspp.info, Node: DELETE VARIABLES, Next: DISPLAY, Prev: ADD VALUE LABELS, Up: Variable Attributes 11.2 DELETE VARIABLES ===================== DELETE VARIABLES VAR_LIST. 'DELETE VARIABLES' deletes the specified variables from the dictionary. It may not be used to delete all variables from the dictionary; use 'NEW FILE' to do that (*note NEW FILE::). 'DELETE VARIABLES' should not be used after defining transformations but before executing a procedure. If it is used in such a context, it causes the data to be read. If it is used while 'TEMPORARY' is in effect, it causes the temporary transformations to become permanent.  File: pspp.info, Node: DISPLAY, Next: FORMATS, Prev: DELETE VARIABLES, Up: Variable Attributes 11.3 DISPLAY ============ DISPLAY [SORTED] NAMES [[/VARIABLES=]VAR_LIST]. DISPLAY [SORTED] INDEX [[/VARIABLES=]VAR_LIST]. DISPLAY [SORTED] LABELS [[/VARIABLES=]VAR_LIST]. DISPLAY [SORTED] VARIABLES [[/VARIABLES=]VAR_LIST]. DISPLAY [SORTED] DICTIONARY [[/VARIABLES=]VAR_LIST]. DISPLAY [SORTED] SCRATCH [[/VARIABLES=]VAR_LIST]. DISPLAY [SORTED] ATTRIBUTES [[/VARIABLES=]VAR_LIST]. DISPLAY [SORTED] @ATTRIBUTES [[/VARIABLES=]VAR_LIST]. DISPLAY [SORTED] VECTORS. 'DISPLAY' displays information about the active dataset. A variety of different forms of information can be requested. The following keywords primarily cause information about variables to be displayed. With these keywords, by default information is displayed about all variable in the active dataset, in the order that variables occur in the active dataset dictionary. The 'SORTED' keyword causes output to be sorted alphabetically by variable name. The 'VARIABLES' subcommand limits output to the specified variables. NAMES The variables' names are displayed. INDEX The variables' names are displayed along with a value describing their position within the active dataset dictionary. LABELS Variable names, positions, and variable labels are displayed. VARIABLES Variable names, positions, print and write formats, and missing values are displayed. DICTIONARY Variable names, positions, print and write formats, missing values, variable labels, and value labels are displayed. SCRATCH Variable names are displayed, for scratch variables only (*note Scratch Variables::). ATTRIBUTES @ATTRIBUTES Datafile and variable attributes are displayed. The first form of the command omits those attributes whose names begin with '@' or '$@'. In the second for, all datafile and variable attributes are displayed. With the 'VECTOR' keyword, 'DISPLAY' lists all the currently declared vectors. If the 'SORTED' keyword is given, the vectors are listed in alphabetical order; otherwise, they are listed in textual order of definition within the PSPP syntax file. For related commands, see *note DISPLAY DOCUMENTS:: and *note DISPLAY FILE LABEL::.  File: pspp.info, Node: FORMATS, Next: LEAVE, Prev: DISPLAY, Up: Variable Attributes 11.4 FORMATS ============ FORMATS VAR_LIST (FMT_SPEC) [VAR_LIST (FMT_SPEC)].... 'FORMATS' set both print and write formats for the specified variables to the specified format specification. *Note Input and Output Formats::. Specify a list of variables followed by a format specification in parentheses. The print and write formats of the specified variables will be changed. All of the variables listed together must have the same type and, for string variables, the same width. Additional lists of variables and formats may be included following the first one. 'FORMATS' takes effect immediately. It is not affected by conditional and looping structures such as 'DO IF' or 'LOOP'.  File: pspp.info, Node: LEAVE, Next: MISSING VALUES, Prev: FORMATS, Up: Variable Attributes 11.5 LEAVE ========== LEAVE VAR_LIST. 'LEAVE' prevents the specified variables from being reinitialized whenever a new case is processed. Normally, when a data file is processed, every variable in the active dataset is initialized to the system-missing value or spaces at the beginning of processing for each case. When a variable has been specified on 'LEAVE', this is not the case. Instead, that variable is initialized to 0 (not system-missing) or spaces for the first case. After that, it retains its value between cases. This becomes useful for counters. For instance, in the example below the variable 'SUM' maintains a running total of the values in the 'ITEM' variable. DATA LIST /ITEM 1-3. COMPUTE SUM=SUM+ITEM. PRINT /ITEM SUM. LEAVE SUM BEGIN DATA. 123 404 555 999 END DATA. Partial output from this example: 123 123.00 404 527.00 555 1082.00 999 2081.00 It is best to use 'LEAVE' command immediately before invoking a procedure command, because the left status of variables is reset by certain transformations--for instance, 'COMPUTE' and 'IF'. Left status is also reset by all procedure invocations.  File: pspp.info, Node: MISSING VALUES, Next: MODIFY VARS, Prev: LEAVE, Up: Variable Attributes 11.6 MISSING VALUES =================== MISSING VALUES VAR_LIST (MISSING_VALUES). where MISSING_VALUES takes one of the following forms: NUM1 NUM1, NUM2 NUM1, NUM2, NUM3 NUM1 THRU NUM2 NUM1 THRU NUM2, NUM3 STRING1 STRING1, STRING2 STRING1, STRING2, STRING3 As part of a range, 'LO' or 'LOWEST' may take the place of NUM1; 'HI' or 'HIGHEST' may take the place of NUM2. 'MISSING VALUES' sets user-missing values for numeric and string variables. Long string variables may have missing values, but characters after the first 8 bytes of the missing value must be spaces. Specify a list of variables, followed by a list of their user-missing values in parentheses. Up to three discrete values may be given, or, for numeric variables only, a range of values optionally accompanied by a single discrete value. Ranges may be open-ended on one end, indicated through the use of the keyword 'LO' or 'LOWEST' or 'HI' or 'HIGHEST'. The 'MISSING VALUES' command takes effect immediately. It is not affected by conditional and looping constructs such as 'DO IF' or 'LOOP'.  File: pspp.info, Node: MODIFY VARS, Next: MRSETS, Prev: MISSING VALUES, Up: Variable Attributes 11.7 MODIFY VARS ================ MODIFY VARS /REORDER={FORWARD,BACKWARD} {POSITIONAL,ALPHA} (VAR_LIST)... /RENAME=(OLD_NAMES=NEW_NAMES)... /{DROP,KEEP}=VAR_LIST /MAP 'MODIFY VARS' reorders, renames, and deletes variables in the active dataset. At least one subcommand must be specified, and no subcommand may be specified more than once. 'DROP' and 'KEEP' may not both be specified. The 'REORDER' subcommand changes the order of variables in the active dataset. Specify one or more lists of variable names in parentheses. By default, each list of variables is rearranged into the specified order. To put the variables into the reverse of the specified order, put keyword 'BACKWARD' before the parentheses. To put them into alphabetical order in the dictionary, specify keyword 'ALPHA' before the parentheses. 'BACKWARD' and 'ALPHA' may also be combined. To rename variables in the active dataset, specify 'RENAME', an equals sign ('='), and lists of the old variable names and new variable names separated by another equals sign within parentheses. There must be the same number of old and new variable names. Each old variable is renamed to the corresponding new variable name. Multiple parenthesized groups of variables may be specified. The 'DROP' subcommand deletes a specified list of variables from the active dataset. 'MODIFY VARS' may not be used to delete all variables from the dictionary; use 'NEW FILE' to do that (*note NEW FILE::). The 'KEEP' subcommand keeps the specified list of variables in the active dataset. Any unlisted variables are deleted from the active dataset. 'MAP' is currently ignored. If either 'DROP' or 'KEEP' is specified, the data is read; otherwise it is not. 'MODIFY VARS' may not be specified following 'TEMPORARY' (*note TEMPORARY::).  File: pspp.info, Node: MRSETS, Next: NUMERIC, Prev: MODIFY VARS, Up: Variable Attributes 11.8 MRSETS =========== MRSETS /MDGROUP NAME=NAME VARIABLES=VAR_LIST VALUE=VALUE [CATEGORYLABELS={VARLABELS,COUNTEDVALUES}] [{LABEL='LABEL',LABELSOURCE=VARLABEL}] /MCGROUP NAME=NAME VARIABLES=VAR_LIST [LABEL='LABEL'] /DELETE NAME={[NAMES],ALL} /DISPLAY NAME={[NAMES],ALL} 'MRSETS' creates, modifies, deletes, and displays multiple response sets. A multiple response set is a set of variables that represent multiple responses to a single survey question in one of the two following ways: * A "multiple dichotomy set" is analogous to a survey question with a set of checkboxes. Each variable in the set is treated in a Boolean fashion: one value (the "counted value") means that the box was checked, and any other value means that it was not. * A "multiple category set" represents a survey question where the respondent is instructed to list up to N choices. Each variable represents one of the responses. Any number of subcommands may be specified in any order. The 'MDGROUP' subcommand creates a new multiple dichotomy set or replaces an existing multiple response set. The 'NAME', 'VARIABLES', and 'VALUE' specifications are required. The others are optional: * NAME specifies the name used in syntax for the new multiple dichotomy set. The name must begin with '$'; it must otherwise follow the rules for identifiers (*note Tokens::). * 'VARIABLES' specifies the variables that belong to the set. At least two variables must be specified. The variables must be all string or all numeric. * 'VALUE' specifies the counted value. If the variables are numeric, the value must be an integer. If the variables are strings, then the value must be a string that is no longer than the shortest of the variables in the set (ignoring trailing spaces). * 'CATEGORYLABELS' optionally specifies the source of the labels for each category in the set: - 'VARLABELS', the default, uses variable labels or, for variables without variable labels, variable names. PSPP warns if two variables have the same variable label, since these categories cannot be distinguished in output. - 'COUNTEDVALUES' instead uses each variable's value label for the counted value. PSPP warns if two variables have the same value label for the counted value or if one of the variables lacks a value label, since such categories cannot be distinguished in output. * 'LABEL' optionally specifies a label for the multiple response set. If neither 'LABEL' nor 'LABELSOURCE=VARLABEL' is specified, the set is unlabeled. * 'LABELSOURCE=VARLABEL' draws the multiple response set's label from the first variable label among the variables in the set; if none of the variables has a label, the name of the first variable is used. 'LABELSOURCE=VARLABEL' must be used with 'CATEGORYLABELS=COUNTEDVALUES'. It is mutually exclusive with 'LABEL'. The 'MCGROUP' subcommand creates a new multiple category set or replaces an existing multiple response set. The 'NAME' and 'VARIABLES' specifications are required, and 'LABEL' is optional. Their meanings are as described above in 'MDGROUP'. PSPP warns if two variables in the set have different value labels for a single value, since each of the variables in the set should have the same possible categories. The 'DELETE' subcommand deletes multiple response groups. A list of groups may be named within a set of required square brackets, or ALL may be used to delete all groups. The 'DISPLAY' subcommand displays information about defined multiple response sets. Its syntax is the same as the 'DELETE' subcommand. Multiple response sets are saved to and read from system files by, e.g., the 'SAVE' and 'GET' command. Otherwise, multiple response sets are currently used only by third party software.  File: pspp.info, Node: NUMERIC, Next: PRINT FORMATS, Prev: MRSETS, Up: Variable Attributes 11.9 NUMERIC ============ NUMERIC VAR_LIST [(FMT_SPEC)] [/VAR_LIST [(FMT_SPEC)]]... 'NUMERIC' explicitly declares new numeric variables, optionally setting their output formats. Specify the names of the new numeric variables as VAR_LIST. If you wish to set the variables' output formats, follow their names by an output format specification in parentheses (*note Input and Output Formats::); otherwise, the default is F8.2. Variables created with 'NUMERIC' are initialized to the system-missing value.  File: pspp.info, Node: PRINT FORMATS, Next: RENAME VARIABLES, Prev: NUMERIC, Up: Variable Attributes 11.10 PRINT FORMATS =================== PRINT FORMATS VAR_LIST (FMT_SPEC) [VAR_LIST (FMT_SPEC)].... 'PRINT FORMATS' sets the print formats for the specified variables to the specified format specification. Its syntax is identical to that of 'FORMATS' (*note FORMATS::), but 'PRINT FORMATS' sets only print formats, not write formats.  File: pspp.info, Node: RENAME VARIABLES, Next: SORT VARIABLES, Prev: PRINT FORMATS, Up: Variable Attributes 11.11 RENAME VARIABLES ====================== RENAME VARIABLES (OLD_NAMES=NEW_NAMES)... . 'RENAME VARIABLES' changes the names of variables in the active dataset. Specify lists of the old variable names and new variable names, separated by an equals sign ('='), within parentheses. There must be the same number of old and new variable names. Each old variable is renamed to the corresponding new variable name. Multiple parenthesized groups of variables may be specified. When the old and new variable names contain only a single variable name, the parentheses are optional. 'RENAME VARIABLES' takes effect immediately. It does not cause the data to be read. 'RENAME VARIABLES' may not be specified following 'TEMPORARY' (*note TEMPORARY::).  File: pspp.info, Node: SORT VARIABLES, Next: VALUE LABELS, Prev: RENAME VARIABLES, Up: Variable Attributes 11.12 SORT VARIABLES ==================== SORT VARIABLES [BY] (NAME | TYPE | FORMAT | LABEL | VALUES | MISSING | MEASURE | ROLE | COLUMNS | ALIGNMENT | ATTRIBUTE NAME) [(D)]. 'SORT VARIABLES' reorders the variables in the active dataset. The main specification is one of the following identifiers, which determines how the variables are sorted: NAME Sorts the variables according to their names, in a case-insensitive fashion. However, when variable names differ only in a number at the end, they are sorted numerically. For example, 'VAR5' is sorted before 'VAR400' even though '4' precedes '5'. TYPE Sorts numeric variables before string variables, and shorter string variables before longer ones. FORMAT Groups variables by print format; within a format, sorts narrower formats before wider ones; with the same format and width, sorts fewer decimal places before more decimal places. *Note FORMATS::. LABEL Sorts variables without a variable label before those with one. *Note VARIABLE LABELS::. VALUES Sorts variables without value labels before those with some. *Note VALUE LABELS::. MISSING Sorts variables without missing values before those with some. *Note MISSING VALUES::. MEASURE Sorts nominal variables first, followed by ordinal variables, followed by scale variables. *Note VARIABLE LEVEL::. ROLE Groups variables according to their role. *Note VARIABLE ROLE::. COLUMNS Sorts variables in ascending display width. *Note VARIABLE WIDTH::. ALIGNMENT Sorts variables according to their alignment, first left-aligned, then right-aligned, then centered. *Note VARIABLE ALIGNMENT::. ATTRIBUTE NAME Sorts variables according to the first value of their NAME attribute. Variables without attribute are sorted first. *Note VARIABLE ATTRIBUTE::. Only one sort criterion can be specified. The sort is "stable," so to sort on multiple criteria one may perform multiple sorts. For example, the following will sort primarily based on alignment, with variables that have the same alignment ordered based on display width: SORT VARIABLES BY COLUMNS. SORT VARIABLES BY ALIGNMENT. Specify '(D)' to reverse the sort order.  File: pspp.info, Node: VALUE LABELS, Next: STRING, Prev: SORT VARIABLES, Up: Variable Attributes 11.13 VALUE LABELS ================== VALUE LABELS /VAR_LIST VALUE 'LABEL' [VALUE 'LABEL']... 'VALUE LABELS' allows values of variables to be associated with labels. In this way, a short value can stand for a longer, more descriptive label. Both numeric and string variables can be given labels. For string variables, the values are case-sensitive, so that, for example, a capitalized value and its lowercase variant would have to be labeled separately if both are present in the data. To set up value labels for one or more variables, specify the variable names after a slash ('/'), followed by a list of values and their associated labels, separated by spaces. Value labels in output are normally broken into lines automatically. Put '\n' in a label string to force a line break at that point. The label may still be broken into lines at additional points. Before 'VALUE LABELS' is executed, any existing value labels are cleared from the variables specified. Use 'ADD VALUE LABELS' (*note ADD VALUE LABELS::) to add value labels without clearing those already present.  File: pspp.info, Node: STRING, Next: VARIABLE ATTRIBUTE, Prev: VALUE LABELS, Up: Variable Attributes 11.14 STRING ============ STRING VAR_LIST (FMT_SPEC) [/VAR_LIST (FMT_SPEC)] [...]. 'STRING' creates new string variables for use in transformations. Specify a list of names for the variable you want to create, followed by the desired output format specification in parentheses (*note Input and Output Formats::). Variable widths are implicitly derived from the specified output formats. The created variables will be initialized to spaces. If you want to create several variables with distinct output formats, you can either use two or more separate 'STRING' commands, or you can specify further variable list and format specification pairs, each separated from the previous by a slash ('/'). The following example is one way to create three string variables; Two of the variables have format A24 and the other A80: STRING firstname lastname (A24) / address (A80). Here is another way to achieve the same result: STRING firstname lastname (A24). STRING address (A80). ... and here is yet another way: STRING firstname (A24). STRING lastname (A24). STRING address (A80).  File: pspp.info, Node: VARIABLE ATTRIBUTE, Next: VARIABLE LABELS, Prev: STRING, Up: Variable Attributes 11.15 VARIABLE ATTRIBUTE ======================== VARIABLE ATTRIBUTE VARIABLES=VAR_LIST ATTRIBUTE=NAME('VALUE') [NAME('VALUE')]... ATTRIBUTE=NAME[INDEX]('VALUE') [NAME[INDEX]('VALUE')]... DELETE=NAME [NAME]... DELETE=NAME[INDEX] [NAME[INDEX]]... 'VARIABLE ATTRIBUTE' adds, modifies, or removes user-defined attributes associated with variables in the active dataset. Custom variable attributes are not interpreted by PSPP, but they are saved as part of system files and may be used by other software that reads them. The required 'VARIABLES' subcommand must come first. Specify the variables to which the following 'ATTRIBUTE' or 'DELETE' subcommand should apply. Use the 'ATTRIBUTE' subcommand to add or modify custom variable attributes. Specify the name of the attribute as an identifier (*note Tokens::), followed by the desired value, in parentheses, as a quoted string. The specified attributes are then added or modified in the variables specified on 'VARIABLES'. Attribute names that begin with '$' are reserved for PSPP's internal use, and attribute names that begin with '@' or '$@' are not displayed by most PSPP commands that display other attributes. Other attribute names are not treated specially. Attributes may also be organized into arrays. To assign to an array element, add an integer array index enclosed in square brackets ('[' and ']') between the attribute name and value. Array indexes start at 1, not 0. An attribute array that has a single element (number 1) is not distinguished from a non-array attribute. Use the 'DELETE' subcommand to delete an attribute from the variable specified on 'VARIABLES'. Specify an attribute name by itself to delete an entire attribute, including all array elements for attribute arrays. Specify an attribute name followed by an array index in square brackets to delete a single element of an attribute array. In the latter case, all the array elements numbered higher than the deleted element are shifted down, filling the vacated position. To associate custom attributes with the entire active dataset, instead of with particular variables, use 'DATAFILE ATTRIBUTE' (*note DATAFILE ATTRIBUTE::) instead. 'VARIABLE ATTRIBUTE' takes effect immediately. It is not affected by conditional and looping structures such as 'DO IF' or 'LOOP'.  File: pspp.info, Node: VARIABLE LABELS, Next: VARIABLE ALIGNMENT, Prev: VARIABLE ATTRIBUTE, Up: Variable Attributes 11.16 VARIABLE LABELS ===================== VARIABLE LABELS VAR_LIST 'VAR_LABEL' [ /VAR_LIST 'VAR_LABEL'] . . . [ /VAR_LIST 'VAR_LABEL'] 'VARIABLE LABELS' associates explanatory names with variables. This name, called a "variable label", is displayed by statistical procedures. To assign a variable label to a group of variables, specify a list of variable names and the variable label as a string. To assign different labels to different variables in the same command, precede the subsequent variable list with a slash ('/').  File: pspp.info, Node: VARIABLE ALIGNMENT, Next: VARIABLE WIDTH, Prev: VARIABLE LABELS, Up: Variable Attributes 11.17 VARIABLE ALIGNMENT ======================== VARIABLE ALIGNMENT VAR_LIST ( LEFT | RIGHT | CENTER ) [ /VAR_LIST ( LEFT | RIGHT | CENTER ) ] . . . [ /VAR_LIST ( LEFT | RIGHT | CENTER ) ] 'VARIABLE ALIGNMENT' sets the alignment of variables for display editing purposes. This only has effect for third party software. It does not affect the display of variables in the PSPP output.  File: pspp.info, Node: VARIABLE WIDTH, Next: VARIABLE LEVEL, Prev: VARIABLE ALIGNMENT, Up: Variable Attributes 11.18 VARIABLE WIDTH ==================== VARIABLE WIDTH VAR_LIST (width) [ /VAR_LIST (width) ] . . . [ /VAR_LIST (width) ] 'VARIABLE WIDTH' sets the column width of variables for display editing purposes. This only affects third party software. It does not affect the display of variables in the PSPP output.  File: pspp.info, Node: VARIABLE LEVEL, Next: VARIABLE ROLE, Prev: VARIABLE WIDTH, Up: Variable Attributes 11.19 VARIABLE LEVEL ==================== VARIABLE LEVEL VAR_LIST ( SCALE | NOMINAL | ORDINAL ) [ /VAR_LIST ( SCALE | NOMINAL | ORDINAL ) ] . . . [ /VAR_LIST ( SCALE | NOMINAL | ORDINAL ) ] 'VARIABLE LEVEL' sets the measurement level of variables. Currently, this has no effect except for certain third party software.  File: pspp.info, Node: VARIABLE ROLE, Next: VECTOR, Prev: VARIABLE LEVEL, Up: Variable Attributes 11.20 VARIABLE ROLE =================== VARIABLE ROLE /ROLE VAR_LIST [/ROLE VAR_LIST]... 'VARIABLE ROLE' sets the intended role of a variable for use in dialog boxes in graphical user interfaces. Each ROLE specifies one of the following roles for the variables that follow it: 'INPUT' An input variable, such as an independent variable. 'TARGET' An output variable, such as an dependent variable. 'BOTH' A variable used for input and output. 'NONE' No role assigned. (This is a variable's default role.) 'PARTITION' Used to break the data into groups for testing. 'SPLIT' No meaning except for certain third party software. (This role's meaning is unrelated to 'SPLIT FILE'.) The PSPPIRE GUI does not yet use variable roles as intended.  File: pspp.info, Node: VECTOR, Next: WRITE FORMATS, Prev: VARIABLE ROLE, Up: Variable Attributes 11.21 VECTOR ============ Two possible syntaxes: VECTOR VEC_NAME=VAR_LIST. VECTOR VEC_NAME_LIST(COUNT [FORMAT]). 'VECTOR' allows a group of variables to be accessed as if they were consecutive members of an array with a vector(index) notation. To make a vector out of a set of existing variables, specify a name for the vector followed by an equals sign ('=') and the variables to put in the vector. The variables must be all numeric or all string, and string variables must have the same width. To make a vector and create variables at the same time, specify one or more vector names followed by a count in parentheses. This will create variables named 'VEC1' through 'VECCOUNT'. By default, the new variables are numeric with format F8.2, but an alternate format may be specified inside the parentheses before or after the count and separated from it by white space or a comma. With a string format such as A8, the variables will be string variables; with a numeric format, they will be numeric. Variable names including the suffixes may not exceed 64 characters in length, and none of the variables may exist prior to 'VECTOR'. Vectors created with 'VECTOR' disappear after any procedure or procedure-like command is executed. The variables contained in the vectors remain, unless they are scratch variables (*note Scratch Variables::). Variables within a vector may be referenced in expressions using 'vector(index)' syntax.  File: pspp.info, Node: WRITE FORMATS, Prev: VECTOR, Up: Variable Attributes 11.22 WRITE FORMATS =================== WRITE FORMATS VAR_LIST (FMT_SPEC) [VAR_LIST (FMT_SPEC)].... 'WRITE FORMATS' sets the write formats for the specified variables to the specified format specification. Its syntax is identical to that of 'FORMATS' (*note FORMATS::), but 'WRITE FORMATS' sets only write formats, not print formats.  File: pspp.info, Node: Data Manipulation, Next: Data Selection, Prev: Variable Attributes, Up: Top 12 Data transformations *********************** The PSPP procedures examined in this chapter manipulate data and prepare the active dataset for later analyses. They do not produce output, as a rule. * Menu: * AGGREGATE:: Summarize multiple cases into a single case. * AUTORECODE:: Automatic recoding of variables. * COMPUTE:: Assigning a variable a calculated value. * COUNT:: Counting variables with particular values. * FLIP:: Exchange variables with cases. * IF:: Conditionally assigning a calculated value. * RECODE:: Mapping values from one set to another. * SORT CASES:: Sort the active dataset.  File: pspp.info, Node: AGGREGATE, Next: AUTORECODE, Up: Data Manipulation 12.1 AGGREGATE ============== AGGREGATE OUTFILE={*,'FILE_NAME',FILE_HANDLE} [MODE={REPLACE, ADDVARIABLES}] /PRESORTED /DOCUMENT /MISSING=COLUMNWISE /BREAK=VAR_LIST /DEST_VAR['LABEL']...=AGR_FUNC(SRC_VARS, ARGS...)... 'AGGREGATE' summarizes groups of cases into single cases. Cases are divided into groups that have the same values for one or more variables called "break variables". Several functions are available for summarizing case contents. The 'OUTFILE' subcommand is required and must appear first. Specify a system file or portable file by file name or file handle (*note File Handles::), or a dataset by its name (*note Datasets::). The aggregated cases are written to this file. If '*' is specified, then the aggregated cases replace the active dataset's data. Use of 'OUTFILE' to write a portable file is a PSPP extension. If 'OUTFILE=*' is given, then the subcommand 'MODE' may also be specified. The mode subcommand has two possible values: 'ADDVARIABLES' or 'REPLACE'. In 'REPLACE' mode, the entire active dataset is replaced by a new dataset which contains just the break variables and the destination varibles. In this mode, the new file will contain as many cases as there are unique combinations of the break variables. In 'ADDVARIABLES' mode, the destination variables will be appended to the existing active dataset. Cases which have identical combinations of values in their break variables, will receive identical values for the destination variables. The number of cases in the active dataset will remain unchanged. Note that if 'ADDVARIABLES' is specified, then the data _must_ be sorted on the break variables. By default, the active dataset will be sorted based on the break variables before aggregation takes place. If the active dataset is already sorted or otherwise grouped in terms of the break variables, specify 'PRESORTED' to save time. 'PRESORTED' is assumed if 'MODE=ADDVARIABLES' is used. Specify 'DOCUMENT' to copy the documents from the active dataset into the aggregate file (*note DOCUMENT::). Otherwise, the aggregate file will not contain any documents, even if the aggregate file replaces the active dataset. Normally, only a single case (for 'SD' and 'SD'., two cases) need be non-missing in each group for the aggregate variable to be non-missing. Specifying '/MISSING=COLUMNWISE' inverts this behavior, so that the aggregate variable becomes missing if any aggregated value is missing. If 'PRESORTED', 'DOCUMENT', or 'MISSING' are specified, they must appear between 'OUTFILE' and 'BREAK'. At least one break variable must be specified on 'BREAK', a required subcommand. The values of these variables are used to divide the active dataset into groups to be summarized. In addition, at least one DEST_VAR must be specified. One or more sets of aggregation variables must be specified. Each set comprises a list of aggregation variables, an equals sign ('='), the name of an aggregation function (see the list below), and a list of source variables in parentheses. Some aggregation functions expect additional arguments following the source variable names. Aggregation variables typically are created with no variable label, value labels, or missing values. Their default print and write formats depend on the aggregation function used, with details given in the table below. A variable label for an aggregation variable may be specified just after the variable's name in the aggregation variable list. Each set must have exactly as many source variables as aggregation variables. Each aggregation variable receives the results of applying the specified aggregation function to the corresponding source variable. The 'MEAN', 'MEDIAN', 'SD', and 'SUM' aggregation functions may only be applied to numeric variables. All the rest may be applied to numeric and string variables. The available aggregation functions are as follows: 'FGT(VAR_NAME, VALUE)' Fraction of values greater than the specified constant. The default format is F5.3. 'FIN(VAR_NAME, LOW, HIGH)' Fraction of values within the specified inclusive range of constants. The default format is F5.3. 'FLT(VAR_NAME, VALUE)' Fraction of values less than the specified constant. The default format is F5.3. 'FIRST(VAR_NAME)' First non-missing value in break group. The aggregation variable receives the complete dictionary information from the source variable. The sort performed by 'AGGREGATE' (and by 'SORT CASES') is stable, so that the first case with particular values for the break variables before sorting will also be the first case in that break group after sorting. 'FOUT(VAR_NAME, LOW, HIGH)' Fraction of values strictly outside the specified range of constants. The default format is F5.3. 'LAST(VAR_NAME)' Last non-missing value in break group. The aggregation variable receives the complete dictionary information from the source variable. The sort performed by 'AGGREGATE' (and by 'SORT CASES') is stable, so that the last case with particular values for the break variables before sorting will also be the last case in that break group after sorting. 'MAX(VAR_NAME)' Maximum value. The aggregation variable receives the complete dictionary information from the source variable. 'MEAN(VAR_NAME)' Arithmetic mean. Limited to numeric values. The default format is F8.2. 'MEDIAN(VAR_NAME)' The median value. Limited to numeric values. The default format is F8.2. 'MIN(VAR_NAME)' Minimum value. The aggregation variable receives the complete dictionary information from the source variable. 'N(VAR_NAME)' Number of non-missing values. The default format is F7.0 if weighting is not enabled, F8.2 if it is (*note WEIGHT::). 'N' Number of cases aggregated to form this group. The default format is F7.0 if weighting is not enabled, F8.2 if it is (*note WEIGHT::). 'NMISS(VAR_NAME)' Number of missing values. The default format is F7.0 if weighting is not enabled, F8.2 if it is (*note WEIGHT::). 'NU(VAR_NAME)' Number of non-missing values. Each case is considered to have a weight of 1, regardless of the current weighting variable (*note WEIGHT::). The default format is F7.0. 'NU' Number of cases aggregated to form this group. Each case is considered to have a weight of 1, regardless of the current weighting variable. The default format is F7.0. 'NUMISS(VAR_NAME)' Number of missing values. Each case is considered to have a weight of 1, regardless of the current weighting variable. The default format is F7.0. 'PGT(VAR_NAME, VALUE)' Percentage between 0 and 100 of values greater than the specified constant. The default format is F5.1. 'PIN(VAR_NAME, LOW, HIGH)' Percentage of values within the specified inclusive range of constants. The default format is F5.1. 'PLT(VAR_NAME, VALUE)' Percentage of values less than the specified constant. The default format is F5.1. 'POUT(VAR_NAME, LOW, HIGH)' Percentage of values strictly outside the specified range of constants. The default format is F5.1. 'SD(VAR_NAME)' Standard deviation of the mean. Limited to numeric values. The default format is F8.2. 'SUM(VAR_NAME)' Sum. Limited to numeric values. The default format is F8.2. Aggregation functions compare string values in terms of internal character codes. On most modern computers, this is ASCII or a superset thereof. The aggregation functions listed above exclude all user-missing values from calculations. To include user-missing values, insert a period ('.') at the end of the function name. (e.g. 'SUM.'). (Be aware that specifying such a function as the last token on a line will cause the period to be interpreted as the end of the command.) 'AGGREGATE' both ignores and cancels the current 'SPLIT FILE' settings (*note SPLIT FILE::). pspp-1.4.1/doc/variables.texi0000644000175000017500000007132213571051220015524 0ustar00blpblp00000000000000@c PSPP - a program for statistical analysis. @c Copyright (C) 2017 Free Software Foundation, Inc. @c Permission is granted to copy, distribute and/or modify this document @c under the terms of the GNU Free Documentation License, Version 1.3 @c or any later version published by the Free Software Foundation; @c with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. @c A copy of the license is included in the section entitled "GNU @c Free Documentation License". @c @node Variable Attributes @chapter Manipulating variables The variables in the active dataset dictionary are important. There are several utility functions for examining and adjusting them. @menu * ADD VALUE LABELS:: Add value labels to variables. * DELETE VARIABLES:: Delete variables. * DISPLAY:: Display information about the active dataset. * FORMATS:: Set print and write formats. * LEAVE:: Don't clear variables between cases. * MISSING VALUES:: Set missing values for variables. * MODIFY VARS:: Rename, reorder, and drop variables. * MRSETS:: Add, modify, and list multiple response sets. * NUMERIC:: Create new numeric variables. * PRINT FORMATS:: Set variable print formats. * RENAME VARIABLES:: Rename variables. * SORT VARIABLES:: Reorder variables. * VALUE LABELS:: Set value labels for variables. * STRING:: Create new string variables. * VARIABLE ATTRIBUTE:: Set custom attributes on variables. * VARIABLE LABELS:: Set variable labels for variables. * VARIABLE ALIGNMENT:: Set the alignment for display. * VARIABLE WIDTH:: Set the display width. * VARIABLE LEVEL:: Set the measurement level. * VARIABLE ROLE:: Set the role that a variable fills in analysis. * VECTOR:: Declare an array of variables. * WRITE FORMATS:: Set variable write formats. @end menu @node ADD VALUE LABELS @section ADD VALUE LABELS @vindex ADD VALUE LABELS @display ADD VALUE LABELS /@var{var_list} @var{value} '@var{label}' [@var{value} '@var{label}']@dots{} @end display @cmd{ADD VALUE LABELS} has the same syntax and purpose as @cmd{VALUE LABELS} (@pxref{VALUE LABELS}), but it does not clear value labels from the variables before adding the ones specified. @node DELETE VARIABLES @section DELETE VARIABLES @vindex DELETE VARIABLES @display DELETE VARIABLES @var{var_list}. @end display @cmd{DELETE VARIABLES} deletes the specified variables from the dictionary. It may not be used to delete all variables from the dictionary; use @cmd{NEW FILE} to do that (@pxref{NEW FILE}). @cmd{DELETE VARIABLES} should not be used after defining transformations but before executing a procedure. If it is used in such a context, it causes the data to be read. If it is used while @cmd{TEMPORARY} is in effect, it causes the temporary transformations to become permanent. @node DISPLAY @section DISPLAY @vindex DISPLAY @display DISPLAY [SORTED] NAMES [[/VARIABLES=]@var{var_list}]. DISPLAY [SORTED] INDEX [[/VARIABLES=]@var{var_list}]. DISPLAY [SORTED] LABELS [[/VARIABLES=]@var{var_list}]. DISPLAY [SORTED] VARIABLES [[/VARIABLES=]@var{var_list}]. DISPLAY [SORTED] DICTIONARY [[/VARIABLES=]@var{var_list}]. DISPLAY [SORTED] SCRATCH [[/VARIABLES=]@var{var_list}]. DISPLAY [SORTED] ATTRIBUTES [[/VARIABLES=]@var{var_list}]. DISPLAY [SORTED] @@ATTRIBUTES [[/VARIABLES=]@var{var_list}]. DISPLAY [SORTED] VECTORS. @end display @cmd{DISPLAY} displays information about the active dataset. A variety of different forms of information can be requested. The following keywords primarily cause information about variables to be displayed. With these keywords, by default information is displayed about all variable in the active dataset, in the order that variables occur in the active dataset dictionary. The @subcmd{SORTED} keyword causes output to be sorted alphabetically by variable name. The @subcmd{VARIABLES} subcommand limits output to the specified variables. @table @asis @item NAMES The variables' names are displayed. @item INDEX The variables' names are displayed along with a value describing their position within the active dataset dictionary. @item LABELS Variable names, positions, and variable labels are displayed. @item VARIABLES Variable names, positions, print and write formats, and missing values are displayed. @item DICTIONARY Variable names, positions, print and write formats, missing values, variable labels, and value labels are displayed. @item SCRATCH Variable names are displayed, for scratch variables only (@pxref{Scratch Variables}). @item ATTRIBUTES @itemx @@ATTRIBUTES Datafile and variable attributes are displayed. The first form of the command omits those attributes whose names begin with @code{@@} or @code{$@@}. In the second for, all datafile and variable attributes are displayed. @end table With the @code{VECTOR} keyword, @cmd{DISPLAY} lists all the currently declared vectors. If the @subcmd{SORTED} keyword is given, the vectors are listed in alphabetical order; otherwise, they are listed in textual order of definition within the @pspp{} syntax file. For related commands, see @ref{DISPLAY DOCUMENTS} and @ref{DISPLAY FILE LABEL}. @node FORMATS @section FORMATS @vindex FORMATS @display FORMATS @var{var_list} (@var{fmt_spec}) [@var{var_list} (@var{fmt_spec})]@dots{}. @end display @cmd{FORMATS} set both print and write formats for the specified variables to the specified format specification. @xref{Input and Output Formats}. Specify a list of variables followed by a format specification in parentheses. The print and write formats of the specified variables will be changed. All of the variables listed together must have the same type and, for string variables, the same width. Additional lists of variables and formats may be included following the first one. @cmd{FORMATS} takes effect immediately. It is not affected by conditional and looping structures such as @cmd{DO IF} or @cmd{LOOP}. @node LEAVE @section LEAVE @vindex LEAVE @display LEAVE @var{var_list}. @end display @cmd{LEAVE} prevents the specified variables from being reinitialized whenever a new case is processed. Normally, when a data file is processed, every variable in the active dataset is initialized to the system-missing value or spaces at the beginning of processing for each case. When a variable has been specified on @cmd{LEAVE}, this is not the case. Instead, that variable is initialized to 0 (not system-missing) or spaces for the first case. After that, it retains its value between cases. This becomes useful for counters. For instance, in the example below the variable @code{SUM} maintains a running total of the values in the @code{ITEM} variable. @example DATA LIST /ITEM 1-3. COMPUTE SUM=SUM+ITEM. PRINT /ITEM SUM. LEAVE SUM BEGIN DATA. 123 404 555 999 END DATA. @end example @noindent Partial output from this example: @example 123 123.00 404 527.00 555 1082.00 999 2081.00 @end example It is best to use @cmd{LEAVE} command immediately before invoking a procedure command, because the left status of variables is reset by certain transformations---for instance, @cmd{COMPUTE} and @cmd{IF}. Left status is also reset by all procedure invocations. @node MISSING VALUES @section MISSING VALUES @vindex MISSING VALUES @display MISSING VALUES @var{var_list} (@var{missing_values}). where @var{missing_values} takes one of the following forms: @var{num1} @var{num1}, @var{num2} @var{num1}, @var{num2}, @var{num3} @var{num1} THRU @var{num2} @var{num1} THRU @var{num2}, @var{num3} @var{string1} @var{string1}, @var{string2} @var{string1}, @var{string2}, @var{string3} As part of a range, @subcmd{LO} or @subcmd{LOWEST} may take the place of @var{num1}; @subcmd{HI} or @subcmd{HIGHEST} may take the place of @var{num2}. @end display @cmd{MISSING VALUES} sets user-missing values for numeric and string variables. Long string variables may have missing values, but characters after the first 8 bytes of the missing value must be spaces. Specify a list of variables, followed by a list of their user-missing values in parentheses. Up to three discrete values may be given, or, for numeric variables only, a range of values optionally accompanied by a single discrete value. Ranges may be open-ended on one end, indicated through the use of the keyword @subcmd{LO} or @subcmd{LOWEST} or @subcmd{HI} or @subcmd{HIGHEST}. The @cmd{MISSING VALUES} command takes effect immediately. It is not affected by conditional and looping constructs such as @cmd{DO IF} or @cmd{LOOP}. @node MODIFY VARS @section MODIFY VARS @vindex MODIFY VARS @display MODIFY VARS /REORDER=@{FORWARD,BACKWARD@} @{POSITIONAL,ALPHA@} (@var{var_list})@dots{} /RENAME=(@var{old_names}=@var{new_names})@dots{} /@{DROP,KEEP@}=@var{var_list} /MAP @end display @cmd{MODIFY VARS} reorders, renames, and deletes variables in the active dataset. At least one subcommand must be specified, and no subcommand may be specified more than once. @subcmd{DROP} and @subcmd{KEEP} may not both be specified. The @subcmd{REORDER} subcommand changes the order of variables in the active dataset. Specify one or more lists of variable names in parentheses. By default, each list of variables is rearranged into the specified order. To put the variables into the reverse of the specified order, put keyword @subcmd{BACKWARD} before the parentheses. To put them into alphabetical order in the dictionary, specify keyword @subcmd{ALPHA} before the parentheses. @subcmd{BACKWARD} and @subcmd{ALPHA} may also be combined. To rename variables in the active dataset, specify @subcmd{RENAME}, an equals sign (@samp{=}), and lists of the old variable names and new variable names separated by another equals sign within parentheses. There must be the same number of old and new variable names. Each old variable is renamed to the corresponding new variable name. Multiple parenthesized groups of variables may be specified. The @subcmd{DROP} subcommand deletes a specified list of variables from the active dataset. @cmd{MODIFY VARS} may not be used to delete all variables from the dictionary; use @cmd{NEW FILE} to do that (@pxref{NEW FILE}). The @subcmd{KEEP} subcommand keeps the specified list of variables in the active dataset. Any unlisted variables are deleted from the active dataset. @subcmd{MAP} is currently ignored. If either @subcmd{DROP} or @subcmd{KEEP} is specified, the data is read; otherwise it is not. @cmd{MODIFY VARS} may not be specified following @cmd{TEMPORARY} (@pxref{TEMPORARY}). @node MRSETS @section MRSETS @vindex MRSETS @display MRSETS /MDGROUP NAME=@var{name} VARIABLES=@var{var_list} VALUE=@var{value} [CATEGORYLABELS=@{VARLABELS,COUNTEDVALUES@}] [@{LABEL='@var{label}',LABELSOURCE=VARLABEL@}] /MCGROUP NAME=@var{name} VARIABLES=@var{var_list} [LABEL='@var{label}'] /DELETE NAME=@{[@var{names}],ALL@} /DISPLAY NAME=@{[@var{names}],ALL@} @end display @cmd{MRSETS} creates, modifies, deletes, and displays multiple response sets. A multiple response set is a set of variables that represent multiple responses to a single survey question in one of the two following ways: @itemize @bullet @item A @dfn{multiple dichotomy set} is analogous to a survey question with a set of checkboxes. Each variable in the set is treated in a Boolean fashion: one value (the "counted value") means that the box was checked, and any other value means that it was not. @item A @dfn{multiple category set} represents a survey question where the respondent is instructed to list up to @var{n} choices. Each variable represents one of the responses. @end itemize Any number of subcommands may be specified in any order. The @subcmd{MDGROUP} subcommand creates a new multiple dichotomy set or replaces an existing multiple response set. The @subcmd{NAME}, @subcmd{VARIABLES}, and @subcmd{VALUE} specifications are required. The others are optional: @itemize @bullet @item @var{NAME} specifies the name used in syntax for the new multiple dichotomy set. The name must begin with @samp{$}; it must otherwise follow the rules for identifiers (@pxref{Tokens}). @item @subcmd{VARIABLES} specifies the variables that belong to the set. At least two variables must be specified. The variables must be all string or all numeric. @item @subcmd{VALUE} specifies the counted value. If the variables are numeric, the value must be an integer. If the variables are strings, then the value must be a string that is no longer than the shortest of the variables in the set (ignoring trailing spaces). @item @subcmd{CATEGORYLABELS} optionally specifies the source of the labels for each category in the set: @itemize @minus @item @subcmd{VARLABELS}, the default, uses variable labels or, for variables without variable labels, variable names. @pspp{} warns if two variables have the same variable label, since these categories cannot be distinguished in output. @item @subcmd{COUNTEDVALUES} instead uses each variable's value label for the counted value. @pspp{} warns if two variables have the same value label for the counted value or if one of the variables lacks a value label, since such categories cannot be distinguished in output. @end itemize @item @subcmd{LABEL} optionally specifies a label for the multiple response set. If neither @subcmd{LABEL} nor @subcmd{LABELSOURCE=VARLABEL} is specified, the set is unlabeled. @item @subcmd{LABELSOURCE=VARLABEL} draws the multiple response set's label from the first variable label among the variables in the set; if none of the variables has a label, the name of the first variable is used. @subcmd{LABELSOURCE=VARLABEL} must be used with @subcmd{CATEGORYLABELS=COUNTEDVALUES}. It is mutually exclusive with @subcmd{LABEL}. @end itemize The @subcmd{MCGROUP} subcommand creates a new multiple category set or replaces an existing multiple response set. The @subcmd{NAME} and @subcmd{VARIABLES} specifications are required, and @subcmd{LABEL} is optional. Their meanings are as described above in @subcmd{MDGROUP}. @pspp{} warns if two variables in the set have different value labels for a single value, since each of the variables in the set should have the same possible categories. The @subcmd{DELETE} subcommand deletes multiple response groups. A list of groups may be named within a set of required square brackets, or ALL may be used to delete all groups. The @subcmd{DISPLAY} subcommand displays information about defined multiple response sets. Its syntax is the same as the @subcmd{DELETE} subcommand. Multiple response sets are saved to and read from system files by, e.g., the @cmd{SAVE} and @cmd{GET} command. Otherwise, multiple response sets are currently used only by third party software. @node NUMERIC @section NUMERIC @vindex NUMERIC @display NUMERIC @var{var_list} [(@var{fmt_spec})] [/@var{var_list} [(@var{fmt_spec})]]@dots{} @end display @cmd{NUMERIC} explicitly declares new numeric variables, optionally setting their output formats. Specify the names of the new numeric variables as @var{var_list}. If you wish to set the variables' output formats, follow their names by an output format specification in parentheses (@pxref{Input and Output Formats}); otherwise, the default is F8.2. Variables created with @cmd{NUMERIC} are initialized to the system-missing value. @node PRINT FORMATS @section PRINT FORMATS @vindex PRINT FORMATS @display PRINT FORMATS @var{var_list} (@var{fmt_spec}) [@var{var_list} (@var{fmt_spec})]@dots{}. @end display @cmd{PRINT FORMATS} sets the print formats for the specified variables to the specified format specification. Its syntax is identical to that of @cmd{FORMATS} (@pxref{FORMATS}), but @cmd{PRINT FORMATS} sets only print formats, not write formats. @node RENAME VARIABLES @section RENAME VARIABLES @vindex RENAME VARIABLES @display RENAME VARIABLES (@var{old_names}=@var{new_names})@dots{} . @end display @cmd{RENAME VARIABLES} changes the names of variables in the active dataset. Specify lists of the old variable names and new variable names, separated by an equals sign (@samp{=}), within parentheses. There must be the same number of old and new variable names. Each old variable is renamed to the corresponding new variable name. Multiple parenthesized groups of variables may be specified. When the old and new variable names contain only a single variable name, the parentheses are optional. @cmd{RENAME VARIABLES} takes effect immediately. It does not cause the data to be read. @cmd{RENAME VARIABLES} may not be specified following @cmd{TEMPORARY} (@pxref{TEMPORARY}). @node SORT VARIABLES @section SORT VARIABLES @vindex SORT VARIABLES @display SORT VARIABLES [BY] (NAME | TYPE | FORMAT | LABEL | VALUES | MISSING | MEASURE | ROLE | COLUMNS | ALIGNMENT | ATTRIBUTE @var{name}) [(D)]. @end display @cmd{SORT VARIABLES} reorders the variables in the active dataset. The main specification is one of the following identifiers, which determines how the variables are sorted: @table @asis @item NAME Sorts the variables according to their names, in a case-insensitive fashion. However, when variable names differ only in a number at the end, they are sorted numerically. For example, @code{VAR5} is sorted before @code{VAR400} even though @samp{4} precedes @samp{5}. @item TYPE Sorts numeric variables before string variables, and shorter string variables before longer ones. @item FORMAT Groups variables by print format; within a format, sorts narrower formats before wider ones; with the same format and width, sorts fewer decimal places before more decimal places. @xref{FORMATS}. @item LABEL Sorts variables without a variable label before those with one. @xref{VARIABLE LABELS}. @item VALUES Sorts variables without value labels before those with some. @xref{VALUE LABELS}. @item MISSING Sorts variables without missing values before those with some. @xref{MISSING VALUES}. @item MEASURE Sorts nominal variables first, followed by ordinal variables, followed by scale variables. @xref{VARIABLE LEVEL}. @item ROLE Groups variables according to their role. @xref{VARIABLE ROLE}. @item COLUMNS Sorts variables in ascending display width. @xref{VARIABLE WIDTH}. @item ALIGNMENT Sorts variables according to their alignment, first left-aligned, then right-aligned, then centered. @xref{VARIABLE ALIGNMENT}. @item ATTRIBUTE @var{name} Sorts variables according to the first value of their @var{name} attribute. Variables without attribute are sorted first. @xref{VARIABLE ATTRIBUTE}. @end table Only one sort criterion can be specified. The sort is ``stable,'' so to sort on multiple criteria one may perform multiple sorts. For example, the following will sort primarily based on alignment, with variables that have the same alignment ordered based on display width: @example SORT VARIABLES BY COLUMNS. SORT VARIABLES BY ALIGNMENT. @end example Specify @code{(D)} to reverse the sort order. @node VALUE LABELS @section VALUE LABELS @vindex VALUE LABELS @display VALUE LABELS /@var{var_list} @var{value} '@var{label}' [@var{value} '@var{label}']@dots{} @end display @cmd{VALUE LABELS} allows values of variables to be associated with labels. In this way, a short value can stand for a longer, more descriptive label. Both numeric and string variables can be given labels. For string variables, the values are case-sensitive, so that, for example, a capitalized value and its lowercase variant would have to be labeled separately if both are present in the data. To set up value labels for one or more variables, specify the variable names after a slash (@samp{/}), followed by a list of values and their associated labels, separated by spaces. Value labels in output are normally broken into lines automatically. Put @samp{\n} in a label string to force a line break at that point. The label may still be broken into lines at additional points. Before @cmd{VALUE LABELS} is executed, any existing value labels are cleared from the variables specified. Use @cmd{ADD VALUE LABELS} (@pxref{ADD VALUE LABELS}) to add value labels without clearing those already present. @node STRING @section STRING @vindex STRING @display STRING @var{var_list} (@var{fmt_spec}) [/@var{var_list} (@var{fmt_spec})] [@dots{}]. @end display @cmd{STRING} creates new string variables for use in transformations. Specify a list of names for the variable you want to create, followed by the desired output format specification in parentheses (@pxref{Input and Output Formats}). Variable widths are implicitly derived from the specified output formats. The created variables will be initialized to spaces. If you want to create several variables with distinct output formats, you can either use two or more separate @cmd{STRING} commands, or you can specify further variable list and format specification pairs, each separated from the previous by a slash (@samp{/}). The following example is one way to create three string variables; Two of the variables have format A24 and the other A80: @example STRING firstname lastname (A24) / address (A80). @end example @noindent Here is another way to achieve the same result: @example STRING firstname lastname (A24). STRING address (A80). @end example @noindent @dots{} and here is yet another way: @example STRING firstname (A24). STRING lastname (A24). STRING address (A80). @end example @node VARIABLE ATTRIBUTE @section VARIABLE ATTRIBUTE @vindex VARIABLE ATTRIBUTE @display VARIABLE ATTRIBUTE VARIABLES=@var{var_list} ATTRIBUTE=@var{name}('@var{value}') [@var{name}('@var{value}')]@dots{} ATTRIBUTE=@var{name}@b{[}@var{index}@b{]}('@var{value}') [@var{name}@b{[}@var{index}@b{]}('@var{value}')]@dots{} DELETE=@var{name} [@var{name}]@dots{} DELETE=@var{name}@b{[}@var{index}@b{]} [@var{name}@b{[}@var{index}@b{]}]@dots{} @end display @cmd{VARIABLE ATTRIBUTE} adds, modifies, or removes user-defined attributes associated with variables in the active dataset. Custom variable attributes are not interpreted by @pspp{}, but they are saved as part of system files and may be used by other software that reads them. The required @subcmd{VARIABLES} subcommand must come first. Specify the variables to which the following @subcmd{ATTRIBUTE} or @subcmd{DELETE} subcommand should apply. Use the @subcmd{ATTRIBUTE} subcommand to add or modify custom variable attributes. Specify the name of the attribute as an identifier (@pxref{Tokens}), followed by the desired value, in parentheses, as a quoted string. The specified attributes are then added or modified in the variables specified on @subcmd{VARIABLES}. Attribute names that begin with @code{$} are reserved for @pspp{}'s internal use, and attribute names that begin with @code{@@} or @code{$@@} are not displayed by most @pspp{} commands that display other attributes. Other attribute names are not treated specially. Attributes may also be organized into arrays. To assign to an array element, add an integer array index enclosed in square brackets (@code{[} and @code{]}) between the attribute name and value. Array indexes start at 1, not 0. An attribute array that has a single element (number 1) is not distinguished from a non-array attribute. Use the @subcmd{DELETE} subcommand to delete an attribute from the variable specified on @subcmd{VARIABLES}. Specify an attribute name by itself to delete an entire attribute, including all array elements for attribute arrays. Specify an attribute name followed by an array index in square brackets to delete a single element of an attribute array. In the latter case, all the array elements numbered higher than the deleted element are shifted down, filling the vacated position. To associate custom attributes with the entire active dataset, instead of with particular variables, use @cmd{DATAFILE ATTRIBUTE} (@pxref{DATAFILE ATTRIBUTE}) instead. @cmd{VARIABLE ATTRIBUTE} takes effect immediately. It is not affected by conditional and looping structures such as @cmd{DO IF} or @cmd{LOOP}. @node VARIABLE LABELS @section VARIABLE LABELS @vindex VARIABLE LABELS @display VARIABLE LABELS @var{var_list} '@var{var_label}' [ /@var{var_list} '@var{var_label}'] . . . [ /@var{var_list} '@var{var_label}'] @end display @cmd{VARIABLE LABELS} associates explanatory names with variables. This name, called a @dfn{variable label}, is displayed by statistical procedures. To assign a variable label to a group of variables, specify a list of variable names and the variable label as a string. To assign different labels to different variables in the same command, precede the subsequent variable list with a slash (@samp{/}). @node VARIABLE ALIGNMENT @section VARIABLE ALIGNMENT @vindex VARIABLE ALIGNMENT @display VARIABLE ALIGNMENT @var{var_list} ( LEFT | RIGHT | CENTER ) [ /@var{var_list} ( LEFT | RIGHT | CENTER ) ] . . . [ /@var{var_list} ( LEFT | RIGHT | CENTER ) ] @end display @cmd{VARIABLE ALIGNMENT} sets the alignment of variables for display editing purposes. This only has effect for third party software. It does not affect the display of variables in the @pspp{} output. @node VARIABLE WIDTH @section VARIABLE WIDTH @vindex VARIABLE WIDTH @display VARIABLE WIDTH @var{var_list} (width) [ /@var{var_list} (width) ] . . . [ /@var{var_list} (width) ] @end display @cmd{VARIABLE WIDTH} sets the column width of variables for display editing purposes. This only affects third party software. It does not affect the display of variables in the @pspp{} output. @node VARIABLE LEVEL @section VARIABLE LEVEL @vindex VARIABLE LEVEL @display VARIABLE LEVEL @var{var_list} ( SCALE | NOMINAL | ORDINAL ) [ /@var{var_list} ( SCALE | NOMINAL | ORDINAL ) ] . . . [ /@var{var_list} ( SCALE | NOMINAL | ORDINAL ) ] @end display @cmd{VARIABLE LEVEL} sets the measurement level of variables. Currently, this has no effect except for certain third party software. @node VARIABLE ROLE @section VARIABLE ROLE @vindex VARIABLE ROLE @display VARIABLE ROLE /@var{role} @var{var_list} [/@var{role} @var{var_list}]@dots{} @end display @cmd{VARIABLE ROLE} sets the intended role of a variable for use in dialog boxes in graphical user interfaces. Each @var{role} specifies one of the following roles for the variables that follow it: @table @code @item INPUT An input variable, such as an independent variable. @item TARGET An output variable, such as an dependent variable. @item BOTH A variable used for input and output. @item NONE No role assigned. (This is a variable's default role.) @item PARTITION Used to break the data into groups for testing. @item SPLIT No meaning except for certain third party software. (This role's meaning is unrelated to @cmd{SPLIT FILE}.) @end table The PSPPIRE GUI does not yet use variable roles as intended. @node VECTOR @section VECTOR @vindex VECTOR @display Two possible syntaxes: VECTOR @var{vec_name}=@var{var_list}. VECTOR @var{vec_name_list}(@var{count} [@var{format}]). @end display @cmd{VECTOR} allows a group of variables to be accessed as if they were consecutive members of an array with a vector(index) notation. To make a vector out of a set of existing variables, specify a name for the vector followed by an equals sign (@samp{=}) and the variables to put in the vector. The variables must be all numeric or all string, and string variables must have the same width. To make a vector and create variables at the same time, specify one or more vector names followed by a count in parentheses. This will create variables named @code{@var{vec}1} through @code{@var{vec}@var{count}}. By default, the new variables are numeric with format F8.2, but an alternate format may be specified inside the parentheses before or after the count and separated from it by white space or a comma. With a string format such as A8, the variables will be string variables; with a numeric format, they will be numeric. Variable names including the suffixes may not exceed 64 characters in length, and none of the variables may exist prior to @cmd{VECTOR}. Vectors created with @cmd{VECTOR} disappear after any procedure or procedure-like command is executed. The variables contained in the vectors remain, unless they are scratch variables (@pxref{Scratch Variables}). Variables within a vector may be referenced in expressions using @code{vector(index)} syntax. @node WRITE FORMATS @section WRITE FORMATS @vindex WRITE FORMATS @display WRITE FORMATS @var{var_list} (@var{fmt_spec}) [@var{var_list} (@var{fmt_spec})]@dots{}. @end display @cmd{WRITE FORMATS} sets the write formats for the specified variables to the specified format specification. Its syntax is identical to that of @cmd{FORMATS} (@pxref{FORMATS}), but @cmd{WRITE FORMATS} sets only write formats, not print formats. pspp-1.4.1/doc/data-io.texi0000644000175000017500000014627413571051220015103 0ustar00blpblp00000000000000@c PSPP - a program for statistical analysis. @c Copyright (C) 2017 Free Software Foundation, Inc. @c Permission is granted to copy, distribute and/or modify this document @c under the terms of the GNU Free Documentation License, Version 1.3 @c or any later version published by the Free Software Foundation; @c with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. @c A copy of the license is included in the section entitled "GNU @c Free Documentation License". @c @c (modify-syntax-entry ?_ "w") @c (modify-syntax-entry ?' "'") @c (modify-syntax-entry ?@ "'") @node Data Input and Output @chapter Data Input and Output @cindex input @cindex output @cindex data @cindex cases @cindex observations Data are the focus of the @pspp{} language. Each datum belongs to a @dfn{case} (also called an @dfn{observation}). Each case represents an individual or ``experimental unit''. For example, in the results of a survey, the names of the respondents, their sex, age, etc.@: and their responses are all data and the data pertaining to single respondent is a case. This chapter examines the @pspp{} commands for defining variables and reading and writing data. There are alternative commands to read data from predefined sources such as system files or databases (@xref{GET, GET DATA}.) @quotation Note These commands tell @pspp{} how to read data, but the data will not actually be read until a procedure is executed. @end quotation @menu * BEGIN DATA:: Embed data within a syntax file. * CLOSE FILE HANDLE:: Close a file handle. * DATAFILE ATTRIBUTE:: Set custom attributes on data files. * DATASET:: Manage multiple datasets. * DATA LIST:: Fundamental data reading command. * END CASE:: Output the current case. * END FILE:: Terminate the current input program. * FILE HANDLE:: Support for special file formats. * INPUT PROGRAM:: Support for complex input programs. * LIST:: List cases in the active dataset. * NEW FILE:: Clear the active dataset. * MATRIX DATA:: Defining matrix material for procedures. * PRINT:: Display values in print formats. * PRINT EJECT:: Eject the current page then print. * PRINT SPACE:: Print blank lines. * REREAD:: Take another look at the previous input line. * REPEATING DATA:: Multiple cases on a single line. * WRITE:: Display values in write formats. @end menu @node BEGIN DATA @section BEGIN DATA @vindex BEGIN DATA @vindex END DATA @cindex Embedding data in syntax files @cindex Data, embedding in syntax files @display BEGIN DATA. @dots{} END DATA. @end display @cmd{BEGIN DATA} and @cmd{END DATA} can be used to embed raw ASCII data in a @pspp{} syntax file. @cmd{DATA LIST} or another input procedure must be used before @cmd{BEGIN DATA} (@pxref{DATA LIST}). @cmd{BEGIN DATA} and @cmd{END DATA} must be used together. @cmd{END DATA} must appear by itself on a single line, with no leading white space and exactly one space between the words @code{END} and @code{DATA}, like this: @example END DATA. @end example @node CLOSE FILE HANDLE @section CLOSE FILE HANDLE @display CLOSE FILE HANDLE @var{handle_name}. @end display @cmd{CLOSE FILE HANDLE} disassociates the name of a file handle with a given file. The only specification is the name of the handle to close. Afterward @cmd{FILE HANDLE}. The file named INLINE, which represents data entered between @cmd{BEGIN DATA} and @cmd{END DATA}, cannot be closed. Attempts to close it with @cmd{CLOSE FILE HANDLE} have no effect. @cmd{CLOSE FILE HANDLE} is a @pspp{} extension. @node DATAFILE ATTRIBUTE @section DATAFILE ATTRIBUTE @vindex DATAFILE ATTRIBUTE @display DATAFILE ATTRIBUTE ATTRIBUTE=@var{name}('@var{value}') [@var{name}('@var{value}')]@dots{} ATTRIBUTE=@var{name}@b{[}@var{index}@b{]}('@var{value}') [@var{name}@b{[}@var{index}@b{]}('@var{value}')]@dots{} DELETE=@var{name} [@var{name}]@dots{} DELETE=@var{name}@b{[}@var{index}@b{]} [@var{name}@b{[}@var{index}@b{]}]@dots{} @end display @cmd{DATAFILE ATTRIBUTE} adds, modifies, or removes user-defined attributes associated with the active dataset. Custom data file attributes are not interpreted by @pspp{}, but they are saved as part of system files and may be used by other software that reads them. Use the @subcmd{ATTRIBUTE} subcommand to add or modify a custom data file attribute. Specify the name of the attribute as an identifier (@pxref{Tokens}), followed by the desired value, in parentheses, as a quoted string. Attribute names that begin with @code{$} are reserved for @pspp{}'s internal use, and attribute names that begin with @code{@@} or @code{$@@} are not displayed by most @pspp{} commands that display other attributes. Other attribute names are not treated specially. Attributes may also be organized into arrays. To assign to an array element, add an integer array index enclosed in square brackets (@code{[} and @code{]}) between the attribute name and value. Array indexes start at 1, not 0. An attribute array that has a single element (number 1) is not distinguished from a non-array attribute. Use the @subcmd{DELETE} subcommand to delete an attribute. Specify an attribute name by itself to delete an entire attribute, including all array elements for attribute arrays. Specify an attribute name followed by an array index in square brackets to delete a single element of an attribute array. In the latter case, all the array elements numbered higher than the deleted element are shifted down, filling the vacated position. To associate custom attributes with particular variables, instead of with the entire active dataset, use @cmd{VARIABLE ATTRIBUTE} (@pxref{VARIABLE ATTRIBUTE}) instead. @cmd{DATAFILE ATTRIBUTE} takes effect immediately. It is not affected by conditional and looping structures such as @cmd{DO IF} or @cmd{LOOP}. @node DATASET @section DATASET commands @vindex DATASET @display DATASET NAME @var{name} [WINDOW=@{ASIS,FRONT@}]. DATASET ACTIVATE @var{name} [WINDOW=@{ASIS,FRONT@}]. DATASET COPY @var{name} [WINDOW=@{MINIMIZED,HIDDEN,FRONT@}]. DATASET DECLARE @var{name} [WINDOW=@{MINIMIZED,HIDDEN,FRONT@}]. DATASET CLOSE @{@var{name},*,ALL@}. DATASET DISPLAY. @end display The @cmd{DATASET} commands simplify use of multiple datasets within a @pspp{} session. They allow datasets to be created and destroyed. At any given time, most @pspp{} commands work with a single dataset, called the active dataset. @vindex DATASET NAME The DATASET NAME command gives the active dataset the specified name, or if it already had a name, it renames it. If another dataset already had the given name, that dataset is deleted. @vindex DATASET ACTIVATE The DATASET ACTIVATE command selects the named dataset, which must already exist, as the active dataset. Before switching the active dataset, any pending transformations are executed, as if @cmd{EXECUTE} had been specified. If the active dataset is unnamed before switching, then it is deleted and becomes unavailable after switching. @vindex DATASET COPY The DATASET COPY command creates a new dataset with the specified name, whose contents are a copy of the active dataset. Any pending transformations are executed, as if @cmd{EXECUTE} had been specified, before making the copy. If a dataset with the given name already exists, it is replaced. If the name is the name of the active dataset, then the active dataset becomes unnamed. @vindex DATASET DECLARE The DATASET DECLARE command creates a new dataset that is initially ``empty,'' that is, it has no dictionary or data. If a dataset with the given name already exists, this has no effect. The new dataset can be used with commands that support output to a dataset, e.g. AGGREGATE (@pxref{AGGREGATE}). @vindex DATASET CLOSE The DATASET CLOSE command deletes a dataset. If the active dataset is specified by name, or if @samp{*} is specified, then the active dataset becomes unnamed. If a different dataset is specified by name, then it is deleted and becomes unavailable. Specifying ALL deletes all datasets except for the active dataset, which becomes unnamed. @vindex DATASET DISPLAY The DATASET DISPLAY command lists all the currently defined datasets. Many DATASET commands accept an optional @subcmd{WINDOW} subcommand. In the @pspp{}IRE GUI, the value given for this subcommand influences how the dataset's window is displayed. Outside the GUI, the @subcmd{WINDOW} subcommand has no effect. The valid values are: @table @asis @item ASIS Do not change how the window is displayed. This is the default for DATASET NAME and DATASET ACTIVATE. @item FRONT Raise the dataset's window to the top. Make it the default dataset for running syntax. @item MINIMIZED Display the window ``minimized'' to an icon. Prefer other datasets for running syntax. This is the default for DATASET COPY and DATASET DECLARE. @item HIDDEN Hide the dataset's window. Prefer other datasets for running syntax. @end table @node DATA LIST @section DATA LIST @vindex DATA LIST @cindex reading data from a file @cindex data, reading from a file @cindex data, embedding in syntax files @cindex embedding data in syntax files Used to read text or binary data, @cmd{DATA LIST} is the most fundamental data-reading command. Even the more sophisticated input methods use @cmd{DATA LIST} commands as a building block. Understanding @cmd{DATA LIST} is important to understanding how to use @pspp{} to read your data files. There are two major variants of @cmd{DATA LIST}, which are fixed format and free format. In addition, free format has a minor variant, list format, which is discussed in terms of its differences from vanilla free format. Each form of @cmd{DATA LIST} is described in detail below. @xref{GET DATA}, for a command that offers a few enhancements over DATA LIST and that may be substituted for DATA LIST in many situations. @menu * DATA LIST FIXED:: Fixed columnar locations for data. * DATA LIST FREE:: Any spacing you like. * DATA LIST LIST:: Each case must be on a single line. @end menu @node DATA LIST FIXED @subsection DATA LIST FIXED @vindex DATA LIST FIXED @cindex reading fixed-format data @cindex fixed-format data, reading @cindex data, fixed-format, reading @cindex embedding fixed-format data @display DATA LIST [FIXED] @{TABLE,NOTABLE@} [FILE='@var{file_name}' [ENCODING='@var{encoding}']] [RECORDS=@var{record_count}] [END=@var{end_var}] [SKIP=@var{record_count}] /[line_no] @var{var_spec}@dots{} where each @var{var_spec} takes one of the forms @var{var_list} @var{start}-@var{end} [@var{type_spec}] @var{var_list} (@var{fortran_spec}) @end display @cmd{DATA LIST FIXED} is used to read data files that have values at fixed positions on each line of single-line or multiline records. The keyword FIXED is optional. The @subcmd{FILE} subcommand must be used if input is to be taken from an external file. It may be used to specify a file name as a string or a file handle (@pxref{File Handles}). If the @subcmd{FILE} subcommand is not used, then input is assumed to be specified within the command file using @cmd{BEGIN DATA}@dots{}@cmd{END DATA} (@pxref{BEGIN DATA}). The @subcmd{ENCODING} subcommand may only be used if the @subcmd{FILE} subcommand is also used. It specifies the character encoding of the file. @xref{INSERT}, for information on supported encodings. The optional @subcmd{RECORDS} subcommand, which takes a single integer as an argument, is used to specify the number of lines per record. If @subcmd{RECORDS} is not specified, then the number of lines per record is calculated from the list of variable specifications later in @cmd{DATA LIST}. The @subcmd{END} subcommand is only useful in conjunction with @cmd{INPUT PROGRAM}. @xref{INPUT PROGRAM}, for details. The optional @subcmd{SKIP} subcommand specifies a number of records to skip at the beginning of an input file. It can be used to skip over a row that contains variable names, for example. @cmd{DATA LIST} can optionally output a table describing how the data file will be read. The @subcmd{TABLE} subcommand enables this output, and @subcmd{NOTABLE} disables it. The default is to output the table. The list of variables to be read from the data list must come last. Each line in the data record is introduced by a slash (@samp{/}). Optionally, a line number may follow the slash. Following, any number of variable specifications may be present. Each variable specification consists of a list of variable names followed by a description of their location on the input line. Sets of variables may be specified using the @cmd{DATA LIST} @subcmd{TO} convention (@pxref{Sets of Variables}). There are two ways to specify the location of the variable on the line: columnar style and FORTRAN style. In columnar style, the starting column and ending column for the field are specified after the variable name, separated by a dash (@samp{-}). For instance, the third through fifth columns on a line would be specified @samp{3-5}. By default, variables are considered to be in @samp{F} format (@pxref{Input and Output Formats}). (This default can be changed; see @ref{SET} for more information.) In columnar style, to use a variable format other than the default, specify the format type in parentheses after the column numbers. For instance, for alphanumeric @samp{A} format, use @samp{(A)}. In addition, implied decimal places can be specified in parentheses after the column numbers. As an example, suppose that a data file has a field in which the characters @samp{1234} should be interpreted as having the value 12.34. Then this field has two implied decimal places, and the corresponding specification would be @samp{(2)}. If a field that has implied decimal places contains a decimal point, then the implied decimal places are not applied. Changing the variable format and adding implied decimal places can be done together; for instance, @samp{(N,5)}. When using columnar style, the input and output width of each variable is computed from the field width. The field width must be evenly divisible into the number of variables specified. FORTRAN style is an altogether different approach to specifying field locations. With this approach, a list of variable input format specifications, separated by commas, are placed after the variable names inside parentheses. Each format specifier advances as many characters into the input line as it uses. Implied decimal places also exist in FORTRAN style. A format specification with @var{d} decimal places also has @var{d} implied decimal places. In addition to the standard format specifiers (@pxref{Input and Output Formats}), FORTRAN style defines some extensions: @table @asis @item @code{X} Advance the current column on this line by one character position. @item @code{T}@var{x} Set the current column on this line to column @var{x}, with column numbers considered to begin with 1 at the left margin. @item @code{NEWREC}@var{x} Skip forward @var{x} lines in the current record, resetting the active column to the left margin. @item Repeat count Any format specifier may be preceded by a number. This causes the action of that format specifier to be repeated the specified number of times. @item (@var{spec1}, @dots{}, @var{specN}) Group the given specifiers together. This is most useful when preceded by a repeat count. Groups may be nested arbitrarily. @end table FORTRAN and columnar styles may be freely intermixed. Columnar style leaves the active column immediately after the ending column specified. Record motion using @code{NEWREC} in FORTRAN style also applies to later FORTRAN and columnar specifiers. @menu * DATA LIST FIXED Examples:: Examples of DATA LIST FIXED. @end menu @node DATA LIST FIXED Examples @unnumberedsubsubsec Examples @enumerate @item @example DATA LIST TABLE /NAME 1-10 (A) INFO1 TO INFO3 12-17 (1). BEGIN DATA. John Smith 102311 Bob Arnold 122015 Bill Yates 918 6 END DATA. @end example Defines the following variables: @itemize @bullet @item @code{NAME}, a 10-character-wide string variable, in columns 1 through 10. @item @code{INFO1}, a numeric variable, in columns 12 through 13. @item @code{INFO2}, a numeric variable, in columns 14 through 15. @item @code{INFO3}, a numeric variable, in columns 16 through 17. @end itemize The @code{BEGIN DATA}/@code{END DATA} commands cause three cases to be defined: @example Case NAME INFO1 INFO2 INFO3 1 John Smith 10 23 11 2 Bob Arnold 12 20 15 3 Bill Yates 9 18 6 @end example The @code{TABLE} keyword causes @pspp{} to print out a table describing the four variables defined. @item @example DAT LIS FIL="survey.dat" /ID 1-5 NAME 7-36 (A) SURNAME 38-67 (A) MINITIAL 69 (A) /Q01 TO Q50 7-56 /. @end example Defines the following variables: @itemize @bullet @item @code{ID}, a numeric variable, in columns 1-5 of the first record. @item @code{NAME}, a 30-character string variable, in columns 7-36 of the first record. @item @code{SURNAME}, a 30-character string variable, in columns 38-67 of the first record. @item @code{MINITIAL}, a 1-character string variable, in column 69 of the first record. @item Fifty variables @code{Q01}, @code{Q02}, @code{Q03}, @dots{}, @code{Q49}, @code{Q50}, all numeric, @code{Q01} in column 7, @code{Q02} in column 8, @dots{}, @code{Q49} in column 55, @code{Q50} in column 56, all in the second record. @end itemize Cases are separated by a blank record. Data is read from file @file{survey.dat} in the current directory. This example shows keywords abbreviated to their first 3 letters. @end enumerate @node DATA LIST FREE @subsection DATA LIST FREE @vindex DATA LIST FREE @display DATA LIST FREE [(@{TAB,'@var{c}'@}, @dots{})] [@{NOTABLE,TABLE@}] [FILE='@var{file_name}' [ENCODING='@var{encoding}']] [SKIP=@var{record_cnt}] /@var{var_spec}@dots{} where each @var{var_spec} takes one of the forms @var{var_list} [(@var{type_spec})] @var{var_list} * @end display In free format, the input data is, by default, structured as a series of fields separated by spaces, tabs, or line breaks. If the current @subcmd{DECIMAL} separator is @subcmd{DOT} (@pxref{SET}), then commas are also treated as field separators. Each field's content may be unquoted, or it may be quoted with a pairs of apostrophes (@samp{'}) or double quotes (@samp{"}). Unquoted white space separates fields but is not part of any field. Any mix of spaces, tabs, and line breaks is equivalent to a single space for the purpose of separating fields, but consecutive commas will skip a field. Alternatively, delimiters can be specified explicitly, as a parenthesized, comma-separated list of single-character strings immediately following FREE. The word TAB may also be used to specify a tab character as a delimiter. When delimiters are specified explicitly, only the given characters, plus line breaks, separate fields. Furthermore, leading spaces at the beginnings of fields are not trimmed, consecutive delimiters define empty fields, and no form of quoting is allowed. The @subcmd{NOTABLE} and @subcmd{TABLE} subcommands are as in @cmd{DATA LIST FIXED} above. @subcmd{NOTABLE} is the default. The @subcmd{FILE}, @subcmd{SKIP}, and @subcmd{ENCODING} subcommands are as in @cmd{DATA LIST FIXED} above. The variables to be parsed are given as a single list of variable names. This list must be introduced by a single slash (@samp{/}). The set of variable names may contain format specifications in parentheses (@pxref{Input and Output Formats}). Format specifications apply to all variables back to the previous parenthesized format specification. In addition, an asterisk may be used to indicate that all variables preceding it are to have input/output format @samp{F8.0}. Specified field widths are ignored on input, although all normal limits on field width apply, but they are honored on output. @node DATA LIST LIST @subsection DATA LIST LIST @vindex DATA LIST LIST @display DATA LIST LIST [(@{TAB,'@var{c}'@}, @dots{})] [@{NOTABLE,TABLE@}] [FILE='@var{file_name}' [ENCODING='@var{encoding}']] [SKIP=@var{record_count}] /@var{var_spec}@dots{} where each @var{var_spec} takes one of the forms @var{var_list} [(@var{type_spec})] @var{var_list} * @end display With one exception, @cmd{DATA LIST LIST} is syntactically and semantically equivalent to @cmd{DATA LIST FREE}. The exception is that each input line is expected to correspond to exactly one input record. If more or fewer fields are found on an input line than expected, an appropriate diagnostic is issued. @node END CASE @section END CASE @vindex END CASE @display END CASE. @end display @cmd{END CASE} is used only within @cmd{INPUT PROGRAM} to output the current case. @xref{INPUT PROGRAM}, for details. @node END FILE @section END FILE @vindex END FILE @display END FILE. @end display @cmd{END FILE} is used only within @cmd{INPUT PROGRAM} to terminate the current input program. @xref{INPUT PROGRAM}. @node FILE HANDLE @section FILE HANDLE @vindex FILE HANDLE @display For text files: FILE HANDLE @var{handle_name} /NAME='@var{file_name} [/MODE=CHARACTER] [/ENDS=@{CR,CRLF@}] /TABWIDTH=@var{tab_width} [ENCODING='@var{encoding}'] For binary files in native encoding with fixed-length records: FILE HANDLE @var{handle_name} /NAME='@var{file_name}' /MODE=IMAGE [/LRECL=@var{rec_len}] [ENCODING='@var{encoding}'] For binary files in native encoding with variable-length records: FILE HANDLE @var{handle_name} /NAME='@var{file_name}' /MODE=BINARY [/LRECL=@var{rec_len}] [ENCODING='@var{encoding}'] For binary files encoded in EBCDIC: FILE HANDLE @var{handle_name} /NAME='@var{file_name}' /MODE=360 /RECFORM=@{FIXED,VARIABLE,SPANNED@} [/LRECL=@var{rec_len}] [ENCODING='@var{encoding}'] @end display Use @cmd{FILE HANDLE} to associate a file handle name with a file and its attributes, so that later commands can refer to the file by its handle name. Names of text files can be specified directly on commands that access files, so that @cmd{FILE HANDLE} is only needed when a file is not an ordinary file containing lines of text. However, @cmd{FILE HANDLE} may be used even for text files, and it may be easier to specify a file's name once and later refer to it by an abstract handle. Specify the file handle name as the identifier immediately following the @cmd{FILE HANDLE} command name. The identifier INLINE is reserved for representing data embedded in the syntax file (@pxref{BEGIN DATA}) The file handle name must not already have been used in a previous invocation of @cmd{FILE HANDLE}, unless it has been closed by an intervening command (@pxref{CLOSE FILE HANDLE}). The effect and syntax of @cmd{FILE HANDLE} depends on the selected MODE: @itemize @item In CHARACTER mode, the default, the data file is read as a text file. Each text line is read as one record. In CHARACTER mode only, tabs are expanded to spaces by input programs, except by @cmd{DATA LIST FREE} with explicitly specified delimiters. Each tab is 4 characters wide by default, but TABWIDTH (a @pspp{} extension) may be used to specify an alternate width. Use a TABWIDTH of 0 to suppress tab expansion. A file written in CHARACTER mode by default uses the line ends of the system on which PSPP is running, that is, on Windows, the default is CR LF line ends, and on other systems the default is LF only. Specify ENDS as CR or CRLF to override the default. PSPP reads files using either convention on any kind of system, regardless of ENDS. @item In IMAGE mode, the data file is treated as a series of fixed-length binary records. LRECL should be used to specify the record length in bytes, with a default of 1024. On input, it is an error if an IMAGE file's length is not a integer multiple of the record length. On output, each record is padded with spaces or truncated, if necessary, to make it exactly the correct length. @item In BINARY mode, the data file is treated as a series of variable-length binary records. LRECL may be specified, but its value is ignored. The data for each record is both preceded and followed by a 32-bit signed integer in little-endian byte order that specifies the length of the record. (This redundancy permits records in these files to be efficiently read in reverse order, although @pspp{} always reads them in forward order.) The length does not include either integer. @item Mode 360 reads and writes files in formats first used for tapes in the 1960s on IBM mainframe operating systems and still supported today by the modern successors of those operating systems. For more information, see @cite{OS/400 Tape and Diskette Device Programming}, available on IBM's website. Alphanumeric data in mode 360 files are encoded in EBCDIC. @pspp{} translates EBCDIC to or from the host's native format as necessary on input or output, using an ASCII/EBCDIC translation that is one-to-one, so that a ``round trip'' from ASCII to EBCDIC back to ASCII, or vice versa, always yields exactly the original data. The @subcmd{RECFORM} subcommand is required in mode 360. The precise file format depends on its setting: @table @asis @item F @itemx FIXED This record format is equivalent to IMAGE mode, except for EBCDIC translation. IBM documentation calls this @code{*F} (fixed-length, deblocked) format. @item V @itemx VARIABLE The file comprises a sequence of zero or more variable-length blocks. Each block begins with a 4-byte @dfn{block descriptor word} (BDW). The first two bytes of the BDW are an unsigned integer in big-endian byte order that specifies the length of the block, including the BDW itself. The other two bytes of the BDW are ignored on input and written as zeros on output. Following the BDW, the remainder of each block is a sequence of one or more variable-length records, each of which in turn begins with a 4-byte @dfn{record descriptor word} (RDW) that has the same format as the BDW. Following the RDW, the remainder of each record is the record data. The maximum length of a record in VARIABLE mode is 65,527 bytes: 65,535 bytes (the maximum value of a 16-bit unsigned integer), minus 4 bytes for the BDW, minus 4 bytes for the RDW. In mode VARIABLE, LRECL specifies a maximum, not a fixed, record length, in bytes. The default is 8,192. IBM documentation calls this @code{*VB} (variable-length, blocked, unspanned) format. @item VS @itemx SPANNED The file format is like that of VARIABLE mode, except that logical records may be split among multiple physical records (called @dfn{segments}) or blocks. In SPANNED mode, the third byte of each RDW is called the segment control character (SCC). Odd SCC values cause the segment to be appended to a record buffer maintained in memory; even values also append the segment and then flush its contents to the input procedure. Canonically, SCC value 0 designates a record not spanned among multiple segments, and values 1 through 3 designate the first segment, the last segment, or an intermediate segment, respectively, within a multi-segment record. The record buffer is also flushed at end of file regardless of the final record's SCC. The maximum length of a logical record in VARIABLE mode is limited only by memory available to @pspp{}. Segments are limited to 65,527 bytes, as in VARIABLE mode. This format is similar to what IBM documentation call @code{*VS} (variable-length, deblocked, spanned) format. @end table In mode 360, fields of type A that extend beyond the end of a record read from disk are padded with spaces in the host's native character set, which are then translated from EBCDIC to the native character set. Thus, when the host's native character set is based on ASCII, these fields are effectively padded with character @code{X'80'}. This wart is implemented for compatibility. @end itemize The @subcmd{NAME} subcommand specifies the name of the file associated with the handle. It is required in all modes but SCRATCH mode, in which its use is forbidden. The ENCODING subcommand specifies the encoding of text in the file. For reading text files in CHARACTER mode, all of the forms described for ENCODING on the INSERT command are supported (@pxref{INSERT}). For reading in other file-based modes, encoding autodetection is not supported; if the specified encoding requests autodetection then the default encoding will be used. This is also true when a file handle is used for writing a file in any mode. @node INPUT PROGRAM @section INPUT PROGRAM @vindex INPUT PROGRAM @display INPUT PROGRAM. @dots{} input commands @dots{} END INPUT PROGRAM. @end display @cmd{INPUT PROGRAM}@dots{}@cmd{END INPUT PROGRAM} specifies a complex input program. By placing data input commands within @cmd{INPUT PROGRAM}, @pspp{} programs can take advantage of more complex file structures than available with only @cmd{DATA LIST}. The first sort of extended input program is to simply put multiple @cmd{DATA LIST} commands within the @cmd{INPUT PROGRAM}. This will cause all of the data files to be read in parallel. Input will stop when end of file is reached on any of the data files. Transformations, such as conditional and looping constructs, can also be included within @cmd{INPUT PROGRAM}. These can be used to combine input from several data files in more complex ways. However, input will still stop when end of file is reached on any of the data files. To prevent @cmd{INPUT PROGRAM} from terminating at the first end of file, use the @subcmd{END} subcommand on @cmd{DATA LIST}. This subcommand takes a variable name, which should be a numeric scratch variable (@pxref{Scratch Variables}). (It need not be a scratch variable but otherwise the results can be surprising.) The value of this variable is set to 0 when reading the data file, or 1 when end of file is encountered. Two additional commands are useful in conjunction with @cmd{INPUT PROGRAM}. @cmd{END CASE} is the first. Normally each loop through the @cmd{INPUT PROGRAM} structure produces one case. @cmd{END CASE} controls exactly when cases are output. When @cmd{END CASE} is used, looping from the end of @cmd{INPUT PROGRAM} to the beginning does not cause a case to be output. @cmd{END FILE} is the second. When the @subcmd{END} subcommand is used on @cmd{DATA LIST}, there is no way for the @cmd{INPUT PROGRAM} construct to stop looping, so an infinite loop results. @cmd{END FILE}, when executed, stops the flow of input data and passes out of the @cmd{INPUT PROGRAM} structure. @cmd{INPUT PROGRAM} must contain at least one @cmd{DATA LIST} or @cmd{END FILE} command. All this is very confusing. A few examples should help to clarify. @c If you change this example, change the regression test1 in @c tests/command/input-program.sh to match. @example INPUT PROGRAM. DATA LIST NOTABLE FILE='a.data'/X 1-10. DATA LIST NOTABLE FILE='b.data'/Y 1-10. END INPUT PROGRAM. LIST. @end example The example above reads variable X from file @file{a.data} and variable Y from file @file{b.data}. If one file is shorter than the other then the extra data in the longer file is ignored. @c If you change this example, change the regression test2 in @c tests/command/input-program.sh to match. @example INPUT PROGRAM. NUMERIC #A #B. DO IF NOT #A. DATA LIST NOTABLE END=#A FILE='a.data'/X 1-10. END IF. DO IF NOT #B. DATA LIST NOTABLE END=#B FILE='b.data'/Y 1-10. END IF. DO IF #A AND #B. END FILE. END IF. END CASE. END INPUT PROGRAM. LIST. @end example The above example reads variable X from @file{a.data} and variable Y from @file{b.data}. If one file is shorter than the other then the missing field is set to the system-missing value alongside the present value for the remaining length of the longer file. @c If you change this example, change the regression test3 in @c tests/command/input-program.sh to match. @example INPUT PROGRAM. NUMERIC #A #B. DO IF #A. DATA LIST NOTABLE END=#B FILE='b.data'/X 1-10. DO IF #B. END FILE. ELSE. END CASE. END IF. ELSE. DATA LIST NOTABLE END=#A FILE='a.data'/X 1-10. DO IF NOT #A. END CASE. END IF. END IF. END INPUT PROGRAM. LIST. @end example The above example reads data from file @file{a.data}, then from @file{b.data}, and concatenates them into a single active dataset. @c If you change this example, change the regression test4 in @c tests/command/input-program.sh to match. @example INPUT PROGRAM. NUMERIC #EOF. LOOP IF NOT #EOF. DATA LIST NOTABLE END=#EOF FILE='a.data'/X 1-10. DO IF NOT #EOF. END CASE. END IF. END LOOP. COMPUTE #EOF = 0. LOOP IF NOT #EOF. DATA LIST NOTABLE END=#EOF FILE='b.data'/X 1-10. DO IF NOT #EOF. END CASE. END IF. END LOOP. END FILE. END INPUT PROGRAM. LIST. @end example The above example does the same thing as the previous example, in a different way. @c If you change this example, make similar changes to the regression @c test5 in tests/command/input-program.sh. @example INPUT PROGRAM. LOOP #I=1 TO 50. COMPUTE X=UNIFORM(10). END CASE. END LOOP. END FILE. END INPUT PROGRAM. LIST/FORMAT=NUMBERED. @end example The above example causes an active dataset to be created consisting of 50 random variates between 0 and 10. @node LIST @section LIST @vindex LIST @display LIST /VARIABLES=@var{var_list} /CASES=FROM @var{start_index} TO @var{end_index} BY @var{incr_index} /FORMAT=@{UNNUMBERED,NUMBERED@} @{WRAP,SINGLE@} @end display The @cmd{LIST} procedure prints the values of specified variables to the listing file. The @subcmd{VARIABLES} subcommand specifies the variables whose values are to be printed. Keyword VARIABLES is optional. If @subcmd{VARIABLES} subcommand is not specified then all variables in the active dataset are printed. The @subcmd{CASES} subcommand can be used to specify a subset of cases to be printed. Specify @subcmd{FROM} and the case number of the first case to print, @subcmd{TO} and the case number of the last case to print, and @subcmd{BY} and the number of cases to advance between printing cases, or any subset of those settings. If @subcmd{CASES} is not specified then all cases are printed. The @subcmd{FORMAT} subcommand can be used to change the output format. @subcmd{NUMBERED} will print case numbers along with each case; @subcmd{UNNUMBERED}, the default, causes the case numbers to be omitted. The @subcmd{WRAP} and @subcmd{SINGLE} settings are currently not used. Case numbers start from 1. They are counted after all transformations have been considered. @cmd{LIST} is a procedure. It causes the data to be read. @node NEW FILE @section NEW FILE @vindex NEW FILE @display NEW FILE. @end display @cmd{NEW FILE} command clears the dictionary and data from the current active dataset. @node MATRIX DATA @section MATRIX DATA @vindex MATRIX DATA @display MATRIX DATA VARIABLES = @var{columns} [FILE='@var{file_name}'| INLINE @} [/FORMAT= [@{LIST | FREE@}] [@{UPPER | LOWER | FULL@}] [@{DIAGONAL | NODIAGONAL@}]] [/N= @var{n}] [/SPLIT= @var{split_variables}]. @end display The @cmd{MATRIX DATA} command is used to input data in the form of matrices which can subsequently be used by other commands. If the @subcmd{FILE} is omitted or takes the value @samp{INLINE} then the command should immediately followed by @cmd{BEGIN DATA} (@pxref{BEGIN DATA}). There is one mandatory subcommand, @i{viz:} @subcmd{VARIABLES}, which defines the @var{columns} of the matrix. Normally, the @var{columns} should include an item called @samp{ROWTYPE_}. The @samp{ROWTYPE_} column is used to specify the purpose of a row in the matrix. @example matrix data variables = rowtype_ var01 TO var08. begin data. mean 24.3 5.4 69.7 20.1 13.4 2.7 27.9 3.7 sd 5.7 1.5 23.5 5.8 2.8 4.5 5.4 1.5 n 92 92 92 92 92 92 92 92 corr 1.00 corr .18 1.00 corr -.22 -.17 1.00 corr .36 .31 -.14 1.00 corr .27 .16 -.12 .22 1.00 corr .33 .15 -.17 .24 .21 1.00 corr .50 .29 -.20 .32 .12 .38 1.00 corr .17 .29 -.05 .20 .27 .20 .04 1.00 end data. @end example In the above example, the first three rows have ROWTYPE_ values of @samp{mean}, @samp{sd}, and @samp{n}. These indicate that the rows contain mean values, standard deviations and counts, respectively. All subsequent rows have a ROWTYPE_ of @samp{corr} which indicates that the values are correlation coefficients. Note that in this example, the upper right values of the @samp{corr} values are blank, and in each case, the rightmost value is unity. This is because, the @subcmd{FORMAT} subcommand defaults to @samp{LOWER DIAGONAL}, which indicates that only the lower triangle is provided in the data. The opposite triangle is automatically inferred. One could instead specify the upper triangle as follows: @example matrix data variables = rowtype_ var01 TO var08 /format = upper nodiagonal. begin data. mean 24.3 5.4 69.7 20.1 13.4 2.7 27.9 3.7 sd 5.7 1.5 23.5 5.8 2.8 4.5 5.4 1.5 n 92 92 92 92 92 92 92 92 corr .17 .50 -.33 .27 .36 -.22 .18 corr .29 .29 -.20 .32 .12 .38 corr .05 .20 -.15 .16 .21 corr .20 .32 -.17 .12 corr .27 .12 -.24 corr -.20 -.38 corr .04 end data. @end example In this example the @samp{NODIAGONAL} keyword is used. Accordingly the diagonal values of the matrix are omitted. This implies that there is one less @samp{corr} line than there are variables. If the @samp{FULL} option is passed to the @subcmd{FORMAT} subcommand, then all the matrix elements must be provided, including the diagonal elements. In the preceding examples, each matrix row has been specified on a single line. If you pass the keyword @var{FREE} to @subcmd{FORMAT} then the data may be data for several matrix rows may be specified on the same line, or a single row may be split across lines. The @subcmd{N} subcommand may be used to specify the number of valid cases for each variable. It should not be used if the data contains a record whose ROWTYPE_ column is @samp{N} or @samp{N_VECTOR}. It implies a @samp{N} record whose values are all @var{n}. That is to say, @example matrix data variables = rowtype_ var01 TO var04 /format = upper nodiagonal /n = 99. begin data mean 34 35 36 37 sd 22 11 55 66 corr 9 8 7 corr 6 5 corr 4 end data. @end example produces an effect identical to @example matrix data variables = rowtype_ var01 TO var04 /format = upper nodiagonal begin data n 99 99 99 99 mean 34 35 36 37 sd 22 11 55 66 corr 9 8 7 corr 6 5 corr 4 end data. @end example The @subcmd{SPLIT} is used to indicate that variables are to be considered as split variables. For example, the following defines two matrices using the variable @samp{S1} to distinguish between them. @example matrix data variables = s1 rowtype_ var01 TO var04 /split = s1 /format = full diagonal. begin data 0 mean 34 35 36 37 0 sd 22 11 55 66 0 n 99 98 99 92 0 corr 1 9 8 7 0 corr 9 1 6 5 0 corr 8 6 1 4 0 corr 7 5 4 1 1 mean 44 45 34 39 1 sd 23 15 51 46 1 n 98 34 87 23 1 corr 1 2 3 4 1 corr 2 1 5 6 1 corr 3 5 1 7 1 corr 4 6 7 1 end data. @end example @node PRINT @section PRINT @vindex PRINT @display PRINT [OUTFILE='@var{file_name}'] [RECORDS=@var{n_lines}] [@{NOTABLE,TABLE@}] [ENCODING='@var{encoding}'] [/[@var{line_no}] @var{arg}@dots{}] @var{arg} takes one of the following forms: '@var{string}' [@var{start}] @var{var_list} @var{start}-@var{end} [@var{type_spec}] @var{var_list} (@var{fortran_spec}) @var{var_list} * @end display The @cmd{PRINT} transformation writes variable data to the listing file or an output file. @cmd{PRINT} is executed when a procedure causes the data to be read. Follow @cmd{PRINT} by @cmd{EXECUTE} to print variable data without invoking a procedure (@pxref{EXECUTE}). All @cmd{PRINT} subcommands are optional. If no strings or variables are specified, @cmd{PRINT} outputs a single blank line. The @subcmd{OUTFILE} subcommand specifies the file to receive the output. The file may be a file name as a string or a file handle (@pxref{File Handles}). If @subcmd{OUTFILE} is not present then output will be sent to @pspp{}'s output listing file. When @subcmd{OUTFILE} is present, the output is written to @var{file_name} in a plain text format, with a space inserted at beginning of each output line, even lines that otherwise would be blank. The @subcmd{ENCODING} subcommand may only be used if the @subcmd{OUTFILE} subcommand is also used. It specifies the character encoding of the file. @xref{INSERT}, for information on supported encodings. The @subcmd{RECORDS} subcommand specifies the number of lines to be output. The number of lines may optionally be surrounded by parentheses. @subcmd{TABLE} will cause the @cmd{PRINT} command to output a table to the listing file that describes what it will print to the output file. @subcmd{NOTABLE}, the default, suppresses this output table. Introduce the strings and variables to be printed with a slash (@samp{/}). Optionally, the slash may be followed by a number indicating which output line will be specified. In the absence of this line number, the next line number will be specified. Multiple lines may be specified using multiple slashes with the intended output for a line following its respective slash. Literal strings may be printed. Specify the string itself. Optionally the string may be followed by a column number, specifying the column on the line where the string should start. Otherwise, the string will be printed at the current position on the line. Variables to be printed can be specified in the same ways as available for @cmd{DATA LIST FIXED} (@pxref{DATA LIST FIXED}). In addition, a variable list may be followed by an asterisk (@samp{*}), which indicates that the variables should be printed in their dictionary print formats, separated by spaces. A variable list followed by a slash or the end of command will be interpreted the same way. If a FORTRAN type specification is used to move backwards on the current line, then text is written at that point on the line, the line will be truncated to that length, although additional text being added will again extend the line to that length. @node PRINT EJECT @section PRINT EJECT @vindex PRINT EJECT @display PRINT EJECT OUTFILE='@var{file_name}' RECORDS=@var{n_lines} @{NOTABLE,TABLE@} /[@var{line_no}] @var{arg}@dots{} @var{arg} takes one of the following forms: '@var{string}' [@var{start}-@var{end}] @var{var_list} @var{start}-@var{end} [@var{type_spec}] @var{var_list} (@var{fortran_spec}) @var{var_list} * @end display @cmd{PRINT EJECT} advances to the beginning of a new output page in the listing file or output file. It can also output data in the same way as @cmd{PRINT}. All @cmd{PRINT EJECT} subcommands are optional. Without @subcmd{OUTFILE}, @cmd{PRINT EJECT} ejects the current page in the listing file, then it produces other output, if any is specified. With @subcmd{OUTFILE}, @cmd{PRINT EJECT} writes its output to the specified file. The first line of output is written with @samp{1} inserted in the first column. Commonly, this is the only line of output. If additional lines of output are specified, these additional lines are written with a space inserted in the first column, as with @subcmd{PRINT}. @xref{PRINT}, for more information on syntax and usage. @node PRINT SPACE @section PRINT SPACE @vindex PRINT SPACE @display PRINT SPACE [OUTFILE='file_name'] [ENCODING='@var{encoding}'] [n_lines]. @end display @cmd{PRINT SPACE} prints one or more blank lines to an output file. The @subcmd{OUTFILE} subcommand is optional. It may be used to direct output to a file specified by file name as a string or file handle (@pxref{File Handles}). If OUTFILE is not specified then output will be directed to the listing file. The @subcmd{ENCODING} subcommand may only be used if @subcmd{OUTFILE} is also used. It specifies the character encoding of the file. @xref{INSERT}, for information on supported encodings. n_lines is also optional. If present, it is an expression (@pxref{Expressions}) specifying the number of blank lines to be printed. The expression must evaluate to a nonnegative value. @node REREAD @section REREAD @vindex REREAD @display REREAD [FILE=handle] [COLUMN=column] [ENCODING='@var{encoding}']. @end display The @cmd{REREAD} transformation allows the previous input line in a data file already processed by @cmd{DATA LIST} or another input command to be re-read for further processing. The @subcmd{FILE} subcommand, which is optional, is used to specify the file to have its line re-read. The file must be specified as the name of a file handle (@pxref{File Handles}). If FILE is not specified then the last file specified on @cmd{DATA LIST} will be assumed (last file specified lexically, not in terms of flow-of-control). By default, the line re-read is re-read in its entirety. With the @subcmd{COLUMN} subcommand, a prefix of the line can be exempted from re-reading. Specify an expression (@pxref{Expressions}) evaluating to the first column that should be included in the re-read line. Columns are numbered from 1 at the left margin. The @subcmd{ENCODING} subcommand may only be used if the @subcmd{FILE} subcommand is also used. It specifies the character encoding of the file. @xref{INSERT}, for information on supported encodings. Issuing @code{REREAD} multiple times will not back up in the data file. Instead, it will re-read the same line multiple times. @node REPEATING DATA @section REPEATING DATA @vindex REPEATING DATA @display REPEATING DATA /STARTS=@var{start}-@var{end} /OCCURS=@var{n_occurs} /FILE='@var{file_name}' /LENGTH=@var{length} /CONTINUED[=@var{cont_start}-@var{cont_end}] /ID=@var{id_start}-@var{id_end}=@var{id_var} /@{TABLE,NOTABLE@} /DATA=@var{var_spec}@dots{} where each @var{var_spec} takes one of the forms @var{var_list} @var{start}-@var{end} [@var{type_spec}] @var{var_list} (@var{fortran_spec}) @end display @cmd{REPEATING DATA} parses groups of data repeating in a uniform format, possibly with several groups on a single line. Each group of data corresponds with one case. @cmd{REPEATING DATA} may only be used within an @cmd{INPUT PROGRAM} structure (@pxref{INPUT PROGRAM}). When used with @cmd{DATA LIST}, it can be used to parse groups of cases that share a subset of variables but differ in their other data. The @subcmd{STARTS} subcommand is required. Specify a range of columns, using literal numbers or numeric variable names. This range specifies the columns on the first line that are used to contain groups of data. The ending column is optional. If it is not specified, then the record width of the input file is used. For the inline file (@pxref{BEGIN DATA}) this is 80 columns; for a file with fixed record widths it is the record width; for other files it is 1024 characters by default. The @subcmd{OCCURS} subcommand is required. It must be a number or the name of a numeric variable. Its value is the number of groups present in the current record. The @subcmd{DATA} subcommand is required. It must be the last subcommand specified. It is used to specify the data present within each repeating group. Column numbers are specified relative to the beginning of a group at column 1. Data is specified in the same way as with @cmd{DATA LIST FIXED} (@pxref{DATA LIST FIXED}). All other subcommands are optional. FILE specifies the file to read, either a file name as a string or a file handle (@pxref{File Handles}). If FILE is not present then the default is the last file handle used on @cmd{DATA LIST} (lexically, not in terms of flow of control). By default @cmd{REPEATING DATA} will output a table describing how it will parse the input data. Specifying @subcmd{NOTABLE} will disable this behavior; specifying TABLE will explicitly enable it. The @subcmd{LENGTH} subcommand specifies the length in characters of each group. If it is not present then length is inferred from the @subcmd{DATA} subcommand. LENGTH can be a number or a variable name. Normally all the data groups are expected to be present on a single line. Use the @subcmd{CONTINUED} command to indicate that data can be continued onto additional lines. If data on continuation lines starts at the left margin and continues through the entire field width, no column specifications are necessary on @subcmd{CONTINUED}. Otherwise, specify the possible range of columns in the same way as on STARTS. When data groups are continued from line to line, it is easy for cases to get out of sync through careless hand editing. The @subcmd{ID} subcommand allows a case identifier to be present on each line of repeating data groups. @cmd{REPEATING DATA} will check for the same identifier on each line and report mismatches. Specify the range of columns that the identifier will occupy, followed by an equals sign (@samp{=}) and the identifier variable name. The variable must already have been declared with @cmd{NUMERIC} or another command. @cmd{REPEATING DATA} should be the last command given within an @cmd{INPUT PROGRAM}. It should not be enclosed within a @cmd{LOOP} structure (@pxref{LOOP}). Use @cmd{DATA LIST} before, not after, @cmd{REPEATING DATA}. @node WRITE @section WRITE @vindex WRITE @display WRITE OUTFILE='@var{file_name}' RECORDS=@var{n_lines} @{NOTABLE,TABLE@} /[@var{line_no}] @var{arg}@dots{} @var{arg} takes one of the following forms: '@var{string}' [@var{start}-@var{end}] @var{var_list} @var{start}-@var{end} [@var{type_spec}] @var{var_list} (@var{fortran_spec}) @var{var_list} * @end display @code{WRITE} writes text or binary data to an output file. @xref{PRINT}, for more information on syntax and usage. @cmd{PRINT} and @cmd{WRITE} differ in only a few ways: @itemize @bullet @item @cmd{WRITE} uses write formats by default, whereas @cmd{PRINT} uses print formats. @item @cmd{PRINT} inserts a space between variables unless a format is explicitly specified, but @cmd{WRITE} never inserts space between variables in output. @item @cmd{PRINT} inserts a space at the beginning of each line that it writes to an output file (and @cmd{PRINT EJECT} inserts @samp{1} at the beginning of each line that should begin a new page), but @cmd{WRITE} does not. @item @cmd{PRINT} outputs the system-missing value according to its specified output format, whereas @cmd{WRITE} outputs the system-missing value as a field filled with spaces. Binary formats are an exception. @end itemize pspp-1.4.1/doc/ni.texi0000644000175000017500000001204313673503234014167 0ustar00blpblp00000000000000@c Generated from ../src/language/command.def by get-commands.pl @c Do not modify! @table @asis @item @cmd{2SLS} Two stage least squares regression @item @cmd{ACF} Autocorrelation function @item @cmd{ALSCAL} Multidimensional scaling @item @cmd{ANACOR} Correspondence analysis @item @cmd{ANOVA} Factorial analysis of variance @item @cmd{CASEPLOT} Plot time series @item @cmd{CASESTOVARS} Restructure complex data @item @cmd{CATPCA} Categorical principle components analysis @item @cmd{CATREG} Categorical regression @item @cmd{CCF} Time series cross correlation @item @cmd{CLEAR TRANSFORMATIONS} Clears transformations from active dataset @item @cmd{CLUSTER} Hierarchical clustering @item @cmd{CONJOINT} Analyse full concept data @item @cmd{CORRESPONDENCE} Show correspondence @item @cmd{COXREG} Cox proportional hazards regression @item @cmd{CREATE} Create time series data @item @cmd{CSDESCRIPTIVES} Complex samples descriptives @item @cmd{CSGLM} Complex samples GLM @item @cmd{CSLOGISTIC} Complex samples logistic regression @item @cmd{CSPLAN} Complex samples design @item @cmd{CSSELECT} Select complex samples @item @cmd{CSTABULATE} Tabulate complex samples @item @cmd{CTABLES} Display complex samples @item @cmd{CURVEFIT} Fit curve to line plot @item @cmd{DATE} Create time series data @item @cmd{DEFINE} Syntax macros @item @cmd{DETECTANOMALY} Find unusual cases @item @cmd{DISCRIMINANT} Linear discriminant analysis @item @cmd{EDIT} obsolete @item @cmd{END FILE TYPE} Ends complex data input @item @cmd{FILE TYPE} Complex data input @item @cmd{FIT} Goodness of Fit @item @cmd{GENLOG} Categorical model fitting @item @cmd{GET TRANSLATE} Read other file formats @item @cmd{GGRAPH} Custom defined graphs @item @cmd{HILOGLINEAR} Hierarchical loglinear models @item @cmd{HOMALS} Homogeneity analysis @item @cmd{IGRAPH} Interactive graphs @item @cmd{INFO} Local Documentation @item @cmd{KEYED DATA LIST} Read nonsequential data @item @cmd{KM} Kaplan-Meier @item @cmd{LOGLINEAR} General model fitting @item @cmd{MANOVA} Multivariate analysis of variance @item @cmd{MAPS} Geographical display @item @cmd{MATRIX} Matrix processing @item @cmd{MCONVERT} Convert covariance/correlation matrices @item @cmd{MIXED} Mixed linear models @item @cmd{MODEL CLOSE} Close server connection @item @cmd{MODEL HANDLE} Define server connection @item @cmd{MODEL LIST} Show existing models @item @cmd{MODEL NAME} Specify model label @item @cmd{MULTIPLE CORRESPONDENCE} Multiple correspondence analysis @item @cmd{MULT RESPONSE} Multiple response analysis @item @cmd{MVA} Missing value analysis @item @cmd{NAIVEBAYES} Small sample bayesian prediction @item @cmd{NLR} Non Linear Regression @item @cmd{NOMREG} Multinomial logistic regression @item @cmd{NONPAR CORR} Nonparametric correlation @item @cmd{NUMBERED} @item @cmd{OLAP CUBES} On-line analytical processing @item @cmd{OMS} Output management @item @cmd{ORTHOPLAN} Orthogonal effects design @item @cmd{OVERALS} Nonlinear canonical correlation @item @cmd{PACF} Partial autocorrelation @item @cmd{PARTIAL CORR} Partial correlation @item @cmd{PLANCARDS} Conjoint analysis planning @item @cmd{PLUM} Estimate ordinal regression models @item @cmd{POINT} Marker in keyed file @item @cmd{PPLOT} Plot time series variables @item @cmd{PREDICT} Specify forecast period @item @cmd{PREFSCAL} Multidimensional unfolding @item @cmd{PRINCALS} PCA by alternating least squares @item @cmd{PROBIT} Probit analysis @item @cmd{PROCEDURE OUTPUT} Specify output file @item @cmd{PROXIMITIES} Pairwise similarity @item @cmd{PROXSCAL} Multidimensional scaling of proximity data @item @cmd{RATIO STATISTICS} Descriptives of ratios @item @cmd{READ MODEL} Read new model @item @cmd{RECORD TYPE} Defines a type of record within FILE TYPE @item @cmd{REFORMAT} Read obsolete files @item @cmd{REPEATING DATA} Specify multiple cases per input record @item @cmd{REPORT} Pretty print working file @item @cmd{RMV} Replace missing values @item @cmd{SCRIPT} Run script file @item @cmd{SEASON} Estimate seasonal factors @item @cmd{SELECTPRED} Select predictor variables @item @cmd{SPCHART} Plot control charts @item @cmd{SPECTRA} Plot spectral density @item @cmd{STEMLEAF} Plot stem-and-leaf display @item @cmd{SUMMARIZE} Univariate statistics @item @cmd{SURVIVAL} Survival analysis @item @cmd{TDISPLAY} Display active models @item @cmd{TREE} Create classification tree @item @cmd{TSAPPLY} Apply time series model @item @cmd{TSET} Set time sequence variables @item @cmd{TSHOW} Show time sequence variables @item @cmd{TSMODEL} Estimate time series model @item @cmd{TSPLOT} Plot time sequence variables @item @cmd{TWOSTEP CLUSTER} Cluster observations @item @cmd{UNIANOVA} Univariate analysis @item @cmd{UNNUMBERED} obsolete @item @cmd{VALIDATEDATA} Identify suspicious cases @item @cmd{VARCOMP} Estimate variance @item @cmd{VARSTOCASES} Restructure complex data @item @cmd{VERIFY} Report time series @item @cmd{WLS} Weighted least squares regression @item @cmd{XGRAPH} High resolution charts @end table @c Local Variables: @c buffer-read-only: t @c End: pspp-1.4.1/doc/pspp.10000644000175000017500000000365713602034551013736 0ustar00blpblp00000000000000.\" PSPP - computes sample statistics. .\" Copyright (C) 1997, 1998 Free Software Foundation, Inc. .\" .\" 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 3 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, see . .\" .TH pspp 1 "29 Sep 2014" "GNU" "PSPP manual" .SH NAME pspp \- a system for statistical analysis .SH SYNOPSIS .B pspp .RI [ options ] " file"... .SH DESCRIPTION \fBpspp\fP performs statistical analysis on sampled data. Detailed documentation is available in html, pdf and info format. If the info system is installed, you can view the documentation with .IP .B info pspp .PP On Debian GNU/Linux systems, full documentation is available in \fB/usr/share/doc/pspp\fP in HTML and PDF formats and in \fB/usr/share/info\fP in info format. Documentation is also available at \fBhttp://www.gnu.org/software/pspp\fP. .SH OPTIONS .TP .B \-\-help Show summary of options. .TP .B \-\-version Show version of program. .SH EXAMPLE Create a file \fBexample.sps\fP with the following content: .PP .nf .RS * Example sps file data list / v0 to v2 1-9. begin data. 12 12 89 56 12 77 78 12 73 90 91 37 97 85 end data. descript all /stat=all /format=serial. .RE .fi .PP and run pspp with .IP .B pspp example.sps .PP More examples files are in \fB/usr/share/pspp/examples\fP .SH SEE ALSO .BR psppire (1), pspp\-dump\-sav (1), pspp\-convert (1). .SH AUTHOR pspp was written by Ben Pfaff, John Darrington and others pspp-1.4.1/doc/pspp.xml0000644000175000017500000274623513725007646014421 0ustar00blpblp00000000000000 ]> PSPP This manual is for GNU PSPP version 1.4.1, software for statistical analysis. Copyright © 1997, 1998, 2004, 2005, 2009, 2012, 2013, 2014, 2016, 2019 Free Software Foundation, Inc.
Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included in the section entitled "GNU Free Documentation License".
This manual is for GNU PSPP version 1.4.1, software for statistical analysis. Copyright © 1997, 1998, 2004, 2005, 2009, 2012, 2013, 2014, 2016, 2019 Free Software Foundation, Inc.
Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included in the section entitled "GNU Free Documentation License".
The authors wish to thank Network Theory Ltd http://www.network-theory.co.uk for their financial support in the production of this manual. GNU PSPP This manual is for GNU PSPP version 1.4.1, software for statistical analysis. Copyright © 1997, 1998, 2004, 2005, 2009, 2012, 2013, 2014, 2016, 2019 Free Software Foundation, Inc.
Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included in the section entitled "GNU Free Documentation License".
Introduction introduction PSPP language language, PSPP PSPP is a tool for statistical analysis of sampled data. It reads the data, analyzes the data according to commands provided, and writes the results to a listing file, to the standard output or to a window of the graphical display. The language accepted by PSPP is similar to those accepted by SPSS statistical products. The details of PSPP’s language are given later in this manual. PostScript PDF HTML DocBook PSPP produces tables and charts as output, which it can produce in several formats; currently, ASCII, PostScript, PDF, HTML, and DocBook are supported. The current version of PSPP, 1.4.1, is incomplete in terms of its statistical procedure support. PSPP is a work in progress. The authors hope to fully support all features in the products that PSPP replaces, eventually. The authors welcome questions, comments, donations, and code submissions. See Submitting Bug Reports, for instructions on contacting the authors. Your rights and obligations license licence your rights and obligations rights, your copyright obligations, your PSPP is not in the public domain. It is copyrighted and there are restrictions on its distribution, but these restrictions are designed to permit everything that a good cooperating citizen would want to do. What is not allowed is to try to prevent others from further sharing any version of this program that they might get from you. Specifically, we want to make sure that you have the right to give away copies of PSPP, that you receive source code or else can get it if you want it, that you can change these programs or use pieces of them in new free programs, and that you know you can do these things. To make sure that everyone has such rights, we have to forbid you to deprive anyone else of these rights. For example, if you distribute copies of PSPP, 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 tell them their rights. Also, for our own protection, we must make certain that everyone finds out that there is no warranty for PSPP. If these programs are modified by someone else and passed on, we want their recipients to know that what they have is not what we distributed, so that any problems introduced by others will not reflect on our reputation. 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. The precise conditions of the license for PSPP are found in the GNU General Public License. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. This manual specifically is covered by the GNU Free Documentation License (see GNU Free Documentation License). Invoking <command>pspp</command> invocation PSPP, invoking PSPP has two separate user interfaces. This chapter describes pspp, PSPP’s command-line driven text-based user interface. The following chapter briefly describes PSPPIRE, the graphical user interface to PSPP. The sections below describe the pspp program’s command-line interface. Main Options Here is a summary of all the options, grouped by type, followed by explanations in the same order. In the table, arguments to long options also apply to any corresponding short options. Non-option arguments syntax-file Output options -o, --output=output-file -O option=value -O format=format -O device={terminal|listing} --no-output -e, --error-file=error-file Language options -I, --include=dir -I-, --no-include -b, --batch -i, --interactive -r, --no-statrc -a, --algorithm={compatible|enhanced} -x, --syntax={compatible|enhanced} --syntax-encoding=encoding Informational options -h, --help -V, --version Other options -s, --safer --testing-mode syntax-file Read and execute the named syntax file. If no syntax files are specified, PSPP prompts for commands. If any syntax files are specified, PSPP by default exits after it runs them, but you may make it prompt for commands by specifying ‘-’ as an additional syntax file. Write output to output-file. PSPP has several different output drivers that support output in various formats (use to list the available formats). Specify this option more than once to produce multiple output files, presumably in different formats. Use ‘-’ as output-file to write output to standard output. If no option is used, then PSPP writes text and CSV output to standard output and other kinds of output to whose name is based on the format, e.g. pspp.pdf for PDF output. Sets an option for the output file configured by a preceding . Most options are specific to particular output formats. A few options that apply generically are listed below. PSPP uses the extension of the file name given on to select an output format. Use this option to override this choice by specifying an alternate format, e.g. to write HTML to a file named pspp.out. Use to list the available formats. Sets whether PSPP considers the output device configured by the preceding to be a terminal or a listing device. This affects what output will be sent to the device, as configured by the SET command’s output routing subcommands (see SET). By default, output written to standard output is considered a terminal device and other output is considered a listing device. Disables output entirely, if neither nor is also used. If one of those options is used, has no effect. Configures a file to receive PSPP error, warning, and note messages in plain text format. Use ‘-’ as error-file to write messages to standard output. The default error file is standard output in the absence of these options, but this is suppressed if an output device writes to standard output (or another terminal), to avoid printing every message twice. Use ‘none’ as error-file to explicitly suppress the default. Appends dir to the set of directories searched by the INCLUDE (see INCLUDE) and INSERT (see INSERT) commands. Clears all directories from the include path, including directories inserted in the include path by default. The default include path is . (the current directory), followed by .pspp in the user’s home directory, followed by PSPP’s system configuration directory (usually /etc/pspp or /usr/local/etc/pspp). These options forces syntax files to be interpreted in batch mode or interactive mode, respectively, rather than the default “auto” mode. See Syntax Variants, for a description of the differences. By default, at startup PSPP searches for a file named rc in the include path (described above) and, if it finds one, runs the commands in it. This option disables this behavior. With enhanced, the default, PSPP uses the best implemented algorithms for statistical procedures. With compatible, however, PSPP will in some cases use inferior algorithms to produce the same results as the proprietary program SPSS. Some commands have subcommands that override this setting on a per command basis. With enhanced, the default, PSPP accepts its own extensions beyond those compatible with the proprietary program SPSS. With compatible, PSPP rejects syntax that uses these extensions. Specifies encoding as the encoding for syntax files named on the command line. The encoding also becomes the default encoding for other syntax files read during the PSPP session by the INCLUDE and INSERT commands. See INSERT, for the accepted forms of encoding. Prints a message describing PSPP command-line syntax and the available device formats, then exits. Prints a brief message listing PSPP’s version, warranties you don’t have, copying conditions and copyright, and e-mail address for bug reports, then exits. Disables certain unsafe operations. This includes the ERASE and HOST commands, as well as use of pipes as input and output files. Invoke heuristics to assist with testing PSPP. For use by make check and similar scripts. PDF, PostScript, and SVG Output Options PDF Postscript SVG To produce output in PDF, PostScript, and SVG formats, specify on the PSPP command line, optionally followed by any of the options shown in the table below to customize the output format. PDF, PostScript, and SVG output is only available if your installation of PSPP was compiled with the Cairo library. Specify the output format. This is only necessary if the file name given on does not end in .pdf, .ps, or .svg. Paper size, as a name (e.g. a4, letter) or measurements (e.g. 210x297, 8.5x11in). The default paper size is taken from the PAPERSIZE environment variable or the file indicated by the PAPERCONF environment variable, if either variable is set. If not, and your system supports the LC_PAPER locale category, then the default paper size is taken from the locale. Otherwise, if /etc/papersize exists, the default paper size is read from it. As a last resort, A4 paper is assumed. Sets color as the color to be used for the background or foreground. Color should be given in the format #RRRRGGGGBBBB, where RRRR, GGGG and BBBB are 4 character hexadecimal representations of the red, green and blue components respectively. Either portrait or landscape. Default: portrait. Sets the margins around the page. See below for the allowed forms of dimension Default: 0.5in. Sets the font used for proportional, emphasized, or fixed-pitch text. Most systems support CSS-like font names such as “serif” and “monospace”, but a wide range of system-specific font are likely to be supported as well. Default: proportional font serif, emphasis font serif italic, fixed-pitch font monospace. Sets the size of the default fonts, in thousandths of a point. Default: 10000 (10 point). Sets the width of white space on either side of lines that border text or graphics objects. Default: 1pt. Sets the spacing between the lines in a double line in a table. Default: 1pt. Sets the width of the lines used in tables. Default: 0.5pt. Each dimension value above may be specified in various units based on its suffix: ‘mm’ for millimeters, ‘in’ for inches, or ‘pt’ for points. Lacking a suffix, numbers below 50 are assumed to be in inches and those about 50 are assumed to be in millimeters. Plain Text Output Options PSPP can produce plain text output, drawing boxes using ASCII or Unicode line drawing characters. To produce plain text output, specify on the PSPP command line, optionally followed by options from the table below to customize the output format. Plain text output is encoded in UTF-8. Specify the output format. This is only necessary if the file name given on does not end in .txt or .list. Name for chart files included in output. The value should be a file name that includes a single ‘#’ and ends in png. When a chart is output, the ‘#’ is replaced by the chart number. The default is the file name specified on with the extension stripped off and replaced by -#.png. Specify none to disable chart output. Charts are always disabled if your installation of PSPP was compiled without the Cairo library. Sets color as the color to be used for the background or foreground to be used for charts. Color should be given in the format #RRRRGGGGBBBB, where RRRR, GGGG and BBBB are 4 character hexadecimal representations of the red, green and blue components respectively. If charts are disabled, this option has no effect. Width of a page, in columns. If unspecified or given as auto, the default is the width of the terminal, for interactive output, or the WIDTH setting (see SET), for output to a file. Sets the characters used for lines in tables. If set to ascii the characters ‘-’, ‘|’, and ‘+’ for single-width lines and ‘=’ and ‘#’ for double-width lines are used. If set to unicode then Unicode box drawing characters will be used. The default is unicode if the locale’s character encoding is "UTF-8" or ascii otherwise. How to emphasize text. Bold and underline emphasis are achieved with overstriking, which may not be supported by all the software to which you might pass the output. Default: none. HTML Output Options HTML To produce output in HTML format, specify on the PSPP command line, optionally followed by any of the options shown in the table below to customize the output format. Specify the output format. This is only necessary if the file name given on does not end in .html. Sets the name used for chart files. See Plain Text Output Options, for details. Decorate the tables with borders. If set to false, the tables produced will have no borders. The default value is true. Use cascading style sheets. Cascading style sheets give an improved appearance and can be used to produce pages which fit a certain web site’s style. The default value is true. OpenDocument Output Options To produce output as an OpenDocument text (ODT) document, specify on the PSPP command line. If file does not end in .odt, you must also specify . ODT support is only available if your installation of PSPP was compiled with the libxml2 library. The OpenDocument output format does not have any configurable options. Comma-Separated Value Output Options To produce output in comma-separated value (CSV) format, specify on the PSPP command line, optionally followed by any of the options shown in the table below to customize the output format. Specify the output format. This is only necessary if the file name given on does not end in .csv. Sets the character used to separate fields. Default: a comma (‘,’). Sets qualifier as the character used to quote fields that contain white space, the separator (or any of the characters in the separator, if it contains more than one character), or the quote character itself. If qualifier is longer than one character, only the first character is used; if qualifier is the empty string, then fields are never quoted. Whether table titles (brief descriptions) should be printed. Default: on. Whether table captions (more extensive descriptions) should be printed. Default: on. The CSV format used is an extension to that specified in RFC 4180: Tables Each table row is output on a separate line, and each column is output as a field. The contents of a cell that spans multiple rows or columns is output only for the top-left row and column; the rest are output as empty fields. Titles When a table has a title and titles are enabled, the title is output just above the table as a single field prefixed by ‘Table:’. Captions When a table has a caption and captions are enabled, the caption is output just below the table as a single field prefixed by ‘Caption:’. Footnotes Within a table, footnote markers are output as bracketed letters following the cell’s contents, e.g. ‘[a]’, ‘[b]’, ... The footnotes themselves are output following the body of the table, as a separate two-column table introduced with a line that says ‘Footnotes:’. Each row in the table represent one footnote: the first column is the marker, the second column is the text. Text Text in output is printed as a field on a line by itself. The TITLE and SUBTITLE produce similar output, prefixed by ‘Title:’ or ‘Subtitle:’, respectively. Messages Errors, warnings, and notes are printed the same way as text. Charts Charts are not included in CSV output. Successive output items are separated by a blank line. Invoking <command>psppire</command> The graphic user interface Graphic user interface PSPPIRE The PSPPIRE graphic user interface for PSPP can perform all functionality of the command line interface. In addition it gives an instantaneous view of the data, variables and statistical output. The graphic user interface can be started by typing psppire at a command prompt. Alternatively many systems have a system of interactive menus or buttons from which psppire can be started by a series of mouse clicks. Once the principles of the PSPP system are understood, the graphic user interface is designed to be largely intuitive, and for this reason is covered only very briefly by this manual. Using PSPP PSPP is a tool for the statistical analysis of sampled data. You can use it to discover patterns in the data, to explain differences in one subset of data in terms of another subset and to find out whether certain beliefs about the data are justified. This chapter does not attempt to introduce the theory behind the statistical analysis, but it shows how such analysis can be performed using PSPP. For the purposes of this tutorial, it is assumed that you are using PSPP in its interactive mode from the command line. However, the example commands can also be typed into a file and executed in a post-hoc mode by typing ‘pspp filename’ at a shell prompt, where filename is the name of the file containing the commands. Alternatively, from the graphical interface, you can select File → New → Syntax to open a new syntax window and use the Run menu when a syntax fragment is ready to be executed. Whichever method you choose, the syntax is identical. When using the interactive method, PSPP tells you that it’s waiting for your data with a string like PSPP> or data>. In the examples of this chapter, whenever you see text like this, it indicates the prompt displayed by PSPP, not something that you should type. Throughout this chapter reference is made to a number of sample data files. So that you can try the examples for yourself, you should have received these files along with your copy of PSPP. These files contain purely fictitious data. They should not be used for research purposes.
Please note: Normally these files are installed in the directory /usr/local/share/pspp/examples. If however your system administrator or operating system vendor has chosen to install them in a different location, you will have to adjust the examples accordingly.
Preparation of Data Files Before analysis can commence, the data must be loaded into PSPP and arranged such that both PSPP and humans can understand what the data represents. There are two aspects of data: The variables — these are the parameters of a quantity which has been measured or estimated in some way. For example height, weight and geographic location are all variables. The observations (also called ‘cases’) of the variables — each observation represents an instance when the variables were measured or observed. For example, a data set which has the variables height, weight, and name, might have the observations: 1881 89.2 Ahmed 1192 107.01 Frank 1230 67 Julie The following sections explain how to define a dataset. Defining Variables variables Variables come in two basic types, viz: numeric and string. Variables such as age, height and satisfaction are numeric, whereas name is a string variable. String variables are best reserved for commentary data to assist the human observer. However they can also be used for nominal or categorical data. data-list defines two variables forename and height, and reads data into them by manual input. PSPP> data list list /forename (A12) height. PSPP> begin data. data> Ahmed 188 data> Bertram 167 data> Catherine 134.231 data> David 109.1 data> end data PSPP> There are several things to note about this example. The words ‘data list list’ are an example of the DATA LIST command. See DATA LIST. It tells PSPP to prepare for reading data. The word ‘list’ intentionally appears twice. The first occurrence is part of the DATA LIST call, whilst the second tells PSPP that the data is to be read as free format data with one record per line. The ‘/’ character is important. It marks the start of the list of variables which you wish to define. The text ‘forename’ is the name of the first variable, and ‘(A12)’ says that the variable forename is a string variable and that its maximum length is 12 bytes. The second variable’s name is specified by the text ‘height’. Since no format is given, this variable has the default format. Normally the default format expects numeric data, which should be entered in the locale of the operating system. Thus, the example is correct for English locales and other locales which use a period (‘.’) as the decimal separator. However if you are using a system with a locale which uses the comma (‘,’) as the decimal separator, then you should in the subsequent lines substitute ‘.’ with ‘,’. Alternatively, you could explicitly tell PSPP that the height variable is to be read using a period as its decimal separator by appending the text ‘DOT8.3’ after the word ‘height’. For more information on data formats, see Input and Output Formats. Normally, PSPP displays the prompt PSPP> whenever it’s expecting a command. However, when it’s expecting data, the prompt changes to data> so that you know to enter data and not a command. At the end of every command there is a terminating ‘.’ which tells PSPP that the end of a command has been encountered. You should not enter ‘.’ when data is expected (ie. when the data> prompt is current) since it is appropriate only for terminating commands. Listing the data LIST Once the data has been entered, you could type PSPP> list /format=numbered. to list the data. The optional text ‘/format=numbered’ requests the case numbers to be shown along with the data. It should show the following output: Data List +-----------+---------+------+ |Case Number| forename|height| +-----------+---------+------+ |1 |Ahmed |188.00| |2 |Bertram |167.00| |3 |Catherine|134.23| |4 |David |109.10| +-----------+---------+------+ Note that the numeric variable height is displayed to 2 decimal places, because the format for that variable is ‘F8.2’. For a complete description of the LIST command, see LIST. Reading data from a text file reading data The previous example showed how to define a set of variables and to manually enter the data for those variables. Manual entering of data is tedious work, and often a file containing the data will be have been previously prepared. Let us assume that you have a file called mydata.dat containing the ascii encoded data: Ahmed 188.00 Bertram 167.00 Catherine 134.23 David 109.10   .   .   . Zachariah 113.02 You can can tell the DATA LIST command to read the data directly from this file instead of by manual entry, with a command like: PSPP> data list file='mydata.dat' list /forename (A12) height. Notice however, that it is still necessary to specify the names of the variables and their formats, since this information is not contained in the file. It is also possible to specify the file’s character encoding and other parameters. For full details refer to see DATA LIST. Reading data from a pre-prepared PSPP file system files GET When working with other PSPP users, or users of other software which uses the PSPP data format, you may be given the data in a pre-prepared PSPP file. Such files contain not only the data, but the variable definitions, along with their formats, labels and other meta-data. Conventionally, these files (sometimes called “system” files) have the suffix .sav, but that is not mandatory. The following syntax loads a file called my-file.sav. PSPP> get file='my-file.sav'. You will encounter several instances of this in future examples. Saving data to a PSPP file. saving SAVE If you want to save your data, along with the variable definitions so that you or other PSPP users can use it later, you can do this with the SAVE command. The following syntax will save the existing data and variables to a file called my-new-file.sav. PSPP> save outfile='my-new-file.sav'. If my-new-file.sav already exists, then it will be overwritten. Otherwise it will be created. Reading data from other sources comma separated values spreadsheets databases Sometimes it’s useful to be able to read data from comma separated text, from spreadsheets, databases or other sources. In these instances you should use the GET DATA command (see GET DATA). Exiting PSPP Use the FINISH command to exit PSPP: PSPP> finish. Data Screening and Transformation screening transformation Once data has been entered, it is often desirable, or even necessary, to transform it in some way before performing analysis upon it. At the very least, it’s good practice to check for errors. Identifying incorrect data erroneous data errors, in data Data from real sources is rarely error free. PSPP has a number of procedures which can be used to help identify data which might be incorrect. The DESCRIPTIVES command (see DESCRIPTIVES) is used to generate simple linear statistics for a dataset. It is also useful for identifying potential problems in the data. The example file physiology.sav contains a number of physiological measurements of a sample of healthy adults selected at random. However, the data entry clerk made a number of mistakes when entering the data. ex-descriptives illustrates the use of DESCRIPTIVES to screen this data and identify the erroneous values. PSPP> get file='/usr/local/share/pspp/examples/physiology.sav'. PSPP> descriptives sex, weight, height. Output: Descriptive Statistics +---------------------+--+-------+-------+-------+-------+ | | N| Mean |Std Dev|Minimum|Maximum| +---------------------+--+-------+-------+-------+-------+ |Sex of subject |40| .45| .50|Male |Female | |Weight in kilograms |40| 72.12| 26.70| -55.6| 92.1| |Height in millimeters|40|1677.12| 262.87| 179| 1903| |Valid N (listwise) |40| | | | | |Missing N (listwise) | 0| | | | | +---------------------+--+-------+-------+-------+-------+ In the output of ex-descriptives, the most interesting column is the minimum value. The weight variable has a minimum value of less than zero, which is clearly erroneous. Similarly, the height variable’s minimum value seems to be very low. In fact, it is more than 5 standard deviations from the mean, and is a seemingly bizarre height for an adult person. We can examine the data in more detail with the EXAMINE command (see EXAMINE): In ex1 you can see that the lowest value of height is 179 (which we suspect to be erroneous), but the second lowest is 1598 which we know from the DESCRIPTIVES command is within 1 standard deviation from the mean. Similarly the weight variable has a lowest value which is negative but a plausible value for the second lowest value. This suggests that the two extreme values are outliers and probably represent data entry errors. [… continue from ex-descriptives] PSPP> examine height, weight /statistics=extreme(3). Output: Extreme Values +-------------------------------+-----------+-----+ | |Case Number|Value| +-------------------------------+-----------+-----+ |Height in millimeters Highest 1| 14| 1903| | 2| 15| 1884| | 3| 12| 1802| | Lowest 1| 30| 179| | 2| 31| 1598| | 3| 28| 1601| +-------------------------------+-----------+-----+ |Weight in kilograms Highest 1| 13| 92.1| | 2| 5| 92.1| | 3| 17| 91.7| | Lowest 1| 38|-55.6| | 2| 39| 54.5| | 3| 33| 55.4| +-------------------------------+-----------+-----+ Dealing with suspicious data SYSMIS recoding data If possible, suspect data should be checked and re-measured. However, this may not always be feasible, in which case the researcher may decide to disregard these values. PSPP has a feature whereby data can assume the special value ‘SYSMIS’, and will be disregarded in future analysis. See Missing Observations. You can set the two suspect values to the ‘SYSMIS’ value using the RECODE command. PSPP> recode height (179 = SYSMIS). PSPP> recode weight (LOWEST THRU 0 = SYSMIS). The first command says that for any observation which has a height value of 179, that value should be changed to the SYSMIS value. The second command says that any weight values of zero or less should be changed to SYSMIS. From now on, they will be ignored in analysis. For detailed information about the RECODE command see RECODE. If you now re-run the DESCRIPTIVES or EXAMINE commands in ex-descriptives and ex1 you will see a data summary with more plausible parameters. You will also notice that the data summaries indicate the two missing values. Inverting negatively coded variables Likert scale Inverting data Data entry errors are not the only reason for wanting to recode data. The sample file hotel.sav comprises data gathered from a customer satisfaction survey of clients at a particular hotel. In ex-reliability, this file is loaded for analysis. The line display dictionary. tells PSPP to display the variables and associated data. The output from this command has been omitted from the example for the sake of clarity, but you will notice that each of the variables v1, v2v5 are measured on a 5 point Likert scale, with 1 meaning “Strongly disagree” and 5 meaning “Strongly agree”. Whilst variables v1, v2 and v4 record responses to a positively posed question, variables v3 and v5 are responses to negatively worded questions. In order to perform meaningful analysis, we need to recode the variables so that they all measure in the same direction. We could use the RECODE command, with syntax such as: recode v3 (1 = 5) (2 = 4) (4 = 2) (5 = 1). However an easier and more elegant way uses the COMPUTE command (see COMPUTE). Since the variables are Likert variables in the range (1 … 5), subtracting their value from 6 has the effect of inverting them: compute var = 6 - var. ex-reliability uses this technique to recode the variables v3 and v5. After applying COMPUTE for both variables, all subsequent commands will use the inverted values. Testing data consistency reliability consistency A sensible check to perform on survey data is the calculation of reliability. This gives the statistician some confidence that the questionnaires have been completed thoughtfully. If you examine the labels of variables v1, v3 and v4, you will notice that they ask very similar questions. One would therefore expect the values of these variables (after recoding) to closely follow one another, and we can test that with the RELIABILITY command (see RELIABILITY). ex-reliability shows a PSPP session where the user (after recoding negatively scaled variables) requests reliability statistics for v1, v3 and v4. PSPP> get file='/usr/local/share/pspp/examples/hotel.sav'. PSPP> display dictionary. PSPP> * recode negatively worded questions. PSPP> compute v3 = 6 - v3. PSPP> compute v5 = 6 - v5. PSPP> reliability v1, v3, v4. Output (dictionary information omitted for clarity): Scale: ANY Case Processing Summary +--------+--+-------+ |Cases | N|Percent| +--------+--+-------+ |Valid |17| 100.0%| |Excluded| 0| .0%| |Total |17| 100.0%| +--------+--+-------+ Reliability Statistics +----------------+----------+ |Cronbach's Alpha|N of Items| +----------------+----------+ | .81| 3| +----------------+----------+ As a rule of thumb, many statisticians consider a value of Cronbach’s Alpha of 0.7 or higher to indicate reliable data. Here, the value is 0.81 so the data and the recoding that we performed are vindicated. Testing for normality normality, testing Many statistical tests rely upon certain properties of the data. One common property, upon which many linear tests depend, is that of normality — the data must have been drawn from a normal distribution. It is necessary then to ensure normality before deciding upon the test procedure to use. One way to do this uses the EXAMINE command. In normality, a researcher was examining the failure rates of equipment produced by an engineering company. The file repairs.sav contains the mean time between failures (mtbf) of some items of equipment subject to the study. Before performing linear analysis on the data, the researcher wanted to ascertain that the data is normally distributed. A normal distribution has a skewness and kurtosis of zero. Looking at the skewness of mtbf in normality it is clear that the mtbf figures have a lot of positive skew and are therefore not drawn from a normally distributed variable. Positive skew can often be compensated for by applying a logarithmic transformation. This is done with the COMPUTE command in the line compute mtbf_ln = ln (mtbf). Rather than redefining the existing variable, this use of COMPUTE defines a new variable mtbf_ln which is the natural logarithm of mtbf. The final command in this example calls EXAMINE on this new variable, and it can be seen from the results that both the skewness and kurtosis for mtbf_ln are very close to zero. This provides some confidence that the mtbf_ln variable is normally distributed and thus safe for linear analysis. In the event that no suitable transformation can be found, then it would be worth considering an appropriate non-parametric test instead of a linear one. See NPAR TESTS, for information about non-parametric tests. PSPP> get file='/usr/local/share/pspp/examples/repairs.sav'. PSPP> examine mtbf /statistics=descriptives. PSPP> compute mtbf_ln = ln (mtbf). PSPP> examine mtbf_ln /statistics=descriptives. Output: Case Processing Summary +-----------------------------------+-------------------------------+ | | Cases | | +----------+---------+----------+ | | Valid | Missing | Total | | | N|Percent|N|Percent| N|Percent| +-----------------------------------+--+-------+-+-------+--+-------+ |Mean time between failures (months)|15| 100.0%|0| .0%|15| 100.0%| +-----------------------------------+--+-------+-+-------+--+-------+ Descriptives +----------------------------------------------------------+---------+--------+ | | | Std. | | |Statistic| Error | +----------------------------------------------------------+---------+--------+ |Mean time between Mean | 8.32| 1.62| |failures (months) 95% Confidence Interval Lower | 4.85| | | for Mean Bound | | | | Upper | 11.79| | | Bound | | | | 5% Trimmed Mean | 7.69| | | Median | 8.12| | | Variance | 39.21| | | Std. Deviation | 6.26| | | Minimum | 1.63| | | Maximum | 26.47| | | Range | 24.84| | | Interquartile Range | 5.83| | | Skewness | 1.85| .58| | Kurtosis | 4.49| 1.12| +----------------------------------------------------------+---------+--------+ Case Processing Summary +-------+-------------------------------+ | | Cases | | +----------+---------+----------+ | | Valid | Missing | Total | | | N|Percent|N|Percent| N|Percent| +-------+--+-------+-+-------+--+-------+ |mtbf_ln|15| 100.0%|0| .0%|15| 100.0%| +-------+--+-------+-+-------+--+-------+ Descriptives +----------------------------------------------------+---------+----------+ | |Statistic|Std. Error| +----------------------------------------------------+---------+----------+ |mtbf_ln Mean | 1.88| .19| | 95% Confidence Interval for Mean Lower Bound| 1.47| | | Upper Bound| 2.29| | | 5% Trimmed Mean | 1.88| | | Median | 2.09| | | Variance | .54| | | Std. Deviation | .74| | | Minimum | .49| | | Maximum | 3.28| | | Range | 2.79| | | Interquartile Range | .92| | | Skewness | -.16| .58| | Kurtosis | -.09| 1.12| +----------------------------------------------------+---------+----------+ Hypothesis Testing Hypothesis testing p-value null hypothesis One of the most fundamental purposes of statistical analysis is hypothesis testing. Researchers commonly need to test hypotheses about a set of data. For example, she might want to test whether one set of data comes from the same distribution as another, or whether the mean of a dataset significantly differs from a particular value. This section presents just some of the possible tests that PSPP offers. The researcher starts by making a null hypothesis. Often this is a hypothesis which he suspects to be false. For example, if he suspects that A is greater than B he will state the null hypothesis as A = B. This example assumes that it is already proven that B is not greater than A. The p-value is a recurring concept in hypothesis testing. It is the highest acceptable probability that the evidence implying a null hypothesis is false, could have been obtained when the null hypothesis is in fact true. Note that this is not the same as “the probability of making an error” nor is it the same as “the probability of rejecting a hypothesis when it is true”. Testing for differences of means T-test T-TEST A common statistical test involves hypotheses about means. The T-TEST command is used to find out whether or not two separate subsets have the same mean. ex-t-test uses the file physiology.sav previously encountered. A researcher suspected that the heights and core body temperature of persons might be different depending upon their sex. To investigate this, he posed two null hypotheses: The mean heights of males and females in the population are equal. The mean body temperature of males and females in the population are equal. For the purposes of the investigation the researcher decided to use a p-value of 0.05. In addition to the T-test, the T-TEST command also performs the Levene test for equal variances. If the variances are equal, then a more powerful form of the T-test can be used. However if it is unsafe to assume equal variances, then an alternative calculation is necessary. PSPP performs both calculations. For the height variable, the output shows the significance of the Levene test to be 0.33 which means there is a 33% probability that the Levene test produces this outcome when the variances are equal. Had the significance been less than 0.05, then it would have been unsafe to assume that the variances were equal. However, because the value is higher than 0.05 the homogeneity of variances assumption is safe and the “Equal Variances” row (the more powerful test) can be used. Examining this row, the two tailed significance for the height t-test is less than 0.05, so it is safe to reject the null hypothesis and conclude that the mean heights of males and females are unequal. For the temperature variable, the significance of the Levene test is 0.58 so again, it is safe to use the row for equal variances. The equal variances row indicates that the two tailed significance for temperature is 0.20. Since this is greater than 0.05 we must reject the null hypothesis and conclude that there is insufficient evidence to suggest that the body temperature of male and female persons are different. PSPP> get file='/usr/local/share/pspp/examples/physiology.sav'. PSPP> recode height (179 = SYSMIS). PSPP> t-test group=sex(0,1) /variables = height temperature. Output: Group Statistics +-------------------------------------------+--+-------+-------------+--------+ | | | | Std. | S.E. | | Group | N| Mean | Deviation | Mean | +-------------------------------------------+--+-------+-------------+--------+ |Height in millimeters Male |22|1796.49| 49.71| 10.60| | Female|17|1610.77| 25.43| 6.17| +-------------------------------------------+--+-------+-------------+--------+ |Internal body temperature in degrees Male |22| 36.68| 1.95| .42| |Celcius Female|18| 37.43| 1.61| .38| +-------------------------------------------+--+-------+-------------+--------+ Independent Samples Test +---------------------+----------------------------------------------------- | | Levene's | | Test for | | Equality | | of | | Variances T-Test for Equality of Means | +----+-----+-----+-----+-------+----------+----------+ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Sig. | | | | | | | | | (2- | Mean |Std. Error| | | F | Sig.| t | df |tailed)|Difference|Difference| +---------------------+----+-----+-----+-----+-------+----------+----------+ |Height in Equal | .97| .331|14.02|37.00| .000| 185.72| 13.24| |millimeters variances| | | | | | | | | assumed | | | | | | | | | Equal | | |15.15|32.71| .000| 185.72| 12.26| | variances| | | | | | | | | not | | | | | | | | | assumed | | | | | | | | +---------------------+----+-----+-----+-----+-------+----------+----------+ |Internal Equal | .31| .581|-1.31|38.00| .198| -.75| .57| |body variances| | | | | | | | |temperature assumed | | | | | | | | |in degrees Equal | | |-1.33|37.99| .190| -.75| .56| |Celcius variances| | | | | | | | | not | | | | | | | | | assumed | | | | | | | | +---------------------+----+-----+-----+-----+-------+----------+----------+ +---------------------+-------------+ | | | | | | | | | | | | | | | | +-------------+ | | 95% | | | Confidence | | | Interval of | | | the | | | Difference | | +------+------+ | | Lower| Upper| +---------------------+------+------+ |Height in Equal |158.88|212.55| |millimeters variances| | | | assumed | | | | Equal |160.76|210.67| | variances| | | | not | | | | assumed | | | +---------------------+------+------+ |Internal Equal | -1.91| .41| |body variances| | | |temperature assumed | | | |in degrees Equal | -1.89| .39| |Celcius variances| | | | not | | | | assumed | | | +---------------------+------+------+ Linear Regression linear regression REGRESSION Linear regression is a technique used to investigate if and how a variable is linearly related to others. If a variable is found to be linearly related, then this can be used to predict future values of that variable. In example ex-regression, the service department of the company wanted to be able to predict the time to repair equipment, in order to improve the accuracy of their quotations. It was suggested that the time to repair might be related to the time between failures and the duty cycle of the equipment. The p-value of 0.1 was chosen for this investigation. In order to investigate this hypothesis, the REGRESSION command was used. This command not only tests if the variables are related, but also identifies the potential linear relationship. See REGRESSION. PSPP> get file='/usr/local/share/pspp/examples/repairs.sav'. PSPP> regression /variables = mtbf duty_cycle /dependent = mttr. PSPP> regression /variables = mtbf /dependent = mttr. Output (excerpts): Coefficients (Mean time to repair (hours) ) +------------------------+-----------------------------------------+-----+----+ | | Unstandardized Standardized | | | | | Coefficients Coefficients | | | | +---------+-----------+-------------------+ | | | | B | Std. Error| Beta | t |Sig.| +------------------------+---------+-----------+-------------------+-----+----+ |(Constant) | 9.81| 1.50| .00| 6.54|.000| |Mean time between | 3.10| .10| .99|32.43|.000| |failures (months) | | | | | | |Ratio of working to non-| 1.09| 1.78| .02| .61|.552| |working time | | | | | | +------------------------+---------+-----------+-------------------+-----+----+ Coefficients (Mean time to repair (hours) ) +-----------------------+------------------------------------------+-----+----+ | | Unstandardized Standardized | | | | | Coefficients Coefficients | | | | +---------+------------+-------------------+ | | | | B | Std. Error | Beta | t |Sig.| +-----------------------+---------+------------+-------------------+-----+----+ |(Constant) | 10.50| .96| .00|10.96|.000| |Mean time between | 3.11| .09| .99|33.39|.000| |failures (months) | | | | | | +-----------------------+---------+------------+-------------------+-----+----+ The coefficients in the first table suggest that the formula mttr = 9.81 + 3.1 \times mtbf + 1.09 \times duty_cycle can be used to predict the time to repair. However, the significance value for the duty_cycle coefficient is very high, which would make this an unsafe predictor. For this reason, the test was repeated, but omitting the duty_cycle variable. This time, the significance of all coefficients no higher than 0.06, suggesting that at the 0.06 level, the formula mttr = 10.5 + 3.11 \times mtbf is a reliable predictor of the time to repair.
The PSPP language language, PSPP PSPP, language This chapter discusses elements common to many PSPP commands. Later chapters will describe individual commands in detail. Tokens language, lexical analysis language, tokens tokens lexical analysis PSPP divides most syntax file lines into series of short chunks called tokens. Tokens are then grouped to form commands, each of which tells PSPP to take some action—read in data, write out data, perform a statistical procedure, etc. Each type of token is described below. identifiers Identifiers Identifiers are names that typically specify variables, commands, or subcommands. The first character in an identifier must be a letter, ‘#’, or ‘@’. The remaining characters in the identifier must be letters, digits, or one of the following special characters: . _ $ # @ case-sensitivity Identifiers may be any length, but only the first 64 bytes are significant. Identifiers are not case-sensitive: foobar, Foobar, FooBar, FOOBAR, and FoObaR are different representations of the same identifier. identifiers, reserved reserved identifiers Some identifiers are reserved. Reserved identifiers may not be used in any context besides those explicitly described in this manual. The reserved identifiers are: ALL AND BY EQ GE GT LE LT NE NOT OR TO WITH Keywords Keywords are a subclass of identifiers that form a fixed part of command syntax. For example, command and subcommand names are keywords. Keywords may be abbreviated to their first 3 characters if this abbreviation is unambiguous. (Unique abbreviations of 3 or more characters are also accepted: ‘FRE’, ‘FREQ’, and ‘FREQUENCIES’ are equivalent when the last is a keyword.) Reserved identifiers are always used as keywords. Other identifiers may be used both as keywords and as user-defined identifiers, such as variable names. Numbers numbers integers reals Numbers are expressed in decimal. A decimal point is optional. Numbers may be expressed in scientific notation by adding ‘e’ and a base-10 exponent, so that ‘1.234e3’ has the value 1234. Here are some more examples of valid numbers: -5 3.14159265359 1e100 -.707 8945. Negative numbers are expressed with a ‘-’ prefix. However, in situations where a literal ‘-’ token is expected, what appears to be a negative number is treated as ‘-’ followed by a positive number. No white space is allowed within a number token, except for horizontal white space between ‘-’ and the rest of the number. The last example above, ‘8945.’ will be interpreted as two tokens, ‘8945’ and ‘.’, if it is the last token on a line. See Forming commands of tokens. Strings strings ' " case-sensitivity Strings are literal sequences of characters enclosed in pairs of single quotes (‘'’) or double quotes (‘"’). To include the character used for quoting in the string, double it, e.g. ‘'it''s an apostrophe'’. White space and case of letters are significant inside strings. Strings can be concatenated using ‘+’, so that ‘"a" + 'b' + 'c'’ is equivalent to ‘'abc'’. So that a long string may be broken across lines, a line break may precede or follow, or both precede and follow, the ‘+’. (However, an entirely blank line preceding or following the ‘+’ is interpreted as ending the current command.) Strings may also be expressed as hexadecimal character values by prefixing the initial quote character by ‘x’ or ‘X’. Regardless of the syntax file or active dataset’s encoding, the hexadecimal digits in the string are interpreted as Unicode characters in UTF-8 encoding. Individual Unicode code points may also be expressed by specifying the hexadecimal code point number in single or double quotes preceded by ‘u’ or ‘U’. For example, Unicode code point U+1D11E, the musical G clef character, could be expressed as U'1D11E'. Invalid Unicode code points (above U+10FFFF or in between U+D800 and U+DFFF) are not allowed. When strings are concatenated with ‘+’, each segment’s prefix is considered individually. For example, 'The G clef symbol is:' + u"1d11e" + "." inserts a G clef symbol in the middle of an otherwise plain text string. Punctuators and Operators punctuators operators These tokens are the punctuators and operators: , / = ( ) + - * / ** < <= <> > >= ~= & | . Most of these appear within the syntax of commands, but the period (‘.’) punctuator is used only at the end of a command. It is a punctuator only as the last character on a line (except white space). When it is the last non-space character on a line, a period is not treated as part of another token, even if it would otherwise be part of, e.g., an identifier or a floating-point number. Forming commands of tokens PSPP, command structure language, command structure commands, structure Most PSPP commands share a common structure. A command begins with a command name, such as FREQUENCIES, DATA LIST, or N OF CASES. The command name may be abbreviated to its first word, and each word in the command name may be abbreviated to its first three or more characters, where these abbreviations are unambiguous. The command name may be followed by one or more subcommands. Each subcommand begins with a subcommand name, which may be abbreviated to its first three letters. Some subcommands accept a series of one or more specifications, which follow the subcommand name, optionally separated from it by an equals sign (‘=’). Specifications may be separated from each other by commas or spaces. Each subcommand must be separated from the next (if any) by a forward slash (‘/’). There are multiple ways to mark the end of a command. The most common way is to end the last line of the command with a period (‘.’) as described in the previous section (see Tokens). A blank line, or one that consists only of white space or comments, also ends a command. Syntax Variants Batch syntax Interactive syntax There are three variants of command syntax, which vary only in how they detect the end of one command and the start of the next. In interactive mode, which is the default for syntax typed at a command prompt, a period as the last non-blank character on a line ends a command. A blank line also ends a command. In batch mode, an end-of-line period or a blank line also ends a command. Additionally, it treats any line that has a non-blank character in the leftmost column as beginning a new command. Thus, in batch mode the second and subsequent lines in a command must be indented. Regardless of the syntax mode, a plus sign, minus sign, or period in the leftmost column of a line is ignored and causes that line to begin a new command. This is most useful in batch mode, in which the first line of a new command could not otherwise be indented, but it is accepted regardless of syntax mode. The default mode for reading commands from a file is auto mode. It is the same as batch mode, except that a line with a non-blank in the leftmost column only starts a new command if that line begins with the name of a PSPP command. This correctly interprets most valid PSPP syntax files regardless of the syntax mode for which they are intended. The (or ) or (or ) options set the syntax mode for files listed on the PSPP command line. See Main Options, for more details. Types of Commands Commands in PSPP are divided roughly into six categories: Utility commands utility commands Set or display various global options that affect PSPP operations. May appear anywhere in a syntax file. See Utility commands. File definition commands file definition commands Give instructions for reading data from text files or from special binary “system files”. Most of these commands replace any previous data or variables with new data or variables. At least one file definition command must appear before the first command in any of the categories below. See Data Input and Output. Input program commands input program commands Though rarely used, these provide tools for reading data files in arbitrary textual or binary formats. See INPUT PROGRAM. Transformations transformations Perform operations on data and write data to output files. Transformations are not carried out until a procedure is executed. Restricted transformations restricted transformations Transformations that cannot appear in certain contexts. See Order of Commands, for details. Procedures procedures Analyze data, writing results of analyses to the listing file. Cause transformations specified earlier in the file to be performed. In a more general sense, a procedure is any command that causes the active dataset (the data) to be read. Order of Commands commands, ordering order of commands PSPP does not place many restrictions on ordering of commands. The main restriction is that variables must be defined before they are otherwise referenced. This section describes the details of command ordering, but most users will have no need to refer to them. PSPP possesses five internal states, called initial, input-program file-type, transformation, and procedure states. (Please note the distinction between the INPUT PROGRAM and FILE TYPE commands and the input-program and file-type states.) PSPP starts in the initial state. Each successful completion of a command may cause a state transition. Each type of command has its own rules for state transitions: Utility commands Valid in any state. Do not cause state transitions. Exception: when N OF CASES is executed in the procedure state, it causes a transition to the transformation state. DATA LIST Valid in any state. When executed in the initial or procedure state, causes a transition to the transformation state. Clears the active dataset if executed in the procedure or transformation state. INPUT PROGRAM Invalid in input-program and file-type states. Causes a transition to the intput-program state. Clears the active dataset. FILE TYPE Invalid in intput-program and file-type states. Causes a transition to the file-type state. Clears the active dataset. Other file definition commands Invalid in input-program and file-type states. Cause a transition to the transformation state. Clear the active dataset, except for ADD FILES, MATCH FILES, and UPDATE. Transformations Invalid in initial and file-type states. Cause a transition to the transformation state. Restricted transformations Invalid in initial, input-program, and file-type states. Cause a transition to the transformation state. Procedures Invalid in initial, input-program, and file-type states. Cause a transition to the procedure state. Handling missing observations missing values values, missing PSPP includes special support for unknown numeric data values. Missing observations are assigned a special value, called the system-missing value. This “value” actually indicates the absence of a value; it means that the actual value is unknown. Procedures automatically exclude from analyses those observations or cases that have missing values. Details of missing value exclusion depend on the procedure and can often be controlled by the user; refer to descriptions of individual procedures for details. The system-missing value exists only for numeric variables. String variables always have a defined value, even if it is only a string of spaces. Variables, whether numeric or string, can have designated user-missing values. Every user-missing value is an actual value for that variable. However, most of the time user-missing values are treated in the same way as the system-missing value. For more information on missing values, see the following sections: Datasets, MISSING VALUES, Expressions. See also the documentation on individual procedures for information on how they handle missing values. Datasets dataset variable dictionary PSPP works with data organized into datasets. A dataset consists of a set of variables, which taken together are said to form a dictionary, and one or more cases, each of which has one value for each variable. At any given time PSPP has exactly one distinguished dataset, called the active dataset. Most PSPP commands work only with the active dataset. In addition to the active dataset, PSPP also supports any number of additional open datasets. The DATASET commands can choose a new active dataset from among those that are open, as well as create and destroy datasets (see DATASET). The sections below describe variables in more detail. Attributes of Variables variables, attributes of attributes of variables Each variable has a number of attributes, including: Name An identifier, up to 64 bytes long. Each variable must have a different name. See Tokens. Some system variable names begin with ‘$’, but user-defined variables’ names may not begin with ‘$’. . period variable names, ending with period The final character in a variable name should not be ‘.’, because such an identifier will be misinterpreted when it is the final token on a line: FOO. will be divided into two separate tokens, ‘FOO’ and ‘.’, indicating end-of-command. See Tokens. _ The final character in a variable name should not be ‘_’, because some such identifiers are used for special purposes by PSPP procedures. As with all PSPP identifiers, variable names are not case-sensitive. PSPP capitalizes variable names on output the same way they were capitalized at their point of definition in the input. variables, type type of variables Type Numeric or string. variables, width width of variables Width (string variables only) String variables with a width of 8 characters or fewer are called short string variables. Short string variables may be used in a few contexts where long string variables (those with widths greater than 8) are not allowed. Position Variables in the dictionary are arranged in a specific order. DISPLAY can be used to show this order: see DISPLAY. Initialization Either reinitialized to 0 or spaces for each case, or left at its existing value. See LEAVE. missing values values, missing Missing values Optionally, up to three values, or a range of values, or a specific value plus a range, can be specified as user-missing values. There is also a system-missing value that is assigned to an observation when there is no other obvious value for that observation. Observations with missing values are automatically excluded from analyses. User-missing values are actual data values, while the system-missing value is not a value at all. See Missing Observations. variable labels labels, variable Variable label A string that describes the variable. See VARIABLE LABELS. value labels labels, value Value label Optionally, these associate each possible value of the variable with a string. See VALUE LABELS. print format Print format Display width, format, and (for numeric variables) number of decimal places. This attribute does not affect how data are stored, just how they are displayed. Example: a width of 8, with 2 decimal places. See Input and Output Formats. write format Write format Similar to print format, but used by the WRITE command (see WRITE). custom attributes Custom attributes User-defined associations between names and values. See VARIABLE ATTRIBUTE. variable role Role The intended role of a variable for use in dialog boxes in graphical user interfaces. See VARIABLE ROLE. Variables Automatically Defined by PSPP system variables variables, system There are seven system variables. These are not like ordinary variables because system variables are not always stored. They can be used only in expressions. These system variables, whose values and output formats cannot be modified, are described below. $CASENUM $CASENUM Case number of the case at the moment. This changes as cases are shuffled around. $DATE $DATE Date the PSPP process was started, in format A9, following the pattern DD MMM YY. $JDATE $JDATE Number of days between 15 Oct 1582 and the time the PSPP process was started. $LENGTH $LENGTH Page length, in lines, in format F11. $SYSMIS $SYSMIS System missing value, in format F1. $TIME $TIME Number of seconds between midnight 14 Oct 1582 and the time the active dataset was read, in format F20. $WIDTH $WIDTH Page width, in characters, in format F3. Lists of variable names TO convention convention, TO To refer to a set of variables, list their names one after another. Optionally, their names may be separated by commas. To include a range of variables from the dictionary in the list, write the name of the first and last variable in the range, separated by TO. For instance, if the dictionary contains six variables with the names ID, X1, X2, GOAL, MET, and NEXTGOAL, in that order, then X2 TO MET would include variables X2, GOAL, and MET. Commands that define variables, such as DATA LIST, give TO an alternate meaning. With these commands, TO define sequences of variables whose names end in consecutive integers. The syntax is two identifiers that begin with the same root and end with numbers, separated by TO. The syntax X1 TO X5 defines 5 variables, named X1, X2, X3, X4, and X5. The syntax ITEM0008 TO ITEM0013 defines 6 variables, named ITEM0008, ITEM0009, ITEM0010, ITEM0011, ITEM0012, and ITEM00013. The syntaxes QUES001 TO QUES9 and QUES6 TO QUES3 are invalid. After a set of variables has been defined with DATA LIST or another command with this method, the same set can be referenced on later commands using the same syntax. Input and Output Formats formats An input format describes how to interpret the contents of an input field as a number or a string. It might specify that the field contains an ordinary decimal number, a time or date, a number in binary or hexadecimal notation, or one of several other notations. Input formats are used by commands such as DATA LIST that read data or syntax files into the PSPP active dataset. Every input format corresponds to a default output format that specifies the formatting used when the value is output later. It is always possible to explicitly specify an output format that resembles the input format. Usually, this is the default, but in cases where the input format is unfriendly to human readability, such as binary or hexadecimal formats, the default output format is an easier-to-read decimal format. Every variable has two output formats, called its print format and write format. Print formats are used in most output contexts; write formats are used only by WRITE (see WRITE). Newly created variables have identical print and write formats, and FORMATS, the most commonly used command for changing formats (see FORMATS), sets both of them to the same value as well. Thus, most of the time, the distinction between print and write formats is unimportant. Input and output formats are specified to PSPP with a format specification of the form TYPEw or TYPEw.d, where TYPE is one of the format types described later, w is a field width measured in columns, and d is an optional number of decimal places. If d is omitted, a value of 0 is assumed. Some formats do not allow a nonzero d to be specified. The following sections describe the input and output formats supported by PSPP. Basic Numeric Formats numeric formats The basic numeric formats are used for input and output of real numbers in standard or scientific notation. The following table shows an example of how each format displays positive and negative numbers with the default decimal point setting: Format  3141.59 -3141.59 F8.2  3141.59 -3141.59 COMMA9.2  3,141.59 -3,141.59 DOT9.2  3.141,59 -3.141,59 DOLLAR10.2  $3,141.59 -$3,141.59 PCT9.2  3141.59% -3141.59% E8.1  3.1E+003 -3.1E+003 On output, numbers in F format are expressed in standard decimal notation with the requested number of decimal places. The other formats output some variation on this style: Numbers in COMMA format are additionally grouped every three digits by inserting a grouping character. The grouping character is ordinarily a comma, but it can be changed to a period (see SET DECIMAL). DOT format is like COMMA format, but it interchanges the role of the decimal point and grouping characters. That is, the current grouping character is used as a decimal point and vice versa. DOLLAR format is like COMMA format, but it prefixes the number with ‘$’. PCT format is like F format, but adds ‘%’ after the number. The E format always produces output in scientific notation. On input, the basic numeric formats accept positive and numbers in standard decimal notation or scientific notation. Leading and trailing spaces are allowed. An empty or all-spaces field, or one that contains only a single period, is treated as the system missing value. In scientific notation, the exponent may be introduced by a sign (‘+’ or ‘-’), or by one of the letters ‘e’ or ‘d’ (in uppercase or lowercase), or by a letter followed by a sign. A single space may follow the letter or the sign or both. On fixed-format DATA LIST (see DATA LIST FIXED) and in a few other contexts, decimals are implied when the field does not contain a decimal point. In F6.5 format, for example, the field 314159 is taken as the value 3.14159 with implied decimals. Decimals are never implied if an explicit decimal point is present or if scientific notation is used. E and F formats accept the basic syntax already described. The other formats allow some additional variations: COMMA, DOLLAR, and DOT formats ignore grouping characters within the integer part of the input field. The identity of the grouping character depends on the format. DOLLAR format allows a dollar sign to precede the number. In a negative number, the dollar sign may precede or follow the minus sign. PCT format allows a percent sign to follow the number. All of the basic number formats have a maximum field width of 40 and accept no more than 16 decimal places, on both input and output. Some additional restrictions apply: As input formats, the basic numeric formats allow no more decimal places than the field width. As output formats, the field width must be greater than the number of decimal places; that is, large enough to allow for a decimal point and the number of requested decimal places. DOLLAR and PCT formats must allow an additional column for ‘$’ or ‘%’. The default output format for a given input format increases the field width enough to make room for optional input characters. If an input format calls for decimal places, the width is increased by 1 to make room for an implied decimal point. COMMA, DOT, and DOLLAR formats also increase the output width to make room for grouping characters. DOLLAR and PCT further increase the output field width by 1 to make room for ‘$’ or ‘%’. The increased output width is capped at 40, the maximum field width. The E format is exceptional. For output, E format has a minimum width of 7 plus the number of decimal places. The default output format for an E input format is an E format with at least 3 decimal places and thus a minimum width of 10. More details of basic numeric output formatting are given below: Output rounds to nearest, with ties rounded away from zero. Thus, 2.5 is output as 3 in F1.0 format, and -1.125 as -1.13 in F5.1 format. The system-missing value is output as a period in a field of spaces, placed in the decimal point’s position, or in the rightmost column if no decimal places are requested. A period is used even if the decimal point character is a comma. A number that does not fill its field is right-justified within the field. A number is too large for its field causes decimal places to be dropped to make room. If dropping decimals does not make enough room, scientific notation is used if the field is wide enough. If a number does not fit in the field, even in scientific notation, the overflow is indicated by filling the field with asterisks (‘*’). COMMA, DOT, and DOLLAR formats insert grouping characters only if space is available for all of them. Grouping characters are never inserted when all decimal places must be dropped. Thus, 1234.56 in COMMA5.2 format is output as ‘ 1235’ without a comma, even though there is room for one, because all decimal places were dropped. DOLLAR or PCT format drop the ‘$’ or ‘%’ only if the number would not fit at all without it. Scientific notation with ‘$’ or ‘%’ is preferred to ordinary decimal notation without it. Except in scientific notation, a decimal point is included only when it is followed by a digit. If the integer part of the number being output is 0, and a decimal point is included, then the zero before the decimal point is dropped. In scientific notation, the number always includes a decimal point, even if it is not followed by a digit. A negative number includes a minus sign only in the presence of a nonzero digit: -0.01 is output as ‘-.01’ in F4.2 format but as ‘  .0’ in F4.1 format. Thus, a “negative zero” never includes a minus sign. In negative numbers output in DOLLAR format, the dollar sign follows the negative sign. Thus, -9.99 in DOLLAR6.2 format is output as -$9.99. In scientific notation, the exponent is output as ‘E’ followed by ‘+’ or ‘-’ and exactly three digits. Numbers with magnitude less than 10**-999 or larger than 10**999 are not supported by most computers, but if they are supported then their output is considered to overflow the field and will be output as asterisks. On most computers, no more than 15 decimal digits are significant in output, even if more are printed. In any case, output precision cannot be any higher than input precision; few data sets are accurate to 15 digits of precision. Unavoidable loss of precision in intermediate calculations may also reduce precision of output. Special values such as infinities and “not a number” values are usually converted to the system-missing value before printing. In a few circumstances, these values are output directly. In fields of width 3 or greater, special values are output as however many characters will fit from +Infinity or -Infinity for infinities, from NaN for “not a number,” or from Unknown for other values (if any are supported by the system). In fields under 3 columns wide, special values are output as asterisks. Custom Currency Formats currency formats The custom currency formats are closely related to the basic numeric formats, but they allow users to customize the output format. The SET command configures custom currency formats, using the syntax SET CCx="string". where x is A, B, C, D, or E, and string is no more than 16 characters long. string must contain exactly three commas or exactly three periods (but not both), except that a single quote character may be used to “escape” a following comma, period, or single quote. If three commas are used, commas will be used for grouping in output, and a period will be used as the decimal point. Uses of periods reverses these roles. The commas or periods divide string into four fields, called the negative prefix, prefix, suffix, and negative suffix, respectively. The prefix and suffix are added to output whenever space is available. The negative prefix and negative suffix are always added to a negative number when the output includes a nonzero digit. The following syntax shows how custom currency formats could be used to reproduce basic numeric formats: SET CCA="-,,,". /* Same as COMMA. SET CCB="-...". /* Same as DOT. SET CCC="-,$,,". /* Same as DOLLAR. SET CCD="-,,%,". /* Like PCT, but groups with commas. Here are some more examples of custom currency formats. The final example shows how to use a single quote to escape a delimiter: SET CCA=",EUR,,-". /* Euro. SET CCB="(,USD ,,)". /* US dollar. SET CCC="-.R$..". /* Brazilian real. SET CCD="-,, NIS,". /* Israel shekel. SET CCE="-.Rp'. ..". /* Indonesia Rupiah. These formats would yield the following output: Format  3145.59 -3145.59 CCA12.2  EUR3,145.59 EUR3,145.59- CCB14.2   USD 3,145.59 (USD 3,145.59) CCC11.2  R$3.145,59 -R$3.145,59 CCD13.2  3,145.59 NIS -3,145.59 NIS CCE10.0  Rp. 3.146 -Rp. 3.146 The default for all the custom currency formats is ‘-,,,’, equivalent to COMMA format. Legacy Numeric Formats The N and Z numeric formats provide compatibility with legacy file formats. They have much in common: Output is rounded to the nearest representable value, with ties rounded away from zero. Numbers too large to display are output as a field filled with asterisks (‘*’). The decimal point is always implicitly the specified number of digits from the right edge of the field, except that Z format input allows an explicit decimal point. Scientific notation may not be used. The system-missing value is output as a period in a field of spaces. The period is placed just to the right of the implied decimal point in Z format, or at the right end in N format or in Z format if no decimal places are requested. A period is used even if the decimal point character is a comma. Field width may range from 1 to 40. Decimal places may range from 0 up to the field width, to a maximum of 16. When a legacy numeric format used for input is converted to an output format, it is changed into the equivalent F format. The field width is increased by 1 if any decimal places are specified, to make room for a decimal point. For Z format, the field width is increased by 1 more column, to make room for a negative sign. The output field width is capped at 40 columns. N Format The N format supports input and output of fields that contain only digits. On input, leading or trailing spaces, a decimal point, or any other non-digit character causes the field to be read as the system-missing value. As a special exception, an N format used on DATA LIST FREE or DATA LIST LIST is treated as the equivalent F format. On output, N pads the field on the left with zeros. Negative numbers are output like the system-missing value. Z Format The Z format is a “zoned decimal” format used on IBM mainframes. Z format encodes the sign as part of the final digit, which must be one of the following: 0123456789 {ABCDEFGHI }JKLMNOPQR where the characters in each row represent digits 0 through 9 in order. Characters in the first two rows indicate a positive sign; those in the third indicate a negative sign. On output, Z fields are padded on the left with spaces. On input, leading and trailing spaces are ignored. Any character in an input field other than spaces, the digit characters above, and ‘.’ causes the field to be read as system-missing. The decimal point character for input and output is always ‘.’, even if the decimal point character is a comma (see SET DECIMAL). Nonzero, negative values output in Z format are marked as negative even when no nonzero digits are output. For example, -0.2 is output in Z1.0 format as ‘J’. The “negative zero” value supported by most machines is output as positive. Binary and Hexadecimal Numeric Formats binary formats hexadecimal formats The binary and hexadecimal formats are primarily designed for compatibility with existing machine formats, not for human readability. All of them therefore have a F format as default output format. Some of these formats are only portable between machines with compatible byte ordering (endianness) or floating-point format. Binary formats use byte values that in text files are interpreted as special control functions, such as carriage return and line feed. Thus, data in binary formats should not be included in syntax files or read from data files with variable-length records, such as ordinary text files. They may be read from or written to data files with fixed-length records. See FILE HANDLE, for information on working with fixed-length records. P and PK Formats These are binary-coded decimal formats, in which every byte (except the last, in P format) represents two decimal digits. The most-significant 4 bits of the first byte is the most-significant decimal digit, the least-significant 4 bits of the first byte is the next decimal digit, and so on. In P format, the most-significant 4 bits of the last byte are the least-significant decimal digit. The least-significant 4 bits represent the sign: decimal 15 indicates a negative value, decimal 13 indicates a positive value. Numbers are rounded downward on output. The system-missing value and numbers outside representable range are output as zero. The maximum field width is 16. Decimal places may range from 0 up to the number of decimal digits represented by the field. The default output format is an F format with twice the input field width, plus one column for a decimal point (if decimal places were requested). IB and PIB Formats These are integer binary formats. IB reads and writes 2’s complement binary integers, and PIB reads and writes unsigned binary integers. The byte ordering is by default the host machine’s, but SET RIB may be used to select a specific byte ordering for reading (see SET RIB) and SET WIB, similarly, for writing (see SET WIB). The maximum field width is 8. Decimal places may range from 0 up to the number of decimal digits in the largest value representable in the field width. The default output format is an F format whose width is the number of decimal digits in the largest value representable in the field width, plus 1 if the format has decimal places. RB Format This is a binary format for real numbers. By default it reads and writes the host machine’s floating-point format, but SET RRB may be used to select an alternate floating-point format for reading (see SET RRB) and SET WRB, similarly, for writing (see SET WRB). The recommended field width depends on the floating-point format. NATIVE (the default format), IDL, IDB, VD, VG, and ZL formats should use a field width of 8. ISL, ISB, VF, and ZS formats should use a field width of 4. Other field widths will not produce useful results. The maximum field width is 8. No decimal places may be specified. The default output format is F8.2. PIBHEX and RBHEX Formats These are hexadecimal formats, for reading and writing binary formats where each byte has been recoded as a pair of hexadecimal digits. A hexadecimal field consists solely of hexadecimal digits ‘0’…‘9’ and ‘A’…‘F’. Uppercase and lowercase are accepted on input; output is in uppercase. Other than the hexadecimal representation, these formats are equivalent to PIB and RB formats, respectively. However, bytes in PIBHEX format are always ordered with the most-significant byte first (big-endian order), regardless of the host machine’s native byte order or PSPP settings. Field widths must be even and between 2 and 16. RBHEX format allows no decimal places; PIBHEX allows as many decimal places as a PIB format with half the given width. Time and Date Formats time formats date formats In PSPP, a time is an interval. The time formats translate between human-friendly descriptions of time intervals and PSPP’s internal representation of time intervals, which is simply the number of seconds in the interval. PSPP has three time formats: Time Format Template Example MTIME MM:SS.ss 91:17.01 TIME hh:MM:SS.ss 01:31:17.01 DTIME DD HH:MM:SS.ss 00 04:31:17.01 A date is a moment in the past or the future. Internally, PSPP represents a date as the number of seconds since the epoch, midnight, Oct. 14, 1582. The date formats translate between human-readable dates and PSPP’s numeric representation of dates and times. PSPP has several date formats: Date Format Template Example DATE dd-mmm-yyyy 01-OCT-1978 ADATE mm/dd/yyyy 10/01/1978 EDATE dd.mm.yyyy 01.10.1978 JDATE yyyyjjj 1978274 SDATE yyyy/mm/dd 1978/10/01 QYR q Q yyyy 3 Q 1978 MOYR mmm yyyy OCT 1978 WKYR ww WK yyyy 40 WK 1978 DATETIME dd-mmm-yyyy HH:MM:SS.ss 01-OCT-1978 04:31:17.01 YMDHMS yyyy-mm-dd HH:MM:SS.ss 1978-01-OCT 04:31:17.01 The templates in the preceding tables describe how the time and date formats are input and output: dd Day of month, from 1 to 31. Always output as two digits. mm mmm Month. In output, mm is output as two digits, mmm as the first three letters of an English month name (January, February, …). In input, both of these formats, plus Roman numerals, are accepted. yyyy Year. In output, DATETIME and YMDHMS always produce 4-digit years; other formats can produce a 2- or 4-digit year. The century assumed for 2-digit years depends on the EPOCH setting (see SET EPOCH). In output, a year outside the epoch causes the whole field to be filled with asterisks (‘*’). jjj Day of year (Julian day), from 1 to 366. This is exactly three digits giving the count of days from the start of the year. January 1 is considered day 1. q Quarter of year, from 1 to 4. Quarters start on January 1, April 1, July 1, and October 1. ww Week of year, from 1 to 53. Output as exactly two digits. January 1 is the first day of week 1. DD Count of days, which may be positive or negative. Output as at least two digits. hh Count of hours, which may be positive or negative. Output as at least two digits. HH Hour of day, from 0 to 23. Output as exactly two digits. MM In MTIME, count of minutes, which may be positive or negative. Output as at least two digits. In other formats, minute of hour, from 0 to 59. Output as exactly two digits. SS.ss Seconds within minute, from 0 to 59. The integer part is output as exactly two digits. On output, seconds and fractional seconds may or may not be included, depending on field width and decimal places. On input, seconds and fractional seconds are optional. The DECIMAL setting controls the character accepted and displayed as the decimal point (see SET DECIMAL). For output, the date and time formats use the delimiters indicated in the table. For input, date components may be separated by spaces or by one of the characters ‘-’, ‘/’, ‘.’, or ‘,’, and time components may be separated by spaces or ‘:’. On input, the ‘Q’ separating quarter from year and the ‘WK’ separating week from year may be uppercase or lowercase, and the spaces around them are optional. On input, all time and date formats accept any amount of leading and trailing white space. The maximum width for time and date formats is 40 columns. Minimum input and output width for each of the time and date formats is shown below: Format Min. Input Width Min. Output Width Option DATE 8 9 4-digit year ADATE 8 8 4-digit year EDATE 8 8 4-digit year JDATE 5 5 4-digit year SDATE 8 8 4-digit year QYR 4 6 4-digit year MOYR 6 6 4-digit year WKYR 6 8 4-digit year DATETIME 17 17 seconds YMDHMS 12 16 seconds MTIME 4 5 TIME 5 5 seconds DTIME 8 8 seconds In the table, “Option” describes what increased output width enables: 4-digit year A field 2 columns wider than minimum will include a 4-digit year. (DATETIME and YMDHMS formats always include a 4-digit year.) seconds A field 3 columns wider than minimum will include seconds as well as minutes. A field 5 columns wider than minimum, or more, can also include a decimal point and fractional seconds (but no more than allowed by the format’s decimal places). For the time and date formats, the default output format is the same as the input format, except that PSPP increases the field width, if necessary, to the minimum allowed for output. Time or dates narrower than the field width are right-justified within the field. When a time or date exceeds the field width, characters are trimmed from the end until it fits. This can occur in an unusual situation, e.g. with a year greater than 9999 (which adds an extra digit), or for a negative value on MTIME, TIME, or DTIME (which adds a leading minus sign). The system-missing value is output as a period at the right end of the field. Date Component Formats The WKDAY and MONTH formats provide input and output for the names of weekdays and months, respectively. On output, these formats convert a number between 1 and 7, for WKDAY, or between 1 and 12, for MONTH, into the English name of a day or month, respectively. If the name is longer than the field, it is trimmed to fit. If the name is shorter than the field, it is padded on the right with spaces. Values outside the valid range, and the system-missing value, are output as all spaces. On input, English weekday or month names (in uppercase or lowercase) are converted back to their corresponding numbers. Weekday and month names may be abbreviated to their first 2 or 3 letters, respectively. The field width may range from 2 to 40, for WKDAY, or from 3 to 40, for MONTH. No decimal places are allowed. The default output format is the same as the input format. String Formats string formats The A and AHEX formats are the only ones that may be assigned to string variables. Neither format allows any decimal places. In A format, the entire field is treated as a string value. The field width may range from 1 to 32,767, the maximum string width. The default output format is the same as the input format. In AHEX format, the field is composed of characters in a string encoded as hex digit pairs. On output, hex digits are output in uppercase; on input, uppercase and lowercase are both accepted. The default output format is A format with half the input width. Scratch Variables scratch variables Most of the time, variables don’t retain their values between cases. Instead, either they’re being read from a data file or the active dataset, in which case they assume the value read, or, if created with COMPUTE or another transformation, they’re initialized to the system-missing value or to blanks, depending on type. However, sometimes it’s useful to have a variable that keeps its value between cases. You can do this with LEAVE (see LEAVE), or you can use a scratch variable. Scratch variables are variables whose names begin with an octothorpe (‘#’). Scratch variables have the same properties as variables left with LEAVE: they retain their values between cases, and for the first case they are initialized to 0 or blanks. They have the additional property that they are deleted before the execution of any procedure. For this reason, scratch variables can’t be used for analysis. To use a scratch variable in an analysis, use COMPUTE (see COMPUTE) to copy its value into an ordinary variable, then use that ordinary variable in the analysis. Files Used by PSPP PSPP makes use of many files each time it runs. Some of these it reads, some it writes, some it creates. Here is a table listing the most important of these files: file, command file, syntax file command file syntax file command file syntax file These names (synonyms) refer to the file that contains instructions that tell PSPP what to do. The syntax file’s name is specified on the PSPP command line. Syntax files can also be read with INCLUDE (see INCLUDE). file, data data file data file Data files contain raw data in text or binary format. Data can also be embedded in a syntax file with BEGIN DATA and END DATA. file, output output file listing file One or more output files are created by PSPP each time it is run. The output files receive the tables and charts produced by statistical procedures. The output files may be in any number of formats, depending on how PSPP is configured. system file file, system system file System files are binary files that store a dictionary and a set of cases. GET and SAVE read and write system files. portable file file, portable portable file Portable files are files in a text-based format that store a dictionary and a set of cases. IMPORT and EXPORT read and write portable files. File Handles file handles A file handle is a reference to a data file, system file, or portable file. Most often, a file handle is specified as the name of a file as a string, that is, enclosed within ‘'’ or ‘"’. A file name string that begins or ends with ‘|’ is treated as the name of a command to pipe data to or from. You can use this feature to read data over the network using a program such as ‘curl’ (e.g. GET '|curl -s -S http://example.com/mydata.sav'), to read compressed data from a file using a program such as ‘zcat’ (e.g. GET '|zcat mydata.sav.gz'), and for many other purposes. PSPP also supports declaring named file handles with the FILE HANDLE command. This command associates an identifier of your choice (the file handle’s name) with a file. Later, the file handle name can be substituted for the name of the file. When PSPP syntax accesses a file multiple times, declaring a named file handle simplifies updating the syntax later to use a different file. Use of FILE HANDLE is also required to read data files in binary formats. See FILE HANDLE, for more information. In some circumstances, PSPP must distinguish whether a file handle refers to a system file or a portable file. When this is necessary to read a file, e.g. as an input file for GET or MATCH FILES, PSPP uses the file’s contents to decide. In the context of writing a file, e.g. as an output file for SAVE or AGGREGATE, PSPP decides based on the file’s name: if it ends in ‘.por’ (with any capitalization), then PSPP writes a portable file; otherwise, PSPP writes a system file. INLINE is reserved as a file handle name. It refers to the “data file” embedded into the syntax file between BEGIN DATA and END DATA. See BEGIN DATA, for more information. The file to which a file handle refers may be reassigned on a later FILE HANDLE command if it is first closed using CLOSE FILE HANDLE. See CLOSE FILE HANDLE, for more information. Backus-Naur Form BNF Backus-Naur Form command syntax, description of description of command syntax The syntax of some parts of the PSPP language is presented in this manual using the formalism known as Backus-Naur Form, or BNF. The following table describes BNF: keywords terminals Words in all-uppercase are PSPP keyword tokens. In BNF, these are often called terminals. There are some special terminals, which are written in lowercase for clarity: number number A real number. integer integer An integer number. string string A string. var-name var-name A single variable name. operators punctuators =, /, +, -, etc. Operators and punctuators. . . The end of the command. This is not necessarily an actual dot in the syntax file (see Commands). productions nonterminals Other words in all lowercase refer to BNF definitions, called productions. These productions are also known as nonterminals. Some nonterminals are very common, so they are defined here in English for clarity: var-list var-list A list of one or more variable names or the keyword ALL. expression expression An expression. See Expressions, for details. “is defined as” productions ::=’ means “is defined as”. The left side of ‘::=’ gives the name of the nonterminal being defined. The right side of ‘::=’ gives the definition of that nonterminal. If the right side is empty, then one possible expansion of that nonterminal is nothing. A BNF definition is called a production. terminals and nonterminals, differences So, the key difference between a terminal and a nonterminal is that a terminal cannot be broken into smaller parts—in fact, every terminal is a single token (see Tokens). On the other hand, nonterminals are composed of a (possibly empty) sequence of terminals and nonterminals. Thus, terminals indicate the deepest level of syntax description. (In parsing theory, terminals are the leaves of the parse tree; nonterminals form the branches.) start symbol symbol, start The first nonterminal defined in a set of productions is called the start symbol. The start symbol defines the entire syntax for that command. Mathematical Expressions expressions, mathematical mathematical expressions Expressions share a common syntax each place they appear in PSPP commands. Expressions are made up of operands, which can be numbers, strings, or variable names, separated by operators. There are five types of operators: grouping, arithmetic, logical, relational, and functions. Every operator takes one or more operands as input and yields exactly one result as output. Depending on the operator, operands accept strings or numbers as operands. With few exceptions, operands may be full-fledged expressions in themselves. Boolean Values Boolean values, Boolean Some PSPP operators and expressions work with Boolean values, which represent true/false conditions. Booleans have only three possible values: 0 (false), 1 (true), and system-missing (unknown). System-missing is neither true nor false and indicates that the true value is unknown. Boolean-typed operands or function arguments must take on one of these three values. Other values are considered false, but provoke a warning when the expression is evaluated. Strings and Booleans are not compatible, and neither may be used in place of the other. Missing Values in Expressions Most numeric operators yield system-missing when given any system-missing operand. A string operator given any system-missing operand typically results in the empty string. Exceptions are listed under particular operator descriptions. String user-missing values are not treated specially in expressions. User-missing values for numeric variables are always transformed into the system-missing value, except inside the arguments to the VALUE and SYSMIS functions. The missing-value functions can be used to precisely control how missing values are treated in expressions. See Missing Value Functions, for more details. Grouping Operators parentheses ( ) grouping operators operators, grouping Parentheses (‘()’) are the grouping operators. Surround an expression with parentheses to force early evaluation. Parentheses also surround the arguments to functions, but in that situation they act as punctuators, not as operators. Arithmetic Operators operators, arithmetic arithmetic operators The arithmetic operators take numeric operands and produce numeric results. + addition a + b Yields the sum of a and b. - subtraction a - b Subtracts b from a and yields the difference. * multiplication a * b Yields the product of a and b. If either a or b is 0, then the result is 0, even if the other operand is missing. / division a / b Divides a by b and yields the quotient. If a is 0, then the result is 0, even if b is missing. If b is zero, the result is system-missing. ** exponentiation a ** b Yields the result of raising a to the power b. If a is negative and b is not an integer, the result is system-missing. The result of 0**0 is system-missing as well. - negation - a Reverses the sign of a. Logical Operators logical operators operators, logical true false Boolean values, system-missing system-missing The logical operators take logical operands and produce logical results, meaning “true or false.” Logical operators are not true Boolean operators because they may also result in a system-missing value. See Boolean Values, for more information. AND & intersection, logical logical intersection a AND b a & b True if both a and b are true, false otherwise. If one operand is false, the result is false even if the other is missing. If both operands are missing, the result is missing. OR | union, logical logical union a OR b a | b True if at least one of a and b is true. If one operand is true, the result is true even if the other operand is missing. If both operands are missing, the result is missing. NOT ~ inversion, logical logical inversion NOT a ~ a True if a is false. If the operand is missing, then the result is missing. Relational Operators The relational operators take numeric or string operands and produce Boolean results. Strings cannot be compared to numbers. When strings of different lengths are compared, the shorter string is right-padded with spaces to match the length of the longer string. The results of string comparisons, other than tests for equality or inequality, depend on the character set in use. String comparisons are case-sensitive. equality, testing testing for equality EQ = a EQ b a = b True if a is equal to b. less than or equal to LE <= a LE b a <= b True if a is less than or equal to b. less than LT < a LT b a < b True if a is less than b. greater than or equal to GE >= a GE b a >= b True if a is greater than or equal to b. greater than GT > a GT b a > b True if a is greater than b. inequality, testing testing for inequality NE ~= <> a NE b a ~= b a <> b True if a is not equal to b. Functions functions mathematics operators parentheses ( ) names, of functions PSPP functions provide mathematical abilities above and beyond those possible using simple operators. Functions have a common syntax: each is composed of a function name followed by a left parenthesis, one or more arguments, and a right parenthesis. Function names are not reserved. Their names are specially treated only when followed by a left parenthesis, so that ‘EXP(10)’ refers to the constant value e raised to the 10th power, but ‘EXP’ by itself refers to the value of a variable called EXP. The sections below describe each function in detail. Mathematical Functions mathematics, advanced Advanced mathematical functions take numeric arguments and produce numeric results. EXPFunction: EXP (exponent)
Returns e (approximately 2.71828) raised to power exponent.
logarithms LG10Function: LG10 (number)
Takes the base-10 logarithm of number. If number is not positive, the result is system-missing.
LNFunction: LN (number)
Takes the base-e logarithm of number. If number is not positive, the result is system-missing.
LNGAMMAFunction: LNGAMMA (number)
Yields the base-e logarithm of the complete gamma of number. If number is a negative integer, the result is system-missing.
square roots SQRTFunction: SQRT (number)
Takes the square root of number. If number is negative, the result is system-missing.
Miscellaneous Mathematical Functions mathematics, miscellaneous Miscellaneous mathematical functions take numeric arguments and produce numeric results. absolute value ABSFunction: ABS (number)
Results in the absolute value of number.
modulus MODFunction: MOD (numerator, denominator)
Returns the remainder (modulus) of numerator divided by denominator. If numerator is 0, then the result is 0, even if denominator is missing. If denominator is 0, the result is system-missing.
modulus, by 10 MOD10Function: MOD10 (number)
Returns the remainder when number is divided by 10. If number is negative, MOD10(number) is negative or zero.
rounding RNDFunction: RND (number [, mult[, fuzzbits]])
Rounds number and rounds it to a multiple of mult (by default 1). Halves are rounded away from zero, as are values that fall short of halves by less than fuzzbits of errors in the least-significant bits of number. If fuzzbits is not specified then the default is taken from SET FUZZBITS (see SET FUZZBITS), which is 6 unless overridden.
truncation TRUNCFunction: TRUNC (number [, mult[, fuzzbits]])
Rounds number to a multiple of mult, toward zero. For the default mult of 1, this is equivalent to discarding the fractional part of number. Values that fall short of a multiple of mult by less than fuzzbits of errors in the least-significant bits of number are rounded away from zero. If fuzzbits is not specified then the default is taken from SET FUZZBITS (see SET FUZZBITS), which is 6 unless overridden.
Trigonometric Functions trigonometry Trigonometric functions take numeric arguments and produce numeric results. arccosine inverse cosine ARCOSFunction: ARCOS (number) ACOSFunction: ACOS (number)
Takes the arccosine, in radians, of number. Results in system-missing if number is not between -1 and 1 inclusive. This function is a PSPP extension.
arcsine inverse sine ARSINFunction: ARSIN (number) ASINFunction: ASIN (number)
Takes the arcsine, in radians, of number. Results in system-missing if number is not between -1 and 1 inclusive.
arctangent inverse tangent ARTANFunction: ARTAN (number) ATANFunction: ATAN (number)
Takes the arctangent, in radians, of number.
cosine COSFunction: COS (angle)
Takes the cosine of angle which should be in radians.
sine SINFunction: SIN (angle)
Takes the sine of angle which should be in radians.
tangent TANFunction: TAN (angle)
Takes the tangent of angle which should be in radians. Results in system-missing at values of angle that are too close to odd multiples of \pi/2. Portability: none.
Missing-Value Functions missing values values, missing functions, missing-value Missing-value functions take various numeric arguments and yield various types of results. Except where otherwise stated below, the normal rules of evaluation apply within expression arguments to these functions. In particular, user-missing values for numeric variables are converted to system-missing values. MISSINGFunction: MISSING (expr)
When expr is simply the name of a numeric variable, returns 1 if the variable has the system-missing value or if it is user-missing. For any other value 0 is returned. If expr takes another form, the function returns 1 if the value is system-missing, 0 otherwise.
NMISSFunction: NMISS (expr [, expr])
Each argument must be a numeric expression. Returns the number of system-missing values in the list, which may include variable ranges using the var1 TO var2 syntax.
NVALIDFunction: NVALID (expr [, expr])
Each argument must be a numeric expression. Returns the number of values in the list that are not system-missing. The list may include variable ranges using the var1 TO var2 syntax.
SYSMISFunction: SYSMIS (expr)
Returns 1 if expr has the system-missing value, 0 otherwise.
VALUEFunction: VALUE (variable)
Prevents the user-missing values of variable from being transformed into system-missing values, and always results in the actual value of variable, whether it is valid, user-missing, or system-missing.
Set-Membership Functions set membership membership, of set Set membership functions determine whether a value is a member of a set. They take a set of numeric arguments or a set of string arguments, and produce Boolean results. String comparisons are performed according to the rules given in Relational Operators. ANYFunction: ANY (value, set [, set])
Results in true if value is equal to any of the set values. Otherwise, results in false. If value is system-missing, returns system-missing. System-missing values in set do not cause ANY to return system-missing.
RANGEFunction: RANGE (value, low, high [, low, high])
Results in true if value is in any of the intervals bounded by low and high inclusive. Otherwise, results in false. Each low must be less than or equal to its corresponding high value. low and high must be given in pairs. If value is system-missing, returns system-missing. System-missing values in set do not cause RANGE to return system-missing.
Statistical Functions functions, statistical statistics Statistical functions compute descriptive statistics on a list of values. Some statistics can be computed on numeric or string values; other can only be computed on numeric values. Their results have the same type as their arguments. The current case’s weighting factor (see WEIGHT) has no effect on statistical functions. These functions’ argument lists may include entire ranges of variables using the var1 TO var2 syntax. arguments, minimum valid minimum valid number of arguments Unlike most functions, statistical functions can return non-missing values even when some of their arguments are missing. Most statistical functions, by default, require only 1 non-missing value to have a non-missing return, but CFVAR, SD, and VARIANCE require 2. These defaults can be increased (but not decreased) by appending a dot and the minimum number of valid arguments to the function name. For example, MEAN.3(X, Y, Z) would only return non-missing if all of ‘X’, ‘Y’, and ‘Z’ were valid. coefficient of variation variation, coefficient of CFVARFunction: CFVAR (number, number[, ])
Results in the coefficient of variation of the values of number. (The coefficient of variation is the standard deviation divided by the mean.)
maximum MAXFunction: MAX (value, value[, ])
Results in the value of the greatest value. The values may be numeric or string.
mean MEANFunction: MEAN (number, number[, ])
Results in the mean of the values of number.
median MEDIANFunction: MEDIAN (number, number[, ])
Results in the median of the values of number. Given an even number of nonmissing arguments, yields the mean of the two middle values.
minimum MINFunction: MIN (number, number[, ])
Results in the value of the least value. The values may be numeric or string.
standard deviation deviation, standard SDFunction: SD (number, number[, ])
Results in the standard deviation of the values of number.
sum SUMFunction: SUM (number, number[, ])
Results in the sum of the values of number.
variance VARIANCEFunction: VARIANCE (number, number[, ])
Results in the variance of the values of number.
String Functions functions, string string functions String functions take various arguments and return various results. concatenation strings, concatenation of CONCATFunction: CONCAT (string, string[, ])
Returns a string consisting of each string in sequence. CONCAT("abc", "def", "ghi") has a value of "abcdefghi". The resultant string is truncated to a maximum of 255 characters.
searching strings INDEXFunction: INDEX (haystack, needle)
Returns a positive integer indicating the position of the first occurrence of needle in haystack. Returns 0 if haystack does not contain needle. Returns system-missing if needle is an empty string.
INDEXFunction: INDEX (haystack, needles, needle_len)
Divides needles into one or more needles, each with length needle_len. Searches haystack for the first occurrence of each needle, and returns the smallest value. Returns 0 if haystack does not contain any part in needle. It is an error if needle_len does not evenly divide the length of needles. Returns system-missing if needles is an empty string.
strings, finding length of LENGTHFunction: LENGTH (string)
Returns the number of characters in string.
strings, case of LOWERFunction: LOWER (string)
Returns a string identical to string except that all uppercase letters are changed to lowercase letters. The definitions of “uppercase” and “lowercase” are system-dependent.
strings, padding LPADFunction: LPAD (string, length)
If string is at least length characters in length, returns string unchanged. Otherwise, returns string padded with spaces on the left side to length length. Returns an empty string if length is system-missing, negative, or greater than 255.
LPADFunction: LPAD (string, length, padding)
If string is at least length characters in length, returns string unchanged. Otherwise, returns string padded with padding on the left side to length length. Returns an empty string if length is system-missing, negative, or greater than 255, or if padding does not contain exactly one character.
strings, trimming white space, trimming LTRIMFunction: LTRIM (string)
Returns string, after removing leading spaces. Other white space, such as tabs, carriage returns, line feeds, and vertical tabs, is not removed.
LTRIMFunction: LTRIM (string, padding)
Returns string, after removing leading padding characters. If padding does not contain exactly one character, returns an empty string.
numbers, converting from strings strings, converting to numbers NUMBERFunction: NUMBER (string, format)
Returns the number produced when string is interpreted according to format specifier format. If the format width w is less than the length of string, then only the first w characters in string are used, e.g. NUMBER("123", F3.0) and NUMBER("1234", F3.0) both have value 123. If w is greater than string’s length, then it is treated as if it were right-padded with spaces. If string is not in the correct format for format, system-missing is returned.
strings, replacing substrings replacing substrings REPLACEFunction: REPLACE (haystack, needle, replacement[, n])
Returns string haystack with instances of needle replaced by replacement. If nonnegative integer n is specified, it limits the maximum number of replacements; otherwise, all instances of needle are replaced.
strings, searching backwards RINDEXFunction: RINDEX (haystack, needle)
Returns a positive integer indicating the position of the last occurrence of needle in haystack. Returns 0 if haystack does not contain needle. Returns system-missing if needle is an empty string.
RINDEXFunction: RINDEX (haystack, needle, needle_len)
Divides needle into parts, each with length needle_len. Searches haystack for the last occurrence of each part, and returns the largest value. Returns 0 if haystack does not contain any part in needle. It is an error if needle_len does not evenly divide the length of needle. Returns system-missing if needle is an empty string or if needle_len is less than 1.
padding strings strings, padding RPADFunction: RPAD (string, length)
If string is at least length characters in length, returns string unchanged. Otherwise, returns string padded with spaces on the right to length length. Returns an empty string if length is system-missing, negative, or greater than 255.
RPADFunction: RPAD (string, length, padding)
If string is at least length characters in length, returns string unchanged. Otherwise, returns string padded with padding on the right to length length. Returns an empty string if length is system-missing, negative, or greater than 255, or if padding does not contain exactly one character.
strings, trimming white space, trimming RTRIMFunction: RTRIM (string)
Returns string, after removing trailing spaces. Other types of white space are not removed.
RTRIMFunction: RTRIM (string, padding)
Returns string, after removing trailing padding characters. If padding does not contain exactly one character, returns an empty string.
strings, converting from numbers numbers, converting to strings STRINGFunction: STRING (number, format)
Returns a string corresponding to number in the format given by format specifier format. For example, STRING(123.56, F5.1) has the value "123.6".
strings, trimming strings, truncating white space, trimming STRUNCFunction: STRUNC (string, n)
Returns string, first trimming it to at most n bytes, then removing trailing spaces. Returns an empty string if n is missing or negative.
substrings strings, taking substrings of SUBSTRFunction: SUBSTR (string, start)
Returns a string consisting of the value of string from position start onward. Returns an empty string if start is system-missing, less than 1, or greater than the length of string.
SUBSTRFunction: SUBSTR (string, start, count)
Returns a string consisting of the first count characters from string beginning at position start. Returns an empty string if start or count is system-missing, if start is less than 1 or greater than the number of characters in string, or if count is less than 1. Returns a string shorter than count characters if start + count - 1 is greater than the number of characters in string. Examples: SUBSTR("abcdefg", 3, 2) has value "cd"; SUBSTR("nonsense", 4, 10) has the value "sense".
case conversion strings, case of UPCASEFunction: UPCASE (string)
Returns string, changing lowercase letters to uppercase letters.
Time & Date Functions functions, time & date times dates dates, valid For compatibility, PSPP considers dates before 15 Oct 1582 invalid. Most time and date functions will not accept earlier dates. How times & dates are defined and represented time, concepts time, intervals Times and dates are handled by PSPP as single numbers. A time is an interval. PSPP measures times in seconds. Thus, the following intervals correspond with the numeric values given: 10 minutes 600 1 hour 3,600 1 day, 3 hours, 10 seconds 97,210 40 days 3,456,000 dates, concepts time, instants of A date, on the other hand, is a particular instant in the past or the future. PSPP represents a date as a number of seconds since midnight preceding 14 Oct 1582. Because midnight preceding the dates given below correspond with the numeric PSPP dates given: 15 Oct 1582 86,400 4 Jul 1776 6,113,318,400 1 Jan 1900 10,010,390,400 1 Oct 1978 12,495,427,200 24 Aug 1995 13,028,601,600 Functions that Produce Times times, constructing constructing times These functions take numeric arguments and return numeric values that represent times. days time, in days TIME.DAYSFunction: TIME.DAYS (ndays)
Returns a time corresponding to ndays days.
hours-minutes-seconds time, in hours-minutes-seconds TIME.HMSFunction: TIME.HMS (nhours, nmins, nsecs)
Returns a time corresponding to nhours hours, nmins minutes, and nsecs seconds. The arguments may not have mixed signs: if any of them are positive, then none may be negative, and vice versa.
Functions that Examine Times extraction, of time time examination examination, of times time, lengths of These functions take numeric arguments in PSPP time format and give numeric results. days time, in days CTIME.DAYSFunction: CTIME.DAYS (time)
Results in the number of days and fractional days in time.
hours time, in hours CTIME.HOURSFunction: CTIME.HOURS (time)
Results in the number of hours and fractional hours in time.
minutes time, in minutes CTIME.MINUTESFunction: CTIME.MINUTES (time)
Results in the number of minutes and fractional minutes in time.
seconds time, in seconds CTIME.SECONDSFunction: CTIME.SECONDS (time)
Results in the number of seconds and fractional seconds in time. (CTIME.SECONDS does nothing; CTIME.SECONDS(x) is equivalent to x.)
Functions that Produce Dates dates, constructing constructing dates arguments, of date construction functions These functions take numeric arguments and give numeric results that represent dates. Arguments taken by these functions are: day Refers to a day of the month between 1 and 31. Day 0 is also accepted and refers to the final day of the previous month. Days 29, 30, and 31 are accepted even in months that have fewer days and refer to a day near the beginning of the following month. month Refers to a month of the year between 1 and 12. Months 0 and 13 are also accepted and refer to the last month of the preceding year and the first month of the following year, respectively. quarter Refers to a quarter of the year between 1 and 4. The quarters of the year begin on the first day of months 1, 4, 7, and 10. week Refers to a week of the year between 1 and 53. yday Refers to a day of the year between 1 and 366. year Refers to a year, 1582 or greater. Years between 0 and 99 are treated according to the epoch set on SET EPOCH, by default beginning 69 years before the current date (see SET EPOCH). arguments, invalid If these functions’ arguments are out-of-range, they are correctly normalized before conversion to date format. Non-integers are rounded toward zero. day-month-year dates, day-month-year DATE.DMYFunction: DATE.DMY (day, month, year) DATE.MDYFunction: DATE.MDY (month, day, year)
Results in a date value corresponding to the midnight before day day of month month of year year.
month-year dates, month-year DATE.MOYRFunction: DATE.MOYR (month, year)
Results in a date value corresponding to the midnight before the first day of month month of year year.
quarter-year dates, quarter-year DATE.QYRFunction: DATE.QYR (quarter, year)
Results in a date value corresponding to the midnight before the first day of quarter quarter of year year.
week-year dates, week-year DATE.WKYRFunction: DATE.WKYR (week, year)
Results in a date value corresponding to the midnight before the first day of week week of year year.
year-day dates, year-day DATE.YRDAYFunction: DATE.YRDAY (year, yday)
Results in a date value corresponding to the day yday of year year.
Functions that Examine Dates extraction, of dates date examination arguments, of date extraction functions These functions take numeric arguments in PSPP date or time format and give numeric results. These names are used for arguments: date A numeric value in PSPP date format. time A numeric value in PSPP time format. time-or-date A numeric value in PSPP time or date format. days dates, in days time, in days XDATE.DATEFunction: XDATE.DATE (time-or-date)
For a time, results in the time corresponding to the number of whole days date-or-time includes. For a date, results in the date corresponding to the latest midnight at or before date-or-time; that is, gives the date that date-or-time is in.
hours dates, in hours time, in hours XDATE.HOURFunction: XDATE.HOUR (time-or-date)
For a time, results in the number of whole hours beyond the number of whole days represented by date-or-time. For a date, results in the hour (as an integer between 0 and 23) corresponding to date-or-time.
day of the year dates, day of the year XDATE.JDAYFunction: XDATE.JDAY (date)
Results in the day of the year (as an integer between 1 and 366) corresponding to date.
day of the month dates, day of the month XDATE.MDAYFunction: XDATE.MDAY (date)
Results in the day of the month (as an integer between 1 and 31) corresponding to date.
minutes dates, in minutes time, in minutes XDATE.MINUTEFunction: XDATE.MINUTE (time-or-date)
Results in the number of minutes (as an integer between 0 and 59) after the last hour in time-or-date.
months dates, in months XDATE.MONTHFunction: XDATE.MONTH (date)
Results in the month of the year (as an integer between 1 and 12) corresponding to date.
quarters dates, in quarters XDATE.QUARTERFunction: XDATE.QUARTER (date)
Results in the quarter of the year (as an integer between 1 and 4) corresponding to date.
seconds dates, in seconds time, in seconds XDATE.SECONDFunction: XDATE.SECOND (time-or-date)
Results in the number of whole seconds after the last whole minute (as an integer between 0 and 59) in time-or-date.
days times, in days XDATE.TDAYFunction: XDATE.TDAY (date)
Results in the number of whole days from 14 Oct 1582 to date.
time dates, time of day XDATE.TIMEFunction: XDATE.TIME (date)
Results in the time of day at the instant corresponding to date, as a time value. This is the number of seconds since midnight on the day corresponding to date.
week dates, in weeks XDATE.WEEKFunction: XDATE.WEEK (date)
Results in the week of the year (as an integer between 1 and 53) corresponding to date.
day of the week weekday dates, day of the week dates, in weekdays XDATE.WKDAYFunction: XDATE.WKDAY (date)
Results in the day of week (as an integer between 1 and 7) corresponding to date, where 1 represents Sunday.
years dates, in years XDATE.YEARFunction: XDATE.YEAR (date)
Returns the year (as an integer 1582 or greater) corresponding to date.
Time and Date Arithmetic time, mathematical properties of mathematics, applied to times & dates dates, mathematical properties of Ordinary arithmetic operations on dates and times often produce sensible results. Adding a time to, or subtracting one from, a date produces a new date that much earlier or later. The difference of two dates yields the time between those dates. Adding two times produces the combined time. Multiplying a time by a scalar produces a time that many times longer. Since times and dates are just numbers, the ordinary addition and subtraction operators are employed for these purposes. Adding two dates does not produce a useful result. Dates and times may have very large values. Thus, it is not a good idea to take powers of these values; also, the accuracy of some procedures may be affected. If necessary, convert times or dates in seconds to some other unit, like days or years, before performing analysis. PSPP supplies a few functions for date arithmetic: DATEDIFFFunction: DATEDIFF (date2, date1, unit)
Returns the span of time from date1 to date2 in terms of unit, which must be a quoted string, one of ‘years’, ‘quarters’, ‘months’, ‘weeks’, ‘days’, ‘hours’, ‘minutes’, and ‘seconds’. The result is an integer, truncated toward zero. One year is considered to span from a given date to the same month, day, and time of day the next year. Thus, from Jan. 1 of one year to Jan. 1 the next year is considered to be a full year, but Feb. 29 of a leap year to the following Feb. 28 is not. Similarly, one month spans from a given day of the month to the same day of the following month. Thus, there is never a full month from Jan. 31 of a given year to any day in the following February.
DATESUMFunction: DATESUM (date, quantity, unit[, method])
Returns date advanced by the given quantity of the specified unit, which must be one of the strings ‘years’, ‘quarters’, ‘months’, ‘weeks’, ‘days’, ‘hours’, ‘minutes’, and ‘seconds’. When unit is ‘years’, ‘quarters’, or ‘months’, only the integer part of quantity is considered. Adding one of these units can cause the day of the month to exceed the number of days in the month. In this case, the method comes into play: if it is omitted or specified as ‘closest’ (as a quoted string), then the resulting day is the last day of the month; otherwise, if it is specified as ‘rollover’, then the extra days roll over into the following month. When unit is ‘weeks’, ‘days’, ‘hours’, ‘minutes’, or ‘seconds’, the quantity is not rounded to an integer and method, if specified, is ignored.
Miscellaneous Functions functions, miscellaneous cross-case function function, cross-case LAGFunction: LAG (variable[, n])
variable must be a numeric or string variable name. LAG yields the value of that variable for the case n before the current one. Results in system-missing (for numeric variables) or blanks (for string variables) for the first n cases. LAG obtains values from the cases that become the new active dataset after a procedure executes. Thus, LAG will not return values from cases dropped by transformations such as SELECT IF, and transformations like COMPUTE that modify data will change the values returned by LAG. These are both the case whether these transformations precede or follow the use of LAG. If LAG is used before TEMPORARY, then the values it returns are those in cases just before TEMPORARY. LAG may not be used after TEMPORARY. If omitted, ncases defaults to 1. Otherwise, ncases must be a small positive constant integer. There is no explicit limit, but use of a large value will increase memory consumption.
date, Julian Julian date YRMODAFunction: YRMODA (year, month, day)
year is a year, either between 0 and 99 or at least 1582. Unlike other PSPP date functions, years between 0 and 99 always correspond to 1900 through 1999. month is a month between 1 and 13. day is a day between 0 and 31. A day of 0 refers to the last day of the previous month, and a month of 13 refers to the first month of the next year. year must be in range. year, month, and day must all be integers. YRMODA results in the number of days between 15 Oct 1582 and the date specified, plus one. The date passed to YRMODA must be on or after 15 Oct 1582. 15 Oct 1582 has a value of 1.
value label (variable)Function: VALUELABEL (variable)
Returns a string matching the label associated with the current value of variable. If the current value of variable has no associated label, then this function returns the empty string. variable may be a numeric or string variable.
Statistical Distribution Functions PSPP can calculate several functions of standard statistical distributions. These functions are named systematically based on the function and the distribution. The table below describes the statistical distribution functions in general: PDF.dist (x[, param…]) Probability density function for dist. The domain of x depends on dist. For continuous distributions, the result is the density of the probability function at x, and the range is nonnegative real numbers. For discrete distributions, the result is the probability of x. CDF.dist (x[, param…]) Cumulative distribution function for dist, that is, the probability that a random variate drawn from the distribution is less than x. The domain of x depends dist. The result is a probability. SIG.dist (x[, param…) Tail probability function for dist, that is, the probability that a random variate drawn from the distribution is greater than x. The domain of x depends dist. The result is a probability. Only a few distributions include an SIG function. IDF.dist (p[, param…]) Inverse distribution function for dist, the value of x for which the CDF would yield p. The value of p is a probability. The range depends on dist and is identical to the domain for the corresponding CDF. RV.dist ([param…]) Random variate function for dist. The range depends on the distribution. NPDF.dist (x[, param…]) Noncentral probability density function. The result is the density of the given noncentral distribution at x. The domain of x depends on dist. The range is nonnegative real numbers. Only a few distributions include an NPDF function. NCDF.dist (x[, param…]) Noncentral cumulative distribution function for dist, that is, the probability that a random variate drawn from the given noncentral distribution is less than x. The domain of x depends dist. The result is a probability. Only a few distributions include an NCDF function. The individual distributions are described individually below. Continuous Distributions The following continuous distributions are available: PDF.BETAFunction: PDF.BETA (x) CDF.BETAFunction: CDF.BETA (x, a, b) IDF.BETAFunction: IDF.BETA (p, a, b) RV.BETAFunction: RV.BETA (a, b) NPDF.BETAFunction: NPDF.BETA (x, a, b, lambda) NCDF.BETAFunction: NCDF.BETA (x, a, b, lambda)
Beta distribution with shape parameters a and b. The noncentral distribution takes an additional parameter lambda. Constraints: a > 0, b > 0, lambda >= 0, 0 <= x <= 1, 0 <= p <= 1.
PDF.BVNORFunction: PDF.BVNOR (x0, x1, rho) CDF.VBNORFunction: CDF.VBNOR (x0, x1, rho)
Bivariate normal distribution of two standard normal variables with correlation coefficient rho. Two variates x0 and x1 must be provided. Constraints: 0 <= rho <= 1, 0 <= p <= 1.
PDF.CAUCHYFunction: PDF.CAUCHY (x, a, b) CDF.CAUCHYFunction: CDF.CAUCHY (x, a, b) IDF.CAUCHYFunction: IDF.CAUCHY (p, a, b) RV.CAUCHYFunction: RV.CAUCHY (a, b)
Cauchy distribution with location parameter a and scale parameter b. Constraints: b > 0, 0 < p < 1.
CDF.CHISQFunction: CDF.CHISQ (x, df) SIG.CHISQFunction: SIG.CHISQ (x, df) IDF.CHISQFunction: IDF.CHISQ (p, df) RV.CHISQFunction: RV.CHISQ (df) NCDF.CHISQFunction: NCDF.CHISQ (x, df, lambda)
Chi-squared distribution with df degrees of freedom. The noncentral distribution takes an additional parameter lambda. Constraints: df > 0, lambda > 0, x >= 0, 0 <= p < 1.
PDF.EXPFunction: PDF.EXP (x, a) CDF.EXPFunction: CDF.EXP (x, a) IDF.EXPFunction: IDF.EXP (p, a) RV.EXPFunction: RV.EXP (a)
Exponential distribution with scale parameter a. The inverse of a represents the rate of decay. Constraints: a > 0, x >= 0, 0 <= p < 1.
PDF.XPOWERFunction: PDF.XPOWER (x, a, b) RV.XPOWERFunction: RV.XPOWER (a, b)
Exponential power distribution with positive scale parameter a and nonnegative power parameter b. Constraints: a > 0, b >= 0, x >= 0, 0 <= p <= 1. This distribution is a PSPP extension.
PDF.FFunction: PDF.F (x, df1, df2) CDF.FFunction: CDF.F (x, df1, df2) SIG.FFunction: SIG.F (x, df1, df2) IDF.FFunction: IDF.F (p, df1, df2) RV.FFunction: RV.F (df1, df2)
F-distribution of two chi-squared deviates with df1 and df2 degrees of freedom. The noncentral distribution takes an additional parameter lambda. Constraints: df1 > 0, df2 > 0, lambda >= 0, x >= 0, 0 <= p < 1.
PDF.GAMMAFunction: PDF.GAMMA (x, a, b) CDF.GAMMAFunction: CDF.GAMMA (x, a, b) IDF.GAMMAFunction: IDF.GAMMA (p, a, b) RV.GAMMAFunction: RV.GAMMA (a, b)
Gamma distribution with shape parameter a and scale parameter b. Constraints: a > 0, b > 0, x >= 0, 0 <= p < 1.
PDF.LANDAUFunction: PDF.LANDAU (x) RV.LANDAUFunction: RV.LANDAU ()
Landau distribution.
PDF.LAPLACEFunction: PDF.LAPLACE (x, a, b) CDF.LAPLACEFunction: CDF.LAPLACE (x, a, b) IDF.LAPLACEFunction: IDF.LAPLACE (p, a, b) RV.LAPLACEFunction: RV.LAPLACE (a, b)
Laplace distribution with location parameter a and scale parameter b. Constraints: b > 0, 0 < p < 1.
RV.LEVYFunction: RV.LEVY (c, alpha)
Levy symmetric alpha-stable distribution with scale c and exponent alpha. Constraints: 0 < alpha <= 2.
RV.LVSKEWFunction: RV.LVSKEW (c, alpha, beta)
Levy skew alpha-stable distribution with scale c, exponent alpha, and skewness parameter beta. Constraints: 0 < alpha <= 2, -1 <= beta <= 1.
PDF.LOGISTICFunction: PDF.LOGISTIC (x, a, b) CDF.LOGISTICFunction: CDF.LOGISTIC (x, a, b) IDF.LOGISTICFunction: IDF.LOGISTIC (p, a, b) RV.LOGISTICFunction: RV.LOGISTIC (a, b)
Logistic distribution with location parameter a and scale parameter b. Constraints: b > 0, 0 < p < 1.
PDF.LNORMALFunction: PDF.LNORMAL (x, a, b) CDF.LNORMALFunction: CDF.LNORMAL (x, a, b) IDF.LNORMALFunction: IDF.LNORMAL (p, a, b) RV.LNORMALFunction: RV.LNORMAL (a, b)
Lognormal distribution with parameters a and b. Constraints: a > 0, b > 0, x >= 0, 0 <= p < 1.
PDF.NORMALFunction: PDF.NORMAL (x, mu, sigma) CDF.NORMALFunction: CDF.NORMAL (x, mu, sigma) IDF.NORMALFunction: IDF.NORMAL (p, mu, sigma) RV.NORMALFunction: RV.NORMAL (mu, sigma)
Normal distribution with mean mu and standard deviation sigma. Constraints: b > 0, 0 < p < 1. Three additional functions are available as shorthand: CDFNORMFunction: CDFNORM (x)
Equivalent to CDF.NORMAL(x, 0, 1).
PROBITFunction: PROBIT (p)
Equivalent to IDF.NORMAL(p, 0, 1).
NORMALFunction: NORMAL (sigma)
Equivalent to RV.NORMAL(0, sigma).
PDF.NTAILFunction: PDF.NTAIL (x, a, sigma) RV.NTAILFunction: RV.NTAIL (a, sigma)
Normal tail distribution with lower limit a and standard deviation sigma. This distribution is a PSPP extension. Constraints: a > 0, x > a, 0 < p < 1.
PDF.PARETOFunction: PDF.PARETO (x, a, b) CDF.PARETOFunction: CDF.PARETO (x, a, b) IDF.PARETOFunction: IDF.PARETO (p, a, b) RV.PARETOFunction: RV.PARETO (a, b)
Pareto distribution with threshold parameter a and shape parameter b. Constraints: a > 0, b > 0, x >= a, 0 <= p < 1.
PDF.RAYLEIGHFunction: PDF.RAYLEIGH (x, sigma) CDF.RAYLEIGHFunction: CDF.RAYLEIGH (x, sigma) IDF.RAYLEIGHFunction: IDF.RAYLEIGH (p, sigma) RV.RAYLEIGHFunction: RV.RAYLEIGH (sigma)
Rayleigh distribution with scale parameter sigma. This distribution is a PSPP extension. Constraints: sigma > 0, x > 0.
PDF.RTAILFunction: PDF.RTAIL (x, a, sigma) RV.RTAILFunction: RV.RTAIL (a, sigma)
Rayleigh tail distribution with lower limit a and scale parameter sigma. This distribution is a PSPP extension. Constraints: a > 0, sigma > 0, x > a.
PDF.TFunction: PDF.T (x, df) CDF.TFunction: CDF.T (x, df) IDF.TFunction: IDF.T (p, df) RV.TFunction: RV.T (df)
T-distribution with df degrees of freedom. The noncentral distribution takes an additional parameter lambda. Constraints: df > 0, 0 < p < 1.
PDF.T1GFunction: PDF.T1G (x, a, b) CDF.T1GFunction: CDF.T1G (x, a, b) IDF.T1GFunction: IDF.T1G (p, a, b)
Type-1 Gumbel distribution with parameters a and b. This distribution is a PSPP extension. Constraints: 0 < p < 1.
PDF.T2GFunction: PDF.T2G (x, a, b) CDF.T2GFunction: CDF.T2G (x, a, b) IDF.T2GFunction: IDF.T2G (p, a, b)
Type-2 Gumbel distribution with parameters a and b. This distribution is a PSPP extension. Constraints: x > 0, 0 < p < 1.
PDF.UNIFORMFunction: PDF.UNIFORM (x, a, b) CDF.UNIFORMFunction: CDF.UNIFORM (x, a, b) IDF.UNIFORMFunction: IDF.UNIFORM (p, a, b) RV.UNIFORMFunction: RV.UNIFORM (a, b)
Uniform distribution with parameters a and b. Constraints: a <= x <= b, 0 <= p <= 1. An additional function is available as shorthand: UNIFORMFunction: UNIFORM (b)
Equivalent to RV.UNIFORM(0, b).
PDF.WEIBULLFunction: PDF.WEIBULL (x, a, b) CDF.WEIBULLFunction: CDF.WEIBULL (x, a, b) IDF.WEIBULLFunction: IDF.WEIBULL (p, a, b) RV.WEIBULLFunction: RV.WEIBULL (a, b)
Weibull distribution with parameters a and b. Constraints: a > 0, b > 0, x >= 0, 0 <= p < 1.
Discrete Distributions The following discrete distributions are available: PDF.BERNOULLIFunction: PDF.BERNOULLI (x) CDF.BERNOULLIFunction: CDF.BERNOULLI (x, p) RV.BERNOULLIFunction: RV.BERNOULLI (p)
Bernoulli distribution with probability of success p. Constraints: x = 0 or 1, 0 <= p <= 1.
PDF.BINOMFunction: PDF.BINOM (x, n, p) CDF.BINOMFunction: CDF.BINOM (x, n, p) RV.BINOMFunction: RV.BINOM (n, p)
Binomial distribution with n trials and probability of success p. Constraints: integer n > 0, 0 <= p <= 1, integer x <= n.
PDF.GEOMFunction: PDF.GEOM (x, n, p) CDF.GEOMFunction: CDF.GEOM (x, n, p) RV.GEOMFunction: RV.GEOM (n, p)
Geometric distribution with probability of success p. Constraints: 0 <= p <= 1, integer x > 0.
PDF.HYPERFunction: PDF.HYPER (x, a, b, c) CDF.HYPERFunction: CDF.HYPER (x, a, b, c) RV.HYPERFunction: RV.HYPER (a, b, c)
Hypergeometric distribution when b objects out of a are drawn and c of the available objects are distinctive. Constraints: integer a > 0, integer b <= a, integer c <= a, integer x >= 0.
PDF.LOGFunction: PDF.LOG (x, p) RV.LOGFunction: RV.LOG (p)
Logarithmic distribution with probability parameter p. Constraints: 0 <= p < 1, x >= 1.
PDF.NEGBINFunction: PDF.NEGBIN (x, n, p) CDF.NEGBINFunction: CDF.NEGBIN (x, n, p) RV.NEGBINFunction: RV.NEGBIN (n, p)
Negative binomial distribution with number of successes parameter n and probability of success parameter p. Constraints: integer n >= 0, 0 < p <= 1, integer x >= 1.
PDF.POISSONFunction: PDF.POISSON (x, mu) CDF.POISSONFunction: CDF.POISSON (x, mu) RV.POISSONFunction: RV.POISSON (mu)
Poisson distribution with mean mu. Constraints: mu > 0, integer x >= 0.
Operator Precedence operator precedence precedence, operator order of operations operations, order of The following table describes operator precedence. Smaller-numbered levels in the table have higher precedence. Within a level, operations are always performed from left to right. The first occurrence of ‘-’ represents unary negation, the second binary subtraction. ( ) ** - * / + - EQ GE GT LE LT NE AND NOT OR
Data Input and Output input output data cases observations Data are the focus of the PSPP language. Each datum belongs to a case (also called an observation). Each case represents an individual or “experimental unit”. For example, in the results of a survey, the names of the respondents, their sex, age, etc. and their responses are all data and the data pertaining to single respondent is a case. This chapter examines the PSPP commands for defining variables and reading and writing data. There are alternative commands to read data from predefined sources such as system files or databases (See GET DATA.) These commands tell PSPP how to read data, but the data will not actually be read until a procedure is executed. BEGIN DATA BEGIN DATA END DATA Embedding data in syntax files Data, embedding in syntax files BEGIN DATA. … END DATA. BEGIN DATA and END DATA can be used to embed raw ASCII data in a PSPP syntax file. DATA LIST or another input procedure must be used before BEGIN DATA (see DATA LIST). BEGIN DATA and END DATA must be used together. END DATA must appear by itself on a single line, with no leading white space and exactly one space between the words END and DATA, like this: END DATA. CLOSE FILE HANDLE CLOSE FILE HANDLE handle_name. CLOSE FILE HANDLE disassociates the name of a file handle with a given file. The only specification is the name of the handle to close. Afterward FILE HANDLE. The file named INLINE, which represents data entered between BEGIN DATA and END DATA, cannot be closed. Attempts to close it with CLOSE FILE HANDLE have no effect. CLOSE FILE HANDLE is a PSPP extension. DATAFILE ATTRIBUTE DATAFILE ATTRIBUTE DATAFILE ATTRIBUTE ATTRIBUTE=name(’value’) [name(’value’)]… ATTRIBUTE=name[index](’value’) [name[index](’value’)]… DELETE=name [name]… DELETE=name[index] [name[index]]… DATAFILE ATTRIBUTE adds, modifies, or removes user-defined attributes associated with the active dataset. Custom data file attributes are not interpreted by PSPP, but they are saved as part of system files and may be used by other software that reads them. Use the ATTRIBUTE subcommand to add or modify a custom data file attribute. Specify the name of the attribute as an identifier (see Tokens), followed by the desired value, in parentheses, as a quoted string. Attribute names that begin with $ are reserved for PSPP’s internal use, and attribute names that begin with @ or $@ are not displayed by most PSPP commands that display other attributes. Other attribute names are not treated specially. Attributes may also be organized into arrays. To assign to an array element, add an integer array index enclosed in square brackets ([ and ]) between the attribute name and value. Array indexes start at 1, not 0. An attribute array that has a single element (number 1) is not distinguished from a non-array attribute. Use the DELETE subcommand to delete an attribute. Specify an attribute name by itself to delete an entire attribute, including all array elements for attribute arrays. Specify an attribute name followed by an array index in square brackets to delete a single element of an attribute array. In the latter case, all the array elements numbered higher than the deleted element are shifted down, filling the vacated position. To associate custom attributes with particular variables, instead of with the entire active dataset, use VARIABLE ATTRIBUTE (see VARIABLE ATTRIBUTE) instead. DATAFILE ATTRIBUTE takes effect immediately. It is not affected by conditional and looping structures such as DO IF or LOOP. DATASET commands DATASET DATASET NAME name [WINDOW={ASIS,FRONT}]. DATASET ACTIVATE name [WINDOW={ASIS,FRONT}]. DATASET COPY name [WINDOW={MINIMIZED,HIDDEN,FRONT}]. DATASET DECLARE name [WINDOW={MINIMIZED,HIDDEN,FRONT}]. DATASET CLOSE {name,*,ALL}. DATASET DISPLAY. The DATASET commands simplify use of multiple datasets within a PSPP session. They allow datasets to be created and destroyed. At any given time, most PSPP commands work with a single dataset, called the active dataset. DATASET NAME The DATASET NAME command gives the active dataset the specified name, or if it already had a name, it renames it. If another dataset already had the given name, that dataset is deleted. DATASET ACTIVATE The DATASET ACTIVATE command selects the named dataset, which must already exist, as the active dataset. Before switching the active dataset, any pending transformations are executed, as if EXECUTE had been specified. If the active dataset is unnamed before switching, then it is deleted and becomes unavailable after switching. DATASET COPY The DATASET COPY command creates a new dataset with the specified name, whose contents are a copy of the active dataset. Any pending transformations are executed, as if EXECUTE had been specified, before making the copy. If a dataset with the given name already exists, it is replaced. If the name is the name of the active dataset, then the active dataset becomes unnamed. DATASET DECLARE The DATASET DECLARE command creates a new dataset that is initially “empty,” that is, it has no dictionary or data. If a dataset with the given name already exists, this has no effect. The new dataset can be used with commands that support output to a dataset, e.g. AGGREGATE (see AGGREGATE). DATASET CLOSE The DATASET CLOSE command deletes a dataset. If the active dataset is specified by name, or if ‘*’ is specified, then the active dataset becomes unnamed. If a different dataset is specified by name, then it is deleted and becomes unavailable. Specifying ALL deletes all datasets except for the active dataset, which becomes unnamed. DATASET DISPLAY The DATASET DISPLAY command lists all the currently defined datasets. Many DATASET commands accept an optional WINDOW subcommand. In the PSPPIRE GUI, the value given for this subcommand influences how the dataset’s window is displayed. Outside the GUI, the WINDOW subcommand has no effect. The valid values are: ASIS Do not change how the window is displayed. This is the default for DATASET NAME and DATASET ACTIVATE. FRONT Raise the dataset’s window to the top. Make it the default dataset for running syntax. MINIMIZED Display the window “minimized” to an icon. Prefer other datasets for running syntax. This is the default for DATASET COPY and DATASET DECLARE. HIDDEN Hide the dataset’s window. Prefer other datasets for running syntax. DATA LIST DATA LIST reading data from a file data, reading from a file data, embedding in syntax files embedding data in syntax files Used to read text or binary data, DATA LIST is the most fundamental data-reading command. Even the more sophisticated input methods use DATA LIST commands as a building block. Understanding DATA LIST is important to understanding how to use PSPP to read your data files. There are two major variants of DATA LIST, which are fixed format and free format. In addition, free format has a minor variant, list format, which is discussed in terms of its differences from vanilla free format. Each form of DATA LIST is described in detail below. See GET DATA, for a command that offers a few enhancements over DATA LIST and that may be substituted for DATA LIST in many situations. DATA LIST FIXED DATA LIST FIXED reading fixed-format data fixed-format data, reading data, fixed-format, reading embedding fixed-format data DATA LIST [FIXED] {TABLE,NOTABLE} [FILE=’file_name’ [ENCODING=’encoding’]] [RECORDS=record_count] [END=end_var] [SKIP=record_count] /[line_no] var_spec… where each var_spec takes one of the forms var_list start-end [type_spec] var_list (fortran_spec) DATA LIST FIXED is used to read data files that have values at fixed positions on each line of single-line or multiline records. The keyword FIXED is optional. The FILE subcommand must be used if input is to be taken from an external file. It may be used to specify a file name as a string or a file handle (see File Handles). If the FILE subcommand is not used, then input is assumed to be specified within the command file using BEGIN DATAEND DATA (see BEGIN DATA). The ENCODING subcommand may only be used if the FILE subcommand is also used. It specifies the character encoding of the file. See INSERT, for information on supported encodings. The optional RECORDS subcommand, which takes a single integer as an argument, is used to specify the number of lines per record. If RECORDS is not specified, then the number of lines per record is calculated from the list of variable specifications later in DATA LIST. The END subcommand is only useful in conjunction with INPUT PROGRAM. See INPUT PROGRAM, for details. The optional SKIP subcommand specifies a number of records to skip at the beginning of an input file. It can be used to skip over a row that contains variable names, for example. DATA LIST can optionally output a table describing how the data file will be read. The TABLE subcommand enables this output, and NOTABLE disables it. The default is to output the table. The list of variables to be read from the data list must come last. Each line in the data record is introduced by a slash (‘/’). Optionally, a line number may follow the slash. Following, any number of variable specifications may be present. Each variable specification consists of a list of variable names followed by a description of their location on the input line. Sets of variables may be specified using the DATA LIST TO convention (see Sets of Variables). There are two ways to specify the location of the variable on the line: columnar style and FORTRAN style. In columnar style, the starting column and ending column for the field are specified after the variable name, separated by a dash (‘-’). For instance, the third through fifth columns on a line would be specified ‘3-5’. By default, variables are considered to be in ‘F’ format (see Input and Output Formats). (This default can be changed; see SET for more information.) In columnar style, to use a variable format other than the default, specify the format type in parentheses after the column numbers. For instance, for alphanumeric ‘A’ format, use ‘(A)’. In addition, implied decimal places can be specified in parentheses after the column numbers. As an example, suppose that a data file has a field in which the characters ‘1234’ should be interpreted as having the value 12.34. Then this field has two implied decimal places, and the corresponding specification would be ‘(2)’. If a field that has implied decimal places contains a decimal point, then the implied decimal places are not applied. Changing the variable format and adding implied decimal places can be done together; for instance, ‘(N,5)’. When using columnar style, the input and output width of each variable is computed from the field width. The field width must be evenly divisible into the number of variables specified. FORTRAN style is an altogether different approach to specifying field locations. With this approach, a list of variable input format specifications, separated by commas, are placed after the variable names inside parentheses. Each format specifier advances as many characters into the input line as it uses. Implied decimal places also exist in FORTRAN style. A format specification with d decimal places also has d implied decimal places. In addition to the standard format specifiers (see Input and Output Formats), FORTRAN style defines some extensions: X Advance the current column on this line by one character position. Tx Set the current column on this line to column x, with column numbers considered to begin with 1 at the left margin. NEWRECx Skip forward x lines in the current record, resetting the active column to the left margin. Repeat count Any format specifier may be preceded by a number. This causes the action of that format specifier to be repeated the specified number of times. (spec1, …, specN) Group the given specifiers together. This is most useful when preceded by a repeat count. Groups may be nested arbitrarily. FORTRAN and columnar styles may be freely intermixed. Columnar style leaves the active column immediately after the ending column specified. Record motion using NEWREC in FORTRAN style also applies to later FORTRAN and columnar specifiers. Examples DATA LIST TABLE /NAME 1-10 (A) INFO1 TO INFO3 12-17 (1). BEGIN DATA. John Smith 102311 Bob Arnold 122015 Bill Yates 918 6 END DATA. Defines the following variables: NAME, a 10-character-wide string variable, in columns 1 through 10. INFO1, a numeric variable, in columns 12 through 13. INFO2, a numeric variable, in columns 14 through 15. INFO3, a numeric variable, in columns 16 through 17. The BEGIN DATA/END DATA commands cause three cases to be defined: Case NAME INFO1 INFO2 INFO3 1 John Smith 10 23 11 2 Bob Arnold 12 20 15 3 Bill Yates 9 18 6 The TABLE keyword causes PSPP to print out a table describing the four variables defined. DAT LIS FIL="survey.dat" /ID 1-5 NAME 7-36 (A) SURNAME 38-67 (A) MINITIAL 69 (A) /Q01 TO Q50 7-56 /. Defines the following variables: ID, a numeric variable, in columns 1-5 of the first record. NAME, a 30-character string variable, in columns 7-36 of the first record. SURNAME, a 30-character string variable, in columns 38-67 of the first record. MINITIAL, a 1-character string variable, in column 69 of the first record. Fifty variables Q01, Q02, Q03, …, Q49, Q50, all numeric, Q01 in column 7, Q02 in column 8, …, Q49 in column 55, Q50 in column 56, all in the second record. Cases are separated by a blank record. Data is read from file survey.dat in the current directory. This example shows keywords abbreviated to their first 3 letters. DATA LIST FREE DATA LIST FREE DATA LIST FREE [({TAB,’c’}, …)] [{NOTABLE,TABLE}] [FILE=’file_name’ [ENCODING=’encoding’]] [SKIP=record_cnt] /var_spec… where each var_spec takes one of the forms var_list [(type_spec)] var_list * In free format, the input data is, by default, structured as a series of fields separated by spaces, tabs, or line breaks. If the current DECIMAL separator is DOT (see SET), then commas are also treated as field separators. Each field’s content may be unquoted, or it may be quoted with a pairs of apostrophes (‘'’) or double quotes (‘"’). Unquoted white space separates fields but is not part of any field. Any mix of spaces, tabs, and line breaks is equivalent to a single space for the purpose of separating fields, but consecutive commas will skip a field. Alternatively, delimiters can be specified explicitly, as a parenthesized, comma-separated list of single-character strings immediately following FREE. The word TAB may also be used to specify a tab character as a delimiter. When delimiters are specified explicitly, only the given characters, plus line breaks, separate fields. Furthermore, leading spaces at the beginnings of fields are not trimmed, consecutive delimiters define empty fields, and no form of quoting is allowed. The NOTABLE and TABLE subcommands are as in DATA LIST FIXED above. NOTABLE is the default. The FILE, SKIP, and ENCODING subcommands are as in DATA LIST FIXED above. The variables to be parsed are given as a single list of variable names. This list must be introduced by a single slash (‘/’). The set of variable names may contain format specifications in parentheses (see Input and Output Formats). Format specifications apply to all variables back to the previous parenthesized format specification. In addition, an asterisk may be used to indicate that all variables preceding it are to have input/output format ‘F8.0’. Specified field widths are ignored on input, although all normal limits on field width apply, but they are honored on output. DATA LIST LIST DATA LIST LIST DATA LIST LIST [({TAB,’c’}, …)] [{NOTABLE,TABLE}] [FILE=’file_name’ [ENCODING=’encoding’]] [SKIP=record_count] /var_spec… where each var_spec takes one of the forms var_list [(type_spec)] var_list * With one exception, DATA LIST LIST is syntactically and semantically equivalent to DATA LIST FREE. The exception is that each input line is expected to correspond to exactly one input record. If more or fewer fields are found on an input line than expected, an appropriate diagnostic is issued. END CASE END CASE END CASE. END CASE is used only within INPUT PROGRAM to output the current case. See INPUT PROGRAM, for details. END FILE END FILE END FILE. END FILE is used only within INPUT PROGRAM to terminate the current input program. See INPUT PROGRAM. FILE HANDLE FILE HANDLE For text files: FILE HANDLE handle_name /NAME=’file_name [/MODE=CHARACTER] [/ENDS={CR,CRLF}] /TABWIDTH=tab_width [ENCODING=’encoding’] For binary files in native encoding with fixed-length records: FILE HANDLE handle_name /NAME=’file_name’ /MODE=IMAGE [/LRECL=rec_len] [ENCODING=’encoding’] For binary files in native encoding with variable-length records: FILE HANDLE handle_name /NAME=’file_name’ /MODE=BINARY [/LRECL=rec_len] [ENCODING=’encoding’] For binary files encoded in EBCDIC: FILE HANDLE handle_name /NAME=’file_name’ /MODE=360 /RECFORM={FIXED,VARIABLE,SPANNED} [/LRECL=rec_len] [ENCODING=’encoding’] Use FILE HANDLE to associate a file handle name with a file and its attributes, so that later commands can refer to the file by its handle name. Names of text files can be specified directly on commands that access files, so that FILE HANDLE is only needed when a file is not an ordinary file containing lines of text. However, FILE HANDLE may be used even for text files, and it may be easier to specify a file’s name once and later refer to it by an abstract handle. Specify the file handle name as the identifier immediately following the FILE HANDLE command name. The identifier INLINE is reserved for representing data embedded in the syntax file (see BEGIN DATA) The file handle name must not already have been used in a previous invocation of FILE HANDLE, unless it has been closed by an intervening command (see CLOSE FILE HANDLE). The effect and syntax of FILE HANDLE depends on the selected MODE: In CHARACTER mode, the default, the data file is read as a text file. Each text line is read as one record. In CHARACTER mode only, tabs are expanded to spaces by input programs, except by DATA LIST FREE with explicitly specified delimiters. Each tab is 4 characters wide by default, but TABWIDTH (a PSPP extension) may be used to specify an alternate width. Use a TABWIDTH of 0 to suppress tab expansion. A file written in CHARACTER mode by default uses the line ends of the system on which PSPP is running, that is, on Windows, the default is CR LF line ends, and on other systems the default is LF only. Specify ENDS as CR or CRLF to override the default. PSPP reads files using either convention on any kind of system, regardless of ENDS. In IMAGE mode, the data file is treated as a series of fixed-length binary records. LRECL should be used to specify the record length in bytes, with a default of 1024. On input, it is an error if an IMAGE file’s length is not a integer multiple of the record length. On output, each record is padded with spaces or truncated, if necessary, to make it exactly the correct length. In BINARY mode, the data file is treated as a series of variable-length binary records. LRECL may be specified, but its value is ignored. The data for each record is both preceded and followed by a 32-bit signed integer in little-endian byte order that specifies the length of the record. (This redundancy permits records in these files to be efficiently read in reverse order, although PSPP always reads them in forward order.) The length does not include either integer. Mode 360 reads and writes files in formats first used for tapes in the 1960s on IBM mainframe operating systems and still supported today by the modern successors of those operating systems. For more information, see OS/400 Tape and Diskette Device Programming, available on IBM’s website. Alphanumeric data in mode 360 files are encoded in EBCDIC. PSPP translates EBCDIC to or from the host’s native format as necessary on input or output, using an ASCII/EBCDIC translation that is one-to-one, so that a “round trip” from ASCII to EBCDIC back to ASCII, or vice versa, always yields exactly the original data. The RECFORM subcommand is required in mode 360. The precise file format depends on its setting: F FIXED This record format is equivalent to IMAGE mode, except for EBCDIC translation. IBM documentation calls this *F (fixed-length, deblocked) format. V VARIABLE The file comprises a sequence of zero or more variable-length blocks. Each block begins with a 4-byte block descriptor word (BDW). The first two bytes of the BDW are an unsigned integer in big-endian byte order that specifies the length of the block, including the BDW itself. The other two bytes of the BDW are ignored on input and written as zeros on output. Following the BDW, the remainder of each block is a sequence of one or more variable-length records, each of which in turn begins with a 4-byte record descriptor word (RDW) that has the same format as the BDW. Following the RDW, the remainder of each record is the record data. The maximum length of a record in VARIABLE mode is 65,527 bytes: 65,535 bytes (the maximum value of a 16-bit unsigned integer), minus 4 bytes for the BDW, minus 4 bytes for the RDW. In mode VARIABLE, LRECL specifies a maximum, not a fixed, record length, in bytes. The default is 8,192. IBM documentation calls this *VB (variable-length, blocked, unspanned) format. VS SPANNED The file format is like that of VARIABLE mode, except that logical records may be split among multiple physical records (called segments) or blocks. In SPANNED mode, the third byte of each RDW is called the segment control character (SCC). Odd SCC values cause the segment to be appended to a record buffer maintained in memory; even values also append the segment and then flush its contents to the input procedure. Canonically, SCC value 0 designates a record not spanned among multiple segments, and values 1 through 3 designate the first segment, the last segment, or an intermediate segment, respectively, within a multi-segment record. The record buffer is also flushed at end of file regardless of the final record’s SCC. The maximum length of a logical record in VARIABLE mode is limited only by memory available to PSPP. Segments are limited to 65,527 bytes, as in VARIABLE mode. This format is similar to what IBM documentation call *VS (variable-length, deblocked, spanned) format. In mode 360, fields of type A that extend beyond the end of a record read from disk are padded with spaces in the host’s native character set, which are then translated from EBCDIC to the native character set. Thus, when the host’s native character set is based on ASCII, these fields are effectively padded with character X'80'. This wart is implemented for compatibility. The NAME subcommand specifies the name of the file associated with the handle. It is required in all modes but SCRATCH mode, in which its use is forbidden. The ENCODING subcommand specifies the encoding of text in the file. For reading text files in CHARACTER mode, all of the forms described for ENCODING on the INSERT command are supported (see INSERT). For reading in other file-based modes, encoding autodetection is not supported; if the specified encoding requests autodetection then the default encoding will be used. This is also true when a file handle is used for writing a file in any mode. INPUT PROGRAM INPUT PROGRAM INPUT PROGRAM. … input commands … END INPUT PROGRAM. INPUT PROGRAMEND INPUT PROGRAM specifies a complex input program. By placing data input commands within INPUT PROGRAM, PSPP programs can take advantage of more complex file structures than available with only DATA LIST. The first sort of extended input program is to simply put multiple DATA LIST commands within the INPUT PROGRAM. This will cause all of the data files to be read in parallel. Input will stop when end of file is reached on any of the data files. Transformations, such as conditional and looping constructs, can also be included within INPUT PROGRAM. These can be used to combine input from several data files in more complex ways. However, input will still stop when end of file is reached on any of the data files. To prevent INPUT PROGRAM from terminating at the first end of file, use the END subcommand on DATA LIST. This subcommand takes a variable name, which should be a numeric scratch variable (see Scratch Variables). (It need not be a scratch variable but otherwise the results can be surprising.) The value of this variable is set to 0 when reading the data file, or 1 when end of file is encountered. Two additional commands are useful in conjunction with INPUT PROGRAM. END CASE is the first. Normally each loop through the INPUT PROGRAM structure produces one case. END CASE controls exactly when cases are output. When END CASE is used, looping from the end of INPUT PROGRAM to the beginning does not cause a case to be output. END FILE is the second. When the END subcommand is used on DATA LIST, there is no way for the INPUT PROGRAM construct to stop looping, so an infinite loop results. END FILE, when executed, stops the flow of input data and passes out of the INPUT PROGRAM structure. INPUT PROGRAM must contain at least one DATA LIST or END FILE command. All this is very confusing. A few examples should help to clarify. INPUT PROGRAM. DATA LIST NOTABLE FILE='a.data'/X 1-10. DATA LIST NOTABLE FILE='b.data'/Y 1-10. END INPUT PROGRAM. LIST. The example above reads variable X from file a.data and variable Y from file b.data. If one file is shorter than the other then the extra data in the longer file is ignored. INPUT PROGRAM. NUMERIC #A #B. DO IF NOT #A. DATA LIST NOTABLE END=#A FILE='a.data'/X 1-10. END IF. DO IF NOT #B. DATA LIST NOTABLE END=#B FILE='b.data'/Y 1-10. END IF. DO IF #A AND #B. END FILE. END IF. END CASE. END INPUT PROGRAM. LIST. The above example reads variable X from a.data and variable Y from b.data. If one file is shorter than the other then the missing field is set to the system-missing value alongside the present value for the remaining length of the longer file. INPUT PROGRAM. NUMERIC #A #B. DO IF #A. DATA LIST NOTABLE END=#B FILE='b.data'/X 1-10. DO IF #B. END FILE. ELSE. END CASE. END IF. ELSE. DATA LIST NOTABLE END=#A FILE='a.data'/X 1-10. DO IF NOT #A. END CASE. END IF. END IF. END INPUT PROGRAM. LIST. The above example reads data from file a.data, then from b.data, and concatenates them into a single active dataset. INPUT PROGRAM. NUMERIC #EOF. LOOP IF NOT #EOF. DATA LIST NOTABLE END=#EOF FILE='a.data'/X 1-10. DO IF NOT #EOF. END CASE. END IF. END LOOP. COMPUTE #EOF = 0. LOOP IF NOT #EOF. DATA LIST NOTABLE END=#EOF FILE='b.data'/X 1-10. DO IF NOT #EOF. END CASE. END IF. END LOOP. END FILE. END INPUT PROGRAM. LIST. The above example does the same thing as the previous example, in a different way. INPUT PROGRAM. LOOP #I=1 TO 50. COMPUTE X=UNIFORM(10). END CASE. END LOOP. END FILE. END INPUT PROGRAM. LIST/FORMAT=NUMBERED. The above example causes an active dataset to be created consisting of 50 random variates between 0 and 10. LIST LIST LIST /VARIABLES=var_list /CASES=FROM start_index TO end_index BY incr_index /FORMAT={UNNUMBERED,NUMBERED} {WRAP,SINGLE} The LIST procedure prints the values of specified variables to the listing file. The VARIABLES subcommand specifies the variables whose values are to be printed. Keyword VARIABLES is optional. If VARIABLES subcommand is not specified then all variables in the active dataset are printed. The CASES subcommand can be used to specify a subset of cases to be printed. Specify FROM and the case number of the first case to print, TO and the case number of the last case to print, and BY and the number of cases to advance between printing cases, or any subset of those settings. If CASES is not specified then all cases are printed. The FORMAT subcommand can be used to change the output format. NUMBERED will print case numbers along with each case; UNNUMBERED, the default, causes the case numbers to be omitted. The WRAP and SINGLE settings are currently not used. Case numbers start from 1. They are counted after all transformations have been considered. LIST is a procedure. It causes the data to be read. NEW FILE NEW FILE NEW FILE. NEW FILE command clears the dictionary and data from the current active dataset. MATRIX DATA MATRIX DATA MATRIX DATA VARIABLES = columns [FILE=’file_name’| INLINE } [/FORMAT= [{LIST | FREE}] [{UPPER | LOWER | FULL}] [{DIAGONAL | NODIAGONAL}]] [/N= n] [/SPLIT= split_variables]. The MATRIX DATA command is used to input data in the form of matrices which can subsequently be used by other commands. If the FILE is omitted or takes the value ‘INLINE’ then the command should immediately followed by BEGIN DATA (see BEGIN DATA). There is one mandatory subcommand, viz: VARIABLES, which defines the columns of the matrix. Normally, the columns should include an item called ‘ROWTYPE_’. The ‘ROWTYPE_’ column is used to specify the purpose of a row in the matrix. matrix data variables = rowtype_ var01 TO var08. begin data. mean 24.3 5.4 69.7 20.1 13.4 2.7 27.9 3.7 sd 5.7 1.5 23.5 5.8 2.8 4.5 5.4 1.5 n 92 92 92 92 92 92 92 92 corr 1.00 corr .18 1.00 corr -.22 -.17 1.00 corr .36 .31 -.14 1.00 corr .27 .16 -.12 .22 1.00 corr .33 .15 -.17 .24 .21 1.00 corr .50 .29 -.20 .32 .12 .38 1.00 corr .17 .29 -.05 .20 .27 .20 .04 1.00 end data. In the above example, the first three rows have ROWTYPE_ values of ‘mean’, ‘sd’, and ‘n’. These indicate that the rows contain mean values, standard deviations and counts, respectively. All subsequent rows have a ROWTYPE_ of ‘corr’ which indicates that the values are correlation coefficients. Note that in this example, the upper right values of the ‘corr’ values are blank, and in each case, the rightmost value is unity. This is because, the FORMAT subcommand defaults to ‘LOWER DIAGONAL’, which indicates that only the lower triangle is provided in the data. The opposite triangle is automatically inferred. One could instead specify the upper triangle as follows: matrix data variables = rowtype_ var01 TO var08 /format = upper nodiagonal. begin data. mean 24.3 5.4 69.7 20.1 13.4 2.7 27.9 3.7 sd 5.7 1.5 23.5 5.8 2.8 4.5 5.4 1.5 n 92 92 92 92 92 92 92 92 corr .17 .50 -.33 .27 .36 -.22 .18 corr .29 .29 -.20 .32 .12 .38 corr .05 .20 -.15 .16 .21 corr .20 .32 -.17 .12 corr .27 .12 -.24 corr -.20 -.38 corr .04 end data. In this example the ‘NODIAGONAL’ keyword is used. Accordingly the diagonal values of the matrix are omitted. This implies that there is one less ‘corr’ line than there are variables. If the ‘FULL’ option is passed to the FORMAT subcommand, then all the matrix elements must be provided, including the diagonal elements. In the preceding examples, each matrix row has been specified on a single line. If you pass the keyword FREE to FORMAT then the data may be data for several matrix rows may be specified on the same line, or a single row may be split across lines. The N subcommand may be used to specify the number of valid cases for each variable. It should not be used if the data contains a record whose ROWTYPE_ column is ‘N’ or ‘N_VECTOR’. It implies a ‘N’ record whose values are all n. That is to say, matrix data variables = rowtype_ var01 TO var04 /format = upper nodiagonal /n = 99. begin data mean 34 35 36 37 sd 22 11 55 66 corr 9 8 7 corr 6 5 corr 4 end data. produces an effect identical to matrix data variables = rowtype_ var01 TO var04 /format = upper nodiagonal begin data n 99 99 99 99 mean 34 35 36 37 sd 22 11 55 66 corr 9 8 7 corr 6 5 corr 4 end data. The SPLIT is used to indicate that variables are to be considered as split variables. For example, the following defines two matrices using the variable ‘S1’ to distinguish between them. matrix data variables = s1 rowtype_ var01 TO var04 /split = s1 /format = full diagonal. begin data 0 mean 34 35 36 37 0 sd 22 11 55 66 0 n 99 98 99 92 0 corr 1 9 8 7 0 corr 9 1 6 5 0 corr 8 6 1 4 0 corr 7 5 4 1 1 mean 44 45 34 39 1 sd 23 15 51 46 1 n 98 34 87 23 1 corr 1 2 3 4 1 corr 2 1 5 6 1 corr 3 5 1 7 1 corr 4 6 7 1 end data. PRINT PRINT PRINT [OUTFILE=’file_name’] [RECORDS=n_lines] [{NOTABLE,TABLE}] [ENCODING=’encoding’] [/[line_no] arg…] arg takes one of the following forms: ’string’ [start] var_list start-end [type_spec] var_list (fortran_spec) var_list * The PRINT transformation writes variable data to the listing file or an output file. PRINT is executed when a procedure causes the data to be read. Follow PRINT by EXECUTE to print variable data without invoking a procedure (see EXECUTE). All PRINT subcommands are optional. If no strings or variables are specified, PRINT outputs a single blank line. The OUTFILE subcommand specifies the file to receive the output. The file may be a file name as a string or a file handle (see File Handles). If OUTFILE is not present then output will be sent to PSPP’s output listing file. When OUTFILE is present, the output is written to file_name in a plain text format, with a space inserted at beginning of each output line, even lines that otherwise would be blank. The ENCODING subcommand may only be used if the OUTFILE subcommand is also used. It specifies the character encoding of the file. See INSERT, for information on supported encodings. The RECORDS subcommand specifies the number of lines to be output. The number of lines may optionally be surrounded by parentheses. TABLE will cause the PRINT command to output a table to the listing file that describes what it will print to the output file. NOTABLE, the default, suppresses this output table. Introduce the strings and variables to be printed with a slash (‘/’). Optionally, the slash may be followed by a number indicating which output line will be specified. In the absence of this line number, the next line number will be specified. Multiple lines may be specified using multiple slashes with the intended output for a line following its respective slash. Literal strings may be printed. Specify the string itself. Optionally the string may be followed by a column number, specifying the column on the line where the string should start. Otherwise, the string will be printed at the current position on the line. Variables to be printed can be specified in the same ways as available for DATA LIST FIXED (see DATA LIST FIXED). In addition, a variable list may be followed by an asterisk (‘*’), which indicates that the variables should be printed in their dictionary print formats, separated by spaces. A variable list followed by a slash or the end of command will be interpreted the same way. If a FORTRAN type specification is used to move backwards on the current line, then text is written at that point on the line, the line will be truncated to that length, although additional text being added will again extend the line to that length. PRINT EJECT PRINT EJECT PRINT EJECT OUTFILE=’file_name’ RECORDS=n_lines {NOTABLE,TABLE} /[line_no] argarg takes one of the following forms: ’string’ [start-end] var_list start-end [type_spec] var_list (fortran_spec) var_list * PRINT EJECT advances to the beginning of a new output page in the listing file or output file. It can also output data in the same way as PRINT. All PRINT EJECT subcommands are optional. Without OUTFILE, PRINT EJECT ejects the current page in the listing file, then it produces other output, if any is specified. With OUTFILE, PRINT EJECT writes its output to the specified file. The first line of output is written with ‘1’ inserted in the first column. Commonly, this is the only line of output. If additional lines of output are specified, these additional lines are written with a space inserted in the first column, as with PRINT. See PRINT, for more information on syntax and usage. PRINT SPACE PRINT SPACE PRINT SPACE [OUTFILE=’file_name’] [ENCODING=’encoding’] [n_lines]. PRINT SPACE prints one or more blank lines to an output file. The OUTFILE subcommand is optional. It may be used to direct output to a file specified by file name as a string or file handle (see File Handles). If OUTFILE is not specified then output will be directed to the listing file. The ENCODING subcommand may only be used if OUTFILE is also used. It specifies the character encoding of the file. See INSERT, for information on supported encodings. n_lines is also optional. If present, it is an expression (see Expressions) specifying the number of blank lines to be printed. The expression must evaluate to a nonnegative value. REREAD REREAD REREAD [FILE=handle] [COLUMN=column] [ENCODING=’encoding’]. The REREAD transformation allows the previous input line in a data file already processed by DATA LIST or another input command to be re-read for further processing. The FILE subcommand, which is optional, is used to specify the file to have its line re-read. The file must be specified as the name of a file handle (see File Handles). If FILE is not specified then the last file specified on DATA LIST will be assumed (last file specified lexically, not in terms of flow-of-control). By default, the line re-read is re-read in its entirety. With the COLUMN subcommand, a prefix of the line can be exempted from re-reading. Specify an expression (see Expressions) evaluating to the first column that should be included in the re-read line. Columns are numbered from 1 at the left margin. The ENCODING subcommand may only be used if the FILE subcommand is also used. It specifies the character encoding of the file. See INSERT, for information on supported encodings. Issuing REREAD multiple times will not back up in the data file. Instead, it will re-read the same line multiple times. REPEATING DATA REPEATING DATA REPEATING DATA /STARTS=start-end /OCCURS=n_occurs /FILE=’file_name’ /LENGTH=length /CONTINUED[=cont_start-cont_end] /ID=id_start-id_end=id_var /{TABLE,NOTABLE} /DATA=var_spec… where each var_spec takes one of the forms var_list start-end [type_spec] var_list (fortran_spec) REPEATING DATA parses groups of data repeating in a uniform format, possibly with several groups on a single line. Each group of data corresponds with one case. REPEATING DATA may only be used within an INPUT PROGRAM structure (see INPUT PROGRAM). When used with DATA LIST, it can be used to parse groups of cases that share a subset of variables but differ in their other data. The STARTS subcommand is required. Specify a range of columns, using literal numbers or numeric variable names. This range specifies the columns on the first line that are used to contain groups of data. The ending column is optional. If it is not specified, then the record width of the input file is used. For the inline file (see BEGIN DATA) this is 80 columns; for a file with fixed record widths it is the record width; for other files it is 1024 characters by default. The OCCURS subcommand is required. It must be a number or the name of a numeric variable. Its value is the number of groups present in the current record. The DATA subcommand is required. It must be the last subcommand specified. It is used to specify the data present within each repeating group. Column numbers are specified relative to the beginning of a group at column 1. Data is specified in the same way as with DATA LIST FIXED (see DATA LIST FIXED). All other subcommands are optional. FILE specifies the file to read, either a file name as a string or a file handle (see File Handles). If FILE is not present then the default is the last file handle used on DATA LIST (lexically, not in terms of flow of control). By default REPEATING DATA will output a table describing how it will parse the input data. Specifying NOTABLE will disable this behavior; specifying TABLE will explicitly enable it. The LENGTH subcommand specifies the length in characters of each group. If it is not present then length is inferred from the DATA subcommand. LENGTH can be a number or a variable name. Normally all the data groups are expected to be present on a single line. Use the CONTINUED command to indicate that data can be continued onto additional lines. If data on continuation lines starts at the left margin and continues through the entire field width, no column specifications are necessary on CONTINUED. Otherwise, specify the possible range of columns in the same way as on STARTS. When data groups are continued from line to line, it is easy for cases to get out of sync through careless hand editing. The ID subcommand allows a case identifier to be present on each line of repeating data groups. REPEATING DATA will check for the same identifier on each line and report mismatches. Specify the range of columns that the identifier will occupy, followed by an equals sign (‘=’) and the identifier variable name. The variable must already have been declared with NUMERIC or another command. REPEATING DATA should be the last command given within an INPUT PROGRAM. It should not be enclosed within a LOOP structure (see LOOP). Use DATA LIST before, not after, REPEATING DATA. WRITE WRITE WRITE OUTFILE=’file_name’ RECORDS=n_lines {NOTABLE,TABLE} /[line_no] argarg takes one of the following forms: ’string’ [start-end] var_list start-end [type_spec] var_list (fortran_spec) var_list * WRITE writes text or binary data to an output file. See PRINT, for more information on syntax and usage. PRINT and WRITE differ in only a few ways: WRITE uses write formats by default, whereas PRINT uses print formats. PRINT inserts a space between variables unless a format is explicitly specified, but WRITE never inserts space between variables in output. PRINT inserts a space at the beginning of each line that it writes to an output file (and PRINT EJECT inserts ‘1’ at the beginning of each line that should begin a new page), but WRITE does not. PRINT outputs the system-missing value according to its specified output format, whereas WRITE outputs the system-missing value as a field filled with spaces. Binary formats are an exception. System and Portable File I/O The commands in this chapter read, write, and examine system files and portable files. APPLY DICTIONARY APPLY DICTIONARY APPLY DICTIONARY FROM={’file_name’,file_handle}. APPLY DICTIONARY applies the variable labels, value labels, and missing values taken from a file to corresponding variables in the active dataset. In some cases it also updates the weighting variable. Specify a system file or portable file’s name, a data set name (see Datasets), or a file handle name (see File Handles). The dictionary in the file will be read, but it will not replace the active dataset’s dictionary. The file’s data will not be read. Only variables with names that exist in both the active dataset and the system file are considered. Variables with the same name but different types (numeric, string) will cause an error message. Otherwise, the system file variables’ attributes will replace those in their matching active dataset variables: If a system file variable has a variable label, then it will replace the variable label of the active dataset variable. If the system file variable does not have a variable label, then the active dataset variable’s variable label, if any, will be retained. If the system file variable has custom attributes (see VARIABLE ATTRIBUTE), then those attributes replace the active dataset variable’s custom attributes. If the system file variable does not have custom attributes, then the active dataset variable’s custom attributes, if any, will be retained. If the active dataset variable is numeric or short string, then value labels and missing values, if any, will be copied to the active dataset variable. If the system file variable does not have value labels or missing values, then those in the active dataset variable, if any, will not be disturbed. In addition to properties of variables, some properties of the active file dictionary as a whole are updated: If the system file has custom attributes (see DATAFILE ATTRIBUTE), then those attributes replace the active dataset variable’s custom attributes. If the active dataset has a weighting variable (see WEIGHT), and the system file does not, or if the weighting variable in the system file does not exist in the active dataset, then the active dataset weighting variable, if any, is retained. Otherwise, the weighting variable in the system file becomes the active dataset weighting variable. APPLY DICTIONARY takes effect immediately. It does not read the active dataset. The system file is not modified. EXPORT EXPORT EXPORT /OUTFILE=’file_name’ /UNSELECTED={RETAIN,DELETE} /DIGITS=n /DROP=var_list /KEEP=var_list /RENAME=(src_names=target_names)… /TYPE={COMM,TAPE} /MAP The EXPORT procedure writes the active dataset’s dictionary and data to a specified portable file. By default, cases excluded with FILTER are written to the file. These can be excluded by specifying DELETE on the UNSELECTED subcommand. Specifying RETAIN makes the default explicit. Portable files express real numbers in base 30. Integers are always expressed to the maximum precision needed to make them exact. Non-integers are, by default, expressed to the machine’s maximum natural precision (approximately 15 decimal digits on many machines). If many numbers require this many digits, the portable file may significantly increase in size. As an alternative, the DIGITS subcommand may be used to specify the number of decimal digits of precision to write. DIGITS applies only to non-integers. The OUTFILE subcommand, which is the only required subcommand, specifies the portable file to be written as a file name string or a file handle (see File Handles). DROP, KEEP, and RENAME follow the same format as the SAVE procedure (see SAVE). The TYPE subcommand specifies the character set for use in the portable file. Its value is currently not used. The MAP subcommand is currently ignored. EXPORT is a procedure. It causes the active dataset to be read. GET GET GET /FILE={’file_name’,file_handle} /DROP=var_list /KEEP=var_list /RENAME=(src_names=target_names)… /ENCODING=’encoding GET clears the current dictionary and active dataset and replaces them with the dictionary and data from a specified file. The FILE subcommand is the only required subcommand. Specify the SPSS system file, SPSS/PC+ system file, or SPSS portable file to be read as a string file name or a file handle (see File Handles). By default, all the variables in a file are read. The DROP subcommand can be used to specify a list of variables that are not to be read. By contrast, the KEEP subcommand can be used to specify variable that are to be read, with all other variables not read. Normally variables in a file retain the names that they were saved under. Use the RENAME subcommand to change these names. Specify, within parentheses, a list of variable names followed by an equals sign (‘=’) and the names that they should be renamed to. Multiple parenthesized groups of variable names can be included on a single RENAME subcommand. Variables’ names may be swapped using a RENAME subcommand of the form /RENAME=(A B=B A). Alternate syntax for the RENAME subcommand allows the parentheses to be eliminated. When this is done, only a single variable may be renamed at once. For instance, /RENAME=A=B. This alternate syntax is deprecated. DROP, KEEP, and RENAME are executed in left-to-right order. Each may be present any number of times. GET never modifies a file on disk. Only the active dataset read from the file is affected by these subcommands. PSPP automatically detects the encoding of string data in the file, when possible. The character encoding of old SPSS system files cannot always be guessed correctly, and SPSS/PC+ system files do not include any indication of their encoding. Specify the ENCODING subcommand with an IANA character set name as its string argument to override the default. Use SYSFILE INFO to analyze the encodings that might be valid for a system file. The ENCODING subcommand is a PSPP extension. GET does not cause the data to be read, only the dictionary. The data is read later, when a procedure is executed. Use of GET to read a portable file is a PSPP extension. GET DATA GET DATA GET DATA /TYPE={GNM,ODS,PSQL,TXT} …additional subcommands depending on TYPE… The GET DATA command is used to read files and other data sources created by other applications. When this command is executed, the current dictionary and active dataset are replaced with variables and data read from the specified source. The TYPE subcommand is mandatory and must be the first subcommand specified. It determines the type of the file or source to read. PSPP currently supports the following file types: GNM Spreadsheet files created by Gnumeric (http://gnumeric.org). ODS Spreadsheet files in OpenDocument format (http://opendocumentformat.org). PSQL Relations from PostgreSQL databases (http://postgresql.org). TXT Textual data files in columnar and delimited formats. Each supported file type has additional subcommands, explained in separate sections below. Spreadsheet Files GET DATA /TYPE={GNM, ODS} /FILE={’file_name’} /SHEET={NAME ’sheet_name’, INDEX n} /CELLRANGE={RANGE ’range’, FULL} /READNAMES={ON, OFF} /ASSUMEDSTRWIDTH=n. Gnumeric OpenDocument spreadsheet files Gnumeric spreadsheets (http://gnumeric.org), and spreadsheets in OpenDocument format (http://libreplanet.org/wiki/Group:OpenDocument/Software) can be read using the GET DATA command. Use the TYPE subcommand to indicate the file’s format. /TYPE=GNM indicates Gnumeric files, /TYPE=ODS indicates OpenDocument. The FILE subcommand is mandatory. Use it to specify the name file to be read. All other subcommands are optional. The format of each variable is determined by the format of the spreadsheet cell containing the first datum for the variable. If this cell is of string (text) format, then the width of the variable is determined from the length of the string it contains, unless the ASSUMEDSTRWIDTH subcommand is given. The SHEET subcommand specifies the sheet within the spreadsheet file to read. There are two forms of the SHEET subcommand. In the first form, /SHEET=name sheet_name, the string sheet_name is the name of the sheet to read. In the second form, /SHEET=index idx, idx is a integer which is the index of the sheet to read. The first sheet has the index 1. If the SHEET subcommand is omitted, then the command will read the first sheet in the file. The CELLRANGE subcommand specifies the range of cells within the sheet to read. If the subcommand is given as /CELLRANGE=FULL, then the entire sheet is read. To read only part of a sheet, use the form /CELLRANGE=range 'top_left_cell:bottom_right_cell'. For example, the subcommand /CELLRANGE=range 'C3:P19' reads columns C–P, and rows 3–19 inclusive. If no CELLRANGE subcommand is given, then the entire sheet is read. If /READNAMES=ON is specified, then the contents of cells of the first row are used as the names of the variables in which to store the data from subsequent rows. This is the default. If /READNAMES=OFF is used, then the variables receive automatically assigned names. The ASSUMEDSTRWIDTH subcommand specifies the maximum width of string variables read from the file. If omitted, the default value is determined from the length of the string in the first spreadsheet cell for each variable. Postgres Database Queries GET DATA /TYPE=PSQL /CONNECT={connection info} /SQL={query} [/ASSUMEDSTRWIDTH=w] [/UNENCRYPTED] [/BSIZE=n]. postgres databases The PSQL type is used to import data from a postgres database server. The server may be located locally or remotely. Variables are automatically created based on the table column names or the names specified in the SQL query. Postgres data types of high precision, will loose precision when imported into PSPP. Not all the postgres data types are able to be represented in PSPP. If a datum cannot be represented a warning will be issued and that datum will be set to SYSMIS. The CONNECT subcommand is mandatory. It is a string specifying the parameters of the database server from which the data should be fetched. The format of the string is given in the postgres manual http://www.postgresql.org/docs/8.0/static/libpq.html#LIBPQ-CONNECT. The SQL subcommand is mandatory. It must be a valid SQL string to retrieve data from the database. The ASSUMEDSTRWIDTH subcommand specifies the maximum width of string variables read from the database. If omitted, the default value is determined from the length of the string in the first value read for each variable. The UNENCRYPTED subcommand allows data to be retrieved over an insecure connection. If the connection is not encrypted, and the UNENCRYPTED subcommand is not given, then an error will occur. Whether or not the connection is encrypted depends upon the underlying psql library and the capabilities of the database server. The BSIZE subcommand serves only to optimise the speed of data transfer. It specifies an upper limit on number of cases to fetch from the database at once. The default value is 4096. If your SQL statement fetches a large number of cases but only a small number of variables, then the data transfer may be faster if you increase this value. Conversely, if the number of variables is large, or if the machine on which PSPP is running has only a small amount of memory, then a smaller value will be better. The following syntax is an example: GET DATA /TYPE=PSQL /CONNECT='host=example.com port=5432 dbname=product user=fred passwd=xxxx' /SQL='select * from manufacturer'. Textual Data Files GET DATA /TYPE=TXT /FILE={’file_name’,file_handle} [ENCODING=’encoding’] [/ARRANGEMENT={DELIMITED,FIXED}] [/FIRSTCASE={first_case}] [/IMPORTCASES=...] …additional subcommands depending on ARRANGEMENT… text files data files When TYPE=TXT is specified, GET DATA reads data in a delimited or fixed columnar format, much like DATA LIST (see DATA LIST). The FILE subcommand is mandatory. Specify the file to be read as a string file name or (for textual data only) a file handle (see File Handles). The ENCODING subcommand specifies the character encoding of the file to be read. See INSERT, for information on supported encodings. The ARRANGEMENT subcommand determines the file’s basic format. DELIMITED, the default setting, specifies that fields in the input data are separated by spaces, tabs, or other user-specified delimiters. FIXED specifies that fields in the input data appear at particular fixed column positions within records of a case. By default, cases are read from the input file starting from the first line. To skip lines at the beginning of an input file, set FIRSTCASE to the number of the first line to read: 2 to skip the first line, 3 to skip the first two lines, and so on. IMPORTCASES is ignored, for compatibility. Use N OF CASES to limit the number of cases read from a file (see N OF CASES), or SAMPLE to obtain a random sample of cases (see SAMPLE). The remaining subcommands apply only to one of the two file arrangements, described below. Reading Delimited Data GET DATA /TYPE=TXT /FILE={’file_name’,file_handle} [/ARRANGEMENT={DELIMITED,FIXED}] [/FIRSTCASE={first_case}] [/IMPORTCASE={ALL,FIRST max_cases,PERCENT percent}] /DELIMITERS="delimiters" [/QUALIFIER="quotes" [/DELCASE={LINE,VARIABLES n_variables}] /VARIABLES=del_var1 [del_var2]… where each del_var takes the form: variable format The GET DATA command with TYPE=TXT and ARRANGEMENT=DELIMITED reads input data from text files in delimited format, where fields are separated by a set of user-specified delimiters. Its capabilities are similar to those of DATA LIST FREE (see DATA LIST FREE), with a few enhancements. The required FILE subcommand and optional FIRSTCASE and IMPORTCASE subcommands are described above (see GET DATA /TYPE=TXT). DELIMITERS, which is required, specifies the set of characters that may separate fields. Each character in the string specified on DELIMITERS separates one field from the next. The end of a line also separates fields, regardless of DELIMITERS. Two consecutive delimiters in the input yield an empty field, as does a delimiter at the end of a line. A space character as a delimiter is an exception: consecutive spaces do not yield an empty field and neither does any number of spaces at the end of a line. To use a tab as a delimiter, specify ‘\t’ at the beginning of the DELIMITERS string. To use a backslash as a delimiter, specify ‘\\’ as the first delimiter or, if a tab should also be a delimiter, immediately following ‘\t’. To read a data file in which each field appears on a separate line, specify the empty string for DELIMITERS. The optional QUALIFIER subcommand names one or more characters that can be used to quote values within fields in the input. A field that begins with one of the specified quote characters ends at the next matching quote. Intervening delimiters become part of the field, instead of terminating it. The ability to specify more than one quote character is a PSPP extension. The character specified on QUALIFIER can be embedded within a field that it quotes by doubling the qualifier. For example, if ‘'’ is specified on QUALIFIER, then 'a''b' specifies a field that contains ‘a'b’. The DELCASE subcommand controls how data may be broken across lines in the data file. With LINE, the default setting, each line must contain all the data for exactly one case. For additional flexibility, to allow a single case to be split among lines or multiple cases to be contained on a single line, specify VARIABLES n_variables, where n_variables is the number of variables per case. The VARIABLES subcommand is required and must be the last subcommand. Specify the name of each variable and its input format (see Input and Output Formats) in the order they should be read from the input file. Examples On a Unix-like system, the ‘/etc/passwd’ file has a format similar to this: root:$1$nyeSP5gD$pDq/:0:0:,,,:/root:/bin/bash blp:$1$BrP/pFg4$g7OG:1000:1000:Ben Pfaff,,,:/home/blp:/bin/bash john:$1$JBuq/Fioq$g4A:1001:1001:John Darrington,,,:/home/john:/bin/bash jhs:$1$D3li4hPL$88X1:1002:1002:Jason Stover,,,:/home/jhs:/bin/csh The following syntax reads a file in the format used by ‘/etc/passwd’: GET DATA /TYPE=TXT /FILE='/etc/passwd' /DELIMITERS=':' /VARIABLES=username A20 password A40 uid F10 gid F10 gecos A40 home A40 shell A40. Consider the following data on used cars: model year mileage price type age Civic 2002 29883 15900 Si 2 Civic 2003 13415 15900 EX 1 Civic 1992 107000 3800 n/a 12 Accord 2002 26613 17900 EX 1 The following syntax can be used to read the used car data: GET DATA /TYPE=TXT /FILE='cars.data' /DELIMITERS=' ' /FIRSTCASE=2 /VARIABLES=model A8 year F4 mileage F6 price F5 type A4 age F2. Consider the following information on animals in a pet store: 'Pet''s Name', "Age", "Color", "Date Received", "Price", "Height", "Type" , (Years), , , (Dollars), , "Rover", 4.5, Brown, "12 Feb 2004", 80, '1''4"', "Dog" "Charlie", , Gold, "5 Apr 2007", 12.3, "3""", "Fish" "Molly", 2, Black, "12 Dec 2006", 25, '5"', "Cat" "Gilly", , White, "10 Apr 2007", 10, "3""", "Guinea Pig" The following syntax can be used to read the pet store data: GET DATA /TYPE=TXT /FILE='pets.data' /DELIMITERS=', ' /QUALIFIER='''"' /ESCAPE /FIRSTCASE=3 /VARIABLES=name A10 age F3.1 color A5 received EDATE10 price F5.2 height a5 type a10. Reading Fixed Columnar Data GET DATA /TYPE=TXT /FILE={’file_name’,file_handle} [/ARRANGEMENT={DELIMITED,FIXED}] [/FIRSTCASE={first_case}] [/IMPORTCASE={ALL,FIRST max_cases,PERCENT percent}] [/FIXCASE=n] /VARIABLES fixed_var [fixed_var]… [/rec# fixed_var [fixed_var]…]… where each fixed_var takes the form: variable start-end format The GET DATA command with TYPE=TXT and ARRANGEMENT=FIXED reads input data from text files in fixed format, where each field is located in particular fixed column positions within records of a case. Its capabilities are similar to those of DATA LIST FIXED (see DATA LIST FIXED), with a few enhancements. The required FILE subcommand and optional FIRSTCASE and IMPORTCASE subcommands are described above (see GET DATA /TYPE=TXT). The optional FIXCASE subcommand may be used to specify the positive integer number of input lines that make up each case. The default value is 1. The VARIABLES subcommand, which is required, specifies the positions at which each variable can be found. For each variable, specify its name, followed by its start and end column separated by ‘-’ (e.g. ‘0-9’), followed by an input format type (e.g. ‘F’) or a full format specification (e.g. ‘DOLLAR12.2’). For this command, columns are numbered starting from 0 at the left column. Introduce the variables in the second and later lines of a case by a slash followed by the number of the line within the case, e.g. ‘/2’ for the second line. Examples Consider the following data on used cars: model year mileage price type age Civic 2002 29883 15900 Si 2 Civic 2003 13415 15900 EX 1 Civic 1992 107000 3800 n/a 12 Accord 2002 26613 17900 EX 1 The following syntax can be used to read the used car data: GET DATA /TYPE=TXT /FILE='cars.data' /ARRANGEMENT=FIXED /FIRSTCASE=2 /VARIABLES=model 0-7 A year 8-15 F mileage 16-23 F price 24-31 F type 32-40 A age 40-47 F. IMPORT IMPORT IMPORT /FILE=’file_name’ /TYPE={COMM,TAPE} /DROP=var_list /KEEP=var_list /RENAME=(src_names=target_names)… The IMPORT transformation clears the active dataset dictionary and data and replaces them with a dictionary and data from a system file or portable file. The FILE subcommand, which is the only required subcommand, specifies the portable file to be read as a file name string or a file handle (see File Handles). The TYPE subcommand is currently not used. DROP, KEEP, and RENAME follow the syntax used by GET (see GET). IMPORT does not cause the data to be read; only the dictionary. The data is read later, when a procedure is executed. Use of IMPORT to read a system file is a PSPP extension. SAVE SAVE SAVE /OUTFILE={’file_name’,file_handle} /UNSELECTED={RETAIN,DELETE} /{UNCOMPRESSED,COMPRESSED,ZCOMPRESSED} /PERMISSIONS={WRITEABLE,READONLY} /DROP=var_list /KEEP=var_list /VERSION=version /RENAME=(src_names=target_names)… /NAMES /MAP The SAVE procedure causes the dictionary and data in the active dataset to be written to a system file. OUTFILE is the only required subcommand. Specify the system file to be written as a string file name or a file handle (see File Handles). By default, cases excluded with FILTER are written to the system file. These can be excluded by specifying DELETE on the UNSELECTED subcommand. Specifying RETAIN makes the default explicit. The UNCOMPRESSED, COMPRESSED, and ZCOMPRESSED subcommand determine the system file’s compression level: UNCOMPRESSED Data is not compressed. Each numeric value uses 8 bytes of disk space. Each string value uses one byte per column width, rounded up to a multiple of 8 bytes. COMPRESSED Data is compressed with a simple algorithm. Each integer numeric value between −99 and 151, inclusive, or system missing value uses one byte of disk space. Each 8-byte segment of a string that consists only of spaces uses 1 byte. Any other numeric value or 8-byte string segment uses 9 bytes of disk space. ZCOMPRESSED Data is compressed with the “deflate” compression algorithm specified in RFC 1951 (the same algorithm used by gzip). Files written with this compression level cannot be read by PSPP 0.8.1 or earlier or by SPSS 20 or earlier. COMPRESSED is the default compression level. The SET command (see SET) can change this default. The PERMISSIONS subcommand specifies permissions for the new system file. WRITEABLE, the default, creates the file with read and write permission. READONLY creates the file for read-only access. By default, all the variables in the active dataset dictionary are written to the system file. The DROP subcommand can be used to specify a list of variables not to be written. In contrast, KEEP specifies variables to be written, with all variables not specified not written. Normally variables are saved to a system file under the same names they have in the active dataset. Use the RENAME subcommand to change these names. Specify, within parentheses, a list of variable names followed by an equals sign (‘=’) and the names that they should be renamed to. Multiple parenthesized groups of variable names can be included on a single RENAME subcommand. Variables’ names may be swapped using a RENAME subcommand of the form /RENAME=(A B=B A). Alternate syntax for the RENAME subcommand allows the parentheses to be eliminated. When this is done, only a single variable may be renamed at once. For instance, /RENAME=A=B. This alternate syntax is deprecated. DROP, KEEP, and RENAME are performed in left-to-right order. They each may be present any number of times. SAVE never modifies the active dataset. DROP, KEEP, and RENAME only affect the system file written to disk. The VERSION subcommand specifies the version of the file format. Valid versions are 2 and 3. The default version is 3. In version 2 system files, variable names longer than 8 bytes will be truncated. The two versions are otherwise identical. The NAMES and MAP subcommands are currently ignored. SAVE causes the data to be read. It is a procedure. SAVE DATA COLLECTION SAVE DATA COLLECTION SAVE DATA COLLECTION /OUTFILE={’file_name’,file_handle} /METADATA={’file_name’,file_handle} /{UNCOMPRESSED,COMPRESSED,ZCOMPRESSED} /PERMISSIONS={WRITEABLE,READONLY} /DROP=var_list /KEEP=var_list /VERSION=version /RENAME=(src_names=target_names)… /NAMES /MAP Like SAVE, SAVE DATA COLLECTION writes the dictionary and data in the active dataset to a system file. In addition, it writes metadata to an additional XML metadata file. OUTFILE is required. Specify the system file to be written as a string file name or a file handle (see File Handles). METADATA is also required. Specify the metadata file to be written as a string file name or a file handle. Metadata files customarily use a .mdd extension. The current implementation of this command is experimental. It only outputs an approximation of the metadata file format. Please report bugs. Other subcommands are optional. They have the same meanings as in the SAVE command. SAVE DATA COLLECTION causes the data to be read. It is a procedure. SAVE TRANSLATE SAVE TRANSLATE SAVE TRANSLATE /OUTFILE={’file_name’,file_handle} /TYPE={CSV,TAB} [/REPLACE] [/MISSING={IGNORE,RECODE}] [/DROP=var_list] [/KEEP=var_list] [/RENAME=(src_names=target_names)…] [/UNSELECTED={RETAIN,DELETE}] [/MAP] …additional subcommands depending on TYPE… The SAVE TRANSLATE command is used to save data into various formats understood by other applications. The OUTFILE and TYPE subcommands are mandatory. OUTFILE specifies the file to be written, as a string file name or a file handle (see File Handles). TYPE determines the type of the file or source to read. It must be one of the following: CSV Comma-separated value format, TAB Tab-delimited format. By default, SAVE TRANSLATE will not overwrite an existing file. Use REPLACE to force an existing file to be overwritten. With MISSING=IGNORE, the default, SAVE TRANSLATE treats user-missing values as if they were not missing. Specify MISSING=RECODE to output numeric user-missing values like system-missing values and string user-missing values as all spaces. By default, all the variables in the active dataset dictionary are saved to the system file, but DROP or KEEP can select a subset of variable to save. The RENAME subcommand can also be used to change the names under which variables are saved; because they are used only in the output, these names do not have to conform to the usual PSPP variable naming rules. UNSELECTED determines whether cases filtered out by the FILTER command are written to the output file. These subcommands have the same syntax and meaning as on the SAVE command (see SAVE). Each supported file type has additional subcommands, explained in separate sections below. SAVE TRANSLATE causes the data to be read. It is a procedure. Writing Comma- and Tab-Separated Data Files SAVE TRANSLATE /OUTFILE={’file_name’,file_handle} /TYPE=CSV [/REPLACE] [/MISSING={IGNORE,RECODE}] [/DROP=var_list] [/KEEP=var_list] [/RENAME=(src_names=target_names)…] [/UNSELECTED={RETAIN,DELETE}] [/FIELDNAMES] [/CELLS={VALUES,LABELS}] [/TEXTOPTIONS DELIMITER=’delimiter’] [/TEXTOPTIONS QUALIFIER=’qualifier’] [/TEXTOPTIONS DECIMAL={DOT,COMMA}] [/TEXTOPTIONS FORMAT={PLAIN,VARIABLE}] The SAVE TRANSLATE command with TYPE=CSV or TYPE=TAB writes data in a comma- or tab-separated value format similar to that described by RFC 4180. Each variable becomes one output column, and each case becomes one line of output. If FIELDNAMES is specified, an additional line at the top of the output file lists variable names. The CELLS and TEXTOPTIONS FORMAT settings determine how values are written to the output file: CELLS=VALUES FORMAT=PLAIN (the default settings) Writes variables to the output in “plain” formats that ignore the details of variable formats. Numeric values are written as plain decimal numbers with enough digits to indicate their exact values in machine representation. Numeric values include ‘e’ followed by an exponent if the exponent value would be less than -4 or greater than 16. Dates are written in MM/DD/YYYY format and times in HH:MM:SS format. WKDAY and MONTH values are written as decimal numbers. Numeric values use, by default, the decimal point character set with SET DECIMAL (see SET DECIMAL). Use DECIMAL=DOT or DECIMAL=COMMA to force a particular decimal point character. CELLS=VALUES FORMAT=VARIABLE Writes variables using their print formats. Leading and trailing spaces are removed from numeric values, and trailing spaces are removed from string values. CELLS=LABEL FORMAT=PLAIN CELLS=LABEL FORMAT=VARIABLE Writes value labels where they exist, and otherwise writes the values themselves as described above. Regardless of CELLS and TEXTOPTIONS FORMAT, numeric system-missing values are output as a single space. For TYPE=TAB, tab characters delimit values. For TYPE=CSV, the TEXTOPTIONS DELIMITER and DECIMAL settings determine the character that separate values within a line. If DELIMITER is specified, then the specified string separate values. If DELIMITER is not specified, then the default is a comma with DECIMAL=DOT or a semicolon with DECIMAL=COMMA. If DECIMAL is not given either, it is implied by the decimal point character set with SET DECIMAL (see SET DECIMAL). The TEXTOPTIONS QUALIFIER setting specifies a character that is output before and after a value that contains the delimiter character or the qualifier character. The default is a double quote (‘"’). A qualifier character that appears within a value is doubled. SYSFILE INFO SYSFILE INFO SYSFILE INFO FILE=’file_name’ [ENCODING=’encoding’]. SYSFILE INFO reads the dictionary in an SPSS system file, SPSS/PC+ system file, or SPSS portable file, and displays the information in its dictionary. Specify a file name or file handle. SYSFILE INFO reads that file and displays information on its dictionary. PSPP automatically detects the encoding of string data in the file, when possible. The character encoding of old SPSS system files cannot always be guessed correctly, and SPSS/PC+ system files do not include any indication of their encoding. Specify the ENCODING subcommand with an IANA character set name as its string argument to override the default, or specify ENCODING='DETECT' to analyze and report possibly valid encodings for the system file. The ENCODING subcommand is a PSPP extension. SYSFILE INFO does not affect the current active dataset. XEXPORT XEXPORT XEXPORT /OUTFILE=’file_name’ /DIGITS=n /DROP=var_list /KEEP=var_list /RENAME=(src_names=target_names)… /TYPE={COMM,TAPE} /MAP The XEXPORT transformation writes the active dataset dictionary and data to a specified portable file. This transformation is a PSPP extension. It is similar to the EXPORT procedure, with two differences: XEXPORT is a transformation, not a procedure. It is executed when the data is read by a procedure or procedure-like command. XEXPORT does not support the UNSELECTED subcommand. See EXPORT, for more information. XSAVE XSAVE XSAVE /OUTFILE=’file_name’ /{UNCOMPRESSED,COMPRESSED,ZCOMPRESSED} /PERMISSIONS={WRITEABLE,READONLY} /DROP=var_list /KEEP=var_list /VERSION=version /RENAME=(src_names=target_names)… /NAMES /MAP The XSAVE transformation writes the active dataset’s dictionary and data to a system file. It is similar to the SAVE procedure, with two differences: XSAVE is a transformation, not a procedure. It is executed when the data is read by a procedure or procedure-like command. XSAVE does not support the UNSELECTED subcommand. See SAVE, for more information. Combining Data Files This chapter describes commands that allow data from system files, portable files, and open datasets to be combined to form a new active dataset. These commands can combine data files in the following ways: ADD FILES interleaves or appends the cases from each input file. It is used with input files that have variables in common, but distinct sets of cases. MATCH FILES adds the data together in cases that match across multiple input files. It is used with input files that have cases in common, but different information about each case. UPDATE updates a master data file from data in a set of transaction files. Each case in a transaction data file modifies a matching case in the primary data file, or it adds a new case if no matching case can be found. These commands share the majority of their syntax, which is described in the following section, followed by one section for each command that describes its specific syntax and semantics. Common Syntax Per input file: /FILE={*,’file_name’} [/RENAME=(src_names=target_names)…] [/IN=var_name] [/SORT] Once per command: /BY var_list[({D|A})] [var_list[({D|A}]]… [/DROP=var_list] [/KEEP=var_list] [/FIRST=var_name] [/LAST=var_name] [/MAP] This section describes the syntactical features in common among the ADD FILES, MATCH FILES, and UPDATE commands. The following sections describe details specific to each command. Each of these commands reads two or more input files and combines them. The command’s output becomes the new active dataset. None of the commands actually change the input files. Therefore, if you want the changes to become permanent, you must explicitly save them using an appropriate procedure or transformation (see System and Portable File IO). The syntax of each command begins with a specification of the files to be read as input. For each input file, specify FILE with a system file or portable file’s name as a string, a dataset (see Datasets) or file handle name, (see File Handles), or an asterisk (‘*’) to use the active dataset as input. Use of portable files on FILE is a PSPP extension. At least two FILE subcommands must be specified. If the active dataset is used as an input source, then TEMPORARY must not be in effect. Each FILE subcommand may be followed by any number of RENAME subcommands that specify a parenthesized group or groups of variable names as they appear in the input file, followed by those variables’ new names, separated by an equals sign (=), e.g. /RENAME=(OLD1=NEW1)(OLD2=NEW2). To rename a single variable, the parentheses may be omitted: /RENAME=old=new. Within a parenthesized group, variables are renamed simultaneously, so that /RENAME=(A B=B A) exchanges the names of variables A and B. Otherwise, renaming occurs in left-to-right order. Each FILE subcommand may optionally be followed by a single IN subcommand, which creates a numeric variable with the specified name and format F1.0. The IN variable takes value 1 in an output case if the given input file contributed to that output case, and 0 otherwise. The DROP, KEEP, and RENAME subcommands have no effect on IN variables. If BY is used (see below), the SORT keyword must be specified after a FILE if that input file is not already sorted on the BY variables. When SORT is specified, PSPP sorts the input file’s data on the BY variables before it applies it to the command. When SORT is used, BY is required. SORT is a PSPP extension. PSPP merges the dictionaries of all of the input files to form the dictionary of the new active dataset, like so: The variables in the new active dataset are the union of all the input files’ variables, matched based on their name. When a single input file contains a variable with a given name, the output file will contain exactly that variable. When more than one input file contains a variable with a given name, those variables must all have the same type (numeric or string) and, for string variables, the same width. Variables are matched after renaming with the RENAME subcommand. Thus, RENAME can be used to resolve conflicts. The variable label for each output variable is taken from the first specified input file that has a variable label for that variable, and similarly for value labels and missing values. The file label of the new active dataset (see FILE LABEL) is that of the first specified FILE that has a file label. The documents in the new active dataset (see DOCUMENT) are the concatenation of all the input files’ documents, in the order in which the FILE subcommands are specified. If all of the input files are weighted on the same variable, then the new active dataset is weighted on that variable. Otherwise, the new active dataset is not weighted. The remaining subcommands apply to the output file as a whole, rather than to individual input files. They must be specified at the end of the command specification, following all of the FILE and related subcommands. The most important of these subcommands is BY, which specifies a set of one or more variables that may be used to find corresponding cases in each of the input files. The variables specified on BY must be present in all of the input files. Furthermore, if any of the input files are not sorted on the BY variables, then SORT must be specified for those input files. The variables listed on BY may include (A) or (D) annotations to specify ascending or descending sort order. See SORT CASES, for more details on this notation. Adding (A) or (D) to the BY subcommand specification is a PSPP extension. The DROP subcommand can be used to specify a list of variables to exclude from the output. By contrast, the KEEP subcommand can be used to specify variables to include in the output; all variables not listed are dropped. DROP and KEEP are executed in left-to-right order and may be repeated any number of times. DROP and KEEP do not affect variables created by the IN, FIRST, and LAST subcommands, which are always included in the new active dataset, but they can be used to drop BY variables. The FIRST and LAST subcommands are optional. They may only be specified on MATCH FILES and ADD FILES, and only when BY is used. FIRST and LIST each adds a numeric variable to the new active dataset, with the name given as the subcommand’s argument and F1.0 print and write formats. The value of the FIRST variable is 1 in the first output case with a given set of values for the BY variables, and 0 in other cases. Similarly, the LAST variable is 1 in the last case with a given of BY values, and 0 in other cases. When any of these commands creates an output case, variables that are only in files that are not present for the current case are set to the system-missing value for numeric variables or spaces for string variables. These commands may combine any number of files, limited only by the machine’s memory. ADD FILES ADD FILES ADD FILES Per input file: /FILE={*,’file_name’} [/RENAME=(src_names=target_names)…] [/IN=var_name] [/SORT] Once per command: [/BY var_list[({D|A})] [var_list[({D|A})]…]] [/DROP=var_list] [/KEEP=var_list] [/FIRST=var_name] [/LAST=var_name] [/MAP] ADD FILES adds cases from multiple input files. The output, which replaces the active dataset, consists all of the cases in all of the input files. ADD FILES shares the bulk of its syntax with other PSPP commands for combining multiple data files. See Combining Files Common Syntax, above, for an explanation of this common syntax. When BY is not used, the output of ADD FILES consists of all the cases from the first input file specified, followed by all the cases from the second file specified, and so on. When BY is used, the output is additionally sorted on the BY variables. When ADD FILES creates an output case, variables that are not part of the input file from which the case was drawn are set to the system-missing value for numeric variables or spaces for string variables. MATCH FILES MATCH FILES MATCH FILES Per input file: /{FILE,TABLE}={*,’file_name’} [/RENAME=(src_names=target_names)…] [/IN=var_name] [/SORT] Once per command: /BY var_list[({D|A}] [var_list[({D|A})]…] [/DROP=var_list] [/KEEP=var_list] [/FIRST=var_name] [/LAST=var_name] [/MAP] MATCH FILES merges sets of corresponding cases in multiple input files into single cases in the output, combining their data. MATCH FILES shares the bulk of its syntax with other PSPP commands for combining multiple data files. See Combining Files Common Syntax, above, for an explanation of this common syntax. How MATCH FILES matches up cases from the input files depends on whether BY is specified: If BY is not used, MATCH FILES combines the first case from each input file to produce the first output case, then the second case from each input file for the second output case, and so on. If some input files have fewer cases than others, then the shorter files do not contribute to cases output after their input has been exhausted. If BY is used, MATCH FILES combines cases from each input file that have identical values for the BY variables. When BY is used, TABLE subcommands may be used to introduce table lookup file. TABLE has same syntax as FILE, and the RENAME, IN, and SORT subcommands may follow a TABLE in the same way as FILE. Regardless of the number of TABLEs, at least one FILE must specified. Table lookup files are treated in the same way as other input files for most purposes and, in particular, table lookup files must be sorted on the BY variables or the SORT subcommand must be specified for that TABLE. Cases in table lookup files are not consumed after they have been used once. This means that data in table lookup files can correspond to any number of cases in FILE input files. Table lookup files are analogous to lookup tables in traditional relational database systems. If a table lookup file contains more than one case with a given set of BY variables, only the first case is used. When MATCH FILES creates an output case, variables that are only in files that are not present for the current case are set to the system-missing value for numeric variables or spaces for string variables. UPDATE UPDATE UPDATE Per input file: /FILE={*,’file_name’} [/RENAME=(src_names=target_names)…] [/IN=var_name] [/SORT] Once per command: /BY var_list[({D|A})] [var_list[({D|A})]]… [/DROP=var_list] [/KEEP=var_list] [/MAP] UPDATE updates a master file by applying modifications from one or more transaction files. UPDATE shares the bulk of its syntax with other PSPP commands for combining multiple data files. See Combining Files Common Syntax, above, for an explanation of this common syntax. At least two FILE subcommands must be specified. The first FILE subcommand names the master file, and the rest name transaction files. Every input file must either be sorted on the variables named on the BY subcommand, or the SORT subcommand must be used just after the FILE subcommand for that input file. UPDATE uses the variables specified on the BY subcommand, which is required, to attempt to match each case in a transaction file with a case in the master file: When a match is found, then the values of the variables present in the transaction file replace those variables’ values in the new active file. If there are matching cases in more than more transaction file, PSPP applies the replacements from the first transaction file, then from the second transaction file, and so on. Similarly, if a single transaction file has cases with duplicate BY values, then those are applied in order to the master file. When a variable in a transaction file has a missing value or when a string variable’s value is all blanks, that value is never used to update the master file. If a case in the master file has no matching case in any transaction file, then it is copied unchanged to the output. If a case in a transaction file has no matching case in the master file, then it causes a new case to be added to the output, initialized from the values in the transaction file. Manipulating variables The variables in the active dataset dictionary are important. There are several utility functions for examining and adjusting them. ADD VALUE LABELS ADD VALUE LABELS ADD VALUE LABELS /var_list valuelabel’ [valuelabel’]… ADD VALUE LABELS has the same syntax and purpose as VALUE LABELS (see VALUE LABELS), but it does not clear value labels from the variables before adding the ones specified. DELETE VARIABLES DELETE VARIABLES DELETE VARIABLES var_list. DELETE VARIABLES deletes the specified variables from the dictionary. It may not be used to delete all variables from the dictionary; use NEW FILE to do that (see NEW FILE). DELETE VARIABLES should not be used after defining transformations but before executing a procedure. If it is used in such a context, it causes the data to be read. If it is used while TEMPORARY is in effect, it causes the temporary transformations to become permanent. DISPLAY DISPLAY DISPLAY [SORTED] NAMES [[/VARIABLES=]var_list]. DISPLAY [SORTED] INDEX [[/VARIABLES=]var_list]. DISPLAY [SORTED] LABELS [[/VARIABLES=]var_list]. DISPLAY [SORTED] VARIABLES [[/VARIABLES=]var_list]. DISPLAY [SORTED] DICTIONARY [[/VARIABLES=]var_list]. DISPLAY [SORTED] SCRATCH [[/VARIABLES=]var_list]. DISPLAY [SORTED] ATTRIBUTES [[/VARIABLES=]var_list]. DISPLAY [SORTED] @ATTRIBUTES [[/VARIABLES=]var_list]. DISPLAY [SORTED] VECTORS. DISPLAY displays information about the active dataset. A variety of different forms of information can be requested. The following keywords primarily cause information about variables to be displayed. With these keywords, by default information is displayed about all variable in the active dataset, in the order that variables occur in the active dataset dictionary. The SORTED keyword causes output to be sorted alphabetically by variable name. The VARIABLES subcommand limits output to the specified variables. NAMES The variables’ names are displayed. INDEX The variables’ names are displayed along with a value describing their position within the active dataset dictionary. LABELS Variable names, positions, and variable labels are displayed. VARIABLES Variable names, positions, print and write formats, and missing values are displayed. DICTIONARY Variable names, positions, print and write formats, missing values, variable labels, and value labels are displayed. SCRATCH Variable names are displayed, for scratch variables only (see Scratch Variables). ATTRIBUTES @ATTRIBUTES Datafile and variable attributes are displayed. The first form of the command omits those attributes whose names begin with @ or $@. In the second for, all datafile and variable attributes are displayed. With the VECTOR keyword, DISPLAY lists all the currently declared vectors. If the SORTED keyword is given, the vectors are listed in alphabetical order; otherwise, they are listed in textual order of definition within the PSPP syntax file. For related commands, see DISPLAY DOCUMENTS and DISPLAY FILE LABEL. FORMATS FORMATS FORMATS var_list (fmt_spec) [var_list (fmt_spec)]…. FORMATS set both print and write formats for the specified variables to the specified format specification. See Input and Output Formats. Specify a list of variables followed by a format specification in parentheses. The print and write formats of the specified variables will be changed. All of the variables listed together must have the same type and, for string variables, the same width. Additional lists of variables and formats may be included following the first one. FORMATS takes effect immediately. It is not affected by conditional and looping structures such as DO IF or LOOP. LEAVE LEAVE LEAVE var_list. LEAVE prevents the specified variables from being reinitialized whenever a new case is processed. Normally, when a data file is processed, every variable in the active dataset is initialized to the system-missing value or spaces at the beginning of processing for each case. When a variable has been specified on LEAVE, this is not the case. Instead, that variable is initialized to 0 (not system-missing) or spaces for the first case. After that, it retains its value between cases. This becomes useful for counters. For instance, in the example below the variable SUM maintains a running total of the values in the ITEM variable. DATA LIST /ITEM 1-3. COMPUTE SUM=SUM+ITEM. PRINT /ITEM SUM. LEAVE SUM BEGIN DATA. 123 404 555 999 END DATA. Partial output from this example: 123 123.00 404 527.00 555 1082.00 999 2081.00 It is best to use LEAVE command immediately before invoking a procedure command, because the left status of variables is reset by certain transformations—for instance, COMPUTE and IF. Left status is also reset by all procedure invocations. MISSING VALUES MISSING VALUES MISSING VALUES var_list (missing_values). where missing_values takes one of the following forms: num1 num1, num2 num1, num2, num3 num1 THRU num2 num1 THRU num2, num3 string1 string1, string2 string1, string2, string3 As part of a range, LO or LOWEST may take the place of num1; HI or HIGHEST may take the place of num2. MISSING VALUES sets user-missing values for numeric and string variables. Long string variables may have missing values, but characters after the first 8 bytes of the missing value must be spaces. Specify a list of variables, followed by a list of their user-missing values in parentheses. Up to three discrete values may be given, or, for numeric variables only, a range of values optionally accompanied by a single discrete value. Ranges may be open-ended on one end, indicated through the use of the keyword LO or LOWEST or HI or HIGHEST. The MISSING VALUES command takes effect immediately. It is not affected by conditional and looping constructs such as DO IF or LOOP. MODIFY VARS MODIFY VARS MODIFY VARS /REORDER={FORWARD,BACKWARD} {POSITIONAL,ALPHA} (var_list)… /RENAME=(old_names=new_names)… /{DROP,KEEP}=var_list /MAP MODIFY VARS reorders, renames, and deletes variables in the active dataset. At least one subcommand must be specified, and no subcommand may be specified more than once. DROP and KEEP may not both be specified. The REORDER subcommand changes the order of variables in the active dataset. Specify one or more lists of variable names in parentheses. By default, each list of variables is rearranged into the specified order. To put the variables into the reverse of the specified order, put keyword BACKWARD before the parentheses. To put them into alphabetical order in the dictionary, specify keyword ALPHA before the parentheses. BACKWARD and ALPHA may also be combined. To rename variables in the active dataset, specify RENAME, an equals sign (‘=’), and lists of the old variable names and new variable names separated by another equals sign within parentheses. There must be the same number of old and new variable names. Each old variable is renamed to the corresponding new variable name. Multiple parenthesized groups of variables may be specified. The DROP subcommand deletes a specified list of variables from the active dataset. MODIFY VARS may not be used to delete all variables from the dictionary; use NEW FILE to do that (see NEW FILE). The KEEP subcommand keeps the specified list of variables in the active dataset. Any unlisted variables are deleted from the active dataset. MAP is currently ignored. If either DROP or KEEP is specified, the data is read; otherwise it is not. MODIFY VARS may not be specified following TEMPORARY (see TEMPORARY). MRSETS MRSETS MRSETS /MDGROUP NAME=name VARIABLES=var_list VALUE=value [CATEGORYLABELS={VARLABELS,COUNTEDVALUES}] [{LABEL=’label’,LABELSOURCE=VARLABEL}] /MCGROUP NAME=name VARIABLES=var_list [LABEL=’label’] /DELETE NAME={[names],ALL} /DISPLAY NAME={[names],ALL} MRSETS creates, modifies, deletes, and displays multiple response sets. A multiple response set is a set of variables that represent multiple responses to a single survey question in one of the two following ways: A multiple dichotomy set is analogous to a survey question with a set of checkboxes. Each variable in the set is treated in a Boolean fashion: one value (the "counted value") means that the box was checked, and any other value means that it was not. A multiple category set represents a survey question where the respondent is instructed to list up to n choices. Each variable represents one of the responses. Any number of subcommands may be specified in any order. The MDGROUP subcommand creates a new multiple dichotomy set or replaces an existing multiple response set. The NAME, VARIABLES, and VALUE specifications are required. The others are optional: NAME specifies the name used in syntax for the new multiple dichotomy set. The name must begin with ‘$’; it must otherwise follow the rules for identifiers (see Tokens). VARIABLES specifies the variables that belong to the set. At least two variables must be specified. The variables must be all string or all numeric. VALUE specifies the counted value. If the variables are numeric, the value must be an integer. If the variables are strings, then the value must be a string that is no longer than the shortest of the variables in the set (ignoring trailing spaces). CATEGORYLABELS optionally specifies the source of the labels for each category in the set: VARLABELS, the default, uses variable labels or, for variables without variable labels, variable names. PSPP warns if two variables have the same variable label, since these categories cannot be distinguished in output. COUNTEDVALUES instead uses each variable’s value label for the counted value. PSPP warns if two variables have the same value label for the counted value or if one of the variables lacks a value label, since such categories cannot be distinguished in output. LABEL optionally specifies a label for the multiple response set. If neither LABEL nor LABELSOURCE=VARLABEL is specified, the set is unlabeled. LABELSOURCE=VARLABEL draws the multiple response set’s label from the first variable label among the variables in the set; if none of the variables has a label, the name of the first variable is used. LABELSOURCE=VARLABEL must be used with CATEGORYLABELS=COUNTEDVALUES. It is mutually exclusive with LABEL. The MCGROUP subcommand creates a new multiple category set or replaces an existing multiple response set. The NAME and VARIABLES specifications are required, and LABEL is optional. Their meanings are as described above in MDGROUP. PSPP warns if two variables in the set have different value labels for a single value, since each of the variables in the set should have the same possible categories. The DELETE subcommand deletes multiple response groups. A list of groups may be named within a set of required square brackets, or ALL may be used to delete all groups. The DISPLAY subcommand displays information about defined multiple response sets. Its syntax is the same as the DELETE subcommand. Multiple response sets are saved to and read from system files by, e.g., the SAVE and GET command. Otherwise, multiple response sets are currently used only by third party software. NUMERIC NUMERIC NUMERIC var_list [(fmt_spec)] [/var_list [(fmt_spec)]]… NUMERIC explicitly declares new numeric variables, optionally setting their output formats. Specify the names of the new numeric variables as var_list. If you wish to set the variables’ output formats, follow their names by an output format specification in parentheses (see Input and Output Formats); otherwise, the default is F8.2. Variables created with NUMERIC are initialized to the system-missing value. PRINT FORMATS PRINT FORMATS PRINT FORMATS var_list (fmt_spec) [var_list (fmt_spec)]…. PRINT FORMATS sets the print formats for the specified variables to the specified format specification. Its syntax is identical to that of FORMATS (see FORMATS), but PRINT FORMATS sets only print formats, not write formats. RENAME VARIABLES RENAME VARIABLES RENAME VARIABLES (old_names=new_names)… . RENAME VARIABLES changes the names of variables in the active dataset. Specify lists of the old variable names and new variable names, separated by an equals sign (‘=’), within parentheses. There must be the same number of old and new variable names. Each old variable is renamed to the corresponding new variable name. Multiple parenthesized groups of variables may be specified. When the old and new variable names contain only a single variable name, the parentheses are optional. RENAME VARIABLES takes effect immediately. It does not cause the data to be read. RENAME VARIABLES may not be specified following TEMPORARY (see TEMPORARY). SORT VARIABLES SORT VARIABLES SORT VARIABLES [BY] (NAME | TYPE | FORMAT | LABEL | VALUES | MISSING | MEASURE | ROLE | COLUMNS | ALIGNMENT | ATTRIBUTE name) [(D)]. SORT VARIABLES reorders the variables in the active dataset. The main specification is one of the following identifiers, which determines how the variables are sorted: NAME Sorts the variables according to their names, in a case-insensitive fashion. However, when variable names differ only in a number at the end, they are sorted numerically. For example, VAR5 is sorted before VAR400 even though ‘4’ precedes ‘5’. TYPE Sorts numeric variables before string variables, and shorter string variables before longer ones. FORMAT Groups variables by print format; within a format, sorts narrower formats before wider ones; with the same format and width, sorts fewer decimal places before more decimal places. See FORMATS. LABEL Sorts variables without a variable label before those with one. See VARIABLE LABELS. VALUES Sorts variables without value labels before those with some. See VALUE LABELS. MISSING Sorts variables without missing values before those with some. See MISSING VALUES. MEASURE Sorts nominal variables first, followed by ordinal variables, followed by scale variables. See VARIABLE LEVEL. ROLE Groups variables according to their role. See VARIABLE ROLE. COLUMNS Sorts variables in ascending display width. See VARIABLE WIDTH. ALIGNMENT Sorts variables according to their alignment, first left-aligned, then right-aligned, then centered. See VARIABLE ALIGNMENT. ATTRIBUTE name Sorts variables according to the first value of their name attribute. Variables without attribute are sorted first. See VARIABLE ATTRIBUTE. Only one sort criterion can be specified. The sort is “stable,” so to sort on multiple criteria one may perform multiple sorts. For example, the following will sort primarily based on alignment, with variables that have the same alignment ordered based on display width: SORT VARIABLES BY COLUMNS. SORT VARIABLES BY ALIGNMENT. Specify (D) to reverse the sort order. VALUE LABELS VALUE LABELS VALUE LABELS /var_list valuelabel’ [valuelabel’]… VALUE LABELS allows values of variables to be associated with labels. In this way, a short value can stand for a longer, more descriptive label. Both numeric and string variables can be given labels. For string variables, the values are case-sensitive, so that, for example, a capitalized value and its lowercase variant would have to be labeled separately if both are present in the data. To set up value labels for one or more variables, specify the variable names after a slash (‘/’), followed by a list of values and their associated labels, separated by spaces. Value labels in output are normally broken into lines automatically. Put ‘\n’ in a label string to force a line break at that point. The label may still be broken into lines at additional points. Before VALUE LABELS is executed, any existing value labels are cleared from the variables specified. Use ADD VALUE LABELS (see ADD VALUE LABELS) to add value labels without clearing those already present. STRING STRING STRING var_list (fmt_spec) [/var_list (fmt_spec)] […]. STRING creates new string variables for use in transformations. Specify a list of names for the variable you want to create, followed by the desired output format specification in parentheses (see Input and Output Formats). Variable widths are implicitly derived from the specified output formats. The created variables will be initialized to spaces. If you want to create several variables with distinct output formats, you can either use two or more separate STRING commands, or you can specify further variable list and format specification pairs, each separated from the previous by a slash (‘/’). The following example is one way to create three string variables; Two of the variables have format A24 and the other A80: STRING firstname lastname (A24) / address (A80). Here is another way to achieve the same result: STRING firstname lastname (A24). STRING address (A80). … and here is yet another way: STRING firstname (A24). STRING lastname (A24). STRING address (A80). VARIABLE ATTRIBUTE VARIABLE ATTRIBUTE VARIABLE ATTRIBUTE VARIABLES=var_list ATTRIBUTE=name(’value’) [name(’value’)]… ATTRIBUTE=name[index](’value’) [name[index](’value’)]… DELETE=name [name]… DELETE=name[index] [name[index]]… VARIABLE ATTRIBUTE adds, modifies, or removes user-defined attributes associated with variables in the active dataset. Custom variable attributes are not interpreted by PSPP, but they are saved as part of system files and may be used by other software that reads them. The required VARIABLES subcommand must come first. Specify the variables to which the following ATTRIBUTE or DELETE subcommand should apply. Use the ATTRIBUTE subcommand to add or modify custom variable attributes. Specify the name of the attribute as an identifier (see Tokens), followed by the desired value, in parentheses, as a quoted string. The specified attributes are then added or modified in the variables specified on VARIABLES. Attribute names that begin with $ are reserved for PSPP’s internal use, and attribute names that begin with @ or $@ are not displayed by most PSPP commands that display other attributes. Other attribute names are not treated specially. Attributes may also be organized into arrays. To assign to an array element, add an integer array index enclosed in square brackets ([ and ]) between the attribute name and value. Array indexes start at 1, not 0. An attribute array that has a single element (number 1) is not distinguished from a non-array attribute. Use the DELETE subcommand to delete an attribute from the variable specified on VARIABLES. Specify an attribute name by itself to delete an entire attribute, including all array elements for attribute arrays. Specify an attribute name followed by an array index in square brackets to delete a single element of an attribute array. In the latter case, all the array elements numbered higher than the deleted element are shifted down, filling the vacated position. To associate custom attributes with the entire active dataset, instead of with particular variables, use DATAFILE ATTRIBUTE (see DATAFILE ATTRIBUTE) instead. VARIABLE ATTRIBUTE takes effect immediately. It is not affected by conditional and looping structures such as DO IF or LOOP. VARIABLE LABELS VARIABLE LABELS VARIABLE LABELS var_listvar_label’ [ /var_listvar_label’] . . . [ /var_listvar_label’] VARIABLE LABELS associates explanatory names with variables. This name, called a variable label, is displayed by statistical procedures. To assign a variable label to a group of variables, specify a list of variable names and the variable label as a string. To assign different labels to different variables in the same command, precede the subsequent variable list with a slash (‘/’). VARIABLE ALIGNMENT VARIABLE ALIGNMENT VARIABLE ALIGNMENT var_list ( LEFT | RIGHT | CENTER ) [ /var_list ( LEFT | RIGHT | CENTER ) ] . . . [ /var_list ( LEFT | RIGHT | CENTER ) ] VARIABLE ALIGNMENT sets the alignment of variables for display editing purposes. This only has effect for third party software. It does not affect the display of variables in the PSPP output. VARIABLE WIDTH VARIABLE WIDTH VARIABLE WIDTH var_list (width) [ /var_list (width) ] . . . [ /var_list (width) ] VARIABLE WIDTH sets the column width of variables for display editing purposes. This only affects third party software. It does not affect the display of variables in the PSPP output. VARIABLE LEVEL VARIABLE LEVEL VARIABLE LEVEL var_list ( SCALE | NOMINAL | ORDINAL ) [ /var_list ( SCALE | NOMINAL | ORDINAL ) ] . . . [ /var_list ( SCALE | NOMINAL | ORDINAL ) ] VARIABLE LEVEL sets the measurement level of variables. Currently, this has no effect except for certain third party software. VARIABLE ROLE VARIABLE ROLE VARIABLE ROLE /role var_list [/role var_list]… VARIABLE ROLE sets the intended role of a variable for use in dialog boxes in graphical user interfaces. Each role specifies one of the following roles for the variables that follow it: INPUT An input variable, such as an independent variable. TARGET An output variable, such as an dependent variable. BOTH A variable used for input and output. NONE No role assigned. (This is a variable’s default role.) PARTITION Used to break the data into groups for testing. SPLIT No meaning except for certain third party software. (This role’s meaning is unrelated to SPLIT FILE.) The PSPPIRE GUI does not yet use variable roles as intended. VECTOR VECTOR Two possible syntaxes: VECTOR vec_name=var_list. VECTOR vec_name_list(count [format]). VECTOR allows a group of variables to be accessed as if they were consecutive members of an array with a vector(index) notation. To make a vector out of a set of existing variables, specify a name for the vector followed by an equals sign (‘=’) and the variables to put in the vector. The variables must be all numeric or all string, and string variables must have the same width. To make a vector and create variables at the same time, specify one or more vector names followed by a count in parentheses. This will create variables named vec1 through veccount. By default, the new variables are numeric with format F8.2, but an alternate format may be specified inside the parentheses before or after the count and separated from it by white space or a comma. With a string format such as A8, the variables will be string variables; with a numeric format, they will be numeric. Variable names including the suffixes may not exceed 64 characters in length, and none of the variables may exist prior to VECTOR. Vectors created with VECTOR disappear after any procedure or procedure-like command is executed. The variables contained in the vectors remain, unless they are scratch variables (see Scratch Variables). Variables within a vector may be referenced in expressions using vector(index) syntax. WRITE FORMATS WRITE FORMATS WRITE FORMATS var_list (fmt_spec) [var_list (fmt_spec)]…. WRITE FORMATS sets the write formats for the specified variables to the specified format specification. Its syntax is identical to that of FORMATS (see FORMATS), but WRITE FORMATS sets only write formats, not print formats. Data transformations transformations The PSPP procedures examined in this chapter manipulate data and prepare the active dataset for later analyses. They do not produce output, as a rule. AGGREGATE AGGREGATE AGGREGATE OUTFILE={*,’file_name’,file_handle} [MODE={REPLACE, ADDVARIABLES}] /PRESORTED /DOCUMENT /MISSING=COLUMNWISE /BREAK=var_list /dest_var[’label’]…=agr_func(src_vars, args…)… AGGREGATE summarizes groups of cases into single cases. Cases are divided into groups that have the same values for one or more variables called break variables. Several functions are available for summarizing case contents. The OUTFILE subcommand is required and must appear first. Specify a system file or portable file by file name or file handle (see File Handles), or a dataset by its name (see Datasets). The aggregated cases are written to this file. If ‘*’ is specified, then the aggregated cases replace the active dataset’s data. Use of OUTFILE to write a portable file is a PSPP extension. If OUTFILE=* is given, then the subcommand MODE may also be specified. The mode subcommand has two possible values: ADDVARIABLES or REPLACE. In REPLACE mode, the entire active dataset is replaced by a new dataset which contains just the break variables and the destination varibles. In this mode, the new file will contain as many cases as there are unique combinations of the break variables. In ADDVARIABLES mode, the destination variables will be appended to the existing active dataset. Cases which have identical combinations of values in their break variables, will receive identical values for the destination variables. The number of cases in the active dataset will remain unchanged. Note that if ADDVARIABLES is specified, then the data must be sorted on the break variables. By default, the active dataset will be sorted based on the break variables before aggregation takes place. If the active dataset is already sorted or otherwise grouped in terms of the break variables, specify PRESORTED to save time. PRESORTED is assumed if MODE=ADDVARIABLES is used. Specify DOCUMENT to copy the documents from the active dataset into the aggregate file (see DOCUMENT). Otherwise, the aggregate file will not contain any documents, even if the aggregate file replaces the active dataset. Normally, only a single case (for SD and SD., two cases) need be non-missing in each group for the aggregate variable to be non-missing. Specifying /MISSING=COLUMNWISE inverts this behavior, so that the aggregate variable becomes missing if any aggregated value is missing. If PRESORTED, DOCUMENT, or MISSING are specified, they must appear between OUTFILE and BREAK. At least one break variable must be specified on BREAK, a required subcommand. The values of these variables are used to divide the active dataset into groups to be summarized. In addition, at least one dest_var must be specified. One or more sets of aggregation variables must be specified. Each set comprises a list of aggregation variables, an equals sign (‘=’), the name of an aggregation function (see the list below), and a list of source variables in parentheses. Some aggregation functions expect additional arguments following the source variable names. Aggregation variables typically are created with no variable label, value labels, or missing values. Their default print and write formats depend on the aggregation function used, with details given in the table below. A variable label for an aggregation variable may be specified just after the variable’s name in the aggregation variable list. Each set must have exactly as many source variables as aggregation variables. Each aggregation variable receives the results of applying the specified aggregation function to the corresponding source variable. The MEAN, MEDIAN, SD, and SUM aggregation functions may only be applied to numeric variables. All the rest may be applied to numeric and string variables. The available aggregation functions are as follows: FGT(var_name, value) Fraction of values greater than the specified constant. The default format is F5.3. FIN(var_name, low, high) Fraction of values within the specified inclusive range of constants. The default format is F5.3. FLT(var_name, value) Fraction of values less than the specified constant. The default format is F5.3. FIRST(var_name) First non-missing value in break group. The aggregation variable receives the complete dictionary information from the source variable. The sort performed by AGGREGATE (and by SORT CASES) is stable, so that the first case with particular values for the break variables before sorting will also be the first case in that break group after sorting. FOUT(var_name, low, high) Fraction of values strictly outside the specified range of constants. The default format is F5.3. LAST(var_name) Last non-missing value in break group. The aggregation variable receives the complete dictionary information from the source variable. The sort performed by AGGREGATE (and by SORT CASES) is stable, so that the last case with particular values for the break variables before sorting will also be the last case in that break group after sorting. MAX(var_name) Maximum value. The aggregation variable receives the complete dictionary information from the source variable. MEAN(var_name) Arithmetic mean. Limited to numeric values. The default format is F8.2. MEDIAN(var_name) The median value. Limited to numeric values. The default format is F8.2. MIN(var_name) Minimum value. The aggregation variable receives the complete dictionary information from the source variable. N(var_name) Number of non-missing values. The default format is F7.0 if weighting is not enabled, F8.2 if it is (see WEIGHT). N Number of cases aggregated to form this group. The default format is F7.0 if weighting is not enabled, F8.2 if it is (see WEIGHT). NMISS(var_name) Number of missing values. The default format is F7.0 if weighting is not enabled, F8.2 if it is (see WEIGHT). NU(var_name) Number of non-missing values. Each case is considered to have a weight of 1, regardless of the current weighting variable (see WEIGHT). The default format is F7.0. NU Number of cases aggregated to form this group. Each case is considered to have a weight of 1, regardless of the current weighting variable. The default format is F7.0. NUMISS(var_name) Number of missing values. Each case is considered to have a weight of 1, regardless of the current weighting variable. The default format is F7.0. PGT(var_name, value) Percentage between 0 and 100 of values greater than the specified constant. The default format is F5.1. PIN(var_name, low, high) Percentage of values within the specified inclusive range of constants. The default format is F5.1. PLT(var_name, value) Percentage of values less than the specified constant. The default format is F5.1. POUT(var_name, low, high) Percentage of values strictly outside the specified range of constants. The default format is F5.1. SD(var_name) Standard deviation of the mean. Limited to numeric values. The default format is F8.2. SUM(var_name) Sum. Limited to numeric values. The default format is F8.2. Aggregation functions compare string values in terms of internal character codes. On most modern computers, this is ASCII or a superset thereof. The aggregation functions listed above exclude all user-missing values from calculations. To include user-missing values, insert a period (‘.’) at the end of the function name. (e.g. ‘SUM.’). (Be aware that specifying such a function as the last token on a line will cause the period to be interpreted as the end of the command.) AGGREGATE both ignores and cancels the current SPLIT FILE settings (see SPLIT FILE). AUTORECODE AUTORECODE AUTORECODE VARIABLES=src_vars INTO dest_vars [ /DESCENDING ] [ /PRINT ] [ /GROUP ] [ /BLANK = {VALID, MISSING} ] The AUTORECODE procedure considers the n values that a variable takes on and maps them onto values 1…n on a new numeric variable. Subcommand VARIABLES is the only required subcommand and must come first. Specify VARIABLES, an equals sign (‘=’), a list of source variables, INTO, and a list of target variables. There must the same number of source and target variables. The target variables must not already exist. AUTORECODE ordinarily assigns each increasing non-missing value of a source variable (for a string, this is based on character code comparisons) to consecutive values of its target variable. For example, the smallest non-missing value of the source variable is recoded to value 1, the next smallest to 2, and so on. If the source variable has user-missing values, they are recoded to consecutive values just above the non-missing values. For example, if a source variables has seven distinct non-missing values, then the smallest missing value would be recoded to 8, the next smallest to 9, and so on. Use DESCENDING to reverse the sort order for non-missing values, so that the largest non-missing value is recoded to 1, the second-largest to 2, and so on. Even with DESCENDING, user-missing values are still recoded in ascending order just above the non-missing values. The system-missing value is always recoded into the system-missing variable in target variables. If a source value has a value label, then that value label is retained for the new value in the target variable. Otherwise, the source value itself becomes each new value’s label. Variable labels are copied from the source to target variables. PRINT is currently ignored. The GROUP subcommand is relevant only if more than one variable is to be recoded. It causes a single mapping between source and target values to be used, instead of one map per variable. With GROUP, user-missing values are taken from the first source variable that has any user-missing values. If /BLANK=MISSING is given, then string variables which contain only whitespace are recoded as SYSMIS. If /BLANK=VALID is given then they will be allocated a value like any other. /BLANK is not relevant to numeric values. /BLANK=VALID is the default. AUTORECODE is a procedure. It causes the data to be read. COMPUTE COMPUTE COMPUTE variable = expression. or COMPUTE vector(index) = expression. COMPUTE assigns the value of an expression to a target variable. For each case, the expression is evaluated and its value assigned to the target variable. Numeric and string variables may be assigned. When a string expression’s width differs from the target variable’s width, the string result of the expression is truncated or padded with spaces on the right as necessary. The expression and variable types must match. For numeric variables only, the target variable need not already exist. Numeric variables created by COMPUTE are assigned an F8.2 output format. String variables must be declared before they can be used as targets for COMPUTE. The target variable may be specified as an element of a vector (see VECTOR). In this case, an expression index must be specified in parentheses following the vector name. The expression index must evaluate to a numeric value that, after rounding down to the nearest integer, is a valid index for the named vector. Using COMPUTE to assign to a variable specified on LEAVE (see LEAVE) resets the variable’s left state. Therefore, LEAVE should be specified following COMPUTE, not before. COMPUTE is a transformation. It does not cause the active dataset to be read. When COMPUTE is specified following TEMPORARY (see TEMPORARY), the LAG function may not be used (see LAG). COUNT COUNT COUNT var_name = var… (value…) [/var_name = var… (value…)]… Each value takes one of the following forms: number string num1 THRU num2 MISSING SYSMIS where num1 is a numeric expression or the words LO or LOWEST and num2 is a numeric expression or HI or HIGHEST. COUNT creates or replaces a numeric target variable that counts the occurrence of a criterion value or set of values over one or more test variables for each case. The target variable values are always nonnegative integers. They are never missing. The target variable is assigned an F8.2 output format. See Input and Output Formats. Any variables, including string variables, may be test variables. User-missing values of test variables are treated just like any other values. They are not treated as system-missing values. User-missing values that are criterion values or inside ranges of criterion values are counted as any other values. However (for numeric variables), keyword MISSING may be used to refer to all system- and user-missing values. COUNT target variables are assigned values in the order specified. In the command COUNT A=A B(1) /B=A B(2)., the following actions occur: − The number of occurrences of 1 between A and B is counted. A is assigned this value. − The number of occurrences of 1 between B and the new value of A is counted. B is assigned this value. Despite this ordering, all COUNT criterion variables must exist before the procedure is executed—they may not be created as target variables earlier in the command! Break such a command into two separate commands. The examples below may help to clarify. Assuming Q0, Q2, …, Q9 are numeric variables, the following commands: Count the number of times the value 1 occurs through these variables for each case and assigns the count to variable QCOUNT. Print out the total number of times the value 1 occurs throughout all cases using DESCRIPTIVES. See DESCRIPTIVES, for details. COUNT QCOUNT=Q0 TO Q9(1). DESCRIPTIVES QCOUNT /STATISTICS=SUM. Given these same variables, the following commands: Count the number of valid values of these variables for each case and assigns the count to variable QVALID. Multiplies each value of QVALID by 10 to obtain a percentage of valid values, using COMPUTE. See COMPUTE, for details. Print out the percentage of valid values across all cases, using DESCRIPTIVES. See DESCRIPTIVES, for details. COUNT QVALID=Q0 TO Q9 (LO THRU HI). COMPUTE QVALID=QVALID*10. DESCRIPTIVES QVALID /STATISTICS=MEAN. FLIP FLIP FLIP /VARIABLES=var_list /NEWNAMES=var_name. FLIP transposes rows and columns in the active dataset. It causes cases to be swapped with variables, and vice versa. All variables in the transposed active dataset are numeric. String variables take on the system-missing value in the transposed file. N subcommands are required. If specified, the VARIABLES subcommand selects variables to be transformed into cases, and variables not specified are discarded. If the VARIABLES subcommand is omitted, all variables are selected for transposition. The variables specified by NEWNAMES, which must be a string variable, is used to give names to the variables created by FLIP. Only the first 8 characters of the variable are used. If NEWNAMES is not specified then the default is a variable named CASE_LBL, if it exists. If it does not then the variables created by FLIP are named VAR000 through VAR999, then VAR1000, VAR1001, and so on. When a NEWNAMES variable is available, the names must be canonicalized before becoming variable names. Invalid characters are replaced by letter ‘V’ in the first position, or by ‘_’ in subsequent positions. If the name thus generated is not unique, then numeric extensions are added, starting with 1, until a unique name is found or there are no remaining possibilities. If the latter occurs then the FLIP operation aborts. The resultant dictionary contains a CASE_LBL variable, a string variable of width 8, which stores the names of the variables in the dictionary before the transposition. Variables names longer than 8 characters are truncated. If the active dataset is subsequently transposed using FLIP, this variable can be used to recreate the original variable names. FLIP honors N OF CASES (see N OF CASES). It ignores TEMPORARY (see TEMPORARY), so that “temporary” transformations become permanent. IF IF IF condition variable=expression. or IF condition vector(index)=expression. The IF transformation conditionally assigns the value of a target expression to a target variable, based on the truth of a test expression. Specify a boolean-valued expression (see Expressions) to be tested following the IF keyword. This expression is evaluated for each case. If the value is true, then the value of the expression is computed and assigned to the specified variable. If the value is false or missing, nothing is done. Numeric and string variables may be assigned. When a string expression’s width differs from the target variable’s width, the string result of the expression is truncated or padded with spaces on the right as necessary. The expression and variable types must match. The target variable may be specified as an element of a vector (see VECTOR). In this case, a vector index expression must be specified in parentheses following the vector name. The index expression must evaluate to a numeric value that, after rounding down to the nearest integer, is a valid index for the named vector. Using IF to assign to a variable specified on LEAVE (see LEAVE) resets the variable’s left state. Therefore, LEAVE should be specified following IF, not before. When IF is specified following TEMPORARY (see TEMPORARY), the LAG function may not be used (see LAG). RECODE RECODE The RECODE command is used to transform existing values into other, user specified values. The general form is: RECODE src_vars (src_value src_value … = dest_value) (src_value src_value … = dest_value) (src_value src_value … = dest_value) … [INTO dest_vars]. Following the RECODE keyword itself comes src_vars which is a list of variables whose values are to be transformed. These variables may be string variables or they may be numeric. However the list must be homogeneous; you may not mix string variables and numeric variables in the same recoding. After the list of source variables, there should be one or more mappings. Each mapping is enclosed in parentheses, and contains the source values and a destination value separated by a single ‘=’. The source values are used to specify the values in the dataset which need to change, and the destination value specifies the new value to which they should be changed. Each src_value may take one of the following forms: number If the source variables are numeric then src_value may be a literal number. string If the source variables are string variables then src_value may be a literal string (like all strings, enclosed in single or double quotes). num1 THRU num2 This form is valid only when the source variables are numeric. It specifies all values in the range between num1 and num2, including both endpoints of the range. By convention, num1 should be less than num2. Open-ended ranges may be specified using ‘LO’ or ‘LOWEST’ for num1 or ‘HI’ or ‘HIGHEST’ for num2. MISSINGThe literal keyword ‘MISSING’ matches both system missing and user missing values. It is valid for both numeric and string variables. SYSMISThe literal keyword ‘SYSMIS’ matches system missing values. It is valid for both numeric variables only. ELSEThe ‘ELSE’ keyword may be used to match any values which are not matched by any other src_value appearing in the command. If this keyword appears, it should be used in the last mapping of the command. After the source variables comes an ‘=’ and then the dest_value. The dest_value may take any of the following forms: number A literal numeric value to which the source values should be changed. This implies the destination variable must be numeric. string A literal string value (enclosed in quotation marks) to which the source values should be changed. This implies the destination variable must be a string variable. SYSMISThe keyword ‘SYSMIS’ changes the value to the system missing value. This implies the destination variable must be numeric. COPYThe special keyword ‘COPY’ means that the source value should not be modified, but copied directly to the destination value. This is meaningful only if ‘INTO dest_vars’ is specified. Mappings are considered from left to right. Therefore, if a value is matched by a src_value from more than one mapping, the first (leftmost) mapping which matches will be considered. Any subsequent matches will be ignored. The clause ‘INTO dest_vars’ is optional. The behaviour of the command is slightly different depending on whether it appears or not. If ‘INTO dest_vars’ does not appear, then values will be recoded “in place”. This means that the recoded values are written back to the source variables from whence the original values came. In this case, the dest_value for every mapping must imply a value which has the same type as the src_value. For example, if the source value is a string value, it is not permissible for dest_value to be ‘SYSMIS’ or another forms which implies a numeric result. It is also not permissible for dest_value to be longer than the width of the source variable. The following example two numeric variables x and y are recoded in place. Zero is recoded to 99, the values 1 to 10 inclusive are unchanged, values 1000 and higher are recoded to the system-missing value and all other values are changed to 999: recode x y (0 = 99) (1 THRU 10 = COPY) (1000 THRU HIGHEST = SYSMIS) (ELSE = 999). If ‘INTO dest_vars’ is given, then recoded values are written into the variables specified in dest_vars, which must therefore contain a list of valid variable names. The number of variables in dest_vars must be the same as the number of variables in src_vars and the respective order of the variables in dest_vars corresponds to the order of src_vars. That is to say, recoded values whose original value came from the nth variable in src_vars will be placed into the nth variable in dest_vars. The source variables will be unchanged. If any mapping implies a string as its destination value, then the respective destination variable must already exist, or have been declared using STRING or another transformation. Numeric variables however will be automatically created if they don’t already exist. The following example deals with two source variables, a and b which contain string values. Hence there are two destination variables v1 and v2. Any cases where a or b contain the values ‘apple’, ‘pear’ or ‘pomegranate’ will result in v1 or v2 being filled with the string ‘fruit’ whilst cases with ‘tomato’, ‘lettuce’ or ‘carrot’ will result in ‘vegetable’. Any other values will produce the result ‘unknown’: string v1 (a20). string v2 (a20). recode a b ("apple" "pear" "pomegranate" = "fruit") ("tomato" "lettuce" "carrot" = "vegetable") (ELSE = "unknown") into v1 v2. There is one very special mapping, not mentioned above. If the source variable is a string variable then a mapping may be specified as ‘(CONVERT)’. This mapping, if it appears must be the last mapping given and the ‘INTO dest_vars’ clause must also be given and must not refer to a string variable. ‘CONVERT’ causes a number specified as a string to be converted to a numeric value. For example it will convert the string ‘"3"’ into the numeric value 3 (note that it will not convert ‘three’ into 3). If the string cannot be parsed as a number, then the system-missing value is assigned instead. In the following example, cases where the value of x (a string variable) is the empty string, are recoded to 999 and all others are converted to the numeric equivalent of the input value. The results are placed into the numeric variable y: recode x ("" = 999) (convert) into y. It is possible to specify multiple recodings on a single command. Introduce additional recodings with a slash (‘/’) to separate them from the previous recodings: recode a (2 = 22) (else = 99) /b (1 = 3) into z . Here we have two recodings. The first affects the source variable a and recodes in-place the value 2 into 22 and all other values to 99. The second recoding copies the values of b into the variable z, changing any instances of 1 into 3. SORT CASES SORT CASES SORT CASES BY var_list[({D|A}] [ var_list[({D|A}] ] ... SORT CASES sorts the active dataset by the values of one or more variables. Specify BY and a list of variables to sort by. By default, variables are sorted in ascending order. To override sort order, specify (D) or (DOWN) after a list of variables to get descending order, or (A) or (UP) for ascending order. These apply to all the listed variables up until the preceding (A), (D), (UP) or (DOWN). The sort algorithms used by SORT CASES are stable. That is, records that have equal values of the sort variables will have the same relative order before and after sorting. As a special case, re-sorting an already sorted file will not affect the ordering of cases. SORT CASES is a procedure. It causes the data to be read. SORT CASES attempts to sort the entire active dataset in main memory. If workspace is exhausted, it falls back to a merge sort algorithm that involves creates numerous temporary files. SORT CASES may not be specified following TEMPORARY. Selecting data for analysis This chapter documents PSPP commands that temporarily or permanently select data records from the active dataset for analysis. FILTER FILTER FILTER BY var_name. FILTER OFF. FILTER allows a boolean-valued variable to be used to select cases from the data stream for processing. To set up filtering, specify BY and a variable name. Keyword BY is optional but recommended. Cases which have a zero or system- or user-missing value are excluded from analysis, but not deleted from the data stream. Cases with other values are analyzed. To filter based on a different condition, use transformations such as COMPUTE or RECODE to compute a filter variable of the required form, then specify that variable on FILTER. FILTER OFF turns off case filtering. Filtering takes place immediately before cases pass to a procedure for analysis. Only one filter variable may be active at a time. Normally, case filtering continues until it is explicitly turned off with FILTER OFF. However, if FILTER is placed after TEMPORARY, it filters only the next procedure or procedure-like command. N OF CASES N OF CASES N [OF CASES] num_of_cases [ESTIMATED]. N OF CASES limits the number of cases processed by any procedures that follow it in the command stream. N OF CASES 100, for example, tells PSPP to disregard all cases after the first 100. When N OF CASES is specified after TEMPORARY, it affects only the next procedure (see TEMPORARY). Otherwise, cases beyond the limit specified are not processed by any later procedure. If the limit specified on N OF CASES is greater than the number of cases in the active dataset, it has no effect. When N OF CASES is used along with SAMPLE or SELECT IF, the case limit is applied to the cases obtained after sampling or case selection, regardless of how N OF CASES is placed relative to SAMPLE or SELECT IF in the command file. Thus, the commands N OF CASES 100 and SAMPLE .5 will both randomly sample approximately half of the active dataset’s cases, then select the first 100 of those sampled, regardless of their order in the command file. N OF CASES with the ESTIMATED keyword gives an estimated number of cases before DATA LIST or another command to read in data. ESTIMATED never limits the number of cases processed by procedures. PSPP currently does not make use of case count estimates. SAMPLE SAMPLE SAMPLE num1 [FROM num2]. SAMPLE randomly samples a proportion of the cases in the active file. Unless it follows TEMPORARY, it operates as a transformation, permanently removing cases from the active dataset. The proportion to sample can be expressed as a single number between 0 and 1. If k is the number specified, and N is the number of currently-selected cases in the active dataset, then after SAMPLE k., approximately k*N cases will be selected. The proportion to sample can also be specified in the style SAMPLE m FROM N. With this style, cases are selected as follows: If N is equal to the number of currently-selected cases in the active dataset, exactly m cases will be selected. If N is greater than the number of currently-selected cases in the active dataset, an equivalent proportion of cases will be selected. If N is less than the number of currently-selected cases in the active, exactly m cases will be selected from the first N cases in the active dataset. SAMPLE and SELECT IF are performed in the order specified by the syntax file. SAMPLE is always performed before N OF CASES, regardless of ordering in the syntax file (see N OF CASES). The same values for SAMPLE may result in different samples. To obtain the same sample, use the SET command to set the random number seed to the same value before each SAMPLE. Different samples may still result when the file is processed on systems with differing endianness or floating-point formats. By default, the random number seed is based on the system time. SELECT IF SELECT IF SELECT IF expression. SELECT IF selects cases for analysis based on the value of expression. Cases not selected are permanently eliminated from the active dataset, unless TEMPORARY is in effect (see TEMPORARY). Specify a boolean expression (see Expressions). If the value of the expression is true for a particular case, the case will be analyzed. If the expression has a false or missing value, then the case will be deleted from the data stream. Place SELECT IF as early in the command file as possible. Cases that are deleted early can be processed more efficiently in time and space. When SELECT IF is specified following TEMPORARY (see TEMPORARY), the LAG function may not be used (see LAG). SPLIT FILE SPLIT FILE SPLIT FILE [{LAYERED, SEPARATE}] BY var_list. SPLIT FILE OFF. SPLIT FILE allows multiple sets of data present in one data file to be analyzed separately using single statistical procedure commands. Specify a list of variable names to analyze multiple sets of data separately. Groups of adjacent cases having the same values for these variables are analyzed by statistical procedure commands as one group. An independent analysis is carried out for each group of cases, and the variable values for the group are printed along with the analysis. When a list of variable names is specified, one of the keywords LAYERED or SEPARATE may also be specified. If provided, either keyword are ignored. Groups are formed only by adjacent cases. To create a split using a variable where like values are not adjacent in the working file, you should first sort the data by that variable (see SORT CASES). Specify OFF to disable SPLIT FILE and resume analysis of the entire active dataset as a single group of data. When SPLIT FILE is specified after TEMPORARY, it affects only the next procedure (see TEMPORARY). TEMPORARY TEMPORARY TEMPORARY. TEMPORARY is used to make the effects of transformations following its execution temporary. These transformations will affect only the execution of the next procedure or procedure-like command. Their effects will not be saved to the active dataset. The only specification on TEMPORARY is the command name. TEMPORARY may not appear within a DO IF or LOOP construct. It may appear only once between procedures and procedure-like commands. Scratch variables cannot be used following TEMPORARY. An example may help to clarify: DATA LIST /X 1-2. BEGIN DATA. 2 4 10 15 20 24 END DATA. COMPUTE X=X/2. TEMPORARY. COMPUTE X=X+3. DESCRIPTIVES X. DESCRIPTIVES X. The data read by the first DESCRIPTIVES are 4, 5, 8, 10.5, 13, 15. The data read by the first DESCRIPTIVES are 1, 2, 5, 7.5, 10, 12. WEIGHT WEIGHT WEIGHT BY var_name. WEIGHT OFF. WEIGHT assigns cases varying weights, changing the frequency distribution of the active dataset. Execution of WEIGHT is delayed until data have been read. If a variable name is specified, WEIGHT causes the values of that variable to be used as weighting factors for subsequent statistical procedures. Use of keyword BY is optional but recommended. Weighting variables must be numeric. Scratch variables may not be used for weighting (see Scratch Variables). When OFF is specified, subsequent statistical procedures will weight all cases equally. A positive integer weighting factor w on a case will yield the same statistical output as would replicating the case w times. A weighting factor of 0 is treated for statistical purposes as if the case did not exist in the input. Weighting values need not be integers, but negative and system-missing values for the weighting variable are interpreted as weighting factors of 0. User-missing values are not treated specially. When WEIGHT is specified after TEMPORARY, it affects only the next procedure (see TEMPORARY). WEIGHT does not cause cases in the active dataset to be replicated in memory. Conditional and Looping Constructs conditionals loops flow of control control flow This chapter documents PSPP commands used for conditional execution, looping, and flow of control. BREAK BREAK BREAK. BREAK terminates execution of the innermost currently executing LOOP construct. BREAK is allowed only inside LOOPEND LOOP. See LOOP, for more details. DO IF DO IF DO IF condition. … [ELSE IF condition. … ]… [ELSE. …] END IF. DO IF allows one of several sets of transformations to be executed, depending on user-specified conditions. If the specified boolean expression evaluates as true, then the block of code following DO IF is executed. If it evaluates as missing, then none of the code blocks is executed. If it is false, then the boolean expression on the first ELSE IF, if present, is tested in turn, with the same rules applied. If all expressions evaluate to false, then the ELSE code block is executed, if it is present. When DO IF or ELSE IF is specified following TEMPORARY (see TEMPORARY), the LAG function may not be used (see LAG). DO REPEAT DO REPEAT DO REPEAT dummy_name=expansion…. … END REPEAT [PRINT]. expansion takes one of the following forms: var_list num_or_range… ’string’… ALL num_or_range takes one of the following forms: number num1 TO num2 DO REPEAT repeats a block of code, textually substituting different variables, numbers, or strings into the block with each repetition. Specify a dummy variable name followed by an equals sign (‘=’) and the list of replacements. Replacements can be a list of existing or new variables, numbers, strings, or ALL to specify all existing variables. When numbers are specified, runs of increasing integers may be indicated as num1 TO num2, so that ‘1 TO 5’ is short for ‘1 2 3 4 5’. Multiple dummy variables can be specified. Each variable must have the same number of replacements. The code within DO REPEAT is repeated as many times as there are replacements for each variable. The first time, the first value for each dummy variable is substituted; the second time, the second value for each dummy variable is substituted; and so on. Dummy variable substitutions work like macros. They take place anywhere in a line that the dummy variable name occurs. This includes command and subcommand names, so command and subcommand names that appear in the code block should not be used as dummy variable identifiers. Dummy variable substitutions do not occur inside quoted strings, comments, unquoted strings (such as the text on the TITLE or DOCUMENT command), or inside BEGIN DATAEND DATA. Substitution occurs only on whole words, so that, for example, a dummy variable PRINT would not be substituted into the word PRINTOUT. New variable names used as replacements are not automatically created as variables, but only if used in the code block in a context that would create them, e.g. on a NUMERIC or STRING command or on the left side of a COMPUTE assignment. Any command may appear within DO REPEAT, including nested DO REPEAT commands. If INCLUDE or INSERT appears within DO REPEAT, the substitutions do not apply to the included file. If PRINT is specified on END REPEAT, the commands after substitutions are made should be printed to the listing file, prefixed by a plus sign (‘+’). This feature is not yet implemented. LOOP LOOP LOOP [index_var=start TO end [BY incr]] [IF condition]. … END LOOP [IF condition]. LOOP iterates a group of commands. A number of termination options are offered. Specify index_var to make that variable count from one value to another by a particular increment. index_var must be a pre-existing numeric variable. start, end, and incr are numeric expressions (see Expressions.) During the first iteration, index_var is set to the value of start. During each successive iteration, index_var is increased by the value of incr. If end > start, then the loop terminates when index_var > end; otherwise it terminates when index_var < end. If incr is not specified then it defaults to +1 or -1 as appropriate. If end > start and incr < 0, or if end < start and incr > 0, then the loop is never executed. index_var is nevertheless set to the value of start. Modifying index_var within the loop is allowed, but it has no effect on the value of index_var in the next iteration. Specify a boolean expression for the condition on LOOP to cause the loop to be executed only if the condition is true. If the condition is false or missing before the loop contents are executed the first time, the loop contents are not executed at all. If index and condition clauses are both present on LOOP, the index variable is always set before the condition is evaluated. Thus, a condition that makes use of the index variable will always see the index value to be used in the next execution of the body. Specify a boolean expression for the condition on END LOOP to cause the loop to terminate if the condition is true after the enclosed code block is executed. The condition is evaluated at the end of the loop, not at the beginning, so that the body of a loop with only a condition on END LOOP will always execute at least once. If the index clause is not present, then the loop is executed at most max_loops (see SET) times (but possibly fewer, if a condition clause evaluates to false or if BREAK executes). The default value of max_loops is 40. BREAK also terminates LOOP execution (see BREAK). Loop index variables are by default reset to system-missing from one case to another, not left, unless a scratch variable is used as index. When loops are nested, this is usually undesired behavior, which can be corrected with LEAVE (see LEAVE) or by using a scratch variable as the loop index. When LOOP or END LOOP is specified following TEMPORARY (see TEMPORARY), the LAG function may not be used (see LAG). Statistics This chapter documents the statistical procedures that PSPP supports so far. DESCRIPTIVES DESCRIPTIVES DESCRIPTIVES /VARIABLES=var_list /MISSING={VARIABLE,LISTWISE} {INCLUDE,NOINCLUDE} /FORMAT={LABELS,NOLABELS} {NOINDEX,INDEX} {LINE,SERIAL} /SAVE /STATISTICS={ALL,MEAN,SEMEAN,STDDEV,VARIANCE,KURTOSIS, SKEWNESS,RANGE,MINIMUM,MAXIMUM,SUM,DEFAULT, SESKEWNESS,SEKURTOSIS} /SORT={NONE,MEAN,SEMEAN,STDDEV,VARIANCE,KURTOSIS,SKEWNESS, RANGE,MINIMUM,MAXIMUM,SUM,SESKEWNESS,SEKURTOSIS,NAME} {A,D} The DESCRIPTIVES procedure reads the active dataset and outputs descriptive statistics requested by the user. In addition, it can optionally compute Z-scores. The VARIABLES subcommand, which is required, specifies the list of variables to be analyzed. Keyword VARIABLES is optional. All other subcommands are optional: The MISSING subcommand determines the handling of missing variables. If INCLUDE is set, then user-missing values are included in the calculations. If NOINCLUDE is set, which is the default, user-missing values are excluded. If VARIABLE is set, then missing values are excluded on a variable by variable basis; if LISTWISE is set, then the entire case is excluded whenever any value in that case has a system-missing or, if INCLUDE is set, user-missing value. The FORMAT subcommand has no effect. It is accepted for backward compatibility. The SAVE subcommand causes DESCRIPTIVES to calculate Z scores for all the specified variables. The Z scores are saved to new variables. Variable names are generated by trying first the original variable name with Z prepended and truncated to a maximum of 8 characters, then the names ZSC000 through ZSC999, STDZ00 through STDZ09, ZZZZ00 through ZZZZ09, ZQZQ00 through ZQZQ09, in that sequence. In addition, Z score variable names can be specified explicitly on VARIABLES in the variable list by enclosing them in parentheses after each variable. When Z scores are calculated, PSPP ignores TEMPORARY, treating temporary transformations as permanent. The STATISTICS subcommand specifies the statistics to be displayed: ALL All of the statistics below. MEAN Arithmetic mean. SEMEAN Standard error of the mean. STDDEV Standard deviation. VARIANCE Variance. KURTOSIS Kurtosis and standard error of the kurtosis. SKEWNESS Skewness and standard error of the skewness. RANGE Range. MINIMUM Minimum value. MAXIMUM Maximum value. SUM Sum. DEFAULT Mean, standard deviation of the mean, minimum, maximum. SEKURTOSIS Standard error of the kurtosis. SESKEWNESS Standard error of the skewness. The SORT subcommand specifies how the statistics should be sorted. Most of the possible values should be self-explanatory. NAME causes the statistics to be sorted by name. By default, the statistics are listed in the order that they are specified on the VARIABLES subcommand. The A and D settings request an ascending or descending sort order, respectively. FREQUENCIES FREQUENCIES FREQUENCIES /VARIABLES=var_list /FORMAT={TABLE,NOTABLE,LIMIT(limit)} {AVALUE,DVALUE,AFREQ,DFREQ} /MISSING={EXCLUDE,INCLUDE} /STATISTICS={DEFAULT,MEAN,SEMEAN,MEDIAN,MODE,STDDEV,VARIANCE, KURTOSIS,SKEWNESS,RANGE,MINIMUM,MAXIMUM,SUM, SESKEWNESS,SEKURTOSIS,ALL,NONE} /NTILES=ntiles /PERCENTILES=percent… /HISTOGRAM=[MINIMUM(x_min)] [MAXIMUM(x_max)] [{FREQ[(y_max)],PERCENT[(y_max)]}] [{NONORMAL,NORMAL}] /PIECHART=[MINIMUM(x_min)] [MAXIMUM(x_max)] [{FREQ,PERCENT}] [{NOMISSING,MISSING}] /BARCHART=[MINIMUM(x_min)] [MAXIMUM(x_max)] [{FREQ,PERCENT}] /ORDER={ANALYSIS,VARIABLE} (These options are not currently implemented.) /HBAR=… /GROUPED=… The FREQUENCIES procedure outputs frequency tables for specified variables. FREQUENCIES can also calculate and display descriptive statistics (including median and mode) and percentiles, and various graphical representations of the frequency distribution. The VARIABLES subcommand is the only required subcommand. Specify the variables to be analyzed. The FORMAT subcommand controls the output format. It has several possible settings: TABLE, the default, causes a frequency table to be output for every variable specified. NOTABLE prevents them from being output. LIMIT with a numeric argument causes them to be output except when there are more than the specified number of values in the table. Normally frequency tables are sorted in ascending order by value. This is AVALUE. DVALUE tables are sorted in descending order by value. AFREQ and DFREQ tables are sorted in ascending and descending order, respectively, by frequency count. The MISSING subcommand controls the handling of user-missing values. When EXCLUDE, the default, is set, user-missing values are not included in frequency tables or statistics. When INCLUDE is set, user-missing are included. System-missing values are never included in statistics, but are listed in frequency tables. The available STATISTICS are the same as available in DESCRIPTIVES (see DESCRIPTIVES), with the addition of MEDIAN, the data’s median value, and MODE, the mode. (If there are multiple modes, the smallest value is reported.) By default, the mean, standard deviation of the mean, minimum, and maximum are reported for each variable. percentiles PERCENTILES causes the specified percentiles to be reported. The percentiles should be presented at a list of numbers between 0 and 100 inclusive. The NTILES subcommand causes the percentiles to be reported at the boundaries of the data set divided into the specified number of ranges. For instance, /NTILES=4 would cause quartiles to be reported. histogram The HISTOGRAM subcommand causes the output to include a histogram for each specified numeric variable. The X axis by default ranges from the minimum to the maximum value observed in the data, but the MINIMUM and MAXIMUM keywords can set an explicit range. The number of bins is chosen according to the Freedman-Diaconis rule: 2 \times IQR(x)n^{-1/3}, where IQR(x) is the interquartile range of x and n is the number of samples. Note that EXAMINE uses a different algorithm to determine bin sizes. Histograms are not created for string variables. Specify NORMAL to superimpose a normal curve on the histogram. piechart The PIECHART subcommand adds a pie chart for each variable to the data. Each slice represents one value, with the size of the slice proportional to the value’s frequency. By default, all non-missing values are given slices. The MINIMUM and MAXIMUM keywords can be used to limit the displayed slices to a given range of values. The keyword NOMISSING causes missing values to be omitted from the piechart. This is the default. If instead, MISSING is specified, then a single slice will be included representing all system missing and user-missing cases. bar chart The BARCHART subcommand produces a bar chart for each variable. The MINIMUM and MAXIMUM keywords can be used to omit categories whose counts which lie outside the specified limits. The FREQ option (default) causes the ordinate to display the frequency of each category, whereas the PERCENT option will display relative percentages. The FREQ and PERCENT options on HISTOGRAM and PIECHART are accepted but not currently honoured. The ORDER subcommand is accepted but ignored. EXAMINE EXAMINE Exploratory data analysis normality, testing EXAMINE VARIABLES= var1 [var2] … [varN] [BY factor1 [BY subfactor1] [ factor2 [BY subfactor2]] … [ factor3 [BY subfactor3]] ] /STATISTICS={DESCRIPTIVES, EXTREME[(n)], ALL, NONE} /PLOT={BOXPLOT, NPPLOT, HISTOGRAM, SPREADLEVEL[(t)], ALL, NONE} /CINTERVAL p /COMPARE={GROUPS,VARIABLES} /ID=identity_variable /{TOTAL,NOTOTAL} /PERCENTILE=[percentiles]={HAVERAGE, WAVERAGE, ROUND, AEMPIRICAL, EMPIRICAL } /MISSING={LISTWISE, PAIRWISE} [{EXCLUDE, INCLUDE}] [{NOREPORT,REPORT}] The EXAMINE command is used to perform exploratory data analysis. In particular, it is useful for testing how closely a distribution follows a normal distribution, and for finding outliers and extreme values. The VARIABLES subcommand is mandatory. It specifies the dependent variables and optionally variables to use as factors for the analysis. Variables listed before the first BY keyword (if any) are the dependent variables. The dependent variables may optionally be followed by a list of factors which tell PSPP how to break down the analysis for each dependent variable. Following the dependent variables, factors may be specified. The factors (if desired) should be preceded by a single BY keyword. The format for each factor is factorvar [BY subfactorvar]. Each unique combination of the values of factorvar and subfactorvar divide the dataset into cells. Statistics will be calculated for each cell and for the entire dataset (unless NOTOTAL is given). The STATISTICS subcommand specifies which statistics to show. DESCRIPTIVES will produce a table showing some parametric and non-parametrics statistics. EXTREME produces a table showing the extremities of each cell. A number in parentheses, n determines how many upper and lower extremities to show. The default number is 5. The subcommands TOTAL and NOTOTAL are mutually exclusive. If TOTAL appears, then statistics will be produced for the entire dataset as well as for each cell. If NOTOTAL appears, then statistics will be produced only for the cells (unless no factor variables have been given). These subcommands have no effect if there have been no factor variables specified. boxplot histogram npplot spreadlevel plot The PLOT subcommand specifies which plots are to be produced if any. Available plots are HISTOGRAM, NPPLOT, BOXPLOT and SPREADLEVEL. The first three can be used to visualise how closely each cell conforms to a normal distribution, whilst the spread vs. level plot can be useful to visualise how the variance of differs between factors. Boxplots will also show you the outliers and extreme values. HISTOGRAM uses Sturges’ rule to determine the number of bins, as approximately 1 + \log2(n), where n is the number of samples. Note that FREQUENCIES uses a different algorithm to find the bin size. The SPREADLEVEL plot displays the interquartile range versus the median. It takes an optional parameter t, which specifies how the data should be transformed prior to plotting. The given value t is a power to which the data is raised. For example, if t is given as 2, then the data will be squared. Zero, however is a special value. If t is 0 or is omitted, then data will be transformed by taking its natural logarithm instead of raising to the power of t. Shapiro-Wilk When one or more plots are requested, EXAMINE also performs the Shapiro-Wilk test for each category. There are however a number of provisos: All weight values must be integer. The cumulative weight value must be in the range [3, 5000] The COMPARE subcommand is only relevant if producing boxplots, and it is only useful there is more than one dependent variable and at least one factor. If /COMPARE=GROUPS is specified, then one plot per dependent variable is produced, each of which contain boxplots for all the cells. If /COMPARE=VARIABLES is specified, then one plot per cell is produced, each containing one boxplot per dependent variable. If the /COMPARE subcommand is omitted, then PSPP behaves as if /COMPARE=GROUPS were given. The ID subcommand is relevant only if /PLOT=BOXPLOT or /STATISTICS=EXTREME has been given. If given, it should provide the name of a variable which is to be used to labels extreme values and outliers. Numeric or string variables are permissible. If the ID subcommand is not given, then the case number will be used for labelling. The CINTERVAL subcommand specifies the confidence interval to use in calculation of the descriptives command. The default is 95%. percentiles The PERCENTILES subcommand specifies which percentiles are to be calculated, and which algorithm to use for calculating them. The default is to calculate the 5, 10, 25, 50, 75, 90, 95 percentiles using the HAVERAGE algorithm. The TOTAL and NOTOTAL subcommands are mutually exclusive. If NOTOTAL is given and factors have been specified in the VARIABLES subcommand, then statistics for the unfactored dependent variables are produced in addition to the factored variables. If there are no factors specified then TOTAL and NOTOTAL have no effect. The following example will generate descriptive statistics and histograms for two variables score1 and score2. Two factors are given, viz: gender and gender BY culture. Therefore, the descriptives and histograms will be generated for each distinct value of gender and for each distinct combination of the values of gender and race. Since the NOTOTAL keyword is given, statistics and histograms for score1 and score2 covering the whole dataset are not produced. EXAMINE score1 score2 BY gender gender BY culture /STATISTICS = DESCRIPTIVES /PLOT = HISTOGRAM /NOTOTAL. Here is a second example showing how the examine command can be used to find extremities. EXAMINE height weight BY gender /STATISTICS = EXTREME (3) /PLOT = BOXPLOT /COMPARE = GROUPS /ID = name. In this example, we look at the height and weight of a sample of individuals and how they differ between male and female. A table showing the 3 largest and the 3 smallest values of height and weight for each gender, and for the whole dataset will be shown. Boxplots will also be produced. Because /COMPARE = GROUPS was given, boxplots for male and female will be shown in the same graphic, allowing us to easily see the difference between the genders. Since the variable name was specified on the ID subcommand, this will be used to label the extreme values. Warning! If many dependent variables are specified, or if factor variables are specified for which there are many distinct values, then EXAMINE will produce a very large quantity of output. GRAPH GRAPH Exploratory data analysis normality, testing GRAPH /HISTOGRAM [(NORMAL)]= var /SCATTERPLOT [(BIVARIATE)] = var1 WITH var2 [BY var3] /BAR = {summary-function(var1) | count-function} BY var2 [BY var3] [ /MISSING={LISTWISE, VARIABLE} [{EXCLUDE, INCLUDE}] ] [{NOREPORT,REPORT}] The GRAPH produces graphical plots of data. Only one of the subcommands HISTOGRAM or SCATTERPLOT can be specified, i.e. only one plot can be produced per call of GRAPH. The MISSING is optional. Scatterplot scatterplot The subcommand SCATTERPLOT produces an xy plot of the data. The different values of the optional third variable var3 will result in different colours and/or markers for the plot. The following is an example for producing a scatterplot. GRAPH /SCATTERPLOT = height WITH weight BY gender. This example will produce a scatterplot where height is plotted versus weight. Depending on the value of the gender variable, the colour of the datapoint is different. With this plot it is possible to analyze gender differences for height vs. weight relation. Histogram histogram The subcommand HISTOGRAM produces a histogram. Only one variable is allowed for the histogram plot. The keyword NORMAL may be specified in parentheses, to indicate that the ideal normal curve should be superimposed over the histogram. For an alternative method to produce histograms see EXAMINE. The following example produces a histogram plot for the variable weight. GRAPH /HISTOGRAM = weight. Bar Chart bar chart The subcommand BAR produces a bar chart. This subcommand requires that a count-function be specified (with no arguments) or a summary-function with a variable var1 in parentheses. Following the summary or count function, the keyword BY should be specified and then a catagorical variable, var2. The values of the variable var2 determine the labels of the bars to be plotted. Optionally a second categorical variable var3 may be specified in which case a clustered (grouped) bar chart is produced. Valid count functions are COUNT The weighted counts of the cases in each category. PCT The weighted counts of the cases in each category expressed as a percentage of the total weights of the cases. CUFREQ The cumulative weighted counts of the cases in each category. CUPCT The cumulative weighted counts of the cases in each category expressed as a percentage of the total weights of the cases. The summary function is applied to var1 across all cases in each category. The recognised summary functions are: SUM The sum. MEAN The arithmetic mean. MAXIMUM The maximum value. MINIMUM The minimum value. The following examples assume a dataset which is the results of a survey. Each respondent has indicated annual income, their sex and city of residence. One could create a bar chart showing how the mean income varies between of residents of different cities, thus: GRAPH /BAR = MEAN(income) BY city. This can be extended to also indicate how income in each city differs between the sexes. GRAPH /BAR = MEAN(income) BY city BY sex. One might also want to see how many respondents there are from each city. This can be achieved as follows: GRAPH /BAR = COUNT BY city. Bar charts can also be produced using the FREQUENCIES and CROSSTABS commands. CORRELATIONS CORRELATIONS CORRELATIONS /VARIABLES = var_list [ WITH var_list ] [ . . . /VARIABLES = var_list [ WITH var_list ] /VARIABLES = var_list [ WITH var_list ] ] [ /PRINT={TWOTAIL, ONETAIL} {SIG, NOSIG} ] [ /STATISTICS=DESCRIPTIVES XPROD ALL] [ /MISSING={PAIRWISE, LISTWISE} {INCLUDE, EXCLUDE} ] correlation The CORRELATIONS procedure produces tables of the Pearson correlation coefficient for a set of variables. The significance of the coefficients are also given. At least one VARIABLES subcommand is required. If the WITH keyword is used, then a non-square correlation table will be produced. The variables preceding WITH, will be used as the rows of the table, and the variables following will be the columns of the table. If no WITH subcommand is given, then a square, symmetrical table using all variables is produced. The MISSING subcommand determines the handling of missing variables. If INCLUDE is set, then user-missing values are included in the calculations, but system-missing values are not. If EXCLUDE is set, which is the default, user-missing values are excluded as well as system-missing values. If LISTWISE is set, then the entire case is excluded from analysis whenever any variable specified in any /VARIABLES subcommand contains a missing value. If PAIRWISE is set, then a case is considered missing only if either of the values for the particular coefficient are missing. The default is PAIRWISE. The PRINT subcommand is used to control how the reported significance values are printed. If the TWOTAIL option is used, then a two-tailed test of significance is printed. If the ONETAIL option is given, then a one-tailed test is used. The default is TWOTAIL. If the NOSIG option is specified, then correlation coefficients with significance less than 0.05 are highlighted. If SIG is specified, then no highlighting is performed. This is the default. covariance The STATISTICS subcommand requests additional statistics to be displayed. The keyword DESCRIPTIVES requests that the mean, number of non-missing cases, and the non-biased estimator of the standard deviation are displayed. These statistics will be displayed in a separated table, for all the variables listed in any /VARIABLES subcommand. The XPROD keyword requests cross-product deviations and covariance estimators to be displayed for each pair of variables. The keyword ALL is the union of DESCRIPTIVES and XPROD. CROSSTABS CROSSTABS CROSSTABS /TABLES=var_list BY var_list [BY var_list]… /MISSING={TABLE,INCLUDE,REPORT} /WRITE={NONE,CELLS,ALL} /FORMAT={TABLES,NOTABLES} {PIVOT,NOPIVOT} {AVALUE,DVALUE} {NOINDEX,INDEX} {BOX,NOBOX} /CELLS={COUNT,ROW,COLUMN,TOTAL,EXPECTED,RESIDUAL,SRESIDUAL, ASRESIDUAL,ALL,NONE} /COUNT={ASIS,CASE,CELL} {ROUND,TRUNCATE} /STATISTICS={CHISQ,PHI,CC,LAMBDA,UC,BTAU,CTAU,RISK,GAMMA,D, KAPPA,ETA,CORR,ALL,NONE} /BARCHART (Integer mode.) /VARIABLES=var_list (low,high)… The CROSSTABS procedure displays crosstabulation tables requested by the user. It can calculate several statistics for each cell in the crosstabulation tables. In addition, a number of statistics can be calculated for each table itself. The TABLES subcommand is used to specify the tables to be reported. Any number of dimensions is permitted, and any number of variables per dimension is allowed. The TABLES subcommand may be repeated as many times as needed. This is the only required subcommand in general mode. Occasionally, one may want to invoke a special mode called integer mode. Normally, in general mode, PSPP automatically determines what values occur in the data. In integer mode, the user specifies the range of values that the data assumes. To invoke this mode, specify the VARIABLES subcommand, giving a range of data values in parentheses for each variable to be used on the TABLES subcommand. Data values inside the range are truncated to the nearest integer, then assigned to that value. If values occur outside this range, they are discarded. When it is present, the VARIABLES subcommand must precede the TABLES subcommand. In general mode, numeric and string variables may be specified on TABLES. In integer mode, only numeric variables are allowed. The MISSING subcommand determines the handling of user-missing values. When set to TABLE, the default, missing values are dropped on a table by table basis. When set to INCLUDE, user-missing values are included in tables and statistics. When set to REPORT, which is allowed only in integer mode, user-missing values are included in tables but marked with a footnote and excluded from statistical calculations. Currently the WRITE subcommand is ignored. The FORMAT subcommand controls the characteristics of the crosstabulation tables to be displayed. It has a number of possible settings: TABLES, the default, causes crosstabulation tables to be output. NOTABLES suppresses them. PIVOT, the default, causes each TABLES subcommand to be displayed in a pivot table format. NOPIVOT causes the old-style crosstabulation format to be used. AVALUE, the default, causes values to be sorted in ascending order. DVALUE asserts a descending sort order. INDEX and NOINDEX are currently ignored. BOX and NOBOX is currently ignored. The CELLS subcommand controls the contents of each cell in the displayed crosstabulation table. The possible settings are: COUNT Frequency count. ROW Row percent. COLUMN Column percent. TOTAL Table percent. EXPECTED Expected value. RESIDUAL Residual. SRESIDUAL Standardized residual. ASRESIDUAL Adjusted standardized residual. ALL All of the above. NONE Suppress cells entirely. /CELLS’ without any settings specified requests COUNT, ROW, COLUMN, and TOTAL. If CELLS is not specified at all then only COUNT will be selected. By default, crosstabulation and statistics use raw case weights, without rounding. Use the /COUNT subcommand to perform rounding: CASE rounds the weights of individual weights as cases are read, CELL rounds the weights of cells within each crosstabulation table after it has been constructed, and ASIS explicitly specifies the default non-rounding behavior. When rounding is requested, ROUND, the default, rounds to the nearest integer and TRUNCATE rounds toward zero. The STATISTICS subcommand selects statistics for computation: CHISQ chisquare chi-square Pearson chi-square, likelihood ratio, Fisher’s exact test, continuity correction, linear-by-linear association. PHI Phi. CC Contingency coefficient. LAMBDA Lambda. UC Uncertainty coefficient. BTAU Tau-b. CTAU Tau-c. RISK Risk estimate. GAMMA Gamma. D Somers’ D. KAPPA Cohen’s Kappa. ETA Eta. CORR Spearman correlation, Pearson’s r. ALL All of the above. NONE No statistics. Selected statistics are only calculated when appropriate for the statistic. Certain statistics require tables of a particular size, and some statistics are calculated only in integer mode. /STATISTICS’ without any settings selects CHISQ. If the STATISTICS subcommand is not given, no statistics are calculated. bar chart The ‘/BARCHART’ subcommand produces a clustered bar chart for the first two variables on each table. If a table has more than two variables, the counts for the third and subsequent levels will be aggregated and the chart will be produces as if there were only two variables. Please note: Currently the implementation of CROSSTABS has the following limitations: Significance of some symmetric and directional measures is not calculated. Asymptotic standard error is not calculated for Goodman and Kruskal’s tau or symmetric Somers’ d. Approximate T is not calculated for symmetric uncertainty coefficient. Fixes for any of these deficiencies would be welcomed. FACTOR FACTOR factor analysis principal components analysis principal axis factoring data reduction FACTOR { VARIABLES=var_list, MATRIX IN ({CORR,COV}={*,file_spec}) } [ /METHOD = {CORRELATION, COVARIANCE} ] [ /ANALYSIS=var_list ] [ /EXTRACTION={PC, PAF}] [ /ROTATION={VARIMAX, EQUAMAX, QUARTIMAX, PROMAX[(k)], NOROTATE}] [ /PRINT=[INITIAL] [EXTRACTION] [ROTATION] [UNIVARIATE] [CORRELATION] [COVARIANCE] [DET] [KMO] [AIC] [SIG] [ALL] [DEFAULT] ] [ /PLOT=[EIGEN] ] [ /FORMAT=[SORT] [BLANK(n)] [DEFAULT] ] [ /CRITERIA=[FACTORS(n)] [MINEIGEN(l)] [ITERATE(m)] [ECONVERGE (delta)] [DEFAULT] ] [ /MISSING=[{LISTWISE, PAIRWISE}] [{INCLUDE, EXCLUDE}] ] The FACTOR command performs Factor Analysis or Principal Axis Factoring on a dataset. It may be used to find common factors in the data or for data reduction purposes. The VARIABLES subcommand is required (unless the MATRIX IN subcommand is used). It lists the variables which are to partake in the analysis. (The ANALYSIS subcommand may optionally further limit the variables that participate; it is useful primarily in conjunction with MATRIX IN.) If MATRIX IN instead of VARIABLES is specified, then the analysis is performed on a pre-prepared correlation or covariance matrix file instead of on individual data cases. Typically the matrix file will have been generated by MATRIX DATA (see MATRIX DATA) or provided by a third party. If specified, MATRIX IN must be followed by ‘COV’ or ‘CORR’, then by ‘=’ and file_spec all in parentheses. file_spec may either be an asterisk, which indicates the currently loaded dataset, or it may be a filename to be loaded. See MATRIX DATA, for the expected format of the file. The /EXTRACTION subcommand is used to specify the way in which factors (components) are extracted from the data. If PC is specified, then Principal Components Analysis is used. If PAF is specified, then Principal Axis Factoring is used. By default Principal Components Analysis will be used. The /ROTATION subcommand is used to specify the method by which the extracted solution will be rotated. Three orthogonal rotation methods are available: VARIMAX (which is the default), EQUAMAX, and QUARTIMAX. There is one oblique rotation method, viz: PROMAX. Optionally you may enter the power of the promax rotation k, which must be enclosed in parentheses. The default value of k is 5. If you don’t want any rotation to be performed, the word NOROTATE will prevent the command from performing any rotation on the data. The /METHOD subcommand should be used to determine whether the covariance matrix or the correlation matrix of the data is to be analysed. By default, the correlation matrix is analysed. The /PRINT subcommand may be used to select which features of the analysis are reported: UNIVARIATE A table of mean values, standard deviations and total weights are printed. INITIAL Initial communalities and eigenvalues are printed. EXTRACTION Extracted communalities and eigenvalues are printed. ROTATION Rotated communalities and eigenvalues are printed. CORRELATION The correlation matrix is printed. COVARIANCE The covariance matrix is printed. DET The determinant of the correlation or covariance matrix is printed. AIC The anti-image covariance and anti-image correlation matrices are printed. KMO The Kaiser-Meyer-Olkin measure of sampling adequacy and the Bartlett test of sphericity is printed. SIG The significance of the elements of correlation matrix is printed. ALL All of the above are printed. DEFAULT Identical to INITIAL and EXTRACTION. If /PLOT=EIGEN is given, then a “Scree” plot of the eigenvalues will be printed. This can be useful for visualizing which factors (components) should be retained. The /FORMAT subcommand determined how data are to be displayed in loading matrices. If SORT is specified, then the variables are sorted in descending order of significance. If BLANK(n) is specified, then coefficients whose absolute value is less than n will not be printed. If the keyword DEFAULT is given, or if no /FORMAT subcommand is given, then no sorting is performed, and all coefficients will be printed. The /CRITERIA subcommand is used to specify how the number of extracted factors (components) are chosen. If FACTORS(n) is specified, where n is an integer, then n factors will be extracted. Otherwise, the MINEIGEN setting will be used. MINEIGEN(l) requests that all factors whose eigenvalues are greater than or equal to l are extracted. The default value of l is 1. The ECONVERGE setting has effect only when iterative algorithms for factor extraction (such as Principal Axis Factoring) are used. ECONVERGE(delta) specifies that iteration should cease when the maximum absolute value of the communality estimate between one iteration and the previous is less than delta. The default value of delta is 0.001. The ITERATE(m) may appear any number of times and is used for two different purposes. It is used to set the maximum number of iterations (m) for convergence and also to set the maximum number of iterations for rotation. Whether it affects convergence or rotation depends upon which subcommand follows the ITERATE subcommand. If EXTRACTION follows, it affects convergence. If ROTATION follows, it affects rotation. If neither ROTATION nor EXTRACTION follow a ITERATE subcommand it will be ignored. The default value of m is 25. The MISSING subcommand determines the handling of missing variables. If INCLUDE is set, then user-missing values are included in the calculations, but system-missing values are not. If EXCLUDE is set, which is the default, user-missing values are excluded as well as system-missing values. This is the default. If LISTWISE is set, then the entire case is excluded from analysis whenever any variable specified in the VARIABLES subcommand contains a missing value. If PAIRWISE is set, then a case is considered missing only if either of the values for the particular coefficient are missing. The default is LISTWISE. GLM GLM univariate analysis of variance fixed effects factorial anova analysis of variance ANOVA GLM dependent_vars BY fixed_factors [/METHOD = SSTYPE(type)] [/DESIGN = interaction_0 [interaction_1 [... interaction_n]]] [/INTERCEPT = {INCLUDE|EXCLUDE}] [/MISSING = {INCLUDE|EXCLUDE}] The GLM procedure can be used for fixed effects factorial Anova. The dependent_vars are the variables to be analysed. You may analyse several variables in the same command in which case they should all appear before the BY keyword. The fixed_factors list must be one or more categorical variables. Normally it will not make sense to enter a scalar variable in the fixed_factors and doing so may cause PSPP to do a lot of unnecessary processing. The METHOD subcommand is used to change the method for producing the sums of squares. Available values of type are 1, 2 and 3. The default is type 3. You may specify a custom design using the DESIGN subcommand. The design comprises a list of interactions where each interaction is a list of variables separated by a ‘*’. For example the command GLM subject BY sex age_group race /DESIGN = age_group sex group age_group*sex age_group*race specifies the model subject = age_group + sex + race + age_group*sex + age_group*race. If no DESIGN subcommand is specified, then the default is all possible combinations of the fixed factors. That is to say GLM subject BY sex age_group race implies the model subject = age_group + sex + race + age_group*sex + age_group*race + sex*race + age_group*sex*race. The MISSING subcommand determines the handling of missing variables. If INCLUDE is set then, for the purposes of GLM analysis, only system-missing values are considered to be missing; user-missing values are not regarded as missing. If EXCLUDE is set, which is the default, then user-missing values are considered to be missing as well as system-missing values. A case for which any dependent variable or any factor variable has a missing value is excluded from the analysis. LOGISTIC REGRESSION LOGISTIC REGRESSION logistic regression bivariate logistic regression LOGISTIC REGRESSION [VARIABLES =] dependent_var WITH predictors [/CATEGORICAL = categorical_predictors] [{/NOCONST | /ORIGIN | /NOORIGIN }] [/PRINT = [SUMMARY] [DEFAULT] [CI(confidence)] [ALL]] [/CRITERIA = [BCON(min_delta)] [ITERATE(max_interations)] [LCON(min_likelihood_delta)] [EPS(min_epsilon)] [CUT(cut_point)]] [/MISSING = {INCLUDE|EXCLUDE}] Bivariate Logistic Regression is used when you want to explain a dichotomous dependent variable in terms of one or more predictor variables. The minimum command is LOGISTIC REGRESSION y WITH x1 x2xn. Here, y is the dependent variable, which must be dichotomous and x1xn are the predictor variables whose coefficients the procedure estimates. By default, a constant term is included in the model. Hence, the full model is {\bf y} = b_0 + b_1 {\bf x_1} + b_2 {\bf x_2} + \dots + b_n {\bf x_n} Predictor variables which are categorical in nature should be listed on the /CATEGORICAL subcommand. Simple variables as well as interactions between variables may be listed here. If you want a model without the constant term b_0, use the keyword /ORIGIN. /NOCONST is a synonym for /ORIGIN. An iterative Newton-Raphson procedure is used to fit the model. The /CRITERIA subcommand is used to specify the stopping criteria of the procedure, and other parameters. The value of cut_point is used in the classification table. It is the threshold above which predicted values are considered to be 1. Values of cut_point must lie in the range [0,1]. During iterations, if any one of the stopping criteria are satisfied, the procedure is considered complete. The stopping criteria are: The number of iterations exceeds max_iterations. The default value of max_iterations is 20. The change in the all coefficient estimates are less than min_delta. The default value of min_delta is 0.001. The magnitude of change in the likelihood estimate is less than min_likelihood_delta. The default value of min_delta is zero. This means that this criterion is disabled. The differential of the estimated probability for all cases is less than min_epsilon. In other words, the probabilities are close to zero or one. The default value of min_epsilon is 0.00000001. The PRINT subcommand controls the display of optional statistics. Currently there is one such option, CI, which indicates that the confidence interval of the odds ratio should be displayed as well as its value. CI should be followed by an integer in parentheses, to indicate the confidence level of the desired confidence interval. The MISSING subcommand determines the handling of missing variables. If INCLUDE is set, then user-missing values are included in the calculations, but system-missing values are not. If EXCLUDE is set, which is the default, user-missing values are excluded as well as system-missing values. This is the default. MEANS MEANS means MEANS [TABLES =] {var_list} [ BY {var_list} [BY {var_list} [BY {var_list} … ]]] [ /{var_list} [ BY {var_list} [BY {var_list} [BY {var_list} … ]]] ] [/CELLS = [MEAN] [COUNT] [STDDEV] [SEMEAN] [SUM] [MIN] [MAX] [RANGE] [VARIANCE] [KURT] [SEKURT] [SKEW] [SESKEW] [FIRST] [LAST] [HARMONIC] [GEOMETRIC] [DEFAULT] [ALL] [NONE] ] [/MISSING = [INCLUDE] [DEPENDENT]] You can use the MEANS command to calculate the arithmetic mean and similar statistics, either for the dataset as a whole or for categories of data. The simplest form of the command is MEANS v. which calculates the mean, count and standard deviation for v. If you specify a grouping variable, for example MEANS v BY g. then the means, counts and standard deviations for v after having been grouped by g will be calculated. Instead of the mean, count and standard deviation, you could specify the statistics in which you are interested: MEANS x y BY g /CELLS = HARMONIC SUM MIN. This example calculates the harmonic mean, the sum and the minimum values of x and y grouped by g. The CELLS subcommand specifies which statistics to calculate. The available statistics are: MEAN arithmetic mean The arithmetic mean. COUNT The count of the values. STDDEV The standard deviation. SEMEAN The standard error of the mean. SUM The sum of the values. MIN The minimum value. MAX The maximum value. RANGE The difference between the maximum and minimum values. VARIANCE The variance. FIRST The first value in the category. LAST The last value in the category. SKEW The skewness. SESKEW The standard error of the skewness. KURT The kurtosis SEKURT The standard error of the kurtosis. HARMONIC harmonic mean The harmonic mean. GEOMETRIC geometric mean The geometric mean. In addition, three special keywords are recognized: DEFAULT This is the same as MEAN COUNT STDDEV. ALL All of the above statistics will be calculated. NONE No statistics will be calculated (only a summary will be shown). More than one table can be specified in a single command. Each table is separated by a ‘/’. For example MEANS TABLES = c d e BY x /a b BY x y /f BY y BY z. has three tables (the ‘TABLE =’ is optional). The first table has three dependent variables c, d and e and a single categorical variable x. The second table has two dependent variables a and b, and two categorical variables x and y. The third table has a single dependent variables f and a categorical variable formed by the combination of y and z. By default values are omitted from the analysis only if missing values (either system missing or user missing) for any of the variables directly involved in their calculation are encountered. This behaviour can be modified with the /MISSING subcommand. Three options are possible: TABLE, INCLUDE and DEPENDENT. /MISSING = INCLUDE says that user missing values, either in the dependent variables or in the categorical variables should be taken at their face value, and not excluded. /MISSING = DEPENDENT says that user missing values, in the dependent variables should be taken at their face value, however cases which have user missing values for the categorical variables should be omitted from the calculation. NPAR TESTS NPAR TESTS nonparametric tests NPAR TESTS nonparametric test subcommands . . . [ /STATISTICS={DESCRIPTIVES} ] [ /MISSING={ANALYSIS, LISTWISE} {INCLUDE, EXCLUDE} ] [ /METHOD=EXACT [ TIMER [(n)] ] ] NPAR TESTS performs nonparametric tests. Non parametric tests make very few assumptions about the distribution of the data. One or more tests may be specified by using the corresponding subcommand. If the /STATISTICS subcommand is also specified, then summary statistics are produces for each variable that is the subject of any test. Certain tests may take a long time to execute, if an exact figure is required. Therefore, by default asymptotic approximations are used unless the subcommand /METHOD=EXACT is specified. Exact tests give more accurate results, but may take an unacceptably long time to perform. If the TIMER keyword is used, it sets a maximum time, after which the test will be abandoned, and a warning message printed. The time, in minutes, should be specified in parentheses after the TIMER keyword. If the TIMER keyword is given without this figure, then a default value of 5 minutes is used. Binomial test BINOMIAL binomial test [ /BINOMIAL[(p)]=var_list[(value1[, value2)] ] ] The /BINOMIAL subcommand compares the observed distribution of a dichotomous variable with that of a binomial distribution. The variable p specifies the test proportion of the binomial distribution. The default value of 0.5 is assumed if p is omitted. If a single value appears after the variable list, then that value is used as the threshold to partition the observed values. Values less than or equal to the threshold value form the first category. Values greater than the threshold form the second category. If two values appear after the variable list, then they will be used as the values which a variable must take to be in the respective category. Cases for which a variable takes a value equal to neither of the specified values, take no part in the test for that variable. If no values appear, then the variable must assume dichotomous values. If more than two distinct, non-missing values for a variable under test are encountered then an error occurs. If the test proportion is equal to 0.5, then a two tailed test is reported. For any other test proportion, a one tailed test is reported. For one tailed tests, if the test proportion is less than or equal to the observed proportion, then the significance of observing the observed proportion or more is reported. If the test proportion is more than the observed proportion, then the significance of observing the observed proportion or less is reported. That is to say, the test is always performed in the observed direction. PSPP uses a very precise approximation to the gamma function to compute the binomial significance. Thus, exact results are reported even for very large sample sizes. Chisquare Test CHISQUARE chisquare test [ /CHISQUARE=var_list[(lo,hi)] [/EXPECTED={EQUAL|f1, f2fn}] ] The /CHISQUARE subcommand produces a chi-square statistic for the differences between the expected and observed frequencies of the categories of a variable. Optionally, a range of values may appear after the variable list. If a range is given, then non integer values are truncated, and values outside the specified range are excluded from the analysis. The /EXPECTED subcommand specifies the expected values of each category. There must be exactly one non-zero expected value, for each observed category, or the EQUAL keyword must be specified. You may use the notation n*f to specify n consecutive expected categories all taking a frequency of f. The frequencies given are proportions, not absolute frequencies. The sum of the frequencies need not be 1. If no /EXPECTED subcommand is given, then equal frequencies are expected. Cochran Q Test Cochran Cochran Q test Q, Cochran Q [ /COCHRAN = var_list ] The Cochran Q test is used to test for differences between three or more groups. The data for var_list in all cases must assume exactly two distinct values (other than missing values). The value of Q will be displayed and its Asymptotic significance based on a chi-square distribution. Friedman Test FRIEDMAN Friedman test [ /FRIEDMAN = var_list ] The Friedman test is used to test for differences between repeated measures when there is no indication that the distributions are normally distributed. A list of variables which contain the measured data must be given. The procedure prints the sum of ranks for each variable, the test statistic and its significance. Kendall’s W Test KENDALL Kendall’s W test coefficient of concordance [ /KENDALL = var_list ] The Kendall test investigates whether an arbitrary number of related samples come from the same population. It is identical to the Friedman test except that the additional statistic W, Kendall’s Coefficient of Concordance is printed. It has the range [0,1] — a value of zero indicates no agreement between the samples whereas a value of unity indicates complete agreement. Kolmogorov-Smirnov Test KOLMOGOROV-SMIRNOV K-S Kolmogorov-Smirnov test [ /KOLMOGOROV-SMIRNOV ({NORMAL [mu, sigma], UNIFORM [min, max], POISSON [lambda], EXPONENTIAL [scale] }) = var_list ] The one sample Kolmogorov-Smirnov subcommand is used to test whether or not a dataset is drawn from a particular distribution. Four distributions are supported, viz: Normal, Uniform, Poisson and Exponential. Ideally you should provide the parameters of the distribution against which you wish to test the data. For example, with the normal distribution the mean (mu)and standard deviation (sigma) should be given; with the uniform distribution, the minimum (min)and maximum (max) value should be provided. However, if the parameters are omitted they will be imputed from the data. Imputing the parameters reduces the power of the test so should be avoided if possible. In the following example, two variables score and age are tested to see if they follow a normal distribution with a mean of 3.5 and a standard deviation of 2.0. NPAR TESTS /KOLMOGOROV-SMIRNOV (normal 3.5 2.0) = score age. If the variables need to be tested against different distributions, then a separate subcommand must be used. For example the following syntax tests score against a normal distribution with mean of 3.5 and standard deviation of 2.0 whilst age is tested against a normal distribution of mean 40 and standard deviation 1.5. NPAR TESTS /KOLMOGOROV-SMIRNOV (normal 3.5 2.0) = score /KOLMOGOROV-SMIRNOV (normal 40 1.5) = age. The abbreviated subcommand K-S may be used in place of KOLMOGOROV-SMIRNOV. Kruskal-Wallis Test KRUSKAL-WALLIS K-W Kruskal-Wallis test [ /KRUSKAL-WALLIS = var_list BY var (lower, upper) ] The Kruskal-Wallis test is used to compare data from an arbitrary number of populations. It does not assume normality. The data to be compared are specified by var_list. The categorical variable determining the groups to which the data belongs is given by var. The limits lower and upper specify the valid range of var. Any cases for which var falls outside [lower, upper] will be ignored. The mean rank of each group as well as the chi-squared value and significance of the test will be printed. The abbreviated subcommand K-W may be used in place of KRUSKAL-WALLIS. Mann-Whitney U Test MANN-WHITNEY M-W Mann-Whitney U test U, Mann-Whitney U [ /MANN-WHITNEY = var_list BY var (group1, group2) ] The Mann-Whitney subcommand is used to test whether two groups of data come from different populations. The variables to be tested should be specified in var_list and the grouping variable, that determines to which group the test variables belong, in var. Var may be either a string or an alpha variable. Group1 and group2 specify the two values of var which determine the groups of the test data. Cases for which the var value is neither group1 or group2 will be ignored. The value of the Mann-Whitney U statistic, the Wilcoxon W, and the significance will be printed. The abbreviated subcommand M-W may be used in place of MANN-WHITNEY. McNemar Test MCNEMAR McNemar test [ /MCNEMAR var_list [ WITH var_list [ (PAIRED) ]]] Use McNemar’s test to analyse the significance of the difference between pairs of correlated proportions. If the WITH keyword is omitted, then tests for all combinations of the listed variables are performed. If the WITH keyword is given, and the (PAIRED) keyword is also given, then the number of variables preceding WITH must be the same as the number following it. In this case, tests for each respective pair of variables are performed. If the WITH keyword is given, but the (PAIRED) keyword is omitted, then tests for each combination of variable preceding WITH against variable following WITH are performed. The data in each variable must be dichotomous. If there are more than two distinct variables an error will occur and the test will not be run. Median Test MEDIAN Median test [ /MEDIAN [(value)] = var_list BY variable (value1, value2) ] The median test is used to test whether independent samples come from populations with a common median. The median of the populations against which the samples are to be tested may be given in parentheses immediately after the /MEDIAN subcommand. If it is not given, the median will be imputed from the union of all the samples. The variables of the samples to be tested should immediately follow the ‘=’ sign. The keyword BY must come next, and then the grouping variable. Two values in parentheses should follow. If the first value is greater than the second, then a 2 sample test is performed using these two values to determine the groups. If however, the first variable is less than the second, then a k sample test is conducted and the group values used are all values encountered which lie in the range [value1,value2]. Runs Test RUNS runs test [ /RUNS ({MEAN, MEDIAN, MODE, value}) = var_list ] The /RUNS subcommand tests whether a data sequence is randomly ordered. It works by examining the number of times a variable’s value crosses a given threshold. The desired threshold must be specified within parentheses. It may either be specified as a number or as one of MEAN, MEDIAN or MODE. Following the threshold specification comes the list of variables whose values are to be tested. The subcommand shows the number of runs, the asymptotic significance based on the length of the data. Sign Test SIGN sign test [ /SIGN var_list [ WITH var_list [ (PAIRED) ]]] The /SIGN subcommand tests for differences between medians of the variables listed. The test does not make any assumptions about the distribution of the data. If the WITH keyword is omitted, then tests for all combinations of the listed variables are performed. If the WITH keyword is given, and the (PAIRED) keyword is also given, then the number of variables preceding WITH must be the same as the number following it. In this case, tests for each respective pair of variables are performed. If the WITH keyword is given, but the (PAIRED) keyword is omitted, then tests for each combination of variable preceding WITH against variable following WITH are performed. Wilcoxon Matched Pairs Signed Ranks Test WILCOXON wilcoxon matched pairs signed ranks test [ /WILCOXON var_list [ WITH var_list [ (PAIRED) ]]] The /WILCOXON subcommand tests for differences between medians of the variables listed. The test does not make any assumptions about the variances of the samples. It does however assume that the distribution is symmetrical. If the WITH keyword is omitted, then tests for all combinations of the listed variables are performed. If the WITH keyword is given, and the (PAIRED) keyword is also given, then the number of variables preceding WITH must be the same as the number following it. In this case, tests for each respective pair of variables are performed. If the WITH keyword is given, but the (PAIRED) keyword is omitted, then tests for each combination of variable preceding WITH against variable following WITH are performed. T-TEST T-TEST T-TEST /MISSING={ANALYSIS,LISTWISE} {EXCLUDE,INCLUDE} /CRITERIA=CI(confidence) (One Sample mode.) TESTVAL=test_value /VARIABLES=var_list (Independent Samples mode.) GROUPS=var(value1 [, value2]) /VARIABLES=var_list (Paired Samples mode.) PAIRS=var_list [WITH var_list [(PAIRED)] ] The T-TEST procedure outputs tables used in testing hypotheses about means. It operates in one of three modes: One Sample mode. Independent Groups mode. Paired mode. Each of these modes are described in more detail below. There are two optional subcommands which are common to all modes. The /CRITERIA subcommand tells PSPP the confidence interval used in the tests. The default value is 0.95. The MISSING subcommand determines the handling of missing variables. If INCLUDE is set, then user-missing values are included in the calculations, but system-missing values are not. If EXCLUDE is set, which is the default, user-missing values are excluded as well as system-missing values. This is the default. If LISTWISE is set, then the entire case is excluded from analysis whenever any variable specified in the /VARIABLES, /PAIRS or /GROUPS subcommands contains a missing value. If ANALYSIS is set, then missing values are excluded only in the analysis for which they would be needed. This is the default. One Sample Mode The TESTVAL subcommand invokes the One Sample mode. This mode is used to test a population mean against a hypothesized mean. The value given to the TESTVAL subcommand is the value against which you wish to test. In this mode, you must also use the /VARIABLES subcommand to tell PSPP which variables you wish to test. Independent Samples Mode The GROUPS subcommand invokes Independent Samples mode or ‘Groups’ mode. This mode is used to test whether two groups of values have the same population mean. In this mode, you must also use the /VARIABLES subcommand to tell PSPP the dependent variables you wish to test. The variable given in the GROUPS subcommand is the independent variable which determines to which group the samples belong. The values in parentheses are the specific values of the independent variable for each group. If the parentheses are omitted and no values are given, the default values of 1.0 and 2.0 are assumed. If the independent variable is numeric, it is acceptable to specify only one value inside the parentheses. If you do this, cases where the independent variable is greater than or equal to this value belong to the first group, and cases less than this value belong to the second group. When using this form of the GROUPS subcommand, missing values in the independent variable are excluded on a listwise basis, regardless of whether /MISSING=LISTWISE was specified. Paired Samples Mode The PAIRS subcommand introduces Paired Samples mode. Use this mode when repeated measures have been taken from the same samples. If the WITH keyword is omitted, then tables for all combinations of variables given in the PAIRS subcommand are generated. If the WITH keyword is given, and the (PAIRED) keyword is also given, then the number of variables preceding WITH must be the same as the number following it. In this case, tables for each respective pair of variables are generated. In the event that the WITH keyword is given, but the (PAIRED) keyword is omitted, then tables for each combination of variable preceding WITH against variable following WITH are generated. ONEWAY ONEWAY analysis of variance ANOVA ONEWAY [/VARIABLES = ] var_list BY var /MISSING={ANALYSIS,LISTWISE} {EXCLUDE,INCLUDE} /CONTRAST= value1 [, value2] ... [,valueN] /STATISTICS={DESCRIPTIVES,HOMOGENEITY} /POSTHOC={BONFERRONI, GH, LSD, SCHEFFE, SIDAK, TUKEY, ALPHA ([value])} The ONEWAY procedure performs a one-way analysis of variance of variables factored by a single independent variable. It is used to compare the means of a population divided into more than two groups. The dependent variables to be analysed should be given in the VARIABLES subcommand. The list of variables must be followed by the BY keyword and the name of the independent (or factor) variable. You can use the STATISTICS subcommand to tell PSPP to display ancillary information. The options accepted are: DESCRIPTIVES Displays descriptive statistics about the groups factored by the independent variable. HOMOGENEITY Displays the Levene test of Homogeneity of Variance for the variables and their groups. The CONTRAST subcommand is used when you anticipate certain differences between the groups. The subcommand must be followed by a list of numerals which are the coefficients of the groups to be tested. The number of coefficients must correspond to the number of distinct groups (or values of the independent variable). If the total sum of the coefficients are not zero, then PSPP will display a warning, but will proceed with the analysis. The CONTRAST subcommand may be given up to 10 times in order to specify different contrast tests. The MISSING subcommand defines how missing values are handled. If LISTWISE is specified then cases which have missing values for the independent variable or any dependent variable will be ignored. If ANALYSIS is specified, then cases will be ignored if the independent variable is missing or if the dependent variable currently being analysed is missing. The default is ANALYSIS. A setting of EXCLUDE means that variables whose values are user-missing are to be excluded from the analysis. A setting of INCLUDE means they are to be included. The default is EXCLUDE. Using the POSTHOC subcommand you can perform multiple pairwise comparisons on the data. The following comparison methods are available: LSD Least Significant Difference. TUKEY Tukey Honestly Significant Difference. BONFERRONI Bonferroni test. SCHEFFE Scheffé’s test. SIDAK Sidak test. GH The Games-Howell test. The optional syntax ALPHA(value) is used to indicate that value should be used as the confidence level for which the posthoc tests will be performed. The default is 0.05. QUICK CLUSTER QUICK CLUSTER K-means clustering clustering QUICK CLUSTER var_list [/CRITERIA=CLUSTERS(k) [MXITER(max_iter)] CONVERGE(epsilon) [NOINITIAL]] [/MISSING={EXCLUDE,INCLUDE} {LISTWISE, PAIRWISE}] [/PRINT={INITIAL} {CLUSTER}] [/SAVE[=[CLUSTER[(membership_var)]] [DISTANCE[(distance_var)]]] The QUICK CLUSTER command performs k-means clustering on the dataset. This is useful when you wish to allocate cases into clusters of similar values and you already know the number of clusters. The minimum specification is ‘QUICK CLUSTER’ followed by the names of the variables which contain the cluster data. Normally you will also want to specify /CRITERIA=CLUSTERS(k) where k is the number of clusters. If this is not specified, then k defaults to 2. If you use /CRITERIA=NOINITIAL then a naive algorithm to select the initial clusters is used. This will provide for faster execution but less well separated initial clusters and hence possibly an inferior final result. QUICK CLUSTER uses an iterative algorithm to select the clusters centers. The subcommand /CRITERIA=MXITER(max_iter) sets the maximum number of iterations. During classification, PSPP will continue iterating until until max_iter iterations have been done or the convergence criterion (see below) is fulfilled. The default value of max_iter is 2. If however, you specify /CRITERIA=NOUPDATE then after selecting the initial centers, no further update to the cluster centers is done. In this case, max_iter, if specified. is ignored. The subcommand /CRITERIA=CONVERGE(epsilon) is used to set the convergence criterion. The value of convergence criterion is epsilon times the minimum distance between the initial cluster centers. Iteration stops when the mean cluster distance between one iteration and the next is less than the convergence criterion. The default value of epsilon is zero. The MISSING subcommand determines the handling of missing variables. If INCLUDE is set, then user-missing values are considered at their face value and not as missing values. If EXCLUDE is set, which is the default, user-missing values are excluded as well as system-missing values. If LISTWISE is set, then the entire case is excluded from the analysis whenever any of the clustering variables contains a missing value. If PAIRWISE is set, then a case is considered missing only if all the clustering variables contain missing values. Otherwise it is clustered on the basis of the non-missing values. The default is LISTWISE. The PRINT subcommand requests additional output to be printed. If INITIAL is set, then the initial cluster memberships will be printed. If CLUSTER is set, the cluster memberships of the individual cases will be displayed (potentially generating lengthy output). You can specify the subcommand SAVE to ask that each case’s cluster membership and the euclidean distance between the case and its cluster center be saved to a new variable in the active dataset. To save the cluster membership use the CLUSTER keyword and to save the distance use the DISTANCE keyword. Each keyword may optionally be followed by a variable name in parentheses to specify the new variable which is to contain the saved parameter. If no variable name is specified, then PSPP will create one. RANK RANK RANK [VARIABLES=] var_list [{A,D}] [BY var_list] /TIES={MEAN,LOW,HIGH,CONDENSE} /FRACTION={BLOM,TUKEY,VW,RANKIT} /PRINT[={YES,NO} /MISSING={EXCLUDE,INCLUDE} /RANK [INTO var_list] /NTILES(k) [INTO var_list] /NORMAL [INTO var_list] /PERCENT [INTO var_list] /RFRACTION [INTO var_list] /PROPORTION [INTO var_list] /N [INTO var_list] /SAVAGE [INTO var_list] The RANK command ranks variables and stores the results into new variables. The VARIABLES subcommand, which is mandatory, specifies one or more variables whose values are to be ranked. After each variable, ‘A’ or ‘D’ may appear, indicating that the variable is to be ranked in ascending or descending order. Ascending is the default. If a BY keyword appears, it should be followed by a list of variables which are to serve as group variables. In this case, the cases are gathered into groups, and ranks calculated for each group. The TIES subcommand specifies how tied values are to be treated. The default is to take the mean value of all the tied cases. The FRACTION subcommand specifies how proportional ranks are to be calculated. This only has any effect if NORMAL or PROPORTIONAL rank functions are requested. The PRINT subcommand may be used to specify that a summary of the rank variables created should appear in the output. The function subcommands are RANK, NTILES, NORMAL, PERCENT, RFRACTION, PROPORTION and SAVAGE. Any number of function subcommands may appear. If none are given, then the default is RANK. The NTILES subcommand must take an integer specifying the number of partitions into which values should be ranked. Each subcommand may be followed by the INTO keyword and a list of variables which are the variables to be created and receive the rank scores. There may be as many variables specified as there are variables named on the VARIABLES subcommand. If fewer are specified, then the variable names are automatically created. The MISSING subcommand determines how user missing values are to be treated. A setting of EXCLUDE means that variables whose values are user-missing are to be excluded from the rank scores. A setting of INCLUDE means they are to be included. The default is EXCLUDE. REGRESSION regression linear regression The REGRESSION procedure fits linear models to data via least-squares estimation. The procedure is appropriate for data which satisfy those assumptions typical in linear regression: The data set contains n observations of a dependent variable, say Y_1,…,Y_n, and n observations of one or more explanatory variables. Let X_{11}, X_{12}, …, X_{1n} denote the n observations of the first explanatory variable; X_{21},…,X_{2n} denote the n observations of the second explanatory variable; X_{k1},…,X_{kn} denote the n observations of the kth explanatory variable. The dependent variable Y has the following relationship to the explanatory variables: Y_i = b_0 + b_1 X_{1i} + ... + b_k X_{ki} + Z_i where b_0, b_1, …, b_k are unknown coefficients, and Z_1,…,Z_n are independent, normally distributed noise terms with mean zero and common variance. The noise, or error terms are unobserved. This relationship is called the linear model. The REGRESSION procedure estimates the coefficients b_0,…,b_k and produces output relevant to inferences for the linear model. Syntax REGRESSION REGRESSION /VARIABLES=var_list /DEPENDENT=var_list /STATISTICS={ALL, DEFAULTS, R, COEFF, ANOVA, BCOV, CI[conf, TOL]} { /ORIGIN | /NOORIGIN } /SAVE={PRED, RESID} The REGRESSION procedure reads the active dataset and outputs statistics relevant to the linear model specified by the user. The VARIABLES subcommand, which is required, specifies the list of variables to be analyzed. Keyword VARIABLES is required. The DEPENDENT subcommand specifies the dependent variable of the linear model. The DEPENDENT subcommand is required. All variables listed in the VARIABLES subcommand, but not listed in the DEPENDENT subcommand, are treated as explanatory variables in the linear model. All other subcommands are optional: The STATISTICS subcommand specifies which statistics are to be displayed. The following keywords are accepted: ALL All of the statistics below. R The ratio of the sums of squares due to the model to the total sums of squares for the dependent variable. COEFF A table containing the estimated model coefficients and their standard errors. CI (conf) This item is only relevant if COEFF has also been selected. It specifies that the confidence interval for the coefficients should be printed. The optional value conf, which must be in parentheses, is the desired confidence level expressed as a percentage. ANOVA Analysis of variance table for the model. BCOV The covariance matrix for the estimated model coefficients. TOL The variance inflation factor and its reciprocal. This has no effect unless COEFF is also given. DEFAULT The same as if R, COEFF, and ANOVA had been selected. This is what you get if the /STATISTICS command is not specified, or if it is specified without any parameters. The ORIGIN and NOORIGIN subcommands are mutually exclusive. ORIGIN indicates that the regression should be performed through the origin. You should use this option if, and only if you have reason to believe that the regression does indeed pass through the origin — that is to say, the value b_0 above, is zero. The default is NOORIGIN. The SAVE subcommand causes PSPP to save the residuals or predicted values from the fitted model to the active dataset. PSPP will store the residuals in a variable called ‘RES1’ if no such variable exists, ‘RES2’ if ‘RES1’ already exists, ‘RES3’ if ‘RES1’ and ‘RES2’ already exist, etc. It will choose the name of the variable for the predicted values similarly, but with ‘PRED’ as a prefix. When SAVE is used, PSPP ignores TEMPORARY, treating temporary transformations as permanent. Examples The following PSPP syntax will generate the default output and save the predicted values and residuals to the active dataset. title 'Demonstrate REGRESSION procedure'. data list / v0 1-2 (A) v1 v2 3-22 (10). begin data. b 7.735648 -23.97588 b 6.142625 -19.63854 a 7.651430 -25.26557 c 6.125125 -16.57090 a 8.245789 -25.80001 c 6.031540 -17.56743 a 9.832291 -28.35977 c 5.343832 -16.79548 a 8.838262 -29.25689 b 6.200189 -18.58219 end data. list. regression /variables=v0 v1 v2 /statistics defaults /dependent=v2 /save pred resid /method=enter. RELIABILITY RELIABILITY RELIABILITY /VARIABLES=var_list /SCALE (name) = {var_list, ALL} /MODEL={ALPHA, SPLIT[(n)]} /SUMMARY={TOTAL,ALL} /MISSING={EXCLUDE,INCLUDE} Cronbach’s Alpha The RELIABILITY command performs reliability analysis on the data. The VARIABLES subcommand is required. It determines the set of variables upon which analysis is to be performed. The SCALE subcommand determines which variables reliability is to be calculated for. If it is omitted, then analysis for all variables named in the VARIABLES subcommand will be used. Optionally, the name parameter may be specified to set a string name for the scale. The MODEL subcommand determines the type of analysis. If ALPHA is specified, then Cronbach’s Alpha is calculated for the scale. If the model is SPLIT, then the variables are divided into 2 subsets. An optional parameter n may be given, to specify how many variables to be in the first subset. If n is omitted, then it defaults to one half of the variables in the scale, or one half minus one if there are an odd number of variables. The default model is ALPHA. By default, any cases with user missing, or system missing values for any variables given in the VARIABLES subcommand will be omitted from analysis. The MISSING subcommand determines whether user missing values are to be included or excluded in the analysis. The SUMMARY subcommand determines the type of summary analysis to be performed. Currently there is only one type: SUMMARY=TOTAL, which displays per-item analysis tested against the totals. ROC ROC Receiver Operating Characteristic Area under curve ROC var_list BY state_var (state_value) /PLOT = { CURVE [(REFERENCE)], NONE } /PRINT = [ SE ] [ COORDINATES ] /CRITERIA = [ CUTOFF({INCLUDE,EXCLUDE}) ] [ TESTPOS ({LARGE,SMALL}) ] [ CI (confidence) ] [ DISTRIBUTION ({FREE, NEGEXPO }) ] /MISSING={EXCLUDE,INCLUDE} The ROC command is used to plot the receiver operating characteristic curve of a dataset, and to estimate the area under the curve. This is useful for analysing the efficacy of a variable as a predictor of a state of nature. The mandatory var_list is the list of predictor variables. The variable state_var is the variable whose values represent the actual states, and state_value is the value of this variable which represents the positive state. The optional subcommand PLOT is used to determine if and how the ROC curve is drawn. The keyword CURVE means that the ROC curve should be drawn, and the optional keyword REFERENCE, which should be enclosed in parentheses, says that the diagonal reference line should be drawn. If the keyword NONE is given, then no ROC curve is drawn. By default, the curve is drawn with no reference line. The optional subcommand PRINT determines which additional tables should be printed. Two additional tables are available. The SE keyword says that standard error of the area under the curve should be printed as well as the area itself. In addition, a p-value under the null hypothesis that the area under the curve equals 0.5 will be printed. The COORDINATES keyword says that a table of coordinates of the ROC curve should be printed. The CRITERIA subcommand has four optional parameters: The TESTPOS parameter may be LARGE or SMALL. LARGE is the default, and says that larger values in the predictor variables are to be considered positive. SMALL indicates that smaller values should be considered positive. The CI parameter specifies the confidence interval that should be printed. It has no effect if the SE keyword in the PRINT subcommand has not been given. The DISTRIBUTION parameter determines the method to be used when estimating the area under the curve. There are two possibilities, viz: FREE and NEGEXPO. The FREE method uses a non-parametric estimate, and the NEGEXPO method a bi-negative exponential distribution estimate. The NEGEXPO method should only be used when the number of positive actual states is equal to the number of negative actual states. The default is FREE. The CUTOFF parameter is for compatibility and is ignored. The MISSING subcommand determines whether user missing values are to be included or excluded in the analysis. The default behaviour is to exclude them. Cases are excluded on a listwise basis; if any of the variables in var_list or if the variable state_var is missing, then the entire case will be excluded. Utilities Commands that don’t fit any other category are placed here. Most of these commands are not affected by commands like IF and LOOP: they take effect only once, unconditionally, at the time that they are encountered in the input. ADD DOCUMENT ADD DOCUMENT ADD DOCUMENT ’line one’ ’line two’ … ’last line’ . ADD DOCUMENT adds one or more lines of descriptive commentary to the active dataset. Documents added in this way are saved to system files. They can be viewed using SYSFILE INFO or DISPLAY DOCUMENTS. They can be removed from the active dataset with DROP DOCUMENTS. Each line of documentary text must be enclosed in quotation marks, and may not be more than 80 bytes long. See DOCUMENT. CACHE CACHE CACHE. This command is accepted, for compatibility, but it has no effect. CD CD directory changing directory CD ’new directory’ . CD changes the current directory. The new directory will become that specified by the command. COMMENT COMMENT * Comment commands: COMMENT comment text … . *comment text … . Comments within a line of syntax: FREQUENCIES /VARIABLES=v0 v1 v2. /* All our categorical variables. COMMENT is ignored. It is used to provide information to the author and other readers of the PSPP syntax file. COMMENT can extend over any number of lines. It ends at a dot at the end of a line or a blank line. The comment may contain any characters. PSPP also supports comments within a line of syntax, introduced with ‘/*’. These comments end at the first ‘*/’ or at the end of the line, whichever comes first. A line that contains just this kind of comment is considered blank and ends the current command. DOCUMENT DOCUMENT DOCUMENT documentary_text. DOCUMENT adds one or more lines of descriptive commentary to the active dataset. Documents added in this way are saved to system files. They can be viewed using SYSFILE INFO or DISPLAY DOCUMENTS. They can be removed from the active dataset with DROP DOCUMENTS. Specify the documentary text following the DOCUMENT keyword. It is interpreted literally—any quotes or other punctuation marks will be included in the file. You can extend the documentary text over as many lines as necessary, including blank lines to separate paragraphs. Lines are truncated at 80 bytes. Don’t forget to terminate the command with a dot at the end of a line. See ADD DOCUMENT. DISPLAY DOCUMENTS DISPLAY DOCUMENTS DISPLAY DOCUMENTS. DISPLAY DOCUMENTS displays the documents in the active dataset. Each document is preceded by a line giving the time and date that it was added. See DOCUMENT. DISPLAY FILE LABEL DISPLAY FILE LABEL DISPLAY FILE LABEL. DISPLAY FILE LABEL displays the file label contained in the active dataset, if any. See FILE LABEL. This command is a PSPP extension. DROP DOCUMENTS DROP DOCUMENTS DROP DOCUMENTS. DROP DOCUMENTS removes all documents from the active dataset. New documents can be added with DOCUMENT (see DOCUMENT). DROP DOCUMENTS changes only the active dataset. It does not modify any system files stored on disk. ECHO ECHO ECHO ’arbitrary text’ . Use ECHO to write arbitrary text to the output stream. The text should be enclosed in quotation marks following the normal rules for string tokens (see Tokens). ERASE ERASE ERASE FILE file_name. ERASE FILE deletes a file from the local file system. file_name must be quoted. This command cannot be used if the SAFER (see SET) setting is active. EXECUTE EXECUTE EXECUTE. EXECUTE causes the active dataset to be read and all pending transformations to be executed. FILE LABEL FILE LABEL FILE LABEL file_label. FILE LABEL provides a title for the active dataset. This title will be saved into system files and portable files that are created during this PSPP run. file_label should not be quoted. If quotes are included, they are literally interpreted and become part of the file label. FINISH FINISH FINISH. FINISH terminates the current PSPP session and returns control to the operating system. HOST HOST In the syntax below, the square brackets must be included in the command syntax and do not indicate that that their contents are optional. HOST COMMAND=[’command’...] TIMELIMIT=secs. HOST executes one or more commands, each provided as a string in the required COMMAND subcommand, in the shell of the underlying operating system. PSPP runs each command in a separate shell process and waits for it to finish before running the next one. If a command fails (with a nonzero exit status, or because it is killed by a signal), then PSPP does not run any remaining commands. PSPP provides /dev/null as the shell’s standard input. If a process needs to read from stdin, redirect from a file or device, or use a pipe. PSPP displays the shell’s standard output and standard error as PSPP output. Redirect to a file or /dev/null or another device if this is not desired. The following example runs rsync to copy a file from a remote server to the local file data.txt, writing rsync’s own output to rsync-log.txt. PSPP displays the command’s error output, if any. If rsync needs to prompt the user (e.g. to obtain a password), the command fails. Only if the rsync succeeds, PSPP then runs the sha512sum command. HOST COMMAND=['rsync remote:data.txt data.txt > rsync-log.txt' 'sha512sum -c data.txt.sha512sum]. By default, PSPP waits as long as necessary for the series of commands to complete. Use the optional TIMELIMIT subcommand to limit the execution time to the specified number of seconds. PSPP built for mingw does not support all the features of HOST. PSPP rejects this command if the SAFER (see SET) setting is active. INCLUDE INCLUDE INCLUDE [FILE=]’file_name’ [ENCODING=’encoding’]. INCLUDE causes the PSPP command processor to read an additional command file as if it were included bodily in the current command file. If errors are encountered in the included file, then command processing will stop and no more commands will be processed. Include files may be nested to any depth, up to the limit of available memory. The INSERT command (see INSERT) is a more flexible alternative to INCLUDE. An INCLUDE command acts the same as INSERT with ERROR=STOP CD=NO SYNTAX=BATCH specified. The optional ENCODING subcommand has the same meaning as with INSERT. INSERT INSERT INSERT [FILE=]’file_name’ [CD={NO,YES}] [ERROR={CONTINUE,STOP}] [SYNTAX={BATCH,INTERACTIVE}] [ENCODING={LOCALE, ’charset_name’}]. INSERT is similar to INCLUDE (see INCLUDE) but somewhat more flexible. It causes the command processor to read a file as if it were embedded in the current command file. If CD=YES is specified, then before including the file, the current directory will be changed to the directory of the included file. The default setting is ‘CD=NO’. Note that this directory will remain current until it is changed explicitly (with the CD command, or a subsequent INSERT command with the ‘CD=YES’ option). It will not revert to its original setting even after the included file is finished processing. If ERROR=STOP is specified, errors encountered in the inserted file will cause processing to immediately cease. Otherwise processing will continue at the next command. The default setting is ERROR=CONTINUE. If SYNTAX=INTERACTIVE is specified then the syntax contained in the included file must conform to interactive syntax conventions. See Syntax Variants. The default setting is SYNTAX=BATCH. ENCODING optionally specifies the character set used by the included file. Its argument, which is not case-sensitive, must be in one of the following forms: LOCALE The encoding used by the system locale, or as overridden by the SET command (see SET). On GNU/Linux and other Unix-like systems, environment variables, e.g. LANG or LC_ALL, determine the system locale. charset_name One of the character set names listed by IANA at http://www.iana.org/assignments/character-sets. Some examples are ASCII (United States), ISO-8859-1 (western Europe), EUC-JP (Japan), and windows-1252 (Windows). Not all systems support all character sets. Auto,encoding Automatically detects whether a syntax file is encoded in an Unicode encoding such as UTF-8, UTF-16, or UTF-32. If it is not, then PSPP generally assumes that the file is encoded in encoding (an IANA character set name). However, if encoding is UTF-8, and the syntax file is not valid UTF-8, PSPP instead assumes that the file is encoded in windows-1252. For best results, encoding should be an ASCII-compatible encoding (the most common locale encodings are all ASCII-compatible), because encodings that are not ASCII compatible cannot be automatically distinguished from UTF-8. Auto Auto,Locale Automatic detection, as above, with the default encoding taken from the system locale or the setting on SET LOCALE. When ENCODING is not specified, the default is taken from the command option, if it was specified, and otherwise it is Auto. OUTPUT OUTPUT precision, of output decimal places OUTPUT MODIFY /SELECT TABLES /TABLECELLS SELECT = [ class... ] FORMAT = fmt_spec.
Please note: In the above synopsis the characters ‘[’ and ‘]’ are literals. They must appear in the syntax to be interpreted.
OUTPUT changes the appearance of the tables in which results are printed. In particular, it can be used to set the format and precision to which results are displayed. After running this command, the default table appearance parameters will have been modified and each new output table generated will use the new parameters. Following /TABLECELLS SELECT = a list of cell classes must appear, enclosed in square brackets. This list determines the classes of values should be selected for modification. Each class can be: RESIDUAL Residual values. Default: F40.2. CORRELATION Correlations. Default: F40.3. PERCENT Percentages. Default: PCT40.1. SIGNIFICANCE Significance of tests (p-values). Default: F40.3. COUNT Counts or sums of weights. For a weighted data set, the default is the weight variable’s print format. For an unweighted data set, the default is F40.0. For most other numeric values that appear in tables, SET FORMAT may be used to specify the format (see SET FORMAT). The value of fmt_spec must be a valid output format (see Input and Output Formats). Note that not all possible formats are meaningful for all classes.
PERMISSIONS PERMISSIONS mode file mode changing file permissions PERMISSIONS FILE=’file_name’ /PERMISSIONS = {READONLY,WRITEABLE}. PERMISSIONS changes the permissions of a file. There is one mandatory subcommand which specifies the permissions to which the file should be changed. If you set a file’s permission to READONLY, then the file will become unwritable either by you or anyone else on the system. If you set the permission to WRITEABLE, then the file will become writeable by you; the permissions afforded to others will be unchanged. This command cannot be used if the SAFER (see SET) setting is active. PRESERVE and RESTORE PRESERVE RESTORE PRESERVE. … RESTORE. PRESERVE saves all of the settings that SET (see SET) can adjust. A later RESTORE command restores those settings. PRESERVE can be nested up to five levels deep. SET SET SET (data input) /BLANKS={SYSMIS,’.’,number} /DECIMAL={DOT,COMMA} /FORMAT=fmt_spec /EPOCH={AUTOMATIC,year} /RIB={NATIVE,MSBFIRST,LSBFIRST,VAX} /RRB={NATIVE,ISL,ISB,IDL,IDB,VF,VD,VG,ZS,ZL} (interaction) /MXERRS=max_errs /MXWARNS=max_warnings /WORKSPACE=workspace_size (syntax execution) /LOCALE=’locale’ /MEXPAND={ON,OFF} /MITERATE=max_iterations /MNEST=max_nest /MPRINT={ON,OFF} /MXLOOPS=max_loops /SEED={RANDOM,seed_value} /UNDEFINED={WARN,NOWARN} /FUZZBITS=fuzzbits (data output) /CC{A,B,C,D,E}={’npre,pre,suf,nsuf’,’npre.pre.suf.nsuf’} /DECIMAL={DOT,COMMA} /FORMAT=fmt_spec /WIB={NATIVE,MSBFIRST,LSBFIRST,VAX} /WRB={NATIVE,ISL,ISB,IDL,IDB,VF,VD,VG,ZS,ZL} (output routing) /ERRORS={ON,OFF,TERMINAL,LISTING,BOTH,NONE} /MESSAGES={ON,OFF,TERMINAL,LISTING,BOTH,NONE} /PRINTBACK={ON,OFF,TERMINAL,LISTING,BOTH,NONE} /RESULTS={ON,OFF,TERMINAL,LISTING,BOTH,NONE} (output driver options) /HEADERS={NO,YES,BLANK} /LENGTH={NONE,n_lines} /WIDTH={NARROW,WIDTH,n_characters} /TNUMBERS={VALUES,LABELS,BOTH} /TVARS={NAMES,LABELS,BOTH} (logging) /JOURNAL={ON,OFF} [’file_name’] (system files) /COMPRESSION={ON,OFF} /SCOMPRESSION={ON,OFF} (miscellaneous) /SAFER=ON /LOCALE=’string’ (obsolete settings accepted for compatibility, but ignored) /BOXSTRING={’xxx’,’xxxxxxxxxxx’} /CASE={UPPER,UPLOW} /CPI=cpi_value /HIGHRES={ON,OFF} /HISTOGRAM=’c’ /LOWRES={AUTO,ON,OFF} /LPI=lpi_value /MENUS={STANDARD,EXTENDED} /MXMEMORY=max_memory /SCRIPTTAB=’c’ /TB1={’xxx’,’xxxxxxxxxxx’} /TBFONTS=’string’ /XSORT={YES,NO} SET allows the user to adjust several parameters relating to PSPP’s execution. Since there are many subcommands to this command, its subcommands will be examined in groups. For subcommands that take boolean values, ON and YES are synonymous, as are OFF and NO, when used as subcommand values. The data input subcommands affect the way that data is read from data files. The data input subcommands are BLANKS This is the value assigned to an item data item that is empty or contains only white space. An argument of SYSMIS or ’.’ will cause the system-missing value to be assigned to null items. This is the default. Any real value may be assigned. DECIMAL This value may be set to DOT or COMMA. Setting it to DOT causes the decimal point character to be ‘.’ and the grouping character to be ‘,’. Setting it to COMMA causes the decimal point character to be ‘,’ and the grouping character to be ‘.’. If the setting is COMMA, then ‘,’ will not be treated as a field separator in the DATA LIST command (see DATA LIST). The default value is determined from the system locale. FORMAT Allows the default numeric input/output format to be specified. The default is F8.2. See Input and Output Formats. EPOCH Specifies the range of years used when a 2-digit year is read from a data file or used in a date construction expression (see Date Construction). If a 4-digit year is specified for the epoch, then 2-digit years are interpreted starting from that year, known as the epoch. If AUTOMATIC (the default) is specified, then the epoch begins 69 years before the current date. RIB PSPP extension to set the byte ordering (endianness) used for reading data in IB or PIB format (see Binary and Hexadecimal Numeric Formats). In MSBFIRST ordering, the most-significant byte appears at the left end of a IB or PIB field. In LSBFIRST ordering, the least-significant byte appears at the left end. VAX ordering is like MSBFIRST, except that each pair of bytes is in reverse order. NATIVE, the default, is equivalent to MSBFIRST or LSBFIRST depending on the native format of the machine running PSPP. RRB PSPP extension to set the floating-point format used for reading data in RB format (see Binary and Hexadecimal Numeric Formats). The possibilities are: NATIVE The native format of the machine running PSPP. Equivalent to either IDL or IDB. ISL 32-bit IEEE 754 single-precision floating point, in little-endian byte order. ISB 32-bit IEEE 754 single-precision floating point, in big-endian byte order. IDL 64-bit IEEE 754 double-precision floating point, in little-endian byte order. IDB 64-bit IEEE 754 double-precision floating point, in big-endian byte order. VF 32-bit VAX F format, in VAX-endian byte order. VD 64-bit VAX D format, in VAX-endian byte order. VG 64-bit VAX G format, in VAX-endian byte order. ZS 32-bit IBM Z architecture short format hexadecimal floating point, in big-endian byte order. ZL 64-bit IBM Z architecture long format hexadecimal floating point, in big-endian byte order. Z architecture also supports IEEE 754 floating point. The ZS and ZL formats are only for use with very old input files. The default is NATIVE. Interaction subcommands affect the way that PSPP interacts with an online user. The interaction subcommands are MXERRS The maximum number of errors before PSPP halts processing of the current command file. The default is 50. MXWARNS The maximum number of warnings + errors before PSPP halts processing the current command file. The special value of zero means that all warning situations should be ignored. No warnings will be issued, except a single initial warning advising the user that warnings will not be given. The default value is 100. Syntax execution subcommands control the way that PSPP commands execute. The syntax execution subcommands are LOCALE Overrides the system locale for the purpose of reading and writing syntax and data files. The argument should be a locale name in the general form language_country.encoding, where language and country are 2-character language and country abbreviations, respectively, and encoding is an IANA character set name. Example locales are en_US.UTF-8 (UTF-8 encoded English as spoken in the United States) and ja_JP.EUC-JP (EUC-JP encoded Japanese as spoken in Japan). MEXPAND MITERATE MNEST MPRINT Currently not used. MXLOOPS The maximum number of iterations for an uncontrolled loop (see LOOP). The default max_loops is 40. SEED The initial pseudo-random number seed. Set to a real number or to RANDOM, which will obtain an initial seed from the current time of day. UNDEFINED Currently not used. FUZZBITS The maximum number of bits of errors in the least-significant places to accept for rounding up a value that is almost halfway between two possibilities for rounding with the RND operator (see Miscellaneous Mathematics). The default fuzzbits is 6. WORKSPACE The maximum amount of memory (in kilobytes) that PSPP will use to store data being processed. If memory in excess of the workspace size is required, then PSPP will start to use temporary files to store the data. Setting a higher value will, in general, mean procedures will run faster, but may cause other applications to run slower. On platforms without virtual memory management, setting a very large workspace may cause PSPP to abort. workspace memory, amount used to store cases Data output subcommands affect the format of output data. These subcommands are CCA CCB CCC CCD CCE Set up custom currency formats. See Custom Currency Formats, for details. DECIMAL The default DOT setting causes the decimal point character to be ‘.’. A setting of COMMA causes the decimal point character to be ‘,’. FORMAT Allows the default numeric input/output format to be specified. The default is F8.2. See Input and Output Formats. WIB PSPP extension to set the byte ordering (endianness) used for writing data in IB or PIB format (see Binary and Hexadecimal Numeric Formats). In MSBFIRST ordering, the most-significant byte appears at the left end of a IB or PIB field. In LSBFIRST ordering, the least-significant byte appears at the left end. VAX ordering is like MSBFIRST, except that each pair of bytes is in reverse order. NATIVE, the default, is equivalent to MSBFIRST or LSBFIRST depending on the native format of the machine running PSPP. WRB PSPP extension to set the floating-point format used for writing data in RB format (see Binary and Hexadecimal Numeric Formats). The choices are the same as SET RIB. The default is NATIVE. In the PSPP text-based interface, the output routing subcommands affect where output is sent. The following values are allowed for each of these subcommands: OFF NONE Discard this kind of output. TERMINAL Write this output to the terminal, but not to listing files and other output devices. LISTING Write this output to listing files and other output devices, but not to the terminal. ON BOTH Write this type of output to all output devices. These output routing subcommands are: ERRORS Applies to error and warning messages. The default is BOTH. MESSAGES Applies to notes. The default is BOTH. PRINTBACK Determines whether the syntax used for input is printed back as part of the output. The default is NONE. RESULTS Applies to everything not in one of the above categories, such as the results of statistical procedures. The default is BOTH. These subcommands have no effect on output in the PSPP GUI environment. Output driver option subcommands affect output drivers’ settings. These subcommands are HEADERS LENGTH WIDTH TNUMBERS The TNUMBERS option sets the way in which values are displayed in output tables. The valid settings are VALUES, LABELS and BOTH. If TNUMBERS is set to VALUES, then all values are displayed with their literal value (which for a numeric value is a number and for a string value an alphanumeric string). If TNUMBERS is set to LABELS, then values are displayed using their assigned labels if any. (See VALUE LABELS.) If the a value has no label, then it will be displayed using its literal value. If TNUMBERS is set to BOTH, then values will be displayed with both their label (if any) and their literal value in parentheses. TVARS The TVARS option sets the way in which variables are displayed in output tables. The valid settings are NAMES, LABELS and BOTH. If TVARS is set to NAMES, then all variables are displayed using their names. If TVARS is set to LABELS, then variables are displayed using their label if one has been set. If no label has been set, then the name will be used. (See VARIABLE LABELS.) If TVARS is set to BOTH, then variables will be displayed with both their label (if any) and their name in parentheses. headers length pager width tnumbers Logging subcommands affect logging of commands executed to external files. These subcommands are JOURNAL LOG These subcommands, which are synonyms, control the journal. The default is ON, which causes commands entered interactively to be written to the journal file. Commands included from syntax files that are included interactively and error messages printed by PSPP are also written to the journal file, prefixed by ‘>’. OFF disables use of the journal. The journal is named pspp.jnl by default. A different name may be specified. System file subcommands affect the default format of system files produced by PSPP. These subcommands are COMPRESSION Not currently used. SCOMPRESSION Whether system files created by SAVE or XSAVE are compressed by default. The default is ON. Security subcommands affect the operations that commands are allowed to perform. The security subcommands are SAFER Setting this option disables the following operations: The ERASE command. The HOST command. The PERMISSIONS command. Pipes (file names beginning or ending with ‘|’). Be aware that this setting does not guarantee safety (commands can still overwrite files, for instance) but it is an improvement. When set, this setting cannot be reset during the same session, for obvious security reasons. LOCALE locale encoding, characters This item is used to set the default character encoding. The encoding may be specified either as an encoding name or alias (see http://www.iana.org/assignments/character-sets), or as a locale name. If given as a locale name, only the character encoding of the locale is relevant. System files written by PSPP will use this encoding. System files read by PSPP, for which the encoding is unknown, will be interpreted using this encoding. The full list of valid encodings and locale names/alias are operating system dependent. The following are all examples of acceptable syntax on common GNU/Linux systems. SET LOCALE='iso-8859-1'. SET LOCALE='ru_RU.cp1251'. SET LOCALE='japanese'. Contrary to intuition, this command does not affect any aspect of the system’s locale. SHOW SHOW SHOW [ALL] [BLANKS] [CC] [CCA] [CCB] [CCC] [CCD] [CCE] [COPYING] [DECIMALS] [DIRECTORY] [ENVIRONMENT] [FORMAT] [FUZZBITS] [LENGTH] [MXERRS] [MXLOOPS] [MXWARNS] [N] [SCOMPRESSION] [TEMPDIR] [UNDEFINED] [VERSION] [WARRANTY] [WEIGHT] [WIDTH] SHOW can be used to display the current state of PSPP’s execution parameters. Parameters that can be changed using SET (see SET), can be examined using SHOW using the subcommand with the same name. SHOW supports the following additional subcommands: ALL Show all settings. CC Show all custom currency settings (CCA through CCE). DIRECTORY Shows the current working directory. ENVIRONMENT Shows the operating system details. N Reports the number of cases in the active dataset. The reported number is not weighted. If no dataset is defined, then ‘Unknown’ will be reported. TEMPDIR Shows the path of the directory where temporary files will be stored. VERSION Shows the version of this installation of PSPP. WARRANTY Show details of the lack of warranty for PSPP. COPYING / LICENSE Display the terms of PSPP’s copyright licence (see License). Specifying SHOW without any subcommands is equivalent to SHOW ALL. SUBTITLE SUBTITLE SUBTITLE ’subtitle_string’. or SUBTITLE subtitle_string. SUBTITLE provides a subtitle to a particular PSPP run. This subtitle appears at the top of each output page below the title, if headers are enabled on the output device. Specify a subtitle as a string in quotes. The alternate syntax that did not require quotes is now obsolete. If it is used then the subtitle is converted to all uppercase. TITLE TITLE TITLE ’title_string’. or TITLE title_string. TITLE provides a title to a particular PSPP run. This title appears at the top of each output page, if headers are enabled on the output device. Specify a title as a string in quotes. The alternate syntax that did not require quotes is now obsolete. If it is used then the title is converted to all uppercase.
Invoking <command>pspp-convert</command> Invocation pspp-convert pspp-convert is a command-line utility accompanying PSPP. It reads an SPSS or SPSS/PC+ system file or SPSS portable file or encrypted SPSS syntax file input and writes a copy of it to another output in a different format. Synopsis: pspp-convert [options] input output pspp-convert --help pspp-convert --version The format of input is automatically detected, when possible. The character encoding of old SPSS system files cannot always be guessed correctly, and SPSS/PC+ system files do not include any indication of their encoding. Use -e encoding to specify the encoding in this case. By default, the intended format for output is inferred based on its extension: csv txt Comma-separated value. Each value is formatted according to its variable’s print format. The first line in the file contains variable names. sav sys SPSS system file. por SPSS portable file. sps SPSS syntax file. (Only encrypted syntax files may be converted to this format.) pspp-convert can convert most input formats to most output formats. Encrypted SPSS file formats are exceptions: if the input file is in an encrypted format, then the output file will be the same format (decrypted). To decrypt such a file, specify the encrypted file as input. The output will be the equivalent plaintext file. Options for the output format are ignored in this case. The password for encrypted files can be specified a few different ways. If the password is known, use the option (documented below) or allow pspp-convert to prompt for it. If the password is unknown, use the and options to specify how to search for it, or to specify a file of passwords to try. Use -O format to override the inferred format or to specify the format for unrecognized extensions. pspp-convert accepts the following general options: Sets the output format, where format is one of the extensions listed above, e.g.: . Use to list the supported output formats. By default, all cases are copied from input to output. Specifying this option to limit the number of cases written to output to maxcases. Overrides the encoding in which character strings in input are interpreted. This option is necessary because old SPSS system files, and SPSS/PC+ system files, do not self-identify their encoding. By default, pspp-convert includes all the variables from the input file. Use this option to list specific variables to include; any variables not listed will be dropped. The variables in the output file will also be reordered into the given order. The variable list may use TO in the same way as in PSPP syntax, e.g. if the dictionary contains consecutive variables a, b, c, and d, then will include all of them (and no others). Drops the specified variables from the output. When and are used together, is processed first. Prints a usage message on stdout and exits. Prints version information on stdout and exits. The following options affect CSV output: By default, pspp-convert writes user-missing values to CSV output files as their regular values. With this option, pspp-convert recodes them to system-missing values (which are written as a single space). By default, pspp-convert writes the variable names as the first line of output. With this option, pspp-convert omits this line. By default, pspp-convert writes variables’ values to CSV output files. With this option, pspp-convert writes value labels. By default, pspp-convert writes numeric variables as plain numbers. This option makes pspp-convert honor variables’ print formats. This option sets the character used as a decimal point in output. The default is ‘.’. This option sets the character used to separate fields in output. The default is ‘,’, unless the decimal point is ‘,’, in which case ‘;’ is used. The option sets the character used to quote fields that contain the delimiter. The default is ‘"’. The following options specify how to obtain the password for encrypted files: Specifies the password to use to decrypt an encrypted SPSS system file or syntax file. If this option is not specified, pspp-convert will prompt interactively for the password as necessary. Be aware that command-line options, including passwords, may be visible to other users on multiuser systems. When used with (or ) and (or ), this option specifies the starting point for the search. This can be used to restart a search that was interrupted. Specifies the alphabet of symbols over which to search for an encrypted file’s password. alphabet may include individual characters and ranges delimited by ‘-’. For example, searches lowercase letters, searches uppercase letters and digits, and searches all printable ASCII characters. Specifies the maximum length of the passwords to try. Specifies a file to read containing a list of passwords to try, one per line. If file is -, reads from stdin. Invoking <command>pspp-output</command> Invocation pspp-output pspp-output is a command-line utility accompanying PSPP. It supports multiple operations on SPSS viewer or .spv files, here called SPV files. SPSS 16 and later writes SPV files to represent the contents of its output editor. SPSS 15 and earlier versions instead use .spo files. pspp-output does not support this format. pspp-options may be invoked in the following ways: pspp-output detect file pspp-output [options] dir file pspp-output [options] convert source destination pspp-output --help pspp-output --version Each of these forms is documented separately below. pspp-output also has several undocumented command forms that developers may find useful for debugging. The <literal>detect</literal> Command pspp-output detect file When file is an SPV file, pspp-output exits successfully without outputting anything. When file is not an SPV file or some other error occurs, pspp-output prints an error message and exits with a failure indication. The <literal>dir</literal> Command pspp-output [options] dir file Prints on stdout a table of contents for SPV file file. By default, this table lists every object in the file, except for hidden objects. See Input Selection Options, for information on the options available to select a subset of objects. The following additional option for dir is intended mainly for use by PSPP developers: Also show the names of the Zip members associated with each object. The <literal>convert</literal> Command pspp-output [options] convert source destination Reads SPV file source and converts it to another format, writing the output to destination. By default, the intended format for destination is inferred based on its extension, in the same way that the pspp program does for its output files. See Invoking PSPP, for details. See Input Selection Options, for information on the options available to select a subset of objects to include in the output. The following additional options are accepted: Overrides the format inferred from the output file’s extension. Use to list the available formats. See Invoking PSPP, for details of the available output formats. Sets an option for the output file format. See Invoking PSPP, for details of the available output options. By default, if the source is corrupt or otherwise cannot be processed, the destination is not written. With or , the destination is written as best it can, even with errors. Input Selection Options The dir and convert commands, by default, operate on all of the objects in the source SPV file, except for objects that are not visible in the output viewer window. The user may specify these options to select a subset of the input objects. When multiple options are used, only objects that satisfy all of them are selected: Include only objects of the given class; with leading ‘^’, include only objects not in the class. Use commas to separate multiple classes. The supported classes are:
charts headings logs models tables texts trees warnings outlineheaders pagetitle notes unknown other
Use to print this list of classes.
Include only objects with the specified command, subtype, or label. With a leading ‘^’, include only the objects that do not match. Multiple values may be specified separated by commas. An asterisk at the end of a value acts as a wildcard. The option matches command identifiers, case insensitively. All of the objects produced by a single command use the same, unique command identifier. Command identifiers are always in English regardless of the language used for output. They often differ from the command name in PSPP syntax. Use the pspp-output program’s dir command to print command identifiers in particular output. The option matches particular tables within a command, case insensitively. Subtypes are not necessarily unique: two commands that produce similar output tables may use the same subtype. Subtypes are always in English and dir will print them. The option matches the labels in table output (that is, the table titles). Labels are affected by the output language, variable names and labels, split file settings, and other factors. Include the specified instance of an object that matches the other criteria within a single command. The instance may be a number (1 for the first instance, 2 for the second, and so on) or last for the last instance. Include hidden output objects in the output. By default, they are excluded. Separates two sets of selection options. Objects selected by either set of options are included in the output.
The following additional input selection options are intended mainly for use by PSPP developers: Include only objects that cause an error when read. With the convert command, this is most useful in conjunction with the option. Include only the objects that include a listed Zip file member. More than one name may be included, comma-separated. The members in an SPV file may be listed with the dir command by adding the option or with the zipinfo program included with many operating systems. Error messages that pspp-output prints when it reads SPV files also often include member names. Displays the name of the Zip member or members associated with each object just above the object itself.
Invoking <command>pspp-dump-sav</command> Invocation pspp-dump-sav pspp-dump-sav is a command-line utility accompanying PSPP. It reads one or more SPSS system files and prints their contents. The output format is useful for debugging system file readers and writers and for discovering how to interpret unknown or poorly understood records. End users may find the output useful for providing the PSPP developers information about system files that PSPP does not accurately read. Synopsis: pspp-dump-sav [-d[maxcases] | --data[=maxcases]] filepspp-dump-sav --help | -h pspp-dump-sav --version | -v The following options are accepted: -d[maxcases] --data[=maxcases] By default, pspp-dump-sav does not print any of the data in a system file, only the file headers. Specify this option to print the data as well. If maxcases is specified, then it limits the number of cases printed. -h --help Prints a usage message on stdout and exits. -v --version Prints version information on stdout and exits. Some errors that prevent files from being interpreted successfully cause pspp-dump-sav to exit without reading any additional files given on the command line. Not Implemented This chapter lists parts of the PSPP language that are not yet implemented. unimplemented commands commands, unimplemented 2SLS Two stage least squares regression ACF Autocorrelation function ALSCAL Multidimensional scaling ANACOR Correspondence analysis ANOVA Factorial analysis of variance CASEPLOT Plot time series CASESTOVARS Restructure complex data CATPCA Categorical principle components analysis CATREG Categorical regression CCF Time series cross correlation CLEAR TRANSFORMATIONS Clears transformations from active dataset CLUSTER Hierarchical clustering CONJOINT Analyse full concept data CORRESPONDENCE Show correspondence COXREG Cox proportional hazards regression CREATE Create time series data CSDESCRIPTIVES Complex samples descriptives CSGLM Complex samples GLM CSLOGISTIC Complex samples logistic regression CSPLAN Complex samples design CSSELECT Select complex samples CSTABULATE Tabulate complex samples CTABLES Display complex samples CURVEFIT Fit curve to line plot DATE Create time series data DEFINE Syntax macros DETECTANOMALY Find unusual cases DISCRIMINANT Linear discriminant analysis EDIT obsolete END FILE TYPE Ends complex data input FILE TYPE Complex data input FIT Goodness of Fit GENLOG Categorical model fitting GET TRANSLATE Read other file formats GGRAPH Custom defined graphs HILOGLINEAR Hierarchical loglinear models HOMALS Homogeneity analysis IGRAPH Interactive graphs INFO Local Documentation KEYED DATA LIST Read nonsequential data KM Kaplan-Meier LOGLINEAR General model fitting MANOVA Multivariate analysis of variance MAPS Geographical display MATRIX Matrix processing MCONVERT Convert covariance/correlation matrices MIXED Mixed linear models MODEL CLOSE Close server connection MODEL HANDLE Define server connection MODEL LIST Show existing models MODEL NAME Specify model label MULTIPLE CORRESPONDENCE Multiple correspondence analysis MULT RESPONSE Multiple response analysis MVA Missing value analysis NAIVEBAYES Small sample bayesian prediction NLR Non Linear Regression NOMREG Multinomial logistic regression NONPAR CORR Nonparametric correlation NUMBERED OLAP CUBES On-line analytical processing OMS Output management ORTHOPLAN Orthogonal effects design OVERALS Nonlinear canonical correlation PACF Partial autocorrelation PARTIAL CORR Partial correlation PLANCARDS Conjoint analysis planning PLUM Estimate ordinal regression models POINT Marker in keyed file PPLOT Plot time series variables PREDICT Specify forecast period PREFSCAL Multidimensional unfolding PRINCALS PCA by alternating least squares PROBIT Probit analysis PROCEDURE OUTPUT Specify output file PROXIMITIES Pairwise similarity PROXSCAL Multidimensional scaling of proximity data RATIO STATISTICS Descriptives of ratios READ MODEL Read new model RECORD TYPE Defines a type of record within FILE TYPE REFORMAT Read obsolete files REPEATING DATA Specify multiple cases per input record REPORT Pretty print working file RMV Replace missing values SCRIPT Run script file SEASON Estimate seasonal factors SELECTPRED Select predictor variables SPCHART Plot control charts SPECTRA Plot spectral density STEMLEAF Plot stem-and-leaf display SUMMARIZE Univariate statistics SURVIVAL Survival analysis TDISPLAY Display active models TREE Create classification tree TSAPPLY Apply time series model TSET Set time sequence variables TSHOW Show time sequence variables TSMODEL Estimate time series model TSPLOT Plot time sequence variables TWOSTEP CLUSTER Cluster observations UNIANOVA Univariate analysis UNNUMBERED obsolete VALIDATEDATA Identify suspicious cases VARCOMP Estimate variance VARSTOCASES Restructure complex data VERIFY Report time series WLS Weighted least squares regression XGRAPH High resolution charts Bugs bugs troubleshooting Occasionally you may encounter a bug in PSPP. If you believe you have found a bug, please make sure that it really is a bug. Sometimes, what may appear to be a bug, turns out to be a misunderstanding of how to use the program. If you are unsure, ask for advice on the pspp-users mailing list. Information about the mailing list is at http://lists.gnu.org/mailman/listinfo/pspp-users. It is also valuable to try the newest version of PSPP, since the problem may have already been fixed. You can always find the newest version of PSPP by visiting the PSPP website. You might have obtained PSPP from a downstream packager, such as a GNU/Linux distribution; if your downstream package is not up-to-date, please ask the distributor to update to the newest version. If the problem persists in the up-to-date version, check to see if it has already been reported. Reported issues are listed at http://savannah.gnu.org/bugs/?group=pspp. If it has already been reported, you might consider adding a comment with additional information or even just to mention that you are also experiencing the problem, since the PSPP developers are often inclined to work on issues that are important to a large number of users. For known issues in individual language features, see the relevant section in see Language. If the problem exists in a recent version and it has not already been reported, then please report it. How to report bugs The best way to send a bug report is using the web page at http://savannah.gnu.org/bugs/?group=pspp. Alternatively, bug reports may be sent by email to bug-gnu-pspp@gnu.org. A high-quality bug report allows the developers to understand, reproduce, and ultimately fix the problem. We recommend including the following: The version of PSPP in which you encountered the problem That means the precise version number. “The latest version” is often too ambiguous because releases happen quickly, and bug reports are archived indefinitely. The operating system and type of computer on which it is running. A sample of the syntax which causes the problem or, if it is a user interface problem, the sequence of steps required to reproduce it. Screenshots can be helpful for reporting bugs in the graphical user interface, especially since GUI bugs can arise on some systems but not others, but they do not usually help fixing other kinds of bugs. A description of what you think is wrong: What happened that you didn’t expect, and what did you expect to happen? Here is one example of a bug report that includes all of the elements above: When I run PSPP 0.8.4 on my GNU/Linux system, executing the following syntax: DATA LIST FREE /x *. BEGIN DATA. 1 2 3 END DATA. LIST. results in: 4 5 6 but I think the output should be: 1 2 3 The following bug report, on the other hand, does not provide enough information for PSPP developers to understand the problem. This means that the developers cannot identify or fix the problem without additional rounds of questions, which is more work for both the reporter and the developer: I downloaded the latest version of PSPP and entered a sequence of numbers, but when I analyse them it gives the wrong output. PSPP developers value all users’ feedback, but cannot promise an immediate response. The bug reporting is not a consultancy or support service, although you can make private arrangements for such services. Since PSPP is free software, consultants have access to the information they need to provide such support. For general enquiries or help, please use the pspp-users mailing list instead of the bug mailing list or bug tracker. The PSPP bug tracker and bug reporting mailing list are public. To privately report a security vulnerability in GNU PSPP, please send your report to the closed mailing list pspp-security@gnu.org. The PSPP developers will help you assess your report and fix problems prior to public disclosure. Function Index Command Index Concept Index GNU Free Documentation License Version 1.3, 3 November 2008 Copyright © 2000, 2001, 2002, 2007, 2008 Free Software Foundation, Inc. http://fsf.org/ Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. PREAMBLE The purpose of this License is to make a manual, textbook, or other functional and useful document free in the sense of freedom: to assure everyone the effective freedom to copy and redistribute it, with or without modifying it, either commercially or noncommercially. Secondarily, this License preserves for the author and publisher a way to get credit for their work, while not being considered responsible for modifications made by others. This License is a kind of “copyleft”, which means that derivative works of the document must themselves be free in the same sense. It complements the GNU General Public License, which is a copyleft license designed for free software. We have designed this License in order to use it for manuals for free software, because free software needs free documentation: a free program should come with manuals providing the same freedoms that the software does. But this License is not limited to software manuals; it can be used for any textual work, regardless of subject matter or whether it is published as a printed book. We recommend this License principally for works whose purpose is instruction or reference. APPLICABILITY AND DEFINITIONS This License applies to any manual or other work, in any medium, that contains a notice placed by the copyright holder saying it can be distributed under the terms of this License. Such a notice grants a world-wide, royalty-free license, unlimited in duration, to use that work under the conditions stated herein. The “Document”, below, refers to any such manual or work. Any member of the public is a licensee, and is addressed as “you”. You accept the license if you copy, modify or distribute the work in a way requiring permission under copyright law. A “Modified Version” of the Document means any work containing the Document or a portion of it, either copied verbatim, or with modifications and/or translated into another language. A “Secondary Section” is a named appendix or a front-matter section of the Document that deals exclusively with the relationship of the publishers or authors of the Document to the Document’s overall subject (or to related matters) and contains nothing that could fall directly within that overall subject. (Thus, if the Document is in part a textbook of mathematics, a Secondary Section may not explain any mathematics.) The relationship could be a matter of historical connection with the subject or with related matters, or of legal, commercial, philosophical, ethical or political position regarding them. The “Invariant Sections” are certain Secondary Sections whose titles are designated, as being those of Invariant Sections, in the notice that says that the Document is released under this License. If a section does not fit the above definition of Secondary then it is not allowed to be designated as Invariant. The Document may contain zero Invariant Sections. If the Document does not identify any Invariant Sections then there are none. The “Cover Texts” are certain short passages of text that are listed, as Front-Cover Texts or Back-Cover Texts, in the notice that says that the Document is released under this License. A Front-Cover Text may be at most 5 words, and a Back-Cover Text may be at most 25 words. A “Transparent” copy of the Document means a machine-readable copy, represented in a format whose specification is available to the general public, that is suitable for revising the document straightforwardly with generic text editors or (for images composed of pixels) generic paint programs or (for drawings) some widely available drawing editor, and that is suitable for input to text formatters or for automatic translation to a variety of formats suitable for input to text formatters. A copy made in an otherwise Transparent file format whose markup, or absence of markup, has been arranged to thwart or discourage subsequent modification by readers is not Transparent. An image format is not Transparent if used for any substantial amount of text. A copy that is not “Transparent” is called “Opaque”. Examples of suitable formats for Transparent copies include plain ASCII without markup, Texinfo input format, La&tex; input format, SGML or XML using a publicly available DTD, and standard-conforming simple HTML, PostScript or PDF designed for human modification. Examples of transparent image formats include PNG, XCF and JPG. Opaque formats include proprietary formats that can be read and edited only by proprietary word processors, SGML or XML for which the DTD and/or processing tools are not generally available, and the machine-generated HTML, PostScript or PDF produced by some word processors for output purposes only. The “Title Page” means, for a printed book, the title page itself, plus such following pages as are needed to hold, legibly, the material this License requires to appear in the title page. For works in formats which do not have any title page as such, “Title Page” means the text near the most prominent appearance of the work’s title, preceding the beginning of the body of the text. The “publisher” means any person or entity that distributes copies of the Document to the public. A section “Entitled XYZ” means a named subunit of the Document whose title either is precisely XYZ or contains XYZ in parentheses following text that translates XYZ in another language. (Here XYZ stands for a specific section name mentioned below, such as “Acknowledgements”, “Dedications”, “Endorsements”, or “History”.) To “Preserve the Title” of such a section when you modify the Document means that it remains a section “Entitled XYZ” according to this definition. The Document may include Warranty Disclaimers next to the notice which states that this License applies to the Document. These Warranty Disclaimers are considered to be included by reference in this License, but only as regards disclaiming warranties: any other implication that these Warranty Disclaimers may have is void and has no effect on the meaning of this License. VERBATIM COPYING You may copy and distribute the Document in any medium, either commercially or noncommercially, provided that this License, the copyright notices, and the license notice saying this License applies to the Document are reproduced in all copies, and that you add no other conditions whatsoever to those of this License. You may not use technical measures to obstruct or control the reading or further copying of the copies you make or distribute. However, you may accept compensation in exchange for copies. If you distribute a large enough number of copies you must also follow the conditions in section 3. You may also lend copies, under the same conditions stated above, and you may publicly display copies. COPYING IN QUANTITY If you publish printed copies (or copies in media that commonly have printed covers) of the Document, numbering more than 100, and the Document’s license notice requires Cover Texts, you must enclose the copies in covers that carry, clearly and legibly, all these Cover Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on the back cover. Both covers must also clearly and legibly identify you as the publisher of these copies. The front cover must present the full title with all words of the title equally prominent and visible. You may add other material on the covers in addition. Copying with changes limited to the covers, as long as they preserve the title of the Document and satisfy these conditions, can be treated as verbatim copying in other respects. If the required texts for either cover are too voluminous to fit legibly, you should put the first ones listed (as many as fit reasonably) on the actual cover, and continue the rest onto adjacent pages. If you publish or distribute Opaque copies of the Document numbering more than 100, you must either include a machine-readable Transparent copy along with each Opaque copy, or state in or with each Opaque copy a computer-network location from which the general network-using public has access to download using public-standard network protocols a complete Transparent copy of the Document, free of added material. If you use the latter option, you must take reasonably prudent steps, when you begin distribution of Opaque copies in quantity, to ensure that this Transparent copy will remain thus accessible at the stated location until at least one year after the last time you distribute an Opaque copy (directly or through your agents or retailers) of that edition to the public. It is requested, but not required, that you contact the authors of the Document well before redistributing any large number of copies, to give them a chance to provide you with an updated version of the Document. MODIFICATIONS You may copy and distribute a Modified Version of the Document under the conditions of sections 2 and 3 above, provided that you release the Modified Version under precisely this License, with the Modified Version filling the role of the Document, thus licensing distribution and modification of the Modified Version to whoever possesses a copy of it. In addition, you must do these things in the Modified Version: Use in the Title Page (and on the covers, if any) a title distinct from that of the Document, and from those of previous versions (which should, if there were any, be listed in the History section of the Document). You may use the same title as a previous version if the original publisher of that version gives permission. List on the Title Page, as authors, one or more persons or entities responsible for authorship of the modifications in the Modified Version, together with at least five of the principal authors of the Document (all of its principal authors, if it has fewer than five), unless they release you from this requirement. State on the Title page the name of the publisher of the Modified Version, as the publisher. Preserve all the copyright notices of the Document. Add an appropriate copyright notice for your modifications adjacent to the other copyright notices. Include, immediately after the copyright notices, a license notice giving the public permission to use the Modified Version under the terms of this License, in the form shown in the Addendum below. Preserve in that license notice the full lists of Invariant Sections and required Cover Texts given in the Document’s license notice. Include an unaltered copy of this License. Preserve the section Entitled “History”, Preserve its Title, and add to it an item stating at least the title, year, new authors, and publisher of the Modified Version as given on the Title Page. If there is no section Entitled “History” in the Document, create one stating the title, year, authors, and publisher of the Document as given on its Title Page, then add an item describing the Modified Version as stated in the previous sentence. Preserve the network location, if any, given in the Document for public access to a Transparent copy of the Document, and likewise the network locations given in the Document for previous versions it was based on. These may be placed in the “History” section. You may omit a network location for a work that was published at least four years before the Document itself, or if the original publisher of the version it refers to gives permission. For any section Entitled “Acknowledgements” or “Dedications”, Preserve the Title of the section, and preserve in the section all the substance and tone of each of the contributor acknowledgements and/or dedications given therein. Preserve all the Invariant Sections of the Document, unaltered in their text and in their titles. Section numbers or the equivalent are not considered part of the section titles. Delete any section Entitled “Endorsements”. Such a section may not be included in the Modified Version. Do not retitle any existing section to be Entitled “Endorsements” or to conflict in title with any Invariant Section. Preserve any Warranty Disclaimers. If the Modified Version includes new front-matter sections or appendices that qualify as Secondary Sections and contain no material copied from the Document, you may at your option designate some or all of these sections as invariant. To do this, add their titles to the list of Invariant Sections in the Modified Version’s license notice. These titles must be distinct from any other section titles. You may add a section Entitled “Endorsements”, provided it contains nothing but endorsements of your Modified Version by various parties—for example, statements of peer review or that the text has been approved by an organization as the authoritative definition of a standard. You may add a passage of up to five words as a Front-Cover Text, and a passage of up to 25 words as a Back-Cover Text, to the end of the list of Cover Texts in the Modified Version. Only one passage of Front-Cover Text and one of Back-Cover Text may be added by (or through arrangements made by) any one entity. If the Document already includes a cover text for the same cover, previously added by you or by arrangement made by the same entity you are acting on behalf of, you may not add another; but you may replace the old one, on explicit permission from the previous publisher that added the old one. The author(s) and publisher(s) of the Document do not by this License give permission to use their names for publicity for or to assert or imply endorsement of any Modified Version. COMBINING DOCUMENTS You may combine the Document with other documents released under this License, under the terms defined in section 4 above for modified versions, provided that you include in the combination all of the Invariant Sections of all of the original documents, unmodified, and list them all as Invariant Sections of your combined work in its license notice, and that you preserve all their Warranty Disclaimers. The combined work need only contain one copy of this License, and multiple identical Invariant Sections may be replaced with a single copy. If there are multiple Invariant Sections with the same name but different contents, make the title of each such section unique by adding at the end of it, in parentheses, the name of the original author or publisher of that section if known, or else a unique number. Make the same adjustment to the section titles in the list of Invariant Sections in the license notice of the combined work. In the combination, you must combine any sections Entitled “History” in the various original documents, forming one section Entitled “History”; likewise combine any sections Entitled “Acknowledgements”, and any sections Entitled “Dedications”. You must delete all sections Entitled “Endorsements.” COLLECTIONS OF DOCUMENTS You may make a collection consisting of the Document and other documents released under this License, and replace the individual copies of this License in the various documents with a single copy that is included in the collection, provided that you follow the rules of this License for verbatim copying of each of the documents in all other respects. You may extract a single document from such a collection, and distribute it individually under this License, provided you insert a copy of this License into the extracted document, and follow this License in all other respects regarding verbatim copying of that document. AGGREGATION WITH INDEPENDENT WORKS A compilation of the Document or its derivatives with other separate and independent documents or works, in or on a volume of a storage or distribution medium, is called an “aggregate” if the copyright resulting from the compilation is not used to limit the legal rights of the compilation’s users beyond what the individual works permit. When the Document is included in an aggregate, this License does not apply to the other works in the aggregate which are not themselves derivative works of the Document. If the Cover Text requirement of section 3 is applicable to these copies of the Document, then if the Document is less than one half of the entire aggregate, the Document’s Cover Texts may be placed on covers that bracket the Document within the aggregate, or the electronic equivalent of covers if the Document is in electronic form. Otherwise they must appear on printed covers that bracket the whole aggregate. TRANSLATION Translation is considered a kind of modification, so you may distribute translations of the Document under the terms of section 4. Replacing Invariant Sections with translations requires special permission from their copyright holders, but you may include translations of some or all Invariant Sections in addition to the original versions of these Invariant Sections. You may include a translation of this License, and all the license notices in the Document, and any Warranty Disclaimers, provided that you also include the original English version of this License and the original versions of those notices and disclaimers. In case of a disagreement between the translation and the original version of this License or a notice or disclaimer, the original version will prevail. If a section in the Document is Entitled “Acknowledgements”, “Dedications”, or “History”, the requirement (section 4) to Preserve its Title (section 1) will typically require changing the actual title. TERMINATION You may not copy, modify, sublicense, or distribute the Document except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, or distribute it is void, and will automatically terminate your rights under this License. However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, receipt of a copy of some or all of the same material does not give you any rights to use it. FUTURE REVISIONS OF THIS LICENSE The Free Software Foundation may publish new, revised versions of the GNU Free Documentation 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. See http://www.gnu.org/copyleft/. Each version of the License is given a distinguishing version number. If the Document specifies that a particular numbered version of this License “or any later version” applies to it, you have the option of following the terms and conditions either of that specified version or of any later version that has been published (not as a draft) by the Free Software Foundation. If the Document does not specify a version number of this License, you may choose any version ever published (not as a draft) by the Free Software Foundation. If the Document specifies that a proxy can decide which future versions of this License can be used, that proxy’s public statement of acceptance of a version permanently authorizes you to choose that version for the Document. RELICENSING “Massive Multiauthor Collaboration Site” (or “MMC Site”) means any World Wide Web server that publishes copyrightable works and also provides prominent facilities for anybody to edit those works. A public wiki that anybody can edit is an example of such a server. A “Massive Multiauthor Collaboration” (or “MMC”) contained in the site means any set of copyrightable works thus published on the MMC site. “CC-BY-SA” means the Creative Commons Attribution-Share Alike 3.0 license published by Creative Commons Corporation, a not-for-profit corporation with a principal place of business in San Francisco, California, as well as future copyleft versions of that license published by that same organization. “Incorporate” means to publish or republish a Document, in whole or in part, as part of another Document. An MMC is “eligible for relicensing” if it is licensed under this License, and if all works that were first published under this License somewhere other than this MMC, and subsequently incorporated in whole or in part into the MMC, (1) had no cover texts or invariant sections, and (2) were thus incorporated prior to November 1, 2008. The operator of an MMC Site may republish an MMC contained in the site under CC-BY-SA on the same site at any time before August 1, 2009, provided the MMC is eligible for relicensing. ADDENDUM: How to use this License for your documents To use this License in a document you have written, include a copy of the License in the document and put the following copyright and license notices just after the title page: Copyright (C) year your name. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included in the section entitled ``GNU Free Documentation License''. If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts, replace the “with…Texts.” line with this: with the Invariant Sections being list their titles, with the Front-Cover Texts being list, and with the Back-Cover Texts being list. If you have Invariant Sections without Cover Texts, or some other combination of the three, merge those two alternatives to suit the situation. If your document contains nontrivial examples of program code, we recommend releasing these examples in parallel under your choice of free software license, such as the GNU General Public License, to permit their use in free software.
pspp-1.4.1/doc/stamp-10000644000175000017500000000014413725007447014075 0ustar00blpblp00000000000000@set UPDATED 2 December 2019 @set UPDATED-MONTH December 2019 @set EDITION 1.4.1 @set VERSION 1.4.1 pspp-1.4.1/doc/utilities.texi0000644000175000017500000010030413723574241015574 0ustar00blpblp00000000000000@c PSPP - a program for statistical analysis. @c Copyright (C) 2017 Free Software Foundation, Inc. @c Permission is granted to copy, distribute and/or modify this document @c under the terms of the GNU Free Documentation License, Version 1.3 @c or any later version published by the Free Software Foundation; @c with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. @c A copy of the license is included in the section entitled "GNU @c Free Documentation License". @c @node Utilities @chapter Utilities Commands that don't fit any other category are placed here. Most of these commands are not affected by commands like @cmd{IF} and @cmd{LOOP}: they take effect only once, unconditionally, at the time that they are encountered in the input. @menu * ADD DOCUMENT:: Add documentary text to the active dataset. * CACHE:: Ignored for compatibility. * CD:: Change the current directory. * COMMENT:: Document your syntax file. * DOCUMENT:: Document the active dataset. * DISPLAY DOCUMENTS:: Display active dataset documents. * DISPLAY FILE LABEL:: Display the active dataset label. * DROP DOCUMENTS:: Remove documents from the active dataset. * ECHO:: Write a string to the output stream. * ERASE:: Erase a file. * EXECUTE:: Execute pending transformations. * FILE LABEL:: Set the active dataset's label. * FINISH:: Terminate the @pspp{} session. * HOST:: Temporarily return to the operating system. * INCLUDE:: Include a file within the current one. * INSERT:: Insert a file within the current one. * OUTPUT:: Modify the appearance of the output. * PERMISSIONS:: Change permissions on a file. * PRESERVE and RESTORE:: Saving settings and restoring them later. * SET:: Adjust @pspp{} runtime parameters. * SHOW:: Display runtime parameters. * SUBTITLE:: Provide a document subtitle. * TITLE:: Provide a document title. @end menu @node ADD DOCUMENT @section ADD DOCUMENT @vindex ADD DOCUMENT @display ADD DOCUMENT 'line one' 'line two' @dots{} 'last line' . @end display @cmd{ADD DOCUMENT} adds one or more lines of descriptive commentary to the active dataset. Documents added in this way are saved to system files. They can be viewed using @cmd{SYSFILE INFO} or @cmd{DISPLAY DOCUMENTS}. They can be removed from the active dataset with @cmd{DROP DOCUMENTS}. Each line of documentary text must be enclosed in quotation marks, and may not be more than 80 bytes long. @xref{DOCUMENT}. @node CACHE @section CACHE @vindex CACHE @display CACHE. @end display This command is accepted, for compatibility, but it has no effect. @node CD @section CD @vindex CD @cindex directory @cindex changing directory @display CD 'new directory' . @end display @cmd{CD} changes the current directory. The new directory will become that specified by the command. @node COMMENT @section COMMENT @vindex COMMENT @vindex * @display Comment commands: COMMENT comment text @dots{} . *comment text @dots{} . Comments within a line of syntax: FREQUENCIES /VARIABLES=v0 v1 v2. /* All our categorical variables. @end display @cmd{COMMENT} is ignored. It is used to provide information to the author and other readers of the @pspp{} syntax file. @cmd{COMMENT} can extend over any number of lines. It ends at a dot at the end of a line or a blank line. The comment may contain any characters. PSPP also supports comments within a line of syntax, introduced with @samp{/*}. These comments end at the first @samp{*/} or at the end of the line, whichever comes first. A line that contains just this kind of comment is considered blank and ends the current command. @node DOCUMENT @section DOCUMENT @vindex DOCUMENT @display DOCUMENT @var{documentary_text}. @end display @cmd{DOCUMENT} adds one or more lines of descriptive commentary to the active dataset. Documents added in this way are saved to system files. They can be viewed using @cmd{SYSFILE INFO} or @cmd{DISPLAY DOCUMENTS}. They can be removed from the active dataset with @cmd{DROP DOCUMENTS}. Specify the @var{documentary text} following the @subcmd{DOCUMENT} keyword. It is interpreted literally---any quotes or other punctuation marks will be included in the file. You can extend the documentary text over as many lines as necessary, including blank lines to separate paragraphs. Lines are truncated at 80 bytes. Don't forget to terminate the command with a dot at the end of a line. @xref{ADD DOCUMENT}. @node DISPLAY DOCUMENTS @section DISPLAY DOCUMENTS @vindex DISPLAY DOCUMENTS @display DISPLAY DOCUMENTS. @end display @cmd{DISPLAY DOCUMENTS} displays the documents in the active dataset. Each document is preceded by a line giving the time and date that it was added. @xref{DOCUMENT}. @node DISPLAY FILE LABEL @section DISPLAY FILE LABEL @vindex DISPLAY FILE LABEL @display DISPLAY FILE LABEL. @end display @cmd{DISPLAY FILE LABEL} displays the file label contained in the active dataset, if any. @xref{FILE LABEL}. This command is a @pspp{} extension. @node DROP DOCUMENTS @section DROP DOCUMENTS @vindex DROP DOCUMENTS @display DROP DOCUMENTS. @end display @cmd{DROP DOCUMENTS} removes all documents from the active dataset. New documents can be added with @cmd{DOCUMENT} (@pxref{DOCUMENT}). @cmd{DROP DOCUMENTS} changes only the active dataset. It does not modify any system files stored on disk. @node ECHO @section ECHO @vindex ECHO @display ECHO 'arbitrary text' . @end display Use @cmd{ECHO} to write arbitrary text to the output stream. The text should be enclosed in quotation marks following the normal rules for string tokens (@pxref{Tokens}). @node ERASE @section ERASE @vindex ERASE @display ERASE FILE @var{file_name}. @end display @cmd{ERASE FILE} deletes a file from the local file system. @var{file_name} must be quoted. This command cannot be used if the SAFER (@pxref{SET}) setting is active. @node EXECUTE @section EXECUTE @vindex EXECUTE @display EXECUTE. @end display @cmd{EXECUTE} causes the active dataset to be read and all pending transformations to be executed. @node FILE LABEL @section FILE LABEL @vindex FILE LABEL @display FILE LABEL @var{file_label}. @end display @cmd{FILE LABEL} provides a title for the active dataset. This title will be saved into system files and portable files that are created during this @pspp{} run. @var{file_label} should not be quoted. If quotes are included, they are literally interpreted and become part of the file label. @node FINISH @section FINISH @vindex FINISH @display FINISH. @end display @cmd{FINISH} terminates the current @pspp{} session and returns control to the operating system. @node HOST @section HOST @vindex HOST In the syntax below, the square brackets must be included in the command syntax and do not indicate that that their contents are optional. @display HOST COMMAND=['@var{command}'...] TIMELIMIT=@var{secs}. @end display @cmd{HOST} executes one or more commands, each provided as a string in the required @subcmd{COMMAND} subcommand, in the shell of the underlying operating system. PSPP runs each command in a separate shell process and waits for it to finish before running the next one. If a command fails (with a nonzero exit status, or because it is killed by a signal), then PSPP does not run any remaining commands. PSPP provides @file{/dev/null} as the shell's standard input. If a process needs to read from stdin, redirect from a file or device, or use a pipe. PSPP displays the shell's standard output and standard error as PSPP output. Redirect to a file or @code{/dev/null} or another device if this is not desired. The following example runs @code{rsync} to copy a file from a remote server to the local file @file{data.txt}, writing @code{rsync}'s own output to @file{rsync-log.txt}. PSPP displays the command's error output, if any. If @code{rsync} needs to prompt the user (e.g.@: to obtain a password), the command fails. Only if the @code{rsync} succeeds, PSPP then runs the @code{sha512sum} command. @example HOST COMMAND=['rsync remote:data.txt data.txt > rsync-log.txt' 'sha512sum -c data.txt.sha512sum]. @end example By default, PSPP waits as long as necessary for the series of commands to complete. Use the optional @subcmd{TIMELIMIT} subcommand to limit the execution time to the specified number of seconds. PSPP built for mingw does not support all the features of @subcmd{HOST}. PSPP rejects this command if the SAFER (@pxref{SET}) setting is active. @node INCLUDE @section INCLUDE @vindex INCLUDE @display INCLUDE [FILE=]'@var{file_name}' [ENCODING='@var{encoding}']. @end display @cmd{INCLUDE} causes the @pspp{} command processor to read an additional command file as if it were included bodily in the current command file. If errors are encountered in the included file, then command processing will stop and no more commands will be processed. Include files may be nested to any depth, up to the limit of available memory. The @cmd{INSERT} command (@pxref{INSERT}) is a more flexible alternative to @cmd{INCLUDE}. An @cmd{INCLUDE} command acts the same as @cmd{INSERT} with @subcmd{ERROR=STOP CD=NO SYNTAX=BATCH} specified. The optional @subcmd{ENCODING} subcommand has the same meaning as with @cmd{INSERT}. @node INSERT @section INSERT @vindex INSERT @display INSERT [FILE=]'@var{file_name}' [CD=@{NO,YES@}] [ERROR=@{CONTINUE,STOP@}] [SYNTAX=@{BATCH,INTERACTIVE@}] [ENCODING=@{LOCALE, '@var{charset_name}'@}]. @end display @cmd{INSERT} is similar to @cmd{INCLUDE} (@pxref{INCLUDE}) but somewhat more flexible. It causes the command processor to read a file as if it were embedded in the current command file. If @subcmd{CD=YES} is specified, then before including the file, the current directory will be changed to the directory of the included file. The default setting is @samp{CD=NO}. Note that this directory will remain current until it is changed explicitly (with the @cmd{CD} command, or a subsequent @cmd{INSERT} command with the @samp{CD=YES} option). It will not revert to its original setting even after the included file is finished processing. If @subcmd{ERROR=STOP} is specified, errors encountered in the inserted file will cause processing to immediately cease. Otherwise processing will continue at the next command. The default setting is @subcmd{ERROR=CONTINUE}. If @subcmd{SYNTAX=INTERACTIVE} is specified then the syntax contained in the included file must conform to interactive syntax conventions. @xref{Syntax Variants}. The default setting is @subcmd{SYNTAX=BATCH}. @subcmd{ENCODING} optionally specifies the character set used by the included file. Its argument, which is not case-sensitive, must be in one of the following forms: @table @asis @item @subcmd{LOCALE} The encoding used by the system locale, or as overridden by the @cmd{SET} command (@pxref{SET}). On GNU/Linux and other Unix-like systems, environment variables, e.g.@: @env{LANG} or @env{LC_ALL}, determine the system locale. @item @var{charset_name} One of the character set names listed by @acronym{IANA} at @uref{http://www.iana.org/assignments/character-sets}. Some examples are @code{ASCII} (United States), @code{ISO-8859-1} (western Europe), @code{EUC-JP} (Japan), and @code{windows-1252} (Windows). Not all systems support all character sets. @item @code{Auto,@var{encoding}} Automatically detects whether a syntax file is encoded in an Unicode encoding such as UTF-8, UTF-16, or UTF-32. If it is not, then @pspp{} generally assumes that the file is encoded in @var{encoding} (an @acronym{IANA} character set name). However, if @var{encoding} is UTF-8, and the syntax file is not valid UTF-8, @pspp{} instead assumes that the file is encoded in @code{windows-1252}. For best results, @var{encoding} should be an @acronym{ASCII}-compatible encoding (the most common locale encodings are all @acronym{ASCII}-compatible), because encodings that are not @acronym{ASCII} compatible cannot be automatically distinguished from UTF-8. @item @code{Auto} @item @code{Auto,Locale} Automatic detection, as above, with the default encoding taken from the system locale or the setting on @subcmd{SET LOCALE}. @end table When ENCODING is not specified, the default is taken from the @option{--syntax-encoding} command option, if it was specified, and otherwise it is @code{Auto}. @node OUTPUT @section OUTPUT @vindex OUTPUT @cindex precision, of output @cindex decimal places @display OUTPUT MODIFY /SELECT TABLES /TABLECELLS SELECT = [ @var{class}... ] FORMAT = @var{fmt_spec}. @end display @note{In the above synopsis the characters @samp{[} and @samp{]} are literals. They must appear in the syntax to be interpreted.} @cmd{OUTPUT} changes the appearance of the tables in which results are printed. In particular, it can be used to set the format and precision to which results are displayed. After running this command, the default table appearance parameters will have been modified and each new output table generated will use the new parameters. Following @code{/TABLECELLS SELECT =} a list of cell classes must appear, enclosed in square brackets. This list determines the classes of values should be selected for modification. Each class can be: @table @asis @item RESIDUAL Residual values. Default: @t{F40.2}. @item CORRELATION Correlations. Default: @t{F40.3}. @item PERCENT Percentages. Default: @t{PCT40.1}. @item SIGNIFICANCE Significance of tests (p-values). Default: @t{F40.3}. @item COUNT Counts or sums of weights. For a weighted data set, the default is the weight variable's print format. For an unweighted data set, the default is F40.0. @end table For most other numeric values that appear in tables, @code{SET FORMAT} may be used to specify the format (@pxref{SET FORMAT}). The value of @var{fmt_spec} must be a valid output format (@pxref{Input and Output Formats}). Note that not all possible formats are meaningful for all classes. @node PERMISSIONS @section PERMISSIONS @vindex PERMISSIONS @cindex mode @cindex file mode @cindex changing file permissions @display PERMISSIONS FILE='@var{file_name}' /PERMISSIONS = @{READONLY,WRITEABLE@}. @end display @cmd{PERMISSIONS} changes the permissions of a file. There is one mandatory subcommand which specifies the permissions to which the file should be changed. If you set a file's permission to @subcmd{READONLY}, then the file will become unwritable either by you or anyone else on the system. If you set the permission to @subcmd{WRITEABLE}, then the file will become writeable by you; the permissions afforded to others will be unchanged. This command cannot be used if the @subcmd{SAFER} (@pxref{SET}) setting is active. @node PRESERVE and RESTORE @section PRESERVE and RESTORE @vindex PRESERVE @vindex RESTORE @display PRESERVE. @dots{} RESTORE. @end display @cmd{PRESERVE} saves all of the settings that @cmd{SET} (@pxref{SET}) can adjust. A later @cmd{RESTORE} command restores those settings. @cmd{PRESERVE} can be nested up to five levels deep. @node SET @section SET @vindex SET @display SET (data input) /BLANKS=@{SYSMIS,'.',number@} /DECIMAL=@{DOT,COMMA@} /FORMAT=@var{fmt_spec} /EPOCH=@{AUTOMATIC,@var{year}@} /RIB=@{NATIVE,MSBFIRST,LSBFIRST,VAX@} /RRB=@{NATIVE,ISL,ISB,IDL,IDB,VF,VD,VG,ZS,ZL@} (interaction) /MXERRS=@var{max_errs} /MXWARNS=@var{max_warnings} /WORKSPACE=@var{workspace_size} (syntax execution) /LOCALE='@var{locale}' /MEXPAND=@{ON,OFF@} /MITERATE=@var{max_iterations} /MNEST=@var{max_nest} /MPRINT=@{ON,OFF@} /MXLOOPS=@var{max_loops} /SEED=@{RANDOM,@var{seed_value}@} /UNDEFINED=@{WARN,NOWARN@} /FUZZBITS=@var{fuzzbits} (data output) /CC@{A,B,C,D,E@}=@{'@var{npre},@var{pre},@var{suf},@var{nsuf}','@var{npre}.@var{pre}.@var{suf}.@var{nsuf}'@} /DECIMAL=@{DOT,COMMA@} /FORMAT=@var{fmt_spec} /WIB=@{NATIVE,MSBFIRST,LSBFIRST,VAX@} /WRB=@{NATIVE,ISL,ISB,IDL,IDB,VF,VD,VG,ZS,ZL@} (output routing) /ERRORS=@{ON,OFF,TERMINAL,LISTING,BOTH,NONE@} /MESSAGES=@{ON,OFF,TERMINAL,LISTING,BOTH,NONE@} /PRINTBACK=@{ON,OFF,TERMINAL,LISTING,BOTH,NONE@} /RESULTS=@{ON,OFF,TERMINAL,LISTING,BOTH,NONE@} (output driver options) /HEADERS=@{NO,YES,BLANK@} /LENGTH=@{NONE,@var{n_lines}@} /WIDTH=@{NARROW,WIDTH,@var{n_characters}@} /TNUMBERS=@{VALUES,LABELS,BOTH@} /TVARS=@{NAMES,LABELS,BOTH@} (logging) /JOURNAL=@{ON,OFF@} ['@var{file_name}'] (system files) /COMPRESSION=@{ON,OFF@} /SCOMPRESSION=@{ON,OFF@} (miscellaneous) /SAFER=ON /LOCALE='@var{string}' (obsolete settings accepted for compatibility, but ignored) /BOXSTRING=@{'@var{xxx}','@var{xxxxxxxxxxx}'@} /CASE=@{UPPER,UPLOW@} /CPI=cpi_value /HIGHRES=@{ON,OFF@} /HISTOGRAM='@var{c}' /LOWRES=@{AUTO,ON,OFF@} /LPI=@var{lpi_value} /MENUS=@{STANDARD,EXTENDED@} /MXMEMORY=@var{max_memory} /SCRIPTTAB='c' /TB1=@{'@var{xxx}','@var{xxxxxxxxxxx}'@} /TBFONTS='@var{string}' /XSORT=@{YES,NO@} @end display @cmd{SET} allows the user to adjust several parameters relating to @pspp{}'s execution. Since there are many subcommands to this command, its subcommands will be examined in groups. For subcommands that take boolean values, @subcmd{ON} and @subcmd{YES} are synonymous, as are @subcmd{OFF} and @subcmd{NO}, when used as subcommand values. The data input subcommands affect the way that data is read from data files. The data input subcommands are @table @asis @item BLANKS @anchor{SET BLANKS} This is the value assigned to an item data item that is empty or contains only white space. An argument of SYSMIS or '.' will cause the system-missing value to be assigned to null items. This is the default. Any real value may be assigned. @item DECIMAL @anchor{SET DECIMAL} This value may be set to @subcmd{DOT} or @subcmd{COMMA}. Setting it to @subcmd{DOT} causes the decimal point character to be @samp{.} and the grouping character to be @samp{,}. Setting it to @subcmd{COMMA} causes the decimal point character to be @samp{,} and the grouping character to be @samp{.}. If the setting is @subcmd{COMMA}, then @samp{,} will not be treated as a field separator in the @cmd{DATA LIST} command (@pxref{DATA LIST}). The default value is determined from the system locale. @item FORMAT @anchor{SET FORMAT} Allows the default numeric input/output format to be specified. The default is F8.2. @xref{Input and Output Formats}. @item EPOCH @anchor{SET EPOCH} Specifies the range of years used when a 2-digit year is read from a data file or used in a date construction expression (@pxref{Date Construction}). If a 4-digit year is specified for the epoch, then 2-digit years are interpreted starting from that year, known as the epoch. If @subcmd{AUTOMATIC} (the default) is specified, then the epoch begins 69 years before the current date. @item RIB @anchor{SET RIB} @pspp{} extension to set the byte ordering (endianness) used for reading data in IB or PIB format (@pxref{Binary and Hexadecimal Numeric Formats}). In @subcmd{MSBFIRST} ordering, the most-significant byte appears at the left end of a IB or PIB field. In @subcmd{LSBFIRST} ordering, the least-significant byte appears at the left end. @subcmd{VAX} ordering is like @subcmd{MSBFIRST}, except that each pair of bytes is in reverse order. @subcmd{NATIVE}, the default, is equivalent to @subcmd{MSBFIRST} or @subcmd{LSBFIRST} depending on the native format of the machine running @pspp{}. @item RRB @anchor{SET RRB} @pspp{} extension to set the floating-point format used for reading data in RB format (@pxref{Binary and Hexadecimal Numeric Formats}). The possibilities are: @table @asis @item NATIVE The native format of the machine running @pspp{}. Equivalent to either IDL or IDB. @item ISL 32-bit IEEE 754 single-precision floating point, in little-endian byte order. @item ISB 32-bit IEEE 754 single-precision floating point, in big-endian byte order. @item IDL 64-bit IEEE 754 double-precision floating point, in little-endian byte order. @item IDB 64-bit IEEE 754 double-precision floating point, in big-endian byte order. @item VF 32-bit VAX F format, in VAX-endian byte order. @item VD 64-bit VAX D format, in VAX-endian byte order. @item VG 64-bit VAX G format, in VAX-endian byte order. @item ZS 32-bit IBM Z architecture short format hexadecimal floating point, in big-endian byte order. @item ZL 64-bit IBM Z architecture long format hexadecimal floating point, in big-endian byte order. Z architecture also supports IEEE 754 floating point. The ZS and ZL formats are only for use with very old input files. @end table The default is NATIVE. @end table Interaction subcommands affect the way that @pspp{} interacts with an online user. The interaction subcommands are @table @asis @item MXERRS The maximum number of errors before @pspp{} halts processing of the current command file. The default is 50. @item MXWARNS The maximum number of warnings + errors before @pspp{} halts processing the current command file. The special value of zero means that all warning situations should be ignored. No warnings will be issued, except a single initial warning advising the user that warnings will not be given. The default value is 100. @end table Syntax execution subcommands control the way that @pspp{} commands execute. The syntax execution subcommands are @table @asis @item LOCALE Overrides the system locale for the purpose of reading and writing syntax and data files. The argument should be a locale name in the general form @code{@var{language}_@var{country}.@var{encoding}}, where @var{language} and @var{country} are 2-character language and country abbreviations, respectively, and @var{encoding} is an @acronym{IANA} character set name. Example locales are @code{en_US.UTF-8} (UTF-8 encoded English as spoken in the United States) and @code{ja_JP.EUC-JP} (EUC-JP encoded Japanese as spoken in Japan). @item MEXPAND @itemx MITERATE @itemx MNEST @itemx MPRINT Currently not used. @item MXLOOPS The maximum number of iterations for an uncontrolled loop (@pxref{LOOP}). The default @var{max_loops} is 40. @item SEED The initial pseudo-random number seed. Set to a real number or to RANDOM, which will obtain an initial seed from the current time of day. @item UNDEFINED Currently not used. @item FUZZBITS @anchor{SET FUZZBITS} The maximum number of bits of errors in the least-significant places to accept for rounding up a value that is almost halfway between two possibilities for rounding with the RND operator (@pxref{Miscellaneous Mathematics}). The default @var{fuzzbits} is 6. @item WORKSPACE The maximum amount of memory (in kilobytes) that @pspp{} will use to store data being processed. If memory in excess of the workspace size is required, then @pspp{} will start to use temporary files to store the data. Setting a higher value will, in general, mean procedures will run faster, but may cause other applications to run slower. On platforms without virtual memory management, setting a very large workspace may cause @pspp{} to abort. @cindex workspace @cindex memory, amount used to store cases @end table Data output subcommands affect the format of output data. These subcommands are @table @asis @item CCA @itemx CCB @itemx CCC @itemx CCD @itemx CCE @anchor{CCx Settings} Set up custom currency formats. @xref{Custom Currency Formats}, for details. @item DECIMAL The default @subcmd{DOT} setting causes the decimal point character to be @samp{.}. A setting of @subcmd{COMMA} causes the decimal point character to be @samp{,}. @item FORMAT Allows the default numeric input/output format to be specified. The default is F8.2. @xref{Input and Output Formats}. @item WIB @anchor{SET WIB} @pspp{} extension to set the byte ordering (endianness) used for writing data in IB or PIB format (@pxref{Binary and Hexadecimal Numeric Formats}). In @subcmd{MSBFIRST} ordering, the most-significant byte appears at the left end of a IB or PIB field. In @subcmd{LSBFIRST} ordering, the least-significant byte appears at the left end. @subcmd{VAX} ordering is like @subcmd{MSBFIRST}, except that each pair of bytes is in reverse order. @subcmd{NATIVE}, the default, is equivalent to @subcmd{MSBFIRST} or @subcmd{LSBFIRST} depending on the native format of the machine running @pspp{}. @item WRB @anchor{SET WRB} @pspp{} extension to set the floating-point format used for writing data in RB format (@pxref{Binary and Hexadecimal Numeric Formats}). The choices are the same as @subcmd{SET RIB}. The default is @subcmd{NATIVE}. @end table In the @pspp{} text-based interface, the output routing subcommands affect where output is sent. The following values are allowed for each of these subcommands: @table @asis @item OFF @item NONE Discard this kind of output. @item TERMINAL Write this output to the terminal, but not to listing files and other output devices. @item LISTING Write this output to listing files and other output devices, but not to the terminal. @item ON @itemx BOTH Write this type of output to all output devices. @end table These output routing subcommands are: @table @asis @item ERRORS Applies to error and warning messages. The default is @subcmd{BOTH}. @item MESSAGES Applies to notes. The default is @subcmd{BOTH}. @item PRINTBACK Determines whether the syntax used for input is printed back as part of the output. The default is @subcmd{NONE}. @item RESULTS Applies to everything not in one of the above categories, such as the results of statistical procedures. The default is @subcmd{BOTH}. @end table These subcommands have no effect on output in the @pspp{} GUI environment. Output driver option subcommands affect output drivers' settings. These subcommands are @table @asis @item HEADERS @itemx LENGTH @itemx WIDTH @itemx TNUMBERS The @subcmd{TNUMBERS} option sets the way in which values are displayed in output tables. The valid settings are @subcmd{VALUES}, @subcmd{LABELS} and @subcmd{BOTH}. If @subcmd{TNUMBERS} is set to @subcmd{VALUES}, then all values are displayed with their literal value (which for a numeric value is a number and for a string value an alphanumeric string). If @subcmd{TNUMBERS} is set to @subcmd{LABELS}, then values are displayed using their assigned labels if any. (@xref{VALUE LABELS}.) If the a value has no label, then it will be displayed using its literal value. If @subcmd{TNUMBERS} is set to @subcmd{BOTH}, then values will be displayed with both their label (if any) and their literal value in parentheses. @item TVARS The @subcmd{TVARS} option sets the way in which variables are displayed in output tables. The valid settings are @subcmd{NAMES}, @subcmd{LABELS} and @subcmd{BOTH}. If @subcmd{TVARS} is set to @subcmd{NAMES}, then all variables are displayed using their names. If @subcmd{TVARS} is set to @subcmd{LABELS}, then variables are displayed using their label if one has been set. If no label has been set, then the name will be used. (@xref{VARIABLE LABELS}.) If @subcmd{TVARS} is set to @subcmd{BOTH}, then variables will be displayed with both their label (if any) and their name in parentheses. @end table @cindex headers @cindex length @cindex pager @cindex width @cindex tnumbers Logging subcommands affect logging of commands executed to external files. These subcommands are @table @asis @item JOURNAL @itemx LOG These subcommands, which are synonyms, control the journal. The default is @subcmd{ON}, which causes commands entered interactively to be written to the journal file. Commands included from syntax files that are included interactively and error messages printed by @pspp{} are also written to the journal file, prefixed by @samp{>}. @subcmd{OFF} disables use of the journal. The journal is named @file{pspp.jnl} by default. A different name may be specified. @end table System file subcommands affect the default format of system files produced by @pspp{}. These subcommands are @table @asis @item COMPRESSION Not currently used. @item SCOMPRESSION Whether system files created by @cmd{SAVE} or @cmd{XSAVE} are compressed by default. The default is @subcmd{ON}. @end table Security subcommands affect the operations that commands are allowed to perform. The security subcommands are @table @asis @item SAFER Setting this option disables the following operations: @itemize @bullet @item The @cmd{ERASE} command. @item The @cmd{HOST} command. @item The @cmd{PERMISSIONS} command. @item Pipes (file names beginning or ending with @samp{|}). @end itemize Be aware that this setting does not guarantee safety (commands can still overwrite files, for instance) but it is an improvement. When set, this setting cannot be reset during the same session, for obvious security reasons. @item LOCALE @cindex locale @cindex encoding, characters This item is used to set the default character encoding. The encoding may be specified either as an encoding name or alias (see @url{http://www.iana.org/assignments/character-sets}), or as a locale name. If given as a locale name, only the character encoding of the locale is relevant. System files written by @pspp{} will use this encoding. System files read by @pspp{}, for which the encoding is unknown, will be interpreted using this encoding. The full list of valid encodings and locale names/alias are operating system dependent. The following are all examples of acceptable syntax on common GNU/Linux systems. @example SET LOCALE='iso-8859-1'. SET LOCALE='ru_RU.cp1251'. SET LOCALE='japanese'. @end example Contrary to intuition, this command does not affect any aspect of the system's locale. @end table @node SHOW @section SHOW @vindex SHOW @display SHOW [ALL] [BLANKS] [CC] [CCA] [CCB] [CCC] [CCD] [CCE] [COPYING] [DECIMALS] [DIRECTORY] [ENVIRONMENT] [FORMAT] [FUZZBITS] [LENGTH] [MXERRS] [MXLOOPS] [MXWARNS] [N] [SCOMPRESSION] [TEMPDIR] [UNDEFINED] [VERSION] [WARRANTY] [WEIGHT] [WIDTH] @end display @cmd{SHOW} can be used to display the current state of @pspp{}'s execution parameters. Parameters that can be changed using @cmd{SET} (@pxref{SET}), can be examined using @cmd{SHOW} using the subcommand with the same name. @cmd{SHOW} supports the following additional subcommands: @table @asis @item @subcmd{ALL} Show all settings. @item @subcmd{CC} Show all custom currency settings (@subcmd{CCA} through @subcmd{CCE}). @item @subcmd{DIRECTORY} Shows the current working directory. @item @subcmd{ENVIRONMENT} Shows the operating system details. @item @subcmd{N} Reports the number of cases in the active dataset. The reported number is not weighted. If no dataset is defined, then @samp{Unknown} will be reported. @item @subcmd{TEMPDIR} Shows the path of the directory where temporary files will be stored. @item @subcmd{VERSION} Shows the version of this installation of @pspp{}. @item @subcmd{WARRANTY} Show details of the lack of warranty for @pspp{}. @item @subcmd{COPYING} / @subcmd{LICENSE} Display the terms of @pspp{}'s copyright licence (@pxref{License}). @end table Specifying @cmd{SHOW} without any subcommands is equivalent to @subcmd{SHOW ALL}. @node SUBTITLE @section SUBTITLE @vindex SUBTITLE @display SUBTITLE '@var{subtitle_string}'. or SUBTITLE @var{subtitle_string}. @end display @cmd{SUBTITLE} provides a subtitle to a particular @pspp{} run. This subtitle appears at the top of each output page below the title, if headers are enabled on the output device. Specify a subtitle as a string in quotes. The alternate syntax that did not require quotes is now obsolete. If it is used then the subtitle is converted to all uppercase. @node TITLE @section TITLE @vindex TITLE @display TITLE '@var{title_string}'. or TITLE @var{title_string}. @end display @cmd{TITLE} provides a title to a particular @pspp{} run. This title appears at the top of each output page, if headers are enabled on the output device. Specify a title as a string in quotes. The alternate syntax that did not require quotes is now obsolete. If it is used then the title is converted to all uppercase. pspp-1.4.1/doc/stamp-vti0000644000175000017500000000014513725007447014540 0ustar00blpblp00000000000000@set UPDATED 29 December 2019 @set UPDATED-MONTH December 2019 @set EDITION 1.4.1 @set VERSION 1.4.1 pspp-1.4.1/doc/pspp-output.texi0000644000175000017500000001636513624302167016112 0ustar00blpblp00000000000000@c PSPP - a program for statistical analysis. @c Copyright (C) 2019 Free Software Foundation, Inc. @c Permission is granted to copy, distribute and/or modify this document @c under the terms of the GNU Free Documentation License, Version 1.3 @c or any later version published by the Free Software Foundation; @c with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. @c A copy of the license is included in the section entitled "GNU @c Free Documentation License". @c @node Invoking pspp-output @chapter Invoking @command{pspp-output} @cindex Invocation @cindex @command{pspp-output} @command{pspp-output} is a command-line utility accompanying @pspp{}. It supports multiple operations on SPSS viewer or @file{.spv} files, here called SPV files. SPSS 16 and later writes SPV files to represent the contents of its output editor. SPSS 15 and earlier versions instead use @file{.spo} files. @command{pspp-output} does not support this format. @command{pspp-options} may be invoked in the following ways: @display @t{pspp-output} @t{detect} @var{file} @t{pspp-output} [@var{options}] @t{dir} @var{file} @t{pspp-output} [@var{options}] @t{convert} @var{source} @var{destination} @t{pspp-output -@w{-}help} @t{pspp-output -@w{-}version} @end display Each of these forms is documented separately below. @command{pspp-output} also has several undocumented command forms that developers may find useful for debugging. @menu * The pspp-output detect Command:: * The pspp-output dir Command:: * The pspp-output convert Command:: * Input Selection Options:: @end menu @node The pspp-output detect Command @section The @code{detect} Command @display @t{pspp-output} @t{detect} @var{file} @end display When @var{file} is an SPV file, @command{pspp-output} exits successfully without outputting anything. When @var{file} is not an SPV file or some other error occurs, @command{pspp-output} prints an error message and exits with a failure indication. @node The pspp-output dir Command @section The @code{dir} Command @display @t{pspp-output} [@var{options}] @t{dir} @var{file} @end display Prints on stdout a table of contents for SPV file @var{file}. By default, this table lists every object in the file, except for hidden objects. @xref{Input Selection Options}, for information on the options available to select a subset of objects. The following additional option for @command{dir} is intended mainly for use by PSPP developers: @table @option @item --member-names Also show the names of the Zip members associated with each object. @end table @node The pspp-output convert Command @section The @code{convert} Command @display @t{pspp-output} [@var{options}] @t{convert} @var{source} @var{destination} @end display Reads SPV file @var{source} and converts it to another format, writing the output to @var{destination}. By default, the intended format for @var{destination} is inferred based on its extension, in the same way that the @command{pspp} program does for its output files. @xref{Invoking PSPP}, for details. @xref{Input Selection Options}, for information on the options available to select a subset of objects to include in the output. The following additional options are accepted: @table @option @item -O format=@var{format} Overrides the format inferred from the output file's extension. Use @option{--help} to list the available formats. @xref{Invoking PSPP}, for details of the available output formats. @item -O @var{option}=@var{value} Sets an option for the output file format. @xref{Invoking PSPP}, for details of the available output options. @item -F @itemx --force By default, if the source is corrupt or otherwise cannot be processed, the destination is not written. With @option{-F} or @option{--force}, the destination is written as best it can, even with errors. @end table @node Input Selection Options @section Input Selection Options The @command{dir} and @command{convert} commands, by default, operate on all of the objects in the source SPV file, except for objects that are not visible in the output viewer window. The user may specify these options to select a subset of the input objects. When multiple options are used, only objects that satisfy all of them are selected: @table @option @item --select=@r{[}^@r{]}@var{class}@dots{} Include only objects of the given @var{class}; with leading @samp{^}, include only objects not in the class. Use commas to separate multiple classes. The supported classes are: @quotation @code{charts headings logs models tables texts trees warnings outlineheaders pagetitle notes unknown other} @end quotation Use @option{--select=help} to print this list of classes. @item --commands=@r{[}^@r{]}@var{command}@dots{} @itemx --subtypes=@r{[}^@r{]}@var{subtype}@dots{} @itemx --labels=@r{[}^@r{]}@var{label}@dots{} Include only objects with the specified @var{command}, @var{subtype}, or @var{label}. With a leading @samp{^}, include only the objects that do not match. Multiple values may be specified separated by commas. An asterisk at the end of a value acts as a wildcard. The @option{--command} option matches command identifiers, case insensitively. All of the objects produced by a single command use the same, unique command identifier. Command identifiers are always in English regardless of the language used for output. They often differ from the command name in PSPP syntax. Use the @command{pspp-output} program's @command{dir} command to print command identifiers in particular output. The @option{--subtypes} option matches particular tables within a command, case insensitively. Subtypes are not necessarily unique: two commands that produce similar output tables may use the same subtype. Subtypes are always in English and @command{dir} will print them. The @option{--labels} option matches the labels in table output (that is, the table titles). Labels are affected by the output language, variable names and labels, split file settings, and other factors. @item --instances=@var{instance}@dots{} Include the specified @var{instance} of an object that matches the other criteria within a single command. The @var{instance} may be a number (1 for the first instance, 2 for the second, and so on) or @code{last} for the last instance. @item --show-hidden Include hidden output objects in the output. By default, they are excluded. @item --or Separates two sets of selection options. Objects selected by either set of options are included in the output. @end table The following additional input selection options are intended mainly for use by PSPP developers: @table @option @item --errors Include only objects that cause an error when read. With the @command{convert} command, this is most useful in conjunction with the @option{--force} option. @item --members=@var{member}@dots{} Include only the objects that include a listed Zip file @var{member}. More than one name may be included, comma-separated. The members in an SPV file may be listed with the @command{dir} command by adding the @option{--show-members} option or with the @command{zipinfo} program included with many operating systems. Error messages that @command{pspp-output} prints when it reads SPV files also often include member names. @item --member-names Displays the name of the Zip member or members associated with each object just above the object itself. @end table pspp-1.4.1/doc/pspp-dev.texi0000644000175000017500000000655713571062627015337 0ustar00blpblp00000000000000\input texinfo @c -*- texinfo -*- @c PSPP - a program for statistical analysis. @c Copyright (C) 2017 Free Software Foundation, Inc. @c Permission is granted to copy, distribute and/or modify this document @c under the terms of the GNU Free Documentation License, Version 1.3 @c or any later version published by the Free Software Foundation; @c with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. @c A copy of the license is included in the section entitled "GNU @c Free Documentation License". @c %**start of header @setfilename pspp-dev.info @settitle PSPP @c For double-sided printing, uncomment: @c @setchapternewpage odd @c %**end of header @include version-dev.texi @macro cmd{CMDNAME} \CMDNAME\ @end macro @macro struct{TAG} @code{struct \TAG\} @end macro @macro union{TAG} @code{union \TAG\} @end macro @macro enum{TAG} @code{enum \TAG\} @end macro @macro func{NAME} @code{\NAME\} @end macro @iftex @finalout @end iftex @dircategory Math @direntry * PSPP Developers Guide: (pspp-dev). Tutorial and reference for PSPP developers. @end direntry @copying This manual is for GNU PSPP version @value{VERSION}, software for statistical analysis. Copyright @copyright{} 1997, 1998, 2004, 2005, 2007, 2010, 2014, 2015, 2016 Free Software Foundation, Inc. @quotation Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included in the section entitled "GNU Free Documentation License". @end quotation @end copying @titlepage @title PSPP Developers Guide @subtitle GNU PSPP Statistical Analysis Software @subtitle Release @value{VERSION} @author Ben Pfaff @author John Darrington @page @vskip 0pt plus 1filll @insertcopying @end titlepage @contents @ifnottex @node Top @top GNU PSPP Developers Guide @insertcopying @end ifnottex @menu * Introduction:: Introduction to PSPP development. * Basic Concepts:: Data structures and concepts. * Parsing Command Syntax:: How to parse command syntax. * Processing Data:: Data input, output, and processing. * Presenting Output:: Producing machine- and human-readable output. * Internationalisation:: Dealing with locale issues. * Function Index:: Index of PSPP functions. * Concept Index:: Index of concepts. * Portable File Format:: Format of PSPP portable files. * System File Format:: Format of PSPP system files. * SPSS/PC+ System File Format:: Format of SPSS/PC+ system files. * SPSS Viewer File Format:: Format of SPSS Viewer (SPV) files. * Encrypted File Wrappers:: Common wrapper for encrypted SPSS files. * q2c Input Format:: Format of syntax accepted by q2c. * GNU Free Documentation License:: License for copying this manual. @end menu @include dev/intro.texi @include dev/concepts.texi @include dev/syntax.texi @include dev/data.texi @include dev/output.texi @include dev/i18n.texi @include function-index.texi @include concept-index.texi @include dev/portable-file-format.texi @include dev/system-file-format.texi @include dev/pc+-file-format.texi @include dev/spv-file-format.texi @include dev/encrypted-file-wrappers.texi @include dev/q2c.texi @include fdl.texi @bye pspp-1.4.1/doc/pspp.info-20000644000175000017500000103715013725007454014674 0ustar00blpblp00000000000000This is pspp.info, produced by makeinfo version 6.7 from pspp.texi. This manual is for GNU PSPP version 1.4.1, software for statistical analysis. Copyright (C) 1997, 1998, 2004, 2005, 2009, 2012, 2013, 2014, 2016, 2019 Free Software Foundation, Inc. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included in the section entitled "GNU Free Documentation License". INFO-DIR-SECTION Math START-INFO-DIR-ENTRY * PSPP: (pspp). Statistical analysis package. * PSPPIRE: (pspp). Graphical user interface to PSPP. END-INFO-DIR-ENTRY The authors wish to thank Network Theory Ltd for their financial support in the production of this manual.  File: pspp.info, Node: AUTORECODE, Next: COMPUTE, Prev: AGGREGATE, Up: Data Manipulation 12.2 AUTORECODE =============== AUTORECODE VARIABLES=SRC_VARS INTO DEST_VARS [ /DESCENDING ] [ /PRINT ] [ /GROUP ] [ /BLANK = {VALID, MISSING} ] The 'AUTORECODE' procedure considers the N values that a variable takes on and maps them onto values 1...N on a new numeric variable. Subcommand 'VARIABLES' is the only required subcommand and must come first. Specify 'VARIABLES', an equals sign ('='), a list of source variables, 'INTO', and a list of target variables. There must the same number of source and target variables. The target variables must not already exist. 'AUTORECODE' ordinarily assigns each increasing non-missing value of a source variable (for a string, this is based on character code comparisons) to consecutive values of its target variable. For example, the smallest non-missing value of the source variable is recoded to value 1, the next smallest to 2, and so on. If the source variable has user-missing values, they are recoded to consecutive values just above the non-missing values. For example, if a source variables has seven distinct non-missing values, then the smallest missing value would be recoded to 8, the next smallest to 9, and so on. Use 'DESCENDING' to reverse the sort order for non-missing values, so that the largest non-missing value is recoded to 1, the second-largest to 2, and so on. Even with 'DESCENDING', user-missing values are still recoded in ascending order just above the non-missing values. The system-missing value is always recoded into the system-missing variable in target variables. If a source value has a value label, then that value label is retained for the new value in the target variable. Otherwise, the source value itself becomes each new value's label. Variable labels are copied from the source to target variables. 'PRINT' is currently ignored. The 'GROUP' subcommand is relevant only if more than one variable is to be recoded. It causes a single mapping between source and target values to be used, instead of one map per variable. With 'GROUP', user-missing values are taken from the first source variable that has any user-missing values. If '/BLANK=MISSING' is given, then string variables which contain only whitespace are recoded as SYSMIS. If '/BLANK=VALID' is given then they will be allocated a value like any other. '/BLANK' is not relevant to numeric values. '/BLANK=VALID' is the default. 'AUTORECODE' is a procedure. It causes the data to be read.  File: pspp.info, Node: COMPUTE, Next: COUNT, Prev: AUTORECODE, Up: Data Manipulation 12.3 COMPUTE ============ COMPUTE VARIABLE = EXPRESSION. or COMPUTE vector(INDEX) = EXPRESSION. 'COMPUTE' assigns the value of an expression to a target variable. For each case, the expression is evaluated and its value assigned to the target variable. Numeric and string variables may be assigned. When a string expression's width differs from the target variable's width, the string result of the expression is truncated or padded with spaces on the right as necessary. The expression and variable types must match. For numeric variables only, the target variable need not already exist. Numeric variables created by 'COMPUTE' are assigned an 'F8.2' output format. String variables must be declared before they can be used as targets for 'COMPUTE'. The target variable may be specified as an element of a vector (*note VECTOR::). In this case, an expression INDEX must be specified in parentheses following the vector name. The expression INDEX must evaluate to a numeric value that, after rounding down to the nearest integer, is a valid index for the named vector. Using 'COMPUTE' to assign to a variable specified on 'LEAVE' (*note LEAVE::) resets the variable's left state. Therefore, 'LEAVE' should be specified following 'COMPUTE', not before. 'COMPUTE' is a transformation. It does not cause the active dataset to be read. When 'COMPUTE' is specified following 'TEMPORARY' (*note TEMPORARY::), the 'LAG' function may not be used (*note LAG::).  File: pspp.info, Node: COUNT, Next: FLIP, Prev: COMPUTE, Up: Data Manipulation 12.4 COUNT ========== COUNT VAR_NAME = VAR... (VALUE...) [/VAR_NAME = VAR... (VALUE...)]... Each VALUE takes one of the following forms: NUMBER STRING NUM1 THRU NUM2 MISSING SYSMIS where NUM1 is a numeric expression or the words 'LO' or 'LOWEST' and NUM2 is a numeric expression or 'HI' or 'HIGHEST'. 'COUNT' creates or replaces a numeric "target" variable that counts the occurrence of a "criterion" value or set of values over one or more "test" variables for each case. The target variable values are always nonnegative integers. They are never missing. The target variable is assigned an F8.2 output format. *Note Input and Output Formats::. Any variables, including string variables, may be test variables. User-missing values of test variables are treated just like any other values. They are *not* treated as system-missing values. User-missing values that are criterion values or inside ranges of criterion values are counted as any other values. However (for numeric variables), keyword 'MISSING' may be used to refer to all system- and user-missing values. 'COUNT' target variables are assigned values in the order specified. In the command 'COUNT A=A B(1) /B=A B(2).', the following actions occur: - The number of occurrences of 1 between A and B is counted. - A is assigned this value. - The number of occurrences of 1 between B and the *new* value of A is counted. - B is assigned this value. Despite this ordering, all 'COUNT' criterion variables must exist before the procedure is executed--they may not be created as target variables earlier in the command! Break such a command into two separate commands. The examples below may help to clarify. A. Assuming 'Q0', 'Q2', ..., 'Q9' are numeric variables, the following commands: 1. Count the number of times the value 1 occurs through these variables for each case and assigns the count to variable 'QCOUNT'. 2. Print out the total number of times the value 1 occurs throughout _all_ cases using 'DESCRIPTIVES'. *Note DESCRIPTIVES::, for details. COUNT QCOUNT=Q0 TO Q9(1). DESCRIPTIVES QCOUNT /STATISTICS=SUM. B. Given these same variables, the following commands: 1. Count the number of valid values of these variables for each case and assigns the count to variable 'QVALID'. 2. Multiplies each value of 'QVALID' by 10 to obtain a percentage of valid values, using 'COMPUTE'. *Note COMPUTE::, for details. 3. Print out the percentage of valid values across all cases, using 'DESCRIPTIVES'. *Note DESCRIPTIVES::, for details. COUNT QVALID=Q0 TO Q9 (LO THRU HI). COMPUTE QVALID=QVALID*10. DESCRIPTIVES QVALID /STATISTICS=MEAN.  File: pspp.info, Node: FLIP, Next: IF, Prev: COUNT, Up: Data Manipulation 12.5 FLIP ========= FLIP /VARIABLES=VAR_LIST /NEWNAMES=VAR_NAME. 'FLIP' transposes rows and columns in the active dataset. It causes cases to be swapped with variables, and vice versa. All variables in the transposed active dataset are numeric. String variables take on the system-missing value in the transposed file. 'N' subcommands are required. If specified, the 'VARIABLES' subcommand selects variables to be transformed into cases, and variables not specified are discarded. If the 'VARIABLES' subcommand is omitted, all variables are selected for transposition. The variables specified by 'NEWNAMES', which must be a string variable, is used to give names to the variables created by 'FLIP'. Only the first 8 characters of the variable are used. If 'NEWNAMES' is not specified then the default is a variable named CASE_LBL, if it exists. If it does not then the variables created by 'FLIP' are named VAR000 through VAR999, then VAR1000, VAR1001, and so on. When a 'NEWNAMES' variable is available, the names must be canonicalized before becoming variable names. Invalid characters are replaced by letter 'V' in the first position, or by '_' in subsequent positions. If the name thus generated is not unique, then numeric extensions are added, starting with 1, until a unique name is found or there are no remaining possibilities. If the latter occurs then the 'FLIP' operation aborts. The resultant dictionary contains a CASE_LBL variable, a string variable of width 8, which stores the names of the variables in the dictionary before the transposition. Variables names longer than 8 characters are truncated. If the active dataset is subsequently transposed using 'FLIP', this variable can be used to recreate the original variable names. 'FLIP' honors 'N OF CASES' (*note N OF CASES::). It ignores 'TEMPORARY' (*note TEMPORARY::), so that "temporary" transformations become permanent.  File: pspp.info, Node: IF, Next: RECODE, Prev: FLIP, Up: Data Manipulation 12.6 IF ======= IF CONDITION VARIABLE=EXPRESSION. or IF CONDITION vector(INDEX)=EXPRESSION. The 'IF' transformation conditionally assigns the value of a target expression to a target variable, based on the truth of a test expression. Specify a boolean-valued expression (*note Expressions::) to be tested following the 'IF' keyword. This expression is evaluated for each case. If the value is true, then the value of the expression is computed and assigned to the specified variable. If the value is false or missing, nothing is done. Numeric and string variables may be assigned. When a string expression's width differs from the target variable's width, the string result of the expression is truncated or padded with spaces on the right as necessary. The expression and variable types must match. The target variable may be specified as an element of a vector (*note VECTOR::). In this case, a vector index expression must be specified in parentheses following the vector name. The index expression must evaluate to a numeric value that, after rounding down to the nearest integer, is a valid index for the named vector. Using 'IF' to assign to a variable specified on 'LEAVE' (*note LEAVE::) resets the variable's left state. Therefore, 'LEAVE' should be specified following 'IF', not before. When 'IF' is specified following 'TEMPORARY' (*note TEMPORARY::), the 'LAG' function may not be used (*note LAG::).  File: pspp.info, Node: RECODE, Next: SORT CASES, Prev: IF, Up: Data Manipulation 12.7 RECODE =========== The 'RECODE' command is used to transform existing values into other, user specified values. The general form is: RECODE SRC_VARS (SRC_VALUE SRC_VALUE ... = DEST_VALUE) (SRC_VALUE SRC_VALUE ... = DEST_VALUE) (SRC_VALUE SRC_VALUE ... = DEST_VALUE) ... [INTO DEST_VARS]. Following the 'RECODE' keyword itself comes SRC_VARS which is a list of variables whose values are to be transformed. These variables may be string variables or they may be numeric. However the list must be homogeneous; you may not mix string variables and numeric variables in the same recoding. After the list of source variables, there should be one or more "mappings". Each mapping is enclosed in parentheses, and contains the source values and a destination value separated by a single '='. The source values are used to specify the values in the dataset which need to change, and the destination value specifies the new value to which they should be changed. Each SRC_VALUE may take one of the following forms: NUMBER If the source variables are numeric then SRC_VALUE may be a literal number. STRING If the source variables are string variables then SRC_VALUE may be a literal string (like all strings, enclosed in single or double quotes). NUM1 THRU NUM2 This form is valid only when the source variables are numeric. It specifies all values in the range between NUM1 and NUM2, including both endpoints of the range. By convention, NUM1 should be less than NUM2. Open-ended ranges may be specified using 'LO' or 'LOWEST' for NUM1 or 'HI' or 'HIGHEST' for NUM2. 'MISSING' The literal keyword 'MISSING' matches both system missing and user missing values. It is valid for both numeric and string variables. 'SYSMIS' The literal keyword 'SYSMIS' matches system missing values. It is valid for both numeric variables only. 'ELSE' The 'ELSE' keyword may be used to match any values which are not matched by any other SRC_VALUE appearing in the command. If this keyword appears, it should be used in the last mapping of the command. After the source variables comes an '=' and then the DEST_VALUE. The DEST_VALUE may take any of the following forms: NUMBER A literal numeric value to which the source values should be changed. This implies the destination variable must be numeric. STRING A literal string value (enclosed in quotation marks) to which the source values should be changed. This implies the destination variable must be a string variable. 'SYSMIS' The keyword 'SYSMIS' changes the value to the system missing value. This implies the destination variable must be numeric. 'COPY' The special keyword 'COPY' means that the source value should not be modified, but copied directly to the destination value. This is meaningful only if 'INTO DEST_VARS' is specified. Mappings are considered from left to right. Therefore, if a value is matched by a SRC_VALUE from more than one mapping, the first (leftmost) mapping which matches will be considered. Any subsequent matches will be ignored. The clause 'INTO DEST_VARS' is optional. The behaviour of the command is slightly different depending on whether it appears or not. If 'INTO DEST_VARS' does not appear, then values will be recoded "in place". This means that the recoded values are written back to the source variables from whence the original values came. In this case, the DEST_VALUE for every mapping must imply a value which has the same type as the SRC_VALUE. For example, if the source value is a string value, it is not permissible for DEST_VALUE to be 'SYSMIS' or another forms which implies a numeric result. It is also not permissible for DEST_VALUE to be longer than the width of the source variable. The following example two numeric variables X and Y are recoded in place. Zero is recoded to 99, the values 1 to 10 inclusive are unchanged, values 1000 and higher are recoded to the system-missing value and all other values are changed to 999: recode X Y (0 = 99) (1 THRU 10 = COPY) (1000 THRU HIGHEST = SYSMIS) (ELSE = 999). If 'INTO DEST_VARS' is given, then recoded values are written into the variables specified in DEST_VARS, which must therefore contain a list of valid variable names. The number of variables in DEST_VARS must be the same as the number of variables in SRC_VARS and the respective order of the variables in DEST_VARS corresponds to the order of SRC_VARS. That is to say, recoded values whose original value came from the Nth variable in SRC_VARS will be placed into the Nth variable in DEST_VARS. The source variables will be unchanged. If any mapping implies a string as its destination value, then the respective destination variable must already exist, or have been declared using 'STRING' or another transformation. Numeric variables however will be automatically created if they don't already exist. The following example deals with two source variables, A and B which contain string values. Hence there are two destination variables V1 and V2. Any cases where A or B contain the values 'apple', 'pear' or 'pomegranate' will result in V1 or V2 being filled with the string 'fruit' whilst cases with 'tomato', 'lettuce' or 'carrot' will result in 'vegetable'. Any other values will produce the result 'unknown': string V1 (a20). string V2 (a20). recode A B ("apple" "pear" "pomegranate" = "fruit") ("tomato" "lettuce" "carrot" = "vegetable") (ELSE = "unknown") into V1 V2. There is one very special mapping, not mentioned above. If the source variable is a string variable then a mapping may be specified as '(CONVERT)'. This mapping, if it appears must be the last mapping given and the 'INTO DEST_VARS' clause must also be given and must not refer to a string variable. 'CONVERT' causes a number specified as a string to be converted to a numeric value. For example it will convert the string '"3"' into the numeric value 3 (note that it will not convert 'three' into 3). If the string cannot be parsed as a number, then the system-missing value is assigned instead. In the following example, cases where the value of X (a string variable) is the empty string, are recoded to 999 and all others are converted to the numeric equivalent of the input value. The results are placed into the numeric variable Y: recode X ("" = 999) (convert) into Y. It is possible to specify multiple recodings on a single command. Introduce additional recodings with a slash ('/') to separate them from the previous recodings: recode A (2 = 22) (else = 99) /B (1 = 3) into Z . Here we have two recodings. The first affects the source variable A and recodes in-place the value 2 into 22 and all other values to 99. The second recoding copies the values of B into the variable Z, changing any instances of 1 into 3.  File: pspp.info, Node: SORT CASES, Prev: RECODE, Up: Data Manipulation 12.8 SORT CASES =============== SORT CASES BY VAR_LIST[({D|A}] [ VAR_LIST[({D|A}] ] ... 'SORT CASES' sorts the active dataset by the values of one or more variables. Specify 'BY' and a list of variables to sort by. By default, variables are sorted in ascending order. To override sort order, specify '(D)' or '(DOWN)' after a list of variables to get descending order, or '(A)' or '(UP)' for ascending order. These apply to all the listed variables up until the preceding '(A)', '(D)', '(UP)' or '(DOWN)'. The sort algorithms used by 'SORT CASES' are stable. That is, records that have equal values of the sort variables will have the same relative order before and after sorting. As a special case, re-sorting an already sorted file will not affect the ordering of cases. 'SORT CASES' is a procedure. It causes the data to be read. 'SORT CASES' attempts to sort the entire active dataset in main memory. If workspace is exhausted, it falls back to a merge sort algorithm that involves creates numerous temporary files. 'SORT CASES' may not be specified following 'TEMPORARY'.  File: pspp.info, Node: Data Selection, Next: Conditionals and Looping, Prev: Data Manipulation, Up: Top 13 Selecting data for analysis ****************************** This chapter documents PSPP commands that temporarily or permanently select data records from the active dataset for analysis. * Menu: * FILTER:: Exclude cases based on a variable. * N OF CASES:: Limit the size of the active dataset. * SAMPLE:: Select a specified proportion of cases. * SELECT IF:: Permanently delete selected cases. * SPLIT FILE:: Do multiple analyses with one command. * TEMPORARY:: Make transformations' effects temporary. * WEIGHT:: Weight cases by a variable.  File: pspp.info, Node: FILTER, Next: N OF CASES, Up: Data Selection 13.1 FILTER =========== FILTER BY VAR_NAME. FILTER OFF. 'FILTER' allows a boolean-valued variable to be used to select cases from the data stream for processing. To set up filtering, specify 'BY' and a variable name. Keyword BY is optional but recommended. Cases which have a zero or system- or user-missing value are excluded from analysis, but not deleted from the data stream. Cases with other values are analyzed. To filter based on a different condition, use transformations such as 'COMPUTE' or 'RECODE' to compute a filter variable of the required form, then specify that variable on 'FILTER'. 'FILTER OFF' turns off case filtering. Filtering takes place immediately before cases pass to a procedure for analysis. Only one filter variable may be active at a time. Normally, case filtering continues until it is explicitly turned off with 'FILTER OFF'. However, if 'FILTER' is placed after 'TEMPORARY', it filters only the next procedure or procedure-like command.  File: pspp.info, Node: N OF CASES, Next: SAMPLE, Prev: FILTER, Up: Data Selection 13.2 N OF CASES =============== N [OF CASES] NUM_OF_CASES [ESTIMATED]. 'N OF CASES' limits the number of cases processed by any procedures that follow it in the command stream. 'N OF CASES 100', for example, tells PSPP to disregard all cases after the first 100. When 'N OF CASES' is specified after 'TEMPORARY', it affects only the next procedure (*note TEMPORARY::). Otherwise, cases beyond the limit specified are not processed by any later procedure. If the limit specified on 'N OF CASES' is greater than the number of cases in the active dataset, it has no effect. When 'N OF CASES' is used along with 'SAMPLE' or 'SELECT IF', the case limit is applied to the cases obtained after sampling or case selection, regardless of how 'N OF CASES' is placed relative to 'SAMPLE' or 'SELECT IF' in the command file. Thus, the commands 'N OF CASES 100' and 'SAMPLE .5' will both randomly sample approximately half of the active dataset's cases, then select the first 100 of those sampled, regardless of their order in the command file. 'N OF CASES' with the 'ESTIMATED' keyword gives an estimated number of cases before 'DATA LIST' or another command to read in data. 'ESTIMATED' never limits the number of cases processed by procedures. PSPP currently does not make use of case count estimates.  File: pspp.info, Node: SAMPLE, Next: SELECT IF, Prev: N OF CASES, Up: Data Selection 13.3 SAMPLE =========== SAMPLE NUM1 [FROM NUM2]. 'SAMPLE' randomly samples a proportion of the cases in the active file. Unless it follows 'TEMPORARY', it operates as a transformation, permanently removing cases from the active dataset. The proportion to sample can be expressed as a single number between 0 and 1. If K is the number specified, and N is the number of currently-selected cases in the active dataset, then after 'SAMPLE K.', approximately K*N cases will be selected. The proportion to sample can also be specified in the style 'SAMPLE M FROM N'. With this style, cases are selected as follows: 1. If N is equal to the number of currently-selected cases in the active dataset, exactly M cases will be selected. 2. If N is greater than the number of currently-selected cases in the active dataset, an equivalent proportion of cases will be selected. 3. If N is less than the number of currently-selected cases in the active, exactly M cases will be selected _from the first N cases in the active dataset._ 'SAMPLE' and 'SELECT IF' are performed in the order specified by the syntax file. 'SAMPLE' is always performed before 'N OF CASES', regardless of ordering in the syntax file (*note N OF CASES::). The same values for 'SAMPLE' may result in different samples. To obtain the same sample, use the 'SET' command to set the random number seed to the same value before each 'SAMPLE'. Different samples may still result when the file is processed on systems with differing endianness or floating-point formats. By default, the random number seed is based on the system time.  File: pspp.info, Node: SELECT IF, Next: SPLIT FILE, Prev: SAMPLE, Up: Data Selection 13.4 SELECT IF ============== SELECT IF EXPRESSION. 'SELECT IF' selects cases for analysis based on the value of EXPRESSION. Cases not selected are permanently eliminated from the active dataset, unless 'TEMPORARY' is in effect (*note TEMPORARY::). Specify a boolean expression (*note Expressions::). If the value of the expression is true for a particular case, the case will be analyzed. If the expression has a false or missing value, then the case will be deleted from the data stream. Place 'SELECT IF' as early in the command file as possible. Cases that are deleted early can be processed more efficiently in time and space. When 'SELECT IF' is specified following 'TEMPORARY' (*note TEMPORARY::), the 'LAG' function may not be used (*note LAG::).  File: pspp.info, Node: SPLIT FILE, Next: TEMPORARY, Prev: SELECT IF, Up: Data Selection 13.5 SPLIT FILE =============== SPLIT FILE [{LAYERED, SEPARATE}] BY VAR_LIST. SPLIT FILE OFF. 'SPLIT FILE' allows multiple sets of data present in one data file to be analyzed separately using single statistical procedure commands. Specify a list of variable names to analyze multiple sets of data separately. Groups of adjacent cases having the same values for these variables are analyzed by statistical procedure commands as one group. An independent analysis is carried out for each group of cases, and the variable values for the group are printed along with the analysis. When a list of variable names is specified, one of the keywords 'LAYERED' or 'SEPARATE' may also be specified. If provided, either keyword are ignored. Groups are formed only by _adjacent_ cases. To create a split using a variable where like values are not adjacent in the working file, you should first sort the data by that variable (*note SORT CASES::). Specify 'OFF' to disable 'SPLIT FILE' and resume analysis of the entire active dataset as a single group of data. When 'SPLIT FILE' is specified after 'TEMPORARY', it affects only the next procedure (*note TEMPORARY::).  File: pspp.info, Node: TEMPORARY, Next: WEIGHT, Prev: SPLIT FILE, Up: Data Selection 13.6 TEMPORARY ============== TEMPORARY. 'TEMPORARY' is used to make the effects of transformations following its execution temporary. These transformations will affect only the execution of the next procedure or procedure-like command. Their effects will not be saved to the active dataset. The only specification on 'TEMPORARY' is the command name. 'TEMPORARY' may not appear within a 'DO IF' or 'LOOP' construct. It may appear only once between procedures and procedure-like commands. Scratch variables cannot be used following 'TEMPORARY'. An example may help to clarify: DATA LIST /X 1-2. BEGIN DATA. 2 4 10 15 20 24 END DATA. COMPUTE X=X/2. TEMPORARY. COMPUTE X=X+3. DESCRIPTIVES X. DESCRIPTIVES X. The data read by the first 'DESCRIPTIVES' are 4, 5, 8, 10.5, 13, 15. The data read by the first 'DESCRIPTIVES' are 1, 2, 5, 7.5, 10, 12.  File: pspp.info, Node: WEIGHT, Prev: TEMPORARY, Up: Data Selection 13.7 WEIGHT =========== WEIGHT BY VAR_NAME. WEIGHT OFF. 'WEIGHT' assigns cases varying weights, changing the frequency distribution of the active dataset. Execution of 'WEIGHT' is delayed until data have been read. If a variable name is specified, 'WEIGHT' causes the values of that variable to be used as weighting factors for subsequent statistical procedures. Use of keyword 'BY' is optional but recommended. Weighting variables must be numeric. Scratch variables may not be used for weighting (*note Scratch Variables::). When 'OFF' is specified, subsequent statistical procedures will weight all cases equally. A positive integer weighting factor W on a case will yield the same statistical output as would replicating the case W times. A weighting factor of 0 is treated for statistical purposes as if the case did not exist in the input. Weighting values need not be integers, but negative and system-missing values for the weighting variable are interpreted as weighting factors of 0. User-missing values are not treated specially. When 'WEIGHT' is specified after 'TEMPORARY', it affects only the next procedure (*note TEMPORARY::). 'WEIGHT' does not cause cases in the active dataset to be replicated in memory.  File: pspp.info, Node: Conditionals and Looping, Next: Statistics, Prev: Data Selection, Up: Top 14 Conditional and Looping Constructs ************************************* This chapter documents PSPP commands used for conditional execution, looping, and flow of control. * Menu: * BREAK:: Exit a loop. * DO IF:: Conditionally execute a block of code. * DO REPEAT:: Textually repeat a code block. * LOOP:: Repeat a block of code.  File: pspp.info, Node: BREAK, Next: DO IF, Up: Conditionals and Looping 14.1 BREAK ========== BREAK. 'BREAK' terminates execution of the innermost currently executing 'LOOP' construct. 'BREAK' is allowed only inside 'LOOP'...'END LOOP'. *Note LOOP::, for more details.  File: pspp.info, Node: DO IF, Next: DO REPEAT, Prev: BREAK, Up: Conditionals and Looping 14.2 DO IF ========== DO IF condition. ... [ELSE IF condition. ... ]... [ELSE. ...] END IF. 'DO IF' allows one of several sets of transformations to be executed, depending on user-specified conditions. If the specified boolean expression evaluates as true, then the block of code following 'DO IF' is executed. If it evaluates as missing, then none of the code blocks is executed. If it is false, then the boolean expression on the first 'ELSE IF', if present, is tested in turn, with the same rules applied. If all expressions evaluate to false, then the 'ELSE' code block is executed, if it is present. When 'DO IF' or 'ELSE IF' is specified following 'TEMPORARY' (*note TEMPORARY::), the 'LAG' function may not be used (*note LAG::).  File: pspp.info, Node: DO REPEAT, Next: LOOP, Prev: DO IF, Up: Conditionals and Looping 14.3 DO REPEAT ============== DO REPEAT dummy_name=expansion.... ... END REPEAT [PRINT]. expansion takes one of the following forms: var_list num_or_range... 'string'... ALL num_or_range takes one of the following forms: number num1 TO num2 'DO REPEAT' repeats a block of code, textually substituting different variables, numbers, or strings into the block with each repetition. Specify a dummy variable name followed by an equals sign ('=') and the list of replacements. Replacements can be a list of existing or new variables, numbers, strings, or 'ALL' to specify all existing variables. When numbers are specified, runs of increasing integers may be indicated as 'NUM1 TO NUM2', so that '1 TO 5' is short for '1 2 3 4 5'. Multiple dummy variables can be specified. Each variable must have the same number of replacements. The code within 'DO REPEAT' is repeated as many times as there are replacements for each variable. The first time, the first value for each dummy variable is substituted; the second time, the second value for each dummy variable is substituted; and so on. Dummy variable substitutions work like macros. They take place anywhere in a line that the dummy variable name occurs. This includes command and subcommand names, so command and subcommand names that appear in the code block should not be used as dummy variable identifiers. Dummy variable substitutions do not occur inside quoted strings, comments, unquoted strings (such as the text on the 'TITLE' or 'DOCUMENT' command), or inside 'BEGIN DATA'...'END DATA'. Substitution occurs only on whole words, so that, for example, a dummy variable PRINT would not be substituted into the word PRINTOUT. New variable names used as replacements are not automatically created as variables, but only if used in the code block in a context that would create them, e.g. on a 'NUMERIC' or 'STRING' command or on the left side of a 'COMPUTE' assignment. Any command may appear within 'DO REPEAT', including nested 'DO REPEAT' commands. If 'INCLUDE' or 'INSERT' appears within 'DO REPEAT', the substitutions do not apply to the included file. If 'PRINT' is specified on 'END REPEAT', the commands after substitutions are made should be printed to the listing file, prefixed by a plus sign ('+'). This feature is not yet implemented.  File: pspp.info, Node: LOOP, Prev: DO REPEAT, Up: Conditionals and Looping 14.4 LOOP ========= LOOP [INDEX_VAR=START TO END [BY INCR]] [IF CONDITION]. ... END LOOP [IF CONDITION]. 'LOOP' iterates a group of commands. A number of termination options are offered. Specify index_var to make that variable count from one value to another by a particular increment. INDEX_VAR must be a pre-existing numeric variable. START, END, and INCR are numeric expressions (*note Expressions::.) During the first iteration, INDEX_VAR is set to the value of START. During each successive iteration, INDEX_VAR is increased by the value of INCR. If END > START, then the loop terminates when INDEX_VAR > END; otherwise it terminates when INDEX_VAR < END. If INCR is not specified then it defaults to +1 or -1 as appropriate. If END > START and INCR < 0, or if END < START and INCR > 0, then the loop is never executed. INDEX_VAR is nevertheless set to the value of start. Modifying INDEX_VAR within the loop is allowed, but it has no effect on the value of INDEX_VAR in the next iteration. Specify a boolean expression for the condition on 'LOOP' to cause the loop to be executed only if the condition is true. If the condition is false or missing before the loop contents are executed the first time, the loop contents are not executed at all. If index and condition clauses are both present on 'LOOP', the index variable is always set before the condition is evaluated. Thus, a condition that makes use of the index variable will always see the index value to be used in the next execution of the body. Specify a boolean expression for the condition on 'END LOOP' to cause the loop to terminate if the condition is true after the enclosed code block is executed. The condition is evaluated at the end of the loop, not at the beginning, so that the body of a loop with only a condition on 'END LOOP' will always execute at least once. If the index clause is not present, then the loop is executed at most MAX_LOOPS (*note SET::) times (but possibly fewer, if a condition clause evaluates to false or if 'BREAK' executes). The default value of MAX_LOOPS is 40. 'BREAK' also terminates 'LOOP' execution (*note BREAK::). Loop index variables are by default reset to system-missing from one case to another, not left, unless a scratch variable is used as index. When loops are nested, this is usually undesired behavior, which can be corrected with 'LEAVE' (*note LEAVE::) or by using a scratch variable as the loop index. When 'LOOP' or 'END LOOP' is specified following 'TEMPORARY' (*note TEMPORARY::), the 'LAG' function may not be used (*note LAG::).  File: pspp.info, Node: Statistics, Next: Utilities, Prev: Conditionals and Looping, Up: Top 15 Statistics ************* This chapter documents the statistical procedures that PSPP supports so far. * Menu: * DESCRIPTIVES:: Descriptive statistics. * FREQUENCIES:: Frequency tables. * EXAMINE:: Testing data for normality. * GRAPH:: Plot data. * CORRELATIONS:: Correlation tables. * CROSSTABS:: Crosstabulation tables. * FACTOR:: Factor analysis and Principal Components analysis. * GLM:: Univariate Linear Models. * LOGISTIC REGRESSION:: Bivariate Logistic Regression. * MEANS:: Average values and other statistics. * NPAR TESTS:: Nonparametric tests. * T-TEST:: Test hypotheses about means. * ONEWAY:: One way analysis of variance. * QUICK CLUSTER:: K-Means clustering. * RANK:: Compute rank scores. * REGRESSION:: Linear regression. * RELIABILITY:: Reliability analysis. * ROC:: Receiver Operating Characteristic.  File: pspp.info, Node: DESCRIPTIVES, Next: FREQUENCIES, Up: Statistics 15.1 DESCRIPTIVES ================= DESCRIPTIVES /VARIABLES=VAR_LIST /MISSING={VARIABLE,LISTWISE} {INCLUDE,NOINCLUDE} /FORMAT={LABELS,NOLABELS} {NOINDEX,INDEX} {LINE,SERIAL} /SAVE /STATISTICS={ALL,MEAN,SEMEAN,STDDEV,VARIANCE,KURTOSIS, SKEWNESS,RANGE,MINIMUM,MAXIMUM,SUM,DEFAULT, SESKEWNESS,SEKURTOSIS} /SORT={NONE,MEAN,SEMEAN,STDDEV,VARIANCE,KURTOSIS,SKEWNESS, RANGE,MINIMUM,MAXIMUM,SUM,SESKEWNESS,SEKURTOSIS,NAME} {A,D} The 'DESCRIPTIVES' procedure reads the active dataset and outputs descriptive statistics requested by the user. In addition, it can optionally compute Z-scores. The 'VARIABLES' subcommand, which is required, specifies the list of variables to be analyzed. Keyword 'VARIABLES' is optional. All other subcommands are optional: The 'MISSING' subcommand determines the handling of missing variables. If 'INCLUDE' is set, then user-missing values are included in the calculations. If 'NOINCLUDE' is set, which is the default, user-missing values are excluded. If 'VARIABLE' is set, then missing values are excluded on a variable by variable basis; if 'LISTWISE' is set, then the entire case is excluded whenever any value in that case has a system-missing or, if 'INCLUDE' is set, user-missing value. The 'FORMAT' subcommand has no effect. It is accepted for backward compatibility. The 'SAVE' subcommand causes 'DESCRIPTIVES' to calculate Z scores for all the specified variables. The Z scores are saved to new variables. Variable names are generated by trying first the original variable name with Z prepended and truncated to a maximum of 8 characters, then the names ZSC000 through ZSC999, STDZ00 through STDZ09, ZZZZ00 through ZZZZ09, ZQZQ00 through ZQZQ09, in that sequence. In addition, Z score variable names can be specified explicitly on 'VARIABLES' in the variable list by enclosing them in parentheses after each variable. When Z scores are calculated, PSPP ignores 'TEMPORARY', treating temporary transformations as permanent. The 'STATISTICS' subcommand specifies the statistics to be displayed: 'ALL' All of the statistics below. 'MEAN' Arithmetic mean. 'SEMEAN' Standard error of the mean. 'STDDEV' Standard deviation. 'VARIANCE' Variance. 'KURTOSIS' Kurtosis and standard error of the kurtosis. 'SKEWNESS' Skewness and standard error of the skewness. 'RANGE' Range. 'MINIMUM' Minimum value. 'MAXIMUM' Maximum value. 'SUM' Sum. 'DEFAULT' Mean, standard deviation of the mean, minimum, maximum. 'SEKURTOSIS' Standard error of the kurtosis. 'SESKEWNESS' Standard error of the skewness. The 'SORT' subcommand specifies how the statistics should be sorted. Most of the possible values should be self-explanatory. 'NAME' causes the statistics to be sorted by name. By default, the statistics are listed in the order that they are specified on the 'VARIABLES' subcommand. The 'A' and 'D' settings request an ascending or descending sort order, respectively.  File: pspp.info, Node: FREQUENCIES, Next: EXAMINE, Prev: DESCRIPTIVES, Up: Statistics 15.2 FREQUENCIES ================ FREQUENCIES /VARIABLES=VAR_LIST /FORMAT={TABLE,NOTABLE,LIMIT(LIMIT)} {AVALUE,DVALUE,AFREQ,DFREQ} /MISSING={EXCLUDE,INCLUDE} /STATISTICS={DEFAULT,MEAN,SEMEAN,MEDIAN,MODE,STDDEV,VARIANCE, KURTOSIS,SKEWNESS,RANGE,MINIMUM,MAXIMUM,SUM, SESKEWNESS,SEKURTOSIS,ALL,NONE} /NTILES=NTILES /PERCENTILES=percent... /HISTOGRAM=[MINIMUM(X_MIN)] [MAXIMUM(X_MAX)] [{FREQ[(Y_MAX)],PERCENT[(Y_MAX)]}] [{NONORMAL,NORMAL}] /PIECHART=[MINIMUM(X_MIN)] [MAXIMUM(X_MAX)] [{FREQ,PERCENT}] [{NOMISSING,MISSING}] /BARCHART=[MINIMUM(X_MIN)] [MAXIMUM(X_MAX)] [{FREQ,PERCENT}] /ORDER={ANALYSIS,VARIABLE} (These options are not currently implemented.) /HBAR=... /GROUPED=... The 'FREQUENCIES' procedure outputs frequency tables for specified variables. 'FREQUENCIES' can also calculate and display descriptive statistics (including median and mode) and percentiles, and various graphical representations of the frequency distribution. The 'VARIABLES' subcommand is the only required subcommand. Specify the variables to be analyzed. The 'FORMAT' subcommand controls the output format. It has several possible settings: '' 'TABLE', the default, causes a frequency table to be output for every variable specified. 'NOTABLE' prevents them from being output. 'LIMIT' with a numeric argument causes them to be output except when there are more than the specified number of values in the table. '' Normally frequency tables are sorted in ascending order by value. This is 'AVALUE'. 'DVALUE' tables are sorted in descending order by value. 'AFREQ' and 'DFREQ' tables are sorted in ascending and descending order, respectively, by frequency count. The 'MISSING' subcommand controls the handling of user-missing values. When 'EXCLUDE', the default, is set, user-missing values are not included in frequency tables or statistics. When 'INCLUDE' is set, user-missing are included. System-missing values are never included in statistics, but are listed in frequency tables. The available 'STATISTICS' are the same as available in 'DESCRIPTIVES' (*note DESCRIPTIVES::), with the addition of 'MEDIAN', the data's median value, and MODE, the mode. (If there are multiple modes, the smallest value is reported.) By default, the mean, standard deviation of the mean, minimum, and maximum are reported for each variable. 'PERCENTILES' causes the specified percentiles to be reported. The percentiles should be presented at a list of numbers between 0 and 100 inclusive. The 'NTILES' subcommand causes the percentiles to be reported at the boundaries of the data set divided into the specified number of ranges. For instance, '/NTILES=4' would cause quartiles to be reported. The 'HISTOGRAM' subcommand causes the output to include a histogram for each specified numeric variable. The X axis by default ranges from the minimum to the maximum value observed in the data, but the 'MINIMUM' and 'MAXIMUM' keywords can set an explicit range. (1) Histograms are not created for string variables. Specify 'NORMAL' to superimpose a normal curve on the histogram. The 'PIECHART' subcommand adds a pie chart for each variable to the data. Each slice represents one value, with the size of the slice proportional to the value's frequency. By default, all non-missing values are given slices. The 'MINIMUM' and 'MAXIMUM' keywords can be used to limit the displayed slices to a given range of values. The keyword 'NOMISSING' causes missing values to be omitted from the piechart. This is the default. If instead, 'MISSING' is specified, then a single slice will be included representing all system missing and user-missing cases. The 'BARCHART' subcommand produces a bar chart for each variable. The 'MINIMUM' and 'MAXIMUM' keywords can be used to omit categories whose counts which lie outside the specified limits. The 'FREQ' option (default) causes the ordinate to display the frequency of each category, whereas the 'PERCENT' option will display relative percentages. The 'FREQ' and 'PERCENT' options on 'HISTOGRAM' and 'PIECHART' are accepted but not currently honoured. The 'ORDER' subcommand is accepted but ignored. ---------- Footnotes ---------- (1) The number of bins is chosen according to the Freedman-Diaconis rule: 2 \times IQR(x)n^{-1/3}, where IQR(x) is the interquartile range of x and n is the number of samples. Note that 'EXAMINE' uses a different algorithm to determine bin sizes.  File: pspp.info, Node: EXAMINE, Next: GRAPH, Prev: FREQUENCIES, Up: Statistics 15.3 EXAMINE ============ EXAMINE VARIABLES= VAR1 [VAR2] ... [VARN] [BY FACTOR1 [BY SUBFACTOR1] [ FACTOR2 [BY SUBFACTOR2]] ... [ FACTOR3 [BY SUBFACTOR3]] ] /STATISTICS={DESCRIPTIVES, EXTREME[(N)], ALL, NONE} /PLOT={BOXPLOT, NPPLOT, HISTOGRAM, SPREADLEVEL[(T)], ALL, NONE} /CINTERVAL P /COMPARE={GROUPS,VARIABLES} /ID=IDENTITY_VARIABLE /{TOTAL,NOTOTAL} /PERCENTILE=[PERCENTILES]={HAVERAGE, WAVERAGE, ROUND, AEMPIRICAL, EMPIRICAL } /MISSING={LISTWISE, PAIRWISE} [{EXCLUDE, INCLUDE}] [{NOREPORT,REPORT}] The 'EXAMINE' command is used to perform exploratory data analysis. In particular, it is useful for testing how closely a distribution follows a normal distribution, and for finding outliers and extreme values. The 'VARIABLES' subcommand is mandatory. It specifies the dependent variables and optionally variables to use as factors for the analysis. Variables listed before the first 'BY' keyword (if any) are the dependent variables. The dependent variables may optionally be followed by a list of factors which tell PSPP how to break down the analysis for each dependent variable. Following the dependent variables, factors may be specified. The factors (if desired) should be preceded by a single 'BY' keyword. The format for each factor is FACTORVAR [BY SUBFACTORVAR]. Each unique combination of the values of FACTORVAR and SUBFACTORVAR divide the dataset into "cells". Statistics will be calculated for each cell and for the entire dataset (unless 'NOTOTAL' is given). The 'STATISTICS' subcommand specifies which statistics to show. 'DESCRIPTIVES' will produce a table showing some parametric and non-parametrics statistics. 'EXTREME' produces a table showing the extremities of each cell. A number in parentheses, N determines how many upper and lower extremities to show. The default number is 5. The subcommands 'TOTAL' and 'NOTOTAL' are mutually exclusive. If 'TOTAL' appears, then statistics will be produced for the entire dataset as well as for each cell. If 'NOTOTAL' appears, then statistics will be produced only for the cells (unless no factor variables have been given). These subcommands have no effect if there have been no factor variables specified. The 'PLOT' subcommand specifies which plots are to be produced if any. Available plots are 'HISTOGRAM', 'NPPLOT', 'BOXPLOT' and 'SPREADLEVEL'. The first three can be used to visualise how closely each cell conforms to a normal distribution, whilst the spread vs. level plot can be useful to visualise how the variance of differs between factors. Boxplots will also show you the outliers and extreme values. (1) The 'SPREADLEVEL' plot displays the interquartile range versus the median. It takes an optional parameter T, which specifies how the data should be transformed prior to plotting. The given value T is a power to which the data is raised. For example, if T is given as 2, then the data will be squared. Zero, however is a special value. If T is 0 or is omitted, then data will be transformed by taking its natural logarithm instead of raising to the power of T. When one or more plots are requested, 'EXAMINE' also performs the Shapiro-Wilk test for each category. There are however a number of provisos: * All weight values must be integer. * The cumulative weight value must be in the range [3, 5000] The 'COMPARE' subcommand is only relevant if producing boxplots, and it is only useful there is more than one dependent variable and at least one factor. If '/COMPARE=GROUPS' is specified, then one plot per dependent variable is produced, each of which contain boxplots for all the cells. If '/COMPARE=VARIABLES' is specified, then one plot per cell is produced, each containing one boxplot per dependent variable. If the '/COMPARE' subcommand is omitted, then PSPP behaves as if '/COMPARE=GROUPS' were given. The 'ID' subcommand is relevant only if '/PLOT=BOXPLOT' or '/STATISTICS=EXTREME' has been given. If given, it should provide the name of a variable which is to be used to labels extreme values and outliers. Numeric or string variables are permissible. If the 'ID' subcommand is not given, then the case number will be used for labelling. The 'CINTERVAL' subcommand specifies the confidence interval to use in calculation of the descriptives command. The default is 95%. The 'PERCENTILES' subcommand specifies which percentiles are to be calculated, and which algorithm to use for calculating them. The default is to calculate the 5, 10, 25, 50, 75, 90, 95 percentiles using the 'HAVERAGE' algorithm. The 'TOTAL' and 'NOTOTAL' subcommands are mutually exclusive. If 'NOTOTAL' is given and factors have been specified in the 'VARIABLES' subcommand, then statistics for the unfactored dependent variables are produced in addition to the factored variables. If there are no factors specified then 'TOTAL' and 'NOTOTAL' have no effect. The following example will generate descriptive statistics and histograms for two variables SCORE1 and SCORE2. Two factors are given, viz: GENDER and GENDER BY CULTURE. Therefore, the descriptives and histograms will be generated for each distinct value of GENDER _and_ for each distinct combination of the values of GENDER and RACE. Since the 'NOTOTAL' keyword is given, statistics and histograms for SCORE1 and SCORE2 covering the whole dataset are not produced. EXAMINE SCORE1 SCORE2 BY GENDER GENDER BY CULTURE /STATISTICS = DESCRIPTIVES /PLOT = HISTOGRAM /NOTOTAL. Here is a second example showing how the 'examine' command can be used to find extremities. EXAMINE HEIGHT WEIGHT BY GENDER /STATISTICS = EXTREME (3) /PLOT = BOXPLOT /COMPARE = GROUPS /ID = NAME. In this example, we look at the height and weight of a sample of individuals and how they differ between male and female. A table showing the 3 largest and the 3 smallest values of HEIGHT and WEIGHT for each gender, and for the whole dataset will be shown. Boxplots will also be produced. Because '/COMPARE = GROUPS' was given, boxplots for male and female will be shown in the same graphic, allowing us to easily see the difference between the genders. Since the variable NAME was specified on the 'ID' subcommand, this will be used to label the extreme values. *Warning!* If many dependent variables are specified, or if factor variables are specified for which there are many distinct values, then 'EXAMINE' will produce a very large quantity of output. ---------- Footnotes ---------- (1) 'HISTOGRAM' uses Sturges' rule to determine the number of bins, as approximately 1 + \log2(n), where n is the number of samples. Note that 'FREQUENCIES' uses a different algorithm to find the bin size.  File: pspp.info, Node: GRAPH, Next: CORRELATIONS, Prev: EXAMINE, Up: Statistics 15.4 GRAPH ========== GRAPH /HISTOGRAM [(NORMAL)]= VAR /SCATTERPLOT [(BIVARIATE)] = VAR1 WITH VAR2 [BY VAR3] /BAR = {SUMMARY-FUNCTION(VAR1) | COUNT-FUNCTION} BY VAR2 [BY VAR3] [ /MISSING={LISTWISE, VARIABLE} [{EXCLUDE, INCLUDE}] ] [{NOREPORT,REPORT}] The 'GRAPH' produces graphical plots of data. Only one of the subcommands 'HISTOGRAM' or 'SCATTERPLOT' can be specified, i.e. only one plot can be produced per call of 'GRAPH'. The 'MISSING' is optional. * Menu: * SCATTERPLOT:: Cartesian Plots * HISTOGRAM:: Histograms * BAR CHART:: Bar Charts  File: pspp.info, Node: SCATTERPLOT, Next: HISTOGRAM, Up: GRAPH 15.4.1 Scatterplot ------------------ The subcommand 'SCATTERPLOT' produces an xy plot of the data. The different values of the optional third variable VAR3 will result in different colours and/or markers for the plot. The following is an example for producing a scatterplot. GRAPH /SCATTERPLOT = HEIGHT WITH WEIGHT BY GENDER. This example will produce a scatterplot where HEIGHT is plotted versus WEIGHT. Depending on the value of the GENDER variable, the colour of the datapoint is different. With this plot it is possible to analyze gender differences for HEIGHT vs. WEIGHT relation.  File: pspp.info, Node: HISTOGRAM, Next: BAR CHART, Prev: SCATTERPLOT, Up: GRAPH 15.4.2 Histogram ---------------- The subcommand 'HISTOGRAM' produces a histogram. Only one variable is allowed for the histogram plot. The keyword 'NORMAL' may be specified in parentheses, to indicate that the ideal normal curve should be superimposed over the histogram. For an alternative method to produce histograms *note EXAMINE::. The following example produces a histogram plot for the variable WEIGHT. GRAPH /HISTOGRAM = WEIGHT.  File: pspp.info, Node: BAR CHART, Prev: HISTOGRAM, Up: GRAPH 15.4.3 Bar Chart ---------------- The subcommand 'BAR' produces a bar chart. This subcommand requires that a COUNT-FUNCTION be specified (with no arguments) or a SUMMARY-FUNCTION with a variable VAR1 in parentheses. Following the summary or count function, the keyword 'BY' should be specified and then a catagorical variable, VAR2. The values of the variable VAR2 determine the labels of the bars to be plotted. Optionally a second categorical variable VAR3 may be specified in which case a clustered (grouped) bar chart is produced. Valid count functions are 'COUNT' The weighted counts of the cases in each category. 'PCT' The weighted counts of the cases in each category expressed as a percentage of the total weights of the cases. 'CUFREQ' The cumulative weighted counts of the cases in each category. 'CUPCT' The cumulative weighted counts of the cases in each category expressed as a percentage of the total weights of the cases. The summary function is applied to VAR1 across all cases in each category. The recognised summary functions are: 'SUM' The sum. 'MEAN' The arithmetic mean. 'MAXIMUM' The maximum value. 'MINIMUM' The minimum value. The following examples assume a dataset which is the results of a survey. Each respondent has indicated annual income, their sex and city of residence. One could create a bar chart showing how the mean income varies between of residents of different cities, thus: GRAPH /BAR = MEAN(INCOME) BY CITY. This can be extended to also indicate how income in each city differs between the sexes. GRAPH /BAR = MEAN(INCOME) BY CITY BY SEX. One might also want to see how many respondents there are from each city. This can be achieved as follows: GRAPH /BAR = COUNT BY CITY. Bar charts can also be produced using the *note FREQUENCIES:: and *note CROSSTABS:: commands.  File: pspp.info, Node: CORRELATIONS, Next: CROSSTABS, Prev: GRAPH, Up: Statistics 15.5 CORRELATIONS ================= CORRELATIONS /VARIABLES = VAR_LIST [ WITH VAR_LIST ] [ . . . /VARIABLES = VAR_LIST [ WITH VAR_LIST ] /VARIABLES = VAR_LIST [ WITH VAR_LIST ] ] [ /PRINT={TWOTAIL, ONETAIL} {SIG, NOSIG} ] [ /STATISTICS=DESCRIPTIVES XPROD ALL] [ /MISSING={PAIRWISE, LISTWISE} {INCLUDE, EXCLUDE} ] The 'CORRELATIONS' procedure produces tables of the Pearson correlation coefficient for a set of variables. The significance of the coefficients are also given. At least one 'VARIABLES' subcommand is required. If the 'WITH' keyword is used, then a non-square correlation table will be produced. The variables preceding 'WITH', will be used as the rows of the table, and the variables following will be the columns of the table. If no 'WITH' subcommand is given, then a square, symmetrical table using all variables is produced. The 'MISSING' subcommand determines the handling of missing variables. If 'INCLUDE' is set, then user-missing values are included in the calculations, but system-missing values are not. If 'EXCLUDE' is set, which is the default, user-missing values are excluded as well as system-missing values. If 'LISTWISE' is set, then the entire case is excluded from analysis whenever any variable specified in any '/VARIABLES' subcommand contains a missing value. If 'PAIRWISE' is set, then a case is considered missing only if either of the values for the particular coefficient are missing. The default is 'PAIRWISE'. The 'PRINT' subcommand is used to control how the reported significance values are printed. If the 'TWOTAIL' option is used, then a two-tailed test of significance is printed. If the 'ONETAIL' option is given, then a one-tailed test is used. The default is 'TWOTAIL'. If the 'NOSIG' option is specified, then correlation coefficients with significance less than 0.05 are highlighted. If 'SIG' is specified, then no highlighting is performed. This is the default. The 'STATISTICS' subcommand requests additional statistics to be displayed. The keyword 'DESCRIPTIVES' requests that the mean, number of non-missing cases, and the non-biased estimator of the standard deviation are displayed. These statistics will be displayed in a separated table, for all the variables listed in any '/VARIABLES' subcommand. The 'XPROD' keyword requests cross-product deviations and covariance estimators to be displayed for each pair of variables. The keyword 'ALL' is the union of 'DESCRIPTIVES' and 'XPROD'.  File: pspp.info, Node: CROSSTABS, Next: FACTOR, Prev: CORRELATIONS, Up: Statistics 15.6 CROSSTABS ============== CROSSTABS /TABLES=VAR_LIST BY VAR_LIST [BY VAR_LIST]... /MISSING={TABLE,INCLUDE,REPORT} /WRITE={NONE,CELLS,ALL} /FORMAT={TABLES,NOTABLES} {PIVOT,NOPIVOT} {AVALUE,DVALUE} {NOINDEX,INDEX} {BOX,NOBOX} /CELLS={COUNT,ROW,COLUMN,TOTAL,EXPECTED,RESIDUAL,SRESIDUAL, ASRESIDUAL,ALL,NONE} /COUNT={ASIS,CASE,CELL} {ROUND,TRUNCATE} /STATISTICS={CHISQ,PHI,CC,LAMBDA,UC,BTAU,CTAU,RISK,GAMMA,D, KAPPA,ETA,CORR,ALL,NONE} /BARCHART (Integer mode.) /VARIABLES=VAR_LIST (LOW,HIGH)... The 'CROSSTABS' procedure displays crosstabulation tables requested by the user. It can calculate several statistics for each cell in the crosstabulation tables. In addition, a number of statistics can be calculated for each table itself. The 'TABLES' subcommand is used to specify the tables to be reported. Any number of dimensions is permitted, and any number of variables per dimension is allowed. The 'TABLES' subcommand may be repeated as many times as needed. This is the only required subcommand in "general mode". Occasionally, one may want to invoke a special mode called "integer mode". Normally, in general mode, PSPP automatically determines what values occur in the data. In integer mode, the user specifies the range of values that the data assumes. To invoke this mode, specify the 'VARIABLES' subcommand, giving a range of data values in parentheses for each variable to be used on the 'TABLES' subcommand. Data values inside the range are truncated to the nearest integer, then assigned to that value. If values occur outside this range, they are discarded. When it is present, the 'VARIABLES' subcommand must precede the 'TABLES' subcommand. In general mode, numeric and string variables may be specified on TABLES. In integer mode, only numeric variables are allowed. The 'MISSING' subcommand determines the handling of user-missing values. When set to 'TABLE', the default, missing values are dropped on a table by table basis. When set to 'INCLUDE', user-missing values are included in tables and statistics. When set to 'REPORT', which is allowed only in integer mode, user-missing values are included in tables but marked with a footnote and excluded from statistical calculations. Currently the 'WRITE' subcommand is ignored. The 'FORMAT' subcommand controls the characteristics of the crosstabulation tables to be displayed. It has a number of possible settings: 'TABLES', the default, causes crosstabulation tables to be output. 'NOTABLES' suppresses them. 'PIVOT', the default, causes each 'TABLES' subcommand to be displayed in a pivot table format. 'NOPIVOT' causes the old-style crosstabulation format to be used. 'AVALUE', the default, causes values to be sorted in ascending order. 'DVALUE' asserts a descending sort order. 'INDEX' and 'NOINDEX' are currently ignored. 'BOX' and 'NOBOX' is currently ignored. The 'CELLS' subcommand controls the contents of each cell in the displayed crosstabulation table. The possible settings are: COUNT Frequency count. ROW Row percent. COLUMN Column percent. TOTAL Table percent. EXPECTED Expected value. RESIDUAL Residual. SRESIDUAL Standardized residual. ASRESIDUAL Adjusted standardized residual. ALL All of the above. NONE Suppress cells entirely. '/CELLS' without any settings specified requests 'COUNT', 'ROW', 'COLUMN', and 'TOTAL'. If 'CELLS' is not specified at all then only 'COUNT' will be selected. By default, crosstabulation and statistics use raw case weights, without rounding. Use the '/COUNT' subcommand to perform rounding: CASE rounds the weights of individual weights as cases are read, CELL rounds the weights of cells within each crosstabulation table after it has been constructed, and ASIS explicitly specifies the default non-rounding behavior. When rounding is requested, ROUND, the default, rounds to the nearest integer and TRUNCATE rounds toward zero. The 'STATISTICS' subcommand selects statistics for computation: CHISQ Pearson chi-square, likelihood ratio, Fisher's exact test, continuity correction, linear-by-linear association. PHI Phi. CC Contingency coefficient. LAMBDA Lambda. UC Uncertainty coefficient. BTAU Tau-b. CTAU Tau-c. RISK Risk estimate. GAMMA Gamma. D Somers' D. KAPPA Cohen's Kappa. ETA Eta. CORR Spearman correlation, Pearson's r. ALL All of the above. NONE No statistics. Selected statistics are only calculated when appropriate for the statistic. Certain statistics require tables of a particular size, and some statistics are calculated only in integer mode. '/STATISTICS' without any settings selects CHISQ. If the 'STATISTICS' subcommand is not given, no statistics are calculated. The '/BARCHART' subcommand produces a clustered bar chart for the first two variables on each table. If a table has more than two variables, the counts for the third and subsequent levels will be aggregated and the chart will be produces as if there were only two variables. *Please note:* Currently the implementation of 'CROSSTABS' has the following limitations: * Significance of some symmetric and directional measures is not calculated. * Asymptotic standard error is not calculated for Goodman and Kruskal's tau or symmetric Somers' d. * Approximate T is not calculated for symmetric uncertainty coefficient. Fixes for any of these deficiencies would be welcomed.  File: pspp.info, Node: FACTOR, Next: GLM, Prev: CROSSTABS, Up: Statistics 15.7 FACTOR =========== FACTOR { VARIABLES=VAR_LIST, MATRIX IN ({CORR,COV}={*,FILE_SPEC}) } [ /METHOD = {CORRELATION, COVARIANCE} ] [ /ANALYSIS=VAR_LIST ] [ /EXTRACTION={PC, PAF}] [ /ROTATION={VARIMAX, EQUAMAX, QUARTIMAX, PROMAX[(K)], NOROTATE}] [ /PRINT=[INITIAL] [EXTRACTION] [ROTATION] [UNIVARIATE] [CORRELATION] [COVARIANCE] [DET] [KMO] [AIC] [SIG] [ALL] [DEFAULT] ] [ /PLOT=[EIGEN] ] [ /FORMAT=[SORT] [BLANK(N)] [DEFAULT] ] [ /CRITERIA=[FACTORS(N)] [MINEIGEN(L)] [ITERATE(M)] [ECONVERGE (DELTA)] [DEFAULT] ] [ /MISSING=[{LISTWISE, PAIRWISE}] [{INCLUDE, EXCLUDE}] ] The 'FACTOR' command performs Factor Analysis or Principal Axis Factoring on a dataset. It may be used to find common factors in the data or for data reduction purposes. The 'VARIABLES' subcommand is required (unless the 'MATRIX IN' subcommand is used). It lists the variables which are to partake in the analysis. (The 'ANALYSIS' subcommand may optionally further limit the variables that participate; it is useful primarily in conjunction with 'MATRIX IN'.) If 'MATRIX IN' instead of 'VARIABLES' is specified, then the analysis is performed on a pre-prepared correlation or covariance matrix file instead of on individual data cases. Typically the matrix file will have been generated by 'MATRIX DATA' (*note MATRIX DATA::) or provided by a third party. If specified, 'MATRIX IN' must be followed by 'COV' or 'CORR', then by '=' and FILE_SPEC all in parentheses. FILE_SPEC may either be an asterisk, which indicates the currently loaded dataset, or it may be a filename to be loaded. *Note MATRIX DATA::, for the expected format of the file. The '/EXTRACTION' subcommand is used to specify the way in which factors (components) are extracted from the data. If 'PC' is specified, then Principal Components Analysis is used. If 'PAF' is specified, then Principal Axis Factoring is used. By default Principal Components Analysis will be used. The '/ROTATION' subcommand is used to specify the method by which the extracted solution will be rotated. Three orthogonal rotation methods are available: 'VARIMAX' (which is the default), 'EQUAMAX', and 'QUARTIMAX'. There is one oblique rotation method, viz: 'PROMAX'. Optionally you may enter the power of the promax rotation K, which must be enclosed in parentheses. The default value of K is 5. If you don't want any rotation to be performed, the word 'NOROTATE' will prevent the command from performing any rotation on the data. The '/METHOD' subcommand should be used to determine whether the covariance matrix or the correlation matrix of the data is to be analysed. By default, the correlation matrix is analysed. The '/PRINT' subcommand may be used to select which features of the analysis are reported: * 'UNIVARIATE' A table of mean values, standard deviations and total weights are printed. * 'INITIAL' Initial communalities and eigenvalues are printed. * 'EXTRACTION' Extracted communalities and eigenvalues are printed. * 'ROTATION' Rotated communalities and eigenvalues are printed. * 'CORRELATION' The correlation matrix is printed. * 'COVARIANCE' The covariance matrix is printed. * 'DET' The determinant of the correlation or covariance matrix is printed. * 'AIC' The anti-image covariance and anti-image correlation matrices are printed. * 'KMO' The Kaiser-Meyer-Olkin measure of sampling adequacy and the Bartlett test of sphericity is printed. * 'SIG' The significance of the elements of correlation matrix is printed. * 'ALL' All of the above are printed. * 'DEFAULT' Identical to 'INITIAL' and 'EXTRACTION'. If '/PLOT=EIGEN' is given, then a "Scree" plot of the eigenvalues will be printed. This can be useful for visualizing which factors (components) should be retained. The '/FORMAT' subcommand determined how data are to be displayed in loading matrices. If 'SORT' is specified, then the variables are sorted in descending order of significance. If 'BLANK(N)' is specified, then coefficients whose absolute value is less than N will not be printed. If the keyword 'DEFAULT' is given, or if no '/FORMAT' subcommand is given, then no sorting is performed, and all coefficients will be printed. The '/CRITERIA' subcommand is used to specify how the number of extracted factors (components) are chosen. If 'FACTORS(N)' is specified, where N is an integer, then N factors will be extracted. Otherwise, the 'MINEIGEN' setting will be used. 'MINEIGEN(L)' requests that all factors whose eigenvalues are greater than or equal to L are extracted. The default value of L is 1. The 'ECONVERGE' setting has effect only when iterative algorithms for factor extraction (such as Principal Axis Factoring) are used. 'ECONVERGE(DELTA)' specifies that iteration should cease when the maximum absolute value of the communality estimate between one iteration and the previous is less than DELTA. The default value of DELTA is 0.001. The 'ITERATE(M)' may appear any number of times and is used for two different purposes. It is used to set the maximum number of iterations (M) for convergence and also to set the maximum number of iterations for rotation. Whether it affects convergence or rotation depends upon which subcommand follows the 'ITERATE' subcommand. If 'EXTRACTION' follows, it affects convergence. If 'ROTATION' follows, it affects rotation. If neither 'ROTATION' nor 'EXTRACTION' follow a 'ITERATE' subcommand it will be ignored. The default value of M is 25. The 'MISSING' subcommand determines the handling of missing variables. If 'INCLUDE' is set, then user-missing values are included in the calculations, but system-missing values are not. If 'EXCLUDE' is set, which is the default, user-missing values are excluded as well as system-missing values. This is the default. If 'LISTWISE' is set, then the entire case is excluded from analysis whenever any variable specified in the 'VARIABLES' subcommand contains a missing value. If 'PAIRWISE' is set, then a case is considered missing only if either of the values for the particular coefficient are missing. The default is 'LISTWISE'.  File: pspp.info, Node: GLM, Next: LOGISTIC REGRESSION, Prev: FACTOR, Up: Statistics 15.8 GLM ======== GLM DEPENDENT_VARS BY FIXED_FACTORS [/METHOD = SSTYPE(TYPE)] [/DESIGN = INTERACTION_0 [INTERACTION_1 [... INTERACTION_N]]] [/INTERCEPT = {INCLUDE|EXCLUDE}] [/MISSING = {INCLUDE|EXCLUDE}] The 'GLM' procedure can be used for fixed effects factorial Anova. The DEPENDENT_VARS are the variables to be analysed. You may analyse several variables in the same command in which case they should all appear before the 'BY' keyword. The FIXED_FACTORS list must be one or more categorical variables. Normally it will not make sense to enter a scalar variable in the FIXED_FACTORS and doing so may cause PSPP to do a lot of unnecessary processing. The 'METHOD' subcommand is used to change the method for producing the sums of squares. Available values of TYPE are 1, 2 and 3. The default is type 3. You may specify a custom design using the 'DESIGN' subcommand. The design comprises a list of interactions where each interaction is a list of variables separated by a '*'. For example the command GLM subject BY sex age_group race /DESIGN = age_group sex group age_group*sex age_group*race specifies the model subject = age_group + sex + race + age_group*sex + age_group*race. If no 'DESIGN' subcommand is specified, then the default is all possible combinations of the fixed factors. That is to say GLM subject BY sex age_group race implies the model subject = age_group + sex + race + age_group*sex + age_group*race + sex*race + age_group*sex*race. The 'MISSING' subcommand determines the handling of missing variables. If 'INCLUDE' is set then, for the purposes of GLM analysis, only system-missing values are considered to be missing; user-missing values are not regarded as missing. If 'EXCLUDE' is set, which is the default, then user-missing values are considered to be missing as well as system-missing values. A case for which any dependent variable or any factor variable has a missing value is excluded from the analysis.  File: pspp.info, Node: LOGISTIC REGRESSION, Next: MEANS, Prev: GLM, Up: Statistics 15.9 LOGISTIC REGRESSION ======================== LOGISTIC REGRESSION [VARIABLES =] DEPENDENT_VAR WITH PREDICTORS [/CATEGORICAL = CATEGORICAL_PREDICTORS] [{/NOCONST | /ORIGIN | /NOORIGIN }] [/PRINT = [SUMMARY] [DEFAULT] [CI(CONFIDENCE)] [ALL]] [/CRITERIA = [BCON(MIN_DELTA)] [ITERATE(MAX_INTERATIONS)] [LCON(MIN_LIKELIHOOD_DELTA)] [EPS(MIN_EPSILON)] [CUT(CUT_POINT)]] [/MISSING = {INCLUDE|EXCLUDE}] Bivariate Logistic Regression is used when you want to explain a dichotomous dependent variable in terms of one or more predictor variables. The minimum command is LOGISTIC REGRESSION Y WITH X1 X2 ... XN. Here, Y is the dependent variable, which must be dichotomous and X1 ... XN are the predictor variables whose coefficients the procedure estimates. By default, a constant term is included in the model. Hence, the full model is {\bf y} = b_0 + b_1 {\bf x_1} + b_2 {\bf x_2} + \dots + b_n {\bf x_n} Predictor variables which are categorical in nature should be listed on the '/CATEGORICAL' subcommand. Simple variables as well as interactions between variables may be listed here. If you want a model without the constant term b_0, use the keyword '/ORIGIN'. '/NOCONST' is a synonym for '/ORIGIN'. An iterative Newton-Raphson procedure is used to fit the model. The '/CRITERIA' subcommand is used to specify the stopping criteria of the procedure, and other parameters. The value of CUT_POINT is used in the classification table. It is the threshold above which predicted values are considered to be 1. Values of CUT_POINT must lie in the range [0,1]. During iterations, if any one of the stopping criteria are satisfied, the procedure is considered complete. The stopping criteria are: * The number of iterations exceeds MAX_ITERATIONS. The default value of MAX_ITERATIONS is 20. * The change in the all coefficient estimates are less than MIN_DELTA. The default value of MIN_DELTA is 0.001. * The magnitude of change in the likelihood estimate is less than MIN_LIKELIHOOD_DELTA. The default value of MIN_DELTA is zero. This means that this criterion is disabled. * The differential of the estimated probability for all cases is less than MIN_EPSILON. In other words, the probabilities are close to zero or one. The default value of MIN_EPSILON is 0.00000001. The 'PRINT' subcommand controls the display of optional statistics. Currently there is one such option, 'CI', which indicates that the confidence interval of the odds ratio should be displayed as well as its value. 'CI' should be followed by an integer in parentheses, to indicate the confidence level of the desired confidence interval. The 'MISSING' subcommand determines the handling of missing variables. If 'INCLUDE' is set, then user-missing values are included in the calculations, but system-missing values are not. If 'EXCLUDE' is set, which is the default, user-missing values are excluded as well as system-missing values. This is the default.  File: pspp.info, Node: MEANS, Next: NPAR TESTS, Prev: LOGISTIC REGRESSION, Up: Statistics 15.10 MEANS =========== MEANS [TABLES =] {VAR_LIST} [ BY {VAR_LIST} [BY {VAR_LIST} [BY {VAR_LIST} ... ]]] [ /{VAR_LIST} [ BY {VAR_LIST} [BY {VAR_LIST} [BY {VAR_LIST} ... ]]] ] [/CELLS = [MEAN] [COUNT] [STDDEV] [SEMEAN] [SUM] [MIN] [MAX] [RANGE] [VARIANCE] [KURT] [SEKURT] [SKEW] [SESKEW] [FIRST] [LAST] [HARMONIC] [GEOMETRIC] [DEFAULT] [ALL] [NONE] ] [/MISSING = [INCLUDE] [DEPENDENT]] You can use the 'MEANS' command to calculate the arithmetic mean and similar statistics, either for the dataset as a whole or for categories of data. The simplest form of the command is MEANS V. which calculates the mean, count and standard deviation for V. If you specify a grouping variable, for example MEANS V BY G. then the means, counts and standard deviations for V after having been grouped by G will be calculated. Instead of the mean, count and standard deviation, you could specify the statistics in which you are interested: MEANS X Y BY G /CELLS = HARMONIC SUM MIN. This example calculates the harmonic mean, the sum and the minimum values of X and Y grouped by G. The 'CELLS' subcommand specifies which statistics to calculate. The available statistics are: * 'MEAN' The arithmetic mean. * 'COUNT' The count of the values. * 'STDDEV' The standard deviation. * 'SEMEAN' The standard error of the mean. * 'SUM' The sum of the values. * 'MIN' The minimum value. * 'MAX' The maximum value. * 'RANGE' The difference between the maximum and minimum values. * 'VARIANCE' The variance. * 'FIRST' The first value in the category. * 'LAST' The last value in the category. * 'SKEW' The skewness. * 'SESKEW' The standard error of the skewness. * 'KURT' The kurtosis * 'SEKURT' The standard error of the kurtosis. * 'HARMONIC' The harmonic mean. * 'GEOMETRIC' The geometric mean. In addition, three special keywords are recognized: * 'DEFAULT' This is the same as 'MEAN' 'COUNT' 'STDDEV'. * 'ALL' All of the above statistics will be calculated. * 'NONE' No statistics will be calculated (only a summary will be shown). More than one "table" can be specified in a single command. Each table is separated by a '/'. For example MEANS TABLES = C D E BY X /A B BY X Y /F BY Y BY Z. has three tables (the 'TABLE =' is optional). The first table has three dependent variables C, D and E and a single categorical variable X. The second table has two dependent variables A and B, and two categorical variables X and Y. The third table has a single dependent variables F and a categorical variable formed by the combination of Y and Z. By default values are omitted from the analysis only if missing values (either system missing or user missing) for any of the variables directly involved in their calculation are encountered. This behaviour can be modified with the '/MISSING' subcommand. Three options are possible: 'TABLE', 'INCLUDE' and 'DEPENDENT'. '/MISSING = INCLUDE' says that user missing values, either in the dependent variables or in the categorical variables should be taken at their face value, and not excluded. '/MISSING = DEPENDENT' says that user missing values, in the dependent variables should be taken at their face value, however cases which have user missing values for the categorical variables should be omitted from the calculation.  File: pspp.info, Node: NPAR TESTS, Next: T-TEST, Prev: MEANS, Up: Statistics 15.11 NPAR TESTS ================ NPAR TESTS nonparametric test subcommands . . . [ /STATISTICS={DESCRIPTIVES} ] [ /MISSING={ANALYSIS, LISTWISE} {INCLUDE, EXCLUDE} ] [ /METHOD=EXACT [ TIMER [(N)] ] ] 'NPAR TESTS' performs nonparametric tests. Non parametric tests make very few assumptions about the distribution of the data. One or more tests may be specified by using the corresponding subcommand. If the '/STATISTICS' subcommand is also specified, then summary statistics are produces for each variable that is the subject of any test. Certain tests may take a long time to execute, if an exact figure is required. Therefore, by default asymptotic approximations are used unless the subcommand '/METHOD=EXACT' is specified. Exact tests give more accurate results, but may take an unacceptably long time to perform. If the 'TIMER' keyword is used, it sets a maximum time, after which the test will be abandoned, and a warning message printed. The time, in minutes, should be specified in parentheses after the 'TIMER' keyword. If the 'TIMER' keyword is given without this figure, then a default value of 5 minutes is used. * Menu: * BINOMIAL:: Binomial Test * CHISQUARE:: Chisquare Test * COCHRAN:: Cochran Q Test * FRIEDMAN:: Friedman Test * KENDALL:: Kendall's W Test * KOLMOGOROV-SMIRNOV:: Kolmogorov Smirnov Test * KRUSKAL-WALLIS:: Kruskal-Wallis Test * MANN-WHITNEY:: Mann Whitney U Test * MCNEMAR:: McNemar Test * MEDIAN:: Median Test * RUNS:: Runs Test * SIGN:: The Sign Test * WILCOXON:: Wilcoxon Signed Ranks Test  File: pspp.info, Node: BINOMIAL, Next: CHISQUARE, Up: NPAR TESTS 15.11.1 Binomial test --------------------- [ /BINOMIAL[(P)]=VAR_LIST[(VALUE1[, VALUE2)] ] ] The '/BINOMIAL' subcommand compares the observed distribution of a dichotomous variable with that of a binomial distribution. The variable P specifies the test proportion of the binomial distribution. The default value of 0.5 is assumed if P is omitted. If a single value appears after the variable list, then that value is used as the threshold to partition the observed values. Values less than or equal to the threshold value form the first category. Values greater than the threshold form the second category. If two values appear after the variable list, then they will be used as the values which a variable must take to be in the respective category. Cases for which a variable takes a value equal to neither of the specified values, take no part in the test for that variable. If no values appear, then the variable must assume dichotomous values. If more than two distinct, non-missing values for a variable under test are encountered then an error occurs. If the test proportion is equal to 0.5, then a two tailed test is reported. For any other test proportion, a one tailed test is reported. For one tailed tests, if the test proportion is less than or equal to the observed proportion, then the significance of observing the observed proportion or more is reported. If the test proportion is more than the observed proportion, then the significance of observing the observed proportion or less is reported. That is to say, the test is always performed in the observed direction. PSPP uses a very precise approximation to the gamma function to compute the binomial significance. Thus, exact results are reported even for very large sample sizes.  File: pspp.info, Node: CHISQUARE, Next: COCHRAN, Prev: BINOMIAL, Up: NPAR TESTS 15.11.2 Chisquare Test ---------------------- [ /CHISQUARE=VAR_LIST[(LO,HI)] [/EXPECTED={EQUAL|F1, F2 ... FN}] ] The '/CHISQUARE' subcommand produces a chi-square statistic for the differences between the expected and observed frequencies of the categories of a variable. Optionally, a range of values may appear after the variable list. If a range is given, then non integer values are truncated, and values outside the specified range are excluded from the analysis. The '/EXPECTED' subcommand specifies the expected values of each category. There must be exactly one non-zero expected value, for each observed category, or the 'EQUAL' keyword must be specified. You may use the notation 'N*F' to specify N consecutive expected categories all taking a frequency of F. The frequencies given are proportions, not absolute frequencies. The sum of the frequencies need not be 1. If no '/EXPECTED' subcommand is given, then equal frequencies are expected.  File: pspp.info, Node: COCHRAN, Next: FRIEDMAN, Prev: CHISQUARE, Up: NPAR TESTS 15.11.3 Cochran Q Test ---------------------- [ /COCHRAN = VAR_LIST ] The Cochran Q test is used to test for differences between three or more groups. The data for VAR_LIST in all cases must assume exactly two distinct values (other than missing values). The value of Q will be displayed and its Asymptotic significance based on a chi-square distribution.  File: pspp.info, Node: FRIEDMAN, Next: KENDALL, Prev: COCHRAN, Up: NPAR TESTS 15.11.4 Friedman Test --------------------- [ /FRIEDMAN = VAR_LIST ] The Friedman test is used to test for differences between repeated measures when there is no indication that the distributions are normally distributed. A list of variables which contain the measured data must be given. The procedure prints the sum of ranks for each variable, the test statistic and its significance.  File: pspp.info, Node: KENDALL, Next: KOLMOGOROV-SMIRNOV, Prev: FRIEDMAN, Up: NPAR TESTS 15.11.5 Kendall's W Test ------------------------ [ /KENDALL = VAR_LIST ] The Kendall test investigates whether an arbitrary number of related samples come from the same population. It is identical to the Friedman test except that the additional statistic W, Kendall's Coefficient of Concordance is printed. It has the range [0,1] -- a value of zero indicates no agreement between the samples whereas a value of unity indicates complete agreement.  File: pspp.info, Node: KOLMOGOROV-SMIRNOV, Next: KRUSKAL-WALLIS, Prev: KENDALL, Up: NPAR TESTS 15.11.6 Kolmogorov-Smirnov Test ------------------------------- [ /KOLMOGOROV-SMIRNOV ({NORMAL [MU, SIGMA], UNIFORM [MIN, MAX], POISSON [LAMBDA], EXPONENTIAL [SCALE] }) = VAR_LIST ] The one sample Kolmogorov-Smirnov subcommand is used to test whether or not a dataset is drawn from a particular distribution. Four distributions are supported, viz: Normal, Uniform, Poisson and Exponential. Ideally you should provide the parameters of the distribution against which you wish to test the data. For example, with the normal distribution the mean (MU)and standard deviation (SIGMA) should be given; with the uniform distribution, the minimum (MIN)and maximum (MAX) value should be provided. However, if the parameters are omitted they will be imputed from the data. Imputing the parameters reduces the power of the test so should be avoided if possible. In the following example, two variables SCORE and AGE are tested to see if they follow a normal distribution with a mean of 3.5 and a standard deviation of 2.0. NPAR TESTS /KOLMOGOROV-SMIRNOV (normal 3.5 2.0) = SCORE AGE. If the variables need to be tested against different distributions, then a separate subcommand must be used. For example the following syntax tests SCORE against a normal distribution with mean of 3.5 and standard deviation of 2.0 whilst AGE is tested against a normal distribution of mean 40 and standard deviation 1.5. NPAR TESTS /KOLMOGOROV-SMIRNOV (normal 3.5 2.0) = SCORE /KOLMOGOROV-SMIRNOV (normal 40 1.5) = AGE. The abbreviated subcommand 'K-S' may be used in place of 'KOLMOGOROV-SMIRNOV'.  File: pspp.info, Node: KRUSKAL-WALLIS, Next: MANN-WHITNEY, Prev: KOLMOGOROV-SMIRNOV, Up: NPAR TESTS 15.11.7 Kruskal-Wallis Test --------------------------- [ /KRUSKAL-WALLIS = VAR_LIST BY var (LOWER, UPPER) ] The Kruskal-Wallis test is used to compare data from an arbitrary number of populations. It does not assume normality. The data to be compared are specified by VAR_LIST. The categorical variable determining the groups to which the data belongs is given by VAR. The limits LOWER and UPPER specify the valid range of VAR. Any cases for which VAR falls outside [LOWER, UPPER] will be ignored. The mean rank of each group as well as the chi-squared value and significance of the test will be printed. The abbreviated subcommand 'K-W' may be used in place of 'KRUSKAL-WALLIS'.  File: pspp.info, Node: MANN-WHITNEY, Next: MCNEMAR, Prev: KRUSKAL-WALLIS, Up: NPAR TESTS 15.11.8 Mann-Whitney U Test --------------------------- [ /MANN-WHITNEY = VAR_LIST BY var (GROUP1, GROUP2) ] The Mann-Whitney subcommand is used to test whether two groups of data come from different populations. The variables to be tested should be specified in VAR_LIST and the grouping variable, that determines to which group the test variables belong, in VAR. VAR may be either a string or an alpha variable. GROUP1 and GROUP2 specify the two values of VAR which determine the groups of the test data. Cases for which the VAR value is neither GROUP1 or GROUP2 will be ignored. The value of the Mann-Whitney U statistic, the Wilcoxon W, and the significance will be printed. The abbreviated subcommand 'M-W' may be used in place of 'MANN-WHITNEY'.  File: pspp.info, Node: MCNEMAR, Next: MEDIAN, Prev: MANN-WHITNEY, Up: NPAR TESTS 15.11.9 McNemar Test -------------------- [ /MCNEMAR VAR_LIST [ WITH VAR_LIST [ (PAIRED) ]]] Use McNemar's test to analyse the significance of the difference between pairs of correlated proportions. If the 'WITH' keyword is omitted, then tests for all combinations of the listed variables are performed. If the 'WITH' keyword is given, and the '(PAIRED)' keyword is also given, then the number of variables preceding 'WITH' must be the same as the number following it. In this case, tests for each respective pair of variables are performed. If the 'WITH' keyword is given, but the '(PAIRED)' keyword is omitted, then tests for each combination of variable preceding 'WITH' against variable following 'WITH' are performed. The data in each variable must be dichotomous. If there are more than two distinct variables an error will occur and the test will not be run.  File: pspp.info, Node: MEDIAN, Next: RUNS, Prev: MCNEMAR, Up: NPAR TESTS 15.11.10 Median Test -------------------- [ /MEDIAN [(VALUE)] = VAR_LIST BY VARIABLE (VALUE1, VALUE2) ] The median test is used to test whether independent samples come from populations with a common median. The median of the populations against which the samples are to be tested may be given in parentheses immediately after the '/MEDIAN' subcommand. If it is not given, the median will be imputed from the union of all the samples. The variables of the samples to be tested should immediately follow the '=' sign. The keyword 'BY' must come next, and then the grouping variable. Two values in parentheses should follow. If the first value is greater than the second, then a 2 sample test is performed using these two values to determine the groups. If however, the first variable is less than the second, then a k sample test is conducted and the group values used are all values encountered which lie in the range [VALUE1,VALUE2].  File: pspp.info, Node: RUNS, Next: SIGN, Prev: MEDIAN, Up: NPAR TESTS 15.11.11 Runs Test ------------------ [ /RUNS ({MEAN, MEDIAN, MODE, VALUE}) = VAR_LIST ] The '/RUNS' subcommand tests whether a data sequence is randomly ordered. It works by examining the number of times a variable's value crosses a given threshold. The desired threshold must be specified within parentheses. It may either be specified as a number or as one of 'MEAN', 'MEDIAN' or 'MODE'. Following the threshold specification comes the list of variables whose values are to be tested. The subcommand shows the number of runs, the asymptotic significance based on the length of the data.  File: pspp.info, Node: SIGN, Next: WILCOXON, Prev: RUNS, Up: NPAR TESTS 15.11.12 Sign Test ------------------ [ /SIGN VAR_LIST [ WITH VAR_LIST [ (PAIRED) ]]] The '/SIGN' subcommand tests for differences between medians of the variables listed. The test does not make any assumptions about the distribution of the data. If the 'WITH' keyword is omitted, then tests for all combinations of the listed variables are performed. If the 'WITH' keyword is given, and the '(PAIRED)' keyword is also given, then the number of variables preceding 'WITH' must be the same as the number following it. In this case, tests for each respective pair of variables are performed. If the 'WITH' keyword is given, but the '(PAIRED)' keyword is omitted, then tests for each combination of variable preceding 'WITH' against variable following 'WITH' are performed.  File: pspp.info, Node: WILCOXON, Prev: SIGN, Up: NPAR TESTS 15.11.13 Wilcoxon Matched Pairs Signed Ranks Test ------------------------------------------------- [ /WILCOXON VAR_LIST [ WITH VAR_LIST [ (PAIRED) ]]] The '/WILCOXON' subcommand tests for differences between medians of the variables listed. The test does not make any assumptions about the variances of the samples. It does however assume that the distribution is symmetrical. If the 'WITH' keyword is omitted, then tests for all combinations of the listed variables are performed. If the 'WITH' keyword is given, and the '(PAIRED)' keyword is also given, then the number of variables preceding 'WITH' must be the same as the number following it. In this case, tests for each respective pair of variables are performed. If the 'WITH' keyword is given, but the '(PAIRED)' keyword is omitted, then tests for each combination of variable preceding 'WITH' against variable following 'WITH' are performed.  File: pspp.info, Node: T-TEST, Next: ONEWAY, Prev: NPAR TESTS, Up: Statistics 15.12 T-TEST ============ T-TEST /MISSING={ANALYSIS,LISTWISE} {EXCLUDE,INCLUDE} /CRITERIA=CI(CONFIDENCE) (One Sample mode.) TESTVAL=TEST_VALUE /VARIABLES=VAR_LIST (Independent Samples mode.) GROUPS=var(VALUE1 [, VALUE2]) /VARIABLES=VAR_LIST (Paired Samples mode.) PAIRS=VAR_LIST [WITH VAR_LIST [(PAIRED)] ] The 'T-TEST' procedure outputs tables used in testing hypotheses about means. It operates in one of three modes: * One Sample mode. * Independent Groups mode. * Paired mode. Each of these modes are described in more detail below. There are two optional subcommands which are common to all modes. The '/CRITERIA' subcommand tells PSPP the confidence interval used in the tests. The default value is 0.95. The 'MISSING' subcommand determines the handling of missing variables. If 'INCLUDE' is set, then user-missing values are included in the calculations, but system-missing values are not. If 'EXCLUDE' is set, which is the default, user-missing values are excluded as well as system-missing values. This is the default. If 'LISTWISE' is set, then the entire case is excluded from analysis whenever any variable specified in the '/VARIABLES', '/PAIRS' or '/GROUPS' subcommands contains a missing value. If 'ANALYSIS' is set, then missing values are excluded only in the analysis for which they would be needed. This is the default. * Menu: * One Sample Mode:: Testing against a hypothesized mean * Independent Samples Mode:: Testing two independent groups for equal mean * Paired Samples Mode:: Testing two interdependent groups for equal mean  File: pspp.info, Node: One Sample Mode, Next: Independent Samples Mode, Up: T-TEST 15.12.1 One Sample Mode ----------------------- The 'TESTVAL' subcommand invokes the One Sample mode. This mode is used to test a population mean against a hypothesized mean. The value given to the 'TESTVAL' subcommand is the value against which you wish to test. In this mode, you must also use the '/VARIABLES' subcommand to tell PSPP which variables you wish to test.  File: pspp.info, Node: Independent Samples Mode, Next: Paired Samples Mode, Prev: One Sample Mode, Up: T-TEST 15.12.2 Independent Samples Mode -------------------------------- The 'GROUPS' subcommand invokes Independent Samples mode or 'Groups' mode. This mode is used to test whether two groups of values have the same population mean. In this mode, you must also use the '/VARIABLES' subcommand to tell PSPP the dependent variables you wish to test. The variable given in the 'GROUPS' subcommand is the independent variable which determines to which group the samples belong. The values in parentheses are the specific values of the independent variable for each group. If the parentheses are omitted and no values are given, the default values of 1.0 and 2.0 are assumed. If the independent variable is numeric, it is acceptable to specify only one value inside the parentheses. If you do this, cases where the independent variable is greater than or equal to this value belong to the first group, and cases less than this value belong to the second group. When using this form of the 'GROUPS' subcommand, missing values in the independent variable are excluded on a listwise basis, regardless of whether '/MISSING=LISTWISE' was specified.  File: pspp.info, Node: Paired Samples Mode, Prev: Independent Samples Mode, Up: T-TEST 15.12.3 Paired Samples Mode --------------------------- The 'PAIRS' subcommand introduces Paired Samples mode. Use this mode when repeated measures have been taken from the same samples. If the 'WITH' keyword is omitted, then tables for all combinations of variables given in the 'PAIRS' subcommand are generated. If the 'WITH' keyword is given, and the '(PAIRED)' keyword is also given, then the number of variables preceding 'WITH' must be the same as the number following it. In this case, tables for each respective pair of variables are generated. In the event that the 'WITH' keyword is given, but the '(PAIRED)' keyword is omitted, then tables for each combination of variable preceding 'WITH' against variable following 'WITH' are generated.  File: pspp.info, Node: ONEWAY, Next: QUICK CLUSTER, Prev: T-TEST, Up: Statistics 15.13 ONEWAY ============ ONEWAY [/VARIABLES = ] VAR_LIST BY VAR /MISSING={ANALYSIS,LISTWISE} {EXCLUDE,INCLUDE} /CONTRAST= VALUE1 [, VALUE2] ... [,VALUEN] /STATISTICS={DESCRIPTIVES,HOMOGENEITY} /POSTHOC={BONFERRONI, GH, LSD, SCHEFFE, SIDAK, TUKEY, ALPHA ([VALUE])} The 'ONEWAY' procedure performs a one-way analysis of variance of variables factored by a single independent variable. It is used to compare the means of a population divided into more than two groups. The dependent variables to be analysed should be given in the 'VARIABLES' subcommand. The list of variables must be followed by the 'BY' keyword and the name of the independent (or factor) variable. You can use the 'STATISTICS' subcommand to tell PSPP to display ancillary information. The options accepted are: * DESCRIPTIVES Displays descriptive statistics about the groups factored by the independent variable. * HOMOGENEITY Displays the Levene test of Homogeneity of Variance for the variables and their groups. The 'CONTRAST' subcommand is used when you anticipate certain differences between the groups. The subcommand must be followed by a list of numerals which are the coefficients of the groups to be tested. The number of coefficients must correspond to the number of distinct groups (or values of the independent variable). If the total sum of the coefficients are not zero, then PSPP will display a warning, but will proceed with the analysis. The 'CONTRAST' subcommand may be given up to 10 times in order to specify different contrast tests. The 'MISSING' subcommand defines how missing values are handled. If 'LISTWISE' is specified then cases which have missing values for the independent variable or any dependent variable will be ignored. If 'ANALYSIS' is specified, then cases will be ignored if the independent variable is missing or if the dependent variable currently being analysed is missing. The default is 'ANALYSIS'. A setting of 'EXCLUDE' means that variables whose values are user-missing are to be excluded from the analysis. A setting of 'INCLUDE' means they are to be included. The default is 'EXCLUDE'. Using the 'POSTHOC' subcommand you can perform multiple pairwise comparisons on the data. The following comparison methods are available: * 'LSD' Least Significant Difference. * 'TUKEY' Tukey Honestly Significant Difference. * 'BONFERRONI' Bonferroni test. * 'SCHEFFE' Scheffé's test. * 'SIDAK' Sidak test. * 'GH' The Games-Howell test. The optional syntax 'ALPHA(VALUE)' is used to indicate that VALUE should be used as the confidence level for which the posthoc tests will be performed. The default is 0.05.  File: pspp.info, Node: QUICK CLUSTER, Next: RANK, Prev: ONEWAY, Up: Statistics 15.14 QUICK CLUSTER =================== QUICK CLUSTER VAR_LIST [/CRITERIA=CLUSTERS(K) [MXITER(MAX_ITER)] CONVERGE(EPSILON) [NOINITIAL]] [/MISSING={EXCLUDE,INCLUDE} {LISTWISE, PAIRWISE}] [/PRINT={INITIAL} {CLUSTER}] [/SAVE[=[CLUSTER[(MEMBERSHIP_VAR)]] [DISTANCE[(DISTANCE_VAR)]]] The 'QUICK CLUSTER' command performs k-means clustering on the dataset. This is useful when you wish to allocate cases into clusters of similar values and you already know the number of clusters. The minimum specification is 'QUICK CLUSTER' followed by the names of the variables which contain the cluster data. Normally you will also want to specify '/CRITERIA=CLUSTERS(K)' where K is the number of clusters. If this is not specified, then K defaults to 2. If you use '/CRITERIA=NOINITIAL' then a naive algorithm to select the initial clusters is used. This will provide for faster execution but less well separated initial clusters and hence possibly an inferior final result. 'QUICK CLUSTER' uses an iterative algorithm to select the clusters centers. The subcommand '/CRITERIA=MXITER(MAX_ITER)' sets the maximum number of iterations. During classification, PSPP will continue iterating until until MAX_ITER iterations have been done or the convergence criterion (see below) is fulfilled. The default value of MAX_ITER is 2. If however, you specify '/CRITERIA=NOUPDATE' then after selecting the initial centers, no further update to the cluster centers is done. In this case, MAX_ITER, if specified. is ignored. The subcommand '/CRITERIA=CONVERGE(EPSILON)' is used to set the convergence criterion. The value of convergence criterion is EPSILON times the minimum distance between the _initial_ cluster centers. Iteration stops when the mean cluster distance between one iteration and the next is less than the convergence criterion. The default value of EPSILON is zero. The 'MISSING' subcommand determines the handling of missing variables. If 'INCLUDE' is set, then user-missing values are considered at their face value and not as missing values. If 'EXCLUDE' is set, which is the default, user-missing values are excluded as well as system-missing values. If 'LISTWISE' is set, then the entire case is excluded from the analysis whenever any of the clustering variables contains a missing value. If 'PAIRWISE' is set, then a case is considered missing only if all the clustering variables contain missing values. Otherwise it is clustered on the basis of the non-missing values. The default is 'LISTWISE'. The 'PRINT' subcommand requests additional output to be printed. If 'INITIAL' is set, then the initial cluster memberships will be printed. If 'CLUSTER' is set, the cluster memberships of the individual cases will be displayed (potentially generating lengthy output). You can specify the subcommand 'SAVE' to ask that each case's cluster membership and the euclidean distance between the case and its cluster center be saved to a new variable in the active dataset. To save the cluster membership use the 'CLUSTER' keyword and to save the distance use the 'DISTANCE' keyword. Each keyword may optionally be followed by a variable name in parentheses to specify the new variable which is to contain the saved parameter. If no variable name is specified, then PSPP will create one.  File: pspp.info, Node: RANK, Next: REGRESSION, Prev: QUICK CLUSTER, Up: Statistics 15.15 RANK ========== RANK [VARIABLES=] VAR_LIST [{A,D}] [BY VAR_LIST] /TIES={MEAN,LOW,HIGH,CONDENSE} /FRACTION={BLOM,TUKEY,VW,RANKIT} /PRINT[={YES,NO} /MISSING={EXCLUDE,INCLUDE} /RANK [INTO VAR_LIST] /NTILES(k) [INTO VAR_LIST] /NORMAL [INTO VAR_LIST] /PERCENT [INTO VAR_LIST] /RFRACTION [INTO VAR_LIST] /PROPORTION [INTO VAR_LIST] /N [INTO VAR_LIST] /SAVAGE [INTO VAR_LIST] The 'RANK' command ranks variables and stores the results into new variables. The 'VARIABLES' subcommand, which is mandatory, specifies one or more variables whose values are to be ranked. After each variable, 'A' or 'D' may appear, indicating that the variable is to be ranked in ascending or descending order. Ascending is the default. If a 'BY' keyword appears, it should be followed by a list of variables which are to serve as group variables. In this case, the cases are gathered into groups, and ranks calculated for each group. The 'TIES' subcommand specifies how tied values are to be treated. The default is to take the mean value of all the tied cases. The 'FRACTION' subcommand specifies how proportional ranks are to be calculated. This only has any effect if 'NORMAL' or 'PROPORTIONAL' rank functions are requested. The 'PRINT' subcommand may be used to specify that a summary of the rank variables created should appear in the output. The function subcommands are 'RANK', 'NTILES', 'NORMAL', 'PERCENT', 'RFRACTION', 'PROPORTION' and 'SAVAGE'. Any number of function subcommands may appear. If none are given, then the default is RANK. The 'NTILES' subcommand must take an integer specifying the number of partitions into which values should be ranked. Each subcommand may be followed by the 'INTO' keyword and a list of variables which are the variables to be created and receive the rank scores. There may be as many variables specified as there are variables named on the 'VARIABLES' subcommand. If fewer are specified, then the variable names are automatically created. The 'MISSING' subcommand determines how user missing values are to be treated. A setting of 'EXCLUDE' means that variables whose values are user-missing are to be excluded from the rank scores. A setting of 'INCLUDE' means they are to be included. The default is 'EXCLUDE'.  File: pspp.info, Node: REGRESSION, Next: RELIABILITY, Prev: RANK, Up: Statistics 15.16 REGRESSION ================ The 'REGRESSION' procedure fits linear models to data via least-squares estimation. The procedure is appropriate for data which satisfy those assumptions typical in linear regression: * The data set contains n observations of a dependent variable, say Y_1,...,Y_n, and n observations of one or more explanatory variables. Let X_{11}, X_{12}, ..., X_{1n} denote the n observations of the first explanatory variable; X_{21},...,X_{2n} denote the n observations of the second explanatory variable; X_{k1},...,X_{kn} denote the n observations of the kth explanatory variable. * The dependent variable Y has the following relationship to the explanatory variables: Y_i = b_0 + b_1 X_{1i} + ... + b_k X_{ki} + Z_i where b_0, b_1, ..., b_k are unknown coefficients, and Z_1,...,Z_n are independent, normally distributed "noise" terms with mean zero and common variance. The noise, or "error" terms are unobserved. This relationship is called the "linear model". The 'REGRESSION' procedure estimates the coefficients b_0,...,b_k and produces output relevant to inferences for the linear model. * Menu: * Syntax:: Syntax definition. * Examples:: Using the REGRESSION procedure.  File: pspp.info, Node: Syntax, Next: Examples, Up: REGRESSION 15.16.1 Syntax -------------- REGRESSION /VARIABLES=VAR_LIST /DEPENDENT=VAR_LIST /STATISTICS={ALL, DEFAULTS, R, COEFF, ANOVA, BCOV, CI[CONF, TOL]} { /ORIGIN | /NOORIGIN } /SAVE={PRED, RESID} The 'REGRESSION' procedure reads the active dataset and outputs statistics relevant to the linear model specified by the user. The 'VARIABLES' subcommand, which is required, specifies the list of variables to be analyzed. Keyword 'VARIABLES' is required. The 'DEPENDENT' subcommand specifies the dependent variable of the linear model. The 'DEPENDENT' subcommand is required. All variables listed in the 'VARIABLES' subcommand, but not listed in the 'DEPENDENT' subcommand, are treated as explanatory variables in the linear model. All other subcommands are optional: The 'STATISTICS' subcommand specifies which statistics are to be displayed. The following keywords are accepted: 'ALL' All of the statistics below. 'R' The ratio of the sums of squares due to the model to the total sums of squares for the dependent variable. 'COEFF' A table containing the estimated model coefficients and their standard errors. 'CI (CONF)' This item is only relevant if COEFF has also been selected. It specifies that the confidence interval for the coefficients should be printed. The optional value CONF, which must be in parentheses, is the desired confidence level expressed as a percentage. 'ANOVA' Analysis of variance table for the model. 'BCOV' The covariance matrix for the estimated model coefficients. 'TOL' The variance inflation factor and its reciprocal. This has no effect unless COEFF is also given. 'DEFAULT' The same as if R, COEFF, and ANOVA had been selected. This is what you get if the /STATISTICS command is not specified, or if it is specified without any parameters. The 'ORIGIN' and 'NOORIGIN' subcommands are mutually exclusive. 'ORIGIN' indicates that the regression should be performed through the origin. You should use this option if, and only if you have reason to believe that the regression does indeed pass through the origin -- that is to say, the value b_0 above, is zero. The default is 'NOORIGIN'. The 'SAVE' subcommand causes PSPP to save the residuals or predicted values from the fitted model to the active dataset. PSPP will store the residuals in a variable called 'RES1' if no such variable exists, 'RES2' if 'RES1' already exists, 'RES3' if 'RES1' and 'RES2' already exist, etc. It will choose the name of the variable for the predicted values similarly, but with 'PRED' as a prefix. When 'SAVE' is used, PSPP ignores 'TEMPORARY', treating temporary transformations as permanent.  File: pspp.info, Node: Examples, Prev: Syntax, Up: REGRESSION 15.16.2 Examples ---------------- The following PSPP syntax will generate the default output and save the predicted values and residuals to the active dataset. title 'Demonstrate REGRESSION procedure'. data list / v0 1-2 (A) v1 v2 3-22 (10). begin data. b 7.735648 -23.97588 b 6.142625 -19.63854 a 7.651430 -25.26557 c 6.125125 -16.57090 a 8.245789 -25.80001 c 6.031540 -17.56743 a 9.832291 -28.35977 c 5.343832 -16.79548 a 8.838262 -29.25689 b 6.200189 -18.58219 end data. list. regression /variables=v0 v1 v2 /statistics defaults /dependent=v2 /save pred resid /method=enter.  File: pspp.info, Node: RELIABILITY, Next: ROC, Prev: REGRESSION, Up: Statistics 15.17 RELIABILITY ================= RELIABILITY /VARIABLES=VAR_LIST /SCALE (NAME) = {VAR_LIST, ALL} /MODEL={ALPHA, SPLIT[(N)]} /SUMMARY={TOTAL,ALL} /MISSING={EXCLUDE,INCLUDE} The 'RELIABILITY' command performs reliability analysis on the data. The 'VARIABLES' subcommand is required. It determines the set of variables upon which analysis is to be performed. The 'SCALE' subcommand determines which variables reliability is to be calculated for. If it is omitted, then analysis for all variables named in the 'VARIABLES' subcommand will be used. Optionally, the NAME parameter may be specified to set a string name for the scale. The 'MODEL' subcommand determines the type of analysis. If 'ALPHA' is specified, then Cronbach's Alpha is calculated for the scale. If the model is 'SPLIT', then the variables are divided into 2 subsets. An optional parameter N may be given, to specify how many variables to be in the first subset. If N is omitted, then it defaults to one half of the variables in the scale, or one half minus one if there are an odd number of variables. The default model is 'ALPHA'. By default, any cases with user missing, or system missing values for any variables given in the 'VARIABLES' subcommand will be omitted from analysis. The 'MISSING' subcommand determines whether user missing values are to be included or excluded in the analysis. The 'SUMMARY' subcommand determines the type of summary analysis to be performed. Currently there is only one type: 'SUMMARY=TOTAL', which displays per-item analysis tested against the totals.  File: pspp.info, Node: ROC, Prev: RELIABILITY, Up: Statistics 15.18 ROC ========= ROC VAR_LIST BY STATE_VAR (STATE_VALUE) /PLOT = { CURVE [(REFERENCE)], NONE } /PRINT = [ SE ] [ COORDINATES ] /CRITERIA = [ CUTOFF({INCLUDE,EXCLUDE}) ] [ TESTPOS ({LARGE,SMALL}) ] [ CI (CONFIDENCE) ] [ DISTRIBUTION ({FREE, NEGEXPO }) ] /MISSING={EXCLUDE,INCLUDE} The 'ROC' command is used to plot the receiver operating characteristic curve of a dataset, and to estimate the area under the curve. This is useful for analysing the efficacy of a variable as a predictor of a state of nature. The mandatory VAR_LIST is the list of predictor variables. The variable STATE_VAR is the variable whose values represent the actual states, and STATE_VALUE is the value of this variable which represents the positive state. The optional subcommand 'PLOT' is used to determine if and how the 'ROC' curve is drawn. The keyword 'CURVE' means that the 'ROC' curve should be drawn, and the optional keyword 'REFERENCE', which should be enclosed in parentheses, says that the diagonal reference line should be drawn. If the keyword 'NONE' is given, then no 'ROC' curve is drawn. By default, the curve is drawn with no reference line. The optional subcommand 'PRINT' determines which additional tables should be printed. Two additional tables are available. The 'SE' keyword says that standard error of the area under the curve should be printed as well as the area itself. In addition, a p-value under the null hypothesis that the area under the curve equals 0.5 will be printed. The 'COORDINATES' keyword says that a table of coordinates of the 'ROC' curve should be printed. The 'CRITERIA' subcommand has four optional parameters: * The 'TESTPOS' parameter may be 'LARGE' or 'SMALL'. 'LARGE' is the default, and says that larger values in the predictor variables are to be considered positive. 'SMALL' indicates that smaller values should be considered positive. * The 'CI' parameter specifies the confidence interval that should be printed. It has no effect if the 'SE' keyword in the 'PRINT' subcommand has not been given. * The 'DISTRIBUTION' parameter determines the method to be used when estimating the area under the curve. There are two possibilities, viz: 'FREE' and 'NEGEXPO'. The 'FREE' method uses a non-parametric estimate, and the 'NEGEXPO' method a bi-negative exponential distribution estimate. The 'NEGEXPO' method should only be used when the number of positive actual states is equal to the number of negative actual states. The default is 'FREE'. * The 'CUTOFF' parameter is for compatibility and is ignored. The 'MISSING' subcommand determines whether user missing values are to be included or excluded in the analysis. The default behaviour is to exclude them. Cases are excluded on a listwise basis; if any of the variables in VAR_LIST or if the variable STATE_VAR is missing, then the entire case will be excluded.  File: pspp.info, Node: Utilities, Next: Invoking pspp-convert, Prev: Statistics, Up: Top 16 Utilities ************ Commands that don't fit any other category are placed here. Most of these commands are not affected by commands like 'IF' and 'LOOP': they take effect only once, unconditionally, at the time that they are encountered in the input. * Menu: * ADD DOCUMENT:: Add documentary text to the active dataset. * CACHE:: Ignored for compatibility. * CD:: Change the current directory. * COMMENT:: Document your syntax file. * DOCUMENT:: Document the active dataset. * DISPLAY DOCUMENTS:: Display active dataset documents. * DISPLAY FILE LABEL:: Display the active dataset label. * DROP DOCUMENTS:: Remove documents from the active dataset. * ECHO:: Write a string to the output stream. * ERASE:: Erase a file. * EXECUTE:: Execute pending transformations. * FILE LABEL:: Set the active dataset's label. * FINISH:: Terminate the PSPP session. * HOST:: Temporarily return to the operating system. * INCLUDE:: Include a file within the current one. * INSERT:: Insert a file within the current one. * OUTPUT:: Modify the appearance of the output. * PERMISSIONS:: Change permissions on a file. * PRESERVE and RESTORE:: Saving settings and restoring them later. * SET:: Adjust PSPP runtime parameters. * SHOW:: Display runtime parameters. * SUBTITLE:: Provide a document subtitle. * TITLE:: Provide a document title.  File: pspp.info, Node: ADD DOCUMENT, Next: CACHE, Up: Utilities 16.1 ADD DOCUMENT ================= ADD DOCUMENT 'line one' 'line two' ... 'last line' . 'ADD DOCUMENT' adds one or more lines of descriptive commentary to the active dataset. Documents added in this way are saved to system files. They can be viewed using 'SYSFILE INFO' or 'DISPLAY DOCUMENTS'. They can be removed from the active dataset with 'DROP DOCUMENTS'. Each line of documentary text must be enclosed in quotation marks, and may not be more than 80 bytes long. *Note DOCUMENT::.  File: pspp.info, Node: CACHE, Next: CD, Prev: ADD DOCUMENT, Up: Utilities 16.2 CACHE ========== CACHE. This command is accepted, for compatibility, but it has no effect.  File: pspp.info, Node: CD, Next: COMMENT, Prev: CACHE, Up: Utilities 16.3 CD ======= CD 'new directory' . 'CD' changes the current directory. The new directory will become that specified by the command.  File: pspp.info, Node: COMMENT, Next: DOCUMENT, Prev: CD, Up: Utilities 16.4 COMMENT ============ Comment commands: COMMENT comment text ... . *comment text ... . Comments within a line of syntax: FREQUENCIES /VARIABLES=v0 v1 v2. /* All our categorical variables. 'COMMENT' is ignored. It is used to provide information to the author and other readers of the PSPP syntax file. 'COMMENT' can extend over any number of lines. It ends at a dot at the end of a line or a blank line. The comment may contain any characters. PSPP also supports comments within a line of syntax, introduced with '/*'. These comments end at the first '*/' or at the end of the line, whichever comes first. A line that contains just this kind of comment is considered blank and ends the current command.  File: pspp.info, Node: DOCUMENT, Next: DISPLAY DOCUMENTS, Prev: COMMENT, Up: Utilities 16.5 DOCUMENT ============= DOCUMENT DOCUMENTARY_TEXT. 'DOCUMENT' adds one or more lines of descriptive commentary to the active dataset. Documents added in this way are saved to system files. They can be viewed using 'SYSFILE INFO' or 'DISPLAY DOCUMENTS'. They can be removed from the active dataset with 'DROP DOCUMENTS'. Specify the DOCUMENTARY TEXT following the 'DOCUMENT' keyword. It is interpreted literally--any quotes or other punctuation marks will be included in the file. You can extend the documentary text over as many lines as necessary, including blank lines to separate paragraphs. Lines are truncated at 80 bytes. Don't forget to terminate the command with a dot at the end of a line. *Note ADD DOCUMENT::.  File: pspp.info, Node: DISPLAY DOCUMENTS, Next: DISPLAY FILE LABEL, Prev: DOCUMENT, Up: Utilities 16.6 DISPLAY DOCUMENTS ====================== DISPLAY DOCUMENTS. 'DISPLAY DOCUMENTS' displays the documents in the active dataset. Each document is preceded by a line giving the time and date that it was added. *Note DOCUMENT::.  File: pspp.info, Node: DISPLAY FILE LABEL, Next: DROP DOCUMENTS, Prev: DISPLAY DOCUMENTS, Up: Utilities 16.7 DISPLAY FILE LABEL ======================= DISPLAY FILE LABEL. 'DISPLAY FILE LABEL' displays the file label contained in the active dataset, if any. *Note FILE LABEL::. This command is a PSPP extension.  File: pspp.info, Node: DROP DOCUMENTS, Next: ECHO, Prev: DISPLAY FILE LABEL, Up: Utilities 16.8 DROP DOCUMENTS =================== DROP DOCUMENTS. 'DROP DOCUMENTS' removes all documents from the active dataset. New documents can be added with 'DOCUMENT' (*note DOCUMENT::). 'DROP DOCUMENTS' changes only the active dataset. It does not modify any system files stored on disk.  File: pspp.info, Node: ECHO, Next: ERASE, Prev: DROP DOCUMENTS, Up: Utilities 16.9 ECHO ========= ECHO 'arbitrary text' . Use 'ECHO' to write arbitrary text to the output stream. The text should be enclosed in quotation marks following the normal rules for string tokens (*note Tokens::).  File: pspp.info, Node: ERASE, Next: EXECUTE, Prev: ECHO, Up: Utilities 16.10 ERASE =========== ERASE FILE FILE_NAME. 'ERASE FILE' deletes a file from the local file system. FILE_NAME must be quoted. This command cannot be used if the SAFER (*note SET::) setting is active.  File: pspp.info, Node: EXECUTE, Next: FILE LABEL, Prev: ERASE, Up: Utilities 16.11 EXECUTE ============= EXECUTE. 'EXECUTE' causes the active dataset to be read and all pending transformations to be executed.  File: pspp.info, Node: FILE LABEL, Next: FINISH, Prev: EXECUTE, Up: Utilities 16.12 FILE LABEL ================ FILE LABEL FILE_LABEL. 'FILE LABEL' provides a title for the active dataset. This title will be saved into system files and portable files that are created during this PSPP run. FILE_LABEL should not be quoted. If quotes are included, they are literally interpreted and become part of the file label.  File: pspp.info, Node: FINISH, Next: HOST, Prev: FILE LABEL, Up: Utilities 16.13 FINISH ============ FINISH. 'FINISH' terminates the current PSPP session and returns control to the operating system.  File: pspp.info, Node: HOST, Next: INCLUDE, Prev: FINISH, Up: Utilities 16.14 HOST ========== In the syntax below, the square brackets must be included in the command syntax and do not indicate that that their contents are optional. HOST COMMAND=['COMMAND'...] TIMELIMIT=SECS. 'HOST' executes one or more commands, each provided as a string in the required 'COMMAND' subcommand, in the shell of the underlying operating system. PSPP runs each command in a separate shell process and waits for it to finish before running the next one. If a command fails (with a nonzero exit status, or because it is killed by a signal), then PSPP does not run any remaining commands. PSPP provides '/dev/null' as the shell's standard input. If a process needs to read from stdin, redirect from a file or device, or use a pipe. PSPP displays the shell's standard output and standard error as PSPP output. Redirect to a file or '/dev/null' or another device if this is not desired. The following example runs 'rsync' to copy a file from a remote server to the local file 'data.txt', writing 'rsync''s own output to 'rsync-log.txt'. PSPP displays the command's error output, if any. If 'rsync' needs to prompt the user (e.g. to obtain a password), the command fails. Only if the 'rsync' succeeds, PSPP then runs the 'sha512sum' command. HOST COMMAND=['rsync remote:data.txt data.txt > rsync-log.txt' 'sha512sum -c data.txt.sha512sum]. By default, PSPP waits as long as necessary for the series of commands to complete. Use the optional 'TIMELIMIT' subcommand to limit the execution time to the specified number of seconds. PSPP built for mingw does not support all the features of 'HOST'. PSPP rejects this command if the SAFER (*note SET::) setting is active.  File: pspp.info, Node: INCLUDE, Next: INSERT, Prev: HOST, Up: Utilities 16.15 INCLUDE ============= INCLUDE [FILE=]'FILE_NAME' [ENCODING='ENCODING']. 'INCLUDE' causes the PSPP command processor to read an additional command file as if it were included bodily in the current command file. If errors are encountered in the included file, then command processing will stop and no more commands will be processed. Include files may be nested to any depth, up to the limit of available memory. The 'INSERT' command (*note INSERT::) is a more flexible alternative to 'INCLUDE'. An 'INCLUDE' command acts the same as 'INSERT' with 'ERROR=STOP CD=NO SYNTAX=BATCH' specified. The optional 'ENCODING' subcommand has the same meaning as with 'INSERT'.  File: pspp.info, Node: INSERT, Next: OUTPUT, Prev: INCLUDE, Up: Utilities 16.16 INSERT ============ INSERT [FILE=]'FILE_NAME' [CD={NO,YES}] [ERROR={CONTINUE,STOP}] [SYNTAX={BATCH,INTERACTIVE}] [ENCODING={LOCALE, 'CHARSET_NAME'}]. 'INSERT' is similar to 'INCLUDE' (*note INCLUDE::) but somewhat more flexible. It causes the command processor to read a file as if it were embedded in the current command file. If 'CD=YES' is specified, then before including the file, the current directory will be changed to the directory of the included file. The default setting is 'CD=NO'. Note that this directory will remain current until it is changed explicitly (with the 'CD' command, or a subsequent 'INSERT' command with the 'CD=YES' option). It will not revert to its original setting even after the included file is finished processing. If 'ERROR=STOP' is specified, errors encountered in the inserted file will cause processing to immediately cease. Otherwise processing will continue at the next command. The default setting is 'ERROR=CONTINUE'. If 'SYNTAX=INTERACTIVE' is specified then the syntax contained in the included file must conform to interactive syntax conventions. *Note Syntax Variants::. The default setting is 'SYNTAX=BATCH'. 'ENCODING' optionally specifies the character set used by the included file. Its argument, which is not case-sensitive, must be in one of the following forms: 'LOCALE' The encoding used by the system locale, or as overridden by the 'SET' command (*note SET::). On GNU/Linux and other Unix-like systems, environment variables, e.g. 'LANG' or 'LC_ALL', determine the system locale. CHARSET_NAME One of the character set names listed by IANA at . Some examples are 'ASCII' (United States), 'ISO-8859-1' (western Europe), 'EUC-JP' (Japan), and 'windows-1252' (Windows). Not all systems support all character sets. 'Auto,ENCODING' Automatically detects whether a syntax file is encoded in an Unicode encoding such as UTF-8, UTF-16, or UTF-32. If it is not, then PSPP generally assumes that the file is encoded in ENCODING (an IANA character set name). However, if ENCODING is UTF-8, and the syntax file is not valid UTF-8, PSPP instead assumes that the file is encoded in 'windows-1252'. For best results, ENCODING should be an ASCII-compatible encoding (the most common locale encodings are all ASCII-compatible), because encodings that are not ASCII compatible cannot be automatically distinguished from UTF-8. 'Auto' 'Auto,Locale' Automatic detection, as above, with the default encoding taken from the system locale or the setting on 'SET LOCALE'. When ENCODING is not specified, the default is taken from the '--syntax-encoding' command option, if it was specified, and otherwise it is 'Auto'.  File: pspp.info, Node: OUTPUT, Next: PERMISSIONS, Prev: INSERT, Up: Utilities 16.17 OUTPUT ============ OUTPUT MODIFY /SELECT TABLES /TABLECELLS SELECT = [ CLASS... ] FORMAT = FMT_SPEC. *Please note:* In the above synopsis the characters '[' and ']' are literals. They must appear in the syntax to be interpreted. 'OUTPUT' changes the appearance of the tables in which results are printed. In particular, it can be used to set the format and precision to which results are displayed. After running this command, the default table appearance parameters will have been modified and each new output table generated will use the new parameters. Following '/TABLECELLS SELECT =' a list of cell classes must appear, enclosed in square brackets. This list determines the classes of values should be selected for modification. Each class can be: RESIDUAL Residual values. Default: F40.2. CORRELATION Correlations. Default: F40.3. PERCENT Percentages. Default: PCT40.1. SIGNIFICANCE Significance of tests (p-values). Default: F40.3. COUNT Counts or sums of weights. For a weighted data set, the default is the weight variable's print format. For an unweighted data set, the default is F40.0. For most other numeric values that appear in tables, 'SET FORMAT' may be used to specify the format (*note SET FORMAT::). The value of FMT_SPEC must be a valid output format (*note Input and Output Formats::). Note that not all possible formats are meaningful for all classes.  File: pspp.info, Node: PERMISSIONS, Next: PRESERVE and RESTORE, Prev: OUTPUT, Up: Utilities 16.18 PERMISSIONS ================= PERMISSIONS FILE='FILE_NAME' /PERMISSIONS = {READONLY,WRITEABLE}. 'PERMISSIONS' changes the permissions of a file. There is one mandatory subcommand which specifies the permissions to which the file should be changed. If you set a file's permission to 'READONLY', then the file will become unwritable either by you or anyone else on the system. If you set the permission to 'WRITEABLE', then the file will become writeable by you; the permissions afforded to others will be unchanged. This command cannot be used if the 'SAFER' (*note SET::) setting is active.  File: pspp.info, Node: PRESERVE and RESTORE, Next: SET, Prev: PERMISSIONS, Up: Utilities 16.19 PRESERVE and RESTORE ========================== PRESERVE. ... RESTORE. 'PRESERVE' saves all of the settings that 'SET' (*note SET::) can adjust. A later 'RESTORE' command restores those settings. 'PRESERVE' can be nested up to five levels deep.  File: pspp.info, Node: SET, Next: SHOW, Prev: PRESERVE and RESTORE, Up: Utilities 16.20 SET ========= SET (data input) /BLANKS={SYSMIS,'.',number} /DECIMAL={DOT,COMMA} /FORMAT=FMT_SPEC /EPOCH={AUTOMATIC,YEAR} /RIB={NATIVE,MSBFIRST,LSBFIRST,VAX} /RRB={NATIVE,ISL,ISB,IDL,IDB,VF,VD,VG,ZS,ZL} (interaction) /MXERRS=MAX_ERRS /MXWARNS=MAX_WARNINGS /WORKSPACE=WORKSPACE_SIZE (syntax execution) /LOCALE='LOCALE' /MEXPAND={ON,OFF} /MITERATE=MAX_ITERATIONS /MNEST=MAX_NEST /MPRINT={ON,OFF} /MXLOOPS=MAX_LOOPS /SEED={RANDOM,SEED_VALUE} /UNDEFINED={WARN,NOWARN} /FUZZBITS=FUZZBITS (data output) /CC{A,B,C,D,E}={'NPRE,PRE,SUF,NSUF','NPRE.PRE.SUF.NSUF'} /DECIMAL={DOT,COMMA} /FORMAT=FMT_SPEC /WIB={NATIVE,MSBFIRST,LSBFIRST,VAX} /WRB={NATIVE,ISL,ISB,IDL,IDB,VF,VD,VG,ZS,ZL} (output routing) /ERRORS={ON,OFF,TERMINAL,LISTING,BOTH,NONE} /MESSAGES={ON,OFF,TERMINAL,LISTING,BOTH,NONE} /PRINTBACK={ON,OFF,TERMINAL,LISTING,BOTH,NONE} /RESULTS={ON,OFF,TERMINAL,LISTING,BOTH,NONE} (output driver options) /HEADERS={NO,YES,BLANK} /LENGTH={NONE,N_LINES} /WIDTH={NARROW,WIDTH,N_CHARACTERS} /TNUMBERS={VALUES,LABELS,BOTH} /TVARS={NAMES,LABELS,BOTH} (logging) /JOURNAL={ON,OFF} ['FILE_NAME'] (system files) /COMPRESSION={ON,OFF} /SCOMPRESSION={ON,OFF} (miscellaneous) /SAFER=ON /LOCALE='STRING' (obsolete settings accepted for compatibility, but ignored) /BOXSTRING={'XXX','XXXXXXXXXXX'} /CASE={UPPER,UPLOW} /CPI=cpi_value /HIGHRES={ON,OFF} /HISTOGRAM='C' /LOWRES={AUTO,ON,OFF} /LPI=LPI_VALUE /MENUS={STANDARD,EXTENDED} /MXMEMORY=MAX_MEMORY /SCRIPTTAB='c' /TB1={'XXX','XXXXXXXXXXX'} /TBFONTS='STRING' /XSORT={YES,NO} 'SET' allows the user to adjust several parameters relating to PSPP's execution. Since there are many subcommands to this command, its subcommands will be examined in groups. For subcommands that take boolean values, 'ON' and 'YES' are synonymous, as are 'OFF' and 'NO', when used as subcommand values. The data input subcommands affect the way that data is read from data files. The data input subcommands are BLANKS This is the value assigned to an item data item that is empty or contains only white space. An argument of SYSMIS or '.' will cause the system-missing value to be assigned to null items. This is the default. Any real value may be assigned. DECIMAL This value may be set to 'DOT' or 'COMMA'. Setting it to 'DOT' causes the decimal point character to be '.' and the grouping character to be ','. Setting it to 'COMMA' causes the decimal point character to be ',' and the grouping character to be '.'. If the setting is 'COMMA', then ',' will not be treated as a field separator in the 'DATA LIST' command (*note DATA LIST::). The default value is determined from the system locale. FORMAT Allows the default numeric input/output format to be specified. The default is F8.2. *Note Input and Output Formats::. EPOCH Specifies the range of years used when a 2-digit year is read from a data file or used in a date construction expression (*note Date Construction::). If a 4-digit year is specified for the epoch, then 2-digit years are interpreted starting from that year, known as the epoch. If 'AUTOMATIC' (the default) is specified, then the epoch begins 69 years before the current date. RIB PSPP extension to set the byte ordering (endianness) used for reading data in IB or PIB format (*note Binary and Hexadecimal Numeric Formats::). In 'MSBFIRST' ordering, the most-significant byte appears at the left end of a IB or PIB field. In 'LSBFIRST' ordering, the least-significant byte appears at the left end. 'VAX' ordering is like 'MSBFIRST', except that each pair of bytes is in reverse order. 'NATIVE', the default, is equivalent to 'MSBFIRST' or 'LSBFIRST' depending on the native format of the machine running PSPP. RRB PSPP extension to set the floating-point format used for reading data in RB format (*note Binary and Hexadecimal Numeric Formats::). The possibilities are: NATIVE The native format of the machine running PSPP. Equivalent to either IDL or IDB. ISL 32-bit IEEE 754 single-precision floating point, in little-endian byte order. ISB 32-bit IEEE 754 single-precision floating point, in big-endian byte order. IDL 64-bit IEEE 754 double-precision floating point, in little-endian byte order. IDB 64-bit IEEE 754 double-precision floating point, in big-endian byte order. VF 32-bit VAX F format, in VAX-endian byte order. VD 64-bit VAX D format, in VAX-endian byte order. VG 64-bit VAX G format, in VAX-endian byte order. ZS 32-bit IBM Z architecture short format hexadecimal floating point, in big-endian byte order. ZL 64-bit IBM Z architecture long format hexadecimal floating point, in big-endian byte order. Z architecture also supports IEEE 754 floating point. The ZS and ZL formats are only for use with very old input files. The default is NATIVE. Interaction subcommands affect the way that PSPP interacts with an online user. The interaction subcommands are MXERRS The maximum number of errors before PSPP halts processing of the current command file. The default is 50. MXWARNS The maximum number of warnings + errors before PSPP halts processing the current command file. The special value of zero means that all warning situations should be ignored. No warnings will be issued, except a single initial warning advising the user that warnings will not be given. The default value is 100. Syntax execution subcommands control the way that PSPP commands execute. The syntax execution subcommands are LOCALE Overrides the system locale for the purpose of reading and writing syntax and data files. The argument should be a locale name in the general form 'LANGUAGE_COUNTRY.ENCODING', where LANGUAGE and COUNTRY are 2-character language and country abbreviations, respectively, and ENCODING is an IANA character set name. Example locales are 'en_US.UTF-8' (UTF-8 encoded English as spoken in the United States) and 'ja_JP.EUC-JP' (EUC-JP encoded Japanese as spoken in Japan). MEXPAND MITERATE MNEST MPRINT Currently not used. MXLOOPS The maximum number of iterations for an uncontrolled loop (*note LOOP::). The default MAX_LOOPS is 40. SEED The initial pseudo-random number seed. Set to a real number or to RANDOM, which will obtain an initial seed from the current time of day. UNDEFINED Currently not used. FUZZBITS The maximum number of bits of errors in the least-significant places to accept for rounding up a value that is almost halfway between two possibilities for rounding with the RND operator (*note Miscellaneous Mathematics::). The default FUZZBITS is 6. WORKSPACE The maximum amount of memory (in kilobytes) that PSPP will use to store data being processed. If memory in excess of the workspace size is required, then PSPP will start to use temporary files to store the data. Setting a higher value will, in general, mean procedures will run faster, but may cause other applications to run slower. On platforms without virtual memory management, setting a very large workspace may cause PSPP to abort. Data output subcommands affect the format of output data. These subcommands are CCA CCB CCC CCD CCE Set up custom currency formats. *Note Custom Currency Formats::, for details. DECIMAL The default 'DOT' setting causes the decimal point character to be '.'. A setting of 'COMMA' causes the decimal point character to be ','. FORMAT Allows the default numeric input/output format to be specified. The default is F8.2. *Note Input and Output Formats::. WIB PSPP extension to set the byte ordering (endianness) used for writing data in IB or PIB format (*note Binary and Hexadecimal Numeric Formats::). In 'MSBFIRST' ordering, the most-significant byte appears at the left end of a IB or PIB field. In 'LSBFIRST' ordering, the least-significant byte appears at the left end. 'VAX' ordering is like 'MSBFIRST', except that each pair of bytes is in reverse order. 'NATIVE', the default, is equivalent to 'MSBFIRST' or 'LSBFIRST' depending on the native format of the machine running PSPP. WRB PSPP extension to set the floating-point format used for writing data in RB format (*note Binary and Hexadecimal Numeric Formats::). The choices are the same as 'SET RIB'. The default is 'NATIVE'. In the PSPP text-based interface, the output routing subcommands affect where output is sent. The following values are allowed for each of these subcommands: OFF NONE Discard this kind of output. TERMINAL Write this output to the terminal, but not to listing files and other output devices. LISTING Write this output to listing files and other output devices, but not to the terminal. ON BOTH Write this type of output to all output devices. These output routing subcommands are: ERRORS Applies to error and warning messages. The default is 'BOTH'. MESSAGES Applies to notes. The default is 'BOTH'. PRINTBACK Determines whether the syntax used for input is printed back as part of the output. The default is 'NONE'. RESULTS Applies to everything not in one of the above categories, such as the results of statistical procedures. The default is 'BOTH'. These subcommands have no effect on output in the PSPP GUI environment. Output driver option subcommands affect output drivers' settings. These subcommands are HEADERS LENGTH WIDTH TNUMBERS The 'TNUMBERS' option sets the way in which values are displayed in output tables. The valid settings are 'VALUES', 'LABELS' and 'BOTH'. If 'TNUMBERS' is set to 'VALUES', then all values are displayed with their literal value (which for a numeric value is a number and for a string value an alphanumeric string). If 'TNUMBERS' is set to 'LABELS', then values are displayed using their assigned labels if any. (*Note VALUE LABELS::.) If the a value has no label, then it will be displayed using its literal value. If 'TNUMBERS' is set to 'BOTH', then values will be displayed with both their label (if any) and their literal value in parentheses. TVARS The 'TVARS' option sets the way in which variables are displayed in output tables. The valid settings are 'NAMES', 'LABELS' and 'BOTH'. If 'TVARS' is set to 'NAMES', then all variables are displayed using their names. If 'TVARS' is set to 'LABELS', then variables are displayed using their label if one has been set. If no label has been set, then the name will be used. (*Note VARIABLE LABELS::.) If 'TVARS' is set to 'BOTH', then variables will be displayed with both their label (if any) and their name in parentheses. Logging subcommands affect logging of commands executed to external files. These subcommands are JOURNAL LOG These subcommands, which are synonyms, control the journal. The default is 'ON', which causes commands entered interactively to be written to the journal file. Commands included from syntax files that are included interactively and error messages printed by PSPP are also written to the journal file, prefixed by '>'. 'OFF' disables use of the journal. The journal is named 'pspp.jnl' by default. A different name may be specified. System file subcommands affect the default format of system files produced by PSPP. These subcommands are COMPRESSION Not currently used. SCOMPRESSION Whether system files created by 'SAVE' or 'XSAVE' are compressed by default. The default is 'ON'. Security subcommands affect the operations that commands are allowed to perform. The security subcommands are SAFER Setting this option disables the following operations: * The 'ERASE' command. * The 'HOST' command. * The 'PERMISSIONS' command. * Pipes (file names beginning or ending with '|'). Be aware that this setting does not guarantee safety (commands can still overwrite files, for instance) but it is an improvement. When set, this setting cannot be reset during the same session, for obvious security reasons. LOCALE This item is used to set the default character encoding. The encoding may be specified either as an encoding name or alias (see ), or as a locale name. If given as a locale name, only the character encoding of the locale is relevant. System files written by PSPP will use this encoding. System files read by PSPP, for which the encoding is unknown, will be interpreted using this encoding. The full list of valid encodings and locale names/alias are operating system dependent. The following are all examples of acceptable syntax on common GNU/Linux systems. SET LOCALE='iso-8859-1'. SET LOCALE='ru_RU.cp1251'. SET LOCALE='japanese'. Contrary to intuition, this command does not affect any aspect of the system's locale.  File: pspp.info, Node: SHOW, Next: SUBTITLE, Prev: SET, Up: Utilities 16.21 SHOW ========== SHOW [ALL] [BLANKS] [CC] [CCA] [CCB] [CCC] [CCD] [CCE] [COPYING] [DECIMALS] [DIRECTORY] [ENVIRONMENT] [FORMAT] [FUZZBITS] [LENGTH] [MXERRS] [MXLOOPS] [MXWARNS] [N] [SCOMPRESSION] [TEMPDIR] [UNDEFINED] [VERSION] [WARRANTY] [WEIGHT] [WIDTH] 'SHOW' can be used to display the current state of PSPP's execution parameters. Parameters that can be changed using 'SET' (*note SET::), can be examined using 'SHOW' using the subcommand with the same name. 'SHOW' supports the following additional subcommands: 'ALL' Show all settings. 'CC' Show all custom currency settings ('CCA' through 'CCE'). 'DIRECTORY' Shows the current working directory. 'ENVIRONMENT' Shows the operating system details. 'N' Reports the number of cases in the active dataset. The reported number is not weighted. If no dataset is defined, then 'Unknown' will be reported. 'TEMPDIR' Shows the path of the directory where temporary files will be stored. 'VERSION' Shows the version of this installation of PSPP. 'WARRANTY' Show details of the lack of warranty for PSPP. 'COPYING' / 'LICENSE' Display the terms of PSPP's copyright licence (*note License::). Specifying 'SHOW' without any subcommands is equivalent to 'SHOW ALL'.  File: pspp.info, Node: SUBTITLE, Next: TITLE, Prev: SHOW, Up: Utilities 16.22 SUBTITLE ============== SUBTITLE 'SUBTITLE_STRING'. or SUBTITLE SUBTITLE_STRING. 'SUBTITLE' provides a subtitle to a particular PSPP run. This subtitle appears at the top of each output page below the title, if headers are enabled on the output device. Specify a subtitle as a string in quotes. The alternate syntax that did not require quotes is now obsolete. If it is used then the subtitle is converted to all uppercase.  File: pspp.info, Node: TITLE, Prev: SUBTITLE, Up: Utilities 16.23 TITLE =========== TITLE 'TITLE_STRING'. or TITLE TITLE_STRING. 'TITLE' provides a title to a particular PSPP run. This title appears at the top of each output page, if headers are enabled on the output device. Specify a title as a string in quotes. The alternate syntax that did not require quotes is now obsolete. If it is used then the title is converted to all uppercase.  File: pspp.info, Node: Invoking pspp-convert, Next: Invoking pspp-output, Prev: Utilities, Up: Top 17 Invoking 'pspp-convert' ************************** 'pspp-convert' is a command-line utility accompanying PSPP. It reads an SPSS or SPSS/PC+ system file or SPSS portable file or encrypted SPSS syntax file INPUT and writes a copy of it to another OUTPUT in a different format. Synopsis: pspp-convert [OPTIONS] INPUT OUTPUT pspp-convert --help pspp-convert --version The format of INPUT is automatically detected, when possible. The character encoding of old SPSS system files cannot always be guessed correctly, and SPSS/PC+ system files do not include any indication of their encoding. Use '-e ENCODING' to specify the encoding in this case. By default, the intended format for OUTPUT is inferred based on its extension: 'csv' 'txt' Comma-separated value. Each value is formatted according to its variable's print format. The first line in the file contains variable names. 'sav' 'sys' SPSS system file. 'por' SPSS portable file. 'sps' SPSS syntax file. (Only encrypted syntax files may be converted to this format.) 'pspp-convert' can convert most input formats to most output formats. Encrypted SPSS file formats are exceptions: if the input file is in an encrypted format, then the output file will be the same format (decrypted). To decrypt such a file, specify the encrypted file as INPUT. The output will be the equivalent plaintext file. Options for the output format are ignored in this case. The password for encrypted files can be specified a few different ways. If the password is known, use the '-p' option (documented below) or allow 'pspp-convert' to prompt for it. If the password is unknown, use the '-a' and '-l' options to specify how to search for it, or '--password-list' to specify a file of passwords to try. Use '-O FORMAT' to override the inferred format or to specify the format for unrecognized extensions. 'pspp-convert' accepts the following general options: '-O FORMAT' '--output-format=FORMAT' Sets the output format, where FORMAT is one of the extensions listed above, e.g.: '-O csv'. Use '--help' to list the supported output formats. '-c MAXCASES' '--cases=MAXCASES' By default, all cases are copied from INPUT to OUTPUT. Specifying this option to limit the number of cases written to OUTPUT to MAXCASES. '-e CHARSET' '--encoding=CHARSET' Overrides the encoding in which character strings in INPUT are interpreted. This option is necessary because old SPSS system files, and SPSS/PC+ system files, do not self-identify their encoding. '-k VARIABLE...' '--keep=VARIABLE...' By default, 'pspp-convert' includes all the variables from the input file. Use this option to list specific variables to include; any variables not listed will be dropped. The variables in the output file will also be reordered into the given order. The variable list may use 'TO' in the same way as in PSPP syntax, e.g. if the dictionary contains consecutive variables 'a', 'b', 'c', and 'd', then '--keep='a to d'' will include all of them (and no others). '-d VARIABLE...' '--drop=VARIABLE...' Drops the specified variables from the output. When '--keep' and '--drop' are used together, '--keep' is processed first. '-h' '--help' Prints a usage message on stdout and exits. '-v' '--version' Prints version information on stdout and exits. The following options affect CSV output: '--recode' By default, 'pspp-convert' writes user-missing values to CSV output files as their regular values. With this option, 'pspp-convert' recodes them to system-missing values (which are written as a single space). '--no-var-names' By default, 'pspp-convert' writes the variable names as the first line of output. With this option, 'pspp-convert' omits this line. '--labels' By default, 'pspp-convert' writes variables' values to CSV output files. With this option, 'pspp-convert' writes value labels. '--print-formats' By default, 'pspp-convert' writes numeric variables as plain numbers. This option makes 'pspp-convert' honor variables' print formats. '--decimal=DECIMAL' This option sets the character used as a decimal point in output. The default is '.'. '--delimiter=DELIMITER' This option sets the character used to separate fields in output. The default is ',', unless the decimal point is ',', in which case ';' is used. '--qualifier=QUALIFIER' The option sets the character used to quote fields that contain the delimiter. The default is '"'. The following options specify how to obtain the password for encrypted files: '-p PASSWORD' '--password=PASSWORD' Specifies the password to use to decrypt an encrypted SPSS system file or syntax file. If this option is not specified, 'pspp-convert' will prompt interactively for the password as necessary. Be aware that command-line options, including passwords, may be visible to other users on multiuser systems. When used with '-a' (or '--password-alphabet') and '-l' (or '--password-length'), this option specifies the starting point for the search. This can be used to restart a search that was interrupted. '-a ALPHABET' '--password-alphabet=ALPHABET' Specifies the alphabet of symbols over which to search for an encrypted file's password. ALPHABET may include individual characters and ranges delimited by '-'. For example, '-a a-z' searches lowercase letters, '-a A-Z0-9' searches uppercase letters and digits, and '-a ' -~'' searches all printable ASCII characters. '-l MAX-LENGTH' '--password-length=MAX-LENGTH' Specifies the maximum length of the passwords to try. '--password-list=FILE' Specifies a file to read containing a list of passwords to try, one per line. If FILE is '-', reads from stdin.  File: pspp.info, Node: Invoking pspp-output, Next: Invoking pspp-dump-sav, Prev: Invoking pspp-convert, Up: Top 18 Invoking 'pspp-output' ************************* 'pspp-output' is a command-line utility accompanying PSPP. It supports multiple operations on SPSS viewer or '.spv' files, here called SPV files. SPSS 16 and later writes SPV files to represent the contents of its output editor. SPSS 15 and earlier versions instead use '.spo' files. 'pspp-output' does not support this format. 'pspp-options' may be invoked in the following ways: pspp-output detect FILE pspp-output [OPTIONS] dir FILE pspp-output [OPTIONS] convert SOURCE DESTINATION pspp-output --help pspp-output --version Each of these forms is documented separately below. 'pspp-output' also has several undocumented command forms that developers may find useful for debugging. * Menu: * The pspp-output detect Command:: * The pspp-output dir Command:: * The pspp-output convert Command:: * Input Selection Options::  File: pspp.info, Node: The pspp-output detect Command, Next: The pspp-output dir Command, Up: Invoking pspp-output 18.1 The 'detect' Command ========================= pspp-output detect FILE When FILE is an SPV file, 'pspp-output' exits successfully without outputting anything. When FILE is not an SPV file or some other error occurs, 'pspp-output' prints an error message and exits with a failure indication.  File: pspp.info, Node: The pspp-output dir Command, Next: The pspp-output convert Command, Prev: The pspp-output detect Command, Up: Invoking pspp-output 18.2 The 'dir' Command ====================== pspp-output [OPTIONS] dir FILE Prints on stdout a table of contents for SPV file FILE. By default, this table lists every object in the file, except for hidden objects. *Note Input Selection Options::, for information on the options available to select a subset of objects. The following additional option for 'dir' is intended mainly for use by PSPP developers: '--member-names' Also show the names of the Zip members associated with each object.  File: pspp.info, Node: The pspp-output convert Command, Next: Input Selection Options, Prev: The pspp-output dir Command, Up: Invoking pspp-output 18.3 The 'convert' Command ========================== pspp-output [OPTIONS] convert SOURCE DESTINATION Reads SPV file SOURCE and converts it to another format, writing the output to DESTINATION. By default, the intended format for DESTINATION is inferred based on its extension, in the same way that the 'pspp' program does for its output files. *Note Invoking PSPP::, for details. *Note Input Selection Options::, for information on the options available to select a subset of objects to include in the output. The following additional options are accepted: '-O format=FORMAT' Overrides the format inferred from the output file's extension. Use '--help' to list the available formats. *Note Invoking PSPP::, for details of the available output formats. '-O OPTION=VALUE' Sets an option for the output file format. *Note Invoking PSPP::, for details of the available output options. '-F' '--force' By default, if the source is corrupt or otherwise cannot be processed, the destination is not written. With '-F' or '--force', the destination is written as best it can, even with errors.  File: pspp.info, Node: Input Selection Options, Prev: The pspp-output convert Command, Up: Invoking pspp-output 18.4 Input Selection Options ============================ The 'dir' and 'convert' commands, by default, operate on all of the objects in the source SPV file, except for objects that are not visible in the output viewer window. The user may specify these options to select a subset of the input objects. When multiple options are used, only objects that satisfy all of them are selected: '--select=[^]CLASS...' Include only objects of the given CLASS; with leading '^', include only objects not in the class. Use commas to separate multiple classes. The supported classes are: 'charts headings logs models tables texts trees warnings outlineheaders pagetitle notes unknown other' Use '--select=help' to print this list of classes. '--commands=[^]COMMAND...' '--subtypes=[^]SUBTYPE...' '--labels=[^]LABEL...' Include only objects with the specified COMMAND, SUBTYPE, or LABEL. With a leading '^', include only the objects that do not match. Multiple values may be specified separated by commas. An asterisk at the end of a value acts as a wildcard. The '--command' option matches command identifiers, case insensitively. All of the objects produced by a single command use the same, unique command identifier. Command identifiers are always in English regardless of the language used for output. They often differ from the command name in PSPP syntax. Use the 'pspp-output' program's 'dir' command to print command identifiers in particular output. The '--subtypes' option matches particular tables within a command, case insensitively. Subtypes are not necessarily unique: two commands that produce similar output tables may use the same subtype. Subtypes are always in English and 'dir' will print them. The '--labels' option matches the labels in table output (that is, the table titles). Labels are affected by the output language, variable names and labels, split file settings, and other factors. '--instances=INSTANCE...' Include the specified INSTANCE of an object that matches the other criteria within a single command. The INSTANCE may be a number (1 for the first instance, 2 for the second, and so on) or 'last' for the last instance. '--show-hidden' Include hidden output objects in the output. By default, they are excluded. '--or' Separates two sets of selection options. Objects selected by either set of options are included in the output. The following additional input selection options are intended mainly for use by PSPP developers: '--errors' Include only objects that cause an error when read. With the 'convert' command, this is most useful in conjunction with the '--force' option. '--members=MEMBER...' Include only the objects that include a listed Zip file MEMBER. More than one name may be included, comma-separated. The members in an SPV file may be listed with the 'dir' command by adding the '--show-members' option or with the 'zipinfo' program included with many operating systems. Error messages that 'pspp-output' prints when it reads SPV files also often include member names. '--member-names' Displays the name of the Zip member or members associated with each object just above the object itself.  File: pspp.info, Node: Invoking pspp-dump-sav, Next: Not Implemented, Prev: Invoking pspp-output, Up: Top 19 Invoking 'pspp-dump-sav' *************************** 'pspp-dump-sav' is a command-line utility accompanying PSPP. It reads one or more SPSS system files and prints their contents. The output format is useful for debugging system file readers and writers and for discovering how to interpret unknown or poorly understood records. End users may find the output useful for providing the PSPP developers information about system files that PSPP does not accurately read. Synopsis: pspp-dump-sav [-d[MAXCASES] | --data[=MAXCASES]] FILE... pspp-dump-sav --help | -h pspp-dump-sav --version | -v The following options are accepted: -d[MAXCASES] --data[=MAXCASES] By default, 'pspp-dump-sav' does not print any of the data in a system file, only the file headers. Specify this option to print the data as well. If MAXCASES is specified, then it limits the number of cases printed. -h --help Prints a usage message on stdout and exits. -v --version Prints version information on stdout and exits. Some errors that prevent files from being interpreted successfully cause 'pspp-dump-sav' to exit without reading any additional files given on the command line.  File: pspp.info, Node: Not Implemented, Next: Bugs, Prev: Invoking pspp-dump-sav, Up: Top 20 Not Implemented ****************** This chapter lists parts of the PSPP language that are not yet implemented. '2SLS' Two stage least squares regression 'ACF' Autocorrelation function 'ALSCAL' Multidimensional scaling 'ANACOR' Correspondence analysis 'ANOVA' Factorial analysis of variance 'CASEPLOT' Plot time series 'CASESTOVARS' Restructure complex data 'CATPCA' Categorical principle components analysis 'CATREG' Categorical regression 'CCF' Time series cross correlation 'CLEAR TRANSFORMATIONS' Clears transformations from active dataset 'CLUSTER' Hierarchical clustering 'CONJOINT' Analyse full concept data 'CORRESPONDENCE' Show correspondence 'COXREG' Cox proportional hazards regression 'CREATE' Create time series data 'CSDESCRIPTIVES' Complex samples descriptives 'CSGLM' Complex samples GLM 'CSLOGISTIC' Complex samples logistic regression 'CSPLAN' Complex samples design 'CSSELECT' Select complex samples 'CSTABULATE' Tabulate complex samples 'CTABLES' Display complex samples 'CURVEFIT' Fit curve to line plot 'DATE' Create time series data 'DEFINE' Syntax macros 'DETECTANOMALY' Find unusual cases 'DISCRIMINANT' Linear discriminant analysis 'EDIT' obsolete 'END FILE TYPE' Ends complex data input 'FILE TYPE' Complex data input 'FIT' Goodness of Fit 'GENLOG' Categorical model fitting 'GET TRANSLATE' Read other file formats 'GGRAPH' Custom defined graphs 'HILOGLINEAR' Hierarchical loglinear models 'HOMALS' Homogeneity analysis 'IGRAPH' Interactive graphs 'INFO' Local Documentation 'KEYED DATA LIST' Read nonsequential data 'KM' Kaplan-Meier 'LOGLINEAR' General model fitting 'MANOVA' Multivariate analysis of variance 'MAPS' Geographical display 'MATRIX' Matrix processing 'MCONVERT' Convert covariance/correlation matrices 'MIXED' Mixed linear models 'MODEL CLOSE' Close server connection 'MODEL HANDLE' Define server connection 'MODEL LIST' Show existing models 'MODEL NAME' Specify model label 'MULTIPLE CORRESPONDENCE' Multiple correspondence analysis 'MULT RESPONSE' Multiple response analysis 'MVA' Missing value analysis 'NAIVEBAYES' Small sample bayesian prediction 'NLR' Non Linear Regression 'NOMREG' Multinomial logistic regression 'NONPAR CORR' Nonparametric correlation 'NUMBERED' 'OLAP CUBES' On-line analytical processing 'OMS' Output management 'ORTHOPLAN' Orthogonal effects design 'OVERALS' Nonlinear canonical correlation 'PACF' Partial autocorrelation 'PARTIAL CORR' Partial correlation 'PLANCARDS' Conjoint analysis planning 'PLUM' Estimate ordinal regression models 'POINT' Marker in keyed file 'PPLOT' Plot time series variables 'PREDICT' Specify forecast period 'PREFSCAL' Multidimensional unfolding 'PRINCALS' PCA by alternating least squares 'PROBIT' Probit analysis 'PROCEDURE OUTPUT' Specify output file 'PROXIMITIES' Pairwise similarity 'PROXSCAL' Multidimensional scaling of proximity data 'RATIO STATISTICS' Descriptives of ratios 'READ MODEL' Read new model 'RECORD TYPE' Defines a type of record within FILE TYPE 'REFORMAT' Read obsolete files 'REPEATING DATA' Specify multiple cases per input record 'REPORT' Pretty print working file 'RMV' Replace missing values 'SCRIPT' Run script file 'SEASON' Estimate seasonal factors 'SELECTPRED' Select predictor variables 'SPCHART' Plot control charts 'SPECTRA' Plot spectral density 'STEMLEAF' Plot stem-and-leaf display 'SUMMARIZE' Univariate statistics 'SURVIVAL' Survival analysis 'TDISPLAY' Display active models 'TREE' Create classification tree 'TSAPPLY' Apply time series model 'TSET' Set time sequence variables 'TSHOW' Show time sequence variables 'TSMODEL' Estimate time series model 'TSPLOT' Plot time sequence variables 'TWOSTEP CLUSTER' Cluster observations 'UNIANOVA' Univariate analysis 'UNNUMBERED' obsolete 'VALIDATEDATA' Identify suspicious cases 'VARCOMP' Estimate variance 'VARSTOCASES' Restructure complex data 'VERIFY' Report time series 'WLS' Weighted least squares regression 'XGRAPH' High resolution charts  File: pspp.info, Node: Bugs, Next: Function Index, Prev: Not Implemented, Up: Top 21 Bugs ******* Occasionally you may encounter a bug in PSPP. If you believe you have found a bug, please make sure that it really is a bug. Sometimes, what may appear to be a bug, turns out to be a misunderstanding of how to use the program. If you are unsure, ask for advice on the pspp-users mailing list. Information about the mailing list is at . It is also valuable to try the newest version of PSPP, since the problem may have already been fixed. You can always find the newest version of PSPP by visiting the PSPP website (https://www.gnu.org/s/pspp). You might have obtained PSPP from a downstream packager, such as a GNU/Linux distribution; if your downstream package is not up-to-date, please ask the distributor to update to the newest version. If the problem persists in the up-to-date version, check to see if it has already been reported. Reported issues are listed at . If it has already been reported, you might consider adding a comment with additional information or even just to mention that you are also experiencing the problem, since the PSPP developers are often inclined to work on issues that are important to a large number of users. For known issues in individual language features, see the relevant section in *note Language::. If the problem exists in a recent version and it has not already been reported, then please report it. 21.1 How to report bugs ======================= The best way to send a bug report is using the web page at . Alternatively, bug reports may be sent by email to . A high-quality bug report allows the developers to understand, reproduce, and ultimately fix the problem. We recommend including the following: * The version of PSPP in which you encountered the problem That means the precise version number. "The latest version" is often too ambiguous because releases happen quickly, and bug reports are archived indefinitely. * The operating system and type of computer on which it is running. * A sample of the syntax which causes the problem or, if it is a user interface problem, the sequence of steps required to reproduce it. Screenshots can be helpful for reporting bugs in the graphical user interface, especially since GUI bugs can arise on some systems but not others, but they do not usually help fixing other kinds of bugs. * A description of what you think is wrong: What happened that you didn't expect, and what did you expect to happen? Here is one example of a bug report that includes all of the elements above: When I run PSPP 0.8.4 on my GNU/Linux system, executing the following syntax: DATA LIST FREE /x *. BEGIN DATA. 1 2 3 END DATA. LIST. results in: 4 5 6 but I think the output should be: 1 2 3 The following bug report, on the other hand, does not provide enough information for PSPP developers to understand the problem. This means that the developers cannot identify or fix the problem without additional rounds of questions, which is more work for both the reporter and the developer: I downloaded the latest version of PSPP and entered a sequence of numbers, but when I analyse them it gives the wrong output. PSPP developers value all users' feedback, but cannot promise an immediate response. The bug reporting is not a consultancy or support service, although you can make private arrangements for such services. Since PSPP is free software, consultants have access to the information they need to provide such support. For general enquiries or help, please use the pspp-users mailing list (http://lists.gnu.org/mailman/listinfo/pspp-users) instead of the bug mailing list or bug tracker. The PSPP bug tracker and bug reporting mailing list are public. To privately report a security vulnerability in GNU PSPP, please send your report to the closed mailing list . The PSPP developers will help you assess your report and fix problems prior to public disclosure.  File: pspp.info, Node: Function Index, Next: Command Index, Prev: Bugs, Up: Top 22 Function Index ***************** [index] * Menu: * (VARIABLE): Miscellaneous Functions. (line 41) * ABS: Miscellaneous Mathematics. (line 9) * ACOS: Trigonometry. (line 10) * ANY: Set Membership. (line 13) * ARCOS: Trigonometry. (line 9) * ARSIN: Trigonometry. (line 15) * ARTAN: Trigonometry. (line 20) * ASIN: Trigonometry. (line 16) * ATAN: Trigonometry. (line 21) * CDF.BERNOULLI: Discrete Distributions. (line 9) * CDF.BETA: Continuous Distributions. (line 9) * CDF.BINOM: Discrete Distributions. (line 15) * CDF.CAUCHY: Continuous Distributions. (line 25) * CDF.CHISQ: Continuous Distributions. (line 31) * CDF.EXP: Continuous Distributions. (line 41) * CDF.F: Continuous Distributions. (line 55) * CDF.GAMMA: Continuous Distributions. (line 65) * CDF.GEOM: Discrete Distributions. (line 21) * CDF.HYPER: Discrete Distributions. (line 27) * CDF.LAPLACE: Continuous Distributions. (line 76) * CDF.LNORMAL: Continuous Distributions. (line 99) * CDF.LOGISTIC: Continuous Distributions. (line 92) * CDF.NEGBIN: Discrete Distributions. (line 39) * CDF.NORMAL: Continuous Distributions. (line 106) * CDF.PARETO: Continuous Distributions. (line 129) * CDF.POISSON: Discrete Distributions. (line 46) * CDF.RAYLEIGH: Continuous Distributions. (line 136) * CDF.T: Continuous Distributions. (line 149) * CDF.T1G: Continuous Distributions. (line 157) * CDF.T2G: Continuous Distributions. (line 163) * CDF.UNIFORM: Continuous Distributions. (line 169) * CDF.VBNOR: Continuous Distributions. (line 19) * CDF.WEIBULL: Continuous Distributions. (line 180) * CDFNORM: Continuous Distributions. (line 113) * CFVAR: Statistical Functions. (line 24) * CONCAT: String Functions. (line 8) * COS: Trigonometry. (line 24) * CTIME.DAYS: Time Extraction. (line 9) * CTIME.HOURS: Time Extraction. (line 12) * CTIME.MINUTES: Time Extraction. (line 15) * CTIME.SECONDS: Time Extraction. (line 18) * DATE.DMY: Date Construction. (line 39) * DATE.MDY: Date Construction. (line 40) * DATE.MOYR: Date Construction. (line 44) * DATE.QYR: Date Construction. (line 48) * DATE.WKYR: Date Construction. (line 52) * DATE.YRDAY: Date Construction. (line 56) * DATEDIFF: Time and Date Arithmetic. (line 24) * DATESUM: Time and Date Arithmetic. (line 40) * EXP: Mathematics. (line 9) * IDF.BETA: Continuous Distributions. (line 10) * IDF.CAUCHY: Continuous Distributions. (line 26) * IDF.CHISQ: Continuous Distributions. (line 33) * IDF.EXP: Continuous Distributions. (line 42) * IDF.F: Continuous Distributions. (line 57) * IDF.GAMMA: Continuous Distributions. (line 66) * IDF.LAPLACE: Continuous Distributions. (line 77) * IDF.LNORMAL: Continuous Distributions. (line 100) * IDF.LOGISTIC: Continuous Distributions. (line 93) * IDF.NORMAL: Continuous Distributions. (line 107) * IDF.PARETO: Continuous Distributions. (line 130) * IDF.RAYLEIGH: Continuous Distributions. (line 137) * IDF.T: Continuous Distributions. (line 150) * IDF.T1G: Continuous Distributions. (line 158) * IDF.T2G: Continuous Distributions. (line 164) * IDF.UNIFORM: Continuous Distributions. (line 170) * IDF.WEIBULL: Continuous Distributions. (line 181) * INDEX: String Functions. (line 13) * INDEX <1>: String Functions. (line 19) * LAG: Miscellaneous Functions. (line 6) * LENGTH: String Functions. (line 27) * LG10: Mathematics. (line 12) * LN: Mathematics. (line 16) * LNGAMMA: Mathematics. (line 20) * LOWER: String Functions. (line 30) * LPAD: String Functions. (line 35) * LPAD <1>: String Functions. (line 41) * LTRIM: String Functions. (line 48) * LTRIM <1>: String Functions. (line 53) * MAX: Statistical Functions. (line 29) * MEAN: Statistical Functions. (line 33) * MEDIAN: Statistical Functions. (line 36) * MIN: Statistical Functions. (line 41) * MISSING: Missing Value Functions. (line 12) * MOD: Miscellaneous Mathematics. (line 12) * MOD10: Miscellaneous Mathematics. (line 18) * NCDF.BETA: Continuous Distributions. (line 13) * NCDF.CHISQ: Continuous Distributions. (line 35) * NMISS: Missing Value Functions. (line 18) * NORMAL: Continuous Distributions. (line 119) * NPDF.BETA: Continuous Distributions. (line 12) * NUMBER: String Functions. (line 58) * NVALID: Missing Value Functions. (line 23) * PDF.BERNOULLI: Discrete Distributions. (line 8) * PDF.BETA: Continuous Distributions. (line 8) * PDF.BINOM: Discrete Distributions. (line 14) * PDF.BVNOR: Continuous Distributions. (line 18) * PDF.CAUCHY: Continuous Distributions. (line 24) * PDF.EXP: Continuous Distributions. (line 40) * PDF.F: Continuous Distributions. (line 54) * PDF.GAMMA: Continuous Distributions. (line 64) * PDF.GEOM: Discrete Distributions. (line 20) * PDF.HYPER: Discrete Distributions. (line 26) * PDF.LANDAU: Continuous Distributions. (line 71) * PDF.LAPLACE: Continuous Distributions. (line 75) * PDF.LNORMAL: Continuous Distributions. (line 98) * PDF.LOG: Discrete Distributions. (line 33) * PDF.LOGISTIC: Continuous Distributions. (line 91) * PDF.NEGBIN: Discrete Distributions. (line 38) * PDF.NORMAL: Continuous Distributions. (line 105) * PDF.NTAIL: Continuous Distributions. (line 122) * PDF.PARETO: Continuous Distributions. (line 128) * PDF.POISSON: Discrete Distributions. (line 45) * PDF.RAYLEIGH: Continuous Distributions. (line 135) * PDF.RTAIL: Continuous Distributions. (line 142) * PDF.T: Continuous Distributions. (line 148) * PDF.T1G: Continuous Distributions. (line 156) * PDF.T2G: Continuous Distributions. (line 162) * PDF.UNIFORM: Continuous Distributions. (line 168) * PDF.WEIBULL: Continuous Distributions. (line 179) * PDF.XPOWER: Continuous Distributions. (line 48) * PROBIT: Continuous Distributions. (line 116) * RANGE: Set Membership. (line 19) * REPLACE: String Functions. (line 67) * RINDEX: String Functions. (line 73) * RINDEX <1>: String Functions. (line 79) * RND: Miscellaneous Mathematics. (line 22) * RPAD: String Functions. (line 87) * RPAD <1>: String Functions. (line 93) * RTRIM: String Functions. (line 100) * RTRIM <1>: String Functions. (line 104) * RV.BERNOULLI: Discrete Distributions. (line 10) * RV.BETA: Continuous Distributions. (line 11) * RV.BINOM: Discrete Distributions. (line 16) * RV.CAUCHY: Continuous Distributions. (line 27) * RV.CHISQ: Continuous Distributions. (line 34) * RV.EXP: Continuous Distributions. (line 43) * RV.F: Continuous Distributions. (line 58) * RV.GAMMA: Continuous Distributions. (line 67) * RV.GEOM: Discrete Distributions. (line 22) * RV.HYPER: Discrete Distributions. (line 28) * RV.LANDAU: Continuous Distributions. (line 72) * RV.LAPLACE: Continuous Distributions. (line 78) * RV.LEVY: Continuous Distributions. (line 82) * RV.LNORMAL: Continuous Distributions. (line 101) * RV.LOG: Discrete Distributions. (line 34) * RV.LOGISTIC: Continuous Distributions. (line 94) * RV.LVSKEW: Continuous Distributions. (line 86) * RV.NEGBIN: Discrete Distributions. (line 40) * RV.NORMAL: Continuous Distributions. (line 108) * RV.NTAIL: Continuous Distributions. (line 123) * RV.PARETO: Continuous Distributions. (line 131) * RV.POISSON: Discrete Distributions. (line 47) * RV.RAYLEIGH: Continuous Distributions. (line 138) * RV.RTAIL: Continuous Distributions. (line 143) * RV.T: Continuous Distributions. (line 151) * RV.UNIFORM: Continuous Distributions. (line 171) * RV.WEIBULL: Continuous Distributions. (line 182) * RV.XPOWER: Continuous Distributions. (line 49) * SD: Statistical Functions. (line 45) * SIG.CHISQ: Continuous Distributions. (line 32) * SIG.F: Continuous Distributions. (line 56) * SIN: Trigonometry. (line 27) * SQRT: Mathematics. (line 24) * STRING: String Functions. (line 109) * STRUNC: String Functions. (line 114) * SUBSTR: String Functions. (line 119) * SUBSTR <1>: String Functions. (line 124) * SUM: Statistical Functions. (line 48) * SYSMIS: Missing Value Functions. (line 28) * TAN: Trigonometry. (line 30) * TIME.DAYS: Time Construction. (line 9) * TIME.HMS: Time Construction. (line 12) * TRUNC: Miscellaneous Mathematics. (line 30) * UNIFORM: Continuous Distributions. (line 176) * UPCASE: String Functions. (line 134) * VALUE: Missing Value Functions. (line 31) * VARIANCE: Statistical Functions. (line 51) * XDATE.DATE: Date Extraction. (line 18) * XDATE.HOUR: Date Extraction. (line 24) * XDATE.JDAY: Date Extraction. (line 30) * XDATE.MDAY: Date Extraction. (line 34) * XDATE.MINUTE: Date Extraction. (line 38) * XDATE.MONTH: Date Extraction. (line 42) * XDATE.QUARTER: Date Extraction. (line 46) * XDATE.SECOND: Date Extraction. (line 50) * XDATE.TDAY: Date Extraction. (line 54) * XDATE.TIME: Date Extraction. (line 57) * XDATE.WEEK: Date Extraction. (line 62) * XDATE.WKDAY: Date Extraction. (line 66) * XDATE.YEAR: Date Extraction. (line 70) * YRMODA: Miscellaneous Functions. (line 28)  File: pspp.info, Node: Command Index, Next: Concept Index, Prev: Function Index, Up: Top 23 Command Index **************** [index] * Menu: * *: COMMENT. (line 6) * ADD DOCUMENT: ADD DOCUMENT. (line 6) * ADD FILES: ADD FILES. (line 6) * ADD VALUE LABELS: ADD VALUE LABELS. (line 6) * AGGREGATE: AGGREGATE. (line 6) * APPLY DICTIONARY: APPLY DICTIONARY. (line 6) * AUTORECODE: AUTORECODE. (line 6) * BEGIN DATA: BEGIN DATA. (line 6) * BINOMIAL: BINOMIAL. (line 6) * BREAK: BREAK. (line 6) * CACHE: CACHE. (line 6) * CD: CD. (line 6) * CHISQUARE: CHISQUARE. (line 6) * Cochran: COCHRAN. (line 6) * COMMENT: COMMENT. (line 6) * COMPUTE: COMPUTE. (line 6) * CORRELATIONS: CORRELATIONS. (line 6) * COUNT: COUNT. (line 6) * CROSSTABS: CROSSTABS. (line 6) * DATA LIST: DATA LIST. (line 6) * DATA LIST FIXED: DATA LIST FIXED. (line 6) * DATA LIST FREE: DATA LIST FREE. (line 6) * DATA LIST LIST: DATA LIST LIST. (line 6) * DATAFILE ATTRIBUTE: DATAFILE ATTRIBUTE. (line 6) * DATASET: DATASET. (line 6) * DATASET ACTIVATE: DATASET. (line 22) * DATASET CLOSE: DATASET. (line 41) * DATASET COPY: DATASET. (line 28) * DATASET DECLARE: DATASET. (line 35) * DATASET DISPLAY: DATASET. (line 47) * DATASET NAME: DATASET. (line 18) * DELETE VARIABLES: DELETE VARIABLES. (line 6) * DESCRIPTIVES: DESCRIPTIVES. (line 6) * DISPLAY: DISPLAY. (line 6) * DISPLAY DOCUMENTS: DISPLAY DOCUMENTS. (line 6) * DISPLAY FILE LABEL: DISPLAY FILE LABEL. (line 6) * DO IF: DO IF. (line 6) * DO REPEAT: DO REPEAT. (line 6) * DOCUMENT: DOCUMENT. (line 6) * DROP DOCUMENTS: DROP DOCUMENTS. (line 6) * ECHO: ECHO. (line 6) * END CASE: END CASE. (line 6) * END DATA: BEGIN DATA. (line 6) * END FILE: END FILE. (line 6) * ERASE: ERASE. (line 6) * EXAMINE: EXAMINE. (line 6) * EXECUTE: EXECUTE. (line 6) * EXPORT: EXPORT. (line 6) * FACTOR: FACTOR. (line 6) * FILE HANDLE: FILE HANDLE. (line 6) * FILE LABEL: FILE LABEL. (line 6) * FILTER: FILTER. (line 6) * FINISH: FINISH. (line 6) * FLIP: FLIP. (line 6) * FORMATS: FORMATS. (line 6) * FREQUENCIES: FREQUENCIES. (line 6) * FRIEDMAN: FRIEDMAN. (line 6) * GET: Reading data from a pre-prepared PSPP file. (line 6) * GET <1>: GET. (line 6) * GET DATA: GET DATA. (line 6) * GLM: GLM. (line 6) * GRAPH: GRAPH. (line 6) * HOST: HOST. (line 6) * IF: IF. (line 6) * IMPORT: IMPORT. (line 6) * INCLUDE: INCLUDE. (line 6) * INPUT PROGRAM: INPUT PROGRAM. (line 6) * INSERT: INSERT. (line 6) * K-S: KOLMOGOROV-SMIRNOV. (line 6) * K-W: KRUSKAL-WALLIS. (line 6) * KENDALL: KENDALL. (line 6) * KOLMOGOROV-SMIRNOV: KOLMOGOROV-SMIRNOV. (line 6) * KRUSKAL-WALLIS: KRUSKAL-WALLIS. (line 6) * LEAVE: LEAVE. (line 6) * LIST: Listing the data. (line 6) * LIST <1>: LIST. (line 6) * LOGISTIC REGRESSION: LOGISTIC REGRESSION. (line 6) * LOOP: LOOP. (line 6) * M-W: MANN-WHITNEY. (line 6) * MANN-WHITNEY: MANN-WHITNEY. (line 6) * MATCH FILES: MATCH FILES. (line 6) * MATRIX DATA: MATRIX DATA. (line 6) * MCNEMAR: MCNEMAR. (line 6) * MEANS: MEANS. (line 6) * MEDIAN: MEDIAN. (line 6) * MISSING VALUES: MISSING VALUES. (line 6) * MODIFY VARS: MODIFY VARS. (line 6) * MRSETS: MRSETS. (line 6) * N OF CASES: N OF CASES. (line 6) * NEW FILE: NEW FILE. (line 6) * NPAR TESTS: NPAR TESTS. (line 6) * NUMERIC: NUMERIC. (line 6) * ONEWAY: ONEWAY. (line 6) * OUTPUT: OUTPUT. (line 6) * PERMISSIONS: PERMISSIONS. (line 6) * PRESERVE: PRESERVE and RESTORE. (line 6) * PRINT: PRINT. (line 6) * PRINT EJECT: PRINT EJECT. (line 6) * PRINT FORMATS: PRINT FORMATS. (line 6) * PRINT SPACE: PRINT SPACE. (line 6) * QUICK CLUSTER: QUICK CLUSTER. (line 6) * RANK: RANK. (line 6) * RECODE: RECODE. (line 6) * REGRESSION: Linear Regression. (line 6) * REGRESSION <1>: Syntax. (line 6) * RELIABILITY: RELIABILITY. (line 6) * RENAME VARIABLES: RENAME VARIABLES. (line 6) * REPEATING DATA: REPEATING DATA. (line 6) * REREAD: REREAD. (line 6) * RESTORE: PRESERVE and RESTORE. (line 6) * ROC: ROC. (line 6) * RUNS: RUNS. (line 6) * SAMPLE: SAMPLE. (line 6) * SAVE: Saving data to a PSPP file.. (line 6) * SAVE <1>: SAVE. (line 6) * SAVE DATA COLLECTION: SAVE DATA COLLECTION. (line 6) * SAVE TRANSLATE: SAVE TRANSLATE. (line 6) * SELECT IF: SELECT IF. (line 6) * SET: SET. (line 6) * SHOW: SHOW. (line 6) * SIGN: SIGN. (line 6) * SORT CASES: SORT CASES. (line 6) * SORT VARIABLES: SORT VARIABLES. (line 6) * SPLIT FILE: SPLIT FILE. (line 6) * STRING: STRING. (line 6) * SUBTITLE: SUBTITLE. (line 6) * SYSFILE INFO: SYSFILE INFO. (line 6) * T-TEST: Testing for differences of means. (line 6) * T-TEST <1>: T-TEST. (line 6) * TEMPORARY: TEMPORARY. (line 6) * TITLE: TITLE. (line 6) * UPDATE: UPDATE. (line 6) * VALUE LABELS: VALUE LABELS. (line 6) * VARIABLE ALIGNMENT: VARIABLE ALIGNMENT. (line 6) * VARIABLE ATTRIBUTE: VARIABLE ATTRIBUTE. (line 6) * VARIABLE LABELS: VARIABLE LABELS. (line 6) * VARIABLE LEVEL: VARIABLE LEVEL. (line 6) * VARIABLE ROLE: VARIABLE ROLE. (line 6) * VARIABLE WIDTH: VARIABLE WIDTH. (line 6) * VECTOR: VECTOR. (line 6) * WEIGHT: WEIGHT. (line 6) * WILCOXON: WILCOXON. (line 6) * WRITE: WRITE. (line 6) * WRITE FORMATS: WRITE FORMATS. (line 6) * XEXPORT: XEXPORT. (line 6) * XSAVE: XSAVE. (line 6)  File: pspp.info, Node: Concept Index, Next: GNU Free Documentation License, Prev: Command Index, Up: Top 24 Concept Index **************** [index] * Menu: * ": Tokens. (line 64) * "is defined as": BNF. (line 44) * $CASENUM: System Variables. (line 11) * $DATE: System Variables. (line 15) * $JDATE: System Variables. (line 19) * $LENGTH: System Variables. (line 23) * $SYSMIS: System Variables. (line 26) * $TIME: System Variables. (line 29) * $WIDTH: System Variables. (line 33) * &: Logical Operators. (line 11) * ': Tokens. (line 64) * (: Functions. (line 6) * ( ): Grouping Operators. (line 6) * ): Functions. (line 6) * *: Arithmetic Operators. (line 15) * **: Arithmetic Operators. (line 24) * +: Arithmetic Operators. (line 9) * -: Arithmetic Operators. (line 12) * - <1>: Arithmetic Operators. (line 29) * .: Attributes. (line 15) * . <1>: BNF. (line 29) * /: Arithmetic Operators. (line 19) * <: Relational Operators. (line 25) * <=: Relational Operators. (line 21) * <>: Relational Operators. (line 37) * =: Relational Operators. (line 17) * >: Relational Operators. (line 33) * >=: Relational Operators. (line 29) * _: Attributes. (line 20) * |: Logical Operators. (line 17) * ~: Logical Operators. (line 23) * ~=: Relational Operators. (line 37) * absolute value: Miscellaneous Mathematics. (line 9) * addition: Arithmetic Operators. (line 9) * analysis of variance: GLM. (line 6) * analysis of variance <1>: ONEWAY. (line 6) * AND: Logical Operators. (line 11) * ANOVA: GLM. (line 6) * ANOVA <1>: ONEWAY. (line 6) * arccosine: Trigonometry. (line 9) * arcsine: Trigonometry. (line 15) * arctangent: Trigonometry. (line 20) * Area under curve: ROC. (line 6) * arguments, invalid: Date Construction. (line 35) * arguments, minimum valid: Statistical Functions. (line 15) * arguments, of date construction functions: Date Construction. (line 6) * arguments, of date extraction functions: Date Extraction. (line 6) * arithmetic mean: MEANS. (line 43) * arithmetic operators: Arithmetic Operators. (line 6) * attributes of variables: Attributes. (line 6) * Backus-Naur Form: BNF. (line 6) * bar chart: FREQUENCIES. (line 89) * bar chart <1>: BAR CHART. (line 6) * bar chart <2>: CROSSTABS. (line 156) * Batch syntax: Syntax Variants. (line 6) * binary formats: Binary and Hexadecimal Numeric Formats. (line 6) * binomial test: BINOMIAL. (line 6) * bivariate logistic regression: LOGISTIC REGRESSION. (line 6) * BNF: BNF. (line 6) * Boolean: Boolean Values. (line 6) * Boolean <1>: Logical Operators. (line 6) * boxplot: EXAMINE. (line 57) * bugs: Bugs. (line 6) * case conversion: String Functions. (line 134) * case-sensitivity: Tokens. (line 20) * case-sensitivity <1>: Tokens. (line 64) * cases: Data Input and Output. (line 6) * changing directory: CD. (line 6) * changing file permissions: PERMISSIONS. (line 6) * chi-square: CROSSTABS. (line 117) * chisquare: CROSSTABS. (line 117) * chisquare test: CHISQUARE. (line 6) * clustering: QUICK CLUSTER. (line 6) * Cochran Q test: COCHRAN. (line 6) * coefficient of concordance: KENDALL. (line 6) * coefficient of variation: Statistical Functions. (line 24) * comma separated values: Reading data from other sources. (line 6) * command file: Files. (line 10) * command syntax, description of: BNF. (line 6) * commands, ordering: Order of Commands. (line 6) * commands, structure: Commands. (line 6) * commands, unimplemented: Not Implemented. (line 9) * concatenation: String Functions. (line 8) * conditionals: Conditionals and Looping. (line 6) * consistency: Testing data consistency. (line 6) * constructing dates: Date Construction. (line 6) * constructing times: Time Construction. (line 6) * control flow: Conditionals and Looping. (line 6) * convention, TO: Sets of Variables. (line 6) * copyright: License. (line 6) * correlation: CORRELATIONS. (line 20) * cosine: Trigonometry. (line 24) * covariance: CORRELATIONS. (line 52) * Cronbach's Alpha: RELIABILITY. (line 13) * cross-case function: Miscellaneous Functions. (line 6) * currency formats: Custom Currency Formats. (line 6) * custom attributes: Attributes. (line 73) * data: Data Input and Output. (line 6) * data file: Files. (line 17) * data files: GET DATA /TYPE=TXT. (line 14) * data reduction: FACTOR. (line 6) * Data, embedding in syntax files: BEGIN DATA. (line 6) * data, embedding in syntax files: DATA LIST. (line 6) * data, fixed-format, reading: DATA LIST FIXED. (line 6) * data, reading from a file: DATA LIST. (line 6) * databases: Reading data from other sources. (line 6) * databases <1>: GET DATA /TYPE=PSQL. (line 13) * dataset: Datasets. (line 6) * date examination: Date Extraction. (line 6) * date formats: Time and Date Formats. (line 6) * date, Julian: Miscellaneous Functions. (line 28) * dates: Time and Date. (line 6) * dates, concepts: Time and Date Concepts. (line 15) * dates, constructing: Date Construction. (line 6) * dates, day of the month: Date Extraction. (line 34) * dates, day of the week: Date Extraction. (line 66) * dates, day of the year: Date Extraction. (line 30) * dates, day-month-year: Date Construction. (line 39) * dates, in days: Date Extraction. (line 18) * dates, in hours: Date Extraction. (line 24) * dates, in minutes: Date Extraction. (line 38) * dates, in months: Date Extraction. (line 42) * dates, in quarters: Date Extraction. (line 46) * dates, in seconds: Date Extraction. (line 50) * dates, in weekdays: Date Extraction. (line 66) * dates, in weeks: Date Extraction. (line 62) * dates, in years: Date Extraction. (line 70) * dates, mathematical properties of: Time and Date Arithmetic. (line 6) * dates, month-year: Date Construction. (line 44) * dates, quarter-year: Date Construction. (line 48) * dates, time of day: Date Extraction. (line 57) * dates, valid: Time and Date. (line 6) * dates, week-year: Date Construction. (line 52) * dates, year-day: Date Construction. (line 56) * day of the month: Date Extraction. (line 34) * day of the week: Date Extraction. (line 66) * day of the year: Date Extraction. (line 30) * day-month-year: Date Construction. (line 39) * days: Time Construction. (line 9) * days <1>: Time Extraction. (line 9) * days <2>: Date Extraction. (line 18) * days <3>: Date Extraction. (line 54) * decimal places: OUTPUT. (line 6) * description of command syntax: BNF. (line 6) * deviation, standard: Statistical Functions. (line 45) * dictionary: Datasets. (line 6) * directory: CD. (line 6) * division: Arithmetic Operators. (line 19) * DocBook: Introduction. (line 15) * Embedding data in syntax files: BEGIN DATA. (line 6) * embedding data in syntax files: DATA LIST. (line 6) * embedding fixed-format data: DATA LIST FIXED. (line 6) * encoding, characters: SET. (line 384) * EQ: Relational Operators. (line 17) * equality, testing: Relational Operators. (line 17) * erroneous data: Identifying incorrect data. (line 6) * errors, in data: Identifying incorrect data. (line 6) * examination, of times: Time Extraction. (line 6) * Exploratory data analysis: EXAMINE. (line 6) * Exploratory data analysis <1>: GRAPH. (line 6) * exponentiation: Arithmetic Operators. (line 24) * expression: BNF. (line 41) * expressions, mathematical: Expressions. (line 6) * extraction, of dates: Date Extraction. (line 6) * extraction, of time: Time Extraction. (line 6) * factor analysis: FACTOR. (line 6) * factorial anova: GLM. (line 6) * false: Logical Operators. (line 6) * file definition commands: Types of Commands. (line 14) * file handles: File Handles. (line 6) * file mode: PERMISSIONS. (line 6) * file, command: Files. (line 10) * file, data: Files. (line 17) * file, output: Files. (line 21) * file, portable: Files. (line 31) * file, syntax file: Files. (line 10) * file, system: Files. (line 27) * fixed effects: GLM. (line 6) * fixed-format data, reading: DATA LIST FIXED. (line 6) * flow of control: Conditionals and Looping. (line 6) * formats: Input and Output Formats. (line 6) * Friedman test: FRIEDMAN. (line 6) * function, cross-case: Miscellaneous Functions. (line 6) * functions: Functions. (line 6) * functions, miscellaneous: Miscellaneous Functions. (line 6) * functions, missing-value: Missing Value Functions. (line 6) * functions, statistical: Statistical Functions. (line 6) * functions, string: String Functions. (line 6) * functions, time & date: Time and Date. (line 6) * GE: Relational Operators. (line 29) * geometric mean: MEANS. (line 59) * Gnumeric: GET DATA /TYPE=GNM/ODS. (line 13) * Graphic user interface: Invoking PSPPIRE. (line 9) * greater than: Relational Operators. (line 33) * greater than or equal to: Relational Operators. (line 29) * grouping operators: Grouping Operators. (line 6) * GT: Relational Operators. (line 33) * harmonic mean: MEANS. (line 58) * headers: SET. (line 342) * hexadecimal formats: Binary and Hexadecimal Numeric Formats. (line 6) * histogram: FREQUENCIES. (line 71) * histogram <1>: EXAMINE. (line 57) * histogram <2>: HISTOGRAM. (line 6) * hours: Time Extraction. (line 12) * hours <1>: Date Extraction. (line 24) * hours-minutes-seconds: Time Construction. (line 12) * HTML: Introduction. (line 15) * HTML <1>: HTML Output Options. (line 6) * Hypothesis testing: Hypothesis Testing. (line 6) * identifiers: Tokens. (line 11) * identifiers, reserved: Tokens. (line 25) * inequality, testing: Relational Operators. (line 37) * input: Data Input and Output. (line 6) * input program commands: Types of Commands. (line 21) * integer: BNF. (line 17) * integers: Tokens. (line 44) * Interactive syntax: Syntax Variants. (line 6) * intersection, logical: Logical Operators. (line 11) * introduction: Introduction. (line 6) * inverse cosine: Trigonometry. (line 9) * inverse sine: Trigonometry. (line 15) * inverse tangent: Trigonometry. (line 20) * inversion, logical: Logical Operators. (line 23) * Inverting data: Inverting negatively coded variables. (line 6) * invocation: Invoking PSPP. (line 6) * Invocation: Invoking pspp-convert. (line 6) * Invocation <1>: Invoking pspp-output. (line 6) * Invocation <2>: Invoking pspp-dump-sav. (line 6) * Julian date: Miscellaneous Functions. (line 28) * K-means clustering: QUICK CLUSTER. (line 6) * Kendall's W test: KENDALL. (line 6) * keywords: BNF. (line 10) * Kolmogorov-Smirnov test: KOLMOGOROV-SMIRNOV. (line 6) * Kruskal-Wallis test: KRUSKAL-WALLIS. (line 6) * labels, value: Attributes. (line 59) * labels, variable: Attributes. (line 56) * language, command structure: Commands. (line 6) * language, lexical analysis: Tokens. (line 6) * language, PSPP: Introduction. (line 6) * language, PSPP <1>: Language. (line 6) * language, tokens: Tokens. (line 6) * LE: Relational Operators. (line 21) * length: SET. (line 342) * less than: Relational Operators. (line 25) * less than or equal to: Relational Operators. (line 21) * lexical analysis: Tokens. (line 6) * licence: License. (line 6) * license: License. (line 6) * Likert scale: Inverting negatively coded variables. (line 6) * linear regression: Linear Regression. (line 6) * linear regression <1>: REGRESSION. (line 6) * locale: SET. (line 384) * logarithms: Mathematics. (line 12) * logical intersection: Logical Operators. (line 11) * logical inversion: Logical Operators. (line 23) * logical operators: Logical Operators. (line 6) * logical union: Logical Operators. (line 17) * logistic regression: LOGISTIC REGRESSION. (line 6) * loops: Conditionals and Looping. (line 6) * LT: Relational Operators. (line 25) * Mann-Whitney U test: MANN-WHITNEY. (line 6) * mathematical expressions: Expressions. (line 6) * mathematics: Functions. (line 6) * mathematics, advanced: Mathematics. (line 6) * mathematics, applied to times & dates: Time and Date Arithmetic. (line 6) * mathematics, miscellaneous: Miscellaneous Mathematics. (line 6) * maximum: Statistical Functions. (line 29) * McNemar test: MCNEMAR. (line 6) * mean: Statistical Functions. (line 33) * means: MEANS. (line 6) * median: Statistical Functions. (line 36) * Median test: MEDIAN. (line 6) * membership, of set: Set Membership. (line 6) * memory, amount used to store cases: SET. (line 233) * minimum: Statistical Functions. (line 41) * minimum valid number of arguments: Statistical Functions. (line 15) * minutes: Time Extraction. (line 15) * minutes <1>: Date Extraction. (line 38) * missing values: Missing Observations. (line 6) * missing values <1>: Attributes. (line 46) * missing values <2>: Missing Value Functions. (line 6) * mode: PERMISSIONS. (line 6) * modulus: Miscellaneous Mathematics. (line 12) * modulus, by 10: Miscellaneous Mathematics. (line 18) * month-year: Date Construction. (line 44) * months: Date Extraction. (line 42) * multiplication: Arithmetic Operators. (line 15) * names, of functions: Functions. (line 6) * NE: Relational Operators. (line 37) * negation: Arithmetic Operators. (line 29) * nonparametric tests: NPAR TESTS. (line 6) * nonterminals: BNF. (line 33) * normality, testing: Testing for normality. (line 6) * normality, testing <1>: EXAMINE. (line 6) * normality, testing <2>: GRAPH. (line 6) * NOT: Logical Operators. (line 23) * npplot: EXAMINE. (line 57) * null hypothesis: Hypothesis Testing. (line 6) * number: BNF. (line 14) * numbers: Tokens. (line 44) * numbers, converting from strings: String Functions. (line 58) * numbers, converting to strings: String Functions. (line 109) * numeric formats: Basic Numeric Formats. (line 6) * obligations, your: License. (line 6) * observations: Data Input and Output. (line 6) * OpenDocument: GET DATA /TYPE=GNM/ODS. (line 13) * operations, order of: Order of Operations. (line 6) * operator precedence: Order of Operations. (line 6) * operators: Tokens. (line 95) * operators <1>: BNF. (line 26) * operators <2>: Functions. (line 6) * operators, arithmetic: Arithmetic Operators. (line 6) * operators, grouping: Grouping Operators. (line 6) * operators, logical: Logical Operators. (line 6) * OR: Logical Operators. (line 17) * order of commands: Order of Commands. (line 6) * order of operations: Order of Operations. (line 6) * output: Data Input and Output. (line 6) * output file: Files. (line 21) * p-value: Hypothesis Testing. (line 6) * padding strings: String Functions. (line 87) * pager: SET. (line 342) * parentheses: Grouping Operators. (line 6) * parentheses <1>: Functions. (line 6) * PDF: Introduction. (line 15) * PDF <1>: PDF PostScript and SVG Output Options. (line 6) * percentiles: FREQUENCIES. (line 64) * percentiles <1>: EXAMINE. (line 98) * period: Attributes. (line 15) * piechart: FREQUENCIES. (line 79) * portable file: Files. (line 31) * postgres: GET DATA /TYPE=PSQL. (line 13) * PostScript: Introduction. (line 15) * Postscript: PDF PostScript and SVG Output Options. (line 6) * precedence, operator: Order of Operations. (line 6) * precision, of output: OUTPUT. (line 6) * principal axis factoring: FACTOR. (line 6) * principal components analysis: FACTOR. (line 6) * print format: Attributes. (line 63) * procedures: Types of Commands. (line 33) * productions: BNF. (line 33) * productions <1>: BNF. (line 44) * PSPP language: Introduction. (line 6) * PSPP, command structure: Commands. (line 6) * PSPP, invoking: Invoking PSPP. (line 6) * PSPP, language: Language. (line 6) * pspp-convert: Invoking pspp-convert. (line 6) * pspp-dump-sav: Invoking pspp-dump-sav. (line 6) * pspp-output: Invoking pspp-output. (line 6) * PSPPIRE: Invoking PSPPIRE. (line 9) * punctuators: Tokens. (line 95) * punctuators <1>: BNF. (line 26) * Q, Cochran Q: COCHRAN. (line 6) * quarter-year: Date Construction. (line 48) * quarters: Date Extraction. (line 46) * reading data: Reading data from a text file. (line 6) * reading data from a file: DATA LIST. (line 6) * reading fixed-format data: DATA LIST FIXED. (line 6) * reals: Tokens. (line 44) * Receiver Operating Characteristic: ROC. (line 6) * recoding data: Dealing with suspicious data. (line 6) * regression: REGRESSION. (line 6) * reliability: Testing data consistency. (line 6) * replacing substrings: String Functions. (line 67) * reserved identifiers: Tokens. (line 25) * restricted transformations: Types of Commands. (line 29) * rights, your: License. (line 6) * rounding: Miscellaneous Mathematics. (line 22) * runs test: RUNS. (line 6) * saving: Saving data to a PSPP file.. (line 6) * scatterplot: SCATTERPLOT. (line 6) * scratch variables: Scratch Variables. (line 6) * screening: Data Screening and Transformation. (line 6) * searching strings: String Functions. (line 13) * seconds: Time Extraction. (line 18) * seconds <1>: Date Extraction. (line 50) * set membership: Set Membership. (line 6) * Shapiro-Wilk: EXAMINE. (line 73) * sign test: SIGN. (line 6) * sine: Trigonometry. (line 27) * spreadlevel plot: EXAMINE. (line 57) * spreadsheet files: GET DATA /TYPE=GNM/ODS. (line 13) * spreadsheets: Reading data from other sources. (line 6) * square roots: Mathematics. (line 24) * standard deviation: Statistical Functions. (line 45) * start symbol: BNF. (line 58) * statistics: Statistical Functions. (line 6) * string: BNF. (line 20) * string formats: String Formats. (line 6) * string functions: String Functions. (line 6) * strings: Tokens. (line 64) * strings, case of: String Functions. (line 30) * strings, case of <1>: String Functions. (line 134) * strings, concatenation of: String Functions. (line 8) * strings, converting from numbers: String Functions. (line 109) * strings, converting to numbers: String Functions. (line 58) * strings, finding length of: String Functions. (line 27) * strings, padding: String Functions. (line 35) * strings, padding <1>: String Functions. (line 87) * strings, replacing substrings: String Functions. (line 67) * strings, searching backwards: String Functions. (line 73) * strings, taking substrings of: String Functions. (line 119) * strings, trimming: String Functions. (line 48) * strings, trimming <1>: String Functions. (line 100) * strings, trimming <2>: String Functions. (line 114) * strings, truncating: String Functions. (line 114) * substrings: String Functions. (line 119) * subtraction: Arithmetic Operators. (line 12) * sum: Statistical Functions. (line 48) * SVG: PDF PostScript and SVG Output Options. (line 6) * symbol, start: BNF. (line 58) * syntax file: Files. (line 10) * SYSMIS: Dealing with suspicious data. (line 6) * system file: Files. (line 27) * system files: Reading data from a pre-prepared PSPP file. (line 6) * system variables: System Variables. (line 6) * system-missing: Logical Operators. (line 6) * T-test: Testing for differences of means. (line 6) * tangent: Trigonometry. (line 30) * terminals: BNF. (line 10) * terminals and nonterminals, differences: BNF. (line 50) * testing for equality: Relational Operators. (line 17) * testing for inequality: Relational Operators. (line 37) * text files: GET DATA /TYPE=TXT. (line 14) * time: Date Extraction. (line 57) * time examination: Time Extraction. (line 6) * time formats: Time and Date Formats. (line 6) * time, concepts: Time and Date Concepts. (line 6) * time, in days: Time Construction. (line 9) * time, in days <1>: Time Extraction. (line 9) * time, in days <2>: Date Extraction. (line 18) * time, in hours: Time Extraction. (line 12) * time, in hours <1>: Date Extraction. (line 24) * time, in hours-minutes-seconds: Time Construction. (line 12) * time, in minutes: Time Extraction. (line 15) * time, in minutes <1>: Date Extraction. (line 38) * time, in seconds: Time Extraction. (line 18) * time, in seconds <1>: Date Extraction. (line 50) * time, instants of: Time and Date Concepts. (line 15) * time, intervals: Time and Date Concepts. (line 6) * time, lengths of: Time Extraction. (line 6) * time, mathematical properties of: Time and Date Arithmetic. (line 6) * times: Time and Date. (line 6) * times, constructing: Time Construction. (line 6) * times, in days: Date Extraction. (line 54) * tnumbers: SET. (line 342) * TO convention: Sets of Variables. (line 6) * tokens: Tokens. (line 6) * transformation: Data Screening and Transformation. (line 6) * transformations: Types of Commands. (line 25) * transformations <1>: Data Manipulation. (line 6) * trigonometry: Trigonometry. (line 6) * troubleshooting: Bugs. (line 6) * true: Logical Operators. (line 6) * truncation: Miscellaneous Mathematics. (line 30) * type of variables: Attributes. (line 29) * U, Mann-Whitney U: MANN-WHITNEY. (line 6) * unimplemented commands: Not Implemented. (line 9) * union, logical: Logical Operators. (line 17) * univariate analysis of variance: GLM. (line 6) * utility commands: Types of Commands. (line 9) * value label: Miscellaneous Functions. (line 41) * value labels: Attributes. (line 59) * values, Boolean: Boolean Values. (line 6) * values, missing: Missing Observations. (line 6) * values, missing <1>: Attributes. (line 46) * values, missing <2>: Missing Value Functions. (line 6) * values, system-missing: Logical Operators. (line 6) * var-list: BNF. (line 38) * var-name: BNF. (line 23) * variable: Datasets. (line 6) * variable labels: Attributes. (line 56) * variable names, ending with period: Attributes. (line 15) * variable role: Attributes. (line 77) * variables: Defining Variables. (line 6) * variables, attributes of: Attributes. (line 6) * variables, system: System Variables. (line 6) * variables, type: Attributes. (line 29) * variables, width: Attributes. (line 32) * variance: Statistical Functions. (line 51) * variation, coefficient of: Statistical Functions. (line 24) * week: Date Extraction. (line 62) * week-year: Date Construction. (line 52) * weekday: Date Extraction. (line 66) * white space, trimming: String Functions. (line 48) * white space, trimming <1>: String Functions. (line 100) * white space, trimming <2>: String Functions. (line 114) * width: SET. (line 342) * width of variables: Attributes. (line 32) * wilcoxon matched pairs signed ranks test: WILCOXON. (line 6) * workspace: SET. (line 233) * write format: Attributes. (line 69) * year-day: Date Construction. (line 56) * years: Date Extraction. (line 70) * your rights and obligations: License. (line 6)  File: pspp.info, Node: GNU Free Documentation License, Prev: Concept Index, Up: Top Appendix A GNU Free Documentation License ***************************************** Version 1.3, 3 November 2008 Copyright (C) 2000, 2001, 2002, 2007, 2008 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. 0. PREAMBLE The purpose of this License is to make a manual, textbook, or other functional and useful document "free" in the sense of freedom: to assure everyone the effective freedom to copy and redistribute it, with or without modifying it, either commercially or noncommercially. Secondarily, this License preserves for the author and publisher a way to get credit for their work, while not being considered responsible for modifications made by others. This License is a kind of "copyleft", which means that derivative works of the document must themselves be free in the same sense. It complements the GNU General Public License, which is a copyleft license designed for free software. We have designed this License in order to use it for manuals for free software, because free software needs free documentation: a free program should come with manuals providing the same freedoms that the software does. But this License is not limited to software manuals; it can be used for any textual work, regardless of subject matter or whether it is published as a printed book. We recommend this License principally for works whose purpose is instruction or reference. 1. APPLICABILITY AND DEFINITIONS This License applies to any manual or other work, in any medium, that contains a notice placed by the copyright holder saying it can be distributed under the terms of this License. Such a notice grants a world-wide, royalty-free license, unlimited in duration, to use that work under the conditions stated herein. The "Document", below, refers to any such manual or work. Any member of the public is a licensee, and is addressed as "you". You accept the license if you copy, modify or distribute the work in a way requiring permission under copyright law. A "Modified Version" of the Document means any work containing the Document or a portion of it, either copied verbatim, or with modifications and/or translated into another language. A "Secondary Section" is a named appendix or a front-matter section of the Document that deals exclusively with the relationship of the publishers or authors of the Document to the Document's overall subject (or to related matters) and contains nothing that could fall directly within that overall subject. (Thus, if the Document is in part a textbook of mathematics, a Secondary Section may not explain any mathematics.) The relationship could be a matter of historical connection with the subject or with related matters, or of legal, commercial, philosophical, ethical or political position regarding them. The "Invariant Sections" are certain Secondary Sections whose titles are designated, as being those of Invariant Sections, in the notice that says that the Document is released under this License. If a section does not fit the above definition of Secondary then it is not allowed to be designated as Invariant. The Document may contain zero Invariant Sections. If the Document does not identify any Invariant Sections then there are none. The "Cover Texts" are certain short passages of text that are listed, as Front-Cover Texts or Back-Cover Texts, in the notice that says that the Document is released under this License. A Front-Cover Text may be at most 5 words, and a Back-Cover Text may be at most 25 words. A "Transparent" copy of the Document means a machine-readable copy, represented in a format whose specification is available to the general public, that is suitable for revising the document straightforwardly with generic text editors or (for images composed of pixels) generic paint programs or (for drawings) some widely available drawing editor, and that is suitable for input to text formatters or for automatic translation to a variety of formats suitable for input to text formatters. A copy made in an otherwise Transparent file format whose markup, or absence of markup, has been arranged to thwart or discourage subsequent modification by readers is not Transparent. An image format is not Transparent if used for any substantial amount of text. A copy that is not "Transparent" is called "Opaque". Examples of suitable formats for Transparent copies include plain ASCII without markup, Texinfo input format, LaTeX input format, SGML or XML using a publicly available DTD, and standard-conforming simple HTML, PostScript or PDF designed for human modification. Examples of transparent image formats include PNG, XCF and JPG. Opaque formats include proprietary formats that can be read and edited only by proprietary word processors, SGML or XML for which the DTD and/or processing tools are not generally available, and the machine-generated HTML, PostScript or PDF produced by some word processors for output purposes only. The "Title Page" means, for a printed book, the title page itself, plus such following pages as are needed to hold, legibly, the material this License requires to appear in the title page. For works in formats which do not have any title page as such, "Title Page" means the text near the most prominent appearance of the work's title, preceding the beginning of the body of the text. The "publisher" means any person or entity that distributes copies of the Document to the public. A section "Entitled XYZ" means a named subunit of the Document whose title either is precisely XYZ or contains XYZ in parentheses following text that translates XYZ in another language. (Here XYZ stands for a specific section name mentioned below, such as "Acknowledgements", "Dedications", "Endorsements", or "History".) To "Preserve the Title" of such a section when you modify the Document means that it remains a section "Entitled XYZ" according to this definition. The Document may include Warranty Disclaimers next to the notice which states that this License applies to the Document. These Warranty Disclaimers are considered to be included by reference in this License, but only as regards disclaiming warranties: any other implication that these Warranty Disclaimers may have is void and has no effect on the meaning of this License. 2. VERBATIM COPYING You may copy and distribute the Document in any medium, either commercially or noncommercially, provided that this License, the copyright notices, and the license notice saying this License applies to the Document are reproduced in all copies, and that you add no other conditions whatsoever to those of this License. You may not use technical measures to obstruct or control the reading or further copying of the copies you make or distribute. However, you may accept compensation in exchange for copies. If you distribute a large enough number of copies you must also follow the conditions in section 3. You may also lend copies, under the same conditions stated above, and you may publicly display copies. 3. COPYING IN QUANTITY If you publish printed copies (or copies in media that commonly have printed covers) of the Document, numbering more than 100, and the Document's license notice requires Cover Texts, you must enclose the copies in covers that carry, clearly and legibly, all these Cover Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on the back cover. Both covers must also clearly and legibly identify you as the publisher of these copies. The front cover must present the full title with all words of the title equally prominent and visible. You may add other material on the covers in addition. Copying with changes limited to the covers, as long as they preserve the title of the Document and satisfy these conditions, can be treated as verbatim copying in other respects. If the required texts for either cover are too voluminous to fit legibly, you should put the first ones listed (as many as fit reasonably) on the actual cover, and continue the rest onto adjacent pages. If you publish or distribute Opaque copies of the Document numbering more than 100, you must either include a machine-readable Transparent copy along with each Opaque copy, or state in or with each Opaque copy a computer-network location from which the general network-using public has access to download using public-standard network protocols a complete Transparent copy of the Document, free of added material. If you use the latter option, you must take reasonably prudent steps, when you begin distribution of Opaque copies in quantity, to ensure that this Transparent copy will remain thus accessible at the stated location until at least one year after the last time you distribute an Opaque copy (directly or through your agents or retailers) of that edition to the public. It is requested, but not required, that you contact the authors of the Document well before redistributing any large number of copies, to give them a chance to provide you with an updated version of the Document. 4. MODIFICATIONS You may copy and distribute a Modified Version of the Document under the conditions of sections 2 and 3 above, provided that you release the Modified Version under precisely this License, with the Modified Version filling the role of the Document, thus licensing distribution and modification of the Modified Version to whoever possesses a copy of it. In addition, you must do these things in the Modified Version: A. Use in the Title Page (and on the covers, if any) a title distinct from that of the Document, and from those of previous versions (which should, if there were any, be listed in the History section of the Document). You may use the same title as a previous version if the original publisher of that version gives permission. B. List on the Title Page, as authors, one or more persons or entities responsible for authorship of the modifications in the Modified Version, together with at least five of the principal authors of the Document (all of its principal authors, if it has fewer than five), unless they release you from this requirement. C. State on the Title page the name of the publisher of the Modified Version, as the publisher. D. Preserve all the copyright notices of the Document. E. Add an appropriate copyright notice for your modifications adjacent to the other copyright notices. F. Include, immediately after the copyright notices, a license notice giving the public permission to use the Modified Version under the terms of this License, in the form shown in the Addendum below. G. Preserve in that license notice the full lists of Invariant Sections and required Cover Texts given in the Document's license notice. H. Include an unaltered copy of this License. I. Preserve the section Entitled "History", Preserve its Title, and add to it an item stating at least the title, year, new authors, and publisher of the Modified Version as given on the Title Page. If there is no section Entitled "History" in the Document, create one stating the title, year, authors, and publisher of the Document as given on its Title Page, then add an item describing the Modified Version as stated in the previous sentence. J. Preserve the network location, if any, given in the Document for public access to a Transparent copy of the Document, and likewise the network locations given in the Document for previous versions it was based on. These may be placed in the "History" section. You may omit a network location for a work that was published at least four years before the Document itself, or if the original publisher of the version it refers to gives permission. K. For any section Entitled "Acknowledgements" or "Dedications", Preserve the Title of the section, and preserve in the section all the substance and tone of each of the contributor acknowledgements and/or dedications given therein. L. Preserve all the Invariant Sections of the Document, unaltered in their text and in their titles. Section numbers or the equivalent are not considered part of the section titles. M. Delete any section Entitled "Endorsements". Such a section may not be included in the Modified Version. N. Do not retitle any existing section to be Entitled "Endorsements" or to conflict in title with any Invariant Section. O. Preserve any Warranty Disclaimers. If the Modified Version includes new front-matter sections or appendices that qualify as Secondary Sections and contain no material copied from the Document, you may at your option designate some or all of these sections as invariant. To do this, add their titles to the list of Invariant Sections in the Modified Version's license notice. These titles must be distinct from any other section titles. You may add a section Entitled "Endorsements", provided it contains nothing but endorsements of your Modified Version by various parties--for example, statements of peer review or that the text has been approved by an organization as the authoritative definition of a standard. You may add a passage of up to five words as a Front-Cover Text, and a passage of up to 25 words as a Back-Cover Text, to the end of the list of Cover Texts in the Modified Version. Only one passage of Front-Cover Text and one of Back-Cover Text may be added by (or through arrangements made by) any one entity. If the Document already includes a cover text for the same cover, previously added by you or by arrangement made by the same entity you are acting on behalf of, you may not add another; but you may replace the old one, on explicit permission from the previous publisher that added the old one. The author(s) and publisher(s) of the Document do not by this License give permission to use their names for publicity for or to assert or imply endorsement of any Modified Version. 5. COMBINING DOCUMENTS You may combine the Document with other documents released under this License, under the terms defined in section 4 above for modified versions, provided that you include in the combination all of the Invariant Sections of all of the original documents, unmodified, and list them all as Invariant Sections of your combined work in its license notice, and that you preserve all their Warranty Disclaimers. The combined work need only contain one copy of this License, and multiple identical Invariant Sections may be replaced with a single copy. If there are multiple Invariant Sections with the same name but different contents, make the title of each such section unique by adding at the end of it, in parentheses, the name of the original author or publisher of that section if known, or else a unique number. Make the same adjustment to the section titles in the list of Invariant Sections in the license notice of the combined work. In the combination, you must combine any sections Entitled "History" in the various original documents, forming one section Entitled "History"; likewise combine any sections Entitled "Acknowledgements", and any sections Entitled "Dedications". You must delete all sections Entitled "Endorsements." 6. COLLECTIONS OF DOCUMENTS You may make a collection consisting of the Document and other documents released under this License, and replace the individual copies of this License in the various documents with a single copy that is included in the collection, provided that you follow the rules of this License for verbatim copying of each of the documents in all other respects. You may extract a single document from such a collection, and distribute it individually under this License, provided you insert a copy of this License into the extracted document, and follow this License in all other respects regarding verbatim copying of that document. 7. AGGREGATION WITH INDEPENDENT WORKS A compilation of the Document or its derivatives with other separate and independent documents or works, in or on a volume of a storage or distribution medium, is called an "aggregate" if the copyright resulting from the compilation is not used to limit the legal rights of the compilation's users beyond what the individual works permit. When the Document is included in an aggregate, this License does not apply to the other works in the aggregate which are not themselves derivative works of the Document. If the Cover Text requirement of section 3 is applicable to these copies of the Document, then if the Document is less than one half of the entire aggregate, the Document's Cover Texts may be placed on covers that bracket the Document within the aggregate, or the electronic equivalent of covers if the Document is in electronic form. Otherwise they must appear on printed covers that bracket the whole aggregate. 8. TRANSLATION Translation is considered a kind of modification, so you may distribute translations of the Document under the terms of section 4. Replacing Invariant Sections with translations requires special permission from their copyright holders, but you may include translations of some or all Invariant Sections in addition to the original versions of these Invariant Sections. You may include a translation of this License, and all the license notices in the Document, and any Warranty Disclaimers, provided that you also include the original English version of this License and the original versions of those notices and disclaimers. In case of a disagreement between the translation and the original version of this License or a notice or disclaimer, the original version will prevail. If a section in the Document is Entitled "Acknowledgements", "Dedications", or "History", the requirement (section 4) to Preserve its Title (section 1) will typically require changing the actual title. 9. TERMINATION You may not copy, modify, sublicense, or distribute the Document except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, or distribute it is void, and will automatically terminate your rights under this License. However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, receipt of a copy of some or all of the same material does not give you any rights to use it. 10. FUTURE REVISIONS OF THIS LICENSE The Free Software Foundation may publish new, revised versions of the GNU Free Documentation 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. See . Each version of the License is given a distinguishing version number. If the Document specifies that a particular numbered version of this License "or any later version" applies to it, you have the option of following the terms and conditions either of that specified version or of any later version that has been published (not as a draft) by the Free Software Foundation. If the Document does not specify a version number of this License, you may choose any version ever published (not as a draft) by the Free Software Foundation. If the Document specifies that a proxy can decide which future versions of this License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Document. 11. RELICENSING "Massive Multiauthor Collaboration Site" (or "MMC Site") means any World Wide Web server that publishes copyrightable works and also provides prominent facilities for anybody to edit those works. A public wiki that anybody can edit is an example of such a server. A "Massive Multiauthor Collaboration" (or "MMC") contained in the site means any set of copyrightable works thus published on the MMC site. "CC-BY-SA" means the Creative Commons Attribution-Share Alike 3.0 license published by Creative Commons Corporation, a not-for-profit corporation with a principal place of business in San Francisco, California, as well as future copyleft versions of that license published by that same organization. "Incorporate" means to publish or republish a Document, in whole or in part, as part of another Document. An MMC is "eligible for relicensing" if it is licensed under this License, and if all works that were first published under this License somewhere other than this MMC, and subsequently incorporated in whole or in part into the MMC, (1) had no cover texts or invariant sections, and (2) were thus incorporated prior to November 1, 2008. The operator of an MMC Site may republish an MMC contained in the site under CC-BY-SA on the same site at any time before August 1, 2009, provided the MMC is eligible for relicensing. ADDENDUM: How to use this License for your documents ==================================================== To use this License in a document you have written, include a copy of the License in the document and put the following copyright and license notices just after the title page: Copyright (C) YEAR YOUR NAME. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included in the section entitled ``GNU Free Documentation License''. If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts, replace the "with...Texts." line with this: with the Invariant Sections being LIST THEIR TITLES, with the Front-Cover Texts being LIST, and with the Back-Cover Texts being LIST. If you have Invariant Sections without Cover Texts, or some other combination of the three, merge those two alternatives to suit the situation. If your document contains nontrivial examples of program code, we recommend releasing these examples in parallel under your choice of free software license, such as the GNU General Public License, to permit their use in free software. pspp-1.4.1/doc/pspp-dev.info0000644000175000017500000001765413725007453015316 0ustar00blpblp00000000000000This is pspp-dev.info, produced by makeinfo version 6.7 from pspp-dev.texi. This manual is for GNU PSPP version 1.4.1, software for statistical analysis. Copyright (C) 1997, 1998, 2004, 2005, 2007, 2010, 2014, 2015, 2016 Free Software Foundation, Inc. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included in the section entitled "GNU Free Documentation License". INFO-DIR-SECTION Math START-INFO-DIR-ENTRY * PSPP Developers Guide: (pspp-dev). Tutorial and reference for PSPP developers. END-INFO-DIR-ENTRY  Indirect: pspp-dev.info-1: 801 pspp-dev.info-2: 301179  Tag Table: (Indirect) Node: Top801 Node: Introduction2482 Node: Basic Concepts3665 Node: Values4084 Node: Numeric Values5330 Node: String Values6793 Node: Runtime Typed Values7617 Ref: value_is_resizable10067 Node: Input and Output Formats12151 Node: Constructing and Verifying Formats14098 Ref: fmt_for_output_from_input14723 Node: Format Utility Functions16638 Node: Obtaining Properties of Format Types18168 Ref: fmt_min_input_width19492 Ref: fmt_max_input_width19492 Ref: fmt_min_output_width19492 Ref: fmt_max_output_width19492 Ref: fmt_max_input_decimals19882 Ref: fmt_max_output_decimals19882 Node: Numeric Formatting Styles24371 Node: Formatted Data Input and Output27570 Node: User-Missing Values30923 Node: Testing for Missing Values33796 Node: Creating and Destroying User-Missing Values35695 Node: Changing User-Missing Value Set Width36656 Ref: mv_resize37959 Node: Inspecting User-Missing Value Sets38274 Node: Modifying User-Missing Value Sets40476 Ref: mv_is_acceptable42239 Node: Value Labels43428 Node: Value Labels Creation and Destruction45094 Node: Value Labels Properties45929 Node: Value Labels Adding and Removing Labels47045 Node: Value Labels Iteration48198 Node: Variables50858 Node: Variable Name52203 Ref: var_set_name52942 Node: Variable Type and Width53462 Node: Variable Missing Values54546 Ref: var_set_missing_values56238 Node: Variable Value Labels56992 Node: Variable Print and Write Formats60355 Node: Variable Labels62266 Node: Variable GUI Attributes63845 Ref: var_default_display_width66086 Node: Variable Leave Status67081 Node: Dictionary Class69520 Node: Variable Creation and Destruction71486 Ref: var_create72138 Ref: var_clone73274 Node: Variable Short Names74366 Node: Variable Relationships78049 Node: Variable Auxiliary Data79509 Node: Variable Categorical Values82467 Node: Dictionaries84189 Node: Dictionary Variable Access85811 Node: Dictionary Creating Variables88362 Node: Dictionary Deleting Variables90782 Node: Dictionary Reordering Variables92944 Ref: dict_reorder_var93345 Node: Dictionary Renaming Variables94213 Node: Dictionary Weight Variable95687 Node: Dictionary Filter Variable97509 Node: Dictionary Case Limit98552 Node: Dictionary Split Variables99476 Node: Dictionary File Label101368 Node: Dictionary Documents102294 Node: Coding Conventions105086 Node: Cases105401 Node: Data Sets105560 Node: Pools105714 Node: Parsing Command Syntax105848 Node: Processing Data106010 Node: Presenting Output107476 Node: Internationalisation107629 Ref: Internationalisation-Footnote-1113404 Node: Function Index113512 Node: Concept Index142083 Node: Portable File Format142683 Node: Portable File Characters143724 Node: Portable File Structure145054 Node: Portable File Header147029 Node: Version and Date Info Record149776 Node: Identification Records150359 Node: Variable Count Record151110 Node: Precision Record151438 Node: Case Weight Variable Record151775 Node: Variable Records152227 Node: Value Label Records154390 Node: Portable File Document Record155429 Node: Portable File Data155916 Node: System File Format156507 Node: System File Record Structure160459 Node: File Header Record163166 Ref: layout_code165219 Ref: bias166946 Node: Variable Record168411 Ref: Dictionary Index169295 Ref: System File Output Formats173797 Node: Value Labels Records175292 Node: Document Record177896 Node: Machine Integer Info Record178624 Ref: character-code180484 Node: Machine Floating-Point Info Record181326 Node: Multiple Response Sets Records182712 Ref: Multiple Response Sets Records-Footnote-1187375 Node: Extra Product Info Record187505 Node: Variable Display Parameter Record188634 Node: Long Variable Names Record190484 Node: Very Long String Record191849 Node: Character Encoding Record195551 Node: Long String Value Labels Record197526 Node: Long String Missing Values Record199718 Node: Data File and Variable Attributes Records201932 Node: Variable Roles205177 Node: Extended Number of Cases Record205601 Node: Other Informational Records206843 Node: Dictionary Termination Record207776 Node: Data Record208261 Node: SPSS/PC+ System File Format214912 Node: Record 0 Main Header Record218025 Node: Record 1 Variables Record221504 Node: Record 2 Labels Record225465 Node: Record 3 Data Record227233 Node: Records 4 and 5 Data Entry229402 Node: SPSS Viewer File Format229650 Ref: SPSS Viewer File Format-Footnote-1233211 Node: SPV Structure Member Format233373 Node: SPV Structure heading Element240142 Node: SPV Structure label Element243096 Node: SPV Structure container Element243966 Node: SPV Structure text Element (Inside container)244925 Node: SPV Structure html Element245883 Node: SPV Structure table Element247277 Node: SPV Structure graph Element248852 Node: SPV Structure model Element249993 Node: SPV Structure tree Element251082 Node: SPV Structure Path Elements251561 Node: SPV Structure pageSetup Element252810 Node: SPV Structure text Element (Inside pageParagraph)254448 Node: SPV Light Detail Member Format256010 Node: SPV Light Member Header259962 Node: SPV Light Member Titles261832 Node: SPV Light Member Footnotes263254 Node: SPV Light Member Areas263847 Node: SPV Light Member Borders266031 Node: SPV Light Member Print Settings267597 Node: SPV Light Member Table Settings269026 Node: SPV Light Member Formats272008 Node: SPV Light Member Dimensions278228 Node: SPV Light Member Categories280182 Node: SPV Light Member Axes282504 Node: SPV Light Member Cells283629 Node: SPV Light Member Value284639 Node: SPV Light Member ValueMod291347 Node: SPV Legacy Detail Member Binary Format294034 Node: SPV Legacy Member Metadata295891 Node: SPV Legacy Member Numeric Data297427 Node: SPV Legacy Member String Data298249 Node: SPV Legacy Detail Member XML Format301179 Node: SPV Detail visualization Element303098 Node: SPV Detail Variable Elements306155 Node: SPV Detail sourceVariable Element309688 Node: SPV Detail derivedVariable Element311223 Node: SPV Detail valueMapEntry Element312818 Node: SPV Detail extension Element313708 Node: SPV Detail graph Element315765 Node: SPV Detail location Element316417 Node: SPV Detail faceting Element318537 Node: SPV Detail facetLayout Element321747 Node: SPV Detail label Element324671 Node: SPV Detail setCellProperties Element326624 Node: SPV Detail setFormat Element331707 Node: SPV Detail numberFormat Element333004 Node: SPV Detail stringFormat Element335954 Node: SPV Detail dateTimeFormat Element337045 Node: SPV Detail elapsedTimeFormat Element342100 Node: SPV Detail format Element343593 Node: SPV Detail affix Element345739 Node: SPV Detail interval Element346839 Node: SPV Detail style Element348827 Node: SPV Detail labelFrame Element350784 Node: SPV Detail Legacy Properties352268 Node: Encrypted File Wrappers354319 Node: Common Wrapper Format355024 Node: Checking Passwords357659 Node: Password Encoding358828 Node: q2c Input Format361641 Node: Invoking q2c362299 Node: q2c Input Structure362668 Node: Grammar Rules364844 Node: GNU Free Documentation License371414  End Tag Table  Local Variables: coding: utf-8 End: pspp-1.4.1/doc/combining.texi0000644000175000017500000003503013571051220015515 0ustar00blpblp00000000000000@c PSPP - a program for statistical analysis. @c Copyright (C) 2017 Free Software Foundation, Inc. @c Permission is granted to copy, distribute and/or modify this document @c under the terms of the GNU Free Documentation License, Version 1.3 @c or any later version published by the Free Software Foundation; @c with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. @c A copy of the license is included in the section entitled "GNU @c Free Documentation License". @c @node Combining Data Files @chapter Combining Data Files This chapter describes commands that allow data from system files, portable files, and open datasets to be combined to form a new active dataset. These commands can combine data files in the following ways: @itemize @item @cmd{ADD FILES} interleaves or appends the cases from each input file. It is used with input files that have variables in common, but distinct sets of cases. @item @cmd{MATCH FILES} adds the data together in cases that match across multiple input files. It is used with input files that have cases in common, but different information about each case. @item @cmd{UPDATE} updates a master data file from data in a set of transaction files. Each case in a transaction data file modifies a matching case in the primary data file, or it adds a new case if no matching case can be found. @end itemize These commands share the majority of their syntax, which is described in the following section, followed by one section for each command that describes its specific syntax and semantics. @menu * Combining Files Common Syntax:: * ADD FILES:: Interleave cases from multiple files. * MATCH FILES:: Merge cases from multiple files. * UPDATE:: Update cases using transactional data. @end menu @node Combining Files Common Syntax @section Common Syntax @display Per input file: /FILE=@{*,'@var{file_name}'@} [/RENAME=(@var{src_names}=@var{target_names})@dots{}] [/IN=@var{var_name}] [/SORT] Once per command: /BY @var{var_list}[(@{D|A@})] [@var{var_list}[(@{D|A@}]]@dots{} [/DROP=@var{var_list}] [/KEEP=@var{var_list}] [/FIRST=@var{var_name}] [/LAST=@var{var_name}] [/MAP] @end display This section describes the syntactical features in common among the @cmd{ADD FILES}, @cmd{MATCH FILES}, and @cmd{UPDATE} commands. The following sections describe details specific to each command. Each of these commands reads two or more input files and combines them. The command's output becomes the new active dataset. None of the commands actually change the input files. Therefore, if you want the changes to become permanent, you must explicitly save them using an appropriate procedure or transformation (@pxref{System and Portable File IO}). The syntax of each command begins with a specification of the files to be read as input. For each input file, specify FILE with a system file or portable file's name as a string, a dataset (@pxref{Datasets}) or file handle name, (@pxref{File Handles}), or an asterisk (@samp{*}) to use the active dataset as input. Use of portable files on @subcmd{FILE} is a @pspp{} extension. At least two @subcmd{FILE} subcommands must be specified. If the active dataset is used as an input source, then @cmd{TEMPORARY} must not be in effect. Each @subcmd{FILE} subcommand may be followed by any number of @subcmd{RENAME} subcommands that specify a parenthesized group or groups of variable names as they appear in the input file, followed by those variables' new names, separated by an equals sign (@subcmd{=}), e.g. @subcmd{/RENAME=(OLD1=NEW1)(OLD2=NEW2)}. To rename a single variable, the parentheses may be omitted: @subcmd{/RENAME=@var{old}=@var{new}}. Within a parenthesized group, variables are renamed simultaneously, so that @subcmd{/RENAME=(@var{A} @var{B}=@var{B} @var{A})} exchanges the names of variables @var{A} and @var{B}. Otherwise, renaming occurs in left-to-right order. Each @subcmd{FILE} subcommand may optionally be followed by a single @subcmd{IN} subcommand, which creates a numeric variable with the specified name and format F1.0. The IN variable takes value 1 in an output case if the given input file contributed to that output case, and 0 otherwise. The @subcmd{DROP}, @subcmd{KEEP}, and @subcmd{RENAME} subcommands have no effect on IN variables. If @subcmd{BY} is used (see below), the @subcmd{SORT} keyword must be specified after a @subcmd{FILE} if that input file is not already sorted on the @subcmd{BY} variables. When @subcmd{SORT} is specified, @pspp{} sorts the input file's data on the @subcmd{BY} variables before it applies it to the command. When @subcmd{SORT} is used, @subcmd{BY} is required. @subcmd{SORT} is a @pspp{} extension. @pspp{} merges the dictionaries of all of the input files to form the dictionary of the new active dataset, like so: @itemize @bullet @item The variables in the new active dataset are the union of all the input files' variables, matched based on their name. When a single input file contains a variable with a given name, the output file will contain exactly that variable. When more than one input file contains a variable with a given name, those variables must all have the same type (numeric or string) and, for string variables, the same width. Variables are matched after renaming with the @subcmd{RENAME} subcommand. Thus, @subcmd{RENAME} can be used to resolve conflicts. @item The variable label for each output variable is taken from the first specified input file that has a variable label for that variable, and similarly for value labels and missing values. @item The file label of the new active dataset (@pxref{FILE LABEL}) is that of the first specified @subcmd{FILE} that has a file label. @item The documents in the new active dataset (@pxref{DOCUMENT}) are the concatenation of all the input files' documents, in the order in which the @subcmd{FILE} subcommands are specified. @item If all of the input files are weighted on the same variable, then the new active dataset is weighted on that variable. Otherwise, the new active dataset is not weighted. @end itemize The remaining subcommands apply to the output file as a whole, rather than to individual input files. They must be specified at the end of the command specification, following all of the @subcmd{FILE} and related subcommands. The most important of these subcommands is @subcmd{BY}, which specifies a set of one or more variables that may be used to find corresponding cases in each of the input files. The variables specified on @subcmd{BY} must be present in all of the input files. Furthermore, if any of the input files are not sorted on the @subcmd{BY} variables, then @subcmd{SORT} must be specified for those input files. The variables listed on @subcmd{BY} may include (A) or (D) annotations to specify ascending or descending sort order. @xref{SORT CASES}, for more details on this notation. Adding (A) or (D) to the @subcmd{BY} subcommand specification is a @pspp{} extension. The @subcmd{DROP} subcommand can be used to specify a list of variables to exclude from the output. By contrast, the @subcmd{KEEP} subcommand can be used to specify variables to include in the output; all variables not listed are dropped. @subcmd{DROP} and @subcmd{KEEP} are executed in left-to-right order and may be repeated any number of times. @subcmd{DROP} and @subcmd{KEEP} do not affect variables created by the @subcmd{IN}, @subcmd{FIRST}, and @subcmd{LAST} subcommands, which are always included in the new active dataset, but they can be used to drop @subcmd{BY} variables. The @subcmd{FIRST} and @subcmd{LAST} subcommands are optional. They may only be specified on @cmd{MATCH FILES} and @cmd{ADD FILES}, and only when @subcmd{BY} is used. @subcmd{FIRST} and @subcmd{LIST} each adds a numeric variable to the new active dataset, with the name given as the subcommand's argument and F1.0 print and write formats. The value of the @subcmd{FIRST} variable is 1 in the first output case with a given set of values for the @subcmd{BY} variables, and 0 in other cases. Similarly, the @subcmd{LAST} variable is 1 in the last case with a given of @subcmd{BY} values, and 0 in other cases. When any of these commands creates an output case, variables that are only in files that are not present for the current case are set to the system-missing value for numeric variables or spaces for string variables. These commands may combine any number of files, limited only by the machine's memory. @node ADD FILES @section ADD FILES @vindex ADD FILES @display ADD FILES Per input file: /FILE=@{*,'@var{file_name}'@} [/RENAME=(@var{src_names}=@var{target_names})@dots{}] [/IN=@var{var_name}] [/SORT] Once per command: [/BY @var{var_list}[(@{D|A@})] [@var{var_list}[(@{D|A@})]@dots{}]] [/DROP=@var{var_list}] [/KEEP=@var{var_list}] [/FIRST=@var{var_name}] [/LAST=@var{var_name}] [/MAP] @end display @cmd{ADD FILES} adds cases from multiple input files. The output, which replaces the active dataset, consists all of the cases in all of the input files. @subcmd{ADD FILES} shares the bulk of its syntax with other @pspp{} commands for combining multiple data files. @xref{Combining Files Common Syntax}, above, for an explanation of this common syntax. When @subcmd{BY} is not used, the output of @subcmd{ADD FILES} consists of all the cases from the first input file specified, followed by all the cases from the second file specified, and so on. When @subcmd{BY} is used, the output is additionally sorted on the @subcmd{BY} variables. When @subcmd{ADD FILES} creates an output case, variables that are not part of the input file from which the case was drawn are set to the system-missing value for numeric variables or spaces for string variables. @node MATCH FILES @section MATCH FILES @vindex MATCH FILES @display MATCH FILES Per input file: /@{FILE,TABLE@}=@{*,'@var{file_name}'@} [/RENAME=(@var{src_names}=@var{target_names})@dots{}] [/IN=@var{var_name}] [/SORT] Once per command: /BY @var{var_list}[(@{D|A@}] [@var{var_list}[(@{D|A@})]@dots{}] [/DROP=@var{var_list}] [/KEEP=@var{var_list}] [/FIRST=@var{var_name}] [/LAST=@var{var_name}] [/MAP] @end display @cmd{MATCH FILES} merges sets of corresponding cases in multiple input files into single cases in the output, combining their data. @cmd{MATCH FILES} shares the bulk of its syntax with other @pspp{} commands for combining multiple data files. @xref{Combining Files Common Syntax}, above, for an explanation of this common syntax. How @cmd{MATCH FILES} matches up cases from the input files depends on whether @subcmd{BY} is specified: @itemize @bullet @item If @subcmd{BY} is not used, @cmd{MATCH FILES} combines the first case from each input file to produce the first output case, then the second case from each input file for the second output case, and so on. If some input files have fewer cases than others, then the shorter files do not contribute to cases output after their input has been exhausted. @item If @subcmd{BY} is used, @cmd{MATCH FILES} combines cases from each input file that have identical values for the @subcmd{BY} variables. When @subcmd{BY} is used, @subcmd{TABLE} subcommands may be used to introduce @dfn{table lookup file}. @subcmd{TABLE} has same syntax as @subcmd{FILE}, and the @subcmd{RENAME}, @subcmd{IN}, and @subcmd{SORT} subcommands may follow a @subcmd{TABLE} in the same way as @subcmd{FILE}. Regardless of the number of @subcmd{TABLE}s, at least one @subcmd{FILE} must specified. Table lookup files are treated in the same way as other input files for most purposes and, in particular, table lookup files must be sorted on the @subcmd{BY} variables or the @subcmd{SORT} subcommand must be specified for that @subcmd{TABLE}. Cases in table lookup files are not consumed after they have been used once. This means that data in table lookup files can correspond to any number of cases in @subcmd{FILE} input files. Table lookup files are analogous to lookup tables in traditional relational database systems. If a table lookup file contains more than one case with a given set of @subcmd{BY} variables, only the first case is used. @end itemize When @cmd{MATCH FILES} creates an output case, variables that are only in files that are not present for the current case are set to the system-missing value for numeric variables or spaces for string variables. @node UPDATE @section UPDATE @vindex UPDATE @display UPDATE Per input file: /FILE=@{*,'@var{file_name}'@} [/RENAME=(@var{src_names}=@var{target_names})@dots{}] [/IN=@var{var_name}] [/SORT] Once per command: /BY @var{var_list}[(@{D|A@})] [@var{var_list}[(@{D|A@})]]@dots{} [/DROP=@var{var_list}] [/KEEP=@var{var_list}] [/MAP] @end display @cmd{UPDATE} updates a @dfn{master file} by applying modifications from one or more @dfn{transaction files}. @cmd{UPDATE} shares the bulk of its syntax with other @pspp{} commands for combining multiple data files. @xref{Combining Files Common Syntax}, above, for an explanation of this common syntax. At least two @subcmd{FILE} subcommands must be specified. The first @subcmd{FILE} subcommand names the master file, and the rest name transaction files. Every input file must either be sorted on the variables named on the @subcmd{BY} subcommand, or the @subcmd{SORT} subcommand must be used just after the @subcmd{FILE} subcommand for that input file. @cmd{UPDATE} uses the variables specified on the @subcmd{BY} subcommand, which is required, to attempt to match each case in a transaction file with a case in the master file: @itemize @bullet @item When a match is found, then the values of the variables present in the transaction file replace those variables' values in the new active file. If there are matching cases in more than more transaction file, @pspp{} applies the replacements from the first transaction file, then from the second transaction file, and so on. Similarly, if a single transaction file has cases with duplicate @subcmd{BY} values, then those are applied in order to the master file. When a variable in a transaction file has a missing value or when a string variable's value is all blanks, that value is never used to update the master file. @item If a case in the master file has no matching case in any transaction file, then it is copied unchanged to the output. @item If a case in a transaction file has no matching case in the master file, then it causes a new case to be added to the output, initialized from the values in the transaction file. @end itemize pspp-1.4.1/doc/tut.texi0000644000175000017500000000006013673503234014371 0ustar00blpblp00000000000000@set example-dir /usr/local/share/pspp/examples pspp-1.4.1/doc/help-pages-list0000644000175000017500000000254613717773374015633 0ustar00blpblp00000000000000//*[@id='AGGREGATE'] //*[@id='AUTORECODE'] //*[@id='NPAR-TESTS']/*[@id='BINOMIAL'] //*[@id='COMPUTE'] //*[@id='GRAPH']/*[@id='BAR-CHART'] //*[@id='CORRELATIONS'] //*[@id='COUNT'] //*[@id='DOCUMENT'] //*[@id='CROSSTABS'] //*[@id='CROSSTABS'] //*[@id='CROSSTABS'] //*[@id='CROSSTABS'] //*[@id='NPAR-TESTS']/*[@id='CHISQUARE'] //*[@id='DESCRIPTIVES'] //*[@id='DATASET'] //*[@id='EXAMINE'] //*[@id='EXAMINE'] //*[@id='EXAMINE'] //*[@id='FACTOR'] //*[@id='FACTOR'] //*[@id='FACTOR'] //*[@id='FREQUENCIES'] //*[@id='FREQUENCIES'] //*[@id='FREQUENCIES'] //*[@id='GRAPH']/*[@id='HISTOGRAM'] //*[@id='T_002dTEST'] //*[@id='T_002dTEST'] //*[@id='NPAR-TESTS'] //*[@id='NPAR-TESTS'] //*[@id='QUICK-CLUSTER'] //*[@id='NPAR-TESTS'] //*[@id='NPAR-TESTS']/*[@id='KOLMOGOROV_002dSMIRNOV'] //*[@id='LOGISTIC-REGRESSION'] //*[@id='LOGISTIC-REGRESSION'] //*[@id='MEANS'] //*[@id='ONEWAY'] //*[@id='ONEWAY'] //*[@id='ONEWAY'] //*[@id='T_002dTEST'] //*[@id='RANK'] //*[@id='RANK'] //*[@id='RANK'] //*[@id='NPAR-TESTS']/*[@id='RUNS'] //*[@id='SORT-CASES'] //*[@id='SPLIT-FILE'] //*[@id='RECODE'] //*[@id='RECODE'] //*[@id='REGRESSION'] //*[@id='REGRESSION'] //*[@id='REGRESSION'] //*[@id='RELIABILITY'] //*[@id='ROC'] //*[@id='GRAPH']/*[@id='SCATTERPLOT'] //*[@id='SELECT-IF'] //*[@id='T_002dTEST'] //*[@id='T_002dTEST'] //*[@id='FLIP'] //*[@id='GLM'] //*[@id='Variable-Attributes'] //*[@id='WEIGHT'] pspp-1.4.1/Makefile.am0000644000175000017500000001177513725006021014156 0ustar00blpblp00000000000000## PSPP - a program for statistical analysis. ## Copyright (C) 2019 Free Software Foundation, Inc. ## ## 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 3 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, see . ## Process this file with automake to produce Makefile.in -*- makefile -*- AUTOMAKE_OPTIONS = std-options check-news 1.10.1 subdir-objects SUBDIRS = gl po DISTCLEANFILES = ./po/stamp-po xconfigure BUILT_SOURCES = AM_CPPFLAGS = \ -I$(top_srcdir)/gl \ -I$(top_builddir)/gl \ -DINSTALLDIR=\"$(bindir)\" AM_V_P ?= : AM_CFLAGS= if cc_is_gcc AM_CFLAGS+=-Wall -Wextra -Wwrite-strings -Wstrict-prototypes \ -Wpointer-arith -Wno-sign-compare -Wmissing-prototypes endif .q.c: @$(MKDIR_P) `dirname $@` $(AM_V_GEN)./src/language/lexer/q2c$(EXEEXT_FOR_BUILD) $< $@ $(all_q_sources:.q=.c): src/language/lexer/q2c$(EXEEXT_FOR_BUILD) all_q_sources = pkgsysconfdir = $(sysconfdir)/$(PACKAGE) EXTRA_DIST = ONEWS CLEANFILES = CLEAN_LOCAL = ALL_LOCAL = CHECK_LOCAL = ACLOCAL_AMFLAGS = -I m4 -I gl/m4 noinst_LIBRARIES= noinst_LTLIBRARIES= noinst_PROGRAMS= check_PROGRAMS= bin_PROGRAMS= dist_man_MANS = DIST_HOOKS = INSTALL_DATA_HOOKS = UNINSTALL_DATA_HOOKS = PHONY = SUFFIXES = .q LDADD = gl/libgl.la # This ensures that files added to EXTRA_DIST are always distributed, # even if they are inside an Automake if...endif conditional block that is # disabled by some particular "configure" run. For more information, see: # http://article.gmane.org/gmane.comp.sysutils.automake.general/10891 noinst_HEADERS = $(EXTRA_DIST) generate-changelog: if test -d $(top_srcdir)/.git; then \ $(top_srcdir)/build-aux/gitlog-to-changelog --since=2008-07-27 --srcdir=$(top_srcdir) \ > $(distdir)/cl-t || exit 1; \ rm -f $(distdir)/ChangeLog; \ mv $(distdir)/cl-t $(distdir)/ChangeLog; \ fi DIST_HOOKS += generate-changelog include $(top_srcdir)/build-aux/automake.mk include $(top_srcdir)/po/automake.mk include $(top_srcdir)/lib/automake.mk include $(top_srcdir)/doc/automake.mk include $(top_srcdir)/examples/automake.mk include $(top_srcdir)/src/automake.mk include $(top_srcdir)/utilities/automake.mk include $(top_srcdir)/tests/automake.mk if WITH_PERL_MODULE include $(top_srcdir)/perl-module/automake.mk endif PHONY += $(DIST_HOOKS) $(INSTALL_DATA_HOOKS) $(UNINSTALL_DATA_HOOKS) .PHONY: $(PHONY) dist-hook: $(DIST_HOOKS) install-data-hook: $(INSTALL_DATA_HOOKS) uninstall-hook: $(UNINSTALL_DATA_HOOKS) clean-local: $(CLEAN_LOCAL) all-local: $(ALL_LOCAL) check-local: $(CHECK_LOCAL) # A convenience target to build all the binaries programs: $(PROGRAMS) # The following rules are from Open vSwitch. The original copyright notice # and license are: # # Copyright (C) 2007, 2008, 2009, 2010, 2011, 2012, 2013 Nicira, Inc. # # Copying and distribution of this file, with or without modification, # are permitted in any medium without royalty provided the copyright # notice and this notice are preserved. This file is offered as-is, # without warranty of any kind. # If we're checked out from a Git repository, make sure that every # file that is in Git is distributed. # The debian package is now also maintained in git and that contains # the distribution files. Do not run this check if we are # in a debian package git repository, because the check fails there ALL_LOCAL += dist-hook-git dist-hook-git: distfiles @if test -e $(srcdir)/.git && \ test ! -d $(srcdir)/debian && \ (git --version) >/dev/null 2>&1; then \ (cd $(srcdir) && git ls-files) \ | grep -vE '\.gitignore|README.Git|Smake|Bug-administration' \ | grep -vE '\.gitattributes' \ | LC_ALL=C sort -u > gitfiles; \ LC_ALL=C comm -1 -3 distfiles gitfiles > missing-distfiles; \ if test -s missing-distfiles; then \ echo "The distribution is missing the following files:"; \ cat missing-distfiles; \ exit 1; \ fi; \ fi # The following is based on commands for the Automake "distdir" target. distfiles: Makefile @srcdirstrip=`echo "$(srcdir)" | $(SED) 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | $(SED) 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ for file in $$list; do echo $$file; done | \ $(SED) -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t" \ | LC_ALL=C sort -u > $@ CLEANFILES += distfiles gitfiles missing-distfiles PHONY += dist-hook-git pspp-1.4.1/THANKS0000644000175000017500000000107713571051220013027 0ustar00blpblp00000000000000Thanks to... * The Gnulib team for painstaking work to enable portability. * David MacKenzie for writing Autoconf, the automatic configuration tool. * David MacKenzie and Tom Tromey for writing Automake, the tool for generating `Makefile's. * Ulrich Drepper et al for writing gettext, the GNU internationalization package. * François Pinard for advice on proceeding with development. * Jim Van Zandt and "Bojo" for Debian packaging and suggestions. * The coordinators and translators at translationproject.org. pspp-1.4.1/utilities/0000755000175000017500000000000013725012647014135 5ustar00blpblp00000000000000pspp-1.4.1/utilities/pspp-convert.c0000644000175000017500000004141113670210420016726 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2013, 2014, 2015, 2016 Free Software Foundation, Inc. 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 3 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, see . */ #include #include #include #include #include #include #include "data/any-reader.h" #include "data/casereader.h" #include "data/casewriter.h" #include "data/csv-file-writer.h" #include "data/dictionary.h" #include "data/encrypted-file.h" #include "data/file-name.h" #include "data/por-file-writer.h" #include "data/settings.h" #include "data/sys-file-writer.h" #include "data/file-handle-def.h" #include "language/command.h" #include "language/lexer/lexer.h" #include "language/lexer/variable-parser.h" #include "libpspp/assertion.h" #include "libpspp/cast.h" #include "libpspp/i18n.h" #include "gl/error.h" #include "gl/getpass.h" #include "gl/localcharset.h" #include "gl/progname.h" #include "gl/version-etc.h" #include "gettext.h" #define _(msgid) gettext (msgid) static void usage (void); static bool decrypt_file (struct encrypted_file *enc, const struct file_handle *input_filename, const struct file_handle *output_filename, const char *password, const char *alphabet, int max_length, const char *password_list); static void parse_character_option (const char *arg, const char *option_name, char *out) { if (strlen (arg) != 1) { /* XXX support multibyte characters */ error (1, 0, _("%s argument must be a single character"), option_name); } *out = arg[0]; } static bool parse_variables_option (const char *arg, struct dictionary *dict, struct variable ***vars, size_t *n_vars) { struct lexer *lexer = lex_create (); lex_append (lexer, lex_reader_for_string (arg, locale_charset ())); lex_get (lexer); bool ok = parse_variables (lexer, dict, vars, n_vars, 0); if (ok && (lex_token (lexer) != T_STOP && lex_token (lexer) != T_ENDCMD)) { lex_error (lexer, _("expecting variable name")); ok = false; } lex_destroy (lexer); if (!ok) { free (*vars); *vars = NULL; *n_vars = 0; } return ok; } int main (int argc, char *argv[]) { const char *input_filename; const char *output_filename; long long int max_cases = LLONG_MAX; const char *keep = NULL; const char *drop = NULL; struct dictionary *dict = NULL; struct casereader *reader = NULL; struct file_handle *input_fh = NULL; const char *encoding = NULL; struct encrypted_file *enc; const char *output_format = NULL; struct file_handle *output_fh = NULL; struct casewriter *writer; const char *password = NULL; struct string alphabet = DS_EMPTY_INITIALIZER; const char *password_list = NULL; int length = 0; struct csv_writer_options csv_opts = { .include_var_names = true, .decimal = '.', .delimiter = 0, /* The default will be set later. */ .qualifier = '"', }; long long int i; set_program_name (argv[0]); i18n_init (); fh_init (); settings_init (); for (;;) { enum { OPT_PASSWORD_LIST = UCHAR_MAX + 1, OPT_RECODE, OPT_NO_VAR_NAMES, OPT_LABELS, OPT_PRINT_FORMATS, OPT_DECIMAL, OPT_DELIMITER, OPT_QUALIFIER, }; static const struct option long_options[] = { { "cases", required_argument, NULL, 'c' }, { "keep", required_argument, NULL, 'k' }, { "drop", required_argument, NULL, 'd' }, { "encoding", required_argument, NULL, 'e' }, { "recode", no_argument, NULL, OPT_RECODE }, { "no-var-names", no_argument, NULL, OPT_NO_VAR_NAMES }, { "labels", no_argument, NULL, OPT_LABELS }, { "print-formats", no_argument, NULL, OPT_PRINT_FORMATS }, { "decimal", required_argument, NULL, OPT_DECIMAL }, { "delimiter", required_argument, NULL, OPT_DELIMITER }, { "qualifier", required_argument, NULL, OPT_QUALIFIER }, { "password", required_argument, NULL, 'p' }, { "password-alphabet", required_argument, NULL, 'a' }, { "password-length", required_argument, NULL, 'l' }, { "password-list", required_argument, NULL, OPT_PASSWORD_LIST }, { "output-format", required_argument, NULL, 'O' }, { "help", no_argument, NULL, 'h' }, { "version", no_argument, NULL, 'v' }, { NULL, 0, NULL, 0 }, }; int c; c = getopt_long (argc, argv, "c:k:d:e:p:a:l:O:hv", long_options, NULL); if (c == -1) break; switch (c) { case 'c': max_cases = strtoull (optarg, NULL, 0); break; case 'k': keep = optarg; break; case 'd': drop = optarg; break; case 'e': encoding = optarg; break; case 'p': password = optarg; break; case 'l': length = atoi (optarg); break; case OPT_PASSWORD_LIST: password_list = optarg; break; case OPT_RECODE: csv_opts.recode_user_missing = true; break; case OPT_NO_VAR_NAMES: csv_opts.include_var_names = false; break; case OPT_LABELS: csv_opts.use_value_labels = true; break; case OPT_DECIMAL: parse_character_option (optarg, "--decimal", &csv_opts.decimal); break; case OPT_DELIMITER: parse_character_option (optarg, "--delimiter", &csv_opts.delimiter); break; case OPT_QUALIFIER: parse_character_option (optarg, "--qualifier", &csv_opts.qualifier); break; case 'a': for (const char *p = optarg; *p;) if (p[1] == '-' && p[2] > p[0]) { for (int ch = p[0]; ch <= p[2]; ch++) ds_put_byte (&alphabet, ch); p += 3; } else ds_put_byte (&alphabet, *p++); break; case 'O': output_format = optarg; break; case 'v': version_etc (stdout, "pspp-convert", PACKAGE_NAME, PACKAGE_VERSION, "Ben Pfaff", "John Darrington", NULL_SENTINEL); exit (EXIT_SUCCESS); case 'h': usage (); exit (EXIT_SUCCESS); default: goto error; } } if (optind + 2 != argc) error (1, 0, _("exactly two non-option arguments are required; " "use --help for help")); input_filename = argv[optind]; output_filename = argv[optind + 1]; input_fh = fh_create_file (NULL, input_filename, NULL, fh_default_properties ()); if (output_format == NULL) { const char *dot = strrchr (output_filename, '.'); if (dot == NULL) error (1, 0, _("%s: cannot guess output format (use -O option)"), output_filename); output_format = dot + 1; } output_fh = fh_create_file (NULL, output_filename, NULL, fh_default_properties ()); if (encrypted_file_open (&enc, input_fh) > 0) { if (decrypt_file (enc, input_fh, output_fh, password, ds_cstr (&alphabet), length, password_list)) goto exit; else goto error; } reader = any_reader_open_and_decode (input_fh, encoding, &dict, NULL); if (reader == NULL) goto error; if (keep) { struct variable **keep_vars; size_t n_keep_vars; if (!parse_variables_option (keep, dict, &keep_vars, &n_keep_vars)) goto error; dict_reorder_vars (dict, keep_vars, n_keep_vars); dict_delete_consecutive_vars (dict, n_keep_vars, dict_get_var_cnt (dict) - n_keep_vars); free (keep_vars); } if (drop) { struct variable **drop_vars; size_t n_drop_vars; if (!parse_variables_option (drop, dict, &drop_vars, &n_drop_vars)) goto error; dict_delete_vars (dict, drop_vars, n_drop_vars); free (drop_vars); } if (!strcmp (output_format, "csv") || !strcmp (output_format, "txt")) { if (!csv_opts.delimiter) csv_opts.delimiter = csv_opts.decimal == '.' ? ',' : ';'; writer = csv_writer_open (output_fh, dict, &csv_opts); } else if (!strcmp (output_format, "sav") || !strcmp (output_format, "sys")) { struct sfm_write_options options; options = sfm_writer_default_options (); writer = sfm_open_writer (output_fh, dict, options); } else if (!strcmp (output_format, "por")) { struct pfm_write_options options; options = pfm_writer_default_options (); writer = pfm_open_writer (output_fh, dict, options); } else { error (1, 0, _("%s: unknown output format (use -O option)"), output_filename); NOT_REACHED (); } if (!writer) error (1, 0, _("%s: error opening output file"), output_filename); for (i = 0; i < max_cases; i++) { struct ccase *c; c = casereader_read (reader); if (c == NULL) break; casewriter_write (writer, c); } if (!casereader_destroy (reader)) error (1, 0, _("%s: error reading input file"), input_filename); if (!casewriter_destroy (writer)) error (1, 0, _("%s: error writing output file"), output_filename); exit: ds_destroy (&alphabet); dict_unref (dict); fh_unref (output_fh); fh_unref (input_fh); fh_done (); i18n_done (); return 0; error: casereader_destroy (reader); ds_destroy (&alphabet); dict_unref (dict); fh_unref (output_fh); fh_unref (input_fh); fh_done (); i18n_done (); return 1; } static bool decrypt_file (struct encrypted_file *enc, const struct file_handle *ifh, const struct file_handle *ofh, const char *password, const char *alphabet, int max_length, const char *password_list) { FILE *out; int err; const char *input_filename = fh_get_file_name (ifh); const char *output_filename = fh_get_file_name (ofh); if (password_list) { FILE *password_file; if (!strcmp (password_list, "-")) password_file = stdin; else { password_file = fopen (password_list, "r"); if (!password_file) error (1, errno, _("%s: error opening password file"), password_list); } struct string pw = DS_EMPTY_INITIALIZER; unsigned int target = 100000; for (unsigned int i = 0; ; i++) { ds_clear (&pw); if (!ds_read_line (&pw, password_file, SIZE_MAX)) { if (isatty (STDOUT_FILENO)) { putchar ('\r'); fflush (stdout); } error (1, 0, _("\n%s: password not in file"), password_list); } ds_chomp_byte (&pw, '\n'); if (i >= target) { target += 100000; if (isatty (STDOUT_FILENO)) { printf ("\r%u", i); fflush (stdout); } } if (encrypted_file_unlock__ (enc, ds_cstr (&pw))) { printf ("\npassword is: \"%s\"\n", ds_cstr (&pw)); password = ds_cstr (&pw); break; } } } else if (alphabet[0] && max_length) { size_t alphabet_size = strlen (alphabet); char *pw = xmalloc (max_length + 1); int *indexes = xzalloc (max_length * sizeof *indexes); for (int len = password ? strlen (password) : 0; len <= max_length; len++) { if (password && len == strlen (password)) { for (int i = 0; i < len; i++) { const char *p = strchr (alphabet, password[i]); if (!p) error (1, 0, _("%s: '%c' is not in alphabet"), password, password[i]); indexes[i] = p - alphabet; pw[i] = *p; } } else { memset (indexes, 0, len * sizeof *indexes); for (int i = 0; i < len; i++) pw[i] = alphabet[0]; } pw[len] = '\0'; unsigned int target = 0; for (unsigned int j = 0; ; j++) { if (j >= target) { target += 100000; if (isatty (STDOUT_FILENO)) { printf ("\rlength %d: %s", len, pw); fflush (stdout); } } if (encrypted_file_unlock__ (enc, pw)) { printf ("\npassword is: \"%s\"\n", pw); password = pw; goto success; } int i; for (i = 0; i < len; i++) if (++indexes[i] < alphabet_size) { pw[i] = alphabet[indexes[i]]; break; } else { indexes[i] = 0; pw[i] = alphabet[indexes[i]]; } if (i == len) break; } } free (indexes); free (pw); success:; } else { if (password == NULL) { password = getpass ("password: "); if (password == NULL) return false; } if (!encrypted_file_unlock (enc, password)) error (1, 0, _("sorry, wrong password")); } out = fn_open (ofh, "wb"); if (out == NULL) error (1, errno, ("%s: error opening output file"), output_filename); for (;;) { uint8_t buffer[1024]; size_t n; n = encrypted_file_read (enc, buffer, sizeof buffer); if (n == 0) break; if (fwrite (buffer, 1, n, out) != n) error (1, errno, ("%s: write error"), output_filename); } err = encrypted_file_close (enc); if (err) error (1, err, ("%s: read error"), input_filename); if (fflush (out) == EOF) error (1, errno, ("%s: write error"), output_filename); fn_close (ofh, out); return true; } static void usage (void) { printf ("\ %s, a utility for converting SPSS data files to other formats.\n\ Usage: %s [OPTION]... INPUT OUTPUT\n\ where INPUT is an SPSS data file or encrypted syntax file\n\ and OUTPUT is the name of the desired output file.\n\ \n\ The desired format of OUTPUT is by default inferred from its extension:\n\ csv txt comma-separated value\n\ sav sys SPSS system file\n\ por SPSS portable file\n\ sps SPSS syntax file (encrypted syntax input files only)\n\ \n\ General options:\n\ -O, --output-format=FORMAT set specific output format, where FORMAT\n\ is one of the extensions listed above\n\ -e, --encoding=CHARSET override encoding of input data file\n\ -c MAXCASES limit number of cases to copy (default is all cases)\n\ -k, --keep=VAR... include only the given variables in output\n\ -d, --drop=VAR... drop the given variables from output\n\ CSV output options:\n\ --recode convert user-missing values to system-missing\n\ --no-var-names do not include variable names as first row\n\ --labels write value labels to output\n\ --print-formats honor variables' print formats\n\ --decimal=CHAR use CHAR as the decimal point (default: .)\n\ --delimiter=CHAR use CHAR to separate fields (default: ,)\n\ --qualifier=CHAR use CHAR to quote the delimiter (default: \")\n\ Password options (for used with encrypted files):\n\ -p PASSWORD individual password\n\ -a ALPHABET with -l, alphabet of passwords to try\n\ -l MAX-LENGTH with -a, maximum number of characters to try\n\ --password-list=FILE try all of the passwords in FILE (one per line)\n\ Other options:\n\ --help display this help and exit\n\ --version output version information and exit\n", program_name, program_name); } pspp-1.4.1/utilities/automake.mk0000644000175000017500000000350513602251103016261 0ustar00blpblp00000000000000# PSPP - a program for statistical analysis. # Copyright (C) 2017 Free Software Foundation, Inc. # # 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 3 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, see . # bin_PROGRAMS += utilities/pspp-dump-sav dist_man_MANS += utilities/pspp-dump-sav.1 utilities_pspp_dump_sav_SOURCES = \ src/libpspp/integer-format.c \ src/libpspp/float-format.c \ utilities/pspp-dump-sav.c utilities_pspp_dump_sav_CPPFLAGS = $(AM_CPPFLAGS) -DINSTALLDIR=\"$(bindir)\" bin_PROGRAMS += utilities/pspp-convert dist_man_MANS += utilities/pspp-convert.1 utilities_pspp_convert_SOURCES = utilities/pspp-convert.c utilities_pspp_convert_CPPFLAGS = $(AM_CPPFLAGS) -DINSTALLDIR=\"$(bindir)\" utilities_pspp_convert_LDADD = src/libpspp.la src/libpspp-core.la $(CAIRO_LIBS) utilities_pspp_convert_LDFLAGS = $(PSPP_LDFLAGS) $(PG_LDFLAGS) if RELOCATABLE_VIA_LD utilities_pspp_convert_LDFLAGS += `$(RELOCATABLE_LDFLAGS) $(bindir)` endif bin_PROGRAMS += utilities/pspp-output dist_man_MANS += utilities/pspp-output.1 utilities_pspp_output_SOURCES = utilities/pspp-output.c utilities_pspp_output_CPPFLAGS = \ $(LIBXML2_CFLAGS) $(AM_CPPFLAGS) -DINSTALLDIR=\"$(bindir)\" utilities_pspp_output_LDADD = \ src/libpspp.la \ src/libpspp-core.la \ $(CAIRO_LIBS) utilities_pspp_output_LDFLAGS = $(PSPP_LDFLAGS) $(LIBXML2_LIBS) pspp-1.4.1/utilities/pspp-dump-sav.c0000644000175000017500000014042413670210420017006 0ustar00blpblp00000000000000/* PSPP - a program for statistical analysis. Copyright (C) 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014 Free Software Foundation, Inc. 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 3 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, see . */ #include #include #include #include #include #include #include #include #include #include "data/val-type.h" #include "libpspp/cast.h" #include "libpspp/compiler.h" #include "libpspp/float-format.h" #include "libpspp/integer-format.h" #include "libpspp/misc.h" #include "gl/error.h" #include "gl/minmax.h" #include "gl/progname.h" #include "gl/version-etc.h" #include "gl/xalloc.h" #include "gl/xsize.h" #define ID_MAX_LEN 64 enum compression { COMP_NONE, COMP_SIMPLE, COMP_ZLIB }; struct sfm_reader { const char *file_name; FILE *file; int n_variable_records, n_variables; int *var_widths; size_t n_var_widths, allocated_var_widths; enum integer_format integer_format; enum float_format float_format; enum compression compression; double bias; }; static void read_header (struct sfm_reader *); static void read_variable_record (struct sfm_reader *); static void read_value_label_record (struct sfm_reader *); static void read_document_record (struct sfm_reader *); static void read_extension_record (struct sfm_reader *); static void read_machine_integer_info (struct sfm_reader *, size_t size, size_t count); static void read_machine_float_info (struct sfm_reader *, size_t size, size_t count); static void read_extra_product_info (struct sfm_reader *, size_t size, size_t count); static void read_mrsets (struct sfm_reader *, size_t size, size_t count); static void read_display_parameters (struct sfm_reader *, size_t size, size_t count); static void read_long_var_name_map (struct sfm_reader *r, size_t size, size_t count); static void read_long_string_map (struct sfm_reader *r, size_t size, size_t count); static void read_datafile_attributes (struct sfm_reader *r, size_t size, size_t count); static void read_variable_attributes (struct sfm_reader *r, size_t size, size_t count); static void read_ncases64 (struct sfm_reader *, size_t size, size_t count); static void read_character_encoding (struct sfm_reader *r, size_t size, size_t count); static void read_long_string_value_labels (struct sfm_reader *r, size_t size, size_t count); static void read_long_string_missing_values (struct sfm_reader *r, size_t size, size_t count); static void read_unknown_extension (struct sfm_reader *, size_t size, size_t count); static void read_simple_compressed_data (struct sfm_reader *, int max_cases); static void read_zlib_compressed_data (struct sfm_reader *); static struct text_record *open_text_record ( struct sfm_reader *, size_t size, size_t count); static void close_text_record (struct text_record *); static bool read_variable_to_value_pair (struct text_record *, char **key, char **value); static char *text_tokenize (struct text_record *, int delimiter); static bool text_match (struct text_record *text, int c); static const char *text_parse_counted_string (struct text_record *); static size_t text_pos (const struct text_record *); static const char *text_get_all (const struct text_record *); static void usage (void); static void sys_warn (struct sfm_reader *, const char *, ...) PRINTF_FORMAT (2, 3); static void sys_error (struct sfm_reader *, const char *, ...) PRINTF_FORMAT (2, 3) NO_RETURN; static void read_bytes (struct sfm_reader *, void *, size_t); static bool try_read_bytes (struct sfm_reader *, void *, size_t); static int read_int (struct sfm_reader *); static int64_t read_int64 (struct sfm_reader *); static double read_float (struct sfm_reader *); static void read_string (struct sfm_reader *, char *, size_t); static void skip_bytes (struct sfm_reader *, size_t); static void trim_spaces (char *); static void print_string (const char *s, size_t len); int main (int argc, char *argv[]) { int max_cases = 0; struct sfm_reader r; int i; set_program_name (argv[0]); for (;;) { static const struct option long_options[] = { { "data", optional_argument, NULL, 'd' }, { "help", no_argument, NULL, 'h' }, { "version", no_argument, NULL, 'v' }, { NULL, 0, NULL, 0 }, }; int c; c = getopt_long (argc, argv, "d::hv", long_options, NULL); if (c == -1) break; switch (c) { case 'd': max_cases = optarg ? atoi (optarg) : INT_MAX; break; case 'v': version_etc (stdout, "pspp-dump-sav", PACKAGE_NAME, PACKAGE_VERSION, "Ben Pfaff", "John Darrington", NULL_SENTINEL); exit (EXIT_SUCCESS); case 'h': usage (); exit (EXIT_SUCCESS); default: exit (EXIT_FAILURE); } } if (optind == argc) error (1, 0, "at least one non-option argument is required; " "use --help for help"); for (i = optind; i < argc; i++) { int rec_type; r.file_name = argv[i]; r.file = fopen (r.file_name, "rb"); if (r.file == NULL) error (EXIT_FAILURE, errno, "error opening `%s'", r.file_name); r.n_variable_records = 0; r.n_variables = 0; r.n_var_widths = 0; r.allocated_var_widths = 0; r.var_widths = 0; r.compression = COMP_NONE; if (argc - optind > 1) printf ("Reading \"%s\":\n", r.file_name); read_header (&r); while ((rec_type = read_int (&r)) != 999) { switch (rec_type) { case 2: read_variable_record (&r); break; case 3: read_value_label_record (&r); break; case 4: sys_error (&r, "Misplaced type 4 record."); case 6: read_document_record (&r); break; case 7: read_extension_record (&r); break; default: sys_error (&r, "Unrecognized record type %d.", rec_type); } } printf ("%08llx: end-of-dictionary record " "(first byte of data at %08llx)\n", (long long int) ftello (r.file), (long long int) ftello (r.file) + 4); if (r.compression == COMP_SIMPLE) { if (max_cases > 0) read_simple_compressed_data (&r, max_cases); } else if (r.compression == COMP_ZLIB) read_zlib_compressed_data (&r); free (r.var_widths); fclose (r.file); } return 0; } static void read_header (struct sfm_reader *r) { char rec_type[5]; char eye_catcher[61]; uint8_t raw_layout_code[4]; int32_t layout_code; int32_t compressed; int32_t weight_index; int32_t ncases; uint8_t raw_bias[8]; char creation_date[10]; char creation_time[9]; char file_label[65]; bool zmagic; read_string (r, rec_type, sizeof rec_type); read_string (r, eye_catcher, sizeof eye_catcher); if (!strcmp ("$FL2", rec_type)) zmagic = false; else if (!strcmp ("$FL3", rec_type)) zmagic = true; else sys_error (r, "This is not an SPSS system file."); /* Identify integer format. */ read_bytes (r, raw_layout_code, sizeof raw_layout_code); if ((!integer_identify (2, raw_layout_code, sizeof raw_layout_code, &r->integer_format) && !integer_identify (3, raw_layout_code, sizeof raw_layout_code, &r->integer_format)) || (r->integer_format != INTEGER_MSB_FIRST && r->integer_format != INTEGER_LSB_FIRST)) sys_error (r, "This is not an SPSS system file."); layout_code = integer_get (r->integer_format, raw_layout_code, sizeof raw_layout_code); read_int (r); /* Nominal case size (not actually useful). */ compressed = read_int (r); weight_index = read_int (r); ncases = read_int (r); if (!zmagic) { if (compressed == 0) r->compression = COMP_NONE; else if (compressed == 1) r->compression = COMP_SIMPLE; else if (compressed != 0) sys_error (r, "SAV file header has invalid compression value " "%"PRId32".", compressed); } else { if (compressed == 2) r->compression = COMP_ZLIB; else sys_error (r, "ZSAV file header has invalid compression value " "%"PRId32".", compressed); } /* Identify floating-point format and obtain compression bias. */ read_bytes (r, raw_bias, sizeof raw_bias); if (float_identify (100.0, raw_bias, sizeof raw_bias, &r->float_format) == 0) { sys_warn (r, "Compression bias is not the usual value of 100, or system " "file uses unrecognized floating-point format."); if (r->integer_format == INTEGER_MSB_FIRST) r->float_format = FLOAT_IEEE_DOUBLE_BE; else r->float_format = FLOAT_IEEE_DOUBLE_LE; } r->bias = float_get_double (r->float_format, raw_bias); read_string (r, creation_date, sizeof creation_date); read_string (r, creation_time, sizeof creation_time); read_string (r, file_label, sizeof file_label); trim_spaces (file_label); skip_bytes (r, 3); printf ("File header record:\n"); printf ("\t%17s: %s\n", "Product name", eye_catcher); printf ("\t%17s: %"PRId32"\n", "Layout code", layout_code); printf ("\t%17s: %"PRId32" (%s)\n", "Compressed", compressed, r->compression == COMP_NONE ? "no compression" : r->compression == COMP_SIMPLE ? "simple compression" : r->compression == COMP_ZLIB ? "ZLIB compression" : ""); printf ("\t%17s: %"PRId32"\n", "Weight index", weight_index); printf ("\t%17s: %"PRId32"\n", "Number of cases", ncases); printf ("\t%17s: %.*g\n", "Compression bias", DBL_DIG + 1, r->bias); printf ("\t%17s: %s\n", "Creation date", creation_date); printf ("\t%17s: %s\n", "Creation time", creation_time); printf ("\t%17s: \"%s\"\n", "File label", file_label); } static const char * format_name (int format) { switch ((format >> 16) & 0xff) { case 1: return "A"; case 2: return "AHEX"; case 3: return "COMMA"; case 4: return "DOLLAR"; case 5: return "F"; case 6: return "IB"; case 7: return "PIBHEX"; case 8: return "P"; case 9: return "PIB"; case 10: return "PK"; case 11: return "RB"; case 12: return "RBHEX"; case 15: return "Z"; case 16: return "N"; case 17: return "E"; case 20: return "DATE"; case 21: return "TIME"; case 22: return "DATETIME"; case 23: return "ADATE"; case 24: return "JDATE"; case 25: return "DTIME"; case 26: return "WKDAY"; case 27: return "MONTH"; case 28: return "MOYR"; case 29: return "QYR"; case 30: return "WKYR"; case 31: return "PCT"; case 32: return "DOT"; case 33: return "CCA"; case 34: return "CCB"; case 35: return "CCC"; case 36: return "CCD"; case 37: return "CCE"; case 38: return "EDATE"; case 39: return "SDATE"; case 40: return "MTIME"; case 41: return "YMDHMS"; default: return "invalid"; } } /* Reads a variable (type 2) record from R and adds the corresponding variable to DICT. Also skips past additional variable records for long string variables. */ static void read_variable_record (struct sfm_reader *r) { int width; int has_variable_label; int missing_value_code; int print_format; int write_format; char name[9]; printf ("%08llx: variable record #%d\n", (long long int) ftello (r->file), ++r->n_variable_records); width = read_int (r); has_variable_label = read_int (r); missing_value_code = read_int (r); print_format = read_int (r); write_format = read_int (r); read_string (r, name, sizeof name); name[strcspn (name, " ")] = '\0'; if (width >= 0) r->n_variables++; if (r->n_var_widths >= r->allocated_var_widths) r->var_widths = x2nrealloc (r->var_widths, &r->allocated_var_widths, sizeof *r->var_widths); r->var_widths[r->n_var_widths++] = width; printf ("\tWidth: %d (%s)\n", width, width > 0 ? "string" : width == 0 ? "numeric" : "long string continuation record"); printf ("\tVariable label: %d\n", has_variable_label); printf ("\tMissing values code: %d (%s)\n", missing_value_code, (missing_value_code == 0 ? "no missing values" : missing_value_code == 1 ? "one missing value" : missing_value_code == 2 ? "two missing values" : missing_value_code == 3 ? "three missing values" : missing_value_code == -2 ? "one missing value range" : missing_value_code == -3 ? "one missing value, one range" : "bad value")); printf ("\tPrint format: %06x (%s%d.%d)\n", print_format, format_name (print_format), (print_format >> 8) & 0xff, print_format & 0xff); printf ("\tWrite format: %06x (%s%d.%d)\n", write_format, format_name (write_format), (write_format >> 8) & 0xff, write_format & 0xff); printf ("\tName: %s\n", name); /* Get variable label, if any. */ if (has_variable_label != 0 && has_variable_label != 1) sys_error (r, "Variable label indicator field is not 0 or 1."); if (has_variable_label == 1) { long long int offset = ftello (r->file); enum { MAX_LABEL_LEN = 65536 }; size_t len = read_int (r); size_t read_len = MIN (MAX_LABEL_LEN, len); char *label = xmalloc (read_len + 1); read_string (r, label, read_len + 1); printf("\t%08llx Variable label: \"%s\"\n", offset, label); free (label); /* Skip label padding up to multiple of 4 bytes. */ skip_bytes (r, ROUND_UP (len, 4) - len); } /* Set missing values. */ if (missing_value_code != 0) { int i; printf ("\t%08llx Missing values:", (long long int) ftello (r->file)); if (!width) { if (missing_value_code < -3 || missing_value_code > 3 || missing_value_code == -1) sys_error (r, "Numeric missing value indicator field is not " "-3, -2, 0, 1, 2, or 3."); if (missing_value_code < 0) { double low = read_float (r); double high = read_float (r); printf (" %.*g...%.*g", DBL_DIG + 1, low, DBL_DIG + 1, high); missing_value_code = -missing_value_code - 2; } for (i = 0; i < missing_value_code; i++) printf (" %.*g", DBL_DIG + 1, read_float (r)); } else if (width > 0) { if (missing_value_code < 1 || missing_value_code > 3) sys_error (r, "String missing value indicator field is not " "0, 1, 2, or 3."); for (i = 0; i < missing_value_code; i++) { char string[9]; read_string (r, string, sizeof string); printf (" \"%s\"", string); } } putchar ('\n'); } } static void print_untyped_value (struct sfm_reader *r, char raw_value[8]) { int n_printable; double value; value = float_get_double (r->float_format, raw_value); for (n_printable = 0; n_printable < 8; n_printable++) if (!isprint (raw_value[n_printable])) break; printf ("%.*g/\"%.*s\"", DBL_DIG + 1, value, n_printable, raw_value); } /* Reads value labels from sysfile R and inserts them into the associated dictionary. */ static void read_value_label_record (struct sfm_reader *r) { int label_cnt, var_cnt; int i; printf ("%08llx: value labels record\n", (long long int) ftello (r->file)); /* Read number of labels. */ label_cnt = read_int (r); for (i = 0; i < label_cnt; i++) { char raw_value[8]; unsigned char label_len; size_t padded_len; char label[256]; read_bytes (r, raw_value, sizeof raw_value); /* Read label length. */ read_bytes (r, &label_len, sizeof label_len); padded_len = ROUND_UP (label_len + 1, 8); /* Read label, padding. */ read_bytes (r, label, padded_len - 1); label[label_len] = 0; printf ("\t"); print_untyped_value (r, raw_value); printf (": \"%s\"\n", label); } /* Now, read the type 4 record that has the list of variables to which the value labels are to be applied. */ /* Read record type of type 4 record. */ if (read_int (r) != 4) sys_error (r, "Variable index record (type 4) does not immediately " "follow value label record (type 3) as it should."); /* Read number of variables associated with value label from type 4 record. */ printf ("\t%08llx: apply to variables", (long long int) ftello (r->file)); var_cnt = read_int (r); for (i = 0; i < var_cnt; i++) printf (" #%d", read_int (r)); putchar ('\n'); } static void read_document_record (struct sfm_reader *r) { int n_lines; int i; printf ("%08llx: document record\n", (long long int) ftello (r->file)); n_lines = read_int (r); printf ("\t%d lines of documents\n", n_lines); for (i = 0; i < n_lines; i++) { char line[81]; printf ("\t%08llx: ", (long long int) ftello (r->file)); read_string (r, line, sizeof line); trim_spaces (line); printf ("line %d: \"%s\"\n", i, line); } } static void read_extension_record (struct sfm_reader *r) { long long int offset = ftello (r->file); int subtype = read_int (r); size_t size = read_int (r); size_t count = read_int (r); size_t bytes = size * count; printf ("%08llx: Record 7, subtype %d, size=%zu, count=%zu\n", offset, subtype, size, count); switch (subtype) { case 3: read_machine_integer_info (r, size, count); return; case 4: read_machine_float_info (r, size, count); return; case 6: /* DATE variable information. We don't use it yet, but we should. */ break; case 7: case 19: read_mrsets (r, size, count); return; case 10: read_extra_product_info (r, size, count); return; case 11: read_display_parameters (r, size, count); return; case 13: read_long_var_name_map (r, size, count); return; case 14: read_long_string_map (r, size, count); return; case 16: read_ncases64 (r, size, count); return; case 17: read_datafile_attributes (r, size, count); return; case 18: read_variable_attributes (r, size, count); return; case 20: read_character_encoding (r, size, count); return; case 21: read_long_string_value_labels (r, size, count); return; case 22: read_long_string_missing_values (r, size, count); return; default: sys_warn (r, "Unrecognized record type 7, subtype %d.", subtype); read_unknown_extension (r, size, count); return; } skip_bytes (r, bytes); } static void read_machine_integer_info (struct sfm_reader *r, size_t size, size_t count) { long long int offset = ftello (r->file); int version_major = read_int (r); int version_minor = read_int (r); int version_revision = read_int (r); int machine_code = read_int (r); int float_representation = read_int (r); int compression_code = read_int (r); int integer_representation = read_int (r); int character_code = read_int (r); printf ("%08llx: machine integer info\n", offset); if (size != 4 || count != 8) sys_error (r, "Bad size (%zu) or count (%zu) field on record type 7, " "subtype 3.", size, count); printf ("\tVersion: %d.%d.%d\n", version_major, version_minor, version_revision); printf ("\tMachine code: %d\n", machine_code); printf ("\tFloating point representation: %d (%s)\n", float_representation, float_representation == 1 ? "IEEE 754" : float_representation == 2 ? "IBM 370" : float_representation == 3 ? "DEC VAX" : "unknown"); printf ("\tCompression code: %d\n", compression_code); printf ("\tEndianness: %d (%s)\n", integer_representation, integer_representation == 1 ? "big" : integer_representation == 2 ? "little" : "unknown"); printf ("\tCharacter code: %d\n", character_code); } /* Read record type 7, subtype 4. */ static void read_machine_float_info (struct sfm_reader *r, size_t size, size_t count) { long long int offset = ftello (r->file); double sysmis = read_float (r); double highest = read_float (r); double lowest = read_float (r); printf ("%08llx: machine float info\n", offset); if (size != 8 || count != 3) sys_error (r, "Bad size (%zu) or count (%zu) on extension 4.", size, count); printf ("\tsysmis: %.*g (%a)\n", DBL_DIG + 1, sysmis, sysmis); if (sysmis != SYSMIS) sys_warn (r, "File specifies unexpected value %.*g (%a) as %s.", DBL_DIG + 1, sysmis, sysmis, "SYSMIS"); printf ("\thighest: %.*g (%a)\n", DBL_DIG + 1, highest, highest); if (highest != HIGHEST) sys_warn (r, "File specifies unexpected value %.*g (%a) as %s.", DBL_DIG + 1, highest, highest, "HIGHEST"); printf ("\tlowest: %.*g (%a)\n", DBL_DIG + 1, lowest, lowest); if (lowest != LOWEST && lowest != SYSMIS) sys_warn (r, "File specifies unexpected value %.*g (%a) as %s.", DBL_DIG + 1, lowest, lowest, "LOWEST"); } static void read_extra_product_info (struct sfm_reader *r, size_t size, size_t count) { struct text_record *text; const char *s; printf ("%08llx: extra product info\n", (long long int) ftello (r->file)); text = open_text_record (r, size, count); s = text_get_all (text); print_string (s, strlen (s)); close_text_record (text); } /* Read record type 7, subtype 7. */ static void read_mrsets (struct sfm_reader *r, size_t size, size_t count) { struct text_record *text; printf ("%08llx: multiple response sets\n", (long long int) ftello (r->file)); text = open_text_record (r, size, count); for (;;) { const char *name; enum { MRSET_MC, MRSET_MD } type; bool cat_label_from_counted_values = false; bool label_from_var_label = false; const char *counted; const char *label; const char *variables; while (text_match (text, '\n')) continue; name = text_tokenize (text, '='); if (name == NULL) break; if (text_match (text, 'C')) { type = MRSET_MC; counted = NULL; if (!text_match (text, ' ')) { sys_warn (r, "missing space following 'C' at offset %zu " "in mrsets record", text_pos (text)); break; } } else if (text_match (text, 'D')) { type = MRSET_MD; } else if (text_match (text, 'E')) { char *number; type = MRSET_MD; cat_label_from_counted_values = true; if (!text_match (text, ' ')) { sys_warn (r, "Missing space following `%c' at offset %zu " "in MRSETS record", 'E', text_pos (text)); break; } number = text_tokenize (text, ' '); if (!number) sys_warn (r, "Missing label source value " "following `E' at offset %zu in MRSETS record", text_pos (text)); else if (!strcmp (number, "11")) label_from_var_label = true; else if (strcmp (number, "1")) sys_warn (r, "Unexpected label source value `%s' " "following `E' at offset %zu in MRSETS record", number, text_pos (text)); } else { sys_warn (r, "missing `C', `D', or `E' at offset %zu " "in mrsets record", text_pos (text)); break; } if (type == MRSET_MD) { counted = text_parse_counted_string (text); if (counted == NULL) break; } label = text_parse_counted_string (text); if (label == NULL) break; variables = text_tokenize (text, '\n'); printf ("\t\"%s\": multiple %s set", name, type == MRSET_MC ? "category" : "dichotomy"); if (counted != NULL) printf (", counted value \"%s\"", counted); if (cat_label_from_counted_values) printf (", category labels from counted values"); if (label[0] != '\0') printf (", label \"%s\"", label); if (label_from_var_label) printf (", label from variable label"); if (variables != NULL) printf(", variables \"%s\"\n", variables); else printf(", no variables\n"); } close_text_record (text); } /* Read record type 7, subtype 11. */ static void read_display_parameters (struct sfm_reader *r, size_t size, size_t count) { size_t n_vars; bool includes_width; size_t i; printf ("%08llx: variable display parameters\n", (long long int) ftello (r->file)); if (size != 4) { sys_warn (r, "Bad size %zu on extension 11.", size); skip_bytes (r, size * count); return; } n_vars = r->n_variables; if (count == 3 * n_vars) includes_width = true; else if (count == 2 * n_vars) includes_width = false; else { sys_warn (r, "Extension 11 has bad count %zu (for %zu variables.", count, n_vars); skip_bytes (r, size * count); return; } for (i = 0; i < n_vars; ++i) { int measure = read_int (r); int width = includes_width ? read_int (r) : 0; int align = read_int (r); printf ("\tVar #%zu: measure=%d (%s)", i, measure, (measure == 1 ? "nominal" : measure == 2 ? "ordinal" : measure == 3 ? "scale" : "invalid")); if (includes_width) printf (", width=%d", width); printf (", align=%d (%s)\n", align, (align == 0 ? "left" : align == 1 ? "right" : align == 2 ? "centre" : "invalid")); } } /* Reads record type 7, subtype 13, which gives the long name that corresponds to each short name. */ static void read_long_var_name_map (struct sfm_reader *r, size_t size, size_t count) { struct text_record *text; char *var; char *long_name; printf ("%08llx: long variable names (short => long)\n", (long long int) ftello (r->file)); text = open_text_record (r, size, count); while (read_variable_to_value_pair (text, &var, &long_name)) printf ("\t%s => %s\n", var, long_name); close_text_record (text); } /* Reads record type 7, subtype 14, which gives the real length of each very long string. Rearranges DICT accordingly. */ static void read_long_string_map (struct sfm_reader *r, size_t size, size_t count) { struct text_record *text; char *var; char *length_s; printf ("%08llx: very long strings (variable => length)\n", (long long int) ftello (r->file)); text = open_text_record (r, size, count); while (read_variable_to_value_pair (text, &var, &length_s)) printf ("\t%s => %d\n", var, atoi (length_s)); close_text_record (text); } static bool read_attributes (struct sfm_reader *r, struct text_record *text, const char *variable) { const char *key; int index; for (;;) { key = text_tokenize (text, '('); if (key == NULL) return true; for (index = 1; ; index++) { /* Parse the value. */ const char *value = text_tokenize (text, '\n'); if (value == NULL) { sys_warn (r, "%s: Error parsing attribute value %s[%d]", variable, key, index); return false; } if (strlen (value) < 2 || value[0] != '\'' || value[strlen (value) - 1] != '\'') sys_warn (r, "%s: Attribute value %s[%d] is not quoted: %s", variable, key, index, value); else printf ("\t%s: %s[%d] = \"%.*s\"\n", variable, key, index, (int) strlen (value) - 2, value + 1); /* Was this the last value for this attribute? */ if (text_match (text, ')')) break; } if (text_match (text, '/')) return true; } } /* Read extended number of cases record. */ static void read_ncases64 (struct sfm_reader *r, size_t size, size_t count) { int64_t unknown, ncases64; if (size != 8) { sys_warn (r, "Bad size %zu for extended number of cases.", size); skip_bytes (r, size * count); return; } if (count != 2) { sys_warn (r, "Bad count %zu for extended number of cases.", size); skip_bytes (r, size * count); return; } unknown = read_int64 (r); ncases64 = read_int64 (r); printf ("%08llx: extended number of cases: " "unknown=%"PRId64", ncases64=%"PRId64"\n", (long long int) ftello (r->file), unknown, ncases64); } static void read_datafile_attributes (struct sfm_reader *r, size_t size, size_t count) { struct text_record *text; printf ("%08llx: datafile attributes\n", (long long int) ftello (r->file)); text = open_text_record (r, size, count); read_attributes (r, text, "datafile"); close_text_record (text); } static void read_character_encoding (struct sfm_reader *r, size_t size, size_t count) { long long int posn = ftello (r->file); char *encoding = xcalloc (size, count + 1); read_string (r, encoding, count + 1); printf ("%08llx: Character Encoding: %s\n", posn, encoding); free (encoding); } static void read_long_string_value_labels (struct sfm_reader *r, size_t size, size_t count) { long long int start = ftello (r->file); printf ("%08llx: long string value labels\n", start); while (ftello (r->file) - start < size * count) { long long posn = ftello (r->file); char var_name[ID_MAX_LEN + 1]; int var_name_len; int n_values; int width; int i; /* Read variable name. */ var_name_len = read_int (r); if (var_name_len > ID_MAX_LEN) sys_error (r, "Variable name length in long string value label " "record (%d) exceeds %d-byte limit.", var_name_len, ID_MAX_LEN); read_string (r, var_name, var_name_len + 1); /* Read width, number of values. */ width = read_int (r); n_values = read_int (r); printf ("\t%08llx: %s, width %d, %d values\n", posn, var_name, width, n_values); /* Read values. */ for (i = 0; i < n_values; i++) { char *value; int value_length; char *label; int label_length; posn = ftello (r->file); /* Read value. */ value_length = read_int (r); value = xmalloc (value_length + 1); read_string (r, value, value_length + 1); /* Read label. */ label_length = read_int (r); label = xmalloc (label_length + 1); read_string (r, label, label_length + 1); printf ("\t\t%08llx: \"%s\" (%d bytes) => \"%s\" (%d bytes)\n", posn, value, value_length, label, label_length); free (value); free (label); } } } static void read_long_string_missing_values (struct sfm_reader *r, size_t size, size_t count) { long long int start = ftello (r->file); printf ("%08llx: long string missing values\n", start); while (ftello (r->file) - start < size * count) { long long posn = ftello (r->file); char var_name[ID_MAX_LEN + 1]; uint8_t n_missing_values; int var_name_len; int i; /* Read variable name. */ var_name_len = read_int (r); if (var_name_len > ID_MAX_LEN) sys_error (r, "Variable name length in long string value label " "record (%d) exceeds %d-byte limit.", var_name_len, ID_MAX_LEN); read_string (r, var_name, var_name_len + 1); /* Read number of values. */ read_bytes (r, &n_missing_values, 1); printf ("\t%08llx: %s, %d missing values:", posn, var_name, n_missing_values); /* Read values. */ for (i = 0; i < n_missing_values; i++) { char *value; int value_length; posn = ftello (r->file); /* Read value. */ value_length = read_int (r); value = xmalloc (value_length + 1); read_string (r, value, value_length + 1); printf (" \"%s\"", value); free (value); } printf ("\n"); } } static void hex_dump (size_t offset, const void *buffer_, size_t buffer_size) { const uint8_t *buffer = buffer_; while (buffer_size > 0) { size_t n = MIN (buffer_size, 16); size_t i; printf ("%04zx", offset); for (i = 0; i < 16; i++) { if (i < n) printf ("%c%02x", i == 8 ? '-' : ' ', buffer[i]); else printf (" "); } printf (" |"); for (i = 0; i < 16; i++) { unsigned char c = i < n ? buffer[i] : ' '; putchar (isprint (c) ? c : '.'); } printf ("|\n"); offset += n; buffer += n; buffer_size -= n; } } /* Reads and prints any type 7 record that we don't understand. */ static void read_unknown_extension (struct sfm_reader *r, size_t size, size_t count) { unsigned char *buffer; size_t i; if (size == 0 || count > 65536 / size) skip_bytes (r, size * count); else if (size != 1) { buffer = xmalloc (size); for (i = 0; i < count; i++) { read_bytes (r, buffer, size); hex_dump (i * size, buffer, size); } free (buffer); } else { buffer = xmalloc (count); read_bytes (r, buffer, count); print_string (CHAR_CAST (char *, buffer), count); free (buffer); } } static void read_variable_attributes (struct sfm_reader *r, size_t size, size_t count) { struct text_record *text; printf ("%08llx: variable attributes\n", (long long int) ftello (r->file)); text = open_text_record (r, size, count); for (;;) { const char *variable = text_tokenize (text, ':'); if (variable == NULL || !read_attributes (r, text, variable)) break; } close_text_record (text); } static void read_simple_compressed_data (struct sfm_reader *r, int max_cases) { enum { N_OPCODES = 8 }; uint8_t opcodes[N_OPCODES]; long long int opcode_ofs; int opcode_idx; int case_num; int i; read_int (r); printf ("\n%08llx: compressed data:\n", (long long int) ftello (r->file)); opcode_idx = N_OPCODES; opcode_ofs = 0; case_num = 0; for (case_num = 0; case_num < max_cases; case_num++) { printf ("%08llx: case %d's uncompressible data begins\n", (long long int) ftello (r->file), case_num); for (i = 0; i < r->n_var_widths;) { int width = r->var_widths[i]; char raw_value[8]; int opcode; if (opcode_idx >= N_OPCODES) { opcode_ofs = ftello (r->file); if (i == 0) { if (!try_read_bytes (r, opcodes, 8)) return; } else read_bytes (r, opcodes, 8); opcode_idx = 0; } opcode = opcodes[opcode_idx]; printf ("%08llx: variable %d: opcode %d: ", opcode_ofs + opcode_idx, i, opcode); switch (opcode) { default: printf ("%.*g", DBL_DIG + 1, opcode - r->bias); if (width != 0) printf (", but this is a string variable (width=%d)", width); printf ("\n"); i++; break; case 0: printf ("ignored padding\n"); break; case 252: printf ("end of data\n"); return; case 253: read_bytes (r, raw_value, 8); printf ("uncompressible data: "); print_untyped_value (r, raw_value); printf ("\n"); i++; break; case 254: printf ("spaces"); if (width == 0) printf (", but this is a numeric variable"); printf ("\n"); i++; break; case 255: printf ("SYSMIS"); if (width != 0) printf (", but this is a string variable (width=%d)", width); printf ("\n"); i++; break; } opcode_idx++; } } } static void read_zlib_compressed_data (struct sfm_reader *r) { long long int ofs; long long int this_ofs, next_ofs, next_len; long long int bias, zero; long long int expected_uncmp_ofs, expected_cmp_ofs; unsigned int block_size, n_blocks; unsigned int i; read_int (r); ofs = ftello (r->file); printf ("\n%08llx: ZLIB compressed data header:\n", ofs); this_ofs = read_int64 (r); next_ofs = read_int64 (r); next_len = read_int64 (r); printf ("\tzheader_ofs: 0x%llx\n", this_ofs); if (this_ofs != ofs) printf ("\t\t(Expected 0x%llx.)\n", ofs); printf ("\tztrailer_ofs: 0x%llx\n", next_ofs); printf ("\tztrailer_len: %lld\n", next_len); if (next_len < 24 || next_len % 24) printf ("\t\t(Trailer length is not a positive multiple of 24.)\n"); printf ("\n%08llx: 0x%llx bytes of ZLIB compressed data\n", ofs + 8 * 3, next_ofs - (ofs + 8 * 3)); skip_bytes (r, next_ofs - (ofs + 8 * 3)); printf ("\n%08llx: ZLIB trailer fixed header:\n", next_ofs); bias = read_int64 (r); zero = read_int64 (r); block_size = read_int (r); n_blocks = read_int (r); printf ("\tbias: %lld\n", bias); printf ("\tzero: 0x%llx\n", zero); if (zero != 0) printf ("\t\t(Expected 0.)\n"); printf ("\tblock_size: 0x%x\n", block_size); if (block_size != 0x3ff000) printf ("\t\t(Expected 0x3ff000.)\n"); printf ("\tn_blocks: %u\n", n_blocks); if (n_blocks != next_len / 24 - 1) printf ("\t\t(Expected %llu.)\n", next_len / 24 - 1); expected_uncmp_ofs = ofs; expected_cmp_ofs = ofs + 24; for (i = 0; i < n_blocks; i++) { long long int blockinfo_ofs = ftello (r->file); unsigned long long int uncompressed_ofs = read_int64 (r); unsigned long long int compressed_ofs = read_int64 (r); unsigned int uncompressed_size = read_int (r); unsigned int compressed_size = read_int (r); printf ("\n%08llx: ZLIB block descriptor %d\n", blockinfo_ofs, i + 1); printf ("\tuncompressed_ofs: 0x%llx\n", uncompressed_ofs); if (uncompressed_ofs != expected_uncmp_ofs) printf ("\t\t(Expected 0x%llx.)\n", ofs); printf ("\tcompressed_ofs: 0x%llx\n", compressed_ofs); if (compressed_ofs != expected_cmp_ofs) printf ("\t\t(Expected 0x%llx.)\n", ofs + 24); printf ("\tuncompressed_size: 0x%x\n", uncompressed_size); if (i < n_blocks - 1 && uncompressed_size != block_size) printf ("\t\t(Expected 0x%x.)\n", block_size); printf ("\tcompressed_size: 0x%x\n", compressed_size); if (i == n_blocks - 1 && compressed_ofs + compressed_size != next_ofs) printf ("\t\t(This was expected to be 0x%llx.)\n", next_ofs - compressed_size); expected_uncmp_ofs += uncompressed_size; expected_cmp_ofs += compressed_size; } } /* Helpers for reading records that consist of structured text strings. */ /* State. */ struct text_record { struct sfm_reader *reader; /* Reader. */ char *buffer; /* Record contents. */ size_t size; /* Size of buffer. */ size_t pos; /* Current position in buffer. */ }; /* Reads SIZE * COUNT bytes into a text record for R, and returns the new text record. */ static struct text_record * open_text_record (struct sfm_reader *r, size_t size, size_t count) { struct text_record *text = xmalloc (sizeof *text); if (size_overflow_p (xsum (1, xtimes (size, count)))) sys_error (r, "Extension record too large."); size_t n_bytes = size * count; char *buffer = xmalloc (n_bytes + 1); read_bytes (r, buffer, n_bytes); buffer[n_bytes] = '\0'; text->reader = r; text->buffer = buffer; text->size = n_bytes; text->pos = 0; return text; } /* Closes TEXT and frees its storage. Not really needed, because the pool will free the text record anyway, but can be used to free it earlier. */ static void close_text_record (struct text_record *text) { free (text->buffer); free (text); } static char * text_tokenize (struct text_record *text, int delimiter) { size_t start = text->pos; while (text->pos < text->size && text->buffer[text->pos] != delimiter && text->buffer[text->pos] != '\0') text->pos++; if (start == text->pos) return NULL; text->buffer[text->pos++] = '\0'; return &text->buffer[start]; } static bool text_match (struct text_record *text, int c) { if (text->pos < text->size && text->buffer[text->pos] == c) { text->pos++; return true; } else return false; } /* Reads a integer value expressed in decimal, then a space, then a string that consists of exactly as many bytes as specified by the integer, then a space, from TEXT. Returns the string, null-terminated, as a subset of TEXT's buffer (so the caller should not free the string). */ static const char * text_parse_counted_string (struct text_record *text) { size_t start; size_t n; char *s; start = text->pos; n = 0; while (isdigit ((unsigned char) text->buffer[text->pos])) n = (n * 10) + (text->buffer[text->pos++] - '0'); if (start == text->pos) { sys_error (text->reader, "expecting digit at offset %zu in record", text->pos); return NULL; } if (!text_match (text, ' ')) { sys_error (text->reader, "expecting space at offset %zu in record", text->pos); return NULL; } if (text->pos + n > text->size) { sys_error (text->reader, "%zu-byte string starting at offset %zu " "exceeds record length %zu", n, text->pos, text->size); return NULL; } s = &text->buffer[text->pos]; if (s[n] != ' ') { sys_error (text->reader, "expecting space at offset %zu following " "%zu-byte string", text->pos + n, n); return NULL; } s[n] = '\0'; text->pos += n + 1; return s; } /* Reads a variable=value pair from TEXT. Looks up the variable in DICT and stores it into *VAR. Stores a null-terminated value into *VALUE. */ static bool read_variable_to_value_pair (struct text_record *text, char **key, char **value) { *key = text_tokenize (text, '='); *value = text_tokenize (text, '\t'); if (!*key || !*value) return false; while (text->pos < text->size && (text->buffer[text->pos] == '\t' || text->buffer[text->pos] == '\0')) text->pos++; return true; } /* Returns the current byte offset inside the TEXT's string. */ static size_t text_pos (const struct text_record *text) { return text->pos; } static const char * text_get_all (const struct text_record *text) { return text->buffer; } static void usage (void) { printf ("\ %s, a utility for dissecting system files.\n\ Usage: %s [OPTION]... SYSFILE...\n\ where each SYSFILE is the name of a system file.\n\ \n\ Options:\n\ --data[=MAXCASES] print (up to MAXCASES cases of) compressed data\n\ --help display this help and exit\n\ --version output version information and exit\n", program_name, program_name); } /* Displays a corruption message. */ static void sys_msg (struct sfm_reader *r, const char *format, va_list args) { printf ("\"%s\" near offset 0x%llx: ", r->file_name, (long long int) ftello (r->file)); vprintf (format, args); putchar ('\n'); } /* Displays a warning for the current file position. */ static void sys_warn (struct sfm_reader *r, const char *format, ...) { va_list args; va_start (args, format); sys_msg (r, format, args); va_end (args); } /* Displays an error for the current file position, marks it as in an error state, and aborts reading it using longjmp. */ static void sys_error (struct sfm_reader *r, const char *format, ...) { va_list args; va_start (args, format); sys_msg (r, format, args); va_end (args); exit (EXIT_FAILURE); } /* Reads BYTE_CNT bytes into BUF. Returns true if exactly BYTE_CNT bytes are successfully read. Aborts if an I/O error or a partial read occurs. If EOF_IS_OK, then an immediate end-of-file causes false to be returned; otherwise, immediate end-of-file causes an abort too. */ static inline bool read_bytes_internal (struct sfm_reader *r, bool eof_is_ok, void *buf, size_t byte_cnt) { size_t bytes_read = fread (buf, 1, byte_cnt, r->file); if (bytes_read == byte_cnt) return true; else if (ferror (r->file)) sys_error (r, "System error: %s.", strerror (errno)); else if (!eof_is_ok || bytes_read != 0) sys_error (r, "Unexpected end of file."); else return false; } /* Reads BYTE_CNT into BUF. Aborts upon I/O error or if end-of-file is encountered. */ static void read_bytes (struct sfm_reader *r, void *buf, size_t byte_cnt) { read_bytes_internal (r, false, buf, byte_cnt); } /* Reads BYTE_CNT bytes into BUF. Returns true if exactly BYTE_CNT bytes are successfully read. Returns false if an immediate end-of-file is encountered. Aborts if an I/O error or a partial read occurs. */ static bool try_read_bytes (struct sfm_reader *r, void *buf, size_t byte_cnt) { return read_bytes_internal (r, true, buf, byte_cnt); } /* Reads a 32-bit signed integer from R and returns its value in host format. */ static int read_int (struct sfm_reader *r) { uint8_t integer[4]; read_bytes (r, integer, sizeof integer); return integer_get (r->integer_format, integer, sizeof integer); } /* Reads a 64-bit signed integer from R and returns its value in host format. */ static int64_t read_int64 (struct sfm_reader *r) { uint8_t integer[8]; read_bytes (r, integer, sizeof integer); return integer_get (r->integer_format, integer, sizeof integer); } /* Reads a 64-bit floating-point number from R and returns its value in host format. */ static double read_float (struct sfm_reader *r) { uint8_t number[8]; read_bytes (r, number, sizeof number); return float_get_double (r->float_format, number); } /* Reads exactly SIZE - 1 bytes into BUFFER and stores a null byte into BUFFER[SIZE - 1]. */ static void read_string (struct sfm_reader *r, char *buffer, size_t size) { assert (size > 0); read_bytes (r, buffer, size - 1); buffer[size - 1] = '\0'; } /* Skips BYTES bytes forward in R. */ static void skip_bytes (struct sfm_reader *r, size_t bytes) { while (bytes > 0) { char buffer[1024]; size_t chunk = MIN (sizeof buffer, bytes); read_bytes (r, buffer, chunk); bytes -= chunk; } } static void trim_spaces (char *s) { char *end = strchr (s, '\0'); while (end > s && end[-1] == ' ') end--; *end = '\0'; } static void print_string (const char *s, size_t len) { if (memchr (s, 0, len) == 0) { size_t i; for (i = 0; i < len; i++) { unsigned char c = s[i]; if (c == '\\') printf ("\\\\"); else if (c == '\n' || isprint (c)) putchar (c); else printf ("\\%02x", c); } putchar ('\n'); } else hex_dump (0, s, len); } pspp-1.4.1/utilities/pspp-convert.10000644000175000017500000001363713717773141016675 0ustar00blpblp00000000000000.\" -*- nroff -*- .de IQ . br . ns . IP "\\$1" .. .TH pspp\-convert 1 "October 2013" "PSPP" "PSPP Manual" . .SH NAME pspp\-convert \- convert SPSS data files to other formats . .SH SYNOPSIS \fBpspp\-convert\fR [\fIoptions\fR] \fIinput\fR \fIoutput\fR .br \fBpspp\-convert \-\-help\fR | \fB\-h\fR .br \fBpspp\-convert \-\-version\fR | \fB\-v\fR . .SH DESCRIPTION The \fBpspp\-convert\fR program reads \fIinput\fR, which may be an SPSS system file, an SPSS/PC+ system file, an SPSS portable file, or an encrypted SPSS syntax file, and writes it to \fIoutput\fR, performing format conversion as necessary. .PP The format of \fIinput\fR is automatically detected, when possible. The character encoding of old SPSS system files cannot always be guessed correctly, and SPSS/PC+ system files do not include any indication of their encoding. Use \fB\-e \fIencoding\fR to specify the encoding in this case. .PP By default, the intended format for \fIoutput\fR is inferred from its extension: . .IP \fBcsv\fR .IQ \fBtxt\fR Comma-separated value. Each value is formatted according to its variable's print format. The first line in the file contains variable names. . .IP \fBsav\fR .IQ \fBsys\fR SPSS system file. . .IP \fBpor\fR SPSS portable file. . .IP \fBsps\fR SPSS syntax file. (Only encrypted syntax files may be converted to this format.) . .PP Use \fB\-O \fIextension\fR to override the inferred format or to specify the format for unrecognized extensions. . .PP \fBpspp\-convert\fR can convert most input formats to most output formats. Encrypted SPSS file formats are exceptions: if the input file is in an encrypted format, then the output file will be the same format (decrypted). Options for the output format are ignored in this case. . .SH "OPTIONS" .SS "General Options" . .IP "\fB\-O format\fR" .IQ "\fB\-\-output\-format=\fIformat\fR" Specifies the desired output format. \fIformat\fR must be one of the extensions listed above, e.g. \fB\-O csv\fR requests comma-separated value output. . .IP "\fB\-c \fImaxcases\fR" .IQ "\fB\-\-cases=\fImaxcases\fR" By default, all cases are copied from \fIinput\fR to \fIoutput\fR. Specifying this option to limit the number of cases written to \fIoutput\fR to \fImaxcases\fR. . .IP "\fB\-e \fIcharset\fR" .IQ "\fB\-\-encoding=\fIcharset\fR" Overrides the encoding in which character strings in \fIinput\fR are interpreted. This option is necessary because old SPSS system files do not self-identify their encoding. . .IP "\fB\-k \fIvar\fR..." .IQ "\fB\-\-keep=\fIvar\fR..." Drops all variables except those listed as \fIvar\fR, and reorders the remaining variables into the specified order. . .IP "\fB\-d \fIvar\fR..." .IQ "\fB\-\-drop=\fIvar\fR..." Drops each \fIvar\fR listed from the output. . .SS "CSV Output Options" .PP These options affect only output to \fB.csv\fR and \fB.txt\fR files. .IP "\fB\-\-labels\fR" By default, \fBpspp\-convert\fR writes variables' values to the output. With this option, \fBpspp\-convert\fR writes value labels. .IP "\fB\-\-no\-var\-names\fR" By default, \fRpspp\-convert\fR\fR writes the variable names as the first line of output. With this option, \fBpspp\-convert\fR omits this line. .IP "\fB\-\-recode\fR" By default, \fBpspp\-convert\fR writes user-missing values as their regular values. With this option, \fBpspp\-convert\fR recodes them to system-missing values (which are written as a single space). .IP "\fB\-\-print\-formats\fR" By default, \fBpspp\-convert\fR writes numeric variables as plain numbers. This option makes \fBpspp\-convert\fR honor variables' print formats. .IP "\fB\-\-decimal=\fIdecimal\fR" This option sets the character used as a decimal point in output. The default is a period (\fB.\fR). .IP "\fB\-\-delimiter=\fIdelimiter\fR" This option sets the character used to separate fields in output. The default is a comma (\fB,\fR), unless the decimal point is a comma, in which case a semicolon (\fB;\fR) is used. .IP "\fB\-\-qualifier=\fIqualifier\fR" The option sets the character used to quote fields that contain the delimiter. The default is a double quote (\fB\(dq\fR). . .SS "Password Options" When the input file is encrypted, \fBpspp\-convert\fR needs to obtain a password to decrypt it. To do so, the user may specify the password with \fB\-p\fR (or \fB\-\-password\fR), or the name of a file containing a list of possible passwords with \fB\-\-password\-list\fR, or an alphabet of possible passwords to try along with a maximum length with \fB\-a\fR (or \fB\-\-password\-alphabet\fR) and \fB\-l\fR (or \-\-password\-length\fR). If none of these options is used, \fBpspp\-convert\fR prompts for the password. The password options are: . .IP "\fB\-p \fIpassword\fR" .IQ "\fB\-\-password=\fIpassword\fR" Specifies the password to use to decrypt the input file. . .IP On multiuser systems, this option may not be safe because other users may be able to see the password in process listings. . .IP "\fB\-a \fIalphabet \fB\-l \fImax-length\fR" .IQ "\fB\-\-password-alphabet=\fIalphabet\ \fB\-\-password-length=\fImax-length\fR" These options are an alternative to \fB\-p\fR or \fB\-\-password\fR. They direct \fBpspp\-convert\fR to search for the correct password from the set of all passwords of symbols from \fIalphabet\fR (which may contain character ranges specified with \fB-\fR) and no more than \fImax-length\fR symbols long. For example, \fB\-a a-z \-l 5\fR checks all possible lowercase alphabetic passwords no more than 5 characters long. .IP When these options are used, \fB\-p\fR may additionally specify a starting point for the search. . .IP "\fB\-\-password\-list=\fIfile\fR" Specifies a file to read containing a list of passwords to try, one per line. If \fIfile\fR is \fB\-\fR, reads from stdin. . .SS "Other Options" .IP "\fB\-h\fR" .IQ "\fB\-\-help\fR" Prints a usage message on stdout and exits. . .IP "\fB\-v\fR" .IQ "\fB\-\-version\fR" Prints version information on stdout and exits. . .SH "AUTHORS" Ben Pfaff. . .SH "SEE ALSO" . .BR pspp\-output (1), .BR pspp (1), .BR psppire (1). pspp-1.4.1/utilities/pspp-output.c0000644000175000017500000006663013725004300016617 0ustar00blpblp00000000000000 /* PSPP - a program for statistical analysis. Copyright (C) 2017, 2018 Free Software Foundation, Inc. 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 3 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, see . */ #include #include #include #include #include #include "data/file-handle-def.h" #include "data/settings.h" #include "libpspp/i18n.h" #include "libpspp/message.h" #include "libpspp/string-map.h" #include "libpspp/string-set.h" #include "output/driver.h" #include "output/group-item.h" #include "output/page-setup-item.h" #include "output/pivot-table.h" #include "output/spv/light-binary-parser.h" #include "output/spv/spv-legacy-data.h" #include "output/spv/spv-output.h" #include "output/spv/spv-select.h" #include "output/spv/spv.h" #include "output/table-item.h" #include "output/text-item.h" #include "gl/c-ctype.h" #include "gl/error.h" #include "gl/progname.h" #include "gl/version-etc.h" #include "gl/xalloc.h" #include #include #include #include "gettext.h" #define _(msgid) gettext (msgid) /* -O key=value: Output driver options. */ static struct string_map output_options = STRING_MAP_INITIALIZER (output_options); /* --member-name: Include .zip member name in "dir" output. */ static bool show_member_names; /* --show-hidden, --select, --commands, ...: Selection criteria. */ static struct spv_criteria *criteria; static size_t n_criteria, allocated_criteria; /* --or: Add new element to 'criteria' array. */ static bool new_criteria; /* --sort: Sort members under dump-light-table, to make comparisons easier. */ static bool sort; /* --raw: Dump raw binary data in dump-light-table. */ static bool raw; /* -f, --force: Keep output file even on error. */ static bool force; /* Number of warnings issued. */ static size_t n_warnings; static void usage (void); static void parse_options (int argc, char **argv); static void dump_item (const struct spv_item *item) { if (show_member_names && (item->xml_member || item->bin_member)) { const char *x = item->xml_member; const char *b = item->bin_member; char *s = (x && b ? xasprintf (_("%s and %s:"), x, b) : xasprintf ("%s:", x ? x : b)); text_item_submit (text_item_create_nocopy (TEXT_ITEM_TITLE, s)); } switch (spv_item_get_type (item)) { case SPV_ITEM_HEADING: break; case SPV_ITEM_TEXT: spv_text_submit (item); break; case SPV_ITEM_TABLE: pivot_table_submit (pivot_table_ref (spv_item_get_table (item))); break; case SPV_ITEM_GRAPH: break; case SPV_ITEM_MODEL: break; case SPV_ITEM_OBJECT: break; case SPV_ITEM_TREE: break; default: abort (); } } static void print_item_directory (const struct spv_item *item) { for (int i = 1; i < spv_item_get_level (item); i++) printf (" "); enum spv_item_type type = spv_item_get_type (item); printf ("- %s", spv_item_type_to_string (type)); const char *label = spv_item_get_label (item); if (label) printf (" \"%s\"", label); if (type == SPV_ITEM_TABLE) { const struct pivot_table *table = spv_item_get_table (item); char *title = pivot_value_to_string (table->title, SETTINGS_VALUE_SHOW_DEFAULT, SETTINGS_VALUE_SHOW_DEFAULT); if (!label || strcmp (title, label)) printf (" title \"%s\"", title); free (title); } const char *command_id = spv_item_get_command_id (item); if (command_id) printf (" command \"%s\"", command_id); const char *subtype = spv_item_get_subtype (item); if (subtype && (!label || strcmp (label, subtype))) printf (" subtype \"%s\"", subtype); if (!spv_item_is_visible (item)) printf (" (hidden)"); if (show_member_names && (item->xml_member || item->bin_member)) { if (item->xml_member && item->bin_member) printf (" in %s and %s", item->xml_member, item->bin_member); else if (item->xml_member) printf (" in %s", item->xml_member); else if (item->bin_member) printf (" in %s", item->bin_member); } putchar ('\n'); } static void run_detect (int argc UNUSED, char **argv) { char *err = spv_detect (argv[1]); if (err) error (1, 0, "%s", err); } static void run_directory (int argc UNUSED, char **argv) { struct spv_reader *spv; char *err = spv_open (argv[1], &spv); if (err) error (1, 0, "%s", err); struct spv_item **items; size_t n_items; spv_select (spv, criteria, n_criteria, &items, &n_items); for (size_t i = 0; i < n_items; i++) print_item_directory (items[i]); free (items); spv_close (spv); } struct item_path { const struct spv_item **nodes; size_t n; #define N_STUB 10 const struct spv_item *stub[N_STUB]; }; static void swap_nodes (const struct spv_item **a, const struct spv_item **b) { const struct spv_item *tmp = *a; *a = *b; *b = tmp; } static void get_path (const struct spv_item *item, struct item_path *path) { size_t allocated = 10; path->nodes = path->stub; path->n = 0; while (item) { if (path->n >= allocated) { if (path->nodes == path->stub) path->nodes = xmemdup (path->stub, sizeof path->stub); path->nodes = x2nrealloc (path->nodes, &allocated, sizeof *path->nodes); } path->nodes[path->n++] = item; item = item->parent; } for (size_t i = 0; i < path->n / 2; i++) swap_nodes (&path->nodes[i], &path->nodes[path->n - i - 1]); } static void free_path (struct item_path *path) { if (path && path->nodes != path->stub) free (path->nodes); } static void dump_heading_transition (const struct spv_item *old, const struct spv_item *new) { if (old == new) return; struct item_path old_path, new_path; get_path (old, &old_path); get_path (new, &new_path); size_t common = 0; for (; common < old_path.n && common < new_path.n; common++) if (old_path.nodes[common] != new_path.nodes[common]) break; for (size_t i = common; i < old_path.n; i++) group_close_item_submit (group_close_item_create ()); for (size_t i = common; i < new_path.n; i++) group_open_item_submit (group_open_item_create ( new_path.nodes[i]->command_id)); free_path (&old_path); free_path (&new_path); } static void run_convert (int argc UNUSED, char **argv) { struct spv_reader *spv; char *err = spv_open (argv[1], &spv); if (err) error (1, 0, "%s", err); output_engine_push (); output_set_filename (argv[1]); string_map_replace (&output_options, "output-file", argv[2]); struct output_driver *driver = output_driver_create (&output_options); if (!driver) exit (EXIT_FAILURE); output_driver_register (driver); const struct page_setup *ps = spv_get_page_setup (spv); if (ps) page_setup_item_submit (page_setup_item_create (ps)); struct spv_item **items; size_t n_items; spv_select (spv, criteria, n_criteria, &items, &n_items); struct spv_item *prev_heading = spv_get_root (spv); for (size_t i = 0; i < n_items; i++) { struct spv_item *heading = items[i]->type == SPV_ITEM_HEADING ? items[i] : items[i]->parent; dump_heading_transition (prev_heading, heading); dump_item (items[i]); prev_heading = heading; } dump_heading_transition (prev_heading, spv_get_root (spv)); free (items); spv_close (spv); output_engine_pop (); fh_done (); if (n_warnings && !force) { /* XXX There could be other files to unlink, e.g. the ascii driver can produce additional files with the charts. */ unlink (argv[2]); } } static void run_dump (int argc UNUSED, char **argv) { struct spv_reader *spv; char *err = spv_open (argv[1], &spv); if (err) error (1, 0, "%s", err); struct spv_item **items; size_t n_items; spv_select (spv, criteria, n_criteria, &items, &n_items); for (size_t i = 0; i < n_items; i++) if (items[i]->type == SPV_ITEM_TABLE) { pivot_table_dump (spv_item_get_table (items[i]), 0); putchar ('\n'); } free (items); spv_close (spv); } static int compare_borders (const void *a_, const void *b_) { const struct spvlb_border *const *ap = a_; const struct spvlb_border *const *bp = b_; uint32_t a = (*ap)->border_type; uint32_t b = (*bp)->border_type; return a < b ? -1 : a > b; } static int compare_cells (const void *a_, const void *b_) { const struct spvlb_cell *const *ap = a_; const struct spvlb_cell *const *bp = b_; uint64_t a = (*ap)->index; uint64_t b = (*bp)->index; return a < b ? -1 : a > b; } static void run_dump_light_table (int argc UNUSED, char **argv) { if (raw && isatty (STDOUT_FILENO)) error (1, 0, "not writing binary data to tty"); struct spv_reader *spv; char *err = spv_open (argv[1], &spv); if (err) error (1, 0, "%s", err); struct spv_item **items; size_t n_items; spv_select (spv, criteria, n_criteria, &items, &n_items); for (size_t i = 0; i < n_items; i++) { if (!spv_item_is_light_table (items[i])) continue; char *error; if (raw) { void *data; size_t size; error = spv_item_get_raw_light_table (items[i], &data, &size); if (!error) { fwrite (data, size, 1, stdout); free (data); } } else { struct spvlb_table *table; error = spv_item_get_light_table (items[i], &table); if (!error) { if (sort) { qsort (table->borders->borders, table->borders->n_borders, sizeof *table->borders->borders, compare_borders); qsort (table->cells->cells, table->cells->n_cells, sizeof *table->cells->cells, compare_cells); } spvlb_print_table (items[i]->bin_member, 0, table); spvlb_free_table (table); } } if (error) { msg (ME, "%s", error); free (error); } } free (items); spv_close (spv); } static void run_dump_legacy_data (int argc UNUSED, char **argv) { struct spv_reader *spv; char *err = spv_open (argv[1], &spv); if (err) error (1, 0, "%s", err); struct spv_item **items; size_t n_items; spv_select (spv, criteria, n_criteria, &items, &n_items); for (size_t i = 0; i < n_items; i++) if (spv_item_is_legacy_table (items[i])) { struct spv_data data; char *error; if (raw) { void *data; size_t size; error = spv_item_get_raw_legacy_data (items[i], &data, &size); if (!error) { fwrite (data, size, 1, stdout); free (data); } } else { error = spv_item_get_legacy_data (items[i], &data); if (!error) { printf ("%s:\n", items[i]->bin_member); spv_data_dump (&data, stdout); spv_data_uninit (&data); printf ("\n"); } } if (error) { msg (ME, "%s", error); free (error); } } free (items); spv_close (spv); } /* This is really bogus. XPath doesn't have any notion of a default XML namespace, but all of the elements in the documents we're interested in have a namespace. Thus, we'd need to require the XPath expressions to have a namespace on every single element: vis:sourceVariable, vis:graph, and so on. That's a pain. So, instead, we remove the default namespace from everyplace it occurs. XPath does support the null namespace, so this allows sourceVariable, graph, etc. to work. See http://plasmasturm.org/log/259/ and https://mail.gnome.org/archives/xml/2003-April/msg00144.html for more information.*/ static void remove_default_xml_namespace (xmlNode *node) { if (node->ns && !node->ns->prefix) node->ns = NULL; for (xmlNode *child = node->children; child; child = child->next) remove_default_xml_namespace (child); } static void register_ns (xmlXPathContext *ctx, const char *prefix, const char *uri) { xmlXPathRegisterNs (ctx, CHAR_CAST (xmlChar *, prefix), CHAR_CAST (xmlChar *, uri)); } static xmlXPathContext * create_xpath_context (xmlDoc *doc) { xmlXPathContext *ctx = xmlXPathNewContext (doc); register_ns (ctx, "vgr", "http://xml.spss.com/spss/viewer/viewer-graph"); register_ns (ctx, "vizml", "http://xml.spss.com/visualization"); register_ns (ctx, "vmd", "http://xml.spss.com/spss/viewer/viewer-model"); register_ns (ctx, "vps", "http://xml.spss.com/spss/viewer/viewer-pagesetup"); register_ns (ctx, "vst", "http://xml.spss.com/spss/viewer/viewer-style"); register_ns (ctx, "vtb", "http://xml.spss.com/spss/viewer/viewer-table"); register_ns (ctx, "vtl", "http://xml.spss.com/spss/viewer/table-looks"); register_ns (ctx, "vtt", "http://xml.spss.com/spss/viewer/viewer-treemodel"); register_ns (ctx, "vtx", "http://xml.spss.com/spss/viewer/viewer-text"); register_ns (ctx, "xsi", "http://www.w3.org/2001/XMLSchema-instance"); return ctx; } static void dump_xml (int argc, char **argv, const char *member_name, char *error_s, xmlDoc *doc) { if (!error_s) { if (argc == 2) { printf ("\n", member_name); xmlElemDump (stdout, NULL, xmlDocGetRootElement (doc)); putchar ('\n'); } else { bool any_results = false; remove_default_xml_namespace (xmlDocGetRootElement (doc)); for (int i = 2; i < argc; i++) { xmlXPathContext *xpath_ctx = create_xpath_context (doc); xmlXPathSetContextNode (xmlDocGetRootElement (doc), xpath_ctx); xmlXPathObject *xpath_obj = xmlXPathEvalExpression( CHAR_CAST (xmlChar *, argv[i]), xpath_ctx); if (!xpath_obj) error (1, 0, _("%s: invalid XPath expression"), argv[i]); const xmlNodeSet *nodes = xpath_obj->nodesetval; if (nodes && nodes->nodeNr > 0) { if (!any_results) { printf ("\n", member_name); any_results = true; } for (size_t j = 0; j < nodes->nodeNr; j++) { xmlElemDump (stdout, doc, nodes->nodeTab[j]); putchar ('\n'); } } xmlXPathFreeObject (xpath_obj); xmlXPathFreeContext (xpath_ctx); } if (any_results) putchar ('\n');; } xmlFreeDoc (doc); } else { printf ("\n", member_name); msg (ME, "%s", error_s); free (error_s); } } static void run_dump_legacy_table (int argc, char **argv) { struct spv_reader *spv; char *err = spv_open (argv[1], &spv); if (err) error (1, 0, "%s", err); struct spv_item **items; size_t n_items; spv_select (spv, criteria, n_criteria, &items, &n_items); for (size_t i = 0; i < n_items; i++) if (spv_item_is_legacy_table (items[i])) { xmlDoc *doc; char *error_s = spv_item_get_legacy_table (items[i], &doc); dump_xml (argc, argv, items[i]->xml_member, error_s, doc); } free (items); spv_close (spv); } static void run_dump_structure (int argc, char **argv) { struct spv_reader *spv; char *err = spv_open (argv[1], &spv); if (err) error (1, 0, "%s", err); struct spv_item **items; size_t n_items; spv_select (spv, criteria, n_criteria, &items, &n_items); const char *last_structure_member = NULL; for (size_t i = 0; i < n_items; i++) if (!last_structure_member || strcmp (items[i]->structure_member, last_structure_member)) { last_structure_member = items[i]->structure_member; xmlDoc *doc; char *error_s = spv_item_get_structure (items[i], &doc); dump_xml (argc, argv, items[i]->structure_member, error_s, doc); } free (items); spv_close (spv); } static void run_is_legacy (int argc UNUSED, char **argv) { struct spv_reader *spv; char *err = spv_open (argv[1], &spv); if (err) error (1, 0, "%s", err); bool is_legacy = false; struct spv_item **items; size_t n_items; spv_select (spv, criteria, n_criteria, &items, &n_items); for (size_t i = 0; i < n_items; i++) if (spv_item_is_legacy_table (items[i])) { is_legacy = true; break; } free (items); spv_close (spv); exit (is_legacy ? EXIT_SUCCESS : EXIT_FAILURE); } struct command { const char *name; int min_args, max_args; void (*run) (int argc, char **argv); }; static const struct command commands[] = { { "detect", 1, 1, run_detect }, { "dir", 1, 1, run_directory }, { "convert", 2, 2, run_convert }, /* Undocumented commands. */ { "dump", 1, 1, run_dump }, { "dump-light-table", 1, 1, run_dump_light_table }, { "dump-legacy-data", 1, 1, run_dump_legacy_data }, { "dump-legacy-table", 1, INT_MAX, run_dump_legacy_table }, { "dump-structure", 1, INT_MAX, run_dump_structure }, { "is-legacy", 1, 1, run_is_legacy }, }; static const int n_commands = sizeof commands / sizeof *commands; static const struct command * find_command (const char *name) { for (size_t i = 0; i < n_commands; i++) { const struct command *c = &commands[i]; if (!strcmp (name, c->name)) return c; } return NULL; } static void emit_msg (const struct msg *m, void *aux UNUSED) { if (m->severity == MSG_S_ERROR || m->severity == MSG_S_WARNING) n_warnings++; char *s = msg_to_string (m); fprintf (stderr, "%s\n", s); free (s); } int main (int argc, char **argv) { set_program_name (argv[0]); msg_set_handler (emit_msg, NULL); settings_init (); i18n_init (); parse_options (argc, argv); argc -= optind; argv += optind; if (argc < 1) error (1, 0, _("missing command name (use --help for help)")); const struct command *c = find_command (argv[0]); if (!c) error (1, 0, _("unknown command \"%s\" (use --help for help)"), argv[0]); int n_args = argc - 1; if (n_args < c->min_args || n_args > c->max_args) { if (c->min_args == c->max_args) { error (1, 0, ngettext ("\"%s\" command takes exactly %d argument", "\"%s\" command takes exactly %d arguments", c->min_args), c->name, c->min_args); } else if (c->max_args == INT_MAX) { error (1, 0, ngettext ("\"%s\" command requires at least %d argument", "\"%s\" command requires at least %d arguments", c->min_args), c->name, c->min_args); } else { error (1, 0, _("\"%s\" command requires between %d and %d arguments"), c->name, c->min_args, c->max_args); } } c->run (argc, argv); i18n_done (); return n_warnings ? EXIT_FAILURE : EXIT_SUCCESS; } static struct spv_criteria * get_criteria (void) { if (!n_criteria || new_criteria) { new_criteria = false; if (n_criteria >= allocated_criteria) criteria = x2nrealloc (criteria, &allocated_criteria, sizeof *criteria); criteria[n_criteria++] = (struct spv_criteria) SPV_CRITERIA_INITIALIZER; } return &criteria[n_criteria - 1]; } static void parse_select (char *arg) { bool invert = arg[0] == '^'; arg += invert; unsigned classes = 0; for (char *token = strtok (arg, ","); token; token = strtok (NULL, ",")) { if (!strcmp (arg, "all")) classes = SPV_ALL_CLASSES; else if (!strcmp (arg, "help")) { puts (_("The following object classes are supported:")); for (int class = 0; class < SPV_N_CLASSES; class++) printf ("- %s\n", spv_item_class_to_string (class)); exit (0); } else { int class = spv_item_class_from_string (token); if (class == SPV_N_CLASSES) error (1, 0, _("%s: unknown object class (use --select=help " "for help"), arg); classes |= 1u << class; } } struct spv_criteria *c = get_criteria (); c->classes = invert ? classes ^ SPV_ALL_CLASSES : classes; } static struct spv_criteria_match * get_criteria_match (const char **arg) { struct spv_criteria *c = get_criteria (); if ((*arg)[0] == '^') { (*arg)++; return &c->exclude; } else return &c->include; } static void parse_commands (const char *arg) { struct spv_criteria_match *cm = get_criteria_match (&arg); string_array_parse (&cm->commands, ss_cstr (arg), ss_cstr (",")); } static void parse_subtypes (const char *arg) { struct spv_criteria_match *cm = get_criteria_match (&arg); string_array_parse (&cm->subtypes, ss_cstr (arg), ss_cstr (",")); } static void parse_labels (const char *arg) { struct spv_criteria_match *cm = get_criteria_match (&arg); string_array_parse (&cm->labels, ss_cstr (arg), ss_cstr (",")); } static void parse_instances (char *arg) { struct spv_criteria *c = get_criteria (); size_t allocated_instances = c->n_instances; for (char *token = strtok (arg, ","); token; token = strtok (NULL, ",")) { if (c->n_instances >= allocated_instances) c->instances = x2nrealloc (c->instances, &allocated_instances, sizeof *c->instances); c->instances[c->n_instances++] = (!strcmp (token, "last") ? -1 : atoi (token)); } } static void parse_members (const char *arg) { struct spv_criteria *cm = get_criteria (); string_array_parse (&cm->members, ss_cstr (arg), ss_cstr (",")); } static void parse_options (int argc, char *argv[]) { for (;;) { enum { OPT_MEMBER_NAMES = UCHAR_MAX + 1, OPT_SHOW_HIDDEN, OPT_SELECT, OPT_COMMANDS, OPT_SUBTYPES, OPT_LABELS, OPT_INSTANCES, OPT_MEMBERS, OPT_ERRORS, OPT_OR, OPT_SORT, OPT_RAW, }; static const struct option long_options[] = { /* Input selection options. */ { "show-hidden", no_argument, NULL, OPT_SHOW_HIDDEN }, { "select", required_argument, NULL, OPT_SELECT }, { "commands", required_argument, NULL, OPT_COMMANDS }, { "subtypes", required_argument, NULL, OPT_SUBTYPES }, { "labels", required_argument, NULL, OPT_LABELS }, { "instances", required_argument, NULL, OPT_INSTANCES }, { "members", required_argument, NULL, OPT_MEMBERS }, { "errors", no_argument, NULL, OPT_ERRORS }, { "or", no_argument, NULL, OPT_OR }, /* "dir" command options. */ { "member-names", no_argument, NULL, OPT_MEMBER_NAMES }, /* "convert" command options. */ { "force", no_argument, NULL, 'f' }, /* "dump-light-table" command options. */ { "sort", no_argument, NULL, OPT_SORT }, { "raw", no_argument, NULL, OPT_RAW }, { "help", no_argument, NULL, 'h' }, { "version", no_argument, NULL, 'v' }, { NULL, 0, NULL, 0 }, }; int c; c = getopt_long (argc, argv, "O:hvf", long_options, NULL); if (c == -1) break; switch (c) { case 'O': output_driver_parse_option (optarg, &output_options); break; case OPT_MEMBER_NAMES: show_member_names = true; break; case OPT_SHOW_HIDDEN: get_criteria ()->include_hidden = true; break; case OPT_SELECT: parse_select (optarg); break; case OPT_COMMANDS: parse_commands (optarg); break; case OPT_SUBTYPES: parse_subtypes (optarg); break; case OPT_LABELS: parse_labels (optarg); break; case OPT_INSTANCES: parse_instances (optarg); break; case OPT_MEMBERS: parse_members (optarg); break; case OPT_ERRORS: get_criteria ()->error = true; break; case OPT_OR: new_criteria = true; break; case OPT_SORT: sort = true; break; case OPT_RAW: raw = true; break; case 'f': force = true; break; case 'v': version_etc (stdout, "pspp-output", PACKAGE_NAME, PACKAGE_VERSION, "Ben Pfaff", "John Darrington", NULL_SENTINEL); exit (EXIT_SUCCESS); case 'h': usage (); exit (EXIT_SUCCESS); default: exit (EXIT_FAILURE); } } } static void usage (void) { struct string s = DS_EMPTY_INITIALIZER; struct string_set formats = STRING_SET_INITIALIZER(formats); output_get_supported_formats (&formats); const char *format; const struct string_set_node *node; STRING_SET_FOR_EACH (format, node, &formats) { if (!ds_is_empty (&s)) ds_put_byte (&s, ' '); ds_put_cstr (&s, format); } string_set_destroy (&formats); printf ("\ %s, a utility for working with SPSS viewer (.spv) files.\n\ Usage: %s [OPTION]... COMMAND ARG...\n\ \n\ The following commands are available:\n\ detect FILE Detect whether FILE is an SPV file.\n\ dir FILE List tables and other items in FILE.\n\ convert SOURCE DEST Convert .spv SOURCE to DEST.\n\ \n\ Input selection options for \"dir\" and \"convert\":\n\ --select=CLASS... include only some kinds of objects\n\ --select=help print known object classes\n\ --commands=COMMAND... include only specified COMMANDs\n\ --subtypes=SUBTYPE... include only specified SUBTYPEs of output\n\ --labels=LABEL... include only output objects with the given LABELs\n\ --instances=INSTANCE... include only the given object INSTANCEs\n\ --show-hidden include hidden output objects\n\ --or separate two sets of selection options\n\ \n\ \"convert\" by default infers the destination's format from its extension.\n\ The known extensions are: %s\n\ The following options override \"convert\" behavior:\n\ -O format=FORMAT set destination format to FORMAT\n\ -O OPTION=VALUE set output option\n\ -f, --force keep output file even given errors\n\ Other options:\n\ --help display this help and exit\n\ --version output version information and exit\n", program_name, program_name, ds_cstr (&s)); ds_destroy (&s); } pspp-1.4.1/utilities/pspp-output.10000644000175000017500000001546413602145300016534 0ustar00blpblp00000000000000.\" -*- nroff -*- .de IQ . br . ns . IP "\\$1" .. .TH pspp\-output 1 "December 2019" "PSPP" "PSPP Manual" . .SH NAME pspp\-output \- convert and operate on SPSS viewer (SPV) files . .SH SYNOPSIS \fBpspp\-output detect \fIfile\fR .br \fBpspp\-output \fR[\fIoptions\fR] \fBdir\fR \fIfile\fR .br \fBpspp\-output \fR[\fIoptions\fR] \fBconvert\fR \fIsource destination\fR .br \fBpspp\-output \-\-help\fR | \fB\-h\fR .br \fBpspp\-output \-\-version\fR | \fB\-v\fR . .SH DESCRIPTION .PP \fBpspp\-output\fR is a command-line utility accompanying PSPP. It supports multiple operations on SPSS viewer or \fB.spv\fR files, here called SPV files. SPSS 16 and later writes SPV files to represent the contents of its output editor. .PP SPSS 15 and earlier versions instead use \fB.spo\fR files. \fBpspp\-output\fR does not support this format. .PP \fBpspp\-output\fR has a number of subcommands, documented separately below. \fBpspp\-output\fR also has several undocumented command forms that developers may find useful for debugging. . .SS The \fBdetect\fR command When invoked as \fBpspp\-output detect \fIfile\fR, \fBpspp\-output\fR reads enough of \fIfile\fR to determine whether it is an SPV file. If so, it exits successfully without outputting anything. When \fIfile\fR is not an SPV file or if some other error occurs, \fBpspp\-output\fR prints an error message and exits with a failure indication. . .SS The \fBdir\fR command When invoked as \fBpspp\-output dir \fIfile\fR, \fBpspp\-output\fR prints on stdout a table of contents for SPV file \fIfile\fR. By default, this table lists every object in the file, except for hidden objects. See the \fBInput Selection Options\fR section below for information on the options available to select a subset of objects. .PP The following additional option for \fBdir\fR is intended mainly for use by PSPP developers: . .IP "\fB\-\-member\-names\fR" Also show the names of the Zip members associated with each object. . .SS The \fBconvert\fR command When invoked as \fBpspp\-output convert \fIsource destination\fR, \fBpspp\-output\fR reads the SPV file \fIsource\fR and converts it to another format, writing the output to \fIdestination\fR. .PP By default, \fBpspp\-output\fR infers the intended format for \fIdestination\fR from its extension. The known extensions are generally: \fBcsv html list odt pdf ps spv svg txt\fR. Use \fB\-\-help\fR to see an accurate list, since a given installation might be built without support for some formats. .PP See the \fBInput Selection Options\fR section below for information on the options available to select a subset of objects to include in the output. The following additional options are accepted: .IP "\fB-O format=\fIformat\fR" Overrides the format inferred from the output file's extension. \fIformat\fR must be one of the extensions listed above. .IP "\fB-O \fIoption\fB=\fIvalue\fR" Sets an option for the output file format. Refer to the PSPP manual for details of the available output options. .IP \fB\-F\fR .IQ \fB\-\-force\fR By default, if the source is corrupt or otherwise cannot be processed, the destination is not written. These option make \fBpspp\-output\fR write the output as best it can, even with errors. .SS "Input Selection Options" The \fBdir\fR and \fBconvert\fR commands, by default, operate on all of the objects in the source SPV file, except for objects that are not visible in the output viewer window. The user may specify these options to select a subset of the input objects. When multiple options are used, only objects that satisfy all of them are selected: .IP "\fB\-\-select=\fR[\fB^\fR]\fIclass\fR..." Include only objects of the given \fIclass\fR; with leading \fB^\fR, include only objects not in the class. Use commas to separate multiple classes. The supported classes are: .RS .IP \fBcharts headings logs models tables texts trees warnings outlineheaders pagetitle notes unknown other\fR .RE .IP Use \fB\-\-select=help\fR to print this list of classes. .IP "\-\-commands=\fR[\fB^\fR]\fIcommand\fR..." .IQ "\-\-subtypes=\fR[\fB^\fR]\fIsubtype\fR..." .IQ "\-\-labels=\fR[\fB^\fR]\fIlabel\fR..." Include only objects with the specified \fIcommand\fR, \fIsubtype\fR, or \fIlabel\fR. With a leading \fB^\fR, include only the objects that do not match. Multiple values may be specified separated by commas. An asterisk at the end of a value acts as a wildcard. .IP The \fB\-\-command\fR option matches command identifiers, case insensitively. All of the objects produced by a single command use the same, unique command identifier. Command identifiers are always in English regardless of the language used for output. They often differ from the command name in PSPP syntax. Use the \fBpspp\-output\fR program's \fBdir\fR command to print command identifiers in particular output. .IP The \fB\-\-subtypes\fR option matches particular tables within a command, case insensitively. Subtypes are not necessarily unique: two commands that produce similar output tables may use the same subtype. Subtypes are always in English and \fBdir\fR will print them. .IP The \fB\-\-labels\fR option matches the labels in table output (that is, the table titles). Labels are affected by the output language, variable names and labels, split file settings, and other factors. .IP "\fB\-\-instances=\fIinstance\fR..." Include the specified \fIinstance\fR of an object that matches the other criteria within a single command. The \fIinstance\fR may be a number (1 for the first instance, 2 for the second, and so on) or \fBlast\fR for the last instance. .IP "\fB\-\-show\-hidden" Include hidden output objects in the output. By default, they are excluded. .IP "\fB\-\-or\fR" Separates two sets of selection options. Objects selected by either set of options are included in the output. .PP The following additional input selection options are intended mainly for use by PSPP developers: .IP "\fB\-\-errors\fR" Include only objects that cause an error when read. With the \fBconvert\fR command, this is most useful in conjunction with the \fB\-\-force\fR option. .IP "\fB\-\-members=\fImember\fR..." Include only the objects that include a listed Zip file \fImember\fR. More than one name may be included, comma-separated. The members in an SPV file may be listed with the \fBdir\fR command by adding the \fB\-\-show\-members\fR option or with the \fBzipinfo\fR program included with many operating systems. Error messages that \fBpspp\-output\fR prints when it reads SPV files also often include member names. .IP "\fB\-\-member\-names\fR" Displays the name of the Zip member or members associated with each object just above the object itself. .SH "OPTIONS" .IP "\fB\-h\fR" .IQ "\fB\-\-help\fR" Prints a usage message on stdout and exits. . .IP "\fB\-v\fR" .IQ "\fB\-\-version\fR" Prints version information on stdout and exits. . .SH "AUTHORS" Ben Pfaff. . .SH "SEE ALSO" . .BR pspp\-convert (1), .BR pspp (1), .BR psppire (1). pspp-1.4.1/utilities/pspp-dump-sav.10000644000175000017500000000300413320146056016721 0ustar00blpblp00000000000000.\" -*- nroff -*- .de IQ . br . ns . IP "\\$1" .. .TH pspp\-dump\-sav 1 "January 2012" "PSPP" "PSPP Manual" . .SH NAME pspp\-dump\-sav \- dissect SPSS system file . .SH SYNOPSIS \fBpspp\-dump\-sav\fR [\fB\-d \fR| \fB\-\-data\fR[\fB=\fImaxcases\fR]] \fIfile\fR... .br \fBpspp\-dump\-sav \-\-help\fR | \fB\-h\fR .br \fBpspp\-dump\-sav \-\-version\fR | \fB\-v\fR . .SH DESCRIPTION The \fBpspp\-dump\-sav\fR program reads each SPSS system file \fIfile\fR and prints its contents. The output format is useful for debugging system file readers and writers and for discovering how to interpret unknown or poorly understood records. End users may find the output useful for providing the PSPP developers information about system files that PSPP does not accurately read. . .SH "OPTIONS" . .IP "\fB\-d\fR[\fImaxcases\fR]" .IQ "\fB\-\-data\fR[\fB=\fImaxcases\fR]" By default, \fBpspp\-dump\-sav\fR does not print any of the data in a system file, only the file headers. Specify this option to print the data as well. If \fImaxcases\fR is specified, then it limits the number of cases printed. . .IP "\fB\-h\fR" .IQ "\fB\-\-help\fR" Prints a usage message on stdout and exits. . .IP "\fB\-v\fR" .IQ "\fB\-\-version\fR" Prints version information on stdout and exits. . .SH "BUGS" Some errors that prevent files from being interpreted successfully cause \fBpspp\-dump\-sav\fR to exit without reading any additional files given on the command line. . .SH "AUTHORS" Ben Pfaff and John Darrington. . .SH "SEE ALSO" . .BR pspp (1), .BR psppire (1). pspp-1.4.1/ONEWS0000644000175000017500000002626113571051220012734 0ustar00blpblp00000000000000PSPP NEWS -- history of user-visible changes. Time-stamp: <2005-11-05 18:34:17 blp> Copyright (C) 1996, 1997, 1998 Free Software Foundation, Inc. See the end for copying conditions. Please send PSPP bug reports to bug-gnu-pspp@gnu.org. * Changes for patchlevel 37: ** Bugfixes. * Changes for patchlevel 36: ** Documentation fixes. * Changes for patchlevel 35: ** DO REPEAT works. ** Removed PC+ emulation; merged X and Wnd emulations. ** Many smaller bugfixes. * Changes for patchlevel 34: ** More DO REPEAT work. Does not compile. * Changes for patchlevel 33: ** Excised politically incorrect words. * Changes for patchlevel 32: ** Worked on fixing DO REPEAT problems. * Changes for patchlevel 31: ** Fixed packaging problems. * Changes for patchlevel 30: ** Looks for include files and data file relative to the syntax file directory, not the current working directory. * Changes for patchlevel 29: ** Add capability for PSPP syntax files to invoked as programs with `#!' notation. * Changes for patchlevels 20, 21, 22, 23, 24, 25, 26, 27, 28: ** Bugfixes. * Changes for version 0.1.0: ** Debian package support. * Changes for patchlevel 19: ** Bugfixes. ** Began PSPP FAQ list. * Changes for patchlevel 18: ** Scratch variables are fully implemented. They are deleted after every procedure. ** The virtual file manager has been completely rewritten. Although all known bugs have been fixed, the new object-oriented structure to vfm is so different that there are likely some that are as-yet-undiscovered. * Changes for patchlevel 14, 15, 16, 17: ** Bugfixes. * Changes for patchlevels 12, 13: ** Internationalization! * Changes for patchlevels 7, 8, 9, 10, 11: ** Bugfixes. * Changes for patchlevel 6: ** Removed the need for a `ps-fontmap' in the PostScript driver. This changes the options for the PostScript driver slightly. * Changes for new patchlevels 1, 2, 3, 4, 5: ** Bugfixes. * Changes for interim releases x1, x2, x3: ** Package changed from `flat' to `deep' format. * Changes for patchlevel 193: ** No user-visible changes. * Changes for patchlevel 192: ** Bugfixes. * Changes for patchlevel 191: ** Reimplemented FREQUENCIES method of calculation--it should now be * acceptable to numerical analysts. * Changes for patchlevel 190: ** Implemented PROCESS IF to be compatible with PC+. ** Reimplemented DESCRIPTIVES method of calculation--it should now be acceptable to numerical analysts. ** DESCRIPTIVES is now correct and complete--please report any bugs immediately. ** Implemented SYSFILE INFO, although it is limited in the way it displays value labels. ** SAVE now records the number of cases in the system file. * Changes for patchlevels 189, 188, 187: ** Bugfixes. * Changes for patchlevel 186: ** Bazillions of bugfixes, and more to come. This version ought to be much more usable than any previous. ** Added RENAME VARIABLES command and tested it. * Changes for patchlevel 185: ** Added MODIFY VARS command; poorly tested. ** Bugfixes. * Changes for patchlevel 184: ** Debianized and fixed a few packaging problems. ** First ALPHA release. ** Miscellaneous bugfixes. * Changes for patchlevel 182: * Added FILE LABEL, DOCUMENT, and DROP DOCUMENTS commands; not tested. * Changes for patchlevel 181: * Added FILTER command. * Changes for patchlevel 180: * SORT CASES bugfixes. * Changes for patchlevel 179: * SORT CASES implemented. * Changes for patchlevels 178, 177, 176, 175: * No user-visible changes; might not even compile. * Changes for patchlevel 174: ** AUTORECODE has been newly implemented. * Changes for patchlevel 173: ** Bugfixes. * Changes for patchlevel 172: ** SET has been reintroduced. It is somewhat incomplete. ** Bugfixes. * Changes for patchlevel 171: ** Several bugfixes. ** Minor language improvements. * Changes for patchlevel 170: ** Input/output formats DOT, PCT, EDATE, SDATE are now supported but not tested. * Changes for patchlevel 169: ** Several bugfixes. ** Implemented custom currency formats (CCA ... CCE); not tested. * Changes for patchlevel 168: ** No user-visible changes. * Changes for patchlevel 167: ** Compression is now available on SAVE and XSAVE. * Changes for patchlevel 166: ** SAVE and XSAVE are implemented. Compression is not yet available. * Changes for patchlevel 165: ** GET is now fully implemented for both compressed and uncompressed system files. * Changes for patchlevel 164: ** GET now works on system files (uncompressed only). * Changes for patchlevels 163, 162, 161, 160, 159, 158: ** No user-visible changes. ** Supports keywords LOWEST and HIGHEST on MISSING VALUES. * Changes for patchlevel 157: ** Fixed longtime bug with cross-compilation. * Changes for patchlevel 156: ** Fixed the (known) bugs introduced in patchlevel 155. ** Fixed a longtime bug in RECODE that might have affected other transformations as well. * Changes for patchlevel 155: ** A few bugs fixed, probably several introduced. * Changes for patchlevel 154: ** FILE HANDLE now supports most of the SPSS/Wnd compatible features. * Changes for patchlevel 153: ** PRINT now supports OUTFILE. ** WRITE is now distinct from PRINT. ** RECODE, SAMPLE, SELECT IF are re-enabled. * Changes for patchlevel 152: ** Bugfixes for times & dates. ** Misc. bugfixes. ** System variables supported on expressions. * Changes for patchlevel 151: ** Newly implemented input/output formats: Time/date output formats. Preliminary testing has been done on times & dates. * Changes for patchlevel 150: ** Newly implemented input/output formats Zoned decimal input/output format. Time/date input formats, but not output formats. All of these are untested. * Changes for patchlevel 149: ** Bugfixes. * Changes for patchlevel 148: ** Many bugfixes. ** Re-enabled the following transformations: LEAVE, NUMERIC, PRINT, PRINT EJECT, PRINT FORMATS, PRINT SPACE, STRING, TITLE, WRITE. * Changes for patchlevel 147: ** Crushed partial tables are much better. * Changes for patchlevel 146: ** Bugfixes. ** Crushed tables are working better! ** Still pretty broken. * Changes for patchlevel 145: ** Bugfixes. ** Broken stuff. * Changes for patchlevels 144, 143: ** Bugfixes. * Changes for patchlevel 142: ** LIST procedure is back, but not well-implemented. * Changes for patchlevel 141: ** No user-visible changes. * Changes for patchlevels 140, 139, 138: ** Worked on manual. ** Minor bugfixes. * Changes for patchlevel 136: ** Began revisions to manual. ** Changed default path for configuration files. * Changes for patchlevel 135: ** PostScript driver bugfixes. ** Many memory leaks eliminated. ** Miscellaneous Bugfixes. * Changes for patchlevel 134: ** SPLIT FILE works again. ** Documentation changes in README. ** New documentation in LANGUAGE, BUGS. * Changes for patchlevel 133: ** PostScript driver supports encodings. It also works now, as opposed to the brokenness of the last patchlevel. * Changes for patchlevel 132: ** PostScript driver supports font changes! Not well tested. * Changes for patchlevel 131: ** Does not compile. * Changes for patchlevel 130: ** Generated PostScript code is smaller in size. This is because, as long as the PostScript option `optimize-line-size' is at least 1, individual contiguous short lines are consolidated into longer monster lines. * Changes for patchlevel 129: ** PostScript output much improved. Mirror no longer necessary. * Changes for patchlevel 128: ** Try out the PostScript driver, if you've got a mirror handy. * Changes for patchlevel 126: ** Does not compile. * Changes for patchlevel 125: ** No user-visible changes. * Changes for patchlevel 124: ** PostScript driver. Don't use it yet. ** Bugfixes. * Changes for patchlevel 123: ** No user-visible changes. * Changes for patchlevel 122: ** FREQUENCIES procedure is more complete. It can now print out sorted frequency tables as well as all statistics except median. No percentiles. Full syntax. No integer mode. * Changes for patchlevel 121: ** Compiles again! ** FREQUENCIES procedure works but it is incomplete. * Changes for patchlevels 120, 119: ** Does not compile. * Changes for patchlevel 118: ** Does not compile. ** Bugfix regarding titles on LIST procedure. * Changes for patchlevel 117: ** LIST procedure implemented. ** Bugfix regarding unsupported REMARK utility. * Changes for patchlevel 116: ** Does not compile. * Changes for patchlevel 115: ** New output driver initialization interface. *** Changed option syntax. `-o driver' is the new syntax. The default driver is named `default'. *** The initialization file `output' has been renamed `devices'. *** Driver names actually specify categories. Each driver name specified can actually result in 0, 1, 2, or any greater number of actual drivers being used, depending solely on the contents of the `devices' output initialization file. *** The driver initialization file is read in a `termcap'-like manner. That is, it determines whether to use a driver based on the parameters passed to it, rather than mainly on the contents of the `devices' file plus some goofy hacks with command-line options. *** Macros defined in the `devices' file can be overridden. Do it by specifying a definition on the command line of form `KEY=VALUE'. See `devices' for details. ** Short form of option `--verbose' changed to `-V'. ** New option `-v' or `--verbose'. `-v' causes PSPP to display more info about what it's doing. Multiple `-v's display even more. ** Support for small 25-line screens. The ASCII driver minimum for page length is now 15 lines instead of 29. * Changes for patchlevel 114: ** Rich text now supported in the ascii driver. The style changes are done with overstriking or with defined sequences. ** New ascii output driver option `carriage-return-style'. This can be set to `cr' or to `bs', depending on whether returning to the left margin should be done with an ASCII CR or with multiple backspaces. * Changes for patchlevel 113: ** Table titles are more complete. Now they include a description of the table contents. * Changes for patchlevel 112: ** Tables now are preceded by a descriptive `title'. This line shows what procedure emitted it, etc. ** Some tables are now divided into multiple columns. These columns are displayed across the page in order to save vertical space. * Changes for patchlevel 111: ** Bugfixes. * Changes for patchlevel 110: ** `stat' has now been renamed `Fiasco', for `Fiasco Implements Accurate Statistical COmputations'! Let's all celebrate the clever acronym! ** Bugfixes. * Changes for patchlevel 109: ** Bugfixes. ---------------------------------------------------------------------- Copyright information: Copyright (C) 1996, 1997, 1998 Free Software Foundation, Inc. Permission is granted to anyone to make or distribute verbatim copies of this document as received, in any medium, provided that the copyright notice and this permission notice are preserved, thus giving the recipient permission to redistribute in turn. Permission is granted to distribute modified versions of this document, or of portions of it, under the above conditions, provided also that they carry prominent notices stating who last changed them. Local variables: version-control: never mode: text mode: outline-minor end: pspp-1.4.1/gl/0000755000175000017500000000000013725012650012516 5ustar00blpblp00000000000000pspp-1.4.1/gl/stat-time.h0000644000175000017500000001700313723215640014601 0ustar00blpblp00000000000000/* stat-related time functions. Copyright (C) 2005, 2007, 2009-2020 Free Software Foundation, Inc. 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 3 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, see . */ /* Written by Paul Eggert. */ #ifndef STAT_TIME_H #define STAT_TIME_H 1 #include "intprops.h" #include #include #include #include #ifndef _GL_INLINE_HEADER_BEGIN #error "Please include config.h first." #endif _GL_INLINE_HEADER_BEGIN #ifndef _GL_STAT_TIME_INLINE # define _GL_STAT_TIME_INLINE _GL_INLINE #endif #ifdef __cplusplus extern "C" { #endif /* STAT_TIMESPEC (ST, ST_XTIM) is the ST_XTIM member for *ST of type struct timespec, if available. If not, then STAT_TIMESPEC_NS (ST, ST_XTIM) is the nanosecond component of the ST_XTIM member for *ST, if available. ST_XTIM can be st_atim, st_ctim, st_mtim, or st_birthtim for access, status change, data modification, or birth (creation) time respectively. These macros are private to stat-time.h. */ #if _GL_WINDOWS_STAT_TIMESPEC || defined HAVE_STRUCT_STAT_ST_ATIM_TV_NSEC # if _GL_WINDOWS_STAT_TIMESPEC || defined TYPEOF_STRUCT_STAT_ST_ATIM_IS_STRUCT_TIMESPEC # define STAT_TIMESPEC(st, st_xtim) ((st)->st_xtim) # else # define STAT_TIMESPEC_NS(st, st_xtim) ((st)->st_xtim.tv_nsec) # endif #elif defined HAVE_STRUCT_STAT_ST_ATIMESPEC_TV_NSEC # define STAT_TIMESPEC(st, st_xtim) ((st)->st_xtim##espec) #elif defined HAVE_STRUCT_STAT_ST_ATIMENSEC # define STAT_TIMESPEC_NS(st, st_xtim) ((st)->st_xtim##ensec) #elif defined HAVE_STRUCT_STAT_ST_ATIM_ST__TIM_TV_NSEC # define STAT_TIMESPEC_NS(st, st_xtim) ((st)->st_xtim.st__tim.tv_nsec) #endif /* Return the nanosecond component of *ST's access time. */ _GL_STAT_TIME_INLINE long int _GL_ATTRIBUTE_PURE get_stat_atime_ns (struct stat const *st) { # if defined STAT_TIMESPEC return STAT_TIMESPEC (st, st_atim).tv_nsec; # elif defined STAT_TIMESPEC_NS return STAT_TIMESPEC_NS (st, st_atim); # else return 0; # endif } /* Return the nanosecond component of *ST's status change time. */ _GL_STAT_TIME_INLINE long int _GL_ATTRIBUTE_PURE get_stat_ctime_ns (struct stat const *st) { # if defined STAT_TIMESPEC return STAT_TIMESPEC (st, st_ctim).tv_nsec; # elif defined STAT_TIMESPEC_NS return STAT_TIMESPEC_NS (st, st_ctim); # else return 0; # endif } /* Return the nanosecond component of *ST's data modification time. */ _GL_STAT_TIME_INLINE long int _GL_ATTRIBUTE_PURE get_stat_mtime_ns (struct stat const *st) { # if defined STAT_TIMESPEC return STAT_TIMESPEC (st, st_mtim).tv_nsec; # elif defined STAT_TIMESPEC_NS return STAT_TIMESPEC_NS (st, st_mtim); # else return 0; # endif } /* Return the nanosecond component of *ST's birth time. */ _GL_STAT_TIME_INLINE long int _GL_ATTRIBUTE_PURE get_stat_birthtime_ns (struct stat const *st _GL_UNUSED) { # if defined HAVE_STRUCT_STAT_ST_BIRTHTIMESPEC_TV_NSEC return STAT_TIMESPEC (st, st_birthtim).tv_nsec; # elif defined HAVE_STRUCT_STAT_ST_BIRTHTIMENSEC return STAT_TIMESPEC_NS (st, st_birthtim); # else return 0; # endif } /* Return *ST's access time. */ _GL_STAT_TIME_INLINE struct timespec _GL_ATTRIBUTE_PURE get_stat_atime (struct stat const *st) { #ifdef STAT_TIMESPEC return STAT_TIMESPEC (st, st_atim); #else struct timespec t; t.tv_sec = st->st_atime; t.tv_nsec = get_stat_atime_ns (st); return t; #endif } /* Return *ST's status change time. */ _GL_STAT_TIME_INLINE struct timespec _GL_ATTRIBUTE_PURE get_stat_ctime (struct stat const *st) { #ifdef STAT_TIMESPEC return STAT_TIMESPEC (st, st_ctim); #else struct timespec t; t.tv_sec = st->st_ctime; t.tv_nsec = get_stat_ctime_ns (st); return t; #endif } /* Return *ST's data modification time. */ _GL_STAT_TIME_INLINE struct timespec _GL_ATTRIBUTE_PURE get_stat_mtime (struct stat const *st) { #ifdef STAT_TIMESPEC return STAT_TIMESPEC (st, st_mtim); #else struct timespec t; t.tv_sec = st->st_mtime; t.tv_nsec = get_stat_mtime_ns (st); return t; #endif } /* Return *ST's birth time, if available; otherwise return a value with tv_sec and tv_nsec both equal to -1. */ _GL_STAT_TIME_INLINE struct timespec _GL_ATTRIBUTE_PURE get_stat_birthtime (struct stat const *st _GL_UNUSED) { struct timespec t; #if (defined HAVE_STRUCT_STAT_ST_BIRTHTIMESPEC_TV_NSEC \ || defined HAVE_STRUCT_STAT_ST_BIRTHTIM_TV_NSEC) t = STAT_TIMESPEC (st, st_birthtim); #elif defined HAVE_STRUCT_STAT_ST_BIRTHTIMENSEC t.tv_sec = st->st_birthtime; t.tv_nsec = st->st_birthtimensec; #elif defined _WIN32 && ! defined __CYGWIN__ /* Native Windows platforms (but not Cygwin) put the "file creation time" in st_ctime (!). See . */ # if _GL_WINDOWS_STAT_TIMESPEC t = st->st_ctim; # else t.tv_sec = st->st_ctime; t.tv_nsec = 0; # endif #else /* Birth time is not supported. */ t.tv_sec = -1; t.tv_nsec = -1; #endif #if (defined HAVE_STRUCT_STAT_ST_BIRTHTIMESPEC_TV_NSEC \ || defined HAVE_STRUCT_STAT_ST_BIRTHTIM_TV_NSEC \ || defined HAVE_STRUCT_STAT_ST_BIRTHTIMENSEC) /* FreeBSD and NetBSD sometimes signal the absence of knowledge by using zero. Attempt to work around this problem. Alas, this can report failure even for valid timestamps. Also, NetBSD sometimes returns junk in the birth time fields; work around this bug if it is detected. */ if (! (t.tv_sec && 0 <= t.tv_nsec && t.tv_nsec < 1000000000)) { t.tv_sec = -1; t.tv_nsec = -1; } #endif return t; } /* If a stat-like function returned RESULT, normalize the timestamps in *ST, in case this platform suffers from the Solaris 11 bug where tv_nsec might be negative. Return the adjusted RESULT, setting errno to EOVERFLOW if normalization overflowed. This function is intended to be private to this .h file. */ _GL_STAT_TIME_INLINE int stat_time_normalize (int result, struct stat *st _GL_UNUSED) { #if defined __sun && defined STAT_TIMESPEC if (result == 0) { long int timespec_hz = 1000000000; short int const ts_off[] = { offsetof (struct stat, st_atim), offsetof (struct stat, st_mtim), offsetof (struct stat, st_ctim) }; int i; for (i = 0; i < sizeof ts_off / sizeof *ts_off; i++) { struct timespec *ts = (struct timespec *) ((char *) st + ts_off[i]); long int q = ts->tv_nsec / timespec_hz; long int r = ts->tv_nsec % timespec_hz; if (r < 0) { r += timespec_hz; q--; } ts->tv_nsec = r; /* Overflow is possible, as Solaris 11 stat can yield tv_sec == TYPE_MINIMUM (time_t) && tv_nsec == -1000000000. INT_ADD_WRAPV is OK, since time_t is signed on Solaris. */ if (INT_ADD_WRAPV (q, ts->tv_sec, &ts->tv_sec)) { errno = EOVERFLOW; return -1; } } } #endif return result; } #ifdef __cplusplus } #endif _GL_INLINE_HEADER_END #endif pspp-1.4.1/gl/uniwidth/0000755000175000017500000000000013725012650014351 5ustar00blpblp00000000000000pspp-1.4.1/gl/uniwidth/u8-width.c0000644000175000017500000000247613723215640016201 0ustar00blpblp00000000000000/* Determine display width of UTF-8 string. Copyright (C) 2001-2002, 2006-2007, 2009-2020 Free Software Foundation, Inc. Written by Bruno Haible , 2002. 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 3 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, see . */ #include /* Specification. */ #include "uniwidth.h" #include "unistr.h" int u8_width (const uint8_t *s, size_t n, const char *encoding) { const uint8_t *s_end = s + n; int width = 0; while (s < s_end) { ucs4_t uc; int w; s += u8_mbtouc_unsafe (&uc, s, s_end - s); if (uc == 0) break; /* end of string reached */ w = uc_width (uc, encoding); if (w >= 0) /* ignore control characters in the string */ width += w; } return width; } pspp-1.4.1/gl/uniwidth/cjk.h0000644000175000017500000000314613723215640015277 0ustar00blpblp00000000000000/* Test for CJK encoding. Copyright (C) 2001-2002, 2005-2007, 2009-2020 Free Software Foundation, Inc. Written by Bruno Haible , 2002. 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 3 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, see . */ #include "streq.h" static int is_cjk_encoding (const char *encoding) { if (0 /* Legacy Japanese encodings */ || STREQ_OPT (encoding, "EUC-JP", 'E', 'U', 'C', '-', 'J', 'P', 0, 0, 0) /* Legacy Chinese encodings */ || STREQ_OPT (encoding, "GB2312", 'G', 'B', '2', '3', '1', '2', 0, 0, 0) || STREQ_OPT (encoding, "GBK", 'G', 'B', 'K', 0, 0, 0, 0, 0, 0) || STREQ_OPT (encoding, "EUC-TW", 'E', 'U', 'C', '-', 'T', 'W', 0, 0, 0) || STREQ_OPT (encoding, "BIG5", 'B', 'I', 'G', '5', 0, 0, 0, 0, 0) /* Legacy Korean encodings */ || STREQ_OPT (encoding, "EUC-KR", 'E', 'U', 'C', '-', 'K', 'R', 0, 0, 0) || STREQ_OPT (encoding, "CP949", 'C', 'P', '9', '4', '9', 0, 0, 0, 0) || STREQ_OPT (encoding, "JOHAB", 'J', 'O', 'H', 'A', 'B', 0, 0, 0, 0)) return 1; return 0; } pspp-1.4.1/gl/uniwidth/u8-strwidth.c0000644000175000017500000000177013723215640016726 0ustar00blpblp00000000000000/* Determine display width of UTF-8 string. Copyright (C) 2001-2002, 2006, 2009-2020 Free Software Foundation, Inc. Written by Bruno Haible , 2002. 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 3 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, see . */ #include /* Specification. */ #include "uniwidth.h" #include "unistr.h" int u8_strwidth (const uint8_t *s, const char *encoding) { return u8_width (s, u8_strlen (s), encoding); } pspp-1.4.1/gl/uniwidth/width.c0000644000175000017500000006554113723215640015651 0ustar00blpblp00000000000000/* Determine display width of Unicode character. Copyright (C) 2001-2002, 2006-2020 Free Software Foundation, Inc. Written by Bruno Haible , 2002. 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 3 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, see . */ #include /* Specification. */ #include "uniwidth.h" #include "cjk.h" /* * Non-spacing attribute table. * Consists of: * - Non-spacing characters; generated from PropList.txt or * "grep '^[^;]*;[^;]*;[^;]*;[^;]*;NSM;' UnicodeData.txt" * - Format control characters; generated from * "grep '^[^;]*;[^;]*;Cf;' UnicodeData.txt" * - Zero width characters; generated from * "grep '^[^;]*;ZERO WIDTH ' UnicodeData.txt" */ static const unsigned char nonspacing_table_data[38*64] = { /* 0x0000-0x01ff */ 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, /* 0x0000-0x003f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, /* 0x0040-0x007f */ 0xff, 0xff, 0xff, 0xff, 0x00, 0x20, 0x00, 0x00, /* 0x0080-0x00bf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x00c0-0x00ff */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x0100-0x013f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x0140-0x017f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x0180-0x01bf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x01c0-0x01ff */ /* 0x0200-0x03ff */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x0200-0x023f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x0240-0x027f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x0280-0x02bf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x02c0-0x02ff */ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x0300-0x033f */ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, /* 0x0340-0x037f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x0380-0x03bf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x03c0-0x03ff */ /* 0x0400-0x05ff */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x0400-0x043f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x0440-0x047f */ 0xf8, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x0480-0x04bf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x04c0-0x04ff */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x0500-0x053f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x0540-0x057f */ 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xbf, /* 0x0580-0x05bf */ 0xb6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x05c0-0x05ff */ /* 0x0600-0x07ff */ 0x3f, 0x00, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, /* 0x0600-0x063f */ 0x00, 0xf8, 0xff, 0xff, 0x00, 0x00, 0x01, 0x00, /* 0x0640-0x067f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x0680-0x06bf */ 0x00, 0x00, 0xc0, 0xbf, 0x9f, 0x3d, 0x00, 0x00, /* 0x06c0-0x06ff */ 0x00, 0x80, 0x02, 0x00, 0x00, 0x00, 0xff, 0xff, /* 0x0700-0x073f */ 0xff, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x0740-0x077f */ 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0x01, 0x00, /* 0x0780-0x07bf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x0f, 0x00, /* 0x07c0-0x07ff */ /* 0x0800-0x09ff */ 0x00, 0x00, 0xc0, 0xfb, 0xef, 0x3e, 0x00, 0x00, /* 0x0800-0x083f */ 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, /* 0x0840-0x087f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x0880-0x08bf */ 0x00, 0x00, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x08c0-0x08ff */ 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, /* 0x0900-0x093f */ 0xfe, 0x21, 0xfe, 0x00, 0x0c, 0x00, 0x00, 0x00, /* 0x0940-0x097f */ 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, /* 0x0980-0x09bf */ 0x1e, 0x20, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, /* 0x09c0-0x09ff */ /* 0x0a00-0x0bff */ 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, /* 0x0a00-0x0a3f */ 0x86, 0x39, 0x02, 0x00, 0x00, 0x00, 0x23, 0x00, /* 0x0a40-0x0a7f */ 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, /* 0x0a80-0x0abf */ 0xbe, 0x21, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, /* 0x0ac0-0x0aff */ 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x90, /* 0x0b00-0x0b3f */ 0x1e, 0x20, 0x40, 0x00, 0x0c, 0x00, 0x00, 0x00, /* 0x0b40-0x0b7f */ 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x0b80-0x0bbf */ 0x01, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x0bc0-0x0bff */ /* 0x0c00-0x0dff */ 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, /* 0x0c00-0x0c3f */ 0xc1, 0x3d, 0x60, 0x00, 0x0c, 0x00, 0x00, 0x00, /* 0x0c40-0x0c7f */ 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, /* 0x0c80-0x0cbf */ 0x00, 0x30, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, /* 0x0cc0-0x0cff */ 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x0d00-0x0d3f */ 0x1e, 0x20, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, /* 0x0d40-0x0d7f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x0d80-0x0dbf */ 0x00, 0x04, 0x5c, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x0dc0-0x0dff */ /* 0x0e00-0x0fff */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf2, 0x07, /* 0x0e00-0x0e3f */ 0x80, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x0e40-0x0e7f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf2, 0x1b, /* 0x0e80-0x0ebf */ 0x00, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x0ec0-0x0eff */ 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0xa0, 0x02, /* 0x0f00-0x0f3f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x7f, /* 0x0f40-0x0f7f */ 0xdf, 0xe0, 0xff, 0xfe, 0xff, 0xff, 0xff, 0x1f, /* 0x0f80-0x0fbf */ 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x0fc0-0x0fff */ /* 0x1000-0x11ff */ 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xfd, 0x66, /* 0x1000-0x103f */ 0x00, 0x00, 0x00, 0xc3, 0x01, 0x00, 0x1e, 0x00, /* 0x1040-0x107f */ 0x64, 0x20, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, /* 0x1080-0x10bf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10c0-0x10ff */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1100-0x113f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1140-0x117f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1180-0x11bf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x11c0-0x11ff */ /* 0x1200-0x13ff */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1200-0x123f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1240-0x127f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1280-0x12bf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x12c0-0x12ff */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1300-0x133f */ 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, 0x00, /* 0x1340-0x137f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1380-0x13bf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x13c0-0x13ff */ /* 0x1600-0x17ff */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1600-0x163f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1640-0x167f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1680-0x16bf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x16c0-0x16ff */ 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x1c, 0x00, /* 0x1700-0x173f */ 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x0c, 0x00, /* 0x1740-0x177f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb0, 0x3f, /* 0x1780-0x17bf */ 0x40, 0xfe, 0x0f, 0x20, 0x00, 0x00, 0x00, 0x00, /* 0x17c0-0x17ff */ /* 0x1800-0x19ff */ 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1800-0x183f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1840-0x187f */ 0x60, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, /* 0x1880-0x18bf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18c0-0x18ff */ 0x00, 0x00, 0x00, 0x00, 0x87, 0x01, 0x04, 0x0e, /* 0x1900-0x193f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1940-0x197f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1980-0x19bf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x19c0-0x19ff */ /* 0x1a00-0x1bff */ 0x00, 0x00, 0x80, 0x09, 0x00, 0x00, 0x00, 0x00, /* 0x1a00-0x1a3f */ 0x00, 0x00, 0x40, 0x7f, 0xe5, 0x1f, 0xf8, 0x9f, /* 0x1a40-0x1a7f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x7f, /* 0x1a80-0x1abf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1ac0-0x1aff */ 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd0, 0x17, /* 0x1b00-0x1b3f */ 0x04, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x0f, 0x00, /* 0x1b40-0x1b7f */ 0x03, 0x00, 0x00, 0x00, 0x3c, 0x3b, 0x00, 0x00, /* 0x1b80-0x1bbf */ 0x00, 0x00, 0x00, 0x00, 0x40, 0xa3, 0x03, 0x00, /* 0x1bc0-0x1bff */ /* 0x1c00-0x1dff */ 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xcf, 0x00, /* 0x1c00-0x1c3f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1c40-0x1c7f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1c80-0x1cbf */ 0x00, 0x00, 0xf7, 0xff, 0xfd, 0x21, 0x10, 0x03, /* 0x1cc0-0x1cff */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1d00-0x1d3f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1d40-0x1d7f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1d80-0x1dbf */ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0xf8, /* 0x1dc0-0x1dff */ /* 0x2000-0x21ff */ 0x00, 0xf8, 0x00, 0x00, 0x00, 0x7c, 0x00, 0x00, /* 0x2000-0x203f */ 0x00, 0x00, 0x00, 0x00, 0xdf, 0xff, 0x00, 0x00, /* 0x2040-0x207f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x2080-0x20bf */ 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, /* 0x20c0-0x20ff */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x2100-0x213f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x2140-0x217f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x2180-0x21bf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x21c0-0x21ff */ /* 0x2c00-0x2dff */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x2c00-0x2c3f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x2c40-0x2c7f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x2c80-0x2cbf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x03, 0x00, /* 0x2cc0-0x2cff */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x2d00-0x2d3f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, /* 0x2d40-0x2d7f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x2d80-0x2dbf */ 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, /* 0x2dc0-0x2dff */ /* 0x3000-0x31ff */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, /* 0x3000-0x303f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x3040-0x307f */ 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, /* 0x3080-0x30bf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30c0-0x30ff */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x3100-0x313f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x3140-0x317f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x3180-0x31bf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x31c0-0x31ff */ /* 0xa600-0xa7ff */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa600-0xa63f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xf7, 0x3f, /* 0xa640-0xa67f */ 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, /* 0xa680-0xa6bf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, /* 0xa6c0-0xa6ff */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa700-0xa73f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa740-0xa77f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa780-0xa7bf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa7c0-0xa7ff */ /* 0xa800-0xa9ff */ 0x44, 0x08, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, /* 0xa800-0xa83f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa840-0xa87f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa880-0xa8bf */ 0x30, 0x00, 0x00, 0x00, 0xff, 0xff, 0x03, 0x00, /* 0xa8c0-0xa8ff */ 0x00, 0x00, 0x00, 0x00, 0xc0, 0x3f, 0x00, 0x00, /* 0xa900-0xa93f */ 0x80, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa940-0xa97f */ 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc8, 0x13, /* 0xa980-0xa9bf */ 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, /* 0xa9c0-0xa9ff */ /* 0xaa00-0xabff */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x66, 0x00, /* 0xaa00-0xaa3f */ 0x08, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, /* 0xaa40-0xaa7f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9d, 0xc1, /* 0xaa80-0xaabf */ 0x02, 0x00, 0x00, 0x00, 0x00, 0x30, 0x40, 0x00, /* 0xaac0-0xaaff */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xab00-0xab3f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xab40-0xab7f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xab80-0xabbf */ 0x00, 0x00, 0x00, 0x00, 0x20, 0x21, 0x00, 0x00, /* 0xabc0-0xabff */ /* 0xfa00-0xfbff */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xfa00-0xfa3f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xfa40-0xfa7f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xfa80-0xfabf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xfac0-0xfaff */ 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, /* 0xfb00-0xfb3f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xfb40-0xfb7f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xfb80-0xfbbf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xfbc0-0xfbff */ /* 0xfe00-0xffff */ 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, /* 0xfe00-0xfe3f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xfe40-0xfe7f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xfe80-0xfebf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, /* 0xfec0-0xfeff */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xff00-0xff3f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xff40-0xff7f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xff80-0xffbf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, /* 0xffc0-0xffff */ /* 0x10000-0x101ff */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10000-0x1003f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10040-0x1007f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10080-0x100bf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x100c0-0x100ff */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10100-0x1013f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10140-0x1017f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10180-0x101bf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, /* 0x101c0-0x101ff */ /* 0x10200-0x103ff */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10200-0x1023f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10240-0x1027f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10280-0x102bf */ 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, /* 0x102c0-0x102ff */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10300-0x1033f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x07, /* 0x10340-0x1037f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10380-0x103bf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x103c0-0x103ff */ /* 0x10a00-0x10bff */ 0x6e, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, /* 0x10a00-0x10a3f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10a40-0x10a7f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10a80-0x10abf */ 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, /* 0x10ac0-0x10aff */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10b00-0x10b3f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10b40-0x10b7f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10b80-0x10bbf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10bc0-0x10bff */ /* 0x11000-0x111ff */ 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, /* 0x11000-0x1103f */ 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, /* 0x11040-0x1107f */ 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x26, /* 0x11080-0x110bf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x110c0-0x110ff */ 0x07, 0x00, 0x00, 0x00, 0x80, 0xef, 0x1f, 0x00, /* 0x11100-0x1113f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, /* 0x11140-0x1117f */ 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x7f, /* 0x11180-0x111bf */ 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x111c0-0x111ff */ /* 0x11200-0x113ff */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xd3, 0x40, /* 0x11200-0x1123f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x11240-0x1127f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x11280-0x112bf */ 0x00, 0x00, 0x00, 0x80, 0xf8, 0x07, 0x00, 0x00, /* 0x112c0-0x112ff */ 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, /* 0x11300-0x1133f */ 0x01, 0x00, 0x00, 0x00, 0xc0, 0x1f, 0x1f, 0x00, /* 0x11340-0x1137f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x11380-0x113bf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x113c0-0x113ff */ /* 0x11400-0x115ff */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, /* 0x11400-0x1143f */ 0x5c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x11440-0x1147f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x85, /* 0x11480-0x114bf */ 0x0d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x114c0-0x114ff */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x11500-0x1153f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x11540-0x1157f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0xb0, /* 0x11580-0x115bf */ 0x01, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, /* 0x115c0-0x115ff */ /* 0x11600-0x117ff */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xa7, /* 0x11600-0x1163f */ 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x11640-0x1167f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0xbf, 0x00, /* 0x11680-0x116bf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x116c0-0x116ff */ 0x00, 0x00, 0x00, 0xe0, 0xbc, 0x0f, 0x00, 0x00, /* 0x11700-0x1173f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x11740-0x1177f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x11780-0x117bf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x117c0-0x117ff */ /* 0x11c00-0x11dff */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x3f, /* 0x11c00-0x11c3f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x11c40-0x11c7f */ 0x00, 0x00, 0xfc, 0xff, 0xff, 0xfc, 0x6d, 0x00, /* 0x11c80-0x11cbf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x11cc0-0x11cff */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x11d00-0x11d3f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x11d40-0x11d7f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x11d80-0x11dbf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x11dc0-0x11dff */ /* 0x16a00-0x16bff */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x16a00-0x16a3f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x16a40-0x16a7f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x16a80-0x16abf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, /* 0x16ac0-0x16aff */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x00, /* 0x16b00-0x16b3f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x16b40-0x16b7f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x16b80-0x16bbf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x16bc0-0x16bff */ /* 0x16e00-0x16fff */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x16e00-0x16e3f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x16e40-0x16e7f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x16e80-0x16ebf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x16ec0-0x16eff */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x16f00-0x16f3f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x16f40-0x16f7f */ 0x00, 0x80, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x16f80-0x16fbf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x16fc0-0x16fff */ /* 0x1bc00-0x1bdff */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1bc00-0x1bc3f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1bc40-0x1bc7f */ 0x00, 0x00, 0x00, 0x60, 0x0f, 0x00, 0x00, 0x00, /* 0x1bc80-0x1bcbf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1bcc0-0x1bcff */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1bd00-0x1bd3f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1bd40-0x1bd7f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1bd80-0x1bdbf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1bdc0-0x1bdff */ /* 0x1d000-0x1d1ff */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1d000-0x1d03f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1d040-0x1d07f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1d080-0x1d0bf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1d0c0-0x1d0ff */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1d100-0x1d13f */ 0x00, 0x00, 0x00, 0x00, 0x80, 0x03, 0xf8, 0xff, /* 0x1d140-0x1d17f */ 0xe7, 0x0f, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, /* 0x1d180-0x1d1bf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1d1c0-0x1d1ff */ /* 0x1d200-0x1d3ff */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1d200-0x1d23f */ 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1d240-0x1d27f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1d280-0x1d2bf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1d2c0-0x1d2ff */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1d300-0x1d33f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1d340-0x1d37f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1d380-0x1d3bf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1d3c0-0x1d3ff */ /* 0x1da00-0x1dbff */ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xf8, /* 0x1da00-0x1da3f */ 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0x20, 0x00, /* 0x1da40-0x1da7f */ 0x10, 0x00, 0x00, 0xf8, 0xfe, 0xff, 0x00, 0x00, /* 0x1da80-0x1dabf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1dac0-0x1daff */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1db00-0x1db3f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1db40-0x1db7f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1db80-0x1dbbf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1dbc0-0x1dbff */ /* 0x1e000-0x1e1ff */ 0x7f, 0xff, 0xff, 0xf9, 0xdb, 0x07, 0x00, 0x00, /* 0x1e000-0x1e03f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1e040-0x1e07f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1e080-0x1e0bf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1e0c0-0x1e0ff */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1e100-0x1e13f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1e140-0x1e17f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1e180-0x1e1bf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1e1c0-0x1e1ff */ /* 0x1e800-0x1e9ff */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1e800-0x1e83f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1e840-0x1e87f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1e880-0x1e8bf */ 0x00, 0x00, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1e8c0-0x1e8ff */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1e900-0x1e93f */ 0xf0, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1e940-0x1e97f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1e980-0x1e9bf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 /* 0x1e9c0-0x1e9ff */ }; static const signed char nonspacing_table_ind[248] = { 0, 1, 2, 3, 4, 5, 6, 7, /* 0x0000-0x0fff */ 8, 9, -1, 10, 11, 12, 13, -1, /* 0x1000-0x1fff */ 14, -1, -1, -1, -1, -1, 15, -1, /* 0x2000-0x2fff */ 16, -1, -1, -1, -1, -1, -1, -1, /* 0x3000-0x3fff */ -1, -1, -1, -1, -1, -1, -1, -1, /* 0x4000-0x4fff */ -1, -1, -1, -1, -1, -1, -1, -1, /* 0x5000-0x5fff */ -1, -1, -1, -1, -1, -1, -1, -1, /* 0x6000-0x6fff */ -1, -1, -1, -1, -1, -1, -1, -1, /* 0x7000-0x7fff */ -1, -1, -1, -1, -1, -1, -1, -1, /* 0x8000-0x8fff */ -1, -1, -1, -1, -1, -1, -1, -1, /* 0x9000-0x9fff */ -1, -1, -1, 17, 18, 19, -1, -1, /* 0xa000-0xafff */ -1, -1, -1, -1, -1, -1, -1, -1, /* 0xb000-0xbfff */ -1, -1, -1, -1, -1, -1, -1, -1, /* 0xc000-0xcfff */ -1, -1, -1, -1, -1, -1, -1, -1, /* 0xd000-0xdfff */ -1, -1, -1, -1, -1, -1, -1, -1, /* 0xe000-0xefff */ -1, -1, -1, -1, -1, 20, -1, 21, /* 0xf000-0xffff */ 22, 23, -1, -1, -1, 24, -1, -1, /* 0x10000-0x10fff */ 25, 26, 27, 28, -1, -1, 29, -1, /* 0x11000-0x11fff */ -1, -1, -1, -1, -1, -1, -1, -1, /* 0x12000-0x12fff */ -1, -1, -1, -1, -1, -1, -1, -1, /* 0x13000-0x13fff */ -1, -1, -1, -1, -1, -1, -1, -1, /* 0x14000-0x14fff */ -1, -1, -1, -1, -1, -1, -1, -1, /* 0x15000-0x15fff */ -1, -1, -1, -1, -1, 30, -1, 31, /* 0x16000-0x16fff */ -1, -1, -1, -1, -1, -1, -1, -1, /* 0x17000-0x17fff */ -1, -1, -1, -1, -1, -1, -1, -1, /* 0x18000-0x18fff */ -1, -1, -1, -1, -1, -1, -1, -1, /* 0x19000-0x19fff */ -1, -1, -1, -1, -1, -1, -1, -1, /* 0x1a000-0x1afff */ -1, -1, -1, -1, -1, -1, 32, -1, /* 0x1b000-0x1bfff */ -1, -1, -1, -1, -1, -1, -1, -1, /* 0x1c000-0x1cfff */ 33, 34, -1, -1, -1, 35, -1, -1, /* 0x1d000-0x1dfff */ 36, -1, -1, -1, 37, -1, -1, -1 /* 0x1e000-0x1efff */ }; /* Determine number of column positions required for UC. */ int uc_width (ucs4_t uc, const char *encoding) { /* Test for non-spacing or control character. */ if ((uc >> 9) < 248) { int ind = nonspacing_table_ind[uc >> 9]; if (ind >= 0) if ((nonspacing_table_data[64*ind + ((uc >> 3) & 63)] >> (uc & 7)) & 1) { if (uc > 0 && uc < 0xa0) return -1; else return 0; } } else if ((uc >> 9) == (0xe0000 >> 9)) { if (uc >= 0xe0100) { if (uc <= 0xe01ef) return 0; } else { if (uc >= 0xe0020 ? uc <= 0xe007f : uc == 0xe0001) return 0; } } /* Test for double-width character. * Generated from "grep '^[^;]\{4,5\};[WF]' EastAsianWidth.txt" * and "grep '^[^;]\{4,5\};[^WF]' EastAsianWidth.txt" */ if (uc >= 0x1100 && ((uc < 0x1160) /* Hangul Jamo */ || (uc >= 0x2329 && uc < 0x232b) /* Angle Brackets */ || (uc >= 0x2e80 && uc < 0xa4d0 /* CJK ... Yi */ && !(uc == 0x303f) && !(uc >= 0x4dc0 && uc < 0x4e00)) || (uc >= 0xac00 && uc < 0xd7a4) /* Hangul Syllables */ || (uc >= 0xf900 && uc < 0xfb00) /* CJK Compatibility Ideographs */ || (uc >= 0xfe10 && uc < 0xfe20) /* Presentation Forms for Vertical */ || (uc >= 0xfe30 && uc < 0xfe70) /* CJK Compatibility Forms */ || (uc >= 0xff00 && uc < 0xff61) /* Fullwidth Forms */ || (uc >= 0xffe0 && uc < 0xffe7) /* Fullwidth Signs */ || (uc >= 0x20000 && uc <= 0x2ffff) /* Supplementary Ideographic Plane */ || (uc >= 0x30000 && uc <= 0x3ffff) /* Tertiary Ideographic Plane */ ) ) return 2; /* In ancient CJK encodings, Cyrillic and most other characters are double-width as well. */ if (uc >= 0x00A1 && uc < 0xFF61 && uc != 0x20A9 && is_cjk_encoding (encoding)) return 2; return 1; } pspp-1.4.1/gl/fcntl.c0000644000175000017500000004434313723215636014007 0ustar00blpblp00000000000000/* Provide file descriptor control. Copyright (C) 2009-2020 Free Software Foundation, Inc. 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 3 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, see . */ /* Written by Eric Blake . */ #include /* Specification. */ #include #include #include #include #include #include #ifdef __KLIBC__ # define INCL_DOS # include #endif #if defined _WIN32 && ! defined __CYGWIN__ /* Get declarations of the native Windows API functions. */ # define WIN32_LEAN_AND_MEAN # include /* Get _get_osfhandle. */ # if GNULIB_MSVC_NOTHROW # include "msvc-nothrow.h" # else # include # endif /* Upper bound on getdtablesize(). See lib/getdtablesize.c. */ # define OPEN_MAX_MAX 0x10000 /* Duplicate OLDFD into the first available slot of at least NEWFD, which must be positive, with FLAGS determining whether the duplicate will be inheritable. */ static int dupfd (int oldfd, int newfd, int flags) { /* Mingw has no way to create an arbitrary fd. Iterate until all file descriptors less than newfd are filled up. */ HANDLE curr_process = GetCurrentProcess (); HANDLE old_handle = (HANDLE) _get_osfhandle (oldfd); unsigned char fds_to_close[OPEN_MAX_MAX / CHAR_BIT]; unsigned int fds_to_close_bound = 0; int result; BOOL inherit = flags & O_CLOEXEC ? FALSE : TRUE; int mode; if (newfd < 0 || getdtablesize () <= newfd) { errno = EINVAL; return -1; } if (old_handle == INVALID_HANDLE_VALUE || (mode = setmode (oldfd, O_BINARY)) == -1) { /* oldfd is not open, or is an unassigned standard file descriptor. */ errno = EBADF; return -1; } setmode (oldfd, mode); flags |= mode; for (;;) { HANDLE new_handle; int duplicated_fd; unsigned int index; if (!DuplicateHandle (curr_process, /* SourceProcessHandle */ old_handle, /* SourceHandle */ curr_process, /* TargetProcessHandle */ (PHANDLE) &new_handle, /* TargetHandle */ (DWORD) 0, /* DesiredAccess */ inherit, /* InheritHandle */ DUPLICATE_SAME_ACCESS)) /* Options */ { switch (GetLastError ()) { case ERROR_TOO_MANY_OPEN_FILES: errno = EMFILE; break; case ERROR_INVALID_HANDLE: case ERROR_INVALID_TARGET_HANDLE: case ERROR_DIRECT_ACCESS_HANDLE: errno = EBADF; break; case ERROR_INVALID_PARAMETER: case ERROR_INVALID_FUNCTION: case ERROR_INVALID_ACCESS: errno = EINVAL; break; default: errno = EACCES; break; } result = -1; break; } duplicated_fd = _open_osfhandle ((intptr_t) new_handle, flags); if (duplicated_fd < 0) { CloseHandle (new_handle); result = -1; break; } if (newfd <= duplicated_fd) { result = duplicated_fd; break; } /* Set the bit duplicated_fd in fds_to_close[]. */ index = (unsigned int) duplicated_fd / CHAR_BIT; if (fds_to_close_bound <= index) { if (sizeof fds_to_close <= index) /* Need to increase OPEN_MAX_MAX. */ abort (); memset (fds_to_close + fds_to_close_bound, '\0', index + 1 - fds_to_close_bound); fds_to_close_bound = index + 1; } fds_to_close[index] |= 1 << ((unsigned int) duplicated_fd % CHAR_BIT); } /* Close the previous fds that turned out to be too small. */ { int saved_errno = errno; unsigned int duplicated_fd; for (duplicated_fd = 0; duplicated_fd < fds_to_close_bound * CHAR_BIT; duplicated_fd++) if ((fds_to_close[duplicated_fd / CHAR_BIT] >> (duplicated_fd % CHAR_BIT)) & 1) close (duplicated_fd); errno = saved_errno; } # if REPLACE_FCHDIR if (0 <= result) result = _gl_register_dup (oldfd, result); # endif return result; } #endif /* W32 */ /* Forward declarations, because we '#undef fcntl' in the middle of this compilation unit. */ /* Our implementation of fcntl (fd, F_DUPFD, target). */ static int rpl_fcntl_DUPFD (int fd, int target); /* Our implementation of fcntl (fd, F_DUPFD_CLOEXEC, target). */ static int rpl_fcntl_DUPFD_CLOEXEC (int fd, int target); #ifdef __KLIBC__ /* Adds support for fcntl on directories. */ static int klibc_fcntl (int fd, int action, /* arg */...); #endif /* Perform the specified ACTION on the file descriptor FD, possibly using the argument ARG further described below. This replacement handles the following actions, and forwards all others on to the native fcntl. An unrecognized ACTION returns -1 with errno set to EINVAL. F_DUPFD - duplicate FD, with int ARG being the minimum target fd. If successful, return the duplicate, which will be inheritable; otherwise return -1 and set errno. F_DUPFD_CLOEXEC - duplicate FD, with int ARG being the minimum target fd. If successful, return the duplicate, which will not be inheritable; otherwise return -1 and set errno. F_GETFD - ARG need not be present. If successful, return a non-negative value containing the descriptor flags of FD (only FD_CLOEXEC is portable, but other flags may be present); otherwise return -1 and set errno. */ int fcntl (int fd, int action, /* arg */...) #undef fcntl #ifdef __KLIBC__ # define fcntl klibc_fcntl #endif { va_list arg; int result = -1; va_start (arg, action); switch (action) { case F_DUPFD: { int target = va_arg (arg, int); result = rpl_fcntl_DUPFD (fd, target); break; } case F_DUPFD_CLOEXEC: { int target = va_arg (arg, int); result = rpl_fcntl_DUPFD_CLOEXEC (fd, target); break; } #if !HAVE_FCNTL case F_GETFD: { # if defined _WIN32 && ! defined __CYGWIN__ HANDLE handle = (HANDLE) _get_osfhandle (fd); DWORD flags; if (handle == INVALID_HANDLE_VALUE || GetHandleInformation (handle, &flags) == 0) errno = EBADF; else result = (flags & HANDLE_FLAG_INHERIT) ? 0 : FD_CLOEXEC; # else /* !W32 */ /* Use dup2 to reject invalid file descriptors. No way to access this information, so punt. */ if (0 <= dup2 (fd, fd)) result = 0; # endif /* !W32 */ break; } /* F_GETFD */ #endif /* !HAVE_FCNTL */ /* Implementing F_SETFD on mingw is not trivial - there is no API for changing the O_NOINHERIT bit on an fd, and merely changing the HANDLE_FLAG_INHERIT bit on the underlying handle can lead to odd state. It may be possible by duplicating the handle, using _open_osfhandle with the right flags, then using dup2 to move the duplicate onto the original, but that is not supported for now. */ default: { #if HAVE_FCNTL switch (action) { #ifdef F_BARRIERFSYNC /* macOS */ case F_BARRIERFSYNC: #endif #ifdef F_CHKCLEAN /* macOS */ case F_CHKCLEAN: #endif #ifdef F_CLOSEM /* NetBSD, HP-UX */ case F_CLOSEM: #endif #ifdef F_FLUSH_DATA /* macOS */ case F_FLUSH_DATA: #endif #ifdef F_FREEZE_FS /* macOS */ case F_FREEZE_FS: #endif #ifdef F_FULLFSYNC /* macOS */ case F_FULLFSYNC: #endif #ifdef F_GETCONFINED /* macOS */ case F_GETCONFINED: #endif #ifdef F_GETDEFAULTPROTLEVEL /* macOS */ case F_GETDEFAULTPROTLEVEL: #endif #ifdef F_GETFD /* POSIX */ case F_GETFD: #endif #ifdef F_GETFL /* POSIX */ case F_GETFL: #endif #ifdef F_GETLEASE /* Linux */ case F_GETLEASE: #endif #ifdef F_GETNOSIGPIPE /* macOS */ case F_GETNOSIGPIPE: #endif #ifdef F_GETOWN /* POSIX */ case F_GETOWN: #endif #ifdef F_GETPIPE_SZ /* Linux */ case F_GETPIPE_SZ: #endif #ifdef F_GETPROTECTIONCLASS /* macOS */ case F_GETPROTECTIONCLASS: #endif #ifdef F_GETPROTECTIONLEVEL /* macOS */ case F_GETPROTECTIONLEVEL: #endif #ifdef F_GET_SEALS /* Linux */ case F_GET_SEALS: #endif #ifdef F_GETSIG /* Linux */ case F_GETSIG: #endif #ifdef F_MAXFD /* NetBSD */ case F_MAXFD: #endif #ifdef F_RECYCLE /* macOS */ case F_RECYCLE: #endif #ifdef F_SETFIFOENH /* HP-UX */ case F_SETFIFOENH: #endif #ifdef F_THAW_FS /* macOS */ case F_THAW_FS: #endif /* These actions take no argument. */ result = fcntl (fd, action); break; #ifdef F_ADD_SEALS /* Linux */ case F_ADD_SEALS: #endif #ifdef F_BADFD /* Solaris */ case F_BADFD: #endif #ifdef F_CHECK_OPENEVT /* macOS */ case F_CHECK_OPENEVT: #endif #ifdef F_DUP2FD /* FreeBSD, AIX, Solaris */ case F_DUP2FD: #endif #ifdef F_DUP2FD_CLOEXEC /* FreeBSD, Solaris */ case F_DUP2FD_CLOEXEC: #endif #ifdef F_DUP2FD_CLOFORK /* Solaris */ case F_DUP2FD_CLOFORK: #endif #ifdef F_DUPFD /* POSIX */ case F_DUPFD: #endif #ifdef F_DUPFD_CLOEXEC /* POSIX */ case F_DUPFD_CLOEXEC: #endif #ifdef F_DUPFD_CLOFORK /* Solaris */ case F_DUPFD_CLOFORK: #endif #ifdef F_GETXFL /* Solaris */ case F_GETXFL: #endif #ifdef F_GLOBAL_NOCACHE /* macOS */ case F_GLOBAL_NOCACHE: #endif #ifdef F_MAKECOMPRESSED /* macOS */ case F_MAKECOMPRESSED: #endif #ifdef F_MOVEDATAEXTENTS /* macOS */ case F_MOVEDATAEXTENTS: #endif #ifdef F_NOCACHE /* macOS */ case F_NOCACHE: #endif #ifdef F_NODIRECT /* macOS */ case F_NODIRECT: #endif #ifdef F_NOTIFY /* Linux */ case F_NOTIFY: #endif #ifdef F_OPLKACK /* IRIX */ case F_OPLKACK: #endif #ifdef F_OPLKREG /* IRIX */ case F_OPLKREG: #endif #ifdef F_RDAHEAD /* macOS */ case F_RDAHEAD: #endif #ifdef F_SETBACKINGSTORE /* macOS */ case F_SETBACKINGSTORE: #endif #ifdef F_SETCONFINED /* macOS */ case F_SETCONFINED: #endif #ifdef F_SETFD /* POSIX */ case F_SETFD: #endif #ifdef F_SETFL /* POSIX */ case F_SETFL: #endif #ifdef F_SETLEASE /* Linux */ case F_SETLEASE: #endif #ifdef F_SETNOSIGPIPE /* macOS */ case F_SETNOSIGPIPE: #endif #ifdef F_SETOWN /* POSIX */ case F_SETOWN: #endif #ifdef F_SETPIPE_SZ /* Linux */ case F_SETPIPE_SZ: #endif #ifdef F_SETPROTECTIONCLASS /* macOS */ case F_SETPROTECTIONCLASS: #endif #ifdef F_SETSIG /* Linux */ case F_SETSIG: #endif #ifdef F_SINGLE_WRITER /* macOS */ case F_SINGLE_WRITER: #endif /* These actions take an 'int' argument. */ { int x = va_arg (arg, int); result = fcntl (fd, action, x); } break; default: /* Other actions take a pointer argument. */ { void *p = va_arg (arg, void *); result = fcntl (fd, action, p); } break; } #else errno = EINVAL; #endif break; } } va_end (arg); return result; } static int rpl_fcntl_DUPFD (int fd, int target) { int result; #if !HAVE_FCNTL result = dupfd (fd, target, 0); #elif FCNTL_DUPFD_BUGGY || REPLACE_FCHDIR /* Detect invalid target; needed for cygwin 1.5.x. */ if (target < 0 || getdtablesize () <= target) { result = -1; errno = EINVAL; } else { /* Haiku alpha 2 loses fd flags on original. */ int flags = fcntl (fd, F_GETFD); if (flags < 0) result = -1; else { result = fcntl (fd, F_DUPFD, target); if (0 <= result && fcntl (fd, F_SETFD, flags) == -1) { int saved_errno = errno; close (result); result = -1; errno = saved_errno; } # if REPLACE_FCHDIR if (0 <= result) result = _gl_register_dup (fd, result); # endif } } #else result = fcntl (fd, F_DUPFD, target); #endif return result; } static int rpl_fcntl_DUPFD_CLOEXEC (int fd, int target) { int result; #if !HAVE_FCNTL result = dupfd (fd, target, O_CLOEXEC); #else /* HAVE_FCNTL */ # if defined __HAIKU__ /* On Haiku, the system fcntl (fd, F_DUPFD_CLOEXEC, target) sets the FD_CLOEXEC flag on fd, not on target. Therefore avoid the system fcntl in this case. */ # define have_dupfd_cloexec -1 # else /* Try the system call first, if the headers claim it exists (that is, if GNULIB_defined_F_DUPFD_CLOEXEC is 0), since we may be running with a glibc that has the macro but with an older kernel that does not support it. Cache the information on whether the system call really works, but avoid caching failure if the corresponding F_DUPFD fails for any reason. 0 = unknown, 1 = yes, -1 = no. */ static int have_dupfd_cloexec = GNULIB_defined_F_DUPFD_CLOEXEC ? -1 : 0; if (0 <= have_dupfd_cloexec) { result = fcntl (fd, F_DUPFD_CLOEXEC, target); if (0 <= result || errno != EINVAL) { have_dupfd_cloexec = 1; # if REPLACE_FCHDIR if (0 <= result) result = _gl_register_dup (fd, result); # endif } else { result = rpl_fcntl_DUPFD (fd, target); if (result >= 0) have_dupfd_cloexec = -1; } } else # endif result = rpl_fcntl_DUPFD (fd, target); if (0 <= result && have_dupfd_cloexec == -1) { int flags = fcntl (result, F_GETFD); if (flags < 0 || fcntl (result, F_SETFD, flags | FD_CLOEXEC) == -1) { int saved_errno = errno; close (result); errno = saved_errno; result = -1; } } #endif /* HAVE_FCNTL */ return result; } #undef fcntl #ifdef __KLIBC__ static int klibc_fcntl (int fd, int action, /* arg */...) { va_list arg_ptr; int arg; struct stat sbuf; int result; va_start (arg_ptr, action); arg = va_arg (arg_ptr, int); result = fcntl (fd, action, arg); /* EPERM for F_DUPFD, ENOTSUP for others */ if (result == -1 && (errno == EPERM || errno == ENOTSUP) && !fstat (fd, &sbuf) && S_ISDIR (sbuf.st_mode)) { ULONG ulMode; switch (action) { case F_DUPFD: /* Find available fd */ while (fcntl (arg, F_GETFL) != -1 || errno != EBADF) arg++; result = dup2 (fd, arg); break; /* Using underlying APIs is right ? */ case F_GETFD: if (DosQueryFHState (fd, &ulMode)) break; result = (ulMode & OPEN_FLAGS_NOINHERIT) ? FD_CLOEXEC : 0; break; case F_SETFD: if (arg & ~FD_CLOEXEC) break; if (DosQueryFHState (fd, &ulMode)) break; if (arg & FD_CLOEXEC) ulMode |= OPEN_FLAGS_NOINHERIT; else ulMode &= ~OPEN_FLAGS_NOINHERIT; /* Filter supported flags. */ ulMode &= (OPEN_FLAGS_WRITE_THROUGH | OPEN_FLAGS_FAIL_ON_ERROR | OPEN_FLAGS_NO_CACHE | OPEN_FLAGS_NOINHERIT); if (DosSetFHState (fd, ulMode)) break; result = 0; break; case F_GETFL: result = 0; break; case F_SETFL: if (arg != 0) break; result = 0; break; default: errno = EINVAL; break; } } va_end (arg_ptr); return result; } #endif pspp-1.4.1/gl/uninorm/0000755000175000017500000000000013725012650014205 5ustar00blpblp00000000000000pspp-1.4.1/gl/uninorm/decomposition-table2.h0000644000175000017500000070403413723215640020413 0ustar00blpblp00000000000000/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ /* Decomposition of Unicode characters. */ /* Generated automatically by gen-uni-tables.c for Unicode 9.0.0. */ const unsigned char gl_uninorm_decomp_chars_table[] = { 0x08, 0x00, 0x20, 0xC0, 0x00, 0x20, 0x00, 0x03, 0x08, 0x20, 0x00, 0x61, 0xC0, 0x00, 0x20, 0x00, 0x03, 0x04, 0x20, 0x00, 0x32, 0x20, 0x00, 0x33, 0xC0, 0x00, 0x20, 0x00, 0x03, 0x01, 0x40, 0x03, 0xBC, 0xC0, 0x00, 0x20, 0x00, 0x03, 0x27, 0x20, 0x00, 0x31, 0x20, 0x00, 0x6F, 0xBC, 0x00, 0x31, 0x80, 0x20, 0x44, 0x00, 0x00, 0x34, 0xBC, 0x00, 0x31, 0x80, 0x20, 0x44, 0x00, 0x00, 0x32, 0xBC, 0x00, 0x33, 0x80, 0x20, 0x44, 0x00, 0x00, 0x34, 0x80, 0x00, 0x41, 0x00, 0x03, 0x00, 0x80, 0x00, 0x41, 0x00, 0x03, 0x01, 0x80, 0x00, 0x41, 0x00, 0x03, 0x02, 0x80, 0x00, 0x41, 0x00, 0x03, 0x03, 0x80, 0x00, 0x41, 0x00, 0x03, 0x08, 0x80, 0x00, 0x41, 0x00, 0x03, 0x0A, 0x80, 0x00, 0x43, 0x00, 0x03, 0x27, 0x80, 0x00, 0x45, 0x00, 0x03, 0x00, 0x80, 0x00, 0x45, 0x00, 0x03, 0x01, 0x80, 0x00, 0x45, 0x00, 0x03, 0x02, 0x80, 0x00, 0x45, 0x00, 0x03, 0x08, 0x80, 0x00, 0x49, 0x00, 0x03, 0x00, 0x80, 0x00, 0x49, 0x00, 0x03, 0x01, 0x80, 0x00, 0x49, 0x00, 0x03, 0x02, 0x80, 0x00, 0x49, 0x00, 0x03, 0x08, 0x80, 0x00, 0x4E, 0x00, 0x03, 0x03, 0x80, 0x00, 0x4F, 0x00, 0x03, 0x00, 0x80, 0x00, 0x4F, 0x00, 0x03, 0x01, 0x80, 0x00, 0x4F, 0x00, 0x03, 0x02, 0x80, 0x00, 0x4F, 0x00, 0x03, 0x03, 0x80, 0x00, 0x4F, 0x00, 0x03, 0x08, 0x80, 0x00, 0x55, 0x00, 0x03, 0x00, 0x80, 0x00, 0x55, 0x00, 0x03, 0x01, 0x80, 0x00, 0x55, 0x00, 0x03, 0x02, 0x80, 0x00, 0x55, 0x00, 0x03, 0x08, 0x80, 0x00, 0x59, 0x00, 0x03, 0x01, 0x80, 0x00, 0x61, 0x00, 0x03, 0x00, 0x80, 0x00, 0x61, 0x00, 0x03, 0x01, 0x80, 0x00, 0x61, 0x00, 0x03, 0x02, 0x80, 0x00, 0x61, 0x00, 0x03, 0x03, 0x80, 0x00, 0x61, 0x00, 0x03, 0x08, 0x80, 0x00, 0x61, 0x00, 0x03, 0x0A, 0x80, 0x00, 0x63, 0x00, 0x03, 0x27, 0x80, 0x00, 0x65, 0x00, 0x03, 0x00, 0x80, 0x00, 0x65, 0x00, 0x03, 0x01, 0x80, 0x00, 0x65, 0x00, 0x03, 0x02, 0x80, 0x00, 0x65, 0x00, 0x03, 0x08, 0x80, 0x00, 0x69, 0x00, 0x03, 0x00, 0x80, 0x00, 0x69, 0x00, 0x03, 0x01, 0x80, 0x00, 0x69, 0x00, 0x03, 0x02, 0x80, 0x00, 0x69, 0x00, 0x03, 0x08, 0x80, 0x00, 0x6E, 0x00, 0x03, 0x03, 0x80, 0x00, 0x6F, 0x00, 0x03, 0x00, 0x80, 0x00, 0x6F, 0x00, 0x03, 0x01, 0x80, 0x00, 0x6F, 0x00, 0x03, 0x02, 0x80, 0x00, 0x6F, 0x00, 0x03, 0x03, 0x80, 0x00, 0x6F, 0x00, 0x03, 0x08, 0x80, 0x00, 0x75, 0x00, 0x03, 0x00, 0x80, 0x00, 0x75, 0x00, 0x03, 0x01, 0x80, 0x00, 0x75, 0x00, 0x03, 0x02, 0x80, 0x00, 0x75, 0x00, 0x03, 0x08, 0x80, 0x00, 0x79, 0x00, 0x03, 0x01, 0x80, 0x00, 0x79, 0x00, 0x03, 0x08, 0x80, 0x00, 0x41, 0x00, 0x03, 0x04, 0x80, 0x00, 0x61, 0x00, 0x03, 0x04, 0x80, 0x00, 0x41, 0x00, 0x03, 0x06, 0x80, 0x00, 0x61, 0x00, 0x03, 0x06, 0x80, 0x00, 0x41, 0x00, 0x03, 0x28, 0x80, 0x00, 0x61, 0x00, 0x03, 0x28, 0x80, 0x00, 0x43, 0x00, 0x03, 0x01, 0x80, 0x00, 0x63, 0x00, 0x03, 0x01, 0x80, 0x00, 0x43, 0x00, 0x03, 0x02, 0x80, 0x00, 0x63, 0x00, 0x03, 0x02, 0x80, 0x00, 0x43, 0x00, 0x03, 0x07, 0x80, 0x00, 0x63, 0x00, 0x03, 0x07, 0x80, 0x00, 0x43, 0x00, 0x03, 0x0C, 0x80, 0x00, 0x63, 0x00, 0x03, 0x0C, 0x80, 0x00, 0x44, 0x00, 0x03, 0x0C, 0x80, 0x00, 0x64, 0x00, 0x03, 0x0C, 0x80, 0x00, 0x45, 0x00, 0x03, 0x04, 0x80, 0x00, 0x65, 0x00, 0x03, 0x04, 0x80, 0x00, 0x45, 0x00, 0x03, 0x06, 0x80, 0x00, 0x65, 0x00, 0x03, 0x06, 0x80, 0x00, 0x45, 0x00, 0x03, 0x07, 0x80, 0x00, 0x65, 0x00, 0x03, 0x07, 0x80, 0x00, 0x45, 0x00, 0x03, 0x28, 0x80, 0x00, 0x65, 0x00, 0x03, 0x28, 0x80, 0x00, 0x45, 0x00, 0x03, 0x0C, 0x80, 0x00, 0x65, 0x00, 0x03, 0x0C, 0x80, 0x00, 0x47, 0x00, 0x03, 0x02, 0x80, 0x00, 0x67, 0x00, 0x03, 0x02, 0x80, 0x00, 0x47, 0x00, 0x03, 0x06, 0x80, 0x00, 0x67, 0x00, 0x03, 0x06, 0x80, 0x00, 0x47, 0x00, 0x03, 0x07, 0x80, 0x00, 0x67, 0x00, 0x03, 0x07, 0x80, 0x00, 0x47, 0x00, 0x03, 0x27, 0x80, 0x00, 0x67, 0x00, 0x03, 0x27, 0x80, 0x00, 0x48, 0x00, 0x03, 0x02, 0x80, 0x00, 0x68, 0x00, 0x03, 0x02, 0x80, 0x00, 0x49, 0x00, 0x03, 0x03, 0x80, 0x00, 0x69, 0x00, 0x03, 0x03, 0x80, 0x00, 0x49, 0x00, 0x03, 0x04, 0x80, 0x00, 0x69, 0x00, 0x03, 0x04, 0x80, 0x00, 0x49, 0x00, 0x03, 0x06, 0x80, 0x00, 0x69, 0x00, 0x03, 0x06, 0x80, 0x00, 0x49, 0x00, 0x03, 0x28, 0x80, 0x00, 0x69, 0x00, 0x03, 0x28, 0x80, 0x00, 0x49, 0x00, 0x03, 0x07, 0xC0, 0x00, 0x49, 0x00, 0x00, 0x4A, 0xC0, 0x00, 0x69, 0x00, 0x00, 0x6A, 0x80, 0x00, 0x4A, 0x00, 0x03, 0x02, 0x80, 0x00, 0x6A, 0x00, 0x03, 0x02, 0x80, 0x00, 0x4B, 0x00, 0x03, 0x27, 0x80, 0x00, 0x6B, 0x00, 0x03, 0x27, 0x80, 0x00, 0x4C, 0x00, 0x03, 0x01, 0x80, 0x00, 0x6C, 0x00, 0x03, 0x01, 0x80, 0x00, 0x4C, 0x00, 0x03, 0x27, 0x80, 0x00, 0x6C, 0x00, 0x03, 0x27, 0x80, 0x00, 0x4C, 0x00, 0x03, 0x0C, 0x80, 0x00, 0x6C, 0x00, 0x03, 0x0C, 0xC0, 0x00, 0x4C, 0x00, 0x00, 0xB7, 0xC0, 0x00, 0x6C, 0x00, 0x00, 0xB7, 0x80, 0x00, 0x4E, 0x00, 0x03, 0x01, 0x80, 0x00, 0x6E, 0x00, 0x03, 0x01, 0x80, 0x00, 0x4E, 0x00, 0x03, 0x27, 0x80, 0x00, 0x6E, 0x00, 0x03, 0x27, 0x80, 0x00, 0x4E, 0x00, 0x03, 0x0C, 0x80, 0x00, 0x6E, 0x00, 0x03, 0x0C, 0xC0, 0x02, 0xBC, 0x00, 0x00, 0x6E, 0x80, 0x00, 0x4F, 0x00, 0x03, 0x04, 0x80, 0x00, 0x6F, 0x00, 0x03, 0x04, 0x80, 0x00, 0x4F, 0x00, 0x03, 0x06, 0x80, 0x00, 0x6F, 0x00, 0x03, 0x06, 0x80, 0x00, 0x4F, 0x00, 0x03, 0x0B, 0x80, 0x00, 0x6F, 0x00, 0x03, 0x0B, 0x80, 0x00, 0x52, 0x00, 0x03, 0x01, 0x80, 0x00, 0x72, 0x00, 0x03, 0x01, 0x80, 0x00, 0x52, 0x00, 0x03, 0x27, 0x80, 0x00, 0x72, 0x00, 0x03, 0x27, 0x80, 0x00, 0x52, 0x00, 0x03, 0x0C, 0x80, 0x00, 0x72, 0x00, 0x03, 0x0C, 0x80, 0x00, 0x53, 0x00, 0x03, 0x01, 0x80, 0x00, 0x73, 0x00, 0x03, 0x01, 0x80, 0x00, 0x53, 0x00, 0x03, 0x02, 0x80, 0x00, 0x73, 0x00, 0x03, 0x02, 0x80, 0x00, 0x53, 0x00, 0x03, 0x27, 0x80, 0x00, 0x73, 0x00, 0x03, 0x27, 0x80, 0x00, 0x53, 0x00, 0x03, 0x0C, 0x80, 0x00, 0x73, 0x00, 0x03, 0x0C, 0x80, 0x00, 0x54, 0x00, 0x03, 0x27, 0x80, 0x00, 0x74, 0x00, 0x03, 0x27, 0x80, 0x00, 0x54, 0x00, 0x03, 0x0C, 0x80, 0x00, 0x74, 0x00, 0x03, 0x0C, 0x80, 0x00, 0x55, 0x00, 0x03, 0x03, 0x80, 0x00, 0x75, 0x00, 0x03, 0x03, 0x80, 0x00, 0x55, 0x00, 0x03, 0x04, 0x80, 0x00, 0x75, 0x00, 0x03, 0x04, 0x80, 0x00, 0x55, 0x00, 0x03, 0x06, 0x80, 0x00, 0x75, 0x00, 0x03, 0x06, 0x80, 0x00, 0x55, 0x00, 0x03, 0x0A, 0x80, 0x00, 0x75, 0x00, 0x03, 0x0A, 0x80, 0x00, 0x55, 0x00, 0x03, 0x0B, 0x80, 0x00, 0x75, 0x00, 0x03, 0x0B, 0x80, 0x00, 0x55, 0x00, 0x03, 0x28, 0x80, 0x00, 0x75, 0x00, 0x03, 0x28, 0x80, 0x00, 0x57, 0x00, 0x03, 0x02, 0x80, 0x00, 0x77, 0x00, 0x03, 0x02, 0x80, 0x00, 0x59, 0x00, 0x03, 0x02, 0x80, 0x00, 0x79, 0x00, 0x03, 0x02, 0x80, 0x00, 0x59, 0x00, 0x03, 0x08, 0x80, 0x00, 0x5A, 0x00, 0x03, 0x01, 0x80, 0x00, 0x7A, 0x00, 0x03, 0x01, 0x80, 0x00, 0x5A, 0x00, 0x03, 0x07, 0x80, 0x00, 0x7A, 0x00, 0x03, 0x07, 0x80, 0x00, 0x5A, 0x00, 0x03, 0x0C, 0x80, 0x00, 0x7A, 0x00, 0x03, 0x0C, 0x40, 0x00, 0x73, 0x80, 0x00, 0x4F, 0x00, 0x03, 0x1B, 0x80, 0x00, 0x6F, 0x00, 0x03, 0x1B, 0x80, 0x00, 0x55, 0x00, 0x03, 0x1B, 0x80, 0x00, 0x75, 0x00, 0x03, 0x1B, 0xC0, 0x00, 0x44, 0x00, 0x01, 0x7D, 0xC0, 0x00, 0x44, 0x00, 0x01, 0x7E, 0xC0, 0x00, 0x64, 0x00, 0x01, 0x7E, 0xC0, 0x00, 0x4C, 0x00, 0x00, 0x4A, 0xC0, 0x00, 0x4C, 0x00, 0x00, 0x6A, 0xC0, 0x00, 0x6C, 0x00, 0x00, 0x6A, 0xC0, 0x00, 0x4E, 0x00, 0x00, 0x4A, 0xC0, 0x00, 0x4E, 0x00, 0x00, 0x6A, 0xC0, 0x00, 0x6E, 0x00, 0x00, 0x6A, 0x80, 0x00, 0x41, 0x00, 0x03, 0x0C, 0x80, 0x00, 0x61, 0x00, 0x03, 0x0C, 0x80, 0x00, 0x49, 0x00, 0x03, 0x0C, 0x80, 0x00, 0x69, 0x00, 0x03, 0x0C, 0x80, 0x00, 0x4F, 0x00, 0x03, 0x0C, 0x80, 0x00, 0x6F, 0x00, 0x03, 0x0C, 0x80, 0x00, 0x55, 0x00, 0x03, 0x0C, 0x80, 0x00, 0x75, 0x00, 0x03, 0x0C, 0x80, 0x00, 0xDC, 0x00, 0x03, 0x04, 0x80, 0x00, 0xFC, 0x00, 0x03, 0x04, 0x80, 0x00, 0xDC, 0x00, 0x03, 0x01, 0x80, 0x00, 0xFC, 0x00, 0x03, 0x01, 0x80, 0x00, 0xDC, 0x00, 0x03, 0x0C, 0x80, 0x00, 0xFC, 0x00, 0x03, 0x0C, 0x80, 0x00, 0xDC, 0x00, 0x03, 0x00, 0x80, 0x00, 0xFC, 0x00, 0x03, 0x00, 0x80, 0x00, 0xC4, 0x00, 0x03, 0x04, 0x80, 0x00, 0xE4, 0x00, 0x03, 0x04, 0x80, 0x02, 0x26, 0x00, 0x03, 0x04, 0x80, 0x02, 0x27, 0x00, 0x03, 0x04, 0x80, 0x00, 0xC6, 0x00, 0x03, 0x04, 0x80, 0x00, 0xE6, 0x00, 0x03, 0x04, 0x80, 0x00, 0x47, 0x00, 0x03, 0x0C, 0x80, 0x00, 0x67, 0x00, 0x03, 0x0C, 0x80, 0x00, 0x4B, 0x00, 0x03, 0x0C, 0x80, 0x00, 0x6B, 0x00, 0x03, 0x0C, 0x80, 0x00, 0x4F, 0x00, 0x03, 0x28, 0x80, 0x00, 0x6F, 0x00, 0x03, 0x28, 0x80, 0x01, 0xEA, 0x00, 0x03, 0x04, 0x80, 0x01, 0xEB, 0x00, 0x03, 0x04, 0x80, 0x01, 0xB7, 0x00, 0x03, 0x0C, 0x80, 0x02, 0x92, 0x00, 0x03, 0x0C, 0x80, 0x00, 0x6A, 0x00, 0x03, 0x0C, 0xC0, 0x00, 0x44, 0x00, 0x00, 0x5A, 0xC0, 0x00, 0x44, 0x00, 0x00, 0x7A, 0xC0, 0x00, 0x64, 0x00, 0x00, 0x7A, 0x80, 0x00, 0x47, 0x00, 0x03, 0x01, 0x80, 0x00, 0x67, 0x00, 0x03, 0x01, 0x80, 0x00, 0x4E, 0x00, 0x03, 0x00, 0x80, 0x00, 0x6E, 0x00, 0x03, 0x00, 0x80, 0x00, 0xC5, 0x00, 0x03, 0x01, 0x80, 0x00, 0xE5, 0x00, 0x03, 0x01, 0x80, 0x00, 0xC6, 0x00, 0x03, 0x01, 0x80, 0x00, 0xE6, 0x00, 0x03, 0x01, 0x80, 0x00, 0xD8, 0x00, 0x03, 0x01, 0x80, 0x00, 0xF8, 0x00, 0x03, 0x01, 0x80, 0x00, 0x41, 0x00, 0x03, 0x0F, 0x80, 0x00, 0x61, 0x00, 0x03, 0x0F, 0x80, 0x00, 0x41, 0x00, 0x03, 0x11, 0x80, 0x00, 0x61, 0x00, 0x03, 0x11, 0x80, 0x00, 0x45, 0x00, 0x03, 0x0F, 0x80, 0x00, 0x65, 0x00, 0x03, 0x0F, 0x80, 0x00, 0x45, 0x00, 0x03, 0x11, 0x80, 0x00, 0x65, 0x00, 0x03, 0x11, 0x80, 0x00, 0x49, 0x00, 0x03, 0x0F, 0x80, 0x00, 0x69, 0x00, 0x03, 0x0F, 0x80, 0x00, 0x49, 0x00, 0x03, 0x11, 0x80, 0x00, 0x69, 0x00, 0x03, 0x11, 0x80, 0x00, 0x4F, 0x00, 0x03, 0x0F, 0x80, 0x00, 0x6F, 0x00, 0x03, 0x0F, 0x80, 0x00, 0x4F, 0x00, 0x03, 0x11, 0x80, 0x00, 0x6F, 0x00, 0x03, 0x11, 0x80, 0x00, 0x52, 0x00, 0x03, 0x0F, 0x80, 0x00, 0x72, 0x00, 0x03, 0x0F, 0x80, 0x00, 0x52, 0x00, 0x03, 0x11, 0x80, 0x00, 0x72, 0x00, 0x03, 0x11, 0x80, 0x00, 0x55, 0x00, 0x03, 0x0F, 0x80, 0x00, 0x75, 0x00, 0x03, 0x0F, 0x80, 0x00, 0x55, 0x00, 0x03, 0x11, 0x80, 0x00, 0x75, 0x00, 0x03, 0x11, 0x80, 0x00, 0x53, 0x00, 0x03, 0x26, 0x80, 0x00, 0x73, 0x00, 0x03, 0x26, 0x80, 0x00, 0x54, 0x00, 0x03, 0x26, 0x80, 0x00, 0x74, 0x00, 0x03, 0x26, 0x80, 0x00, 0x48, 0x00, 0x03, 0x0C, 0x80, 0x00, 0x68, 0x00, 0x03, 0x0C, 0x80, 0x00, 0x41, 0x00, 0x03, 0x07, 0x80, 0x00, 0x61, 0x00, 0x03, 0x07, 0x80, 0x00, 0x45, 0x00, 0x03, 0x27, 0x80, 0x00, 0x65, 0x00, 0x03, 0x27, 0x80, 0x00, 0xD6, 0x00, 0x03, 0x04, 0x80, 0x00, 0xF6, 0x00, 0x03, 0x04, 0x80, 0x00, 0xD5, 0x00, 0x03, 0x04, 0x80, 0x00, 0xF5, 0x00, 0x03, 0x04, 0x80, 0x00, 0x4F, 0x00, 0x03, 0x07, 0x80, 0x00, 0x6F, 0x00, 0x03, 0x07, 0x80, 0x02, 0x2E, 0x00, 0x03, 0x04, 0x80, 0x02, 0x2F, 0x00, 0x03, 0x04, 0x80, 0x00, 0x59, 0x00, 0x03, 0x04, 0x80, 0x00, 0x79, 0x00, 0x03, 0x04, 0x20, 0x00, 0x68, 0x20, 0x02, 0x66, 0x20, 0x00, 0x6A, 0x20, 0x00, 0x72, 0x20, 0x02, 0x79, 0x20, 0x02, 0x7B, 0x20, 0x02, 0x81, 0x20, 0x00, 0x77, 0x20, 0x00, 0x79, 0xC0, 0x00, 0x20, 0x00, 0x03, 0x06, 0xC0, 0x00, 0x20, 0x00, 0x03, 0x07, 0xC0, 0x00, 0x20, 0x00, 0x03, 0x0A, 0xC0, 0x00, 0x20, 0x00, 0x03, 0x28, 0xC0, 0x00, 0x20, 0x00, 0x03, 0x03, 0xC0, 0x00, 0x20, 0x00, 0x03, 0x0B, 0x20, 0x02, 0x63, 0x20, 0x00, 0x6C, 0x20, 0x00, 0x73, 0x20, 0x00, 0x78, 0x20, 0x02, 0x95, 0x00, 0x03, 0x00, 0x00, 0x03, 0x01, 0x00, 0x03, 0x13, 0x80, 0x03, 0x08, 0x00, 0x03, 0x01, 0x00, 0x02, 0xB9, 0xC0, 0x00, 0x20, 0x00, 0x03, 0x45, 0x00, 0x00, 0x3B, 0xC0, 0x00, 0x20, 0x00, 0x03, 0x01, 0x80, 0x00, 0xA8, 0x00, 0x03, 0x01, 0x80, 0x03, 0x91, 0x00, 0x03, 0x01, 0x00, 0x00, 0xB7, 0x80, 0x03, 0x95, 0x00, 0x03, 0x01, 0x80, 0x03, 0x97, 0x00, 0x03, 0x01, 0x80, 0x03, 0x99, 0x00, 0x03, 0x01, 0x80, 0x03, 0x9F, 0x00, 0x03, 0x01, 0x80, 0x03, 0xA5, 0x00, 0x03, 0x01, 0x80, 0x03, 0xA9, 0x00, 0x03, 0x01, 0x80, 0x03, 0xCA, 0x00, 0x03, 0x01, 0x80, 0x03, 0x99, 0x00, 0x03, 0x08, 0x80, 0x03, 0xA5, 0x00, 0x03, 0x08, 0x80, 0x03, 0xB1, 0x00, 0x03, 0x01, 0x80, 0x03, 0xB5, 0x00, 0x03, 0x01, 0x80, 0x03, 0xB7, 0x00, 0x03, 0x01, 0x80, 0x03, 0xB9, 0x00, 0x03, 0x01, 0x80, 0x03, 0xCB, 0x00, 0x03, 0x01, 0x80, 0x03, 0xB9, 0x00, 0x03, 0x08, 0x80, 0x03, 0xC5, 0x00, 0x03, 0x08, 0x80, 0x03, 0xBF, 0x00, 0x03, 0x01, 0x80, 0x03, 0xC5, 0x00, 0x03, 0x01, 0x80, 0x03, 0xC9, 0x00, 0x03, 0x01, 0x40, 0x03, 0xB2, 0x40, 0x03, 0xB8, 0x40, 0x03, 0xA5, 0x80, 0x03, 0xD2, 0x00, 0x03, 0x01, 0x80, 0x03, 0xD2, 0x00, 0x03, 0x08, 0x40, 0x03, 0xC6, 0x40, 0x03, 0xC0, 0x40, 0x03, 0xBA, 0x40, 0x03, 0xC1, 0x40, 0x03, 0xC2, 0x40, 0x03, 0x98, 0x40, 0x03, 0xB5, 0x40, 0x03, 0xA3, 0x80, 0x04, 0x15, 0x00, 0x03, 0x00, 0x80, 0x04, 0x15, 0x00, 0x03, 0x08, 0x80, 0x04, 0x13, 0x00, 0x03, 0x01, 0x80, 0x04, 0x06, 0x00, 0x03, 0x08, 0x80, 0x04, 0x1A, 0x00, 0x03, 0x01, 0x80, 0x04, 0x18, 0x00, 0x03, 0x00, 0x80, 0x04, 0x23, 0x00, 0x03, 0x06, 0x80, 0x04, 0x18, 0x00, 0x03, 0x06, 0x80, 0x04, 0x38, 0x00, 0x03, 0x06, 0x80, 0x04, 0x35, 0x00, 0x03, 0x00, 0x80, 0x04, 0x35, 0x00, 0x03, 0x08, 0x80, 0x04, 0x33, 0x00, 0x03, 0x01, 0x80, 0x04, 0x56, 0x00, 0x03, 0x08, 0x80, 0x04, 0x3A, 0x00, 0x03, 0x01, 0x80, 0x04, 0x38, 0x00, 0x03, 0x00, 0x80, 0x04, 0x43, 0x00, 0x03, 0x06, 0x80, 0x04, 0x74, 0x00, 0x03, 0x0F, 0x80, 0x04, 0x75, 0x00, 0x03, 0x0F, 0x80, 0x04, 0x16, 0x00, 0x03, 0x06, 0x80, 0x04, 0x36, 0x00, 0x03, 0x06, 0x80, 0x04, 0x10, 0x00, 0x03, 0x06, 0x80, 0x04, 0x30, 0x00, 0x03, 0x06, 0x80, 0x04, 0x10, 0x00, 0x03, 0x08, 0x80, 0x04, 0x30, 0x00, 0x03, 0x08, 0x80, 0x04, 0x15, 0x00, 0x03, 0x06, 0x80, 0x04, 0x35, 0x00, 0x03, 0x06, 0x80, 0x04, 0xD8, 0x00, 0x03, 0x08, 0x80, 0x04, 0xD9, 0x00, 0x03, 0x08, 0x80, 0x04, 0x16, 0x00, 0x03, 0x08, 0x80, 0x04, 0x36, 0x00, 0x03, 0x08, 0x80, 0x04, 0x17, 0x00, 0x03, 0x08, 0x80, 0x04, 0x37, 0x00, 0x03, 0x08, 0x80, 0x04, 0x18, 0x00, 0x03, 0x04, 0x80, 0x04, 0x38, 0x00, 0x03, 0x04, 0x80, 0x04, 0x18, 0x00, 0x03, 0x08, 0x80, 0x04, 0x38, 0x00, 0x03, 0x08, 0x80, 0x04, 0x1E, 0x00, 0x03, 0x08, 0x80, 0x04, 0x3E, 0x00, 0x03, 0x08, 0x80, 0x04, 0xE8, 0x00, 0x03, 0x08, 0x80, 0x04, 0xE9, 0x00, 0x03, 0x08, 0x80, 0x04, 0x2D, 0x00, 0x03, 0x08, 0x80, 0x04, 0x4D, 0x00, 0x03, 0x08, 0x80, 0x04, 0x23, 0x00, 0x03, 0x04, 0x80, 0x04, 0x43, 0x00, 0x03, 0x04, 0x80, 0x04, 0x23, 0x00, 0x03, 0x08, 0x80, 0x04, 0x43, 0x00, 0x03, 0x08, 0x80, 0x04, 0x23, 0x00, 0x03, 0x0B, 0x80, 0x04, 0x43, 0x00, 0x03, 0x0B, 0x80, 0x04, 0x27, 0x00, 0x03, 0x08, 0x80, 0x04, 0x47, 0x00, 0x03, 0x08, 0x80, 0x04, 0x2B, 0x00, 0x03, 0x08, 0x80, 0x04, 0x4B, 0x00, 0x03, 0x08, 0xC0, 0x05, 0x65, 0x00, 0x05, 0x82, 0x80, 0x06, 0x27, 0x00, 0x06, 0x53, 0x80, 0x06, 0x27, 0x00, 0x06, 0x54, 0x80, 0x06, 0x48, 0x00, 0x06, 0x54, 0x80, 0x06, 0x27, 0x00, 0x06, 0x55, 0x80, 0x06, 0x4A, 0x00, 0x06, 0x54, 0xC0, 0x06, 0x27, 0x00, 0x06, 0x74, 0xC0, 0x06, 0x48, 0x00, 0x06, 0x74, 0xC0, 0x06, 0xC7, 0x00, 0x06, 0x74, 0xC0, 0x06, 0x4A, 0x00, 0x06, 0x74, 0x80, 0x06, 0xD5, 0x00, 0x06, 0x54, 0x80, 0x06, 0xC1, 0x00, 0x06, 0x54, 0x80, 0x06, 0xD2, 0x00, 0x06, 0x54, 0x80, 0x09, 0x28, 0x00, 0x09, 0x3C, 0x80, 0x09, 0x30, 0x00, 0x09, 0x3C, 0x80, 0x09, 0x33, 0x00, 0x09, 0x3C, 0x80, 0x09, 0x15, 0x00, 0x09, 0x3C, 0x80, 0x09, 0x16, 0x00, 0x09, 0x3C, 0x80, 0x09, 0x17, 0x00, 0x09, 0x3C, 0x80, 0x09, 0x1C, 0x00, 0x09, 0x3C, 0x80, 0x09, 0x21, 0x00, 0x09, 0x3C, 0x80, 0x09, 0x22, 0x00, 0x09, 0x3C, 0x80, 0x09, 0x2B, 0x00, 0x09, 0x3C, 0x80, 0x09, 0x2F, 0x00, 0x09, 0x3C, 0x80, 0x09, 0xC7, 0x00, 0x09, 0xBE, 0x80, 0x09, 0xC7, 0x00, 0x09, 0xD7, 0x80, 0x09, 0xA1, 0x00, 0x09, 0xBC, 0x80, 0x09, 0xA2, 0x00, 0x09, 0xBC, 0x80, 0x09, 0xAF, 0x00, 0x09, 0xBC, 0x80, 0x0A, 0x32, 0x00, 0x0A, 0x3C, 0x80, 0x0A, 0x38, 0x00, 0x0A, 0x3C, 0x80, 0x0A, 0x16, 0x00, 0x0A, 0x3C, 0x80, 0x0A, 0x17, 0x00, 0x0A, 0x3C, 0x80, 0x0A, 0x1C, 0x00, 0x0A, 0x3C, 0x80, 0x0A, 0x2B, 0x00, 0x0A, 0x3C, 0x80, 0x0B, 0x47, 0x00, 0x0B, 0x56, 0x80, 0x0B, 0x47, 0x00, 0x0B, 0x3E, 0x80, 0x0B, 0x47, 0x00, 0x0B, 0x57, 0x80, 0x0B, 0x21, 0x00, 0x0B, 0x3C, 0x80, 0x0B, 0x22, 0x00, 0x0B, 0x3C, 0x80, 0x0B, 0x92, 0x00, 0x0B, 0xD7, 0x80, 0x0B, 0xC6, 0x00, 0x0B, 0xBE, 0x80, 0x0B, 0xC7, 0x00, 0x0B, 0xBE, 0x80, 0x0B, 0xC6, 0x00, 0x0B, 0xD7, 0x80, 0x0C, 0x46, 0x00, 0x0C, 0x56, 0x80, 0x0C, 0xBF, 0x00, 0x0C, 0xD5, 0x80, 0x0C, 0xC6, 0x00, 0x0C, 0xD5, 0x80, 0x0C, 0xC6, 0x00, 0x0C, 0xD6, 0x80, 0x0C, 0xC6, 0x00, 0x0C, 0xC2, 0x80, 0x0C, 0xCA, 0x00, 0x0C, 0xD5, 0x80, 0x0D, 0x46, 0x00, 0x0D, 0x3E, 0x80, 0x0D, 0x47, 0x00, 0x0D, 0x3E, 0x80, 0x0D, 0x46, 0x00, 0x0D, 0x57, 0x80, 0x0D, 0xD9, 0x00, 0x0D, 0xCA, 0x80, 0x0D, 0xD9, 0x00, 0x0D, 0xCF, 0x80, 0x0D, 0xDC, 0x00, 0x0D, 0xCA, 0x80, 0x0D, 0xD9, 0x00, 0x0D, 0xDF, 0xC0, 0x0E, 0x4D, 0x00, 0x0E, 0x32, 0xC0, 0x0E, 0xCD, 0x00, 0x0E, 0xB2, 0xC0, 0x0E, 0xAB, 0x00, 0x0E, 0x99, 0xC0, 0x0E, 0xAB, 0x00, 0x0E, 0xA1, 0x08, 0x0F, 0x0B, 0x80, 0x0F, 0x42, 0x00, 0x0F, 0xB7, 0x80, 0x0F, 0x4C, 0x00, 0x0F, 0xB7, 0x80, 0x0F, 0x51, 0x00, 0x0F, 0xB7, 0x80, 0x0F, 0x56, 0x00, 0x0F, 0xB7, 0x80, 0x0F, 0x5B, 0x00, 0x0F, 0xB7, 0x80, 0x0F, 0x40, 0x00, 0x0F, 0xB5, 0x80, 0x0F, 0x71, 0x00, 0x0F, 0x72, 0x80, 0x0F, 0x71, 0x00, 0x0F, 0x74, 0x80, 0x0F, 0xB2, 0x00, 0x0F, 0x80, 0xC0, 0x0F, 0xB2, 0x00, 0x0F, 0x81, 0x80, 0x0F, 0xB3, 0x00, 0x0F, 0x80, 0xC0, 0x0F, 0xB3, 0x00, 0x0F, 0x81, 0x80, 0x0F, 0x71, 0x00, 0x0F, 0x80, 0x80, 0x0F, 0x92, 0x00, 0x0F, 0xB7, 0x80, 0x0F, 0x9C, 0x00, 0x0F, 0xB7, 0x80, 0x0F, 0xA1, 0x00, 0x0F, 0xB7, 0x80, 0x0F, 0xA6, 0x00, 0x0F, 0xB7, 0x80, 0x0F, 0xAB, 0x00, 0x0F, 0xB7, 0x80, 0x0F, 0x90, 0x00, 0x0F, 0xB5, 0x80, 0x10, 0x25, 0x00, 0x10, 0x2E, 0x20, 0x10, 0xDC, 0x80, 0x1B, 0x05, 0x00, 0x1B, 0x35, 0x80, 0x1B, 0x07, 0x00, 0x1B, 0x35, 0x80, 0x1B, 0x09, 0x00, 0x1B, 0x35, 0x80, 0x1B, 0x0B, 0x00, 0x1B, 0x35, 0x80, 0x1B, 0x0D, 0x00, 0x1B, 0x35, 0x80, 0x1B, 0x11, 0x00, 0x1B, 0x35, 0x80, 0x1B, 0x3A, 0x00, 0x1B, 0x35, 0x80, 0x1B, 0x3C, 0x00, 0x1B, 0x35, 0x80, 0x1B, 0x3E, 0x00, 0x1B, 0x35, 0x80, 0x1B, 0x3F, 0x00, 0x1B, 0x35, 0x80, 0x1B, 0x42, 0x00, 0x1B, 0x35, 0x20, 0x00, 0x41, 0x20, 0x00, 0xC6, 0x20, 0x00, 0x42, 0x20, 0x00, 0x44, 0x20, 0x00, 0x45, 0x20, 0x01, 0x8E, 0x20, 0x00, 0x47, 0x20, 0x00, 0x48, 0x20, 0x00, 0x49, 0x20, 0x00, 0x4A, 0x20, 0x00, 0x4B, 0x20, 0x00, 0x4C, 0x20, 0x00, 0x4D, 0x20, 0x00, 0x4E, 0x20, 0x00, 0x4F, 0x20, 0x02, 0x22, 0x20, 0x00, 0x50, 0x20, 0x00, 0x52, 0x20, 0x00, 0x54, 0x20, 0x00, 0x55, 0x20, 0x00, 0x57, 0x20, 0x00, 0x61, 0x20, 0x02, 0x50, 0x20, 0x02, 0x51, 0x20, 0x1D, 0x02, 0x20, 0x00, 0x62, 0x20, 0x00, 0x64, 0x20, 0x00, 0x65, 0x20, 0x02, 0x59, 0x20, 0x02, 0x5B, 0x20, 0x02, 0x5C, 0x20, 0x00, 0x67, 0x20, 0x00, 0x6B, 0x20, 0x00, 0x6D, 0x20, 0x01, 0x4B, 0x20, 0x00, 0x6F, 0x20, 0x02, 0x54, 0x20, 0x1D, 0x16, 0x20, 0x1D, 0x17, 0x20, 0x00, 0x70, 0x20, 0x00, 0x74, 0x20, 0x00, 0x75, 0x20, 0x1D, 0x1D, 0x20, 0x02, 0x6F, 0x20, 0x00, 0x76, 0x20, 0x1D, 0x25, 0x20, 0x03, 0xB2, 0x20, 0x03, 0xB3, 0x20, 0x03, 0xB4, 0x20, 0x03, 0xC6, 0x20, 0x03, 0xC7, 0x24, 0x00, 0x69, 0x24, 0x00, 0x72, 0x24, 0x00, 0x75, 0x24, 0x00, 0x76, 0x24, 0x03, 0xB2, 0x24, 0x03, 0xB3, 0x24, 0x03, 0xC1, 0x24, 0x03, 0xC6, 0x24, 0x03, 0xC7, 0x20, 0x04, 0x3D, 0x20, 0x02, 0x52, 0x20, 0x00, 0x63, 0x20, 0x02, 0x55, 0x20, 0x00, 0xF0, 0x20, 0x02, 0x5C, 0x20, 0x00, 0x66, 0x20, 0x02, 0x5F, 0x20, 0x02, 0x61, 0x20, 0x02, 0x65, 0x20, 0x02, 0x68, 0x20, 0x02, 0x69, 0x20, 0x02, 0x6A, 0x20, 0x1D, 0x7B, 0x20, 0x02, 0x9D, 0x20, 0x02, 0x6D, 0x20, 0x1D, 0x85, 0x20, 0x02, 0x9F, 0x20, 0x02, 0x71, 0x20, 0x02, 0x70, 0x20, 0x02, 0x72, 0x20, 0x02, 0x73, 0x20, 0x02, 0x74, 0x20, 0x02, 0x75, 0x20, 0x02, 0x78, 0x20, 0x02, 0x82, 0x20, 0x02, 0x83, 0x20, 0x01, 0xAB, 0x20, 0x02, 0x89, 0x20, 0x02, 0x8A, 0x20, 0x1D, 0x1C, 0x20, 0x02, 0x8B, 0x20, 0x02, 0x8C, 0x20, 0x00, 0x7A, 0x20, 0x02, 0x90, 0x20, 0x02, 0x91, 0x20, 0x02, 0x92, 0x20, 0x03, 0xB8, 0x80, 0x00, 0x41, 0x00, 0x03, 0x25, 0x80, 0x00, 0x61, 0x00, 0x03, 0x25, 0x80, 0x00, 0x42, 0x00, 0x03, 0x07, 0x80, 0x00, 0x62, 0x00, 0x03, 0x07, 0x80, 0x00, 0x42, 0x00, 0x03, 0x23, 0x80, 0x00, 0x62, 0x00, 0x03, 0x23, 0x80, 0x00, 0x42, 0x00, 0x03, 0x31, 0x80, 0x00, 0x62, 0x00, 0x03, 0x31, 0x80, 0x00, 0xC7, 0x00, 0x03, 0x01, 0x80, 0x00, 0xE7, 0x00, 0x03, 0x01, 0x80, 0x00, 0x44, 0x00, 0x03, 0x07, 0x80, 0x00, 0x64, 0x00, 0x03, 0x07, 0x80, 0x00, 0x44, 0x00, 0x03, 0x23, 0x80, 0x00, 0x64, 0x00, 0x03, 0x23, 0x80, 0x00, 0x44, 0x00, 0x03, 0x31, 0x80, 0x00, 0x64, 0x00, 0x03, 0x31, 0x80, 0x00, 0x44, 0x00, 0x03, 0x27, 0x80, 0x00, 0x64, 0x00, 0x03, 0x27, 0x80, 0x00, 0x44, 0x00, 0x03, 0x2D, 0x80, 0x00, 0x64, 0x00, 0x03, 0x2D, 0x80, 0x01, 0x12, 0x00, 0x03, 0x00, 0x80, 0x01, 0x13, 0x00, 0x03, 0x00, 0x80, 0x01, 0x12, 0x00, 0x03, 0x01, 0x80, 0x01, 0x13, 0x00, 0x03, 0x01, 0x80, 0x00, 0x45, 0x00, 0x03, 0x2D, 0x80, 0x00, 0x65, 0x00, 0x03, 0x2D, 0x80, 0x00, 0x45, 0x00, 0x03, 0x30, 0x80, 0x00, 0x65, 0x00, 0x03, 0x30, 0x80, 0x02, 0x28, 0x00, 0x03, 0x06, 0x80, 0x02, 0x29, 0x00, 0x03, 0x06, 0x80, 0x00, 0x46, 0x00, 0x03, 0x07, 0x80, 0x00, 0x66, 0x00, 0x03, 0x07, 0x80, 0x00, 0x47, 0x00, 0x03, 0x04, 0x80, 0x00, 0x67, 0x00, 0x03, 0x04, 0x80, 0x00, 0x48, 0x00, 0x03, 0x07, 0x80, 0x00, 0x68, 0x00, 0x03, 0x07, 0x80, 0x00, 0x48, 0x00, 0x03, 0x23, 0x80, 0x00, 0x68, 0x00, 0x03, 0x23, 0x80, 0x00, 0x48, 0x00, 0x03, 0x08, 0x80, 0x00, 0x68, 0x00, 0x03, 0x08, 0x80, 0x00, 0x48, 0x00, 0x03, 0x27, 0x80, 0x00, 0x68, 0x00, 0x03, 0x27, 0x80, 0x00, 0x48, 0x00, 0x03, 0x2E, 0x80, 0x00, 0x68, 0x00, 0x03, 0x2E, 0x80, 0x00, 0x49, 0x00, 0x03, 0x30, 0x80, 0x00, 0x69, 0x00, 0x03, 0x30, 0x80, 0x00, 0xCF, 0x00, 0x03, 0x01, 0x80, 0x00, 0xEF, 0x00, 0x03, 0x01, 0x80, 0x00, 0x4B, 0x00, 0x03, 0x01, 0x80, 0x00, 0x6B, 0x00, 0x03, 0x01, 0x80, 0x00, 0x4B, 0x00, 0x03, 0x23, 0x80, 0x00, 0x6B, 0x00, 0x03, 0x23, 0x80, 0x00, 0x4B, 0x00, 0x03, 0x31, 0x80, 0x00, 0x6B, 0x00, 0x03, 0x31, 0x80, 0x00, 0x4C, 0x00, 0x03, 0x23, 0x80, 0x00, 0x6C, 0x00, 0x03, 0x23, 0x80, 0x1E, 0x36, 0x00, 0x03, 0x04, 0x80, 0x1E, 0x37, 0x00, 0x03, 0x04, 0x80, 0x00, 0x4C, 0x00, 0x03, 0x31, 0x80, 0x00, 0x6C, 0x00, 0x03, 0x31, 0x80, 0x00, 0x4C, 0x00, 0x03, 0x2D, 0x80, 0x00, 0x6C, 0x00, 0x03, 0x2D, 0x80, 0x00, 0x4D, 0x00, 0x03, 0x01, 0x80, 0x00, 0x6D, 0x00, 0x03, 0x01, 0x80, 0x00, 0x4D, 0x00, 0x03, 0x07, 0x80, 0x00, 0x6D, 0x00, 0x03, 0x07, 0x80, 0x00, 0x4D, 0x00, 0x03, 0x23, 0x80, 0x00, 0x6D, 0x00, 0x03, 0x23, 0x80, 0x00, 0x4E, 0x00, 0x03, 0x07, 0x80, 0x00, 0x6E, 0x00, 0x03, 0x07, 0x80, 0x00, 0x4E, 0x00, 0x03, 0x23, 0x80, 0x00, 0x6E, 0x00, 0x03, 0x23, 0x80, 0x00, 0x4E, 0x00, 0x03, 0x31, 0x80, 0x00, 0x6E, 0x00, 0x03, 0x31, 0x80, 0x00, 0x4E, 0x00, 0x03, 0x2D, 0x80, 0x00, 0x6E, 0x00, 0x03, 0x2D, 0x80, 0x00, 0xD5, 0x00, 0x03, 0x01, 0x80, 0x00, 0xF5, 0x00, 0x03, 0x01, 0x80, 0x00, 0xD5, 0x00, 0x03, 0x08, 0x80, 0x00, 0xF5, 0x00, 0x03, 0x08, 0x80, 0x01, 0x4C, 0x00, 0x03, 0x00, 0x80, 0x01, 0x4D, 0x00, 0x03, 0x00, 0x80, 0x01, 0x4C, 0x00, 0x03, 0x01, 0x80, 0x01, 0x4D, 0x00, 0x03, 0x01, 0x80, 0x00, 0x50, 0x00, 0x03, 0x01, 0x80, 0x00, 0x70, 0x00, 0x03, 0x01, 0x80, 0x00, 0x50, 0x00, 0x03, 0x07, 0x80, 0x00, 0x70, 0x00, 0x03, 0x07, 0x80, 0x00, 0x52, 0x00, 0x03, 0x07, 0x80, 0x00, 0x72, 0x00, 0x03, 0x07, 0x80, 0x00, 0x52, 0x00, 0x03, 0x23, 0x80, 0x00, 0x72, 0x00, 0x03, 0x23, 0x80, 0x1E, 0x5A, 0x00, 0x03, 0x04, 0x80, 0x1E, 0x5B, 0x00, 0x03, 0x04, 0x80, 0x00, 0x52, 0x00, 0x03, 0x31, 0x80, 0x00, 0x72, 0x00, 0x03, 0x31, 0x80, 0x00, 0x53, 0x00, 0x03, 0x07, 0x80, 0x00, 0x73, 0x00, 0x03, 0x07, 0x80, 0x00, 0x53, 0x00, 0x03, 0x23, 0x80, 0x00, 0x73, 0x00, 0x03, 0x23, 0x80, 0x01, 0x5A, 0x00, 0x03, 0x07, 0x80, 0x01, 0x5B, 0x00, 0x03, 0x07, 0x80, 0x01, 0x60, 0x00, 0x03, 0x07, 0x80, 0x01, 0x61, 0x00, 0x03, 0x07, 0x80, 0x1E, 0x62, 0x00, 0x03, 0x07, 0x80, 0x1E, 0x63, 0x00, 0x03, 0x07, 0x80, 0x00, 0x54, 0x00, 0x03, 0x07, 0x80, 0x00, 0x74, 0x00, 0x03, 0x07, 0x80, 0x00, 0x54, 0x00, 0x03, 0x23, 0x80, 0x00, 0x74, 0x00, 0x03, 0x23, 0x80, 0x00, 0x54, 0x00, 0x03, 0x31, 0x80, 0x00, 0x74, 0x00, 0x03, 0x31, 0x80, 0x00, 0x54, 0x00, 0x03, 0x2D, 0x80, 0x00, 0x74, 0x00, 0x03, 0x2D, 0x80, 0x00, 0x55, 0x00, 0x03, 0x24, 0x80, 0x00, 0x75, 0x00, 0x03, 0x24, 0x80, 0x00, 0x55, 0x00, 0x03, 0x30, 0x80, 0x00, 0x75, 0x00, 0x03, 0x30, 0x80, 0x00, 0x55, 0x00, 0x03, 0x2D, 0x80, 0x00, 0x75, 0x00, 0x03, 0x2D, 0x80, 0x01, 0x68, 0x00, 0x03, 0x01, 0x80, 0x01, 0x69, 0x00, 0x03, 0x01, 0x80, 0x01, 0x6A, 0x00, 0x03, 0x08, 0x80, 0x01, 0x6B, 0x00, 0x03, 0x08, 0x80, 0x00, 0x56, 0x00, 0x03, 0x03, 0x80, 0x00, 0x76, 0x00, 0x03, 0x03, 0x80, 0x00, 0x56, 0x00, 0x03, 0x23, 0x80, 0x00, 0x76, 0x00, 0x03, 0x23, 0x80, 0x00, 0x57, 0x00, 0x03, 0x00, 0x80, 0x00, 0x77, 0x00, 0x03, 0x00, 0x80, 0x00, 0x57, 0x00, 0x03, 0x01, 0x80, 0x00, 0x77, 0x00, 0x03, 0x01, 0x80, 0x00, 0x57, 0x00, 0x03, 0x08, 0x80, 0x00, 0x77, 0x00, 0x03, 0x08, 0x80, 0x00, 0x57, 0x00, 0x03, 0x07, 0x80, 0x00, 0x77, 0x00, 0x03, 0x07, 0x80, 0x00, 0x57, 0x00, 0x03, 0x23, 0x80, 0x00, 0x77, 0x00, 0x03, 0x23, 0x80, 0x00, 0x58, 0x00, 0x03, 0x07, 0x80, 0x00, 0x78, 0x00, 0x03, 0x07, 0x80, 0x00, 0x58, 0x00, 0x03, 0x08, 0x80, 0x00, 0x78, 0x00, 0x03, 0x08, 0x80, 0x00, 0x59, 0x00, 0x03, 0x07, 0x80, 0x00, 0x79, 0x00, 0x03, 0x07, 0x80, 0x00, 0x5A, 0x00, 0x03, 0x02, 0x80, 0x00, 0x7A, 0x00, 0x03, 0x02, 0x80, 0x00, 0x5A, 0x00, 0x03, 0x23, 0x80, 0x00, 0x7A, 0x00, 0x03, 0x23, 0x80, 0x00, 0x5A, 0x00, 0x03, 0x31, 0x80, 0x00, 0x7A, 0x00, 0x03, 0x31, 0x80, 0x00, 0x68, 0x00, 0x03, 0x31, 0x80, 0x00, 0x74, 0x00, 0x03, 0x08, 0x80, 0x00, 0x77, 0x00, 0x03, 0x0A, 0x80, 0x00, 0x79, 0x00, 0x03, 0x0A, 0xC0, 0x00, 0x61, 0x00, 0x02, 0xBE, 0x80, 0x01, 0x7F, 0x00, 0x03, 0x07, 0x80, 0x00, 0x41, 0x00, 0x03, 0x23, 0x80, 0x00, 0x61, 0x00, 0x03, 0x23, 0x80, 0x00, 0x41, 0x00, 0x03, 0x09, 0x80, 0x00, 0x61, 0x00, 0x03, 0x09, 0x80, 0x00, 0xC2, 0x00, 0x03, 0x01, 0x80, 0x00, 0xE2, 0x00, 0x03, 0x01, 0x80, 0x00, 0xC2, 0x00, 0x03, 0x00, 0x80, 0x00, 0xE2, 0x00, 0x03, 0x00, 0x80, 0x00, 0xC2, 0x00, 0x03, 0x09, 0x80, 0x00, 0xE2, 0x00, 0x03, 0x09, 0x80, 0x00, 0xC2, 0x00, 0x03, 0x03, 0x80, 0x00, 0xE2, 0x00, 0x03, 0x03, 0x80, 0x1E, 0xA0, 0x00, 0x03, 0x02, 0x80, 0x1E, 0xA1, 0x00, 0x03, 0x02, 0x80, 0x01, 0x02, 0x00, 0x03, 0x01, 0x80, 0x01, 0x03, 0x00, 0x03, 0x01, 0x80, 0x01, 0x02, 0x00, 0x03, 0x00, 0x80, 0x01, 0x03, 0x00, 0x03, 0x00, 0x80, 0x01, 0x02, 0x00, 0x03, 0x09, 0x80, 0x01, 0x03, 0x00, 0x03, 0x09, 0x80, 0x01, 0x02, 0x00, 0x03, 0x03, 0x80, 0x01, 0x03, 0x00, 0x03, 0x03, 0x80, 0x1E, 0xA0, 0x00, 0x03, 0x06, 0x80, 0x1E, 0xA1, 0x00, 0x03, 0x06, 0x80, 0x00, 0x45, 0x00, 0x03, 0x23, 0x80, 0x00, 0x65, 0x00, 0x03, 0x23, 0x80, 0x00, 0x45, 0x00, 0x03, 0x09, 0x80, 0x00, 0x65, 0x00, 0x03, 0x09, 0x80, 0x00, 0x45, 0x00, 0x03, 0x03, 0x80, 0x00, 0x65, 0x00, 0x03, 0x03, 0x80, 0x00, 0xCA, 0x00, 0x03, 0x01, 0x80, 0x00, 0xEA, 0x00, 0x03, 0x01, 0x80, 0x00, 0xCA, 0x00, 0x03, 0x00, 0x80, 0x00, 0xEA, 0x00, 0x03, 0x00, 0x80, 0x00, 0xCA, 0x00, 0x03, 0x09, 0x80, 0x00, 0xEA, 0x00, 0x03, 0x09, 0x80, 0x00, 0xCA, 0x00, 0x03, 0x03, 0x80, 0x00, 0xEA, 0x00, 0x03, 0x03, 0x80, 0x1E, 0xB8, 0x00, 0x03, 0x02, 0x80, 0x1E, 0xB9, 0x00, 0x03, 0x02, 0x80, 0x00, 0x49, 0x00, 0x03, 0x09, 0x80, 0x00, 0x69, 0x00, 0x03, 0x09, 0x80, 0x00, 0x49, 0x00, 0x03, 0x23, 0x80, 0x00, 0x69, 0x00, 0x03, 0x23, 0x80, 0x00, 0x4F, 0x00, 0x03, 0x23, 0x80, 0x00, 0x6F, 0x00, 0x03, 0x23, 0x80, 0x00, 0x4F, 0x00, 0x03, 0x09, 0x80, 0x00, 0x6F, 0x00, 0x03, 0x09, 0x80, 0x00, 0xD4, 0x00, 0x03, 0x01, 0x80, 0x00, 0xF4, 0x00, 0x03, 0x01, 0x80, 0x00, 0xD4, 0x00, 0x03, 0x00, 0x80, 0x00, 0xF4, 0x00, 0x03, 0x00, 0x80, 0x00, 0xD4, 0x00, 0x03, 0x09, 0x80, 0x00, 0xF4, 0x00, 0x03, 0x09, 0x80, 0x00, 0xD4, 0x00, 0x03, 0x03, 0x80, 0x00, 0xF4, 0x00, 0x03, 0x03, 0x80, 0x1E, 0xCC, 0x00, 0x03, 0x02, 0x80, 0x1E, 0xCD, 0x00, 0x03, 0x02, 0x80, 0x01, 0xA0, 0x00, 0x03, 0x01, 0x80, 0x01, 0xA1, 0x00, 0x03, 0x01, 0x80, 0x01, 0xA0, 0x00, 0x03, 0x00, 0x80, 0x01, 0xA1, 0x00, 0x03, 0x00, 0x80, 0x01, 0xA0, 0x00, 0x03, 0x09, 0x80, 0x01, 0xA1, 0x00, 0x03, 0x09, 0x80, 0x01, 0xA0, 0x00, 0x03, 0x03, 0x80, 0x01, 0xA1, 0x00, 0x03, 0x03, 0x80, 0x01, 0xA0, 0x00, 0x03, 0x23, 0x80, 0x01, 0xA1, 0x00, 0x03, 0x23, 0x80, 0x00, 0x55, 0x00, 0x03, 0x23, 0x80, 0x00, 0x75, 0x00, 0x03, 0x23, 0x80, 0x00, 0x55, 0x00, 0x03, 0x09, 0x80, 0x00, 0x75, 0x00, 0x03, 0x09, 0x80, 0x01, 0xAF, 0x00, 0x03, 0x01, 0x80, 0x01, 0xB0, 0x00, 0x03, 0x01, 0x80, 0x01, 0xAF, 0x00, 0x03, 0x00, 0x80, 0x01, 0xB0, 0x00, 0x03, 0x00, 0x80, 0x01, 0xAF, 0x00, 0x03, 0x09, 0x80, 0x01, 0xB0, 0x00, 0x03, 0x09, 0x80, 0x01, 0xAF, 0x00, 0x03, 0x03, 0x80, 0x01, 0xB0, 0x00, 0x03, 0x03, 0x80, 0x01, 0xAF, 0x00, 0x03, 0x23, 0x80, 0x01, 0xB0, 0x00, 0x03, 0x23, 0x80, 0x00, 0x59, 0x00, 0x03, 0x00, 0x80, 0x00, 0x79, 0x00, 0x03, 0x00, 0x80, 0x00, 0x59, 0x00, 0x03, 0x23, 0x80, 0x00, 0x79, 0x00, 0x03, 0x23, 0x80, 0x00, 0x59, 0x00, 0x03, 0x09, 0x80, 0x00, 0x79, 0x00, 0x03, 0x09, 0x80, 0x00, 0x59, 0x00, 0x03, 0x03, 0x80, 0x00, 0x79, 0x00, 0x03, 0x03, 0x80, 0x03, 0xB1, 0x00, 0x03, 0x13, 0x80, 0x03, 0xB1, 0x00, 0x03, 0x14, 0x80, 0x1F, 0x00, 0x00, 0x03, 0x00, 0x80, 0x1F, 0x01, 0x00, 0x03, 0x00, 0x80, 0x1F, 0x00, 0x00, 0x03, 0x01, 0x80, 0x1F, 0x01, 0x00, 0x03, 0x01, 0x80, 0x1F, 0x00, 0x00, 0x03, 0x42, 0x80, 0x1F, 0x01, 0x00, 0x03, 0x42, 0x80, 0x03, 0x91, 0x00, 0x03, 0x13, 0x80, 0x03, 0x91, 0x00, 0x03, 0x14, 0x80, 0x1F, 0x08, 0x00, 0x03, 0x00, 0x80, 0x1F, 0x09, 0x00, 0x03, 0x00, 0x80, 0x1F, 0x08, 0x00, 0x03, 0x01, 0x80, 0x1F, 0x09, 0x00, 0x03, 0x01, 0x80, 0x1F, 0x08, 0x00, 0x03, 0x42, 0x80, 0x1F, 0x09, 0x00, 0x03, 0x42, 0x80, 0x03, 0xB5, 0x00, 0x03, 0x13, 0x80, 0x03, 0xB5, 0x00, 0x03, 0x14, 0x80, 0x1F, 0x10, 0x00, 0x03, 0x00, 0x80, 0x1F, 0x11, 0x00, 0x03, 0x00, 0x80, 0x1F, 0x10, 0x00, 0x03, 0x01, 0x80, 0x1F, 0x11, 0x00, 0x03, 0x01, 0x80, 0x03, 0x95, 0x00, 0x03, 0x13, 0x80, 0x03, 0x95, 0x00, 0x03, 0x14, 0x80, 0x1F, 0x18, 0x00, 0x03, 0x00, 0x80, 0x1F, 0x19, 0x00, 0x03, 0x00, 0x80, 0x1F, 0x18, 0x00, 0x03, 0x01, 0x80, 0x1F, 0x19, 0x00, 0x03, 0x01, 0x80, 0x03, 0xB7, 0x00, 0x03, 0x13, 0x80, 0x03, 0xB7, 0x00, 0x03, 0x14, 0x80, 0x1F, 0x20, 0x00, 0x03, 0x00, 0x80, 0x1F, 0x21, 0x00, 0x03, 0x00, 0x80, 0x1F, 0x20, 0x00, 0x03, 0x01, 0x80, 0x1F, 0x21, 0x00, 0x03, 0x01, 0x80, 0x1F, 0x20, 0x00, 0x03, 0x42, 0x80, 0x1F, 0x21, 0x00, 0x03, 0x42, 0x80, 0x03, 0x97, 0x00, 0x03, 0x13, 0x80, 0x03, 0x97, 0x00, 0x03, 0x14, 0x80, 0x1F, 0x28, 0x00, 0x03, 0x00, 0x80, 0x1F, 0x29, 0x00, 0x03, 0x00, 0x80, 0x1F, 0x28, 0x00, 0x03, 0x01, 0x80, 0x1F, 0x29, 0x00, 0x03, 0x01, 0x80, 0x1F, 0x28, 0x00, 0x03, 0x42, 0x80, 0x1F, 0x29, 0x00, 0x03, 0x42, 0x80, 0x03, 0xB9, 0x00, 0x03, 0x13, 0x80, 0x03, 0xB9, 0x00, 0x03, 0x14, 0x80, 0x1F, 0x30, 0x00, 0x03, 0x00, 0x80, 0x1F, 0x31, 0x00, 0x03, 0x00, 0x80, 0x1F, 0x30, 0x00, 0x03, 0x01, 0x80, 0x1F, 0x31, 0x00, 0x03, 0x01, 0x80, 0x1F, 0x30, 0x00, 0x03, 0x42, 0x80, 0x1F, 0x31, 0x00, 0x03, 0x42, 0x80, 0x03, 0x99, 0x00, 0x03, 0x13, 0x80, 0x03, 0x99, 0x00, 0x03, 0x14, 0x80, 0x1F, 0x38, 0x00, 0x03, 0x00, 0x80, 0x1F, 0x39, 0x00, 0x03, 0x00, 0x80, 0x1F, 0x38, 0x00, 0x03, 0x01, 0x80, 0x1F, 0x39, 0x00, 0x03, 0x01, 0x80, 0x1F, 0x38, 0x00, 0x03, 0x42, 0x80, 0x1F, 0x39, 0x00, 0x03, 0x42, 0x80, 0x03, 0xBF, 0x00, 0x03, 0x13, 0x80, 0x03, 0xBF, 0x00, 0x03, 0x14, 0x80, 0x1F, 0x40, 0x00, 0x03, 0x00, 0x80, 0x1F, 0x41, 0x00, 0x03, 0x00, 0x80, 0x1F, 0x40, 0x00, 0x03, 0x01, 0x80, 0x1F, 0x41, 0x00, 0x03, 0x01, 0x80, 0x03, 0x9F, 0x00, 0x03, 0x13, 0x80, 0x03, 0x9F, 0x00, 0x03, 0x14, 0x80, 0x1F, 0x48, 0x00, 0x03, 0x00, 0x80, 0x1F, 0x49, 0x00, 0x03, 0x00, 0x80, 0x1F, 0x48, 0x00, 0x03, 0x01, 0x80, 0x1F, 0x49, 0x00, 0x03, 0x01, 0x80, 0x03, 0xC5, 0x00, 0x03, 0x13, 0x80, 0x03, 0xC5, 0x00, 0x03, 0x14, 0x80, 0x1F, 0x50, 0x00, 0x03, 0x00, 0x80, 0x1F, 0x51, 0x00, 0x03, 0x00, 0x80, 0x1F, 0x50, 0x00, 0x03, 0x01, 0x80, 0x1F, 0x51, 0x00, 0x03, 0x01, 0x80, 0x1F, 0x50, 0x00, 0x03, 0x42, 0x80, 0x1F, 0x51, 0x00, 0x03, 0x42, 0x80, 0x03, 0xA5, 0x00, 0x03, 0x14, 0x80, 0x1F, 0x59, 0x00, 0x03, 0x00, 0x80, 0x1F, 0x59, 0x00, 0x03, 0x01, 0x80, 0x1F, 0x59, 0x00, 0x03, 0x42, 0x80, 0x03, 0xC9, 0x00, 0x03, 0x13, 0x80, 0x03, 0xC9, 0x00, 0x03, 0x14, 0x80, 0x1F, 0x60, 0x00, 0x03, 0x00, 0x80, 0x1F, 0x61, 0x00, 0x03, 0x00, 0x80, 0x1F, 0x60, 0x00, 0x03, 0x01, 0x80, 0x1F, 0x61, 0x00, 0x03, 0x01, 0x80, 0x1F, 0x60, 0x00, 0x03, 0x42, 0x80, 0x1F, 0x61, 0x00, 0x03, 0x42, 0x80, 0x03, 0xA9, 0x00, 0x03, 0x13, 0x80, 0x03, 0xA9, 0x00, 0x03, 0x14, 0x80, 0x1F, 0x68, 0x00, 0x03, 0x00, 0x80, 0x1F, 0x69, 0x00, 0x03, 0x00, 0x80, 0x1F, 0x68, 0x00, 0x03, 0x01, 0x80, 0x1F, 0x69, 0x00, 0x03, 0x01, 0x80, 0x1F, 0x68, 0x00, 0x03, 0x42, 0x80, 0x1F, 0x69, 0x00, 0x03, 0x42, 0x80, 0x03, 0xB1, 0x00, 0x03, 0x00, 0x00, 0x03, 0xAC, 0x80, 0x03, 0xB5, 0x00, 0x03, 0x00, 0x00, 0x03, 0xAD, 0x80, 0x03, 0xB7, 0x00, 0x03, 0x00, 0x00, 0x03, 0xAE, 0x80, 0x03, 0xB9, 0x00, 0x03, 0x00, 0x00, 0x03, 0xAF, 0x80, 0x03, 0xBF, 0x00, 0x03, 0x00, 0x00, 0x03, 0xCC, 0x80, 0x03, 0xC5, 0x00, 0x03, 0x00, 0x00, 0x03, 0xCD, 0x80, 0x03, 0xC9, 0x00, 0x03, 0x00, 0x00, 0x03, 0xCE, 0x80, 0x1F, 0x00, 0x00, 0x03, 0x45, 0x80, 0x1F, 0x01, 0x00, 0x03, 0x45, 0x80, 0x1F, 0x02, 0x00, 0x03, 0x45, 0x80, 0x1F, 0x03, 0x00, 0x03, 0x45, 0x80, 0x1F, 0x04, 0x00, 0x03, 0x45, 0x80, 0x1F, 0x05, 0x00, 0x03, 0x45, 0x80, 0x1F, 0x06, 0x00, 0x03, 0x45, 0x80, 0x1F, 0x07, 0x00, 0x03, 0x45, 0x80, 0x1F, 0x08, 0x00, 0x03, 0x45, 0x80, 0x1F, 0x09, 0x00, 0x03, 0x45, 0x80, 0x1F, 0x0A, 0x00, 0x03, 0x45, 0x80, 0x1F, 0x0B, 0x00, 0x03, 0x45, 0x80, 0x1F, 0x0C, 0x00, 0x03, 0x45, 0x80, 0x1F, 0x0D, 0x00, 0x03, 0x45, 0x80, 0x1F, 0x0E, 0x00, 0x03, 0x45, 0x80, 0x1F, 0x0F, 0x00, 0x03, 0x45, 0x80, 0x1F, 0x20, 0x00, 0x03, 0x45, 0x80, 0x1F, 0x21, 0x00, 0x03, 0x45, 0x80, 0x1F, 0x22, 0x00, 0x03, 0x45, 0x80, 0x1F, 0x23, 0x00, 0x03, 0x45, 0x80, 0x1F, 0x24, 0x00, 0x03, 0x45, 0x80, 0x1F, 0x25, 0x00, 0x03, 0x45, 0x80, 0x1F, 0x26, 0x00, 0x03, 0x45, 0x80, 0x1F, 0x27, 0x00, 0x03, 0x45, 0x80, 0x1F, 0x28, 0x00, 0x03, 0x45, 0x80, 0x1F, 0x29, 0x00, 0x03, 0x45, 0x80, 0x1F, 0x2A, 0x00, 0x03, 0x45, 0x80, 0x1F, 0x2B, 0x00, 0x03, 0x45, 0x80, 0x1F, 0x2C, 0x00, 0x03, 0x45, 0x80, 0x1F, 0x2D, 0x00, 0x03, 0x45, 0x80, 0x1F, 0x2E, 0x00, 0x03, 0x45, 0x80, 0x1F, 0x2F, 0x00, 0x03, 0x45, 0x80, 0x1F, 0x60, 0x00, 0x03, 0x45, 0x80, 0x1F, 0x61, 0x00, 0x03, 0x45, 0x80, 0x1F, 0x62, 0x00, 0x03, 0x45, 0x80, 0x1F, 0x63, 0x00, 0x03, 0x45, 0x80, 0x1F, 0x64, 0x00, 0x03, 0x45, 0x80, 0x1F, 0x65, 0x00, 0x03, 0x45, 0x80, 0x1F, 0x66, 0x00, 0x03, 0x45, 0x80, 0x1F, 0x67, 0x00, 0x03, 0x45, 0x80, 0x1F, 0x68, 0x00, 0x03, 0x45, 0x80, 0x1F, 0x69, 0x00, 0x03, 0x45, 0x80, 0x1F, 0x6A, 0x00, 0x03, 0x45, 0x80, 0x1F, 0x6B, 0x00, 0x03, 0x45, 0x80, 0x1F, 0x6C, 0x00, 0x03, 0x45, 0x80, 0x1F, 0x6D, 0x00, 0x03, 0x45, 0x80, 0x1F, 0x6E, 0x00, 0x03, 0x45, 0x80, 0x1F, 0x6F, 0x00, 0x03, 0x45, 0x80, 0x03, 0xB1, 0x00, 0x03, 0x06, 0x80, 0x03, 0xB1, 0x00, 0x03, 0x04, 0x80, 0x1F, 0x70, 0x00, 0x03, 0x45, 0x80, 0x03, 0xB1, 0x00, 0x03, 0x45, 0x80, 0x03, 0xAC, 0x00, 0x03, 0x45, 0x80, 0x03, 0xB1, 0x00, 0x03, 0x42, 0x80, 0x1F, 0xB6, 0x00, 0x03, 0x45, 0x80, 0x03, 0x91, 0x00, 0x03, 0x06, 0x80, 0x03, 0x91, 0x00, 0x03, 0x04, 0x80, 0x03, 0x91, 0x00, 0x03, 0x00, 0x00, 0x03, 0x86, 0x80, 0x03, 0x91, 0x00, 0x03, 0x45, 0xC0, 0x00, 0x20, 0x00, 0x03, 0x13, 0x00, 0x03, 0xB9, 0xC0, 0x00, 0x20, 0x00, 0x03, 0x13, 0xC0, 0x00, 0x20, 0x00, 0x03, 0x42, 0x80, 0x00, 0xA8, 0x00, 0x03, 0x42, 0x80, 0x1F, 0x74, 0x00, 0x03, 0x45, 0x80, 0x03, 0xB7, 0x00, 0x03, 0x45, 0x80, 0x03, 0xAE, 0x00, 0x03, 0x45, 0x80, 0x03, 0xB7, 0x00, 0x03, 0x42, 0x80, 0x1F, 0xC6, 0x00, 0x03, 0x45, 0x80, 0x03, 0x95, 0x00, 0x03, 0x00, 0x00, 0x03, 0x88, 0x80, 0x03, 0x97, 0x00, 0x03, 0x00, 0x00, 0x03, 0x89, 0x80, 0x03, 0x97, 0x00, 0x03, 0x45, 0x80, 0x1F, 0xBF, 0x00, 0x03, 0x00, 0x80, 0x1F, 0xBF, 0x00, 0x03, 0x01, 0x80, 0x1F, 0xBF, 0x00, 0x03, 0x42, 0x80, 0x03, 0xB9, 0x00, 0x03, 0x06, 0x80, 0x03, 0xB9, 0x00, 0x03, 0x04, 0x80, 0x03, 0xCA, 0x00, 0x03, 0x00, 0x00, 0x03, 0x90, 0x80, 0x03, 0xB9, 0x00, 0x03, 0x42, 0x80, 0x03, 0xCA, 0x00, 0x03, 0x42, 0x80, 0x03, 0x99, 0x00, 0x03, 0x06, 0x80, 0x03, 0x99, 0x00, 0x03, 0x04, 0x80, 0x03, 0x99, 0x00, 0x03, 0x00, 0x00, 0x03, 0x8A, 0x80, 0x1F, 0xFE, 0x00, 0x03, 0x00, 0x80, 0x1F, 0xFE, 0x00, 0x03, 0x01, 0x80, 0x1F, 0xFE, 0x00, 0x03, 0x42, 0x80, 0x03, 0xC5, 0x00, 0x03, 0x06, 0x80, 0x03, 0xC5, 0x00, 0x03, 0x04, 0x80, 0x03, 0xCB, 0x00, 0x03, 0x00, 0x00, 0x03, 0xB0, 0x80, 0x03, 0xC1, 0x00, 0x03, 0x13, 0x80, 0x03, 0xC1, 0x00, 0x03, 0x14, 0x80, 0x03, 0xC5, 0x00, 0x03, 0x42, 0x80, 0x03, 0xCB, 0x00, 0x03, 0x42, 0x80, 0x03, 0xA5, 0x00, 0x03, 0x06, 0x80, 0x03, 0xA5, 0x00, 0x03, 0x04, 0x80, 0x03, 0xA5, 0x00, 0x03, 0x00, 0x00, 0x03, 0x8E, 0x80, 0x03, 0xA1, 0x00, 0x03, 0x14, 0x80, 0x00, 0xA8, 0x00, 0x03, 0x00, 0x00, 0x03, 0x85, 0x00, 0x00, 0x60, 0x80, 0x1F, 0x7C, 0x00, 0x03, 0x45, 0x80, 0x03, 0xC9, 0x00, 0x03, 0x45, 0x80, 0x03, 0xCE, 0x00, 0x03, 0x45, 0x80, 0x03, 0xC9, 0x00, 0x03, 0x42, 0x80, 0x1F, 0xF6, 0x00, 0x03, 0x45, 0x80, 0x03, 0x9F, 0x00, 0x03, 0x00, 0x00, 0x03, 0x8C, 0x80, 0x03, 0xA9, 0x00, 0x03, 0x00, 0x00, 0x03, 0x8F, 0x80, 0x03, 0xA9, 0x00, 0x03, 0x45, 0x00, 0x00, 0xB4, 0xC0, 0x00, 0x20, 0x00, 0x03, 0x14, 0x00, 0x20, 0x02, 0x00, 0x20, 0x03, 0x40, 0x00, 0x20, 0x40, 0x00, 0x20, 0x40, 0x00, 0x20, 0x40, 0x00, 0x20, 0x40, 0x00, 0x20, 0x08, 0x00, 0x20, 0x40, 0x00, 0x20, 0x40, 0x00, 0x20, 0x40, 0x00, 0x20, 0x08, 0x20, 0x10, 0xC0, 0x00, 0x20, 0x00, 0x03, 0x33, 0x40, 0x00, 0x2E, 0xC0, 0x00, 0x2E, 0x00, 0x00, 0x2E, 0xC0, 0x00, 0x2E, 0x80, 0x00, 0x2E, 0x00, 0x00, 0x2E, 0x08, 0x00, 0x20, 0xC0, 0x20, 0x32, 0x00, 0x20, 0x32, 0xC0, 0x20, 0x32, 0x80, 0x20, 0x32, 0x00, 0x20, 0x32, 0xC0, 0x20, 0x35, 0x00, 0x20, 0x35, 0xC0, 0x20, 0x35, 0x80, 0x20, 0x35, 0x00, 0x20, 0x35, 0xC0, 0x00, 0x21, 0x00, 0x00, 0x21, 0xC0, 0x00, 0x20, 0x00, 0x03, 0x05, 0xC0, 0x00, 0x3F, 0x00, 0x00, 0x3F, 0xC0, 0x00, 0x3F, 0x00, 0x00, 0x21, 0xC0, 0x00, 0x21, 0x00, 0x00, 0x3F, 0xC0, 0x20, 0x32, 0x80, 0x20, 0x32, 0x80, 0x20, 0x32, 0x00, 0x20, 0x32, 0x40, 0x00, 0x20, 0x20, 0x00, 0x30, 0x20, 0x00, 0x69, 0x20, 0x00, 0x34, 0x20, 0x00, 0x35, 0x20, 0x00, 0x36, 0x20, 0x00, 0x37, 0x20, 0x00, 0x38, 0x20, 0x00, 0x39, 0x20, 0x00, 0x2B, 0x20, 0x22, 0x12, 0x20, 0x00, 0x3D, 0x20, 0x00, 0x28, 0x20, 0x00, 0x29, 0x20, 0x00, 0x6E, 0x24, 0x00, 0x30, 0x24, 0x00, 0x31, 0x24, 0x00, 0x32, 0x24, 0x00, 0x33, 0x24, 0x00, 0x34, 0x24, 0x00, 0x35, 0x24, 0x00, 0x36, 0x24, 0x00, 0x37, 0x24, 0x00, 0x38, 0x24, 0x00, 0x39, 0x24, 0x00, 0x2B, 0x24, 0x22, 0x12, 0x24, 0x00, 0x3D, 0x24, 0x00, 0x28, 0x24, 0x00, 0x29, 0x24, 0x00, 0x61, 0x24, 0x00, 0x65, 0x24, 0x00, 0x6F, 0x24, 0x00, 0x78, 0x24, 0x02, 0x59, 0x24, 0x00, 0x68, 0x24, 0x00, 0x6B, 0x24, 0x00, 0x6C, 0x24, 0x00, 0x6D, 0x24, 0x00, 0x6E, 0x24, 0x00, 0x70, 0x24, 0x00, 0x73, 0x24, 0x00, 0x74, 0xC0, 0x00, 0x52, 0x00, 0x00, 0x73, 0xC0, 0x00, 0x61, 0x80, 0x00, 0x2F, 0x00, 0x00, 0x63, 0xC0, 0x00, 0x61, 0x80, 0x00, 0x2F, 0x00, 0x00, 0x73, 0x04, 0x00, 0x43, 0xC0, 0x00, 0xB0, 0x00, 0x00, 0x43, 0xC0, 0x00, 0x63, 0x80, 0x00, 0x2F, 0x00, 0x00, 0x6F, 0xC0, 0x00, 0x63, 0x80, 0x00, 0x2F, 0x00, 0x00, 0x75, 0x40, 0x01, 0x90, 0xC0, 0x00, 0xB0, 0x00, 0x00, 0x46, 0x04, 0x00, 0x67, 0x04, 0x00, 0x48, 0x04, 0x00, 0x48, 0x04, 0x00, 0x48, 0x04, 0x00, 0x68, 0x04, 0x01, 0x27, 0x04, 0x00, 0x49, 0x04, 0x00, 0x49, 0x04, 0x00, 0x4C, 0x04, 0x00, 0x6C, 0x04, 0x00, 0x4E, 0xC0, 0x00, 0x4E, 0x00, 0x00, 0x6F, 0x04, 0x00, 0x50, 0x04, 0x00, 0x51, 0x04, 0x00, 0x52, 0x04, 0x00, 0x52, 0x04, 0x00, 0x52, 0xA0, 0x00, 0x53, 0x00, 0x00, 0x4D, 0xC0, 0x00, 0x54, 0x80, 0x00, 0x45, 0x00, 0x00, 0x4C, 0xA0, 0x00, 0x54, 0x00, 0x00, 0x4D, 0x04, 0x00, 0x5A, 0x00, 0x03, 0xA9, 0x04, 0x00, 0x5A, 0x00, 0x00, 0x4B, 0x00, 0x00, 0xC5, 0x04, 0x00, 0x42, 0x04, 0x00, 0x43, 0x04, 0x00, 0x65, 0x04, 0x00, 0x45, 0x04, 0x00, 0x46, 0x04, 0x00, 0x4D, 0x04, 0x00, 0x6F, 0x40, 0x05, 0xD0, 0x40, 0x05, 0xD1, 0x40, 0x05, 0xD2, 0x40, 0x05, 0xD3, 0x04, 0x00, 0x69, 0xC0, 0x00, 0x46, 0x80, 0x00, 0x41, 0x00, 0x00, 0x58, 0x04, 0x03, 0xC0, 0x04, 0x03, 0xB3, 0x04, 0x03, 0x93, 0x04, 0x03, 0xA0, 0x04, 0x22, 0x11, 0x04, 0x00, 0x44, 0x04, 0x00, 0x64, 0x04, 0x00, 0x65, 0x04, 0x00, 0x69, 0x04, 0x00, 0x6A, 0xBC, 0x00, 0x31, 0x80, 0x20, 0x44, 0x00, 0x00, 0x37, 0xBC, 0x00, 0x31, 0x80, 0x20, 0x44, 0x00, 0x00, 0x39, 0xBC, 0x00, 0x31, 0x80, 0x20, 0x44, 0x80, 0x00, 0x31, 0x00, 0x00, 0x30, 0xBC, 0x00, 0x31, 0x80, 0x20, 0x44, 0x00, 0x00, 0x33, 0xBC, 0x00, 0x32, 0x80, 0x20, 0x44, 0x00, 0x00, 0x33, 0xBC, 0x00, 0x31, 0x80, 0x20, 0x44, 0x00, 0x00, 0x35, 0xBC, 0x00, 0x32, 0x80, 0x20, 0x44, 0x00, 0x00, 0x35, 0xBC, 0x00, 0x33, 0x80, 0x20, 0x44, 0x00, 0x00, 0x35, 0xBC, 0x00, 0x34, 0x80, 0x20, 0x44, 0x00, 0x00, 0x35, 0xBC, 0x00, 0x31, 0x80, 0x20, 0x44, 0x00, 0x00, 0x36, 0xBC, 0x00, 0x35, 0x80, 0x20, 0x44, 0x00, 0x00, 0x36, 0xBC, 0x00, 0x31, 0x80, 0x20, 0x44, 0x00, 0x00, 0x38, 0xBC, 0x00, 0x33, 0x80, 0x20, 0x44, 0x00, 0x00, 0x38, 0xBC, 0x00, 0x35, 0x80, 0x20, 0x44, 0x00, 0x00, 0x38, 0xBC, 0x00, 0x37, 0x80, 0x20, 0x44, 0x00, 0x00, 0x38, 0xBC, 0x00, 0x31, 0x00, 0x20, 0x44, 0x40, 0x00, 0x49, 0xC0, 0x00, 0x49, 0x00, 0x00, 0x49, 0xC0, 0x00, 0x49, 0x80, 0x00, 0x49, 0x00, 0x00, 0x49, 0xC0, 0x00, 0x49, 0x00, 0x00, 0x56, 0x40, 0x00, 0x56, 0xC0, 0x00, 0x56, 0x00, 0x00, 0x49, 0xC0, 0x00, 0x56, 0x80, 0x00, 0x49, 0x00, 0x00, 0x49, 0xC0, 0x00, 0x56, 0x80, 0x00, 0x49, 0x80, 0x00, 0x49, 0x00, 0x00, 0x49, 0xC0, 0x00, 0x49, 0x00, 0x00, 0x58, 0x40, 0x00, 0x58, 0xC0, 0x00, 0x58, 0x00, 0x00, 0x49, 0xC0, 0x00, 0x58, 0x80, 0x00, 0x49, 0x00, 0x00, 0x49, 0x40, 0x00, 0x4C, 0x40, 0x00, 0x43, 0x40, 0x00, 0x44, 0x40, 0x00, 0x4D, 0x40, 0x00, 0x69, 0xC0, 0x00, 0x69, 0x00, 0x00, 0x69, 0xC0, 0x00, 0x69, 0x80, 0x00, 0x69, 0x00, 0x00, 0x69, 0xC0, 0x00, 0x69, 0x00, 0x00, 0x76, 0x40, 0x00, 0x76, 0xC0, 0x00, 0x76, 0x00, 0x00, 0x69, 0xC0, 0x00, 0x76, 0x80, 0x00, 0x69, 0x00, 0x00, 0x69, 0xC0, 0x00, 0x76, 0x80, 0x00, 0x69, 0x80, 0x00, 0x69, 0x00, 0x00, 0x69, 0xC0, 0x00, 0x69, 0x00, 0x00, 0x78, 0x40, 0x00, 0x78, 0xC0, 0x00, 0x78, 0x00, 0x00, 0x69, 0xC0, 0x00, 0x78, 0x80, 0x00, 0x69, 0x00, 0x00, 0x69, 0x40, 0x00, 0x6C, 0x40, 0x00, 0x63, 0x40, 0x00, 0x64, 0x40, 0x00, 0x6D, 0xBC, 0x00, 0x30, 0x80, 0x20, 0x44, 0x00, 0x00, 0x33, 0x80, 0x21, 0x90, 0x00, 0x03, 0x38, 0x80, 0x21, 0x92, 0x00, 0x03, 0x38, 0x80, 0x21, 0x94, 0x00, 0x03, 0x38, 0x80, 0x21, 0xD0, 0x00, 0x03, 0x38, 0x80, 0x21, 0xD4, 0x00, 0x03, 0x38, 0x80, 0x21, 0xD2, 0x00, 0x03, 0x38, 0x80, 0x22, 0x03, 0x00, 0x03, 0x38, 0x80, 0x22, 0x08, 0x00, 0x03, 0x38, 0x80, 0x22, 0x0B, 0x00, 0x03, 0x38, 0x80, 0x22, 0x23, 0x00, 0x03, 0x38, 0x80, 0x22, 0x25, 0x00, 0x03, 0x38, 0xC0, 0x22, 0x2B, 0x00, 0x22, 0x2B, 0xC0, 0x22, 0x2B, 0x80, 0x22, 0x2B, 0x00, 0x22, 0x2B, 0xC0, 0x22, 0x2E, 0x00, 0x22, 0x2E, 0xC0, 0x22, 0x2E, 0x80, 0x22, 0x2E, 0x00, 0x22, 0x2E, 0x80, 0x22, 0x3C, 0x00, 0x03, 0x38, 0x80, 0x22, 0x43, 0x00, 0x03, 0x38, 0x80, 0x22, 0x45, 0x00, 0x03, 0x38, 0x80, 0x22, 0x48, 0x00, 0x03, 0x38, 0x80, 0x00, 0x3D, 0x00, 0x03, 0x38, 0x80, 0x22, 0x61, 0x00, 0x03, 0x38, 0x80, 0x22, 0x4D, 0x00, 0x03, 0x38, 0x80, 0x00, 0x3C, 0x00, 0x03, 0x38, 0x80, 0x00, 0x3E, 0x00, 0x03, 0x38, 0x80, 0x22, 0x64, 0x00, 0x03, 0x38, 0x80, 0x22, 0x65, 0x00, 0x03, 0x38, 0x80, 0x22, 0x72, 0x00, 0x03, 0x38, 0x80, 0x22, 0x73, 0x00, 0x03, 0x38, 0x80, 0x22, 0x76, 0x00, 0x03, 0x38, 0x80, 0x22, 0x77, 0x00, 0x03, 0x38, 0x80, 0x22, 0x7A, 0x00, 0x03, 0x38, 0x80, 0x22, 0x7B, 0x00, 0x03, 0x38, 0x80, 0x22, 0x82, 0x00, 0x03, 0x38, 0x80, 0x22, 0x83, 0x00, 0x03, 0x38, 0x80, 0x22, 0x86, 0x00, 0x03, 0x38, 0x80, 0x22, 0x87, 0x00, 0x03, 0x38, 0x80, 0x22, 0xA2, 0x00, 0x03, 0x38, 0x80, 0x22, 0xA8, 0x00, 0x03, 0x38, 0x80, 0x22, 0xA9, 0x00, 0x03, 0x38, 0x80, 0x22, 0xAB, 0x00, 0x03, 0x38, 0x80, 0x22, 0x7C, 0x00, 0x03, 0x38, 0x80, 0x22, 0x7D, 0x00, 0x03, 0x38, 0x80, 0x22, 0x91, 0x00, 0x03, 0x38, 0x80, 0x22, 0x92, 0x00, 0x03, 0x38, 0x80, 0x22, 0xB2, 0x00, 0x03, 0x38, 0x80, 0x22, 0xB3, 0x00, 0x03, 0x38, 0x80, 0x22, 0xB4, 0x00, 0x03, 0x38, 0x80, 0x22, 0xB5, 0x00, 0x03, 0x38, 0x00, 0x30, 0x08, 0x00, 0x30, 0x09, 0x1C, 0x00, 0x31, 0x1C, 0x00, 0x32, 0x1C, 0x00, 0x33, 0x1C, 0x00, 0x34, 0x1C, 0x00, 0x35, 0x1C, 0x00, 0x36, 0x1C, 0x00, 0x37, 0x1C, 0x00, 0x38, 0x1C, 0x00, 0x39, 0x9C, 0x00, 0x31, 0x00, 0x00, 0x30, 0x9C, 0x00, 0x31, 0x00, 0x00, 0x31, 0x9C, 0x00, 0x31, 0x00, 0x00, 0x32, 0x9C, 0x00, 0x31, 0x00, 0x00, 0x33, 0x9C, 0x00, 0x31, 0x00, 0x00, 0x34, 0x9C, 0x00, 0x31, 0x00, 0x00, 0x35, 0x9C, 0x00, 0x31, 0x00, 0x00, 0x36, 0x9C, 0x00, 0x31, 0x00, 0x00, 0x37, 0x9C, 0x00, 0x31, 0x00, 0x00, 0x38, 0x9C, 0x00, 0x31, 0x00, 0x00, 0x39, 0x9C, 0x00, 0x32, 0x00, 0x00, 0x30, 0xC0, 0x00, 0x28, 0x80, 0x00, 0x31, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x00, 0x32, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x00, 0x33, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x00, 0x34, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x00, 0x35, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x00, 0x36, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x00, 0x37, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x00, 0x38, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x00, 0x39, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x00, 0x31, 0x80, 0x00, 0x30, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x00, 0x31, 0x80, 0x00, 0x31, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x00, 0x31, 0x80, 0x00, 0x32, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x00, 0x31, 0x80, 0x00, 0x33, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x00, 0x31, 0x80, 0x00, 0x34, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x00, 0x31, 0x80, 0x00, 0x35, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x00, 0x31, 0x80, 0x00, 0x36, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x00, 0x31, 0x80, 0x00, 0x37, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x00, 0x31, 0x80, 0x00, 0x38, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x00, 0x31, 0x80, 0x00, 0x39, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x00, 0x32, 0x80, 0x00, 0x30, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x31, 0x00, 0x00, 0x2E, 0xC0, 0x00, 0x32, 0x00, 0x00, 0x2E, 0xC0, 0x00, 0x33, 0x00, 0x00, 0x2E, 0xC0, 0x00, 0x34, 0x00, 0x00, 0x2E, 0xC0, 0x00, 0x35, 0x00, 0x00, 0x2E, 0xC0, 0x00, 0x36, 0x00, 0x00, 0x2E, 0xC0, 0x00, 0x37, 0x00, 0x00, 0x2E, 0xC0, 0x00, 0x38, 0x00, 0x00, 0x2E, 0xC0, 0x00, 0x39, 0x00, 0x00, 0x2E, 0xC0, 0x00, 0x31, 0x80, 0x00, 0x30, 0x00, 0x00, 0x2E, 0xC0, 0x00, 0x31, 0x80, 0x00, 0x31, 0x00, 0x00, 0x2E, 0xC0, 0x00, 0x31, 0x80, 0x00, 0x32, 0x00, 0x00, 0x2E, 0xC0, 0x00, 0x31, 0x80, 0x00, 0x33, 0x00, 0x00, 0x2E, 0xC0, 0x00, 0x31, 0x80, 0x00, 0x34, 0x00, 0x00, 0x2E, 0xC0, 0x00, 0x31, 0x80, 0x00, 0x35, 0x00, 0x00, 0x2E, 0xC0, 0x00, 0x31, 0x80, 0x00, 0x36, 0x00, 0x00, 0x2E, 0xC0, 0x00, 0x31, 0x80, 0x00, 0x37, 0x00, 0x00, 0x2E, 0xC0, 0x00, 0x31, 0x80, 0x00, 0x38, 0x00, 0x00, 0x2E, 0xC0, 0x00, 0x31, 0x80, 0x00, 0x39, 0x00, 0x00, 0x2E, 0xC0, 0x00, 0x32, 0x80, 0x00, 0x30, 0x00, 0x00, 0x2E, 0xC0, 0x00, 0x28, 0x80, 0x00, 0x61, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x00, 0x62, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x00, 0x63, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x00, 0x64, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x00, 0x65, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x00, 0x66, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x00, 0x67, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x00, 0x68, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x00, 0x69, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x00, 0x6A, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x00, 0x6B, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x00, 0x6C, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x00, 0x6D, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x00, 0x6E, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x00, 0x6F, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x00, 0x70, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x00, 0x71, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x00, 0x72, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x00, 0x73, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x00, 0x74, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x00, 0x75, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x00, 0x76, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x00, 0x77, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x00, 0x78, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x00, 0x79, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x00, 0x7A, 0x00, 0x00, 0x29, 0x1C, 0x00, 0x41, 0x1C, 0x00, 0x42, 0x1C, 0x00, 0x43, 0x1C, 0x00, 0x44, 0x1C, 0x00, 0x45, 0x1C, 0x00, 0x46, 0x1C, 0x00, 0x47, 0x1C, 0x00, 0x48, 0x1C, 0x00, 0x49, 0x1C, 0x00, 0x4A, 0x1C, 0x00, 0x4B, 0x1C, 0x00, 0x4C, 0x1C, 0x00, 0x4D, 0x1C, 0x00, 0x4E, 0x1C, 0x00, 0x4F, 0x1C, 0x00, 0x50, 0x1C, 0x00, 0x51, 0x1C, 0x00, 0x52, 0x1C, 0x00, 0x53, 0x1C, 0x00, 0x54, 0x1C, 0x00, 0x55, 0x1C, 0x00, 0x56, 0x1C, 0x00, 0x57, 0x1C, 0x00, 0x58, 0x1C, 0x00, 0x59, 0x1C, 0x00, 0x5A, 0x1C, 0x00, 0x61, 0x1C, 0x00, 0x62, 0x1C, 0x00, 0x63, 0x1C, 0x00, 0x64, 0x1C, 0x00, 0x65, 0x1C, 0x00, 0x66, 0x1C, 0x00, 0x67, 0x1C, 0x00, 0x68, 0x1C, 0x00, 0x69, 0x1C, 0x00, 0x6A, 0x1C, 0x00, 0x6B, 0x1C, 0x00, 0x6C, 0x1C, 0x00, 0x6D, 0x1C, 0x00, 0x6E, 0x1C, 0x00, 0x6F, 0x1C, 0x00, 0x70, 0x1C, 0x00, 0x71, 0x1C, 0x00, 0x72, 0x1C, 0x00, 0x73, 0x1C, 0x00, 0x74, 0x1C, 0x00, 0x75, 0x1C, 0x00, 0x76, 0x1C, 0x00, 0x77, 0x1C, 0x00, 0x78, 0x1C, 0x00, 0x79, 0x1C, 0x00, 0x7A, 0x1C, 0x00, 0x30, 0xC0, 0x22, 0x2B, 0x80, 0x22, 0x2B, 0x80, 0x22, 0x2B, 0x00, 0x22, 0x2B, 0xC0, 0x00, 0x3A, 0x80, 0x00, 0x3A, 0x00, 0x00, 0x3D, 0xC0, 0x00, 0x3D, 0x00, 0x00, 0x3D, 0xC0, 0x00, 0x3D, 0x80, 0x00, 0x3D, 0x00, 0x00, 0x3D, 0x80, 0x2A, 0xDD, 0x00, 0x03, 0x38, 0x24, 0x00, 0x6A, 0x20, 0x00, 0x56, 0x20, 0x2D, 0x61, 0x40, 0x6B, 0xCD, 0x40, 0x9F, 0x9F, 0x40, 0x4E, 0x00, 0x40, 0x4E, 0x28, 0x40, 0x4E, 0x36, 0x40, 0x4E, 0x3F, 0x40, 0x4E, 0x59, 0x40, 0x4E, 0x85, 0x40, 0x4E, 0x8C, 0x40, 0x4E, 0xA0, 0x40, 0x4E, 0xBA, 0x40, 0x51, 0x3F, 0x40, 0x51, 0x65, 0x40, 0x51, 0x6B, 0x40, 0x51, 0x82, 0x40, 0x51, 0x96, 0x40, 0x51, 0xAB, 0x40, 0x51, 0xE0, 0x40, 0x51, 0xF5, 0x40, 0x52, 0x00, 0x40, 0x52, 0x9B, 0x40, 0x52, 0xF9, 0x40, 0x53, 0x15, 0x40, 0x53, 0x1A, 0x40, 0x53, 0x38, 0x40, 0x53, 0x41, 0x40, 0x53, 0x5C, 0x40, 0x53, 0x69, 0x40, 0x53, 0x82, 0x40, 0x53, 0xB6, 0x40, 0x53, 0xC8, 0x40, 0x53, 0xE3, 0x40, 0x56, 0xD7, 0x40, 0x57, 0x1F, 0x40, 0x58, 0xEB, 0x40, 0x59, 0x02, 0x40, 0x59, 0x0A, 0x40, 0x59, 0x15, 0x40, 0x59, 0x27, 0x40, 0x59, 0x73, 0x40, 0x5B, 0x50, 0x40, 0x5B, 0x80, 0x40, 0x5B, 0xF8, 0x40, 0x5C, 0x0F, 0x40, 0x5C, 0x22, 0x40, 0x5C, 0x38, 0x40, 0x5C, 0x6E, 0x40, 0x5C, 0x71, 0x40, 0x5D, 0xDB, 0x40, 0x5D, 0xE5, 0x40, 0x5D, 0xF1, 0x40, 0x5D, 0xFE, 0x40, 0x5E, 0x72, 0x40, 0x5E, 0x7A, 0x40, 0x5E, 0x7F, 0x40, 0x5E, 0xF4, 0x40, 0x5E, 0xFE, 0x40, 0x5F, 0x0B, 0x40, 0x5F, 0x13, 0x40, 0x5F, 0x50, 0x40, 0x5F, 0x61, 0x40, 0x5F, 0x73, 0x40, 0x5F, 0xC3, 0x40, 0x62, 0x08, 0x40, 0x62, 0x36, 0x40, 0x62, 0x4B, 0x40, 0x65, 0x2F, 0x40, 0x65, 0x34, 0x40, 0x65, 0x87, 0x40, 0x65, 0x97, 0x40, 0x65, 0xA4, 0x40, 0x65, 0xB9, 0x40, 0x65, 0xE0, 0x40, 0x65, 0xE5, 0x40, 0x66, 0xF0, 0x40, 0x67, 0x08, 0x40, 0x67, 0x28, 0x40, 0x6B, 0x20, 0x40, 0x6B, 0x62, 0x40, 0x6B, 0x79, 0x40, 0x6B, 0xB3, 0x40, 0x6B, 0xCB, 0x40, 0x6B, 0xD4, 0x40, 0x6B, 0xDB, 0x40, 0x6C, 0x0F, 0x40, 0x6C, 0x14, 0x40, 0x6C, 0x34, 0x40, 0x70, 0x6B, 0x40, 0x72, 0x2A, 0x40, 0x72, 0x36, 0x40, 0x72, 0x3B, 0x40, 0x72, 0x3F, 0x40, 0x72, 0x47, 0x40, 0x72, 0x59, 0x40, 0x72, 0x5B, 0x40, 0x72, 0xAC, 0x40, 0x73, 0x84, 0x40, 0x73, 0x89, 0x40, 0x74, 0xDC, 0x40, 0x74, 0xE6, 0x40, 0x75, 0x18, 0x40, 0x75, 0x1F, 0x40, 0x75, 0x28, 0x40, 0x75, 0x30, 0x40, 0x75, 0x8B, 0x40, 0x75, 0x92, 0x40, 0x76, 0x76, 0x40, 0x76, 0x7D, 0x40, 0x76, 0xAE, 0x40, 0x76, 0xBF, 0x40, 0x76, 0xEE, 0x40, 0x77, 0xDB, 0x40, 0x77, 0xE2, 0x40, 0x77, 0xF3, 0x40, 0x79, 0x3A, 0x40, 0x79, 0xB8, 0x40, 0x79, 0xBE, 0x40, 0x7A, 0x74, 0x40, 0x7A, 0xCB, 0x40, 0x7A, 0xF9, 0x40, 0x7C, 0x73, 0x40, 0x7C, 0xF8, 0x40, 0x7F, 0x36, 0x40, 0x7F, 0x51, 0x40, 0x7F, 0x8A, 0x40, 0x7F, 0xBD, 0x40, 0x80, 0x01, 0x40, 0x80, 0x0C, 0x40, 0x80, 0x12, 0x40, 0x80, 0x33, 0x40, 0x80, 0x7F, 0x40, 0x80, 0x89, 0x40, 0x81, 0xE3, 0x40, 0x81, 0xEA, 0x40, 0x81, 0xF3, 0x40, 0x81, 0xFC, 0x40, 0x82, 0x0C, 0x40, 0x82, 0x1B, 0x40, 0x82, 0x1F, 0x40, 0x82, 0x6E, 0x40, 0x82, 0x72, 0x40, 0x82, 0x78, 0x40, 0x86, 0x4D, 0x40, 0x86, 0x6B, 0x40, 0x88, 0x40, 0x40, 0x88, 0x4C, 0x40, 0x88, 0x63, 0x40, 0x89, 0x7E, 0x40, 0x89, 0x8B, 0x40, 0x89, 0xD2, 0x40, 0x8A, 0x00, 0x40, 0x8C, 0x37, 0x40, 0x8C, 0x46, 0x40, 0x8C, 0x55, 0x40, 0x8C, 0x78, 0x40, 0x8C, 0x9D, 0x40, 0x8D, 0x64, 0x40, 0x8D, 0x70, 0x40, 0x8D, 0xB3, 0x40, 0x8E, 0xAB, 0x40, 0x8E, 0xCA, 0x40, 0x8F, 0x9B, 0x40, 0x8F, 0xB0, 0x40, 0x8F, 0xB5, 0x40, 0x90, 0x91, 0x40, 0x91, 0x49, 0x40, 0x91, 0xC6, 0x40, 0x91, 0xCC, 0x40, 0x91, 0xD1, 0x40, 0x95, 0x77, 0x40, 0x95, 0x80, 0x40, 0x96, 0x1C, 0x40, 0x96, 0xB6, 0x40, 0x96, 0xB9, 0x40, 0x96, 0xE8, 0x40, 0x97, 0x51, 0x40, 0x97, 0x5E, 0x40, 0x97, 0x62, 0x40, 0x97, 0x69, 0x40, 0x97, 0xCB, 0x40, 0x97, 0xED, 0x40, 0x97, 0xF3, 0x40, 0x98, 0x01, 0x40, 0x98, 0xA8, 0x40, 0x98, 0xDB, 0x40, 0x98, 0xDF, 0x40, 0x99, 0x96, 0x40, 0x99, 0x99, 0x40, 0x99, 0xAC, 0x40, 0x9A, 0xA8, 0x40, 0x9A, 0xD8, 0x40, 0x9A, 0xDF, 0x40, 0x9B, 0x25, 0x40, 0x9B, 0x2F, 0x40, 0x9B, 0x32, 0x40, 0x9B, 0x3C, 0x40, 0x9B, 0x5A, 0x40, 0x9C, 0xE5, 0x40, 0x9E, 0x75, 0x40, 0x9E, 0x7F, 0x40, 0x9E, 0xA5, 0x40, 0x9E, 0xBB, 0x40, 0x9E, 0xC3, 0x40, 0x9E, 0xCD, 0x40, 0x9E, 0xD1, 0x40, 0x9E, 0xF9, 0x40, 0x9E, 0xFD, 0x40, 0x9F, 0x0E, 0x40, 0x9F, 0x13, 0x40, 0x9F, 0x20, 0x40, 0x9F, 0x3B, 0x40, 0x9F, 0x4A, 0x40, 0x9F, 0x52, 0x40, 0x9F, 0x8D, 0x40, 0x9F, 0x9C, 0x40, 0x9F, 0xA0, 0x2C, 0x00, 0x20, 0x40, 0x30, 0x12, 0x40, 0x53, 0x41, 0x40, 0x53, 0x44, 0x40, 0x53, 0x45, 0x80, 0x30, 0x4B, 0x00, 0x30, 0x99, 0x80, 0x30, 0x4D, 0x00, 0x30, 0x99, 0x80, 0x30, 0x4F, 0x00, 0x30, 0x99, 0x80, 0x30, 0x51, 0x00, 0x30, 0x99, 0x80, 0x30, 0x53, 0x00, 0x30, 0x99, 0x80, 0x30, 0x55, 0x00, 0x30, 0x99, 0x80, 0x30, 0x57, 0x00, 0x30, 0x99, 0x80, 0x30, 0x59, 0x00, 0x30, 0x99, 0x80, 0x30, 0x5B, 0x00, 0x30, 0x99, 0x80, 0x30, 0x5D, 0x00, 0x30, 0x99, 0x80, 0x30, 0x5F, 0x00, 0x30, 0x99, 0x80, 0x30, 0x61, 0x00, 0x30, 0x99, 0x80, 0x30, 0x64, 0x00, 0x30, 0x99, 0x80, 0x30, 0x66, 0x00, 0x30, 0x99, 0x80, 0x30, 0x68, 0x00, 0x30, 0x99, 0x80, 0x30, 0x6F, 0x00, 0x30, 0x99, 0x80, 0x30, 0x6F, 0x00, 0x30, 0x9A, 0x80, 0x30, 0x72, 0x00, 0x30, 0x99, 0x80, 0x30, 0x72, 0x00, 0x30, 0x9A, 0x80, 0x30, 0x75, 0x00, 0x30, 0x99, 0x80, 0x30, 0x75, 0x00, 0x30, 0x9A, 0x80, 0x30, 0x78, 0x00, 0x30, 0x99, 0x80, 0x30, 0x78, 0x00, 0x30, 0x9A, 0x80, 0x30, 0x7B, 0x00, 0x30, 0x99, 0x80, 0x30, 0x7B, 0x00, 0x30, 0x9A, 0x80, 0x30, 0x46, 0x00, 0x30, 0x99, 0xC0, 0x00, 0x20, 0x00, 0x30, 0x99, 0xC0, 0x00, 0x20, 0x00, 0x30, 0x9A, 0x80, 0x30, 0x9D, 0x00, 0x30, 0x99, 0xA8, 0x30, 0x88, 0x00, 0x30, 0x8A, 0x80, 0x30, 0xAB, 0x00, 0x30, 0x99, 0x80, 0x30, 0xAD, 0x00, 0x30, 0x99, 0x80, 0x30, 0xAF, 0x00, 0x30, 0x99, 0x80, 0x30, 0xB1, 0x00, 0x30, 0x99, 0x80, 0x30, 0xB3, 0x00, 0x30, 0x99, 0x80, 0x30, 0xB5, 0x00, 0x30, 0x99, 0x80, 0x30, 0xB7, 0x00, 0x30, 0x99, 0x80, 0x30, 0xB9, 0x00, 0x30, 0x99, 0x80, 0x30, 0xBB, 0x00, 0x30, 0x99, 0x80, 0x30, 0xBD, 0x00, 0x30, 0x99, 0x80, 0x30, 0xBF, 0x00, 0x30, 0x99, 0x80, 0x30, 0xC1, 0x00, 0x30, 0x99, 0x80, 0x30, 0xC4, 0x00, 0x30, 0x99, 0x80, 0x30, 0xC6, 0x00, 0x30, 0x99, 0x80, 0x30, 0xC8, 0x00, 0x30, 0x99, 0x80, 0x30, 0xCF, 0x00, 0x30, 0x99, 0x80, 0x30, 0xCF, 0x00, 0x30, 0x9A, 0x80, 0x30, 0xD2, 0x00, 0x30, 0x99, 0x80, 0x30, 0xD2, 0x00, 0x30, 0x9A, 0x80, 0x30, 0xD5, 0x00, 0x30, 0x99, 0x80, 0x30, 0xD5, 0x00, 0x30, 0x9A, 0x80, 0x30, 0xD8, 0x00, 0x30, 0x99, 0x80, 0x30, 0xD8, 0x00, 0x30, 0x9A, 0x80, 0x30, 0xDB, 0x00, 0x30, 0x99, 0x80, 0x30, 0xDB, 0x00, 0x30, 0x9A, 0x80, 0x30, 0xA6, 0x00, 0x30, 0x99, 0x80, 0x30, 0xEF, 0x00, 0x30, 0x99, 0x80, 0x30, 0xF0, 0x00, 0x30, 0x99, 0x80, 0x30, 0xF1, 0x00, 0x30, 0x99, 0x80, 0x30, 0xF2, 0x00, 0x30, 0x99, 0x80, 0x30, 0xFD, 0x00, 0x30, 0x99, 0xA8, 0x30, 0xB3, 0x00, 0x30, 0xC8, 0x40, 0x11, 0x00, 0x40, 0x11, 0x01, 0x40, 0x11, 0xAA, 0x40, 0x11, 0x02, 0x40, 0x11, 0xAC, 0x40, 0x11, 0xAD, 0x40, 0x11, 0x03, 0x40, 0x11, 0x04, 0x40, 0x11, 0x05, 0x40, 0x11, 0xB0, 0x40, 0x11, 0xB1, 0x40, 0x11, 0xB2, 0x40, 0x11, 0xB3, 0x40, 0x11, 0xB4, 0x40, 0x11, 0xB5, 0x40, 0x11, 0x1A, 0x40, 0x11, 0x06, 0x40, 0x11, 0x07, 0x40, 0x11, 0x08, 0x40, 0x11, 0x21, 0x40, 0x11, 0x09, 0x40, 0x11, 0x0A, 0x40, 0x11, 0x0B, 0x40, 0x11, 0x0C, 0x40, 0x11, 0x0D, 0x40, 0x11, 0x0E, 0x40, 0x11, 0x0F, 0x40, 0x11, 0x10, 0x40, 0x11, 0x11, 0x40, 0x11, 0x12, 0x40, 0x11, 0x61, 0x40, 0x11, 0x62, 0x40, 0x11, 0x63, 0x40, 0x11, 0x64, 0x40, 0x11, 0x65, 0x40, 0x11, 0x66, 0x40, 0x11, 0x67, 0x40, 0x11, 0x68, 0x40, 0x11, 0x69, 0x40, 0x11, 0x6A, 0x40, 0x11, 0x6B, 0x40, 0x11, 0x6C, 0x40, 0x11, 0x6D, 0x40, 0x11, 0x6E, 0x40, 0x11, 0x6F, 0x40, 0x11, 0x70, 0x40, 0x11, 0x71, 0x40, 0x11, 0x72, 0x40, 0x11, 0x73, 0x40, 0x11, 0x74, 0x40, 0x11, 0x75, 0x40, 0x11, 0x60, 0x40, 0x11, 0x14, 0x40, 0x11, 0x15, 0x40, 0x11, 0xC7, 0x40, 0x11, 0xC8, 0x40, 0x11, 0xCC, 0x40, 0x11, 0xCE, 0x40, 0x11, 0xD3, 0x40, 0x11, 0xD7, 0x40, 0x11, 0xD9, 0x40, 0x11, 0x1C, 0x40, 0x11, 0xDD, 0x40, 0x11, 0xDF, 0x40, 0x11, 0x1D, 0x40, 0x11, 0x1E, 0x40, 0x11, 0x20, 0x40, 0x11, 0x22, 0x40, 0x11, 0x23, 0x40, 0x11, 0x27, 0x40, 0x11, 0x29, 0x40, 0x11, 0x2B, 0x40, 0x11, 0x2C, 0x40, 0x11, 0x2D, 0x40, 0x11, 0x2E, 0x40, 0x11, 0x2F, 0x40, 0x11, 0x32, 0x40, 0x11, 0x36, 0x40, 0x11, 0x40, 0x40, 0x11, 0x47, 0x40, 0x11, 0x4C, 0x40, 0x11, 0xF1, 0x40, 0x11, 0xF2, 0x40, 0x11, 0x57, 0x40, 0x11, 0x58, 0x40, 0x11, 0x59, 0x40, 0x11, 0x84, 0x40, 0x11, 0x85, 0x40, 0x11, 0x88, 0x40, 0x11, 0x91, 0x40, 0x11, 0x92, 0x40, 0x11, 0x94, 0x40, 0x11, 0x9E, 0x40, 0x11, 0xA1, 0x20, 0x4E, 0x00, 0x20, 0x4E, 0x8C, 0x20, 0x4E, 0x09, 0x20, 0x56, 0xDB, 0x20, 0x4E, 0x0A, 0x20, 0x4E, 0x2D, 0x20, 0x4E, 0x0B, 0x20, 0x75, 0x32, 0x20, 0x4E, 0x59, 0x20, 0x4E, 0x19, 0x20, 0x4E, 0x01, 0x20, 0x59, 0x29, 0x20, 0x57, 0x30, 0x20, 0x4E, 0xBA, 0xC0, 0x00, 0x28, 0x80, 0x11, 0x00, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x11, 0x02, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x11, 0x03, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x11, 0x05, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x11, 0x06, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x11, 0x07, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x11, 0x09, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x11, 0x0B, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x11, 0x0C, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x11, 0x0E, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x11, 0x0F, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x11, 0x10, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x11, 0x11, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x11, 0x12, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x11, 0x00, 0x80, 0x11, 0x61, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x11, 0x02, 0x80, 0x11, 0x61, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x11, 0x03, 0x80, 0x11, 0x61, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x11, 0x05, 0x80, 0x11, 0x61, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x11, 0x06, 0x80, 0x11, 0x61, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x11, 0x07, 0x80, 0x11, 0x61, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x11, 0x09, 0x80, 0x11, 0x61, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x11, 0x0B, 0x80, 0x11, 0x61, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x11, 0x0C, 0x80, 0x11, 0x61, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x11, 0x0E, 0x80, 0x11, 0x61, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x11, 0x0F, 0x80, 0x11, 0x61, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x11, 0x10, 0x80, 0x11, 0x61, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x11, 0x11, 0x80, 0x11, 0x61, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x11, 0x12, 0x80, 0x11, 0x61, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x11, 0x0C, 0x80, 0x11, 0x6E, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x11, 0x0B, 0x80, 0x11, 0x69, 0x80, 0x11, 0x0C, 0x80, 0x11, 0x65, 0x80, 0x11, 0xAB, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x11, 0x0B, 0x80, 0x11, 0x69, 0x80, 0x11, 0x12, 0x80, 0x11, 0x6E, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x4E, 0x00, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x4E, 0x8C, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x4E, 0x09, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x56, 0xDB, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x4E, 0x94, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x51, 0x6D, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x4E, 0x03, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x51, 0x6B, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x4E, 0x5D, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x53, 0x41, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x67, 0x08, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x70, 0x6B, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x6C, 0x34, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x67, 0x28, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x91, 0xD1, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x57, 0x1F, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x65, 0xE5, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x68, 0x2A, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x67, 0x09, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x79, 0x3E, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x54, 0x0D, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x72, 0x79, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x8C, 0xA1, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x79, 0x5D, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x52, 0xB4, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x4E, 0xE3, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x54, 0x7C, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x5B, 0x66, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x76, 0xE3, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x4F, 0x01, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x8C, 0xC7, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x53, 0x54, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x79, 0x6D, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x4F, 0x11, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x81, 0xEA, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x81, 0xF3, 0x00, 0x00, 0x29, 0x1C, 0x55, 0x4F, 0x1C, 0x5E, 0x7C, 0x1C, 0x65, 0x87, 0x1C, 0x7B, 0x8F, 0xB8, 0x00, 0x50, 0x80, 0x00, 0x54, 0x00, 0x00, 0x45, 0x9C, 0x00, 0x32, 0x00, 0x00, 0x31, 0x9C, 0x00, 0x32, 0x00, 0x00, 0x32, 0x9C, 0x00, 0x32, 0x00, 0x00, 0x33, 0x9C, 0x00, 0x32, 0x00, 0x00, 0x34, 0x9C, 0x00, 0x32, 0x00, 0x00, 0x35, 0x9C, 0x00, 0x32, 0x00, 0x00, 0x36, 0x9C, 0x00, 0x32, 0x00, 0x00, 0x37, 0x9C, 0x00, 0x32, 0x00, 0x00, 0x38, 0x9C, 0x00, 0x32, 0x00, 0x00, 0x39, 0x9C, 0x00, 0x33, 0x00, 0x00, 0x30, 0x9C, 0x00, 0x33, 0x00, 0x00, 0x31, 0x9C, 0x00, 0x33, 0x00, 0x00, 0x32, 0x9C, 0x00, 0x33, 0x00, 0x00, 0x33, 0x9C, 0x00, 0x33, 0x00, 0x00, 0x34, 0x9C, 0x00, 0x33, 0x00, 0x00, 0x35, 0x1C, 0x11, 0x00, 0x1C, 0x11, 0x02, 0x1C, 0x11, 0x03, 0x1C, 0x11, 0x05, 0x1C, 0x11, 0x06, 0x1C, 0x11, 0x07, 0x1C, 0x11, 0x09, 0x1C, 0x11, 0x0B, 0x1C, 0x11, 0x0C, 0x1C, 0x11, 0x0E, 0x1C, 0x11, 0x0F, 0x1C, 0x11, 0x10, 0x1C, 0x11, 0x11, 0x1C, 0x11, 0x12, 0x9C, 0x11, 0x00, 0x00, 0x11, 0x61, 0x9C, 0x11, 0x02, 0x00, 0x11, 0x61, 0x9C, 0x11, 0x03, 0x00, 0x11, 0x61, 0x9C, 0x11, 0x05, 0x00, 0x11, 0x61, 0x9C, 0x11, 0x06, 0x00, 0x11, 0x61, 0x9C, 0x11, 0x07, 0x00, 0x11, 0x61, 0x9C, 0x11, 0x09, 0x00, 0x11, 0x61, 0x9C, 0x11, 0x0B, 0x00, 0x11, 0x61, 0x9C, 0x11, 0x0C, 0x00, 0x11, 0x61, 0x9C, 0x11, 0x0E, 0x00, 0x11, 0x61, 0x9C, 0x11, 0x0F, 0x00, 0x11, 0x61, 0x9C, 0x11, 0x10, 0x00, 0x11, 0x61, 0x9C, 0x11, 0x11, 0x00, 0x11, 0x61, 0x9C, 0x11, 0x12, 0x00, 0x11, 0x61, 0x9C, 0x11, 0x0E, 0x80, 0x11, 0x61, 0x80, 0x11, 0xB7, 0x80, 0x11, 0x00, 0x00, 0x11, 0x69, 0x9C, 0x11, 0x0C, 0x80, 0x11, 0x6E, 0x80, 0x11, 0x0B, 0x00, 0x11, 0x74, 0x9C, 0x11, 0x0B, 0x00, 0x11, 0x6E, 0x1C, 0x4E, 0x00, 0x1C, 0x4E, 0x8C, 0x1C, 0x4E, 0x09, 0x1C, 0x56, 0xDB, 0x1C, 0x4E, 0x94, 0x1C, 0x51, 0x6D, 0x1C, 0x4E, 0x03, 0x1C, 0x51, 0x6B, 0x1C, 0x4E, 0x5D, 0x1C, 0x53, 0x41, 0x1C, 0x67, 0x08, 0x1C, 0x70, 0x6B, 0x1C, 0x6C, 0x34, 0x1C, 0x67, 0x28, 0x1C, 0x91, 0xD1, 0x1C, 0x57, 0x1F, 0x1C, 0x65, 0xE5, 0x1C, 0x68, 0x2A, 0x1C, 0x67, 0x09, 0x1C, 0x79, 0x3E, 0x1C, 0x54, 0x0D, 0x1C, 0x72, 0x79, 0x1C, 0x8C, 0xA1, 0x1C, 0x79, 0x5D, 0x1C, 0x52, 0xB4, 0x1C, 0x79, 0xD8, 0x1C, 0x75, 0x37, 0x1C, 0x59, 0x73, 0x1C, 0x90, 0x69, 0x1C, 0x51, 0x2A, 0x1C, 0x53, 0x70, 0x1C, 0x6C, 0xE8, 0x1C, 0x98, 0x05, 0x1C, 0x4F, 0x11, 0x1C, 0x51, 0x99, 0x1C, 0x6B, 0x63, 0x1C, 0x4E, 0x0A, 0x1C, 0x4E, 0x2D, 0x1C, 0x4E, 0x0B, 0x1C, 0x5D, 0xE6, 0x1C, 0x53, 0xF3, 0x1C, 0x53, 0x3B, 0x1C, 0x5B, 0x97, 0x1C, 0x5B, 0x66, 0x1C, 0x76, 0xE3, 0x1C, 0x4F, 0x01, 0x1C, 0x8C, 0xC7, 0x1C, 0x53, 0x54, 0x1C, 0x59, 0x1C, 0x9C, 0x00, 0x33, 0x00, 0x00, 0x36, 0x9C, 0x00, 0x33, 0x00, 0x00, 0x37, 0x9C, 0x00, 0x33, 0x00, 0x00, 0x38, 0x9C, 0x00, 0x33, 0x00, 0x00, 0x39, 0x9C, 0x00, 0x34, 0x00, 0x00, 0x30, 0x9C, 0x00, 0x34, 0x00, 0x00, 0x31, 0x9C, 0x00, 0x34, 0x00, 0x00, 0x32, 0x9C, 0x00, 0x34, 0x00, 0x00, 0x33, 0x9C, 0x00, 0x34, 0x00, 0x00, 0x34, 0x9C, 0x00, 0x34, 0x00, 0x00, 0x35, 0x9C, 0x00, 0x34, 0x00, 0x00, 0x36, 0x9C, 0x00, 0x34, 0x00, 0x00, 0x37, 0x9C, 0x00, 0x34, 0x00, 0x00, 0x38, 0x9C, 0x00, 0x34, 0x00, 0x00, 0x39, 0x9C, 0x00, 0x35, 0x00, 0x00, 0x30, 0xC0, 0x00, 0x31, 0x00, 0x67, 0x08, 0xC0, 0x00, 0x32, 0x00, 0x67, 0x08, 0xC0, 0x00, 0x33, 0x00, 0x67, 0x08, 0xC0, 0x00, 0x34, 0x00, 0x67, 0x08, 0xC0, 0x00, 0x35, 0x00, 0x67, 0x08, 0xC0, 0x00, 0x36, 0x00, 0x67, 0x08, 0xC0, 0x00, 0x37, 0x00, 0x67, 0x08, 0xC0, 0x00, 0x38, 0x00, 0x67, 0x08, 0xC0, 0x00, 0x39, 0x00, 0x67, 0x08, 0xC0, 0x00, 0x31, 0x80, 0x00, 0x30, 0x00, 0x67, 0x08, 0xC0, 0x00, 0x31, 0x80, 0x00, 0x31, 0x00, 0x67, 0x08, 0xC0, 0x00, 0x31, 0x80, 0x00, 0x32, 0x00, 0x67, 0x08, 0xB8, 0x00, 0x48, 0x00, 0x00, 0x67, 0xB8, 0x00, 0x65, 0x80, 0x00, 0x72, 0x00, 0x00, 0x67, 0xB8, 0x00, 0x65, 0x00, 0x00, 0x56, 0xB8, 0x00, 0x4C, 0x80, 0x00, 0x54, 0x00, 0x00, 0x44, 0x1C, 0x30, 0xA2, 0x1C, 0x30, 0xA4, 0x1C, 0x30, 0xA6, 0x1C, 0x30, 0xA8, 0x1C, 0x30, 0xAA, 0x1C, 0x30, 0xAB, 0x1C, 0x30, 0xAD, 0x1C, 0x30, 0xAF, 0x1C, 0x30, 0xB1, 0x1C, 0x30, 0xB3, 0x1C, 0x30, 0xB5, 0x1C, 0x30, 0xB7, 0x1C, 0x30, 0xB9, 0x1C, 0x30, 0xBB, 0x1C, 0x30, 0xBD, 0x1C, 0x30, 0xBF, 0x1C, 0x30, 0xC1, 0x1C, 0x30, 0xC4, 0x1C, 0x30, 0xC6, 0x1C, 0x30, 0xC8, 0x1C, 0x30, 0xCA, 0x1C, 0x30, 0xCB, 0x1C, 0x30, 0xCC, 0x1C, 0x30, 0xCD, 0x1C, 0x30, 0xCE, 0x1C, 0x30, 0xCF, 0x1C, 0x30, 0xD2, 0x1C, 0x30, 0xD5, 0x1C, 0x30, 0xD8, 0x1C, 0x30, 0xDB, 0x1C, 0x30, 0xDE, 0x1C, 0x30, 0xDF, 0x1C, 0x30, 0xE0, 0x1C, 0x30, 0xE1, 0x1C, 0x30, 0xE2, 0x1C, 0x30, 0xE4, 0x1C, 0x30, 0xE6, 0x1C, 0x30, 0xE8, 0x1C, 0x30, 0xE9, 0x1C, 0x30, 0xEA, 0x1C, 0x30, 0xEB, 0x1C, 0x30, 0xEC, 0x1C, 0x30, 0xED, 0x1C, 0x30, 0xEF, 0x1C, 0x30, 0xF0, 0x1C, 0x30, 0xF1, 0x1C, 0x30, 0xF2, 0xB8, 0x30, 0xA2, 0x80, 0x30, 0xD1, 0x80, 0x30, 0xFC, 0x00, 0x30, 0xC8, 0xB8, 0x30, 0xA2, 0x80, 0x30, 0xEB, 0x80, 0x30, 0xD5, 0x00, 0x30, 0xA1, 0xB8, 0x30, 0xA2, 0x80, 0x30, 0xF3, 0x80, 0x30, 0xDA, 0x00, 0x30, 0xA2, 0xB8, 0x30, 0xA2, 0x80, 0x30, 0xFC, 0x00, 0x30, 0xEB, 0xB8, 0x30, 0xA4, 0x80, 0x30, 0xCB, 0x80, 0x30, 0xF3, 0x00, 0x30, 0xB0, 0xB8, 0x30, 0xA4, 0x80, 0x30, 0xF3, 0x00, 0x30, 0xC1, 0xB8, 0x30, 0xA6, 0x80, 0x30, 0xA9, 0x00, 0x30, 0xF3, 0xB8, 0x30, 0xA8, 0x80, 0x30, 0xB9, 0x80, 0x30, 0xAF, 0x80, 0x30, 0xFC, 0x00, 0x30, 0xC9, 0xB8, 0x30, 0xA8, 0x80, 0x30, 0xFC, 0x80, 0x30, 0xAB, 0x00, 0x30, 0xFC, 0xB8, 0x30, 0xAA, 0x80, 0x30, 0xF3, 0x00, 0x30, 0xB9, 0xB8, 0x30, 0xAA, 0x80, 0x30, 0xFC, 0x00, 0x30, 0xE0, 0xB8, 0x30, 0xAB, 0x80, 0x30, 0xA4, 0x00, 0x30, 0xEA, 0xB8, 0x30, 0xAB, 0x80, 0x30, 0xE9, 0x80, 0x30, 0xC3, 0x00, 0x30, 0xC8, 0xB8, 0x30, 0xAB, 0x80, 0x30, 0xED, 0x80, 0x30, 0xEA, 0x00, 0x30, 0xFC, 0xB8, 0x30, 0xAC, 0x80, 0x30, 0xED, 0x00, 0x30, 0xF3, 0xB8, 0x30, 0xAC, 0x80, 0x30, 0xF3, 0x00, 0x30, 0xDE, 0xB8, 0x30, 0xAE, 0x00, 0x30, 0xAC, 0xB8, 0x30, 0xAE, 0x80, 0x30, 0xCB, 0x00, 0x30, 0xFC, 0xB8, 0x30, 0xAD, 0x80, 0x30, 0xE5, 0x80, 0x30, 0xEA, 0x00, 0x30, 0xFC, 0xB8, 0x30, 0xAE, 0x80, 0x30, 0xEB, 0x80, 0x30, 0xC0, 0x00, 0x30, 0xFC, 0xB8, 0x30, 0xAD, 0x00, 0x30, 0xED, 0xB8, 0x30, 0xAD, 0x80, 0x30, 0xED, 0x80, 0x30, 0xB0, 0x80, 0x30, 0xE9, 0x00, 0x30, 0xE0, 0xB8, 0x30, 0xAD, 0x80, 0x30, 0xED, 0x80, 0x30, 0xE1, 0x80, 0x30, 0xFC, 0x80, 0x30, 0xC8, 0x00, 0x30, 0xEB, 0xB8, 0x30, 0xAD, 0x80, 0x30, 0xED, 0x80, 0x30, 0xEF, 0x80, 0x30, 0xC3, 0x00, 0x30, 0xC8, 0xB8, 0x30, 0xB0, 0x80, 0x30, 0xE9, 0x00, 0x30, 0xE0, 0xB8, 0x30, 0xB0, 0x80, 0x30, 0xE9, 0x80, 0x30, 0xE0, 0x80, 0x30, 0xC8, 0x00, 0x30, 0xF3, 0xB8, 0x30, 0xAF, 0x80, 0x30, 0xEB, 0x80, 0x30, 0xBC, 0x80, 0x30, 0xA4, 0x00, 0x30, 0xED, 0xB8, 0x30, 0xAF, 0x80, 0x30, 0xED, 0x80, 0x30, 0xFC, 0x00, 0x30, 0xCD, 0xB8, 0x30, 0xB1, 0x80, 0x30, 0xFC, 0x00, 0x30, 0xB9, 0xB8, 0x30, 0xB3, 0x80, 0x30, 0xEB, 0x00, 0x30, 0xCA, 0xB8, 0x30, 0xB3, 0x80, 0x30, 0xFC, 0x00, 0x30, 0xDD, 0xB8, 0x30, 0xB5, 0x80, 0x30, 0xA4, 0x80, 0x30, 0xAF, 0x00, 0x30, 0xEB, 0xB8, 0x30, 0xB5, 0x80, 0x30, 0xF3, 0x80, 0x30, 0xC1, 0x80, 0x30, 0xFC, 0x00, 0x30, 0xE0, 0xB8, 0x30, 0xB7, 0x80, 0x30, 0xEA, 0x80, 0x30, 0xF3, 0x00, 0x30, 0xB0, 0xB8, 0x30, 0xBB, 0x80, 0x30, 0xF3, 0x00, 0x30, 0xC1, 0xB8, 0x30, 0xBB, 0x80, 0x30, 0xF3, 0x00, 0x30, 0xC8, 0xB8, 0x30, 0xC0, 0x80, 0x30, 0xFC, 0x00, 0x30, 0xB9, 0xB8, 0x30, 0xC7, 0x00, 0x30, 0xB7, 0xB8, 0x30, 0xC9, 0x00, 0x30, 0xEB, 0xB8, 0x30, 0xC8, 0x00, 0x30, 0xF3, 0xB8, 0x30, 0xCA, 0x00, 0x30, 0xCE, 0xB8, 0x30, 0xCE, 0x80, 0x30, 0xC3, 0x00, 0x30, 0xC8, 0xB8, 0x30, 0xCF, 0x80, 0x30, 0xA4, 0x00, 0x30, 0xC4, 0xB8, 0x30, 0xD1, 0x80, 0x30, 0xFC, 0x80, 0x30, 0xBB, 0x80, 0x30, 0xF3, 0x00, 0x30, 0xC8, 0xB8, 0x30, 0xD1, 0x80, 0x30, 0xFC, 0x00, 0x30, 0xC4, 0xB8, 0x30, 0xD0, 0x80, 0x30, 0xFC, 0x80, 0x30, 0xEC, 0x00, 0x30, 0xEB, 0xB8, 0x30, 0xD4, 0x80, 0x30, 0xA2, 0x80, 0x30, 0xB9, 0x80, 0x30, 0xC8, 0x00, 0x30, 0xEB, 0xB8, 0x30, 0xD4, 0x80, 0x30, 0xAF, 0x00, 0x30, 0xEB, 0xB8, 0x30, 0xD4, 0x00, 0x30, 0xB3, 0xB8, 0x30, 0xD3, 0x00, 0x30, 0xEB, 0xB8, 0x30, 0xD5, 0x80, 0x30, 0xA1, 0x80, 0x30, 0xE9, 0x80, 0x30, 0xC3, 0x00, 0x30, 0xC9, 0xB8, 0x30, 0xD5, 0x80, 0x30, 0xA3, 0x80, 0x30, 0xFC, 0x00, 0x30, 0xC8, 0xB8, 0x30, 0xD6, 0x80, 0x30, 0xC3, 0x80, 0x30, 0xB7, 0x80, 0x30, 0xA7, 0x00, 0x30, 0xEB, 0xB8, 0x30, 0xD5, 0x80, 0x30, 0xE9, 0x00, 0x30, 0xF3, 0xB8, 0x30, 0xD8, 0x80, 0x30, 0xAF, 0x80, 0x30, 0xBF, 0x80, 0x30, 0xFC, 0x00, 0x30, 0xEB, 0xB8, 0x30, 0xDA, 0x00, 0x30, 0xBD, 0xB8, 0x30, 0xDA, 0x80, 0x30, 0xCB, 0x00, 0x30, 0xD2, 0xB8, 0x30, 0xD8, 0x80, 0x30, 0xEB, 0x00, 0x30, 0xC4, 0xB8, 0x30, 0xDA, 0x80, 0x30, 0xF3, 0x00, 0x30, 0xB9, 0xB8, 0x30, 0xDA, 0x80, 0x30, 0xFC, 0x00, 0x30, 0xB8, 0xB8, 0x30, 0xD9, 0x80, 0x30, 0xFC, 0x00, 0x30, 0xBF, 0xB8, 0x30, 0xDD, 0x80, 0x30, 0xA4, 0x80, 0x30, 0xF3, 0x00, 0x30, 0xC8, 0xB8, 0x30, 0xDC, 0x80, 0x30, 0xEB, 0x00, 0x30, 0xC8, 0xB8, 0x30, 0xDB, 0x00, 0x30, 0xF3, 0xB8, 0x30, 0xDD, 0x80, 0x30, 0xF3, 0x00, 0x30, 0xC9, 0xB8, 0x30, 0xDB, 0x80, 0x30, 0xFC, 0x00, 0x30, 0xEB, 0xB8, 0x30, 0xDB, 0x80, 0x30, 0xFC, 0x00, 0x30, 0xF3, 0xB8, 0x30, 0xDE, 0x80, 0x30, 0xA4, 0x80, 0x30, 0xAF, 0x00, 0x30, 0xED, 0xB8, 0x30, 0xDE, 0x80, 0x30, 0xA4, 0x00, 0x30, 0xEB, 0xB8, 0x30, 0xDE, 0x80, 0x30, 0xC3, 0x00, 0x30, 0xCF, 0xB8, 0x30, 0xDE, 0x80, 0x30, 0xEB, 0x00, 0x30, 0xAF, 0xB8, 0x30, 0xDE, 0x80, 0x30, 0xF3, 0x80, 0x30, 0xB7, 0x80, 0x30, 0xE7, 0x00, 0x30, 0xF3, 0xB8, 0x30, 0xDF, 0x80, 0x30, 0xAF, 0x80, 0x30, 0xED, 0x00, 0x30, 0xF3, 0xB8, 0x30, 0xDF, 0x00, 0x30, 0xEA, 0xB8, 0x30, 0xDF, 0x80, 0x30, 0xEA, 0x80, 0x30, 0xD0, 0x80, 0x30, 0xFC, 0x00, 0x30, 0xEB, 0xB8, 0x30, 0xE1, 0x00, 0x30, 0xAC, 0xB8, 0x30, 0xE1, 0x80, 0x30, 0xAC, 0x80, 0x30, 0xC8, 0x00, 0x30, 0xF3, 0xB8, 0x30, 0xE1, 0x80, 0x30, 0xFC, 0x80, 0x30, 0xC8, 0x00, 0x30, 0xEB, 0xB8, 0x30, 0xE4, 0x80, 0x30, 0xFC, 0x00, 0x30, 0xC9, 0xB8, 0x30, 0xE4, 0x80, 0x30, 0xFC, 0x00, 0x30, 0xEB, 0xB8, 0x30, 0xE6, 0x80, 0x30, 0xA2, 0x00, 0x30, 0xF3, 0xB8, 0x30, 0xEA, 0x80, 0x30, 0xC3, 0x80, 0x30, 0xC8, 0x00, 0x30, 0xEB, 0xB8, 0x30, 0xEA, 0x00, 0x30, 0xE9, 0xB8, 0x30, 0xEB, 0x80, 0x30, 0xD4, 0x00, 0x30, 0xFC, 0xB8, 0x30, 0xEB, 0x80, 0x30, 0xFC, 0x80, 0x30, 0xD6, 0x00, 0x30, 0xEB, 0xB8, 0x30, 0xEC, 0x00, 0x30, 0xE0, 0xB8, 0x30, 0xEC, 0x80, 0x30, 0xF3, 0x80, 0x30, 0xC8, 0x80, 0x30, 0xB2, 0x00, 0x30, 0xF3, 0xB8, 0x30, 0xEF, 0x80, 0x30, 0xC3, 0x00, 0x30, 0xC8, 0xC0, 0x00, 0x30, 0x00, 0x70, 0xB9, 0xC0, 0x00, 0x31, 0x00, 0x70, 0xB9, 0xC0, 0x00, 0x32, 0x00, 0x70, 0xB9, 0xC0, 0x00, 0x33, 0x00, 0x70, 0xB9, 0xC0, 0x00, 0x34, 0x00, 0x70, 0xB9, 0xC0, 0x00, 0x35, 0x00, 0x70, 0xB9, 0xC0, 0x00, 0x36, 0x00, 0x70, 0xB9, 0xC0, 0x00, 0x37, 0x00, 0x70, 0xB9, 0xC0, 0x00, 0x38, 0x00, 0x70, 0xB9, 0xC0, 0x00, 0x39, 0x00, 0x70, 0xB9, 0xC0, 0x00, 0x31, 0x80, 0x00, 0x30, 0x00, 0x70, 0xB9, 0xC0, 0x00, 0x31, 0x80, 0x00, 0x31, 0x00, 0x70, 0xB9, 0xC0, 0x00, 0x31, 0x80, 0x00, 0x32, 0x00, 0x70, 0xB9, 0xC0, 0x00, 0x31, 0x80, 0x00, 0x33, 0x00, 0x70, 0xB9, 0xC0, 0x00, 0x31, 0x80, 0x00, 0x34, 0x00, 0x70, 0xB9, 0xC0, 0x00, 0x31, 0x80, 0x00, 0x35, 0x00, 0x70, 0xB9, 0xC0, 0x00, 0x31, 0x80, 0x00, 0x36, 0x00, 0x70, 0xB9, 0xC0, 0x00, 0x31, 0x80, 0x00, 0x37, 0x00, 0x70, 0xB9, 0xC0, 0x00, 0x31, 0x80, 0x00, 0x38, 0x00, 0x70, 0xB9, 0xC0, 0x00, 0x31, 0x80, 0x00, 0x39, 0x00, 0x70, 0xB9, 0xC0, 0x00, 0x32, 0x80, 0x00, 0x30, 0x00, 0x70, 0xB9, 0xC0, 0x00, 0x32, 0x80, 0x00, 0x31, 0x00, 0x70, 0xB9, 0xC0, 0x00, 0x32, 0x80, 0x00, 0x32, 0x00, 0x70, 0xB9, 0xC0, 0x00, 0x32, 0x80, 0x00, 0x33, 0x00, 0x70, 0xB9, 0xC0, 0x00, 0x32, 0x80, 0x00, 0x34, 0x00, 0x70, 0xB9, 0xB8, 0x00, 0x68, 0x80, 0x00, 0x50, 0x00, 0x00, 0x61, 0xB8, 0x00, 0x64, 0x00, 0x00, 0x61, 0xB8, 0x00, 0x41, 0x00, 0x00, 0x55, 0xB8, 0x00, 0x62, 0x80, 0x00, 0x61, 0x00, 0x00, 0x72, 0xB8, 0x00, 0x6F, 0x00, 0x00, 0x56, 0xB8, 0x00, 0x70, 0x00, 0x00, 0x63, 0xB8, 0x00, 0x64, 0x00, 0x00, 0x6D, 0xB8, 0x00, 0x64, 0x80, 0x00, 0x6D, 0x00, 0x00, 0xB2, 0xB8, 0x00, 0x64, 0x80, 0x00, 0x6D, 0x00, 0x00, 0xB3, 0xB8, 0x00, 0x49, 0x00, 0x00, 0x55, 0xB8, 0x5E, 0x73, 0x00, 0x62, 0x10, 0xB8, 0x66, 0x2D, 0x00, 0x54, 0x8C, 0xB8, 0x59, 0x27, 0x00, 0x6B, 0x63, 0xB8, 0x66, 0x0E, 0x00, 0x6C, 0xBB, 0xB8, 0x68, 0x2A, 0x80, 0x5F, 0x0F, 0x80, 0x4F, 0x1A, 0x00, 0x79, 0x3E, 0xB8, 0x00, 0x70, 0x00, 0x00, 0x41, 0xB8, 0x00, 0x6E, 0x00, 0x00, 0x41, 0xB8, 0x03, 0xBC, 0x00, 0x00, 0x41, 0xB8, 0x00, 0x6D, 0x00, 0x00, 0x41, 0xB8, 0x00, 0x6B, 0x00, 0x00, 0x41, 0xB8, 0x00, 0x4B, 0x00, 0x00, 0x42, 0xB8, 0x00, 0x4D, 0x00, 0x00, 0x42, 0xB8, 0x00, 0x47, 0x00, 0x00, 0x42, 0xB8, 0x00, 0x63, 0x80, 0x00, 0x61, 0x00, 0x00, 0x6C, 0xB8, 0x00, 0x6B, 0x80, 0x00, 0x63, 0x80, 0x00, 0x61, 0x00, 0x00, 0x6C, 0xB8, 0x00, 0x70, 0x00, 0x00, 0x46, 0xB8, 0x00, 0x6E, 0x00, 0x00, 0x46, 0xB8, 0x03, 0xBC, 0x00, 0x00, 0x46, 0xB8, 0x03, 0xBC, 0x00, 0x00, 0x67, 0xB8, 0x00, 0x6D, 0x00, 0x00, 0x67, 0xB8, 0x00, 0x6B, 0x00, 0x00, 0x67, 0xB8, 0x00, 0x48, 0x00, 0x00, 0x7A, 0xB8, 0x00, 0x6B, 0x80, 0x00, 0x48, 0x00, 0x00, 0x7A, 0xB8, 0x00, 0x4D, 0x80, 0x00, 0x48, 0x00, 0x00, 0x7A, 0xB8, 0x00, 0x47, 0x80, 0x00, 0x48, 0x00, 0x00, 0x7A, 0xB8, 0x00, 0x54, 0x80, 0x00, 0x48, 0x00, 0x00, 0x7A, 0xB8, 0x03, 0xBC, 0x00, 0x21, 0x13, 0xB8, 0x00, 0x6D, 0x00, 0x21, 0x13, 0xB8, 0x00, 0x64, 0x00, 0x21, 0x13, 0xB8, 0x00, 0x6B, 0x00, 0x21, 0x13, 0xB8, 0x00, 0x66, 0x00, 0x00, 0x6D, 0xB8, 0x00, 0x6E, 0x00, 0x00, 0x6D, 0xB8, 0x03, 0xBC, 0x00, 0x00, 0x6D, 0xB8, 0x00, 0x6D, 0x00, 0x00, 0x6D, 0xB8, 0x00, 0x63, 0x00, 0x00, 0x6D, 0xB8, 0x00, 0x6B, 0x00, 0x00, 0x6D, 0xB8, 0x00, 0x6D, 0x80, 0x00, 0x6D, 0x00, 0x00, 0xB2, 0xB8, 0x00, 0x63, 0x80, 0x00, 0x6D, 0x00, 0x00, 0xB2, 0xB8, 0x00, 0x6D, 0x00, 0x00, 0xB2, 0xB8, 0x00, 0x6B, 0x80, 0x00, 0x6D, 0x00, 0x00, 0xB2, 0xB8, 0x00, 0x6D, 0x80, 0x00, 0x6D, 0x00, 0x00, 0xB3, 0xB8, 0x00, 0x63, 0x80, 0x00, 0x6D, 0x00, 0x00, 0xB3, 0xB8, 0x00, 0x6D, 0x00, 0x00, 0xB3, 0xB8, 0x00, 0x6B, 0x80, 0x00, 0x6D, 0x00, 0x00, 0xB3, 0xB8, 0x00, 0x6D, 0x80, 0x22, 0x15, 0x00, 0x00, 0x73, 0xB8, 0x00, 0x6D, 0x80, 0x22, 0x15, 0x80, 0x00, 0x73, 0x00, 0x00, 0xB2, 0xB8, 0x00, 0x50, 0x00, 0x00, 0x61, 0xB8, 0x00, 0x6B, 0x80, 0x00, 0x50, 0x00, 0x00, 0x61, 0xB8, 0x00, 0x4D, 0x80, 0x00, 0x50, 0x00, 0x00, 0x61, 0xB8, 0x00, 0x47, 0x80, 0x00, 0x50, 0x00, 0x00, 0x61, 0xB8, 0x00, 0x72, 0x80, 0x00, 0x61, 0x00, 0x00, 0x64, 0xB8, 0x00, 0x72, 0x80, 0x00, 0x61, 0x80, 0x00, 0x64, 0x80, 0x22, 0x15, 0x00, 0x00, 0x73, 0xB8, 0x00, 0x72, 0x80, 0x00, 0x61, 0x80, 0x00, 0x64, 0x80, 0x22, 0x15, 0x80, 0x00, 0x73, 0x00, 0x00, 0xB2, 0xB8, 0x00, 0x70, 0x00, 0x00, 0x73, 0xB8, 0x00, 0x6E, 0x00, 0x00, 0x73, 0xB8, 0x03, 0xBC, 0x00, 0x00, 0x73, 0xB8, 0x00, 0x6D, 0x00, 0x00, 0x73, 0xB8, 0x00, 0x70, 0x00, 0x00, 0x56, 0xB8, 0x00, 0x6E, 0x00, 0x00, 0x56, 0xB8, 0x03, 0xBC, 0x00, 0x00, 0x56, 0xB8, 0x00, 0x6D, 0x00, 0x00, 0x56, 0xB8, 0x00, 0x6B, 0x00, 0x00, 0x56, 0xB8, 0x00, 0x4D, 0x00, 0x00, 0x56, 0xB8, 0x00, 0x70, 0x00, 0x00, 0x57, 0xB8, 0x00, 0x6E, 0x00, 0x00, 0x57, 0xB8, 0x03, 0xBC, 0x00, 0x00, 0x57, 0xB8, 0x00, 0x6D, 0x00, 0x00, 0x57, 0xB8, 0x00, 0x6B, 0x00, 0x00, 0x57, 0xB8, 0x00, 0x4D, 0x00, 0x00, 0x57, 0xB8, 0x00, 0x6B, 0x00, 0x03, 0xA9, 0xB8, 0x00, 0x4D, 0x00, 0x03, 0xA9, 0xB8, 0x00, 0x61, 0x80, 0x00, 0x2E, 0x80, 0x00, 0x6D, 0x00, 0x00, 0x2E, 0xB8, 0x00, 0x42, 0x00, 0x00, 0x71, 0xB8, 0x00, 0x63, 0x00, 0x00, 0x63, 0xB8, 0x00, 0x63, 0x00, 0x00, 0x64, 0xB8, 0x00, 0x43, 0x80, 0x22, 0x15, 0x80, 0x00, 0x6B, 0x00, 0x00, 0x67, 0xB8, 0x00, 0x43, 0x80, 0x00, 0x6F, 0x00, 0x00, 0x2E, 0xB8, 0x00, 0x64, 0x00, 0x00, 0x42, 0xB8, 0x00, 0x47, 0x00, 0x00, 0x79, 0xB8, 0x00, 0x68, 0x00, 0x00, 0x61, 0xB8, 0x00, 0x48, 0x00, 0x00, 0x50, 0xB8, 0x00, 0x69, 0x00, 0x00, 0x6E, 0xB8, 0x00, 0x4B, 0x00, 0x00, 0x4B, 0xB8, 0x00, 0x4B, 0x00, 0x00, 0x4D, 0xB8, 0x00, 0x6B, 0x00, 0x00, 0x74, 0xB8, 0x00, 0x6C, 0x00, 0x00, 0x6D, 0xB8, 0x00, 0x6C, 0x00, 0x00, 0x6E, 0xB8, 0x00, 0x6C, 0x80, 0x00, 0x6F, 0x00, 0x00, 0x67, 0xB8, 0x00, 0x6C, 0x00, 0x00, 0x78, 0xB8, 0x00, 0x6D, 0x00, 0x00, 0x62, 0xB8, 0x00, 0x6D, 0x80, 0x00, 0x69, 0x00, 0x00, 0x6C, 0xB8, 0x00, 0x6D, 0x80, 0x00, 0x6F, 0x00, 0x00, 0x6C, 0xB8, 0x00, 0x50, 0x00, 0x00, 0x48, 0xB8, 0x00, 0x70, 0x80, 0x00, 0x2E, 0x80, 0x00, 0x6D, 0x00, 0x00, 0x2E, 0xB8, 0x00, 0x50, 0x80, 0x00, 0x50, 0x00, 0x00, 0x4D, 0xB8, 0x00, 0x50, 0x00, 0x00, 0x52, 0xB8, 0x00, 0x73, 0x00, 0x00, 0x72, 0xB8, 0x00, 0x53, 0x00, 0x00, 0x76, 0xB8, 0x00, 0x57, 0x00, 0x00, 0x62, 0xB8, 0x00, 0x56, 0x80, 0x22, 0x15, 0x00, 0x00, 0x6D, 0xB8, 0x00, 0x41, 0x80, 0x22, 0x15, 0x00, 0x00, 0x6D, 0xC0, 0x00, 0x31, 0x00, 0x65, 0xE5, 0xC0, 0x00, 0x32, 0x00, 0x65, 0xE5, 0xC0, 0x00, 0x33, 0x00, 0x65, 0xE5, 0xC0, 0x00, 0x34, 0x00, 0x65, 0xE5, 0xC0, 0x00, 0x35, 0x00, 0x65, 0xE5, 0xC0, 0x00, 0x36, 0x00, 0x65, 0xE5, 0xC0, 0x00, 0x37, 0x00, 0x65, 0xE5, 0xC0, 0x00, 0x38, 0x00, 0x65, 0xE5, 0xC0, 0x00, 0x39, 0x00, 0x65, 0xE5, 0xC0, 0x00, 0x31, 0x80, 0x00, 0x30, 0x00, 0x65, 0xE5, 0xC0, 0x00, 0x31, 0x80, 0x00, 0x31, 0x00, 0x65, 0xE5, 0xC0, 0x00, 0x31, 0x80, 0x00, 0x32, 0x00, 0x65, 0xE5, 0xC0, 0x00, 0x31, 0x80, 0x00, 0x33, 0x00, 0x65, 0xE5, 0xC0, 0x00, 0x31, 0x80, 0x00, 0x34, 0x00, 0x65, 0xE5, 0xC0, 0x00, 0x31, 0x80, 0x00, 0x35, 0x00, 0x65, 0xE5, 0xC0, 0x00, 0x31, 0x80, 0x00, 0x36, 0x00, 0x65, 0xE5, 0xC0, 0x00, 0x31, 0x80, 0x00, 0x37, 0x00, 0x65, 0xE5, 0xC0, 0x00, 0x31, 0x80, 0x00, 0x38, 0x00, 0x65, 0xE5, 0xC0, 0x00, 0x31, 0x80, 0x00, 0x39, 0x00, 0x65, 0xE5, 0xC0, 0x00, 0x32, 0x80, 0x00, 0x30, 0x00, 0x65, 0xE5, 0xC0, 0x00, 0x32, 0x80, 0x00, 0x31, 0x00, 0x65, 0xE5, 0xC0, 0x00, 0x32, 0x80, 0x00, 0x32, 0x00, 0x65, 0xE5, 0xC0, 0x00, 0x32, 0x80, 0x00, 0x33, 0x00, 0x65, 0xE5, 0xC0, 0x00, 0x32, 0x80, 0x00, 0x34, 0x00, 0x65, 0xE5, 0xC0, 0x00, 0x32, 0x80, 0x00, 0x35, 0x00, 0x65, 0xE5, 0xC0, 0x00, 0x32, 0x80, 0x00, 0x36, 0x00, 0x65, 0xE5, 0xC0, 0x00, 0x32, 0x80, 0x00, 0x37, 0x00, 0x65, 0xE5, 0xC0, 0x00, 0x32, 0x80, 0x00, 0x38, 0x00, 0x65, 0xE5, 0xC0, 0x00, 0x32, 0x80, 0x00, 0x39, 0x00, 0x65, 0xE5, 0xC0, 0x00, 0x33, 0x80, 0x00, 0x30, 0x00, 0x65, 0xE5, 0xC0, 0x00, 0x33, 0x80, 0x00, 0x31, 0x00, 0x65, 0xE5, 0xB8, 0x00, 0x67, 0x80, 0x00, 0x61, 0x00, 0x00, 0x6C, 0x20, 0x04, 0x4A, 0x20, 0x04, 0x4C, 0x20, 0xA7, 0x6F, 0x20, 0x01, 0x26, 0x20, 0x01, 0x53, 0x20, 0xA7, 0x27, 0x20, 0xAB, 0x37, 0x20, 0x02, 0x6B, 0x20, 0xAB, 0x52, 0x00, 0x8C, 0x48, 0x00, 0x66, 0xF4, 0x00, 0x8E, 0xCA, 0x00, 0x8C, 0xC8, 0x00, 0x6E, 0xD1, 0x00, 0x4E, 0x32, 0x00, 0x53, 0xE5, 0x00, 0x9F, 0x9C, 0x00, 0x9F, 0x9C, 0x00, 0x59, 0x51, 0x00, 0x91, 0xD1, 0x00, 0x55, 0x87, 0x00, 0x59, 0x48, 0x00, 0x61, 0xF6, 0x00, 0x76, 0x69, 0x00, 0x7F, 0x85, 0x00, 0x86, 0x3F, 0x00, 0x87, 0xBA, 0x00, 0x88, 0xF8, 0x00, 0x90, 0x8F, 0x00, 0x6A, 0x02, 0x00, 0x6D, 0x1B, 0x00, 0x70, 0xD9, 0x00, 0x73, 0xDE, 0x00, 0x84, 0x3D, 0x00, 0x91, 0x6A, 0x00, 0x99, 0xF1, 0x00, 0x4E, 0x82, 0x00, 0x53, 0x75, 0x00, 0x6B, 0x04, 0x00, 0x72, 0x1B, 0x00, 0x86, 0x2D, 0x00, 0x9E, 0x1E, 0x00, 0x5D, 0x50, 0x00, 0x6F, 0xEB, 0x00, 0x85, 0xCD, 0x00, 0x89, 0x64, 0x00, 0x62, 0xC9, 0x00, 0x81, 0xD8, 0x00, 0x88, 0x1F, 0x00, 0x5E, 0xCA, 0x00, 0x67, 0x17, 0x00, 0x6D, 0x6A, 0x00, 0x72, 0xFC, 0x00, 0x90, 0xCE, 0x00, 0x4F, 0x86, 0x00, 0x51, 0xB7, 0x00, 0x52, 0xDE, 0x00, 0x64, 0xC4, 0x00, 0x6A, 0xD3, 0x00, 0x72, 0x10, 0x00, 0x76, 0xE7, 0x00, 0x80, 0x01, 0x00, 0x86, 0x06, 0x00, 0x86, 0x5C, 0x00, 0x8D, 0xEF, 0x00, 0x97, 0x32, 0x00, 0x9B, 0x6F, 0x00, 0x9D, 0xFA, 0x00, 0x78, 0x8C, 0x00, 0x79, 0x7F, 0x00, 0x7D, 0xA0, 0x00, 0x83, 0xC9, 0x00, 0x93, 0x04, 0x00, 0x9E, 0x7F, 0x00, 0x8A, 0xD6, 0x00, 0x58, 0xDF, 0x00, 0x5F, 0x04, 0x00, 0x7C, 0x60, 0x00, 0x80, 0x7E, 0x00, 0x72, 0x62, 0x00, 0x78, 0xCA, 0x00, 0x8C, 0xC2, 0x00, 0x96, 0xF7, 0x00, 0x58, 0xD8, 0x00, 0x5C, 0x62, 0x00, 0x6A, 0x13, 0x00, 0x6D, 0xDA, 0x00, 0x6F, 0x0F, 0x00, 0x7D, 0x2F, 0x00, 0x7E, 0x37, 0x00, 0x96, 0x4B, 0x00, 0x52, 0xD2, 0x00, 0x80, 0x8B, 0x00, 0x51, 0xDC, 0x00, 0x51, 0xCC, 0x00, 0x7A, 0x1C, 0x00, 0x7D, 0xBE, 0x00, 0x83, 0xF1, 0x00, 0x96, 0x75, 0x00, 0x8B, 0x80, 0x00, 0x62, 0xCF, 0x00, 0x6A, 0x02, 0x00, 0x8A, 0xFE, 0x00, 0x4E, 0x39, 0x00, 0x5B, 0xE7, 0x00, 0x60, 0x12, 0x00, 0x73, 0x87, 0x00, 0x75, 0x70, 0x00, 0x53, 0x17, 0x00, 0x78, 0xFB, 0x00, 0x4F, 0xBF, 0x00, 0x5F, 0xA9, 0x00, 0x4E, 0x0D, 0x00, 0x6C, 0xCC, 0x00, 0x65, 0x78, 0x00, 0x7D, 0x22, 0x00, 0x53, 0xC3, 0x00, 0x58, 0x5E, 0x00, 0x77, 0x01, 0x00, 0x84, 0x49, 0x00, 0x8A, 0xAA, 0x00, 0x6B, 0xBA, 0x00, 0x8F, 0xB0, 0x00, 0x6C, 0x88, 0x00, 0x62, 0xFE, 0x00, 0x82, 0xE5, 0x00, 0x63, 0xA0, 0x00, 0x75, 0x65, 0x00, 0x4E, 0xAE, 0x00, 0x51, 0x69, 0x00, 0x51, 0xC9, 0x00, 0x68, 0x81, 0x00, 0x7C, 0xE7, 0x00, 0x82, 0x6F, 0x00, 0x8A, 0xD2, 0x00, 0x91, 0xCF, 0x00, 0x52, 0xF5, 0x00, 0x54, 0x42, 0x00, 0x59, 0x73, 0x00, 0x5E, 0xEC, 0x00, 0x65, 0xC5, 0x00, 0x6F, 0xFE, 0x00, 0x79, 0x2A, 0x00, 0x95, 0xAD, 0x00, 0x9A, 0x6A, 0x00, 0x9E, 0x97, 0x00, 0x9E, 0xCE, 0x00, 0x52, 0x9B, 0x00, 0x66, 0xC6, 0x00, 0x6B, 0x77, 0x00, 0x8F, 0x62, 0x00, 0x5E, 0x74, 0x00, 0x61, 0x90, 0x00, 0x62, 0x00, 0x00, 0x64, 0x9A, 0x00, 0x6F, 0x23, 0x00, 0x71, 0x49, 0x00, 0x74, 0x89, 0x00, 0x79, 0xCA, 0x00, 0x7D, 0xF4, 0x00, 0x80, 0x6F, 0x00, 0x8F, 0x26, 0x00, 0x84, 0xEE, 0x00, 0x90, 0x23, 0x00, 0x93, 0x4A, 0x00, 0x52, 0x17, 0x00, 0x52, 0xA3, 0x00, 0x54, 0xBD, 0x00, 0x70, 0xC8, 0x00, 0x88, 0xC2, 0x00, 0x8A, 0xAA, 0x00, 0x5E, 0xC9, 0x00, 0x5F, 0xF5, 0x00, 0x63, 0x7B, 0x00, 0x6B, 0xAE, 0x00, 0x7C, 0x3E, 0x00, 0x73, 0x75, 0x00, 0x4E, 0xE4, 0x00, 0x56, 0xF9, 0x00, 0x5B, 0xE7, 0x00, 0x5D, 0xBA, 0x00, 0x60, 0x1C, 0x00, 0x73, 0xB2, 0x00, 0x74, 0x69, 0x00, 0x7F, 0x9A, 0x00, 0x80, 0x46, 0x00, 0x92, 0x34, 0x00, 0x96, 0xF6, 0x00, 0x97, 0x48, 0x00, 0x98, 0x18, 0x00, 0x4F, 0x8B, 0x00, 0x79, 0xAE, 0x00, 0x91, 0xB4, 0x00, 0x96, 0xB8, 0x00, 0x60, 0xE1, 0x00, 0x4E, 0x86, 0x00, 0x50, 0xDA, 0x00, 0x5B, 0xEE, 0x00, 0x5C, 0x3F, 0x00, 0x65, 0x99, 0x00, 0x6A, 0x02, 0x00, 0x71, 0xCE, 0x00, 0x76, 0x42, 0x00, 0x84, 0xFC, 0x00, 0x90, 0x7C, 0x00, 0x9F, 0x8D, 0x00, 0x66, 0x88, 0x00, 0x96, 0x2E, 0x00, 0x52, 0x89, 0x00, 0x67, 0x7B, 0x00, 0x67, 0xF3, 0x00, 0x6D, 0x41, 0x00, 0x6E, 0x9C, 0x00, 0x74, 0x09, 0x00, 0x75, 0x59, 0x00, 0x78, 0x6B, 0x00, 0x7D, 0x10, 0x00, 0x98, 0x5E, 0x00, 0x51, 0x6D, 0x00, 0x62, 0x2E, 0x00, 0x96, 0x78, 0x00, 0x50, 0x2B, 0x00, 0x5D, 0x19, 0x00, 0x6D, 0xEA, 0x00, 0x8F, 0x2A, 0x00, 0x5F, 0x8B, 0x00, 0x61, 0x44, 0x00, 0x68, 0x17, 0x00, 0x73, 0x87, 0x00, 0x96, 0x86, 0x00, 0x52, 0x29, 0x00, 0x54, 0x0F, 0x00, 0x5C, 0x65, 0x00, 0x66, 0x13, 0x00, 0x67, 0x4E, 0x00, 0x68, 0xA8, 0x00, 0x6C, 0xE5, 0x00, 0x74, 0x06, 0x00, 0x75, 0xE2, 0x00, 0x7F, 0x79, 0x00, 0x88, 0xCF, 0x00, 0x88, 0xE1, 0x00, 0x91, 0xCC, 0x00, 0x96, 0xE2, 0x00, 0x53, 0x3F, 0x00, 0x6E, 0xBA, 0x00, 0x54, 0x1D, 0x00, 0x71, 0xD0, 0x00, 0x74, 0x98, 0x00, 0x85, 0xFA, 0x00, 0x96, 0xA3, 0x00, 0x9C, 0x57, 0x00, 0x9E, 0x9F, 0x00, 0x67, 0x97, 0x00, 0x6D, 0xCB, 0x00, 0x81, 0xE8, 0x00, 0x7A, 0xCB, 0x00, 0x7B, 0x20, 0x00, 0x7C, 0x92, 0x00, 0x72, 0xC0, 0x00, 0x70, 0x99, 0x00, 0x8B, 0x58, 0x00, 0x4E, 0xC0, 0x00, 0x83, 0x36, 0x00, 0x52, 0x3A, 0x00, 0x52, 0x07, 0x00, 0x5E, 0xA6, 0x00, 0x62, 0xD3, 0x00, 0x7C, 0xD6, 0x00, 0x5B, 0x85, 0x00, 0x6D, 0x1E, 0x00, 0x66, 0xB4, 0x00, 0x8F, 0x3B, 0x00, 0x88, 0x4C, 0x00, 0x96, 0x4D, 0x00, 0x89, 0x8B, 0x00, 0x5E, 0xD3, 0x00, 0x51, 0x40, 0x00, 0x55, 0xC0, 0x00, 0x58, 0x5A, 0x00, 0x66, 0x74, 0x00, 0x51, 0xDE, 0x00, 0x73, 0x2A, 0x00, 0x76, 0xCA, 0x00, 0x79, 0x3C, 0x00, 0x79, 0x5E, 0x00, 0x79, 0x65, 0x00, 0x79, 0x8F, 0x00, 0x97, 0x56, 0x00, 0x7C, 0xBE, 0x00, 0x7F, 0xBD, 0x00, 0x86, 0x12, 0x00, 0x8A, 0xF8, 0x00, 0x90, 0x38, 0x00, 0x90, 0xFD, 0x00, 0x98, 0xEF, 0x00, 0x98, 0xFC, 0x00, 0x99, 0x28, 0x00, 0x9D, 0xB4, 0x00, 0x90, 0xDE, 0x00, 0x96, 0xB7, 0x00, 0x4F, 0xAE, 0x00, 0x50, 0xE7, 0x00, 0x51, 0x4D, 0x00, 0x52, 0xC9, 0x00, 0x52, 0xE4, 0x00, 0x53, 0x51, 0x00, 0x55, 0x9D, 0x00, 0x56, 0x06, 0x00, 0x56, 0x68, 0x00, 0x58, 0x40, 0x00, 0x58, 0xA8, 0x00, 0x5C, 0x64, 0x00, 0x5C, 0x6E, 0x00, 0x60, 0x94, 0x00, 0x61, 0x68, 0x00, 0x61, 0x8E, 0x00, 0x61, 0xF2, 0x00, 0x65, 0x4F, 0x00, 0x65, 0xE2, 0x00, 0x66, 0x91, 0x00, 0x68, 0x85, 0x00, 0x6D, 0x77, 0x00, 0x6E, 0x1A, 0x00, 0x6F, 0x22, 0x00, 0x71, 0x6E, 0x00, 0x72, 0x2B, 0x00, 0x74, 0x22, 0x00, 0x78, 0x91, 0x00, 0x79, 0x3E, 0x00, 0x79, 0x49, 0x00, 0x79, 0x48, 0x00, 0x79, 0x50, 0x00, 0x79, 0x56, 0x00, 0x79, 0x5D, 0x00, 0x79, 0x8D, 0x00, 0x79, 0x8E, 0x00, 0x7A, 0x40, 0x00, 0x7A, 0x81, 0x00, 0x7B, 0xC0, 0x00, 0x7D, 0xF4, 0x00, 0x7E, 0x09, 0x00, 0x7E, 0x41, 0x00, 0x7F, 0x72, 0x00, 0x80, 0x05, 0x00, 0x81, 0xED, 0x00, 0x82, 0x79, 0x00, 0x82, 0x79, 0x00, 0x84, 0x57, 0x00, 0x89, 0x10, 0x00, 0x89, 0x96, 0x00, 0x8B, 0x01, 0x00, 0x8B, 0x39, 0x00, 0x8C, 0xD3, 0x00, 0x8D, 0x08, 0x00, 0x8F, 0xB6, 0x00, 0x90, 0x38, 0x00, 0x96, 0xE3, 0x00, 0x97, 0xFF, 0x00, 0x98, 0x3B, 0x00, 0x60, 0x75, 0x02, 0x42, 0xEE, 0x00, 0x82, 0x18, 0x00, 0x4E, 0x26, 0x00, 0x51, 0xB5, 0x00, 0x51, 0x68, 0x00, 0x4F, 0x80, 0x00, 0x51, 0x45, 0x00, 0x51, 0x80, 0x00, 0x52, 0xC7, 0x00, 0x52, 0xFA, 0x00, 0x55, 0x9D, 0x00, 0x55, 0x55, 0x00, 0x55, 0x99, 0x00, 0x55, 0xE2, 0x00, 0x58, 0x5A, 0x00, 0x58, 0xB3, 0x00, 0x59, 0x44, 0x00, 0x59, 0x54, 0x00, 0x5A, 0x62, 0x00, 0x5B, 0x28, 0x00, 0x5E, 0xD2, 0x00, 0x5E, 0xD9, 0x00, 0x5F, 0x69, 0x00, 0x5F, 0xAD, 0x00, 0x60, 0xD8, 0x00, 0x61, 0x4E, 0x00, 0x61, 0x08, 0x00, 0x61, 0x8E, 0x00, 0x61, 0x60, 0x00, 0x61, 0xF2, 0x00, 0x62, 0x34, 0x00, 0x63, 0xC4, 0x00, 0x64, 0x1C, 0x00, 0x64, 0x52, 0x00, 0x65, 0x56, 0x00, 0x66, 0x74, 0x00, 0x67, 0x17, 0x00, 0x67, 0x1B, 0x00, 0x67, 0x56, 0x00, 0x6B, 0x79, 0x00, 0x6B, 0xBA, 0x00, 0x6D, 0x41, 0x00, 0x6E, 0xDB, 0x00, 0x6E, 0xCB, 0x00, 0x6F, 0x22, 0x00, 0x70, 0x1E, 0x00, 0x71, 0x6E, 0x00, 0x77, 0xA7, 0x00, 0x72, 0x35, 0x00, 0x72, 0xAF, 0x00, 0x73, 0x2A, 0x00, 0x74, 0x71, 0x00, 0x75, 0x06, 0x00, 0x75, 0x3B, 0x00, 0x76, 0x1D, 0x00, 0x76, 0x1F, 0x00, 0x76, 0xCA, 0x00, 0x76, 0xDB, 0x00, 0x76, 0xF4, 0x00, 0x77, 0x4A, 0x00, 0x77, 0x40, 0x00, 0x78, 0xCC, 0x00, 0x7A, 0xB1, 0x00, 0x7B, 0xC0, 0x00, 0x7C, 0x7B, 0x00, 0x7D, 0x5B, 0x00, 0x7D, 0xF4, 0x00, 0x7F, 0x3E, 0x00, 0x80, 0x05, 0x00, 0x83, 0x52, 0x00, 0x83, 0xEF, 0x00, 0x87, 0x79, 0x00, 0x89, 0x41, 0x00, 0x89, 0x86, 0x00, 0x89, 0x96, 0x00, 0x8A, 0xBF, 0x00, 0x8A, 0xF8, 0x00, 0x8A, 0xCB, 0x00, 0x8B, 0x01, 0x00, 0x8A, 0xFE, 0x00, 0x8A, 0xED, 0x00, 0x8B, 0x39, 0x00, 0x8B, 0x8A, 0x00, 0x8D, 0x08, 0x00, 0x8F, 0x38, 0x00, 0x90, 0x72, 0x00, 0x91, 0x99, 0x00, 0x92, 0x76, 0x00, 0x96, 0x7C, 0x00, 0x96, 0xE3, 0x00, 0x97, 0x56, 0x00, 0x97, 0xDB, 0x00, 0x97, 0xFF, 0x00, 0x98, 0x0B, 0x00, 0x98, 0x3B, 0x00, 0x9B, 0x12, 0x00, 0x9F, 0x9C, 0x02, 0x28, 0x4A, 0x02, 0x28, 0x44, 0x02, 0x33, 0xD5, 0x00, 0x3B, 0x9D, 0x00, 0x40, 0x18, 0x00, 0x40, 0x39, 0x02, 0x52, 0x49, 0x02, 0x5C, 0xD0, 0x02, 0x7E, 0xD3, 0x00, 0x9F, 0x43, 0x00, 0x9F, 0x8E, 0xC0, 0x00, 0x66, 0x00, 0x00, 0x66, 0xC0, 0x00, 0x66, 0x00, 0x00, 0x69, 0xC0, 0x00, 0x66, 0x00, 0x00, 0x6C, 0xC0, 0x00, 0x66, 0x80, 0x00, 0x66, 0x00, 0x00, 0x69, 0xC0, 0x00, 0x66, 0x80, 0x00, 0x66, 0x00, 0x00, 0x6C, 0xC0, 0x01, 0x7F, 0x00, 0x00, 0x74, 0xC0, 0x00, 0x73, 0x00, 0x00, 0x74, 0xC0, 0x05, 0x74, 0x00, 0x05, 0x76, 0xC0, 0x05, 0x74, 0x00, 0x05, 0x65, 0xC0, 0x05, 0x74, 0x00, 0x05, 0x6B, 0xC0, 0x05, 0x7E, 0x00, 0x05, 0x76, 0xC0, 0x05, 0x74, 0x00, 0x05, 0x6D, 0x80, 0x05, 0xD9, 0x00, 0x05, 0xB4, 0x80, 0x05, 0xF2, 0x00, 0x05, 0xB7, 0x04, 0x05, 0xE2, 0x04, 0x05, 0xD0, 0x04, 0x05, 0xD3, 0x04, 0x05, 0xD4, 0x04, 0x05, 0xDB, 0x04, 0x05, 0xDC, 0x04, 0x05, 0xDD, 0x04, 0x05, 0xE8, 0x04, 0x05, 0xEA, 0x04, 0x00, 0x2B, 0x80, 0x05, 0xE9, 0x00, 0x05, 0xC1, 0x80, 0x05, 0xE9, 0x00, 0x05, 0xC2, 0x80, 0xFB, 0x49, 0x00, 0x05, 0xC1, 0x80, 0xFB, 0x49, 0x00, 0x05, 0xC2, 0x80, 0x05, 0xD0, 0x00, 0x05, 0xB7, 0x80, 0x05, 0xD0, 0x00, 0x05, 0xB8, 0x80, 0x05, 0xD0, 0x00, 0x05, 0xBC, 0x80, 0x05, 0xD1, 0x00, 0x05, 0xBC, 0x80, 0x05, 0xD2, 0x00, 0x05, 0xBC, 0x80, 0x05, 0xD3, 0x00, 0x05, 0xBC, 0x80, 0x05, 0xD4, 0x00, 0x05, 0xBC, 0x80, 0x05, 0xD5, 0x00, 0x05, 0xBC, 0x80, 0x05, 0xD6, 0x00, 0x05, 0xBC, 0x80, 0x05, 0xD8, 0x00, 0x05, 0xBC, 0x80, 0x05, 0xD9, 0x00, 0x05, 0xBC, 0x80, 0x05, 0xDA, 0x00, 0x05, 0xBC, 0x80, 0x05, 0xDB, 0x00, 0x05, 0xBC, 0x80, 0x05, 0xDC, 0x00, 0x05, 0xBC, 0x80, 0x05, 0xDE, 0x00, 0x05, 0xBC, 0x80, 0x05, 0xE0, 0x00, 0x05, 0xBC, 0x80, 0x05, 0xE1, 0x00, 0x05, 0xBC, 0x80, 0x05, 0xE3, 0x00, 0x05, 0xBC, 0x80, 0x05, 0xE4, 0x00, 0x05, 0xBC, 0x80, 0x05, 0xE6, 0x00, 0x05, 0xBC, 0x80, 0x05, 0xE7, 0x00, 0x05, 0xBC, 0x80, 0x05, 0xE8, 0x00, 0x05, 0xBC, 0x80, 0x05, 0xE9, 0x00, 0x05, 0xBC, 0x80, 0x05, 0xEA, 0x00, 0x05, 0xBC, 0x80, 0x05, 0xD5, 0x00, 0x05, 0xB9, 0x80, 0x05, 0xD1, 0x00, 0x05, 0xBF, 0x80, 0x05, 0xDB, 0x00, 0x05, 0xBF, 0x80, 0x05, 0xE4, 0x00, 0x05, 0xBF, 0xC0, 0x05, 0xD0, 0x00, 0x05, 0xDC, 0x18, 0x06, 0x71, 0x14, 0x06, 0x71, 0x18, 0x06, 0x7B, 0x14, 0x06, 0x7B, 0x0C, 0x06, 0x7B, 0x10, 0x06, 0x7B, 0x18, 0x06, 0x7E, 0x14, 0x06, 0x7E, 0x0C, 0x06, 0x7E, 0x10, 0x06, 0x7E, 0x18, 0x06, 0x80, 0x14, 0x06, 0x80, 0x0C, 0x06, 0x80, 0x10, 0x06, 0x80, 0x18, 0x06, 0x7A, 0x14, 0x06, 0x7A, 0x0C, 0x06, 0x7A, 0x10, 0x06, 0x7A, 0x18, 0x06, 0x7F, 0x14, 0x06, 0x7F, 0x0C, 0x06, 0x7F, 0x10, 0x06, 0x7F, 0x18, 0x06, 0x79, 0x14, 0x06, 0x79, 0x0C, 0x06, 0x79, 0x10, 0x06, 0x79, 0x18, 0x06, 0xA4, 0x14, 0x06, 0xA4, 0x0C, 0x06, 0xA4, 0x10, 0x06, 0xA4, 0x18, 0x06, 0xA6, 0x14, 0x06, 0xA6, 0x0C, 0x06, 0xA6, 0x10, 0x06, 0xA6, 0x18, 0x06, 0x84, 0x14, 0x06, 0x84, 0x0C, 0x06, 0x84, 0x10, 0x06, 0x84, 0x18, 0x06, 0x83, 0x14, 0x06, 0x83, 0x0C, 0x06, 0x83, 0x10, 0x06, 0x83, 0x18, 0x06, 0x86, 0x14, 0x06, 0x86, 0x0C, 0x06, 0x86, 0x10, 0x06, 0x86, 0x18, 0x06, 0x87, 0x14, 0x06, 0x87, 0x0C, 0x06, 0x87, 0x10, 0x06, 0x87, 0x18, 0x06, 0x8D, 0x14, 0x06, 0x8D, 0x18, 0x06, 0x8C, 0x14, 0x06, 0x8C, 0x18, 0x06, 0x8E, 0x14, 0x06, 0x8E, 0x18, 0x06, 0x88, 0x14, 0x06, 0x88, 0x18, 0x06, 0x98, 0x14, 0x06, 0x98, 0x18, 0x06, 0x91, 0x14, 0x06, 0x91, 0x18, 0x06, 0xA9, 0x14, 0x06, 0xA9, 0x0C, 0x06, 0xA9, 0x10, 0x06, 0xA9, 0x18, 0x06, 0xAF, 0x14, 0x06, 0xAF, 0x0C, 0x06, 0xAF, 0x10, 0x06, 0xAF, 0x18, 0x06, 0xB3, 0x14, 0x06, 0xB3, 0x0C, 0x06, 0xB3, 0x10, 0x06, 0xB3, 0x18, 0x06, 0xB1, 0x14, 0x06, 0xB1, 0x0C, 0x06, 0xB1, 0x10, 0x06, 0xB1, 0x18, 0x06, 0xBA, 0x14, 0x06, 0xBA, 0x18, 0x06, 0xBB, 0x14, 0x06, 0xBB, 0x0C, 0x06, 0xBB, 0x10, 0x06, 0xBB, 0x18, 0x06, 0xC0, 0x14, 0x06, 0xC0, 0x18, 0x06, 0xC1, 0x14, 0x06, 0xC1, 0x0C, 0x06, 0xC1, 0x10, 0x06, 0xC1, 0x18, 0x06, 0xBE, 0x14, 0x06, 0xBE, 0x0C, 0x06, 0xBE, 0x10, 0x06, 0xBE, 0x18, 0x06, 0xD2, 0x14, 0x06, 0xD2, 0x18, 0x06, 0xD3, 0x14, 0x06, 0xD3, 0x18, 0x06, 0xAD, 0x14, 0x06, 0xAD, 0x0C, 0x06, 0xAD, 0x10, 0x06, 0xAD, 0x18, 0x06, 0xC7, 0x14, 0x06, 0xC7, 0x18, 0x06, 0xC6, 0x14, 0x06, 0xC6, 0x18, 0x06, 0xC8, 0x14, 0x06, 0xC8, 0x18, 0x06, 0x77, 0x18, 0x06, 0xCB, 0x14, 0x06, 0xCB, 0x18, 0x06, 0xC5, 0x14, 0x06, 0xC5, 0x18, 0x06, 0xC9, 0x14, 0x06, 0xC9, 0x18, 0x06, 0xD0, 0x14, 0x06, 0xD0, 0x0C, 0x06, 0xD0, 0x10, 0x06, 0xD0, 0x0C, 0x06, 0x49, 0x10, 0x06, 0x49, 0x98, 0x06, 0x26, 0x00, 0x06, 0x27, 0x94, 0x06, 0x26, 0x00, 0x06, 0x27, 0x98, 0x06, 0x26, 0x00, 0x06, 0xD5, 0x94, 0x06, 0x26, 0x00, 0x06, 0xD5, 0x98, 0x06, 0x26, 0x00, 0x06, 0x48, 0x94, 0x06, 0x26, 0x00, 0x06, 0x48, 0x98, 0x06, 0x26, 0x00, 0x06, 0xC7, 0x94, 0x06, 0x26, 0x00, 0x06, 0xC7, 0x98, 0x06, 0x26, 0x00, 0x06, 0xC6, 0x94, 0x06, 0x26, 0x00, 0x06, 0xC6, 0x98, 0x06, 0x26, 0x00, 0x06, 0xC8, 0x94, 0x06, 0x26, 0x00, 0x06, 0xC8, 0x98, 0x06, 0x26, 0x00, 0x06, 0xD0, 0x94, 0x06, 0x26, 0x00, 0x06, 0xD0, 0x8C, 0x06, 0x26, 0x00, 0x06, 0xD0, 0x98, 0x06, 0x26, 0x00, 0x06, 0x49, 0x94, 0x06, 0x26, 0x00, 0x06, 0x49, 0x8C, 0x06, 0x26, 0x00, 0x06, 0x49, 0x18, 0x06, 0xCC, 0x14, 0x06, 0xCC, 0x0C, 0x06, 0xCC, 0x10, 0x06, 0xCC, 0x98, 0x06, 0x26, 0x00, 0x06, 0x2C, 0x98, 0x06, 0x26, 0x00, 0x06, 0x2D, 0x98, 0x06, 0x26, 0x00, 0x06, 0x45, 0x98, 0x06, 0x26, 0x00, 0x06, 0x49, 0x98, 0x06, 0x26, 0x00, 0x06, 0x4A, 0x98, 0x06, 0x28, 0x00, 0x06, 0x2C, 0x98, 0x06, 0x28, 0x00, 0x06, 0x2D, 0x98, 0x06, 0x28, 0x00, 0x06, 0x2E, 0x98, 0x06, 0x28, 0x00, 0x06, 0x45, 0x98, 0x06, 0x28, 0x00, 0x06, 0x49, 0x98, 0x06, 0x28, 0x00, 0x06, 0x4A, 0x98, 0x06, 0x2A, 0x00, 0x06, 0x2C, 0x98, 0x06, 0x2A, 0x00, 0x06, 0x2D, 0x98, 0x06, 0x2A, 0x00, 0x06, 0x2E, 0x98, 0x06, 0x2A, 0x00, 0x06, 0x45, 0x98, 0x06, 0x2A, 0x00, 0x06, 0x49, 0x98, 0x06, 0x2A, 0x00, 0x06, 0x4A, 0x98, 0x06, 0x2B, 0x00, 0x06, 0x2C, 0x98, 0x06, 0x2B, 0x00, 0x06, 0x45, 0x98, 0x06, 0x2B, 0x00, 0x06, 0x49, 0x98, 0x06, 0x2B, 0x00, 0x06, 0x4A, 0x98, 0x06, 0x2C, 0x00, 0x06, 0x2D, 0x98, 0x06, 0x2C, 0x00, 0x06, 0x45, 0x98, 0x06, 0x2D, 0x00, 0x06, 0x2C, 0x98, 0x06, 0x2D, 0x00, 0x06, 0x45, 0x98, 0x06, 0x2E, 0x00, 0x06, 0x2C, 0x98, 0x06, 0x2E, 0x00, 0x06, 0x2D, 0x98, 0x06, 0x2E, 0x00, 0x06, 0x45, 0x98, 0x06, 0x33, 0x00, 0x06, 0x2C, 0x98, 0x06, 0x33, 0x00, 0x06, 0x2D, 0x98, 0x06, 0x33, 0x00, 0x06, 0x2E, 0x98, 0x06, 0x33, 0x00, 0x06, 0x45, 0x98, 0x06, 0x35, 0x00, 0x06, 0x2D, 0x98, 0x06, 0x35, 0x00, 0x06, 0x45, 0x98, 0x06, 0x36, 0x00, 0x06, 0x2C, 0x98, 0x06, 0x36, 0x00, 0x06, 0x2D, 0x98, 0x06, 0x36, 0x00, 0x06, 0x2E, 0x98, 0x06, 0x36, 0x00, 0x06, 0x45, 0x98, 0x06, 0x37, 0x00, 0x06, 0x2D, 0x98, 0x06, 0x37, 0x00, 0x06, 0x45, 0x98, 0x06, 0x38, 0x00, 0x06, 0x45, 0x98, 0x06, 0x39, 0x00, 0x06, 0x2C, 0x98, 0x06, 0x39, 0x00, 0x06, 0x45, 0x98, 0x06, 0x3A, 0x00, 0x06, 0x2C, 0x98, 0x06, 0x3A, 0x00, 0x06, 0x45, 0x98, 0x06, 0x41, 0x00, 0x06, 0x2C, 0x98, 0x06, 0x41, 0x00, 0x06, 0x2D, 0x98, 0x06, 0x41, 0x00, 0x06, 0x2E, 0x98, 0x06, 0x41, 0x00, 0x06, 0x45, 0x98, 0x06, 0x41, 0x00, 0x06, 0x49, 0x98, 0x06, 0x41, 0x00, 0x06, 0x4A, 0x98, 0x06, 0x42, 0x00, 0x06, 0x2D, 0x98, 0x06, 0x42, 0x00, 0x06, 0x45, 0x98, 0x06, 0x42, 0x00, 0x06, 0x49, 0x98, 0x06, 0x42, 0x00, 0x06, 0x4A, 0x98, 0x06, 0x43, 0x00, 0x06, 0x27, 0x98, 0x06, 0x43, 0x00, 0x06, 0x2C, 0x98, 0x06, 0x43, 0x00, 0x06, 0x2D, 0x98, 0x06, 0x43, 0x00, 0x06, 0x2E, 0x98, 0x06, 0x43, 0x00, 0x06, 0x44, 0x98, 0x06, 0x43, 0x00, 0x06, 0x45, 0x98, 0x06, 0x43, 0x00, 0x06, 0x49, 0x98, 0x06, 0x43, 0x00, 0x06, 0x4A, 0x98, 0x06, 0x44, 0x00, 0x06, 0x2C, 0x98, 0x06, 0x44, 0x00, 0x06, 0x2D, 0x98, 0x06, 0x44, 0x00, 0x06, 0x2E, 0x98, 0x06, 0x44, 0x00, 0x06, 0x45, 0x98, 0x06, 0x44, 0x00, 0x06, 0x49, 0x98, 0x06, 0x44, 0x00, 0x06, 0x4A, 0x98, 0x06, 0x45, 0x00, 0x06, 0x2C, 0x98, 0x06, 0x45, 0x00, 0x06, 0x2D, 0x98, 0x06, 0x45, 0x00, 0x06, 0x2E, 0x98, 0x06, 0x45, 0x00, 0x06, 0x45, 0x98, 0x06, 0x45, 0x00, 0x06, 0x49, 0x98, 0x06, 0x45, 0x00, 0x06, 0x4A, 0x98, 0x06, 0x46, 0x00, 0x06, 0x2C, 0x98, 0x06, 0x46, 0x00, 0x06, 0x2D, 0x98, 0x06, 0x46, 0x00, 0x06, 0x2E, 0x98, 0x06, 0x46, 0x00, 0x06, 0x45, 0x98, 0x06, 0x46, 0x00, 0x06, 0x49, 0x98, 0x06, 0x46, 0x00, 0x06, 0x4A, 0x98, 0x06, 0x47, 0x00, 0x06, 0x2C, 0x98, 0x06, 0x47, 0x00, 0x06, 0x45, 0x98, 0x06, 0x47, 0x00, 0x06, 0x49, 0x98, 0x06, 0x47, 0x00, 0x06, 0x4A, 0x98, 0x06, 0x4A, 0x00, 0x06, 0x2C, 0x98, 0x06, 0x4A, 0x00, 0x06, 0x2D, 0x98, 0x06, 0x4A, 0x00, 0x06, 0x2E, 0x98, 0x06, 0x4A, 0x00, 0x06, 0x45, 0x98, 0x06, 0x4A, 0x00, 0x06, 0x49, 0x98, 0x06, 0x4A, 0x00, 0x06, 0x4A, 0x98, 0x06, 0x30, 0x00, 0x06, 0x70, 0x98, 0x06, 0x31, 0x00, 0x06, 0x70, 0x98, 0x06, 0x49, 0x00, 0x06, 0x70, 0x98, 0x00, 0x20, 0x80, 0x06, 0x4C, 0x00, 0x06, 0x51, 0x98, 0x00, 0x20, 0x80, 0x06, 0x4D, 0x00, 0x06, 0x51, 0x98, 0x00, 0x20, 0x80, 0x06, 0x4E, 0x00, 0x06, 0x51, 0x98, 0x00, 0x20, 0x80, 0x06, 0x4F, 0x00, 0x06, 0x51, 0x98, 0x00, 0x20, 0x80, 0x06, 0x50, 0x00, 0x06, 0x51, 0x98, 0x00, 0x20, 0x80, 0x06, 0x51, 0x00, 0x06, 0x70, 0x94, 0x06, 0x26, 0x00, 0x06, 0x31, 0x94, 0x06, 0x26, 0x00, 0x06, 0x32, 0x94, 0x06, 0x26, 0x00, 0x06, 0x45, 0x94, 0x06, 0x26, 0x00, 0x06, 0x46, 0x94, 0x06, 0x26, 0x00, 0x06, 0x49, 0x94, 0x06, 0x26, 0x00, 0x06, 0x4A, 0x94, 0x06, 0x28, 0x00, 0x06, 0x31, 0x94, 0x06, 0x28, 0x00, 0x06, 0x32, 0x94, 0x06, 0x28, 0x00, 0x06, 0x45, 0x94, 0x06, 0x28, 0x00, 0x06, 0x46, 0x94, 0x06, 0x28, 0x00, 0x06, 0x49, 0x94, 0x06, 0x28, 0x00, 0x06, 0x4A, 0x94, 0x06, 0x2A, 0x00, 0x06, 0x31, 0x94, 0x06, 0x2A, 0x00, 0x06, 0x32, 0x94, 0x06, 0x2A, 0x00, 0x06, 0x45, 0x94, 0x06, 0x2A, 0x00, 0x06, 0x46, 0x94, 0x06, 0x2A, 0x00, 0x06, 0x49, 0x94, 0x06, 0x2A, 0x00, 0x06, 0x4A, 0x94, 0x06, 0x2B, 0x00, 0x06, 0x31, 0x94, 0x06, 0x2B, 0x00, 0x06, 0x32, 0x94, 0x06, 0x2B, 0x00, 0x06, 0x45, 0x94, 0x06, 0x2B, 0x00, 0x06, 0x46, 0x94, 0x06, 0x2B, 0x00, 0x06, 0x49, 0x94, 0x06, 0x2B, 0x00, 0x06, 0x4A, 0x94, 0x06, 0x41, 0x00, 0x06, 0x49, 0x94, 0x06, 0x41, 0x00, 0x06, 0x4A, 0x94, 0x06, 0x42, 0x00, 0x06, 0x49, 0x94, 0x06, 0x42, 0x00, 0x06, 0x4A, 0x94, 0x06, 0x43, 0x00, 0x06, 0x27, 0x94, 0x06, 0x43, 0x00, 0x06, 0x44, 0x94, 0x06, 0x43, 0x00, 0x06, 0x45, 0x94, 0x06, 0x43, 0x00, 0x06, 0x49, 0x94, 0x06, 0x43, 0x00, 0x06, 0x4A, 0x94, 0x06, 0x44, 0x00, 0x06, 0x45, 0x94, 0x06, 0x44, 0x00, 0x06, 0x49, 0x94, 0x06, 0x44, 0x00, 0x06, 0x4A, 0x94, 0x06, 0x45, 0x00, 0x06, 0x27, 0x94, 0x06, 0x45, 0x00, 0x06, 0x45, 0x94, 0x06, 0x46, 0x00, 0x06, 0x31, 0x94, 0x06, 0x46, 0x00, 0x06, 0x32, 0x94, 0x06, 0x46, 0x00, 0x06, 0x45, 0x94, 0x06, 0x46, 0x00, 0x06, 0x46, 0x94, 0x06, 0x46, 0x00, 0x06, 0x49, 0x94, 0x06, 0x46, 0x00, 0x06, 0x4A, 0x94, 0x06, 0x49, 0x00, 0x06, 0x70, 0x94, 0x06, 0x4A, 0x00, 0x06, 0x31, 0x94, 0x06, 0x4A, 0x00, 0x06, 0x32, 0x94, 0x06, 0x4A, 0x00, 0x06, 0x45, 0x94, 0x06, 0x4A, 0x00, 0x06, 0x46, 0x94, 0x06, 0x4A, 0x00, 0x06, 0x49, 0x94, 0x06, 0x4A, 0x00, 0x06, 0x4A, 0x8C, 0x06, 0x26, 0x00, 0x06, 0x2C, 0x8C, 0x06, 0x26, 0x00, 0x06, 0x2D, 0x8C, 0x06, 0x26, 0x00, 0x06, 0x2E, 0x8C, 0x06, 0x26, 0x00, 0x06, 0x45, 0x8C, 0x06, 0x26, 0x00, 0x06, 0x47, 0x8C, 0x06, 0x28, 0x00, 0x06, 0x2C, 0x8C, 0x06, 0x28, 0x00, 0x06, 0x2D, 0x8C, 0x06, 0x28, 0x00, 0x06, 0x2E, 0x8C, 0x06, 0x28, 0x00, 0x06, 0x45, 0x8C, 0x06, 0x28, 0x00, 0x06, 0x47, 0x8C, 0x06, 0x2A, 0x00, 0x06, 0x2C, 0x8C, 0x06, 0x2A, 0x00, 0x06, 0x2D, 0x8C, 0x06, 0x2A, 0x00, 0x06, 0x2E, 0x8C, 0x06, 0x2A, 0x00, 0x06, 0x45, 0x8C, 0x06, 0x2A, 0x00, 0x06, 0x47, 0x8C, 0x06, 0x2B, 0x00, 0x06, 0x45, 0x8C, 0x06, 0x2C, 0x00, 0x06, 0x2D, 0x8C, 0x06, 0x2C, 0x00, 0x06, 0x45, 0x8C, 0x06, 0x2D, 0x00, 0x06, 0x2C, 0x8C, 0x06, 0x2D, 0x00, 0x06, 0x45, 0x8C, 0x06, 0x2E, 0x00, 0x06, 0x2C, 0x8C, 0x06, 0x2E, 0x00, 0x06, 0x45, 0x8C, 0x06, 0x33, 0x00, 0x06, 0x2C, 0x8C, 0x06, 0x33, 0x00, 0x06, 0x2D, 0x8C, 0x06, 0x33, 0x00, 0x06, 0x2E, 0x8C, 0x06, 0x33, 0x00, 0x06, 0x45, 0x8C, 0x06, 0x35, 0x00, 0x06, 0x2D, 0x8C, 0x06, 0x35, 0x00, 0x06, 0x2E, 0x8C, 0x06, 0x35, 0x00, 0x06, 0x45, 0x8C, 0x06, 0x36, 0x00, 0x06, 0x2C, 0x8C, 0x06, 0x36, 0x00, 0x06, 0x2D, 0x8C, 0x06, 0x36, 0x00, 0x06, 0x2E, 0x8C, 0x06, 0x36, 0x00, 0x06, 0x45, 0x8C, 0x06, 0x37, 0x00, 0x06, 0x2D, 0x8C, 0x06, 0x38, 0x00, 0x06, 0x45, 0x8C, 0x06, 0x39, 0x00, 0x06, 0x2C, 0x8C, 0x06, 0x39, 0x00, 0x06, 0x45, 0x8C, 0x06, 0x3A, 0x00, 0x06, 0x2C, 0x8C, 0x06, 0x3A, 0x00, 0x06, 0x45, 0x8C, 0x06, 0x41, 0x00, 0x06, 0x2C, 0x8C, 0x06, 0x41, 0x00, 0x06, 0x2D, 0x8C, 0x06, 0x41, 0x00, 0x06, 0x2E, 0x8C, 0x06, 0x41, 0x00, 0x06, 0x45, 0x8C, 0x06, 0x42, 0x00, 0x06, 0x2D, 0x8C, 0x06, 0x42, 0x00, 0x06, 0x45, 0x8C, 0x06, 0x43, 0x00, 0x06, 0x2C, 0x8C, 0x06, 0x43, 0x00, 0x06, 0x2D, 0x8C, 0x06, 0x43, 0x00, 0x06, 0x2E, 0x8C, 0x06, 0x43, 0x00, 0x06, 0x44, 0x8C, 0x06, 0x43, 0x00, 0x06, 0x45, 0x8C, 0x06, 0x44, 0x00, 0x06, 0x2C, 0x8C, 0x06, 0x44, 0x00, 0x06, 0x2D, 0x8C, 0x06, 0x44, 0x00, 0x06, 0x2E, 0x8C, 0x06, 0x44, 0x00, 0x06, 0x45, 0x8C, 0x06, 0x44, 0x00, 0x06, 0x47, 0x8C, 0x06, 0x45, 0x00, 0x06, 0x2C, 0x8C, 0x06, 0x45, 0x00, 0x06, 0x2D, 0x8C, 0x06, 0x45, 0x00, 0x06, 0x2E, 0x8C, 0x06, 0x45, 0x00, 0x06, 0x45, 0x8C, 0x06, 0x46, 0x00, 0x06, 0x2C, 0x8C, 0x06, 0x46, 0x00, 0x06, 0x2D, 0x8C, 0x06, 0x46, 0x00, 0x06, 0x2E, 0x8C, 0x06, 0x46, 0x00, 0x06, 0x45, 0x8C, 0x06, 0x46, 0x00, 0x06, 0x47, 0x8C, 0x06, 0x47, 0x00, 0x06, 0x2C, 0x8C, 0x06, 0x47, 0x00, 0x06, 0x45, 0x8C, 0x06, 0x47, 0x00, 0x06, 0x70, 0x8C, 0x06, 0x4A, 0x00, 0x06, 0x2C, 0x8C, 0x06, 0x4A, 0x00, 0x06, 0x2D, 0x8C, 0x06, 0x4A, 0x00, 0x06, 0x2E, 0x8C, 0x06, 0x4A, 0x00, 0x06, 0x45, 0x8C, 0x06, 0x4A, 0x00, 0x06, 0x47, 0x90, 0x06, 0x26, 0x00, 0x06, 0x45, 0x90, 0x06, 0x26, 0x00, 0x06, 0x47, 0x90, 0x06, 0x28, 0x00, 0x06, 0x45, 0x90, 0x06, 0x28, 0x00, 0x06, 0x47, 0x90, 0x06, 0x2A, 0x00, 0x06, 0x45, 0x90, 0x06, 0x2A, 0x00, 0x06, 0x47, 0x90, 0x06, 0x2B, 0x00, 0x06, 0x45, 0x90, 0x06, 0x2B, 0x00, 0x06, 0x47, 0x90, 0x06, 0x33, 0x00, 0x06, 0x45, 0x90, 0x06, 0x33, 0x00, 0x06, 0x47, 0x90, 0x06, 0x34, 0x00, 0x06, 0x45, 0x90, 0x06, 0x34, 0x00, 0x06, 0x47, 0x90, 0x06, 0x43, 0x00, 0x06, 0x44, 0x90, 0x06, 0x43, 0x00, 0x06, 0x45, 0x90, 0x06, 0x44, 0x00, 0x06, 0x45, 0x90, 0x06, 0x46, 0x00, 0x06, 0x45, 0x90, 0x06, 0x46, 0x00, 0x06, 0x47, 0x90, 0x06, 0x4A, 0x00, 0x06, 0x45, 0x90, 0x06, 0x4A, 0x00, 0x06, 0x47, 0x90, 0x06, 0x40, 0x80, 0x06, 0x4E, 0x00, 0x06, 0x51, 0x90, 0x06, 0x40, 0x80, 0x06, 0x4F, 0x00, 0x06, 0x51, 0x90, 0x06, 0x40, 0x80, 0x06, 0x50, 0x00, 0x06, 0x51, 0x98, 0x06, 0x37, 0x00, 0x06, 0x49, 0x98, 0x06, 0x37, 0x00, 0x06, 0x4A, 0x98, 0x06, 0x39, 0x00, 0x06, 0x49, 0x98, 0x06, 0x39, 0x00, 0x06, 0x4A, 0x98, 0x06, 0x3A, 0x00, 0x06, 0x49, 0x98, 0x06, 0x3A, 0x00, 0x06, 0x4A, 0x98, 0x06, 0x33, 0x00, 0x06, 0x49, 0x98, 0x06, 0x33, 0x00, 0x06, 0x4A, 0x98, 0x06, 0x34, 0x00, 0x06, 0x49, 0x98, 0x06, 0x34, 0x00, 0x06, 0x4A, 0x98, 0x06, 0x2D, 0x00, 0x06, 0x49, 0x98, 0x06, 0x2D, 0x00, 0x06, 0x4A, 0x98, 0x06, 0x2C, 0x00, 0x06, 0x49, 0x98, 0x06, 0x2C, 0x00, 0x06, 0x4A, 0x98, 0x06, 0x2E, 0x00, 0x06, 0x49, 0x98, 0x06, 0x2E, 0x00, 0x06, 0x4A, 0x98, 0x06, 0x35, 0x00, 0x06, 0x49, 0x98, 0x06, 0x35, 0x00, 0x06, 0x4A, 0x98, 0x06, 0x36, 0x00, 0x06, 0x49, 0x98, 0x06, 0x36, 0x00, 0x06, 0x4A, 0x98, 0x06, 0x34, 0x00, 0x06, 0x2C, 0x98, 0x06, 0x34, 0x00, 0x06, 0x2D, 0x98, 0x06, 0x34, 0x00, 0x06, 0x2E, 0x98, 0x06, 0x34, 0x00, 0x06, 0x45, 0x98, 0x06, 0x34, 0x00, 0x06, 0x31, 0x98, 0x06, 0x33, 0x00, 0x06, 0x31, 0x98, 0x06, 0x35, 0x00, 0x06, 0x31, 0x98, 0x06, 0x36, 0x00, 0x06, 0x31, 0x94, 0x06, 0x37, 0x00, 0x06, 0x49, 0x94, 0x06, 0x37, 0x00, 0x06, 0x4A, 0x94, 0x06, 0x39, 0x00, 0x06, 0x49, 0x94, 0x06, 0x39, 0x00, 0x06, 0x4A, 0x94, 0x06, 0x3A, 0x00, 0x06, 0x49, 0x94, 0x06, 0x3A, 0x00, 0x06, 0x4A, 0x94, 0x06, 0x33, 0x00, 0x06, 0x49, 0x94, 0x06, 0x33, 0x00, 0x06, 0x4A, 0x94, 0x06, 0x34, 0x00, 0x06, 0x49, 0x94, 0x06, 0x34, 0x00, 0x06, 0x4A, 0x94, 0x06, 0x2D, 0x00, 0x06, 0x49, 0x94, 0x06, 0x2D, 0x00, 0x06, 0x4A, 0x94, 0x06, 0x2C, 0x00, 0x06, 0x49, 0x94, 0x06, 0x2C, 0x00, 0x06, 0x4A, 0x94, 0x06, 0x2E, 0x00, 0x06, 0x49, 0x94, 0x06, 0x2E, 0x00, 0x06, 0x4A, 0x94, 0x06, 0x35, 0x00, 0x06, 0x49, 0x94, 0x06, 0x35, 0x00, 0x06, 0x4A, 0x94, 0x06, 0x36, 0x00, 0x06, 0x49, 0x94, 0x06, 0x36, 0x00, 0x06, 0x4A, 0x94, 0x06, 0x34, 0x00, 0x06, 0x2C, 0x94, 0x06, 0x34, 0x00, 0x06, 0x2D, 0x94, 0x06, 0x34, 0x00, 0x06, 0x2E, 0x94, 0x06, 0x34, 0x00, 0x06, 0x45, 0x94, 0x06, 0x34, 0x00, 0x06, 0x31, 0x94, 0x06, 0x33, 0x00, 0x06, 0x31, 0x94, 0x06, 0x35, 0x00, 0x06, 0x31, 0x94, 0x06, 0x36, 0x00, 0x06, 0x31, 0x8C, 0x06, 0x34, 0x00, 0x06, 0x2C, 0x8C, 0x06, 0x34, 0x00, 0x06, 0x2D, 0x8C, 0x06, 0x34, 0x00, 0x06, 0x2E, 0x8C, 0x06, 0x34, 0x00, 0x06, 0x45, 0x8C, 0x06, 0x33, 0x00, 0x06, 0x47, 0x8C, 0x06, 0x34, 0x00, 0x06, 0x47, 0x8C, 0x06, 0x37, 0x00, 0x06, 0x45, 0x90, 0x06, 0x33, 0x00, 0x06, 0x2C, 0x90, 0x06, 0x33, 0x00, 0x06, 0x2D, 0x90, 0x06, 0x33, 0x00, 0x06, 0x2E, 0x90, 0x06, 0x34, 0x00, 0x06, 0x2C, 0x90, 0x06, 0x34, 0x00, 0x06, 0x2D, 0x90, 0x06, 0x34, 0x00, 0x06, 0x2E, 0x90, 0x06, 0x37, 0x00, 0x06, 0x45, 0x90, 0x06, 0x38, 0x00, 0x06, 0x45, 0x94, 0x06, 0x27, 0x00, 0x06, 0x4B, 0x98, 0x06, 0x27, 0x00, 0x06, 0x4B, 0x8C, 0x06, 0x2A, 0x80, 0x06, 0x2C, 0x00, 0x06, 0x45, 0x94, 0x06, 0x2A, 0x80, 0x06, 0x2D, 0x00, 0x06, 0x2C, 0x8C, 0x06, 0x2A, 0x80, 0x06, 0x2D, 0x00, 0x06, 0x2C, 0x8C, 0x06, 0x2A, 0x80, 0x06, 0x2D, 0x00, 0x06, 0x45, 0x8C, 0x06, 0x2A, 0x80, 0x06, 0x2E, 0x00, 0x06, 0x45, 0x8C, 0x06, 0x2A, 0x80, 0x06, 0x45, 0x00, 0x06, 0x2C, 0x8C, 0x06, 0x2A, 0x80, 0x06, 0x45, 0x00, 0x06, 0x2D, 0x8C, 0x06, 0x2A, 0x80, 0x06, 0x45, 0x00, 0x06, 0x2E, 0x94, 0x06, 0x2C, 0x80, 0x06, 0x45, 0x00, 0x06, 0x2D, 0x8C, 0x06, 0x2C, 0x80, 0x06, 0x45, 0x00, 0x06, 0x2D, 0x94, 0x06, 0x2D, 0x80, 0x06, 0x45, 0x00, 0x06, 0x4A, 0x94, 0x06, 0x2D, 0x80, 0x06, 0x45, 0x00, 0x06, 0x49, 0x8C, 0x06, 0x33, 0x80, 0x06, 0x2D, 0x00, 0x06, 0x2C, 0x8C, 0x06, 0x33, 0x80, 0x06, 0x2C, 0x00, 0x06, 0x2D, 0x94, 0x06, 0x33, 0x80, 0x06, 0x2C, 0x00, 0x06, 0x49, 0x94, 0x06, 0x33, 0x80, 0x06, 0x45, 0x00, 0x06, 0x2D, 0x8C, 0x06, 0x33, 0x80, 0x06, 0x45, 0x00, 0x06, 0x2D, 0x8C, 0x06, 0x33, 0x80, 0x06, 0x45, 0x00, 0x06, 0x2C, 0x94, 0x06, 0x33, 0x80, 0x06, 0x45, 0x00, 0x06, 0x45, 0x8C, 0x06, 0x33, 0x80, 0x06, 0x45, 0x00, 0x06, 0x45, 0x94, 0x06, 0x35, 0x80, 0x06, 0x2D, 0x00, 0x06, 0x2D, 0x8C, 0x06, 0x35, 0x80, 0x06, 0x2D, 0x00, 0x06, 0x2D, 0x94, 0x06, 0x35, 0x80, 0x06, 0x45, 0x00, 0x06, 0x45, 0x94, 0x06, 0x34, 0x80, 0x06, 0x2D, 0x00, 0x06, 0x45, 0x8C, 0x06, 0x34, 0x80, 0x06, 0x2D, 0x00, 0x06, 0x45, 0x94, 0x06, 0x34, 0x80, 0x06, 0x2C, 0x00, 0x06, 0x4A, 0x94, 0x06, 0x34, 0x80, 0x06, 0x45, 0x00, 0x06, 0x2E, 0x8C, 0x06, 0x34, 0x80, 0x06, 0x45, 0x00, 0x06, 0x2E, 0x94, 0x06, 0x34, 0x80, 0x06, 0x45, 0x00, 0x06, 0x45, 0x8C, 0x06, 0x34, 0x80, 0x06, 0x45, 0x00, 0x06, 0x45, 0x94, 0x06, 0x36, 0x80, 0x06, 0x2D, 0x00, 0x06, 0x49, 0x94, 0x06, 0x36, 0x80, 0x06, 0x2E, 0x00, 0x06, 0x45, 0x8C, 0x06, 0x36, 0x80, 0x06, 0x2E, 0x00, 0x06, 0x45, 0x94, 0x06, 0x37, 0x80, 0x06, 0x45, 0x00, 0x06, 0x2D, 0x8C, 0x06, 0x37, 0x80, 0x06, 0x45, 0x00, 0x06, 0x2D, 0x8C, 0x06, 0x37, 0x80, 0x06, 0x45, 0x00, 0x06, 0x45, 0x94, 0x06, 0x37, 0x80, 0x06, 0x45, 0x00, 0x06, 0x4A, 0x94, 0x06, 0x39, 0x80, 0x06, 0x2C, 0x00, 0x06, 0x45, 0x94, 0x06, 0x39, 0x80, 0x06, 0x45, 0x00, 0x06, 0x45, 0x8C, 0x06, 0x39, 0x80, 0x06, 0x45, 0x00, 0x06, 0x45, 0x94, 0x06, 0x39, 0x80, 0x06, 0x45, 0x00, 0x06, 0x49, 0x94, 0x06, 0x3A, 0x80, 0x06, 0x45, 0x00, 0x06, 0x45, 0x94, 0x06, 0x3A, 0x80, 0x06, 0x45, 0x00, 0x06, 0x4A, 0x94, 0x06, 0x3A, 0x80, 0x06, 0x45, 0x00, 0x06, 0x49, 0x94, 0x06, 0x41, 0x80, 0x06, 0x2E, 0x00, 0x06, 0x45, 0x8C, 0x06, 0x41, 0x80, 0x06, 0x2E, 0x00, 0x06, 0x45, 0x94, 0x06, 0x42, 0x80, 0x06, 0x45, 0x00, 0x06, 0x2D, 0x94, 0x06, 0x42, 0x80, 0x06, 0x45, 0x00, 0x06, 0x45, 0x94, 0x06, 0x44, 0x80, 0x06, 0x2D, 0x00, 0x06, 0x45, 0x94, 0x06, 0x44, 0x80, 0x06, 0x2D, 0x00, 0x06, 0x4A, 0x94, 0x06, 0x44, 0x80, 0x06, 0x2D, 0x00, 0x06, 0x49, 0x8C, 0x06, 0x44, 0x80, 0x06, 0x2C, 0x00, 0x06, 0x2C, 0x94, 0x06, 0x44, 0x80, 0x06, 0x2C, 0x00, 0x06, 0x2C, 0x94, 0x06, 0x44, 0x80, 0x06, 0x2E, 0x00, 0x06, 0x45, 0x8C, 0x06, 0x44, 0x80, 0x06, 0x2E, 0x00, 0x06, 0x45, 0x94, 0x06, 0x44, 0x80, 0x06, 0x45, 0x00, 0x06, 0x2D, 0x8C, 0x06, 0x44, 0x80, 0x06, 0x45, 0x00, 0x06, 0x2D, 0x8C, 0x06, 0x45, 0x80, 0x06, 0x2D, 0x00, 0x06, 0x2C, 0x8C, 0x06, 0x45, 0x80, 0x06, 0x2D, 0x00, 0x06, 0x45, 0x94, 0x06, 0x45, 0x80, 0x06, 0x2D, 0x00, 0x06, 0x4A, 0x8C, 0x06, 0x45, 0x80, 0x06, 0x2C, 0x00, 0x06, 0x2D, 0x8C, 0x06, 0x45, 0x80, 0x06, 0x2C, 0x00, 0x06, 0x45, 0x8C, 0x06, 0x45, 0x80, 0x06, 0x2E, 0x00, 0x06, 0x2C, 0x8C, 0x06, 0x45, 0x80, 0x06, 0x2E, 0x00, 0x06, 0x45, 0x8C, 0x06, 0x45, 0x80, 0x06, 0x2C, 0x00, 0x06, 0x2E, 0x8C, 0x06, 0x47, 0x80, 0x06, 0x45, 0x00, 0x06, 0x2C, 0x8C, 0x06, 0x47, 0x80, 0x06, 0x45, 0x00, 0x06, 0x45, 0x8C, 0x06, 0x46, 0x80, 0x06, 0x2D, 0x00, 0x06, 0x45, 0x94, 0x06, 0x46, 0x80, 0x06, 0x2D, 0x00, 0x06, 0x49, 0x94, 0x06, 0x46, 0x80, 0x06, 0x2C, 0x00, 0x06, 0x45, 0x8C, 0x06, 0x46, 0x80, 0x06, 0x2C, 0x00, 0x06, 0x45, 0x94, 0x06, 0x46, 0x80, 0x06, 0x2C, 0x00, 0x06, 0x49, 0x94, 0x06, 0x46, 0x80, 0x06, 0x45, 0x00, 0x06, 0x4A, 0x94, 0x06, 0x46, 0x80, 0x06, 0x45, 0x00, 0x06, 0x49, 0x94, 0x06, 0x4A, 0x80, 0x06, 0x45, 0x00, 0x06, 0x45, 0x8C, 0x06, 0x4A, 0x80, 0x06, 0x45, 0x00, 0x06, 0x45, 0x94, 0x06, 0x28, 0x80, 0x06, 0x2E, 0x00, 0x06, 0x4A, 0x94, 0x06, 0x2A, 0x80, 0x06, 0x2C, 0x00, 0x06, 0x4A, 0x94, 0x06, 0x2A, 0x80, 0x06, 0x2C, 0x00, 0x06, 0x49, 0x94, 0x06, 0x2A, 0x80, 0x06, 0x2E, 0x00, 0x06, 0x4A, 0x94, 0x06, 0x2A, 0x80, 0x06, 0x2E, 0x00, 0x06, 0x49, 0x94, 0x06, 0x2A, 0x80, 0x06, 0x45, 0x00, 0x06, 0x4A, 0x94, 0x06, 0x2A, 0x80, 0x06, 0x45, 0x00, 0x06, 0x49, 0x94, 0x06, 0x2C, 0x80, 0x06, 0x45, 0x00, 0x06, 0x4A, 0x94, 0x06, 0x2C, 0x80, 0x06, 0x2D, 0x00, 0x06, 0x49, 0x94, 0x06, 0x2C, 0x80, 0x06, 0x45, 0x00, 0x06, 0x49, 0x94, 0x06, 0x33, 0x80, 0x06, 0x2E, 0x00, 0x06, 0x49, 0x94, 0x06, 0x35, 0x80, 0x06, 0x2D, 0x00, 0x06, 0x4A, 0x94, 0x06, 0x34, 0x80, 0x06, 0x2D, 0x00, 0x06, 0x4A, 0x94, 0x06, 0x36, 0x80, 0x06, 0x2D, 0x00, 0x06, 0x4A, 0x94, 0x06, 0x44, 0x80, 0x06, 0x2C, 0x00, 0x06, 0x4A, 0x94, 0x06, 0x44, 0x80, 0x06, 0x45, 0x00, 0x06, 0x4A, 0x94, 0x06, 0x4A, 0x80, 0x06, 0x2D, 0x00, 0x06, 0x4A, 0x94, 0x06, 0x4A, 0x80, 0x06, 0x2C, 0x00, 0x06, 0x4A, 0x94, 0x06, 0x4A, 0x80, 0x06, 0x45, 0x00, 0x06, 0x4A, 0x94, 0x06, 0x45, 0x80, 0x06, 0x45, 0x00, 0x06, 0x4A, 0x94, 0x06, 0x42, 0x80, 0x06, 0x45, 0x00, 0x06, 0x4A, 0x94, 0x06, 0x46, 0x80, 0x06, 0x2D, 0x00, 0x06, 0x4A, 0x8C, 0x06, 0x42, 0x80, 0x06, 0x45, 0x00, 0x06, 0x2D, 0x8C, 0x06, 0x44, 0x80, 0x06, 0x2D, 0x00, 0x06, 0x45, 0x94, 0x06, 0x39, 0x80, 0x06, 0x45, 0x00, 0x06, 0x4A, 0x94, 0x06, 0x43, 0x80, 0x06, 0x45, 0x00, 0x06, 0x4A, 0x8C, 0x06, 0x46, 0x80, 0x06, 0x2C, 0x00, 0x06, 0x2D, 0x94, 0x06, 0x45, 0x80, 0x06, 0x2E, 0x00, 0x06, 0x4A, 0x8C, 0x06, 0x44, 0x80, 0x06, 0x2C, 0x00, 0x06, 0x45, 0x94, 0x06, 0x43, 0x80, 0x06, 0x45, 0x00, 0x06, 0x45, 0x94, 0x06, 0x44, 0x80, 0x06, 0x2C, 0x00, 0x06, 0x45, 0x94, 0x06, 0x46, 0x80, 0x06, 0x2C, 0x00, 0x06, 0x2D, 0x94, 0x06, 0x2C, 0x80, 0x06, 0x2D, 0x00, 0x06, 0x4A, 0x94, 0x06, 0x2D, 0x80, 0x06, 0x2C, 0x00, 0x06, 0x4A, 0x94, 0x06, 0x45, 0x80, 0x06, 0x2C, 0x00, 0x06, 0x4A, 0x94, 0x06, 0x41, 0x80, 0x06, 0x45, 0x00, 0x06, 0x4A, 0x94, 0x06, 0x28, 0x80, 0x06, 0x2D, 0x00, 0x06, 0x4A, 0x8C, 0x06, 0x43, 0x80, 0x06, 0x45, 0x00, 0x06, 0x45, 0x8C, 0x06, 0x39, 0x80, 0x06, 0x2C, 0x00, 0x06, 0x45, 0x8C, 0x06, 0x35, 0x80, 0x06, 0x45, 0x00, 0x06, 0x45, 0x94, 0x06, 0x33, 0x80, 0x06, 0x2E, 0x00, 0x06, 0x4A, 0x94, 0x06, 0x46, 0x80, 0x06, 0x2C, 0x00, 0x06, 0x4A, 0x98, 0x06, 0x35, 0x80, 0x06, 0x44, 0x00, 0x06, 0xD2, 0x98, 0x06, 0x42, 0x80, 0x06, 0x44, 0x00, 0x06, 0xD2, 0x98, 0x06, 0x27, 0x80, 0x06, 0x44, 0x80, 0x06, 0x44, 0x00, 0x06, 0x47, 0x98, 0x06, 0x27, 0x80, 0x06, 0x43, 0x80, 0x06, 0x28, 0x00, 0x06, 0x31, 0x98, 0x06, 0x45, 0x80, 0x06, 0x2D, 0x80, 0x06, 0x45, 0x00, 0x06, 0x2F, 0x98, 0x06, 0x35, 0x80, 0x06, 0x44, 0x80, 0x06, 0x39, 0x00, 0x06, 0x45, 0x98, 0x06, 0x31, 0x80, 0x06, 0x33, 0x80, 0x06, 0x48, 0x00, 0x06, 0x44, 0x98, 0x06, 0x39, 0x80, 0x06, 0x44, 0x80, 0x06, 0x4A, 0x00, 0x06, 0x47, 0x98, 0x06, 0x48, 0x80, 0x06, 0x33, 0x80, 0x06, 0x44, 0x00, 0x06, 0x45, 0x98, 0x06, 0x35, 0x80, 0x06, 0x44, 0x00, 0x06, 0x49, 0x98, 0x06, 0x35, 0x80, 0x06, 0x44, 0x80, 0x06, 0x49, 0x80, 0x00, 0x20, 0x80, 0x06, 0x27, 0x80, 0x06, 0x44, 0x80, 0x06, 0x44, 0x80, 0x06, 0x47, 0x80, 0x00, 0x20, 0x80, 0x06, 0x39, 0x80, 0x06, 0x44, 0x80, 0x06, 0x4A, 0x80, 0x06, 0x47, 0x80, 0x00, 0x20, 0x80, 0x06, 0x48, 0x80, 0x06, 0x33, 0x80, 0x06, 0x44, 0x00, 0x06, 0x45, 0x98, 0x06, 0x2C, 0x80, 0x06, 0x44, 0x80, 0x00, 0x20, 0x80, 0x06, 0x2C, 0x80, 0x06, 0x44, 0x80, 0x06, 0x27, 0x80, 0x06, 0x44, 0x00, 0x06, 0x47, 0x98, 0x06, 0x31, 0x80, 0x06, 0xCC, 0x80, 0x06, 0x27, 0x00, 0x06, 0x44, 0x28, 0x00, 0x2C, 0x28, 0x30, 0x01, 0x28, 0x30, 0x02, 0x28, 0x00, 0x3A, 0x28, 0x00, 0x3B, 0x28, 0x00, 0x21, 0x28, 0x00, 0x3F, 0x28, 0x30, 0x16, 0x28, 0x30, 0x17, 0x28, 0x20, 0x26, 0x28, 0x20, 0x25, 0x28, 0x20, 0x14, 0x28, 0x20, 0x13, 0x28, 0x00, 0x5F, 0x28, 0x00, 0x5F, 0x28, 0x00, 0x28, 0x28, 0x00, 0x29, 0x28, 0x00, 0x7B, 0x28, 0x00, 0x7D, 0x28, 0x30, 0x14, 0x28, 0x30, 0x15, 0x28, 0x30, 0x10, 0x28, 0x30, 0x11, 0x28, 0x30, 0x0A, 0x28, 0x30, 0x0B, 0x28, 0x30, 0x08, 0x28, 0x30, 0x09, 0x28, 0x30, 0x0C, 0x28, 0x30, 0x0D, 0x28, 0x30, 0x0E, 0x28, 0x30, 0x0F, 0x28, 0x00, 0x5B, 0x28, 0x00, 0x5D, 0x40, 0x20, 0x3E, 0x40, 0x20, 0x3E, 0x40, 0x20, 0x3E, 0x40, 0x20, 0x3E, 0x40, 0x00, 0x5F, 0x40, 0x00, 0x5F, 0x40, 0x00, 0x5F, 0x34, 0x00, 0x2C, 0x34, 0x30, 0x01, 0x34, 0x00, 0x2E, 0x34, 0x00, 0x3B, 0x34, 0x00, 0x3A, 0x34, 0x00, 0x3F, 0x34, 0x00, 0x21, 0x34, 0x20, 0x14, 0x34, 0x00, 0x28, 0x34, 0x00, 0x29, 0x34, 0x00, 0x7B, 0x34, 0x00, 0x7D, 0x34, 0x30, 0x14, 0x34, 0x30, 0x15, 0x34, 0x00, 0x23, 0x34, 0x00, 0x26, 0x34, 0x00, 0x2A, 0x34, 0x00, 0x2B, 0x34, 0x00, 0x2D, 0x34, 0x00, 0x3C, 0x34, 0x00, 0x3E, 0x34, 0x00, 0x3D, 0x34, 0x00, 0x5C, 0x34, 0x00, 0x24, 0x34, 0x00, 0x25, 0x34, 0x00, 0x40, 0x98, 0x00, 0x20, 0x00, 0x06, 0x4B, 0x90, 0x06, 0x40, 0x00, 0x06, 0x4B, 0x98, 0x00, 0x20, 0x00, 0x06, 0x4C, 0x98, 0x00, 0x20, 0x00, 0x06, 0x4D, 0x98, 0x00, 0x20, 0x00, 0x06, 0x4E, 0x90, 0x06, 0x40, 0x00, 0x06, 0x4E, 0x98, 0x00, 0x20, 0x00, 0x06, 0x4F, 0x90, 0x06, 0x40, 0x00, 0x06, 0x4F, 0x98, 0x00, 0x20, 0x00, 0x06, 0x50, 0x90, 0x06, 0x40, 0x00, 0x06, 0x50, 0x98, 0x00, 0x20, 0x00, 0x06, 0x51, 0x90, 0x06, 0x40, 0x00, 0x06, 0x51, 0x98, 0x00, 0x20, 0x00, 0x06, 0x52, 0x90, 0x06, 0x40, 0x00, 0x06, 0x52, 0x18, 0x06, 0x21, 0x18, 0x06, 0x22, 0x14, 0x06, 0x22, 0x18, 0x06, 0x23, 0x14, 0x06, 0x23, 0x18, 0x06, 0x24, 0x14, 0x06, 0x24, 0x18, 0x06, 0x25, 0x14, 0x06, 0x25, 0x18, 0x06, 0x26, 0x14, 0x06, 0x26, 0x0C, 0x06, 0x26, 0x10, 0x06, 0x26, 0x18, 0x06, 0x27, 0x14, 0x06, 0x27, 0x18, 0x06, 0x28, 0x14, 0x06, 0x28, 0x0C, 0x06, 0x28, 0x10, 0x06, 0x28, 0x18, 0x06, 0x29, 0x14, 0x06, 0x29, 0x18, 0x06, 0x2A, 0x14, 0x06, 0x2A, 0x0C, 0x06, 0x2A, 0x10, 0x06, 0x2A, 0x18, 0x06, 0x2B, 0x14, 0x06, 0x2B, 0x0C, 0x06, 0x2B, 0x10, 0x06, 0x2B, 0x18, 0x06, 0x2C, 0x14, 0x06, 0x2C, 0x0C, 0x06, 0x2C, 0x10, 0x06, 0x2C, 0x18, 0x06, 0x2D, 0x14, 0x06, 0x2D, 0x0C, 0x06, 0x2D, 0x10, 0x06, 0x2D, 0x18, 0x06, 0x2E, 0x14, 0x06, 0x2E, 0x0C, 0x06, 0x2E, 0x10, 0x06, 0x2E, 0x18, 0x06, 0x2F, 0x14, 0x06, 0x2F, 0x18, 0x06, 0x30, 0x14, 0x06, 0x30, 0x18, 0x06, 0x31, 0x14, 0x06, 0x31, 0x18, 0x06, 0x32, 0x14, 0x06, 0x32, 0x18, 0x06, 0x33, 0x14, 0x06, 0x33, 0x0C, 0x06, 0x33, 0x10, 0x06, 0x33, 0x18, 0x06, 0x34, 0x14, 0x06, 0x34, 0x0C, 0x06, 0x34, 0x10, 0x06, 0x34, 0x18, 0x06, 0x35, 0x14, 0x06, 0x35, 0x0C, 0x06, 0x35, 0x10, 0x06, 0x35, 0x18, 0x06, 0x36, 0x14, 0x06, 0x36, 0x0C, 0x06, 0x36, 0x10, 0x06, 0x36, 0x18, 0x06, 0x37, 0x14, 0x06, 0x37, 0x0C, 0x06, 0x37, 0x10, 0x06, 0x37, 0x18, 0x06, 0x38, 0x14, 0x06, 0x38, 0x0C, 0x06, 0x38, 0x10, 0x06, 0x38, 0x18, 0x06, 0x39, 0x14, 0x06, 0x39, 0x0C, 0x06, 0x39, 0x10, 0x06, 0x39, 0x18, 0x06, 0x3A, 0x14, 0x06, 0x3A, 0x0C, 0x06, 0x3A, 0x10, 0x06, 0x3A, 0x18, 0x06, 0x41, 0x14, 0x06, 0x41, 0x0C, 0x06, 0x41, 0x10, 0x06, 0x41, 0x18, 0x06, 0x42, 0x14, 0x06, 0x42, 0x0C, 0x06, 0x42, 0x10, 0x06, 0x42, 0x18, 0x06, 0x43, 0x14, 0x06, 0x43, 0x0C, 0x06, 0x43, 0x10, 0x06, 0x43, 0x18, 0x06, 0x44, 0x14, 0x06, 0x44, 0x0C, 0x06, 0x44, 0x10, 0x06, 0x44, 0x18, 0x06, 0x45, 0x14, 0x06, 0x45, 0x0C, 0x06, 0x45, 0x10, 0x06, 0x45, 0x18, 0x06, 0x46, 0x14, 0x06, 0x46, 0x0C, 0x06, 0x46, 0x10, 0x06, 0x46, 0x18, 0x06, 0x47, 0x14, 0x06, 0x47, 0x0C, 0x06, 0x47, 0x10, 0x06, 0x47, 0x18, 0x06, 0x48, 0x14, 0x06, 0x48, 0x18, 0x06, 0x49, 0x14, 0x06, 0x49, 0x18, 0x06, 0x4A, 0x14, 0x06, 0x4A, 0x0C, 0x06, 0x4A, 0x10, 0x06, 0x4A, 0x98, 0x06, 0x44, 0x00, 0x06, 0x22, 0x94, 0x06, 0x44, 0x00, 0x06, 0x22, 0x98, 0x06, 0x44, 0x00, 0x06, 0x23, 0x94, 0x06, 0x44, 0x00, 0x06, 0x23, 0x98, 0x06, 0x44, 0x00, 0x06, 0x25, 0x94, 0x06, 0x44, 0x00, 0x06, 0x25, 0x98, 0x06, 0x44, 0x00, 0x06, 0x27, 0x94, 0x06, 0x44, 0x00, 0x06, 0x27, 0x2C, 0x00, 0x21, 0x2C, 0x00, 0x22, 0x2C, 0x00, 0x23, 0x2C, 0x00, 0x24, 0x2C, 0x00, 0x25, 0x2C, 0x00, 0x26, 0x2C, 0x00, 0x27, 0x2C, 0x00, 0x28, 0x2C, 0x00, 0x29, 0x2C, 0x00, 0x2A, 0x2C, 0x00, 0x2B, 0x2C, 0x00, 0x2C, 0x2C, 0x00, 0x2D, 0x2C, 0x00, 0x2E, 0x2C, 0x00, 0x2F, 0x2C, 0x00, 0x30, 0x2C, 0x00, 0x31, 0x2C, 0x00, 0x32, 0x2C, 0x00, 0x33, 0x2C, 0x00, 0x34, 0x2C, 0x00, 0x35, 0x2C, 0x00, 0x36, 0x2C, 0x00, 0x37, 0x2C, 0x00, 0x38, 0x2C, 0x00, 0x39, 0x2C, 0x00, 0x3A, 0x2C, 0x00, 0x3B, 0x2C, 0x00, 0x3C, 0x2C, 0x00, 0x3D, 0x2C, 0x00, 0x3E, 0x2C, 0x00, 0x3F, 0x2C, 0x00, 0x40, 0x2C, 0x00, 0x41, 0x2C, 0x00, 0x42, 0x2C, 0x00, 0x43, 0x2C, 0x00, 0x44, 0x2C, 0x00, 0x45, 0x2C, 0x00, 0x46, 0x2C, 0x00, 0x47, 0x2C, 0x00, 0x48, 0x2C, 0x00, 0x49, 0x2C, 0x00, 0x4A, 0x2C, 0x00, 0x4B, 0x2C, 0x00, 0x4C, 0x2C, 0x00, 0x4D, 0x2C, 0x00, 0x4E, 0x2C, 0x00, 0x4F, 0x2C, 0x00, 0x50, 0x2C, 0x00, 0x51, 0x2C, 0x00, 0x52, 0x2C, 0x00, 0x53, 0x2C, 0x00, 0x54, 0x2C, 0x00, 0x55, 0x2C, 0x00, 0x56, 0x2C, 0x00, 0x57, 0x2C, 0x00, 0x58, 0x2C, 0x00, 0x59, 0x2C, 0x00, 0x5A, 0x2C, 0x00, 0x5B, 0x2C, 0x00, 0x5C, 0x2C, 0x00, 0x5D, 0x2C, 0x00, 0x5E, 0x2C, 0x00, 0x5F, 0x2C, 0x00, 0x60, 0x2C, 0x00, 0x61, 0x2C, 0x00, 0x62, 0x2C, 0x00, 0x63, 0x2C, 0x00, 0x64, 0x2C, 0x00, 0x65, 0x2C, 0x00, 0x66, 0x2C, 0x00, 0x67, 0x2C, 0x00, 0x68, 0x2C, 0x00, 0x69, 0x2C, 0x00, 0x6A, 0x2C, 0x00, 0x6B, 0x2C, 0x00, 0x6C, 0x2C, 0x00, 0x6D, 0x2C, 0x00, 0x6E, 0x2C, 0x00, 0x6F, 0x2C, 0x00, 0x70, 0x2C, 0x00, 0x71, 0x2C, 0x00, 0x72, 0x2C, 0x00, 0x73, 0x2C, 0x00, 0x74, 0x2C, 0x00, 0x75, 0x2C, 0x00, 0x76, 0x2C, 0x00, 0x77, 0x2C, 0x00, 0x78, 0x2C, 0x00, 0x79, 0x2C, 0x00, 0x7A, 0x2C, 0x00, 0x7B, 0x2C, 0x00, 0x7C, 0x2C, 0x00, 0x7D, 0x2C, 0x00, 0x7E, 0x2C, 0x29, 0x85, 0x2C, 0x29, 0x86, 0x30, 0x30, 0x02, 0x30, 0x30, 0x0C, 0x30, 0x30, 0x0D, 0x30, 0x30, 0x01, 0x30, 0x30, 0xFB, 0x30, 0x30, 0xF2, 0x30, 0x30, 0xA1, 0x30, 0x30, 0xA3, 0x30, 0x30, 0xA5, 0x30, 0x30, 0xA7, 0x30, 0x30, 0xA9, 0x30, 0x30, 0xE3, 0x30, 0x30, 0xE5, 0x30, 0x30, 0xE7, 0x30, 0x30, 0xC3, 0x30, 0x30, 0xFC, 0x30, 0x30, 0xA2, 0x30, 0x30, 0xA4, 0x30, 0x30, 0xA6, 0x30, 0x30, 0xA8, 0x30, 0x30, 0xAA, 0x30, 0x30, 0xAB, 0x30, 0x30, 0xAD, 0x30, 0x30, 0xAF, 0x30, 0x30, 0xB1, 0x30, 0x30, 0xB3, 0x30, 0x30, 0xB5, 0x30, 0x30, 0xB7, 0x30, 0x30, 0xB9, 0x30, 0x30, 0xBB, 0x30, 0x30, 0xBD, 0x30, 0x30, 0xBF, 0x30, 0x30, 0xC1, 0x30, 0x30, 0xC4, 0x30, 0x30, 0xC6, 0x30, 0x30, 0xC8, 0x30, 0x30, 0xCA, 0x30, 0x30, 0xCB, 0x30, 0x30, 0xCC, 0x30, 0x30, 0xCD, 0x30, 0x30, 0xCE, 0x30, 0x30, 0xCF, 0x30, 0x30, 0xD2, 0x30, 0x30, 0xD5, 0x30, 0x30, 0xD8, 0x30, 0x30, 0xDB, 0x30, 0x30, 0xDE, 0x30, 0x30, 0xDF, 0x30, 0x30, 0xE0, 0x30, 0x30, 0xE1, 0x30, 0x30, 0xE2, 0x30, 0x30, 0xE4, 0x30, 0x30, 0xE6, 0x30, 0x30, 0xE8, 0x30, 0x30, 0xE9, 0x30, 0x30, 0xEA, 0x30, 0x30, 0xEB, 0x30, 0x30, 0xEC, 0x30, 0x30, 0xED, 0x30, 0x30, 0xEF, 0x30, 0x30, 0xF3, 0x30, 0x30, 0x99, 0x30, 0x30, 0x9A, 0x30, 0x31, 0x64, 0x30, 0x31, 0x31, 0x30, 0x31, 0x32, 0x30, 0x31, 0x33, 0x30, 0x31, 0x34, 0x30, 0x31, 0x35, 0x30, 0x31, 0x36, 0x30, 0x31, 0x37, 0x30, 0x31, 0x38, 0x30, 0x31, 0x39, 0x30, 0x31, 0x3A, 0x30, 0x31, 0x3B, 0x30, 0x31, 0x3C, 0x30, 0x31, 0x3D, 0x30, 0x31, 0x3E, 0x30, 0x31, 0x3F, 0x30, 0x31, 0x40, 0x30, 0x31, 0x41, 0x30, 0x31, 0x42, 0x30, 0x31, 0x43, 0x30, 0x31, 0x44, 0x30, 0x31, 0x45, 0x30, 0x31, 0x46, 0x30, 0x31, 0x47, 0x30, 0x31, 0x48, 0x30, 0x31, 0x49, 0x30, 0x31, 0x4A, 0x30, 0x31, 0x4B, 0x30, 0x31, 0x4C, 0x30, 0x31, 0x4D, 0x30, 0x31, 0x4E, 0x30, 0x31, 0x4F, 0x30, 0x31, 0x50, 0x30, 0x31, 0x51, 0x30, 0x31, 0x52, 0x30, 0x31, 0x53, 0x30, 0x31, 0x54, 0x30, 0x31, 0x55, 0x30, 0x31, 0x56, 0x30, 0x31, 0x57, 0x30, 0x31, 0x58, 0x30, 0x31, 0x59, 0x30, 0x31, 0x5A, 0x30, 0x31, 0x5B, 0x30, 0x31, 0x5C, 0x30, 0x31, 0x5D, 0x30, 0x31, 0x5E, 0x30, 0x31, 0x5F, 0x30, 0x31, 0x60, 0x30, 0x31, 0x61, 0x30, 0x31, 0x62, 0x30, 0x31, 0x63, 0x2C, 0x00, 0xA2, 0x2C, 0x00, 0xA3, 0x2C, 0x00, 0xAC, 0x2C, 0x00, 0xAF, 0x2C, 0x00, 0xA6, 0x2C, 0x00, 0xA5, 0x2C, 0x20, 0xA9, 0x30, 0x25, 0x02, 0x30, 0x21, 0x90, 0x30, 0x21, 0x91, 0x30, 0x21, 0x92, 0x30, 0x21, 0x93, 0x30, 0x25, 0xA0, 0x30, 0x25, 0xCB, 0x81, 0x10, 0x99, 0x01, 0x10, 0xBA, 0x81, 0x10, 0x9B, 0x01, 0x10, 0xBA, 0x81, 0x10, 0xA5, 0x01, 0x10, 0xBA, 0x81, 0x11, 0x31, 0x01, 0x11, 0x27, 0x81, 0x11, 0x32, 0x01, 0x11, 0x27, 0x81, 0x13, 0x47, 0x01, 0x13, 0x3E, 0x81, 0x13, 0x47, 0x01, 0x13, 0x57, 0x81, 0x14, 0xB9, 0x01, 0x14, 0xBA, 0x81, 0x14, 0xB9, 0x01, 0x14, 0xB0, 0x81, 0x14, 0xB9, 0x01, 0x14, 0xBD, 0x81, 0x15, 0xB8, 0x01, 0x15, 0xAF, 0x81, 0x15, 0xB9, 0x01, 0x15, 0xAF, 0x81, 0xD1, 0x57, 0x01, 0xD1, 0x65, 0x81, 0xD1, 0x58, 0x01, 0xD1, 0x65, 0x81, 0xD1, 0x5F, 0x01, 0xD1, 0x6E, 0x81, 0xD1, 0x5F, 0x01, 0xD1, 0x6F, 0x81, 0xD1, 0x5F, 0x01, 0xD1, 0x70, 0x81, 0xD1, 0x5F, 0x01, 0xD1, 0x71, 0x81, 0xD1, 0x5F, 0x01, 0xD1, 0x72, 0x81, 0xD1, 0xB9, 0x01, 0xD1, 0x65, 0x81, 0xD1, 0xBA, 0x01, 0xD1, 0x65, 0x81, 0xD1, 0xBB, 0x01, 0xD1, 0x6E, 0x81, 0xD1, 0xBC, 0x01, 0xD1, 0x6E, 0x81, 0xD1, 0xBB, 0x01, 0xD1, 0x6F, 0x81, 0xD1, 0xBC, 0x01, 0xD1, 0x6F, 0x04, 0x00, 0x41, 0x04, 0x00, 0x42, 0x04, 0x00, 0x43, 0x04, 0x00, 0x44, 0x04, 0x00, 0x45, 0x04, 0x00, 0x46, 0x04, 0x00, 0x47, 0x04, 0x00, 0x48, 0x04, 0x00, 0x49, 0x04, 0x00, 0x4A, 0x04, 0x00, 0x4B, 0x04, 0x00, 0x4C, 0x04, 0x00, 0x4D, 0x04, 0x00, 0x4E, 0x04, 0x00, 0x4F, 0x04, 0x00, 0x50, 0x04, 0x00, 0x51, 0x04, 0x00, 0x52, 0x04, 0x00, 0x53, 0x04, 0x00, 0x54, 0x04, 0x00, 0x55, 0x04, 0x00, 0x56, 0x04, 0x00, 0x57, 0x04, 0x00, 0x58, 0x04, 0x00, 0x59, 0x04, 0x00, 0x5A, 0x04, 0x00, 0x61, 0x04, 0x00, 0x62, 0x04, 0x00, 0x63, 0x04, 0x00, 0x64, 0x04, 0x00, 0x65, 0x04, 0x00, 0x66, 0x04, 0x00, 0x67, 0x04, 0x00, 0x68, 0x04, 0x00, 0x69, 0x04, 0x00, 0x6A, 0x04, 0x00, 0x6B, 0x04, 0x00, 0x6C, 0x04, 0x00, 0x6D, 0x04, 0x00, 0x6E, 0x04, 0x00, 0x6F, 0x04, 0x00, 0x70, 0x04, 0x00, 0x71, 0x04, 0x00, 0x72, 0x04, 0x00, 0x73, 0x04, 0x00, 0x74, 0x04, 0x00, 0x75, 0x04, 0x00, 0x76, 0x04, 0x00, 0x77, 0x04, 0x00, 0x78, 0x04, 0x00, 0x79, 0x04, 0x00, 0x7A, 0x04, 0x00, 0x41, 0x04, 0x00, 0x42, 0x04, 0x00, 0x43, 0x04, 0x00, 0x44, 0x04, 0x00, 0x45, 0x04, 0x00, 0x46, 0x04, 0x00, 0x47, 0x04, 0x00, 0x48, 0x04, 0x00, 0x49, 0x04, 0x00, 0x4A, 0x04, 0x00, 0x4B, 0x04, 0x00, 0x4C, 0x04, 0x00, 0x4D, 0x04, 0x00, 0x4E, 0x04, 0x00, 0x4F, 0x04, 0x00, 0x50, 0x04, 0x00, 0x51, 0x04, 0x00, 0x52, 0x04, 0x00, 0x53, 0x04, 0x00, 0x54, 0x04, 0x00, 0x55, 0x04, 0x00, 0x56, 0x04, 0x00, 0x57, 0x04, 0x00, 0x58, 0x04, 0x00, 0x59, 0x04, 0x00, 0x5A, 0x04, 0x00, 0x61, 0x04, 0x00, 0x62, 0x04, 0x00, 0x63, 0x04, 0x00, 0x64, 0x04, 0x00, 0x65, 0x04, 0x00, 0x66, 0x04, 0x00, 0x67, 0x04, 0x00, 0x69, 0x04, 0x00, 0x6A, 0x04, 0x00, 0x6B, 0x04, 0x00, 0x6C, 0x04, 0x00, 0x6D, 0x04, 0x00, 0x6E, 0x04, 0x00, 0x6F, 0x04, 0x00, 0x70, 0x04, 0x00, 0x71, 0x04, 0x00, 0x72, 0x04, 0x00, 0x73, 0x04, 0x00, 0x74, 0x04, 0x00, 0x75, 0x04, 0x00, 0x76, 0x04, 0x00, 0x77, 0x04, 0x00, 0x78, 0x04, 0x00, 0x79, 0x04, 0x00, 0x7A, 0x04, 0x00, 0x41, 0x04, 0x00, 0x42, 0x04, 0x00, 0x43, 0x04, 0x00, 0x44, 0x04, 0x00, 0x45, 0x04, 0x00, 0x46, 0x04, 0x00, 0x47, 0x04, 0x00, 0x48, 0x04, 0x00, 0x49, 0x04, 0x00, 0x4A, 0x04, 0x00, 0x4B, 0x04, 0x00, 0x4C, 0x04, 0x00, 0x4D, 0x04, 0x00, 0x4E, 0x04, 0x00, 0x4F, 0x04, 0x00, 0x50, 0x04, 0x00, 0x51, 0x04, 0x00, 0x52, 0x04, 0x00, 0x53, 0x04, 0x00, 0x54, 0x04, 0x00, 0x55, 0x04, 0x00, 0x56, 0x04, 0x00, 0x57, 0x04, 0x00, 0x58, 0x04, 0x00, 0x59, 0x04, 0x00, 0x5A, 0x04, 0x00, 0x61, 0x04, 0x00, 0x62, 0x04, 0x00, 0x63, 0x04, 0x00, 0x64, 0x04, 0x00, 0x65, 0x04, 0x00, 0x66, 0x04, 0x00, 0x67, 0x04, 0x00, 0x68, 0x04, 0x00, 0x69, 0x04, 0x00, 0x6A, 0x04, 0x00, 0x6B, 0x04, 0x00, 0x6C, 0x04, 0x00, 0x6D, 0x04, 0x00, 0x6E, 0x04, 0x00, 0x6F, 0x04, 0x00, 0x70, 0x04, 0x00, 0x71, 0x04, 0x00, 0x72, 0x04, 0x00, 0x73, 0x04, 0x00, 0x74, 0x04, 0x00, 0x75, 0x04, 0x00, 0x76, 0x04, 0x00, 0x77, 0x04, 0x00, 0x78, 0x04, 0x00, 0x79, 0x04, 0x00, 0x7A, 0x04, 0x00, 0x41, 0x04, 0x00, 0x43, 0x04, 0x00, 0x44, 0x04, 0x00, 0x47, 0x04, 0x00, 0x4A, 0x04, 0x00, 0x4B, 0x04, 0x00, 0x4E, 0x04, 0x00, 0x4F, 0x04, 0x00, 0x50, 0x04, 0x00, 0x51, 0x04, 0x00, 0x53, 0x04, 0x00, 0x54, 0x04, 0x00, 0x55, 0x04, 0x00, 0x56, 0x04, 0x00, 0x57, 0x04, 0x00, 0x58, 0x04, 0x00, 0x59, 0x04, 0x00, 0x5A, 0x04, 0x00, 0x61, 0x04, 0x00, 0x62, 0x04, 0x00, 0x63, 0x04, 0x00, 0x64, 0x04, 0x00, 0x66, 0x04, 0x00, 0x68, 0x04, 0x00, 0x69, 0x04, 0x00, 0x6A, 0x04, 0x00, 0x6B, 0x04, 0x00, 0x6C, 0x04, 0x00, 0x6D, 0x04, 0x00, 0x6E, 0x04, 0x00, 0x70, 0x04, 0x00, 0x71, 0x04, 0x00, 0x72, 0x04, 0x00, 0x73, 0x04, 0x00, 0x74, 0x04, 0x00, 0x75, 0x04, 0x00, 0x76, 0x04, 0x00, 0x77, 0x04, 0x00, 0x78, 0x04, 0x00, 0x79, 0x04, 0x00, 0x7A, 0x04, 0x00, 0x41, 0x04, 0x00, 0x42, 0x04, 0x00, 0x43, 0x04, 0x00, 0x44, 0x04, 0x00, 0x45, 0x04, 0x00, 0x46, 0x04, 0x00, 0x47, 0x04, 0x00, 0x48, 0x04, 0x00, 0x49, 0x04, 0x00, 0x4A, 0x04, 0x00, 0x4B, 0x04, 0x00, 0x4C, 0x04, 0x00, 0x4D, 0x04, 0x00, 0x4E, 0x04, 0x00, 0x4F, 0x04, 0x00, 0x50, 0x04, 0x00, 0x51, 0x04, 0x00, 0x52, 0x04, 0x00, 0x53, 0x04, 0x00, 0x54, 0x04, 0x00, 0x55, 0x04, 0x00, 0x56, 0x04, 0x00, 0x57, 0x04, 0x00, 0x58, 0x04, 0x00, 0x59, 0x04, 0x00, 0x5A, 0x04, 0x00, 0x61, 0x04, 0x00, 0x62, 0x04, 0x00, 0x63, 0x04, 0x00, 0x64, 0x04, 0x00, 0x65, 0x04, 0x00, 0x66, 0x04, 0x00, 0x67, 0x04, 0x00, 0x68, 0x04, 0x00, 0x69, 0x04, 0x00, 0x6A, 0x04, 0x00, 0x6B, 0x04, 0x00, 0x6C, 0x04, 0x00, 0x6D, 0x04, 0x00, 0x6E, 0x04, 0x00, 0x6F, 0x04, 0x00, 0x70, 0x04, 0x00, 0x71, 0x04, 0x00, 0x72, 0x04, 0x00, 0x73, 0x04, 0x00, 0x74, 0x04, 0x00, 0x75, 0x04, 0x00, 0x76, 0x04, 0x00, 0x77, 0x04, 0x00, 0x78, 0x04, 0x00, 0x79, 0x04, 0x00, 0x7A, 0x04, 0x00, 0x41, 0x04, 0x00, 0x42, 0x04, 0x00, 0x44, 0x04, 0x00, 0x45, 0x04, 0x00, 0x46, 0x04, 0x00, 0x47, 0x04, 0x00, 0x4A, 0x04, 0x00, 0x4B, 0x04, 0x00, 0x4C, 0x04, 0x00, 0x4D, 0x04, 0x00, 0x4E, 0x04, 0x00, 0x4F, 0x04, 0x00, 0x50, 0x04, 0x00, 0x51, 0x04, 0x00, 0x53, 0x04, 0x00, 0x54, 0x04, 0x00, 0x55, 0x04, 0x00, 0x56, 0x04, 0x00, 0x57, 0x04, 0x00, 0x58, 0x04, 0x00, 0x59, 0x04, 0x00, 0x61, 0x04, 0x00, 0x62, 0x04, 0x00, 0x63, 0x04, 0x00, 0x64, 0x04, 0x00, 0x65, 0x04, 0x00, 0x66, 0x04, 0x00, 0x67, 0x04, 0x00, 0x68, 0x04, 0x00, 0x69, 0x04, 0x00, 0x6A, 0x04, 0x00, 0x6B, 0x04, 0x00, 0x6C, 0x04, 0x00, 0x6D, 0x04, 0x00, 0x6E, 0x04, 0x00, 0x6F, 0x04, 0x00, 0x70, 0x04, 0x00, 0x71, 0x04, 0x00, 0x72, 0x04, 0x00, 0x73, 0x04, 0x00, 0x74, 0x04, 0x00, 0x75, 0x04, 0x00, 0x76, 0x04, 0x00, 0x77, 0x04, 0x00, 0x78, 0x04, 0x00, 0x79, 0x04, 0x00, 0x7A, 0x04, 0x00, 0x41, 0x04, 0x00, 0x42, 0x04, 0x00, 0x44, 0x04, 0x00, 0x45, 0x04, 0x00, 0x46, 0x04, 0x00, 0x47, 0x04, 0x00, 0x49, 0x04, 0x00, 0x4A, 0x04, 0x00, 0x4B, 0x04, 0x00, 0x4C, 0x04, 0x00, 0x4D, 0x04, 0x00, 0x4F, 0x04, 0x00, 0x53, 0x04, 0x00, 0x54, 0x04, 0x00, 0x55, 0x04, 0x00, 0x56, 0x04, 0x00, 0x57, 0x04, 0x00, 0x58, 0x04, 0x00, 0x59, 0x04, 0x00, 0x61, 0x04, 0x00, 0x62, 0x04, 0x00, 0x63, 0x04, 0x00, 0x64, 0x04, 0x00, 0x65, 0x04, 0x00, 0x66, 0x04, 0x00, 0x67, 0x04, 0x00, 0x68, 0x04, 0x00, 0x69, 0x04, 0x00, 0x6A, 0x04, 0x00, 0x6B, 0x04, 0x00, 0x6C, 0x04, 0x00, 0x6D, 0x04, 0x00, 0x6E, 0x04, 0x00, 0x6F, 0x04, 0x00, 0x70, 0x04, 0x00, 0x71, 0x04, 0x00, 0x72, 0x04, 0x00, 0x73, 0x04, 0x00, 0x74, 0x04, 0x00, 0x75, 0x04, 0x00, 0x76, 0x04, 0x00, 0x77, 0x04, 0x00, 0x78, 0x04, 0x00, 0x79, 0x04, 0x00, 0x7A, 0x04, 0x00, 0x41, 0x04, 0x00, 0x42, 0x04, 0x00, 0x43, 0x04, 0x00, 0x44, 0x04, 0x00, 0x45, 0x04, 0x00, 0x46, 0x04, 0x00, 0x47, 0x04, 0x00, 0x48, 0x04, 0x00, 0x49, 0x04, 0x00, 0x4A, 0x04, 0x00, 0x4B, 0x04, 0x00, 0x4C, 0x04, 0x00, 0x4D, 0x04, 0x00, 0x4E, 0x04, 0x00, 0x4F, 0x04, 0x00, 0x50, 0x04, 0x00, 0x51, 0x04, 0x00, 0x52, 0x04, 0x00, 0x53, 0x04, 0x00, 0x54, 0x04, 0x00, 0x55, 0x04, 0x00, 0x56, 0x04, 0x00, 0x57, 0x04, 0x00, 0x58, 0x04, 0x00, 0x59, 0x04, 0x00, 0x5A, 0x04, 0x00, 0x61, 0x04, 0x00, 0x62, 0x04, 0x00, 0x63, 0x04, 0x00, 0x64, 0x04, 0x00, 0x65, 0x04, 0x00, 0x66, 0x04, 0x00, 0x67, 0x04, 0x00, 0x68, 0x04, 0x00, 0x69, 0x04, 0x00, 0x6A, 0x04, 0x00, 0x6B, 0x04, 0x00, 0x6C, 0x04, 0x00, 0x6D, 0x04, 0x00, 0x6E, 0x04, 0x00, 0x6F, 0x04, 0x00, 0x70, 0x04, 0x00, 0x71, 0x04, 0x00, 0x72, 0x04, 0x00, 0x73, 0x04, 0x00, 0x74, 0x04, 0x00, 0x75, 0x04, 0x00, 0x76, 0x04, 0x00, 0x77, 0x04, 0x00, 0x78, 0x04, 0x00, 0x79, 0x04, 0x00, 0x7A, 0x04, 0x00, 0x41, 0x04, 0x00, 0x42, 0x04, 0x00, 0x43, 0x04, 0x00, 0x44, 0x04, 0x00, 0x45, 0x04, 0x00, 0x46, 0x04, 0x00, 0x47, 0x04, 0x00, 0x48, 0x04, 0x00, 0x49, 0x04, 0x00, 0x4A, 0x04, 0x00, 0x4B, 0x04, 0x00, 0x4C, 0x04, 0x00, 0x4D, 0x04, 0x00, 0x4E, 0x04, 0x00, 0x4F, 0x04, 0x00, 0x50, 0x04, 0x00, 0x51, 0x04, 0x00, 0x52, 0x04, 0x00, 0x53, 0x04, 0x00, 0x54, 0x04, 0x00, 0x55, 0x04, 0x00, 0x56, 0x04, 0x00, 0x57, 0x04, 0x00, 0x58, 0x04, 0x00, 0x59, 0x04, 0x00, 0x5A, 0x04, 0x00, 0x61, 0x04, 0x00, 0x62, 0x04, 0x00, 0x63, 0x04, 0x00, 0x64, 0x04, 0x00, 0x65, 0x04, 0x00, 0x66, 0x04, 0x00, 0x67, 0x04, 0x00, 0x68, 0x04, 0x00, 0x69, 0x04, 0x00, 0x6A, 0x04, 0x00, 0x6B, 0x04, 0x00, 0x6C, 0x04, 0x00, 0x6D, 0x04, 0x00, 0x6E, 0x04, 0x00, 0x6F, 0x04, 0x00, 0x70, 0x04, 0x00, 0x71, 0x04, 0x00, 0x72, 0x04, 0x00, 0x73, 0x04, 0x00, 0x74, 0x04, 0x00, 0x75, 0x04, 0x00, 0x76, 0x04, 0x00, 0x77, 0x04, 0x00, 0x78, 0x04, 0x00, 0x79, 0x04, 0x00, 0x7A, 0x04, 0x00, 0x41, 0x04, 0x00, 0x42, 0x04, 0x00, 0x43, 0x04, 0x00, 0x44, 0x04, 0x00, 0x45, 0x04, 0x00, 0x46, 0x04, 0x00, 0x47, 0x04, 0x00, 0x48, 0x04, 0x00, 0x49, 0x04, 0x00, 0x4A, 0x04, 0x00, 0x4B, 0x04, 0x00, 0x4C, 0x04, 0x00, 0x4D, 0x04, 0x00, 0x4E, 0x04, 0x00, 0x4F, 0x04, 0x00, 0x50, 0x04, 0x00, 0x51, 0x04, 0x00, 0x52, 0x04, 0x00, 0x53, 0x04, 0x00, 0x54, 0x04, 0x00, 0x55, 0x04, 0x00, 0x56, 0x04, 0x00, 0x57, 0x04, 0x00, 0x58, 0x04, 0x00, 0x59, 0x04, 0x00, 0x5A, 0x04, 0x00, 0x61, 0x04, 0x00, 0x62, 0x04, 0x00, 0x63, 0x04, 0x00, 0x64, 0x04, 0x00, 0x65, 0x04, 0x00, 0x66, 0x04, 0x00, 0x67, 0x04, 0x00, 0x68, 0x04, 0x00, 0x69, 0x04, 0x00, 0x6A, 0x04, 0x00, 0x6B, 0x04, 0x00, 0x6C, 0x04, 0x00, 0x6D, 0x04, 0x00, 0x6E, 0x04, 0x00, 0x6F, 0x04, 0x00, 0x70, 0x04, 0x00, 0x71, 0x04, 0x00, 0x72, 0x04, 0x00, 0x73, 0x04, 0x00, 0x74, 0x04, 0x00, 0x75, 0x04, 0x00, 0x76, 0x04, 0x00, 0x77, 0x04, 0x00, 0x78, 0x04, 0x00, 0x79, 0x04, 0x00, 0x7A, 0x04, 0x00, 0x41, 0x04, 0x00, 0x42, 0x04, 0x00, 0x43, 0x04, 0x00, 0x44, 0x04, 0x00, 0x45, 0x04, 0x00, 0x46, 0x04, 0x00, 0x47, 0x04, 0x00, 0x48, 0x04, 0x00, 0x49, 0x04, 0x00, 0x4A, 0x04, 0x00, 0x4B, 0x04, 0x00, 0x4C, 0x04, 0x00, 0x4D, 0x04, 0x00, 0x4E, 0x04, 0x00, 0x4F, 0x04, 0x00, 0x50, 0x04, 0x00, 0x51, 0x04, 0x00, 0x52, 0x04, 0x00, 0x53, 0x04, 0x00, 0x54, 0x04, 0x00, 0x55, 0x04, 0x00, 0x56, 0x04, 0x00, 0x57, 0x04, 0x00, 0x58, 0x04, 0x00, 0x59, 0x04, 0x00, 0x5A, 0x04, 0x00, 0x61, 0x04, 0x00, 0x62, 0x04, 0x00, 0x63, 0x04, 0x00, 0x64, 0x04, 0x00, 0x65, 0x04, 0x00, 0x66, 0x04, 0x00, 0x67, 0x04, 0x00, 0x68, 0x04, 0x00, 0x69, 0x04, 0x00, 0x6A, 0x04, 0x00, 0x6B, 0x04, 0x00, 0x6C, 0x04, 0x00, 0x6D, 0x04, 0x00, 0x6E, 0x04, 0x00, 0x6F, 0x04, 0x00, 0x70, 0x04, 0x00, 0x71, 0x04, 0x00, 0x72, 0x04, 0x00, 0x73, 0x04, 0x00, 0x74, 0x04, 0x00, 0x75, 0x04, 0x00, 0x76, 0x04, 0x00, 0x77, 0x04, 0x00, 0x78, 0x04, 0x00, 0x79, 0x04, 0x00, 0x7A, 0x04, 0x00, 0x41, 0x04, 0x00, 0x42, 0x04, 0x00, 0x43, 0x04, 0x00, 0x44, 0x04, 0x00, 0x45, 0x04, 0x00, 0x46, 0x04, 0x00, 0x47, 0x04, 0x00, 0x48, 0x04, 0x00, 0x49, 0x04, 0x00, 0x4A, 0x04, 0x00, 0x4B, 0x04, 0x00, 0x4C, 0x04, 0x00, 0x4D, 0x04, 0x00, 0x4E, 0x04, 0x00, 0x4F, 0x04, 0x00, 0x50, 0x04, 0x00, 0x51, 0x04, 0x00, 0x52, 0x04, 0x00, 0x53, 0x04, 0x00, 0x54, 0x04, 0x00, 0x55, 0x04, 0x00, 0x56, 0x04, 0x00, 0x57, 0x04, 0x00, 0x58, 0x04, 0x00, 0x59, 0x04, 0x00, 0x5A, 0x04, 0x00, 0x61, 0x04, 0x00, 0x62, 0x04, 0x00, 0x63, 0x04, 0x00, 0x64, 0x04, 0x00, 0x65, 0x04, 0x00, 0x66, 0x04, 0x00, 0x67, 0x04, 0x00, 0x68, 0x04, 0x00, 0x69, 0x04, 0x00, 0x6A, 0x04, 0x00, 0x6B, 0x04, 0x00, 0x6C, 0x04, 0x00, 0x6D, 0x04, 0x00, 0x6E, 0x04, 0x00, 0x6F, 0x04, 0x00, 0x70, 0x04, 0x00, 0x71, 0x04, 0x00, 0x72, 0x04, 0x00, 0x73, 0x04, 0x00, 0x74, 0x04, 0x00, 0x75, 0x04, 0x00, 0x76, 0x04, 0x00, 0x77, 0x04, 0x00, 0x78, 0x04, 0x00, 0x79, 0x04, 0x00, 0x7A, 0x04, 0x00, 0x41, 0x04, 0x00, 0x42, 0x04, 0x00, 0x43, 0x04, 0x00, 0x44, 0x04, 0x00, 0x45, 0x04, 0x00, 0x46, 0x04, 0x00, 0x47, 0x04, 0x00, 0x48, 0x04, 0x00, 0x49, 0x04, 0x00, 0x4A, 0x04, 0x00, 0x4B, 0x04, 0x00, 0x4C, 0x04, 0x00, 0x4D, 0x04, 0x00, 0x4E, 0x04, 0x00, 0x4F, 0x04, 0x00, 0x50, 0x04, 0x00, 0x51, 0x04, 0x00, 0x52, 0x04, 0x00, 0x53, 0x04, 0x00, 0x54, 0x04, 0x00, 0x55, 0x04, 0x00, 0x56, 0x04, 0x00, 0x57, 0x04, 0x00, 0x58, 0x04, 0x00, 0x59, 0x04, 0x00, 0x5A, 0x04, 0x00, 0x61, 0x04, 0x00, 0x62, 0x04, 0x00, 0x63, 0x04, 0x00, 0x64, 0x04, 0x00, 0x65, 0x04, 0x00, 0x66, 0x04, 0x00, 0x67, 0x04, 0x00, 0x68, 0x04, 0x00, 0x69, 0x04, 0x00, 0x6A, 0x04, 0x00, 0x6B, 0x04, 0x00, 0x6C, 0x04, 0x00, 0x6D, 0x04, 0x00, 0x6E, 0x04, 0x00, 0x6F, 0x04, 0x00, 0x70, 0x04, 0x00, 0x71, 0x04, 0x00, 0x72, 0x04, 0x00, 0x73, 0x04, 0x00, 0x74, 0x04, 0x00, 0x75, 0x04, 0x00, 0x76, 0x04, 0x00, 0x77, 0x04, 0x00, 0x78, 0x04, 0x00, 0x79, 0x04, 0x00, 0x7A, 0x04, 0x01, 0x31, 0x04, 0x02, 0x37, 0x04, 0x03, 0x91, 0x04, 0x03, 0x92, 0x04, 0x03, 0x93, 0x04, 0x03, 0x94, 0x04, 0x03, 0x95, 0x04, 0x03, 0x96, 0x04, 0x03, 0x97, 0x04, 0x03, 0x98, 0x04, 0x03, 0x99, 0x04, 0x03, 0x9A, 0x04, 0x03, 0x9B, 0x04, 0x03, 0x9C, 0x04, 0x03, 0x9D, 0x04, 0x03, 0x9E, 0x04, 0x03, 0x9F, 0x04, 0x03, 0xA0, 0x04, 0x03, 0xA1, 0x04, 0x03, 0xF4, 0x04, 0x03, 0xA3, 0x04, 0x03, 0xA4, 0x04, 0x03, 0xA5, 0x04, 0x03, 0xA6, 0x04, 0x03, 0xA7, 0x04, 0x03, 0xA8, 0x04, 0x03, 0xA9, 0x04, 0x22, 0x07, 0x04, 0x03, 0xB1, 0x04, 0x03, 0xB2, 0x04, 0x03, 0xB3, 0x04, 0x03, 0xB4, 0x04, 0x03, 0xB5, 0x04, 0x03, 0xB6, 0x04, 0x03, 0xB7, 0x04, 0x03, 0xB8, 0x04, 0x03, 0xB9, 0x04, 0x03, 0xBA, 0x04, 0x03, 0xBB, 0x04, 0x03, 0xBC, 0x04, 0x03, 0xBD, 0x04, 0x03, 0xBE, 0x04, 0x03, 0xBF, 0x04, 0x03, 0xC0, 0x04, 0x03, 0xC1, 0x04, 0x03, 0xC2, 0x04, 0x03, 0xC3, 0x04, 0x03, 0xC4, 0x04, 0x03, 0xC5, 0x04, 0x03, 0xC6, 0x04, 0x03, 0xC7, 0x04, 0x03, 0xC8, 0x04, 0x03, 0xC9, 0x04, 0x22, 0x02, 0x04, 0x03, 0xF5, 0x04, 0x03, 0xD1, 0x04, 0x03, 0xF0, 0x04, 0x03, 0xD5, 0x04, 0x03, 0xF1, 0x04, 0x03, 0xD6, 0x04, 0x03, 0x91, 0x04, 0x03, 0x92, 0x04, 0x03, 0x93, 0x04, 0x03, 0x94, 0x04, 0x03, 0x95, 0x04, 0x03, 0x96, 0x04, 0x03, 0x97, 0x04, 0x03, 0x98, 0x04, 0x03, 0x99, 0x04, 0x03, 0x9A, 0x04, 0x03, 0x9B, 0x04, 0x03, 0x9C, 0x04, 0x03, 0x9D, 0x04, 0x03, 0x9E, 0x04, 0x03, 0x9F, 0x04, 0x03, 0xA0, 0x04, 0x03, 0xA1, 0x04, 0x03, 0xF4, 0x04, 0x03, 0xA3, 0x04, 0x03, 0xA4, 0x04, 0x03, 0xA5, 0x04, 0x03, 0xA6, 0x04, 0x03, 0xA7, 0x04, 0x03, 0xA8, 0x04, 0x03, 0xA9, 0x04, 0x22, 0x07, 0x04, 0x03, 0xB1, 0x04, 0x03, 0xB2, 0x04, 0x03, 0xB3, 0x04, 0x03, 0xB4, 0x04, 0x03, 0xB5, 0x04, 0x03, 0xB6, 0x04, 0x03, 0xB7, 0x04, 0x03, 0xB8, 0x04, 0x03, 0xB9, 0x04, 0x03, 0xBA, 0x04, 0x03, 0xBB, 0x04, 0x03, 0xBC, 0x04, 0x03, 0xBD, 0x04, 0x03, 0xBE, 0x04, 0x03, 0xBF, 0x04, 0x03, 0xC0, 0x04, 0x03, 0xC1, 0x04, 0x03, 0xC2, 0x04, 0x03, 0xC3, 0x04, 0x03, 0xC4, 0x04, 0x03, 0xC5, 0x04, 0x03, 0xC6, 0x04, 0x03, 0xC7, 0x04, 0x03, 0xC8, 0x04, 0x03, 0xC9, 0x04, 0x22, 0x02, 0x04, 0x03, 0xF5, 0x04, 0x03, 0xD1, 0x04, 0x03, 0xF0, 0x04, 0x03, 0xD5, 0x04, 0x03, 0xF1, 0x04, 0x03, 0xD6, 0x04, 0x03, 0x91, 0x04, 0x03, 0x92, 0x04, 0x03, 0x93, 0x04, 0x03, 0x94, 0x04, 0x03, 0x95, 0x04, 0x03, 0x96, 0x04, 0x03, 0x97, 0x04, 0x03, 0x98, 0x04, 0x03, 0x99, 0x04, 0x03, 0x9A, 0x04, 0x03, 0x9B, 0x04, 0x03, 0x9C, 0x04, 0x03, 0x9D, 0x04, 0x03, 0x9E, 0x04, 0x03, 0x9F, 0x04, 0x03, 0xA0, 0x04, 0x03, 0xA1, 0x04, 0x03, 0xF4, 0x04, 0x03, 0xA3, 0x04, 0x03, 0xA4, 0x04, 0x03, 0xA5, 0x04, 0x03, 0xA6, 0x04, 0x03, 0xA7, 0x04, 0x03, 0xA8, 0x04, 0x03, 0xA9, 0x04, 0x22, 0x07, 0x04, 0x03, 0xB1, 0x04, 0x03, 0xB2, 0x04, 0x03, 0xB3, 0x04, 0x03, 0xB4, 0x04, 0x03, 0xB5, 0x04, 0x03, 0xB6, 0x04, 0x03, 0xB7, 0x04, 0x03, 0xB8, 0x04, 0x03, 0xB9, 0x04, 0x03, 0xBA, 0x04, 0x03, 0xBB, 0x04, 0x03, 0xBC, 0x04, 0x03, 0xBD, 0x04, 0x03, 0xBE, 0x04, 0x03, 0xBF, 0x04, 0x03, 0xC0, 0x04, 0x03, 0xC1, 0x04, 0x03, 0xC2, 0x04, 0x03, 0xC3, 0x04, 0x03, 0xC4, 0x04, 0x03, 0xC5, 0x04, 0x03, 0xC6, 0x04, 0x03, 0xC7, 0x04, 0x03, 0xC8, 0x04, 0x03, 0xC9, 0x04, 0x22, 0x02, 0x04, 0x03, 0xF5, 0x04, 0x03, 0xD1, 0x04, 0x03, 0xF0, 0x04, 0x03, 0xD5, 0x04, 0x03, 0xF1, 0x04, 0x03, 0xD6, 0x04, 0x03, 0x91, 0x04, 0x03, 0x92, 0x04, 0x03, 0x93, 0x04, 0x03, 0x94, 0x04, 0x03, 0x95, 0x04, 0x03, 0x96, 0x04, 0x03, 0x97, 0x04, 0x03, 0x98, 0x04, 0x03, 0x99, 0x04, 0x03, 0x9A, 0x04, 0x03, 0x9B, 0x04, 0x03, 0x9C, 0x04, 0x03, 0x9D, 0x04, 0x03, 0x9E, 0x04, 0x03, 0x9F, 0x04, 0x03, 0xA0, 0x04, 0x03, 0xA1, 0x04, 0x03, 0xF4, 0x04, 0x03, 0xA3, 0x04, 0x03, 0xA4, 0x04, 0x03, 0xA5, 0x04, 0x03, 0xA6, 0x04, 0x03, 0xA7, 0x04, 0x03, 0xA8, 0x04, 0x03, 0xA9, 0x04, 0x22, 0x07, 0x04, 0x03, 0xB1, 0x04, 0x03, 0xB2, 0x04, 0x03, 0xB3, 0x04, 0x03, 0xB4, 0x04, 0x03, 0xB5, 0x04, 0x03, 0xB6, 0x04, 0x03, 0xB7, 0x04, 0x03, 0xB8, 0x04, 0x03, 0xB9, 0x04, 0x03, 0xBA, 0x04, 0x03, 0xBB, 0x04, 0x03, 0xBC, 0x04, 0x03, 0xBD, 0x04, 0x03, 0xBE, 0x04, 0x03, 0xBF, 0x04, 0x03, 0xC0, 0x04, 0x03, 0xC1, 0x04, 0x03, 0xC2, 0x04, 0x03, 0xC3, 0x04, 0x03, 0xC4, 0x04, 0x03, 0xC5, 0x04, 0x03, 0xC6, 0x04, 0x03, 0xC7, 0x04, 0x03, 0xC8, 0x04, 0x03, 0xC9, 0x04, 0x22, 0x02, 0x04, 0x03, 0xF5, 0x04, 0x03, 0xD1, 0x04, 0x03, 0xF0, 0x04, 0x03, 0xD5, 0x04, 0x03, 0xF1, 0x04, 0x03, 0xD6, 0x04, 0x03, 0x91, 0x04, 0x03, 0x92, 0x04, 0x03, 0x93, 0x04, 0x03, 0x94, 0x04, 0x03, 0x95, 0x04, 0x03, 0x96, 0x04, 0x03, 0x97, 0x04, 0x03, 0x98, 0x04, 0x03, 0x99, 0x04, 0x03, 0x9A, 0x04, 0x03, 0x9B, 0x04, 0x03, 0x9C, 0x04, 0x03, 0x9D, 0x04, 0x03, 0x9E, 0x04, 0x03, 0x9F, 0x04, 0x03, 0xA0, 0x04, 0x03, 0xA1, 0x04, 0x03, 0xF4, 0x04, 0x03, 0xA3, 0x04, 0x03, 0xA4, 0x04, 0x03, 0xA5, 0x04, 0x03, 0xA6, 0x04, 0x03, 0xA7, 0x04, 0x03, 0xA8, 0x04, 0x03, 0xA9, 0x04, 0x22, 0x07, 0x04, 0x03, 0xB1, 0x04, 0x03, 0xB2, 0x04, 0x03, 0xB3, 0x04, 0x03, 0xB4, 0x04, 0x03, 0xB5, 0x04, 0x03, 0xB6, 0x04, 0x03, 0xB7, 0x04, 0x03, 0xB8, 0x04, 0x03, 0xB9, 0x04, 0x03, 0xBA, 0x04, 0x03, 0xBB, 0x04, 0x03, 0xBC, 0x04, 0x03, 0xBD, 0x04, 0x03, 0xBE, 0x04, 0x03, 0xBF, 0x04, 0x03, 0xC0, 0x04, 0x03, 0xC1, 0x04, 0x03, 0xC2, 0x04, 0x03, 0xC3, 0x04, 0x03, 0xC4, 0x04, 0x03, 0xC5, 0x04, 0x03, 0xC6, 0x04, 0x03, 0xC7, 0x04, 0x03, 0xC8, 0x04, 0x03, 0xC9, 0x04, 0x22, 0x02, 0x04, 0x03, 0xF5, 0x04, 0x03, 0xD1, 0x04, 0x03, 0xF0, 0x04, 0x03, 0xD5, 0x04, 0x03, 0xF1, 0x04, 0x03, 0xD6, 0x04, 0x03, 0xDC, 0x04, 0x03, 0xDD, 0x04, 0x00, 0x30, 0x04, 0x00, 0x31, 0x04, 0x00, 0x32, 0x04, 0x00, 0x33, 0x04, 0x00, 0x34, 0x04, 0x00, 0x35, 0x04, 0x00, 0x36, 0x04, 0x00, 0x37, 0x04, 0x00, 0x38, 0x04, 0x00, 0x39, 0x04, 0x00, 0x30, 0x04, 0x00, 0x31, 0x04, 0x00, 0x32, 0x04, 0x00, 0x33, 0x04, 0x00, 0x34, 0x04, 0x00, 0x35, 0x04, 0x00, 0x36, 0x04, 0x00, 0x37, 0x04, 0x00, 0x38, 0x04, 0x00, 0x39, 0x04, 0x00, 0x30, 0x04, 0x00, 0x31, 0x04, 0x00, 0x32, 0x04, 0x00, 0x33, 0x04, 0x00, 0x34, 0x04, 0x00, 0x35, 0x04, 0x00, 0x36, 0x04, 0x00, 0x37, 0x04, 0x00, 0x38, 0x04, 0x00, 0x39, 0x04, 0x00, 0x30, 0x04, 0x00, 0x31, 0x04, 0x00, 0x32, 0x04, 0x00, 0x33, 0x04, 0x00, 0x34, 0x04, 0x00, 0x35, 0x04, 0x00, 0x36, 0x04, 0x00, 0x37, 0x04, 0x00, 0x38, 0x04, 0x00, 0x39, 0x04, 0x00, 0x30, 0x04, 0x00, 0x31, 0x04, 0x00, 0x32, 0x04, 0x00, 0x33, 0x04, 0x00, 0x34, 0x04, 0x00, 0x35, 0x04, 0x00, 0x36, 0x04, 0x00, 0x37, 0x04, 0x00, 0x38, 0x04, 0x00, 0x39, 0x04, 0x06, 0x27, 0x04, 0x06, 0x28, 0x04, 0x06, 0x2C, 0x04, 0x06, 0x2F, 0x04, 0x06, 0x48, 0x04, 0x06, 0x32, 0x04, 0x06, 0x2D, 0x04, 0x06, 0x37, 0x04, 0x06, 0x4A, 0x04, 0x06, 0x43, 0x04, 0x06, 0x44, 0x04, 0x06, 0x45, 0x04, 0x06, 0x46, 0x04, 0x06, 0x33, 0x04, 0x06, 0x39, 0x04, 0x06, 0x41, 0x04, 0x06, 0x35, 0x04, 0x06, 0x42, 0x04, 0x06, 0x31, 0x04, 0x06, 0x34, 0x04, 0x06, 0x2A, 0x04, 0x06, 0x2B, 0x04, 0x06, 0x2E, 0x04, 0x06, 0x30, 0x04, 0x06, 0x36, 0x04, 0x06, 0x38, 0x04, 0x06, 0x3A, 0x04, 0x06, 0x6E, 0x04, 0x06, 0xBA, 0x04, 0x06, 0xA1, 0x04, 0x06, 0x6F, 0x04, 0x06, 0x28, 0x04, 0x06, 0x2C, 0x04, 0x06, 0x47, 0x04, 0x06, 0x2D, 0x04, 0x06, 0x4A, 0x04, 0x06, 0x43, 0x04, 0x06, 0x44, 0x04, 0x06, 0x45, 0x04, 0x06, 0x46, 0x04, 0x06, 0x33, 0x04, 0x06, 0x39, 0x04, 0x06, 0x41, 0x04, 0x06, 0x35, 0x04, 0x06, 0x42, 0x04, 0x06, 0x34, 0x04, 0x06, 0x2A, 0x04, 0x06, 0x2B, 0x04, 0x06, 0x2E, 0x04, 0x06, 0x36, 0x04, 0x06, 0x3A, 0x04, 0x06, 0x2C, 0x04, 0x06, 0x2D, 0x04, 0x06, 0x4A, 0x04, 0x06, 0x44, 0x04, 0x06, 0x46, 0x04, 0x06, 0x33, 0x04, 0x06, 0x39, 0x04, 0x06, 0x35, 0x04, 0x06, 0x42, 0x04, 0x06, 0x34, 0x04, 0x06, 0x2E, 0x04, 0x06, 0x36, 0x04, 0x06, 0x3A, 0x04, 0x06, 0xBA, 0x04, 0x06, 0x6F, 0x04, 0x06, 0x28, 0x04, 0x06, 0x2C, 0x04, 0x06, 0x47, 0x04, 0x06, 0x2D, 0x04, 0x06, 0x37, 0x04, 0x06, 0x4A, 0x04, 0x06, 0x43, 0x04, 0x06, 0x45, 0x04, 0x06, 0x46, 0x04, 0x06, 0x33, 0x04, 0x06, 0x39, 0x04, 0x06, 0x41, 0x04, 0x06, 0x35, 0x04, 0x06, 0x42, 0x04, 0x06, 0x34, 0x04, 0x06, 0x2A, 0x04, 0x06, 0x2B, 0x04, 0x06, 0x2E, 0x04, 0x06, 0x36, 0x04, 0x06, 0x38, 0x04, 0x06, 0x3A, 0x04, 0x06, 0x6E, 0x04, 0x06, 0xA1, 0x04, 0x06, 0x27, 0x04, 0x06, 0x28, 0x04, 0x06, 0x2C, 0x04, 0x06, 0x2F, 0x04, 0x06, 0x47, 0x04, 0x06, 0x48, 0x04, 0x06, 0x32, 0x04, 0x06, 0x2D, 0x04, 0x06, 0x37, 0x04, 0x06, 0x4A, 0x04, 0x06, 0x44, 0x04, 0x06, 0x45, 0x04, 0x06, 0x46, 0x04, 0x06, 0x33, 0x04, 0x06, 0x39, 0x04, 0x06, 0x41, 0x04, 0x06, 0x35, 0x04, 0x06, 0x42, 0x04, 0x06, 0x31, 0x04, 0x06, 0x34, 0x04, 0x06, 0x2A, 0x04, 0x06, 0x2B, 0x04, 0x06, 0x2E, 0x04, 0x06, 0x30, 0x04, 0x06, 0x36, 0x04, 0x06, 0x38, 0x04, 0x06, 0x3A, 0x04, 0x06, 0x28, 0x04, 0x06, 0x2C, 0x04, 0x06, 0x2F, 0x04, 0x06, 0x48, 0x04, 0x06, 0x32, 0x04, 0x06, 0x2D, 0x04, 0x06, 0x37, 0x04, 0x06, 0x4A, 0x04, 0x06, 0x44, 0x04, 0x06, 0x45, 0x04, 0x06, 0x46, 0x04, 0x06, 0x33, 0x04, 0x06, 0x39, 0x04, 0x06, 0x41, 0x04, 0x06, 0x35, 0x04, 0x06, 0x42, 0x04, 0x06, 0x31, 0x04, 0x06, 0x34, 0x04, 0x06, 0x2A, 0x04, 0x06, 0x2B, 0x04, 0x06, 0x2E, 0x04, 0x06, 0x30, 0x04, 0x06, 0x36, 0x04, 0x06, 0x38, 0x04, 0x06, 0x3A, 0xC0, 0x00, 0x30, 0x00, 0x00, 0x2E, 0xC0, 0x00, 0x30, 0x00, 0x00, 0x2C, 0xC0, 0x00, 0x31, 0x00, 0x00, 0x2C, 0xC0, 0x00, 0x32, 0x00, 0x00, 0x2C, 0xC0, 0x00, 0x33, 0x00, 0x00, 0x2C, 0xC0, 0x00, 0x34, 0x00, 0x00, 0x2C, 0xC0, 0x00, 0x35, 0x00, 0x00, 0x2C, 0xC0, 0x00, 0x36, 0x00, 0x00, 0x2C, 0xC0, 0x00, 0x37, 0x00, 0x00, 0x2C, 0xC0, 0x00, 0x38, 0x00, 0x00, 0x2C, 0xC0, 0x00, 0x39, 0x00, 0x00, 0x2C, 0xC0, 0x00, 0x28, 0x80, 0x00, 0x41, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x00, 0x42, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x00, 0x43, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x00, 0x44, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x00, 0x45, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x00, 0x46, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x00, 0x47, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x00, 0x48, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x00, 0x49, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x00, 0x4A, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x00, 0x4B, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x00, 0x4C, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x00, 0x4D, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x00, 0x4E, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x00, 0x4F, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x00, 0x50, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x00, 0x51, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x00, 0x52, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x00, 0x53, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x00, 0x54, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x00, 0x55, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x00, 0x56, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x00, 0x57, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x00, 0x58, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x00, 0x59, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x00, 0x5A, 0x00, 0x00, 0x29, 0xC0, 0x30, 0x14, 0x80, 0x00, 0x53, 0x00, 0x30, 0x15, 0x1C, 0x00, 0x43, 0x1C, 0x00, 0x52, 0x9C, 0x00, 0x43, 0x00, 0x00, 0x44, 0x9C, 0x00, 0x57, 0x00, 0x00, 0x5A, 0x38, 0x00, 0x41, 0x38, 0x00, 0x42, 0x38, 0x00, 0x43, 0x38, 0x00, 0x44, 0x38, 0x00, 0x45, 0x38, 0x00, 0x46, 0x38, 0x00, 0x47, 0x38, 0x00, 0x48, 0x38, 0x00, 0x49, 0x38, 0x00, 0x4A, 0x38, 0x00, 0x4B, 0x38, 0x00, 0x4C, 0x38, 0x00, 0x4D, 0x38, 0x00, 0x4E, 0x38, 0x00, 0x4F, 0x38, 0x00, 0x50, 0x38, 0x00, 0x51, 0x38, 0x00, 0x52, 0x38, 0x00, 0x53, 0x38, 0x00, 0x54, 0x38, 0x00, 0x55, 0x38, 0x00, 0x56, 0x38, 0x00, 0x57, 0x38, 0x00, 0x58, 0x38, 0x00, 0x59, 0x38, 0x00, 0x5A, 0xB8, 0x00, 0x48, 0x00, 0x00, 0x56, 0xB8, 0x00, 0x4D, 0x00, 0x00, 0x56, 0xB8, 0x00, 0x53, 0x00, 0x00, 0x44, 0xB8, 0x00, 0x53, 0x00, 0x00, 0x53, 0xB8, 0x00, 0x50, 0x80, 0x00, 0x50, 0x00, 0x00, 0x56, 0xB8, 0x00, 0x57, 0x00, 0x00, 0x43, 0xA0, 0x00, 0x4D, 0x00, 0x00, 0x43, 0xA0, 0x00, 0x4D, 0x00, 0x00, 0x44, 0xB8, 0x00, 0x44, 0x00, 0x00, 0x4A, 0xB8, 0x30, 0x7B, 0x00, 0x30, 0x4B, 0xB8, 0x30, 0xB3, 0x00, 0x30, 0xB3, 0x38, 0x30, 0xB5, 0x38, 0x62, 0x4B, 0x38, 0x5B, 0x57, 0x38, 0x53, 0xCC, 0x38, 0x30, 0xC7, 0x38, 0x4E, 0x8C, 0x38, 0x59, 0x1A, 0x38, 0x89, 0xE3, 0x38, 0x59, 0x29, 0x38, 0x4E, 0xA4, 0x38, 0x66, 0x20, 0x38, 0x71, 0x21, 0x38, 0x65, 0x99, 0x38, 0x52, 0x4D, 0x38, 0x5F, 0x8C, 0x38, 0x51, 0x8D, 0x38, 0x65, 0xB0, 0x38, 0x52, 0x1D, 0x38, 0x7D, 0x42, 0x38, 0x75, 0x1F, 0x38, 0x8C, 0xA9, 0x38, 0x58, 0xF0, 0x38, 0x54, 0x39, 0x38, 0x6F, 0x14, 0x38, 0x62, 0x95, 0x38, 0x63, 0x55, 0x38, 0x4E, 0x00, 0x38, 0x4E, 0x09, 0x38, 0x90, 0x4A, 0x38, 0x5D, 0xE6, 0x38, 0x4E, 0x2D, 0x38, 0x53, 0xF3, 0x38, 0x63, 0x07, 0x38, 0x8D, 0x70, 0x38, 0x62, 0x53, 0x38, 0x79, 0x81, 0x38, 0x7A, 0x7A, 0x38, 0x54, 0x08, 0x38, 0x6E, 0x80, 0x38, 0x67, 0x09, 0x38, 0x67, 0x08, 0x38, 0x75, 0x33, 0x38, 0x52, 0x72, 0x38, 0x55, 0xB6, 0x38, 0x91, 0x4D, 0xC0, 0x30, 0x14, 0x80, 0x67, 0x2C, 0x00, 0x30, 0x15, 0xC0, 0x30, 0x14, 0x80, 0x4E, 0x09, 0x00, 0x30, 0x15, 0xC0, 0x30, 0x14, 0x80, 0x4E, 0x8C, 0x00, 0x30, 0x15, 0xC0, 0x30, 0x14, 0x80, 0x5B, 0x89, 0x00, 0x30, 0x15, 0xC0, 0x30, 0x14, 0x80, 0x70, 0xB9, 0x00, 0x30, 0x15, 0xC0, 0x30, 0x14, 0x80, 0x62, 0x53, 0x00, 0x30, 0x15, 0xC0, 0x30, 0x14, 0x80, 0x76, 0xD7, 0x00, 0x30, 0x15, 0xC0, 0x30, 0x14, 0x80, 0x52, 0xDD, 0x00, 0x30, 0x15, 0xC0, 0x30, 0x14, 0x80, 0x65, 0x57, 0x00, 0x30, 0x15, 0x1C, 0x5F, 0x97, 0x1C, 0x53, 0xEF, 0x00, 0x4E, 0x3D, 0x00, 0x4E, 0x38, 0x00, 0x4E, 0x41, 0x02, 0x01, 0x22, 0x00, 0x4F, 0x60, 0x00, 0x4F, 0xAE, 0x00, 0x4F, 0xBB, 0x00, 0x50, 0x02, 0x00, 0x50, 0x7A, 0x00, 0x50, 0x99, 0x00, 0x50, 0xE7, 0x00, 0x50, 0xCF, 0x00, 0x34, 0x9E, 0x02, 0x06, 0x3A, 0x00, 0x51, 0x4D, 0x00, 0x51, 0x54, 0x00, 0x51, 0x64, 0x00, 0x51, 0x77, 0x02, 0x05, 0x1C, 0x00, 0x34, 0xB9, 0x00, 0x51, 0x67, 0x00, 0x51, 0x8D, 0x02, 0x05, 0x4B, 0x00, 0x51, 0x97, 0x00, 0x51, 0xA4, 0x00, 0x4E, 0xCC, 0x00, 0x51, 0xAC, 0x00, 0x51, 0xB5, 0x02, 0x91, 0xDF, 0x00, 0x51, 0xF5, 0x00, 0x52, 0x03, 0x00, 0x34, 0xDF, 0x00, 0x52, 0x3B, 0x00, 0x52, 0x46, 0x00, 0x52, 0x72, 0x00, 0x52, 0x77, 0x00, 0x35, 0x15, 0x00, 0x52, 0xC7, 0x00, 0x52, 0xC9, 0x00, 0x52, 0xE4, 0x00, 0x52, 0xFA, 0x00, 0x53, 0x05, 0x00, 0x53, 0x06, 0x00, 0x53, 0x17, 0x00, 0x53, 0x49, 0x00, 0x53, 0x51, 0x00, 0x53, 0x5A, 0x00, 0x53, 0x73, 0x00, 0x53, 0x7D, 0x00, 0x53, 0x7F, 0x00, 0x53, 0x7F, 0x00, 0x53, 0x7F, 0x02, 0x0A, 0x2C, 0x00, 0x70, 0x70, 0x00, 0x53, 0xCA, 0x00, 0x53, 0xDF, 0x02, 0x0B, 0x63, 0x00, 0x53, 0xEB, 0x00, 0x53, 0xF1, 0x00, 0x54, 0x06, 0x00, 0x54, 0x9E, 0x00, 0x54, 0x38, 0x00, 0x54, 0x48, 0x00, 0x54, 0x68, 0x00, 0x54, 0xA2, 0x00, 0x54, 0xF6, 0x00, 0x55, 0x10, 0x00, 0x55, 0x53, 0x00, 0x55, 0x63, 0x00, 0x55, 0x84, 0x00, 0x55, 0x84, 0x00, 0x55, 0x99, 0x00, 0x55, 0xAB, 0x00, 0x55, 0xB3, 0x00, 0x55, 0xC2, 0x00, 0x57, 0x16, 0x00, 0x56, 0x06, 0x00, 0x57, 0x17, 0x00, 0x56, 0x51, 0x00, 0x56, 0x74, 0x00, 0x52, 0x07, 0x00, 0x58, 0xEE, 0x00, 0x57, 0xCE, 0x00, 0x57, 0xF4, 0x00, 0x58, 0x0D, 0x00, 0x57, 0x8B, 0x00, 0x58, 0x32, 0x00, 0x58, 0x31, 0x00, 0x58, 0xAC, 0x02, 0x14, 0xE4, 0x00, 0x58, 0xF2, 0x00, 0x58, 0xF7, 0x00, 0x59, 0x06, 0x00, 0x59, 0x1A, 0x00, 0x59, 0x22, 0x00, 0x59, 0x62, 0x02, 0x16, 0xA8, 0x02, 0x16, 0xEA, 0x00, 0x59, 0xEC, 0x00, 0x5A, 0x1B, 0x00, 0x5A, 0x27, 0x00, 0x59, 0xD8, 0x00, 0x5A, 0x66, 0x00, 0x36, 0xEE, 0x00, 0x36, 0xFC, 0x00, 0x5B, 0x08, 0x00, 0x5B, 0x3E, 0x00, 0x5B, 0x3E, 0x02, 0x19, 0xC8, 0x00, 0x5B, 0xC3, 0x00, 0x5B, 0xD8, 0x00, 0x5B, 0xE7, 0x00, 0x5B, 0xF3, 0x02, 0x1B, 0x18, 0x00, 0x5B, 0xFF, 0x00, 0x5C, 0x06, 0x00, 0x5F, 0x53, 0x00, 0x5C, 0x22, 0x00, 0x37, 0x81, 0x00, 0x5C, 0x60, 0x00, 0x5C, 0x6E, 0x00, 0x5C, 0xC0, 0x00, 0x5C, 0x8D, 0x02, 0x1D, 0xE4, 0x00, 0x5D, 0x43, 0x02, 0x1D, 0xE6, 0x00, 0x5D, 0x6E, 0x00, 0x5D, 0x6B, 0x00, 0x5D, 0x7C, 0x00, 0x5D, 0xE1, 0x00, 0x5D, 0xE2, 0x00, 0x38, 0x2F, 0x00, 0x5D, 0xFD, 0x00, 0x5E, 0x28, 0x00, 0x5E, 0x3D, 0x00, 0x5E, 0x69, 0x00, 0x38, 0x62, 0x02, 0x21, 0x83, 0x00, 0x38, 0x7C, 0x00, 0x5E, 0xB0, 0x00, 0x5E, 0xB3, 0x00, 0x5E, 0xB6, 0x00, 0x5E, 0xCA, 0x02, 0xA3, 0x92, 0x00, 0x5E, 0xFE, 0x02, 0x23, 0x31, 0x02, 0x23, 0x31, 0x00, 0x82, 0x01, 0x00, 0x5F, 0x22, 0x00, 0x5F, 0x22, 0x00, 0x38, 0xC7, 0x02, 0x32, 0xB8, 0x02, 0x61, 0xDA, 0x00, 0x5F, 0x62, 0x00, 0x5F, 0x6B, 0x00, 0x38, 0xE3, 0x00, 0x5F, 0x9A, 0x00, 0x5F, 0xCD, 0x00, 0x5F, 0xD7, 0x00, 0x5F, 0xF9, 0x00, 0x60, 0x81, 0x00, 0x39, 0x3A, 0x00, 0x39, 0x1C, 0x00, 0x60, 0x94, 0x02, 0x26, 0xD4, 0x00, 0x60, 0xC7, 0x00, 0x61, 0x48, 0x00, 0x61, 0x4C, 0x00, 0x61, 0x4E, 0x00, 0x61, 0x4C, 0x00, 0x61, 0x7A, 0x00, 0x61, 0x8E, 0x00, 0x61, 0xB2, 0x00, 0x61, 0xA4, 0x00, 0x61, 0xAF, 0x00, 0x61, 0xDE, 0x00, 0x61, 0xF2, 0x00, 0x61, 0xF6, 0x00, 0x62, 0x10, 0x00, 0x62, 0x1B, 0x00, 0x62, 0x5D, 0x00, 0x62, 0xB1, 0x00, 0x62, 0xD4, 0x00, 0x63, 0x50, 0x02, 0x2B, 0x0C, 0x00, 0x63, 0x3D, 0x00, 0x62, 0xFC, 0x00, 0x63, 0x68, 0x00, 0x63, 0x83, 0x00, 0x63, 0xE4, 0x02, 0x2B, 0xF1, 0x00, 0x64, 0x22, 0x00, 0x63, 0xC5, 0x00, 0x63, 0xA9, 0x00, 0x3A, 0x2E, 0x00, 0x64, 0x69, 0x00, 0x64, 0x7E, 0x00, 0x64, 0x9D, 0x00, 0x64, 0x77, 0x00, 0x3A, 0x6C, 0x00, 0x65, 0x4F, 0x00, 0x65, 0x6C, 0x02, 0x30, 0x0A, 0x00, 0x65, 0xE3, 0x00, 0x66, 0xF8, 0x00, 0x66, 0x49, 0x00, 0x3B, 0x19, 0x00, 0x66, 0x91, 0x00, 0x3B, 0x08, 0x00, 0x3A, 0xE4, 0x00, 0x51, 0x92, 0x00, 0x51, 0x95, 0x00, 0x67, 0x00, 0x00, 0x66, 0x9C, 0x00, 0x80, 0xAD, 0x00, 0x43, 0xD9, 0x00, 0x67, 0x17, 0x00, 0x67, 0x1B, 0x00, 0x67, 0x21, 0x00, 0x67, 0x5E, 0x00, 0x67, 0x53, 0x02, 0x33, 0xC3, 0x00, 0x3B, 0x49, 0x00, 0x67, 0xFA, 0x00, 0x67, 0x85, 0x00, 0x68, 0x52, 0x00, 0x68, 0x85, 0x02, 0x34, 0x6D, 0x00, 0x68, 0x8E, 0x00, 0x68, 0x1F, 0x00, 0x69, 0x14, 0x00, 0x3B, 0x9D, 0x00, 0x69, 0x42, 0x00, 0x69, 0xA3, 0x00, 0x69, 0xEA, 0x00, 0x6A, 0xA8, 0x02, 0x36, 0xA3, 0x00, 0x6A, 0xDB, 0x00, 0x3C, 0x18, 0x00, 0x6B, 0x21, 0x02, 0x38, 0xA7, 0x00, 0x6B, 0x54, 0x00, 0x3C, 0x4E, 0x00, 0x6B, 0x72, 0x00, 0x6B, 0x9F, 0x00, 0x6B, 0xBA, 0x00, 0x6B, 0xBB, 0x02, 0x3A, 0x8D, 0x02, 0x1D, 0x0B, 0x02, 0x3A, 0xFA, 0x00, 0x6C, 0x4E, 0x02, 0x3C, 0xBC, 0x00, 0x6C, 0xBF, 0x00, 0x6C, 0xCD, 0x00, 0x6C, 0x67, 0x00, 0x6D, 0x16, 0x00, 0x6D, 0x3E, 0x00, 0x6D, 0x77, 0x00, 0x6D, 0x41, 0x00, 0x6D, 0x69, 0x00, 0x6D, 0x78, 0x00, 0x6D, 0x85, 0x02, 0x3D, 0x1E, 0x00, 0x6D, 0x34, 0x00, 0x6E, 0x2F, 0x00, 0x6E, 0x6E, 0x00, 0x3D, 0x33, 0x00, 0x6E, 0xCB, 0x00, 0x6E, 0xC7, 0x02, 0x3E, 0xD1, 0x00, 0x6D, 0xF9, 0x00, 0x6F, 0x6E, 0x02, 0x3F, 0x5E, 0x02, 0x3F, 0x8E, 0x00, 0x6F, 0xC6, 0x00, 0x70, 0x39, 0x00, 0x70, 0x1E, 0x00, 0x70, 0x1B, 0x00, 0x3D, 0x96, 0x00, 0x70, 0x4A, 0x00, 0x70, 0x7D, 0x00, 0x70, 0x77, 0x00, 0x70, 0xAD, 0x02, 0x05, 0x25, 0x00, 0x71, 0x45, 0x02, 0x42, 0x63, 0x00, 0x71, 0x9C, 0x02, 0x43, 0xAB, 0x00, 0x72, 0x28, 0x00, 0x72, 0x35, 0x00, 0x72, 0x50, 0x02, 0x46, 0x08, 0x00, 0x72, 0x80, 0x00, 0x72, 0x95, 0x02, 0x47, 0x35, 0x02, 0x48, 0x14, 0x00, 0x73, 0x7A, 0x00, 0x73, 0x8B, 0x00, 0x3E, 0xAC, 0x00, 0x73, 0xA5, 0x00, 0x3E, 0xB8, 0x00, 0x3E, 0xB8, 0x00, 0x74, 0x47, 0x00, 0x74, 0x5C, 0x00, 0x74, 0x71, 0x00, 0x74, 0x85, 0x00, 0x74, 0xCA, 0x00, 0x3F, 0x1B, 0x00, 0x75, 0x24, 0x02, 0x4C, 0x36, 0x00, 0x75, 0x3E, 0x02, 0x4C, 0x92, 0x00, 0x75, 0x70, 0x02, 0x21, 0x9F, 0x00, 0x76, 0x10, 0x02, 0x4F, 0xA1, 0x02, 0x4F, 0xB8, 0x02, 0x50, 0x44, 0x00, 0x3F, 0xFC, 0x00, 0x40, 0x08, 0x00, 0x76, 0xF4, 0x02, 0x50, 0xF3, 0x02, 0x50, 0xF2, 0x02, 0x51, 0x19, 0x02, 0x51, 0x33, 0x00, 0x77, 0x1E, 0x00, 0x77, 0x1F, 0x00, 0x77, 0x1F, 0x00, 0x77, 0x4A, 0x00, 0x40, 0x39, 0x00, 0x77, 0x8B, 0x00, 0x40, 0x46, 0x00, 0x40, 0x96, 0x02, 0x54, 0x1D, 0x00, 0x78, 0x4E, 0x00, 0x78, 0x8C, 0x00, 0x78, 0xCC, 0x00, 0x40, 0xE3, 0x02, 0x56, 0x26, 0x00, 0x79, 0x56, 0x02, 0x56, 0x9A, 0x02, 0x56, 0xC5, 0x00, 0x79, 0x8F, 0x00, 0x79, 0xEB, 0x00, 0x41, 0x2F, 0x00, 0x7A, 0x40, 0x00, 0x7A, 0x4A, 0x00, 0x7A, 0x4F, 0x02, 0x59, 0x7C, 0x02, 0x5A, 0xA7, 0x02, 0x5A, 0xA7, 0x00, 0x7A, 0xEE, 0x00, 0x42, 0x02, 0x02, 0x5B, 0xAB, 0x00, 0x7B, 0xC6, 0x00, 0x7B, 0xC9, 0x00, 0x42, 0x27, 0x02, 0x5C, 0x80, 0x00, 0x7C, 0xD2, 0x00, 0x42, 0xA0, 0x00, 0x7C, 0xE8, 0x00, 0x7C, 0xE3, 0x00, 0x7D, 0x00, 0x02, 0x5F, 0x86, 0x00, 0x7D, 0x63, 0x00, 0x43, 0x01, 0x00, 0x7D, 0xC7, 0x00, 0x7E, 0x02, 0x00, 0x7E, 0x45, 0x00, 0x43, 0x34, 0x02, 0x62, 0x28, 0x02, 0x62, 0x47, 0x00, 0x43, 0x59, 0x02, 0x62, 0xD9, 0x00, 0x7F, 0x7A, 0x02, 0x63, 0x3E, 0x00, 0x7F, 0x95, 0x00, 0x7F, 0xFA, 0x00, 0x80, 0x05, 0x02, 0x64, 0xDA, 0x02, 0x65, 0x23, 0x00, 0x80, 0x60, 0x02, 0x65, 0xA8, 0x00, 0x80, 0x70, 0x02, 0x33, 0x5F, 0x00, 0x43, 0xD5, 0x00, 0x80, 0xB2, 0x00, 0x81, 0x03, 0x00, 0x44, 0x0B, 0x00, 0x81, 0x3E, 0x00, 0x5A, 0xB5, 0x02, 0x67, 0xA7, 0x02, 0x67, 0xB5, 0x02, 0x33, 0x93, 0x02, 0x33, 0x9C, 0x00, 0x82, 0x01, 0x00, 0x82, 0x04, 0x00, 0x8F, 0x9E, 0x00, 0x44, 0x6B, 0x00, 0x82, 0x91, 0x00, 0x82, 0x8B, 0x00, 0x82, 0x9D, 0x00, 0x52, 0xB3, 0x00, 0x82, 0xB1, 0x00, 0x82, 0xB3, 0x00, 0x82, 0xBD, 0x00, 0x82, 0xE6, 0x02, 0x6B, 0x3C, 0x00, 0x82, 0xE5, 0x00, 0x83, 0x1D, 0x00, 0x83, 0x63, 0x00, 0x83, 0xAD, 0x00, 0x83, 0x23, 0x00, 0x83, 0xBD, 0x00, 0x83, 0xE7, 0x00, 0x84, 0x57, 0x00, 0x83, 0x53, 0x00, 0x83, 0xCA, 0x00, 0x83, 0xCC, 0x00, 0x83, 0xDC, 0x02, 0x6C, 0x36, 0x02, 0x6D, 0x6B, 0x02, 0x6C, 0xD5, 0x00, 0x45, 0x2B, 0x00, 0x84, 0xF1, 0x00, 0x84, 0xF3, 0x00, 0x85, 0x16, 0x02, 0x73, 0xCA, 0x00, 0x85, 0x64, 0x02, 0x6F, 0x2C, 0x00, 0x45, 0x5D, 0x00, 0x45, 0x61, 0x02, 0x6F, 0xB1, 0x02, 0x70, 0xD2, 0x00, 0x45, 0x6B, 0x00, 0x86, 0x50, 0x00, 0x86, 0x5C, 0x00, 0x86, 0x67, 0x00, 0x86, 0x69, 0x00, 0x86, 0xA9, 0x00, 0x86, 0x88, 0x00, 0x87, 0x0E, 0x00, 0x86, 0xE2, 0x00, 0x87, 0x79, 0x00, 0x87, 0x28, 0x00, 0x87, 0x6B, 0x00, 0x87, 0x86, 0x00, 0x45, 0xD7, 0x00, 0x87, 0xE1, 0x00, 0x88, 0x01, 0x00, 0x45, 0xF9, 0x00, 0x88, 0x60, 0x00, 0x88, 0x63, 0x02, 0x76, 0x67, 0x00, 0x88, 0xD7, 0x00, 0x88, 0xDE, 0x00, 0x46, 0x35, 0x00, 0x88, 0xFA, 0x00, 0x34, 0xBB, 0x02, 0x78, 0xAE, 0x02, 0x79, 0x66, 0x00, 0x46, 0xBE, 0x00, 0x46, 0xC7, 0x00, 0x8A, 0xA0, 0x00, 0x8A, 0xED, 0x00, 0x8B, 0x8A, 0x00, 0x8C, 0x55, 0x02, 0x7C, 0xA8, 0x00, 0x8C, 0xAB, 0x00, 0x8C, 0xC1, 0x00, 0x8D, 0x1B, 0x00, 0x8D, 0x77, 0x02, 0x7F, 0x2F, 0x02, 0x08, 0x04, 0x00, 0x8D, 0xCB, 0x00, 0x8D, 0xBC, 0x00, 0x8D, 0xF0, 0x02, 0x08, 0xDE, 0x00, 0x8E, 0xD4, 0x00, 0x8F, 0x38, 0x02, 0x85, 0xD2, 0x02, 0x85, 0xED, 0x00, 0x90, 0x94, 0x00, 0x90, 0xF1, 0x00, 0x91, 0x11, 0x02, 0x87, 0x2E, 0x00, 0x91, 0x1B, 0x00, 0x92, 0x38, 0x00, 0x92, 0xD7, 0x00, 0x92, 0xD8, 0x00, 0x92, 0x7C, 0x00, 0x93, 0xF9, 0x00, 0x94, 0x15, 0x02, 0x8B, 0xFA, 0x00, 0x95, 0x8B, 0x00, 0x49, 0x95, 0x00, 0x95, 0xB7, 0x02, 0x8D, 0x77, 0x00, 0x49, 0xE6, 0x00, 0x96, 0xC3, 0x00, 0x5D, 0xB2, 0x00, 0x97, 0x23, 0x02, 0x91, 0x45, 0x02, 0x92, 0x1A, 0x00, 0x4A, 0x6E, 0x00, 0x4A, 0x76, 0x00, 0x97, 0xE0, 0x02, 0x94, 0x0A, 0x00, 0x4A, 0xB2, 0x02, 0x94, 0x96, 0x00, 0x98, 0x0B, 0x00, 0x98, 0x0B, 0x00, 0x98, 0x29, 0x02, 0x95, 0xB6, 0x00, 0x98, 0xE2, 0x00, 0x4B, 0x33, 0x00, 0x99, 0x29, 0x00, 0x99, 0xA7, 0x00, 0x99, 0xC2, 0x00, 0x99, 0xFE, 0x00, 0x4B, 0xCE, 0x02, 0x9B, 0x30, 0x00, 0x9B, 0x12, 0x00, 0x9C, 0x40, 0x00, 0x9C, 0xFD, 0x00, 0x4C, 0xCE, 0x00, 0x4C, 0xED, 0x00, 0x9D, 0x67, 0x02, 0xA0, 0xCE, 0x00, 0x4C, 0xF8, 0x02, 0xA1, 0x05, 0x02, 0xA2, 0x0E, 0x02, 0xA2, 0x91, 0x00, 0x9E, 0xBB, 0x00, 0x4D, 0x56, 0x00, 0x9E, 0xF9, 0x00, 0x9E, 0xFE, 0x00, 0x9F, 0x05, 0x00, 0x9F, 0x0F, 0x00, 0x9F, 0x16, 0x00, 0x9F, 0x3B, 0x02, 0xA6, 0x00 }; const decomp_index_table_t gl_uninorm_decomp_index_table = { { 0, 32, 64, 96, 128, -1, 160, 192, 224, 256, 288, 320, 352, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 384, 416, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 448, 480, -1, -1, -1, -1, 512, 544, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 576, 608, -1, -1, -1, -1, -1, 640, 672, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 704 }, { -1, -1, -1, -1, -1, 0, 32, 64, 96, 128, 160, 192, -1, 224, 256, 288, 320, 352, -1, -1, -1, 384, 416, 448, -1, -1, 480, 512, 544, 576, 608, 640, 672, 704, 736, 768, -1, -1, 800, 832, -1, -1, -1, -1, 864, -1, -1, -1, -1, 896, -1, 928, -1, -1, 960, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 992, 1024, -1, -1, -1, 1056, -1, -1, 1088, 1120, -1, -1, -1, -1, -1, -1, -1, 1152, -1, 1184, -1, 1216, -1, -1, -1, 1248, -1, -1, -1, 1280, -1, -1, -1, 1312, -1, -1, -1, 1344, -1, -1, 1376, -1, -1, -1, 1408, 1440, -1, 1472, -1, 1504, 1536, 1568, 1600, -1, -1, -1, 1632, -1, -1, -1, -1, -1, 1664, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1696, 1728, 1760, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1792, 1824, 1856, 1888, 1920, -1, -1, 1952, 1984, 2016, 2048, 2080, 2112, 2144, 2176, 2208, 2240, 2272, 2304, 2336, 2368, 2400, 2432, 2464, 2496, 2528, 2560, 2592, 2624, -1, -1, 2656, 2688, 2720, 2752, 2784, 2816, 2848, -1, 2880, 2912, 2944, 2976, 3008, 3040, -1, 3072, -1, 3104, -1, -1, -1, -1, -1, -1, -1, -1, -1, 3136, 3168, 3200, 3232, 3264, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 3296, -1, -1, 3328, -1, -1, 3360, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 3392, -1, -1, -1, -1, -1, -1, -1, 3424, -1, -1, -1, -1, -1, -1, -1, -1, 3456, -1, -1, 3488, 3520, 3552, 3584, 3616, 3648, 3680, 3712, -1, 3744, 3776, 3808, 3840, 3872, 3904, 3936, 3968, -1, 4000, 4032, 4064, 4096, -1, -1, -1, 4128, 4160, 4192, 4224, 4256, 4288, 4320, 4352, 4384, 4416, 4448, 4480, 4512, 4544, 4576, 4608, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 4640, -1, -1, -1, -1, -1, -1, 4672, -1, -1, -1, 4704, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 4736, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 4768, 4800, 4832, 4864, 4896, 4928, 4960, 4992, 5024, 5056, 5088, 5120, 5152, 5184, 5216, -1, 5248, 5280, 5312, 5344, 5376, 5408, 5440, 5472, 5504, 5536, 5568, 5600, 5632, 5664, 5696, 5728, 5760, 5792, 5824, 5856, 5888, 5920, 5952, 5984, 6016, 6048, 6080, 6112, 6144, 6176, 6208, 6240, 6272, 6304, 6336, 6368, 6400, 6432, 6464, 6496, -1, -1, -1, -1, 6528, 6560, -1, -1, -1, 6592, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 6624, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 6656, -1, -1, -1, -1, -1, -1, -1, 6688, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 6720, 6752, -1, 6784, 6816, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 6848, 6880, 6912, 6944, 6976, 7008, 7040, 7072, 7104, 7136, 7168, 7200, 7232, 7264, 7296, 7328, 7360, 7392, 7424, 7456, 7488, 7520, 7552, 7584, 7616, 7648, 7680, 7712, 7744, 7776, 7808, 7840, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7872, 7904, 7936, 7968, 8000, 8032, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8064, 8096, 8128, 8160, 8192, -1, -1, -1, 8224, 8256, 8288, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8320, 8352, 8384, 8416, 8448, 8480, 8512, 8544, 8576, 8608, 8640, 8672, 8704, 8736, 8768, 8800, 8832, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 }, { 32768, -1, -1, -1, -1, -1, -1, -1, 32769, -1, 32771, -1, -1, -1, -1, 32772, -1, -1, 32774, 32775, 32776, 32778, -1, -1, 32779, 32781, 32782, -1, 32783, 32786, 32789, -1, 24, 26, 28, 30, 32, 34, -1, 36, 38, 40, 42, 44, 46, 48, 50, 52, -1, 54, 56, 58, 60, 62, 64, -1, -1, 66, 68, 70, 72, 74, -1, -1, 76, 78, 80, 82, 84, 86, -1, 88, 90, 92, 94, 96, 98, 100, 102, 104, -1, 106, 108, 110, 112, 114, 116, -1, -1, 118, 120, 122, 124, 126, -1, 128, 130, 132, 134, 136, 138, 140, 142, 144, 146, 148, 150, 152, 154, 156, 158, 160, -1, -1, 162, 164, 166, 168, 170, 172, 174, 176, 178, 180, 182, 184, 186, 188, 190, 192, 194, 196, 198, 200, -1, -1, 202, 204, 206, 208, 210, 212, 214, 216, 218, -1, 32988, 32990, 224, 226, 228, 230, -1, 232, 234, 236, 238, 240, 242, 33012, 33014, -1, -1, 248, 250, 252, 254, 256, 258, 33028, -1, -1, 262, 264, 266, 268, 270, 272, -1, -1, 274, 276, 278, 280, 282, 284, 286, 288, 290, 292, 294, 296, 298, 300, 302, 304, 306, 308, -1, -1, 310, 312, 314, 316, 318, 320, 322, 324, 326, 328, 330, 332, 334, 336, 338, 340, 342, 344, 346, 348, 350, 352, 354, 33124, 357, 359, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 361, 363, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 33133, 33135, 33137, 33139, 33141, 33143, 33145, 33147, 33149, 383, 385, 387, 389, 391, 393, 395, 397, 399, 401, 403, 405, 407, 409, 411, 413, -1, 415, 417, 419, 421, 423, 425, -1, -1, 427, 429, 431, 433, 435, 437, 439, 441, 443, 445, 447, 33217, 33219, 33221, 455, 457, -1, -1, 459, 461, 463, 465, 467, 469, 471, 473, 475, 477, 479, 481, 483, 485, 487, 489, 491, 493, 495, 497, 499, 501, 503, 505, 507, 509, 511, 513, 515, 517, 519, 521, 523, 525, 527, 529, -1, -1, 531, 533, -1, -1, -1, -1, -1, -1, 535, 537, 539, 541, 543, 545, 547, 549, 551, 553, 555, 557, 559, 561, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 33331, 33332, 33333, 33334, 33335, 33336, 33337, 33338, 33339, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 33340, 33342, 33344, 33346, 33348, 33350, -1, -1, 33352, 33353, 33354, 33355, 33356, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 589, 590, -1, 591, 592, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 594, -1, -1, -1, -1, -1, 33363, -1, -1, -1, 597, -1, -1, -1, -1, -1, 33366, 600, 602, 604, 605, 607, 609, -1, 611, -1, 613, 615, 617, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 619, 621, 623, 625, 627, 629, 631, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 633, 635, 637, 639, 641, -1, 33411, 33412, 33413, 646, 648, 33418, 33419, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 33420, 33421, 33422, -1, 33423, 33424, -1, -1, -1, 33425, -1, -1, -1, -1, -1, -1, 658, 660, -1, 662, -1, -1, -1, 664, -1, -1, -1, -1, 666, 668, 670, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 672, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 674, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 676, 678, -1, 680, -1, -1, -1, 682, -1, -1, -1, -1, 684, 686, 688, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 690, 692, -1, -1, -1, -1, -1, -1, -1, -1, -1, 694, 696, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 698, 700, 702, 704, -1, -1, 706, 708, -1, -1, 710, 712, 714, 716, 718, 720, -1, -1, 722, 724, 726, 728, 730, 732, -1, -1, 734, 736, 738, 740, 742, 744, 746, 748, 750, 752, 754, 756, -1, -1, 758, 760, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 33530, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 764, 766, 768, 770, 772, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 33542, 33544, 33546, 33548, -1, -1, -1, -1, -1, -1, -1, 782, -1, 784, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 786, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 788, -1, -1, -1, -1, -1, -1, -1, 790, -1, -1, 792, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 794, 796, 798, 800, 802, 804, 806, 808, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 810, 812, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 814, 816, -1, 818, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 820, -1, -1, 822, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 824, 826, 828, -1, -1, 830, -1, -1, -1, -1, -1, -1, -1, -1, -1, 832, -1, -1, 834, 836, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 838, 840, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 842, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 844, 846, 848, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 850, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 852, -1, -1, -1, -1, -1, -1, 854, 856, -1, 858, 860, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 862, 864, 866, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 868, -1, 870, 872, 874, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 33644, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 33646, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 33648, 33650, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 33652, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 885, -1, -1, -1, -1, -1, -1, -1, -1, -1, 887, -1, -1, -1, -1, 889, -1, -1, -1, -1, 891, -1, -1, -1, -1, 893, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 895, -1, -1, -1, -1, -1, -1, -1, -1, -1, 897, -1, 899, 901, 33671, 905, 33675, -1, -1, -1, -1, -1, -1, -1, 909, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 911, -1, -1, -1, -1, -1, -1, -1, -1, -1, 913, -1, -1, -1, -1, 915, -1, -1, -1, -1, 917, -1, -1, -1, -1, 919, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 921, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 923, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 33693, -1, -1, -1, -1, -1, -1, -1, -1, -1, 926, -1, 928, -1, 930, -1, 932, -1, 934, -1, -1, -1, 936, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 938, -1, 940, -1, -1, 942, 944, -1, 946, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 33716, 33717, 33718, -1, 33719, 33720, 33721, 33722, 33723, 33724, 33725, 33726, 33727, 33728, 33729, -1, 33730, 33731, 33732, 33733, 33734, 33735, 33736, 33737, 33738, 33739, 33740, 33741, 33742, 33743, 33744, 33745, 33746, 33747, -1, 33748, 33749, 33750, 33751, 33752, 33753, 33754, 33755, 33756, 33757, 33758, 33759, 33760, 33761, 33762, 33763, 33764, 33765, 33766, 33767, 33768, 33769, 33770, 33771, 33772, 33773, 33774, 33775, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 33776, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 33777, 33778, 33779, 33780, 33781, 33782, 33783, 33784, 33785, 33786, 33787, 33788, 33789, 33790, 33791, 33792, 33793, 33794, 33795, 33796, 33797, 33798, 33799, 33800, 33801, 33802, 33803, 33804, 33805, 33806, 33807, 33808, 33809, 33810, 33811, 33812, 33813, 1046, 1048, 1050, 1052, 1054, 1056, 1058, 1060, 1062, 1064, 1066, 1068, 1070, 1072, 1074, 1076, 1078, 1080, 1082, 1084, 1086, 1088, 1090, 1092, 1094, 1096, 1098, 1100, 1102, 1104, 1106, 1108, 1110, 1112, 1114, 1116, 1118, 1120, 1122, 1124, 1126, 1128, 1130, 1132, 1134, 1136, 1138, 1140, 1142, 1144, 1146, 1148, 1150, 1152, 1154, 1156, 1158, 1160, 1162, 1164, 1166, 1168, 1170, 1172, 1174, 1176, 1178, 1180, 1182, 1184, 1186, 1188, 1190, 1192, 1194, 1196, 1198, 1200, 1202, 1204, 1206, 1208, 1210, 1212, 1214, 1216, 1218, 1220, 1222, 1224, 1226, 1228, 1230, 1232, 1234, 1236, 1238, 1240, 1242, 1244, 1246, 1248, 1250, 1252, 1254, 1256, 1258, 1260, 1262, 1264, 1266, 1268, 1270, 1272, 1274, 1276, 1278, 1280, 1282, 1284, 1286, 1288, 1290, 1292, 1294, 1296, 1298, 1300, 1302, 1304, 1306, 1308, 1310, 1312, 1314, 1316, 1318, 1320, 1322, 1324, 1326, 1328, 1330, 1332, 1334, 1336, 1338, 1340, 1342, 1344, 1346, 1348, 1350, 1352, 34122, 1356, -1, -1, -1, -1, 1358, 1360, 1362, 1364, 1366, 1368, 1370, 1372, 1374, 1376, 1378, 1380, 1382, 1384, 1386, 1388, 1390, 1392, 1394, 1396, 1398, 1400, 1402, 1404, 1406, 1408, 1410, 1412, 1414, 1416, 1418, 1420, 1422, 1424, 1426, 1428, 1430, 1432, 1434, 1436, 1438, 1440, 1442, 1444, 1446, 1448, 1450, 1452, 1454, 1456, 1458, 1460, 1462, 1464, 1466, 1468, 1470, 1472, 1474, 1476, 1478, 1480, 1482, 1484, 1486, 1488, 1490, 1492, 1494, 1496, 1498, 1500, 1502, 1504, 1506, 1508, 1510, 1512, 1514, 1516, 1518, 1520, 1522, 1524, 1526, 1528, 1530, 1532, 1534, 1536, -1, -1, -1, -1, -1, -1, 1538, 1540, 1542, 1544, 1546, 1548, 1550, 1552, 1554, 1556, 1558, 1560, 1562, 1564, 1566, 1568, 1570, 1572, 1574, 1576, 1578, 1580, -1, -1, 1582, 1584, 1586, 1588, 1590, 1592, -1, -1, 1594, 1596, 1598, 1600, 1602, 1604, 1606, 1608, 1610, 1612, 1614, 1616, 1618, 1620, 1622, 1624, 1626, 1628, 1630, 1632, 1634, 1636, 1638, 1640, 1642, 1644, 1646, 1648, 1650, 1652, 1654, 1656, 1658, 1660, 1662, 1664, 1666, 1668, -1, -1, 1670, 1672, 1674, 1676, 1678, 1680, -1, -1, 1682, 1684, 1686, 1688, 1690, 1692, 1694, 1696, -1, 1698, -1, 1700, -1, 1702, -1, 1704, 1706, 1708, 1710, 1712, 1714, 1716, 1718, 1720, 1722, 1724, 1726, 1728, 1730, 1732, 1734, 1736, 1738, 1740, 1741, 1743, 1744, 1746, 1747, 1749, 1750, 1752, 1753, 1755, 1756, 1758, -1, -1, 1759, 1761, 1763, 1765, 1767, 1769, 1771, 1773, 1775, 1777, 1779, 1781, 1783, 1785, 1787, 1789, 1791, 1793, 1795, 1797, 1799, 1801, 1803, 1805, 1807, 1809, 1811, 1813, 1815, 1817, 1819, 1821, 1823, 1825, 1827, 1829, 1831, 1833, 1835, 1837, 1839, 1841, 1843, 1845, 1847, 1849, 1851, 1853, 1855, 1857, 1859, 1861, 1863, -1, 1865, 1867, 1869, 1871, 1873, 1875, 1876, 34646, 1880, 34649, 34651, 1885, 1887, 1889, 1891, -1, 1893, 1895, 1897, 1899, 1900, 1902, 1903, 1905, 1907, 1909, 1911, 1913, 1915, 1917, -1, -1, 1918, 1920, 1922, 1924, 1926, 1928, -1, 1929, 1931, 1933, 1935, 1937, 1939, 1941, 1942, 1944, 1946, 1948, 1950, 1952, 1954, 1956, 1957, 1959, 1961, 1962, -1, -1, 1963, 1965, 1967, -1, 1969, 1971, 1973, 1975, 1976, 1978, 1979, 1981, 34750, -1, 1984, 1985, 34754, 34755, 34756, 34757, 34758, 34759, 34760, 34761, 34762, -1, -1, -1, -1, -1, -1, 34763, -1, -1, -1, -1, -1, 34764, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 34766, 34767, 34769, -1, -1, -1, -1, -1, -1, -1, -1, 34772, -1, -1, -1, 34773, 34775, -1, 34778, 34780, -1, -1, -1, -1, 34783, -1, 34785, -1, -1, -1, -1, -1, -1, -1, -1, 34787, 34789, 34791, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 34793, -1, -1, -1, -1, -1, -1, -1, 34797, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 34798, 34799, -1, -1, 34800, 34801, 34802, 34803, 34804, 34805, 34806, 34807, 34808, 34809, 34810, 34811, 34812, 34813, 34814, 34815, 34816, 34817, 34818, 34819, 34820, 34821, 34822, 34823, 34824, 34825, 34826, -1, 34827, 34828, 34829, 34830, 34831, 34832, 34833, 34834, 34835, 34836, 34837, 34838, 34839, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 34840, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 34842, 34845, 34848, 34849, -1, 34851, 34854, 34857, -1, 34858, 34860, 34861, 34862, 34863, 34864, 34865, 34866, 34867, 34868, 34869, -1, 34870, 34871, -1, -1, 34873, 34874, 34875, 34876, 34877, -1, -1, 34878, 34880, 34883, -1, 34885, -1, 2118, -1, 34887, -1, 2120, 2121, 34890, 34891, -1, 34892, 34893, 34894, -1, 34895, 34896, 34897, 34898, 34899, 34900, 34901, -1, 34902, 34905, 34906, 34907, 34908, 34909, -1, -1, -1, -1, 34910, 34911, 34912, 34913, 34914, -1, -1, -1, -1, -1, -1, 34915, 34918, 34921, 34925, 34928, 34931, 34934, 34937, 34940, 34943, 34946, 34949, 34952, 34955, 34958, 34961, 34963, 34964, 34966, 34969, 34971, 34972, 34974, 34977, 34981, 34983, 34984, 34986, 34989, 34990, 34991, 34992, 34993, 34994, 34996, 34999, 35001, 35002, 35004, 35007, 35011, 35013, 35014, 35016, 35019, 35020, 35021, 35022, -1, -1, -1, -1, -1, -1, -1, -1, -1, 35023, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2258, 2260, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2262, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2264, 2266, 2268, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2270, -1, -1, -1, -1, 2272, -1, -1, 2274, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2276, -1, 2278, -1, -1, -1, -1, -1, 35048, 35050, -1, 35053, 35055, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2290, -1, -1, 2292, -1, -1, 2294, -1, 2296, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2298, -1, 2300, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2302, 2304, 2306, 2308, 2310, -1, -1, 2312, 2314, -1, -1, 2316, 2318, -1, -1, -1, -1, -1, -1, 2320, 2322, -1, -1, 2324, 2326, -1, -1, 2328, 2330, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2332, 2334, 2336, 2338, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2340, 2342, 2344, 2346, -1, -1, -1, -1, -1, -1, 2348, 2350, 2352, 2354, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2356, 2357, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 35126, 35127, 35128, 35129, 35130, 35131, 35132, 35133, 35134, 35135, 35137, 35139, 35141, 35143, 35145, 35147, 35149, 35151, 35153, 35155, 35157, 35160, 35163, 35166, 35169, 35172, 35175, 35178, 35181, 35184, 35188, 35192, 35196, 35200, 35204, 35208, 35212, 35216, 35220, 35224, 35228, 35230, 35232, 35234, 35236, 35238, 35240, 35242, 35244, 35246, 35249, 35252, 35255, 35258, 35261, 35264, 35267, 35270, 35273, 35276, 35279, 35282, 35285, 35288, 35291, 35294, 35297, 35300, 35303, 35306, 35309, 35312, 35315, 35318, 35321, 35324, 35327, 35330, 35333, 35336, 35339, 35342, 35345, 35348, 35351, 35354, 35357, 35358, 35359, 35360, 35361, 35362, 35363, 35364, 35365, 35366, 35367, 35368, 35369, 35370, 35371, 35372, 35373, 35374, 35375, 35376, 35377, 35378, 35379, 35380, 35381, 35382, 35383, 35384, 35385, 35386, 35387, 35388, 35389, 35390, 35391, 35392, 35393, 35394, 35395, 35396, 35397, 35398, 35399, 35400, 35401, 35402, 35403, 35404, 35405, 35406, 35407, 35408, 35409, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 35410, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 35414, 35417, 35419, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2654, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 35424, 35425, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 35426, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 35427, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 35428, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 35429, 35430, 35431, 35432, 35433, 35434, 35435, 35436, 35437, 35438, 35439, 35440, 35441, 35442, 35443, 35444, 35445, 35446, 35447, 35448, 35449, 35450, 35451, 35452, 35453, 35454, 35455, 35456, 35457, 35458, 35459, 35460, 35461, 35462, 35463, 35464, 35465, 35466, 35467, 35468, 35469, 35470, 35471, 35472, 35473, 35474, 35475, 35476, 35477, 35478, 35479, 35480, 35481, 35482, 35483, 35484, 35485, 35486, 35487, 35488, 35489, 35490, 35491, 35492, 35493, 35494, 35495, 35496, 35497, 35498, 35499, 35500, 35501, 35502, 35503, 35504, 35505, 35506, 35507, 35508, 35509, 35510, 35511, 35512, 35513, 35514, 35515, 35516, 35517, 35518, 35519, 35520, 35521, 35522, 35523, 35524, 35525, 35526, 35527, 35528, 35529, 35530, 35531, 35532, 35533, 35534, 35535, 35536, 35537, 35538, 35539, 35540, 35541, 35542, 35543, 35544, 35545, 35546, 35547, 35548, 35549, 35550, 35551, 35552, 35553, 35554, 35555, 35556, 35557, 35558, 35559, 35560, 35561, 35562, 35563, 35564, 35565, 35566, 35567, 35568, 35569, 35570, 35571, 35572, 35573, 35574, 35575, 35576, 35577, 35578, 35579, 35580, 35581, 35582, 35583, 35584, 35585, 35586, 35587, 35588, 35589, 35590, 35591, 35592, 35593, 35594, 35595, 35596, 35597, 35598, 35599, 35600, 35601, 35602, 35603, 35604, 35605, 35606, 35607, 35608, 35609, 35610, 35611, 35612, 35613, 35614, 35615, 35616, 35617, 35618, 35619, 35620, 35621, 35622, 35623, 35624, 35625, 35626, 35627, 35628, 35629, 35630, 35631, 35632, 35633, 35634, 35635, 35636, 35637, 35638, 35639, 35640, 35641, 35642, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 35643, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 35644, -1, 35645, 35646, 35647, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2880, -1, 2882, -1, 2884, -1, 2886, -1, 2888, -1, 2890, -1, 2892, -1, 2894, -1, 2896, -1, 2898, -1, 2900, -1, 2902, -1, -1, 2904, -1, 2906, -1, 2908, -1, -1, -1, -1, -1, -1, 2910, 2912, -1, 2914, 2916, -1, 2918, 2920, -1, 2922, 2924, -1, 2926, 2928, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2930, -1, -1, -1, -1, -1, -1, 35700, 35702, -1, 2936, 35706, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2940, -1, 2942, -1, 2944, -1, 2946, -1, 2948, -1, 2950, -1, 2952, -1, 2954, -1, 2956, -1, 2958, -1, 2960, -1, 2962, -1, -1, 2964, -1, 2966, -1, 2968, -1, -1, -1, -1, -1, -1, 2970, 2972, -1, 2974, 2976, -1, 2978, 2980, -1, 2982, 2984, -1, 2986, 2988, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2990, -1, -1, 2992, 2994, 2996, 2998, -1, -1, -1, 3000, 35770, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 35772, 35773, 35774, 35775, 35776, 35777, 35778, 35779, 35780, 35781, 35782, 35783, 35784, 35785, 35786, 35787, 35788, 35789, 35790, 35791, 35792, 35793, 35794, 35795, 35796, 35797, 35798, 35799, 35800, 35801, 35802, 35803, 35804, 35805, 35806, 35807, 35808, 35809, 35810, 35811, 35812, 35813, 35814, 35815, 35816, 35817, 35818, 35819, 35820, 35821, 35822, 35823, 35824, 35825, 35826, 35827, 35828, 35829, 35830, 35831, 35832, 35833, 35834, 35835, 35836, 35837, 35838, 35839, 35840, 35841, 35842, 35843, 35844, 35845, 35846, 35847, 35848, 35849, 35850, 35851, 35852, 35853, 35854, 35855, 35856, 35857, 35858, 35859, 35860, 35861, 35862, 35863, 35864, 35865, -1, -1, -1, 35866, 35867, 35868, 35869, 35870, 35871, 35872, 35873, 35874, 35875, 35876, 35877, 35878, 35879, 35880, 35883, 35886, 35889, 35892, 35895, 35898, 35901, 35904, 35907, 35910, 35913, 35916, 35919, 35922, 35926, 35930, 35934, 35938, 35942, 35946, 35950, 35954, 35958, 35962, 35966, 35970, 35974, 35978, 35982, 35989, -1, 35995, 35998, 36001, 36004, 36007, 36010, 36013, 36016, 36019, 36022, 36025, 36028, 36031, 36034, 36037, 36040, 36043, 36046, 36049, 36052, 36055, 36058, 36061, 36064, 36067, 36070, 36073, 36076, 36079, 36082, 36085, 36088, 36091, 36094, 36097, 36100, 36103, 36104, 36105, 36106, -1, -1, -1, -1, -1, -1, -1, -1, 36107, 36110, 36112, 36114, 36116, 36118, 36120, 36122, 36124, 36126, 36128, 36130, 36132, 36134, 36136, 36138, 36140, 36141, 36142, 36143, 36144, 36145, 36146, 36147, 36148, 36149, 36150, 36151, 36152, 36153, 36154, 36156, 36158, 36160, 36162, 36164, 36166, 36168, 36170, 36172, 36174, 36176, 36178, 36180, 36182, 36187, 36191, -1, 36193, 36194, 36195, 36196, 36197, 36198, 36199, 36200, 36201, 36202, 36203, 36204, 36205, 36206, 36207, 36208, 36209, 36210, 36211, 36212, 36213, 36214, 36215, 36216, 36217, 36218, 36219, 36220, 36221, 36222, 36223, 36224, 36225, 36226, 36227, 36228, 36229, 36230, 36231, 36232, 36233, 36234, 36235, 36236, 36237, 36238, 36239, 36240, 36241, 36242, 36244, 36246, 36248, 36250, 36252, 36254, 36256, 36258, 36260, 36262, 36264, 36266, 36268, 36270, 36272, 36274, 36276, 36278, 36280, 36282, 36284, 36286, 36288, 36290, 36293, 36296, 36299, 36301, 36304, 36306, 36309, 36310, 36311, 36312, 36313, 36314, 36315, 36316, 36317, 36318, 36319, 36320, 36321, 36322, 36323, 36324, 36325, 36326, 36327, 36328, 36329, 36330, 36331, 36332, 36333, 36334, 36335, 36336, 36337, 36338, 36339, 36340, 36341, 36342, 36343, 36344, 36345, 36346, 36347, 36348, 36349, 36350, 36351, 36352, 36353, 36354, 36355, -1, 36356, 36360, 36364, 36368, 36371, 36375, 36378, 36381, 36386, 36390, 36393, 36396, 36399, 36403, 36407, 36410, 36413, 36415, 36418, 36422, 36426, 36428, 36433, 36439, 36444, 36447, 36452, 36457, 36461, 36464, 36467, 36470, 36474, 36479, 36483, 36486, 36489, 36492, 36494, 36496, 36498, 36500, 36503, 36506, 36511, 36514, 36518, 36523, 36526, 36528, 36530, 36535, 36539, 36544, 36547, 36552, 36554, 36557, 36560, 36563, 36566, 36569, 36573, 36576, 36578, 36581, 36584, 36587, 36591, 36594, 36597, 36600, 36605, 36609, 36611, 36616, 36618, 36622, 36626, 36629, 36632, 36635, 36639, 36641, 36644, 36648, 36650, 36655, 36658, 36660, 36662, 36664, 36666, 36668, 36670, 36672, 36674, 36676, 36678, 36681, 36684, 36687, 36690, 36693, 36696, 36699, 36702, 36705, 36708, 36711, 36714, 36717, 36720, 36723, 36726, 36728, 36730, 36733, 36735, 36737, 36739, 36742, 36745, 36747, 36749, 36751, 36753, 36755, 36759, 36761, 36763, 36765, 36767, 36769, 36771, 36773, 36775, 36778, 36782, 36784, 36786, 36788, 36790, 36792, 36794, 36796, 36799, 36802, 36805, 36808, 36810, 36812, 36814, 36816, 36818, 36820, 36822, 36824, 36826, 36828, 36831, 36834, 36836, 36839, 36842, 36845, 36847, 36850, 36853, 36857, 36859, 36862, 36865, 36868, 36871, 36876, 36882, 36884, 36886, 36888, 36890, 36892, 36894, 36896, 36898, 36900, 36902, 36904, 36906, 36908, 36910, 36912, 36914, 36916, 36918, 36922, 36924, 36926, 36928, 36932, 36935, 36937, 36939, 36941, 36943, 36945, 36947, 36949, 36951, 36953, 36955, 36958, 36960, 36962, 36965, 36968, 36970, 36974, 36977, 36979, 36981, 36983, 36985, 36988, 36991, 36993, 36995, 36997, 36999, 37001, 37003, 37005, 37007, 37009, 37012, 37015, 37018, 37021, 37024, 37027, 37030, 37033, 37036, 37039, 37042, 37045, 37048, 37051, 37054, 37057, 37060, 37063, 37066, 37069, 37072, 37075, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 37078, 37079, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 37080, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 37081, 37082, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 37083, 37084, 37085, 37086, 4319, 4320, 4321, 4322, 4323, 4324, 4325, 4326, 4327, 4328, 4329, 4330, 4331, 4332, 4333, 4334, 4335, 4336, 4337, 4338, 4339, 4340, 4341, 4342, 4343, 4344, 4345, 4346, 4347, 4348, 4349, 4350, 4351, 4352, 4353, 4354, 4355, 4356, 4357, 4358, 4359, 4360, 4361, 4362, 4363, 4364, 4365, 4366, 4367, 4368, 4369, 4370, 4371, 4372, 4373, 4374, 4375, 4376, 4377, 4378, 4379, 4380, 4381, 4382, 4383, 4384, 4385, 4386, 4387, 4388, 4389, 4390, 4391, 4392, 4393, 4394, 4395, 4396, 4397, 4398, 4399, 4400, 4401, 4402, 4403, 4404, 4405, 4406, 4407, 4408, 4409, 4410, 4411, 4412, 4413, 4414, 4415, 4416, 4417, 4418, 4419, 4420, 4421, 4422, 4423, 4424, 4425, 4426, 4427, 4428, 4429, 4430, 4431, 4432, 4433, 4434, 4435, 4436, 4437, 4438, 4439, 4440, 4441, 4442, 4443, 4444, 4445, 4446, 4447, 4448, 4449, 4450, 4451, 4452, 4453, 4454, 4455, 4456, 4457, 4458, 4459, 4460, 4461, 4462, 4463, 4464, 4465, 4466, 4467, 4468, 4469, 4470, 4471, 4472, 4473, 4474, 4475, 4476, 4477, 4478, 4479, 4480, 4481, 4482, 4483, 4484, 4485, 4486, 4487, 4488, 4489, 4490, 4491, 4492, 4493, 4494, 4495, 4496, 4497, 4498, 4499, 4500, 4501, 4502, 4503, 4504, 4505, 4506, 4507, 4508, 4509, 4510, 4511, 4512, 4513, 4514, 4515, 4516, 4517, 4518, 4519, 4520, 4521, 4522, 4523, 4524, 4525, 4526, 4527, 4528, 4529, 4530, 4531, 4532, 4533, 4534, 4535, 4536, 4537, 4538, 4539, 4540, 4541, 4542, 4543, 4544, 4545, 4546, 4547, 4548, 4549, 4550, 4551, 4552, 4553, 4554, 4555, 4556, 4557, 4558, 4559, 4560, 4561, 4562, 4563, 4564, 4565, 4566, 4567, 4568, 4569, 4570, 4571, 4572, 4573, 4574, 4575, 4576, 4577, 4578, 4579, 4580, 4581, 4582, 4583, 4584, 4585, 4586, 4587, 4588, -1, -1, 4589, -1, 4590, -1, -1, 4591, 4592, 4593, 4594, 4595, 4596, 4597, 4598, 4599, 4600, -1, 4601, -1, 4602, -1, -1, 4603, 4604, -1, -1, -1, 4605, 4606, 4607, 4608, 4609, 4610, 4611, 4612, 4613, 4614, 4615, 4616, 4617, 4618, 4619, 4620, 4621, 4622, 4623, 4624, 4625, 4626, 4627, 4628, 4629, 4630, 4631, 4632, 4633, 4634, 4635, 4636, 4637, 4638, 4639, 4640, 4641, 4642, 4643, 4644, 4645, 4646, 4647, 4648, 4649, 4650, 4651, 4652, 4653, 4654, 4655, 4656, 4657, 4658, 4659, 4660, 4661, 4662, 4663, 4664, 4665, 4666, 4667, 4668, 4669, 4670, 4671, 4672, -1, -1, 4673, 4674, 4675, 4676, 4677, 4678, 4679, 4680, 4681, 4682, 4683, 4684, 4685, 4686, 4687, 4688, 4689, 4690, 4691, 4692, 4693, 4694, 4695, 4696, 4697, 4698, 4699, 4700, 4701, 4702, 4703, 4704, 4705, 4706, 4707, 4708, 4709, 4710, 4711, 4712, 4713, 4714, 4715, 4716, 4717, 4718, 4719, 4720, 4721, 4722, 4723, 4724, 4725, 4726, 4727, 4728, 4729, 4730, 4731, 4732, 4733, 4734, 4735, 4736, 4737, 4738, 4739, 4740, 4741, 4742, 4743, 4744, 4745, 4746, 4747, 4748, 4749, 4750, 4751, 4752, 4753, 4754, 4755, 4756, 4757, 4758, 4759, 4760, 4761, 4762, 4763, 4764, 4765, 4766, 4767, 4768, 4769, 4770, 4771, 4772, 4773, 4774, 4775, 4776, 4777, 4778, -1, -1, -1, -1, -1, -1, 37547, 37549, 37551, 37553, 37556, 37559, 37561, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 37563, 37565, 37567, 37569, 37571, -1, -1, -1, -1, -1, 4805, -1, 4807, 37577, 37578, 37579, 37580, 37581, 37582, 37583, 37584, 37585, 37586, 4819, 4821, 4823, 4825, 4827, 4829, 4831, 4833, 4835, 4837, 4839, 4841, 4843, -1, 4845, 4847, 4849, 4851, 4853, -1, 4855, -1, 4857, 4859, -1, 4861, 4863, -1, 4865, 4867, 4869, 4871, 4873, 4875, 4877, 4879, 4881, 37651, 37653, 37654, 37655, 37656, 37657, 37658, 37659, 37660, 37661, 37662, 37663, 37664, 37665, 37666, 37667, 37668, 37669, 37670, 37671, 37672, 37673, 37674, 37675, 37676, 37677, 37678, 37679, 37680, 37681, 37682, 37683, 37684, 37685, 37686, 37687, 37688, 37689, 37690, 37691, 37692, 37693, 37694, 37695, 37696, 37697, 37698, 37699, 37700, 37701, 37702, 37703, 37704, 37705, 37706, 37707, 37708, 37709, 37710, 37711, 37712, 37713, 37714, 37715, 37716, 37717, 37718, 37719, 37720, 37721, 37722, 37723, 37724, 37725, 37726, 37727, 37728, 37729, 37730, 37731, 37732, 37733, 37734, 37735, 37736, 37737, 37738, 37739, 37740, 37741, 37742, 37743, 37744, 37745, 37746, 37747, 37748, 37749, 37750, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 37751, 37752, 37753, 37754, 37755, 37756, 37757, 37758, 37759, 37760, 37761, 37762, 37763, 37764, 37765, 37766, 37767, 37768, 37769, 37770, 37771, 37772, 37773, 37774, 37776, 37778, 37780, 37782, 37784, 37786, 37788, 37790, 37792, 37794, 37796, 37798, 37800, 37802, 37804, 37806, 37808, 37810, 37811, 37812, 37813, 37814, 37816, 37818, 37820, 37822, 37824, 37826, 37828, 37830, 37832, 37834, 37836, 37838, 37840, 37842, 37844, 37846, 37848, 37850, 37852, 37854, 37856, 37858, 37860, 37862, 37864, 37866, 37868, 37870, 37872, 37874, 37876, 37878, 37880, 37882, 37884, 37886, 37888, 37890, 37892, 37894, 37896, 37898, 37900, 37902, 37904, 37906, 37908, 37910, 37912, 37914, 37916, 37918, 37920, 37922, 37924, 37926, 37928, 37930, 37932, 37934, 37936, 37938, 37940, 37942, 37944, 37946, 37948, 37950, 37952, 37954, 37956, 37958, 37960, 37962, 37964, 37966, 37968, 37970, 37972, 37974, 37976, 37978, 37980, 37982, 37984, 37986, 37988, 37990, 37992, 37994, 37996, 37998, 38000, 38002, 38005, 38008, 38011, 38014, 38017, 38020, 38022, 38024, 38026, 38028, 38030, 38032, 38034, 38036, 38038, 38040, 38042, 38044, 38046, 38048, 38050, 38052, 38054, 38056, 38058, 38060, 38062, 38064, 38066, 38068, 38070, 38072, 38074, 38076, 38078, 38080, 38082, 38084, 38086, 38088, 38090, 38092, 38094, 38096, 38098, 38100, 38102, 38104, 38106, 38108, 38110, 38112, 38114, 38116, 38118, 38120, 38122, 38124, 38126, 38128, 38130, 38132, 38134, 38136, 38138, 38140, 38142, 38144, 38146, 38148, 38150, 38152, 38154, 38156, 38158, 38160, 38162, 38164, 38166, 38168, 38170, 38172, 38174, 38176, 38178, 38180, 38182, 38184, 38186, 38188, 38190, 38192, 38194, 38196, 38198, 38200, 38202, 38204, 38206, 38208, 38210, 38212, 38214, 38216, 38218, 38220, 38222, 38224, 38226, 38228, 38230, 38232, 38234, 38236, 38238, 38240, 38242, 38244, 38246, 38248, 38250, 38252, 38254, 38256, 38258, 38260, 38262, 38264, 38266, 38268, 38270, 38272, 38274, 38276, 38278, 38280, 38282, 38284, 38286, 38288, 38290, 38292, 38294, 38296, 38298, 38300, 38302, 38304, 38307, 38310, 38313, 38315, 38317, 38319, 38321, 38323, 38325, 38327, 38329, 38331, 38333, 38335, 38337, 38339, 38341, 38343, 38345, 38347, 38349, 38351, 38353, 38355, 38357, 38359, 38361, 38363, 38365, 38367, 38369, 38371, 38373, 38375, 38377, 38379, 38381, 38383, 38385, 38387, 38389, 38391, 38393, 38395, 38397, 38399, 38401, 38403, 38405, 38407, 38409, 38411, 38413, 38415, 38417, 38419, 38421, 38423, 38425, 38427, 38429, 38431, 38433, 38435, 38437, 38439, 38441, 38443, 38445, 38447, 38449, 38451, 38453, 38455, 38457, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 38459, 38462, 38465, 38468, 38471, 38474, 38477, 38480, 38483, 38486, 38489, 38492, 38495, 38498, 38501, 38504, 38507, 38510, 38513, 38516, 38519, 38522, 38525, 38528, 38531, 38534, 38537, 38540, 38543, 38546, 38549, 38552, 38555, 38558, 38561, 38564, 38567, 38570, 38573, 38576, 38579, 38582, 38585, 38588, 38591, 38594, 38597, 38600, 38603, 38606, 38609, 38612, 38615, 38618, 38621, 38624, 38627, 38630, 38633, 38636, 38639, 38642, 38645, 38648, -1, -1, 38651, 38654, 38657, 38660, 38663, 38666, 38669, 38672, 38675, 38678, 38681, 38684, 38687, 38690, 38693, 38696, 38699, 38702, 38705, 38708, 38711, 38714, 38717, 38720, 38723, 38726, 38729, 38732, 38735, 38738, 38741, 38744, 38747, 38750, 38753, 38756, 38759, 38762, 38765, 38768, 38771, 38774, 38777, 38780, 38783, 38786, 38789, 38792, 38795, 38798, 38801, 38804, 38807, 38810, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 38813, 38816, 38819, 38823, 38827, 38831, 38835, 38839, 38843, 38847, 38850, 38868, 38876, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 38880, 38881, 38882, 38883, 38884, 38885, 38886, 38887, 38888, 38889, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 38890, 38891, 38892, 38893, 38894, 38895, 38896, 38897, 38898, 38899, 38900, 38901, 38902, 38903, 38904, 38905, 38906, 38907, 38908, 38909, 38910, -1, -1, 38911, 38912, 38913, 38914, 38915, 38916, 38917, 38918, 38919, 38920, 38921, 38922, -1, 38923, 38924, 38925, 38926, 38927, 38928, 38929, 38930, 38931, 38932, 38933, 38934, 38935, 38936, 38937, 38938, 38939, 38940, 38941, -1, 38942, 38943, 38944, 38945, -1, -1, -1, -1, 38946, 38948, 38950, -1, 38952, -1, 38954, 38956, 38958, 38960, 38962, 38964, 38966, 38968, 38970, 38972, 38974, 38975, 38976, 38977, 38978, 38979, 38980, 38981, 38982, 38983, 38984, 38985, 38986, 38987, 38988, 38989, 38990, 38991, 38992, 38993, 38994, 38995, 38996, 38997, 38998, 38999, 39000, 39001, 39002, 39003, 39004, 39005, 39006, 39007, 39008, 39009, 39010, 39011, 39012, 39013, 39014, 39015, 39016, 39017, 39018, 39019, 39020, 39021, 39022, 39023, 39024, 39025, 39026, 39027, 39028, 39029, 39030, 39031, 39032, 39033, 39034, 39035, 39036, 39037, 39038, 39039, 39040, 39041, 39042, 39043, 39044, 39045, 39046, 39047, 39048, 39049, 39050, 39051, 39052, 39053, 39054, 39055, 39056, 39057, 39058, 39059, 39060, 39061, 39062, 39063, 39064, 39065, 39066, 39067, 39068, 39069, 39070, 39071, 39072, 39073, 39074, 39075, 39076, 39077, 39078, 39079, 39080, 39081, 39082, 39083, 39084, 39085, 39086, 39087, 39088, 39089, 39090, 39091, 39093, 39095, 39097, 39099, 39101, 39103, 39105, -1, -1, -1, -1, 39107, 39108, 39109, 39110, 39111, 39112, 39113, 39114, 39115, 39116, 39117, 39118, 39119, 39120, 39121, 39122, 39123, 39124, 39125, 39126, 39127, 39128, 39129, 39130, 39131, 39132, 39133, 39134, 39135, 39136, 39137, 39138, 39139, 39140, 39141, 39142, 39143, 39144, 39145, 39146, 39147, 39148, 39149, 39150, 39151, 39152, 39153, 39154, 39155, 39156, 39157, 39158, 39159, 39160, 39161, 39162, 39163, 39164, 39165, 39166, 39167, 39168, 39169, 39170, 39171, 39172, 39173, 39174, 39175, 39176, 39177, 39178, 39179, 39180, 39181, 39182, 39183, 39184, 39185, 39186, 39187, 39188, 39189, 39190, 39191, 39192, 39193, 39194, 39195, 39196, 39197, 39198, 39199, 39200, 39201, 39202, 39203, 39204, 39205, 39206, 39207, 39208, 39209, 39210, 39211, 39212, 39213, 39214, 39215, 39216, 39217, 39218, 39219, 39220, 39221, 39222, 39223, 39224, 39225, 39226, 39227, 39228, 39229, 39230, 39231, 39232, 39233, 39234, 39235, 39236, 39237, 39238, 39239, 39240, 39241, 39242, 39243, 39244, 39245, 39246, 39247, 39248, 39249, 39250, 39251, 39252, 39253, 39254, 39255, 39256, 39257, 39258, 39259, 39260, 39261, 39262, 39263, 39264, 39265, 39266, 39267, 39268, 39269, 39270, 39271, 39272, 39273, 39274, 39275, 39276, 39277, 39278, 39279, 39280, 39281, 39282, 39283, 39284, 39285, 39286, 39287, 39288, 39289, 39290, 39291, 39292, 39293, 39294, 39295, 39296, -1, -1, -1, 39297, 39298, 39299, 39300, 39301, 39302, -1, -1, 39303, 39304, 39305, 39306, 39307, 39308, -1, -1, 39309, 39310, 39311, 39312, 39313, 39314, -1, -1, 39315, 39316, 39317, -1, -1, -1, 39318, 39319, 39320, 39321, 39322, 39323, 39324, -1, 39325, 39326, 39327, 39328, 39329, 39330, 39331, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 6564, -1, 6566, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 6568, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 6570, 6572, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 6574, 6576, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 6578, 6580, -1, 6582, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 6584, 6586, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 6588, 6590, 6592, 6594, 6596, 6598, 6600, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 6602, 6604, 6606, 6608, 6610, 6612, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 39382, 39383, 39384, 39385, 39386, 39387, 39388, 39389, 39390, 39391, 39392, 39393, 39394, 39395, 39396, 39397, 39398, 39399, 39400, 39401, 39402, 39403, 39404, 39405, 39406, 39407, 39408, 39409, 39410, 39411, 39412, 39413, 39414, 39415, 39416, 39417, 39418, 39419, 39420, 39421, 39422, 39423, 39424, 39425, 39426, 39427, 39428, 39429, 39430, 39431, 39432, 39433, 39434, 39435, 39436, 39437, 39438, 39439, 39440, 39441, 39442, 39443, 39444, 39445, 39446, 39447, 39448, 39449, 39450, 39451, 39452, 39453, 39454, 39455, 39456, 39457, 39458, 39459, 39460, 39461, 39462, 39463, 39464, 39465, 39466, -1, 39467, 39468, 39469, 39470, 39471, 39472, 39473, 39474, 39475, 39476, 39477, 39478, 39479, 39480, 39481, 39482, 39483, 39484, 39485, 39486, 39487, 39488, 39489, 39490, 39491, 39492, 39493, 39494, 39495, 39496, 39497, 39498, 39499, 39500, 39501, 39502, 39503, 39504, 39505, 39506, 39507, 39508, 39509, 39510, 39511, 39512, 39513, 39514, 39515, 39516, 39517, 39518, 39519, 39520, 39521, 39522, 39523, 39524, 39525, 39526, 39527, 39528, 39529, 39530, 39531, 39532, 39533, 39534, 39535, 39536, 39537, -1, 39538, 39539, -1, -1, 39540, -1, -1, 39541, 39542, -1, -1, 39543, 39544, 39545, 39546, -1, 39547, 39548, 39549, 39550, 39551, 39552, 39553, 39554, 39555, 39556, 39557, 39558, -1, 39559, -1, 39560, 39561, 39562, 39563, 39564, 39565, 39566, -1, 39567, 39568, 39569, 39570, 39571, 39572, 39573, 39574, 39575, 39576, 39577, 39578, 39579, 39580, 39581, 39582, 39583, 39584, 39585, 39586, 39587, 39588, 39589, 39590, 39591, 39592, 39593, 39594, 39595, 39596, 39597, 39598, 39599, 39600, 39601, 39602, 39603, 39604, 39605, 39606, 39607, 39608, 39609, 39610, 39611, 39612, 39613, 39614, 39615, 39616, 39617, 39618, 39619, 39620, 39621, 39622, 39623, 39624, 39625, 39626, 39627, 39628, 39629, 39630, 39631, -1, 39632, 39633, 39634, 39635, -1, -1, 39636, 39637, 39638, 39639, 39640, 39641, 39642, 39643, -1, 39644, 39645, 39646, 39647, 39648, 39649, 39650, -1, 39651, 39652, 39653, 39654, 39655, 39656, 39657, 39658, 39659, 39660, 39661, 39662, 39663, 39664, 39665, 39666, 39667, 39668, 39669, 39670, 39671, 39672, 39673, 39674, 39675, 39676, 39677, 39678, -1, 39679, 39680, 39681, 39682, -1, 39683, 39684, 39685, 39686, 39687, -1, 39688, -1, -1, -1, 39689, 39690, 39691, 39692, 39693, 39694, 39695, -1, 39696, 39697, 39698, 39699, 39700, 39701, 39702, 39703, 39704, 39705, 39706, 39707, 39708, 39709, 39710, 39711, 39712, 39713, 39714, 39715, 39716, 39717, 39718, 39719, 39720, 39721, 39722, 39723, 39724, 39725, 39726, 39727, 39728, 39729, 39730, 39731, 39732, 39733, 39734, 39735, 39736, 39737, 39738, 39739, 39740, 39741, 39742, 39743, 39744, 39745, 39746, 39747, 39748, 39749, 39750, 39751, 39752, 39753, 39754, 39755, 39756, 39757, 39758, 39759, 39760, 39761, 39762, 39763, 39764, 39765, 39766, 39767, 39768, 39769, 39770, 39771, 39772, 39773, 39774, 39775, 39776, 39777, 39778, 39779, 39780, 39781, 39782, 39783, 39784, 39785, 39786, 39787, 39788, 39789, 39790, 39791, 39792, 39793, 39794, 39795, 39796, 39797, 39798, 39799, 39800, 39801, 39802, 39803, 39804, 39805, 39806, 39807, 39808, 39809, 39810, 39811, 39812, 39813, 39814, 39815, 39816, 39817, 39818, 39819, 39820, 39821, 39822, 39823, 39824, 39825, 39826, 39827, 39828, 39829, 39830, 39831, 39832, 39833, 39834, 39835, 39836, 39837, 39838, 39839, 39840, 39841, 39842, 39843, 39844, 39845, 39846, 39847, 39848, 39849, 39850, 39851, 39852, 39853, 39854, 39855, 39856, 39857, 39858, 39859, 39860, 39861, 39862, 39863, 39864, 39865, 39866, 39867, 39868, 39869, 39870, 39871, 39872, 39873, 39874, 39875, 39876, 39877, 39878, 39879, 39880, 39881, 39882, 39883, 39884, 39885, 39886, 39887, 39888, 39889, 39890, 39891, 39892, 39893, 39894, 39895, 39896, 39897, 39898, 39899, 39900, 39901, 39902, 39903, 39904, 39905, 39906, 39907, 39908, 39909, 39910, 39911, 39912, 39913, 39914, 39915, 39916, 39917, 39918, 39919, 39920, 39921, 39922, 39923, 39924, 39925, 39926, 39927, 39928, 39929, 39930, 39931, 39932, 39933, 39934, 39935, 39936, 39937, 39938, 39939, 39940, 39941, 39942, 39943, 39944, 39945, 39946, 39947, 39948, 39949, 39950, 39951, 39952, 39953, 39954, 39955, 39956, 39957, 39958, 39959, 39960, 39961, 39962, 39963, 39964, 39965, 39966, 39967, 39968, 39969, 39970, 39971, 39972, 39973, 39974, 39975, 39976, 39977, 39978, 39979, 39980, 39981, 39982, 39983, 39984, 39985, 39986, 39987, 39988, 39989, 39990, 39991, 39992, 39993, 39994, 39995, 39996, 39997, 39998, 39999, 40000, 40001, 40002, 40003, 40004, 40005, 40006, 40007, 40008, 40009, 40010, 40011, 40012, 40013, 40014, 40015, 40016, 40017, 40018, 40019, 40020, 40021, 40022, 40023, 40024, 40025, 40026, 40027, 40028, 40029, 40030, 40031, 40032, 40033, 40034, 40035, -1, -1, 40036, 40037, 40038, 40039, 40040, 40041, 40042, 40043, 40044, 40045, 40046, 40047, 40048, 40049, 40050, 40051, 40052, 40053, 40054, 40055, 40056, 40057, 40058, 40059, 40060, 40061, 40062, 40063, 40064, 40065, 40066, 40067, 40068, 40069, 40070, 40071, 40072, 40073, 40074, 40075, 40076, 40077, 40078, 40079, 40080, 40081, 40082, 40083, 40084, 40085, 40086, 40087, 40088, 40089, 40090, 40091, 40092, 40093, 40094, 40095, 40096, 40097, 40098, 40099, 40100, 40101, 40102, 40103, 40104, 40105, 40106, 40107, 40108, 40109, 40110, 40111, 40112, 40113, 40114, 40115, 40116, 40117, 40118, 40119, 40120, 40121, 40122, 40123, 40124, 40125, 40126, 40127, 40128, 40129, 40130, 40131, 40132, 40133, 40134, 40135, 40136, 40137, 40138, 40139, 40140, 40141, 40142, 40143, 40144, 40145, 40146, 40147, 40148, 40149, 40150, 40151, 40152, 40153, 40154, 40155, 40156, 40157, 40158, 40159, 40160, 40161, 40162, 40163, 40164, 40165, 40166, 40167, 40168, 40169, 40170, 40171, 40172, 40173, 40174, 40175, 40176, 40177, 40178, 40179, 40180, 40181, 40182, 40183, 40184, 40185, 40186, 40187, 40188, 40189, 40190, 40191, 40192, 40193, 40194, 40195, 40196, 40197, 40198, 40199, 40200, 40201, 40202, 40203, 40204, 40205, 40206, 40207, 40208, 40209, 40210, 40211, 40212, 40213, 40214, 40215, 40216, 40217, 40218, 40219, 40220, 40221, 40222, 40223, 40224, 40225, 40226, 40227, 40228, 40229, 40230, 40231, 40232, 40233, 40234, 40235, 40236, 40237, 40238, 40239, 40240, 40241, 40242, 40243, 40244, 40245, 40246, 40247, 40248, 40249, 40250, 40251, 40252, 40253, 40254, 40255, 40256, 40257, 40258, 40259, 40260, 40261, 40262, 40263, 40264, 40265, 40266, 40267, 40268, 40269, 40270, 40271, 40272, 40273, 40274, 40275, 40276, 40277, 40278, 40279, 40280, 40281, 40282, 40283, 40284, 40285, 40286, 40287, 40288, 40289, 40290, 40291, 40292, 40293, 40294, 40295, 40296, 40297, 40298, 40299, 40300, 40301, 40302, 40303, 40304, 40305, 40306, 40307, 40308, 40309, 40310, 40311, 40312, 40313, 40314, 40315, 40316, 40317, 40318, 40319, 40320, 40321, 40322, 40323, 40324, 40325, 40326, 40327, -1, -1, 40328, 40329, 40330, 40331, 40332, 40333, 40334, 40335, 40336, 40337, 40338, 40339, 40340, 40341, 40342, 40343, 40344, 40345, 40346, 40347, 40348, 40349, 40350, 40351, 40352, 40353, 40354, 40355, 40356, 40357, 40358, 40359, 40360, 40361, 40362, 40363, 40364, 40365, 40366, 40367, 40368, 40369, 40370, 40371, 40372, 40373, 40374, 40375, 40376, 40377, 40378, 40379, 40380, 40381, -1, 40382, 40383, 40384, 40385, 40386, 40387, 40388, 40389, 40390, 40391, 40392, 40393, 40394, 40395, 40396, 40397, 40398, 40399, 40400, 40401, 40402, 40403, 40404, 40405, 40406, 40407, 40408, -1, 40409, 40410, -1, 40411, -1, -1, 40412, -1, 40413, 40414, 40415, 40416, 40417, 40418, 40419, 40420, 40421, 40422, -1, 40423, 40424, 40425, 40426, -1, 40427, -1, 40428, -1, -1, -1, -1, -1, -1, 40429, -1, -1, -1, -1, 40430, -1, 40431, -1, 40432, -1, 40433, 40434, 40435, -1, 40436, 40437, -1, 40438, -1, -1, 40439, -1, 40440, -1, 40441, -1, 40442, -1, 40443, -1, 40444, 40445, -1, 40446, -1, -1, 40447, 40448, 40449, 40450, -1, 40451, 40452, 40453, 40454, 40455, 40456, 40457, -1, 40458, 40459, 40460, 40461, -1, 40462, 40463, 40464, 40465, -1, 40466, -1, 40467, 40468, 40469, 40470, 40471, 40472, 40473, 40474, 40475, 40476, -1, 40477, 40478, 40479, 40480, 40481, 40482, 40483, 40484, 40485, 40486, 40487, 40488, 40489, 40490, 40491, 40492, 40493, -1, -1, -1, -1, -1, 40494, 40495, 40496, -1, 40497, 40498, 40499, 40500, 40501, -1, 40502, 40503, 40504, 40505, 40506, 40507, 40508, 40509, 40510, 40511, 40512, 40513, 40514, 40515, 40516, 40517, 40518, -1, -1, -1, -1, 40519, 40521, 40523, 40525, 40527, 40529, 40531, 40533, 40535, 40537, 40539, -1, -1, -1, -1, -1, 40541, 40544, 40547, 40550, 40553, 40556, 40559, 40562, 40565, 40568, 40571, 40574, 40577, 40580, 40583, 40586, 40589, 40592, 40595, 40598, 40601, 40604, 40607, 40610, 40613, 40616, 40619, 40622, 40623, 40624, 40626, -1, 40628, 40629, 40630, 40631, 40632, 40633, 40634, 40635, 40636, 40637, 40638, 40639, 40640, 40641, 40642, 40643, 40644, 40645, 40646, 40647, 40648, 40649, 40650, 40651, 40652, 40653, 40654, 40656, 40658, 40660, 40662, 40665, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 40667, 40669, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 40671, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 40673, 40675, 40677, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 40678, 40679, 40680, 40681, 40682, 40683, 40684, 40685, 40686, 40687, 40688, 40689, 40690, 40691, 40692, 40693, 40694, 40695, 40696, 40697, 40698, 40699, 40700, 40701, 40702, 40703, 40704, 40705, 40706, 40707, 40708, 40709, 40710, 40711, 40712, 40713, 40714, 40715, 40716, 40717, 40718, 40719, 40720, 40721, -1, -1, -1, -1, 40722, 40725, 40728, 40731, 40734, 40737, 40740, 40743, 40746, -1, -1, -1, -1, -1, -1, -1, 40749, 40750, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7983, 7984, 7985, 7986, 7987, 7988, 7989, 7990, 7991, 7992, 7993, 7994, 7995, 7996, 7997, 7998, 7999, 8000, 8001, 8002, 8003, 8004, 8005, 8006, 8007, 8008, 8009, 8010, 8011, 8012, 8013, 8014, 8015, 8016, 8017, 8018, 8019, 8020, 8021, 8022, 8023, 8024, 8025, 8026, 8027, 8028, 8029, 8030, 8031, 8032, 8033, 8034, 8035, 8036, 8037, 8038, 8039, 8040, 8041, 8042, 8043, 8044, 8045, 8046, 8047, 8048, 8049, 8050, 8051, 8052, 8053, 8054, 8055, 8056, 8057, 8058, 8059, 8060, 8061, 8062, 8063, 8064, 8065, 8066, 8067, 8068, 8069, 8070, 8071, 8072, 8073, 8074, 8075, 8076, 8077, 8078, 8079, 8080, 8081, 8082, 8083, 8084, 8085, 8086, 8087, 8088, 8089, 8090, 8091, 8092, 8093, 8094, 8095, 8096, 8097, 8098, 8099, 8100, 8101, 8102, 8103, 8104, 8105, 8106, 8107, 8108, 8109, 8110, 8111, 8112, 8113, 8114, 8115, 8116, 8117, 8118, 8119, 8120, 8121, 8122, 8123, 8124, 8125, 8126, 8127, 8128, 8129, 8130, 8131, 8132, 8133, 8134, 8135, 8136, 8137, 8138, 8139, 8140, 8141, 8142, 8143, 8144, 8145, 8146, 8147, 8148, 8149, 8150, 8151, 8152, 8153, 8154, 8155, 8156, 8157, 8158, 8159, 8160, 8161, 8162, 8163, 8164, 8165, 8166, 8167, 8168, 8169, 8170, 8171, 8172, 8173, 8174, 8175, 8176, 8177, 8178, 8179, 8180, 8181, 8182, 8183, 8184, 8185, 8186, 8187, 8188, 8189, 8190, 8191, 8192, 8193, 8194, 8195, 8196, 8197, 8198, 8199, 8200, 8201, 8202, 8203, 8204, 8205, 8206, 8207, 8208, 8209, 8210, 8211, 8212, 8213, 8214, 8215, 8216, 8217, 8218, 8219, 8220, 8221, 8222, 8223, 8224, 8225, 8226, 8227, 8228, 8229, 8230, 8231, 8232, 8233, 8234, 8235, 8236, 8237, 8238, 8239, 8240, 8241, 8242, 8243, 8244, 8245, 8246, 8247, 8248, 8249, 8250, 8251, 8252, 8253, 8254, 8255, 8256, 8257, 8258, 8259, 8260, 8261, 8262, 8263, 8264, 8265, 8266, 8267, 8268, 8269, 8270, 8271, 8272, 8273, 8274, 8275, 8276, 8277, 8278, 8279, 8280, 8281, 8282, 8283, 8284, 8285, 8286, 8287, 8288, 8289, 8290, 8291, 8292, 8293, 8294, 8295, 8296, 8297, 8298, 8299, 8300, 8301, 8302, 8303, 8304, 8305, 8306, 8307, 8308, 8309, 8310, 8311, 8312, 8313, 8314, 8315, 8316, 8317, 8318, 8319, 8320, 8321, 8322, 8323, 8324, 8325, 8326, 8327, 8328, 8329, 8330, 8331, 8332, 8333, 8334, 8335, 8336, 8337, 8338, 8339, 8340, 8341, 8342, 8343, 8344, 8345, 8346, 8347, 8348, 8349, 8350, 8351, 8352, 8353, 8354, 8355, 8356, 8357, 8358, 8359, 8360, 8361, 8362, 8363, 8364, 8365, 8366, 8367, 8368, 8369, 8370, 8371, 8372, 8373, 8374, 8375, 8376, 8377, 8378, 8379, 8380, 8381, 8382, 8383, 8384, 8385, 8386, 8387, 8388, 8389, 8390, 8391, 8392, 8393, 8394, 8395, 8396, 8397, 8398, 8399, 8400, 8401, 8402, 8403, 8404, 8405, 8406, 8407, 8408, 8409, 8410, 8411, 8412, 8413, 8414, 8415, 8416, 8417, 8418, 8419, 8420, 8421, 8422, 8423, 8424, 8425, 8426, 8427, 8428, 8429, 8430, 8431, 8432, 8433, 8434, 8435, 8436, 8437, 8438, 8439, 8440, 8441, 8442, 8443, 8444, 8445, 8446, 8447, 8448, 8449, 8450, 8451, 8452, 8453, 8454, 8455, 8456, 8457, 8458, 8459, 8460, 8461, 8462, 8463, 8464, 8465, 8466, 8467, 8468, 8469, 8470, 8471, 8472, 8473, 8474, 8475, 8476, 8477, 8478, 8479, 8480, 8481, 8482, 8483, 8484, 8485, 8486, 8487, 8488, 8489, 8490, 8491, 8492, 8493, 8494, 8495, 8496, 8497, 8498, 8499, 8500, 8501, 8502, 8503, 8504, 8505, 8506, 8507, 8508, 8509, 8510, 8511, 8512, 8513, 8514, 8515, 8516, 8517, 8518, 8519, 8520, 8521, 8522, 8523, 8524, -1, -1 } }; pspp-1.4.1/gl/uninorm/decomposition-table1.h0000644000175000017500000000104513723215640020402 0ustar00blpblp00000000000000/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ /* Decomposition of Unicode characters. */ /* Generated automatically by gen-uni-tables.c for Unicode 9.0.0. */ extern const unsigned char gl_uninorm_decomp_chars_table[]; #define decomp_header_0 10 #define decomp_header_1 191 #define decomp_header_2 5 #define decomp_header_3 31 #define decomp_header_4 31 typedef struct { int level1[191]; int level2[23 << 5]; unsigned short level3[277 << 5]; } decomp_index_table_t; extern const decomp_index_table_t gl_uninorm_decomp_index_table; pspp-1.4.1/gl/uninorm/nfkd.c0000644000175000017500000000207213723215640015276 0ustar00blpblp00000000000000/* Unicode Normalization Form KD. Copyright (C) 2009-2020 Free Software Foundation, Inc. Written by Bruno Haible , 2009. 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 3 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, see . */ #include /* Specification. */ #include "uninorm.h" #include "normalize-internal.h" #include "uninorm/decompose-internal.h" const struct unicode_normalization_form uninorm_nfkd = { NF_IS_COMPAT_DECOMPOSING, uc_compat_decomposition, NULL, &uninorm_nfkd }; pspp-1.4.1/gl/uninorm/decomposition.c0000644000175000017500000000610213723215640017226 0ustar00blpblp00000000000000/* Decomposition of Unicode characters. Copyright (C) 2009-2020 Free Software Foundation, Inc. Written by Bruno Haible , 2009. 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 3 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, see . */ #include /* Specification. */ #include "uninorm.h" #include "uninorm/decomposition-table.h" int uc_decomposition (ucs4_t uc, int *decomp_tag, ucs4_t *decomposition) { if (uc >= 0xAC00 && uc < 0xD7A4) { /* Hangul syllable. See Unicode standard, chapter 3, section "Hangul Syllable Decomposition", See also the clarification at , section "Clarification of Hangul Jamo Handling". */ unsigned int t; uc -= 0xAC00; t = uc % 28; *decomp_tag = UC_DECOMP_CANONICAL; if (t == 0) { unsigned int v, l; uc = uc / 28; v = uc % 21; l = uc / 21; decomposition[0] = 0x1100 + l; decomposition[1] = 0x1161 + v; return 2; } else { #if 1 /* Return the pairwise decomposition, not the full decomposition. */ decomposition[0] = 0xAC00 + uc - t; /* = 0xAC00 + (l * 21 + v) * 28; */ decomposition[1] = 0x11A7 + t; return 2; #else unsigned int v, l; uc = uc / 28; v = uc % 21; l = uc / 21; decomposition[0] = 0x1100 + l; decomposition[1] = 0x1161 + v; decomposition[2] = 0x11A7 + t; return 3; #endif } } else if (uc < 0x110000) { unsigned short entry = decomp_index (uc); if (entry != (unsigned short)(-1)) { const unsigned char *p; unsigned int element; unsigned int length; p = &gl_uninorm_decomp_chars_table[3 * (entry & 0x7FFF)]; element = (p[0] << 16) | (p[1] << 8) | p[2]; /* The first element has 5 bits for the decomposition type. */ *decomp_tag = (element >> 18) & 0x1f; length = 1; for (;;) { /* Every element has an 18 bits wide Unicode code point. */ *decomposition = element & 0x3ffff; /* Bit 23 tells whether there are more elements, */ if ((element & (1 << 23)) == 0) break; p += 3; element = (p[0] << 16) | (p[1] << 8) | p[2]; decomposition++; length++; } return length; } } return -1; } pspp-1.4.1/gl/uninorm/decomposition-table.h0000644000175000017500000000345313723215640020326 0ustar00blpblp00000000000000/* Decomposition of Unicode characters. Copyright (C) 2001-2003, 2009-2020 Free Software Foundation, Inc. Written by Bruno Haible , 2009. 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 3 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, see . */ #include "unitypes.h" /* The decomposition table is made of two parts: - A table containing the actual arrays of decomposed equivalents. (This table is separate because the maximum length of a decomposition is 18, much larger than the average length 1.497 of a decomposition). - A 3-level table of indices into this array. */ #include "decomposition-table1.h" static inline unsigned short decomp_index (ucs4_t uc) { unsigned int index1 = uc >> decomp_header_0; if (index1 < decomp_header_1) { int lookup1 = gl_uninorm_decomp_index_table.level1[index1]; if (lookup1 >= 0) { unsigned int index2 = (uc >> decomp_header_2) & decomp_header_3; int lookup2 = gl_uninorm_decomp_index_table.level2[lookup1 + index2]; if (lookup2 >= 0) { unsigned int index3 = uc & decomp_header_4; return gl_uninorm_decomp_index_table.level3[lookup2 + index3]; } } } return (unsigned short)(-1); } pspp-1.4.1/gl/uninorm/decomposing-form.c0000644000175000017500000000174113723215640017626 0ustar00blpblp00000000000000/* Decomposing variant of a normalization form. Copyright (C) 2009-2020 Free Software Foundation, Inc. Written by Bruno Haible , 2009. 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 3 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, see . */ #include /* Specification. */ #include "uninorm.h" #include "normalize-internal.h" uninorm_t uninorm_decomposing_form (uninorm_t nf) { return nf->decomposing_variant; } pspp-1.4.1/gl/uninorm/compat-decomposition.c0000644000175000017500000000202313723215640020505 0ustar00blpblp00000000000000/* Compatibility decomposition of Unicode characters. Copyright (C) 2009-2020 Free Software Foundation, Inc. Written by Bruno Haible , 2009. 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 3 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, see . */ #include /* Specification. */ #include "decompose-internal.h" #include "uninorm.h" int uc_compat_decomposition (ucs4_t uc, ucs4_t *decomposition) { int tag; return uc_decomposition (uc, &tag, decomposition); } pspp-1.4.1/gl/uninorm/u-normalize-internal.h0000644000175000017500000003327613723215640020447 0ustar00blpblp00000000000000/* Decomposition and composition of Unicode strings. Copyright (C) 2009-2020 Free Software Foundation, Inc. Written by Bruno Haible , 2009. 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 3 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, see . */ UNIT * FUNC (uninorm_t nf, const UNIT *s, size_t n, UNIT *resultbuf, size_t *lengthp) { int (*decomposer) (ucs4_t uc, ucs4_t *decomposition) = nf->decomposer; ucs4_t (*composer) (ucs4_t uc1, ucs4_t uc2) = nf->composer; /* The result being accumulated. */ UNIT *result; size_t length; size_t allocated; /* The buffer for sorting. */ #define SORTBUF_PREALLOCATED 64 struct ucs4_with_ccc sortbuf_preallocated[2 * SORTBUF_PREALLOCATED]; struct ucs4_with_ccc *sortbuf; /* array of size 2 * sortbuf_allocated */ size_t sortbuf_allocated; size_t sortbuf_count; /* Initialize the accumulator. */ if (resultbuf == NULL) { result = NULL; allocated = 0; } else { result = resultbuf; allocated = *lengthp; } length = 0; /* Initialize the buffer for sorting. */ sortbuf = sortbuf_preallocated; sortbuf_allocated = SORTBUF_PREALLOCATED; sortbuf_count = 0; { const UNIT *s_end = s + n; for (;;) { int count; ucs4_t decomposed[UC_DECOMPOSITION_MAX_LENGTH]; int decomposed_count; int i; if (s < s_end) { /* Fetch the next character. */ count = U_MBTOUC_UNSAFE (&decomposed[0], s, s_end - s); decomposed_count = 1; /* Decompose it, recursively. It would be possible to precompute the recursive decomposition and store it in a table. But this would significantly increase the size of the decomposition tables, because for example for U+1FC1 the recursive canonical decomposition and the recursive compatibility decomposition are different. */ { int curr; for (curr = 0; curr < decomposed_count; ) { /* Invariant: decomposed[0..curr-1] is fully decomposed, i.e. all elements are atomic. */ ucs4_t curr_decomposed[UC_DECOMPOSITION_MAX_LENGTH]; int curr_decomposed_count; curr_decomposed_count = decomposer (decomposed[curr], curr_decomposed); if (curr_decomposed_count >= 0) { /* Move curr_decomposed[0..curr_decomposed_count-1] over decomposed[curr], making room. It's not worth using memcpy() here, since the counts are so small. */ int shift = curr_decomposed_count - 1; if (shift < 0) abort (); if (shift > 0) { int j; decomposed_count += shift; if (decomposed_count > UC_DECOMPOSITION_MAX_LENGTH) abort (); for (j = decomposed_count - 1 - shift; j > curr; j--) decomposed[j + shift] = decomposed[j]; } for (; shift >= 0; shift--) decomposed[curr + shift] = curr_decomposed[shift]; } else { /* decomposed[curr] is atomic. */ curr++; } } } } else { count = 0; decomposed_count = 0; } i = 0; for (;;) { ucs4_t uc; int ccc; if (s < s_end) { /* Fetch the next character from the decomposition. */ if (i == decomposed_count) break; uc = decomposed[i]; ccc = uc_combining_class (uc); } else { /* End of string reached. */ uc = 0; ccc = 0; } if (ccc == 0) { size_t j; /* Apply the canonical ordering algorithm to the accumulated sequence of characters. */ if (sortbuf_count > 1) gl_uninorm_decompose_merge_sort_inplace (sortbuf, sortbuf_count, sortbuf + sortbuf_count); if (composer != NULL) { /* Attempt to combine decomposed characters, as specified in the Unicode Standard Annex #15 "Unicode Normalization Forms". We need to check 1. whether the first accumulated character is a "starter" (i.e. has ccc = 0). This is usually the case. But when the string starts with a non-starter, the sortbuf also starts with a non-starter. Btw, this check could also be omitted, because the composition table has only entries (code1, code2) for which code1 is a starter; if the first accumulated character is not a starter, no lookup will succeed. 2. If the sortbuf has more than one character, check for each of these characters that are not "blocked" from the starter (i.e. have a ccc that is higher than the ccc of the previous character) whether it can be combined with the first character. 3. If only one character is left in sortbuf, check whether it can be combined with the next character (also a starter). */ if (sortbuf_count > 0 && sortbuf[0].ccc == 0) { for (j = 1; j < sortbuf_count; ) { if (sortbuf[j].ccc > sortbuf[j - 1].ccc) { ucs4_t combined = composer (sortbuf[0].code, sortbuf[j].code); if (combined) { size_t k; sortbuf[0].code = combined; /* sortbuf[0].ccc = 0, still valid. */ for (k = j + 1; k < sortbuf_count; k++) sortbuf[k - 1] = sortbuf[k]; sortbuf_count--; continue; } } j++; } if (s < s_end && sortbuf_count == 1) { ucs4_t combined = composer (sortbuf[0].code, uc); if (combined) { uc = combined; ccc = 0; /* uc could be further combined with subsequent characters. So don't put it into sortbuf[0] in this round, only in the next round. */ sortbuf_count = 0; } } } } for (j = 0; j < sortbuf_count; j++) { ucs4_t muc = sortbuf[j].code; /* Append muc to the result accumulator. */ if (length < allocated) { int ret = U_UCTOMB (result + length, muc, allocated - length); if (ret == -1) { errno = EINVAL; goto fail; } if (ret >= 0) { length += ret; goto done_appending; } } { size_t old_allocated = allocated; size_t new_allocated = 2 * old_allocated; if (new_allocated < 64) new_allocated = 64; if (new_allocated < old_allocated) /* integer overflow? */ abort (); { UNIT *larger_result; if (result == NULL) { larger_result = (UNIT *) malloc (new_allocated * sizeof (UNIT)); if (larger_result == NULL) { errno = ENOMEM; goto fail; } } else if (result == resultbuf) { larger_result = (UNIT *) malloc (new_allocated * sizeof (UNIT)); if (larger_result == NULL) { errno = ENOMEM; goto fail; } U_CPY (larger_result, resultbuf, length); } else { larger_result = (UNIT *) realloc (result, new_allocated * sizeof (UNIT)); if (larger_result == NULL) { errno = ENOMEM; goto fail; } } result = larger_result; allocated = new_allocated; { int ret = U_UCTOMB (result + length, muc, allocated - length); if (ret == -1) { errno = EINVAL; goto fail; } if (ret < 0) abort (); length += ret; goto done_appending; } } } done_appending: ; } /* sortbuf is now empty. */ sortbuf_count = 0; } if (!(s < s_end)) /* End of string reached. */ break; /* Append (uc, ccc) to sortbuf. */ if (sortbuf_count == sortbuf_allocated) { struct ucs4_with_ccc *new_sortbuf; sortbuf_allocated = 2 * sortbuf_allocated; if (sortbuf_allocated < sortbuf_count) /* integer overflow? */ abort (); new_sortbuf = (struct ucs4_with_ccc *) malloc (2 * sortbuf_allocated * sizeof (struct ucs4_with_ccc)); if (new_sortbuf == NULL) { errno = ENOMEM; goto fail; } memcpy (new_sortbuf, sortbuf, sortbuf_count * sizeof (struct ucs4_with_ccc)); if (sortbuf != sortbuf_preallocated) free (sortbuf); sortbuf = new_sortbuf; } sortbuf[sortbuf_count].code = uc; sortbuf[sortbuf_count].ccc = ccc; sortbuf_count++; i++; } if (!(s < s_end)) /* End of string reached. */ break; s += count; } } if (length == 0) { if (result == NULL) { /* Return a non-NULL value. NULL means error. */ result = (UNIT *) malloc (1); if (result == NULL) { errno = ENOMEM; goto fail; } } } else if (result != resultbuf && length < allocated) { /* Shrink the allocated memory if possible. */ UNIT *memory; memory = (UNIT *) realloc (result, length * sizeof (UNIT)); if (memory != NULL) result = memory; } if (sortbuf_count > 0) abort (); if (sortbuf != sortbuf_preallocated) free (sortbuf); *lengthp = length; return result; fail: { int saved_errno = errno; if (sortbuf != sortbuf_preallocated) free (sortbuf); if (result != resultbuf) free (result); errno = saved_errno; } return NULL; } pspp-1.4.1/gl/uninorm/decompose-internal.h0000644000175000017500000000252413723215640020153 0ustar00blpblp00000000000000/* Decomposition of Unicode strings. Copyright (C) 2009-2020 Free Software Foundation, Inc. Written by Bruno Haible , 2009. 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 3 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, see . */ #include #include "unitypes.h" /* Variant of uc_decomposition that does not produce the 'tag'. */ extern int uc_compat_decomposition (ucs4_t uc, ucs4_t *decomposition); /* A Unicode character together with its canonical combining class. */ struct ucs4_with_ccc { ucs4_t code; int ccc; /* range 0..255 */ }; /* Stable-sort an array of 'struct ucs4_with_ccc'. */ extern void gl_uninorm_decompose_merge_sort_inplace (struct ucs4_with_ccc *src, size_t n, struct ucs4_with_ccc *tmp); pspp-1.4.1/gl/uninorm/normalize-internal.h0000644000175000017500000000267113723215640020200 0ustar00blpblp00000000000000/* Normalization of Unicode strings. Copyright (C) 2009-2020 Free Software Foundation, Inc. Written by Bruno Haible , 2009. 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 3 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, see . */ #include "unitypes.h" /* Complete definition of normalization form descriptor. */ struct unicode_normalization_form { /* Bit mask containing meta-information. This must be the first field. */ unsigned int description; #define NF_IS_COMPAT_DECOMPOSING (1 << 0) #define NF_IS_COMPOSING (1 << 1) /* Function that decomposes a Unicode character. */ int (*decomposer) (ucs4_t uc, ucs4_t *decomposition); /* Function that combines two Unicode characters, a starter and another character. */ ucs4_t (*composer) (ucs4_t uc1, ucs4_t uc2); /* Decomposing variant. */ const struct unicode_normalization_form *decomposing_variant; }; pspp-1.4.1/gl/uninorm/decompose-internal.c0000644000175000017500000000220513723215640020142 0ustar00blpblp00000000000000/* Decomposition of Unicode strings. Copyright (C) 2009-2020 Free Software Foundation, Inc. Written by Bruno Haible , 2009. 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 3 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, see . */ #include /* Specification. */ #include "decompose-internal.h" #define ELEMENT struct ucs4_with_ccc #define COMPARE(a,b) ((a)->ccc - (b)->ccc) #define STATIC #define STATIC_FROMTO static #define merge_sort_fromto gl_uninorm_decompose_merge_sort_fromto #define merge_sort_inplace gl_uninorm_decompose_merge_sort_inplace #include "array-mergesort.h" pspp-1.4.1/gl/uninorm/nfd.c0000644000175000017500000000177313723215640015132 0ustar00blpblp00000000000000/* Unicode Normalization Form D. Copyright (C) 2009-2020 Free Software Foundation, Inc. Written by Bruno Haible , 2009. 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 3 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, see . */ #include /* Specification. */ #include "uninorm.h" #include "normalize-internal.h" const struct unicode_normalization_form uninorm_nfd = { 0, uc_canonical_decomposition, NULL, &uninorm_nfd }; pspp-1.4.1/gl/uninorm/decomposition-table.c0000644000175000017500000000163613723215640020322 0ustar00blpblp00000000000000/* Decomposition of Unicode characters. Copyright (C) 2009-2020 Free Software Foundation, Inc. Written by Bruno Haible , 2009. 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 3 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, see . */ #include /* Specification. */ #include "uninorm/decomposition-table.h" #include "uninorm/decomposition-table2.h" pspp-1.4.1/gl/uninorm/u8-normalize.c0000644000175000017500000000231013723215640016701 0ustar00blpblp00000000000000/* Normalization of UTF-8 strings. Copyright (C) 2009-2020 Free Software Foundation, Inc. Written by Bruno Haible , 2009. 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 3 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, see . */ #include /* Specification. */ #include "uninorm.h" #include #include #include #include #include "unistr.h" #include "unictype.h" #include "normalize-internal.h" #include "uninorm/decompose-internal.h" #define FUNC u8_normalize #define UNIT uint8_t #define U_MBTOUC_UNSAFE u8_mbtouc_unsafe #define U_UCTOMB u8_uctomb #define U_CPY u8_cpy #include "u-normalize-internal.h" pspp-1.4.1/gl/uninorm/canonical-decomposition.c0000644000175000017500000000635013723215640021160 0ustar00blpblp00000000000000/* Canonical decomposition of Unicode characters. Copyright (C) 2009-2020 Free Software Foundation, Inc. Written by Bruno Haible , 2009. 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 3 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, see . */ #include /* Specification. */ #include "uninorm.h" #include #include "uninorm/decomposition-table.h" int uc_canonical_decomposition (ucs4_t uc, ucs4_t *decomposition) { if (uc >= 0xAC00 && uc < 0xD7A4) { /* Hangul syllable. See Unicode standard, chapter 3, section "Hangul Syllable Decomposition", See also the clarification at , section "Clarification of Hangul Jamo Handling". */ unsigned int t; uc -= 0xAC00; t = uc % 28; if (t == 0) { unsigned int v, l; uc = uc / 28; v = uc % 21; l = uc / 21; decomposition[0] = 0x1100 + l; decomposition[1] = 0x1161 + v; return 2; } else { #if 1 /* Return the pairwise decomposition, not the full decomposition. */ decomposition[0] = 0xAC00 + uc - t; /* = 0xAC00 + (l * 21 + v) * 28; */ decomposition[1] = 0x11A7 + t; return 2; #else unsigned int v, l; uc = uc / 28; v = uc % 21; l = uc / 21; decomposition[0] = 0x1100 + l; decomposition[1] = 0x1161 + v; decomposition[2] = 0x11A7 + t; return 3; #endif } } else if (uc < 0x110000) { unsigned short entry = decomp_index (uc); /* An entry of (unsigned short)(-1) denotes an absent entry. Otherwise, bit 15 of the entry tells whether the decomposition is a canonical one. */ if (entry < 0x8000) { const unsigned char *p; unsigned int element; unsigned int length; p = &gl_uninorm_decomp_chars_table[3 * entry]; element = (p[0] << 16) | (p[1] << 8) | p[2]; /* The first element has 5 bits for the decomposition type. */ if (((element >> 18) & 0x1f) != UC_DECOMP_CANONICAL) abort (); length = 1; for (;;) { /* Every element has an 18 bits wide Unicode code point. */ *decomposition = element & 0x3ffff; /* Bit 23 tells whether there are more elements, */ if ((element & (1 << 23)) == 0) break; p += 3; element = (p[0] << 16) | (p[1] << 8) | p[2]; decomposition++; length++; } return length; } } return -1; } pspp-1.4.1/gl/intprops.h0000644000175000017500000006416013723215637014564 0ustar00blpblp00000000000000/* intprops.h -- properties of integer types Copyright (C) 2001-2020 Free Software Foundation, Inc. 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 3 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, see . */ /* Written by Paul Eggert. */ #ifndef _GL_INTPROPS_H #define _GL_INTPROPS_H #include /* Return a value with the common real type of E and V and the value of V. Do not evaluate E. */ #define _GL_INT_CONVERT(e, v) ((1 ? 0 : (e)) + (v)) /* Act like _GL_INT_CONVERT (E, -V) but work around a bug in IRIX 6.5 cc; see . */ #define _GL_INT_NEGATE_CONVERT(e, v) ((1 ? 0 : (e)) - (v)) /* The extra casts in the following macros work around compiler bugs, e.g., in Cray C 5.0.3.0. */ /* True if the arithmetic type T is an integer type. bool counts as an integer. */ #define TYPE_IS_INTEGER(t) ((t) 1.5 == 1) /* True if the real type T is signed. */ #define TYPE_SIGNED(t) (! ((t) 0 < (t) -1)) /* Return 1 if the real expression E, after promotion, has a signed or floating type. Do not evaluate E. */ #define EXPR_SIGNED(e) (_GL_INT_NEGATE_CONVERT (e, 1) < 0) /* Minimum and maximum values for integer types and expressions. */ /* The width in bits of the integer type or expression T. Do not evaluate T. Padding bits are not supported; this is checked at compile-time below. */ #define TYPE_WIDTH(t) (sizeof (t) * CHAR_BIT) /* The maximum and minimum values for the integer type T. */ #define TYPE_MINIMUM(t) ((t) ~ TYPE_MAXIMUM (t)) #define TYPE_MAXIMUM(t) \ ((t) (! TYPE_SIGNED (t) \ ? (t) -1 \ : ((((t) 1 << (TYPE_WIDTH (t) - 2)) - 1) * 2 + 1))) /* The maximum and minimum values for the type of the expression E, after integer promotion. E is not evaluated. */ #define _GL_INT_MINIMUM(e) \ (EXPR_SIGNED (e) \ ? ~ _GL_SIGNED_INT_MAXIMUM (e) \ : _GL_INT_CONVERT (e, 0)) #define _GL_INT_MAXIMUM(e) \ (EXPR_SIGNED (e) \ ? _GL_SIGNED_INT_MAXIMUM (e) \ : _GL_INT_NEGATE_CONVERT (e, 1)) #define _GL_SIGNED_INT_MAXIMUM(e) \ (((_GL_INT_CONVERT (e, 1) << (TYPE_WIDTH ((e) + 0) - 2)) - 1) * 2 + 1) /* Work around OpenVMS incompatibility with C99. */ #if !defined LLONG_MAX && defined __INT64_MAX # define LLONG_MAX __INT64_MAX # define LLONG_MIN __INT64_MIN #endif /* This include file assumes that signed types are two's complement without padding bits; the above macros have undefined behavior otherwise. If this is a problem for you, please let us know how to fix it for your host. This assumption is tested by the intprops-tests module. */ /* Does the __typeof__ keyword work? This could be done by 'configure', but for now it's easier to do it by hand. */ #if (2 <= __GNUC__ \ || (1210 <= __IBMC__ && defined __IBM__TYPEOF__) \ || (0x5110 <= __SUNPRO_C && !__STDC__)) # define _GL_HAVE___TYPEOF__ 1 #else # define _GL_HAVE___TYPEOF__ 0 #endif /* Return 1 if the integer type or expression T might be signed. Return 0 if it is definitely unsigned. This macro does not evaluate its argument, and expands to an integer constant expression. */ #if _GL_HAVE___TYPEOF__ # define _GL_SIGNED_TYPE_OR_EXPR(t) TYPE_SIGNED (__typeof__ (t)) #else # define _GL_SIGNED_TYPE_OR_EXPR(t) 1 #endif /* Bound on length of the string representing an unsigned integer value representable in B bits. log10 (2.0) < 146/485. The smallest value of B where this bound is not tight is 2621. */ #define INT_BITS_STRLEN_BOUND(b) (((b) * 146 + 484) / 485) /* Bound on length of the string representing an integer type or expression T. Subtract 1 for the sign bit if T is signed, and then add 1 more for a minus sign if needed. Because _GL_SIGNED_TYPE_OR_EXPR sometimes returns 1 when its argument is unsigned, this macro may overestimate the true bound by one byte when applied to unsigned types of size 2, 4, 16, ... bytes. */ #define INT_STRLEN_BOUND(t) \ (INT_BITS_STRLEN_BOUND (TYPE_WIDTH (t) - _GL_SIGNED_TYPE_OR_EXPR (t)) \ + _GL_SIGNED_TYPE_OR_EXPR (t)) /* Bound on buffer size needed to represent an integer type or expression T, including the terminating null. */ #define INT_BUFSIZE_BOUND(t) (INT_STRLEN_BOUND (t) + 1) /* Range overflow checks. The INT__RANGE_OVERFLOW macros return 1 if the corresponding C operators might not yield numerically correct answers due to arithmetic overflow. They do not rely on undefined or implementation-defined behavior. Their implementations are simple and straightforward, but they are a bit harder to use than the INT__OVERFLOW macros described below. Example usage: long int i = ...; long int j = ...; if (INT_MULTIPLY_RANGE_OVERFLOW (i, j, LONG_MIN, LONG_MAX)) printf ("multiply would overflow"); else printf ("product is %ld", i * j); Restrictions on *_RANGE_OVERFLOW macros: These macros do not check for all possible numerical problems or undefined or unspecified behavior: they do not check for division by zero, for bad shift counts, or for shifting negative numbers. These macros may evaluate their arguments zero or multiple times, so the arguments should not have side effects. The arithmetic arguments (including the MIN and MAX arguments) must be of the same integer type after the usual arithmetic conversions, and the type must have minimum value MIN and maximum MAX. Unsigned types should use a zero MIN of the proper type. These macros are tuned for constant MIN and MAX. For commutative operations such as A + B, they are also tuned for constant B. */ /* Return 1 if A + B would overflow in [MIN,MAX] arithmetic. See above for restrictions. */ #define INT_ADD_RANGE_OVERFLOW(a, b, min, max) \ ((b) < 0 \ ? (a) < (min) - (b) \ : (max) - (b) < (a)) /* Return 1 if A - B would overflow in [MIN,MAX] arithmetic. See above for restrictions. */ #define INT_SUBTRACT_RANGE_OVERFLOW(a, b, min, max) \ ((b) < 0 \ ? (max) + (b) < (a) \ : (a) < (min) + (b)) /* Return 1 if - A would overflow in [MIN,MAX] arithmetic. See above for restrictions. */ #define INT_NEGATE_RANGE_OVERFLOW(a, min, max) \ ((min) < 0 \ ? (a) < - (max) \ : 0 < (a)) /* Return 1 if A * B would overflow in [MIN,MAX] arithmetic. See above for restrictions. Avoid && and || as they tickle bugs in Sun C 5.11 2010/08/13 and other compilers; see . */ #define INT_MULTIPLY_RANGE_OVERFLOW(a, b, min, max) \ ((b) < 0 \ ? ((a) < 0 \ ? (a) < (max) / (b) \ : (b) == -1 \ ? 0 \ : (min) / (b) < (a)) \ : (b) == 0 \ ? 0 \ : ((a) < 0 \ ? (a) < (min) / (b) \ : (max) / (b) < (a))) /* Return 1 if A / B would overflow in [MIN,MAX] arithmetic. See above for restrictions. Do not check for division by zero. */ #define INT_DIVIDE_RANGE_OVERFLOW(a, b, min, max) \ ((min) < 0 && (b) == -1 && (a) < - (max)) /* Return 1 if A % B would overflow in [MIN,MAX] arithmetic. See above for restrictions. Do not check for division by zero. Mathematically, % should never overflow, but on x86-like hosts INT_MIN % -1 traps, and the C standard permits this, so treat this as an overflow too. */ #define INT_REMAINDER_RANGE_OVERFLOW(a, b, min, max) \ INT_DIVIDE_RANGE_OVERFLOW (a, b, min, max) /* Return 1 if A << B would overflow in [MIN,MAX] arithmetic. See above for restrictions. Here, MIN and MAX are for A only, and B need not be of the same type as the other arguments. The C standard says that behavior is undefined for shifts unless 0 <= B < wordwidth, and that when A is negative then A << B has undefined behavior and A >> B has implementation-defined behavior, but do not check these other restrictions. */ #define INT_LEFT_SHIFT_RANGE_OVERFLOW(a, b, min, max) \ ((a) < 0 \ ? (a) < (min) >> (b) \ : (max) >> (b) < (a)) /* True if __builtin_add_overflow (A, B, P) and __builtin_sub_overflow (A, B, P) work when P is non-null. */ #if 5 <= __GNUC__ && !defined __ICC # define _GL_HAS_BUILTIN_ADD_OVERFLOW 1 #elif defined __has_builtin # define _GL_HAS_BUILTIN_ADD_OVERFLOW __has_builtin (__builtin_add_overflow) #else # define _GL_HAS_BUILTIN_ADD_OVERFLOW 0 #endif /* True if __builtin_mul_overflow (A, B, P) works when P is non-null. */ #ifdef __clang__ /* Work around Clang bug . */ # define _GL_HAS_BUILTIN_MUL_OVERFLOW 0 #else # define _GL_HAS_BUILTIN_MUL_OVERFLOW _GL_HAS_BUILTIN_ADD_OVERFLOW #endif /* True if __builtin_add_overflow_p (A, B, C) works, and similarly for __builtin_mul_overflow_p and __builtin_mul_overflow_p. */ #define _GL_HAS_BUILTIN_OVERFLOW_P (7 <= __GNUC__) /* The _GL*_OVERFLOW macros have the same restrictions as the *_RANGE_OVERFLOW macros, except that they do not assume that operands (e.g., A and B) have the same type as MIN and MAX. Instead, they assume that the result (e.g., A + B) has that type. */ #if _GL_HAS_BUILTIN_OVERFLOW_P # define _GL_ADD_OVERFLOW(a, b, min, max) \ __builtin_add_overflow_p (a, b, (__typeof__ ((a) + (b))) 0) # define _GL_SUBTRACT_OVERFLOW(a, b, min, max) \ __builtin_sub_overflow_p (a, b, (__typeof__ ((a) - (b))) 0) # define _GL_MULTIPLY_OVERFLOW(a, b, min, max) \ __builtin_mul_overflow_p (a, b, (__typeof__ ((a) * (b))) 0) #else # define _GL_ADD_OVERFLOW(a, b, min, max) \ ((min) < 0 ? INT_ADD_RANGE_OVERFLOW (a, b, min, max) \ : (a) < 0 ? (b) <= (a) + (b) \ : (b) < 0 ? (a) <= (a) + (b) \ : (a) + (b) < (b)) # define _GL_SUBTRACT_OVERFLOW(a, b, min, max) \ ((min) < 0 ? INT_SUBTRACT_RANGE_OVERFLOW (a, b, min, max) \ : (a) < 0 ? 1 \ : (b) < 0 ? (a) - (b) <= (a) \ : (a) < (b)) # define _GL_MULTIPLY_OVERFLOW(a, b, min, max) \ (((min) == 0 && (((a) < 0 && 0 < (b)) || ((b) < 0 && 0 < (a)))) \ || INT_MULTIPLY_RANGE_OVERFLOW (a, b, min, max)) #endif #define _GL_DIVIDE_OVERFLOW(a, b, min, max) \ ((min) < 0 ? (b) == _GL_INT_NEGATE_CONVERT (min, 1) && (a) < - (max) \ : (a) < 0 ? (b) <= (a) + (b) - 1 \ : (b) < 0 && (a) + (b) <= (a)) #define _GL_REMAINDER_OVERFLOW(a, b, min, max) \ ((min) < 0 ? (b) == _GL_INT_NEGATE_CONVERT (min, 1) && (a) < - (max) \ : (a) < 0 ? (a) % (b) != ((max) - (b) + 1) % (b) \ : (b) < 0 && ! _GL_UNSIGNED_NEG_MULTIPLE (a, b, max)) /* Return a nonzero value if A is a mathematical multiple of B, where A is unsigned, B is negative, and MAX is the maximum value of A's type. A's type must be the same as (A % B)'s type. Normally (A % -B == 0) suffices, but things get tricky if -B would overflow. */ #define _GL_UNSIGNED_NEG_MULTIPLE(a, b, max) \ (((b) < -_GL_SIGNED_INT_MAXIMUM (b) \ ? (_GL_SIGNED_INT_MAXIMUM (b) == (max) \ ? (a) \ : (a) % (_GL_INT_CONVERT (a, _GL_SIGNED_INT_MAXIMUM (b)) + 1)) \ : (a) % - (b)) \ == 0) /* Check for integer overflow, and report low order bits of answer. The INT__OVERFLOW macros return 1 if the corresponding C operators might not yield numerically correct answers due to arithmetic overflow. The INT__WRAPV macros compute the low-order bits of the sum, difference, and product of two C integers, and return 1 if these low-order bits are not numerically correct. These macros work correctly on all known practical hosts, and do not rely on undefined behavior due to signed arithmetic overflow. Example usage, assuming A and B are long int: if (INT_MULTIPLY_OVERFLOW (a, b)) printf ("result would overflow\n"); else printf ("result is %ld (no overflow)\n", a * b); Example usage with WRAPV flavor: long int result; bool overflow = INT_MULTIPLY_WRAPV (a, b, &result); printf ("result is %ld (%s)\n", result, overflow ? "after overflow" : "no overflow"); Restrictions on these macros: These macros do not check for all possible numerical problems or undefined or unspecified behavior: they do not check for division by zero, for bad shift counts, or for shifting negative numbers. These macros may evaluate their arguments zero or multiple times, so the arguments should not have side effects. The WRAPV macros are not constant expressions. They support only +, binary -, and *. Because the WRAPV macros convert the result, they report overflow in different circumstances than the OVERFLOW macros do. These macros are tuned for their last input argument being a constant. Return 1 if the integer expressions A * B, A - B, -A, A * B, A / B, A % B, and A << B would overflow, respectively. */ #define INT_ADD_OVERFLOW(a, b) \ _GL_BINARY_OP_OVERFLOW (a, b, _GL_ADD_OVERFLOW) #define INT_SUBTRACT_OVERFLOW(a, b) \ _GL_BINARY_OP_OVERFLOW (a, b, _GL_SUBTRACT_OVERFLOW) #if _GL_HAS_BUILTIN_OVERFLOW_P # define INT_NEGATE_OVERFLOW(a) INT_SUBTRACT_OVERFLOW (0, a) #else # define INT_NEGATE_OVERFLOW(a) \ INT_NEGATE_RANGE_OVERFLOW (a, _GL_INT_MINIMUM (a), _GL_INT_MAXIMUM (a)) #endif #define INT_MULTIPLY_OVERFLOW(a, b) \ _GL_BINARY_OP_OVERFLOW (a, b, _GL_MULTIPLY_OVERFLOW) #define INT_DIVIDE_OVERFLOW(a, b) \ _GL_BINARY_OP_OVERFLOW (a, b, _GL_DIVIDE_OVERFLOW) #define INT_REMAINDER_OVERFLOW(a, b) \ _GL_BINARY_OP_OVERFLOW (a, b, _GL_REMAINDER_OVERFLOW) #define INT_LEFT_SHIFT_OVERFLOW(a, b) \ INT_LEFT_SHIFT_RANGE_OVERFLOW (a, b, \ _GL_INT_MINIMUM (a), _GL_INT_MAXIMUM (a)) /* Return 1 if the expression A B would overflow, where OP_RESULT_OVERFLOW (A, B, MIN, MAX) does the actual test, assuming MIN and MAX are the minimum and maximum for the result type. Arguments should be free of side effects. */ #define _GL_BINARY_OP_OVERFLOW(a, b, op_result_overflow) \ op_result_overflow (a, b, \ _GL_INT_MINIMUM (_GL_INT_CONVERT (a, b)), \ _GL_INT_MAXIMUM (_GL_INT_CONVERT (a, b))) /* Store the low-order bits of A + B, A - B, A * B, respectively, into *R. Return 1 if the result overflows. See above for restrictions. */ #if _GL_HAS_BUILTIN_ADD_OVERFLOW # define INT_ADD_WRAPV(a, b, r) __builtin_add_overflow (a, b, r) # define INT_SUBTRACT_WRAPV(a, b, r) __builtin_sub_overflow (a, b, r) #else # define INT_ADD_WRAPV(a, b, r) \ _GL_INT_OP_WRAPV (a, b, r, +, _GL_INT_ADD_RANGE_OVERFLOW) # define INT_SUBTRACT_WRAPV(a, b, r) \ _GL_INT_OP_WRAPV (a, b, r, -, _GL_INT_SUBTRACT_RANGE_OVERFLOW) #endif #if _GL_HAS_BUILTIN_MUL_OVERFLOW # if (9 < __GNUC__ + (3 <= __GNUC_MINOR__) \ || (__GNUC__ == 8 && 4 <= __GNUC_MINOR__)) # define INT_MULTIPLY_WRAPV(a, b, r) __builtin_mul_overflow (a, b, r) # else /* Work around GCC bug 91450. */ # define INT_MULTIPLY_WRAPV(a, b, r) \ ((!_GL_SIGNED_TYPE_OR_EXPR (*(r)) && EXPR_SIGNED (a) && EXPR_SIGNED (b) \ && _GL_INT_MULTIPLY_RANGE_OVERFLOW (a, b, 0, (__typeof__ (*(r))) -1)) \ ? ((void) __builtin_mul_overflow (a, b, r), 1) \ : __builtin_mul_overflow (a, b, r)) # endif #else # define INT_MULTIPLY_WRAPV(a, b, r) \ _GL_INT_OP_WRAPV (a, b, r, *, _GL_INT_MULTIPLY_RANGE_OVERFLOW) #endif /* Nonzero if this compiler has GCC bug 68193 or Clang bug 25390. See: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=68193 https://llvm.org/bugs/show_bug.cgi?id=25390 For now, assume all versions of GCC-like compilers generate bogus warnings for _Generic. This matters only for compilers that lack relevant builtins. */ #if __GNUC__ # define _GL__GENERIC_BOGUS 1 #else # define _GL__GENERIC_BOGUS 0 #endif /* Store the low-order bits of A B into *R, where OP specifies the operation and OVERFLOW the overflow predicate. Return 1 if the result overflows. See above for restrictions. */ #if 201112 <= __STDC_VERSION__ && !_GL__GENERIC_BOGUS # define _GL_INT_OP_WRAPV(a, b, r, op, overflow) \ (_Generic \ (*(r), \ signed char: \ _GL_INT_OP_CALC (a, b, r, op, overflow, unsigned int, \ signed char, SCHAR_MIN, SCHAR_MAX), \ unsigned char: \ _GL_INT_OP_CALC (a, b, r, op, overflow, unsigned int, \ unsigned char, 0, UCHAR_MAX), \ short int: \ _GL_INT_OP_CALC (a, b, r, op, overflow, unsigned int, \ short int, SHRT_MIN, SHRT_MAX), \ unsigned short int: \ _GL_INT_OP_CALC (a, b, r, op, overflow, unsigned int, \ unsigned short int, 0, USHRT_MAX), \ int: \ _GL_INT_OP_CALC (a, b, r, op, overflow, unsigned int, \ int, INT_MIN, INT_MAX), \ unsigned int: \ _GL_INT_OP_CALC (a, b, r, op, overflow, unsigned int, \ unsigned int, 0, UINT_MAX), \ long int: \ _GL_INT_OP_CALC (a, b, r, op, overflow, unsigned long int, \ long int, LONG_MIN, LONG_MAX), \ unsigned long int: \ _GL_INT_OP_CALC (a, b, r, op, overflow, unsigned long int, \ unsigned long int, 0, ULONG_MAX), \ long long int: \ _GL_INT_OP_CALC (a, b, r, op, overflow, unsigned long long int, \ long long int, LLONG_MIN, LLONG_MAX), \ unsigned long long int: \ _GL_INT_OP_CALC (a, b, r, op, overflow, unsigned long long int, \ unsigned long long int, 0, ULLONG_MAX))) #else /* Store the low-order bits of A B into *R, where OP specifies the operation and OVERFLOW the overflow predicate. If *R is signed, its type is ST with bounds SMIN..SMAX; otherwise its type is UT with bounds U..UMAX. ST and UT are narrower than int. Return 1 if the result overflows. See above for restrictions. */ # if _GL_HAVE___TYPEOF__ # define _GL_INT_OP_WRAPV_SMALLISH(a,b,r,op,overflow,st,smin,smax,ut,umax) \ (TYPE_SIGNED (__typeof__ (*(r))) \ ? _GL_INT_OP_CALC (a, b, r, op, overflow, unsigned int, st, smin, smax) \ : _GL_INT_OP_CALC (a, b, r, op, overflow, unsigned int, ut, 0, umax)) # else # define _GL_INT_OP_WRAPV_SMALLISH(a,b,r,op,overflow,st,smin,smax,ut,umax) \ (overflow (a, b, smin, smax) \ ? (overflow (a, b, 0, umax) \ ? (*(r) = _GL_INT_OP_WRAPV_VIA_UNSIGNED (a,b,op,unsigned,st), 1) \ : (*(r) = _GL_INT_OP_WRAPV_VIA_UNSIGNED (a,b,op,unsigned,st)) < 0) \ : (overflow (a, b, 0, umax) \ ? (*(r) = _GL_INT_OP_WRAPV_VIA_UNSIGNED (a,b,op,unsigned,st)) >= 0 \ : (*(r) = _GL_INT_OP_WRAPV_VIA_UNSIGNED (a,b,op,unsigned,st), 0))) # endif # define _GL_INT_OP_WRAPV(a, b, r, op, overflow) \ (sizeof *(r) == sizeof (signed char) \ ? _GL_INT_OP_WRAPV_SMALLISH (a, b, r, op, overflow, \ signed char, SCHAR_MIN, SCHAR_MAX, \ unsigned char, UCHAR_MAX) \ : sizeof *(r) == sizeof (short int) \ ? _GL_INT_OP_WRAPV_SMALLISH (a, b, r, op, overflow, \ short int, SHRT_MIN, SHRT_MAX, \ unsigned short int, USHRT_MAX) \ : sizeof *(r) == sizeof (int) \ ? (EXPR_SIGNED (*(r)) \ ? _GL_INT_OP_CALC (a, b, r, op, overflow, unsigned int, \ int, INT_MIN, INT_MAX) \ : _GL_INT_OP_CALC (a, b, r, op, overflow, unsigned int, \ unsigned int, 0, UINT_MAX)) \ : _GL_INT_OP_WRAPV_LONGISH(a, b, r, op, overflow)) # ifdef LLONG_MAX # define _GL_INT_OP_WRAPV_LONGISH(a, b, r, op, overflow) \ (sizeof *(r) == sizeof (long int) \ ? (EXPR_SIGNED (*(r)) \ ? _GL_INT_OP_CALC (a, b, r, op, overflow, unsigned long int, \ long int, LONG_MIN, LONG_MAX) \ : _GL_INT_OP_CALC (a, b, r, op, overflow, unsigned long int, \ unsigned long int, 0, ULONG_MAX)) \ : (EXPR_SIGNED (*(r)) \ ? _GL_INT_OP_CALC (a, b, r, op, overflow, unsigned long long int, \ long long int, LLONG_MIN, LLONG_MAX) \ : _GL_INT_OP_CALC (a, b, r, op, overflow, unsigned long long int, \ unsigned long long int, 0, ULLONG_MAX))) # else # define _GL_INT_OP_WRAPV_LONGISH(a, b, r, op, overflow) \ (EXPR_SIGNED (*(r)) \ ? _GL_INT_OP_CALC (a, b, r, op, overflow, unsigned long int, \ long int, LONG_MIN, LONG_MAX) \ : _GL_INT_OP_CALC (a, b, r, op, overflow, unsigned long int, \ unsigned long int, 0, ULONG_MAX)) # endif #endif /* Store the low-order bits of A B into *R, where the operation is given by OP. Use the unsigned type UT for calculation to avoid overflow problems. *R's type is T, with extrema TMIN and TMAX. T must be a signed integer type. Return 1 if the result overflows. */ #define _GL_INT_OP_CALC(a, b, r, op, overflow, ut, t, tmin, tmax) \ (overflow (a, b, tmin, tmax) \ ? (*(r) = _GL_INT_OP_WRAPV_VIA_UNSIGNED (a, b, op, ut, t), 1) \ : (*(r) = _GL_INT_OP_WRAPV_VIA_UNSIGNED (a, b, op, ut, t), 0)) /* Return the low-order bits of A B, where the operation is given by OP. Use the unsigned type UT for calculation to avoid undefined behavior on signed integer overflow, and convert the result to type T. UT is at least as wide as T and is no narrower than unsigned int, T is two's complement, and there is no padding or trap representations. Assume that converting UT to T yields the low-order bits, as is done in all known two's-complement C compilers. E.g., see: https://gcc.gnu.org/onlinedocs/gcc/Integers-implementation.html According to the C standard, converting UT to T yields an implementation-defined result or signal for values outside T's range. However, code that works around this theoretical problem runs afoul of a compiler bug in Oracle Studio 12.3 x86. See: https://lists.gnu.org/r/bug-gnulib/2017-04/msg00049.html As the compiler bug is real, don't try to work around the theoretical problem. */ #define _GL_INT_OP_WRAPV_VIA_UNSIGNED(a, b, op, ut, t) \ ((t) ((ut) (a) op (ut) (b))) /* Return true if the numeric values A + B, A - B, A * B fall outside the range TMIN..TMAX. Arguments should be integer expressions without side effects. TMIN should be signed and nonpositive. TMAX should be positive, and should be signed unless TMIN is zero. */ #define _GL_INT_ADD_RANGE_OVERFLOW(a, b, tmin, tmax) \ ((b) < 0 \ ? (((tmin) \ ? ((EXPR_SIGNED (_GL_INT_CONVERT (a, (tmin) - (b))) || (b) < (tmin)) \ && (a) < (tmin) - (b)) \ : (a) <= -1 - (b)) \ || ((EXPR_SIGNED (a) ? 0 <= (a) : (tmax) < (a)) && (tmax) < (a) + (b))) \ : (a) < 0 \ ? (((tmin) \ ? ((EXPR_SIGNED (_GL_INT_CONVERT (b, (tmin) - (a))) || (a) < (tmin)) \ && (b) < (tmin) - (a)) \ : (b) <= -1 - (a)) \ || ((EXPR_SIGNED (_GL_INT_CONVERT (a, b)) || (tmax) < (b)) \ && (tmax) < (a) + (b))) \ : (tmax) < (b) || (tmax) - (b) < (a)) #define _GL_INT_SUBTRACT_RANGE_OVERFLOW(a, b, tmin, tmax) \ (((a) < 0) == ((b) < 0) \ ? ((a) < (b) \ ? !(tmin) || -1 - (tmin) < (b) - (a) - 1 \ : (tmax) < (a) - (b)) \ : (a) < 0 \ ? ((!EXPR_SIGNED (_GL_INT_CONVERT ((a) - (tmin), b)) && (a) - (tmin) < 0) \ || (a) - (tmin) < (b)) \ : ((! (EXPR_SIGNED (_GL_INT_CONVERT (tmax, b)) \ && EXPR_SIGNED (_GL_INT_CONVERT ((tmax) + (b), a))) \ && (tmax) <= -1 - (b)) \ || (tmax) + (b) < (a))) #define _GL_INT_MULTIPLY_RANGE_OVERFLOW(a, b, tmin, tmax) \ ((b) < 0 \ ? ((a) < 0 \ ? (EXPR_SIGNED (_GL_INT_CONVERT (tmax, b)) \ ? (a) < (tmax) / (b) \ : ((INT_NEGATE_OVERFLOW (b) \ ? _GL_INT_CONVERT (b, tmax) >> (TYPE_WIDTH (b) - 1) \ : (tmax) / -(b)) \ <= -1 - (a))) \ : INT_NEGATE_OVERFLOW (_GL_INT_CONVERT (b, tmin)) && (b) == -1 \ ? (EXPR_SIGNED (a) \ ? 0 < (a) + (tmin) \ : 0 < (a) && -1 - (tmin) < (a) - 1) \ : (tmin) / (b) < (a)) \ : (b) == 0 \ ? 0 \ : ((a) < 0 \ ? (INT_NEGATE_OVERFLOW (_GL_INT_CONVERT (a, tmin)) && (a) == -1 \ ? (EXPR_SIGNED (b) ? 0 < (b) + (tmin) : -1 - (tmin) < (b) - 1) \ : (tmin) / (a) < (b)) \ : (tmax) / (b) < (a))) #endif /* _GL_INTPROPS_H */ pspp-1.4.1/gl/windows-spin.h0000644000175000017500000000267213723215640015341 0ustar00blpblp00000000000000/* Spin locks (native Windows implementation). Copyright (C) 2019-2020 Free Software Foundation, Inc. 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 3, 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, see . */ /* Written by Bruno Haible , 2019. */ #ifndef _WINDOWS_SPIN_H #define _WINDOWS_SPIN_H #define WIN32_LEAN_AND_MEAN /* avoid including junk */ #include typedef struct { LONG volatile word; } glwthread_spinlock_t; #define GLWTHREAD_SPIN_INIT { 0 } #ifdef __cplusplus extern "C" { #endif extern void glwthread_spin_init (glwthread_spinlock_t *lock); extern int glwthread_spin_lock (glwthread_spinlock_t *lock); extern int glwthread_spin_trylock (glwthread_spinlock_t *lock); extern int glwthread_spin_unlock (glwthread_spinlock_t *lock); extern int glwthread_spin_destroy (glwthread_spinlock_t *lock); #ifdef __cplusplus } #endif #endif /* _WINDOWS_SPIN_H */ pspp-1.4.1/gl/gl_anyhash2.h0000644000175000017500000000515213723215637015101 0ustar00blpblp00000000000000/* Hash table for sequential list, set, and map data type. Copyright (C) 2006, 2009-2020 Free Software Foundation, Inc. Written by Bruno Haible , 2006. 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 3 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, see . */ /* Common code of gl_linkedhash_list.c, gl_avltreehash_list.c, gl_rbtreehash_list.c, gl_linkedhash_set.c, gl_hash_set.c, gl_linkedhash_map.c, gl_hash_map.c. */ #include "gl_anyhash_primes.h" /* Resizes the hash table with a new estimated size. */ static void hash_resize (CONTAINER_T container, size_t estimate) { size_t new_size = next_prime (estimate); if (new_size > container->table_size) { gl_hash_entry_t *old_table = container->table; /* Allocate the new table. */ gl_hash_entry_t *new_table; size_t i; if (size_overflow_p (xtimes (new_size, sizeof (gl_hash_entry_t)))) goto fail; new_table = (gl_hash_entry_t *) calloc (new_size, sizeof (gl_hash_entry_t)); if (new_table == NULL) goto fail; /* Iterate through the entries of the old table. */ for (i = container->table_size; i > 0; ) { gl_hash_entry_t node = old_table[--i]; while (node != NULL) { gl_hash_entry_t next = node->hash_next; /* Add the entry to the new table. */ size_t bucket = node->hashcode % new_size; node->hash_next = new_table[bucket]; new_table[bucket] = node; node = next; } } container->table = new_table; container->table_size = new_size; free (old_table); } return; fail: /* Just continue without resizing the table. */ return; } /* Resizes the hash table if needed, after CONTAINER_COUNT (container) was incremented. */ static void hash_resize_after_add (CONTAINER_T container) { size_t count = CONTAINER_COUNT (container); size_t estimate = xsum (count, count / 2); /* 1.5 * count */ if (estimate > container->table_size) hash_resize (container, estimate); } pspp-1.4.1/gl/windows-mutex.c0000644000175000017500000000517713723215640015530 0ustar00blpblp00000000000000/* Plain mutexes (native Windows implementation). Copyright (C) 2005-2020 Free Software Foundation, Inc. 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 3, 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, see . */ /* Written by Bruno Haible , 2005. Based on GCC's gthr-win32.h. */ #include /* Specification. */ #include "windows-mutex.h" #include void glwthread_mutex_init (glwthread_mutex_t *mutex) { InitializeCriticalSection (&mutex->lock); mutex->guard.done = 1; } int glwthread_mutex_lock (glwthread_mutex_t *mutex) { if (!mutex->guard.done) { if (InterlockedIncrement (&mutex->guard.started) == 0) /* This thread is the first one to need this mutex. Initialize it. */ glwthread_mutex_init (mutex); else { /* Don't let mutex->guard.started grow and wrap around. */ InterlockedDecrement (&mutex->guard.started); /* Yield the CPU while waiting for another thread to finish initializing this mutex. */ while (!mutex->guard.done) Sleep (0); } } EnterCriticalSection (&mutex->lock); return 0; } int glwthread_mutex_trylock (glwthread_mutex_t *mutex) { if (!mutex->guard.done) { if (InterlockedIncrement (&mutex->guard.started) == 0) /* This thread is the first one to need this mutex. Initialize it. */ glwthread_mutex_init (mutex); else { /* Don't let mutex->guard.started grow and wrap around. */ InterlockedDecrement (&mutex->guard.started); /* Let another thread finish initializing this mutex, and let it also lock this mutex. */ return EBUSY; } } if (!TryEnterCriticalSection (&mutex->lock)) return EBUSY; return 0; } int glwthread_mutex_unlock (glwthread_mutex_t *mutex) { if (!mutex->guard.done) return EINVAL; LeaveCriticalSection (&mutex->lock); return 0; } int glwthread_mutex_destroy (glwthread_mutex_t *mutex) { if (!mutex->guard.done) return EINVAL; DeleteCriticalSection (&mutex->lock); mutex->guard.done = 0; return 0; } pspp-1.4.1/gl/c-snprintf.c0000644000175000017500000000402213723215636014752 0ustar00blpblp00000000000000/* Formatted output to strings in C locale. Copyright (C) 2004, 2006-2020 Free Software Foundation, Inc. Written by Simon Josefsson and Paul Eggert. Modified for C locale by Ben Pfaff. 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 3, 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, see . */ #include /* Specification. */ #include #include #include #include #include #include #include "c-vasnprintf.h" /* Print formatted output to string STR. Similar to sprintf, but additional length SIZE limit how much is written into STR. Returns string length of formatted string (which may be larger than SIZE). STR may be NULL, in which case nothing will be written. On error, return a negative value. Formatting takes place in the C locale, that is, the decimal point used in floating-point formatting directives is always '.'. */ int c_snprintf (char *str, size_t size, const char *format, ...) { char *output; size_t len; size_t lenbuf = size; va_list args; va_start (args, format); output = c_vasnprintf (str, &lenbuf, format, args); len = lenbuf; va_end (args); if (!output) return -1; if (output != str) { if (size) { size_t pruned_len = (len < size ? len : size - 1); memcpy (str, output, pruned_len); str[pruned_len] = '\0'; } free (output); } if (INT_MAX < len) { errno = EOVERFLOW; return -1; } return len; } pspp-1.4.1/gl/termios.in.h0000644000175000017500000000436613723215640014771 0ustar00blpblp00000000000000/* Substitute for and wrapper around . Copyright (C) 2010-2020 Free Software Foundation, Inc. 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 3, 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, see . */ #ifndef _@GUARD_PREFIX@_TERMIOS_H #if __GNUC__ >= 3 @PRAGMA_SYSTEM_HEADER@ #endif @PRAGMA_COLUMNS@ /* On HP-UX 11.00, some of the function declarations in , included by , are not protected by extern "C". Enforce "C" linkage for these functions nevertheless. */ #if defined __hpux && defined __cplusplus # include # include extern "C" { # include } #endif /* The include_next requires a split double-inclusion guard. */ #if @HAVE_TERMIOS_H@ # @INCLUDE_NEXT@ @NEXT_TERMIOS_H@ #endif #ifndef _@GUARD_PREFIX@_TERMIOS_H #define _@GUARD_PREFIX@_TERMIOS_H /* Get pid_t. */ #include /* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */ /* The definition of _GL_WARN_ON_USE is copied here. */ /* Declare overridden functions. */ #if @GNULIB_TCGETSID@ /* Return the session ID of the controlling terminal of the current process. The argument is a descriptor if this controlling terminal. Return -1, with errno set, upon failure. errno = ENOSYS means that the function is unsupported. */ # if !@HAVE_DECL_TCGETSID@ _GL_FUNCDECL_SYS (tcgetsid, pid_t, (int fd)); # endif _GL_CXXALIAS_SYS (tcgetsid, pid_t, (int fd)); _GL_CXXALIASWARN (tcgetsid); #elif defined GNULIB_POSIXCHECK # undef tcgetsid # if HAVE_RAW_DECL_TCGETSID _GL_WARN_ON_USE (tcgetsid, "tcgetsid is not portable - " "use gnulib module tcgetsid for portability"); # endif #endif #endif /* _@GUARD_PREFIX@_TERMIOS_H */ #endif /* _@GUARD_PREFIX@_TERMIOS_H */ pspp-1.4.1/gl/mbiter.h0000644000175000017500000001675413723215637014176 0ustar00blpblp00000000000000/* Iterating through multibyte strings: macros for multi-byte encodings. Copyright (C) 2001, 2005, 2007, 2009-2020 Free Software Foundation, Inc. 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 3 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, see . */ /* Written by Bruno Haible . */ /* The macros in this file implement forward iteration through a multi-byte string. With these macros, an iteration loop that looks like char *iter; for (iter = buf; iter < buf + buflen; iter++) { do_something (*iter); } becomes mbi_iterator_t iter; for (mbi_init (iter, buf, buflen); mbi_avail (iter); mbi_advance (iter)) { do_something (mbi_cur_ptr (iter), mb_len (mbi_cur (iter))); } The benefit of these macros over plain use of mbrtowc is: - Handling of invalid multibyte sequences is possible without making the code more complicated, while still preserving the invalid multibyte sequences. mbi_iterator_t is a type usable for variable declarations. mbi_init (iter, startptr, length) initializes the iterator, starting at startptr and crossing length bytes. mbi_avail (iter) returns true if there are more multibyte characters available before the end of string is reached. In this case, mbi_cur (iter) is initialized to the next multibyte character. mbi_advance (iter) advances the iterator by one multibyte character. mbi_cur (iter) returns the current multibyte character, of type mbchar_t. All the macros defined in mbchar.h can be used on it. mbi_cur_ptr (iter) return a pointer to the beginning of the current multibyte character. mbi_reloc (iter, ptrdiff) relocates iterator when the string is moved by ptrdiff bytes. mbi_copy (&destiter, &srciter) copies srciter to destiter. Here are the function prototypes of the macros. extern void mbi_init (mbi_iterator_t iter, const char *startptr, size_t length); extern bool mbi_avail (mbi_iterator_t iter); extern void mbi_advance (mbi_iterator_t iter); extern mbchar_t mbi_cur (mbi_iterator_t iter); extern const char * mbi_cur_ptr (mbi_iterator_t iter); extern void mbi_reloc (mbi_iterator_t iter, ptrdiff_t ptrdiff); extern void mbi_copy (mbi_iterator_t *new, const mbi_iterator_t *old); */ #ifndef _MBITER_H #define _MBITER_H 1 #include #include #include #include /* Tru64 with Desktop Toolkit C has a bug: must be included before . BSD/OS 4.1 has a bug: and must be included before . */ #include #include #include #include "mbchar.h" #ifndef _GL_INLINE_HEADER_BEGIN #error "Please include config.h first." #endif _GL_INLINE_HEADER_BEGIN #ifndef MBITER_INLINE # define MBITER_INLINE _GL_INLINE #endif struct mbiter_multi { const char *limit; /* pointer to end of string */ bool in_shift; /* true if next byte may not be interpreted as ASCII */ mbstate_t state; /* if in_shift: current shift state */ bool next_done; /* true if mbi_avail has already filled the following */ struct mbchar cur; /* the current character: const char *cur.ptr pointer to current character The following are only valid after mbi_avail. size_t cur.bytes number of bytes of current character bool cur.wc_valid true if wc is a valid wide character wchar_t cur.wc if wc_valid: the current character */ }; MBITER_INLINE void mbiter_multi_next (struct mbiter_multi *iter) { if (iter->next_done) return; if (iter->in_shift) goto with_shift; /* Handle most ASCII characters quickly, without calling mbrtowc(). */ if (is_basic (*iter->cur.ptr)) { /* These characters are part of the basic character set. ISO C 99 guarantees that their wide character code is identical to their char code. */ iter->cur.bytes = 1; iter->cur.wc = *iter->cur.ptr; iter->cur.wc_valid = true; } else { assert (mbsinit (&iter->state)); iter->in_shift = true; with_shift: iter->cur.bytes = mbrtowc (&iter->cur.wc, iter->cur.ptr, iter->limit - iter->cur.ptr, &iter->state); if (iter->cur.bytes == (size_t) -1) { /* An invalid multibyte sequence was encountered. */ iter->cur.bytes = 1; iter->cur.wc_valid = false; /* Whether to set iter->in_shift = false and reset iter->state or not is not very important; the string is bogus anyway. */ } else if (iter->cur.bytes == (size_t) -2) { /* An incomplete multibyte character at the end. */ iter->cur.bytes = iter->limit - iter->cur.ptr; iter->cur.wc_valid = false; /* Whether to set iter->in_shift = false and reset iter->state or not is not important; the string end is reached anyway. */ } else { if (iter->cur.bytes == 0) { /* A null wide character was encountered. */ iter->cur.bytes = 1; assert (*iter->cur.ptr == '\0'); assert (iter->cur.wc == 0); } iter->cur.wc_valid = true; /* When in the initial state, we can go back treating ASCII characters more quickly. */ if (mbsinit (&iter->state)) iter->in_shift = false; } } iter->next_done = true; } MBITER_INLINE void mbiter_multi_reloc (struct mbiter_multi *iter, ptrdiff_t ptrdiff) { iter->cur.ptr += ptrdiff; iter->limit += ptrdiff; } MBITER_INLINE void mbiter_multi_copy (struct mbiter_multi *new_iter, const struct mbiter_multi *old_iter) { new_iter->limit = old_iter->limit; if ((new_iter->in_shift = old_iter->in_shift)) memcpy (&new_iter->state, &old_iter->state, sizeof (mbstate_t)); else memset (&new_iter->state, 0, sizeof (mbstate_t)); new_iter->next_done = old_iter->next_done; mb_copy (&new_iter->cur, &old_iter->cur); } /* Iteration macros. */ typedef struct mbiter_multi mbi_iterator_t; #define mbi_init(iter, startptr, length) \ ((iter).cur.ptr = (startptr), (iter).limit = (iter).cur.ptr + (length), \ (iter).in_shift = false, memset (&(iter).state, '\0', sizeof (mbstate_t)), \ (iter).next_done = false) #define mbi_avail(iter) \ ((iter).cur.ptr < (iter).limit && (mbiter_multi_next (&(iter)), true)) #define mbi_advance(iter) \ ((iter).cur.ptr += (iter).cur.bytes, (iter).next_done = false) /* Access to the current character. */ #define mbi_cur(iter) (iter).cur #define mbi_cur_ptr(iter) (iter).cur.ptr /* Relocation. */ #define mbi_reloc(iter, ptrdiff) mbiter_multi_reloc (&iter, ptrdiff) /* Copying an iterator. */ #define mbi_copy mbiter_multi_copy _GL_INLINE_HEADER_END #endif /* _MBITER_H */ pspp-1.4.1/gl/xvasprintf.c0000644000175000017500000000530713723215640015075 0ustar00blpblp00000000000000/* vasprintf and asprintf with out-of-memory checking. Copyright (C) 1999, 2002-2004, 2006-2020 Free Software Foundation, Inc. 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 3 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, see . */ #include /* Specification. */ #include "xvasprintf.h" #include #include #include #include #include "xalloc.h" /* Checked size_t computations. */ #include "xsize.h" static char * xstrcat (size_t argcount, va_list args) { char *result; va_list ap; size_t totalsize; size_t i; char *p; /* Determine the total size. */ totalsize = 0; va_copy (ap, args); for (i = argcount; i > 0; i--) { const char *next = va_arg (ap, const char *); totalsize = xsum (totalsize, strlen (next)); } va_end (ap); /* Test for overflow in the summing pass above or in (totalsize + 1) below. Also, don't return a string longer than INT_MAX, for consistency with vasprintf(). */ if (totalsize == SIZE_MAX || totalsize > INT_MAX) { errno = EOVERFLOW; return NULL; } /* Allocate and fill the result string. */ result = XNMALLOC (totalsize + 1, char); p = result; for (i = argcount; i > 0; i--) { const char *next = va_arg (args, const char *); size_t len = strlen (next); memcpy (p, next, len); p += len; } *p = '\0'; return result; } char * xvasprintf (const char *format, va_list args) { char *result; /* Recognize the special case format = "%s...%s". It is a frequently used idiom for string concatenation and needs to be fast. We don't want to have a separate function xstrcat() for this purpose. */ { size_t argcount = 0; const char *f; for (f = format;;) { if (*f == '\0') /* Recognized the special case of string concatenation. */ return xstrcat (argcount, args); if (*f != '%') break; f++; if (*f != 's') break; f++; argcount++; } } if (vasprintf (&result, format, args) < 0) { if (errno == ENOMEM) xalloc_die (); return NULL; } return result; } pspp-1.4.1/gl/isnanf-nolibm.h0000644000175000017500000000305313723215637015434 0ustar00blpblp00000000000000/* Test for NaN that does not need libm. Copyright (C) 2007-2020 Free Software Foundation, Inc. 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 3 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, see . */ #if HAVE_ISNANF_IN_LIBC /* Get declaration of isnan macro or (older) isnanf function. */ # include # if (__GNUC__ >= 4) || (__clang_major__ >= 4) /* GCC >= 4.0 and clang provide a type-generic built-in for isnan. GCC >= 4.0 also provides __builtin_isnanf, but clang doesn't. */ # undef isnanf # define isnanf(x) __builtin_isnan ((float)(x)) # elif defined isnan # undef isnanf # define isnanf(x) isnan ((float)(x)) # else /* Get declaration of isnanf(), if not declared in . */ # if defined __sgi /* We can't include , because it conflicts with our definition of isnand. Therefore declare isnanf separately. */ extern int isnanf (float x); # endif # endif #else /* Test whether X is a NaN. */ # undef isnanf # define isnanf rpl_isnanf extern int isnanf (float x); #endif pspp-1.4.1/gl/printf-frexpl.h0000644000175000017500000000210413723215640015466 0ustar00blpblp00000000000000/* Split a 'long double' into fraction and mantissa, for hexadecimal printf. Copyright (C) 2007, 2009-2020 Free Software Foundation, Inc. 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 3 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, see . */ /* Write a finite, positive number x as x = mantissa * 2^exp where exp >= LDBL_MIN_EXP - 1, mantissa < 2.0, if x is not a denormalized number then mantissa >= 1.0. Store exp in *EXPPTR and return mantissa. */ extern long double printf_frexpl (long double x, int *expptr); pspp-1.4.1/gl/lstat.c0000644000175000017500000000721513723215637014026 0ustar00blpblp00000000000000/* Work around a bug of lstat on some systems Copyright (C) 1997-2006, 2008-2020 Free Software Foundation, Inc. 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 3 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, see . */ /* written by Jim Meyering */ /* If the user's config.h happens to include , let it include only the system's here, so that orig_lstat doesn't recurse to rpl_lstat. */ #define __need_system_sys_stat_h #include #if !HAVE_LSTAT /* On systems that lack symlinks, our replacement already defined lstat as stat, so there is nothing further to do other than avoid an empty file. */ typedef int dummy; #else /* HAVE_LSTAT */ /* Get the original definition of lstat. It might be defined as a macro. */ # include # include # undef __need_system_sys_stat_h static int orig_lstat (const char *filename, struct stat *buf) { return lstat (filename, buf); } /* Specification. */ # ifdef __osf__ /* Write "sys/stat.h" here, not , otherwise OSF/1 5.1 DTK cc eliminates this include because of the preliminary #include above. */ # include "sys/stat.h" # else # include # endif # include "stat-time.h" # include # include /* lstat works differently on Linux and Solaris systems. POSIX (see "pathname resolution" in the glossary) requires that programs like 'ls' take into consideration the fact that FILE has a trailing slash when FILE is a symbolic link. On Linux and Solaris 10 systems, the lstat function already has the desired semantics (in treating 'lstat ("symlink/", sbuf)' just like 'lstat ("symlink/.", sbuf)', but on Solaris 9 and earlier it does not. If FILE has a trailing slash and specifies a symbolic link, then use stat() to get more info on the referent of FILE. If the referent is a non-directory, then set errno to ENOTDIR and return -1. Otherwise, return stat's result. */ int rpl_lstat (const char *file, struct stat *sbuf) { int result = orig_lstat (file, sbuf); /* This replacement file can blindly check against '/' rather than using the ISSLASH macro, because all platforms with '\\' either lack symlinks (mingw) or have working lstat (cygwin) and thus do not compile this file. 0 len should have already been filtered out above, with a failure return of ENOENT. */ if (result == 0) { if (S_ISDIR (sbuf->st_mode) || file[strlen (file) - 1] != '/') result = stat_time_normalize (result, sbuf); else { /* At this point, a trailing slash is permitted only on symlink-to-dir; but it should have found information on the directory, not the symlink. Call 'stat' to get info about the link's referent. Our replacement stat guarantees valid results, even if the symlink is not pointing to a directory. */ if (!S_ISLNK (sbuf->st_mode)) { errno = ENOTDIR; return -1; } result = stat (file, sbuf); } } return result; } #endif /* HAVE_LSTAT */ pspp-1.4.1/gl/flexmember.h0000644000175000017500000000503613723215636015030 0ustar00blpblp00000000000000/* Sizes of structs with flexible array members. Copyright 2016-2020 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library 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 3 of the License, or (at your option) any later version. The GNU C Library 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 the GNU C Library; if not, see . Written by Paul Eggert. */ #include /* Nonzero multiple of alignment of TYPE, suitable for FLEXSIZEOF below. On older platforms without _Alignof, use a pessimistic bound that is safe in practice even if FLEXIBLE_ARRAY_MEMBER is 1. On newer platforms, use _Alignof to get a tighter bound. */ #if !defined __STDC_VERSION__ || __STDC_VERSION__ < 201112 # define FLEXALIGNOF(type) (sizeof (type) & ~ (sizeof (type) - 1)) #else # define FLEXALIGNOF(type) _Alignof (type) #endif /* Yield a properly aligned upper bound on the size of a struct of type TYPE with a flexible array member named MEMBER that is followed by N bytes of other data. The result is suitable as an argument to malloc. For example: struct s { int n; char d[FLEXIBLE_ARRAY_MEMBER]; }; struct s *p = malloc (FLEXSIZEOF (struct s, d, n * sizeof (char))); FLEXSIZEOF (TYPE, MEMBER, N) is not simply (sizeof (TYPE) + N), since FLEXIBLE_ARRAY_MEMBER may be 1 on pre-C11 platforms. Nor is it simply (offsetof (TYPE, MEMBER) + N), as that might yield a size that causes malloc to yield a pointer that is not properly aligned for TYPE; for example, if sizeof (int) == alignof (int) == 4, malloc (offsetof (struct s, d) + 3 * sizeof (char)) is equivalent to malloc (7) and might yield a pointer that is not a multiple of 4 (which means the pointer is not properly aligned for struct s), whereas malloc (FLEXSIZEOF (struct s, d, 3 * sizeof (char))) is equivalent to malloc (8) and must yield a pointer that is a multiple of 4. Yield a value less than N if and only if arithmetic overflow occurs. */ #define FLEXSIZEOF(type, member, n) \ ((offsetof (type, member) + FLEXALIGNOF (type) - 1 + (n)) \ & ~ (FLEXALIGNOF (type) - 1)) pspp-1.4.1/gl/readlink.c0000644000175000017500000000446413723215640014465 0ustar00blpblp00000000000000/* Stub for readlink(). Copyright (C) 2003-2007, 2009-2020 Free Software Foundation, Inc. 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 3 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, see . */ #include /* Specification. */ #include #include #include #include #if !HAVE_READLINK /* readlink() substitute for systems that don't have a readlink() function, such as DJGPP 2.03 and mingw32. */ ssize_t readlink (const char *name, char *buf _GL_UNUSED, size_t bufsize _GL_UNUSED) { struct stat statbuf; /* In general we should use lstat() here, not stat(). But on platforms without symbolic links, lstat() - if it exists - would be equivalent to stat(), therefore we can use stat(). This saves us a configure check. */ if (stat (name, &statbuf) >= 0) errno = EINVAL; return -1; } #else /* HAVE_READLINK */ # undef readlink /* readlink() wrapper that uses correct types, for systems like cygwin 1.5.x where readlink returns int, and which rejects trailing slash, for Solaris 9. */ ssize_t rpl_readlink (const char *name, char *buf, size_t bufsize) { # if READLINK_TRAILING_SLASH_BUG size_t len = strlen (name); if (len && name[len - 1] == '/') { /* Even if name without the slash is a symlink to a directory, both lstat() and stat() must resolve the trailing slash to the directory rather than the symlink. We can therefore safely use stat() to distinguish between EINVAL and ENOTDIR/ENOENT, avoiding extra overhead of rpl_lstat(). */ struct stat st; if (stat (name, &st) == 0) errno = EINVAL; return -1; } # endif /* READLINK_TRAILING_SLASH_BUG */ return readlink (name, buf, bufsize); } #endif /* HAVE_READLINK */ pspp-1.4.1/gl/trunc.c0000644000175000017500000000722613723215640014026 0ustar00blpblp00000000000000/* Round towards zero. Copyright (C) 2007, 2010-2020 Free Software Foundation, Inc. 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 3 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, see . */ /* Written by Bruno Haible , 2007. */ #if ! defined USE_LONG_DOUBLE # include #endif /* Specification. */ #include #include #undef MIN #ifdef USE_LONG_DOUBLE # define FUNC truncl # define DOUBLE long double # define MANT_DIG LDBL_MANT_DIG # define MIN LDBL_MIN # define L_(literal) literal##L #elif ! defined USE_FLOAT # define FUNC trunc # define DOUBLE double # define MANT_DIG DBL_MANT_DIG # define MIN DBL_MIN # define L_(literal) literal #else /* defined USE_FLOAT */ # define FUNC truncf # define DOUBLE float # define MANT_DIG FLT_MANT_DIG # define MIN FLT_MIN # define L_(literal) literal##f #endif /* -0.0. See minus-zero.h. */ #if defined __hpux || defined __sgi || defined __ICC # define MINUS_ZERO (-MIN * MIN) #else # define MINUS_ZERO L_(-0.0) #endif /* MSVC with option -fp:strict refuses to compile constant initializers that contain floating-point operations. Pacify this compiler. */ #ifdef _MSC_VER # pragma fenv_access (off) #endif /* 2^(MANT_DIG-1). */ static const DOUBLE TWO_MANT_DIG = /* Assume MANT_DIG <= 5 * 31. Use the identity n = floor(n/5) + floor((n+1)/5) + ... + floor((n+4)/5). */ (DOUBLE) (1U << ((MANT_DIG - 1) / 5)) * (DOUBLE) (1U << ((MANT_DIG - 1 + 1) / 5)) * (DOUBLE) (1U << ((MANT_DIG - 1 + 2) / 5)) * (DOUBLE) (1U << ((MANT_DIG - 1 + 3) / 5)) * (DOUBLE) (1U << ((MANT_DIG - 1 + 4) / 5)); DOUBLE FUNC (DOUBLE x) { /* The use of 'volatile' guarantees that excess precision bits are dropped at each addition step and before the following comparison at the caller's site. It is necessary on x86 systems where double-floats are not IEEE compliant by default, to avoid that the results become platform and compiler option dependent. 'volatile' is a portable alternative to gcc's -ffloat-store option. */ volatile DOUBLE y = x; volatile DOUBLE z = y; if (z > L_(0.0)) { /* For 0 < x < 1, return +0.0 even if the current rounding mode is FE_DOWNWARD. */ if (z < L_(1.0)) z = L_(0.0); /* Avoid rounding errors for values near 2^k, where k >= MANT_DIG-1. */ else if (z < TWO_MANT_DIG) { /* Round to the next integer (nearest or up or down, doesn't matter). */ z += TWO_MANT_DIG; z -= TWO_MANT_DIG; /* Enforce rounding down. */ if (z > y) z -= L_(1.0); } } else if (z < L_(0.0)) { /* For -1 < x < 0, return -0.0 regardless of the current rounding mode. */ if (z > L_(-1.0)) z = MINUS_ZERO; /* Avoid rounding errors for values near -2^k, where k >= MANT_DIG-1. */ else if (z > - TWO_MANT_DIG) { /* Round to the next integer (nearest or up or down, doesn't matter). */ z -= TWO_MANT_DIG; z += TWO_MANT_DIG; /* Enforce rounding up. */ if (z < y) z += L_(1.0); } } return z; } pspp-1.4.1/gl/progname.h0000644000175000017500000000374013723215640014505 0ustar00blpblp00000000000000/* Program name management. Copyright (C) 2001-2004, 2006, 2009-2020 Free Software Foundation, Inc. Written by Bruno Haible , 2001. 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 3 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, see . */ #ifndef _PROGNAME_H #define _PROGNAME_H /* Programs using this file should do the following in main(): set_program_name (argv[0]); */ #ifdef __cplusplus extern "C" { #endif /* String containing name the program is called with. */ extern const char *program_name; /* Set program_name, based on argv[0]. argv0 must be a string allocated with indefinite extent, and must not be modified after this call. */ extern void set_program_name (const char *argv0); #if ENABLE_RELOCATABLE /* Set program_name, based on argv[0], and original installation prefix and directory, for relocatability. */ extern void set_program_name_and_installdir (const char *argv0, const char *orig_installprefix, const char *orig_installdir); #undef set_program_name #define set_program_name(ARG0) \ set_program_name_and_installdir (ARG0, INSTALLPREFIX, INSTALLDIR) /* Return the full pathname of the current executable, based on the earlier call to set_program_name_and_installdir. Return NULL if unknown. */ extern char *get_full_program_name (void); #endif #ifdef __cplusplus } #endif #endif /* _PROGNAME_H */ pspp-1.4.1/gl/fd-hook.c0000644000175000017500000000700413723215636014221 0ustar00blpblp00000000000000/* Hook for making file descriptor functions close(), ioctl() extensible. Copyright (C) 2009-2020 Free Software Foundation, Inc. Written by Bruno Haible , 2009. 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 3 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, see . */ #include /* Specification. */ #include "fd-hook.h" #include /* Currently, this entire code is only needed for the handling of sockets on native Windows platforms. */ #if WINDOWS_SOCKETS /* The first and last link in the doubly linked list. Initially the list is empty. */ static struct fd_hook anchor = { &anchor, &anchor, NULL, NULL }; int execute_close_hooks (const struct fd_hook *remaining_list, gl_close_fn primary, int fd) { if (remaining_list == &anchor) /* End of list reached. */ return primary (fd); else return remaining_list->private_close_fn (remaining_list->private_next, primary, fd); } int execute_all_close_hooks (gl_close_fn primary, int fd) { return execute_close_hooks (anchor.private_next, primary, fd); } int execute_ioctl_hooks (const struct fd_hook *remaining_list, gl_ioctl_fn primary, int fd, int request, void *arg) { if (remaining_list == &anchor) /* End of list reached. */ return primary (fd, request, arg); else return remaining_list->private_ioctl_fn (remaining_list->private_next, primary, fd, request, arg); } int execute_all_ioctl_hooks (gl_ioctl_fn primary, int fd, int request, void *arg) { return execute_ioctl_hooks (anchor.private_next, primary, fd, request, arg); } void register_fd_hook (close_hook_fn close_hook, ioctl_hook_fn ioctl_hook, struct fd_hook *link) { if (close_hook == NULL) close_hook = execute_close_hooks; if (ioctl_hook == NULL) ioctl_hook = execute_ioctl_hooks; if (link->private_next == NULL && link->private_prev == NULL) { /* Add the link to the doubly linked list. */ link->private_next = anchor.private_next; link->private_prev = &anchor; link->private_close_fn = close_hook; link->private_ioctl_fn = ioctl_hook; anchor.private_next->private_prev = link; anchor.private_next = link; } else { /* The link is already in use. */ if (link->private_close_fn != close_hook || link->private_ioctl_fn != ioctl_hook) abort (); } } void unregister_fd_hook (struct fd_hook *link) { struct fd_hook *next = link->private_next; struct fd_hook *prev = link->private_prev; if (next != NULL && prev != NULL) { /* The link is in use. Remove it from the doubly linked list. */ prev->private_next = next; next->private_prev = prev; /* Clear the link, to mark it unused. */ link->private_next = NULL; link->private_prev = NULL; link->private_close_fn = NULL; link->private_ioctl_fn = NULL; } } #endif pspp-1.4.1/gl/vfprintf.c0000644000175000017500000000330313723215640014521 0ustar00blpblp00000000000000/* Formatted output to a stream. Copyright (C) 2004, 2006-2020 Free Software Foundation, Inc. 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 3 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, see . */ #ifdef HAVE_CONFIG_H # include #endif /* Specification. */ #include #include #include #include #include #include "fseterr.h" #include "vasnprintf.h" /* Print formatted output to the stream FP. Return string length of formatted string. On error, return a negative value. */ int vfprintf (FILE *fp, const char *format, va_list args) { char buf[2000]; char *output; size_t len; size_t lenbuf = sizeof (buf); output = vasnprintf (buf, &lenbuf, format, args); len = lenbuf; if (!output) { fseterr (fp); return -1; } if (fwrite (output, 1, len, fp) < len) { if (output != buf) { int saved_errno = errno; free (output); errno = saved_errno; } return -1; } if (output != buf) free (output); if (len > INT_MAX) { errno = EOVERFLOW; fseterr (fp); return -1; } return len; } pspp-1.4.1/gl/c-ctype.h0000644000175000017500000002240713723215636014247 0ustar00blpblp00000000000000/* Character handling in C locale. These functions work like the corresponding functions in , except that they have the C (POSIX) locale hardwired, whereas the functions' behaviour depends on the current locale set via setlocale. Copyright (C) 2000-2003, 2006, 2008-2020 Free Software Foundation, Inc. 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 3 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, see . */ #ifndef C_CTYPE_H #define C_CTYPE_H #include #ifndef _GL_INLINE_HEADER_BEGIN #error "Please include config.h first." #endif _GL_INLINE_HEADER_BEGIN #ifndef C_CTYPE_INLINE # define C_CTYPE_INLINE _GL_INLINE #endif #ifdef __cplusplus extern "C" { #endif /* The functions defined in this file assume the "C" locale and a character set without diacritics (ASCII-US or EBCDIC-US or something like that). Even if the "C" locale on a particular system is an extension of the ASCII character set (like on BeOS, where it is UTF-8, or on AmigaOS, where it is ISO-8859-1), the functions in this file recognize only the ASCII characters. */ #if (' ' == 32) && ('!' == 33) && ('"' == 34) && ('#' == 35) \ && ('%' == 37) && ('&' == 38) && ('\'' == 39) && ('(' == 40) \ && (')' == 41) && ('*' == 42) && ('+' == 43) && (',' == 44) \ && ('-' == 45) && ('.' == 46) && ('/' == 47) && ('0' == 48) \ && ('1' == 49) && ('2' == 50) && ('3' == 51) && ('4' == 52) \ && ('5' == 53) && ('6' == 54) && ('7' == 55) && ('8' == 56) \ && ('9' == 57) && (':' == 58) && (';' == 59) && ('<' == 60) \ && ('=' == 61) && ('>' == 62) && ('?' == 63) && ('A' == 65) \ && ('B' == 66) && ('C' == 67) && ('D' == 68) && ('E' == 69) \ && ('F' == 70) && ('G' == 71) && ('H' == 72) && ('I' == 73) \ && ('J' == 74) && ('K' == 75) && ('L' == 76) && ('M' == 77) \ && ('N' == 78) && ('O' == 79) && ('P' == 80) && ('Q' == 81) \ && ('R' == 82) && ('S' == 83) && ('T' == 84) && ('U' == 85) \ && ('V' == 86) && ('W' == 87) && ('X' == 88) && ('Y' == 89) \ && ('Z' == 90) && ('[' == 91) && ('\\' == 92) && (']' == 93) \ && ('^' == 94) && ('_' == 95) && ('a' == 97) && ('b' == 98) \ && ('c' == 99) && ('d' == 100) && ('e' == 101) && ('f' == 102) \ && ('g' == 103) && ('h' == 104) && ('i' == 105) && ('j' == 106) \ && ('k' == 107) && ('l' == 108) && ('m' == 109) && ('n' == 110) \ && ('o' == 111) && ('p' == 112) && ('q' == 113) && ('r' == 114) \ && ('s' == 115) && ('t' == 116) && ('u' == 117) && ('v' == 118) \ && ('w' == 119) && ('x' == 120) && ('y' == 121) && ('z' == 122) \ && ('{' == 123) && ('|' == 124) && ('}' == 125) && ('~' == 126) /* The character set is ASCII or one of its variants or extensions, not EBCDIC. Testing the value of '\n' and '\r' is not relevant. */ # define C_CTYPE_ASCII 1 #elif ! (' ' == '\x40' && '0' == '\xf0' \ && 'A' == '\xc1' && 'J' == '\xd1' && 'S' == '\xe2' \ && 'a' == '\x81' && 'j' == '\x91' && 's' == '\xa2') # error "Only ASCII and EBCDIC are supported" #endif #if 'A' < 0 # error "EBCDIC and char is signed -- not supported" #endif /* Cases for control characters. */ #define _C_CTYPE_CNTRL \ case '\a': case '\b': case '\f': case '\n': \ case '\r': case '\t': case '\v': \ _C_CTYPE_OTHER_CNTRL /* ASCII control characters other than those with \-letter escapes. */ #if C_CTYPE_ASCII # define _C_CTYPE_OTHER_CNTRL \ case '\x00': case '\x01': case '\x02': case '\x03': \ case '\x04': case '\x05': case '\x06': case '\x0e': \ case '\x0f': case '\x10': case '\x11': case '\x12': \ case '\x13': case '\x14': case '\x15': case '\x16': \ case '\x17': case '\x18': case '\x19': case '\x1a': \ case '\x1b': case '\x1c': case '\x1d': case '\x1e': \ case '\x1f': case '\x7f' #else /* Use EBCDIC code page 1047's assignments for ASCII control chars; assume all EBCDIC code pages agree about these assignments. */ # define _C_CTYPE_OTHER_CNTRL \ case '\x00': case '\x01': case '\x02': case '\x03': \ case '\x07': case '\x0e': case '\x0f': case '\x10': \ case '\x11': case '\x12': case '\x13': case '\x18': \ case '\x19': case '\x1c': case '\x1d': case '\x1e': \ case '\x1f': case '\x26': case '\x27': case '\x2d': \ case '\x2e': case '\x32': case '\x37': case '\x3c': \ case '\x3d': case '\x3f' #endif /* Cases for lowercase hex letters, and lowercase letters, all offset by N. */ #define _C_CTYPE_LOWER_A_THRU_F_N(N) \ case 'a' + (N): case 'b' + (N): case 'c' + (N): case 'd' + (N): \ case 'e' + (N): case 'f' + (N) #define _C_CTYPE_LOWER_N(N) \ _C_CTYPE_LOWER_A_THRU_F_N(N): \ case 'g' + (N): case 'h' + (N): case 'i' + (N): case 'j' + (N): \ case 'k' + (N): case 'l' + (N): case 'm' + (N): case 'n' + (N): \ case 'o' + (N): case 'p' + (N): case 'q' + (N): case 'r' + (N): \ case 's' + (N): case 't' + (N): case 'u' + (N): case 'v' + (N): \ case 'w' + (N): case 'x' + (N): case 'y' + (N): case 'z' + (N) /* Cases for hex letters, digits, lower, punct, and upper. */ #define _C_CTYPE_A_THRU_F \ _C_CTYPE_LOWER_A_THRU_F_N (0): \ _C_CTYPE_LOWER_A_THRU_F_N ('A' - 'a') #define _C_CTYPE_DIGIT \ case '0': case '1': case '2': case '3': \ case '4': case '5': case '6': case '7': \ case '8': case '9' #define _C_CTYPE_LOWER _C_CTYPE_LOWER_N (0) #define _C_CTYPE_PUNCT \ case '!': case '"': case '#': case '$': \ case '%': case '&': case '\'': case '(': \ case ')': case '*': case '+': case ',': \ case '-': case '.': case '/': case ':': \ case ';': case '<': case '=': case '>': \ case '?': case '@': case '[': case '\\': \ case ']': case '^': case '_': case '`': \ case '{': case '|': case '}': case '~' #define _C_CTYPE_UPPER _C_CTYPE_LOWER_N ('A' - 'a') /* Function definitions. */ /* Unlike the functions in , which require an argument in the range of the 'unsigned char' type, the functions here operate on values that are in the 'unsigned char' range or in the 'char' range. In other words, when you have a 'char' value, you need to cast it before using it as argument to a function: const char *s = ...; if (isalpha ((unsigned char) *s)) ... but you don't need to cast it for the functions defined in this file: const char *s = ...; if (c_isalpha (*s)) ... */ C_CTYPE_INLINE bool c_isalnum (int c) { switch (c) { _C_CTYPE_DIGIT: _C_CTYPE_LOWER: _C_CTYPE_UPPER: return true; default: return false; } } C_CTYPE_INLINE bool c_isalpha (int c) { switch (c) { _C_CTYPE_LOWER: _C_CTYPE_UPPER: return true; default: return false; } } /* The function isascii is not locale dependent. Its use in EBCDIC is questionable. */ C_CTYPE_INLINE bool c_isascii (int c) { switch (c) { case ' ': _C_CTYPE_CNTRL: _C_CTYPE_DIGIT: _C_CTYPE_LOWER: _C_CTYPE_PUNCT: _C_CTYPE_UPPER: return true; default: return false; } } C_CTYPE_INLINE bool c_isblank (int c) { return c == ' ' || c == '\t'; } C_CTYPE_INLINE bool c_iscntrl (int c) { switch (c) { _C_CTYPE_CNTRL: return true; default: return false; } } C_CTYPE_INLINE bool c_isdigit (int c) { switch (c) { _C_CTYPE_DIGIT: return true; default: return false; } } C_CTYPE_INLINE bool c_isgraph (int c) { switch (c) { _C_CTYPE_DIGIT: _C_CTYPE_LOWER: _C_CTYPE_PUNCT: _C_CTYPE_UPPER: return true; default: return false; } } C_CTYPE_INLINE bool c_islower (int c) { switch (c) { _C_CTYPE_LOWER: return true; default: return false; } } C_CTYPE_INLINE bool c_isprint (int c) { switch (c) { case ' ': _C_CTYPE_DIGIT: _C_CTYPE_LOWER: _C_CTYPE_PUNCT: _C_CTYPE_UPPER: return true; default: return false; } } C_CTYPE_INLINE bool c_ispunct (int c) { switch (c) { _C_CTYPE_PUNCT: return true; default: return false; } } C_CTYPE_INLINE bool c_isspace (int c) { switch (c) { case ' ': case '\t': case '\n': case '\v': case '\f': case '\r': return true; default: return false; } } C_CTYPE_INLINE bool c_isupper (int c) { switch (c) { _C_CTYPE_UPPER: return true; default: return false; } } C_CTYPE_INLINE bool c_isxdigit (int c) { switch (c) { _C_CTYPE_DIGIT: _C_CTYPE_A_THRU_F: return true; default: return false; } } C_CTYPE_INLINE int c_tolower (int c) { switch (c) { _C_CTYPE_UPPER: return c - 'A' + 'a'; default: return c; } } C_CTYPE_INLINE int c_toupper (int c) { switch (c) { _C_CTYPE_LOWER: return c - 'a' + 'A'; default: return c; } } #ifdef __cplusplus } #endif _GL_INLINE_HEADER_END #endif /* C_CTYPE_H */ pspp-1.4.1/gl/unistr/0000755000175000017500000000000013725012650014042 5ustar00blpblp00000000000000pspp-1.4.1/gl/unistr/u-cmp2.h0000644000175000017500000000172313723215640015323 0ustar00blpblp00000000000000/* Compare pieces of UTF-8/UTF-16/UTF-32 strings. Copyright (C) 2009-2020 Free Software Foundation, Inc. Written by Bruno Haible , 2009. 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 3 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, see . */ int FUNC (const UNIT *s1, size_t n1, const UNIT *s2, size_t n2) { int cmp = U_CMP (s1, s2, MIN (n1, n2)); if (cmp == 0) cmp = _GL_CMP (n1, n2); return cmp; } pspp-1.4.1/gl/unistr/u8-cpy.c0000644000175000017500000000163613723215640015343 0ustar00blpblp00000000000000/* Copy piece of UTF-8 string. Copyright (C) 2002, 2006, 2009-2020 Free Software Foundation, Inc. Written by Bruno Haible , 2002. 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 3 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, see . */ #include /* Specification. */ #include "unistr.h" #define FUNC u8_cpy #define UNIT uint8_t #include "u-cpy.h" pspp-1.4.1/gl/unistr/u8-strlen.c0000644000175000017500000000171113723215640016051 0ustar00blpblp00000000000000/* Determine length of UTF-8 string. Copyright (C) 2002, 2006, 2009-2020 Free Software Foundation, Inc. Written by Bruno Haible , 2002. 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 3 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, see . */ #include /* Specification. */ #include "unistr.h" #include size_t u8_strlen (const uint8_t *s) { return strlen ((const char *) s); } pspp-1.4.1/gl/unistr/u8-mbtouc.c0000644000175000017500000001102413723215640016031 0ustar00blpblp00000000000000/* Look at first character in UTF-8 string. Copyright (C) 1999-2002, 2006-2007, 2009-2020 Free Software Foundation, Inc. Written by Bruno Haible , 2001. 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 3 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, see . */ #include #if defined IN_LIBUNISTRING /* Tell unistr.h to declare u8_mbtouc as 'extern', not 'static inline'. */ # include "unistring-notinline.h" #endif /* Specification. */ #include "unistr.h" #if !HAVE_INLINE int u8_mbtouc (ucs4_t *puc, const uint8_t *s, size_t n) { uint8_t c = *s; if (c < 0x80) { *puc = c; return 1; } else if (c >= 0xc2) { if (c < 0xe0) { if (n >= 2) { if ((s[1] ^ 0x80) < 0x40) { *puc = ((unsigned int) (c & 0x1f) << 6) | (unsigned int) (s[1] ^ 0x80); return 2; } /* invalid multibyte character */ } else { /* incomplete multibyte character */ *puc = 0xfffd; return 1; } } else if (c < 0xf0) { if (n >= 3) { if ((s[1] ^ 0x80) < 0x40) { if ((s[2] ^ 0x80) < 0x40) { if ((c >= 0xe1 || s[1] >= 0xa0) && (c != 0xed || s[1] < 0xa0)) { *puc = ((unsigned int) (c & 0x0f) << 12) | ((unsigned int) (s[1] ^ 0x80) << 6) | (unsigned int) (s[2] ^ 0x80); return 3; } /* invalid multibyte character */ *puc = 0xfffd; return 3; } /* invalid multibyte character */ *puc = 0xfffd; return 2; } /* invalid multibyte character */ } else { /* incomplete multibyte character */ *puc = 0xfffd; if (n == 1 || (s[1] ^ 0x80) >= 0x40) return 1; else return 2; } } else if (c < 0xf8) { if (n >= 4) { if ((s[1] ^ 0x80) < 0x40) { if ((s[2] ^ 0x80) < 0x40) { if ((s[3] ^ 0x80) < 0x40) { if ((c >= 0xf1 || s[1] >= 0x90) && (c < 0xf4 || (c == 0xf4 && s[1] < 0x90))) { *puc = ((unsigned int) (c & 0x07) << 18) | ((unsigned int) (s[1] ^ 0x80) << 12) | ((unsigned int) (s[2] ^ 0x80) << 6) | (unsigned int) (s[3] ^ 0x80); return 4; } /* invalid multibyte character */ *puc = 0xfffd; return 4; } /* invalid multibyte character */ *puc = 0xfffd; return 3; } /* invalid multibyte character */ *puc = 0xfffd; return 2; } /* invalid multibyte character */ } else { /* incomplete multibyte character */ *puc = 0xfffd; if (n == 1 || (s[1] ^ 0x80) >= 0x40) return 1; else if (n == 2 || (s[2] ^ 0x80) >= 0x40) return 2; else return 3; } } } /* invalid multibyte character */ *puc = 0xfffd; return 1; } #endif pspp-1.4.1/gl/unistr/u8-mbtouc-unsafe-aux.c0000644000175000017500000001056613723215640020115 0ustar00blpblp00000000000000/* Conversion UTF-8 to UCS-4. Copyright (C) 2001-2002, 2006-2007, 2009-2020 Free Software Foundation, Inc. Written by Bruno Haible , 2001. 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 3 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, see . */ #include /* Specification. */ #include "unistr.h" #if defined IN_LIBUNISTRING || HAVE_INLINE int u8_mbtouc_unsafe_aux (ucs4_t *puc, const uint8_t *s, size_t n) { uint8_t c = *s; if (c >= 0xc2) { if (c < 0xe0) { if (n >= 2) { if ((s[1] ^ 0x80) < 0x40) { *puc = ((unsigned int) (c & 0x1f) << 6) | (unsigned int) (s[1] ^ 0x80); return 2; } /* invalid multibyte character */ } else { /* incomplete multibyte character */ *puc = 0xfffd; return 1; } } else if (c < 0xf0) { if (n >= 3) { if ((s[1] ^ 0x80) < 0x40) { if ((s[2] ^ 0x80) < 0x40) { if ((c >= 0xe1 || s[1] >= 0xa0) && (c != 0xed || s[1] < 0xa0)) { *puc = ((unsigned int) (c & 0x0f) << 12) | ((unsigned int) (s[1] ^ 0x80) << 6) | (unsigned int) (s[2] ^ 0x80); return 3; } /* invalid multibyte character */ *puc = 0xfffd; return 3; } /* invalid multibyte character */ *puc = 0xfffd; return 2; } /* invalid multibyte character */ } else { /* incomplete multibyte character */ *puc = 0xfffd; if (n == 1 || (s[1] ^ 0x80) >= 0x40) return 1; else return 2; } } else if (c < 0xf8) { if (n >= 4) { if ((s[1] ^ 0x80) < 0x40) { if ((s[2] ^ 0x80) < 0x40) { if ((s[3] ^ 0x80) < 0x40) { if ((c >= 0xf1 || s[1] >= 0x90) && (c < 0xf4 || (c == 0xf4 && s[1] < 0x90)) ) { *puc = ((unsigned int) (c & 0x07) << 18) | ((unsigned int) (s[1] ^ 0x80) << 12) | ((unsigned int) (s[2] ^ 0x80) << 6) | (unsigned int) (s[3] ^ 0x80); return 4; } /* invalid multibyte character */ *puc = 0xfffd; return 4; } /* invalid multibyte character */ *puc = 0xfffd; return 3; } /* invalid multibyte character */ *puc = 0xfffd; return 2; } /* invalid multibyte character */ } else { /* incomplete multibyte character */ *puc = 0xfffd; if (n == 1 || (s[1] ^ 0x80) >= 0x40) return 1; else if (n == 2 || (s[2] ^ 0x80) >= 0x40) return 2; else return 3; } } } /* invalid multibyte character */ *puc = 0xfffd; return 1; } #endif pspp-1.4.1/gl/unistr/u8-uctomb.c0000644000175000017500000000401113723215640016027 0ustar00blpblp00000000000000/* Store a character in UTF-8 string. Copyright (C) 2002, 2005-2006, 2009-2020 Free Software Foundation, Inc. Written by Bruno Haible , 2002. 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 3 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, see . */ #include #if defined IN_LIBUNISTRING /* Tell unistr.h to declare u8_uctomb as 'extern', not 'static inline'. */ # include "unistring-notinline.h" #endif /* Specification. */ #include "unistr.h" #include "attribute.h" #if !HAVE_INLINE int u8_uctomb (uint8_t *s, ucs4_t uc, int n) { if (uc < 0x80) { if (n > 0) { s[0] = uc; return 1; } /* else return -2, below. */ } else { int count; if (uc < 0x800) count = 2; else if (uc < 0x10000) { if (uc < 0xd800 || uc >= 0xe000) count = 3; else return -1; } else if (uc < 0x110000) count = 4; else return -1; if (n >= count) { switch (count) /* note: code falls through cases! */ { case 4: s[3] = 0x80 | (uc & 0x3f); uc = uc >> 6; uc |= 0x10000; FALLTHROUGH; case 3: s[2] = 0x80 | (uc & 0x3f); uc = uc >> 6; uc |= 0x800; FALLTHROUGH; case 2: s[1] = 0x80 | (uc & 0x3f); uc = uc >> 6; uc |= 0xc0; /*case 1:*/ s[0] = uc; } return count; } } return -2; } #endif pspp-1.4.1/gl/unistr/u8-strncat.c0000644000175000017500000000200213723215640016212 0ustar00blpblp00000000000000/* Concatenate UTF-8 strings. Copyright (C) 2002, 2006, 2009-2020 Free Software Foundation, Inc. Written by Bruno Haible , 2002. 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 3 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, see . */ #include /* Specification. */ #include "unistr.h" #include uint8_t * u8_strncat (uint8_t *dest, const uint8_t *src, size_t n) { return (uint8_t *) strncat ((char *) dest, (const char *) src, n); } pspp-1.4.1/gl/unistr/u8-check.c0000644000175000017500000000427113723215640015623 0ustar00blpblp00000000000000/* Check UTF-8 string. Copyright (C) 2002, 2006-2007, 2009-2020 Free Software Foundation, Inc. Written by Bruno Haible , 2002. 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 3 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, see . */ #include /* Specification. */ #include "unistr.h" const uint8_t * u8_check (const uint8_t *s, size_t n) { const uint8_t *s_end = s + n; while (s < s_end) { /* Keep in sync with unistr.h and u8-mbtouc-aux.c. */ uint8_t c = *s; if (c < 0x80) { s++; continue; } if (c >= 0xc2) { if (c < 0xe0) { if (s + 2 <= s_end && (s[1] ^ 0x80) < 0x40) { s += 2; continue; } } else if (c < 0xf0) { if (s + 3 <= s_end && (s[1] ^ 0x80) < 0x40 && (s[2] ^ 0x80) < 0x40 && (c >= 0xe1 || s[1] >= 0xa0) && (c != 0xed || s[1] < 0xa0)) { s += 3; continue; } } else if (c < 0xf8) { if (s + 4 <= s_end && (s[1] ^ 0x80) < 0x40 && (s[2] ^ 0x80) < 0x40 && (s[3] ^ 0x80) < 0x40 && (c >= 0xf1 || s[1] >= 0x90) && (c < 0xf4 || (c == 0xf4 && s[1] < 0x90))) { s += 4; continue; } } } /* invalid or incomplete multibyte character */ return s; } return NULL; } pspp-1.4.1/gl/unistr/u-cpy.h0000644000175000017500000000207413723215640015255 0ustar00blpblp00000000000000/* Copy piece of UTF-8/UTF-16/UTF-32 string. Copyright (C) 1999, 2002, 2006, 2009-2020 Free Software Foundation, Inc. Written by Bruno Haible , 2002. 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 3 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, see . */ #include UNIT * FUNC (UNIT *dest, const UNIT *src, size_t n) { #if 0 UNIT *destptr = dest; for (; n > 0; n--) *destptr++ = *src++; #else if (n > 0) memcpy ((char *) dest, (const char *) src, n * sizeof (UNIT)); #endif return dest; } pspp-1.4.1/gl/unistr/u8-mblen.c0000644000175000017500000000364413723215640015646 0ustar00blpblp00000000000000/* Look at first character in UTF-8 string. Copyright (C) 1999-2000, 2002, 2006-2007, 2009-2020 Free Software Foundation, Inc. Written by Bruno Haible , 2002. 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 3 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, see . */ #include /* Specification. */ #include "unistr.h" int u8_mblen (const uint8_t *s, size_t n) { if (n > 0) { /* Keep in sync with unistr.h and u8-mbtouc-aux.c. */ uint8_t c = *s; if (c < 0x80) return (c != 0 ? 1 : 0); if (c >= 0xc2) { if (c < 0xe0) { if (n >= 2 && (s[1] ^ 0x80) < 0x40) return 2; } else if (c < 0xf0) { if (n >= 3 && (s[1] ^ 0x80) < 0x40 && (s[2] ^ 0x80) < 0x40 && (c >= 0xe1 || s[1] >= 0xa0) && (c != 0xed || s[1] < 0xa0)) return 3; } else if (c < 0xf8) { if (n >= 4 && (s[1] ^ 0x80) < 0x40 && (s[2] ^ 0x80) < 0x40 && (s[3] ^ 0x80) < 0x40 && (c >= 0xf1 || s[1] >= 0x90) && (c < 0xf4 || (c == 0xf4 && s[1] < 0x90))) return 4; } } } /* invalid or incomplete multibyte character */ return -1; } pspp-1.4.1/gl/unistr/u8-strmbtouc.c0000644000175000017500000000447713723215640016600 0ustar00blpblp00000000000000/* Look at first character in UTF-8 string. Copyright (C) 1999-2000, 2002, 2006-2007, 2009-2020 Free Software Foundation, Inc. Written by Bruno Haible , 2002. 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 3 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, see . */ #include /* Specification. */ #include "unistr.h" int u8_strmbtouc (ucs4_t *puc, const uint8_t *s) { /* Keep in sync with unistr.h and u8-mbtouc-aux.c. */ uint8_t c = *s; if (c < 0x80) { *puc = c; return (c != 0 ? 1 : 0); } if (c >= 0xc2) { if (c < 0xe0) { if ((s[1] ^ 0x80) < 0x40) { *puc = ((unsigned int) (c & 0x1f) << 6) | (unsigned int) (s[1] ^ 0x80); return 2; } } else if (c < 0xf0) { if ((s[1] ^ 0x80) < 0x40 && (s[2] ^ 0x80) < 0x40 && (c >= 0xe1 || s[1] >= 0xa0) && (c != 0xed || s[1] < 0xa0)) { *puc = ((unsigned int) (c & 0x0f) << 12) | ((unsigned int) (s[1] ^ 0x80) << 6) | (unsigned int) (s[2] ^ 0x80); return 3; } } else if (c < 0xf8) { if ((s[1] ^ 0x80) < 0x40 && (s[2] ^ 0x80) < 0x40 && (s[3] ^ 0x80) < 0x40 && (c >= 0xf1 || s[1] >= 0x90) && (c < 0xf4 || (c == 0xf4 && s[1] < 0x90))) { *puc = ((unsigned int) (c & 0x07) << 18) | ((unsigned int) (s[1] ^ 0x80) << 12) | ((unsigned int) (s[2] ^ 0x80) << 6) | (unsigned int) (s[3] ^ 0x80); return 4; } } } /* invalid or incomplete multibyte character */ return -1; } pspp-1.4.1/gl/unistr/u8-mbtouc-unsafe.c0000644000175000017500000001110313723215640017306 0ustar00blpblp00000000000000/* Look at first character in UTF-8 string. Copyright (C) 1999-2002, 2006-2007, 2009-2020 Free Software Foundation, Inc. Written by Bruno Haible , 2001. 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 3 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, see . */ #include #if defined IN_LIBUNISTRING /* Tell unistr.h to declare u8_mbtouc_unsafe as 'extern', not 'static inline'. */ # include "unistring-notinline.h" #endif /* Specification. */ #include "unistr.h" #if !HAVE_INLINE int u8_mbtouc_unsafe (ucs4_t *puc, const uint8_t *s, size_t n) { uint8_t c = *s; if (c < 0x80) { *puc = c; return 1; } else if (c >= 0xc2) { if (c < 0xe0) { if (n >= 2) { if ((s[1] ^ 0x80) < 0x40) { *puc = ((unsigned int) (c & 0x1f) << 6) | (unsigned int) (s[1] ^ 0x80); return 2; } /* invalid multibyte character */ } else { /* incomplete multibyte character */ *puc = 0xfffd; return 1; } } else if (c < 0xf0) { if (n >= 3) { if ((s[1] ^ 0x80) < 0x40) { if ((s[2] ^ 0x80) < 0x40) { if ((c >= 0xe1 || s[1] >= 0xa0) && (c != 0xed || s[1] < 0xa0)) { *puc = ((unsigned int) (c & 0x0f) << 12) | ((unsigned int) (s[1] ^ 0x80) << 6) | (unsigned int) (s[2] ^ 0x80); return 3; } /* invalid multibyte character */ *puc = 0xfffd; return 3; } /* invalid multibyte character */ *puc = 0xfffd; return 2; } /* invalid multibyte character */ } else { /* incomplete multibyte character */ *puc = 0xfffd; if (n == 1 || (s[1] ^ 0x80) >= 0x40) return 1; else return 2; } } else if (c < 0xf8) { if (n >= 4) { if ((s[1] ^ 0x80) < 0x40) { if ((s[2] ^ 0x80) < 0x40) { if ((s[3] ^ 0x80) < 0x40) { if ((c >= 0xf1 || s[1] >= 0x90) && (c < 0xf4 || (c == 0xf4 && s[1] < 0x90)) ) { *puc = ((unsigned int) (c & 0x07) << 18) | ((unsigned int) (s[1] ^ 0x80) << 12) | ((unsigned int) (s[2] ^ 0x80) << 6) | (unsigned int) (s[3] ^ 0x80); return 4; } /* invalid multibyte character */ *puc = 0xfffd; return 4; } /* invalid multibyte character */ *puc = 0xfffd; return 3; } /* invalid multibyte character */ *puc = 0xfffd; return 2; } /* invalid multibyte character */ } else { /* incomplete multibyte character */ *puc = 0xfffd; if (n == 1 || (s[1] ^ 0x80) >= 0x40) return 1; else if (n == 2 || (s[2] ^ 0x80) >= 0x40) return 2; else return 3; } } } /* invalid multibyte character */ *puc = 0xfffd; return 1; } #endif pspp-1.4.1/gl/unistr/u8-mbtoucr.c0000644000175000017500000001073513723215640016223 0ustar00blpblp00000000000000/* Look at first character in UTF-8 string, returning an error code. Copyright (C) 1999-2002, 2006-2007, 2009-2020 Free Software Foundation, Inc. Written by Bruno Haible , 2001. 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 3 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, see . */ #include /* Specification. */ #include "unistr.h" int u8_mbtoucr (ucs4_t *puc, const uint8_t *s, size_t n) { uint8_t c = *s; if (c < 0x80) { *puc = c; return 1; } else if (c >= 0xc2) { if (c < 0xe0) { if (n >= 2) { if ((s[1] ^ 0x80) < 0x40) { *puc = ((unsigned int) (c & 0x1f) << 6) | (unsigned int) (s[1] ^ 0x80); return 2; } /* invalid multibyte character */ } else { /* incomplete multibyte character */ *puc = 0xfffd; return -2; } } else if (c < 0xf0) { if (n >= 2) { if ((s[1] ^ 0x80) < 0x40 && (c >= 0xe1 || s[1] >= 0xa0) && (c != 0xed || s[1] < 0xa0)) { if (n >= 3) { if ((s[2] ^ 0x80) < 0x40) { *puc = ((unsigned int) (c & 0x0f) << 12) | ((unsigned int) (s[1] ^ 0x80) << 6) | (unsigned int) (s[2] ^ 0x80); return 3; } /* invalid multibyte character */ } else { /* incomplete multibyte character */ *puc = 0xfffd; return -2; } } /* invalid multibyte character */ } else { /* incomplete multibyte character */ *puc = 0xfffd; return -2; } } else if (c < 0xf8) { if (n >= 2) { if ((s[1] ^ 0x80) < 0x40 && (c >= 0xf1 || s[1] >= 0x90) && (c < 0xf4 || (c == 0xf4 && s[1] < 0x90))) { if (n >= 3) { if ((s[2] ^ 0x80) < 0x40) { if (n >= 4) { if ((s[3] ^ 0x80) < 0x40) { *puc = ((unsigned int) (c & 0x07) << 18) | ((unsigned int) (s[1] ^ 0x80) << 12) | ((unsigned int) (s[2] ^ 0x80) << 6) | (unsigned int) (s[3] ^ 0x80); return 4; } /* invalid multibyte character */ } else { /* incomplete multibyte character */ *puc = 0xfffd; return -2; } } /* invalid multibyte character */ } else { /* incomplete multibyte character */ *puc = 0xfffd; return -2; } } /* invalid multibyte character */ } else { /* incomplete multibyte character */ *puc = 0xfffd; return -2; } } } /* invalid multibyte character */ *puc = 0xfffd; return -1; } pspp-1.4.1/gl/unistr/u8-mbtouc-aux.c0000644000175000017500000001052113723215640016625 0ustar00blpblp00000000000000/* Conversion UTF-8 to UCS-4. Copyright (C) 2001-2002, 2006-2007, 2009-2020 Free Software Foundation, Inc. Written by Bruno Haible , 2001. 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 3 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, see . */ #include /* Specification. */ #include "unistr.h" #if defined IN_LIBUNISTRING || HAVE_INLINE int u8_mbtouc_aux (ucs4_t *puc, const uint8_t *s, size_t n) { uint8_t c = *s; if (c >= 0xc2) { if (c < 0xe0) { if (n >= 2) { if ((s[1] ^ 0x80) < 0x40) { *puc = ((unsigned int) (c & 0x1f) << 6) | (unsigned int) (s[1] ^ 0x80); return 2; } /* invalid multibyte character */ } else { /* incomplete multibyte character */ *puc = 0xfffd; return 1; } } else if (c < 0xf0) { if (n >= 3) { if ((s[1] ^ 0x80) < 0x40) { if ((s[2] ^ 0x80) < 0x40) { if ((c >= 0xe1 || s[1] >= 0xa0) && (c != 0xed || s[1] < 0xa0)) { *puc = ((unsigned int) (c & 0x0f) << 12) | ((unsigned int) (s[1] ^ 0x80) << 6) | (unsigned int) (s[2] ^ 0x80); return 3; } /* invalid multibyte character */ *puc = 0xfffd; return 3; } /* invalid multibyte character */ *puc = 0xfffd; return 2; } /* invalid multibyte character */ } else { /* incomplete multibyte character */ *puc = 0xfffd; if (n == 1 || (s[1] ^ 0x80) >= 0x40) return 1; else return 2; } } else if (c < 0xf8) { if (n >= 4) { if ((s[1] ^ 0x80) < 0x40) { if ((s[2] ^ 0x80) < 0x40) { if ((s[3] ^ 0x80) < 0x40) { if ((c >= 0xf1 || s[1] >= 0x90) && (c < 0xf4 || (c == 0xf4 && s[1] < 0x90))) { *puc = ((unsigned int) (c & 0x07) << 18) | ((unsigned int) (s[1] ^ 0x80) << 12) | ((unsigned int) (s[2] ^ 0x80) << 6) | (unsigned int) (s[3] ^ 0x80); return 4; } /* invalid multibyte character */ *puc = 0xfffd; return 4; } /* invalid multibyte character */ *puc = 0xfffd; return 3; } /* invalid multibyte character */ *puc = 0xfffd; return 2; } /* invalid multibyte character */ } else { /* incomplete multibyte character */ *puc = 0xfffd; if (n == 1 || (s[1] ^ 0x80) >= 0x40) return 1; else if (n == 2 || (s[2] ^ 0x80) >= 0x40) return 2; else return 3; } } } /* invalid multibyte character */ *puc = 0xfffd; return 1; } #endif pspp-1.4.1/gl/unistr/u8-cmp2.c0000644000175000017500000000170313723215640015404 0ustar00blpblp00000000000000/* Compare pieces of UTF-8 strings. Copyright (C) 2009-2020 Free Software Foundation, Inc. Written by Bruno Haible , 2009. 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 3 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, see . */ #include /* Specification. */ #include "unistr.h" #include "minmax.h" #define FUNC u8_cmp2 #define UNIT uint8_t #define U_CMP u8_cmp #include "u-cmp2.h" pspp-1.4.1/gl/unistr/u8-cmp.c0000644000175000017500000000212113723215640015315 0ustar00blpblp00000000000000/* Compare pieces of UTF-8 strings. Copyright (C) 2002, 2006, 2009-2020 Free Software Foundation, Inc. Written by Bruno Haible , 2002. 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 3 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, see . */ #include /* Specification. */ #include "unistr.h" #include int u8_cmp (const uint8_t *s1, const uint8_t *s2, size_t n) { /* Use the fact that the UTF-8 encoding preserves lexicographic order. */ return n == 0 ? 0 : memcmp ((const char *) s1, (const char *) s2, n); } pspp-1.4.1/gl/unistr/u8-uctomb-aux.c0000644000175000017500000000317313723215640016632 0ustar00blpblp00000000000000/* Conversion UCS-4 to UTF-8. Copyright (C) 2002, 2006-2007, 2009-2020 Free Software Foundation, Inc. Written by Bruno Haible , 2002. 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 3 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, see . */ #include /* Specification. */ #include "unistr.h" #include "attribute.h" int u8_uctomb_aux (uint8_t *s, ucs4_t uc, int n) { int count; if (uc < 0x80) /* The case n >= 1 is already handled by the caller. */ return -2; else if (uc < 0x800) count = 2; else if (uc < 0x10000) { if (uc < 0xd800 || uc >= 0xe000) count = 3; else return -1; } else if (uc < 0x110000) count = 4; else return -1; if (n < count) return -2; switch (count) /* note: code falls through cases! */ { case 4: s[3] = 0x80 | (uc & 0x3f); uc = uc >> 6; uc |= 0x10000; FALLTHROUGH; case 3: s[2] = 0x80 | (uc & 0x3f); uc = uc >> 6; uc |= 0x800; FALLTHROUGH; case 2: s[1] = 0x80 | (uc & 0x3f); uc = uc >> 6; uc |= 0xc0; /*case 1:*/ s[0] = uc; } return count; } pspp-1.4.1/gl/allocator.h0000644000175000017500000000422313723215636014657 0ustar00blpblp00000000000000/* Memory allocators such as malloc+free. Copyright (C) 2011-2020 Free Software Foundation, Inc. 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 3 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, see . */ /* Written by Paul Eggert. */ #ifndef _GL_ALLOCATOR_H #define _GL_ALLOCATOR_H #include /* An object describing a memory allocator family. */ struct allocator { /* Do not use GCC attributes such as __attribute__ ((malloc)) with the function types pointed at by these members, because these attributes do not work with pointers to functions. See . */ /* Call ALLOCATE to allocate memory, like 'malloc'. On failure ALLOCATE should return NULL, though not necessarily set errno. When given a zero size it may return NULL even if successful. */ void *(*allocate) (size_t); /* If nonnull, call REALLOCATE to reallocate memory, like 'realloc'. On failure REALLOCATE should return NULL, though not necessarily set errno. When given a zero size it may return NULL even if successful. */ void *(*reallocate) (void *, size_t); /* Call FREE to free memory, like 'free'. */ void (*free) (void *); /* If nonnull, call DIE (SIZE) if MALLOC (SIZE) or REALLOC (..., SIZE) fails. DIE should not return. SIZE should equal SIZE_MAX if size_t overflow was detected while calculating sizes to be passed to MALLOC or REALLOC. */ void (*die) (size_t); }; /* An allocator using the stdlib functions and a null DIE function. */ extern struct allocator const stdlib_allocator; #endif /* _GL_ALLOCATOR_H */ pspp-1.4.1/gl/regexec.c0000644000175000017500000037555013723215640014325 0ustar00blpblp00000000000000/* Extended regular expression matching and search library. Copyright (C) 2002-2020 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Isamu Hasegawa . The GNU C Library 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 3 of the License, or (at your option) any later version. The GNU C Library 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 the GNU C Library; if not, see . */ static reg_errcode_t match_ctx_init (re_match_context_t *cache, int eflags, Idx n); static void match_ctx_clean (re_match_context_t *mctx); static void match_ctx_free (re_match_context_t *cache); static reg_errcode_t match_ctx_add_entry (re_match_context_t *cache, Idx node, Idx str_idx, Idx from, Idx to); static Idx search_cur_bkref_entry (const re_match_context_t *mctx, Idx str_idx); static reg_errcode_t match_ctx_add_subtop (re_match_context_t *mctx, Idx node, Idx str_idx); static re_sub_match_last_t * match_ctx_add_sublast (re_sub_match_top_t *subtop, Idx node, Idx str_idx); static void sift_ctx_init (re_sift_context_t *sctx, re_dfastate_t **sifted_sts, re_dfastate_t **limited_sts, Idx last_node, Idx last_str_idx); static reg_errcode_t re_search_internal (const regex_t *preg, const char *string, Idx length, Idx start, Idx last_start, Idx stop, size_t nmatch, regmatch_t pmatch[], int eflags); static regoff_t re_search_2_stub (struct re_pattern_buffer *bufp, const char *string1, Idx length1, const char *string2, Idx length2, Idx start, regoff_t range, struct re_registers *regs, Idx stop, bool ret_len); static regoff_t re_search_stub (struct re_pattern_buffer *bufp, const char *string, Idx length, Idx start, regoff_t range, Idx stop, struct re_registers *regs, bool ret_len); static unsigned re_copy_regs (struct re_registers *regs, regmatch_t *pmatch, Idx nregs, int regs_allocated); static reg_errcode_t prune_impossible_nodes (re_match_context_t *mctx); static Idx check_matching (re_match_context_t *mctx, bool fl_longest_match, Idx *p_match_first); static Idx check_halt_state_context (const re_match_context_t *mctx, const re_dfastate_t *state, Idx idx); static void update_regs (const re_dfa_t *dfa, regmatch_t *pmatch, regmatch_t *prev_idx_match, Idx cur_node, Idx cur_idx, Idx nmatch); static reg_errcode_t push_fail_stack (struct re_fail_stack_t *fs, Idx str_idx, Idx dest_node, Idx nregs, regmatch_t *regs, re_node_set *eps_via_nodes); static reg_errcode_t set_regs (const regex_t *preg, const re_match_context_t *mctx, size_t nmatch, regmatch_t *pmatch, bool fl_backtrack); static reg_errcode_t free_fail_stack_return (struct re_fail_stack_t *fs); #ifdef RE_ENABLE_I18N static int sift_states_iter_mb (const re_match_context_t *mctx, re_sift_context_t *sctx, Idx node_idx, Idx str_idx, Idx max_str_idx); #endif /* RE_ENABLE_I18N */ static reg_errcode_t sift_states_backward (const re_match_context_t *mctx, re_sift_context_t *sctx); static reg_errcode_t build_sifted_states (const re_match_context_t *mctx, re_sift_context_t *sctx, Idx str_idx, re_node_set *cur_dest); static reg_errcode_t update_cur_sifted_state (const re_match_context_t *mctx, re_sift_context_t *sctx, Idx str_idx, re_node_set *dest_nodes); static reg_errcode_t add_epsilon_src_nodes (const re_dfa_t *dfa, re_node_set *dest_nodes, const re_node_set *candidates); static bool check_dst_limits (const re_match_context_t *mctx, const re_node_set *limits, Idx dst_node, Idx dst_idx, Idx src_node, Idx src_idx); static int check_dst_limits_calc_pos_1 (const re_match_context_t *mctx, int boundaries, Idx subexp_idx, Idx from_node, Idx bkref_idx); static int check_dst_limits_calc_pos (const re_match_context_t *mctx, Idx limit, Idx subexp_idx, Idx node, Idx str_idx, Idx bkref_idx); static reg_errcode_t check_subexp_limits (const re_dfa_t *dfa, re_node_set *dest_nodes, const re_node_set *candidates, re_node_set *limits, struct re_backref_cache_entry *bkref_ents, Idx str_idx); static reg_errcode_t sift_states_bkref (const re_match_context_t *mctx, re_sift_context_t *sctx, Idx str_idx, const re_node_set *candidates); static reg_errcode_t merge_state_array (const re_dfa_t *dfa, re_dfastate_t **dst, re_dfastate_t **src, Idx num); static re_dfastate_t *find_recover_state (reg_errcode_t *err, re_match_context_t *mctx); static re_dfastate_t *transit_state (reg_errcode_t *err, re_match_context_t *mctx, re_dfastate_t *state); static re_dfastate_t *merge_state_with_log (reg_errcode_t *err, re_match_context_t *mctx, re_dfastate_t *next_state); static reg_errcode_t check_subexp_matching_top (re_match_context_t *mctx, re_node_set *cur_nodes, Idx str_idx); #if 0 static re_dfastate_t *transit_state_sb (reg_errcode_t *err, re_match_context_t *mctx, re_dfastate_t *pstate); #endif #ifdef RE_ENABLE_I18N static reg_errcode_t transit_state_mb (re_match_context_t *mctx, re_dfastate_t *pstate); #endif /* RE_ENABLE_I18N */ static reg_errcode_t transit_state_bkref (re_match_context_t *mctx, const re_node_set *nodes); static reg_errcode_t get_subexp (re_match_context_t *mctx, Idx bkref_node, Idx bkref_str_idx); static reg_errcode_t get_subexp_sub (re_match_context_t *mctx, const re_sub_match_top_t *sub_top, re_sub_match_last_t *sub_last, Idx bkref_node, Idx bkref_str); static Idx find_subexp_node (const re_dfa_t *dfa, const re_node_set *nodes, Idx subexp_idx, int type); static reg_errcode_t check_arrival (re_match_context_t *mctx, state_array_t *path, Idx top_node, Idx top_str, Idx last_node, Idx last_str, int type); static reg_errcode_t check_arrival_add_next_nodes (re_match_context_t *mctx, Idx str_idx, re_node_set *cur_nodes, re_node_set *next_nodes); static reg_errcode_t check_arrival_expand_ecl (const re_dfa_t *dfa, re_node_set *cur_nodes, Idx ex_subexp, int type); static reg_errcode_t check_arrival_expand_ecl_sub (const re_dfa_t *dfa, re_node_set *dst_nodes, Idx target, Idx ex_subexp, int type); static reg_errcode_t expand_bkref_cache (re_match_context_t *mctx, re_node_set *cur_nodes, Idx cur_str, Idx subexp_num, int type); static bool build_trtable (const re_dfa_t *dfa, re_dfastate_t *state); #ifdef RE_ENABLE_I18N static int check_node_accept_bytes (const re_dfa_t *dfa, Idx node_idx, const re_string_t *input, Idx idx); # ifdef _LIBC static unsigned int find_collation_sequence_value (const unsigned char *mbs, size_t name_len); # endif /* _LIBC */ #endif /* RE_ENABLE_I18N */ static Idx group_nodes_into_DFAstates (const re_dfa_t *dfa, const re_dfastate_t *state, re_node_set *states_node, bitset_t *states_ch); static bool check_node_accept (const re_match_context_t *mctx, const re_token_t *node, Idx idx); static reg_errcode_t extend_buffers (re_match_context_t *mctx, int min_len); /* Entry point for POSIX code. */ /* regexec searches for a given pattern, specified by PREG, in the string STRING. If NMATCH is zero or REG_NOSUB was set in the cflags argument to 'regcomp', we ignore PMATCH. Otherwise, we assume PMATCH has at least NMATCH elements, and we set them to the offsets of the corresponding matched substrings. EFLAGS specifies "execution flags" which affect matching: if REG_NOTBOL is set, then ^ does not match at the beginning of the string; if REG_NOTEOL is set, then $ does not match at the end. We return 0 if we find a match and REG_NOMATCH if not. */ int regexec (const regex_t *__restrict preg, const char *__restrict string, size_t nmatch, regmatch_t pmatch[], int eflags) { reg_errcode_t err; Idx start, length; re_dfa_t *dfa = preg->buffer; if (eflags & ~(REG_NOTBOL | REG_NOTEOL | REG_STARTEND)) return REG_BADPAT; if (eflags & REG_STARTEND) { start = pmatch[0].rm_so; length = pmatch[0].rm_eo; } else { start = 0; length = strlen (string); } lock_lock (dfa->lock); if (preg->no_sub) err = re_search_internal (preg, string, length, start, length, length, 0, NULL, eflags); else err = re_search_internal (preg, string, length, start, length, length, nmatch, pmatch, eflags); lock_unlock (dfa->lock); return err != REG_NOERROR; } #ifdef _LIBC libc_hidden_def (__regexec) # include versioned_symbol (libc, __regexec, regexec, GLIBC_2_3_4); # if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_3_4) __typeof__ (__regexec) __compat_regexec; int attribute_compat_text_section __compat_regexec (const regex_t *__restrict preg, const char *__restrict string, size_t nmatch, regmatch_t pmatch[], int eflags) { return regexec (preg, string, nmatch, pmatch, eflags & (REG_NOTBOL | REG_NOTEOL)); } compat_symbol (libc, __compat_regexec, regexec, GLIBC_2_0); # endif #endif /* Entry points for GNU code. */ /* re_match, re_search, re_match_2, re_search_2 The former two functions operate on STRING with length LENGTH, while the later two operate on concatenation of STRING1 and STRING2 with lengths LENGTH1 and LENGTH2, respectively. re_match() matches the compiled pattern in BUFP against the string, starting at index START. re_search() first tries matching at index START, then it tries to match starting from index START + 1, and so on. The last start position tried is START + RANGE. (Thus RANGE = 0 forces re_search to operate the same way as re_match().) The parameter STOP of re_{match,search}_2 specifies that no match exceeding the first STOP characters of the concatenation of the strings should be concerned. If REGS is not NULL, and BUFP->no_sub is not set, the offsets of the match and all groups is stored in REGS. (For the "_2" variants, the offsets are computed relative to the concatenation, not relative to the individual strings.) On success, re_match* functions return the length of the match, re_search* return the position of the start of the match. Return value -1 means no match was found and -2 indicates an internal error. */ regoff_t re_match (struct re_pattern_buffer *bufp, const char *string, Idx length, Idx start, struct re_registers *regs) { return re_search_stub (bufp, string, length, start, 0, length, regs, true); } #ifdef _LIBC weak_alias (__re_match, re_match) #endif regoff_t re_search (struct re_pattern_buffer *bufp, const char *string, Idx length, Idx start, regoff_t range, struct re_registers *regs) { return re_search_stub (bufp, string, length, start, range, length, regs, false); } #ifdef _LIBC weak_alias (__re_search, re_search) #endif regoff_t re_match_2 (struct re_pattern_buffer *bufp, const char *string1, Idx length1, const char *string2, Idx length2, Idx start, struct re_registers *regs, Idx stop) { return re_search_2_stub (bufp, string1, length1, string2, length2, start, 0, regs, stop, true); } #ifdef _LIBC weak_alias (__re_match_2, re_match_2) #endif regoff_t re_search_2 (struct re_pattern_buffer *bufp, const char *string1, Idx length1, const char *string2, Idx length2, Idx start, regoff_t range, struct re_registers *regs, Idx stop) { return re_search_2_stub (bufp, string1, length1, string2, length2, start, range, regs, stop, false); } #ifdef _LIBC weak_alias (__re_search_2, re_search_2) #endif static regoff_t re_search_2_stub (struct re_pattern_buffer *bufp, const char *string1, Idx length1, const char *string2, Idx length2, Idx start, regoff_t range, struct re_registers *regs, Idx stop, bool ret_len) { const char *str; regoff_t rval; Idx len; char *s = NULL; if (__glibc_unlikely ((length1 < 0 || length2 < 0 || stop < 0 || INT_ADD_WRAPV (length1, length2, &len)))) return -2; /* Concatenate the strings. */ if (length2 > 0) if (length1 > 0) { s = re_malloc (char, len); if (__glibc_unlikely (s == NULL)) return -2; #ifdef _LIBC memcpy (__mempcpy (s, string1, length1), string2, length2); #else memcpy (s, string1, length1); memcpy (s + length1, string2, length2); #endif str = s; } else str = string2; else str = string1; rval = re_search_stub (bufp, str, len, start, range, stop, regs, ret_len); re_free (s); return rval; } /* The parameters have the same meaning as those of re_search. Additional parameters: If RET_LEN is true the length of the match is returned (re_match style); otherwise the position of the match is returned. */ static regoff_t re_search_stub (struct re_pattern_buffer *bufp, const char *string, Idx length, Idx start, regoff_t range, Idx stop, struct re_registers *regs, bool ret_len) { reg_errcode_t result; regmatch_t *pmatch; Idx nregs; regoff_t rval; int eflags = 0; re_dfa_t *dfa = bufp->buffer; Idx last_start = start + range; /* Check for out-of-range. */ if (__glibc_unlikely (start < 0 || start > length)) return -1; if (__glibc_unlikely (length < last_start || (0 <= range && last_start < start))) last_start = length; else if (__glibc_unlikely (last_start < 0 || (range < 0 && start <= last_start))) last_start = 0; lock_lock (dfa->lock); eflags |= (bufp->not_bol) ? REG_NOTBOL : 0; eflags |= (bufp->not_eol) ? REG_NOTEOL : 0; /* Compile fastmap if we haven't yet. */ if (start < last_start && bufp->fastmap != NULL && !bufp->fastmap_accurate) re_compile_fastmap (bufp); if (__glibc_unlikely (bufp->no_sub)) regs = NULL; /* We need at least 1 register. */ if (regs == NULL) nregs = 1; else if (__glibc_unlikely (bufp->regs_allocated == REGS_FIXED && regs->num_regs <= bufp->re_nsub)) { nregs = regs->num_regs; if (__glibc_unlikely (nregs < 1)) { /* Nothing can be copied to regs. */ regs = NULL; nregs = 1; } } else nregs = bufp->re_nsub + 1; pmatch = re_malloc (regmatch_t, nregs); if (__glibc_unlikely (pmatch == NULL)) { rval = -2; goto out; } result = re_search_internal (bufp, string, length, start, last_start, stop, nregs, pmatch, eflags); rval = 0; /* I hope we needn't fill their regs with -1's when no match was found. */ if (result != REG_NOERROR) rval = result == REG_NOMATCH ? -1 : -2; else if (regs != NULL) { /* If caller wants register contents data back, copy them. */ bufp->regs_allocated = re_copy_regs (regs, pmatch, nregs, bufp->regs_allocated); if (__glibc_unlikely (bufp->regs_allocated == REGS_UNALLOCATED)) rval = -2; } if (__glibc_likely (rval == 0)) { if (ret_len) { DEBUG_ASSERT (pmatch[0].rm_so == start); rval = pmatch[0].rm_eo - start; } else rval = pmatch[0].rm_so; } re_free (pmatch); out: lock_unlock (dfa->lock); return rval; } static unsigned re_copy_regs (struct re_registers *regs, regmatch_t *pmatch, Idx nregs, int regs_allocated) { int rval = REGS_REALLOCATE; Idx i; Idx need_regs = nregs + 1; /* We need one extra element beyond 'num_regs' for the '-1' marker GNU code uses. */ /* Have the register data arrays been allocated? */ if (regs_allocated == REGS_UNALLOCATED) { /* No. So allocate them with malloc. */ regs->start = re_malloc (regoff_t, need_regs); if (__glibc_unlikely (regs->start == NULL)) return REGS_UNALLOCATED; regs->end = re_malloc (regoff_t, need_regs); if (__glibc_unlikely (regs->end == NULL)) { re_free (regs->start); return REGS_UNALLOCATED; } regs->num_regs = need_regs; } else if (regs_allocated == REGS_REALLOCATE) { /* Yes. If we need more elements than were already allocated, reallocate them. If we need fewer, just leave it alone. */ if (__glibc_unlikely (need_regs > regs->num_regs)) { regoff_t *new_start = re_realloc (regs->start, regoff_t, need_regs); regoff_t *new_end; if (__glibc_unlikely (new_start == NULL)) return REGS_UNALLOCATED; new_end = re_realloc (regs->end, regoff_t, need_regs); if (__glibc_unlikely (new_end == NULL)) { re_free (new_start); return REGS_UNALLOCATED; } regs->start = new_start; regs->end = new_end; regs->num_regs = need_regs; } } else { DEBUG_ASSERT (regs_allocated == REGS_FIXED); /* This function may not be called with REGS_FIXED and nregs too big. */ DEBUG_ASSERT (nregs <= regs->num_regs); rval = REGS_FIXED; } /* Copy the regs. */ for (i = 0; i < nregs; ++i) { regs->start[i] = pmatch[i].rm_so; regs->end[i] = pmatch[i].rm_eo; } for ( ; i < regs->num_regs; ++i) regs->start[i] = regs->end[i] = -1; return rval; } /* Set REGS to hold NUM_REGS registers, storing them in STARTS and ENDS. Subsequent matches using PATTERN_BUFFER and REGS will use this memory for recording register information. STARTS and ENDS must be allocated using the malloc library routine, and must each be at least NUM_REGS * sizeof (regoff_t) bytes long. If NUM_REGS == 0, then subsequent matches should allocate their own register data. Unless this function is called, the first search or match using PATTERN_BUFFER will allocate its own register data, without freeing the old data. */ void re_set_registers (struct re_pattern_buffer *bufp, struct re_registers *regs, __re_size_t num_regs, regoff_t *starts, regoff_t *ends) { if (num_regs) { bufp->regs_allocated = REGS_REALLOCATE; regs->num_regs = num_regs; regs->start = starts; regs->end = ends; } else { bufp->regs_allocated = REGS_UNALLOCATED; regs->num_regs = 0; regs->start = regs->end = NULL; } } #ifdef _LIBC weak_alias (__re_set_registers, re_set_registers) #endif /* Entry points compatible with 4.2 BSD regex library. We don't define them unless specifically requested. */ #if defined _REGEX_RE_COMP || defined _LIBC int # ifdef _LIBC weak_function # endif re_exec (const char *s) { return 0 == regexec (&re_comp_buf, s, 0, NULL, 0); } #endif /* _REGEX_RE_COMP */ /* Internal entry point. */ /* Searches for a compiled pattern PREG in the string STRING, whose length is LENGTH. NMATCH, PMATCH, and EFLAGS have the same meaning as with regexec. LAST_START is START + RANGE, where START and RANGE have the same meaning as with re_search. Return REG_NOERROR if we find a match, and REG_NOMATCH if not, otherwise return the error code. Note: We assume front end functions already check ranges. (0 <= LAST_START && LAST_START <= LENGTH) */ static reg_errcode_t __attribute_warn_unused_result__ re_search_internal (const regex_t *preg, const char *string, Idx length, Idx start, Idx last_start, Idx stop, size_t nmatch, regmatch_t pmatch[], int eflags) { reg_errcode_t err; const re_dfa_t *dfa = preg->buffer; Idx left_lim, right_lim; int incr; bool fl_longest_match; int match_kind; Idx match_first; Idx match_last = -1; Idx extra_nmatch; bool sb; int ch; re_match_context_t mctx = { .dfa = dfa }; char *fastmap = ((preg->fastmap != NULL && preg->fastmap_accurate && start != last_start && !preg->can_be_null) ? preg->fastmap : NULL); RE_TRANSLATE_TYPE t = preg->translate; extra_nmatch = (nmatch > preg->re_nsub) ? nmatch - (preg->re_nsub + 1) : 0; nmatch -= extra_nmatch; /* Check if the DFA haven't been compiled. */ if (__glibc_unlikely (preg->used == 0 || dfa->init_state == NULL || dfa->init_state_word == NULL || dfa->init_state_nl == NULL || dfa->init_state_begbuf == NULL)) return REG_NOMATCH; /* We assume front-end functions already check them. */ DEBUG_ASSERT (0 <= last_start && last_start <= length); /* If initial states with non-begbuf contexts have no elements, the regex must be anchored. If preg->newline_anchor is set, we'll never use init_state_nl, so do not check it. */ if (dfa->init_state->nodes.nelem == 0 && dfa->init_state_word->nodes.nelem == 0 && (dfa->init_state_nl->nodes.nelem == 0 || !preg->newline_anchor)) { if (start != 0 && last_start != 0) return REG_NOMATCH; start = last_start = 0; } /* We must check the longest matching, if nmatch > 0. */ fl_longest_match = (nmatch != 0 || dfa->nbackref); err = re_string_allocate (&mctx.input, string, length, dfa->nodes_len + 1, preg->translate, (preg->syntax & RE_ICASE) != 0, dfa); if (__glibc_unlikely (err != REG_NOERROR)) goto free_return; mctx.input.stop = stop; mctx.input.raw_stop = stop; mctx.input.newline_anchor = preg->newline_anchor; err = match_ctx_init (&mctx, eflags, dfa->nbackref * 2); if (__glibc_unlikely (err != REG_NOERROR)) goto free_return; /* We will log all the DFA states through which the dfa pass, if nmatch > 1, or this dfa has "multibyte node", which is a back-reference or a node which can accept multibyte character or multi character collating element. */ if (nmatch > 1 || dfa->has_mb_node) { /* Avoid overflow. */ if (__glibc_unlikely ((MIN (IDX_MAX, SIZE_MAX / sizeof (re_dfastate_t *)) <= mctx.input.bufs_len))) { err = REG_ESPACE; goto free_return; } mctx.state_log = re_malloc (re_dfastate_t *, mctx.input.bufs_len + 1); if (__glibc_unlikely (mctx.state_log == NULL)) { err = REG_ESPACE; goto free_return; } } match_first = start; mctx.input.tip_context = (eflags & REG_NOTBOL) ? CONTEXT_BEGBUF : CONTEXT_NEWLINE | CONTEXT_BEGBUF; /* Check incrementally whether the input string matches. */ incr = (last_start < start) ? -1 : 1; left_lim = (last_start < start) ? last_start : start; right_lim = (last_start < start) ? start : last_start; sb = dfa->mb_cur_max == 1; match_kind = (fastmap ? ((sb || !(preg->syntax & RE_ICASE || t) ? 4 : 0) | (start <= last_start ? 2 : 0) | (t != NULL ? 1 : 0)) : 8); for (;; match_first += incr) { err = REG_NOMATCH; if (match_first < left_lim || right_lim < match_first) goto free_return; /* Advance as rapidly as possible through the string, until we find a plausible place to start matching. This may be done with varying efficiency, so there are various possibilities: only the most common of them are specialized, in order to save on code size. We use a switch statement for speed. */ switch (match_kind) { case 8: /* No fastmap. */ break; case 7: /* Fastmap with single-byte translation, match forward. */ while (__glibc_likely (match_first < right_lim) && !fastmap[t[(unsigned char) string[match_first]]]) ++match_first; goto forward_match_found_start_or_reached_end; case 6: /* Fastmap without translation, match forward. */ while (__glibc_likely (match_first < right_lim) && !fastmap[(unsigned char) string[match_first]]) ++match_first; forward_match_found_start_or_reached_end: if (__glibc_unlikely (match_first == right_lim)) { ch = match_first >= length ? 0 : (unsigned char) string[match_first]; if (!fastmap[t ? t[ch] : ch]) goto free_return; } break; case 4: case 5: /* Fastmap without multi-byte translation, match backwards. */ while (match_first >= left_lim) { ch = match_first >= length ? 0 : (unsigned char) string[match_first]; if (fastmap[t ? t[ch] : ch]) break; --match_first; } if (match_first < left_lim) goto free_return; break; default: /* In this case, we can't determine easily the current byte, since it might be a component byte of a multibyte character. Then we use the constructed buffer instead. */ for (;;) { /* If MATCH_FIRST is out of the valid range, reconstruct the buffers. */ __re_size_t offset = match_first - mctx.input.raw_mbs_idx; if (__glibc_unlikely (offset >= (__re_size_t) mctx.input.valid_raw_len)) { err = re_string_reconstruct (&mctx.input, match_first, eflags); if (__glibc_unlikely (err != REG_NOERROR)) goto free_return; offset = match_first - mctx.input.raw_mbs_idx; } /* If MATCH_FIRST is out of the buffer, leave it as '\0'. Note that MATCH_FIRST must not be smaller than 0. */ ch = (match_first >= length ? 0 : re_string_byte_at (&mctx.input, offset)); if (fastmap[ch]) break; match_first += incr; if (match_first < left_lim || match_first > right_lim) { err = REG_NOMATCH; goto free_return; } } break; } /* Reconstruct the buffers so that the matcher can assume that the matching starts from the beginning of the buffer. */ err = re_string_reconstruct (&mctx.input, match_first, eflags); if (__glibc_unlikely (err != REG_NOERROR)) goto free_return; #ifdef RE_ENABLE_I18N /* Don't consider this char as a possible match start if it part, yet isn't the head, of a multibyte character. */ if (!sb && !re_string_first_byte (&mctx.input, 0)) continue; #endif /* It seems to be appropriate one, then use the matcher. */ /* We assume that the matching starts from 0. */ mctx.state_log_top = mctx.nbkref_ents = mctx.max_mb_elem_len = 0; match_last = check_matching (&mctx, fl_longest_match, start <= last_start ? &match_first : NULL); if (match_last != -1) { if (__glibc_unlikely (match_last == -2)) { err = REG_ESPACE; goto free_return; } else { mctx.match_last = match_last; if ((!preg->no_sub && nmatch > 1) || dfa->nbackref) { re_dfastate_t *pstate = mctx.state_log[match_last]; mctx.last_node = check_halt_state_context (&mctx, pstate, match_last); } if ((!preg->no_sub && nmatch > 1 && dfa->has_plural_match) || dfa->nbackref) { err = prune_impossible_nodes (&mctx); if (err == REG_NOERROR) break; if (__glibc_unlikely (err != REG_NOMATCH)) goto free_return; match_last = -1; } else break; /* We found a match. */ } } match_ctx_clean (&mctx); } DEBUG_ASSERT (match_last != -1); DEBUG_ASSERT (err == REG_NOERROR); /* Set pmatch[] if we need. */ if (nmatch > 0) { Idx reg_idx; /* Initialize registers. */ for (reg_idx = 1; reg_idx < nmatch; ++reg_idx) pmatch[reg_idx].rm_so = pmatch[reg_idx].rm_eo = -1; /* Set the points where matching start/end. */ pmatch[0].rm_so = 0; pmatch[0].rm_eo = mctx.match_last; /* FIXME: This function should fail if mctx.match_last exceeds the maximum possible regoff_t value. We need a new error code REG_OVERFLOW. */ if (!preg->no_sub && nmatch > 1) { err = set_regs (preg, &mctx, nmatch, pmatch, dfa->has_plural_match && dfa->nbackref > 0); if (__glibc_unlikely (err != REG_NOERROR)) goto free_return; } /* At last, add the offset to each register, since we slid the buffers so that we could assume that the matching starts from 0. */ for (reg_idx = 0; reg_idx < nmatch; ++reg_idx) if (pmatch[reg_idx].rm_so != -1) { #ifdef RE_ENABLE_I18N if (__glibc_unlikely (mctx.input.offsets_needed != 0)) { pmatch[reg_idx].rm_so = (pmatch[reg_idx].rm_so == mctx.input.valid_len ? mctx.input.valid_raw_len : mctx.input.offsets[pmatch[reg_idx].rm_so]); pmatch[reg_idx].rm_eo = (pmatch[reg_idx].rm_eo == mctx.input.valid_len ? mctx.input.valid_raw_len : mctx.input.offsets[pmatch[reg_idx].rm_eo]); } #else DEBUG_ASSERT (mctx.input.offsets_needed == 0); #endif pmatch[reg_idx].rm_so += match_first; pmatch[reg_idx].rm_eo += match_first; } for (reg_idx = 0; reg_idx < extra_nmatch; ++reg_idx) { pmatch[nmatch + reg_idx].rm_so = -1; pmatch[nmatch + reg_idx].rm_eo = -1; } if (dfa->subexp_map) for (reg_idx = 0; reg_idx + 1 < nmatch; reg_idx++) if (dfa->subexp_map[reg_idx] != reg_idx) { pmatch[reg_idx + 1].rm_so = pmatch[dfa->subexp_map[reg_idx] + 1].rm_so; pmatch[reg_idx + 1].rm_eo = pmatch[dfa->subexp_map[reg_idx] + 1].rm_eo; } } free_return: re_free (mctx.state_log); if (dfa->nbackref) match_ctx_free (&mctx); re_string_destruct (&mctx.input); return err; } static reg_errcode_t __attribute_warn_unused_result__ prune_impossible_nodes (re_match_context_t *mctx) { const re_dfa_t *const dfa = mctx->dfa; Idx halt_node, match_last; reg_errcode_t ret; re_dfastate_t **sifted_states; re_dfastate_t **lim_states = NULL; re_sift_context_t sctx; DEBUG_ASSERT (mctx->state_log != NULL); match_last = mctx->match_last; halt_node = mctx->last_node; /* Avoid overflow. */ if (__glibc_unlikely (MIN (IDX_MAX, SIZE_MAX / sizeof (re_dfastate_t *)) <= match_last)) return REG_ESPACE; sifted_states = re_malloc (re_dfastate_t *, match_last + 1); if (__glibc_unlikely (sifted_states == NULL)) { ret = REG_ESPACE; goto free_return; } if (dfa->nbackref) { lim_states = re_malloc (re_dfastate_t *, match_last + 1); if (__glibc_unlikely (lim_states == NULL)) { ret = REG_ESPACE; goto free_return; } while (1) { memset (lim_states, '\0', sizeof (re_dfastate_t *) * (match_last + 1)); sift_ctx_init (&sctx, sifted_states, lim_states, halt_node, match_last); ret = sift_states_backward (mctx, &sctx); re_node_set_free (&sctx.limits); if (__glibc_unlikely (ret != REG_NOERROR)) goto free_return; if (sifted_states[0] != NULL || lim_states[0] != NULL) break; do { --match_last; if (match_last < 0) { ret = REG_NOMATCH; goto free_return; } } while (mctx->state_log[match_last] == NULL || !mctx->state_log[match_last]->halt); halt_node = check_halt_state_context (mctx, mctx->state_log[match_last], match_last); } ret = merge_state_array (dfa, sifted_states, lim_states, match_last + 1); re_free (lim_states); lim_states = NULL; if (__glibc_unlikely (ret != REG_NOERROR)) goto free_return; } else { sift_ctx_init (&sctx, sifted_states, lim_states, halt_node, match_last); ret = sift_states_backward (mctx, &sctx); re_node_set_free (&sctx.limits); if (__glibc_unlikely (ret != REG_NOERROR)) goto free_return; if (sifted_states[0] == NULL) { ret = REG_NOMATCH; goto free_return; } } re_free (mctx->state_log); mctx->state_log = sifted_states; sifted_states = NULL; mctx->last_node = halt_node; mctx->match_last = match_last; ret = REG_NOERROR; free_return: re_free (sifted_states); re_free (lim_states); return ret; } /* Acquire an initial state and return it. We must select appropriate initial state depending on the context, since initial states may have constraints like "\<", "^", etc.. */ static inline re_dfastate_t * __attribute__ ((always_inline)) acquire_init_state_context (reg_errcode_t *err, const re_match_context_t *mctx, Idx idx) { const re_dfa_t *const dfa = mctx->dfa; if (dfa->init_state->has_constraint) { unsigned int context; context = re_string_context_at (&mctx->input, idx - 1, mctx->eflags); if (IS_WORD_CONTEXT (context)) return dfa->init_state_word; else if (IS_ORDINARY_CONTEXT (context)) return dfa->init_state; else if (IS_BEGBUF_CONTEXT (context) && IS_NEWLINE_CONTEXT (context)) return dfa->init_state_begbuf; else if (IS_NEWLINE_CONTEXT (context)) return dfa->init_state_nl; else if (IS_BEGBUF_CONTEXT (context)) { /* It is relatively rare case, then calculate on demand. */ return re_acquire_state_context (err, dfa, dfa->init_state->entrance_nodes, context); } else /* Must not happen? */ return dfa->init_state; } else return dfa->init_state; } /* Check whether the regular expression match input string INPUT or not, and return the index where the matching end. Return -1 if there is no match, and return -2 in case of an error. FL_LONGEST_MATCH means we want the POSIX longest matching. If P_MATCH_FIRST is not NULL, and the match fails, it is set to the next place where we may want to try matching. Note that the matcher assumes that the matching starts from the current index of the buffer. */ static Idx __attribute_warn_unused_result__ check_matching (re_match_context_t *mctx, bool fl_longest_match, Idx *p_match_first) { const re_dfa_t *const dfa = mctx->dfa; reg_errcode_t err; Idx match = 0; Idx match_last = -1; Idx cur_str_idx = re_string_cur_idx (&mctx->input); re_dfastate_t *cur_state; bool at_init_state = p_match_first != NULL; Idx next_start_idx = cur_str_idx; err = REG_NOERROR; cur_state = acquire_init_state_context (&err, mctx, cur_str_idx); /* An initial state must not be NULL (invalid). */ if (__glibc_unlikely (cur_state == NULL)) { DEBUG_ASSERT (err == REG_ESPACE); return -2; } if (mctx->state_log != NULL) { mctx->state_log[cur_str_idx] = cur_state; /* Check OP_OPEN_SUBEXP in the initial state in case that we use them later. E.g. Processing back references. */ if (__glibc_unlikely (dfa->nbackref)) { at_init_state = false; err = check_subexp_matching_top (mctx, &cur_state->nodes, 0); if (__glibc_unlikely (err != REG_NOERROR)) return err; if (cur_state->has_backref) { err = transit_state_bkref (mctx, &cur_state->nodes); if (__glibc_unlikely (err != REG_NOERROR)) return err; } } } /* If the RE accepts NULL string. */ if (__glibc_unlikely (cur_state->halt)) { if (!cur_state->has_constraint || check_halt_state_context (mctx, cur_state, cur_str_idx)) { if (!fl_longest_match) return cur_str_idx; else { match_last = cur_str_idx; match = 1; } } } while (!re_string_eoi (&mctx->input)) { re_dfastate_t *old_state = cur_state; Idx next_char_idx = re_string_cur_idx (&mctx->input) + 1; if ((__glibc_unlikely (next_char_idx >= mctx->input.bufs_len) && mctx->input.bufs_len < mctx->input.len) || (__glibc_unlikely (next_char_idx >= mctx->input.valid_len) && mctx->input.valid_len < mctx->input.len)) { err = extend_buffers (mctx, next_char_idx + 1); if (__glibc_unlikely (err != REG_NOERROR)) { DEBUG_ASSERT (err == REG_ESPACE); return -2; } } cur_state = transit_state (&err, mctx, cur_state); if (mctx->state_log != NULL) cur_state = merge_state_with_log (&err, mctx, cur_state); if (cur_state == NULL) { /* Reached the invalid state or an error. Try to recover a valid state using the state log, if available and if we have not already found a valid (even if not the longest) match. */ if (__glibc_unlikely (err != REG_NOERROR)) return -2; if (mctx->state_log == NULL || (match && !fl_longest_match) || (cur_state = find_recover_state (&err, mctx)) == NULL) break; } if (__glibc_unlikely (at_init_state)) { if (old_state == cur_state) next_start_idx = next_char_idx; else at_init_state = false; } if (cur_state->halt) { /* Reached a halt state. Check the halt state can satisfy the current context. */ if (!cur_state->has_constraint || check_halt_state_context (mctx, cur_state, re_string_cur_idx (&mctx->input))) { /* We found an appropriate halt state. */ match_last = re_string_cur_idx (&mctx->input); match = 1; /* We found a match, do not modify match_first below. */ p_match_first = NULL; if (!fl_longest_match) break; } } } if (p_match_first) *p_match_first += next_start_idx; return match_last; } /* Check NODE match the current context. */ static bool check_halt_node_context (const re_dfa_t *dfa, Idx node, unsigned int context) { re_token_type_t type = dfa->nodes[node].type; unsigned int constraint = dfa->nodes[node].constraint; if (type != END_OF_RE) return false; if (!constraint) return true; if (NOT_SATISFY_NEXT_CONSTRAINT (constraint, context)) return false; return true; } /* Check the halt state STATE match the current context. Return 0 if not match, if the node, STATE has, is a halt node and match the context, return the node. */ static Idx check_halt_state_context (const re_match_context_t *mctx, const re_dfastate_t *state, Idx idx) { Idx i; unsigned int context; DEBUG_ASSERT (state->halt); context = re_string_context_at (&mctx->input, idx, mctx->eflags); for (i = 0; i < state->nodes.nelem; ++i) if (check_halt_node_context (mctx->dfa, state->nodes.elems[i], context)) return state->nodes.elems[i]; return 0; } /* Compute the next node to which "NFA" transit from NODE("NFA" is a NFA corresponding to the DFA). Return the destination node, and update EPS_VIA_NODES; return -1 in case of errors. */ static Idx proceed_next_node (const re_match_context_t *mctx, Idx nregs, regmatch_t *regs, Idx *pidx, Idx node, re_node_set *eps_via_nodes, struct re_fail_stack_t *fs) { const re_dfa_t *const dfa = mctx->dfa; Idx i; bool ok; if (IS_EPSILON_NODE (dfa->nodes[node].type)) { re_node_set *cur_nodes = &mctx->state_log[*pidx]->nodes; re_node_set *edests = &dfa->edests[node]; Idx dest_node; ok = re_node_set_insert (eps_via_nodes, node); if (__glibc_unlikely (! ok)) return -2; /* Pick up a valid destination, or return -1 if none is found. */ for (dest_node = -1, i = 0; i < edests->nelem; ++i) { Idx candidate = edests->elems[i]; if (!re_node_set_contains (cur_nodes, candidate)) continue; if (dest_node == -1) dest_node = candidate; else { /* In order to avoid infinite loop like "(a*)*", return the second epsilon-transition if the first was already considered. */ if (re_node_set_contains (eps_via_nodes, dest_node)) return candidate; /* Otherwise, push the second epsilon-transition on the fail stack. */ else if (fs != NULL && push_fail_stack (fs, *pidx, candidate, nregs, regs, eps_via_nodes)) return -2; /* We know we are going to exit. */ break; } } return dest_node; } else { Idx naccepted = 0; re_token_type_t type = dfa->nodes[node].type; #ifdef RE_ENABLE_I18N if (dfa->nodes[node].accept_mb) naccepted = check_node_accept_bytes (dfa, node, &mctx->input, *pidx); else #endif /* RE_ENABLE_I18N */ if (type == OP_BACK_REF) { Idx subexp_idx = dfa->nodes[node].opr.idx + 1; if (subexp_idx < nregs) naccepted = regs[subexp_idx].rm_eo - regs[subexp_idx].rm_so; if (fs != NULL) { if (subexp_idx >= nregs || regs[subexp_idx].rm_so == -1 || regs[subexp_idx].rm_eo == -1) return -1; else if (naccepted) { char *buf = (char *) re_string_get_buffer (&mctx->input); if (mctx->input.valid_len - *pidx < naccepted || (memcmp (buf + regs[subexp_idx].rm_so, buf + *pidx, naccepted) != 0)) return -1; } } if (naccepted == 0) { Idx dest_node; ok = re_node_set_insert (eps_via_nodes, node); if (__glibc_unlikely (! ok)) return -2; dest_node = dfa->edests[node].elems[0]; if (re_node_set_contains (&mctx->state_log[*pidx]->nodes, dest_node)) return dest_node; } } if (naccepted != 0 || check_node_accept (mctx, dfa->nodes + node, *pidx)) { Idx dest_node = dfa->nexts[node]; *pidx = (naccepted == 0) ? *pidx + 1 : *pidx + naccepted; if (fs && (*pidx > mctx->match_last || mctx->state_log[*pidx] == NULL || !re_node_set_contains (&mctx->state_log[*pidx]->nodes, dest_node))) return -1; re_node_set_empty (eps_via_nodes); return dest_node; } } return -1; } static reg_errcode_t __attribute_warn_unused_result__ push_fail_stack (struct re_fail_stack_t *fs, Idx str_idx, Idx dest_node, Idx nregs, regmatch_t *regs, re_node_set *eps_via_nodes) { reg_errcode_t err; Idx num = fs->num++; if (fs->num == fs->alloc) { struct re_fail_stack_ent_t *new_array; new_array = re_realloc (fs->stack, struct re_fail_stack_ent_t, fs->alloc * 2); if (new_array == NULL) return REG_ESPACE; fs->alloc *= 2; fs->stack = new_array; } fs->stack[num].idx = str_idx; fs->stack[num].node = dest_node; fs->stack[num].regs = re_malloc (regmatch_t, nregs); if (fs->stack[num].regs == NULL) return REG_ESPACE; memcpy (fs->stack[num].regs, regs, sizeof (regmatch_t) * nregs); err = re_node_set_init_copy (&fs->stack[num].eps_via_nodes, eps_via_nodes); return err; } static Idx pop_fail_stack (struct re_fail_stack_t *fs, Idx *pidx, Idx nregs, regmatch_t *regs, re_node_set *eps_via_nodes) { Idx num = --fs->num; DEBUG_ASSERT (num >= 0); *pidx = fs->stack[num].idx; memcpy (regs, fs->stack[num].regs, sizeof (regmatch_t) * nregs); re_node_set_free (eps_via_nodes); re_free (fs->stack[num].regs); *eps_via_nodes = fs->stack[num].eps_via_nodes; return fs->stack[num].node; } /* Set the positions where the subexpressions are starts/ends to registers PMATCH. Note: We assume that pmatch[0] is already set, and pmatch[i].rm_so == pmatch[i].rm_eo == -1 for 0 < i < nmatch. */ static reg_errcode_t __attribute_warn_unused_result__ set_regs (const regex_t *preg, const re_match_context_t *mctx, size_t nmatch, regmatch_t *pmatch, bool fl_backtrack) { const re_dfa_t *dfa = preg->buffer; Idx idx, cur_node; re_node_set eps_via_nodes; struct re_fail_stack_t *fs; struct re_fail_stack_t fs_body = { 0, 2, NULL }; regmatch_t *prev_idx_match; bool prev_idx_match_malloced = false; DEBUG_ASSERT (nmatch > 1); DEBUG_ASSERT (mctx->state_log != NULL); if (fl_backtrack) { fs = &fs_body; fs->stack = re_malloc (struct re_fail_stack_ent_t, fs->alloc); if (fs->stack == NULL) return REG_ESPACE; } else fs = NULL; cur_node = dfa->init_node; re_node_set_init_empty (&eps_via_nodes); if (__libc_use_alloca (nmatch * sizeof (regmatch_t))) prev_idx_match = (regmatch_t *) alloca (nmatch * sizeof (regmatch_t)); else { prev_idx_match = re_malloc (regmatch_t, nmatch); if (prev_idx_match == NULL) { free_fail_stack_return (fs); return REG_ESPACE; } prev_idx_match_malloced = true; } memcpy (prev_idx_match, pmatch, sizeof (regmatch_t) * nmatch); for (idx = pmatch[0].rm_so; idx <= pmatch[0].rm_eo ;) { update_regs (dfa, pmatch, prev_idx_match, cur_node, idx, nmatch); if (idx == pmatch[0].rm_eo && cur_node == mctx->last_node) { Idx reg_idx; if (fs) { for (reg_idx = 0; reg_idx < nmatch; ++reg_idx) if (pmatch[reg_idx].rm_so > -1 && pmatch[reg_idx].rm_eo == -1) break; if (reg_idx == nmatch) { re_node_set_free (&eps_via_nodes); if (prev_idx_match_malloced) re_free (prev_idx_match); return free_fail_stack_return (fs); } cur_node = pop_fail_stack (fs, &idx, nmatch, pmatch, &eps_via_nodes); } else { re_node_set_free (&eps_via_nodes); if (prev_idx_match_malloced) re_free (prev_idx_match); return REG_NOERROR; } } /* Proceed to next node. */ cur_node = proceed_next_node (mctx, nmatch, pmatch, &idx, cur_node, &eps_via_nodes, fs); if (__glibc_unlikely (cur_node < 0)) { if (__glibc_unlikely (cur_node == -2)) { re_node_set_free (&eps_via_nodes); if (prev_idx_match_malloced) re_free (prev_idx_match); free_fail_stack_return (fs); return REG_ESPACE; } if (fs) cur_node = pop_fail_stack (fs, &idx, nmatch, pmatch, &eps_via_nodes); else { re_node_set_free (&eps_via_nodes); if (prev_idx_match_malloced) re_free (prev_idx_match); return REG_NOMATCH; } } } re_node_set_free (&eps_via_nodes); if (prev_idx_match_malloced) re_free (prev_idx_match); return free_fail_stack_return (fs); } static reg_errcode_t free_fail_stack_return (struct re_fail_stack_t *fs) { if (fs) { Idx fs_idx; for (fs_idx = 0; fs_idx < fs->num; ++fs_idx) { re_node_set_free (&fs->stack[fs_idx].eps_via_nodes); re_free (fs->stack[fs_idx].regs); } re_free (fs->stack); } return REG_NOERROR; } static void update_regs (const re_dfa_t *dfa, regmatch_t *pmatch, regmatch_t *prev_idx_match, Idx cur_node, Idx cur_idx, Idx nmatch) { int type = dfa->nodes[cur_node].type; if (type == OP_OPEN_SUBEXP) { Idx reg_num = dfa->nodes[cur_node].opr.idx + 1; /* We are at the first node of this sub expression. */ if (reg_num < nmatch) { pmatch[reg_num].rm_so = cur_idx; pmatch[reg_num].rm_eo = -1; } } else if (type == OP_CLOSE_SUBEXP) { Idx reg_num = dfa->nodes[cur_node].opr.idx + 1; if (reg_num < nmatch) { /* We are at the last node of this sub expression. */ if (pmatch[reg_num].rm_so < cur_idx) { pmatch[reg_num].rm_eo = cur_idx; /* This is a non-empty match or we are not inside an optional subexpression. Accept this right away. */ memcpy (prev_idx_match, pmatch, sizeof (regmatch_t) * nmatch); } else { if (dfa->nodes[cur_node].opt_subexp && prev_idx_match[reg_num].rm_so != -1) /* We transited through an empty match for an optional subexpression, like (a?)*, and this is not the subexp's first match. Copy back the old content of the registers so that matches of an inner subexpression are undone as well, like in ((a?))*. */ memcpy (pmatch, prev_idx_match, sizeof (regmatch_t) * nmatch); else /* We completed a subexpression, but it may be part of an optional one, so do not update PREV_IDX_MATCH. */ pmatch[reg_num].rm_eo = cur_idx; } } } } /* This function checks the STATE_LOG from the SCTX->last_str_idx to 0 and sift the nodes in each states according to the following rules. Updated state_log will be wrote to STATE_LOG. Rules: We throw away the Node 'a' in the STATE_LOG[STR_IDX] if... 1. When STR_IDX == MATCH_LAST(the last index in the state_log): If 'a' isn't the LAST_NODE and 'a' can't epsilon transit to the LAST_NODE, we throw away the node 'a'. 2. When 0 <= STR_IDX < MATCH_LAST and 'a' accepts string 's' and transit to 'b': i. If 'b' isn't in the STATE_LOG[STR_IDX+strlen('s')], we throw away the node 'a'. ii. If 'b' is in the STATE_LOG[STR_IDX+strlen('s')] but 'b' is thrown away, we throw away the node 'a'. 3. When 0 <= STR_IDX < MATCH_LAST and 'a' epsilon transit to 'b': i. If 'b' isn't in the STATE_LOG[STR_IDX], we throw away the node 'a'. ii. If 'b' is in the STATE_LOG[STR_IDX] but 'b' is thrown away, we throw away the node 'a'. */ #define STATE_NODE_CONTAINS(state,node) \ ((state) != NULL && re_node_set_contains (&(state)->nodes, node)) static reg_errcode_t sift_states_backward (const re_match_context_t *mctx, re_sift_context_t *sctx) { reg_errcode_t err; int null_cnt = 0; Idx str_idx = sctx->last_str_idx; re_node_set cur_dest; DEBUG_ASSERT (mctx->state_log != NULL && mctx->state_log[str_idx] != NULL); /* Build sifted state_log[str_idx]. It has the nodes which can epsilon transit to the last_node and the last_node itself. */ err = re_node_set_init_1 (&cur_dest, sctx->last_node); if (__glibc_unlikely (err != REG_NOERROR)) return err; err = update_cur_sifted_state (mctx, sctx, str_idx, &cur_dest); if (__glibc_unlikely (err != REG_NOERROR)) goto free_return; /* Then check each states in the state_log. */ while (str_idx > 0) { /* Update counters. */ null_cnt = (sctx->sifted_states[str_idx] == NULL) ? null_cnt + 1 : 0; if (null_cnt > mctx->max_mb_elem_len) { memset (sctx->sifted_states, '\0', sizeof (re_dfastate_t *) * str_idx); re_node_set_free (&cur_dest); return REG_NOERROR; } re_node_set_empty (&cur_dest); --str_idx; if (mctx->state_log[str_idx]) { err = build_sifted_states (mctx, sctx, str_idx, &cur_dest); if (__glibc_unlikely (err != REG_NOERROR)) goto free_return; } /* Add all the nodes which satisfy the following conditions: - It can epsilon transit to a node in CUR_DEST. - It is in CUR_SRC. And update state_log. */ err = update_cur_sifted_state (mctx, sctx, str_idx, &cur_dest); if (__glibc_unlikely (err != REG_NOERROR)) goto free_return; } err = REG_NOERROR; free_return: re_node_set_free (&cur_dest); return err; } static reg_errcode_t __attribute_warn_unused_result__ build_sifted_states (const re_match_context_t *mctx, re_sift_context_t *sctx, Idx str_idx, re_node_set *cur_dest) { const re_dfa_t *const dfa = mctx->dfa; const re_node_set *cur_src = &mctx->state_log[str_idx]->non_eps_nodes; Idx i; /* Then build the next sifted state. We build the next sifted state on 'cur_dest', and update 'sifted_states[str_idx]' with 'cur_dest'. Note: 'cur_dest' is the sifted state from 'state_log[str_idx + 1]'. 'cur_src' points the node_set of the old 'state_log[str_idx]' (with the epsilon nodes pre-filtered out). */ for (i = 0; i < cur_src->nelem; i++) { Idx prev_node = cur_src->elems[i]; int naccepted = 0; bool ok; DEBUG_ASSERT (!IS_EPSILON_NODE (dfa->nodes[prev_node].type)); #ifdef RE_ENABLE_I18N /* If the node may accept "multi byte". */ if (dfa->nodes[prev_node].accept_mb) naccepted = sift_states_iter_mb (mctx, sctx, prev_node, str_idx, sctx->last_str_idx); #endif /* RE_ENABLE_I18N */ /* We don't check backreferences here. See update_cur_sifted_state(). */ if (!naccepted && check_node_accept (mctx, dfa->nodes + prev_node, str_idx) && STATE_NODE_CONTAINS (sctx->sifted_states[str_idx + 1], dfa->nexts[prev_node])) naccepted = 1; if (naccepted == 0) continue; if (sctx->limits.nelem) { Idx to_idx = str_idx + naccepted; if (check_dst_limits (mctx, &sctx->limits, dfa->nexts[prev_node], to_idx, prev_node, str_idx)) continue; } ok = re_node_set_insert (cur_dest, prev_node); if (__glibc_unlikely (! ok)) return REG_ESPACE; } return REG_NOERROR; } /* Helper functions. */ static reg_errcode_t clean_state_log_if_needed (re_match_context_t *mctx, Idx next_state_log_idx) { Idx top = mctx->state_log_top; if ((next_state_log_idx >= mctx->input.bufs_len && mctx->input.bufs_len < mctx->input.len) || (next_state_log_idx >= mctx->input.valid_len && mctx->input.valid_len < mctx->input.len)) { reg_errcode_t err; err = extend_buffers (mctx, next_state_log_idx + 1); if (__glibc_unlikely (err != REG_NOERROR)) return err; } if (top < next_state_log_idx) { memset (mctx->state_log + top + 1, '\0', sizeof (re_dfastate_t *) * (next_state_log_idx - top)); mctx->state_log_top = next_state_log_idx; } return REG_NOERROR; } static reg_errcode_t merge_state_array (const re_dfa_t *dfa, re_dfastate_t **dst, re_dfastate_t **src, Idx num) { Idx st_idx; reg_errcode_t err; for (st_idx = 0; st_idx < num; ++st_idx) { if (dst[st_idx] == NULL) dst[st_idx] = src[st_idx]; else if (src[st_idx] != NULL) { re_node_set merged_set; err = re_node_set_init_union (&merged_set, &dst[st_idx]->nodes, &src[st_idx]->nodes); if (__glibc_unlikely (err != REG_NOERROR)) return err; dst[st_idx] = re_acquire_state (&err, dfa, &merged_set); re_node_set_free (&merged_set); if (__glibc_unlikely (err != REG_NOERROR)) return err; } } return REG_NOERROR; } static reg_errcode_t update_cur_sifted_state (const re_match_context_t *mctx, re_sift_context_t *sctx, Idx str_idx, re_node_set *dest_nodes) { const re_dfa_t *const dfa = mctx->dfa; reg_errcode_t err = REG_NOERROR; const re_node_set *candidates; candidates = ((mctx->state_log[str_idx] == NULL) ? NULL : &mctx->state_log[str_idx]->nodes); if (dest_nodes->nelem == 0) sctx->sifted_states[str_idx] = NULL; else { if (candidates) { /* At first, add the nodes which can epsilon transit to a node in DEST_NODE. */ err = add_epsilon_src_nodes (dfa, dest_nodes, candidates); if (__glibc_unlikely (err != REG_NOERROR)) return err; /* Then, check the limitations in the current sift_context. */ if (sctx->limits.nelem) { err = check_subexp_limits (dfa, dest_nodes, candidates, &sctx->limits, mctx->bkref_ents, str_idx); if (__glibc_unlikely (err != REG_NOERROR)) return err; } } sctx->sifted_states[str_idx] = re_acquire_state (&err, dfa, dest_nodes); if (__glibc_unlikely (err != REG_NOERROR)) return err; } if (candidates && mctx->state_log[str_idx]->has_backref) { err = sift_states_bkref (mctx, sctx, str_idx, candidates); if (__glibc_unlikely (err != REG_NOERROR)) return err; } return REG_NOERROR; } static reg_errcode_t __attribute_warn_unused_result__ add_epsilon_src_nodes (const re_dfa_t *dfa, re_node_set *dest_nodes, const re_node_set *candidates) { reg_errcode_t err = REG_NOERROR; Idx i; re_dfastate_t *state = re_acquire_state (&err, dfa, dest_nodes); if (__glibc_unlikely (err != REG_NOERROR)) return err; if (!state->inveclosure.alloc) { err = re_node_set_alloc (&state->inveclosure, dest_nodes->nelem); if (__glibc_unlikely (err != REG_NOERROR)) return REG_ESPACE; for (i = 0; i < dest_nodes->nelem; i++) { err = re_node_set_merge (&state->inveclosure, dfa->inveclosures + dest_nodes->elems[i]); if (__glibc_unlikely (err != REG_NOERROR)) return REG_ESPACE; } } return re_node_set_add_intersect (dest_nodes, candidates, &state->inveclosure); } static reg_errcode_t sub_epsilon_src_nodes (const re_dfa_t *dfa, Idx node, re_node_set *dest_nodes, const re_node_set *candidates) { Idx ecl_idx; reg_errcode_t err; re_node_set *inv_eclosure = dfa->inveclosures + node; re_node_set except_nodes; re_node_set_init_empty (&except_nodes); for (ecl_idx = 0; ecl_idx < inv_eclosure->nelem; ++ecl_idx) { Idx cur_node = inv_eclosure->elems[ecl_idx]; if (cur_node == node) continue; if (IS_EPSILON_NODE (dfa->nodes[cur_node].type)) { Idx edst1 = dfa->edests[cur_node].elems[0]; Idx edst2 = ((dfa->edests[cur_node].nelem > 1) ? dfa->edests[cur_node].elems[1] : -1); if ((!re_node_set_contains (inv_eclosure, edst1) && re_node_set_contains (dest_nodes, edst1)) || (edst2 > 0 && !re_node_set_contains (inv_eclosure, edst2) && re_node_set_contains (dest_nodes, edst2))) { err = re_node_set_add_intersect (&except_nodes, candidates, dfa->inveclosures + cur_node); if (__glibc_unlikely (err != REG_NOERROR)) { re_node_set_free (&except_nodes); return err; } } } } for (ecl_idx = 0; ecl_idx < inv_eclosure->nelem; ++ecl_idx) { Idx cur_node = inv_eclosure->elems[ecl_idx]; if (!re_node_set_contains (&except_nodes, cur_node)) { Idx idx = re_node_set_contains (dest_nodes, cur_node) - 1; re_node_set_remove_at (dest_nodes, idx); } } re_node_set_free (&except_nodes); return REG_NOERROR; } static bool check_dst_limits (const re_match_context_t *mctx, const re_node_set *limits, Idx dst_node, Idx dst_idx, Idx src_node, Idx src_idx) { const re_dfa_t *const dfa = mctx->dfa; Idx lim_idx, src_pos, dst_pos; Idx dst_bkref_idx = search_cur_bkref_entry (mctx, dst_idx); Idx src_bkref_idx = search_cur_bkref_entry (mctx, src_idx); for (lim_idx = 0; lim_idx < limits->nelem; ++lim_idx) { Idx subexp_idx; struct re_backref_cache_entry *ent; ent = mctx->bkref_ents + limits->elems[lim_idx]; subexp_idx = dfa->nodes[ent->node].opr.idx; dst_pos = check_dst_limits_calc_pos (mctx, limits->elems[lim_idx], subexp_idx, dst_node, dst_idx, dst_bkref_idx); src_pos = check_dst_limits_calc_pos (mctx, limits->elems[lim_idx], subexp_idx, src_node, src_idx, src_bkref_idx); /* In case of: ( ) ( ) ( ) */ if (src_pos == dst_pos) continue; /* This is unrelated limitation. */ else return true; } return false; } static int check_dst_limits_calc_pos_1 (const re_match_context_t *mctx, int boundaries, Idx subexp_idx, Idx from_node, Idx bkref_idx) { const re_dfa_t *const dfa = mctx->dfa; const re_node_set *eclosures = dfa->eclosures + from_node; Idx node_idx; /* Else, we are on the boundary: examine the nodes on the epsilon closure. */ for (node_idx = 0; node_idx < eclosures->nelem; ++node_idx) { Idx node = eclosures->elems[node_idx]; switch (dfa->nodes[node].type) { case OP_BACK_REF: if (bkref_idx != -1) { struct re_backref_cache_entry *ent = mctx->bkref_ents + bkref_idx; do { Idx dst; int cpos; if (ent->node != node) continue; if (subexp_idx < BITSET_WORD_BITS && !(ent->eps_reachable_subexps_map & ((bitset_word_t) 1 << subexp_idx))) continue; /* Recurse trying to reach the OP_OPEN_SUBEXP and OP_CLOSE_SUBEXP cases below. But, if the destination node is the same node as the source node, don't recurse because it would cause an infinite loop: a regex that exhibits this behavior is ()\1*\1* */ dst = dfa->edests[node].elems[0]; if (dst == from_node) { if (boundaries & 1) return -1; else /* if (boundaries & 2) */ return 0; } cpos = check_dst_limits_calc_pos_1 (mctx, boundaries, subexp_idx, dst, bkref_idx); if (cpos == -1 /* && (boundaries & 1) */) return -1; if (cpos == 0 && (boundaries & 2)) return 0; if (subexp_idx < BITSET_WORD_BITS) ent->eps_reachable_subexps_map &= ~((bitset_word_t) 1 << subexp_idx); } while (ent++->more); } break; case OP_OPEN_SUBEXP: if ((boundaries & 1) && subexp_idx == dfa->nodes[node].opr.idx) return -1; break; case OP_CLOSE_SUBEXP: if ((boundaries & 2) && subexp_idx == dfa->nodes[node].opr.idx) return 0; break; default: break; } } return (boundaries & 2) ? 1 : 0; } static int check_dst_limits_calc_pos (const re_match_context_t *mctx, Idx limit, Idx subexp_idx, Idx from_node, Idx str_idx, Idx bkref_idx) { struct re_backref_cache_entry *lim = mctx->bkref_ents + limit; int boundaries; /* If we are outside the range of the subexpression, return -1 or 1. */ if (str_idx < lim->subexp_from) return -1; if (lim->subexp_to < str_idx) return 1; /* If we are within the subexpression, return 0. */ boundaries = (str_idx == lim->subexp_from); boundaries |= (str_idx == lim->subexp_to) << 1; if (boundaries == 0) return 0; /* Else, examine epsilon closure. */ return check_dst_limits_calc_pos_1 (mctx, boundaries, subexp_idx, from_node, bkref_idx); } /* Check the limitations of sub expressions LIMITS, and remove the nodes which are against limitations from DEST_NODES. */ static reg_errcode_t check_subexp_limits (const re_dfa_t *dfa, re_node_set *dest_nodes, const re_node_set *candidates, re_node_set *limits, struct re_backref_cache_entry *bkref_ents, Idx str_idx) { reg_errcode_t err; Idx node_idx, lim_idx; for (lim_idx = 0; lim_idx < limits->nelem; ++lim_idx) { Idx subexp_idx; struct re_backref_cache_entry *ent; ent = bkref_ents + limits->elems[lim_idx]; if (str_idx <= ent->subexp_from || ent->str_idx < str_idx) continue; /* This is unrelated limitation. */ subexp_idx = dfa->nodes[ent->node].opr.idx; if (ent->subexp_to == str_idx) { Idx ops_node = -1; Idx cls_node = -1; for (node_idx = 0; node_idx < dest_nodes->nelem; ++node_idx) { Idx node = dest_nodes->elems[node_idx]; re_token_type_t type = dfa->nodes[node].type; if (type == OP_OPEN_SUBEXP && subexp_idx == dfa->nodes[node].opr.idx) ops_node = node; else if (type == OP_CLOSE_SUBEXP && subexp_idx == dfa->nodes[node].opr.idx) cls_node = node; } /* Check the limitation of the open subexpression. */ /* Note that (ent->subexp_to = str_idx != ent->subexp_from). */ if (ops_node >= 0) { err = sub_epsilon_src_nodes (dfa, ops_node, dest_nodes, candidates); if (__glibc_unlikely (err != REG_NOERROR)) return err; } /* Check the limitation of the close subexpression. */ if (cls_node >= 0) for (node_idx = 0; node_idx < dest_nodes->nelem; ++node_idx) { Idx node = dest_nodes->elems[node_idx]; if (!re_node_set_contains (dfa->inveclosures + node, cls_node) && !re_node_set_contains (dfa->eclosures + node, cls_node)) { /* It is against this limitation. Remove it form the current sifted state. */ err = sub_epsilon_src_nodes (dfa, node, dest_nodes, candidates); if (__glibc_unlikely (err != REG_NOERROR)) return err; --node_idx; } } } else /* (ent->subexp_to != str_idx) */ { for (node_idx = 0; node_idx < dest_nodes->nelem; ++node_idx) { Idx node = dest_nodes->elems[node_idx]; re_token_type_t type = dfa->nodes[node].type; if (type == OP_CLOSE_SUBEXP || type == OP_OPEN_SUBEXP) { if (subexp_idx != dfa->nodes[node].opr.idx) continue; /* It is against this limitation. Remove it form the current sifted state. */ err = sub_epsilon_src_nodes (dfa, node, dest_nodes, candidates); if (__glibc_unlikely (err != REG_NOERROR)) return err; } } } } return REG_NOERROR; } static reg_errcode_t __attribute_warn_unused_result__ sift_states_bkref (const re_match_context_t *mctx, re_sift_context_t *sctx, Idx str_idx, const re_node_set *candidates) { const re_dfa_t *const dfa = mctx->dfa; reg_errcode_t err; Idx node_idx, node; re_sift_context_t local_sctx; Idx first_idx = search_cur_bkref_entry (mctx, str_idx); if (first_idx == -1) return REG_NOERROR; local_sctx.sifted_states = NULL; /* Mark that it hasn't been initialized. */ for (node_idx = 0; node_idx < candidates->nelem; ++node_idx) { Idx enabled_idx; re_token_type_t type; struct re_backref_cache_entry *entry; node = candidates->elems[node_idx]; type = dfa->nodes[node].type; /* Avoid infinite loop for the REs like "()\1+". */ if (node == sctx->last_node && str_idx == sctx->last_str_idx) continue; if (type != OP_BACK_REF) continue; entry = mctx->bkref_ents + first_idx; enabled_idx = first_idx; do { Idx subexp_len; Idx to_idx; Idx dst_node; bool ok; re_dfastate_t *cur_state; if (entry->node != node) continue; subexp_len = entry->subexp_to - entry->subexp_from; to_idx = str_idx + subexp_len; dst_node = (subexp_len ? dfa->nexts[node] : dfa->edests[node].elems[0]); if (to_idx > sctx->last_str_idx || sctx->sifted_states[to_idx] == NULL || !STATE_NODE_CONTAINS (sctx->sifted_states[to_idx], dst_node) || check_dst_limits (mctx, &sctx->limits, node, str_idx, dst_node, to_idx)) continue; if (local_sctx.sifted_states == NULL) { local_sctx = *sctx; err = re_node_set_init_copy (&local_sctx.limits, &sctx->limits); if (__glibc_unlikely (err != REG_NOERROR)) goto free_return; } local_sctx.last_node = node; local_sctx.last_str_idx = str_idx; ok = re_node_set_insert (&local_sctx.limits, enabled_idx); if (__glibc_unlikely (! ok)) { err = REG_ESPACE; goto free_return; } cur_state = local_sctx.sifted_states[str_idx]; err = sift_states_backward (mctx, &local_sctx); if (__glibc_unlikely (err != REG_NOERROR)) goto free_return; if (sctx->limited_states != NULL) { err = merge_state_array (dfa, sctx->limited_states, local_sctx.sifted_states, str_idx + 1); if (__glibc_unlikely (err != REG_NOERROR)) goto free_return; } local_sctx.sifted_states[str_idx] = cur_state; re_node_set_remove (&local_sctx.limits, enabled_idx); /* mctx->bkref_ents may have changed, reload the pointer. */ entry = mctx->bkref_ents + enabled_idx; } while (enabled_idx++, entry++->more); } err = REG_NOERROR; free_return: if (local_sctx.sifted_states != NULL) { re_node_set_free (&local_sctx.limits); } return err; } #ifdef RE_ENABLE_I18N static int sift_states_iter_mb (const re_match_context_t *mctx, re_sift_context_t *sctx, Idx node_idx, Idx str_idx, Idx max_str_idx) { const re_dfa_t *const dfa = mctx->dfa; int naccepted; /* Check the node can accept "multi byte". */ naccepted = check_node_accept_bytes (dfa, node_idx, &mctx->input, str_idx); if (naccepted > 0 && str_idx + naccepted <= max_str_idx && !STATE_NODE_CONTAINS (sctx->sifted_states[str_idx + naccepted], dfa->nexts[node_idx])) /* The node can't accept the "multi byte", or the destination was already thrown away, then the node couldn't accept the current input "multi byte". */ naccepted = 0; /* Otherwise, it is sure that the node could accept 'naccepted' bytes input. */ return naccepted; } #endif /* RE_ENABLE_I18N */ /* Functions for state transition. */ /* Return the next state to which the current state STATE will transit by accepting the current input byte, and update STATE_LOG if necessary. If STATE can accept a multibyte char/collating element/back reference update the destination of STATE_LOG. */ static re_dfastate_t * __attribute_warn_unused_result__ transit_state (reg_errcode_t *err, re_match_context_t *mctx, re_dfastate_t *state) { re_dfastate_t **trtable; unsigned char ch; #ifdef RE_ENABLE_I18N /* If the current state can accept multibyte. */ if (__glibc_unlikely (state->accept_mb)) { *err = transit_state_mb (mctx, state); if (__glibc_unlikely (*err != REG_NOERROR)) return NULL; } #endif /* RE_ENABLE_I18N */ /* Then decide the next state with the single byte. */ #if 0 if (0) /* don't use transition table */ return transit_state_sb (err, mctx, state); #endif /* Use transition table */ ch = re_string_fetch_byte (&mctx->input); for (;;) { trtable = state->trtable; if (__glibc_likely (trtable != NULL)) return trtable[ch]; trtable = state->word_trtable; if (__glibc_likely (trtable != NULL)) { unsigned int context; context = re_string_context_at (&mctx->input, re_string_cur_idx (&mctx->input) - 1, mctx->eflags); if (IS_WORD_CONTEXT (context)) return trtable[ch + SBC_MAX]; else return trtable[ch]; } if (!build_trtable (mctx->dfa, state)) { *err = REG_ESPACE; return NULL; } /* Retry, we now have a transition table. */ } } /* Update the state_log if we need */ static re_dfastate_t * merge_state_with_log (reg_errcode_t *err, re_match_context_t *mctx, re_dfastate_t *next_state) { const re_dfa_t *const dfa = mctx->dfa; Idx cur_idx = re_string_cur_idx (&mctx->input); if (cur_idx > mctx->state_log_top) { mctx->state_log[cur_idx] = next_state; mctx->state_log_top = cur_idx; } else if (mctx->state_log[cur_idx] == 0) { mctx->state_log[cur_idx] = next_state; } else { re_dfastate_t *pstate; unsigned int context; re_node_set next_nodes, *log_nodes, *table_nodes = NULL; /* If (state_log[cur_idx] != 0), it implies that cur_idx is the destination of a multibyte char/collating element/ back reference. Then the next state is the union set of these destinations and the results of the transition table. */ pstate = mctx->state_log[cur_idx]; log_nodes = pstate->entrance_nodes; if (next_state != NULL) { table_nodes = next_state->entrance_nodes; *err = re_node_set_init_union (&next_nodes, table_nodes, log_nodes); if (__glibc_unlikely (*err != REG_NOERROR)) return NULL; } else next_nodes = *log_nodes; /* Note: We already add the nodes of the initial state, then we don't need to add them here. */ context = re_string_context_at (&mctx->input, re_string_cur_idx (&mctx->input) - 1, mctx->eflags); next_state = mctx->state_log[cur_idx] = re_acquire_state_context (err, dfa, &next_nodes, context); /* We don't need to check errors here, since the return value of this function is next_state and ERR is already set. */ if (table_nodes != NULL) re_node_set_free (&next_nodes); } if (__glibc_unlikely (dfa->nbackref) && next_state != NULL) { /* Check OP_OPEN_SUBEXP in the current state in case that we use them later. We must check them here, since the back references in the next state might use them. */ *err = check_subexp_matching_top (mctx, &next_state->nodes, cur_idx); if (__glibc_unlikely (*err != REG_NOERROR)) return NULL; /* If the next state has back references. */ if (next_state->has_backref) { *err = transit_state_bkref (mctx, &next_state->nodes); if (__glibc_unlikely (*err != REG_NOERROR)) return NULL; next_state = mctx->state_log[cur_idx]; } } return next_state; } /* Skip bytes in the input that correspond to part of a multi-byte match, then look in the log for a state from which to restart matching. */ static re_dfastate_t * find_recover_state (reg_errcode_t *err, re_match_context_t *mctx) { re_dfastate_t *cur_state; do { Idx max = mctx->state_log_top; Idx cur_str_idx = re_string_cur_idx (&mctx->input); do { if (++cur_str_idx > max) return NULL; re_string_skip_bytes (&mctx->input, 1); } while (mctx->state_log[cur_str_idx] == NULL); cur_state = merge_state_with_log (err, mctx, NULL); } while (*err == REG_NOERROR && cur_state == NULL); return cur_state; } /* Helper functions for transit_state. */ /* From the node set CUR_NODES, pick up the nodes whose types are OP_OPEN_SUBEXP and which have corresponding back references in the regular expression. And register them to use them later for evaluating the corresponding back references. */ static reg_errcode_t check_subexp_matching_top (re_match_context_t *mctx, re_node_set *cur_nodes, Idx str_idx) { const re_dfa_t *const dfa = mctx->dfa; Idx node_idx; reg_errcode_t err; /* TODO: This isn't efficient. Because there might be more than one nodes whose types are OP_OPEN_SUBEXP and whose index is SUBEXP_IDX, we must check all nodes. E.g. RE: (a){2} */ for (node_idx = 0; node_idx < cur_nodes->nelem; ++node_idx) { Idx node = cur_nodes->elems[node_idx]; if (dfa->nodes[node].type == OP_OPEN_SUBEXP && dfa->nodes[node].opr.idx < BITSET_WORD_BITS && (dfa->used_bkref_map & ((bitset_word_t) 1 << dfa->nodes[node].opr.idx))) { err = match_ctx_add_subtop (mctx, node, str_idx); if (__glibc_unlikely (err != REG_NOERROR)) return err; } } return REG_NOERROR; } #if 0 /* Return the next state to which the current state STATE will transit by accepting the current input byte. */ static re_dfastate_t * transit_state_sb (reg_errcode_t *err, re_match_context_t *mctx, re_dfastate_t *state) { const re_dfa_t *const dfa = mctx->dfa; re_node_set next_nodes; re_dfastate_t *next_state; Idx node_cnt, cur_str_idx = re_string_cur_idx (&mctx->input); unsigned int context; *err = re_node_set_alloc (&next_nodes, state->nodes.nelem + 1); if (__glibc_unlikely (*err != REG_NOERROR)) return NULL; for (node_cnt = 0; node_cnt < state->nodes.nelem; ++node_cnt) { Idx cur_node = state->nodes.elems[node_cnt]; if (check_node_accept (mctx, dfa->nodes + cur_node, cur_str_idx)) { *err = re_node_set_merge (&next_nodes, dfa->eclosures + dfa->nexts[cur_node]); if (__glibc_unlikely (*err != REG_NOERROR)) { re_node_set_free (&next_nodes); return NULL; } } } context = re_string_context_at (&mctx->input, cur_str_idx, mctx->eflags); next_state = re_acquire_state_context (err, dfa, &next_nodes, context); /* We don't need to check errors here, since the return value of this function is next_state and ERR is already set. */ re_node_set_free (&next_nodes); re_string_skip_bytes (&mctx->input, 1); return next_state; } #endif #ifdef RE_ENABLE_I18N static reg_errcode_t transit_state_mb (re_match_context_t *mctx, re_dfastate_t *pstate) { const re_dfa_t *const dfa = mctx->dfa; reg_errcode_t err; Idx i; for (i = 0; i < pstate->nodes.nelem; ++i) { re_node_set dest_nodes, *new_nodes; Idx cur_node_idx = pstate->nodes.elems[i]; int naccepted; Idx dest_idx; unsigned int context; re_dfastate_t *dest_state; if (!dfa->nodes[cur_node_idx].accept_mb) continue; if (dfa->nodes[cur_node_idx].constraint) { context = re_string_context_at (&mctx->input, re_string_cur_idx (&mctx->input), mctx->eflags); if (NOT_SATISFY_NEXT_CONSTRAINT (dfa->nodes[cur_node_idx].constraint, context)) continue; } /* How many bytes the node can accept? */ naccepted = check_node_accept_bytes (dfa, cur_node_idx, &mctx->input, re_string_cur_idx (&mctx->input)); if (naccepted == 0) continue; /* The node can accepts 'naccepted' bytes. */ dest_idx = re_string_cur_idx (&mctx->input) + naccepted; mctx->max_mb_elem_len = ((mctx->max_mb_elem_len < naccepted) ? naccepted : mctx->max_mb_elem_len); err = clean_state_log_if_needed (mctx, dest_idx); if (__glibc_unlikely (err != REG_NOERROR)) return err; DEBUG_ASSERT (dfa->nexts[cur_node_idx] != -1); new_nodes = dfa->eclosures + dfa->nexts[cur_node_idx]; dest_state = mctx->state_log[dest_idx]; if (dest_state == NULL) dest_nodes = *new_nodes; else { err = re_node_set_init_union (&dest_nodes, dest_state->entrance_nodes, new_nodes); if (__glibc_unlikely (err != REG_NOERROR)) return err; } context = re_string_context_at (&mctx->input, dest_idx - 1, mctx->eflags); mctx->state_log[dest_idx] = re_acquire_state_context (&err, dfa, &dest_nodes, context); if (dest_state != NULL) re_node_set_free (&dest_nodes); if (__glibc_unlikely (mctx->state_log[dest_idx] == NULL && err != REG_NOERROR)) return err; } return REG_NOERROR; } #endif /* RE_ENABLE_I18N */ static reg_errcode_t transit_state_bkref (re_match_context_t *mctx, const re_node_set *nodes) { const re_dfa_t *const dfa = mctx->dfa; reg_errcode_t err; Idx i; Idx cur_str_idx = re_string_cur_idx (&mctx->input); for (i = 0; i < nodes->nelem; ++i) { Idx dest_str_idx, prev_nelem, bkc_idx; Idx node_idx = nodes->elems[i]; unsigned int context; const re_token_t *node = dfa->nodes + node_idx; re_node_set *new_dest_nodes; /* Check whether 'node' is a backreference or not. */ if (node->type != OP_BACK_REF) continue; if (node->constraint) { context = re_string_context_at (&mctx->input, cur_str_idx, mctx->eflags); if (NOT_SATISFY_NEXT_CONSTRAINT (node->constraint, context)) continue; } /* 'node' is a backreference. Check the substring which the substring matched. */ bkc_idx = mctx->nbkref_ents; err = get_subexp (mctx, node_idx, cur_str_idx); if (__glibc_unlikely (err != REG_NOERROR)) goto free_return; /* And add the epsilon closures (which is 'new_dest_nodes') of the backreference to appropriate state_log. */ DEBUG_ASSERT (dfa->nexts[node_idx] != -1); for (; bkc_idx < mctx->nbkref_ents; ++bkc_idx) { Idx subexp_len; re_dfastate_t *dest_state; struct re_backref_cache_entry *bkref_ent; bkref_ent = mctx->bkref_ents + bkc_idx; if (bkref_ent->node != node_idx || bkref_ent->str_idx != cur_str_idx) continue; subexp_len = bkref_ent->subexp_to - bkref_ent->subexp_from; new_dest_nodes = (subexp_len == 0 ? dfa->eclosures + dfa->edests[node_idx].elems[0] : dfa->eclosures + dfa->nexts[node_idx]); dest_str_idx = (cur_str_idx + bkref_ent->subexp_to - bkref_ent->subexp_from); context = re_string_context_at (&mctx->input, dest_str_idx - 1, mctx->eflags); dest_state = mctx->state_log[dest_str_idx]; prev_nelem = ((mctx->state_log[cur_str_idx] == NULL) ? 0 : mctx->state_log[cur_str_idx]->nodes.nelem); /* Add 'new_dest_node' to state_log. */ if (dest_state == NULL) { mctx->state_log[dest_str_idx] = re_acquire_state_context (&err, dfa, new_dest_nodes, context); if (__glibc_unlikely (mctx->state_log[dest_str_idx] == NULL && err != REG_NOERROR)) goto free_return; } else { re_node_set dest_nodes; err = re_node_set_init_union (&dest_nodes, dest_state->entrance_nodes, new_dest_nodes); if (__glibc_unlikely (err != REG_NOERROR)) { re_node_set_free (&dest_nodes); goto free_return; } mctx->state_log[dest_str_idx] = re_acquire_state_context (&err, dfa, &dest_nodes, context); re_node_set_free (&dest_nodes); if (__glibc_unlikely (mctx->state_log[dest_str_idx] == NULL && err != REG_NOERROR)) goto free_return; } /* We need to check recursively if the backreference can epsilon transit. */ if (subexp_len == 0 && mctx->state_log[cur_str_idx]->nodes.nelem > prev_nelem) { err = check_subexp_matching_top (mctx, new_dest_nodes, cur_str_idx); if (__glibc_unlikely (err != REG_NOERROR)) goto free_return; err = transit_state_bkref (mctx, new_dest_nodes); if (__glibc_unlikely (err != REG_NOERROR)) goto free_return; } } } err = REG_NOERROR; free_return: return err; } /* Enumerate all the candidates which the backreference BKREF_NODE can match at BKREF_STR_IDX, and register them by match_ctx_add_entry(). Note that we might collect inappropriate candidates here. However, the cost of checking them strictly here is too high, then we delay these checking for prune_impossible_nodes(). */ static reg_errcode_t __attribute_warn_unused_result__ get_subexp (re_match_context_t *mctx, Idx bkref_node, Idx bkref_str_idx) { const re_dfa_t *const dfa = mctx->dfa; Idx subexp_num, sub_top_idx; const char *buf = (const char *) re_string_get_buffer (&mctx->input); /* Return if we have already checked BKREF_NODE at BKREF_STR_IDX. */ Idx cache_idx = search_cur_bkref_entry (mctx, bkref_str_idx); if (cache_idx != -1) { const struct re_backref_cache_entry *entry = mctx->bkref_ents + cache_idx; do if (entry->node == bkref_node) return REG_NOERROR; /* We already checked it. */ while (entry++->more); } subexp_num = dfa->nodes[bkref_node].opr.idx; /* For each sub expression */ for (sub_top_idx = 0; sub_top_idx < mctx->nsub_tops; ++sub_top_idx) { reg_errcode_t err; re_sub_match_top_t *sub_top = mctx->sub_tops[sub_top_idx]; re_sub_match_last_t *sub_last; Idx sub_last_idx, sl_str, bkref_str_off; if (dfa->nodes[sub_top->node].opr.idx != subexp_num) continue; /* It isn't related. */ sl_str = sub_top->str_idx; bkref_str_off = bkref_str_idx; /* At first, check the last node of sub expressions we already evaluated. */ for (sub_last_idx = 0; sub_last_idx < sub_top->nlasts; ++sub_last_idx) { regoff_t sl_str_diff; sub_last = sub_top->lasts[sub_last_idx]; sl_str_diff = sub_last->str_idx - sl_str; /* The matched string by the sub expression match with the substring at the back reference? */ if (sl_str_diff > 0) { if (__glibc_unlikely (bkref_str_off + sl_str_diff > mctx->input.valid_len)) { /* Not enough chars for a successful match. */ if (bkref_str_off + sl_str_diff > mctx->input.len) break; err = clean_state_log_if_needed (mctx, bkref_str_off + sl_str_diff); if (__glibc_unlikely (err != REG_NOERROR)) return err; buf = (const char *) re_string_get_buffer (&mctx->input); } if (memcmp (buf + bkref_str_off, buf + sl_str, sl_str_diff) != 0) /* We don't need to search this sub expression any more. */ break; } bkref_str_off += sl_str_diff; sl_str += sl_str_diff; err = get_subexp_sub (mctx, sub_top, sub_last, bkref_node, bkref_str_idx); /* Reload buf, since the preceding call might have reallocated the buffer. */ buf = (const char *) re_string_get_buffer (&mctx->input); if (err == REG_NOMATCH) continue; if (__glibc_unlikely (err != REG_NOERROR)) return err; } if (sub_last_idx < sub_top->nlasts) continue; if (sub_last_idx > 0) ++sl_str; /* Then, search for the other last nodes of the sub expression. */ for (; sl_str <= bkref_str_idx; ++sl_str) { Idx cls_node; regoff_t sl_str_off; const re_node_set *nodes; sl_str_off = sl_str - sub_top->str_idx; /* The matched string by the sub expression match with the substring at the back reference? */ if (sl_str_off > 0) { if (__glibc_unlikely (bkref_str_off >= mctx->input.valid_len)) { /* If we are at the end of the input, we cannot match. */ if (bkref_str_off >= mctx->input.len) break; err = extend_buffers (mctx, bkref_str_off + 1); if (__glibc_unlikely (err != REG_NOERROR)) return err; buf = (const char *) re_string_get_buffer (&mctx->input); } if (buf [bkref_str_off++] != buf[sl_str - 1]) break; /* We don't need to search this sub expression any more. */ } if (mctx->state_log[sl_str] == NULL) continue; /* Does this state have a ')' of the sub expression? */ nodes = &mctx->state_log[sl_str]->nodes; cls_node = find_subexp_node (dfa, nodes, subexp_num, OP_CLOSE_SUBEXP); if (cls_node == -1) continue; /* No. */ if (sub_top->path == NULL) { sub_top->path = calloc (sizeof (state_array_t), sl_str - sub_top->str_idx + 1); if (sub_top->path == NULL) return REG_ESPACE; } /* Can the OP_OPEN_SUBEXP node arrive the OP_CLOSE_SUBEXP node in the current context? */ err = check_arrival (mctx, sub_top->path, sub_top->node, sub_top->str_idx, cls_node, sl_str, OP_CLOSE_SUBEXP); if (err == REG_NOMATCH) continue; if (__glibc_unlikely (err != REG_NOERROR)) return err; sub_last = match_ctx_add_sublast (sub_top, cls_node, sl_str); if (__glibc_unlikely (sub_last == NULL)) return REG_ESPACE; err = get_subexp_sub (mctx, sub_top, sub_last, bkref_node, bkref_str_idx); buf = (const char *) re_string_get_buffer (&mctx->input); if (err == REG_NOMATCH) continue; if (__glibc_unlikely (err != REG_NOERROR)) return err; } } return REG_NOERROR; } /* Helper functions for get_subexp(). */ /* Check SUB_LAST can arrive to the back reference BKREF_NODE at BKREF_STR. If it can arrive, register the sub expression expressed with SUB_TOP and SUB_LAST. */ static reg_errcode_t get_subexp_sub (re_match_context_t *mctx, const re_sub_match_top_t *sub_top, re_sub_match_last_t *sub_last, Idx bkref_node, Idx bkref_str) { reg_errcode_t err; Idx to_idx; /* Can the subexpression arrive the back reference? */ err = check_arrival (mctx, &sub_last->path, sub_last->node, sub_last->str_idx, bkref_node, bkref_str, OP_OPEN_SUBEXP); if (err != REG_NOERROR) return err; err = match_ctx_add_entry (mctx, bkref_node, bkref_str, sub_top->str_idx, sub_last->str_idx); if (__glibc_unlikely (err != REG_NOERROR)) return err; to_idx = bkref_str + sub_last->str_idx - sub_top->str_idx; return clean_state_log_if_needed (mctx, to_idx); } /* Find the first node which is '(' or ')' and whose index is SUBEXP_IDX. Search '(' if FL_OPEN, or search ')' otherwise. TODO: This function isn't efficient... Because there might be more than one nodes whose types are OP_OPEN_SUBEXP and whose index is SUBEXP_IDX, we must check all nodes. E.g. RE: (a){2} */ static Idx find_subexp_node (const re_dfa_t *dfa, const re_node_set *nodes, Idx subexp_idx, int type) { Idx cls_idx; for (cls_idx = 0; cls_idx < nodes->nelem; ++cls_idx) { Idx cls_node = nodes->elems[cls_idx]; const re_token_t *node = dfa->nodes + cls_node; if (node->type == type && node->opr.idx == subexp_idx) return cls_node; } return -1; } /* Check whether the node TOP_NODE at TOP_STR can arrive to the node LAST_NODE at LAST_STR. We record the path onto PATH since it will be heavily reused. Return REG_NOERROR if it can arrive, or REG_NOMATCH otherwise. */ static reg_errcode_t __attribute_warn_unused_result__ check_arrival (re_match_context_t *mctx, state_array_t *path, Idx top_node, Idx top_str, Idx last_node, Idx last_str, int type) { const re_dfa_t *const dfa = mctx->dfa; reg_errcode_t err = REG_NOERROR; Idx subexp_num, backup_cur_idx, str_idx, null_cnt; re_dfastate_t *cur_state = NULL; re_node_set *cur_nodes, next_nodes; re_dfastate_t **backup_state_log; unsigned int context; subexp_num = dfa->nodes[top_node].opr.idx; /* Extend the buffer if we need. */ if (__glibc_unlikely (path->alloc < last_str + mctx->max_mb_elem_len + 1)) { re_dfastate_t **new_array; Idx old_alloc = path->alloc; Idx incr_alloc = last_str + mctx->max_mb_elem_len + 1; Idx new_alloc; if (__glibc_unlikely (IDX_MAX - old_alloc < incr_alloc)) return REG_ESPACE; new_alloc = old_alloc + incr_alloc; if (__glibc_unlikely (SIZE_MAX / sizeof (re_dfastate_t *) < new_alloc)) return REG_ESPACE; new_array = re_realloc (path->array, re_dfastate_t *, new_alloc); if (__glibc_unlikely (new_array == NULL)) return REG_ESPACE; path->array = new_array; path->alloc = new_alloc; memset (new_array + old_alloc, '\0', sizeof (re_dfastate_t *) * (path->alloc - old_alloc)); } str_idx = path->next_idx ? path->next_idx : top_str; /* Temporary modify MCTX. */ backup_state_log = mctx->state_log; backup_cur_idx = mctx->input.cur_idx; mctx->state_log = path->array; mctx->input.cur_idx = str_idx; /* Setup initial node set. */ context = re_string_context_at (&mctx->input, str_idx - 1, mctx->eflags); if (str_idx == top_str) { err = re_node_set_init_1 (&next_nodes, top_node); if (__glibc_unlikely (err != REG_NOERROR)) return err; err = check_arrival_expand_ecl (dfa, &next_nodes, subexp_num, type); if (__glibc_unlikely (err != REG_NOERROR)) { re_node_set_free (&next_nodes); return err; } } else { cur_state = mctx->state_log[str_idx]; if (cur_state && cur_state->has_backref) { err = re_node_set_init_copy (&next_nodes, &cur_state->nodes); if (__glibc_unlikely (err != REG_NOERROR)) return err; } else re_node_set_init_empty (&next_nodes); } if (str_idx == top_str || (cur_state && cur_state->has_backref)) { if (next_nodes.nelem) { err = expand_bkref_cache (mctx, &next_nodes, str_idx, subexp_num, type); if (__glibc_unlikely (err != REG_NOERROR)) { re_node_set_free (&next_nodes); return err; } } cur_state = re_acquire_state_context (&err, dfa, &next_nodes, context); if (__glibc_unlikely (cur_state == NULL && err != REG_NOERROR)) { re_node_set_free (&next_nodes); return err; } mctx->state_log[str_idx] = cur_state; } for (null_cnt = 0; str_idx < last_str && null_cnt <= mctx->max_mb_elem_len;) { re_node_set_empty (&next_nodes); if (mctx->state_log[str_idx + 1]) { err = re_node_set_merge (&next_nodes, &mctx->state_log[str_idx + 1]->nodes); if (__glibc_unlikely (err != REG_NOERROR)) { re_node_set_free (&next_nodes); return err; } } if (cur_state) { err = check_arrival_add_next_nodes (mctx, str_idx, &cur_state->non_eps_nodes, &next_nodes); if (__glibc_unlikely (err != REG_NOERROR)) { re_node_set_free (&next_nodes); return err; } } ++str_idx; if (next_nodes.nelem) { err = check_arrival_expand_ecl (dfa, &next_nodes, subexp_num, type); if (__glibc_unlikely (err != REG_NOERROR)) { re_node_set_free (&next_nodes); return err; } err = expand_bkref_cache (mctx, &next_nodes, str_idx, subexp_num, type); if (__glibc_unlikely (err != REG_NOERROR)) { re_node_set_free (&next_nodes); return err; } } context = re_string_context_at (&mctx->input, str_idx - 1, mctx->eflags); cur_state = re_acquire_state_context (&err, dfa, &next_nodes, context); if (__glibc_unlikely (cur_state == NULL && err != REG_NOERROR)) { re_node_set_free (&next_nodes); return err; } mctx->state_log[str_idx] = cur_state; null_cnt = cur_state == NULL ? null_cnt + 1 : 0; } re_node_set_free (&next_nodes); cur_nodes = (mctx->state_log[last_str] == NULL ? NULL : &mctx->state_log[last_str]->nodes); path->next_idx = str_idx; /* Fix MCTX. */ mctx->state_log = backup_state_log; mctx->input.cur_idx = backup_cur_idx; /* Then check the current node set has the node LAST_NODE. */ if (cur_nodes != NULL && re_node_set_contains (cur_nodes, last_node)) return REG_NOERROR; return REG_NOMATCH; } /* Helper functions for check_arrival. */ /* Calculate the destination nodes of CUR_NODES at STR_IDX, and append them to NEXT_NODES. TODO: This function is similar to the functions transit_state*(), however this function has many additional works. Can't we unify them? */ static reg_errcode_t __attribute_warn_unused_result__ check_arrival_add_next_nodes (re_match_context_t *mctx, Idx str_idx, re_node_set *cur_nodes, re_node_set *next_nodes) { const re_dfa_t *const dfa = mctx->dfa; bool ok; Idx cur_idx; #ifdef RE_ENABLE_I18N reg_errcode_t err = REG_NOERROR; #endif re_node_set union_set; re_node_set_init_empty (&union_set); for (cur_idx = 0; cur_idx < cur_nodes->nelem; ++cur_idx) { int naccepted = 0; Idx cur_node = cur_nodes->elems[cur_idx]; DEBUG_ASSERT (!IS_EPSILON_NODE (dfa->nodes[cur_node].type)); #ifdef RE_ENABLE_I18N /* If the node may accept "multi byte". */ if (dfa->nodes[cur_node].accept_mb) { naccepted = check_node_accept_bytes (dfa, cur_node, &mctx->input, str_idx); if (naccepted > 1) { re_dfastate_t *dest_state; Idx next_node = dfa->nexts[cur_node]; Idx next_idx = str_idx + naccepted; dest_state = mctx->state_log[next_idx]; re_node_set_empty (&union_set); if (dest_state) { err = re_node_set_merge (&union_set, &dest_state->nodes); if (__glibc_unlikely (err != REG_NOERROR)) { re_node_set_free (&union_set); return err; } } ok = re_node_set_insert (&union_set, next_node); if (__glibc_unlikely (! ok)) { re_node_set_free (&union_set); return REG_ESPACE; } mctx->state_log[next_idx] = re_acquire_state (&err, dfa, &union_set); if (__glibc_unlikely (mctx->state_log[next_idx] == NULL && err != REG_NOERROR)) { re_node_set_free (&union_set); return err; } } } #endif /* RE_ENABLE_I18N */ if (naccepted || check_node_accept (mctx, dfa->nodes + cur_node, str_idx)) { ok = re_node_set_insert (next_nodes, dfa->nexts[cur_node]); if (__glibc_unlikely (! ok)) { re_node_set_free (&union_set); return REG_ESPACE; } } } re_node_set_free (&union_set); return REG_NOERROR; } /* For all the nodes in CUR_NODES, add the epsilon closures of them to CUR_NODES, however exclude the nodes which are: - inside the sub expression whose number is EX_SUBEXP, if FL_OPEN. - out of the sub expression whose number is EX_SUBEXP, if !FL_OPEN. */ static reg_errcode_t check_arrival_expand_ecl (const re_dfa_t *dfa, re_node_set *cur_nodes, Idx ex_subexp, int type) { reg_errcode_t err; Idx idx, outside_node; re_node_set new_nodes; DEBUG_ASSERT (cur_nodes->nelem); err = re_node_set_alloc (&new_nodes, cur_nodes->nelem); if (__glibc_unlikely (err != REG_NOERROR)) return err; /* Create a new node set NEW_NODES with the nodes which are epsilon closures of the node in CUR_NODES. */ for (idx = 0; idx < cur_nodes->nelem; ++idx) { Idx cur_node = cur_nodes->elems[idx]; const re_node_set *eclosure = dfa->eclosures + cur_node; outside_node = find_subexp_node (dfa, eclosure, ex_subexp, type); if (outside_node == -1) { /* There are no problematic nodes, just merge them. */ err = re_node_set_merge (&new_nodes, eclosure); if (__glibc_unlikely (err != REG_NOERROR)) { re_node_set_free (&new_nodes); return err; } } else { /* There are problematic nodes, re-calculate incrementally. */ err = check_arrival_expand_ecl_sub (dfa, &new_nodes, cur_node, ex_subexp, type); if (__glibc_unlikely (err != REG_NOERROR)) { re_node_set_free (&new_nodes); return err; } } } re_node_set_free (cur_nodes); *cur_nodes = new_nodes; return REG_NOERROR; } /* Helper function for check_arrival_expand_ecl. Check incrementally the epsilon closure of TARGET, and if it isn't problematic append it to DST_NODES. */ static reg_errcode_t __attribute_warn_unused_result__ check_arrival_expand_ecl_sub (const re_dfa_t *dfa, re_node_set *dst_nodes, Idx target, Idx ex_subexp, int type) { Idx cur_node; for (cur_node = target; !re_node_set_contains (dst_nodes, cur_node);) { bool ok; if (dfa->nodes[cur_node].type == type && dfa->nodes[cur_node].opr.idx == ex_subexp) { if (type == OP_CLOSE_SUBEXP) { ok = re_node_set_insert (dst_nodes, cur_node); if (__glibc_unlikely (! ok)) return REG_ESPACE; } break; } ok = re_node_set_insert (dst_nodes, cur_node); if (__glibc_unlikely (! ok)) return REG_ESPACE; if (dfa->edests[cur_node].nelem == 0) break; if (dfa->edests[cur_node].nelem == 2) { reg_errcode_t err; err = check_arrival_expand_ecl_sub (dfa, dst_nodes, dfa->edests[cur_node].elems[1], ex_subexp, type); if (__glibc_unlikely (err != REG_NOERROR)) return err; } cur_node = dfa->edests[cur_node].elems[0]; } return REG_NOERROR; } /* For all the back references in the current state, calculate the destination of the back references by the appropriate entry in MCTX->BKREF_ENTS. */ static reg_errcode_t __attribute_warn_unused_result__ expand_bkref_cache (re_match_context_t *mctx, re_node_set *cur_nodes, Idx cur_str, Idx subexp_num, int type) { const re_dfa_t *const dfa = mctx->dfa; reg_errcode_t err; Idx cache_idx_start = search_cur_bkref_entry (mctx, cur_str); struct re_backref_cache_entry *ent; if (cache_idx_start == -1) return REG_NOERROR; restart: ent = mctx->bkref_ents + cache_idx_start; do { Idx to_idx, next_node; /* Is this entry ENT is appropriate? */ if (!re_node_set_contains (cur_nodes, ent->node)) continue; /* No. */ to_idx = cur_str + ent->subexp_to - ent->subexp_from; /* Calculate the destination of the back reference, and append it to MCTX->STATE_LOG. */ if (to_idx == cur_str) { /* The backreference did epsilon transit, we must re-check all the node in the current state. */ re_node_set new_dests; reg_errcode_t err2, err3; next_node = dfa->edests[ent->node].elems[0]; if (re_node_set_contains (cur_nodes, next_node)) continue; err = re_node_set_init_1 (&new_dests, next_node); err2 = check_arrival_expand_ecl (dfa, &new_dests, subexp_num, type); err3 = re_node_set_merge (cur_nodes, &new_dests); re_node_set_free (&new_dests); if (__glibc_unlikely (err != REG_NOERROR || err2 != REG_NOERROR || err3 != REG_NOERROR)) { err = (err != REG_NOERROR ? err : (err2 != REG_NOERROR ? err2 : err3)); return err; } /* TODO: It is still inefficient... */ goto restart; } else { re_node_set union_set; next_node = dfa->nexts[ent->node]; if (mctx->state_log[to_idx]) { bool ok; if (re_node_set_contains (&mctx->state_log[to_idx]->nodes, next_node)) continue; err = re_node_set_init_copy (&union_set, &mctx->state_log[to_idx]->nodes); ok = re_node_set_insert (&union_set, next_node); if (__glibc_unlikely (err != REG_NOERROR || ! ok)) { re_node_set_free (&union_set); err = err != REG_NOERROR ? err : REG_ESPACE; return err; } } else { err = re_node_set_init_1 (&union_set, next_node); if (__glibc_unlikely (err != REG_NOERROR)) return err; } mctx->state_log[to_idx] = re_acquire_state (&err, dfa, &union_set); re_node_set_free (&union_set); if (__glibc_unlikely (mctx->state_log[to_idx] == NULL && err != REG_NOERROR)) return err; } } while (ent++->more); return REG_NOERROR; } /* Build transition table for the state. Return true if successful. */ static bool build_trtable (const re_dfa_t *dfa, re_dfastate_t *state) { reg_errcode_t err; Idx i, j; int ch; bool need_word_trtable = false; bitset_word_t elem, mask; bool dests_node_malloced = false; bool dest_states_malloced = false; Idx ndests; /* Number of the destination states from 'state'. */ re_dfastate_t **trtable; re_dfastate_t **dest_states = NULL, **dest_states_word, **dest_states_nl; re_node_set follows, *dests_node; bitset_t *dests_ch; bitset_t acceptable; struct dests_alloc { re_node_set dests_node[SBC_MAX]; bitset_t dests_ch[SBC_MAX]; } *dests_alloc; /* We build DFA states which corresponds to the destination nodes from 'state'. 'dests_node[i]' represents the nodes which i-th destination state contains, and 'dests_ch[i]' represents the characters which i-th destination state accepts. */ if (__libc_use_alloca (sizeof (struct dests_alloc))) dests_alloc = (struct dests_alloc *) alloca (sizeof (struct dests_alloc)); else { dests_alloc = re_malloc (struct dests_alloc, 1); if (__glibc_unlikely (dests_alloc == NULL)) return false; dests_node_malloced = true; } dests_node = dests_alloc->dests_node; dests_ch = dests_alloc->dests_ch; /* Initialize transition table. */ state->word_trtable = state->trtable = NULL; /* At first, group all nodes belonging to 'state' into several destinations. */ ndests = group_nodes_into_DFAstates (dfa, state, dests_node, dests_ch); if (__glibc_unlikely (ndests <= 0)) { if (dests_node_malloced) re_free (dests_alloc); /* Return false in case of an error, true otherwise. */ if (ndests == 0) { state->trtable = (re_dfastate_t **) calloc (sizeof (re_dfastate_t *), SBC_MAX); if (__glibc_unlikely (state->trtable == NULL)) return false; return true; } return false; } err = re_node_set_alloc (&follows, ndests + 1); if (__glibc_unlikely (err != REG_NOERROR)) goto out_free; /* Avoid arithmetic overflow in size calculation. */ size_t ndests_max = ((SIZE_MAX - (sizeof (re_node_set) + sizeof (bitset_t)) * SBC_MAX) / (3 * sizeof (re_dfastate_t *))); if (__glibc_unlikely (ndests_max < ndests)) goto out_free; if (__libc_use_alloca ((sizeof (re_node_set) + sizeof (bitset_t)) * SBC_MAX + ndests * 3 * sizeof (re_dfastate_t *))) dest_states = (re_dfastate_t **) alloca (ndests * 3 * sizeof (re_dfastate_t *)); else { dest_states = re_malloc (re_dfastate_t *, ndests * 3); if (__glibc_unlikely (dest_states == NULL)) { out_free: if (dest_states_malloced) re_free (dest_states); re_node_set_free (&follows); for (i = 0; i < ndests; ++i) re_node_set_free (dests_node + i); if (dests_node_malloced) re_free (dests_alloc); return false; } dest_states_malloced = true; } dest_states_word = dest_states + ndests; dest_states_nl = dest_states_word + ndests; bitset_empty (acceptable); /* Then build the states for all destinations. */ for (i = 0; i < ndests; ++i) { Idx next_node; re_node_set_empty (&follows); /* Merge the follows of this destination states. */ for (j = 0; j < dests_node[i].nelem; ++j) { next_node = dfa->nexts[dests_node[i].elems[j]]; if (next_node != -1) { err = re_node_set_merge (&follows, dfa->eclosures + next_node); if (__glibc_unlikely (err != REG_NOERROR)) goto out_free; } } dest_states[i] = re_acquire_state_context (&err, dfa, &follows, 0); if (__glibc_unlikely (dest_states[i] == NULL && err != REG_NOERROR)) goto out_free; /* If the new state has context constraint, build appropriate states for these contexts. */ if (dest_states[i]->has_constraint) { dest_states_word[i] = re_acquire_state_context (&err, dfa, &follows, CONTEXT_WORD); if (__glibc_unlikely (dest_states_word[i] == NULL && err != REG_NOERROR)) goto out_free; if (dest_states[i] != dest_states_word[i] && dfa->mb_cur_max > 1) need_word_trtable = true; dest_states_nl[i] = re_acquire_state_context (&err, dfa, &follows, CONTEXT_NEWLINE); if (__glibc_unlikely (dest_states_nl[i] == NULL && err != REG_NOERROR)) goto out_free; } else { dest_states_word[i] = dest_states[i]; dest_states_nl[i] = dest_states[i]; } bitset_merge (acceptable, dests_ch[i]); } if (!__glibc_unlikely (need_word_trtable)) { /* We don't care about whether the following character is a word character, or we are in a single-byte character set so we can discern by looking at the character code: allocate a 256-entry transition table. */ trtable = state->trtable = (re_dfastate_t **) calloc (sizeof (re_dfastate_t *), SBC_MAX); if (__glibc_unlikely (trtable == NULL)) goto out_free; /* For all characters ch...: */ for (i = 0; i < BITSET_WORDS; ++i) for (ch = i * BITSET_WORD_BITS, elem = acceptable[i], mask = 1; elem; mask <<= 1, elem >>= 1, ++ch) if (__glibc_unlikely (elem & 1)) { /* There must be exactly one destination which accepts character ch. See group_nodes_into_DFAstates. */ for (j = 0; (dests_ch[j][i] & mask) == 0; ++j) ; /* j-th destination accepts the word character ch. */ if (dfa->word_char[i] & mask) trtable[ch] = dest_states_word[j]; else trtable[ch] = dest_states[j]; } } else { /* We care about whether the following character is a word character, and we are in a multi-byte character set: discern by looking at the character code: build two 256-entry transition tables, one starting at trtable[0] and one starting at trtable[SBC_MAX]. */ trtable = state->word_trtable = (re_dfastate_t **) calloc (sizeof (re_dfastate_t *), 2 * SBC_MAX); if (__glibc_unlikely (trtable == NULL)) goto out_free; /* For all characters ch...: */ for (i = 0; i < BITSET_WORDS; ++i) for (ch = i * BITSET_WORD_BITS, elem = acceptable[i], mask = 1; elem; mask <<= 1, elem >>= 1, ++ch) if (__glibc_unlikely (elem & 1)) { /* There must be exactly one destination which accepts character ch. See group_nodes_into_DFAstates. */ for (j = 0; (dests_ch[j][i] & mask) == 0; ++j) ; /* j-th destination accepts the word character ch. */ trtable[ch] = dest_states[j]; trtable[ch + SBC_MAX] = dest_states_word[j]; } } /* new line */ if (bitset_contain (acceptable, NEWLINE_CHAR)) { /* The current state accepts newline character. */ for (j = 0; j < ndests; ++j) if (bitset_contain (dests_ch[j], NEWLINE_CHAR)) { /* k-th destination accepts newline character. */ trtable[NEWLINE_CHAR] = dest_states_nl[j]; if (need_word_trtable) trtable[NEWLINE_CHAR + SBC_MAX] = dest_states_nl[j]; /* There must be only one destination which accepts newline. See group_nodes_into_DFAstates. */ break; } } if (dest_states_malloced) re_free (dest_states); re_node_set_free (&follows); for (i = 0; i < ndests; ++i) re_node_set_free (dests_node + i); if (dests_node_malloced) re_free (dests_alloc); return true; } /* Group all nodes belonging to STATE into several destinations. Then for all destinations, set the nodes belonging to the destination to DESTS_NODE[i] and set the characters accepted by the destination to DEST_CH[i]. This function return the number of destinations. */ static Idx group_nodes_into_DFAstates (const re_dfa_t *dfa, const re_dfastate_t *state, re_node_set *dests_node, bitset_t *dests_ch) { reg_errcode_t err; bool ok; Idx i, j, k; Idx ndests; /* Number of the destinations from 'state'. */ bitset_t accepts; /* Characters a node can accept. */ const re_node_set *cur_nodes = &state->nodes; bitset_empty (accepts); ndests = 0; /* For all the nodes belonging to 'state', */ for (i = 0; i < cur_nodes->nelem; ++i) { re_token_t *node = &dfa->nodes[cur_nodes->elems[i]]; re_token_type_t type = node->type; unsigned int constraint = node->constraint; /* Enumerate all single byte character this node can accept. */ if (type == CHARACTER) bitset_set (accepts, node->opr.c); else if (type == SIMPLE_BRACKET) { bitset_merge (accepts, node->opr.sbcset); } else if (type == OP_PERIOD) { #ifdef RE_ENABLE_I18N if (dfa->mb_cur_max > 1) bitset_merge (accepts, dfa->sb_char); else #endif bitset_set_all (accepts); if (!(dfa->syntax & RE_DOT_NEWLINE)) bitset_clear (accepts, '\n'); if (dfa->syntax & RE_DOT_NOT_NULL) bitset_clear (accepts, '\0'); } #ifdef RE_ENABLE_I18N else if (type == OP_UTF8_PERIOD) { if (ASCII_CHARS % BITSET_WORD_BITS == 0) memset (accepts, -1, ASCII_CHARS / CHAR_BIT); else bitset_merge (accepts, utf8_sb_map); if (!(dfa->syntax & RE_DOT_NEWLINE)) bitset_clear (accepts, '\n'); if (dfa->syntax & RE_DOT_NOT_NULL) bitset_clear (accepts, '\0'); } #endif else continue; /* Check the 'accepts' and sift the characters which are not match it the context. */ if (constraint) { if (constraint & NEXT_NEWLINE_CONSTRAINT) { bool accepts_newline = bitset_contain (accepts, NEWLINE_CHAR); bitset_empty (accepts); if (accepts_newline) bitset_set (accepts, NEWLINE_CHAR); else continue; } if (constraint & NEXT_ENDBUF_CONSTRAINT) { bitset_empty (accepts); continue; } if (constraint & NEXT_WORD_CONSTRAINT) { bitset_word_t any_set = 0; if (type == CHARACTER && !node->word_char) { bitset_empty (accepts); continue; } #ifdef RE_ENABLE_I18N if (dfa->mb_cur_max > 1) for (j = 0; j < BITSET_WORDS; ++j) any_set |= (accepts[j] &= (dfa->word_char[j] | ~dfa->sb_char[j])); else #endif for (j = 0; j < BITSET_WORDS; ++j) any_set |= (accepts[j] &= dfa->word_char[j]); if (!any_set) continue; } if (constraint & NEXT_NOTWORD_CONSTRAINT) { bitset_word_t any_set = 0; if (type == CHARACTER && node->word_char) { bitset_empty (accepts); continue; } #ifdef RE_ENABLE_I18N if (dfa->mb_cur_max > 1) for (j = 0; j < BITSET_WORDS; ++j) any_set |= (accepts[j] &= ~(dfa->word_char[j] & dfa->sb_char[j])); else #endif for (j = 0; j < BITSET_WORDS; ++j) any_set |= (accepts[j] &= ~dfa->word_char[j]); if (!any_set) continue; } } /* Then divide 'accepts' into DFA states, or create a new state. Above, we make sure that accepts is not empty. */ for (j = 0; j < ndests; ++j) { bitset_t intersec; /* Intersection sets, see below. */ bitset_t remains; /* Flags, see below. */ bitset_word_t has_intersec, not_subset, not_consumed; /* Optimization, skip if this state doesn't accept the character. */ if (type == CHARACTER && !bitset_contain (dests_ch[j], node->opr.c)) continue; /* Enumerate the intersection set of this state and 'accepts'. */ has_intersec = 0; for (k = 0; k < BITSET_WORDS; ++k) has_intersec |= intersec[k] = accepts[k] & dests_ch[j][k]; /* And skip if the intersection set is empty. */ if (!has_intersec) continue; /* Then check if this state is a subset of 'accepts'. */ not_subset = not_consumed = 0; for (k = 0; k < BITSET_WORDS; ++k) { not_subset |= remains[k] = ~accepts[k] & dests_ch[j][k]; not_consumed |= accepts[k] = accepts[k] & ~dests_ch[j][k]; } /* If this state isn't a subset of 'accepts', create a new group state, which has the 'remains'. */ if (not_subset) { bitset_copy (dests_ch[ndests], remains); bitset_copy (dests_ch[j], intersec); err = re_node_set_init_copy (dests_node + ndests, &dests_node[j]); if (__glibc_unlikely (err != REG_NOERROR)) goto error_return; ++ndests; } /* Put the position in the current group. */ ok = re_node_set_insert (&dests_node[j], cur_nodes->elems[i]); if (__glibc_unlikely (! ok)) goto error_return; /* If all characters are consumed, go to next node. */ if (!not_consumed) break; } /* Some characters remain, create a new group. */ if (j == ndests) { bitset_copy (dests_ch[ndests], accepts); err = re_node_set_init_1 (dests_node + ndests, cur_nodes->elems[i]); if (__glibc_unlikely (err != REG_NOERROR)) goto error_return; ++ndests; bitset_empty (accepts); } } assume (ndests <= SBC_MAX); return ndests; error_return: for (j = 0; j < ndests; ++j) re_node_set_free (dests_node + j); return -1; } #ifdef RE_ENABLE_I18N /* Check how many bytes the node 'dfa->nodes[node_idx]' accepts. Return the number of the bytes the node accepts. STR_IDX is the current index of the input string. This function handles the nodes which can accept one character, or one collating element like '.', '[a-z]', opposite to the other nodes can only accept one byte. */ # ifdef _LIBC # include # endif static int check_node_accept_bytes (const re_dfa_t *dfa, Idx node_idx, const re_string_t *input, Idx str_idx) { const re_token_t *node = dfa->nodes + node_idx; int char_len, elem_len; Idx i; if (__glibc_unlikely (node->type == OP_UTF8_PERIOD)) { unsigned char c = re_string_byte_at (input, str_idx), d; if (__glibc_likely (c < 0xc2)) return 0; if (str_idx + 2 > input->len) return 0; d = re_string_byte_at (input, str_idx + 1); if (c < 0xe0) return (d < 0x80 || d > 0xbf) ? 0 : 2; else if (c < 0xf0) { char_len = 3; if (c == 0xe0 && d < 0xa0) return 0; } else if (c < 0xf8) { char_len = 4; if (c == 0xf0 && d < 0x90) return 0; } else if (c < 0xfc) { char_len = 5; if (c == 0xf8 && d < 0x88) return 0; } else if (c < 0xfe) { char_len = 6; if (c == 0xfc && d < 0x84) return 0; } else return 0; if (str_idx + char_len > input->len) return 0; for (i = 1; i < char_len; ++i) { d = re_string_byte_at (input, str_idx + i); if (d < 0x80 || d > 0xbf) return 0; } return char_len; } char_len = re_string_char_size_at (input, str_idx); if (node->type == OP_PERIOD) { if (char_len <= 1) return 0; /* FIXME: I don't think this if is needed, as both '\n' and '\0' are char_len == 1. */ /* '.' accepts any one character except the following two cases. */ if ((!(dfa->syntax & RE_DOT_NEWLINE) && re_string_byte_at (input, str_idx) == '\n') || ((dfa->syntax & RE_DOT_NOT_NULL) && re_string_byte_at (input, str_idx) == '\0')) return 0; return char_len; } elem_len = re_string_elem_size_at (input, str_idx); if ((elem_len <= 1 && char_len <= 1) || char_len == 0) return 0; if (node->type == COMPLEX_BRACKET) { const re_charset_t *cset = node->opr.mbcset; # ifdef _LIBC const unsigned char *pin = ((const unsigned char *) re_string_get_buffer (input) + str_idx); Idx j; uint32_t nrules; # endif /* _LIBC */ int match_len = 0; wchar_t wc = ((cset->nranges || cset->nchar_classes || cset->nmbchars) ? re_string_wchar_at (input, str_idx) : 0); /* match with multibyte character? */ for (i = 0; i < cset->nmbchars; ++i) if (wc == cset->mbchars[i]) { match_len = char_len; goto check_node_accept_bytes_match; } /* match with character_class? */ for (i = 0; i < cset->nchar_classes; ++i) { wctype_t wt = cset->char_classes[i]; if (__iswctype (wc, wt)) { match_len = char_len; goto check_node_accept_bytes_match; } } # ifdef _LIBC nrules = _NL_CURRENT_WORD (LC_COLLATE, _NL_COLLATE_NRULES); if (nrules != 0) { unsigned int in_collseq = 0; const int32_t *table, *indirect; const unsigned char *weights, *extra; const char *collseqwc; /* match with collating_symbol? */ if (cset->ncoll_syms) extra = (const unsigned char *) _NL_CURRENT (LC_COLLATE, _NL_COLLATE_SYMB_EXTRAMB); for (i = 0; i < cset->ncoll_syms; ++i) { const unsigned char *coll_sym = extra + cset->coll_syms[i]; /* Compare the length of input collating element and the length of current collating element. */ if (*coll_sym != elem_len) continue; /* Compare each bytes. */ for (j = 0; j < *coll_sym; j++) if (pin[j] != coll_sym[1 + j]) break; if (j == *coll_sym) { /* Match if every bytes is equal. */ match_len = j; goto check_node_accept_bytes_match; } } if (cset->nranges) { if (elem_len <= char_len) { collseqwc = _NL_CURRENT (LC_COLLATE, _NL_COLLATE_COLLSEQWC); in_collseq = __collseq_table_lookup (collseqwc, wc); } else in_collseq = find_collation_sequence_value (pin, elem_len); } /* match with range expression? */ /* FIXME: Implement rational ranges here, too. */ for (i = 0; i < cset->nranges; ++i) if (cset->range_starts[i] <= in_collseq && in_collseq <= cset->range_ends[i]) { match_len = elem_len; goto check_node_accept_bytes_match; } /* match with equivalence_class? */ if (cset->nequiv_classes) { const unsigned char *cp = pin; table = (const int32_t *) _NL_CURRENT (LC_COLLATE, _NL_COLLATE_TABLEMB); weights = (const unsigned char *) _NL_CURRENT (LC_COLLATE, _NL_COLLATE_WEIGHTMB); extra = (const unsigned char *) _NL_CURRENT (LC_COLLATE, _NL_COLLATE_EXTRAMB); indirect = (const int32_t *) _NL_CURRENT (LC_COLLATE, _NL_COLLATE_INDIRECTMB); int32_t idx = findidx (table, indirect, extra, &cp, elem_len); int32_t rule = idx >> 24; idx &= 0xffffff; if (idx > 0) { size_t weight_len = weights[idx]; for (i = 0; i < cset->nequiv_classes; ++i) { int32_t equiv_class_idx = cset->equiv_classes[i]; int32_t equiv_class_rule = equiv_class_idx >> 24; equiv_class_idx &= 0xffffff; if (weights[equiv_class_idx] == weight_len && equiv_class_rule == rule && memcmp (weights + idx + 1, weights + equiv_class_idx + 1, weight_len) == 0) { match_len = elem_len; goto check_node_accept_bytes_match; } } } } } else # endif /* _LIBC */ { /* match with range expression? */ for (i = 0; i < cset->nranges; ++i) { if (cset->range_starts[i] <= wc && wc <= cset->range_ends[i]) { match_len = char_len; goto check_node_accept_bytes_match; } } } check_node_accept_bytes_match: if (!cset->non_match) return match_len; else { if (match_len > 0) return 0; else return (elem_len > char_len) ? elem_len : char_len; } } return 0; } # ifdef _LIBC static unsigned int find_collation_sequence_value (const unsigned char *mbs, size_t mbs_len) { uint32_t nrules = _NL_CURRENT_WORD (LC_COLLATE, _NL_COLLATE_NRULES); if (nrules == 0) { if (mbs_len == 1) { /* No valid character. Match it as a single byte character. */ const unsigned char *collseq = (const unsigned char *) _NL_CURRENT (LC_COLLATE, _NL_COLLATE_COLLSEQMB); return collseq[mbs[0]]; } return UINT_MAX; } else { int32_t idx; const unsigned char *extra = (const unsigned char *) _NL_CURRENT (LC_COLLATE, _NL_COLLATE_SYMB_EXTRAMB); int32_t extrasize = (const unsigned char *) _NL_CURRENT (LC_COLLATE, _NL_COLLATE_SYMB_EXTRAMB + 1) - extra; for (idx = 0; idx < extrasize;) { int mbs_cnt; bool found = false; int32_t elem_mbs_len; /* Skip the name of collating element name. */ idx = idx + extra[idx] + 1; elem_mbs_len = extra[idx++]; if (mbs_len == elem_mbs_len) { for (mbs_cnt = 0; mbs_cnt < elem_mbs_len; ++mbs_cnt) if (extra[idx + mbs_cnt] != mbs[mbs_cnt]) break; if (mbs_cnt == elem_mbs_len) /* Found the entry. */ found = true; } /* Skip the byte sequence of the collating element. */ idx += elem_mbs_len; /* Adjust for the alignment. */ idx = (idx + 3) & ~3; /* Skip the collation sequence value. */ idx += sizeof (uint32_t); /* Skip the wide char sequence of the collating element. */ idx = idx + sizeof (uint32_t) * (*(int32_t *) (extra + idx) + 1); /* If we found the entry, return the sequence value. */ if (found) return *(uint32_t *) (extra + idx); /* Skip the collation sequence value. */ idx += sizeof (uint32_t); } return UINT_MAX; } } # endif /* _LIBC */ #endif /* RE_ENABLE_I18N */ /* Check whether the node accepts the byte which is IDX-th byte of the INPUT. */ static bool check_node_accept (const re_match_context_t *mctx, const re_token_t *node, Idx idx) { unsigned char ch; ch = re_string_byte_at (&mctx->input, idx); switch (node->type) { case CHARACTER: if (node->opr.c != ch) return false; break; case SIMPLE_BRACKET: if (!bitset_contain (node->opr.sbcset, ch)) return false; break; #ifdef RE_ENABLE_I18N case OP_UTF8_PERIOD: if (ch >= ASCII_CHARS) return false; FALLTHROUGH; #endif case OP_PERIOD: if ((ch == '\n' && !(mctx->dfa->syntax & RE_DOT_NEWLINE)) || (ch == '\0' && (mctx->dfa->syntax & RE_DOT_NOT_NULL))) return false; break; default: return false; } if (node->constraint) { /* The node has constraints. Check whether the current context satisfies the constraints. */ unsigned int context = re_string_context_at (&mctx->input, idx, mctx->eflags); if (NOT_SATISFY_NEXT_CONSTRAINT (node->constraint, context)) return false; } return true; } /* Extend the buffers, if the buffers have run out. */ static reg_errcode_t __attribute_warn_unused_result__ extend_buffers (re_match_context_t *mctx, int min_len) { reg_errcode_t ret; re_string_t *pstr = &mctx->input; /* Avoid overflow. */ if (__glibc_unlikely (MIN (IDX_MAX, SIZE_MAX / sizeof (re_dfastate_t *)) / 2 <= pstr->bufs_len)) return REG_ESPACE; /* Double the lengths of the buffers, but allocate at least MIN_LEN. */ ret = re_string_realloc_buffers (pstr, MAX (min_len, MIN (pstr->len, pstr->bufs_len * 2))); if (__glibc_unlikely (ret != REG_NOERROR)) return ret; if (mctx->state_log != NULL) { /* And double the length of state_log. */ /* XXX We have no indication of the size of this buffer. If this allocation fail we have no indication that the state_log array does not have the right size. */ re_dfastate_t **new_array = re_realloc (mctx->state_log, re_dfastate_t *, pstr->bufs_len + 1); if (__glibc_unlikely (new_array == NULL)) return REG_ESPACE; mctx->state_log = new_array; } /* Then reconstruct the buffers. */ if (pstr->icase) { #ifdef RE_ENABLE_I18N if (pstr->mb_cur_max > 1) { ret = build_wcs_upper_buffer (pstr); if (__glibc_unlikely (ret != REG_NOERROR)) return ret; } else #endif /* RE_ENABLE_I18N */ build_upper_buffer (pstr); } else { #ifdef RE_ENABLE_I18N if (pstr->mb_cur_max > 1) build_wcs_buffer (pstr); else #endif /* RE_ENABLE_I18N */ { if (pstr->trans != NULL) re_string_translate_buffer (pstr); } } return REG_NOERROR; } /* Functions for matching context. */ /* Initialize MCTX. */ static reg_errcode_t __attribute_warn_unused_result__ match_ctx_init (re_match_context_t *mctx, int eflags, Idx n) { mctx->eflags = eflags; mctx->match_last = -1; if (n > 0) { /* Avoid overflow. */ size_t max_object_size = MAX (sizeof (struct re_backref_cache_entry), sizeof (re_sub_match_top_t *)); if (__glibc_unlikely (MIN (IDX_MAX, SIZE_MAX / max_object_size) < n)) return REG_ESPACE; mctx->bkref_ents = re_malloc (struct re_backref_cache_entry, n); mctx->sub_tops = re_malloc (re_sub_match_top_t *, n); if (__glibc_unlikely (mctx->bkref_ents == NULL || mctx->sub_tops == NULL)) return REG_ESPACE; } /* Already zero-ed by the caller. else mctx->bkref_ents = NULL; mctx->nbkref_ents = 0; mctx->nsub_tops = 0; */ mctx->abkref_ents = n; mctx->max_mb_elem_len = 1; mctx->asub_tops = n; return REG_NOERROR; } /* Clean the entries which depend on the current input in MCTX. This function must be invoked when the matcher changes the start index of the input, or changes the input string. */ static void match_ctx_clean (re_match_context_t *mctx) { Idx st_idx; for (st_idx = 0; st_idx < mctx->nsub_tops; ++st_idx) { Idx sl_idx; re_sub_match_top_t *top = mctx->sub_tops[st_idx]; for (sl_idx = 0; sl_idx < top->nlasts; ++sl_idx) { re_sub_match_last_t *last = top->lasts[sl_idx]; re_free (last->path.array); re_free (last); } re_free (top->lasts); if (top->path) { re_free (top->path->array); re_free (top->path); } re_free (top); } mctx->nsub_tops = 0; mctx->nbkref_ents = 0; } /* Free all the memory associated with MCTX. */ static void match_ctx_free (re_match_context_t *mctx) { /* First, free all the memory associated with MCTX->SUB_TOPS. */ match_ctx_clean (mctx); re_free (mctx->sub_tops); re_free (mctx->bkref_ents); } /* Add a new backreference entry to MCTX. Note that we assume that caller never call this function with duplicate entry, and call with STR_IDX which isn't smaller than any existing entry. */ static reg_errcode_t __attribute_warn_unused_result__ match_ctx_add_entry (re_match_context_t *mctx, Idx node, Idx str_idx, Idx from, Idx to) { if (mctx->nbkref_ents >= mctx->abkref_ents) { struct re_backref_cache_entry* new_entry; new_entry = re_realloc (mctx->bkref_ents, struct re_backref_cache_entry, mctx->abkref_ents * 2); if (__glibc_unlikely (new_entry == NULL)) { re_free (mctx->bkref_ents); return REG_ESPACE; } mctx->bkref_ents = new_entry; memset (mctx->bkref_ents + mctx->nbkref_ents, '\0', sizeof (struct re_backref_cache_entry) * mctx->abkref_ents); mctx->abkref_ents *= 2; } if (mctx->nbkref_ents > 0 && mctx->bkref_ents[mctx->nbkref_ents - 1].str_idx == str_idx) mctx->bkref_ents[mctx->nbkref_ents - 1].more = 1; mctx->bkref_ents[mctx->nbkref_ents].node = node; mctx->bkref_ents[mctx->nbkref_ents].str_idx = str_idx; mctx->bkref_ents[mctx->nbkref_ents].subexp_from = from; mctx->bkref_ents[mctx->nbkref_ents].subexp_to = to; /* This is a cache that saves negative results of check_dst_limits_calc_pos. If bit N is clear, means that this entry won't epsilon-transition to an OP_OPEN_SUBEXP or OP_CLOSE_SUBEXP for the N+1-th subexpression. If it is set, check_dst_limits_calc_pos_1 will recurse and try to find one such node. A backreference does not epsilon-transition unless it is empty, so set to all zeros if FROM != TO. */ mctx->bkref_ents[mctx->nbkref_ents].eps_reachable_subexps_map = (from == to ? -1 : 0); mctx->bkref_ents[mctx->nbkref_ents++].more = 0; if (mctx->max_mb_elem_len < to - from) mctx->max_mb_elem_len = to - from; return REG_NOERROR; } /* Return the first entry with the same str_idx, or -1 if none is found. Note that MCTX->BKREF_ENTS is already sorted by MCTX->STR_IDX. */ static Idx search_cur_bkref_entry (const re_match_context_t *mctx, Idx str_idx) { Idx left, right, mid, last; last = right = mctx->nbkref_ents; for (left = 0; left < right;) { mid = (left + right) / 2; if (mctx->bkref_ents[mid].str_idx < str_idx) left = mid + 1; else right = mid; } if (left < last && mctx->bkref_ents[left].str_idx == str_idx) return left; else return -1; } /* Register the node NODE, whose type is OP_OPEN_SUBEXP, and which matches at STR_IDX. */ static reg_errcode_t __attribute_warn_unused_result__ match_ctx_add_subtop (re_match_context_t *mctx, Idx node, Idx str_idx) { DEBUG_ASSERT (mctx->sub_tops != NULL); DEBUG_ASSERT (mctx->asub_tops > 0); if (__glibc_unlikely (mctx->nsub_tops == mctx->asub_tops)) { Idx new_asub_tops = mctx->asub_tops * 2; re_sub_match_top_t **new_array = re_realloc (mctx->sub_tops, re_sub_match_top_t *, new_asub_tops); if (__glibc_unlikely (new_array == NULL)) return REG_ESPACE; mctx->sub_tops = new_array; mctx->asub_tops = new_asub_tops; } mctx->sub_tops[mctx->nsub_tops] = calloc (1, sizeof (re_sub_match_top_t)); if (__glibc_unlikely (mctx->sub_tops[mctx->nsub_tops] == NULL)) return REG_ESPACE; mctx->sub_tops[mctx->nsub_tops]->node = node; mctx->sub_tops[mctx->nsub_tops++]->str_idx = str_idx; return REG_NOERROR; } /* Register the node NODE, whose type is OP_CLOSE_SUBEXP, and which matches at STR_IDX, whose corresponding OP_OPEN_SUBEXP is SUB_TOP. */ static re_sub_match_last_t * match_ctx_add_sublast (re_sub_match_top_t *subtop, Idx node, Idx str_idx) { re_sub_match_last_t *new_entry; if (__glibc_unlikely (subtop->nlasts == subtop->alasts)) { Idx new_alasts = 2 * subtop->alasts + 1; re_sub_match_last_t **new_array = re_realloc (subtop->lasts, re_sub_match_last_t *, new_alasts); if (__glibc_unlikely (new_array == NULL)) return NULL; subtop->lasts = new_array; subtop->alasts = new_alasts; } new_entry = calloc (1, sizeof (re_sub_match_last_t)); if (__glibc_likely (new_entry != NULL)) { subtop->lasts[subtop->nlasts] = new_entry; new_entry->node = node; new_entry->str_idx = str_idx; ++subtop->nlasts; } return new_entry; } static void sift_ctx_init (re_sift_context_t *sctx, re_dfastate_t **sifted_sts, re_dfastate_t **limited_sts, Idx last_node, Idx last_str_idx) { sctx->sifted_states = sifted_sts; sctx->limited_states = limited_sts; sctx->last_node = last_node; sctx->last_str_idx = last_str_idx; re_node_set_init_empty (&sctx->limits); } pspp-1.4.1/gl/crc.c0000644000175000017500000001140313723215636013437 0ustar00blpblp00000000000000/* crc.c -- cyclic redundancy checks Copyright (C) 2005-2006, 2009-2020 Free Software Foundation, Inc. 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 3, 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, see . */ /* Written by Simon Josefsson. */ #include #include "crc.h" /* Table of CRCs of all 8-bit messages. Generated by running code from RFC 1952 modified to print out the table. */ static const uint32_t crc32_table[256] = { 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f, 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988, 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de, 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, 0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9, 0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172, 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, 0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59, 0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, 0xcfba9599, 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924, 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190, 0x01db7106, 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433, 0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01, 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950, 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65, 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0, 0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa, 0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f, 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a, 0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8, 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, 0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb, 0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc, 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, 0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b, 0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, 0x316e8eef, 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236, 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d, 0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713, 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242, 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777, 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45, 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2, 0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc, 0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9, 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693, 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94, 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d }; /* * The following function was extracted from RFC 1952 by Simon * Josefsson. It was modified to avoid initial and final XOR, to use * size_t for the buffer length, and to use the const keyword. */ uint32_t crc32_update_no_xor (uint32_t crc, const char *buf, size_t len) { size_t n; for (n = 0; n < len; n++) crc = crc32_table[(crc ^ buf[n]) & 0xff] ^ (crc >> 8); return crc; } uint32_t crc32_no_xor (const char *buf, size_t len) { return crc32_update_no_xor (0L, buf, len); } uint32_t crc32_update (uint32_t crc, const char *buf, size_t len) { return crc32_update_no_xor (crc ^ 0xffffffff, buf, len) ^ 0xffffffff; } uint32_t crc32 (const char *buf, size_t len) { return crc32_update (0L, buf, len); } pspp-1.4.1/gl/glthread/0000755000175000017500000000000013725012647014316 5ustar00blpblp00000000000000pspp-1.4.1/gl/glthread/threadlib.c0000644000175000017500000000357513723215637016434 0ustar00blpblp00000000000000/* Multithreading primitives. Copyright (C) 2005-2020 Free Software Foundation, Inc. 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 3, 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, see . */ /* Written by Bruno Haible , 2005. */ #include /* ========================================================================= */ #if USE_POSIX_THREADS || USE_ISOC_AND_POSIX_THREADS /* Use the POSIX threads library. */ # include # include # if PTHREAD_IN_USE_DETECTION_HARD /* The function to be executed by a dummy thread. */ static void * dummy_thread_func (void *arg) { return arg; } int glthread_in_use (void) { static int tested; static int result; /* 1: linked with -lpthread, 0: only with libc */ if (!tested) { pthread_t thread; if (pthread_create (&thread, NULL, dummy_thread_func, NULL) != 0) /* Thread creation failed. */ result = 0; else { /* Thread creation works. */ void *retval; if (pthread_join (thread, &retval) != 0) abort (); result = 1; } tested = 1; } return result; } # endif #endif /* ========================================================================= */ /* This declaration is solely to ensure that after preprocessing this file is never empty. */ typedef int dummy; pspp-1.4.1/gl/glthread/lock.c0000644000175000017500000004415013723215637015420 0ustar00blpblp00000000000000/* Locking in multithreaded situations. Copyright (C) 2005-2020 Free Software Foundation, Inc. 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 3, 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, see . */ /* Written by Bruno Haible , 2005. Based on GCC's gthr-posix.h, gthr-posix95.h. */ #include #include "glthread/lock.h" /* ========================================================================= */ #if USE_ISOC_THREADS || USE_ISOC_AND_POSIX_THREADS /* -------------------------- gl_lock_t datatype -------------------------- */ int glthread_lock_init (gl_lock_t *lock) { if (mtx_init (&lock->mutex, mtx_plain) != thrd_success) return ENOMEM; lock->init_needed = 0; return 0; } int glthread_lock_lock (gl_lock_t *lock) { if (lock->init_needed) call_once (&lock->init_once, lock->init_func); if (mtx_lock (&lock->mutex) != thrd_success) return EAGAIN; return 0; } int glthread_lock_unlock (gl_lock_t *lock) { if (lock->init_needed) call_once (&lock->init_once, lock->init_func); if (mtx_unlock (&lock->mutex) != thrd_success) return EINVAL; return 0; } int glthread_lock_destroy (gl_lock_t *lock) { if (lock->init_needed) call_once (&lock->init_once, lock->init_func); mtx_destroy (&lock->mutex); return 0; } /* ------------------------- gl_rwlock_t datatype ------------------------- */ int glthread_rwlock_init (gl_rwlock_t *lock) { if (mtx_init (&lock->lock, mtx_plain) != thrd_success || cnd_init (&lock->waiting_readers) != thrd_success || cnd_init (&lock->waiting_writers) != thrd_success) return ENOMEM; lock->waiting_writers_count = 0; lock->runcount = 0; lock->init_needed = 0; return 0; } int glthread_rwlock_rdlock (gl_rwlock_t *lock) { if (lock->init_needed) call_once (&lock->init_once, lock->init_func); if (mtx_lock (&lock->lock) != thrd_success) return EAGAIN; /* Test whether only readers are currently running, and whether the runcount field will not overflow, and whether no writer is waiting. The latter condition is because POSIX recommends that "write locks shall take precedence over read locks", to avoid "writer starvation". */ while (!(lock->runcount + 1 > 0 && lock->waiting_writers_count == 0)) { /* This thread has to wait for a while. Enqueue it among the waiting_readers. */ if (cnd_wait (&lock->waiting_readers, &lock->lock) != thrd_success) { mtx_unlock (&lock->lock); return EINVAL; } } lock->runcount++; if (mtx_unlock (&lock->lock) != thrd_success) return EINVAL; return 0; } int glthread_rwlock_wrlock (gl_rwlock_t *lock) { if (lock->init_needed) call_once (&lock->init_once, lock->init_func); if (mtx_lock (&lock->lock) != thrd_success) return EAGAIN; /* Test whether no readers or writers are currently running. */ while (!(lock->runcount == 0)) { /* This thread has to wait for a while. Enqueue it among the waiting_writers. */ lock->waiting_writers_count++; if (cnd_wait (&lock->waiting_writers, &lock->lock) != thrd_success) { lock->waiting_writers_count--; mtx_unlock (&lock->lock); return EINVAL; } lock->waiting_writers_count--; } lock->runcount--; /* runcount becomes -1 */ if (mtx_unlock (&lock->lock) != thrd_success) return EINVAL; return 0; } int glthread_rwlock_unlock (gl_rwlock_t *lock) { if (lock->init_needed) call_once (&lock->init_once, lock->init_func); if (mtx_lock (&lock->lock) != thrd_success) return EAGAIN; if (lock->runcount < 0) { /* Drop a writer lock. */ if (!(lock->runcount == -1)) { mtx_unlock (&lock->lock); return EINVAL; } lock->runcount = 0; } else { /* Drop a reader lock. */ if (!(lock->runcount > 0)) { mtx_unlock (&lock->lock); return EINVAL; } lock->runcount--; } if (lock->runcount == 0) { /* POSIX recommends that "write locks shall take precedence over read locks", to avoid "writer starvation". */ if (lock->waiting_writers_count > 0) { /* Wake up one of the waiting writers. */ if (cnd_signal (&lock->waiting_writers) != thrd_success) { mtx_unlock (&lock->lock); return EINVAL; } } else { /* Wake up all waiting readers. */ if (cnd_broadcast (&lock->waiting_readers) != thrd_success) { mtx_unlock (&lock->lock); return EINVAL; } } } if (mtx_unlock (&lock->lock) != thrd_success) return EINVAL; return 0; } int glthread_rwlock_destroy (gl_rwlock_t *lock) { if (lock->init_needed) call_once (&lock->init_once, lock->init_func); mtx_destroy (&lock->lock); cnd_destroy (&lock->waiting_readers); cnd_destroy (&lock->waiting_writers); return 0; } /* --------------------- gl_recursive_lock_t datatype --------------------- */ int glthread_recursive_lock_init (gl_recursive_lock_t *lock) { if (mtx_init (&lock->mutex, mtx_plain | mtx_recursive) != thrd_success) return ENOMEM; lock->init_needed = 0; return 0; } int glthread_recursive_lock_lock (gl_recursive_lock_t *lock) { if (lock->init_needed) call_once (&lock->init_once, lock->init_func); if (mtx_lock (&lock->mutex) != thrd_success) return EAGAIN; return 0; } int glthread_recursive_lock_unlock (gl_recursive_lock_t *lock) { if (lock->init_needed) call_once (&lock->init_once, lock->init_func); if (mtx_unlock (&lock->mutex) != thrd_success) return EINVAL; return 0; } int glthread_recursive_lock_destroy (gl_recursive_lock_t *lock) { if (lock->init_needed) call_once (&lock->init_once, lock->init_func); mtx_destroy (&lock->mutex); return 0; } /* -------------------------- gl_once_t datatype -------------------------- */ #endif /* ========================================================================= */ #if USE_POSIX_THREADS /* -------------------------- gl_lock_t datatype -------------------------- */ /* ------------------------- gl_rwlock_t datatype ------------------------- */ # if HAVE_PTHREAD_RWLOCK && (HAVE_PTHREAD_RWLOCK_RDLOCK_PREFER_WRITER || (defined PTHREAD_RWLOCK_WRITER_NONRECURSIVE_INITIALIZER_NP && (__GNU_LIBRARY__ > 1))) # if defined PTHREAD_RWLOCK_INITIALIZER || defined PTHREAD_RWLOCK_INITIALIZER_NP # if !HAVE_PTHREAD_RWLOCK_RDLOCK_PREFER_WRITER /* glibc with bug https://sourceware.org/bugzilla/show_bug.cgi?id=13701 */ int glthread_rwlock_init_for_glibc (pthread_rwlock_t *lock) { pthread_rwlockattr_t attributes; int err; err = pthread_rwlockattr_init (&attributes); if (err != 0) return err; /* Note: PTHREAD_RWLOCK_PREFER_WRITER_NONRECURSIVE_NP is the only value that causes the writer to be preferred. PTHREAD_RWLOCK_PREFER_WRITER_NP does not do this; see http://man7.org/linux/man-pages/man3/pthread_rwlockattr_setkind_np.3.html */ err = pthread_rwlockattr_setkind_np (&attributes, PTHREAD_RWLOCK_PREFER_WRITER_NONRECURSIVE_NP); if (err == 0) err = pthread_rwlock_init(lock, &attributes); /* pthread_rwlockattr_destroy always returns 0. It cannot influence the return value. */ pthread_rwlockattr_destroy (&attributes); return err; } # endif # else int glthread_rwlock_init_multithreaded (gl_rwlock_t *lock) { int err; err = pthread_rwlock_init (&lock->rwlock, NULL); if (err != 0) return err; lock->initialized = 1; return 0; } int glthread_rwlock_rdlock_multithreaded (gl_rwlock_t *lock) { if (!lock->initialized) { int err; err = pthread_mutex_lock (&lock->guard); if (err != 0) return err; if (!lock->initialized) { err = glthread_rwlock_init_multithreaded (lock); if (err != 0) { pthread_mutex_unlock (&lock->guard); return err; } } err = pthread_mutex_unlock (&lock->guard); if (err != 0) return err; } return pthread_rwlock_rdlock (&lock->rwlock); } int glthread_rwlock_wrlock_multithreaded (gl_rwlock_t *lock) { if (!lock->initialized) { int err; err = pthread_mutex_lock (&lock->guard); if (err != 0) return err; if (!lock->initialized) { err = glthread_rwlock_init_multithreaded (lock); if (err != 0) { pthread_mutex_unlock (&lock->guard); return err; } } err = pthread_mutex_unlock (&lock->guard); if (err != 0) return err; } return pthread_rwlock_wrlock (&lock->rwlock); } int glthread_rwlock_unlock_multithreaded (gl_rwlock_t *lock) { if (!lock->initialized) return EINVAL; return pthread_rwlock_unlock (&lock->rwlock); } int glthread_rwlock_destroy_multithreaded (gl_rwlock_t *lock) { int err; if (!lock->initialized) return EINVAL; err = pthread_rwlock_destroy (&lock->rwlock); if (err != 0) return err; lock->initialized = 0; return 0; } # endif # else int glthread_rwlock_init_multithreaded (gl_rwlock_t *lock) { int err; err = pthread_mutex_init (&lock->lock, NULL); if (err != 0) return err; err = pthread_cond_init (&lock->waiting_readers, NULL); if (err != 0) return err; err = pthread_cond_init (&lock->waiting_writers, NULL); if (err != 0) return err; lock->waiting_writers_count = 0; lock->runcount = 0; return 0; } int glthread_rwlock_rdlock_multithreaded (gl_rwlock_t *lock) { int err; err = pthread_mutex_lock (&lock->lock); if (err != 0) return err; /* Test whether only readers are currently running, and whether the runcount field will not overflow, and whether no writer is waiting. The latter condition is because POSIX recommends that "write locks shall take precedence over read locks", to avoid "writer starvation". */ while (!(lock->runcount + 1 > 0 && lock->waiting_writers_count == 0)) { /* This thread has to wait for a while. Enqueue it among the waiting_readers. */ err = pthread_cond_wait (&lock->waiting_readers, &lock->lock); if (err != 0) { pthread_mutex_unlock (&lock->lock); return err; } } lock->runcount++; return pthread_mutex_unlock (&lock->lock); } int glthread_rwlock_wrlock_multithreaded (gl_rwlock_t *lock) { int err; err = pthread_mutex_lock (&lock->lock); if (err != 0) return err; /* Test whether no readers or writers are currently running. */ while (!(lock->runcount == 0)) { /* This thread has to wait for a while. Enqueue it among the waiting_writers. */ lock->waiting_writers_count++; err = pthread_cond_wait (&lock->waiting_writers, &lock->lock); if (err != 0) { lock->waiting_writers_count--; pthread_mutex_unlock (&lock->lock); return err; } lock->waiting_writers_count--; } lock->runcount--; /* runcount becomes -1 */ return pthread_mutex_unlock (&lock->lock); } int glthread_rwlock_unlock_multithreaded (gl_rwlock_t *lock) { int err; err = pthread_mutex_lock (&lock->lock); if (err != 0) return err; if (lock->runcount < 0) { /* Drop a writer lock. */ if (!(lock->runcount == -1)) { pthread_mutex_unlock (&lock->lock); return EINVAL; } lock->runcount = 0; } else { /* Drop a reader lock. */ if (!(lock->runcount > 0)) { pthread_mutex_unlock (&lock->lock); return EINVAL; } lock->runcount--; } if (lock->runcount == 0) { /* POSIX recommends that "write locks shall take precedence over read locks", to avoid "writer starvation". */ if (lock->waiting_writers_count > 0) { /* Wake up one of the waiting writers. */ err = pthread_cond_signal (&lock->waiting_writers); if (err != 0) { pthread_mutex_unlock (&lock->lock); return err; } } else { /* Wake up all waiting readers. */ err = pthread_cond_broadcast (&lock->waiting_readers); if (err != 0) { pthread_mutex_unlock (&lock->lock); return err; } } } return pthread_mutex_unlock (&lock->lock); } int glthread_rwlock_destroy_multithreaded (gl_rwlock_t *lock) { int err; err = pthread_mutex_destroy (&lock->lock); if (err != 0) return err; err = pthread_cond_destroy (&lock->waiting_readers); if (err != 0) return err; err = pthread_cond_destroy (&lock->waiting_writers); if (err != 0) return err; return 0; } # endif /* --------------------- gl_recursive_lock_t datatype --------------------- */ # if HAVE_PTHREAD_MUTEX_RECURSIVE # if defined PTHREAD_RECURSIVE_MUTEX_INITIALIZER || defined PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP int glthread_recursive_lock_init_multithreaded (gl_recursive_lock_t *lock) { pthread_mutexattr_t attributes; int err; err = pthread_mutexattr_init (&attributes); if (err != 0) return err; err = pthread_mutexattr_settype (&attributes, PTHREAD_MUTEX_RECURSIVE); if (err != 0) { pthread_mutexattr_destroy (&attributes); return err; } err = pthread_mutex_init (lock, &attributes); if (err != 0) { pthread_mutexattr_destroy (&attributes); return err; } err = pthread_mutexattr_destroy (&attributes); if (err != 0) return err; return 0; } # else int glthread_recursive_lock_init_multithreaded (gl_recursive_lock_t *lock) { pthread_mutexattr_t attributes; int err; err = pthread_mutexattr_init (&attributes); if (err != 0) return err; err = pthread_mutexattr_settype (&attributes, PTHREAD_MUTEX_RECURSIVE); if (err != 0) { pthread_mutexattr_destroy (&attributes); return err; } err = pthread_mutex_init (&lock->recmutex, &attributes); if (err != 0) { pthread_mutexattr_destroy (&attributes); return err; } err = pthread_mutexattr_destroy (&attributes); if (err != 0) return err; lock->initialized = 1; return 0; } int glthread_recursive_lock_lock_multithreaded (gl_recursive_lock_t *lock) { if (!lock->initialized) { int err; err = pthread_mutex_lock (&lock->guard); if (err != 0) return err; if (!lock->initialized) { err = glthread_recursive_lock_init_multithreaded (lock); if (err != 0) { pthread_mutex_unlock (&lock->guard); return err; } } err = pthread_mutex_unlock (&lock->guard); if (err != 0) return err; } return pthread_mutex_lock (&lock->recmutex); } int glthread_recursive_lock_unlock_multithreaded (gl_recursive_lock_t *lock) { if (!lock->initialized) return EINVAL; return pthread_mutex_unlock (&lock->recmutex); } int glthread_recursive_lock_destroy_multithreaded (gl_recursive_lock_t *lock) { int err; if (!lock->initialized) return EINVAL; err = pthread_mutex_destroy (&lock->recmutex); if (err != 0) return err; lock->initialized = 0; return 0; } # endif # else int glthread_recursive_lock_init_multithreaded (gl_recursive_lock_t *lock) { int err; err = pthread_mutex_init (&lock->mutex, NULL); if (err != 0) return err; lock->owner = (pthread_t) 0; lock->depth = 0; return 0; } int glthread_recursive_lock_lock_multithreaded (gl_recursive_lock_t *lock) { pthread_t self = pthread_self (); if (lock->owner != self) { int err; err = pthread_mutex_lock (&lock->mutex); if (err != 0) return err; lock->owner = self; } if (++(lock->depth) == 0) /* wraparound? */ { lock->depth--; return EAGAIN; } return 0; } int glthread_recursive_lock_unlock_multithreaded (gl_recursive_lock_t *lock) { if (lock->owner != pthread_self ()) return EPERM; if (lock->depth == 0) return EINVAL; if (--(lock->depth) == 0) { lock->owner = (pthread_t) 0; return pthread_mutex_unlock (&lock->mutex); } else return 0; } int glthread_recursive_lock_destroy_multithreaded (gl_recursive_lock_t *lock) { if (lock->owner != (pthread_t) 0) return EBUSY; return pthread_mutex_destroy (&lock->mutex); } # endif /* -------------------------- gl_once_t datatype -------------------------- */ static const pthread_once_t fresh_once = PTHREAD_ONCE_INIT; int glthread_once_singlethreaded (pthread_once_t *once_control) { /* We don't know whether pthread_once_t is an integer type, a floating-point type, a pointer type, or a structure type. */ char *firstbyte = (char *)once_control; if (*firstbyte == *(const char *)&fresh_once) { /* First time use of once_control. Invert the first byte. */ *firstbyte = ~ *(const char *)&fresh_once; return 1; } else return 0; } # if !(PTHREAD_IN_USE_DETECTION_HARD || USE_POSIX_THREADS_WEAK) int glthread_once_multithreaded (pthread_once_t *once_control, void (*init_function) (void)) { int err = pthread_once (once_control, init_function); if (err == ENOSYS) { /* This happens on FreeBSD 11: The pthread_once function in libc returns ENOSYS. */ if (glthread_once_singlethreaded (once_control)) init_function (); return 0; } return err; } # endif #endif /* ========================================================================= */ #if USE_WINDOWS_THREADS #endif /* ========================================================================= */ pspp-1.4.1/gl/glthread/lock.h0000644000175000017500000007527713723215637015443 0ustar00blpblp00000000000000/* Locking in multithreaded situations. Copyright (C) 2005-2020 Free Software Foundation, Inc. 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 3, 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, see . */ /* Written by Bruno Haible , 2005. Based on GCC's gthr-posix.h, gthr-posix95.h, gthr-win32.h. */ /* This file contains locking primitives for use with a given thread library. It does not contain primitives for creating threads or for other synchronization primitives. Normal (non-recursive) locks: Type: gl_lock_t Declaration: gl_lock_define(extern, name) Initializer: gl_lock_define_initialized(, name) Initialization: gl_lock_init (name); Taking the lock: gl_lock_lock (name); Releasing the lock: gl_lock_unlock (name); De-initialization: gl_lock_destroy (name); Equivalent functions with control of error handling: Initialization: err = glthread_lock_init (&name); Taking the lock: err = glthread_lock_lock (&name); Releasing the lock: err = glthread_lock_unlock (&name); De-initialization: err = glthread_lock_destroy (&name); Read-Write (non-recursive) locks: Type: gl_rwlock_t Declaration: gl_rwlock_define(extern, name) Initializer: gl_rwlock_define_initialized(, name) Initialization: gl_rwlock_init (name); Taking the lock: gl_rwlock_rdlock (name); gl_rwlock_wrlock (name); Releasing the lock: gl_rwlock_unlock (name); De-initialization: gl_rwlock_destroy (name); Equivalent functions with control of error handling: Initialization: err = glthread_rwlock_init (&name); Taking the lock: err = glthread_rwlock_rdlock (&name); err = glthread_rwlock_wrlock (&name); Releasing the lock: err = glthread_rwlock_unlock (&name); De-initialization: err = glthread_rwlock_destroy (&name); Recursive locks: Type: gl_recursive_lock_t Declaration: gl_recursive_lock_define(extern, name) Initializer: gl_recursive_lock_define_initialized(, name) Initialization: gl_recursive_lock_init (name); Taking the lock: gl_recursive_lock_lock (name); Releasing the lock: gl_recursive_lock_unlock (name); De-initialization: gl_recursive_lock_destroy (name); Equivalent functions with control of error handling: Initialization: err = glthread_recursive_lock_init (&name); Taking the lock: err = glthread_recursive_lock_lock (&name); Releasing the lock: err = glthread_recursive_lock_unlock (&name); De-initialization: err = glthread_recursive_lock_destroy (&name); Once-only execution: Type: gl_once_t Initializer: gl_once_define(extern, name) Execution: gl_once (name, initfunction); Equivalent functions with control of error handling: Execution: err = glthread_once (&name, initfunction); */ #ifndef _LOCK_H #define _LOCK_H #include #include #if !defined c11_threads_in_use # if HAVE_THREADS_H && USE_POSIX_THREADS_WEAK # include # pragma weak thrd_exit # define c11_threads_in_use() (thrd_exit != NULL) # else # define c11_threads_in_use() 0 # endif #endif /* ========================================================================= */ #if USE_ISOC_THREADS || USE_ISOC_AND_POSIX_THREADS /* Use the ISO C threads library. */ # include # ifdef __cplusplus extern "C" { # endif /* -------------------------- gl_lock_t datatype -------------------------- */ typedef struct { int volatile init_needed; once_flag init_once; void (*init_func) (void); mtx_t mutex; } gl_lock_t; # define gl_lock_define(STORAGECLASS, NAME) \ STORAGECLASS gl_lock_t NAME; # define gl_lock_define_initialized(STORAGECLASS, NAME) \ static void _atomic_init_##NAME (void); \ STORAGECLASS gl_lock_t NAME = \ { 1, ONCE_FLAG_INIT, _atomic_init_##NAME }; \ static void _atomic_init_##NAME (void) \ { \ if (glthread_lock_init (&(NAME))) \ abort (); \ } extern int glthread_lock_init (gl_lock_t *lock); extern int glthread_lock_lock (gl_lock_t *lock); extern int glthread_lock_unlock (gl_lock_t *lock); extern int glthread_lock_destroy (gl_lock_t *lock); /* ------------------------- gl_rwlock_t datatype ------------------------- */ typedef struct { int volatile init_needed; once_flag init_once; void (*init_func) (void); mtx_t lock; /* protects the remaining fields */ cnd_t waiting_readers; /* waiting readers */ cnd_t waiting_writers; /* waiting writers */ unsigned int waiting_writers_count; /* number of waiting writers */ int runcount; /* number of readers running, or -1 when a writer runs */ } gl_rwlock_t; # define gl_rwlock_define(STORAGECLASS, NAME) \ STORAGECLASS gl_rwlock_t NAME; # define gl_rwlock_define_initialized(STORAGECLASS, NAME) \ static void _atomic_init_##NAME (void); \ STORAGECLASS gl_rwlock_t NAME = \ { 1, ONCE_FLAG_INIT, _atomic_init_##NAME }; \ static void _atomic_init_##NAME (void) \ { \ if (glthread_rwlock_init (&(NAME))) \ abort (); \ } extern int glthread_rwlock_init (gl_rwlock_t *lock); extern int glthread_rwlock_rdlock (gl_rwlock_t *lock); extern int glthread_rwlock_wrlock (gl_rwlock_t *lock); extern int glthread_rwlock_unlock (gl_rwlock_t *lock); extern int glthread_rwlock_destroy (gl_rwlock_t *lock); /* --------------------- gl_recursive_lock_t datatype --------------------- */ typedef struct { int volatile init_needed; once_flag init_once; void (*init_func) (void); mtx_t mutex; } gl_recursive_lock_t; # define gl_recursive_lock_define(STORAGECLASS, NAME) \ STORAGECLASS gl_recursive_lock_t NAME; # define gl_recursive_lock_define_initialized(STORAGECLASS, NAME) \ static void _atomic_init_##NAME (void); \ STORAGECLASS gl_recursive_lock_t NAME = \ { 1, ONCE_FLAG_INIT, _atomic_init_##NAME }; \ static void _atomic_init_##NAME (void) \ { \ if (glthread_recursive_lock_init (&(NAME))) \ abort (); \ } extern int glthread_recursive_lock_init (gl_recursive_lock_t *lock); extern int glthread_recursive_lock_lock (gl_recursive_lock_t *lock); extern int glthread_recursive_lock_unlock (gl_recursive_lock_t *lock); extern int glthread_recursive_lock_destroy (gl_recursive_lock_t *lock); /* -------------------------- gl_once_t datatype -------------------------- */ typedef once_flag gl_once_t; # define gl_once_define(STORAGECLASS, NAME) \ STORAGECLASS once_flag NAME = ONCE_FLAG_INIT; # define glthread_once(ONCE_CONTROL, INITFUNCTION) \ (call_once (ONCE_CONTROL, INITFUNCTION), 0) # ifdef __cplusplus } # endif #endif /* ========================================================================= */ #if USE_POSIX_THREADS /* Use the POSIX threads library. */ # include # ifdef __cplusplus extern "C" { # endif # if PTHREAD_IN_USE_DETECTION_HARD /* The pthread_in_use() detection needs to be done at runtime. */ # define pthread_in_use() \ glthread_in_use () extern int glthread_in_use (void); # endif # if USE_POSIX_THREADS_WEAK /* Use weak references to the POSIX threads library. */ /* Weak references avoid dragging in external libraries if the other parts of the program don't use them. Here we use them, because we don't want every program that uses libintl to depend on libpthread. This assumes that libpthread would not be loaded after libintl; i.e. if libintl is loaded first, by an executable that does not depend on libpthread, and then a module is dynamically loaded that depends on libpthread, libintl will not be multithread-safe. */ /* The way to test at runtime whether libpthread is present is to test whether a function pointer's value, such as &pthread_mutex_init, is non-NULL. However, some versions of GCC have a bug through which, in PIC mode, &foo != NULL always evaluates to true if there is a direct call to foo(...) in the same function. To avoid this, we test the address of a function in libpthread that we don't use. */ # pragma weak pthread_mutex_init # pragma weak pthread_mutex_lock # pragma weak pthread_mutex_unlock # pragma weak pthread_mutex_destroy # pragma weak pthread_rwlock_init # pragma weak pthread_rwlock_rdlock # pragma weak pthread_rwlock_wrlock # pragma weak pthread_rwlock_unlock # pragma weak pthread_rwlock_destroy # pragma weak pthread_once # pragma weak pthread_cond_init # pragma weak pthread_cond_wait # pragma weak pthread_cond_signal # pragma weak pthread_cond_broadcast # pragma weak pthread_cond_destroy # pragma weak pthread_mutexattr_init # pragma weak pthread_mutexattr_settype # pragma weak pthread_mutexattr_destroy # pragma weak pthread_rwlockattr_init # if __GNU_LIBRARY__ > 1 # pragma weak pthread_rwlockattr_setkind_np # endif # pragma weak pthread_rwlockattr_destroy # ifndef pthread_self # pragma weak pthread_self # endif # if !PTHREAD_IN_USE_DETECTION_HARD /* Considering all platforms with USE_POSIX_THREADS_WEAK, only few symbols can be used to determine whether libpthread is in use. These are: pthread_mutexattr_gettype pthread_rwlockattr_destroy pthread_rwlockattr_init */ # pragma weak pthread_mutexattr_gettype # define pthread_in_use() \ (pthread_mutexattr_gettype != NULL || c11_threads_in_use ()) # endif # else # if !PTHREAD_IN_USE_DETECTION_HARD # define pthread_in_use() 1 # endif # endif /* -------------------------- gl_lock_t datatype -------------------------- */ typedef pthread_mutex_t gl_lock_t; # define gl_lock_define(STORAGECLASS, NAME) \ STORAGECLASS pthread_mutex_t NAME; # define gl_lock_define_initialized(STORAGECLASS, NAME) \ STORAGECLASS pthread_mutex_t NAME = gl_lock_initializer; # define gl_lock_initializer \ PTHREAD_MUTEX_INITIALIZER # define glthread_lock_init(LOCK) \ (pthread_in_use () ? pthread_mutex_init (LOCK, NULL) : 0) # define glthread_lock_lock(LOCK) \ (pthread_in_use () ? pthread_mutex_lock (LOCK) : 0) # define glthread_lock_unlock(LOCK) \ (pthread_in_use () ? pthread_mutex_unlock (LOCK) : 0) # define glthread_lock_destroy(LOCK) \ (pthread_in_use () ? pthread_mutex_destroy (LOCK) : 0) /* ------------------------- gl_rwlock_t datatype ------------------------- */ # if HAVE_PTHREAD_RWLOCK && (HAVE_PTHREAD_RWLOCK_RDLOCK_PREFER_WRITER || (defined PTHREAD_RWLOCK_WRITER_NONRECURSIVE_INITIALIZER_NP && (__GNU_LIBRARY__ > 1))) # if defined PTHREAD_RWLOCK_INITIALIZER || defined PTHREAD_RWLOCK_INITIALIZER_NP typedef pthread_rwlock_t gl_rwlock_t; # define gl_rwlock_define(STORAGECLASS, NAME) \ STORAGECLASS pthread_rwlock_t NAME; # define gl_rwlock_define_initialized(STORAGECLASS, NAME) \ STORAGECLASS pthread_rwlock_t NAME = gl_rwlock_initializer; # if HAVE_PTHREAD_RWLOCK_RDLOCK_PREFER_WRITER # if defined PTHREAD_RWLOCK_INITIALIZER # define gl_rwlock_initializer \ PTHREAD_RWLOCK_INITIALIZER # else # define gl_rwlock_initializer \ PTHREAD_RWLOCK_INITIALIZER_NP # endif # define glthread_rwlock_init(LOCK) \ (pthread_in_use () ? pthread_rwlock_init (LOCK, NULL) : 0) # else /* glibc with bug https://sourceware.org/bugzilla/show_bug.cgi?id=13701 */ # define gl_rwlock_initializer \ PTHREAD_RWLOCK_WRITER_NONRECURSIVE_INITIALIZER_NP # define glthread_rwlock_init(LOCK) \ (pthread_in_use () ? glthread_rwlock_init_for_glibc (LOCK) : 0) extern int glthread_rwlock_init_for_glibc (pthread_rwlock_t *lock); # endif # define glthread_rwlock_rdlock(LOCK) \ (pthread_in_use () ? pthread_rwlock_rdlock (LOCK) : 0) # define glthread_rwlock_wrlock(LOCK) \ (pthread_in_use () ? pthread_rwlock_wrlock (LOCK) : 0) # define glthread_rwlock_unlock(LOCK) \ (pthread_in_use () ? pthread_rwlock_unlock (LOCK) : 0) # define glthread_rwlock_destroy(LOCK) \ (pthread_in_use () ? pthread_rwlock_destroy (LOCK) : 0) # else typedef struct { int initialized; pthread_mutex_t guard; /* protects the initialization */ pthread_rwlock_t rwlock; /* read-write lock */ } gl_rwlock_t; # define gl_rwlock_define(STORAGECLASS, NAME) \ STORAGECLASS gl_rwlock_t NAME; # define gl_rwlock_define_initialized(STORAGECLASS, NAME) \ STORAGECLASS gl_rwlock_t NAME = gl_rwlock_initializer; # define gl_rwlock_initializer \ { 0, PTHREAD_MUTEX_INITIALIZER } # define glthread_rwlock_init(LOCK) \ (pthread_in_use () ? glthread_rwlock_init_multithreaded (LOCK) : 0) # define glthread_rwlock_rdlock(LOCK) \ (pthread_in_use () ? glthread_rwlock_rdlock_multithreaded (LOCK) : 0) # define glthread_rwlock_wrlock(LOCK) \ (pthread_in_use () ? glthread_rwlock_wrlock_multithreaded (LOCK) : 0) # define glthread_rwlock_unlock(LOCK) \ (pthread_in_use () ? glthread_rwlock_unlock_multithreaded (LOCK) : 0) # define glthread_rwlock_destroy(LOCK) \ (pthread_in_use () ? glthread_rwlock_destroy_multithreaded (LOCK) : 0) extern int glthread_rwlock_init_multithreaded (gl_rwlock_t *lock); extern int glthread_rwlock_rdlock_multithreaded (gl_rwlock_t *lock); extern int glthread_rwlock_wrlock_multithreaded (gl_rwlock_t *lock); extern int glthread_rwlock_unlock_multithreaded (gl_rwlock_t *lock); extern int glthread_rwlock_destroy_multithreaded (gl_rwlock_t *lock); # endif # else typedef struct { pthread_mutex_t lock; /* protects the remaining fields */ pthread_cond_t waiting_readers; /* waiting readers */ pthread_cond_t waiting_writers; /* waiting writers */ unsigned int waiting_writers_count; /* number of waiting writers */ int runcount; /* number of readers running, or -1 when a writer runs */ } gl_rwlock_t; # define gl_rwlock_define(STORAGECLASS, NAME) \ STORAGECLASS gl_rwlock_t NAME; # define gl_rwlock_define_initialized(STORAGECLASS, NAME) \ STORAGECLASS gl_rwlock_t NAME = gl_rwlock_initializer; # define gl_rwlock_initializer \ { PTHREAD_MUTEX_INITIALIZER, PTHREAD_COND_INITIALIZER, PTHREAD_COND_INITIALIZER, 0, 0 } # define glthread_rwlock_init(LOCK) \ (pthread_in_use () ? glthread_rwlock_init_multithreaded (LOCK) : 0) # define glthread_rwlock_rdlock(LOCK) \ (pthread_in_use () ? glthread_rwlock_rdlock_multithreaded (LOCK) : 0) # define glthread_rwlock_wrlock(LOCK) \ (pthread_in_use () ? glthread_rwlock_wrlock_multithreaded (LOCK) : 0) # define glthread_rwlock_unlock(LOCK) \ (pthread_in_use () ? glthread_rwlock_unlock_multithreaded (LOCK) : 0) # define glthread_rwlock_destroy(LOCK) \ (pthread_in_use () ? glthread_rwlock_destroy_multithreaded (LOCK) : 0) extern int glthread_rwlock_init_multithreaded (gl_rwlock_t *lock); extern int glthread_rwlock_rdlock_multithreaded (gl_rwlock_t *lock); extern int glthread_rwlock_wrlock_multithreaded (gl_rwlock_t *lock); extern int glthread_rwlock_unlock_multithreaded (gl_rwlock_t *lock); extern int glthread_rwlock_destroy_multithreaded (gl_rwlock_t *lock); # endif /* --------------------- gl_recursive_lock_t datatype --------------------- */ # if HAVE_PTHREAD_MUTEX_RECURSIVE # if defined PTHREAD_RECURSIVE_MUTEX_INITIALIZER || defined PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP typedef pthread_mutex_t gl_recursive_lock_t; # define gl_recursive_lock_define(STORAGECLASS, NAME) \ STORAGECLASS pthread_mutex_t NAME; # define gl_recursive_lock_define_initialized(STORAGECLASS, NAME) \ STORAGECLASS pthread_mutex_t NAME = gl_recursive_lock_initializer; # ifdef PTHREAD_RECURSIVE_MUTEX_INITIALIZER # define gl_recursive_lock_initializer \ PTHREAD_RECURSIVE_MUTEX_INITIALIZER # else # define gl_recursive_lock_initializer \ PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP # endif # define glthread_recursive_lock_init(LOCK) \ (pthread_in_use () ? glthread_recursive_lock_init_multithreaded (LOCK) : 0) # define glthread_recursive_lock_lock(LOCK) \ (pthread_in_use () ? pthread_mutex_lock (LOCK) : 0) # define glthread_recursive_lock_unlock(LOCK) \ (pthread_in_use () ? pthread_mutex_unlock (LOCK) : 0) # define glthread_recursive_lock_destroy(LOCK) \ (pthread_in_use () ? pthread_mutex_destroy (LOCK) : 0) extern int glthread_recursive_lock_init_multithreaded (gl_recursive_lock_t *lock); # else typedef struct { pthread_mutex_t recmutex; /* recursive mutex */ pthread_mutex_t guard; /* protects the initialization */ int initialized; } gl_recursive_lock_t; # define gl_recursive_lock_define(STORAGECLASS, NAME) \ STORAGECLASS gl_recursive_lock_t NAME; # define gl_recursive_lock_define_initialized(STORAGECLASS, NAME) \ STORAGECLASS gl_recursive_lock_t NAME = gl_recursive_lock_initializer; # define gl_recursive_lock_initializer \ { PTHREAD_MUTEX_INITIALIZER, PTHREAD_MUTEX_INITIALIZER, 0 } # define glthread_recursive_lock_init(LOCK) \ (pthread_in_use () ? glthread_recursive_lock_init_multithreaded (LOCK) : 0) # define glthread_recursive_lock_lock(LOCK) \ (pthread_in_use () ? glthread_recursive_lock_lock_multithreaded (LOCK) : 0) # define glthread_recursive_lock_unlock(LOCK) \ (pthread_in_use () ? glthread_recursive_lock_unlock_multithreaded (LOCK) : 0) # define glthread_recursive_lock_destroy(LOCK) \ (pthread_in_use () ? glthread_recursive_lock_destroy_multithreaded (LOCK) : 0) extern int glthread_recursive_lock_init_multithreaded (gl_recursive_lock_t *lock); extern int glthread_recursive_lock_lock_multithreaded (gl_recursive_lock_t *lock); extern int glthread_recursive_lock_unlock_multithreaded (gl_recursive_lock_t *lock); extern int glthread_recursive_lock_destroy_multithreaded (gl_recursive_lock_t *lock); # endif # else /* Old versions of POSIX threads on Solaris did not have recursive locks. We have to implement them ourselves. */ typedef struct { pthread_mutex_t mutex; pthread_t owner; unsigned long depth; } gl_recursive_lock_t; # define gl_recursive_lock_define(STORAGECLASS, NAME) \ STORAGECLASS gl_recursive_lock_t NAME; # define gl_recursive_lock_define_initialized(STORAGECLASS, NAME) \ STORAGECLASS gl_recursive_lock_t NAME = gl_recursive_lock_initializer; # define gl_recursive_lock_initializer \ { PTHREAD_MUTEX_INITIALIZER, (pthread_t) 0, 0 } # define glthread_recursive_lock_init(LOCK) \ (pthread_in_use () ? glthread_recursive_lock_init_multithreaded (LOCK) : 0) # define glthread_recursive_lock_lock(LOCK) \ (pthread_in_use () ? glthread_recursive_lock_lock_multithreaded (LOCK) : 0) # define glthread_recursive_lock_unlock(LOCK) \ (pthread_in_use () ? glthread_recursive_lock_unlock_multithreaded (LOCK) : 0) # define glthread_recursive_lock_destroy(LOCK) \ (pthread_in_use () ? glthread_recursive_lock_destroy_multithreaded (LOCK) : 0) extern int glthread_recursive_lock_init_multithreaded (gl_recursive_lock_t *lock); extern int glthread_recursive_lock_lock_multithreaded (gl_recursive_lock_t *lock); extern int glthread_recursive_lock_unlock_multithreaded (gl_recursive_lock_t *lock); extern int glthread_recursive_lock_destroy_multithreaded (gl_recursive_lock_t *lock); # endif /* -------------------------- gl_once_t datatype -------------------------- */ typedef pthread_once_t gl_once_t; # define gl_once_define(STORAGECLASS, NAME) \ STORAGECLASS pthread_once_t NAME = PTHREAD_ONCE_INIT; # if PTHREAD_IN_USE_DETECTION_HARD || USE_POSIX_THREADS_WEAK # define glthread_once(ONCE_CONTROL, INITFUNCTION) \ (pthread_in_use () \ ? pthread_once (ONCE_CONTROL, INITFUNCTION) \ : (glthread_once_singlethreaded (ONCE_CONTROL) ? (INITFUNCTION (), 0) : 0)) # else # define glthread_once(ONCE_CONTROL, INITFUNCTION) \ (pthread_in_use () \ ? glthread_once_multithreaded (ONCE_CONTROL, INITFUNCTION) \ : (glthread_once_singlethreaded (ONCE_CONTROL) ? (INITFUNCTION (), 0) : 0)) extern int glthread_once_multithreaded (pthread_once_t *once_control, void (*init_function) (void)); # endif extern int glthread_once_singlethreaded (pthread_once_t *once_control); # ifdef __cplusplus } # endif #endif /* ========================================================================= */ #if USE_WINDOWS_THREADS # define WIN32_LEAN_AND_MEAN /* avoid including junk */ # include # include "windows-mutex.h" # include "windows-rwlock.h" # include "windows-recmutex.h" # include "windows-once.h" # ifdef __cplusplus extern "C" { # endif /* We can use CRITICAL_SECTION directly, rather than the native Windows Event, Mutex, Semaphore types, because - we need only to synchronize inside a single process (address space), not inter-process locking, - we don't need to support trylock operations. (TryEnterCriticalSection does not work on Windows 95/98/ME. Packages that need trylock usually define their own mutex type.) */ /* There is no way to statically initialize a CRITICAL_SECTION. It needs to be done lazily, once only. For this we need spinlocks. */ /* -------------------------- gl_lock_t datatype -------------------------- */ typedef glwthread_mutex_t gl_lock_t; # define gl_lock_define(STORAGECLASS, NAME) \ STORAGECLASS gl_lock_t NAME; # define gl_lock_define_initialized(STORAGECLASS, NAME) \ STORAGECLASS gl_lock_t NAME = gl_lock_initializer; # define gl_lock_initializer \ GLWTHREAD_MUTEX_INIT # define glthread_lock_init(LOCK) \ (glwthread_mutex_init (LOCK), 0) # define glthread_lock_lock(LOCK) \ glwthread_mutex_lock (LOCK) # define glthread_lock_unlock(LOCK) \ glwthread_mutex_unlock (LOCK) # define glthread_lock_destroy(LOCK) \ glwthread_mutex_destroy (LOCK) /* ------------------------- gl_rwlock_t datatype ------------------------- */ typedef glwthread_rwlock_t gl_rwlock_t; # define gl_rwlock_define(STORAGECLASS, NAME) \ STORAGECLASS gl_rwlock_t NAME; # define gl_rwlock_define_initialized(STORAGECLASS, NAME) \ STORAGECLASS gl_rwlock_t NAME = gl_rwlock_initializer; # define gl_rwlock_initializer \ GLWTHREAD_RWLOCK_INIT # define glthread_rwlock_init(LOCK) \ (glwthread_rwlock_init (LOCK), 0) # define glthread_rwlock_rdlock(LOCK) \ glwthread_rwlock_rdlock (LOCK) # define glthread_rwlock_wrlock(LOCK) \ glwthread_rwlock_wrlock (LOCK) # define glthread_rwlock_unlock(LOCK) \ glwthread_rwlock_unlock (LOCK) # define glthread_rwlock_destroy(LOCK) \ glwthread_rwlock_destroy (LOCK) /* --------------------- gl_recursive_lock_t datatype --------------------- */ typedef glwthread_recmutex_t gl_recursive_lock_t; # define gl_recursive_lock_define(STORAGECLASS, NAME) \ STORAGECLASS gl_recursive_lock_t NAME; # define gl_recursive_lock_define_initialized(STORAGECLASS, NAME) \ STORAGECLASS gl_recursive_lock_t NAME = gl_recursive_lock_initializer; # define gl_recursive_lock_initializer \ GLWTHREAD_RECMUTEX_INIT # define glthread_recursive_lock_init(LOCK) \ (glwthread_recmutex_init (LOCK), 0) # define glthread_recursive_lock_lock(LOCK) \ glwthread_recmutex_lock (LOCK) # define glthread_recursive_lock_unlock(LOCK) \ glwthread_recmutex_unlock (LOCK) # define glthread_recursive_lock_destroy(LOCK) \ glwthread_recmutex_destroy (LOCK) /* -------------------------- gl_once_t datatype -------------------------- */ typedef glwthread_once_t gl_once_t; # define gl_once_define(STORAGECLASS, NAME) \ STORAGECLASS gl_once_t NAME = GLWTHREAD_ONCE_INIT; # define glthread_once(ONCE_CONTROL, INITFUNCTION) \ (glwthread_once (ONCE_CONTROL, INITFUNCTION), 0) # ifdef __cplusplus } # endif #endif /* ========================================================================= */ #if !(USE_ISOC_THREADS || USE_POSIX_THREADS || USE_ISOC_AND_POSIX_THREADS || USE_WINDOWS_THREADS) /* Provide dummy implementation if threads are not supported. */ /* -------------------------- gl_lock_t datatype -------------------------- */ typedef int gl_lock_t; # define gl_lock_define(STORAGECLASS, NAME) # define gl_lock_define_initialized(STORAGECLASS, NAME) # define glthread_lock_init(NAME) 0 # define glthread_lock_lock(NAME) 0 # define glthread_lock_unlock(NAME) 0 # define glthread_lock_destroy(NAME) 0 /* ------------------------- gl_rwlock_t datatype ------------------------- */ typedef int gl_rwlock_t; # define gl_rwlock_define(STORAGECLASS, NAME) # define gl_rwlock_define_initialized(STORAGECLASS, NAME) # define glthread_rwlock_init(NAME) 0 # define glthread_rwlock_rdlock(NAME) 0 # define glthread_rwlock_wrlock(NAME) 0 # define glthread_rwlock_unlock(NAME) 0 # define glthread_rwlock_destroy(NAME) 0 /* --------------------- gl_recursive_lock_t datatype --------------------- */ typedef int gl_recursive_lock_t; # define gl_recursive_lock_define(STORAGECLASS, NAME) # define gl_recursive_lock_define_initialized(STORAGECLASS, NAME) # define glthread_recursive_lock_init(NAME) 0 # define glthread_recursive_lock_lock(NAME) 0 # define glthread_recursive_lock_unlock(NAME) 0 # define glthread_recursive_lock_destroy(NAME) 0 /* -------------------------- gl_once_t datatype -------------------------- */ typedef int gl_once_t; # define gl_once_define(STORAGECLASS, NAME) \ STORAGECLASS gl_once_t NAME = 0; # define glthread_once(ONCE_CONTROL, INITFUNCTION) \ (*(ONCE_CONTROL) == 0 ? (*(ONCE_CONTROL) = ~ 0, INITFUNCTION (), 0) : 0) #endif /* ========================================================================= */ /* Macros with built-in error handling. */ /* -------------------------- gl_lock_t datatype -------------------------- */ #define gl_lock_init(NAME) \ do \ { \ if (glthread_lock_init (&NAME)) \ abort (); \ } \ while (0) #define gl_lock_lock(NAME) \ do \ { \ if (glthread_lock_lock (&NAME)) \ abort (); \ } \ while (0) #define gl_lock_unlock(NAME) \ do \ { \ if (glthread_lock_unlock (&NAME)) \ abort (); \ } \ while (0) #define gl_lock_destroy(NAME) \ do \ { \ if (glthread_lock_destroy (&NAME)) \ abort (); \ } \ while (0) /* ------------------------- gl_rwlock_t datatype ------------------------- */ #define gl_rwlock_init(NAME) \ do \ { \ if (glthread_rwlock_init (&NAME)) \ abort (); \ } \ while (0) #define gl_rwlock_rdlock(NAME) \ do \ { \ if (glthread_rwlock_rdlock (&NAME)) \ abort (); \ } \ while (0) #define gl_rwlock_wrlock(NAME) \ do \ { \ if (glthread_rwlock_wrlock (&NAME)) \ abort (); \ } \ while (0) #define gl_rwlock_unlock(NAME) \ do \ { \ if (glthread_rwlock_unlock (&NAME)) \ abort (); \ } \ while (0) #define gl_rwlock_destroy(NAME) \ do \ { \ if (glthread_rwlock_destroy (&NAME)) \ abort (); \ } \ while (0) /* --------------------- gl_recursive_lock_t datatype --------------------- */ #define gl_recursive_lock_init(NAME) \ do \ { \ if (glthread_recursive_lock_init (&NAME)) \ abort (); \ } \ while (0) #define gl_recursive_lock_lock(NAME) \ do \ { \ if (glthread_recursive_lock_lock (&NAME)) \ abort (); \ } \ while (0) #define gl_recursive_lock_unlock(NAME) \ do \ { \ if (glthread_recursive_lock_unlock (&NAME)) \ abort (); \ } \ while (0) #define gl_recursive_lock_destroy(NAME) \ do \ { \ if (glthread_recursive_lock_destroy (&NAME)) \ abort (); \ } \ while (0) /* -------------------------- gl_once_t datatype -------------------------- */ #define gl_once(NAME, INITFUNCTION) \ do \ { \ if (glthread_once (&NAME, INITFUNCTION)) \ abort (); \ } \ while (0) /* ========================================================================= */ #endif /* _LOCK_H */ pspp-1.4.1/gl/getrandom.c0000644000175000017500000001301713723215637014654 0ustar00blpblp00000000000000/* Obtain a series of random bytes. Copyright 2020 Free Software Foundation, Inc. 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 3 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, see . */ /* Written by Paul Eggert. */ #include #include #include #include #include #include #if defined _WIN32 && ! defined __CYGWIN__ # define WIN32_LEAN_AND_MEAN # include # if HAVE_BCRYPT_H # include # else # define NTSTATUS LONG typedef void * BCRYPT_ALG_HANDLE; # define BCRYPT_USE_SYSTEM_PREFERRED_RNG 0x00000002 # if HAVE_LIB_BCRYPT extern NTSTATUS WINAPI BCryptGenRandom (BCRYPT_ALG_HANDLE, UCHAR *, ULONG, ULONG); # endif # endif # if !HAVE_LIB_BCRYPT # include # ifndef CRYPT_VERIFY_CONTEXT # define CRYPT_VERIFY_CONTEXT 0xF0000000 # endif # endif #endif #include "minmax.h" #if defined _WIN32 && ! defined __CYGWIN__ /* Don't assume that UNICODE is not defined. */ # undef LoadLibrary # define LoadLibrary LoadLibraryA # undef CryptAcquireContext # define CryptAcquireContext CryptAcquireContextA # if !HAVE_LIB_BCRYPT /* Avoid warnings from gcc -Wcast-function-type. */ # define GetProcAddress \ (void *) GetProcAddress /* BCryptGenRandom with the BCRYPT_USE_SYSTEM_PREFERRED_RNG flag works only starting with Windows 7. */ typedef NTSTATUS (WINAPI * BCryptGenRandomFuncType) (BCRYPT_ALG_HANDLE, UCHAR *, ULONG, ULONG); static BCryptGenRandomFuncType BCryptGenRandomFunc = NULL; static BOOL initialized = FALSE; static void initialize (void) { HMODULE bcrypt = LoadLibrary ("bcrypt.dll"); if (bcrypt != NULL) { BCryptGenRandomFunc = (BCryptGenRandomFuncType) GetProcAddress (bcrypt, "BCryptGenRandom"); } initialized = TRUE; } # else # define BCryptGenRandomFunc BCryptGenRandom # endif #else /* These devices exist on all platforms except native Windows. */ /* Name of a device through which the kernel returns high quality random numbers, from an entropy pool. When the pool is empty, the call blocks until entropy sources have added enough bits of entropy. */ # ifndef NAME_OF_RANDOM_DEVICE # define NAME_OF_RANDOM_DEVICE "/dev/random" # endif /* Name of a device through which the kernel returns random or pseudo-random numbers. It uses an entropy pool, but, in order to avoid blocking, adds bits generated by a pseudo-random number generator, as needed. */ # ifndef NAME_OF_NONCE_DEVICE # define NAME_OF_NONCE_DEVICE "/dev/urandom" # endif #endif /* Set BUFFER (of size LENGTH) to random bytes under the control of FLAGS. Return the number of bytes written (> 0). Upon error, return -1 and set errno. */ ssize_t getrandom (void *buffer, size_t length, unsigned int flags) #undef getrandom { #if defined _WIN32 && ! defined __CYGWIN__ /* BCryptGenRandom, defined in with the BCRYPT_USE_SYSTEM_PREFERRED_RNG flag works in Windows 7 and newer. */ static int bcrypt_not_working /* = 0 */; if (!bcrypt_not_working) { # if !HAVE_LIB_BCRYPT if (!initialized) initialize (); # endif if (BCryptGenRandomFunc != NULL && BCryptGenRandomFunc (NULL, buffer, length, BCRYPT_USE_SYSTEM_PREFERRED_RNG) == 0 /*STATUS_SUCCESS*/) return length; bcrypt_not_working = 1; } # if !HAVE_LIB_BCRYPT /* CryptGenRandom, defined in works in older releases as well, but is now deprecated. CryptAcquireContext, defined in */ { static int crypt_initialized /* = 0 */; static HCRYPTPROV provider; if (!crypt_initialized) { if (CryptAcquireContext (&provider, NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFY_CONTEXT)) crypt_initialized = 1; else crypt_initialized = -1; } if (crypt_initialized >= 0) { if (!CryptGenRandom (provider, length, buffer)) { errno = EIO; return -1; } return length; } } # endif errno = ENOSYS; return -1; #elif HAVE_GETRANDOM return getrandom (buffer, length, flags); #else static int randfd[2] = { -1, -1 }; bool devrandom = (flags & GRND_RANDOM) != 0; int fd = randfd[devrandom]; if (fd < 0) { static char const randdevice[][MAX (sizeof NAME_OF_NONCE_DEVICE, sizeof NAME_OF_RANDOM_DEVICE)] = { NAME_OF_NONCE_DEVICE, NAME_OF_RANDOM_DEVICE }; int oflags = (O_RDONLY + O_CLOEXEC + (flags & GRND_NONBLOCK ? O_NONBLOCK : 0)); fd = open (randdevice[devrandom], oflags); if (fd < 0) return fd; randfd[devrandom] = fd; } return read (fd, buffer, length); #endif } pspp-1.4.1/gl/iswblank.c0000644000175000017500000000153213723215637014505 0ustar00blpblp00000000000000/* Test wide character for being blank. Copyright (C) 2008-2020 Free Software Foundation, Inc. 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 3, 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, see . */ #include /* Specification. */ #include int iswblank (wint_t wc) { return wc == ' ' || wc == '\t'; } pspp-1.4.1/gl/xbinary-io.c0000644000175000017500000000221513723215640014745 0ustar00blpblp00000000000000/* Binary mode I/O with checking Copyright 2017-2020 Free Software Foundation, Inc. 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 3 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, see . */ #include #define XBINARY_IO_INLINE _GL_EXTERN_INLINE #include "xbinary-io.h" #include #include #include #include "exitfail.h" #include "verify.h" #include "gettext.h" #define _(msgid) gettext (msgid) #if O_BINARY _Noreturn void xset_binary_mode_error (void) { error (exit_failure, errno, _("failed to set file descriptor text/binary mode")); assume (false); } #endif pspp-1.4.1/gl/itold.c0000644000175000017500000000201113723215637013777 0ustar00blpblp00000000000000/* Replacement for 'int' to 'long double' conversion routine. Copyright (C) 2011-2020 Free Software Foundation, Inc. Written by Bruno Haible , 2011. 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 3 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, see . */ #include /* Specification. */ #include void _Qp_itoq (long double *result, int a) { /* Convert from 'int' to 'double', then from 'double' to 'long double'. */ *result = (double) a; } pspp-1.4.1/gl/count-one-bits.h0000644000175000017500000001237613723215636015555 0ustar00blpblp00000000000000/* count-one-bits.h -- counts the number of 1-bits in a word. Copyright (C) 2007-2020 Free Software Foundation, Inc. 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 3 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, see . */ /* Written by Ben Pfaff. */ #ifndef COUNT_ONE_BITS_H #define COUNT_ONE_BITS_H 1 #include #include #ifndef _GL_INLINE_HEADER_BEGIN #error "Please include config.h first." #endif _GL_INLINE_HEADER_BEGIN #ifndef COUNT_ONE_BITS_INLINE # define COUNT_ONE_BITS_INLINE _GL_INLINE #endif #ifdef __cplusplus extern "C" { #endif /* Assuming the GCC builtin is GCC_BUILTIN and the MSC builtin is MSC_BUILTIN, expand to code that computes the number of 1-bits of the local variable 'x' of type TYPE (an unsigned integer type) and return it from the current function. */ #if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4) # define COUNT_ONE_BITS(GCC_BUILTIN, MSC_BUILTIN, TYPE) \ return GCC_BUILTIN (x) #else /* Compute and return the number of 1-bits set in the least significant 32 bits of X. */ COUNT_ONE_BITS_INLINE int count_one_bits_32 (unsigned int x) { x = ((x & 0xaaaaaaaaU) >> 1) + (x & 0x55555555U); x = ((x & 0xccccccccU) >> 2) + (x & 0x33333333U); x = (x >> 16) + (x & 0xffff); x = ((x & 0xf0f0) >> 4) + (x & 0x0f0f); return (x >> 8) + (x & 0x00ff); } /* Expand to code that computes the number of 1-bits of the local variable 'x' of type TYPE (an unsigned integer type) and return it from the current function. */ # define COUNT_ONE_BITS_GENERIC(TYPE) \ do \ { \ int count = 0; \ int bits; \ for (bits = 0; bits < sizeof (TYPE) * CHAR_BIT; bits += 32) \ { \ count += count_one_bits_32 (x); \ x = x >> 31 >> 1; \ } \ return count; \ } \ while (0) # if 1500 <= _MSC_VER && (defined _M_IX86 || defined _M_X64) /* While gcc falls back to its own generic code if the machine on which it's running doesn't support popcount, with Microsoft's compiler we need to detect and fallback ourselves. */ # if 0 # include # else /* Don't pollute the namespace with too many MSVC intrinsics. */ # pragma intrinsic (__cpuid) # pragma intrinsic (__popcnt) # if defined _M_X64 # pragma intrinsic (__popcnt64) # endif # endif # if !defined _M_X64 static inline __popcnt64 (unsigned long long x) { return __popcnt ((unsigned int) (x >> 32)) + __popcnt ((unsigned int) x); } # endif /* Return nonzero if popcount is supported. */ /* 1 if supported, 0 if not supported, -1 if unknown. */ extern int popcount_support; COUNT_ONE_BITS_INLINE int popcount_supported (void) { if (popcount_support < 0) { /* Do as described in */ int cpu_info[4]; __cpuid (cpu_info, 1); popcount_support = (cpu_info[2] >> 23) & 1; } return popcount_support; } # define COUNT_ONE_BITS(GCC_BUILTIN, MSC_BUILTIN, TYPE) \ do \ { \ if (popcount_supported ()) \ return MSC_BUILTIN (x); \ else \ COUNT_ONE_BITS_GENERIC (TYPE); \ } \ while (0) # else # define COUNT_ONE_BITS(GCC_BUILTIN, MSC_BUILTIN, TYPE) \ COUNT_ONE_BITS_GENERIC (TYPE) # endif #endif /* Compute and return the number of 1-bits set in X. */ COUNT_ONE_BITS_INLINE int count_one_bits (unsigned int x) { COUNT_ONE_BITS (__builtin_popcount, __popcnt, unsigned int); } /* Compute and return the number of 1-bits set in X. */ COUNT_ONE_BITS_INLINE int count_one_bits_l (unsigned long int x) { COUNT_ONE_BITS (__builtin_popcountl, __popcnt, unsigned long int); } /* Compute and return the number of 1-bits set in X. */ COUNT_ONE_BITS_INLINE int count_one_bits_ll (unsigned long long int x) { COUNT_ONE_BITS (__builtin_popcountll, __popcnt64, unsigned long long int); } #ifdef __cplusplus } #endif _GL_INLINE_HEADER_END #endif /* COUNT_ONE_BITS_H */ pspp-1.4.1/gl/printf-frexp.c0000644000175000017500000001231713723215640015314 0ustar00blpblp00000000000000/* Split a double into fraction and mantissa, for hexadecimal printf. Copyright (C) 2007, 2009-2020 Free Software Foundation, Inc. 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 3 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, see . */ #if ! defined USE_LONG_DOUBLE # include #endif /* Specification. */ #ifdef USE_LONG_DOUBLE # include "printf-frexpl.h" #else # include "printf-frexp.h" #endif #include #include #ifdef USE_LONG_DOUBLE # include "fpucw.h" #endif /* This file assumes FLT_RADIX = 2. If FLT_RADIX is a power of 2 greater than 2, or not even a power of 2, some rounding errors can occur, so that then the returned mantissa is only guaranteed to be <= 2.0, not < 2.0. */ #ifdef USE_LONG_DOUBLE # define FUNC printf_frexpl # define DOUBLE long double # define MIN_EXP LDBL_MIN_EXP # if HAVE_FREXPL_IN_LIBC && HAVE_LDEXPL_IN_LIBC # define USE_FREXP_LDEXP # define FREXP frexpl # define LDEXP ldexpl # endif # define DECL_ROUNDING DECL_LONG_DOUBLE_ROUNDING # define BEGIN_ROUNDING() BEGIN_LONG_DOUBLE_ROUNDING () # define END_ROUNDING() END_LONG_DOUBLE_ROUNDING () # define L_(literal) literal##L #else # define FUNC printf_frexp # define DOUBLE double # define MIN_EXP DBL_MIN_EXP # if HAVE_FREXP_IN_LIBC && HAVE_LDEXP_IN_LIBC # define USE_FREXP_LDEXP # define FREXP frexp # define LDEXP ldexp # endif # define DECL_ROUNDING # define BEGIN_ROUNDING() # define END_ROUNDING() # define L_(literal) literal #endif DOUBLE FUNC (DOUBLE x, int *expptr) { int exponent; DECL_ROUNDING BEGIN_ROUNDING (); #ifdef USE_FREXP_LDEXP /* frexp and ldexp are usually faster than the loop below. */ x = FREXP (x, &exponent); x = x + x; exponent -= 1; if (exponent < MIN_EXP - 1) { x = LDEXP (x, exponent - (MIN_EXP - 1)); exponent = MIN_EXP - 1; } #else { /* Since the exponent is an 'int', it fits in 64 bits. Therefore the loops are executed no more than 64 times. */ DOUBLE pow2[64]; /* pow2[i] = 2^2^i */ DOUBLE powh[64]; /* powh[i] = 2^-2^i */ int i; exponent = 0; if (x >= L_(1.0)) { /* A nonnegative exponent. */ { DOUBLE pow2_i; /* = pow2[i] */ DOUBLE powh_i; /* = powh[i] */ /* Invariants: pow2_i = 2^2^i, powh_i = 2^-2^i, x * 2^exponent = argument, x >= 1.0. */ for (i = 0, pow2_i = L_(2.0), powh_i = L_(0.5); ; i++, pow2_i = pow2_i * pow2_i, powh_i = powh_i * powh_i) { if (x >= pow2_i) { exponent += (1 << i); x *= powh_i; } else break; pow2[i] = pow2_i; powh[i] = powh_i; } } /* Here 1.0 <= x < 2^2^i. */ } else { /* A negative exponent. */ { DOUBLE pow2_i; /* = pow2[i] */ DOUBLE powh_i; /* = powh[i] */ /* Invariants: pow2_i = 2^2^i, powh_i = 2^-2^i, x * 2^exponent = argument, x < 1.0, exponent >= MIN_EXP - 1. */ for (i = 0, pow2_i = L_(2.0), powh_i = L_(0.5); ; i++, pow2_i = pow2_i * pow2_i, powh_i = powh_i * powh_i) { if (exponent - (1 << i) < MIN_EXP - 1) break; exponent -= (1 << i); x *= pow2_i; if (x >= L_(1.0)) break; pow2[i] = pow2_i; powh[i] = powh_i; } } /* Here either x < 1.0 and exponent - 2^i < MIN_EXP - 1 <= exponent, or 1.0 <= x < 2^2^i and exponent >= MIN_EXP - 1. */ if (x < L_(1.0)) /* Invariants: x * 2^exponent = argument, x < 1.0 and exponent - 2^i < MIN_EXP - 1 <= exponent. */ while (i > 0) { i--; if (exponent - (1 << i) >= MIN_EXP - 1) { exponent -= (1 << i); x *= pow2[i]; if (x >= L_(1.0)) break; } } /* Here either x < 1.0 and exponent = MIN_EXP - 1, or 1.0 <= x < 2^2^i and exponent >= MIN_EXP - 1. */ } /* Invariants: x * 2^exponent = argument, and either x < 1.0 and exponent = MIN_EXP - 1, or 1.0 <= x < 2^2^i and exponent >= MIN_EXP - 1. */ while (i > 0) { i--; if (x >= pow2[i]) { exponent += (1 << i); x *= powh[i]; } } /* Here either x < 1.0 and exponent = MIN_EXP - 1, or 1.0 <= x < 2.0 and exponent >= MIN_EXP - 1. */ } #endif END_ROUNDING (); *expptr = exponent; return x; } pspp-1.4.1/gl/gl_list.c0000644000175000017500000000012213723215637014322 0ustar00blpblp00000000000000#include #define GL_LIST_INLINE _GL_EXTERN_INLINE #include "gl_list.h" pspp-1.4.1/gl/mbrtowc-impl.h0000644000175000017500000001621713723215637015322 0ustar00blpblp00000000000000/* Convert multibyte character to wide character. Copyright (C) 1999-2002, 2005-2020 Free Software Foundation, Inc. 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 3 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, see . */ /* Written by Bruno Haible , 2008. */ /* This file contains the body of the mbrtowc and mbrtoc32 functions, when GNULIB_defined_mbstate_t is defined. */ char *pstate = (char *)ps; if (s == NULL) { pwc = NULL; s = ""; n = 1; } if (n == 0) return (size_t)(-2); /* Here n > 0. */ if (pstate == NULL) pstate = internal_state; { size_t nstate = pstate[0]; char buf[4]; const char *p; size_t m; enc_t enc; int res; switch (nstate) { case 0: p = s; m = n; break; case 3: buf[2] = pstate[3]; FALLTHROUGH; case 2: buf[1] = pstate[2]; FALLTHROUGH; case 1: buf[0] = pstate[1]; p = buf; m = nstate; buf[m++] = s[0]; if (n >= 2 && m < 4) { buf[m++] = s[1]; if (n >= 3 && m < 4) buf[m++] = s[2]; } break; default: errno = EINVAL; return (size_t)(-1); } /* Here m > 0. */ enc = locale_encoding_classification (); if (enc == enc_utf8) /* UTF-8 */ { /* Achieve - multi-thread safety and - the ability to produce wide character values > WCHAR_MAX by not calling mbtowc() at all. */ #include "mbrtowc-impl-utf8.h" } else { /* The hidden internal state of mbtowc would make this function not multi-thread safe. Achieve multi-thread safety through a lock. */ wchar_t wc; res = mbtowc_with_lock (&wc, p, m); if (res >= 0) { if ((wc == 0) != (res == 0)) abort (); if (pwc != NULL) *pwc = wc; goto success; } /* mbtowc does not distinguish between invalid and incomplete multibyte sequences. But mbrtowc needs to make this distinction. There are two possible approaches: - Use iconv() and its return value. - Use built-in knowledge about the possible encodings. Given the low quality of implementation of iconv() on the systems that lack mbrtowc(), we use the second approach. The possible encodings are: - 8-bit encodings, - EUC-JP, EUC-KR, GB2312, EUC-TW, BIG5, GB18030, SJIS, - UTF-8 (already handled above). Use specialized code for each. */ if (m >= 4 || m >= MB_CUR_MAX) goto invalid; /* Here MB_CUR_MAX > 1 and 0 < m < 4. */ switch (enc) { /* As a reference for this code, you can use the GNU libiconv implementation. Look for uses of the RET_TOOFEW macro. */ case enc_eucjp: /* EUC-JP */ { if (m == 1) { unsigned char c = (unsigned char) p[0]; if ((c >= 0xa1 && c < 0xff) || c == 0x8e || c == 0x8f) goto incomplete; } if (m == 2) { unsigned char c = (unsigned char) p[0]; if (c == 0x8f) { unsigned char c2 = (unsigned char) p[1]; if (c2 >= 0xa1 && c2 < 0xff) goto incomplete; } } goto invalid; } case enc_94: /* EUC-KR, GB2312, BIG5 */ { if (m == 1) { unsigned char c = (unsigned char) p[0]; if (c >= 0xa1 && c < 0xff) goto incomplete; } goto invalid; } case enc_euctw: /* EUC-TW */ { if (m == 1) { unsigned char c = (unsigned char) p[0]; if ((c >= 0xa1 && c < 0xff) || c == 0x8e) goto incomplete; } else /* m == 2 || m == 3 */ { unsigned char c = (unsigned char) p[0]; if (c == 0x8e) goto incomplete; } goto invalid; } case enc_gb18030: /* GB18030 */ { if (m == 1) { unsigned char c = (unsigned char) p[0]; if ((c >= 0x90 && c <= 0xe3) || (c >= 0xf8 && c <= 0xfe)) goto incomplete; } else /* m == 2 || m == 3 */ { unsigned char c = (unsigned char) p[0]; if (c >= 0x90 && c <= 0xe3) { unsigned char c2 = (unsigned char) p[1]; if (c2 >= 0x30 && c2 <= 0x39) { if (m == 2) goto incomplete; else /* m == 3 */ { unsigned char c3 = (unsigned char) p[2]; if (c3 >= 0x81 && c3 <= 0xfe) goto incomplete; } } } } goto invalid; } case enc_sjis: /* SJIS */ { if (m == 1) { unsigned char c = (unsigned char) p[0]; if ((c >= 0x81 && c <= 0x9f) || (c >= 0xe0 && c <= 0xea) || (c >= 0xf0 && c <= 0xf9)) goto incomplete; } goto invalid; } default: /* An unknown multibyte encoding. */ goto incomplete; } } success: /* res >= 0 is the corrected return value of mbtowc_with_lock (&wc, p, m). */ if (nstate >= (res > 0 ? res : 1)) abort (); res -= nstate; pstate[0] = 0; return res; incomplete: { size_t k = nstate; /* Here 0 <= k < m < 4. */ pstate[++k] = s[0]; if (k < m) { pstate[++k] = s[1]; if (k < m) pstate[++k] = s[2]; } if (k != m) abort (); } pstate[0] = m; return (size_t)(-2); invalid: errno = EILSEQ; /* The conversion state is undefined, says POSIX. */ return (size_t)(-1); } pspp-1.4.1/gl/timespec.c0000644000175000017500000000013013723555203014471 0ustar00blpblp00000000000000#include #define _GL_TIMESPEC_INLINE _GL_EXTERN_INLINE #include "timespec.h" pspp-1.4.1/gl/write.c0000644000175000017500000001235413723215640014023 0ustar00blpblp00000000000000/* POSIX compatible write() function. Copyright (C) 2008-2020 Free Software Foundation, Inc. Written by Bruno Haible , 2008. 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 3 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, see . */ #include /* Specification. */ #include /* On native Windows platforms, SIGPIPE does not exist. When write() is called on a pipe with no readers, WriteFile() fails with error GetLastError() = ERROR_NO_DATA, and write() in consequence fails with error EINVAL. */ #if defined _WIN32 && ! defined __CYGWIN__ # include # include # include # define WIN32_LEAN_AND_MEAN /* avoid including junk */ # include # if HAVE_MSVC_INVALID_PARAMETER_HANDLER # include "msvc-inval.h" # endif # if GNULIB_MSVC_NOTHROW # include "msvc-nothrow.h" # else # include # endif /* Don't assume that UNICODE is not defined. */ # undef GetNamedPipeHandleState # define GetNamedPipeHandleState GetNamedPipeHandleStateA # undef write # if HAVE_MSVC_INVALID_PARAMETER_HANDLER static ssize_t write_nothrow (int fd, const void *buf, size_t count) { ssize_t result; TRY_MSVC_INVAL { result = write (fd, buf, count); } CATCH_MSVC_INVAL { result = -1; errno = EBADF; } DONE_MSVC_INVAL; return result; } # else # define write_nothrow write # endif ssize_t rpl_write (int fd, const void *buf, size_t count) { for (;;) { ssize_t ret = write_nothrow (fd, buf, count); if (ret < 0) { # if GNULIB_NONBLOCKING if (errno == ENOSPC) { HANDLE h = (HANDLE) _get_osfhandle (fd); if (GetFileType (h) == FILE_TYPE_PIPE) { /* h is a pipe or socket. */ DWORD state; if (GetNamedPipeHandleState (h, &state, NULL, NULL, NULL, NULL, 0) && (state & PIPE_NOWAIT) != 0) { /* h is a pipe in non-blocking mode. We can get here in four situations: 1. When the pipe buffer is full. 2. When count <= pipe_buf_size and the number of free bytes in the pipe buffer is < count. 3. When count > pipe_buf_size and the number of free bytes in the pipe buffer is > 0, < pipe_buf_size. 4. When count > pipe_buf_size and the pipe buffer is entirely empty. The cases 1 and 2 are POSIX compliant. In cases 3 and 4 POSIX specifies that write() must split the request and succeed with a partial write. We fix case 4. We don't fix case 3 because it is not essential for programs. */ DWORD out_size; /* size of the buffer for outgoing data */ DWORD in_size; /* size of the buffer for incoming data */ if (GetNamedPipeInfo (h, NULL, &out_size, &in_size, NULL)) { size_t reduced_count = count; /* In theory we need only one of out_size, in_size. But I don't know which of the two. The description is ambiguous. */ if (out_size != 0 && out_size < reduced_count) reduced_count = out_size; if (in_size != 0 && in_size < reduced_count) reduced_count = in_size; if (reduced_count < count) { /* Attempt to write only the first part. */ count = reduced_count; continue; } } /* Change errno from ENOSPC to EAGAIN. */ errno = EAGAIN; } } } else # endif { # if GNULIB_SIGPIPE if (GetLastError () == ERROR_NO_DATA && GetFileType ((HANDLE) _get_osfhandle (fd)) == FILE_TYPE_PIPE) { /* Try to raise signal SIGPIPE. */ raise (SIGPIPE); /* If it is currently blocked or ignored, change errno from EINVAL to EPIPE. */ errno = EPIPE; } # endif } } return ret; } } #endif pspp-1.4.1/gl/strerror-override.h0000644000175000017500000000374413723215640016400 0ustar00blpblp00000000000000/* strerror-override.h --- POSIX compatible system error routine Copyright (C) 2010-2020 Free Software Foundation, Inc. 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 3 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, see . */ #ifndef _GL_STRERROR_OVERRIDE_H # define _GL_STRERROR_OVERRIDE_H # include # include /* Reasonable buffer size that should never trigger ERANGE; if this proves too small, we intentionally abort(), to remind us to fix this value. */ # define STACKBUF_LEN 256 /* If ERRNUM maps to an errno value defined by gnulib, return a string describing the error. Otherwise return NULL. */ # if REPLACE_STRERROR_0 \ || GNULIB_defined_ESOCK \ || GNULIB_defined_ESTREAMS \ || GNULIB_defined_EWINSOCK \ || GNULIB_defined_ENOMSG \ || GNULIB_defined_EIDRM \ || GNULIB_defined_ENOLINK \ || GNULIB_defined_EPROTO \ || GNULIB_defined_EMULTIHOP \ || GNULIB_defined_EBADMSG \ || GNULIB_defined_EOVERFLOW \ || GNULIB_defined_ENOTSUP \ || GNULIB_defined_ENETRESET \ || GNULIB_defined_ECONNABORTED \ || GNULIB_defined_ESTALE \ || GNULIB_defined_EDQUOT \ || GNULIB_defined_ECANCELED \ || GNULIB_defined_EOWNERDEAD \ || GNULIB_defined_ENOTRECOVERABLE \ || GNULIB_defined_EILSEQ extern const char *strerror_override (int errnum) _GL_ATTRIBUTE_CONST; # else # define strerror_override(ignored) NULL # endif #endif /* _GL_STRERROR_OVERRIDE_H */ pspp-1.4.1/gl/xvasprintf.h0000644000175000017500000000277413723215640015107 0ustar00blpblp00000000000000/* vasprintf and asprintf with out-of-memory checking. Copyright (C) 2002-2004, 2006-2020 Free Software Foundation, Inc. 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 3 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, see . */ #ifndef _XVASPRINTF_H #define _XVASPRINTF_H /* Get va_list. */ #include #ifdef __cplusplus extern "C" { #endif /* Write formatted output to a string dynamically allocated with malloc(), and return it. Upon [ENOMEM] memory allocation error, call xalloc_die. On some other error - [EOVERFLOW] resulting string length is > INT_MAX, - [EINVAL] invalid format string, - [EILSEQ] error during conversion between wide and multibyte characters, return NULL. */ extern char *xasprintf (const char *format, ...) _GL_ATTRIBUTE_FORMAT ((__printf__, 1, 2)); extern char *xvasprintf (const char *format, va_list args) _GL_ATTRIBUTE_FORMAT ((__printf__, 1, 0)); #ifdef __cplusplus } #endif #endif /* _XVASPRINTF_H */ pspp-1.4.1/gl/xasprintf.c0000644000175000017500000000201413723215640014677 0ustar00blpblp00000000000000/* vasprintf and asprintf with out-of-memory checking. Copyright (C) 1999, 2002-2004, 2006, 2009-2020 Free Software Foundation, Inc. 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 3 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, see . */ #include /* Specification. */ #include "xvasprintf.h" char * xasprintf (const char *format, ...) { va_list args; char *result; va_start (args, format); result = xvasprintf (format, args); va_end (args); return result; } pspp-1.4.1/gl/isinf.c0000644000175000017500000000201113723215637013774 0ustar00blpblp00000000000000/* Test for positive or negative infinity. Copyright (C) 2007-2020 Free Software Foundation, Inc. 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 3, 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, see . */ /* Written by Ben Pfaff , 2008. */ #include #include int gl_isinff (float x) { return x < -FLT_MAX || x > FLT_MAX; } int gl_isinfd (double x) { return x < -DBL_MAX || x > DBL_MAX; } int gl_isinfl (long double x) { return x < -LDBL_MAX || x > LDBL_MAX; } pspp-1.4.1/gl/time.in.h0000644000175000017500000003242613723215640014243 0ustar00blpblp00000000000000/* A more-standard . Copyright (C) 2007-2020 Free Software Foundation, Inc. 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 3, 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, see . */ #if __GNUC__ >= 3 @PRAGMA_SYSTEM_HEADER@ #endif @PRAGMA_COLUMNS@ /* Don't get in the way of glibc when it includes time.h merely to declare a few standard symbols, rather than to declare all the symbols. (However, skip this for MinGW as it treats __need_time_t incompatibly.) Also, Solaris 8 eventually includes itself recursively; if that is happening, just include the system without adding our own declarations. */ #if (((defined __need_time_t || defined __need_clock_t \ || defined __need_timespec) \ && !defined __MINGW32__) \ || defined _@GUARD_PREFIX@_TIME_H) # @INCLUDE_NEXT@ @NEXT_TIME_H@ #else # define _@GUARD_PREFIX@_TIME_H /* mingw's provides the functions asctime_r, ctime_r, gmtime_r, localtime_r only if or has been included before. */ # if defined __MINGW32__ # include # endif # @INCLUDE_NEXT@ @NEXT_TIME_H@ /* NetBSD 5.0 mis-defines NULL. */ # include /* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */ /* The definition of _GL_ARG_NONNULL is copied here. */ /* The definition of _GL_WARN_ON_USE is copied here. */ /* Some systems don't define struct timespec (e.g., AIX 4.1). Or they define it with the wrong member names or define it in (e.g., FreeBSD circa 1997). Stock Mingw prior to 3.0 does not define it, but the pthreads-win32 library defines it in . */ # if ! @TIME_H_DEFINES_STRUCT_TIMESPEC@ # if @SYS_TIME_H_DEFINES_STRUCT_TIMESPEC@ # include # elif @PTHREAD_H_DEFINES_STRUCT_TIMESPEC@ # include # elif @UNISTD_H_DEFINES_STRUCT_TIMESPEC@ # include # else # ifdef __cplusplus extern "C" { # endif # if !GNULIB_defined_struct_timespec # undef timespec # define timespec rpl_timespec struct timespec { time_t tv_sec; long int tv_nsec; }; # define GNULIB_defined_struct_timespec 1 # endif # ifdef __cplusplus } # endif # endif # endif # if !GNULIB_defined_struct_time_t_must_be_integral /* https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/sys_types.h.html requires time_t to be an integer type, even though C99 permits floating point. We don't know of any implementation that uses floating point, and it is much easier to write code that doesn't have to worry about that corner case, so we force the issue. */ struct __time_t_must_be_integral { unsigned int __floating_time_t_unsupported : (time_t) 1; }; # define GNULIB_defined_struct_time_t_must_be_integral 1 # endif /* Sleep for at least RQTP seconds unless interrupted, If interrupted, return -1 and store the remaining time into RMTP. See . */ # if @GNULIB_NANOSLEEP@ # if @REPLACE_NANOSLEEP@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # define nanosleep rpl_nanosleep # endif _GL_FUNCDECL_RPL (nanosleep, int, (struct timespec const *__rqtp, struct timespec *__rmtp) _GL_ARG_NONNULL ((1))); _GL_CXXALIAS_RPL (nanosleep, int, (struct timespec const *__rqtp, struct timespec *__rmtp)); # else # if ! @HAVE_NANOSLEEP@ _GL_FUNCDECL_SYS (nanosleep, int, (struct timespec const *__rqtp, struct timespec *__rmtp) _GL_ARG_NONNULL ((1))); # endif _GL_CXXALIAS_SYS (nanosleep, int, (struct timespec const *__rqtp, struct timespec *__rmtp)); # endif _GL_CXXALIASWARN (nanosleep); # endif /* Initialize time conversion information. */ # if @GNULIB_TZSET@ # if @REPLACE_TZSET@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef tzset # define tzset rpl_tzset # endif _GL_FUNCDECL_RPL (tzset, void, (void)); _GL_CXXALIAS_RPL (tzset, void, (void)); # else # if ! @HAVE_TZSET@ _GL_FUNCDECL_SYS (tzset, void, (void)); # endif _GL_CXXALIAS_SYS (tzset, void, (void)); # endif _GL_CXXALIASWARN (tzset); # endif /* Return the 'time_t' representation of TP and normalize TP. */ # if @GNULIB_MKTIME@ # if @REPLACE_MKTIME@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # define mktime rpl_mktime # endif _GL_FUNCDECL_RPL (mktime, time_t, (struct tm *__tp) _GL_ARG_NONNULL ((1))); _GL_CXXALIAS_RPL (mktime, time_t, (struct tm *__tp)); # else _GL_CXXALIAS_SYS (mktime, time_t, (struct tm *__tp)); # endif # if __GLIBC__ >= 2 _GL_CXXALIASWARN (mktime); # endif # endif /* Convert TIMER to RESULT, assuming local time and UTC respectively. See and . */ # if @GNULIB_TIME_R@ # if @REPLACE_LOCALTIME_R@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef localtime_r # define localtime_r rpl_localtime_r # endif _GL_FUNCDECL_RPL (localtime_r, struct tm *, (time_t const *restrict __timer, struct tm *restrict __result) _GL_ARG_NONNULL ((1, 2))); _GL_CXXALIAS_RPL (localtime_r, struct tm *, (time_t const *restrict __timer, struct tm *restrict __result)); # else # if ! @HAVE_DECL_LOCALTIME_R@ _GL_FUNCDECL_SYS (localtime_r, struct tm *, (time_t const *restrict __timer, struct tm *restrict __result) _GL_ARG_NONNULL ((1, 2))); # endif _GL_CXXALIAS_SYS (localtime_r, struct tm *, (time_t const *restrict __timer, struct tm *restrict __result)); # endif # if @HAVE_DECL_LOCALTIME_R@ _GL_CXXALIASWARN (localtime_r); # endif # if @REPLACE_LOCALTIME_R@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef gmtime_r # define gmtime_r rpl_gmtime_r # endif _GL_FUNCDECL_RPL (gmtime_r, struct tm *, (time_t const *restrict __timer, struct tm *restrict __result) _GL_ARG_NONNULL ((1, 2))); _GL_CXXALIAS_RPL (gmtime_r, struct tm *, (time_t const *restrict __timer, struct tm *restrict __result)); # else # if ! @HAVE_DECL_LOCALTIME_R@ _GL_FUNCDECL_SYS (gmtime_r, struct tm *, (time_t const *restrict __timer, struct tm *restrict __result) _GL_ARG_NONNULL ((1, 2))); # endif _GL_CXXALIAS_SYS (gmtime_r, struct tm *, (time_t const *restrict __timer, struct tm *restrict __result)); # endif # if @HAVE_DECL_LOCALTIME_R@ _GL_CXXALIASWARN (gmtime_r); # endif # endif /* Convert TIMER to RESULT, assuming local time and UTC respectively. See and . */ # if @GNULIB_LOCALTIME@ || @REPLACE_LOCALTIME@ # if @REPLACE_LOCALTIME@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef localtime # define localtime rpl_localtime # endif _GL_FUNCDECL_RPL (localtime, struct tm *, (time_t const *__timer) _GL_ARG_NONNULL ((1))); _GL_CXXALIAS_RPL (localtime, struct tm *, (time_t const *__timer)); # else _GL_CXXALIAS_SYS (localtime, struct tm *, (time_t const *__timer)); # endif # if __GLIBC__ >= 2 _GL_CXXALIASWARN (localtime); # endif # endif # if 0 || @REPLACE_GMTIME@ # if @REPLACE_GMTIME@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef gmtime # define gmtime rpl_gmtime # endif _GL_FUNCDECL_RPL (gmtime, struct tm *, (time_t const *__timer) _GL_ARG_NONNULL ((1))); _GL_CXXALIAS_RPL (gmtime, struct tm *, (time_t const *__timer)); # else _GL_CXXALIAS_SYS (gmtime, struct tm *, (time_t const *__timer)); # endif _GL_CXXALIASWARN (gmtime); # endif /* Parse BUF as a timestamp, assuming FORMAT specifies its layout, and store the resulting broken-down time into TM. See . */ # if @GNULIB_STRPTIME@ # if ! @HAVE_STRPTIME@ _GL_FUNCDECL_SYS (strptime, char *, (char const *restrict __buf, char const *restrict __format, struct tm *restrict __tm) _GL_ARG_NONNULL ((1, 2, 3))); # endif _GL_CXXALIAS_SYS (strptime, char *, (char const *restrict __buf, char const *restrict __format, struct tm *restrict __tm)); _GL_CXXALIASWARN (strptime); # endif /* Convert *TP to a date and time string. See . */ # if @GNULIB_CTIME@ # if @REPLACE_CTIME@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # define ctime rpl_ctime # endif _GL_FUNCDECL_RPL (ctime, char *, (time_t const *__tp) _GL_ARG_NONNULL ((1))); _GL_CXXALIAS_RPL (ctime, char *, (time_t const *__tp)); # else _GL_CXXALIAS_SYS (ctime, char *, (time_t const *__tp)); # endif # if __GLIBC__ >= 2 _GL_CXXALIASWARN (ctime); # endif # endif /* Convert *TP to a date and time string. See . */ # if @GNULIB_STRFTIME@ # if @REPLACE_STRFTIME@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # define strftime rpl_strftime # endif _GL_FUNCDECL_RPL (strftime, size_t, (char *restrict __buf, size_t __bufsize, const char *restrict __fmt, const struct tm *restrict __tp) _GL_ARG_NONNULL ((1, 3, 4))); _GL_CXXALIAS_RPL (strftime, size_t, (char *restrict __buf, size_t __bufsize, const char *restrict __fmt, const struct tm *restrict __tp)); # else _GL_CXXALIAS_SYS (strftime, size_t, (char *restrict __buf, size_t __bufsize, const char *restrict __fmt, const struct tm *restrict __tp)); # endif # if __GLIBC__ >= 2 _GL_CXXALIASWARN (strftime); # endif # endif # if defined _GNU_SOURCE && @GNULIB_TIME_RZ@ && ! @HAVE_TIMEZONE_T@ typedef struct tm_zone *timezone_t; _GL_FUNCDECL_SYS (tzalloc, timezone_t, (char const *__name)); _GL_CXXALIAS_SYS (tzalloc, timezone_t, (char const *__name)); _GL_FUNCDECL_SYS (tzfree, void, (timezone_t __tz)); _GL_CXXALIAS_SYS (tzfree, void, (timezone_t __tz)); _GL_FUNCDECL_SYS (localtime_rz, struct tm *, (timezone_t __tz, time_t const *restrict __timer, struct tm *restrict __result) _GL_ARG_NONNULL ((2, 3))); _GL_CXXALIAS_SYS (localtime_rz, struct tm *, (timezone_t __tz, time_t const *restrict __timer, struct tm *restrict __result)); _GL_FUNCDECL_SYS (mktime_z, time_t, (timezone_t __tz, struct tm *restrict __result) _GL_ARG_NONNULL ((2))); _GL_CXXALIAS_SYS (mktime_z, time_t, (timezone_t __tz, struct tm *restrict __result)); # endif /* Convert TM to a time_t value, assuming UTC. */ # if @GNULIB_TIMEGM@ # if @REPLACE_TIMEGM@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef timegm # define timegm rpl_timegm # endif _GL_FUNCDECL_RPL (timegm, time_t, (struct tm *__tm) _GL_ARG_NONNULL ((1))); _GL_CXXALIAS_RPL (timegm, time_t, (struct tm *__tm)); # else # if ! @HAVE_TIMEGM@ _GL_FUNCDECL_SYS (timegm, time_t, (struct tm *__tm) _GL_ARG_NONNULL ((1))); # endif _GL_CXXALIAS_SYS (timegm, time_t, (struct tm *__tm)); # endif _GL_CXXALIASWARN (timegm); # endif /* Encourage applications to avoid unsafe functions that can overrun buffers when given outlandish struct tm values. Portable applications should use strftime (or even sprintf) instead. */ # if defined GNULIB_POSIXCHECK # undef asctime _GL_WARN_ON_USE (asctime, "asctime can overrun buffers in some cases - " "better use strftime (or even sprintf) instead"); # endif # if defined GNULIB_POSIXCHECK # undef asctime_r _GL_WARN_ON_USE (asctime, "asctime_r can overrun buffers in some cases - " "better use strftime (or even sprintf) instead"); # endif # if defined GNULIB_POSIXCHECK # undef ctime _GL_WARN_ON_USE (asctime, "ctime can overrun buffers in some cases - " "better use strftime (or even sprintf) instead"); # endif # if defined GNULIB_POSIXCHECK # undef ctime_r _GL_WARN_ON_USE (asctime, "ctime_r can overrun buffers in some cases - " "better use strftime (or even sprintf) instead"); # endif #endif pspp-1.4.1/gl/c-xvasprintf.h0000644000175000017500000000323113723215636015321 0ustar00blpblp00000000000000/* vasprintf and asprintf, with out-of-memory checking, in C locale. Copyright (C) 2002-2004, 2006-2020 Free Software Foundation, Inc. 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 3 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, see . */ #ifndef _C_XVASPRINTF_H #define _C_XVASPRINTF_H /* Get va_list. */ #include #ifdef __cplusplus extern "C" { #endif /* Write formatted output to a string dynamically allocated with malloc(), and return it. Upon [ENOMEM] memory allocation error, call xalloc_die. On some other error - [EOVERFLOW] resulting string length is > INT_MAX, - [EINVAL] invalid format string, - [EILSEQ] error during conversion between wide and multibyte characters, return NULL. Formatting takes place in the C locale, that is, the decimal point used in floating-point formatting directives is always '.'. */ extern char *c_xasprintf (const char *format, ...) _GL_ATTRIBUTE_FORMAT ((__printf__, 1, 2)); extern char *c_xvasprintf (const char *format, va_list args) _GL_ATTRIBUTE_FORMAT ((__printf__, 1, 0)); #ifdef __cplusplus } #endif #endif /* _C_XVASPRINTF_H */ pspp-1.4.1/gl/rijndael-api-fst.h0000644000175000017500000002012713723215640016024 0ustar00blpblp00000000000000/* rijndael-api-fst.h --- Rijndael cipher implementation. * Copyright (C) 2005, 2009-2020 Free Software Foundation, Inc. * * This file 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 3, or (at your * option) any later version. * * This file 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 file; if not, see . * */ /* Adapted for gnulib by Simon Josefsson. */ /** * rijndael-api-fst.h * * @version 2.9 (December 2000) * * Optimised ANSI C code for the Rijndael cipher (now AES) * * @author Vincent Rijmen * @author Antoon Bosselaers * @author Paulo Barreto * * This code is hereby placed in the public domain. * * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ''AS IS'' AND ANY EXPRESS * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Acknowledgements: * * We are deeply indebted to the following people for their bug reports, * fixes, and improvement suggestions to this implementation. Though we * tried to list all contributions, we apologise in advance for any * missing reference. * * Andrew Bales * Markus Friedl * John Skodon */ #ifndef __RIJNDAEL_API_FST_H #define __RIJNDAEL_API_FST_H #include "rijndael-alg-fst.h" #include /* Default number of bits in a cipher block */ #define RIJNDAEL_BITSPERBLOCK 128 /* Number of ASCII char's needed to represent a key */ #define RIJNDAEL_MAX_KEY_SIZE 64 /* Number bytes needed to represent an IV */ #define RIJNDAEL_MAX_IV_SIZE 16 typedef enum { /* Key direction is invalid, e.g., unknown value */ RIJNDAEL_BAD_KEY_DIR = -1, /* Key material not of correct length */ RIJNDAEL_BAD_KEY_MAT = -2, /* Key passed is not valid */ RIJNDAEL_BAD_KEY_INSTANCE = -3, /* Params struct passed to cipherInit invalid */ RIJNDAEL_BAD_CIPHER_MODE = -4, /* Cipher in wrong state (e.g., not initialized) */ RIJNDAEL_BAD_CIPHER_STATE = -5, RIJNDAEL_BAD_BLOCK_LENGTH = -6, RIJNDAEL_BAD_CIPHER_INSTANCE = -7, /* Data contents are invalid, e.g., invalid padding */ RIJNDAEL_BAD_DATA = -8, /* Unknown error */ RIJNDAEL_BAD_OTHER = -9 } rijndael_rc; typedef enum { RIJNDAEL_DIR_ENCRYPT = 0, /* Are we encrypting? */ RIJNDAEL_DIR_DECRYPT = 1 /* Are we decrypting? */ } rijndael_direction; typedef enum { RIJNDAEL_MODE_ECB = 1, /* Are we ciphering in ECB mode? */ RIJNDAEL_MODE_CBC = 2, /* Are we ciphering in CBC mode? */ RIJNDAEL_MODE_CFB1 = 3 /* Are we ciphering in 1-bit CFB mode? */ } rijndael_mode; /* The structure for key information */ typedef struct { /* Key used for encrypting or decrypting? */ rijndael_direction direction; /* Length of the key */ size_t keyLen; /* Raw key data in ASCII, e.g., user input or KAT values */ char keyMaterial[RIJNDAEL_MAX_KEY_SIZE + 1]; /* key-length-dependent number of rounds */ int Nr; /* key schedule */ uint32_t rk[4 * (RIJNDAEL_MAXNR + 1)]; /* CFB1 key schedule (encryption only) */ uint32_t ek[4 * (RIJNDAEL_MAXNR + 1)]; } rijndaelKeyInstance; /* The structure for cipher information */ typedef struct { /* changed order of the components */ rijndael_mode mode; /* MODE_ECB, MODE_CBC, or MODE_CFB1 */ /* A possible Initialization Vector for ciphering */ char IV[RIJNDAEL_MAX_IV_SIZE]; } rijndaelCipherInstance; /* Function prototypes */ /* Create KEY, for encryption or decryption depending on DIRECTION, from KEYMATERIAL, a hex string, of KEYLEN size. KEYLEN should be 128, 192 or 256. Returns 0 on success, or an error code. */ extern rijndael_rc rijndaelMakeKey (rijndaelKeyInstance *key, rijndael_direction direction, size_t keyLen, const char *keyMaterial); /* Initialize cipher state CIPHER for encryption MODE (e.g., RIJNDAEL_MODE_CBC) with initialization vector IV, a hex string of 2*RIJNDAEL_MAX_IV_SIZE length. IV may be NULL for modes that do not need an IV (i.e., RIJNDAEL_MODE_ECB). */ extern rijndael_rc rijndaelCipherInit (rijndaelCipherInstance *cipher, rijndael_mode mode, const char *IV); /* Encrypt data in INPUT, of INPUTLEN/8 bytes length, placing the output in the pre-allocated OUTBUFFER which must hold at least INPUTLEN/8 bytes of data. The CIPHER is used as state, and must be initialized with rijndaelCipherInit before calling this function. The encryption KEY must be initialized with rijndaelMakeKey before calling this function. Return the number of bits written, or a negative rijndael_rc error code. */ extern int rijndaelBlockEncrypt (rijndaelCipherInstance *cipher, const rijndaelKeyInstance *key, const char *input, size_t inputLen, char *restrict outBuffer); /* Encrypt data in INPUT, of INPUTOCTETS bytes length, placing the output in the pre-allocated OUTBUFFER which must hold at least INPUTOCTETS aligned to the next block size boundary. Ciphertext-Stealing as described in RFC 2040 is used to encrypt partial blocks. The CIPHER is used as state, and must be initialized with rijndaelCipherInit before calling this function. The encryption KEY must be initialized with rijndaelMakeKey before calling this function. Return the number of bits written, or a negative rijndael_rc error code. */ extern int rijndaelPadEncrypt (rijndaelCipherInstance *cipher, const rijndaelKeyInstance *key, const char *input, size_t inputOctets, char *restrict outBuffer); /* Decrypt data in INPUT, of INPUTLEN/8 bytes length, placing the output in the pre-allocated OUTBUFFER which must hold at least INPUTLEN/8 bytes of data. The CIPHER is used as state, and must be initialized with rijndaelCipherInit before calling this function. The encryption KEY must be initialized with rijndaelMakeKey before calling this function. Return the number of bits written, or a negative rijndael_rc error code. */ extern int rijndaelBlockDecrypt (rijndaelCipherInstance *cipher, const rijndaelKeyInstance *key, const char *input, size_t inputLen, char *restrict outBuffer); /* Decrypt data in INPUT, of INPUTOCTETS bytes length, placing the output in the pre-allocated OUTBUFFER which must hold at least INPUTOCTETS aligned to the next block size boundary. Ciphertext-Stealing as described in RFC 2040 is used to encrypt partial blocks. The CIPHER is used as state, and must be initialized with rijndaelCipherInit before calling this function. The encryption KEY must be initialized with rijndaelMakeKey before calling this function. Return the number of bits written, or a negative rijndael_rc error code. */ extern int rijndaelPadDecrypt (rijndaelCipherInstance *cipher, const rijndaelKeyInstance *key, const char *input, size_t inputOctets, char *restrict outBuffer); #endif /* __RIJNDAEL_API_FST_H */ pspp-1.4.1/gl/c-strcase.h0000644000175000017500000000401513723215636014562 0ustar00blpblp00000000000000/* Case-insensitive string comparison functions in C locale. Copyright (C) 1995-1996, 2001, 2003, 2005, 2009-2020 Free Software Foundation, Inc. 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 3, 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, see . */ #ifndef C_STRCASE_H #define C_STRCASE_H #include /* The functions defined in this file assume the "C" locale and a character set without diacritics (ASCII-US or EBCDIC-US or something like that). Even if the "C" locale on a particular system is an extension of the ASCII character set (like on BeOS, where it is UTF-8, or on AmigaOS, where it is ISO-8859-1), the functions in this file recognize only the ASCII characters. More precisely, one of the string arguments must be an ASCII string; the other one can also contain non-ASCII characters (but then the comparison result will be nonzero). */ #ifdef __cplusplus extern "C" { #endif /* Compare strings S1 and S2, ignoring case, returning less than, equal to or greater than zero if S1 is lexicographically less than, equal to or greater than S2. */ extern int c_strcasecmp (const char *s1, const char *s2) _GL_ATTRIBUTE_PURE; /* Compare no more than N characters of strings S1 and S2, ignoring case, returning less than, equal to or greater than zero if S1 is lexicographically less than, equal to or greater than S2. */ extern int c_strncasecmp (const char *s1, const char *s2, size_t n) _GL_ATTRIBUTE_PURE; #ifdef __cplusplus } #endif #endif /* C_STRCASE_H */ pspp-1.4.1/gl/inttypes.in.h0000644000175000017500000005121113723215637015163 0ustar00blpblp00000000000000/* Copyright (C) 2006-2020 Free Software Foundation, Inc. Written by Paul Eggert, Bruno Haible, Derek Price. This file is part of gnulib. 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 3 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, see . */ /* * ISO C 99 for platforms that lack it. * */ #if __GNUC__ >= 3 @PRAGMA_SYSTEM_HEADER@ #endif @PRAGMA_COLUMNS@ /* Include the original if it exists, and if this file has not been included yet or if this file includes gnulib stdint.h which in turn includes this file. The include_next requires a split double-inclusion guard. */ #if ! defined INTTYPES_H || defined _GL_JUST_INCLUDE_SYSTEM_INTTYPES_H # if @HAVE_INTTYPES_H@ /* Some pre-C++11 implementations need this. */ # if defined __cplusplus && ! defined __STDC_FORMAT_MACROS # define __STDC_FORMAT_MACROS 1 # endif # @INCLUDE_NEXT@ @NEXT_INTTYPES_H@ # define _GL_FINISHED_INCLUDING_SYSTEM_INTTYPES_H # endif #endif #if ! defined INTTYPES_H && ! defined _GL_JUST_INCLUDE_SYSTEM_INTTYPES_H #define INTTYPES_H /* Include or the gnulib replacement. But avoid namespace pollution on glibc systems. */ #ifndef __GLIBC__ # include #endif /* Get CHAR_BIT, INT_MAX, LONG_MAX, etc. */ #include /* On mingw, __USE_MINGW_ANSI_STDIO only works if is also included */ #if defined _WIN32 && ! defined __CYGWIN__ # include #endif #if !(INT_MAX == 0x7fffffff && INT_MIN + INT_MAX == -1) # error "This file assumes that 'int' is 32-bit two's complement. Please report your platform and compiler to ." #endif /* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */ /* The definition of _GL_ARG_NONNULL is copied here. */ /* The definition of _GL_WARN_ON_USE is copied here. */ /* 7.8.1 Macros for format specifiers */ #if defined _TNS_R_TARGET /* Tandem NonStop R series and compatible platforms released before July 2005 support %Ld but not %lld. */ # define _LONG_LONG_FORMAT_PREFIX "L" #else # define _LONG_LONG_FORMAT_PREFIX "ll" #endif #if !defined PRId8 # ifdef INT8_MAX # define PRId8 "d" # endif #endif #if !defined PRIi8 # ifdef INT8_MAX # define PRIi8 "i" # endif #endif #if !defined PRIo8 # ifdef UINT8_MAX # define PRIo8 "o" # endif #endif #if !defined PRIu8 # ifdef UINT8_MAX # define PRIu8 "u" # endif #endif #if !defined PRIx8 # ifdef UINT8_MAX # define PRIx8 "x" # endif #endif #if !defined PRIX8 # ifdef UINT8_MAX # define PRIX8 "X" # endif #endif #if !defined PRId16 # ifdef INT16_MAX # define PRId16 "d" # endif #endif #if !defined PRIi16 # ifdef INT16_MAX # define PRIi16 "i" # endif #endif #if !defined PRIo16 # ifdef UINT16_MAX # define PRIo16 "o" # endif #endif #if !defined PRIu16 # ifdef UINT16_MAX # define PRIu16 "u" # endif #endif #if !defined PRIx16 # ifdef UINT16_MAX # define PRIx16 "x" # endif #endif #if !defined PRIX16 # ifdef UINT16_MAX # define PRIX16 "X" # endif #endif #if !defined PRId32 # ifdef INT32_MAX # define PRId32 "d" # endif #endif #if !defined PRIi32 # ifdef INT32_MAX # define PRIi32 "i" # endif #endif #if !defined PRIo32 # ifdef UINT32_MAX # define PRIo32 "o" # endif #endif #if !defined PRIu32 # ifdef UINT32_MAX # define PRIu32 "u" # endif #endif #if !defined PRIx32 # ifdef UINT32_MAX # define PRIx32 "x" # endif #endif #if !defined PRIX32 # ifdef UINT32_MAX # define PRIX32 "X" # endif #endif #ifdef INT64_MAX # if (@APPLE_UNIVERSAL_BUILD@ ? defined _LP64 : @INT64_MAX_EQ_LONG_MAX@) # define _PRI64_PREFIX "l" # elif defined _MSC_VER || defined __MINGW32__ # define _PRI64_PREFIX "I64" # elif LONG_MAX >> 30 == 1 # define _PRI64_PREFIX _LONG_LONG_FORMAT_PREFIX # endif # if !defined PRId64 # define PRId64 _PRI64_PREFIX "d" # endif # if !defined PRIi64 # define PRIi64 _PRI64_PREFIX "i" # endif #endif #ifdef UINT64_MAX # if (@APPLE_UNIVERSAL_BUILD@ ? defined _LP64 : @UINT64_MAX_EQ_ULONG_MAX@) # define _PRIu64_PREFIX "l" # elif defined _MSC_VER || defined __MINGW32__ # define _PRIu64_PREFIX "I64" # elif ULONG_MAX >> 31 == 1 # define _PRIu64_PREFIX _LONG_LONG_FORMAT_PREFIX # endif # if !defined PRIo64 # define PRIo64 _PRIu64_PREFIX "o" # endif # if !defined PRIu64 # define PRIu64 _PRIu64_PREFIX "u" # endif # if !defined PRIx64 # define PRIx64 _PRIu64_PREFIX "x" # endif # if !defined PRIX64 # define PRIX64 _PRIu64_PREFIX "X" # endif #endif #if !defined PRIdLEAST8 # define PRIdLEAST8 "d" #endif #if !defined PRIiLEAST8 # define PRIiLEAST8 "i" #endif #if !defined PRIoLEAST8 # define PRIoLEAST8 "o" #endif #if !defined PRIuLEAST8 # define PRIuLEAST8 "u" #endif #if !defined PRIxLEAST8 # define PRIxLEAST8 "x" #endif #if !defined PRIXLEAST8 # define PRIXLEAST8 "X" #endif #if !defined PRIdLEAST16 # define PRIdLEAST16 "d" #endif #if !defined PRIiLEAST16 # define PRIiLEAST16 "i" #endif #if !defined PRIoLEAST16 # define PRIoLEAST16 "o" #endif #if !defined PRIuLEAST16 # define PRIuLEAST16 "u" #endif #if !defined PRIxLEAST16 # define PRIxLEAST16 "x" #endif #if !defined PRIXLEAST16 # define PRIXLEAST16 "X" #endif #if !defined PRIdLEAST32 # define PRIdLEAST32 "d" #endif #if !defined PRIiLEAST32 # define PRIiLEAST32 "i" #endif #if !defined PRIoLEAST32 # define PRIoLEAST32 "o" #endif #if !defined PRIuLEAST32 # define PRIuLEAST32 "u" #endif #if !defined PRIxLEAST32 # define PRIxLEAST32 "x" #endif #if !defined PRIXLEAST32 # define PRIXLEAST32 "X" #endif #ifdef INT64_MAX # if !defined PRIdLEAST64 # define PRIdLEAST64 PRId64 # endif # if !defined PRIiLEAST64 # define PRIiLEAST64 PRIi64 # endif #endif #ifdef UINT64_MAX # if !defined PRIoLEAST64 # define PRIoLEAST64 PRIo64 # endif # if !defined PRIuLEAST64 # define PRIuLEAST64 PRIu64 # endif # if !defined PRIxLEAST64 # define PRIxLEAST64 PRIx64 # endif # if !defined PRIXLEAST64 # define PRIXLEAST64 PRIX64 # endif #endif #if !defined PRIdFAST8 # if INT_FAST8_MAX > INT32_MAX # define PRIdFAST8 PRId64 # else # define PRIdFAST8 "d" # endif #endif #if !defined PRIiFAST8 # if INT_FAST8_MAX > INT32_MAX # define PRIiFAST8 PRIi64 # else # define PRIiFAST8 "i" # endif #endif #if !defined PRIoFAST8 # if UINT_FAST8_MAX > UINT32_MAX # define PRIoFAST8 PRIo64 # else # define PRIoFAST8 "o" # endif #endif #if !defined PRIuFAST8 # if UINT_FAST8_MAX > UINT32_MAX # define PRIuFAST8 PRIu64 # else # define PRIuFAST8 "u" # endif #endif #if !defined PRIxFAST8 # if UINT_FAST8_MAX > UINT32_MAX # define PRIxFAST8 PRIx64 # else # define PRIxFAST8 "x" # endif #endif #if !defined PRIXFAST8 # if UINT_FAST8_MAX > UINT32_MAX # define PRIXFAST8 PRIX64 # else # define PRIXFAST8 "X" # endif #endif #if !defined PRIdFAST16 # if INT_FAST16_MAX > INT32_MAX # define PRIdFAST16 PRId64 # else # define PRIdFAST16 "d" # endif #endif #if !defined PRIiFAST16 # if INT_FAST16_MAX > INT32_MAX # define PRIiFAST16 PRIi64 # else # define PRIiFAST16 "i" # endif #endif #if !defined PRIoFAST16 # if UINT_FAST16_MAX > UINT32_MAX # define PRIoFAST16 PRIo64 # else # define PRIoFAST16 "o" # endif #endif #if !defined PRIuFAST16 # if UINT_FAST16_MAX > UINT32_MAX # define PRIuFAST16 PRIu64 # else # define PRIuFAST16 "u" # endif #endif #if !defined PRIxFAST16 # if UINT_FAST16_MAX > UINT32_MAX # define PRIxFAST16 PRIx64 # else # define PRIxFAST16 "x" # endif #endif #if !defined PRIXFAST16 # if UINT_FAST16_MAX > UINT32_MAX # define PRIXFAST16 PRIX64 # else # define PRIXFAST16 "X" # endif #endif #if !defined PRIdFAST32 # if INT_FAST32_MAX > INT32_MAX # define PRIdFAST32 PRId64 # else # define PRIdFAST32 "d" # endif #endif #if !defined PRIiFAST32 # if INT_FAST32_MAX > INT32_MAX # define PRIiFAST32 PRIi64 # else # define PRIiFAST32 "i" # endif #endif #if !defined PRIoFAST32 # if UINT_FAST32_MAX > UINT32_MAX # define PRIoFAST32 PRIo64 # else # define PRIoFAST32 "o" # endif #endif #if !defined PRIuFAST32 # if UINT_FAST32_MAX > UINT32_MAX # define PRIuFAST32 PRIu64 # else # define PRIuFAST32 "u" # endif #endif #if !defined PRIxFAST32 # if UINT_FAST32_MAX > UINT32_MAX # define PRIxFAST32 PRIx64 # else # define PRIxFAST32 "x" # endif #endif #if !defined PRIXFAST32 # if UINT_FAST32_MAX > UINT32_MAX # define PRIXFAST32 PRIX64 # else # define PRIXFAST32 "X" # endif #endif #ifdef INT64_MAX # if !defined PRIdFAST64 # define PRIdFAST64 PRId64 # endif # if !defined PRIiFAST64 # define PRIiFAST64 PRIi64 # endif #endif #ifdef UINT64_MAX # if !defined PRIoFAST64 # define PRIoFAST64 PRIo64 # endif # if !defined PRIuFAST64 # define PRIuFAST64 PRIu64 # endif # if !defined PRIxFAST64 # define PRIxFAST64 PRIx64 # endif # if !defined PRIXFAST64 # define PRIXFAST64 PRIX64 # endif #endif #if !defined PRIdMAX # if @INT32_MAX_LT_INTMAX_MAX@ # define PRIdMAX PRId64 # else # define PRIdMAX "ld" # endif #endif #if !defined PRIiMAX # if @INT32_MAX_LT_INTMAX_MAX@ # define PRIiMAX PRIi64 # else # define PRIiMAX "li" # endif #endif #if !defined PRIoMAX # if @UINT32_MAX_LT_UINTMAX_MAX@ # define PRIoMAX PRIo64 # else # define PRIoMAX "lo" # endif #endif #if !defined PRIuMAX # if @UINT32_MAX_LT_UINTMAX_MAX@ # define PRIuMAX PRIu64 # else # define PRIuMAX "lu" # endif #endif #if !defined PRIxMAX # if @UINT32_MAX_LT_UINTMAX_MAX@ # define PRIxMAX PRIx64 # else # define PRIxMAX "lx" # endif #endif #if !defined PRIXMAX # if @UINT32_MAX_LT_UINTMAX_MAX@ # define PRIXMAX PRIX64 # else # define PRIXMAX "lX" # endif #endif #if !defined PRIdPTR # ifdef INTPTR_MAX # define PRIdPTR @PRIPTR_PREFIX@ "d" # endif #endif #if !defined PRIiPTR # ifdef INTPTR_MAX # define PRIiPTR @PRIPTR_PREFIX@ "i" # endif #endif #if !defined PRIoPTR # ifdef UINTPTR_MAX # define PRIoPTR @PRIPTR_PREFIX@ "o" # endif #endif #if !defined PRIuPTR # ifdef UINTPTR_MAX # define PRIuPTR @PRIPTR_PREFIX@ "u" # endif #endif #if !defined PRIxPTR # ifdef UINTPTR_MAX # define PRIxPTR @PRIPTR_PREFIX@ "x" # endif #endif #if !defined PRIXPTR # ifdef UINTPTR_MAX # define PRIXPTR @PRIPTR_PREFIX@ "X" # endif #endif #if !defined SCNd8 # ifdef INT8_MAX # define SCNd8 "hhd" # endif #endif #if !defined SCNi8 # ifdef INT8_MAX # define SCNi8 "hhi" # endif #endif #if !defined SCNo8 # ifdef UINT8_MAX # define SCNo8 "hho" # endif #endif #if !defined SCNu8 # ifdef UINT8_MAX # define SCNu8 "hhu" # endif #endif #if !defined SCNx8 # ifdef UINT8_MAX # define SCNx8 "hhx" # endif #endif #if !defined SCNd16 # ifdef INT16_MAX # define SCNd16 "hd" # endif #endif #if !defined SCNi16 # ifdef INT16_MAX # define SCNi16 "hi" # endif #endif #if !defined SCNo16 # ifdef UINT16_MAX # define SCNo16 "ho" # endif #endif #if !defined SCNu16 # ifdef UINT16_MAX # define SCNu16 "hu" # endif #endif #if !defined SCNx16 # ifdef UINT16_MAX # define SCNx16 "hx" # endif #endif #if !defined SCNd32 # ifdef INT32_MAX # define SCNd32 "d" # endif #endif #if !defined SCNi32 # ifdef INT32_MAX # define SCNi32 "i" # endif #endif #if !defined SCNo32 # ifdef UINT32_MAX # define SCNo32 "o" # endif #endif #if !defined SCNu32 # ifdef UINT32_MAX # define SCNu32 "u" # endif #endif #if !defined SCNx32 # ifdef UINT32_MAX # define SCNx32 "x" # endif #endif #ifdef INT64_MAX # if (@APPLE_UNIVERSAL_BUILD@ ? defined _LP64 : @INT64_MAX_EQ_LONG_MAX@) # define _SCN64_PREFIX "l" # elif defined _MSC_VER || defined __MINGW32__ # define _SCN64_PREFIX "I64" # elif LONG_MAX >> 30 == 1 # define _SCN64_PREFIX _LONG_LONG_FORMAT_PREFIX # endif # if !defined SCNd64 # define SCNd64 _SCN64_PREFIX "d" # endif # if !defined SCNi64 # define SCNi64 _SCN64_PREFIX "i" # endif #endif #ifdef UINT64_MAX # if (@APPLE_UNIVERSAL_BUILD@ ? defined _LP64 : @UINT64_MAX_EQ_ULONG_MAX@) # define _SCNu64_PREFIX "l" # elif defined _MSC_VER || defined __MINGW32__ # define _SCNu64_PREFIX "I64" # elif ULONG_MAX >> 31 == 1 # define _SCNu64_PREFIX _LONG_LONG_FORMAT_PREFIX # endif # if !defined SCNo64 # define SCNo64 _SCNu64_PREFIX "o" # endif # if !defined SCNu64 # define SCNu64 _SCNu64_PREFIX "u" # endif # if !defined SCNx64 # define SCNx64 _SCNu64_PREFIX "x" # endif #endif #if !defined SCNdLEAST8 # define SCNdLEAST8 "hhd" #endif #if !defined SCNiLEAST8 # define SCNiLEAST8 "hhi" #endif #if !defined SCNoLEAST8 # define SCNoLEAST8 "hho" #endif #if !defined SCNuLEAST8 # define SCNuLEAST8 "hhu" #endif #if !defined SCNxLEAST8 # define SCNxLEAST8 "hhx" #endif #if !defined SCNdLEAST16 # define SCNdLEAST16 "hd" #endif #if !defined SCNiLEAST16 # define SCNiLEAST16 "hi" #endif #if !defined SCNoLEAST16 # define SCNoLEAST16 "ho" #endif #if !defined SCNuLEAST16 # define SCNuLEAST16 "hu" #endif #if !defined SCNxLEAST16 # define SCNxLEAST16 "hx" #endif #if !defined SCNdLEAST32 # define SCNdLEAST32 "d" #endif #if !defined SCNiLEAST32 # define SCNiLEAST32 "i" #endif #if !defined SCNoLEAST32 # define SCNoLEAST32 "o" #endif #if !defined SCNuLEAST32 # define SCNuLEAST32 "u" #endif #if !defined SCNxLEAST32 # define SCNxLEAST32 "x" #endif #ifdef INT64_MAX # if !defined SCNdLEAST64 # define SCNdLEAST64 SCNd64 # endif # if !defined SCNiLEAST64 # define SCNiLEAST64 SCNi64 # endif #endif #ifdef UINT64_MAX # if !defined SCNoLEAST64 # define SCNoLEAST64 SCNo64 # endif # if !defined SCNuLEAST64 # define SCNuLEAST64 SCNu64 # endif # if !defined SCNxLEAST64 # define SCNxLEAST64 SCNx64 # endif #endif #if !defined SCNdFAST8 # if INT_FAST8_MAX > INT32_MAX # define SCNdFAST8 SCNd64 # elif INT_FAST8_MAX == 0x7fff # define SCNdFAST8 "hd" # elif INT_FAST8_MAX == 0x7f # define SCNdFAST8 "hhd" # else # define SCNdFAST8 "d" # endif #endif #if !defined SCNiFAST8 # if INT_FAST8_MAX > INT32_MAX # define SCNiFAST8 SCNi64 # elif INT_FAST8_MAX == 0x7fff # define SCNiFAST8 "hi" # elif INT_FAST8_MAX == 0x7f # define SCNiFAST8 "hhi" # else # define SCNiFAST8 "i" # endif #endif #if !defined SCNoFAST8 # if UINT_FAST8_MAX > UINT32_MAX # define SCNoFAST8 SCNo64 # elif UINT_FAST8_MAX == 0xffff # define SCNoFAST8 "ho" # elif UINT_FAST8_MAX == 0xff # define SCNoFAST8 "hho" # else # define SCNoFAST8 "o" # endif #endif #if !defined SCNuFAST8 # if UINT_FAST8_MAX > UINT32_MAX # define SCNuFAST8 SCNu64 # elif UINT_FAST8_MAX == 0xffff # define SCNuFAST8 "hu" # elif UINT_FAST8_MAX == 0xff # define SCNuFAST8 "hhu" # else # define SCNuFAST8 "u" # endif #endif #if !defined SCNxFAST8 # if UINT_FAST8_MAX > UINT32_MAX # define SCNxFAST8 SCNx64 # elif UINT_FAST8_MAX == 0xffff # define SCNxFAST8 "hx" # elif UINT_FAST8_MAX == 0xff # define SCNxFAST8 "hhx" # else # define SCNxFAST8 "x" # endif #endif #if !defined SCNdFAST16 # if INT_FAST16_MAX > INT32_MAX # define SCNdFAST16 SCNd64 # elif INT_FAST16_MAX == 0x7fff # define SCNdFAST16 "hd" # else # define SCNdFAST16 "d" # endif #endif #if !defined SCNiFAST16 # if INT_FAST16_MAX > INT32_MAX # define SCNiFAST16 SCNi64 # elif INT_FAST16_MAX == 0x7fff # define SCNiFAST16 "hi" # else # define SCNiFAST16 "i" # endif #endif #if !defined SCNoFAST16 # if UINT_FAST16_MAX > UINT32_MAX # define SCNoFAST16 SCNo64 # elif UINT_FAST16_MAX == 0xffff # define SCNoFAST16 "ho" # else # define SCNoFAST16 "o" # endif #endif #if !defined SCNuFAST16 # if UINT_FAST16_MAX > UINT32_MAX # define SCNuFAST16 SCNu64 # elif UINT_FAST16_MAX == 0xffff # define SCNuFAST16 "hu" # else # define SCNuFAST16 "u" # endif #endif #if !defined SCNxFAST16 # if UINT_FAST16_MAX > UINT32_MAX # define SCNxFAST16 SCNx64 # elif UINT_FAST16_MAX == 0xffff # define SCNxFAST16 "hx" # else # define SCNxFAST16 "x" # endif #endif #if !defined SCNdFAST32 # if INT_FAST32_MAX > INT32_MAX # define SCNdFAST32 SCNd64 # else # define SCNdFAST32 "d" # endif #endif #if !defined SCNiFAST32 # if INT_FAST32_MAX > INT32_MAX # define SCNiFAST32 SCNi64 # else # define SCNiFAST32 "i" # endif #endif #if !defined SCNoFAST32 # if UINT_FAST32_MAX > UINT32_MAX # define SCNoFAST32 SCNo64 # else # define SCNoFAST32 "o" # endif #endif #if !defined SCNuFAST32 # if UINT_FAST32_MAX > UINT32_MAX # define SCNuFAST32 SCNu64 # else # define SCNuFAST32 "u" # endif #endif #if !defined SCNxFAST32 # if UINT_FAST32_MAX > UINT32_MAX # define SCNxFAST32 SCNx64 # else # define SCNxFAST32 "x" # endif #endif #ifdef INT64_MAX # if !defined SCNdFAST64 # define SCNdFAST64 SCNd64 # endif # if !defined SCNiFAST64 # define SCNiFAST64 SCNi64 # endif #endif #ifdef UINT64_MAX # if !defined SCNoFAST64 # define SCNoFAST64 SCNo64 # endif # if !defined SCNuFAST64 # define SCNuFAST64 SCNu64 # endif # if !defined SCNxFAST64 # define SCNxFAST64 SCNx64 # endif #endif #if !defined SCNdMAX # if @INT32_MAX_LT_INTMAX_MAX@ # define SCNdMAX SCNd64 # else # define SCNdMAX "ld" # endif #endif #if !defined SCNiMAX # if @INT32_MAX_LT_INTMAX_MAX@ # define SCNiMAX SCNi64 # else # define SCNiMAX "li" # endif #endif #if !defined SCNoMAX # if @UINT32_MAX_LT_UINTMAX_MAX@ # define SCNoMAX SCNo64 # else # define SCNoMAX "lo" # endif #endif #if !defined SCNuMAX # if @UINT32_MAX_LT_UINTMAX_MAX@ # define SCNuMAX SCNu64 # else # define SCNuMAX "lu" # endif #endif #if !defined SCNxMAX # if @UINT32_MAX_LT_UINTMAX_MAX@ # define SCNxMAX SCNx64 # else # define SCNxMAX "lx" # endif #endif #if !defined SCNdPTR # ifdef INTPTR_MAX # define SCNdPTR @PRIPTR_PREFIX@ "d" # endif #endif #if !defined SCNiPTR # ifdef INTPTR_MAX # define SCNiPTR @PRIPTR_PREFIX@ "i" # endif #endif #if !defined SCNoPTR # ifdef UINTPTR_MAX # define SCNoPTR @PRIPTR_PREFIX@ "o" # endif #endif #if !defined SCNuPTR # ifdef UINTPTR_MAX # define SCNuPTR @PRIPTR_PREFIX@ "u" # endif #endif #if !defined SCNxPTR # ifdef UINTPTR_MAX # define SCNxPTR @PRIPTR_PREFIX@ "x" # endif #endif /* 7.8.2 Functions for greatest-width integer types */ #ifdef __cplusplus extern "C" { #endif #if @GNULIB_IMAXABS@ # if !@HAVE_DECL_IMAXABS@ extern intmax_t imaxabs (intmax_t); # endif #elif defined GNULIB_POSIXCHECK # undef imaxabs # if HAVE_RAW_DECL_IMAXABS _GL_WARN_ON_USE (imaxabs, "imaxabs is unportable - " "use gnulib module imaxabs for portability"); # endif #endif #if @GNULIB_IMAXDIV@ # if !@HAVE_IMAXDIV_T@ # if !GNULIB_defined_imaxdiv_t typedef struct { intmax_t quot; intmax_t rem; } imaxdiv_t; # define GNULIB_defined_imaxdiv_t 1 # endif # endif # if !@HAVE_DECL_IMAXDIV@ extern imaxdiv_t imaxdiv (intmax_t, intmax_t); # endif #elif defined GNULIB_POSIXCHECK # undef imaxdiv # if HAVE_RAW_DECL_IMAXDIV _GL_WARN_ON_USE (imaxdiv, "imaxdiv is unportable - " "use gnulib module imaxdiv for portability"); # endif #endif #if @GNULIB_STRTOIMAX@ # if @REPLACE_STRTOIMAX@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef strtoimax # define strtoimax rpl_strtoimax # endif _GL_FUNCDECL_RPL (strtoimax, intmax_t, (const char *restrict, char **restrict, int) _GL_ARG_NONNULL ((1))); _GL_CXXALIAS_RPL (strtoimax, intmax_t, (const char *restrict, char **restrict, int)); # else # if !@HAVE_DECL_STRTOIMAX@ # undef strtoimax _GL_FUNCDECL_SYS (strtoimax, intmax_t, (const char *restrict, char **restrict, int) _GL_ARG_NONNULL ((1))); # endif _GL_CXXALIAS_SYS (strtoimax, intmax_t, (const char *restrict, char **restrict, int)); # endif _GL_CXXALIASWARN (strtoimax); #elif defined GNULIB_POSIXCHECK # undef strtoimax # if HAVE_RAW_DECL_STRTOIMAX _GL_WARN_ON_USE (strtoimax, "strtoimax is unportable - " "use gnulib module strtoimax for portability"); # endif #endif #if @GNULIB_STRTOUMAX@ # if @REPLACE_STRTOUMAX@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef strtoumax # define strtoumax rpl_strtoumax # endif _GL_FUNCDECL_RPL (strtoumax, uintmax_t, (const char *restrict, char **restrict, int) _GL_ARG_NONNULL ((1))); _GL_CXXALIAS_RPL (strtoumax, uintmax_t, (const char *restrict, char **restrict, int)); # else # if !@HAVE_DECL_STRTOUMAX@ # undef strtoumax _GL_FUNCDECL_SYS (strtoumax, uintmax_t, (const char *restrict, char **restrict, int) _GL_ARG_NONNULL ((1))); # endif _GL_CXXALIAS_SYS (strtoumax, uintmax_t, (const char *restrict, char **restrict, int)); # endif _GL_CXXALIASWARN (strtoumax); #elif defined GNULIB_POSIXCHECK # undef strtoumax # if HAVE_RAW_DECL_STRTOUMAX _GL_WARN_ON_USE (strtoumax, "strtoumax is unportable - " "use gnulib module strtoumax for portability"); # endif #endif /* Don't bother defining or declaring wcstoimax and wcstoumax, since wide-character functions like this are hardly ever useful. */ #ifdef __cplusplus } #endif #endif /* !defined INTTYPES_H && !defined _GL_JUST_INCLUDE_SYSTEM_INTTYPES_H */ pspp-1.4.1/gl/sys_uio.in.h0000644000175000017500000000317513723215640014776 0ustar00blpblp00000000000000/* Substitute for . Copyright (C) 2011-2020 Free Software Foundation, Inc. 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 3, 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, see . */ # if __GNUC__ >= 3 @PRAGMA_SYSTEM_HEADER@ # endif @PRAGMA_COLUMNS@ #ifndef _@GUARD_PREFIX@_SYS_UIO_H #if @HAVE_SYS_UIO_H@ /* On OpenBSD 4.4, assumes prior inclusion of . */ # include /* The include_next requires a split double-inclusion guard. */ # @INCLUDE_NEXT@ @NEXT_SYS_UIO_H@ #endif #ifndef _@GUARD_PREFIX@_SYS_UIO_H #define _@GUARD_PREFIX@_SYS_UIO_H #if !@HAVE_SYS_UIO_H@ /* A platform that lacks . */ /* Get 'size_t' and 'ssize_t'. */ # include # ifdef __cplusplus extern "C" { # endif # if !GNULIB_defined_struct_iovec /* All known platforms that lack also lack any declaration of struct iovec in any other header. */ struct iovec { void *iov_base; size_t iov_len; }; # define GNULIB_defined_struct_iovec 1 # endif # ifdef __cplusplus } # endif #endif #endif /* _@GUARD_PREFIX@_SYS_UIO_H */ #endif /* _@GUARD_PREFIX@_SYS_UIO_H */ pspp-1.4.1/gl/arg-nonnull.h0000644000175000017500000000230113723215636015126 0ustar00blpblp00000000000000/* A C macro for declaring that specific arguments must not be NULL. Copyright (C) 2009-2020 Free Software Foundation, Inc. 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 3 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, see . */ /* _GL_ARG_NONNULL((n,...,m)) tells the compiler and static analyzer tools that the values passed as arguments n, ..., m must be non-NULL pointers. n = 1 stands for the first argument, n = 2 for the second argument etc. */ #ifndef _GL_ARG_NONNULL # if (__GNUC__ == 3 && __GNUC_MINOR__ >= 3) || __GNUC__ > 3 # define _GL_ARG_NONNULL(params) __attribute__ ((__nonnull__ params)) # else # define _GL_ARG_NONNULL(params) # endif #endif pspp-1.4.1/gl/printf-frexpl.c0000644000175000017500000000210113723215640015456 0ustar00blpblp00000000000000/* Split a 'long double' into fraction and mantissa, for hexadecimal printf. Copyright (C) 2007, 2009-2020 Free Software Foundation, Inc. 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 3 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, see . */ #include #if HAVE_SAME_LONG_DOUBLE_AS_DOUBLE /* Specification. */ # include "printf-frexpl.h" # include "printf-frexp.h" long double printf_frexpl (long double x, int *expptr) { return printf_frexp (x, expptr); } #else # define USE_LONG_DOUBLE # include "printf-frexp.c" #endif pspp-1.4.1/gl/count-leading-zeros.c0000644000175000017500000000015213723215636016560 0ustar00blpblp00000000000000#include #define COUNT_LEADING_ZEROS_INLINE _GL_EXTERN_INLINE #include "count-leading-zeros.h" pspp-1.4.1/gl/rijndael-alg-fst.h0000644000175000017500000000513613723215640016021 0ustar00blpblp00000000000000/* rijndael-alg-fst.h --- Rijndael cipher implementation. * Copyright (C) 2005, 2009-2020 Free Software Foundation, Inc. * * This file 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 3, or (at your * option) any later version. * * This file 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 file; if not, see . * */ /* Adapted for gnulib by Simon Josefsson. */ /** * rijndael-alg-fst.h * * @version 3.0 (December 2000) * * Optimised ANSI C code for the Rijndael cipher (now AES) * * @author Vincent Rijmen * @author Antoon Bosselaers * @author Paulo Barreto * * This code is hereby placed in the public domain. * * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ''AS IS'' AND ANY EXPRESS * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef __RIJNDAEL_ALG_FST_H #define __RIJNDAEL_ALG_FST_H #include #include #define RIJNDAEL_MAXKC (256/32) #define RIJNDAEL_MAXKB (256/8) #define RIJNDAEL_MAXNR 14 int rijndaelKeySetupEnc (uint32_t rk[ /*4*(Nr + 1) */ ], const char cipherKey[], size_t keyBits); int rijndaelKeySetupDec (uint32_t rk[ /*4*(Nr + 1) */ ], const char cipherKey[], size_t keyBits); void rijndaelEncrypt (const uint32_t rk[ /*4*(Nr + 1) */ ], size_t Nr, const char pt[16], char ct[16]); void rijndaelDecrypt (const uint32_t rk[ /*4*(Nr + 1) */ ], size_t Nr, const char ct[16], char pt[16]); #endif /* __RIJNDAEL_ALG_FST_H */ pspp-1.4.1/gl/iswdigit.c0000644000175000017500000000152613723215637014521 0ustar00blpblp00000000000000/* Test wide character for being a digit. Copyright (C) 2020 Free Software Foundation, Inc. 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 3, 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, see . */ #include /* Specification. */ #include int iswdigit (wint_t wc) { return wc >= '0' && wc <= '9'; } pspp-1.4.1/gl/fstat.c0000644000175000017500000000513213723215636014013 0ustar00blpblp00000000000000/* fstat() replacement. Copyright (C) 2011-2020 Free Software Foundation, Inc. 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 3 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, see . */ /* If the user's config.h happens to include , let it include only the system's here, so that orig_fstat doesn't recurse to rpl_fstat. */ #define __need_system_sys_stat_h #include /* Get the original definition of fstat. It might be defined as a macro. */ #include #include #undef __need_system_sys_stat_h #if defined _WIN32 && ! defined __CYGWIN__ # define WINDOWS_NATIVE #endif #if !defined WINDOWS_NATIVE static int orig_fstat (int fd, struct stat *buf) { return fstat (fd, buf); } #endif /* Specification. */ #ifdef __osf__ /* Write "sys/stat.h" here, not , otherwise OSF/1 5.1 DTK cc eliminates this include because of the preliminary #include above. */ # include "sys/stat.h" #else # include #endif #include "stat-time.h" #include #include #ifdef WINDOWS_NATIVE # define WIN32_LEAN_AND_MEAN # include # if GNULIB_MSVC_NOTHROW # include "msvc-nothrow.h" # else # include # endif # include "stat-w32.h" #endif int rpl_fstat (int fd, struct stat *buf) { #if REPLACE_FCHDIR && REPLACE_OPEN_DIRECTORY /* Handle the case when rpl_open() used a dummy file descriptor to work around an open() that can't normally visit directories. */ const char *name = _gl_directory_name (fd); if (name != NULL) return stat (name, buf); #endif #ifdef WINDOWS_NATIVE /* Fill the fields ourselves, because the original fstat function returns values for st_atime, st_mtime, st_ctime that depend on the current time zone. See */ HANDLE h = (HANDLE) _get_osfhandle (fd); if (h == INVALID_HANDLE_VALUE) { errno = EBADF; return -1; } return _gl_fstat_by_handle (h, NULL, buf); #else return stat_time_normalize (orig_fstat (fd, buf), buf); #endif } pspp-1.4.1/gl/raise.c0000644000175000017500000000341413723215640013771 0ustar00blpblp00000000000000/* Provide a non-threads replacement for the POSIX raise function. Copyright (C) 2002-2003, 2005-2006, 2009-2020 Free Software Foundation, Inc. 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 3 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, see . */ /* written by Jim Meyering and Bruno Haible */ #include /* Specification. */ #include #if HAVE_RAISE /* Native Windows platform. */ # include # if HAVE_MSVC_INVALID_PARAMETER_HANDLER # include "msvc-inval.h" # endif # if HAVE_MSVC_INVALID_PARAMETER_HANDLER /* Forward declaration. */ static int raise_nothrow (int sig); # else # define raise_nothrow raise # endif #else /* An old Unix platform. */ # include #endif int raise (int sig) #undef raise { #if GNULIB_defined_signal_blocking && GNULIB_defined_SIGPIPE if (sig == SIGPIPE) return _gl_raise_SIGPIPE (); #endif #if HAVE_RAISE return raise_nothrow (sig); #else return kill (getpid (), sig); #endif } #if HAVE_RAISE && HAVE_MSVC_INVALID_PARAMETER_HANDLER static int raise_nothrow (int sig) { int result; TRY_MSVC_INVAL { result = raise (sig); } CATCH_MSVC_INVAL { result = -1; errno = EINVAL; } DONE_MSVC_INVAL; return result; } #endif pspp-1.4.1/gl/wctype-h.c0000644000175000017500000000023313723215640014422 0ustar00blpblp00000000000000/* Normally this would be wctype.c, but that name's already taken. */ #include #define _GL_WCTYPE_INLINE _GL_EXTERN_INLINE #include "wctype.h" pspp-1.4.1/gl/rename.c0000644000175000017500000003222413723215640014136 0ustar00blpblp00000000000000/* Work around rename bugs in some systems. Copyright (C) 2001-2003, 2005-2006, 2009-2020 Free Software Foundation, Inc. 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 3 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, see . */ /* Written by Volker Borchert, Eric Blake. */ #include #include #undef rename #if defined _WIN32 && ! defined __CYGWIN__ /* The mingw rename has problems with trailing slashes; it also requires use of native Windows calls to allow atomic renames over existing files. */ # include # include # include # include # include # define WIN32_LEAN_AND_MEAN # include # include "dirname.h" /* Don't assume that UNICODE is not defined. */ # undef MoveFileEx # define MoveFileEx MoveFileExA /* Rename the file SRC to DST. This replacement is necessary on Windows, on which the system rename function will not replace an existing DST. */ int rpl_rename (char const *src, char const *dst) { int error; size_t src_len = strlen (src); size_t dst_len = strlen (dst); char *src_base = last_component (src); char *dst_base = last_component (dst); bool src_slash; bool dst_slash; bool dst_exists; struct stat src_st; struct stat dst_st; /* Filter out dot as last component. */ if (!src_len || !dst_len) { errno = ENOENT; return -1; } if (*src_base == '.') { size_t len = base_len (src_base); if (len == 1 || (len == 2 && src_base[1] == '.')) { errno = EINVAL; return -1; } } if (*dst_base == '.') { size_t len = base_len (dst_base); if (len == 1 || (len == 2 && dst_base[1] == '.')) { errno = EINVAL; return -1; } } /* Presence of a trailing slash requires directory semantics. If the source does not exist, or if the destination cannot be turned into a directory, give up now. Otherwise, strip trailing slashes before calling rename. There are no symlinks on mingw, so stat works instead of lstat. */ src_slash = ISSLASH (src[src_len - 1]); dst_slash = ISSLASH (dst[dst_len - 1]); if (stat (src, &src_st)) return -1; if (stat (dst, &dst_st)) { if (errno != ENOENT || (!S_ISDIR (src_st.st_mode) && dst_slash)) return -1; dst_exists = false; } else { if (S_ISDIR (dst_st.st_mode) != S_ISDIR (src_st.st_mode)) { errno = S_ISDIR (dst_st.st_mode) ? EISDIR : ENOTDIR; return -1; } dst_exists = true; } /* There are no symlinks, so if a file existed with a trailing slash, it must be a directory, and we don't have to worry about stripping strip trailing slash. However, mingw refuses to replace an existing empty directory, so we have to help it out. And canonicalize_file_name is not yet ported to mingw; however, for directories, getcwd works as a viable alternative. Ensure that we can get back to where we started before using it; later attempts to return are fatal. Note that we can end up losing a directory if rename then fails, but it was empty, so not much damage was done. */ if (dst_exists && S_ISDIR (dst_st.st_mode)) { char *cwd = getcwd (NULL, 0); char *src_temp; char *dst_temp; if (!cwd || chdir (cwd)) return -1; if (IS_ABSOLUTE_FILE_NAME (src)) { dst_temp = chdir (dst) ? NULL : getcwd (NULL, 0); src_temp = chdir (src) ? NULL : getcwd (NULL, 0); } else { src_temp = chdir (src) ? NULL : getcwd (NULL, 0); if (!IS_ABSOLUTE_FILE_NAME (dst) && chdir (cwd)) abort (); dst_temp = chdir (dst) ? NULL : getcwd (NULL, 0); } if (chdir (cwd)) abort (); free (cwd); if (!src_temp || !dst_temp) { free (src_temp); free (dst_temp); errno = ENOMEM; return -1; } src_len = strlen (src_temp); if (strncmp (src_temp, dst_temp, src_len) == 0 && (ISSLASH (dst_temp[src_len]) || dst_temp[src_len] == '\0')) { error = dst_temp[src_len]; free (src_temp); free (dst_temp); if (error) { errno = EINVAL; return -1; } return 0; } if (rmdir (dst)) { error = errno; free (src_temp); free (dst_temp); errno = error; return -1; } free (src_temp); free (dst_temp); } /* MoveFileEx works if SRC is a directory without any flags, but fails with MOVEFILE_REPLACE_EXISTING, so try without flags first. Thankfully, MoveFileEx handles hard links correctly, even though rename() does not. */ if (MoveFileEx (src, dst, 0)) return 0; /* Retry with MOVEFILE_REPLACE_EXISTING if the move failed due to the destination already existing. */ error = GetLastError (); if (error == ERROR_FILE_EXISTS || error == ERROR_ALREADY_EXISTS) { if (MoveFileEx (src, dst, MOVEFILE_REPLACE_EXISTING)) return 0; error = GetLastError (); } switch (error) { case ERROR_FILE_NOT_FOUND: case ERROR_PATH_NOT_FOUND: case ERROR_BAD_PATHNAME: case ERROR_DIRECTORY: errno = ENOENT; break; case ERROR_ACCESS_DENIED: case ERROR_SHARING_VIOLATION: errno = EACCES; break; case ERROR_OUTOFMEMORY: errno = ENOMEM; break; case ERROR_CURRENT_DIRECTORY: errno = EBUSY; break; case ERROR_NOT_SAME_DEVICE: errno = EXDEV; break; case ERROR_WRITE_PROTECT: errno = EROFS; break; case ERROR_WRITE_FAULT: case ERROR_READ_FAULT: case ERROR_GEN_FAILURE: errno = EIO; break; case ERROR_HANDLE_DISK_FULL: case ERROR_DISK_FULL: case ERROR_DISK_TOO_FRAGMENTED: errno = ENOSPC; break; case ERROR_FILE_EXISTS: case ERROR_ALREADY_EXISTS: errno = EEXIST; break; case ERROR_BUFFER_OVERFLOW: case ERROR_FILENAME_EXCED_RANGE: errno = ENAMETOOLONG; break; case ERROR_INVALID_NAME: case ERROR_DELETE_PENDING: errno = EPERM; /* ? */ break; # ifndef ERROR_FILE_TOO_LARGE /* This value is documented but not defined in all versions of windows.h. */ # define ERROR_FILE_TOO_LARGE 223 # endif case ERROR_FILE_TOO_LARGE: errno = EFBIG; break; default: errno = EINVAL; break; } return -1; } #else /* ! W32 platform */ # include # include # include # include # include # include # include "dirname.h" # include "same-inode.h" /* Rename the file SRC to DST, fixing any trailing slash bugs. */ int rpl_rename (char const *src, char const *dst) { size_t src_len = strlen (src); size_t dst_len = strlen (dst); char *src_temp = (char *) src; char *dst_temp = (char *) dst; bool src_slash; bool dst_slash; bool dst_exists _GL_UNUSED; int ret_val = -1; int rename_errno = ENOTDIR; struct stat src_st; struct stat dst_st; if (!src_len || !dst_len) return rename (src, dst); /* Let strace see the ENOENT failure. */ # if RENAME_DEST_EXISTS_BUG { char *src_base = last_component (src); char *dst_base = last_component (dst); if (*src_base == '.') { size_t len = base_len (src_base); if (len == 1 || (len == 2 && src_base[1] == '.')) { errno = EINVAL; return -1; } } if (*dst_base == '.') { size_t len = base_len (dst_base); if (len == 1 || (len == 2 && dst_base[1] == '.')) { errno = EINVAL; return -1; } } } # endif /* RENAME_DEST_EXISTS_BUG */ src_slash = src[src_len - 1] == '/'; dst_slash = dst[dst_len - 1] == '/'; # if !RENAME_HARD_LINK_BUG && !RENAME_DEST_EXISTS_BUG /* If there are no trailing slashes, then trust the native implementation unless we also suspect issues with hard link detection or file/directory conflicts. */ if (!src_slash && !dst_slash) return rename (src, dst); # endif /* !RENAME_HARD_LINK_BUG && !RENAME_DEST_EXISTS_BUG */ /* Presence of a trailing slash requires directory semantics. If the source does not exist, or if the destination cannot be turned into a directory, give up now. Otherwise, strip trailing slashes before calling rename. */ if (lstat (src, &src_st)) return -1; if (lstat (dst, &dst_st)) { if (errno != ENOENT || (!S_ISDIR (src_st.st_mode) && dst_slash)) return -1; dst_exists = false; } else { if (S_ISDIR (dst_st.st_mode) != S_ISDIR (src_st.st_mode)) { errno = S_ISDIR (dst_st.st_mode) ? EISDIR : ENOTDIR; return -1; } # if RENAME_HARD_LINK_BUG if (SAME_INODE (src_st, dst_st)) return 0; # endif /* RENAME_HARD_LINK_BUG */ dst_exists = true; } # if (RENAME_TRAILING_SLASH_SOURCE_BUG || RENAME_DEST_EXISTS_BUG \ || RENAME_HARD_LINK_BUG) /* If the only bug was that a trailing slash was allowed on a non-existing file destination, as in Solaris 10, then we've already covered that situation. But if there is any problem with a trailing slash on an existing source or destination, as in Solaris 9, or if a directory can overwrite a symlink, as on Cygwin 1.5, or if directories cannot be created with trailing slash, as on NetBSD 1.6, then we must strip the offending slash and check that we have not encountered a symlink instead of a directory. Stripping a trailing slash interferes with POSIX semantics, where rename behavior on a symlink with a trailing slash operates on the corresponding target directory. We prefer the GNU semantics of rejecting any use of a symlink with trailing slash, but do not enforce them, since Solaris 10 is able to obey POSIX semantics and there might be clients expecting it, as counter-intuitive as those semantics are. Technically, we could also follow the POSIX behavior by chasing a readlink trail, but that is harder to implement. */ if (src_slash) { src_temp = strdup (src); if (!src_temp) { /* Rather than rely on strdup-posix, we set errno ourselves. */ rename_errno = ENOMEM; goto out; } strip_trailing_slashes (src_temp); if (lstat (src_temp, &src_st)) { rename_errno = errno; goto out; } if (S_ISLNK (src_st.st_mode)) goto out; } if (dst_slash) { dst_temp = strdup (dst); if (!dst_temp) { rename_errno = ENOMEM; goto out; } strip_trailing_slashes (dst_temp); if (lstat (dst_temp, &dst_st)) { if (errno != ENOENT) { rename_errno = errno; goto out; } } else if (S_ISLNK (dst_st.st_mode)) goto out; } # endif /* RENAME_TRAILING_SLASH_SOURCE_BUG || RENAME_DEST_EXISTS_BUG || RENAME_HARD_LINK_BUG */ # if RENAME_DEST_EXISTS_BUG /* Cygwin 1.5 sometimes behaves oddly when moving a non-empty directory on top of an empty one (the old directory name can reappear if the new directory tree is removed). Work around this by removing the target first, but don't remove the target if it is a subdirectory of the source. Note that we can end up losing a directory if rename then fails, but it was empty, so not much damage was done. */ if (dst_exists && S_ISDIR (dst_st.st_mode)) { if (src_st.st_dev != dst_st.st_dev) { rename_errno = EXDEV; goto out; } if (src_temp != src) free (src_temp); src_temp = canonicalize_file_name (src); if (dst_temp != dst) free (dst_temp); dst_temp = canonicalize_file_name (dst); if (!src_temp || !dst_temp) { rename_errno = ENOMEM; goto out; } src_len = strlen (src_temp); if (strncmp (src_temp, dst_temp, src_len) == 0 && dst_temp[src_len] == '/') { rename_errno = EINVAL; goto out; } if (rmdir (dst)) { rename_errno = errno; goto out; } } # endif /* RENAME_DEST_EXISTS_BUG */ ret_val = rename (src_temp, dst_temp); rename_errno = errno; out: _GL_UNUSED_LABEL; if (src_temp != src) free (src_temp); if (dst_temp != dst) free (dst_temp); errno = rename_errno; return ret_val; } #endif /* ! W32 platform */ pspp-1.4.1/gl/isnan.c0000644000175000017500000001560613723215637014012 0ustar00blpblp00000000000000/* Test for NaN that does not need libm. Copyright (C) 2007-2020 Free Software Foundation, Inc. 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 3 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, see . */ /* Written by Bruno Haible , 2007. */ #include /* Specification. */ #ifdef USE_LONG_DOUBLE /* Specification found in math.h or isnanl-nolibm.h. */ extern int rpl_isnanl (long double x) _GL_ATTRIBUTE_CONST; #elif ! defined USE_FLOAT /* Specification found in math.h or isnand-nolibm.h. */ extern int rpl_isnand (double x); #else /* defined USE_FLOAT */ /* Specification found in math.h or isnanf-nolibm.h. */ extern int rpl_isnanf (float x); #endif #include #include #include "float+.h" #ifdef USE_LONG_DOUBLE # define FUNC rpl_isnanl # define DOUBLE long double # define MAX_EXP LDBL_MAX_EXP # define MIN_EXP LDBL_MIN_EXP # if defined LDBL_EXPBIT0_WORD && defined LDBL_EXPBIT0_BIT # define KNOWN_EXPBIT0_LOCATION # define EXPBIT0_WORD LDBL_EXPBIT0_WORD # define EXPBIT0_BIT LDBL_EXPBIT0_BIT # endif # define SIZE SIZEOF_LDBL # define L_(literal) literal##L #elif ! defined USE_FLOAT # define FUNC rpl_isnand # define DOUBLE double # define MAX_EXP DBL_MAX_EXP # define MIN_EXP DBL_MIN_EXP # if defined DBL_EXPBIT0_WORD && defined DBL_EXPBIT0_BIT # define KNOWN_EXPBIT0_LOCATION # define EXPBIT0_WORD DBL_EXPBIT0_WORD # define EXPBIT0_BIT DBL_EXPBIT0_BIT # endif # define SIZE SIZEOF_DBL # define L_(literal) literal #else /* defined USE_FLOAT */ # define FUNC rpl_isnanf # define DOUBLE float # define MAX_EXP FLT_MAX_EXP # define MIN_EXP FLT_MIN_EXP # if defined FLT_EXPBIT0_WORD && defined FLT_EXPBIT0_BIT # define KNOWN_EXPBIT0_LOCATION # define EXPBIT0_WORD FLT_EXPBIT0_WORD # define EXPBIT0_BIT FLT_EXPBIT0_BIT # endif # define SIZE SIZEOF_FLT # define L_(literal) literal##f #endif #define EXP_MASK ((MAX_EXP - MIN_EXP) | 7) #define NWORDS \ ((sizeof (DOUBLE) + sizeof (unsigned int) - 1) / sizeof (unsigned int)) typedef union { DOUBLE value; unsigned int word[NWORDS]; } memory_double; /* Most hosts nowadays use IEEE floating point, so they use IEC 60559 representations, have infinities and NaNs, and do not trap on exceptions. Define IEEE_FLOATING_POINT if this host is one of the typical ones. The C11 macro __STDC_IEC_559__ is close to what is wanted here, but is not quite right because this file does not require all the features of C11 Annex F (and does not require C11 at all, for that matter). */ #define IEEE_FLOATING_POINT (FLT_RADIX == 2 && FLT_MANT_DIG == 24 \ && FLT_MIN_EXP == -125 && FLT_MAX_EXP == 128) int FUNC (DOUBLE x) { #if defined KNOWN_EXPBIT0_LOCATION && IEEE_FLOATING_POINT # if defined USE_LONG_DOUBLE && ((defined __ia64 && LDBL_MANT_DIG == 64) || (defined __x86_64__ || defined __amd64__) || (defined __i386 || defined __i386__ || defined _I386 || defined _M_IX86 || defined _X86_)) && !HAVE_SAME_LONG_DOUBLE_AS_DOUBLE /* Special CPU dependent code is needed to treat bit patterns outside the IEEE 754 specification (such as Pseudo-NaNs, Pseudo-Infinities, Pseudo-Zeroes, Unnormalized Numbers, and Pseudo-Denormals) as NaNs. These bit patterns are: - exponent = 0x0001..0x7FFF, mantissa bit 63 = 0, - exponent = 0x0000, mantissa bit 63 = 1. The NaN bit pattern is: - exponent = 0x7FFF, mantissa >= 0x8000000000000001. */ memory_double m; unsigned int exponent; m.value = x; exponent = (m.word[EXPBIT0_WORD] >> EXPBIT0_BIT) & EXP_MASK; # ifdef WORDS_BIGENDIAN /* Big endian: EXPBIT0_WORD = 0, EXPBIT0_BIT = 16. */ if (exponent == 0) return 1 & (m.word[0] >> 15); else if (exponent == EXP_MASK) return (((m.word[0] ^ 0x8000U) << 16) | m.word[1] | (m.word[2] >> 16)) != 0; else return 1 & ~(m.word[0] >> 15); # else /* Little endian: EXPBIT0_WORD = 2, EXPBIT0_BIT = 0. */ if (exponent == 0) return (m.word[1] >> 31); else if (exponent == EXP_MASK) return ((m.word[1] ^ 0x80000000U) | m.word[0]) != 0; else return (m.word[1] >> 31) ^ 1; # endif # else /* Be careful to not do any floating-point operation on x, such as x == x, because x may be a signaling NaN. */ # if defined __SUNPRO_C || defined __ICC || defined _MSC_VER \ || defined __DECC || defined __TINYC__ \ || (defined __sgi && !defined __GNUC__) /* The Sun C 5.0, Intel ICC 10.0, Microsoft Visual C/C++ 9.0, Compaq (ex-DEC) 6.4, and TinyCC compilers don't recognize the initializers as constant expressions. The Compaq compiler also fails when constant-folding 0.0 / 0.0 even when constant-folding is not required. The Microsoft Visual C/C++ compiler also fails when constant-folding 1.0 / 0.0 even when constant-folding is not required. The SGI MIPSpro C compiler complains about "floating-point operation result is out of range". */ static DOUBLE zero = L_(0.0); memory_double nan; DOUBLE plus_inf = L_(1.0) / zero; DOUBLE minus_inf = -L_(1.0) / zero; nan.value = zero / zero; # else static memory_double nan = { L_(0.0) / L_(0.0) }; static DOUBLE plus_inf = L_(1.0) / L_(0.0); static DOUBLE minus_inf = -L_(1.0) / L_(0.0); # endif { memory_double m; /* A NaN can be recognized through its exponent. But exclude +Infinity and -Infinity, which have the same exponent. */ m.value = x; if (((m.word[EXPBIT0_WORD] ^ nan.word[EXPBIT0_WORD]) & (EXP_MASK << EXPBIT0_BIT)) == 0) return (memcmp (&m.value, &plus_inf, SIZE) != 0 && memcmp (&m.value, &minus_inf, SIZE) != 0); else return 0; } # endif #else /* The configuration did not find sufficient information, or does not use IEEE floating point. Give up about the signaling NaNs; handle only the quiet NaNs. */ if (x == x) { # if defined USE_LONG_DOUBLE && ((defined __ia64 && LDBL_MANT_DIG == 64) || (defined __x86_64__ || defined __amd64__) || (defined __i386 || defined __i386__ || defined _I386 || defined _M_IX86 || defined _X86_)) && !HAVE_SAME_LONG_DOUBLE_AS_DOUBLE /* Detect any special bit patterns that pass ==; see comment above. */ memory_double m1; memory_double m2; memset (&m1.value, 0, SIZE); memset (&m2.value, 0, SIZE); m1.value = x; m2.value = x + (x ? 0.0L : -0.0L); if (memcmp (&m1.value, &m2.value, SIZE) != 0) return 1; # endif return 0; } else return 1; #endif } pspp-1.4.1/gl/windows-rwlock.h0000644000175000017500000000507313723215640015667 0ustar00blpblp00000000000000/* Read-write locks (native Windows implementation). Copyright (C) 2005-2020 Free Software Foundation, Inc. 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 3, 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, see . */ /* Written by Bruno Haible , 2005. Based on GCC's gthr-win32.h. */ #ifndef _WINDOWS_RWLOCK_H #define _WINDOWS_RWLOCK_H #define WIN32_LEAN_AND_MEAN /* avoid including junk */ #include #include "windows-initguard.h" /* It is impossible to implement read-write locks using plain locks, without introducing an extra thread dedicated to managing read-write locks. Therefore here we need to use the low-level Event type. */ typedef struct { HANDLE *array; /* array of waiting threads, each represented by an event */ unsigned int count; /* number of waiting threads */ unsigned int alloc; /* length of allocated array */ unsigned int offset; /* index of first waiting thread in array */ } glwthread_carray_waitqueue_t; typedef struct { glwthread_initguard_t guard; /* protects the initialization */ CRITICAL_SECTION lock; /* protects the remaining fields */ glwthread_carray_waitqueue_t waiting_readers; /* waiting readers */ glwthread_carray_waitqueue_t waiting_writers; /* waiting writers */ int runcount; /* number of readers running, or -1 when a writer runs */ } glwthread_rwlock_t; #define GLWTHREAD_RWLOCK_INIT { GLWTHREAD_INITGUARD_INIT } #ifdef __cplusplus extern "C" { #endif extern void glwthread_rwlock_init (glwthread_rwlock_t *lock); extern int glwthread_rwlock_rdlock (glwthread_rwlock_t *lock); extern int glwthread_rwlock_wrlock (glwthread_rwlock_t *lock); extern int glwthread_rwlock_tryrdlock (glwthread_rwlock_t *lock); extern int glwthread_rwlock_trywrlock (glwthread_rwlock_t *lock); extern int glwthread_rwlock_unlock (glwthread_rwlock_t *lock); extern int glwthread_rwlock_destroy (glwthread_rwlock_t *lock); #ifdef __cplusplus } #endif #endif /* _WINDOWS_RWLOCK_H */ pspp-1.4.1/gl/isnand-nolibm.h0000644000175000017500000000226513723215637015436 0ustar00blpblp00000000000000/* Test for NaN that does not need libm. Copyright (C) 2007-2020 Free Software Foundation, Inc. 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 3 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, see . */ #if HAVE_ISNAND_IN_LIBC /* Get declaration of isnan macro. */ # include # if (__GNUC__ >= 4) || (__clang_major__ >= 4) /* GCC >= 4.0 and clang provide a type-generic built-in for isnan. */ # undef isnand # define isnand(x) __builtin_isnan ((double)(x)) # else # undef isnand # define isnand(x) isnan ((double)(x)) # endif #else /* Test whether X is a NaN. */ # undef isnand # define isnand rpl_isnand extern int isnand (double x); #endif pspp-1.4.1/gl/regcomp.c0000644000175000017500000033747613723215640014344 0ustar00blpblp00000000000000/* Extended regular expression matching and search library. Copyright (C) 2002-2020 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Isamu Hasegawa . The GNU C Library 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 3 of the License, or (at your option) any later version. The GNU C Library 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 the GNU C Library; if not, see . */ #ifdef _LIBC # include #endif static reg_errcode_t re_compile_internal (regex_t *preg, const char * pattern, size_t length, reg_syntax_t syntax); static void re_compile_fastmap_iter (regex_t *bufp, const re_dfastate_t *init_state, char *fastmap); static reg_errcode_t init_dfa (re_dfa_t *dfa, size_t pat_len); #ifdef RE_ENABLE_I18N static void free_charset (re_charset_t *cset); #endif /* RE_ENABLE_I18N */ static void free_workarea_compile (regex_t *preg); static reg_errcode_t create_initial_state (re_dfa_t *dfa); #ifdef RE_ENABLE_I18N static void optimize_utf8 (re_dfa_t *dfa); #endif static reg_errcode_t analyze (regex_t *preg); static reg_errcode_t preorder (bin_tree_t *root, reg_errcode_t (fn (void *, bin_tree_t *)), void *extra); static reg_errcode_t postorder (bin_tree_t *root, reg_errcode_t (fn (void *, bin_tree_t *)), void *extra); static reg_errcode_t optimize_subexps (void *extra, bin_tree_t *node); static reg_errcode_t lower_subexps (void *extra, bin_tree_t *node); static bin_tree_t *lower_subexp (reg_errcode_t *err, regex_t *preg, bin_tree_t *node); static reg_errcode_t calc_first (void *extra, bin_tree_t *node); static reg_errcode_t calc_next (void *extra, bin_tree_t *node); static reg_errcode_t link_nfa_nodes (void *extra, bin_tree_t *node); static Idx duplicate_node (re_dfa_t *dfa, Idx org_idx, unsigned int constraint); static Idx search_duplicated_node (const re_dfa_t *dfa, Idx org_node, unsigned int constraint); static reg_errcode_t calc_eclosure (re_dfa_t *dfa); static reg_errcode_t calc_eclosure_iter (re_node_set *new_set, re_dfa_t *dfa, Idx node, bool root); static reg_errcode_t calc_inveclosure (re_dfa_t *dfa); static Idx fetch_number (re_string_t *input, re_token_t *token, reg_syntax_t syntax); static int peek_token (re_token_t *token, re_string_t *input, reg_syntax_t syntax); static bin_tree_t *parse (re_string_t *regexp, regex_t *preg, reg_syntax_t syntax, reg_errcode_t *err); static bin_tree_t *parse_reg_exp (re_string_t *regexp, regex_t *preg, re_token_t *token, reg_syntax_t syntax, Idx nest, reg_errcode_t *err); static bin_tree_t *parse_branch (re_string_t *regexp, regex_t *preg, re_token_t *token, reg_syntax_t syntax, Idx nest, reg_errcode_t *err); static bin_tree_t *parse_expression (re_string_t *regexp, regex_t *preg, re_token_t *token, reg_syntax_t syntax, Idx nest, reg_errcode_t *err); static bin_tree_t *parse_sub_exp (re_string_t *regexp, regex_t *preg, re_token_t *token, reg_syntax_t syntax, Idx nest, reg_errcode_t *err); static bin_tree_t *parse_dup_op (bin_tree_t *dup_elem, re_string_t *regexp, re_dfa_t *dfa, re_token_t *token, reg_syntax_t syntax, reg_errcode_t *err); static bin_tree_t *parse_bracket_exp (re_string_t *regexp, re_dfa_t *dfa, re_token_t *token, reg_syntax_t syntax, reg_errcode_t *err); static reg_errcode_t parse_bracket_element (bracket_elem_t *elem, re_string_t *regexp, re_token_t *token, int token_len, re_dfa_t *dfa, reg_syntax_t syntax, bool accept_hyphen); static reg_errcode_t parse_bracket_symbol (bracket_elem_t *elem, re_string_t *regexp, re_token_t *token); #ifdef RE_ENABLE_I18N static reg_errcode_t build_equiv_class (bitset_t sbcset, re_charset_t *mbcset, Idx *equiv_class_alloc, const unsigned char *name); static reg_errcode_t build_charclass (RE_TRANSLATE_TYPE trans, bitset_t sbcset, re_charset_t *mbcset, Idx *char_class_alloc, const char *class_name, reg_syntax_t syntax); #else /* not RE_ENABLE_I18N */ static reg_errcode_t build_equiv_class (bitset_t sbcset, const unsigned char *name); static reg_errcode_t build_charclass (RE_TRANSLATE_TYPE trans, bitset_t sbcset, const char *class_name, reg_syntax_t syntax); #endif /* not RE_ENABLE_I18N */ static bin_tree_t *build_charclass_op (re_dfa_t *dfa, RE_TRANSLATE_TYPE trans, const char *class_name, const char *extra, bool non_match, reg_errcode_t *err); static bin_tree_t *create_tree (re_dfa_t *dfa, bin_tree_t *left, bin_tree_t *right, re_token_type_t type); static bin_tree_t *create_token_tree (re_dfa_t *dfa, bin_tree_t *left, bin_tree_t *right, const re_token_t *token); static bin_tree_t *duplicate_tree (const bin_tree_t *src, re_dfa_t *dfa); static void free_token (re_token_t *node); static reg_errcode_t free_tree (void *extra, bin_tree_t *node); static reg_errcode_t mark_opt_subexp (void *extra, bin_tree_t *node); /* This table gives an error message for each of the error codes listed in regex.h. Obviously the order here has to be same as there. POSIX doesn't require that we do anything for REG_NOERROR, but why not be nice? */ static const char __re_error_msgid[] = { #define REG_NOERROR_IDX 0 gettext_noop ("Success") /* REG_NOERROR */ "\0" #define REG_NOMATCH_IDX (REG_NOERROR_IDX + sizeof "Success") gettext_noop ("No match") /* REG_NOMATCH */ "\0" #define REG_BADPAT_IDX (REG_NOMATCH_IDX + sizeof "No match") gettext_noop ("Invalid regular expression") /* REG_BADPAT */ "\0" #define REG_ECOLLATE_IDX (REG_BADPAT_IDX + sizeof "Invalid regular expression") gettext_noop ("Invalid collation character") /* REG_ECOLLATE */ "\0" #define REG_ECTYPE_IDX (REG_ECOLLATE_IDX + sizeof "Invalid collation character") gettext_noop ("Invalid character class name") /* REG_ECTYPE */ "\0" #define REG_EESCAPE_IDX (REG_ECTYPE_IDX + sizeof "Invalid character class name") gettext_noop ("Trailing backslash") /* REG_EESCAPE */ "\0" #define REG_ESUBREG_IDX (REG_EESCAPE_IDX + sizeof "Trailing backslash") gettext_noop ("Invalid back reference") /* REG_ESUBREG */ "\0" #define REG_EBRACK_IDX (REG_ESUBREG_IDX + sizeof "Invalid back reference") gettext_noop ("Unmatched [, [^, [:, [., or [=") /* REG_EBRACK */ "\0" #define REG_EPAREN_IDX (REG_EBRACK_IDX + sizeof "Unmatched [, [^, [:, [., or [=") gettext_noop ("Unmatched ( or \\(") /* REG_EPAREN */ "\0" #define REG_EBRACE_IDX (REG_EPAREN_IDX + sizeof "Unmatched ( or \\(") gettext_noop ("Unmatched \\{") /* REG_EBRACE */ "\0" #define REG_BADBR_IDX (REG_EBRACE_IDX + sizeof "Unmatched \\{") gettext_noop ("Invalid content of \\{\\}") /* REG_BADBR */ "\0" #define REG_ERANGE_IDX (REG_BADBR_IDX + sizeof "Invalid content of \\{\\}") gettext_noop ("Invalid range end") /* REG_ERANGE */ "\0" #define REG_ESPACE_IDX (REG_ERANGE_IDX + sizeof "Invalid range end") gettext_noop ("Memory exhausted") /* REG_ESPACE */ "\0" #define REG_BADRPT_IDX (REG_ESPACE_IDX + sizeof "Memory exhausted") gettext_noop ("Invalid preceding regular expression") /* REG_BADRPT */ "\0" #define REG_EEND_IDX (REG_BADRPT_IDX + sizeof "Invalid preceding regular expression") gettext_noop ("Premature end of regular expression") /* REG_EEND */ "\0" #define REG_ESIZE_IDX (REG_EEND_IDX + sizeof "Premature end of regular expression") gettext_noop ("Regular expression too big") /* REG_ESIZE */ "\0" #define REG_ERPAREN_IDX (REG_ESIZE_IDX + sizeof "Regular expression too big") gettext_noop ("Unmatched ) or \\)") /* REG_ERPAREN */ }; static const size_t __re_error_msgid_idx[] = { REG_NOERROR_IDX, REG_NOMATCH_IDX, REG_BADPAT_IDX, REG_ECOLLATE_IDX, REG_ECTYPE_IDX, REG_EESCAPE_IDX, REG_ESUBREG_IDX, REG_EBRACK_IDX, REG_EPAREN_IDX, REG_EBRACE_IDX, REG_BADBR_IDX, REG_ERANGE_IDX, REG_ESPACE_IDX, REG_BADRPT_IDX, REG_EEND_IDX, REG_ESIZE_IDX, REG_ERPAREN_IDX }; /* Entry points for GNU code. */ /* re_compile_pattern is the GNU regular expression compiler: it compiles PATTERN (of length LENGTH) and puts the result in BUFP. Returns 0 if the pattern was valid, otherwise an error string. Assumes the 'allocated' (and perhaps 'buffer') and 'translate' fields are set in BUFP on entry. */ const char * re_compile_pattern (const char *pattern, size_t length, struct re_pattern_buffer *bufp) { reg_errcode_t ret; /* And GNU code determines whether or not to get register information by passing null for the REGS argument to re_match, etc., not by setting no_sub, unless RE_NO_SUB is set. */ bufp->no_sub = !!(re_syntax_options & RE_NO_SUB); /* Match anchors at newline. */ bufp->newline_anchor = 1; ret = re_compile_internal (bufp, pattern, length, re_syntax_options); if (!ret) return NULL; return gettext (__re_error_msgid + __re_error_msgid_idx[(int) ret]); } weak_alias (__re_compile_pattern, re_compile_pattern) /* Set by 're_set_syntax' to the current regexp syntax to recognize. Can also be assigned to arbitrarily: each pattern buffer stores its own syntax, so it can be changed between regex compilations. */ /* This has no initializer because initialized variables in Emacs become read-only after dumping. */ reg_syntax_t re_syntax_options; /* Specify the precise syntax of regexps for compilation. This provides for compatibility for various utilities which historically have different, incompatible syntaxes. The argument SYNTAX is a bit mask comprised of the various bits defined in regex.h. We return the old syntax. */ reg_syntax_t re_set_syntax (reg_syntax_t syntax) { reg_syntax_t ret = re_syntax_options; re_syntax_options = syntax; return ret; } weak_alias (__re_set_syntax, re_set_syntax) int re_compile_fastmap (struct re_pattern_buffer *bufp) { re_dfa_t *dfa = bufp->buffer; char *fastmap = bufp->fastmap; memset (fastmap, '\0', sizeof (char) * SBC_MAX); re_compile_fastmap_iter (bufp, dfa->init_state, fastmap); if (dfa->init_state != dfa->init_state_word) re_compile_fastmap_iter (bufp, dfa->init_state_word, fastmap); if (dfa->init_state != dfa->init_state_nl) re_compile_fastmap_iter (bufp, dfa->init_state_nl, fastmap); if (dfa->init_state != dfa->init_state_begbuf) re_compile_fastmap_iter (bufp, dfa->init_state_begbuf, fastmap); bufp->fastmap_accurate = 1; return 0; } weak_alias (__re_compile_fastmap, re_compile_fastmap) static inline void __attribute__ ((always_inline)) re_set_fastmap (char *fastmap, bool icase, int ch) { fastmap[ch] = 1; if (icase) fastmap[tolower (ch)] = 1; } /* Helper function for re_compile_fastmap. Compile fastmap for the initial_state INIT_STATE. */ static void re_compile_fastmap_iter (regex_t *bufp, const re_dfastate_t *init_state, char *fastmap) { re_dfa_t *dfa = bufp->buffer; Idx node_cnt; bool icase = (dfa->mb_cur_max == 1 && (bufp->syntax & RE_ICASE)); for (node_cnt = 0; node_cnt < init_state->nodes.nelem; ++node_cnt) { Idx node = init_state->nodes.elems[node_cnt]; re_token_type_t type = dfa->nodes[node].type; if (type == CHARACTER) { re_set_fastmap (fastmap, icase, dfa->nodes[node].opr.c); #ifdef RE_ENABLE_I18N if ((bufp->syntax & RE_ICASE) && dfa->mb_cur_max > 1) { unsigned char buf[MB_LEN_MAX]; unsigned char *p; wchar_t wc; mbstate_t state; p = buf; *p++ = dfa->nodes[node].opr.c; while (++node < dfa->nodes_len && dfa->nodes[node].type == CHARACTER && dfa->nodes[node].mb_partial) *p++ = dfa->nodes[node].opr.c; memset (&state, '\0', sizeof (state)); if (__mbrtowc (&wc, (const char *) buf, p - buf, &state) == p - buf && (__wcrtomb ((char *) buf, __towlower (wc), &state) != (size_t) -1)) re_set_fastmap (fastmap, false, buf[0]); } #endif } else if (type == SIMPLE_BRACKET) { int i, ch; for (i = 0, ch = 0; i < BITSET_WORDS; ++i) { int j; bitset_word_t w = dfa->nodes[node].opr.sbcset[i]; for (j = 0; j < BITSET_WORD_BITS; ++j, ++ch) if (w & ((bitset_word_t) 1 << j)) re_set_fastmap (fastmap, icase, ch); } } #ifdef RE_ENABLE_I18N else if (type == COMPLEX_BRACKET) { re_charset_t *cset = dfa->nodes[node].opr.mbcset; Idx i; # ifdef _LIBC /* See if we have to try all bytes which start multiple collation elements. e.g. In da_DK, we want to catch 'a' since "aa" is a valid collation element, and don't catch 'b' since 'b' is the only collation element which starts from 'b' (and it is caught by SIMPLE_BRACKET). */ if (_NL_CURRENT_WORD (LC_COLLATE, _NL_COLLATE_NRULES) != 0 && (cset->ncoll_syms || cset->nranges)) { const int32_t *table = (const int32_t *) _NL_CURRENT (LC_COLLATE, _NL_COLLATE_TABLEMB); for (i = 0; i < SBC_MAX; ++i) if (table[i] < 0) re_set_fastmap (fastmap, icase, i); } # endif /* _LIBC */ /* See if we have to start the match at all multibyte characters, i.e. where we would not find an invalid sequence. This only applies to multibyte character sets; for single byte character sets, the SIMPLE_BRACKET again suffices. */ if (dfa->mb_cur_max > 1 && (cset->nchar_classes || cset->non_match || cset->nranges # ifdef _LIBC || cset->nequiv_classes # endif /* _LIBC */ )) { unsigned char c = 0; do { mbstate_t mbs; memset (&mbs, 0, sizeof (mbs)); if (__mbrtowc (NULL, (char *) &c, 1, &mbs) == (size_t) -2) re_set_fastmap (fastmap, false, (int) c); } while (++c != 0); } else { /* ... Else catch all bytes which can start the mbchars. */ for (i = 0; i < cset->nmbchars; ++i) { char buf[256]; mbstate_t state; memset (&state, '\0', sizeof (state)); if (__wcrtomb (buf, cset->mbchars[i], &state) != (size_t) -1) re_set_fastmap (fastmap, icase, *(unsigned char *) buf); if ((bufp->syntax & RE_ICASE) && dfa->mb_cur_max > 1) { if (__wcrtomb (buf, __towlower (cset->mbchars[i]), &state) != (size_t) -1) re_set_fastmap (fastmap, false, *(unsigned char *) buf); } } } } #endif /* RE_ENABLE_I18N */ else if (type == OP_PERIOD #ifdef RE_ENABLE_I18N || type == OP_UTF8_PERIOD #endif /* RE_ENABLE_I18N */ || type == END_OF_RE) { memset (fastmap, '\1', sizeof (char) * SBC_MAX); if (type == END_OF_RE) bufp->can_be_null = 1; return; } } } /* Entry point for POSIX code. */ /* regcomp takes a regular expression as a string and compiles it. PREG is a regex_t *. We do not expect any fields to be initialized, since POSIX says we shouldn't. Thus, we set 'buffer' to the compiled pattern; 'used' to the length of the compiled pattern; 'syntax' to RE_SYNTAX_POSIX_EXTENDED if the REG_EXTENDED bit in CFLAGS is set; otherwise, to RE_SYNTAX_POSIX_BASIC; 'newline_anchor' to REG_NEWLINE being set in CFLAGS; 'fastmap' to an allocated space for the fastmap; 'fastmap_accurate' to zero; 're_nsub' to the number of subexpressions in PATTERN. PATTERN is the address of the pattern string. CFLAGS is a series of bits which affect compilation. If REG_EXTENDED is set, we use POSIX extended syntax; otherwise, we use POSIX basic syntax. If REG_NEWLINE is set, then . and [^...] don't match newline. Also, regexec will try a match beginning after every newline. If REG_ICASE is set, then we considers upper- and lowercase versions of letters to be equivalent when matching. If REG_NOSUB is set, then when PREG is passed to regexec, that routine will report only success or failure, and nothing about the registers. It returns 0 if it succeeds, nonzero if it doesn't. (See regex.h for the return codes and their meanings.) */ int regcomp (regex_t *__restrict preg, const char *__restrict pattern, int cflags) { reg_errcode_t ret; reg_syntax_t syntax = ((cflags & REG_EXTENDED) ? RE_SYNTAX_POSIX_EXTENDED : RE_SYNTAX_POSIX_BASIC); preg->buffer = NULL; preg->allocated = 0; preg->used = 0; /* Try to allocate space for the fastmap. */ preg->fastmap = re_malloc (char, SBC_MAX); if (__glibc_unlikely (preg->fastmap == NULL)) return REG_ESPACE; syntax |= (cflags & REG_ICASE) ? RE_ICASE : 0; /* If REG_NEWLINE is set, newlines are treated differently. */ if (cflags & REG_NEWLINE) { /* REG_NEWLINE implies neither . nor [^...] match newline. */ syntax &= ~RE_DOT_NEWLINE; syntax |= RE_HAT_LISTS_NOT_NEWLINE; /* It also changes the matching behavior. */ preg->newline_anchor = 1; } else preg->newline_anchor = 0; preg->no_sub = !!(cflags & REG_NOSUB); preg->translate = NULL; ret = re_compile_internal (preg, pattern, strlen (pattern), syntax); /* POSIX doesn't distinguish between an unmatched open-group and an unmatched close-group: both are REG_EPAREN. */ if (ret == REG_ERPAREN) ret = REG_EPAREN; /* We have already checked preg->fastmap != NULL. */ if (__glibc_likely (ret == REG_NOERROR)) /* Compute the fastmap now, since regexec cannot modify the pattern buffer. This function never fails in this implementation. */ (void) re_compile_fastmap (preg); else { /* Some error occurred while compiling the expression. */ re_free (preg->fastmap); preg->fastmap = NULL; } return (int) ret; } libc_hidden_def (__regcomp) weak_alias (__regcomp, regcomp) /* Returns a message corresponding to an error code, ERRCODE, returned from either regcomp or regexec. We don't use PREG here. */ size_t regerror (int errcode, const regex_t *__restrict preg, char *__restrict errbuf, size_t errbuf_size) { const char *msg; size_t msg_size; int nerrcodes = sizeof __re_error_msgid_idx / sizeof __re_error_msgid_idx[0]; if (__glibc_unlikely (errcode < 0 || errcode >= nerrcodes)) /* Only error codes returned by the rest of the code should be passed to this routine. If we are given anything else, or if other regex code generates an invalid error code, then the program has a bug. Dump core so we can fix it. */ abort (); msg = gettext (__re_error_msgid + __re_error_msgid_idx[errcode]); msg_size = strlen (msg) + 1; /* Includes the null. */ if (__glibc_likely (errbuf_size != 0)) { size_t cpy_size = msg_size; if (__glibc_unlikely (msg_size > errbuf_size)) { cpy_size = errbuf_size - 1; errbuf[cpy_size] = '\0'; } memcpy (errbuf, msg, cpy_size); } return msg_size; } weak_alias (__regerror, regerror) #ifdef RE_ENABLE_I18N /* This static array is used for the map to single-byte characters when UTF-8 is used. Otherwise we would allocate memory just to initialize it the same all the time. UTF-8 is the preferred encoding so this is a worthwhile optimization. */ static const bitset_t utf8_sb_map = { /* Set the first 128 bits. */ # if defined __GNUC__ && !defined __STRICT_ANSI__ [0 ... 0x80 / BITSET_WORD_BITS - 1] = BITSET_WORD_MAX # else # if 4 * BITSET_WORD_BITS < ASCII_CHARS # error "bitset_word_t is narrower than 32 bits" # elif 3 * BITSET_WORD_BITS < ASCII_CHARS BITSET_WORD_MAX, BITSET_WORD_MAX, BITSET_WORD_MAX, # elif 2 * BITSET_WORD_BITS < ASCII_CHARS BITSET_WORD_MAX, BITSET_WORD_MAX, # elif 1 * BITSET_WORD_BITS < ASCII_CHARS BITSET_WORD_MAX, # endif (BITSET_WORD_MAX >> (SBC_MAX % BITSET_WORD_BITS == 0 ? 0 : BITSET_WORD_BITS - SBC_MAX % BITSET_WORD_BITS)) # endif }; #endif static void free_dfa_content (re_dfa_t *dfa) { Idx i, j; if (dfa->nodes) for (i = 0; i < dfa->nodes_len; ++i) free_token (dfa->nodes + i); re_free (dfa->nexts); for (i = 0; i < dfa->nodes_len; ++i) { if (dfa->eclosures != NULL) re_node_set_free (dfa->eclosures + i); if (dfa->inveclosures != NULL) re_node_set_free (dfa->inveclosures + i); if (dfa->edests != NULL) re_node_set_free (dfa->edests + i); } re_free (dfa->edests); re_free (dfa->eclosures); re_free (dfa->inveclosures); re_free (dfa->nodes); if (dfa->state_table) for (i = 0; i <= dfa->state_hash_mask; ++i) { struct re_state_table_entry *entry = dfa->state_table + i; for (j = 0; j < entry->num; ++j) { re_dfastate_t *state = entry->array[j]; free_state (state); } re_free (entry->array); } re_free (dfa->state_table); #ifdef RE_ENABLE_I18N if (dfa->sb_char != utf8_sb_map) re_free (dfa->sb_char); #endif re_free (dfa->subexp_map); #ifdef DEBUG re_free (dfa->re_str); #endif re_free (dfa); } /* Free dynamically allocated space used by PREG. */ void regfree (regex_t *preg) { re_dfa_t *dfa = preg->buffer; if (__glibc_likely (dfa != NULL)) { lock_fini (dfa->lock); free_dfa_content (dfa); } preg->buffer = NULL; preg->allocated = 0; re_free (preg->fastmap); preg->fastmap = NULL; re_free (preg->translate); preg->translate = NULL; } libc_hidden_def (__regfree) weak_alias (__regfree, regfree) /* Entry points compatible with 4.2 BSD regex library. We don't define them unless specifically requested. */ #if defined _REGEX_RE_COMP || defined _LIBC /* BSD has one and only one pattern buffer. */ static struct re_pattern_buffer re_comp_buf; char * # ifdef _LIBC /* Make these definitions weak in libc, so POSIX programs can redefine these names if they don't use our functions, and still use regcomp/regexec above without link errors. */ weak_function # endif re_comp (const char *s) { reg_errcode_t ret; char *fastmap; if (!s) { if (!re_comp_buf.buffer) return gettext ("No previous regular expression"); return 0; } if (re_comp_buf.buffer) { fastmap = re_comp_buf.fastmap; re_comp_buf.fastmap = NULL; __regfree (&re_comp_buf); memset (&re_comp_buf, '\0', sizeof (re_comp_buf)); re_comp_buf.fastmap = fastmap; } if (re_comp_buf.fastmap == NULL) { re_comp_buf.fastmap = re_malloc (char, SBC_MAX); if (re_comp_buf.fastmap == NULL) return (char *) gettext (__re_error_msgid + __re_error_msgid_idx[(int) REG_ESPACE]); } /* Since 're_exec' always passes NULL for the 'regs' argument, we don't need to initialize the pattern buffer fields which affect it. */ /* Match anchors at newlines. */ re_comp_buf.newline_anchor = 1; ret = re_compile_internal (&re_comp_buf, s, strlen (s), re_syntax_options); if (!ret) return NULL; /* Yes, we're discarding 'const' here if !HAVE_LIBINTL. */ return (char *) gettext (__re_error_msgid + __re_error_msgid_idx[(int) ret]); } #ifdef _LIBC libc_freeres_fn (free_mem) { __regfree (&re_comp_buf); } #endif #endif /* _REGEX_RE_COMP */ /* Internal entry point. Compile the regular expression PATTERN, whose length is LENGTH. SYNTAX indicate regular expression's syntax. */ static reg_errcode_t re_compile_internal (regex_t *preg, const char * pattern, size_t length, reg_syntax_t syntax) { reg_errcode_t err = REG_NOERROR; re_dfa_t *dfa; re_string_t regexp; /* Initialize the pattern buffer. */ preg->fastmap_accurate = 0; preg->syntax = syntax; preg->not_bol = preg->not_eol = 0; preg->used = 0; preg->re_nsub = 0; preg->can_be_null = 0; preg->regs_allocated = REGS_UNALLOCATED; /* Initialize the dfa. */ dfa = preg->buffer; if (__glibc_unlikely (preg->allocated < sizeof (re_dfa_t))) { /* If zero allocated, but buffer is non-null, try to realloc enough space. This loses if buffer's address is bogus, but that is the user's responsibility. If ->buffer is NULL this is a simple allocation. */ dfa = re_realloc (preg->buffer, re_dfa_t, 1); if (dfa == NULL) return REG_ESPACE; preg->allocated = sizeof (re_dfa_t); preg->buffer = dfa; } preg->used = sizeof (re_dfa_t); err = init_dfa (dfa, length); if (__glibc_unlikely (err == REG_NOERROR && lock_init (dfa->lock) != 0)) err = REG_ESPACE; if (__glibc_unlikely (err != REG_NOERROR)) { free_dfa_content (dfa); preg->buffer = NULL; preg->allocated = 0; return err; } #ifdef DEBUG /* Note: length+1 will not overflow since it is checked in init_dfa. */ dfa->re_str = re_malloc (char, length + 1); strncpy (dfa->re_str, pattern, length + 1); #endif err = re_string_construct (®exp, pattern, length, preg->translate, (syntax & RE_ICASE) != 0, dfa); if (__glibc_unlikely (err != REG_NOERROR)) { re_compile_internal_free_return: free_workarea_compile (preg); re_string_destruct (®exp); lock_fini (dfa->lock); free_dfa_content (dfa); preg->buffer = NULL; preg->allocated = 0; return err; } /* Parse the regular expression, and build a structure tree. */ preg->re_nsub = 0; dfa->str_tree = parse (®exp, preg, syntax, &err); if (__glibc_unlikely (dfa->str_tree == NULL)) goto re_compile_internal_free_return; /* Analyze the tree and create the nfa. */ err = analyze (preg); if (__glibc_unlikely (err != REG_NOERROR)) goto re_compile_internal_free_return; #ifdef RE_ENABLE_I18N /* If possible, do searching in single byte encoding to speed things up. */ if (dfa->is_utf8 && !(syntax & RE_ICASE) && preg->translate == NULL) optimize_utf8 (dfa); #endif /* Then create the initial state of the dfa. */ err = create_initial_state (dfa); /* Release work areas. */ free_workarea_compile (preg); re_string_destruct (®exp); if (__glibc_unlikely (err != REG_NOERROR)) { lock_fini (dfa->lock); free_dfa_content (dfa); preg->buffer = NULL; preg->allocated = 0; } return err; } /* Initialize DFA. We use the length of the regular expression PAT_LEN as the initial length of some arrays. */ static reg_errcode_t init_dfa (re_dfa_t *dfa, size_t pat_len) { __re_size_t table_size; #ifndef _LIBC const char *codeset_name; #endif #ifdef RE_ENABLE_I18N size_t max_i18n_object_size = MAX (sizeof (wchar_t), sizeof (wctype_t)); #else size_t max_i18n_object_size = 0; #endif size_t max_object_size = MAX (sizeof (struct re_state_table_entry), MAX (sizeof (re_token_t), MAX (sizeof (re_node_set), MAX (sizeof (regmatch_t), max_i18n_object_size)))); memset (dfa, '\0', sizeof (re_dfa_t)); /* Force allocation of str_tree_storage the first time. */ dfa->str_tree_storage_idx = BIN_TREE_STORAGE_SIZE; /* Avoid overflows. The extra "/ 2" is for the table_size doubling calculation below, and for similar doubling calculations elsewhere. And it's <= rather than <, because some of the doubling calculations add 1 afterwards. */ if (__glibc_unlikely (MIN (IDX_MAX, SIZE_MAX / max_object_size) / 2 <= pat_len)) return REG_ESPACE; dfa->nodes_alloc = pat_len + 1; dfa->nodes = re_malloc (re_token_t, dfa->nodes_alloc); /* table_size = 2 ^ ceil(log pat_len) */ for (table_size = 1; ; table_size <<= 1) if (table_size > pat_len) break; dfa->state_table = calloc (sizeof (struct re_state_table_entry), table_size); dfa->state_hash_mask = table_size - 1; dfa->mb_cur_max = MB_CUR_MAX; #ifdef _LIBC if (dfa->mb_cur_max == 6 && strcmp (_NL_CURRENT (LC_CTYPE, _NL_CTYPE_CODESET_NAME), "UTF-8") == 0) dfa->is_utf8 = 1; dfa->map_notascii = (_NL_CURRENT_WORD (LC_CTYPE, _NL_CTYPE_MAP_TO_NONASCII) != 0); #else codeset_name = nl_langinfo (CODESET); if ((codeset_name[0] == 'U' || codeset_name[0] == 'u') && (codeset_name[1] == 'T' || codeset_name[1] == 't') && (codeset_name[2] == 'F' || codeset_name[2] == 'f') && strcmp (codeset_name + 3 + (codeset_name[3] == '-'), "8") == 0) dfa->is_utf8 = 1; /* We check exhaustively in the loop below if this charset is a superset of ASCII. */ dfa->map_notascii = 0; #endif #ifdef RE_ENABLE_I18N if (dfa->mb_cur_max > 1) { if (dfa->is_utf8) dfa->sb_char = (re_bitset_ptr_t) utf8_sb_map; else { int i, j, ch; dfa->sb_char = (re_bitset_ptr_t) calloc (sizeof (bitset_t), 1); if (__glibc_unlikely (dfa->sb_char == NULL)) return REG_ESPACE; /* Set the bits corresponding to single byte chars. */ for (i = 0, ch = 0; i < BITSET_WORDS; ++i) for (j = 0; j < BITSET_WORD_BITS; ++j, ++ch) { wint_t wch = __btowc (ch); if (wch != WEOF) dfa->sb_char[i] |= (bitset_word_t) 1 << j; # ifndef _LIBC if (isascii (ch) && wch != ch) dfa->map_notascii = 1; # endif } } } #endif if (__glibc_unlikely (dfa->nodes == NULL || dfa->state_table == NULL)) return REG_ESPACE; return REG_NOERROR; } /* Initialize WORD_CHAR table, which indicate which character is "word". In this case "word" means that it is the word construction character used by some operators like "\<", "\>", etc. */ static void init_word_char (re_dfa_t *dfa) { int i = 0; int j; int ch = 0; dfa->word_ops_used = 1; if (__glibc_likely (dfa->map_notascii == 0)) { /* Avoid uint32_t and uint64_t as some non-GCC platforms lack them, an issue when this code is used in Gnulib. */ bitset_word_t bits0 = 0x00000000; bitset_word_t bits1 = 0x03ff0000; bitset_word_t bits2 = 0x87fffffe; bitset_word_t bits3 = 0x07fffffe; if (BITSET_WORD_BITS == 64) { /* Pacify gcc -Woverflow on 32-bit platformns. */ dfa->word_char[0] = bits1 << 31 << 1 | bits0; dfa->word_char[1] = bits3 << 31 << 1 | bits2; i = 2; } else if (BITSET_WORD_BITS == 32) { dfa->word_char[0] = bits0; dfa->word_char[1] = bits1; dfa->word_char[2] = bits2; dfa->word_char[3] = bits3; i = 4; } else goto general_case; ch = 128; if (__glibc_likely (dfa->is_utf8)) { memset (&dfa->word_char[i], '\0', (SBC_MAX - ch) / 8); return; } } general_case: for (; i < BITSET_WORDS; ++i) for (j = 0; j < BITSET_WORD_BITS; ++j, ++ch) if (isalnum (ch) || ch == '_') dfa->word_char[i] |= (bitset_word_t) 1 << j; } /* Free the work area which are only used while compiling. */ static void free_workarea_compile (regex_t *preg) { re_dfa_t *dfa = preg->buffer; bin_tree_storage_t *storage, *next; for (storage = dfa->str_tree_storage; storage; storage = next) { next = storage->next; re_free (storage); } dfa->str_tree_storage = NULL; dfa->str_tree_storage_idx = BIN_TREE_STORAGE_SIZE; dfa->str_tree = NULL; re_free (dfa->org_indices); dfa->org_indices = NULL; } /* Create initial states for all contexts. */ static reg_errcode_t create_initial_state (re_dfa_t *dfa) { Idx first, i; reg_errcode_t err; re_node_set init_nodes; /* Initial states have the epsilon closure of the node which is the first node of the regular expression. */ first = dfa->str_tree->first->node_idx; dfa->init_node = first; err = re_node_set_init_copy (&init_nodes, dfa->eclosures + first); if (__glibc_unlikely (err != REG_NOERROR)) return err; /* The back-references which are in initial states can epsilon transit, since in this case all of the subexpressions can be null. Then we add epsilon closures of the nodes which are the next nodes of the back-references. */ if (dfa->nbackref > 0) for (i = 0; i < init_nodes.nelem; ++i) { Idx node_idx = init_nodes.elems[i]; re_token_type_t type = dfa->nodes[node_idx].type; Idx clexp_idx; if (type != OP_BACK_REF) continue; for (clexp_idx = 0; clexp_idx < init_nodes.nelem; ++clexp_idx) { re_token_t *clexp_node; clexp_node = dfa->nodes + init_nodes.elems[clexp_idx]; if (clexp_node->type == OP_CLOSE_SUBEXP && clexp_node->opr.idx == dfa->nodes[node_idx].opr.idx) break; } if (clexp_idx == init_nodes.nelem) continue; if (type == OP_BACK_REF) { Idx dest_idx = dfa->edests[node_idx].elems[0]; if (!re_node_set_contains (&init_nodes, dest_idx)) { reg_errcode_t merge_err = re_node_set_merge (&init_nodes, dfa->eclosures + dest_idx); if (merge_err != REG_NOERROR) return merge_err; i = 0; } } } /* It must be the first time to invoke acquire_state. */ dfa->init_state = re_acquire_state_context (&err, dfa, &init_nodes, 0); /* We don't check ERR here, since the initial state must not be NULL. */ if (__glibc_unlikely (dfa->init_state == NULL)) return err; if (dfa->init_state->has_constraint) { dfa->init_state_word = re_acquire_state_context (&err, dfa, &init_nodes, CONTEXT_WORD); dfa->init_state_nl = re_acquire_state_context (&err, dfa, &init_nodes, CONTEXT_NEWLINE); dfa->init_state_begbuf = re_acquire_state_context (&err, dfa, &init_nodes, CONTEXT_NEWLINE | CONTEXT_BEGBUF); if (__glibc_unlikely (dfa->init_state_word == NULL || dfa->init_state_nl == NULL || dfa->init_state_begbuf == NULL)) return err; } else dfa->init_state_word = dfa->init_state_nl = dfa->init_state_begbuf = dfa->init_state; re_node_set_free (&init_nodes); return REG_NOERROR; } #ifdef RE_ENABLE_I18N /* If it is possible to do searching in single byte encoding instead of UTF-8 to speed things up, set dfa->mb_cur_max to 1, clear is_utf8 and change DFA nodes where needed. */ static void optimize_utf8 (re_dfa_t *dfa) { Idx node; int i; bool mb_chars = false; bool has_period = false; for (node = 0; node < dfa->nodes_len; ++node) switch (dfa->nodes[node].type) { case CHARACTER: if (dfa->nodes[node].opr.c >= ASCII_CHARS) mb_chars = true; break; case ANCHOR: switch (dfa->nodes[node].opr.ctx_type) { case LINE_FIRST: case LINE_LAST: case BUF_FIRST: case BUF_LAST: break; default: /* Word anchors etc. cannot be handled. It's okay to test opr.ctx_type since constraints (for all DFA nodes) are created by ORing one or more opr.ctx_type values. */ return; } break; case OP_PERIOD: has_period = true; break; case OP_BACK_REF: case OP_ALT: case END_OF_RE: case OP_DUP_ASTERISK: case OP_OPEN_SUBEXP: case OP_CLOSE_SUBEXP: break; case COMPLEX_BRACKET: return; case SIMPLE_BRACKET: /* Just double check. */ { int rshift = (ASCII_CHARS % BITSET_WORD_BITS == 0 ? 0 : BITSET_WORD_BITS - ASCII_CHARS % BITSET_WORD_BITS); for (i = ASCII_CHARS / BITSET_WORD_BITS; i < BITSET_WORDS; ++i) { if (dfa->nodes[node].opr.sbcset[i] >> rshift != 0) return; rshift = 0; } } break; default: abort (); } if (mb_chars || has_period) for (node = 0; node < dfa->nodes_len; ++node) { if (dfa->nodes[node].type == CHARACTER && dfa->nodes[node].opr.c >= ASCII_CHARS) dfa->nodes[node].mb_partial = 0; else if (dfa->nodes[node].type == OP_PERIOD) dfa->nodes[node].type = OP_UTF8_PERIOD; } /* The search can be in single byte locale. */ dfa->mb_cur_max = 1; dfa->is_utf8 = 0; dfa->has_mb_node = dfa->nbackref > 0 || has_period; } #endif /* Analyze the structure tree, and calculate "first", "next", "edest", "eclosure", and "inveclosure". */ static reg_errcode_t analyze (regex_t *preg) { re_dfa_t *dfa = preg->buffer; reg_errcode_t ret; /* Allocate arrays. */ dfa->nexts = re_malloc (Idx, dfa->nodes_alloc); dfa->org_indices = re_malloc (Idx, dfa->nodes_alloc); dfa->edests = re_malloc (re_node_set, dfa->nodes_alloc); dfa->eclosures = re_malloc (re_node_set, dfa->nodes_alloc); if (__glibc_unlikely (dfa->nexts == NULL || dfa->org_indices == NULL || dfa->edests == NULL || dfa->eclosures == NULL)) return REG_ESPACE; dfa->subexp_map = re_malloc (Idx, preg->re_nsub); if (dfa->subexp_map != NULL) { Idx i; for (i = 0; i < preg->re_nsub; i++) dfa->subexp_map[i] = i; preorder (dfa->str_tree, optimize_subexps, dfa); for (i = 0; i < preg->re_nsub; i++) if (dfa->subexp_map[i] != i) break; if (i == preg->re_nsub) { re_free (dfa->subexp_map); dfa->subexp_map = NULL; } } ret = postorder (dfa->str_tree, lower_subexps, preg); if (__glibc_unlikely (ret != REG_NOERROR)) return ret; ret = postorder (dfa->str_tree, calc_first, dfa); if (__glibc_unlikely (ret != REG_NOERROR)) return ret; preorder (dfa->str_tree, calc_next, dfa); ret = preorder (dfa->str_tree, link_nfa_nodes, dfa); if (__glibc_unlikely (ret != REG_NOERROR)) return ret; ret = calc_eclosure (dfa); if (__glibc_unlikely (ret != REG_NOERROR)) return ret; /* We only need this during the prune_impossible_nodes pass in regexec.c; skip it if p_i_n will not run, as calc_inveclosure can be quadratic. */ if ((!preg->no_sub && preg->re_nsub > 0 && dfa->has_plural_match) || dfa->nbackref) { dfa->inveclosures = re_malloc (re_node_set, dfa->nodes_len); if (__glibc_unlikely (dfa->inveclosures == NULL)) return REG_ESPACE; ret = calc_inveclosure (dfa); } return ret; } /* Our parse trees are very unbalanced, so we cannot use a stack to implement parse tree visits. Instead, we use parent pointers and some hairy code in these two functions. */ static reg_errcode_t postorder (bin_tree_t *root, reg_errcode_t (fn (void *, bin_tree_t *)), void *extra) { bin_tree_t *node, *prev; for (node = root; ; ) { /* Descend down the tree, preferably to the left (or to the right if that's the only child). */ while (node->left || node->right) if (node->left) node = node->left; else node = node->right; do { reg_errcode_t err = fn (extra, node); if (__glibc_unlikely (err != REG_NOERROR)) return err; if (node->parent == NULL) return REG_NOERROR; prev = node; node = node->parent; } /* Go up while we have a node that is reached from the right. */ while (node->right == prev || node->right == NULL); node = node->right; } } static reg_errcode_t preorder (bin_tree_t *root, reg_errcode_t (fn (void *, bin_tree_t *)), void *extra) { bin_tree_t *node; for (node = root; ; ) { reg_errcode_t err = fn (extra, node); if (__glibc_unlikely (err != REG_NOERROR)) return err; /* Go to the left node, or up and to the right. */ if (node->left) node = node->left; else { bin_tree_t *prev = NULL; while (node->right == prev || node->right == NULL) { prev = node; node = node->parent; if (!node) return REG_NOERROR; } node = node->right; } } } /* Optimization pass: if a SUBEXP is entirely contained, strip it and tell re_search_internal to map the inner one's opr.idx to this one's. Adjust backreferences as well. Requires a preorder visit. */ static reg_errcode_t optimize_subexps (void *extra, bin_tree_t *node) { re_dfa_t *dfa = (re_dfa_t *) extra; if (node->token.type == OP_BACK_REF && dfa->subexp_map) { int idx = node->token.opr.idx; node->token.opr.idx = dfa->subexp_map[idx]; dfa->used_bkref_map |= 1 << node->token.opr.idx; } else if (node->token.type == SUBEXP && node->left && node->left->token.type == SUBEXP) { Idx other_idx = node->left->token.opr.idx; node->left = node->left->left; if (node->left) node->left->parent = node; dfa->subexp_map[other_idx] = dfa->subexp_map[node->token.opr.idx]; if (other_idx < BITSET_WORD_BITS) dfa->used_bkref_map &= ~((bitset_word_t) 1 << other_idx); } return REG_NOERROR; } /* Lowering pass: Turn each SUBEXP node into the appropriate concatenation of OP_OPEN_SUBEXP, the body of the SUBEXP (if any) and OP_CLOSE_SUBEXP. */ static reg_errcode_t lower_subexps (void *extra, bin_tree_t *node) { regex_t *preg = (regex_t *) extra; reg_errcode_t err = REG_NOERROR; if (node->left && node->left->token.type == SUBEXP) { node->left = lower_subexp (&err, preg, node->left); if (node->left) node->left->parent = node; } if (node->right && node->right->token.type == SUBEXP) { node->right = lower_subexp (&err, preg, node->right); if (node->right) node->right->parent = node; } return err; } static bin_tree_t * lower_subexp (reg_errcode_t *err, regex_t *preg, bin_tree_t *node) { re_dfa_t *dfa = preg->buffer; bin_tree_t *body = node->left; bin_tree_t *op, *cls, *tree1, *tree; if (preg->no_sub /* We do not optimize empty subexpressions, because otherwise we may have bad CONCAT nodes with NULL children. This is obviously not very common, so we do not lose much. An example that triggers this case is the sed "script" /\(\)/x. */ && node->left != NULL && (node->token.opr.idx >= BITSET_WORD_BITS || !(dfa->used_bkref_map & ((bitset_word_t) 1 << node->token.opr.idx)))) return node->left; /* Convert the SUBEXP node to the concatenation of an OP_OPEN_SUBEXP, the contents, and an OP_CLOSE_SUBEXP. */ op = create_tree (dfa, NULL, NULL, OP_OPEN_SUBEXP); cls = create_tree (dfa, NULL, NULL, OP_CLOSE_SUBEXP); tree1 = body ? create_tree (dfa, body, cls, CONCAT) : cls; tree = create_tree (dfa, op, tree1, CONCAT); if (__glibc_unlikely (tree == NULL || tree1 == NULL || op == NULL || cls == NULL)) { *err = REG_ESPACE; return NULL; } op->token.opr.idx = cls->token.opr.idx = node->token.opr.idx; op->token.opt_subexp = cls->token.opt_subexp = node->token.opt_subexp; return tree; } /* Pass 1 in building the NFA: compute FIRST and create unlinked automaton nodes. Requires a postorder visit. */ static reg_errcode_t calc_first (void *extra, bin_tree_t *node) { re_dfa_t *dfa = (re_dfa_t *) extra; if (node->token.type == CONCAT) { node->first = node->left->first; node->node_idx = node->left->node_idx; } else { node->first = node; node->node_idx = re_dfa_add_node (dfa, node->token); if (__glibc_unlikely (node->node_idx == -1)) return REG_ESPACE; if (node->token.type == ANCHOR) dfa->nodes[node->node_idx].constraint = node->token.opr.ctx_type; } return REG_NOERROR; } /* Pass 2: compute NEXT on the tree. Preorder visit. */ static reg_errcode_t calc_next (void *extra, bin_tree_t *node) { switch (node->token.type) { case OP_DUP_ASTERISK: node->left->next = node; break; case CONCAT: node->left->next = node->right->first; node->right->next = node->next; break; default: if (node->left) node->left->next = node->next; if (node->right) node->right->next = node->next; break; } return REG_NOERROR; } /* Pass 3: link all DFA nodes to their NEXT node (any order will do). */ static reg_errcode_t link_nfa_nodes (void *extra, bin_tree_t *node) { re_dfa_t *dfa = (re_dfa_t *) extra; Idx idx = node->node_idx; reg_errcode_t err = REG_NOERROR; switch (node->token.type) { case CONCAT: break; case END_OF_RE: DEBUG_ASSERT (node->next == NULL); break; case OP_DUP_ASTERISK: case OP_ALT: { Idx left, right; dfa->has_plural_match = 1; if (node->left != NULL) left = node->left->first->node_idx; else left = node->next->node_idx; if (node->right != NULL) right = node->right->first->node_idx; else right = node->next->node_idx; DEBUG_ASSERT (left > -1); DEBUG_ASSERT (right > -1); err = re_node_set_init_2 (dfa->edests + idx, left, right); } break; case ANCHOR: case OP_OPEN_SUBEXP: case OP_CLOSE_SUBEXP: err = re_node_set_init_1 (dfa->edests + idx, node->next->node_idx); break; case OP_BACK_REF: dfa->nexts[idx] = node->next->node_idx; if (node->token.type == OP_BACK_REF) err = re_node_set_init_1 (dfa->edests + idx, dfa->nexts[idx]); break; default: DEBUG_ASSERT (!IS_EPSILON_NODE (node->token.type)); dfa->nexts[idx] = node->next->node_idx; break; } return err; } /* Duplicate the epsilon closure of the node ROOT_NODE. Note that duplicated nodes have constraint INIT_CONSTRAINT in addition to their own constraint. */ static reg_errcode_t duplicate_node_closure (re_dfa_t *dfa, Idx top_org_node, Idx top_clone_node, Idx root_node, unsigned int init_constraint) { Idx org_node, clone_node; bool ok; unsigned int constraint = init_constraint; for (org_node = top_org_node, clone_node = top_clone_node;;) { Idx org_dest, clone_dest; if (dfa->nodes[org_node].type == OP_BACK_REF) { /* If the back reference epsilon-transit, its destination must also have the constraint. Then duplicate the epsilon closure of the destination of the back reference, and store it in edests of the back reference. */ org_dest = dfa->nexts[org_node]; re_node_set_empty (dfa->edests + clone_node); clone_dest = duplicate_node (dfa, org_dest, constraint); if (__glibc_unlikely (clone_dest == -1)) return REG_ESPACE; dfa->nexts[clone_node] = dfa->nexts[org_node]; ok = re_node_set_insert (dfa->edests + clone_node, clone_dest); if (__glibc_unlikely (! ok)) return REG_ESPACE; } else if (dfa->edests[org_node].nelem == 0) { /* In case of the node can't epsilon-transit, don't duplicate the destination and store the original destination as the destination of the node. */ dfa->nexts[clone_node] = dfa->nexts[org_node]; break; } else if (dfa->edests[org_node].nelem == 1) { /* In case of the node can epsilon-transit, and it has only one destination. */ org_dest = dfa->edests[org_node].elems[0]; re_node_set_empty (dfa->edests + clone_node); /* If the node is root_node itself, it means the epsilon closure has a loop. Then tie it to the destination of the root_node. */ if (org_node == root_node && clone_node != org_node) { ok = re_node_set_insert (dfa->edests + clone_node, org_dest); if (__glibc_unlikely (! ok)) return REG_ESPACE; break; } /* In case the node has another constraint, append it. */ constraint |= dfa->nodes[org_node].constraint; clone_dest = duplicate_node (dfa, org_dest, constraint); if (__glibc_unlikely (clone_dest == -1)) return REG_ESPACE; ok = re_node_set_insert (dfa->edests + clone_node, clone_dest); if (__glibc_unlikely (! ok)) return REG_ESPACE; } else /* dfa->edests[org_node].nelem == 2 */ { /* In case of the node can epsilon-transit, and it has two destinations. In the bin_tree_t and DFA, that's '|' and '*'. */ org_dest = dfa->edests[org_node].elems[0]; re_node_set_empty (dfa->edests + clone_node); /* Search for a duplicated node which satisfies the constraint. */ clone_dest = search_duplicated_node (dfa, org_dest, constraint); if (clone_dest == -1) { /* There is no such duplicated node, create a new one. */ reg_errcode_t err; clone_dest = duplicate_node (dfa, org_dest, constraint); if (__glibc_unlikely (clone_dest == -1)) return REG_ESPACE; ok = re_node_set_insert (dfa->edests + clone_node, clone_dest); if (__glibc_unlikely (! ok)) return REG_ESPACE; err = duplicate_node_closure (dfa, org_dest, clone_dest, root_node, constraint); if (__glibc_unlikely (err != REG_NOERROR)) return err; } else { /* There is a duplicated node which satisfies the constraint, use it to avoid infinite loop. */ ok = re_node_set_insert (dfa->edests + clone_node, clone_dest); if (__glibc_unlikely (! ok)) return REG_ESPACE; } org_dest = dfa->edests[org_node].elems[1]; clone_dest = duplicate_node (dfa, org_dest, constraint); if (__glibc_unlikely (clone_dest == -1)) return REG_ESPACE; ok = re_node_set_insert (dfa->edests + clone_node, clone_dest); if (__glibc_unlikely (! ok)) return REG_ESPACE; } org_node = org_dest; clone_node = clone_dest; } return REG_NOERROR; } /* Search for a node which is duplicated from the node ORG_NODE, and satisfies the constraint CONSTRAINT. */ static Idx search_duplicated_node (const re_dfa_t *dfa, Idx org_node, unsigned int constraint) { Idx idx; for (idx = dfa->nodes_len - 1; dfa->nodes[idx].duplicated && idx > 0; --idx) { if (org_node == dfa->org_indices[idx] && constraint == dfa->nodes[idx].constraint) return idx; /* Found. */ } return -1; /* Not found. */ } /* Duplicate the node whose index is ORG_IDX and set the constraint CONSTRAINT. Return the index of the new node, or -1 if insufficient storage is available. */ static Idx duplicate_node (re_dfa_t *dfa, Idx org_idx, unsigned int constraint) { Idx dup_idx = re_dfa_add_node (dfa, dfa->nodes[org_idx]); if (__glibc_likely (dup_idx != -1)) { dfa->nodes[dup_idx].constraint = constraint; dfa->nodes[dup_idx].constraint |= dfa->nodes[org_idx].constraint; dfa->nodes[dup_idx].duplicated = 1; /* Store the index of the original node. */ dfa->org_indices[dup_idx] = org_idx; } return dup_idx; } static reg_errcode_t calc_inveclosure (re_dfa_t *dfa) { Idx src, idx; bool ok; for (idx = 0; idx < dfa->nodes_len; ++idx) re_node_set_init_empty (dfa->inveclosures + idx); for (src = 0; src < dfa->nodes_len; ++src) { Idx *elems = dfa->eclosures[src].elems; for (idx = 0; idx < dfa->eclosures[src].nelem; ++idx) { ok = re_node_set_insert_last (dfa->inveclosures + elems[idx], src); if (__glibc_unlikely (! ok)) return REG_ESPACE; } } return REG_NOERROR; } /* Calculate "eclosure" for all the node in DFA. */ static reg_errcode_t calc_eclosure (re_dfa_t *dfa) { Idx node_idx; bool incomplete; DEBUG_ASSERT (dfa->nodes_len > 0); incomplete = false; /* For each nodes, calculate epsilon closure. */ for (node_idx = 0; ; ++node_idx) { reg_errcode_t err; re_node_set eclosure_elem; if (node_idx == dfa->nodes_len) { if (!incomplete) break; incomplete = false; node_idx = 0; } DEBUG_ASSERT (dfa->eclosures[node_idx].nelem != -1); /* If we have already calculated, skip it. */ if (dfa->eclosures[node_idx].nelem != 0) continue; /* Calculate epsilon closure of 'node_idx'. */ err = calc_eclosure_iter (&eclosure_elem, dfa, node_idx, true); if (__glibc_unlikely (err != REG_NOERROR)) return err; if (dfa->eclosures[node_idx].nelem == 0) { incomplete = true; re_node_set_free (&eclosure_elem); } } return REG_NOERROR; } /* Calculate epsilon closure of NODE. */ static reg_errcode_t calc_eclosure_iter (re_node_set *new_set, re_dfa_t *dfa, Idx node, bool root) { reg_errcode_t err; Idx i; re_node_set eclosure; bool ok; bool incomplete = false; err = re_node_set_alloc (&eclosure, dfa->edests[node].nelem + 1); if (__glibc_unlikely (err != REG_NOERROR)) return err; /* This indicates that we are calculating this node now. We reference this value to avoid infinite loop. */ dfa->eclosures[node].nelem = -1; /* If the current node has constraints, duplicate all nodes since they must inherit the constraints. */ if (dfa->nodes[node].constraint && dfa->edests[node].nelem && !dfa->nodes[dfa->edests[node].elems[0]].duplicated) { err = duplicate_node_closure (dfa, node, node, node, dfa->nodes[node].constraint); if (__glibc_unlikely (err != REG_NOERROR)) return err; } /* Expand each epsilon destination nodes. */ if (IS_EPSILON_NODE(dfa->nodes[node].type)) for (i = 0; i < dfa->edests[node].nelem; ++i) { re_node_set eclosure_elem; Idx edest = dfa->edests[node].elems[i]; /* If calculating the epsilon closure of 'edest' is in progress, return intermediate result. */ if (dfa->eclosures[edest].nelem == -1) { incomplete = true; continue; } /* If we haven't calculated the epsilon closure of 'edest' yet, calculate now. Otherwise use calculated epsilon closure. */ if (dfa->eclosures[edest].nelem == 0) { err = calc_eclosure_iter (&eclosure_elem, dfa, edest, false); if (__glibc_unlikely (err != REG_NOERROR)) return err; } else eclosure_elem = dfa->eclosures[edest]; /* Merge the epsilon closure of 'edest'. */ err = re_node_set_merge (&eclosure, &eclosure_elem); if (__glibc_unlikely (err != REG_NOERROR)) return err; /* If the epsilon closure of 'edest' is incomplete, the epsilon closure of this node is also incomplete. */ if (dfa->eclosures[edest].nelem == 0) { incomplete = true; re_node_set_free (&eclosure_elem); } } /* An epsilon closure includes itself. */ ok = re_node_set_insert (&eclosure, node); if (__glibc_unlikely (! ok)) return REG_ESPACE; if (incomplete && !root) dfa->eclosures[node].nelem = 0; else dfa->eclosures[node] = eclosure; *new_set = eclosure; return REG_NOERROR; } /* Functions for token which are used in the parser. */ /* Fetch a token from INPUT. We must not use this function inside bracket expressions. */ static void fetch_token (re_token_t *result, re_string_t *input, reg_syntax_t syntax) { re_string_skip_bytes (input, peek_token (result, input, syntax)); } /* Peek a token from INPUT, and return the length of the token. We must not use this function inside bracket expressions. */ static int peek_token (re_token_t *token, re_string_t *input, reg_syntax_t syntax) { unsigned char c; if (re_string_eoi (input)) { token->type = END_OF_RE; return 0; } c = re_string_peek_byte (input, 0); token->opr.c = c; token->word_char = 0; #ifdef RE_ENABLE_I18N token->mb_partial = 0; if (input->mb_cur_max > 1 && !re_string_first_byte (input, re_string_cur_idx (input))) { token->type = CHARACTER; token->mb_partial = 1; return 1; } #endif if (c == '\\') { unsigned char c2; if (re_string_cur_idx (input) + 1 >= re_string_length (input)) { token->type = BACK_SLASH; return 1; } c2 = re_string_peek_byte_case (input, 1); token->opr.c = c2; token->type = CHARACTER; #ifdef RE_ENABLE_I18N if (input->mb_cur_max > 1) { wint_t wc = re_string_wchar_at (input, re_string_cur_idx (input) + 1); token->word_char = IS_WIDE_WORD_CHAR (wc) != 0; } else #endif token->word_char = IS_WORD_CHAR (c2) != 0; switch (c2) { case '|': if (!(syntax & RE_LIMITED_OPS) && !(syntax & RE_NO_BK_VBAR)) token->type = OP_ALT; break; case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': if (!(syntax & RE_NO_BK_REFS)) { token->type = OP_BACK_REF; token->opr.idx = c2 - '1'; } break; case '<': if (!(syntax & RE_NO_GNU_OPS)) { token->type = ANCHOR; token->opr.ctx_type = WORD_FIRST; } break; case '>': if (!(syntax & RE_NO_GNU_OPS)) { token->type = ANCHOR; token->opr.ctx_type = WORD_LAST; } break; case 'b': if (!(syntax & RE_NO_GNU_OPS)) { token->type = ANCHOR; token->opr.ctx_type = WORD_DELIM; } break; case 'B': if (!(syntax & RE_NO_GNU_OPS)) { token->type = ANCHOR; token->opr.ctx_type = NOT_WORD_DELIM; } break; case 'w': if (!(syntax & RE_NO_GNU_OPS)) token->type = OP_WORD; break; case 'W': if (!(syntax & RE_NO_GNU_OPS)) token->type = OP_NOTWORD; break; case 's': if (!(syntax & RE_NO_GNU_OPS)) token->type = OP_SPACE; break; case 'S': if (!(syntax & RE_NO_GNU_OPS)) token->type = OP_NOTSPACE; break; case '`': if (!(syntax & RE_NO_GNU_OPS)) { token->type = ANCHOR; token->opr.ctx_type = BUF_FIRST; } break; case '\'': if (!(syntax & RE_NO_GNU_OPS)) { token->type = ANCHOR; token->opr.ctx_type = BUF_LAST; } break; case '(': if (!(syntax & RE_NO_BK_PARENS)) token->type = OP_OPEN_SUBEXP; break; case ')': if (!(syntax & RE_NO_BK_PARENS)) token->type = OP_CLOSE_SUBEXP; break; case '+': if (!(syntax & RE_LIMITED_OPS) && (syntax & RE_BK_PLUS_QM)) token->type = OP_DUP_PLUS; break; case '?': if (!(syntax & RE_LIMITED_OPS) && (syntax & RE_BK_PLUS_QM)) token->type = OP_DUP_QUESTION; break; case '{': if ((syntax & RE_INTERVALS) && (!(syntax & RE_NO_BK_BRACES))) token->type = OP_OPEN_DUP_NUM; break; case '}': if ((syntax & RE_INTERVALS) && (!(syntax & RE_NO_BK_BRACES))) token->type = OP_CLOSE_DUP_NUM; break; default: break; } return 2; } token->type = CHARACTER; #ifdef RE_ENABLE_I18N if (input->mb_cur_max > 1) { wint_t wc = re_string_wchar_at (input, re_string_cur_idx (input)); token->word_char = IS_WIDE_WORD_CHAR (wc) != 0; } else #endif token->word_char = IS_WORD_CHAR (token->opr.c); switch (c) { case '\n': if (syntax & RE_NEWLINE_ALT) token->type = OP_ALT; break; case '|': if (!(syntax & RE_LIMITED_OPS) && (syntax & RE_NO_BK_VBAR)) token->type = OP_ALT; break; case '*': token->type = OP_DUP_ASTERISK; break; case '+': if (!(syntax & RE_LIMITED_OPS) && !(syntax & RE_BK_PLUS_QM)) token->type = OP_DUP_PLUS; break; case '?': if (!(syntax & RE_LIMITED_OPS) && !(syntax & RE_BK_PLUS_QM)) token->type = OP_DUP_QUESTION; break; case '{': if ((syntax & RE_INTERVALS) && (syntax & RE_NO_BK_BRACES)) token->type = OP_OPEN_DUP_NUM; break; case '}': if ((syntax & RE_INTERVALS) && (syntax & RE_NO_BK_BRACES)) token->type = OP_CLOSE_DUP_NUM; break; case '(': if (syntax & RE_NO_BK_PARENS) token->type = OP_OPEN_SUBEXP; break; case ')': if (syntax & RE_NO_BK_PARENS) token->type = OP_CLOSE_SUBEXP; break; case '[': token->type = OP_OPEN_BRACKET; break; case '.': token->type = OP_PERIOD; break; case '^': if (!(syntax & (RE_CONTEXT_INDEP_ANCHORS | RE_CARET_ANCHORS_HERE)) && re_string_cur_idx (input) != 0) { char prev = re_string_peek_byte (input, -1); if (!(syntax & RE_NEWLINE_ALT) || prev != '\n') break; } token->type = ANCHOR; token->opr.ctx_type = LINE_FIRST; break; case '$': if (!(syntax & RE_CONTEXT_INDEP_ANCHORS) && re_string_cur_idx (input) + 1 != re_string_length (input)) { re_token_t next; re_string_skip_bytes (input, 1); peek_token (&next, input, syntax); re_string_skip_bytes (input, -1); if (next.type != OP_ALT && next.type != OP_CLOSE_SUBEXP) break; } token->type = ANCHOR; token->opr.ctx_type = LINE_LAST; break; default: break; } return 1; } /* Peek a token from INPUT, and return the length of the token. We must not use this function out of bracket expressions. */ static int peek_token_bracket (re_token_t *token, re_string_t *input, reg_syntax_t syntax) { unsigned char c; if (re_string_eoi (input)) { token->type = END_OF_RE; return 0; } c = re_string_peek_byte (input, 0); token->opr.c = c; #ifdef RE_ENABLE_I18N if (input->mb_cur_max > 1 && !re_string_first_byte (input, re_string_cur_idx (input))) { token->type = CHARACTER; return 1; } #endif /* RE_ENABLE_I18N */ if (c == '\\' && (syntax & RE_BACKSLASH_ESCAPE_IN_LISTS) && re_string_cur_idx (input) + 1 < re_string_length (input)) { /* In this case, '\' escape a character. */ unsigned char c2; re_string_skip_bytes (input, 1); c2 = re_string_peek_byte (input, 0); token->opr.c = c2; token->type = CHARACTER; return 1; } if (c == '[') /* '[' is a special char in a bracket exps. */ { unsigned char c2; int token_len; if (re_string_cur_idx (input) + 1 < re_string_length (input)) c2 = re_string_peek_byte (input, 1); else c2 = 0; token->opr.c = c2; token_len = 2; switch (c2) { case '.': token->type = OP_OPEN_COLL_ELEM; break; case '=': token->type = OP_OPEN_EQUIV_CLASS; break; case ':': if (syntax & RE_CHAR_CLASSES) { token->type = OP_OPEN_CHAR_CLASS; break; } FALLTHROUGH; default: token->type = CHARACTER; token->opr.c = c; token_len = 1; break; } return token_len; } switch (c) { case '-': token->type = OP_CHARSET_RANGE; break; case ']': token->type = OP_CLOSE_BRACKET; break; case '^': token->type = OP_NON_MATCH_LIST; break; default: token->type = CHARACTER; } return 1; } /* Functions for parser. */ /* Entry point of the parser. Parse the regular expression REGEXP and return the structure tree. If an error occurs, ERR is set by error code, and return NULL. This function build the following tree, from regular expression : CAT / \ / \ EOR CAT means concatenation. EOR means end of regular expression. */ static bin_tree_t * parse (re_string_t *regexp, regex_t *preg, reg_syntax_t syntax, reg_errcode_t *err) { re_dfa_t *dfa = preg->buffer; bin_tree_t *tree, *eor, *root; re_token_t current_token; dfa->syntax = syntax; fetch_token (¤t_token, regexp, syntax | RE_CARET_ANCHORS_HERE); tree = parse_reg_exp (regexp, preg, ¤t_token, syntax, 0, err); if (__glibc_unlikely (*err != REG_NOERROR && tree == NULL)) return NULL; eor = create_tree (dfa, NULL, NULL, END_OF_RE); if (tree != NULL) root = create_tree (dfa, tree, eor, CONCAT); else root = eor; if (__glibc_unlikely (eor == NULL || root == NULL)) { *err = REG_ESPACE; return NULL; } return root; } /* This function build the following tree, from regular expression |: ALT / \ / \ ALT means alternative, which represents the operator '|'. */ static bin_tree_t * parse_reg_exp (re_string_t *regexp, regex_t *preg, re_token_t *token, reg_syntax_t syntax, Idx nest, reg_errcode_t *err) { re_dfa_t *dfa = preg->buffer; bin_tree_t *tree, *branch = NULL; bitset_word_t initial_bkref_map = dfa->completed_bkref_map; tree = parse_branch (regexp, preg, token, syntax, nest, err); if (__glibc_unlikely (*err != REG_NOERROR && tree == NULL)) return NULL; while (token->type == OP_ALT) { fetch_token (token, regexp, syntax | RE_CARET_ANCHORS_HERE); if (token->type != OP_ALT && token->type != END_OF_RE && (nest == 0 || token->type != OP_CLOSE_SUBEXP)) { bitset_word_t accumulated_bkref_map = dfa->completed_bkref_map; dfa->completed_bkref_map = initial_bkref_map; branch = parse_branch (regexp, preg, token, syntax, nest, err); if (__glibc_unlikely (*err != REG_NOERROR && branch == NULL)) { if (tree != NULL) postorder (tree, free_tree, NULL); return NULL; } dfa->completed_bkref_map |= accumulated_bkref_map; } else branch = NULL; tree = create_tree (dfa, tree, branch, OP_ALT); if (__glibc_unlikely (tree == NULL)) { *err = REG_ESPACE; return NULL; } } return tree; } /* This function build the following tree, from regular expression : CAT / \ / \ CAT means concatenation. */ static bin_tree_t * parse_branch (re_string_t *regexp, regex_t *preg, re_token_t *token, reg_syntax_t syntax, Idx nest, reg_errcode_t *err) { bin_tree_t *tree, *expr; re_dfa_t *dfa = preg->buffer; tree = parse_expression (regexp, preg, token, syntax, nest, err); if (__glibc_unlikely (*err != REG_NOERROR && tree == NULL)) return NULL; while (token->type != OP_ALT && token->type != END_OF_RE && (nest == 0 || token->type != OP_CLOSE_SUBEXP)) { expr = parse_expression (regexp, preg, token, syntax, nest, err); if (__glibc_unlikely (*err != REG_NOERROR && expr == NULL)) { if (tree != NULL) postorder (tree, free_tree, NULL); return NULL; } if (tree != NULL && expr != NULL) { bin_tree_t *newtree = create_tree (dfa, tree, expr, CONCAT); if (newtree == NULL) { postorder (expr, free_tree, NULL); postorder (tree, free_tree, NULL); *err = REG_ESPACE; return NULL; } tree = newtree; } else if (tree == NULL) tree = expr; /* Otherwise expr == NULL, we don't need to create new tree. */ } return tree; } /* This function build the following tree, from regular expression a*: * | a */ static bin_tree_t * parse_expression (re_string_t *regexp, regex_t *preg, re_token_t *token, reg_syntax_t syntax, Idx nest, reg_errcode_t *err) { re_dfa_t *dfa = preg->buffer; bin_tree_t *tree; switch (token->type) { case CHARACTER: tree = create_token_tree (dfa, NULL, NULL, token); if (__glibc_unlikely (tree == NULL)) { *err = REG_ESPACE; return NULL; } #ifdef RE_ENABLE_I18N if (dfa->mb_cur_max > 1) { while (!re_string_eoi (regexp) && !re_string_first_byte (regexp, re_string_cur_idx (regexp))) { bin_tree_t *mbc_remain; fetch_token (token, regexp, syntax); mbc_remain = create_token_tree (dfa, NULL, NULL, token); tree = create_tree (dfa, tree, mbc_remain, CONCAT); if (__glibc_unlikely (mbc_remain == NULL || tree == NULL)) { *err = REG_ESPACE; return NULL; } } } #endif break; case OP_OPEN_SUBEXP: tree = parse_sub_exp (regexp, preg, token, syntax, nest + 1, err); if (__glibc_unlikely (*err != REG_NOERROR && tree == NULL)) return NULL; break; case OP_OPEN_BRACKET: tree = parse_bracket_exp (regexp, dfa, token, syntax, err); if (__glibc_unlikely (*err != REG_NOERROR && tree == NULL)) return NULL; break; case OP_BACK_REF: if (!__glibc_likely (dfa->completed_bkref_map & (1 << token->opr.idx))) { *err = REG_ESUBREG; return NULL; } dfa->used_bkref_map |= 1 << token->opr.idx; tree = create_token_tree (dfa, NULL, NULL, token); if (__glibc_unlikely (tree == NULL)) { *err = REG_ESPACE; return NULL; } ++dfa->nbackref; dfa->has_mb_node = 1; break; case OP_OPEN_DUP_NUM: if (syntax & RE_CONTEXT_INVALID_DUP) { *err = REG_BADRPT; return NULL; } FALLTHROUGH; case OP_DUP_ASTERISK: case OP_DUP_PLUS: case OP_DUP_QUESTION: if (syntax & RE_CONTEXT_INVALID_OPS) { *err = REG_BADRPT; return NULL; } else if (syntax & RE_CONTEXT_INDEP_OPS) { fetch_token (token, regexp, syntax); return parse_expression (regexp, preg, token, syntax, nest, err); } FALLTHROUGH; case OP_CLOSE_SUBEXP: if ((token->type == OP_CLOSE_SUBEXP) && !(syntax & RE_UNMATCHED_RIGHT_PAREN_ORD)) { *err = REG_ERPAREN; return NULL; } FALLTHROUGH; case OP_CLOSE_DUP_NUM: /* We treat it as a normal character. */ /* Then we can these characters as normal characters. */ token->type = CHARACTER; /* mb_partial and word_char bits should be initialized already by peek_token. */ tree = create_token_tree (dfa, NULL, NULL, token); if (__glibc_unlikely (tree == NULL)) { *err = REG_ESPACE; return NULL; } break; case ANCHOR: if ((token->opr.ctx_type & (WORD_DELIM | NOT_WORD_DELIM | WORD_FIRST | WORD_LAST)) && dfa->word_ops_used == 0) init_word_char (dfa); if (token->opr.ctx_type == WORD_DELIM || token->opr.ctx_type == NOT_WORD_DELIM) { bin_tree_t *tree_first, *tree_last; if (token->opr.ctx_type == WORD_DELIM) { token->opr.ctx_type = WORD_FIRST; tree_first = create_token_tree (dfa, NULL, NULL, token); token->opr.ctx_type = WORD_LAST; } else { token->opr.ctx_type = INSIDE_WORD; tree_first = create_token_tree (dfa, NULL, NULL, token); token->opr.ctx_type = INSIDE_NOTWORD; } tree_last = create_token_tree (dfa, NULL, NULL, token); tree = create_tree (dfa, tree_first, tree_last, OP_ALT); if (__glibc_unlikely (tree_first == NULL || tree_last == NULL || tree == NULL)) { *err = REG_ESPACE; return NULL; } } else { tree = create_token_tree (dfa, NULL, NULL, token); if (__glibc_unlikely (tree == NULL)) { *err = REG_ESPACE; return NULL; } } /* We must return here, since ANCHORs can't be followed by repetition operators. eg. RE"^*" is invalid or "", it must not be "". */ fetch_token (token, regexp, syntax); return tree; case OP_PERIOD: tree = create_token_tree (dfa, NULL, NULL, token); if (__glibc_unlikely (tree == NULL)) { *err = REG_ESPACE; return NULL; } if (dfa->mb_cur_max > 1) dfa->has_mb_node = 1; break; case OP_WORD: case OP_NOTWORD: tree = build_charclass_op (dfa, regexp->trans, "alnum", "_", token->type == OP_NOTWORD, err); if (__glibc_unlikely (*err != REG_NOERROR && tree == NULL)) return NULL; break; case OP_SPACE: case OP_NOTSPACE: tree = build_charclass_op (dfa, regexp->trans, "space", "", token->type == OP_NOTSPACE, err); if (__glibc_unlikely (*err != REG_NOERROR && tree == NULL)) return NULL; break; case OP_ALT: case END_OF_RE: return NULL; case BACK_SLASH: *err = REG_EESCAPE; return NULL; default: /* Must not happen? */ DEBUG_ASSERT (false); return NULL; } fetch_token (token, regexp, syntax); while (token->type == OP_DUP_ASTERISK || token->type == OP_DUP_PLUS || token->type == OP_DUP_QUESTION || token->type == OP_OPEN_DUP_NUM) { bin_tree_t *dup_tree = parse_dup_op (tree, regexp, dfa, token, syntax, err); if (__glibc_unlikely (*err != REG_NOERROR && dup_tree == NULL)) { if (tree != NULL) postorder (tree, free_tree, NULL); return NULL; } tree = dup_tree; /* In BRE consecutive duplications are not allowed. */ if ((syntax & RE_CONTEXT_INVALID_DUP) && (token->type == OP_DUP_ASTERISK || token->type == OP_OPEN_DUP_NUM)) { if (tree != NULL) postorder (tree, free_tree, NULL); *err = REG_BADRPT; return NULL; } } return tree; } /* This function build the following tree, from regular expression (): SUBEXP | */ static bin_tree_t * parse_sub_exp (re_string_t *regexp, regex_t *preg, re_token_t *token, reg_syntax_t syntax, Idx nest, reg_errcode_t *err) { re_dfa_t *dfa = preg->buffer; bin_tree_t *tree; size_t cur_nsub; cur_nsub = preg->re_nsub++; fetch_token (token, regexp, syntax | RE_CARET_ANCHORS_HERE); /* The subexpression may be a null string. */ if (token->type == OP_CLOSE_SUBEXP) tree = NULL; else { tree = parse_reg_exp (regexp, preg, token, syntax, nest, err); if (__glibc_unlikely (*err == REG_NOERROR && token->type != OP_CLOSE_SUBEXP)) { if (tree != NULL) postorder (tree, free_tree, NULL); *err = REG_EPAREN; } if (__glibc_unlikely (*err != REG_NOERROR)) return NULL; } if (cur_nsub <= '9' - '1') dfa->completed_bkref_map |= 1 << cur_nsub; tree = create_tree (dfa, tree, NULL, SUBEXP); if (__glibc_unlikely (tree == NULL)) { *err = REG_ESPACE; return NULL; } tree->token.opr.idx = cur_nsub; return tree; } /* This function parse repetition operators like "*", "+", "{1,3}" etc. */ static bin_tree_t * parse_dup_op (bin_tree_t *elem, re_string_t *regexp, re_dfa_t *dfa, re_token_t *token, reg_syntax_t syntax, reg_errcode_t *err) { bin_tree_t *tree = NULL, *old_tree = NULL; Idx i, start, end, start_idx = re_string_cur_idx (regexp); re_token_t start_token = *token; if (token->type == OP_OPEN_DUP_NUM) { end = 0; start = fetch_number (regexp, token, syntax); if (start == -1) { if (token->type == CHARACTER && token->opr.c == ',') start = 0; /* We treat "{,m}" as "{0,m}". */ else { *err = REG_BADBR; /* {} is invalid. */ return NULL; } } if (__glibc_likely (start != -2)) { /* We treat "{n}" as "{n,n}". */ end = ((token->type == OP_CLOSE_DUP_NUM) ? start : ((token->type == CHARACTER && token->opr.c == ',') ? fetch_number (regexp, token, syntax) : -2)); } if (__glibc_unlikely (start == -2 || end == -2)) { /* Invalid sequence. */ if (__glibc_unlikely (!(syntax & RE_INVALID_INTERVAL_ORD))) { if (token->type == END_OF_RE) *err = REG_EBRACE; else *err = REG_BADBR; return NULL; } /* If the syntax bit is set, rollback. */ re_string_set_index (regexp, start_idx); *token = start_token; token->type = CHARACTER; /* mb_partial and word_char bits should be already initialized by peek_token. */ return elem; } if (__glibc_unlikely ((end != -1 && start > end) || token->type != OP_CLOSE_DUP_NUM)) { /* First number greater than second. */ *err = REG_BADBR; return NULL; } if (__glibc_unlikely (RE_DUP_MAX < (end == -1 ? start : end))) { *err = REG_ESIZE; return NULL; } } else { start = (token->type == OP_DUP_PLUS) ? 1 : 0; end = (token->type == OP_DUP_QUESTION) ? 1 : -1; } fetch_token (token, regexp, syntax); if (__glibc_unlikely (elem == NULL)) return NULL; if (__glibc_unlikely (start == 0 && end == 0)) { postorder (elem, free_tree, NULL); return NULL; } /* Extract "{n,m}" to "...{0,}". */ if (__glibc_unlikely (start > 0)) { tree = elem; for (i = 2; i <= start; ++i) { elem = duplicate_tree (elem, dfa); tree = create_tree (dfa, tree, elem, CONCAT); if (__glibc_unlikely (elem == NULL || tree == NULL)) goto parse_dup_op_espace; } if (start == end) return tree; /* Duplicate ELEM before it is marked optional. */ elem = duplicate_tree (elem, dfa); if (__glibc_unlikely (elem == NULL)) goto parse_dup_op_espace; old_tree = tree; } else old_tree = NULL; if (elem->token.type == SUBEXP) { uintptr_t subidx = elem->token.opr.idx; postorder (elem, mark_opt_subexp, (void *) subidx); } tree = create_tree (dfa, elem, NULL, (end == -1 ? OP_DUP_ASTERISK : OP_ALT)); if (__glibc_unlikely (tree == NULL)) goto parse_dup_op_espace; /* This loop is actually executed only when end != -1, to rewrite {0,n} as ((...?)?)?... We have already created the start+1-th copy. */ if (TYPE_SIGNED (Idx) || end != -1) for (i = start + 2; i <= end; ++i) { elem = duplicate_tree (elem, dfa); tree = create_tree (dfa, tree, elem, CONCAT); if (__glibc_unlikely (elem == NULL || tree == NULL)) goto parse_dup_op_espace; tree = create_tree (dfa, tree, NULL, OP_ALT); if (__glibc_unlikely (tree == NULL)) goto parse_dup_op_espace; } if (old_tree) tree = create_tree (dfa, old_tree, tree, CONCAT); return tree; parse_dup_op_espace: *err = REG_ESPACE; return NULL; } /* Size of the names for collating symbol/equivalence_class/character_class. I'm not sure, but maybe enough. */ #define BRACKET_NAME_BUF_SIZE 32 #ifndef _LIBC # ifdef RE_ENABLE_I18N /* Convert the byte B to the corresponding wide character. In a unibyte locale, treat B as itself. In a multibyte locale, return WEOF if B is an encoding error. */ static wint_t parse_byte (unsigned char b, re_charset_t *mbcset) { return mbcset == NULL ? b : __btowc (b); } # endif /* Local function for parse_bracket_exp only used in case of NOT _LIBC. Build the range expression which starts from START_ELEM, and ends at END_ELEM. The result are written to MBCSET and SBCSET. RANGE_ALLOC is the allocated size of mbcset->range_starts, and mbcset->range_ends, is a pointer argument since we may update it. */ static reg_errcode_t # ifdef RE_ENABLE_I18N build_range_exp (const reg_syntax_t syntax, bitset_t sbcset, re_charset_t *mbcset, Idx *range_alloc, const bracket_elem_t *start_elem, const bracket_elem_t *end_elem) # else /* not RE_ENABLE_I18N */ build_range_exp (const reg_syntax_t syntax, bitset_t sbcset, const bracket_elem_t *start_elem, const bracket_elem_t *end_elem) # endif /* not RE_ENABLE_I18N */ { unsigned int start_ch, end_ch; /* Equivalence Classes and Character Classes can't be a range start/end. */ if (__glibc_unlikely (start_elem->type == EQUIV_CLASS || start_elem->type == CHAR_CLASS || end_elem->type == EQUIV_CLASS || end_elem->type == CHAR_CLASS)) return REG_ERANGE; /* We can handle no multi character collating elements without libc support. */ if (__glibc_unlikely ((start_elem->type == COLL_SYM && strlen ((char *) start_elem->opr.name) > 1) || (end_elem->type == COLL_SYM && strlen ((char *) end_elem->opr.name) > 1))) return REG_ECOLLATE; # ifdef RE_ENABLE_I18N { wchar_t wc; wint_t start_wc; wint_t end_wc; start_ch = ((start_elem->type == SB_CHAR) ? start_elem->opr.ch : ((start_elem->type == COLL_SYM) ? start_elem->opr.name[0] : 0)); end_ch = ((end_elem->type == SB_CHAR) ? end_elem->opr.ch : ((end_elem->type == COLL_SYM) ? end_elem->opr.name[0] : 0)); start_wc = ((start_elem->type == SB_CHAR || start_elem->type == COLL_SYM) ? parse_byte (start_ch, mbcset) : start_elem->opr.wch); end_wc = ((end_elem->type == SB_CHAR || end_elem->type == COLL_SYM) ? parse_byte (end_ch, mbcset) : end_elem->opr.wch); if (start_wc == WEOF || end_wc == WEOF) return REG_ECOLLATE; else if (__glibc_unlikely ((syntax & RE_NO_EMPTY_RANGES) && start_wc > end_wc)) return REG_ERANGE; /* Got valid collation sequence values, add them as a new entry. However, for !_LIBC we have no collation elements: if the character set is single byte, the single byte character set that we build below suffices. parse_bracket_exp passes no MBCSET if dfa->mb_cur_max == 1. */ if (mbcset) { /* Check the space of the arrays. */ if (__glibc_unlikely (*range_alloc == mbcset->nranges)) { /* There is not enough space, need realloc. */ wchar_t *new_array_start, *new_array_end; Idx new_nranges; /* +1 in case of mbcset->nranges is 0. */ new_nranges = 2 * mbcset->nranges + 1; /* Use realloc since mbcset->range_starts and mbcset->range_ends are NULL if *range_alloc == 0. */ new_array_start = re_realloc (mbcset->range_starts, wchar_t, new_nranges); new_array_end = re_realloc (mbcset->range_ends, wchar_t, new_nranges); if (__glibc_unlikely (new_array_start == NULL || new_array_end == NULL)) { re_free (new_array_start); re_free (new_array_end); return REG_ESPACE; } mbcset->range_starts = new_array_start; mbcset->range_ends = new_array_end; *range_alloc = new_nranges; } mbcset->range_starts[mbcset->nranges] = start_wc; mbcset->range_ends[mbcset->nranges++] = end_wc; } /* Build the table for single byte characters. */ for (wc = 0; wc < SBC_MAX; ++wc) { if (start_wc <= wc && wc <= end_wc) bitset_set (sbcset, wc); } } # else /* not RE_ENABLE_I18N */ { unsigned int ch; start_ch = ((start_elem->type == SB_CHAR ) ? start_elem->opr.ch : ((start_elem->type == COLL_SYM) ? start_elem->opr.name[0] : 0)); end_ch = ((end_elem->type == SB_CHAR ) ? end_elem->opr.ch : ((end_elem->type == COLL_SYM) ? end_elem->opr.name[0] : 0)); if (start_ch > end_ch) return REG_ERANGE; /* Build the table for single byte characters. */ for (ch = 0; ch < SBC_MAX; ++ch) if (start_ch <= ch && ch <= end_ch) bitset_set (sbcset, ch); } # endif /* not RE_ENABLE_I18N */ return REG_NOERROR; } #endif /* not _LIBC */ #ifndef _LIBC /* Helper function for parse_bracket_exp only used in case of NOT _LIBC.. Build the collating element which is represented by NAME. The result are written to MBCSET and SBCSET. COLL_SYM_ALLOC is the allocated size of mbcset->coll_sym, is a pointer argument since we may update it. */ static reg_errcode_t # ifdef RE_ENABLE_I18N build_collating_symbol (bitset_t sbcset, re_charset_t *mbcset, Idx *coll_sym_alloc, const unsigned char *name) # else /* not RE_ENABLE_I18N */ build_collating_symbol (bitset_t sbcset, const unsigned char *name) # endif /* not RE_ENABLE_I18N */ { size_t name_len = strlen ((const char *) name); if (__glibc_unlikely (name_len != 1)) return REG_ECOLLATE; else { bitset_set (sbcset, name[0]); return REG_NOERROR; } } #endif /* not _LIBC */ /* This function parse bracket expression like "[abc]", "[a-c]", "[[.a-a.]]" etc. */ static bin_tree_t * parse_bracket_exp (re_string_t *regexp, re_dfa_t *dfa, re_token_t *token, reg_syntax_t syntax, reg_errcode_t *err) { #ifdef _LIBC const unsigned char *collseqmb; const char *collseqwc; uint32_t nrules; int32_t table_size; const int32_t *symb_table; const unsigned char *extra; /* Local function for parse_bracket_exp used in _LIBC environment. Seek the collating symbol entry corresponding to NAME. Return the index of the symbol in the SYMB_TABLE, or -1 if not found. */ auto inline int32_t __attribute__ ((always_inline)) seek_collating_symbol_entry (const unsigned char *name, size_t name_len) { int32_t elem; for (elem = 0; elem < table_size; elem++) if (symb_table[2 * elem] != 0) { int32_t idx = symb_table[2 * elem + 1]; /* Skip the name of collating element name. */ idx += 1 + extra[idx]; if (/* Compare the length of the name. */ name_len == extra[idx] /* Compare the name. */ && memcmp (name, &extra[idx + 1], name_len) == 0) /* Yep, this is the entry. */ return elem; } return -1; } /* Local function for parse_bracket_exp used in _LIBC environment. Look up the collation sequence value of BR_ELEM. Return the value if succeeded, UINT_MAX otherwise. */ auto inline unsigned int __attribute__ ((always_inline)) lookup_collation_sequence_value (bracket_elem_t *br_elem) { if (br_elem->type == SB_CHAR) { /* if (MB_CUR_MAX == 1) */ if (nrules == 0) return collseqmb[br_elem->opr.ch]; else { wint_t wc = __btowc (br_elem->opr.ch); return __collseq_table_lookup (collseqwc, wc); } } else if (br_elem->type == MB_CHAR) { if (nrules != 0) return __collseq_table_lookup (collseqwc, br_elem->opr.wch); } else if (br_elem->type == COLL_SYM) { size_t sym_name_len = strlen ((char *) br_elem->opr.name); if (nrules != 0) { int32_t elem, idx; elem = seek_collating_symbol_entry (br_elem->opr.name, sym_name_len); if (elem != -1) { /* We found the entry. */ idx = symb_table[2 * elem + 1]; /* Skip the name of collating element name. */ idx += 1 + extra[idx]; /* Skip the byte sequence of the collating element. */ idx += 1 + extra[idx]; /* Adjust for the alignment. */ idx = (idx + 3) & ~3; /* Skip the multibyte collation sequence value. */ idx += sizeof (unsigned int); /* Skip the wide char sequence of the collating element. */ idx += sizeof (unsigned int) * (1 + *(unsigned int *) (extra + idx)); /* Return the collation sequence value. */ return *(unsigned int *) (extra + idx); } else if (sym_name_len == 1) { /* No valid character. Match it as a single byte character. */ return collseqmb[br_elem->opr.name[0]]; } } else if (sym_name_len == 1) return collseqmb[br_elem->opr.name[0]]; } return UINT_MAX; } /* Local function for parse_bracket_exp used in _LIBC environment. Build the range expression which starts from START_ELEM, and ends at END_ELEM. The result are written to MBCSET and SBCSET. RANGE_ALLOC is the allocated size of mbcset->range_starts, and mbcset->range_ends, is a pointer argument since we may update it. */ auto inline reg_errcode_t __attribute__ ((always_inline)) build_range_exp (bitset_t sbcset, re_charset_t *mbcset, int *range_alloc, bracket_elem_t *start_elem, bracket_elem_t *end_elem) { unsigned int ch; uint32_t start_collseq; uint32_t end_collseq; /* Equivalence Classes and Character Classes can't be a range start/end. */ if (__glibc_unlikely (start_elem->type == EQUIV_CLASS || start_elem->type == CHAR_CLASS || end_elem->type == EQUIV_CLASS || end_elem->type == CHAR_CLASS)) return REG_ERANGE; /* FIXME: Implement rational ranges here, too. */ start_collseq = lookup_collation_sequence_value (start_elem); end_collseq = lookup_collation_sequence_value (end_elem); /* Check start/end collation sequence values. */ if (__glibc_unlikely (start_collseq == UINT_MAX || end_collseq == UINT_MAX)) return REG_ECOLLATE; if (__glibc_unlikely ((syntax & RE_NO_EMPTY_RANGES) && start_collseq > end_collseq)) return REG_ERANGE; /* Got valid collation sequence values, add them as a new entry. However, if we have no collation elements, and the character set is single byte, the single byte character set that we build below suffices. */ if (nrules > 0 || dfa->mb_cur_max > 1) { /* Check the space of the arrays. */ if (__glibc_unlikely (*range_alloc == mbcset->nranges)) { /* There is not enough space, need realloc. */ uint32_t *new_array_start; uint32_t *new_array_end; Idx new_nranges; /* +1 in case of mbcset->nranges is 0. */ new_nranges = 2 * mbcset->nranges + 1; new_array_start = re_realloc (mbcset->range_starts, uint32_t, new_nranges); new_array_end = re_realloc (mbcset->range_ends, uint32_t, new_nranges); if (__glibc_unlikely (new_array_start == NULL || new_array_end == NULL)) return REG_ESPACE; mbcset->range_starts = new_array_start; mbcset->range_ends = new_array_end; *range_alloc = new_nranges; } mbcset->range_starts[mbcset->nranges] = start_collseq; mbcset->range_ends[mbcset->nranges++] = end_collseq; } /* Build the table for single byte characters. */ for (ch = 0; ch < SBC_MAX; ch++) { uint32_t ch_collseq; /* if (MB_CUR_MAX == 1) */ if (nrules == 0) ch_collseq = collseqmb[ch]; else ch_collseq = __collseq_table_lookup (collseqwc, __btowc (ch)); if (start_collseq <= ch_collseq && ch_collseq <= end_collseq) bitset_set (sbcset, ch); } return REG_NOERROR; } /* Local function for parse_bracket_exp used in _LIBC environment. Build the collating element which is represented by NAME. The result are written to MBCSET and SBCSET. COLL_SYM_ALLOC is the allocated size of mbcset->coll_sym, is a pointer argument since we may update it. */ auto inline reg_errcode_t __attribute__ ((always_inline)) build_collating_symbol (bitset_t sbcset, re_charset_t *mbcset, Idx *coll_sym_alloc, const unsigned char *name) { int32_t elem, idx; size_t name_len = strlen ((const char *) name); if (nrules != 0) { elem = seek_collating_symbol_entry (name, name_len); if (elem != -1) { /* We found the entry. */ idx = symb_table[2 * elem + 1]; /* Skip the name of collating element name. */ idx += 1 + extra[idx]; } else if (name_len == 1) { /* No valid character, treat it as a normal character. */ bitset_set (sbcset, name[0]); return REG_NOERROR; } else return REG_ECOLLATE; /* Got valid collation sequence, add it as a new entry. */ /* Check the space of the arrays. */ if (__glibc_unlikely (*coll_sym_alloc == mbcset->ncoll_syms)) { /* Not enough, realloc it. */ /* +1 in case of mbcset->ncoll_syms is 0. */ Idx new_coll_sym_alloc = 2 * mbcset->ncoll_syms + 1; /* Use realloc since mbcset->coll_syms is NULL if *alloc == 0. */ int32_t *new_coll_syms = re_realloc (mbcset->coll_syms, int32_t, new_coll_sym_alloc); if (__glibc_unlikely (new_coll_syms == NULL)) return REG_ESPACE; mbcset->coll_syms = new_coll_syms; *coll_sym_alloc = new_coll_sym_alloc; } mbcset->coll_syms[mbcset->ncoll_syms++] = idx; return REG_NOERROR; } else { if (__glibc_unlikely (name_len != 1)) return REG_ECOLLATE; else { bitset_set (sbcset, name[0]); return REG_NOERROR; } } } #endif re_token_t br_token; re_bitset_ptr_t sbcset; #ifdef RE_ENABLE_I18N re_charset_t *mbcset; Idx coll_sym_alloc = 0, range_alloc = 0, mbchar_alloc = 0; Idx equiv_class_alloc = 0, char_class_alloc = 0; #endif /* not RE_ENABLE_I18N */ bool non_match = false; bin_tree_t *work_tree; int token_len; bool first_round = true; #ifdef _LIBC collseqmb = (const unsigned char *) _NL_CURRENT (LC_COLLATE, _NL_COLLATE_COLLSEQMB); nrules = _NL_CURRENT_WORD (LC_COLLATE, _NL_COLLATE_NRULES); if (nrules) { /* if (MB_CUR_MAX > 1) */ collseqwc = _NL_CURRENT (LC_COLLATE, _NL_COLLATE_COLLSEQWC); table_size = _NL_CURRENT_WORD (LC_COLLATE, _NL_COLLATE_SYMB_HASH_SIZEMB); symb_table = (const int32_t *) _NL_CURRENT (LC_COLLATE, _NL_COLLATE_SYMB_TABLEMB); extra = (const unsigned char *) _NL_CURRENT (LC_COLLATE, _NL_COLLATE_SYMB_EXTRAMB); } #endif sbcset = (re_bitset_ptr_t) calloc (sizeof (bitset_t), 1); #ifdef RE_ENABLE_I18N mbcset = (re_charset_t *) calloc (sizeof (re_charset_t), 1); #endif /* RE_ENABLE_I18N */ #ifdef RE_ENABLE_I18N if (__glibc_unlikely (sbcset == NULL || mbcset == NULL)) #else if (__glibc_unlikely (sbcset == NULL)) #endif /* RE_ENABLE_I18N */ { re_free (sbcset); #ifdef RE_ENABLE_I18N re_free (mbcset); #endif *err = REG_ESPACE; return NULL; } token_len = peek_token_bracket (token, regexp, syntax); if (__glibc_unlikely (token->type == END_OF_RE)) { *err = REG_BADPAT; goto parse_bracket_exp_free_return; } if (token->type == OP_NON_MATCH_LIST) { #ifdef RE_ENABLE_I18N mbcset->non_match = 1; #endif /* not RE_ENABLE_I18N */ non_match = true; if (syntax & RE_HAT_LISTS_NOT_NEWLINE) bitset_set (sbcset, '\n'); re_string_skip_bytes (regexp, token_len); /* Skip a token. */ token_len = peek_token_bracket (token, regexp, syntax); if (__glibc_unlikely (token->type == END_OF_RE)) { *err = REG_BADPAT; goto parse_bracket_exp_free_return; } } /* We treat the first ']' as a normal character. */ if (token->type == OP_CLOSE_BRACKET) token->type = CHARACTER; while (1) { bracket_elem_t start_elem, end_elem; unsigned char start_name_buf[BRACKET_NAME_BUF_SIZE]; unsigned char end_name_buf[BRACKET_NAME_BUF_SIZE]; reg_errcode_t ret; int token_len2 = 0; bool is_range_exp = false; re_token_t token2; start_elem.opr.name = start_name_buf; start_elem.type = COLL_SYM; ret = parse_bracket_element (&start_elem, regexp, token, token_len, dfa, syntax, first_round); if (__glibc_unlikely (ret != REG_NOERROR)) { *err = ret; goto parse_bracket_exp_free_return; } first_round = false; /* Get information about the next token. We need it in any case. */ token_len = peek_token_bracket (token, regexp, syntax); /* Do not check for ranges if we know they are not allowed. */ if (start_elem.type != CHAR_CLASS && start_elem.type != EQUIV_CLASS) { if (__glibc_unlikely (token->type == END_OF_RE)) { *err = REG_EBRACK; goto parse_bracket_exp_free_return; } if (token->type == OP_CHARSET_RANGE) { re_string_skip_bytes (regexp, token_len); /* Skip '-'. */ token_len2 = peek_token_bracket (&token2, regexp, syntax); if (__glibc_unlikely (token2.type == END_OF_RE)) { *err = REG_EBRACK; goto parse_bracket_exp_free_return; } if (token2.type == OP_CLOSE_BRACKET) { /* We treat the last '-' as a normal character. */ re_string_skip_bytes (regexp, -token_len); token->type = CHARACTER; } else is_range_exp = true; } } if (is_range_exp == true) { end_elem.opr.name = end_name_buf; end_elem.type = COLL_SYM; ret = parse_bracket_element (&end_elem, regexp, &token2, token_len2, dfa, syntax, true); if (__glibc_unlikely (ret != REG_NOERROR)) { *err = ret; goto parse_bracket_exp_free_return; } token_len = peek_token_bracket (token, regexp, syntax); #ifdef _LIBC *err = build_range_exp (sbcset, mbcset, &range_alloc, &start_elem, &end_elem); #else # ifdef RE_ENABLE_I18N *err = build_range_exp (syntax, sbcset, dfa->mb_cur_max > 1 ? mbcset : NULL, &range_alloc, &start_elem, &end_elem); # else *err = build_range_exp (syntax, sbcset, &start_elem, &end_elem); # endif #endif /* RE_ENABLE_I18N */ if (__glibc_unlikely (*err != REG_NOERROR)) goto parse_bracket_exp_free_return; } else { switch (start_elem.type) { case SB_CHAR: bitset_set (sbcset, start_elem.opr.ch); break; #ifdef RE_ENABLE_I18N case MB_CHAR: /* Check whether the array has enough space. */ if (__glibc_unlikely (mbchar_alloc == mbcset->nmbchars)) { wchar_t *new_mbchars; /* Not enough, realloc it. */ /* +1 in case of mbcset->nmbchars is 0. */ mbchar_alloc = 2 * mbcset->nmbchars + 1; /* Use realloc since array is NULL if *alloc == 0. */ new_mbchars = re_realloc (mbcset->mbchars, wchar_t, mbchar_alloc); if (__glibc_unlikely (new_mbchars == NULL)) goto parse_bracket_exp_espace; mbcset->mbchars = new_mbchars; } mbcset->mbchars[mbcset->nmbchars++] = start_elem.opr.wch; break; #endif /* RE_ENABLE_I18N */ case EQUIV_CLASS: *err = build_equiv_class (sbcset, #ifdef RE_ENABLE_I18N mbcset, &equiv_class_alloc, #endif /* RE_ENABLE_I18N */ start_elem.opr.name); if (__glibc_unlikely (*err != REG_NOERROR)) goto parse_bracket_exp_free_return; break; case COLL_SYM: *err = build_collating_symbol (sbcset, #ifdef RE_ENABLE_I18N mbcset, &coll_sym_alloc, #endif /* RE_ENABLE_I18N */ start_elem.opr.name); if (__glibc_unlikely (*err != REG_NOERROR)) goto parse_bracket_exp_free_return; break; case CHAR_CLASS: *err = build_charclass (regexp->trans, sbcset, #ifdef RE_ENABLE_I18N mbcset, &char_class_alloc, #endif /* RE_ENABLE_I18N */ (const char *) start_elem.opr.name, syntax); if (__glibc_unlikely (*err != REG_NOERROR)) goto parse_bracket_exp_free_return; break; default: DEBUG_ASSERT (false); break; } } if (__glibc_unlikely (token->type == END_OF_RE)) { *err = REG_EBRACK; goto parse_bracket_exp_free_return; } if (token->type == OP_CLOSE_BRACKET) break; } re_string_skip_bytes (regexp, token_len); /* Skip a token. */ /* If it is non-matching list. */ if (non_match) bitset_not (sbcset); #ifdef RE_ENABLE_I18N /* Ensure only single byte characters are set. */ if (dfa->mb_cur_max > 1) bitset_mask (sbcset, dfa->sb_char); if (mbcset->nmbchars || mbcset->ncoll_syms || mbcset->nequiv_classes || mbcset->nranges || (dfa->mb_cur_max > 1 && (mbcset->nchar_classes || mbcset->non_match))) { bin_tree_t *mbc_tree; int sbc_idx; /* Build a tree for complex bracket. */ dfa->has_mb_node = 1; br_token.type = COMPLEX_BRACKET; br_token.opr.mbcset = mbcset; mbc_tree = create_token_tree (dfa, NULL, NULL, &br_token); if (__glibc_unlikely (mbc_tree == NULL)) goto parse_bracket_exp_espace; for (sbc_idx = 0; sbc_idx < BITSET_WORDS; ++sbc_idx) if (sbcset[sbc_idx]) break; /* If there are no bits set in sbcset, there is no point of having both SIMPLE_BRACKET and COMPLEX_BRACKET. */ if (sbc_idx < BITSET_WORDS) { /* Build a tree for simple bracket. */ br_token.type = SIMPLE_BRACKET; br_token.opr.sbcset = sbcset; work_tree = create_token_tree (dfa, NULL, NULL, &br_token); if (__glibc_unlikely (work_tree == NULL)) goto parse_bracket_exp_espace; /* Then join them by ALT node. */ work_tree = create_tree (dfa, work_tree, mbc_tree, OP_ALT); if (__glibc_unlikely (work_tree == NULL)) goto parse_bracket_exp_espace; } else { re_free (sbcset); work_tree = mbc_tree; } } else #endif /* not RE_ENABLE_I18N */ { #ifdef RE_ENABLE_I18N free_charset (mbcset); #endif /* Build a tree for simple bracket. */ br_token.type = SIMPLE_BRACKET; br_token.opr.sbcset = sbcset; work_tree = create_token_tree (dfa, NULL, NULL, &br_token); if (__glibc_unlikely (work_tree == NULL)) goto parse_bracket_exp_espace; } return work_tree; parse_bracket_exp_espace: *err = REG_ESPACE; parse_bracket_exp_free_return: re_free (sbcset); #ifdef RE_ENABLE_I18N free_charset (mbcset); #endif /* RE_ENABLE_I18N */ return NULL; } /* Parse an element in the bracket expression. */ static reg_errcode_t parse_bracket_element (bracket_elem_t *elem, re_string_t *regexp, re_token_t *token, int token_len, re_dfa_t *dfa, reg_syntax_t syntax, bool accept_hyphen) { #ifdef RE_ENABLE_I18N int cur_char_size; cur_char_size = re_string_char_size_at (regexp, re_string_cur_idx (regexp)); if (cur_char_size > 1) { elem->type = MB_CHAR; elem->opr.wch = re_string_wchar_at (regexp, re_string_cur_idx (regexp)); re_string_skip_bytes (regexp, cur_char_size); return REG_NOERROR; } #endif /* RE_ENABLE_I18N */ re_string_skip_bytes (regexp, token_len); /* Skip a token. */ if (token->type == OP_OPEN_COLL_ELEM || token->type == OP_OPEN_CHAR_CLASS || token->type == OP_OPEN_EQUIV_CLASS) return parse_bracket_symbol (elem, regexp, token); if (__glibc_unlikely (token->type == OP_CHARSET_RANGE) && !accept_hyphen) { /* A '-' must only appear as anything but a range indicator before the closing bracket. Everything else is an error. */ re_token_t token2; (void) peek_token_bracket (&token2, regexp, syntax); if (token2.type != OP_CLOSE_BRACKET) /* The actual error value is not standardized since this whole case is undefined. But ERANGE makes good sense. */ return REG_ERANGE; } elem->type = SB_CHAR; elem->opr.ch = token->opr.c; return REG_NOERROR; } /* Parse a bracket symbol in the bracket expression. Bracket symbols are such as [::], [..], and [==]. */ static reg_errcode_t parse_bracket_symbol (bracket_elem_t *elem, re_string_t *regexp, re_token_t *token) { unsigned char ch, delim = token->opr.c; int i = 0; if (re_string_eoi(regexp)) return REG_EBRACK; for (;; ++i) { if (i >= BRACKET_NAME_BUF_SIZE) return REG_EBRACK; if (token->type == OP_OPEN_CHAR_CLASS) ch = re_string_fetch_byte_case (regexp); else ch = re_string_fetch_byte (regexp); if (re_string_eoi(regexp)) return REG_EBRACK; if (ch == delim && re_string_peek_byte (regexp, 0) == ']') break; elem->opr.name[i] = ch; } re_string_skip_bytes (regexp, 1); elem->opr.name[i] = '\0'; switch (token->type) { case OP_OPEN_COLL_ELEM: elem->type = COLL_SYM; break; case OP_OPEN_EQUIV_CLASS: elem->type = EQUIV_CLASS; break; case OP_OPEN_CHAR_CLASS: elem->type = CHAR_CLASS; break; default: break; } return REG_NOERROR; } /* Helper function for parse_bracket_exp. Build the equivalence class which is represented by NAME. The result are written to MBCSET and SBCSET. EQUIV_CLASS_ALLOC is the allocated size of mbcset->equiv_classes, is a pointer argument since we may update it. */ static reg_errcode_t #ifdef RE_ENABLE_I18N build_equiv_class (bitset_t sbcset, re_charset_t *mbcset, Idx *equiv_class_alloc, const unsigned char *name) #else /* not RE_ENABLE_I18N */ build_equiv_class (bitset_t sbcset, const unsigned char *name) #endif /* not RE_ENABLE_I18N */ { #ifdef _LIBC uint32_t nrules = _NL_CURRENT_WORD (LC_COLLATE, _NL_COLLATE_NRULES); if (nrules != 0) { const int32_t *table, *indirect; const unsigned char *weights, *extra, *cp; unsigned char char_buf[2]; int32_t idx1, idx2; unsigned int ch; size_t len; /* Calculate the index for equivalence class. */ cp = name; table = (const int32_t *) _NL_CURRENT (LC_COLLATE, _NL_COLLATE_TABLEMB); weights = (const unsigned char *) _NL_CURRENT (LC_COLLATE, _NL_COLLATE_WEIGHTMB); extra = (const unsigned char *) _NL_CURRENT (LC_COLLATE, _NL_COLLATE_EXTRAMB); indirect = (const int32_t *) _NL_CURRENT (LC_COLLATE, _NL_COLLATE_INDIRECTMB); idx1 = findidx (table, indirect, extra, &cp, -1); if (__glibc_unlikely (idx1 == 0 || *cp != '\0')) /* This isn't a valid character. */ return REG_ECOLLATE; /* Build single byte matching table for this equivalence class. */ len = weights[idx1 & 0xffffff]; for (ch = 0; ch < SBC_MAX; ++ch) { char_buf[0] = ch; cp = char_buf; idx2 = findidx (table, indirect, extra, &cp, 1); /* idx2 = table[ch]; */ if (idx2 == 0) /* This isn't a valid character. */ continue; /* Compare only if the length matches and the collation rule index is the same. */ if (len == weights[idx2 & 0xffffff] && (idx1 >> 24) == (idx2 >> 24) && memcmp (weights + (idx1 & 0xffffff) + 1, weights + (idx2 & 0xffffff) + 1, len) == 0) bitset_set (sbcset, ch); } /* Check whether the array has enough space. */ if (__glibc_unlikely (*equiv_class_alloc == mbcset->nequiv_classes)) { /* Not enough, realloc it. */ /* +1 in case of mbcset->nequiv_classes is 0. */ Idx new_equiv_class_alloc = 2 * mbcset->nequiv_classes + 1; /* Use realloc since the array is NULL if *alloc == 0. */ int32_t *new_equiv_classes = re_realloc (mbcset->equiv_classes, int32_t, new_equiv_class_alloc); if (__glibc_unlikely (new_equiv_classes == NULL)) return REG_ESPACE; mbcset->equiv_classes = new_equiv_classes; *equiv_class_alloc = new_equiv_class_alloc; } mbcset->equiv_classes[mbcset->nequiv_classes++] = idx1; } else #endif /* _LIBC */ { if (__glibc_unlikely (strlen ((const char *) name) != 1)) return REG_ECOLLATE; bitset_set (sbcset, *name); } return REG_NOERROR; } /* Helper function for parse_bracket_exp. Build the character class which is represented by NAME. The result are written to MBCSET and SBCSET. CHAR_CLASS_ALLOC is the allocated size of mbcset->char_classes, is a pointer argument since we may update it. */ static reg_errcode_t #ifdef RE_ENABLE_I18N build_charclass (RE_TRANSLATE_TYPE trans, bitset_t sbcset, re_charset_t *mbcset, Idx *char_class_alloc, const char *class_name, reg_syntax_t syntax) #else /* not RE_ENABLE_I18N */ build_charclass (RE_TRANSLATE_TYPE trans, bitset_t sbcset, const char *class_name, reg_syntax_t syntax) #endif /* not RE_ENABLE_I18N */ { int i; const char *name = class_name; /* In case of REG_ICASE "upper" and "lower" match the both of upper and lower cases. */ if ((syntax & RE_ICASE) && (strcmp (name, "upper") == 0 || strcmp (name, "lower") == 0)) name = "alpha"; #ifdef RE_ENABLE_I18N /* Check the space of the arrays. */ if (__glibc_unlikely (*char_class_alloc == mbcset->nchar_classes)) { /* Not enough, realloc it. */ /* +1 in case of mbcset->nchar_classes is 0. */ Idx new_char_class_alloc = 2 * mbcset->nchar_classes + 1; /* Use realloc since array is NULL if *alloc == 0. */ wctype_t *new_char_classes = re_realloc (mbcset->char_classes, wctype_t, new_char_class_alloc); if (__glibc_unlikely (new_char_classes == NULL)) return REG_ESPACE; mbcset->char_classes = new_char_classes; *char_class_alloc = new_char_class_alloc; } mbcset->char_classes[mbcset->nchar_classes++] = __wctype (name); #endif /* RE_ENABLE_I18N */ #define BUILD_CHARCLASS_LOOP(ctype_func) \ do { \ if (__glibc_unlikely (trans != NULL)) \ { \ for (i = 0; i < SBC_MAX; ++i) \ if (ctype_func (i)) \ bitset_set (sbcset, trans[i]); \ } \ else \ { \ for (i = 0; i < SBC_MAX; ++i) \ if (ctype_func (i)) \ bitset_set (sbcset, i); \ } \ } while (0) if (strcmp (name, "alnum") == 0) BUILD_CHARCLASS_LOOP (isalnum); else if (strcmp (name, "cntrl") == 0) BUILD_CHARCLASS_LOOP (iscntrl); else if (strcmp (name, "lower") == 0) BUILD_CHARCLASS_LOOP (islower); else if (strcmp (name, "space") == 0) BUILD_CHARCLASS_LOOP (isspace); else if (strcmp (name, "alpha") == 0) BUILD_CHARCLASS_LOOP (isalpha); else if (strcmp (name, "digit") == 0) BUILD_CHARCLASS_LOOP (isdigit); else if (strcmp (name, "print") == 0) BUILD_CHARCLASS_LOOP (isprint); else if (strcmp (name, "upper") == 0) BUILD_CHARCLASS_LOOP (isupper); else if (strcmp (name, "blank") == 0) BUILD_CHARCLASS_LOOP (isblank); else if (strcmp (name, "graph") == 0) BUILD_CHARCLASS_LOOP (isgraph); else if (strcmp (name, "punct") == 0) BUILD_CHARCLASS_LOOP (ispunct); else if (strcmp (name, "xdigit") == 0) BUILD_CHARCLASS_LOOP (isxdigit); else return REG_ECTYPE; return REG_NOERROR; } static bin_tree_t * build_charclass_op (re_dfa_t *dfa, RE_TRANSLATE_TYPE trans, const char *class_name, const char *extra, bool non_match, reg_errcode_t *err) { re_bitset_ptr_t sbcset; #ifdef RE_ENABLE_I18N re_charset_t *mbcset; Idx alloc = 0; #endif /* not RE_ENABLE_I18N */ reg_errcode_t ret; bin_tree_t *tree; sbcset = (re_bitset_ptr_t) calloc (sizeof (bitset_t), 1); if (__glibc_unlikely (sbcset == NULL)) { *err = REG_ESPACE; return NULL; } #ifdef RE_ENABLE_I18N mbcset = (re_charset_t *) calloc (sizeof (re_charset_t), 1); if (__glibc_unlikely (mbcset == NULL)) { re_free (sbcset); *err = REG_ESPACE; return NULL; } mbcset->non_match = non_match; #endif /* RE_ENABLE_I18N */ /* We don't care the syntax in this case. */ ret = build_charclass (trans, sbcset, #ifdef RE_ENABLE_I18N mbcset, &alloc, #endif /* RE_ENABLE_I18N */ class_name, 0); if (__glibc_unlikely (ret != REG_NOERROR)) { re_free (sbcset); #ifdef RE_ENABLE_I18N free_charset (mbcset); #endif /* RE_ENABLE_I18N */ *err = ret; return NULL; } /* \w match '_' also. */ for (; *extra; extra++) bitset_set (sbcset, *extra); /* If it is non-matching list. */ if (non_match) bitset_not (sbcset); #ifdef RE_ENABLE_I18N /* Ensure only single byte characters are set. */ if (dfa->mb_cur_max > 1) bitset_mask (sbcset, dfa->sb_char); #endif /* Build a tree for simple bracket. */ re_token_t br_token = { .type = SIMPLE_BRACKET, .opr.sbcset = sbcset }; tree = create_token_tree (dfa, NULL, NULL, &br_token); if (__glibc_unlikely (tree == NULL)) goto build_word_op_espace; #ifdef RE_ENABLE_I18N if (dfa->mb_cur_max > 1) { bin_tree_t *mbc_tree; /* Build a tree for complex bracket. */ br_token.type = COMPLEX_BRACKET; br_token.opr.mbcset = mbcset; dfa->has_mb_node = 1; mbc_tree = create_token_tree (dfa, NULL, NULL, &br_token); if (__glibc_unlikely (mbc_tree == NULL)) goto build_word_op_espace; /* Then join them by ALT node. */ tree = create_tree (dfa, tree, mbc_tree, OP_ALT); if (__glibc_likely (mbc_tree != NULL)) return tree; } else { free_charset (mbcset); return tree; } #else /* not RE_ENABLE_I18N */ return tree; #endif /* not RE_ENABLE_I18N */ build_word_op_espace: re_free (sbcset); #ifdef RE_ENABLE_I18N free_charset (mbcset); #endif /* RE_ENABLE_I18N */ *err = REG_ESPACE; return NULL; } /* This is intended for the expressions like "a{1,3}". Fetch a number from 'input', and return the number. Return -1 if the number field is empty like "{,1}". Return RE_DUP_MAX + 1 if the number field is too large. Return -2 if an error occurred. */ static Idx fetch_number (re_string_t *input, re_token_t *token, reg_syntax_t syntax) { Idx num = -1; unsigned char c; while (1) { fetch_token (token, input, syntax); c = token->opr.c; if (__glibc_unlikely (token->type == END_OF_RE)) return -2; if (token->type == OP_CLOSE_DUP_NUM || c == ',') break; num = ((token->type != CHARACTER || c < '0' || '9' < c || num == -2) ? -2 : num == -1 ? c - '0' : MIN (RE_DUP_MAX + 1, num * 10 + c - '0')); } return num; } #ifdef RE_ENABLE_I18N static void free_charset (re_charset_t *cset) { re_free (cset->mbchars); # ifdef _LIBC re_free (cset->coll_syms); re_free (cset->equiv_classes); # endif re_free (cset->range_starts); re_free (cset->range_ends); re_free (cset->char_classes); re_free (cset); } #endif /* RE_ENABLE_I18N */ /* Functions for binary tree operation. */ /* Create a tree node. */ static bin_tree_t * create_tree (re_dfa_t *dfa, bin_tree_t *left, bin_tree_t *right, re_token_type_t type) { re_token_t t = { .type = type }; return create_token_tree (dfa, left, right, &t); } static bin_tree_t * create_token_tree (re_dfa_t *dfa, bin_tree_t *left, bin_tree_t *right, const re_token_t *token) { bin_tree_t *tree; if (__glibc_unlikely (dfa->str_tree_storage_idx == BIN_TREE_STORAGE_SIZE)) { bin_tree_storage_t *storage = re_malloc (bin_tree_storage_t, 1); if (storage == NULL) return NULL; storage->next = dfa->str_tree_storage; dfa->str_tree_storage = storage; dfa->str_tree_storage_idx = 0; } tree = &dfa->str_tree_storage->data[dfa->str_tree_storage_idx++]; tree->parent = NULL; tree->left = left; tree->right = right; tree->token = *token; tree->token.duplicated = 0; tree->token.opt_subexp = 0; tree->first = NULL; tree->next = NULL; tree->node_idx = -1; if (left != NULL) left->parent = tree; if (right != NULL) right->parent = tree; return tree; } /* Mark the tree SRC as an optional subexpression. To be called from preorder or postorder. */ static reg_errcode_t mark_opt_subexp (void *extra, bin_tree_t *node) { Idx idx = (uintptr_t) extra; if (node->token.type == SUBEXP && node->token.opr.idx == idx) node->token.opt_subexp = 1; return REG_NOERROR; } /* Free the allocated memory inside NODE. */ static void free_token (re_token_t *node) { #ifdef RE_ENABLE_I18N if (node->type == COMPLEX_BRACKET && node->duplicated == 0) free_charset (node->opr.mbcset); else #endif /* RE_ENABLE_I18N */ if (node->type == SIMPLE_BRACKET && node->duplicated == 0) re_free (node->opr.sbcset); } /* Worker function for tree walking. Free the allocated memory inside NODE and its children. */ static reg_errcode_t free_tree (void *extra, bin_tree_t *node) { free_token (&node->token); return REG_NOERROR; } /* Duplicate the node SRC, and return new node. This is a preorder visit similar to the one implemented by the generic visitor, but we need more infrastructure to maintain two parallel trees --- so, it's easier to duplicate. */ static bin_tree_t * duplicate_tree (const bin_tree_t *root, re_dfa_t *dfa) { const bin_tree_t *node; bin_tree_t *dup_root; bin_tree_t **p_new = &dup_root, *dup_node = root->parent; for (node = root; ; ) { /* Create a new tree and link it back to the current parent. */ *p_new = create_token_tree (dfa, NULL, NULL, &node->token); if (*p_new == NULL) return NULL; (*p_new)->parent = dup_node; (*p_new)->token.duplicated = 1; dup_node = *p_new; /* Go to the left node, or up and to the right. */ if (node->left) { node = node->left; p_new = &dup_node->left; } else { const bin_tree_t *prev = NULL; while (node->right == prev || node->right == NULL) { prev = node; node = node->parent; dup_node = dup_node->parent; if (!node) return dup_root; } node = node->right; p_new = &dup_node->right; } } } pspp-1.4.1/gl/memcasecmp.c0000644000175000017500000000264613723215637015014 0ustar00blpblp00000000000000/* Case-insensitive buffer comparator. Copyright (C) 1996-1997, 2000, 2003, 2006, 2009-2020 Free Software Foundation, Inc. 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 3 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, see . */ /* Written by Jim Meyering. */ #include #include "memcasecmp.h" #include #include /* Like memcmp, but ignore differences in case. Convert to upper case (not lower) before comparing so that join -i works with sort -f. */ int memcasecmp (const void *vs1, const void *vs2, size_t n) { size_t i; char const *s1 = vs1; char const *s2 = vs2; for (i = 0; i < n; i++) { unsigned char u1 = s1[i]; unsigned char u2 = s2[i]; int U1 = toupper (u1); int U2 = toupper (u2); int diff = (UCHAR_MAX <= INT_MAX ? U1 - U2 : _GL_CMP (U1, U2)); if (diff) return diff; } return 0; } pspp-1.4.1/gl/stdbool.in.h0000644000175000017500000001175013723215640014750 0ustar00blpblp00000000000000/* Copyright (C) 2001-2003, 2006-2020 Free Software Foundation, Inc. Written by Bruno Haible , 2001. 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 3, 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, see . */ #ifndef _GL_STDBOOL_H #define _GL_STDBOOL_H /* ISO C 99 for platforms that lack it. */ /* Usage suggestions: Programs that use should be aware of some limitations and standards compliance issues. Standards compliance: - must be #included before 'bool', 'false', 'true' can be used. - You cannot assume that sizeof (bool) == 1. - Programs should not undefine the macros bool, true, and false, as C99 lists that as an "obsolescent feature". Limitations of this substitute, when used in a C89 environment: - must be #included before the '_Bool' type can be used. - You cannot assume that _Bool is a typedef; it might be a macro. - Bit-fields of type 'bool' are not supported. Portable code should use 'unsigned int foo : 1;' rather than 'bool foo : 1;'. - In C99, casts and automatic conversions to '_Bool' or 'bool' are performed in such a way that every nonzero value gets converted to 'true', and zero gets converted to 'false'. This doesn't work with this substitute. With this substitute, only the values 0 and 1 give the expected result when converted to _Bool' or 'bool'. - C99 allows the use of (_Bool)0.0 in constant expressions, but this substitute cannot always provide this property. Also, it is suggested that programs use 'bool' rather than '_Bool'; this isn't required, but 'bool' is more common. */ /* 7.16. Boolean type and values */ /* BeOS already #defines false 0, true 1. We use the same definitions below, but temporarily we have to #undef them. */ #if defined __BEOS__ && !defined __HAIKU__ # include /* defines bool but not _Bool */ # undef false # undef true #endif #ifdef __cplusplus # define _Bool bool # define bool bool #else # if defined __BEOS__ && !defined __HAIKU__ /* A compiler known to have 'bool'. */ /* If the compiler already has both 'bool' and '_Bool', we can assume they are the same types. */ # if !@HAVE__BOOL@ typedef bool _Bool; # endif # else # if !defined __GNUC__ /* If @HAVE__BOOL@: Some HP-UX cc and AIX IBM C compiler versions have compiler bugs when the built-in _Bool type is used. See https://gcc.gnu.org/ml/gcc-patches/2003-12/msg02303.html https://lists.gnu.org/r/bug-coreutils/2005-11/msg00161.html https://lists.gnu.org/r/bug-coreutils/2005-10/msg00086.html Similar bugs are likely with other compilers as well; this file wouldn't be used if was working. So we override the _Bool type. If !@HAVE__BOOL@: Need to define _Bool ourselves. As 'signed char' or as an enum type? Use of a typedef, with SunPRO C, leads to a stupid "warning: _Bool is a keyword in ISO C99". Use of an enum type, with IRIX cc, leads to a stupid "warning(1185): enumerated type mixed with another type". Even the existence of an enum type, without a typedef, "Invalid enumerator. (badenum)" with HP-UX cc on Tru64. The only benefit of the enum, debuggability, is not important with these compilers. So use 'signed char' and no enum. */ # define _Bool signed char # else /* With this compiler, trust the _Bool type if the compiler has it. */ # if !@HAVE__BOOL@ /* For the sake of symbolic names in gdb, define true and false as enum constants, not only as macros. It is tempting to write typedef enum { false = 0, true = 1 } _Bool; so that gdb prints values of type 'bool' symbolically. But then values of type '_Bool' might promote to 'int' or 'unsigned int' (see ISO C 99 6.7.2.2.(4)); however, '_Bool' must promote to 'int' (see ISO C 99 6.3.1.1.(2)). So add a negative value to the enum; this ensures that '_Bool' promotes to 'int'. */ typedef enum { _Bool_must_promote_to_int = -1, false = 0, true = 1 } _Bool; # endif # endif # endif # define bool _Bool #endif /* The other macros must be usable in preprocessor directives. */ #ifdef __cplusplus # define false false # define true true #else # define false 0 # define true 1 #endif #define __bool_true_false_are_defined 1 #endif /* _GL_STDBOOL_H */ pspp-1.4.1/gl/canonicalize-lgpl.c0000644000175000017500000002767213723215636016302 0ustar00blpblp00000000000000/* Return the canonical absolute name of a given file. Copyright (C) 1996-2020 Free Software Foundation, Inc. This file is part of the GNU C Library. 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 3 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, see . */ #ifndef _LIBC /* Don't use __attribute__ __nonnull__ in this compilation unit. Otherwise gcc optimizes away the name == NULL test below. */ # define _GL_ARG_NONNULL(params) # define _GL_USE_STDLIB_ALLOC 1 # include #endif #if !HAVE_CANONICALIZE_FILE_NAME || !FUNC_REALPATH_WORKS || defined _LIBC /* Specification. */ #include #include #include #include #include #if HAVE_SYS_PARAM_H || defined _LIBC # include #endif #include #include #include #ifdef _LIBC # include #else # define SHLIB_COMPAT(lib, introduced, obsoleted) 0 # define versioned_symbol(lib, local, symbol, version) extern int dummy # define compat_symbol(lib, local, symbol, version) # define weak_alias(local, symbol) # define __canonicalize_file_name canonicalize_file_name # define __realpath realpath # include "pathmax.h" # include "malloca.h" # include "filename.h" # if HAVE_GETCWD # if IN_RELOCWRAPPER /* When building the relocatable program wrapper, use the system's getcwd function, not the gnulib override, otherwise we would get a link error. */ # undef getcwd # endif # if defined VMS && !defined getcwd /* We want the directory in Unix syntax, not in VMS syntax. The gnulib override of 'getcwd' takes 2 arguments; the original VMS 'getcwd' takes 3 arguments. */ # define __getcwd(buf, max) getcwd (buf, max, 0) # else # define __getcwd getcwd # endif # else # define __getcwd(buf, max) getwd (buf) # endif # define __readlink readlink # define __set_errno(e) errno = (e) # ifndef MAXSYMLINKS # ifdef SYMLOOP_MAX # define MAXSYMLINKS SYMLOOP_MAX # else # define MAXSYMLINKS 20 # endif # endif #endif #ifndef DOUBLE_SLASH_IS_DISTINCT_ROOT # define DOUBLE_SLASH_IS_DISTINCT_ROOT 0 #endif /* Define this independently so that stdint.h is not a prerequisite. */ #ifndef SIZE_MAX # define SIZE_MAX ((size_t) -1) #endif #if !FUNC_REALPATH_WORKS || defined _LIBC static void alloc_failed (void) { #if defined _WIN32 && ! defined __CYGWIN__ /* Avoid errno problem without using the malloc or realloc modules; see: https://lists.gnu.org/r/bug-gnulib/2016-08/msg00025.html */ errno = ENOMEM; #endif } /* Return the canonical absolute name of file NAME. A canonical name does not contain any ".", ".." components nor any repeated path separators ('/') or symlinks. All path components must exist. If RESOLVED is null, the result is malloc'd; otherwise, if the canonical name is PATH_MAX chars or more, returns null with 'errno' set to ENAMETOOLONG; if the name fits in fewer than PATH_MAX chars, returns the name in RESOLVED. If the name cannot be resolved and RESOLVED is non-NULL, it contains the path of the first component that cannot be resolved. If the path can be resolved, RESOLVED holds the same value as the value returned. */ char * __realpath (const char *name, char *resolved) { char *rpath, *dest, *extra_buf = NULL; const char *start, *end, *rpath_limit; long int path_max; int num_links = 0; size_t prefix_len; if (name == NULL) { /* As per Single Unix Specification V2 we must return an error if either parameter is a null pointer. We extend this to allow the RESOLVED parameter to be NULL in case the we are expected to allocate the room for the return value. */ __set_errno (EINVAL); return NULL; } if (name[0] == '\0') { /* As per Single Unix Specification V2 we must return an error if the name argument points to an empty string. */ __set_errno (ENOENT); return NULL; } #ifdef PATH_MAX path_max = PATH_MAX; #else path_max = pathconf (name, _PC_PATH_MAX); if (path_max <= 0) path_max = 8192; #endif if (resolved == NULL) { rpath = malloc (path_max); if (rpath == NULL) { alloc_failed (); return NULL; } } else rpath = resolved; rpath_limit = rpath + path_max; /* This is always zero for Posix hosts, but can be 2 for MS-Windows and MS-DOS X:/foo/bar file names. */ prefix_len = FILE_SYSTEM_PREFIX_LEN (name); if (!IS_ABSOLUTE_FILE_NAME (name)) { if (!__getcwd (rpath, path_max)) { rpath[0] = '\0'; goto error; } dest = strchr (rpath, '\0'); start = name; prefix_len = FILE_SYSTEM_PREFIX_LEN (rpath); } else { dest = rpath; if (prefix_len) { memcpy (rpath, name, prefix_len); dest += prefix_len; } *dest++ = '/'; if (DOUBLE_SLASH_IS_DISTINCT_ROOT) { if (ISSLASH (name[1]) && !ISSLASH (name[2]) && !prefix_len) *dest++ = '/'; *dest = '\0'; } start = name + prefix_len; } for (end = start; *start; start = end) { #ifdef _LIBC struct stat64 st; #else struct stat st; #endif /* Skip sequence of multiple path-separators. */ while (ISSLASH (*start)) ++start; /* Find end of path component. */ for (end = start; *end && !ISSLASH (*end); ++end) /* Nothing. */; if (end - start == 0) break; else if (end - start == 1 && start[0] == '.') /* nothing */; else if (end - start == 2 && start[0] == '.' && start[1] == '.') { /* Back up to previous component, ignore if at root already. */ if (dest > rpath + prefix_len + 1) for (--dest; dest > rpath && !ISSLASH (dest[-1]); --dest) continue; if (DOUBLE_SLASH_IS_DISTINCT_ROOT && dest == rpath + 1 && !prefix_len && ISSLASH (*dest) && !ISSLASH (dest[1])) dest++; } else { size_t new_size; if (!ISSLASH (dest[-1])) *dest++ = '/'; if (dest + (end - start) >= rpath_limit) { ptrdiff_t dest_offset = dest - rpath; char *new_rpath; if (resolved) { __set_errno (ENAMETOOLONG); if (dest > rpath + prefix_len + 1) dest--; *dest = '\0'; goto error; } new_size = rpath_limit - rpath; if (end - start + 1 > path_max) new_size += end - start + 1; else new_size += path_max; new_rpath = (char *) realloc (rpath, new_size); if (new_rpath == NULL) { alloc_failed (); goto error; } rpath = new_rpath; rpath_limit = rpath + new_size; dest = rpath + dest_offset; } #ifdef _LIBC dest = __mempcpy (dest, start, end - start); #else memcpy (dest, start, end - start); dest += end - start; #endif *dest = '\0'; /* FIXME: if lstat fails with errno == EOVERFLOW, the entry exists. */ #ifdef _LIBC if (__lxstat64 (_STAT_VER, rpath, &st) < 0) #else if (lstat (rpath, &st) < 0) #endif goto error; if (S_ISLNK (st.st_mode)) { char *buf; size_t len; ssize_t n; if (++num_links > MAXSYMLINKS) { __set_errno (ELOOP); goto error; } buf = malloca (path_max); if (!buf) { __set_errno (ENOMEM); goto error; } n = __readlink (rpath, buf, path_max - 1); if (n < 0) { int saved_errno = errno; freea (buf); __set_errno (saved_errno); goto error; } buf[n] = '\0'; if (!extra_buf) { extra_buf = malloca (path_max); if (!extra_buf) { freea (buf); __set_errno (ENOMEM); goto error; } } len = strlen (end); /* Check that n + len + 1 doesn't overflow and is <= path_max. */ if (n >= SIZE_MAX - len || n + len >= path_max) { freea (buf); __set_errno (ENAMETOOLONG); goto error; } /* Careful here, end may be a pointer into extra_buf... */ memmove (&extra_buf[n], end, len + 1); name = end = memcpy (extra_buf, buf, n); if (IS_ABSOLUTE_FILE_NAME (buf)) { size_t pfxlen = FILE_SYSTEM_PREFIX_LEN (buf); if (pfxlen) memcpy (rpath, buf, pfxlen); dest = rpath + pfxlen; *dest++ = '/'; /* It's an absolute symlink */ if (DOUBLE_SLASH_IS_DISTINCT_ROOT) { if (ISSLASH (buf[1]) && !ISSLASH (buf[2]) && !pfxlen) *dest++ = '/'; *dest = '\0'; } /* Install the new prefix to be in effect hereafter. */ prefix_len = pfxlen; } else { /* Back up to previous component, ignore if at root already: */ if (dest > rpath + prefix_len + 1) for (--dest; dest > rpath && !ISSLASH (dest[-1]); --dest) continue; if (DOUBLE_SLASH_IS_DISTINCT_ROOT && dest == rpath + 1 && ISSLASH (*dest) && !ISSLASH (dest[1]) && !prefix_len) dest++; } } else if (!S_ISDIR (st.st_mode) && *end != '\0') { __set_errno (ENOTDIR); goto error; } } } if (dest > rpath + prefix_len + 1 && ISSLASH (dest[-1])) --dest; if (DOUBLE_SLASH_IS_DISTINCT_ROOT && dest == rpath + 1 && !prefix_len && ISSLASH (*dest) && !ISSLASH (dest[1])) dest++; *dest = '\0'; if (extra_buf) freea (extra_buf); return rpath; error: { int saved_errno = errno; if (extra_buf) freea (extra_buf); if (resolved == NULL) free (rpath); __set_errno (saved_errno); } return NULL; } versioned_symbol (libc, __realpath, realpath, GLIBC_2_3); #endif /* !FUNC_REALPATH_WORKS || defined _LIBC */ #if SHLIB_COMPAT(libc, GLIBC_2_0, GLIBC_2_3) char * attribute_compat_text_section __old_realpath (const char *name, char *resolved) { if (resolved == NULL) { __set_errno (EINVAL); return NULL; } return __realpath (name, resolved); } compat_symbol (libc, __old_realpath, realpath, GLIBC_2_0); #endif char * __canonicalize_file_name (const char *name) { return __realpath (name, NULL); } weak_alias (__canonicalize_file_name, canonicalize_file_name) #else /* This declaration is solely to ensure that after preprocessing this file is never empty. */ typedef int dummy; #endif pspp-1.4.1/gl/tempname.h0000644000175000017500000000527213723215640014505 0ustar00blpblp00000000000000/* Create a temporary file or directory. Copyright (C) 2006, 2009-2020 Free Software Foundation, Inc. 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 3 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, see . */ /* header written by Eric Blake */ #ifndef GL_TEMPNAME_H # define GL_TEMPNAME_H # include # ifdef __GT_FILE # define GT_FILE __GT_FILE # define GT_DIR __GT_DIR # define GT_NOCREATE __GT_NOCREATE # else # define GT_FILE 0 # define GT_DIR 1 # define GT_NOCREATE 2 # endif #ifdef __cplusplus extern "C" { #endif /* Generate a temporary file name based on TMPL. TMPL must match the rules for mk[s]temp (i.e. end in "XXXXXX", possibly with a suffix). The name constructed does not exist at the time of the call to gen_tempname. TMPL is overwritten with the result. KIND may be one of: GT_NOCREATE: simply verify that the name does not exist at the time of the call. GT_FILE: create a large file using open(O_CREAT|O_EXCL) and return a read-write fd. The file is mode 0600. GT_DIR: create a directory, which will be mode 0700. We use a clever algorithm to get hard-to-predict names. */ extern int gen_tempname (char *tmpl, int suffixlen, int flags, int kind); /* Similar, except X_SUFFIX_LEN gives the number of Xs. */ extern int gen_tempname_len (char *tmpl, int suffixlen, int flags, int kind, size_t x_suffix_len); /* Similar to gen_tempname, but TRYFUNC is called for each temporary name to try. If TRYFUNC returns a non-negative number, TRY_GEN_TEMPNAME returns with this value. Otherwise, if errno is set to EEXIST, another name is tried, or else TRY_GEN_TEMPNAME returns -1. */ extern int try_tempname (char *tmpl, int suffixlen, void *args, int (*tryfunc) (char *, void *)); /* Similar, except X_SUFFIX_LEN gives the number of Xs. */ extern int try_tempname_len (char *tmpl, int suffixlen, void *args, int (*tryfunc) (char *, void *), size_t x_suffix_len); #ifdef __cplusplus } #endif #endif /* GL_TEMPNAME_H */ pspp-1.4.1/gl/c++defs.h0000644000175000017500000003401413723215636014112 0ustar00blpblp00000000000000/* C++ compatible function declaration macros. Copyright (C) 2010-2020 Free Software Foundation, Inc. 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 3 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, see . */ #ifndef _GL_CXXDEFS_H #define _GL_CXXDEFS_H /* Begin/end the GNULIB_NAMESPACE namespace. */ #if defined __cplusplus && defined GNULIB_NAMESPACE # define _GL_BEGIN_NAMESPACE namespace GNULIB_NAMESPACE { # define _GL_END_NAMESPACE } #else # define _GL_BEGIN_NAMESPACE # define _GL_END_NAMESPACE #endif /* The three most frequent use cases of these macros are: * For providing a substitute for a function that is missing on some platforms, but is declared and works fine on the platforms on which it exists: #if @GNULIB_FOO@ # if !@HAVE_FOO@ _GL_FUNCDECL_SYS (foo, ...); # endif _GL_CXXALIAS_SYS (foo, ...); _GL_CXXALIASWARN (foo); #elif defined GNULIB_POSIXCHECK ... #endif * For providing a replacement for a function that exists on all platforms, but is broken/insufficient and needs to be replaced on some platforms: #if @GNULIB_FOO@ # if @REPLACE_FOO@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef foo # define foo rpl_foo # endif _GL_FUNCDECL_RPL (foo, ...); _GL_CXXALIAS_RPL (foo, ...); # else _GL_CXXALIAS_SYS (foo, ...); # endif _GL_CXXALIASWARN (foo); #elif defined GNULIB_POSIXCHECK ... #endif * For providing a replacement for a function that exists on some platforms but is broken/insufficient and needs to be replaced on some of them and is additionally either missing or undeclared on some other platforms: #if @GNULIB_FOO@ # if @REPLACE_FOO@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef foo # define foo rpl_foo # endif _GL_FUNCDECL_RPL (foo, ...); _GL_CXXALIAS_RPL (foo, ...); # else # if !@HAVE_FOO@ or if !@HAVE_DECL_FOO@ _GL_FUNCDECL_SYS (foo, ...); # endif _GL_CXXALIAS_SYS (foo, ...); # endif _GL_CXXALIASWARN (foo); #elif defined GNULIB_POSIXCHECK ... #endif */ /* _GL_EXTERN_C declaration; performs the declaration with C linkage. */ #if defined __cplusplus # define _GL_EXTERN_C extern "C" #else # define _GL_EXTERN_C extern #endif /* _GL_FUNCDECL_RPL (func, rettype, parameters_and_attributes); declares a replacement function, named rpl_func, with the given prototype, consisting of return type, parameters, and attributes. Example: _GL_FUNCDECL_RPL (open, int, (const char *filename, int flags, ...) _GL_ARG_NONNULL ((1))); */ #define _GL_FUNCDECL_RPL(func,rettype,parameters_and_attributes) \ _GL_FUNCDECL_RPL_1 (rpl_##func, rettype, parameters_and_attributes) #define _GL_FUNCDECL_RPL_1(rpl_func,rettype,parameters_and_attributes) \ _GL_EXTERN_C rettype rpl_func parameters_and_attributes /* _GL_FUNCDECL_SYS (func, rettype, parameters_and_attributes); declares the system function, named func, with the given prototype, consisting of return type, parameters, and attributes. Example: _GL_FUNCDECL_SYS (open, int, (const char *filename, int flags, ...) _GL_ARG_NONNULL ((1))); */ #define _GL_FUNCDECL_SYS(func,rettype,parameters_and_attributes) \ _GL_EXTERN_C rettype func parameters_and_attributes /* _GL_CXXALIAS_RPL (func, rettype, parameters); declares a C++ alias called GNULIB_NAMESPACE::func that redirects to rpl_func, if GNULIB_NAMESPACE is defined. Example: _GL_CXXALIAS_RPL (open, int, (const char *filename, int flags, ...)); Wrapping rpl_func in an object with an inline conversion operator avoids a reference to rpl_func unless GNULIB_NAMESPACE::func is actually used in the program. */ #define _GL_CXXALIAS_RPL(func,rettype,parameters) \ _GL_CXXALIAS_RPL_1 (func, rpl_##func, rettype, parameters) #if defined __cplusplus && defined GNULIB_NAMESPACE # define _GL_CXXALIAS_RPL_1(func,rpl_func,rettype,parameters) \ namespace GNULIB_NAMESPACE \ { \ static const struct _gl_ ## func ## _wrapper \ { \ typedef rettype (*type) parameters; \ \ inline operator type () const \ { \ return ::rpl_func; \ } \ } func = {}; \ } \ _GL_EXTERN_C int _gl_cxxalias_dummy #else # define _GL_CXXALIAS_RPL_1(func,rpl_func,rettype,parameters) \ _GL_EXTERN_C int _gl_cxxalias_dummy #endif /* _GL_CXXALIAS_RPL_CAST_1 (func, rpl_func, rettype, parameters); is like _GL_CXXALIAS_RPL_1 (func, rpl_func, rettype, parameters); except that the C function rpl_func may have a slightly different declaration. A cast is used to silence the "invalid conversion" error that would otherwise occur. */ #if defined __cplusplus && defined GNULIB_NAMESPACE # define _GL_CXXALIAS_RPL_CAST_1(func,rpl_func,rettype,parameters) \ namespace GNULIB_NAMESPACE \ { \ static const struct _gl_ ## func ## _wrapper \ { \ typedef rettype (*type) parameters; \ \ inline operator type () const \ { \ return reinterpret_cast(::rpl_func); \ } \ } func = {}; \ } \ _GL_EXTERN_C int _gl_cxxalias_dummy #else # define _GL_CXXALIAS_RPL_CAST_1(func,rpl_func,rettype,parameters) \ _GL_EXTERN_C int _gl_cxxalias_dummy #endif /* _GL_CXXALIAS_SYS (func, rettype, parameters); declares a C++ alias called GNULIB_NAMESPACE::func that redirects to the system provided function func, if GNULIB_NAMESPACE is defined. Example: _GL_CXXALIAS_SYS (open, int, (const char *filename, int flags, ...)); Wrapping func in an object with an inline conversion operator avoids a reference to func unless GNULIB_NAMESPACE::func is actually used in the program. */ #if defined __cplusplus && defined GNULIB_NAMESPACE # define _GL_CXXALIAS_SYS(func,rettype,parameters) \ namespace GNULIB_NAMESPACE \ { \ static const struct _gl_ ## func ## _wrapper \ { \ typedef rettype (*type) parameters; \ \ inline operator type () const \ { \ return ::func; \ } \ } func = {}; \ } \ _GL_EXTERN_C int _gl_cxxalias_dummy #else # define _GL_CXXALIAS_SYS(func,rettype,parameters) \ _GL_EXTERN_C int _gl_cxxalias_dummy #endif /* _GL_CXXALIAS_SYS_CAST (func, rettype, parameters); is like _GL_CXXALIAS_SYS (func, rettype, parameters); except that the C function func may have a slightly different declaration. A cast is used to silence the "invalid conversion" error that would otherwise occur. */ #if defined __cplusplus && defined GNULIB_NAMESPACE # define _GL_CXXALIAS_SYS_CAST(func,rettype,parameters) \ namespace GNULIB_NAMESPACE \ { \ static const struct _gl_ ## func ## _wrapper \ { \ typedef rettype (*type) parameters; \ \ inline operator type () const \ { \ return reinterpret_cast(::func); \ } \ } func = {}; \ } \ _GL_EXTERN_C int _gl_cxxalias_dummy #else # define _GL_CXXALIAS_SYS_CAST(func,rettype,parameters) \ _GL_EXTERN_C int _gl_cxxalias_dummy #endif /* _GL_CXXALIAS_SYS_CAST2 (func, rettype, parameters, rettype2, parameters2); is like _GL_CXXALIAS_SYS (func, rettype, parameters); except that the C function is picked among a set of overloaded functions, namely the one with rettype2 and parameters2. Two consecutive casts are used to silence the "cannot find a match" and "invalid conversion" errors that would otherwise occur. */ #if defined __cplusplus && defined GNULIB_NAMESPACE /* The outer cast must be a reinterpret_cast. The inner cast: When the function is defined as a set of overloaded functions, it works as a static_cast<>, choosing the designated variant. When the function is defined as a single variant, it works as a reinterpret_cast<>. The parenthesized cast syntax works both ways. */ # define _GL_CXXALIAS_SYS_CAST2(func,rettype,parameters,rettype2,parameters2) \ namespace GNULIB_NAMESPACE \ { \ static const struct _gl_ ## func ## _wrapper \ { \ typedef rettype (*type) parameters; \ \ inline operator type () const \ { \ return reinterpret_cast((rettype2 (*) parameters2)(::func)); \ } \ } func = {}; \ } \ _GL_EXTERN_C int _gl_cxxalias_dummy #else # define _GL_CXXALIAS_SYS_CAST2(func,rettype,parameters,rettype2,parameters2) \ _GL_EXTERN_C int _gl_cxxalias_dummy #endif /* _GL_CXXALIASWARN (func); causes a warning to be emitted when ::func is used but not when GNULIB_NAMESPACE::func is used. func must be defined without overloaded variants. */ #if defined __cplusplus && defined GNULIB_NAMESPACE # define _GL_CXXALIASWARN(func) \ _GL_CXXALIASWARN_1 (func, GNULIB_NAMESPACE) # define _GL_CXXALIASWARN_1(func,namespace) \ _GL_CXXALIASWARN_2 (func, namespace) /* To work around GCC bug , we enable the warning only when not optimizing. */ # if !(defined __GNUC__ && !defined __clang__ && __OPTIMIZE__) # define _GL_CXXALIASWARN_2(func,namespace) \ _GL_WARN_ON_USE (func, \ "The symbol ::" #func " refers to the system function. " \ "Use " #namespace "::" #func " instead.") # elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING # define _GL_CXXALIASWARN_2(func,namespace) \ extern __typeof__ (func) func # else # define _GL_CXXALIASWARN_2(func,namespace) \ _GL_EXTERN_C int _gl_cxxalias_dummy # endif #else # define _GL_CXXALIASWARN(func) \ _GL_EXTERN_C int _gl_cxxalias_dummy #endif /* _GL_CXXALIASWARN1 (func, rettype, parameters_and_attributes); causes a warning to be emitted when the given overloaded variant of ::func is used but not when GNULIB_NAMESPACE::func is used. */ #if defined __cplusplus && defined GNULIB_NAMESPACE # define _GL_CXXALIASWARN1(func,rettype,parameters_and_attributes) \ _GL_CXXALIASWARN1_1 (func, rettype, parameters_and_attributes, \ GNULIB_NAMESPACE) # define _GL_CXXALIASWARN1_1(func,rettype,parameters_and_attributes,namespace) \ _GL_CXXALIASWARN1_2 (func, rettype, parameters_and_attributes, namespace) /* To work around GCC bug , we enable the warning only when not optimizing. */ # if !(defined __GNUC__ && !defined __clang__ && __OPTIMIZE__) # define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \ _GL_WARN_ON_USE_CXX (func, rettype, parameters_and_attributes, \ "The symbol ::" #func " refers to the system function. " \ "Use " #namespace "::" #func " instead.") # else # define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \ _GL_EXTERN_C int _gl_cxxalias_dummy # endif #else # define _GL_CXXALIASWARN1(func,rettype,parameters_and_attributes) \ _GL_EXTERN_C int _gl_cxxalias_dummy #endif #endif /* _GL_CXXDEFS_H */ pspp-1.4.1/gl/sigprocmask.c0000644000175000017500000002060113723215640015205 0ustar00blpblp00000000000000/* POSIX compatible signal blocking. Copyright (C) 2006-2020 Free Software Foundation, Inc. Written by Bruno Haible , 2006. 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 3 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, see . */ #include /* Specification. */ #include #include #include #include #if HAVE_MSVC_INVALID_PARAMETER_HANDLER # include "msvc-inval.h" #endif /* We assume that a platform without POSIX signal blocking functions also does not have the POSIX sigaction() function, only the signal() function. We also assume signal() has SysV semantics, where any handler is uninstalled prior to being invoked. This is true for native Windows platforms. */ /* We use raw signal(), but also provide a wrapper rpl_signal() so that applications can query or change a blocked signal. */ #undef signal /* Provide invalid signal numbers as fallbacks if the uncatchable signals are not defined. */ #ifndef SIGKILL # define SIGKILL (-1) #endif #ifndef SIGSTOP # define SIGSTOP (-1) #endif /* On native Windows, as of 2008, the signal SIGABRT_COMPAT is an alias for the signal SIGABRT. Only one signal handler is stored for both SIGABRT and SIGABRT_COMPAT. SIGABRT_COMPAT is not a signal of its own. */ #if defined _WIN32 && ! defined __CYGWIN__ # undef SIGABRT_COMPAT # define SIGABRT_COMPAT 6 #endif #ifdef SIGABRT_COMPAT # define SIGABRT_COMPAT_MASK (1U << SIGABRT_COMPAT) #else # define SIGABRT_COMPAT_MASK 0 #endif typedef void (*handler_t) (int); #if HAVE_MSVC_INVALID_PARAMETER_HANDLER static handler_t signal_nothrow (int sig, handler_t handler) { handler_t result; TRY_MSVC_INVAL { result = signal (sig, handler); } CATCH_MSVC_INVAL { result = SIG_ERR; errno = EINVAL; } DONE_MSVC_INVAL; return result; } # define signal signal_nothrow #endif /* Handling of gnulib defined signals. */ #if GNULIB_defined_SIGPIPE static handler_t SIGPIPE_handler = SIG_DFL; #endif #if GNULIB_defined_SIGPIPE static handler_t ext_signal (int sig, handler_t handler) { switch (sig) { case SIGPIPE: { handler_t old_handler = SIGPIPE_handler; SIGPIPE_handler = handler; return old_handler; } default: /* System defined signal */ return signal (sig, handler); } } # undef signal # define signal ext_signal #endif int sigismember (const sigset_t *set, int sig) { if (sig >= 0 && sig < NSIG) { #ifdef SIGABRT_COMPAT if (sig == SIGABRT_COMPAT) sig = SIGABRT; #endif return (*set >> sig) & 1; } else return 0; } int sigemptyset (sigset_t *set) { *set = 0; return 0; } int sigaddset (sigset_t *set, int sig) { if (sig >= 0 && sig < NSIG) { #ifdef SIGABRT_COMPAT if (sig == SIGABRT_COMPAT) sig = SIGABRT; #endif *set |= 1U << sig; return 0; } else { errno = EINVAL; return -1; } } int sigdelset (sigset_t *set, int sig) { if (sig >= 0 && sig < NSIG) { #ifdef SIGABRT_COMPAT if (sig == SIGABRT_COMPAT) sig = SIGABRT; #endif *set &= ~(1U << sig); return 0; } else { errno = EINVAL; return -1; } } int sigfillset (sigset_t *set) { *set = ((2U << (NSIG - 1)) - 1) & ~ SIGABRT_COMPAT_MASK; return 0; } /* Set of currently blocked signals. */ static volatile sigset_t blocked_set /* = 0 */; /* Set of currently blocked and pending signals. */ static volatile sig_atomic_t pending_array[NSIG] /* = { 0 } */; /* Signal handler that is installed for blocked signals. */ static void blocked_handler (int sig) { /* Reinstall the handler, in case the signal occurs multiple times while blocked. There is an inherent race where an asynchronous signal in between when the kernel uninstalled the handler and when we reinstall it will trigger the default handler; oh well. */ signal (sig, blocked_handler); if (sig >= 0 && sig < NSIG) pending_array[sig] = 1; } int sigpending (sigset_t *set) { sigset_t pending = 0; int sig; for (sig = 0; sig < NSIG; sig++) if (pending_array[sig]) pending |= 1U << sig; *set = pending; return 0; } /* The previous signal handlers. Only the array elements corresponding to blocked signals are relevant. */ static volatile handler_t old_handlers[NSIG]; int sigprocmask (int operation, const sigset_t *set, sigset_t *old_set) { if (old_set != NULL) *old_set = blocked_set; if (set != NULL) { sigset_t new_blocked_set; sigset_t to_unblock; sigset_t to_block; switch (operation) { case SIG_BLOCK: new_blocked_set = blocked_set | *set; break; case SIG_SETMASK: new_blocked_set = *set; break; case SIG_UNBLOCK: new_blocked_set = blocked_set & ~*set; break; default: errno = EINVAL; return -1; } to_unblock = blocked_set & ~new_blocked_set; to_block = new_blocked_set & ~blocked_set; if (to_block != 0) { int sig; for (sig = 0; sig < NSIG; sig++) if ((to_block >> sig) & 1) { pending_array[sig] = 0; if ((old_handlers[sig] = signal (sig, blocked_handler)) != SIG_ERR) blocked_set |= 1U << sig; } } if (to_unblock != 0) { sig_atomic_t received[NSIG]; int sig; for (sig = 0; sig < NSIG; sig++) if ((to_unblock >> sig) & 1) { if (signal (sig, old_handlers[sig]) != blocked_handler) /* The application changed a signal handler while the signal was blocked, bypassing our rpl_signal replacement. We don't support this. */ abort (); received[sig] = pending_array[sig]; blocked_set &= ~(1U << sig); pending_array[sig] = 0; } else received[sig] = 0; for (sig = 0; sig < NSIG; sig++) if (received[sig]) raise (sig); } } return 0; } /* Install the handler FUNC for signal SIG, and return the previous handler. */ handler_t rpl_signal (int sig, handler_t handler) { /* We must provide a wrapper, so that a user can query what handler they installed even if that signal is currently blocked. */ if (sig >= 0 && sig < NSIG && sig != SIGKILL && sig != SIGSTOP && handler != SIG_ERR) { #ifdef SIGABRT_COMPAT if (sig == SIGABRT_COMPAT) sig = SIGABRT; #endif if (blocked_set & (1U << sig)) { /* POSIX states that sigprocmask and signal are both async-signal-safe. This is not true of our implementation - there is a slight data race where an asynchronous interrupt on signal A can occur after we install blocked_handler but before we have updated old_handlers for signal B, such that handler A can see stale information if it calls signal(B). Oh well - signal handlers really shouldn't try to manipulate the installed handlers of unrelated signals. */ handler_t result = old_handlers[sig]; old_handlers[sig] = handler; return result; } else return signal (sig, handler); } else { errno = EINVAL; return SIG_ERR; } } #if GNULIB_defined_SIGPIPE /* Raise the signal SIGPIPE. */ int _gl_raise_SIGPIPE (void) { if (blocked_set & (1U << SIGPIPE)) pending_array[SIGPIPE] = 1; else { handler_t handler = SIGPIPE_handler; if (handler == SIG_DFL) exit (128 + SIGPIPE); else if (handler != SIG_IGN) (*handler) (SIGPIPE); } return 0; } #endif pspp-1.4.1/gl/getdtablesize.c0000644000175000017500000000654413723215637015531 0ustar00blpblp00000000000000/* getdtablesize() function: Return maximum possible file descriptor value + 1. Copyright (C) 2008-2020 Free Software Foundation, Inc. Written by Bruno Haible , 2008. 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 3 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, see . */ #include /* Specification. */ #include #if defined _WIN32 && ! defined __CYGWIN__ # include # if HAVE_MSVC_INVALID_PARAMETER_HANDLER # include "msvc-inval.h" # endif # if HAVE_MSVC_INVALID_PARAMETER_HANDLER static int _setmaxstdio_nothrow (int newmax) { int result; TRY_MSVC_INVAL { result = _setmaxstdio (newmax); } CATCH_MSVC_INVAL { result = -1; } DONE_MSVC_INVAL; return result; } # else # define _setmaxstdio_nothrow _setmaxstdio # endif /* Cache for the previous getdtablesize () result. Safe to cache because Windows also lacks setrlimit. */ static int dtablesize; int getdtablesize (void) { if (dtablesize == 0) { /* We are looking for the number N such that the valid file descriptors are 0..N-1. It can be obtained through a loop as follows: { int fd; for (fd = 3; fd < 65536; fd++) if (dup2 (0, fd) == -1) break; return fd; } On Windows XP, the result is 2048. The drawback of this loop is that it allocates memory for a libc internal array that is never freed. The number N can also be obtained as the upper bound for _getmaxstdio (). _getmaxstdio () returns the maximum number of open FILE objects. The sanity check in _setmaxstdio reveals the maximum number of file descriptors. This too allocates memory, but it is freed when we call _setmaxstdio with the original value. */ int orig_max_stdio = _getmaxstdio (); unsigned int bound; for (bound = 0x10000; _setmaxstdio_nothrow (bound) < 0; bound = bound / 2) ; _setmaxstdio_nothrow (orig_max_stdio); dtablesize = bound; } return dtablesize; } #else # include # include # ifndef RLIM_SAVED_CUR # define RLIM_SAVED_CUR RLIM_INFINITY # endif # ifndef RLIM_SAVED_MAX # define RLIM_SAVED_MAX RLIM_INFINITY # endif # ifdef __CYGWIN__ /* Cygwin 1.7.25 auto-increases the RLIMIT_NOFILE soft limit until it hits the compile-time constant hard limit of 3200. We might as well just report the hard limit. */ # define rlim_cur rlim_max # endif int getdtablesize (void) { struct rlimit lim; if (getrlimit (RLIMIT_NOFILE, &lim) == 0 && 0 <= lim.rlim_cur && lim.rlim_cur <= INT_MAX && lim.rlim_cur != RLIM_INFINITY && lim.rlim_cur != RLIM_SAVED_CUR && lim.rlim_cur != RLIM_SAVED_MAX) return lim.rlim_cur; return INT_MAX; } #endif pspp-1.4.1/gl/wchar.in.h0000644000175000017500000011713213723215640014407 0ustar00blpblp00000000000000/* A substitute for ISO C99 , for platforms that have issues. Copyright (C) 2007-2020 Free Software Foundation, Inc. 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 3, 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, see . */ /* Written by Eric Blake. */ /* * ISO C 99 for platforms that have issues. * * * For now, this just ensures proper prerequisite inclusion order and * the declaration of wcwidth(). */ #if __GNUC__ >= 3 @PRAGMA_SYSTEM_HEADER@ #endif @PRAGMA_COLUMNS@ #if (((defined __need_mbstate_t || defined __need_wint_t) \ && !defined __MINGW32__) \ || (defined __hpux \ && ((defined _INTTYPES_INCLUDED \ && !defined _GL_FINISHED_INCLUDING_SYSTEM_INTTYPES_H) \ || defined _GL_JUST_INCLUDE_SYSTEM_WCHAR_H)) \ || (defined __MINGW32__ && defined __STRING_H_SOURCED__) \ || defined _GL_ALREADY_INCLUDING_WCHAR_H) /* Special invocation convention: - Inside glibc and uClibc header files, but not MinGW. - On HP-UX 11.00 we have a sequence of nested includes -> -> , and the latter includes , once indirectly -> -> -> and once directly. In both situations 'wint_t' is not yet defined, therefore we cannot provide the function overrides; instead include only the system's . - With MinGW 3.22, when includes , only some part of is actually processed, and that doesn't include 'mbstate_t'. - On IRIX 6.5, similarly, we have an include -> , and the latter includes . But here, we have no way to detect whether is completely included or is still being included. */ #@INCLUDE_NEXT@ @NEXT_WCHAR_H@ #else /* Normal invocation convention. */ #ifndef _@GUARD_PREFIX@_WCHAR_H #define _GL_ALREADY_INCLUDING_WCHAR_H #if @HAVE_FEATURES_H@ # include /* for __GLIBC__ */ #endif /* Tru64 with Desktop Toolkit C has a bug: must be included before . BSD/OS 4.0.1 has a bug: , and must be included before . In some builds of uClibc, is nonexistent and wchar_t is defined by . But avoid namespace pollution on glibc systems. */ #if !(defined __GLIBC__ && !defined __UCLIBC__) # include #endif #ifndef __GLIBC__ # include # include #endif /* Include the original if it exists. Some builds of uClibc lack it. */ /* The include_next requires a split double-inclusion guard. */ #if @HAVE_WCHAR_H@ # @INCLUDE_NEXT@ @NEXT_WCHAR_H@ #endif #undef _GL_ALREADY_INCLUDING_WCHAR_H #ifndef _@GUARD_PREFIX@_WCHAR_H #define _@GUARD_PREFIX@_WCHAR_H /* The __attribute__ feature is available in gcc versions 2.5 and later. The attribute __pure__ was added in gcc 2.96. */ #ifndef _GL_ATTRIBUTE_PURE # if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 96) # define _GL_ATTRIBUTE_PURE __attribute__ ((__pure__)) # else # define _GL_ATTRIBUTE_PURE /* empty */ # endif #endif /* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */ /* The definition of _GL_ARG_NONNULL is copied here. */ /* The definition of _GL_WARN_ON_USE is copied here. */ /* Define wint_t and WEOF. (Also done in wctype.in.h.) */ #if !@HAVE_WINT_T@ && !defined wint_t # define wint_t int # ifndef WEOF # define WEOF -1 # endif #else /* mingw and MSVC define wint_t as 'unsigned short' in or . This is too small: ISO C 99 section 7.24.1.(2) says that wint_t must be "unchanged by default argument promotions". Override it. */ # if @GNULIB_OVERRIDES_WINT_T@ # if !GNULIB_defined_wint_t # if @HAVE_CRTDEFS_H@ # include # else # include # endif typedef unsigned int rpl_wint_t; # undef wint_t # define wint_t rpl_wint_t # define GNULIB_defined_wint_t 1 # endif # endif # ifndef WEOF # define WEOF ((wint_t) -1) # endif #endif /* Override mbstate_t if it is too small. On IRIX 6.5, sizeof (mbstate_t) == 1, which is not sufficient for implementing mbrtowc for encodings like UTF-8. On AIX and MSVC, mbrtowc needs to be overridden, but mbstate_t exists and is large enough and overriding it would cause problems in C++ mode. */ #if !(((defined _WIN32 && !defined __CYGWIN__) || @HAVE_MBSINIT@) && @HAVE_MBRTOWC@) || @REPLACE_MBSTATE_T@ # if !GNULIB_defined_mbstate_t # if !(defined _AIX || defined _MSC_VER) typedef int rpl_mbstate_t; # undef mbstate_t # define mbstate_t rpl_mbstate_t # endif # define GNULIB_defined_mbstate_t 1 # endif #endif /* Convert a single-byte character to a wide character. */ #if @GNULIB_BTOWC@ # if @REPLACE_BTOWC@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef btowc # define btowc rpl_btowc # endif _GL_FUNCDECL_RPL (btowc, wint_t, (int c) _GL_ATTRIBUTE_PURE); _GL_CXXALIAS_RPL (btowc, wint_t, (int c)); # else # if !@HAVE_BTOWC@ _GL_FUNCDECL_SYS (btowc, wint_t, (int c) _GL_ATTRIBUTE_PURE); # endif /* Need to cast, because on mingw, the return type is 'unsigned short'. */ _GL_CXXALIAS_SYS_CAST (btowc, wint_t, (int c)); # endif # if __GLIBC__ >= 2 _GL_CXXALIASWARN (btowc); # endif #elif defined GNULIB_POSIXCHECK # undef btowc # if HAVE_RAW_DECL_BTOWC _GL_WARN_ON_USE (btowc, "btowc is unportable - " "use gnulib module btowc for portability"); # endif #endif /* Convert a wide character to a single-byte character. */ #if @GNULIB_WCTOB@ # if @REPLACE_WCTOB@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef wctob # define wctob rpl_wctob # endif _GL_FUNCDECL_RPL (wctob, int, (wint_t wc) _GL_ATTRIBUTE_PURE); _GL_CXXALIAS_RPL (wctob, int, (wint_t wc)); # else # if !defined wctob && !@HAVE_DECL_WCTOB@ /* wctob is provided by gnulib, or wctob exists but is not declared. */ _GL_FUNCDECL_SYS (wctob, int, (wint_t wc) _GL_ATTRIBUTE_PURE); # endif _GL_CXXALIAS_SYS (wctob, int, (wint_t wc)); # endif # if __GLIBC__ >= 2 _GL_CXXALIASWARN (wctob); # endif #elif defined GNULIB_POSIXCHECK # undef wctob # if HAVE_RAW_DECL_WCTOB _GL_WARN_ON_USE (wctob, "wctob is unportable - " "use gnulib module wctob for portability"); # endif #endif /* Test whether *PS is in the initial state. */ #if @GNULIB_MBSINIT@ # if @REPLACE_MBSINIT@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef mbsinit # define mbsinit rpl_mbsinit # endif _GL_FUNCDECL_RPL (mbsinit, int, (const mbstate_t *ps)); _GL_CXXALIAS_RPL (mbsinit, int, (const mbstate_t *ps)); # else # if !@HAVE_MBSINIT@ _GL_FUNCDECL_SYS (mbsinit, int, (const mbstate_t *ps)); # endif _GL_CXXALIAS_SYS (mbsinit, int, (const mbstate_t *ps)); # endif # if __GLIBC__ >= 2 _GL_CXXALIASWARN (mbsinit); # endif #elif defined GNULIB_POSIXCHECK # undef mbsinit # if HAVE_RAW_DECL_MBSINIT _GL_WARN_ON_USE (mbsinit, "mbsinit is unportable - " "use gnulib module mbsinit for portability"); # endif #endif /* Convert a multibyte character to a wide character. */ #if @GNULIB_MBRTOWC@ # if @REPLACE_MBRTOWC@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef mbrtowc # define mbrtowc rpl_mbrtowc # endif _GL_FUNCDECL_RPL (mbrtowc, size_t, (wchar_t *restrict pwc, const char *restrict s, size_t n, mbstate_t *restrict ps)); _GL_CXXALIAS_RPL (mbrtowc, size_t, (wchar_t *restrict pwc, const char *restrict s, size_t n, mbstate_t *restrict ps)); # else # if !@HAVE_MBRTOWC@ _GL_FUNCDECL_SYS (mbrtowc, size_t, (wchar_t *restrict pwc, const char *restrict s, size_t n, mbstate_t *restrict ps)); # endif _GL_CXXALIAS_SYS (mbrtowc, size_t, (wchar_t *restrict pwc, const char *restrict s, size_t n, mbstate_t *restrict ps)); # endif # if __GLIBC__ >= 2 _GL_CXXALIASWARN (mbrtowc); # endif #elif defined GNULIB_POSIXCHECK # undef mbrtowc # if HAVE_RAW_DECL_MBRTOWC _GL_WARN_ON_USE (mbrtowc, "mbrtowc is unportable - " "use gnulib module mbrtowc for portability"); # endif #endif /* Recognize a multibyte character. */ #if @GNULIB_MBRLEN@ # if @REPLACE_MBRLEN@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef mbrlen # define mbrlen rpl_mbrlen # endif _GL_FUNCDECL_RPL (mbrlen, size_t, (const char *restrict s, size_t n, mbstate_t *restrict ps)); _GL_CXXALIAS_RPL (mbrlen, size_t, (const char *restrict s, size_t n, mbstate_t *restrict ps)); # else # if !@HAVE_MBRLEN@ _GL_FUNCDECL_SYS (mbrlen, size_t, (const char *restrict s, size_t n, mbstate_t *restrict ps)); # endif _GL_CXXALIAS_SYS (mbrlen, size_t, (const char *restrict s, size_t n, mbstate_t *restrict ps)); # endif # if __GLIBC__ >= 2 _GL_CXXALIASWARN (mbrlen); # endif #elif defined GNULIB_POSIXCHECK # undef mbrlen # if HAVE_RAW_DECL_MBRLEN _GL_WARN_ON_USE (mbrlen, "mbrlen is unportable - " "use gnulib module mbrlen for portability"); # endif #endif /* Convert a string to a wide string. */ #if @GNULIB_MBSRTOWCS@ # if @REPLACE_MBSRTOWCS@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef mbsrtowcs # define mbsrtowcs rpl_mbsrtowcs # endif _GL_FUNCDECL_RPL (mbsrtowcs, size_t, (wchar_t *restrict dest, const char **restrict srcp, size_t len, mbstate_t *restrict ps) _GL_ARG_NONNULL ((2))); _GL_CXXALIAS_RPL (mbsrtowcs, size_t, (wchar_t *restrict dest, const char **restrict srcp, size_t len, mbstate_t *restrict ps)); # else # if !@HAVE_MBSRTOWCS@ _GL_FUNCDECL_SYS (mbsrtowcs, size_t, (wchar_t *restrict dest, const char **restrict srcp, size_t len, mbstate_t *restrict ps) _GL_ARG_NONNULL ((2))); # endif _GL_CXXALIAS_SYS (mbsrtowcs, size_t, (wchar_t *restrict dest, const char **restrict srcp, size_t len, mbstate_t *restrict ps)); # endif # if __GLIBC__ >= 2 _GL_CXXALIASWARN (mbsrtowcs); # endif #elif defined GNULIB_POSIXCHECK # undef mbsrtowcs # if HAVE_RAW_DECL_MBSRTOWCS _GL_WARN_ON_USE (mbsrtowcs, "mbsrtowcs is unportable - " "use gnulib module mbsrtowcs for portability"); # endif #endif /* Convert a string to a wide string. */ #if @GNULIB_MBSNRTOWCS@ # if @REPLACE_MBSNRTOWCS@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef mbsnrtowcs # define mbsnrtowcs rpl_mbsnrtowcs # endif _GL_FUNCDECL_RPL (mbsnrtowcs, size_t, (wchar_t *restrict dest, const char **restrict srcp, size_t srclen, size_t len, mbstate_t *restrict ps) _GL_ARG_NONNULL ((2))); _GL_CXXALIAS_RPL (mbsnrtowcs, size_t, (wchar_t *restrict dest, const char **restrict srcp, size_t srclen, size_t len, mbstate_t *restrict ps)); # else # if !@HAVE_MBSNRTOWCS@ _GL_FUNCDECL_SYS (mbsnrtowcs, size_t, (wchar_t *restrict dest, const char **restrict srcp, size_t srclen, size_t len, mbstate_t *restrict ps) _GL_ARG_NONNULL ((2))); # endif _GL_CXXALIAS_SYS (mbsnrtowcs, size_t, (wchar_t *restrict dest, const char **restrict srcp, size_t srclen, size_t len, mbstate_t *restrict ps)); # endif _GL_CXXALIASWARN (mbsnrtowcs); #elif defined GNULIB_POSIXCHECK # undef mbsnrtowcs # if HAVE_RAW_DECL_MBSNRTOWCS _GL_WARN_ON_USE (mbsnrtowcs, "mbsnrtowcs is unportable - " "use gnulib module mbsnrtowcs for portability"); # endif #endif /* Convert a wide character to a multibyte character. */ #if @GNULIB_WCRTOMB@ # if @REPLACE_WCRTOMB@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef wcrtomb # define wcrtomb rpl_wcrtomb # endif _GL_FUNCDECL_RPL (wcrtomb, size_t, (char *restrict s, wchar_t wc, mbstate_t *restrict ps)); _GL_CXXALIAS_RPL (wcrtomb, size_t, (char *restrict s, wchar_t wc, mbstate_t *restrict ps)); # else # if !@HAVE_WCRTOMB@ _GL_FUNCDECL_SYS (wcrtomb, size_t, (char *restrict s, wchar_t wc, mbstate_t *restrict ps)); # endif _GL_CXXALIAS_SYS (wcrtomb, size_t, (char *restrict s, wchar_t wc, mbstate_t *restrict ps)); # endif # if __GLIBC__ >= 2 _GL_CXXALIASWARN (wcrtomb); # endif #elif defined GNULIB_POSIXCHECK # undef wcrtomb # if HAVE_RAW_DECL_WCRTOMB _GL_WARN_ON_USE (wcrtomb, "wcrtomb is unportable - " "use gnulib module wcrtomb for portability"); # endif #endif /* Convert a wide string to a string. */ #if @GNULIB_WCSRTOMBS@ # if @REPLACE_WCSRTOMBS@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef wcsrtombs # define wcsrtombs rpl_wcsrtombs # endif _GL_FUNCDECL_RPL (wcsrtombs, size_t, (char *restrict dest, const wchar_t **restrict srcp, size_t len, mbstate_t *restrict ps) _GL_ARG_NONNULL ((2))); _GL_CXXALIAS_RPL (wcsrtombs, size_t, (char *restrict dest, const wchar_t **restrict srcp, size_t len, mbstate_t *restrict ps)); # else # if !@HAVE_WCSRTOMBS@ _GL_FUNCDECL_SYS (wcsrtombs, size_t, (char *restrict dest, const wchar_t **restrict srcp, size_t len, mbstate_t *restrict ps) _GL_ARG_NONNULL ((2))); # endif _GL_CXXALIAS_SYS (wcsrtombs, size_t, (char *restrict dest, const wchar_t **restrict srcp, size_t len, mbstate_t *restrict ps)); # endif # if __GLIBC__ >= 2 _GL_CXXALIASWARN (wcsrtombs); # endif #elif defined GNULIB_POSIXCHECK # undef wcsrtombs # if HAVE_RAW_DECL_WCSRTOMBS _GL_WARN_ON_USE (wcsrtombs, "wcsrtombs is unportable - " "use gnulib module wcsrtombs for portability"); # endif #endif /* Convert a wide string to a string. */ #if @GNULIB_WCSNRTOMBS@ # if @REPLACE_WCSNRTOMBS@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef wcsnrtombs # define wcsnrtombs rpl_wcsnrtombs # endif _GL_FUNCDECL_RPL (wcsnrtombs, size_t, (char *restrict dest, const wchar_t **restrict srcp, size_t srclen, size_t len, mbstate_t *restrict ps) _GL_ARG_NONNULL ((2))); _GL_CXXALIAS_RPL (wcsnrtombs, size_t, (char *restrict dest, const wchar_t **restrict srcp, size_t srclen, size_t len, mbstate_t *restrict ps)); # else # if !@HAVE_WCSNRTOMBS@ || (defined __cplusplus && defined __sun) _GL_FUNCDECL_SYS (wcsnrtombs, size_t, (char *restrict dest, const wchar_t **restrict srcp, size_t srclen, size_t len, mbstate_t *restrict ps) _GL_ARG_NONNULL ((2))); # endif _GL_CXXALIAS_SYS (wcsnrtombs, size_t, (char *restrict dest, const wchar_t **restrict srcp, size_t srclen, size_t len, mbstate_t *restrict ps)); # endif # if __GLIBC__ >= 2 _GL_CXXALIASWARN (wcsnrtombs); # endif #elif defined GNULIB_POSIXCHECK # undef wcsnrtombs # if HAVE_RAW_DECL_WCSNRTOMBS _GL_WARN_ON_USE (wcsnrtombs, "wcsnrtombs is unportable - " "use gnulib module wcsnrtombs for portability"); # endif #endif /* Return the number of screen columns needed for WC. */ #if @GNULIB_WCWIDTH@ # if @REPLACE_WCWIDTH@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef wcwidth # define wcwidth rpl_wcwidth # endif _GL_FUNCDECL_RPL (wcwidth, int, (wchar_t) _GL_ATTRIBUTE_PURE); _GL_CXXALIAS_RPL (wcwidth, int, (wchar_t)); # else # if !@HAVE_DECL_WCWIDTH@ /* wcwidth exists but is not declared. */ _GL_FUNCDECL_SYS (wcwidth, int, (wchar_t) _GL_ATTRIBUTE_PURE); # endif _GL_CXXALIAS_SYS (wcwidth, int, (wchar_t)); # endif # if __GLIBC__ >= 2 _GL_CXXALIASWARN (wcwidth); # endif #elif defined GNULIB_POSIXCHECK # undef wcwidth # if HAVE_RAW_DECL_WCWIDTH _GL_WARN_ON_USE (wcwidth, "wcwidth is unportable - " "use gnulib module wcwidth for portability"); # endif #endif /* Search N wide characters of S for C. */ #if @GNULIB_WMEMCHR@ # if !@HAVE_WMEMCHR@ _GL_FUNCDECL_SYS (wmemchr, wchar_t *, (const wchar_t *s, wchar_t c, size_t n) _GL_ATTRIBUTE_PURE); # endif /* On some systems, this function is defined as an overloaded function: extern "C++" { const wchar_t * std::wmemchr (const wchar_t *, wchar_t, size_t); wchar_t * std::wmemchr (wchar_t *, wchar_t, size_t); } */ _GL_CXXALIAS_SYS_CAST2 (wmemchr, wchar_t *, (const wchar_t *, wchar_t, size_t), const wchar_t *, (const wchar_t *, wchar_t, size_t)); # if ((__GLIBC__ == 2 && __GLIBC_MINOR__ >= 10) && !defined __UCLIBC__) \ && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4)) _GL_CXXALIASWARN1 (wmemchr, wchar_t *, (wchar_t *s, wchar_t c, size_t n)); _GL_CXXALIASWARN1 (wmemchr, const wchar_t *, (const wchar_t *s, wchar_t c, size_t n)); # elif __GLIBC__ >= 2 _GL_CXXALIASWARN (wmemchr); # endif #elif defined GNULIB_POSIXCHECK # undef wmemchr # if HAVE_RAW_DECL_WMEMCHR _GL_WARN_ON_USE (wmemchr, "wmemchr is unportable - " "use gnulib module wmemchr for portability"); # endif #endif /* Compare N wide characters of S1 and S2. */ #if @GNULIB_WMEMCMP@ # if !@HAVE_WMEMCMP@ _GL_FUNCDECL_SYS (wmemcmp, int, (const wchar_t *s1, const wchar_t *s2, size_t n) _GL_ATTRIBUTE_PURE); # endif _GL_CXXALIAS_SYS (wmemcmp, int, (const wchar_t *s1, const wchar_t *s2, size_t n)); # if __GLIBC__ >= 2 _GL_CXXALIASWARN (wmemcmp); # endif #elif defined GNULIB_POSIXCHECK # undef wmemcmp # if HAVE_RAW_DECL_WMEMCMP _GL_WARN_ON_USE (wmemcmp, "wmemcmp is unportable - " "use gnulib module wmemcmp for portability"); # endif #endif /* Copy N wide characters of SRC to DEST. */ #if @GNULIB_WMEMCPY@ # if !@HAVE_WMEMCPY@ _GL_FUNCDECL_SYS (wmemcpy, wchar_t *, (wchar_t *restrict dest, const wchar_t *restrict src, size_t n)); # endif _GL_CXXALIAS_SYS (wmemcpy, wchar_t *, (wchar_t *restrict dest, const wchar_t *restrict src, size_t n)); # if __GLIBC__ >= 2 _GL_CXXALIASWARN (wmemcpy); # endif #elif defined GNULIB_POSIXCHECK # undef wmemcpy # if HAVE_RAW_DECL_WMEMCPY _GL_WARN_ON_USE (wmemcpy, "wmemcpy is unportable - " "use gnulib module wmemcpy for portability"); # endif #endif /* Copy N wide characters of SRC to DEST, guaranteeing correct behavior for overlapping memory areas. */ #if @GNULIB_WMEMMOVE@ # if !@HAVE_WMEMMOVE@ _GL_FUNCDECL_SYS (wmemmove, wchar_t *, (wchar_t *dest, const wchar_t *src, size_t n)); # endif _GL_CXXALIAS_SYS (wmemmove, wchar_t *, (wchar_t *dest, const wchar_t *src, size_t n)); # if __GLIBC__ >= 2 _GL_CXXALIASWARN (wmemmove); # endif #elif defined GNULIB_POSIXCHECK # undef wmemmove # if HAVE_RAW_DECL_WMEMMOVE _GL_WARN_ON_USE (wmemmove, "wmemmove is unportable - " "use gnulib module wmemmove for portability"); # endif #endif /* Copy N wide characters of SRC to DEST. Return pointer to wide characters after the last written wide character. */ #if @GNULIB_WMEMPCPY@ # if !@HAVE_WMEMPCPY@ _GL_FUNCDECL_SYS (wmempcpy, wchar_t *, (wchar_t *restrict dest, const wchar_t *restrict src, size_t n)); # endif _GL_CXXALIAS_SYS (wmempcpy, wchar_t *, (wchar_t *restrict dest, const wchar_t *restrict src, size_t n)); # if __GLIBC__ >= 2 _GL_CXXALIASWARN (wmempcpy); # endif #elif defined GNULIB_POSIXCHECK # undef wmempcpy # if HAVE_RAW_DECL_WMEMPCPY _GL_WARN_ON_USE (wmempcpy, "wmempcpy is unportable - " "use gnulib module wmempcpy for portability"); # endif #endif /* Set N wide characters of S to C. */ #if @GNULIB_WMEMSET@ # if !@HAVE_WMEMSET@ _GL_FUNCDECL_SYS (wmemset, wchar_t *, (wchar_t *s, wchar_t c, size_t n)); # endif _GL_CXXALIAS_SYS (wmemset, wchar_t *, (wchar_t *s, wchar_t c, size_t n)); # if __GLIBC__ >= 2 _GL_CXXALIASWARN (wmemset); # endif #elif defined GNULIB_POSIXCHECK # undef wmemset # if HAVE_RAW_DECL_WMEMSET _GL_WARN_ON_USE (wmemset, "wmemset is unportable - " "use gnulib module wmemset for portability"); # endif #endif /* Return the number of wide characters in S. */ #if @GNULIB_WCSLEN@ # if !@HAVE_WCSLEN@ _GL_FUNCDECL_SYS (wcslen, size_t, (const wchar_t *s) _GL_ATTRIBUTE_PURE); # endif _GL_CXXALIAS_SYS (wcslen, size_t, (const wchar_t *s)); # if __GLIBC__ >= 2 _GL_CXXALIASWARN (wcslen); # endif #elif defined GNULIB_POSIXCHECK # undef wcslen # if HAVE_RAW_DECL_WCSLEN _GL_WARN_ON_USE (wcslen, "wcslen is unportable - " "use gnulib module wcslen for portability"); # endif #endif /* Return the number of wide characters in S, but at most MAXLEN. */ #if @GNULIB_WCSNLEN@ # if !@HAVE_WCSNLEN@ _GL_FUNCDECL_SYS (wcsnlen, size_t, (const wchar_t *s, size_t maxlen) _GL_ATTRIBUTE_PURE); # endif _GL_CXXALIAS_SYS (wcsnlen, size_t, (const wchar_t *s, size_t maxlen)); _GL_CXXALIASWARN (wcsnlen); #elif defined GNULIB_POSIXCHECK # undef wcsnlen # if HAVE_RAW_DECL_WCSNLEN _GL_WARN_ON_USE (wcsnlen, "wcsnlen is unportable - " "use gnulib module wcsnlen for portability"); # endif #endif /* Copy SRC to DEST. */ #if @GNULIB_WCSCPY@ # if !@HAVE_WCSCPY@ _GL_FUNCDECL_SYS (wcscpy, wchar_t *, (wchar_t *restrict dest, const wchar_t *restrict src)); # endif _GL_CXXALIAS_SYS (wcscpy, wchar_t *, (wchar_t *restrict dest, const wchar_t *restrict src)); # if __GLIBC__ >= 2 _GL_CXXALIASWARN (wcscpy); # endif #elif defined GNULIB_POSIXCHECK # undef wcscpy # if HAVE_RAW_DECL_WCSCPY _GL_WARN_ON_USE (wcscpy, "wcscpy is unportable - " "use gnulib module wcscpy for portability"); # endif #endif /* Copy SRC to DEST, returning the address of the terminating L'\0' in DEST. */ #if @GNULIB_WCPCPY@ # if !@HAVE_WCPCPY@ _GL_FUNCDECL_SYS (wcpcpy, wchar_t *, (wchar_t *restrict dest, const wchar_t *restrict src)); # endif _GL_CXXALIAS_SYS (wcpcpy, wchar_t *, (wchar_t *restrict dest, const wchar_t *restrict src)); _GL_CXXALIASWARN (wcpcpy); #elif defined GNULIB_POSIXCHECK # undef wcpcpy # if HAVE_RAW_DECL_WCPCPY _GL_WARN_ON_USE (wcpcpy, "wcpcpy is unportable - " "use gnulib module wcpcpy for portability"); # endif #endif /* Copy no more than N wide characters of SRC to DEST. */ #if @GNULIB_WCSNCPY@ # if !@HAVE_WCSNCPY@ _GL_FUNCDECL_SYS (wcsncpy, wchar_t *, (wchar_t *restrict dest, const wchar_t *restrict src, size_t n)); # endif _GL_CXXALIAS_SYS (wcsncpy, wchar_t *, (wchar_t *restrict dest, const wchar_t *restrict src, size_t n)); # if __GLIBC__ >= 2 _GL_CXXALIASWARN (wcsncpy); # endif #elif defined GNULIB_POSIXCHECK # undef wcsncpy # if HAVE_RAW_DECL_WCSNCPY _GL_WARN_ON_USE (wcsncpy, "wcsncpy is unportable - " "use gnulib module wcsncpy for portability"); # endif #endif /* Copy no more than N characters of SRC to DEST, returning the address of the last character written into DEST. */ #if @GNULIB_WCPNCPY@ # if !@HAVE_WCPNCPY@ _GL_FUNCDECL_SYS (wcpncpy, wchar_t *, (wchar_t *restrict dest, const wchar_t *restrict src, size_t n)); # endif _GL_CXXALIAS_SYS (wcpncpy, wchar_t *, (wchar_t *restrict dest, const wchar_t *restrict src, size_t n)); _GL_CXXALIASWARN (wcpncpy); #elif defined GNULIB_POSIXCHECK # undef wcpncpy # if HAVE_RAW_DECL_WCPNCPY _GL_WARN_ON_USE (wcpncpy, "wcpncpy is unportable - " "use gnulib module wcpncpy for portability"); # endif #endif /* Append SRC onto DEST. */ #if @GNULIB_WCSCAT@ # if !@HAVE_WCSCAT@ _GL_FUNCDECL_SYS (wcscat, wchar_t *, (wchar_t *restrict dest, const wchar_t *restrict src)); # endif _GL_CXXALIAS_SYS (wcscat, wchar_t *, (wchar_t *restrict dest, const wchar_t *restrict src)); # if __GLIBC__ >= 2 _GL_CXXALIASWARN (wcscat); # endif #elif defined GNULIB_POSIXCHECK # undef wcscat # if HAVE_RAW_DECL_WCSCAT _GL_WARN_ON_USE (wcscat, "wcscat is unportable - " "use gnulib module wcscat for portability"); # endif #endif /* Append no more than N wide characters of SRC onto DEST. */ #if @GNULIB_WCSNCAT@ # if !@HAVE_WCSNCAT@ _GL_FUNCDECL_SYS (wcsncat, wchar_t *, (wchar_t *restrict dest, const wchar_t *restrict src, size_t n)); # endif _GL_CXXALIAS_SYS (wcsncat, wchar_t *, (wchar_t *restrict dest, const wchar_t *restrict src, size_t n)); # if __GLIBC__ >= 2 _GL_CXXALIASWARN (wcsncat); # endif #elif defined GNULIB_POSIXCHECK # undef wcsncat # if HAVE_RAW_DECL_WCSNCAT _GL_WARN_ON_USE (wcsncat, "wcsncat is unportable - " "use gnulib module wcsncat for portability"); # endif #endif /* Compare S1 and S2. */ #if @GNULIB_WCSCMP@ # if !@HAVE_WCSCMP@ _GL_FUNCDECL_SYS (wcscmp, int, (const wchar_t *s1, const wchar_t *s2) _GL_ATTRIBUTE_PURE); # endif _GL_CXXALIAS_SYS (wcscmp, int, (const wchar_t *s1, const wchar_t *s2)); # if __GLIBC__ >= 2 _GL_CXXALIASWARN (wcscmp); # endif #elif defined GNULIB_POSIXCHECK # undef wcscmp # if HAVE_RAW_DECL_WCSCMP _GL_WARN_ON_USE (wcscmp, "wcscmp is unportable - " "use gnulib module wcscmp for portability"); # endif #endif /* Compare no more than N wide characters of S1 and S2. */ #if @GNULIB_WCSNCMP@ # if !@HAVE_WCSNCMP@ _GL_FUNCDECL_SYS (wcsncmp, int, (const wchar_t *s1, const wchar_t *s2, size_t n) _GL_ATTRIBUTE_PURE); # endif _GL_CXXALIAS_SYS (wcsncmp, int, (const wchar_t *s1, const wchar_t *s2, size_t n)); # if __GLIBC__ >= 2 _GL_CXXALIASWARN (wcsncmp); # endif #elif defined GNULIB_POSIXCHECK # undef wcsncmp # if HAVE_RAW_DECL_WCSNCMP _GL_WARN_ON_USE (wcsncmp, "wcsncmp is unportable - " "use gnulib module wcsncmp for portability"); # endif #endif /* Compare S1 and S2, ignoring case. */ #if @GNULIB_WCSCASECMP@ # if !@HAVE_WCSCASECMP@ _GL_FUNCDECL_SYS (wcscasecmp, int, (const wchar_t *s1, const wchar_t *s2) _GL_ATTRIBUTE_PURE); # endif _GL_CXXALIAS_SYS (wcscasecmp, int, (const wchar_t *s1, const wchar_t *s2)); _GL_CXXALIASWARN (wcscasecmp); #elif defined GNULIB_POSIXCHECK # undef wcscasecmp # if HAVE_RAW_DECL_WCSCASECMP _GL_WARN_ON_USE (wcscasecmp, "wcscasecmp is unportable - " "use gnulib module wcscasecmp for portability"); # endif #endif /* Compare no more than N chars of S1 and S2, ignoring case. */ #if @GNULIB_WCSNCASECMP@ # if !@HAVE_WCSNCASECMP@ _GL_FUNCDECL_SYS (wcsncasecmp, int, (const wchar_t *s1, const wchar_t *s2, size_t n) _GL_ATTRIBUTE_PURE); # endif _GL_CXXALIAS_SYS (wcsncasecmp, int, (const wchar_t *s1, const wchar_t *s2, size_t n)); _GL_CXXALIASWARN (wcsncasecmp); #elif defined GNULIB_POSIXCHECK # undef wcsncasecmp # if HAVE_RAW_DECL_WCSNCASECMP _GL_WARN_ON_USE (wcsncasecmp, "wcsncasecmp is unportable - " "use gnulib module wcsncasecmp for portability"); # endif #endif /* Compare S1 and S2, both interpreted as appropriate to the LC_COLLATE category of the current locale. */ #if @GNULIB_WCSCOLL@ # if !@HAVE_WCSCOLL@ _GL_FUNCDECL_SYS (wcscoll, int, (const wchar_t *s1, const wchar_t *s2)); # endif _GL_CXXALIAS_SYS (wcscoll, int, (const wchar_t *s1, const wchar_t *s2)); # if __GLIBC__ >= 2 _GL_CXXALIASWARN (wcscoll); # endif #elif defined GNULIB_POSIXCHECK # undef wcscoll # if HAVE_RAW_DECL_WCSCOLL _GL_WARN_ON_USE (wcscoll, "wcscoll is unportable - " "use gnulib module wcscoll for portability"); # endif #endif /* Transform S2 into array pointed to by S1 such that if wcscmp is applied to two transformed strings the result is the as applying 'wcscoll' to the original strings. */ #if @GNULIB_WCSXFRM@ # if !@HAVE_WCSXFRM@ _GL_FUNCDECL_SYS (wcsxfrm, size_t, (wchar_t *restrict s1, const wchar_t *restrict s2, size_t n)); # endif _GL_CXXALIAS_SYS (wcsxfrm, size_t, (wchar_t *restrict s1, const wchar_t *restrict s2, size_t n)); # if __GLIBC__ >= 2 _GL_CXXALIASWARN (wcsxfrm); # endif #elif defined GNULIB_POSIXCHECK # undef wcsxfrm # if HAVE_RAW_DECL_WCSXFRM _GL_WARN_ON_USE (wcsxfrm, "wcsxfrm is unportable - " "use gnulib module wcsxfrm for portability"); # endif #endif /* Duplicate S, returning an identical malloc'd string. */ #if @GNULIB_WCSDUP@ # if !@HAVE_WCSDUP@ _GL_FUNCDECL_SYS (wcsdup, wchar_t *, (const wchar_t *s)); # endif _GL_CXXALIAS_SYS (wcsdup, wchar_t *, (const wchar_t *s)); _GL_CXXALIASWARN (wcsdup); #elif defined GNULIB_POSIXCHECK # undef wcsdup # if HAVE_RAW_DECL_WCSDUP _GL_WARN_ON_USE (wcsdup, "wcsdup is unportable - " "use gnulib module wcsdup for portability"); # endif #endif /* Find the first occurrence of WC in WCS. */ #if @GNULIB_WCSCHR@ # if !@HAVE_WCSCHR@ _GL_FUNCDECL_SYS (wcschr, wchar_t *, (const wchar_t *wcs, wchar_t wc) _GL_ATTRIBUTE_PURE); # endif /* On some systems, this function is defined as an overloaded function: extern "C++" { const wchar_t * std::wcschr (const wchar_t *, wchar_t); wchar_t * std::wcschr (wchar_t *, wchar_t); } */ _GL_CXXALIAS_SYS_CAST2 (wcschr, wchar_t *, (const wchar_t *, wchar_t), const wchar_t *, (const wchar_t *, wchar_t)); # if ((__GLIBC__ == 2 && __GLIBC_MINOR__ >= 10) && !defined __UCLIBC__) \ && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4)) _GL_CXXALIASWARN1 (wcschr, wchar_t *, (wchar_t *wcs, wchar_t wc)); _GL_CXXALIASWARN1 (wcschr, const wchar_t *, (const wchar_t *wcs, wchar_t wc)); # elif __GLIBC__ >= 2 _GL_CXXALIASWARN (wcschr); # endif #elif defined GNULIB_POSIXCHECK # undef wcschr # if HAVE_RAW_DECL_WCSCHR _GL_WARN_ON_USE (wcschr, "wcschr is unportable - " "use gnulib module wcschr for portability"); # endif #endif /* Find the last occurrence of WC in WCS. */ #if @GNULIB_WCSRCHR@ # if !@HAVE_WCSRCHR@ _GL_FUNCDECL_SYS (wcsrchr, wchar_t *, (const wchar_t *wcs, wchar_t wc) _GL_ATTRIBUTE_PURE); # endif /* On some systems, this function is defined as an overloaded function: extern "C++" { const wchar_t * std::wcsrchr (const wchar_t *, wchar_t); wchar_t * std::wcsrchr (wchar_t *, wchar_t); } */ _GL_CXXALIAS_SYS_CAST2 (wcsrchr, wchar_t *, (const wchar_t *, wchar_t), const wchar_t *, (const wchar_t *, wchar_t)); # if ((__GLIBC__ == 2 && __GLIBC_MINOR__ >= 10) && !defined __UCLIBC__) \ && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4)) _GL_CXXALIASWARN1 (wcsrchr, wchar_t *, (wchar_t *wcs, wchar_t wc)); _GL_CXXALIASWARN1 (wcsrchr, const wchar_t *, (const wchar_t *wcs, wchar_t wc)); # elif __GLIBC__ >= 2 _GL_CXXALIASWARN (wcsrchr); # endif #elif defined GNULIB_POSIXCHECK # undef wcsrchr # if HAVE_RAW_DECL_WCSRCHR _GL_WARN_ON_USE (wcsrchr, "wcsrchr is unportable - " "use gnulib module wcsrchr for portability"); # endif #endif /* Return the length of the initial segmet of WCS which consists entirely of wide characters not in REJECT. */ #if @GNULIB_WCSCSPN@ # if !@HAVE_WCSCSPN@ _GL_FUNCDECL_SYS (wcscspn, size_t, (const wchar_t *wcs, const wchar_t *reject) _GL_ATTRIBUTE_PURE); # endif _GL_CXXALIAS_SYS (wcscspn, size_t, (const wchar_t *wcs, const wchar_t *reject)); # if __GLIBC__ >= 2 _GL_CXXALIASWARN (wcscspn); # endif #elif defined GNULIB_POSIXCHECK # undef wcscspn # if HAVE_RAW_DECL_WCSCSPN _GL_WARN_ON_USE (wcscspn, "wcscspn is unportable - " "use gnulib module wcscspn for portability"); # endif #endif /* Return the length of the initial segmet of WCS which consists entirely of wide characters in ACCEPT. */ #if @GNULIB_WCSSPN@ # if !@HAVE_WCSSPN@ _GL_FUNCDECL_SYS (wcsspn, size_t, (const wchar_t *wcs, const wchar_t *accept) _GL_ATTRIBUTE_PURE); # endif _GL_CXXALIAS_SYS (wcsspn, size_t, (const wchar_t *wcs, const wchar_t *accept)); # if __GLIBC__ >= 2 _GL_CXXALIASWARN (wcsspn); # endif #elif defined GNULIB_POSIXCHECK # undef wcsspn # if HAVE_RAW_DECL_WCSSPN _GL_WARN_ON_USE (wcsspn, "wcsspn is unportable - " "use gnulib module wcsspn for portability"); # endif #endif /* Find the first occurrence in WCS of any character in ACCEPT. */ #if @GNULIB_WCSPBRK@ # if !@HAVE_WCSPBRK@ _GL_FUNCDECL_SYS (wcspbrk, wchar_t *, (const wchar_t *wcs, const wchar_t *accept) _GL_ATTRIBUTE_PURE); # endif /* On some systems, this function is defined as an overloaded function: extern "C++" { const wchar_t * std::wcspbrk (const wchar_t *, const wchar_t *); wchar_t * std::wcspbrk (wchar_t *, const wchar_t *); } */ _GL_CXXALIAS_SYS_CAST2 (wcspbrk, wchar_t *, (const wchar_t *, const wchar_t *), const wchar_t *, (const wchar_t *, const wchar_t *)); # if ((__GLIBC__ == 2 && __GLIBC_MINOR__ >= 10) && !defined __UCLIBC__) \ && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4)) _GL_CXXALIASWARN1 (wcspbrk, wchar_t *, (wchar_t *wcs, const wchar_t *accept)); _GL_CXXALIASWARN1 (wcspbrk, const wchar_t *, (const wchar_t *wcs, const wchar_t *accept)); # elif __GLIBC__ >= 2 _GL_CXXALIASWARN (wcspbrk); # endif #elif defined GNULIB_POSIXCHECK # undef wcspbrk # if HAVE_RAW_DECL_WCSPBRK _GL_WARN_ON_USE (wcspbrk, "wcspbrk is unportable - " "use gnulib module wcspbrk for portability"); # endif #endif /* Find the first occurrence of NEEDLE in HAYSTACK. */ #if @GNULIB_WCSSTR@ # if !@HAVE_WCSSTR@ _GL_FUNCDECL_SYS (wcsstr, wchar_t *, (const wchar_t *restrict haystack, const wchar_t *restrict needle) _GL_ATTRIBUTE_PURE); # endif /* On some systems, this function is defined as an overloaded function: extern "C++" { const wchar_t * std::wcsstr (const wchar_t *, const wchar_t *); wchar_t * std::wcsstr (wchar_t *, const wchar_t *); } */ _GL_CXXALIAS_SYS_CAST2 (wcsstr, wchar_t *, (const wchar_t *restrict, const wchar_t *restrict), const wchar_t *, (const wchar_t *restrict, const wchar_t *restrict)); # if ((__GLIBC__ == 2 && __GLIBC_MINOR__ >= 10) && !defined __UCLIBC__) \ && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4)) _GL_CXXALIASWARN1 (wcsstr, wchar_t *, (wchar_t *restrict haystack, const wchar_t *restrict needle)); _GL_CXXALIASWARN1 (wcsstr, const wchar_t *, (const wchar_t *restrict haystack, const wchar_t *restrict needle)); # elif __GLIBC__ >= 2 _GL_CXXALIASWARN (wcsstr); # endif #elif defined GNULIB_POSIXCHECK # undef wcsstr # if HAVE_RAW_DECL_WCSSTR _GL_WARN_ON_USE (wcsstr, "wcsstr is unportable - " "use gnulib module wcsstr for portability"); # endif #endif /* Divide WCS into tokens separated by characters in DELIM. */ #if @GNULIB_WCSTOK@ # if @REPLACE_WCSTOK@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef wcstok # define wcstok rpl_wcstok # endif _GL_FUNCDECL_RPL (wcstok, wchar_t *, (wchar_t *restrict wcs, const wchar_t *restrict delim, wchar_t **restrict ptr)); _GL_CXXALIAS_RPL (wcstok, wchar_t *, (wchar_t *restrict wcs, const wchar_t *restrict delim, wchar_t **restrict ptr)); # else # if !@HAVE_WCSTOK@ _GL_FUNCDECL_SYS (wcstok, wchar_t *, (wchar_t *restrict wcs, const wchar_t *restrict delim, wchar_t **restrict ptr)); # endif _GL_CXXALIAS_SYS (wcstok, wchar_t *, (wchar_t *restrict wcs, const wchar_t *restrict delim, wchar_t **restrict ptr)); # endif # if __GLIBC__ >= 2 _GL_CXXALIASWARN (wcstok); # endif #elif defined GNULIB_POSIXCHECK # undef wcstok # if HAVE_RAW_DECL_WCSTOK _GL_WARN_ON_USE (wcstok, "wcstok is unportable - " "use gnulib module wcstok for portability"); # endif #endif /* Determine number of column positions required for first N wide characters (or fewer if S ends before this) in S. */ #if @GNULIB_WCSWIDTH@ # if @REPLACE_WCSWIDTH@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef wcswidth # define wcswidth rpl_wcswidth # endif _GL_FUNCDECL_RPL (wcswidth, int, (const wchar_t *s, size_t n) _GL_ATTRIBUTE_PURE); _GL_CXXALIAS_RPL (wcswidth, int, (const wchar_t *s, size_t n)); # else # if !@HAVE_WCSWIDTH@ _GL_FUNCDECL_SYS (wcswidth, int, (const wchar_t *s, size_t n) _GL_ATTRIBUTE_PURE); # endif _GL_CXXALIAS_SYS (wcswidth, int, (const wchar_t *s, size_t n)); # endif # if __GLIBC__ >= 2 _GL_CXXALIASWARN (wcswidth); # endif #elif defined GNULIB_POSIXCHECK # undef wcswidth # if HAVE_RAW_DECL_WCSWIDTH _GL_WARN_ON_USE (wcswidth, "wcswidth is unportable - " "use gnulib module wcswidth for portability"); # endif #endif /* Convert *TP to a date and time wide string. See . */ #if @GNULIB_WCSFTIME@ # if @REPLACE_WCSFTIME@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef wcsftime # define wcsftime rpl_wcsftime # endif _GL_FUNCDECL_RPL (wcsftime, size_t, (wchar_t *restrict __buf, size_t __bufsize, const wchar_t *restrict __fmt, const struct tm *restrict __tp) _GL_ARG_NONNULL ((1, 3, 4))); _GL_CXXALIAS_RPL (wcsftime, size_t, (wchar_t *restrict __buf, size_t __bufsize, const wchar_t *restrict __fmt, const struct tm *restrict __tp)); # else # if !@HAVE_WCSFTIME@ _GL_FUNCDECL_SYS (wcsftime, size_t, (wchar_t *restrict __buf, size_t __bufsize, const wchar_t *restrict __fmt, const struct tm *restrict __tp) _GL_ARG_NONNULL ((1, 3, 4))); # endif _GL_CXXALIAS_SYS (wcsftime, size_t, (wchar_t *restrict __buf, size_t __bufsize, const wchar_t *restrict __fmt, const struct tm *restrict __tp)); # endif # if __GLIBC__ >= 2 _GL_CXXALIASWARN (wcsftime); # endif #elif defined GNULIB_POSIXCHECK # undef wcsftime # if HAVE_RAW_DECL_WCSFTIME _GL_WARN_ON_USE (wcsftime, "wcsftime is unportable - " "use gnulib module wcsftime for portability"); # endif #endif #endif /* _@GUARD_PREFIX@_WCHAR_H */ #endif /* _@GUARD_PREFIX@_WCHAR_H */ #endif pspp-1.4.1/gl/time-internal.h0000644000175000017500000000355613723215640015452 0ustar00blpblp00000000000000/* Time internal interface Copyright 2015-2020 Free Software Foundation, Inc. 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 3, 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, see . */ /* Written by Paul Eggert. */ /* A time zone rule. */ struct tm_zone { /* More abbreviations, should they be needed. Their TZ_IS_SET members are zero. */ struct tm_zone *next; #if HAVE_TZNAME && !HAVE_TM_ZONE /* Copies of recent strings taken from tzname[0] and tzname[1]. The copies are in ABBRS, so that they survive tzset. Null if unknown. */ char *tzname_copy[2]; #endif /* If nonzero, the rule represents the TZ environment variable set to the first "abbreviation" (this may be the empty string). Otherwise, it represents an unset TZ. */ char tz_is_set; /* A sequence of null-terminated strings packed next to each other. The strings are followed by an extra null byte. If TZ_IS_SET, there must be at least one string and the first string (which is actually a TZ environment value) may be empty. Otherwise all strings must be nonempty. Abbreviations are stored here because otherwise the values of tm_zone and/or tzname would be dead after changing TZ and calling tzset. Abbreviations never move once allocated, and are live until tzfree is called. */ char abbrs[FLEXIBLE_ARRAY_MEMBER]; }; pspp-1.4.1/gl/ftoastr.c0000644000175000017500000001075013723215636014356 0ustar00blpblp00000000000000/* floating point to accurate string Copyright (C) 2010-2020 Free Software Foundation, Inc. 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 3 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, see . */ /* Written by Paul Eggert. */ /* This code can misbehave on some buggy or older platforms, when operating on arguments on floating types other than 'double', or when given unusual combinations of options. Gnulib's snprintf-posix module works around many of these problems. This code relies on sprintf, strtod, etc. operating accurately; otherwise, the resulting strings could be inaccurate or too long. */ #include #include "ftoastr.h" #include #include #include #ifdef C_LOCALE # include "c-snprintf.h" # include "c-strtod.h" # define PREFIX(name) c_ ## name #else # define PREFIX(name) name #endif #if LENGTH == 3 # define FLOAT long double # define FLOAT_DIG LDBL_DIG # define FLOAT_MIN LDBL_MIN # define FLOAT_PREC_BOUND _GL_LDBL_PREC_BOUND # define FTOASTR PREFIX (ldtoastr) # define PROMOTED_FLOAT long double # define STRTOF PREFIX (strtold) #elif LENGTH == 2 # define FLOAT double # define FLOAT_DIG DBL_DIG # define FLOAT_MIN DBL_MIN # define FLOAT_PREC_BOUND _GL_DBL_PREC_BOUND # define FTOASTR PREFIX (dtoastr) # define PROMOTED_FLOAT double #else # define LENGTH 1 # define FLOAT float # define FLOAT_DIG FLT_DIG # define FLOAT_MIN FLT_MIN # define FLOAT_PREC_BOUND _GL_FLT_PREC_BOUND # define FTOASTR PREFIX (ftoastr) # define PROMOTED_FLOAT double # if HAVE_STRTOF # define STRTOF strtof # endif #endif /* On pre-C99 hosts, approximate strtof with strtod. This may generate one or two extra digits, but that's better than not working at all. */ #ifndef STRTOF # define STRTOF PREFIX (strtod) #endif /* On hosts where it's not known that snprintf works, use sprintf to implement the subset needed here. Typically BUFSIZE is big enough and there's little or no performance hit. */ #ifdef C_LOCALE # undef snprintf # define snprintf c_snprintf #elif ! GNULIB_SNPRINTF # undef snprintf # define snprintf ftoastr_snprintf static int ftoastr_snprintf (char *buf, size_t bufsize, char const *format, int width, int prec, FLOAT x) { PROMOTED_FLOAT promoted_x = x; char width_0_buffer[LENGTH == 1 ? FLT_BUFSIZE_BOUND : LENGTH == 2 ? DBL_BUFSIZE_BOUND : LDBL_BUFSIZE_BOUND]; int n = width; if (bufsize < sizeof width_0_buffer) { n = sprintf (width_0_buffer, format, 0, prec, promoted_x); if (n < 0) return n; if (n < width) n = width; } if (n < bufsize) n = sprintf (buf, format, width, prec, promoted_x); return n; } #endif int FTOASTR (char *buf, size_t bufsize, int flags, int width, FLOAT x) { /* The following method is simple but slow. For ideas about speeding things up, please see: Andrysco M, Jhala R, Lerner S. Printing floating-point numbers: a faster, always correct method. ACM SIGPLAN notices - POPL '16. 2016;51(1):555-67 ; draft at . */ PROMOTED_FLOAT promoted_x = x; char format[sizeof "%-+ 0*.*Lg"]; FLOAT abs_x = x < 0 ? -x : x; int prec; char *p = format; *p++ = '%'; /* Support flags that generate output parsable by strtof. */ *p = '-'; p += (flags & FTOASTR_LEFT_JUSTIFY ) != 0; *p = '+'; p += (flags & FTOASTR_ALWAYS_SIGNED ) != 0; *p = ' '; p += (flags & FTOASTR_SPACE_POSITIVE) != 0; *p = '0'; p += (flags & FTOASTR_ZERO_PAD ) != 0; *p++ = '*'; *p++ = '.'; *p++ = '*'; *p = 'L'; p += 2 < LENGTH; *p++ = flags & FTOASTR_UPPER_E ? 'G' : 'g'; *p = '\0'; for (prec = abs_x < FLOAT_MIN ? 1 : FLOAT_DIG; ; prec++) { int n = snprintf (buf, bufsize, format, width, prec, promoted_x); if (n < 0 || FLOAT_PREC_BOUND <= prec || (n < bufsize && STRTOF (buf, NULL) == x)) return n; } } pspp-1.4.1/gl/count-one-bits.c0000644000175000017500000000027713723215636015545 0ustar00blpblp00000000000000#include #define COUNT_ONE_BITS_INLINE _GL_EXTERN_INLINE #include "count-one-bits.h" #if 1500 <= _MSC_VER && (defined _M_IX86 || defined _M_X64) int popcount_support = -1; #endif pspp-1.4.1/gl/unigbrk.in.h0000644000175000017500000001071613723215640014744 0ustar00blpblp00000000000000/* Grapheme cluster breaks in Unicode strings. Copyright (C) 2010-2020 Free Software Foundation, Inc. Written by Ben Pfaff , 2010. 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 3 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, see . */ #ifndef _UNIGBRK_H #define _UNIGBRK_H /* Get bool. */ #include /* Get size_t. */ #include #include "unitypes.h" #ifdef __cplusplus extern "C" { #endif /* ========================================================================= */ /* Property defined in Unicode Standard Annex #29, section "Grapheme Cluster Boundaries" */ /* Possible values of the Grapheme_Cluster_Break property. This enumeration may be extended in the future. */ enum { GBP_OTHER = 0, GBP_CR = 1, GBP_LF = 2, GBP_CONTROL = 3, GBP_EXTEND = 4, GBP_PREPEND = 5, GBP_SPACINGMARK = 6, GBP_L = 7, GBP_V = 8, GBP_T = 9, GBP_LV = 10, GBP_LVT = 11, GBP_RI = 12, GBP_ZWJ = 13, GBP_EB = 14, GBP_EM = 15, GBP_GAZ = 16, GBP_EBG = 17 }; /* Return the Grapheme_Cluster_Break property of a Unicode character. */ extern int uc_graphemeclusterbreak_property (ucs4_t uc) _UC_ATTRIBUTE_CONST; /* ========================================================================= */ /* Grapheme cluster breaks. */ /* Returns true if there is a grapheme cluster boundary between Unicode code points A and B. A "grapheme cluster" is an approximation to a user-perceived character, which sometimes corresponds to multiple code points. For example, an English letter followed by an acute accent can be expressed as two consecutive Unicode code points, but it is perceived by the user as only a single character and therefore constitutes a single grapheme cluster. Implements extended (not legacy) grapheme cluster rules, because UAX #29 indicates that they are preferred. Use A == 0 or B == 0 to indicate start of text or end of text, respectively. */ extern bool uc_is_grapheme_break (ucs4_t a, ucs4_t b) _UC_ATTRIBUTE_CONST; /* Returns the start of the next grapheme cluster following S, or NULL if the end of the string has been reached. */ extern const uint8_t * u8_grapheme_next (const uint8_t *s, const uint8_t *end) _UC_ATTRIBUTE_PURE; extern const uint16_t * u16_grapheme_next (const uint16_t *s, const uint16_t *end) _UC_ATTRIBUTE_PURE; extern const uint32_t * u32_grapheme_next (const uint32_t *s, const uint32_t *end) _UC_ATTRIBUTE_PURE; /* Returns the start of the previous grapheme cluster before S, or NULL if the start of the string has been reached. */ extern const uint8_t * u8_grapheme_prev (const uint8_t *s, const uint8_t *start) _UC_ATTRIBUTE_PURE; extern const uint16_t * u16_grapheme_prev (const uint16_t *s, const uint16_t *start) _UC_ATTRIBUTE_PURE; extern const uint32_t * u32_grapheme_prev (const uint32_t *s, const uint32_t *start) _UC_ATTRIBUTE_PURE; /* Determine the grapheme cluster boundaries in S, and store the result at p[0..n-1]. p[i] = 1 means that a new grapheme cluster begins at s[i]. p[i] = 0 means that s[i-1] and s[i] are part of the same grapheme cluster. p[0] will always be 1. */ extern void u8_grapheme_breaks (const uint8_t *s, size_t n, char *p); extern void u16_grapheme_breaks (const uint16_t *s, size_t n, char *p); extern void u32_grapheme_breaks (const uint32_t *s, size_t n, char *p); extern void ulc_grapheme_breaks (const char *s, size_t n, char *p); extern void uc_grapheme_breaks (const ucs4_t *s, size_t n, char *p); /* ========================================================================= */ #ifdef __cplusplus } #endif #endif /* _UNIGBRK_H */ pspp-1.4.1/gl/vasnprintf.h0000644000175000017500000000460513723215640015070 0ustar00blpblp00000000000000/* vsprintf with automatic memory allocation. Copyright (C) 2002-2004, 2007-2020 Free Software Foundation, Inc. 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 3, 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, see . */ #ifndef _VASNPRINTF_H #define _VASNPRINTF_H /* Get va_list. */ #include /* Get size_t. */ #include #ifdef __cplusplus extern "C" { #endif /* Write formatted output to a string dynamically allocated with malloc(). You can pass a preallocated buffer for the result in RESULTBUF and its size in *LENGTHP; otherwise you pass RESULTBUF = NULL. If successful, return the address of the string (this may be = RESULTBUF if no dynamic memory allocation was necessary) and set *LENGTHP to the number of resulting bytes, excluding the trailing NUL. Upon error, set errno and return NULL. When dynamic memory allocation occurs, the preallocated buffer is left alone (with possibly modified contents). This makes it possible to use a statically allocated or stack-allocated buffer, like this: char buf[100]; size_t len = sizeof (buf); char *output = vasnprintf (buf, &len, format, args); if (output == NULL) ... error handling ...; else { ... use the output string ...; if (output != buf) free (output); } */ #if REPLACE_VASNPRINTF # define asnprintf rpl_asnprintf # define vasnprintf rpl_vasnprintf #endif extern char * asnprintf (char *restrict resultbuf, size_t *lengthp, const char *format, ...) _GL_ATTRIBUTE_FORMAT ((__printf__, 3, 4)); extern char * vasnprintf (char *restrict resultbuf, size_t *lengthp, const char *format, va_list args) _GL_ATTRIBUTE_FORMAT ((__printf__, 3, 0)); #ifdef __cplusplus } #endif #endif /* _VASNPRINTF_H */ pspp-1.4.1/gl/mbtowc-lock.c0000644000175000017500000001042513723215637015115 0ustar00blpblp00000000000000/* Return the internal lock used by mbrtowc and mbrtoc32. Copyright (C) 2019-2020 Free Software Foundation, Inc. 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 3 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, see . */ /* Written by Bruno Haible , 2019-2020. */ #include /* When it is known that the gl_get_mbtowc_lock function is defined by a dependency library, it should not be defined here. */ #if OMIT_MBTOWC_LOCK /* This declaration is solely to ensure that after preprocessing this file is never empty. */ typedef int dummy; #else /* This file defines the internal lock used by mbrtowc and mbrtoc32. It is a separate compilation unit, so that only one copy of it is present when linking statically. */ /* Prohibit renaming this symbol. */ # undef gl_get_mbtowc_lock /* Macro for exporting a symbol (function, not variable) defined in this file, when compiled into a shared library. */ # ifndef DLL_EXPORTED # if HAVE_VISIBILITY /* Override the effect of the compiler option '-fvisibility=hidden'. */ # define DLL_EXPORTED __attribute__((__visibility__("default"))) # elif defined _WIN32 || defined __CYGWIN__ # define DLL_EXPORTED __declspec(dllexport) # else # define DLL_EXPORTED # endif # endif # if defined _WIN32 && !defined __CYGWIN__ # define WIN32_LEAN_AND_MEAN /* avoid including junk */ # include # include "windows-initguard.h" /* The return type is a 'CRITICAL_SECTION *', not a 'glwthread_mutex_t *', because the latter is not guaranteed to be a stable ABI in the future. */ /* Make sure the function gets exported from DLLs. */ DLL_EXPORTED CRITICAL_SECTION *gl_get_mbtowc_lock (void); static glwthread_initguard_t guard = GLWTHREAD_INITGUARD_INIT; static CRITICAL_SECTION lock; /* Returns the internal lock used by mbrtowc and mbrtoc32. */ CRITICAL_SECTION * gl_get_mbtowc_lock (void) { if (!guard.done) { if (InterlockedIncrement (&guard.started) == 0) { /* This thread is the first one to need the lock. Initialize it. */ InitializeCriticalSection (&lock); guard.done = 1; } else { /* Don't let guard.started grow and wrap around. */ InterlockedDecrement (&guard.started); /* Yield the CPU while waiting for another thread to finish initializing this mutex. */ while (!guard.done) Sleep (0); } } return &lock; } # elif HAVE_PTHREAD_API # include static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; /* Make sure the function gets exported from shared libraries. */ DLL_EXPORTED pthread_mutex_t *gl_get_mbtowc_lock (void); /* Returns the internal lock used by mbrtowc and mbrtoc32. */ pthread_mutex_t * gl_get_mbtowc_lock (void) { return &mutex; } # elif HAVE_THREADS_H # include # include static int volatile init_needed = 1; static once_flag init_once = ONCE_FLAG_INIT; static mtx_t mutex; static void atomic_init (void) { if (mtx_init (&mutex, mtx_plain) != thrd_success) abort (); init_needed = 0; } /* Make sure the function gets exported from shared libraries. */ DLL_EXPORTED mtx_t *gl_get_mbtowc_lock (void); /* Returns the internal lock used by mbrtowc and mbrtoc32. */ mtx_t * gl_get_mbtowc_lock (void) { if (init_needed) call_once (&init_once, atomic_init); return &mutex; } # endif # if (defined _WIN32 || defined __CYGWIN__) && !defined _MSC_VER /* Make sure the '__declspec(dllimport)' in mbrtowc.c and mbrtoc32.c does not cause a link failure when no DLLs are involved. */ # if defined _WIN64 || defined _LP64 # define IMP(x) __imp_##x # else # define IMP(x) _imp__##x # endif void * IMP(gl_get_mbtowc_lock) = &gl_get_mbtowc_lock; # endif #endif pspp-1.4.1/gl/md4.c0000644000175000017500000002522213723215637013361 0ustar00blpblp00000000000000/* Functions to compute MD4 message digest of files or memory blocks. according to the definition of MD4 in RFC 1320 from April 1992. Copyright (C) 1995-1997, 1999-2003, 2005-2006, 2008-2020 Free Software Foundation, Inc. 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 3, 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, see . */ /* Adapted by Simon Josefsson from gnulib md5.? and Libgcrypt cipher/md4.c . */ #include #include "md4.h" #include #include #include #include #include #if USE_UNLOCKED_IO # include "unlocked-io.h" #endif #include #ifdef WORDS_BIGENDIAN # define SWAP(n) bswap_32 (n) #else # define SWAP(n) (n) #endif #define BLOCKSIZE 32768 #if BLOCKSIZE % 64 != 0 # error "invalid BLOCKSIZE" #endif /* This array contains the bytes used to pad the buffer to the next 64-byte boundary. (RFC 1320, 3.1: Step 1) */ static const unsigned char fillbuf[64] = { 0x80, 0 /* , 0, 0, ... */ }; /* Initialize structure containing state of computation. (RFC 1320, 3.3: Step 3) */ void md4_init_ctx (struct md4_ctx *ctx) { ctx->A = 0x67452301; ctx->B = 0xefcdab89; ctx->C = 0x98badcfe; ctx->D = 0x10325476; ctx->total[0] = ctx->total[1] = 0; ctx->buflen = 0; } /* Copy the 4 byte value from v into the memory location pointed to by *cp, If your architecture allows unaligned access this is equivalent to * (uint32_t *) cp = v */ static void set_uint32 (char *cp, uint32_t v) { memcpy (cp, &v, sizeof v); } /* Put result from CTX in first 16 bytes following RESBUF. The result must be in little endian byte order. */ void * md4_read_ctx (const struct md4_ctx *ctx, void *resbuf) { char *r = resbuf; set_uint32 (r + 0 * sizeof ctx->A, SWAP (ctx->A)); set_uint32 (r + 1 * sizeof ctx->B, SWAP (ctx->B)); set_uint32 (r + 2 * sizeof ctx->C, SWAP (ctx->C)); set_uint32 (r + 3 * sizeof ctx->D, SWAP (ctx->D)); return resbuf; } /* Process the remaining bytes in the internal buffer and the usual prolog according to the standard and write the result to RESBUF. */ void * md4_finish_ctx (struct md4_ctx *ctx, void *resbuf) { /* Take yet unprocessed bytes into account. */ uint32_t bytes = ctx->buflen; size_t pad; /* Now count remaining bytes. */ ctx->total[0] += bytes; if (ctx->total[0] < bytes) ++ctx->total[1]; pad = bytes >= 56 ? 64 + 56 - bytes : 56 - bytes; memcpy (&((char*)ctx->buffer)[bytes], fillbuf, pad); /* Put the 64-bit file length in *bits* at the end of the buffer. */ ctx->buffer[(bytes + pad) / 4] = SWAP (ctx->total[0] << 3); ctx->buffer[(bytes + pad) / 4 + 1] = SWAP ((ctx->total[1] << 3) | (ctx->total[0] >> 29)); /* Process last bytes. */ md4_process_block (ctx->buffer, bytes + pad + 8, ctx); return md4_read_ctx (ctx, resbuf); } /* Compute MD4 message digest for bytes read from STREAM. The resulting message digest number will be written into the 16 bytes beginning at RESBLOCK. */ int md4_stream (FILE * stream, void *resblock) { struct md4_ctx ctx; size_t sum; char *buffer = malloc (BLOCKSIZE + 72); if (!buffer) return 1; /* Initialize the computation context. */ md4_init_ctx (&ctx); /* Iterate over full file contents. */ while (1) { /* We read the file in blocks of BLOCKSIZE bytes. One call of the computation function processes the whole buffer so that with the next round of the loop another block can be read. */ size_t n; sum = 0; /* Read block. Take care for partial reads. */ while (1) { n = fread (buffer + sum, 1, BLOCKSIZE - sum, stream); sum += n; if (sum == BLOCKSIZE) break; if (n == 0) { /* Check for the error flag IFF N == 0, so that we don't exit the loop after a partial read due to e.g., EAGAIN or EWOULDBLOCK. */ if (ferror (stream)) { free (buffer); return 1; } goto process_partial_block; } /* We've read at least one byte, so ignore errors. But always check for EOF, since feof may be true even though N > 0. Otherwise, we could end up calling fread after EOF. */ if (feof (stream)) goto process_partial_block; } /* Process buffer with BLOCKSIZE bytes. Note that BLOCKSIZE % 64 == 0 */ md4_process_block (buffer, BLOCKSIZE, &ctx); } process_partial_block:; /* Process any remaining bytes. */ if (sum > 0) md4_process_bytes (buffer, sum, &ctx); /* Construct result in desired memory. */ md4_finish_ctx (&ctx, resblock); free (buffer); return 0; } /* Compute MD4 message digest for LEN bytes beginning at BUFFER. The result is always in little endian byte order, so that a byte-wise output yields to the wanted ASCII representation of the message digest. */ void * md4_buffer (const char *buffer, size_t len, void *resblock) { struct md4_ctx ctx; /* Initialize the computation context. */ md4_init_ctx (&ctx); /* Process whole buffer but last len % 64 bytes. */ md4_process_bytes (buffer, len, &ctx); /* Put result in desired memory area. */ return md4_finish_ctx (&ctx, resblock); } void md4_process_bytes (const void *buffer, size_t len, struct md4_ctx *ctx) { /* When we already have some bits in our internal buffer concatenate both inputs first. */ if (ctx->buflen != 0) { size_t left_over = ctx->buflen; size_t add = 128 - left_over > len ? len : 128 - left_over; memcpy (&((char*)ctx->buffer)[left_over], buffer, add); ctx->buflen += add; if (ctx->buflen > 64) { md4_process_block (ctx->buffer, ctx->buflen & ~63, ctx); ctx->buflen &= 63; /* The regions in the following copy operation cannot overlap. */ memcpy (ctx->buffer, &((char*)ctx->buffer)[(left_over + add) & ~63], ctx->buflen); } buffer = (const char *) buffer + add; len -= add; } /* Process available complete blocks. */ if (len >= 64) { #if !(_STRING_ARCH_unaligned || _STRING_INLINE_unaligned) # define UNALIGNED_P(p) ((uintptr_t) (p) % alignof (uint32_t) != 0) if (UNALIGNED_P (buffer)) while (len > 64) { md4_process_block (memcpy (ctx->buffer, buffer, 64), 64, ctx); buffer = (const char *) buffer + 64; len -= 64; } else #endif { md4_process_block (buffer, len & ~63, ctx); buffer = (const char *) buffer + (len & ~63); len &= 63; } } /* Move remaining bytes in internal buffer. */ if (len > 0) { size_t left_over = ctx->buflen; memcpy (&((char*)ctx->buffer)[left_over], buffer, len); left_over += len; if (left_over >= 64) { md4_process_block (ctx->buffer, 64, ctx); left_over -= 64; memcpy (ctx->buffer, &ctx->buffer[16], left_over); } ctx->buflen = left_over; } } /* --- Code below is the primary difference between md5.c and md4.c --- */ /* MD4 round constants */ #define K1 0x5a827999 #define K2 0x6ed9eba1 /* Round functions. */ #define F(x, y, z) ((z) ^ ((x) & ((y) ^ (z)))) #define G(x, y, z) (((x) & (y)) | ((x) & (z)) | ((y) & (z))) #define H(x, y, z) ((x) ^ (y) ^ (z)) #define rol(x, n) (((x) << (n)) | ((uint32_t) (x) >> (32 - (n)))) #define R1(a,b,c,d,k,s) a=rol(a+F(b,c,d)+x[k],s); #define R2(a,b,c,d,k,s) a=rol(a+G(b,c,d)+x[k]+K1,s); #define R3(a,b,c,d,k,s) a=rol(a+H(b,c,d)+x[k]+K2,s); /* Process LEN bytes of BUFFER, accumulating context into CTX. It is assumed that LEN % 64 == 0. */ void md4_process_block (const void *buffer, size_t len, struct md4_ctx *ctx) { const uint32_t *words = buffer; size_t nwords = len / sizeof (uint32_t); const uint32_t *endp = words + nwords; uint32_t x[16]; uint32_t A = ctx->A; uint32_t B = ctx->B; uint32_t C = ctx->C; uint32_t D = ctx->D; uint32_t lolen = len; /* First increment the byte count. RFC 1320 specifies the possible length of the file up to 2^64 bits. Here we only compute the number of bytes. Do a double word increment. */ ctx->total[0] += lolen; ctx->total[1] += (len >> 31 >> 1) + (ctx->total[0] < lolen); /* Process all bytes in the buffer with 64 bytes in each round of the loop. */ while (words < endp) { int t; for (t = 0; t < 16; t++) { x[t] = SWAP (*words); words++; } /* Round 1. */ R1 (A, B, C, D, 0, 3); R1 (D, A, B, C, 1, 7); R1 (C, D, A, B, 2, 11); R1 (B, C, D, A, 3, 19); R1 (A, B, C, D, 4, 3); R1 (D, A, B, C, 5, 7); R1 (C, D, A, B, 6, 11); R1 (B, C, D, A, 7, 19); R1 (A, B, C, D, 8, 3); R1 (D, A, B, C, 9, 7); R1 (C, D, A, B, 10, 11); R1 (B, C, D, A, 11, 19); R1 (A, B, C, D, 12, 3); R1 (D, A, B, C, 13, 7); R1 (C, D, A, B, 14, 11); R1 (B, C, D, A, 15, 19); /* Round 2. */ R2 (A, B, C, D, 0, 3); R2 (D, A, B, C, 4, 5); R2 (C, D, A, B, 8, 9); R2 (B, C, D, A, 12, 13); R2 (A, B, C, D, 1, 3); R2 (D, A, B, C, 5, 5); R2 (C, D, A, B, 9, 9); R2 (B, C, D, A, 13, 13); R2 (A, B, C, D, 2, 3); R2 (D, A, B, C, 6, 5); R2 (C, D, A, B, 10, 9); R2 (B, C, D, A, 14, 13); R2 (A, B, C, D, 3, 3); R2 (D, A, B, C, 7, 5); R2 (C, D, A, B, 11, 9); R2 (B, C, D, A, 15, 13); /* Round 3. */ R3 (A, B, C, D, 0, 3); R3 (D, A, B, C, 8, 9); R3 (C, D, A, B, 4, 11); R3 (B, C, D, A, 12, 15); R3 (A, B, C, D, 2, 3); R3 (D, A, B, C, 10, 9); R3 (C, D, A, B, 6, 11); R3 (B, C, D, A, 14, 15); R3 (A, B, C, D, 1, 3); R3 (D, A, B, C, 9, 9); R3 (C, D, A, B, 5, 11); R3 (B, C, D, A, 13, 15); R3 (A, B, C, D, 3, 3); R3 (D, A, B, C, 11, 9); R3 (C, D, A, B, 7, 11); R3 (B, C, D, A, 15, 15); A = ctx->A += A; B = ctx->B += B; C = ctx->C += C; D = ctx->D += D; } } pspp-1.4.1/gl/memrchr.c0000644000175000017500000001307613723215637014336 0ustar00blpblp00000000000000/* memrchr -- find the last occurrence of a byte in a memory block Copyright (C) 1991, 1993, 1996-1997, 1999-2000, 2003-2020 Free Software Foundation, Inc. Based on strlen implementation by Torbjorn Granlund (tege@sics.se), with help from Dan Sahlin (dan@sics.se) and commentary by Jim Blandy (jimb@ai.mit.edu); adaptation to memchr suggested by Dick Karpinski (dick@cca.ucsf.edu), and implemented by Roland McGrath (roland@ai.mit.edu). 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 3 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, see . */ #if defined _LIBC # include #else # include # define reg_char char #endif #include #include #undef __memrchr #ifdef _LIBC # undef memrchr #endif #ifndef weak_alias # define __memrchr memrchr #endif /* Search no more than N bytes of S for C. */ void * __memrchr (void const *s, int c_in, size_t n) { /* On 32-bit hardware, choosing longword to be a 32-bit unsigned long instead of a 64-bit uintmax_t tends to give better performance. On 64-bit hardware, unsigned long is generally 64 bits already. Change this typedef to experiment with performance. */ typedef unsigned long int longword; const unsigned char *char_ptr; const longword *longword_ptr; longword repeated_one; longword repeated_c; unsigned reg_char c; c = (unsigned char) c_in; /* Handle the last few bytes by reading one byte at a time. Do this until CHAR_PTR is aligned on a longword boundary. */ for (char_ptr = (const unsigned char *) s + n; n > 0 && (size_t) char_ptr % sizeof (longword) != 0; --n) if (*--char_ptr == c) return (void *) char_ptr; longword_ptr = (const void *) char_ptr; /* All these elucidatory comments refer to 4-byte longwords, but the theory applies equally well to any size longwords. */ /* Compute auxiliary longword values: repeated_one is a value which has a 1 in every byte. repeated_c has c in every byte. */ repeated_one = 0x01010101; repeated_c = c | (c << 8); repeated_c |= repeated_c << 16; if (0xffffffffU < (longword) -1) { repeated_one |= repeated_one << 31 << 1; repeated_c |= repeated_c << 31 << 1; if (8 < sizeof (longword)) { size_t i; for (i = 64; i < sizeof (longword) * 8; i *= 2) { repeated_one |= repeated_one << i; repeated_c |= repeated_c << i; } } } /* Instead of the traditional loop which tests each byte, we will test a longword at a time. The tricky part is testing if *any of the four* bytes in the longword in question are equal to c. We first use an xor with repeated_c. This reduces the task to testing whether *any of the four* bytes in longword1 is zero. We compute tmp = ((longword1 - repeated_one) & ~longword1) & (repeated_one << 7). That is, we perform the following operations: 1. Subtract repeated_one. 2. & ~longword1. 3. & a mask consisting of 0x80 in every byte. Consider what happens in each byte: - If a byte of longword1 is zero, step 1 and 2 transform it into 0xff, and step 3 transforms it into 0x80. A carry can also be propagated to more significant bytes. - If a byte of longword1 is nonzero, let its lowest 1 bit be at position k (0 <= k <= 7); so the lowest k bits are 0. After step 1, the byte ends in a single bit of value 0 and k bits of value 1. After step 2, the result is just k bits of value 1: 2^k - 1. After step 3, the result is 0. And no carry is produced. So, if longword1 has only non-zero bytes, tmp is zero. Whereas if longword1 has a zero byte, call j the position of the least significant zero byte. Then the result has a zero at positions 0, ..., j-1 and a 0x80 at position j. We cannot predict the result at the more significant bytes (positions j+1..3), but it does not matter since we already have a non-zero bit at position 8*j+7. So, the test whether any byte in longword1 is zero is equivalent to testing whether tmp is nonzero. */ while (n >= sizeof (longword)) { longword longword1 = *--longword_ptr ^ repeated_c; if ((((longword1 - repeated_one) & ~longword1) & (repeated_one << 7)) != 0) { longword_ptr++; break; } n -= sizeof (longword); } char_ptr = (const unsigned char *) longword_ptr; /* At this point, we know that either n < sizeof (longword), or one of the sizeof (longword) bytes starting at char_ptr is == c. On little-endian machines, we could determine the first such byte without any further memory accesses, just by looking at the tmp result from the last loop iteration. But this does not work on big-endian machines. Choose code that works in both cases. */ while (n-- > 0) { if (*--char_ptr == c) return (void *) char_ptr; } return NULL; } #ifdef weak_alias weak_alias (__memrchr, memrchr) #endif pspp-1.4.1/gl/ftello.c0000644000175000017500000000461113723215636014160 0ustar00blpblp00000000000000/* An ftello() function that works around platform bugs. Copyright (C) 2007, 2009-2020 Free Software Foundation, Inc. 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 3 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, see . */ #include /* Specification. */ #include /* Get lseek. */ #include #include "stdio-impl.h" off_t ftello (FILE *fp) #undef ftello #if !HAVE_FTELLO # undef ftell # define ftello ftell #endif #if _GL_WINDOWS_64_BIT_OFF_T # undef ftello # if HAVE__FTELLI64 /* msvc, mingw64 */ # define ftello _ftelli64 # else /* mingw */ # define ftello ftello64 # endif #endif { #if LSEEK_PIPE_BROKEN /* mingw gives bogus answers rather than failure on non-seekable files. */ if (lseek (fileno (fp), 0, SEEK_CUR) == -1) return -1; #endif #if FTELLO_BROKEN_AFTER_SWITCHING_FROM_READ_TO_WRITE /* Solaris */ /* The Solaris stdio leaves the _IOREAD flag set after reading from a file reaches EOF and the program then starts writing to the file. ftello gets confused by this. */ if (fp_->_flag & _IOWRT) { off_t pos; /* Call ftello nevertheless, for the side effects that it does on fp. */ ftello (fp); /* Compute the file position ourselves. */ pos = lseek (fileno (fp), (off_t) 0, SEEK_CUR); if (pos >= 0) { if ((fp_->_flag & _IONBF) == 0 && fp_->_base != NULL) pos += fp_->_ptr - fp_->_base; } return pos; } #endif #if defined __SL64 && defined __SCLE /* Cygwin */ if ((fp->_flags & __SL64) == 0) { /* Cygwin 1.5.0 through 1.5.24 failed to open stdin in 64-bit mode; but has an ftello that requires 64-bit mode. */ FILE *tmp = fopen ("/dev/null", "r"); if (!tmp) return -1; fp->_flags |= __SL64; fp->_seek64 = tmp->_seek64; fclose (tmp); } #endif return ftello (fp); } pspp-1.4.1/gl/open.c0000644000175000017500000001521713723215637013641 0ustar00blpblp00000000000000/* Open a descriptor to a file. Copyright (C) 2007-2020 Free Software Foundation, Inc. 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 3 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, see . */ /* Written by Bruno Haible , 2007. */ /* If the user's config.h happens to include , let it include only the system's here, so that orig_open doesn't recurse to rpl_open. */ #define __need_system_fcntl_h #include /* Get the original definition of open. It might be defined as a macro. */ #include #include #undef __need_system_fcntl_h static int orig_open (const char *filename, int flags, mode_t mode) { return open (filename, flags, mode); } /* Specification. */ /* Write "fcntl.h" here, not , otherwise OSF/1 5.1 DTK cc eliminates this include because of the preliminary #include above. */ #include "fcntl.h" #include "cloexec.h" #include #include #include #include #include #include #ifndef REPLACE_OPEN_DIRECTORY # define REPLACE_OPEN_DIRECTORY 0 #endif int open (const char *filename, int flags, ...) { /* 0 = unknown, 1 = yes, -1 = no. */ #if GNULIB_defined_O_CLOEXEC int have_cloexec = -1; #else static int have_cloexec; #endif mode_t mode; int fd; mode = 0; if (flags & O_CREAT) { va_list arg; va_start (arg, flags); /* We have to use PROMOTED_MODE_T instead of mode_t, otherwise GCC 4 creates crashing code when 'mode_t' is smaller than 'int'. */ mode = va_arg (arg, PROMOTED_MODE_T); va_end (arg); } #if GNULIB_defined_O_NONBLOCK /* The only known platform that lacks O_NONBLOCK is mingw, but it also lacks named pipes and Unix sockets, which are the only two file types that require non-blocking handling in open(). Therefore, it is safe to ignore O_NONBLOCK here. It is handy that mingw also lacks openat(), so that is also covered here. */ flags &= ~O_NONBLOCK; #endif #if defined _WIN32 && ! defined __CYGWIN__ if (strcmp (filename, "/dev/null") == 0) filename = "NUL"; #endif #if OPEN_TRAILING_SLASH_BUG /* Fail if one of O_CREAT, O_WRONLY, O_RDWR is specified and the filename ends in a slash, as POSIX says such a filename must name a directory : "A pathname that contains at least one non- character and that ends with one or more trailing characters shall not be resolved successfully unless the last pathname component before the trailing characters names an existing directory" If the named file already exists as a directory, then - if O_CREAT is specified, open() must fail because of the semantics of O_CREAT, - if O_WRONLY or O_RDWR is specified, open() must fail because POSIX says that it fails with errno = EISDIR in this case. If the named file does not exist or does not name a directory, then - if O_CREAT is specified, open() must fail since open() cannot create directories, - if O_WRONLY or O_RDWR is specified, open() must fail because the file does not contain a '.' directory. */ if ((flags & O_CREAT) || (flags & O_ACCMODE) == O_RDWR || (flags & O_ACCMODE) == O_WRONLY) { size_t len = strlen (filename); if (len > 0 && filename[len - 1] == '/') { errno = EISDIR; return -1; } } #endif fd = orig_open (filename, flags & ~(have_cloexec < 0 ? O_CLOEXEC : 0), mode); if (flags & O_CLOEXEC) { if (! have_cloexec) { if (0 <= fd) have_cloexec = 1; else if (errno == EINVAL) { fd = orig_open (filename, flags & ~O_CLOEXEC, mode); have_cloexec = -1; } } if (have_cloexec < 0 && 0 <= fd) set_cloexec_flag (fd, true); } #if REPLACE_FCHDIR /* Implementing fchdir and fdopendir requires the ability to open a directory file descriptor. If open doesn't support that (as on mingw), we use a dummy file that behaves the same as directories on Linux (ie. always reports EOF on attempts to read()), and override fstat() in fchdir.c to hide the fact that we have a dummy. */ if (REPLACE_OPEN_DIRECTORY && fd < 0 && errno == EACCES && ((flags & O_ACCMODE) == O_RDONLY || (O_SEARCH != O_RDONLY && (flags & O_ACCMODE) == O_SEARCH))) { struct stat statbuf; if (stat (filename, &statbuf) == 0 && S_ISDIR (statbuf.st_mode)) { /* Maximum recursion depth of 1. */ fd = open ("/dev/null", flags, mode); if (0 <= fd) fd = _gl_register_fd (fd, filename); } else errno = EACCES; } #endif #if OPEN_TRAILING_SLASH_BUG /* If the filename ends in a slash and fd does not refer to a directory, then fail. Rationale: POSIX says such a filename must name a directory : "A pathname that contains at least one non- character and that ends with one or more trailing characters shall not be resolved successfully unless the last pathname component before the trailing characters names an existing directory" If the named file without the slash is not a directory, open() must fail with ENOTDIR. */ if (fd >= 0) { /* We know len is positive, since open did not fail with ENOENT. */ size_t len = strlen (filename); if (filename[len - 1] == '/') { struct stat statbuf; if (fstat (fd, &statbuf) >= 0 && !S_ISDIR (statbuf.st_mode)) { close (fd); errno = ENOTDIR; return -1; } } } #endif #if REPLACE_FCHDIR if (!REPLACE_OPEN_DIRECTORY && 0 <= fd) fd = _gl_register_fd (fd, filename); #endif return fd; } pspp-1.4.1/gl/xalloc-die.c0000644000175000017500000000243513723215640014711 0ustar00blpblp00000000000000/* Report a memory allocation failure and exit. Copyright (C) 1997-2000, 2002-2004, 2006, 2009-2020 Free Software Foundation, Inc. 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 3 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, see . */ #include #include "xalloc.h" #include #include "error.h" #include "exitfail.h" #include "gettext.h" #define _(msgid) gettext (msgid) void xalloc_die (void) { error (exit_failure, 0, "%s", _("memory exhausted")); /* _Noreturn cannot be given to error, since it may return if its first argument is 0. To help compilers understand the xalloc_die does not return, call abort. Also, the abort is a safety feature if exit_failure is 0 (which shouldn't happen). */ abort (); } pspp-1.4.1/gl/localename-table.c0000644000175000017500000000267713723215637016073 0ustar00blpblp00000000000000/* Table that maps a locale object to the names of the locale categories. Copyright (C) 2018-2020 Free Software Foundation, Inc. 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 3 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, see . */ /* Written by Bruno Haible , 2018. */ #include #if HAVE_WORKING_USELOCALE && HAVE_NAMELESS_LOCALES /* Specification. */ #include "localename-table.h" #include /* A hash function for pointers. */ size_t _GL_ATTRIBUTE_CONST locale_hash_function (locale_t x) { uintptr_t p = (uintptr_t) x; size_t h = ((p % 4177) << 12) + ((p % 79) << 6) + (p % 61); return h; } struct locale_hash_node * locale_hash_table[LOCALE_HASH_TABLE_SIZE] /* = { NULL, ..., NULL } */; gl_rwlock_define_initialized(, locale_lock) #else /* This declaration is solely to ensure that after preprocessing this file is never empty. */ typedef int dummy; #endif pspp-1.4.1/gl/getopt-cdefs.in.h0000644000175000017500000000376113723215637015677 0ustar00blpblp00000000000000/* getopt-on-non-glibc compatibility macros. Copyright (C) 1989-2020 Free Software Foundation, Inc. This file is part of gnulib. Unlike most of the getopt implementation, it is NOT shared with the GNU C Library. This file 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 3 of the License, or (at your option) any later version. This file 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 gnulib; if not, see . */ #ifndef _GETOPT_CDEFS_H #define _GETOPT_CDEFS_H 1 /* This header should not be used directly; include getopt.h or unistd.h instead. It does not have a protective #error, because the guard macro for getopt.h in gnulib is not fixed. */ /* getopt-core.h and getopt-ext.h are shared with GNU libc, and expect a number of the internal macros supplied to GNU libc's headers by sys/cdefs.h. Provide fallback definitions for all of them. */ #if @HAVE_SYS_CDEFS_H@ # include #endif #ifndef __BEGIN_DECLS # ifdef __cplusplus # define __BEGIN_DECLS extern "C" { # else # define __BEGIN_DECLS /* nothing */ # endif #endif #ifndef __END_DECLS # ifdef __cplusplus # define __END_DECLS } # else # define __END_DECLS /* nothing */ # endif #endif #ifndef __GNUC_PREREQ # if defined __GNUC__ && defined __GNUC_VERSION__ # define __GNUC_PREREQ(maj, min) \ ((__GNUC__ << 16) + __GNUC_MINOR__ >= ((maj) << 16) + (min)) # else # define __GNUC_PREREQ(maj, min) 0 # endif #endif #ifndef __THROW # if defined __cplusplus && __GNUC_PREREQ (2,8) # define __THROW throw () # else # define __THROW # endif #endif #endif /* _GETOPT_CDEFS_H */ pspp-1.4.1/gl/isnand.c0000644000175000017500000000147013723215637014150 0ustar00blpblp00000000000000/* Test for NaN that does not need libm. Copyright (C) 2008-2020 Free Software Foundation, Inc. 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 3 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, see . */ /* Written by Bruno Haible , 2008. */ #include "isnan.c" pspp-1.4.1/gl/windows-once.h0000644000175000017500000000254113723215640015307 0ustar00blpblp00000000000000/* Once-only control (native Windows implementation). Copyright (C) 2005-2020 Free Software Foundation, Inc. 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 3, 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, see . */ /* Written by Bruno Haible , 2005. Based on GCC's gthr-win32.h. */ #ifndef _WINDOWS_ONCE_H #define _WINDOWS_ONCE_H #define WIN32_LEAN_AND_MEAN /* avoid including junk */ #include typedef struct { volatile int inited; volatile LONG started; CRITICAL_SECTION lock; } glwthread_once_t; #define GLWTHREAD_ONCE_INIT { -1, -1 } #ifdef __cplusplus extern "C" { #endif extern void glwthread_once (glwthread_once_t *once_control, void (*initfunction) (void)); #ifdef __cplusplus } #endif #endif /* _WINDOWS_ONCE_H */ pspp-1.4.1/gl/exitfail.h0000644000175000017500000000140313723215636014501 0ustar00blpblp00000000000000/* Failure exit status Copyright (C) 2002, 2009-2020 Free Software Foundation, Inc. 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 3 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, see . */ extern int volatile exit_failure; pspp-1.4.1/gl/safe-write.c0000644000175000017500000000145313723215640014735 0ustar00blpblp00000000000000/* An interface to write that retries after interrupts. Copyright (C) 2002, 2009-2020 Free Software Foundation, Inc. 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 3 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, see . */ #define SAFE_WRITE #include "safe-read.c" pspp-1.4.1/gl/localename.c0000644000175000017500000030554713723215637015010 0ustar00blpblp00000000000000/* Determine name of the currently selected locale. Copyright (C) 1995-2020 Free Software Foundation, Inc. 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 3 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, see . */ /* Written by Ulrich Drepper , 1995. */ /* Native Windows code written by Tor Lillqvist . */ /* Mac OS X code written by Bruno Haible . */ #include /* Specification. */ #ifdef IN_LIBINTL # include "gettextP.h" #else # include "localename.h" #endif #include #include #include #include #include #include "flexmember.h" #include "setlocale_null.h" #include "thread-optim.h" /* We cannot support uselocale() on platforms where the locale_t type is fake. See intl-thread-locale.m4 for details. */ #if HAVE_WORKING_USELOCALE && !HAVE_FAKE_LOCALES # define HAVE_GOOD_USELOCALE 1 #endif #if HAVE_GOOD_USELOCALE /* Mac OS X 10.5 defines the locale_t type in . */ # if defined __APPLE__ && defined __MACH__ # include # endif # if (__GLIBC__ >= 2 && !defined __UCLIBC__) || (defined __linux__ && HAVE_LANGINFO_H) || defined __CYGWIN__ # include # endif # if !defined IN_LIBINTL # include "glthread/lock.h" # endif # if defined __sun # if HAVE_GETLOCALENAME_L /* Solaris >= 12. */ extern char * getlocalename_l(int, locale_t); # elif HAVE_SOLARIS114_LOCALES # include # endif # endif # if HAVE_NAMELESS_LOCALES # include # include "localename-table.h" # endif #endif #if HAVE_CFPREFERENCESCOPYAPPVALUE # include # include #endif #if defined _WIN32 && !defined __CYGWIN__ # define WINDOWS_NATIVE # if !defined IN_LIBINTL # include "glthread/lock.h" # endif #endif #if defined WINDOWS_NATIVE || defined __CYGWIN__ /* Native Windows or Cygwin */ # define WIN32_LEAN_AND_MEAN # include # include /* List of language codes, sorted by value: 0x01 LANG_ARABIC 0x02 LANG_BULGARIAN 0x03 LANG_CATALAN 0x04 LANG_CHINESE 0x05 LANG_CZECH 0x06 LANG_DANISH 0x07 LANG_GERMAN 0x08 LANG_GREEK 0x09 LANG_ENGLISH 0x0a LANG_SPANISH 0x0b LANG_FINNISH 0x0c LANG_FRENCH 0x0d LANG_HEBREW 0x0e LANG_HUNGARIAN 0x0f LANG_ICELANDIC 0x10 LANG_ITALIAN 0x11 LANG_JAPANESE 0x12 LANG_KOREAN 0x13 LANG_DUTCH 0x14 LANG_NORWEGIAN 0x15 LANG_POLISH 0x16 LANG_PORTUGUESE 0x17 LANG_ROMANSH 0x18 LANG_ROMANIAN 0x19 LANG_RUSSIAN 0x1a LANG_CROATIAN == LANG_SERBIAN 0x1b LANG_SLOVAK 0x1c LANG_ALBANIAN 0x1d LANG_SWEDISH 0x1e LANG_THAI 0x1f LANG_TURKISH 0x20 LANG_URDU 0x21 LANG_INDONESIAN 0x22 LANG_UKRAINIAN 0x23 LANG_BELARUSIAN 0x24 LANG_SLOVENIAN 0x25 LANG_ESTONIAN 0x26 LANG_LATVIAN 0x27 LANG_LITHUANIAN 0x28 LANG_TAJIK 0x29 LANG_FARSI 0x2a LANG_VIETNAMESE 0x2b LANG_ARMENIAN 0x2c LANG_AZERI 0x2d LANG_BASQUE 0x2e LANG_SORBIAN 0x2f LANG_MACEDONIAN 0x30 LANG_SUTU 0x31 LANG_TSONGA 0x32 LANG_TSWANA 0x33 LANG_VENDA 0x34 LANG_XHOSA 0x35 LANG_ZULU 0x36 LANG_AFRIKAANS 0x37 LANG_GEORGIAN 0x38 LANG_FAEROESE 0x39 LANG_HINDI 0x3a LANG_MALTESE 0x3b LANG_SAMI 0x3c LANG_GAELIC 0x3d LANG_YIDDISH 0x3e LANG_MALAY 0x3f LANG_KAZAK 0x40 LANG_KYRGYZ 0x41 LANG_SWAHILI 0x42 LANG_TURKMEN 0x43 LANG_UZBEK 0x44 LANG_TATAR 0x45 LANG_BENGALI 0x46 LANG_PUNJABI 0x47 LANG_GUJARATI 0x48 LANG_ORIYA 0x49 LANG_TAMIL 0x4a LANG_TELUGU 0x4b LANG_KANNADA 0x4c LANG_MALAYALAM 0x4d LANG_ASSAMESE 0x4e LANG_MARATHI 0x4f LANG_SANSKRIT 0x50 LANG_MONGOLIAN 0x51 LANG_TIBETAN 0x52 LANG_WELSH 0x53 LANG_CAMBODIAN 0x54 LANG_LAO 0x55 LANG_BURMESE 0x56 LANG_GALICIAN 0x57 LANG_KONKANI 0x58 LANG_MANIPURI 0x59 LANG_SINDHI 0x5a LANG_SYRIAC 0x5b LANG_SINHALESE 0x5c LANG_CHEROKEE 0x5d LANG_INUKTITUT 0x5e LANG_AMHARIC 0x5f LANG_TAMAZIGHT 0x60 LANG_KASHMIRI 0x61 LANG_NEPALI 0x62 LANG_FRISIAN 0x63 LANG_PASHTO 0x64 LANG_TAGALOG 0x65 LANG_DIVEHI 0x66 LANG_EDO 0x67 LANG_FULFULDE 0x68 LANG_HAUSA 0x69 LANG_IBIBIO 0x6a LANG_YORUBA 0x6d LANG_BASHKIR 0x6e LANG_LUXEMBOURGISH 0x6f LANG_GREENLANDIC 0x70 LANG_IGBO 0x71 LANG_KANURI 0x72 LANG_OROMO 0x73 LANG_TIGRINYA 0x74 LANG_GUARANI 0x75 LANG_HAWAIIAN 0x76 LANG_LATIN 0x77 LANG_SOMALI 0x78 LANG_YI 0x79 LANG_PAPIAMENTU 0x7a LANG_MAPUDUNGUN 0x7c LANG_MOHAWK 0x7e LANG_BRETON 0x82 LANG_OCCITAN 0x83 LANG_CORSICAN 0x84 LANG_ALSATIAN 0x85 LANG_YAKUT 0x86 LANG_KICHE 0x87 LANG_KINYARWANDA 0x88 LANG_WOLOF 0x8c LANG_DARI 0x91 LANG_SCOTTISH_GAELIC */ /* Mingw headers don't have latest language and sublanguage codes. */ # ifndef LANG_AFRIKAANS # define LANG_AFRIKAANS 0x36 # endif # ifndef LANG_ALBANIAN # define LANG_ALBANIAN 0x1c # endif # ifndef LANG_ALSATIAN # define LANG_ALSATIAN 0x84 # endif # ifndef LANG_AMHARIC # define LANG_AMHARIC 0x5e # endif # ifndef LANG_ARABIC # define LANG_ARABIC 0x01 # endif # ifndef LANG_ARMENIAN # define LANG_ARMENIAN 0x2b # endif # ifndef LANG_ASSAMESE # define LANG_ASSAMESE 0x4d # endif # ifndef LANG_AZERI # define LANG_AZERI 0x2c # endif # ifndef LANG_BASHKIR # define LANG_BASHKIR 0x6d # endif # ifndef LANG_BASQUE # define LANG_BASQUE 0x2d # endif # ifndef LANG_BELARUSIAN # define LANG_BELARUSIAN 0x23 # endif # ifndef LANG_BENGALI # define LANG_BENGALI 0x45 # endif # ifndef LANG_BRETON # define LANG_BRETON 0x7e # endif # ifndef LANG_BURMESE # define LANG_BURMESE 0x55 # endif # ifndef LANG_CAMBODIAN # define LANG_CAMBODIAN 0x53 # endif # ifndef LANG_CATALAN # define LANG_CATALAN 0x03 # endif # ifndef LANG_CHEROKEE # define LANG_CHEROKEE 0x5c # endif # ifndef LANG_CORSICAN # define LANG_CORSICAN 0x83 # endif # ifndef LANG_DARI # define LANG_DARI 0x8c # endif # ifndef LANG_DIVEHI # define LANG_DIVEHI 0x65 # endif # ifndef LANG_EDO # define LANG_EDO 0x66 # endif # ifndef LANG_ESTONIAN # define LANG_ESTONIAN 0x25 # endif # ifndef LANG_FAEROESE # define LANG_FAEROESE 0x38 # endif # ifndef LANG_FARSI # define LANG_FARSI 0x29 # endif # ifndef LANG_FRISIAN # define LANG_FRISIAN 0x62 # endif # ifndef LANG_FULFULDE # define LANG_FULFULDE 0x67 # endif # ifndef LANG_GAELIC # define LANG_GAELIC 0x3c # endif # ifndef LANG_GALICIAN # define LANG_GALICIAN 0x56 # endif # ifndef LANG_GEORGIAN # define LANG_GEORGIAN 0x37 # endif # ifndef LANG_GREENLANDIC # define LANG_GREENLANDIC 0x6f # endif # ifndef LANG_GUARANI # define LANG_GUARANI 0x74 # endif # ifndef LANG_GUJARATI # define LANG_GUJARATI 0x47 # endif # ifndef LANG_HAUSA # define LANG_HAUSA 0x68 # endif # ifndef LANG_HAWAIIAN # define LANG_HAWAIIAN 0x75 # endif # ifndef LANG_HEBREW # define LANG_HEBREW 0x0d # endif # ifndef LANG_HINDI # define LANG_HINDI 0x39 # endif # ifndef LANG_IBIBIO # define LANG_IBIBIO 0x69 # endif # ifndef LANG_IGBO # define LANG_IGBO 0x70 # endif # ifndef LANG_INDONESIAN # define LANG_INDONESIAN 0x21 # endif # ifndef LANG_INUKTITUT # define LANG_INUKTITUT 0x5d # endif # ifndef LANG_KANNADA # define LANG_KANNADA 0x4b # endif # ifndef LANG_KANURI # define LANG_KANURI 0x71 # endif # ifndef LANG_KASHMIRI # define LANG_KASHMIRI 0x60 # endif # ifndef LANG_KAZAK # define LANG_KAZAK 0x3f # endif # ifndef LANG_KICHE # define LANG_KICHE 0x86 # endif # ifndef LANG_KINYARWANDA # define LANG_KINYARWANDA 0x87 # endif # ifndef LANG_KONKANI # define LANG_KONKANI 0x57 # endif # ifndef LANG_KYRGYZ # define LANG_KYRGYZ 0x40 # endif # ifndef LANG_LAO # define LANG_LAO 0x54 # endif # ifndef LANG_LATIN # define LANG_LATIN 0x76 # endif # ifndef LANG_LATVIAN # define LANG_LATVIAN 0x26 # endif # ifndef LANG_LITHUANIAN # define LANG_LITHUANIAN 0x27 # endif # ifndef LANG_LUXEMBOURGISH # define LANG_LUXEMBOURGISH 0x6e # endif # ifndef LANG_MACEDONIAN # define LANG_MACEDONIAN 0x2f # endif # ifndef LANG_MALAY # define LANG_MALAY 0x3e # endif # ifndef LANG_MALAYALAM # define LANG_MALAYALAM 0x4c # endif # ifndef LANG_MALTESE # define LANG_MALTESE 0x3a # endif # ifndef LANG_MANIPURI # define LANG_MANIPURI 0x58 # endif # ifndef LANG_MAORI # define LANG_MAORI 0x81 # endif # ifndef LANG_MAPUDUNGUN # define LANG_MAPUDUNGUN 0x7a # endif # ifndef LANG_MARATHI # define LANG_MARATHI 0x4e # endif # ifndef LANG_MOHAWK # define LANG_MOHAWK 0x7c # endif # ifndef LANG_MONGOLIAN # define LANG_MONGOLIAN 0x50 # endif # ifndef LANG_NEPALI # define LANG_NEPALI 0x61 # endif # ifndef LANG_OCCITAN # define LANG_OCCITAN 0x82 # endif # ifndef LANG_ORIYA # define LANG_ORIYA 0x48 # endif # ifndef LANG_OROMO # define LANG_OROMO 0x72 # endif # ifndef LANG_PAPIAMENTU # define LANG_PAPIAMENTU 0x79 # endif # ifndef LANG_PASHTO # define LANG_PASHTO 0x63 # endif # ifndef LANG_PUNJABI # define LANG_PUNJABI 0x46 # endif # ifndef LANG_QUECHUA # define LANG_QUECHUA 0x6b # endif # ifndef LANG_ROMANSH # define LANG_ROMANSH 0x17 # endif # ifndef LANG_SAMI # define LANG_SAMI 0x3b # endif # ifndef LANG_SANSKRIT # define LANG_SANSKRIT 0x4f # endif # ifndef LANG_SCOTTISH_GAELIC # define LANG_SCOTTISH_GAELIC 0x91 # endif # ifndef LANG_SERBIAN # define LANG_SERBIAN 0x1a # endif # ifndef LANG_SINDHI # define LANG_SINDHI 0x59 # endif # ifndef LANG_SINHALESE # define LANG_SINHALESE 0x5b # endif # ifndef LANG_SLOVAK # define LANG_SLOVAK 0x1b # endif # ifndef LANG_SOMALI # define LANG_SOMALI 0x77 # endif # ifndef LANG_SORBIAN # define LANG_SORBIAN 0x2e # endif # ifndef LANG_SOTHO # define LANG_SOTHO 0x6c # endif # ifndef LANG_SUTU # define LANG_SUTU 0x30 # endif # ifndef LANG_SWAHILI # define LANG_SWAHILI 0x41 # endif # ifndef LANG_SYRIAC # define LANG_SYRIAC 0x5a # endif # ifndef LANG_TAGALOG # define LANG_TAGALOG 0x64 # endif # ifndef LANG_TAJIK # define LANG_TAJIK 0x28 # endif # ifndef LANG_TAMAZIGHT # define LANG_TAMAZIGHT 0x5f # endif # ifndef LANG_TAMIL # define LANG_TAMIL 0x49 # endif # ifndef LANG_TATAR # define LANG_TATAR 0x44 # endif # ifndef LANG_TELUGU # define LANG_TELUGU 0x4a # endif # ifndef LANG_THAI # define LANG_THAI 0x1e # endif # ifndef LANG_TIBETAN # define LANG_TIBETAN 0x51 # endif # ifndef LANG_TIGRINYA # define LANG_TIGRINYA 0x73 # endif # ifndef LANG_TSONGA # define LANG_TSONGA 0x31 # endif # ifndef LANG_TSWANA # define LANG_TSWANA 0x32 # endif # ifndef LANG_TURKMEN # define LANG_TURKMEN 0x42 # endif # ifndef LANG_UIGHUR # define LANG_UIGHUR 0x80 # endif # ifndef LANG_UKRAINIAN # define LANG_UKRAINIAN 0x22 # endif # ifndef LANG_URDU # define LANG_URDU 0x20 # endif # ifndef LANG_UZBEK # define LANG_UZBEK 0x43 # endif # ifndef LANG_VENDA # define LANG_VENDA 0x33 # endif # ifndef LANG_VIETNAMESE # define LANG_VIETNAMESE 0x2a # endif # ifndef LANG_WELSH # define LANG_WELSH 0x52 # endif # ifndef LANG_WOLOF # define LANG_WOLOF 0x88 # endif # ifndef LANG_XHOSA # define LANG_XHOSA 0x34 # endif # ifndef LANG_YAKUT # define LANG_YAKUT 0x85 # endif # ifndef LANG_YI # define LANG_YI 0x78 # endif # ifndef LANG_YIDDISH # define LANG_YIDDISH 0x3d # endif # ifndef LANG_YORUBA # define LANG_YORUBA 0x6a # endif # ifndef LANG_ZULU # define LANG_ZULU 0x35 # endif # ifndef SUBLANG_AFRIKAANS_SOUTH_AFRICA # define SUBLANG_AFRIKAANS_SOUTH_AFRICA 0x01 # endif # ifndef SUBLANG_ALBANIAN_ALBANIA # define SUBLANG_ALBANIAN_ALBANIA 0x01 # endif # ifndef SUBLANG_ALSATIAN_FRANCE # define SUBLANG_ALSATIAN_FRANCE 0x01 # endif # ifndef SUBLANG_AMHARIC_ETHIOPIA # define SUBLANG_AMHARIC_ETHIOPIA 0x01 # endif # ifndef SUBLANG_ARABIC_SAUDI_ARABIA # define SUBLANG_ARABIC_SAUDI_ARABIA 0x01 # endif # ifndef SUBLANG_ARABIC_IRAQ # define SUBLANG_ARABIC_IRAQ 0x02 # endif # ifndef SUBLANG_ARABIC_EGYPT # define SUBLANG_ARABIC_EGYPT 0x03 # endif # ifndef SUBLANG_ARABIC_LIBYA # define SUBLANG_ARABIC_LIBYA 0x04 # endif # ifndef SUBLANG_ARABIC_ALGERIA # define SUBLANG_ARABIC_ALGERIA 0x05 # endif # ifndef SUBLANG_ARABIC_MOROCCO # define SUBLANG_ARABIC_MOROCCO 0x06 # endif # ifndef SUBLANG_ARABIC_TUNISIA # define SUBLANG_ARABIC_TUNISIA 0x07 # endif # ifndef SUBLANG_ARABIC_OMAN # define SUBLANG_ARABIC_OMAN 0x08 # endif # ifndef SUBLANG_ARABIC_YEMEN # define SUBLANG_ARABIC_YEMEN 0x09 # endif # ifndef SUBLANG_ARABIC_SYRIA # define SUBLANG_ARABIC_SYRIA 0x0a # endif # ifndef SUBLANG_ARABIC_JORDAN # define SUBLANG_ARABIC_JORDAN 0x0b # endif # ifndef SUBLANG_ARABIC_LEBANON # define SUBLANG_ARABIC_LEBANON 0x0c # endif # ifndef SUBLANG_ARABIC_KUWAIT # define SUBLANG_ARABIC_KUWAIT 0x0d # endif # ifndef SUBLANG_ARABIC_UAE # define SUBLANG_ARABIC_UAE 0x0e # endif # ifndef SUBLANG_ARABIC_BAHRAIN # define SUBLANG_ARABIC_BAHRAIN 0x0f # endif # ifndef SUBLANG_ARABIC_QATAR # define SUBLANG_ARABIC_QATAR 0x10 # endif # ifndef SUBLANG_ARMENIAN_ARMENIA # define SUBLANG_ARMENIAN_ARMENIA 0x01 # endif # ifndef SUBLANG_ASSAMESE_INDIA # define SUBLANG_ASSAMESE_INDIA 0x01 # endif # ifndef SUBLANG_AZERI_LATIN # define SUBLANG_AZERI_LATIN 0x01 # endif # ifndef SUBLANG_AZERI_CYRILLIC # define SUBLANG_AZERI_CYRILLIC 0x02 # endif # ifndef SUBLANG_BASHKIR_RUSSIA # define SUBLANG_BASHKIR_RUSSIA 0x01 # endif # ifndef SUBLANG_BASQUE_BASQUE # define SUBLANG_BASQUE_BASQUE 0x01 # endif # ifndef SUBLANG_BELARUSIAN_BELARUS # define SUBLANG_BELARUSIAN_BELARUS 0x01 # endif # ifndef SUBLANG_BENGALI_INDIA # define SUBLANG_BENGALI_INDIA 0x01 # endif # ifndef SUBLANG_BENGALI_BANGLADESH # define SUBLANG_BENGALI_BANGLADESH 0x02 # endif # ifndef SUBLANG_BOSNIAN_BOSNIA_HERZEGOVINA_LATIN # define SUBLANG_BOSNIAN_BOSNIA_HERZEGOVINA_LATIN 0x05 # endif # ifndef SUBLANG_BOSNIAN_BOSNIA_HERZEGOVINA_CYRILLIC # define SUBLANG_BOSNIAN_BOSNIA_HERZEGOVINA_CYRILLIC 0x08 # endif # ifndef SUBLANG_BRETON_FRANCE # define SUBLANG_BRETON_FRANCE 0x01 # endif # ifndef SUBLANG_BULGARIAN_BULGARIA # define SUBLANG_BULGARIAN_BULGARIA 0x01 # endif # ifndef SUBLANG_CAMBODIAN_CAMBODIA # define SUBLANG_CAMBODIAN_CAMBODIA 0x01 # endif # ifndef SUBLANG_CATALAN_SPAIN # define SUBLANG_CATALAN_SPAIN 0x01 # endif # ifndef SUBLANG_CORSICAN_FRANCE # define SUBLANG_CORSICAN_FRANCE 0x01 # endif # ifndef SUBLANG_CROATIAN_CROATIA # define SUBLANG_CROATIAN_CROATIA 0x01 # endif # ifndef SUBLANG_CROATIAN_BOSNIA_HERZEGOVINA_LATIN # define SUBLANG_CROATIAN_BOSNIA_HERZEGOVINA_LATIN 0x04 # endif # ifndef SUBLANG_CHINESE_MACAU # define SUBLANG_CHINESE_MACAU 0x05 # endif # ifndef SUBLANG_CZECH_CZECH_REPUBLIC # define SUBLANG_CZECH_CZECH_REPUBLIC 0x01 # endif # ifndef SUBLANG_DANISH_DENMARK # define SUBLANG_DANISH_DENMARK 0x01 # endif # ifndef SUBLANG_DARI_AFGHANISTAN # define SUBLANG_DARI_AFGHANISTAN 0x01 # endif # ifndef SUBLANG_DIVEHI_MALDIVES # define SUBLANG_DIVEHI_MALDIVES 0x01 # endif # ifndef SUBLANG_DUTCH_SURINAM # define SUBLANG_DUTCH_SURINAM 0x03 # endif # ifndef SUBLANG_ENGLISH_SOUTH_AFRICA # define SUBLANG_ENGLISH_SOUTH_AFRICA 0x07 # endif # ifndef SUBLANG_ENGLISH_JAMAICA # define SUBLANG_ENGLISH_JAMAICA 0x08 # endif # ifndef SUBLANG_ENGLISH_CARIBBEAN # define SUBLANG_ENGLISH_CARIBBEAN 0x09 # endif # ifndef SUBLANG_ENGLISH_BELIZE # define SUBLANG_ENGLISH_BELIZE 0x0a # endif # ifndef SUBLANG_ENGLISH_TRINIDAD # define SUBLANG_ENGLISH_TRINIDAD 0x0b # endif # ifndef SUBLANG_ENGLISH_ZIMBABWE # define SUBLANG_ENGLISH_ZIMBABWE 0x0c # endif # ifndef SUBLANG_ENGLISH_PHILIPPINES # define SUBLANG_ENGLISH_PHILIPPINES 0x0d # endif # ifndef SUBLANG_ENGLISH_INDONESIA # define SUBLANG_ENGLISH_INDONESIA 0x0e # endif # ifndef SUBLANG_ENGLISH_HONGKONG # define SUBLANG_ENGLISH_HONGKONG 0x0f # endif # ifndef SUBLANG_ENGLISH_INDIA # define SUBLANG_ENGLISH_INDIA 0x10 # endif # ifndef SUBLANG_ENGLISH_MALAYSIA # define SUBLANG_ENGLISH_MALAYSIA 0x11 # endif # ifndef SUBLANG_ENGLISH_SINGAPORE # define SUBLANG_ENGLISH_SINGAPORE 0x12 # endif # ifndef SUBLANG_ESTONIAN_ESTONIA # define SUBLANG_ESTONIAN_ESTONIA 0x01 # endif # ifndef SUBLANG_FAEROESE_FAROE_ISLANDS # define SUBLANG_FAEROESE_FAROE_ISLANDS 0x01 # endif # ifndef SUBLANG_FARSI_IRAN # define SUBLANG_FARSI_IRAN 0x01 # endif # ifndef SUBLANG_FINNISH_FINLAND # define SUBLANG_FINNISH_FINLAND 0x01 # endif # ifndef SUBLANG_FRENCH_LUXEMBOURG # define SUBLANG_FRENCH_LUXEMBOURG 0x05 # endif # ifndef SUBLANG_FRENCH_MONACO # define SUBLANG_FRENCH_MONACO 0x06 # endif # ifndef SUBLANG_FRENCH_WESTINDIES # define SUBLANG_FRENCH_WESTINDIES 0x07 # endif # ifndef SUBLANG_FRENCH_REUNION # define SUBLANG_FRENCH_REUNION 0x08 # endif # ifndef SUBLANG_FRENCH_CONGO # define SUBLANG_FRENCH_CONGO 0x09 # endif # ifndef SUBLANG_FRENCH_SENEGAL # define SUBLANG_FRENCH_SENEGAL 0x0a # endif # ifndef SUBLANG_FRENCH_CAMEROON # define SUBLANG_FRENCH_CAMEROON 0x0b # endif # ifndef SUBLANG_FRENCH_COTEDIVOIRE # define SUBLANG_FRENCH_COTEDIVOIRE 0x0c # endif # ifndef SUBLANG_FRENCH_MALI # define SUBLANG_FRENCH_MALI 0x0d # endif # ifndef SUBLANG_FRENCH_MOROCCO # define SUBLANG_FRENCH_MOROCCO 0x0e # endif # ifndef SUBLANG_FRENCH_HAITI # define SUBLANG_FRENCH_HAITI 0x0f # endif # ifndef SUBLANG_FRISIAN_NETHERLANDS # define SUBLANG_FRISIAN_NETHERLANDS 0x01 # endif # ifndef SUBLANG_GALICIAN_SPAIN # define SUBLANG_GALICIAN_SPAIN 0x01 # endif # ifndef SUBLANG_GEORGIAN_GEORGIA # define SUBLANG_GEORGIAN_GEORGIA 0x01 # endif # ifndef SUBLANG_GERMAN_LUXEMBOURG # define SUBLANG_GERMAN_LUXEMBOURG 0x04 # endif # ifndef SUBLANG_GERMAN_LIECHTENSTEIN # define SUBLANG_GERMAN_LIECHTENSTEIN 0x05 # endif # ifndef SUBLANG_GREEK_GREECE # define SUBLANG_GREEK_GREECE 0x01 # endif # ifndef SUBLANG_GREENLANDIC_GREENLAND # define SUBLANG_GREENLANDIC_GREENLAND 0x01 # endif # ifndef SUBLANG_GUJARATI_INDIA # define SUBLANG_GUJARATI_INDIA 0x01 # endif # ifndef SUBLANG_HAUSA_NIGERIA_LATIN # define SUBLANG_HAUSA_NIGERIA_LATIN 0x01 # endif # ifndef SUBLANG_HEBREW_ISRAEL # define SUBLANG_HEBREW_ISRAEL 0x01 # endif # ifndef SUBLANG_HINDI_INDIA # define SUBLANG_HINDI_INDIA 0x01 # endif # ifndef SUBLANG_HUNGARIAN_HUNGARY # define SUBLANG_HUNGARIAN_HUNGARY 0x01 # endif # ifndef SUBLANG_ICELANDIC_ICELAND # define SUBLANG_ICELANDIC_ICELAND 0x01 # endif # ifndef SUBLANG_IGBO_NIGERIA # define SUBLANG_IGBO_NIGERIA 0x01 # endif # ifndef SUBLANG_INDONESIAN_INDONESIA # define SUBLANG_INDONESIAN_INDONESIA 0x01 # endif # ifndef SUBLANG_INUKTITUT_CANADA # define SUBLANG_INUKTITUT_CANADA 0x01 # endif # undef SUBLANG_INUKTITUT_CANADA_LATIN # define SUBLANG_INUKTITUT_CANADA_LATIN 0x02 # undef SUBLANG_IRISH_IRELAND # define SUBLANG_IRISH_IRELAND 0x02 # ifndef SUBLANG_JAPANESE_JAPAN # define SUBLANG_JAPANESE_JAPAN 0x01 # endif # ifndef SUBLANG_KANNADA_INDIA # define SUBLANG_KANNADA_INDIA 0x01 # endif # ifndef SUBLANG_KASHMIRI_INDIA # define SUBLANG_KASHMIRI_INDIA 0x02 # endif # ifndef SUBLANG_KAZAK_KAZAKHSTAN # define SUBLANG_KAZAK_KAZAKHSTAN 0x01 # endif # ifndef SUBLANG_KICHE_GUATEMALA # define SUBLANG_KICHE_GUATEMALA 0x01 # endif # ifndef SUBLANG_KINYARWANDA_RWANDA # define SUBLANG_KINYARWANDA_RWANDA 0x01 # endif # ifndef SUBLANG_KONKANI_INDIA # define SUBLANG_KONKANI_INDIA 0x01 # endif # ifndef SUBLANG_KYRGYZ_KYRGYZSTAN # define SUBLANG_KYRGYZ_KYRGYZSTAN 0x01 # endif # ifndef SUBLANG_LAO_LAOS # define SUBLANG_LAO_LAOS 0x01 # endif # ifndef SUBLANG_LATVIAN_LATVIA # define SUBLANG_LATVIAN_LATVIA 0x01 # endif # ifndef SUBLANG_LITHUANIAN_LITHUANIA # define SUBLANG_LITHUANIAN_LITHUANIA 0x01 # endif # undef SUBLANG_LOWER_SORBIAN_GERMANY # define SUBLANG_LOWER_SORBIAN_GERMANY 0x02 # ifndef SUBLANG_LUXEMBOURGISH_LUXEMBOURG # define SUBLANG_LUXEMBOURGISH_LUXEMBOURG 0x01 # endif # ifndef SUBLANG_MACEDONIAN_MACEDONIA # define SUBLANG_MACEDONIAN_MACEDONIA 0x01 # endif # ifndef SUBLANG_MALAY_MALAYSIA # define SUBLANG_MALAY_MALAYSIA 0x01 # endif # ifndef SUBLANG_MALAY_BRUNEI_DARUSSALAM # define SUBLANG_MALAY_BRUNEI_DARUSSALAM 0x02 # endif # ifndef SUBLANG_MALAYALAM_INDIA # define SUBLANG_MALAYALAM_INDIA 0x01 # endif # ifndef SUBLANG_MALTESE_MALTA # define SUBLANG_MALTESE_MALTA 0x01 # endif # ifndef SUBLANG_MAORI_NEW_ZEALAND # define SUBLANG_MAORI_NEW_ZEALAND 0x01 # endif # ifndef SUBLANG_MAPUDUNGUN_CHILE # define SUBLANG_MAPUDUNGUN_CHILE 0x01 # endif # ifndef SUBLANG_MARATHI_INDIA # define SUBLANG_MARATHI_INDIA 0x01 # endif # ifndef SUBLANG_MOHAWK_CANADA # define SUBLANG_MOHAWK_CANADA 0x01 # endif # ifndef SUBLANG_MONGOLIAN_CYRILLIC_MONGOLIA # define SUBLANG_MONGOLIAN_CYRILLIC_MONGOLIA 0x01 # endif # ifndef SUBLANG_MONGOLIAN_PRC # define SUBLANG_MONGOLIAN_PRC 0x02 # endif # ifndef SUBLANG_NEPALI_NEPAL # define SUBLANG_NEPALI_NEPAL 0x01 # endif # ifndef SUBLANG_NEPALI_INDIA # define SUBLANG_NEPALI_INDIA 0x02 # endif # ifndef SUBLANG_OCCITAN_FRANCE # define SUBLANG_OCCITAN_FRANCE 0x01 # endif # ifndef SUBLANG_ORIYA_INDIA # define SUBLANG_ORIYA_INDIA 0x01 # endif # ifndef SUBLANG_PASHTO_AFGHANISTAN # define SUBLANG_PASHTO_AFGHANISTAN 0x01 # endif # ifndef SUBLANG_POLISH_POLAND # define SUBLANG_POLISH_POLAND 0x01 # endif # ifndef SUBLANG_PUNJABI_INDIA # define SUBLANG_PUNJABI_INDIA 0x01 # endif # ifndef SUBLANG_PUNJABI_PAKISTAN # define SUBLANG_PUNJABI_PAKISTAN 0x02 # endif # ifndef SUBLANG_QUECHUA_BOLIVIA # define SUBLANG_QUECHUA_BOLIVIA 0x01 # endif # ifndef SUBLANG_QUECHUA_ECUADOR # define SUBLANG_QUECHUA_ECUADOR 0x02 # endif # ifndef SUBLANG_QUECHUA_PERU # define SUBLANG_QUECHUA_PERU 0x03 # endif # ifndef SUBLANG_ROMANIAN_ROMANIA # define SUBLANG_ROMANIAN_ROMANIA 0x01 # endif # ifndef SUBLANG_ROMANIAN_MOLDOVA # define SUBLANG_ROMANIAN_MOLDOVA 0x02 # endif # ifndef SUBLANG_ROMANSH_SWITZERLAND # define SUBLANG_ROMANSH_SWITZERLAND 0x01 # endif # ifndef SUBLANG_RUSSIAN_RUSSIA # define SUBLANG_RUSSIAN_RUSSIA 0x01 # endif # ifndef SUBLANG_RUSSIAN_MOLDAVIA # define SUBLANG_RUSSIAN_MOLDAVIA 0x02 # endif # ifndef SUBLANG_SAMI_NORTHERN_NORWAY # define SUBLANG_SAMI_NORTHERN_NORWAY 0x01 # endif # ifndef SUBLANG_SAMI_NORTHERN_SWEDEN # define SUBLANG_SAMI_NORTHERN_SWEDEN 0x02 # endif # ifndef SUBLANG_SAMI_NORTHERN_FINLAND # define SUBLANG_SAMI_NORTHERN_FINLAND 0x03 # endif # ifndef SUBLANG_SAMI_LULE_NORWAY # define SUBLANG_SAMI_LULE_NORWAY 0x04 # endif # ifndef SUBLANG_SAMI_LULE_SWEDEN # define SUBLANG_SAMI_LULE_SWEDEN 0x05 # endif # ifndef SUBLANG_SAMI_SOUTHERN_NORWAY # define SUBLANG_SAMI_SOUTHERN_NORWAY 0x06 # endif # ifndef SUBLANG_SAMI_SOUTHERN_SWEDEN # define SUBLANG_SAMI_SOUTHERN_SWEDEN 0x07 # endif # undef SUBLANG_SAMI_SKOLT_FINLAND # define SUBLANG_SAMI_SKOLT_FINLAND 0x08 # undef SUBLANG_SAMI_INARI_FINLAND # define SUBLANG_SAMI_INARI_FINLAND 0x09 # ifndef SUBLANG_SANSKRIT_INDIA # define SUBLANG_SANSKRIT_INDIA 0x01 # endif # ifndef SUBLANG_SERBIAN_LATIN # define SUBLANG_SERBIAN_LATIN 0x02 # endif # ifndef SUBLANG_SERBIAN_CYRILLIC # define SUBLANG_SERBIAN_CYRILLIC 0x03 # endif # ifndef SUBLANG_SINDHI_INDIA # define SUBLANG_SINDHI_INDIA 0x01 # endif # undef SUBLANG_SINDHI_PAKISTAN # define SUBLANG_SINDHI_PAKISTAN 0x02 # ifndef SUBLANG_SINDHI_AFGHANISTAN # define SUBLANG_SINDHI_AFGHANISTAN 0x02 # endif # ifndef SUBLANG_SINHALESE_SRI_LANKA # define SUBLANG_SINHALESE_SRI_LANKA 0x01 # endif # ifndef SUBLANG_SLOVAK_SLOVAKIA # define SUBLANG_SLOVAK_SLOVAKIA 0x01 # endif # ifndef SUBLANG_SLOVENIAN_SLOVENIA # define SUBLANG_SLOVENIAN_SLOVENIA 0x01 # endif # ifndef SUBLANG_SOTHO_SOUTH_AFRICA # define SUBLANG_SOTHO_SOUTH_AFRICA 0x01 # endif # ifndef SUBLANG_SPANISH_GUATEMALA # define SUBLANG_SPANISH_GUATEMALA 0x04 # endif # ifndef SUBLANG_SPANISH_COSTA_RICA # define SUBLANG_SPANISH_COSTA_RICA 0x05 # endif # ifndef SUBLANG_SPANISH_PANAMA # define SUBLANG_SPANISH_PANAMA 0x06 # endif # ifndef SUBLANG_SPANISH_DOMINICAN_REPUBLIC # define SUBLANG_SPANISH_DOMINICAN_REPUBLIC 0x07 # endif # ifndef SUBLANG_SPANISH_VENEZUELA # define SUBLANG_SPANISH_VENEZUELA 0x08 # endif # ifndef SUBLANG_SPANISH_COLOMBIA # define SUBLANG_SPANISH_COLOMBIA 0x09 # endif # ifndef SUBLANG_SPANISH_PERU # define SUBLANG_SPANISH_PERU 0x0a # endif # ifndef SUBLANG_SPANISH_ARGENTINA # define SUBLANG_SPANISH_ARGENTINA 0x0b # endif # ifndef SUBLANG_SPANISH_ECUADOR # define SUBLANG_SPANISH_ECUADOR 0x0c # endif # ifndef SUBLANG_SPANISH_CHILE # define SUBLANG_SPANISH_CHILE 0x0d # endif # ifndef SUBLANG_SPANISH_URUGUAY # define SUBLANG_SPANISH_URUGUAY 0x0e # endif # ifndef SUBLANG_SPANISH_PARAGUAY # define SUBLANG_SPANISH_PARAGUAY 0x0f # endif # ifndef SUBLANG_SPANISH_BOLIVIA # define SUBLANG_SPANISH_BOLIVIA 0x10 # endif # ifndef SUBLANG_SPANISH_EL_SALVADOR # define SUBLANG_SPANISH_EL_SALVADOR 0x11 # endif # ifndef SUBLANG_SPANISH_HONDURAS # define SUBLANG_SPANISH_HONDURAS 0x12 # endif # ifndef SUBLANG_SPANISH_NICARAGUA # define SUBLANG_SPANISH_NICARAGUA 0x13 # endif # ifndef SUBLANG_SPANISH_PUERTO_RICO # define SUBLANG_SPANISH_PUERTO_RICO 0x14 # endif # ifndef SUBLANG_SPANISH_US # define SUBLANG_SPANISH_US 0x15 # endif # ifndef SUBLANG_SWAHILI_KENYA # define SUBLANG_SWAHILI_KENYA 0x01 # endif # ifndef SUBLANG_SWEDISH_SWEDEN # define SUBLANG_SWEDISH_SWEDEN 0x01 # endif # ifndef SUBLANG_SWEDISH_FINLAND # define SUBLANG_SWEDISH_FINLAND 0x02 # endif # ifndef SUBLANG_SYRIAC_SYRIA # define SUBLANG_SYRIAC_SYRIA 0x01 # endif # ifndef SUBLANG_TAGALOG_PHILIPPINES # define SUBLANG_TAGALOG_PHILIPPINES 0x01 # endif # ifndef SUBLANG_TAJIK_TAJIKISTAN # define SUBLANG_TAJIK_TAJIKISTAN 0x01 # endif # ifndef SUBLANG_TAMAZIGHT_ARABIC # define SUBLANG_TAMAZIGHT_ARABIC 0x01 # endif # ifndef SUBLANG_TAMAZIGHT_ALGERIA_LATIN # define SUBLANG_TAMAZIGHT_ALGERIA_LATIN 0x02 # endif # ifndef SUBLANG_TAMIL_INDIA # define SUBLANG_TAMIL_INDIA 0x01 # endif # ifndef SUBLANG_TATAR_RUSSIA # define SUBLANG_TATAR_RUSSIA 0x01 # endif # ifndef SUBLANG_TELUGU_INDIA # define SUBLANG_TELUGU_INDIA 0x01 # endif # ifndef SUBLANG_THAI_THAILAND # define SUBLANG_THAI_THAILAND 0x01 # endif # ifndef SUBLANG_TIBETAN_PRC # define SUBLANG_TIBETAN_PRC 0x01 # endif # undef SUBLANG_TIBETAN_BHUTAN # define SUBLANG_TIBETAN_BHUTAN 0x02 # ifndef SUBLANG_TIGRINYA_ETHIOPIA # define SUBLANG_TIGRINYA_ETHIOPIA 0x01 # endif # ifndef SUBLANG_TIGRINYA_ERITREA # define SUBLANG_TIGRINYA_ERITREA 0x02 # endif # ifndef SUBLANG_TSWANA_SOUTH_AFRICA # define SUBLANG_TSWANA_SOUTH_AFRICA 0x01 # endif # ifndef SUBLANG_TURKISH_TURKEY # define SUBLANG_TURKISH_TURKEY 0x01 # endif # ifndef SUBLANG_TURKMEN_TURKMENISTAN # define SUBLANG_TURKMEN_TURKMENISTAN 0x01 # endif # ifndef SUBLANG_UIGHUR_PRC # define SUBLANG_UIGHUR_PRC 0x01 # endif # ifndef SUBLANG_UKRAINIAN_UKRAINE # define SUBLANG_UKRAINIAN_UKRAINE 0x01 # endif # ifndef SUBLANG_UPPER_SORBIAN_GERMANY # define SUBLANG_UPPER_SORBIAN_GERMANY 0x01 # endif # ifndef SUBLANG_URDU_PAKISTAN # define SUBLANG_URDU_PAKISTAN 0x01 # endif # ifndef SUBLANG_URDU_INDIA # define SUBLANG_URDU_INDIA 0x02 # endif # ifndef SUBLANG_UZBEK_LATIN # define SUBLANG_UZBEK_LATIN 0x01 # endif # ifndef SUBLANG_UZBEK_CYRILLIC # define SUBLANG_UZBEK_CYRILLIC 0x02 # endif # ifndef SUBLANG_VIETNAMESE_VIETNAM # define SUBLANG_VIETNAMESE_VIETNAM 0x01 # endif # ifndef SUBLANG_WELSH_UNITED_KINGDOM # define SUBLANG_WELSH_UNITED_KINGDOM 0x01 # endif # ifndef SUBLANG_WOLOF_SENEGAL # define SUBLANG_WOLOF_SENEGAL 0x01 # endif # ifndef SUBLANG_XHOSA_SOUTH_AFRICA # define SUBLANG_XHOSA_SOUTH_AFRICA 0x01 # endif # ifndef SUBLANG_YAKUT_RUSSIA # define SUBLANG_YAKUT_RUSSIA 0x01 # endif # ifndef SUBLANG_YI_PRC # define SUBLANG_YI_PRC 0x01 # endif # ifndef SUBLANG_YORUBA_NIGERIA # define SUBLANG_YORUBA_NIGERIA 0x01 # endif # ifndef SUBLANG_ZULU_SOUTH_AFRICA # define SUBLANG_ZULU_SOUTH_AFRICA 0x01 # endif /* GetLocaleInfoA operations. */ # ifndef LOCALE_SNAME # define LOCALE_SNAME 0x5c # endif # ifndef LOCALE_NAME_MAX_LENGTH # define LOCALE_NAME_MAX_LENGTH 85 # endif /* Don't assume that UNICODE is not defined. */ # undef GetLocaleInfo # define GetLocaleInfo GetLocaleInfoA # undef EnumSystemLocales # define EnumSystemLocales EnumSystemLocalesA #endif /* We want to use the system's setlocale() function here, not the gnulib override. */ #undef setlocale #if HAVE_CFPREFERENCESCOPYAPPVALUE /* Mac OS X 10.4 or newer */ /* Canonicalize a Mac OS X locale name to a Unix locale name. NAME is a sufficiently large buffer. On input, it contains the Mac OS X locale name. On output, it contains the Unix locale name. */ # if !defined IN_LIBINTL static # endif void gl_locale_name_canonicalize (char *name) { /* This conversion is based on a posting by Deborah GoldSmith on 2005-03-08, https://lists.apple.com/archives/carbon-dev/2005/Mar/msg00293.html */ /* Convert legacy (NeXTstep inherited) English names to Unix (ISO 639 and ISO 3166) names. Prior to Mac OS X 10.3, there is no API for doing this. Therefore we do it ourselves, using a table based on the results of the Mac OS X 10.3.8 function CFLocaleCreateCanonicalLocaleIdentifierFromString(). */ typedef struct { const char legacy[21+1]; const char unixy[5+1]; } legacy_entry; static const legacy_entry legacy_table[] = { { "Afrikaans", "af" }, { "Albanian", "sq" }, { "Amharic", "am" }, { "Arabic", "ar" }, { "Armenian", "hy" }, { "Assamese", "as" }, { "Aymara", "ay" }, { "Azerbaijani", "az" }, { "Basque", "eu" }, { "Belarusian", "be" }, { "Belorussian", "be" }, { "Bengali", "bn" }, { "Brazilian Portugese", "pt_BR" }, { "Brazilian Portuguese", "pt_BR" }, { "Breton", "br" }, { "Bulgarian", "bg" }, { "Burmese", "my" }, { "Byelorussian", "be" }, { "Catalan", "ca" }, { "Chewa", "ny" }, { "Chichewa", "ny" }, { "Chinese", "zh" }, { "Chinese, Simplified", "zh_CN" }, { "Chinese, Traditional", "zh_TW" }, { "Chinese, Tradtional", "zh_TW" }, { "Croatian", "hr" }, { "Czech", "cs" }, { "Danish", "da" }, { "Dutch", "nl" }, { "Dzongkha", "dz" }, { "English", "en" }, { "Esperanto", "eo" }, { "Estonian", "et" }, { "Faroese", "fo" }, { "Farsi", "fa" }, { "Finnish", "fi" }, { "Flemish", "nl_BE" }, { "French", "fr" }, { "Galician", "gl" }, { "Gallegan", "gl" }, { "Georgian", "ka" }, { "German", "de" }, { "Greek", "el" }, { "Greenlandic", "kl" }, { "Guarani", "gn" }, { "Gujarati", "gu" }, { "Hawaiian", "haw" }, /* Yes, "haw", not "cpe". */ { "Hebrew", "he" }, { "Hindi", "hi" }, { "Hungarian", "hu" }, { "Icelandic", "is" }, { "Indonesian", "id" }, { "Inuktitut", "iu" }, { "Irish", "ga" }, { "Italian", "it" }, { "Japanese", "ja" }, { "Javanese", "jv" }, { "Kalaallisut", "kl" }, { "Kannada", "kn" }, { "Kashmiri", "ks" }, { "Kazakh", "kk" }, { "Khmer", "km" }, { "Kinyarwanda", "rw" }, { "Kirghiz", "ky" }, { "Korean", "ko" }, { "Kurdish", "ku" }, { "Latin", "la" }, { "Latvian", "lv" }, { "Lithuanian", "lt" }, { "Macedonian", "mk" }, { "Malagasy", "mg" }, { "Malay", "ms" }, { "Malayalam", "ml" }, { "Maltese", "mt" }, { "Manx", "gv" }, { "Marathi", "mr" }, { "Moldavian", "mo" }, { "Mongolian", "mn" }, { "Nepali", "ne" }, { "Norwegian", "nb" }, /* Yes, "nb", not the obsolete "no". */ { "Nyanja", "ny" }, { "Nynorsk", "nn" }, { "Oriya", "or" }, { "Oromo", "om" }, { "Panjabi", "pa" }, { "Pashto", "ps" }, { "Persian", "fa" }, { "Polish", "pl" }, { "Portuguese", "pt" }, { "Portuguese, Brazilian", "pt_BR" }, { "Punjabi", "pa" }, { "Pushto", "ps" }, { "Quechua", "qu" }, { "Romanian", "ro" }, { "Ruanda", "rw" }, { "Rundi", "rn" }, { "Russian", "ru" }, { "Sami", "se_NO" }, /* Not just "se". */ { "Sanskrit", "sa" }, { "Scottish", "gd" }, { "Serbian", "sr" }, { "Simplified Chinese", "zh_CN" }, { "Sindhi", "sd" }, { "Sinhalese", "si" }, { "Slovak", "sk" }, { "Slovenian", "sl" }, { "Somali", "so" }, { "Spanish", "es" }, { "Sundanese", "su" }, { "Swahili", "sw" }, { "Swedish", "sv" }, { "Tagalog", "tl" }, { "Tajik", "tg" }, { "Tajiki", "tg" }, { "Tamil", "ta" }, { "Tatar", "tt" }, { "Telugu", "te" }, { "Thai", "th" }, { "Tibetan", "bo" }, { "Tigrinya", "ti" }, { "Tongan", "to" }, { "Traditional Chinese", "zh_TW" }, { "Turkish", "tr" }, { "Turkmen", "tk" }, { "Uighur", "ug" }, { "Ukrainian", "uk" }, { "Urdu", "ur" }, { "Uzbek", "uz" }, { "Vietnamese", "vi" }, { "Welsh", "cy" }, { "Yiddish", "yi" } }; /* Convert new-style locale names with language tags (ISO 639 and ISO 15924) to Unix (ISO 639 and ISO 3166) names. */ typedef struct { const char langtag[7+1]; const char unixy[12+1]; } langtag_entry; static const langtag_entry langtag_table[] = { /* Mac OS X has "az-Arab", "az-Cyrl", "az-Latn". The default script for az on Unix is Latin. */ { "az-Latn", "az" }, /* Mac OS X has "bs-Cyrl", "bs-Latn". The default script for bs on Unix is Latin. */ { "bs-Latn", "bs" }, /* Mac OS X has "ga-dots". Does not yet exist on Unix. */ { "ga-dots", "ga" }, /* Mac OS X has "kk-Cyrl". The default script for kk on Unix is Cyrillic. */ { "kk-Cyrl", "kk" }, /* Mac OS X has "mn-Cyrl", "mn-Mong". The default script for mn on Unix is Cyrillic. */ { "mn-Cyrl", "mn" }, /* Mac OS X has "ms-Arab", "ms-Latn". The default script for ms on Unix is Latin. */ { "ms-Latn", "ms" }, /* Mac OS X has "pa-Arab", "pa-Guru". Country codes are used to distinguish these on Unix. */ { "pa-Arab", "pa_PK" }, { "pa-Guru", "pa_IN" }, /* Mac OS X has "shi-Latn", "shi-Tfng". Does not yet exist on Unix. */ /* Mac OS X has "sr-Cyrl", "sr-Latn". The default script for sr on Unix is Cyrillic. */ { "sr-Cyrl", "sr" }, /* Mac OS X has "tg-Cyrl". The default script for tg on Unix is Cyrillic. */ { "tg-Cyrl", "tg" }, /* Mac OS X has "tk-Cyrl". The default script for tk on Unix is Cyrillic. */ { "tk-Cyrl", "tk" }, /* Mac OS X has "tt-Cyrl". The default script for tt on Unix is Cyrillic. */ { "tt-Cyrl", "tt" }, /* Mac OS X has "uz-Arab", "uz-Cyrl", "uz-Latn". The default script for uz on Unix is Latin. */ { "uz-Latn", "uz" }, /* Mac OS X has "vai-Latn", "vai-Vaii". Does not yet exist on Unix. */ /* Mac OS X has "yue-Hans", "yue-Hant". The default script for yue on Unix is Simplified Han. */ { "yue-Hans", "yue" }, /* Mac OS X has "zh-Hans", "zh-Hant". Country codes are used to distinguish these on Unix. */ { "zh-Hans", "zh_CN" }, { "zh-Hant", "zh_TW" } }; /* Convert script names (ISO 15924) to Unix conventions. See https://www.unicode.org/iso15924/iso15924-codes.html */ typedef struct { const char script[4+1]; const char unixy[9+1]; } script_entry; static const script_entry script_table[] = { { "Arab", "arabic" }, { "Cyrl", "cyrillic" }, { "Latn", "latin" }, { "Mong", "mongolian" } }; /* Step 1: Convert using legacy_table. */ if (name[0] >= 'A' && name[0] <= 'Z') { unsigned int i1, i2; i1 = 0; i2 = sizeof (legacy_table) / sizeof (legacy_entry); while (i2 - i1 > 1) { /* At this point we know that if name occurs in legacy_table, its index must be >= i1 and < i2. */ unsigned int i = (i1 + i2) >> 1; const legacy_entry *p = &legacy_table[i]; if (strcmp (name, p->legacy) < 0) i2 = i; else i1 = i; } if (strcmp (name, legacy_table[i1].legacy) == 0) { strcpy (name, legacy_table[i1].unixy); return; } } /* Step 2: Convert using langtag_table and script_table. */ if (strlen (name) == 7 && name[2] == '-') { unsigned int i1, i2; i1 = 0; i2 = sizeof (langtag_table) / sizeof (langtag_entry); while (i2 - i1 > 1) { /* At this point we know that if name occurs in langtag_table, its index must be >= i1 and < i2. */ unsigned int i = (i1 + i2) >> 1; const langtag_entry *p = &langtag_table[i]; if (strcmp (name, p->langtag) < 0) i2 = i; else i1 = i; } if (strcmp (name, langtag_table[i1].langtag) == 0) { strcpy (name, langtag_table[i1].unixy); return; } i1 = 0; i2 = sizeof (script_table) / sizeof (script_entry); while (i2 - i1 > 1) { /* At this point we know that if (name + 3) occurs in script_table, its index must be >= i1 and < i2. */ unsigned int i = (i1 + i2) >> 1; const script_entry *p = &script_table[i]; if (strcmp (name + 3, p->script) < 0) i2 = i; else i1 = i; } if (strcmp (name + 3, script_table[i1].script) == 0) { name[2] = '@'; strcpy (name + 3, script_table[i1].unixy); return; } } /* Step 3: Convert new-style dash to Unix underscore. */ { char *p; for (p = name; *p != '\0'; p++) if (*p == '-') *p = '_'; } } #endif #if defined WINDOWS_NATIVE || defined __CYGWIN__ /* Native Windows or Cygwin */ /* Canonicalize a Windows native locale name to a Unix locale name. NAME is a sufficiently large buffer. On input, it contains the Windows locale name. On output, it contains the Unix locale name. */ # if !defined IN_LIBINTL static # endif void gl_locale_name_canonicalize (char *name) { /* FIXME: This is probably incomplete: it does not handle "zh-Hans" and "zh-Hant". */ char *p; for (p = name; *p != '\0'; p++) if (*p == '-') { *p = '_'; p++; for (; *p != '\0'; p++) { if (*p >= 'a' && *p <= 'z') *p += 'A' - 'a'; if (*p == '-') { *p = '\0'; return; } } return; } } # if !defined IN_LIBINTL static # endif const char * gl_locale_name_from_win32_LANGID (LANGID langid) { /* Activate the new code only when the GETTEXT_MUI environment variable is set, for the time being, since the new code is not well tested. */ if (getenv ("GETTEXT_MUI") != NULL) { static char namebuf[256]; /* Query the system's notion of locale name. On Windows95/98/ME, GetLocaleInfoA returns some incorrect results. But we don't need to support systems that are so old. */ if (GetLocaleInfoA (MAKELCID (langid, SORT_DEFAULT), LOCALE_SNAME, namebuf, sizeof (namebuf) - 1)) { /* Convert it to a Unix locale name. */ gl_locale_name_canonicalize (namebuf); return namebuf; } } /* Internet Explorer has an LCID to RFC3066 name mapping stored in HKEY_CLASSES_ROOT\Mime\Database\Rfc1766. But we better don't use that since IE's i18n subsystem is known to be inconsistent with the native Windows base (e.g. they have different character conversion facilities that produce different results). */ /* Use our own table. */ { int primary, sub; /* Split into language and territory part. */ primary = PRIMARYLANGID (langid); sub = SUBLANGID (langid); /* Dispatch on language. See also https://www.unicode.org/unicode/onlinedat/languages.html . For details about languages, see https://www.ethnologue.com/ . */ switch (primary) { case LANG_AFRIKAANS: switch (sub) { case SUBLANG_AFRIKAANS_SOUTH_AFRICA: return "af_ZA"; } return "af"; case LANG_ALBANIAN: switch (sub) { case SUBLANG_ALBANIAN_ALBANIA: return "sq_AL"; } return "sq"; case LANG_ALSATIAN: switch (sub) { case SUBLANG_ALSATIAN_FRANCE: return "gsw_FR"; } return "gsw"; case LANG_AMHARIC: switch (sub) { case SUBLANG_AMHARIC_ETHIOPIA: return "am_ET"; } return "am"; case LANG_ARABIC: switch (sub) { case SUBLANG_ARABIC_SAUDI_ARABIA: return "ar_SA"; case SUBLANG_ARABIC_IRAQ: return "ar_IQ"; case SUBLANG_ARABIC_EGYPT: return "ar_EG"; case SUBLANG_ARABIC_LIBYA: return "ar_LY"; case SUBLANG_ARABIC_ALGERIA: return "ar_DZ"; case SUBLANG_ARABIC_MOROCCO: return "ar_MA"; case SUBLANG_ARABIC_TUNISIA: return "ar_TN"; case SUBLANG_ARABIC_OMAN: return "ar_OM"; case SUBLANG_ARABIC_YEMEN: return "ar_YE"; case SUBLANG_ARABIC_SYRIA: return "ar_SY"; case SUBLANG_ARABIC_JORDAN: return "ar_JO"; case SUBLANG_ARABIC_LEBANON: return "ar_LB"; case SUBLANG_ARABIC_KUWAIT: return "ar_KW"; case SUBLANG_ARABIC_UAE: return "ar_AE"; case SUBLANG_ARABIC_BAHRAIN: return "ar_BH"; case SUBLANG_ARABIC_QATAR: return "ar_QA"; } return "ar"; case LANG_ARMENIAN: switch (sub) { case SUBLANG_ARMENIAN_ARMENIA: return "hy_AM"; } return "hy"; case LANG_ASSAMESE: switch (sub) { case SUBLANG_ASSAMESE_INDIA: return "as_IN"; } return "as"; case LANG_AZERI: switch (sub) { /* FIXME: Adjust this when Azerbaijani locales appear on Unix. */ case 0x1e: return "az@latin"; case SUBLANG_AZERI_LATIN: return "az_AZ@latin"; case 0x1d: return "az@cyrillic"; case SUBLANG_AZERI_CYRILLIC: return "az_AZ@cyrillic"; } return "az"; case LANG_BASHKIR: switch (sub) { case SUBLANG_BASHKIR_RUSSIA: return "ba_RU"; } return "ba"; case LANG_BASQUE: switch (sub) { case SUBLANG_BASQUE_BASQUE: return "eu_ES"; } return "eu"; /* Ambiguous: could be "eu_ES" or "eu_FR". */ case LANG_BELARUSIAN: switch (sub) { case SUBLANG_BELARUSIAN_BELARUS: return "be_BY"; } return "be"; case LANG_BENGALI: switch (sub) { case SUBLANG_BENGALI_INDIA: return "bn_IN"; case SUBLANG_BENGALI_BANGLADESH: return "bn_BD"; } return "bn"; case LANG_BRETON: switch (sub) { case SUBLANG_BRETON_FRANCE: return "br_FR"; } return "br"; case LANG_BULGARIAN: switch (sub) { case SUBLANG_BULGARIAN_BULGARIA: return "bg_BG"; } return "bg"; case LANG_BURMESE: switch (sub) { case SUBLANG_DEFAULT: return "my_MM"; } return "my"; case LANG_CAMBODIAN: switch (sub) { case SUBLANG_CAMBODIAN_CAMBODIA: return "km_KH"; } return "km"; case LANG_CATALAN: switch (sub) { case SUBLANG_CATALAN_SPAIN: return "ca_ES"; } return "ca"; case LANG_CHEROKEE: switch (sub) { case SUBLANG_DEFAULT: return "chr_US"; } return "chr"; case LANG_CHINESE: switch (sub) { case SUBLANG_CHINESE_TRADITIONAL: case 0x1f: return "zh_TW"; case SUBLANG_CHINESE_SIMPLIFIED: case 0x00: return "zh_CN"; case SUBLANG_CHINESE_HONGKONG: return "zh_HK"; /* traditional */ case SUBLANG_CHINESE_SINGAPORE: return "zh_SG"; /* simplified */ case SUBLANG_CHINESE_MACAU: return "zh_MO"; /* traditional */ } return "zh"; case LANG_CORSICAN: switch (sub) { case SUBLANG_CORSICAN_FRANCE: return "co_FR"; } return "co"; case LANG_CROATIAN: /* LANG_CROATIAN == LANG_SERBIAN == LANG_BOSNIAN * What used to be called Serbo-Croatian * should really now be two separate * languages because of political reasons. * (Says tml, who knows nothing about Serbian * or Croatian.) * (I can feel those flames coming already.) */ switch (sub) { /* Croatian */ case 0x00: return "hr"; case SUBLANG_CROATIAN_CROATIA: return "hr_HR"; case SUBLANG_CROATIAN_BOSNIA_HERZEGOVINA_LATIN: return "hr_BA"; /* Serbian */ case 0x1f: return "sr"; case 0x1c: return "sr"; /* latin */ case SUBLANG_SERBIAN_LATIN: return "sr_CS"; /* latin */ case 0x09: return "sr_RS"; /* latin */ case 0x0b: return "sr_ME"; /* latin */ case 0x06: return "sr_BA"; /* latin */ case 0x1b: return "sr@cyrillic"; case SUBLANG_SERBIAN_CYRILLIC: return "sr_CS@cyrillic"; case 0x0a: return "sr_RS@cyrillic"; case 0x0c: return "sr_ME@cyrillic"; case 0x07: return "sr_BA@cyrillic"; /* Bosnian */ case 0x1e: return "bs"; case 0x1a: return "bs"; /* latin */ case SUBLANG_BOSNIAN_BOSNIA_HERZEGOVINA_LATIN: return "bs_BA"; /* latin */ case 0x19: return "bs@cyrillic"; case SUBLANG_BOSNIAN_BOSNIA_HERZEGOVINA_CYRILLIC: return "bs_BA@cyrillic"; } return "hr"; case LANG_CZECH: switch (sub) { case SUBLANG_CZECH_CZECH_REPUBLIC: return "cs_CZ"; } return "cs"; case LANG_DANISH: switch (sub) { case SUBLANG_DANISH_DENMARK: return "da_DK"; } return "da"; case LANG_DARI: /* FIXME: Adjust this when such locales appear on Unix. */ switch (sub) { case SUBLANG_DARI_AFGHANISTAN: return "prs_AF"; } return "prs"; case LANG_DIVEHI: switch (sub) { case SUBLANG_DIVEHI_MALDIVES: return "dv_MV"; } return "dv"; case LANG_DUTCH: switch (sub) { case SUBLANG_DUTCH: return "nl_NL"; case SUBLANG_DUTCH_BELGIAN: /* FLEMISH, VLAAMS */ return "nl_BE"; case SUBLANG_DUTCH_SURINAM: return "nl_SR"; } return "nl"; case LANG_EDO: switch (sub) { case SUBLANG_DEFAULT: return "bin_NG"; } return "bin"; case LANG_ENGLISH: switch (sub) { /* SUBLANG_ENGLISH_US == SUBLANG_DEFAULT. Heh. I thought * English was the language spoken in England. * Oh well. */ case SUBLANG_ENGLISH_US: return "en_US"; case SUBLANG_ENGLISH_UK: return "en_GB"; case SUBLANG_ENGLISH_AUS: return "en_AU"; case SUBLANG_ENGLISH_CAN: return "en_CA"; case SUBLANG_ENGLISH_NZ: return "en_NZ"; case SUBLANG_ENGLISH_EIRE: return "en_IE"; case SUBLANG_ENGLISH_SOUTH_AFRICA: return "en_ZA"; case SUBLANG_ENGLISH_JAMAICA: return "en_JM"; case SUBLANG_ENGLISH_CARIBBEAN: return "en_GD"; /* Grenada? */ case SUBLANG_ENGLISH_BELIZE: return "en_BZ"; case SUBLANG_ENGLISH_TRINIDAD: return "en_TT"; case SUBLANG_ENGLISH_ZIMBABWE: return "en_ZW"; case SUBLANG_ENGLISH_PHILIPPINES: return "en_PH"; case SUBLANG_ENGLISH_INDONESIA: return "en_ID"; case SUBLANG_ENGLISH_HONGKONG: return "en_HK"; case SUBLANG_ENGLISH_INDIA: return "en_IN"; case SUBLANG_ENGLISH_MALAYSIA: return "en_MY"; case SUBLANG_ENGLISH_SINGAPORE: return "en_SG"; } return "en"; case LANG_ESTONIAN: switch (sub) { case SUBLANG_ESTONIAN_ESTONIA: return "et_EE"; } return "et"; case LANG_FAEROESE: switch (sub) { case SUBLANG_FAEROESE_FAROE_ISLANDS: return "fo_FO"; } return "fo"; case LANG_FARSI: switch (sub) { case SUBLANG_FARSI_IRAN: return "fa_IR"; } return "fa"; case LANG_FINNISH: switch (sub) { case SUBLANG_FINNISH_FINLAND: return "fi_FI"; } return "fi"; case LANG_FRENCH: switch (sub) { case SUBLANG_FRENCH: return "fr_FR"; case SUBLANG_FRENCH_BELGIAN: /* WALLOON */ return "fr_BE"; case SUBLANG_FRENCH_CANADIAN: return "fr_CA"; case SUBLANG_FRENCH_SWISS: return "fr_CH"; case SUBLANG_FRENCH_LUXEMBOURG: return "fr_LU"; case SUBLANG_FRENCH_MONACO: return "fr_MC"; case SUBLANG_FRENCH_WESTINDIES: return "fr"; /* Caribbean? */ case SUBLANG_FRENCH_REUNION: return "fr_RE"; case SUBLANG_FRENCH_CONGO: return "fr_CG"; case SUBLANG_FRENCH_SENEGAL: return "fr_SN"; case SUBLANG_FRENCH_CAMEROON: return "fr_CM"; case SUBLANG_FRENCH_COTEDIVOIRE: return "fr_CI"; case SUBLANG_FRENCH_MALI: return "fr_ML"; case SUBLANG_FRENCH_MOROCCO: return "fr_MA"; case SUBLANG_FRENCH_HAITI: return "fr_HT"; } return "fr"; case LANG_FRISIAN: switch (sub) { case SUBLANG_FRISIAN_NETHERLANDS: return "fy_NL"; } return "fy"; case LANG_FULFULDE: /* Spoken in Nigeria, Guinea, Senegal, Mali, Niger, Cameroon, Benin. */ switch (sub) { case SUBLANG_DEFAULT: return "ff_NG"; } return "ff"; case LANG_GAELIC: switch (sub) { case 0x01: /* SCOTTISH */ /* old, superseded by LANG_SCOTTISH_GAELIC */ return "gd_GB"; case SUBLANG_IRISH_IRELAND: return "ga_IE"; } return "ga"; case LANG_GALICIAN: switch (sub) { case SUBLANG_GALICIAN_SPAIN: return "gl_ES"; } return "gl"; case LANG_GEORGIAN: switch (sub) { case SUBLANG_GEORGIAN_GEORGIA: return "ka_GE"; } return "ka"; case LANG_GERMAN: switch (sub) { case SUBLANG_GERMAN: return "de_DE"; case SUBLANG_GERMAN_SWISS: return "de_CH"; case SUBLANG_GERMAN_AUSTRIAN: return "de_AT"; case SUBLANG_GERMAN_LUXEMBOURG: return "de_LU"; case SUBLANG_GERMAN_LIECHTENSTEIN: return "de_LI"; } return "de"; case LANG_GREEK: switch (sub) { case SUBLANG_GREEK_GREECE: return "el_GR"; } return "el"; case LANG_GREENLANDIC: switch (sub) { case SUBLANG_GREENLANDIC_GREENLAND: return "kl_GL"; } return "kl"; case LANG_GUARANI: switch (sub) { case SUBLANG_DEFAULT: return "gn_PY"; } return "gn"; case LANG_GUJARATI: switch (sub) { case SUBLANG_GUJARATI_INDIA: return "gu_IN"; } return "gu"; case LANG_HAUSA: switch (sub) { case 0x1f: return "ha"; case SUBLANG_HAUSA_NIGERIA_LATIN: return "ha_NG"; } return "ha"; case LANG_HAWAIIAN: /* FIXME: Do they mean Hawaiian ("haw_US", 1000 speakers) or Hawaii Creole English ("cpe_US", 600000 speakers)? */ switch (sub) { case SUBLANG_DEFAULT: return "cpe_US"; } return "cpe"; case LANG_HEBREW: switch (sub) { case SUBLANG_HEBREW_ISRAEL: return "he_IL"; } return "he"; case LANG_HINDI: switch (sub) { case SUBLANG_HINDI_INDIA: return "hi_IN"; } return "hi"; case LANG_HUNGARIAN: switch (sub) { case SUBLANG_HUNGARIAN_HUNGARY: return "hu_HU"; } return "hu"; case LANG_IBIBIO: switch (sub) { case SUBLANG_DEFAULT: return "nic_NG"; } return "nic"; case LANG_ICELANDIC: switch (sub) { case SUBLANG_ICELANDIC_ICELAND: return "is_IS"; } return "is"; case LANG_IGBO: switch (sub) { case SUBLANG_IGBO_NIGERIA: return "ig_NG"; } return "ig"; case LANG_INDONESIAN: switch (sub) { case SUBLANG_INDONESIAN_INDONESIA: return "id_ID"; } return "id"; case LANG_INUKTITUT: switch (sub) { case 0x1e: return "iu"; /* syllabic */ case SUBLANG_INUKTITUT_CANADA: return "iu_CA"; /* syllabic */ case 0x1f: return "iu@latin"; case SUBLANG_INUKTITUT_CANADA_LATIN: return "iu_CA@latin"; } return "iu"; case LANG_ITALIAN: switch (sub) { case SUBLANG_ITALIAN: return "it_IT"; case SUBLANG_ITALIAN_SWISS: return "it_CH"; } return "it"; case LANG_JAPANESE: switch (sub) { case SUBLANG_JAPANESE_JAPAN: return "ja_JP"; } return "ja"; case LANG_KANNADA: switch (sub) { case SUBLANG_KANNADA_INDIA: return "kn_IN"; } return "kn"; case LANG_KANURI: switch (sub) { case SUBLANG_DEFAULT: return "kr_NG"; } return "kr"; case LANG_KASHMIRI: switch (sub) { case SUBLANG_DEFAULT: return "ks_PK"; case SUBLANG_KASHMIRI_INDIA: return "ks_IN"; } return "ks"; case LANG_KAZAK: switch (sub) { case SUBLANG_KAZAK_KAZAKHSTAN: return "kk_KZ"; } return "kk"; case LANG_KICHE: /* FIXME: Adjust this when such locales appear on Unix. */ switch (sub) { case SUBLANG_KICHE_GUATEMALA: return "qut_GT"; } return "qut"; case LANG_KINYARWANDA: switch (sub) { case SUBLANG_KINYARWANDA_RWANDA: return "rw_RW"; } return "rw"; case LANG_KONKANI: /* FIXME: Adjust this when such locales appear on Unix. */ switch (sub) { case SUBLANG_KONKANI_INDIA: return "kok_IN"; } return "kok"; case LANG_KOREAN: switch (sub) { case SUBLANG_DEFAULT: return "ko_KR"; } return "ko"; case LANG_KYRGYZ: switch (sub) { case SUBLANG_KYRGYZ_KYRGYZSTAN: return "ky_KG"; } return "ky"; case LANG_LAO: switch (sub) { case SUBLANG_LAO_LAOS: return "lo_LA"; } return "lo"; case LANG_LATIN: switch (sub) { case SUBLANG_DEFAULT: return "la_VA"; } return "la"; case LANG_LATVIAN: switch (sub) { case SUBLANG_LATVIAN_LATVIA: return "lv_LV"; } return "lv"; case LANG_LITHUANIAN: switch (sub) { case SUBLANG_LITHUANIAN_LITHUANIA: return "lt_LT"; } return "lt"; case LANG_LUXEMBOURGISH: switch (sub) { case SUBLANG_LUXEMBOURGISH_LUXEMBOURG: return "lb_LU"; } return "lb"; case LANG_MACEDONIAN: switch (sub) { case SUBLANG_MACEDONIAN_MACEDONIA: return "mk_MK"; } return "mk"; case LANG_MALAY: switch (sub) { case SUBLANG_MALAY_MALAYSIA: return "ms_MY"; case SUBLANG_MALAY_BRUNEI_DARUSSALAM: return "ms_BN"; } return "ms"; case LANG_MALAYALAM: switch (sub) { case SUBLANG_MALAYALAM_INDIA: return "ml_IN"; } return "ml"; case LANG_MALTESE: switch (sub) { case SUBLANG_MALTESE_MALTA: return "mt_MT"; } return "mt"; case LANG_MANIPURI: /* FIXME: Adjust this when such locales appear on Unix. */ switch (sub) { case SUBLANG_DEFAULT: return "mni_IN"; } return "mni"; case LANG_MAORI: switch (sub) { case SUBLANG_MAORI_NEW_ZEALAND: return "mi_NZ"; } return "mi"; case LANG_MAPUDUNGUN: switch (sub) { case SUBLANG_MAPUDUNGUN_CHILE: return "arn_CL"; } return "arn"; case LANG_MARATHI: switch (sub) { case SUBLANG_MARATHI_INDIA: return "mr_IN"; } return "mr"; case LANG_MOHAWK: switch (sub) { case SUBLANG_MOHAWK_CANADA: return "moh_CA"; } return "moh"; case LANG_MONGOLIAN: switch (sub) { case SUBLANG_MONGOLIAN_CYRILLIC_MONGOLIA: case 0x1e: return "mn_MN"; case SUBLANG_MONGOLIAN_PRC: case 0x1f: return "mn_CN"; } return "mn"; /* Ambiguous: could be "mn_CN" or "mn_MN". */ case LANG_NEPALI: switch (sub) { case SUBLANG_NEPALI_NEPAL: return "ne_NP"; case SUBLANG_NEPALI_INDIA: return "ne_IN"; } return "ne"; case LANG_NORWEGIAN: switch (sub) { case 0x1f: return "nb"; case SUBLANG_NORWEGIAN_BOKMAL: return "nb_NO"; case 0x1e: return "nn"; case SUBLANG_NORWEGIAN_NYNORSK: return "nn_NO"; } return "no"; case LANG_OCCITAN: switch (sub) { case SUBLANG_OCCITAN_FRANCE: return "oc_FR"; } return "oc"; case LANG_ORIYA: switch (sub) { case SUBLANG_ORIYA_INDIA: return "or_IN"; } return "or"; case LANG_OROMO: switch (sub) { case SUBLANG_DEFAULT: return "om_ET"; } return "om"; case LANG_PAPIAMENTU: switch (sub) { case SUBLANG_DEFAULT: return "pap_AN"; } return "pap"; case LANG_PASHTO: switch (sub) { case SUBLANG_PASHTO_AFGHANISTAN: return "ps_AF"; } return "ps"; /* Ambiguous: could be "ps_PK" or "ps_AF". */ case LANG_POLISH: switch (sub) { case SUBLANG_POLISH_POLAND: return "pl_PL"; } return "pl"; case LANG_PORTUGUESE: switch (sub) { /* Hmm. SUBLANG_PORTUGUESE_BRAZILIAN == SUBLANG_DEFAULT. Same phenomenon as SUBLANG_ENGLISH_US == SUBLANG_DEFAULT. */ case SUBLANG_PORTUGUESE_BRAZILIAN: return "pt_BR"; case SUBLANG_PORTUGUESE: return "pt_PT"; } return "pt"; case LANG_PUNJABI: switch (sub) { case SUBLANG_PUNJABI_INDIA: return "pa_IN"; /* Gurmukhi script */ case SUBLANG_PUNJABI_PAKISTAN: return "pa_PK"; /* Arabic script */ } return "pa"; case LANG_QUECHUA: /* Note: Microsoft uses the non-ISO language code "quz". */ switch (sub) { case SUBLANG_QUECHUA_BOLIVIA: return "qu_BO"; case SUBLANG_QUECHUA_ECUADOR: return "qu_EC"; case SUBLANG_QUECHUA_PERU: return "qu_PE"; } return "qu"; case LANG_ROMANIAN: switch (sub) { case SUBLANG_ROMANIAN_ROMANIA: return "ro_RO"; case SUBLANG_ROMANIAN_MOLDOVA: return "ro_MD"; } return "ro"; case LANG_ROMANSH: switch (sub) { case SUBLANG_ROMANSH_SWITZERLAND: return "rm_CH"; } return "rm"; case LANG_RUSSIAN: switch (sub) { case SUBLANG_RUSSIAN_RUSSIA: return "ru_RU"; case SUBLANG_RUSSIAN_MOLDAVIA: return "ru_MD"; } return "ru"; /* Ambiguous: could be "ru_RU" or "ru_UA" or "ru_MD". */ case LANG_SAMI: switch (sub) { /* Northern Sami */ case 0x00: return "se"; case SUBLANG_SAMI_NORTHERN_NORWAY: return "se_NO"; case SUBLANG_SAMI_NORTHERN_SWEDEN: return "se_SE"; case SUBLANG_SAMI_NORTHERN_FINLAND: return "se_FI"; /* Lule Sami */ case 0x1f: return "smj"; case SUBLANG_SAMI_LULE_NORWAY: return "smj_NO"; case SUBLANG_SAMI_LULE_SWEDEN: return "smj_SE"; /* Southern Sami */ case 0x1e: return "sma"; case SUBLANG_SAMI_SOUTHERN_NORWAY: return "sma_NO"; case SUBLANG_SAMI_SOUTHERN_SWEDEN: return "sma_SE"; /* Skolt Sami */ case 0x1d: return "sms"; case SUBLANG_SAMI_SKOLT_FINLAND: return "sms_FI"; /* Inari Sami */ case 0x1c: return "smn"; case SUBLANG_SAMI_INARI_FINLAND: return "smn_FI"; } return "se"; /* or "smi"? */ case LANG_SANSKRIT: switch (sub) { case SUBLANG_SANSKRIT_INDIA: return "sa_IN"; } return "sa"; case LANG_SCOTTISH_GAELIC: switch (sub) { case SUBLANG_DEFAULT: return "gd_GB"; } return "gd"; case LANG_SINDHI: switch (sub) { case SUBLANG_SINDHI_INDIA: return "sd_IN"; case SUBLANG_SINDHI_PAKISTAN: return "sd_PK"; /*case SUBLANG_SINDHI_AFGHANISTAN: return "sd_AF";*/ } return "sd"; case LANG_SINHALESE: switch (sub) { case SUBLANG_SINHALESE_SRI_LANKA: return "si_LK"; } return "si"; case LANG_SLOVAK: switch (sub) { case SUBLANG_SLOVAK_SLOVAKIA: return "sk_SK"; } return "sk"; case LANG_SLOVENIAN: switch (sub) { case SUBLANG_SLOVENIAN_SLOVENIA: return "sl_SI"; } return "sl"; case LANG_SOMALI: switch (sub) { case SUBLANG_DEFAULT: return "so_SO"; } return "so"; case LANG_SORBIAN: /* FIXME: Adjust this when such locales appear on Unix. */ switch (sub) { /* Upper Sorbian */ case 0x00: return "hsb"; case SUBLANG_UPPER_SORBIAN_GERMANY: return "hsb_DE"; /* Lower Sorbian */ case 0x1f: return "dsb"; case SUBLANG_LOWER_SORBIAN_GERMANY: return "dsb_DE"; } return "wen"; case LANG_SOTHO: /* calls it "Sesotho sa Leboa"; according to it's the same as Northern Sotho. */ switch (sub) { case SUBLANG_SOTHO_SOUTH_AFRICA: return "nso_ZA"; } return "nso"; case LANG_SPANISH: switch (sub) { case SUBLANG_SPANISH: return "es_ES"; case SUBLANG_SPANISH_MEXICAN: return "es_MX"; case SUBLANG_SPANISH_MODERN: return "es_ES@modern"; /* not seen on Unix */ case SUBLANG_SPANISH_GUATEMALA: return "es_GT"; case SUBLANG_SPANISH_COSTA_RICA: return "es_CR"; case SUBLANG_SPANISH_PANAMA: return "es_PA"; case SUBLANG_SPANISH_DOMINICAN_REPUBLIC: return "es_DO"; case SUBLANG_SPANISH_VENEZUELA: return "es_VE"; case SUBLANG_SPANISH_COLOMBIA: return "es_CO"; case SUBLANG_SPANISH_PERU: return "es_PE"; case SUBLANG_SPANISH_ARGENTINA: return "es_AR"; case SUBLANG_SPANISH_ECUADOR: return "es_EC"; case SUBLANG_SPANISH_CHILE: return "es_CL"; case SUBLANG_SPANISH_URUGUAY: return "es_UY"; case SUBLANG_SPANISH_PARAGUAY: return "es_PY"; case SUBLANG_SPANISH_BOLIVIA: return "es_BO"; case SUBLANG_SPANISH_EL_SALVADOR: return "es_SV"; case SUBLANG_SPANISH_HONDURAS: return "es_HN"; case SUBLANG_SPANISH_NICARAGUA: return "es_NI"; case SUBLANG_SPANISH_PUERTO_RICO: return "es_PR"; case SUBLANG_SPANISH_US: return "es_US"; } return "es"; case LANG_SUTU: switch (sub) { case SUBLANG_DEFAULT: return "bnt_TZ"; /* or "st_LS" or "nso_ZA"? */ } return "bnt"; case LANG_SWAHILI: switch (sub) { case SUBLANG_SWAHILI_KENYA: return "sw_KE"; } return "sw"; case LANG_SWEDISH: switch (sub) { case SUBLANG_SWEDISH_SWEDEN: return "sv_SE"; case SUBLANG_SWEDISH_FINLAND: return "sv_FI"; } return "sv"; case LANG_SYRIAC: switch (sub) { case SUBLANG_SYRIAC_SYRIA: return "syr_SY"; /* An extinct language. */ } return "syr"; case LANG_TAGALOG: switch (sub) { case SUBLANG_TAGALOG_PHILIPPINES: return "tl_PH"; /* or "fil_PH"? */ } return "tl"; /* or "fil"? */ case LANG_TAJIK: switch (sub) { case 0x1f: return "tg"; case SUBLANG_TAJIK_TAJIKISTAN: return "tg_TJ"; } return "tg"; case LANG_TAMAZIGHT: /* Note: Microsoft uses the non-ISO language code "tmz". */ switch (sub) { /* FIXME: Adjust this when Tamazight locales appear on Unix. */ case SUBLANG_TAMAZIGHT_ARABIC: return "ber_MA@arabic"; case 0x1f: return "ber@latin"; case SUBLANG_TAMAZIGHT_ALGERIA_LATIN: return "ber_DZ@latin"; } return "ber"; case LANG_TAMIL: switch (sub) { case SUBLANG_TAMIL_INDIA: return "ta_IN"; } return "ta"; /* Ambiguous: could be "ta_IN" or "ta_LK" or "ta_SG". */ case LANG_TATAR: switch (sub) { case SUBLANG_TATAR_RUSSIA: return "tt_RU"; } return "tt"; case LANG_TELUGU: switch (sub) { case SUBLANG_TELUGU_INDIA: return "te_IN"; } return "te"; case LANG_THAI: switch (sub) { case SUBLANG_THAI_THAILAND: return "th_TH"; } return "th"; case LANG_TIBETAN: switch (sub) { case SUBLANG_TIBETAN_PRC: /* Most Tibetans would not like "bo_CN". But Tibet does not yet have a country code of its own. */ return "bo"; case SUBLANG_TIBETAN_BHUTAN: return "bo_BT"; } return "bo"; case LANG_TIGRINYA: switch (sub) { case SUBLANG_TIGRINYA_ETHIOPIA: return "ti_ET"; case SUBLANG_TIGRINYA_ERITREA: return "ti_ER"; } return "ti"; case LANG_TSONGA: switch (sub) { case SUBLANG_DEFAULT: return "ts_ZA"; } return "ts"; case LANG_TSWANA: /* Spoken in South Africa, Botswana. */ switch (sub) { case SUBLANG_TSWANA_SOUTH_AFRICA: return "tn_ZA"; } return "tn"; case LANG_TURKISH: switch (sub) { case SUBLANG_TURKISH_TURKEY: return "tr_TR"; } return "tr"; case LANG_TURKMEN: switch (sub) { case SUBLANG_TURKMEN_TURKMENISTAN: return "tk_TM"; } return "tk"; case LANG_UIGHUR: switch (sub) { case SUBLANG_UIGHUR_PRC: return "ug_CN"; } return "ug"; case LANG_UKRAINIAN: switch (sub) { case SUBLANG_UKRAINIAN_UKRAINE: return "uk_UA"; } return "uk"; case LANG_URDU: switch (sub) { case SUBLANG_URDU_PAKISTAN: return "ur_PK"; case SUBLANG_URDU_INDIA: return "ur_IN"; } return "ur"; case LANG_UZBEK: switch (sub) { case 0x1f: return "uz"; case SUBLANG_UZBEK_LATIN: return "uz_UZ"; case 0x1e: return "uz@cyrillic"; case SUBLANG_UZBEK_CYRILLIC: return "uz_UZ@cyrillic"; } return "uz"; case LANG_VENDA: switch (sub) { case SUBLANG_DEFAULT: return "ve_ZA"; } return "ve"; case LANG_VIETNAMESE: switch (sub) { case SUBLANG_VIETNAMESE_VIETNAM: return "vi_VN"; } return "vi"; case LANG_WELSH: switch (sub) { case SUBLANG_WELSH_UNITED_KINGDOM: return "cy_GB"; } return "cy"; case LANG_WOLOF: switch (sub) { case SUBLANG_WOLOF_SENEGAL: return "wo_SN"; } return "wo"; case LANG_XHOSA: switch (sub) { case SUBLANG_XHOSA_SOUTH_AFRICA: return "xh_ZA"; } return "xh"; case LANG_YAKUT: switch (sub) { case SUBLANG_YAKUT_RUSSIA: return "sah_RU"; } return "sah"; case LANG_YI: switch (sub) { case SUBLANG_YI_PRC: return "ii_CN"; } return "ii"; case LANG_YIDDISH: switch (sub) { case SUBLANG_DEFAULT: return "yi_IL"; } return "yi"; case LANG_YORUBA: switch (sub) { case SUBLANG_YORUBA_NIGERIA: return "yo_NG"; } return "yo"; case LANG_ZULU: switch (sub) { case SUBLANG_ZULU_SOUTH_AFRICA: return "zu_ZA"; } return "zu"; default: return "C"; } } } # if !defined IN_LIBINTL static # endif const char * gl_locale_name_from_win32_LCID (LCID lcid) { LANGID langid; /* Strip off the sorting rules, keep only the language part. */ langid = LANGIDFROMLCID (lcid); return gl_locale_name_from_win32_LANGID (langid); } # ifdef WINDOWS_NATIVE /* Two variables to interface between get_lcid and the EnumLocales callback function below. */ static LCID found_lcid; static char lname[LC_MAX * (LOCALE_NAME_MAX_LENGTH + 1) + 1]; /* Callback function for EnumLocales. */ static BOOL CALLBACK enum_locales_fn (LPSTR locale_num_str) { char *endp; char locval[2 * LOCALE_NAME_MAX_LENGTH + 1 + 1]; LCID try_lcid = strtoul (locale_num_str, &endp, 16); if (GetLocaleInfo (try_lcid, LOCALE_SENGLANGUAGE, locval, LOCALE_NAME_MAX_LENGTH)) { strcat (locval, "_"); if (GetLocaleInfo (try_lcid, LOCALE_SENGCOUNTRY, locval + strlen (locval), LOCALE_NAME_MAX_LENGTH)) { size_t locval_len = strlen (locval); if (strncmp (locval, lname, locval_len) == 0 && (lname[locval_len] == '.' || lname[locval_len] == '\0')) { found_lcid = try_lcid; return FALSE; } } } return TRUE; } /* This lock protects the get_lcid against multiple simultaneous calls. */ gl_lock_define_initialized(static, get_lcid_lock) /* Return the Locale ID (LCID) number given the locale's name, a string, in LOCALE_NAME. This works by enumerating all the locales supported by the system, until we find one whose name matches LOCALE_NAME. */ static LCID get_lcid (const char *locale_name) { /* A simple cache. */ static LCID last_lcid; static char last_locale[1000]; /* Lock while looking for an LCID, to protect access to static variables: last_lcid, last_locale, found_lcid, and lname. */ gl_lock_lock (get_lcid_lock); if (last_lcid > 0 && strcmp (locale_name, last_locale) == 0) { gl_lock_unlock (get_lcid_lock); return last_lcid; } strncpy (lname, locale_name, sizeof (lname) - 1); lname[sizeof (lname) - 1] = '\0'; found_lcid = 0; EnumSystemLocales (enum_locales_fn, LCID_SUPPORTED); if (found_lcid > 0) { last_lcid = found_lcid; strcpy (last_locale, locale_name); } gl_lock_unlock (get_lcid_lock); return found_lcid; } # endif #endif #if HAVE_GOOD_USELOCALE /* glibc, Mac OS X, FreeBSD >= 9.1, Cygwin >= 2.6, Solaris 11 OpenIndiana, or Solaris >= 11.4 */ /* Simple hash set of strings. We don't want to drag in lots of hash table code here. */ # define SIZE_BITS (sizeof (size_t) * CHAR_BIT) /* A hash function for NUL-terminated char* strings using the method described by Bruno Haible. See https://www.haible.de/bruno/hashfunc.html. */ static size_t _GL_ATTRIBUTE_PURE string_hash (const void *x) { const char *s = (const char *) x; size_t h = 0; for (; *s; s++) h = *s + ((h << 9) | (h >> (SIZE_BITS - 9))); return h; } /* A hash table of fixed size. Multiple threads can access it read-only simultaneously, but only one thread can insert into it at the same time. */ /* A node in a hash bucket collision list. */ struct struniq_hash_node { struct struniq_hash_node * volatile next; char contents[FLEXIBLE_ARRAY_MEMBER]; }; # define STRUNIQ_HASH_TABLE_SIZE 257 static struct struniq_hash_node * volatile struniq_hash_table[STRUNIQ_HASH_TABLE_SIZE] /* = { NULL, ..., NULL } */; /* This lock protects the struniq_hash_table against multiple simultaneous insertions. */ gl_lock_define_initialized(static, struniq_lock) /* Store a copy of the given string in a string pool with indefinite extent. Return a pointer to this copy. */ static const char * struniq (const char *string) { size_t hashcode = string_hash (string); size_t slot = hashcode % STRUNIQ_HASH_TABLE_SIZE; size_t size; struct struniq_hash_node *new_node; struct struniq_hash_node *p; for (p = struniq_hash_table[slot]; p != NULL; p = p->next) if (strcmp (p->contents, string) == 0) return p->contents; size = strlen (string) + 1; new_node = (struct struniq_hash_node *) malloc (FLEXSIZEOF (struct struniq_hash_node, contents, size)); if (new_node == NULL) /* Out of memory. Return a statically allocated string. */ return "C"; memcpy (new_node->contents, string, size); { IF_MT_DECL; /* Lock while inserting new_node. */ IF_MT gl_lock_lock (struniq_lock); /* Check whether another thread already added the string while we were waiting on the lock. */ for (p = struniq_hash_table[slot]; p != NULL; p = p->next) if (strcmp (p->contents, string) == 0) { free (new_node); new_node = p; goto done; } /* Really insert new_node into the hash table. Fill new_node entirely first, because other threads may be iterating over the linked list. */ new_node->next = struniq_hash_table[slot]; struniq_hash_table[slot] = new_node; done: /* Unlock after new_node is inserted. */ IF_MT gl_lock_unlock (struniq_lock); } return new_node->contents; } #endif #if HAVE_GOOD_USELOCALE && HAVE_NAMELESS_LOCALES /* The 'locale_t' object does not contain the names of the locale categories. We have to associate them with the object through a hash table. The hash table is defined in localename-table.[hc]. */ /* Returns the name of a given locale category in a given locale_t object, allocated as a string with indefinite extent. */ static const char * get_locale_t_name (int category, locale_t locale) { if (locale == LC_GLOBAL_LOCALE) { /* Query the global locale. */ const char *name = setlocale_null (category); if (name != NULL) return struniq (name); else /* Should normally not happen. */ return ""; } else { /* Look up the names in the hash table. */ size_t hashcode = locale_hash_function (locale); size_t slot = hashcode % LOCALE_HASH_TABLE_SIZE; /* If the locale was not found in the table, return "". This can happen if the application uses the original newlocale()/duplocale() functions instead of the overridden ones. */ const char *name = ""; struct locale_hash_node *p; /* Lock while looking up the hash node. */ gl_rwlock_rdlock (locale_lock); for (p = locale_hash_table[slot]; p != NULL; p = p->next) if (p->locale == locale) { name = p->names.category_name[category]; break; } gl_rwlock_unlock (locale_lock); return name; } } # if !(defined newlocale && defined duplocale && defined freelocale) # error "newlocale, duplocale, freelocale not being replaced as expected!" # endif /* newlocale() override. */ locale_t newlocale (int category_mask, const char *name, locale_t base) #undef newlocale { struct locale_categories_names names; struct locale_hash_node *node; locale_t result; /* Make sure name has indefinite extent. */ if (((LC_CTYPE_MASK | LC_NUMERIC_MASK | LC_TIME_MASK | LC_COLLATE_MASK | LC_MONETARY_MASK | LC_MESSAGES_MASK) & category_mask) != 0) name = struniq (name); /* Determine the category names of the result. */ if (((LC_CTYPE_MASK | LC_NUMERIC_MASK | LC_TIME_MASK | LC_COLLATE_MASK | LC_MONETARY_MASK | LC_MESSAGES_MASK) & ~category_mask) == 0) { /* Use name, ignore base. */ int category; name = struniq (name); for (category = 0; category < 6; category++) names.category_name[category] = name; } else { /* Use base, possibly also name. */ if (base == NULL) { int category; for (category = 0; category < 6; category++) { int mask; switch (category) { case LC_CTYPE: mask = LC_CTYPE_MASK; break; case LC_NUMERIC: mask = LC_NUMERIC_MASK; break; case LC_TIME: mask = LC_TIME_MASK; break; case LC_COLLATE: mask = LC_COLLATE_MASK; break; case LC_MONETARY: mask = LC_MONETARY_MASK; break; case LC_MESSAGES: mask = LC_MESSAGES_MASK; break; default: abort (); } names.category_name[category] = ((mask & category_mask) != 0 ? name : "C"); } } else if (base == LC_GLOBAL_LOCALE) { int category; for (category = 0; category < 6; category++) { int mask; switch (category) { case LC_CTYPE: mask = LC_CTYPE_MASK; break; case LC_NUMERIC: mask = LC_NUMERIC_MASK; break; case LC_TIME: mask = LC_TIME_MASK; break; case LC_COLLATE: mask = LC_COLLATE_MASK; break; case LC_MONETARY: mask = LC_MONETARY_MASK; break; case LC_MESSAGES: mask = LC_MESSAGES_MASK; break; default: abort (); } names.category_name[category] = ((mask & category_mask) != 0 ? name : get_locale_t_name (category, LC_GLOBAL_LOCALE)); } } else { /* Look up the names of base in the hash table. Like multiple calls of get_locale_t_name, but locking only once. */ struct locale_hash_node *p; int category; /* Lock while looking up the hash node. */ gl_rwlock_rdlock (locale_lock); for (p = locale_hash_table[locale_hash_function (base) % LOCALE_HASH_TABLE_SIZE]; p != NULL; p = p->next) if (p->locale == base) break; for (category = 0; category < 6; category++) { int mask; switch (category) { case LC_CTYPE: mask = LC_CTYPE_MASK; break; case LC_NUMERIC: mask = LC_NUMERIC_MASK; break; case LC_TIME: mask = LC_TIME_MASK; break; case LC_COLLATE: mask = LC_COLLATE_MASK; break; case LC_MONETARY: mask = LC_MONETARY_MASK; break; case LC_MESSAGES: mask = LC_MESSAGES_MASK; break; default: abort (); } names.category_name[category] = ((mask & category_mask) != 0 ? name : (p != NULL ? p->names.category_name[category] : "")); } gl_rwlock_unlock (locale_lock); } } node = (struct locale_hash_node *) malloc (sizeof (struct locale_hash_node)); if (node == NULL) /* errno is set to ENOMEM. */ return NULL; result = newlocale (category_mask, name, base); if (result == NULL) { int saved_errno = errno; free (node); errno = saved_errno; return NULL; } /* Fill the hash node. */ node->locale = result; node->names = names; /* Insert it in the hash table. */ { size_t hashcode = locale_hash_function (result); size_t slot = hashcode % LOCALE_HASH_TABLE_SIZE; struct locale_hash_node *p; /* Lock while inserting the new node. */ gl_rwlock_wrlock (locale_lock); for (p = locale_hash_table[slot]; p != NULL; p = p->next) if (p->locale == result) { /* This can happen if the application uses the original freelocale() function instead of the overridden one. */ p->names = node->names; break; } if (p == NULL) { node->next = locale_hash_table[slot]; locale_hash_table[slot] = node; } gl_rwlock_unlock (locale_lock); if (p != NULL) free (node); } return result; } /* duplocale() override. */ locale_t duplocale (locale_t locale) #undef duplocale { struct locale_hash_node *node; locale_t result; if (locale == NULL) /* Invalid argument. */ abort (); node = (struct locale_hash_node *) malloc (sizeof (struct locale_hash_node)); if (node == NULL) /* errno is set to ENOMEM. */ return NULL; result = duplocale (locale); if (result == NULL) { int saved_errno = errno; free (node); errno = saved_errno; return NULL; } /* Fill the hash node. */ node->locale = result; if (locale == LC_GLOBAL_LOCALE) { int category; for (category = 0; category < 6; category++) node->names.category_name[category] = get_locale_t_name (category, LC_GLOBAL_LOCALE); /* Lock before inserting the new node. */ gl_rwlock_wrlock (locale_lock); } else { struct locale_hash_node *p; /* Lock once, for the lookup and the insertion. */ gl_rwlock_wrlock (locale_lock); for (p = locale_hash_table[locale_hash_function (locale) % LOCALE_HASH_TABLE_SIZE]; p != NULL; p = p->next) if (p->locale == locale) break; if (p != NULL) node->names = p->names; else { /* This can happen if the application uses the original newlocale()/duplocale() functions instead of the overridden ones. */ int category; for (category = 0; category < 6; category++) node->names.category_name[category] = ""; } } /* Insert it in the hash table. */ { size_t hashcode = locale_hash_function (result); size_t slot = hashcode % LOCALE_HASH_TABLE_SIZE; struct locale_hash_node *p; for (p = locale_hash_table[slot]; p != NULL; p = p->next) if (p->locale == result) { /* This can happen if the application uses the original freelocale() function instead of the overridden one. */ p->names = node->names; break; } if (p == NULL) { node->next = locale_hash_table[slot]; locale_hash_table[slot] = node; } gl_rwlock_unlock (locale_lock); if (p != NULL) free (node); } return result; } /* freelocale() override. */ void freelocale (locale_t locale) #undef freelocale { if (locale == NULL || locale == LC_GLOBAL_LOCALE) /* Invalid argument. */ abort (); { size_t hashcode = locale_hash_function (locale); size_t slot = hashcode % LOCALE_HASH_TABLE_SIZE; struct locale_hash_node *found; struct locale_hash_node **p; found = NULL; /* Lock while removing the hash node. */ gl_rwlock_wrlock (locale_lock); for (p = &locale_hash_table[slot]; *p != NULL; p = &(*p)->next) if ((*p)->locale == locale) { found = *p; *p = (*p)->next; break; } gl_rwlock_unlock (locale_lock); free (found); } freelocale (locale); } #endif #if defined IN_LIBINTL || HAVE_GOOD_USELOCALE /* Like gl_locale_name_thread, except that the result is not in storage of indefinite extent. */ # if !defined IN_LIBINTL static # endif const char * gl_locale_name_thread_unsafe (int category, const char *categoryname) { # if HAVE_GOOD_USELOCALE { locale_t thread_locale = uselocale (NULL); if (thread_locale != LC_GLOBAL_LOCALE) { # if __GLIBC__ >= 2 && !defined __UCLIBC__ /* Work around an incorrect definition of the _NL_LOCALE_NAME macro in glibc < 2.12. See . */ const char *name = nl_langinfo (_NL_ITEM ((category), _NL_ITEM_INDEX (-1))); if (name[0] == '\0') /* Fallback code for glibc < 2.4, which did not implement nl_langinfo (_NL_LOCALE_NAME (category)). */ name = thread_locale->__names[category]; return name; # elif defined __linux__ && HAVE_LANGINFO_H && defined NL_LOCALE_NAME /* musl libc */ return nl_langinfo_l (NL_LOCALE_NAME (category), thread_locale); # elif (defined __FreeBSD__ || defined __DragonFly__) || (defined __APPLE__ && defined __MACH__) /* FreeBSD, Mac OS X */ int mask; switch (category) { case LC_CTYPE: mask = LC_CTYPE_MASK; break; case LC_NUMERIC: mask = LC_NUMERIC_MASK; break; case LC_TIME: mask = LC_TIME_MASK; break; case LC_COLLATE: mask = LC_COLLATE_MASK; break; case LC_MONETARY: mask = LC_MONETARY_MASK; break; case LC_MESSAGES: mask = LC_MESSAGES_MASK; break; default: /* We shouldn't get here. */ return ""; } return querylocale (mask, thread_locale); # elif defined __sun # if HAVE_GETLOCALENAME_L /* Solaris >= 12. */ return getlocalename_l (category, thread_locale); # elif HAVE_SOLARIS114_LOCALES /* Solaris >= 11.4. */ void *lcp = (*thread_locale)->core.data->lcp; if (lcp != NULL) switch (category) { case LC_CTYPE: case LC_NUMERIC: case LC_TIME: case LC_COLLATE: case LC_MONETARY: case LC_MESSAGES: return ((const char * const *) lcp)[category]; default: /* We shouldn't get here. */ return ""; } # elif HAVE_NAMELESS_LOCALES return get_locale_t_name (category, thread_locale); # else /* Solaris 11 OpenIndiana. For the internal structure of locale objects, see https://github.com/OpenIndiana/illumos-gate/blob/master/usr/src/lib/libc/port/locale/localeimpl.h */ switch (category) { case LC_CTYPE: case LC_NUMERIC: case LC_TIME: case LC_COLLATE: case LC_MONETARY: case LC_MESSAGES: return ((const char * const *) thread_locale)[category]; default: /* We shouldn't get here. */ return ""; } # endif # elif defined _AIX && HAVE_NAMELESS_LOCALES return get_locale_t_name (category, thread_locale); # elif defined __CYGWIN__ /* Cygwin < 2.6 lacks uselocale and thread-local locales altogether. Cygwin <= 2.6.1 lacks NL_LOCALE_NAME, requiring peeking inside an opaque struct. */ # ifdef NL_LOCALE_NAME return nl_langinfo_l (NL_LOCALE_NAME (category), thread_locale); # else /* FIXME: Remove when we can assume new-enough Cygwin. */ struct __locale_t { char categories[7][32]; }; return ((struct __locale_t *) thread_locale)->categories[category]; # endif # elif defined __ANDROID__ return MB_CUR_MAX == 4 ? "C.UTF-8" : "C"; # endif } } # endif return NULL; } #endif const char * gl_locale_name_thread (int category, const char *categoryname) { #if HAVE_GOOD_USELOCALE const char *name = gl_locale_name_thread_unsafe (category, categoryname); if (name != NULL) return struniq (name); #endif /* On WINDOWS_NATIVE, don't use GetThreadLocale() here, because when SetThreadLocale has not been called - which is a very frequent case - the value of GetThreadLocale() ignores past calls to 'setlocale'. */ return NULL; } /* XPG3 defines the result of 'setlocale (category, NULL)' as: "Directs 'setlocale()' to query 'category' and return the current setting of 'local'." However it does not specify the exact format. Neither do SUSV2 and ISO C 99. So we can use this feature only on selected systems (e.g. those using GNU C Library). */ #if defined _LIBC || ((defined __GLIBC__ && __GLIBC__ >= 2) && !defined __UCLIBC__) # define HAVE_LOCALE_NULL #endif const char * gl_locale_name_posix (int category, const char *categoryname) { #if defined WINDOWS_NATIVE if (LC_MIN <= category && category <= LC_MAX) { const char *locname = /* setlocale_null (category) is identical to setlocale (category, NULL) on this platform. */ setlocale (category, NULL); /* Convert locale name to LCID. We don't want to use LocaleNameToLCID because (a) it is only available since Vista, and (b) it doesn't accept locale names returned by 'setlocale'. */ LCID lcid = get_lcid (locname); if (lcid > 0) return gl_locale_name_from_win32_LCID (lcid); } #endif { const char *locname; /* Use the POSIX methods of looking to 'LC_ALL', 'LC_xxx', and 'LANG'. On some systems this can be done by the 'setlocale' function itself. */ #if defined HAVE_LC_MESSAGES && defined HAVE_LOCALE_NULL locname = setlocale_null (category); #else /* On other systems we ignore what setlocale reports and instead look at the environment variables directly. This is necessary 1. on systems which have a facility for customizing the default locale (Mac OS X, native Windows, Cygwin) and where the system's setlocale() function ignores this default locale (Mac OS X, Cygwin), in two cases: a. when the user missed to use the setlocale() override from libintl (for example by not including ), b. when setlocale supports only the "C" locale, such as on Cygwin 1.5.x. In this case even the override from libintl cannot help. 2. on all systems where setlocale supports only the "C" locale. */ /* Strictly speaking, it is a POSIX violation to look at the environment variables regardless whether setlocale has been called or not. POSIX says: "For C-language programs, the POSIX locale shall be the default locale when the setlocale() function is not called." But we assume that all programs that use internationalized APIs call setlocale (LC_ALL, ""). */ locname = gl_locale_name_environ (category, categoryname); #endif /* Convert the locale name from the format returned by setlocale() or found in the environment variables to the XPG syntax. */ #if defined WINDOWS_NATIVE if (locname != NULL) { /* Convert locale name to LCID. We don't want to use LocaleNameToLCID because (a) it is only available since Vista, and (b) it doesn't accept locale names returned by 'setlocale'. */ LCID lcid = get_lcid (locname); if (lcid > 0) return gl_locale_name_from_win32_LCID (lcid); } #endif return locname; } } const char * gl_locale_name_environ (int category, const char *categoryname) { const char *retval; /* Setting of LC_ALL overrides all other. */ retval = getenv ("LC_ALL"); if (retval != NULL && retval[0] != '\0') return retval; /* Next comes the name of the desired category. */ retval = getenv (categoryname); if (retval != NULL && retval[0] != '\0') return retval; /* Last possibility is the LANG environment variable. */ retval = getenv ("LANG"); if (retval != NULL && retval[0] != '\0') { #if HAVE_CFPREFERENCESCOPYAPPVALUE /* Mac OS X 10.2 or newer. Ignore invalid LANG value set by the Terminal application. */ if (strcmp (retval, "UTF-8") != 0) #endif #if defined __CYGWIN__ /* Cygwin. Ignore dummy LANG value set by ~/.profile. */ if (strcmp (retval, "C.UTF-8") != 0) #endif return retval; } return NULL; } const char * gl_locale_name_default (void) { /* POSIX:2001 says: "All implementations shall define a locale as the default locale, to be invoked when no environment variables are set, or set to the empty string. This default locale can be the POSIX locale or any other implementation-defined locale. Some implementations may provide facilities for local installation administrators to set the default locale, customizing it for each location. POSIX:2001 does not require such a facility. The systems with such a facility are Mac OS X and Windows: They provide a GUI that allows the user to choose a locale. - On Mac OS X, by default, none of LC_* or LANG are set. Starting with Mac OS X 10.4 or 10.5, LANG is set for processes launched by the 'Terminal' application (but sometimes to an incorrect value "UTF-8"). When no environment variable is set, setlocale (LC_ALL, "") uses the "C" locale. - On native Windows, by default, none of LC_* or LANG are set. When no environment variable is set, setlocale (LC_ALL, "") uses the locale chosen by the user. - On Cygwin 1.5.x, by default, none of LC_* or LANG are set. When no environment variable is set, setlocale (LC_ALL, "") uses the "C" locale. - On Cygwin 1.7, by default, LANG is set to "C.UTF-8" when the default ~/.profile is executed. When no environment variable is set, setlocale (LC_ALL, "") uses the "C.UTF-8" locale, which operates in the same way as the "C" locale. */ #if !(HAVE_CFPREFERENCESCOPYAPPVALUE || defined WINDOWS_NATIVE || defined __CYGWIN__) /* The system does not have a way of setting the locale, other than the POSIX specified environment variables. We use C as default locale. */ return "C"; #else /* Return an XPG style locale name language[_territory][@modifier]. Don't even bother determining the codeset; it's not useful in this context, because message catalogs are not specific to a single codeset. */ # if HAVE_CFPREFERENCESCOPYAPPVALUE /* Mac OS X 10.4 or newer */ /* Don't use the API introduced in Mac OS X 10.5, CFLocaleCopyCurrent, because in macOS 10.13.4 it has the following behaviour: When two or more languages are specified in the "System Preferences > Language & Region > Preferred Languages" panel, it returns en_CC where CC is the territory (even when English is not among the preferred languages!). What we want instead is what CFLocaleCopyCurrent returned in earlier macOS releases and what CFPreferencesCopyAppValue still returns, namely ll_CC where ll is the first among the preferred languages and CC is the territory. */ { /* Cache the locale name, since CoreFoundation calls are expensive. */ static const char *cached_localename; if (cached_localename == NULL) { char namebuf[256]; CFTypeRef value = CFPreferencesCopyAppValue (CFSTR ("AppleLocale"), kCFPreferencesCurrentApplication); if (value != NULL && CFGetTypeID (value) == CFStringGetTypeID ()) { CFStringRef name = (CFStringRef)value; if (CFStringGetCString (name, namebuf, sizeof (namebuf), kCFStringEncodingASCII)) { gl_locale_name_canonicalize (namebuf); cached_localename = strdup (namebuf); } } if (cached_localename == NULL) cached_localename = "C"; } return cached_localename; } # endif # if defined WINDOWS_NATIVE || defined __CYGWIN__ /* Native Windows or Cygwin */ { LCID lcid; /* Use native Windows API locale ID. */ lcid = GetThreadLocale (); return gl_locale_name_from_win32_LCID (lcid); } # endif #endif } /* Determine the current locale's name, and canonicalize it into XPG syntax language[_territory][.codeset][@modifier] The codeset part in the result is not reliable; the locale_charset() should be used for codeset information instead. The result must not be freed; it is statically allocated. */ const char * gl_locale_name (int category, const char *categoryname) { const char *retval; retval = gl_locale_name_thread (category, categoryname); if (retval != NULL) return retval; retval = gl_locale_name_posix (category, categoryname); if (retval != NULL) return retval; return gl_locale_name_default (); } pspp-1.4.1/gl/stdint.in.h0000644000175000017500000005535213723215640014615 0ustar00blpblp00000000000000/* Copyright (C) 2001-2002, 2004-2020 Free Software Foundation, Inc. Written by Paul Eggert, Bruno Haible, Sam Steingold, Peter Burwood. This file is part of gnulib. 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 3, 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, see . */ /* * ISO C 99 for platforms that lack it. * */ #ifndef _@GUARD_PREFIX@_STDINT_H #if __GNUC__ >= 3 @PRAGMA_SYSTEM_HEADER@ #endif @PRAGMA_COLUMNS@ /* When including a system file that in turn includes , use the system , not our substitute. This avoids problems with (for example) VMS, whose includes . */ #define _GL_JUST_INCLUDE_SYSTEM_INTTYPES_H /* On Android (Bionic libc), includes this file before having defined 'time_t'. Therefore in this case avoid including other system header files; just include the system's . Ideally we should test __BIONIC__ here, but it is only defined after has been included; hence test __ANDROID__ instead. */ #if defined __ANDROID__ && defined _GL_INCLUDING_SYS_TYPES_H # @INCLUDE_NEXT@ @NEXT_STDINT_H@ #else /* Get those types that are already defined in other system include files, so that we can "#define int8_t signed char" below without worrying about a later system include file containing a "typedef signed char int8_t;" that will get messed up by our macro. Our macros should all be consistent with the system versions, except for the "fast" types and macros, which we recommend against using in public interfaces due to compiler differences. */ #if @HAVE_STDINT_H@ # if defined __sgi && ! defined __c99 /* Bypass IRIX's if in C89 mode, since it merely annoys users with "This header file is to be used only for c99 mode compilations" diagnostics. */ # define __STDINT_H__ # endif /* Some pre-C++11 implementations need this. */ # ifdef __cplusplus # ifndef __STDC_CONSTANT_MACROS # define __STDC_CONSTANT_MACROS 1 # endif # ifndef __STDC_LIMIT_MACROS # define __STDC_LIMIT_MACROS 1 # endif # endif /* Other systems may have an incomplete or buggy . Include it before , since any "#include " in would reinclude us, skipping our contents because _@GUARD_PREFIX@_STDINT_H is defined. The include_next requires a split double-inclusion guard. */ # @INCLUDE_NEXT@ @NEXT_STDINT_H@ #endif #if ! defined _@GUARD_PREFIX@_STDINT_H && ! defined _GL_JUST_INCLUDE_SYSTEM_STDINT_H #define _@GUARD_PREFIX@_STDINT_H /* Get SCHAR_MIN, SCHAR_MAX, UCHAR_MAX, INT_MIN, INT_MAX, LONG_MIN, LONG_MAX, ULONG_MAX, _GL_INTEGER_WIDTH. */ #include /* Override WINT_MIN and WINT_MAX if gnulib's or overrides wint_t. */ #if @GNULIB_OVERRIDES_WINT_T@ # undef WINT_MIN # undef WINT_MAX # define WINT_MIN 0x0U # define WINT_MAX 0xffffffffU #endif #if ! @HAVE_C99_STDINT_H@ /* defines some of the stdint.h types as well, on glibc, IRIX 6.5, and OpenBSD 3.8 (via ). AIX 5.2 isn't needed and causes troubles. Mac OS X 10.4.6 includes (which is us), but relies on the system definitions, so include after @NEXT_STDINT_H@. */ # if @HAVE_SYS_TYPES_H@ && ! defined _AIX # include # endif # if @HAVE_INTTYPES_H@ /* In OpenBSD 3.8, includes , which defines int{8,16,32,64}_t, uint{8,16,32,64}_t and __BIT_TYPES_DEFINED__. also defines intptr_t and uintptr_t. */ # include # elif @HAVE_SYS_INTTYPES_H@ /* Solaris 7 has the types except the *_fast*_t types, and the macros except for *_FAST*_*, INTPTR_MIN, PTRDIFF_MIN, PTRDIFF_MAX. */ # include # endif # if @HAVE_SYS_BITYPES_H@ && ! defined __BIT_TYPES_DEFINED__ /* Linux libc4 >= 4.6.7 and libc5 have a that defines int{8,16,32,64}_t and __BIT_TYPES_DEFINED__. In libc5 >= 5.2.2 it is included by . */ # include # endif # undef _GL_JUST_INCLUDE_SYSTEM_INTTYPES_H /* Minimum and maximum values for an integer type under the usual assumption. Return an unspecified value if BITS == 0, adding a check to pacify picky compilers. */ /* These are separate macros, because if you try to merge these macros into a single one, HP-UX cc rejects the resulting expression in constant expressions. */ # define _STDINT_UNSIGNED_MIN(bits, zero) \ (zero) # define _STDINT_SIGNED_MIN(bits, zero) \ (~ _STDINT_MAX (1, bits, zero)) # define _STDINT_MAX(signed, bits, zero) \ (((((zero) + 1) << ((bits) ? (bits) - 1 - (signed) : 0)) - 1) * 2 + 1) #if !GNULIB_defined_stdint_types /* 7.18.1.1. Exact-width integer types */ /* Here we assume a standard architecture where the hardware integer types have 8, 16, 32, optionally 64 bits. */ # undef int8_t # undef uint8_t typedef signed char gl_int8_t; typedef unsigned char gl_uint8_t; # define int8_t gl_int8_t # define uint8_t gl_uint8_t # undef int16_t # undef uint16_t typedef short int gl_int16_t; typedef unsigned short int gl_uint16_t; # define int16_t gl_int16_t # define uint16_t gl_uint16_t # undef int32_t # undef uint32_t typedef int gl_int32_t; typedef unsigned int gl_uint32_t; # define int32_t gl_int32_t # define uint32_t gl_uint32_t /* If the system defines INT64_MAX, assume int64_t works. That way, if the underlying platform defines int64_t to be a 64-bit long long int, the code below won't mistakenly define it to be a 64-bit long int, which would mess up C++ name mangling. We must use #ifdef rather than #if, to avoid an error with HP-UX 10.20 cc. */ # ifdef INT64_MAX # define GL_INT64_T # else /* Do not undefine int64_t if gnulib is not being used with 64-bit types, since otherwise it breaks platforms like Tandem/NSK. */ # if LONG_MAX >> 31 >> 31 == 1 # undef int64_t typedef long int gl_int64_t; # define int64_t gl_int64_t # define GL_INT64_T # elif defined _MSC_VER # undef int64_t typedef __int64 gl_int64_t; # define int64_t gl_int64_t # define GL_INT64_T # else # undef int64_t typedef long long int gl_int64_t; # define int64_t gl_int64_t # define GL_INT64_T # endif # endif # ifdef UINT64_MAX # define GL_UINT64_T # else # if ULONG_MAX >> 31 >> 31 >> 1 == 1 # undef uint64_t typedef unsigned long int gl_uint64_t; # define uint64_t gl_uint64_t # define GL_UINT64_T # elif defined _MSC_VER # undef uint64_t typedef unsigned __int64 gl_uint64_t; # define uint64_t gl_uint64_t # define GL_UINT64_T # else # undef uint64_t typedef unsigned long long int gl_uint64_t; # define uint64_t gl_uint64_t # define GL_UINT64_T # endif # endif /* Avoid collision with Solaris 2.5.1 etc. */ # define _UINT8_T # define _UINT32_T # define _UINT64_T /* 7.18.1.2. Minimum-width integer types */ /* Here we assume a standard architecture where the hardware integer types have 8, 16, 32, optionally 64 bits. Therefore the leastN_t types are the same as the corresponding N_t types. */ # undef int_least8_t # undef uint_least8_t # undef int_least16_t # undef uint_least16_t # undef int_least32_t # undef uint_least32_t # undef int_least64_t # undef uint_least64_t # define int_least8_t int8_t # define uint_least8_t uint8_t # define int_least16_t int16_t # define uint_least16_t uint16_t # define int_least32_t int32_t # define uint_least32_t uint32_t # ifdef GL_INT64_T # define int_least64_t int64_t # endif # ifdef GL_UINT64_T # define uint_least64_t uint64_t # endif /* 7.18.1.3. Fastest minimum-width integer types */ /* Note: Other substitutes may define these types differently. It is not recommended to use these types in public header files. */ /* Here we assume a standard architecture where the hardware integer types have 8, 16, 32, optionally 64 bits. Therefore the fastN_t types are taken from the same list of types. The following code normally uses types consistent with glibc, as that lessens the chance of incompatibility with older GNU hosts. */ # undef int_fast8_t # undef uint_fast8_t # undef int_fast16_t # undef uint_fast16_t # undef int_fast32_t # undef uint_fast32_t # undef int_fast64_t # undef uint_fast64_t typedef signed char gl_int_fast8_t; typedef unsigned char gl_uint_fast8_t; # ifdef __sun /* Define types compatible with SunOS 5.10, so that code compiled under earlier SunOS versions works with code compiled under SunOS 5.10. */ typedef int gl_int_fast32_t; typedef unsigned int gl_uint_fast32_t; # else typedef long int gl_int_fast32_t; typedef unsigned long int gl_uint_fast32_t; # endif typedef gl_int_fast32_t gl_int_fast16_t; typedef gl_uint_fast32_t gl_uint_fast16_t; # define int_fast8_t gl_int_fast8_t # define uint_fast8_t gl_uint_fast8_t # define int_fast16_t gl_int_fast16_t # define uint_fast16_t gl_uint_fast16_t # define int_fast32_t gl_int_fast32_t # define uint_fast32_t gl_uint_fast32_t # ifdef GL_INT64_T # define int_fast64_t int64_t # endif # ifdef GL_UINT64_T # define uint_fast64_t uint64_t # endif /* 7.18.1.4. Integer types capable of holding object pointers */ /* kLIBC's defines _INTPTR_T_DECLARED and needs its own definitions of intptr_t and uintptr_t (which use int and unsigned) to avoid clashes with declarations of system functions like sbrk. Similarly, mingw 5.22 defines _INTPTR_T_DEFINED and _UINTPTR_T_DEFINED and needs its own definitions of intptr_t and uintptr_t to avoid conflicting declarations of system functions like _findclose in . */ # if !((defined __KLIBC__ && defined _INTPTR_T_DECLARED) \ || (defined __MINGW32__ && defined _INTPTR_T_DEFINED && defined _UINTPTR_T_DEFINED)) # undef intptr_t # undef uintptr_t # ifdef _WIN64 typedef long long int gl_intptr_t; typedef unsigned long long int gl_uintptr_t; # else typedef long int gl_intptr_t; typedef unsigned long int gl_uintptr_t; # endif # define intptr_t gl_intptr_t # define uintptr_t gl_uintptr_t # endif /* 7.18.1.5. Greatest-width integer types */ /* Note: These types are compiler dependent. It may be unwise to use them in public header files. */ /* If the system defines INTMAX_MAX, assume that intmax_t works, and similarly for UINTMAX_MAX and uintmax_t. This avoids problems with assuming one type where another is used by the system. */ # ifndef INTMAX_MAX # undef INTMAX_C # undef intmax_t # if LONG_MAX >> 30 == 1 typedef long long int gl_intmax_t; # define intmax_t gl_intmax_t # elif defined GL_INT64_T # define intmax_t int64_t # else typedef long int gl_intmax_t; # define intmax_t gl_intmax_t # endif # endif # ifndef UINTMAX_MAX # undef UINTMAX_C # undef uintmax_t # if ULONG_MAX >> 31 == 1 typedef unsigned long long int gl_uintmax_t; # define uintmax_t gl_uintmax_t # elif defined GL_UINT64_T # define uintmax_t uint64_t # else typedef unsigned long int gl_uintmax_t; # define uintmax_t gl_uintmax_t # endif # endif /* Verify that intmax_t and uintmax_t have the same size. Too much code breaks if this is not the case. If this check fails, the reason is likely to be found in the autoconf macros. */ typedef int _verify_intmax_size[sizeof (intmax_t) == sizeof (uintmax_t) ? 1 : -1]; # define GNULIB_defined_stdint_types 1 # endif /* !GNULIB_defined_stdint_types */ /* 7.18.2. Limits of specified-width integer types */ /* 7.18.2.1. Limits of exact-width integer types */ /* Here we assume a standard architecture where the hardware integer types have 8, 16, 32, optionally 64 bits. */ # undef INT8_MIN # undef INT8_MAX # undef UINT8_MAX # define INT8_MIN (~ INT8_MAX) # define INT8_MAX 127 # define UINT8_MAX 255 # undef INT16_MIN # undef INT16_MAX # undef UINT16_MAX # define INT16_MIN (~ INT16_MAX) # define INT16_MAX 32767 # define UINT16_MAX 65535 # undef INT32_MIN # undef INT32_MAX # undef UINT32_MAX # define INT32_MIN (~ INT32_MAX) # define INT32_MAX 2147483647 # define UINT32_MAX 4294967295U # if defined GL_INT64_T && ! defined INT64_MAX /* Prefer (- INTMAX_C (1) << 63) over (~ INT64_MAX) because SunPRO C 5.0 evaluates the latter incorrectly in preprocessor expressions. */ # define INT64_MIN (- INTMAX_C (1) << 63) # define INT64_MAX INTMAX_C (9223372036854775807) # endif # if defined GL_UINT64_T && ! defined UINT64_MAX # define UINT64_MAX UINTMAX_C (18446744073709551615) # endif /* 7.18.2.2. Limits of minimum-width integer types */ /* Here we assume a standard architecture where the hardware integer types have 8, 16, 32, optionally 64 bits. Therefore the leastN_t types are the same as the corresponding N_t types. */ # undef INT_LEAST8_MIN # undef INT_LEAST8_MAX # undef UINT_LEAST8_MAX # define INT_LEAST8_MIN INT8_MIN # define INT_LEAST8_MAX INT8_MAX # define UINT_LEAST8_MAX UINT8_MAX # undef INT_LEAST16_MIN # undef INT_LEAST16_MAX # undef UINT_LEAST16_MAX # define INT_LEAST16_MIN INT16_MIN # define INT_LEAST16_MAX INT16_MAX # define UINT_LEAST16_MAX UINT16_MAX # undef INT_LEAST32_MIN # undef INT_LEAST32_MAX # undef UINT_LEAST32_MAX # define INT_LEAST32_MIN INT32_MIN # define INT_LEAST32_MAX INT32_MAX # define UINT_LEAST32_MAX UINT32_MAX # undef INT_LEAST64_MIN # undef INT_LEAST64_MAX # ifdef GL_INT64_T # define INT_LEAST64_MIN INT64_MIN # define INT_LEAST64_MAX INT64_MAX # endif # undef UINT_LEAST64_MAX # ifdef GL_UINT64_T # define UINT_LEAST64_MAX UINT64_MAX # endif /* 7.18.2.3. Limits of fastest minimum-width integer types */ /* Here we assume a standard architecture where the hardware integer types have 8, 16, 32, optionally 64 bits. Therefore the fastN_t types are taken from the same list of types. */ # undef INT_FAST8_MIN # undef INT_FAST8_MAX # undef UINT_FAST8_MAX # define INT_FAST8_MIN SCHAR_MIN # define INT_FAST8_MAX SCHAR_MAX # define UINT_FAST8_MAX UCHAR_MAX # undef INT_FAST16_MIN # undef INT_FAST16_MAX # undef UINT_FAST16_MAX # define INT_FAST16_MIN INT_FAST32_MIN # define INT_FAST16_MAX INT_FAST32_MAX # define UINT_FAST16_MAX UINT_FAST32_MAX # undef INT_FAST32_MIN # undef INT_FAST32_MAX # undef UINT_FAST32_MAX # ifdef __sun # define INT_FAST32_MIN INT_MIN # define INT_FAST32_MAX INT_MAX # define UINT_FAST32_MAX UINT_MAX # else # define INT_FAST32_MIN LONG_MIN # define INT_FAST32_MAX LONG_MAX # define UINT_FAST32_MAX ULONG_MAX # endif # undef INT_FAST64_MIN # undef INT_FAST64_MAX # ifdef GL_INT64_T # define INT_FAST64_MIN INT64_MIN # define INT_FAST64_MAX INT64_MAX # endif # undef UINT_FAST64_MAX # ifdef GL_UINT64_T # define UINT_FAST64_MAX UINT64_MAX # endif /* 7.18.2.4. Limits of integer types capable of holding object pointers */ # undef INTPTR_MIN # undef INTPTR_MAX # undef UINTPTR_MAX # ifdef _WIN64 # define INTPTR_MIN LLONG_MIN # define INTPTR_MAX LLONG_MAX # define UINTPTR_MAX ULLONG_MAX # else # define INTPTR_MIN LONG_MIN # define INTPTR_MAX LONG_MAX # define UINTPTR_MAX ULONG_MAX # endif /* 7.18.2.5. Limits of greatest-width integer types */ # ifndef INTMAX_MAX # undef INTMAX_MIN # ifdef INT64_MAX # define INTMAX_MIN INT64_MIN # define INTMAX_MAX INT64_MAX # else # define INTMAX_MIN INT32_MIN # define INTMAX_MAX INT32_MAX # endif # endif # ifndef UINTMAX_MAX # ifdef UINT64_MAX # define UINTMAX_MAX UINT64_MAX # else # define UINTMAX_MAX UINT32_MAX # endif # endif /* 7.18.3. Limits of other integer types */ /* ptrdiff_t limits */ # undef PTRDIFF_MIN # undef PTRDIFF_MAX # if @APPLE_UNIVERSAL_BUILD@ # ifdef _LP64 # define PTRDIFF_MIN _STDINT_SIGNED_MIN (64, 0l) # define PTRDIFF_MAX _STDINT_MAX (1, 64, 0l) # else # define PTRDIFF_MIN _STDINT_SIGNED_MIN (32, 0) # define PTRDIFF_MAX _STDINT_MAX (1, 32, 0) # endif # else # define PTRDIFF_MIN \ _STDINT_SIGNED_MIN (@BITSIZEOF_PTRDIFF_T@, 0@PTRDIFF_T_SUFFIX@) # define PTRDIFF_MAX \ _STDINT_MAX (1, @BITSIZEOF_PTRDIFF_T@, 0@PTRDIFF_T_SUFFIX@) # endif /* sig_atomic_t limits */ # undef SIG_ATOMIC_MIN # undef SIG_ATOMIC_MAX # if @HAVE_SIGNED_SIG_ATOMIC_T@ # define SIG_ATOMIC_MIN \ _STDINT_SIGNED_MIN (@BITSIZEOF_SIG_ATOMIC_T@, 0@SIG_ATOMIC_T_SUFFIX@) # else # define SIG_ATOMIC_MIN \ _STDINT_UNSIGNED_MIN (@BITSIZEOF_SIG_ATOMIC_T@, 0@SIG_ATOMIC_T_SUFFIX@) # endif # define SIG_ATOMIC_MAX \ _STDINT_MAX (@HAVE_SIGNED_SIG_ATOMIC_T@, @BITSIZEOF_SIG_ATOMIC_T@, \ 0@SIG_ATOMIC_T_SUFFIX@) /* size_t limit */ # undef SIZE_MAX # if @APPLE_UNIVERSAL_BUILD@ # ifdef _LP64 # define SIZE_MAX _STDINT_MAX (0, 64, 0ul) # else # define SIZE_MAX _STDINT_MAX (0, 32, 0ul) # endif # else # define SIZE_MAX _STDINT_MAX (0, @BITSIZEOF_SIZE_T@, 0@SIZE_T_SUFFIX@) # endif /* wchar_t limits */ /* Get WCHAR_MIN, WCHAR_MAX. This include is not on the top, above, because on OSF/1 4.0 we have a sequence of nested includes -> -> -> , and the latter includes and assumes its types are already defined. */ # if @HAVE_WCHAR_H@ && ! (defined WCHAR_MIN && defined WCHAR_MAX) /* BSD/OS 4.0.1 has a bug: , and must be included before . */ # include # include # include # define _GL_JUST_INCLUDE_SYSTEM_WCHAR_H # include # undef _GL_JUST_INCLUDE_SYSTEM_WCHAR_H # endif # undef WCHAR_MIN # undef WCHAR_MAX # if @HAVE_SIGNED_WCHAR_T@ # define WCHAR_MIN \ _STDINT_SIGNED_MIN (@BITSIZEOF_WCHAR_T@, 0@WCHAR_T_SUFFIX@) # else # define WCHAR_MIN \ _STDINT_UNSIGNED_MIN (@BITSIZEOF_WCHAR_T@, 0@WCHAR_T_SUFFIX@) # endif # define WCHAR_MAX \ _STDINT_MAX (@HAVE_SIGNED_WCHAR_T@, @BITSIZEOF_WCHAR_T@, 0@WCHAR_T_SUFFIX@) /* wint_t limits */ /* If gnulib's or overrides wint_t, @WINT_T_SUFFIX@ is not accurate, therefore use the definitions from above. */ # if !@GNULIB_OVERRIDES_WINT_T@ # undef WINT_MIN # undef WINT_MAX # if @HAVE_SIGNED_WINT_T@ # define WINT_MIN \ _STDINT_SIGNED_MIN (@BITSIZEOF_WINT_T@, 0@WINT_T_SUFFIX@) # else # define WINT_MIN \ _STDINT_UNSIGNED_MIN (@BITSIZEOF_WINT_T@, 0@WINT_T_SUFFIX@) # endif # define WINT_MAX \ _STDINT_MAX (@HAVE_SIGNED_WINT_T@, @BITSIZEOF_WINT_T@, 0@WINT_T_SUFFIX@) # endif /* 7.18.4. Macros for integer constants */ /* 7.18.4.1. Macros for minimum-width integer constants */ /* According to ISO C 99 Technical Corrigendum 1 */ /* Here we assume a standard architecture where the hardware integer types have 8, 16, 32, optionally 64 bits, and int is 32 bits. */ # undef INT8_C # undef UINT8_C # define INT8_C(x) x # define UINT8_C(x) x # undef INT16_C # undef UINT16_C # define INT16_C(x) x # define UINT16_C(x) x # undef INT32_C # undef UINT32_C # define INT32_C(x) x # define UINT32_C(x) x ## U # undef INT64_C # undef UINT64_C # if LONG_MAX >> 31 >> 31 == 1 # define INT64_C(x) x##L # elif defined _MSC_VER # define INT64_C(x) x##i64 # else # define INT64_C(x) x##LL # endif # if ULONG_MAX >> 31 >> 31 >> 1 == 1 # define UINT64_C(x) x##UL # elif defined _MSC_VER # define UINT64_C(x) x##ui64 # else # define UINT64_C(x) x##ULL # endif /* 7.18.4.2. Macros for greatest-width integer constants */ # ifndef INTMAX_C # if LONG_MAX >> 30 == 1 # define INTMAX_C(x) x##LL # elif defined GL_INT64_T # define INTMAX_C(x) INT64_C(x) # else # define INTMAX_C(x) x##L # endif # endif # ifndef UINTMAX_C # if ULONG_MAX >> 31 == 1 # define UINTMAX_C(x) x##ULL # elif defined GL_UINT64_T # define UINTMAX_C(x) UINT64_C(x) # else # define UINTMAX_C(x) x##UL # endif # endif #endif /* !@HAVE_C99_STDINT_H@ */ /* Macros specified by ISO/IEC TS 18661-1:2014. */ #if (!defined UINTMAX_WIDTH \ && (defined _GNU_SOURCE || defined __STDC_WANT_IEC_60559_BFP_EXT__)) # ifdef INT8_MAX # define INT8_WIDTH _GL_INTEGER_WIDTH (INT8_MIN, INT8_MAX) # endif # ifdef UINT8_MAX # define UINT8_WIDTH _GL_INTEGER_WIDTH (0, UINT8_MAX) # endif # ifdef INT16_MAX # define INT16_WIDTH _GL_INTEGER_WIDTH (INT16_MIN, INT16_MAX) # endif # ifdef UINT16_MAX # define UINT16_WIDTH _GL_INTEGER_WIDTH (0, UINT16_MAX) # endif # ifdef INT32_MAX # define INT32_WIDTH _GL_INTEGER_WIDTH (INT32_MIN, INT32_MAX) # endif # ifdef UINT32_MAX # define UINT32_WIDTH _GL_INTEGER_WIDTH (0, UINT32_MAX) # endif # ifdef INT64_MAX # define INT64_WIDTH _GL_INTEGER_WIDTH (INT64_MIN, INT64_MAX) # endif # ifdef UINT64_MAX # define UINT64_WIDTH _GL_INTEGER_WIDTH (0, UINT64_MAX) # endif # define INT_LEAST8_WIDTH _GL_INTEGER_WIDTH (INT_LEAST8_MIN, INT_LEAST8_MAX) # define UINT_LEAST8_WIDTH _GL_INTEGER_WIDTH (0, UINT_LEAST8_MAX) # define INT_LEAST16_WIDTH _GL_INTEGER_WIDTH (INT_LEAST16_MIN, INT_LEAST16_MAX) # define UINT_LEAST16_WIDTH _GL_INTEGER_WIDTH (0, UINT_LEAST16_MAX) # define INT_LEAST32_WIDTH _GL_INTEGER_WIDTH (INT_LEAST32_MIN, INT_LEAST32_MAX) # define UINT_LEAST32_WIDTH _GL_INTEGER_WIDTH (0, UINT_LEAST32_MAX) # define INT_LEAST64_WIDTH _GL_INTEGER_WIDTH (INT_LEAST64_MIN, INT_LEAST64_MAX) # define UINT_LEAST64_WIDTH _GL_INTEGER_WIDTH (0, UINT_LEAST64_MAX) # define INT_FAST8_WIDTH _GL_INTEGER_WIDTH (INT_FAST8_MIN, INT_FAST8_MAX) # define UINT_FAST8_WIDTH _GL_INTEGER_WIDTH (0, UINT_FAST8_MAX) # define INT_FAST16_WIDTH _GL_INTEGER_WIDTH (INT_FAST16_MIN, INT_FAST16_MAX) # define UINT_FAST16_WIDTH _GL_INTEGER_WIDTH (0, UINT_FAST16_MAX) # define INT_FAST32_WIDTH _GL_INTEGER_WIDTH (INT_FAST32_MIN, INT_FAST32_MAX) # define UINT_FAST32_WIDTH _GL_INTEGER_WIDTH (0, UINT_FAST32_MAX) # define INT_FAST64_WIDTH _GL_INTEGER_WIDTH (INT_FAST64_MIN, INT_FAST64_MAX) # define UINT_FAST64_WIDTH _GL_INTEGER_WIDTH (0, UINT_FAST64_MAX) # define INTPTR_WIDTH _GL_INTEGER_WIDTH (INTPTR_MIN, INTPTR_MAX) # define UINTPTR_WIDTH _GL_INTEGER_WIDTH (0, UINTPTR_MAX) # define INTMAX_WIDTH _GL_INTEGER_WIDTH (INTMAX_MIN, INTMAX_MAX) # define UINTMAX_WIDTH _GL_INTEGER_WIDTH (0, UINTMAX_MAX) # define PTRDIFF_WIDTH _GL_INTEGER_WIDTH (PTRDIFF_MIN, PTRDIFF_MAX) # define SIZE_WIDTH _GL_INTEGER_WIDTH (0, SIZE_MAX) # define WCHAR_WIDTH _GL_INTEGER_WIDTH (WCHAR_MIN, WCHAR_MAX) # ifdef WINT_MAX # define WINT_WIDTH _GL_INTEGER_WIDTH (WINT_MIN, WINT_MAX) # endif # ifdef SIG_ATOMIC_MAX # define SIG_ATOMIC_WIDTH _GL_INTEGER_WIDTH (SIG_ATOMIC_MIN, SIG_ATOMIC_MAX) # endif #endif /* !WINT_WIDTH && (_GNU_SOURCE || __STDC_WANT_IEC_60559_BFP_EXT__) */ #endif /* _@GUARD_PREFIX@_STDINT_H */ #endif /* !(defined __ANDROID__ && ...) */ #endif /* !defined _@GUARD_PREFIX@_STDINT_H && !defined _GL_JUST_INCLUDE_SYSTEM_STDINT_H */ pspp-1.4.1/gl/getprogname.h0000644000175000017500000000217413723215637015213 0ustar00blpblp00000000000000/* Program name management. Copyright (C) 2016-2020 Free Software Foundation, Inc. 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 3 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, see . */ #ifndef _GL_GETPROGNAME_H #define _GL_GETPROGNAME_H #include #ifdef __cplusplus extern "C" { #endif /* Return the base name of the executing program. On native Windows this will usually end in ".exe" or ".EXE". */ #ifndef HAVE_GETPROGNAME extern char const *getprogname (void) # ifdef HAVE_DECL_PROGRAM_INVOCATION_NAME _GL_ATTRIBUTE_PURE # endif ; #endif #ifdef __cplusplus } #endif #endif pspp-1.4.1/gl/vsprintf.c0000644000175000017500000000406313723215640014542 0ustar00blpblp00000000000000/* Formatted output to strings. Copyright (C) 2004, 2006-2020 Free Software Foundation, Inc. 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 3 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, see . */ #ifdef HAVE_CONFIG_H # include #endif /* Specification. */ #include #include #include #include #include #include #include "vasnprintf.h" #ifndef SIZE_MAX # define SIZE_MAX ((size_t) -1) #endif /* Print formatted output to string STR. Return string length of formatted string. On error, return a negative value. */ int vsprintf (char *str, const char *format, va_list args) { char *output; size_t len; size_t lenbuf; /* vasnprintf fails with EOVERFLOW when the buffer size argument is larger than INT_MAX (if that fits into a 'size_t' at all). Also note that glibc's iconv fails with E2BIG when we pass a length that is so large that str + lenbuf wraps around, i.e. (uintptr_t) (str + lenbuf) < (uintptr_t) str. Therefore set lenbuf = min (SIZE_MAX, INT_MAX, - (uintptr_t) str - 1). */ lenbuf = (SIZE_MAX < INT_MAX ? SIZE_MAX : INT_MAX); if (lenbuf > ~ (uintptr_t) str) lenbuf = ~ (uintptr_t) str; output = vasnprintf (str, &lenbuf, format, args); len = lenbuf; if (!output) return -1; if (output != str) { /* len is near SIZE_MAX. */ free (output); errno = EOVERFLOW; return -1; } if (len > INT_MAX) { errno = EOVERFLOW; return -1; } return len; } pspp-1.4.1/gl/isnanf.c0000644000175000017500000000152013723215637014146 0ustar00blpblp00000000000000/* Test for NaN that does not need libm. Copyright (C) 2007, 2009-2020 Free Software Foundation, Inc. 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 3 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, see . */ /* Written by Bruno Haible , 2007. */ #define USE_FLOAT #include "isnan.c" pspp-1.4.1/gl/cloexec.h0000644000175000017500000000273413723215636014326 0ustar00blpblp00000000000000/* cloexec.c - set or clear the close-on-exec descriptor flag Copyright (C) 2004, 2009-2020 Free Software Foundation, Inc. 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 3 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, see . */ #include /* Set the 'FD_CLOEXEC' flag of DESC if VALUE is true, or clear the flag if VALUE is false. Return 0 on success, or -1 on error with 'errno' set. Note that on MingW, this function does NOT protect DESC from being inherited into spawned children. Instead, either use dup_cloexec followed by closing the original DESC, or use interfaces such as open or pipe2 that accept flags like O_CLOEXEC to create DESC non-inheritable in the first place. */ int set_cloexec_flag (int desc, bool value); /* Duplicates a file handle FD, while marking the copy to be closed prior to exec or spawn. Returns -1 and sets errno if FD could not be duplicated. */ int dup_cloexec (int fd); pspp-1.4.1/gl/xstrndup.h0000644000175000017500000000202213723215640014554 0ustar00blpblp00000000000000/* Duplicate a bounded initial segment of a string, with out-of-memory checking. Copyright (C) 2003, 2009-2020 Free Software Foundation, Inc. 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 3 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, see . */ #include /* Return a newly allocated copy of at most N bytes of STRING. In other words, return a copy of the initial segment of length N of STRING. */ extern char *xstrndup (const char *string, size_t n) _GL_ATTRIBUTE_MALLOC; pspp-1.4.1/gl/sys-limits.h0000644000175000017500000000316613723215640015014 0ustar00blpblp00000000000000/* System call limits Copyright 2018-2020 Free Software Foundation, Inc. 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 3, 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, see . */ #ifndef _GL_SYS_LIMITS_H #define _GL_SYS_LIMITS_H #include /* Maximum number of bytes to read or write in a single system call. This can be useful for system calls like sendfile on GNU/Linux, which do not handle more than MAX_RW_COUNT bytes correctly. The Linux kernel MAX_RW_COUNT is at least INT_MAX >> 20 << 20, where the 20 comes from the Hexagon port with 1 MiB pages; use that as an approximation, as the exact value may not be available to us. Using this also works around a serious Linux bug before 2.6.16; see . Using this also works around a Tru64 5.1 bug, where attempting to read INT_MAX bytes fails with errno == EINVAL. See . Using this is likely to work around similar bugs in other operating systems. */ enum { SYS_BUFSIZE_MAX = INT_MAX >> 20 << 20 }; #endif pspp-1.4.1/gl/timespec-add.c0000644000175000017500000000322213723555203015224 0ustar00blpblp00000000000000/* Add two struct timespec values. Copyright (C) 2011-2020 Free Software Foundation, Inc. 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 3 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, see . */ /* Written by Paul Eggert. */ /* Return the sum of two timespec values A and B. On overflow, return an extremal value. This assumes 0 <= tv_nsec < TIMESPEC_HZ. */ #include #include "timespec.h" #include "intprops.h" struct timespec timespec_add (struct timespec a, struct timespec b) { time_t rs = a.tv_sec; time_t bs = b.tv_sec; int ns = a.tv_nsec + b.tv_nsec; int nsd = ns - TIMESPEC_HZ; int rns = ns; if (0 <= nsd) { rns = nsd; time_t bs1; if (!INT_ADD_WRAPV (bs, 1, &bs1)) bs = bs1; else if (rs < 0) rs++; else goto high_overflow; } if (INT_ADD_WRAPV (rs, bs, &rs)) { if (bs < 0) { rs = TYPE_MINIMUM (time_t); rns = 0; } else { high_overflow: rs = TYPE_MAXIMUM (time_t); rns = TIMESPEC_HZ - 1; } } return make_timespec (rs, rns); } pspp-1.4.1/gl/iswxdigit.c0000644000175000017500000000210613723215637014704 0ustar00blpblp00000000000000/* Test wide character for being a hexadecimal digit. Copyright (C) 2020 Free Software Foundation, Inc. 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 3, 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, see . */ #include /* Specification. */ #include int iswxdigit (wint_t wc) { return ((wc >= '0' && wc <= '9') #if 'A' == 0x41 && 'a' == 0x61 /* Optimization, assuming ASCII */ || ((wc & ~0x20) >= 'A' && (wc & ~0x20) <= 'F') #else || (wc >= 'A' && wc <= 'F') || (wc >= 'a' && wc <= 'f') #endif ); } pspp-1.4.1/gl/msvc-inval.c0000644000175000017500000000751213723215637014756 0ustar00blpblp00000000000000/* Invalid parameter handler for MSVC runtime libraries. Copyright (C) 2011-2020 Free Software Foundation, Inc. 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 3, 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, see . */ #include /* Specification. */ #include "msvc-inval.h" #if HAVE_MSVC_INVALID_PARAMETER_HANDLER \ && !(MSVC_INVALID_PARAMETER_HANDLING == SANE_LIBRARY_HANDLING) /* Get _invalid_parameter_handler type and _set_invalid_parameter_handler declaration. */ # include # if MSVC_INVALID_PARAMETER_HANDLING == DEFAULT_HANDLING static void __cdecl gl_msvc_invalid_parameter_handler (const wchar_t *expression, const wchar_t *function, const wchar_t *file, unsigned int line, uintptr_t dummy) { } # else /* Get declarations of the native Windows API functions. */ # define WIN32_LEAN_AND_MEAN # include # if defined _MSC_VER static void __cdecl gl_msvc_invalid_parameter_handler (const wchar_t *expression, const wchar_t *function, const wchar_t *file, unsigned int line, uintptr_t dummy) { RaiseException (STATUS_GNULIB_INVALID_PARAMETER, 0, 0, NULL); } # else /* An index to thread-local storage. */ static DWORD tls_index; static int tls_initialized /* = 0 */; /* Used as a fallback only. */ static struct gl_msvc_inval_per_thread not_per_thread; struct gl_msvc_inval_per_thread * gl_msvc_inval_current (void) { if (!tls_initialized) { tls_index = TlsAlloc (); tls_initialized = 1; } if (tls_index == TLS_OUT_OF_INDEXES) /* TlsAlloc had failed. */ return ¬_per_thread; else { struct gl_msvc_inval_per_thread *pointer = (struct gl_msvc_inval_per_thread *) TlsGetValue (tls_index); if (pointer == NULL) { /* First call. Allocate a new 'struct gl_msvc_inval_per_thread'. */ pointer = (struct gl_msvc_inval_per_thread *) malloc (sizeof (struct gl_msvc_inval_per_thread)); if (pointer == NULL) /* Could not allocate memory. Use the global storage. */ pointer = ¬_per_thread; TlsSetValue (tls_index, pointer); } return pointer; } } static void __cdecl gl_msvc_invalid_parameter_handler (const wchar_t *expression, const wchar_t *function, const wchar_t *file, unsigned int line, uintptr_t dummy) { struct gl_msvc_inval_per_thread *current = gl_msvc_inval_current (); if (current->restart_valid) longjmp (current->restart, 1); else /* An invalid parameter notification from outside the gnulib code. Give the caller a chance to intervene. */ RaiseException (STATUS_GNULIB_INVALID_PARAMETER, 0, 0, NULL); } # endif # endif static int gl_msvc_inval_initialized /* = 0 */; void gl_msvc_inval_ensure_handler (void) { if (gl_msvc_inval_initialized == 0) { _set_invalid_parameter_handler (gl_msvc_invalid_parameter_handler); gl_msvc_inval_initialized = 1; } } #endif pspp-1.4.1/gl/ftell.c0000644000175000017500000000215613723215636014003 0ustar00blpblp00000000000000/* An ftell() function that works around platform bugs. Copyright (C) 2007-2020 Free Software Foundation, Inc. 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 3 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, see . */ #include /* Specification. */ #include #include #include long ftell (FILE *fp) { /* Use the replacement ftello function with all its workarounds. */ off_t offset = ftello (fp); if (LONG_MIN <= offset && offset <= LONG_MAX) return /* (long) */ offset; else { errno = EOVERFLOW; return -1; } } pspp-1.4.1/gl/clean-temp.h0000644000175000017500000002207313723215636014727 0ustar00blpblp00000000000000/* Temporary directories and temporary files with automatic cleanup. Copyright (C) 2006, 2011-2020 Free Software Foundation, Inc. Written by Bruno Haible , 2006. 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 3 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, see . */ #ifndef _CLEAN_TEMP_H #define _CLEAN_TEMP_H #include #include #include #ifdef __cplusplus extern "C" { #endif /* Temporary directories and temporary files should be automatically removed when the program exits either normally or through a fatal signal. We can't rely on the "unlink before close" idiom, because it works only on Unix and also - if no signal blocking is used - leaves a time window where a fatal signal would not clean up the temporary file. Also, open file descriptors need to be closed before the temporary files and the temporary directories can be removed, because only on Unix (excluding Cygwin) can one remove directories containing open files. This module provides support for - temporary directories and temporary files inside these temporary directories, - temporary files without temporary directories. The temporary directories and files are automatically cleaned up (at the latest) when the program exits or dies from a fatal signal such as SIGINT, SIGTERM, SIGHUP, but not if it dies from a fatal signal such as SIGQUIT, SIGKILL, or SIGABRT, SIGSEGV, SIGBUS, SIGILL, SIGFPE. For the cleanup in the normal case, programs that use this module need to call 'cleanup_temp_dir' for each successful return of 'create_temp_dir'. The cleanup in the case of a fatal signal such as SIGINT, SIGTERM, SIGHUP, is done entirely automatically by the functions of this module. Limitations: Files or directories can still be left over if - the program is dies from a fatal signal such as SIGQUIT, SIGKILL, or SIGABRT, SIGSEGV, SIGBUS, SIGILL, SIGFPE, or - in a multithreaded program, the fatal signal handler is already running while another thread of the program creates a new temporary directory or temporary file, or - on native Windows, some temporary files are used by a subprocess while the fatal signal interrupts the program. */ /* ============= Temporary files without temporary directories ============= */ /* Register the given ABSOLUTE_FILE_NAME as being a file that needs to be removed. Should be called before the file ABSOLUTE_FILE_NAME is created. */ extern void register_temporary_file (const char *absolute_file_name); /* Unregister the given ABSOLUTE_FILE_NAME as being a file that needs to be removed. Should be called when the file ABSOLUTE_FILE_NAME could not be created. */ extern void unregister_temporary_file (const char *absolute_file_name); /* Remove the given ABSOLUTE_FILE_NAME and unregister it. CLEANUP_VERBOSE determines whether errors are reported to standard error. Return 0 upon success, or -1 if there was some problem. */ extern int cleanup_temporary_file (const char *absolute_file_name, bool cleanup_verbose); /* ========= Temporary directories and temporary files inside them ========= */ struct temp_dir { /* The absolute pathname of the directory. */ const char * const dir_name; /* Whether errors during explicit cleanup are reported to standard error. */ bool cleanup_verbose; /* More fields are present here, but not public. */ }; /* Create a temporary directory. PREFIX is used as a prefix for the name of the temporary directory. It should be short and still give an indication about the program. PARENTDIR can be used to specify the parent directory; if NULL, a default parent directory is used (either $TMPDIR or /tmp or similar). CLEANUP_VERBOSE determines whether errors during explicit cleanup are reported to standard error. Return a fresh 'struct temp_dir' on success. Upon error, an error message is shown and NULL is returned. */ extern struct temp_dir * create_temp_dir (const char *prefix, const char *parentdir, bool cleanup_verbose); /* Register the given ABSOLUTE_FILE_NAME as being a file inside DIR, that needs to be removed before DIR can be removed. Should be called before the file ABSOLUTE_FILE_NAME is created. */ extern void register_temp_file (struct temp_dir *dir, const char *absolute_file_name); /* Unregister the given ABSOLUTE_FILE_NAME as being a file inside DIR, that needs to be removed before DIR can be removed. Should be called when the file ABSOLUTE_FILE_NAME could not be created. */ extern void unregister_temp_file (struct temp_dir *dir, const char *absolute_file_name); /* Register the given ABSOLUTE_DIR_NAME as being a subdirectory inside DIR, that needs to be removed before DIR can be removed. Should be called before the subdirectory ABSOLUTE_DIR_NAME is created. */ extern void register_temp_subdir (struct temp_dir *dir, const char *absolute_dir_name); /* Unregister the given ABSOLUTE_DIR_NAME as being a subdirectory inside DIR, that needs to be removed before DIR can be removed. Should be called when the subdirectory ABSOLUTE_DIR_NAME could not be created. */ extern void unregister_temp_subdir (struct temp_dir *dir, const char *absolute_dir_name); /* Remove the given ABSOLUTE_FILE_NAME and unregister it. Return 0 upon success, or -1 if there was some problem. */ extern int cleanup_temp_file (struct temp_dir *dir, const char *absolute_file_name); /* Remove the given ABSOLUTE_DIR_NAME and unregister it. Return 0 upon success, or -1 if there was some problem. */ extern int cleanup_temp_subdir (struct temp_dir *dir, const char *absolute_dir_name); /* Remove all registered files and subdirectories inside DIR. Return 0 upon success, or -1 if there was some problem. */ extern int cleanup_temp_dir_contents (struct temp_dir *dir); /* Remove all registered files and subdirectories inside DIR and DIR itself. DIR cannot be used any more after this call. Return 0 upon success, or -1 if there was some problem. */ extern int cleanup_temp_dir (struct temp_dir *dir); /* ================== Opening and closing temporary files ================== */ /* Open a temporary file in a temporary directory. FILE_NAME must already have been passed to register_temp_file. Registers the resulting file descriptor to be closed. DELETE_ON_CLOSE indicates whether the file can be deleted when the resulting file descriptor or stream is closed. */ extern int open_temp (const char *file_name, int flags, mode_t mode, bool delete_on_close); extern FILE * fopen_temp (const char *file_name, const char *mode, bool delete_on_close); /* Open a temporary file, generating its name based on FILE_NAME_TMPL. FILE_NAME_TMPL must match the rules for mk[s]temp (i.e. end in "XXXXXX", possibly with a suffix). The name constructed does not exist at the time of the call. FILE_NAME_TMPL is overwritten with the result. A safe choice for MODE is S_IRUSR | S_IWUSR, a.k.a. 0600. Registers the file for deletion. Opens the file, with the given FLAGS and mode MODE. Registers the resulting file descriptor to be closed. */ extern int gen_register_open_temp (char *file_name_tmpl, int suffixlen, int flags, mode_t mode); /* Close a temporary file. FD must have been returned by open_temp or gen_register_open_temp. Unregisters the previously registered file descriptor. */ extern int close_temp (int fd); /* Close a temporary file. FP must have been returned by fopen_temp, or by fdopen on a file descriptor returned by open_temp or gen_register_open_temp. Unregisters the previously registered file descriptor. */ extern int fclose_temp (FILE *fp); /* Like fwriteerror. FP must have been returned by fopen_temp, or by fdopen on a file descriptor returned by open_temp or gen_register_open_temp. Unregisters the previously registered file descriptor. */ extern int fwriteerror_temp (FILE *fp); /* Like close_stream. FP must have been returned by fopen_temp, or by fdopen on a file descriptor returned by open_temp or gen_register_open_temp. Unregisters the previously registered file descriptor. */ extern int close_stream_temp (FILE *fp); #ifdef __cplusplus } #endif #endif /* _CLEAN_TEMP_H */ pspp-1.4.1/gl/rawmemchr.c0000644000175000017500000001220213723215640014646 0ustar00blpblp00000000000000/* Searching in a string. Copyright (C) 2008-2020 Free Software Foundation, Inc. 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 3 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, see . */ #include /* Specification. */ #include /* Find the first occurrence of C in S. */ void * rawmemchr (const void *s, int c_in) { /* On 32-bit hardware, choosing longword to be a 32-bit unsigned long instead of a 64-bit uintmax_t tends to give better performance. On 64-bit hardware, unsigned long is generally 64 bits already. Change this typedef to experiment with performance. */ typedef unsigned long int longword; const unsigned char *char_ptr; const longword *longword_ptr; longword repeated_one; longword repeated_c; unsigned char c; c = (unsigned char) c_in; /* Handle the first few bytes by reading one byte at a time. Do this until CHAR_PTR is aligned on a longword boundary. */ for (char_ptr = (const unsigned char *) s; (size_t) char_ptr % sizeof (longword) != 0; ++char_ptr) if (*char_ptr == c) return (void *) char_ptr; longword_ptr = (const longword *) char_ptr; /* All these elucidatory comments refer to 4-byte longwords, but the theory applies equally well to any size longwords. */ /* Compute auxiliary longword values: repeated_one is a value which has a 1 in every byte. repeated_c has c in every byte. */ repeated_one = 0x01010101; repeated_c = c | (c << 8); repeated_c |= repeated_c << 16; if (0xffffffffU < (longword) -1) { repeated_one |= repeated_one << 31 << 1; repeated_c |= repeated_c << 31 << 1; if (8 < sizeof (longword)) { size_t i; for (i = 64; i < sizeof (longword) * 8; i *= 2) { repeated_one |= repeated_one << i; repeated_c |= repeated_c << i; } } } /* Instead of the traditional loop which tests each byte, we will test a longword at a time. The tricky part is testing if *any of the four* bytes in the longword in question are equal to NUL or c. We first use an xor with repeated_c. This reduces the task to testing whether *any of the four* bytes in longword1 is zero. We compute tmp = ((longword1 - repeated_one) & ~longword1) & (repeated_one << 7). That is, we perform the following operations: 1. Subtract repeated_one. 2. & ~longword1. 3. & a mask consisting of 0x80 in every byte. Consider what happens in each byte: - If a byte of longword1 is zero, step 1 and 2 transform it into 0xff, and step 3 transforms it into 0x80. A carry can also be propagated to more significant bytes. - If a byte of longword1 is nonzero, let its lowest 1 bit be at position k (0 <= k <= 7); so the lowest k bits are 0. After step 1, the byte ends in a single bit of value 0 and k bits of value 1. After step 2, the result is just k bits of value 1: 2^k - 1. After step 3, the result is 0. And no carry is produced. So, if longword1 has only non-zero bytes, tmp is zero. Whereas if longword1 has a zero byte, call j the position of the least significant zero byte. Then the result has a zero at positions 0, ..., j-1 and a 0x80 at position j. We cannot predict the result at the more significant bytes (positions j+1..3), but it does not matter since we already have a non-zero bit at position 8*j+7. The test whether any byte in longword1 is zero is equivalent to testing whether tmp is nonzero. This test can read beyond the end of a string, depending on where C_IN is encountered. However, this is considered safe since the initialization phase ensured that the read will be aligned, therefore, the read will not cross page boundaries and will not cause a fault. */ while (1) { longword longword1 = *longword_ptr ^ repeated_c; if ((((longword1 - repeated_one) & ~longword1) & (repeated_one << 7)) != 0) break; longword_ptr++; } char_ptr = (const unsigned char *) longword_ptr; /* At this point, we know that one of the sizeof (longword) bytes starting at char_ptr is == c. On little-endian machines, we could determine the first such byte without any further memory accesses, just by looking at the tmp result from the last loop iteration. But this does not work on big-endian machines. Choose code that works in both cases. */ char_ptr = (unsigned char *) longword_ptr; while (*char_ptr != c) char_ptr++; return (void *) char_ptr; } pspp-1.4.1/gl/filename.h0000644000175000017500000001077613723215636014471 0ustar00blpblp00000000000000/* Basic filename support macros. Copyright (C) 2001-2004, 2007-2020 Free Software Foundation, Inc. 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 3 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, see . */ /* From Paul Eggert and Jim Meyering. */ #ifndef _FILENAME_H #define _FILENAME_H #include #ifdef __cplusplus extern "C" { #endif /* Filename support. ISSLASH(C) tests whether C is a directory separator character. HAS_DEVICE(Filename) tests whether Filename contains a device specification. FILE_SYSTEM_PREFIX_LEN(Filename) length of the device specification at the beginning of Filename, index of the part consisting of alternating components and slashes. FILE_SYSTEM_DRIVE_PREFIX_CAN_BE_RELATIVE 1 when a non-empty device specification can be followed by an empty or relative part, 0 when a non-empty device specification must be followed by a slash, 0 when device specification don't exist. IS_ABSOLUTE_FILE_NAME(Filename) tests whether Filename is independent of any notion of "current directory". IS_RELATIVE_FILE_NAME(Filename) tests whether Filename may be concatenated to a directory filename. Note: On native Windows, OS/2, DOS, "c:" is neither an absolute nor a relative file name! IS_FILE_NAME_WITH_DIR(Filename) tests whether Filename contains a device or directory specification. */ #if defined _WIN32 || defined __CYGWIN__ \ || defined __EMX__ || defined __MSDOS__ || defined __DJGPP__ /* Native Windows, Cygwin, OS/2, DOS */ # define ISSLASH(C) ((C) == '/' || (C) == '\\') /* Internal macro: Tests whether a character is a drive letter. */ # define _IS_DRIVE_LETTER(C) \ (((C) >= 'A' && (C) <= 'Z') || ((C) >= 'a' && (C) <= 'z')) /* Help the compiler optimizing it. This assumes ASCII. */ # undef _IS_DRIVE_LETTER # define _IS_DRIVE_LETTER(C) \ (((unsigned int) (C) | ('a' - 'A')) - 'a' <= 'z' - 'a') # define HAS_DEVICE(Filename) \ (_IS_DRIVE_LETTER ((Filename)[0]) && (Filename)[1] == ':') # define FILE_SYSTEM_PREFIX_LEN(Filename) (HAS_DEVICE (Filename) ? 2 : 0) # ifdef __CYGWIN__ # define FILE_SYSTEM_DRIVE_PREFIX_CAN_BE_RELATIVE 0 # else /* On native Windows, OS/2, DOS, the system has the notion of a "current directory" on each drive. */ # define FILE_SYSTEM_DRIVE_PREFIX_CAN_BE_RELATIVE 1 # endif # if FILE_SYSTEM_DRIVE_PREFIX_CAN_BE_RELATIVE # define IS_ABSOLUTE_FILE_NAME(Filename) \ ISSLASH ((Filename)[FILE_SYSTEM_PREFIX_LEN (Filename)]) # else # define IS_ABSOLUTE_FILE_NAME(Filename) \ (ISSLASH ((Filename)[0]) || HAS_DEVICE (Filename)) # endif # define IS_RELATIVE_FILE_NAME(Filename) \ (! (ISSLASH ((Filename)[0]) || HAS_DEVICE (Filename))) # define IS_FILE_NAME_WITH_DIR(Filename) \ (strchr ((Filename), '/') != NULL || strchr ((Filename), '\\') != NULL \ || HAS_DEVICE (Filename)) #else /* Unix */ # define ISSLASH(C) ((C) == '/') # define HAS_DEVICE(Filename) ((void) (Filename), 0) # define FILE_SYSTEM_PREFIX_LEN(Filename) ((void) (Filename), 0) # define FILE_SYSTEM_DRIVE_PREFIX_CAN_BE_RELATIVE 0 # define IS_ABSOLUTE_FILE_NAME(Filename) ISSLASH ((Filename)[0]) # define IS_RELATIVE_FILE_NAME(Filename) (! ISSLASH ((Filename)[0])) # define IS_FILE_NAME_WITH_DIR(Filename) (strchr ((Filename), '/') != NULL) #endif /* Deprecated macros. For backward compatibility with old users of the 'filename' module. */ #define IS_ABSOLUTE_PATH IS_ABSOLUTE_FILE_NAME #define IS_PATH_WITH_DIR IS_FILE_NAME_WITH_DIR #ifdef __cplusplus } #endif #endif /* _FILENAME_H */ pspp-1.4.1/gl/sys_types.in.h0000644000175000017500000000613013723215640015340 0ustar00blpblp00000000000000/* Provide a more complete sys/types.h. Copyright (C) 2011-2020 Free Software Foundation, Inc. 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 3, 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, see . */ #if __GNUC__ >= 3 @PRAGMA_SYSTEM_HEADER@ #endif @PRAGMA_COLUMNS@ #if defined _WIN32 && !defined __CYGWIN__ \ && (defined __need_off_t || defined __need___off64_t \ || defined __need_ssize_t || defined __need_time_t) /* Special invocation convention inside mingw header files. */ #@INCLUDE_NEXT@ @NEXT_SYS_TYPES_H@ #else /* Normal invocation convention. */ #ifndef _@GUARD_PREFIX@_SYS_TYPES_H /* The include_next requires a split double-inclusion guard. */ # define _GL_INCLUDING_SYS_TYPES_H #@INCLUDE_NEXT@ @NEXT_SYS_TYPES_H@ # undef _GL_INCLUDING_SYS_TYPES_H #ifndef _@GUARD_PREFIX@_SYS_TYPES_H #define _@GUARD_PREFIX@_SYS_TYPES_H /* Override off_t if Large File Support is requested on native Windows. */ #if @WINDOWS_64_BIT_OFF_T@ /* Same as int64_t in . */ # if defined _MSC_VER # define off_t __int64 # else # define off_t long long int # endif /* Indicator, for gnulib internal purposes. */ # define _GL_WINDOWS_64_BIT_OFF_T 1 #endif /* Override dev_t and ino_t if distinguishable inodes support is requested on native Windows. */ #if @WINDOWS_STAT_INODES@ # if @WINDOWS_STAT_INODES@ == 2 /* Experimental, not useful in Windows 10. */ /* Define dev_t to a 64-bit type. */ # if !defined GNULIB_defined_dev_t typedef unsigned long long int rpl_dev_t; # undef dev_t # define dev_t rpl_dev_t # define GNULIB_defined_dev_t 1 # endif /* Define ino_t to a 128-bit type. */ # if !defined GNULIB_defined_ino_t /* MSVC does not have a 128-bit integer type. GCC has a 128-bit integer type __int128, but only on 64-bit targets. */ typedef struct { unsigned long long int _gl_ino[2]; } rpl_ino_t; # undef ino_t # define ino_t rpl_ino_t # define GNULIB_defined_ino_t 1 # endif # else /* @WINDOWS_STAT_INODES@ == 1 */ /* Define ino_t to a 64-bit type. */ # if !defined GNULIB_defined_ino_t typedef unsigned long long int rpl_ino_t; # undef ino_t # define ino_t rpl_ino_t # define GNULIB_defined_ino_t 1 # endif # endif /* Indicator, for gnulib internal purposes. */ # define _GL_WINDOWS_STAT_INODES @WINDOWS_STAT_INODES@ #endif /* MSVC 9 defines size_t in , not in . */ /* But avoid namespace pollution on glibc systems. */ #if (defined _WIN32 && ! defined __CYGWIN__) && ! defined __GLIBC__ # include #endif #endif /* _@GUARD_PREFIX@_SYS_TYPES_H */ #endif /* _@GUARD_PREFIX@_SYS_TYPES_H */ #endif /* __need_XXX */ pspp-1.4.1/gl/regex_internal.c0000644000175000017500000013775413723215640015713 0ustar00blpblp00000000000000/* Extended regular expression matching and search library. Copyright (C) 2002-2020 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Isamu Hasegawa . The GNU C Library 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 3 of the License, or (at your option) any later version. The GNU C Library 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 the GNU C Library; if not, see . */ static void re_string_construct_common (const char *str, Idx len, re_string_t *pstr, RE_TRANSLATE_TYPE trans, bool icase, const re_dfa_t *dfa); static re_dfastate_t *create_ci_newstate (const re_dfa_t *dfa, const re_node_set *nodes, re_hashval_t hash); static re_dfastate_t *create_cd_newstate (const re_dfa_t *dfa, const re_node_set *nodes, unsigned int context, re_hashval_t hash); static reg_errcode_t re_string_realloc_buffers (re_string_t *pstr, Idx new_buf_len); #ifdef RE_ENABLE_I18N static void build_wcs_buffer (re_string_t *pstr); static reg_errcode_t build_wcs_upper_buffer (re_string_t *pstr); #endif /* RE_ENABLE_I18N */ static void build_upper_buffer (re_string_t *pstr); static void re_string_translate_buffer (re_string_t *pstr); static unsigned int re_string_context_at (const re_string_t *input, Idx idx, int eflags) __attribute__ ((pure)); /* Functions for string operation. */ /* This function allocate the buffers. It is necessary to call re_string_reconstruct before using the object. */ static reg_errcode_t __attribute_warn_unused_result__ re_string_allocate (re_string_t *pstr, const char *str, Idx len, Idx init_len, RE_TRANSLATE_TYPE trans, bool icase, const re_dfa_t *dfa) { reg_errcode_t ret; Idx init_buf_len; /* Ensure at least one character fits into the buffers. */ if (init_len < dfa->mb_cur_max) init_len = dfa->mb_cur_max; init_buf_len = (len + 1 < init_len) ? len + 1: init_len; re_string_construct_common (str, len, pstr, trans, icase, dfa); ret = re_string_realloc_buffers (pstr, init_buf_len); if (__glibc_unlikely (ret != REG_NOERROR)) return ret; pstr->word_char = dfa->word_char; pstr->word_ops_used = dfa->word_ops_used; pstr->mbs = pstr->mbs_allocated ? pstr->mbs : (unsigned char *) str; pstr->valid_len = (pstr->mbs_allocated || dfa->mb_cur_max > 1) ? 0 : len; pstr->valid_raw_len = pstr->valid_len; return REG_NOERROR; } /* This function allocate the buffers, and initialize them. */ static reg_errcode_t __attribute_warn_unused_result__ re_string_construct (re_string_t *pstr, const char *str, Idx len, RE_TRANSLATE_TYPE trans, bool icase, const re_dfa_t *dfa) { reg_errcode_t ret; memset (pstr, '\0', sizeof (re_string_t)); re_string_construct_common (str, len, pstr, trans, icase, dfa); if (len > 0) { ret = re_string_realloc_buffers (pstr, len + 1); if (__glibc_unlikely (ret != REG_NOERROR)) return ret; } pstr->mbs = pstr->mbs_allocated ? pstr->mbs : (unsigned char *) str; if (icase) { #ifdef RE_ENABLE_I18N if (dfa->mb_cur_max > 1) { while (1) { ret = build_wcs_upper_buffer (pstr); if (__glibc_unlikely (ret != REG_NOERROR)) return ret; if (pstr->valid_raw_len >= len) break; if (pstr->bufs_len > pstr->valid_len + dfa->mb_cur_max) break; ret = re_string_realloc_buffers (pstr, pstr->bufs_len * 2); if (__glibc_unlikely (ret != REG_NOERROR)) return ret; } } else #endif /* RE_ENABLE_I18N */ build_upper_buffer (pstr); } else { #ifdef RE_ENABLE_I18N if (dfa->mb_cur_max > 1) build_wcs_buffer (pstr); else #endif /* RE_ENABLE_I18N */ { if (trans != NULL) re_string_translate_buffer (pstr); else { pstr->valid_len = pstr->bufs_len; pstr->valid_raw_len = pstr->bufs_len; } } } return REG_NOERROR; } /* Helper functions for re_string_allocate, and re_string_construct. */ static reg_errcode_t __attribute_warn_unused_result__ re_string_realloc_buffers (re_string_t *pstr, Idx new_buf_len) { #ifdef RE_ENABLE_I18N if (pstr->mb_cur_max > 1) { wint_t *new_wcs; /* Avoid overflow in realloc. */ const size_t max_object_size = MAX (sizeof (wint_t), sizeof (Idx)); if (__glibc_unlikely (MIN (IDX_MAX, SIZE_MAX / max_object_size) < new_buf_len)) return REG_ESPACE; new_wcs = re_realloc (pstr->wcs, wint_t, new_buf_len); if (__glibc_unlikely (new_wcs == NULL)) return REG_ESPACE; pstr->wcs = new_wcs; if (pstr->offsets != NULL) { Idx *new_offsets = re_realloc (pstr->offsets, Idx, new_buf_len); if (__glibc_unlikely (new_offsets == NULL)) return REG_ESPACE; pstr->offsets = new_offsets; } } #endif /* RE_ENABLE_I18N */ if (pstr->mbs_allocated) { unsigned char *new_mbs = re_realloc (pstr->mbs, unsigned char, new_buf_len); if (__glibc_unlikely (new_mbs == NULL)) return REG_ESPACE; pstr->mbs = new_mbs; } pstr->bufs_len = new_buf_len; return REG_NOERROR; } static void re_string_construct_common (const char *str, Idx len, re_string_t *pstr, RE_TRANSLATE_TYPE trans, bool icase, const re_dfa_t *dfa) { pstr->raw_mbs = (const unsigned char *) str; pstr->len = len; pstr->raw_len = len; pstr->trans = trans; pstr->icase = icase; pstr->mbs_allocated = (trans != NULL || icase); pstr->mb_cur_max = dfa->mb_cur_max; pstr->is_utf8 = dfa->is_utf8; pstr->map_notascii = dfa->map_notascii; pstr->stop = pstr->len; pstr->raw_stop = pstr->stop; } #ifdef RE_ENABLE_I18N /* Build wide character buffer PSTR->WCS. If the byte sequence of the string are: (0), (1), (0), (1), Then wide character buffer will be: , WEOF , , WEOF , We use WEOF for padding, they indicate that the position isn't a first byte of a multibyte character. Note that this function assumes PSTR->VALID_LEN elements are already built and starts from PSTR->VALID_LEN. */ static void build_wcs_buffer (re_string_t *pstr) { #ifdef _LIBC unsigned char buf[MB_LEN_MAX]; DEBUG_ASSERT (MB_LEN_MAX >= pstr->mb_cur_max); #else unsigned char buf[64]; #endif mbstate_t prev_st; Idx byte_idx, end_idx, remain_len; size_t mbclen; /* Build the buffers from pstr->valid_len to either pstr->len or pstr->bufs_len. */ end_idx = (pstr->bufs_len > pstr->len) ? pstr->len : pstr->bufs_len; for (byte_idx = pstr->valid_len; byte_idx < end_idx;) { wchar_t wc; const char *p; remain_len = end_idx - byte_idx; prev_st = pstr->cur_state; /* Apply the translation if we need. */ if (__glibc_unlikely (pstr->trans != NULL)) { int i, ch; for (i = 0; i < pstr->mb_cur_max && i < remain_len; ++i) { ch = pstr->raw_mbs [pstr->raw_mbs_idx + byte_idx + i]; buf[i] = pstr->mbs[byte_idx + i] = pstr->trans[ch]; } p = (const char *) buf; } else p = (const char *) pstr->raw_mbs + pstr->raw_mbs_idx + byte_idx; mbclen = __mbrtowc (&wc, p, remain_len, &pstr->cur_state); if (__glibc_unlikely (mbclen == (size_t) -1 || mbclen == 0 || (mbclen == (size_t) -2 && pstr->bufs_len >= pstr->len))) { /* We treat these cases as a singlebyte character. */ mbclen = 1; wc = (wchar_t) pstr->raw_mbs[pstr->raw_mbs_idx + byte_idx]; if (__glibc_unlikely (pstr->trans != NULL)) wc = pstr->trans[wc]; pstr->cur_state = prev_st; } else if (__glibc_unlikely (mbclen == (size_t) -2)) { /* The buffer doesn't have enough space, finish to build. */ pstr->cur_state = prev_st; break; } /* Write wide character and padding. */ pstr->wcs[byte_idx++] = wc; /* Write paddings. */ for (remain_len = byte_idx + mbclen - 1; byte_idx < remain_len ;) pstr->wcs[byte_idx++] = WEOF; } pstr->valid_len = byte_idx; pstr->valid_raw_len = byte_idx; } /* Build wide character buffer PSTR->WCS like build_wcs_buffer, but for REG_ICASE. */ static reg_errcode_t __attribute_warn_unused_result__ build_wcs_upper_buffer (re_string_t *pstr) { mbstate_t prev_st; Idx src_idx, byte_idx, end_idx, remain_len; size_t mbclen; #ifdef _LIBC char buf[MB_LEN_MAX]; DEBUG_ASSERT (pstr->mb_cur_max <= MB_LEN_MAX); #else char buf[64]; #endif byte_idx = pstr->valid_len; end_idx = (pstr->bufs_len > pstr->len) ? pstr->len : pstr->bufs_len; /* The following optimization assumes that ASCII characters can be mapped to wide characters with a simple cast. */ if (! pstr->map_notascii && pstr->trans == NULL && !pstr->offsets_needed) { while (byte_idx < end_idx) { wchar_t wc; if (isascii (pstr->raw_mbs[pstr->raw_mbs_idx + byte_idx]) && mbsinit (&pstr->cur_state)) { /* In case of a singlebyte character. */ pstr->mbs[byte_idx] = toupper (pstr->raw_mbs[pstr->raw_mbs_idx + byte_idx]); /* The next step uses the assumption that wchar_t is encoded ASCII-safe: all ASCII values can be converted like this. */ pstr->wcs[byte_idx] = (wchar_t) pstr->mbs[byte_idx]; ++byte_idx; continue; } remain_len = end_idx - byte_idx; prev_st = pstr->cur_state; mbclen = __mbrtowc (&wc, ((const char *) pstr->raw_mbs + pstr->raw_mbs_idx + byte_idx), remain_len, &pstr->cur_state); if (__glibc_likely (0 < mbclen && mbclen < (size_t) -2)) { wchar_t wcu = __towupper (wc); if (wcu != wc) { size_t mbcdlen; mbcdlen = __wcrtomb (buf, wcu, &prev_st); if (__glibc_likely (mbclen == mbcdlen)) memcpy (pstr->mbs + byte_idx, buf, mbclen); else { src_idx = byte_idx; goto offsets_needed; } } else memcpy (pstr->mbs + byte_idx, pstr->raw_mbs + pstr->raw_mbs_idx + byte_idx, mbclen); pstr->wcs[byte_idx++] = wcu; /* Write paddings. */ for (remain_len = byte_idx + mbclen - 1; byte_idx < remain_len ;) pstr->wcs[byte_idx++] = WEOF; } else if (mbclen == (size_t) -1 || mbclen == 0 || (mbclen == (size_t) -2 && pstr->bufs_len >= pstr->len)) { /* It is an invalid character, an incomplete character at the end of the string, or '\0'. Just use the byte. */ int ch = pstr->raw_mbs[pstr->raw_mbs_idx + byte_idx]; pstr->mbs[byte_idx] = ch; /* And also cast it to wide char. */ pstr->wcs[byte_idx++] = (wchar_t) ch; if (__glibc_unlikely (mbclen == (size_t) -1)) pstr->cur_state = prev_st; } else { /* The buffer doesn't have enough space, finish to build. */ pstr->cur_state = prev_st; break; } } pstr->valid_len = byte_idx; pstr->valid_raw_len = byte_idx; return REG_NOERROR; } else for (src_idx = pstr->valid_raw_len; byte_idx < end_idx;) { wchar_t wc; const char *p; offsets_needed: remain_len = end_idx - byte_idx; prev_st = pstr->cur_state; if (__glibc_unlikely (pstr->trans != NULL)) { int i, ch; for (i = 0; i < pstr->mb_cur_max && i < remain_len; ++i) { ch = pstr->raw_mbs [pstr->raw_mbs_idx + src_idx + i]; buf[i] = pstr->trans[ch]; } p = (const char *) buf; } else p = (const char *) pstr->raw_mbs + pstr->raw_mbs_idx + src_idx; mbclen = __mbrtowc (&wc, p, remain_len, &pstr->cur_state); if (__glibc_likely (0 < mbclen && mbclen < (size_t) -2)) { wchar_t wcu = __towupper (wc); if (wcu != wc) { size_t mbcdlen; mbcdlen = __wcrtomb ((char *) buf, wcu, &prev_st); if (__glibc_likely (mbclen == mbcdlen)) memcpy (pstr->mbs + byte_idx, buf, mbclen); else if (mbcdlen != (size_t) -1) { size_t i; if (byte_idx + mbcdlen > pstr->bufs_len) { pstr->cur_state = prev_st; break; } if (pstr->offsets == NULL) { pstr->offsets = re_malloc (Idx, pstr->bufs_len); if (pstr->offsets == NULL) return REG_ESPACE; } if (!pstr->offsets_needed) { for (i = 0; i < (size_t) byte_idx; ++i) pstr->offsets[i] = i; pstr->offsets_needed = 1; } memcpy (pstr->mbs + byte_idx, buf, mbcdlen); pstr->wcs[byte_idx] = wcu; pstr->offsets[byte_idx] = src_idx; for (i = 1; i < mbcdlen; ++i) { pstr->offsets[byte_idx + i] = src_idx + (i < mbclen ? i : mbclen - 1); pstr->wcs[byte_idx + i] = WEOF; } pstr->len += mbcdlen - mbclen; if (pstr->raw_stop > src_idx) pstr->stop += mbcdlen - mbclen; end_idx = (pstr->bufs_len > pstr->len) ? pstr->len : pstr->bufs_len; byte_idx += mbcdlen; src_idx += mbclen; continue; } else memcpy (pstr->mbs + byte_idx, p, mbclen); } else memcpy (pstr->mbs + byte_idx, p, mbclen); if (__glibc_unlikely (pstr->offsets_needed != 0)) { size_t i; for (i = 0; i < mbclen; ++i) pstr->offsets[byte_idx + i] = src_idx + i; } src_idx += mbclen; pstr->wcs[byte_idx++] = wcu; /* Write paddings. */ for (remain_len = byte_idx + mbclen - 1; byte_idx < remain_len ;) pstr->wcs[byte_idx++] = WEOF; } else if (mbclen == (size_t) -1 || mbclen == 0 || (mbclen == (size_t) -2 && pstr->bufs_len >= pstr->len)) { /* It is an invalid character or '\0'. Just use the byte. */ int ch = pstr->raw_mbs[pstr->raw_mbs_idx + src_idx]; if (__glibc_unlikely (pstr->trans != NULL)) ch = pstr->trans [ch]; pstr->mbs[byte_idx] = ch; if (__glibc_unlikely (pstr->offsets_needed != 0)) pstr->offsets[byte_idx] = src_idx; ++src_idx; /* And also cast it to wide char. */ pstr->wcs[byte_idx++] = (wchar_t) ch; if (__glibc_unlikely (mbclen == (size_t) -1)) pstr->cur_state = prev_st; } else { /* The buffer doesn't have enough space, finish to build. */ pstr->cur_state = prev_st; break; } } pstr->valid_len = byte_idx; pstr->valid_raw_len = src_idx; return REG_NOERROR; } /* Skip characters until the index becomes greater than NEW_RAW_IDX. Return the index. */ static Idx re_string_skip_chars (re_string_t *pstr, Idx new_raw_idx, wint_t *last_wc) { mbstate_t prev_st; Idx rawbuf_idx; size_t mbclen; wint_t wc = WEOF; /* Skip the characters which are not necessary to check. */ for (rawbuf_idx = pstr->raw_mbs_idx + pstr->valid_raw_len; rawbuf_idx < new_raw_idx;) { wchar_t wc2; Idx remain_len = pstr->raw_len - rawbuf_idx; prev_st = pstr->cur_state; mbclen = __mbrtowc (&wc2, (const char *) pstr->raw_mbs + rawbuf_idx, remain_len, &pstr->cur_state); if (__glibc_unlikely (mbclen == (size_t) -2 || mbclen == (size_t) -1 || mbclen == 0)) { /* We treat these cases as a single byte character. */ if (mbclen == 0 || remain_len == 0) wc = L'\0'; else wc = *(unsigned char *) (pstr->raw_mbs + rawbuf_idx); mbclen = 1; pstr->cur_state = prev_st; } else wc = wc2; /* Then proceed the next character. */ rawbuf_idx += mbclen; } *last_wc = wc; return rawbuf_idx; } #endif /* RE_ENABLE_I18N */ /* Build the buffer PSTR->MBS, and apply the translation if we need. This function is used in case of REG_ICASE. */ static void build_upper_buffer (re_string_t *pstr) { Idx char_idx, end_idx; end_idx = (pstr->bufs_len > pstr->len) ? pstr->len : pstr->bufs_len; for (char_idx = pstr->valid_len; char_idx < end_idx; ++char_idx) { int ch = pstr->raw_mbs[pstr->raw_mbs_idx + char_idx]; if (__glibc_unlikely (pstr->trans != NULL)) ch = pstr->trans[ch]; pstr->mbs[char_idx] = toupper (ch); } pstr->valid_len = char_idx; pstr->valid_raw_len = char_idx; } /* Apply TRANS to the buffer in PSTR. */ static void re_string_translate_buffer (re_string_t *pstr) { Idx buf_idx, end_idx; end_idx = (pstr->bufs_len > pstr->len) ? pstr->len : pstr->bufs_len; for (buf_idx = pstr->valid_len; buf_idx < end_idx; ++buf_idx) { int ch = pstr->raw_mbs[pstr->raw_mbs_idx + buf_idx]; pstr->mbs[buf_idx] = pstr->trans[ch]; } pstr->valid_len = buf_idx; pstr->valid_raw_len = buf_idx; } /* This function re-construct the buffers. Concretely, convert to wide character in case of pstr->mb_cur_max > 1, convert to upper case in case of REG_ICASE, apply translation. */ static reg_errcode_t __attribute_warn_unused_result__ re_string_reconstruct (re_string_t *pstr, Idx idx, int eflags) { Idx offset; if (__glibc_unlikely (pstr->raw_mbs_idx <= idx)) offset = idx - pstr->raw_mbs_idx; else { /* Reset buffer. */ #ifdef RE_ENABLE_I18N if (pstr->mb_cur_max > 1) memset (&pstr->cur_state, '\0', sizeof (mbstate_t)); #endif /* RE_ENABLE_I18N */ pstr->len = pstr->raw_len; pstr->stop = pstr->raw_stop; pstr->valid_len = 0; pstr->raw_mbs_idx = 0; pstr->valid_raw_len = 0; pstr->offsets_needed = 0; pstr->tip_context = ((eflags & REG_NOTBOL) ? CONTEXT_BEGBUF : CONTEXT_NEWLINE | CONTEXT_BEGBUF); if (!pstr->mbs_allocated) pstr->mbs = (unsigned char *) pstr->raw_mbs; offset = idx; } if (__glibc_likely (offset != 0)) { /* Should the already checked characters be kept? */ if (__glibc_likely (offset < pstr->valid_raw_len)) { /* Yes, move them to the front of the buffer. */ #ifdef RE_ENABLE_I18N if (__glibc_unlikely (pstr->offsets_needed)) { Idx low = 0, high = pstr->valid_len, mid; do { mid = (high + low) / 2; if (pstr->offsets[mid] > offset) high = mid; else if (pstr->offsets[mid] < offset) low = mid + 1; else break; } while (low < high); if (pstr->offsets[mid] < offset) ++mid; pstr->tip_context = re_string_context_at (pstr, mid - 1, eflags); /* This can be quite complicated, so handle specially only the common and easy case where the character with different length representation of lower and upper case is present at or after offset. */ if (pstr->valid_len > offset && mid == offset && pstr->offsets[mid] == offset) { memmove (pstr->wcs, pstr->wcs + offset, (pstr->valid_len - offset) * sizeof (wint_t)); memmove (pstr->mbs, pstr->mbs + offset, pstr->valid_len - offset); pstr->valid_len -= offset; pstr->valid_raw_len -= offset; for (low = 0; low < pstr->valid_len; low++) pstr->offsets[low] = pstr->offsets[low + offset] - offset; } else { /* Otherwise, just find out how long the partial multibyte character at offset is and fill it with WEOF/255. */ pstr->len = pstr->raw_len - idx + offset; pstr->stop = pstr->raw_stop - idx + offset; pstr->offsets_needed = 0; while (mid > 0 && pstr->offsets[mid - 1] == offset) --mid; while (mid < pstr->valid_len) if (pstr->wcs[mid] != WEOF) break; else ++mid; if (mid == pstr->valid_len) pstr->valid_len = 0; else { pstr->valid_len = pstr->offsets[mid] - offset; if (pstr->valid_len) { for (low = 0; low < pstr->valid_len; ++low) pstr->wcs[low] = WEOF; memset (pstr->mbs, 255, pstr->valid_len); } } pstr->valid_raw_len = pstr->valid_len; } } else #endif { pstr->tip_context = re_string_context_at (pstr, offset - 1, eflags); #ifdef RE_ENABLE_I18N if (pstr->mb_cur_max > 1) memmove (pstr->wcs, pstr->wcs + offset, (pstr->valid_len - offset) * sizeof (wint_t)); #endif /* RE_ENABLE_I18N */ if (__glibc_unlikely (pstr->mbs_allocated)) memmove (pstr->mbs, pstr->mbs + offset, pstr->valid_len - offset); pstr->valid_len -= offset; pstr->valid_raw_len -= offset; DEBUG_ASSERT (pstr->valid_len > 0); } } else { #ifdef RE_ENABLE_I18N /* No, skip all characters until IDX. */ Idx prev_valid_len = pstr->valid_len; if (__glibc_unlikely (pstr->offsets_needed)) { pstr->len = pstr->raw_len - idx + offset; pstr->stop = pstr->raw_stop - idx + offset; pstr->offsets_needed = 0; } #endif pstr->valid_len = 0; #ifdef RE_ENABLE_I18N if (pstr->mb_cur_max > 1) { Idx wcs_idx; wint_t wc = WEOF; if (pstr->is_utf8) { const unsigned char *raw, *p, *end; /* Special case UTF-8. Multi-byte chars start with any byte other than 0x80 - 0xbf. */ raw = pstr->raw_mbs + pstr->raw_mbs_idx; end = raw + (offset - pstr->mb_cur_max); if (end < pstr->raw_mbs) end = pstr->raw_mbs; p = raw + offset - 1; #ifdef _LIBC /* We know the wchar_t encoding is UCS4, so for the simple case, ASCII characters, skip the conversion step. */ if (isascii (*p) && __glibc_likely (pstr->trans == NULL)) { memset (&pstr->cur_state, '\0', sizeof (mbstate_t)); /* pstr->valid_len = 0; */ wc = (wchar_t) *p; } else #endif for (; p >= end; --p) if ((*p & 0xc0) != 0x80) { mbstate_t cur_state; wchar_t wc2; Idx mlen = raw + pstr->len - p; unsigned char buf[6]; size_t mbclen; const unsigned char *pp = p; if (__glibc_unlikely (pstr->trans != NULL)) { int i = mlen < 6 ? mlen : 6; while (--i >= 0) buf[i] = pstr->trans[p[i]]; pp = buf; } /* XXX Don't use mbrtowc, we know which conversion to use (UTF-8 -> UCS4). */ memset (&cur_state, 0, sizeof (cur_state)); mbclen = __mbrtowc (&wc2, (const char *) pp, mlen, &cur_state); if (raw + offset - p <= mbclen && mbclen < (size_t) -2) { memset (&pstr->cur_state, '\0', sizeof (mbstate_t)); pstr->valid_len = mbclen - (raw + offset - p); wc = wc2; } break; } } if (wc == WEOF) pstr->valid_len = re_string_skip_chars (pstr, idx, &wc) - idx; if (wc == WEOF) pstr->tip_context = re_string_context_at (pstr, prev_valid_len - 1, eflags); else pstr->tip_context = ((__glibc_unlikely (pstr->word_ops_used != 0) && IS_WIDE_WORD_CHAR (wc)) ? CONTEXT_WORD : ((IS_WIDE_NEWLINE (wc) && pstr->newline_anchor) ? CONTEXT_NEWLINE : 0)); if (__glibc_unlikely (pstr->valid_len)) { for (wcs_idx = 0; wcs_idx < pstr->valid_len; ++wcs_idx) pstr->wcs[wcs_idx] = WEOF; if (pstr->mbs_allocated) memset (pstr->mbs, 255, pstr->valid_len); } pstr->valid_raw_len = pstr->valid_len; } else #endif /* RE_ENABLE_I18N */ { int c = pstr->raw_mbs[pstr->raw_mbs_idx + offset - 1]; pstr->valid_raw_len = 0; if (pstr->trans) c = pstr->trans[c]; pstr->tip_context = (bitset_contain (pstr->word_char, c) ? CONTEXT_WORD : ((IS_NEWLINE (c) && pstr->newline_anchor) ? CONTEXT_NEWLINE : 0)); } } if (!__glibc_unlikely (pstr->mbs_allocated)) pstr->mbs += offset; } pstr->raw_mbs_idx = idx; pstr->len -= offset; pstr->stop -= offset; /* Then build the buffers. */ #ifdef RE_ENABLE_I18N if (pstr->mb_cur_max > 1) { if (pstr->icase) { reg_errcode_t ret = build_wcs_upper_buffer (pstr); if (__glibc_unlikely (ret != REG_NOERROR)) return ret; } else build_wcs_buffer (pstr); } else #endif /* RE_ENABLE_I18N */ if (__glibc_unlikely (pstr->mbs_allocated)) { if (pstr->icase) build_upper_buffer (pstr); else if (pstr->trans != NULL) re_string_translate_buffer (pstr); } else pstr->valid_len = pstr->len; pstr->cur_idx = 0; return REG_NOERROR; } static unsigned char __attribute__ ((pure)) re_string_peek_byte_case (const re_string_t *pstr, Idx idx) { int ch; Idx off; /* Handle the common (easiest) cases first. */ if (__glibc_likely (!pstr->mbs_allocated)) return re_string_peek_byte (pstr, idx); #ifdef RE_ENABLE_I18N if (pstr->mb_cur_max > 1 && ! re_string_is_single_byte_char (pstr, pstr->cur_idx + idx)) return re_string_peek_byte (pstr, idx); #endif off = pstr->cur_idx + idx; #ifdef RE_ENABLE_I18N if (pstr->offsets_needed) off = pstr->offsets[off]; #endif ch = pstr->raw_mbs[pstr->raw_mbs_idx + off]; #ifdef RE_ENABLE_I18N /* Ensure that e.g. for tr_TR.UTF-8 BACKSLASH DOTLESS SMALL LETTER I this function returns CAPITAL LETTER I instead of first byte of DOTLESS SMALL LETTER I. The latter would confuse the parser, since peek_byte_case doesn't advance cur_idx in any way. */ if (pstr->offsets_needed && !isascii (ch)) return re_string_peek_byte (pstr, idx); #endif return ch; } static unsigned char re_string_fetch_byte_case (re_string_t *pstr) { if (__glibc_likely (!pstr->mbs_allocated)) return re_string_fetch_byte (pstr); #ifdef RE_ENABLE_I18N if (pstr->offsets_needed) { Idx off; int ch; /* For tr_TR.UTF-8 [[:islower:]] there is [[: CAPITAL LETTER I WITH DOT lower:]] in mbs. Skip in that case the whole multi-byte character and return the original letter. On the other side, with [[: DOTLESS SMALL LETTER I return [[:I, as doing anything else would complicate things too much. */ if (!re_string_first_byte (pstr, pstr->cur_idx)) return re_string_fetch_byte (pstr); off = pstr->offsets[pstr->cur_idx]; ch = pstr->raw_mbs[pstr->raw_mbs_idx + off]; if (! isascii (ch)) return re_string_fetch_byte (pstr); re_string_skip_bytes (pstr, re_string_char_size_at (pstr, pstr->cur_idx)); return ch; } #endif return pstr->raw_mbs[pstr->raw_mbs_idx + pstr->cur_idx++]; } static void re_string_destruct (re_string_t *pstr) { #ifdef RE_ENABLE_I18N re_free (pstr->wcs); re_free (pstr->offsets); #endif /* RE_ENABLE_I18N */ if (pstr->mbs_allocated) re_free (pstr->mbs); } /* Return the context at IDX in INPUT. */ static unsigned int re_string_context_at (const re_string_t *input, Idx idx, int eflags) { int c; if (__glibc_unlikely (idx < 0)) /* In this case, we use the value stored in input->tip_context, since we can't know the character in input->mbs[-1] here. */ return input->tip_context; if (__glibc_unlikely (idx == input->len)) return ((eflags & REG_NOTEOL) ? CONTEXT_ENDBUF : CONTEXT_NEWLINE | CONTEXT_ENDBUF); #ifdef RE_ENABLE_I18N if (input->mb_cur_max > 1) { wint_t wc; Idx wc_idx = idx; while(input->wcs[wc_idx] == WEOF) { DEBUG_ASSERT (wc_idx >= 0); --wc_idx; if (wc_idx < 0) return input->tip_context; } wc = input->wcs[wc_idx]; if (__glibc_unlikely (input->word_ops_used != 0) && IS_WIDE_WORD_CHAR (wc)) return CONTEXT_WORD; return (IS_WIDE_NEWLINE (wc) && input->newline_anchor ? CONTEXT_NEWLINE : 0); } else #endif { c = re_string_byte_at (input, idx); if (bitset_contain (input->word_char, c)) return CONTEXT_WORD; return IS_NEWLINE (c) && input->newline_anchor ? CONTEXT_NEWLINE : 0; } } /* Functions for set operation. */ static reg_errcode_t __attribute_warn_unused_result__ re_node_set_alloc (re_node_set *set, Idx size) { set->alloc = size; set->nelem = 0; set->elems = re_malloc (Idx, size); if (__glibc_unlikely (set->elems == NULL) && (MALLOC_0_IS_NONNULL || size != 0)) return REG_ESPACE; return REG_NOERROR; } static reg_errcode_t __attribute_warn_unused_result__ re_node_set_init_1 (re_node_set *set, Idx elem) { set->alloc = 1; set->nelem = 1; set->elems = re_malloc (Idx, 1); if (__glibc_unlikely (set->elems == NULL)) { set->alloc = set->nelem = 0; return REG_ESPACE; } set->elems[0] = elem; return REG_NOERROR; } static reg_errcode_t __attribute_warn_unused_result__ re_node_set_init_2 (re_node_set *set, Idx elem1, Idx elem2) { set->alloc = 2; set->elems = re_malloc (Idx, 2); if (__glibc_unlikely (set->elems == NULL)) return REG_ESPACE; if (elem1 == elem2) { set->nelem = 1; set->elems[0] = elem1; } else { set->nelem = 2; if (elem1 < elem2) { set->elems[0] = elem1; set->elems[1] = elem2; } else { set->elems[0] = elem2; set->elems[1] = elem1; } } return REG_NOERROR; } static reg_errcode_t __attribute_warn_unused_result__ re_node_set_init_copy (re_node_set *dest, const re_node_set *src) { dest->nelem = src->nelem; if (src->nelem > 0) { dest->alloc = dest->nelem; dest->elems = re_malloc (Idx, dest->alloc); if (__glibc_unlikely (dest->elems == NULL)) { dest->alloc = dest->nelem = 0; return REG_ESPACE; } memcpy (dest->elems, src->elems, src->nelem * sizeof (Idx)); } else re_node_set_init_empty (dest); return REG_NOERROR; } /* Calculate the intersection of the sets SRC1 and SRC2. And merge it to DEST. Return value indicate the error code or REG_NOERROR if succeeded. Note: We assume dest->elems is NULL, when dest->alloc is 0. */ static reg_errcode_t __attribute_warn_unused_result__ re_node_set_add_intersect (re_node_set *dest, const re_node_set *src1, const re_node_set *src2) { Idx i1, i2, is, id, delta, sbase; if (src1->nelem == 0 || src2->nelem == 0) return REG_NOERROR; /* We need dest->nelem + 2 * elems_in_intersection; this is a conservative estimate. */ if (src1->nelem + src2->nelem + dest->nelem > dest->alloc) { Idx new_alloc = src1->nelem + src2->nelem + dest->alloc; Idx *new_elems = re_realloc (dest->elems, Idx, new_alloc); if (__glibc_unlikely (new_elems == NULL)) return REG_ESPACE; dest->elems = new_elems; dest->alloc = new_alloc; } /* Find the items in the intersection of SRC1 and SRC2, and copy into the top of DEST those that are not already in DEST itself. */ sbase = dest->nelem + src1->nelem + src2->nelem; i1 = src1->nelem - 1; i2 = src2->nelem - 1; id = dest->nelem - 1; for (;;) { if (src1->elems[i1] == src2->elems[i2]) { /* Try to find the item in DEST. Maybe we could binary search? */ while (id >= 0 && dest->elems[id] > src1->elems[i1]) --id; if (id < 0 || dest->elems[id] != src1->elems[i1]) dest->elems[--sbase] = src1->elems[i1]; if (--i1 < 0 || --i2 < 0) break; } /* Lower the highest of the two items. */ else if (src1->elems[i1] < src2->elems[i2]) { if (--i2 < 0) break; } else { if (--i1 < 0) break; } } id = dest->nelem - 1; is = dest->nelem + src1->nelem + src2->nelem - 1; delta = is - sbase + 1; /* Now copy. When DELTA becomes zero, the remaining DEST elements are already in place; this is more or less the same loop that is in re_node_set_merge. */ dest->nelem += delta; if (delta > 0 && id >= 0) for (;;) { if (dest->elems[is] > dest->elems[id]) { /* Copy from the top. */ dest->elems[id + delta--] = dest->elems[is--]; if (delta == 0) break; } else { /* Slide from the bottom. */ dest->elems[id + delta] = dest->elems[id]; if (--id < 0) break; } } /* Copy remaining SRC elements. */ memcpy (dest->elems, dest->elems + sbase, delta * sizeof (Idx)); return REG_NOERROR; } /* Calculate the union set of the sets SRC1 and SRC2. And store it to DEST. Return value indicate the error code or REG_NOERROR if succeeded. */ static reg_errcode_t __attribute_warn_unused_result__ re_node_set_init_union (re_node_set *dest, const re_node_set *src1, const re_node_set *src2) { Idx i1, i2, id; if (src1 != NULL && src1->nelem > 0 && src2 != NULL && src2->nelem > 0) { dest->alloc = src1->nelem + src2->nelem; dest->elems = re_malloc (Idx, dest->alloc); if (__glibc_unlikely (dest->elems == NULL)) return REG_ESPACE; } else { if (src1 != NULL && src1->nelem > 0) return re_node_set_init_copy (dest, src1); else if (src2 != NULL && src2->nelem > 0) return re_node_set_init_copy (dest, src2); else re_node_set_init_empty (dest); return REG_NOERROR; } for (i1 = i2 = id = 0 ; i1 < src1->nelem && i2 < src2->nelem ;) { if (src1->elems[i1] > src2->elems[i2]) { dest->elems[id++] = src2->elems[i2++]; continue; } if (src1->elems[i1] == src2->elems[i2]) ++i2; dest->elems[id++] = src1->elems[i1++]; } if (i1 < src1->nelem) { memcpy (dest->elems + id, src1->elems + i1, (src1->nelem - i1) * sizeof (Idx)); id += src1->nelem - i1; } else if (i2 < src2->nelem) { memcpy (dest->elems + id, src2->elems + i2, (src2->nelem - i2) * sizeof (Idx)); id += src2->nelem - i2; } dest->nelem = id; return REG_NOERROR; } /* Calculate the union set of the sets DEST and SRC. And store it to DEST. Return value indicate the error code or REG_NOERROR if succeeded. */ static reg_errcode_t __attribute_warn_unused_result__ re_node_set_merge (re_node_set *dest, const re_node_set *src) { Idx is, id, sbase, delta; if (src == NULL || src->nelem == 0) return REG_NOERROR; if (dest->alloc < 2 * src->nelem + dest->nelem) { Idx new_alloc = 2 * (src->nelem + dest->alloc); Idx *new_buffer = re_realloc (dest->elems, Idx, new_alloc); if (__glibc_unlikely (new_buffer == NULL)) return REG_ESPACE; dest->elems = new_buffer; dest->alloc = new_alloc; } if (__glibc_unlikely (dest->nelem == 0)) { dest->nelem = src->nelem; memcpy (dest->elems, src->elems, src->nelem * sizeof (Idx)); return REG_NOERROR; } /* Copy into the top of DEST the items of SRC that are not found in DEST. Maybe we could binary search in DEST? */ for (sbase = dest->nelem + 2 * src->nelem, is = src->nelem - 1, id = dest->nelem - 1; is >= 0 && id >= 0; ) { if (dest->elems[id] == src->elems[is]) is--, id--; else if (dest->elems[id] < src->elems[is]) dest->elems[--sbase] = src->elems[is--]; else /* if (dest->elems[id] > src->elems[is]) */ --id; } if (is >= 0) { /* If DEST is exhausted, the remaining items of SRC must be unique. */ sbase -= is + 1; memcpy (dest->elems + sbase, src->elems, (is + 1) * sizeof (Idx)); } id = dest->nelem - 1; is = dest->nelem + 2 * src->nelem - 1; delta = is - sbase + 1; if (delta == 0) return REG_NOERROR; /* Now copy. When DELTA becomes zero, the remaining DEST elements are already in place. */ dest->nelem += delta; for (;;) { if (dest->elems[is] > dest->elems[id]) { /* Copy from the top. */ dest->elems[id + delta--] = dest->elems[is--]; if (delta == 0) break; } else { /* Slide from the bottom. */ dest->elems[id + delta] = dest->elems[id]; if (--id < 0) { /* Copy remaining SRC elements. */ memcpy (dest->elems, dest->elems + sbase, delta * sizeof (Idx)); break; } } } return REG_NOERROR; } /* Insert the new element ELEM to the re_node_set* SET. SET should not already have ELEM. Return true if successful. */ static bool __attribute_warn_unused_result__ re_node_set_insert (re_node_set *set, Idx elem) { Idx idx; /* In case the set is empty. */ if (set->alloc == 0) return __glibc_likely (re_node_set_init_1 (set, elem) == REG_NOERROR); if (__glibc_unlikely (set->nelem) == 0) { /* We already guaranteed above that set->alloc != 0. */ set->elems[0] = elem; ++set->nelem; return true; } /* Realloc if we need. */ if (set->alloc == set->nelem) { Idx *new_elems; set->alloc = set->alloc * 2; new_elems = re_realloc (set->elems, Idx, set->alloc); if (__glibc_unlikely (new_elems == NULL)) return false; set->elems = new_elems; } /* Move the elements which follows the new element. Test the first element separately to skip a check in the inner loop. */ if (elem < set->elems[0]) { for (idx = set->nelem; idx > 0; idx--) set->elems[idx] = set->elems[idx - 1]; } else { for (idx = set->nelem; set->elems[idx - 1] > elem; idx--) set->elems[idx] = set->elems[idx - 1]; } /* Insert the new element. */ set->elems[idx] = elem; ++set->nelem; return true; } /* Insert the new element ELEM to the re_node_set* SET. SET should not already have any element greater than or equal to ELEM. Return true if successful. */ static bool __attribute_warn_unused_result__ re_node_set_insert_last (re_node_set *set, Idx elem) { /* Realloc if we need. */ if (set->alloc == set->nelem) { Idx *new_elems; set->alloc = (set->alloc + 1) * 2; new_elems = re_realloc (set->elems, Idx, set->alloc); if (__glibc_unlikely (new_elems == NULL)) return false; set->elems = new_elems; } /* Insert the new element. */ set->elems[set->nelem++] = elem; return true; } /* Compare two node sets SET1 and SET2. Return true if SET1 and SET2 are equivalent. */ static bool __attribute__ ((pure)) re_node_set_compare (const re_node_set *set1, const re_node_set *set2) { Idx i; if (set1 == NULL || set2 == NULL || set1->nelem != set2->nelem) return false; for (i = set1->nelem ; --i >= 0 ; ) if (set1->elems[i] != set2->elems[i]) return false; return true; } /* Return (idx + 1) if SET contains the element ELEM, return 0 otherwise. */ static Idx __attribute__ ((pure)) re_node_set_contains (const re_node_set *set, Idx elem) { __re_size_t idx, right, mid; if (set->nelem <= 0) return 0; /* Binary search the element. */ idx = 0; right = set->nelem - 1; while (idx < right) { mid = (idx + right) / 2; if (set->elems[mid] < elem) idx = mid + 1; else right = mid; } return set->elems[idx] == elem ? idx + 1 : 0; } static void re_node_set_remove_at (re_node_set *set, Idx idx) { if (idx < 0 || idx >= set->nelem) return; --set->nelem; for (; idx < set->nelem; idx++) set->elems[idx] = set->elems[idx + 1]; } /* Add the token TOKEN to dfa->nodes, and return the index of the token. Or return -1 if an error occurred. */ static Idx re_dfa_add_node (re_dfa_t *dfa, re_token_t token) { if (__glibc_unlikely (dfa->nodes_len >= dfa->nodes_alloc)) { size_t new_nodes_alloc = dfa->nodes_alloc * 2; Idx *new_nexts, *new_indices; re_node_set *new_edests, *new_eclosures; re_token_t *new_nodes; /* Avoid overflows in realloc. */ const size_t max_object_size = MAX (sizeof (re_token_t), MAX (sizeof (re_node_set), sizeof (Idx))); if (__glibc_unlikely (MIN (IDX_MAX, SIZE_MAX / max_object_size) < new_nodes_alloc)) return -1; new_nodes = re_realloc (dfa->nodes, re_token_t, new_nodes_alloc); if (__glibc_unlikely (new_nodes == NULL)) return -1; dfa->nodes = new_nodes; new_nexts = re_realloc (dfa->nexts, Idx, new_nodes_alloc); new_indices = re_realloc (dfa->org_indices, Idx, new_nodes_alloc); new_edests = re_realloc (dfa->edests, re_node_set, new_nodes_alloc); new_eclosures = re_realloc (dfa->eclosures, re_node_set, new_nodes_alloc); if (__glibc_unlikely (new_nexts == NULL || new_indices == NULL || new_edests == NULL || new_eclosures == NULL)) { re_free (new_nexts); re_free (new_indices); re_free (new_edests); re_free (new_eclosures); return -1; } dfa->nexts = new_nexts; dfa->org_indices = new_indices; dfa->edests = new_edests; dfa->eclosures = new_eclosures; dfa->nodes_alloc = new_nodes_alloc; } dfa->nodes[dfa->nodes_len] = token; dfa->nodes[dfa->nodes_len].constraint = 0; #ifdef RE_ENABLE_I18N dfa->nodes[dfa->nodes_len].accept_mb = ((token.type == OP_PERIOD && dfa->mb_cur_max > 1) || token.type == COMPLEX_BRACKET); #endif dfa->nexts[dfa->nodes_len] = -1; re_node_set_init_empty (dfa->edests + dfa->nodes_len); re_node_set_init_empty (dfa->eclosures + dfa->nodes_len); return dfa->nodes_len++; } static re_hashval_t calc_state_hash (const re_node_set *nodes, unsigned int context) { re_hashval_t hash = nodes->nelem + context; Idx i; for (i = 0 ; i < nodes->nelem ; i++) hash += nodes->elems[i]; return hash; } /* Search for the state whose node_set is equivalent to NODES. Return the pointer to the state, if we found it in the DFA. Otherwise create the new one and return it. In case of an error return NULL and set the error code in ERR. Note: - We assume NULL as the invalid state, then it is possible that return value is NULL and ERR is REG_NOERROR. - We never return non-NULL value in case of any errors, it is for optimization. */ static re_dfastate_t * __attribute_warn_unused_result__ re_acquire_state (reg_errcode_t *err, const re_dfa_t *dfa, const re_node_set *nodes) { re_hashval_t hash; re_dfastate_t *new_state; struct re_state_table_entry *spot; Idx i; #if defined GCC_LINT || defined lint /* Suppress bogus uninitialized-variable warnings. */ *err = REG_NOERROR; #endif if (__glibc_unlikely (nodes->nelem == 0)) { *err = REG_NOERROR; return NULL; } hash = calc_state_hash (nodes, 0); spot = dfa->state_table + (hash & dfa->state_hash_mask); for (i = 0 ; i < spot->num ; i++) { re_dfastate_t *state = spot->array[i]; if (hash != state->hash) continue; if (re_node_set_compare (&state->nodes, nodes)) return state; } /* There are no appropriate state in the dfa, create the new one. */ new_state = create_ci_newstate (dfa, nodes, hash); if (__glibc_unlikely (new_state == NULL)) *err = REG_ESPACE; return new_state; } /* Search for the state whose node_set is equivalent to NODES and whose context is equivalent to CONTEXT. Return the pointer to the state, if we found it in the DFA. Otherwise create the new one and return it. In case of an error return NULL and set the error code in ERR. Note: - We assume NULL as the invalid state, then it is possible that return value is NULL and ERR is REG_NOERROR. - We never return non-NULL value in case of any errors, it is for optimization. */ static re_dfastate_t * __attribute_warn_unused_result__ re_acquire_state_context (reg_errcode_t *err, const re_dfa_t *dfa, const re_node_set *nodes, unsigned int context) { re_hashval_t hash; re_dfastate_t *new_state; struct re_state_table_entry *spot; Idx i; #if defined GCC_LINT || defined lint /* Suppress bogus uninitialized-variable warnings. */ *err = REG_NOERROR; #endif if (nodes->nelem == 0) { *err = REG_NOERROR; return NULL; } hash = calc_state_hash (nodes, context); spot = dfa->state_table + (hash & dfa->state_hash_mask); for (i = 0 ; i < spot->num ; i++) { re_dfastate_t *state = spot->array[i]; if (state->hash == hash && state->context == context && re_node_set_compare (state->entrance_nodes, nodes)) return state; } /* There are no appropriate state in 'dfa', create the new one. */ new_state = create_cd_newstate (dfa, nodes, context, hash); if (__glibc_unlikely (new_state == NULL)) *err = REG_ESPACE; return new_state; } /* Finish initialization of the new state NEWSTATE, and using its hash value HASH put in the appropriate bucket of DFA's state table. Return value indicates the error code if failed. */ static reg_errcode_t __attribute_warn_unused_result__ register_state (const re_dfa_t *dfa, re_dfastate_t *newstate, re_hashval_t hash) { struct re_state_table_entry *spot; reg_errcode_t err; Idx i; newstate->hash = hash; err = re_node_set_alloc (&newstate->non_eps_nodes, newstate->nodes.nelem); if (__glibc_unlikely (err != REG_NOERROR)) return REG_ESPACE; for (i = 0; i < newstate->nodes.nelem; i++) { Idx elem = newstate->nodes.elems[i]; if (!IS_EPSILON_NODE (dfa->nodes[elem].type)) if (! re_node_set_insert_last (&newstate->non_eps_nodes, elem)) return REG_ESPACE; } spot = dfa->state_table + (hash & dfa->state_hash_mask); if (__glibc_unlikely (spot->alloc <= spot->num)) { Idx new_alloc = 2 * spot->num + 2; re_dfastate_t **new_array = re_realloc (spot->array, re_dfastate_t *, new_alloc); if (__glibc_unlikely (new_array == NULL)) return REG_ESPACE; spot->array = new_array; spot->alloc = new_alloc; } spot->array[spot->num++] = newstate; return REG_NOERROR; } static void free_state (re_dfastate_t *state) { re_node_set_free (&state->non_eps_nodes); re_node_set_free (&state->inveclosure); if (state->entrance_nodes != &state->nodes) { re_node_set_free (state->entrance_nodes); re_free (state->entrance_nodes); } re_node_set_free (&state->nodes); re_free (state->word_trtable); re_free (state->trtable); re_free (state); } /* Create the new state which is independent of contexts. Return the new state if succeeded, otherwise return NULL. */ static re_dfastate_t * __attribute_warn_unused_result__ create_ci_newstate (const re_dfa_t *dfa, const re_node_set *nodes, re_hashval_t hash) { Idx i; reg_errcode_t err; re_dfastate_t *newstate; newstate = (re_dfastate_t *) calloc (sizeof (re_dfastate_t), 1); if (__glibc_unlikely (newstate == NULL)) return NULL; err = re_node_set_init_copy (&newstate->nodes, nodes); if (__glibc_unlikely (err != REG_NOERROR)) { re_free (newstate); return NULL; } newstate->entrance_nodes = &newstate->nodes; for (i = 0 ; i < nodes->nelem ; i++) { re_token_t *node = dfa->nodes + nodes->elems[i]; re_token_type_t type = node->type; if (type == CHARACTER && !node->constraint) continue; #ifdef RE_ENABLE_I18N newstate->accept_mb |= node->accept_mb; #endif /* RE_ENABLE_I18N */ /* If the state has the halt node, the state is a halt state. */ if (type == END_OF_RE) newstate->halt = 1; else if (type == OP_BACK_REF) newstate->has_backref = 1; else if (type == ANCHOR || node->constraint) newstate->has_constraint = 1; } err = register_state (dfa, newstate, hash); if (__glibc_unlikely (err != REG_NOERROR)) { free_state (newstate); newstate = NULL; } return newstate; } /* Create the new state which is depend on the context CONTEXT. Return the new state if succeeded, otherwise return NULL. */ static re_dfastate_t * __attribute_warn_unused_result__ create_cd_newstate (const re_dfa_t *dfa, const re_node_set *nodes, unsigned int context, re_hashval_t hash) { Idx i, nctx_nodes = 0; reg_errcode_t err; re_dfastate_t *newstate; newstate = (re_dfastate_t *) calloc (sizeof (re_dfastate_t), 1); if (__glibc_unlikely (newstate == NULL)) return NULL; err = re_node_set_init_copy (&newstate->nodes, nodes); if (__glibc_unlikely (err != REG_NOERROR)) { re_free (newstate); return NULL; } newstate->context = context; newstate->entrance_nodes = &newstate->nodes; for (i = 0 ; i < nodes->nelem ; i++) { re_token_t *node = dfa->nodes + nodes->elems[i]; re_token_type_t type = node->type; unsigned int constraint = node->constraint; if (type == CHARACTER && !constraint) continue; #ifdef RE_ENABLE_I18N newstate->accept_mb |= node->accept_mb; #endif /* RE_ENABLE_I18N */ /* If the state has the halt node, the state is a halt state. */ if (type == END_OF_RE) newstate->halt = 1; else if (type == OP_BACK_REF) newstate->has_backref = 1; if (constraint) { if (newstate->entrance_nodes == &newstate->nodes) { re_node_set *entrance_nodes = re_malloc (re_node_set, 1); if (__glibc_unlikely (entrance_nodes == NULL)) { free_state (newstate); return NULL; } newstate->entrance_nodes = entrance_nodes; if (re_node_set_init_copy (newstate->entrance_nodes, nodes) != REG_NOERROR) { free_state (newstate); return NULL; } nctx_nodes = 0; newstate->has_constraint = 1; } if (NOT_SATISFY_PREV_CONSTRAINT (constraint,context)) { re_node_set_remove_at (&newstate->nodes, i - nctx_nodes); ++nctx_nodes; } } } err = register_state (dfa, newstate, hash); if (__glibc_unlikely (err != REG_NOERROR)) { free_state (newstate); newstate = NULL; } return newstate; } pspp-1.4.1/gl/rawmemchr.valgrind0000644000175000017500000000167313723215640016244 0ustar00blpblp00000000000000# Suppress a valgrind message about use of uninitialized memory in rawmemchr(). # Copyright (C) 2008-2020 Free Software Foundation, Inc. # # 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 3 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, see . # This use is OK because it provides only a speedup. { rawmemchr-value4 Memcheck:Value4 fun:rawmemchr } { rawmemchr-value8 Memcheck:Value8 fun:rawmemchr } pspp-1.4.1/gl/streq.h0000644000175000017500000000766213723215640014042 0ustar00blpblp00000000000000/* Optimized string comparison. Copyright (C) 2001-2002, 2007, 2009-2020 Free Software Foundation, Inc. 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 3 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, see . */ /* Written by Bruno Haible . */ #ifndef _GL_STREQ_H #define _GL_STREQ_H #include /* STREQ_OPT allows to optimize string comparison with a small literal string. STREQ_OPT (s, "EUC-KR", 'E', 'U', 'C', '-', 'K', 'R', 0, 0, 0) is semantically equivalent to strcmp (s, "EUC-KR") == 0 just faster. */ /* Help GCC to generate good code for string comparisons with immediate strings. */ #if (defined __GNUC__ || defined __clang__) && defined __OPTIMIZE__ static inline int streq9 (const char *s1, const char *s2) { return strcmp (s1 + 9, s2 + 9) == 0; } static inline int streq8 (const char *s1, const char *s2, char s28) { if (s1[8] == s28) { if (s28 == 0) return 1; else return streq9 (s1, s2); } else return 0; } static inline int streq7 (const char *s1, const char *s2, char s27, char s28) { if (s1[7] == s27) { if (s27 == 0) return 1; else return streq8 (s1, s2, s28); } else return 0; } static inline int streq6 (const char *s1, const char *s2, char s26, char s27, char s28) { if (s1[6] == s26) { if (s26 == 0) return 1; else return streq7 (s1, s2, s27, s28); } else return 0; } static inline int streq5 (const char *s1, const char *s2, char s25, char s26, char s27, char s28) { if (s1[5] == s25) { if (s25 == 0) return 1; else return streq6 (s1, s2, s26, s27, s28); } else return 0; } static inline int streq4 (const char *s1, const char *s2, char s24, char s25, char s26, char s27, char s28) { if (s1[4] == s24) { if (s24 == 0) return 1; else return streq5 (s1, s2, s25, s26, s27, s28); } else return 0; } static inline int streq3 (const char *s1, const char *s2, char s23, char s24, char s25, char s26, char s27, char s28) { if (s1[3] == s23) { if (s23 == 0) return 1; else return streq4 (s1, s2, s24, s25, s26, s27, s28); } else return 0; } static inline int streq2 (const char *s1, const char *s2, char s22, char s23, char s24, char s25, char s26, char s27, char s28) { if (s1[2] == s22) { if (s22 == 0) return 1; else return streq3 (s1, s2, s23, s24, s25, s26, s27, s28); } else return 0; } static inline int streq1 (const char *s1, const char *s2, char s21, char s22, char s23, char s24, char s25, char s26, char s27, char s28) { if (s1[1] == s21) { if (s21 == 0) return 1; else return streq2 (s1, s2, s22, s23, s24, s25, s26, s27, s28); } else return 0; } static inline int streq0 (const char *s1, const char *s2, char s20, char s21, char s22, char s23, char s24, char s25, char s26, char s27, char s28) { if (s1[0] == s20) { if (s20 == 0) return 1; else return streq1 (s1, s2, s21, s22, s23, s24, s25, s26, s27, s28); } else return 0; } #define STREQ_OPT(s1,s2,s20,s21,s22,s23,s24,s25,s26,s27,s28) \ streq0 (s1, s2, s20, s21, s22, s23, s24, s25, s26, s27, s28) #else #define STREQ_OPT(s1,s2,s20,s21,s22,s23,s24,s25,s26,s27,s28) \ (strcmp (s1, s2) == 0) #endif #endif /* _GL_STREQ_H */ pspp-1.4.1/gl/basename-lgpl.h0000644000175000017500000000532013723215636015405 0ustar00blpblp00000000000000/* Extract the last component (base name) of a file name. Copyright (C) 1998, 2001, 2003-2006, 2009-2020 Free Software Foundation, Inc. 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 3 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, see . */ #ifndef _BASENAME_LGPL_H #define _BASENAME_LGPL_H #include #ifndef DOUBLE_SLASH_IS_DISTINCT_ROOT # define DOUBLE_SLASH_IS_DISTINCT_ROOT 0 #endif #ifdef __cplusplus extern "C" { #endif /* Return the address of the last file name component of FILENAME. If FILENAME has some trailing slash(es), they are considered to be part of the last component. If FILENAME has no relative file name components because it is a file system root, return the empty string. Examples: FILENAME RESULT "foo.c" "foo.c" "foo/bar.c" "bar.c" "/foo/bar.c" "bar.c" "foo/bar/" "bar/" "foo/bar//" "bar//" "/" "" "//" "" "" "" The return value is a tail of the given FILENAME; do NOT free() it! */ /* This function was traditionally called 'basename', but we avoid this function name because * Various platforms have different functions in their libc. In particular, the glibc basename(), defined in , does not consider trailing slashes to be part of the component: FILENAME RESULT "foo/bar/" "" "foo/bar//" "" * The 'basename' command eliminates trailing slashes and for a root produces a non-empty result: FILENAME RESULT "foo/bar/" "bar" "foo/bar//" "bar" "/" "/" "//" "/" */ extern char *last_component (char const *filename) _GL_ATTRIBUTE_PURE; /* Return the length of the basename FILENAME. Typically FILENAME is the value returned by base_name or last_component. Act like strlen (FILENAME), except omit all trailing slashes. */ extern size_t base_len (char const *filename) _GL_ATTRIBUTE_PURE; #ifdef __cplusplus } /* extern "C" */ #endif #endif /* _BASENAME_LGPL_H */ pspp-1.4.1/gl/c-strcasestr.c0000644000175000017500000000566413723215636015321 0ustar00blpblp00000000000000/* c-strcasestr.c -- case insensitive substring search in C locale Copyright (C) 2005-2020 Free Software Foundation, Inc. Written by Bruno Haible , 2005. 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 3 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, see . */ #include /* Specification. */ #include "c-strcasestr.h" #include #include #include "c-ctype.h" #include "c-strcase.h" /* Two-Way algorithm. */ #define RETURN_TYPE char * #define AVAILABLE(h, h_l, j, n_l) \ (!memchr ((h) + (h_l), '\0', (j) + (n_l) - (h_l)) \ && ((h_l) = (j) + (n_l))) #define CANON_ELEMENT c_tolower #define CMP_FUNC(p1, p2, l) \ c_strncasecmp ((const char *) (p1), (const char *) (p2), l) #include "str-two-way.h" /* Find the first occurrence of NEEDLE in HAYSTACK, using case-insensitive comparison from the C locale, regardless of the current locale. */ char * c_strcasestr (const char *haystack_start, const char *needle_start) { const char *haystack = haystack_start; const char *needle = needle_start; size_t needle_len; /* Length of NEEDLE. */ size_t haystack_len; /* Known minimum length of HAYSTACK. */ bool ok = true; /* True if NEEDLE is prefix of HAYSTACK. */ /* Determine length of NEEDLE, and in the process, make sure HAYSTACK is at least as long (no point processing all of a long NEEDLE if HAYSTACK is too short). */ while (*haystack && *needle) ok &= (c_tolower ((unsigned char) *haystack++) == c_tolower ((unsigned char) *needle++)); if (*needle) return NULL; if (ok) return (char *) haystack_start; needle_len = needle - needle_start; haystack = haystack_start + 1; haystack_len = needle_len - 1; /* Perform the search. Abstract memory is considered to be an array of 'unsigned char' values, not an array of 'char' values. See ISO C 99 section 6.2.6.1. */ if (needle_len < LONG_NEEDLE_THRESHOLD) return two_way_short_needle ((const unsigned char *) haystack, haystack_len, (const unsigned char *) needle_start, needle_len); return two_way_long_needle ((const unsigned char *) haystack, haystack_len, (const unsigned char *) needle_start, needle_len); } #undef LONG_NEEDLE_THRESHOLD pspp-1.4.1/gl/getpass.h0000644000175000017500000000016513723215637014347 0ustar00blpblp00000000000000/* Obsolete; consider using unistd.h instead. */ /* Get getpass declaration, if available. */ #include pspp-1.4.1/gl/verify.h0000644000175000017500000003063713723215640014206 0ustar00blpblp00000000000000/* Compile-time assert-like macros. Copyright (C) 2005-2006, 2009-2020 Free Software Foundation, Inc. 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 3 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, see . */ /* Written by Paul Eggert, Bruno Haible, and Jim Meyering. */ #ifndef _GL_VERIFY_H #define _GL_VERIFY_H /* Define _GL_HAVE__STATIC_ASSERT to 1 if _Static_assert (R, DIAGNOSTIC) works as per C11. This is supported by GCC 4.6.0 and later, in C mode. Define _GL_HAVE__STATIC_ASSERT1 to 1 if _Static_assert (R) works as per C2X, and define _GL_HAVE_STATIC_ASSERT1 if static_assert (R) works as per C++17. This is supported by GCC 9.1 and later. Support compilers claiming conformance to the relevant standard, and also support GCC when not pedantic. If we were willing to slow 'configure' down we could also use it with other compilers, but since this affects only the quality of diagnostics, why bother? */ #ifndef __cplusplus # if (201112L <= __STDC_VERSION__ \ || (!defined __STRICT_ANSI__ && 4 < __GNUC__ + (6 <= __GNUC_MINOR__))) # define _GL_HAVE__STATIC_ASSERT 1 # endif # if (202000L <= __STDC_VERSION__ \ || (!defined __STRICT_ANSI__ && 9 <= __GNUC__)) # define _GL_HAVE__STATIC_ASSERT1 1 # endif #else # if 201703L <= __cplusplus || 9 <= __GNUC__ # define _GL_HAVE_STATIC_ASSERT1 1 # endif #endif /* FreeBSD 9.1 , included by and lots of other system headers, defines a conflicting _Static_assert that is no better than ours; override it. */ #ifndef _GL_HAVE__STATIC_ASSERT # include # undef _Static_assert #endif /* Each of these macros verifies that its argument R is nonzero. To be portable, R should be an integer constant expression. Unlike assert (R), there is no run-time overhead. If _Static_assert works, verify (R) uses it directly. Similarly, _GL_VERIFY_TRUE works by packaging a _Static_assert inside a struct that is an operand of sizeof. The code below uses several ideas for C++ compilers, and for C compilers that do not support _Static_assert: * The first step is ((R) ? 1 : -1). Given an expression R, of integral or boolean or floating-point type, this yields an expression of integral type, whose value is later verified to be constant and nonnegative. * Next this expression W is wrapped in a type struct _gl_verify_type { unsigned int _gl_verify_error_if_negative: W; }. If W is negative, this yields a compile-time error. No compiler can deal with a bit-field of negative size. One might think that an array size check would have the same effect, that is, that the type struct { unsigned int dummy[W]; } would work as well. However, inside a function, some compilers (such as C++ compilers and GNU C) allow local parameters and variables inside array size expressions. With these compilers, an array size check would not properly diagnose this misuse of the verify macro: void function (int n) { verify (n < 0); } * For the verify macro, the struct _gl_verify_type will need to somehow be embedded into a declaration. To be portable, this declaration must declare an object, a constant, a function, or a typedef name. If the declared entity uses the type directly, such as in struct dummy {...}; typedef struct {...} dummy; extern struct {...} *dummy; extern void dummy (struct {...} *); extern struct {...} *dummy (void); two uses of the verify macro would yield colliding declarations if the entity names are not disambiguated. A workaround is to attach the current line number to the entity name: #define _GL_CONCAT0(x, y) x##y #define _GL_CONCAT(x, y) _GL_CONCAT0 (x, y) extern struct {...} * _GL_CONCAT (dummy, __LINE__); But this has the problem that two invocations of verify from within the same macro would collide, since the __LINE__ value would be the same for both invocations. (The GCC __COUNTER__ macro solves this problem, but is not portable.) A solution is to use the sizeof operator. It yields a number, getting rid of the identity of the type. Declarations like extern int dummy [sizeof (struct {...})]; extern void dummy (int [sizeof (struct {...})]); extern int (*dummy (void)) [sizeof (struct {...})]; can be repeated. * Should the implementation use a named struct or an unnamed struct? Which of the following alternatives can be used? extern int dummy [sizeof (struct {...})]; extern int dummy [sizeof (struct _gl_verify_type {...})]; extern void dummy (int [sizeof (struct {...})]); extern void dummy (int [sizeof (struct _gl_verify_type {...})]); extern int (*dummy (void)) [sizeof (struct {...})]; extern int (*dummy (void)) [sizeof (struct _gl_verify_type {...})]; In the second and sixth case, the struct type is exported to the outer scope; two such declarations therefore collide. GCC warns about the first, third, and fourth cases. So the only remaining possibility is the fifth case: extern int (*dummy (void)) [sizeof (struct {...})]; * GCC warns about duplicate declarations of the dummy function if -Wredundant-decls is used. GCC 4.3 and later have a builtin __COUNTER__ macro that can let us generate unique identifiers for each dummy function, to suppress this warning. * This implementation exploits the fact that older versions of GCC, which do not support _Static_assert, also do not warn about the last declaration mentioned above. * GCC warns if -Wnested-externs is enabled and 'verify' is used within a function body; but inside a function, you can always arrange to use verify_expr instead. * In C++, any struct definition inside sizeof is invalid. Use a template type to work around the problem. */ /* Concatenate two preprocessor tokens. */ #define _GL_CONCAT(x, y) _GL_CONCAT0 (x, y) #define _GL_CONCAT0(x, y) x##y /* _GL_COUNTER is an integer, preferably one that changes each time we use it. Use __COUNTER__ if it works, falling back on __LINE__ otherwise. __LINE__ isn't perfect, but it's better than a constant. */ #if defined __COUNTER__ && __COUNTER__ != __COUNTER__ # define _GL_COUNTER __COUNTER__ #else # define _GL_COUNTER __LINE__ #endif /* Generate a symbol with the given prefix, making it unique if possible. */ #define _GL_GENSYM(prefix) _GL_CONCAT (prefix, _GL_COUNTER) /* Verify requirement R at compile-time, as an integer constant expression that returns 1. If R is false, fail at compile-time, preferably with a diagnostic that includes the string-literal DIAGNOSTIC. */ #define _GL_VERIFY_TRUE(R, DIAGNOSTIC) \ (!!sizeof (_GL_VERIFY_TYPE (R, DIAGNOSTIC))) #ifdef __cplusplus # if !GNULIB_defined_struct__gl_verify_type template struct _gl_verify_type { unsigned int _gl_verify_error_if_negative: w; }; # define GNULIB_defined_struct__gl_verify_type 1 # endif # define _GL_VERIFY_TYPE(R, DIAGNOSTIC) \ _gl_verify_type<(R) ? 1 : -1> #elif defined _GL_HAVE__STATIC_ASSERT # define _GL_VERIFY_TYPE(R, DIAGNOSTIC) \ struct { \ _Static_assert (R, DIAGNOSTIC); \ int _gl_dummy; \ } #else # define _GL_VERIFY_TYPE(R, DIAGNOSTIC) \ struct { unsigned int _gl_verify_error_if_negative: (R) ? 1 : -1; } #endif /* Verify requirement R at compile-time, as a declaration without a trailing ';'. If R is false, fail at compile-time. This macro requires three or more arguments but uses at most the first two, so that the _Static_assert macro optionally defined below supports both the C11 two-argument syntax and the C2X one-argument syntax. Unfortunately, unlike C11, this implementation must appear as an ordinary declaration, and cannot appear inside struct { ... }. */ #if defined _GL_HAVE__STATIC_ASSERT # define _GL_VERIFY(R, DIAGNOSTIC, ...) _Static_assert (R, DIAGNOSTIC) #else # define _GL_VERIFY(R, DIAGNOSTIC, ...) \ extern int (*_GL_GENSYM (_gl_verify_function) (void)) \ [_GL_VERIFY_TRUE (R, DIAGNOSTIC)] #endif /* _GL_STATIC_ASSERT_H is defined if this code is copied into assert.h. */ #ifdef _GL_STATIC_ASSERT_H # if !defined _GL_HAVE__STATIC_ASSERT1 && !defined _Static_assert # define _Static_assert(...) \ _GL_VERIFY (__VA_ARGS__, "static assertion failed", -) # endif # if !defined _GL_HAVE_STATIC_ASSERT1 && !defined static_assert # define static_assert _Static_assert /* C11 requires this #define. */ # endif #endif /* @assert.h omit start@ */ #if defined __has_builtin /* */ # define _GL_HAS_BUILTIN_ASSUME __has_builtin (__builtin_assume) #else # define _GL_HAS_BUILTIN_ASSUME 0 #endif #if 3 < __GNUC__ + (3 < __GNUC_MINOR__ + (4 <= __GNUC_PATCHLEVEL__)) # define _GL_HAS_BUILTIN_TRAP 1 #elif defined __has_builtin # define _GL_HAS_BUILTIN_TRAP __has_builtin (__builtin_trap) #else # define _GL_HAS_BUILTIN_TRAP 0 #endif #if 4 < __GNUC__ + (5 <= __GNUC_MINOR__) # define _GL_HAS_BUILTIN_UNREACHABLE 1 #elif defined __has_builtin # define _GL_HAS_BUILTIN_UNREACHABLE __has_builtin (__builtin_unreachable) #else # define _GL_HAS_BUILTIN_UNREACHABLE 0 #endif /* Each of these macros verifies that its argument R is nonzero. To be portable, R should be an integer constant expression. Unlike assert (R), there is no run-time overhead. There are two macros, since no single macro can be used in all contexts in C. verify_expr (R, E) is for scalar contexts, including integer constant expression contexts. verify (R) is for declaration contexts, e.g., the top level. */ /* Verify requirement R at compile-time. Return the value of the expression E. */ #define verify_expr(R, E) \ (_GL_VERIFY_TRUE (R, "verify_expr (" #R ", " #E ")") ? (E) : (E)) /* Verify requirement R at compile-time, as a declaration without a trailing ';'. verify (R) acts like static_assert (R) except that it is portable to C11/C++14 and earlier, it can issue better diagnostics, and its name is shorter and may be more convenient. */ #ifdef __PGI /* PGI barfs if R is long. */ # define verify(R) _GL_VERIFY (R, "verify (...)", -) #else # define verify(R) _GL_VERIFY (R, "verify (" #R ")", -) #endif /* Assume that R always holds. Behavior is undefined if R is false, fails to evaluate, or has side effects. 'assume (R)' is a directive from the programmer telling the compiler that R is true so the compiler needn't generate code to test R. This is why 'assume' is in verify.h: it's related to static checking (in this case, static checking done by the programmer), not dynamic checking. 'assume (R)' can affect compilation of all the code, not just code that happens to be executed after the assume (R) is "executed". For example, if the code mistakenly does 'assert (R); assume (R);' the compiler is entitled to optimize away the 'assert (R)'. Although assuming R can help a compiler generate better code or diagnostics, performance can suffer if R uses hard-to-optimize features such as function calls not inlined by the compiler. */ #if _GL_HAS_BUILTIN_ASSUME # define assume(R) __builtin_assume (R) #elif _GL_HAS_BUILTIN_UNREACHABLE # define assume(R) ((R) ? (void) 0 : __builtin_unreachable ()) #elif 1200 <= _MSC_VER # define assume(R) __assume (R) #elif (defined GCC_LINT || defined lint) && _GL_HAS_BUILTIN_TRAP /* Doing it this way helps various packages when configured with --enable-gcc-warnings, which compiles with -Dlint. It's nicer when 'assume' silences warnings even with older GCCs. */ # define assume(R) ((R) ? (void) 0 : __builtin_trap ()) #else /* Some tools grok NOTREACHED, e.g., Oracle Studio 12.6. */ # define assume(R) ((R) ? (void) 0 : /*NOTREACHED*/ (void) 0) #endif /* @assert.h omit end@ */ #endif pspp-1.4.1/gl/memchr.c0000644000175000017500000001334713723215637014155 0ustar00blpblp00000000000000/* Copyright (C) 1991, 1993, 1996-1997, 1999-2000, 2003-2004, 2006, 2008-2020 Free Software Foundation, Inc. Based on strlen implementation by Torbjorn Granlund (tege@sics.se), with help from Dan Sahlin (dan@sics.se) and commentary by Jim Blandy (jimb@ai.mit.edu); adaptation to memchr suggested by Dick Karpinski (dick@cca.ucsf.edu), and implemented by Roland McGrath (roland@ai.mit.edu). NOTE: The canonical source of this file is maintained with the GNU C Library. Bugs can be reported to bug-glibc@prep.ai.mit.edu. 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 3 of the License, or 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, see . */ #ifndef _LIBC # include #endif #include #include #if defined _LIBC # include #else # define reg_char char #endif #include #if HAVE_BP_SYM_H || defined _LIBC # include #else # define BP_SYM(sym) sym #endif #undef __memchr #ifdef _LIBC # undef memchr #endif #ifndef weak_alias # define __memchr memchr #endif /* Search no more than N bytes of S for C. */ void * __memchr (void const *s, int c_in, size_t n) { /* On 32-bit hardware, choosing longword to be a 32-bit unsigned long instead of a 64-bit uintmax_t tends to give better performance. On 64-bit hardware, unsigned long is generally 64 bits already. Change this typedef to experiment with performance. */ typedef unsigned long int longword; const unsigned char *char_ptr; const longword *longword_ptr; longword repeated_one; longword repeated_c; unsigned reg_char c; c = (unsigned char) c_in; /* Handle the first few bytes by reading one byte at a time. Do this until CHAR_PTR is aligned on a longword boundary. */ for (char_ptr = (const unsigned char *) s; n > 0 && (size_t) char_ptr % sizeof (longword) != 0; --n, ++char_ptr) if (*char_ptr == c) return (void *) char_ptr; longword_ptr = (const longword *) char_ptr; /* All these elucidatory comments refer to 4-byte longwords, but the theory applies equally well to any size longwords. */ /* Compute auxiliary longword values: repeated_one is a value which has a 1 in every byte. repeated_c has c in every byte. */ repeated_one = 0x01010101; repeated_c = c | (c << 8); repeated_c |= repeated_c << 16; if (0xffffffffU < (longword) -1) { repeated_one |= repeated_one << 31 << 1; repeated_c |= repeated_c << 31 << 1; if (8 < sizeof (longword)) { size_t i; for (i = 64; i < sizeof (longword) * 8; i *= 2) { repeated_one |= repeated_one << i; repeated_c |= repeated_c << i; } } } /* Instead of the traditional loop which tests each byte, we will test a longword at a time. The tricky part is testing if *any of the four* bytes in the longword in question are equal to c. We first use an xor with repeated_c. This reduces the task to testing whether *any of the four* bytes in longword1 is zero. We compute tmp = ((longword1 - repeated_one) & ~longword1) & (repeated_one << 7). That is, we perform the following operations: 1. Subtract repeated_one. 2. & ~longword1. 3. & a mask consisting of 0x80 in every byte. Consider what happens in each byte: - If a byte of longword1 is zero, step 1 and 2 transform it into 0xff, and step 3 transforms it into 0x80. A carry can also be propagated to more significant bytes. - If a byte of longword1 is nonzero, let its lowest 1 bit be at position k (0 <= k <= 7); so the lowest k bits are 0. After step 1, the byte ends in a single bit of value 0 and k bits of value 1. After step 2, the result is just k bits of value 1: 2^k - 1. After step 3, the result is 0. And no carry is produced. So, if longword1 has only non-zero bytes, tmp is zero. Whereas if longword1 has a zero byte, call j the position of the least significant zero byte. Then the result has a zero at positions 0, ..., j-1 and a 0x80 at position j. We cannot predict the result at the more significant bytes (positions j+1..3), but it does not matter since we already have a non-zero bit at position 8*j+7. So, the test whether any byte in longword1 is zero is equivalent to testing whether tmp is nonzero. */ while (n >= sizeof (longword)) { longword longword1 = *longword_ptr ^ repeated_c; if ((((longword1 - repeated_one) & ~longword1) & (repeated_one << 7)) != 0) break; longword_ptr++; n -= sizeof (longword); } char_ptr = (const unsigned char *) longword_ptr; /* At this point, we know that either n < sizeof (longword), or one of the sizeof (longword) bytes starting at char_ptr is == c. On little-endian machines, we could determine the first such byte without any further memory accesses, just by looking at the tmp result from the last loop iteration. But this does not work on big-endian machines. Choose code that works in both cases. */ for (; n > 0; --n, ++char_ptr) { if (*char_ptr == c) return (void *) char_ptr; } return NULL; } #ifdef weak_alias weak_alias (__memchr, BP_SYM (memchr)) #endif pspp-1.4.1/gl/isnanl-nolibm.h0000644000175000017500000000246113723215637015444 0ustar00blpblp00000000000000/* Test for NaN that does not need libm. Copyright (C) 2007-2020 Free Software Foundation, Inc. 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 3 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, see . */ #if HAVE_ISNANL_IN_LIBC /* Get declaration of isnan macro or (older) isnanl function. */ # include # if (__GNUC__ >= 4) || (__clang_major__ >= 4) /* GCC >= 4.0 and clang provide a type-generic built-in for isnan. GCC >= 4.0 also provides __builtin_isnanl, but clang doesn't. */ # undef isnanl # define isnanl(x) __builtin_isnan ((long double)(x)) # elif defined isnan # undef isnanl # define isnanl(x) isnan ((long double)(x)) # endif #else /* Test whether X is a NaN. */ # undef isnanl # define isnanl rpl_isnanl extern int isnanl (long double x); #endif pspp-1.4.1/gl/c-strcasestr.h0000644000175000017500000000207113723215636015313 0ustar00blpblp00000000000000/* Case-insensitive searching in a string in C locale. Copyright (C) 2005, 2009-2020 Free Software Foundation, Inc. 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 3 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, see . */ #ifndef C_STRCASESTR_H #define C_STRCASESTR_H #ifdef __cplusplus extern "C" { #endif /* Find the first occurrence of NEEDLE in HAYSTACK, using case-insensitive comparison. */ extern char *c_strcasestr (const char *haystack, const char *needle); #ifdef __cplusplus } #endif #endif /* C_STRCASESTR_H */ pspp-1.4.1/gl/byteswap.in.h0000644000175000017500000000372413723215636015147 0ustar00blpblp00000000000000/* byteswap.h - Byte swapping Copyright (C) 2005, 2007, 2009-2020 Free Software Foundation, Inc. Written by Oskar Liljeblad , 2005. 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 3 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, see . */ #ifndef _GL_BYTESWAP_H #define _GL_BYTESWAP_H /* Given an unsigned 16-bit argument X, return the value corresponding to X with reversed byte order. */ #define bswap_16(x) ((((x) & 0x00FF) << 8) | \ (((x) & 0xFF00) >> 8)) /* Given an unsigned 32-bit argument X, return the value corresponding to X with reversed byte order. */ #define bswap_32(x) ((((x) & 0x000000FF) << 24) | \ (((x) & 0x0000FF00) << 8) | \ (((x) & 0x00FF0000) >> 8) | \ (((x) & 0xFF000000) >> 24)) /* Given an unsigned 64-bit argument X, return the value corresponding to X with reversed byte order. */ #define bswap_64(x) ((((x) & 0x00000000000000FFULL) << 56) | \ (((x) & 0x000000000000FF00ULL) << 40) | \ (((x) & 0x0000000000FF0000ULL) << 24) | \ (((x) & 0x00000000FF000000ULL) << 8) | \ (((x) & 0x000000FF00000000ULL) >> 8) | \ (((x) & 0x0000FF0000000000ULL) >> 24) | \ (((x) & 0x00FF000000000000ULL) >> 40) | \ (((x) & 0xFF00000000000000ULL) >> 56)) #endif /* _GL_BYTESWAP_H */ pspp-1.4.1/gl/asyncsafe-spin.h0000644000175000017500000000503013723215636015617 0ustar00blpblp00000000000000/* Spin locks for communication between threads and signal handlers. Copyright (C) 2020 Free Software Foundation, Inc. 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 3, 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, see . */ /* Written by Bruno Haible , 2020. */ #ifndef _ASYNCSAFE_SPIN_H #define _ASYNCSAFE_SPIN_H /* Usual spin locks are not allowed for communication between threads and signal handlers, because the pthread_spin_* functions are not async-safe; see section 2.4.3 Signal Actions. This module provides spin locks with a similar API. It can be used like this, both in regular multithreaded code and in signal handlers: sigset_t saved_mask; asyncsafe_spin_lock (&lock, &mask, &saved_mask); do_something_contentious (); asyncsafe_spin_unlock (&lock, &saved_mask); The mask you specify here is the set of signals whose handlers might want to take the same lock. asyncsafe_spin_lock/unlock use pthread_sigmask, to ensure that while a thread is executing such code, no signal handler will start such code for the same lock *in the same thread* (because if this happened, the signal handler would hang!). */ #include #if defined _WIN32 && ! defined __CYGWIN__ # include "windows-spin.h" typedef glwthread_spinlock_t asyncsafe_spinlock_t; # define ASYNCSAFE_SPIN_INIT GLWTHREAD_SPIN_INIT #else typedef unsigned int asyncsafe_spinlock_t; # define ASYNCSAFE_SPIN_INIT 0 #endif #ifdef __cplusplus extern "C" { #endif extern void asyncsafe_spin_init (asyncsafe_spinlock_t *lock); extern void asyncsafe_spin_lock (asyncsafe_spinlock_t *lock, const sigset_t *mask, sigset_t *saved_mask); extern void asyncsafe_spin_unlock (asyncsafe_spinlock_t *lock, const sigset_t *saved_mask); extern void asyncsafe_spin_destroy (asyncsafe_spinlock_t *lock); #ifdef __cplusplus } #endif #endif /* _ASYNCSAFE_SPIN_H */ pspp-1.4.1/gl/stdalign.in.h0000644000175000017500000001114313723215640015103 0ustar00blpblp00000000000000/* A substitute for ISO C11 . Copyright 2011-2020 Free Software Foundation, Inc. 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 3, 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, see . */ /* Written by Paul Eggert and Bruno Haible. */ #ifndef _GL_STDALIGN_H #define _GL_STDALIGN_H /* ISO C11 for platforms that lack it. References: ISO C11 (latest free draft ) sections 6.5.3.4, 6.7.5, 7.15. C++11 (latest free draft ) section 18.10. */ /* alignof (TYPE), also known as _Alignof (TYPE), yields the alignment requirement of a structure member (i.e., slot or field) that is of type TYPE, as an integer constant expression. This differs from GCC's __alignof__ operator, which can yield a better-performing alignment for an object of that type. For example, on x86 with GCC, __alignof__ (double) and __alignof__ (long long) are 8, whereas alignof (double) and alignof (long long) are 4 unless the option '-malign-double' is used. The result cannot be used as a value for an 'enum' constant, if you want to be portable to HP-UX 10.20 cc and AIX 3.2.5 xlc. Include for offsetof. */ #include /* FreeBSD 9.1 , included by and lots of other standard headers, defines conflicting implementations of _Alignas and _Alignof that are no better than ours; override them. */ #undef _Alignas #undef _Alignof /* GCC releases before GCC 4.9 had a bug in _Alignof. See GCC bug 52023 . */ #if (!defined __STDC_VERSION__ || __STDC_VERSION__ < 201112 \ || (defined __GNUC__ && __GNUC__ < 4 + (__GNUC_MINOR__ < 9))) # ifdef __cplusplus # if 201103 <= __cplusplus # define _Alignof(type) alignof (type) # else template struct __alignof_helper { char __a; __t __b; }; # define _Alignof(type) offsetof (__alignof_helper, __b) # endif # else # define _Alignof(type) offsetof (struct { char __a; type __b; }, __b) # endif #endif #if ! (defined __cplusplus && 201103 <= __cplusplus) # define alignof _Alignof #endif #define __alignof_is_defined 1 /* alignas (A), also known as _Alignas (A), aligns a variable or type to the alignment A, where A is an integer constant expression. For example: int alignas (8) foo; struct s { int a; int alignas (8) bar; }; aligns the address of FOO and the offset of BAR to be multiples of 8. A should be a power of two that is at least the type's alignment and at most the implementation's alignment limit. This limit is 2**28 on typical GNUish hosts, and 2**13 on MSVC. To be portable to MSVC through at least version 10.0, A should be an integer constant, as MSVC does not support expressions such as 1 << 3. To be portable to Sun C 5.11, do not align auto variables to anything stricter than their default alignment. The following C11 requirements are not supported here: - If A is zero, alignas has no effect. - alignas can be used multiple times; the strictest one wins. - alignas (TYPE) is equivalent to alignas (alignof (TYPE)). */ #if !defined __STDC_VERSION__ || __STDC_VERSION__ < 201112 # if defined __cplusplus && 201103 <= __cplusplus # define _Alignas(a) alignas (a) # elif ((defined __APPLE__ && defined __MACH__ \ ? 4 < __GNUC__ + (1 <= __GNUC_MINOR__) \ : __GNUC__ && !defined __ibmxl__) \ || (__ia64 && (61200 <= __HP_cc || 61200 <= __HP_aCC)) \ || __ICC || 0x590 <= __SUNPRO_C || 0x0600 <= __xlC__) # define _Alignas(a) __attribute__ ((__aligned__ (a))) # elif 1300 <= _MSC_VER # define _Alignas(a) __declspec (align (a)) # endif #endif #if ((defined _Alignas && ! (defined __cplusplus && 201103 <= __cplusplus)) \ || (defined __STDC_VERSION__ && 201112 <= __STDC_VERSION__)) # define alignas _Alignas #endif #if defined alignas || (defined __cplusplus && 201103 <= __cplusplus) # define __alignas_is_defined 1 #endif #endif /* _GL_STDALIGN_H */ pspp-1.4.1/gl/cloexec.c0000644000175000017500000000442713723215636014322 0ustar00blpblp00000000000000/* cloexec.c - set or clear the close-on-exec descriptor flag Copyright (C) 1991, 2004-2006, 2009-2020 Free Software Foundation, Inc. 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 3 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, see . The code is taken from glibc/manual/llio.texi */ #include #include "cloexec.h" #include #include #include /* Set the 'FD_CLOEXEC' flag of DESC if VALUE is true, or clear the flag if VALUE is false. Return 0 on success, or -1 on error with 'errno' set. Note that on MingW, this function does NOT protect DESC from being inherited into spawned children. Instead, either use dup_cloexec followed by closing the original DESC, or use interfaces such as open or pipe2 that accept flags like O_CLOEXEC to create DESC non-inheritable in the first place. */ int set_cloexec_flag (int desc, bool value) { #ifdef F_SETFD int flags = fcntl (desc, F_GETFD, 0); if (0 <= flags) { int newflags = (value ? flags | FD_CLOEXEC : flags & ~FD_CLOEXEC); if (flags == newflags || fcntl (desc, F_SETFD, newflags) != -1) return 0; } return -1; #else /* !F_SETFD */ /* Use dup2 to reject invalid file descriptors; the cloexec flag will be unaffected. */ if (desc < 0) { errno = EBADF; return -1; } if (dup2 (desc, desc) < 0) /* errno is EBADF here. */ return -1; /* There is nothing we can do on this kind of platform. Punt. */ return 0; #endif /* !F_SETFD */ } /* Duplicates a file handle FD, while marking the copy to be closed prior to exec or spawn. Returns -1 and sets errno if FD could not be duplicated. */ int dup_cloexec (int fd) { return fcntl (fd, F_DUPFD_CLOEXEC, 0); } pspp-1.4.1/gl/mkdtemp.c0000644000175000017500000000245513723215637014341 0ustar00blpblp00000000000000/* Copyright (C) 1999, 2001-2003, 2006-2007, 2009-2020 Free Software Foundation, Inc. This file is part of the GNU C Library. 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 3 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, see . */ /* Extracted from misc/mkdtemp.c. */ #include /* Specification. */ #include #include "tempname.h" /* Generate a unique temporary directory from XTEMPLATE. The last six characters of XTEMPLATE must be "XXXXXX"; they are replaced with a string that makes the filename unique. The directory is created, mode 700, and its name is returned. (This function comes from OpenBSD.) */ char * mkdtemp (char *xtemplate) { if (gen_tempname (xtemplate, 0, 0, GT_DIR)) return NULL; else return xtemplate; } pspp-1.4.1/gl/btowc.c0000644000175000017500000000211013723215636014001 0ustar00blpblp00000000000000/* Convert unibyte character to wide character. Copyright (C) 2008, 2010-2020 Free Software Foundation, Inc. Written by Bruno Haible , 2008. 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 3 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, see . */ #include /* Specification. */ #include #include #include wint_t btowc (int c) { if (c != EOF) { char buf[1]; wchar_t wc; buf[0] = c; if (mbtowc (&wc, buf, 1) >= 0) return wc; } return WEOF; } pspp-1.4.1/gl/msvc-inval.h0000644000175000017500000002116513723215637014763 0ustar00blpblp00000000000000/* Invalid parameter handler for MSVC runtime libraries. Copyright (C) 2011-2020 Free Software Foundation, Inc. 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 3, 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, see . */ #ifndef _MSVC_INVAL_H #define _MSVC_INVAL_H /* With MSVC runtime libraries with the "invalid parameter handler" concept, functions like fprintf(), dup2(), or close() crash when the caller passes an invalid argument. But POSIX wants error codes (such as EINVAL or EBADF) instead. This file defines macros that turn such an invalid parameter notification into a non-local exit. An error code can then be produced at the target of this exit. You can thus write code like TRY_MSVC_INVAL { } CATCH_MSVC_INVAL { } DONE_MSVC_INVAL; This entire block expands to a single statement. The handling of invalid parameters can be done in three ways: * The default way, which is reasonable for programs (not libraries): AC_DEFINE([MSVC_INVALID_PARAMETER_HANDLING], [DEFAULT_HANDLING]) * The way for libraries that make "hairy" calls (like close(-1), or fclose(fp) where fileno(fp) is closed, or simply getdtablesize()): AC_DEFINE([MSVC_INVALID_PARAMETER_HANDLING], [HAIRY_LIBRARY_HANDLING]) * The way for libraries that make no "hairy" calls: AC_DEFINE([MSVC_INVALID_PARAMETER_HANDLING], [SANE_LIBRARY_HANDLING]) */ #define DEFAULT_HANDLING 0 #define HAIRY_LIBRARY_HANDLING 1 #define SANE_LIBRARY_HANDLING 2 #if HAVE_MSVC_INVALID_PARAMETER_HANDLER \ && !(MSVC_INVALID_PARAMETER_HANDLING == SANE_LIBRARY_HANDLING) /* A native Windows platform with the "invalid parameter handler" concept, and either DEFAULT_HANDLING or HAIRY_LIBRARY_HANDLING. */ # if MSVC_INVALID_PARAMETER_HANDLING == DEFAULT_HANDLING /* Default handling. */ # ifdef __cplusplus extern "C" { # endif /* Ensure that the invalid parameter handler in installed that just returns. Because we assume no other part of the program installs a different invalid parameter handler, this solution is multithread-safe. */ extern void gl_msvc_inval_ensure_handler (void); # ifdef __cplusplus } # endif # define TRY_MSVC_INVAL \ do \ { \ gl_msvc_inval_ensure_handler (); \ if (1) # define CATCH_MSVC_INVAL \ else # define DONE_MSVC_INVAL \ } \ while (0) # else /* Handling for hairy libraries. */ # include /* Gnulib can define its own status codes, as described in the page "Raising Software Exceptions" on microsoft.com . Our status codes are composed of - 0xE0000000, mandatory for all user-defined status codes, - 0x474E550, a API identifier ("GNU"), - 0, 1, 2, ..., used to distinguish different status codes from the same API. */ # define STATUS_GNULIB_INVALID_PARAMETER (0xE0000000 + 0x474E550 + 0) # if defined _MSC_VER /* A compiler that supports __try/__except, as described in the page "try-except statement" on microsoft.com . With __try/__except, we can use the multithread-safe exception handling. */ # ifdef __cplusplus extern "C" { # endif /* Ensure that the invalid parameter handler in installed that raises a software exception with code STATUS_GNULIB_INVALID_PARAMETER. Because we assume no other part of the program installs a different invalid parameter handler, this solution is multithread-safe. */ extern void gl_msvc_inval_ensure_handler (void); # ifdef __cplusplus } # endif # define TRY_MSVC_INVAL \ do \ { \ gl_msvc_inval_ensure_handler (); \ __try # define CATCH_MSVC_INVAL \ __except (GetExceptionCode () == STATUS_GNULIB_INVALID_PARAMETER \ ? EXCEPTION_EXECUTE_HANDLER \ : EXCEPTION_CONTINUE_SEARCH) # define DONE_MSVC_INVAL \ } \ while (0) # else /* Any compiler. We can only use setjmp/longjmp. */ # include # ifdef __cplusplus extern "C" { # endif struct gl_msvc_inval_per_thread { /* The restart that will resume execution at the code between CATCH_MSVC_INVAL and DONE_MSVC_INVAL. It is enabled only between TRY_MSVC_INVAL and CATCH_MSVC_INVAL. */ jmp_buf restart; /* Tells whether the contents of restart is valid. */ int restart_valid; }; /* Ensure that the invalid parameter handler in installed that passes control to the gl_msvc_inval_restart if it is valid, or raises a software exception with code STATUS_GNULIB_INVALID_PARAMETER otherwise. Because we assume no other part of the program installs a different invalid parameter handler, this solution is multithread-safe. */ extern void gl_msvc_inval_ensure_handler (void); /* Return a pointer to the per-thread data for the current thread. */ extern struct gl_msvc_inval_per_thread *gl_msvc_inval_current (void); # ifdef __cplusplus } # endif # define TRY_MSVC_INVAL \ do \ { \ struct gl_msvc_inval_per_thread *msvc_inval_current; \ gl_msvc_inval_ensure_handler (); \ msvc_inval_current = gl_msvc_inval_current (); \ /* First, initialize gl_msvc_inval_restart. */ \ if (setjmp (msvc_inval_current->restart) == 0) \ { \ /* Then, mark it as valid. */ \ msvc_inval_current->restart_valid = 1; # define CATCH_MSVC_INVAL \ /* Execution completed. \ Mark gl_msvc_inval_restart as invalid. */ \ msvc_inval_current->restart_valid = 0; \ } \ else \ { \ /* Execution triggered an invalid parameter notification. \ Mark gl_msvc_inval_restart as invalid. */ \ msvc_inval_current->restart_valid = 0; # define DONE_MSVC_INVAL \ } \ } \ while (0) # endif # endif #else /* A platform that does not need to the invalid parameter handler, or when SANE_LIBRARY_HANDLING is desired. */ /* The braces here avoid GCC warnings like "warning: suggest explicit braces to avoid ambiguous 'else'". */ # define TRY_MSVC_INVAL \ do \ { \ if (1) # define CATCH_MSVC_INVAL \ else # define DONE_MSVC_INVAL \ } \ while (0) #endif #endif /* _MSVC_INVAL_H */ pspp-1.4.1/gl/hard-locale.h0000644000175000017500000000213213723215637015050 0ustar00blpblp00000000000000/* Determine whether a locale is hard. Copyright (C) 1999, 2003-2004, 2009-2020 Free Software Foundation, Inc. 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 3 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, see . */ #ifndef HARD_LOCALE_H_ # define HARD_LOCALE_H_ 1 # include /* Return true if the specified CATEGORY of the current locale is hard, i.e. different from the C or POSIX locale that has a fixed behavior. CATEGORY must be one of the LC_* values, but not LC_ALL. */ extern bool hard_locale (int category); #endif /* HARD_LOCALE_H_ */ pspp-1.4.1/gl/getopt.c0000644000175000017500000005706213723215637014206 0ustar00blpblp00000000000000/* Getopt for GNU. Copyright (C) 1987-2020 Free Software Foundation, Inc. This file is part of the GNU C Library and is also part of gnulib. Patches to this file should be submitted to both projects. The GNU C Library 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 3 of the License, or (at your option) any later version. The GNU C Library 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 the GNU C Library; if not, see . */ #ifndef _LIBC # include #endif #include "getopt.h" #include #include #include #include #ifdef _LIBC /* When used as part of glibc, error printing must be done differently for standards compliance. getopt is not a cancellation point, so it must not call functions that are, and it is specified by an older standard than stdio locking, so it must not refer to functions in the "user namespace" related to stdio locking. Finally, it must use glibc's internal message translation so that the messages are looked up in the proper text domain. */ # include # define fprintf __fxprintf_nocancel # define flockfile(fp) _IO_flockfile (fp) # define funlockfile(fp) _IO_funlockfile (fp) #else # include "gettext.h" # define _(msgid) gettext (msgid) /* When used standalone, flockfile and funlockfile might not be available. */ # if (!defined _POSIX_THREAD_SAFE_FUNCTIONS \ || (defined _WIN32 && ! defined __CYGWIN__)) # define flockfile(fp) /* nop */ # define funlockfile(fp) /* nop */ # endif /* When used standalone, do not attempt to use alloca. */ # define __libc_use_alloca(size) 0 # undef alloca # define alloca(size) (abort (), (void *)0) #endif /* This implementation of 'getopt' has three modes for handling options interspersed with non-option arguments. It can stop scanning for options at the first non-option argument encountered, as POSIX specifies. It can continue scanning for options after the first non-option argument, but permute 'argv' as it goes so that, after 'getopt' is done, all the options precede all the non-option arguments and 'optind' points to the first non-option argument. Or, it can report non-option arguments as if they were arguments to the option character '\x01'. The default behavior of 'getopt_long' is to permute the argument list. When this implementation is used standalone, the default behavior of 'getopt' is to stop at the first non-option argument, but when it is used as part of GNU libc it also permutes the argument list. In both cases, setting the environment variable POSIXLY_CORRECT to any value disables permutation. If the first character of the OPTSTRING argument to 'getopt' or 'getopt_long' is '+', both functions will stop at the first non-option argument. If it is '-', both functions will report non-option arguments as arguments to the option character '\x01'. */ #include "getopt_int.h" /* For communication from 'getopt' to the caller. When 'getopt' finds an option that takes an argument, the argument value is returned here. Also, when 'ordering' is RETURN_IN_ORDER, each non-option ARGV-element is returned here. */ char *optarg; /* Index in ARGV of the next element to be scanned. This is used for communication to and from the caller and for communication between successive calls to 'getopt'. On entry to 'getopt', zero means this is the first call; initialize. When 'getopt' returns -1, this is the index of the first of the non-option elements that the caller should itself scan. Otherwise, 'optind' communicates from one call to the next how much of ARGV has been scanned so far. */ /* 1003.2 says this must be 1 before any call. */ int optind = 1; /* Callers store zero here to inhibit the error message for unrecognized options. */ int opterr = 1; /* Set to an option character which was unrecognized. This must be initialized on some systems to avoid linking in the system's own getopt implementation. */ int optopt = '?'; /* Keep a global copy of all internal members of getopt_data. */ static struct _getopt_data getopt_data; /* Exchange two adjacent subsequences of ARGV. One subsequence is elements [first_nonopt,last_nonopt) which contains all the non-options that have been skipped so far. The other is elements [last_nonopt,optind), which contains all the options processed since those non-options were skipped. 'first_nonopt' and 'last_nonopt' are relocated so that they describe the new indices of the non-options in ARGV after they are moved. */ static void exchange (char **argv, struct _getopt_data *d) { int bottom = d->__first_nonopt; int middle = d->__last_nonopt; int top = d->optind; char *tem; /* Exchange the shorter segment with the far end of the longer segment. That puts the shorter segment into the right place. It leaves the longer segment in the right place overall, but it consists of two parts that need to be swapped next. */ while (top > middle && middle > bottom) { if (top - middle > middle - bottom) { /* Bottom segment is the short one. */ int len = middle - bottom; int i; /* Swap it with the top part of the top segment. */ for (i = 0; i < len; i++) { tem = argv[bottom + i]; argv[bottom + i] = argv[top - (middle - bottom) + i]; argv[top - (middle - bottom) + i] = tem; } /* Exclude the moved bottom segment from further swapping. */ top -= len; } else { /* Top segment is the short one. */ int len = top - middle; int i; /* Swap it with the bottom part of the bottom segment. */ for (i = 0; i < len; i++) { tem = argv[bottom + i]; argv[bottom + i] = argv[middle + i]; argv[middle + i] = tem; } /* Exclude the moved top segment from further swapping. */ bottom += len; } } /* Update records for the slots the non-options now occupy. */ d->__first_nonopt += (d->optind - d->__last_nonopt); d->__last_nonopt = d->optind; } /* Process the argument starting with d->__nextchar as a long option. d->optind should *not* have been advanced over this argument. If the value returned is -1, it was not actually a long option, the state is unchanged, and the argument should be processed as a set of short options (this can only happen when long_only is true). Otherwise, the option (and its argument, if any) have been consumed and the return value is the value to return from _getopt_internal_r. */ static int process_long_option (int argc, char **argv, const char *optstring, const struct option *longopts, int *longind, int long_only, struct _getopt_data *d, int print_errors, const char *prefix) { char *nameend; size_t namelen; const struct option *p; const struct option *pfound = NULL; int n_options; int option_index; for (nameend = d->__nextchar; *nameend && *nameend != '='; nameend++) /* Do nothing. */ ; namelen = nameend - d->__nextchar; /* First look for an exact match, counting the options as a side effect. */ for (p = longopts, n_options = 0; p->name; p++, n_options++) if (!strncmp (p->name, d->__nextchar, namelen) && namelen == strlen (p->name)) { /* Exact match found. */ pfound = p; option_index = n_options; break; } if (pfound == NULL) { /* Didn't find an exact match, so look for abbreviations. */ unsigned char *ambig_set = NULL; int ambig_malloced = 0; int ambig_fallback = 0; int indfound = -1; for (p = longopts, option_index = 0; p->name; p++, option_index++) if (!strncmp (p->name, d->__nextchar, namelen)) { if (pfound == NULL) { /* First nonexact match found. */ pfound = p; indfound = option_index; } else if (long_only || pfound->has_arg != p->has_arg || pfound->flag != p->flag || pfound->val != p->val) { /* Second or later nonexact match found. */ if (!ambig_fallback) { if (!print_errors) /* Don't waste effort tracking the ambig set if we're not going to print it anyway. */ ambig_fallback = 1; else if (!ambig_set) { if (__libc_use_alloca (n_options)) ambig_set = alloca (n_options); else if ((ambig_set = malloc (n_options)) == NULL) /* Fall back to simpler error message. */ ambig_fallback = 1; else ambig_malloced = 1; if (ambig_set) { memset (ambig_set, 0, n_options); ambig_set[indfound] = 1; } } if (ambig_set) ambig_set[option_index] = 1; } } } if (ambig_set || ambig_fallback) { if (print_errors) { if (ambig_fallback) fprintf (stderr, _("%s: option '%s%s' is ambiguous\n"), argv[0], prefix, d->__nextchar); else { flockfile (stderr); fprintf (stderr, _("%s: option '%s%s' is ambiguous; possibilities:"), argv[0], prefix, d->__nextchar); for (option_index = 0; option_index < n_options; option_index++) if (ambig_set[option_index]) fprintf (stderr, " '%s%s'", prefix, longopts[option_index].name); /* This must use 'fprintf' even though it's only printing a single character, so that it goes through __fxprintf_nocancel when compiled as part of glibc. */ fprintf (stderr, "\n"); funlockfile (stderr); } } if (ambig_malloced) free (ambig_set); d->__nextchar += strlen (d->__nextchar); d->optind++; d->optopt = 0; return '?'; } option_index = indfound; } if (pfound == NULL) { /* Can't find it as a long option. If this is not getopt_long_only, or the option starts with '--' or is not a valid short option, then it's an error. */ if (!long_only || argv[d->optind][1] == '-' || strchr (optstring, *d->__nextchar) == NULL) { if (print_errors) fprintf (stderr, _("%s: unrecognized option '%s%s'\n"), argv[0], prefix, d->__nextchar); d->__nextchar = NULL; d->optind++; d->optopt = 0; return '?'; } /* Otherwise interpret it as a short option. */ return -1; } /* We have found a matching long option. Consume it. */ d->optind++; d->__nextchar = NULL; if (*nameend) { /* Don't test has_arg with >, because some C compilers don't allow it to be used on enums. */ if (pfound->has_arg) d->optarg = nameend + 1; else { if (print_errors) fprintf (stderr, _("%s: option '%s%s' doesn't allow an argument\n"), argv[0], prefix, pfound->name); d->optopt = pfound->val; return '?'; } } else if (pfound->has_arg == 1) { if (d->optind < argc) d->optarg = argv[d->optind++]; else { if (print_errors) fprintf (stderr, _("%s: option '%s%s' requires an argument\n"), argv[0], prefix, pfound->name); d->optopt = pfound->val; return optstring[0] == ':' ? ':' : '?'; } } if (longind != NULL) *longind = option_index; if (pfound->flag) { *(pfound->flag) = pfound->val; return 0; } return pfound->val; } /* Initialize internal data upon the first call to getopt. */ static const char * _getopt_initialize (int argc _GL_UNUSED, char **argv _GL_UNUSED, const char *optstring, struct _getopt_data *d, int posixly_correct) { /* Start processing options with ARGV-element 1 (since ARGV-element 0 is the program name); the sequence of previously skipped non-option ARGV-elements is empty. */ if (d->optind == 0) d->optind = 1; d->__first_nonopt = d->__last_nonopt = d->optind; d->__nextchar = NULL; /* Determine how to handle the ordering of options and nonoptions. */ if (optstring[0] == '-') { d->__ordering = RETURN_IN_ORDER; ++optstring; } else if (optstring[0] == '+') { d->__ordering = REQUIRE_ORDER; ++optstring; } else if (posixly_correct || !!getenv ("POSIXLY_CORRECT")) d->__ordering = REQUIRE_ORDER; else d->__ordering = PERMUTE; d->__initialized = 1; return optstring; } /* Scan elements of ARGV (whose length is ARGC) for option characters given in OPTSTRING. If an element of ARGV starts with '-', and is not exactly "-" or "--", then it is an option element. The characters of this element (aside from the initial '-') are option characters. If 'getopt' is called repeatedly, it returns successively each of the option characters from each of the option elements. If 'getopt' finds another option character, it returns that character, updating 'optind' and 'nextchar' so that the next call to 'getopt' can resume the scan with the following option character or ARGV-element. If there are no more option characters, 'getopt' returns -1. Then 'optind' is the index in ARGV of the first ARGV-element that is not an option. (The ARGV-elements have been permuted so that those that are not options now come last.) OPTSTRING is a string containing the legitimate option characters. If an option character is seen that is not listed in OPTSTRING, return '?' after printing an error message. If you set 'opterr' to zero, the error message is suppressed but we still return '?'. If a char in OPTSTRING is followed by a colon, that means it wants an arg, so the following text in the same ARGV-element, or the text of the following ARGV-element, is returned in 'optarg'. Two colons mean an option that wants an optional arg; if there is text in the current ARGV-element, it is returned in 'optarg', otherwise 'optarg' is set to zero. If OPTSTRING starts with '-' or '+', it requests different methods of handling the non-option ARGV-elements. See the comments about RETURN_IN_ORDER and REQUIRE_ORDER, above. Long-named options begin with '--' instead of '-'. Their names may be abbreviated as long as the abbreviation is unique or is an exact match for some defined option. If they have an argument, it follows the option name in the same ARGV-element, separated from the option name by a '=', or else the in next ARGV-element. When 'getopt' finds a long-named option, it returns 0 if that option's 'flag' field is nonzero, the value of the option's 'val' field if the 'flag' field is zero. The elements of ARGV aren't really const, because we permute them. But we pretend they're const in the prototype to be compatible with other systems. LONGOPTS is a vector of 'struct option' terminated by an element containing a name which is zero. LONGIND returns the index in LONGOPT of the long-named option found. It is only valid when a long-named option has been found by the most recent call. If LONG_ONLY is nonzero, '-' as well as '--' can introduce long-named options. */ int _getopt_internal_r (int argc, char **argv, const char *optstring, const struct option *longopts, int *longind, int long_only, struct _getopt_data *d, int posixly_correct) { int print_errors = d->opterr; if (argc < 1) return -1; d->optarg = NULL; if (d->optind == 0 || !d->__initialized) optstring = _getopt_initialize (argc, argv, optstring, d, posixly_correct); else if (optstring[0] == '-' || optstring[0] == '+') optstring++; if (optstring[0] == ':') print_errors = 0; /* Test whether ARGV[optind] points to a non-option argument. */ #define NONOPTION_P (argv[d->optind][0] != '-' || argv[d->optind][1] == '\0') if (d->__nextchar == NULL || *d->__nextchar == '\0') { /* Advance to the next ARGV-element. */ /* Give FIRST_NONOPT & LAST_NONOPT rational values if OPTIND has been moved back by the user (who may also have changed the arguments). */ if (d->__last_nonopt > d->optind) d->__last_nonopt = d->optind; if (d->__first_nonopt > d->optind) d->__first_nonopt = d->optind; if (d->__ordering == PERMUTE) { /* If we have just processed some options following some non-options, exchange them so that the options come first. */ if (d->__first_nonopt != d->__last_nonopt && d->__last_nonopt != d->optind) exchange (argv, d); else if (d->__last_nonopt != d->optind) d->__first_nonopt = d->optind; /* Skip any additional non-options and extend the range of non-options previously skipped. */ while (d->optind < argc && NONOPTION_P) d->optind++; d->__last_nonopt = d->optind; } /* The special ARGV-element '--' means premature end of options. Skip it like a null option, then exchange with previous non-options as if it were an option, then skip everything else like a non-option. */ if (d->optind != argc && !strcmp (argv[d->optind], "--")) { d->optind++; if (d->__first_nonopt != d->__last_nonopt && d->__last_nonopt != d->optind) exchange (argv, d); else if (d->__first_nonopt == d->__last_nonopt) d->__first_nonopt = d->optind; d->__last_nonopt = argc; d->optind = argc; } /* If we have done all the ARGV-elements, stop the scan and back over any non-options that we skipped and permuted. */ if (d->optind == argc) { /* Set the next-arg-index to point at the non-options that we previously skipped, so the caller will digest them. */ if (d->__first_nonopt != d->__last_nonopt) d->optind = d->__first_nonopt; return -1; } /* If we have come to a non-option and did not permute it, either stop the scan or describe it to the caller and pass it by. */ if (NONOPTION_P) { if (d->__ordering == REQUIRE_ORDER) return -1; d->optarg = argv[d->optind++]; return 1; } /* We have found another option-ARGV-element. Check whether it might be a long option. */ if (longopts) { if (argv[d->optind][1] == '-') { /* "--foo" is always a long option. The special option "--" was handled above. */ d->__nextchar = argv[d->optind] + 2; return process_long_option (argc, argv, optstring, longopts, longind, long_only, d, print_errors, "--"); } /* If long_only and the ARGV-element has the form "-f", where f is a valid short option, don't consider it an abbreviated form of a long option that starts with f. Otherwise there would be no way to give the -f short option. On the other hand, if there's a long option "fubar" and the ARGV-element is "-fu", do consider that an abbreviation of the long option, just like "--fu", and not "-f" with arg "u". This distinction seems to be the most useful approach. */ if (long_only && (argv[d->optind][2] || !strchr (optstring, argv[d->optind][1]))) { int code; d->__nextchar = argv[d->optind] + 1; code = process_long_option (argc, argv, optstring, longopts, longind, long_only, d, print_errors, "-"); if (code != -1) return code; } } /* It is not a long option. Skip the initial punctuation. */ d->__nextchar = argv[d->optind] + 1; } /* Look at and handle the next short option-character. */ { char c = *d->__nextchar++; const char *temp = strchr (optstring, c); /* Increment 'optind' when we start to process its last character. */ if (*d->__nextchar == '\0') ++d->optind; if (temp == NULL || c == ':' || c == ';') { if (print_errors) fprintf (stderr, _("%s: invalid option -- '%c'\n"), argv[0], c); d->optopt = c; return '?'; } /* Convenience. Treat POSIX -W foo same as long option --foo */ if (temp[0] == 'W' && temp[1] == ';' && longopts != NULL) { /* This is an option that requires an argument. */ if (*d->__nextchar != '\0') d->optarg = d->__nextchar; else if (d->optind == argc) { if (print_errors) fprintf (stderr, _("%s: option requires an argument -- '%c'\n"), argv[0], c); d->optopt = c; if (optstring[0] == ':') c = ':'; else c = '?'; return c; } else d->optarg = argv[d->optind]; d->__nextchar = d->optarg; d->optarg = NULL; return process_long_option (argc, argv, optstring, longopts, longind, 0 /* long_only */, d, print_errors, "-W "); } if (temp[1] == ':') { if (temp[2] == ':') { /* This is an option that accepts an argument optionally. */ if (*d->__nextchar != '\0') { d->optarg = d->__nextchar; d->optind++; } else d->optarg = NULL; d->__nextchar = NULL; } else { /* This is an option that requires an argument. */ if (*d->__nextchar != '\0') { d->optarg = d->__nextchar; /* If we end this ARGV-element by taking the rest as an arg, we must advance to the next element now. */ d->optind++; } else if (d->optind == argc) { if (print_errors) fprintf (stderr, _("%s: option requires an argument -- '%c'\n"), argv[0], c); d->optopt = c; if (optstring[0] == ':') c = ':'; else c = '?'; } else /* We already incremented 'optind' once; increment it again when taking next ARGV-elt as argument. */ d->optarg = argv[d->optind++]; d->__nextchar = NULL; } } return c; } } int _getopt_internal (int argc, char **argv, const char *optstring, const struct option *longopts, int *longind, int long_only, int posixly_correct) { int result; getopt_data.optind = optind; getopt_data.opterr = opterr; result = _getopt_internal_r (argc, argv, optstring, longopts, longind, long_only, &getopt_data, posixly_correct); optind = getopt_data.optind; optarg = getopt_data.optarg; optopt = getopt_data.optopt; return result; } /* glibc gets a LSB-compliant getopt and a POSIX-complaint __posix_getopt. Standalone applications just get a POSIX-compliant getopt. POSIX and LSB both require these functions to take 'char *const *argv' even though this is incorrect (because of the permutation). */ #define GETOPT_ENTRY(NAME, POSIXLY_CORRECT) \ int \ NAME (int argc, char *const *argv, const char *optstring) \ { \ return _getopt_internal (argc, (char **)argv, optstring, \ 0, 0, 0, POSIXLY_CORRECT); \ } #ifdef _LIBC GETOPT_ENTRY(getopt, 0) GETOPT_ENTRY(__posix_getopt, 1) #else GETOPT_ENTRY(getopt, 1) #endif #ifdef TEST /* Compile with -DTEST to make an executable for use in testing the above definition of 'getopt'. */ int main (int argc, char **argv) { int c; int digit_optind = 0; while (1) { int this_option_optind = optind ? optind : 1; c = getopt (argc, argv, "abc:d:0123456789"); if (c == -1) break; switch (c) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': if (digit_optind != 0 && digit_optind != this_option_optind) printf ("digits occur in two different argv-elements.\n"); digit_optind = this_option_optind; printf ("option %c\n", c); break; case 'a': printf ("option a\n"); break; case 'b': printf ("option b\n"); break; case 'c': printf ("option c with value '%s'\n", optarg); break; case '?': break; default: printf ("?? getopt returned character code 0%o ??\n", c); } } if (optind < argc) { printf ("non-option ARGV-elements: "); while (optind < argc) printf ("%s ", argv[optind++]); printf ("\n"); } exit (0); } #endif /* TEST */ pspp-1.4.1/gl/m4/0000755000175000017500000000000013725012650013036 5ustar00blpblp00000000000000pspp-1.4.1/gl/m4/open-slash.m40000644000175000017500000000343413723215637015365 0ustar00blpblp00000000000000# open-slash.m4 serial 1 dnl Copyright (C) 2007-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl Tests whether open() and creat() recognize a trailing slash. dnl Sets gl_cv_func_open_slash. AC_DEFUN([gl_OPEN_TRAILING_SLASH_BUG], [ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles dnl open("foo/") should not create a file when the file name has a dnl trailing slash. FreeBSD only has the problem on symlinks. AC_CHECK_FUNCS_ONCE([lstat]) AC_CACHE_CHECK([whether open recognizes a trailing slash], [gl_cv_func_open_slash], [# Assume that if we have lstat, we can also check symlinks. if test $ac_cv_func_lstat = yes; then touch conftest.tmp ln -s conftest.tmp conftest.lnk fi AC_RUN_IFELSE( [AC_LANG_SOURCE([[ #include #if HAVE_UNISTD_H # include #endif int main () { int result = 0; #if HAVE_LSTAT if (open ("conftest.lnk/", O_RDONLY) != -1) result |= 1; #endif if (open ("conftest.sl/", O_CREAT, 0600) >= 0) result |= 2; return result; }]])], [gl_cv_func_open_slash=yes], [gl_cv_func_open_slash=no], [ changequote(,)dnl case "$host_os" in freebsd* | aix* | hpux* | solaris2.[0-9] | solaris2.[0-9].*) gl_cv_func_open_slash="guessing no" ;; *) gl_cv_func_open_slash="guessing yes" ;; esac changequote([,])dnl ]) rm -f conftest.sl conftest.tmp conftest.lnk ]) case "$gl_cv_func_open_slash" in *no) AC_DEFINE([OPEN_TRAILING_SLASH_BUG], [1], [Define to 1 if open() fails to recognize a trailing slash.]) ;; esac ]) pspp-1.4.1/gl/m4/error.m40000644000175000017500000000151013723215637014436 0ustar00blpblp00000000000000#serial 14 # Copyright (C) 1996-1998, 2001-2004, 2009-2020 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_ERROR], [ dnl We don't use AC_FUNC_ERROR_AT_LINE any more, because it is no longer dnl maintained in Autoconf and because it invokes AC_LIBOBJ. AC_CACHE_CHECK([for error_at_line], [ac_cv_lib_error_at_line], [AC_LINK_IFELSE( [AC_LANG_PROGRAM( [[#include ]], [[error_at_line (0, 0, "", 0, "an error occurred");]])], [ac_cv_lib_error_at_line=yes], [ac_cv_lib_error_at_line=no])]) ]) # Prerequisites of lib/error.c. AC_DEFUN([gl_PREREQ_ERROR], [ AC_REQUIRE([AC_FUNC_STRERROR_R]) : ]) pspp-1.4.1/gl/m4/mbiter.m40000644000175000017500000000064213723215637014574 0ustar00blpblp00000000000000# mbiter.m4 serial 7 dnl Copyright (C) 2005, 2008-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl autoconf tests required for use of mbiter.h dnl From Bruno Haible. AC_DEFUN([gl_MBITER], [ AC_REQUIRE([AC_TYPE_MBSTATE_T]) : ]) pspp-1.4.1/gl/m4/inttypes.m40000644000175000017500000001251313723215637015171 0ustar00blpblp00000000000000# inttypes.m4 serial 31 dnl Copyright (C) 2006-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl From Derek Price, Bruno Haible. dnl Test whether is supported or must be substituted. AC_DEFUN([gl_INTTYPES_H], [ AC_REQUIRE([gl_INTTYPES_INCOMPLETE]) gl_INTTYPES_PRI_SCN ]) AC_DEFUN_ONCE([gl_INTTYPES_INCOMPLETE], [ AC_REQUIRE([gl_STDINT_H]) AC_CHECK_HEADERS_ONCE([inttypes.h]) dnl Override always, so that the portability warnings work. AC_REQUIRE([gl_INTTYPES_H_DEFAULTS]) gl_CHECK_NEXT_HEADERS([inttypes.h]) AC_REQUIRE([gl_MULTIARCH]) dnl Check for declarations of anything we want to poison if the dnl corresponding gnulib module is not in use. gl_WARN_ON_USE_PREPARE([[#include ]], [imaxabs imaxdiv strtoimax strtoumax]) AC_REQUIRE([AC_C_RESTRICT]) ]) # Ensure that the PRI* and SCN* macros are defined appropriately. AC_DEFUN([gl_INTTYPES_PRI_SCN], [ PRIPTR_PREFIX= if test -n "$STDINT_H"; then dnl Using the gnulib . It defines intptr_t to 'long' or dnl 'long long', depending on _WIN64. AC_COMPILE_IFELSE( [AC_LANG_PROGRAM([[ #ifdef _WIN64 LLP64 #endif ]]), ], [PRIPTR_PREFIX='"l"'], [PRIPTR_PREFIX='"ll"']) else dnl Using the system's . for glpfx in '' l ll I64; do case $glpfx in '') gltype1='int';; l) gltype1='long int';; ll) gltype1='long long int';; I64) gltype1='__int64';; esac AC_COMPILE_IFELSE( [AC_LANG_PROGRAM([[#include extern intptr_t foo; extern $gltype1 foo;]])], [PRIPTR_PREFIX='"'$glpfx'"']) test -n "$PRIPTR_PREFIX" && break done fi AC_SUBST([PRIPTR_PREFIX]) gl_INTTYPES_CHECK_LONG_LONG_INT_CONDITION( [INT32_MAX_LT_INTMAX_MAX], [defined INT32_MAX && defined INTMAX_MAX], [INT32_MAX < INTMAX_MAX], [sizeof (int) < sizeof (long long int)]) if test $APPLE_UNIVERSAL_BUILD = 0; then gl_INTTYPES_CHECK_LONG_LONG_INT_CONDITION( [INT64_MAX_EQ_LONG_MAX], [defined INT64_MAX], [INT64_MAX == LONG_MAX], [sizeof (long long int) == sizeof (long int)]) else INT64_MAX_EQ_LONG_MAX=-1 fi gl_INTTYPES_CHECK_LONG_LONG_INT_CONDITION( [UINT32_MAX_LT_UINTMAX_MAX], [defined UINT32_MAX && defined UINTMAX_MAX], [UINT32_MAX < UINTMAX_MAX], [sizeof (unsigned int) < sizeof (unsigned long long int)]) if test $APPLE_UNIVERSAL_BUILD = 0; then gl_INTTYPES_CHECK_LONG_LONG_INT_CONDITION( [UINT64_MAX_EQ_ULONG_MAX], [defined UINT64_MAX], [UINT64_MAX == ULONG_MAX], [sizeof (unsigned long long int) == sizeof (unsigned long int)]) else UINT64_MAX_EQ_ULONG_MAX=-1 fi ]) # Define the symbol $1 to be 1 if the condition is true, 0 otherwise. # If $2 is true, the condition is $3; otherwise if long long int is supported # approximate the condition with $4; otherwise, assume the condition is false. # The condition should work on all C99 platforms; the approximations should be # good enough to work on all practical pre-C99 platforms. # $2 is evaluated by the C preprocessor, $3 and $4 as compile-time constants. AC_DEFUN([gl_INTTYPES_CHECK_LONG_LONG_INT_CONDITION], [ AC_CACHE_CHECK([whether $3], [gl_cv_test_$1], [AC_COMPILE_IFELSE( [AC_LANG_PROGRAM( [[/* Work also in C++ mode. */ #define __STDC_LIMIT_MACROS 1 /* Work if build is not clean. */ #define _GL_JUST_INCLUDE_SYSTEM_STDINT_H #include #if HAVE_STDINT_H #include #endif #if $2 #define CONDITION ($3) #else #define CONDITION ($4) #endif int test[CONDITION ? 1 : -1];]])], [gl_cv_test_$1=yes], [gl_cv_test_$1=no])]) if test $gl_cv_test_$1 = yes; then $1=1; else $1=0; fi AC_SUBST([$1]) ]) AC_DEFUN([gl_INTTYPES_MODULE_INDICATOR], [ dnl Use AC_REQUIRE here, so that the default settings are expanded once only. AC_REQUIRE([gl_INTTYPES_H_DEFAULTS]) gl_MODULE_INDICATOR_SET_VARIABLE([$1]) ]) AC_DEFUN([gl_INTTYPES_H_DEFAULTS], [ GNULIB_IMAXABS=0; AC_SUBST([GNULIB_IMAXABS]) GNULIB_IMAXDIV=0; AC_SUBST([GNULIB_IMAXDIV]) GNULIB_STRTOIMAX=0; AC_SUBST([GNULIB_STRTOIMAX]) GNULIB_STRTOUMAX=0; AC_SUBST([GNULIB_STRTOUMAX]) dnl Assume proper GNU behavior unless another module says otherwise. HAVE_DECL_IMAXABS=1; AC_SUBST([HAVE_DECL_IMAXABS]) HAVE_DECL_IMAXDIV=1; AC_SUBST([HAVE_DECL_IMAXDIV]) HAVE_DECL_STRTOIMAX=1; AC_SUBST([HAVE_DECL_STRTOIMAX]) HAVE_DECL_STRTOUMAX=1; AC_SUBST([HAVE_DECL_STRTOUMAX]) HAVE_IMAXDIV_T=1; AC_SUBST([HAVE_IMAXDIV_T]) REPLACE_STRTOIMAX=0; AC_SUBST([REPLACE_STRTOIMAX]) REPLACE_STRTOUMAX=0; AC_SUBST([REPLACE_STRTOUMAX]) INT32_MAX_LT_INTMAX_MAX=1; AC_SUBST([INT32_MAX_LT_INTMAX_MAX]) INT64_MAX_EQ_LONG_MAX='defined _LP64'; AC_SUBST([INT64_MAX_EQ_LONG_MAX]) PRIPTR_PREFIX=__PRIPTR_PREFIX; AC_SUBST([PRIPTR_PREFIX]) UINT32_MAX_LT_UINTMAX_MAX=1; AC_SUBST([UINT32_MAX_LT_UINTMAX_MAX]) UINT64_MAX_EQ_ULONG_MAX='defined _LP64'; AC_SUBST([UINT64_MAX_EQ_ULONG_MAX]) ]) pspp-1.4.1/gl/m4/time_rz.m40000644000175000017500000000347013723215637014765 0ustar00blpblp00000000000000dnl Time zone functions: tzalloc, localtime_rz, etc. dnl Copyright (C) 2015-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl Written by Paul Eggert. AC_DEFUN([gl_TIME_RZ], [ AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS]) AC_REQUIRE([gl_HEADER_TIME_H_DEFAULTS]) AC_REQUIRE([AC_STRUCT_TIMEZONE]) # Mac OS X 10.6 loops forever with some time_t values. # See Bug#27706, Bug#27736, and # https://lists.gnu.org/r/bug-gnulib/2017-07/msg00142.html AC_CACHE_CHECK([whether localtime loops forever near extrema], [gl_cv_func_localtime_infloop_bug], [gl_cv_func_localtime_infloop_bug=no AC_RUN_IFELSE( [AC_LANG_PROGRAM( [[#include #include #include #include ]], [[ time_t t = -67768038400666600; struct tm *tm; char *tz = getenv ("TZ"); if (! (tz && strcmp (tz, "QQQ0") == 0)) return 0; alarm (2); tm = localtime (&t); /* Use TM and *TM to suppress over-optimization. */ return tm && tm->tm_isdst; ]])], [(TZ=QQQ0 ./conftest$EXEEXT) >/dev/null 2>&1 || gl_cv_func_localtime_infloop_bug=yes], [], [gl_cv_func_localtime_infloop_bug="guessing no"])]) if test "$gl_cv_func_localtime_infloop_bug" = yes; then AC_DEFINE([HAVE_LOCALTIME_INFLOOP_BUG], 1, [Define if localtime-like functions can loop forever on extreme arguments.]) fi AC_CHECK_TYPES([timezone_t], [], [], [[#include ]]) if test "$ac_cv_type_timezone_t" = yes; then HAVE_TIMEZONE_T=1 fi ]) pspp-1.4.1/gl/m4/frexp.m40000644000175000017500000001207113723215637014435 0ustar00blpblp00000000000000# frexp.m4 serial 16 dnl Copyright (C) 2007-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_FUNC_FREXP], [ AC_REQUIRE([gl_MATH_H_DEFAULTS]) AC_REQUIRE([gl_CHECK_FREXP_NO_LIBM]) FREXP_LIBM= if test $gl_cv_func_frexp_no_libm = no; then AC_CACHE_CHECK([whether frexp() can be used with libm], [gl_cv_func_frexp_in_libm], [ save_LIBS="$LIBS" LIBS="$LIBS -lm" AC_LINK_IFELSE( [AC_LANG_PROGRAM( [[#include double x;]], [[int e; return frexp (x, &e) > 0;]])], [gl_cv_func_frexp_in_libm=yes], [gl_cv_func_frexp_in_libm=no]) LIBS="$save_LIBS" ]) if test $gl_cv_func_frexp_in_libm = yes; then FREXP_LIBM=-lm fi fi if test $gl_cv_func_frexp_no_libm = yes \ || test $gl_cv_func_frexp_in_libm = yes; then save_LIBS="$LIBS" LIBS="$LIBS $FREXP_LIBM" gl_FUNC_FREXP_WORKS LIBS="$save_LIBS" case "$gl_cv_func_frexp_works" in *yes) gl_func_frexp=yes ;; *) gl_func_frexp=no; REPLACE_FREXP=1; FREXP_LIBM= ;; esac else gl_func_frexp=no fi if test $gl_func_frexp = yes; then AC_DEFINE([HAVE_FREXP], [1], [Define if the frexp() function is available and works.]) fi AC_SUBST([FREXP_LIBM]) ]) AC_DEFUN([gl_FUNC_FREXP_NO_LIBM], [ AC_REQUIRE([gl_MATH_H_DEFAULTS]) AC_REQUIRE([gl_CHECK_FREXP_NO_LIBM]) if test $gl_cv_func_frexp_no_libm = yes; then gl_FUNC_FREXP_WORKS case "$gl_cv_func_frexp_works" in *yes) gl_func_frexp_no_libm=yes ;; *) gl_func_frexp_no_libm=no; REPLACE_FREXP=1 ;; esac else gl_func_frexp_no_libm=no dnl Set REPLACE_FREXP here because the system may have frexp in libm. REPLACE_FREXP=1 fi if test $gl_func_frexp_no_libm = yes; then AC_DEFINE([HAVE_FREXP_IN_LIBC], [1], [Define if the frexp() function is available in libc.]) fi ]) dnl Test whether frexp() can be used without linking with libm. dnl Set gl_cv_func_frexp_no_libm to 'yes' or 'no' accordingly. AC_DEFUN([gl_CHECK_FREXP_NO_LIBM], [ AC_CACHE_CHECK([whether frexp() can be used without linking with libm], [gl_cv_func_frexp_no_libm], [ AC_LINK_IFELSE( [AC_LANG_PROGRAM( [[#include double x;]], [[int e; return frexp (x, &e) > 0;]])], [gl_cv_func_frexp_no_libm=yes], [gl_cv_func_frexp_no_libm=no]) ]) ]) dnl Test whether frexp() works also on denormalized numbers (this fails e.g. on dnl NetBSD 3.0), on infinite numbers (this fails e.g. on IRIX 6.5 and mingw), dnl and on negative zero (this fails e.g. on NetBSD 4.99 and mingw). AC_DEFUN([gl_FUNC_FREXP_WORKS], [ AC_REQUIRE([AC_PROG_CC]) AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles AC_CHECK_DECLS_ONCE([alarm]) AC_CACHE_CHECK([whether frexp works], [gl_cv_func_frexp_works], [ AC_RUN_IFELSE( [AC_LANG_SOURCE([[ #include #include #include #if HAVE_DECL_ALARM # include # include #endif /* HP cc on HP-UX 10.20 has a bug with the constant expression -0.0. ICC 10.0 has a bug when optimizing the expression -zero. The expression -DBL_MIN * DBL_MIN does not work when cross-compiling to PowerPC on Mac OS X 10.5. */ #if defined __hpux || defined __sgi || defined __ICC static double compute_minus_zero (void) { return -DBL_MIN * DBL_MIN; } # define minus_zero compute_minus_zero () #else double minus_zero = -0.0; #endif int main() { int result = 0; int i; volatile double x; double zero = 0.0; #if HAVE_DECL_ALARM /* NeXTstep 3.3 frexp() runs into an endless loop when called on an infinite number. Let the test fail in this case. */ signal (SIGALRM, SIG_DFL); alarm (5); #endif /* Test on denormalized numbers. */ for (i = 1, x = 1.0; i >= DBL_MIN_EXP; i--, x *= 0.5) ; if (x > 0.0) { int exp; double y = frexp (x, &exp); /* On machines with IEEE754 arithmetic: x = 1.11254e-308, exp = -1022. On NetBSD: y = 0.75. Correct: y = 0.5. */ if (y != 0.5) result |= 1; } /* Test on infinite numbers. */ x = 1.0 / zero; { int exp; double y = frexp (x, &exp); if (y != x) result |= 2; } /* Test on negative zero. */ x = minus_zero; { int exp; double y = frexp (x, &exp); if (memcmp (&y, &x, sizeof x)) result |= 4; } return result; }]])], [gl_cv_func_frexp_works=yes], [gl_cv_func_frexp_works=no], [case "$host_os" in netbsd* | irix*) gl_cv_func_frexp_works="guessing no" ;; mingw*) # Guess yes with MSVC, no with mingw. AC_EGREP_CPP([Good], [ #ifdef _MSC_VER Good #endif ], [gl_cv_func_frexp_works="guessing yes"], [gl_cv_func_frexp_works="guessing no"]) ;; *) gl_cv_func_frexp_works="guessing yes" ;; esac ]) ]) ]) pspp-1.4.1/gl/m4/tmpdir.m40000644000175000017500000000054113723215637014607 0ustar00blpblp00000000000000# tmpdir.m4 serial 4 dnl Copyright (C) 2001-2002, 2006, 2009-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. # Prerequisites for lib/tmpdir.c AC_DEFUN([gt_TMPDIR], [:]) pspp-1.4.1/gl/m4/md4.m40000644000175000017500000000056413723215637014001 0ustar00blpblp00000000000000# md4.m4 serial 7 dnl Copyright (C) 2002-2006, 2008-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl Prerequisites of lib/md4.c. AC_DEFUN([gl_MD4], [ AC_REQUIRE([gl_BIGENDIAN]) : ]) pspp-1.4.1/gl/m4/configmake.m40000644000175000017500000000170413723215637015415 0ustar00blpblp00000000000000# configmake.m4 serial 3 dnl Copyright (C) 2010-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_PREREQ([2.60]) # gl_CONFIGMAKE_PREP # ------------------ # Guarantee all of the standard directory variables, even when used with # autoconf 2.63 (runstatedir wasn't supported before 2.70) or # automake 1.11 (runstatedir isn't supported even in 1.16.1). AC_DEFUN([gl_CONFIGMAKE_PREP], [ if test "x$lispdir" = x; then AC_SUBST([lispdir], ['${datarootdir}/emacs/site-lisp']) fi dnl Added in autoconf 2.70. if test "x$runstatedir" = x; then AC_SUBST([runstatedir], ['${localstatedir}/run']) fi dnl Automake 1.11 provides pkglibexecdir merely without AC_SUBST. dnl This blind use of AC_SUBST is safe. AC_SUBST([pkglibexecdir], ['${libexecdir}/${PACKAGE}']) ]) pspp-1.4.1/gl/m4/rawmemchr.m40000644000175000017500000000117213723215637015276 0ustar00blpblp00000000000000# rawmemchr.m4 serial 2 dnl Copyright (C) 2003, 2007-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_FUNC_RAWMEMCHR], [ dnl Persuade glibc to declare rawmemchr(). AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS]) AC_REQUIRE([gl_HEADER_STRING_H_DEFAULTS]) AC_CHECK_FUNCS([rawmemchr]) if test $ac_cv_func_rawmemchr = no; then HAVE_RAWMEMCHR=0 fi ]) # Prerequisites of lib/strchrnul.c. AC_DEFUN([gl_PREREQ_RAWMEMCHR], [:]) pspp-1.4.1/gl/m4/strsep.m40000644000175000017500000000132013723215637014624 0ustar00blpblp00000000000000# strsep.m4 serial 10 dnl Copyright (C) 2002-2004, 2007, 2009-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_FUNC_STRSEP], [ dnl Persuade glibc to declare strsep(). AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS]) dnl The strsep() declaration in lib/string.in.h uses 'restrict'. AC_REQUIRE([AC_C_RESTRICT]) AC_REQUIRE([gl_HEADER_STRING_H_DEFAULTS]) AC_CHECK_FUNCS([strsep]) if test $ac_cv_func_strsep = no; then HAVE_STRSEP=0 fi ]) # Prerequisites of lib/strsep.c. AC_DEFUN([gl_PREREQ_STRSEP], [:]) pspp-1.4.1/gl/m4/ftello.m40000644000175000017500000000776613723215637014615 0ustar00blpblp00000000000000# ftello.m4 serial 13 dnl Copyright (C) 2007-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_FUNC_FTELLO], [ AC_REQUIRE([gl_STDIO_H_DEFAULTS]) AC_REQUIRE([AC_PROG_CC]) AC_REQUIRE([gl_STDIN_LARGE_OFFSET]) AC_REQUIRE([gl_SYS_TYPES_H]) dnl Persuade glibc to declare ftello(). AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS]) AC_CHECK_DECLS_ONCE([ftello]) if test $ac_cv_have_decl_ftello = no; then HAVE_DECL_FTELLO=0 fi AC_CACHE_CHECK([for ftello], [gl_cv_func_ftello], [ AC_LINK_IFELSE( [AC_LANG_PROGRAM( [[#include ]], [[ftello (stdin);]])], [gl_cv_func_ftello=yes], [gl_cv_func_ftello=no]) ]) if test $gl_cv_func_ftello = no; then HAVE_FTELLO=0 else if test $WINDOWS_64_BIT_OFF_T = 1; then REPLACE_FTELLO=1 fi if test $gl_cv_var_stdin_large_offset = no; then REPLACE_FTELLO=1 fi if test $REPLACE_FTELLO = 0; then dnl Detect bug on Solaris. dnl ftell and ftello produce incorrect results after putc that followed a dnl getc call that reached EOF on Solaris. This is because the _IOREAD dnl flag does not get cleared in this case, even though _IOWRT gets set, dnl and ftell and ftello look whether the _IOREAD flag is set. AC_REQUIRE([AC_CANONICAL_HOST]) AC_CACHE_CHECK([whether ftello works], [gl_cv_func_ftello_works], [ dnl Initial guess, used when cross-compiling or when /dev/tty cannot dnl be opened. changequote(,)dnl case "$host_os" in # Guess no on Solaris. solaris*) gl_cv_func_ftello_works="guessing no" ;; # Guess yes on native Windows. mingw*) gl_cv_func_ftello_works="guessing yes" ;; # Guess yes otherwise. *) gl_cv_func_ftello_works="guessing yes" ;; esac changequote([,])dnl AC_RUN_IFELSE( [AC_LANG_SOURCE([[ #include #include #include #define TESTFILE "conftest.tmp" int main (void) { FILE *fp; /* Create a file with some contents. */ fp = fopen (TESTFILE, "w"); if (fp == NULL) return 70; if (fwrite ("foogarsh", 1, 8, fp) < 8) { fclose (fp); return 71; } if (fclose (fp)) return 72; /* The file's contents is now "foogarsh". */ /* Try writing after reading to EOF. */ fp = fopen (TESTFILE, "r+"); if (fp == NULL) return 73; if (fseek (fp, -1, SEEK_END)) { fclose (fp); return 74; } if (!(getc (fp) == 'h')) { fclose (fp); return 1; } if (!(getc (fp) == EOF)) { fclose (fp); return 2; } if (!(ftell (fp) == 8)) { fclose (fp); return 3; } if (!(ftell (fp) == 8)) { fclose (fp); return 4; } if (!(putc ('!', fp) == '!')) { fclose (fp); return 5; } if (!(ftell (fp) == 9)) { fclose (fp); return 6; } if (!(fclose (fp) == 0)) return 7; fp = fopen (TESTFILE, "r"); if (fp == NULL) return 75; { char buf[10]; if (!(fread (buf, 1, 10, fp) == 9)) { fclose (fp); return 10; } if (!(memcmp (buf, "foogarsh!", 9) == 0)) { fclose (fp); return 11; } } if (!(fclose (fp) == 0)) return 12; /* The file's contents is now "foogarsh!". */ return 0; }]])], [gl_cv_func_ftello_works=yes], [gl_cv_func_ftello_works=no], [:]) ]) case "$gl_cv_func_ftello_works" in *yes) ;; *) REPLACE_FTELLO=1 AC_DEFINE([FTELLO_BROKEN_AFTER_SWITCHING_FROM_READ_TO_WRITE], [1], [Define to 1 if the system's ftello function has the Solaris bug.]) ;; esac fi fi ]) # Prerequisites of lib/ftello.c. AC_DEFUN([gl_PREREQ_FTELLO], [ dnl Native Windows has the function _ftelli64. mingw hides it, but mingw64 dnl makes it usable again. AC_CHECK_FUNCS([_ftelli64]) ]) pspp-1.4.1/gl/m4/stdint.m40000644000175000017500000004310713723215637014622 0ustar00blpblp00000000000000# stdint.m4 serial 54 dnl Copyright (C) 2001-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl From Paul Eggert and Bruno Haible. dnl Test whether is supported or must be substituted. AC_PREREQ([2.61]) AC_DEFUN_ONCE([gl_STDINT_H], [ AC_PREREQ([2.59])dnl AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles AC_REQUIRE([gl_LIMITS_H]) AC_REQUIRE([gt_TYPE_WINT_T]) dnl For backward compatibility. Some packages may still be testing these dnl macros. AC_DEFINE([HAVE_LONG_LONG_INT], [1], [Define to 1 if the system has the type 'long long int'.]) AC_DEFINE([HAVE_UNSIGNED_LONG_LONG_INT], [1], [Define to 1 if the system has the type 'unsigned long long int'.]) dnl Check for , in the same way as gl_WCHAR_H does. AC_CHECK_HEADERS_ONCE([wchar.h]) if test $ac_cv_header_wchar_h = yes; then HAVE_WCHAR_H=1 else HAVE_WCHAR_H=0 fi AC_SUBST([HAVE_WCHAR_H]) dnl Check for . dnl AC_INCLUDES_DEFAULT defines $ac_cv_header_inttypes_h. if test $ac_cv_header_inttypes_h = yes; then HAVE_INTTYPES_H=1 else HAVE_INTTYPES_H=0 fi AC_SUBST([HAVE_INTTYPES_H]) dnl Check for . dnl AC_INCLUDES_DEFAULT defines $ac_cv_header_sys_types_h. if test $ac_cv_header_sys_types_h = yes; then HAVE_SYS_TYPES_H=1 else HAVE_SYS_TYPES_H=0 fi AC_SUBST([HAVE_SYS_TYPES_H]) gl_CHECK_NEXT_HEADERS([stdint.h]) if test $ac_cv_header_stdint_h = yes; then HAVE_STDINT_H=1 else HAVE_STDINT_H=0 fi AC_SUBST([HAVE_STDINT_H]) dnl Now see whether we need a substitute . if test $ac_cv_header_stdint_h = yes; then AC_CACHE_CHECK([whether stdint.h conforms to C99], [gl_cv_header_working_stdint_h], [gl_cv_header_working_stdint_h=no AC_COMPILE_IFELSE([ AC_LANG_PROGRAM([[ #define _GL_JUST_INCLUDE_SYSTEM_STDINT_H 1 /* work if build isn't clean */ #define __STDC_CONSTANT_MACROS 1 #define __STDC_LIMIT_MACROS 1 #include /* Dragonfly defines WCHAR_MIN, WCHAR_MAX only in . */ #if !(defined WCHAR_MIN && defined WCHAR_MAX) #error "WCHAR_MIN, WCHAR_MAX not defined in " #endif ] gl_STDINT_INCLUDES [ #ifdef INT8_MAX int8_t a1 = INT8_MAX; int8_t a1min = INT8_MIN; #endif #ifdef INT16_MAX int16_t a2 = INT16_MAX; int16_t a2min = INT16_MIN; #endif #ifdef INT32_MAX int32_t a3 = INT32_MAX; int32_t a3min = INT32_MIN; #endif #ifdef INT64_MAX int64_t a4 = INT64_MAX; int64_t a4min = INT64_MIN; #endif #ifdef UINT8_MAX uint8_t b1 = UINT8_MAX; #else typedef int b1[(unsigned char) -1 != 255 ? 1 : -1]; #endif #ifdef UINT16_MAX uint16_t b2 = UINT16_MAX; #endif #ifdef UINT32_MAX uint32_t b3 = UINT32_MAX; #endif #ifdef UINT64_MAX uint64_t b4 = UINT64_MAX; #endif int_least8_t c1 = INT8_C (0x7f); int_least8_t c1max = INT_LEAST8_MAX; int_least8_t c1min = INT_LEAST8_MIN; int_least16_t c2 = INT16_C (0x7fff); int_least16_t c2max = INT_LEAST16_MAX; int_least16_t c2min = INT_LEAST16_MIN; int_least32_t c3 = INT32_C (0x7fffffff); int_least32_t c3max = INT_LEAST32_MAX; int_least32_t c3min = INT_LEAST32_MIN; int_least64_t c4 = INT64_C (0x7fffffffffffffff); int_least64_t c4max = INT_LEAST64_MAX; int_least64_t c4min = INT_LEAST64_MIN; uint_least8_t d1 = UINT8_C (0xff); uint_least8_t d1max = UINT_LEAST8_MAX; uint_least16_t d2 = UINT16_C (0xffff); uint_least16_t d2max = UINT_LEAST16_MAX; uint_least32_t d3 = UINT32_C (0xffffffff); uint_least32_t d3max = UINT_LEAST32_MAX; uint_least64_t d4 = UINT64_C (0xffffffffffffffff); uint_least64_t d4max = UINT_LEAST64_MAX; int_fast8_t e1 = INT_FAST8_MAX; int_fast8_t e1min = INT_FAST8_MIN; int_fast16_t e2 = INT_FAST16_MAX; int_fast16_t e2min = INT_FAST16_MIN; int_fast32_t e3 = INT_FAST32_MAX; int_fast32_t e3min = INT_FAST32_MIN; int_fast64_t e4 = INT_FAST64_MAX; int_fast64_t e4min = INT_FAST64_MIN; uint_fast8_t f1 = UINT_FAST8_MAX; uint_fast16_t f2 = UINT_FAST16_MAX; uint_fast32_t f3 = UINT_FAST32_MAX; uint_fast64_t f4 = UINT_FAST64_MAX; #ifdef INTPTR_MAX intptr_t g = INTPTR_MAX; intptr_t gmin = INTPTR_MIN; #endif #ifdef UINTPTR_MAX uintptr_t h = UINTPTR_MAX; #endif intmax_t i = INTMAX_MAX; uintmax_t j = UINTMAX_MAX; /* Check that SIZE_MAX has the correct type, if possible. */ #if 201112 <= __STDC_VERSION__ int k = _Generic (SIZE_MAX, size_t: 0); #elif (2 <= __GNUC__ || defined __IBM__TYPEOF__ \ || (0x5110 <= __SUNPRO_C && !__STDC__)) extern size_t k; extern __typeof__ (SIZE_MAX) k; #endif #include /* for CHAR_BIT */ #define TYPE_MINIMUM(t) \ ((t) ((t) 0 < (t) -1 ? (t) 0 : ~ TYPE_MAXIMUM (t))) #define TYPE_MAXIMUM(t) \ ((t) ((t) 0 < (t) -1 \ ? (t) -1 \ : ((((t) 1 << (sizeof (t) * CHAR_BIT - 2)) - 1) * 2 + 1))) struct s { int check_PTRDIFF: PTRDIFF_MIN == TYPE_MINIMUM (ptrdiff_t) && PTRDIFF_MAX == TYPE_MAXIMUM (ptrdiff_t) ? 1 : -1; /* Detect bug in FreeBSD 6.0 / ia64. */ int check_SIG_ATOMIC: SIG_ATOMIC_MIN == TYPE_MINIMUM (sig_atomic_t) && SIG_ATOMIC_MAX == TYPE_MAXIMUM (sig_atomic_t) ? 1 : -1; int check_SIZE: SIZE_MAX == TYPE_MAXIMUM (size_t) ? 1 : -1; int check_WCHAR: WCHAR_MIN == TYPE_MINIMUM (wchar_t) && WCHAR_MAX == TYPE_MAXIMUM (wchar_t) ? 1 : -1; /* Detect bug in mingw. */ int check_WINT: WINT_MIN == TYPE_MINIMUM (wint_t) && WINT_MAX == TYPE_MAXIMUM (wint_t) ? 1 : -1; /* Detect bugs in glibc 2.4 and Solaris 10 stdint.h, among others. */ int check_UINT8_C: (-1 < UINT8_C (0)) == (-1 < (uint_least8_t) 0) ? 1 : -1; int check_UINT16_C: (-1 < UINT16_C (0)) == (-1 < (uint_least16_t) 0) ? 1 : -1; /* Detect bugs in OpenBSD 3.9 stdint.h. */ #ifdef UINT8_MAX int check_uint8: (uint8_t) -1 == UINT8_MAX ? 1 : -1; #endif #ifdef UINT16_MAX int check_uint16: (uint16_t) -1 == UINT16_MAX ? 1 : -1; #endif #ifdef UINT32_MAX int check_uint32: (uint32_t) -1 == UINT32_MAX ? 1 : -1; #endif #ifdef UINT64_MAX int check_uint64: (uint64_t) -1 == UINT64_MAX ? 1 : -1; #endif int check_uint_least8: (uint_least8_t) -1 == UINT_LEAST8_MAX ? 1 : -1; int check_uint_least16: (uint_least16_t) -1 == UINT_LEAST16_MAX ? 1 : -1; int check_uint_least32: (uint_least32_t) -1 == UINT_LEAST32_MAX ? 1 : -1; int check_uint_least64: (uint_least64_t) -1 == UINT_LEAST64_MAX ? 1 : -1; int check_uint_fast8: (uint_fast8_t) -1 == UINT_FAST8_MAX ? 1 : -1; int check_uint_fast16: (uint_fast16_t) -1 == UINT_FAST16_MAX ? 1 : -1; int check_uint_fast32: (uint_fast32_t) -1 == UINT_FAST32_MAX ? 1 : -1; int check_uint_fast64: (uint_fast64_t) -1 == UINT_FAST64_MAX ? 1 : -1; int check_uintptr: (uintptr_t) -1 == UINTPTR_MAX ? 1 : -1; int check_uintmax: (uintmax_t) -1 == UINTMAX_MAX ? 1 : -1; int check_size: (size_t) -1 == SIZE_MAX ? 1 : -1; }; ]])], [dnl Determine whether the various *_MIN, *_MAX macros are usable dnl in preprocessor expression. We could do it by compiling a test dnl program for each of these macros. It is faster to run a program dnl that inspects the macro expansion. dnl This detects a bug on HP-UX 11.23/ia64. AC_RUN_IFELSE([ AC_LANG_PROGRAM([[ #define _GL_JUST_INCLUDE_SYSTEM_STDINT_H 1 /* work if build isn't clean */ #define __STDC_CONSTANT_MACROS 1 #define __STDC_LIMIT_MACROS 1 #include ] gl_STDINT_INCLUDES [ #include #include #define MVAL(macro) MVAL1(macro) #define MVAL1(expression) #expression static const char *macro_values[] = { #ifdef INT8_MAX MVAL (INT8_MAX), #endif #ifdef INT16_MAX MVAL (INT16_MAX), #endif #ifdef INT32_MAX MVAL (INT32_MAX), #endif #ifdef INT64_MAX MVAL (INT64_MAX), #endif #ifdef UINT8_MAX MVAL (UINT8_MAX), #endif #ifdef UINT16_MAX MVAL (UINT16_MAX), #endif #ifdef UINT32_MAX MVAL (UINT32_MAX), #endif #ifdef UINT64_MAX MVAL (UINT64_MAX), #endif NULL }; ]], [[ const char **mv; for (mv = macro_values; *mv != NULL; mv++) { const char *value = *mv; /* Test whether it looks like a cast expression. */ if (strncmp (value, "((unsigned int)"/*)*/, 15) == 0 || strncmp (value, "((unsigned short)"/*)*/, 17) == 0 || strncmp (value, "((unsigned char)"/*)*/, 16) == 0 || strncmp (value, "((int)"/*)*/, 6) == 0 || strncmp (value, "((signed short)"/*)*/, 15) == 0 || strncmp (value, "((signed char)"/*)*/, 14) == 0) return mv - macro_values + 1; } return 0; ]])], [gl_cv_header_working_stdint_h=yes], [], [case "$host_os" in # Guess yes on native Windows. mingw*) gl_cv_header_working_stdint_h="guessing yes" ;; # In general, assume it works. *) gl_cv_header_working_stdint_h="guessing yes" ;; esac ]) ]) ]) fi HAVE_C99_STDINT_H=0 HAVE_SYS_BITYPES_H=0 HAVE_SYS_INTTYPES_H=0 STDINT_H=stdint.h case "$gl_cv_header_working_stdint_h" in *yes) HAVE_C99_STDINT_H=1 dnl Now see whether the system works without dnl __STDC_CONSTANT_MACROS/__STDC_LIMIT_MACROS defined. AC_CACHE_CHECK([whether stdint.h predates C++11], [gl_cv_header_stdint_predates_cxx11_h], [gl_cv_header_stdint_predates_cxx11_h=yes AC_COMPILE_IFELSE([ AC_LANG_PROGRAM([[ #define _GL_JUST_INCLUDE_SYSTEM_STDINT_H 1 /* work if build isn't clean */ #include ] gl_STDINT_INCLUDES [ intmax_t im = INTMAX_MAX; int32_t i32 = INT32_C (0x7fffffff); ]])], [gl_cv_header_stdint_predates_cxx11_h=no])]) if test "$gl_cv_header_stdint_predates_cxx11_h" = yes; then AC_DEFINE([__STDC_CONSTANT_MACROS], [1], [Define to 1 if the system predates C++11.]) AC_DEFINE([__STDC_LIMIT_MACROS], [1], [Define to 1 if the system predates C++11.]) fi AC_CACHE_CHECK([whether stdint.h has UINTMAX_WIDTH etc.], [gl_cv_header_stdint_width], [gl_cv_header_stdint_width=no AC_COMPILE_IFELSE( [AC_LANG_PROGRAM([[ /* Work if build is not clean. */ #define _GL_JUST_INCLUDE_SYSTEM_STDINT_H 1 #ifndef __STDC_WANT_IEC_60559_BFP_EXT__ #define __STDC_WANT_IEC_60559_BFP_EXT__ 1 #endif #include ]gl_STDINT_INCLUDES[ int iw = UINTMAX_WIDTH; ]])], [gl_cv_header_stdint_width=yes])]) if test "$gl_cv_header_stdint_width" = yes; then STDINT_H= fi ;; *) dnl Check for , and for dnl (used in Linux libc4 >= 4.6.7 and libc5). AC_CHECK_HEADERS([sys/inttypes.h sys/bitypes.h]) if test $ac_cv_header_sys_inttypes_h = yes; then HAVE_SYS_INTTYPES_H=1 fi if test $ac_cv_header_sys_bitypes_h = yes; then HAVE_SYS_BITYPES_H=1 fi gl_STDINT_TYPE_PROPERTIES ;; esac dnl The substitute stdint.h needs the substitute limit.h's _GL_INTEGER_WIDTH. gl_REPLACE_LIMITS_H AC_SUBST([HAVE_C99_STDINT_H]) AC_SUBST([HAVE_SYS_BITYPES_H]) AC_SUBST([HAVE_SYS_INTTYPES_H]) AC_SUBST([STDINT_H]) AM_CONDITIONAL([GL_GENERATE_STDINT_H], [test -n "$STDINT_H"]) ]) dnl gl_STDINT_BITSIZEOF(TYPES, INCLUDES) dnl Determine the size of each of the given types in bits. AC_DEFUN([gl_STDINT_BITSIZEOF], [ dnl Use a shell loop, to avoid bloating configure, and dnl - extra AH_TEMPLATE calls, so that autoheader knows what to put into dnl config.h.in, dnl - extra AC_SUBST calls, so that the right substitutions are made. m4_foreach_w([gltype], [$1], [AH_TEMPLATE([BITSIZEOF_]m4_translit(gltype,[abcdefghijklmnopqrstuvwxyz ],[ABCDEFGHIJKLMNOPQRSTUVWXYZ_]), [Define to the number of bits in type ']gltype['.])]) for gltype in $1 ; do AC_CACHE_CHECK([for bit size of $gltype], [gl_cv_bitsizeof_${gltype}], [AC_COMPUTE_INT([result], [sizeof ($gltype) * CHAR_BIT], [$2 #include ], [result=unknown]) eval gl_cv_bitsizeof_${gltype}=\$result ]) eval result=\$gl_cv_bitsizeof_${gltype} if test $result = unknown; then dnl Use a nonempty default, because some compilers, such as IRIX 5 cc, dnl do a syntax check even on unused #if conditions and give an error dnl on valid C code like this: dnl #if 0 dnl # if > 32 dnl # endif dnl #endif result=0 fi GLTYPE=`echo "$gltype" | tr 'abcdefghijklmnopqrstuvwxyz ' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ_'` AC_DEFINE_UNQUOTED([BITSIZEOF_${GLTYPE}], [$result]) eval BITSIZEOF_${GLTYPE}=\$result done m4_foreach_w([gltype], [$1], [AC_SUBST([BITSIZEOF_]m4_translit(gltype,[abcdefghijklmnopqrstuvwxyz ],[ABCDEFGHIJKLMNOPQRSTUVWXYZ_]))]) ]) dnl gl_CHECK_TYPES_SIGNED(TYPES, INCLUDES) dnl Determine the signedness of each of the given types. dnl Define HAVE_SIGNED_TYPE if type is signed. AC_DEFUN([gl_CHECK_TYPES_SIGNED], [ dnl Use a shell loop, to avoid bloating configure, and dnl - extra AH_TEMPLATE calls, so that autoheader knows what to put into dnl config.h.in, dnl - extra AC_SUBST calls, so that the right substitutions are made. m4_foreach_w([gltype], [$1], [AH_TEMPLATE([HAVE_SIGNED_]m4_translit(gltype,[abcdefghijklmnopqrstuvwxyz ],[ABCDEFGHIJKLMNOPQRSTUVWXYZ_]), [Define to 1 if ']gltype[' is a signed integer type.])]) for gltype in $1 ; do AC_CACHE_CHECK([whether $gltype is signed], [gl_cv_type_${gltype}_signed], [AC_COMPILE_IFELSE( [AC_LANG_PROGRAM([$2[ int verify[2 * (($gltype) -1 < ($gltype) 0) - 1];]])], result=yes, result=no) eval gl_cv_type_${gltype}_signed=\$result ]) eval result=\$gl_cv_type_${gltype}_signed GLTYPE=`echo $gltype | tr 'abcdefghijklmnopqrstuvwxyz ' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ_'` if test "$result" = yes; then AC_DEFINE_UNQUOTED([HAVE_SIGNED_${GLTYPE}], [1]) eval HAVE_SIGNED_${GLTYPE}=1 else eval HAVE_SIGNED_${GLTYPE}=0 fi done m4_foreach_w([gltype], [$1], [AC_SUBST([HAVE_SIGNED_]m4_translit(gltype,[abcdefghijklmnopqrstuvwxyz ],[ABCDEFGHIJKLMNOPQRSTUVWXYZ_]))]) ]) dnl gl_INTEGER_TYPE_SUFFIX(TYPES, INCLUDES) dnl Determine the suffix to use for integer constants of the given types. dnl Define t_SUFFIX for each such type. AC_DEFUN([gl_INTEGER_TYPE_SUFFIX], [ dnl Use a shell loop, to avoid bloating configure, and dnl - extra AH_TEMPLATE calls, so that autoheader knows what to put into dnl config.h.in, dnl - extra AC_SUBST calls, so that the right substitutions are made. m4_foreach_w([gltype], [$1], [AH_TEMPLATE(m4_translit(gltype,[abcdefghijklmnopqrstuvwxyz ],[ABCDEFGHIJKLMNOPQRSTUVWXYZ_])[_SUFFIX], [Define to l, ll, u, ul, ull, etc., as suitable for constants of type ']gltype['.])]) for gltype in $1 ; do AC_CACHE_CHECK([for $gltype integer literal suffix], [gl_cv_type_${gltype}_suffix], [eval gl_cv_type_${gltype}_suffix=no eval result=\$gl_cv_type_${gltype}_signed if test "$result" = yes; then glsufu= else glsufu=u fi for glsuf in "$glsufu" ${glsufu}l ${glsufu}ll ${glsufu}i64; do case $glsuf in '') gltype1='int';; l) gltype1='long int';; ll) gltype1='long long int';; i64) gltype1='__int64';; u) gltype1='unsigned int';; ul) gltype1='unsigned long int';; ull) gltype1='unsigned long long int';; ui64)gltype1='unsigned __int64';; esac AC_COMPILE_IFELSE( [AC_LANG_PROGRAM([$2[ extern $gltype foo; extern $gltype1 foo;]])], [eval gl_cv_type_${gltype}_suffix=\$glsuf]) eval result=\$gl_cv_type_${gltype}_suffix test "$result" != no && break done]) GLTYPE=`echo $gltype | tr 'abcdefghijklmnopqrstuvwxyz ' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ_'` eval result=\$gl_cv_type_${gltype}_suffix test "$result" = no && result= eval ${GLTYPE}_SUFFIX=\$result AC_DEFINE_UNQUOTED([${GLTYPE}_SUFFIX], [$result]) done m4_foreach_w([gltype], [$1], [AC_SUBST(m4_translit(gltype,[abcdefghijklmnopqrstuvwxyz ],[ABCDEFGHIJKLMNOPQRSTUVWXYZ_])[_SUFFIX])]) ]) dnl gl_STDINT_INCLUDES AC_DEFUN([gl_STDINT_INCLUDES], [[ /* BSD/OS 4.0.1 has a bug: , and must be included before . */ #include #include #if HAVE_WCHAR_H # include # include # include #endif ]]) dnl gl_STDINT_TYPE_PROPERTIES dnl Compute HAVE_SIGNED_t, BITSIZEOF_t and t_SUFFIX, for all the types t dnl of interest to stdint.in.h. AC_DEFUN([gl_STDINT_TYPE_PROPERTIES], [ AC_REQUIRE([gl_MULTIARCH]) if test $APPLE_UNIVERSAL_BUILD = 0; then gl_STDINT_BITSIZEOF([ptrdiff_t size_t], [gl_STDINT_INCLUDES]) fi gl_STDINT_BITSIZEOF([sig_atomic_t wchar_t wint_t], [gl_STDINT_INCLUDES]) gl_CHECK_TYPES_SIGNED([sig_atomic_t wchar_t wint_t], [gl_STDINT_INCLUDES]) gl_cv_type_ptrdiff_t_signed=yes gl_cv_type_size_t_signed=no if test $APPLE_UNIVERSAL_BUILD = 0; then gl_INTEGER_TYPE_SUFFIX([ptrdiff_t size_t], [gl_STDINT_INCLUDES]) fi gl_INTEGER_TYPE_SUFFIX([sig_atomic_t wchar_t wint_t], [gl_STDINT_INCLUDES]) dnl If wint_t is smaller than 'int', it cannot satisfy the ISO C 99 dnl requirement that wint_t is "unchanged by default argument promotions". dnl In this case gnulib's and override wint_t. dnl Set the variable BITSIZEOF_WINT_T accordingly. if test $GNULIB_OVERRIDES_WINT_T = 1; then BITSIZEOF_WINT_T=32 fi ]) pspp-1.4.1/gl/m4/fatal-signal.m40000644000175000017500000000065613723215637015661 0ustar00blpblp00000000000000# fatal-signal.m4 serial 9 dnl Copyright (C) 2003-2004, 2006, 2008-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_FATAL_SIGNAL], [ AC_REQUIRE([gt_TYPE_SIG_ATOMIC_T]) AC_CHECK_HEADERS_ONCE([unistd.h]) gl_PREREQ_SIG_HANDLER_H ]) pspp-1.4.1/gl/m4/fprintf-posix.m40000644000175000017500000001043013723215637016116 0ustar00blpblp00000000000000# fprintf-posix.m4 serial 14 dnl Copyright (C) 2007-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_FUNC_FPRINTF_POSIX], [ AC_REQUIRE([gl_PRINTF_SIZES_C99]) AC_REQUIRE([gl_PRINTF_LONG_DOUBLE]) AC_REQUIRE([gl_PRINTF_INFINITE]) AC_REQUIRE([gl_PRINTF_INFINITE_LONG_DOUBLE]) AC_REQUIRE([gl_PRINTF_DIRECTIVE_A]) AC_REQUIRE([gl_PRINTF_DIRECTIVE_F]) AC_REQUIRE([gl_PRINTF_DIRECTIVE_N]) AC_REQUIRE([gl_PRINTF_DIRECTIVE_LS]) AC_REQUIRE([gl_PRINTF_POSITIONS]) AC_REQUIRE([gl_PRINTF_FLAG_GROUPING]) AC_REQUIRE([gl_PRINTF_FLAG_LEFTADJUST]) AC_REQUIRE([gl_PRINTF_FLAG_ZERO]) AC_REQUIRE([gl_PRINTF_PRECISION]) AC_REQUIRE([gl_PRINTF_ENOMEM]) gl_cv_func_fprintf_posix=no case "$gl_cv_func_printf_sizes_c99" in *yes) case "$gl_cv_func_printf_long_double" in *yes) case "$gl_cv_func_printf_infinite" in *yes) case "$gl_cv_func_printf_infinite_long_double" in *yes) case "$gl_cv_func_printf_directive_a" in *yes) case "$gl_cv_func_printf_directive_f" in *yes) case "$gl_cv_func_printf_directive_n" in *yes) case "$gl_cv_func_printf_directive_ls" in *yes) case "$gl_cv_func_printf_positions" in *yes) case "$gl_cv_func_printf_flag_grouping" in *yes) case "$gl_cv_func_printf_flag_leftadjust" in *yes) case "$gl_cv_func_printf_flag_zero" in *yes) case "$gl_cv_func_printf_precision" in *yes) case "$gl_cv_func_printf_enomem" in *yes) # fprintf exists and is # already POSIX compliant. gl_cv_func_fprintf_posix=yes ;; esac ;; esac ;; esac ;; esac ;; esac ;; esac ;; esac ;; esac ;; esac ;; esac ;; esac ;; esac ;; esac ;; esac if test $gl_cv_func_fprintf_posix = no; then gl_PREREQ_VASNPRINTF_LONG_DOUBLE gl_PREREQ_VASNPRINTF_INFINITE_DOUBLE gl_PREREQ_VASNPRINTF_INFINITE_LONG_DOUBLE gl_PREREQ_VASNPRINTF_DIRECTIVE_A gl_PREREQ_VASNPRINTF_DIRECTIVE_F gl_PREREQ_VASNPRINTF_DIRECTIVE_LS gl_PREREQ_VASNPRINTF_FLAG_GROUPING gl_PREREQ_VASNPRINTF_FLAG_LEFTADJUST gl_PREREQ_VASNPRINTF_FLAG_ZERO gl_PREREQ_VASNPRINTF_PRECISION gl_PREREQ_VASNPRINTF_ENOMEM gl_REPLACE_VASNPRINTF gl_REPLACE_FPRINTF fi ]) AC_DEFUN([gl_REPLACE_FPRINTF], [ AC_REQUIRE([gl_STDIO_H_DEFAULTS]) AC_LIBOBJ([fprintf]) REPLACE_FPRINTF=1 AC_DEFINE([REPLACE_FPRINTF_POSIX], [1], [Define if fprintf is overridden by a POSIX compliant gnulib implementation.]) gl_PREREQ_FPRINTF ]) AC_DEFUN([gl_PREREQ_FPRINTF], [:]) pspp-1.4.1/gl/m4/raise.m40000644000175000017500000000177113723215637014421 0ustar00blpblp00000000000000# raise.m4 serial 4 dnl Copyright (C) 2011-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_FUNC_RAISE], [ AC_REQUIRE([gl_SIGNAL_H_DEFAULTS]) AC_REQUIRE([AC_CANONICAL_HOST]) AC_CHECK_FUNCS([raise]) if test $ac_cv_func_raise = no; then HAVE_RAISE=0 else m4_ifdef([gl_MSVC_INVAL], [ AC_REQUIRE([gl_MSVC_INVAL]) if test $HAVE_MSVC_INVALID_PARAMETER_HANDLER = 1; then REPLACE_RAISE=1 fi ]) m4_ifdef([gl_SIGNALBLOCKING], [ gl_SIGNALBLOCKING if test $HAVE_POSIX_SIGNALBLOCKING = 0; then m4_ifdef([gl_SIGNAL_SIGPIPE], [ gl_SIGNAL_SIGPIPE if test $gl_cv_header_signal_h_SIGPIPE != yes; then REPLACE_RAISE=1 fi ], [:]) fi ]) fi ]) # Prerequisites of lib/raise.c. AC_DEFUN([gl_PREREQ_RAISE], [:]) pspp-1.4.1/gl/m4/relocatable.m40000644000175000017500000001542113723215637015570 0ustar00blpblp00000000000000# relocatable.m4 serial 23 dnl Copyright (C) 2003, 2005-2007, 2009-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl From Bruno Haible. dnl gl_RELOCATABLE([RELOCWRAPPER-DIR]) dnl ---------------------------------------------------------- dnl Support for relocatable programs. dnl Supply RELOCWRAPPER-DIR as the directory where relocwrapper.c may be found. AC_DEFUN([gl_RELOCATABLE], [ AC_REQUIRE([gl_RELOCATABLE_BODY]) gl_RELOCATABLE_LIBRARY : ${RELOCATABLE_CONFIG_H_DIR='$(top_builddir)'} RELOCATABLE_SRC_DIR="\$(top_srcdir)/$gl_source_base" RELOCATABLE_BUILD_DIR="\$(top_builddir)/$gl_source_base" ]) dnl The guts of gl_RELOCATABLE. Needs to be expanded only once. AC_DEFUN([gl_RELOCATABLE_BODY], [ AC_REQUIRE([AC_PROG_INSTALL]) dnl This AC_BEFORE invocation leads to unjustified autoconf warnings dnl when gl_RELOCATABLE_BODY is invoked more than once. dnl dnl We need this AC_BEFORE because AC_PROG_INSTALL is documented to dnl overwrite earlier settings of INSTALL and INSTALL_PROGRAM (even dnl though in autoconf-2.52..2.60 it doesn't do so), but we want this dnl macro's setting of INSTALL_PROGRAM to persist. dnl Arghh: AC_BEFORE does not work in this setting :-( dnl AC_BEFORE([AC_PROG_INSTALL],[gl_RELOCATABLE_BODY]) dnl dnl LT_INIT sets LIBTOOL, but we want this macro's setting of LIBTOOL to dnl persist. dnl Arghh: AC_BEFORE does not work in this setting :-( dnl AC_BEFORE([LT_INIT],[gl_RELOCATABLE_BODY]) AC_REQUIRE([AC_LIB_LIBPATH]) AC_REQUIRE([gl_RELOCATABLE_LIBRARY_BODY]) AC_REQUIRE([AC_CANONICAL_HOST]) is_noop=no use_elf_origin_trick=no use_macos_tools=no use_wrapper=no if test $RELOCATABLE = yes; then # --enable-relocatable implies --disable-rpath enable_rpath=no AC_CHECK_HEADERS([mach-o/dyld.h]) AC_CHECK_FUNCS([_NSGetExecutablePath]) case "$host_os" in mingw*) is_noop=yes ;; # For the platforms that support $ORIGIN, see # . # glibc systems, Linux with musl libc: yes. Android: no. linux*-android*) ;; linux* | kfreebsd*) use_elf_origin_trick=yes ;; # Hurd: # only after the glibc commit from 2018-01-08 # gnu*) # Test for a glibc version >= 2.27. AC_CHECK_FUNCS([copy_file_range]) if test $ac_cv_func_copy_file_range = yes; then use_elf_origin_trick=yes fi ;; changequote(,)dnl # FreeBSD >= 7.3, DragonFly >= 3.0: yes. freebsd | freebsd[1-7] | freebsd[1-6].* | freebsd7.[0-2]) ;; dragonfly | dragonfly[1-2] | dragonfly[1-2].*) ;; freebsd* | dragonfly*) use_elf_origin_trick=yes ;; # NetBSD >= 8.0: yes. netbsd | netbsd[1-7] | netbsd[1-7].*) ;; netbsdelf | netbsdelf[1-7] | netbsdelf[1-7].*) ;; netbsd*) use_elf_origin_trick=yes ;; # OpenBSD >= 5.4: yes. openbsd | openbsd[1-5] | openbsd[1-4].* | openbsd5.[0-3]) ;; openbsd*) use_elf_origin_trick=yes ;; # Solaris >= 10: yes. solaris | solaris2.[1-9] | solaris2.[1-9].*) ;; solaris*) use_elf_origin_trick=yes ;; # Haiku: yes. haiku*) use_elf_origin_trick=yes ;; # On Mac OS X 10.4 or newer, use Mac OS X tools. See # . darwin | darwin[1-7].*) ;; darwin*) use_macos_tools=yes ;; changequote([,])dnl esac if test $is_noop = yes; then RELOCATABLE_LDFLAGS=: AC_SUBST([RELOCATABLE_LDFLAGS]) else if test $use_elf_origin_trick = yes || test $use_macos_tools = yes; then dnl Use the dynamic linker's support for relocatable programs. case "$ac_aux_dir" in /*) reloc_ldflags="$ac_aux_dir/reloc-ldflags" ;; *) reloc_ldflags="\$(top_builddir)/$ac_aux_dir/reloc-ldflags" ;; esac RELOCATABLE_LDFLAGS="\"$reloc_ldflags\" \"\$(host)\" \"\$(RELOCATABLE_LIBRARY_PATH)\"" AC_SUBST([RELOCATABLE_LDFLAGS]) if test $use_macos_tools = yes; then dnl Use a libtool wrapper that uses Mac OS X tools. case "$ac_aux_dir" in /*) LIBTOOL="${CONFIG_SHELL-$SHELL} $ac_aux_dir/libtool-reloc $LIBTOOL" ;; *) LIBTOOL="${CONFIG_SHELL-$SHELL} \$(top_builddir)/$ac_aux_dir/libtool-reloc $LIBTOOL" ;; esac fi else use_wrapper=yes dnl Unfortunately we cannot define INSTALL_PROGRAM to a command dnl consisting of more than one word - libtool doesn't support this. dnl So we abuse the INSTALL_PROGRAM_ENV hook, originally meant for the dnl 'install-strip' target. INSTALL_PROGRAM_ENV="RELOC_LIBRARY_PATH_VAR=\"$shlibpath_var\" RELOC_LIBRARY_PATH_VALUE=\"\$(RELOCATABLE_LIBRARY_PATH)\" RELOC_PREFIX=\"\$(prefix)\" RELOC_DESTDIR=\"\$(DESTDIR)\" RELOC_COMPILE_COMMAND=\"\$(CC) \$(CPPFLAGS) \$(CFLAGS) \$(LDFLAGS)\" RELOC_SRCDIR=\"\$(RELOCATABLE_SRC_DIR)\" RELOC_BUILDDIR=\"\$(RELOCATABLE_BUILD_DIR)\" RELOC_CONFIG_H_DIR=\"\$(RELOCATABLE_CONFIG_H_DIR)\" RELOC_EXEEXT=\"\$(EXEEXT)\" RELOC_STRIP_PROG=\"\$(RELOCATABLE_STRIP)\" RELOC_INSTALL_PROG=\"$INSTALL_PROGRAM\"" AC_SUBST([INSTALL_PROGRAM_ENV]) case "$ac_aux_dir" in /*) INSTALL_PROGRAM="$ac_aux_dir/install-reloc" ;; *) INSTALL_PROGRAM="\$(top_builddir)/$ac_aux_dir/install-reloc" ;; esac fi fi fi AM_CONDITIONAL([RELOCATABLE_VIA_LD], [test $is_noop = yes || test $use_elf_origin_trick = yes || test $use_macos_tools = yes]) AM_CONDITIONAL([RELOCATABLE_VIA_WRAPPER], [test $use_wrapper = yes]) dnl RELOCATABLE_LIBRARY_PATH can be set in configure.ac. Default is empty. AC_SUBST([RELOCATABLE_LIBRARY_PATH]) AC_SUBST([RELOCATABLE_CONFIG_H_DIR]) AC_SUBST([RELOCATABLE_SRC_DIR]) AC_SUBST([RELOCATABLE_BUILD_DIR]) dnl Ensure RELOCATABLE_STRIP is defined in Makefiles (at least those dnl generated by automake), with value ':'. RELOCATABLE_STRIP=':' AC_SUBST([RELOCATABLE_STRIP]) ]) dnl Determine the platform dependent parameters needed to use relocatability: dnl shlibpath_var. AC_DEFUN([AC_LIB_LIBPATH], [ AC_REQUIRE([AC_LIB_PROG_LD]) dnl we use $LD AC_REQUIRE([AC_CANONICAL_HOST]) dnl we use $host AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT]) dnl we use $ac_aux_dir AC_CACHE_CHECK([for shared library path variable], [acl_cv_libpath], [ LD="$LD" \ ${CONFIG_SHELL-/bin/sh} "$ac_aux_dir/config.libpath" "$host" > conftest.sh . ./conftest.sh rm -f ./conftest.sh acl_cv_libpath=${acl_cv_shlibpath_var:-none} ]) shlibpath_var="$acl_cv_shlibpath_var" ]) pspp-1.4.1/gl/m4/langinfo_h.m40000644000175000017500000000772013723215637015422 0ustar00blpblp00000000000000# langinfo_h.m4 serial 8 dnl Copyright (C) 2009-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_LANGINFO_H], [ AC_REQUIRE([gl_LANGINFO_H_DEFAULTS]) dnl Persuade glibc-2.0.6 to define CODESET. AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS]) dnl is always overridden, because of GNULIB_POSIXCHECK. gl_CHECK_NEXT_HEADERS([langinfo.h]) dnl Determine whether exists. It is missing on mingw and BeOS. HAVE_LANGINFO_CODESET=0 HAVE_LANGINFO_T_FMT_AMPM=0 HAVE_LANGINFO_ALTMON=0 HAVE_LANGINFO_ERA=0 HAVE_LANGINFO_YESEXPR=0 AC_CHECK_HEADERS_ONCE([langinfo.h]) if test $ac_cv_header_langinfo_h = yes; then HAVE_LANGINFO_H=1 dnl Determine what defines. CODESET and ERA etc. are missing dnl on OpenBSD 3.8. T_FMT_AMPM and YESEXPR, NOEXPR are missing on IRIX 5.3. dnl ALTMON_* are missing on glibc 2.26 and many other systems. AC_CACHE_CHECK([whether langinfo.h defines CODESET], [gl_cv_header_langinfo_codeset], [AC_COMPILE_IFELSE( [AC_LANG_PROGRAM([[#include int a = CODESET; ]])], [gl_cv_header_langinfo_codeset=yes], [gl_cv_header_langinfo_codeset=no]) ]) if test $gl_cv_header_langinfo_codeset = yes; then HAVE_LANGINFO_CODESET=1 fi AC_CACHE_CHECK([whether langinfo.h defines T_FMT_AMPM], [gl_cv_header_langinfo_t_fmt_ampm], [AC_COMPILE_IFELSE( [AC_LANG_PROGRAM([[#include int a = T_FMT_AMPM; ]])], [gl_cv_header_langinfo_t_fmt_ampm=yes], [gl_cv_header_langinfo_t_fmt_ampm=no]) ]) if test $gl_cv_header_langinfo_t_fmt_ampm = yes; then HAVE_LANGINFO_T_FMT_AMPM=1 fi AC_CACHE_CHECK([whether langinfo.h defines ALTMON_1], [gl_cv_header_langinfo_altmon], [AC_COMPILE_IFELSE( [AC_LANG_PROGRAM([[#include int a = ALTMON_1; ]])], [gl_cv_header_langinfo_altmon=yes], [gl_cv_header_langinfo_altmon=no]) ]) if test $gl_cv_header_langinfo_altmon = yes; then HAVE_LANGINFO_ALTMON=1 fi AC_CACHE_CHECK([whether langinfo.h defines ERA], [gl_cv_header_langinfo_era], [AC_COMPILE_IFELSE( [AC_LANG_PROGRAM([[#include int a = ERA; ]])], [gl_cv_header_langinfo_era=yes], [gl_cv_header_langinfo_era=no]) ]) if test $gl_cv_header_langinfo_era = yes; then HAVE_LANGINFO_ERA=1 fi AC_CACHE_CHECK([whether langinfo.h defines YESEXPR], [gl_cv_header_langinfo_yesexpr], [AC_COMPILE_IFELSE( [AC_LANG_PROGRAM([[#include int a = YESEXPR; ]])], [gl_cv_header_langinfo_yesexpr=yes], [gl_cv_header_langinfo_yesexpr=no]) ]) if test $gl_cv_header_langinfo_yesexpr = yes; then HAVE_LANGINFO_YESEXPR=1 fi else HAVE_LANGINFO_H=0 fi AC_SUBST([HAVE_LANGINFO_H]) AC_SUBST([HAVE_LANGINFO_CODESET]) AC_SUBST([HAVE_LANGINFO_T_FMT_AMPM]) AC_SUBST([HAVE_LANGINFO_ALTMON]) AC_SUBST([HAVE_LANGINFO_ERA]) AC_SUBST([HAVE_LANGINFO_YESEXPR]) dnl Check for declarations of anything we want to poison if the dnl corresponding gnulib module is not in use. gl_WARN_ON_USE_PREPARE([[#include ]], [nl_langinfo]) ]) AC_DEFUN([gl_LANGINFO_MODULE_INDICATOR], [ dnl Use AC_REQUIRE here, so that the default settings are expanded once only. AC_REQUIRE([gl_LANGINFO_H_DEFAULTS]) gl_MODULE_INDICATOR_SET_VARIABLE([$1]) dnl Define it also as a C macro, for the benefit of the unit tests. gl_MODULE_INDICATOR_FOR_TESTS([$1]) ]) AC_DEFUN([gl_LANGINFO_H_DEFAULTS], [ GNULIB_NL_LANGINFO=0; AC_SUBST([GNULIB_NL_LANGINFO]) dnl Assume proper GNU behavior unless another module says otherwise. HAVE_NL_LANGINFO=1; AC_SUBST([HAVE_NL_LANGINFO]) REPLACE_NL_LANGINFO=0; AC_SUBST([REPLACE_NL_LANGINFO]) ]) pspp-1.4.1/gl/m4/gettimeofday.m40000644000175000017500000000532013723215637015771 0ustar00blpblp00000000000000# serial 28 # Copyright (C) 2001-2003, 2005, 2007, 2009-2020 Free Software Foundation, Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. dnl From Jim Meyering. AC_DEFUN([gl_FUNC_GETTIMEOFDAY], [ AC_REQUIRE([gl_HEADER_SYS_TIME_H_DEFAULTS]) AC_REQUIRE([AC_C_RESTRICT]) AC_REQUIRE([AC_CANONICAL_HOST]) AC_REQUIRE([gl_HEADER_SYS_TIME_H]) AC_CHECK_FUNCS_ONCE([gettimeofday]) gl_gettimeofday_timezone=void if test $ac_cv_func_gettimeofday != yes; then HAVE_GETTIMEOFDAY=0 else AC_CACHE_CHECK([for gettimeofday with POSIX signature], [gl_cv_func_gettimeofday_posix_signature], [AC_COMPILE_IFELSE( [AC_LANG_PROGRAM( [[#include struct timeval c; int gettimeofday (struct timeval *restrict, void *restrict); ]], [[/* glibc uses struct timezone * rather than the POSIX void * if _GNU_SOURCE is defined. However, since the only portable use of gettimeofday uses NULL as the second parameter, and since the glibc definition is actually more typesafe, it is not worth wrapping this to get a compliant signature. */ int (*f) (struct timeval *restrict, void *restrict) = gettimeofday; int x = f (&c, 0); return !(x | c.tv_sec | c.tv_usec); ]])], [gl_cv_func_gettimeofday_posix_signature=yes], [AC_COMPILE_IFELSE( [AC_LANG_PROGRAM( [[#include int gettimeofday (struct timeval *restrict, struct timezone *restrict); ]])], [gl_cv_func_gettimeofday_posix_signature=almost], [gl_cv_func_gettimeofday_posix_signature=no])])]) if test $gl_cv_func_gettimeofday_posix_signature = almost; then gl_gettimeofday_timezone='struct timezone' elif test $gl_cv_func_gettimeofday_posix_signature != yes; then REPLACE_GETTIMEOFDAY=1 fi dnl If we override 'struct timeval', we also have to override gettimeofday. if test $REPLACE_STRUCT_TIMEVAL = 1; then REPLACE_GETTIMEOFDAY=1 fi dnl On mingw, the original gettimeofday has only a precision of 15.6 dnl milliseconds. So override it. case "$host_os" in mingw*) REPLACE_GETTIMEOFDAY=1 ;; esac fi AC_DEFINE_UNQUOTED([GETTIMEOFDAY_TIMEZONE], [$gl_gettimeofday_timezone], [Define this to 'void' or 'struct timezone' to match the system's declaration of the second argument to gettimeofday.]) ]) # Prerequisites of lib/gettimeofday.c. AC_DEFUN([gl_PREREQ_GETTIMEOFDAY], [:]) pspp-1.4.1/gl/m4/fcntl_h.m40000644000175000017500000000343613723215637014733 0ustar00blpblp00000000000000# serial 16 # Configure fcntl.h. dnl Copyright (C) 2006-2007, 2009-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl Written by Paul Eggert. AC_DEFUN([gl_FCNTL_H], [ AC_REQUIRE([gl_FCNTL_H_DEFAULTS]) AC_REQUIRE([gl_FCNTL_O_FLAGS]) gl_NEXT_HEADERS([fcntl.h]) dnl Ensure the type pid_t gets defined. AC_REQUIRE([AC_TYPE_PID_T]) dnl Ensure the type mode_t gets defined. AC_REQUIRE([AC_TYPE_MODE_T]) dnl Check for declarations of anything we want to poison if the dnl corresponding gnulib module is not in use, if it is not common dnl enough to be declared everywhere. gl_WARN_ON_USE_PREPARE([[#include ]], [fcntl openat]) ]) AC_DEFUN([gl_FCNTL_MODULE_INDICATOR], [ dnl Use AC_REQUIRE here, so that the default settings are expanded once only. AC_REQUIRE([gl_FCNTL_H_DEFAULTS]) gl_MODULE_INDICATOR_SET_VARIABLE([$1]) dnl Define it also as a C macro, for the benefit of the unit tests. gl_MODULE_INDICATOR_FOR_TESTS([$1]) ]) AC_DEFUN([gl_FCNTL_H_DEFAULTS], [ GNULIB_CREAT=0; AC_SUBST([GNULIB_CREAT]) GNULIB_FCNTL=0; AC_SUBST([GNULIB_FCNTL]) GNULIB_NONBLOCKING=0; AC_SUBST([GNULIB_NONBLOCKING]) GNULIB_OPEN=0; AC_SUBST([GNULIB_OPEN]) GNULIB_OPENAT=0; AC_SUBST([GNULIB_OPENAT]) dnl Assume proper GNU behavior unless another module says otherwise. HAVE_FCNTL=1; AC_SUBST([HAVE_FCNTL]) HAVE_OPENAT=1; AC_SUBST([HAVE_OPENAT]) REPLACE_CREAT=0; AC_SUBST([REPLACE_CREAT]) REPLACE_FCNTL=0; AC_SUBST([REPLACE_FCNTL]) REPLACE_OPEN=0; AC_SUBST([REPLACE_OPEN]) REPLACE_OPENAT=0; AC_SUBST([REPLACE_OPENAT]) ]) pspp-1.4.1/gl/m4/strncat.m40000644000175000017500000000570413723215637014774 0ustar00blpblp00000000000000# strncat.m4 serial 4 dnl Copyright (C) 2002-2004, 2009-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN_ONCE([gl_FUNC_STRNCAT], [ AC_REQUIRE([gl_HEADER_STRING_H_DEFAULTS]) AC_REQUIRE([AC_PROG_CC]) AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles dnl Check for prerequisites for memory fence checks. gl_FUNC_MMAP_ANON AC_CHECK_HEADERS_ONCE([sys/mman.h]) AC_CHECK_FUNCS_ONCE([mprotect]) dnl Detect bug in Solaris 8..10 on SPARC and Solaris 11.0 on x86: dnl strncat should not dereference more than n bytes, but always dereferences dnl n+1 bytes if the first n bytes don't contain a NUL byte. dnl Assume that strncat works on platforms that lack mprotect. AC_CACHE_CHECK([whether strncat works], [gl_cv_func_strncat_works], [AC_RUN_IFELSE([AC_LANG_PROGRAM([[ #include #if HAVE_SYS_MMAN_H # include # include # include # include # ifndef MAP_FILE # define MAP_FILE 0 # endif #endif ]], [[ char *fence = NULL; #if HAVE_SYS_MMAN_H && HAVE_MPROTECT # if HAVE_MAP_ANONYMOUS const int flags = MAP_ANONYMOUS | MAP_PRIVATE; const int fd = -1; # else /* !HAVE_MAP_ANONYMOUS */ const int flags = MAP_FILE | MAP_PRIVATE; int fd = open ("/dev/zero", O_RDONLY, 0666); if (fd >= 0) # endif { int pagesize = getpagesize (); char *two_pages = (char *) mmap (NULL, 2 * pagesize, PROT_READ | PROT_WRITE, flags, fd, 0); if (two_pages != (char *)(-1) && mprotect (two_pages + pagesize, pagesize, PROT_NONE) == 0) fence = two_pages + pagesize; } #endif if (fence) { char dest[8]; dest[0] = '*'; dest[1] = 'a'; dest[2] = '\0'; dest[3] = 'w'; dest[4] = 'x'; dest[5] = 'y'; dest[6] = 'z'; *(fence - 3) = '7'; *(fence - 2) = '2'; *(fence - 1) = '9'; if (strncat (dest + 1, fence - 3, 3) != dest + 1) return 1; if (dest[0] != '*') return 2; if (dest[1] != 'a' || dest[2] != '7' || dest[3] != '2' || dest[4] != '9' || dest[5] != '\0') return 3; if (dest[6] != 'z') return 4; } return 0; ]])], [gl_cv_func_strncat_works=yes], [gl_cv_func_strncat_works=no], [ case "$host_os" in # Guess no on Solaris. solaris*) gl_cv_func_strncat_works="guessing no" ;; # Guess yes on native Windows. mingw*) gl_cv_func_strncat_works="guessing yes" ;; # Guess yes otherwise. *) gl_cv_func_strncat_works="guessing yes" ;; esac ]) ]) case "$gl_cv_func_strncat_works" in *yes) ;; *) REPLACE_STRNCAT=1 ;; esac ]) # Prerequisites of lib/strncat.c. AC_DEFUN([gl_PREREQ_STRNCAT], [ : ]) pspp-1.4.1/gl/m4/gettime.m40000644000175000017500000000070713723556150014750 0ustar00blpblp00000000000000# gettime.m4 serial 9 dnl Copyright (C) 2002, 2004-2006, 2009-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_GETTIME], [ dnl Prerequisites of lib/gettime.c. AC_REQUIRE([gl_CLOCK_TIME]) AC_REQUIRE([gl_TIMESPEC]) AC_CHECK_FUNCS_ONCE([gettimeofday]) ]) pspp-1.4.1/gl/m4/time_r.m40000644000175000017500000000653413723215637014577 0ustar00blpblp00000000000000dnl Reentrant time functions: localtime_r, gmtime_r. dnl Copyright (C) 2003, 2006-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl Written by Paul Eggert. AC_DEFUN([gl_TIME_R], [ dnl Persuade glibc and Solaris to declare localtime_r. AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS]) AC_REQUIRE([gl_HEADER_TIME_H_DEFAULTS]) AC_REQUIRE([AC_C_RESTRICT]) dnl Some systems don't declare localtime_r() and gmtime_r() if _REENTRANT is dnl not defined. AC_CHECK_DECLS([localtime_r], [], [], [[/* mingw's provides the functions asctime_r, ctime_r, gmtime_r, localtime_r only if or has been included before. */ #if defined __MINGW32__ # include #endif #include ]]) if test $ac_cv_have_decl_localtime_r = no; then HAVE_DECL_LOCALTIME_R=0 fi AC_CHECK_FUNCS_ONCE([localtime_r]) if test $ac_cv_func_localtime_r = yes; then HAVE_LOCALTIME_R=1 AC_CACHE_CHECK([whether localtime_r is compatible with its POSIX signature], [gl_cv_time_r_posix], [AC_COMPILE_IFELSE( [AC_LANG_PROGRAM( [[/* mingw's provides the functions asctime_r, ctime_r, gmtime_r, localtime_r only if or has been included before. */ #if defined __MINGW32__ # include #endif #include ]], [[/* We don't need to append 'restrict's to the argument types, even though the POSIX signature has the 'restrict's, since C99 says they can't affect type compatibility. */ struct tm * (*ptr) (time_t const *, struct tm *) = localtime_r; if (ptr) return 0; /* Check the return type is a pointer. On HP-UX 10 it is 'int'. */ *localtime_r (0, 0);]]) ], [gl_cv_time_r_posix=yes], [gl_cv_time_r_posix=no]) ]) if test $gl_cv_time_r_posix = yes; then REPLACE_LOCALTIME_R=0 else REPLACE_LOCALTIME_R=1 fi else HAVE_LOCALTIME_R=0 dnl On mingw, localtime_r() is defined as an inline function; use through a dnl direct function call works but the use as a function pointer leads to a dnl link error. AC_CACHE_CHECK([whether localtime_r exists as an inline function], [gl_cv_func_localtime_r_inline], [AC_LINK_IFELSE( [AC_LANG_PROGRAM( [[/* mingw's provides the functions asctime_r, ctime_r, gmtime_r, localtime_r only if or has been included before. */ #if defined __MINGW32__ # include #endif #include ]], [[time_t a; struct tm r; localtime_r (&a, &r); ]]) ], [gl_cv_func_localtime_r_inline=yes], [gl_cv_func_localtime_r_inline=no]) ]) if test $gl_cv_func_localtime_r_inline = yes; then REPLACE_LOCALTIME_R=1 fi fi ]) # Prerequisites of lib/time_r.c. AC_DEFUN([gl_PREREQ_TIME_R], [ : ]) pspp-1.4.1/gl/m4/timegm.m40000644000175000017500000000132713723215637014575 0ustar00blpblp00000000000000# timegm.m4 serial 12 dnl Copyright (C) 2003, 2007, 2009-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_FUNC_TIMEGM], [ AC_REQUIRE([gl_HEADER_TIME_H_DEFAULTS]) AC_REQUIRE([gl_FUNC_MKTIME_WORKS]) REPLACE_TIMEGM=0 AC_CHECK_FUNCS_ONCE([timegm]) if test $ac_cv_func_timegm = yes; then if test "$gl_cv_func_working_mktime" != yes; then # Assume that timegm is buggy if mktime is. REPLACE_TIMEGM=1 fi else HAVE_TIMEGM=0 fi ]) # Prerequisites of lib/timegm.c. AC_DEFUN([gl_PREREQ_TIMEGM], [ : ]) pspp-1.4.1/gl/m4/signbit.m40000644000175000017500000003105713723215637014755 0ustar00blpblp00000000000000# signbit.m4 serial 20 dnl Copyright (C) 2007-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_SIGNBIT], [ AC_REQUIRE([gl_MATH_H_DEFAULTS]) AC_REQUIRE([AC_CANONICAL_HOST]) AC_CACHE_CHECK([for signbit macro], [gl_cv_func_signbit], [ AC_RUN_IFELSE( [AC_LANG_SOURCE([[ #include /* If signbit is defined as a function, don't use it, since calling it for 'float' or 'long double' arguments would involve conversions. If signbit is not declared at all but exists as a library function, don't use it, since the prototype may not match. If signbit is not declared at all but exists as a compiler built-in, don't use it, since it's preferable to use __builtin_signbit* (no warnings, no conversions). */ #ifndef signbit # error "signbit should be a macro" #endif #include ]gl_SIGNBIT_TEST_PROGRAM ])], [gl_cv_func_signbit=yes], [gl_cv_func_signbit=no], [case "$host_os" in # Guess yes on glibc systems. *-gnu* | gnu*) gl_cv_func_signbit="guessing yes" ;; # Guess yes on musl systems. *-musl*) gl_cv_func_signbit="guessing yes" ;; # Guess yes on native Windows. mingw*) gl_cv_func_signbit="guessing yes" ;; # If we don't know, obey --enable-cross-guesses. *) gl_cv_func_signbit="$gl_cross_guess_normal" ;; esac ]) ]) dnl GCC >= 4.0 and clang provide three built-ins for signbit. dnl They can be used without warnings, also in C++, regardless of . dnl But they may expand to calls to functions, which may or may not be in dnl libc. AC_CACHE_CHECK([for signbit compiler built-ins], [gl_cv_func_signbit_builtins], [ AC_RUN_IFELSE( [AC_LANG_SOURCE([[ #if (__GNUC__ >= 4) || (__clang_major__ >= 4) # define signbit(x) \ (sizeof (x) == sizeof (long double) ? __builtin_signbitl (x) : \ sizeof (x) == sizeof (double) ? __builtin_signbit (x) : \ __builtin_signbitf (x)) #else # error "signbit should be three compiler built-ins" #endif #include ]gl_SIGNBIT_TEST_PROGRAM ])], [gl_cv_func_signbit_builtins=yes], [gl_cv_func_signbit_builtins=no], [case "$host_os" in # Guess yes on glibc systems. *-gnu* | gnu*) gl_cv_func_signbit_builtins="guessing yes" ;; # Guess yes on musl systems. *-musl*) gl_cv_func_signbit_builtins="guessing yes" ;; # Guess yes on mingw, no on MSVC. mingw*) if test -n "$GCC"; then gl_cv_func_signbit_builtins="guessing yes" else gl_cv_func_signbit_builtins="guessing no" fi ;; # If we don't know, obey --enable-cross-guesses. *) gl_cv_func_signbit_builtins="$gl_cross_guess_normal" ;; esac ]) ]) dnl Use the compiler built-ins whenever possible, because they are more dnl efficient than the system library functions (if they exist). case "$gl_cv_func_signbit_builtins" in *yes) REPLACE_SIGNBIT_USING_BUILTINS=1 ;; *) case "$gl_cv_func_signbit" in *yes) ;; *) dnl REPLACE_SIGNBIT=1 makes sure the signbit[fdl] functions get built. REPLACE_SIGNBIT=1 ;; esac ;; esac dnl On Solaris 10, with CC in C++ mode, signbit is not available although dnl is with cc in C mode. This cannot be worked around by defining dnl _XOPEN_SOURCE=600, because the latter does not work in C++ mode on dnl Solaris 11.0. Therefore use the replacement functions on Solaris. case "$host_os" in solaris*) REPLACE_SIGNBIT=1 ;; esac if test $REPLACE_SIGNBIT = 1; then gl_FLOAT_SIGN_LOCATION gl_DOUBLE_SIGN_LOCATION gl_LONG_DOUBLE_SIGN_LOCATION if test "$gl_cv_cc_float_signbit" = unknown; then dnl Test whether copysignf() is declared. AC_CHECK_DECLS([copysignf], , , [[#include ]]) if test "$ac_cv_have_decl_copysignf" = yes; then dnl Test whether copysignf() can be used without libm. AC_CACHE_CHECK([whether copysignf can be used without linking with libm], [gl_cv_func_copysignf_no_libm], [ AC_LINK_IFELSE( [AC_LANG_PROGRAM( [[#include float x, y;]], [[return copysignf (x, y) < 0;]])], [gl_cv_func_copysignf_no_libm=yes], [gl_cv_func_copysignf_no_libm=no]) ]) if test $gl_cv_func_copysignf_no_libm = yes; then AC_DEFINE([HAVE_COPYSIGNF_IN_LIBC], [1], [Define if the copysignf function is declared in and available in libc.]) fi fi fi if test "$gl_cv_cc_double_signbit" = unknown; then dnl Test whether copysign() is declared. AC_CHECK_DECLS([copysign], , , [[#include ]]) if test "$ac_cv_have_decl_copysign" = yes; then dnl Test whether copysign() can be used without libm. AC_CACHE_CHECK([whether copysign can be used without linking with libm], [gl_cv_func_copysign_no_libm], [ AC_LINK_IFELSE( [AC_LANG_PROGRAM( [[#include double x, y;]], [[return copysign (x, y) < 0;]])], [gl_cv_func_copysign_no_libm=yes], [gl_cv_func_copysign_no_libm=no]) ]) if test $gl_cv_func_copysign_no_libm = yes; then AC_DEFINE([HAVE_COPYSIGN_IN_LIBC], [1], [Define if the copysign function is declared in and available in libc.]) fi fi fi if test "$gl_cv_cc_long_double_signbit" = unknown; then dnl Test whether copysignl() is declared. AC_CHECK_DECLS([copysignl], , , [[#include ]]) if test "$ac_cv_have_decl_copysignl" = yes; then dnl Test whether copysignl() can be used without libm. AC_CACHE_CHECK([whether copysignl can be used without linking with libm], [gl_cv_func_copysignl_no_libm], [ AC_LINK_IFELSE( [AC_LANG_PROGRAM( [[#include long double x, y;]], [[return copysignl (x, y) < 0;]])], [gl_cv_func_copysignl_no_libm=yes], [gl_cv_func_copysignl_no_libm=no]) ]) if test $gl_cv_func_copysignl_no_libm = yes; then AC_DEFINE([HAVE_COPYSIGNL_IN_LIBC], [1], [Define if the copysignl function is declared in and available in libc.]) fi fi fi fi ]) AC_DEFUN([gl_SIGNBIT_TEST_PROGRAM], [[ /* Global variables. Needed because GCC 4 constant-folds __builtin_signbitl (literal) but cannot constant-fold __builtin_signbitl (variable). */ float vf; double vd; long double vl; int main () { /* HP cc on HP-UX 10.20 has a bug with the constant expression -0.0. So we use -p0f and -p0d instead. */ float p0f = 0.0f; float m0f = -p0f; double p0d = 0.0; double m0d = -p0d; /* On HP-UX 10.20, negating 0.0L does not yield -0.0L. So we use another constant expression instead. But that expression does not work on other platforms, such as when cross-compiling to PowerPC on Mac OS X 10.5. */ long double p0l = 0.0L; #if defined __hpux || defined __sgi long double m0l = -LDBL_MIN * LDBL_MIN; #else long double m0l = -p0l; #endif int result = 0; if (signbit (vf)) /* link check */ vf++; { float plus_inf = 1.0f / p0f; float minus_inf = -1.0f / p0f; if (!(!signbit (255.0f) && signbit (-255.0f) && !signbit (p0f) && (memcmp (&m0f, &p0f, sizeof (float)) == 0 || signbit (m0f)) && !signbit (plus_inf) && signbit (minus_inf))) result |= 1; } if (signbit (vd)) /* link check */ vd++; { double plus_inf = 1.0 / p0d; double minus_inf = -1.0 / p0d; if (!(!signbit (255.0) && signbit (-255.0) && !signbit (p0d) && (memcmp (&m0d, &p0d, sizeof (double)) == 0 || signbit (m0d)) && !signbit (plus_inf) && signbit (minus_inf))) result |= 2; } if (signbit (vl)) /* link check */ vl++; { long double plus_inf = 1.0L / p0l; long double minus_inf = -1.0L / p0l; if (signbit (255.0L)) result |= 4; if (!signbit (-255.0L)) result |= 4; if (signbit (p0l)) result |= 8; if (!(memcmp (&m0l, &p0l, sizeof (long double)) == 0 || signbit (m0l))) result |= 16; if (signbit (plus_inf)) result |= 32; if (!signbit (minus_inf)) result |= 64; } return result; } ]]) AC_DEFUN([gl_FLOAT_SIGN_LOCATION], [ gl_FLOATTYPE_SIGN_LOCATION([float], [gl_cv_cc_float_signbit], [f], [FLT]) ]) AC_DEFUN([gl_DOUBLE_SIGN_LOCATION], [ gl_FLOATTYPE_SIGN_LOCATION([double], [gl_cv_cc_double_signbit], [], [DBL]) ]) AC_DEFUN([gl_LONG_DOUBLE_SIGN_LOCATION], [ gl_FLOATTYPE_SIGN_LOCATION([long double], [gl_cv_cc_long_double_signbit], [L], [LDBL]) ]) AC_DEFUN([gl_FLOATTYPE_SIGN_LOCATION], [ AC_CACHE_CHECK([where to find the sign bit in a '$1'], [$2], [ AC_RUN_IFELSE( [AC_LANG_SOURCE([[ #include #include #define NWORDS \ ((sizeof ($1) + sizeof (unsigned int) - 1) / sizeof (unsigned int)) typedef union { $1 value; unsigned int word[NWORDS]; } memory_float; static memory_float plus = { 1.0$3 }; static memory_float minus = { -1.0$3 }; int main () { size_t j, k, i; unsigned int m; FILE *fp = fopen ("conftest.out", "w"); if (fp == NULL) return 1; /* Find the different bit. */ k = 0; m = 0; for (j = 0; j < NWORDS; j++) { unsigned int x = plus.word[j] ^ minus.word[j]; if ((x & (x - 1)) || (x && m)) { /* More than one bit difference. */ fprintf (fp, "unknown"); fclose (fp); return 2; } if (x) { k = j; m = x; } } if (m == 0) { /* No difference. */ fprintf (fp, "unknown"); fclose (fp); return 3; } /* Now m = plus.word[k] ^ ~minus.word[k]. */ if (plus.word[k] & ~minus.word[k]) { /* Oh? The sign bit is set in the positive and cleared in the negative numbers? */ fprintf (fp, "unknown"); fclose (fp); return 4; } for (i = 0; ; i++) if ((m >> i) & 1) break; fprintf (fp, "word %d bit %d", (int) k, (int) i); if (fclose (fp) != 0) return 5; return 0; } ]])], [$2=`cat conftest.out`], [$2="unknown"], [ dnl When cross-compiling, we don't know. It depends on the dnl ABI and compiler version. There are too many cases. $2="unknown" ]) rm -f conftest.out ]) case "$]$2[" in word*bit*) word=`echo "$]$2[" | sed -e 's/word //' -e 's/ bit.*//'` bit=`echo "$]$2[" | sed -e 's/word.*bit //'` AC_DEFINE_UNQUOTED([$4][_SIGNBIT_WORD], [$word], [Define as the word index where to find the sign of '$1'.]) AC_DEFINE_UNQUOTED([$4][_SIGNBIT_BIT], [$bit], [Define as the bit index in the word where to find the sign of '$1'.]) ;; esac ]) # Expands to code that defines a function signbitf(float). # It extracts the sign bit of a non-NaN value. AC_DEFUN([gl_FLOAT_SIGNBIT_CODE], [ gl_FLOATTYPE_SIGNBIT_CODE([float], [f], [f]) ]) # Expands to code that defines a function signbitd(double). # It extracts the sign bit of a non-NaN value. AC_DEFUN([gl_DOUBLE_SIGNBIT_CODE], [ gl_FLOATTYPE_SIGNBIT_CODE([double], [d], []) ]) # Expands to code that defines a function signbitl(long double). # It extracts the sign bit of a non-NaN value. AC_DEFUN([gl_LONG_DOUBLE_SIGNBIT_CODE], [ gl_FLOATTYPE_SIGNBIT_CODE([long double], [l], [L]) ]) AC_DEFUN([gl_FLOATTYPE_SIGNBIT_CODE], [[ static int signbit$2 ($1 value) { typedef union { $1 f; unsigned char b[sizeof ($1)]; } float_union; static float_union plus_one = { 1.0$3 }; /* unused bits are zero here */ static float_union minus_one = { -1.0$3 }; /* unused bits are zero here */ /* Compute the sign bit mask as the XOR of plus_one and minus_one. */ float_union u; unsigned int i; u.f = value; for (i = 0; i < sizeof ($1); i++) if (u.b[i] & (plus_one.b[i] ^ minus_one.b[i])) return 1; return 0; } ]]) pspp-1.4.1/gl/m4/safe-write.m40000644000175000017500000000061113723215637015354 0ustar00blpblp00000000000000# safe-write.m4 serial 4 dnl Copyright (C) 2002, 2005-2006, 2009-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. # Prerequisites of lib/safe-write.c. AC_DEFUN([gl_PREREQ_SAFE_WRITE], [ gl_PREREQ_SAFE_READ ]) pspp-1.4.1/gl/m4/select.m40000644000175000017500000000665113723215637014577 0ustar00blpblp00000000000000# select.m4 serial 11 dnl Copyright (C) 2009-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_FUNC_SELECT], [ AC_REQUIRE([gl_HEADER_SYS_SELECT]) AC_REQUIRE([AC_C_RESTRICT]) AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles AC_REQUIRE([gl_SOCKETS]) if test "$ac_cv_header_winsock2_h" = yes; then REPLACE_SELECT=1 else dnl On Interix 3.5, select(0, NULL, NULL, NULL, timeout) fails with error dnl EFAULT. AC_CHECK_HEADERS_ONCE([sys/select.h]) AC_CACHE_CHECK([whether select supports a 0 argument], [gl_cv_func_select_supports0], [ AC_RUN_IFELSE([AC_LANG_SOURCE([[ #include #include #if HAVE_SYS_SELECT_H #include #endif int main () { struct timeval timeout; timeout.tv_sec = 0; timeout.tv_usec = 5; return select (0, (fd_set *)0, (fd_set *)0, (fd_set *)0, &timeout) < 0; }]])], [gl_cv_func_select_supports0=yes], [gl_cv_func_select_supports0=no], [ changequote(,)dnl case "$host_os" in # Guess no on Interix. interix*) gl_cv_func_select_supports0="guessing no";; # Guess yes otherwise. *) gl_cv_func_select_supports0="guessing yes";; esac changequote([,])dnl ]) ]) case "$gl_cv_func_select_supports0" in *yes) ;; *) REPLACE_SELECT=1 ;; esac dnl On FreeBSD 8.2, select() doesn't always reject bad fds. AC_CACHE_CHECK([whether select detects invalid fds], [gl_cv_func_select_detects_ebadf], [ AC_RUN_IFELSE([AC_LANG_PROGRAM([[ #include #include #if HAVE_SYS_SELECT_H # include #endif #include #include ]],[[ fd_set set; dup2(0, 16); FD_ZERO(&set); FD_SET(16, &set); close(16); struct timeval timeout; timeout.tv_sec = 0; timeout.tv_usec = 5; return select (17, &set, NULL, NULL, &timeout) != -1 || errno != EBADF; ]])], [gl_cv_func_select_detects_ebadf=yes], [gl_cv_func_select_detects_ebadf=no], [ case "$host_os" in # Guess yes on Linux systems. linux-* | linux) gl_cv_func_select_detects_ebadf="guessing yes" ;; # Guess yes on glibc systems. *-gnu* | gnu*) gl_cv_func_select_detects_ebadf="guessing yes" ;; # If we don't know, obey --enable-cross-guesses. *) gl_cv_func_select_detects_ebadf="$gl_cross_guess_normal" ;; esac ]) ]) case $gl_cv_func_select_detects_ebadf in *yes) ;; *) REPLACE_SELECT=1 ;; esac fi dnl Determine the needed libraries. LIB_SELECT="$LIBSOCKET" if test $REPLACE_SELECT = 1; then case "$host_os" in mingw*) dnl On the MSVC platform, the function MsgWaitForMultipleObjects dnl (used in lib/select.c) requires linking with -luser32. On mingw, dnl it is implicit. AC_LINK_IFELSE( [AC_LANG_SOURCE([[ #define WIN32_LEAN_AND_MEAN #include int main () { MsgWaitForMultipleObjects (0, NULL, 0, 0, 0); return 0; }]])], [], [LIB_SELECT="$LIB_SELECT -luser32"]) ;; esac fi AC_SUBST([LIB_SELECT]) ]) pspp-1.4.1/gl/m4/libunistring-base.m40000644000175000017500000001426013723215637016734 0ustar00blpblp00000000000000# libunistring-base.m4 serial 5 dnl Copyright (C) 2010-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl From Paolo Bonzini and Bruno Haible. dnl gl_LIBUNISTRING_MODULE([VERSION], [Module]) dnl Declares that the source files of Module should be compiled, unless we dnl are linking with libunistring and its version is >= the given VERSION. dnl Defines an automake conditional LIBUNISTRING_COMPILE_$MODULE that is dnl true if the source files of Module should be compiled. dnl This macro is to be used for public libunistring API, not for dnl undocumented API. dnl dnl You have to bump the VERSION argument to the next projected version dnl number each time you make a change that affects the behaviour of the dnl functions defined in Module (even if the sources of Module itself do not dnl change). AC_DEFUN([gl_LIBUNISTRING_MODULE], [ AC_REQUIRE([gl_LIBUNISTRING_LIB_PREPARE]) dnl Use the variables HAVE_LIBUNISTRING, LIBUNISTRING_VERSION from dnl gl_LIBUNISTRING_CORE if that macro has been run. AM_CONDITIONAL(AS_TR_CPP([LIBUNISTRING_COMPILE_$2]), [gl_LIBUNISTRING_VERSION_CMP([$1])]) ]) dnl gl_LIBUNISTRING_LIBHEADER([VERSION], [HeaderFile]) dnl Declares that HeaderFile should be created, unless we are linking dnl with libunistring and its version is >= the given VERSION. dnl HeaderFile should be relative to the lib directory and end in '.h'. dnl Prepares for substituting LIBUNISTRING_HEADERFILE (to HeaderFile or empty). dnl dnl When we are linking with the already installed libunistring and its version dnl is < VERSION, we create HeaderFile here, because we may compile functions dnl (via gl_LIBUNISTRING_MODULE above) that are not contained in the installed dnl version. dnl When we are linking with the already installed libunistring and its version dnl is > VERSION, we don't create HeaderFile here: it could cause compilation dnl errors in other libunistring header files if some types are missing. dnl dnl You have to bump the VERSION argument to the next projected version dnl number each time you make a non-comment change to the HeaderFile. AC_DEFUN([gl_LIBUNISTRING_LIBHEADER], [ AC_REQUIRE([gl_LIBUNISTRING_LIB_PREPARE]) dnl Use the variables HAVE_LIBUNISTRING, LIBUNISTRING_VERSION from dnl gl_LIBUNISTRING_CORE if that macro has been run. if gl_LIBUNISTRING_VERSION_CMP([$1]); then LIBUNISTRING_[]AS_TR_CPP([$2])='$2' else LIBUNISTRING_[]AS_TR_CPP([$2])= fi AC_SUBST([LIBUNISTRING_]AS_TR_CPP([$2])) ]) dnl Miscellaneous preparations/initializations. AC_DEFUN([gl_LIBUNISTRING_LIB_PREPARE], [ dnl Ensure that HAVE_LIBUNISTRING is fully determined at this point. m4_ifdef([gl_LIBUNISTRING], [AC_REQUIRE([gl_LIBUNISTRING])]) AC_REQUIRE([AC_PROG_AWK]) dnl Sed expressions to extract the parts of a version number. changequote(,) gl_libunistring_sed_extract_major='/^[0-9]/{s/^\([0-9]*\).*/\1/p;q;} i\ 0 q ' gl_libunistring_sed_extract_minor='/^[0-9][0-9]*[.][0-9]/{s/^[0-9]*[.]\([0-9]*\).*/\1/p;q;} i\ 0 q ' gl_libunistring_sed_extract_subminor='/^[0-9][0-9]*[.][0-9][0-9]*[.][0-9]/{s/^[0-9]*[.][0-9]*[.]\([0-9]*\).*/\1/p;q;} i\ 0 q ' changequote([,]) if test "$HAVE_LIBUNISTRING" = yes; then LIBUNISTRING_VERSION_MAJOR=`echo "$LIBUNISTRING_VERSION" | sed -n -e "$gl_libunistring_sed_extract_major"` LIBUNISTRING_VERSION_MINOR=`echo "$LIBUNISTRING_VERSION" | sed -n -e "$gl_libunistring_sed_extract_minor"` LIBUNISTRING_VERSION_SUBMINOR=`echo "$LIBUNISTRING_VERSION" | sed -n -e "$gl_libunistring_sed_extract_subminor"` fi ]) dnl gl_LIBUNISTRING_VERSION_CMP([VERSION]) dnl Expands to a shell statement that evaluates to true if LIBUNISTRING_VERSION dnl is less than the VERSION argument. AC_DEFUN([gl_LIBUNISTRING_VERSION_CMP], [ { test "$HAVE_LIBUNISTRING" != yes \ || { dnl AS_LITERAL_IF exists and works fine since autoconf-2.59 at least. AS_LITERAL_IF([$1], [dnl This is the optimized variant, that assumes the argument is a literal: m4_pushdef([requested_version_major], [gl_LIBUNISTRING_ARG_OR_ZERO(m4_bpatsubst([$1], [^\([0-9]*\).*], [\1]), [])]) m4_pushdef([requested_version_minor], [gl_LIBUNISTRING_ARG_OR_ZERO(m4_bpatsubst([$1], [^[0-9]*[.]\([0-9]*\).*], [\1]), [$1])]) m4_pushdef([requested_version_subminor], [gl_LIBUNISTRING_ARG_OR_ZERO(m4_bpatsubst([$1], [^[0-9]*[.][0-9]*[.]\([0-9]*\).*], [\1]), [$1])]) test $LIBUNISTRING_VERSION_MAJOR -lt requested_version_major \ || { test $LIBUNISTRING_VERSION_MAJOR -eq requested_version_major \ && { test $LIBUNISTRING_VERSION_MINOR -lt requested_version_minor \ || { test $LIBUNISTRING_VERSION_MINOR -eq requested_version_minor \ && test $LIBUNISTRING_VERSION_SUBMINOR -lt requested_version_subminor } } } m4_popdef([requested_version_subminor]) m4_popdef([requested_version_minor]) m4_popdef([requested_version_major]) ], [dnl This is the unoptimized variant: requested_version_major=`echo '$1' | sed -n -e "$gl_libunistring_sed_extract_major"` requested_version_minor=`echo '$1' | sed -n -e "$gl_libunistring_sed_extract_minor"` requested_version_subminor=`echo '$1' | sed -n -e "$gl_libunistring_sed_extract_subminor"` test $LIBUNISTRING_VERSION_MAJOR -lt $requested_version_major \ || { test $LIBUNISTRING_VERSION_MAJOR -eq $requested_version_major \ && { test $LIBUNISTRING_VERSION_MINOR -lt $requested_version_minor \ || { test $LIBUNISTRING_VERSION_MINOR -eq $requested_version_minor \ && test $LIBUNISTRING_VERSION_SUBMINOR -lt $requested_version_subminor } } } ]) } }]) dnl gl_LIBUNISTRING_ARG_OR_ZERO([ARG], [ORIG]) expands to ARG if it is not the dnl same as ORIG, otherwise to 0. m4_define([gl_LIBUNISTRING_ARG_OR_ZERO], [m4_if([$1], [$2], [0], [$1])]) pspp-1.4.1/gl/m4/mkdtemp.m40000644000175000017500000000102713723215637014751 0ustar00blpblp00000000000000# mkdtemp.m4 serial 8 dnl Copyright (C) 2001-2003, 2006-2007, 2009-2020 Free Software Foundation, dnl Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_FUNC_MKDTEMP], [ AC_REQUIRE([gl_STDLIB_H_DEFAULTS]) AC_CHECK_FUNCS([mkdtemp]) if test $ac_cv_func_mkdtemp = no; then HAVE_MKDTEMP=0 fi ]) # Prerequisites of lib/mkdtemp.c AC_DEFUN([gl_PREREQ_MKDTEMP], [: ]) pspp-1.4.1/gl/m4/setlocale_null.m40000644000175000017500000000716413723215637016325 0ustar00blpblp00000000000000# setlocale_null.m4 serial 2 dnl Copyright (C) 2019-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_FUNC_SETLOCALE_NULL], [ AC_REQUIRE([AC_CANONICAL_HOST]) AC_REQUIRE([gl_PTHREADLIB]) AC_CHECK_HEADERS_ONCE([threads.h]) AC_CACHE_CHECK([whether setlocale (LC_ALL, NULL) is multithread-safe], [gl_cv_func_setlocale_null_all_mtsafe], [case "$host_os" in # Guess no on musl libc, macOS, FreeBSD, NetBSD, OpenBSD, AIX, Haiku, Cygwin. *-musl* | darwin* | freebsd* | netbsd* | openbsd* | aix* | haiku* | cygwin*) gl_cv_func_setlocale_null_all_mtsafe=no ;; # Guess yes on glibc, HP-UX, IRIX, Solaris, native Windows. *-gnu* | gnu* | hpux* | irix* | solaris* | mingw*) gl_cv_func_setlocale_null_all_mtsafe=yes ;; # If we don't know, obey --enable-cross-guesses. *) gl_cv_func_setlocale_null_all_mtsafe="$gl_cross_guess_normal" ;; esac ]) dnl On platforms without multithreading, there is no issue. case "$host_os" in mingw*) ;; *) if test $gl_pthread_api = no && test $ac_cv_header_threads_h = no; then gl_cv_func_setlocale_null_all_mtsafe="trivially yes" fi ;; esac case "$gl_cv_func_setlocale_null_all_mtsafe" in *yes) SETLOCALE_NULL_ALL_MTSAFE=1 ;; *) SETLOCALE_NULL_ALL_MTSAFE=0 ;; esac AC_DEFINE_UNQUOTED([SETLOCALE_NULL_ALL_MTSAFE], [$SETLOCALE_NULL_ALL_MTSAFE], [Define to 1 if setlocale (LC_ALL, NULL) is multithread-safe.]) dnl This is about a single category (not LC_ALL). AC_CACHE_CHECK([whether setlocale (category, NULL) is multithread-safe], [gl_cv_func_setlocale_null_one_mtsafe], [case "$host_os" in # Guess no on OpenBSD, AIX. openbsd* | aix*) gl_cv_func_setlocale_null_one_mtsafe=no ;; # Guess yes on glibc, musl libc, macOS, FreeBSD, NetBSD, HP-UX, IRIX, Solaris, Haiku, Cygwin, native Windows. *-gnu* | gnu* | *-musl* | darwin* | freebsd* | netbsd* | hpux* | irix* | solaris* | haiku* | cygwin* | mingw*) gl_cv_func_setlocale_null_one_mtsafe=yes ;; # If we don't know, obey --enable-cross-guesses. *) gl_cv_func_setlocale_null_one_mtsafe="$gl_cross_guess_normal" ;; esac ]) dnl On platforms without multithreading, there is no issue. case "$host_os" in mingw*) ;; *) if test $gl_pthread_api = no && test $ac_cv_header_threads_h = no; then gl_cv_func_setlocale_null_one_mtsafe="trivially yes" fi ;; esac case "$gl_cv_func_setlocale_null_one_mtsafe" in *yes) SETLOCALE_NULL_ONE_MTSAFE=1 ;; *) SETLOCALE_NULL_ONE_MTSAFE=0 ;; esac AC_DEFINE_UNQUOTED([SETLOCALE_NULL_ONE_MTSAFE], [$SETLOCALE_NULL_ONE_MTSAFE], [Define to 1 if setlocale (category, NULL) is multithread-safe.]) dnl Determine link dependencies of lib/setlocale_null.c and lib/setlocale-lock.c. if test $SETLOCALE_NULL_ALL_MTSAFE = 0 || test $SETLOCALE_NULL_ONE_MTSAFE = 0; then case "$host_os" in mingw*) LIB_SETLOCALE_NULL= ;; *) gl_WEAK_SYMBOLS case "$gl_cv_have_weak" in *yes) LIB_SETLOCALE_NULL= ;; *) LIB_SETLOCALE_NULL="$LIBPTHREAD" ;; esac ;; esac else LIB_SETLOCALE_NULL= fi dnl LIB_SETLOCALE_NULL is expected to be '-pthread' or '-lpthread' on AIX dnl with gcc or xlc, and empty otherwise. AC_SUBST([LIB_SETLOCALE_NULL]) ]) # Prerequisites of lib/setlocale-lock.c. AC_DEFUN([gl_PREREQ_SETLOCALE_LOCK], [ gl_VISIBILITY ]) pspp-1.4.1/gl/m4/trunc.m40000644000175000017500000000667213723215637014456 0ustar00blpblp00000000000000# trunc.m4 serial 15 dnl Copyright (C) 2007, 2010-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_FUNC_TRUNC], [ m4_divert_text([DEFAULTS], [gl_trunc_required=plain]) AC_REQUIRE([gl_MATH_H_DEFAULTS]) dnl Persuade glibc to declare trunc(). AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS]) dnl Test whether trunc() is declared. AC_CHECK_DECLS([trunc], , , [[#include ]]) if test "$ac_cv_have_decl_trunc" = yes; then dnl Test whether trunc() can be used without libm. TRUNC_LIBM=? AC_LINK_IFELSE( [AC_LANG_PROGRAM( [[#ifndef __NO_MATH_INLINES # define __NO_MATH_INLINES 1 /* for glibc */ #endif #include double (*funcptr) (double) = trunc; double x;]], [[x = funcptr(x) + trunc(x);]])], [TRUNC_LIBM=]) if test "$TRUNC_LIBM" = "?"; then save_LIBS="$LIBS" LIBS="$LIBS -lm" AC_LINK_IFELSE( [AC_LANG_PROGRAM( [[#ifndef __NO_MATH_INLINES # define __NO_MATH_INLINES 1 /* for glibc */ #endif #include double (*funcptr) (double) = trunc; double x;]], [[x = funcptr(x) + trunc(x);]])], [TRUNC_LIBM="-lm"]) LIBS="$save_LIBS" fi if test "$TRUNC_LIBM" = "?"; then TRUNC_LIBM= fi m4_ifdef([gl_FUNC_TRUNC_IEEE], [ if test $gl_trunc_required = ieee && test $REPLACE_TRUNC = 0; then AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles AC_CACHE_CHECK([whether trunc works according to ISO C 99 with IEC 60559], [gl_cv_func_trunc_ieee], [ save_LIBS="$LIBS" LIBS="$LIBS $TRUNC_LIBM" AC_RUN_IFELSE( [AC_LANG_SOURCE([[ #ifndef __NO_MATH_INLINES # define __NO_MATH_INLINES 1 /* for glibc */ #endif #include ]gl_DOUBLE_MINUS_ZERO_CODE[ ]gl_DOUBLE_SIGNBIT_CODE[ static double dummy (double f) { return 0; } int main (int argc, char *argv[]) { double (* volatile my_trunc) (double) = argc ? trunc : dummy; /* Test whether trunc (-0.0) is -0.0. */ if (signbitd (minus_zerod) && !signbitd (my_trunc (minus_zerod))) return 1; return 0; } ]])], [gl_cv_func_trunc_ieee=yes], [gl_cv_func_trunc_ieee=no], [case "$host_os" in # Guess yes on glibc systems. *-gnu* | gnu*) gl_cv_func_trunc_ieee="guessing yes" ;; # Guess yes on musl systems. *-musl*) gl_cv_func_trunc_ieee="guessing yes" ;; # Guess yes on native Windows. mingw*) gl_cv_func_trunc_ieee="guessing yes" ;; # If we don't know, obey --enable-cross-guesses. *) gl_cv_func_trunc_ieee="$gl_cross_guess_normal" ;; esac ]) LIBS="$save_LIBS" ]) case "$gl_cv_func_trunc_ieee" in *yes) ;; *) REPLACE_TRUNC=1 ;; esac fi ]) else HAVE_DECL_TRUNC=0 fi if test $HAVE_DECL_TRUNC = 0 || test $REPLACE_TRUNC = 1; then dnl No libraries are needed to link lib/trunc.c. TRUNC_LIBM= fi AC_SUBST([TRUNC_LIBM]) ]) pspp-1.4.1/gl/m4/mkdir.m40000644000175000017500000000630213723215637014417 0ustar00blpblp00000000000000# serial 16 # Copyright (C) 2001, 2003-2004, 2006, 2008-2020 Free Software Foundation, Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # On some systems, mkdir ("foo/", 0700) fails because of the trailing slash. # On others, mkdir ("foo/./", 0700) mistakenly succeeds. # On such systems, arrange to use a wrapper function. AC_DEFUN([gl_FUNC_MKDIR], [dnl AC_REQUIRE([gl_SYS_STAT_H_DEFAULTS]) AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles AC_CHECK_HEADERS_ONCE([unistd.h]) AC_CACHE_CHECK([whether mkdir handles trailing slash], [gl_cv_func_mkdir_trailing_slash_works], [rm -rf conftest.dir AC_RUN_IFELSE([AC_LANG_PROGRAM([[ # include # include ]], [return mkdir ("conftest.dir/", 0700);])], [gl_cv_func_mkdir_trailing_slash_works=yes], [gl_cv_func_mkdir_trailing_slash_works=no], [case "$host_os" in # Guess yes on Linux systems. linux-* | linux) gl_cv_func_mkdir_trailing_slash_works="guessing yes" ;; # Guess yes on glibc systems. *-gnu* | gnu*) gl_cv_func_mkdir_trailing_slash_works="guessing yes" ;; # Guess yes on MSVC, no on mingw. mingw*) AC_EGREP_CPP([Known], [ #ifdef _MSC_VER Known #endif ], [gl_cv_func_mkdir_trailing_slash_works="guessing yes"], [gl_cv_func_mkdir_trailing_slash_works="guessing no"]) ;; # If we don't know, obey --enable-cross-guesses. *) gl_cv_func_mkdir_trailing_slash_works="$gl_cross_guess_normal" ;; esac ]) rm -rf conftest.dir ] ) case "$gl_cv_func_mkdir_trailing_slash_works" in *yes) ;; *) REPLACE_MKDIR=1 ;; esac AC_CACHE_CHECK([whether mkdir handles trailing dot], [gl_cv_func_mkdir_trailing_dot_works], [rm -rf conftest.dir AC_RUN_IFELSE([AC_LANG_PROGRAM([[ # include # include ]], [return !mkdir ("conftest.dir/./", 0700);])], [gl_cv_func_mkdir_trailing_dot_works=yes], [gl_cv_func_mkdir_trailing_dot_works=no], [case "$host_os" in # Guess yes on glibc systems. *-gnu* | gnu*) gl_cv_func_mkdir_trailing_dot_works="guessing yes" ;; # Guess yes on musl systems. *-musl*) gl_cv_func_mkdir_trailing_dot_works="guessing yes" ;; # Guess no on native Windows. mingw*) gl_cv_func_mkdir_trailing_dot_works="guessing no" ;; # If we don't know, obey --enable-cross-guesses. *) gl_cv_func_mkdir_trailing_dot_works="$gl_cross_guess_normal" ;; esac ]) rm -rf conftest.dir ] ) case "$gl_cv_func_mkdir_trailing_dot_works" in *yes) ;; *) REPLACE_MKDIR=1 AC_DEFINE([FUNC_MKDIR_DOT_BUG], [1], [Define to 1 if mkdir mistakenly creates a directory given with a trailing dot component.]) ;; esac ]) pspp-1.4.1/gl/m4/mbrtowc.m40000644000175000017500000006332213723215637014773 0ustar00blpblp00000000000000# mbrtowc.m4 serial 37 -*- coding: utf-8 -*- dnl Copyright (C) 2001-2002, 2004-2005, 2008-2020 Free Software Foundation, dnl Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_FUNC_MBRTOWC], [ AC_REQUIRE([gl_WCHAR_H_DEFAULTS]) AC_REQUIRE([gl_PTHREADLIB]) AC_CHECK_HEADERS_ONCE([threads.h]) AC_REQUIRE([AC_TYPE_MBSTATE_T]) gl_MBSTATE_T_BROKEN AC_CHECK_FUNCS_ONCE([mbrtowc]) if test $ac_cv_func_mbrtowc = no; then HAVE_MBRTOWC=0 AC_CHECK_DECLS([mbrtowc],,, [[ /* Tru64 with Desktop Toolkit C has a bug: must be included before . BSD/OS 4.0.1 has a bug: , and must be included before . */ #include #include #include #include ]]) if test $ac_cv_have_decl_mbrtowc = yes; then dnl On Minix 3.1.8, the system's declares mbrtowc() although dnl it does not have the function. Avoid a collision with gnulib's dnl replacement. REPLACE_MBRTOWC=1 fi else if test $REPLACE_MBSTATE_T = 1; then REPLACE_MBRTOWC=1 else gl_MBRTOWC_NULL_ARG1 gl_MBRTOWC_NULL_ARG2 gl_MBRTOWC_RETVAL gl_MBRTOWC_NUL_RETVAL gl_MBRTOWC_STORES_INCOMPLETE gl_MBRTOWC_EMPTY_INPUT gl_MBRTOWC_C_LOCALE case "$gl_cv_func_mbrtowc_null_arg1" in *yes) ;; *) AC_DEFINE([MBRTOWC_NULL_ARG1_BUG], [1], [Define if the mbrtowc function has the NULL pwc argument bug.]) REPLACE_MBRTOWC=1 ;; esac case "$gl_cv_func_mbrtowc_null_arg2" in *yes) ;; *) AC_DEFINE([MBRTOWC_NULL_ARG2_BUG], [1], [Define if the mbrtowc function has the NULL string argument bug.]) REPLACE_MBRTOWC=1 ;; esac case "$gl_cv_func_mbrtowc_retval" in *yes) ;; *) AC_DEFINE([MBRTOWC_RETVAL_BUG], [1], [Define if the mbrtowc function returns a wrong return value.]) REPLACE_MBRTOWC=1 ;; esac case "$gl_cv_func_mbrtowc_nul_retval" in *yes) ;; *) AC_DEFINE([MBRTOWC_NUL_RETVAL_BUG], [1], [Define if the mbrtowc function does not return 0 for a NUL character.]) REPLACE_MBRTOWC=1 ;; esac case "$gl_cv_func_mbrtowc_stores_incomplete" in *no) ;; *) AC_DEFINE([MBRTOWC_STORES_INCOMPLETE_BUG], [1], [Define if the mbrtowc function stores a wide character when reporting incomplete input.]) REPLACE_MBRTOWC=1 ;; esac case "$gl_cv_func_mbrtowc_empty_input" in *yes) ;; *) AC_DEFINE([MBRTOWC_EMPTY_INPUT_BUG], [1], [Define if the mbrtowc function does not return (size_t) -2 for empty input.]) REPLACE_MBRTOWC=1 ;; esac case "$gl_cv_func_mbrtowc_C_locale_sans_EILSEQ" in *yes) ;; *) AC_DEFINE([MBRTOWC_IN_C_LOCALE_MAYBE_EILSEQ], [1], [Define if the mbrtowc function may signal encoding errors in the C locale.]) REPLACE_MBRTOWC=1 ;; esac fi fi if test $REPLACE_MBSTATE_T = 1; then case "$host_os" in mingw*) LIB_MBRTOWC= ;; *) gl_WEAK_SYMBOLS case "$gl_cv_have_weak" in *yes) LIB_MBRTOWC= ;; *) LIB_MBRTOWC="$LIBPTHREAD" ;; esac ;; esac else LIB_MBRTOWC= fi dnl LIB_MBRTOWC is expected to be '-pthread' or '-lpthread' on AIX dnl with gcc or xlc, and empty otherwise. AC_SUBST([LIB_MBRTOWC]) ]) dnl Test whether mbsinit() and mbrtowc() need to be overridden in a way that dnl redefines the semantics of the given mbstate_t type. dnl Result is REPLACE_MBSTATE_T. dnl When this is set to 1, we replace both mbsinit() and mbrtowc(), in order to dnl avoid inconsistencies. AC_DEFUN([gl_MBSTATE_T_BROKEN], [ AC_REQUIRE([gl_WCHAR_H_DEFAULTS]) AC_REQUIRE([AC_CANONICAL_HOST]) AC_REQUIRE([AC_TYPE_MBSTATE_T]) AC_CHECK_FUNCS_ONCE([mbsinit]) AC_CHECK_FUNCS_ONCE([mbrtowc]) dnl On native Windows, we know exactly how mbsinit() behaves and don't need dnl to override it, even if - like on MSVC - mbsinit() is only defined as dnl an inline function, not as a global function. if case "$host_os" in mingw*) true ;; *) test $ac_cv_func_mbsinit = yes ;; esac \ && test $ac_cv_func_mbrtowc = yes; then gl_MBRTOWC_INCOMPLETE_STATE gl_MBRTOWC_SANITYCHECK REPLACE_MBSTATE_T=0 case "$gl_cv_func_mbrtowc_incomplete_state" in *yes) ;; *) REPLACE_MBSTATE_T=1 ;; esac case "$gl_cv_func_mbrtowc_sanitycheck" in *yes) ;; *) REPLACE_MBSTATE_T=1 ;; esac else REPLACE_MBSTATE_T=1 fi ]) dnl Test whether mbrtowc puts the state into non-initial state when parsing an dnl incomplete multibyte character. dnl Result is gl_cv_func_mbrtowc_incomplete_state. AC_DEFUN([gl_MBRTOWC_INCOMPLETE_STATE], [ AC_REQUIRE([AC_PROG_CC]) AC_REQUIRE([gt_LOCALE_JA]) AC_REQUIRE([gt_LOCALE_FR_UTF8]) AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles AC_CACHE_CHECK([whether mbrtowc handles incomplete characters], [gl_cv_func_mbrtowc_incomplete_state], [ dnl Initial guess, used when cross-compiling or when no suitable locale dnl is present. changequote(,)dnl case "$host_os" in # Guess no on AIX and OSF/1. aix* | osf*) gl_cv_func_mbrtowc_incomplete_state="guessing no" ;; # Guess yes otherwise. *) gl_cv_func_mbrtowc_incomplete_state="guessing yes" ;; esac changequote([,])dnl if test $LOCALE_JA != none; then AC_RUN_IFELSE( [AC_LANG_SOURCE([[ #include #include /* Tru64 with Desktop Toolkit C has a bug: must be included before . BSD/OS 4.0.1 has a bug: , and must be included before . */ #include #include #include #include int main () { if (setlocale (LC_ALL, "$LOCALE_JA") != NULL) { const char input[] = "B\217\253\344\217\251\316er"; /* "Büßer" */ mbstate_t state; wchar_t wc; memset (&state, '\0', sizeof (mbstate_t)); if (mbrtowc (&wc, input + 1, 1, &state) == (size_t)(-2)) if (mbsinit (&state)) return 2; } return 0; }]])], [gl_cv_func_mbrtowc_incomplete_state=yes], [gl_cv_func_mbrtowc_incomplete_state=no], [:]) else if test $LOCALE_FR_UTF8 != none; then AC_RUN_IFELSE( [AC_LANG_SOURCE([[ #include #include /* Tru64 with Desktop Toolkit C has a bug: must be included before . BSD/OS 4.0.1 has a bug: , and must be included before . */ #include #include #include #include int main () { if (setlocale (LC_ALL, "$LOCALE_FR_UTF8") != NULL) { const char input[] = "B\303\274\303\237er"; /* "Büßer" */ mbstate_t state; wchar_t wc; memset (&state, '\0', sizeof (mbstate_t)); if (mbrtowc (&wc, input + 1, 1, &state) == (size_t)(-2)) if (mbsinit (&state)) return 2; } return 0; }]])], [gl_cv_func_mbrtowc_incomplete_state=yes], [gl_cv_func_mbrtowc_incomplete_state=no], [:]) fi fi ]) ]) dnl Test whether mbrtowc works not worse than mbtowc. dnl Result is gl_cv_func_mbrtowc_sanitycheck. AC_DEFUN([gl_MBRTOWC_SANITYCHECK], [ AC_REQUIRE([AC_PROG_CC]) AC_REQUIRE([gt_LOCALE_ZH_CN]) AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles AC_CACHE_CHECK([whether mbrtowc works as well as mbtowc], [gl_cv_func_mbrtowc_sanitycheck], [ dnl Initial guess, used when cross-compiling or when no suitable locale dnl is present. changequote(,)dnl case "$host_os" in # Guess no on Solaris 8. solaris2.8) gl_cv_func_mbrtowc_sanitycheck="guessing no" ;; # Guess yes otherwise. *) gl_cv_func_mbrtowc_sanitycheck="guessing yes" ;; esac changequote([,])dnl if test $LOCALE_ZH_CN != none; then AC_RUN_IFELSE( [AC_LANG_SOURCE([[ #include #include #include /* Tru64 with Desktop Toolkit C has a bug: must be included before . BSD/OS 4.0.1 has a bug: , and must be included before . */ #include #include #include #include int main () { /* This fails on Solaris 8: mbrtowc returns 2, and sets wc to 0x00F0. mbtowc returns 4 (correct) and sets wc to 0x5EDC. */ if (setlocale (LC_ALL, "$LOCALE_ZH_CN") != NULL) { char input[] = "B\250\271\201\060\211\070er"; /* "Büßer" */ mbstate_t state; wchar_t wc; memset (&state, '\0', sizeof (mbstate_t)); if (mbrtowc (&wc, input + 3, 6, &state) != 4 && mbtowc (&wc, input + 3, 6) == 4) return 2; } return 0; }]])], [gl_cv_func_mbrtowc_sanitycheck=yes], [gl_cv_func_mbrtowc_sanitycheck=no], [:]) fi ]) ]) dnl Test whether mbrtowc supports a NULL pwc argument correctly. dnl Result is gl_cv_func_mbrtowc_null_arg1. AC_DEFUN([gl_MBRTOWC_NULL_ARG1], [ AC_REQUIRE([AC_PROG_CC]) AC_REQUIRE([gt_LOCALE_FR_UTF8]) AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles AC_CACHE_CHECK([whether mbrtowc handles a NULL pwc argument], [gl_cv_func_mbrtowc_null_arg1], [ dnl Initial guess, used when cross-compiling or when no suitable locale dnl is present. changequote(,)dnl case "$host_os" in # Guess no on Solaris. solaris*) gl_cv_func_mbrtowc_null_arg1="guessing no" ;; # Guess yes otherwise. *) gl_cv_func_mbrtowc_null_arg1="guessing yes" ;; esac changequote([,])dnl if test $LOCALE_FR_UTF8 != none; then AC_RUN_IFELSE( [AC_LANG_SOURCE([[ #include #include #include /* Tru64 with Desktop Toolkit C has a bug: must be included before . BSD/OS 4.0.1 has a bug: , and must be included before . */ #include #include #include #include int main () { int result = 0; if (setlocale (LC_ALL, "$LOCALE_FR_UTF8") != NULL) { char input[] = "\303\237er"; mbstate_t state; wchar_t wc; size_t ret; memset (&state, '\0', sizeof (mbstate_t)); wc = (wchar_t) 0xBADFACE; ret = mbrtowc (&wc, input, 5, &state); if (ret != 2) result |= 1; if (!mbsinit (&state)) result |= 2; memset (&state, '\0', sizeof (mbstate_t)); ret = mbrtowc (NULL, input, 5, &state); if (ret != 2) /* Solaris 7 fails here: ret is -1. */ result |= 4; if (!mbsinit (&state)) result |= 8; } return result; }]])], [gl_cv_func_mbrtowc_null_arg1=yes], [gl_cv_func_mbrtowc_null_arg1=no], [:]) fi ]) ]) dnl Test whether mbrtowc supports a NULL string argument correctly. dnl Result is gl_cv_func_mbrtowc_null_arg2. AC_DEFUN([gl_MBRTOWC_NULL_ARG2], [ AC_REQUIRE([AC_PROG_CC]) AC_REQUIRE([gt_LOCALE_FR_UTF8]) AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles AC_CACHE_CHECK([whether mbrtowc handles a NULL string argument], [gl_cv_func_mbrtowc_null_arg2], [ dnl Initial guess, used when cross-compiling or when no suitable locale dnl is present. changequote(,)dnl case "$host_os" in # Guess no on OSF/1. osf*) gl_cv_func_mbrtowc_null_arg2="guessing no" ;; # Guess yes otherwise. *) gl_cv_func_mbrtowc_null_arg2="guessing yes" ;; esac changequote([,])dnl if test $LOCALE_FR_UTF8 != none; then AC_RUN_IFELSE( [AC_LANG_SOURCE([[ #include #include /* Tru64 with Desktop Toolkit C has a bug: must be included before . BSD/OS 4.0.1 has a bug: , and must be included before . */ #include #include #include #include int main () { if (setlocale (LC_ALL, "$LOCALE_FR_UTF8") != NULL) { mbstate_t state; wchar_t wc; int ret; memset (&state, '\0', sizeof (mbstate_t)); wc = (wchar_t) 0xBADFACE; mbrtowc (&wc, NULL, 5, &state); /* Check that wc was not modified. */ if (wc != (wchar_t) 0xBADFACE) return 2; } return 0; }]])], [gl_cv_func_mbrtowc_null_arg2=yes], [gl_cv_func_mbrtowc_null_arg2=no], [:]) fi ]) ]) dnl Test whether mbrtowc, when parsing the end of a multibyte character, dnl correctly returns the number of bytes that were needed to complete the dnl character (not the total number of bytes of the multibyte character). dnl Result is gl_cv_func_mbrtowc_retval. AC_DEFUN([gl_MBRTOWC_RETVAL], [ AC_REQUIRE([AC_PROG_CC]) AC_REQUIRE([gt_LOCALE_FR_UTF8]) AC_REQUIRE([gt_LOCALE_JA]) AC_REQUIRE([AC_CANONICAL_HOST]) AC_CACHE_CHECK([whether mbrtowc has a correct return value], [gl_cv_func_mbrtowc_retval], [ dnl Initial guess, used when cross-compiling or when no suitable locale dnl is present. changequote(,)dnl case "$host_os" in # Guess no on HP-UX, Solaris, native Windows. hpux* | solaris* | mingw*) gl_cv_func_mbrtowc_retval="guessing no" ;; # Guess yes otherwise. *) gl_cv_func_mbrtowc_retval="guessing yes" ;; esac changequote([,])dnl if test $LOCALE_FR_UTF8 != none || test $LOCALE_JA != none \ || { case "$host_os" in mingw*) true;; *) false;; esac; }; then AC_RUN_IFELSE( [AC_LANG_SOURCE([[ #include #include /* Tru64 with Desktop Toolkit C has a bug: must be included before . BSD/OS 4.0.1 has a bug: , and must be included before . */ #include #include #include #include int main () { int result = 0; int found_some_locale = 0; /* This fails on Solaris. */ if (setlocale (LC_ALL, "$LOCALE_FR_UTF8") != NULL) { char input[] = "B\303\274\303\237er"; /* "Büßer" */ mbstate_t state; wchar_t wc; memset (&state, '\0', sizeof (mbstate_t)); if (mbrtowc (&wc, input + 1, 1, &state) == (size_t)(-2)) { input[1] = '\0'; if (mbrtowc (&wc, input + 2, 5, &state) != 1) result |= 1; } found_some_locale = 1; } /* This fails on HP-UX 11.11. */ if (setlocale (LC_ALL, "$LOCALE_JA") != NULL) { char input[] = "B\217\253\344\217\251\316er"; /* "Büßer" */ mbstate_t state; wchar_t wc; memset (&state, '\0', sizeof (mbstate_t)); if (mbrtowc (&wc, input + 1, 1, &state) == (size_t)(-2)) { input[1] = '\0'; if (mbrtowc (&wc, input + 2, 5, &state) != 2) result |= 2; } found_some_locale = 1; } /* This fails on native Windows. */ if (setlocale (LC_ALL, "Japanese_Japan.932") != NULL) { char input[] = "<\223\372\226\173\214\352>"; /* "<日本語>" */ mbstate_t state; wchar_t wc; memset (&state, '\0', sizeof (mbstate_t)); if (mbrtowc (&wc, input + 3, 1, &state) == (size_t)(-2)) { input[3] = '\0'; if (mbrtowc (&wc, input + 4, 4, &state) != 1) result |= 4; } found_some_locale = 1; } if (setlocale (LC_ALL, "Chinese_Taiwan.950") != NULL) { char input[] = "<\244\351\245\273\273\171>"; /* "<日本語>" */ mbstate_t state; wchar_t wc; memset (&state, '\0', sizeof (mbstate_t)); if (mbrtowc (&wc, input + 3, 1, &state) == (size_t)(-2)) { input[3] = '\0'; if (mbrtowc (&wc, input + 4, 4, &state) != 1) result |= 8; } found_some_locale = 1; } if (setlocale (LC_ALL, "Chinese_China.936") != NULL) { char input[] = "<\310\325\261\276\325\132>"; /* "<日本語>" */ mbstate_t state; wchar_t wc; memset (&state, '\0', sizeof (mbstate_t)); if (mbrtowc (&wc, input + 3, 1, &state) == (size_t)(-2)) { input[3] = '\0'; if (mbrtowc (&wc, input + 4, 4, &state) != 1) result |= 16; } found_some_locale = 1; } return (found_some_locale ? result : 77); }]])], [gl_cv_func_mbrtowc_retval=yes], [if test $? != 77; then gl_cv_func_mbrtowc_retval=no fi ], [:]) fi ]) ]) dnl Test whether mbrtowc, when parsing a NUL character, correctly returns 0. dnl Result is gl_cv_func_mbrtowc_nul_retval. AC_DEFUN([gl_MBRTOWC_NUL_RETVAL], [ AC_REQUIRE([AC_PROG_CC]) AC_REQUIRE([gt_LOCALE_ZH_CN]) AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles AC_CACHE_CHECK([whether mbrtowc returns 0 when parsing a NUL character], [gl_cv_func_mbrtowc_nul_retval], [ dnl Initial guess, used when cross-compiling or when no suitable locale dnl is present. changequote(,)dnl case "$host_os" in # Guess no on Solaris 8 and 9. solaris2.[89]) gl_cv_func_mbrtowc_nul_retval="guessing no" ;; # Guess yes otherwise. *) gl_cv_func_mbrtowc_nul_retval="guessing yes" ;; esac changequote([,])dnl if test $LOCALE_ZH_CN != none; then AC_RUN_IFELSE( [AC_LANG_SOURCE([[ #include #include /* Tru64 with Desktop Toolkit C has a bug: must be included before . BSD/OS 4.0.1 has a bug: , and must be included before . */ #include #include #include #include int main () { /* This fails on Solaris 8 and 9. */ if (setlocale (LC_ALL, "$LOCALE_ZH_CN") != NULL) { mbstate_t state; wchar_t wc; memset (&state, '\0', sizeof (mbstate_t)); if (mbrtowc (&wc, "", 1, &state) != 0) return 2; } return 0; }]])], [gl_cv_func_mbrtowc_nul_retval=yes], [gl_cv_func_mbrtowc_nul_retval=no], [:]) fi ]) ]) dnl Test whether mbrtowc stores a wide character when reporting incomplete dnl input. AC_DEFUN([gl_MBRTOWC_STORES_INCOMPLETE], [ AC_REQUIRE([AC_PROG_CC]) AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles AC_CACHE_CHECK([whether mbrtowc stores incomplete characters], [gl_cv_func_mbrtowc_stores_incomplete], [ dnl Initial guess, used when cross-compiling or when no suitable locale dnl is present. changequote(,)dnl case "$host_os" in # Guess yes on native Windows. mingw*) gl_cv_func_mbrtowc_stores_incomplete="guessing yes" ;; *) gl_cv_func_mbrtowc_stores_incomplete="guessing no" ;; esac changequote([,])dnl case "$host_os" in mingw*) AC_RUN_IFELSE( [AC_LANG_SOURCE([[ #include #include /* Tru64 with Desktop Toolkit C has a bug: must be included before . BSD/OS 4.0.1 has a bug: , and must be included before . */ #include #include #include #include int main () { int result = 0; if (setlocale (LC_ALL, "French_France.65001") != NULL) { wchar_t wc = (wchar_t) 0xBADFACE; mbstate_t state; memset (&state, '\0', sizeof (mbstate_t)); if (mbrtowc (&wc, "\303", 1, &state) == (size_t)(-2) && wc != (wchar_t) 0xBADFACE) result |= 1; } if (setlocale (LC_ALL, "Japanese_Japan.932") != NULL) { wchar_t wc = (wchar_t) 0xBADFACE; mbstate_t state; memset (&state, '\0', sizeof (mbstate_t)); if (mbrtowc (&wc, "\226", 1, &state) == (size_t)(-2) && wc != (wchar_t) 0xBADFACE) result |= 2; } if (setlocale (LC_ALL, "Chinese_Taiwan.950") != NULL) { wchar_t wc = (wchar_t) 0xBADFACE; mbstate_t state; memset (&state, '\0', sizeof (mbstate_t)); if (mbrtowc (&wc, "\245", 1, &state) == (size_t)(-2) && wc != (wchar_t) 0xBADFACE) result |= 4; } if (setlocale (LC_ALL, "Chinese_China.936") != NULL) { wchar_t wc = (wchar_t) 0xBADFACE; mbstate_t state; memset (&state, '\0', sizeof (mbstate_t)); if (mbrtowc (&wc, "\261", 1, &state) == (size_t)(-2) && wc != (wchar_t) 0xBADFACE) result |= 8; } return result; }]])], [gl_cv_func_mbrtowc_stores_incomplete=no], [gl_cv_func_mbrtowc_stores_incomplete=yes], [:]) ;; *) AC_REQUIRE([gt_LOCALE_FR_UTF8]) if test $LOCALE_FR_UTF8 != none; then AC_RUN_IFELSE( [AC_LANG_SOURCE([[ #include #include /* Tru64 with Desktop Toolkit C has a bug: must be included before . BSD/OS 4.0.1 has a bug: , and must be included before . */ #include #include #include #include int main () { if (setlocale (LC_ALL, "$LOCALE_FR_UTF8") != NULL) { wchar_t wc = (wchar_t) 0xBADFACE; mbstate_t state; memset (&state, '\0', sizeof (mbstate_t)); if (mbrtowc (&wc, "\303", 1, &state) == (size_t)(-2) && wc != (wchar_t) 0xBADFACE) return 1; } return 0; }]])], [gl_cv_func_mbrtowc_stores_incomplete=no], [gl_cv_func_mbrtowc_stores_incomplete=yes], [:]) fi ;; esac ]) ]) dnl Test whether mbrtowc returns the correct value on empty input. AC_DEFUN([gl_MBRTOWC_EMPTY_INPUT], [ AC_REQUIRE([AC_PROG_CC]) AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles AC_CACHE_CHECK([whether mbrtowc works on empty input], [gl_cv_func_mbrtowc_empty_input], [ dnl Initial guess, used when cross-compiling or when no suitable locale dnl is present. changequote(,)dnl case "$host_os" in # Guess no on AIX and glibc systems. aix* | *-gnu* | gnu*) gl_cv_func_mbrtowc_empty_input="guessing no" ;; # Guess yes on native Windows. mingw*) gl_cv_func_mbrtowc_empty_input="guessing yes" ;; *) gl_cv_func_mbrtowc_empty_input="guessing yes" ;; esac changequote([,])dnl AC_RUN_IFELSE( [AC_LANG_SOURCE([[ #include static wchar_t wc; static mbstate_t mbs; int main (void) { return mbrtowc (&wc, "", 0, &mbs) != (size_t) -2; }]])], [gl_cv_func_mbrtowc_empty_input=yes], [gl_cv_func_mbrtowc_empty_input=no], [:]) ]) ]) dnl Test whether mbrtowc reports encoding errors in the C locale. dnl Although POSIX was never intended to allow this, the GNU C Library dnl and other implementations do it. See: dnl https://sourceware.org/bugzilla/show_bug.cgi?id=19932 AC_DEFUN([gl_MBRTOWC_C_LOCALE], [ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles AC_CACHE_CHECK([whether the C locale is free of encoding errors], [gl_cv_func_mbrtowc_C_locale_sans_EILSEQ], [ dnl Initial guess, used when cross-compiling or when no suitable locale dnl is present. gl_cv_func_mbrtowc_C_locale_sans_EILSEQ="$gl_cross_guess_normal" AC_RUN_IFELSE( [AC_LANG_PROGRAM( [[#include #include #include ]], [[ int i; char *locale = setlocale (LC_ALL, "C"); if (! locale) return 2; for (i = CHAR_MIN; i <= CHAR_MAX; i++) { char c = i; wchar_t wc; mbstate_t mbs = { 0, }; size_t ss = mbrtowc (&wc, &c, 1, &mbs); if (1 < ss) return 3; } return 0; ]])], [gl_cv_func_mbrtowc_C_locale_sans_EILSEQ=yes], [gl_cv_func_mbrtowc_C_locale_sans_EILSEQ=no], [case "$host_os" in # Guess yes on native Windows. mingw*) gl_cv_func_mbrtowc_C_locale_sans_EILSEQ="guessing yes" ;; esac ]) ]) ]) # Prerequisites of lib/mbrtowc.c and lib/lc-charset-dispatch.c. AC_DEFUN([gl_PREREQ_MBRTOWC], [ AC_REQUIRE([AC_C_INLINE]) : ]) # Prerequisites of lib/mbtowc-lock.c. AC_DEFUN([gl_PREREQ_MBTOWC_LOCK], [ gl_VISIBILITY ]) dnl From Paul Eggert dnl This is an override of an autoconf macro. AC_DEFUN([AC_FUNC_MBRTOWC], [ dnl Same as AC_FUNC_MBRTOWC in autoconf-2.60. AC_CACHE_CHECK([whether mbrtowc and mbstate_t are properly declared], [gl_cv_func_mbrtowc], [AC_LINK_IFELSE( [AC_LANG_PROGRAM( [[/* Tru64 with Desktop Toolkit C has a bug: must be included before . BSD/OS 4.0.1 has a bug: , and must be included before . */ #include #include #include #include ]], [[wchar_t wc; char const s[] = ""; size_t n = 1; mbstate_t state; return ! (sizeof state && (mbrtowc) (&wc, s, n, &state));]])], [gl_cv_func_mbrtowc=yes], [gl_cv_func_mbrtowc=no])]) if test $gl_cv_func_mbrtowc = yes; then AC_DEFINE([HAVE_MBRTOWC], [1], [Define to 1 if mbrtowc and mbstate_t are properly declared.]) fi ]) pspp-1.4.1/gl/m4/sig_atomic_t.m40000644000175000017500000000110313723215637015744 0ustar00blpblp00000000000000# sig_atomic_t.m4 serial 3 dnl Copyright (C) 2003, 2009-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gt_TYPE_SIG_ATOMIC_T], [ AC_CHECK_TYPES([sig_atomic_t], , [AC_DEFINE([sig_atomic_t], [int], [Define as an integer type suitable for memory locations that can be accessed atomically even in the presence of asynchronous signals.])], [#include ]) ]) pspp-1.4.1/gl/m4/include_next.m40000644000175000017500000002106113723215637015771 0ustar00blpblp00000000000000# include_next.m4 serial 24 dnl Copyright (C) 2006-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl From Paul Eggert and Derek Price. dnl Sets INCLUDE_NEXT, INCLUDE_NEXT_AS_FIRST_DIRECTIVE, PRAGMA_SYSTEM_HEADER, dnl and PRAGMA_COLUMNS. dnl dnl INCLUDE_NEXT expands to 'include_next' if the compiler supports it, or to dnl 'include' otherwise. dnl dnl INCLUDE_NEXT_AS_FIRST_DIRECTIVE expands to 'include_next' if the compiler dnl supports it in the special case that it is the first include directive in dnl the given file, or to 'include' otherwise. dnl dnl PRAGMA_SYSTEM_HEADER can be used in files that contain #include_next, dnl so as to avoid GCC warnings when the gcc option -pedantic is used. dnl '#pragma GCC system_header' has the same effect as if the file was found dnl through the include search path specified with '-isystem' options (as dnl opposed to the search path specified with '-I' options). Namely, gcc dnl does not warn about some things, and on some systems (Solaris and Interix) dnl __STDC__ evaluates to 0 instead of to 1. The latter is an undesired side dnl effect; we are therefore careful to use 'defined __STDC__' or '1' instead dnl of plain '__STDC__'. dnl dnl PRAGMA_COLUMNS can be used in files that override system header files, so dnl as to avoid compilation errors on HP NonStop systems when the gnulib file dnl is included by a system header file that does a "#pragma COLUMNS 80" (which dnl has the effect of truncating the lines of that file and all files that it dnl includes to 80 columns) and the gnulib file has lines longer than 80 dnl columns. AC_DEFUN([gl_INCLUDE_NEXT], [ AC_LANG_PREPROC_REQUIRE() AC_CACHE_CHECK([whether the preprocessor supports include_next], [gl_cv_have_include_next], [rm -rf conftestd1a conftestd1b conftestd2 mkdir conftestd1a conftestd1b conftestd2 dnl IBM C 9.0, 10.1 (original versions, prior to the 2009-01 updates) on dnl AIX 6.1 support include_next when used as first preprocessor directive dnl in a file, but not when preceded by another include directive. Check dnl for this bug by including . dnl Additionally, with this same compiler, include_next is a no-op when dnl used in a header file that was included by specifying its absolute dnl file name. Despite these two bugs, include_next is used in the dnl compiler's . By virtue of the second bug, we need to use dnl include_next as well in this case. cat < conftestd1a/conftest.h #define DEFINED_IN_CONFTESTD1 #include_next #ifdef DEFINED_IN_CONFTESTD2 int foo; #else #error "include_next doesn't work" #endif EOF cat < conftestd1b/conftest.h #define DEFINED_IN_CONFTESTD1 #include #include_next #ifdef DEFINED_IN_CONFTESTD2 int foo; #else #error "include_next doesn't work" #endif EOF cat < conftestd2/conftest.h #ifndef DEFINED_IN_CONFTESTD1 #error "include_next test doesn't work" #endif #define DEFINED_IN_CONFTESTD2 EOF gl_save_CPPFLAGS="$CPPFLAGS" CPPFLAGS="$gl_save_CPPFLAGS -Iconftestd1b -Iconftestd2" dnl We intentionally avoid using AC_LANG_SOURCE here. AC_COMPILE_IFELSE([AC_LANG_DEFINES_PROVIDED[#include ]], [gl_cv_have_include_next=yes], [CPPFLAGS="$gl_save_CPPFLAGS -Iconftestd1a -Iconftestd2" AC_COMPILE_IFELSE([AC_LANG_DEFINES_PROVIDED[#include ]], [gl_cv_have_include_next=buggy], [gl_cv_have_include_next=no]) ]) CPPFLAGS="$gl_save_CPPFLAGS" rm -rf conftestd1a conftestd1b conftestd2 ]) PRAGMA_SYSTEM_HEADER= if test $gl_cv_have_include_next = yes; then INCLUDE_NEXT=include_next INCLUDE_NEXT_AS_FIRST_DIRECTIVE=include_next if test -n "$GCC"; then PRAGMA_SYSTEM_HEADER='#pragma GCC system_header' fi else if test $gl_cv_have_include_next = buggy; then INCLUDE_NEXT=include INCLUDE_NEXT_AS_FIRST_DIRECTIVE=include_next else INCLUDE_NEXT=include INCLUDE_NEXT_AS_FIRST_DIRECTIVE=include fi fi AC_SUBST([INCLUDE_NEXT]) AC_SUBST([INCLUDE_NEXT_AS_FIRST_DIRECTIVE]) AC_SUBST([PRAGMA_SYSTEM_HEADER]) AC_CACHE_CHECK([whether system header files limit the line length], [gl_cv_pragma_columns], [dnl HP NonStop systems, which define __TANDEM, have this misfeature. AC_EGREP_CPP([choke me], [ #ifdef __TANDEM choke me #endif ], [gl_cv_pragma_columns=yes], [gl_cv_pragma_columns=no]) ]) if test $gl_cv_pragma_columns = yes; then PRAGMA_COLUMNS="#pragma COLUMNS 10000" else PRAGMA_COLUMNS= fi AC_SUBST([PRAGMA_COLUMNS]) ]) # gl_CHECK_NEXT_HEADERS(HEADER1 HEADER2 ...) # ------------------------------------------ # For each arg foo.h, if #include_next works, define NEXT_FOO_H to be # ''; otherwise define it to be # '"///usr/include/foo.h"', or whatever other absolute file name is suitable. # Also, if #include_next works as first preprocessing directive in a file, # define NEXT_AS_FIRST_DIRECTIVE_FOO_H to be ''; otherwise define it to # be # '"///usr/include/foo.h"', or whatever other absolute file name is suitable. # That way, a header file with the following line: # #@INCLUDE_NEXT@ @NEXT_FOO_H@ # or # #@INCLUDE_NEXT_AS_FIRST_DIRECTIVE@ @NEXT_AS_FIRST_DIRECTIVE_FOO_H@ # behaves (after sed substitution) as if it contained # #include_next # even if the compiler does not support include_next. # The three "///" are to pacify Sun C 5.8, which otherwise would say # "warning: #include of /usr/include/... may be non-portable". # Use '""', not '<>', so that the /// cannot be confused with a C99 comment. # Note: This macro assumes that the header file is not empty after # preprocessing, i.e. it does not only define preprocessor macros but also # provides some type/enum definitions or function/variable declarations. # # This macro also checks whether each header exists, by invoking # AC_CHECK_HEADERS_ONCE or AC_CHECK_HEADERS on each argument. AC_DEFUN([gl_CHECK_NEXT_HEADERS], [ gl_NEXT_HEADERS_INTERNAL([$1], [check]) ]) # gl_NEXT_HEADERS(HEADER1 HEADER2 ...) # ------------------------------------ # Like gl_CHECK_NEXT_HEADERS, except do not check whether the headers exist. # This is suitable for headers like that are standardized by C89 # and therefore can be assumed to exist. AC_DEFUN([gl_NEXT_HEADERS], [ gl_NEXT_HEADERS_INTERNAL([$1], [assume]) ]) # The guts of gl_CHECK_NEXT_HEADERS and gl_NEXT_HEADERS. AC_DEFUN([gl_NEXT_HEADERS_INTERNAL], [ AC_REQUIRE([gl_INCLUDE_NEXT]) AC_REQUIRE([AC_CANONICAL_HOST]) m4_if([$2], [check], [AC_CHECK_HEADERS_ONCE([$1]) ]) dnl FIXME: gl_next_header and gl_header_exists must be used unquoted dnl until we can assume autoconf 2.64 or newer. m4_foreach_w([gl_HEADER_NAME], [$1], [AS_VAR_PUSHDEF([gl_next_header], [gl_cv_next_]m4_defn([gl_HEADER_NAME])) if test $gl_cv_have_include_next = yes; then AS_VAR_SET(gl_next_header, ['<'gl_HEADER_NAME'>']) else AC_CACHE_CHECK( [absolute name of <]m4_defn([gl_HEADER_NAME])[>], m4_defn([gl_next_header]), [m4_if([$2], [check], [AS_VAR_PUSHDEF([gl_header_exists], [ac_cv_header_]m4_defn([gl_HEADER_NAME])) if test AS_VAR_GET(gl_header_exists) = yes; then AS_VAR_POPDEF([gl_header_exists]) ]) gl_ABSOLUTE_HEADER_ONE(gl_HEADER_NAME) AS_VAR_COPY([gl_header], [gl_cv_absolute_]AS_TR_SH(gl_HEADER_NAME)) AS_VAR_SET(gl_next_header, ['"'$gl_header'"']) m4_if([$2], [check], [else AS_VAR_SET(gl_next_header, ['<'gl_HEADER_NAME'>']) fi ]) ]) fi AC_SUBST( AS_TR_CPP([NEXT_]m4_defn([gl_HEADER_NAME])), [AS_VAR_GET(gl_next_header)]) if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next' gl_next_as_first_directive='<'gl_HEADER_NAME'>' else # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include' gl_next_as_first_directive=AS_VAR_GET(gl_next_header) fi AC_SUBST( AS_TR_CPP([NEXT_AS_FIRST_DIRECTIVE_]m4_defn([gl_HEADER_NAME])), [$gl_next_as_first_directive]) AS_VAR_POPDEF([gl_next_header])]) ]) # Autoconf 2.68 added warnings for our use of AC_COMPILE_IFELSE; # this fallback is safe for all earlier autoconf versions. m4_define_default([AC_LANG_DEFINES_PROVIDED]) pspp-1.4.1/gl/m4/codeset.m40000644000175000017500000000152513723215637014741 0ustar00blpblp00000000000000# codeset.m4 serial 5 (gettext-0.18.2) dnl Copyright (C) 2000-2002, 2006, 2008-2014, 2016, 2019-2020 Free Software dnl Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl From Bruno Haible. AC_DEFUN([AM_LANGINFO_CODESET], [ AC_CACHE_CHECK([for nl_langinfo and CODESET], [am_cv_langinfo_codeset], [AC_LINK_IFELSE( [AC_LANG_PROGRAM( [[#include ]], [[char* cs = nl_langinfo(CODESET); return !cs;]])], [am_cv_langinfo_codeset=yes], [am_cv_langinfo_codeset=no]) ]) if test $am_cv_langinfo_codeset = yes; then AC_DEFINE([HAVE_LANGINFO_CODESET], [1], [Define if you have and nl_langinfo(CODESET).]) fi ]) pspp-1.4.1/gl/m4/ceil.m40000644000175000017500000000670013723215637014227 0ustar00blpblp00000000000000# ceil.m4 serial 15 dnl Copyright (C) 2007, 2009-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_FUNC_CEIL], [ m4_divert_text([DEFAULTS], [gl_ceil_required=plain]) AC_REQUIRE([gl_MATH_H_DEFAULTS]) dnl Test whether ceil() can be used without libm. gl_FUNC_CEIL_LIBS if test "$CEIL_LIBM" = "?"; then CEIL_LIBM= fi m4_ifdef([gl_FUNC_CEIL_IEEE], [ if test $gl_ceil_required = ieee && test $REPLACE_CEIL = 0; then AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles AC_CACHE_CHECK([whether ceil works according to ISO C 99 with IEC 60559], [gl_cv_func_ceil_ieee], [ save_LIBS="$LIBS" LIBS="$LIBS $CEIL_LIBM" AC_RUN_IFELSE( [AC_LANG_SOURCE([[ #ifndef __NO_MATH_INLINES # define __NO_MATH_INLINES 1 /* for glibc */ #endif #include ]gl_DOUBLE_MINUS_ZERO_CODE[ ]gl_DOUBLE_SIGNBIT_CODE[ static double dummy (double f) { return 0; } int main (int argc, char *argv[]) { double (* volatile my_ceil) (double) = argc ? ceil : dummy; int result = 0; /* Test whether ceil (-0.0) is -0.0. */ if (signbitd (minus_zerod) && !signbitd (my_ceil (minus_zerod))) result |= 1; /* Test whether ceil (-0.3) is -0.0. */ if (signbitd (-0.3) && !signbitd (my_ceil (-0.3))) result |= 2; return result; } ]])], [gl_cv_func_ceil_ieee=yes], [gl_cv_func_ceil_ieee=no], [case "$host_os" in # Guess yes on glibc systems. *-gnu* | gnu*) gl_cv_func_ceil_ieee="guessing yes" ;; # Guess yes on musl systems. *-musl*) gl_cv_func_ceil_ieee="guessing yes" ;; # Guess yes on native Windows. mingw*) gl_cv_func_ceil_ieee="guessing yes" ;; # If we don't know, obey --enable-cross-guesses. *) gl_cv_func_ceil_ieee="$gl_cross_guess_normal" ;; esac ]) LIBS="$save_LIBS" ]) case "$gl_cv_func_ceil_ieee" in *yes) ;; *) REPLACE_CEIL=1 ;; esac fi ]) if test $REPLACE_CEIL = 1; then dnl No libraries are needed to link lib/ceil.c. CEIL_LIBM= fi AC_SUBST([CEIL_LIBM]) ]) # Determines the libraries needed to get the ceil() function. # Sets CEIL_LIBM. AC_DEFUN([gl_FUNC_CEIL_LIBS], [ gl_CACHE_VAL_SILENT([gl_cv_func_ceil_libm], [ gl_cv_func_ceil_libm=? AC_LINK_IFELSE( [AC_LANG_PROGRAM( [[#ifndef __NO_MATH_INLINES # define __NO_MATH_INLINES 1 /* for glibc */ #endif #include double (*funcptr) (double) = ceil; double x;]], [[x = funcptr(x) + ceil(x);]])], [gl_cv_func_ceil_libm=]) if test "$gl_cv_func_ceil_libm" = "?"; then save_LIBS="$LIBS" LIBS="$LIBS -lm" AC_LINK_IFELSE( [AC_LANG_PROGRAM( [[#ifndef __NO_MATH_INLINES # define __NO_MATH_INLINES 1 /* for glibc */ #endif #include double (*funcptr) (double) = ceil; double x;]], [[x = funcptr(x) + ceil(x);]])], [gl_cv_func_ceil_libm="-lm"]) LIBS="$save_LIBS" fi ]) CEIL_LIBM="$gl_cv_func_ceil_libm" ]) pspp-1.4.1/gl/m4/getopt.m40000644000175000017500000003141713723215637014620 0ustar00blpblp00000000000000# getopt.m4 serial 47 dnl Copyright (C) 2002-2006, 2008-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. # Request a POSIX compliant getopt function. AC_DEFUN([gl_FUNC_GETOPT_POSIX], [ m4_divert_text([DEFAULTS], [gl_getopt_required=POSIX]) AC_REQUIRE([gl_UNISTD_H_DEFAULTS]) AC_REQUIRE([gl_GETOPT_CHECK_HEADERS]) dnl Other modules can request the gnulib implementation of the getopt dnl functions unconditionally, by defining gl_REPLACE_GETOPT_ALWAYS. dnl argp.m4 does this. m4_ifdef([gl_REPLACE_GETOPT_ALWAYS], [ REPLACE_GETOPT=1 ], [ REPLACE_GETOPT=0 if test -n "$gl_replace_getopt"; then REPLACE_GETOPT=1 fi ]) if test $REPLACE_GETOPT = 1; then dnl Arrange for getopt.h to be created. gl_GETOPT_SUBSTITUTE_HEADER fi ]) # Request a POSIX compliant getopt function with GNU extensions (such as # options with optional arguments) and the functions getopt_long, # getopt_long_only. AC_DEFUN([gl_FUNC_GETOPT_GNU], [ dnl Set the variable gl_getopt_required, so that all invocations of dnl gl_GETOPT_CHECK_HEADERS in the scope of the current configure file dnl will check for getopt with GNU extensions. dnl This means that if one gnulib-tool invocation requests getopt-posix dnl and another gnulib-tool invocation requests getopt-gnu, it is as if dnl both had requested getopt-gnu. m4_divert_text([INIT_PREPARE], [gl_getopt_required=GNU]) dnl No need to invoke gl_FUNC_GETOPT_POSIX here; this is automatically dnl done through the module dependency getopt-gnu -> getopt-posix. ]) # Determine whether to replace the entire getopt facility. AC_DEFUN([gl_GETOPT_CHECK_HEADERS], [ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles AC_REQUIRE([AC_PROG_AWK]) dnl for awk that supports ENVIRON dnl Persuade Solaris to declare optarg, optind, opterr, optopt. AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS]) gl_CHECK_NEXT_HEADERS([getopt.h]) if test $ac_cv_header_getopt_h = yes; then HAVE_GETOPT_H=1 else HAVE_GETOPT_H=0 fi AC_SUBST([HAVE_GETOPT_H]) gl_replace_getopt= dnl Test whether is available. if test -z "$gl_replace_getopt" && test $gl_getopt_required = GNU; then AC_CHECK_HEADERS([getopt.h], [], [gl_replace_getopt=yes]) fi dnl Test whether the function getopt_long is available. if test -z "$gl_replace_getopt" && test $gl_getopt_required = GNU; then AC_CHECK_FUNCS([getopt_long_only], [], [gl_replace_getopt=yes]) fi dnl POSIX 2008 does not specify leading '+' behavior, but see dnl http://austingroupbugs.net/view.php?id=191 for a recommendation on dnl the next version of POSIX. For now, we only guarantee leading '+' dnl behavior with getopt-gnu. if test -z "$gl_replace_getopt"; then AC_CACHE_CHECK([whether getopt is POSIX compatible], [gl_cv_func_getopt_posix], [ dnl Merging these three different test programs into a single one dnl would require a reset mechanism. On BSD systems, it can be done dnl through 'optreset'; on some others (glibc), it can be done by dnl setting 'optind' to 0; on others again (HP-UX, IRIX, OSF/1, dnl Solaris 9, musl libc), there is no such mechanism. if test $cross_compiling = no; then dnl Sanity check. Succeeds everywhere (except on MSVC, dnl which lacks and getopt() entirely). AC_RUN_IFELSE( [AC_LANG_SOURCE([[ #include #include #include int main () { static char program[] = "program"; static char a[] = "-a"; static char foo[] = "foo"; static char bar[] = "bar"; char *argv[] = { program, a, foo, bar, NULL }; int c; c = getopt (4, argv, "ab"); if (!(c == 'a')) return 1; c = getopt (4, argv, "ab"); if (!(c == -1)) return 2; if (!(optind == 2)) return 3; return 0; } ]])], [gl_cv_func_getopt_posix=maybe], [gl_cv_func_getopt_posix=no]) if test $gl_cv_func_getopt_posix = maybe; then dnl Sanity check with '+'. Succeeds everywhere (except on MSVC, dnl which lacks and getopt() entirely). AC_RUN_IFELSE( [AC_LANG_SOURCE([[ #include #include #include int main () { static char program[] = "program"; static char donald[] = "donald"; static char p[] = "-p"; static char billy[] = "billy"; static char duck[] = "duck"; static char a[] = "-a"; static char bar[] = "bar"; char *argv[] = { program, donald, p, billy, duck, a, bar, NULL }; int c; c = getopt (7, argv, "+abp:q:"); if (!(c == -1)) return 4; if (!(strcmp (argv[0], "program") == 0)) return 5; if (!(strcmp (argv[1], "donald") == 0)) return 6; if (!(strcmp (argv[2], "-p") == 0)) return 7; if (!(strcmp (argv[3], "billy") == 0)) return 8; if (!(strcmp (argv[4], "duck") == 0)) return 9; if (!(strcmp (argv[5], "-a") == 0)) return 10; if (!(strcmp (argv[6], "bar") == 0)) return 11; if (!(optind == 1)) return 12; return 0; } ]])], [gl_cv_func_getopt_posix=maybe], [gl_cv_func_getopt_posix=no]) fi if test $gl_cv_func_getopt_posix = maybe; then dnl Detect Mac OS X 10.5, AIX 7.1, mingw bug. AC_RUN_IFELSE( [AC_LANG_SOURCE([[ #include #include #include int main () { static char program[] = "program"; static char ab[] = "-ab"; char *argv[3] = { program, ab, NULL }; if (getopt (2, argv, "ab:") != 'a') return 13; if (getopt (2, argv, "ab:") != '?') return 14; if (optopt != 'b') return 15; if (optind != 2) return 16; return 0; } ]])], [gl_cv_func_getopt_posix=yes], [gl_cv_func_getopt_posix=no]) fi else case "$host_os" in darwin* | aix* | mingw*) gl_cv_func_getopt_posix="guessing no";; *) gl_cv_func_getopt_posix="guessing yes";; esac fi ]) case "$gl_cv_func_getopt_posix" in *no) gl_replace_getopt=yes ;; esac fi if test -z "$gl_replace_getopt" && test $gl_getopt_required = GNU; then AC_CACHE_CHECK([for working GNU getopt function], [gl_cv_func_getopt_gnu], [# Even with POSIXLY_CORRECT, the GNU extension of leading '-' in the # optstring is necessary for programs like m4 that have POSIX-mandated # semantics for supporting options interspersed with files. # Also, since getopt_long is a GNU extension, we require optind=0. # Bash ties 'set -o posix' to a non-exported POSIXLY_CORRECT; # so take care to revert to the correct (non-)export state. dnl GNU Coding Standards currently allow awk but not env; besides, env dnl is ambiguous with environment values that contain newlines. gl_awk_probe='BEGIN { if ("POSIXLY_CORRECT" in ENVIRON) print "x" }' case ${POSIXLY_CORRECT+x}`$AWK "$gl_awk_probe" #include #include ]GL_NOCRASH[ ]], [[ int result = 0; nocrash_init(); /* This code succeeds on glibc 2.8, OpenBSD 4.0, Cygwin, mingw, and fails on Mac OS X 10.5, AIX 5.2, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10. */ { static char conftest[] = "conftest"; static char plus[] = "-+"; char *argv[3] = { conftest, plus, NULL }; opterr = 0; if (getopt (2, argv, "+a") != '?') result |= 1; } /* This code succeeds on glibc 2.8, mingw, and fails on Mac OS X 10.5, OpenBSD 4.0, AIX 5.2, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin 1.5.x. */ { static char program[] = "program"; static char p[] = "-p"; static char foo[] = "foo"; static char bar[] = "bar"; char *argv[] = { program, p, foo, bar, NULL }; optind = 1; if (getopt (4, argv, "p::") != 'p') result |= 2; else if (optarg != NULL) result |= 4; else if (getopt (4, argv, "p::") != -1) result |= 6; else if (optind != 2) result |= 8; } /* This code succeeds on glibc 2.8 and fails on Cygwin 1.7.0. */ { static char program[] = "program"; static char foo[] = "foo"; static char p[] = "-p"; char *argv[] = { program, foo, p, NULL }; optind = 0; if (getopt (3, argv, "-p") != 1) result |= 16; else if (getopt (3, argv, "-p") != 'p') result |= 16; } /* This code fails on glibc 2.11. */ { static char program[] = "program"; static char b[] = "-b"; static char a[] = "-a"; char *argv[] = { program, b, a, NULL }; optind = opterr = 0; if (getopt (3, argv, "+:a:b") != 'b') result |= 32; else if (getopt (3, argv, "+:a:b") != ':') result |= 32; } /* This code dumps core on glibc 2.14. */ { static char program[] = "program"; static char w[] = "-W"; static char dummy[] = "dummy"; char *argv[] = { program, w, dummy, NULL }; optind = opterr = 1; if (getopt (3, argv, "W;") != 'W') result |= 64; } return result; ]])], [gl_cv_func_getopt_gnu=yes], [gl_cv_func_getopt_gnu=no], [dnl Cross compiling. dnl Assume the worst, even on glibc platforms. dnl But obey --enable-cross-guesses. gl_cv_func_getopt_gnu="$gl_cross_guess_normal" ]) case $gl_had_POSIXLY_CORRECT in exported) ;; yes) AS_UNSET([POSIXLY_CORRECT]); POSIXLY_CORRECT=1 ;; *) AS_UNSET([POSIXLY_CORRECT]) ;; esac ]) if test "$gl_cv_func_getopt_gnu" != yes; then gl_replace_getopt=yes else AC_CACHE_CHECK([for working GNU getopt_long function], [gl_cv_func_getopt_long_gnu], [AC_RUN_IFELSE( [AC_LANG_PROGRAM( [[#include #include #include ]], [[static const struct option long_options[] = { { "xtremely-",no_argument, NULL, 1003 }, { "xtra", no_argument, NULL, 1001 }, { "xtreme", no_argument, NULL, 1002 }, { "xtremely", no_argument, NULL, 1003 }, { NULL, 0, NULL, 0 } }; /* This code fails on OpenBSD 5.0. */ { static char program[] = "program"; static char xtremel[] = "--xtremel"; char *argv[] = { program, xtremel, NULL }; int option_index; optind = 1; opterr = 0; if (getopt_long (2, argv, "", long_options, &option_index) != 1003) return 1; } return 0; ]])], [gl_cv_func_getopt_long_gnu=yes], [gl_cv_func_getopt_long_gnu=no], [dnl Cross compiling. Guess no on OpenBSD, yes otherwise. case "$host_os" in openbsd*) gl_cv_func_getopt_long_gnu="guessing no";; *) gl_cv_func_getopt_long_gnu="guessing yes";; esac ]) ]) case "$gl_cv_func_getopt_long_gnu" in *yes) ;; *) gl_replace_getopt=yes ;; esac fi fi ]) AC_DEFUN([gl_GETOPT_SUBSTITUTE_HEADER], [ AC_CHECK_HEADERS_ONCE([sys/cdefs.h]) if test $ac_cv_header_sys_cdefs_h = yes; then HAVE_SYS_CDEFS_H=1 else HAVE_SYS_CDEFS_H=0 fi AC_SUBST([HAVE_SYS_CDEFS_H]) AC_DEFINE([__GETOPT_PREFIX], [[rpl_]], [Define to rpl_ if the getopt replacement functions and variables should be used.]) GETOPT_H=getopt.h GETOPT_CDEFS_H=getopt-cdefs.h AC_SUBST([GETOPT_H]) AC_SUBST([GETOPT_CDEFS_H]) ]) pspp-1.4.1/gl/m4/sys_socket_h.m40000644000175000017500000001470613723215637016015 0ustar00blpblp00000000000000# sys_socket_h.m4 serial 25 dnl Copyright (C) 2005-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl From Simon Josefsson. AC_DEFUN([gl_HEADER_SYS_SOCKET], [ AC_REQUIRE([gl_SYS_SOCKET_H_DEFAULTS]) AC_REQUIRE([AC_CANONICAL_HOST]) dnl On OSF/1, the functions recv(), send(), recvfrom(), sendto() have dnl old-style declarations (with return type 'int' instead of 'ssize_t') dnl unless _POSIX_PII_SOCKET is defined. case "$host_os" in osf*) AC_DEFINE([_POSIX_PII_SOCKET], [1], [Define to 1 in order to get the POSIX compatible declarations of socket functions.]) ;; esac AC_CACHE_CHECK([whether is self-contained], [gl_cv_header_sys_socket_h_selfcontained], [ AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include ]], [[]])], [gl_cv_header_sys_socket_h_selfcontained=yes], [gl_cv_header_sys_socket_h_selfcontained=no]) ]) if test $gl_cv_header_sys_socket_h_selfcontained = yes; then dnl If the shutdown function exists, should define dnl SHUT_RD, SHUT_WR, SHUT_RDWR. AC_CHECK_FUNCS([shutdown]) if test $ac_cv_func_shutdown = yes; then AC_CACHE_CHECK([whether defines the SHUT_* macros], [gl_cv_header_sys_socket_h_shut], [ AC_COMPILE_IFELSE( [AC_LANG_PROGRAM([[#include ]], [[int a[] = { SHUT_RD, SHUT_WR, SHUT_RDWR };]])], [gl_cv_header_sys_socket_h_shut=yes], [gl_cv_header_sys_socket_h_shut=no]) ]) if test $gl_cv_header_sys_socket_h_shut = no; then SYS_SOCKET_H='sys/socket.h' fi fi fi # We need to check for ws2tcpip.h now. gl_PREREQ_SYS_H_SOCKET AC_CHECK_TYPES([struct sockaddr_storage, sa_family_t],,,[ /* sys/types.h is not needed according to POSIX, but the sys/socket.h in i386-unknown-freebsd4.10 and powerpc-apple-darwin5.5 required it. */ #include #ifdef HAVE_SYS_SOCKET_H #include #endif #ifdef HAVE_WS2TCPIP_H #include #endif ]) if test $ac_cv_type_struct_sockaddr_storage = no; then HAVE_STRUCT_SOCKADDR_STORAGE=0 fi if test $ac_cv_type_sa_family_t = no; then HAVE_SA_FAMILY_T=0 fi if test $ac_cv_type_struct_sockaddr_storage != no; then AC_CHECK_MEMBERS([struct sockaddr_storage.ss_family], [], [HAVE_STRUCT_SOCKADDR_STORAGE_SS_FAMILY=0], [#include #ifdef HAVE_SYS_SOCKET_H #include #endif #ifdef HAVE_WS2TCPIP_H #include #endif ]) fi if test $HAVE_STRUCT_SOCKADDR_STORAGE = 0 || test $HAVE_SA_FAMILY_T = 0 \ || test $HAVE_STRUCT_SOCKADDR_STORAGE_SS_FAMILY = 0; then SYS_SOCKET_H='sys/socket.h' fi gl_PREREQ_SYS_H_WINSOCK2 dnl Check for declarations of anything we want to poison if the dnl corresponding gnulib module is not in use. gl_WARN_ON_USE_PREPARE([[ /* Some systems require prerequisite headers. */ #include #include ]], [socket connect accept bind getpeername getsockname getsockopt listen recv send recvfrom sendto setsockopt shutdown accept4]) AC_REQUIRE([AC_C_RESTRICT]) ]) AC_DEFUN([gl_PREREQ_SYS_H_SOCKET], [ dnl Check prerequisites of the replacement. AC_REQUIRE([gl_CHECK_SOCKET_HEADERS]) gl_CHECK_NEXT_HEADERS([sys/socket.h]) if test $ac_cv_header_sys_socket_h = yes; then HAVE_SYS_SOCKET_H=1 else HAVE_SYS_SOCKET_H=0 fi AC_SUBST([HAVE_SYS_SOCKET_H]) gl_PREREQ_SYS_H_WS2TCPIP ]) # Common prerequisites of the replacement and of the # replacement. # Sets and substitutes HAVE_WINSOCK2_H. AC_DEFUN([gl_PREREQ_SYS_H_WINSOCK2], [ m4_ifdef([gl_UNISTD_H_DEFAULTS], [AC_REQUIRE([gl_UNISTD_H_DEFAULTS])]) m4_ifdef([gl_SYS_IOCTL_H_DEFAULTS], [AC_REQUIRE([gl_SYS_IOCTL_H_DEFAULTS])]) AC_CHECK_HEADERS_ONCE([sys/socket.h]) if test $ac_cv_header_sys_socket_h != yes; then dnl We cannot use AC_CHECK_HEADERS_ONCE here, because that would make dnl the check for those headers unconditional; yet cygwin reports dnl that the headers are present but cannot be compiled (since on dnl cygwin, all socket information should come from sys/socket.h). AC_CHECK_HEADERS([winsock2.h]) fi if test "$ac_cv_header_winsock2_h" = yes; then HAVE_WINSOCK2_H=1 UNISTD_H_HAVE_WINSOCK2_H=1 SYS_IOCTL_H_HAVE_WINSOCK2_H=1 else HAVE_WINSOCK2_H=0 fi AC_SUBST([HAVE_WINSOCK2_H]) ]) # Common prerequisites of the replacement and of the # replacement. # Sets and substitutes HAVE_WS2TCPIP_H. AC_DEFUN([gl_PREREQ_SYS_H_WS2TCPIP], [ AC_REQUIRE([gl_CHECK_SOCKET_HEADERS]) if test $ac_cv_header_sys_socket_h = yes; then HAVE_WS2TCPIP_H=0 else if test $ac_cv_header_ws2tcpip_h = yes; then HAVE_WS2TCPIP_H=1 else HAVE_WS2TCPIP_H=0 fi fi AC_SUBST([HAVE_WS2TCPIP_H]) ]) AC_DEFUN([gl_SYS_SOCKET_MODULE_INDICATOR], [ dnl Use AC_REQUIRE here, so that the default settings are expanded once only. AC_REQUIRE([gl_SYS_SOCKET_H_DEFAULTS]) gl_MODULE_INDICATOR_SET_VARIABLE([$1]) dnl Define it also as a C macro, for the benefit of the unit tests. gl_MODULE_INDICATOR_FOR_TESTS([$1]) ]) AC_DEFUN([gl_SYS_SOCKET_H_DEFAULTS], [ GNULIB_SOCKET=0; AC_SUBST([GNULIB_SOCKET]) GNULIB_CONNECT=0; AC_SUBST([GNULIB_CONNECT]) GNULIB_ACCEPT=0; AC_SUBST([GNULIB_ACCEPT]) GNULIB_BIND=0; AC_SUBST([GNULIB_BIND]) GNULIB_GETPEERNAME=0; AC_SUBST([GNULIB_GETPEERNAME]) GNULIB_GETSOCKNAME=0; AC_SUBST([GNULIB_GETSOCKNAME]) GNULIB_GETSOCKOPT=0; AC_SUBST([GNULIB_GETSOCKOPT]) GNULIB_LISTEN=0; AC_SUBST([GNULIB_LISTEN]) GNULIB_RECV=0; AC_SUBST([GNULIB_RECV]) GNULIB_SEND=0; AC_SUBST([GNULIB_SEND]) GNULIB_RECVFROM=0; AC_SUBST([GNULIB_RECVFROM]) GNULIB_SENDTO=0; AC_SUBST([GNULIB_SENDTO]) GNULIB_SETSOCKOPT=0; AC_SUBST([GNULIB_SETSOCKOPT]) GNULIB_SHUTDOWN=0; AC_SUBST([GNULIB_SHUTDOWN]) GNULIB_ACCEPT4=0; AC_SUBST([GNULIB_ACCEPT4]) HAVE_STRUCT_SOCKADDR_STORAGE=1; AC_SUBST([HAVE_STRUCT_SOCKADDR_STORAGE]) HAVE_STRUCT_SOCKADDR_STORAGE_SS_FAMILY=1; AC_SUBST([HAVE_STRUCT_SOCKADDR_STORAGE_SS_FAMILY]) HAVE_SA_FAMILY_T=1; AC_SUBST([HAVE_SA_FAMILY_T]) HAVE_ACCEPT4=1; AC_SUBST([HAVE_ACCEPT4]) ]) pspp-1.4.1/gl/m4/std-gnu11.m40000644000175000017500000005771213723215637015047 0ustar00blpblp00000000000000# Prefer GNU C11 and C++11 to earlier versions. -*- coding: utf-8 -*- # This implementation is taken from GNU Autoconf lib/autoconf/c.m4 # commit 017d5ddd82854911f0119691d91ea8a1438824d6 # dated Sun Apr 3 13:57:17 2016 -0700 # This implementation will be obsolete once we can assume Autoconf 2.70 # or later is installed everywhere a Gnulib program might be developed. # Copyright (C) 2001-2020 Free Software Foundation, Inc. # 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 3 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, see . # Written by David MacKenzie, with help from # Akim Demaille, Paul Eggert, # François Pinard, Karl Berry, Richard Pixley, Ian Lance Taylor, # Roland McGrath, Noah Friedman, david d zuhn, and many others. # AC_PROG_CC([COMPILER ...]) # -------------------------- # COMPILER ... is a space separated list of C compilers to search for. # This just gives the user an opportunity to specify an alternative # search list for the C compiler. AC_DEFUN_ONCE([AC_PROG_CC], [AC_LANG_PUSH(C)dnl AC_ARG_VAR([CC], [C compiler command])dnl AC_ARG_VAR([CFLAGS], [C compiler flags])dnl _AC_ARG_VAR_LDFLAGS()dnl _AC_ARG_VAR_LIBS()dnl _AC_ARG_VAR_CPPFLAGS()dnl m4_ifval([$1], [AC_CHECK_TOOLS(CC, [$1])], [AC_CHECK_TOOL(CC, gcc) if test -z "$CC"; then dnl Here we want: dnl AC_CHECK_TOOL(CC, cc) dnl but without the check for a tool without the prefix. dnl Until the check is removed from there, copy the code: if test -n "$ac_tool_prefix"; then AC_CHECK_PROG(CC, [${ac_tool_prefix}cc], [${ac_tool_prefix}cc]) fi fi if test -z "$CC"; then AC_CHECK_PROG(CC, cc, cc, , , /usr/ucb/cc) fi if test -z "$CC"; then AC_CHECK_TOOLS(CC, cl.exe) fi if test -z "$CC"; then AC_CHECK_TOOL(CC, clang) fi ]) test -z "$CC" && AC_MSG_FAILURE([no acceptable C compiler found in \$PATH]) # Provide some information about the compiler. _AS_ECHO_LOG([checking for _AC_LANG compiler version]) set X $ac_compile ac_compiler=$[2] for ac_option in --version -v -V -qversion -version; do m4_ifdef([_AC_DO_LIMIT],[_AC_DO_LIMIT],[_AC_DO])([$ac_compiler $ac_option >&AS_MESSAGE_LOG_FD]) done m4_expand_once([_AC_COMPILER_EXEEXT])[]dnl m4_expand_once([_AC_COMPILER_OBJEXT])[]dnl _AC_LANG_COMPILER_GNU if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi _AC_PROG_CC_G dnl dnl Set ac_prog_cc_stdc to the supported C version. dnl Also set the documented variable ac_cv_prog_cc_stdc; dnl its name was chosen when it was cached, but it is no longer cached. _AC_PROG_CC_C11([ac_prog_cc_stdc=c11 ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c11], [_AC_PROG_CC_C99([ac_prog_cc_stdc=c99 ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c99], [_AC_PROG_CC_C89([ac_prog_cc_stdc=c89 ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c89], [ac_prog_cc_stdc=no ac_cv_prog_cc_stdc=no])])]) dnl AC_LANG_POP(C)dnl ])# AC_PROG_CC # AC_PROG_CXX([LIST-OF-COMPILERS]) # -------------------------------- # LIST-OF-COMPILERS is a space separated list of C++ compilers to search # for (if not specified, a default list is used). This just gives the # user an opportunity to specify an alternative search list for the C++ # compiler. # aCC HP-UX C++ compiler much better than `CC', so test before. # FCC Fujitsu C++ compiler # KCC KAI C++ compiler # RCC Rational C++ # xlC_r AIX C Set++ (with support for reentrant code) # xlC AIX C Set++ AC_DEFUN([AC_PROG_CXX], [AC_LANG_PUSH(C++)dnl AC_ARG_VAR([CXX], [C++ compiler command])dnl AC_ARG_VAR([CXXFLAGS], [C++ compiler flags])dnl _AC_ARG_VAR_LDFLAGS()dnl _AC_ARG_VAR_LIBS()dnl _AC_ARG_VAR_CPPFLAGS()dnl _AC_ARG_VAR_PRECIOUS([CCC])dnl if test -z "$CXX"; then if test -n "$CCC"; then CXX=$CCC else AC_CHECK_TOOLS(CXX, [m4_default([$1], [g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC clang++])], g++) fi fi # Provide some information about the compiler. _AS_ECHO_LOG([checking for _AC_LANG compiler version]) set X $ac_compile ac_compiler=$[2] for ac_option in --version -v -V -qversion; do m4_ifdef([_AC_DO_LIMIT],[_AC_DO_LIMIT],[_AC_DO])([$ac_compiler $ac_option >&AS_MESSAGE_LOG_FD]) done m4_expand_once([_AC_COMPILER_EXEEXT])[]dnl m4_expand_once([_AC_COMPILER_OBJEXT])[]dnl _AC_LANG_COMPILER_GNU if test $ac_compiler_gnu = yes; then GXX=yes else GXX= fi _AC_PROG_CXX_G _AC_PROG_CXX_CXX11([ac_prog_cxx_stdcxx=cxx11 ac_cv_prog_cxx_stdcxx=$ac_cv_prog_cxx_cxx11 ac_cv_prog_cxx_cxx98=$ac_cv_prog_cxx_cxx11], [_AC_PROG_CXX_CXX98([ac_prog_cxx_stdcxx=cxx98 ac_cv_prog_cxx_stdcxx=$ac_cv_prog_cxx_cxx98], [ac_prog_cxx_stdcxx=no ac_cv_prog_cxx_stdcxx=no])]) AC_LANG_POP(C++)dnl ])# AC_PROG_CXX # _AC_C_STD_TRY(STANDARD, TEST-PROLOGUE, TEST-BODY, OPTION-LIST, # ACTION-IF-AVAILABLE, ACTION-IF-UNAVAILABLE) # -------------------------------------------------------------- # Check whether the C compiler accepts features of STANDARD (e.g `c89', `c99') # by trying to compile a program of TEST-PROLOGUE and TEST-BODY. If this fails, # try again with each compiler option in the space-separated OPTION-LIST; if one # helps, append it to CC. If eventually successful, run ACTION-IF-AVAILABLE, # else ACTION-IF-UNAVAILABLE. AC_DEFUN([_AC_C_STD_TRY], [AC_MSG_CHECKING([for $CC option to enable ]m4_translit($1, [c], [C])[ features]) AC_CACHE_VAL(ac_cv_prog_cc_$1, [ac_cv_prog_cc_$1=no ac_save_CC=$CC AC_LANG_CONFTEST([AC_LANG_PROGRAM([$2], [$3])]) for ac_arg in '' $4 do CC="$ac_save_CC $ac_arg" _AC_COMPILE_IFELSE([], [ac_cv_prog_cc_$1=$ac_arg]) test "x$ac_cv_prog_cc_$1" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC ])# AC_CACHE_VAL ac_prog_cc_stdc_options= case "x$ac_cv_prog_cc_$1" in x) AC_MSG_RESULT([none needed]) ;; xno) AC_MSG_RESULT([unsupported]) ;; *) ac_prog_cc_stdc_options=" $ac_cv_prog_cc_$1" CC=$CC$ac_prog_cc_stdc_options AC_MSG_RESULT([$ac_cv_prog_cc_$1]) ;; esac AS_IF([test "x$ac_cv_prog_cc_$1" != xno], [$5], [$6]) ])# _AC_C_STD_TRY # _AC_C_C99_TEST_HEADER # --------------------- # A C header suitable for testing for C99. AC_DEFUN([_AC_C_C99_TEST_HEADER], [[#include #include #include #include #include #include // Check varargs macros. These examples are taken from C99 6.10.3.5. #define debug(...) fprintf (stderr, __VA_ARGS__) #define showlist(...) puts (#__VA_ARGS__) #define report(test,...) ((test) ? puts (#test) : printf (__VA_ARGS__)) static void test_varargs_macros (void) { int x = 1234; int y = 5678; debug ("Flag"); debug ("X = %d\n", x); showlist (The first, second, and third items.); report (x>y, "x is %d but y is %d", x, y); } // Check long long types. #define BIG64 18446744073709551615ull #define BIG32 4294967295ul #define BIG_OK (BIG64 / BIG32 == 4294967297ull && BIG64 % BIG32 == 0) #if !BIG_OK your preprocessor is broken; #endif #if BIG_OK #else your preprocessor is broken; #endif static long long int bignum = -9223372036854775807LL; static unsigned long long int ubignum = BIG64; struct incomplete_array { int datasize; double data[]; }; struct named_init { int number; const wchar_t *name; double average; }; typedef const char *ccp; static inline int test_restrict (ccp restrict text) { // See if C++-style comments work. // Iterate through items via the restricted pointer. // Also check for declarations in for loops. for (unsigned int i = 0; *(text+i) != '\0'; ++i) continue; return 0; } // Check varargs and va_copy. static bool test_varargs (const char *format, ...) { va_list args; va_start (args, format); va_list args_copy; va_copy (args_copy, args); const char *str = ""; int number = 0; float fnumber = 0; while (*format) { switch (*format++) { case 's': // string str = va_arg (args_copy, const char *); break; case 'd': // int number = va_arg (args_copy, int); break; case 'f': // float fnumber = va_arg (args_copy, double); break; default: break; } } va_end (args_copy); va_end (args); return *str && number && fnumber; }]])# _AC_C_C99_TEST_HEADER # _AC_C_C99_TEST_BODY # ------------------- # A C body suitable for testing for C99, assuming the corresponding header. AC_DEFUN([_AC_C_C99_TEST_BODY], [[ // Check bool. _Bool success = false; // Check restrict. if (test_restrict ("String literal") == 0) success = true; char *restrict newvar = "Another string"; // Check varargs. success &= test_varargs ("s, d' f .", "string", 65, 34.234); test_varargs_macros (); // Check flexible array members. struct incomplete_array *ia = malloc (sizeof (struct incomplete_array) + (sizeof (double) * 10)); ia->datasize = 10; for (int i = 0; i < ia->datasize; ++i) ia->data[i] = i * 1.234; // Check named initializers. struct named_init ni = { .number = 34, .name = L"Test wide string", .average = 543.34343, }; ni.number = 58; int dynamic_array[ni.number]; dynamic_array[ni.number - 1] = 543; // work around unused variable warnings return (!success || bignum == 0LL || ubignum == 0uLL || newvar[0] == 'x' || dynamic_array[ni.number - 1] != 543); ]]) # _AC_PROG_CC_C99 ([ACTION-IF-AVAILABLE], [ACTION-IF-UNAVAILABLE]) # ---------------------------------------------------------------- # If the C compiler is not in ISO C99 mode by default, try to add an # option to output variable CC to make it so. This macro tries # various options that select ISO C99 on some system or another. It # considers the compiler to be in ISO C99 mode if it handles _Bool, # // comments, flexible array members, inline, long long int, mixed # code and declarations, named initialization of structs, restrict, # va_copy, varargs macros, variable declarations in for loops and # variable length arrays. AC_DEFUN([_AC_PROG_CC_C99], [_AC_C_STD_TRY([c99], [_AC_C_C99_TEST_HEADER], [_AC_C_C99_TEST_BODY], dnl Try dnl GCC -std=gnu99 (unused restrictive modes: -std=c99 -std=iso9899:1999) dnl IBM XL C -qlanglvl=extc1x (V12.1; does not pass C11 test) dnl IBM XL C -qlanglvl=extc99 dnl (pre-V12.1; unused restrictive mode: -qlanglvl=stdc99) dnl HP cc -AC99 dnl Intel ICC -std=c99, -c99 (deprecated) dnl IRIX -c99 dnl Solaris -D_STDC_C99= dnl cc's -xc99 option uses linker magic to define the external dnl symbol __xpg4 as if by "int __xpg4 = 1;", which enables C99 dnl behavior for C library functions. This is not wanted here, dnl because it means that a single module compiled with -xc99 dnl alters C runtime behavior for the entire program, not for dnl just the module. Instead, define the (private) symbol dnl _STDC_C99, which suppresses a bogus failure in . dnl The resulting compiler passes the test case here, and that's dnl good enough. For more, please see the thread starting at: dnl https://lists.gnu.org/r/autoconf/2010-12/msg00059.html dnl Tru64 -c99 dnl with extended modes being tried first. [[-std=gnu99 -std=c99 -c99 -AC99 -D_STDC_C99= -qlanglvl=extc1x -qlanglvl=extc99]], [$1], [$2])[]dnl ])# _AC_PROG_CC_C99 # _AC_PROG_CC_C11 ([ACTION-IF-AVAILABLE], [ACTION-IF-UNAVAILABLE]) # ---------------------------------------------------------------- # If the C compiler is not in ISO C11 mode by default, try to add an # option to output variable CC to make it so. This macro tries # various options that select ISO C11 on some system or another. It # considers the compiler to be in ISO C11 mode if it handles _Alignas, # _Alignof, _Noreturn, _Static_assert, UTF-8 string literals, # duplicate typedefs, and anonymous structures and unions. AC_DEFUN([_AC_PROG_CC_C11], [_AC_C_STD_TRY([c11], [_AC_C_C99_TEST_HEADER[ // Check _Alignas. char _Alignas (double) aligned_as_double; char _Alignas (0) no_special_alignment; extern char aligned_as_int; char _Alignas (0) _Alignas (int) aligned_as_int; // Check _Alignof. enum { int_alignment = _Alignof (int), int_array_alignment = _Alignof (int[100]), char_alignment = _Alignof (char) }; _Static_assert (0 < -_Alignof (int), "_Alignof is signed"); // Check _Noreturn. int _Noreturn does_not_return (void) { for (;;) continue; } // Check _Static_assert. struct test_static_assert { int x; _Static_assert (sizeof (int) <= sizeof (long int), "_Static_assert does not work in struct"); long int y; }; // Check UTF-8 literals. #define u8 syntax error! char const utf8_literal[] = u8"happens to be ASCII" "another string"; // Check duplicate typedefs. typedef long *long_ptr; typedef long int *long_ptr; typedef long_ptr long_ptr; // Anonymous structures and unions -- taken from C11 6.7.2.1 Example 1. struct anonymous { union { struct { int i; int j; }; struct { int k; long int l; } w; }; int m; } v1; ]], [_AC_C_C99_TEST_BODY[ v1.i = 2; v1.w.k = 5; _Static_assert ((offsetof (struct anonymous, i) == offsetof (struct anonymous, w.k)), "Anonymous union alignment botch"); ]], dnl Try dnl GCC -std=gnu11 (unused restrictive mode: -std=c11) dnl with extended modes being tried first. dnl dnl Do not try -qlanglvl=extc1x, because IBM XL C V12.1 (the latest version as dnl of September 2012) does not pass the C11 test. For now, try extc1x when dnl compiling the C99 test instead, since it enables _Static_assert and dnl _Noreturn, which is a win. If -qlanglvl=extc11 or -qlanglvl=extc1x passes dnl the C11 test in some future version of IBM XL C, we'll add it here, dnl preferably extc11. [[-std=gnu11]], [$1], [$2])[]dnl ])# _AC_PROG_CC_C11 # AC_PROG_CC_C89 # -------------- # Do not use AU_ALIAS here and in AC_PROG_CC_C99 and AC_PROG_CC_STDC, # as that'd be incompatible with how Automake redefines AC_PROG_CC. See # . AU_DEFUN([AC_PROG_CC_C89], [AC_REQUIRE([AC_PROG_CC])], [$0 is obsolete; use AC_PROG_CC] ) # AC_PROG_CC_C99 # -------------- AU_DEFUN([AC_PROG_CC_C99], [AC_REQUIRE([AC_PROG_CC])], [$0 is obsolete; use AC_PROG_CC] ) # AC_PROG_CC_STDC # --------------- AU_DEFUN([AC_PROG_CC_STDC], [AC_REQUIRE([AC_PROG_CC])], [$0 is obsolete; use AC_PROG_CC] ) # AC_C_PROTOTYPES # --------------- # Check if the C compiler supports prototypes, included if it needs # options. AC_DEFUN([AC_C_PROTOTYPES], [AC_REQUIRE([AC_PROG_CC])dnl if test "$ac_prog_cc_stdc" != no; then AC_DEFINE(PROTOTYPES, 1, [Define to 1 if the C compiler supports function prototypes.]) AC_DEFINE(__PROTOTYPES, 1, [Define like PROTOTYPES; this can be used by system headers.]) fi ])# AC_C_PROTOTYPES # _AC_CXX_STD_TRY(STANDARD, TEST-PROLOGUE, TEST-BODY, OPTION-LIST, # ACTION-IF-AVAILABLE, ACTION-IF-UNAVAILABLE) # ---------------------------------------------------------------- # Check whether the C++ compiler accepts features of STANDARD (e.g # `cxx98', `cxx11') by trying to compile a program of TEST-PROLOGUE # and TEST-BODY. If this fails, try again with each compiler option # in the space-separated OPTION-LIST; if one helps, append it to CXX. # If eventually successful, run ACTION-IF-AVAILABLE, else # ACTION-IF-UNAVAILABLE. AC_DEFUN([_AC_CXX_STD_TRY], [AC_MSG_CHECKING([for $CXX option to enable ]m4_translit(m4_translit($1, [x], [+]), [a-z], [A-Z])[ features]) AC_LANG_PUSH(C++)dnl AC_CACHE_VAL(ac_cv_prog_cxx_$1, [ac_cv_prog_cxx_$1=no ac_save_CXX=$CXX AC_LANG_CONFTEST([AC_LANG_PROGRAM([$2], [$3])]) for ac_arg in '' $4 do CXX="$ac_save_CXX $ac_arg" _AC_COMPILE_IFELSE([], [ac_cv_prog_cxx_$1=$ac_arg]) test "x$ac_cv_prog_cxx_$1" != "xno" && break done rm -f conftest.$ac_ext CXX=$ac_save_CXX ])# AC_CACHE_VAL ac_prog_cxx_stdcxx_options= case "x$ac_cv_prog_cxx_$1" in x) AC_MSG_RESULT([none needed]) ;; xno) AC_MSG_RESULT([unsupported]) ;; *) ac_prog_cxx_stdcxx_options=" $ac_cv_prog_cxx_$1" CXX=$CXX$ac_prog_cxx_stdcxx_options AC_MSG_RESULT([$ac_cv_prog_cxx_$1]) ;; esac AC_LANG_POP(C++)dnl AS_IF([test "x$ac_cv_prog_cxx_$1" != xno], [$5], [$6]) ])# _AC_CXX_STD_TRY # _AC_CXX_CXX98_TEST_HEADER # ------------------------- # A C++ header suitable for testing for CXX98. AC_DEFUN([_AC_CXX_CXX98_TEST_HEADER], [[ #include #include #include #include #include #include #include #include #include #include #include #include #include namespace test { typedef std::vector string_vec; typedef std::pair map_value; typedef std::map map_type; typedef std::set set_type; template class printer { public: printer(std::ostringstream& os): os(os) {} void operator() (T elem) { os << elem << std::endl; } private: std::ostringstream& os; }; } ]])# _AC_CXX_CXX98_TEST_HEADER # _AC_CXX_CXX98_TEST_BODY # ----------------------- # A C++ body suitable for testing for CXX98, assuming the corresponding header. AC_DEFUN([_AC_CXX_CXX98_TEST_BODY], [[ try { // Basic string. std::string teststr("ASCII text"); teststr += " string"; // Simple vector. test::string_vec testvec; testvec.push_back(teststr); testvec.push_back("foo"); testvec.push_back("bar"); if (testvec.size() != 3) { throw std::runtime_error("vector size is not 1"); } // Dump vector into stringstream and obtain string. std::ostringstream os; for (test::string_vec::const_iterator i = testvec.begin(); i != testvec.end(); ++i) { if (i + 1 != testvec.end()) { os << teststr << '\n'; } } // Check algorithms work. std::for_each(testvec.begin(), testvec.end(), test::printer(os)); std::string os_out = os.str(); // Test pair and map. test::map_type testmap; testmap.insert(std::make_pair(std::string("key"), std::make_pair(53,false))); // Test set. int values[] = {9, 7, 13, 15, 4, 18, 12, 10, 5, 3, 14, 19, 17, 8, 6, 20, 16, 2, 11, 1}; test::set_type testset(values, values + sizeof(values)/sizeof(values[0])); std::list testlist(testset.begin(), testset.end()); std::copy(testset.begin(), testset.end(), std::back_inserter(testlist)); } catch (const std::exception& e) { std::cerr << "Caught exception: " << e.what() << std::endl; // Test fstream std::ofstream of("test.txt"); of << "Test ASCII text\n" << std::flush; of << "N= " << std::hex << std::setw(8) << std::left << 534 << std::endl; of.close(); } std::exit(0); ]]) # _AC_CXX_CXX11_TEST_HEADER # ------------------------- # A C++ header suitable for testing for CXX11. AC_DEFUN([_AC_CXX_CXX11_TEST_HEADER], [[ #include #include #include #include #include #include #include namespace cxx11test { typedef std::shared_ptr sptr; typedef std::weak_ptr wptr; typedef std::tuple tp; typedef std::array int_array; constexpr int get_val() { return 20; } struct testinit { int i; double d; }; class delegate { public: delegate(int n) : n(n) {} delegate(): delegate(2354) {} virtual int getval() { return this->n; }; protected: int n; }; class overridden : public delegate { public: overridden(int n): delegate(n) {} virtual int getval() override final { return this->n * 2; } }; class nocopy { public: nocopy(int i): i(i) {} nocopy() = default; nocopy(const nocopy&) = delete; nocopy & operator=(const nocopy&) = delete; private: int i; }; } ]])# _AC_CXX_CXX11_TEST_HEADER # _AC_CXX_CXX11_TEST_BODY # ----------------------- # A C++ body suitable for testing for CXX11, assuming the corresponding header. AC_DEFUN([_AC_CXX_CXX11_TEST_BODY], [[ { // Test auto and decltype std::deque d; d.push_front(43); d.push_front(484); d.push_front(3); d.push_front(844); int total = 0; for (auto i = d.begin(); i != d.end(); ++i) { total += *i; } auto a1 = 6538; auto a2 = 48573953.4; auto a3 = "String literal"; decltype(a2) a4 = 34895.034; } { // Test constexpr short sa[cxx11test::get_val()] = { 0 }; } { // Test initializer lists cxx11test::testinit il = { 4323, 435234.23544 }; } { // Test range-based for and lambda cxx11test::int_array array = {9, 7, 13, 15, 4, 18, 12, 10, 5, 3, 14, 19, 17, 8, 6, 20, 16, 2, 11, 1}; for (int &x : array) { x += 23; } std::for_each(array.begin(), array.end(), [](int v1){ std::cout << v1; }); } { using cxx11test::sptr; using cxx11test::wptr; sptr sp(new std::string("ASCII string")); wptr wp(sp); sptr sp2(wp); } { cxx11test::tp tuple("test", 54, 45.53434); double d = std::get<2>(tuple); std::string s; int i; std::tie(s,i,d) = tuple; } { static std::regex filename_regex("^_?([a-z0-9_.]+-)+[a-z0-9]+$"); std::string testmatch("Test if this string matches"); bool match = std::regex_search(testmatch, filename_regex); } { cxx11test::int_array array = {9, 7, 13, 15, 4, 18, 12, 10, 5, 3, 14, 19, 17, 8, 6, 20, 16, 2, 11, 1}; cxx11test::int_array::size_type size = array.size(); } { // Test constructor delegation cxx11test::delegate d1; cxx11test::delegate d2(); cxx11test::delegate d3(45); } { // Test override and final cxx11test::overridden o1(55464); } { // Test nullptr char *c = nullptr; } { // Test template brackets std::vector> v1; } { // Unicode literals char const *utf8 = u8"UTF-8 string \u2500"; char16_t const *utf16 = u"UTF-8 string \u2500"; char32_t const *utf32 = U"UTF-32 string \u2500"; } ]]) # _AC_PROG_CXX_CXX98 ([ACTION-IF-AVAILABLE], [ACTION-IF-UNAVAILABLE]) # ------------------------------------------------------------------- # If the C++ compiler is not in ISO C++98 mode by default, try to add # an option to output variable CXX to make it so. This macro tries # various options that select ISO C++98 on some system or another. It # considers the compiler to be in ISO C++98 mode if it handles basic # features of the std namespace including: string, containers (list, # map, set, vector), streams (fstreams, iostreams, stringstreams, # iomanip), pair, exceptions and algorithms. AC_DEFUN([_AC_PROG_CXX_CXX98], [_AC_CXX_STD_TRY([cxx98], [_AC_CXX_CXX98_TEST_HEADER], [_AC_CXX_CXX98_TEST_BODY], dnl Try dnl GCC -std=gnu++98 (unused restrictive mode: -std=c++98) dnl IBM XL C -qlanglvl=extended dnl HP aC++ -AA dnl Intel ICC -std=gnu++98 dnl Solaris N/A (default) dnl Tru64 N/A (default, but -std gnu could be used) dnl with extended modes being tried first. [[-std=gnu++98 -std=c++98 -qlanglvl=extended -AA]], [$1], [$2])[]dnl ])# _AC_PROG_CXX_CXX98 # _AC_PROG_CXX_CXX11 ([ACTION-IF-AVAILABLE], [ACTION-IF-UNAVAILABLE]) # ------------------------------------------------------------------- # If the C++ compiler is not in ISO CXX11 mode by default, try to add # an option to output variable CXX to make it so. This macro tries # various options that select ISO C++11 on some system or another. It # considers the compiler to be in ISO C++11 mode if it handles all the # tests from the C++98 checks, plus the following: Language features # (auto, constexpr, decltype, default/deleted constructors, delegate # constructors, final, initializer lists, lambda functions, nullptr, # override, range-based for loops, template brackets without spaces, # unicode literals) and library features (array, memory (shared_ptr, # weak_ptr), regex and tuple types). AC_DEFUN([_AC_PROG_CXX_CXX11], [_AC_CXX_STD_TRY([cxx11], [_AC_CXX_CXX11_TEST_HEADER _AC_CXX_CXX98_TEST_HEADER], [_AC_CXX_CXX11_TEST_BODY _AC_CXX_CXX98_TEST_BODY], dnl Try dnl GCC -std=gnu++11 (unused restrictive mode: -std=c++11) [and 0x variants] dnl IBM XL C -qlanglvl=extended0x dnl (pre-V12.1; unused restrictive mode: -qlanglvl=stdcxx11) dnl HP aC++ -AA dnl Intel ICC -std=c++11 -std=c++0x dnl Solaris N/A (no support) dnl Tru64 N/A (no support) dnl with extended modes being tried first. [[-std=gnu++11 -std=c++11 -std=gnu++0x -std=c++0x -qlanglvl=extended0x -AA]], [$1], [$2])[]dnl ])# _AC_PROG_CXX_CXX11 pspp-1.4.1/gl/m4/vsprintf-posix.m40000644000175000017500000001024713723215637016327 0ustar00blpblp00000000000000# vsprintf-posix.m4 serial 12 dnl Copyright (C) 2007-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_FUNC_VSPRINTF_POSIX], [ AC_REQUIRE([gl_PRINTF_SIZES_C99]) AC_REQUIRE([gl_PRINTF_LONG_DOUBLE]) AC_REQUIRE([gl_PRINTF_INFINITE]) AC_REQUIRE([gl_PRINTF_INFINITE_LONG_DOUBLE]) AC_REQUIRE([gl_PRINTF_DIRECTIVE_A]) AC_REQUIRE([gl_PRINTF_DIRECTIVE_F]) AC_REQUIRE([gl_PRINTF_DIRECTIVE_N]) AC_REQUIRE([gl_PRINTF_DIRECTIVE_LS]) AC_REQUIRE([gl_PRINTF_POSITIONS]) AC_REQUIRE([gl_PRINTF_FLAG_GROUPING]) AC_REQUIRE([gl_PRINTF_FLAG_LEFTADJUST]) AC_REQUIRE([gl_PRINTF_FLAG_ZERO]) AC_REQUIRE([gl_PRINTF_PRECISION]) AC_REQUIRE([gl_PRINTF_ENOMEM]) gl_cv_func_vsprintf_posix=no case "$gl_cv_func_printf_sizes_c99" in *yes) case "$gl_cv_func_printf_long_double" in *yes) case "$gl_cv_func_printf_infinite" in *yes) case "$gl_cv_func_printf_infinite_long_double" in *yes) case "$gl_cv_func_printf_directive_a" in *yes) case "$gl_cv_func_printf_directive_f" in *yes) case "$gl_cv_func_printf_directive_n" in *yes) case "$gl_cv_func_printf_directive_ls" in *yes) case "$gl_cv_func_printf_positions" in *yes) case "$gl_cv_func_printf_flag_grouping" in *yes) case "$gl_cv_func_printf_flag_leftadjust" in *yes) case "$gl_cv_func_printf_flag_zero" in *yes) case "$gl_cv_func_printf_precision" in *yes) case "$gl_cv_func_printf_enomem" in *yes) # vsprintf exists and is # already POSIX compliant. gl_cv_func_vsprintf_posix=yes ;; esac ;; esac ;; esac ;; esac ;; esac ;; esac ;; esac ;; esac ;; esac ;; esac ;; esac ;; esac ;; esac ;; esac if test $gl_cv_func_vsprintf_posix = no; then gl_PREREQ_VASNPRINTF_LONG_DOUBLE gl_PREREQ_VASNPRINTF_INFINITE_DOUBLE gl_PREREQ_VASNPRINTF_INFINITE_LONG_DOUBLE gl_PREREQ_VASNPRINTF_DIRECTIVE_A gl_PREREQ_VASNPRINTF_DIRECTIVE_F gl_PREREQ_VASNPRINTF_DIRECTIVE_LS gl_PREREQ_VASNPRINTF_FLAG_GROUPING gl_PREREQ_VASNPRINTF_FLAG_LEFTADJUST gl_PREREQ_VASNPRINTF_FLAG_ZERO gl_PREREQ_VASNPRINTF_PRECISION gl_PREREQ_VASNPRINTF_ENOMEM gl_REPLACE_VASNPRINTF gl_REPLACE_VSPRINTF fi ]) AC_DEFUN([gl_REPLACE_VSPRINTF], [ AC_REQUIRE([gl_STDIO_H_DEFAULTS]) AC_LIBOBJ([vsprintf]) REPLACE_VSPRINTF=1 gl_PREREQ_VSPRINTF ]) AC_DEFUN([gl_PREREQ_VSPRINTF], [:]) pspp-1.4.1/gl/m4/realloc.m40000644000175000017500000000517713723215637014743 0ustar00blpblp00000000000000# realloc.m4 serial 18 dnl Copyright (C) 2007, 2009-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. # This is adapted with modifications from upstream Autoconf here: # https://git.savannah.gnu.org/cgit/autoconf.git/commit/?id=04be2b7a29d65d9a08e64e8e56e594c91749598c AC_DEFUN([_AC_FUNC_REALLOC_IF], [ AC_REQUIRE([AC_HEADER_STDC])dnl AC_REQUIRE([AC_CANONICAL_HOST])dnl for cross-compiles AC_CHECK_HEADERS([stdlib.h]) AC_CACHE_CHECK([for GNU libc compatible realloc], [ac_cv_func_realloc_0_nonnull], [AC_RUN_IFELSE( [AC_LANG_PROGRAM( [[#if defined STDC_HEADERS || defined HAVE_STDLIB_H # include #else char *realloc (); #endif ]], [[char *p = realloc (0, 0); int result = !p; free (p); return result;]]) ], [ac_cv_func_realloc_0_nonnull=yes], [ac_cv_func_realloc_0_nonnull=no], [case "$host_os" in # Guess yes on platforms where we know the result. *-gnu* | gnu* | *-musl* | freebsd* | netbsd* | openbsd* \ | hpux* | solaris* | cygwin* | mingw*) ac_cv_func_realloc_0_nonnull="guessing yes" ;; # If we don't know, obey --enable-cross-guesses. *) ac_cv_func_realloc_0_nonnull="$gl_cross_guess_normal" ;; esac ]) ]) case "$ac_cv_func_realloc_0_nonnull" in *yes) $1 ;; *) $2 ;; esac ])# AC_FUNC_REALLOC # gl_FUNC_REALLOC_GNU # ------------------- # Test whether 'realloc (0, 0)' is handled like in GNU libc, and replace # realloc if it is not. AC_DEFUN([gl_FUNC_REALLOC_GNU], [ AC_REQUIRE([gl_STDLIB_H_DEFAULTS]) dnl _AC_FUNC_REALLOC_IF is defined in Autoconf. _AC_FUNC_REALLOC_IF( [AC_DEFINE([HAVE_REALLOC_GNU], [1], [Define to 1 if your system has a GNU libc compatible 'realloc' function, and to 0 otherwise.])], [AC_DEFINE([HAVE_REALLOC_GNU], [0]) REPLACE_REALLOC=1 ]) ])# gl_FUNC_REALLOC_GNU # gl_FUNC_REALLOC_POSIX # --------------------- # Test whether 'realloc' is POSIX compliant (sets errno to ENOMEM when it # fails), and replace realloc if it is not. AC_DEFUN([gl_FUNC_REALLOC_POSIX], [ AC_REQUIRE([gl_STDLIB_H_DEFAULTS]) AC_REQUIRE([gl_CHECK_MALLOC_POSIX]) if test $gl_cv_func_malloc_posix = yes; then AC_DEFINE([HAVE_REALLOC_POSIX], [1], [Define if the 'realloc' function is POSIX compliant.]) else REPLACE_REALLOC=1 fi ]) pspp-1.4.1/gl/m4/intl-thread-locale.m40000644000175000017500000001547213723215637016771 0ustar00blpblp00000000000000# intl-thread-locale.m4 serial 8 dnl Copyright (C) 2015-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl dnl This file can be used in projects which are not available under dnl the GNU General Public License or the GNU Lesser General Public dnl License but which still want to provide support for the GNU gettext dnl functionality. dnl Please note that the actual code of the GNU gettext library is covered dnl by the GNU Lesser General Public License, and the rest of the GNU dnl gettext package is covered by the GNU General Public License. dnl They are *not* in the public domain. dnl Check how to retrieve the name of a per-thread locale (POSIX locale_t). dnl Sets gt_nameless_locales. AC_DEFUN([gt_INTL_THREAD_LOCALE_NAME], [ AC_REQUIRE([AC_CANONICAL_HOST]) dnl Persuade Solaris to define 'locale_t'. AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS]) dnl Test whether uselocale() exists and works at all. gt_FUNC_USELOCALE dnl On OpenBSD >= 6.2, the locale_t type and the uselocale(), newlocale(), dnl duplocale(), freelocale() functions exist but are effectively useless, dnl because the locale_t value depends only on the LC_CTYPE category of the dnl locale and furthermore contains only one bit of information (it dnl distinguishes the "C" locale from the *.UTF-8 locales). See dnl . dnl In the setlocale() implementation they have thought about the programs dnl that use the API ("Even though only LC_CTYPE has any effect in the dnl OpenBSD base system, store complete information about the global locale, dnl such that third-party software can access it"), but for uselocale() dnl they did not think about the programs. dnl In this situation, even the HAVE_NAMELESS_LOCALES support does not work. dnl So, define HAVE_FAKE_LOCALES and disable all locale_t support. case "$gt_cv_func_uselocale_works" in *yes) AC_CHECK_HEADERS_ONCE([xlocale.h]) AC_CACHE_CHECK([for fake locale system (OpenBSD)], [gt_cv_locale_fake], [AC_RUN_IFELSE( [AC_LANG_SOURCE([[ #include #if HAVE_XLOCALE_H # include #endif int main () { locale_t loc1, loc2; if (setlocale (LC_ALL, "de_DE.UTF-8") == NULL) return 1; if (setlocale (LC_ALL, "fr_FR.UTF-8") == NULL) return 1; loc1 = newlocale (LC_ALL_MASK, "de_DE.UTF-8", (locale_t)0); loc2 = newlocale (LC_ALL_MASK, "fr_FR.UTF-8", (locale_t)0); return !(loc1 == loc2); }]])], [gt_cv_locale_fake=yes], [gt_cv_locale_fake=no], [dnl Guess the locale system is fake only on OpenBSD. case "$host_os" in openbsd*) gt_cv_locale_fake="guessing yes" ;; *) gt_cv_locale_fake="guessing no" ;; esac ]) ]) ;; *) gt_cv_locale_fake=no ;; esac case "$gt_cv_locale_fake" in *yes) AC_DEFINE([HAVE_FAKE_LOCALES], [1], [Define if the locale_t type contains insufficient information, as on OpenBSD.]) ;; esac case "$gt_cv_func_uselocale_works" in *yes) AC_CACHE_CHECK([for Solaris 11.4 locale system], [gt_cv_locale_solaris114], [case "$host_os" in solaris*) dnl Test whether defines locale_t as a typedef of dnl 'struct _LC_locale_t **' (whereas Illumos defines it as a dnl typedef of 'struct _locale *'). dnl Another possible test would be to include dnl and test whether it defines the _LC_core_data_locale_t type. dnl This type was added in Solaris 11.4. AC_COMPILE_IFELSE( [AC_LANG_PROGRAM([[ #include struct _LC_locale_t *x; locale_t y; ]], [[*y = x;]])], [gt_cv_locale_solaris114=yes], [gt_cv_locale_solaris114=no]) ;; *) gt_cv_locale_solaris114=no ;; esac ]) ;; *) gt_cv_locale_solaris114=no ;; esac if test $gt_cv_locale_solaris114 = yes; then AC_DEFINE([HAVE_SOLARIS114_LOCALES], [1], [Define if the locale_t type is as on Solaris 11.4.]) fi dnl Solaris 12 will maybe provide getlocalename_l. If it does, it will dnl improve the implementation of gl_locale_name_thread(), by removing dnl the use of undocumented structures. case "$gt_cv_func_uselocale_works" in *yes) AC_CHECK_FUNCS([getlocalename_l]) ;; esac dnl This code is for platforms where the locale_t type does not provide access dnl to the name of each locale category. This code has the drawback that it dnl requires the gnulib overrides of 'newlocale', 'duplocale', 'freelocale', dnl which is a problem for GNU libunistring. Therefore try hard to avoid dnl enabling this code! gt_nameless_locales=no case "$host_os" in dnl It's needed on AIX 7.2. aix*) gt_nameless_locales=yes AC_DEFINE([HAVE_NAMELESS_LOCALES], [1], [Define if the locale_t type does not contain the name of each locale category.]) ;; esac ]) dnl Tests whether uselocale() exists and is usable. dnl Sets gt_cv_func_uselocale_works. Defines HAVE_WORKING_USELOCALE. AC_DEFUN([gt_FUNC_USELOCALE], [ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles dnl Persuade glibc and Solaris to define 'locale_t'. AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS]) AC_CHECK_FUNCS_ONCE([uselocale]) dnl On AIX 7.2, the uselocale() function is not documented and leads to dnl crashes in subsequent setlocale() invocations. dnl In 2019, some versions of z/OS lack the locale_t type and have a broken dnl uselocale function. if test $ac_cv_func_uselocale = yes; then AC_CHECK_HEADERS_ONCE([xlocale.h]) AC_CACHE_CHECK([whether uselocale works], [gt_cv_func_uselocale_works], [AC_RUN_IFELSE( [AC_LANG_SOURCE([[ #include #if HAVE_XLOCALE_H # include #endif locale_t loc1; int main () { uselocale (NULL); setlocale (LC_ALL, "en_US.UTF-8"); return 0; }]])], [gt_cv_func_uselocale_works=yes], [gt_cv_func_uselocale_works=no], [# Guess no on AIX and z/OS, yes otherwise. case "$host_os" in aix* | openedition*) gt_cv_func_uselocale_works="guessing no" ;; *) gt_cv_func_uselocale_works="guessing yes" ;; esac ]) ]) else gt_cv_func_uselocale_works=no fi case "$gt_cv_func_uselocale_works" in *yes) AC_DEFINE([HAVE_WORKING_USELOCALE], [1], [Define if the uselocale function exists any may safely be called.]) ;; esac ]) pspp-1.4.1/gl/m4/memmem.m40000644000175000017500000001143013723215637014564 0ustar00blpblp00000000000000# memmem.m4 serial 27 dnl Copyright (C) 2002-2004, 2007-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl Check that memmem is present and functional. AC_DEFUN([gl_FUNC_MEMMEM_SIMPLE], [ dnl Persuade glibc to declare memmem(). AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS]) AC_REQUIRE([gl_HEADER_STRING_H_DEFAULTS]) AC_CHECK_FUNCS([memmem]) if test $ac_cv_func_memmem = yes; then HAVE_MEMMEM=1 else HAVE_MEMMEM=0 fi AC_CHECK_DECLS_ONCE([memmem]) if test $ac_cv_have_decl_memmem = no; then HAVE_DECL_MEMMEM=0 else dnl Detect https://sourceware.org/bugzilla/show_bug.cgi?id=12092. dnl Also check that we handle empty needles correctly. AC_CACHE_CHECK([whether memmem works], [gl_cv_func_memmem_works_always], [AC_RUN_IFELSE([AC_LANG_PROGRAM([[ #include /* for memmem */ #define P "_EF_BF_BD" #define HAYSTACK "F_BD_CE_BD" P P P P "_C3_88_20" P P P "_C3_A7_20" P #define NEEDLE P P P P P ]], [[ int result = 0; if (memmem (HAYSTACK, strlen (HAYSTACK), NEEDLE, strlen (NEEDLE))) result |= 1; /* Check for empty needle behavior. */ { const char *haystack = "AAA"; if (memmem (haystack, 3, (const char *) 1, 0) != haystack) result |= 2; } return result; ]])], [gl_cv_func_memmem_works_always=yes], [gl_cv_func_memmem_works_always=no], [dnl glibc 2.9..2.12 and cygwin 1.7.7 have issue #12092 above. dnl Also empty needles work on glibc >= 2.1 and cygwin >= 1.7.0. dnl uClibc is not affected, since it uses different source code. dnl Assume that it works on all other platforms (even if not linear). AC_EGREP_CPP([Lucky user], [ #ifdef __GNU_LIBRARY__ #include #if ((__GLIBC__ == 2 && ((__GLIBC_MINOR > 0 && __GLIBC_MINOR__ < 9) \ || __GLIBC_MINOR__ > 12)) \ || (__GLIBC__ > 2)) \ || defined __UCLIBC__ Lucky user #endif #elif defined __CYGWIN__ #include #if CYGWIN_VERSION_DLL_COMBINED > CYGWIN_VERSION_DLL_MAKE_COMBINED (1007, 7) Lucky user #endif #else Lucky user #endif ], [gl_cv_func_memmem_works_always="guessing yes"], [gl_cv_func_memmem_works_always="$gl_cross_guess_normal"]) ]) ]) case "$gl_cv_func_memmem_works_always" in *yes) ;; *) REPLACE_MEMMEM=1 ;; esac fi gl_PREREQ_MEMMEM ]) # gl_FUNC_MEMMEM_SIMPLE dnl Additionally, check that memmem has linear performance characteristics AC_DEFUN([gl_FUNC_MEMMEM], [ AC_REQUIRE([gl_FUNC_MEMMEM_SIMPLE]) if test $HAVE_DECL_MEMMEM = 1 && test $REPLACE_MEMMEM = 0; then AC_CACHE_CHECK([whether memmem works in linear time], [gl_cv_func_memmem_works_fast], [AC_RUN_IFELSE([AC_LANG_PROGRAM([[ #include /* for signal */ #include /* for memmem */ #include /* for malloc */ #include /* for alarm */ static void quit (int sig) { _exit (sig + 128); } ]], [[ int result = 0; size_t m = 1000000; char *haystack = (char *) malloc (2 * m + 1); char *needle = (char *) malloc (m + 1); /* Failure to compile this test due to missing alarm is okay, since all such platforms (mingw) also lack memmem. */ signal (SIGALRM, quit); alarm (5); /* Check for quadratic performance. */ if (haystack && needle) { memset (haystack, 'A', 2 * m); haystack[2 * m] = 'B'; memset (needle, 'A', m); needle[m] = 'B'; if (!memmem (haystack, 2 * m + 1, needle, m + 1)) result |= 1; } /* Free allocated memory, in case some sanitizer is watching. */ free (haystack); free (needle); return result; ]])], [gl_cv_func_memmem_works_fast=yes], [gl_cv_func_memmem_works_fast=no], [dnl Only glibc >= 2.9 and cygwin > 1.7.0 are known to have a dnl memmem that works in linear time. AC_EGREP_CPP([Lucky user], [ #include #ifdef __GNU_LIBRARY__ #if ((__GLIBC__ == 2 && __GLIBC_MINOR__ >= 9) || (__GLIBC__ > 2)) \ && !defined __UCLIBC__ Lucky user #endif #endif #ifdef __CYGWIN__ #include #if CYGWIN_VERSION_DLL_COMBINED > CYGWIN_VERSION_DLL_MAKE_COMBINED (1007, 0) Lucky user #endif #endif ], [gl_cv_func_memmem_works_fast="guessing yes"], [gl_cv_func_memmem_works_fast="$gl_cross_guess_normal"]) ]) ]) case "$gl_cv_func_memmem_works_fast" in *yes) ;; *) REPLACE_MEMMEM=1 ;; esac fi ]) # gl_FUNC_MEMMEM # Prerequisites of lib/memmem.c. AC_DEFUN([gl_PREREQ_MEMMEM], [:]) pspp-1.4.1/gl/m4/gnulib-cache.m40000644000175000017500000001271513723556166015644 0ustar00blpblp00000000000000# Copyright (C) 2002-2020 Free Software Foundation, Inc. # # This file 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 3 of the License, or # (at your option) any later version. # # This file 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 file. If not, see . # # As a special exception to the GNU General Public License, # this file may be distributed as part of a program that # contains a configuration script generated by Autoconf, under # the same distribution terms as the rest of that program. # # Generated by gnulib-tool. # # This file represents the specification of how gnulib-tool is used. # It acts as a cache: It is written and read by gnulib-tool. # In projects that use version control, this file is meant to be put under # version control, like the configure.ac and various Makefile.am files. # Specification in the form of a command-line invocation: # gnulib-tool --import \ # --lib=libgl \ # --source-base=gl \ # --m4-base=gl/m4 \ # --doc-base=gl/doc \ # --tests-base=tests \ # --aux-dir=build-aux \ # --no-conditional-dependencies \ # --libtool \ # --macro-prefix=gl \ # assert \ # byteswap \ # c-ctype \ # c-snprintf \ # c-strcase \ # c-strcasestr \ # c-strtod \ # c-xvasprintf \ # clean-temp \ # close \ # configmake \ # count-leading-zeros \ # count-one-bits \ # crc \ # crypto/md4 \ # crypto/rijndael \ # dirname \ # dtoastr \ # dtotimespec \ # environ \ # fatal-signal \ # fcntl \ # fpieee \ # fprintf-posix \ # fseeko \ # ftello \ # full-read \ # full-write \ # fwriteerror \ # getline \ # getopt-gnu \ # getpass \ # gettext-h \ # gettime \ # gettimeofday \ # gitlog-to-changelog \ # include_next \ # intprops \ # inttostr \ # isfinite \ # isinf \ # isnan \ # localcharset \ # localename \ # mbchar \ # mbiter \ # memcasecmp \ # memchr \ # memchr2 \ # memmem \ # mempcpy \ # memrchr \ # minmax \ # mkdtemp \ # mkstemp \ # nstrftime \ # pipe2 \ # printf-posix \ # printf-safe \ # progname \ # rawmemchr \ # read-file \ # regex \ # relocatable-prog \ # rename \ # round \ # select \ # snprintf \ # snprintf-posix \ # sprintf-posix \ # stdarg \ # stdbool \ # stdint \ # stpcpy \ # strcasestr \ # strerror \ # strsep \ # strtod \ # strtok_r \ # sys_stat \ # tempname \ # termios \ # timespec \ # timespec-add \ # timespec-sub \ # trunc \ # unicase/u8-casecmp \ # unicase/u8-casefold \ # unicase/u8-tolower \ # unicase/u8-totitle \ # unicase/u8-toupper \ # unictype/category-of \ # unictype/ctype-print \ # unigbrk/uc-is-grapheme-break \ # unilbrk/u8-possible-linebreaks \ # uninorm/nfkd \ # unistd \ # unistr/u8-check \ # unistr/u8-cpy \ # unistr/u8-mblen \ # unistr/u8-mbtouc \ # unistr/u8-mbtoucr \ # unistr/u8-strlen \ # unistr/u8-strmbtouc \ # unistr/u8-strncat \ # unistr/u8-uctomb \ # unitypes \ # uniwidth/u8-strwidth \ # unlocked-io \ # vasprintf-posix \ # version-etc \ # version-etc-fsf \ # vfprintf-posix \ # vprintf-posix \ # vsnprintf \ # vsnprintf-posix \ # vsprintf-posix \ # xalloc \ # xalloc-die \ # xbinary-io \ # xmalloca \ # xmemdup0 \ # xsize \ # xstrndup \ # xvasprintf # Specification in the form of a few gnulib-tool.m4 macro invocations: gl_LOCAL_DIR([]) gl_MODULES([ assert byteswap c-ctype c-snprintf c-strcase c-strcasestr c-strtod c-xvasprintf clean-temp close configmake count-leading-zeros count-one-bits crc crypto/md4 crypto/rijndael dirname dtoastr dtotimespec environ fatal-signal fcntl fpieee fprintf-posix fseeko ftello full-read full-write fwriteerror getline getopt-gnu getpass gettext-h gettime gettimeofday gitlog-to-changelog include_next intprops inttostr isfinite isinf isnan localcharset localename mbchar mbiter memcasecmp memchr memchr2 memmem mempcpy memrchr minmax mkdtemp mkstemp nstrftime pipe2 printf-posix printf-safe progname rawmemchr read-file regex relocatable-prog rename round select snprintf snprintf-posix sprintf-posix stdarg stdbool stdint stpcpy strcasestr strerror strsep strtod strtok_r sys_stat tempname termios timespec timespec-add timespec-sub trunc unicase/u8-casecmp unicase/u8-casefold unicase/u8-tolower unicase/u8-totitle unicase/u8-toupper unictype/category-of unictype/ctype-print unigbrk/uc-is-grapheme-break unilbrk/u8-possible-linebreaks uninorm/nfkd unistd unistr/u8-check unistr/u8-cpy unistr/u8-mblen unistr/u8-mbtouc unistr/u8-mbtoucr unistr/u8-strlen unistr/u8-strmbtouc unistr/u8-strncat unistr/u8-uctomb unitypes uniwidth/u8-strwidth unlocked-io vasprintf-posix version-etc version-etc-fsf vfprintf-posix vprintf-posix vsnprintf vsnprintf-posix vsprintf-posix xalloc xalloc-die xbinary-io xmalloca xmemdup0 xsize xstrndup xvasprintf ]) gl_AVOID([]) gl_SOURCE_BASE([gl]) gl_M4_BASE([gl/m4]) gl_PO_BASE([]) gl_DOC_BASE([gl/doc]) gl_TESTS_BASE([tests]) gl_LIB([libgl]) gl_MAKEFILE_NAME([]) gl_LIBTOOL gl_MACRO_PREFIX([gl]) gl_PO_DOMAIN([]) gl_WITNESS_C_MACRO([]) pspp-1.4.1/gl/m4/locale-ja.m40000644000175000017500000001323313723215637015141 0ustar00blpblp00000000000000# locale-ja.m4 serial 14 dnl Copyright (C) 2003, 2005-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl From Bruno Haible. dnl Determine the name of a japanese locale with EUC-JP encoding. AC_DEFUN([gt_LOCALE_JA], [ AC_REQUIRE([AC_CANONICAL_HOST]) AC_REQUIRE([AM_LANGINFO_CODESET]) AC_CACHE_CHECK([for a traditional japanese locale], [gt_cv_locale_ja], [ AC_LANG_CONFTEST([AC_LANG_SOURCE([ changequote(,)dnl #include #include #if HAVE_LANGINFO_CODESET # include #endif #include #include struct tm t; char buf[16]; int main () { /* On BeOS and Haiku, locales are not implemented in libc. Rather, libintl imitates locale dependent behaviour by looking at the environment variables, and all locales use the UTF-8 encoding. */ #if defined __BEOS__ || defined __HAIKU__ return 1; #else /* Check whether the given locale name is recognized by the system. */ # if defined _WIN32 && !defined __CYGWIN__ /* On native Windows, setlocale(category, "") looks at the system settings, not at the environment variables. Also, when an encoding suffix such as ".65001" or ".54936" is specified, it succeeds but sets the LC_CTYPE category of the locale to "C". */ if (setlocale (LC_ALL, getenv ("LC_ALL")) == NULL || strcmp (setlocale (LC_CTYPE, NULL), "C") == 0) return 1; # else if (setlocale (LC_ALL, "") == NULL) return 1; # endif /* Check whether nl_langinfo(CODESET) is nonempty and not "ASCII" or "646". On Mac OS X 10.3.5 (Darwin 7.5) in the fr_FR locale, nl_langinfo(CODESET) is empty, and the behaviour of Tcl 8.4 in this locale is not useful. On OpenBSD 4.0, when an unsupported locale is specified, setlocale() succeeds but then nl_langinfo(CODESET) is "646". In this situation, some unit tests fail. On MirBSD 10, when an unsupported locale is specified, setlocale() succeeds but then nl_langinfo(CODESET) is "UTF-8". */ # if HAVE_LANGINFO_CODESET { const char *cs = nl_langinfo (CODESET); if (cs[0] == '\0' || strcmp (cs, "ASCII") == 0 || strcmp (cs, "646") == 0 || strcmp (cs, "UTF-8") == 0) return 1; } # endif # ifdef __CYGWIN__ /* On Cygwin, avoid locale names without encoding suffix, because the locale_charset() function relies on the encoding suffix. Note that LC_ALL is set on the command line. */ if (strchr (getenv ("LC_ALL"), '.') == NULL) return 1; # endif /* Check whether MB_CUR_MAX is > 1. This excludes the dysfunctional locales on Cygwin 1.5.x. */ if (MB_CUR_MAX == 1) return 1; /* Check whether in a month name, no byte in the range 0x80..0x9F occurs. This excludes the UTF-8 encoding (except on MirBSD). */ { const char *p; t.tm_year = 1975 - 1900; t.tm_mon = 2 - 1; t.tm_mday = 4; if (strftime (buf, sizeof (buf), "%B", &t) < 2) return 1; for (p = buf; *p != '\0'; p++) if ((unsigned char) *p >= 0x80 && (unsigned char) *p < 0xa0) return 1; } return 0; #endif } changequote([,])dnl ])]) if AC_TRY_EVAL([ac_link]) && test -s conftest$ac_exeext; then case "$host_os" in # Handle native Windows specially, because there setlocale() interprets # "ar" as "Arabic" or "Arabic_Saudi Arabia.1256", # "fr" or "fra" as "French" or "French_France.1252", # "ge"(!) or "deu"(!) as "German" or "German_Germany.1252", # "ja" as "Japanese" or "Japanese_Japan.932", # and similar. mingw*) # Note that on native Windows, the Japanese locale is # Japanese_Japan.932, and CP932 is very different from EUC-JP, so we # cannot use it here. gt_cv_locale_ja=none ;; *) # Setting LC_ALL is not enough. Need to set LC_TIME to empty, because # otherwise on Mac OS X 10.3.5 the LC_TIME=C from the beginning of the # configure script would override the LC_ALL setting. Likewise for # LC_CTYPE, which is also set at the beginning of the configure script. # Test for the AIX locale name. if (LC_ALL=ja_JP LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then gt_cv_locale_ja=ja_JP else # Test for the locale name with explicit encoding suffix. if (LC_ALL=ja_JP.EUC-JP LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then gt_cv_locale_ja=ja_JP.EUC-JP else # Test for the HP-UX, OSF/1, NetBSD locale name. if (LC_ALL=ja_JP.eucJP LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then gt_cv_locale_ja=ja_JP.eucJP else # Test for the IRIX, FreeBSD locale name. if (LC_ALL=ja_JP.EUC LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then gt_cv_locale_ja=ja_JP.EUC else # Test for the Solaris 7 locale name. if (LC_ALL=ja LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then gt_cv_locale_ja=ja else # Special test for NetBSD 1.6. if test -f /usr/share/locale/ja_JP.eucJP/LC_CTYPE; then gt_cv_locale_ja=ja_JP.eucJP else # None found. gt_cv_locale_ja=none fi fi fi fi fi fi ;; esac fi rm -fr conftest* ]) LOCALE_JA=$gt_cv_locale_ja AC_SUBST([LOCALE_JA]) ]) pspp-1.4.1/gl/m4/stddef_h.m40000644000175000017500000000450113723215637015070 0ustar00blpblp00000000000000dnl A placeholder for , for platforms that have issues. # stddef_h.m4 serial 6 dnl Copyright (C) 2009-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_STDDEF_H], [ AC_REQUIRE([gl_STDDEF_H_DEFAULTS]) AC_REQUIRE([gt_TYPE_WCHAR_T]) STDDEF_H= dnl Test whether the type max_align_t exists and whether its alignment dnl "is as great as is supported by the implementation in all contexts". AC_CACHE_CHECK([for good max_align_t], [gl_cv_type_max_align_t], [AC_COMPILE_IFELSE( [AC_LANG_PROGRAM( [[#include unsigned int s = sizeof (max_align_t); #if defined __GNUC__ || defined __IBM__ALIGNOF__ int check1[2 * (__alignof__ (double) <= __alignof__ (max_align_t)) - 1]; int check2[2 * (__alignof__ (long double) <= __alignof__ (max_align_t)) - 1]; #endif ]])], [gl_cv_type_max_align_t=yes], [gl_cv_type_max_align_t=no]) ]) if test $gl_cv_type_max_align_t = no; then HAVE_MAX_ALIGN_T=0 STDDEF_H=stddef.h fi if test $gt_cv_c_wchar_t = no; then HAVE_WCHAR_T=0 STDDEF_H=stddef.h fi AC_CACHE_CHECK([whether NULL can be used in arbitrary expressions], [gl_cv_decl_null_works], [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include int test[2 * (sizeof NULL == sizeof (void *)) -1]; ]])], [gl_cv_decl_null_works=yes], [gl_cv_decl_null_works=no])]) if test $gl_cv_decl_null_works = no; then REPLACE_NULL=1 STDDEF_H=stddef.h fi AC_SUBST([STDDEF_H]) AM_CONDITIONAL([GL_GENERATE_STDDEF_H], [test -n "$STDDEF_H"]) if test -n "$STDDEF_H"; then gl_NEXT_HEADERS([stddef.h]) fi ]) AC_DEFUN([gl_STDDEF_MODULE_INDICATOR], [ dnl Use AC_REQUIRE here, so that the default settings are expanded once only. AC_REQUIRE([gl_STDDEF_H_DEFAULTS]) gl_MODULE_INDICATOR_SET_VARIABLE([$1]) ]) AC_DEFUN([gl_STDDEF_H_DEFAULTS], [ dnl Assume proper GNU behavior unless another module says otherwise. REPLACE_NULL=0; AC_SUBST([REPLACE_NULL]) HAVE_MAX_ALIGN_T=1; AC_SUBST([HAVE_MAX_ALIGN_T]) HAVE_WCHAR_T=1; AC_SUBST([HAVE_WCHAR_T]) ]) pspp-1.4.1/gl/m4/vsnprintf.m40000644000175000017500000000362113723215637015343 0ustar00blpblp00000000000000# vsnprintf.m4 serial 7 dnl Copyright (C) 2002-2004, 2007-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl Libintl 0.17 will replace vsnprintf only if it does not support %1$s, dnl but defers to any gnulib vsnprintf replacements. Therefore, gnulib dnl must guarantee that the decision for replacing vsnprintf is a superset dnl of the reasons checked by libintl. AC_DEFUN([gl_FUNC_VSNPRINTF], [ AC_REQUIRE([gl_STDIO_H_DEFAULTS]) gl_cv_func_vsnprintf_usable=no AC_CHECK_FUNCS([vsnprintf]) if test $ac_cv_func_vsnprintf = yes; then gl_SNPRINTF_SIZE1 case "$gl_cv_func_snprintf_size1" in *yes) gl_SNPRINTF_RETVAL_C99 case "$gl_cv_func_snprintf_retval_c99" in *yes) gl_PRINTF_POSITIONS case "$gl_cv_func_printf_positions" in *yes) gl_cv_func_vsnprintf_usable=yes ;; esac ;; esac ;; esac fi if test $gl_cv_func_vsnprintf_usable = no; then gl_REPLACE_VSNPRINTF fi AC_CHECK_DECLS_ONCE([vsnprintf]) if test $ac_cv_have_decl_vsnprintf = no; then HAVE_DECL_VSNPRINTF=0 fi ]) AC_DEFUN([gl_REPLACE_VSNPRINTF], [ AC_REQUIRE([gl_STDIO_H_DEFAULTS]) AC_LIBOBJ([vsnprintf]) if test $ac_cv_func_vsnprintf = yes; then REPLACE_VSNPRINTF=1 else AC_CHECK_DECLS_ONCE([vsnprintf]) if test $ac_cv_have_decl_vsnprintf = yes; then dnl If the function is declared but does not appear to exist, it may be dnl defined as an inline function. In order to avoid a conflict, we have dnl to define rpl_vsnprintf, not vsnprintf. REPLACE_VSNPRINTF=1 fi fi gl_PREREQ_VSNPRINTF ]) # Prerequisites of lib/vsnprintf.c. AC_DEFUN([gl_PREREQ_VSNPRINTF], [:]) pspp-1.4.1/gl/m4/off_t.m40000644000175000017500000000100613723215637014402 0ustar00blpblp00000000000000# off_t.m4 serial 1 dnl Copyright (C) 2012-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl Check whether to override the 'off_t' type. dnl Set WINDOWS_64_BIT_OFF_T. AC_DEFUN([gl_TYPE_OFF_T], [ m4_ifdef([gl_LARGEFILE], [ AC_REQUIRE([gl_LARGEFILE]) ], [ WINDOWS_64_BIT_OFF_T=0 ]) AC_SUBST([WINDOWS_64_BIT_OFF_T]) ]) pspp-1.4.1/gl/m4/signal_h.m40000644000175000017500000000610113723215637015072 0ustar00blpblp00000000000000# signal_h.m4 serial 19 dnl Copyright (C) 2007-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_SIGNAL_H], [ AC_REQUIRE([gl_SIGNAL_H_DEFAULTS]) AC_REQUIRE([gl_CHECK_TYPE_SIGSET_T]) gl_NEXT_HEADERS([signal.h]) # AIX declares sig_atomic_t to already include volatile, and C89 compilers # then choke on 'volatile sig_atomic_t'. C99 requires that it compile. AC_CHECK_TYPE([volatile sig_atomic_t], [], [HAVE_TYPE_VOLATILE_SIG_ATOMIC_T=0], [[ #include ]]) dnl Ensure the type pid_t gets defined. AC_REQUIRE([AC_TYPE_PID_T]) AC_REQUIRE([AC_TYPE_UID_T]) dnl Persuade glibc to define sighandler_t. AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS]) AC_CHECK_TYPE([sighandler_t], [], [HAVE_SIGHANDLER_T=0], [[ #include ]]) dnl Check for declarations of anything we want to poison if the dnl corresponding gnulib module is not in use. gl_WARN_ON_USE_PREPARE([[#include ]], [pthread_sigmask sigaction sigaddset sigdelset sigemptyset sigfillset sigismember sigpending sigprocmask]) AC_REQUIRE([AC_C_RESTRICT]) ]) AC_DEFUN([gl_CHECK_TYPE_SIGSET_T], [ AC_CHECK_TYPES([sigset_t], [gl_cv_type_sigset_t=yes], [gl_cv_type_sigset_t=no], [[ #include /* Mingw defines sigset_t not in , but in . */ #include ]]) if test $gl_cv_type_sigset_t != yes; then HAVE_SIGSET_T=0 fi ]) AC_DEFUN([gl_SIGNAL_MODULE_INDICATOR], [ dnl Use AC_REQUIRE here, so that the default settings are expanded once only. AC_REQUIRE([gl_SIGNAL_H_DEFAULTS]) gl_MODULE_INDICATOR_SET_VARIABLE([$1]) dnl Define it also as a C macro, for the benefit of the unit tests. gl_MODULE_INDICATOR_FOR_TESTS([$1]) ]) AC_DEFUN([gl_SIGNAL_H_DEFAULTS], [ GNULIB_PTHREAD_SIGMASK=0; AC_SUBST([GNULIB_PTHREAD_SIGMASK]) GNULIB_RAISE=0; AC_SUBST([GNULIB_RAISE]) GNULIB_SIGNAL_H_SIGPIPE=0; AC_SUBST([GNULIB_SIGNAL_H_SIGPIPE]) GNULIB_SIGPROCMASK=0; AC_SUBST([GNULIB_SIGPROCMASK]) GNULIB_SIGACTION=0; AC_SUBST([GNULIB_SIGACTION]) dnl Assume proper GNU behavior unless another module says otherwise. HAVE_POSIX_SIGNALBLOCKING=1; AC_SUBST([HAVE_POSIX_SIGNALBLOCKING]) HAVE_PTHREAD_SIGMASK=1; AC_SUBST([HAVE_PTHREAD_SIGMASK]) HAVE_RAISE=1; AC_SUBST([HAVE_RAISE]) HAVE_SIGSET_T=1; AC_SUBST([HAVE_SIGSET_T]) HAVE_SIGINFO_T=1; AC_SUBST([HAVE_SIGINFO_T]) HAVE_SIGACTION=1; AC_SUBST([HAVE_SIGACTION]) HAVE_STRUCT_SIGACTION_SA_SIGACTION=1; AC_SUBST([HAVE_STRUCT_SIGACTION_SA_SIGACTION]) HAVE_TYPE_VOLATILE_SIG_ATOMIC_T=1; AC_SUBST([HAVE_TYPE_VOLATILE_SIG_ATOMIC_T]) HAVE_SIGHANDLER_T=1; AC_SUBST([HAVE_SIGHANDLER_T]) REPLACE_PTHREAD_SIGMASK=0; AC_SUBST([REPLACE_PTHREAD_SIGMASK]) REPLACE_RAISE=0; AC_SUBST([REPLACE_RAISE]) ]) pspp-1.4.1/gl/m4/locale-fr.m40000644000175000017500000002460413723215637015162 0ustar00blpblp00000000000000# locale-fr.m4 serial 19 dnl Copyright (C) 2003, 2005-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl From Bruno Haible. dnl Determine the name of a french locale with traditional encoding. AC_DEFUN([gt_LOCALE_FR], [ AC_REQUIRE([AC_CANONICAL_HOST]) AC_REQUIRE([AM_LANGINFO_CODESET]) AC_CACHE_CHECK([for a traditional french locale], [gt_cv_locale_fr], [ AC_LANG_CONFTEST([AC_LANG_SOURCE([ changequote(,)dnl #include #include #if HAVE_LANGINFO_CODESET # include #endif #include #include struct tm t; char buf[16]; int main () { /* On BeOS and Haiku, locales are not implemented in libc. Rather, libintl imitates locale dependent behaviour by looking at the environment variables, and all locales use the UTF-8 encoding. */ #if defined __BEOS__ || defined __HAIKU__ return 1; #else /* Check whether the given locale name is recognized by the system. */ # if defined _WIN32 && !defined __CYGWIN__ /* On native Windows, setlocale(category, "") looks at the system settings, not at the environment variables. Also, when an encoding suffix such as ".65001" or ".54936" is specified, it succeeds but sets the LC_CTYPE category of the locale to "C". */ if (setlocale (LC_ALL, getenv ("LC_ALL")) == NULL || strcmp (setlocale (LC_CTYPE, NULL), "C") == 0) return 1; # else if (setlocale (LC_ALL, "") == NULL) return 1; # endif /* Check whether nl_langinfo(CODESET) is nonempty and not "ASCII" or "646". On Mac OS X 10.3.5 (Darwin 7.5) in the fr_FR locale, nl_langinfo(CODESET) is empty, and the behaviour of Tcl 8.4 in this locale is not useful. On OpenBSD 4.0, when an unsupported locale is specified, setlocale() succeeds but then nl_langinfo(CODESET) is "646". In this situation, some unit tests fail. On MirBSD 10, when an unsupported locale is specified, setlocale() succeeds but then nl_langinfo(CODESET) is "UTF-8". */ # if HAVE_LANGINFO_CODESET { const char *cs = nl_langinfo (CODESET); if (cs[0] == '\0' || strcmp (cs, "ASCII") == 0 || strcmp (cs, "646") == 0 || strcmp (cs, "UTF-8") == 0) return 1; } # endif # ifdef __CYGWIN__ /* On Cygwin, avoid locale names without encoding suffix, because the locale_charset() function relies on the encoding suffix. Note that LC_ALL is set on the command line. */ if (strchr (getenv ("LC_ALL"), '.') == NULL) return 1; # endif /* Check whether in the abbreviation of the second month, the second character (should be U+00E9: LATIN SMALL LETTER E WITH ACUTE) is only one byte long. This excludes the UTF-8 encoding. */ t.tm_year = 1975 - 1900; t.tm_mon = 2 - 1; t.tm_mday = 4; if (strftime (buf, sizeof (buf), "%b", &t) < 3 || buf[2] != 'v') return 1; # if !defined __BIONIC__ /* Bionic libc's 'struct lconv' is just a dummy. */ /* Check whether the decimal separator is a comma. On NetBSD 3.0 in the fr_FR.ISO8859-1 locale, localeconv()->decimal_point are nl_langinfo(RADIXCHAR) are both ".". */ if (localeconv () ->decimal_point[0] != ',') return 1; # endif return 0; #endif } changequote([,])dnl ])]) if AC_TRY_EVAL([ac_link]) && test -s conftest$ac_exeext; then case "$host_os" in # Handle native Windows specially, because there setlocale() interprets # "ar" as "Arabic" or "Arabic_Saudi Arabia.1256", # "fr" or "fra" as "French" or "French_France.1252", # "ge"(!) or "deu"(!) as "German" or "German_Germany.1252", # "ja" as "Japanese" or "Japanese_Japan.932", # and similar. mingw*) # Test for the native Windows locale name. if (LC_ALL=French_France.1252 LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then gt_cv_locale_fr=French_France.1252 else # None found. gt_cv_locale_fr=none fi ;; *) # Setting LC_ALL is not enough. Need to set LC_TIME to empty, because # otherwise on Mac OS X 10.3.5 the LC_TIME=C from the beginning of the # configure script would override the LC_ALL setting. Likewise for # LC_CTYPE, which is also set at the beginning of the configure script. # Test for the usual locale name. if (LC_ALL=fr_FR LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then gt_cv_locale_fr=fr_FR else # Test for the locale name with explicit encoding suffix. if (LC_ALL=fr_FR.ISO-8859-1 LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then gt_cv_locale_fr=fr_FR.ISO-8859-1 else # Test for the AIX, OSF/1, FreeBSD, NetBSD, OpenBSD locale name. if (LC_ALL=fr_FR.ISO8859-1 LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then gt_cv_locale_fr=fr_FR.ISO8859-1 else # Test for the HP-UX locale name. if (LC_ALL=fr_FR.iso88591 LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then gt_cv_locale_fr=fr_FR.iso88591 else # Test for the Solaris 7 locale name. if (LC_ALL=fr LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then gt_cv_locale_fr=fr else # None found. gt_cv_locale_fr=none fi fi fi fi fi ;; esac fi rm -fr conftest* ]) LOCALE_FR=$gt_cv_locale_fr AC_SUBST([LOCALE_FR]) ]) dnl Determine the name of a french locale with UTF-8 encoding. AC_DEFUN([gt_LOCALE_FR_UTF8], [ AC_REQUIRE([AM_LANGINFO_CODESET]) AC_CACHE_CHECK([for a french Unicode locale], [gt_cv_locale_fr_utf8], [ AC_LANG_CONFTEST([AC_LANG_SOURCE([ changequote(,)dnl #include #include #if HAVE_LANGINFO_CODESET # include #endif #include #include struct tm t; char buf[16]; int main () { /* On BeOS and Haiku, locales are not implemented in libc. Rather, libintl imitates locale dependent behaviour by looking at the environment variables, and all locales use the UTF-8 encoding. */ #if !(defined __BEOS__ || defined __HAIKU__) /* Check whether the given locale name is recognized by the system. */ # if defined _WIN32 && !defined __CYGWIN__ /* On native Windows, setlocale(category, "") looks at the system settings, not at the environment variables. Also, when an encoding suffix such as ".65001" or ".54936" is specified, it succeeds but sets the LC_CTYPE category of the locale to "C". */ if (setlocale (LC_ALL, getenv ("LC_ALL")) == NULL || strcmp (setlocale (LC_CTYPE, NULL), "C") == 0) return 1; # else if (setlocale (LC_ALL, "") == NULL) return 1; # endif /* Check whether nl_langinfo(CODESET) is nonempty and not "ASCII" or "646". On Mac OS X 10.3.5 (Darwin 7.5) in the fr_FR locale, nl_langinfo(CODESET) is empty, and the behaviour of Tcl 8.4 in this locale is not useful. On OpenBSD 4.0, when an unsupported locale is specified, setlocale() succeeds but then nl_langinfo(CODESET) is "646". In this situation, some unit tests fail. */ # if HAVE_LANGINFO_CODESET { const char *cs = nl_langinfo (CODESET); if (cs[0] == '\0' || strcmp (cs, "ASCII") == 0 || strcmp (cs, "646") == 0) return 1; } # endif # ifdef __CYGWIN__ /* On Cygwin, avoid locale names without encoding suffix, because the locale_charset() function relies on the encoding suffix. Note that LC_ALL is set on the command line. */ if (strchr (getenv ("LC_ALL"), '.') == NULL) return 1; # endif /* Check whether in the abbreviation of the second month, the second character (should be U+00E9: LATIN SMALL LETTER E WITH ACUTE) is two bytes long, with UTF-8 encoding. */ t.tm_year = 1975 - 1900; t.tm_mon = 2 - 1; t.tm_mday = 4; if (strftime (buf, sizeof (buf), "%b", &t) < 4 || buf[1] != (char) 0xc3 || buf[2] != (char) 0xa9 || buf[3] != 'v') return 1; #endif #if !defined __BIONIC__ /* Bionic libc's 'struct lconv' is just a dummy. */ /* Check whether the decimal separator is a comma. On NetBSD 3.0 in the fr_FR.ISO8859-1 locale, localeconv()->decimal_point are nl_langinfo(RADIXCHAR) are both ".". */ if (localeconv () ->decimal_point[0] != ',') return 1; #endif return 0; } changequote([,])dnl ])]) if AC_TRY_EVAL([ac_link]) && test -s conftest$ac_exeext; then case "$host_os" in # Handle native Windows specially, because there setlocale() interprets # "ar" as "Arabic" or "Arabic_Saudi Arabia.1256", # "fr" or "fra" as "French" or "French_France.1252", # "ge"(!) or "deu"(!) as "German" or "German_Germany.1252", # "ja" as "Japanese" or "Japanese_Japan.932", # and similar. mingw*) # Test for the hypothetical native Windows locale name. if (LC_ALL=French_France.65001 LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then gt_cv_locale_fr_utf8=French_France.65001 else # None found. gt_cv_locale_fr_utf8=none fi ;; *) # Setting LC_ALL is not enough. Need to set LC_TIME to empty, because # otherwise on Mac OS X 10.3.5 the LC_TIME=C from the beginning of the # configure script would override the LC_ALL setting. Likewise for # LC_CTYPE, which is also set at the beginning of the configure script. # Test for the usual locale name. if (LC_ALL=fr_FR LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then gt_cv_locale_fr_utf8=fr_FR else # Test for the locale name with explicit encoding suffix. if (LC_ALL=fr_FR.UTF-8 LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then gt_cv_locale_fr_utf8=fr_FR.UTF-8 else # Test for the Solaris 7 locale name. if (LC_ALL=fr.UTF-8 LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then gt_cv_locale_fr_utf8=fr.UTF-8 else # None found. gt_cv_locale_fr_utf8=none fi fi fi ;; esac fi rm -fr conftest* ]) LOCALE_FR_UTF8=$gt_cv_locale_fr_utf8 AC_SUBST([LOCALE_FR_UTF8]) ]) pspp-1.4.1/gl/m4/inttypes_h.m40000644000175000017500000000177413723215637015507 0ustar00blpblp00000000000000# inttypes_h.m4 serial 10 dnl Copyright (C) 1997-2004, 2006, 2008-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl From Paul Eggert. # Define HAVE_INTTYPES_H_WITH_UINTMAX if exists, # doesn't clash with , and declares uintmax_t. AC_DEFUN([gl_AC_HEADER_INTTYPES_H], [ AC_CACHE_CHECK([for inttypes.h], [gl_cv_header_inttypes_h], [AC_COMPILE_IFELSE( [AC_LANG_PROGRAM( [[ #include #include ]], [[uintmax_t i = (uintmax_t) -1; return !i;]])], [gl_cv_header_inttypes_h=yes], [gl_cv_header_inttypes_h=no])]) if test $gl_cv_header_inttypes_h = yes; then AC_DEFINE_UNQUOTED([HAVE_INTTYPES_H_WITH_UINTMAX], [1], [Define if exists, doesn't clash with , and declares uintmax_t. ]) fi ]) pspp-1.4.1/gl/m4/memcasecmp.m40000644000175000017500000000046613723215637015430 0ustar00blpblp00000000000000#serial 6 dnl Copyright (C) 2005-2006, 2009-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_MEMCASECMP], [ : ]) pspp-1.4.1/gl/m4/lseek.m40000644000175000017500000000436113723215637014417 0ustar00blpblp00000000000000# lseek.m4 serial 10 dnl Copyright (C) 2007, 2009-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_FUNC_LSEEK], [ AC_REQUIRE([gl_UNISTD_H_DEFAULTS]) AC_REQUIRE([AC_CANONICAL_HOST]) AC_REQUIRE([AC_PROG_CC]) AC_CHECK_HEADERS_ONCE([unistd.h]) AC_CACHE_CHECK([whether lseek detects pipes], [gl_cv_func_lseek_pipe], [case "$host_os" in mingw*) dnl Native Windows. dnl The result of lseek (fd, (off_t)0, SEEK_CUR) or dnl SetFilePointer(handle, 0, NULL, FILE_CURRENT) dnl for a pipe depends on the environment: In a Cygwin 1.5 dnl environment it succeeds (wrong); in a Cygwin 1.7 environment dnl it fails with a wrong errno value. gl_cv_func_lseek_pipe=no ;; *) if test $cross_compiling = no; then AC_LINK_IFELSE([AC_LANG_PROGRAM([[ #include /* for off_t */ #include /* for SEEK_CUR */ #if HAVE_UNISTD_H # include #else /* on Windows with MSVC */ # include #endif ]], [[ /* Exit with success only if stdin is seekable. */ return lseek (0, (off_t)0, SEEK_CUR) < 0; ]])], [if test -s conftest$ac_exeext \ && ./conftest$ac_exeext < conftest.$ac_ext \ && test 1 = "`echo hi \ | { ./conftest$ac_exeext; echo $?; cat >/dev/null; }`"; then gl_cv_func_lseek_pipe=yes else gl_cv_func_lseek_pipe=no fi ], [gl_cv_func_lseek_pipe=no]) else AC_COMPILE_IFELSE( [AC_LANG_SOURCE([[ #if defined __BEOS__ /* BeOS mistakenly return 0 when trying to seek on pipes. */ Choke me. #endif]])], [gl_cv_func_lseek_pipe=yes], [gl_cv_func_lseek_pipe=no]) fi ;; esac ]) if test $gl_cv_func_lseek_pipe = no; then REPLACE_LSEEK=1 AC_DEFINE([LSEEK_PIPE_BROKEN], [1], [Define to 1 if lseek does not detect pipes.]) fi AC_REQUIRE([gl_SYS_TYPES_H]) if test $WINDOWS_64_BIT_OFF_T = 1; then REPLACE_LSEEK=1 fi ]) pspp-1.4.1/gl/m4/sys_stat_h.m40000644000175000017500000000766413723215637015505 0ustar00blpblp00000000000000# sys_stat_h.m4 serial 34 -*- Autoconf -*- dnl Copyright (C) 2006-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl From Eric Blake. dnl Provide a GNU-like . AC_DEFUN([gl_HEADER_SYS_STAT_H], [ AC_REQUIRE([gl_SYS_STAT_H_DEFAULTS]) dnl Check for broken stat macros. AC_REQUIRE([AC_HEADER_STAT]) gl_CHECK_NEXT_HEADERS([sys/stat.h]) dnl Ensure the type mode_t gets defined. AC_REQUIRE([AC_TYPE_MODE_T]) dnl Whether to enable precise timestamps in 'struct stat'. m4_ifdef([gl_WINDOWS_STAT_TIMESPEC], [ AC_REQUIRE([gl_WINDOWS_STAT_TIMESPEC]) ], [ WINDOWS_STAT_TIMESPEC=0 ]) AC_SUBST([WINDOWS_STAT_TIMESPEC]) dnl Whether to ensure that struct stat.st_size is 64-bit wide. m4_ifdef([gl_LARGEFILE], [ AC_REQUIRE([gl_LARGEFILE]) ], [ WINDOWS_64_BIT_ST_SIZE=0 ]) AC_SUBST([WINDOWS_64_BIT_ST_SIZE]) dnl Define types that are supposed to be defined in or dnl . AC_CHECK_TYPE([nlink_t], [], [AC_DEFINE([nlink_t], [int], [Define to the type of st_nlink in struct stat, or a supertype.])], [#include #include ]) dnl Check for declarations of anything we want to poison if the dnl corresponding gnulib module is not in use. gl_WARN_ON_USE_PREPARE([[#include ]], [fchmodat fstat fstatat futimens getumask lchmod lstat mkdirat mkfifo mkfifoat mknod mknodat stat utimensat]) AC_REQUIRE([AC_C_RESTRICT]) ]) AC_DEFUN([gl_SYS_STAT_MODULE_INDICATOR], [ dnl Use AC_REQUIRE here, so that the default settings are expanded once only. AC_REQUIRE([gl_SYS_STAT_H_DEFAULTS]) gl_MODULE_INDICATOR_SET_VARIABLE([$1]) dnl Define it also as a C macro, for the benefit of the unit tests. gl_MODULE_INDICATOR_FOR_TESTS([$1]) ]) AC_DEFUN([gl_SYS_STAT_H_DEFAULTS], [ AC_REQUIRE([gl_UNISTD_H_DEFAULTS]) dnl for REPLACE_FCHDIR GNULIB_FCHMODAT=0; AC_SUBST([GNULIB_FCHMODAT]) GNULIB_FSTAT=0; AC_SUBST([GNULIB_FSTAT]) GNULIB_FSTATAT=0; AC_SUBST([GNULIB_FSTATAT]) GNULIB_FUTIMENS=0; AC_SUBST([GNULIB_FUTIMENS]) GNULIB_GETUMASK=0; AC_SUBST([GNULIB_GETUMASK]) GNULIB_LCHMOD=0; AC_SUBST([GNULIB_LCHMOD]) GNULIB_LSTAT=0; AC_SUBST([GNULIB_LSTAT]) GNULIB_MKDIRAT=0; AC_SUBST([GNULIB_MKDIRAT]) GNULIB_MKFIFO=0; AC_SUBST([GNULIB_MKFIFO]) GNULIB_MKFIFOAT=0; AC_SUBST([GNULIB_MKFIFOAT]) GNULIB_MKNOD=0; AC_SUBST([GNULIB_MKNOD]) GNULIB_MKNODAT=0; AC_SUBST([GNULIB_MKNODAT]) GNULIB_STAT=0; AC_SUBST([GNULIB_STAT]) GNULIB_UTIMENSAT=0; AC_SUBST([GNULIB_UTIMENSAT]) GNULIB_OVERRIDES_STRUCT_STAT=0; AC_SUBST([GNULIB_OVERRIDES_STRUCT_STAT]) dnl Assume proper GNU behavior unless another module says otherwise. HAVE_FCHMODAT=1; AC_SUBST([HAVE_FCHMODAT]) HAVE_FSTATAT=1; AC_SUBST([HAVE_FSTATAT]) HAVE_FUTIMENS=1; AC_SUBST([HAVE_FUTIMENS]) HAVE_GETUMASK=1; AC_SUBST([HAVE_GETUMASK]) HAVE_LCHMOD=1; AC_SUBST([HAVE_LCHMOD]) HAVE_LSTAT=1; AC_SUBST([HAVE_LSTAT]) HAVE_MKDIRAT=1; AC_SUBST([HAVE_MKDIRAT]) HAVE_MKFIFO=1; AC_SUBST([HAVE_MKFIFO]) HAVE_MKFIFOAT=1; AC_SUBST([HAVE_MKFIFOAT]) HAVE_MKNOD=1; AC_SUBST([HAVE_MKNOD]) HAVE_MKNODAT=1; AC_SUBST([HAVE_MKNODAT]) HAVE_UTIMENSAT=1; AC_SUBST([HAVE_UTIMENSAT]) REPLACE_FCHMODAT=0; AC_SUBST([REPLACE_FCHMODAT]) REPLACE_FSTAT=0; AC_SUBST([REPLACE_FSTAT]) REPLACE_FSTATAT=0; AC_SUBST([REPLACE_FSTATAT]) REPLACE_FUTIMENS=0; AC_SUBST([REPLACE_FUTIMENS]) REPLACE_LSTAT=0; AC_SUBST([REPLACE_LSTAT]) REPLACE_MKDIR=0; AC_SUBST([REPLACE_MKDIR]) REPLACE_MKFIFO=0; AC_SUBST([REPLACE_MKFIFO]) REPLACE_MKNOD=0; AC_SUBST([REPLACE_MKNOD]) REPLACE_STAT=0; AC_SUBST([REPLACE_STAT]) REPLACE_UTIMENSAT=0; AC_SUBST([REPLACE_UTIMENSAT]) ]) pspp-1.4.1/gl/m4/ldexpl.m40000644000175000017500000000763013723215637014606 0ustar00blpblp00000000000000# ldexpl.m4 serial 17 dnl Copyright (C) 2007-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_FUNC_LDEXPL], [ AC_REQUIRE([gl_MATH_H_DEFAULTS]) AC_REQUIRE([gl_LONG_DOUBLE_VS_DOUBLE]) AC_REQUIRE([gl_FUNC_ISNANL]) dnl for ISNANL_LIBM dnl Persuade glibc to declare ldexpl(). AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS]) dnl Check whether it's declared. dnl Mac OS X 10.3 has ldexpl() in libc but doesn't declare it in . AC_CHECK_DECL([ldexpl], , [HAVE_DECL_LDEXPL=0], [[#include ]]) LDEXPL_LIBM= if test $HAVE_DECL_LDEXPL = 1; then gl_CHECK_LDEXPL_NO_LIBM if test $gl_cv_func_ldexpl_no_libm = no; then AC_CACHE_CHECK([whether ldexpl() can be used with libm], [gl_cv_func_ldexpl_in_libm], [ save_LIBS="$LIBS" LIBS="$LIBS -lm" AC_LINK_IFELSE( [AC_LANG_PROGRAM( [[#include long double x;]], [[return ldexpl (x, -1) > 0;]])], [gl_cv_func_ldexpl_in_libm=yes], [gl_cv_func_ldexpl_in_libm=no]) LIBS="$save_LIBS" ]) if test $gl_cv_func_ldexpl_in_libm = yes; then LDEXPL_LIBM=-lm fi fi if test $gl_cv_func_ldexpl_no_libm = yes \ || test $gl_cv_func_ldexpl_in_libm = yes; then save_LIBS="$LIBS" LIBS="$LIBS $LDEXPL_LIBM" gl_FUNC_LDEXPL_WORKS LIBS="$save_LIBS" case "$gl_cv_func_ldexpl_works" in *yes) gl_func_ldexpl=yes ;; *) gl_func_ldexpl=no; REPLACE_LDEXPL=1 ;; esac else gl_func_ldexpl=no fi if test $gl_func_ldexpl = yes; then AC_DEFINE([HAVE_LDEXPL], [1], [Define if the ldexpl() function is available.]) fi fi if test $HAVE_DECL_LDEXPL = 0 || test $gl_func_ldexpl = no; then dnl Find libraries needed to link lib/ldexpl.c. if test $HAVE_SAME_LONG_DOUBLE_AS_DOUBLE = 1; then AC_REQUIRE([gl_FUNC_LDEXP]) LDEXPL_LIBM="$LDEXP_LIBM" else LDEXPL_LIBM="$ISNANL_LIBM" fi fi AC_SUBST([LDEXPL_LIBM]) ]) dnl Test whether ldexpl() can be used without linking with libm. dnl Set gl_cv_func_ldexpl_no_libm to 'yes' or 'no' accordingly. AC_DEFUN([gl_CHECK_LDEXPL_NO_LIBM], [ AC_CACHE_CHECK([whether ldexpl() can be used without linking with libm], [gl_cv_func_ldexpl_no_libm], [ AC_LINK_IFELSE( [AC_LANG_PROGRAM( [[#include long double x;]], [[return ldexpl (x, -1) > 0;]])], [gl_cv_func_ldexpl_no_libm=yes], [gl_cv_func_ldexpl_no_libm=no]) ]) ]) dnl Test whether ldexpl() works on finite numbers (this fails on AIX 5.1 dnl and Mac OS X 10.4/PowerPC). AC_DEFUN([gl_FUNC_LDEXPL_WORKS], [ AC_REQUIRE([AC_PROG_CC]) AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles AC_CACHE_CHECK([whether ldexpl works], [gl_cv_func_ldexpl_works], [ AC_RUN_IFELSE( [AC_LANG_SOURCE([[ #include extern #ifdef __cplusplus "C" #endif long double ldexpl (long double, int); int main() { int result = 0; { volatile long double x = 1.0; volatile long double y = ldexpl (x, -1); if (y != 0.5L) result |= 1; } { volatile long double x = 1.73205L; volatile long double y = ldexpl (x, 0); if (y != x) result |= 2; } return result; }]])], [gl_cv_func_ldexpl_works=yes], [gl_cv_func_ldexpl_works=no], [ changequote(,)dnl case "$host_os" in aix | aix[3-6]*) gl_cv_func_ldexpl_works="guessing no" ;; # Guess yes on native Windows. mingw*) gl_cv_func_ldexpl_works="guessing yes" ;; *) gl_cv_func_ldexpl_works="guessing yes" ;; esac changequote([,])dnl ]) ]) ]) pspp-1.4.1/gl/m4/sys_uio_h.m40000644000175000017500000000165413723215637015317 0ustar00blpblp00000000000000# sys_uio_h.m4 serial 1 dnl Copyright (C) 2011-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_HEADER_SYS_UIO], [ AC_REQUIRE([gl_SYS_UIO_H_DEFAULTS]) dnl is always overridden, because of GNULIB_POSIXCHECK. gl_CHECK_NEXT_HEADERS([sys/uio.h]) if test $ac_cv_header_sys_uio_h = yes; then HAVE_SYS_UIO_H=1 else HAVE_SYS_UIO_H=0 fi AC_SUBST([HAVE_SYS_UIO_H]) ]) AC_DEFUN([gl_SYS_UIO_MODULE_INDICATOR], [ dnl Use AC_REQUIRE here, so that the default settings are expanded once only. AC_REQUIRE([gl_SYS_UIO_H_DEFAULTS]) gl_MODULE_INDICATOR_SET_VARIABLE([$1]) dnl Define it also as a C macro, for the benefit of the unit tests. gl_MODULE_INDICATOR_FOR_TESTS([$1]) ]) AC_DEFUN([gl_SYS_UIO_H_DEFAULTS], [ ]) pspp-1.4.1/gl/m4/stdint_h.m40000644000175000017500000000174313723215637015131 0ustar00blpblp00000000000000# stdint_h.m4 serial 9 dnl Copyright (C) 1997-2004, 2006, 2008-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl From Paul Eggert. # Define HAVE_STDINT_H_WITH_UINTMAX if exists, # doesn't clash with , and declares uintmax_t. AC_DEFUN([gl_AC_HEADER_STDINT_H], [ AC_CACHE_CHECK([for stdint.h], [gl_cv_header_stdint_h], [AC_COMPILE_IFELSE( [AC_LANG_PROGRAM( [[#include #include ]], [[uintmax_t i = (uintmax_t) -1; return !i;]])], [gl_cv_header_stdint_h=yes], [gl_cv_header_stdint_h=no])]) if test $gl_cv_header_stdint_h = yes; then AC_DEFINE_UNQUOTED([HAVE_STDINT_H_WITH_UINTMAX], [1], [Define if exists, doesn't clash with , and declares uintmax_t. ]) fi ]) pspp-1.4.1/gl/m4/vasnprintf.m40000644000175000017500000002075113723215637015507 0ustar00blpblp00000000000000# vasnprintf.m4 serial 37 dnl Copyright (C) 2002-2004, 2006-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_FUNC_VASNPRINTF], [ AC_CHECK_FUNCS_ONCE([vasnprintf]) if test $ac_cv_func_vasnprintf = no; then gl_REPLACE_VASNPRINTF fi ]) AC_DEFUN([gl_REPLACE_VASNPRINTF], [ AC_CHECK_FUNCS_ONCE([vasnprintf]) AC_LIBOBJ([vasnprintf]) AC_LIBOBJ([printf-args]) AC_LIBOBJ([printf-parse]) AC_LIBOBJ([asnprintf]) if test $ac_cv_func_vasnprintf = yes; then AC_DEFINE([REPLACE_VASNPRINTF], [1], [Define if vasnprintf exists but is overridden by gnulib.]) fi gl_PREREQ_PRINTF_ARGS gl_PREREQ_PRINTF_PARSE gl_PREREQ_VASNPRINTF gl_PREREQ_ASNPRINTF ]) # Prerequisites of lib/printf-args.h, lib/printf-args.c. AC_DEFUN([gl_PREREQ_PRINTF_ARGS], [ AC_REQUIRE([gt_TYPE_WCHAR_T]) AC_REQUIRE([gt_TYPE_WINT_T]) ]) # Prerequisites of lib/printf-parse.h, lib/printf-parse.c. AC_DEFUN([gl_PREREQ_PRINTF_PARSE], [ AC_REQUIRE([gl_FEATURES_H]) AC_REQUIRE([gt_TYPE_WCHAR_T]) AC_REQUIRE([gt_TYPE_WINT_T]) AC_REQUIRE([AC_TYPE_SIZE_T]) AC_CHECK_TYPE([ptrdiff_t], , [AC_DEFINE([ptrdiff_t], [long], [Define as the type of the result of subtracting two pointers, if the system doesn't define it.]) ]) AC_REQUIRE([gt_AC_TYPE_INTMAX_T]) ]) # Prerequisites of lib/vasnprintf.c. AC_DEFUN_ONCE([gl_PREREQ_VASNPRINTF], [ AC_REQUIRE([AC_FUNC_ALLOCA]) AC_REQUIRE([gt_TYPE_WCHAR_T]) AC_REQUIRE([gt_TYPE_WINT_T]) AC_CHECK_FUNCS([snprintf strnlen wcslen wcsnlen mbrtowc wcrtomb]) dnl Use the _snprintf function only if it is declared (because on NetBSD it dnl is defined as a weak alias of snprintf; we prefer to use the latter). AC_CHECK_DECLS([_snprintf], , , [[#include ]]) dnl Knowing DBL_EXPBIT0_WORD and DBL_EXPBIT0_BIT enables an optimization dnl in the code for NEED_PRINTF_LONG_DOUBLE || NEED_PRINTF_DOUBLE. AC_REQUIRE([gl_DOUBLE_EXPONENT_LOCATION]) dnl We can avoid a lot of code by assuming that snprintf's return value dnl conforms to ISO C99. So check that. AC_REQUIRE([gl_SNPRINTF_RETVAL_C99]) case "$gl_cv_func_snprintf_retval_c99" in *yes) AC_DEFINE([HAVE_SNPRINTF_RETVAL_C99], [1], [Define if the return value of the snprintf function is the number of of bytes (excluding the terminating NUL) that would have been produced if the buffer had been large enough.]) ;; esac ]) # Extra prerequisites of lib/vasnprintf.c for supporting 'long double' # arguments. AC_DEFUN_ONCE([gl_PREREQ_VASNPRINTF_LONG_DOUBLE], [ AC_REQUIRE([gl_PRINTF_LONG_DOUBLE]) case "$gl_cv_func_printf_long_double" in *yes) ;; *) AC_DEFINE([NEED_PRINTF_LONG_DOUBLE], [1], [Define if the vasnprintf implementation needs special code for 'long double' arguments.]) ;; esac ]) # Extra prerequisites of lib/vasnprintf.c for supporting infinite 'double' # arguments. AC_DEFUN([gl_PREREQ_VASNPRINTF_INFINITE_DOUBLE], [ AC_REQUIRE([gl_PRINTF_INFINITE]) case "$gl_cv_func_printf_infinite" in *yes) ;; *) AC_DEFINE([NEED_PRINTF_INFINITE_DOUBLE], [1], [Define if the vasnprintf implementation needs special code for infinite 'double' arguments.]) ;; esac ]) # Extra prerequisites of lib/vasnprintf.c for supporting infinite 'long double' # arguments. AC_DEFUN([gl_PREREQ_VASNPRINTF_INFINITE_LONG_DOUBLE], [ AC_REQUIRE([gl_PRINTF_INFINITE_LONG_DOUBLE]) dnl There is no need to set NEED_PRINTF_INFINITE_LONG_DOUBLE if dnl NEED_PRINTF_LONG_DOUBLE is already set. AC_REQUIRE([gl_PREREQ_VASNPRINTF_LONG_DOUBLE]) case "$gl_cv_func_printf_long_double" in *yes) case "$gl_cv_func_printf_infinite_long_double" in *yes) ;; *) AC_DEFINE([NEED_PRINTF_INFINITE_LONG_DOUBLE], [1], [Define if the vasnprintf implementation needs special code for infinite 'long double' arguments.]) ;; esac ;; esac ]) # Extra prerequisites of lib/vasnprintf.c for supporting the 'a' directive. AC_DEFUN([gl_PREREQ_VASNPRINTF_DIRECTIVE_A], [ AC_REQUIRE([gl_PRINTF_DIRECTIVE_A]) case "$gl_cv_func_printf_directive_a" in *yes) ;; *) AC_DEFINE([NEED_PRINTF_DIRECTIVE_A], [1], [Define if the vasnprintf implementation needs special code for the 'a' and 'A' directives.]) AC_CHECK_FUNCS([nl_langinfo]) ;; esac ]) # Extra prerequisites of lib/vasnprintf.c for supporting the 'F' directive. AC_DEFUN([gl_PREREQ_VASNPRINTF_DIRECTIVE_F], [ AC_REQUIRE([gl_PRINTF_DIRECTIVE_F]) case "$gl_cv_func_printf_directive_f" in *yes) ;; *) AC_DEFINE([NEED_PRINTF_DIRECTIVE_F], [1], [Define if the vasnprintf implementation needs special code for the 'F' directive.]) ;; esac ]) # Extra prerequisites of lib/vasnprintf.c for supporting the 'ls' directive. AC_DEFUN([gl_PREREQ_VASNPRINTF_DIRECTIVE_LS], [ AC_REQUIRE([gl_PRINTF_DIRECTIVE_LS]) case "$gl_cv_func_printf_directive_ls" in *yes) ;; *) AC_DEFINE([NEED_PRINTF_DIRECTIVE_LS], [1], [Define if the vasnprintf implementation needs special code for the 'ls' directive.]) ;; esac ]) # Extra prerequisites of lib/vasnprintf.c for supporting the ' flag. AC_DEFUN([gl_PREREQ_VASNPRINTF_FLAG_GROUPING], [ AC_REQUIRE([gl_PRINTF_FLAG_GROUPING]) case "$gl_cv_func_printf_flag_grouping" in *yes) ;; *) AC_DEFINE([NEED_PRINTF_FLAG_GROUPING], [1], [Define if the vasnprintf implementation needs special code for the ' flag.]) ;; esac ]) # Extra prerequisites of lib/vasnprintf.c for supporting the '-' flag. AC_DEFUN([gl_PREREQ_VASNPRINTF_FLAG_LEFTADJUST], [ AC_REQUIRE([gl_PRINTF_FLAG_LEFTADJUST]) case "$gl_cv_func_printf_flag_leftadjust" in *yes) ;; *) AC_DEFINE([NEED_PRINTF_FLAG_LEFTADJUST], [1], [Define if the vasnprintf implementation needs special code for the '-' flag.]) ;; esac ]) # Extra prerequisites of lib/vasnprintf.c for supporting the 0 flag. AC_DEFUN([gl_PREREQ_VASNPRINTF_FLAG_ZERO], [ AC_REQUIRE([gl_PRINTF_FLAG_ZERO]) case "$gl_cv_func_printf_flag_zero" in *yes) ;; *) AC_DEFINE([NEED_PRINTF_FLAG_ZERO], [1], [Define if the vasnprintf implementation needs special code for the 0 flag.]) ;; esac ]) # Extra prerequisites of lib/vasnprintf.c for supporting large precisions. AC_DEFUN([gl_PREREQ_VASNPRINTF_PRECISION], [ AC_REQUIRE([gl_PRINTF_PRECISION]) case "$gl_cv_func_printf_precision" in *yes) ;; *) AC_DEFINE([NEED_PRINTF_UNBOUNDED_PRECISION], [1], [Define if the vasnprintf implementation needs special code for supporting large precisions without arbitrary bounds.]) AC_DEFINE([NEED_PRINTF_DOUBLE], [1], [Define if the vasnprintf implementation needs special code for 'double' arguments.]) AC_DEFINE([NEED_PRINTF_LONG_DOUBLE], [1], [Define if the vasnprintf implementation needs special code for 'long double' arguments.]) ;; esac ]) # Extra prerequisites of lib/vasnprintf.c for surviving out-of-memory # conditions. AC_DEFUN([gl_PREREQ_VASNPRINTF_ENOMEM], [ AC_REQUIRE([gl_PRINTF_ENOMEM]) case "$gl_cv_func_printf_enomem" in *yes) ;; *) AC_DEFINE([NEED_PRINTF_ENOMEM], [1], [Define if the vasnprintf implementation needs special code for surviving out-of-memory conditions.]) AC_DEFINE([NEED_PRINTF_DOUBLE], [1], [Define if the vasnprintf implementation needs special code for 'double' arguments.]) AC_DEFINE([NEED_PRINTF_LONG_DOUBLE], [1], [Define if the vasnprintf implementation needs special code for 'long double' arguments.]) ;; esac ]) # Prerequisites of lib/vasnprintf.c including all extras for POSIX compliance. AC_DEFUN([gl_PREREQ_VASNPRINTF_WITH_EXTRAS], [ AC_REQUIRE([gl_PREREQ_VASNPRINTF]) gl_PREREQ_VASNPRINTF_LONG_DOUBLE gl_PREREQ_VASNPRINTF_INFINITE_DOUBLE gl_PREREQ_VASNPRINTF_INFINITE_LONG_DOUBLE gl_PREREQ_VASNPRINTF_DIRECTIVE_A gl_PREREQ_VASNPRINTF_DIRECTIVE_F gl_PREREQ_VASNPRINTF_DIRECTIVE_LS gl_PREREQ_VASNPRINTF_FLAG_GROUPING gl_PREREQ_VASNPRINTF_FLAG_LEFTADJUST gl_PREREQ_VASNPRINTF_FLAG_ZERO gl_PREREQ_VASNPRINTF_PRECISION gl_PREREQ_VASNPRINTF_ENOMEM ]) # Prerequisites of lib/asnprintf.c. AC_DEFUN([gl_PREREQ_ASNPRINTF], [ ]) pspp-1.4.1/gl/m4/vasprintf.m40000644000175000017500000000210013723215637015315 0ustar00blpblp00000000000000# vasprintf.m4 serial 6 dnl Copyright (C) 2002-2003, 2006-2007, 2009-2020 Free Software Foundation, dnl Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_FUNC_VASPRINTF], [ AC_CHECK_FUNCS([vasprintf]) if test $ac_cv_func_vasprintf = no; then gl_REPLACE_VASPRINTF fi ]) AC_DEFUN([gl_REPLACE_VASPRINTF], [ AC_LIBOBJ([vasprintf]) AC_LIBOBJ([asprintf]) AC_REQUIRE([gl_STDIO_H_DEFAULTS]) if test $ac_cv_func_vasprintf = yes; then REPLACE_VASPRINTF=1 else HAVE_VASPRINTF=0 fi gl_PREREQ_VASPRINTF_H gl_PREREQ_VASPRINTF gl_PREREQ_ASPRINTF ]) # Prerequisites of the vasprintf portion of lib/stdio.h. AC_DEFUN([gl_PREREQ_VASPRINTF_H], [ dnl Persuade glibc to declare asprintf() and vasprintf(). AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS]) ]) # Prerequisites of lib/vasprintf.c. AC_DEFUN([gl_PREREQ_VASPRINTF], [ ]) # Prerequisites of lib/asprintf.c. AC_DEFUN([gl_PREREQ_ASPRINTF], [ ]) pspp-1.4.1/gl/m4/malloc.m40000644000175000017500000000647313723215637014571 0ustar00blpblp00000000000000# malloc.m4 serial 20 dnl Copyright (C) 2007, 2009-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. # This is adapted with modifications from upstream Autoconf here: # https://git.savannah.gnu.org/cgit/autoconf.git/commit/?id=04be2b7a29d65d9a08e64e8e56e594c91749598c AC_DEFUN([_AC_FUNC_MALLOC_IF], [ AC_REQUIRE([AC_HEADER_STDC])dnl AC_REQUIRE([AC_CANONICAL_HOST])dnl for cross-compiles AC_CHECK_HEADERS([stdlib.h]) AC_CACHE_CHECK([for GNU libc compatible malloc], [ac_cv_func_malloc_0_nonnull], [AC_RUN_IFELSE( [AC_LANG_PROGRAM( [[#if defined STDC_HEADERS || defined HAVE_STDLIB_H # include #else char *malloc (); #endif ]], [[char *p = malloc (0); int result = !p; free (p); return result;]]) ], [ac_cv_func_malloc_0_nonnull=yes], [ac_cv_func_malloc_0_nonnull=no], [case "$host_os" in # Guess yes on platforms where we know the result. *-gnu* | gnu* | *-musl* | freebsd* | netbsd* | openbsd* \ | hpux* | solaris* | cygwin* | mingw*) ac_cv_func_malloc_0_nonnull="guessing yes" ;; # If we don't know, obey --enable-cross-guesses. *) ac_cv_func_malloc_0_nonnull="$gl_cross_guess_normal" ;; esac ]) ]) case "$ac_cv_func_malloc_0_nonnull" in *yes) $1 ;; *) $2 ;; esac ])# _AC_FUNC_MALLOC_IF # gl_FUNC_MALLOC_GNU # ------------------ # Test whether 'malloc (0)' is handled like in GNU libc, and replace malloc if # it is not. AC_DEFUN([gl_FUNC_MALLOC_GNU], [ AC_REQUIRE([gl_STDLIB_H_DEFAULTS]) dnl _AC_FUNC_MALLOC_IF is defined in Autoconf. _AC_FUNC_MALLOC_IF( [AC_DEFINE([HAVE_MALLOC_GNU], [1], [Define to 1 if your system has a GNU libc compatible 'malloc' function, and to 0 otherwise.])], [AC_DEFINE([HAVE_MALLOC_GNU], [0]) REPLACE_MALLOC=1 ]) ]) # gl_FUNC_MALLOC_POSIX # -------------------- # Test whether 'malloc' is POSIX compliant (sets errno to ENOMEM when it # fails), and replace malloc if it is not. AC_DEFUN([gl_FUNC_MALLOC_POSIX], [ AC_REQUIRE([gl_STDLIB_H_DEFAULTS]) AC_REQUIRE([gl_CHECK_MALLOC_POSIX]) if test $gl_cv_func_malloc_posix = yes; then AC_DEFINE([HAVE_MALLOC_POSIX], [1], [Define if the 'malloc' function is POSIX compliant.]) else REPLACE_MALLOC=1 fi ]) # Test whether malloc, realloc, calloc are POSIX compliant, # Set gl_cv_func_malloc_posix to yes or no accordingly. AC_DEFUN([gl_CHECK_MALLOC_POSIX], [ AC_CACHE_CHECK([whether malloc, realloc, calloc are POSIX compliant], [gl_cv_func_malloc_posix], [ dnl It is too dangerous to try to allocate a large amount of memory: dnl some systems go to their knees when you do that. So assume that dnl all Unix implementations of the function are POSIX compliant. AC_COMPILE_IFELSE( [AC_LANG_PROGRAM( [[]], [[#if defined _WIN32 && ! defined __CYGWIN__ choke me #endif ]])], [gl_cv_func_malloc_posix=yes], [gl_cv_func_malloc_posix=no]) ]) ]) pspp-1.4.1/gl/m4/msvc-inval.m40000644000175000017500000000133413723215637015370 0ustar00blpblp00000000000000# msvc-inval.m4 serial 1 dnl Copyright (C) 2011-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_MSVC_INVAL], [ AC_CHECK_FUNCS_ONCE([_set_invalid_parameter_handler]) if test $ac_cv_func__set_invalid_parameter_handler = yes; then HAVE_MSVC_INVALID_PARAMETER_HANDLER=1 AC_DEFINE([HAVE_MSVC_INVALID_PARAMETER_HANDLER], [1], [Define to 1 on MSVC platforms that have the "invalid parameter handler" concept.]) else HAVE_MSVC_INVALID_PARAMETER_HANDLER=0 fi AC_SUBST([HAVE_MSVC_INVALID_PARAMETER_HANDLER]) ]) pspp-1.4.1/gl/m4/mempcpy.m40000644000175000017500000000134613723215637014766 0ustar00blpblp00000000000000# mempcpy.m4 serial 11 dnl Copyright (C) 2003-2004, 2006-2007, 2009-2020 Free Software Foundation, dnl Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_FUNC_MEMPCPY], [ dnl Persuade glibc to declare mempcpy(). AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS]) dnl The mempcpy() declaration in lib/string.in.h uses 'restrict'. AC_REQUIRE([AC_C_RESTRICT]) AC_REQUIRE([gl_HEADER_STRING_H_DEFAULTS]) AC_CHECK_FUNCS([mempcpy]) if test $ac_cv_func_mempcpy = no; then HAVE_MEMPCPY=0 fi ]) # Prerequisites of lib/mempcpy.c. AC_DEFUN([gl_PREREQ_MEMPCPY], [ : ]) pspp-1.4.1/gl/m4/mbsinit.m40000644000175000017500000000276313723215637014765 0ustar00blpblp00000000000000# mbsinit.m4 serial 8 dnl Copyright (C) 2008, 2010-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_FUNC_MBSINIT], [ AC_REQUIRE([gl_WCHAR_H_DEFAULTS]) AC_REQUIRE([AC_CANONICAL_HOST]) AC_REQUIRE([AC_TYPE_MBSTATE_T]) gl_MBSTATE_T_BROKEN AC_CHECK_FUNCS_ONCE([mbsinit]) if test $ac_cv_func_mbsinit = no; then HAVE_MBSINIT=0 AC_CHECK_DECLS([mbsinit],,, [[ /* Tru64 with Desktop Toolkit C has a bug: must be included before . BSD/OS 4.0.1 has a bug: , and must be included before . */ #include #include #include #include ]]) if test $ac_cv_have_decl_mbsinit = yes; then dnl On Minix 3.1.8, the system's declares mbsinit() although dnl it does not have the function. Avoid a collision with gnulib's dnl replacement. REPLACE_MBSINIT=1 fi else if test $REPLACE_MBSTATE_T = 1; then REPLACE_MBSINIT=1 else dnl On mingw, mbsinit() always returns 1, which is inappropriate for dnl states produced by mbrtowc() for an incomplete multibyte character dnl in multibyte locales. case "$host_os" in mingw*) REPLACE_MBSINIT=1 ;; esac fi fi ]) # Prerequisites of lib/mbsinit.c. AC_DEFUN([gl_PREREQ_MBSINIT], [ : ]) pspp-1.4.1/gl/m4/isnanf.m40000644000175000017500000001276413723215637014600 0ustar00blpblp00000000000000# isnanf.m4 serial 17 dnl Copyright (C) 2007-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl Check how to get or define isnanf(). AC_DEFUN([gl_FUNC_ISNANF], [ AC_REQUIRE([gl_MATH_H_DEFAULTS]) ISNANF_LIBM= gl_HAVE_ISNANF_NO_LIBM if test $gl_cv_func_isnanf_no_libm = no; then gl_HAVE_ISNANF_IN_LIBM if test $gl_cv_func_isnanf_in_libm = yes; then ISNANF_LIBM=-lm fi fi dnl The variable gl_func_isnanf set here is used by isnan.m4. if test $gl_cv_func_isnanf_no_libm = yes \ || test $gl_cv_func_isnanf_in_libm = yes; then save_LIBS="$LIBS" LIBS="$LIBS $ISNANF_LIBM" gl_ISNANF_WORKS LIBS="$save_LIBS" case "$gl_cv_func_isnanf_works" in *yes) gl_func_isnanf=yes ;; *) gl_func_isnanf=no; ISNANF_LIBM= ;; esac else gl_func_isnanf=no fi if test $gl_func_isnanf != yes; then HAVE_ISNANF=0 fi AC_SUBST([ISNANF_LIBM]) ]) dnl Check how to get or define isnanf() without linking with libm. AC_DEFUN([gl_FUNC_ISNANF_NO_LIBM], [ gl_HAVE_ISNANF_NO_LIBM if test $gl_cv_func_isnanf_no_libm = yes; then gl_ISNANF_WORKS fi if test $gl_cv_func_isnanf_no_libm = yes \ && { case "$gl_cv_func_isnanf_works" in *yes) true;; *) false;; esac }; then gl_func_isnanf_no_libm=yes AC_DEFINE([HAVE_ISNANF_IN_LIBC], [1], [Define if the isnan(float) function is available in libc.]) else gl_func_isnanf_no_libm=no fi ]) dnl Prerequisites of replacement isnanf definition. It does not need -lm. AC_DEFUN([gl_PREREQ_ISNANF], [ gl_FLOAT_EXPONENT_LOCATION ]) dnl Test whether isnanf() can be used without libm. AC_DEFUN([gl_HAVE_ISNANF_NO_LIBM], [ AC_CACHE_CHECK([whether isnan(float) can be used without linking with libm], [gl_cv_func_isnanf_no_libm], [ AC_LINK_IFELSE( [AC_LANG_PROGRAM( [[#include #if (__GNUC__ >= 4) || (__clang_major__ >= 4) # undef isnanf # define isnanf(x) __builtin_isnan ((float)(x)) #elif defined isnan # undef isnanf # define isnanf(x) isnan ((float)(x)) #endif float x;]], [[return isnanf (x);]])], [gl_cv_func_isnanf_no_libm=yes], [gl_cv_func_isnanf_no_libm=no]) ]) ]) dnl Test whether isnanf() can be used with libm. AC_DEFUN([gl_HAVE_ISNANF_IN_LIBM], [ AC_CACHE_CHECK([whether isnan(float) can be used with libm], [gl_cv_func_isnanf_in_libm], [ save_LIBS="$LIBS" LIBS="$LIBS -lm" AC_LINK_IFELSE( [AC_LANG_PROGRAM( [[#include #if (__GNUC__ >= 4) || (__clang_major__ >= 4) # undef isnanf # define isnanf(x) __builtin_isnan ((float)(x)) #elif defined isnan # undef isnanf # define isnanf(x) isnan ((float)(x)) #endif float x;]], [[return isnanf (x);]])], [gl_cv_func_isnanf_in_libm=yes], [gl_cv_func_isnanf_in_libm=no]) LIBS="$save_LIBS" ]) ]) dnl Test whether isnanf() rejects Infinity (this fails on Solaris 2.5.1), dnl recognizes a NaN (this fails on IRIX 6.5 with cc), and recognizes a NaN dnl with in-memory representation 0x7fbfffff (this fails on IRIX 6.5). AC_DEFUN([gl_ISNANF_WORKS], [ AC_REQUIRE([AC_PROG_CC]) AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles AC_REQUIRE([gl_FLOAT_EXPONENT_LOCATION]) AC_CACHE_CHECK([whether isnan(float) works], [gl_cv_func_isnanf_works], [ AC_RUN_IFELSE( [AC_LANG_SOURCE([[ #include #if (__GNUC__ >= 4) || (__clang_major__ >= 4) # undef isnanf # define isnanf(x) __builtin_isnan ((float)(x)) #elif defined isnan # undef isnanf # define isnanf(x) isnan ((float)(x)) #endif /* The Compaq (ex-DEC) C 6.4 compiler chokes on the expression 0.0 / 0.0. */ #ifdef __DECC static float NaN () { static float zero = 0.0f; return zero / zero; } #else # define NaN() (0.0f / 0.0f) #endif #define NWORDS \ ((sizeof (float) + sizeof (unsigned int) - 1) / sizeof (unsigned int)) typedef union { unsigned int word[NWORDS]; float value; } memory_float; int main() { int result = 0; if (isnanf (1.0f / 0.0f)) result |= 1; if (!isnanf (NaN ())) result |= 2; #if defined FLT_EXPBIT0_WORD && defined FLT_EXPBIT0_BIT /* The isnanf function should be immune against changes in the sign bit and in the mantissa bits. The xor operation twiddles a bit that can only be a sign bit or a mantissa bit. */ if (FLT_EXPBIT0_WORD == 0 && FLT_EXPBIT0_BIT > 0) { memory_float m; m.value = NaN (); /* Set the bits below the exponent to 01111...111. */ m.word[0] &= -1U << FLT_EXPBIT0_BIT; m.word[0] |= 1U << (FLT_EXPBIT0_BIT - 1) - 1; if (!isnanf (m.value)) result |= 4; } #endif return result; }]])], [gl_cv_func_isnanf_works=yes], [gl_cv_func_isnanf_works=no], [case "$host_os" in irix* | solaris*) gl_cv_func_isnanf_works="guessing no" ;; mingw*) # Guess yes on mingw, no on MSVC. AC_EGREP_CPP([Known], [ #ifdef __MINGW32__ Known #endif ], [gl_cv_func_isnanf_works="guessing yes"], [gl_cv_func_isnanf_works="guessing no"]) ;; *) gl_cv_func_isnanf_works="guessing yes" ;; esac ]) ]) ]) pspp-1.4.1/gl/m4/getline.m40000644000175000017500000000637413723215637014751 0ustar00blpblp00000000000000# getline.m4 serial 30 dnl Copyright (C) 1998-2003, 2005-2007, 2009-2020 Free Software Foundation, dnl Inc. dnl dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_PREREQ([2.59]) dnl See if there's a working, system-supplied version of the getline function. dnl We can't just do AC_REPLACE_FUNCS([getline]) because some systems dnl have a function by that name in -linet that doesn't have anything dnl to do with the function we need. AC_DEFUN([gl_FUNC_GETLINE], [ AC_REQUIRE([gl_STDIO_H_DEFAULTS]) AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles dnl Persuade glibc to declare getline(). AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS]) AC_CHECK_DECLS_ONCE([getline]) gl_getline_needs_run_time_check=no AC_CHECK_FUNC([getline], [dnl Found it in some library. Verify that it works. gl_getline_needs_run_time_check=yes], [am_cv_func_working_getline=no]) if test $gl_getline_needs_run_time_check = yes; then AC_CACHE_CHECK([for working getline function], [am_cv_func_working_getline], [echo fooNbarN | tr -d '\012' | tr N '\012' > conftest.data AC_RUN_IFELSE([AC_LANG_SOURCE([[ # include # include # include int main () { FILE *in = fopen ("./conftest.data", "r"); if (!in) return 1; { /* Test result for a NULL buffer and a zero size. Based on a test program from Karl Heuer. */ char *line = NULL; size_t siz = 0; int len = getline (&line, &siz, in); if (!(len == 4 && line && strcmp (line, "foo\n") == 0)) { free (line); fclose (in); return 2; } free (line); } { /* Test result for a NULL buffer and a non-zero size. This crashes on FreeBSD 8.0. */ char *line = NULL; size_t siz = (size_t)(~0) / 4; if (getline (&line, &siz, in) == -1) { fclose (in); return 3; } free (line); } fclose (in); return 0; } ]])], [am_cv_func_working_getline=yes], [am_cv_func_working_getline=no], [dnl We're cross compiling. dnl Guess it works on glibc2 systems and musl systems. AC_EGREP_CPP([Lucky GNU user], [ #include #ifdef __GNU_LIBRARY__ #if (__GLIBC__ >= 2) && !defined __UCLIBC__ Lucky GNU user #endif #endif ], [am_cv_func_working_getline="guessing yes"], [case "$host_os" in *-musl*) am_cv_func_working_getline="guessing yes" ;; *) am_cv_func_working_getline="$gl_cross_guess_normal" ;; esac ]) ]) ]) fi if test $ac_cv_have_decl_getline = no; then HAVE_DECL_GETLINE=0 fi case "$am_cv_func_working_getline" in *yes) ;; *) dnl Set REPLACE_GETLINE always: Even if we have not found the broken dnl getline function among $LIBS, it may exist in libinet and the dnl executable may be linked with -linet. REPLACE_GETLINE=1 ;; esac ]) # Prerequisites of lib/getline.c. AC_DEFUN([gl_PREREQ_GETLINE], [ : ]) pspp-1.4.1/gl/m4/vprintf-posix.m40000644000175000017500000000133513723215637016142 0ustar00blpblp00000000000000# vprintf-posix.m4 serial 3 dnl Copyright (C) 2007-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_FUNC_VPRINTF_POSIX], [ AC_REQUIRE([gl_FUNC_VFPRINTF_POSIX]) if test $gl_cv_func_vfprintf_posix = no; then gl_REPLACE_VPRINTF fi ]) AC_DEFUN([gl_REPLACE_VPRINTF], [ AC_REQUIRE([gl_STDIO_H_DEFAULTS]) AC_LIBOBJ([vprintf]) REPLACE_VPRINTF=1 AC_DEFINE([REPLACE_VPRINTF_POSIX], [1], [Define if vprintf is overridden by a POSIX compliant gnulib implementation.]) gl_PREREQ_VPRINTF ]) AC_DEFUN([gl_PREREQ_VPRINTF], [:]) pspp-1.4.1/gl/m4/msvc-nothrow.m40000644000175000017500000000053013723215637015754 0ustar00blpblp00000000000000# msvc-nothrow.m4 serial 1 dnl Copyright (C) 2011-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_MSVC_NOTHROW], [ AC_REQUIRE([gl_MSVC_INVAL]) ]) pspp-1.4.1/gl/m4/assert.m40000644000175000017500000000166013723215637014614 0ustar00blpblp00000000000000#serial 7 # Copyright (C) 1998-1999, 2001, 2004, 2008-2020 Free Software Foundation, Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. dnl based on code from Eleftherios Gkioulekas dnl Autoconf 2.60 provides AC_HEADER_ASSERT for the same purpose, but dnl it has broken semantics for --enable-assert until 2.64. AC_DEFUN([gl_ASSERT], [ AC_MSG_CHECKING([whether to enable assertions]) AC_ARG_ENABLE([assert], [AS_HELP_STRING([--disable-assert], [turn off assertions])], [AS_IF([test "x$enableval" = xno], [AC_DEFINE([NDEBUG], [1], [Define to 1 if assertions should be disabled.])], [test "x$enableval" != xyes], [AC_MSG_WARN([invalid argument supplied to --enable-assert]) enable_assert=yes])], [enable_assert=yes]) AC_MSG_RESULT([$enable_assert]) ]) pspp-1.4.1/gl/m4/intlmacosx.m40000644000175000017500000000623513723215637015477 0ustar00blpblp00000000000000# intlmacosx.m4 serial 8 (gettext-0.20.2) dnl Copyright (C) 2004-2014, 2016, 2019-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl dnl This file can be used in projects which are not available under dnl the GNU General Public License or the GNU Lesser General Public dnl License but which still want to provide support for the GNU gettext dnl functionality. dnl Please note that the actual code of the GNU gettext library is covered dnl by the GNU Lesser General Public License, and the rest of the GNU dnl gettext package is covered by the GNU General Public License. dnl They are *not* in the public domain. dnl Checks for special options needed on Mac OS X. dnl Defines INTL_MACOSX_LIBS. AC_DEFUN([gt_INTL_MACOSX], [ dnl Check for API introduced in Mac OS X 10.4. AC_CACHE_CHECK([for CFPreferencesCopyAppValue], [gt_cv_func_CFPreferencesCopyAppValue], [gt_save_LIBS="$LIBS" LIBS="$LIBS -Wl,-framework -Wl,CoreFoundation" AC_LINK_IFELSE( [AC_LANG_PROGRAM( [[#include ]], [[CFPreferencesCopyAppValue(NULL, NULL)]])], [gt_cv_func_CFPreferencesCopyAppValue=yes], [gt_cv_func_CFPreferencesCopyAppValue=no]) LIBS="$gt_save_LIBS"]) if test $gt_cv_func_CFPreferencesCopyAppValue = yes; then AC_DEFINE([HAVE_CFPREFERENCESCOPYAPPVALUE], [1], [Define to 1 if you have the Mac OS X function CFPreferencesCopyAppValue in the CoreFoundation framework.]) fi dnl Don't check for the API introduced in Mac OS X 10.5, CFLocaleCopyCurrent, dnl because in macOS 10.13.4 it has the following behaviour: dnl When two or more languages are specified in the dnl "System Preferences > Language & Region > Preferred Languages" panel, dnl it returns en_CC where CC is the territory (even when English is not among dnl the preferred languages!). What we want instead is what dnl CFLocaleCopyCurrent returned in earlier macOS releases and what dnl CFPreferencesCopyAppValue still returns, namely ll_CC where ll is the dnl first among the preferred languages and CC is the territory. AC_CACHE_CHECK([for CFLocaleCopyPreferredLanguages], [gt_cv_func_CFLocaleCopyPreferredLanguages], [gt_save_LIBS="$LIBS" LIBS="$LIBS -Wl,-framework -Wl,CoreFoundation" AC_LINK_IFELSE( [AC_LANG_PROGRAM( [[#include ]], [[CFLocaleCopyPreferredLanguages();]])], [gt_cv_func_CFLocaleCopyPreferredLanguages=yes], [gt_cv_func_CFLocaleCopyPreferredLanguages=no]) LIBS="$gt_save_LIBS"]) if test $gt_cv_func_CFLocaleCopyPreferredLanguages = yes; then AC_DEFINE([HAVE_CFLOCALECOPYPREFERREDLANGUAGES], [1], [Define to 1 if you have the Mac OS X function CFLocaleCopyPreferredLanguages in the CoreFoundation framework.]) fi INTL_MACOSX_LIBS= if test $gt_cv_func_CFPreferencesCopyAppValue = yes \ || test $gt_cv_func_CFLocaleCopyPreferredLanguages = yes; then INTL_MACOSX_LIBS="-Wl,-framework -Wl,CoreFoundation" fi AC_SUBST([INTL_MACOSX_LIBS]) ]) pspp-1.4.1/gl/m4/extern-inline.m40000644000175000017500000001157413723215637016101 0ustar00blpblp00000000000000dnl 'extern inline' a la ISO C99. dnl Copyright 2012-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_EXTERN_INLINE], [ AH_VERBATIM([extern_inline], [/* Please see the Gnulib manual for how to use these macros. Suppress extern inline with HP-UX cc, as it appears to be broken; see . Suppress extern inline with Sun C in standards-conformance mode, as it mishandles inline functions that call each other. E.g., for 'inline void f (void) { } inline void g (void) { f (); }', c99 incorrectly complains 'reference to static identifier "f" in extern inline function'. This bug was observed with Sun C 5.12 SunOS_i386 2011/11/16. Suppress extern inline (with or without __attribute__ ((__gnu_inline__))) on configurations that mistakenly use 'static inline' to implement functions or macros in standard C headers like . For example, if isdigit is mistakenly implemented via a static inline function, a program containing an extern inline function that calls isdigit may not work since the C standard prohibits extern inline functions from calling static functions (ISO C 99 section 6.7.4.(3). This bug is known to occur on: OS X 10.8 and earlier; see: https://lists.gnu.org/r/bug-gnulib/2012-12/msg00023.html DragonFly; see http://muscles.dragonflybsd.org/bulk/clang-master-potential/20141111_102002/logs/ah-tty-0.3.12.log FreeBSD; see: https://lists.gnu.org/r/bug-gnulib/2014-07/msg00104.html OS X 10.9 has a macro __header_inline indicating the bug is fixed for C and for clang but remains for g++; see . Assume DragonFly and FreeBSD will be similar. GCC 4.3 and above with -std=c99 or -std=gnu99 implements ISO C99 inline semantics, unless -fgnu89-inline is used. It defines a macro __GNUC_STDC_INLINE__ to indicate this situation or a macro __GNUC_GNU_INLINE__ to indicate the opposite situation. GCC 4.2 with -std=c99 or -std=gnu99 implements the GNU C inline semantics but warns, unless -fgnu89-inline is used: warning: C99 inline functions are not supported; using GNU89 warning: to disable this warning use -fgnu89-inline or the gnu_inline function attribute It defines a macro __GNUC_GNU_INLINE__ to indicate this situation. */ #if (((defined __APPLE__ && defined __MACH__) \ || defined __DragonFly__ || defined __FreeBSD__) \ && (defined __header_inline \ ? (defined __cplusplus && defined __GNUC_STDC_INLINE__ \ && ! defined __clang__) \ : ((! defined _DONT_USE_CTYPE_INLINE_ \ && (defined __GNUC__ || defined __cplusplus)) \ || (defined _FORTIFY_SOURCE && 0 < _FORTIFY_SOURCE \ && defined __GNUC__ && ! defined __cplusplus)))) # define _GL_EXTERN_INLINE_STDHEADER_BUG #endif #if ((__GNUC__ \ ? defined __GNUC_STDC_INLINE__ && __GNUC_STDC_INLINE__ \ : (199901L <= __STDC_VERSION__ \ && !defined __HP_cc \ && !defined __PGI \ && !(defined __SUNPRO_C && __STDC__))) \ && !defined _GL_EXTERN_INLINE_STDHEADER_BUG) # define _GL_INLINE inline # define _GL_EXTERN_INLINE extern inline # define _GL_EXTERN_INLINE_IN_USE #elif (2 < __GNUC__ + (7 <= __GNUC_MINOR__) && !defined __STRICT_ANSI__ \ && !defined _GL_EXTERN_INLINE_STDHEADER_BUG) # if defined __GNUC_GNU_INLINE__ && __GNUC_GNU_INLINE__ /* __gnu_inline__ suppresses a GCC 4.2 diagnostic. */ # define _GL_INLINE extern inline __attribute__ ((__gnu_inline__)) # else # define _GL_INLINE extern inline # endif # define _GL_EXTERN_INLINE extern # define _GL_EXTERN_INLINE_IN_USE #else # define _GL_INLINE static _GL_UNUSED # define _GL_EXTERN_INLINE static _GL_UNUSED #endif /* In GCC 4.6 (inclusive) to 5.1 (exclusive), suppress bogus "no previous prototype for 'FOO'" and "no previous declaration for 'FOO'" diagnostics, when FOO is an inline function in the header; see and . */ #if __GNUC__ == 4 && 6 <= __GNUC_MINOR__ # if defined __GNUC_STDC_INLINE__ && __GNUC_STDC_INLINE__ # define _GL_INLINE_HEADER_CONST_PRAGMA # else # define _GL_INLINE_HEADER_CONST_PRAGMA \ _Pragma ("GCC diagnostic ignored \"-Wsuggest-attribute=const\"") # endif # define _GL_INLINE_HEADER_BEGIN \ _Pragma ("GCC diagnostic push") \ _Pragma ("GCC diagnostic ignored \"-Wmissing-prototypes\"") \ _Pragma ("GCC diagnostic ignored \"-Wmissing-declarations\"") \ _GL_INLINE_HEADER_CONST_PRAGMA # define _GL_INLINE_HEADER_END \ _Pragma ("GCC diagnostic pop") #else # define _GL_INLINE_HEADER_BEGIN # define _GL_INLINE_HEADER_END #endif]) ]) pspp-1.4.1/gl/m4/fseek.m40000644000175000017500000000100513723215637014401 0ustar00blpblp00000000000000# fseek.m4 serial 4 dnl Copyright (C) 2007, 2009-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_FUNC_FSEEK], [ AC_REQUIRE([gl_STDIO_H_DEFAULTS]) AC_REQUIRE([gl_FUNC_FSEEKO]) dnl When fseeko needs fixes, fseek needs them too. if test $HAVE_FSEEKO = 0 || test $REPLACE_FSEEKO = 1; then REPLACE_FSEEK=1 fi ]) pspp-1.4.1/gl/m4/vfprintf-posix.m40000644000175000017500000001044613723215637016313 0ustar00blpblp00000000000000# vfprintf-posix.m4 serial 14 dnl Copyright (C) 2007-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_FUNC_VFPRINTF_POSIX], [ AC_REQUIRE([gl_PRINTF_SIZES_C99]) AC_REQUIRE([gl_PRINTF_LONG_DOUBLE]) AC_REQUIRE([gl_PRINTF_INFINITE]) AC_REQUIRE([gl_PRINTF_INFINITE_LONG_DOUBLE]) AC_REQUIRE([gl_PRINTF_DIRECTIVE_A]) AC_REQUIRE([gl_PRINTF_DIRECTIVE_F]) AC_REQUIRE([gl_PRINTF_DIRECTIVE_N]) AC_REQUIRE([gl_PRINTF_DIRECTIVE_LS]) AC_REQUIRE([gl_PRINTF_POSITIONS]) AC_REQUIRE([gl_PRINTF_FLAG_GROUPING]) AC_REQUIRE([gl_PRINTF_FLAG_LEFTADJUST]) AC_REQUIRE([gl_PRINTF_FLAG_ZERO]) AC_REQUIRE([gl_PRINTF_PRECISION]) AC_REQUIRE([gl_PRINTF_ENOMEM]) gl_cv_func_vfprintf_posix=no case "$gl_cv_func_printf_sizes_c99" in *yes) case "$gl_cv_func_printf_long_double" in *yes) case "$gl_cv_func_printf_infinite" in *yes) case "$gl_cv_func_printf_infinite_long_double" in *yes) case "$gl_cv_func_printf_directive_a" in *yes) case "$gl_cv_func_printf_directive_f" in *yes) case "$gl_cv_func_printf_directive_n" in *yes) case "$gl_cv_func_printf_directive_ls" in *yes) case "$gl_cv_func_printf_positions" in *yes) case "$gl_cv_func_printf_flag_grouping" in *yes) case "$gl_cv_func_printf_flag_leftadjust" in *yes) case "$gl_cv_func_printf_flag_zero" in *yes) case "$gl_cv_func_printf_precision" in *yes) case "$gl_cv_func_printf_enomem" in *yes) # vfprintf exists and is # already POSIX compliant. gl_cv_func_vfprintf_posix=yes ;; esac ;; esac ;; esac ;; esac ;; esac ;; esac ;; esac ;; esac ;; esac ;; esac ;; esac ;; esac ;; esac ;; esac if test $gl_cv_func_vfprintf_posix = no; then gl_PREREQ_VASNPRINTF_LONG_DOUBLE gl_PREREQ_VASNPRINTF_INFINITE_DOUBLE gl_PREREQ_VASNPRINTF_INFINITE_LONG_DOUBLE gl_PREREQ_VASNPRINTF_DIRECTIVE_A gl_PREREQ_VASNPRINTF_DIRECTIVE_F gl_PREREQ_VASNPRINTF_DIRECTIVE_LS gl_PREREQ_VASNPRINTF_FLAG_GROUPING gl_PREREQ_VASNPRINTF_FLAG_LEFTADJUST gl_PREREQ_VASNPRINTF_FLAG_ZERO gl_PREREQ_VASNPRINTF_PRECISION gl_PREREQ_VASNPRINTF_ENOMEM gl_REPLACE_VASNPRINTF gl_REPLACE_VFPRINTF fi ]) AC_DEFUN([gl_REPLACE_VFPRINTF], [ AC_REQUIRE([gl_STDIO_H_DEFAULTS]) AC_LIBOBJ([vfprintf]) REPLACE_VFPRINTF=1 AC_DEFINE([REPLACE_VFPRINTF_POSIX], [1], [Define if vfprintf is overridden by a POSIX compliant gnulib implementation.]) gl_PREREQ_VFPRINTF ]) AC_DEFUN([gl_PREREQ_VFPRINTF], [:]) pspp-1.4.1/gl/m4/strcasestr.m40000644000175000017500000001133413723215637015507 0ustar00blpblp00000000000000# strcasestr.m4 serial 26 dnl Copyright (C) 2005, 2007-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl Check that strcasestr is present and works. AC_DEFUN([gl_FUNC_STRCASESTR_SIMPLE], [ AC_REQUIRE([gl_HEADER_STRING_H_DEFAULTS]) dnl Persuade glibc to declare strcasestr(). AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS]) AC_REQUIRE([gl_FUNC_MEMCHR]) AC_CHECK_FUNCS([strcasestr]) if test $ac_cv_func_strcasestr = no; then HAVE_STRCASESTR=0 else if test $REPLACE_MEMCHR = 1; then REPLACE_STRCASESTR=1 else dnl Detect https://sourceware.org/bugzilla/show_bug.cgi?id=12092 dnl and https://sourceware.org/bugzilla/show_bug.cgi?id=23637. AC_CACHE_CHECK([whether strcasestr works], [gl_cv_func_strcasestr_works_always], [AC_RUN_IFELSE( [AC_LANG_PROGRAM([[ #include /* for strcasestr */ #ifdef __GNU_LIBRARY__ #include #if __GLIBC__ == 2 && __GLIBC_MINOR__ == 28 Unlucky user #endif #endif #define P "_EF_BF_BD" #define HAYSTACK "F_BD_CE_BD" P P P P "_C3_88_20" P P P "_C3_A7_20" P #define NEEDLE P P P P P ]], [[return !!strcasestr (HAYSTACK, NEEDLE); ]])], [gl_cv_func_strcasestr_works_always=yes], [gl_cv_func_strcasestr_works_always=no], [dnl glibc 2.12 and cygwin 1.7.7 have a known bug. uClibc is not dnl affected, since it uses different source code for strcasestr dnl than glibc. dnl Assume that it works on all other platforms, even if it is not dnl linear. AC_EGREP_CPP([Lucky user], [ #ifdef __GNU_LIBRARY__ #include #if ((__GLIBC__ == 2 && __GLIBC_MINOR__ > 12) || (__GLIBC__ > 2)) \ || defined __UCLIBC__ Lucky user #endif #elif defined __CYGWIN__ #include #if CYGWIN_VERSION_DLL_COMBINED > CYGWIN_VERSION_DLL_MAKE_COMBINED (1007, 7) Lucky user #endif #else Lucky user #endif ], [gl_cv_func_strcasestr_works_always="guessing yes"], [gl_cv_func_strcasestr_works_always="$gl_cross_guess_normal"]) ]) ]) case "$gl_cv_func_strcasestr_works_always" in *yes) ;; *) REPLACE_STRCASESTR=1 ;; esac fi fi ]) # gl_FUNC_STRCASESTR_SIMPLE dnl Additionally, check that strcasestr is efficient. AC_DEFUN([gl_FUNC_STRCASESTR], [ AC_REQUIRE([gl_FUNC_STRCASESTR_SIMPLE]) if test $HAVE_STRCASESTR = 1 && test $REPLACE_STRCASESTR = 0; then AC_CACHE_CHECK([whether strcasestr works in linear time], [gl_cv_func_strcasestr_linear], [AC_RUN_IFELSE([AC_LANG_PROGRAM([[ #include /* for signal */ #include /* for strcasestr */ #include /* for malloc */ #include /* for alarm */ static void quit (int sig) { _exit (sig + 128); } ]], [[ int result = 0; size_t m = 1000000; char *haystack = (char *) malloc (2 * m + 2); char *needle = (char *) malloc (m + 2); /* Failure to compile this test due to missing alarm is okay, since all such platforms (mingw) also lack strcasestr. */ signal (SIGALRM, quit); alarm (5); /* Check for quadratic performance. */ if (haystack && needle) { memset (haystack, 'A', 2 * m); haystack[2 * m] = 'B'; haystack[2 * m + 1] = 0; memset (needle, 'A', m); needle[m] = 'B'; needle[m + 1] = 0; if (!strcasestr (haystack, needle)) result |= 1; } /* Free allocated memory, in case some sanitizer is watching. */ free (haystack); free (needle); return result; ]])], [gl_cv_func_strcasestr_linear=yes], [gl_cv_func_strcasestr_linear=no], [dnl Only glibc > 2.12 and cygwin > 1.7.7 are known to have a dnl strcasestr that works in linear time. AC_EGREP_CPP([Lucky user], [ #include #ifdef __GNU_LIBRARY__ #if ((__GLIBC__ == 2 && __GLIBC_MINOR__ > 12) || (__GLIBC__ > 2)) \ && !defined __UCLIBC__ Lucky user #endif #endif #ifdef __CYGWIN__ #include #if CYGWIN_VERSION_DLL_COMBINED > CYGWIN_VERSION_DLL_MAKE_COMBINED (1007, 7) Lucky user #endif #endif ], [gl_cv_func_strcasestr_linear="guessing yes"], [gl_cv_func_strcasestr_linear="$gl_cross_guess_normal"]) ]) ]) case "$gl_cv_func_strcasestr_linear" in *yes) ;; *) REPLACE_STRCASESTR=1 ;; esac fi ]) # gl_FUNC_STRCASESTR # Prerequisites of lib/strcasestr.c. AC_DEFUN([gl_PREREQ_STRCASESTR], [ : ]) pspp-1.4.1/gl/m4/snprintf-posix.m40000644000175000017500000001401013723215637016307 0ustar00blpblp00000000000000# snprintf-posix.m4 serial 14 dnl Copyright (C) 2007-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_FUNC_SNPRINTF_POSIX], [ AC_REQUIRE([gl_PRINTF_SIZES_C99]) AC_REQUIRE([gl_PRINTF_LONG_DOUBLE]) AC_REQUIRE([gl_PRINTF_INFINITE]) AC_REQUIRE([gl_PRINTF_INFINITE_LONG_DOUBLE]) AC_REQUIRE([gl_PRINTF_DIRECTIVE_A]) AC_REQUIRE([gl_PRINTF_DIRECTIVE_F]) AC_REQUIRE([gl_PRINTF_DIRECTIVE_N]) AC_REQUIRE([gl_PRINTF_DIRECTIVE_LS]) AC_REQUIRE([gl_PRINTF_POSITIONS]) AC_REQUIRE([gl_PRINTF_FLAG_GROUPING]) AC_REQUIRE([gl_PRINTF_FLAG_LEFTADJUST]) AC_REQUIRE([gl_PRINTF_FLAG_ZERO]) AC_REQUIRE([gl_PRINTF_PRECISION]) AC_REQUIRE([gl_PRINTF_ENOMEM]) gl_cv_func_snprintf_posix=no AC_CHECK_FUNCS([snprintf]) if test $ac_cv_func_snprintf = yes; then gl_SNPRINTF_TRUNCATION_C99 gl_SNPRINTF_RETVAL_C99 gl_SNPRINTF_DIRECTIVE_N gl_SNPRINTF_SIZE1 gl_VSNPRINTF_ZEROSIZE_C99 case "$gl_cv_func_printf_sizes_c99" in *yes) case "$gl_cv_func_printf_long_double" in *yes) case "$gl_cv_func_printf_infinite" in *yes) case "$gl_cv_func_printf_infinite_long_double" in *yes) case "$gl_cv_func_printf_directive_a" in *yes) case "$gl_cv_func_printf_directive_f" in *yes) case "$gl_cv_func_printf_directive_n" in *yes) case "$gl_cv_func_printf_directive_ls" in *yes) case "$gl_cv_func_printf_positions" in *yes) case "$gl_cv_func_printf_flag_grouping" in *yes) case "$gl_cv_func_printf_flag_leftadjust" in *yes) case "$gl_cv_func_printf_flag_zero" in *yes) case "$gl_cv_func_printf_precision" in *yes) case "$gl_cv_func_printf_enomem" in *yes) case "$gl_cv_func_snprintf_truncation_c99" in *yes) case "$gl_cv_func_snprintf_retval_c99" in *yes) case "$gl_cv_func_snprintf_directive_n" in *yes) case "$gl_cv_func_snprintf_size1" in *yes) case "$gl_cv_func_vsnprintf_zerosize_c99" in *yes) # snprintf exists and is # already POSIX compliant. gl_cv_func_snprintf_posix=yes ;; esac ;; esac ;; esac ;; esac ;; esac ;; esac ;; esac ;; esac ;; esac ;; esac ;; esac ;; esac ;; esac ;; esac ;; esac ;; esac ;; esac ;; esac ;; esac fi if test $gl_cv_func_snprintf_posix = no; then gl_PREREQ_VASNPRINTF_LONG_DOUBLE gl_PREREQ_VASNPRINTF_INFINITE_DOUBLE gl_PREREQ_VASNPRINTF_INFINITE_LONG_DOUBLE gl_PREREQ_VASNPRINTF_DIRECTIVE_A gl_PREREQ_VASNPRINTF_DIRECTIVE_F gl_PREREQ_VASNPRINTF_DIRECTIVE_LS gl_PREREQ_VASNPRINTF_FLAG_GROUPING gl_PREREQ_VASNPRINTF_FLAG_LEFTADJUST gl_PREREQ_VASNPRINTF_FLAG_ZERO gl_PREREQ_VASNPRINTF_PRECISION gl_PREREQ_VASNPRINTF_ENOMEM gl_REPLACE_VASNPRINTF gl_REPLACE_SNPRINTF fi ]) pspp-1.4.1/gl/m4/stdio_h.m40000644000175000017500000002526613723215637014754 0ustar00blpblp00000000000000# stdio_h.m4 serial 50 dnl Copyright (C) 2007-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_STDIO_H], [ AH_VERBATIM([MINGW_ANSI_STDIO], [/* Use GNU style printf and scanf. */ #ifndef __USE_MINGW_ANSI_STDIO # undef __USE_MINGW_ANSI_STDIO #endif ]) AC_DEFINE([__USE_MINGW_ANSI_STDIO]) AC_REQUIRE([gl_STDIO_H_DEFAULTS]) gl_NEXT_HEADERS([stdio.h]) dnl Determine whether __USE_MINGW_ANSI_STDIO makes printf and dnl inttypes.h behave like gnu instead of system; we must give our dnl printf wrapper the right attribute to match. AC_CACHE_CHECK([which flavor of printf attribute matches inttypes macros], [gl_cv_func_printf_attribute_flavor], [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ #define __STDC_FORMAT_MACROS 1 #include #include /* For non-mingw systems, compilation will trivially succeed. For mingw, compilation will succeed for older mingw (system printf, "I64d") and fail for newer mingw (gnu printf, "lld"). */ #if (defined _WIN32 && ! defined __CYGWIN__) && \ (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4)) extern char PRIdMAX_probe[sizeof PRIdMAX == sizeof "I64d" ? 1 : -1]; #endif ]])], [gl_cv_func_printf_attribute_flavor=system], [gl_cv_func_printf_attribute_flavor=gnu])]) if test "$gl_cv_func_printf_attribute_flavor" = gnu; then AC_DEFINE([GNULIB_PRINTF_ATTRIBUTE_FLAVOR_GNU], [1], [Define to 1 if printf and friends should be labeled with attribute "__gnu_printf__" instead of "__printf__"]) fi dnl No need to create extra modules for these functions. Everyone who uses dnl likely needs them. GNULIB_FSCANF=1 gl_MODULE_INDICATOR([fscanf]) GNULIB_SCANF=1 gl_MODULE_INDICATOR([scanf]) GNULIB_FGETC=1 GNULIB_GETC=1 GNULIB_GETCHAR=1 GNULIB_FGETS=1 GNULIB_FREAD=1 dnl This ifdef is necessary to avoid an error "missing file lib/stdio-read.c" dnl "expected source file, required through AC_LIBSOURCES, not found". It is dnl also an optimization, to avoid performing a configure check whose result dnl is not used. But it does not make the test of GNULIB_STDIO_H_NONBLOCKING dnl or GNULIB_NONBLOCKING redundant. m4_ifdef([gl_NONBLOCKING_IO], [ gl_NONBLOCKING_IO if test $gl_cv_have_nonblocking != yes; then REPLACE_STDIO_READ_FUNCS=1 AC_LIBOBJ([stdio-read]) fi ]) dnl No need to create extra modules for these functions. Everyone who uses dnl likely needs them. GNULIB_FPRINTF=1 GNULIB_PRINTF=1 GNULIB_VFPRINTF=1 GNULIB_VPRINTF=1 GNULIB_FPUTC=1 GNULIB_PUTC=1 GNULIB_PUTCHAR=1 GNULIB_FPUTS=1 GNULIB_PUTS=1 GNULIB_FWRITE=1 dnl This ifdef is necessary to avoid an error "missing file lib/stdio-write.c" dnl "expected source file, required through AC_LIBSOURCES, not found". It is dnl also an optimization, to avoid performing a configure check whose result dnl is not used. But it does not make the test of GNULIB_STDIO_H_SIGPIPE or dnl GNULIB_SIGPIPE redundant. m4_ifdef([gl_SIGNAL_SIGPIPE], [ gl_SIGNAL_SIGPIPE if test $gl_cv_header_signal_h_SIGPIPE != yes; then REPLACE_STDIO_WRITE_FUNCS=1 AC_LIBOBJ([stdio-write]) fi ]) dnl This ifdef is necessary to avoid an error "missing file lib/stdio-write.c" dnl "expected source file, required through AC_LIBSOURCES, not found". It is dnl also an optimization, to avoid performing a configure check whose result dnl is not used. But it does not make the test of GNULIB_STDIO_H_NONBLOCKING dnl or GNULIB_NONBLOCKING redundant. m4_ifdef([gl_NONBLOCKING_IO], [ gl_NONBLOCKING_IO if test $gl_cv_have_nonblocking != yes; then REPLACE_STDIO_WRITE_FUNCS=1 AC_LIBOBJ([stdio-write]) fi ]) dnl Check for declarations of anything we want to poison if the dnl corresponding gnulib module is not in use, and which is not dnl guaranteed by both C89 and C11. gl_WARN_ON_USE_PREPARE([[#include ]], [dprintf fpurge fseeko ftello getdelim getline gets pclose popen renameat snprintf tmpfile vdprintf vsnprintf]) AC_REQUIRE([AC_C_RESTRICT]) ]) AC_DEFUN([gl_STDIO_MODULE_INDICATOR], [ dnl Use AC_REQUIRE here, so that the default settings are expanded once only. AC_REQUIRE([gl_STDIO_H_DEFAULTS]) gl_MODULE_INDICATOR_SET_VARIABLE([$1]) dnl Define it also as a C macro, for the benefit of the unit tests. gl_MODULE_INDICATOR_FOR_TESTS([$1]) ]) AC_DEFUN([gl_STDIO_H_DEFAULTS], [ GNULIB_DPRINTF=0; AC_SUBST([GNULIB_DPRINTF]) GNULIB_FCLOSE=0; AC_SUBST([GNULIB_FCLOSE]) GNULIB_FDOPEN=0; AC_SUBST([GNULIB_FDOPEN]) GNULIB_FFLUSH=0; AC_SUBST([GNULIB_FFLUSH]) GNULIB_FGETC=0; AC_SUBST([GNULIB_FGETC]) GNULIB_FGETS=0; AC_SUBST([GNULIB_FGETS]) GNULIB_FOPEN=0; AC_SUBST([GNULIB_FOPEN]) GNULIB_FPRINTF=0; AC_SUBST([GNULIB_FPRINTF]) GNULIB_FPRINTF_POSIX=0; AC_SUBST([GNULIB_FPRINTF_POSIX]) GNULIB_FPURGE=0; AC_SUBST([GNULIB_FPURGE]) GNULIB_FPUTC=0; AC_SUBST([GNULIB_FPUTC]) GNULIB_FPUTS=0; AC_SUBST([GNULIB_FPUTS]) GNULIB_FREAD=0; AC_SUBST([GNULIB_FREAD]) GNULIB_FREOPEN=0; AC_SUBST([GNULIB_FREOPEN]) GNULIB_FSCANF=0; AC_SUBST([GNULIB_FSCANF]) GNULIB_FSEEK=0; AC_SUBST([GNULIB_FSEEK]) GNULIB_FSEEKO=0; AC_SUBST([GNULIB_FSEEKO]) GNULIB_FTELL=0; AC_SUBST([GNULIB_FTELL]) GNULIB_FTELLO=0; AC_SUBST([GNULIB_FTELLO]) GNULIB_FWRITE=0; AC_SUBST([GNULIB_FWRITE]) GNULIB_GETC=0; AC_SUBST([GNULIB_GETC]) GNULIB_GETCHAR=0; AC_SUBST([GNULIB_GETCHAR]) GNULIB_GETDELIM=0; AC_SUBST([GNULIB_GETDELIM]) GNULIB_GETLINE=0; AC_SUBST([GNULIB_GETLINE]) GNULIB_OBSTACK_PRINTF=0; AC_SUBST([GNULIB_OBSTACK_PRINTF]) GNULIB_OBSTACK_PRINTF_POSIX=0; AC_SUBST([GNULIB_OBSTACK_PRINTF_POSIX]) GNULIB_PCLOSE=0; AC_SUBST([GNULIB_PCLOSE]) GNULIB_PERROR=0; AC_SUBST([GNULIB_PERROR]) GNULIB_POPEN=0; AC_SUBST([GNULIB_POPEN]) GNULIB_PRINTF=0; AC_SUBST([GNULIB_PRINTF]) GNULIB_PRINTF_POSIX=0; AC_SUBST([GNULIB_PRINTF_POSIX]) GNULIB_PUTC=0; AC_SUBST([GNULIB_PUTC]) GNULIB_PUTCHAR=0; AC_SUBST([GNULIB_PUTCHAR]) GNULIB_PUTS=0; AC_SUBST([GNULIB_PUTS]) GNULIB_REMOVE=0; AC_SUBST([GNULIB_REMOVE]) GNULIB_RENAME=0; AC_SUBST([GNULIB_RENAME]) GNULIB_RENAMEAT=0; AC_SUBST([GNULIB_RENAMEAT]) GNULIB_SCANF=0; AC_SUBST([GNULIB_SCANF]) GNULIB_SNPRINTF=0; AC_SUBST([GNULIB_SNPRINTF]) GNULIB_SPRINTF_POSIX=0; AC_SUBST([GNULIB_SPRINTF_POSIX]) GNULIB_STDIO_H_NONBLOCKING=0; AC_SUBST([GNULIB_STDIO_H_NONBLOCKING]) GNULIB_STDIO_H_SIGPIPE=0; AC_SUBST([GNULIB_STDIO_H_SIGPIPE]) GNULIB_TMPFILE=0; AC_SUBST([GNULIB_TMPFILE]) GNULIB_VASPRINTF=0; AC_SUBST([GNULIB_VASPRINTF]) GNULIB_VFSCANF=0; AC_SUBST([GNULIB_VFSCANF]) GNULIB_VSCANF=0; AC_SUBST([GNULIB_VSCANF]) GNULIB_VDPRINTF=0; AC_SUBST([GNULIB_VDPRINTF]) GNULIB_VFPRINTF=0; AC_SUBST([GNULIB_VFPRINTF]) GNULIB_VFPRINTF_POSIX=0; AC_SUBST([GNULIB_VFPRINTF_POSIX]) GNULIB_VPRINTF=0; AC_SUBST([GNULIB_VPRINTF]) GNULIB_VPRINTF_POSIX=0; AC_SUBST([GNULIB_VPRINTF_POSIX]) GNULIB_VSNPRINTF=0; AC_SUBST([GNULIB_VSNPRINTF]) GNULIB_VSPRINTF_POSIX=0; AC_SUBST([GNULIB_VSPRINTF_POSIX]) dnl Assume proper GNU behavior unless another module says otherwise. HAVE_DECL_FPURGE=1; AC_SUBST([HAVE_DECL_FPURGE]) HAVE_DECL_FSEEKO=1; AC_SUBST([HAVE_DECL_FSEEKO]) HAVE_DECL_FTELLO=1; AC_SUBST([HAVE_DECL_FTELLO]) HAVE_DECL_GETDELIM=1; AC_SUBST([HAVE_DECL_GETDELIM]) HAVE_DECL_GETLINE=1; AC_SUBST([HAVE_DECL_GETLINE]) HAVE_DECL_OBSTACK_PRINTF=1; AC_SUBST([HAVE_DECL_OBSTACK_PRINTF]) HAVE_DECL_SNPRINTF=1; AC_SUBST([HAVE_DECL_SNPRINTF]) HAVE_DECL_VSNPRINTF=1; AC_SUBST([HAVE_DECL_VSNPRINTF]) HAVE_DPRINTF=1; AC_SUBST([HAVE_DPRINTF]) HAVE_FSEEKO=1; AC_SUBST([HAVE_FSEEKO]) HAVE_FTELLO=1; AC_SUBST([HAVE_FTELLO]) HAVE_PCLOSE=1; AC_SUBST([HAVE_PCLOSE]) HAVE_POPEN=1; AC_SUBST([HAVE_POPEN]) HAVE_RENAMEAT=1; AC_SUBST([HAVE_RENAMEAT]) HAVE_VASPRINTF=1; AC_SUBST([HAVE_VASPRINTF]) HAVE_VDPRINTF=1; AC_SUBST([HAVE_VDPRINTF]) REPLACE_DPRINTF=0; AC_SUBST([REPLACE_DPRINTF]) REPLACE_FCLOSE=0; AC_SUBST([REPLACE_FCLOSE]) REPLACE_FDOPEN=0; AC_SUBST([REPLACE_FDOPEN]) REPLACE_FFLUSH=0; AC_SUBST([REPLACE_FFLUSH]) REPLACE_FOPEN=0; AC_SUBST([REPLACE_FOPEN]) REPLACE_FPRINTF=0; AC_SUBST([REPLACE_FPRINTF]) REPLACE_FPURGE=0; AC_SUBST([REPLACE_FPURGE]) REPLACE_FREOPEN=0; AC_SUBST([REPLACE_FREOPEN]) REPLACE_FSEEK=0; AC_SUBST([REPLACE_FSEEK]) REPLACE_FSEEKO=0; AC_SUBST([REPLACE_FSEEKO]) REPLACE_FTELL=0; AC_SUBST([REPLACE_FTELL]) REPLACE_FTELLO=0; AC_SUBST([REPLACE_FTELLO]) REPLACE_GETDELIM=0; AC_SUBST([REPLACE_GETDELIM]) REPLACE_GETLINE=0; AC_SUBST([REPLACE_GETLINE]) REPLACE_OBSTACK_PRINTF=0; AC_SUBST([REPLACE_OBSTACK_PRINTF]) REPLACE_PERROR=0; AC_SUBST([REPLACE_PERROR]) REPLACE_POPEN=0; AC_SUBST([REPLACE_POPEN]) REPLACE_PRINTF=0; AC_SUBST([REPLACE_PRINTF]) REPLACE_REMOVE=0; AC_SUBST([REPLACE_REMOVE]) REPLACE_RENAME=0; AC_SUBST([REPLACE_RENAME]) REPLACE_RENAMEAT=0; AC_SUBST([REPLACE_RENAMEAT]) REPLACE_SNPRINTF=0; AC_SUBST([REPLACE_SNPRINTF]) REPLACE_SPRINTF=0; AC_SUBST([REPLACE_SPRINTF]) REPLACE_STDIO_READ_FUNCS=0; AC_SUBST([REPLACE_STDIO_READ_FUNCS]) REPLACE_STDIO_WRITE_FUNCS=0; AC_SUBST([REPLACE_STDIO_WRITE_FUNCS]) REPLACE_TMPFILE=0; AC_SUBST([REPLACE_TMPFILE]) REPLACE_VASPRINTF=0; AC_SUBST([REPLACE_VASPRINTF]) REPLACE_VDPRINTF=0; AC_SUBST([REPLACE_VDPRINTF]) REPLACE_VFPRINTF=0; AC_SUBST([REPLACE_VFPRINTF]) REPLACE_VPRINTF=0; AC_SUBST([REPLACE_VPRINTF]) REPLACE_VSNPRINTF=0; AC_SUBST([REPLACE_VSNPRINTF]) REPLACE_VSPRINTF=0; AC_SUBST([REPLACE_VSPRINTF]) ]) pspp-1.4.1/gl/m4/version-etc.m40000644000175000017500000000222613723215637015550 0ustar00blpblp00000000000000# version-etc.m4 serial 1 # Copyright (C) 2009-2020 Free Software Foundation, Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. dnl $1 - configure flag and define name dnl $2 - human readable description m4_define([gl_VERSION_ETC_FLAG], [dnl AC_ARG_WITH([$1], [AS_HELP_STRING([--with-$1], [$2])], [dnl case $withval in yes|no) ;; *) AC_DEFINE_UNQUOTED(AS_TR_CPP([PACKAGE_$1]), ["$withval"], [$2]) ;; esac ]) ]) AC_DEFUN([gl_VERSION_ETC], [dnl gl_VERSION_ETC_FLAG([packager], [String identifying the packager of this software]) gl_VERSION_ETC_FLAG([packager-version], [Packager-specific version information]) gl_VERSION_ETC_FLAG([packager-bug-reports], [Packager info for bug reports (URL/e-mail/...)]) if test "X$with_packager" = "X" && \ test "X$with_packager_version$with_packager_bug_reports" != "X" then AC_MSG_ERROR([The --with-packager-{bug-reports,version} options require --with-packager]) fi ]) pspp-1.4.1/gl/m4/intmax_t.m40000644000175000017500000000354413723215637015141 0ustar00blpblp00000000000000# intmax_t.m4 serial 9 dnl Copyright (C) 1997-2004, 2006-2007, 2009-2020 Free Software Foundation, dnl Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl From Paul Eggert. AC_PREREQ([2.53]) # Define intmax_t to 'long' or 'long long' # if it is not already defined in or . AC_DEFUN([gl_AC_TYPE_INTMAX_T], [ dnl For simplicity, we assume that a header file defines 'intmax_t' if and dnl only if it defines 'uintmax_t'. AC_REQUIRE([gl_AC_HEADER_INTTYPES_H]) AC_REQUIRE([gl_AC_HEADER_STDINT_H]) if test $gl_cv_header_inttypes_h = no && test $gl_cv_header_stdint_h = no; then AC_DEFINE_UNQUOTED([intmax_t], [long long], [Define to long or long long if and don't define.]) else AC_DEFINE([HAVE_INTMAX_T], [1], [Define if you have the 'intmax_t' type in or .]) fi ]) dnl An alternative would be to explicitly test for 'intmax_t'. AC_DEFUN([gt_AC_TYPE_INTMAX_T], [ AC_REQUIRE([gl_AC_HEADER_INTTYPES_H]) AC_REQUIRE([gl_AC_HEADER_STDINT_H]) AC_CACHE_CHECK([for intmax_t], [gt_cv_c_intmax_t], [AC_COMPILE_IFELSE( [AC_LANG_PROGRAM( [[ #include #include #if HAVE_STDINT_H_WITH_UINTMAX #include #endif #if HAVE_INTTYPES_H_WITH_UINTMAX #include #endif ]], [[intmax_t x = -1; return !x;]])], [gt_cv_c_intmax_t=yes], [gt_cv_c_intmax_t=no])]) if test $gt_cv_c_intmax_t = yes; then AC_DEFINE([HAVE_INTMAX_T], [1], [Define if you have the 'intmax_t' type in or .]) else AC_DEFINE_UNQUOTED([intmax_t], [long long], [Define to long or long long if and don't define.]) fi ]) pspp-1.4.1/gl/m4/warn-on-use.m40000644000175000017500000000435413723215637015471 0ustar00blpblp00000000000000# warn-on-use.m4 serial 6 dnl Copyright (C) 2010-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. # gl_WARN_ON_USE_PREPARE(INCLUDES, NAMES) # --------------------------------------- # If the module 'posixcheck' is in use: # # For each whitespace-separated element in the list of NAMES, define # HAVE_RAW_DECL_name if the function has a declaration among INCLUDES # even after being undefined as a macro. # # See warn-on-use.h for some hints on how to poison function names, as # well as ideas on poisoning global variables and macros. NAMES may # include global variables, but remember that only functions work with # _GL_WARN_ON_USE. Typically, INCLUDES only needs to list a single # header, but if the replacement header pulls in other headers because # some systems declare functions in the wrong header, then INCLUDES # should do likewise. # # It is generally safe to assume declarations for functions declared # in the intersection of C89 and C11 (such as printf) without # needing gl_WARN_ON_USE_PREPARE. AC_DEFUN([gl_WARN_ON_USE_PREPARE], [ m4_ifdef([gl_POSIXCHECK], [m4_foreach_w([gl_decl], [$2], [AH_TEMPLATE([HAVE_RAW_DECL_]AS_TR_CPP(m4_defn([gl_decl])), [Define to 1 if ]m4_defn([gl_decl])[ is declared even after undefining macros.])])dnl dnl FIXME: gl_Symbol must be used unquoted until we can assume dnl autoconf 2.64 or newer. for gl_func in m4_flatten([$2]); do AS_VAR_PUSHDEF([gl_Symbol], [gl_cv_have_raw_decl_$gl_func])dnl AC_CACHE_CHECK([whether $gl_func is declared without a macro], gl_Symbol, [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([$1], [@%:@undef $gl_func (void) $gl_func;])], [AS_VAR_SET(gl_Symbol, [yes])], [AS_VAR_SET(gl_Symbol, [no])])]) AS_VAR_IF(gl_Symbol, [yes], [AC_DEFINE_UNQUOTED(AS_TR_CPP([HAVE_RAW_DECL_$gl_func]), [1]) dnl shortcut - if the raw declaration exists, then set a cache dnl variable to allow skipping any later AC_CHECK_DECL efforts eval ac_cv_have_decl_$gl_func=yes]) AS_VAR_POPDEF([gl_Symbol])dnl done ]) ]) pspp-1.4.1/gl/m4/strcase.m40000644000175000017500000000201213723215637014747 0ustar00blpblp00000000000000# strcase.m4 serial 11 dnl Copyright (C) 2002, 2005-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_STRCASE], [ gl_FUNC_STRCASECMP gl_FUNC_STRNCASECMP ]) AC_DEFUN([gl_FUNC_STRCASECMP], [ AC_REQUIRE([gl_HEADER_STRINGS_H_DEFAULTS]) AC_CHECK_FUNCS([strcasecmp]) if test $ac_cv_func_strcasecmp = no; then HAVE_STRCASECMP=0 fi ]) AC_DEFUN([gl_FUNC_STRNCASECMP], [ AC_REQUIRE([gl_HEADER_STRINGS_H_DEFAULTS]) AC_CHECK_FUNCS([strncasecmp]) if test $ac_cv_func_strncasecmp = yes; then HAVE_STRNCASECMP=1 else HAVE_STRNCASECMP=0 fi AC_CHECK_DECLS([strncasecmp]) if test $ac_cv_have_decl_strncasecmp = no; then HAVE_DECL_STRNCASECMP=0 fi ]) # Prerequisites of lib/strcasecmp.c. AC_DEFUN([gl_PREREQ_STRCASECMP], [ : ]) # Prerequisites of lib/strncasecmp.c. AC_DEFUN([gl_PREREQ_STRNCASECMP], [ : ]) pspp-1.4.1/gl/m4/fopen.m40000644000175000017500000000756013723215637014427 0ustar00blpblp00000000000000# fopen.m4 serial 11 dnl Copyright (C) 2007-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_FUNC_FOPEN], [ AC_REQUIRE([gl_STDIO_H_DEFAULTS]) AC_REQUIRE([AC_CANONICAL_HOST]) case "$host_os" in mingw* | pw*) dnl Replace fopen, for handling of "/dev/null". REPLACE_FOPEN=1 dnl fopen on mingw also has the trailing slash bug. gl_cv_func_fopen_slash="guessing no" ;; *) dnl fopen("foo/", "w") should not create a file when the file name has a dnl trailing slash. AC_CACHE_CHECK([whether fopen recognizes a trailing slash], [gl_cv_func_fopen_slash], [ AC_RUN_IFELSE( [AC_LANG_SOURCE([[ #include #include int main () { FILE *fp = fopen ("conftest.sl/", "w"); int result = (fp != NULL); if (fp != NULL) fclose (fp); return result; }]])], [gl_cv_func_fopen_slash=yes], [gl_cv_func_fopen_slash=no], [ changequote(,)dnl case "$host_os" in aix* | hpux* | solaris2.[0-9] | solaris2.[0-9].*) gl_cv_func_fopen_slash="guessing no" ;; *) gl_cv_func_fopen_slash="guessing yes" ;; esac changequote([,])dnl ]) rm -f conftest.sl ]) ;; esac case "$gl_cv_func_fopen_slash" in *no) AC_DEFINE([FOPEN_TRAILING_SLASH_BUG], [1], [Define to 1 if fopen() fails to recognize a trailing slash.]) REPLACE_FOPEN=1 ;; esac ]) AC_DEFUN([gl_FUNC_FOPEN_GNU], [ AC_REQUIRE([gl_FUNC_FOPEN]) AC_CACHE_CHECK([whether fopen supports the mode character 'x'], [gl_cv_func_fopen_mode_x], [rm -f conftest.x AC_RUN_IFELSE( [AC_LANG_SOURCE([[ #include #include int main () { FILE *fp; fp = fopen ("conftest.x", "w"); fclose (fp); fp = fopen ("conftest.x", "wx"); if (fp != NULL) /* 'x' ignored */ return 1; else if (errno == EEXIST) return 0; else /* 'x' rejected */ return 2; }]])], [gl_cv_func_fopen_mode_x=yes], [gl_cv_func_fopen_mode_x=no], [case "$host_os" in # Guess yes on glibc and musl systems. linux*-gnu* | gnu* | kfreebsd*-gnu | *-musl*) gl_cv_func_fopen_mode_x="guessing yes" ;; # If we don't know, obey --enable-cross-guesses. *) gl_cv_func_fopen_mode_x="$gl_cross_guess_normal" ;; esac ]) rm -f conftest.x ]) AC_CACHE_CHECK([whether fopen supports the mode character 'e'], [gl_cv_func_fopen_mode_e], [echo foo > conftest.x AC_RUN_IFELSE( [AC_LANG_SOURCE([[ #include #include #include int main () { FILE *fp = fopen ("conftest.x", "re"); if (fp != NULL) { if (fcntl (fileno (fp), F_GETFD) & FD_CLOEXEC) return 0; else /* 'e' ignored */ return 1; } else /* 'e' rejected */ return 2; }]])], [gl_cv_func_fopen_mode_e=yes], [gl_cv_func_fopen_mode_e=no], [case "$host_os" in # Guess yes on glibc and musl systems. linux*-gnu* | gnu* | kfreebsd*-gnu | *-musl*) gl_cv_func_fopen_mode_e="guessing yes" ;; # Guess no on native Windows. mingw*) gl_cv_func_fopen_mode_e="guessing no" ;; # If we don't know, obey --enable-cross-guesses. *) gl_cv_func_fopen_mode_e="$gl_cross_guess_normal" ;; esac ]) rm -f conftest.x ]) case "$gl_cv_func_fopen_mode_x" in *no) REPLACE_FOPEN=1 ;; esac case "$gl_cv_func_fopen_mode_e" in *no) REPLACE_FOPEN=1 ;; esac ]) # Prerequisites of lib/fopen.c. AC_DEFUN([gl_PREREQ_FOPEN], [:]) pspp-1.4.1/gl/m4/tempname.m40000644000175000017500000000103213723215637015112 0ustar00blpblp00000000000000#serial 5 # Copyright (C) 2006-2007, 2009-2020 Free Software Foundation, Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # glibc provides __gen_tempname as a wrapper for mk[ds]temp. Expose # it as a public API, and provide it on systems that are lacking. AC_DEFUN([gl_FUNC_GEN_TEMPNAME], [ gl_PREREQ_TEMPNAME ]) # Prerequisites of lib/tempname.c. AC_DEFUN([gl_PREREQ_TEMPNAME], [ : ]) pspp-1.4.1/gl/m4/mode_t.m40000644000175000017500000000234213723215637014560 0ustar00blpblp00000000000000# mode_t.m4 serial 2 dnl Copyright (C) 2009-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. # For using mode_t, it's sufficient to use AC_TYPE_MODE_T and # include . # Define PROMOTED_MODE_T to the type that is the result of "default argument # promotion" (ISO C 6.5.2.2.(6)) of the type mode_t. AC_DEFUN([gl_PROMOTED_TYPE_MODE_T], [ AC_REQUIRE([AC_TYPE_MODE_T]) AC_CACHE_CHECK([for promoted mode_t type], [gl_cv_promoted_mode_t], [ dnl Assume mode_t promotes to 'int' if and only if it is smaller than 'int', dnl and to itself otherwise. This assumption is not guaranteed by the ISO C dnl standard, but we don't know of any real-world counterexamples. AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include ]], [[typedef int array[2 * (sizeof (mode_t) < sizeof (int)) - 1];]])], [gl_cv_promoted_mode_t='int'], [gl_cv_promoted_mode_t='mode_t']) ]) AC_DEFINE_UNQUOTED([PROMOTED_MODE_T], [$gl_cv_promoted_mode_t], [Define to the type that is the result of default argument promotions of type mode_t.]) ]) pspp-1.4.1/gl/m4/__inline.m40000644000175000017500000000142313723215637015064 0ustar00blpblp00000000000000# Test for __inline keyword dnl Copyright 2017-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl___INLINE], [ AC_CACHE_CHECK([whether the compiler supports the __inline keyword], [gl_cv_c___inline], [AC_COMPILE_IFELSE( [AC_LANG_PROGRAM( [[typedef int foo_t; static __inline foo_t foo (void) { return 0; }]], [[return foo ();]])], [gl_cv_c___inline=yes], [gl_cv_c___inline=no])]) if test $gl_cv_c___inline = yes; then AC_DEFINE([HAVE___INLINE], [1], [Define to 1 if the compiler supports the keyword '__inline'.]) fi ]) pspp-1.4.1/gl/m4/malloca.m40000644000175000017500000000103313723215637014715 0ustar00blpblp00000000000000# malloca.m4 serial 2 dnl Copyright (C) 2003-2004, 2006-2007, 2009-2020 Free Software Foundation, dnl Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_MALLOCA], [ dnl Use the autoconf tests for alloca(), but not the AC_SUBSTed variables dnl @ALLOCA@ and @LTALLOCA@. dnl gl_FUNC_ALLOCA dnl Already brought in by the module dependencies. AC_REQUIRE([gl_EEMALLOC]) ]) pspp-1.4.1/gl/m4/ftell.m40000644000175000017500000000100513723215637014412 0ustar00blpblp00000000000000# ftell.m4 serial 3 dnl Copyright (C) 2007, 2009-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_FUNC_FTELL], [ AC_REQUIRE([gl_STDIO_H_DEFAULTS]) AC_REQUIRE([gl_FUNC_FTELLO]) dnl When ftello needs fixes, ftell needs them too. if test $HAVE_FTELLO = 0 || test $REPLACE_FTELLO = 1; then REPLACE_FTELL=1 fi ]) pspp-1.4.1/gl/m4/double-slash-root.m40000644000175000017500000000312513723215637016654 0ustar00blpblp00000000000000# double-slash-root.m4 serial 4 -*- Autoconf -*- dnl Copyright (C) 2006, 2008-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_DOUBLE_SLASH_ROOT], [ AC_REQUIRE([AC_CANONICAL_HOST]) AC_CACHE_CHECK([whether // is distinct from /], [gl_cv_double_slash_root], [ if test x"$cross_compiling" = xyes ; then # When cross-compiling, there is no way to tell whether // is special # short of a list of hosts. However, the only known hosts to date # that have a distinct // are Apollo DomainOS (too old to port to), # Cygwin, and z/OS. If anyone knows of another system for which // has # special semantics and is distinct from /, please report it to # . case $host in *-cygwin | i370-ibm-openedition) gl_cv_double_slash_root=yes ;; *) # Be optimistic and assume that / and // are the same when we # don't know. gl_cv_double_slash_root='unknown, assuming no' ;; esac else set x `ls -di / // 2>/dev/null` if test "$[2]" = "$[4]" && wc //dev/null >/dev/null 2>&1; then gl_cv_double_slash_root=no else gl_cv_double_slash_root=yes fi fi]) if test "$gl_cv_double_slash_root" = yes; then AC_DEFINE([DOUBLE_SLASH_IS_DISTINCT_ROOT], [1], [Define to 1 if // is a file system root distinct from /.]) fi ]) pspp-1.4.1/gl/m4/unlocked-io.m40000644000175000017500000000302713723215637015523 0ustar00blpblp00000000000000# unlocked-io.m4 serial 15 # Copyright (C) 1998-2006, 2009-2020 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. dnl From Jim Meyering. dnl dnl See if the glibc *_unlocked I/O macros or functions are available. dnl Use only those *_unlocked macros or functions that are declared dnl (because some of them were declared in Solaris 2.5.1 but were removed dnl in Solaris 2.6, whereas we want binaries built on Solaris 2.5.1 to run dnl on Solaris 2.6). AC_DEFUN([gl_FUNC_GLIBC_UNLOCKED_IO], [ AC_DEFINE([USE_UNLOCKED_IO], [1], [Define to 1 if you want getc etc. to use unlocked I/O if available. Unlocked I/O can improve performance in unithreaded apps, but it is not safe for multithreaded apps.]) dnl Persuade glibc and Solaris to declare dnl fgets_unlocked(), fputs_unlocked() etc. AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS]) AC_CHECK_DECLS_ONCE([clearerr_unlocked]) AC_CHECK_DECLS_ONCE([feof_unlocked]) AC_CHECK_DECLS_ONCE([ferror_unlocked]) AC_CHECK_DECLS_ONCE([fflush_unlocked]) AC_CHECK_DECLS_ONCE([fgets_unlocked]) AC_CHECK_DECLS_ONCE([fputc_unlocked]) AC_CHECK_DECLS_ONCE([fputs_unlocked]) AC_CHECK_DECLS_ONCE([fread_unlocked]) AC_CHECK_DECLS_ONCE([fwrite_unlocked]) AC_CHECK_DECLS_ONCE([getc_unlocked]) AC_CHECK_DECLS_ONCE([getchar_unlocked]) AC_CHECK_DECLS_ONCE([putc_unlocked]) AC_CHECK_DECLS_ONCE([putchar_unlocked]) ]) pspp-1.4.1/gl/m4/read-file.m40000644000175000017500000000055213723215637015142 0ustar00blpblp00000000000000# read-file.m4 serial 3 dnl Copyright (C) 2002-2006, 2009-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. # Prerequisites of lib/read-file.c. AC_DEFUN([gl_PREREQ_READ_FILE], [:]) pspp-1.4.1/gl/m4/xsize.m40000644000175000017500000000062613723215637014456 0ustar00blpblp00000000000000# xsize.m4 serial 5 dnl Copyright (C) 2003-2004, 2008-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_XSIZE], [ dnl Prerequisites of lib/xsize.h. AC_REQUIRE([gl_SIZE_MAX]) AC_CHECK_HEADERS([stdint.h]) ]) pspp-1.4.1/gl/m4/sys_random_h.m40000644000175000017500000000325413723215637016001 0ustar00blpblp00000000000000# sys_random_h.m4 serial 4 dnl Copyright (C) 2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_HEADER_SYS_RANDOM], [ AC_REQUIRE([gl_SYS_RANDOM_H_DEFAULTS]) dnl is always overridden, because of GNULIB_POSIXCHECK. gl_CHECK_NEXT_HEADERS([sys/random.h]) if test $ac_cv_header_sys_random_h = yes; then HAVE_SYS_RANDOM_H=1 else HAVE_SYS_RANDOM_H=0 fi AC_SUBST([HAVE_SYS_RANDOM_H]) m4_ifdef([gl_UNISTD_H_DEFAULTS], [AC_REQUIRE([gl_UNISTD_H_DEFAULTS])]) if test $ac_cv_header_sys_random_h = yes; then UNISTD_H_HAVE_SYS_RANDOM_H=1 fi dnl Check for declarations of anything we want to poison if the dnl corresponding gnulib module is not in use. gl_WARN_ON_USE_PREPARE([[ #if HAVE_SYS_RANDOM_H /* Additional includes are needed before on Mac OS X. */ # include # include # include #endif ]], [getrandom]) ]) AC_DEFUN([gl_SYS_RANDOM_MODULE_INDICATOR], [ dnl Use AC_REQUIRE here, so that the default settings are expanded once only. AC_REQUIRE([gl_SYS_RANDOM_H_DEFAULTS]) gl_MODULE_INDICATOR_SET_VARIABLE([$1]) dnl Define it also as a C macro, for the benefit of the unit tests. gl_MODULE_INDICATOR_FOR_TESTS([$1]) ]) AC_DEFUN([gl_SYS_RANDOM_H_DEFAULTS], [ GNULIB_GETRANDOM=0; AC_SUBST([GNULIB_GETRANDOM]) dnl Assume proper GNU behavior unless another module says otherwise. HAVE_GETRANDOM=1; AC_SUBST([HAVE_GETRANDOM]) REPLACE_GETRANDOM=0; AC_SUBST([REPLACE_GETRANDOM]) ]) pspp-1.4.1/gl/m4/asm-underscore.m40000644000175000017500000000443713723215637016247 0ustar00blpblp00000000000000# asm-underscore.m4 serial 4 dnl Copyright (C) 2010-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl From Bruno Haible. Based on as-underscore.m4 in GNU clisp. # gl_ASM_SYMBOL_PREFIX # Tests for the prefix of C symbols at the assembly language level and the # linker level. This prefix is either an underscore or empty. Defines the # C macro USER_LABEL_PREFIX to this prefix, and sets ASM_SYMBOL_PREFIX to # a stringified variant of this prefix. AC_DEFUN([gl_ASM_SYMBOL_PREFIX], [ AC_REQUIRE([AC_PROG_EGREP]) dnl We don't use GCC's __USER_LABEL_PREFIX__ here, because dnl 1. It works only for GCC. dnl 2. It is incorrectly defined on some platforms, in some GCC versions. AC_REQUIRE([gl_C_ASM]) AC_CACHE_CHECK( [whether C symbols are prefixed with underscore at the linker level], [gl_cv_prog_as_underscore], [cat > conftest.c </dev/null 2>&1 if LC_ALL=C $EGREP '(^|[[^a-zA-Z0-9_]])_foo([[^a-zA-Z0-9_]]|$)' conftest.$gl_asmext >/dev/null; then gl_cv_prog_as_underscore=yes else gl_cv_prog_as_underscore=no fi rm -f conftest* ]) if test $gl_cv_prog_as_underscore = yes; then USER_LABEL_PREFIX=_ else USER_LABEL_PREFIX= fi AC_DEFINE_UNQUOTED([USER_LABEL_PREFIX], [$USER_LABEL_PREFIX], [Define to the prefix of C symbols at the assembler and linker level, either an underscore or empty.]) ASM_SYMBOL_PREFIX='"'${USER_LABEL_PREFIX}'"' AC_SUBST([ASM_SYMBOL_PREFIX]) ]) # gl_C_ASM # Determines how to produce an assembly language file from C source code. # Sets the variables: # gl_asmext - the extension of assembly language output, # gl_c_asm_opt - the C compiler option that produces assembly language output. AC_DEFUN([gl_C_ASM], [ AC_EGREP_CPP([MicrosoftCompiler], [ #ifdef _MSC_VER MicrosoftCompiler #endif ], [gl_asmext='asm' gl_c_asm_opt='-c -Fa' ], [gl_asmext='s' gl_c_asm_opt='-S' ]) ]) pspp-1.4.1/gl/m4/stdarg.m40000644000175000017500000000533313723215637014600 0ustar00blpblp00000000000000# stdarg.m4 serial 7 dnl Copyright (C) 2006, 2008-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl From Bruno Haible. dnl Provide a working va_copy in combination with . AC_DEFUN([gl_STDARG_H], [ STDARG_H='' NEXT_STDARG_H='' AC_CACHE_CHECK([for va_copy], [gl_cv_func_va_copy], [AC_COMPILE_IFELSE( [AC_LANG_PROGRAM( [[#include ]], [[ #ifndef va_copy void (*func) (va_list, va_list) = va_copy; #endif ]])], [gl_cv_func_va_copy=yes], [gl_cv_func_va_copy=no]) ]) if test $gl_cv_func_va_copy = no; then dnl Provide a substitute. dnl Usually a simple definition in is enough. Not so on AIX 5 dnl with some versions of the /usr/vac/bin/cc compiler. It has an dnl which does '#undef va_copy', leading to a missing va_copy symbol. For dnl this platform, we use an substitute. But we cannot use this dnl approach on other platforms, because often defines only dnl preprocessor macros and gl_ABSOLUTE_HEADER, gl_CHECK_NEXT_HEADERS do dnl not work in this situation. AC_EGREP_CPP([vaccine], [#if defined _AIX && !defined __GNUC__ AIX vaccine #endif ], [gl_aixcc=yes], [gl_aixcc=no]) if test $gl_aixcc = yes; then dnl Provide a substitute file. STDARG_H=stdarg.h gl_NEXT_HEADERS([stdarg.h]) dnl Fallback for the case when contains only macro definitions. if test "$gl_cv_next_stdarg_h" = '""'; then gl_cv_next_stdarg_h='"///usr/include/stdarg.h"' NEXT_STDARG_H="$gl_cv_next_stdarg_h" fi else dnl Provide a substitute in , either __va_copy or as a simple dnl assignment. gl_CACHE_VAL_SILENT([gl_cv_func___va_copy], [ AC_COMPILE_IFELSE( [AC_LANG_PROGRAM( [[#include ]], [[ #ifndef __va_copy error, bail out #endif ]])], [gl_cv_func___va_copy=yes], [gl_cv_func___va_copy=no])]) if test $gl_cv_func___va_copy = yes; then AC_DEFINE([va_copy], [__va_copy], [Define as a macro for copying va_list variables.]) else AH_VERBATIM([gl_VA_COPY], [/* A replacement for va_copy, if needed. */ #define gl_va_copy(a,b) ((a) = (b))]) AC_DEFINE([va_copy], [gl_va_copy], [Define as a macro for copying va_list variables.]) fi fi fi AC_SUBST([STDARG_H]) AM_CONDITIONAL([GL_GENERATE_STDARG_H], [test -n "$STDARG_H"]) AC_SUBST([NEXT_STDARG_H]) ]) pspp-1.4.1/gl/m4/regex.m40000644000175000017500000003327413723215637014433 0ustar00blpblp00000000000000# serial 70 # Copyright (C) 1996-2001, 2003-2020 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. dnl Initially derived from code in GNU grep. dnl Mostly written by Jim Meyering. AC_PREREQ([2.50]) AC_DEFUN([gl_REGEX], [ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles AC_ARG_WITH([included-regex], [AS_HELP_STRING([--without-included-regex], [don't compile regex; this is the default on systems with recent-enough versions of the GNU C Library (use with caution on other systems).])]) case $with_included_regex in #( yes|no) ac_use_included_regex=$with_included_regex ;; '') # If the system regex support is good enough that it passes the # following run test, then default to *not* using the included regex.c. # If cross compiling, assume the test would fail and use the included # regex.c. AC_CHECK_DECLS_ONCE([alarm]) AC_CHECK_HEADERS_ONCE([malloc.h]) AC_CACHE_CHECK([for working re_compile_pattern], [gl_cv_func_re_compile_pattern_working], [AC_RUN_IFELSE( [AC_LANG_PROGRAM( [[#include #include #include #include #if defined M_CHECK_ACTION || HAVE_DECL_ALARM # include # include #endif #if HAVE_MALLOC_H # include #endif #ifdef M_CHECK_ACTION /* Exit with distinguishable exit code. */ static void sigabrt_no_core (int sig) { raise (SIGTERM); } #endif ]], [[int result = 0; static struct re_pattern_buffer regex; unsigned char folded_chars[UCHAR_MAX + 1]; int i; const char *s; struct re_registers regs; /* Some builds of glibc go into an infinite loop on this test. Use alarm to force death, and mallopt to avoid malloc recursion in diagnosing the corrupted heap. */ #if HAVE_DECL_ALARM signal (SIGALRM, SIG_DFL); alarm (2); #endif #ifdef M_CHECK_ACTION signal (SIGABRT, sigabrt_no_core); mallopt (M_CHECK_ACTION, 2); #endif if (setlocale (LC_ALL, "en_US.UTF-8")) { { /* https://sourceware.org/ml/libc-hacker/2006-09/msg00008.html This test needs valgrind to catch the bug on Debian GNU/Linux 3.1 x86, but it might catch the bug better on other platforms and it shouldn't hurt to try the test here. */ static char const pat[] = "insert into"; static char const data[] = "\xFF\0\x12\xA2\xAA\xC4\xB1,K\x12\xC4\xB1*\xACK"; re_set_syntax (RE_SYNTAX_GREP | RE_HAT_LISTS_NOT_NEWLINE | RE_ICASE); memset (®ex, 0, sizeof regex); s = re_compile_pattern (pat, sizeof pat - 1, ®ex); if (s) result |= 1; else { if (re_search (®ex, data, sizeof data - 1, 0, sizeof data - 1, ®s) != -1) result |= 1; regfree (®ex); } } { /* This test is from glibc bug 15078. The test case is from Andreas Schwab in . */ static char const pat[] = "[^x]x"; static char const data[] = /* */ "\xe1\x80\x80" "\xe1\x80\xbb" "\xe1\x80\xbd" "\xe1\x80\x94" "\xe1\x80\xba" "\xe1\x80\xaf" "\xe1\x80\x95" "\xe1\x80\xba" "x"; re_set_syntax (0); memset (®ex, 0, sizeof regex); s = re_compile_pattern (pat, sizeof pat - 1, ®ex); if (s) result |= 1; else { i = re_search (®ex, data, sizeof data - 1, 0, sizeof data - 1, 0); if (i != 0 && i != 21) result |= 1; regfree (®ex); } } if (! setlocale (LC_ALL, "C")) return 1; } /* This test is from glibc bug 3957, reported by Andrew Mackey. */ re_set_syntax (RE_SYNTAX_EGREP | RE_HAT_LISTS_NOT_NEWLINE); memset (®ex, 0, sizeof regex); s = re_compile_pattern ("a[^x]b", 6, ®ex); if (s) result |= 2; else { /* This should fail, but succeeds for glibc-2.5. */ if (re_search (®ex, "a\nb", 3, 0, 3, ®s) != -1) result |= 2; regfree (®ex); } /* This regular expression is from Spencer ere test number 75 in grep-2.3. */ re_set_syntax (RE_SYNTAX_POSIX_EGREP); memset (®ex, 0, sizeof regex); for (i = 0; i <= UCHAR_MAX; i++) folded_chars[i] = i; regex.translate = folded_chars; s = re_compile_pattern ("a[[:@:>@:]]b\n", 11, ®ex); /* This should fail with _Invalid character class name_ error. */ if (!s) { result |= 4; regfree (®ex); } /* Ensure that [b-a] is diagnosed as invalid, when using RE_NO_EMPTY_RANGES. */ re_set_syntax (RE_SYNTAX_POSIX_EGREP | RE_NO_EMPTY_RANGES); memset (®ex, 0, sizeof regex); s = re_compile_pattern ("a[b-a]", 6, ®ex); if (s == 0) { result |= 8; regfree (®ex); } /* This should succeed, but does not for glibc-2.1.3. */ memset (®ex, 0, sizeof regex); s = re_compile_pattern ("{1", 2, ®ex); if (s) result |= 8; else regfree (®ex); /* The following example is derived from a problem report against gawk from Jorge Stolfi . */ memset (®ex, 0, sizeof regex); s = re_compile_pattern ("[an\371]*n", 7, ®ex); if (s) result |= 8; else { /* This should match, but does not for glibc-2.2.1. */ if (re_match (®ex, "an", 2, 0, ®s) != 2) result |= 8; else { free (regs.start); free (regs.end); } regfree (®ex); } memset (®ex, 0, sizeof regex); s = re_compile_pattern ("x", 1, ®ex); if (s) result |= 8; else { /* glibc-2.2.93 does not work with a negative RANGE argument. */ if (re_search (®ex, "wxy", 3, 2, -2, ®s) != 1) result |= 8; else { free (regs.start); free (regs.end); } regfree (®ex); } /* The version of regex.c in older versions of gnulib ignored RE_ICASE. Detect that problem too. */ re_set_syntax (RE_SYNTAX_EMACS | RE_ICASE); memset (®ex, 0, sizeof regex); s = re_compile_pattern ("x", 1, ®ex); if (s) result |= 16; else { if (re_search (®ex, "WXY", 3, 0, 3, ®s) < 0) result |= 16; else { free (regs.start); free (regs.end); } regfree (®ex); } /* Catch a bug reported by Vin Shelton in https://lists.gnu.org/r/bug-coreutils/2007-06/msg00089.html */ re_set_syntax (RE_SYNTAX_POSIX_BASIC & ~RE_CONTEXT_INVALID_DUP & ~RE_NO_EMPTY_RANGES); memset (®ex, 0, sizeof regex); s = re_compile_pattern ("[[:alnum:]_-]\\\\+$", 16, ®ex); if (s) result |= 32; else regfree (®ex); /* REG_STARTEND was added to glibc on 2004-01-15. Reject older versions. */ if (! REG_STARTEND) result |= 64; /* Matching with the compiled form of this regexp would provoke an assertion failure prior to glibc-2.28: regexec.c:1375: pop_fail_stack: Assertion 'num >= 0' failed With glibc-2.28, compilation fails and reports the invalid back reference. */ re_set_syntax (RE_SYNTAX_POSIX_EGREP); memset (®ex, 0, sizeof regex); s = re_compile_pattern ("0|()0|\\1|0", 10, ®ex); if (!s) result |= 64; else { if (strcmp (s, "Invalid back reference")) result |= 64; regfree (®ex); } #if 0 /* It would be nice to reject hosts whose regoff_t values are too narrow (including glibc on hosts with 64-bit ptrdiff_t and 32-bit int), but we should wait until glibc implements this feature. Otherwise, support for equivalence classes and multibyte collation symbols would always be broken except when compiling --without-included-regex. */ if (sizeof (regoff_t) < sizeof (ptrdiff_t) || sizeof (regoff_t) < sizeof (ssize_t)) result |= 64; #endif return result; ]])], [gl_cv_func_re_compile_pattern_working=yes], [gl_cv_func_re_compile_pattern_working=no], [case "$host_os" in # Guess no on native Windows. mingw*) gl_cv_func_re_compile_pattern_working="guessing no" ;; # Otherwise obey --enable-cross-guesses. *) gl_cv_func_re_compile_pattern_working="$gl_cross_guess_normal" ;; esac ]) ]) case "$gl_cv_func_re_compile_pattern_working" in #( *yes) ac_use_included_regex=no;; #( *no) ac_use_included_regex=yes;; esac ;; *) AC_MSG_ERROR([Invalid value for --with-included-regex: $with_included_regex]) ;; esac if test $ac_use_included_regex = yes; then AC_DEFINE([_REGEX_INCLUDE_LIMITS_H], [1], [Define if you want to include , so that it consistently overrides 's RE_DUP_MAX.]) AC_DEFINE([_REGEX_LARGE_OFFSETS], [1], [Define if you want regoff_t to be at least as wide POSIX requires.]) AC_DEFINE([re_syntax_options], [rpl_re_syntax_options], [Define to rpl_re_syntax_options if the replacement should be used.]) AC_DEFINE([re_set_syntax], [rpl_re_set_syntax], [Define to rpl_re_set_syntax if the replacement should be used.]) AC_DEFINE([re_compile_pattern], [rpl_re_compile_pattern], [Define to rpl_re_compile_pattern if the replacement should be used.]) AC_DEFINE([re_compile_fastmap], [rpl_re_compile_fastmap], [Define to rpl_re_compile_fastmap if the replacement should be used.]) AC_DEFINE([re_search], [rpl_re_search], [Define to rpl_re_search if the replacement should be used.]) AC_DEFINE([re_search_2], [rpl_re_search_2], [Define to rpl_re_search_2 if the replacement should be used.]) AC_DEFINE([re_match], [rpl_re_match], [Define to rpl_re_match if the replacement should be used.]) AC_DEFINE([re_match_2], [rpl_re_match_2], [Define to rpl_re_match_2 if the replacement should be used.]) AC_DEFINE([re_set_registers], [rpl_re_set_registers], [Define to rpl_re_set_registers if the replacement should be used.]) AC_DEFINE([re_comp], [rpl_re_comp], [Define to rpl_re_comp if the replacement should be used.]) AC_DEFINE([re_exec], [rpl_re_exec], [Define to rpl_re_exec if the replacement should be used.]) AC_DEFINE([regcomp], [rpl_regcomp], [Define to rpl_regcomp if the replacement should be used.]) AC_DEFINE([regexec], [rpl_regexec], [Define to rpl_regexec if the replacement should be used.]) AC_DEFINE([regerror], [rpl_regerror], [Define to rpl_regerror if the replacement should be used.]) AC_DEFINE([regfree], [rpl_regfree], [Define to rpl_regfree if the replacement should be used.]) fi ]) # Prerequisites of lib/regex.c and lib/regex_internal.c. AC_DEFUN([gl_PREREQ_REGEX], [ AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS]) AC_REQUIRE([AC_C_INLINE]) AC_REQUIRE([AC_C_RESTRICT]) AC_REQUIRE([AC_TYPE_MBSTATE_T]) AC_REQUIRE([gl_EEMALLOC]) AC_REQUIRE([gl_GLIBC21]) AC_CHECK_HEADERS([libintl.h]) AC_CHECK_FUNCS_ONCE([isblank iswctype]) AC_CHECK_DECLS([isblank], [], [], [[#include ]]) ]) pspp-1.4.1/gl/m4/dup2.m40000644000175000017500000000720213723215637014163 0ustar00blpblp00000000000000#serial 26 dnl Copyright (C) 2002, 2005, 2007, 2009-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_FUNC_DUP2], [ AC_REQUIRE([gl_UNISTD_H_DEFAULTS]) AC_REQUIRE([AC_CANONICAL_HOST]) AC_CACHE_CHECK([whether dup2 works], [gl_cv_func_dup2_works], [AC_RUN_IFELSE([ AC_LANG_PROGRAM( [[#include #include #include #include #include #ifndef RLIM_SAVED_CUR # define RLIM_SAVED_CUR RLIM_INFINITY #endif #ifndef RLIM_SAVED_MAX # define RLIM_SAVED_MAX RLIM_INFINITY #endif ]], [[int result = 0; int bad_fd = INT_MAX; struct rlimit rlim; if (getrlimit (RLIMIT_NOFILE, &rlim) == 0 && 0 <= rlim.rlim_cur && rlim.rlim_cur <= INT_MAX && rlim.rlim_cur != RLIM_INFINITY && rlim.rlim_cur != RLIM_SAVED_MAX && rlim.rlim_cur != RLIM_SAVED_CUR) bad_fd = rlim.rlim_cur; #ifdef FD_CLOEXEC if (fcntl (1, F_SETFD, FD_CLOEXEC) == -1) result |= 1; #endif if (dup2 (1, 1) != 1) result |= 2; #ifdef FD_CLOEXEC if (fcntl (1, F_GETFD) != FD_CLOEXEC) result |= 4; #endif close (0); if (dup2 (0, 0) != -1) result |= 8; /* Many gnulib modules require POSIX conformance of EBADF. */ if (dup2 (2, bad_fd) == -1 && errno != EBADF) result |= 16; /* Flush out some cygwin core dumps. */ if (dup2 (2, -1) != -1 || errno != EBADF) result |= 32; dup2 (2, 255); dup2 (2, 256); /* On OS/2 kLIBC, dup2() does not work on a directory fd. */ { int fd = open (".", O_RDONLY); if (fd == -1) result |= 64; else if (dup2 (fd, fd + 1) == -1) result |= 128; close (fd); } return result;]]) ], [gl_cv_func_dup2_works=yes], [gl_cv_func_dup2_works=no], [case "$host_os" in mingw*) # on this platform, dup2 always returns 0 for success gl_cv_func_dup2_works="guessing no" ;; cygwin*) # on cygwin 1.5.x, dup2(1,1) returns 0 gl_cv_func_dup2_works="guessing no" ;; aix* | freebsd*) # on AIX 7.1 and FreeBSD 6.1, dup2 (1,toobig) gives EMFILE, # not EBADF. gl_cv_func_dup2_works="guessing no" ;; haiku*) # on Haiku alpha 2, dup2(1, 1) resets FD_CLOEXEC. gl_cv_func_dup2_works="guessing no" ;; *-android*) # implemented using dup3(), which fails if oldfd == newfd gl_cv_func_dup2_works="guessing no" ;; os2*) # on OS/2 kLIBC, dup2() does not work on a directory fd. gl_cv_func_dup2_works="guessing no" ;; *) gl_cv_func_dup2_works="guessing yes" ;; esac]) ]) case "$gl_cv_func_dup2_works" in *yes) ;; *) REPLACE_DUP2=1 AC_CHECK_FUNCS([setdtablesize]) ;; esac dnl Replace dup2() for supporting the gnulib-defined fchdir() function, dnl to keep fchdir's bookkeeping up-to-date. m4_ifdef([gl_FUNC_FCHDIR], [ gl_TEST_FCHDIR if test $HAVE_FCHDIR = 0; then REPLACE_DUP2=1 fi ]) ]) # Prerequisites of lib/dup2.c. AC_DEFUN([gl_PREREQ_DUP2], []) pspp-1.4.1/gl/m4/fcntl.m40000644000175000017500000001035113723215637014416 0ustar00blpblp00000000000000# fcntl.m4 serial 9 dnl Copyright (C) 2009-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. # For now, this module ensures that fcntl() # - supports F_DUPFD correctly # - supports or emulates F_DUPFD_CLOEXEC # - supports F_GETFD # Still to be ported to mingw: # - F_SETFD # - F_GETFL, F_SETFL # - F_GETOWN, F_SETOWN # - F_GETLK, F_SETLK, F_SETLKW AC_DEFUN([gl_FUNC_FCNTL], [ dnl Persuade glibc to expose F_DUPFD_CLOEXEC. AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS]) AC_REQUIRE([gl_FCNTL_H_DEFAULTS]) AC_REQUIRE([AC_CANONICAL_HOST]) AC_CHECK_FUNCS_ONCE([fcntl]) if test $ac_cv_func_fcntl = no; then gl_REPLACE_FCNTL else dnl cygwin 1.5.x F_DUPFD has wrong errno, and allows negative target dnl haiku alpha 2 F_DUPFD has wrong errno AC_CACHE_CHECK([whether fcntl handles F_DUPFD correctly], [gl_cv_func_fcntl_f_dupfd_works], [AC_RUN_IFELSE( [AC_LANG_PROGRAM( [[#include #include #include #include #include #ifndef RLIM_SAVED_CUR # define RLIM_SAVED_CUR RLIM_INFINITY #endif #ifndef RLIM_SAVED_MAX # define RLIM_SAVED_MAX RLIM_INFINITY #endif ]], [[int result = 0; int bad_fd = INT_MAX; struct rlimit rlim; if (getrlimit (RLIMIT_NOFILE, &rlim) == 0 && 0 <= rlim.rlim_cur && rlim.rlim_cur <= INT_MAX && rlim.rlim_cur != RLIM_INFINITY && rlim.rlim_cur != RLIM_SAVED_MAX && rlim.rlim_cur != RLIM_SAVED_CUR) bad_fd = rlim.rlim_cur; if (fcntl (0, F_DUPFD, -1) != -1) result |= 1; if (errno != EINVAL) result |= 2; if (fcntl (0, F_DUPFD, bad_fd) != -1) result |= 4; if (errno != EINVAL) result |= 8; /* On OS/2 kLIBC, F_DUPFD does not work on a directory fd */ { int fd; fd = open (".", O_RDONLY); if (fd == -1) result |= 16; else if (fcntl (fd, F_DUPFD, STDERR_FILENO + 1) == -1) result |= 32; close (fd); } return result;]])], [gl_cv_func_fcntl_f_dupfd_works=yes], [gl_cv_func_fcntl_f_dupfd_works=no], [case $host_os in aix* | cygwin* | haiku*) gl_cv_func_fcntl_f_dupfd_works="guessing no" ;; *) gl_cv_func_fcntl_f_dupfd_works="guessing yes" ;; esac])]) case $gl_cv_func_fcntl_f_dupfd_works in *yes) ;; *) gl_REPLACE_FCNTL AC_DEFINE([FCNTL_DUPFD_BUGGY], [1], [Define this to 1 if F_DUPFD behavior does not match POSIX]) ;; esac dnl Many systems lack F_DUPFD_CLOEXEC AC_CACHE_CHECK([whether fcntl understands F_DUPFD_CLOEXEC], [gl_cv_func_fcntl_f_dupfd_cloexec], [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ #include #ifndef F_DUPFD_CLOEXEC choke me #endif ]])], [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ #ifdef __linux__ /* The Linux kernel only added F_DUPFD_CLOEXEC in 2.6.24, so we always replace it to support the semantics on older kernels that failed with EINVAL. */ choke me #endif ]])], [gl_cv_func_fcntl_f_dupfd_cloexec=yes], [gl_cv_func_fcntl_f_dupfd_cloexec="needs runtime check"])], [gl_cv_func_fcntl_f_dupfd_cloexec=no])]) if test "$gl_cv_func_fcntl_f_dupfd_cloexec" != yes; then gl_REPLACE_FCNTL dnl No witness macro needed for this bug. fi fi dnl Replace fcntl() for supporting the gnulib-defined fchdir() function, dnl to keep fchdir's bookkeeping up-to-date. m4_ifdef([gl_FUNC_FCHDIR], [ gl_TEST_FCHDIR if test $HAVE_FCHDIR = 0; then gl_REPLACE_FCNTL fi ]) ]) AC_DEFUN([gl_REPLACE_FCNTL], [ AC_REQUIRE([gl_FCNTL_H_DEFAULTS]) AC_CHECK_FUNCS_ONCE([fcntl]) if test $ac_cv_func_fcntl = no; then HAVE_FCNTL=0 else REPLACE_FCNTL=1 fi ]) pspp-1.4.1/gl/m4/nl_langinfo.m40000644000175000017500000000431113723215637015575 0ustar00blpblp00000000000000# nl_langinfo.m4 serial 7 dnl Copyright (C) 2009-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_FUNC_NL_LANGINFO], [ AC_REQUIRE([gl_LANGINFO_H_DEFAULTS]) AC_REQUIRE([gl_LANGINFO_H]) AC_CHECK_FUNCS_ONCE([nl_langinfo]) AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles AC_REQUIRE([gl_FUNC_SETLOCALE_NULL]) if test $ac_cv_func_nl_langinfo = yes; then # On Irix 6.5, YESEXPR is defined, but nl_langinfo(YESEXPR) is broken. AC_CACHE_CHECK([whether YESEXPR works], [gl_cv_func_nl_langinfo_yesexpr_works], [AC_RUN_IFELSE( [AC_LANG_PROGRAM([[#include ]], [[return !*nl_langinfo(YESEXPR); ]])], [gl_cv_func_nl_langinfo_yesexpr_works=yes], [gl_cv_func_nl_langinfo_yesexpr_works=no], [ case "$host_os" in # Guess no on irix systems. irix*) gl_cv_func_nl_langinfo_yesexpr_works="guessing no";; # Guess yes elsewhere. *) gl_cv_func_nl_langinfo_yesexpr_works="guessing yes";; esac ]) ]) case $gl_cv_func_nl_langinfo_yesexpr_works in *yes) FUNC_NL_LANGINFO_YESEXPR_WORKS=1 ;; *) FUNC_NL_LANGINFO_YESEXPR_WORKS=0 ;; esac AC_DEFINE_UNQUOTED([FUNC_NL_LANGINFO_YESEXPR_WORKS], [$FUNC_NL_LANGINFO_YESEXPR_WORKS], [Define to 1 if nl_langinfo (YESEXPR) returns a non-empty string.]) if test $HAVE_LANGINFO_CODESET = 1 \ && test $HAVE_LANGINFO_T_FMT_AMPM = 1 \ && test $HAVE_LANGINFO_ALTMON = 1 \ && test $HAVE_LANGINFO_ERA = 1 \ && test $FUNC_NL_LANGINFO_YESEXPR_WORKS = 1; then : else REPLACE_NL_LANGINFO=1 AC_DEFINE([REPLACE_NL_LANGINFO], [1], [Define if nl_langinfo exists but is overridden by gnulib.]) fi else HAVE_NL_LANGINFO=0 fi if test $HAVE_NL_LANGINFO = 0 || test $HAVE_LANGINFO_CODESET = 0; then LIB_NL_LANGINFO="$LIB_SETLOCALE_NULL" else LIB_NL_LANGINFO= fi dnl LIB_NL_LANGINFO is expected to be empty everywhere. AC_SUBST([LIB_NL_LANGINFO]) ]) pspp-1.4.1/gl/m4/vasprintf-posix.m40000644000175000017500000001030213723215637016460 0ustar00blpblp00000000000000# vasprintf-posix.m4 serial 13 dnl Copyright (C) 2007-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_FUNC_VASPRINTF_POSIX], [ AC_REQUIRE([gl_PRINTF_SIZES_C99]) AC_REQUIRE([gl_PRINTF_LONG_DOUBLE]) AC_REQUIRE([gl_PRINTF_INFINITE]) AC_REQUIRE([gl_PRINTF_INFINITE_LONG_DOUBLE]) AC_REQUIRE([gl_PRINTF_DIRECTIVE_A]) AC_REQUIRE([gl_PRINTF_DIRECTIVE_F]) AC_REQUIRE([gl_PRINTF_DIRECTIVE_N]) AC_REQUIRE([gl_PRINTF_DIRECTIVE_LS]) AC_REQUIRE([gl_PRINTF_POSITIONS]) AC_REQUIRE([gl_PRINTF_FLAG_GROUPING]) AC_REQUIRE([gl_PRINTF_FLAG_LEFTADJUST]) AC_REQUIRE([gl_PRINTF_FLAG_ZERO]) AC_REQUIRE([gl_PRINTF_PRECISION]) AC_REQUIRE([gl_PRINTF_ENOMEM]) gl_cv_func_vasprintf_posix=no AC_CHECK_FUNCS([vasprintf]) case "$gl_cv_func_printf_sizes_c99" in *yes) case "$gl_cv_func_printf_long_double" in *yes) case "$gl_cv_func_printf_infinite" in *yes) case "$gl_cv_func_printf_infinite_long_double" in *yes) case "$gl_cv_func_printf_directive_a" in *yes) case "$gl_cv_func_printf_directive_f" in *yes) case "$gl_cv_func_printf_directive_n" in *yes) case "$gl_cv_func_printf_directive_ls" in *yes) case "$gl_cv_func_printf_positions" in *yes) case "$gl_cv_func_printf_flag_grouping" in *yes) case "$gl_cv_func_printf_flag_leftadjust" in *yes) case "$gl_cv_func_printf_flag_zero" in *yes) case "$gl_cv_func_printf_precision" in *yes) case "$gl_cv_func_printf_enomem" in *yes) if test $ac_cv_func_vasprintf = yes; then # vasprintf exists and is # already POSIX compliant. gl_cv_func_vasprintf_posix=yes fi ;; esac ;; esac ;; esac ;; esac ;; esac ;; esac ;; esac ;; esac ;; esac ;; esac ;; esac ;; esac ;; esac ;; esac if test $gl_cv_func_vasprintf_posix = no; then gl_PREREQ_VASNPRINTF_LONG_DOUBLE gl_PREREQ_VASNPRINTF_INFINITE_DOUBLE gl_PREREQ_VASNPRINTF_INFINITE_LONG_DOUBLE gl_PREREQ_VASNPRINTF_DIRECTIVE_A gl_PREREQ_VASNPRINTF_DIRECTIVE_F gl_PREREQ_VASNPRINTF_DIRECTIVE_LS gl_PREREQ_VASNPRINTF_FLAG_GROUPING gl_PREREQ_VASNPRINTF_FLAG_LEFTADJUST gl_PREREQ_VASNPRINTF_FLAG_ZERO gl_PREREQ_VASNPRINTF_PRECISION gl_PREREQ_VASNPRINTF_ENOMEM gl_REPLACE_VASNPRINTF gl_REPLACE_VASPRINTF fi ]) pspp-1.4.1/gl/m4/lcmessage.m40000644000175000017500000000251513723215637015256 0ustar00blpblp00000000000000# lcmessage.m4 serial 8 dnl Copyright (C) 1995-2002, 2004-2005, 2008-2014, 2016, 2019-2020 Free dnl Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl dnl This file can be used in projects which are not available under dnl the GNU General Public License or the GNU Lesser General Public dnl License but which still want to provide support for the GNU gettext dnl functionality. dnl Please note that the actual code of the GNU gettext library is covered dnl by the GNU Lesser General Public License, and the rest of the GNU dnl gettext package is covered by the GNU General Public License. dnl They are *not* in the public domain. dnl Authors: dnl Ulrich Drepper , 1995. # Check whether LC_MESSAGES is available in . AC_DEFUN([gt_LC_MESSAGES], [ AC_CACHE_CHECK([for LC_MESSAGES], [gt_cv_val_LC_MESSAGES], [AC_LINK_IFELSE( [AC_LANG_PROGRAM( [[#include ]], [[return LC_MESSAGES]])], [gt_cv_val_LC_MESSAGES=yes], [gt_cv_val_LC_MESSAGES=no])]) if test $gt_cv_val_LC_MESSAGES = yes; then AC_DEFINE([HAVE_LC_MESSAGES], [1], [Define if your file defines LC_MESSAGES.]) fi ]) pspp-1.4.1/gl/m4/timespec.m40000644000175000017500000000051513723555203015116 0ustar00blpblp00000000000000#serial 15 # Copyright (C) 2000-2001, 2003-2007, 2009-2020 Free Software Foundation, Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. dnl From Jim Meyering AC_DEFUN([gl_TIMESPEC], [:]) pspp-1.4.1/gl/m4/strndup.m40000644000175000017500000000327413723215637015015 0ustar00blpblp00000000000000# strndup.m4 serial 22 dnl Copyright (C) 2002-2003, 2005-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_FUNC_STRNDUP], [ dnl Persuade glibc to declare strndup(). AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS]) AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles AC_REQUIRE([gl_HEADER_STRING_H_DEFAULTS]) AC_CHECK_DECLS_ONCE([strndup]) AC_CHECK_FUNCS_ONCE([strndup]) if test $ac_cv_have_decl_strndup = no; then HAVE_DECL_STRNDUP=0 fi if test $ac_cv_func_strndup = yes; then HAVE_STRNDUP=1 # AIX 4.3.3, AIX 5.1 have a function that fails to add the terminating '\0'. AC_CACHE_CHECK([for working strndup], [gl_cv_func_strndup_works], [AC_RUN_IFELSE([ AC_LANG_PROGRAM([[#include #include ]], [[ #if !HAVE_DECL_STRNDUP extern #ifdef __cplusplus "C" #endif char *strndup (const char *, size_t); #endif int result; char *s; s = strndup ("some longer string", 15); free (s); s = strndup ("shorter string", 13); result = s[13] != '\0'; free (s); return result;]])], [gl_cv_func_strndup_works=yes], [gl_cv_func_strndup_works=no], [ changequote(,)dnl case $host_os in aix | aix[3-6]*) gl_cv_func_strndup_works="guessing no";; *) gl_cv_func_strndup_works="guessing yes";; esac changequote([,])dnl ])]) case $gl_cv_func_strndup_works in *no) REPLACE_STRNDUP=1 ;; esac else HAVE_STRNDUP=0 fi ]) pspp-1.4.1/gl/m4/strings_h.m40000644000175000017500000000316313723215637015313 0ustar00blpblp00000000000000# Configure a replacement for . # serial 6 # Copyright (C) 2007, 2009-2020 Free Software Foundation, Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_HEADER_STRINGS_H], [ dnl Use AC_REQUIRE here, so that the default behavior below is expanded dnl once only, before all statements that occur in other macros. AC_REQUIRE([gl_HEADER_STRINGS_H_BODY]) ]) AC_DEFUN([gl_HEADER_STRINGS_H_BODY], [ AC_REQUIRE([gl_HEADER_STRINGS_H_DEFAULTS]) gl_CHECK_NEXT_HEADERS([strings.h]) if test $ac_cv_header_strings_h = yes; then HAVE_STRINGS_H=1 else HAVE_STRINGS_H=0 fi AC_SUBST([HAVE_STRINGS_H]) dnl Check for declarations of anything we want to poison if the dnl corresponding gnulib module is not in use. gl_WARN_ON_USE_PREPARE([[ /* Minix 3.1.8 has a bug: must be included before . */ #include #include ]], [ffs strcasecmp strncasecmp]) ]) AC_DEFUN([gl_STRINGS_MODULE_INDICATOR], [ dnl Use AC_REQUIRE here, so that the default settings are expanded once only. AC_REQUIRE([gl_HEADER_STRINGS_H_DEFAULTS]) gl_MODULE_INDICATOR_SET_VARIABLE([$1]) ]) AC_DEFUN([gl_HEADER_STRINGS_H_DEFAULTS], [ GNULIB_FFS=0; AC_SUBST([GNULIB_FFS]) dnl Assume proper GNU behavior unless another module says otherwise. HAVE_FFS=1; AC_SUBST([HAVE_FFS]) HAVE_STRCASECMP=1; AC_SUBST([HAVE_STRCASECMP]) HAVE_DECL_STRNCASECMP=1; AC_SUBST([HAVE_DECL_STRNCASECMP]) ]) pspp-1.4.1/gl/m4/wchar_t.m40000644000175000017500000000146213723215637014742 0ustar00blpblp00000000000000# wchar_t.m4 serial 4 (gettext-0.18.2) dnl Copyright (C) 2002-2003, 2008-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl From Bruno Haible. dnl Test whether has the 'wchar_t' type. dnl Prerequisite: AC_PROG_CC AC_DEFUN([gt_TYPE_WCHAR_T], [ AC_CACHE_CHECK([for wchar_t], [gt_cv_c_wchar_t], [AC_COMPILE_IFELSE( [AC_LANG_PROGRAM( [[#include wchar_t foo = (wchar_t)'\0';]], [[]])], [gt_cv_c_wchar_t=yes], [gt_cv_c_wchar_t=no])]) if test $gt_cv_c_wchar_t = yes; then AC_DEFINE([HAVE_WCHAR_T], [1], [Define if you have the 'wchar_t' type.]) fi ]) pspp-1.4.1/gl/m4/mbtowc.m40000644000175000017500000000106313723215637014603 0ustar00blpblp00000000000000# mbtowc.m4 serial 3 dnl Copyright (C) 2011-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_FUNC_MBTOWC], [ AC_REQUIRE([gl_STDLIB_H_DEFAULTS]) AC_CHECK_FUNCS([mbtowc]) if test $ac_cv_func_mbtowc = no; then HAVE_MBTOWC=0 else if false; then REPLACE_MBTOWC=1 fi fi ]) # Prerequisites of lib/mbtowc.c. AC_DEFUN([gl_PREREQ_MBTOWC], [ : ]) pspp-1.4.1/gl/m4/explicit_bzero.m40000644000175000017500000000123413723215637016332 0ustar00blpblp00000000000000dnl Copyright 2017-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_FUNC_EXPLICIT_BZERO], [ AC_REQUIRE([gl_HEADER_STRING_H_DEFAULTS]) dnl Persuade glibc to declare explicit_bzero. AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS]) AC_CHECK_FUNCS_ONCE([explicit_bzero]) if test $ac_cv_func_explicit_bzero = no; then HAVE_EXPLICIT_BZERO=0 fi ]) AC_DEFUN([gl_PREREQ_EXPLICIT_BZERO], [ AC_CHECK_FUNCS([explicit_memset]) AC_CHECK_FUNCS_ONCE([memset_s]) ]) pspp-1.4.1/gl/m4/pthread_rwlock_rdlock.m40000644000175000017500000001546313723215637017667 0ustar00blpblp00000000000000# pthread_rwlock_rdlock.m4 serial 4 dnl Copyright (C) 2017-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl From Bruno Haible. dnl Inspired by dnl https://github.com/linux-test-project/ltp/blob/master/testcases/open_posix_testsuite/conformance/interfaces/pthread_rwlock_rdlock/2-2.c dnl by Intel Corporation. dnl Test whether in a situation where dnl - an rwlock is taken by a reader and has a writer waiting, dnl - an additional reader requests the lock, dnl - the waiting writer and the requesting reader threads have the same dnl priority, dnl the requesting reader thread gets blocked, so that at some point the dnl waiting writer can acquire the lock. dnl Without such a guarantee, when there a N readers and each of the readers dnl spends more than 1/Nth of the time with the lock held, there is a high dnl probability that the waiting writer will not get the lock in a given finite dnl time, a phenomenon called "writer starvation". dnl Without such a guarantee, applications have a hard time avoiding writer dnl starvation. dnl dnl POSIX:2017 makes this requirement only for implementations that support TPS dnl (Thread Priority Scheduling) and only for the scheduling policies SCHED_FIFO dnl and SCHED_RR, see dnl https://pubs.opengroup.org/onlinepubs/9699919799/functions/pthread_rwlock_rdlock.html dnl but this test verifies the guarantee regardless of TPS and regardless of dnl scheduling policy. dnl Glibc does not provide this guarantee (and never will on Linux), see dnl https://sourceware.org/bugzilla/show_bug.cgi?id=13701 dnl https://bugzilla.redhat.com/show_bug.cgi?id=1410052 AC_DEFUN([gl_PTHREAD_RWLOCK_RDLOCK_PREFER_WRITER], [ AC_REQUIRE([gl_THREADLIB_EARLY]) AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles AC_CACHE_CHECK([whether pthread_rwlock_rdlock prefers a writer to a reader], [gl_cv_pthread_rwlock_rdlock_prefer_writer], [save_LIBS="$LIBS" LIBS="$LIBS $LIBMULTITHREAD" AC_RUN_IFELSE( [AC_LANG_SOURCE([[ #include #include #include #include #define SUCCEED() exit (0) #define FAILURE() exit (1) #define UNEXPECTED(n) (exit (10 + (n))) /* The main thread creates the waiting writer and the requesting reader threads in the default way; this guarantees that they have the same priority. We can reuse the main thread as first reader thread. */ static pthread_rwlock_t lock; static pthread_t reader1; static pthread_t writer; static pthread_t reader2; static pthread_t timer; /* Used to pass control from writer to reader2 and from reader2 to timer, as in a relay race. Passing control from one running thread to another running thread is most likely faster than to create the second thread. */ static pthread_mutex_t baton; static void * timer_func (void *ignored) { /* Step 13 (can be before or after step 12): The timer thread takes the baton, then waits a moment to make sure it can tell whether the second reader thread is blocked at step 12. */ if (pthread_mutex_lock (&baton)) UNEXPECTED (13); usleep (100000); /* By the time we get here, it's clear that the second reader thread is blocked at step 12. This is the desired behaviour. */ SUCCEED (); } static void * reader2_func (void *ignored) { int err; /* Step 8 (can be before or after step 7): The second reader thread takes the baton, then waits a moment to make sure the writer thread has reached step 7. */ if (pthread_mutex_lock (&baton)) UNEXPECTED (8); usleep (100000); /* Step 9: The second reader thread requests the lock. */ err = pthread_rwlock_tryrdlock (&lock); if (err == 0) FAILURE (); else if (err != EBUSY) UNEXPECTED (9); /* Step 10: Launch a timer, to test whether the next call blocks. */ if (pthread_create (&timer, NULL, timer_func, NULL)) UNEXPECTED (10); /* Step 11: Release the baton. */ if (pthread_mutex_unlock (&baton)) UNEXPECTED (11); /* Step 12: The second reader thread requests the lock. */ err = pthread_rwlock_rdlock (&lock); if (err == 0) FAILURE (); else UNEXPECTED (12); } static void * writer_func (void *ignored) { /* Step 4: Take the baton, so that the second reader thread does not go ahead too early. */ if (pthread_mutex_lock (&baton)) UNEXPECTED (4); /* Step 5: Create the second reader thread. */ if (pthread_create (&reader2, NULL, reader2_func, NULL)) UNEXPECTED (5); /* Step 6: Release the baton. */ if (pthread_mutex_unlock (&baton)) UNEXPECTED (6); /* Step 7: The writer thread requests the lock. */ if (pthread_rwlock_wrlock (&lock)) UNEXPECTED (7); return NULL; } int main () { reader1 = pthread_self (); /* Step 1: The main thread initializes the lock and the baton. */ if (pthread_rwlock_init (&lock, NULL)) UNEXPECTED (1); if (pthread_mutex_init (&baton, NULL)) UNEXPECTED (1); /* Step 2: The main thread acquires the lock as a reader. */ if (pthread_rwlock_rdlock (&lock)) UNEXPECTED (2); /* Step 3: Create the writer thread. */ if (pthread_create (&writer, NULL, writer_func, NULL)) UNEXPECTED (3); /* Job done. Go to sleep. */ for (;;) { sleep (1); } } ]])], [gl_cv_pthread_rwlock_rdlock_prefer_writer=yes], [gl_cv_pthread_rwlock_rdlock_prefer_writer=no], [case "$host_os" in # Guess no on glibc systems. *-gnu* | gnu*) gl_cv_pthread_rwlock_rdlock_prefer_writer="guessing no" ;; # Guess no on musl systems. *-musl*) gl_cv_pthread_rwlock_rdlock_prefer_writer="guessing no" ;; # Guess no on bionic systems. *-android*) gl_cv_pthread_rwlock_rdlock_prefer_writer="guessing no" ;; # Guess yes on native Windows with the mingw-w64 winpthreads library. # Guess no on native Windows with the gnulib windows-rwlock module. mingw*) if test "$gl_use_threads" = yes || test "$gl_use_threads" = posix; then gl_cv_pthread_rwlock_rdlock_prefer_writer="guessing yes" else gl_cv_pthread_rwlock_rdlock_prefer_writer="guessing no" fi ;; # If we don't know, obey --enable-cross-guesses. *) gl_cv_pthread_rwlock_rdlock_prefer_writer="$gl_cross_guess_normal" ;; esac ]) LIBS="$save_LIBS" ]) case "$gl_cv_pthread_rwlock_rdlock_prefer_writer" in *yes) AC_DEFINE([HAVE_PTHREAD_RWLOCK_RDLOCK_PREFER_WRITER], [1], [Define if the 'pthread_rwlock_rdlock' function prefers a writer to a reader.]) ;; esac ]) pspp-1.4.1/gl/m4/memrchr.m40000644000175000017500000000125313723215637014746 0ustar00blpblp00000000000000# memrchr.m4 serial 10 dnl Copyright (C) 2002-2003, 2005-2007, 2009-2020 Free Software Foundation, dnl Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_FUNC_MEMRCHR], [ dnl Persuade glibc to declare memrchr(). AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS]) AC_REQUIRE([gl_HEADER_STRING_H_DEFAULTS]) AC_CHECK_DECLS_ONCE([memrchr]) if test $ac_cv_have_decl_memrchr = no; then HAVE_DECL_MEMRCHR=0 fi AC_CHECK_FUNCS([memrchr]) ]) # Prerequisites of lib/memrchr.c. AC_DEFUN([gl_PREREQ_MEMRCHR], [:]) pspp-1.4.1/gl/m4/pathmax.m40000644000175000017500000000215513723215637014755 0ustar00blpblp00000000000000# pathmax.m4 serial 11 dnl Copyright (C) 2002-2003, 2005-2006, 2009-2020 Free Software Foundation, dnl Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_PATHMAX], [ dnl Prerequisites of lib/pathmax.h. AC_CHECK_HEADERS_ONCE([sys/param.h]) ]) # Expands to a piece of C program that defines PATH_MAX in the same way as # "pathmax.h" will do. AC_DEFUN([gl_PATHMAX_SNIPPET], [[ /* Arrange to define PATH_MAX, like "pathmax.h" does. */ #if HAVE_UNISTD_H # include #endif #include #if defined HAVE_SYS_PARAM_H && !defined PATH_MAX && !defined MAXPATHLEN # include #endif #if !defined PATH_MAX && defined MAXPATHLEN # define PATH_MAX MAXPATHLEN #endif #ifdef __hpux # undef PATH_MAX # define PATH_MAX 1024 #endif #if defined _WIN32 && ! defined __CYGWIN__ # undef PATH_MAX # define PATH_MAX 260 #endif ]]) # Prerequisites of gl_PATHMAX_SNIPPET. AC_DEFUN([gl_PATHMAX_SNIPPET_PREREQ], [ AC_CHECK_HEADERS_ONCE([unistd.h sys/param.h]) ]) pspp-1.4.1/gl/m4/iswxdigit.m40000644000175000017500000000625013723215637015326 0ustar00blpblp00000000000000# iswxdigit.m4 serial 1 dnl Copyright (C) 2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_FUNC_ISWXDIGIT], [ AC_REQUIRE([gl_WCTYPE_H_DEFAULTS]) AC_REQUIRE([gl_WCTYPE_H]) AC_REQUIRE([gt_LOCALE_JA]) AC_REQUIRE([gt_LOCALE_FR_UTF8]) AC_REQUIRE([gt_LOCALE_ZH_CN]) if test $HAVE_ISWCNTRL = 0 || test $REPLACE_ISWCNTRL = 1; then dnl redefines iswxdigit already. REPLACE_ISWXDIGIT="$REPLACE_ISWCNTRL" else AC_CACHE_CHECK([whether iswxdigit is ISO C compliant], [gl_cv_func_iswxdigit_works], [ dnl Initial guess, used when cross-compiling or when no suitable locale dnl is present. changequote(,)dnl case "$host_os" in # Guess no on FreeBSD, NetBSD, Solaris, native Windows. freebsd* | dragonfly* | netbsd* | solaris* | mingw*) gl_cv_func_iswxdigit_works="guessing no" ;; # Guess yes otherwise. *) gl_cv_func_iswxdigit_works="guessing yes" ;; esac changequote([,])dnl if test $LOCALE_JA != none || test $LOCALE_FR_UTF8 != none || test $LOCALE_ZH_CN != none; then AC_RUN_IFELSE( [AC_LANG_SOURCE([[ #include #include #include /* Tru64 with Desktop Toolkit C has a bug: must be included before . BSD/OS 4.0.1 has a bug: , and must be included before . */ #include #include #include #include #include /* Returns the value of iswxdigit for the multibyte character s[0..n-1]. */ static int for_character (const char *s, size_t n) { mbstate_t state; wchar_t wc; size_t ret; memset (&state, '\0', sizeof (mbstate_t)); wc = (wchar_t) 0xBADFACE; ret = mbrtowc (&wc, s, n, &state); if (ret != n) abort (); return iswxdigit (wc); } int main (int argc, char *argv[]) { int is; int result = 0; if (setlocale (LC_ALL, "$LOCALE_JA") != NULL) { /* This fails on NetBSD 8.0. */ /* U+FF21 FULLWIDTH LATIN CAPITAL LETTER A */ is = for_character ("\243\301", 2); if (!(is == 0)) result |= 1; } if (setlocale (LC_ALL, "$LOCALE_FR_UTF8") != NULL) { /* This fails on FreeBSD 12. */ /* U+0663 ARABIC-INDIC DIGIT THREE */ is = for_character ("\331\243", 2); if (!(is == 0)) result |= 2; /* This fails on MSVC 14. */ /* U+FF21 FULLWIDTH LATIN CAPITAL LETTER A */ is = for_character ("\357\274\241", 3); if (!(is == 0)) result |= 4; } if (setlocale (LC_ALL, "$LOCALE_ZH_CN") != NULL) { /* This fails on Solaris 10, Solaris 11.4. */ /* U+FF11 FULLWIDTH DIGIT ONE */ is = for_character ("\243\261", 2); if (!(is == 0)) result |= 8; } return result; }]])], [gl_cv_func_iswxdigit_works=yes], [gl_cv_func_iswxdigit_works=no], [:]) fi ]) case "$gl_cv_func_iswxdigit_works" in *yes) ;; *) REPLACE_ISWXDIGIT=1 ;; esac fi ]) pspp-1.4.1/gl/m4/exponentf.m40000644000175000017500000000545613723215637015330 0ustar00blpblp00000000000000# exponentf.m4 serial 2 dnl Copyright (C) 2007-2008, 2010-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_FLOAT_EXPONENT_LOCATION], [ AC_CACHE_CHECK([where to find the exponent in a 'float'], [gl_cv_cc_float_expbit0], [ AC_RUN_IFELSE( [AC_LANG_SOURCE([[ #include #include #include #include #define NWORDS \ ((sizeof (float) + sizeof (unsigned int) - 1) / sizeof (unsigned int)) typedef union { float value; unsigned int word[NWORDS]; } memory_float; static unsigned int ored_words[NWORDS]; static unsigned int anded_words[NWORDS]; static void add_to_ored_words (float x) { memory_float m; size_t i; /* Clear it first, in case sizeof (float) < sizeof (memory_float). */ memset (&m, 0, sizeof (memory_float)); m.value = x; for (i = 0; i < NWORDS; i++) { ored_words[i] |= m.word[i]; anded_words[i] &= m.word[i]; } } int main () { size_t j; FILE *fp = fopen ("conftest.out", "w"); if (fp == NULL) return 1; for (j = 0; j < NWORDS; j++) anded_words[j] = ~ (unsigned int) 0; add_to_ored_words (0.25f); add_to_ored_words (0.5f); add_to_ored_words (1.0f); add_to_ored_words (2.0f); add_to_ored_words (4.0f); /* Remove bits that are common (e.g. if representation of the first mantissa bit is explicit). */ for (j = 0; j < NWORDS; j++) ored_words[j] &= ~anded_words[j]; /* Now find the nonzero word. */ for (j = 0; j < NWORDS; j++) if (ored_words[j] != 0) break; if (j < NWORDS) { size_t i; for (i = j + 1; i < NWORDS; i++) if (ored_words[i] != 0) { fprintf (fp, "unknown"); return (fclose (fp) != 0); } for (i = 0; ; i++) if ((ored_words[j] >> i) & 1) { fprintf (fp, "word %d bit %d", (int) j, (int) i); return (fclose (fp) != 0); } } fprintf (fp, "unknown"); return (fclose (fp) != 0); } ]])], [gl_cv_cc_float_expbit0=`cat conftest.out`], [gl_cv_cc_float_expbit0="unknown"], [gl_cv_cc_float_expbit0="word 0 bit 23"]) rm -f conftest.out ]) case "$gl_cv_cc_float_expbit0" in word*bit*) word=`echo "$gl_cv_cc_float_expbit0" | sed -e 's/word //' -e 's/ bit.*//'` bit=`echo "$gl_cv_cc_float_expbit0" | sed -e 's/word.*bit //'` AC_DEFINE_UNQUOTED([FLT_EXPBIT0_WORD], [$word], [Define as the word index where to find the exponent of 'float'.]) AC_DEFINE_UNQUOTED([FLT_EXPBIT0_BIT], [$bit], [Define as the bit index in the word where to find bit 0 of the exponent of 'float'.]) ;; esac ]) pspp-1.4.1/gl/m4/socklen.m40000644000175000017500000000615713723215637014757 0ustar00blpblp00000000000000# socklen.m4 serial 11 dnl Copyright (C) 2005-2007, 2009-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl From Albert Chin, Windows fixes from Simon Josefsson. dnl Check for socklen_t: historically on BSD it is an int, and in dnl POSIX 1g it is a type of its own, but some platforms use different dnl types for the argument to getsockopt, getpeername, etc.: dnl HP-UX 10.20, IRIX 6.5, OSF/1 4.0, Interix 3.5, BeOS. dnl So we have to test to find something that will work. AC_DEFUN([gl_TYPE_SOCKLEN_T], [AC_REQUIRE([gl_CHECK_SOCKET_HEADERS])dnl AC_CHECK_TYPE([socklen_t], , [AC_CACHE_CHECK([for socklen_t equivalent], [gl_cv_socklen_t_equiv], [# Systems have either "struct sockaddr *" or # "void *" as the second argument to getpeername gl_cv_socklen_t_equiv= for arg2 in "struct sockaddr" void; do for t in int size_t "unsigned int" "long int" "unsigned long int"; do AC_COMPILE_IFELSE([AC_LANG_PROGRAM( [[#include #include int getpeername (int, $arg2 *, $t *);]], [[$t len; getpeername (0, 0, &len);]])], [gl_cv_socklen_t_equiv="$t"]) test "$gl_cv_socklen_t_equiv" != "" && break done test "$gl_cv_socklen_t_equiv" != "" && break done if test "$gl_cv_socklen_t_equiv" = ""; then AC_MSG_ERROR([Cannot find a type to use in place of socklen_t]) fi ]) AC_DEFINE_UNQUOTED([socklen_t], [$gl_cv_socklen_t_equiv], [type to use in place of socklen_t if not defined])], [gl_SOCKET_HEADERS])]) dnl On mingw32, socklen_t is in ws2tcpip.h ('int'), so we try to find dnl it there too. But on Cygwin, wc2tcpip.h must not be included. Users dnl of this module should use the same include pattern as gl_SOCKET_HEADERS. dnl When you change this macro, keep also in sync: dnl - gl_CHECK_SOCKET_HEADERS, dnl - the Include section of modules/socklen. AC_DEFUN([gl_SOCKET_HEADERS], [ /* is not needed according to POSIX, but the in i386-unknown-freebsd4.10 and powerpc-apple-darwin5.5 required it. */ #include #if HAVE_SYS_SOCKET_H # include #elif HAVE_WS2TCPIP_H # include #endif ]) dnl Tests for the existence of the header for socket facilities. dnl Defines the C macros HAVE_SYS_SOCKET_H, HAVE_WS2TCPIP_H. dnl This macro must match gl_SOCKET_HEADERS. AC_DEFUN([gl_CHECK_SOCKET_HEADERS], [AC_CHECK_HEADERS_ONCE([sys/socket.h]) if test $ac_cv_header_sys_socket_h = no; then dnl We cannot use AC_CHECK_HEADERS_ONCE here, because that would make dnl the check for those headers unconditional; yet cygwin reports dnl that the headers are present but cannot be compiled (since on dnl cygwin, all socket information should come from sys/socket.h). AC_CHECK_HEADERS([ws2tcpip.h]) fi ]) pspp-1.4.1/gl/m4/isnanl.m40000644000175000017500000001654013723215637014602 0ustar00blpblp00000000000000# isnanl.m4 serial 22 dnl Copyright (C) 2007-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_FUNC_ISNANL], [ AC_REQUIRE([gl_MATH_H_DEFAULTS]) ISNANL_LIBM= gl_HAVE_ISNANL_NO_LIBM if test $gl_cv_func_isnanl_no_libm = no; then gl_HAVE_ISNANL_IN_LIBM if test $gl_cv_func_isnanl_in_libm = yes; then ISNANL_LIBM=-lm fi fi dnl The variable gl_func_isnanl set here is used by isnan.m4. if test $gl_cv_func_isnanl_no_libm = yes \ || test $gl_cv_func_isnanl_in_libm = yes; then save_LIBS="$LIBS" LIBS="$LIBS $ISNANL_LIBM" gl_FUNC_ISNANL_WORKS LIBS="$save_LIBS" case "$gl_cv_func_isnanl_works" in *yes) gl_func_isnanl=yes ;; *) gl_func_isnanl=no; ISNANL_LIBM= ;; esac else gl_func_isnanl=no fi if test $gl_func_isnanl != yes; then HAVE_ISNANL=0 fi AC_SUBST([ISNANL_LIBM]) ]) AC_DEFUN([gl_FUNC_ISNANL_NO_LIBM], [ gl_HAVE_ISNANL_NO_LIBM gl_func_isnanl_no_libm=$gl_cv_func_isnanl_no_libm if test $gl_func_isnanl_no_libm = yes; then gl_FUNC_ISNANL_WORKS case "$gl_cv_func_isnanl_works" in *yes) ;; *) gl_func_isnanl_no_libm=no ;; esac fi if test $gl_func_isnanl_no_libm = yes; then AC_DEFINE([HAVE_ISNANL_IN_LIBC], [1], [Define if the isnan(long double) function is available in libc.]) fi ]) dnl Prerequisites of replacement isnanl definition. It does not need -lm. AC_DEFUN([gl_PREREQ_ISNANL], [ gl_LONG_DOUBLE_EXPONENT_LOCATION AC_REQUIRE([gl_LONG_DOUBLE_VS_DOUBLE]) ]) dnl Test whether isnanl() can be used without libm. AC_DEFUN([gl_HAVE_ISNANL_NO_LIBM], [ AC_CACHE_CHECK([whether isnan(long double) can be used without linking with libm], [gl_cv_func_isnanl_no_libm], [ AC_LINK_IFELSE( [AC_LANG_PROGRAM( [[#include #if (__GNUC__ >= 4) || (__clang_major__ >= 4) # undef isnanl # define isnanl(x) __builtin_isnan ((long double)(x)) #elif defined isnan # undef isnanl # define isnanl(x) isnan ((long double)(x)) #endif long double x;]], [[return isnanl (x);]])], [gl_cv_func_isnanl_no_libm=yes], [gl_cv_func_isnanl_no_libm=no]) ]) ]) dnl Test whether isnanl() can be used with libm. AC_DEFUN([gl_HAVE_ISNANL_IN_LIBM], [ AC_CACHE_CHECK([whether isnan(long double) can be used with libm], [gl_cv_func_isnanl_in_libm], [ save_LIBS="$LIBS" LIBS="$LIBS -lm" AC_LINK_IFELSE( [AC_LANG_PROGRAM( [[#include #if (__GNUC__ >= 4) || (__clang_major__ >= 4) # undef isnanl # define isnanl(x) __builtin_isnan ((long double)(x)) #elif defined isnan # undef isnanl # define isnanl(x) isnan ((long double)(x)) #endif long double x;]], [[return isnanl (x);]])], [gl_cv_func_isnanl_in_libm=yes], [gl_cv_func_isnanl_in_libm=no]) LIBS="$save_LIBS" ]) ]) dnl Test whether isnanl() recognizes all canonical numbers which are neither dnl finite nor infinite. AC_DEFUN([gl_FUNC_ISNANL_WORKS], [ AC_REQUIRE([AC_PROG_CC]) AC_REQUIRE([gl_BIGENDIAN]) AC_REQUIRE([gl_LONG_DOUBLE_VS_DOUBLE]) AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles AC_CACHE_CHECK([whether isnanl works], [gl_cv_func_isnanl_works], [ AC_RUN_IFELSE( [AC_LANG_SOURCE([[ #include #include #include #if (__GNUC__ >= 4) || (__clang_major__ >= 4) # undef isnanl # define isnanl(x) __builtin_isnan ((long double)(x)) #elif defined isnan # undef isnanl # define isnanl(x) isnan ((long double)(x)) #endif #define NWORDS \ ((sizeof (long double) + sizeof (unsigned int) - 1) / sizeof (unsigned int)) typedef union { unsigned int word[NWORDS]; long double value; } memory_long_double; /* On Irix 6.5, gcc 3.4.3 can't compute compile-time NaN, and needs the runtime type conversion. */ #ifdef __sgi static long double NaNl () { double zero = 0.0; return zero / zero; } #else # define NaNl() (0.0L / 0.0L) #endif int main () { int result = 0; if (!isnanl (NaNl ())) result |= 1; { memory_long_double m; unsigned int i; /* The isnanl function should be immune against changes in the sign bit and in the mantissa bits. The xor operation twiddles a bit that can only be a sign bit or a mantissa bit (since the exponent never extends to bit 31). */ m.value = NaNl (); m.word[NWORDS / 2] ^= (unsigned int) 1 << (sizeof (unsigned int) * CHAR_BIT - 1); for (i = 0; i < NWORDS; i++) m.word[i] |= 1; if (!isnanl (m.value)) result |= 1; } #if ((defined __ia64 && LDBL_MANT_DIG == 64) || (defined __x86_64__ || defined __amd64__) || (defined __i386 || defined __i386__ || defined _I386 || defined _M_IX86 || defined _X86_)) && !HAVE_SAME_LONG_DOUBLE_AS_DOUBLE /* Representation of an 80-bit 'long double' as an initializer for a sequence of 'unsigned int' words. */ # ifdef WORDS_BIGENDIAN # define LDBL80_WORDS(exponent,manthi,mantlo) \ { ((unsigned int) (exponent) << 16) | ((unsigned int) (manthi) >> 16), \ ((unsigned int) (manthi) << 16) | ((unsigned int) (mantlo) >> 16), \ (unsigned int) (mantlo) << 16 \ } # else # define LDBL80_WORDS(exponent,manthi,mantlo) \ { mantlo, manthi, exponent } # endif { /* Quiet NaN. */ static memory_long_double x = { LDBL80_WORDS (0xFFFF, 0xC3333333, 0x00000000) }; if (!isnanl (x.value)) result |= 2; } { /* Signalling NaN. */ static memory_long_double x = { LDBL80_WORDS (0xFFFF, 0x83333333, 0x00000000) }; if (!isnanl (x.value)) result |= 2; } /* isnanl should return something even for noncanonical values. */ { /* Pseudo-NaN. */ static memory_long_double x = { LDBL80_WORDS (0xFFFF, 0x40000001, 0x00000000) }; if (isnanl (x.value) && !isnanl (x.value)) result |= 4; } { /* Pseudo-Infinity. */ static memory_long_double x = { LDBL80_WORDS (0xFFFF, 0x00000000, 0x00000000) }; if (isnanl (x.value) && !isnanl (x.value)) result |= 8; } { /* Pseudo-Zero. */ static memory_long_double x = { LDBL80_WORDS (0x4004, 0x00000000, 0x00000000) }; if (isnanl (x.value) && !isnanl (x.value)) result |= 16; } { /* Unnormalized number. */ static memory_long_double x = { LDBL80_WORDS (0x4000, 0x63333333, 0x00000000) }; if (isnanl (x.value) && !isnanl (x.value)) result |= 32; } { /* Pseudo-Denormal. */ static memory_long_double x = { LDBL80_WORDS (0x0000, 0x83333333, 0x00000000) }; if (isnanl (x.value) && !isnanl (x.value)) result |= 64; } #endif return result; }]])], [gl_cv_func_isnanl_works=yes], [gl_cv_func_isnanl_works=no], [case "$host_os" in mingw*) # Guess yes on mingw, no on MSVC. AC_EGREP_CPP([Known], [ #ifdef __MINGW32__ Known #endif ], [gl_cv_func_isnanl_works="guessing yes"], [gl_cv_func_isnanl_works="guessing no"]) ;; *) gl_cv_func_isnanl_works="guessing yes" ;; esac ]) ]) ]) pspp-1.4.1/gl/m4/open.m40000644000175000017500000000276513723215637014263 0ustar00blpblp00000000000000# open.m4 serial 15 dnl Copyright (C) 2007-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_FUNC_OPEN], [ AC_REQUIRE([AC_CANONICAL_HOST]) AC_REQUIRE([gl_PREPROC_O_CLOEXEC]) case "$host_os" in mingw* | pw*) REPLACE_OPEN=1 ;; *) dnl open("foo/") should not create a file when the file name has a dnl trailing slash. FreeBSD only has the problem on symlinks. AC_CHECK_FUNCS_ONCE([lstat]) if test "$gl_cv_macro_O_CLOEXEC" != yes; then REPLACE_OPEN=1 fi gl_OPEN_TRAILING_SLASH_BUG case "$gl_cv_func_open_slash" in *no) REPLACE_OPEN=1 ;; esac ;; esac dnl Replace open() for supporting the gnulib-defined fchdir() function, dnl to keep fchdir's bookkeeping up-to-date. m4_ifdef([gl_FUNC_FCHDIR], [ if test $REPLACE_OPEN = 0; then gl_TEST_FCHDIR if test $HAVE_FCHDIR = 0; then REPLACE_OPEN=1 fi fi ]) dnl Replace open() for supporting the gnulib-defined O_NONBLOCK flag. m4_ifdef([gl_NONBLOCKING_IO], [ if test $REPLACE_OPEN = 0; then gl_NONBLOCKING_IO if test $gl_cv_have_open_O_NONBLOCK != yes; then REPLACE_OPEN=1 fi fi ]) ]) # Prerequisites of lib/open.c. AC_DEFUN([gl_PREREQ_OPEN], [ AC_REQUIRE([gl_PROMOTED_TYPE_MODE_T]) : ]) pspp-1.4.1/gl/m4/stpcpy.m40000644000175000017500000000131613723215637014633 0ustar00blpblp00000000000000# stpcpy.m4 serial 8 dnl Copyright (C) 2002, 2007, 2009-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_FUNC_STPCPY], [ dnl Persuade glibc to declare stpcpy(). AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS]) dnl The stpcpy() declaration in lib/string.in.h uses 'restrict'. AC_REQUIRE([AC_C_RESTRICT]) AC_REQUIRE([gl_HEADER_STRING_H_DEFAULTS]) AC_CHECK_FUNCS([stpcpy]) if test $ac_cv_func_stpcpy = no; then HAVE_STPCPY=0 fi ]) # Prerequisites of lib/stpcpy.c. AC_DEFUN([gl_PREREQ_STPCPY], [ : ]) pspp-1.4.1/gl/m4/printf-frexp.m40000644000175000017500000000226613723215637015742 0ustar00blpblp00000000000000# printf-frexp.m4 serial 5 dnl Copyright (C) 2007, 2009-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl Check how to define printf_frexp() without linking with libm. AC_DEFUN([gl_FUNC_PRINTF_FREXP], [ AC_REQUIRE([gl_CHECK_FREXP_NO_LIBM]) if test $gl_cv_func_frexp_no_libm = yes; then gl_FUNC_FREXP_WORKS case "$gl_cv_func_frexp_works" in *yes) AC_DEFINE([HAVE_FREXP_IN_LIBC], [1], [Define if the frexp function is available in libc.]) ;; esac fi AC_CACHE_CHECK([whether ldexp can be used without linking with libm], [gl_cv_func_ldexp_no_libm], [ AC_LINK_IFELSE( [AC_LANG_PROGRAM( [[#include double x; int y;]], [[return ldexp (x, y) < 1;]])], [gl_cv_func_ldexp_no_libm=yes], [gl_cv_func_ldexp_no_libm=no]) ]) if test $gl_cv_func_ldexp_no_libm = yes; then AC_DEFINE([HAVE_LDEXP_IN_LIBC], [1], [Define if the ldexp function is available in libc.]) fi ]) pspp-1.4.1/gl/m4/iswdigit.m40000644000175000017500000000671513723215637015144 0ustar00blpblp00000000000000# iswdigit.m4 serial 1 dnl Copyright (C) 2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_FUNC_ISWDIGIT], [ AC_REQUIRE([gl_WCTYPE_H_DEFAULTS]) AC_REQUIRE([gl_WCTYPE_H]) AC_REQUIRE([gt_LOCALE_FR]) AC_REQUIRE([gt_LOCALE_JA]) AC_REQUIRE([gt_LOCALE_FR_UTF8]) AC_REQUIRE([gt_LOCALE_ZH_CN]) if test $HAVE_ISWCNTRL = 0 || test $REPLACE_ISWCNTRL = 1; then dnl redefines iswdigit already. REPLACE_ISWDIGIT="$REPLACE_ISWCNTRL" else AC_CACHE_CHECK([whether iswdigit is ISO C compliant], [gl_cv_func_iswdigit_works], [ dnl Initial guess, used when cross-compiling or when no suitable locale dnl is present. changequote(,)dnl case "$host_os" in # Guess no on FreeBSD, NetBSD, Solaris, native Windows. freebsd* | dragonfly* | netbsd* | solaris* | mingw*) gl_cv_func_iswdigit_works="guessing no" ;; # Guess yes otherwise. *) gl_cv_func_iswdigit_works="guessing yes" ;; esac changequote([,])dnl if test $LOCALE_FR != none || test $LOCALE_JA != none || test $LOCALE_FR_UTF8 != none || test $LOCALE_ZH_CN != none; then AC_RUN_IFELSE( [AC_LANG_SOURCE([[ #include #include #include /* Tru64 with Desktop Toolkit C has a bug: must be included before . BSD/OS 4.0.1 has a bug: , and must be included before . */ #include #include #include #include #include /* Returns the value of iswdigit for the multibyte character s[0..n-1]. */ static int for_character (const char *s, size_t n) { mbstate_t state; wchar_t wc; size_t ret; memset (&state, '\0', sizeof (mbstate_t)); wc = (wchar_t) 0xBADFACE; ret = mbrtowc (&wc, s, n, &state); if (ret != n) abort (); return iswdigit (wc); } int main (int argc, char *argv[]) { int is; int result = 0; if (setlocale (LC_ALL, "$LOCALE_FR") != NULL) { /* This fails on mingw, MSVC 14. */ /* U+00B2 SUPERSCRIPT TWO */ is = for_character ("\262", 1); if (!(is == 0)) result |= 1; } if (setlocale (LC_ALL, "$LOCALE_JA") != NULL) { /* This fails on NetBSD 8.0. */ /* U+FF11 FULLWIDTH DIGIT ONE */ is = for_character ("\243\261", 2); if (!(is == 0)) result |= 2; } if (setlocale (LC_ALL, "$LOCALE_FR_UTF8") != NULL) { /* This fails on FreeBSD 12, NetBSD 8.0, MSVC 14. */ /* U+0663 ARABIC-INDIC DIGIT THREE */ is = for_character ("\331\243", 2); if (!(is == 0)) result |= 4; /* This fails on FreeBSD 12, NetBSD 8.0, MSVC 14. */ /* U+FF11 FULLWIDTH DIGIT ONE */ is = for_character ("\357\274\221", 3); if (!(is == 0)) result |= 8; } if (setlocale (LC_ALL, "$LOCALE_ZH_CN") != NULL) { /* This fails on NetBSD 8.0, Solaris 10, Solaris 11.4. */ /* U+FF11 FULLWIDTH DIGIT ONE */ is = for_character ("\243\261", 2); if (!(is == 0)) result |= 16; } return result; }]])], [gl_cv_func_iswdigit_works=yes], [gl_cv_func_iswdigit_works=no], [:]) fi ]) case "$gl_cv_func_iswdigit_works" in *yes) ;; *) REPLACE_ISWDIGIT=1 ;; esac fi ]) pspp-1.4.1/gl/m4/alloca.m40000644000175000017500000000736013723215637014551 0ustar00blpblp00000000000000# alloca.m4 serial 17 dnl Copyright (C) 2002-2004, 2006-2007, 2009-2020 Free Software Foundation, dnl Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_FUNC_ALLOCA], [ AC_REQUIRE([AC_FUNC_ALLOCA]) if test $ac_cv_func_alloca_works = no; then gl_PREREQ_ALLOCA fi # Define an additional variable used in the Makefile substitution. if test $ac_cv_working_alloca_h = yes; then AC_CACHE_CHECK([for alloca as a compiler built-in], [gl_cv_rpl_alloca], [ AC_EGREP_CPP([Need own alloca], [ #if defined __GNUC__ || defined _AIX || defined _MSC_VER Need own alloca #endif ], [gl_cv_rpl_alloca=yes], [gl_cv_rpl_alloca=no]) ]) if test $gl_cv_rpl_alloca = yes; then dnl OK, alloca can be implemented through a compiler built-in. AC_DEFINE([HAVE_ALLOCA], [1], [Define to 1 if you have 'alloca' after including , a header that may be supplied by this distribution.]) ALLOCA_H=alloca.h else dnl alloca exists as a library function, i.e. it is slow and probably dnl a memory leak. Don't define HAVE_ALLOCA in this case. ALLOCA_H= fi else ALLOCA_H=alloca.h fi AC_SUBST([ALLOCA_H]) AM_CONDITIONAL([GL_GENERATE_ALLOCA_H], [test -n "$ALLOCA_H"]) if test $ac_cv_working_alloca_h = yes; then HAVE_ALLOCA_H=1 else HAVE_ALLOCA_H=0 fi AC_SUBST([HAVE_ALLOCA_H]) ]) # Prerequisites of lib/alloca.c. # STACK_DIRECTION is already handled by AC_FUNC_ALLOCA. AC_DEFUN([gl_PREREQ_ALLOCA], [:]) m4_version_prereq([2.70], [], [ # This works around a bug in autoconf <= 2.68 and has simplifications # from 2.70. See: # https://lists.gnu.org/r/bug-gnulib/2011-06/msg00277.html # https://git.savannah.gnu.org/cgit/autoconf.git/commit/?id=6cd9f12520b0d6f76d3230d7565feba1ecf29497 # https://git.savannah.gnu.org/cgit/autoconf.git/commit/?id=15edf7fd8094fd14a89d9891dd72a9624762597a # _AC_LIBOBJ_ALLOCA # ----------------- # Set up the LIBOBJ replacement of 'alloca'. Well, not exactly # AC_LIBOBJ since we actually set the output variable 'ALLOCA'. # Nevertheless, for Automake, AC_LIBSOURCES it. m4_define([_AC_LIBOBJ_ALLOCA], [# The SVR3 libPW and SVR4 libucb both contain incompatible functions # that cause trouble. Some versions do not even contain alloca or # contain a buggy version. If you still want to use their alloca, # use ar to extract alloca.o from them instead of compiling alloca.c. AC_LIBSOURCES(alloca.c) AC_SUBST([ALLOCA], [\${LIBOBJDIR}alloca.$ac_objext])dnl AC_DEFINE(C_ALLOCA, 1, [Define to 1 if using 'alloca.c'.]) AC_CACHE_CHECK([stack direction for C alloca], [ac_cv_c_stack_direction], [AC_RUN_IFELSE([AC_LANG_SOURCE( [AC_INCLUDES_DEFAULT int find_stack_direction (int *addr, int depth) { int dir, dummy = 0; if (! addr) addr = &dummy; *addr = addr < &dummy ? 1 : addr == &dummy ? 0 : -1; dir = depth ? find_stack_direction (addr, depth - 1) : 0; return dir + dummy; } int main (int argc, char **argv) { return find_stack_direction (0, argc + !argv + 20) < 0; }])], [ac_cv_c_stack_direction=1], [ac_cv_c_stack_direction=-1], [ac_cv_c_stack_direction=0])]) AH_VERBATIM([STACK_DIRECTION], [/* If using the C implementation of alloca, define if you know the direction of stack growth for your system; otherwise it will be automatically deduced at runtime. STACK_DIRECTION > 0 => grows toward higher addresses STACK_DIRECTION < 0 => grows toward lower addresses STACK_DIRECTION = 0 => direction of growth unknown */ @%:@undef STACK_DIRECTION])dnl AC_DEFINE_UNQUOTED(STACK_DIRECTION, $ac_cv_c_stack_direction) ]) ]) pspp-1.4.1/gl/m4/getdelim.m40000644000175000017500000000543413723215637015110 0ustar00blpblp00000000000000# getdelim.m4 serial 15 dnl Copyright (C) 2005-2007, 2009-2020 Free Software Foundation, Inc. dnl dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_PREREQ([2.59]) AC_DEFUN([gl_FUNC_GETDELIM], [ AC_REQUIRE([gl_STDIO_H_DEFAULTS]) AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles dnl Persuade glibc to declare getdelim(). AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS]) AC_CHECK_DECLS_ONCE([getdelim]) AC_CHECK_FUNCS_ONCE([getdelim]) if test $ac_cv_func_getdelim = yes; then HAVE_GETDELIM=1 dnl Found it in some library. Verify that it works. AC_CACHE_CHECK([for working getdelim function], [gl_cv_func_working_getdelim], [echo fooNbarN | tr -d '\012' | tr N '\012' > conftest.data AC_RUN_IFELSE([AC_LANG_SOURCE([[ # include # include # include int main () { FILE *in = fopen ("./conftest.data", "r"); if (!in) return 1; { /* Test result for a NULL buffer and a zero size. Based on a test program from Karl Heuer. */ char *line = NULL; size_t siz = 0; int len = getdelim (&line, &siz, '\n', in); if (!(len == 4 && line && strcmp (line, "foo\n") == 0)) { free (line); fclose (in); return 2; } free (line); } { /* Test result for a NULL buffer and a non-zero size. This crashes on FreeBSD 8.0. */ char *line = NULL; size_t siz = (size_t)(~0) / 4; if (getdelim (&line, &siz, '\n', in) == -1) { fclose (in); return 3; } free (line); } fclose (in); return 0; } ]])], [gl_cv_func_working_getdelim=yes], [gl_cv_func_working_getdelim=no], [dnl We're cross compiling. dnl Guess it works on glibc2 systems and musl systems. AC_EGREP_CPP([Lucky GNU user], [ #include #ifdef __GNU_LIBRARY__ #if (__GLIBC__ >= 2) && !defined __UCLIBC__ Lucky GNU user #endif #endif ], [gl_cv_func_working_getdelim="guessing yes"], [case "$host_os" in *-musl*) gl_cv_func_working_getdelim="guessing yes" ;; *) gl_cv_func_working_getdelim="$gl_cross_guess_normal" ;; esac ]) ]) ]) case "$gl_cv_func_working_getdelim" in *yes) ;; *) REPLACE_GETDELIM=1 ;; esac else HAVE_GETDELIM=0 fi if test $ac_cv_have_decl_getdelim = no; then HAVE_DECL_GETDELIM=0 fi ]) # Prerequisites of lib/getdelim.c. AC_DEFUN([gl_PREREQ_GETDELIM], [ AC_CHECK_FUNCS([flockfile funlockfile]) AC_CHECK_DECLS([getc_unlocked]) ]) pspp-1.4.1/gl/m4/environ.m40000644000175000017500000000254513723215637014776 0ustar00blpblp00000000000000# environ.m4 serial 7 dnl Copyright (C) 2001-2004, 2006-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN_ONCE([gl_ENVIRON], [ AC_REQUIRE([gl_UNISTD_H_DEFAULTS]) dnl Persuade glibc to declare environ. AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS]) AC_CHECK_HEADERS_ONCE([unistd.h]) gt_CHECK_VAR_DECL( [#if HAVE_UNISTD_H #include #endif /* mingw, BeOS, Haiku declare environ in , not in . */ #include ], [environ]) if test $gt_cv_var_environ_declaration != yes; then HAVE_DECL_ENVIRON=0 fi ]) # Check if a variable is properly declared. # gt_CHECK_VAR_DECL(includes,variable) AC_DEFUN([gt_CHECK_VAR_DECL], [ define([gt_cv_var], [gt_cv_var_]$2[_declaration]) AC_CACHE_CHECK([if $2 is properly declared], [gt_cv_var], [AC_COMPILE_IFELSE( [AC_LANG_PROGRAM( [[$1 extern struct { int foo; } $2;]], [[$2.foo = 1;]])], [gt_cv_var=no], [gt_cv_var=yes])]) if test $gt_cv_var = yes; then AC_DEFINE([HAVE_]m4_translit($2, [a-z], [A-Z])[_DECL], 1, [Define if you have the declaration of $2.]) fi undefine([gt_cv_var]) ]) pspp-1.4.1/gl/m4/sigaction.m40000644000175000017500000000232513723215637015272 0ustar00blpblp00000000000000# sigaction.m4 serial 7 dnl Copyright (C) 2008-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. # Determine if sigaction interface is present. AC_DEFUN([gl_SIGACTION], [ AC_REQUIRE([gl_SIGNAL_H_DEFAULTS]) AC_CHECK_FUNCS_ONCE([sigaction]) if test $ac_cv_func_sigaction = yes; then AC_CHECK_MEMBERS([struct sigaction.sa_sigaction], , , [[#include ]]) if test $ac_cv_member_struct_sigaction_sa_sigaction = no; then HAVE_STRUCT_SIGACTION_SA_SIGACTION=0 fi else HAVE_SIGACTION=0 fi ]) # Prerequisites of the part of lib/signal.in.h and of lib/sigaction.c. AC_DEFUN([gl_PREREQ_SIGACTION], [ AC_REQUIRE([gl_SIGNAL_H_DEFAULTS]) AC_REQUIRE([AC_C_RESTRICT]) AC_REQUIRE([AC_TYPE_UID_T]) AC_REQUIRE([gl_PREREQ_SIG_HANDLER_H]) AC_CHECK_FUNCS_ONCE([sigaltstack siginterrupt]) AC_CHECK_TYPES([siginfo_t], [], [], [[ #include ]]) if test $ac_cv_type_siginfo_t = no; then HAVE_SIGINFO_T=0 fi ]) # Prerequisites of lib/sig-handler.h. AC_DEFUN([gl_PREREQ_SIG_HANDLER_H], [:]) pspp-1.4.1/gl/m4/inline.m40000644000175000017500000000315413723215637014571 0ustar00blpblp00000000000000# inline.m4 serial 4 dnl Copyright (C) 2006, 2009-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl Test for the 'inline' keyword or equivalent. dnl Define 'inline' to a supported equivalent, or to nothing if not supported, dnl like AC_C_INLINE does. Also, define HAVE_INLINE if 'inline' or an dnl equivalent is effectively supported, i.e. if the compiler is likely to dnl drop unused 'static inline' functions. AC_DEFUN([gl_INLINE], [ AC_REQUIRE([AC_C_INLINE]) AC_CACHE_CHECK([whether the compiler generally respects inline], [gl_cv_c_inline_effective], [if test $ac_cv_c_inline = no; then gl_cv_c_inline_effective=no else dnl GCC defines __NO_INLINE__ if not optimizing or if -fno-inline is dnl specified. dnl Use AC_COMPILE_IFELSE here, not AC_EGREP_CPP, because the result dnl depends on optimization flags, which can be in CFLAGS. dnl (AC_EGREP_CPP looks only at the CPPFLAGS.) AC_COMPILE_IFELSE( [AC_LANG_PROGRAM([[]], [[#ifdef __NO_INLINE__ #error "inline is not effective" #endif]])], [gl_cv_c_inline_effective=yes], [gl_cv_c_inline_effective=no]) fi ]) if test $gl_cv_c_inline_effective = yes; then AC_DEFINE([HAVE_INLINE], [1], [Define to 1 if the compiler supports one of the keywords 'inline', '__inline__', '__inline' and effectively inlines functions marked as such.]) fi ]) pspp-1.4.1/gl/m4/visibility.m40000644000175000017500000000630113723215637015477 0ustar00blpblp00000000000000# visibility.m4 serial 6 dnl Copyright (C) 2005, 2008, 2010-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl From Bruno Haible. dnl Tests whether the compiler supports the command-line option dnl -fvisibility=hidden and the function and variable attributes dnl __attribute__((__visibility__("hidden"))) and dnl __attribute__((__visibility__("default"))). dnl Does *not* test for __visibility__("protected") - which has tricky dnl semantics (see the 'vismain' test in glibc) and does not exist e.g. on dnl Mac OS X. dnl Does *not* test for __visibility__("internal") - which has processor dnl dependent semantics. dnl Does *not* test for #pragma GCC visibility push(hidden) - which is dnl "really only recommended for legacy code". dnl Set the variable CFLAG_VISIBILITY. dnl Defines and sets the variable HAVE_VISIBILITY. AC_DEFUN([gl_VISIBILITY], [ AC_REQUIRE([AC_PROG_CC]) CFLAG_VISIBILITY= HAVE_VISIBILITY=0 if test -n "$GCC"; then dnl First, check whether -Werror can be added to the command line, or dnl whether it leads to an error because of some other option that the dnl user has put into $CC $CFLAGS $CPPFLAGS. AC_CACHE_CHECK([whether the -Werror option is usable], [gl_cv_cc_vis_werror], [gl_save_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -Werror" AC_COMPILE_IFELSE( [AC_LANG_PROGRAM([[]], [[]])], [gl_cv_cc_vis_werror=yes], [gl_cv_cc_vis_werror=no]) CFLAGS="$gl_save_CFLAGS" ]) dnl Now check whether visibility declarations are supported. AC_CACHE_CHECK([for simple visibility declarations], [gl_cv_cc_visibility], [gl_save_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -fvisibility=hidden" dnl We use the option -Werror and a function dummyfunc, because on some dnl platforms (Cygwin 1.7) the use of -fvisibility triggers a warning dnl "visibility attribute not supported in this configuration; ignored" dnl at the first function definition in every compilation unit, and we dnl don't want to use the option in this case. if test $gl_cv_cc_vis_werror = yes; then CFLAGS="$CFLAGS -Werror" fi AC_COMPILE_IFELSE( [AC_LANG_PROGRAM( [[extern __attribute__((__visibility__("hidden"))) int hiddenvar; extern __attribute__((__visibility__("default"))) int exportedvar; extern __attribute__((__visibility__("hidden"))) int hiddenfunc (void); extern __attribute__((__visibility__("default"))) int exportedfunc (void); void dummyfunc (void) {} ]], [[]])], [gl_cv_cc_visibility=yes], [gl_cv_cc_visibility=no]) CFLAGS="$gl_save_CFLAGS" ]) if test $gl_cv_cc_visibility = yes; then CFLAG_VISIBILITY="-fvisibility=hidden" HAVE_VISIBILITY=1 fi fi AC_SUBST([CFLAG_VISIBILITY]) AC_SUBST([HAVE_VISIBILITY]) AC_DEFINE_UNQUOTED([HAVE_VISIBILITY], [$HAVE_VISIBILITY], [Define to 1 or 0, depending whether the compiler supports simple visibility declarations.]) ]) pspp-1.4.1/gl/m4/minmax.m40000644000175000017500000000245513723215637014607 0ustar00blpblp00000000000000# minmax.m4 serial 4 dnl Copyright (C) 2005, 2009-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_PREREQ([2.53]) AC_DEFUN([gl_MINMAX], [ AC_REQUIRE([gl_PREREQ_MINMAX]) ]) # Prerequisites of lib/minmax.h. AC_DEFUN([gl_PREREQ_MINMAX], [ gl_MINMAX_IN_HEADER([limits.h]) gl_MINMAX_IN_HEADER([sys/param.h]) ]) dnl gl_MINMAX_IN_HEADER(HEADER) dnl The parameter has to be a literal header name; it cannot be macro, dnl nor a shell variable. (Because autoheader collects only AC_DEFINE dnl invocations with a literal macro name.) AC_DEFUN([gl_MINMAX_IN_HEADER], [ m4_pushdef([header], AS_TR_SH([$1])) m4_pushdef([HEADER], AS_TR_CPP([$1])) AC_CACHE_CHECK([whether <$1> defines MIN and MAX], [gl_cv_minmax_in_]header, [AC_COMPILE_IFELSE( [AC_LANG_PROGRAM( [[#include <$1> int x = MIN (42, 17);]], [[]])], [gl_cv_minmax_in_]header[=yes], [gl_cv_minmax_in_]header[=no])]) if test $gl_cv_minmax_in_[]header = yes; then AC_DEFINE([HAVE_MINMAX_IN_]HEADER, 1, [Define to 1 if <$1> defines the MIN and MAX macros.]) fi m4_popdef([HEADER]) m4_popdef([header]) ]) pspp-1.4.1/gl/m4/termios_h.m40000644000175000017500000000271413723215637015305 0ustar00blpblp00000000000000# termios_h.m4 serial 4 dnl Copyright (C) 2010-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_TERMIOS_H], [ dnl Use AC_REQUIRE here, so that the default behavior below is expanded dnl once only, before all statements that occur in other macros. AC_REQUIRE([gl_TERMIOS_H_DEFAULTS]) gl_CHECK_NEXT_HEADERS([termios.h]) if test $ac_cv_header_termios_h != yes; then HAVE_TERMIOS_H=0 fi dnl Ensure the type pid_t gets defined. AC_REQUIRE([AC_TYPE_PID_T]) dnl Check for declarations of anything we want to poison if the dnl corresponding gnulib module is not in use, and which is not dnl guaranteed by C89. gl_WARN_ON_USE_PREPARE([[#include ]], [tcgetsid]) ]) AC_DEFUN([gl_TERMIOS_MODULE_INDICATOR], [ dnl Use AC_REQUIRE here, so that the default settings are expanded once only. AC_REQUIRE([gl_TERMIOS_H_DEFAULTS]) gl_MODULE_INDICATOR_SET_VARIABLE([$1]) dnl Define it also as a C macro, for the benefit of the unit tests. gl_MODULE_INDICATOR_FOR_TESTS([$1]) ]) AC_DEFUN([gl_TERMIOS_H_DEFAULTS], [ GNULIB_TCGETSID=0; AC_SUBST([GNULIB_TCGETSID]) dnl Assume proper GNU behavior unless another module says otherwise. HAVE_DECL_TCGETSID=1; AC_SUBST([HAVE_DECL_TCGETSID]) HAVE_TERMIOS_H=1; AC_SUBST([HAVE_TERMIOS_H]) ]) pspp-1.4.1/gl/m4/snprintf.m40000644000175000017500000000356713723215637015166 0ustar00blpblp00000000000000# snprintf.m4 serial 7 dnl Copyright (C) 2002-2004, 2007-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl Libintl 0.17 will replace snprintf only if it does not support %1$s, dnl but defers to any gnulib snprintf replacements. Therefore, gnulib dnl must guarantee that the decision for replacing snprintf is a superset dnl of the reasons checked by libintl. AC_DEFUN([gl_FUNC_SNPRINTF], [ AC_REQUIRE([gl_STDIO_H_DEFAULTS]) gl_cv_func_snprintf_usable=no AC_CHECK_FUNCS([snprintf]) if test $ac_cv_func_snprintf = yes; then gl_SNPRINTF_SIZE1 case "$gl_cv_func_snprintf_size1" in *yes) gl_SNPRINTF_RETVAL_C99 case "$gl_cv_func_snprintf_retval_c99" in *yes) gl_PRINTF_POSITIONS case "$gl_cv_func_printf_positions" in *yes) gl_cv_func_snprintf_usable=yes ;; esac ;; esac ;; esac fi if test $gl_cv_func_snprintf_usable = no; then gl_REPLACE_SNPRINTF fi AC_CHECK_DECLS_ONCE([snprintf]) if test $ac_cv_have_decl_snprintf = no; then HAVE_DECL_SNPRINTF=0 fi ]) AC_DEFUN([gl_REPLACE_SNPRINTF], [ AC_REQUIRE([gl_STDIO_H_DEFAULTS]) AC_LIBOBJ([snprintf]) if test $ac_cv_func_snprintf = yes; then REPLACE_SNPRINTF=1 else AC_CHECK_DECLS_ONCE([snprintf]) if test $ac_cv_have_decl_snprintf = yes; then dnl If the function is declared but does not appear to exist, it may be dnl defined as an inline function. In order to avoid a conflict, we have dnl to define rpl_snprintf, not snprintf. REPLACE_SNPRINTF=1 fi fi gl_PREREQ_SNPRINTF ]) # Prerequisites of lib/snprintf.c. AC_DEFUN([gl_PREREQ_SNPRINTF], [:]) pspp-1.4.1/gl/m4/extensions.m40000644000175000017500000001572713723215637015523 0ustar00blpblp00000000000000# serial 18 -*- Autoconf -*- # Enable extensions on systems that normally disable them. # Copyright (C) 2003, 2006-2020 Free Software Foundation, Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This definition of AC_USE_SYSTEM_EXTENSIONS is stolen from git # Autoconf. Perhaps we can remove this once we can assume Autoconf # 2.70 or later everywhere, but since Autoconf mutates rapidly # enough in this area it's likely we'll need to redefine # AC_USE_SYSTEM_EXTENSIONS for quite some time. # If autoconf reports a warning # warning: AC_COMPILE_IFELSE was called before AC_USE_SYSTEM_EXTENSIONS # or warning: AC_RUN_IFELSE was called before AC_USE_SYSTEM_EXTENSIONS # the fix is # 1) to ensure that AC_USE_SYSTEM_EXTENSIONS is never directly invoked # but always AC_REQUIREd, # 2) to ensure that for each occurrence of # AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS]) # or # AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS]) # the corresponding gnulib module description has 'extensions' among # its dependencies. This will ensure that the gl_USE_SYSTEM_EXTENSIONS # invocation occurs in gl_EARLY, not in gl_INIT. # AC_USE_SYSTEM_EXTENSIONS # ------------------------ # Enable extensions on systems that normally disable them, # typically due to standards-conformance issues. # # Remember that #undef in AH_VERBATIM gets replaced with #define by # AC_DEFINE. The goal here is to define all known feature-enabling # macros, then, if reports of conflicts are made, disable macros that # cause problems on some platforms (such as __EXTENSIONS__). AC_DEFUN_ONCE([AC_USE_SYSTEM_EXTENSIONS], [AC_BEFORE([$0], [AC_COMPILE_IFELSE])dnl AC_BEFORE([$0], [AC_RUN_IFELSE])dnl AC_CHECK_HEADER([minix/config.h], [MINIX=yes], [MINIX=]) if test "$MINIX" = yes; then AC_DEFINE([_POSIX_SOURCE], [1], [Define to 1 if you need to in order for 'stat' and other things to work.]) AC_DEFINE([_POSIX_1_SOURCE], [2], [Define to 2 if the system does not provide POSIX.1 features except with this defined.]) AC_DEFINE([_MINIX], [1], [Define to 1 if on MINIX.]) AC_DEFINE([_NETBSD_SOURCE], [1], [Define to 1 to make NetBSD features available. MINIX 3 needs this.]) fi dnl Use a different key than __EXTENSIONS__, as that name broke existing dnl configure.ac when using autoheader 2.62. AH_VERBATIM([USE_SYSTEM_EXTENSIONS], [/* Enable extensions on AIX 3, Interix. */ #ifndef _ALL_SOURCE # undef _ALL_SOURCE #endif /* Enable general extensions on macOS. */ #ifndef _DARWIN_C_SOURCE # undef _DARWIN_C_SOURCE #endif /* Enable GNU extensions on systems that have them. */ #ifndef _GNU_SOURCE # undef _GNU_SOURCE #endif /* Enable NetBSD extensions on NetBSD. */ #ifndef _NETBSD_SOURCE # undef _NETBSD_SOURCE #endif /* Enable OpenBSD extensions on NetBSD. */ #ifndef _OPENBSD_SOURCE # undef _OPENBSD_SOURCE #endif /* Enable threading extensions on Solaris. */ #ifndef _POSIX_PTHREAD_SEMANTICS # undef _POSIX_PTHREAD_SEMANTICS #endif /* Enable extensions specified by ISO/IEC TS 18661-5:2014. */ #ifndef __STDC_WANT_IEC_60559_ATTRIBS_EXT__ # undef __STDC_WANT_IEC_60559_ATTRIBS_EXT__ #endif /* Enable extensions specified by ISO/IEC TS 18661-1:2014. */ #ifndef __STDC_WANT_IEC_60559_BFP_EXT__ # undef __STDC_WANT_IEC_60559_BFP_EXT__ #endif /* Enable extensions specified by ISO/IEC TS 18661-2:2015. */ #ifndef __STDC_WANT_IEC_60559_DFP_EXT__ # undef __STDC_WANT_IEC_60559_DFP_EXT__ #endif /* Enable extensions specified by ISO/IEC TS 18661-4:2015. */ #ifndef __STDC_WANT_IEC_60559_FUNCS_EXT__ # undef __STDC_WANT_IEC_60559_FUNCS_EXT__ #endif /* Enable extensions specified by ISO/IEC TS 18661-3:2015. */ #ifndef __STDC_WANT_IEC_60559_TYPES_EXT__ # undef __STDC_WANT_IEC_60559_TYPES_EXT__ #endif /* Enable extensions specified by ISO/IEC TR 24731-2:2010. */ #ifndef __STDC_WANT_LIB_EXT2__ # undef __STDC_WANT_LIB_EXT2__ #endif /* Enable extensions specified by ISO/IEC 24747:2009. */ #ifndef __STDC_WANT_MATH_SPEC_FUNCS__ # undef __STDC_WANT_MATH_SPEC_FUNCS__ #endif /* Enable extensions on HP NonStop. */ #ifndef _TANDEM_SOURCE # undef _TANDEM_SOURCE #endif /* Enable X/Open extensions if necessary. HP-UX 11.11 defines mbstate_t only if _XOPEN_SOURCE is defined to 500, regardless of whether compiling with -Ae or -D_HPUX_SOURCE=1. */ #ifndef _XOPEN_SOURCE # undef _XOPEN_SOURCE #endif /* Enable X/Open compliant socket functions that do not require linking with -lxnet on HP-UX 11.11. */ #ifndef _HPUX_ALT_XOPEN_SOCKET_API # undef _HPUX_ALT_XOPEN_SOCKET_API #endif /* Enable general extensions on Solaris. */ #ifndef __EXTENSIONS__ # undef __EXTENSIONS__ #endif ]) AC_CACHE_CHECK([whether it is safe to define __EXTENSIONS__], [ac_cv_safe_to_define___extensions__], [AC_COMPILE_IFELSE( [AC_LANG_PROGRAM([[ # define __EXTENSIONS__ 1 ]AC_INCLUDES_DEFAULT])], [ac_cv_safe_to_define___extensions__=yes], [ac_cv_safe_to_define___extensions__=no])]) test $ac_cv_safe_to_define___extensions__ = yes && AC_DEFINE([__EXTENSIONS__]) AC_DEFINE([_ALL_SOURCE]) AC_DEFINE([_DARWIN_C_SOURCE]) AC_DEFINE([_GNU_SOURCE]) AC_DEFINE([_NETBSD_SOURCE]) AC_DEFINE([_OPENBSD_SOURCE]) AC_DEFINE([_POSIX_PTHREAD_SEMANTICS]) AC_DEFINE([__STDC_WANT_IEC_60559_ATTRIBS_EXT__]) AC_DEFINE([__STDC_WANT_IEC_60559_BFP_EXT__]) AC_DEFINE([__STDC_WANT_IEC_60559_DFP_EXT__]) AC_DEFINE([__STDC_WANT_IEC_60559_FUNCS_EXT__]) AC_DEFINE([__STDC_WANT_IEC_60559_TYPES_EXT__]) AC_DEFINE([__STDC_WANT_LIB_EXT2__]) AC_DEFINE([__STDC_WANT_MATH_SPEC_FUNCS__]) AC_DEFINE([_TANDEM_SOURCE]) AC_CACHE_CHECK([whether _XOPEN_SOURCE should be defined], [ac_cv_should_define__xopen_source], [ac_cv_should_define__xopen_source=no AC_COMPILE_IFELSE( [AC_LANG_PROGRAM([[ #include mbstate_t x;]])], [], [AC_COMPILE_IFELSE( [AC_LANG_PROGRAM([[ #define _XOPEN_SOURCE 500 #include mbstate_t x;]])], [ac_cv_should_define__xopen_source=yes])])]) test $ac_cv_should_define__xopen_source = yes && AC_DEFINE([_XOPEN_SOURCE], [500]) AC_DEFINE([_HPUX_ALT_XOPEN_SOCKET_API]) ])# AC_USE_SYSTEM_EXTENSIONS # gl_USE_SYSTEM_EXTENSIONS # ------------------------ # Enable extensions on systems that normally disable them, # typically due to standards-conformance issues. AC_DEFUN_ONCE([gl_USE_SYSTEM_EXTENSIONS], [ dnl Require this macro before AC_USE_SYSTEM_EXTENSIONS. dnl gnulib does not need it. But if it gets required by third-party macros dnl after AC_USE_SYSTEM_EXTENSIONS is required, autoconf 2.62..2.63 emit a dnl warning: "AC_COMPILE_IFELSE was called before AC_USE_SYSTEM_EXTENSIONS". dnl Note: We can do this only for one of the macros AC_AIX, AC_GNU_SOURCE, dnl AC_MINIX. If people still use AC_AIX or AC_MINIX, they are out of luck. AC_REQUIRE([AC_GNU_SOURCE]) AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS]) ]) pspp-1.4.1/gl/m4/fpieee.m40000644000175000017500000000434013723215637014546 0ustar00blpblp00000000000000# fpieee.m4 serial 2 -*- coding: utf-8 -*- dnl Copyright (C) 2007, 2009-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl IEEE 754 standardized three items: dnl - The formats of single-float and double-float - nowadays commonly dnl available as 'float' and 'double' in C and C++. dnl No autoconf test needed. dnl - The overflow and division by zero behaviour: The result are values dnl '±Inf' and 'NaN', rather than exceptions as it was before. dnl This file provides an autoconf macro for ensuring this behaviour of dnl floating-point operations. dnl - A set of conditions (overflow, underflow, inexact, etc.) which can dnl be configured to trigger an exception. dnl This cannot be done in a portable way: it depends on the compiler, dnl libc, kernel, and CPU. No autoconf macro is provided for this. dnl Ensure non-trapping behaviour of floating-point overflow and dnl floating-point division by zero. dnl (For integer overflow, see gcc's -ftrapv option; for integer division by dnl zero, see the autoconf macro in intdiv0.m4.) AC_DEFUN([gl_FP_IEEE], [ AC_REQUIRE([AC_PROG_CC]) AC_REQUIRE([AC_CANONICAL_HOST]) # IEEE behaviour is the default on all CPUs except Alpha and SH # (according to the test results of Bruno Haible's ieeefp/fenv_default.m4 # and the GCC 4.1.2 manual). case "$host_cpu" in alpha*) # On Alpha systems, a compiler option provides the behaviour. # See the ieee(3) manual page, also available at # if test -n "$GCC"; then # GCC has the option -mieee. # For full IEEE compliance (rarely needed), use option -mieee-with-inexact. CPPFLAGS="$CPPFLAGS -mieee" else # Compaq (ex-DEC) C has the option -ieee, equivalent to -ieee_with_no_inexact. # For full IEEE compliance (rarely needed), use option -ieee_with_inexact. CPPFLAGS="$CPPFLAGS -ieee" fi ;; sh*) if test -n "$GCC"; then # GCC has the option -mieee. CPPFLAGS="$CPPFLAGS -mieee" fi ;; esac ]) pspp-1.4.1/gl/m4/limits-h.m40000644000175000017500000000244213723215637015040 0ustar00blpblp00000000000000dnl Check whether limits.h has needed features. dnl Copyright 2016-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl From Paul Eggert. AC_DEFUN_ONCE([gl_LIMITS_H], [ gl_CHECK_NEXT_HEADERS([limits.h]) AC_CACHE_CHECK([whether limits.h has LLONG_MAX, WORD_BIT, ULLONG_WIDTH etc.], [gl_cv_header_limits_width], [AC_COMPILE_IFELSE( [AC_LANG_PROGRAM( [[#ifndef __STDC_WANT_IEC_60559_BFP_EXT__ #define __STDC_WANT_IEC_60559_BFP_EXT__ 1 #endif #include long long llm = LLONG_MAX; int wb = WORD_BIT; int ullw = ULLONG_WIDTH; ]])], [gl_cv_header_limits_width=yes], [gl_cv_header_limits_width=no])]) if test "$gl_cv_header_limits_width" = yes; then LIMITS_H= else LIMITS_H=limits.h fi AC_SUBST([LIMITS_H]) AM_CONDITIONAL([GL_GENERATE_LIMITS_H], [test -n "$LIMITS_H"]) ]) dnl Unconditionally enables the replacement of . AC_DEFUN([gl_REPLACE_LIMITS_H], [ AC_REQUIRE([gl_LIMITS_H]) LIMITS_H='limits.h' AM_CONDITIONAL([GL_GENERATE_LIMITS_H], [test -n "$LIMITS_H"]) ]) pspp-1.4.1/gl/m4/nocrash.m40000644000175000017500000001055513723215637014753 0ustar00blpblp00000000000000# nocrash.m4 serial 5 dnl Copyright (C) 2005, 2009-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl Based on libsigsegv, from Bruno Haible and Paolo Bonzini. AC_PREREQ([2.13]) dnl Expands to some code for use in .c programs that will cause the configure dnl test to exit instead of crashing. This is useful to avoid triggering dnl action from a background debugger and to avoid core dumps. dnl Usage: ... dnl ]GL_NOCRASH[ dnl ... dnl int main() { nocrash_init(); ... } AC_DEFUN([GL_NOCRASH],[[ #include #if defined __MACH__ && defined __APPLE__ /* Avoid a crash on Mac OS X. */ #include #include #include #include #include #include /* The exception port on which our thread listens. */ static mach_port_t our_exception_port; /* The main function of the thread listening for exceptions of type EXC_BAD_ACCESS. */ static void * mach_exception_thread (void *arg) { /* Buffer for a message to be received. */ struct { mach_msg_header_t head; mach_msg_body_t msgh_body; char data[1024]; } msg; mach_msg_return_t retval; /* Wait for a message on the exception port. */ retval = mach_msg (&msg.head, MACH_RCV_MSG | MACH_RCV_LARGE, 0, sizeof (msg), our_exception_port, MACH_MSG_TIMEOUT_NONE, MACH_PORT_NULL); if (retval != MACH_MSG_SUCCESS) abort (); exit (1); } static void nocrash_init (void) { mach_port_t self = mach_task_self (); /* Allocate a port on which the thread shall listen for exceptions. */ if (mach_port_allocate (self, MACH_PORT_RIGHT_RECEIVE, &our_exception_port) == KERN_SUCCESS) { /* See https://web.mit.edu/darwin/src/modules/xnu/osfmk/man/mach_port_insert_right.html. */ if (mach_port_insert_right (self, our_exception_port, our_exception_port, MACH_MSG_TYPE_MAKE_SEND) == KERN_SUCCESS) { /* The exceptions we want to catch. Only EXC_BAD_ACCESS is interesting for us. */ exception_mask_t mask = EXC_MASK_BAD_ACCESS; /* Create the thread listening on the exception port. */ pthread_attr_t attr; pthread_t thread; if (pthread_attr_init (&attr) == 0 && pthread_attr_setdetachstate (&attr, PTHREAD_CREATE_DETACHED) == 0 && pthread_create (&thread, &attr, mach_exception_thread, NULL) == 0) { pthread_attr_destroy (&attr); /* Replace the exception port info for these exceptions with our own. Note that we replace the exception port for the entire task, not only for a particular thread. This has the effect that when our exception port gets the message, the thread specific exception port has already been asked, and we don't need to bother about it. See https://web.mit.edu/darwin/src/modules/xnu/osfmk/man/task_set_exception_ports.html. */ task_set_exception_ports (self, mask, our_exception_port, EXCEPTION_DEFAULT, MACHINE_THREAD_STATE); } } } } #elif defined _WIN32 && ! defined __CYGWIN__ /* Avoid a crash on native Windows. */ #define WIN32_LEAN_AND_MEAN #include #include static LONG WINAPI exception_filter (EXCEPTION_POINTERS *ExceptionInfo) { switch (ExceptionInfo->ExceptionRecord->ExceptionCode) { case EXCEPTION_ACCESS_VIOLATION: case EXCEPTION_IN_PAGE_ERROR: case EXCEPTION_STACK_OVERFLOW: case EXCEPTION_GUARD_PAGE: case EXCEPTION_PRIV_INSTRUCTION: case EXCEPTION_ILLEGAL_INSTRUCTION: case EXCEPTION_DATATYPE_MISALIGNMENT: case EXCEPTION_ARRAY_BOUNDS_EXCEEDED: case EXCEPTION_NONCONTINUABLE_EXCEPTION: exit (1); } return EXCEPTION_CONTINUE_SEARCH; } static void nocrash_init (void) { SetUnhandledExceptionFilter ((LPTOP_LEVEL_EXCEPTION_FILTER) exception_filter); } #else /* Avoid a crash on POSIX systems. */ #include #include /* A POSIX signal handler. */ static void exception_handler (int sig) { _exit (1); } static void nocrash_init (void) { #ifdef SIGSEGV signal (SIGSEGV, exception_handler); #endif #ifdef SIGBUS signal (SIGBUS, exception_handler); #endif } #endif ]]) pspp-1.4.1/gl/m4/fseeko.m40000644000175000017500000000454413723215637014573 0ustar00blpblp00000000000000# fseeko.m4 serial 19 dnl Copyright (C) 2007-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_FUNC_FSEEKO], [ AC_REQUIRE([gl_STDIO_H_DEFAULTS]) AC_REQUIRE([gl_STDIN_LARGE_OFFSET]) AC_REQUIRE([gl_SYS_TYPES_H]) AC_REQUIRE([AC_PROG_CC]) dnl Persuade glibc to declare fseeko(). AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS]) AC_CACHE_CHECK([for fseeko], [gl_cv_func_fseeko], [ AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include ]], [fseeko (stdin, 0, 0);])], [gl_cv_func_fseeko=yes], [gl_cv_func_fseeko=no]) ]) AC_CHECK_DECLS_ONCE([fseeko]) if test $ac_cv_have_decl_fseeko = no; then HAVE_DECL_FSEEKO=0 fi if test $gl_cv_func_fseeko = no; then HAVE_FSEEKO=0 else if test $WINDOWS_64_BIT_OFF_T = 1; then REPLACE_FSEEKO=1 fi if test $gl_cv_var_stdin_large_offset = no; then REPLACE_FSEEKO=1 fi m4_ifdef([gl_FUNC_FFLUSH_STDIN], [ gl_FUNC_FFLUSH_STDIN case "$gl_cv_func_fflush_stdin" in *yes) ;; *) REPLACE_FSEEKO=1 ;; esac ]) fi ]) dnl Code shared by fseeko and ftello. Determine if large files are supported, dnl but stdin does not start as a large file by default. AC_DEFUN([gl_STDIN_LARGE_OFFSET], [ AC_CACHE_CHECK([whether stdin defaults to large file offsets], [gl_cv_var_stdin_large_offset], [AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include ]], [[#if defined __SL64 && defined __SCLE /* cygwin */ /* Cygwin 1.5.24 and earlier fail to put stdin in 64-bit mode, making fseeko/ftello needlessly fail. This bug was fixed in 1.5.25, and it is easier to do a version check than building a runtime test. */ # include # if CYGWIN_VERSION_DLL_COMBINED < CYGWIN_VERSION_DLL_MAKE_COMBINED (1005, 25) choke me # endif #endif]])], [gl_cv_var_stdin_large_offset=yes], [gl_cv_var_stdin_large_offset=no])]) ]) # Prerequisites of lib/fseeko.c. AC_DEFUN([gl_PREREQ_FSEEKO], [ dnl Native Windows has the function _fseeki64. mingw hides it in some dnl circumstances, but mingw64 makes it usable again. AC_CHECK_FUNCS([_fseeki64]) if test $ac_cv_func__fseeki64 = yes; then AC_CHECK_DECLS([_fseeki64]) fi ]) pspp-1.4.1/gl/m4/strtok_r.m40000644000175000017500000000512313723215637015160 0ustar00blpblp00000000000000# strtok_r.m4 serial 15 dnl Copyright (C) 2002-2004, 2006-2007, 2009-2020 Free Software Foundation, dnl Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_FUNC_STRTOK_R], [ dnl The strtok_r() declaration in lib/string.in.h uses 'restrict'. AC_REQUIRE([AC_C_RESTRICT]) AC_REQUIRE([gl_HEADER_STRING_H_DEFAULTS]) AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles AC_CHECK_FUNCS([strtok_r]) if test $ac_cv_func_strtok_r = yes; then HAVE_STRTOK_R=1 dnl glibc 2.7 has a bug in strtok_r that causes a segmentation fault dnl when the second argument to strtok_r is a constant string that has dnl exactly one byte and compiling with optimization. This bug is, for dnl example, present in the glibc 2.7-18 package in Debian "lenny". dnl See . AC_CACHE_CHECK([whether strtok_r works], [gl_cv_func_strtok_r_works], [AC_RUN_IFELSE( [AC_LANG_PROGRAM([[ #ifndef __OPTIMIZE__ # define __OPTIMIZE__ 1 #endif #undef __OPTIMIZE_SIZE__ #undef __NO_INLINE__ #include #include ]], [[static const char dummy[] = "\177\01a"; char delimiters[] = "xxxxxxxx"; char *save_ptr = (char *) dummy; strtok_r (delimiters, "x", &save_ptr); strtok_r (NULL, "x", &save_ptr); return 0; ]]) ], [gl_cv_func_strtok_r_works=yes], [gl_cv_func_strtok_r_works=no], [case "$host_os" in # Guess no on glibc systems. *-gnu* | gnu*) gl_cv_func_strtok_r_works="guessing no" ;; # Guess yes on native Windows. mingw*) gl_cv_func_strtok_r_works="guessing yes" ;; *) gl_cv_func_strtok_r_works="guessing yes" ;; esac ]) ]) case "$gl_cv_func_strtok_r_works" in *no) dnl We could set REPLACE_STRTOK_R=1 here, but it's only the macro dnl version in which is wrong. The code compiled dnl into libc is fine. UNDEFINE_STRTOK_R=1 ;; esac else HAVE_STRTOK_R=0 fi AC_CHECK_DECLS_ONCE([strtok_r]) if test $ac_cv_have_decl_strtok_r = no; then HAVE_DECL_STRTOK_R=0 fi ]) # Prerequisites of lib/strtok_r.c. AC_DEFUN([gl_PREREQ_STRTOK_R], [ : ]) pspp-1.4.1/gl/m4/nstrftime.m40000644000175000017500000000120713723215637015323 0ustar00blpblp00000000000000# serial 35 # Copyright (C) 1996-1997, 1999-2007, 2009-2020 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # Written by Jim Meyering and Paul Eggert. AC_DEFUN([gl_FUNC_GNU_STRFTIME], [ AC_REQUIRE([AC_C_RESTRICT]) # This defines (or not) HAVE_TZNAME and HAVE_TM_ZONE. AC_REQUIRE([AC_STRUCT_TIMEZONE]) AC_REQUIRE([gl_TM_GMTOFF]) AC_CHECK_FUNCS_ONCE([tzset]) AC_DEFINE([my_strftime], [nstrftime], [Define to the name of the strftime replacement function.]) ]) pspp-1.4.1/gl/m4/ldexp.m40000644000175000017500000000363613723215637014434 0ustar00blpblp00000000000000# ldexp.m4 serial 1 dnl Copyright (C) 2010-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_FUNC_LDEXP], [ AC_REQUIRE([gl_CHECK_LDEXP_NO_LIBM]) LDEXP_LIBM= if test $gl_cv_func_ldexp_no_libm = no; then AC_CACHE_CHECK([whether ldexp() can be used with libm], [gl_cv_func_ldexp_in_libm], [ save_LIBS="$LIBS" LIBS="$LIBS -lm" AC_LINK_IFELSE( [AC_LANG_PROGRAM([[#ifndef __NO_MATH_INLINES # define __NO_MATH_INLINES 1 /* for glibc */ #endif #include double (*funcptr) (double, int) = ldexp; double x;]], [[return ldexp (x, -1) > 0;]])], [gl_cv_func_ldexp_in_libm=yes], [gl_cv_func_ldexp_in_libm=no]) LIBS="$save_LIBS" ]) if test $gl_cv_func_ldexp_in_libm = yes; then LDEXP_LIBM=-lm fi fi AC_SUBST([LDEXP_LIBM]) ]) dnl Test whether ldexp() can be used without linking with libm. dnl Set gl_cv_func_ldexp_no_libm to 'yes' or 'no' accordingly. AC_DEFUN([gl_CHECK_LDEXP_NO_LIBM], [ AC_CACHE_CHECK([whether ldexp() can be used without linking with libm], [gl_cv_func_ldexp_no_libm], [ AC_LINK_IFELSE( [AC_LANG_PROGRAM([[#ifndef __NO_MATH_INLINES # define __NO_MATH_INLINES 1 /* for glibc */ #endif #include double (*funcptr) (double, int) = ldexp; double x;]], [[return ldexp (x, -1) > 0;]])], [gl_cv_func_ldexp_no_libm=yes], [gl_cv_func_ldexp_no_libm=no]) ]) ]) pspp-1.4.1/gl/m4/safe-read.m40000644000175000017500000000063113723215637015137 0ustar00blpblp00000000000000# safe-read.m4 serial 6 dnl Copyright (C) 2002-2003, 2005-2006, 2009-2020 Free Software Foundation, dnl Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. # Prerequisites of lib/safe-read.c. AC_DEFUN([gl_PREREQ_SAFE_READ], [ AC_REQUIRE([gt_TYPE_SSIZE_T]) ]) pspp-1.4.1/gl/m4/fcntl-o.m40000644000175000017500000001120213723215637014646 0ustar00blpblp00000000000000# fcntl-o.m4 serial 6 dnl Copyright (C) 2006, 2009-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl Written by Paul Eggert. AC_PREREQ([2.60]) # Test whether the flags O_NOATIME and O_NOFOLLOW actually work. # Define HAVE_WORKING_O_NOATIME to 1 if O_NOATIME works, or to 0 otherwise. # Define HAVE_WORKING_O_NOFOLLOW to 1 if O_NOFOLLOW works, or to 0 otherwise. AC_DEFUN([gl_FCNTL_O_FLAGS], [ dnl Persuade glibc to define O_NOATIME and O_NOFOLLOW. AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS]) AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles AC_CHECK_HEADERS_ONCE([unistd.h]) AC_CHECK_FUNCS_ONCE([symlink]) AC_CACHE_CHECK([for working fcntl.h], [gl_cv_header_working_fcntl_h], [AC_RUN_IFELSE( [AC_LANG_PROGRAM( [[#include #include #if HAVE_UNISTD_H # include #else /* on Windows with MSVC */ # include # include # defined sleep(n) _sleep ((n) * 1000) #endif #include #ifndef O_NOATIME #define O_NOATIME 0 #endif #ifndef O_NOFOLLOW #define O_NOFOLLOW 0 #endif static int const constants[] = { O_CREAT, O_EXCL, O_NOCTTY, O_TRUNC, O_APPEND, O_NONBLOCK, O_SYNC, O_ACCMODE, O_RDONLY, O_RDWR, O_WRONLY }; ]], [[ int result = !constants; #if HAVE_SYMLINK { static char const sym[] = "conftest.sym"; if (symlink ("/dev/null", sym) != 0) result |= 2; else { int fd = open (sym, O_WRONLY | O_NOFOLLOW | O_CREAT, 0); if (fd >= 0) { close (fd); result |= 4; } } if (unlink (sym) != 0 || symlink (".", sym) != 0) result |= 2; else { int fd = open (sym, O_RDONLY | O_NOFOLLOW); if (fd >= 0) { close (fd); result |= 4; } } unlink (sym); } #endif { static char const file[] = "confdefs.h"; int fd = open (file, O_RDONLY | O_NOATIME); if (fd < 0) result |= 8; else { struct stat st0; if (fstat (fd, &st0) != 0) result |= 16; else { char c; sleep (1); if (read (fd, &c, 1) != 1) result |= 24; else { if (close (fd) != 0) result |= 32; else { struct stat st1; if (stat (file, &st1) != 0) result |= 40; else if (st0.st_atime != st1.st_atime) result |= 64; } } } } } return result;]])], [gl_cv_header_working_fcntl_h=yes], [case $? in #( 4) gl_cv_header_working_fcntl_h='no (bad O_NOFOLLOW)';; #( 64) gl_cv_header_working_fcntl_h='no (bad O_NOATIME)';; #( 68) gl_cv_header_working_fcntl_h='no (bad O_NOATIME, O_NOFOLLOW)';; #( *) gl_cv_header_working_fcntl_h='no';; esac], [case "$host_os" in # Guess 'no' on native Windows. mingw*) gl_cv_header_working_fcntl_h='no' ;; *) gl_cv_header_working_fcntl_h=cross-compiling ;; esac ]) ]) case $gl_cv_header_working_fcntl_h in #( *O_NOATIME* | no | cross-compiling) ac_val=0;; #( *) ac_val=1;; esac AC_DEFINE_UNQUOTED([HAVE_WORKING_O_NOATIME], [$ac_val], [Define to 1 if O_NOATIME works.]) case $gl_cv_header_working_fcntl_h in #( *O_NOFOLLOW* | no | cross-compiling) ac_val=0;; #( *) ac_val=1;; esac AC_DEFINE_UNQUOTED([HAVE_WORKING_O_NOFOLLOW], [$ac_val], [Define to 1 if O_NOFOLLOW works.]) ]) pspp-1.4.1/gl/m4/gnulib-common.m40000644000175000017500000006031413723215637016062 0ustar00blpblp00000000000000# gnulib-common.m4 serial 53 dnl Copyright (C) 2007-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_PREREQ([2.62]) # gl_COMMON # is expanded unconditionally through gnulib-tool magic. AC_DEFUN([gl_COMMON], [ dnl Use AC_REQUIRE here, so that the code is expanded once only. AC_REQUIRE([gl_00GNULIB]) AC_REQUIRE([gl_COMMON_BODY]) AC_REQUIRE([gl_ZZGNULIB]) ]) AC_DEFUN([gl_COMMON_BODY], [ AH_VERBATIM([_GL_GNUC_PREREQ], [/* True if the compiler says it groks GNU C version MAJOR.MINOR. */ #if defined __GNUC__ && defined __GNUC_MINOR__ # define _GL_GNUC_PREREQ(major, minor) \ ((major) < __GNUC__ + ((minor) <= __GNUC_MINOR__)) #else # define _GL_GNUC_PREREQ(major, minor) 0 #endif ]) AH_VERBATIM([_Noreturn], [/* The _Noreturn keyword of C11. */ #ifndef _Noreturn # if (defined __cplusplus \ && ((201103 <= __cplusplus && !(__GNUC__ == 4 && __GNUC_MINOR__ == 7)) \ || (defined _MSC_VER && 1900 <= _MSC_VER)) \ && 0) /* [[noreturn]] is not practically usable, because with it the syntax extern _Noreturn void func (...); would not be valid; such a declaration would only be valid with 'extern' and '_Noreturn' swapped, or without the 'extern' keyword. However, some AIX system header files and several gnulib header files use precisely this syntax with 'extern'. */ # define _Noreturn [[noreturn]] # elif ((!defined __cplusplus || defined __clang__) \ && (201112 <= (defined __STDC_VERSION__ ? __STDC_VERSION__ : 0) \ || _GL_GNUC_PREREQ (4, 7) \ || (defined __apple_build_version__ \ ? 6000000 <= __apple_build_version__ \ : 3 < __clang_major__ + (5 <= __clang_minor__)))) /* _Noreturn works as-is. */ # elif _GL_GNUC_PREREQ (2, 8) || 0x5110 <= __SUNPRO_C # define _Noreturn __attribute__ ((__noreturn__)) # elif 1200 <= (defined _MSC_VER ? _MSC_VER : 0) # define _Noreturn __declspec (noreturn) # else # define _Noreturn # endif #endif ]) AH_VERBATIM([isoc99_inline], [/* Work around a bug in Apple GCC 4.0.1 build 5465: In C99 mode, it supports the ISO C 99 semantics of 'extern inline' (unlike the GNU C semantics of earlier versions), but does not display it by setting __GNUC_STDC_INLINE__. __APPLE__ && __MACH__ test for Mac OS X. __APPLE_CC__ tests for the Apple compiler and its version. __STDC_VERSION__ tests for the C99 mode. */ #if defined __APPLE__ && defined __MACH__ && __APPLE_CC__ >= 5465 && !defined __cplusplus && __STDC_VERSION__ >= 199901L && !defined __GNUC_STDC_INLINE__ # define __GNUC_STDC_INLINE__ 1 #endif]) AH_VERBATIM([attribute], [/* Attributes. */ #ifdef __has_attribute # define _GL_HAS_ATTRIBUTE(attr) __has_attribute (__##attr##__) #else # define _GL_HAS_ATTRIBUTE(attr) _GL_ATTR_##attr # define _GL_ATTR_alloc_size _GL_GNUC_PREREQ (4, 3) # define _GL_ATTR_always_inline _GL_GNUC_PREREQ (3, 2) # define _GL_ATTR_artificial _GL_GNUC_PREREQ (4, 3) # define _GL_ATTR_cold _GL_GNUC_PREREQ (4, 3) # define _GL_ATTR_const _GL_GNUC_PREREQ (2, 95) # define _GL_ATTR_deprecated _GL_GNUC_PREREQ (3, 1) # define _GL_ATTR_error _GL_GNUC_PREREQ (4, 3) # define _GL_ATTR_externally_visible _GL_GNUC_PREREQ (4, 1) # define _GL_ATTR_fallthrough _GL_GNUC_PREREQ (7, 0) # define _GL_ATTR_format _GL_GNUC_PREREQ (2, 7) # define _GL_ATTR_leaf _GL_GNUC_PREREQ (4, 6) # ifdef _ICC # define _GL_ATTR_may_alias 0 # else # define _GL_ATTR_may_alias _GL_GNUC_PREREQ (3, 3) # endif # define _GL_ATTR_malloc _GL_GNUC_PREREQ (3, 0) # define _GL_ATTR_noinline _GL_GNUC_PREREQ (3, 1) # define _GL_ATTR_nonnull _GL_GNUC_PREREQ (3, 3) # define _GL_ATTR_nonstring _GL_GNUC_PREREQ (8, 0) # define _GL_ATTR_nothrow _GL_GNUC_PREREQ (3, 3) # define _GL_ATTR_packed _GL_GNUC_PREREQ (2, 7) # define _GL_ATTR_pure _GL_GNUC_PREREQ (2, 96) # define _GL_ATTR_returns_nonnull _GL_GNUC_PREREQ (4, 9) # define _GL_ATTR_sentinel _GL_GNUC_PREREQ (4, 0) # define _GL_ATTR_unused _GL_GNUC_PREREQ (2, 7) # define _GL_ATTR_warn_unused_result _GL_GNUC_PREREQ (3, 4) #endif ]dnl There is no _GL_ATTRIBUTE_ALIGNED; use stdalign's _Alignas instead. [ #if _GL_HAS_ATTRIBUTE (alloc_size) # define _GL_ATTRIBUTE_ALLOC_SIZE(args) __attribute__ ((__alloc_size__ args)) #else # define _GL_ATTRIBUTE_ALLOC_SIZE(args) #endif #if _GL_HAS_ATTRIBUTE (always_inline) # define _GL_ATTRIBUTE_ALWAYS_INLINE __attribute__ ((__always_inline__)) #else # define _GL_ATTRIBUTE_ALWAYS_INLINE #endif #if _GL_HAS_ATTRIBUTE (artificial) # define _GL_ATTRIBUTE_ARTIFICIAL __attribute__ ((__artificial__)) #else # define _GL_ATTRIBUTE_ARTIFICIAL #endif /* Avoid __attribute__ ((cold)) on MinGW; see thread starting at . Also, Oracle Studio 12.6 requires 'cold' not '__cold__'. */ #if _GL_HAS_ATTRIBUTE (cold) && !defined __MINGW32__ # ifndef __SUNPRO_C # define _GL_ATTRIBUTE_COLD __attribute__ ((__cold__)) # else # define _GL_ATTRIBUTE_COLD __attribute__ ((cold)) # endif #else # define _GL_ATTRIBUTE_COLD #endif #if _GL_HAS_ATTRIBUTE (const) # define _GL_ATTRIBUTE_CONST __attribute__ ((__const__)) #else # define _GL_ATTRIBUTE_CONST #endif #if 201710L < __STDC_VERSION__ # define _GL_ATTRIBUTE_DEPRECATED [[__deprecated__]] #elif _GL_HAS_ATTRIBUTE (deprecated) # define _GL_ATTRIBUTE_DEPRECATED __attribute__ ((__deprecated__)) #else # define _GL_ATTRIBUTE_DEPRECATED #endif #if _GL_HAS_ATTRIBUTE (error) # define _GL_ATTRIBUTE_ERROR(msg) __attribute__ ((__error__ (msg))) # define _GL_ATTRIBUTE_WARNING(msg) __attribute__ ((__warning__ (msg))) #else # define _GL_ATTRIBUTE_ERROR(msg) # define _GL_ATTRIBUTE_WARNING(msg) #endif #if _GL_HAS_ATTRIBUTE (externally_visible) # define _GL_ATTRIBUTE_EXTERNALLY_VISIBLE __attribute__ ((externally_visible)) #else # define _GL_ATTRIBUTE_EXTERNALLY_VISIBLE #endif /* FALLTHROUGH is special, because it always expands to something. */ #if 201710L < __STDC_VERSION__ # define _GL_ATTRIBUTE_FALLTHROUGH [[__fallthrough__]] #elif _GL_HAS_ATTRIBUTE (fallthrough) # define _GL_ATTRIBUTE_FALLTHROUGH __attribute__ ((__fallthrough__)) #else # define _GL_ATTRIBUTE_FALLTHROUGH ((void) 0) #endif #if _GL_HAS_ATTRIBUTE (format) # define _GL_ATTRIBUTE_FORMAT(spec) __attribute__ ((__format__ spec)) #else # define _GL_ATTRIBUTE_FORMAT(spec) #endif #if _GL_HAS_ATTRIBUTE (leaf) # define _GL_ATTRIBUTE_LEAF __attribute__ ((__leaf__)) #else # define _GL_ATTRIBUTE_LEAF #endif /* Oracle Studio 12.6 mishandles may_alias despite __has_attribute OK. */ #if _GL_HAS_ATTRIBUTE (may_alias) && !defined __SUNPRO_C # define _GL_ATTRIBUTE_MAY_ALIAS __attribute__ ((__may_alias__)) #else # define _GL_ATTRIBUTE_MAY_ALIAS #endif #if 201710L < __STDC_VERSION__ # define _GL_ATTRIBUTE_MAYBE_UNUSED [[__maybe_unused__]] #elif _GL_HAS_ATTRIBUTE (unused) # define _GL_ATTRIBUTE_MAYBE_UNUSED __attribute__ ((__unused__)) #else # define _GL_ATTRIBUTE_MAYBE_UNUSED #endif /* Earlier spellings of this macro. */ #define _GL_UNUSED _GL_ATTRIBUTE_MAYBE_UNUSED #define _UNUSED_PARAMETER_ _GL_ATTRIBUTE_MAYBE_UNUSED #if _GL_HAS_ATTRIBUTE (malloc) # define _GL_ATTRIBUTE_MALLOC __attribute__ ((__malloc__)) #else # define _GL_ATTRIBUTE_MALLOC #endif #if 201710L < __STDC_VERSION__ # define _GL_ATTRIBUTE_NODISCARD [[__nodiscard__]] #elif _GL_HAS_ATTRIBUTE (warn_unused_result) # define _GL_ATTRIBUTE_NODISCARD __attribute__ ((__warn_unused_result__)) #else # define _GL_ATTRIBUTE_NODISCARD #endif #if _GL_HAS_ATTRIBUTE (noinline) # define _GL_ATTRIBUTE_NOINLINE __attribute__ ((__noinline__)) #else # define _GL_ATTRIBUTE_NOINLINE #endif #if _GL_HAS_ATTRIBUTE (nonnull) # define _GL_ATTRIBUTE_NONNULL(args) __attribute__ ((__nonnull__ args)) #else # define _GL_ATTRIBUTE_NONNULL(args) #endif #if _GL_HAS_ATTRIBUTE (nonstring) # define _GL_ATTRIBUTE_NONSTRING __attribute__ ((__nonstring__)) #else # define _GL_ATTRIBUTE_NONSTRING #endif /* There is no _GL_ATTRIBUTE_NORETURN; use _Noreturn instead. */ #if _GL_HAS_ATTRIBUTE (nothrow) && !defined __cplusplus # define _GL_ATTRIBUTE_NOTHROW __attribute__ ((__nothrow__)) #else # define _GL_ATTRIBUTE_NOTHROW #endif #if _GL_HAS_ATTRIBUTE (packed) # define _GL_ATTRIBUTE_PACKED __attribute__ ((__packed__)) #else # define _GL_ATTRIBUTE_PACKED #endif #if _GL_HAS_ATTRIBUTE (pure) # define _GL_ATTRIBUTE_PURE __attribute__ ((__pure__)) #else # define _GL_ATTRIBUTE_PURE #endif #if _GL_HAS_ATTRIBUTE (returns_nonnull) # define _GL_ATTRIBUTE_RETURNS_NONNULL __attribute__ ((__returns_nonnull__)) #else # define _GL_ATTRIBUTE_RETURNS_NONNULL #endif #if _GL_HAS_ATTRIBUTE (sentinel) # define _GL_ATTRIBUTE_SENTINEL(pos) __attribute__ ((__sentinel__ pos)) #else # define _GL_ATTRIBUTE_SENTINEL(pos) #endif ]dnl There is no _GL_ATTRIBUTE_VISIBILITY; see m4/visibility.m4 instead. [ /* To support C++ as well as C, use _GL_UNUSED_LABEL with trailing ';'. */ #if !defined __cplusplus || _GL_GNUC_PREREQ (4, 5) # define _GL_UNUSED_LABEL _GL_ATTRIBUTE_MAYBE_UNUSED #else # define _GL_UNUSED_LABEL #endif ]) AH_VERBATIM([async_safe], [/* The _GL_ASYNC_SAFE marker should be attached to functions that are signal handlers (for signals other than SIGABRT, SIGPIPE) or can be invoked from such signal handlers. Such functions have some restrictions: * All functions that it calls should be marked _GL_ASYNC_SAFE as well, or should be listed as async-signal-safe in POSIX section 2.4.3. Note that malloc(), sprintf(), and fwrite(), in particular, are NOT async-signal-safe. * All memory locations (variables and struct fields) that these functions access must be marked 'volatile'. This holds for both read and write accesses. Otherwise the compiler might optimize away stores to and reads from such locations that occur in the program, depending on its data flow analysis. For example, when the program contains a loop that is intended to inspect a variable set from within a signal handler while (!signal_occurred) ; the compiler is allowed to transform this into an endless loop if the variable 'signal_occurred' is not declared 'volatile'. Additionally, recall that: * A signal handler should not modify errno (except if it is a handler for a fatal signal and ends by raising the same signal again, thus provoking the termination of the process). If it invokes a function that may clobber errno, it needs to save and restore the value of errno. */ #define _GL_ASYNC_SAFE ]) AH_VERBATIM([micro_optimizations], [/* _GL_CMP (n1, n2) performs a three-valued comparison on n1 vs. n2, where n1 and n2 are expressions without side effects, that evaluate to real numbers (excluding NaN). It returns 1 if n1 > n2 0 if n1 == n2 -1 if n1 < n2 The naïve code (n1 > n2 ? 1 : n1 < n2 ? -1 : 0) produces a conditional jump with nearly all GCC versions up to GCC 10. This variant (n1 < n2 ? -1 : n1 > n2) produces a conditional with many GCC versions up to GCC 9. The better code (n1 > n2) - (n1 < n2) from Hacker's Delight § 2-9 avoids conditional jumps in all GCC versions >= 3.4. */ #define _GL_CMP(n1, n2) (((n1) > (n2)) - ((n1) < (n2))) ]) dnl Hint which direction to take regarding cross-compilation guesses: dnl When a user installs a program on a platform they are not intimately dnl familiar with, --enable-cross-guesses=conservative is the appropriate dnl choice. It implements the "If we don't know, assume the worst" principle. dnl However, when an operating system developer (on a platform which is not dnl yet known to gnulib) builds packages for their platform, they want to dnl expose, not hide, possible platform bugs; in this case, dnl --enable-cross-guesses=risky is the appropriate choice. dnl Sets the variables dnl gl_cross_guess_normal (to be used when 'yes' is good and 'no' is bad), dnl gl_cross_guess_inverted (to be used when 'no' is good and 'yes' is bad). AC_ARG_ENABLE([cross-guesses], [AS_HELP_STRING([--enable-cross-guesses={conservative|risky}], [specify policy for cross-compilation guesses])], [if test "x$enableval" != xconservative && test "x$enableval" != xrisky; then AC_MSG_WARN([invalid argument supplied to --enable-cross-guesses]) enableval=conservative fi gl_cross_guesses="$enableval"], [gl_cross_guesses=conservative]) if test $gl_cross_guesses = risky; then gl_cross_guess_normal="guessing yes" gl_cross_guess_inverted="guessing no" else gl_cross_guess_normal="guessing no" gl_cross_guess_inverted="guessing yes" fi dnl Preparation for running test programs: dnl Tell glibc to write diagnostics from -D_FORTIFY_SOURCE=2 to stderr, not dnl to /dev/tty, so they can be redirected to log files. Such diagnostics dnl arise e.g., in the macros gl_PRINTF_DIRECTIVE_N, gl_SNPRINTF_DIRECTIVE_N. LIBC_FATAL_STDERR_=1 export LIBC_FATAL_STDERR_ ]) # gl_MODULE_INDICATOR_CONDITION # expands to a C preprocessor expression that evaluates to 1 or 0, depending # whether a gnulib module that has been requested shall be considered present # or not. m4_define([gl_MODULE_INDICATOR_CONDITION], [1]) # gl_MODULE_INDICATOR_SET_VARIABLE([modulename]) # sets the shell variable that indicates the presence of the given module to # a C preprocessor expression that will evaluate to 1. AC_DEFUN([gl_MODULE_INDICATOR_SET_VARIABLE], [ gl_MODULE_INDICATOR_SET_VARIABLE_AUX( [GNULIB_[]m4_translit([[$1]], [abcdefghijklmnopqrstuvwxyz./-], [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])], [gl_MODULE_INDICATOR_CONDITION]) ]) # gl_MODULE_INDICATOR_SET_VARIABLE_AUX([variable]) # modifies the shell variable to include the gl_MODULE_INDICATOR_CONDITION. # The shell variable's value is a C preprocessor expression that evaluates # to 0 or 1. AC_DEFUN([gl_MODULE_INDICATOR_SET_VARIABLE_AUX], [ m4_if(m4_defn([gl_MODULE_INDICATOR_CONDITION]), [1], [ dnl Simplify the expression VALUE || 1 to 1. $1=1 ], [gl_MODULE_INDICATOR_SET_VARIABLE_AUX_OR([$1], [gl_MODULE_INDICATOR_CONDITION])]) ]) # gl_MODULE_INDICATOR_SET_VARIABLE_AUX_OR([variable], [condition]) # modifies the shell variable to include the given condition. The shell # variable's value is a C preprocessor expression that evaluates to 0 or 1. AC_DEFUN([gl_MODULE_INDICATOR_SET_VARIABLE_AUX_OR], [ dnl Simplify the expression 1 || CONDITION to 1. if test "$[]$1" != 1; then dnl Simplify the expression 0 || CONDITION to CONDITION. if test "$[]$1" = 0; then $1=$2 else $1="($[]$1 || $2)" fi fi ]) # gl_MODULE_INDICATOR([modulename]) # defines a C macro indicating the presence of the given module # in a location where it can be used. # | Value | Value | # | in lib/ | in tests/ | # --------------------------------------------+---------+-----------+ # Module present among main modules: | 1 | 1 | # --------------------------------------------+---------+-----------+ # Module present among tests-related modules: | 0 | 1 | # --------------------------------------------+---------+-----------+ # Module not present at all: | 0 | 0 | # --------------------------------------------+---------+-----------+ AC_DEFUN([gl_MODULE_INDICATOR], [ AC_DEFINE_UNQUOTED([GNULIB_]m4_translit([[$1]], [abcdefghijklmnopqrstuvwxyz./-], [ABCDEFGHIJKLMNOPQRSTUVWXYZ___]), [gl_MODULE_INDICATOR_CONDITION], [Define to a C preprocessor expression that evaluates to 1 or 0, depending whether the gnulib module $1 shall be considered present.]) ]) # gl_MODULE_INDICATOR_FOR_TESTS([modulename]) # defines a C macro indicating the presence of the given module # in lib or tests. This is useful to determine whether the module # should be tested. # | Value | Value | # | in lib/ | in tests/ | # --------------------------------------------+---------+-----------+ # Module present among main modules: | 1 | 1 | # --------------------------------------------+---------+-----------+ # Module present among tests-related modules: | 1 | 1 | # --------------------------------------------+---------+-----------+ # Module not present at all: | 0 | 0 | # --------------------------------------------+---------+-----------+ AC_DEFUN([gl_MODULE_INDICATOR_FOR_TESTS], [ AC_DEFINE([GNULIB_TEST_]m4_translit([[$1]], [abcdefghijklmnopqrstuvwxyz./-], [ABCDEFGHIJKLMNOPQRSTUVWXYZ___]), [1], [Define to 1 when the gnulib module $1 should be tested.]) ]) # gl_ASSERT_NO_GNULIB_POSIXCHECK # asserts that there will never be a need to #define GNULIB_POSIXCHECK. # and thereby enables an optimization of configure and config.h. # Used by Emacs. AC_DEFUN([gl_ASSERT_NO_GNULIB_POSIXCHECK], [ dnl Override gl_WARN_ON_USE_PREPARE. dnl But hide this definition from 'aclocal'. AC_DEFUN([gl_W][ARN_ON_USE_PREPARE], []) ]) # gl_ASSERT_NO_GNULIB_TESTS # asserts that there will be no gnulib tests in the scope of the configure.ac # and thereby enables an optimization of config.h. # Used by Emacs. AC_DEFUN([gl_ASSERT_NO_GNULIB_TESTS], [ dnl Override gl_MODULE_INDICATOR_FOR_TESTS. AC_DEFUN([gl_MODULE_INDICATOR_FOR_TESTS], []) ]) # Test whether exists. # Set HAVE_FEATURES_H. AC_DEFUN([gl_FEATURES_H], [ AC_CHECK_HEADERS_ONCE([features.h]) if test $ac_cv_header_features_h = yes; then HAVE_FEATURES_H=1 else HAVE_FEATURES_H=0 fi AC_SUBST([HAVE_FEATURES_H]) ]) # AS_VAR_IF(VAR, VALUE, [IF-MATCH], [IF-NOT-MATCH]) # ---------------------------------------------------- # Backport of autoconf-2.63b's macro. # Remove this macro when we can assume autoconf >= 2.64. m4_ifndef([AS_VAR_IF], [m4_define([AS_VAR_IF], [AS_IF([test x"AS_VAR_GET([$1])" = x""$2], [$3], [$4])])]) # gl_PROG_CC_C99 # Modifies the value of the shell variable CC in an attempt to make $CC # understand ISO C99 source code. # This is like AC_PROG_CC_C99, except that # - AC_PROG_CC_C99 does not mix well with AC_PROG_CC_STDC # , # but many more packages use AC_PROG_CC_STDC than AC_PROG_CC_C99 # . # Remaining problems: # - When AC_PROG_CC_STDC is invoked twice, it adds the C99 enabling options # to CC twice # . # - AC_PROG_CC_STDC is likely to change now that C11 is an ISO standard. AC_DEFUN([gl_PROG_CC_C99], [ dnl Change that version number to the minimum Autoconf version that supports dnl mixing AC_PROG_CC_C99 calls with AC_PROG_CC_STDC calls. m4_version_prereq([9.0], [AC_REQUIRE([AC_PROG_CC_C99])], [AC_REQUIRE([AC_PROG_CC_STDC])]) ]) # gl_PROG_AR_RANLIB # Determines the values for AR, ARFLAGS, RANLIB that fit with the compiler. # The user can set the variables AR, ARFLAGS, RANLIB if he wants to override # the values. AC_DEFUN([gl_PROG_AR_RANLIB], [ dnl Minix 3 comes with two toolchains: The Amsterdam Compiler Kit compiler dnl as "cc", and GCC as "gcc". They have different object file formats and dnl library formats. In particular, the GNU binutils programs ar and ranlib dnl produce libraries that work only with gcc, not with cc. AC_REQUIRE([AC_PROG_CC]) dnl The '][' hides this use from 'aclocal'. AC_BEFORE([$0], [A][M_PROG_AR]) AC_CACHE_CHECK([for Minix Amsterdam compiler], [gl_cv_c_amsterdam_compiler], [ AC_EGREP_CPP([Amsterdam], [ #ifdef __ACK__ Amsterdam #endif ], [gl_cv_c_amsterdam_compiler=yes], [gl_cv_c_amsterdam_compiler=no]) ]) dnl Don't compete with AM_PROG_AR's decision about AR/ARFLAGS if we are not dnl building with __ACK__. if test $gl_cv_c_amsterdam_compiler = yes; then if test -z "$AR"; then AR='cc -c.a' fi if test -z "$ARFLAGS"; then ARFLAGS='-o' fi else dnl AM_PROG_AR was added in automake v1.11.2. AM_PROG_AR does not AC_SUBST dnl ARFLAGS variable (it is filed into Makefile.in directly by automake dnl script on-demand, if not specified by ./configure of course). dnl Don't AC_REQUIRE the AM_PROG_AR otherwise the code for __ACK__ above dnl will be ignored. Also, pay attention to call AM_PROG_AR in else block dnl because AM_PROG_AR is written so it could re-set AR variable even for dnl __ACK__. It may seem like its easier to avoid calling the macro here, dnl but we need to AC_SUBST both AR/ARFLAGS (thus those must have some good dnl default value and automake should usually know them). dnl dnl The '][' hides this use from 'aclocal'. m4_ifdef([A][M_PROG_AR], [A][M_PROG_AR], [:]) fi dnl In case the code above has not helped with setting AR/ARFLAGS, use dnl Automake-documented default values for AR and ARFLAGS, but prefer dnl ${host}-ar over ar (useful for cross-compiling). AC_CHECK_TOOL([AR], [ar], [ar]) if test -z "$ARFLAGS"; then ARFLAGS='cr' fi AC_SUBST([AR]) AC_SUBST([ARFLAGS]) if test -z "$RANLIB"; then if test $gl_cv_c_amsterdam_compiler = yes; then RANLIB=':' else dnl Use the ranlib program if it is available. AC_PROG_RANLIB fi fi AC_SUBST([RANLIB]) ]) # AC_C_RESTRICT # This definition is copied from post-2.69 Autoconf and overrides the # AC_C_RESTRICT macro from autoconf 2.60..2.69. It can be removed # once autoconf >= 2.70 can be assumed. It's painful to check version # numbers, and in practice this macro is more up-to-date than Autoconf # is, so override Autoconf unconditionally. AC_DEFUN([AC_C_RESTRICT], [AC_CACHE_CHECK([for C/C++ restrict keyword], [ac_cv_c_restrict], [ac_cv_c_restrict=no # The order here caters to the fact that C++ does not require restrict. for ac_kw in __restrict __restrict__ _Restrict restrict; do AC_COMPILE_IFELSE( [AC_LANG_PROGRAM( [[typedef int *int_ptr; int foo (int_ptr $ac_kw ip) { return ip[0]; } int bar (int [$ac_kw]); /* Catch GCC bug 14050. */ int bar (int ip[$ac_kw]) { return ip[0]; } ]], [[int s[1]; int *$ac_kw t = s; t[0] = 0; return foo (t) + bar (t); ]])], [ac_cv_c_restrict=$ac_kw]) test "$ac_cv_c_restrict" != no && break done ]) AH_VERBATIM([restrict], [/* Define to the equivalent of the C99 'restrict' keyword, or to nothing if this is not supported. Do not define if restrict is supported directly. */ #undef restrict /* Work around a bug in older versions of Sun C++, which did not #define __restrict__ or support _Restrict or __restrict__ even though the corresponding Sun C compiler ended up with "#define restrict _Restrict" or "#define restrict __restrict__" in the previous line. This workaround can be removed once we assume Oracle Developer Studio 12.5 (2016) or later. */ #if defined __SUNPRO_CC && !defined __RESTRICT && !defined __restrict__ # define _Restrict # define __restrict__ #endif]) case $ac_cv_c_restrict in restrict) ;; no) AC_DEFINE([restrict], []) ;; *) AC_DEFINE_UNQUOTED([restrict], [$ac_cv_c_restrict]) ;; esac ])# AC_C_RESTRICT # gl_BIGENDIAN # is like AC_C_BIGENDIAN, except that it can be AC_REQUIREd. # Note that AC_REQUIRE([AC_C_BIGENDIAN]) does not work reliably because some # macros invoke AC_C_BIGENDIAN with arguments. AC_DEFUN([gl_BIGENDIAN], [ AC_C_BIGENDIAN ]) # gl_SILENT(command) # executes command, but without the normal configure output. AC_DEFUN([gl_SILENT], [ { $1 } AS_MESSAGE_FD>/dev/null ]) # gl_CACHE_VAL_SILENT(cache-id, command-to-set-it) # is like AC_CACHE_VAL(cache-id, command-to-set-it), except that it does not # output a spurious "(cached)" mark in the midst of other configure output. # This macro should be used instead of AC_CACHE_VAL when it is not surrounded # by an AC_MSG_CHECKING/AC_MSG_RESULT pair. AC_DEFUN([gl_CACHE_VAL_SILENT], [ saved_as_echo_n="$as_echo_n" as_echo_n=':' AC_CACHE_VAL([$1], [$2]) as_echo_n="$saved_as_echo_n" ]) # AS_VAR_COPY was added in autoconf 2.63b m4_define_default([AS_VAR_COPY], [AS_LITERAL_IF([$1[]$2], [$1=$$2], [eval $1=\$$2])]) pspp-1.4.1/gl/m4/00gnulib.m40000644000175000017500000001213113723215637014726 0ustar00blpblp00000000000000# 00gnulib.m4 serial 7 dnl Copyright (C) 2009-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl This file must be named something that sorts before all other dnl gnulib-provided .m4 files. The first part is needed until such time dnl as we can assume Autoconf 2.64, with its improved AC_DEFUN_ONCE and dnl m4_divert semantics. The second part is needed until the clang fix dnl has been included in Autoconf. # Until autoconf 2.63, handling of the diversion stack required m4_init # to be called first; but this does not happen with aclocal. Wrapping # the entire execution in another layer of the diversion stack fixes this. # Worse, prior to autoconf 2.62, m4_wrap depended on the underlying m4 # for whether it was FIFO or LIFO; in order to properly balance with # m4_init, we need to undo our push just before anything wrapped within # the m4_init body. The way to ensure this is to wrap both sides of # m4_init with a one-shot macro that does the pop at the right time. m4_ifndef([_m4_divert_diversion], [m4_divert_push([KILL]) m4_define([gl_divert_fixup], [m4_divert_pop()m4_define([$0])]) m4_define([m4_init], [gl_divert_fixup()]m4_defn([m4_init])[gl_divert_fixup()])]) # AC_DEFUN_ONCE([NAME], VALUE) # ---------------------------- # Define NAME to expand to VALUE on the first use (whether by direct # expansion, or by AC_REQUIRE), and to nothing on all subsequent uses. # Avoid bugs in AC_REQUIRE in Autoconf 2.63 and earlier. This # definition is slower than the version in Autoconf 2.64, because it # can only use interfaces that existed since 2.59; but it achieves the # same effect. Quoting is necessary to avoid confusing Automake. m4_version_prereq([2.63.263], [], [m4_define([AC][_DEFUN_ONCE], [AC][_DEFUN([$1], [AC_REQUIRE([_gl_DEFUN_ONCE([$1])], [m4_indir([_gl_DEFUN_ONCE([$1])])])])]dnl [AC][_DEFUN([_gl_DEFUN_ONCE([$1])], [$2])])]) # The following definitions arrange to use a compiler option # -Werror=implicit-function-declaration in AC_CHECK_DECL, when the # compiler is clang. Without it, clang implicitly declares "known" # library functions in C mode, but not in C++ mode, which would cause # Gnulib to omit a declaration and thus later produce an error in C++ # mode. As of clang 9.0, these "known" functions are identified through # LIBBUILTIN invocations in the LLVM source file # llvm/tools/clang/include/clang/Basic/Builtins.def. # It's not possible to AC_REQUIRE the extra tests from AC_CHECK_DECL, # because AC_CHECK_DECL, like other Autoconf built-ins, is not supposed # to AC_REQUIRE anything: some configure.ac files have their first # AC_CHECK_DECL executed conditionally. Therefore append the extra tests # to AC_PROG_CC. AC_DEFUN([gl_COMPILER_CLANG], [ dnl AC_REQUIRE([AC_PROG_CC]) AC_CACHE_CHECK([whether the compiler is clang], [gl_cv_compiler_clang], [dnl Use _AC_COMPILE_IFELSE instead of AC_EGREP_CPP, to avoid error dnl "circular dependency of AC_LANG_COMPILER(C)" if AC_PROG_CC has dnl not yet been invoked. _AC_COMPILE_IFELSE( [AC_LANG_PROGRAM([[ #ifdef __clang__ barfbarf #endif ]],[[]]) ], [gl_cv_compiler_clang=no], [gl_cv_compiler_clang=yes]) ]) ]) AC_DEFUN([gl_COMPILER_PREPARE_CHECK_DECL], [ dnl AC_REQUIRE([AC_PROG_CC]) dnl AC_REQUIRE([gl_COMPILER_CLANG]) AC_CACHE_CHECK([for compiler option needed when checking for declarations], [gl_cv_compiler_check_decl_option], [if test $gl_cv_compiler_clang = yes; then dnl Test whether the compiler supports the option dnl '-Werror=implicit-function-declaration'. save_ac_compile="$ac_compile" ac_compile="$ac_compile -Werror=implicit-function-declaration" dnl Use _AC_COMPILE_IFELSE instead of AC_COMPILE_IFELSE, to avoid a dnl warning "AC_COMPILE_IFELSE was called before AC_USE_SYSTEM_EXTENSIONS". _AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]],[[]])], [gl_cv_compiler_check_decl_option='-Werror=implicit-function-declaration'], [gl_cv_compiler_check_decl_option=none]) ac_compile="$save_ac_compile" else gl_cv_compiler_check_decl_option=none fi ]) if test "x$gl_cv_compiler_check_decl_option" != xnone; then ac_compile_for_check_decl="$ac_compile $gl_cv_compiler_check_decl_option" else ac_compile_for_check_decl="$ac_compile" fi ]) dnl Redefine _AC_CHECK_DECL_BODY so that it references ac_compile_for_check_decl dnl instead of ac_compile. If, for whatever reason, the override of AC_PROG_CC dnl in zzgnulib.m4 is inactive, use the original ac_compile. m4_define([_AC_CHECK_DECL_BODY], [ ac_save_ac_compile="$ac_compile" if test -n "$ac_compile_for_check_decl"; then ac_compile="$ac_compile_for_check_decl" fi] m4_defn([_AC_CHECK_DECL_BODY])[ ac_compile="$ac_save_ac_compile" ]) # gl_00GNULIB # ----------- # Witness macro that this file has been included. Needed to force # Automake to include this file prior to all other gnulib .m4 files. AC_DEFUN([gl_00GNULIB]) pspp-1.4.1/gl/m4/xalloc.m40000644000175000017500000000047213723215637014575 0ustar00blpblp00000000000000# xalloc.m4 serial 18 dnl Copyright (C) 2002-2006, 2009-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_XALLOC], [:]) pspp-1.4.1/gl/m4/getprogname.m40000644000175000017500000000263313723215637015624 0ustar00blpblp00000000000000# getprogname.m4 - check for getprogname or replacements for it # Copyright (C) 2016-2020 Free Software Foundation, Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 4 AC_DEFUN([gl_FUNC_GETPROGNAME], [ AC_CHECK_FUNCS_ONCE([getprogname getexecname]) AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS]) ac_found=0 AC_CHECK_DECLS([program_invocation_name], [ac_found=1], [], [#include ]) AC_CHECK_DECLS([program_invocation_short_name], [ac_found=1], [], [#include ]) AC_CHECK_DECLS([__argv], [ac_found=1], [], [#include ]) # Incur the cost of this test only if none of the above worked. if test $ac_found = 0; then # On OpenBSD 5.1, using the global __progname variable appears to be # the only way to implement getprogname. AC_CACHE_CHECK([whether __progname is defined in default libraries], [gl_cv_var___progname], [ gl_cv_var___progname= AC_LINK_IFELSE( [AC_LANG_PROGRAM( [[extern char *__progname;]], [[return *__progname;]] )], [gl_cv_var___progname=yes] ) ] ) if test "$gl_cv_var___progname" = yes; then AC_DEFINE([HAVE_VAR___PROGNAME], 1, [Define if you have a global __progname variable]) fi fi ]) pspp-1.4.1/gl/m4/tzset.m40000644000175000017500000000111713723215637014461 0ustar00blpblp00000000000000# serial 14 # Copyright (C) 2003, 2007, 2009-2020 Free Software Foundation, Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # Written by Paul Eggert and Jim Meyering. AC_DEFUN([gl_FUNC_TZSET], [ AC_REQUIRE([gl_HEADER_TIME_H_DEFAULTS]) AC_REQUIRE([AC_CANONICAL_HOST]) AC_CHECK_FUNCS_ONCE([tzset]) if test $ac_cv_func_tzset = no; then HAVE_TZSET=0 fi REPLACE_TZSET=0 case "$host_os" in mingw*) REPLACE_TZSET=1 ;; esac ]) pspp-1.4.1/gl/m4/locale_h.m40000644000175000017500000001243313723215637015061 0ustar00blpblp00000000000000# locale_h.m4 serial 24 dnl Copyright (C) 2007, 2009-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_LOCALE_H], [ dnl Use AC_REQUIRE here, so that the default behavior below is expanded dnl once only, before all statements that occur in other macros. AC_REQUIRE([gl_LOCALE_H_DEFAULTS]) dnl Persuade glibc to define locale_t and the int_p_*, int_n_* dnl members of 'struct lconv'. AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS]) dnl If is replaced, then must also be replaced. AC_REQUIRE([gl_STDDEF_H]) AC_REQUIRE([gl_LOCALE_T]) dnl Solaris 11.0 defines the int_p_*, int_n_* members of 'struct lconv' dnl only if _LCONV_C99 is defined. AC_REQUIRE([AC_CANONICAL_HOST]) case "$host_os" in solaris*) AC_DEFINE([_LCONV_C99], [1], [Define to 1 on Solaris.]) ;; esac AC_CACHE_CHECK([whether locale.h conforms to POSIX:2001], [gl_cv_header_locale_h_posix2001], [AC_COMPILE_IFELSE( [AC_LANG_PROGRAM( [[#include int x = LC_MESSAGES; int y = sizeof (((struct lconv *) 0)->decimal_point);]], [[]])], [gl_cv_header_locale_h_posix2001=yes], [gl_cv_header_locale_h_posix2001=no])]) dnl Check whether 'struct lconv' is complete. dnl Bionic libc's 'struct lconv' is just a dummy. dnl On OpenBSD 4.9, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 9, Cygwin 1.5.x, dnl mingw, MSVC 9, it lacks the int_p_* and int_n_* members. AC_CACHE_CHECK([whether struct lconv is properly defined], [gl_cv_sys_struct_lconv_ok], [AC_COMPILE_IFELSE( [AC_LANG_PROGRAM( [[#include struct lconv l; int x = sizeof (l.decimal_point); int y = sizeof (l.int_p_cs_precedes);]], [[]])], [gl_cv_sys_struct_lconv_ok=yes], [gl_cv_sys_struct_lconv_ok=no]) ]) if test $gl_cv_sys_struct_lconv_ok = no; then dnl On native Windows with MSVC, merely define these member names as macros. dnl This avoids trouble in C++ mode. case "$host_os" in mingw*) AC_EGREP_CPP([Special], [ #ifdef _MSC_VER Special #endif ], [], [REPLACE_STRUCT_LCONV=1]) ;; *) REPLACE_STRUCT_LCONV=1 ;; esac fi dnl is always overridden, because of GNULIB_POSIXCHECK. gl_NEXT_HEADERS([locale.h]) dnl Check for declarations of anything we want to poison if the dnl corresponding gnulib module is not in use. gl_WARN_ON_USE_PREPARE([[#include /* Some systems provide declarations in a non-standard header. */ #if HAVE_XLOCALE_H # include #endif ]], [setlocale newlocale duplocale freelocale]) ]) dnl Checks to determine whether the system has the locale_t type, dnl and how to obtain it. AC_DEFUN([gl_LOCALE_T], [ dnl Persuade glibc and Solaris to define locale_t. AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS]) dnl Check whether use of locale_t requires inclusion of , dnl e.g. on Mac OS X 10.5. If does not define locale_t by dnl itself, we assume that will do so. AC_CACHE_CHECK([whether locale.h defines locale_t], [gl_cv_header_locale_has_locale_t], [AC_COMPILE_IFELSE( [AC_LANG_PROGRAM( [[#include locale_t x;]], [[]])], [gl_cv_header_locale_has_locale_t=yes], [gl_cv_header_locale_has_locale_t=no]) ]) dnl Check for . AC_CHECK_HEADERS_ONCE([xlocale.h]) if test $ac_cv_header_xlocale_h = yes; then HAVE_XLOCALE_H=1 if test $gl_cv_header_locale_has_locale_t = yes; then gl_cv_header_locale_h_needs_xlocale_h=no else gl_cv_header_locale_h_needs_xlocale_h=yes fi HAVE_LOCALE_T=1 else HAVE_XLOCALE_H=0 gl_cv_header_locale_h_needs_xlocale_h=no if test $gl_cv_header_locale_has_locale_t = yes; then HAVE_LOCALE_T=1 else HAVE_LOCALE_T=0 fi fi AC_SUBST([HAVE_XLOCALE_H]) ]) AC_DEFUN([gl_LOCALE_MODULE_INDICATOR], [ dnl Use AC_REQUIRE here, so that the default settings are expanded once only. AC_REQUIRE([gl_LOCALE_H_DEFAULTS]) gl_MODULE_INDICATOR_SET_VARIABLE([$1]) dnl Define it also as a C macro, for the benefit of the unit tests. gl_MODULE_INDICATOR_FOR_TESTS([$1]) ]) AC_DEFUN([gl_LOCALE_H_DEFAULTS], [ GNULIB_LOCALECONV=0; AC_SUBST([GNULIB_LOCALECONV]) GNULIB_SETLOCALE=0; AC_SUBST([GNULIB_SETLOCALE]) GNULIB_SETLOCALE_NULL=0; AC_SUBST([GNULIB_SETLOCALE_NULL]) GNULIB_DUPLOCALE=0; AC_SUBST([GNULIB_DUPLOCALE]) GNULIB_LOCALENAME=0; AC_SUBST([GNULIB_LOCALENAME]) dnl Assume proper GNU behavior unless another module says otherwise. HAVE_NEWLOCALE=1; AC_SUBST([HAVE_NEWLOCALE]) HAVE_DUPLOCALE=1; AC_SUBST([HAVE_DUPLOCALE]) HAVE_FREELOCALE=1; AC_SUBST([HAVE_FREELOCALE]) REPLACE_LOCALECONV=0; AC_SUBST([REPLACE_LOCALECONV]) REPLACE_SETLOCALE=0; AC_SUBST([REPLACE_SETLOCALE]) REPLACE_NEWLOCALE=0; AC_SUBST([REPLACE_NEWLOCALE]) REPLACE_DUPLOCALE=0; AC_SUBST([REPLACE_DUPLOCALE]) REPLACE_FREELOCALE=0; AC_SUBST([REPLACE_FREELOCALE]) REPLACE_STRUCT_LCONV=0; AC_SUBST([REPLACE_STRUCT_LCONV]) ]) pspp-1.4.1/gl/m4/xvasprintf.m40000644000175000017500000000054313723215637015516 0ustar00blpblp00000000000000# xvasprintf.m4 serial 2 dnl Copyright (C) 2006, 2009-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl Prerequisites of lib/xvasprintf.c. AC_DEFUN([gl_XVASPRINTF], [:]) pspp-1.4.1/gl/m4/strerror.m40000644000175000017500000000717113723215637015200 0ustar00blpblp00000000000000# strerror.m4 serial 21 dnl Copyright (C) 2002, 2007-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_FUNC_STRERROR], [ AC_REQUIRE([gl_HEADER_STRING_H_DEFAULTS]) AC_REQUIRE([gl_HEADER_ERRNO_H]) AC_REQUIRE([gl_FUNC_STRERROR_0]) AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles m4_ifdef([gl_FUNC_STRERROR_R_WORKS], [ AC_REQUIRE([gl_FUNC_STRERROR_R_WORKS]) ]) if test "$ERRNO_H:$REPLACE_STRERROR_0" = :0; then AC_CACHE_CHECK([for working strerror function], [gl_cv_func_working_strerror], [AC_RUN_IFELSE( [AC_LANG_PROGRAM( [[#include ]], [[if (!*strerror (-2)) return 1;]])], [gl_cv_func_working_strerror=yes], [gl_cv_func_working_strerror=no], [case "$host_os" in # Guess yes on glibc systems. *-gnu* | gnu*) gl_cv_func_working_strerror="guessing yes" ;; # Guess yes on musl systems. *-musl*) gl_cv_func_working_strerror="guessing yes" ;; # If we don't know, obey --enable-cross-guesses. *) gl_cv_func_working_strerror="$gl_cross_guess_normal" ;; esac ]) ]) case "$gl_cv_func_working_strerror" in *yes) ;; *) dnl The system's strerror() fails to return a string for out-of-range dnl integers. Replace it. REPLACE_STRERROR=1 ;; esac m4_ifdef([gl_FUNC_STRERROR_R_WORKS], [ dnl If the system's strerror_r or __xpg_strerror_r clobbers strerror's dnl buffer, we must replace strerror. case "$gl_cv_func_strerror_r_works" in *no) REPLACE_STRERROR=1 ;; esac ]) else dnl The system's strerror() cannot know about the new errno values we add dnl to , or any fix for strerror(0). Replace it. REPLACE_STRERROR=1 fi ]) dnl Detect if strerror(0) passes (that is, does not set errno, and does not dnl return a string that matches strerror(-1)). AC_DEFUN([gl_FUNC_STRERROR_0], [ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles REPLACE_STRERROR_0=0 AC_CACHE_CHECK([whether strerror(0) succeeds], [gl_cv_func_strerror_0_works], [AC_RUN_IFELSE( [AC_LANG_PROGRAM( [[#include #include ]], [[int result = 0; char *str; errno = 0; str = strerror (0); if (!*str) result |= 1; if (errno) result |= 2; if (strstr (str, "nknown") || strstr (str, "ndefined")) result |= 4; return result;]])], [gl_cv_func_strerror_0_works=yes], [gl_cv_func_strerror_0_works=no], [case "$host_os" in # Guess yes on glibc systems. *-gnu* | gnu*) gl_cv_func_strerror_0_works="guessing yes" ;; # Guess yes on musl systems. *-musl*) gl_cv_func_strerror_0_works="guessing yes" ;; # Guess yes on native Windows. mingw*) gl_cv_func_strerror_0_works="guessing yes" ;; # If we don't know, obey --enable-cross-guesses. *) gl_cv_func_strerror_0_works="$gl_cross_guess_normal" ;; esac ]) ]) case "$gl_cv_func_strerror_0_works" in *yes) ;; *) REPLACE_STRERROR_0=1 AC_DEFINE([REPLACE_STRERROR_0], [1], [Define to 1 if strerror(0) does not return a message implying success.]) ;; esac ]) pspp-1.4.1/gl/m4/sys_time_h.m40000644000175000017500000000734113723215637015460 0ustar00blpblp00000000000000# Configure a replacement for . # serial 9 # Copyright (C) 2007, 2009-2020 Free Software Foundation, Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # Written by Paul Eggert and Martin Lambers. AC_DEFUN([gl_HEADER_SYS_TIME_H], [ dnl Use AC_REQUIRE here, so that the REPLACE_GETTIMEOFDAY=0 statement dnl below is expanded once only, before all REPLACE_GETTIMEOFDAY=1 dnl statements that occur in other macros. AC_REQUIRE([gl_HEADER_SYS_TIME_H_BODY]) ]) AC_DEFUN([gl_HEADER_SYS_TIME_H_BODY], [ AC_REQUIRE([AC_C_RESTRICT]) AC_REQUIRE([gl_HEADER_SYS_TIME_H_DEFAULTS]) AC_CHECK_HEADERS_ONCE([sys/time.h]) gl_CHECK_NEXT_HEADERS([sys/time.h]) if test $ac_cv_header_sys_time_h != yes; then HAVE_SYS_TIME_H=0 fi dnl On native Windows with MSVC, 'struct timeval' is defined in dnl only. So include that header in the list. gl_PREREQ_SYS_H_WINSOCK2 AC_CACHE_CHECK([for struct timeval], [gl_cv_sys_struct_timeval], [AC_COMPILE_IFELSE( [AC_LANG_PROGRAM( [[#if HAVE_SYS_TIME_H #include #endif #include #if HAVE_WINSOCK2_H # include #endif ]], [[static struct timeval x; x.tv_sec = x.tv_usec;]])], [gl_cv_sys_struct_timeval=yes], [gl_cv_sys_struct_timeval=no]) ]) if test $gl_cv_sys_struct_timeval != yes; then HAVE_STRUCT_TIMEVAL=0 else dnl On native Windows with a 64-bit 'time_t', 'struct timeval' is defined dnl (in and for mingw64, in only dnl for MSVC) with a tv_sec field of type 'long' (32-bit!), which is dnl smaller than the 'time_t' type mandated by POSIX. dnl On OpenBSD 5.1 amd64, tv_sec is 64 bits and time_t 32 bits, but dnl that is good enough. AC_CACHE_CHECK([for wide-enough struct timeval.tv_sec member], [gl_cv_sys_struct_timeval_tv_sec], [AC_COMPILE_IFELSE( [AC_LANG_PROGRAM( [[#if HAVE_SYS_TIME_H #include #endif #include #if HAVE_WINSOCK2_H # include #endif ]], [[static struct timeval x; typedef int verify_tv_sec_type[ sizeof (time_t) <= sizeof x.tv_sec ? 1 : -1 ]; ]])], [gl_cv_sys_struct_timeval_tv_sec=yes], [gl_cv_sys_struct_timeval_tv_sec=no]) ]) if test $gl_cv_sys_struct_timeval_tv_sec != yes; then REPLACE_STRUCT_TIMEVAL=1 fi fi dnl Check for declarations of anything we want to poison if the dnl corresponding gnulib module is not in use. gl_WARN_ON_USE_PREPARE([[ #if HAVE_SYS_TIME_H # include #endif #include ]], [gettimeofday]) ]) AC_DEFUN([gl_SYS_TIME_MODULE_INDICATOR], [ dnl Use AC_REQUIRE here, so that the default settings are expanded once only. AC_REQUIRE([gl_HEADER_SYS_TIME_H_DEFAULTS]) gl_MODULE_INDICATOR_SET_VARIABLE([$1]) dnl Define it also as a C macro, for the benefit of the unit tests. gl_MODULE_INDICATOR_FOR_TESTS([$1]) ]) AC_DEFUN([gl_HEADER_SYS_TIME_H_DEFAULTS], [ GNULIB_GETTIMEOFDAY=0; AC_SUBST([GNULIB_GETTIMEOFDAY]) dnl Assume POSIX behavior unless another module says otherwise. HAVE_GETTIMEOFDAY=1; AC_SUBST([HAVE_GETTIMEOFDAY]) HAVE_STRUCT_TIMEVAL=1; AC_SUBST([HAVE_STRUCT_TIMEVAL]) HAVE_SYS_TIME_H=1; AC_SUBST([HAVE_SYS_TIME_H]) REPLACE_GETTIMEOFDAY=0; AC_SUBST([REPLACE_GETTIMEOFDAY]) REPLACE_STRUCT_TIMEVAL=0; AC_SUBST([REPLACE_STRUCT_TIMEVAL]) ]) pspp-1.4.1/gl/m4/gnulib-comp.m40000644000175000017500000016031313723556171015531 0ustar00blpblp00000000000000# DO NOT EDIT! GENERATED AUTOMATICALLY! # Copyright (C) 2002-2020 Free Software Foundation, Inc. # # This file 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 3 of the License, or # (at your option) any later version. # # This file 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 file. If not, see . # # As a special exception to the GNU General Public License, # this file may be distributed as part of a program that # contains a configuration script generated by Autoconf, under # the same distribution terms as the rest of that program. # # Generated by gnulib-tool. # # This file represents the compiled summary of the specification in # gnulib-cache.m4. It lists the computed macro invocations that need # to be invoked from configure.ac. # In projects that use version control, this file can be treated like # other built files. # This macro should be invoked from ./configure.ac, in the section # "Checks for programs", right after AC_PROG_CC, and certainly before # any checks for libraries, header files, types and library functions. AC_DEFUN([gl_EARLY], [ m4_pattern_forbid([^gl_[A-Z]])dnl the gnulib macro namespace m4_pattern_allow([^gl_ES$])dnl a valid locale name m4_pattern_allow([^gl_LIBOBJS$])dnl a variable m4_pattern_allow([^gl_LTLIBOBJS$])dnl a variable # Pre-early section. AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS]) AC_REQUIRE([gl_PROG_AR_RANLIB]) AC_REQUIRE([AM_PROG_CC_C_O]) # Code from module absolute-header: # Code from module alloca: # Code from module alloca-opt: # Code from module allocator: # Code from module areadlink: # Code from module array-mergesort: # Code from module assert: # Code from module asyncsafe-spin: # Code from module attribute: # Code from module basename-lgpl: # Code from module binary-io: # Code from module btowc: # Code from module builtin-expect: # Code from module byteswap: # Code from module c-ctype: # Code from module c-snprintf: # Code from module c-strcase: # Code from module c-strcasestr: # Code from module c-strtod: # Code from module c-vasnprintf: # Code from module c-vasprintf: # Code from module c-xvasprintf: # Code from module c99: # Code from module canonicalize-lgpl: # Code from module careadlinkat: # Code from module chdir: # Code from module clean-temp: # Code from module clock-time: # Code from module cloexec: # Code from module close: # Code from module configmake: # Code from module count-leading-zeros: # Code from module count-one-bits: # Code from module crc: # Code from module crypto/md4: # Code from module crypto/rijndael: # Code from module dirname: # Code from module dirname-lgpl: # Code from module double-slash-root: # Code from module dtoastr: # Code from module dtotimespec: # Code from module dup2: # Code from module environ: # Code from module errno: # Code from module error: # Code from module exitfail: # Code from module explicit_bzero: # Code from module extensions: # Code from module extern-inline: # Code from module fatal-signal: # Code from module fcntl: # Code from module fcntl-h: # Code from module fd-hook: # Code from module filename: # Code from module flexmember: # Code from module float: # Code from module floor: # Code from module fopen: # Code from module fopen-gnu: # Code from module fpieee: AC_REQUIRE([gl_FP_IEEE]) # Code from module fprintf-posix: # Code from module fpucw: # Code from module frexp-nolibm: # Code from module frexpl-nolibm: # Code from module fseek: # Code from module fseeko: AC_REQUIRE([gl_SET_LARGEFILE_SOURCE]) # Code from module fseterr: # Code from module fstat: # Code from module ftell: # Code from module ftello: AC_REQUIRE([gl_SET_LARGEFILE_SOURCE]) # Code from module full-read: # Code from module full-write: # Code from module fwriteerror: # Code from module getdelim: # Code from module getdtablesize: # Code from module getline: # Code from module getopt-gnu: # Code from module getopt-posix: # Code from module getpass: # Code from module getprogname: # Code from module getrandom: # Code from module gettext-h: # Code from module gettime: # Code from module gettimeofday: # Code from module gitlog-to-changelog: # Code from module gperf: # Code from module hard-locale: # Code from module include_next: # Code from module inline: # Code from module intprops: # Code from module inttostr: # Code from module inttypes-incomplete: # Code from module isfinite: # Code from module isinf: # Code from module isnan: # Code from module isnand: # Code from module isnand-nolibm: # Code from module isnanf: # Code from module isnanf-nolibm: # Code from module isnanl: # Code from module isnanl-nolibm: # Code from module iswblank: # Code from module iswdigit: # Code from module iswxdigit: # Code from module langinfo: # Code from module largefile: AC_REQUIRE([AC_SYS_LARGEFILE]) # Code from module libc-config: # Code from module limits-h: # Code from module linked-list: # Code from module linkedhash-list: # Code from module list: # Code from module localcharset: # Code from module locale: # Code from module localeconv: # Code from module localename: # Code from module lock: # Code from module lseek: # Code from module lstat: # Code from module malloc-posix: # Code from module malloca: # Code from module math: # Code from module mbchar: # Code from module mbiter: # Code from module mbrtowc: # Code from module mbsinit: # Code from module mbtowc: # Code from module memcasecmp: # Code from module memchr: # Code from module memchr2: # Code from module memmem: # Code from module memmem-simple: # Code from module mempcpy: # Code from module memrchr: # Code from module minmax: # Code from module mkdir: # Code from module mkdtemp: # Code from module mkstemp: # Code from module mktime: # Code from module mktime-internal: # Code from module msvc-inval: # Code from module msvc-nothrow: # Code from module multiarch: # Code from module nl_langinfo: # Code from module nocrash: # Code from module nstrftime: # Code from module open: # Code from module pathmax: # Code from module pipe2: # Code from module printf-frexp: # Code from module printf-frexpl: # Code from module printf-posix: # Code from module printf-safe: # Code from module progname: # Code from module raise: # Code from module rawmemchr: # Code from module read: # Code from module read-file: # Code from module readlink: # Code from module realloc-posix: # Code from module regex: # Code from module relocatable-prog: # Code from module relocatable-prog-wrapper: AC_REQUIRE([AC_SYS_LARGEFILE]) # Code from module rename: # Code from module rmdir: # Code from module round: # Code from module safe-read: # Code from module safe-write: # Code from module same-inode: # Code from module secure_getenv: # Code from module select: # Code from module setenv: # Code from module setlocale-null: # Code from module sigaction: # Code from module signal-h: # Code from module signbit: # Code from module sigprocmask: # Code from module size_max: # Code from module snippet/_Noreturn: # Code from module snippet/arg-nonnull: # Code from module snippet/c++defs: # Code from module snippet/unused-parameter: # Code from module snippet/warn-on-use: # Code from module snprintf: # Code from module snprintf-posix: # Code from module socketlib: # Code from module sockets: # Code from module socklen: # Code from module sprintf-posix: # Code from module ssize_t: # Code from module stat: # Code from module stat-time: # Code from module std-gnu11: # Code from module stdalign: # Code from module stdarg: dnl Some compilers (e.g., AIX 5.3 cc) need to be in c99 mode dnl for the builtin va_copy to work. gl_PROG_CC_C99 arranges for this. gl_PROG_CC_C99 # Code from module stdbool: # Code from module stddef: # Code from module stdint: # Code from module stdio: # Code from module stdlib: # Code from module stpcpy: # Code from module strcase: # Code from module strcasestr: # Code from module strcasestr-simple: # Code from module strdup-posix: # Code from module streq: # Code from module strerror: # Code from module strerror-override: # Code from module string: # Code from module strings: # Code from module strncat: # Code from module strndup: # Code from module strnlen: # Code from module strsep: # Code from module strtod: # Code from module strtok_r: # Code from module sys_random: # Code from module sys_select: # Code from module sys_socket: # Code from module sys_stat: # Code from module sys_time: # Code from module sys_types: # Code from module sys_uio: # Code from module tempname: # Code from module termios: # Code from module thread-optim: # Code from module threadlib: gl_THREADLIB_EARLY # Code from module time: # Code from module time_r: # Code from module time_rz: # Code from module timegm: # Code from module timespec: # Code from module timespec-add: # Code from module timespec-sub: # Code from module tmpdir: # Code from module trunc: # Code from module tzset: # Code from module unicase/base: # Code from module unicase/cased: # Code from module unicase/empty-prefix-context: # Code from module unicase/empty-suffix-context: # Code from module unicase/ignorable: # Code from module unicase/special-casing: # Code from module unicase/tocasefold: # Code from module unicase/tolower: # Code from module unicase/totitle: # Code from module unicase/toupper: # Code from module unicase/u8-casecmp: # Code from module unicase/u8-casefold: # Code from module unicase/u8-casemap: # Code from module unicase/u8-ct-casefold: # Code from module unicase/u8-ct-totitle: # Code from module unicase/u8-tolower: # Code from module unicase/u8-totitle: # Code from module unicase/u8-toupper: # Code from module unictype/base: # Code from module unictype/category-none: # Code from module unictype/category-of: # Code from module unictype/combining-class: # Code from module unictype/ctype-print: # Code from module unictype/property-soft-dotted: # Code from module unigbrk/base: # Code from module unigbrk/uc-gbrk-prop: # Code from module unigbrk/uc-is-grapheme-break: # Code from module unilbrk/base: # Code from module unilbrk/tables: # Code from module unilbrk/u8-possible-linebreaks: # Code from module uninorm/base: # Code from module uninorm/canonical-decomposition: # Code from module uninorm/compat-decomposition: # Code from module uninorm/decompose-internal: # Code from module uninorm/decomposing-form: # Code from module uninorm/decomposition: # Code from module uninorm/decomposition-table: # Code from module uninorm/nfd: # Code from module uninorm/nfkd: # Code from module uninorm/u8-normalize: # Code from module unistd: # Code from module unistr/base: # Code from module unistr/u8-check: # Code from module unistr/u8-cmp: # Code from module unistr/u8-cmp2: # Code from module unistr/u8-cpy: # Code from module unistr/u8-mblen: # Code from module unistr/u8-mbtouc: # Code from module unistr/u8-mbtouc-unsafe: # Code from module unistr/u8-mbtoucr: # Code from module unistr/u8-strlen: # Code from module unistr/u8-strmbtouc: # Code from module unistr/u8-strncat: # Code from module unistr/u8-uctomb: # Code from module unitypes: # Code from module uniwbrk/base: # Code from module uniwbrk/table: # Code from module uniwbrk/u8-wordbreaks: # Code from module uniwbrk/wordbreak-property: # Code from module uniwidth/base: # Code from module uniwidth/u8-strwidth: # Code from module uniwidth/u8-width: # Code from module uniwidth/width: # Code from module unlocked-io: # Code from module unsetenv: # Code from module vasnprintf: # Code from module vasprintf: # Code from module vasprintf-posix: # Code from module verify: # Code from module version-etc: # Code from module version-etc-fsf: # Code from module vfprintf-posix: # Code from module vprintf-posix: # Code from module vsnprintf: # Code from module vsnprintf-posix: # Code from module vsprintf-posix: # Code from module wchar: # Code from module wcrtomb: # Code from module wctype-h: # Code from module wcwidth: # Code from module windows-mutex: # Code from module windows-once: # Code from module windows-recmutex: # Code from module windows-rwlock: # Code from module windows-spin: # Code from module write: # Code from module xalloc: # Code from module xalloc-die: # Code from module xalloc-oversized: # Code from module xbinary-io: # Code from module xlist: # Code from module xmalloca: # Code from module xmemdup0: # Code from module xreadlink: # Code from module xsize: # Code from module xstrndup: # Code from module xvasprintf: ]) # This macro should be invoked from ./configure.ac, in the section # "Check for header files, types and library functions". AC_DEFUN([gl_INIT], [ AM_CONDITIONAL([GL_COND_LIBTOOL], [true]) gl_cond_libtool=true gl_m4_base='gl/m4' m4_pushdef([AC_LIBOBJ], m4_defn([gl_LIBOBJ])) m4_pushdef([AC_REPLACE_FUNCS], m4_defn([gl_REPLACE_FUNCS])) m4_pushdef([AC_LIBSOURCES], m4_defn([gl_LIBSOURCES])) m4_pushdef([gl_LIBSOURCES_LIST], []) m4_pushdef([gl_LIBSOURCES_DIR], []) gl_COMMON gl_source_base='gl' changequote(,)dnl LTALLOCA=`echo "$ALLOCA" | sed -e 's/\.[^.]* /.lo /g;s/\.[^.]*$/.lo/'` changequote([, ])dnl AC_SUBST([LTALLOCA]) gl_FUNC_ALLOCA gl_ASSERT AC_REQUIRE([AC_C_INLINE]) AC_CHECK_HEADERS_ONCE([pthread.h]) gl_FUNC_BTOWC if test $HAVE_BTOWC = 0 || test $REPLACE_BTOWC = 1; then AC_LIBOBJ([btowc]) gl_PREREQ_BTOWC fi gl_WCHAR_MODULE_INDICATOR([btowc]) gl___BUILTIN_EXPECT gl_BYTESWAP AC_REQUIRE([AC_C_RESTRICT]) gl_C_STRTOD AC_REQUIRE([AC_C_RESTRICT]) gl_PREREQ_VASNPRINTF_WITH_EXTRAS gl_CANONICALIZE_LGPL if test $HAVE_CANONICALIZE_FILE_NAME = 0 || test $REPLACE_CANONICALIZE_FILE_NAME = 1; then AC_LIBOBJ([canonicalize-lgpl]) fi gl_MODULE_INDICATOR([canonicalize-lgpl]) gl_STDLIB_MODULE_INDICATOR([canonicalize_file_name]) gl_STDLIB_MODULE_INDICATOR([realpath]) AC_REQUIRE([AC_C_RESTRICT]) AC_CHECK_FUNCS_ONCE([readlinkat]) gl_UNISTD_MODULE_INDICATOR([chdir]) AC_DEFINE([SIGNAL_SAFE_LIST], [1], [Define if lists must be signal-safe.]) gl_CLOCK_TIME gl_MODULE_INDICATOR_FOR_TESTS([cloexec]) gl_FUNC_CLOSE if test $REPLACE_CLOSE = 1; then AC_LIBOBJ([close]) fi gl_UNISTD_MODULE_INDICATOR([close]) gl_CONFIGMAKE_PREP AC_REQUIRE([AC_C_RESTRICT]) gl_MD4 AC_REQUIRE([AC_C_RESTRICT]) gl_MODULE_INDICATOR([dirname]) gl_DOUBLE_SLASH_ROOT gl_FUNC_DUP2 if test $REPLACE_DUP2 = 1; then AC_LIBOBJ([dup2]) gl_PREREQ_DUP2 fi gl_UNISTD_MODULE_INDICATOR([dup2]) gl_ENVIRON gl_UNISTD_MODULE_INDICATOR([environ]) gl_HEADER_ERRNO_H gl_ERROR if test $ac_cv_lib_error_at_line = no; then AC_LIBOBJ([error]) gl_PREREQ_ERROR fi m4_ifdef([AM_XGETTEXT_OPTION], [AM_][XGETTEXT_OPTION([--flag=error:3:c-format]) AM_][XGETTEXT_OPTION([--flag=error_at_line:5:c-format])]) gl_FUNC_EXPLICIT_BZERO if test $HAVE_EXPLICIT_BZERO = 0; then AC_LIBOBJ([explicit_bzero]) gl_PREREQ_EXPLICIT_BZERO fi gl_STRING_MODULE_INDICATOR([explicit_bzero]) AC_REQUIRE([gl_EXTERN_INLINE]) gl_FATAL_SIGNAL gl_FUNC_FCNTL if test $HAVE_FCNTL = 0 || test $REPLACE_FCNTL = 1; then AC_LIBOBJ([fcntl]) fi gl_FCNTL_MODULE_INDICATOR([fcntl]) gl_FCNTL_H AC_C_FLEXIBLE_ARRAY_MEMBER gl_FLOAT_H if test $REPLACE_FLOAT_LDBL = 1; then AC_LIBOBJ([float]) fi if test $REPLACE_ITOLD = 1; then AC_LIBOBJ([itold]) fi AC_REQUIRE([gl_FUNC_FLOOR]) if test $REPLACE_FLOOR = 1; then AC_LIBOBJ([floor]) fi gl_MATH_MODULE_INDICATOR([floor]) gl_FUNC_FOPEN if test $REPLACE_FOPEN = 1; then AC_LIBOBJ([fopen]) gl_PREREQ_FOPEN fi gl_STDIO_MODULE_INDICATOR([fopen]) gl_FUNC_FOPEN_GNU if test $REPLACE_FOPEN = 1; then AC_LIBOBJ([fopen]) gl_PREREQ_FOPEN fi gl_MODULE_INDICATOR([fopen-gnu]) gl_FUNC_FPRINTF_POSIX gl_STDIO_MODULE_INDICATOR([fprintf-posix]) gl_FUNC_FREXP_NO_LIBM if test $gl_func_frexp_no_libm != yes; then AC_LIBOBJ([frexp]) fi gl_MATH_MODULE_INDICATOR([frexp]) gl_FUNC_FREXPL_NO_LIBM if test $HAVE_DECL_FREXPL = 0 || test $gl_func_frexpl_no_libm = no; then AC_LIBOBJ([frexpl]) fi gl_MATH_MODULE_INDICATOR([frexpl]) gl_FUNC_FSEEK if test $REPLACE_FSEEK = 1; then AC_LIBOBJ([fseek]) fi gl_STDIO_MODULE_INDICATOR([fseek]) gl_FUNC_FSEEKO if test $HAVE_FSEEKO = 0 || test $REPLACE_FSEEKO = 1; then AC_LIBOBJ([fseeko]) gl_PREREQ_FSEEKO fi gl_STDIO_MODULE_INDICATOR([fseeko]) gl_FUNC_FSETERR if test $ac_cv_func___fseterr = no; then AC_LIBOBJ([fseterr]) fi gl_FUNC_FSTAT if test $REPLACE_FSTAT = 1; then AC_LIBOBJ([fstat]) case "$host_os" in mingw*) AC_LIBOBJ([stat-w32]) ;; esac gl_PREREQ_FSTAT fi gl_SYS_STAT_MODULE_INDICATOR([fstat]) gl_FUNC_FTELL if test $REPLACE_FTELL = 1; then AC_LIBOBJ([ftell]) fi gl_STDIO_MODULE_INDICATOR([ftell]) gl_FUNC_FTELLO if test $HAVE_FTELLO = 0 || test $REPLACE_FTELLO = 1; then AC_LIBOBJ([ftello]) gl_PREREQ_FTELLO fi gl_STDIO_MODULE_INDICATOR([ftello]) gl_MODULE_INDICATOR([fwriteerror]) gl_FUNC_GETDELIM if test $HAVE_GETDELIM = 0 || test $REPLACE_GETDELIM = 1; then AC_LIBOBJ([getdelim]) gl_PREREQ_GETDELIM fi gl_STDIO_MODULE_INDICATOR([getdelim]) gl_FUNC_GETDTABLESIZE if test $HAVE_GETDTABLESIZE = 0 || test $REPLACE_GETDTABLESIZE = 1; then AC_LIBOBJ([getdtablesize]) gl_PREREQ_GETDTABLESIZE fi gl_UNISTD_MODULE_INDICATOR([getdtablesize]) gl_FUNC_GETLINE if test $REPLACE_GETLINE = 1; then AC_LIBOBJ([getline]) gl_PREREQ_GETLINE fi gl_STDIO_MODULE_INDICATOR([getline]) gl_FUNC_GETOPT_GNU dnl Because of the way gl_FUNC_GETOPT_GNU is implemented (the gl_getopt_required dnl mechanism), there is no need to do any AC_LIBOBJ or AC_SUBST here; they are dnl done in the getopt-posix module. gl_FUNC_GETOPT_POSIX if test $REPLACE_GETOPT = 1; then AC_LIBOBJ([getopt]) AC_LIBOBJ([getopt1]) dnl Arrange for unistd.h to include getopt.h. GNULIB_GL_UNISTD_H_GETOPT=1 fi AC_SUBST([GNULIB_GL_UNISTD_H_GETOPT]) gl_UNISTD_MODULE_INDICATOR([getopt-posix]) gl_FUNC_GETPASS if test $HAVE_GETPASS = 0 || test $REPLACE_GETPASS = 1; then AC_LIBOBJ([getpass]) gl_PREREQ_GETPASS fi gl_UNISTD_MODULE_INDICATOR([getpass]) gl_FUNC_GETPROGNAME AC_REQUIRE([AC_CANONICAL_HOST]) gl_FUNC_GETRANDOM if test $HAVE_GETRANDOM = 0 || test $REPLACE_GETRANDOM = 1; then AC_LIBOBJ([getrandom]) fi gl_SYS_RANDOM_MODULE_INDICATOR([getrandom]) AC_SUBST([LIBINTL]) AC_SUBST([LTLIBINTL]) gl_GETTIME gl_FUNC_GETTIMEOFDAY if test $HAVE_GETTIMEOFDAY = 0 || test $REPLACE_GETTIMEOFDAY = 1; then AC_LIBOBJ([gettimeofday]) gl_PREREQ_GETTIMEOFDAY fi gl_SYS_TIME_MODULE_INDICATOR([gettimeofday]) AC_REQUIRE([gl_FUNC_SETLOCALE_NULL]) LIB_HARD_LOCALE="$LIB_SETLOCALE_NULL" AC_SUBST([LIB_HARD_LOCALE]) gl_INLINE gl_INTTOSTR gl_INTTYPES_INCOMPLETE gl_ISFINITE if test $REPLACE_ISFINITE = 1; then AC_LIBOBJ([isfinite]) fi gl_MATH_MODULE_INDICATOR([isfinite]) gl_ISINF if test $REPLACE_ISINF = 1; then AC_LIBOBJ([isinf]) fi gl_MATH_MODULE_INDICATOR([isinf]) gl_ISNAN gl_MATH_MODULE_INDICATOR([isnan]) gl_FUNC_ISNAND m4_ifdef([gl_ISNAN], [ AC_REQUIRE([gl_ISNAN]) ]) if test $HAVE_ISNAND = 0 || test $REPLACE_ISNAN = 1; then AC_LIBOBJ([isnand]) gl_PREREQ_ISNAND fi gl_MATH_MODULE_INDICATOR([isnand]) gl_FUNC_ISNAND_NO_LIBM if test $gl_func_isnand_no_libm != yes; then AC_LIBOBJ([isnand]) gl_PREREQ_ISNAND fi gl_FUNC_ISNANF m4_ifdef([gl_ISNAN], [ AC_REQUIRE([gl_ISNAN]) ]) if test $HAVE_ISNANF = 0 || test $REPLACE_ISNAN = 1; then AC_LIBOBJ([isnanf]) gl_PREREQ_ISNANF fi gl_MATH_MODULE_INDICATOR([isnanf]) gl_FUNC_ISNANF_NO_LIBM if test $gl_func_isnanf_no_libm != yes; then AC_LIBOBJ([isnanf]) gl_PREREQ_ISNANF fi gl_FUNC_ISNANL m4_ifdef([gl_ISNAN], [ AC_REQUIRE([gl_ISNAN]) ]) if test $HAVE_ISNANL = 0 || test $REPLACE_ISNAN = 1; then AC_LIBOBJ([isnanl]) gl_PREREQ_ISNANL fi gl_MATH_MODULE_INDICATOR([isnanl]) gl_FUNC_ISNANL_NO_LIBM if test $gl_func_isnanl_no_libm != yes; then AC_LIBOBJ([isnanl]) gl_PREREQ_ISNANL fi gl_FUNC_ISWBLANK if test $HAVE_ISWCNTRL = 0 || test $REPLACE_ISWCNTRL = 1; then : else if test $HAVE_ISWBLANK = 0 || test $REPLACE_ISWBLANK = 1; then AC_LIBOBJ([iswblank]) fi fi gl_WCTYPE_MODULE_INDICATOR([iswblank]) gl_FUNC_ISWDIGIT if test $HAVE_ISWCNTRL = 0 || test $REPLACE_ISWCNTRL = 1; then : else if test $REPLACE_ISWDIGIT = 1; then AC_LIBOBJ([iswdigit]) fi fi gl_WCTYPE_MODULE_INDICATOR([iswdigit]) gl_FUNC_ISWXDIGIT if test $HAVE_ISWCNTRL = 0 || test $REPLACE_ISWCNTRL = 1; then : else if test $REPLACE_ISWXDIGIT = 1; then AC_LIBOBJ([iswxdigit]) fi fi gl_WCTYPE_MODULE_INDICATOR([iswxdigit]) gl_LANGINFO_H AC_REQUIRE([gl_LARGEFILE]) gl___INLINE gl_LIMITS_H gl_LOCALCHARSET dnl For backward compatibility. Some packages still use this. LOCALCHARSET_TESTS_ENVIRONMENT= AC_SUBST([LOCALCHARSET_TESTS_ENVIRONMENT]) gl_LOCALE_H gl_FUNC_LOCALECONV if test $REPLACE_LOCALECONV = 1; then AC_LIBOBJ([localeconv]) gl_PREREQ_LOCALECONV fi gl_LOCALE_MODULE_INDICATOR([localeconv]) gl_LOCALENAME gl_LOCALE_MODULE_INDICATOR([localename]) gl_LOCK gl_MODULE_INDICATOR([lock]) gl_FUNC_LSEEK if test $REPLACE_LSEEK = 1; then AC_LIBOBJ([lseek]) fi gl_UNISTD_MODULE_INDICATOR([lseek]) gl_FUNC_LSTAT if test $REPLACE_LSTAT = 1; then AC_LIBOBJ([lstat]) gl_PREREQ_LSTAT fi gl_SYS_STAT_MODULE_INDICATOR([lstat]) gl_FUNC_MALLOC_POSIX if test $REPLACE_MALLOC = 1; then AC_LIBOBJ([malloc]) fi gl_STDLIB_MODULE_INDICATOR([malloc-posix]) gl_MALLOCA gl_MATH_H gl_MBCHAR gl_MBITER gl_FUNC_MBRTOWC if test $HAVE_MBRTOWC = 0 || test $REPLACE_MBRTOWC = 1; then AC_LIBOBJ([mbrtowc]) if test $REPLACE_MBSTATE_T = 1; then AC_LIBOBJ([lc-charset-dispatch]) AC_LIBOBJ([mbtowc-lock]) gl_PREREQ_MBTOWC_LOCK fi gl_PREREQ_MBRTOWC fi gl_WCHAR_MODULE_INDICATOR([mbrtowc]) gl_FUNC_MBSINIT if test $HAVE_MBSINIT = 0 || test $REPLACE_MBSINIT = 1; then AC_LIBOBJ([mbsinit]) gl_PREREQ_MBSINIT fi gl_WCHAR_MODULE_INDICATOR([mbsinit]) gl_FUNC_MBTOWC if test $HAVE_MBTOWC = 0 || test $REPLACE_MBTOWC = 1; then AC_LIBOBJ([mbtowc]) gl_PREREQ_MBTOWC fi gl_STDLIB_MODULE_INDICATOR([mbtowc]) gl_MEMCASECMP gl_FUNC_MEMCHR if test $REPLACE_MEMCHR = 1; then AC_LIBOBJ([memchr]) gl_PREREQ_MEMCHR fi gl_STRING_MODULE_INDICATOR([memchr]) gl_FUNC_MEMMEM if test $HAVE_MEMMEM = 0 || test $REPLACE_MEMMEM = 1; then AC_LIBOBJ([memmem]) fi gl_FUNC_MEMMEM_SIMPLE if test $HAVE_MEMMEM = 0 || test $REPLACE_MEMMEM = 1; then AC_LIBOBJ([memmem]) fi gl_STRING_MODULE_INDICATOR([memmem]) gl_FUNC_MEMPCPY if test $HAVE_MEMPCPY = 0; then AC_LIBOBJ([mempcpy]) gl_PREREQ_MEMPCPY fi gl_STRING_MODULE_INDICATOR([mempcpy]) gl_FUNC_MEMRCHR if test $ac_cv_func_memrchr = no; then AC_LIBOBJ([memrchr]) gl_PREREQ_MEMRCHR fi gl_STRING_MODULE_INDICATOR([memrchr]) gl_MINMAX gl_FUNC_MKDIR if test $REPLACE_MKDIR = 1; then AC_LIBOBJ([mkdir]) fi gl_FUNC_MKDTEMP if test $HAVE_MKDTEMP = 0; then AC_LIBOBJ([mkdtemp]) gl_PREREQ_MKDTEMP fi gl_STDLIB_MODULE_INDICATOR([mkdtemp]) gl_FUNC_MKSTEMP if test $HAVE_MKSTEMP = 0 || test $REPLACE_MKSTEMP = 1; then AC_LIBOBJ([mkstemp]) gl_PREREQ_MKSTEMP fi gl_STDLIB_MODULE_INDICATOR([mkstemp]) gl_FUNC_MKTIME if test $REPLACE_MKTIME = 1; then AC_LIBOBJ([mktime]) gl_PREREQ_MKTIME fi gl_TIME_MODULE_INDICATOR([mktime]) gl_FUNC_MKTIME_INTERNAL if test $WANT_MKTIME_INTERNAL = 1; then AC_LIBOBJ([mktime]) gl_PREREQ_MKTIME fi AC_REQUIRE([gl_MSVC_INVAL]) if test $HAVE_MSVC_INVALID_PARAMETER_HANDLER = 1; then AC_LIBOBJ([msvc-inval]) fi AC_REQUIRE([gl_MSVC_NOTHROW]) if test $HAVE_MSVC_INVALID_PARAMETER_HANDLER = 1; then AC_LIBOBJ([msvc-nothrow]) fi gl_MODULE_INDICATOR([msvc-nothrow]) gl_MULTIARCH gl_FUNC_NL_LANGINFO if test $HAVE_NL_LANGINFO = 0 || test $REPLACE_NL_LANGINFO = 1; then AC_LIBOBJ([nl_langinfo]) fi gl_LANGINFO_MODULE_INDICATOR([nl_langinfo]) gl_FUNC_GNU_STRFTIME gl_FUNC_OPEN if test $REPLACE_OPEN = 1; then AC_LIBOBJ([open]) gl_PREREQ_OPEN fi gl_FCNTL_MODULE_INDICATOR([open]) gl_PATHMAX gl_FUNC_PIPE2 gl_UNISTD_MODULE_INDICATOR([pipe2]) gl_FUNC_PRINTF_FREXP gl_FUNC_PRINTF_FREXPL gl_FUNC_PRINTF_POSIX gl_STDIO_MODULE_INDICATOR([printf-posix]) m4_divert_text([INIT_PREPARE], [gl_printf_safe=yes]) AC_CHECK_DECLS([program_invocation_name], [], [], [#include ]) AC_CHECK_DECLS([program_invocation_short_name], [], [], [#include ]) gl_FUNC_RAISE if test $HAVE_RAISE = 0 || test $REPLACE_RAISE = 1; then AC_LIBOBJ([raise]) gl_PREREQ_RAISE fi gl_SIGNAL_MODULE_INDICATOR([raise]) gl_FUNC_RAWMEMCHR if test $HAVE_RAWMEMCHR = 0; then AC_LIBOBJ([rawmemchr]) gl_PREREQ_RAWMEMCHR fi gl_STRING_MODULE_INDICATOR([rawmemchr]) gl_FUNC_READ if test $REPLACE_READ = 1; then AC_LIBOBJ([read]) gl_PREREQ_READ fi gl_UNISTD_MODULE_INDICATOR([read]) gl_PREREQ_READ_FILE gl_FUNC_READLINK if test $HAVE_READLINK = 0 || test $REPLACE_READLINK = 1; then AC_LIBOBJ([readlink]) gl_PREREQ_READLINK fi gl_UNISTD_MODULE_INDICATOR([readlink]) gl_FUNC_REALLOC_POSIX if test $REPLACE_REALLOC = 1; then AC_LIBOBJ([realloc]) fi gl_STDLIB_MODULE_INDICATOR([realloc-posix]) gl_REGEX if test $ac_use_included_regex = yes; then AC_LIBOBJ([regex]) gl_PREREQ_REGEX fi gl_RELOCATABLE([$gl_source_base]) if test $RELOCATABLE = yes; then AC_LIBOBJ([progreloc]) AC_LIBOBJ([relocatable]) fi AC_REQUIRE([AC_C_RESTRICT]) gl_FUNC_READLINK_SEPARATE gl_CANONICALIZE_LGPL_SEPARATE gl_MALLOCA gl_RELOCATABLE_LIBRARY gl_FUNC_SETENV_SEPARATE gl_FUNC_RENAME if test $REPLACE_RENAME = 1; then AC_LIBOBJ([rename]) fi gl_STDIO_MODULE_INDICATOR([rename]) gl_FUNC_RMDIR if test $REPLACE_RMDIR = 1; then AC_LIBOBJ([rmdir]) fi gl_UNISTD_MODULE_INDICATOR([rmdir]) gl_FUNC_ROUND if test $HAVE_ROUND = 0 || test $REPLACE_ROUND = 1; then AC_LIBOBJ([round]) fi gl_MATH_MODULE_INDICATOR([round]) gl_PREREQ_SAFE_READ gl_PREREQ_SAFE_WRITE gl_FUNC_SECURE_GETENV if test $HAVE_SECURE_GETENV = 0; then AC_LIBOBJ([secure_getenv]) gl_PREREQ_SECURE_GETENV fi gl_STDLIB_MODULE_INDICATOR([secure_getenv]) gl_FUNC_SELECT if test $REPLACE_SELECT = 1; then AC_LIBOBJ([select]) fi gl_SYS_SELECT_MODULE_INDICATOR([select]) gl_FUNC_SETENV if test $HAVE_SETENV = 0 || test $REPLACE_SETENV = 1; then AC_LIBOBJ([setenv]) fi gl_STDLIB_MODULE_INDICATOR([setenv]) gl_FUNC_SETLOCALE_NULL if test $SETLOCALE_NULL_ALL_MTSAFE = 0 || test $SETLOCALE_NULL_ONE_MTSAFE = 0; then AC_LIBOBJ([setlocale-lock]) gl_PREREQ_SETLOCALE_LOCK fi gl_LOCALE_MODULE_INDICATOR([setlocale_null]) gl_SIGACTION if test $HAVE_SIGACTION = 0; then AC_LIBOBJ([sigaction]) gl_PREREQ_SIGACTION fi gl_SIGNAL_MODULE_INDICATOR([sigaction]) gl_SIGNAL_H gl_SIGNBIT if test $REPLACE_SIGNBIT = 1; then AC_LIBOBJ([signbitf]) AC_LIBOBJ([signbitd]) AC_LIBOBJ([signbitl]) fi gl_MATH_MODULE_INDICATOR([signbit]) gl_SIGNALBLOCKING if test $HAVE_POSIX_SIGNALBLOCKING = 0; then AC_LIBOBJ([sigprocmask]) gl_PREREQ_SIGPROCMASK fi gl_SIGNAL_MODULE_INDICATOR([sigprocmask]) gl_SIZE_MAX gl_FUNC_SNPRINTF gl_STDIO_MODULE_INDICATOR([snprintf]) gl_MODULE_INDICATOR([snprintf]) gl_FUNC_SNPRINTF_POSIX AC_REQUIRE([gl_SOCKETLIB]) AC_REQUIRE([gl_SOCKETS]) gl_TYPE_SOCKLEN_T gl_FUNC_SPRINTF_POSIX gl_STDIO_MODULE_INDICATOR([sprintf-posix]) gt_TYPE_SSIZE_T gl_FUNC_STAT if test $REPLACE_STAT = 1; then AC_LIBOBJ([stat]) case "$host_os" in mingw*) AC_LIBOBJ([stat-w32]) ;; esac gl_PREREQ_STAT fi gl_SYS_STAT_MODULE_INDICATOR([stat]) gl_STAT_TIME gl_STAT_BIRTHTIME gl_STDALIGN_H gl_STDARG_H AM_STDBOOL_H gl_STDDEF_H gl_STDINT_H gl_STDIO_H gl_STDLIB_H gl_FUNC_STPCPY if test $HAVE_STPCPY = 0; then AC_LIBOBJ([stpcpy]) gl_PREREQ_STPCPY fi gl_STRING_MODULE_INDICATOR([stpcpy]) gl_STRCASE if test $HAVE_STRCASECMP = 0; then AC_LIBOBJ([strcasecmp]) gl_PREREQ_STRCASECMP fi if test $HAVE_STRNCASECMP = 0; then AC_LIBOBJ([strncasecmp]) gl_PREREQ_STRNCASECMP fi gl_FUNC_STRCASESTR if test $HAVE_STRCASESTR = 0 || test $REPLACE_STRCASESTR = 1; then AC_LIBOBJ([strcasestr]) gl_PREREQ_STRCASESTR fi gl_FUNC_STRCASESTR_SIMPLE if test $HAVE_STRCASESTR = 0 || test $REPLACE_STRCASESTR = 1; then AC_LIBOBJ([strcasestr]) gl_PREREQ_STRCASESTR fi gl_STRING_MODULE_INDICATOR([strcasestr]) gl_FUNC_STRDUP_POSIX if test $ac_cv_func_strdup = no || test $REPLACE_STRDUP = 1; then AC_LIBOBJ([strdup]) gl_PREREQ_STRDUP fi gl_STRING_MODULE_INDICATOR([strdup]) gl_FUNC_STRERROR if test $REPLACE_STRERROR = 1; then AC_LIBOBJ([strerror]) fi gl_MODULE_INDICATOR([strerror]) gl_STRING_MODULE_INDICATOR([strerror]) AC_REQUIRE([gl_HEADER_ERRNO_H]) AC_REQUIRE([gl_FUNC_STRERROR_0]) if test -n "$ERRNO_H" || test $REPLACE_STRERROR_0 = 1; then AC_LIBOBJ([strerror-override]) gl_PREREQ_SYS_H_WINSOCK2 fi gl_HEADER_STRING_H gl_HEADER_STRINGS_H gl_FUNC_STRNCAT if test $REPLACE_STRNCAT = 1; then AC_LIBOBJ([strncat]) gl_PREREQ_STRNCAT fi gl_STRING_MODULE_INDICATOR([strncat]) gl_FUNC_STRNDUP if test $HAVE_STRNDUP = 0 || test $REPLACE_STRNDUP = 1; then AC_LIBOBJ([strndup]) fi gl_STRING_MODULE_INDICATOR([strndup]) gl_FUNC_STRNLEN if test $HAVE_DECL_STRNLEN = 0 || test $REPLACE_STRNLEN = 1; then AC_LIBOBJ([strnlen]) gl_PREREQ_STRNLEN fi gl_STRING_MODULE_INDICATOR([strnlen]) gl_FUNC_STRSEP if test $HAVE_STRSEP = 0; then AC_LIBOBJ([strsep]) gl_PREREQ_STRSEP fi gl_STRING_MODULE_INDICATOR([strsep]) gl_FUNC_STRTOD if test $HAVE_STRTOD = 0 || test $REPLACE_STRTOD = 1; then AC_LIBOBJ([strtod]) gl_PREREQ_STRTOD fi gl_STDLIB_MODULE_INDICATOR([strtod]) gl_FUNC_STRTOK_R if test $HAVE_STRTOK_R = 0 || test $REPLACE_STRTOK_R = 1; then AC_LIBOBJ([strtok_r]) gl_PREREQ_STRTOK_R fi gl_STRING_MODULE_INDICATOR([strtok_r]) gl_HEADER_SYS_RANDOM AC_PROG_MKDIR_P AC_REQUIRE([gl_HEADER_SYS_SELECT]) AC_PROG_MKDIR_P AC_REQUIRE([gl_HEADER_SYS_SOCKET]) AC_PROG_MKDIR_P gl_HEADER_SYS_STAT_H AC_PROG_MKDIR_P gl_HEADER_SYS_TIME_H AC_PROG_MKDIR_P gl_SYS_TYPES_H AC_PROG_MKDIR_P gl_HEADER_SYS_UIO AC_PROG_MKDIR_P gl_FUNC_GEN_TEMPNAME gl_MODULE_INDICATOR([tempname]) gl_TERMIOS_H AC_CHECK_HEADERS([sys/single_threaded.h]) AC_REQUIRE([gl_THREADLIB]) gl_HEADER_TIME_H gl_TIME_R if test $HAVE_LOCALTIME_R = 0 || test $REPLACE_LOCALTIME_R = 1; then AC_LIBOBJ([time_r]) gl_PREREQ_TIME_R fi gl_TIME_MODULE_INDICATOR([time_r]) gl_TIME_RZ if test $HAVE_TIMEZONE_T = 0; then AC_LIBOBJ([time_rz]) fi gl_TIME_MODULE_INDICATOR([time_rz]) gl_FUNC_TIMEGM if test $HAVE_TIMEGM = 0 || test $REPLACE_TIMEGM = 1; then AC_LIBOBJ([timegm]) gl_PREREQ_TIMEGM fi gl_TIME_MODULE_INDICATOR([timegm]) gl_TIMESPEC gt_TMPDIR gl_FUNC_TRUNC if test $HAVE_DECL_TRUNC = 0 || test $REPLACE_TRUNC = 1; then AC_LIBOBJ([trunc]) fi gl_MATH_MODULE_INDICATOR([trunc]) gl_FUNC_TZSET if test $HAVE_TZSET = 0 || test $REPLACE_TZSET = 1; then AC_LIBOBJ([tzset]) fi gl_TIME_MODULE_INDICATOR([tzset]) gl_LIBUNISTRING_LIBHEADER([0.9.4], [unicase.h]) AC_REQUIRE([AC_C_INLINE]) gl_LIBUNISTRING_MODULE([0.9.1], [unicase/empty-prefix-context]) gl_LIBUNISTRING_MODULE([0.9.1], [unicase/empty-suffix-context]) AC_REQUIRE([AC_C_INLINE]) gl_LIBUNISTRING_MODULE([0.9.8], [unicase/tolower]) gl_LIBUNISTRING_MODULE([0.9.8], [unicase/totitle]) gl_LIBUNISTRING_MODULE([0.9.8], [unicase/toupper]) gl_LIBUNISTRING_MODULE([0.9.8], [unicase/u8-casecmp]) gl_LIBUNISTRING_MODULE([0.9.8], [unicase/u8-casefold]) gl_LIBUNISTRING_MODULE([0.9.8], [unicase/u8-ct-casefold]) gl_LIBUNISTRING_MODULE([0.9.8], [unicase/u8-ct-totitle]) gl_LIBUNISTRING_MODULE([0.9.8], [unicase/u8-tolower]) gl_LIBUNISTRING_MODULE([0.9.8], [unicase/u8-totitle]) gl_LIBUNISTRING_MODULE([0.9.8], [unicase/u8-toupper]) gl_LIBUNISTRING_LIBHEADER([0.9.4], [unictype.h]) gl_LIBUNISTRING_MODULE([0.9.8], [unictype/category-none]) AC_REQUIRE([AC_C_INLINE]) gl_LIBUNISTRING_MODULE([0.9.8], [unictype/category-of]) gl_LIBUNISTRING_MODULE([0.9.8], [unictype/combining-class]) AC_REQUIRE([AC_C_INLINE]) gl_LIBUNISTRING_MODULE([0.9.8], [unictype/ctype-print]) AC_REQUIRE([AC_C_INLINE]) gl_LIBUNISTRING_MODULE([0.9.8], [unictype/property-soft-dotted]) gl_LIBUNISTRING_LIBHEADER([0.9.4], [unigbrk.h]) gl_LIBUNISTRING_MODULE([0.9.8], [unigbrk/uc-gbrk-prop]) gl_LIBUNISTRING_MODULE([0.9.8], [unigbrk/uc-is-grapheme-break]) gl_LIBUNISTRING_LIBHEADER([0.9.4], [unilbrk.h]) AC_REQUIRE([AC_C_INLINE]) gl_LIBUNISTRING_MODULE([0.9.8], [unilbrk/u8-possible-linebreaks]) gl_LIBUNISTRING_LIBHEADER([0.9.4], [uninorm.h]) gl_LIBUNISTRING_MODULE([0.9.8], [uninorm/canonical-decomposition]) gl_LIBUNISTRING_MODULE([0.9.5], [uninorm/decomposing-form]) gl_LIBUNISTRING_MODULE([0.9.8], [uninorm/decomposition]) AC_REQUIRE([AC_C_INLINE]) gl_LIBUNISTRING_MODULE([0.9.8], [uninorm/nfd]) gl_LIBUNISTRING_MODULE([0.9.8], [uninorm/nfkd]) gl_MODULE_INDICATOR_FOR_TESTS([uninorm/u8-normalize]) gl_LIBUNISTRING_MODULE([0.9.8], [uninorm/u8-normalize]) gl_UNISTD_H gl_LIBUNISTRING_LIBHEADER([0.9.4], [unistr.h]) gl_LIBUNISTRING_MODULE([0.9], [unistr/u8-check]) gl_LIBUNISTRING_MODULE([0.9], [unistr/u8-cmp]) gl_LIBUNISTRING_MODULE([0.9], [unistr/u8-cmp2]) gl_LIBUNISTRING_MODULE([0.9], [unistr/u8-cpy]) gl_LIBUNISTRING_MODULE([0.9], [unistr/u8-mblen]) gl_MODULE_INDICATOR([unistr/u8-mbtouc]) gl_LIBUNISTRING_MODULE([0.9.4], [unistr/u8-mbtouc]) gl_MODULE_INDICATOR([unistr/u8-mbtouc-unsafe]) gl_LIBUNISTRING_MODULE([0.9.4], [unistr/u8-mbtouc-unsafe]) gl_MODULE_INDICATOR([unistr/u8-mbtoucr]) gl_LIBUNISTRING_MODULE([0.9], [unistr/u8-mbtoucr]) gl_LIBUNISTRING_MODULE([0.9], [unistr/u8-strlen]) gl_LIBUNISTRING_MODULE([0.9], [unistr/u8-strmbtouc]) gl_LIBUNISTRING_MODULE([0.9], [unistr/u8-strncat]) gl_MODULE_INDICATOR([unistr/u8-uctomb]) gl_LIBUNISTRING_MODULE([0.9], [unistr/u8-uctomb]) gl_LIBUNISTRING_LIBHEADER([0.9.4], [unitypes.h]) gl_LIBUNISTRING_LIBHEADER([0.9.4], [uniwbrk.h]) gl_LIBUNISTRING_MODULE([0.9.8], [uniwbrk/u8-wordbreaks]) gl_LIBUNISTRING_MODULE([0.9.8], [uniwbrk/wordbreak-property]) gl_LIBUNISTRING_LIBHEADER([0.9.4], [uniwidth.h]) gl_LIBUNISTRING_MODULE([0.9.8], [uniwidth/u8-strwidth]) gl_LIBUNISTRING_MODULE([0.9.8], [uniwidth/u8-width]) gl_LIBUNISTRING_MODULE([0.9.8], [uniwidth/width]) gl_FUNC_GLIBC_UNLOCKED_IO gl_FUNC_UNSETENV if test $HAVE_UNSETENV = 0 || test $REPLACE_UNSETENV = 1; then AC_LIBOBJ([unsetenv]) gl_PREREQ_UNSETENV fi gl_STDLIB_MODULE_INDICATOR([unsetenv]) AC_REQUIRE([AC_C_RESTRICT]) gl_FUNC_VASNPRINTF gl_FUNC_VASPRINTF gl_STDIO_MODULE_INDICATOR([vasprintf]) m4_ifdef([AM_XGETTEXT_OPTION], [AM_][XGETTEXT_OPTION([--flag=asprintf:2:c-format]) AM_][XGETTEXT_OPTION([--flag=vasprintf:2:c-format])]) gl_FUNC_VASPRINTF_POSIX gl_VERSION_ETC gl_FUNC_VFPRINTF_POSIX gl_STDIO_MODULE_INDICATOR([vfprintf-posix]) gl_FUNC_VPRINTF_POSIX gl_STDIO_MODULE_INDICATOR([vprintf-posix]) gl_FUNC_VSNPRINTF gl_STDIO_MODULE_INDICATOR([vsnprintf]) gl_FUNC_VSNPRINTF_POSIX gl_FUNC_VSPRINTF_POSIX gl_STDIO_MODULE_INDICATOR([vsprintf-posix]) gl_WCHAR_H gl_FUNC_WCRTOMB if test $HAVE_WCRTOMB = 0 || test $REPLACE_WCRTOMB = 1; then AC_LIBOBJ([wcrtomb]) gl_PREREQ_WCRTOMB fi gl_WCHAR_MODULE_INDICATOR([wcrtomb]) gl_WCTYPE_H gl_FUNC_WCWIDTH if test $HAVE_WCWIDTH = 0 || test $REPLACE_WCWIDTH = 1; then AC_LIBOBJ([wcwidth]) gl_PREREQ_WCWIDTH fi gl_WCHAR_MODULE_INDICATOR([wcwidth]) AC_REQUIRE([AC_CANONICAL_HOST]) case "$host_os" in mingw*) AC_LIBOBJ([windows-mutex]) ;; esac AC_REQUIRE([AC_CANONICAL_HOST]) case "$host_os" in mingw*) AC_LIBOBJ([windows-once]) ;; esac AC_REQUIRE([AC_CANONICAL_HOST]) case "$host_os" in mingw*) AC_LIBOBJ([windows-recmutex]) ;; esac AC_REQUIRE([AC_CANONICAL_HOST]) case "$host_os" in mingw*) AC_LIBOBJ([windows-rwlock]) ;; esac AC_REQUIRE([AC_CANONICAL_HOST]) case "$host_os" in mingw*) AC_LIBOBJ([windows-spin]) ;; esac gl_FUNC_WRITE if test $REPLACE_WRITE = 1; then AC_LIBOBJ([write]) gl_PREREQ_WRITE fi gl_UNISTD_MODULE_INDICATOR([write]) gl_XALLOC gl_XSIZE gl_XSTRNDUP gl_XVASPRINTF m4_ifdef([AM_XGETTEXT_OPTION], [AM_][XGETTEXT_OPTION([--flag=xasprintf:1:c-format])]) # End of code from modules m4_ifval(gl_LIBSOURCES_LIST, [ m4_syscmd([test ! -d ]m4_defn([gl_LIBSOURCES_DIR])[ || for gl_file in ]gl_LIBSOURCES_LIST[ ; do if test ! -r ]m4_defn([gl_LIBSOURCES_DIR])[/$gl_file ; then echo "missing file ]m4_defn([gl_LIBSOURCES_DIR])[/$gl_file" >&2 exit 1 fi done])dnl m4_if(m4_sysval, [0], [], [AC_FATAL([expected source file, required through AC_LIBSOURCES, not found])]) ]) m4_popdef([gl_LIBSOURCES_DIR]) m4_popdef([gl_LIBSOURCES_LIST]) m4_popdef([AC_LIBSOURCES]) m4_popdef([AC_REPLACE_FUNCS]) m4_popdef([AC_LIBOBJ]) AC_CONFIG_COMMANDS_PRE([ gl_libobjs= gl_ltlibobjs= if test -n "$gl_LIBOBJS"; then # Remove the extension. sed_drop_objext='s/\.o$//;s/\.obj$//' for i in `for i in $gl_LIBOBJS; do echo "$i"; done | sed -e "$sed_drop_objext" | sort | uniq`; do gl_libobjs="$gl_libobjs $i.$ac_objext" gl_ltlibobjs="$gl_ltlibobjs $i.lo" done fi AC_SUBST([gl_LIBOBJS], [$gl_libobjs]) AC_SUBST([gl_LTLIBOBJS], [$gl_ltlibobjs]) ]) gltests_libdeps= gltests_ltlibdeps= m4_pushdef([AC_LIBOBJ], m4_defn([gltests_LIBOBJ])) m4_pushdef([AC_REPLACE_FUNCS], m4_defn([gltests_REPLACE_FUNCS])) m4_pushdef([AC_LIBSOURCES], m4_defn([gltests_LIBSOURCES])) m4_pushdef([gltests_LIBSOURCES_LIST], []) m4_pushdef([gltests_LIBSOURCES_DIR], []) gl_COMMON gl_source_base='tests' changequote(,)dnl gltests_WITNESS=IN_`echo "${PACKAGE-$PACKAGE_TARNAME}" | LC_ALL=C tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ | LC_ALL=C sed -e 's/[^A-Z0-9_]/_/g'`_GNULIB_TESTS changequote([, ])dnl AC_SUBST([gltests_WITNESS]) gl_module_indicator_condition=$gltests_WITNESS m4_pushdef([gl_MODULE_INDICATOR_CONDITION], [$gl_module_indicator_condition]) m4_popdef([gl_MODULE_INDICATOR_CONDITION]) m4_ifval(gltests_LIBSOURCES_LIST, [ m4_syscmd([test ! -d ]m4_defn([gltests_LIBSOURCES_DIR])[ || for gl_file in ]gltests_LIBSOURCES_LIST[ ; do if test ! -r ]m4_defn([gltests_LIBSOURCES_DIR])[/$gl_file ; then echo "missing file ]m4_defn([gltests_LIBSOURCES_DIR])[/$gl_file" >&2 exit 1 fi done])dnl m4_if(m4_sysval, [0], [], [AC_FATAL([expected source file, required through AC_LIBSOURCES, not found])]) ]) m4_popdef([gltests_LIBSOURCES_DIR]) m4_popdef([gltests_LIBSOURCES_LIST]) m4_popdef([AC_LIBSOURCES]) m4_popdef([AC_REPLACE_FUNCS]) m4_popdef([AC_LIBOBJ]) AC_CONFIG_COMMANDS_PRE([ gltests_libobjs= gltests_ltlibobjs= if test -n "$gltests_LIBOBJS"; then # Remove the extension. sed_drop_objext='s/\.o$//;s/\.obj$//' for i in `for i in $gltests_LIBOBJS; do echo "$i"; done | sed -e "$sed_drop_objext" | sort | uniq`; do gltests_libobjs="$gltests_libobjs $i.$ac_objext" gltests_ltlibobjs="$gltests_ltlibobjs $i.lo" done fi AC_SUBST([gltests_LIBOBJS], [$gltests_libobjs]) AC_SUBST([gltests_LTLIBOBJS], [$gltests_ltlibobjs]) ]) ]) # Like AC_LIBOBJ, except that the module name goes # into gl_LIBOBJS instead of into LIBOBJS. AC_DEFUN([gl_LIBOBJ], [ AS_LITERAL_IF([$1], [gl_LIBSOURCES([$1.c])])dnl gl_LIBOBJS="$gl_LIBOBJS $1.$ac_objext" ]) # Like AC_REPLACE_FUNCS, except that the module name goes # into gl_LIBOBJS instead of into LIBOBJS. AC_DEFUN([gl_REPLACE_FUNCS], [ m4_foreach_w([gl_NAME], [$1], [AC_LIBSOURCES(gl_NAME[.c])])dnl AC_CHECK_FUNCS([$1], , [gl_LIBOBJ($ac_func)]) ]) # Like AC_LIBSOURCES, except the directory where the source file is # expected is derived from the gnulib-tool parameterization, # and alloca is special cased (for the alloca-opt module). # We could also entirely rely on EXTRA_lib..._SOURCES. AC_DEFUN([gl_LIBSOURCES], [ m4_foreach([_gl_NAME], [$1], [ m4_if(_gl_NAME, [alloca.c], [], [ m4_define([gl_LIBSOURCES_DIR], [gl]) m4_append([gl_LIBSOURCES_LIST], _gl_NAME, [ ]) ]) ]) ]) # Like AC_LIBOBJ, except that the module name goes # into gltests_LIBOBJS instead of into LIBOBJS. AC_DEFUN([gltests_LIBOBJ], [ AS_LITERAL_IF([$1], [gltests_LIBSOURCES([$1.c])])dnl gltests_LIBOBJS="$gltests_LIBOBJS $1.$ac_objext" ]) # Like AC_REPLACE_FUNCS, except that the module name goes # into gltests_LIBOBJS instead of into LIBOBJS. AC_DEFUN([gltests_REPLACE_FUNCS], [ m4_foreach_w([gl_NAME], [$1], [AC_LIBSOURCES(gl_NAME[.c])])dnl AC_CHECK_FUNCS([$1], , [gltests_LIBOBJ($ac_func)]) ]) # Like AC_LIBSOURCES, except the directory where the source file is # expected is derived from the gnulib-tool parameterization, # and alloca is special cased (for the alloca-opt module). # We could also entirely rely on EXTRA_lib..._SOURCES. AC_DEFUN([gltests_LIBSOURCES], [ m4_foreach([_gl_NAME], [$1], [ m4_if(_gl_NAME, [alloca.c], [], [ m4_define([gltests_LIBSOURCES_DIR], [tests]) m4_append([gltests_LIBSOURCES_LIST], _gl_NAME, [ ]) ]) ]) ]) # This macro records the list of files which have been installed by # gnulib-tool and may be removed by future gnulib-tool invocations. AC_DEFUN([gl_FILE_LIST], [ build-aux/config.libpath build-aux/gitlog-to-changelog build-aux/install-reloc build-aux/libtool-reloc build-aux/reloc-ldflags doc/relocatable.texi lib/_Noreturn.h lib/alloca.c lib/alloca.in.h lib/allocator.c lib/allocator.h lib/anytostr.c lib/areadlink.c lib/areadlink.h lib/arg-nonnull.h lib/array-mergesort.h lib/asnprintf.c lib/asprintf.c lib/asyncsafe-spin.c lib/asyncsafe-spin.h lib/attribute.h lib/basename-lgpl.c lib/basename-lgpl.h lib/basename.c lib/binary-io.c lib/binary-io.h lib/btowc.c lib/byteswap.in.h lib/c++defs.h lib/c-asprintf.c lib/c-ctype.c lib/c-ctype.h lib/c-snprintf.c lib/c-snprintf.h lib/c-strcase.h lib/c-strcasecmp.c lib/c-strcasestr.c lib/c-strcasestr.h lib/c-strncasecmp.c lib/c-strtod.c lib/c-strtod.h lib/c-vasnprintf.c lib/c-vasnprintf.h lib/c-vasprintf.c lib/c-vasprintf.h lib/c-xasprintf.c lib/c-xvasprintf.c lib/c-xvasprintf.h lib/canonicalize-lgpl.c lib/careadlinkat.c lib/careadlinkat.h lib/cdefs.h lib/clean-temp.c lib/clean-temp.h lib/cloexec.c lib/cloexec.h lib/close.c lib/count-leading-zeros.c lib/count-leading-zeros.h lib/count-one-bits.c lib/count-one-bits.h lib/crc.c lib/crc.h lib/dirname-lgpl.c lib/dirname.c lib/dirname.h lib/dtoastr.c lib/dtotimespec.c lib/dup2.c lib/errno.in.h lib/error.c lib/error.h lib/exitfail.c lib/exitfail.h lib/explicit_bzero.c lib/fatal-signal.c lib/fatal-signal.h lib/fcntl.c lib/fcntl.in.h lib/fd-hook.c lib/fd-hook.h lib/filename.h lib/flexmember.h lib/float+.h lib/float.c lib/float.in.h lib/floor.c lib/fopen.c lib/fprintf.c lib/fpucw.h lib/frexp.c lib/frexpl.c lib/fseek.c lib/fseeko.c lib/fseterr.c lib/fseterr.h lib/fstat.c lib/ftell.c lib/ftello.c lib/ftoastr.c lib/ftoastr.h lib/full-read.c lib/full-read.h lib/full-write.c lib/full-write.h lib/fwriteerror.c lib/fwriteerror.h lib/getdelim.c lib/getdtablesize.c lib/getline.c lib/getopt-cdefs.in.h lib/getopt-core.h lib/getopt-ext.h lib/getopt-pfx-core.h lib/getopt-pfx-ext.h lib/getopt.c lib/getopt.in.h lib/getopt1.c lib/getopt_int.h lib/getpass.c lib/getpass.h lib/getprogname.c lib/getprogname.h lib/getrandom.c lib/gettext.h lib/gettime.c lib/gettimeofday.c lib/gl_anyhash1.h lib/gl_anyhash2.h lib/gl_anyhash_primes.h lib/gl_anylinked_list1.h lib/gl_anylinked_list2.h lib/gl_linked_list.c lib/gl_linked_list.h lib/gl_linkedhash_list.c lib/gl_linkedhash_list.h lib/gl_list.c lib/gl_list.h lib/gl_xlist.c lib/gl_xlist.h lib/glthread/lock.c lib/glthread/lock.h lib/glthread/threadlib.c lib/hard-locale.c lib/hard-locale.h lib/imaxtostr.c lib/intprops.h lib/inttostr.c lib/inttostr.h lib/inttypes.in.h lib/isfinite.c lib/isinf.c lib/isnan.c lib/isnand-nolibm.h lib/isnand.c lib/isnanf-nolibm.h lib/isnanf.c lib/isnanl-nolibm.h lib/isnanl.c lib/iswblank.c lib/iswdigit.c lib/iswxdigit.c lib/itold.c lib/langinfo.in.h lib/lc-charset-dispatch.c lib/lc-charset-dispatch.h lib/libc-config.h lib/limits.in.h lib/localcharset.c lib/localcharset.h lib/locale.in.h lib/localeconv.c lib/localename-table.c lib/localename-table.h lib/localename.c lib/localename.h lib/lseek.c lib/lstat.c lib/malloc.c lib/malloca.c lib/malloca.h lib/math.c lib/math.in.h lib/mbchar.c lib/mbchar.h lib/mbiter.c lib/mbiter.h lib/mbrtowc-impl-utf8.h lib/mbrtowc-impl.h lib/mbrtowc.c lib/mbsinit.c lib/mbtowc-impl.h lib/mbtowc-lock.c lib/mbtowc-lock.h lib/mbtowc.c lib/md4.c lib/md4.h lib/memcasecmp.c lib/memcasecmp.h lib/memchr.c lib/memchr.valgrind lib/memchr2.c lib/memchr2.h lib/memchr2.valgrind lib/memmem.c lib/mempcpy.c lib/memrchr.c lib/minmax.h lib/mkdir.c lib/mkdtemp.c lib/mkstemp.c lib/mktime-internal.h lib/mktime.c lib/msvc-inval.c lib/msvc-inval.h lib/msvc-nothrow.c lib/msvc-nothrow.h lib/nl_langinfo.c lib/nstrftime.c lib/offtostr.c lib/open.c lib/pathmax.h lib/pipe2.c lib/printf-args.c lib/printf-args.h lib/printf-frexp.c lib/printf-frexp.h lib/printf-frexpl.c lib/printf-frexpl.h lib/printf-parse.c lib/printf-parse.h lib/printf.c lib/progname.c lib/progname.h lib/progreloc.c lib/raise.c lib/rawmemchr.c lib/rawmemchr.valgrind lib/read-file.c lib/read-file.h lib/read.c lib/readlink.c lib/realloc.c lib/regcomp.c lib/regex.c lib/regex.h lib/regex_internal.c lib/regex_internal.h lib/regexec.c lib/relocatable.c lib/relocatable.h lib/relocwrapper.c lib/rename.c lib/rijndael-alg-fst.c lib/rijndael-alg-fst.h lib/rijndael-api-fst.c lib/rijndael-api-fst.h lib/rmdir.c lib/round.c lib/safe-read.c lib/safe-read.h lib/safe-write.c lib/safe-write.h lib/same-inode.h lib/secure_getenv.c lib/select.c lib/setenv.c lib/setlocale-lock.c lib/setlocale_null.c lib/setlocale_null.h lib/sig-handler.c lib/sig-handler.h lib/sigaction.c lib/signal.in.h lib/signbitd.c lib/signbitf.c lib/signbitl.c lib/sigprocmask.c lib/size_max.h lib/snprintf.c lib/sockets.c lib/sockets.h lib/sprintf.c lib/stat-time.c lib/stat-time.h lib/stat-w32.c lib/stat-w32.h lib/stat.c lib/stdalign.in.h lib/stdarg.in.h lib/stdbool.in.h lib/stddef.in.h lib/stdint.in.h lib/stdio-impl.h lib/stdio.in.h lib/stdlib.in.h lib/stpcpy.c lib/str-two-way.h lib/strcasecmp.c lib/strcasestr.c lib/strdup.c lib/streq.h lib/strerror-override.c lib/strerror-override.h lib/strerror.c lib/strftime.h lib/string.in.h lib/strings.in.h lib/stripslash.c lib/strncasecmp.c lib/strncat.c lib/strndup.c lib/strnlen.c lib/strsep.c lib/strtod.c lib/strtok_r.c lib/sys-limits.h lib/sys_random.in.h lib/sys_select.in.h lib/sys_socket.c lib/sys_socket.in.h lib/sys_stat.in.h lib/sys_time.in.h lib/sys_types.in.h lib/sys_uio.in.h lib/tempname.c lib/tempname.h lib/termios.in.h lib/thread-optim.h lib/time-internal.h lib/time.in.h lib/time_r.c lib/time_rz.c lib/timegm.c lib/timespec-add.c lib/timespec-sub.c lib/timespec.c lib/timespec.h lib/tmpdir.c lib/tmpdir.h lib/trunc.c lib/tzset.c lib/uinttostr.c lib/umaxtostr.c lib/unicase.in.h lib/unicase/cased.c lib/unicase/cased.h lib/unicase/casefold.h lib/unicase/caseprop.h lib/unicase/context.h lib/unicase/empty-prefix-context.c lib/unicase/empty-suffix-context.c lib/unicase/ignorable.c lib/unicase/ignorable.h lib/unicase/simple-mapping.h lib/unicase/special-casing-table.gperf lib/unicase/special-casing.c lib/unicase/special-casing.in.h lib/unicase/tocasefold.c lib/unicase/tocasefold.h lib/unicase/tolower.c lib/unicase/tolower.h lib/unicase/totitle.c lib/unicase/totitle.h lib/unicase/toupper.c lib/unicase/toupper.h lib/unicase/u-casecmp.h lib/unicase/u-casefold.h lib/unicase/u-casemap.h lib/unicase/u-ct-casefold.h lib/unicase/u-ct-totitle.h lib/unicase/u-totitle.h lib/unicase/u8-casecmp.c lib/unicase/u8-casefold.c lib/unicase/u8-casemap.c lib/unicase/u8-ct-casefold.c lib/unicase/u8-ct-totitle.c lib/unicase/u8-tolower.c lib/unicase/u8-totitle.c lib/unicase/u8-toupper.c lib/unicase/unicasemap.h lib/unictype.in.h lib/unictype/bitmap.h lib/unictype/categ_none.c lib/unictype/categ_of.c lib/unictype/categ_of.h lib/unictype/combiningclass.c lib/unictype/combiningclass.h lib/unictype/ctype_print.c lib/unictype/ctype_print.h lib/unictype/pr_soft_dotted.c lib/unictype/pr_soft_dotted.h lib/unigbrk.in.h lib/unigbrk/gbrkprop.h lib/unigbrk/uc-gbrk-prop.c lib/unigbrk/uc-is-grapheme-break.c lib/unilbrk.in.h lib/unilbrk/lbrkprop1.h lib/unilbrk/lbrkprop2.h lib/unilbrk/lbrktables.c lib/unilbrk/lbrktables.h lib/unilbrk/u8-possible-linebreaks.c lib/uninorm.in.h lib/uninorm/canonical-decomposition.c lib/uninorm/compat-decomposition.c lib/uninorm/decompose-internal.c lib/uninorm/decompose-internal.h lib/uninorm/decomposing-form.c lib/uninorm/decomposition-table.c lib/uninorm/decomposition-table.h lib/uninorm/decomposition-table1.h lib/uninorm/decomposition-table2.h lib/uninorm/decomposition.c lib/uninorm/nfd.c lib/uninorm/nfkd.c lib/uninorm/normalize-internal.h lib/uninorm/u-normalize-internal.h lib/uninorm/u8-normalize.c lib/unistd.c lib/unistd.in.h lib/unistr.in.h lib/unistr/u-cmp2.h lib/unistr/u-cpy.h lib/unistr/u8-check.c lib/unistr/u8-cmp.c lib/unistr/u8-cmp2.c lib/unistr/u8-cpy.c lib/unistr/u8-mblen.c lib/unistr/u8-mbtouc-aux.c lib/unistr/u8-mbtouc-unsafe-aux.c lib/unistr/u8-mbtouc-unsafe.c lib/unistr/u8-mbtouc.c lib/unistr/u8-mbtoucr.c lib/unistr/u8-strlen.c lib/unistr/u8-strmbtouc.c lib/unistr/u8-strncat.c lib/unistr/u8-uctomb-aux.c lib/unistr/u8-uctomb.c lib/unitypes.in.h lib/uniwbrk.in.h lib/uniwbrk/u-wordbreaks.h lib/uniwbrk/u8-wordbreaks.c lib/uniwbrk/wbrkprop.h lib/uniwbrk/wbrktable.c lib/uniwbrk/wbrktable.h lib/uniwbrk/wordbreak-property.c lib/uniwidth.in.h lib/uniwidth/cjk.h lib/uniwidth/u8-strwidth.c lib/uniwidth/u8-width.c lib/uniwidth/width.c lib/unlocked-io.h lib/unsetenv.c lib/unused-parameter.h lib/vasnprintf.c lib/vasnprintf.h lib/vasprintf.c lib/verify.h lib/version-etc-fsf.c lib/version-etc.c lib/version-etc.h lib/vfprintf.c lib/vprintf.c lib/vsnprintf.c lib/vsprintf.c lib/w32sock.h lib/warn-on-use.h lib/wchar.in.h lib/wcrtomb.c lib/wctype-h.c lib/wctype.in.h lib/wcwidth.c lib/windows-initguard.h lib/windows-mutex.c lib/windows-mutex.h lib/windows-once.c lib/windows-once.h lib/windows-recmutex.c lib/windows-recmutex.h lib/windows-rwlock.c lib/windows-rwlock.h lib/windows-spin.c lib/windows-spin.h lib/write.c lib/xalloc-die.c lib/xalloc-oversized.h lib/xalloc.h lib/xasprintf.c lib/xbinary-io.c lib/xbinary-io.h lib/xmalloc.c lib/xmalloca.c lib/xmalloca.h lib/xmemdup0.c lib/xmemdup0.h lib/xreadlink.c lib/xreadlink.h lib/xsize.c lib/xsize.h lib/xstrndup.c lib/xstrndup.h lib/xvasprintf.c lib/xvasprintf.h m4/00gnulib.m4 m4/__inline.m4 m4/absolute-header.m4 m4/alloca.m4 m4/asm-underscore.m4 m4/assert.m4 m4/btowc.m4 m4/builtin-expect.m4 m4/byteswap.m4 m4/c-strtod.m4 m4/canonicalize.m4 m4/ceil.m4 m4/check-math-lib.m4 m4/clock_time.m4 m4/close.m4 m4/codeset.m4 m4/configmake.m4 m4/double-slash-root.m4 m4/dup2.m4 m4/eealloc.m4 m4/environ.m4 m4/errno_h.m4 m4/error.m4 m4/explicit_bzero.m4 m4/exponentd.m4 m4/exponentf.m4 m4/exponentl.m4 m4/extensions.m4 m4/extern-inline.m4 m4/fatal-signal.m4 m4/fcntl-o.m4 m4/fcntl.m4 m4/fcntl_h.m4 m4/flexmember.m4 m4/float_h.m4 m4/floor.m4 m4/fopen.m4 m4/fpieee.m4 m4/fprintf-posix.m4 m4/frexp.m4 m4/frexpl.m4 m4/fseek.m4 m4/fseeko.m4 m4/fseterr.m4 m4/fstat.m4 m4/ftell.m4 m4/ftello.m4 m4/getdelim.m4 m4/getdtablesize.m4 m4/getline.m4 m4/getopt.m4 m4/getpass.m4 m4/getprogname.m4 m4/getrandom.m4 m4/gettime.m4 m4/gettimeofday.m4 m4/glibc21.m4 m4/gnulib-common.m4 m4/include_next.m4 m4/inline.m4 m4/intl-thread-locale.m4 m4/intlmacosx.m4 m4/intmax_t.m4 m4/inttostr.m4 m4/inttypes.m4 m4/inttypes_h.m4 m4/isfinite.m4 m4/isinf.m4 m4/isnan.m4 m4/isnand.m4 m4/isnanf.m4 m4/isnanl.m4 m4/iswblank.m4 m4/iswdigit.m4 m4/iswxdigit.m4 m4/langinfo_h.m4 m4/largefile.m4 m4/lcmessage.m4 m4/ldexp.m4 m4/ldexpl.m4 m4/lib-ld.m4 m4/libunistring-base.m4 m4/limits-h.m4 m4/localcharset.m4 m4/locale-fr.m4 m4/locale-ja.m4 m4/locale-zh.m4 m4/locale_h.m4 m4/localeconv.m4 m4/localename.m4 m4/lock.m4 m4/lseek.m4 m4/lstat.m4 m4/malloc.m4 m4/malloca.m4 m4/math_h.m4 m4/mbchar.m4 m4/mbiter.m4 m4/mbrtowc.m4 m4/mbsinit.m4 m4/mbstate_t.m4 m4/mbtowc.m4 m4/md4.m4 m4/memcasecmp.m4 m4/memchr.m4 m4/memmem.m4 m4/mempcpy.m4 m4/memrchr.m4 m4/minmax.m4 m4/mkdir.m4 m4/mkdtemp.m4 m4/mkstemp.m4 m4/mktime.m4 m4/mmap-anon.m4 m4/mode_t.m4 m4/msvc-inval.m4 m4/msvc-nothrow.m4 m4/multiarch.m4 m4/nl_langinfo.m4 m4/nocrash.m4 m4/nstrftime.m4 m4/off_t.m4 m4/open-cloexec.m4 m4/open-slash.m4 m4/open.m4 m4/pathmax.m4 m4/pipe2.m4 m4/printf-frexp.m4 m4/printf-frexpl.m4 m4/printf-posix-rpl.m4 m4/printf.m4 m4/pthread_rwlock_rdlock.m4 m4/raise.m4 m4/rawmemchr.m4 m4/read-file.m4 m4/read.m4 m4/readlink.m4 m4/realloc.m4 m4/regex.m4 m4/relocatable-lib.m4 m4/relocatable.m4 m4/rename.m4 m4/rmdir.m4 m4/round.m4 m4/safe-read.m4 m4/safe-write.m4 m4/secure_getenv.m4 m4/select.m4 m4/setenv.m4 m4/setlocale_null.m4 m4/sig_atomic_t.m4 m4/sigaction.m4 m4/signal_h.m4 m4/signalblocking.m4 m4/signbit.m4 m4/size_max.m4 m4/snprintf-posix.m4 m4/snprintf.m4 m4/socketlib.m4 m4/sockets.m4 m4/socklen.m4 m4/sockpfaf.m4 m4/sprintf-posix.m4 m4/ssize_t.m4 m4/stat-time.m4 m4/stat.m4 m4/std-gnu11.m4 m4/stdalign.m4 m4/stdarg.m4 m4/stdbool.m4 m4/stddef_h.m4 m4/stdint.m4 m4/stdint_h.m4 m4/stdio_h.m4 m4/stdlib_h.m4 m4/stpcpy.m4 m4/strcase.m4 m4/strcasestr.m4 m4/strdup.m4 m4/strerror.m4 m4/string_h.m4 m4/strings_h.m4 m4/strncat.m4 m4/strndup.m4 m4/strnlen.m4 m4/strsep.m4 m4/strtod.m4 m4/strtok_r.m4 m4/sys_random_h.m4 m4/sys_select_h.m4 m4/sys_socket_h.m4 m4/sys_stat_h.m4 m4/sys_time_h.m4 m4/sys_types_h.m4 m4/sys_uio_h.m4 m4/tempname.m4 m4/termios_h.m4 m4/threadlib.m4 m4/time_h.m4 m4/time_r.m4 m4/time_rz.m4 m4/timegm.m4 m4/timespec.m4 m4/tm_gmtoff.m4 m4/tmpdir.m4 m4/trunc.m4 m4/tzset.m4 m4/unistd_h.m4 m4/unlocked-io.m4 m4/vasnprintf.m4 m4/vasprintf-posix.m4 m4/vasprintf.m4 m4/version-etc.m4 m4/vfprintf-posix.m4 m4/visibility.m4 m4/vprintf-posix.m4 m4/vsnprintf-posix.m4 m4/vsnprintf.m4 m4/vsprintf-posix.m4 m4/warn-on-use.m4 m4/wchar_h.m4 m4/wchar_t.m4 m4/wcrtomb.m4 m4/wctype_h.m4 m4/wcwidth.m4 m4/wint_t.m4 m4/write.m4 m4/xalloc.m4 m4/xsize.m4 m4/xstrndup.m4 m4/xvasprintf.m4 m4/zzgnulib.m4 ]) pspp-1.4.1/gl/m4/canonicalize.m40000644000175000017500000001002113723215637015741 0ustar00blpblp00000000000000# canonicalize.m4 serial 31 dnl Copyright (C) 2003-2007, 2009-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. # Provides canonicalize_file_name and canonicalize_filename_mode, but does # not provide or fix realpath. AC_DEFUN([gl_FUNC_CANONICALIZE_FILENAME_MODE], [ AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS]) AC_CHECK_FUNCS_ONCE([canonicalize_file_name]) AC_REQUIRE([gl_DOUBLE_SLASH_ROOT]) AC_REQUIRE([gl_FUNC_REALPATH_WORKS]) if test $ac_cv_func_canonicalize_file_name = no; then HAVE_CANONICALIZE_FILE_NAME=0 else case "$gl_cv_func_realpath_works" in *yes) ;; *) REPLACE_CANONICALIZE_FILE_NAME=1 ;; esac fi ]) # Provides canonicalize_file_name and realpath. AC_DEFUN([gl_CANONICALIZE_LGPL], [ AC_REQUIRE([gl_STDLIB_H_DEFAULTS]) AC_REQUIRE([gl_CANONICALIZE_LGPL_SEPARATE]) if test $ac_cv_func_canonicalize_file_name = no; then HAVE_CANONICALIZE_FILE_NAME=0 if test $ac_cv_func_realpath = no; then HAVE_REALPATH=0 else case "$gl_cv_func_realpath_works" in *yes) ;; *) REPLACE_REALPATH=1 ;; esac fi else case "$gl_cv_func_realpath_works" in *yes) ;; *) REPLACE_CANONICALIZE_FILE_NAME=1 REPLACE_REALPATH=1 ;; esac fi ]) # Like gl_CANONICALIZE_LGPL, except prepare for separate compilation # (no REPLACE_CANONICALIZE_FILE_NAME, no REPLACE_REALPATH, no AC_LIBOBJ). AC_DEFUN([gl_CANONICALIZE_LGPL_SEPARATE], [ AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS]) AC_CHECK_FUNCS_ONCE([canonicalize_file_name getcwd readlink]) AC_REQUIRE([gl_DOUBLE_SLASH_ROOT]) AC_REQUIRE([gl_FUNC_REALPATH_WORKS]) AC_CHECK_HEADERS_ONCE([sys/param.h]) ]) # Check whether realpath works. Assume that if a platform has both # realpath and canonicalize_file_name, but the former is broken, then # so is the latter. AC_DEFUN([gl_FUNC_REALPATH_WORKS], [ AC_CHECK_FUNCS_ONCE([realpath]) AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles AC_CACHE_CHECK([whether realpath works], [gl_cv_func_realpath_works], [ touch conftest.a mkdir conftest.d AC_RUN_IFELSE([ AC_LANG_PROGRAM([[ ]GL_NOCRASH[ #include #include ]], [[ int result = 0; { char *name = realpath ("conftest.a", NULL); if (!(name && *name == '/')) result |= 1; free (name); } { char *name = realpath ("conftest.b/../conftest.a", NULL); if (name != NULL) result |= 2; free (name); } { char *name = realpath ("conftest.a/", NULL); if (name != NULL) result |= 4; free (name); } { char *name1 = realpath (".", NULL); char *name2 = realpath ("conftest.d//./..", NULL); if (! name1 || ! name2 || strcmp (name1, name2)) result |= 8; free (name1); free (name2); } return result; ]]) ], [gl_cv_func_realpath_works=yes], [gl_cv_func_realpath_works=no], [case "$host_os" in # Guess yes on glibc systems. *-gnu* | gnu*) gl_cv_func_realpath_works="guessing yes" ;; # Guess yes on musl systems. *-musl*) gl_cv_func_realpath_works="guessing yes" ;; # Guess no on native Windows. mingw*) gl_cv_func_realpath_works="guessing no" ;; # If we don't know, obey --enable-cross-guesses. *) gl_cv_func_realpath_works="$gl_cross_guess_normal" ;; esac ]) rm -rf conftest.a conftest.d ]) case "$gl_cv_func_realpath_works" in *yes) AC_DEFINE([FUNC_REALPATH_WORKS], [1], [Define to 1 if realpath() can malloc memory, always gives an absolute path, and handles trailing slash correctly.]) ;; esac ]) pspp-1.4.1/gl/m4/rmdir.m40000644000175000017500000000350113723215637014424 0ustar00blpblp00000000000000# rmdir.m4 serial 17 dnl Copyright (C) 2002, 2005, 2009-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_FUNC_RMDIR], [ AC_REQUIRE([gl_UNISTD_H_DEFAULTS]) AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles dnl Detect cygwin 1.5.x bug. AC_CHECK_HEADERS_ONCE([unistd.h]) AC_CACHE_CHECK([whether rmdir works], [gl_cv_func_rmdir_works], [mkdir conftest.dir touch conftest.file AC_RUN_IFELSE( [AC_LANG_PROGRAM( [[#include #include #if HAVE_UNISTD_H # include #else /* on Windows with MSVC */ # include #endif ]], [[int result = 0; if (!rmdir ("conftest.file/")) result |= 1; else if (errno != ENOTDIR) result |= 2; if (!rmdir ("conftest.dir/./")) result |= 4; return result; ]])], [gl_cv_func_rmdir_works=yes], [gl_cv_func_rmdir_works=no], [case "$host_os" in # Guess yes on Linux systems. linux-* | linux) gl_cv_func_rmdir_works="guessing yes" ;; # Guess yes on glibc systems. *-gnu* | gnu*) gl_cv_func_rmdir_works="guessing yes" ;; # Guess no on native Windows. mingw*) gl_cv_func_rmdir_works="guessing no" ;; # If we don't know, obey --enable-cross-guesses. *) gl_cv_func_rmdir_works="$gl_cross_guess_normal" ;; esac ]) rm -rf conftest.dir conftest.file]) case "$gl_cv_func_rmdir_works" in *yes) ;; *) REPLACE_RMDIR=1 ;; esac ]) pspp-1.4.1/gl/m4/localename.m40000644000175000017500000000242613723215637015414 0ustar00blpblp00000000000000# localename.m4 serial 7 dnl Copyright (C) 2007, 2009-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_LOCALENAME], [ AC_REQUIRE([gl_LOCALE_H_DEFAULTS]) AC_REQUIRE([gl_LOCALE_T]) AC_REQUIRE([gt_LC_MESSAGES]) AC_REQUIRE([gt_INTL_THREAD_LOCALE_NAME]) AC_REQUIRE([gt_INTL_MACOSX]) AC_CHECK_HEADERS_ONCE([langinfo.h]) if test $HAVE_LOCALE_T = 1; then AC_CHECK_FUNCS_ONCE([newlocale duplocale freelocale]) gl_func_newlocale="$ac_cv_func_newlocale" gl_func_duplocale="$ac_cv_func_duplocale" gl_func_freelocale="$ac_cv_func_freelocale" else dnl In 2019, some versions of z/OS lack the locale_t type and have broken dnl newlocale, duplocale, freelocale functions. gl_func_newlocale=no gl_func_duplocale=no gl_func_freelocale=no fi if test $gl_func_newlocale != yes; then HAVE_NEWLOCALE=0 fi if test $gl_func_duplocale != yes; then HAVE_DUPLOCALE=0 fi if test $gl_func_freelocale != yes; then HAVE_FREELOCALE=0 fi if test $gt_nameless_locales = yes; then REPLACE_NEWLOCALE=1 REPLACE_DUPLOCALE=1 REPLACE_FREELOCALE=1 fi ]) pspp-1.4.1/gl/m4/frexpl.m40000644000175000017500000001557013723215637014620 0ustar00blpblp00000000000000# frexpl.m4 serial 21 dnl Copyright (C) 2007-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_FUNC_FREXPL], [ AC_REQUIRE([gl_MATH_H_DEFAULTS]) AC_REQUIRE([gl_LONG_DOUBLE_VS_DOUBLE]) dnl Persuade glibc to declare frexpl(). AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS]) dnl Check whether it's declared. dnl Mac OS X 10.3 has frexpl() in libc but doesn't declare it in . AC_CHECK_DECL([frexpl], , [HAVE_DECL_FREXPL=0], [[#include ]]) FREXPL_LIBM= if test $HAVE_DECL_FREXPL = 1; then gl_CHECK_FREXPL_NO_LIBM if test $gl_cv_func_frexpl_no_libm = no; then AC_CACHE_CHECK([whether frexpl() can be used with libm], [gl_cv_func_frexpl_in_libm], [ save_LIBS="$LIBS" LIBS="$LIBS -lm" AC_LINK_IFELSE( [AC_LANG_PROGRAM( [[#include long double x;]], [[int e; return frexpl (x, &e) > 0;]])], [gl_cv_func_frexpl_in_libm=yes], [gl_cv_func_frexpl_in_libm=no]) LIBS="$save_LIBS" ]) if test $gl_cv_func_frexpl_in_libm = yes; then FREXPL_LIBM=-lm fi fi if test $gl_cv_func_frexpl_no_libm = yes \ || test $gl_cv_func_frexpl_in_libm = yes; then save_LIBS="$LIBS" LIBS="$LIBS $FREXPL_LIBM" gl_FUNC_FREXPL_WORKS LIBS="$save_LIBS" case "$gl_cv_func_frexpl_works" in *yes) gl_func_frexpl=yes ;; *) gl_func_frexpl=no; REPLACE_FREXPL=1 ;; esac else gl_func_frexpl=no fi if test $gl_func_frexpl = yes; then AC_DEFINE([HAVE_FREXPL], [1], [Define if the frexpl() function is available.]) fi fi if test $HAVE_DECL_FREXPL = 0 || test $gl_func_frexpl = no; then dnl Find libraries needed to link lib/frexpl.c. if test $HAVE_SAME_LONG_DOUBLE_AS_DOUBLE = 1; then AC_REQUIRE([gl_FUNC_FREXP]) FREXPL_LIBM="$FREXP_LIBM" else FREXPL_LIBM= fi fi AC_SUBST([FREXPL_LIBM]) ]) AC_DEFUN([gl_FUNC_FREXPL_NO_LIBM], [ AC_REQUIRE([gl_MATH_H_DEFAULTS]) AC_REQUIRE([gl_LONG_DOUBLE_VS_DOUBLE]) dnl Check whether it's declared. dnl Mac OS X 10.3 has frexpl() in libc but doesn't declare it in . AC_CHECK_DECL([frexpl], , [HAVE_DECL_FREXPL=0], [[#include ]]) if test $HAVE_DECL_FREXPL = 1; then gl_CHECK_FREXPL_NO_LIBM if test $gl_cv_func_frexpl_no_libm = yes; then gl_FUNC_FREXPL_WORKS case "$gl_cv_func_frexpl_works" in *yes) gl_func_frexpl_no_libm=yes ;; *) gl_func_frexpl_no_libm=no; REPLACE_FREXPL=1 ;; esac else gl_func_frexpl_no_libm=no dnl Set REPLACE_FREXPL here because the system may have frexpl in libm. REPLACE_FREXPL=1 fi if test $gl_func_frexpl_no_libm = yes; then AC_DEFINE([HAVE_FREXPL_IN_LIBC], [1], [Define if the frexpl() function is available in libc.]) fi fi ]) dnl Test whether frexpl() can be used without linking with libm. dnl Set gl_cv_func_frexpl_no_libm to 'yes' or 'no' accordingly. AC_DEFUN([gl_CHECK_FREXPL_NO_LIBM], [ AC_CACHE_CHECK([whether frexpl() can be used without linking with libm], [gl_cv_func_frexpl_no_libm], [ AC_LINK_IFELSE( [AC_LANG_PROGRAM( [[#include long double x;]], [[int e; return frexpl (x, &e) > 0;]])], [gl_cv_func_frexpl_no_libm=yes], [gl_cv_func_frexpl_no_libm=no]) ]) ]) dnl Test whether frexpl() works on finite numbers (this fails on dnl Mac OS X 10.4/PowerPC, on AIX 5.1, and on BeOS), on denormalized numbers dnl (this fails on Mac OS X 10.5/i386), and also on infinite numbers (this dnl fails e.g. on IRIX 6.5 and mingw). AC_DEFUN([gl_FUNC_FREXPL_WORKS], [ AC_REQUIRE([AC_PROG_CC]) AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles AC_CACHE_CHECK([whether frexpl works], [gl_cv_func_frexpl_works], [ AC_RUN_IFELSE( [AC_LANG_SOURCE([[ #include #include /* Override the values of , like done in float.in.h. */ #if defined __i386__ && (defined __BEOS__ || defined __OpenBSD__) # undef LDBL_MIN_EXP # define LDBL_MIN_EXP (-16381) #endif #if defined __i386__ && (defined __FreeBSD__ || defined __DragonFly__) # undef LDBL_MIN_EXP # define LDBL_MIN_EXP (-16381) #endif #if (defined _ARCH_PPC || defined _POWER) && defined _AIX && (LDBL_MANT_DIG == 106) && defined __GNUC__ # undef LDBL_MIN_EXP # define LDBL_MIN_EXP DBL_MIN_EXP #endif #if defined __sgi && (LDBL_MANT_DIG >= 106) # if defined __GNUC__ # undef LDBL_MIN_EXP # define LDBL_MIN_EXP DBL_MIN_EXP # endif #endif extern #ifdef __cplusplus "C" #endif long double frexpl (long double, int *); int main() { int result = 0; volatile long double x; /* Test on finite numbers that fails on AIX 5.1. */ x = 16.0L; { int exp = -9999; frexpl (x, &exp); if (exp != 5) result |= 1; } /* Test on finite numbers that fails on Mac OS X 10.4, because its frexpl function returns an invalid (incorrectly normalized) value: it returns y = { 0x3fe028f5, 0xc28f5c28, 0x3c9eb851, 0xeb851eb8 } but the correct result is 0.505L = { 0x3fe028f5, 0xc28f5c29, 0xbc547ae1, 0x47ae1480 } */ x = 1.01L; { int exp = -9999; long double y = frexpl (x, &exp); if (!(exp == 1 && y == 0.505L)) result |= 2; } /* Test on large finite numbers. This fails on BeOS at i = 16322, while LDBL_MAX_EXP = 16384. In the loop end test, we test x against Infinity, rather than comparing i with LDBL_MAX_EXP, because BeOS has a wrong LDBL_MAX_EXP. */ { int i; for (i = 1, x = 1.0L; x != x + x; i++, x *= 2.0L) { int exp = -9999; frexpl (x, &exp); if (exp != i) { result |= 4; break; } } } /* Test on denormalized numbers. */ { int i; for (i = 1, x = 1.0L; i >= LDBL_MIN_EXP; i--, x *= 0.5L) ; if (x > 0.0L) { int exp; long double y = frexpl (x, &exp); /* On machines with IEEE854 arithmetic: x = 1.68105e-4932, exp = -16382, y = 0.5. On Mac OS X 10.5: exp = -16384, y = 0.5. */ if (exp != LDBL_MIN_EXP - 1) result |= 8; } } /* Test on infinite numbers. */ x = 1.0L / 0.0L; { int exp; long double y = frexpl (x, &exp); if (y != x) result |= 16; } return result; }]])], [gl_cv_func_frexpl_works=yes], [gl_cv_func_frexpl_works=no], [ changequote(,)dnl case "$host_os" in aix | aix[3-6]* | beos* | darwin* | irix* | mingw* | pw*) gl_cv_func_frexpl_works="guessing no";; *) gl_cv_func_frexpl_works="guessing yes";; esac changequote([,])dnl ]) ]) ]) pspp-1.4.1/gl/m4/stat-time.m40000644000175000017500000000605713723215637015227 0ustar00blpblp00000000000000# Checks for stat-related time functions. # Copyright (C) 1998-1999, 2001, 2003, 2005-2007, 2009-2020 Free Software # Foundation, Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. dnl From Paul Eggert. # st_atim.tv_nsec - Linux, Solaris, Cygwin # st_atimespec.tv_nsec - FreeBSD, NetBSD, if ! defined _POSIX_SOURCE # st_atimensec - FreeBSD, NetBSD, if defined _POSIX_SOURCE # st_atim.st__tim.tv_nsec - UnixWare (at least 2.1.2 through 7.1) # st_birthtimespec - FreeBSD, NetBSD (hidden on OpenBSD 3.9, anyway) # st_birthtim - Cygwin 1.7.0+ AC_DEFUN([gl_STAT_TIME], [ AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS]) AC_CHECK_HEADERS_ONCE([sys/time.h]) AC_CHECK_MEMBERS([struct stat.st_atim.tv_nsec], [AC_CACHE_CHECK([whether struct stat.st_atim is of type struct timespec], [ac_cv_typeof_struct_stat_st_atim_is_struct_timespec], [AC_COMPILE_IFELSE([AC_LANG_PROGRAM( [[ #include #include #if HAVE_SYS_TIME_H # include #endif #include struct timespec ts; struct stat st; ]], [[ st.st_atim = ts; ]])], [ac_cv_typeof_struct_stat_st_atim_is_struct_timespec=yes], [ac_cv_typeof_struct_stat_st_atim_is_struct_timespec=no])]) if test $ac_cv_typeof_struct_stat_st_atim_is_struct_timespec = yes; then AC_DEFINE([TYPEOF_STRUCT_STAT_ST_ATIM_IS_STRUCT_TIMESPEC], [1], [Define to 1 if the type of the st_atim member of a struct stat is struct timespec.]) fi], [AC_CHECK_MEMBERS([struct stat.st_atimespec.tv_nsec], [], [AC_CHECK_MEMBERS([struct stat.st_atimensec], [], [AC_CHECK_MEMBERS([struct stat.st_atim.st__tim.tv_nsec], [], [], [#include #include ])], [#include #include ])], [#include #include ])], [#include #include ]) ]) # Check for st_birthtime, a feature from UFS2 (FreeBSD, NetBSD, OpenBSD, etc.) # and NTFS (Cygwin). # There was a time when this field was named st_createtime (21 June # 2002 to 16 July 2002) But that window is very small and applied only # to development code, so systems still using that configuration are # not supported. See revisions 1.10 and 1.11 of FreeBSD's # src/sys/ufs/ufs/dinode.h. # AC_DEFUN([gl_STAT_BIRTHTIME], [ AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS]) AC_CHECK_HEADERS_ONCE([sys/time.h]) AC_CHECK_MEMBERS([struct stat.st_birthtimespec.tv_nsec], [], [AC_CHECK_MEMBERS([struct stat.st_birthtimensec], [], [AC_CHECK_MEMBERS([struct stat.st_birthtim.tv_nsec], [], [], [#include #include ])], [#include #include ])], [#include #include ]) ]) pspp-1.4.1/gl/m4/unistd_h.m40000644000175000017500000002356413723215637015137 0ustar00blpblp00000000000000# unistd_h.m4 serial 81 dnl Copyright (C) 2006-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl Written by Simon Josefsson, Bruno Haible. AC_DEFUN([gl_UNISTD_H], [ dnl Use AC_REQUIRE here, so that the default behavior below is expanded dnl once only, before all statements that occur in other macros. AC_REQUIRE([gl_UNISTD_H_DEFAULTS]) gl_CHECK_NEXT_HEADERS([unistd.h]) if test $ac_cv_header_unistd_h = yes; then HAVE_UNISTD_H=1 else HAVE_UNISTD_H=0 fi AC_SUBST([HAVE_UNISTD_H]) dnl Ensure the type pid_t gets defined. AC_REQUIRE([AC_TYPE_PID_T]) dnl Determine WINDOWS_64_BIT_OFF_T. AC_REQUIRE([gl_TYPE_OFF_T]) dnl Check for declarations of anything we want to poison if the dnl corresponding gnulib module is not in use. gl_WARN_ON_USE_PREPARE([[ #if HAVE_UNISTD_H # include #endif /* Some systems declare various items in the wrong headers. */ #if !(defined __GLIBC__ && !defined __UCLIBC__) # include # include # include # if defined _WIN32 && ! defined __CYGWIN__ # include # endif #endif ]], [access chdir chown dup dup2 dup3 environ euidaccess faccessat fchdir fchownat fdatasync fsync ftruncate getcwd getdomainname getdtablesize getentropy getgroups gethostname getlogin getlogin_r getpagesize getpass getusershell setusershell endusershell group_member isatty lchown link linkat lseek pipe pipe2 pread pwrite readlink readlinkat rmdir sethostname sleep symlink symlinkat truncate ttyname_r unlink unlinkat usleep]) AC_REQUIRE([AC_C_RESTRICT]) ]) AC_DEFUN([gl_UNISTD_MODULE_INDICATOR], [ dnl Use AC_REQUIRE here, so that the default settings are expanded once only. AC_REQUIRE([gl_UNISTD_H_DEFAULTS]) gl_MODULE_INDICATOR_SET_VARIABLE([$1]) dnl Define it also as a C macro, for the benefit of the unit tests. gl_MODULE_INDICATOR_FOR_TESTS([$1]) ]) AC_DEFUN([gl_UNISTD_H_DEFAULTS], [ GNULIB_ACCESS=0; AC_SUBST([GNULIB_ACCESS]) GNULIB_CHDIR=0; AC_SUBST([GNULIB_CHDIR]) GNULIB_CHOWN=0; AC_SUBST([GNULIB_CHOWN]) GNULIB_CLOSE=0; AC_SUBST([GNULIB_CLOSE]) GNULIB_COPY_FILE_RANGE=0; AC_SUBST([GNULIB_COPY_FILE_RANGE]) GNULIB_DUP=0; AC_SUBST([GNULIB_DUP]) GNULIB_DUP2=0; AC_SUBST([GNULIB_DUP2]) GNULIB_DUP3=0; AC_SUBST([GNULIB_DUP3]) GNULIB_ENVIRON=0; AC_SUBST([GNULIB_ENVIRON]) GNULIB_EUIDACCESS=0; AC_SUBST([GNULIB_EUIDACCESS]) GNULIB_FACCESSAT=0; AC_SUBST([GNULIB_FACCESSAT]) GNULIB_FCHDIR=0; AC_SUBST([GNULIB_FCHDIR]) GNULIB_FCHOWNAT=0; AC_SUBST([GNULIB_FCHOWNAT]) GNULIB_FDATASYNC=0; AC_SUBST([GNULIB_FDATASYNC]) GNULIB_FSYNC=0; AC_SUBST([GNULIB_FSYNC]) GNULIB_FTRUNCATE=0; AC_SUBST([GNULIB_FTRUNCATE]) GNULIB_GETCWD=0; AC_SUBST([GNULIB_GETCWD]) GNULIB_GETDOMAINNAME=0; AC_SUBST([GNULIB_GETDOMAINNAME]) GNULIB_GETDTABLESIZE=0; AC_SUBST([GNULIB_GETDTABLESIZE]) GNULIB_GETENTROPY=0; AC_SUBST([GNULIB_GETENTROPY]) GNULIB_GETGROUPS=0; AC_SUBST([GNULIB_GETGROUPS]) GNULIB_GETHOSTNAME=0; AC_SUBST([GNULIB_GETHOSTNAME]) GNULIB_GETLOGIN=0; AC_SUBST([GNULIB_GETLOGIN]) GNULIB_GETLOGIN_R=0; AC_SUBST([GNULIB_GETLOGIN_R]) GNULIB_GETOPT_POSIX=0; AC_SUBST([GNULIB_GETOPT_POSIX]) GNULIB_GETPAGESIZE=0; AC_SUBST([GNULIB_GETPAGESIZE]) GNULIB_GETPASS=0; AC_SUBST([GNULIB_GETPASS]) GNULIB_GETUSERSHELL=0; AC_SUBST([GNULIB_GETUSERSHELL]) GNULIB_GROUP_MEMBER=0; AC_SUBST([GNULIB_GROUP_MEMBER]) GNULIB_ISATTY=0; AC_SUBST([GNULIB_ISATTY]) GNULIB_LCHOWN=0; AC_SUBST([GNULIB_LCHOWN]) GNULIB_LINK=0; AC_SUBST([GNULIB_LINK]) GNULIB_LINKAT=0; AC_SUBST([GNULIB_LINKAT]) GNULIB_LSEEK=0; AC_SUBST([GNULIB_LSEEK]) GNULIB_PIPE=0; AC_SUBST([GNULIB_PIPE]) GNULIB_PIPE2=0; AC_SUBST([GNULIB_PIPE2]) GNULIB_PREAD=0; AC_SUBST([GNULIB_PREAD]) GNULIB_PWRITE=0; AC_SUBST([GNULIB_PWRITE]) GNULIB_READ=0; AC_SUBST([GNULIB_READ]) GNULIB_READLINK=0; AC_SUBST([GNULIB_READLINK]) GNULIB_READLINKAT=0; AC_SUBST([GNULIB_READLINKAT]) GNULIB_RMDIR=0; AC_SUBST([GNULIB_RMDIR]) GNULIB_SETHOSTNAME=0; AC_SUBST([GNULIB_SETHOSTNAME]) GNULIB_SLEEP=0; AC_SUBST([GNULIB_SLEEP]) GNULIB_SYMLINK=0; AC_SUBST([GNULIB_SYMLINK]) GNULIB_SYMLINKAT=0; AC_SUBST([GNULIB_SYMLINKAT]) GNULIB_TRUNCATE=0; AC_SUBST([GNULIB_TRUNCATE]) GNULIB_TTYNAME_R=0; AC_SUBST([GNULIB_TTYNAME_R]) GNULIB_UNISTD_H_NONBLOCKING=0; AC_SUBST([GNULIB_UNISTD_H_NONBLOCKING]) GNULIB_UNISTD_H_SIGPIPE=0; AC_SUBST([GNULIB_UNISTD_H_SIGPIPE]) GNULIB_UNLINK=0; AC_SUBST([GNULIB_UNLINK]) GNULIB_UNLINKAT=0; AC_SUBST([GNULIB_UNLINKAT]) GNULIB_USLEEP=0; AC_SUBST([GNULIB_USLEEP]) GNULIB_WRITE=0; AC_SUBST([GNULIB_WRITE]) dnl Assume proper GNU behavior unless another module says otherwise. HAVE_CHOWN=1; AC_SUBST([HAVE_CHOWN]) HAVE_COPY_FILE_RANGE=1; AC_SUBST([HAVE_COPY_FILE_RANGE]) HAVE_DUP3=1; AC_SUBST([HAVE_DUP3]) HAVE_EUIDACCESS=1; AC_SUBST([HAVE_EUIDACCESS]) HAVE_FACCESSAT=1; AC_SUBST([HAVE_FACCESSAT]) HAVE_FCHDIR=1; AC_SUBST([HAVE_FCHDIR]) HAVE_FCHOWNAT=1; AC_SUBST([HAVE_FCHOWNAT]) HAVE_FDATASYNC=1; AC_SUBST([HAVE_FDATASYNC]) HAVE_FSYNC=1; AC_SUBST([HAVE_FSYNC]) HAVE_FTRUNCATE=1; AC_SUBST([HAVE_FTRUNCATE]) HAVE_GETDTABLESIZE=1; AC_SUBST([HAVE_GETDTABLESIZE]) HAVE_GETENTROPY=1; AC_SUBST([HAVE_GETENTROPY]) HAVE_GETGROUPS=1; AC_SUBST([HAVE_GETGROUPS]) HAVE_GETHOSTNAME=1; AC_SUBST([HAVE_GETHOSTNAME]) HAVE_GETLOGIN=1; AC_SUBST([HAVE_GETLOGIN]) HAVE_GETPAGESIZE=1; AC_SUBST([HAVE_GETPAGESIZE]) HAVE_GETPASS=1; AC_SUBST([HAVE_GETPASS]) HAVE_GROUP_MEMBER=1; AC_SUBST([HAVE_GROUP_MEMBER]) HAVE_LCHOWN=1; AC_SUBST([HAVE_LCHOWN]) HAVE_LINK=1; AC_SUBST([HAVE_LINK]) HAVE_LINKAT=1; AC_SUBST([HAVE_LINKAT]) HAVE_PIPE=1; AC_SUBST([HAVE_PIPE]) HAVE_PIPE2=1; AC_SUBST([HAVE_PIPE2]) HAVE_PREAD=1; AC_SUBST([HAVE_PREAD]) HAVE_PWRITE=1; AC_SUBST([HAVE_PWRITE]) HAVE_READLINK=1; AC_SUBST([HAVE_READLINK]) HAVE_READLINKAT=1; AC_SUBST([HAVE_READLINKAT]) HAVE_SETHOSTNAME=1; AC_SUBST([HAVE_SETHOSTNAME]) HAVE_SLEEP=1; AC_SUBST([HAVE_SLEEP]) HAVE_SYMLINK=1; AC_SUBST([HAVE_SYMLINK]) HAVE_SYMLINKAT=1; AC_SUBST([HAVE_SYMLINKAT]) HAVE_UNLINKAT=1; AC_SUBST([HAVE_UNLINKAT]) HAVE_USLEEP=1; AC_SUBST([HAVE_USLEEP]) HAVE_DECL_ENVIRON=1; AC_SUBST([HAVE_DECL_ENVIRON]) HAVE_DECL_FCHDIR=1; AC_SUBST([HAVE_DECL_FCHDIR]) HAVE_DECL_FDATASYNC=1; AC_SUBST([HAVE_DECL_FDATASYNC]) HAVE_DECL_GETDOMAINNAME=1; AC_SUBST([HAVE_DECL_GETDOMAINNAME]) HAVE_DECL_GETLOGIN=1; AC_SUBST([HAVE_DECL_GETLOGIN]) HAVE_DECL_GETLOGIN_R=1; AC_SUBST([HAVE_DECL_GETLOGIN_R]) HAVE_DECL_GETPAGESIZE=1; AC_SUBST([HAVE_DECL_GETPAGESIZE]) HAVE_DECL_GETUSERSHELL=1; AC_SUBST([HAVE_DECL_GETUSERSHELL]) HAVE_DECL_SETHOSTNAME=1; AC_SUBST([HAVE_DECL_SETHOSTNAME]) HAVE_DECL_TRUNCATE=1; AC_SUBST([HAVE_DECL_TRUNCATE]) HAVE_DECL_TTYNAME_R=1; AC_SUBST([HAVE_DECL_TTYNAME_R]) HAVE_OS_H=0; AC_SUBST([HAVE_OS_H]) HAVE_SYS_PARAM_H=0; AC_SUBST([HAVE_SYS_PARAM_H]) REPLACE_ACCESS=0; AC_SUBST([REPLACE_ACCESS]) REPLACE_CHOWN=0; AC_SUBST([REPLACE_CHOWN]) REPLACE_CLOSE=0; AC_SUBST([REPLACE_CLOSE]) REPLACE_DUP=0; AC_SUBST([REPLACE_DUP]) REPLACE_DUP2=0; AC_SUBST([REPLACE_DUP2]) REPLACE_FACCESSAT=0; AC_SUBST([REPLACE_FACCESSAT]) REPLACE_FCHOWNAT=0; AC_SUBST([REPLACE_FCHOWNAT]) REPLACE_FTRUNCATE=0; AC_SUBST([REPLACE_FTRUNCATE]) REPLACE_GETCWD=0; AC_SUBST([REPLACE_GETCWD]) REPLACE_GETDOMAINNAME=0; AC_SUBST([REPLACE_GETDOMAINNAME]) REPLACE_GETDTABLESIZE=0; AC_SUBST([REPLACE_GETDTABLESIZE]) REPLACE_GETLOGIN_R=0; AC_SUBST([REPLACE_GETLOGIN_R]) REPLACE_GETGROUPS=0; AC_SUBST([REPLACE_GETGROUPS]) REPLACE_GETPAGESIZE=0; AC_SUBST([REPLACE_GETPAGESIZE]) REPLACE_GETPASS=0; AC_SUBST([REPLACE_GETPASS]) REPLACE_ISATTY=0; AC_SUBST([REPLACE_ISATTY]) REPLACE_LCHOWN=0; AC_SUBST([REPLACE_LCHOWN]) REPLACE_LINK=0; AC_SUBST([REPLACE_LINK]) REPLACE_LINKAT=0; AC_SUBST([REPLACE_LINKAT]) REPLACE_LSEEK=0; AC_SUBST([REPLACE_LSEEK]) REPLACE_PREAD=0; AC_SUBST([REPLACE_PREAD]) REPLACE_PWRITE=0; AC_SUBST([REPLACE_PWRITE]) REPLACE_READ=0; AC_SUBST([REPLACE_READ]) REPLACE_READLINK=0; AC_SUBST([REPLACE_READLINK]) REPLACE_READLINKAT=0; AC_SUBST([REPLACE_READLINKAT]) REPLACE_RMDIR=0; AC_SUBST([REPLACE_RMDIR]) REPLACE_SLEEP=0; AC_SUBST([REPLACE_SLEEP]) REPLACE_SYMLINK=0; AC_SUBST([REPLACE_SYMLINK]) REPLACE_SYMLINKAT=0; AC_SUBST([REPLACE_SYMLINKAT]) REPLACE_TRUNCATE=0; AC_SUBST([REPLACE_TRUNCATE]) REPLACE_TTYNAME_R=0; AC_SUBST([REPLACE_TTYNAME_R]) REPLACE_UNLINK=0; AC_SUBST([REPLACE_UNLINK]) REPLACE_UNLINKAT=0; AC_SUBST([REPLACE_UNLINKAT]) REPLACE_USLEEP=0; AC_SUBST([REPLACE_USLEEP]) REPLACE_WRITE=0; AC_SUBST([REPLACE_WRITE]) UNISTD_H_HAVE_SYS_RANDOM_H=0; AC_SUBST([UNISTD_H_HAVE_SYS_RANDOM_H]) UNISTD_H_HAVE_WINSOCK2_H=0; AC_SUBST([UNISTD_H_HAVE_WINSOCK2_H]) UNISTD_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS=0; AC_SUBST([UNISTD_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS]) ]) pspp-1.4.1/gl/m4/localcharset.m40000644000175000017500000000063313723215637015756 0ustar00blpblp00000000000000# localcharset.m4 serial 8 dnl Copyright (C) 2002, 2004, 2006, 2009-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_LOCALCHARSET], [ dnl Prerequisites of lib/localcharset.c. AC_REQUIRE([AM_LANGINFO_CODESET]) ]) pspp-1.4.1/gl/m4/rename.m40000644000175000017500000002411513723215637014562 0ustar00blpblp00000000000000# serial 32 # Copyright (C) 2001, 2003, 2005-2006, 2009-2020 Free Software Foundation, Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. dnl From Volker Borchert. dnl Determine whether rename works for source file names with a trailing slash. dnl The rename from SunOS 4.1.1_U1 doesn't. dnl dnl If it doesn't, then define RENAME_TRAILING_SLASH_BUG and arrange dnl to compile the wrapper function. dnl AC_DEFUN([gl_FUNC_RENAME], [ AC_REQUIRE([AC_CANONICAL_HOST]) AC_REQUIRE([gl_STDIO_H_DEFAULTS]) AC_CHECK_FUNCS_ONCE([lstat]) dnl Solaris 11.3, AIX 7.1 mistakenly allow rename("file","name/"). dnl NetBSD 1.6 mistakenly forbids rename("dir","name/"). dnl FreeBSD 7.2 mistakenly allows rename("file","link-to-file/"). dnl The Solaris bug can be worked around without stripping dnl trailing slash, while the NetBSD bug requires stripping; dnl the two conditions can be distinguished by whether hard dnl links are also broken. AC_CACHE_CHECK([whether rename honors trailing slash on destination], [gl_cv_func_rename_slash_dst_works], [rm -rf conftest.f conftest.f1 conftest.f2 conftest.d1 conftest.d2 conftest.lnk touch conftest.f && touch conftest.f1 && mkdir conftest.d1 || AC_MSG_ERROR([cannot create temporary files]) # Assume that if we have lstat, we can also check symlinks. if test $ac_cv_func_lstat = yes; then ln -s conftest.f conftest.lnk fi AC_RUN_IFELSE( [AC_LANG_PROGRAM([[ # include # include ]], [[int result = 0; if (rename ("conftest.f1", "conftest.f2/") == 0) result |= 1; if (rename ("conftest.d1", "conftest.d2/") != 0) result |= 2; #if HAVE_LSTAT if (rename ("conftest.f", "conftest.lnk/") == 0) result |= 4; #endif return result; ]])], [gl_cv_func_rename_slash_dst_works=yes], [gl_cv_func_rename_slash_dst_works=no], dnl When crosscompiling, assume rename is broken. [case "$host_os" in # Guess yes on Linux systems. linux-* | linux) gl_cv_func_rename_slash_dst_works="guessing yes" ;; # Guess yes on glibc systems. *-gnu*) gl_cv_func_rename_slash_dst_works="guessing yes" ;; # Guess no on native Windows. mingw*) gl_cv_func_rename_slash_dst_works="guessing no" ;; # If we don't know, obey --enable-cross-guesses. *) gl_cv_func_rename_slash_dst_works="$gl_cross_guess_normal" ;; esac ]) rm -rf conftest.f conftest.f1 conftest.f2 conftest.d1 conftest.d2 conftest.lnk ]) case "$gl_cv_func_rename_slash_dst_works" in *yes) ;; *) REPLACE_RENAME=1 AC_DEFINE([RENAME_TRAILING_SLASH_DEST_BUG], [1], [Define if rename does not correctly handle slashes on the destination argument, such as on Solaris 11 or NetBSD 1.6.]) ;; esac dnl SunOS 4.1.1_U1 mistakenly forbids rename("dir/","name"). dnl Solaris 9 mistakenly allows rename("file/","name"). dnl FreeBSD 7.2 mistakenly allows rename("link-to-file/","name"). dnl These bugs require stripping trailing slash to avoid corrupting dnl symlinks with a trailing slash. AC_CACHE_CHECK([whether rename honors trailing slash on source], [gl_cv_func_rename_slash_src_works], [rm -rf conftest.f conftest.f1 conftest.d1 conftest.d2 conftest.d3 conftest.lnk touch conftest.f && touch conftest.f1 && mkdir conftest.d1 || AC_MSG_ERROR([cannot create temporary files]) # Assume that if we have lstat, we can also check symlinks. if test $ac_cv_func_lstat = yes; then ln -s conftest.f conftest.lnk fi AC_RUN_IFELSE( [AC_LANG_PROGRAM([[ # include # include ]], [[int result = 0; if (rename ("conftest.f1/", "conftest.d3") == 0) result |= 1; if (rename ("conftest.d1/", "conftest.d2") != 0) result |= 2; #if HAVE_LSTAT if (rename ("conftest.lnk/", "conftest.f") == 0) result |= 4; #endif return result; ]])], [gl_cv_func_rename_slash_src_works=yes], [gl_cv_func_rename_slash_src_works=no], dnl When crosscompiling, assume rename is broken. [case "$host_os" in # Guess yes on Linux systems. linux-* | linux) gl_cv_func_rename_slash_src_works="guessing yes" ;; # Guess yes on glibc systems. *-gnu*) gl_cv_func_rename_slash_src_works="guessing yes" ;; # Guess yes on native Windows. mingw*) gl_cv_func_rename_slash_src_works="guessing yes" ;; # If we don't know, obey --enable-cross-guesses. *) gl_cv_func_rename_slash_src_works="$gl_cross_guess_normal" ;; esac ]) rm -rf conftest.f conftest.f1 conftest.d1 conftest.d2 conftest.d3 conftest.lnk ]) case "$gl_cv_func_rename_slash_src_works" in *yes) ;; *) REPLACE_RENAME=1 AC_DEFINE([RENAME_TRAILING_SLASH_SOURCE_BUG], [1], [Define if rename does not correctly handle slashes on the source argument, such as on Solaris 9 or cygwin 1.5.]) ;; esac dnl NetBSD 1.6 and cygwin 1.5.x mistakenly reduce hard link count dnl on rename("h1","h2"). dnl This bug requires stat'ting targets prior to attempting rename. AC_CHECK_FUNCS_ONCE([link]) AC_CACHE_CHECK([whether rename manages hard links correctly], [gl_cv_func_rename_link_works], [if test $ac_cv_func_link = yes; then if test $cross_compiling != yes; then rm -rf conftest.f conftest.f1 conftest.f2 if touch conftest.f conftest.f2 && ln conftest.f conftest.f1 && set x `ls -i conftest.f conftest.f1` && test "$2" = "$4"; then AC_RUN_IFELSE( [AC_LANG_PROGRAM([[ # include # include # include # include ]], [[int result = 0; if (rename ("conftest.f", "conftest.f1")) result |= 1; if (unlink ("conftest.f1")) result |= 2; /* Allow either the POSIX-required behavior, where the previous rename kept conftest.f, or the (better) NetBSD behavior, where it removed conftest.f. */ if (rename ("conftest.f", "conftest.f") != 0 && errno != ENOENT) result |= 4; if (rename ("conftest.f1", "conftest.f1") == 0) result |= 8; if (rename ("conftest.f2", "conftest.f2") != 0) result |= 16; return result; ]])], [gl_cv_func_rename_link_works=yes], [gl_cv_func_rename_link_works=no], [dnl We don't get here. : ]) else gl_cv_func_rename_link_works="guessing no" fi rm -rf conftest.f conftest.f1 conftest.f2 else dnl When crosscompiling, assume rename is broken. case "$host_os" in # Guess yes on Linux systems. linux-* | linux) gl_cv_func_rename_link_works="guessing yes" ;; # Guess yes on glibc systems. *-gnu*) gl_cv_func_rename_link_works="guessing yes" ;; # Guess yes on native Windows. mingw*) gl_cv_func_rename_link_works="guessing yes" ;; # If we don't know, obey --enable-cross-guesses. *) gl_cv_func_rename_link_works="$gl_cross_guess_normal" ;; esac fi else gl_cv_func_rename_link_works=yes fi ]) case "$gl_cv_func_rename_link_works" in *yes) ;; *) REPLACE_RENAME=1 AC_DEFINE([RENAME_HARD_LINK_BUG], [1], [Define if rename fails to leave hard links alone, as on NetBSD 1.6 or Cygwin 1.5.]) ;; esac dnl Cygwin 1.5.x mistakenly allows rename("dir","file"). dnl mingw mistakenly forbids rename("dir1","dir2"). dnl These bugs require stripping trailing slash to avoid corrupting dnl symlinks with a trailing slash. AC_CACHE_CHECK([whether rename manages existing destinations correctly], [gl_cv_func_rename_dest_works], [rm -rf conftest.f conftest.d1 conftest.d2 touch conftest.f && mkdir conftest.d1 conftest.d2 || AC_MSG_ERROR([cannot create temporary files]) AC_RUN_IFELSE( [AC_LANG_PROGRAM([[ # include # include ]], [[int result = 0; if (rename ("conftest.d1", "conftest.d2") != 0) result |= 1; if (rename ("conftest.d2", "conftest.f") == 0) result |= 2; return result; ]])], [gl_cv_func_rename_dest_works=yes], [gl_cv_func_rename_dest_works=no], dnl When crosscompiling, assume rename is broken. [case "$host_os" in # Guess yes on Linux systems. linux-* | linux) gl_cv_func_rename_dest_works="guessing yes" ;; # Guess yes on glibc systems. *-gnu*) gl_cv_func_rename_dest_works="guessing yes" ;; # Guess no on native Windows. mingw*) gl_cv_func_rename_dest_works="guessing no" ;; # If we don't know, obey --enable-cross-guesses. *) gl_cv_func_rename_dest_works="$gl_cross_guess_normal" ;; esac ]) rm -rf conftest.f conftest.d1 conftest.d2 ]) case "$gl_cv_func_rename_dest_works" in *yes) ;; *) REPLACE_RENAME=1 AC_DEFINE([RENAME_DEST_EXISTS_BUG], [1], [Define if rename does not work when the destination file exists, as on Cygwin 1.5 or Windows.]) ;; esac ]) pspp-1.4.1/gl/m4/eealloc.m40000644000175000017500000000166713723215637014726 0ustar00blpblp00000000000000# eealloc.m4 serial 3 dnl Copyright (C) 2003, 2009-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_EEALLOC], [ AC_REQUIRE([gl_EEMALLOC]) AC_REQUIRE([gl_EEREALLOC]) ]) AC_DEFUN([gl_EEMALLOC], [ _AC_FUNC_MALLOC_IF( [gl_cv_func_malloc_0_nonnull=1], [gl_cv_func_malloc_0_nonnull=0]) AC_DEFINE_UNQUOTED([MALLOC_0_IS_NONNULL], [$gl_cv_func_malloc_0_nonnull], [If malloc(0) is != NULL, define this to 1. Otherwise define this to 0.]) ]) AC_DEFUN([gl_EEREALLOC], [ _AC_FUNC_REALLOC_IF( [gl_cv_func_realloc_0_nonnull=1], [gl_cv_func_realloc_0_nonnull=0]) AC_DEFINE_UNQUOTED([REALLOC_0_IS_NONNULL], [$gl_cv_func_realloc_0_nonnull], [If realloc(NULL,0) is != NULL, define this to 1. Otherwise define this to 0.]) ]) pspp-1.4.1/gl/m4/sys_select_h.m40000644000175000017500000000671613723215637016006 0ustar00blpblp00000000000000# sys_select_h.m4 serial 20 dnl Copyright (C) 2006-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_HEADER_SYS_SELECT], [ AC_REQUIRE([AC_C_RESTRICT]) AC_REQUIRE([gl_SYS_SELECT_H_DEFAULTS]) AC_CACHE_CHECK([whether is self-contained], [gl_cv_header_sys_select_h_selfcontained], [ dnl Test against two bugs: dnl 1. On many platforms, assumes prior inclusion of dnl . dnl 2. On OSF/1 4.0, provides only a forward declaration dnl of 'struct timeval', and no definition of this type. AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include ]], [[struct timeval b;]])], [gl_cv_header_sys_select_h_selfcontained=yes], [gl_cv_header_sys_select_h_selfcontained=no]) dnl Test against another bug: dnl 3. On Solaris 10, provides an FD_ZERO implementation dnl that relies on memset(), but without including . if test $gl_cv_header_sys_select_h_selfcontained = yes; then AC_COMPILE_IFELSE( [AC_LANG_PROGRAM([[#include ]], [[int memset; int bzero;]]) ], [AC_LINK_IFELSE( [AC_LANG_PROGRAM([[#include ]], [[ #undef memset #define memset nonexistent_memset extern #ifdef __cplusplus "C" #endif void *memset (void *, int, unsigned long); #undef bzero #define bzero nonexistent_bzero extern #ifdef __cplusplus "C" #endif void bzero (void *, unsigned long); fd_set fds; FD_ZERO (&fds); ]]) ], [], [gl_cv_header_sys_select_h_selfcontained=no]) ]) fi ]) dnl is always overridden, because of GNULIB_POSIXCHECK. gl_CHECK_NEXT_HEADERS([sys/select.h]) if test $ac_cv_header_sys_select_h = yes; then HAVE_SYS_SELECT_H=1 else HAVE_SYS_SELECT_H=0 fi AC_SUBST([HAVE_SYS_SELECT_H]) gl_PREREQ_SYS_H_WINSOCK2 dnl Check for declarations of anything we want to poison if the dnl corresponding gnulib module is not in use. gl_WARN_ON_USE_PREPARE([[ /* Some systems require prerequisite headers. */ #include #if !(defined __GLIBC__ && !defined __UCLIBC__) && HAVE_SYS_TIME_H # include #endif #include ]], [pselect select]) ]) AC_DEFUN([gl_SYS_SELECT_MODULE_INDICATOR], [ dnl Use AC_REQUIRE here, so that the default settings are expanded once only. AC_REQUIRE([gl_SYS_SELECT_H_DEFAULTS]) gl_MODULE_INDICATOR_SET_VARIABLE([$1]) dnl Define it also as a C macro, for the benefit of the unit tests. gl_MODULE_INDICATOR_FOR_TESTS([$1]) ]) AC_DEFUN([gl_SYS_SELECT_H_DEFAULTS], [ GNULIB_PSELECT=0; AC_SUBST([GNULIB_PSELECT]) GNULIB_SELECT=0; AC_SUBST([GNULIB_SELECT]) dnl Assume proper GNU behavior unless another module says otherwise. HAVE_PSELECT=1; AC_SUBST([HAVE_PSELECT]) REPLACE_PSELECT=0; AC_SUBST([REPLACE_PSELECT]) REPLACE_SELECT=0; AC_SUBST([REPLACE_SELECT]) ]) pspp-1.4.1/gl/m4/lib-ld.m40000644000175000017500000001237213723215637014460 0ustar00blpblp00000000000000# lib-ld.m4 serial 9 dnl Copyright (C) 1996-2003, 2009-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl Subroutines of libtool.m4, dnl with replacements s/_*LT_PATH/AC_LIB_PROG/ and s/lt_/acl_/ to avoid dnl collision with libtool.m4. dnl From libtool-2.4. Sets the variable with_gnu_ld to yes or no. AC_DEFUN([AC_LIB_PROG_LD_GNU], [AC_CACHE_CHECK([if the linker ($LD) is GNU ld], [acl_cv_prog_gnu_ld], [# I'd rather use --version here, but apparently some GNU lds only accept -v. case `$LD -v 2>&1 /dev/null 2>&1 \ && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 \ || PATH_SEPARATOR=';' } fi if test -n "$LD"; then AC_MSG_CHECKING([for ld]) elif test "$GCC" = yes; then AC_MSG_CHECKING([for ld used by $CC]) elif test "$with_gnu_ld" = yes; then AC_MSG_CHECKING([for GNU ld]) else AC_MSG_CHECKING([for non-GNU ld]) fi if test -n "$LD"; then # Let the user override the test with a path. : else AC_CACHE_VAL([acl_cv_path_LD], [ acl_cv_path_LD= # Final result of this test ac_prog=ld # Program to search in $PATH if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. case $host in *-*-mingw*) # gcc leaves a trailing carriage return which upsets mingw acl_output=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) acl_output=`($CC -print-prog-name=ld) 2>&5` ;; esac case $acl_output in # Accept absolute paths. [[\\/]]* | ?:[[\\/]]*) re_direlt='/[[^/]][[^/]]*/\.\./' # Canonicalize the pathname of ld acl_output=`echo "$acl_output" | sed 's%\\\\%/%g'` while echo "$acl_output" | grep "$re_direlt" > /dev/null 2>&1; do acl_output=`echo $acl_output | sed "s%$re_direlt%/%"` done # Got the pathname. No search in PATH is needed. acl_cv_path_LD="$acl_output" ac_prog= ;; "") # If it fails, then pretend we aren't using GCC. ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac fi if test -n "$ac_prog"; then # Search for $ac_prog in $PATH. acl_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS="$acl_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then acl_cv_path_LD="$ac_dir/$ac_prog" # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some variants of GNU ld only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$acl_cv_path_LD" -v 2>&1 0) return 1; return 0; }]])], [gl_cv_func_itold_works=yes], [gl_cv_func_itold_works=no], [case "$host" in sparc*-*-linux*) AC_COMPILE_IFELSE( [AC_LANG_SOURCE( [[#if defined __LP64__ || defined __arch64__ int ok; #else error fail #endif ]])], [gl_cv_func_itold_works="guessing no"], [gl_cv_func_itold_works="guessing yes"]) ;; # Guess yes on native Windows. mingw*) gl_cv_func_itold_works="guessing yes" ;; *) gl_cv_func_itold_works="guessing yes" ;; esac ]) ]) case "$gl_cv_func_itold_works" in *no) REPLACE_ITOLD=1 dnl We add the workaround to but also to , dnl to increase the chances that the fix function gets pulled in. FLOAT_H=float.h ;; esac if test -n "$FLOAT_H"; then gl_NEXT_HEADERS([float.h]) fi AC_SUBST([FLOAT_H]) AM_CONDITIONAL([GL_GENERATE_FLOAT_H], [test -n "$FLOAT_H"]) AC_SUBST([REPLACE_ITOLD]) ]) pspp-1.4.1/gl/m4/largefile.m40000644000175000017500000001500513723215637015243 0ustar00blpblp00000000000000# Enable large files on systems where this is not the default. # Enable support for files on Linux file systems with 64-bit inode numbers. # Copyright 1992-1996, 1998-2020 Free Software Foundation, Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # The following macro works around a problem in Autoconf's AC_FUNC_FSEEKO: # It does not set _LARGEFILE_SOURCE=1 on HP-UX/ia64 32-bit, although this # setting of _LARGEFILE_SOURCE is needed so that declares fseeko # and ftello in C++ mode as well. AC_DEFUN([gl_SET_LARGEFILE_SOURCE], [ AC_REQUIRE([AC_CANONICAL_HOST]) AC_FUNC_FSEEKO case "$host_os" in hpux*) AC_DEFINE([_LARGEFILE_SOURCE], [1], [Define to 1 to make fseeko visible on some hosts (e.g. glibc 2.2).]) ;; esac ]) # The following implementation works around a problem in autoconf <= 2.69; # AC_SYS_LARGEFILE does not configure for large inodes on Mac OS X 10.5, # or configures them incorrectly in some cases. m4_version_prereq([2.70], [] ,[ # _AC_SYS_LARGEFILE_TEST_INCLUDES # ------------------------------- m4_define([_AC_SYS_LARGEFILE_TEST_INCLUDES], [@%:@include /* Check that off_t can represent 2**63 - 1 correctly. We can't simply define LARGE_OFF_T to be 9223372036854775807, since some C++ compilers masquerading as C compilers incorrectly reject 9223372036854775807. */ @%:@define LARGE_OFF_T (((off_t) 1 << 31 << 31) - 1 + ((off_t) 1 << 31 << 31)) int off_t_is_large[[(LARGE_OFF_T % 2147483629 == 721 && LARGE_OFF_T % 2147483647 == 1) ? 1 : -1]];[]dnl ]) # _AC_SYS_LARGEFILE_MACRO_VALUE(C-MACRO, VALUE, # CACHE-VAR, # DESCRIPTION, # PROLOGUE, [FUNCTION-BODY]) # -------------------------------------------------------- m4_define([_AC_SYS_LARGEFILE_MACRO_VALUE], [AC_CACHE_CHECK([for $1 value needed for large files], [$3], [while :; do m4_ifval([$6], [AC_LINK_IFELSE], [AC_COMPILE_IFELSE])( [AC_LANG_PROGRAM([$5], [$6])], [$3=no; break]) m4_ifval([$6], [AC_LINK_IFELSE], [AC_COMPILE_IFELSE])( [AC_LANG_PROGRAM([@%:@define $1 $2 $5], [$6])], [$3=$2; break]) $3=unknown break done]) case $$3 in #( no | unknown) ;; *) AC_DEFINE_UNQUOTED([$1], [$$3], [$4]);; esac rm -rf conftest*[]dnl ])# _AC_SYS_LARGEFILE_MACRO_VALUE # AC_SYS_LARGEFILE # ---------------- # By default, many hosts won't let programs access large files; # one must use special compiler options to get large-file access to work. # For more details about this brain damage please see: # http://www.unix.org/version2/whatsnew/lfs20mar.html # Additionally, on Linux file systems with 64-bit inodes a file that happens # to have a 64-bit inode number cannot be accessed by 32-bit applications on # Linux x86/x86_64. This can occur with file systems such as XFS and NFS. AC_DEFUN([AC_SYS_LARGEFILE], [AC_ARG_ENABLE(largefile, [ --disable-largefile omit support for large files]) if test "$enable_largefile" != no; then AC_CACHE_CHECK([for special C compiler options needed for large files], ac_cv_sys_largefile_CC, [ac_cv_sys_largefile_CC=no if test "$GCC" != yes; then ac_save_CC=$CC while :; do # IRIX 6.2 and later do not support large files by default, # so use the C compiler's -n32 option if that helps. AC_LANG_CONFTEST([AC_LANG_PROGRAM([_AC_SYS_LARGEFILE_TEST_INCLUDES])]) AC_COMPILE_IFELSE([], [break]) CC="$CC -n32" AC_COMPILE_IFELSE([], [ac_cv_sys_largefile_CC=' -n32'; break]) break done CC=$ac_save_CC rm -f conftest.$ac_ext fi]) if test "$ac_cv_sys_largefile_CC" != no; then CC=$CC$ac_cv_sys_largefile_CC fi _AC_SYS_LARGEFILE_MACRO_VALUE(_FILE_OFFSET_BITS, 64, ac_cv_sys_file_offset_bits, [Number of bits in a file offset, on hosts where this is settable.], [_AC_SYS_LARGEFILE_TEST_INCLUDES]) if test $ac_cv_sys_file_offset_bits = unknown; then _AC_SYS_LARGEFILE_MACRO_VALUE(_LARGE_FILES, 1, ac_cv_sys_large_files, [Define for large files, on AIX-style hosts.], [_AC_SYS_LARGEFILE_TEST_INCLUDES]) fi fi ])# AC_SYS_LARGEFILE ])# m4_version_prereq 2.70 # Enable large files on systems where this is implemented by Gnulib, not by the # system headers. # Set the variables WINDOWS_64_BIT_OFF_T, WINDOWS_64_BIT_ST_SIZE if Gnulib # overrides ensure that off_t or 'struct size.st_size' are 64-bit, respectively. AC_DEFUN([gl_LARGEFILE], [ AC_REQUIRE([AC_CANONICAL_HOST]) case "$host_os" in mingw*) dnl Native Windows. dnl mingw64 defines off_t to a 64-bit type already, if dnl _FILE_OFFSET_BITS=64, which is ensured by AC_SYS_LARGEFILE. AC_CACHE_CHECK([for 64-bit off_t], [gl_cv_type_off_t_64], [AC_COMPILE_IFELSE( [AC_LANG_PROGRAM( [[#include int verify_off_t_size[sizeof (off_t) >= 8 ? 1 : -1]; ]], [[]])], [gl_cv_type_off_t_64=yes], [gl_cv_type_off_t_64=no]) ]) if test $gl_cv_type_off_t_64 = no; then WINDOWS_64_BIT_OFF_T=1 else WINDOWS_64_BIT_OFF_T=0 fi dnl Some mingw versions define, if _FILE_OFFSET_BITS=64, 'struct stat' dnl to 'struct _stat32i64' or 'struct _stat64' (depending on dnl _USE_32BIT_TIME_T), which has a 32-bit st_size member. AC_CACHE_CHECK([for 64-bit st_size], [gl_cv_member_st_size_64], [AC_COMPILE_IFELSE( [AC_LANG_PROGRAM( [[#include struct stat buf; int verify_st_size_size[sizeof (buf.st_size) >= 8 ? 1 : -1]; ]], [[]])], [gl_cv_member_st_size_64=yes], [gl_cv_member_st_size_64=no]) ]) if test $gl_cv_member_st_size_64 = no; then WINDOWS_64_BIT_ST_SIZE=1 else WINDOWS_64_BIT_ST_SIZE=0 fi ;; *) dnl Nothing to do on gnulib's side. dnl A 64-bit off_t is dnl - already the default on Mac OS X, FreeBSD, NetBSD, OpenBSD, IRIX, dnl OSF/1, Cygwin, dnl - enabled by _FILE_OFFSET_BITS=64 (ensured by AC_SYS_LARGEFILE) on dnl glibc, HP-UX, Solaris, dnl - enabled by _LARGE_FILES=1 (ensured by AC_SYS_LARGEFILE) on AIX, dnl - impossible to achieve on Minix 3.1.8. WINDOWS_64_BIT_OFF_T=0 WINDOWS_64_BIT_ST_SIZE=0 ;; esac ]) pspp-1.4.1/gl/m4/zzgnulib.m40000644000175000017500000000151513723215637015156 0ustar00blpblp00000000000000# zzgnulib.m4 serial 1 dnl Copyright (C) 2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl This file must be named something that sorts after all other dnl package- or gnulib-provided .m4 files - at least for those packages dnl that redefine AC_PROG_CC. dnl Redefine AC_PROG_CC so that it ends with invocations of gl_COMPILER_CLANG dnl and gl_COMPILER_PREPARE_CHECK_DECL. m4_define([AC_PROG_CC], m4_defn([AC_PROG_CC])[ gl_COMPILER_CLANG gl_COMPILER_PREPARE_CHECK_DECL ]) # gl_ZZGNULIB # ----------- # Witness macro that this file has been included. Needed to force # Automake to include this file after all other gnulib .m4 files. AC_DEFUN([gl_ZZGNULIB]) pspp-1.4.1/gl/m4/ssize_t.m40000644000175000017500000000146313723215637014774 0ustar00blpblp00000000000000# ssize_t.m4 serial 5 (gettext-0.18.2) dnl Copyright (C) 2001-2003, 2006, 2010-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl From Bruno Haible. dnl Test whether ssize_t is defined. AC_DEFUN([gt_TYPE_SSIZE_T], [ AC_CACHE_CHECK([for ssize_t], [gt_cv_ssize_t], [AC_COMPILE_IFELSE( [AC_LANG_PROGRAM( [[#include ]], [[int x = sizeof (ssize_t *) + sizeof (ssize_t); return !x;]])], [gt_cv_ssize_t=yes], [gt_cv_ssize_t=no])]) if test $gt_cv_ssize_t = no; then AC_DEFINE([ssize_t], [int], [Define as a signed type of the same size as size_t.]) fi ]) pspp-1.4.1/gl/m4/exponentd.m40000644000175000017500000000755213723215637015325 0ustar00blpblp00000000000000# exponentd.m4 serial 3 dnl Copyright (C) 2007-2008, 2010-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_DOUBLE_EXPONENT_LOCATION], [ AC_CACHE_CHECK([where to find the exponent in a 'double'], [gl_cv_cc_double_expbit0], [ AC_RUN_IFELSE( [AC_LANG_SOURCE([[ #include #include #include #include #define NWORDS \ ((sizeof (double) + sizeof (unsigned int) - 1) / sizeof (unsigned int)) typedef union { double value; unsigned int word[NWORDS]; } memory_double; static unsigned int ored_words[NWORDS]; static unsigned int anded_words[NWORDS]; static void add_to_ored_words (double x) { memory_double m; size_t i; /* Clear it first, in case sizeof (double) < sizeof (memory_double). */ memset (&m, 0, sizeof (memory_double)); m.value = x; for (i = 0; i < NWORDS; i++) { ored_words[i] |= m.word[i]; anded_words[i] &= m.word[i]; } } int main () { size_t j; FILE *fp = fopen ("conftest.out", "w"); if (fp == NULL) return 1; for (j = 0; j < NWORDS; j++) anded_words[j] = ~ (unsigned int) 0; add_to_ored_words (0.25); add_to_ored_words (0.5); add_to_ored_words (1.0); add_to_ored_words (2.0); add_to_ored_words (4.0); /* Remove bits that are common (e.g. if representation of the first mantissa bit is explicit). */ for (j = 0; j < NWORDS; j++) ored_words[j] &= ~anded_words[j]; /* Now find the nonzero word. */ for (j = 0; j < NWORDS; j++) if (ored_words[j] != 0) break; if (j < NWORDS) { size_t i; for (i = j + 1; i < NWORDS; i++) if (ored_words[i] != 0) { fprintf (fp, "unknown"); return (fclose (fp) != 0); } for (i = 0; ; i++) if ((ored_words[j] >> i) & 1) { fprintf (fp, "word %d bit %d", (int) j, (int) i); return (fclose (fp) != 0); } } fprintf (fp, "unknown"); return (fclose (fp) != 0); } ]])], [gl_cv_cc_double_expbit0=`cat conftest.out`], [gl_cv_cc_double_expbit0="unknown"], [ dnl On ARM, there are two 'double' floating-point formats, used by dnl different sets of instructions: The older FPA instructions assume dnl that they are stored in big-endian word order, while the words dnl (like integer types) are stored in little-endian byte order. dnl The newer VFP instructions assume little-endian order dnl consistently. AC_EGREP_CPP([mixed_endianness], [ #if defined arm || defined __arm || defined __arm__ mixed_endianness #endif ], [gl_cv_cc_double_expbit0="unknown"], [ pushdef([AC_MSG_CHECKING],[:])dnl pushdef([AC_MSG_RESULT],[:])dnl pushdef([AC_MSG_RESULT_UNQUOTED],[:])dnl AC_C_BIGENDIAN( [gl_cv_cc_double_expbit0="word 0 bit 20"], [gl_cv_cc_double_expbit0="word 1 bit 20"], [gl_cv_cc_double_expbit0="unknown"]) popdef([AC_MSG_RESULT_UNQUOTED])dnl popdef([AC_MSG_RESULT])dnl popdef([AC_MSG_CHECKING])dnl ]) ]) rm -f conftest.out ]) case "$gl_cv_cc_double_expbit0" in word*bit*) word=`echo "$gl_cv_cc_double_expbit0" | sed -e 's/word //' -e 's/ bit.*//'` bit=`echo "$gl_cv_cc_double_expbit0" | sed -e 's/word.*bit //'` AC_DEFINE_UNQUOTED([DBL_EXPBIT0_WORD], [$word], [Define as the word index where to find the exponent of 'double'.]) AC_DEFINE_UNQUOTED([DBL_EXPBIT0_BIT], [$bit], [Define as the bit index in the word where to find bit 0 of the exponent of 'double'.]) ;; esac ]) pspp-1.4.1/gl/m4/fseterr.m40000644000175000017500000000053013723215637014760 0ustar00blpblp00000000000000# fseterr.m4 serial 1 dnl Copyright (C) 2012-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_FUNC_FSETERR], [ AC_CHECK_FUNCS_ONCE([__fseterr]) ]) pspp-1.4.1/gl/m4/wctype_h.m40000644000175000017500000001625113723215637015137 0ustar00blpblp00000000000000# wctype_h.m4 serial 24 dnl A placeholder for ISO C99 , for platforms that lack it. dnl Copyright (C) 2006-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl Written by Paul Eggert. AC_DEFUN([gl_WCTYPE_H], [ AC_REQUIRE([gl_WCTYPE_H_DEFAULTS]) AC_REQUIRE([AC_PROG_CC]) AC_REQUIRE([AC_CANONICAL_HOST]) AC_CHECK_FUNCS_ONCE([iswcntrl]) if test $ac_cv_func_iswcntrl = yes; then HAVE_ISWCNTRL=1 else HAVE_ISWCNTRL=0 fi AC_SUBST([HAVE_ISWCNTRL]) AC_REQUIRE([gt_TYPE_WINT_T]) if test $gt_cv_c_wint_t = yes; then HAVE_WINT_T=1 else HAVE_WINT_T=0 fi AC_SUBST([HAVE_WINT_T]) AC_REQUIRE([gl_TYPE_WINT_T_PREREQ]) gl_CHECK_NEXT_HEADERS([wctype.h]) if test $ac_cv_header_wctype_h = yes; then if test $ac_cv_func_iswcntrl = yes; then dnl Linux libc5 has an iswprint function that returns 0 for all arguments. dnl The other functions are likely broken in the same way. AC_CACHE_CHECK([whether iswcntrl works], [gl_cv_func_iswcntrl_works], [ AC_RUN_IFELSE( [AC_LANG_SOURCE([[ /* Tru64 with Desktop Toolkit C has a bug: must be included before . BSD/OS 4.0.1 has a bug: , and must be included before . */ #include #include #include #include #include int main () { return iswprint ('x') == 0; } ]])], [gl_cv_func_iswcntrl_works=yes], [gl_cv_func_iswcntrl_works=no], [dnl Guess no on Linux libc5, yes otherwise. AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include #if __GNU_LIBRARY__ == 1 Linux libc5 i18n is broken. #endif]], [])], [gl_cv_func_iswcntrl_works="guessing yes"], [gl_cv_func_iswcntrl_works="guessing no"]) ]) ]) fi HAVE_WCTYPE_H=1 else HAVE_WCTYPE_H=0 fi AC_SUBST([HAVE_WCTYPE_H]) if test $GNULIB_OVERRIDES_WINT_T = 1; then REPLACE_ISWCNTRL=1 else case "$gl_cv_func_iswcntrl_works" in *yes) REPLACE_ISWCNTRL=0 ;; *) REPLACE_ISWCNTRL=1 ;; esac fi AC_SUBST([REPLACE_ISWCNTRL]) if test $HAVE_ISWCNTRL = 0 || test $REPLACE_ISWCNTRL = 1; then dnl Redefine all of iswcntrl, ..., iswxdigit in . : fi if test $REPLACE_ISWCNTRL = 1; then REPLACE_TOWLOWER=1 else AC_CHECK_FUNCS([towlower]) if test $ac_cv_func_towlower = yes; then REPLACE_TOWLOWER=0 else AC_CHECK_DECLS([towlower],,, [[/* Tru64 with Desktop Toolkit C has a bug: must be included before . BSD/OS 4.0.1 has a bug: , and must be included before . */ #include #include #include #include #if HAVE_WCTYPE_H # include #endif ]]) if test $ac_cv_have_decl_towlower = yes; then dnl On Minix 3.1.8, the system's declares towlower() and dnl towupper() although it does not have the functions. Avoid a dnl collision with gnulib's replacement. REPLACE_TOWLOWER=1 else REPLACE_TOWLOWER=0 fi fi fi AC_SUBST([REPLACE_TOWLOWER]) if test $HAVE_ISWCNTRL = 0 || test $REPLACE_TOWLOWER = 1; then dnl Redefine towlower, towupper in . : fi dnl We assume that the wctype() and iswctype() functions exist if and only dnl if the type wctype_t is defined in or in if that dnl exists. dnl HP-UX 11.00 declares all these in and lacks . AC_CACHE_CHECK([for wctype_t], [gl_cv_type_wctype_t], [AC_COMPILE_IFELSE( [AC_LANG_PROGRAM( [[/* Tru64 with Desktop Toolkit C has a bug: must be included before . BSD/OS 4.0.1 has a bug: , and must be included before . */ #include #include #include #include #if HAVE_WCTYPE_H # include #endif wctype_t a; ]], [[]])], [gl_cv_type_wctype_t=yes], [gl_cv_type_wctype_t=no]) ]) if test $gl_cv_type_wctype_t = no; then HAVE_WCTYPE_T=0 fi dnl We assume that the wctrans() and towctrans() functions exist if and only dnl if the type wctrans_t is defined in . AC_CACHE_CHECK([for wctrans_t], [gl_cv_type_wctrans_t], [AC_COMPILE_IFELSE( [AC_LANG_PROGRAM( [[/* Tru64 with Desktop Toolkit C has a bug: must be included before . BSD/OS 4.0.1 has a bug: , and must be included before . */ #include #include #include #include #include wctrans_t a; ]], [[]])], [gl_cv_type_wctrans_t=yes], [gl_cv_type_wctrans_t=no]) ]) if test $gl_cv_type_wctrans_t = no; then HAVE_WCTRANS_T=0 fi dnl Check for declarations of anything we want to poison if the dnl corresponding gnulib module is not in use. gl_WARN_ON_USE_PREPARE([[ /* Tru64 with Desktop Toolkit C has a bug: must be included before . BSD/OS 4.0.1 has a bug: , and must be included before . */ #if !(defined __GLIBC__ && !defined __UCLIBC__) # include # include # include # include #endif #include ]], [wctype iswctype wctrans towctrans ]) ]) AC_DEFUN([gl_WCTYPE_MODULE_INDICATOR], [ dnl Use AC_REQUIRE here, so that the default settings are expanded once only. AC_REQUIRE([gl_WCTYPE_H_DEFAULTS]) gl_MODULE_INDICATOR_SET_VARIABLE([$1]) dnl Define it also as a C macro, for the benefit of the unit tests. gl_MODULE_INDICATOR_FOR_TESTS([$1]) ]) AC_DEFUN([gl_WCTYPE_H_DEFAULTS], [ GNULIB_ISWBLANK=0; AC_SUBST([GNULIB_ISWBLANK]) GNULIB_ISWDIGIT=0; AC_SUBST([GNULIB_ISWDIGIT]) GNULIB_ISWXDIGIT=0; AC_SUBST([GNULIB_ISWXDIGIT]) GNULIB_WCTYPE=0; AC_SUBST([GNULIB_WCTYPE]) GNULIB_ISWCTYPE=0; AC_SUBST([GNULIB_ISWCTYPE]) GNULIB_WCTRANS=0; AC_SUBST([GNULIB_WCTRANS]) GNULIB_TOWCTRANS=0; AC_SUBST([GNULIB_TOWCTRANS]) dnl Assume proper GNU behavior unless another module says otherwise. HAVE_ISWBLANK=1; AC_SUBST([HAVE_ISWBLANK]) HAVE_WCTYPE_T=1; AC_SUBST([HAVE_WCTYPE_T]) HAVE_WCTRANS_T=1; AC_SUBST([HAVE_WCTRANS_T]) REPLACE_ISWBLANK=0; AC_SUBST([REPLACE_ISWBLANK]) REPLACE_ISWDIGIT=0; AC_SUBST([REPLACE_ISWDIGIT]) REPLACE_ISWXDIGIT=0; AC_SUBST([REPLACE_ISWXDIGIT]) ]) pspp-1.4.1/gl/m4/getpass.m40000644000175000017500000000620113723215637014755 0ustar00blpblp00000000000000# getpass.m4 serial 16 dnl Copyright (C) 2002-2003, 2005-2006, 2009-2020 Free Software Foundation, dnl Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. # Provide a getpass() function if the system doesn't have it. AC_DEFUN_ONCE([gl_FUNC_GETPASS], [ AC_REQUIRE([gl_UNISTD_H_DEFAULTS]) dnl Persuade Solaris and to declare getpass(). AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS]) AC_CHECK_FUNCS_ONCE([getpass]) if test $ac_cv_func_getpass = no; then HAVE_GETPASS=0 fi ]) # Provide the GNU getpass() implementation. It supports passwords of # arbitrary length (not just 8 bytes as on HP-UX). AC_DEFUN([gl_FUNC_GETPASS_GNU], [ AC_REQUIRE([gl_UNISTD_H_DEFAULTS]) AC_REQUIRE([gl_FUNC_GETPASS]) if test $ac_cv_func_getpass = yes; then AC_CACHE_CHECK([for getpass without length limitations], [gl_cv_func_getpass_good], [AC_EGREP_CPP([Lucky GNU user], [ #include #ifdef __GNU_LIBRARY__ #if (__GLIBC__ >= 2) && !defined __UCLIBC__ Lucky GNU user #endif #endif ], [gl_cv_func_getpass_good=yes], [gl_cv_func_getpass_good=no]) ]) if test $gl_cv_func_getpass_good != yes; then REPLACE_GETPASS=1 fi fi ]) # Prerequisites of lib/getpass.c. AC_DEFUN([gl_PREREQ_GETPASS], [ AC_CHECK_HEADERS_ONCE([stdio_ext.h termios.h]) AC_CHECK_FUNCS_ONCE([__fsetlocking]) AC_CHECK_DECLS([__fsetlocking],,, [[#include #if HAVE_STDIO_EXT_H #include #endif]]) AC_CHECK_DECLS_ONCE([fflush_unlocked]) AC_CHECK_DECLS_ONCE([flockfile]) AC_CHECK_DECLS_ONCE([fputs_unlocked]) AC_CHECK_DECLS_ONCE([funlockfile]) AC_CHECK_DECLS_ONCE([putc_unlocked]) dnl We can't use AC_CHECK_FUNC here, because tcgetattr() is defined as a dnl static inline function when compiling for Android 4.4 or older. AC_CACHE_CHECK([for tcgetattr], [gl_cv_func_tcgetattr], [AC_LINK_IFELSE( [AC_LANG_PROGRAM( [[#include struct termios x; ]], [[return tcgetattr(0,&x);]]) ], [gl_cv_func_tcgetattr=yes], [gl_cv_func_tcgetattr=no]) ]) if test $gl_cv_func_tcgetattr = yes; then HAVE_TCGETATTR=1 else HAVE_TCGETATTR=0 fi AC_DEFINE_UNQUOTED([HAVE_TCGETATTR], [$HAVE_TCGETATTR], [Define to 1 if the system has the 'tcgetattr' function.]) dnl We can't use AC_CHECK_FUNC here, because tcsetattr() is defined as a dnl static inline function when compiling for Android 4.4 or older. AC_CACHE_CHECK([for tcsetattr], [gl_cv_func_tcsetattr], [AC_LINK_IFELSE( [AC_LANG_PROGRAM( [[#include struct termios x; ]], [[return tcsetattr(0,0,&x);]]) ], [gl_cv_func_tcsetattr=yes], [gl_cv_func_tcsetattr=no]) ]) if test $gl_cv_func_tcsetattr = yes; then HAVE_TCSETATTR=1 else HAVE_TCSETATTR=0 fi AC_DEFINE_UNQUOTED([HAVE_TCSETATTR], [$HAVE_TCSETATTR], [Define to 1 if the system has the 'tcsetattr' function.]) ]) pspp-1.4.1/gl/m4/stdalign.m40000644000175000017500000000442713723215637015124 0ustar00blpblp00000000000000# Check for stdalign.h that conforms to C11. dnl Copyright 2011-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. # Prepare for substituting if it is not supported. AC_DEFUN([gl_STDALIGN_H], [ AC_CACHE_CHECK([for working stdalign.h], [gl_cv_header_working_stdalign_h], [AC_COMPILE_IFELSE( [AC_LANG_PROGRAM( [[#include #include /* Test that alignof yields a result consistent with offsetof. This catches GCC bug 52023 . */ #ifdef __cplusplus template struct alignof_helper { char a; t b; }; # define ao(type) offsetof (alignof_helper, b) #else # define ao(type) offsetof (struct { char a; type b; }, b) #endif char test_double[ao (double) % _Alignof (double) == 0 ? 1 : -1]; char test_long[ao (long int) % _Alignof (long int) == 0 ? 1 : -1]; char test_alignof[alignof (double) == _Alignof (double) ? 1 : -1]; /* Test _Alignas only on platforms where gnulib can help. */ #if \ ((defined __cplusplus && 201103 <= __cplusplus) \ || (defined __APPLE__ && defined __MACH__ \ ? 4 < __GNUC__ + (1 <= __GNUC_MINOR__) \ : __GNUC__) \ || (__ia64 && (61200 <= __HP_cc || 61200 <= __HP_aCC)) \ || __ICC || 0x590 <= __SUNPRO_C || 0x0600 <= __xlC__ \ || 1300 <= _MSC_VER) struct alignas_test { char c; char alignas (8) alignas_8; }; char test_alignas[offsetof (struct alignas_test, alignas_8) == 8 ? 1 : -1]; #endif ]])], [gl_cv_header_working_stdalign_h=yes], [gl_cv_header_working_stdalign_h=no])]) if test $gl_cv_header_working_stdalign_h = yes; then STDALIGN_H='' else STDALIGN_H='stdalign.h' fi AC_SUBST([STDALIGN_H]) AM_CONDITIONAL([GL_GENERATE_STDALIGN_H], [test -n "$STDALIGN_H"]) ]) pspp-1.4.1/gl/m4/errno_h.m40000644000175000017500000000573613723215637014757 0ustar00blpblp00000000000000# errno_h.m4 serial 13 dnl Copyright (C) 2004, 2006, 2008-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_PREREQ([2.61]) AC_DEFUN_ONCE([gl_HEADER_ERRNO_H], [ AC_REQUIRE([AC_PROG_CC]) AC_CACHE_CHECK([for complete errno.h], [gl_cv_header_errno_h_complete], [ AC_EGREP_CPP([booboo],[ #include #if !defined ETXTBSY booboo #endif #if !defined ENOMSG booboo #endif #if !defined EIDRM booboo #endif #if !defined ENOLINK booboo #endif #if !defined EPROTO booboo #endif #if !defined EMULTIHOP booboo #endif #if !defined EBADMSG booboo #endif #if !defined EOVERFLOW booboo #endif #if !defined ENOTSUP booboo #endif #if !defined ENETRESET booboo #endif #if !defined ECONNABORTED booboo #endif #if !defined ESTALE booboo #endif #if !defined EDQUOT booboo #endif #if !defined ECANCELED booboo #endif #if !defined EOWNERDEAD booboo #endif #if !defined ENOTRECOVERABLE booboo #endif #if !defined EILSEQ booboo #endif ], [gl_cv_header_errno_h_complete=no], [gl_cv_header_errno_h_complete=yes]) ]) if test $gl_cv_header_errno_h_complete = yes; then ERRNO_H='' else gl_NEXT_HEADERS([errno.h]) ERRNO_H='errno.h' fi AC_SUBST([ERRNO_H]) AM_CONDITIONAL([GL_GENERATE_ERRNO_H], [test -n "$ERRNO_H"]) gl_REPLACE_ERRNO_VALUE([EMULTIHOP]) gl_REPLACE_ERRNO_VALUE([ENOLINK]) gl_REPLACE_ERRNO_VALUE([EOVERFLOW]) ]) # Assuming $1 = EOVERFLOW. # The EOVERFLOW errno value ought to be defined in , according to # POSIX. But some systems (like OpenBSD 4.0 or AIX 3) don't define it, and # some systems (like OSF/1) define it when _XOPEN_SOURCE_EXTENDED is defined. # Check for the value of EOVERFLOW. # Set the variables EOVERFLOW_HIDDEN and EOVERFLOW_VALUE. AC_DEFUN([gl_REPLACE_ERRNO_VALUE], [ if test -n "$ERRNO_H"; then AC_CACHE_CHECK([for ]$1[ value], [gl_cv_header_errno_h_]$1, [ AC_EGREP_CPP([yes],[ #include #ifdef ]$1[ yes #endif ], [gl_cv_header_errno_h_]$1[=yes], [gl_cv_header_errno_h_]$1[=no]) if test $gl_cv_header_errno_h_]$1[ = no; then AC_EGREP_CPP([yes],[ #define _XOPEN_SOURCE_EXTENDED 1 #include #ifdef ]$1[ yes #endif ], [gl_cv_header_errno_h_]$1[=hidden]) if test $gl_cv_header_errno_h_]$1[ = hidden; then dnl The macro exists but is hidden. dnl Define it to the same value. AC_COMPUTE_INT([gl_cv_header_errno_h_]$1, $1, [ #define _XOPEN_SOURCE_EXTENDED 1 #include /* The following two lines are a workaround against an autoconf-2.52 bug. */ #include #include ]) fi fi ]) case $gl_cv_header_errno_h_]$1[ in yes | no) ]$1[_HIDDEN=0; ]$1[_VALUE= ;; *) ]$1[_HIDDEN=1; ]$1[_VALUE="$gl_cv_header_errno_h_]$1[" ;; esac AC_SUBST($1[_HIDDEN]) AC_SUBST($1[_VALUE]) fi ]) pspp-1.4.1/gl/m4/memchr.m40000644000175000017500000000626213723215637014571 0ustar00blpblp00000000000000# memchr.m4 serial 16 dnl Copyright (C) 2002-2004, 2009-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN_ONCE([gl_FUNC_MEMCHR], [ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles dnl Check for prerequisites for memory fence checks. gl_FUNC_MMAP_ANON AC_CHECK_HEADERS_ONCE([sys/mman.h]) AC_CHECK_FUNCS_ONCE([mprotect]) AC_REQUIRE([gl_HEADER_STRING_H_DEFAULTS]) # Detect platform-specific bugs in some versions of glibc: # memchr should not dereference anything with length 0 # https://bugzilla.redhat.com/show_bug.cgi?id=499689 # memchr should not dereference overestimated length after a match # https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=521737 # https://sourceware.org/bugzilla/show_bug.cgi?id=10162 # memchr should cast the second argument to 'unsigned char'. # This bug exists in Android 4.3. # Assume that memchr works on platforms that lack mprotect. AC_CACHE_CHECK([whether memchr works], [gl_cv_func_memchr_works], [AC_RUN_IFELSE([AC_LANG_PROGRAM([[ #include #if HAVE_SYS_MMAN_H # include # include # include # include # ifndef MAP_FILE # define MAP_FILE 0 # endif #endif ]], [[ int result = 0; char *fence = NULL; #if HAVE_SYS_MMAN_H && HAVE_MPROTECT # if HAVE_MAP_ANONYMOUS const int flags = MAP_ANONYMOUS | MAP_PRIVATE; const int fd = -1; # else /* !HAVE_MAP_ANONYMOUS */ const int flags = MAP_FILE | MAP_PRIVATE; int fd = open ("/dev/zero", O_RDONLY, 0666); if (fd >= 0) # endif { int pagesize = getpagesize (); char *two_pages = (char *) mmap (NULL, 2 * pagesize, PROT_READ | PROT_WRITE, flags, fd, 0); if (two_pages != (char *)(-1) && mprotect (two_pages + pagesize, pagesize, PROT_NONE) == 0) fence = two_pages + pagesize; } #endif if (fence) { if (memchr (fence, 0, 0)) result |= 1; strcpy (fence - 9, "12345678"); if (memchr (fence - 9, 0, 79) != fence - 1) result |= 2; if (memchr (fence - 1, 0, 3) != fence - 1) result |= 4; } /* Test against bug on Android 4.3. */ { char input[3]; input[0] = 'a'; input[1] = 'b'; input[2] = 'c'; if (memchr (input, 0x789abc00 | 'b', 3) != input + 1) result |= 8; } return result; ]])], [gl_cv_func_memchr_works=yes], [gl_cv_func_memchr_works=no], [case "$host_os" in # Guess no on Android. linux*-android*) gl_cv_func_memchr_works="guessing no" ;; # Guess yes on native Windows. mingw*) gl_cv_func_memchr_works="guessing yes" ;; # If we don't know, obey --enable-cross-guesses. *) gl_cv_func_memchr_works="$gl_cross_guess_normal" ;; esac ]) ]) case "$gl_cv_func_memchr_works" in *yes) ;; *) REPLACE_MEMCHR=1 ;; esac ]) # Prerequisites of lib/memchr.c. AC_DEFUN([gl_PREREQ_MEMCHR], [ AC_CHECK_HEADERS([bp-sym.h]) ]) pspp-1.4.1/gl/m4/math_h.m40000644000175000017500000004550713723215637014563 0ustar00blpblp00000000000000# math_h.m4 serial 120 dnl Copyright (C) 2007-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_MATH_H], [ AC_REQUIRE([gl_MATH_H_DEFAULTS]) gl_CHECK_NEXT_HEADERS([math.h]) AC_CACHE_CHECK([whether NAN macro works], [gl_cv_header_math_nan_works], [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[@%:@include ]], [[/* Solaris 10 has a broken definition of NAN. Other platforms fail to provide NAN, or provide it only in C99 mode; this test only needs to fail when NAN is provided but wrong. */ float f = 1.0f; #ifdef NAN f = NAN; #endif return f == 0;]])], [gl_cv_header_math_nan_works=yes], [gl_cv_header_math_nan_works=no])]) if test $gl_cv_header_math_nan_works = no; then REPLACE_NAN=1 fi AC_CACHE_CHECK([whether HUGE_VAL works], [gl_cv_header_math_huge_val_works], [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[@%:@include ]], [[/* Solaris 10 has a broken definition of HUGE_VAL. */ double d = HUGE_VAL; return d == 0;]])], [gl_cv_header_math_huge_val_works=yes], [gl_cv_header_math_huge_val_works=no])]) if test $gl_cv_header_math_huge_val_works = no; then REPLACE_HUGE_VAL=1 fi dnl Check for declarations of anything we want to poison if the dnl corresponding gnulib module is not in use. gl_WARN_ON_USE_PREPARE([[#include ]], [acosf acosl asinf asinl atanf atanl cbrt cbrtf cbrtl ceilf ceill copysign copysignf copysignl cosf cosl coshf expf expl exp2 exp2f exp2l expm1 expm1f expm1l fabsf fabsl floorf floorl fma fmaf fmal fmod fmodf fmodl frexpf frexpl hypotf hypotl ilogb ilogbf ilogbl ldexpf ldexpl log logf logl log10 log10f log10l log1p log1pf log1pl log2 log2f log2l logb logbf logbl modf modff modfl powf remainder remainderf remainderl rint rintf rintl round roundf roundl sinf sinl sinhf sqrtf sqrtl tanf tanl tanhf trunc truncf truncl]) ]) AC_DEFUN([gl_MATH_MODULE_INDICATOR], [ dnl Use AC_REQUIRE here, so that the default settings are expanded once only. AC_REQUIRE([gl_MATH_H_DEFAULTS]) gl_MODULE_INDICATOR_SET_VARIABLE([$1]) dnl Define it also as a C macro, for the benefit of the unit tests. gl_MODULE_INDICATOR_FOR_TESTS([$1]) ]) AC_DEFUN([gl_MATH_H_DEFAULTS], [ GNULIB_ACOSF=0; AC_SUBST([GNULIB_ACOSF]) GNULIB_ACOSL=0; AC_SUBST([GNULIB_ACOSL]) GNULIB_ASINF=0; AC_SUBST([GNULIB_ASINF]) GNULIB_ASINL=0; AC_SUBST([GNULIB_ASINL]) GNULIB_ATANF=0; AC_SUBST([GNULIB_ATANF]) GNULIB_ATANL=0; AC_SUBST([GNULIB_ATANL]) GNULIB_ATAN2F=0; AC_SUBST([GNULIB_ATAN2F]) GNULIB_CBRT=0; AC_SUBST([GNULIB_CBRT]) GNULIB_CBRTF=0; AC_SUBST([GNULIB_CBRTF]) GNULIB_CBRTL=0; AC_SUBST([GNULIB_CBRTL]) GNULIB_CEIL=0; AC_SUBST([GNULIB_CEIL]) GNULIB_CEILF=0; AC_SUBST([GNULIB_CEILF]) GNULIB_CEILL=0; AC_SUBST([GNULIB_CEILL]) GNULIB_COPYSIGN=0; AC_SUBST([GNULIB_COPYSIGN]) GNULIB_COPYSIGNF=0; AC_SUBST([GNULIB_COPYSIGNF]) GNULIB_COPYSIGNL=0; AC_SUBST([GNULIB_COPYSIGNL]) GNULIB_COSF=0; AC_SUBST([GNULIB_COSF]) GNULIB_COSL=0; AC_SUBST([GNULIB_COSL]) GNULIB_COSHF=0; AC_SUBST([GNULIB_COSHF]) GNULIB_EXPF=0; AC_SUBST([GNULIB_EXPF]) GNULIB_EXPL=0; AC_SUBST([GNULIB_EXPL]) GNULIB_EXP2=0; AC_SUBST([GNULIB_EXP2]) GNULIB_EXP2F=0; AC_SUBST([GNULIB_EXP2F]) GNULIB_EXP2L=0; AC_SUBST([GNULIB_EXP2L]) GNULIB_EXPM1=0; AC_SUBST([GNULIB_EXPM1]) GNULIB_EXPM1F=0; AC_SUBST([GNULIB_EXPM1F]) GNULIB_EXPM1L=0; AC_SUBST([GNULIB_EXPM1L]) GNULIB_FABSF=0; AC_SUBST([GNULIB_FABSF]) GNULIB_FABSL=0; AC_SUBST([GNULIB_FABSL]) GNULIB_FLOOR=0; AC_SUBST([GNULIB_FLOOR]) GNULIB_FLOORF=0; AC_SUBST([GNULIB_FLOORF]) GNULIB_FLOORL=0; AC_SUBST([GNULIB_FLOORL]) GNULIB_FMA=0; AC_SUBST([GNULIB_FMA]) GNULIB_FMAF=0; AC_SUBST([GNULIB_FMAF]) GNULIB_FMAL=0; AC_SUBST([GNULIB_FMAL]) GNULIB_FMOD=0; AC_SUBST([GNULIB_FMOD]) GNULIB_FMODF=0; AC_SUBST([GNULIB_FMODF]) GNULIB_FMODL=0; AC_SUBST([GNULIB_FMODL]) GNULIB_FREXPF=0; AC_SUBST([GNULIB_FREXPF]) GNULIB_FREXP=0; AC_SUBST([GNULIB_FREXP]) GNULIB_FREXPL=0; AC_SUBST([GNULIB_FREXPL]) GNULIB_HYPOT=0; AC_SUBST([GNULIB_HYPOT]) GNULIB_HYPOTF=0; AC_SUBST([GNULIB_HYPOTF]) GNULIB_HYPOTL=0; AC_SUBST([GNULIB_HYPOTL]) GNULIB_ILOGB=0; AC_SUBST([GNULIB_ILOGB]) GNULIB_ILOGBF=0; AC_SUBST([GNULIB_ILOGBF]) GNULIB_ILOGBL=0; AC_SUBST([GNULIB_ILOGBL]) GNULIB_ISFINITE=0; AC_SUBST([GNULIB_ISFINITE]) GNULIB_ISINF=0; AC_SUBST([GNULIB_ISINF]) GNULIB_ISNAN=0; AC_SUBST([GNULIB_ISNAN]) GNULIB_ISNANF=0; AC_SUBST([GNULIB_ISNANF]) GNULIB_ISNAND=0; AC_SUBST([GNULIB_ISNAND]) GNULIB_ISNANL=0; AC_SUBST([GNULIB_ISNANL]) GNULIB_LDEXPF=0; AC_SUBST([GNULIB_LDEXPF]) GNULIB_LDEXPL=0; AC_SUBST([GNULIB_LDEXPL]) GNULIB_LOG=0; AC_SUBST([GNULIB_LOG]) GNULIB_LOGF=0; AC_SUBST([GNULIB_LOGF]) GNULIB_LOGL=0; AC_SUBST([GNULIB_LOGL]) GNULIB_LOG10=0; AC_SUBST([GNULIB_LOG10]) GNULIB_LOG10F=0; AC_SUBST([GNULIB_LOG10F]) GNULIB_LOG10L=0; AC_SUBST([GNULIB_LOG10L]) GNULIB_LOG1P=0; AC_SUBST([GNULIB_LOG1P]) GNULIB_LOG1PF=0; AC_SUBST([GNULIB_LOG1PF]) GNULIB_LOG1PL=0; AC_SUBST([GNULIB_LOG1PL]) GNULIB_LOG2=0; AC_SUBST([GNULIB_LOG2]) GNULIB_LOG2F=0; AC_SUBST([GNULIB_LOG2F]) GNULIB_LOG2L=0; AC_SUBST([GNULIB_LOG2L]) GNULIB_LOGB=0; AC_SUBST([GNULIB_LOGB]) GNULIB_LOGBF=0; AC_SUBST([GNULIB_LOGBF]) GNULIB_LOGBL=0; AC_SUBST([GNULIB_LOGBL]) GNULIB_MODF=0; AC_SUBST([GNULIB_MODF]) GNULIB_MODFF=0; AC_SUBST([GNULIB_MODFF]) GNULIB_MODFL=0; AC_SUBST([GNULIB_MODFL]) GNULIB_POWF=0; AC_SUBST([GNULIB_POWF]) GNULIB_REMAINDER=0; AC_SUBST([GNULIB_REMAINDER]) GNULIB_REMAINDERF=0; AC_SUBST([GNULIB_REMAINDERF]) GNULIB_REMAINDERL=0; AC_SUBST([GNULIB_REMAINDERL]) GNULIB_RINT=0; AC_SUBST([GNULIB_RINT]) GNULIB_RINTF=0; AC_SUBST([GNULIB_RINTF]) GNULIB_RINTL=0; AC_SUBST([GNULIB_RINTL]) GNULIB_ROUND=0; AC_SUBST([GNULIB_ROUND]) GNULIB_ROUNDF=0; AC_SUBST([GNULIB_ROUNDF]) GNULIB_ROUNDL=0; AC_SUBST([GNULIB_ROUNDL]) GNULIB_SIGNBIT=0; AC_SUBST([GNULIB_SIGNBIT]) GNULIB_SINF=0; AC_SUBST([GNULIB_SINF]) GNULIB_SINL=0; AC_SUBST([GNULIB_SINL]) GNULIB_SINHF=0; AC_SUBST([GNULIB_SINHF]) GNULIB_SQRTF=0; AC_SUBST([GNULIB_SQRTF]) GNULIB_SQRTL=0; AC_SUBST([GNULIB_SQRTL]) GNULIB_TANF=0; AC_SUBST([GNULIB_TANF]) GNULIB_TANL=0; AC_SUBST([GNULIB_TANL]) GNULIB_TANHF=0; AC_SUBST([GNULIB_TANHF]) GNULIB_TRUNC=0; AC_SUBST([GNULIB_TRUNC]) GNULIB_TRUNCF=0; AC_SUBST([GNULIB_TRUNCF]) GNULIB_TRUNCL=0; AC_SUBST([GNULIB_TRUNCL]) dnl Assume proper GNU behavior unless another module says otherwise. HAVE_ACOSF=1; AC_SUBST([HAVE_ACOSF]) HAVE_ACOSL=1; AC_SUBST([HAVE_ACOSL]) HAVE_ASINF=1; AC_SUBST([HAVE_ASINF]) HAVE_ASINL=1; AC_SUBST([HAVE_ASINL]) HAVE_ATANF=1; AC_SUBST([HAVE_ATANF]) HAVE_ATANL=1; AC_SUBST([HAVE_ATANL]) HAVE_ATAN2F=1; AC_SUBST([HAVE_ATAN2F]) HAVE_CBRT=1; AC_SUBST([HAVE_CBRT]) HAVE_CBRTF=1; AC_SUBST([HAVE_CBRTF]) HAVE_CBRTL=1; AC_SUBST([HAVE_CBRTL]) HAVE_COPYSIGN=1; AC_SUBST([HAVE_COPYSIGN]) HAVE_COPYSIGNL=1; AC_SUBST([HAVE_COPYSIGNL]) HAVE_COSF=1; AC_SUBST([HAVE_COSF]) HAVE_COSL=1; AC_SUBST([HAVE_COSL]) HAVE_COSHF=1; AC_SUBST([HAVE_COSHF]) HAVE_EXPF=1; AC_SUBST([HAVE_EXPF]) HAVE_EXPL=1; AC_SUBST([HAVE_EXPL]) HAVE_EXPM1=1; AC_SUBST([HAVE_EXPM1]) HAVE_EXPM1F=1; AC_SUBST([HAVE_EXPM1F]) HAVE_FABSF=1; AC_SUBST([HAVE_FABSF]) HAVE_FABSL=1; AC_SUBST([HAVE_FABSL]) HAVE_FMA=1; AC_SUBST([HAVE_FMA]) HAVE_FMAF=1; AC_SUBST([HAVE_FMAF]) HAVE_FMAL=1; AC_SUBST([HAVE_FMAL]) HAVE_FMODF=1; AC_SUBST([HAVE_FMODF]) HAVE_FMODL=1; AC_SUBST([HAVE_FMODL]) HAVE_FREXPF=1; AC_SUBST([HAVE_FREXPF]) HAVE_HYPOTF=1; AC_SUBST([HAVE_HYPOTF]) HAVE_HYPOTL=1; AC_SUBST([HAVE_HYPOTL]) HAVE_ILOGB=1; AC_SUBST([HAVE_ILOGB]) HAVE_ILOGBF=1; AC_SUBST([HAVE_ILOGBF]) HAVE_ILOGBL=1; AC_SUBST([HAVE_ILOGBL]) HAVE_ISNANF=1; AC_SUBST([HAVE_ISNANF]) HAVE_ISNAND=1; AC_SUBST([HAVE_ISNAND]) HAVE_ISNANL=1; AC_SUBST([HAVE_ISNANL]) HAVE_LDEXPF=1; AC_SUBST([HAVE_LDEXPF]) HAVE_LOGF=1; AC_SUBST([HAVE_LOGF]) HAVE_LOGL=1; AC_SUBST([HAVE_LOGL]) HAVE_LOG10F=1; AC_SUBST([HAVE_LOG10F]) HAVE_LOG10L=1; AC_SUBST([HAVE_LOG10L]) HAVE_LOG1P=1; AC_SUBST([HAVE_LOG1P]) HAVE_LOG1PF=1; AC_SUBST([HAVE_LOG1PF]) HAVE_LOG1PL=1; AC_SUBST([HAVE_LOG1PL]) HAVE_LOGBF=1; AC_SUBST([HAVE_LOGBF]) HAVE_LOGBL=1; AC_SUBST([HAVE_LOGBL]) HAVE_MODFF=1; AC_SUBST([HAVE_MODFF]) HAVE_MODFL=1; AC_SUBST([HAVE_MODFL]) HAVE_POWF=1; AC_SUBST([HAVE_POWF]) HAVE_REMAINDER=1; AC_SUBST([HAVE_REMAINDER]) HAVE_REMAINDERF=1; AC_SUBST([HAVE_REMAINDERF]) HAVE_RINT=1; AC_SUBST([HAVE_RINT]) HAVE_RINTL=1; AC_SUBST([HAVE_RINTL]) HAVE_SINF=1; AC_SUBST([HAVE_SINF]) HAVE_SINL=1; AC_SUBST([HAVE_SINL]) HAVE_SINHF=1; AC_SUBST([HAVE_SINHF]) HAVE_SQRTF=1; AC_SUBST([HAVE_SQRTF]) HAVE_SQRTL=1; AC_SUBST([HAVE_SQRTL]) HAVE_TANF=1; AC_SUBST([HAVE_TANF]) HAVE_TANL=1; AC_SUBST([HAVE_TANL]) HAVE_TANHF=1; AC_SUBST([HAVE_TANHF]) HAVE_DECL_ACOSL=1; AC_SUBST([HAVE_DECL_ACOSL]) HAVE_DECL_ASINL=1; AC_SUBST([HAVE_DECL_ASINL]) HAVE_DECL_ATANL=1; AC_SUBST([HAVE_DECL_ATANL]) HAVE_DECL_CBRTF=1; AC_SUBST([HAVE_DECL_CBRTF]) HAVE_DECL_CBRTL=1; AC_SUBST([HAVE_DECL_CBRTL]) HAVE_DECL_CEILF=1; AC_SUBST([HAVE_DECL_CEILF]) HAVE_DECL_CEILL=1; AC_SUBST([HAVE_DECL_CEILL]) HAVE_DECL_COPYSIGNF=1; AC_SUBST([HAVE_DECL_COPYSIGNF]) HAVE_DECL_COSL=1; AC_SUBST([HAVE_DECL_COSL]) HAVE_DECL_EXPL=1; AC_SUBST([HAVE_DECL_EXPL]) HAVE_DECL_EXP2=1; AC_SUBST([HAVE_DECL_EXP2]) HAVE_DECL_EXP2F=1; AC_SUBST([HAVE_DECL_EXP2F]) HAVE_DECL_EXP2L=1; AC_SUBST([HAVE_DECL_EXP2L]) HAVE_DECL_EXPM1L=1; AC_SUBST([HAVE_DECL_EXPM1L]) HAVE_DECL_FLOORF=1; AC_SUBST([HAVE_DECL_FLOORF]) HAVE_DECL_FLOORL=1; AC_SUBST([HAVE_DECL_FLOORL]) HAVE_DECL_FREXPL=1; AC_SUBST([HAVE_DECL_FREXPL]) HAVE_DECL_LDEXPL=1; AC_SUBST([HAVE_DECL_LDEXPL]) HAVE_DECL_LOGL=1; AC_SUBST([HAVE_DECL_LOGL]) HAVE_DECL_LOG10L=1; AC_SUBST([HAVE_DECL_LOG10L]) HAVE_DECL_LOG2=1; AC_SUBST([HAVE_DECL_LOG2]) HAVE_DECL_LOG2F=1; AC_SUBST([HAVE_DECL_LOG2F]) HAVE_DECL_LOG2L=1; AC_SUBST([HAVE_DECL_LOG2L]) HAVE_DECL_LOGB=1; AC_SUBST([HAVE_DECL_LOGB]) HAVE_DECL_REMAINDER=1; AC_SUBST([HAVE_DECL_REMAINDER]) HAVE_DECL_REMAINDERL=1; AC_SUBST([HAVE_DECL_REMAINDERL]) HAVE_DECL_RINTF=1; AC_SUBST([HAVE_DECL_RINTF]) HAVE_DECL_ROUND=1; AC_SUBST([HAVE_DECL_ROUND]) HAVE_DECL_ROUNDF=1; AC_SUBST([HAVE_DECL_ROUNDF]) HAVE_DECL_ROUNDL=1; AC_SUBST([HAVE_DECL_ROUNDL]) HAVE_DECL_SINL=1; AC_SUBST([HAVE_DECL_SINL]) HAVE_DECL_SQRTL=1; AC_SUBST([HAVE_DECL_SQRTL]) HAVE_DECL_TANL=1; AC_SUBST([HAVE_DECL_TANL]) HAVE_DECL_TRUNC=1; AC_SUBST([HAVE_DECL_TRUNC]) HAVE_DECL_TRUNCF=1; AC_SUBST([HAVE_DECL_TRUNCF]) HAVE_DECL_TRUNCL=1; AC_SUBST([HAVE_DECL_TRUNCL]) REPLACE_ACOSF=0; AC_SUBST([REPLACE_ACOSF]) REPLACE_ASINF=0; AC_SUBST([REPLACE_ASINF]) REPLACE_ATANF=0; AC_SUBST([REPLACE_ATANF]) REPLACE_ATAN2F=0; AC_SUBST([REPLACE_ATAN2F]) REPLACE_CBRTF=0; AC_SUBST([REPLACE_CBRTF]) REPLACE_CBRTL=0; AC_SUBST([REPLACE_CBRTL]) REPLACE_CEIL=0; AC_SUBST([REPLACE_CEIL]) REPLACE_CEILF=0; AC_SUBST([REPLACE_CEILF]) REPLACE_CEILL=0; AC_SUBST([REPLACE_CEILL]) REPLACE_COSF=0; AC_SUBST([REPLACE_COSF]) REPLACE_COSHF=0; AC_SUBST([REPLACE_COSHF]) REPLACE_EXPF=0; AC_SUBST([REPLACE_EXPF]) REPLACE_EXPL=0; AC_SUBST([REPLACE_EXPL]) REPLACE_EXPM1=0; AC_SUBST([REPLACE_EXPM1]) REPLACE_EXPM1F=0; AC_SUBST([REPLACE_EXPM1F]) REPLACE_EXPM1L=0; AC_SUBST([REPLACE_EXPM1L]) REPLACE_EXP2=0; AC_SUBST([REPLACE_EXP2]) REPLACE_EXP2L=0; AC_SUBST([REPLACE_EXP2L]) REPLACE_FABSL=0; AC_SUBST([REPLACE_FABSL]) REPLACE_FLOOR=0; AC_SUBST([REPLACE_FLOOR]) REPLACE_FLOORF=0; AC_SUBST([REPLACE_FLOORF]) REPLACE_FLOORL=0; AC_SUBST([REPLACE_FLOORL]) REPLACE_FMA=0; AC_SUBST([REPLACE_FMA]) REPLACE_FMAF=0; AC_SUBST([REPLACE_FMAF]) REPLACE_FMAL=0; AC_SUBST([REPLACE_FMAL]) REPLACE_FMOD=0; AC_SUBST([REPLACE_FMOD]) REPLACE_FMODF=0; AC_SUBST([REPLACE_FMODF]) REPLACE_FMODL=0; AC_SUBST([REPLACE_FMODL]) REPLACE_FREXPF=0; AC_SUBST([REPLACE_FREXPF]) REPLACE_FREXP=0; AC_SUBST([REPLACE_FREXP]) REPLACE_FREXPL=0; AC_SUBST([REPLACE_FREXPL]) REPLACE_HUGE_VAL=0; AC_SUBST([REPLACE_HUGE_VAL]) REPLACE_HYPOT=0; AC_SUBST([REPLACE_HYPOT]) REPLACE_HYPOTF=0; AC_SUBST([REPLACE_HYPOTF]) REPLACE_HYPOTL=0; AC_SUBST([REPLACE_HYPOTL]) REPLACE_ILOGB=0; AC_SUBST([REPLACE_ILOGB]) REPLACE_ILOGBF=0; AC_SUBST([REPLACE_ILOGBF]) REPLACE_ILOGBL=0; AC_SUBST([REPLACE_ILOGBL]) REPLACE_ISFINITE=0; AC_SUBST([REPLACE_ISFINITE]) REPLACE_ISINF=0; AC_SUBST([REPLACE_ISINF]) REPLACE_ISNAN=0; AC_SUBST([REPLACE_ISNAN]) REPLACE_LDEXPL=0; AC_SUBST([REPLACE_LDEXPL]) REPLACE_LOG=0; AC_SUBST([REPLACE_LOG]) REPLACE_LOGF=0; AC_SUBST([REPLACE_LOGF]) REPLACE_LOGL=0; AC_SUBST([REPLACE_LOGL]) REPLACE_LOG10=0; AC_SUBST([REPLACE_LOG10]) REPLACE_LOG10F=0; AC_SUBST([REPLACE_LOG10F]) REPLACE_LOG10L=0; AC_SUBST([REPLACE_LOG10L]) REPLACE_LOG1P=0; AC_SUBST([REPLACE_LOG1P]) REPLACE_LOG1PF=0; AC_SUBST([REPLACE_LOG1PF]) REPLACE_LOG1PL=0; AC_SUBST([REPLACE_LOG1PL]) REPLACE_LOG2=0; AC_SUBST([REPLACE_LOG2]) REPLACE_LOG2F=0; AC_SUBST([REPLACE_LOG2F]) REPLACE_LOG2L=0; AC_SUBST([REPLACE_LOG2L]) REPLACE_LOGB=0; AC_SUBST([REPLACE_LOGB]) REPLACE_LOGBF=0; AC_SUBST([REPLACE_LOGBF]) REPLACE_LOGBL=0; AC_SUBST([REPLACE_LOGBL]) REPLACE_MODF=0; AC_SUBST([REPLACE_MODF]) REPLACE_MODFF=0; AC_SUBST([REPLACE_MODFF]) REPLACE_MODFL=0; AC_SUBST([REPLACE_MODFL]) REPLACE_NAN=0; AC_SUBST([REPLACE_NAN]) REPLACE_REMAINDER=0; AC_SUBST([REPLACE_REMAINDER]) REPLACE_REMAINDERF=0; AC_SUBST([REPLACE_REMAINDERF]) REPLACE_REMAINDERL=0; AC_SUBST([REPLACE_REMAINDERL]) REPLACE_RINTL=0; AC_SUBST([REPLACE_RINTL]) REPLACE_ROUND=0; AC_SUBST([REPLACE_ROUND]) REPLACE_ROUNDF=0; AC_SUBST([REPLACE_ROUNDF]) REPLACE_ROUNDL=0; AC_SUBST([REPLACE_ROUNDL]) REPLACE_SIGNBIT=0; AC_SUBST([REPLACE_SIGNBIT]) REPLACE_SIGNBIT_USING_BUILTINS=0; AC_SUBST([REPLACE_SIGNBIT_USING_BUILTINS]) REPLACE_SINF=0; AC_SUBST([REPLACE_SINF]) REPLACE_SINHF=0; AC_SUBST([REPLACE_SINHF]) REPLACE_SQRTF=0; AC_SUBST([REPLACE_SQRTF]) REPLACE_SQRTL=0; AC_SUBST([REPLACE_SQRTL]) REPLACE_TANF=0; AC_SUBST([REPLACE_TANF]) REPLACE_TANHF=0; AC_SUBST([REPLACE_TANHF]) REPLACE_TRUNC=0; AC_SUBST([REPLACE_TRUNC]) REPLACE_TRUNCF=0; AC_SUBST([REPLACE_TRUNCF]) REPLACE_TRUNCL=0; AC_SUBST([REPLACE_TRUNCL]) ]) # gl_LONG_DOUBLE_VS_DOUBLE # determines whether 'long double' and 'double' have the same representation. # Sets variable HAVE_SAME_LONG_DOUBLE_AS_DOUBLE to 0 or 1, and defines # HAVE_SAME_LONG_DOUBLE_AS_DOUBLE accordingly. # The currently known platforms where this is the case are: # Linux/HPPA, Minix 3.1.8, AIX 5, AIX 6 and 7 with xlc, MSVC 9. AC_DEFUN([gl_LONG_DOUBLE_VS_DOUBLE], [ AC_CACHE_CHECK([whether long double and double are the same], [gl_cv_long_double_equals_double], [AC_COMPILE_IFELSE( [AC_LANG_PROGRAM([[#include ]], [[typedef int check[sizeof (long double) == sizeof (double) && LDBL_MANT_DIG == DBL_MANT_DIG && LDBL_MAX_EXP == DBL_MAX_EXP && LDBL_MIN_EXP == DBL_MIN_EXP ? 1 : -1]; ]])], [gl_cv_long_double_equals_double=yes], [gl_cv_long_double_equals_double=no]) ]) if test $gl_cv_long_double_equals_double = yes; then AC_DEFINE([HAVE_SAME_LONG_DOUBLE_AS_DOUBLE], [1], [Define to 1 if 'long double' and 'double' have the same representation.]) HAVE_SAME_LONG_DOUBLE_AS_DOUBLE=1 else HAVE_SAME_LONG_DOUBLE_AS_DOUBLE=0 fi AC_SUBST([HAVE_SAME_LONG_DOUBLE_AS_DOUBLE]) ]) pspp-1.4.1/gl/m4/locale-zh.m40000644000175000017500000001265613723215637015200 0ustar00blpblp00000000000000# locale-zh.m4 serial 14 dnl Copyright (C) 2003, 2005-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl From Bruno Haible. dnl Determine the name of a chinese locale with GB18030 encoding. AC_DEFUN([gt_LOCALE_ZH_CN], [ AC_REQUIRE([AC_CANONICAL_HOST]) AC_REQUIRE([AM_LANGINFO_CODESET]) AC_CACHE_CHECK([for a transitional chinese locale], [gt_cv_locale_zh_CN], [ AC_LANG_CONFTEST([AC_LANG_SOURCE([ changequote(,)dnl #include #include #include #if HAVE_LANGINFO_CODESET # include #endif #include #include struct tm t; char buf[16]; int main () { /* On BeOS and Haiku, locales are not implemented in libc. Rather, libintl imitates locale dependent behaviour by looking at the environment variables, and all locales use the UTF-8 encoding. */ #if defined __BEOS__ || defined __HAIKU__ return 1; #else /* Check whether the given locale name is recognized by the system. */ # if defined _WIN32 && !defined __CYGWIN__ /* On native Windows, setlocale(category, "") looks at the system settings, not at the environment variables. Also, when an encoding suffix such as ".65001" or ".54936" is specified, it succeeds but sets the LC_CTYPE category of the locale to "C". */ if (setlocale (LC_ALL, getenv ("LC_ALL")) == NULL || strcmp (setlocale (LC_CTYPE, NULL), "C") == 0) return 1; # else if (setlocale (LC_ALL, "") == NULL) return 1; # endif /* Check whether nl_langinfo(CODESET) is nonempty and not "ASCII" or "646". On Mac OS X 10.3.5 (Darwin 7.5) in the fr_FR locale, nl_langinfo(CODESET) is empty, and the behaviour of Tcl 8.4 in this locale is not useful. On OpenBSD 4.0, when an unsupported locale is specified, setlocale() succeeds but then nl_langinfo(CODESET) is "646". In this situation, some unit tests fail. On MirBSD 10, when an unsupported locale is specified, setlocale() succeeds but then nl_langinfo(CODESET) is "UTF-8". */ # if HAVE_LANGINFO_CODESET { const char *cs = nl_langinfo (CODESET); if (cs[0] == '\0' || strcmp (cs, "ASCII") == 0 || strcmp (cs, "646") == 0 || strcmp (cs, "UTF-8") == 0) return 1; } # endif # ifdef __CYGWIN__ /* On Cygwin, avoid locale names without encoding suffix, because the locale_charset() function relies on the encoding suffix. Note that LC_ALL is set on the command line. */ if (strchr (getenv ("LC_ALL"), '.') == NULL) return 1; # endif /* Check whether in a month name, no byte in the range 0x80..0x9F occurs. This excludes the UTF-8 encoding (except on MirBSD). */ { const char *p; t.tm_year = 1975 - 1900; t.tm_mon = 2 - 1; t.tm_mday = 4; if (strftime (buf, sizeof (buf), "%B", &t) < 2) return 1; for (p = buf; *p != '\0'; p++) if ((unsigned char) *p >= 0x80 && (unsigned char) *p < 0xa0) return 1; } /* Check whether a typical GB18030 multibyte sequence is recognized as a single wide character. This excludes the GB2312 and GBK encodings. */ if (mblen ("\203\062\332\066", 5) != 4) return 1; return 0; #endif } changequote([,])dnl ])]) if AC_TRY_EVAL([ac_link]) && test -s conftest$ac_exeext; then case "$host_os" in # Handle native Windows specially, because there setlocale() interprets # "ar" as "Arabic" or "Arabic_Saudi Arabia.1256", # "fr" or "fra" as "French" or "French_France.1252", # "ge"(!) or "deu"(!) as "German" or "German_Germany.1252", # "ja" as "Japanese" or "Japanese_Japan.932", # and similar. mingw*) # Test for the hypothetical native Windows locale name. if (LC_ALL=Chinese_China.54936 LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then gt_cv_locale_zh_CN=Chinese_China.54936 else # None found. gt_cv_locale_zh_CN=none fi ;; solaris2.8) # On Solaris 8, the locales zh_CN.GB18030, zh_CN.GBK, zh.GBK are # broken. One witness is the test case in gl_MBRTOWC_SANITYCHECK. # Another witness is that "LC_ALL=zh_CN.GB18030 bash -c true" dumps core. gt_cv_locale_zh_CN=none ;; *) # Setting LC_ALL is not enough. Need to set LC_TIME to empty, because # otherwise on Mac OS X 10.3.5 the LC_TIME=C from the beginning of the # configure script would override the LC_ALL setting. Likewise for # LC_CTYPE, which is also set at the beginning of the configure script. # Test for the locale name without encoding suffix. if (LC_ALL=zh_CN LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then gt_cv_locale_zh_CN=zh_CN else # Test for the locale name with explicit encoding suffix. if (LC_ALL=zh_CN.GB18030 LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then gt_cv_locale_zh_CN=zh_CN.GB18030 else # None found. gt_cv_locale_zh_CN=none fi fi ;; esac else # If there was a link error, due to mblen(), the system is so old that # it certainly doesn't have a chinese locale. gt_cv_locale_zh_CN=none fi rm -fr conftest* ]) LOCALE_ZH_CN=$gt_cv_locale_zh_CN AC_SUBST([LOCALE_ZH_CN]) ]) pspp-1.4.1/gl/m4/stat.m40000644000175000017500000000512213723215637014263 0ustar00blpblp00000000000000# serial 16 # Copyright (C) 2009-2020 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_FUNC_STAT], [ AC_REQUIRE([AC_CANONICAL_HOST]) AC_REQUIRE([gl_SYS_STAT_H_DEFAULTS]) AC_CHECK_FUNCS_ONCE([lstat]) case "$host_os" in mingw*) dnl On this platform, the original stat() returns st_atime, st_mtime, dnl st_ctime values that are affected by the time zone. REPLACE_STAT=1 ;; *) dnl AIX 7.1, Solaris 9, mingw64 mistakenly succeed on stat("file/"). dnl (For mingw, this is due to a broken stat() override in libmingwex.a.) dnl FreeBSD 7.2 mistakenly succeeds on stat("link-to-file/"). AC_CACHE_CHECK([whether stat handles trailing slashes on files], [gl_cv_func_stat_file_slash], [touch conftest.tmp # Assume that if we have lstat, we can also check symlinks. if test $ac_cv_func_lstat = yes; then ln -s conftest.tmp conftest.lnk fi AC_RUN_IFELSE( [AC_LANG_PROGRAM( [[#include ]], [[int result = 0; struct stat st; if (!stat ("conftest.tmp/", &st)) result |= 1; #if HAVE_LSTAT if (!stat ("conftest.lnk/", &st)) result |= 2; #endif return result; ]])], [gl_cv_func_stat_file_slash=yes], [gl_cv_func_stat_file_slash=no], [case "$host_os" in # Guess yes on Linux systems. linux-* | linux) gl_cv_func_stat_file_slash="guessing yes" ;; # Guess yes on glibc systems. *-gnu* | gnu*) gl_cv_func_stat_file_slash="guessing yes" ;; # If we don't know, obey --enable-cross-guesses. *) gl_cv_func_stat_file_slash="$gl_cross_guess_normal" ;; esac ]) rm -f conftest.tmp conftest.lnk]) case $gl_cv_func_stat_file_slash in *no) REPLACE_STAT=1 AC_DEFINE([REPLACE_FUNC_STAT_FILE], [1], [Define to 1 if stat needs help when passed a file name with a trailing slash]);; esac case $host_os in dnl Solaris stat can return a negative tv_nsec. solaris*) REPLACE_FSTAT=1 ;; esac ;; esac ]) # Prerequisites of lib/stat.c and lib/stat-w32.c. AC_DEFUN([gl_PREREQ_STAT], [ AC_REQUIRE([gl_HEADER_SYS_STAT_H]) : ]) pspp-1.4.1/gl/m4/strtod.m40000644000175000017500000001042413723215637014630 0ustar00blpblp00000000000000# strtod.m4 serial 26 dnl Copyright (C) 2002-2003, 2006-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_FUNC_STRTOD], [ AC_REQUIRE([gl_STDLIB_H_DEFAULTS]) AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles m4_ifdef([gl_FUNC_STRTOD_OBSOLETE], [ dnl Test whether strtod is declared. dnl Don't call AC_FUNC_STRTOD, because it does not have the right guess dnl when cross-compiling. dnl Don't call AC_CHECK_FUNCS([strtod]) because it would collide with the dnl ac_cv_func_strtod variable set by the AC_FUNC_STRTOD macro. AC_CHECK_DECLS_ONCE([strtod]) if test $ac_cv_have_decl_strtod != yes; then HAVE_STRTOD=0 fi ]) if test $HAVE_STRTOD = 1; then AC_CACHE_CHECK([whether strtod obeys C99], [gl_cv_func_strtod_works], [AC_RUN_IFELSE([AC_LANG_PROGRAM([[ #include #include #include /* Compare two numbers with ==. This is a separate function because IRIX 6.5 "cc -O" miscompiles an 'x == x' test. */ static int numeric_equal (double x, double y) { return x == y; } ]], [[ int result = 0; { /* In some old versions of Linux (2000 or before), strtod mis-parses strings with leading '+'. */ const char *string = " +69"; char *term; double value = strtod (string, &term); if (value != 69 || term != (string + 4)) result |= 1; } { /* Under Solaris 2.4, strtod returns the wrong value for the terminating character under some conditions. */ const char *string = "NaN"; char *term; strtod (string, &term); if (term != string && *(term - 1) == 0) result |= 2; } { /* Older glibc and Cygwin mis-parse "-0x". */ const char *string = "-0x"; char *term; double value = strtod (string, &term); double zero = 0.0; if (1.0 / value != -1.0 / zero || term != (string + 2)) result |= 4; } { /* Many platforms do not parse hex floats. */ const char *string = "0XaP+1"; char *term; double value = strtod (string, &term); if (value != 20.0 || term != (string + 6)) result |= 8; } { /* Many platforms do not parse infinities. HP-UX 11.31 parses inf, but mistakenly sets errno. */ const char *string = "inf"; char *term; double value; errno = 0; value = strtod (string, &term); if (value != HUGE_VAL || term != (string + 3) || errno) result |= 16; } { /* glibc 2.7 and cygwin 1.5.24 misparse "nan()". */ const char *string = "nan()"; char *term; double value = strtod (string, &term); if (numeric_equal (value, value) || term != (string + 5)) result |= 32; } { /* darwin 10.6.1 misparses "nan(". */ const char *string = "nan("; char *term; double value = strtod (string, &term); if (numeric_equal (value, value) || term != (string + 3)) result |= 64; } return result; ]])], [gl_cv_func_strtod_works=yes], [gl_cv_func_strtod_works=no], [dnl The last known bugs in glibc strtod(), as of this writing, dnl were fixed in version 2.8 AC_EGREP_CPP([Lucky user], [ #include #ifdef __GNU_LIBRARY__ #if ((__GLIBC__ == 2 && __GLIBC_MINOR__ >= 8) || (__GLIBC__ > 2)) \ && !defined __UCLIBC__ Lucky user #endif #endif ], [gl_cv_func_strtod_works="guessing yes"], [case "$host_os" in # Guess yes on musl systems. *-musl*) gl_cv_func_strtod_works="guessing yes" ;; # Guess yes on native Windows. mingw*) gl_cv_func_strtod_works="guessing yes" ;; *) gl_cv_func_strtod_works="$gl_cross_guess_normal" ;; esac ]) ]) ]) case "$gl_cv_func_strtod_works" in *yes) ;; *) REPLACE_STRTOD=1 ;; esac fi ]) # Prerequisites of lib/strtod.c. AC_DEFUN([gl_PREREQ_STRTOD], [ AC_REQUIRE([gl_CHECK_LDEXP_NO_LIBM]) if test $gl_cv_func_ldexp_no_libm = yes; then AC_DEFINE([HAVE_LDEXP_IN_LIBC], [1], [Define if the ldexp function is available in libc.]) fi AC_CHECK_FUNCS([nl_langinfo]) ]) pspp-1.4.1/gl/m4/getrandom.m40000644000175000017500000000406413723215637015274 0ustar00blpblp00000000000000# getrandom.m4 serial 7 dnl Copyright 2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl Written by Paul Eggert. AC_DEFUN([gl_FUNC_GETRANDOM], [ AC_REQUIRE([gl_SYS_RANDOM_H_DEFAULTS]) AC_CHECK_FUNCS_ONCE([getrandom]) if test "$ac_cv_func_getrandom" != yes; then HAVE_GETRANDOM=0 else dnl On Solaris 11.4 the return type is 'int', not 'ssize_t'. AC_CACHE_CHECK([whether getrandom is compatible with its GNU+BSD signature], [gl_cv_func_getrandom_ok], [AC_COMPILE_IFELSE( [AC_LANG_PROGRAM( [[/* Additional includes are needed before on Mac OS X. */ #include #include #include ssize_t getrandom (void *, size_t, unsigned int); ]], [[]]) ], [gl_cv_func_getrandom_ok=yes], [gl_cv_func_getrandom_ok=no]) ]) if test $gl_cv_func_getrandom_ok = no; then REPLACE_GETRANDOM=1 fi fi case "$host_os" in mingw*) AC_CHECK_HEADERS([bcrypt.h], [], [], [[#include ]]) AC_CACHE_CHECK([whether the bcrypt library is guaranteed to be present], [gl_cv_lib_assume_bcrypt], [AC_COMPILE_IFELSE( [AC_LANG_PROGRAM( [[#include ]], [[#if !(_WIN32_WINNT >= _WIN32_WINNT_WIN7) cannot assume it #endif ]]) ], [gl_cv_lib_assume_bcrypt=yes], [gl_cv_lib_assume_bcrypt=no]) ]) if test $gl_cv_lib_assume_bcrypt = yes; then AC_DEFINE([HAVE_LIB_BCRYPT], [1], [Define to 1 if the bcrypt library is guaranteed to be present.]) LIB_GETRANDOM='-lbcrypt' else LIB_GETRANDOM='-ladvapi32' fi ;; *) LIB_GETRANDOM= ;; esac AC_SUBST([LIB_GETRANDOM]) ]) pspp-1.4.1/gl/m4/inttostr.m40000644000175000017500000000145413723215637015202 0ustar00blpblp00000000000000#serial 8 dnl Copyright (C) 2004-2006, 2009-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_INTTOSTR], [ gl_PREREQ_INTTOSTR gl_PREREQ_IMAXTOSTR gl_PREREQ_OFFTOSTR gl_PREREQ_UMAXTOSTR gl_PREREQ_UINTTOSTR ]) # Prerequisites of lib/inttostr.h. AC_DEFUN([gl_PREREQ_INTTOSTR], [ AC_REQUIRE([AC_TYPE_OFF_T]) : ]) # Prerequisites of lib/imaxtostr.c. AC_DEFUN([gl_PREREQ_IMAXTOSTR], [:]) # Prerequisites of lib/offtostr.c. AC_DEFUN([gl_PREREQ_OFFTOSTR], [:]) # Prerequisites of lib/umaxtostr.c. AC_DEFUN([gl_PREREQ_UMAXTOSTR], [:]) # Prerequisites of lib/uinttostr.c. AC_DEFUN([gl_PREREQ_UINTTOSTR], [:]) pspp-1.4.1/gl/m4/sys_types_h.m40000644000175000017500000000337313723215637015667 0ustar00blpblp00000000000000# sys_types_h.m4 serial 9 dnl Copyright (C) 2011-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN_ONCE([gl_SYS_TYPES_H], [ dnl Use sane struct stat types in OpenVMS 8.2 and later. AC_DEFINE([_USE_STD_STAT], 1, [For standard stat data types on VMS.]) AC_REQUIRE([gl_SYS_TYPES_H_DEFAULTS]) gl_NEXT_HEADERS([sys/types.h]) dnl Ensure the type pid_t gets defined. AC_REQUIRE([AC_TYPE_PID_T]) dnl Ensure the type mode_t gets defined. AC_REQUIRE([AC_TYPE_MODE_T]) dnl Whether to override the 'off_t' type. AC_REQUIRE([gl_TYPE_OFF_T]) dnl Whether to override the 'dev_t' and 'ino_t' types. m4_ifdef([gl_WINDOWS_STAT_INODES], [ AC_REQUIRE([gl_WINDOWS_STAT_INODES]) ], [ WINDOWS_STAT_INODES=0 ]) AC_SUBST([WINDOWS_STAT_INODES]) ]) AC_DEFUN([gl_SYS_TYPES_H_DEFAULTS], [ ]) # This works around a buggy version in autoconf <= 2.69. # See m4_version_prereq([2.70], [], [ # This is taken from the following Autoconf patch: # https://git.savannah.gnu.org/cgit/autoconf.git/commit/?id=e17a30e987d7ee695fb4294a82d987ec3dc9b974 m4_undefine([AC_HEADER_MAJOR]) AC_DEFUN([AC_HEADER_MAJOR], [AC_CHECK_HEADERS_ONCE([sys/types.h]) AC_CHECK_HEADER([sys/mkdev.h], [AC_DEFINE([MAJOR_IN_MKDEV], [1], [Define to 1 if `major', `minor', and `makedev' are declared in .])]) if test $ac_cv_header_sys_mkdev_h = no; then AC_CHECK_HEADER([sys/sysmacros.h], [AC_DEFINE([MAJOR_IN_SYSMACROS], [1], [Define to 1 if `major', `minor', and `makedev' are declared in .])]) fi ]) ]) pspp-1.4.1/gl/m4/open-cloexec.m40000644000175000017500000000132313723215637015670 0ustar00blpblp00000000000000# Test whether O_CLOEXEC is defined. dnl Copyright 2017-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_PREPROC_O_CLOEXEC], [ AC_CACHE_CHECK([for O_CLOEXEC], [gl_cv_macro_O_CLOEXEC], [AC_COMPILE_IFELSE( [AC_LANG_PROGRAM([[#include #ifndef O_CLOEXEC choke me; #endif ]], [[return O_CLOEXEC;]])], [gl_cv_macro_O_CLOEXEC=yes], [gl_cv_macro_O_CLOEXEC=no])]) ]) pspp-1.4.1/gl/m4/check-math-lib.m40000644000175000017500000000205013723215637016055 0ustar00blpblp00000000000000# check-math-lib.m4 serial 4 dnl Copyright (C) 2007, 2009-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl dnl gl_CHECK_MATH_LIB (VARIABLE, EXPRESSION [, EXTRA-CODE]) dnl dnl Sets the shell VARIABLE according to the libraries needed by EXPRESSION dnl to compile and link: to the empty string if no extra libraries are needed, dnl to "-lm" if -lm is needed, or to "missing" if it does not compile and dnl link either way. dnl dnl Example: gl_CHECK_MATH_LIB([ROUNDF_LIBM], [x = roundf (x);]) AC_DEFUN([gl_CHECK_MATH_LIB], [ save_LIBS=$LIBS $1=missing for libm in "" "-lm"; do LIBS="$save_LIBS $libm" AC_LINK_IFELSE([AC_LANG_PROGRAM([[ #ifndef __NO_MATH_INLINES # define __NO_MATH_INLINES 1 /* for glibc */ #endif #include $3 double x;]], [$2])], [$1=$libm break]) done LIBS=$save_LIBS ]) pspp-1.4.1/gl/m4/pipe2.m40000644000175000017500000000102313723215637014323 0ustar00blpblp00000000000000# pipe2.m4 serial 2 dnl Copyright (C) 2009-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_FUNC_PIPE2], [ AC_REQUIRE([gl_UNISTD_H_DEFAULTS]) dnl Persuade glibc to declare pipe2(). AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS]) AC_CHECK_FUNCS_ONCE([pipe2]) if test $ac_cv_func_pipe2 != yes; then HAVE_PIPE2=0 fi ]) pspp-1.4.1/gl/m4/wcwidth.m40000644000175000017500000000770713723215637014774 0ustar00blpblp00000000000000# wcwidth.m4 serial 31 dnl Copyright (C) 2006-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_FUNC_WCWIDTH], [ AC_REQUIRE([gl_WCHAR_H_DEFAULTS]) AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles dnl Persuade glibc to declare wcwidth(). AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS]) AC_REQUIRE([gt_TYPE_WCHAR_T]) AC_REQUIRE([gt_TYPE_WINT_T]) AC_CHECK_HEADERS_ONCE([wchar.h]) AC_CHECK_FUNCS_ONCE([wcwidth]) AC_CHECK_DECLS([wcwidth], [], [], [[ /* AIX 3.2.5 declares wcwidth in . */ #include /* Tru64 with Desktop Toolkit C has a bug: must be included before . BSD/OS 4.0.1 has a bug: , and must be included before . */ #include #include #include #include ]]) if test $ac_cv_have_decl_wcwidth != yes; then HAVE_DECL_WCWIDTH=0 fi if test $ac_cv_func_wcwidth != yes; then AC_CACHE_CHECK([whether wcwidth is a macro], [gl_cv_func_wcwidth_macro], [AC_EGREP_CPP([wchar_header_defines_wcwidth], [ #include #ifdef wcwidth wchar_header_defines_wcwidth #endif], [gl_cv_func_wcwidth_macro=yes], [gl_cv_func_wcwidth_macro=no]) ]) fi if test $ac_cv_func_wcwidth = yes || test $gl_cv_func_wcwidth_macro = yes; then HAVE_WCWIDTH=1 dnl On Mac OS X 10.3, wcwidth(0x0301) (COMBINING ACUTE ACCENT) returns 1. dnl On NetBSD 9.0, OpenBSD 5.0, wcwidth(0x05B0) (HEBREW POINT SHEVA) returns 1. dnl On NetBSD 9.0, OSF/1 5.1, wcwidth(0x200B) (ZERO WIDTH SPACE) returns 1. dnl On OpenBSD 5.8, wcwidth(0xFF1A) (FULLWIDTH COLON) returns 0. dnl This leads to bugs in 'ls' (coreutils). dnl On Solaris 11.4, wcwidth(0x2202) (PARTIAL DIFFERENTIAL) returns 2, dnl even in Western locales. AC_CACHE_CHECK([whether wcwidth works reasonably in UTF-8 locales], [gl_cv_func_wcwidth_works], [ AC_RUN_IFELSE( [AC_LANG_SOURCE([[ #include /* AIX 3.2.5 declares wcwidth in . */ #include /* Tru64 with Desktop Toolkit C has a bug: must be included before . BSD/OS 4.0.1 has a bug: , and must be included before . */ #include #include #include #include #if !HAVE_DECL_WCWIDTH extern # ifdef __cplusplus "C" # endif int wcwidth (int); #endif int main () { int result = 0; if (setlocale (LC_ALL, "en_US.UTF-8") != NULL) { if (wcwidth (0x0301) > 0) result |= 1; if (wcwidth (0x05B0) > 0) result |= 2; if (wcwidth (0x200B) > 0) result |= 4; if (wcwidth (0xFF1A) == 0) result |= 8; if (wcwidth (0x2202) > 1) result |= 16; } return result; }]])], [gl_cv_func_wcwidth_works=yes], [gl_cv_func_wcwidth_works=no], [ changequote(,)dnl case "$host_os" in # Guess yes on glibc systems. *-gnu* | gnu*) gl_cv_func_wcwidth_works="guessing yes";; # Guess yes on musl systems. *-musl*) gl_cv_func_wcwidth_works="guessing yes";; # Guess yes on AIX 7 systems. aix[7-9]*) gl_cv_func_wcwidth_works="guessing yes";; *) gl_cv_func_wcwidth_works="$gl_cross_guess_normal";; esac changequote([,])dnl ]) ]) case "$gl_cv_func_wcwidth_works" in *yes) ;; *no) REPLACE_WCWIDTH=1 ;; esac else HAVE_WCWIDTH=0 fi dnl We don't substitute HAVE_WCWIDTH. We assume that if the system does not dnl have the wcwidth function, then it does not declare it. ]) # Prerequisites of lib/wcwidth.c. AC_DEFUN([gl_PREREQ_WCWIDTH], [ AC_REQUIRE([AC_C_INLINE]) : ]) pspp-1.4.1/gl/m4/relocatable-lib.m40000644000175000017500000000274413723215637016340 0ustar00blpblp00000000000000# relocatable-lib.m4 serial 6 dnl Copyright (C) 2003, 2005-2007, 2009-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl From Bruno Haible. dnl Support for relocatable libraries. AC_DEFUN([gl_RELOCATABLE_LIBRARY], [ AC_REQUIRE([gl_RELOCATABLE_LIBRARY_BODY]) ]) AC_DEFUN([gl_RELOCATABLE_LIBRARY_BODY], [ AC_REQUIRE([gl_RELOCATABLE_NOP]) dnl Easier to put this here once, instead of into the DEFS of each Makefile. if test "X$prefix" = "XNONE"; then reloc_final_prefix="$ac_default_prefix" else reloc_final_prefix="$prefix" fi AC_DEFINE_UNQUOTED([INSTALLPREFIX], ["${reloc_final_prefix}"], [Define to the value of ${prefix}, as a string.]) if test $RELOCATABLE = yes; then AC_DEFINE([ENABLE_RELOCATABLE], [1], [Define to 1 if the package shall run at any location in the file system.]) fi ]) dnl Support for relocatable packages for which it is a nop. AC_DEFUN([gl_RELOCATABLE_NOP], [ AC_MSG_CHECKING([whether to activate relocatable installation]) AC_ARG_ENABLE([relocatable], [AS_HELP_STRING([--enable-relocatable], [install a package that can be moved in the file system])], [if test "$enableval" != no; then RELOCATABLE=yes else RELOCATABLE=no fi ], RELOCATABLE=no) AC_SUBST([RELOCATABLE]) AC_MSG_RESULT([$RELOCATABLE]) ]) pspp-1.4.1/gl/m4/printf.m40000644000175000017500000021067613723215637014626 0ustar00blpblp00000000000000# printf.m4 serial 67 dnl Copyright (C) 2003, 2007-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl Test whether the *printf family of functions supports the 'j', 'z', 't', dnl 'L' size specifiers. (ISO C99, POSIX:2001) dnl Result is gl_cv_func_printf_sizes_c99. AC_DEFUN([gl_PRINTF_SIZES_C99], [ AC_REQUIRE([AC_PROG_CC]) AC_REQUIRE([gl_AC_HEADER_STDINT_H]) AC_REQUIRE([gl_AC_HEADER_INTTYPES_H]) AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles AC_CACHE_CHECK([whether printf supports size specifiers as in C99], [gl_cv_func_printf_sizes_c99], [ AC_RUN_IFELSE( [AC_LANG_SOURCE([[ #include #include #include #include #if HAVE_STDINT_H_WITH_UINTMAX # include #endif #if HAVE_INTTYPES_H_WITH_UINTMAX # include #endif static char buf[100]; int main () { int result = 0; #if HAVE_STDINT_H_WITH_UINTMAX || HAVE_INTTYPES_H_WITH_UINTMAX buf[0] = '\0'; if (sprintf (buf, "%ju %d", (uintmax_t) 12345671, 33, 44, 55) < 0 || strcmp (buf, "12345671 33") != 0) result |= 1; #else result |= 1; #endif buf[0] = '\0'; if (sprintf (buf, "%zu %d", (size_t) 12345672, 33, 44, 55) < 0 || strcmp (buf, "12345672 33") != 0) result |= 2; buf[0] = '\0'; if (sprintf (buf, "%tu %d", (ptrdiff_t) 12345673, 33, 44, 55) < 0 || strcmp (buf, "12345673 33") != 0) result |= 4; buf[0] = '\0'; if (sprintf (buf, "%Lg %d", (long double) 1.5, 33, 44, 55) < 0 || strcmp (buf, "1.5 33") != 0) result |= 8; return result; }]])], [gl_cv_func_printf_sizes_c99=yes], [gl_cv_func_printf_sizes_c99=no], [ case "$host_os" in changequote(,)dnl # Guess yes on glibc systems. *-gnu* | gnu*) gl_cv_func_printf_sizes_c99="guessing yes";; # Guess yes on musl systems. *-musl*) gl_cv_func_printf_sizes_c99="guessing yes";; # Guess yes on FreeBSD >= 5. freebsd[1-4].*) gl_cv_func_printf_sizes_c99="guessing no";; freebsd* | kfreebsd*) gl_cv_func_printf_sizes_c99="guessing yes";; # Guess yes on Mac OS X >= 10.3. darwin[1-6].*) gl_cv_func_printf_sizes_c99="guessing no";; darwin*) gl_cv_func_printf_sizes_c99="guessing yes";; # Guess yes on OpenBSD >= 3.9. openbsd[1-2].* | openbsd3.[0-8] | openbsd3.[0-8].*) gl_cv_func_printf_sizes_c99="guessing no";; openbsd*) gl_cv_func_printf_sizes_c99="guessing yes";; # Guess yes on Solaris >= 2.10. solaris2.[1-9][0-9]*) gl_cv_func_printf_sizes_c99="guessing yes";; solaris*) gl_cv_func_printf_sizes_c99="guessing no";; # Guess yes on NetBSD >= 3. netbsd[1-2]* | netbsdelf[1-2]* | netbsdaout[1-2]* | netbsdcoff[1-2]*) gl_cv_func_printf_sizes_c99="guessing no";; netbsd*) gl_cv_func_printf_sizes_c99="guessing yes";; # Guess yes on Android. linux*-android*) gl_cv_func_printf_sizes_c99="guessing yes";; changequote([,])dnl # Guess yes on MSVC, no on mingw. mingw*) AC_EGREP_CPP([Known], [ #ifdef _MSC_VER Known #endif ], [gl_cv_func_printf_sizes_c99="guessing yes"], [gl_cv_func_printf_sizes_c99="guessing no"]) ;; # If we don't know, obey --enable-cross-guesses. *) gl_cv_func_printf_sizes_c99="$gl_cross_guess_normal";; esac ]) ]) ]) dnl Test whether the *printf family of functions supports 'long double' dnl arguments together with the 'L' size specifier. (ISO C99, POSIX:2001) dnl Result is gl_cv_func_printf_long_double. AC_DEFUN([gl_PRINTF_LONG_DOUBLE], [ AC_REQUIRE([AC_PROG_CC]) AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles AC_CACHE_CHECK([whether printf supports 'long double' arguments], [gl_cv_func_printf_long_double], [ AC_RUN_IFELSE( [AC_LANG_SOURCE([[ #include #include static char buf[10000]; int main () { int result = 0; buf[0] = '\0'; if (sprintf (buf, "%Lf %d", 1.75L, 33, 44, 55) < 0 || strcmp (buf, "1.750000 33") != 0) result |= 1; buf[0] = '\0'; if (sprintf (buf, "%Le %d", 1.75L, 33, 44, 55) < 0 || strcmp (buf, "1.750000e+00 33") != 0) result |= 2; buf[0] = '\0'; if (sprintf (buf, "%Lg %d", 1.75L, 33, 44, 55) < 0 || strcmp (buf, "1.75 33") != 0) result |= 4; return result; }]])], [gl_cv_func_printf_long_double=yes], [gl_cv_func_printf_long_double=no], [case "$host_os" in # Guess no on BeOS. beos*) gl_cv_func_printf_long_double="guessing no";; # Guess yes on Android. linux*-android*) gl_cv_func_printf_long_double="guessing yes";; # Guess yes on MSVC, no on mingw. mingw*) AC_EGREP_CPP([Known], [ #ifdef _MSC_VER Known #endif ], [gl_cv_func_printf_long_double="guessing yes"], [gl_cv_func_printf_long_double="guessing no"]) ;; *) gl_cv_func_printf_long_double="guessing yes";; esac ]) ]) ]) dnl Test whether the *printf family of functions supports infinite and NaN dnl 'double' arguments and negative zero arguments in the %f, %e, %g dnl directives. (ISO C99, POSIX:2001) dnl Result is gl_cv_func_printf_infinite. AC_DEFUN([gl_PRINTF_INFINITE], [ AC_REQUIRE([AC_PROG_CC]) AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles AC_CACHE_CHECK([whether printf supports infinite 'double' arguments], [gl_cv_func_printf_infinite], [ AC_RUN_IFELSE( [AC_LANG_SOURCE([[ #include #include static int strisnan (const char *string, size_t start_index, size_t end_index) { if (start_index < end_index) { if (string[start_index] == '-') start_index++; if (start_index + 3 <= end_index && memcmp (string + start_index, "nan", 3) == 0) { start_index += 3; if (start_index == end_index || (string[start_index] == '(' && string[end_index - 1] == ')')) return 1; } } return 0; } static int have_minus_zero () { static double plus_zero = 0.0; double minus_zero = - plus_zero; return memcmp (&plus_zero, &minus_zero, sizeof (double)) != 0; } static char buf[10000]; static double zero = 0.0; int main () { int result = 0; if (sprintf (buf, "%f", 1.0 / zero) < 0 || (strcmp (buf, "inf") != 0 && strcmp (buf, "infinity") != 0)) result |= 1; if (sprintf (buf, "%f", -1.0 / zero) < 0 || (strcmp (buf, "-inf") != 0 && strcmp (buf, "-infinity") != 0)) result |= 1; if (sprintf (buf, "%f", zero / zero) < 0 || !strisnan (buf, 0, strlen (buf))) result |= 2; if (sprintf (buf, "%e", 1.0 / zero) < 0 || (strcmp (buf, "inf") != 0 && strcmp (buf, "infinity") != 0)) result |= 4; if (sprintf (buf, "%e", -1.0 / zero) < 0 || (strcmp (buf, "-inf") != 0 && strcmp (buf, "-infinity") != 0)) result |= 4; if (sprintf (buf, "%e", zero / zero) < 0 || !strisnan (buf, 0, strlen (buf))) result |= 8; if (sprintf (buf, "%g", 1.0 / zero) < 0 || (strcmp (buf, "inf") != 0 && strcmp (buf, "infinity") != 0)) result |= 16; if (sprintf (buf, "%g", -1.0 / zero) < 0 || (strcmp (buf, "-inf") != 0 && strcmp (buf, "-infinity") != 0)) result |= 16; if (sprintf (buf, "%g", zero / zero) < 0 || !strisnan (buf, 0, strlen (buf))) result |= 32; /* This test fails on HP-UX 10.20. */ if (have_minus_zero ()) if (sprintf (buf, "%g", - zero) < 0 || strcmp (buf, "-0") != 0) result |= 64; return result; }]])], [gl_cv_func_printf_infinite=yes], [gl_cv_func_printf_infinite=no], [ case "$host_os" in changequote(,)dnl # Guess yes on glibc systems. *-gnu* | gnu*) gl_cv_func_printf_infinite="guessing yes";; # Guess yes on musl systems. *-musl*) gl_cv_func_printf_infinite="guessing yes";; # Guess yes on FreeBSD >= 6. freebsd[1-5].*) gl_cv_func_printf_infinite="guessing no";; freebsd* | kfreebsd*) gl_cv_func_printf_infinite="guessing yes";; # Guess yes on Mac OS X >= 10.3. darwin[1-6].*) gl_cv_func_printf_infinite="guessing no";; darwin*) gl_cv_func_printf_infinite="guessing yes";; # Guess yes on HP-UX >= 11. hpux[7-9]* | hpux10*) gl_cv_func_printf_infinite="guessing no";; hpux*) gl_cv_func_printf_infinite="guessing yes";; # Guess yes on NetBSD >= 3. netbsd[1-2]* | netbsdelf[1-2]* | netbsdaout[1-2]* | netbsdcoff[1-2]*) gl_cv_func_printf_infinite="guessing no";; netbsd*) gl_cv_func_printf_infinite="guessing yes";; # Guess yes on BeOS. beos*) gl_cv_func_printf_infinite="guessing yes";; # Guess no on Android. linux*-android*) gl_cv_func_printf_infinite="guessing no";; changequote([,])dnl # Guess yes on MSVC, no on mingw. mingw*) AC_EGREP_CPP([Known], [ #ifdef _MSC_VER Known #endif ], [gl_cv_func_printf_infinite="guessing yes"], [gl_cv_func_printf_infinite="guessing no"]) ;; # If we don't know, obey --enable-cross-guesses. *) gl_cv_func_printf_infinite="$gl_cross_guess_normal";; esac ]) ]) ]) dnl Test whether the *printf family of functions supports infinite and NaN dnl 'long double' arguments in the %f, %e, %g directives. (ISO C99, POSIX:2001) dnl Result is gl_cv_func_printf_infinite_long_double. AC_DEFUN([gl_PRINTF_INFINITE_LONG_DOUBLE], [ AC_REQUIRE([gl_PRINTF_LONG_DOUBLE]) AC_REQUIRE([AC_PROG_CC]) AC_REQUIRE([gl_BIGENDIAN]) AC_REQUIRE([gl_LONG_DOUBLE_VS_DOUBLE]) AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles dnl The user can set or unset the variable gl_printf_safe to indicate dnl that he wishes a safe handling of non-IEEE-754 'long double' values. if test -n "$gl_printf_safe"; then AC_DEFINE([CHECK_PRINTF_SAFE], [1], [Define if you wish *printf() functions that have a safe handling of non-IEEE-754 'long double' values.]) fi case "$gl_cv_func_printf_long_double" in *yes) AC_CACHE_CHECK([whether printf supports infinite 'long double' arguments], [gl_cv_func_printf_infinite_long_double], [ AC_RUN_IFELSE( [AC_LANG_SOURCE([[ ]GL_NOCRASH[ #include #include #include static int strisnan (const char *string, size_t start_index, size_t end_index) { if (start_index < end_index) { if (string[start_index] == '-') start_index++; if (start_index + 3 <= end_index && memcmp (string + start_index, "nan", 3) == 0) { start_index += 3; if (start_index == end_index || (string[start_index] == '(' && string[end_index - 1] == ')')) return 1; } } return 0; } static char buf[10000]; static long double zeroL = 0.0L; int main () { int result = 0; nocrash_init(); if (sprintf (buf, "%Lf", 1.0L / zeroL) < 0 || (strcmp (buf, "inf") != 0 && strcmp (buf, "infinity") != 0)) result |= 1; if (sprintf (buf, "%Lf", -1.0L / zeroL) < 0 || (strcmp (buf, "-inf") != 0 && strcmp (buf, "-infinity") != 0)) result |= 1; if (sprintf (buf, "%Lf", zeroL / zeroL) < 0 || !strisnan (buf, 0, strlen (buf))) result |= 1; if (sprintf (buf, "%Le", 1.0L / zeroL) < 0 || (strcmp (buf, "inf") != 0 && strcmp (buf, "infinity") != 0)) result |= 1; if (sprintf (buf, "%Le", -1.0L / zeroL) < 0 || (strcmp (buf, "-inf") != 0 && strcmp (buf, "-infinity") != 0)) result |= 1; if (sprintf (buf, "%Le", zeroL / zeroL) < 0 || !strisnan (buf, 0, strlen (buf))) result |= 1; if (sprintf (buf, "%Lg", 1.0L / zeroL) < 0 || (strcmp (buf, "inf") != 0 && strcmp (buf, "infinity") != 0)) result |= 1; if (sprintf (buf, "%Lg", -1.0L / zeroL) < 0 || (strcmp (buf, "-inf") != 0 && strcmp (buf, "-infinity") != 0)) result |= 1; if (sprintf (buf, "%Lg", zeroL / zeroL) < 0 || !strisnan (buf, 0, strlen (buf))) result |= 1; #if CHECK_PRINTF_SAFE && ((defined __ia64 && LDBL_MANT_DIG == 64) || (defined __x86_64__ || defined __amd64__) || (defined __i386 || defined __i386__ || defined _I386 || defined _M_IX86 || defined _X86_)) && !HAVE_SAME_LONG_DOUBLE_AS_DOUBLE /* Representation of an 80-bit 'long double' as an initializer for a sequence of 'unsigned int' words. */ # ifdef WORDS_BIGENDIAN # define LDBL80_WORDS(exponent,manthi,mantlo) \ { ((unsigned int) (exponent) << 16) | ((unsigned int) (manthi) >> 16), \ ((unsigned int) (manthi) << 16) | ((unsigned int) (mantlo) >> 16), \ (unsigned int) (mantlo) << 16 \ } # else # define LDBL80_WORDS(exponent,manthi,mantlo) \ { mantlo, manthi, exponent } # endif { /* Quiet NaN. */ static union { unsigned int word[4]; long double value; } x = { LDBL80_WORDS (0xFFFF, 0xC3333333, 0x00000000) }; if (sprintf (buf, "%Lf", x.value) < 0 || !strisnan (buf, 0, strlen (buf))) result |= 2; if (sprintf (buf, "%Le", x.value) < 0 || !strisnan (buf, 0, strlen (buf))) result |= 2; if (sprintf (buf, "%Lg", x.value) < 0 || !strisnan (buf, 0, strlen (buf))) result |= 2; } { /* Signalling NaN. */ static union { unsigned int word[4]; long double value; } x = { LDBL80_WORDS (0xFFFF, 0x83333333, 0x00000000) }; if (sprintf (buf, "%Lf", x.value) < 0 || !strisnan (buf, 0, strlen (buf))) result |= 2; if (sprintf (buf, "%Le", x.value) < 0 || !strisnan (buf, 0, strlen (buf))) result |= 2; if (sprintf (buf, "%Lg", x.value) < 0 || !strisnan (buf, 0, strlen (buf))) result |= 2; } { /* Pseudo-NaN. */ static union { unsigned int word[4]; long double value; } x = { LDBL80_WORDS (0xFFFF, 0x40000001, 0x00000000) }; if (sprintf (buf, "%Lf", x.value) <= 0) result |= 4; if (sprintf (buf, "%Le", x.value) <= 0) result |= 4; if (sprintf (buf, "%Lg", x.value) <= 0) result |= 4; } { /* Pseudo-Infinity. */ static union { unsigned int word[4]; long double value; } x = { LDBL80_WORDS (0xFFFF, 0x00000000, 0x00000000) }; if (sprintf (buf, "%Lf", x.value) <= 0) result |= 8; if (sprintf (buf, "%Le", x.value) <= 0) result |= 8; if (sprintf (buf, "%Lg", x.value) <= 0) result |= 8; } { /* Pseudo-Zero. */ static union { unsigned int word[4]; long double value; } x = { LDBL80_WORDS (0x4004, 0x00000000, 0x00000000) }; if (sprintf (buf, "%Lf", x.value) <= 0) result |= 16; if (sprintf (buf, "%Le", x.value) <= 0) result |= 16; if (sprintf (buf, "%Lg", x.value) <= 0) result |= 16; } { /* Unnormalized number. */ static union { unsigned int word[4]; long double value; } x = { LDBL80_WORDS (0x4000, 0x63333333, 0x00000000) }; if (sprintf (buf, "%Lf", x.value) <= 0) result |= 32; if (sprintf (buf, "%Le", x.value) <= 0) result |= 32; if (sprintf (buf, "%Lg", x.value) <= 0) result |= 32; } { /* Pseudo-Denormal. */ static union { unsigned int word[4]; long double value; } x = { LDBL80_WORDS (0x0000, 0x83333333, 0x00000000) }; if (sprintf (buf, "%Lf", x.value) <= 0) result |= 64; if (sprintf (buf, "%Le", x.value) <= 0) result |= 64; if (sprintf (buf, "%Lg", x.value) <= 0) result |= 64; } #endif return result; }]])], [gl_cv_func_printf_infinite_long_double=yes], [gl_cv_func_printf_infinite_long_double=no], [case "$host_cpu" in # Guess no on ia64, x86_64, i386. ia64 | x86_64 | i*86) gl_cv_func_printf_infinite_long_double="guessing no";; *) case "$host_os" in changequote(,)dnl # Guess yes on glibc systems. *-gnu* | gnu*) gl_cv_func_printf_infinite_long_double="guessing yes";; # Guess yes on musl systems. *-musl*) gl_cv_func_printf_infinite_long_double="guessing yes";; # Guess yes on FreeBSD >= 6. freebsd[1-5].*) gl_cv_func_printf_infinite_long_double="guessing no";; freebsd* | kfreebsd*) gl_cv_func_printf_infinite_long_double="guessing yes";; # Guess yes on HP-UX >= 11. hpux[7-9]* | hpux10*) gl_cv_func_printf_infinite_long_double="guessing no";; hpux*) gl_cv_func_printf_infinite_long_double="guessing yes";; # Guess no on Android. linux*-android*) gl_cv_func_printf_infinite_long_double="guessing no";; changequote([,])dnl # Guess yes on MSVC, no on mingw. mingw*) AC_EGREP_CPP([Known], [ #ifdef _MSC_VER Known #endif ], [gl_cv_func_printf_infinite_long_double="guessing yes"], [gl_cv_func_printf_infinite_long_double="guessing no"]) ;; # If we don't know, obey --enable-cross-guesses. *) gl_cv_func_printf_infinite_long_double="$gl_cross_guess_normal";; esac ;; esac ]) ]) ;; *) gl_cv_func_printf_infinite_long_double="irrelevant" ;; esac ]) dnl Test whether the *printf family of functions supports the 'a' and 'A' dnl conversion specifier for hexadecimal output of floating-point numbers. dnl (ISO C99, POSIX:2001) dnl Result is gl_cv_func_printf_directive_a. AC_DEFUN([gl_PRINTF_DIRECTIVE_A], [ AC_REQUIRE([AC_PROG_CC]) AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles AC_CACHE_CHECK([whether printf supports the 'a' and 'A' directives], [gl_cv_func_printf_directive_a], [ AC_RUN_IFELSE( [AC_LANG_SOURCE([[ #include #include static char buf[100]; static double zero = 0.0; int main () { int result = 0; if (sprintf (buf, "%a %d", 3.1416015625, 33, 44, 55) < 0 || (strcmp (buf, "0x1.922p+1 33") != 0 && strcmp (buf, "0x3.244p+0 33") != 0 && strcmp (buf, "0x6.488p-1 33") != 0 && strcmp (buf, "0xc.91p-2 33") != 0)) result |= 1; if (sprintf (buf, "%A %d", -3.1416015625, 33, 44, 55) < 0 || (strcmp (buf, "-0X1.922P+1 33") != 0 && strcmp (buf, "-0X3.244P+0 33") != 0 && strcmp (buf, "-0X6.488P-1 33") != 0 && strcmp (buf, "-0XC.91P-2 33") != 0)) result |= 2; /* This catches a FreeBSD 6.1 bug: it doesn't round. */ if (sprintf (buf, "%.2a %d", 1.51, 33, 44, 55) < 0 || (strcmp (buf, "0x1.83p+0 33") != 0 && strcmp (buf, "0x3.05p-1 33") != 0 && strcmp (buf, "0x6.0ap-2 33") != 0 && strcmp (buf, "0xc.14p-3 33") != 0)) result |= 4; /* This catches a Mac OS X 10.12.4 (Darwin 16.5) bug: it doesn't round. */ if (sprintf (buf, "%.0a %d", 1.51, 33, 44, 55) < 0 || (strcmp (buf, "0x2p+0 33") != 0 && strcmp (buf, "0x3p-1 33") != 0 && strcmp (buf, "0x6p-2 33") != 0 && strcmp (buf, "0xcp-3 33") != 0)) result |= 4; /* This catches a FreeBSD 6.1 bug. See */ if (sprintf (buf, "%010a %d", 1.0 / zero, 33, 44, 55) < 0 || buf[0] == '0') result |= 8; /* This catches a Mac OS X 10.3.9 (Darwin 7.9) bug. */ if (sprintf (buf, "%.1a", 1.999) < 0 || (strcmp (buf, "0x1.0p+1") != 0 && strcmp (buf, "0x2.0p+0") != 0 && strcmp (buf, "0x4.0p-1") != 0 && strcmp (buf, "0x8.0p-2") != 0)) result |= 16; /* This catches the same Mac OS X 10.3.9 (Darwin 7.9) bug and also a glibc 2.4 bug . */ if (sprintf (buf, "%.1La", 1.999L) < 0 || (strcmp (buf, "0x1.0p+1") != 0 && strcmp (buf, "0x2.0p+0") != 0 && strcmp (buf, "0x4.0p-1") != 0 && strcmp (buf, "0x8.0p-2") != 0)) result |= 32; return result; }]])], [gl_cv_func_printf_directive_a=yes], [gl_cv_func_printf_directive_a=no], [ case "$host_os" in # Guess yes on glibc >= 2.5 systems. *-gnu* | gnu*) AC_EGREP_CPP([BZ2908], [ #include #ifdef __GNU_LIBRARY__ #if ((__GLIBC__ == 2 && __GLIBC_MINOR__ >= 5) || (__GLIBC__ > 2)) && !defined __UCLIBC__ BZ2908 #endif #endif ], [gl_cv_func_printf_directive_a="guessing yes"], [gl_cv_func_printf_directive_a="guessing no"]) ;; # Guess yes on musl systems. *-musl*) gl_cv_func_printf_directive_a="guessing yes";; # Guess no on Android. linux*-android*) gl_cv_func_printf_directive_a="guessing no";; # Guess no on native Windows. mingw*) gl_cv_func_printf_directive_a="guessing no";; # If we don't know, obey --enable-cross-guesses. *) gl_cv_func_printf_directive_a="$gl_cross_guess_normal";; esac ]) ]) ]) dnl Test whether the *printf family of functions supports the %F format dnl directive. (ISO C99, POSIX:2001) dnl Result is gl_cv_func_printf_directive_f. AC_DEFUN([gl_PRINTF_DIRECTIVE_F], [ AC_REQUIRE([AC_PROG_CC]) AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles AC_CACHE_CHECK([whether printf supports the 'F' directive], [gl_cv_func_printf_directive_f], [ AC_RUN_IFELSE( [AC_LANG_SOURCE([[ #include #include static char buf[100]; static double zero = 0.0; int main () { int result = 0; if (sprintf (buf, "%F %d", 1234567.0, 33, 44, 55) < 0 || strcmp (buf, "1234567.000000 33") != 0) result |= 1; if (sprintf (buf, "%F", 1.0 / zero) < 0 || (strcmp (buf, "INF") != 0 && strcmp (buf, "INFINITY") != 0)) result |= 2; /* This catches a Cygwin 1.5.x bug. */ if (sprintf (buf, "%.F", 1234.0) < 0 || strcmp (buf, "1234") != 0) result |= 4; return result; }]])], [gl_cv_func_printf_directive_f=yes], [gl_cv_func_printf_directive_f=no], [ case "$host_os" in changequote(,)dnl # Guess yes on glibc systems. *-gnu* | gnu*) gl_cv_func_printf_directive_f="guessing yes";; # Guess yes on musl systems. *-musl*) gl_cv_func_printf_directive_f="guessing yes";; # Guess yes on FreeBSD >= 6. freebsd[1-5].*) gl_cv_func_printf_directive_f="guessing no";; freebsd* | kfreebsd*) gl_cv_func_printf_directive_f="guessing yes";; # Guess yes on Mac OS X >= 10.3. darwin[1-6].*) gl_cv_func_printf_directive_f="guessing no";; darwin*) gl_cv_func_printf_directive_f="guessing yes";; # Guess yes on Solaris >= 2.10. solaris2.[1-9][0-9]*) gl_cv_func_printf_directive_f="guessing yes";; solaris*) gl_cv_func_printf_directive_f="guessing no";; # Guess no on Android. linux*-android*) gl_cv_func_printf_directive_f="guessing no";; changequote([,])dnl # Guess yes on MSVC, no on mingw. mingw*) AC_EGREP_CPP([Known], [ #ifdef _MSC_VER Known #endif ], [gl_cv_func_printf_directive_f="guessing yes"], [gl_cv_func_printf_directive_f="guessing no"]) ;; # If we don't know, obey --enable-cross-guesses. *) gl_cv_func_printf_directive_f="$gl_cross_guess_normal";; esac ]) ]) ]) dnl Test whether the *printf family of functions supports the %n format dnl directive. (ISO C99, POSIX:2001) dnl Result is gl_cv_func_printf_directive_n. AC_DEFUN([gl_PRINTF_DIRECTIVE_N], [ AC_REQUIRE([AC_PROG_CC]) AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles AC_CACHE_CHECK([whether printf supports the 'n' directive], [gl_cv_func_printf_directive_n], [ AC_RUN_IFELSE( [AC_LANG_SOURCE([[ #include #include #include #ifdef _MSC_VER #include /* See page about "Parameter Validation" on msdn.microsoft.com. */ static void cdecl invalid_parameter_handler (const wchar_t *expression, const wchar_t *function, const wchar_t *file, unsigned int line, uintptr_t dummy) { exit (1); } #endif static char fmtstring[10]; static char buf[100]; int main () { int count = -1; #ifdef _MSC_VER _set_invalid_parameter_handler (invalid_parameter_handler); #endif /* Copy the format string. Some systems (glibc with _FORTIFY_SOURCE=2) support %n in format strings in read-only memory but not in writable memory. */ strcpy (fmtstring, "%d %n"); if (sprintf (buf, fmtstring, 123, &count, 33, 44, 55) < 0 || strcmp (buf, "123 ") != 0 || count != 4) return 1; return 0; }]])], [gl_cv_func_printf_directive_n=yes], [gl_cv_func_printf_directive_n=no], [case "$host_os" in # Guess no on glibc when _FORTIFY_SOURCE >= 2. *-gnu* | gnu*) AC_COMPILE_IFELSE( [AC_LANG_SOURCE( [[#if _FORTIFY_SOURCE >= 2 error fail #endif ]])], [gl_cv_func_printf_directive_n="guessing yes"], [gl_cv_func_printf_directive_n="guessing no"]) ;; # Guess no on Android. linux*-android*) gl_cv_func_printf_directive_n="guessing no";; # Guess no on native Windows. mingw*) gl_cv_func_printf_directive_n="guessing no";; *) gl_cv_func_printf_directive_n="guessing yes";; esac ]) ]) ]) dnl Test whether the *printf family of functions supports the %ls format dnl directive and in particular, when a precision is specified, whether dnl the functions stop converting the wide string argument when the number dnl of bytes that have been produced by this conversion equals or exceeds dnl the precision. dnl Result is gl_cv_func_printf_directive_ls. AC_DEFUN([gl_PRINTF_DIRECTIVE_LS], [ AC_REQUIRE([AC_PROG_CC]) AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles AC_CACHE_CHECK([whether printf supports the 'ls' directive], [gl_cv_func_printf_directive_ls], [ AC_RUN_IFELSE( [AC_LANG_SOURCE([[ /* Tru64 with Desktop Toolkit C has a bug: must be included before . BSD/OS 4.0.1 has a bug: , and must be included before . */ #include #include #include #include #include int main () { int result = 0; char buf[100]; /* Test whether %ls works at all. This test fails on OpenBSD 4.0, IRIX 6.5, Solaris 2.6, Haiku, but not on Cygwin 1.5. */ { static const wchar_t wstring[] = { 'a', 'b', 'c', 0 }; buf[0] = '\0'; if (sprintf (buf, "%ls", wstring) < 0 || strcmp (buf, "abc") != 0) result |= 1; } /* This test fails on IRIX 6.5, Solaris 2.6, Cygwin 1.5, Haiku (with an assertion failure inside libc), but not on OpenBSD 4.0. */ { static const wchar_t wstring[] = { 'a', 0 }; buf[0] = '\0'; if (sprintf (buf, "%ls", wstring) < 0 || strcmp (buf, "a") != 0) result |= 2; } /* Test whether precisions in %ls are supported as specified in ISO C 99 section 7.19.6.1: "If a precision is specified, no more than that many bytes are written (including shift sequences, if any), and the array shall contain a null wide character if, to equal the multibyte character sequence length given by the precision, the function would need to access a wide character one past the end of the array." This test fails on Solaris 10. */ { static const wchar_t wstring[] = { 'a', 'b', (wchar_t) 0xfdfdfdfd, 0 }; buf[0] = '\0'; if (sprintf (buf, "%.2ls", wstring) < 0 || strcmp (buf, "ab") != 0) result |= 8; } return result; }]])], [gl_cv_func_printf_directive_ls=yes], [gl_cv_func_printf_directive_ls=no], [ changequote(,)dnl case "$host_os" in openbsd*) gl_cv_func_printf_directive_ls="guessing no";; irix*) gl_cv_func_printf_directive_ls="guessing no";; solaris*) gl_cv_func_printf_directive_ls="guessing no";; cygwin*) gl_cv_func_printf_directive_ls="guessing no";; beos* | haiku*) gl_cv_func_printf_directive_ls="guessing no";; # Guess no on Android. linux*-android*) gl_cv_func_printf_directive_ls="guessing no";; # Guess yes on native Windows. mingw*) gl_cv_func_printf_directive_ls="guessing yes";; *) gl_cv_func_printf_directive_ls="guessing yes";; esac changequote([,])dnl ]) ]) ]) dnl Test whether the *printf family of functions supports POSIX/XSI format dnl strings with positions. (POSIX:2001) dnl Result is gl_cv_func_printf_positions. AC_DEFUN([gl_PRINTF_POSITIONS], [ AC_REQUIRE([AC_PROG_CC]) AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles AC_CACHE_CHECK([whether printf supports POSIX/XSI format strings with positions], [gl_cv_func_printf_positions], [ AC_RUN_IFELSE( [AC_LANG_SOURCE([[ #include #include /* The string "%2$d %1$d", with dollar characters protected from the shell's dollar expansion (possibly an autoconf bug). */ static char format[] = { '%', '2', '$', 'd', ' ', '%', '1', '$', 'd', '\0' }; static char buf[100]; int main () { sprintf (buf, format, 33, 55); return (strcmp (buf, "55 33") != 0); }]])], [gl_cv_func_printf_positions=yes], [gl_cv_func_printf_positions=no], [ changequote(,)dnl case "$host_os" in netbsd[1-3]* | netbsdelf[1-3]* | netbsdaout[1-3]* | netbsdcoff[1-3]*) gl_cv_func_printf_positions="guessing no";; beos*) gl_cv_func_printf_positions="guessing no";; # Guess yes on Android. linux*-android*) gl_cv_func_printf_positions="guessing yes";; # Guess no on native Windows. mingw* | pw*) gl_cv_func_printf_positions="guessing no";; *) gl_cv_func_printf_positions="guessing yes";; esac changequote([,])dnl ]) ]) ]) dnl Test whether the *printf family of functions supports POSIX/XSI format dnl strings with the ' flag for grouping of decimal digits. (POSIX:2001) dnl Result is gl_cv_func_printf_flag_grouping. AC_DEFUN([gl_PRINTF_FLAG_GROUPING], [ AC_REQUIRE([AC_PROG_CC]) AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles AC_CACHE_CHECK([whether printf supports the grouping flag], [gl_cv_func_printf_flag_grouping], [ AC_RUN_IFELSE( [AC_LANG_SOURCE([[ #include #include static char buf[100]; int main () { if (sprintf (buf, "%'d %d", 1234567, 99) < 0 || buf[strlen (buf) - 1] != '9') return 1; return 0; }]])], [gl_cv_func_printf_flag_grouping=yes], [gl_cv_func_printf_flag_grouping=no], [ changequote(,)dnl case "$host_os" in cygwin*) gl_cv_func_printf_flag_grouping="guessing no";; netbsd*) gl_cv_func_printf_flag_grouping="guessing no";; # Guess no on Android. linux*-android*) gl_cv_func_printf_flag_grouping="guessing no";; # Guess no on native Windows. mingw* | pw*) gl_cv_func_printf_flag_grouping="guessing no";; *) gl_cv_func_printf_flag_grouping="guessing yes";; esac changequote([,])dnl ]) ]) ]) dnl Test whether the *printf family of functions supports the - flag correctly. dnl (ISO C99.) See dnl dnl Result is gl_cv_func_printf_flag_leftadjust. AC_DEFUN([gl_PRINTF_FLAG_LEFTADJUST], [ AC_REQUIRE([AC_PROG_CC]) AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles AC_CACHE_CHECK([whether printf supports the left-adjust flag correctly], [gl_cv_func_printf_flag_leftadjust], [ AC_RUN_IFELSE( [AC_LANG_SOURCE([[ #include #include static char buf[100]; int main () { /* Check that a '-' flag is not annihilated by a negative width. */ if (sprintf (buf, "a%-*sc", -3, "b") < 0 || strcmp (buf, "ab c") != 0) return 1; return 0; }]])], [gl_cv_func_printf_flag_leftadjust=yes], [gl_cv_func_printf_flag_leftadjust=no], [ changequote(,)dnl case "$host_os" in # Guess yes on HP-UX 11. hpux11*) gl_cv_func_printf_flag_leftadjust="guessing yes";; # Guess no on HP-UX 10 and older. hpux*) gl_cv_func_printf_flag_leftadjust="guessing no";; # Guess yes on Android. linux*-android*) gl_cv_func_printf_flag_leftadjust="guessing yes";; # Guess yes on native Windows. mingw*) gl_cv_func_printf_flag_leftadjust="guessing yes";; # Guess yes otherwise. *) gl_cv_func_printf_flag_leftadjust="guessing yes";; esac changequote([,])dnl ]) ]) ]) dnl Test whether the *printf family of functions supports padding of non-finite dnl values with the 0 flag correctly. (ISO C99 + TC1 + TC2.) See dnl dnl Result is gl_cv_func_printf_flag_zero. AC_DEFUN([gl_PRINTF_FLAG_ZERO], [ AC_REQUIRE([AC_PROG_CC]) AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles AC_CACHE_CHECK([whether printf supports the zero flag correctly], [gl_cv_func_printf_flag_zero], [ AC_RUN_IFELSE( [AC_LANG_SOURCE([[ #include #include static char buf[100]; static double zero = 0.0; int main () { if (sprintf (buf, "%010f", 1.0 / zero, 33, 44, 55) < 0 || (strcmp (buf, " inf") != 0 && strcmp (buf, " infinity") != 0)) return 1; return 0; }]])], [gl_cv_func_printf_flag_zero=yes], [gl_cv_func_printf_flag_zero=no], [ changequote(,)dnl case "$host_os" in # Guess yes on glibc systems. *-gnu* | gnu*) gl_cv_func_printf_flag_zero="guessing yes";; # Guess yes on musl systems. *-musl*) gl_cv_func_printf_flag_zero="guessing yes";; # Guess yes on BeOS. beos*) gl_cv_func_printf_flag_zero="guessing yes";; # Guess no on Android. linux*-android*) gl_cv_func_printf_flag_zero="guessing no";; # Guess no on native Windows. mingw*) gl_cv_func_printf_flag_zero="guessing no";; # If we don't know, obey --enable-cross-guesses. *) gl_cv_func_printf_flag_zero="$gl_cross_guess_normal";; esac changequote([,])dnl ]) ]) ]) dnl Test whether the *printf family of functions supports large precisions. dnl On mingw, precisions larger than 512 are treated like 512, in integer, dnl floating-point or pointer output. On Solaris 10/x86, precisions larger dnl than 510 in floating-point output crash the program. On Solaris 10/SPARC, dnl precisions larger than 510 in floating-point output yield wrong results. dnl On AIX 7.1, precisions larger than 998 in floating-point output yield dnl wrong results. On BeOS, precisions larger than 1044 crash the program. dnl Result is gl_cv_func_printf_precision. AC_DEFUN([gl_PRINTF_PRECISION], [ AC_REQUIRE([AC_PROG_CC]) AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles AC_CACHE_CHECK([whether printf supports large precisions], [gl_cv_func_printf_precision], [ AC_RUN_IFELSE( [AC_LANG_SOURCE([[ #include #include static char buf[5000]; int main () { int result = 0; #ifdef __BEOS__ /* On BeOS, this would crash and show a dialog box. Avoid the crash. */ return 1; #endif if (sprintf (buf, "%.4000d %d", 1, 33, 44) < 4000 + 3) result |= 1; if (sprintf (buf, "%.4000f %d", 1.0, 33, 44) < 4000 + 5) result |= 2; if (sprintf (buf, "%.511f %d", 1.0, 33, 44) < 511 + 5 || buf[0] != '1') result |= 4; if (sprintf (buf, "%.999f %d", 1.0, 33, 44) < 999 + 5 || buf[0] != '1') result |= 4; return result; }]])], [gl_cv_func_printf_precision=yes], [gl_cv_func_printf_precision=no], [ changequote(,)dnl case "$host_os" in # Guess no only on Solaris, native Windows, and BeOS systems. solaris*) gl_cv_func_printf_precision="guessing no" ;; mingw* | pw*) gl_cv_func_printf_precision="guessing no" ;; beos*) gl_cv_func_printf_precision="guessing no" ;; # Guess yes on Android. linux*-android*) gl_cv_func_printf_precision="guessing yes" ;; *) gl_cv_func_printf_precision="guessing yes" ;; esac changequote([,])dnl ]) ]) ]) dnl Test whether the *printf family of functions recovers gracefully in case dnl of an out-of-memory condition, or whether it crashes the entire program. dnl Result is gl_cv_func_printf_enomem. AC_DEFUN([gl_PRINTF_ENOMEM], [ AC_REQUIRE([AC_PROG_CC]) AC_REQUIRE([gl_MULTIARCH]) AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles AC_CACHE_CHECK([whether printf survives out-of-memory conditions], [gl_cv_func_printf_enomem], [ gl_cv_func_printf_enomem="guessing no" if test "$cross_compiling" = no; then if test $APPLE_UNIVERSAL_BUILD = 0; then AC_LANG_CONFTEST([AC_LANG_SOURCE([ ]GL_NOCRASH[ changequote(,)dnl #include #include #include #include #include int main() { struct rlimit limit; int ret; nocrash_init (); /* Some printf implementations allocate temporary space with malloc. */ /* On BSD systems, malloc() is limited by RLIMIT_DATA. */ #ifdef RLIMIT_DATA if (getrlimit (RLIMIT_DATA, &limit) < 0) return 77; if (limit.rlim_max == RLIM_INFINITY || limit.rlim_max > 5000000) limit.rlim_max = 5000000; limit.rlim_cur = limit.rlim_max; if (setrlimit (RLIMIT_DATA, &limit) < 0) return 77; #endif /* On Linux systems, malloc() is limited by RLIMIT_AS. */ #ifdef RLIMIT_AS if (getrlimit (RLIMIT_AS, &limit) < 0) return 77; if (limit.rlim_max == RLIM_INFINITY || limit.rlim_max > 5000000) limit.rlim_max = 5000000; limit.rlim_cur = limit.rlim_max; if (setrlimit (RLIMIT_AS, &limit) < 0) return 77; #endif /* Some printf implementations allocate temporary space on the stack. */ #ifdef RLIMIT_STACK if (getrlimit (RLIMIT_STACK, &limit) < 0) return 77; if (limit.rlim_max == RLIM_INFINITY || limit.rlim_max > 5000000) limit.rlim_max = 5000000; limit.rlim_cur = limit.rlim_max; if (setrlimit (RLIMIT_STACK, &limit) < 0) return 77; #endif ret = printf ("%.5000000f", 1.0); return !(ret == 5000002 || (ret < 0 && errno == ENOMEM)); } changequote([,])dnl ])]) if AC_TRY_EVAL([ac_link]) && test -s conftest$ac_exeext; then (./conftest 2>&AS_MESSAGE_LOG_FD result=$? _AS_ECHO_LOG([\$? = $result]) if test $result != 0 && test $result != 77; then result=1; fi exit $result ) >/dev/null 2>/dev/null case $? in 0) gl_cv_func_printf_enomem="yes" ;; 77) gl_cv_func_printf_enomem="guessing no" ;; *) gl_cv_func_printf_enomem="no" ;; esac else gl_cv_func_printf_enomem="guessing no" fi rm -fr conftest* else dnl A universal build on Apple Mac OS X platforms. dnl The result would be 'no' in 32-bit mode and 'yes' in 64-bit mode. dnl But we need a configuration result that is valid in both modes. gl_cv_func_printf_enomem="guessing no" fi fi if test "$gl_cv_func_printf_enomem" = "guessing no"; then changequote(,)dnl case "$host_os" in # Guess yes on glibc systems. *-gnu* | gnu*) gl_cv_func_printf_enomem="guessing yes";; # Guess yes on Solaris. solaris*) gl_cv_func_printf_enomem="guessing yes";; # Guess yes on AIX. aix*) gl_cv_func_printf_enomem="guessing yes";; # Guess yes on HP-UX/hppa. hpux*) case "$host_cpu" in hppa*) gl_cv_func_printf_enomem="guessing yes";; *) gl_cv_func_printf_enomem="guessing no";; esac ;; # Guess yes on IRIX. irix*) gl_cv_func_printf_enomem="guessing yes";; # Guess yes on OSF/1. osf*) gl_cv_func_printf_enomem="guessing yes";; # Guess yes on BeOS. beos*) gl_cv_func_printf_enomem="guessing yes";; # Guess yes on Haiku. haiku*) gl_cv_func_printf_enomem="guessing yes";; # Guess no on Android. linux*-android*) gl_cv_func_printf_enomem="guessing no";; # If we don't know, obey --enable-cross-guesses. *) gl_cv_func_printf_enomem="$gl_cross_guess_normal";; esac changequote([,])dnl fi ]) ]) dnl Test whether the snprintf function exists. (ISO C99, POSIX:2001) dnl Result is ac_cv_func_snprintf. AC_DEFUN([gl_SNPRINTF_PRESENCE], [ AC_CHECK_FUNCS_ONCE([snprintf]) ]) dnl Test whether the string produced by the snprintf function is always NUL dnl terminated. (ISO C99, POSIX:2001) dnl Result is gl_cv_func_snprintf_truncation_c99. AC_DEFUN([gl_SNPRINTF_TRUNCATION_C99], [ AC_REQUIRE([AC_PROG_CC]) AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles AC_REQUIRE([gl_SNPRINTF_PRESENCE]) AC_CACHE_CHECK([whether snprintf truncates the result as in C99], [gl_cv_func_snprintf_truncation_c99], [ AC_RUN_IFELSE( [AC_LANG_SOURCE([[ #include #include #if HAVE_SNPRINTF # define my_snprintf snprintf #else # include static int my_snprintf (char *buf, int size, const char *format, ...) { va_list args; int ret; va_start (args, format); ret = vsnprintf (buf, size, format, args); va_end (args); return ret; } #endif static char buf[100]; int main () { strcpy (buf, "ABCDEF"); my_snprintf (buf, 3, "%d %d", 4567, 89); if (memcmp (buf, "45\0DEF", 6) != 0) return 1; return 0; }]])], [gl_cv_func_snprintf_truncation_c99=yes], [gl_cv_func_snprintf_truncation_c99=no], [ changequote(,)dnl case "$host_os" in # Guess yes on glibc systems. *-gnu* | gnu*) gl_cv_func_snprintf_truncation_c99="guessing yes";; # Guess yes on musl systems. *-musl*) gl_cv_func_snprintf_truncation_c99="guessing yes";; # Guess yes on FreeBSD >= 5. freebsd[1-4].*) gl_cv_func_snprintf_truncation_c99="guessing no";; freebsd* | kfreebsd*) gl_cv_func_snprintf_truncation_c99="guessing yes";; # Guess yes on Mac OS X >= 10.3. darwin[1-6].*) gl_cv_func_snprintf_truncation_c99="guessing no";; darwin*) gl_cv_func_snprintf_truncation_c99="guessing yes";; # Guess yes on OpenBSD >= 3.9. openbsd[1-2].* | openbsd3.[0-8] | openbsd3.[0-8].*) gl_cv_func_snprintf_truncation_c99="guessing no";; openbsd*) gl_cv_func_snprintf_truncation_c99="guessing yes";; # Guess yes on Solaris >= 2.6. solaris2.[0-5] | solaris2.[0-5].*) gl_cv_func_snprintf_truncation_c99="guessing no";; solaris*) gl_cv_func_snprintf_truncation_c99="guessing yes";; # Guess yes on AIX >= 4. aix[1-3]*) gl_cv_func_snprintf_truncation_c99="guessing no";; aix*) gl_cv_func_snprintf_truncation_c99="guessing yes";; # Guess yes on HP-UX >= 11. hpux[7-9]* | hpux10*) gl_cv_func_snprintf_truncation_c99="guessing no";; hpux*) gl_cv_func_snprintf_truncation_c99="guessing yes";; # Guess yes on IRIX >= 6.5. irix6.5) gl_cv_func_snprintf_truncation_c99="guessing yes";; # Guess yes on OSF/1 >= 5. osf[3-4]*) gl_cv_func_snprintf_truncation_c99="guessing no";; osf*) gl_cv_func_snprintf_truncation_c99="guessing yes";; # Guess yes on NetBSD >= 3. netbsd[1-2]* | netbsdelf[1-2]* | netbsdaout[1-2]* | netbsdcoff[1-2]*) gl_cv_func_snprintf_truncation_c99="guessing no";; netbsd*) gl_cv_func_snprintf_truncation_c99="guessing yes";; # Guess yes on BeOS. beos*) gl_cv_func_snprintf_truncation_c99="guessing yes";; # Guess yes on Android. linux*-android*) gl_cv_func_snprintf_truncation_c99="guessing yes";; # Guess no on native Windows. mingw*) gl_cv_func_snprintf_truncation_c99="guessing no";; # If we don't know, obey --enable-cross-guesses. *) gl_cv_func_snprintf_truncation_c99="$gl_cross_guess_normal";; esac changequote([,])dnl ]) ]) ]) dnl Test whether the return value of the snprintf function is the number dnl of bytes (excluding the terminating NUL) that would have been produced dnl if the buffer had been large enough. (ISO C99, POSIX:2001) dnl For example, this test program fails on IRIX 6.5: dnl --------------------------------------------------------------------- dnl #include dnl int main() dnl { dnl static char buf[8]; dnl int retval = snprintf (buf, 3, "%d", 12345); dnl return retval >= 0 && retval < 3; dnl } dnl --------------------------------------------------------------------- dnl Result is gl_cv_func_snprintf_retval_c99. AC_DEFUN_ONCE([gl_SNPRINTF_RETVAL_C99], [ AC_REQUIRE([AC_PROG_CC]) AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles AC_REQUIRE([gl_SNPRINTF_PRESENCE]) AC_CACHE_CHECK([whether snprintf returns a byte count as in C99], [gl_cv_func_snprintf_retval_c99], [ AC_RUN_IFELSE( [AC_LANG_SOURCE([[ #include #include #if HAVE_SNPRINTF # define my_snprintf snprintf #else # include static int my_snprintf (char *buf, int size, const char *format, ...) { va_list args; int ret; va_start (args, format); ret = vsnprintf (buf, size, format, args); va_end (args); return ret; } #endif static char buf[100]; int main () { strcpy (buf, "ABCDEF"); if (my_snprintf (buf, 3, "%d %d", 4567, 89) != 7) return 1; if (my_snprintf (buf, 0, "%d %d", 4567, 89) != 7) return 2; if (my_snprintf (NULL, 0, "%d %d", 4567, 89) != 7) return 3; return 0; }]])], [gl_cv_func_snprintf_retval_c99=yes], [gl_cv_func_snprintf_retval_c99=no], [case "$host_os" in changequote(,)dnl # Guess yes on glibc systems. *-gnu* | gnu*) gl_cv_func_snprintf_retval_c99="guessing yes";; # Guess yes on musl systems. *-musl*) gl_cv_func_snprintf_retval_c99="guessing yes";; # Guess yes on FreeBSD >= 5. freebsd[1-4].*) gl_cv_func_snprintf_retval_c99="guessing no";; freebsd* | kfreebsd*) gl_cv_func_snprintf_retval_c99="guessing yes";; # Guess yes on Mac OS X >= 10.3. darwin[1-6].*) gl_cv_func_snprintf_retval_c99="guessing no";; darwin*) gl_cv_func_snprintf_retval_c99="guessing yes";; # Guess yes on OpenBSD >= 3.9. openbsd[1-2].* | openbsd3.[0-8] | openbsd3.[0-8].*) gl_cv_func_snprintf_retval_c99="guessing no";; openbsd*) gl_cv_func_snprintf_retval_c99="guessing yes";; # Guess yes on Solaris >= 2.10. solaris2.[1-9][0-9]*) gl_cv_func_printf_sizes_c99="guessing yes";; solaris*) gl_cv_func_printf_sizes_c99="guessing no";; # Guess yes on AIX >= 4. aix[1-3]*) gl_cv_func_snprintf_retval_c99="guessing no";; aix*) gl_cv_func_snprintf_retval_c99="guessing yes";; # Guess yes on NetBSD >= 3. netbsd[1-2]* | netbsdelf[1-2]* | netbsdaout[1-2]* | netbsdcoff[1-2]*) gl_cv_func_snprintf_retval_c99="guessing no";; netbsd*) gl_cv_func_snprintf_retval_c99="guessing yes";; # Guess yes on BeOS. beos*) gl_cv_func_snprintf_retval_c99="guessing yes";; # Guess yes on Android. linux*-android*) gl_cv_func_snprintf_retval_c99="guessing yes";; changequote([,])dnl # Guess yes on MSVC, no on mingw. mingw*) AC_EGREP_CPP([Known], [ #ifdef _MSC_VER Known #endif ], [gl_cv_func_snprintf_retval_c99="guessing yes"], [gl_cv_func_snprintf_retval_c99="guessing no"]) ;; # If we don't know, obey --enable-cross-guesses. *) gl_cv_func_snprintf_retval_c99="$gl_cross_guess_normal";; esac ]) ]) ]) dnl Test whether the snprintf function supports the %n format directive dnl also in truncated portions of the format string. (ISO C99, POSIX:2001) dnl Result is gl_cv_func_snprintf_directive_n. AC_DEFUN([gl_SNPRINTF_DIRECTIVE_N], [ AC_REQUIRE([AC_PROG_CC]) AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles AC_REQUIRE([gl_SNPRINTF_PRESENCE]) AC_CACHE_CHECK([whether snprintf fully supports the 'n' directive], [gl_cv_func_snprintf_directive_n], [ AC_RUN_IFELSE( [AC_LANG_SOURCE([[ #include #include #if HAVE_SNPRINTF # define my_snprintf snprintf #else # include static int my_snprintf (char *buf, int size, const char *format, ...) { va_list args; int ret; va_start (args, format); ret = vsnprintf (buf, size, format, args); va_end (args); return ret; } #endif static char fmtstring[10]; static char buf[100]; int main () { int count = -1; /* Copy the format string. Some systems (glibc with _FORTIFY_SOURCE=2) support %n in format strings in read-only memory but not in writable memory. */ strcpy (fmtstring, "%d %n"); my_snprintf (buf, 4, fmtstring, 12345, &count, 33, 44, 55); if (count != 6) return 1; return 0; }]])], [gl_cv_func_snprintf_directive_n=yes], [gl_cv_func_snprintf_directive_n=no], [ case "$host_os" in # Guess no on glibc when _FORTIFY_SOURCE >= 2. *-gnu* | gnu*) AC_COMPILE_IFELSE( [AC_LANG_SOURCE( [[#if _FORTIFY_SOURCE >= 2 error fail #endif ]])], [gl_cv_func_snprintf_directive_n="guessing yes"], [gl_cv_func_snprintf_directive_n="guessing no"]) ;; changequote(,)dnl # Guess yes on musl systems. *-musl*) gl_cv_func_snprintf_directive_n="guessing yes";; # Guess yes on FreeBSD >= 5. freebsd[1-4].*) gl_cv_func_snprintf_directive_n="guessing no";; freebsd* | kfreebsd*) gl_cv_func_snprintf_directive_n="guessing yes";; # Guess yes on Mac OS X >= 10.3. darwin[1-6].*) gl_cv_func_snprintf_directive_n="guessing no";; darwin*) gl_cv_func_snprintf_directive_n="guessing yes";; # Guess yes on Solaris >= 2.6. solaris2.[0-5] | solaris2.[0-5].*) gl_cv_func_snprintf_directive_n="guessing no";; solaris*) gl_cv_func_snprintf_directive_n="guessing yes";; # Guess yes on AIX >= 4. aix[1-3]*) gl_cv_func_snprintf_directive_n="guessing no";; aix*) gl_cv_func_snprintf_directive_n="guessing yes";; # Guess yes on IRIX >= 6.5. irix6.5) gl_cv_func_snprintf_directive_n="guessing yes";; # Guess yes on OSF/1 >= 5. osf[3-4]*) gl_cv_func_snprintf_directive_n="guessing no";; osf*) gl_cv_func_snprintf_directive_n="guessing yes";; # Guess yes on NetBSD >= 3. netbsd[1-2]* | netbsdelf[1-2]* | netbsdaout[1-2]* | netbsdcoff[1-2]*) gl_cv_func_snprintf_directive_n="guessing no";; netbsd*) gl_cv_func_snprintf_directive_n="guessing yes";; # Guess yes on BeOS. beos*) gl_cv_func_snprintf_directive_n="guessing yes";; # Guess no on Android. linux*-android*) gl_cv_func_snprintf_directive_n="guessing no";; # Guess no on native Windows. mingw*) gl_cv_func_snprintf_directive_n="guessing no";; # If we don't know, obey --enable-cross-guesses. *) gl_cv_func_snprintf_directive_n="$gl_cross_guess_normal";; changequote([,])dnl esac ]) ]) ]) dnl Test whether the snprintf function, when passed a size = 1, writes any dnl output without bounds in this case, behaving like sprintf. This is the dnl case on Linux libc5. dnl Result is gl_cv_func_snprintf_size1. AC_DEFUN([gl_SNPRINTF_SIZE1], [ AC_REQUIRE([AC_PROG_CC]) AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles AC_REQUIRE([gl_SNPRINTF_PRESENCE]) AC_CACHE_CHECK([whether snprintf respects a size of 1], [gl_cv_func_snprintf_size1], [ AC_RUN_IFELSE( [AC_LANG_SOURCE([[ #include #if HAVE_SNPRINTF # define my_snprintf snprintf #else # include static int my_snprintf (char *buf, int size, const char *format, ...) { va_list args; int ret; va_start (args, format); ret = vsnprintf (buf, size, format, args); va_end (args); return ret; } #endif int main() { static char buf[8] = { 'D', 'E', 'A', 'D', 'B', 'E', 'E', 'F' }; my_snprintf (buf, 1, "%d", 12345); return buf[1] != 'E'; }]])], [gl_cv_func_snprintf_size1=yes], [gl_cv_func_snprintf_size1=no], [case "$host_os" in # Guess yes on Android. linux*-android*) gl_cv_func_snprintf_size1="guessing yes" ;; # Guess yes on native Windows. mingw*) gl_cv_func_snprintf_size1="guessing yes" ;; *) gl_cv_func_snprintf_size1="guessing yes" ;; esac ]) ]) ]) dnl Test whether the vsnprintf function, when passed a zero size, produces no dnl output. (ISO C99, POSIX:2001) dnl For example, snprintf nevertheless writes a NUL byte in this case dnl on OSF/1 5.1: dnl --------------------------------------------------------------------- dnl #include dnl int main() dnl { dnl static char buf[8] = { 'D', 'E', 'A', 'D', 'B', 'E', 'E', 'F' }; dnl snprintf (buf, 0, "%d", 12345); dnl return buf[0] != 'D'; dnl } dnl --------------------------------------------------------------------- dnl And vsnprintf writes any output without bounds in this case, behaving like dnl vsprintf, on HP-UX 11 and OSF/1 5.1: dnl --------------------------------------------------------------------- dnl #include dnl #include dnl static int my_snprintf (char *buf, int size, const char *format, ...) dnl { dnl va_list args; dnl int ret; dnl va_start (args, format); dnl ret = vsnprintf (buf, size, format, args); dnl va_end (args); dnl return ret; dnl } dnl int main() dnl { dnl static char buf[8] = { 'D', 'E', 'A', 'D', 'B', 'E', 'E', 'F' }; dnl my_snprintf (buf, 0, "%d", 12345); dnl return buf[0] != 'D'; dnl } dnl --------------------------------------------------------------------- dnl Result is gl_cv_func_vsnprintf_zerosize_c99. AC_DEFUN([gl_VSNPRINTF_ZEROSIZE_C99], [ AC_REQUIRE([AC_PROG_CC]) AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles AC_CACHE_CHECK([whether vsnprintf respects a zero size as in C99], [gl_cv_func_vsnprintf_zerosize_c99], [ AC_RUN_IFELSE( [AC_LANG_SOURCE([[ #include #include static int my_snprintf (char *buf, int size, const char *format, ...) { va_list args; int ret; va_start (args, format); ret = vsnprintf (buf, size, format, args); va_end (args); return ret; } int main() { static char buf[8] = { 'D', 'E', 'A', 'D', 'B', 'E', 'E', 'F' }; my_snprintf (buf, 0, "%d", 12345); return buf[0] != 'D'; }]])], [gl_cv_func_vsnprintf_zerosize_c99=yes], [gl_cv_func_vsnprintf_zerosize_c99=no], [ changequote(,)dnl case "$host_os" in # Guess yes on glibc systems. *-gnu* | gnu*) gl_cv_func_vsnprintf_zerosize_c99="guessing yes";; # Guess yes on musl systems. *-musl*) gl_cv_func_vsnprintf_zerosize_c99="guessing yes";; # Guess yes on FreeBSD >= 5. freebsd[1-4].*) gl_cv_func_vsnprintf_zerosize_c99="guessing no";; freebsd* | kfreebsd*) gl_cv_func_vsnprintf_zerosize_c99="guessing yes";; # Guess yes on Mac OS X >= 10.3. darwin[1-6].*) gl_cv_func_vsnprintf_zerosize_c99="guessing no";; darwin*) gl_cv_func_vsnprintf_zerosize_c99="guessing yes";; # Guess yes on Cygwin. cygwin*) gl_cv_func_vsnprintf_zerosize_c99="guessing yes";; # Guess yes on Solaris >= 2.6. solaris2.[0-5] | solaris2.[0-5].*) gl_cv_func_vsnprintf_zerosize_c99="guessing no";; solaris*) gl_cv_func_vsnprintf_zerosize_c99="guessing yes";; # Guess yes on AIX >= 4. aix[1-3]*) gl_cv_func_vsnprintf_zerosize_c99="guessing no";; aix*) gl_cv_func_vsnprintf_zerosize_c99="guessing yes";; # Guess yes on IRIX >= 6.5. irix6.5) gl_cv_func_vsnprintf_zerosize_c99="guessing yes";; # Guess yes on NetBSD >= 3. netbsd[1-2]* | netbsdelf[1-2]* | netbsdaout[1-2]* | netbsdcoff[1-2]*) gl_cv_func_vsnprintf_zerosize_c99="guessing no";; netbsd*) gl_cv_func_vsnprintf_zerosize_c99="guessing yes";; # Guess yes on BeOS. beos*) gl_cv_func_vsnprintf_zerosize_c99="guessing yes";; # Guess yes on Android. linux*-android*) gl_cv_func_vsnprintf_zerosize_c99="guessing yes";; # Guess yes on native Windows. mingw* | pw*) gl_cv_func_vsnprintf_zerosize_c99="guessing yes";; # If we don't know, obey --enable-cross-guesses. *) gl_cv_func_vsnprintf_zerosize_c99="$gl_cross_guess_normal";; esac changequote([,])dnl ]) ]) ]) dnl The results of these tests on various platforms are: dnl dnl 1 = gl_PRINTF_SIZES_C99 dnl 2 = gl_PRINTF_LONG_DOUBLE dnl 3 = gl_PRINTF_INFINITE dnl 4 = gl_PRINTF_INFINITE_LONG_DOUBLE dnl 5 = gl_PRINTF_DIRECTIVE_A dnl 6 = gl_PRINTF_DIRECTIVE_F dnl 7 = gl_PRINTF_DIRECTIVE_N dnl 8 = gl_PRINTF_DIRECTIVE_LS dnl 9 = gl_PRINTF_POSITIONS dnl 10 = gl_PRINTF_FLAG_GROUPING dnl 11 = gl_PRINTF_FLAG_LEFTADJUST dnl 12 = gl_PRINTF_FLAG_ZERO dnl 13 = gl_PRINTF_PRECISION dnl 14 = gl_PRINTF_ENOMEM dnl 15 = gl_SNPRINTF_PRESENCE dnl 16 = gl_SNPRINTF_TRUNCATION_C99 dnl 17 = gl_SNPRINTF_RETVAL_C99 dnl 18 = gl_SNPRINTF_DIRECTIVE_N dnl 19 = gl_SNPRINTF_SIZE1 dnl 20 = gl_VSNPRINTF_ZEROSIZE_C99 dnl dnl 1 = checking whether printf supports size specifiers as in C99... dnl 2 = checking whether printf supports 'long double' arguments... dnl 3 = checking whether printf supports infinite 'double' arguments... dnl 4 = checking whether printf supports infinite 'long double' arguments... dnl 5 = checking whether printf supports the 'a' and 'A' directives... dnl 6 = checking whether printf supports the 'F' directive... dnl 7 = checking whether printf supports the 'n' directive... dnl 8 = checking whether printf supports the 'ls' directive... dnl 9 = checking whether printf supports POSIX/XSI format strings with positions... dnl 10 = checking whether printf supports the grouping flag... dnl 11 = checking whether printf supports the left-adjust flag correctly... dnl 12 = checking whether printf supports the zero flag correctly... dnl 13 = checking whether printf supports large precisions... dnl 14 = checking whether printf survives out-of-memory conditions... dnl 15 = checking for snprintf... dnl 16 = checking whether snprintf truncates the result as in C99... dnl 17 = checking whether snprintf returns a byte count as in C99... dnl 18 = checking whether snprintf fully supports the 'n' directive... dnl 19 = checking whether snprintf respects a size of 1... dnl 20 = checking whether vsnprintf respects a zero size as in C99... dnl dnl . = yes, # = no. dnl dnl 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 dnl glibc 2.5 . . . . . . . . . . . . . . . . . . . . dnl glibc 2.3.6 . . . . # . . . . . . . . . . . . . . . dnl FreeBSD 5.4, 6.1 . . . . # . . . . . . # . # . . . . . . dnl Mac OS X 10.13.5 . . . # # . # . . . . . . . . . . # . . dnl Mac OS X 10.5.8 . . . # # . . . . . . # . . . . . . . . dnl Mac OS X 10.3.9 . . . . # . . . . . . # . # . . . . . . dnl OpenBSD 3.9, 4.0 . . # # # # . # . # . # . # . . . . . . dnl Cygwin 1.7.0 (2009) . . . # . . . ? . . . . . ? . . . . . . dnl Cygwin 1.5.25 (2008) . . . # # . . # . . . . . # . . . . . . dnl Cygwin 1.5.19 (2006) # . . # # # . # . # . # # # . . . . . . dnl Solaris 11.4 . . # # # . . # . . . # . . . . . . . . dnl Solaris 11.3 . . . . # . . # . . . . . . . . . . . . dnl Solaris 11.0 . . # # # . . # . . . # . . . . . . . . dnl Solaris 10 . . # # # . . # . . . # # . . . . . . . dnl Solaris 2.6 ... 9 # . # # # # . # . . . # # . . . # . . . dnl Solaris 2.5.1 # . # # # # . # . . . # . . # # # # # # dnl AIX 7.1 . . # # # . . . . . . # # . . . . . . . dnl AIX 5.2 . . # # # . . . . . . # . . . . . . . . dnl AIX 4.3.2, 5.1 # . # # # # . . . . . # . . . . # . . . dnl HP-UX 11.31 . . . . # . . . . . . # . . . . # # . . dnl HP-UX 11.{00,11,23} # . . . # # . . . . . # . . . . # # . # dnl HP-UX 10.20 # . # . # # . ? . . # # . . . . # # ? # dnl IRIX 6.5 # . # # # # . # . . . # . . . . # . . . dnl OSF/1 5.1 # . # # # # . . . . . # . . . . # . . # dnl OSF/1 4.0d # . # # # # . . . . . # . . # # # # # # dnl NetBSD 9.0 . . . . # . . . . . . . . . . . . . . . dnl NetBSD 5.0 . . . # # . . . . . . # . # . . . . . . dnl NetBSD 4.0 . ? ? ? ? ? . ? . ? ? ? ? ? . . . ? ? ? dnl NetBSD 3.0 . . . . # # . ? # # ? # . # . . . . . . dnl Haiku . . . # # # . # . . . . . ? . . ? . . . dnl BeOS # # . # # # . ? # . ? . # ? . . ? . . . dnl Android 4.3 . . # # # # # # . # . # . # . . . # . . dnl old mingw / msvcrt # # # # # # . . # # . # # ? . # # # . . dnl MSVC 9 # # # # # # # . # # . # # ? # # # # . . dnl mingw 2009-2011 . # . # . . . . # # . . . ? . . . . . . dnl mingw-w64 2011 # # # # # # . . # # . # # ? . # # # . . pspp-1.4.1/gl/m4/clock_time.m40000644000175000017500000000252013723556150015416 0ustar00blpblp00000000000000# clock_time.m4 serial 10 dnl Copyright (C) 2002-2006, 2009-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. # Check for clock_gettime and clock_settime, and set LIB_CLOCK_GETTIME. # For a program named, say foo, you should add a line like the following # in the corresponding Makefile.am file: # foo_LDADD = $(LDADD) $(LIB_CLOCK_GETTIME) AC_DEFUN([gl_CLOCK_TIME], [ dnl Persuade glibc and Solaris to declare these functions. AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS]) # Solaris 2.5.1 needs -lposix4 to get the clock_gettime function. # Solaris 7 prefers the library name -lrt to the obsolescent name -lposix4. # Save and restore LIBS so e.g., -lrt, isn't added to it. Otherwise, *all* # programs in the package would end up linked with that potentially-shared # library, inducing unnecessary run-time overhead. LIB_CLOCK_GETTIME= AC_SUBST([LIB_CLOCK_GETTIME]) gl_saved_libs=$LIBS AC_SEARCH_LIBS([clock_gettime], [rt posix4], [test "$ac_cv_search_clock_gettime" = "none required" || LIB_CLOCK_GETTIME=$ac_cv_search_clock_gettime]) AC_CHECK_FUNCS([clock_gettime clock_settime]) LIBS=$gl_saved_libs ]) pspp-1.4.1/gl/m4/readlink.m40000644000175000017500000000516613723215637015111 0ustar00blpblp00000000000000# readlink.m4 serial 15 dnl Copyright (C) 2003, 2007, 2009-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_FUNC_READLINK], [ AC_REQUIRE([gl_UNISTD_H_DEFAULTS]) AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles AC_CHECK_FUNCS_ONCE([readlink]) if test $ac_cv_func_readlink = no; then HAVE_READLINK=0 else AC_CACHE_CHECK([whether readlink signature is correct], [gl_cv_decl_readlink_works], [AC_COMPILE_IFELSE( [AC_LANG_PROGRAM( [[#include /* Cause compilation failure if original declaration has wrong type. */ ssize_t readlink (const char *, char *, size_t);]])], [gl_cv_decl_readlink_works=yes], [gl_cv_decl_readlink_works=no])]) dnl Solaris 9 ignores trailing slash. dnl FreeBSD 7.2 dereferences only one level of links with trailing slash. AC_CACHE_CHECK([whether readlink handles trailing slash correctly], [gl_cv_func_readlink_works], [# We have readlink, so assume ln -s works. ln -s conftest.no-such conftest.link ln -s conftest.link conftest.lnk2 AC_RUN_IFELSE( [AC_LANG_PROGRAM( [[#include ]], [[char buf[20]; return readlink ("conftest.lnk2/", buf, sizeof buf) != -1;]])], [gl_cv_func_readlink_works=yes], [gl_cv_func_readlink_works=no], [case "$host_os" in # Guess yes on Linux systems. linux-* | linux) gl_cv_func_readlink_works="guessing yes" ;; # Guess yes on glibc systems. *-gnu* | gnu*) gl_cv_func_readlink_works="guessing yes" ;; # If we don't know, obey --enable-cross-guesses. *) gl_cv_func_readlink_works="$gl_cross_guess_normal" ;; esac ]) rm -f conftest.link conftest.lnk2]) case "$gl_cv_func_readlink_works" in *yes) if test "$gl_cv_decl_readlink_works" != yes; then REPLACE_READLINK=1 fi ;; *) AC_DEFINE([READLINK_TRAILING_SLASH_BUG], [1], [Define to 1 if readlink fails to recognize a trailing slash.]) REPLACE_READLINK=1 ;; esac fi ]) # Like gl_FUNC_READLINK, except prepare for separate compilation # (no REPLACE_READLINK, no AC_LIBOBJ). AC_DEFUN([gl_FUNC_READLINK_SEPARATE], [ AC_CHECK_FUNCS_ONCE([readlink]) gl_PREREQ_READLINK ]) # Prerequisites of lib/readlink.c. AC_DEFUN([gl_PREREQ_READLINK], [ : ]) pspp-1.4.1/gl/m4/multiarch.m40000644000175000017500000000422013723215637015276 0ustar00blpblp00000000000000# multiarch.m4 serial 9 dnl Copyright (C) 2008-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. # Determine whether the compiler is or may be producing universal binaries. # # On Mac OS X 10.5 and later systems, the user can create libraries and # executables that work on multiple system types--known as "fat" or # "universal" binaries--by specifying multiple '-arch' options to the # compiler but only a single '-arch' option to the preprocessor. Like # this: # # ./configure CC="gcc -arch i386 -arch x86_64 -arch ppc -arch ppc64" \ # CXX="g++ -arch i386 -arch x86_64 -arch ppc -arch ppc64" \ # CPP="gcc -E" CXXCPP="g++ -E" # # Detect this situation and set APPLE_UNIVERSAL_BUILD accordingly. AC_DEFUN_ONCE([gl_MULTIARCH], [ dnl Code similar to autoconf-2.63 AC_C_BIGENDIAN. AC_CACHE_CHECK([whether the compiler produces multi-arch binaries], [gl_cv_c_multiarch], [gl_cv_c_multiarch=no AC_COMPILE_IFELSE( [AC_LANG_SOURCE( [[#ifndef __APPLE_CC__ not a universal capable compiler #endif typedef int dummy; ]])], [ dnl Check for potential -arch flags. It is not universal unless dnl there are at least two -arch flags with different values. arch= prev= for word in ${CC} ${CFLAGS} ${CPPFLAGS} ${LDFLAGS}; do if test -n "$prev"; then case $word in i?86 | x86_64 | ppc | ppc64 | arm | arm64) if test -z "$arch" || test "$arch" = "$word"; then arch="$word" else gl_cv_c_multiarch=yes fi ;; esac prev= else if test "x$word" = "x-arch"; then prev=arch fi fi done ]) ]) if test $gl_cv_c_multiarch = yes; then APPLE_UNIVERSAL_BUILD=1 else APPLE_UNIVERSAL_BUILD=0 fi AC_SUBST([APPLE_UNIVERSAL_BUILD]) ]) pspp-1.4.1/gl/m4/setenv.m40000644000175000017500000001131113723215637014611 0ustar00blpblp00000000000000# setenv.m4 serial 29 dnl Copyright (C) 2001-2004, 2006-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_FUNC_SETENV], [ AC_REQUIRE([gl_FUNC_SETENV_SEPARATE]) AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles if test $ac_cv_func_setenv = no; then HAVE_SETENV=0 else AC_CACHE_CHECK([whether setenv validates arguments], [gl_cv_func_setenv_works], [AC_RUN_IFELSE([AC_LANG_PROGRAM([[ #include #include #include ]], [[ int result = 0; { if (setenv ("", "", 0) != -1) result |= 1; else if (errno != EINVAL) result |= 2; } { if (setenv ("a", "=", 1) != 0) result |= 4; else if (strcmp (getenv ("a"), "=") != 0) result |= 8; } return result; ]])], [gl_cv_func_setenv_works=yes], [gl_cv_func_setenv_works=no], [case "$host_os" in # Guess yes on glibc systems. *-gnu* | gnu*) gl_cv_func_setenv_works="guessing yes" ;; # Guess yes on musl systems. *-musl*) gl_cv_func_setenv_works="guessing yes" ;; # If we don't know, obey --enable-cross-guesses. *) gl_cv_func_setenv_works="$gl_cross_guess_normal" ;; esac ])]) case "$gl_cv_func_setenv_works" in *yes) ;; *) REPLACE_SETENV=1 ;; esac fi ]) # Like gl_FUNC_SETENV, except prepare for separate compilation # (no REPLACE_SETENV, no AC_LIBOBJ). AC_DEFUN([gl_FUNC_SETENV_SEPARATE], [ AC_REQUIRE([gl_STDLIB_H_DEFAULTS]) AC_CHECK_DECLS_ONCE([setenv]) if test $ac_cv_have_decl_setenv = no; then HAVE_DECL_SETENV=0 fi AC_CHECK_FUNCS_ONCE([setenv]) gl_PREREQ_SETENV ]) AC_DEFUN([gl_FUNC_UNSETENV], [ AC_REQUIRE([gl_STDLIB_H_DEFAULTS]) AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles AC_CHECK_DECLS_ONCE([unsetenv]) if test $ac_cv_have_decl_unsetenv = no; then HAVE_DECL_UNSETENV=0 fi AC_CHECK_FUNCS([unsetenv]) if test $ac_cv_func_unsetenv = no; then HAVE_UNSETENV=0 else HAVE_UNSETENV=1 dnl Some BSDs return void, failing to do error checking. AC_CACHE_CHECK([for unsetenv() return type], [gt_cv_func_unsetenv_ret], [AC_COMPILE_IFELSE( [AC_LANG_PROGRAM( [[ #undef _BSD #define _BSD 1 /* unhide unsetenv declaration in OSF/1 5.1 */ #include extern #ifdef __cplusplus "C" #endif int unsetenv (const char *name); ]], [[]])], [gt_cv_func_unsetenv_ret='int'], [gt_cv_func_unsetenv_ret='void'])]) if test $gt_cv_func_unsetenv_ret = 'void'; then AC_DEFINE([VOID_UNSETENV], [1], [Define to 1 if unsetenv returns void instead of int.]) REPLACE_UNSETENV=1 fi dnl Solaris 10 unsetenv does not remove all copies of a name. dnl Haiku alpha 2 unsetenv gets confused by assignment to environ. dnl OpenBSD 4.7 unsetenv("") does not fail. AC_CACHE_CHECK([whether unsetenv obeys POSIX], [gl_cv_func_unsetenv_works], [AC_RUN_IFELSE([AC_LANG_PROGRAM([[ #include #include extern char **environ; ]], [[ char entry1[] = "a=1"; char entry2[] = "b=2"; char *env[] = { entry1, entry2, NULL }; if (putenv ((char *) "a=1")) return 1; if (putenv (entry2)) return 2; entry2[0] = 'a'; unsetenv ("a"); if (getenv ("a")) return 3; if (!unsetenv ("") || errno != EINVAL) return 4; entry2[0] = 'b'; environ = env; if (!getenv ("a")) return 5; entry2[0] = 'a'; unsetenv ("a"); if (getenv ("a")) return 6; ]])], [gl_cv_func_unsetenv_works=yes], [gl_cv_func_unsetenv_works=no], [case "$host_os" in # Guess yes on glibc systems. *-gnu*) gl_cv_func_unsetenv_works="guessing yes" ;; # If we don't know, obey --enable-cross-guesses. *) gl_cv_func_unsetenv_works="$gl_cross_guess_normal" ;; esac ])]) case "$gl_cv_func_unsetenv_works" in *yes) ;; *) REPLACE_UNSETENV=1 ;; esac fi ]) # Prerequisites of lib/setenv.c. AC_DEFUN([gl_PREREQ_SETENV], [ AC_REQUIRE([AC_FUNC_ALLOCA]) AC_REQUIRE([gl_ENVIRON]) AC_CHECK_HEADERS_ONCE([unistd.h]) AC_CHECK_HEADERS([search.h]) AC_CHECK_FUNCS([tsearch]) ]) # Prerequisites of lib/unsetenv.c. AC_DEFUN([gl_PREREQ_UNSETENV], [ AC_REQUIRE([gl_ENVIRON]) AC_CHECK_HEADERS_ONCE([unistd.h]) ]) pspp-1.4.1/gl/m4/flexmember.m40000644000175000017500000000325413723215637015442 0ustar00blpblp00000000000000# serial 5 # Check for flexible array member support. # Copyright (C) 2006, 2009-2020 Free Software Foundation, Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # Written by Paul Eggert. AC_DEFUN([AC_C_FLEXIBLE_ARRAY_MEMBER], [ AC_CACHE_CHECK([for flexible array member], ac_cv_c_flexmember, [AC_COMPILE_IFELSE( [AC_LANG_PROGRAM( [[#include #include #include struct m { struct m *next, **list; char name[]; }; struct s { struct s *p; struct m *m; int n; double d[]; };]], [[int m = getchar (); size_t nbytes = offsetof (struct s, d) + m * sizeof (double); nbytes += sizeof (struct s) - 1; nbytes -= nbytes % sizeof (struct s); struct s *p = malloc (nbytes); p->p = p; p->m = NULL; p->d[0] = 0.0; return p->d != (double *) NULL;]])], [ac_cv_c_flexmember=yes], [ac_cv_c_flexmember=no])]) if test $ac_cv_c_flexmember = yes; then AC_DEFINE([FLEXIBLE_ARRAY_MEMBER], [], [Define to nothing if C supports flexible array members, and to 1 if it does not. That way, with a declaration like 'struct s { int n; short d@<:@FLEXIBLE_ARRAY_MEMBER@:>@; };', the struct hack can be used with pre-C99 compilers. Use 'FLEXSIZEOF (struct s, d, N * sizeof (short))' to calculate the size in bytes of such a struct containing an N-element array.]) else AC_DEFINE([FLEXIBLE_ARRAY_MEMBER], [1]) fi ]) pspp-1.4.1/gl/m4/wchar_h.m40000644000175000017500000002422313723215637014726 0ustar00blpblp00000000000000dnl A placeholder for ISO C99 , for platforms that have issues. dnl Copyright (C) 2007-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl Written by Eric Blake. # wchar_h.m4 serial 46 AC_DEFUN([gl_WCHAR_H], [ AC_REQUIRE([gl_WCHAR_H_DEFAULTS]) AC_REQUIRE([gl_WCHAR_H_INLINE_OK]) dnl Prepare for creating substitute . dnl Check for (missing in Linux uClibc when built without wide dnl character support). dnl is always overridden, because of GNULIB_POSIXCHECK. gl_CHECK_NEXT_HEADERS([wchar.h]) if test $ac_cv_header_wchar_h = yes; then HAVE_WCHAR_H=1 else HAVE_WCHAR_H=0 fi AC_SUBST([HAVE_WCHAR_H]) AC_REQUIRE([gl_FEATURES_H]) AC_REQUIRE([gt_TYPE_WINT_T]) if test $gt_cv_c_wint_t = yes; then HAVE_WINT_T=1 else HAVE_WINT_T=0 fi AC_SUBST([HAVE_WINT_T]) AC_REQUIRE([gl_TYPE_WINT_T_PREREQ]) dnl Check for declarations of anything we want to poison if the dnl corresponding gnulib module is not in use. gl_WARN_ON_USE_PREPARE([[ /* Tru64 with Desktop Toolkit C has a bug: must be included before . BSD/OS 4.0.1 has a bug: , and must be included before . */ #if !(defined __GLIBC__ && !defined __UCLIBC__) # include # include # include #endif #include ]], [btowc wctob mbsinit mbrtowc mbrlen mbsrtowcs mbsnrtowcs wcrtomb wcsrtombs wcsnrtombs wcwidth wmemchr wmemcmp wmemcpy wmemmove wmempcpy wmemset wcslen wcsnlen wcscpy wcpcpy wcsncpy wcpncpy wcscat wcsncat wcscmp wcsncmp wcscasecmp wcsncasecmp wcscoll wcsxfrm wcsdup wcschr wcsrchr wcscspn wcsspn wcspbrk wcsstr wcstok wcswidth wcsftime ]) AC_REQUIRE([AC_C_RESTRICT]) ]) dnl Check whether is usable at all. AC_DEFUN([gl_WCHAR_H_INLINE_OK], [ dnl Test whether suffers due to the transition from '__inline' to dnl 'gnu_inline'. See dnl and . In summary, dnl glibc version 2.5 or older, together with gcc version 4.3 or newer and dnl the option -std=c99 or -std=gnu99, leads to a broken . AC_CACHE_CHECK([whether uses 'inline' correctly], [gl_cv_header_wchar_h_correct_inline], [gl_cv_header_wchar_h_correct_inline=yes AC_LANG_CONFTEST([ AC_LANG_SOURCE([[#define wcstod renamed_wcstod /* Tru64 with Desktop Toolkit C has a bug: must be included before . BSD/OS 4.0.1 has a bug: , and must be included before . */ #include #include #include #include extern int zero (void); int main () { return zero(); } ]])]) dnl Do not rename the object file from conftest.$ac_objext to dnl conftest1.$ac_objext, as this will cause the link to fail on dnl z/OS when using the XPLINK object format (due to duplicate dnl CSECT names). Instead, temporarily redefine $ac_compile so dnl that the object file has the latter name from the start. save_ac_compile="$ac_compile" ac_compile=`echo "$save_ac_compile" | sed s/conftest/conftest1/` if echo '#include "conftest.c"' >conftest1.c && AC_TRY_EVAL([ac_compile]); then AC_LANG_CONFTEST([ AC_LANG_SOURCE([[#define wcstod renamed_wcstod /* Tru64 with Desktop Toolkit C has a bug: must be included before . BSD/OS 4.0.1 has a bug: , and must be included before . */ #include #include #include #include int zero (void) { return 0; } ]])]) dnl See note above about renaming object files. ac_compile=`echo "$save_ac_compile" | sed s/conftest/conftest2/` if echo '#include "conftest.c"' >conftest2.c && AC_TRY_EVAL([ac_compile]); then if $CC -o conftest$ac_exeext $CFLAGS $LDFLAGS conftest1.$ac_objext conftest2.$ac_objext $LIBS >&AS_MESSAGE_LOG_FD 2>&1; then : else gl_cv_header_wchar_h_correct_inline=no fi fi fi ac_compile="$save_ac_compile" rm -f conftest[12].c conftest[12].$ac_objext conftest$ac_exeext ]) if test $gl_cv_header_wchar_h_correct_inline = no; then AC_MSG_ERROR([ cannot be used with this compiler ($CC $CFLAGS $CPPFLAGS). This is a known interoperability problem of glibc <= 2.5 with gcc >= 4.3 in C99 mode. You have four options: - Add the flag -fgnu89-inline to CC and reconfigure, or - Fix your include files, using parts of , or - Use a gcc version older than 4.3, or - Don't use the flags -std=c99 or -std=gnu99. Configuration aborted.]) fi ]) AC_DEFUN([gl_WCHAR_MODULE_INDICATOR], [ dnl Use AC_REQUIRE here, so that the default settings are expanded once only. AC_REQUIRE([gl_WCHAR_H_DEFAULTS]) gl_MODULE_INDICATOR_SET_VARIABLE([$1]) dnl Define it also as a C macro, for the benefit of the unit tests. gl_MODULE_INDICATOR_FOR_TESTS([$1]) ]) AC_DEFUN([gl_WCHAR_H_DEFAULTS], [ GNULIB_BTOWC=0; AC_SUBST([GNULIB_BTOWC]) GNULIB_WCTOB=0; AC_SUBST([GNULIB_WCTOB]) GNULIB_MBSINIT=0; AC_SUBST([GNULIB_MBSINIT]) GNULIB_MBRTOWC=0; AC_SUBST([GNULIB_MBRTOWC]) GNULIB_MBRLEN=0; AC_SUBST([GNULIB_MBRLEN]) GNULIB_MBSRTOWCS=0; AC_SUBST([GNULIB_MBSRTOWCS]) GNULIB_MBSNRTOWCS=0; AC_SUBST([GNULIB_MBSNRTOWCS]) GNULIB_WCRTOMB=0; AC_SUBST([GNULIB_WCRTOMB]) GNULIB_WCSRTOMBS=0; AC_SUBST([GNULIB_WCSRTOMBS]) GNULIB_WCSNRTOMBS=0; AC_SUBST([GNULIB_WCSNRTOMBS]) GNULIB_WCWIDTH=0; AC_SUBST([GNULIB_WCWIDTH]) GNULIB_WMEMCHR=0; AC_SUBST([GNULIB_WMEMCHR]) GNULIB_WMEMCMP=0; AC_SUBST([GNULIB_WMEMCMP]) GNULIB_WMEMCPY=0; AC_SUBST([GNULIB_WMEMCPY]) GNULIB_WMEMMOVE=0; AC_SUBST([GNULIB_WMEMMOVE]) GNULIB_WMEMPCPY=0; AC_SUBST([GNULIB_WMEMPCPY]) GNULIB_WMEMSET=0; AC_SUBST([GNULIB_WMEMSET]) GNULIB_WCSLEN=0; AC_SUBST([GNULIB_WCSLEN]) GNULIB_WCSNLEN=0; AC_SUBST([GNULIB_WCSNLEN]) GNULIB_WCSCPY=0; AC_SUBST([GNULIB_WCSCPY]) GNULIB_WCPCPY=0; AC_SUBST([GNULIB_WCPCPY]) GNULIB_WCSNCPY=0; AC_SUBST([GNULIB_WCSNCPY]) GNULIB_WCPNCPY=0; AC_SUBST([GNULIB_WCPNCPY]) GNULIB_WCSCAT=0; AC_SUBST([GNULIB_WCSCAT]) GNULIB_WCSNCAT=0; AC_SUBST([GNULIB_WCSNCAT]) GNULIB_WCSCMP=0; AC_SUBST([GNULIB_WCSCMP]) GNULIB_WCSNCMP=0; AC_SUBST([GNULIB_WCSNCMP]) GNULIB_WCSCASECMP=0; AC_SUBST([GNULIB_WCSCASECMP]) GNULIB_WCSNCASECMP=0; AC_SUBST([GNULIB_WCSNCASECMP]) GNULIB_WCSCOLL=0; AC_SUBST([GNULIB_WCSCOLL]) GNULIB_WCSXFRM=0; AC_SUBST([GNULIB_WCSXFRM]) GNULIB_WCSDUP=0; AC_SUBST([GNULIB_WCSDUP]) GNULIB_WCSCHR=0; AC_SUBST([GNULIB_WCSCHR]) GNULIB_WCSRCHR=0; AC_SUBST([GNULIB_WCSRCHR]) GNULIB_WCSCSPN=0; AC_SUBST([GNULIB_WCSCSPN]) GNULIB_WCSSPN=0; AC_SUBST([GNULIB_WCSSPN]) GNULIB_WCSPBRK=0; AC_SUBST([GNULIB_WCSPBRK]) GNULIB_WCSSTR=0; AC_SUBST([GNULIB_WCSSTR]) GNULIB_WCSTOK=0; AC_SUBST([GNULIB_WCSTOK]) GNULIB_WCSWIDTH=0; AC_SUBST([GNULIB_WCSWIDTH]) GNULIB_WCSFTIME=0; AC_SUBST([GNULIB_WCSFTIME]) dnl Assume proper GNU behavior unless another module says otherwise. HAVE_BTOWC=1; AC_SUBST([HAVE_BTOWC]) HAVE_MBSINIT=1; AC_SUBST([HAVE_MBSINIT]) HAVE_MBRTOWC=1; AC_SUBST([HAVE_MBRTOWC]) HAVE_MBRLEN=1; AC_SUBST([HAVE_MBRLEN]) HAVE_MBSRTOWCS=1; AC_SUBST([HAVE_MBSRTOWCS]) HAVE_MBSNRTOWCS=1; AC_SUBST([HAVE_MBSNRTOWCS]) HAVE_WCRTOMB=1; AC_SUBST([HAVE_WCRTOMB]) HAVE_WCSRTOMBS=1; AC_SUBST([HAVE_WCSRTOMBS]) HAVE_WCSNRTOMBS=1; AC_SUBST([HAVE_WCSNRTOMBS]) HAVE_WMEMCHR=1; AC_SUBST([HAVE_WMEMCHR]) HAVE_WMEMCMP=1; AC_SUBST([HAVE_WMEMCMP]) HAVE_WMEMCPY=1; AC_SUBST([HAVE_WMEMCPY]) HAVE_WMEMMOVE=1; AC_SUBST([HAVE_WMEMMOVE]) HAVE_WMEMPCPY=1; AC_SUBST([HAVE_WMEMPCPY]) HAVE_WMEMSET=1; AC_SUBST([HAVE_WMEMSET]) HAVE_WCSLEN=1; AC_SUBST([HAVE_WCSLEN]) HAVE_WCSNLEN=1; AC_SUBST([HAVE_WCSNLEN]) HAVE_WCSCPY=1; AC_SUBST([HAVE_WCSCPY]) HAVE_WCPCPY=1; AC_SUBST([HAVE_WCPCPY]) HAVE_WCSNCPY=1; AC_SUBST([HAVE_WCSNCPY]) HAVE_WCPNCPY=1; AC_SUBST([HAVE_WCPNCPY]) HAVE_WCSCAT=1; AC_SUBST([HAVE_WCSCAT]) HAVE_WCSNCAT=1; AC_SUBST([HAVE_WCSNCAT]) HAVE_WCSCMP=1; AC_SUBST([HAVE_WCSCMP]) HAVE_WCSNCMP=1; AC_SUBST([HAVE_WCSNCMP]) HAVE_WCSCASECMP=1; AC_SUBST([HAVE_WCSCASECMP]) HAVE_WCSNCASECMP=1; AC_SUBST([HAVE_WCSNCASECMP]) HAVE_WCSCOLL=1; AC_SUBST([HAVE_WCSCOLL]) HAVE_WCSXFRM=1; AC_SUBST([HAVE_WCSXFRM]) HAVE_WCSDUP=1; AC_SUBST([HAVE_WCSDUP]) HAVE_WCSCHR=1; AC_SUBST([HAVE_WCSCHR]) HAVE_WCSRCHR=1; AC_SUBST([HAVE_WCSRCHR]) HAVE_WCSCSPN=1; AC_SUBST([HAVE_WCSCSPN]) HAVE_WCSSPN=1; AC_SUBST([HAVE_WCSSPN]) HAVE_WCSPBRK=1; AC_SUBST([HAVE_WCSPBRK]) HAVE_WCSSTR=1; AC_SUBST([HAVE_WCSSTR]) HAVE_WCSTOK=1; AC_SUBST([HAVE_WCSTOK]) HAVE_WCSWIDTH=1; AC_SUBST([HAVE_WCSWIDTH]) HAVE_WCSFTIME=1; AC_SUBST([HAVE_WCSFTIME]) HAVE_DECL_WCTOB=1; AC_SUBST([HAVE_DECL_WCTOB]) HAVE_DECL_WCWIDTH=1; AC_SUBST([HAVE_DECL_WCWIDTH]) REPLACE_MBSTATE_T=0; AC_SUBST([REPLACE_MBSTATE_T]) REPLACE_BTOWC=0; AC_SUBST([REPLACE_BTOWC]) REPLACE_WCTOB=0; AC_SUBST([REPLACE_WCTOB]) REPLACE_MBSINIT=0; AC_SUBST([REPLACE_MBSINIT]) REPLACE_MBRTOWC=0; AC_SUBST([REPLACE_MBRTOWC]) REPLACE_MBRLEN=0; AC_SUBST([REPLACE_MBRLEN]) REPLACE_MBSRTOWCS=0; AC_SUBST([REPLACE_MBSRTOWCS]) REPLACE_MBSNRTOWCS=0; AC_SUBST([REPLACE_MBSNRTOWCS]) REPLACE_WCRTOMB=0; AC_SUBST([REPLACE_WCRTOMB]) REPLACE_WCSRTOMBS=0; AC_SUBST([REPLACE_WCSRTOMBS]) REPLACE_WCSNRTOMBS=0; AC_SUBST([REPLACE_WCSNRTOMBS]) REPLACE_WCWIDTH=0; AC_SUBST([REPLACE_WCWIDTH]) REPLACE_WCSWIDTH=0; AC_SUBST([REPLACE_WCSWIDTH]) REPLACE_WCSFTIME=0; AC_SUBST([REPLACE_WCSFTIME]) REPLACE_WCSTOK=0; AC_SUBST([REPLACE_WCSTOK]) ]) pspp-1.4.1/gl/m4/btowc.m40000644000175000017500000000647413723215637014441 0ustar00blpblp00000000000000# btowc.m4 serial 11 dnl Copyright (C) 2008-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_FUNC_BTOWC], [ AC_REQUIRE([gl_WCHAR_H_DEFAULTS]) dnl Check whether is usable at all, first. Otherwise the test dnl program below may lead to an endless loop. See dnl . AC_REQUIRE([gl_WCHAR_H_INLINE_OK]) AC_CHECK_FUNCS_ONCE([btowc]) if test $ac_cv_func_btowc = no; then HAVE_BTOWC=0 else AC_REQUIRE([AC_PROG_CC]) AC_REQUIRE([gt_LOCALE_FR]) AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles dnl Cygwin 1.7.2 btowc('\0') is WEOF, not 0. AC_CACHE_CHECK([whether btowc(0) is correct], [gl_cv_func_btowc_nul], [ AC_RUN_IFELSE( [AC_LANG_SOURCE([[ #include /* Tru64 with Desktop Toolkit C has a bug: must be included before . BSD/OS 4.0.1 has a bug: , and must be included before . */ #include #include #include #include int main () { if (btowc ('\0') != 0) return 1; return 0; }]])], [gl_cv_func_btowc_nul=yes], [gl_cv_func_btowc_nul=no], [ changequote(,)dnl case "$host_os" in # Guess no on Cygwin. cygwin*) gl_cv_func_btowc_nul="guessing no" ;; # Guess yes on native Windows. mingw*) gl_cv_func_btowc_nul="guessing yes" ;; # Guess yes otherwise. *) gl_cv_func_btowc_nul="guessing yes" ;; esac changequote([,])dnl ]) ]) dnl IRIX 6.5 btowc(EOF) is 0xFF, not WEOF. AC_CACHE_CHECK([whether btowc(EOF) is correct], [gl_cv_func_btowc_eof], [ dnl Initial guess, used when cross-compiling or when no suitable locale dnl is present. changequote(,)dnl case "$host_os" in # Guess no on IRIX. irix*) gl_cv_func_btowc_eof="guessing no" ;; # Guess yes on native Windows. mingw*) gl_cv_func_btowc_eof="guessing yes" ;; # Guess yes otherwise. *) gl_cv_func_btowc_eof="guessing yes" ;; esac changequote([,])dnl if test $LOCALE_FR != none; then AC_RUN_IFELSE( [AC_LANG_SOURCE([[ #include #include /* Tru64 with Desktop Toolkit C has a bug: must be included before . BSD/OS 4.0.1 has a bug: , and must be included before . */ #include #include #include #include int main () { if (setlocale (LC_ALL, "$LOCALE_FR") != NULL) { if (btowc (EOF) != WEOF) return 1; } return 0; }]])], [gl_cv_func_btowc_eof=yes], [gl_cv_func_btowc_eof=no], [:]) fi ]) case "$gl_cv_func_btowc_nul" in *yes) ;; *) REPLACE_BTOWC=1 ;; esac case "$gl_cv_func_btowc_eof" in *yes) ;; *) REPLACE_BTOWC=1 ;; esac fi ]) # Prerequisites of lib/btowc.c. AC_DEFUN([gl_PREREQ_BTOWC], [ : ]) pspp-1.4.1/gl/m4/getdtablesize.m40000644000175000017500000000474013723215637016143 0ustar00blpblp00000000000000# getdtablesize.m4 serial 7 dnl Copyright (C) 2008-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_FUNC_GETDTABLESIZE], [ AC_REQUIRE([gl_UNISTD_H_DEFAULTS]) AC_REQUIRE([AC_CANONICAL_HOST]) AC_CHECK_FUNCS_ONCE([getdtablesize]) AC_CHECK_DECLS_ONCE([getdtablesize]) if test $ac_cv_func_getdtablesize = yes && test $ac_cv_have_decl_getdtablesize = yes; then AC_CACHE_CHECK([whether getdtablesize works], [gl_cv_func_getdtablesize_works], [dnl There are two concepts: the "maximum possible file descriptor value + 1" dnl and the "maximum number of open file descriptors in a process". dnl Per SUSv2 and POSIX, getdtablesize() should return the first one. dnl On most platforms, the first and the second concept are the same. dnl On OpenVMS, however, they are different and getdtablesize() returns dnl the second one; thus the test below fails. But we don't care dnl because there's no good way to write a replacement getdtablesize(). case "$host_os" in vms*) gl_cv_func_getdtablesize_works="no (limitation)" ;; *) dnl Cygwin 1.7.25 automatically increases the RLIMIT_NOFILE soft dnl limit up to an unchangeable hard limit; all other platforms dnl correctly require setrlimit before getdtablesize() can report dnl a larger value. AC_RUN_IFELSE([ AC_LANG_PROGRAM([[#include ]], [int size = getdtablesize(); if (dup2 (0, getdtablesize()) != -1) return 1; if (size != getdtablesize()) return 2; ])], [gl_cv_func_getdtablesize_works=yes], [gl_cv_func_getdtablesize_works=no], [case "$host_os" in cygwin*) # on cygwin 1.5.25, getdtablesize() automatically grows gl_cv_func_getdtablesize_works="guessing no" ;; *) gl_cv_func_getdtablesize_works="guessing yes" ;; esac ]) ;; esac ]) case "$gl_cv_func_getdtablesize_works" in *yes | "no (limitation)") ;; *) REPLACE_GETDTABLESIZE=1 ;; esac else HAVE_GETDTABLESIZE=0 fi ]) # Prerequisites of lib/getdtablesize.c. AC_DEFUN([gl_PREREQ_GETDTABLESIZE], [:]) pspp-1.4.1/gl/m4/isnand.m40000644000175000017500000000534113723215637014567 0ustar00blpblp00000000000000# isnand.m4 serial 12 dnl Copyright (C) 2007-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl Check how to get or define isnand(). AC_DEFUN([gl_FUNC_ISNAND], [ AC_REQUIRE([gl_MATH_H_DEFAULTS]) ISNAND_LIBM= gl_HAVE_ISNAND_NO_LIBM if test $gl_cv_func_isnand_no_libm = no; then gl_HAVE_ISNAND_IN_LIBM if test $gl_cv_func_isnand_in_libm = yes; then ISNAND_LIBM=-lm fi fi dnl The variable gl_func_isnand set here is used by isnan.m4. if test $gl_cv_func_isnand_no_libm = yes \ || test $gl_cv_func_isnand_in_libm = yes; then gl_func_isnand=yes else gl_func_isnand=no HAVE_ISNAND=0 fi AC_SUBST([ISNAND_LIBM]) ]) dnl Check how to get or define isnand() without linking with libm. AC_DEFUN([gl_FUNC_ISNAND_NO_LIBM], [ gl_HAVE_ISNAND_NO_LIBM gl_func_isnand_no_libm=$gl_cv_func_isnand_no_libm if test $gl_cv_func_isnand_no_libm = yes; then AC_DEFINE([HAVE_ISNAND_IN_LIBC], [1], [Define if the isnan(double) function is available in libc.]) fi ]) dnl Prerequisites of replacement isnand definition. It does not need -lm. AC_DEFUN([gl_PREREQ_ISNAND], [ AC_REQUIRE([gl_DOUBLE_EXPONENT_LOCATION]) ]) dnl Test whether isnand() can be used with libm. AC_DEFUN([gl_HAVE_ISNAND_IN_LIBM], [ AC_CACHE_CHECK([whether isnan(double) can be used with libm], [gl_cv_func_isnand_in_libm], [ save_LIBS="$LIBS" LIBS="$LIBS -lm" AC_LINK_IFELSE( [AC_LANG_PROGRAM( [[#include #if (__GNUC__ >= 4) || (__clang_major__ >= 4) # undef isnand # define isnand(x) __builtin_isnan ((double)(x)) #elif defined isnan # undef isnand # define isnand(x) isnan ((double)(x)) #endif double x;]], [[return isnand (x);]])], [gl_cv_func_isnand_in_libm=yes], [gl_cv_func_isnand_in_libm=no]) LIBS="$save_LIBS" ]) ]) AC_DEFUN([gl_HAVE_ISNAND_NO_LIBM], [ AC_CACHE_CHECK([whether isnan(double) can be used without linking with libm], [gl_cv_func_isnand_no_libm], [ AC_LINK_IFELSE( [AC_LANG_PROGRAM( [[#include #if (__GNUC__ >= 4) || (__clang_major__ >= 4) # undef isnand # define isnand(x) __builtin_isnan ((double)(x)) #else # undef isnand # define isnand(x) isnan ((double)(x)) #endif double x;]], [[return isnand (x);]])], [gl_cv_func_isnand_no_libm=yes], [gl_cv_func_isnand_no_libm=no]) ]) ]) pspp-1.4.1/gl/m4/lstat.m40000644000175000017500000000544113723215637014443 0ustar00blpblp00000000000000# serial 33 # Copyright (C) 1997-2001, 2003-2020 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. dnl From Jim Meyering. AC_DEFUN([gl_FUNC_LSTAT], [ AC_REQUIRE([AC_CANONICAL_HOST]) AC_REQUIRE([gl_SYS_STAT_H_DEFAULTS]) dnl If lstat does not exist, the replacement does dnl "#define lstat stat", and lstat.c is a no-op. AC_CHECK_FUNCS_ONCE([lstat]) if test $ac_cv_func_lstat = yes; then AC_REQUIRE([gl_FUNC_LSTAT_FOLLOWS_SLASHED_SYMLINK]) case $host_os,$gl_cv_func_lstat_dereferences_slashed_symlink in solaris* | *no) REPLACE_LSTAT=1 ;; esac else HAVE_LSTAT=0 fi ]) # Prerequisites of lib/lstat.c. AC_DEFUN([gl_PREREQ_LSTAT], [:]) AC_DEFUN([gl_FUNC_LSTAT_FOLLOWS_SLASHED_SYMLINK], [ dnl We don't use AC_FUNC_LSTAT_FOLLOWS_SLASHED_SYMLINK any more, because it dnl is no longer maintained in Autoconf and because it invokes AC_LIBOBJ. AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles AC_CACHE_CHECK([whether lstat correctly handles trailing slash], [gl_cv_func_lstat_dereferences_slashed_symlink], [rm -f conftest.sym conftest.file echo >conftest.file AC_RUN_IFELSE( [AC_LANG_PROGRAM( [AC_INCLUDES_DEFAULT], [[struct stat sbuf; if (symlink ("conftest.file", "conftest.sym") != 0) return 1; /* Linux will dereference the symlink and fail, as required by POSIX. That is better in the sense that it means we will not have to compile and use the lstat wrapper. */ return lstat ("conftest.sym/", &sbuf) == 0; ]])], [gl_cv_func_lstat_dereferences_slashed_symlink=yes], [gl_cv_func_lstat_dereferences_slashed_symlink=no], [case "$host_os" in linux-* | linux) # Guess yes on Linux systems. gl_cv_func_lstat_dereferences_slashed_symlink="guessing yes" ;; *-gnu* | gnu*) # Guess yes on glibc systems. gl_cv_func_lstat_dereferences_slashed_symlink="guessing yes" ;; mingw*) # Guess no on native Windows. gl_cv_func_lstat_dereferences_slashed_symlink="guessing no" ;; *) # If we don't know, obey --enable-cross-guesses. gl_cv_func_lstat_dereferences_slashed_symlink="$gl_cross_guess_normal" ;; esac ]) rm -f conftest.sym conftest.file ]) case "$gl_cv_func_lstat_dereferences_slashed_symlink" in *yes) AC_DEFINE_UNQUOTED([LSTAT_FOLLOWS_SLASHED_SYMLINK], [1], [Define to 1 if 'lstat' dereferences a symlink specified with a trailing slash.]) ;; esac ]) pspp-1.4.1/gl/m4/round.m40000644000175000017500000001237013723215637014442 0ustar00blpblp00000000000000# round.m4 serial 22 dnl Copyright (C) 2007, 2009-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_FUNC_ROUND], [ m4_divert_text([DEFAULTS], [gl_round_required=plain]) AC_REQUIRE([gl_MATH_H_DEFAULTS]) dnl Persuade glibc to declare round(). AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS]) gl_CHECK_MATH_LIB([ROUND_LIBM], [x = round (x);], [extern #ifdef __cplusplus "C" #endif double round (double); ]) if test "$ROUND_LIBM" != missing; then HAVE_ROUND=1 dnl Also check whether it's declared. dnl IRIX 6.5 has round() in libm but doesn't declare it in . AC_CHECK_DECLS([round], , [HAVE_DECL_ROUND=0], [[#include ]]) dnl Test whether round() produces correct results. On NetBSD 3.0, for dnl x = 1/2 - 2^-54, the system's round() returns a wrong result. AC_REQUIRE([AC_PROG_CC]) AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles AC_CACHE_CHECK([whether round works], [gl_cv_func_round_works], [ save_LIBS="$LIBS" LIBS="$LIBS $ROUND_LIBM" AC_RUN_IFELSE([AC_LANG_SOURCE([[ #include #include extern #ifdef __cplusplus "C" #endif double round (double); #ifdef _MSC_VER # pragma fenv_access (off) #endif int main() { /* 2^DBL_MANT_DIG. */ static const double TWO_MANT_DIG = /* Assume DBL_MANT_DIG <= 5 * 31. Use the identity n = floor(n/5) + floor((n+1)/5) + ... + floor((n+4)/5). */ (double) (1U << (DBL_MANT_DIG / 5)) * (double) (1U << ((DBL_MANT_DIG + 1) / 5)) * (double) (1U << ((DBL_MANT_DIG + 2) / 5)) * (double) (1U << ((DBL_MANT_DIG + 3) / 5)) * (double) (1U << ((DBL_MANT_DIG + 4) / 5)); volatile double x = 0.5 - 0.5 / TWO_MANT_DIG; return (x < 0.5 && round (x) != 0.0); }]])], [gl_cv_func_round_works=yes], [gl_cv_func_round_works=no], [case "$host_os" in netbsd* | aix*) gl_cv_func_round_works="guessing no" ;; # Guess yes on MSVC, no on mingw. mingw*) AC_EGREP_CPP([Known], [ #ifdef _MSC_VER Known #endif ], [gl_cv_func_round_works="guessing yes"], [gl_cv_func_round_works="guessing no"]) ;; *) gl_cv_func_round_works="guessing yes" ;; esac ]) LIBS="$save_LIBS" ]) case "$gl_cv_func_round_works" in *no) REPLACE_ROUND=1 ;; esac m4_ifdef([gl_FUNC_ROUND_IEEE], [ if test $gl_round_required = ieee && test $REPLACE_ROUND = 0; then AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles AC_CACHE_CHECK([whether round works according to ISO C 99 with IEC 60559], [gl_cv_func_round_ieee], [ save_LIBS="$LIBS" LIBS="$LIBS $ROUND_LIBM" AC_RUN_IFELSE( [AC_LANG_SOURCE([[ #ifndef __NO_MATH_INLINES # define __NO_MATH_INLINES 1 /* for glibc */ #endif #include extern #ifdef __cplusplus "C" #endif double round (double); ]gl_DOUBLE_MINUS_ZERO_CODE[ ]gl_DOUBLE_SIGNBIT_CODE[ static double dummy (double f) { return 0; } int main (int argc, char *argv[]) { double (* volatile my_round) (double) = argc ? round : dummy; /* Test whether round (-0.0) is -0.0. */ if (signbitd (minus_zerod) && !signbitd (my_round (minus_zerod))) return 1; return 0; } ]])], [gl_cv_func_round_ieee=yes], [gl_cv_func_round_ieee=no], [case "$host_os" in # Guess yes on glibc systems. *-gnu* | gnu*) gl_cv_func_round_ieee="guessing yes" ;; # Guess yes on musl systems. *-musl*) gl_cv_func_round_ieee="guessing yes" ;; # Guess yes on MSVC, no on mingw. mingw*) AC_EGREP_CPP([Known], [ #ifdef _MSC_VER Known #endif ], [gl_cv_func_round_ieee="guessing yes"], [gl_cv_func_round_ieee="guessing no"]) ;; # If we don't know, obey --enable-cross-guesses. *) gl_cv_func_round_ieee="$gl_cross_guess_normal" ;; esac ]) LIBS="$save_LIBS" ]) case "$gl_cv_func_round_ieee" in *yes) ;; *) REPLACE_ROUND=1 ;; esac fi ]) else HAVE_ROUND=0 HAVE_DECL_ROUND=0 fi if test $HAVE_ROUND = 0 || test $REPLACE_ROUND = 1; then dnl Find libraries needed to link lib/round.c. gl_FUNC_FLOOR_LIBS gl_FUNC_CEIL_LIBS ROUND_LIBM= dnl Append $FLOOR_LIBM to ROUND_LIBM, avoiding gratuitous duplicates. case " $ROUND_LIBM " in *" $FLOOR_LIBM "*) ;; *) ROUND_LIBM="$ROUND_LIBM $FLOOR_LIBM" ;; esac dnl Append $CEIL_LIBM to ROUND_LIBM, avoiding gratuitous duplicates. case " $ROUND_LIBM " in *" $CEIL_LIBM "*) ;; *) ROUND_LIBM="$ROUND_LIBM $CEIL_LIBM" ;; esac fi AC_SUBST([ROUND_LIBM]) ]) pspp-1.4.1/gl/m4/glibc21.m40000644000175000017500000000161313723215637014534 0ustar00blpblp00000000000000# glibc21.m4 serial 5 dnl Copyright (C) 2000-2002, 2004, 2008, 2010-2020 Free Software Foundation, dnl Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. # Test for the GNU C Library, version 2.1 or newer, or uClibc. # From Bruno Haible. AC_DEFUN([gl_GLIBC21], [ AC_CACHE_CHECK([whether we are using the GNU C Library >= 2.1 or uClibc], [ac_cv_gnu_library_2_1], [AC_EGREP_CPP([Lucky], [ #include #ifdef __GNU_LIBRARY__ #if (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 1) || (__GLIBC__ > 2) Lucky GNU user #endif #endif #ifdef __UCLIBC__ Lucky user #endif ], [ac_cv_gnu_library_2_1=yes], [ac_cv_gnu_library_2_1=no]) ] ) AC_SUBST([GLIBC21]) GLIBC21="$ac_cv_gnu_library_2_1" ] ) pspp-1.4.1/gl/m4/signalblocking.m40000644000175000017500000000221013723215637016271 0ustar00blpblp00000000000000# signalblocking.m4 serial 16 dnl Copyright (C) 2001-2002, 2006-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. # Determine available signal blocking primitives. Three different APIs exist: # 1) POSIX: sigemptyset, sigaddset, sigprocmask # 2) SYSV: sighold, sigrelse # 3) BSD: sigblock, sigsetmask # For simplicity, here we check only for the POSIX signal blocking. AC_DEFUN([gl_SIGNALBLOCKING], [ AC_REQUIRE([gl_SIGNAL_H_DEFAULTS]) AC_REQUIRE([gl_CHECK_TYPE_SIGSET_T]) AC_CACHE_CHECK([for sigprocmask], [gl_cv_func_sigprocmask_v16], [if test $gl_cv_type_sigset_t = yes; then gl_SILENT([ AC_CHECK_FUNC([sigprocmask], [gl_cv_func_sigprocmask_v16=yes], [gl_cv_func_sigprocmask_v16=no]) ]) else gl_cv_func_sigprocmask_v16=no fi ]) if test $gl_cv_func_sigprocmask_v16 != yes; then HAVE_POSIX_SIGNALBLOCKING=0 fi ]) # Prerequisites of lib/sigprocmask.c. AC_DEFUN([gl_PREREQ_SIGPROCMASK], [:]) pspp-1.4.1/gl/m4/mkstemp.m40000644000175000017500000000604413723215637014774 0ustar00blpblp00000000000000#serial 27 # Copyright (C) 2001, 2003-2007, 2009-2020 Free Software Foundation, Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # On some hosts (e.g., HP-UX 10.20, SunOS 4.1.4, Solaris 2.5.1), mkstemp has a # silly limit that it can create no more than 26 files from a given template. # Other systems lack mkstemp altogether. # On OSF1/Tru64 V4.0F, the system-provided mkstemp function can create # only 32 files per process. # On some hosts, mkstemp creates files with mode 0666, which is a security # problem and a violation of POSIX 2008. # On systems like the above, arrange to use the replacement function. AC_DEFUN([gl_FUNC_MKSTEMP], [ AC_REQUIRE([gl_STDLIB_H_DEFAULTS]) AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles AC_CHECK_FUNCS_ONCE([mkstemp]) if test $ac_cv_func_mkstemp = yes; then AC_CACHE_CHECK([for working mkstemp], [gl_cv_func_working_mkstemp], [ mkdir conftest.mkstemp AC_RUN_IFELSE( [AC_LANG_PROGRAM( [AC_INCLUDES_DEFAULT], [[int result = 0; int i; off_t large = (off_t) 4294967295u; if (large < 0) large = 2147483647; umask (0); for (i = 0; i < 70; i++) { char templ[] = "conftest.mkstemp/coXXXXXX"; int (*mkstemp_function) (char *) = mkstemp; int fd = mkstemp_function (templ); if (fd < 0) result |= 1; else { struct stat st; if (lseek (fd, large, SEEK_SET) != large) result |= 2; if (fstat (fd, &st) < 0) result |= 4; else if (st.st_mode & 0077) result |= 8; if (close (fd)) result |= 16; } } return result;]])], [gl_cv_func_working_mkstemp=yes], [gl_cv_func_working_mkstemp=no], [case "$host_os" in # Guess yes on glibc systems. *-gnu* | gnu*) gl_cv_func_working_mkstemp="guessing yes" ;; # Guess yes on musl systems. *-musl*) gl_cv_func_working_mkstemp="guessing yes" ;; # Guess no on native Windows. mingw*) gl_cv_func_working_mkstemp="guessing no" ;; # If we don't know, obey --enable-cross-guesses. *) gl_cv_func_working_mkstemp="$gl_cross_guess_normal" ;; esac ]) rm -rf conftest.mkstemp ]) case "$gl_cv_func_working_mkstemp" in *yes) ;; *) REPLACE_MKSTEMP=1 ;; esac else HAVE_MKSTEMP=0 fi ]) # Prerequisites of lib/mkstemp.c. AC_DEFUN([gl_PREREQ_MKSTEMP], [ ]) pspp-1.4.1/gl/m4/byteswap.m40000644000175000017500000000110313723215637015141 0ustar00blpblp00000000000000# byteswap.m4 serial 4 dnl Copyright (C) 2005, 2007, 2009-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl Written by Oskar Liljeblad. AC_DEFUN([gl_BYTESWAP], [ dnl Prerequisites of lib/byteswap.in.h. AC_CHECK_HEADERS([byteswap.h], [ BYTESWAP_H='' ], [ BYTESWAP_H='byteswap.h' ]) AC_SUBST([BYTESWAP_H]) AM_CONDITIONAL([GL_GENERATE_BYTESWAP_H], [test -n "$BYTESWAP_H"]) ]) pspp-1.4.1/gl/m4/mbstate_t.m40000644000175000017500000000256713723215637015304 0ustar00blpblp00000000000000# mbstate_t.m4 serial 13 dnl Copyright (C) 2000-2002, 2008-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. # From Paul Eggert. # BeOS 5 has but does not define mbstate_t, # so you can't declare an object of that type. # Check for this incompatibility with Standard C. # AC_TYPE_MBSTATE_T # ----------------- AC_DEFUN([AC_TYPE_MBSTATE_T], [ AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS]) dnl for HP-UX 11.11 AC_CACHE_CHECK([for mbstate_t], [ac_cv_type_mbstate_t], [AC_COMPILE_IFELSE( [AC_LANG_PROGRAM( [AC_INCLUDES_DEFAULT[ /* Tru64 with Desktop Toolkit C has a bug: must be included before . BSD/OS 4.0.1 has a bug: , and must be included before . */ #include #include #include #include ]], [[mbstate_t x; return sizeof x;]])], [ac_cv_type_mbstate_t=yes], [ac_cv_type_mbstate_t=no])]) if test $ac_cv_type_mbstate_t = yes; then AC_DEFINE([HAVE_MBSTATE_T], [1], [Define to 1 if declares mbstate_t.]) else AC_DEFINE([mbstate_t], [int], [Define to a type if does not define.]) fi ]) pspp-1.4.1/gl/m4/printf-posix-rpl.m40000644000175000017500000000137413723215637016552 0ustar00blpblp00000000000000# printf-posix-rpl.m4 serial 4 dnl Copyright (C) 2007-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_FUNC_PRINTF_POSIX], [ AC_REQUIRE([gl_FUNC_VFPRINTF_POSIX]) if test $gl_cv_func_vfprintf_posix = no; then gl_REPLACE_PRINTF fi ]) AC_DEFUN([gl_REPLACE_PRINTF], [ AC_REQUIRE([gl_STDIO_H_DEFAULTS]) AC_REQUIRE([gl_ASM_SYMBOL_PREFIX]) AC_LIBOBJ([printf]) REPLACE_PRINTF=1 AC_DEFINE([REPLACE_PRINTF_POSIX], [1], [Define if printf is overridden by a POSIX compliant gnulib implementation.]) gl_PREREQ_PRINTF ]) AC_DEFUN([gl_PREREQ_PRINTF], [:]) pspp-1.4.1/gl/m4/fstat.m40000644000175000017500000000206313723215637014432 0ustar00blpblp00000000000000# fstat.m4 serial 6 dnl Copyright (C) 2011-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_FUNC_FSTAT], [ AC_REQUIRE([AC_CANONICAL_HOST]) AC_REQUIRE([gl_SYS_STAT_H_DEFAULTS]) case "$host_os" in mingw* | solaris*) dnl On MinGW, the original stat() returns st_atime, st_mtime, dnl st_ctime values that are affected by the time zone. dnl Solaris stat can return a negative tv_nsec. REPLACE_FSTAT=1 ;; esac dnl Replace fstat() for supporting the gnulib-defined open() on directories. m4_ifdef([gl_FUNC_FCHDIR], [ gl_TEST_FCHDIR if test $HAVE_FCHDIR = 0; then case "$gl_cv_func_open_directory_works" in *yes) ;; *) REPLACE_FSTAT=1 ;; esac fi ]) ]) # Prerequisites of lib/fstat.c and lib/stat-w32.c. AC_DEFUN([gl_PREREQ_FSTAT], [ AC_REQUIRE([gl_HEADER_SYS_STAT_H]) : ]) pspp-1.4.1/gl/m4/socketlib.m40000644000175000017500000000567113723215637015300 0ustar00blpblp00000000000000# socketlib.m4 serial 2 dnl Copyright (C) 2008-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl gl_SOCKETLIB dnl Determines the library to use for socket functions. dnl Sets and AC_SUBSTs LIBSOCKET. AC_DEFUN([gl_SOCKETLIB], [ gl_PREREQ_SYS_H_WINSOCK2 dnl for HAVE_WINSOCK2_H LIBSOCKET= if test $HAVE_WINSOCK2_H = 1; then dnl Native Windows API (not Cygwin). AC_CACHE_CHECK([if we need to call WSAStartup in winsock2.h and -lws2_32], [gl_cv_func_wsastartup], [ gl_save_LIBS="$LIBS" LIBS="$LIBS -lws2_32" AC_LINK_IFELSE([AC_LANG_PROGRAM([[ #ifdef HAVE_WINSOCK2_H # include #endif]], [[ WORD wVersionRequested = MAKEWORD(1, 1); WSADATA wsaData; int err = WSAStartup(wVersionRequested, &wsaData); WSACleanup ();]])], gl_cv_func_wsastartup=yes, gl_cv_func_wsastartup=no) LIBS="$gl_save_LIBS" ]) if test "$gl_cv_func_wsastartup" = "yes"; then AC_DEFINE([WINDOWS_SOCKETS], [1], [Define if WSAStartup is needed.]) LIBSOCKET='-lws2_32' fi else dnl Unix API. dnl Solaris has most socket functions in libsocket. dnl Haiku has most socket functions in libnetwork. dnl BeOS has most socket functions in libnet. dnl On HP-UX, do NOT link with libxnet, because in 64-bit mode this would dnl break code (e.g. in libraries) that invokes accept(), getpeername(), dnl getsockname(), getsockopt(), or recvfrom() with a 32-bit addrlen. See dnl "man xopen_networking" for details. AC_CACHE_CHECK([for library containing setsockopt], [gl_cv_lib_socket], [ gl_cv_lib_socket= AC_LINK_IFELSE([AC_LANG_PROGRAM([[extern #ifdef __cplusplus "C" #endif char setsockopt();]], [[setsockopt();]])], [], [gl_save_LIBS="$LIBS" LIBS="$gl_save_LIBS -lsocket" AC_LINK_IFELSE([AC_LANG_PROGRAM([[extern #ifdef __cplusplus "C" #endif char setsockopt();]], [[setsockopt();]])], [gl_cv_lib_socket="-lsocket"]) if test -z "$gl_cv_lib_socket"; then LIBS="$gl_save_LIBS -lnetwork" AC_LINK_IFELSE([AC_LANG_PROGRAM([[extern #ifdef __cplusplus "C" #endif char setsockopt();]], [[setsockopt();]])], [gl_cv_lib_socket="-lnetwork"]) if test -z "$gl_cv_lib_socket"; then LIBS="$gl_save_LIBS -lnet" AC_LINK_IFELSE([AC_LANG_PROGRAM([[extern #ifdef __cplusplus "C" #endif char setsockopt();]], [[setsockopt();]])], [gl_cv_lib_socket="-lnet"]) fi fi LIBS="$gl_save_LIBS" ]) if test -z "$gl_cv_lib_socket"; then gl_cv_lib_socket="none needed" fi ]) if test "$gl_cv_lib_socket" != "none needed"; then LIBSOCKET="$gl_cv_lib_socket" fi fi AC_SUBST([LIBSOCKET]) ]) pspp-1.4.1/gl/m4/mbchar.m40000644000175000017500000000065313723215637014550 0ustar00blpblp00000000000000# mbchar.m4 serial 9 dnl Copyright (C) 2005-2007, 2009-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl autoconf tests required for use of mbchar.m4 dnl From Bruno Haible. AC_DEFUN([gl_MBCHAR], [ AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS]) ]) pspp-1.4.1/gl/m4/strnlen.m40000644000175000017500000000156113723215637015000 0ustar00blpblp00000000000000# strnlen.m4 serial 13 dnl Copyright (C) 2002-2003, 2005-2007, 2009-2020 Free Software Foundation, dnl Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_FUNC_STRNLEN], [ AC_REQUIRE([gl_HEADER_STRING_H_DEFAULTS]) dnl Persuade glibc to declare strnlen(). AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS]) AC_CHECK_DECLS_ONCE([strnlen]) if test $ac_cv_have_decl_strnlen = no; then HAVE_DECL_STRNLEN=0 else m4_pushdef([AC_LIBOBJ], [:]) dnl Note: AC_FUNC_STRNLEN does AC_LIBOBJ([strnlen]). AC_FUNC_STRNLEN m4_popdef([AC_LIBOBJ]) if test $ac_cv_func_strnlen_working = no; then REPLACE_STRNLEN=1 fi fi ]) # Prerequisites of lib/strnlen.c. AC_DEFUN([gl_PREREQ_STRNLEN], [:]) pspp-1.4.1/gl/m4/lock.m40000644000175000017500000000303713723215637014243 0ustar00blpblp00000000000000# lock.m4 serial 14 dnl Copyright (C) 2005-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl From Bruno Haible. AC_DEFUN([gl_LOCK], [ AC_REQUIRE([gl_THREADLIB]) if test "$gl_threads_api" = posix; then # OSF/1 4.0 and Mac OS X 10.1 lack the pthread_rwlock_t type and the # pthread_rwlock_* functions. has_rwlock=false AC_CHECK_TYPE([pthread_rwlock_t], [has_rwlock=true AC_DEFINE([HAVE_PTHREAD_RWLOCK], [1], [Define if the POSIX multithreading library has read/write locks.])], [], [#include ]) if $has_rwlock; then gl_PTHREAD_RWLOCK_RDLOCK_PREFER_WRITER fi # glibc defines PTHREAD_MUTEX_RECURSIVE as enum, not as a macro. AC_COMPILE_IFELSE([ AC_LANG_PROGRAM( [[#include ]], [[ #if __FreeBSD__ == 4 error "No, in FreeBSD 4.0 recursive mutexes actually don't work." #elif (defined __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ \ && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ < 1070) error "No, in Mac OS X < 10.7 recursive mutexes actually don't work." #else int x = (int)PTHREAD_MUTEX_RECURSIVE; return !x; #endif ]])], [AC_DEFINE([HAVE_PTHREAD_MUTEX_RECURSIVE], [1], [Define if the defines PTHREAD_MUTEX_RECURSIVE.])]) fi gl_PREREQ_LOCK ]) # Prerequisites of lib/glthread/lock.c. AC_DEFUN([gl_PREREQ_LOCK], [:]) pspp-1.4.1/gl/m4/stdbool.m40000644000175000017500000000763513723215637014771 0ustar00blpblp00000000000000# Check for stdbool.h that conforms to C99. dnl Copyright (C) 2002-2006, 2009-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. #serial 8 # Prepare for substituting if it is not supported. AC_DEFUN([AM_STDBOOL_H], [ AC_REQUIRE([AC_CHECK_HEADER_STDBOOL]) AC_REQUIRE([AC_CANONICAL_HOST]) dnl On some platforms, does not exist or does not conform to C99. dnl On Solaris 10 with CC=cc CXX=CC, exists but is not usable dnl in C++ mode (and no exists). In this case, we use our dnl replacement, also in C mode (for binary compatibility between C and C++). if test "$ac_cv_header_stdbool_h" = yes; then case "$host_os" in solaris*) if test -z "$GCC"; then STDBOOL_H='stdbool.h' else STDBOOL_H='' fi ;; *) STDBOOL_H='' ;; esac else STDBOOL_H='stdbool.h' fi AC_SUBST([STDBOOL_H]) AM_CONDITIONAL([GL_GENERATE_STDBOOL_H], [test -n "$STDBOOL_H"]) if test "$ac_cv_type__Bool" = yes; then HAVE__BOOL=1 else HAVE__BOOL=0 fi AC_SUBST([HAVE__BOOL]) ]) # AM_STDBOOL_H will be renamed to gl_STDBOOL_H in the future. AC_DEFUN([gl_STDBOOL_H], [AM_STDBOOL_H]) # This version of the macro is needed in autoconf <= 2.68. AC_DEFUN([AC_CHECK_HEADER_STDBOOL], [AC_CACHE_CHECK([for stdbool.h that conforms to C99], [ac_cv_header_stdbool_h], [AC_COMPILE_IFELSE( [AC_LANG_PROGRAM( [[ #include #ifdef __cplusplus typedef bool Bool; #else typedef _Bool Bool; #ifndef bool "error: bool is not defined" #endif #ifndef false "error: false is not defined" #endif #if false "error: false is not 0" #endif #ifndef true "error: true is not defined" #endif #if true != 1 "error: true is not 1" #endif #endif #ifndef __bool_true_false_are_defined "error: __bool_true_false_are_defined is not defined" #endif struct s { Bool s: 1; Bool t; bool u: 1; bool v; } s; char a[true == 1 ? 1 : -1]; char b[false == 0 ? 1 : -1]; char c[__bool_true_false_are_defined == 1 ? 1 : -1]; char d[(bool) 0.5 == true ? 1 : -1]; /* See body of main program for 'e'. */ char f[(Bool) 0.0 == false ? 1 : -1]; char g[true]; char h[sizeof (Bool)]; char i[sizeof s.t]; enum { j = false, k = true, l = false * true, m = true * 256 }; /* The following fails for HP aC++/ANSI C B3910B A.05.55 [Dec 04 2003]. */ Bool n[m]; char o[sizeof n == m * sizeof n[0] ? 1 : -1]; char p[-1 - (Bool) 0 < 0 && -1 - (bool) 0 < 0 ? 1 : -1]; /* Catch a bug in an HP-UX C compiler. See https://gcc.gnu.org/ml/gcc-patches/2003-12/msg02303.html https://lists.gnu.org/r/bug-coreutils/2005-11/msg00161.html */ Bool q = true; Bool *pq = &q; bool *qq = &q; ]], [[ bool e = &s; *pq |= q; *pq |= ! q; *qq |= q; *qq |= ! q; /* Refer to every declared value, to avoid compiler optimizations. */ return (!a + !b + !c + !d + !e + !f + !g + !h + !i + !!j + !k + !!l + !m + !n + !o + !p + !q + !pq + !qq); ]])], [ac_cv_header_stdbool_h=yes], [ac_cv_header_stdbool_h=no])]) AC_CHECK_TYPES([_Bool]) ]) pspp-1.4.1/gl/m4/wint_t.m40000644000175000017500000000443113723215637014616 0ustar00blpblp00000000000000# wint_t.m4 serial 8 dnl Copyright (C) 2003, 2007-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl From Bruno Haible. dnl Test whether has the 'wint_t' type and whether gnulib's dnl or would, if present, override 'wint_t'. dnl Prerequisite: AC_PROG_CC AC_DEFUN([gt_TYPE_WINT_T], [ AC_CACHE_CHECK([for wint_t], [gt_cv_c_wint_t], [AC_COMPILE_IFELSE( [AC_LANG_PROGRAM( [[ /* Tru64 with Desktop Toolkit C has a bug: must be included before . BSD/OS 4.0.1 has a bug: , and must be included before . */ #include #include #include #include wint_t foo = (wchar_t)'\0';]], [[]])], [gt_cv_c_wint_t=yes], [gt_cv_c_wint_t=no])]) if test $gt_cv_c_wint_t = yes; then AC_DEFINE([HAVE_WINT_T], [1], [Define if you have the 'wint_t' type.]) dnl Determine whether gnulib's or would, if present, dnl override 'wint_t'. AC_CACHE_CHECK([whether wint_t is too small], [gl_cv_type_wint_t_too_small], [AC_COMPILE_IFELSE( [AC_LANG_PROGRAM([[ /* Tru64 with Desktop Toolkit C has a bug: must be included before . BSD/OS 4.0.1 has a bug: , and must be included before . */ #if !(defined __GLIBC__ && !defined __UCLIBC__) # include # include # include #endif #include int verify[sizeof (wint_t) < sizeof (int) ? -1 : 1]; ]])], [gl_cv_type_wint_t_too_small=no], [gl_cv_type_wint_t_too_small=yes])]) if test $gl_cv_type_wint_t_too_small = yes; then GNULIB_OVERRIDES_WINT_T=1 else GNULIB_OVERRIDES_WINT_T=0 fi else GNULIB_OVERRIDES_WINT_T=0 fi AC_SUBST([GNULIB_OVERRIDES_WINT_T]) ]) dnl Prerequisites of the 'wint_t' override. AC_DEFUN([gl_TYPE_WINT_T_PREREQ], [ AC_CHECK_HEADERS_ONCE([crtdefs.h]) if test $ac_cv_header_crtdefs_h = yes; then HAVE_CRTDEFS_H=1 else HAVE_CRTDEFS_H=0 fi AC_SUBST([HAVE_CRTDEFS_H]) ]) pspp-1.4.1/gl/m4/c-strtod.m40000644000175000017500000000270713723215637015055 0ustar00blpblp00000000000000# c-strtod.m4 serial 18 # Copyright (C) 2004-2006, 2009-2020 Free Software Foundation, Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # Written by Paul Eggert. dnl Prerequisites of lib/c-strtod.c. AC_DEFUN([gl_C_STRTOD], [ AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS]) AC_REQUIRE([gt_FUNC_USELOCALE]) AC_CHECK_HEADERS_ONCE([xlocale.h]) dnl We can't use AC_CHECK_FUNC here, because strtod_l() is defined as a dnl static inline function when compiling for Android 7.1 or older. AC_CACHE_CHECK([for strtod_l], [gl_cv_func_strtod_l], [AC_LINK_IFELSE( [AC_LANG_PROGRAM( [[#include #include #if HAVE_XLOCALE_H # include #endif locale_t loc; ]], [[char *end; return strtod_l("0",&end,loc) < 0.0; ]]) ], [gl_cv_func_strtod_l=yes], [gl_cv_func_strtod_l=no]) ]) if test $gl_cv_func_strtod_l = yes; then HAVE_STRTOD_L=1 else HAVE_STRTOD_L=0 fi AC_DEFINE_UNQUOTED([HAVE_STRTOD_L], [$HAVE_STRTOD_L], [Define to 1 if the system has the 'strtod_l' function.]) ]) dnl Prerequisites of lib/c-strtold.c. AC_DEFUN([gl_C_STRTOLD], [ AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS]) AC_REQUIRE([gt_FUNC_USELOCALE]) AC_CHECK_FUNCS([strtold_l]) ]) pspp-1.4.1/gl/m4/mmap-anon.m40000644000175000017500000000373313723215637015201 0ustar00blpblp00000000000000# mmap-anon.m4 serial 10 dnl Copyright (C) 2005, 2007, 2009-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. # Detect how mmap can be used to create anonymous (not file-backed) memory # mappings. # - On Linux, AIX, OSF/1, Solaris, Cygwin, Interix, Haiku, both MAP_ANONYMOUS # and MAP_ANON exist and have the same value. # - On HP-UX, only MAP_ANONYMOUS exists. # - On Mac OS X, FreeBSD, NetBSD, OpenBSD, only MAP_ANON exists. # - On IRIX, neither exists, and a file descriptor opened to /dev/zero must be # used. AC_DEFUN([gl_FUNC_MMAP_ANON], [ dnl Persuade glibc to define MAP_ANONYMOUS. AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS]) # Check for mmap(). Don't use AC_FUNC_MMAP, because it checks too much: it # fails on HP-UX 11, because MAP_FIXED mappings do not work. But this is # irrelevant for anonymous mappings. AC_CHECK_FUNC([mmap], [gl_have_mmap=yes], [gl_have_mmap=no]) # Try to allow MAP_ANONYMOUS. gl_have_mmap_anonymous=no if test $gl_have_mmap = yes; then AC_MSG_CHECKING([for MAP_ANONYMOUS]) AC_EGREP_CPP([I cannot identify this map], [ #include #ifdef MAP_ANONYMOUS I cannot identify this map #endif ], [gl_have_mmap_anonymous=yes]) if test $gl_have_mmap_anonymous != yes; then AC_EGREP_CPP([I cannot identify this map], [ #include #ifdef MAP_ANON I cannot identify this map #endif ], [AC_DEFINE([MAP_ANONYMOUS], [MAP_ANON], [Define to a substitute value for mmap()'s MAP_ANONYMOUS flag.]) gl_have_mmap_anonymous=yes]) fi AC_MSG_RESULT([$gl_have_mmap_anonymous]) if test $gl_have_mmap_anonymous = yes; then AC_DEFINE([HAVE_MAP_ANONYMOUS], [1], [Define to 1 if mmap()'s MAP_ANONYMOUS flag is available after including config.h and .]) fi fi ]) pspp-1.4.1/gl/m4/printf-frexpl.m40000644000175000017500000000332313723215637016111 0ustar00blpblp00000000000000# printf-frexpl.m4 serial 10 dnl Copyright (C) 2007, 2009-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl Check how to define printf_frexpl() without linking with libm. AC_DEFUN([gl_FUNC_PRINTF_FREXPL], [ AC_REQUIRE([gl_MATH_H_DEFAULTS]) AC_REQUIRE([gl_LONG_DOUBLE_VS_DOUBLE]) dnl Subset of gl_FUNC_FREXPL_NO_LIBM. gl_CHECK_FREXPL_NO_LIBM if test $gl_cv_func_frexpl_no_libm = yes; then gl_FUNC_FREXPL_WORKS case "$gl_cv_func_frexpl_works" in *yes) gl_func_frexpl_no_libm=yes ;; *) gl_func_frexpl_no_libm=no; REPLACE_FREXPL=1 ;; esac else gl_func_frexpl_no_libm=no dnl Set REPLACE_FREXPL here because the system may have frexpl in libm. REPLACE_FREXPL=1 fi if test $gl_func_frexpl_no_libm = yes; then AC_DEFINE([HAVE_FREXPL_IN_LIBC], [1], [Define if the frexpl function is available in libc.]) dnl Also check whether it's declared. dnl Mac OS X 10.3 has frexpl() in libc but doesn't declare it in . AC_CHECK_DECL([frexpl], , [HAVE_DECL_FREXPL=0], [[#include ]]) fi gl_CHECK_LDEXPL_NO_LIBM if test $gl_cv_func_ldexpl_no_libm = yes; then gl_FUNC_LDEXPL_WORKS case "$gl_cv_func_ldexpl_works" in *yes) AC_DEFINE([HAVE_LDEXPL_IN_LIBC], [1], [Define if the ldexpl function is available in libc.]) dnl Also check whether it's declared. dnl Mac OS X 10.3 has ldexpl() in libc but doesn't declare it in . AC_CHECK_DECL([ldexpl], , [HAVE_DECL_LDEXPL=0], [[#include ]]) ;; esac fi ]) pspp-1.4.1/gl/m4/read.m40000644000175000017500000000161013723215637014221 0ustar00blpblp00000000000000# read.m4 serial 5 dnl Copyright (C) 2011-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_FUNC_READ], [ AC_REQUIRE([gl_UNISTD_H_DEFAULTS]) m4_ifdef([gl_MSVC_INVAL], [ AC_REQUIRE([gl_MSVC_INVAL]) if test $HAVE_MSVC_INVALID_PARAMETER_HANDLER = 1; then REPLACE_READ=1 fi ]) dnl This ifdef is just an optimization, to avoid performing a configure dnl check whose result is not used. It does not make the test of dnl GNULIB_UNISTD_H_NONBLOCKING or GNULIB_NONBLOCKING redundant. m4_ifdef([gl_NONBLOCKING_IO], [ gl_NONBLOCKING_IO if test $gl_cv_have_nonblocking != yes; then REPLACE_READ=1 fi ]) ]) # Prerequisites of lib/read.c. AC_DEFUN([gl_PREREQ_READ], [:]) pspp-1.4.1/gl/m4/vsnprintf-posix.m40000644000175000017500000001412313723215637016502 0ustar00blpblp00000000000000# vsnprintf-posix.m4 serial 15 dnl Copyright (C) 2007-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_FUNC_VSNPRINTF_POSIX], [ AC_REQUIRE([gl_PRINTF_SIZES_C99]) AC_REQUIRE([gl_PRINTF_LONG_DOUBLE]) AC_REQUIRE([gl_PRINTF_INFINITE]) AC_REQUIRE([gl_PRINTF_INFINITE_LONG_DOUBLE]) AC_REQUIRE([gl_PRINTF_DIRECTIVE_A]) AC_REQUIRE([gl_PRINTF_DIRECTIVE_F]) AC_REQUIRE([gl_PRINTF_DIRECTIVE_N]) AC_REQUIRE([gl_PRINTF_DIRECTIVE_LS]) AC_REQUIRE([gl_PRINTF_POSITIONS]) AC_REQUIRE([gl_PRINTF_FLAG_GROUPING]) AC_REQUIRE([gl_PRINTF_FLAG_LEFTADJUST]) AC_REQUIRE([gl_PRINTF_FLAG_ZERO]) AC_REQUIRE([gl_PRINTF_PRECISION]) AC_REQUIRE([gl_PRINTF_ENOMEM]) gl_cv_func_vsnprintf_posix=no AC_CHECK_FUNCS([vsnprintf]) if test $ac_cv_func_vsnprintf = yes; then dnl These tests use vsnprintf() if snprintf() does not exist. gl_SNPRINTF_TRUNCATION_C99 gl_SNPRINTF_RETVAL_C99 gl_SNPRINTF_DIRECTIVE_N gl_SNPRINTF_SIZE1 gl_VSNPRINTF_ZEROSIZE_C99 case "$gl_cv_func_printf_sizes_c99" in *yes) case "$gl_cv_func_printf_long_double" in *yes) case "$gl_cv_func_printf_infinite" in *yes) case "$gl_cv_func_printf_infinite_long_double" in *yes) case "$gl_cv_func_printf_directive_a" in *yes) case "$gl_cv_func_printf_directive_f" in *yes) case "$gl_cv_func_printf_directive_n" in *yes) case "$gl_cv_func_printf_directive_ls" in *yes) case "$gl_cv_func_printf_positions" in *yes) case "$gl_cv_func_printf_flag_grouping" in *yes) case "$gl_cv_func_printf_flag_leftadjust" in *yes) case "$gl_cv_func_printf_flag_zero" in *yes) case "$gl_cv_func_printf_precision" in *yes) case "$gl_cv_func_printf_enomem" in *yes) case "$gl_cv_func_snprintf_truncation_c99" in *yes) case "$gl_cv_func_snprintf_retval_c99" in *yes) case "$gl_cv_func_snprintf_directive_n" in *yes) case "$gl_cv_func_snprintf_size1" in *yes) case "$gl_cv_func_vsnprintf_zerosize_c99" in *yes) # vsnprintf exists and is # already POSIX compliant. gl_cv_func_vsnprintf_posix=yes ;; esac ;; esac ;; esac ;; esac ;; esac ;; esac ;; esac ;; esac ;; esac ;; esac ;; esac ;; esac ;; esac ;; esac ;; esac ;; esac ;; esac ;; esac ;; esac fi if test $gl_cv_func_vsnprintf_posix = no; then gl_PREREQ_VASNPRINTF_LONG_DOUBLE gl_PREREQ_VASNPRINTF_INFINITE_DOUBLE gl_PREREQ_VASNPRINTF_INFINITE_LONG_DOUBLE gl_PREREQ_VASNPRINTF_DIRECTIVE_A gl_PREREQ_VASNPRINTF_DIRECTIVE_F gl_PREREQ_VASNPRINTF_DIRECTIVE_LS gl_PREREQ_VASNPRINTF_FLAG_GROUPING gl_PREREQ_VASNPRINTF_FLAG_LEFTADJUST gl_PREREQ_VASNPRINTF_FLAG_ZERO gl_PREREQ_VASNPRINTF_PRECISION gl_PREREQ_VASNPRINTF_ENOMEM gl_REPLACE_VASNPRINTF gl_REPLACE_VSNPRINTF fi ]) pspp-1.4.1/gl/m4/builtin-expect.m40000644000175000017500000000302313723215637016242 0ustar00blpblp00000000000000dnl Check for __builtin_expect. dnl Copyright 2016-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl Written by Paul Eggert. AC_DEFUN([gl___BUILTIN_EXPECT], [ AC_CACHE_CHECK([for __builtin_expect], [gl_cv___builtin_expect], [AC_LINK_IFELSE( [AC_LANG_SOURCE([[ int main (int argc, char **argv) { argc = __builtin_expect (argc, 100); return argv[argc != 100][0]; }]])], [gl_cv___builtin_expect=yes], [AC_LINK_IFELSE( [AC_LANG_SOURCE([[ #include int main (int argc, char **argv) { argc = __builtin_expect (argc, 100); return argv[argc != 100][0]; }]])], [gl_cv___builtin_expect="in "], [gl_cv___builtin_expect=no])])]) if test "$gl_cv___builtin_expect" = yes; then AC_DEFINE([HAVE___BUILTIN_EXPECT], [1]) elif test "$gl_cv___builtin_expect" = "in "; then AC_DEFINE([HAVE___BUILTIN_EXPECT], [2]) fi AH_VERBATIM([HAVE___BUILTIN_EXPECT], [/* Define to 1 if the compiler supports __builtin_expect, and to 2 if does. */ #undef HAVE___BUILTIN_EXPECT #ifndef HAVE___BUILTIN_EXPECT # define __builtin_expect(e, c) (e) #elif HAVE___BUILTIN_EXPECT == 2 # include #endif ]) ]) pspp-1.4.1/gl/m4/floor.m40000644000175000017500000000654013723215637014436 0ustar00blpblp00000000000000# floor.m4 serial 14 dnl Copyright (C) 2007, 2009-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_FUNC_FLOOR], [ m4_divert_text([DEFAULTS], [gl_floor_required=plain]) AC_REQUIRE([gl_MATH_H_DEFAULTS]) dnl Test whether floor() can be used without libm. gl_FUNC_FLOOR_LIBS if test "$FLOOR_LIBM" = "?"; then FLOOR_LIBM= fi m4_ifdef([gl_FUNC_FLOOR_IEEE], [ if test $gl_floor_required = ieee && test $REPLACE_FLOOR = 0; then AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles AC_CACHE_CHECK([whether floor works according to ISO C 99 with IEC 60559], [gl_cv_func_floor_ieee], [ save_LIBS="$LIBS" LIBS="$LIBS $FLOOR_LIBM" AC_RUN_IFELSE( [AC_LANG_SOURCE([[ #ifndef __NO_MATH_INLINES # define __NO_MATH_INLINES 1 /* for glibc */ #endif #include ]gl_DOUBLE_MINUS_ZERO_CODE[ ]gl_DOUBLE_SIGNBIT_CODE[ static double dummy (double f) { return 0; } int main (int argc, char *argv[]) { double (* volatile my_floor) (double) = argc ? floor : dummy; /* Test whether floor (-0.0) is -0.0. */ if (signbitd (minus_zerod) && !signbitd (my_floor (minus_zerod))) return 1; return 0; } ]])], [gl_cv_func_floor_ieee=yes], [gl_cv_func_floor_ieee=no], [case "$host_os" in # Guess yes on glibc systems. *-gnu* | gnu*) gl_cv_func_floor_ieee="guessing yes" ;; # Guess yes on musl systems. *-musl*) gl_cv_func_floor_ieee="guessing yes" ;; # Guess yes on native Windows. mingw*) gl_cv_func_floor_ieee="guessing yes" ;; # If we don't know, obey --enable-cross-guesses. *) gl_cv_func_floor_ieee="$gl_cross_guess_normal" ;; esac ]) LIBS="$save_LIBS" ]) case "$gl_cv_func_floor_ieee" in *yes) ;; *) REPLACE_FLOOR=1 ;; esac fi ]) if test $REPLACE_FLOOR = 1; then dnl No libraries are needed to link lib/floor.c. FLOOR_LIBM= fi AC_SUBST([FLOOR_LIBM]) ]) # Determines the libraries needed to get the floor() function. # Sets FLOOR_LIBM. AC_DEFUN([gl_FUNC_FLOOR_LIBS], [ gl_CACHE_VAL_SILENT([gl_cv_func_floor_libm], [ gl_cv_func_floor_libm=? AC_LINK_IFELSE( [AC_LANG_PROGRAM( [[#ifndef __NO_MATH_INLINES # define __NO_MATH_INLINES 1 /* for glibc */ #endif #include double (*funcptr) (double) = floor; double x;]], [[x = funcptr(x) + floor(x);]])], [gl_cv_func_floor_libm=]) if test "$gl_cv_func_floor_libm" = "?"; then save_LIBS="$LIBS" LIBS="$LIBS -lm" AC_LINK_IFELSE( [AC_LANG_PROGRAM( [[#ifndef __NO_MATH_INLINES # define __NO_MATH_INLINES 1 /* for glibc */ #endif #include double (*funcptr) (double) = floor; double x;]], [[x = funcptr(x) + floor(x);]])], [gl_cv_func_floor_libm="-lm"]) LIBS="$save_LIBS" fi ]) FLOOR_LIBM="$gl_cv_func_floor_libm" ]) pspp-1.4.1/gl/m4/strdup.m40000644000175000017500000000165713723215637014642 0ustar00blpblp00000000000000# strdup.m4 serial 13 dnl Copyright (C) 2002-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_FUNC_STRDUP], [ AC_REQUIRE([gl_HEADER_STRING_H_DEFAULTS]) AC_CHECK_FUNCS_ONCE([strdup]) AC_CHECK_DECLS_ONCE([strdup]) if test $ac_cv_have_decl_strdup = no; then HAVE_DECL_STRDUP=0 fi ]) AC_DEFUN([gl_FUNC_STRDUP_POSIX], [ AC_REQUIRE([gl_HEADER_STRING_H_DEFAULTS]) AC_REQUIRE([gl_CHECK_MALLOC_POSIX]) AC_CHECK_FUNCS_ONCE([strdup]) if test $ac_cv_func_strdup = yes; then if test $gl_cv_func_malloc_posix != yes; then REPLACE_STRDUP=1 fi fi AC_CHECK_DECLS_ONCE([strdup]) if test $ac_cv_have_decl_strdup = no; then HAVE_DECL_STRDUP=0 fi ]) # Prerequisites of lib/strdup.c. AC_DEFUN([gl_PREREQ_STRDUP], [:]) pspp-1.4.1/gl/m4/close.m40000644000175000017500000000222113723215637014412 0ustar00blpblp00000000000000# close.m4 serial 9 dnl Copyright (C) 2008-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_FUNC_CLOSE], [ AC_REQUIRE([gl_UNISTD_H_DEFAULTS]) m4_ifdef([gl_MSVC_INVAL], [ AC_REQUIRE([gl_MSVC_INVAL]) if test $HAVE_MSVC_INVALID_PARAMETER_HANDLER = 1; then REPLACE_CLOSE=1 fi ]) m4_ifdef([gl_PREREQ_SYS_H_WINSOCK2], [ gl_PREREQ_SYS_H_WINSOCK2 if test $UNISTD_H_HAVE_WINSOCK2_H = 1; then dnl Even if the 'socket' module is not used here, another part of the dnl application may use it and pass file descriptors that refer to dnl sockets to the close() function. So enable the support for sockets. REPLACE_CLOSE=1 fi ]) dnl Replace close() for supporting the gnulib-defined fchdir() function, dnl to keep fchdir's bookkeeping up-to-date. m4_ifdef([gl_FUNC_FCHDIR], [ if test $REPLACE_CLOSE = 0; then gl_TEST_FCHDIR if test $HAVE_FCHDIR = 0; then REPLACE_CLOSE=1 fi fi ]) ]) pspp-1.4.1/gl/m4/size_max.m40000644000175000017500000000547613723215637015143 0ustar00blpblp00000000000000# size_max.m4 serial 12 dnl Copyright (C) 2003, 2005-2006, 2008-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl From Bruno Haible. AC_PREREQ([2.61]) AC_DEFUN([gl_SIZE_MAX], [ AC_CHECK_HEADERS([stdint.h]) dnl First test whether the system already has SIZE_MAX. AC_CACHE_CHECK([for SIZE_MAX], [gl_cv_size_max], [ gl_cv_size_max=no AC_EGREP_CPP([Found it], [ #include #if HAVE_STDINT_H #include #endif #ifdef SIZE_MAX Found it #endif ], [gl_cv_size_max=yes]) if test $gl_cv_size_max != yes; then dnl Define it ourselves. Here we assume that the type 'size_t' is not wider dnl than the type 'unsigned long'. Try hard to find a definition that can dnl be used in a preprocessor #if, i.e. doesn't contain a cast. AC_COMPUTE_INT([size_t_bits_minus_1], [sizeof (size_t) * CHAR_BIT - 1], [#include #include ], [size_t_bits_minus_1=]) AC_COMPUTE_INT([fits_in_uint], [sizeof (size_t) <= sizeof (unsigned int)], [#include ], [fits_in_uint=]) if test -n "$size_t_bits_minus_1" && test -n "$fits_in_uint"; then if test $fits_in_uint = 1; then dnl Even though SIZE_MAX fits in an unsigned int, it must be of type dnl 'unsigned long' if the type 'size_t' is the same as 'unsigned long'. AC_COMPILE_IFELSE( [AC_LANG_PROGRAM( [[#include extern size_t foo; extern unsigned long foo; ]], [[]])], [fits_in_uint=0]) fi dnl We cannot use 'expr' to simplify this expression, because 'expr' dnl works only with 'long' integers in the host environment, while we dnl might be cross-compiling from a 32-bit platform to a 64-bit platform. if test $fits_in_uint = 1; then gl_cv_size_max="(((1U << $size_t_bits_minus_1) - 1) * 2 + 1)" else gl_cv_size_max="(((1UL << $size_t_bits_minus_1) - 1) * 2 + 1)" fi else dnl Shouldn't happen, but who knows... gl_cv_size_max='((size_t)~(size_t)0)' fi fi ]) if test "$gl_cv_size_max" != yes; then AC_DEFINE_UNQUOTED([SIZE_MAX], [$gl_cv_size_max], [Define as the maximum value of type 'size_t', if the system doesn't define it.]) fi dnl Don't redefine SIZE_MAX in config.h if config.h is re-included after dnl . Remember that the #undef in AH_VERBATIM gets replaced with dnl #define by AC_DEFINE_UNQUOTED. AH_VERBATIM([SIZE_MAX], [/* Define as the maximum value of type 'size_t', if the system doesn't define it. */ #ifndef SIZE_MAX # undef SIZE_MAX #endif]) ]) pspp-1.4.1/gl/m4/write.m40000644000175000017500000000203013723215637014435 0ustar00blpblp00000000000000# write.m4 serial 6 dnl Copyright (C) 2008-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_FUNC_WRITE], [ AC_REQUIRE([gl_UNISTD_H_DEFAULTS]) m4_ifdef([gl_MSVC_INVAL], [ AC_REQUIRE([gl_MSVC_INVAL]) if test $HAVE_MSVC_INVALID_PARAMETER_HANDLER = 1; then REPLACE_WRITE=1 fi ]) dnl This ifdef is just an optimization, to avoid performing a configure dnl check whose result is not used. It does not make the test of dnl GNULIB_UNISTD_H_SIGPIPE or GNULIB_SIGPIPE redundant. m4_ifdef([gl_SIGNAL_SIGPIPE], [ gl_SIGNAL_SIGPIPE if test $gl_cv_header_signal_h_SIGPIPE != yes; then REPLACE_WRITE=1 fi ]) m4_ifdef([gl_NONBLOCKING_IO], [ gl_NONBLOCKING_IO if test $gl_cv_have_nonblocking != yes; then REPLACE_WRITE=1 fi ]) ]) # Prerequisites of lib/write.c. AC_DEFUN([gl_PREREQ_WRITE], [:]) pspp-1.4.1/gl/m4/stdlib_h.m40000644000175000017500000001517113723215637015105 0ustar00blpblp00000000000000# stdlib_h.m4 serial 49 dnl Copyright (C) 2007-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_STDLIB_H], [ AC_REQUIRE([gl_STDLIB_H_DEFAULTS]) gl_NEXT_HEADERS([stdlib.h]) dnl Check for declarations of anything we want to poison if the dnl corresponding gnulib module is not in use, and which is not dnl guaranteed by C89. gl_WARN_ON_USE_PREPARE([[#include #if HAVE_SYS_LOADAVG_H /* OpenIndiana has a bug: must be included before . */ # include # include #endif #if HAVE_RANDOM_H # include #endif ]], [_Exit atoll canonicalize_file_name getloadavg getsubopt grantpt initstate initstate_r mbtowc mkdtemp mkostemp mkostemps mkstemp mkstemps posix_openpt ptsname ptsname_r qsort_r random random_r reallocarray realpath rpmatch secure_getenv setenv setstate setstate_r srandom srandom_r strtod strtold strtoll strtoull unlockpt unsetenv]) AC_REQUIRE([AC_C_RESTRICT]) ]) AC_DEFUN([gl_STDLIB_MODULE_INDICATOR], [ dnl Use AC_REQUIRE here, so that the default settings are expanded once only. AC_REQUIRE([gl_STDLIB_H_DEFAULTS]) gl_MODULE_INDICATOR_SET_VARIABLE([$1]) dnl Define it also as a C macro, for the benefit of the unit tests. gl_MODULE_INDICATOR_FOR_TESTS([$1]) ]) AC_DEFUN([gl_STDLIB_H_DEFAULTS], [ GNULIB__EXIT=0; AC_SUBST([GNULIB__EXIT]) GNULIB_ATOLL=0; AC_SUBST([GNULIB_ATOLL]) GNULIB_CALLOC_POSIX=0; AC_SUBST([GNULIB_CALLOC_POSIX]) GNULIB_CANONICALIZE_FILE_NAME=0; AC_SUBST([GNULIB_CANONICALIZE_FILE_NAME]) GNULIB_GETLOADAVG=0; AC_SUBST([GNULIB_GETLOADAVG]) GNULIB_GETSUBOPT=0; AC_SUBST([GNULIB_GETSUBOPT]) GNULIB_GRANTPT=0; AC_SUBST([GNULIB_GRANTPT]) GNULIB_MALLOC_POSIX=0; AC_SUBST([GNULIB_MALLOC_POSIX]) GNULIB_MBTOWC=0; AC_SUBST([GNULIB_MBTOWC]) GNULIB_MKDTEMP=0; AC_SUBST([GNULIB_MKDTEMP]) GNULIB_MKOSTEMP=0; AC_SUBST([GNULIB_MKOSTEMP]) GNULIB_MKOSTEMPS=0; AC_SUBST([GNULIB_MKOSTEMPS]) GNULIB_MKSTEMP=0; AC_SUBST([GNULIB_MKSTEMP]) GNULIB_MKSTEMPS=0; AC_SUBST([GNULIB_MKSTEMPS]) GNULIB_POSIX_OPENPT=0; AC_SUBST([GNULIB_POSIX_OPENPT]) GNULIB_PTSNAME=0; AC_SUBST([GNULIB_PTSNAME]) GNULIB_PTSNAME_R=0; AC_SUBST([GNULIB_PTSNAME_R]) GNULIB_PUTENV=0; AC_SUBST([GNULIB_PUTENV]) GNULIB_QSORT_R=0; AC_SUBST([GNULIB_QSORT_R]) GNULIB_RANDOM=0; AC_SUBST([GNULIB_RANDOM]) GNULIB_RANDOM_R=0; AC_SUBST([GNULIB_RANDOM_R]) GNULIB_REALLOCARRAY=0; AC_SUBST([GNULIB_REALLOCARRAY]) GNULIB_REALLOC_POSIX=0; AC_SUBST([GNULIB_REALLOC_POSIX]) GNULIB_REALPATH=0; AC_SUBST([GNULIB_REALPATH]) GNULIB_RPMATCH=0; AC_SUBST([GNULIB_RPMATCH]) GNULIB_SECURE_GETENV=0; AC_SUBST([GNULIB_SECURE_GETENV]) GNULIB_SETENV=0; AC_SUBST([GNULIB_SETENV]) GNULIB_STRTOD=0; AC_SUBST([GNULIB_STRTOD]) GNULIB_STRTOLD=0; AC_SUBST([GNULIB_STRTOLD]) GNULIB_STRTOLL=0; AC_SUBST([GNULIB_STRTOLL]) GNULIB_STRTOULL=0; AC_SUBST([GNULIB_STRTOULL]) GNULIB_SYSTEM_POSIX=0; AC_SUBST([GNULIB_SYSTEM_POSIX]) GNULIB_UNLOCKPT=0; AC_SUBST([GNULIB_UNLOCKPT]) GNULIB_UNSETENV=0; AC_SUBST([GNULIB_UNSETENV]) GNULIB_WCTOMB=0; AC_SUBST([GNULIB_WCTOMB]) dnl Assume proper GNU behavior unless another module says otherwise. HAVE__EXIT=1; AC_SUBST([HAVE__EXIT]) HAVE_ATOLL=1; AC_SUBST([HAVE_ATOLL]) HAVE_CANONICALIZE_FILE_NAME=1; AC_SUBST([HAVE_CANONICALIZE_FILE_NAME]) HAVE_DECL_GETLOADAVG=1; AC_SUBST([HAVE_DECL_GETLOADAVG]) HAVE_GETSUBOPT=1; AC_SUBST([HAVE_GETSUBOPT]) HAVE_GRANTPT=1; AC_SUBST([HAVE_GRANTPT]) HAVE_INITSTATE=1; AC_SUBST([HAVE_INITSTATE]) HAVE_DECL_INITSTATE=1; AC_SUBST([HAVE_DECL_INITSTATE]) HAVE_MBTOWC=1; AC_SUBST([HAVE_MBTOWC]) HAVE_MKDTEMP=1; AC_SUBST([HAVE_MKDTEMP]) HAVE_MKOSTEMP=1; AC_SUBST([HAVE_MKOSTEMP]) HAVE_MKOSTEMPS=1; AC_SUBST([HAVE_MKOSTEMPS]) HAVE_MKSTEMP=1; AC_SUBST([HAVE_MKSTEMP]) HAVE_MKSTEMPS=1; AC_SUBST([HAVE_MKSTEMPS]) HAVE_POSIX_OPENPT=1; AC_SUBST([HAVE_POSIX_OPENPT]) HAVE_PTSNAME=1; AC_SUBST([HAVE_PTSNAME]) HAVE_PTSNAME_R=1; AC_SUBST([HAVE_PTSNAME_R]) HAVE_QSORT_R=1; AC_SUBST([HAVE_QSORT_R]) HAVE_RANDOM=1; AC_SUBST([HAVE_RANDOM]) HAVE_RANDOM_H=1; AC_SUBST([HAVE_RANDOM_H]) HAVE_RANDOM_R=1; AC_SUBST([HAVE_RANDOM_R]) HAVE_REALLOCARRAY=1; AC_SUBST([HAVE_REALLOCARRAY]) HAVE_REALPATH=1; AC_SUBST([HAVE_REALPATH]) HAVE_RPMATCH=1; AC_SUBST([HAVE_RPMATCH]) HAVE_SECURE_GETENV=1; AC_SUBST([HAVE_SECURE_GETENV]) HAVE_SETENV=1; AC_SUBST([HAVE_SETENV]) HAVE_DECL_SETENV=1; AC_SUBST([HAVE_DECL_SETENV]) HAVE_SETSTATE=1; AC_SUBST([HAVE_SETSTATE]) HAVE_DECL_SETSTATE=1; AC_SUBST([HAVE_DECL_SETSTATE]) HAVE_STRTOD=1; AC_SUBST([HAVE_STRTOD]) HAVE_STRTOLD=1; AC_SUBST([HAVE_STRTOLD]) HAVE_STRTOLL=1; AC_SUBST([HAVE_STRTOLL]) HAVE_STRTOULL=1; AC_SUBST([HAVE_STRTOULL]) HAVE_STRUCT_RANDOM_DATA=1; AC_SUBST([HAVE_STRUCT_RANDOM_DATA]) HAVE_SYS_LOADAVG_H=0; AC_SUBST([HAVE_SYS_LOADAVG_H]) HAVE_UNLOCKPT=1; AC_SUBST([HAVE_UNLOCKPT]) HAVE_DECL_UNSETENV=1; AC_SUBST([HAVE_DECL_UNSETENV]) REPLACE_CALLOC=0; AC_SUBST([REPLACE_CALLOC]) REPLACE_CANONICALIZE_FILE_NAME=0; AC_SUBST([REPLACE_CANONICALIZE_FILE_NAME]) REPLACE_INITSTATE=0; AC_SUBST([REPLACE_INITSTATE]) REPLACE_MALLOC=0; AC_SUBST([REPLACE_MALLOC]) REPLACE_MBTOWC=0; AC_SUBST([REPLACE_MBTOWC]) REPLACE_MKSTEMP=0; AC_SUBST([REPLACE_MKSTEMP]) REPLACE_PTSNAME=0; AC_SUBST([REPLACE_PTSNAME]) REPLACE_PTSNAME_R=0; AC_SUBST([REPLACE_PTSNAME_R]) REPLACE_PUTENV=0; AC_SUBST([REPLACE_PUTENV]) REPLACE_QSORT_R=0; AC_SUBST([REPLACE_QSORT_R]) REPLACE_RANDOM=0; AC_SUBST([REPLACE_RANDOM]) REPLACE_RANDOM_R=0; AC_SUBST([REPLACE_RANDOM_R]) REPLACE_REALLOC=0; AC_SUBST([REPLACE_REALLOC]) REPLACE_REALPATH=0; AC_SUBST([REPLACE_REALPATH]) REPLACE_SETENV=0; AC_SUBST([REPLACE_SETENV]) REPLACE_SETSTATE=0; AC_SUBST([REPLACE_SETSTATE]) REPLACE_STRTOD=0; AC_SUBST([REPLACE_STRTOD]) REPLACE_STRTOLD=0; AC_SUBST([REPLACE_STRTOLD]) REPLACE_UNSETENV=0; AC_SUBST([REPLACE_UNSETENV]) REPLACE_WCTOMB=0; AC_SUBST([REPLACE_WCTOMB]) ]) pspp-1.4.1/gl/m4/mktime.m40000644000175000017500000002063013723215637014577 0ustar00blpblp00000000000000# serial 32 dnl Copyright (C) 2002-2003, 2005-2007, 2009-2020 Free Software Foundation, dnl Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl From Jim Meyering. AC_DEFUN([gl_TIME_T_IS_SIGNED], [ AC_CACHE_CHECK([whether time_t is signed], [gl_cv_time_t_is_signed], [AC_COMPILE_IFELSE( [AC_LANG_PROGRAM([[#include char time_t_signed[(time_t) -1 < 0 ? 1 : -1];]])], [gl_cv_time_t_is_signed=yes], [gl_cv_time_t_is_signed=no])]) if test $gl_cv_time_t_is_signed = yes; then AC_DEFINE([TIME_T_IS_SIGNED], [1], [Define to 1 if time_t is signed.]) fi ]) dnl Test whether mktime works. Set gl_cv_func_working_mktime. AC_DEFUN([gl_FUNC_MKTIME_WORKS], [ AC_REQUIRE([gl_TIME_T_IS_SIGNED]) AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles dnl We don't use AC_FUNC_MKTIME any more, because it is no longer maintained dnl in Autoconf and because it invokes AC_LIBOBJ. AC_CHECK_HEADERS_ONCE([unistd.h]) AC_CHECK_DECLS_ONCE([alarm]) AC_CHECK_FUNCS_ONCE([tzset]) AC_REQUIRE([gl_MULTIARCH]) AC_CACHE_CHECK([for working mktime], [gl_cv_func_working_mktime], [if test $APPLE_UNIVERSAL_BUILD = 1; then # A universal build on Apple Mac OS X platforms. # The test result would be 'yes' in 32-bit mode and 'no' in 64-bit mode. # But we need a configuration result that is valid in both modes. gl_cv_func_working_mktime="guessing no" else AC_RUN_IFELSE( [AC_LANG_SOURCE( [[/* Test program from Paul Eggert and Tony Leneis. */ #include #include #include #ifdef HAVE_UNISTD_H # include #endif #if HAVE_DECL_ALARM # include #endif #ifndef TIME_T_IS_SIGNED # define TIME_T_IS_SIGNED 0 #endif /* Work around redefinition to rpl_putenv by other config tests. */ #undef putenv static time_t time_t_max; static time_t time_t_min; /* Values we'll use to set the TZ environment variable. */ static char *tz_strings[] = { (char *) 0, "TZ=GMT0", "TZ=JST-9", "TZ=EST+3EDT+2,M10.1.0/00:00:00,M2.3.0/00:00:00" }; #define N_STRINGS (sizeof (tz_strings) / sizeof (tz_strings[0])) /* Return 0 if mktime fails to convert a date in the spring-forward gap. Based on a problem report from Andreas Jaeger. */ static int spring_forward_gap () { /* glibc (up to about 1998-10-07) failed this test. */ struct tm tm; /* Use the portable POSIX.1 specification "TZ=PST8PDT,M4.1.0,M10.5.0" instead of "TZ=America/Vancouver" in order to detect the bug even on systems that don't support the Olson extension, or don't have the full zoneinfo tables installed. */ putenv ("TZ=PST8PDT,M4.1.0,M10.5.0"); tm.tm_year = 98; tm.tm_mon = 3; tm.tm_mday = 5; tm.tm_hour = 2; tm.tm_min = 0; tm.tm_sec = 0; tm.tm_isdst = -1; return mktime (&tm) != (time_t) -1; } static int mktime_test1 (time_t now) { struct tm *lt; return ! (lt = localtime (&now)) || mktime (lt) == now; } static int mktime_test (time_t now) { return (mktime_test1 (now) && mktime_test1 ((time_t) (time_t_max - now)) && mktime_test1 ((time_t) (time_t_min + now))); } static int irix_6_4_bug () { /* Based on code from Ariel Faigon. */ struct tm tm; tm.tm_year = 96; tm.tm_mon = 3; tm.tm_mday = 0; tm.tm_hour = 0; tm.tm_min = 0; tm.tm_sec = 0; tm.tm_isdst = -1; mktime (&tm); return tm.tm_mon == 2 && tm.tm_mday == 31; } static int bigtime_test (int j) { struct tm tm; time_t now; tm.tm_year = tm.tm_mon = tm.tm_mday = tm.tm_hour = tm.tm_min = tm.tm_sec = j; now = mktime (&tm); if (now != (time_t) -1) { struct tm *lt = localtime (&now); if (! (lt && lt->tm_year == tm.tm_year && lt->tm_mon == tm.tm_mon && lt->tm_mday == tm.tm_mday && lt->tm_hour == tm.tm_hour && lt->tm_min == tm.tm_min && lt->tm_sec == tm.tm_sec && lt->tm_yday == tm.tm_yday && lt->tm_wday == tm.tm_wday && ((lt->tm_isdst < 0 ? -1 : 0 < lt->tm_isdst) == (tm.tm_isdst < 0 ? -1 : 0 < tm.tm_isdst)))) return 0; } return 1; } static int year_2050_test () { /* The correct answer for 2050-02-01 00:00:00 in Pacific time, ignoring leap seconds. */ unsigned long int answer = 2527315200UL; struct tm tm; time_t t; tm.tm_year = 2050 - 1900; tm.tm_mon = 2 - 1; tm.tm_mday = 1; tm.tm_hour = tm.tm_min = tm.tm_sec = 0; tm.tm_isdst = -1; /* Use the portable POSIX.1 specification "TZ=PST8PDT,M4.1.0,M10.5.0" instead of "TZ=America/Vancouver" in order to detect the bug even on systems that don't support the Olson extension, or don't have the full zoneinfo tables installed. */ putenv ("TZ=PST8PDT,M4.1.0,M10.5.0"); t = mktime (&tm); /* Check that the result is either a failure, or close enough to the correct answer that we can assume the discrepancy is due to leap seconds. */ return (t == (time_t) -1 || (0 < t && answer - 120 <= t && t <= answer + 120)); } int main () { int result = 0; time_t t, delta; int i, j; int time_t_signed_magnitude = (time_t) ~ (time_t) 0 < (time_t) -1; #if HAVE_DECL_ALARM /* This test makes some buggy mktime implementations loop. Give up after 60 seconds; a mktime slower than that isn't worth using anyway. */ signal (SIGALRM, SIG_DFL); alarm (60); #endif time_t_max = (! TIME_T_IS_SIGNED ? (time_t) -1 : ((((time_t) 1 << (sizeof (time_t) * CHAR_BIT - 2)) - 1) * 2 + 1)); time_t_min = (! TIME_T_IS_SIGNED ? (time_t) 0 : time_t_signed_magnitude ? ~ (time_t) 0 : ~ time_t_max); delta = time_t_max / 997; /* a suitable prime number */ for (i = 0; i < N_STRINGS; i++) { if (tz_strings[i]) putenv (tz_strings[i]); for (t = 0; t <= time_t_max - delta && (result & 1) == 0; t += delta) if (! mktime_test (t)) result |= 1; if ((result & 2) == 0 && ! (mktime_test ((time_t) 1) && mktime_test ((time_t) (60 * 60)) && mktime_test ((time_t) (60 * 60 * 24)))) result |= 2; for (j = 1; (result & 4) == 0; j <<= 1) { if (! bigtime_test (j)) result |= 4; if (INT_MAX / 2 < j) break; } if ((result & 8) == 0 && ! bigtime_test (INT_MAX)) result |= 8; } if (! irix_6_4_bug ()) result |= 16; if (! spring_forward_gap ()) result |= 32; if (! year_2050_test ()) result |= 64; return result; }]])], [gl_cv_func_working_mktime=yes], [gl_cv_func_working_mktime=no], [case "$host_os" in # Guess no on native Windows. mingw*) gl_cv_func_working_mktime="guessing no" ;; *) gl_cv_func_working_mktime="$gl_cross_guess_normal" ;; esac ]) fi ]) ]) dnl Main macro of module 'mktime'. AC_DEFUN([gl_FUNC_MKTIME], [ AC_REQUIRE([gl_HEADER_TIME_H_DEFAULTS]) AC_REQUIRE([AC_CANONICAL_HOST]) AC_REQUIRE([gl_FUNC_MKTIME_WORKS]) REPLACE_MKTIME=0 if test "$gl_cv_func_working_mktime" != yes; then REPLACE_MKTIME=1 AC_DEFINE([NEED_MKTIME_WORKING], [1], [Define if the compilation of mktime.c should define 'mktime' with the algorithmic workarounds.]) fi case "$host_os" in mingw*) REPLACE_MKTIME=1 AC_DEFINE([NEED_MKTIME_WINDOWS], [1], [Define if the compilation of mktime.c should define 'mktime' with the native Windows TZ workaround.]) ;; esac ]) dnl Main macro of module 'mktime-internal'. AC_DEFUN([gl_FUNC_MKTIME_INTERNAL], [ AC_REQUIRE([gl_FUNC_MKTIME_WORKS]) WANT_MKTIME_INTERNAL=0 dnl BeOS has __mktime_internal in libc, but other platforms don't. AC_CHECK_FUNC([__mktime_internal], [AC_DEFINE([mktime_internal], [__mktime_internal], [Define to the real name of the mktime_internal function.]) ], [dnl mktime works but it doesn't export __mktime_internal, dnl so we need to substitute our own mktime implementation. WANT_MKTIME_INTERNAL=1 AC_DEFINE([NEED_MKTIME_INTERNAL], [1], [Define if the compilation of mktime.c should define 'mktime_internal'.]) ]) ]) # Prerequisites of lib/mktime.c. AC_DEFUN([gl_PREREQ_MKTIME], [:]) pspp-1.4.1/gl/m4/secure_getenv.m40000644000175000017500000000152413723215637016150 0ustar00blpblp00000000000000# Look up an environment variable more securely. dnl Copyright 2013-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_FUNC_SECURE_GETENV], [ dnl Persuade glibc to declare secure_getenv(). AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS]) AC_REQUIRE([gl_STDLIB_H_DEFAULTS]) AC_CHECK_FUNCS_ONCE([secure_getenv]) if test $ac_cv_func_secure_getenv = no; then HAVE_SECURE_GETENV=0 fi ]) # Prerequisites of lib/secure_getenv.c. AC_DEFUN([gl_PREREQ_SECURE_GETENV], [ AC_CHECK_FUNCS([__secure_getenv]) if test $ac_cv_func___secure_getenv = no; then AC_CHECK_FUNCS([issetugid]) fi AC_CHECK_FUNCS_ONCE([getuid geteuid getgid getegid]) ]) pspp-1.4.1/gl/m4/string_h.m40000644000175000017500000001302213723215637015123 0ustar00blpblp00000000000000# Configure a GNU-like replacement for . # Copyright (C) 2007-2020 Free Software Foundation, Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 24 # Written by Paul Eggert. AC_DEFUN([gl_HEADER_STRING_H], [ dnl Use AC_REQUIRE here, so that the default behavior below is expanded dnl once only, before all statements that occur in other macros. AC_REQUIRE([gl_HEADER_STRING_H_BODY]) ]) AC_DEFUN([gl_HEADER_STRING_H_BODY], [ AC_REQUIRE([gl_HEADER_STRING_H_DEFAULTS]) gl_NEXT_HEADERS([string.h]) dnl Check for declarations of anything we want to poison if the dnl corresponding gnulib module is not in use, and which is not dnl guaranteed by C89. gl_WARN_ON_USE_PREPARE([[#include ]], [ffsl ffsll memmem mempcpy memrchr rawmemchr stpcpy stpncpy strchrnul strdup strncat strndup strnlen strpbrk strsep strcasestr strtok_r strerror_r strsignal strverscmp]) AC_REQUIRE([AC_C_RESTRICT]) ]) AC_DEFUN([gl_STRING_MODULE_INDICATOR], [ dnl Use AC_REQUIRE here, so that the default settings are expanded once only. AC_REQUIRE([gl_HEADER_STRING_H_DEFAULTS]) gl_MODULE_INDICATOR_SET_VARIABLE([$1]) dnl Define it also as a C macro, for the benefit of the unit tests. gl_MODULE_INDICATOR_FOR_TESTS([$1]) ]) AC_DEFUN([gl_HEADER_STRING_H_DEFAULTS], [ GNULIB_EXPLICIT_BZERO=0; AC_SUBST([GNULIB_EXPLICIT_BZERO]) GNULIB_FFSL=0; AC_SUBST([GNULIB_FFSL]) GNULIB_FFSLL=0; AC_SUBST([GNULIB_FFSLL]) GNULIB_MEMCHR=0; AC_SUBST([GNULIB_MEMCHR]) GNULIB_MEMMEM=0; AC_SUBST([GNULIB_MEMMEM]) GNULIB_MEMPCPY=0; AC_SUBST([GNULIB_MEMPCPY]) GNULIB_MEMRCHR=0; AC_SUBST([GNULIB_MEMRCHR]) GNULIB_RAWMEMCHR=0; AC_SUBST([GNULIB_RAWMEMCHR]) GNULIB_STPCPY=0; AC_SUBST([GNULIB_STPCPY]) GNULIB_STPNCPY=0; AC_SUBST([GNULIB_STPNCPY]) GNULIB_STRCHRNUL=0; AC_SUBST([GNULIB_STRCHRNUL]) GNULIB_STRDUP=0; AC_SUBST([GNULIB_STRDUP]) GNULIB_STRNCAT=0; AC_SUBST([GNULIB_STRNCAT]) GNULIB_STRNDUP=0; AC_SUBST([GNULIB_STRNDUP]) GNULIB_STRNLEN=0; AC_SUBST([GNULIB_STRNLEN]) GNULIB_STRPBRK=0; AC_SUBST([GNULIB_STRPBRK]) GNULIB_STRSEP=0; AC_SUBST([GNULIB_STRSEP]) GNULIB_STRSTR=0; AC_SUBST([GNULIB_STRSTR]) GNULIB_STRCASESTR=0; AC_SUBST([GNULIB_STRCASESTR]) GNULIB_STRTOK_R=0; AC_SUBST([GNULIB_STRTOK_R]) GNULIB_MBSLEN=0; AC_SUBST([GNULIB_MBSLEN]) GNULIB_MBSNLEN=0; AC_SUBST([GNULIB_MBSNLEN]) GNULIB_MBSCHR=0; AC_SUBST([GNULIB_MBSCHR]) GNULIB_MBSRCHR=0; AC_SUBST([GNULIB_MBSRCHR]) GNULIB_MBSSTR=0; AC_SUBST([GNULIB_MBSSTR]) GNULIB_MBSCASECMP=0; AC_SUBST([GNULIB_MBSCASECMP]) GNULIB_MBSNCASECMP=0; AC_SUBST([GNULIB_MBSNCASECMP]) GNULIB_MBSPCASECMP=0; AC_SUBST([GNULIB_MBSPCASECMP]) GNULIB_MBSCASESTR=0; AC_SUBST([GNULIB_MBSCASESTR]) GNULIB_MBSCSPN=0; AC_SUBST([GNULIB_MBSCSPN]) GNULIB_MBSPBRK=0; AC_SUBST([GNULIB_MBSPBRK]) GNULIB_MBSSPN=0; AC_SUBST([GNULIB_MBSSPN]) GNULIB_MBSSEP=0; AC_SUBST([GNULIB_MBSSEP]) GNULIB_MBSTOK_R=0; AC_SUBST([GNULIB_MBSTOK_R]) GNULIB_STRERROR=0; AC_SUBST([GNULIB_STRERROR]) GNULIB_STRERROR_R=0; AC_SUBST([GNULIB_STRERROR_R]) GNULIB_STRSIGNAL=0; AC_SUBST([GNULIB_STRSIGNAL]) GNULIB_STRVERSCMP=0; AC_SUBST([GNULIB_STRVERSCMP]) HAVE_MBSLEN=0; AC_SUBST([HAVE_MBSLEN]) dnl Assume proper GNU behavior unless another module says otherwise. HAVE_EXPLICIT_BZERO=1; AC_SUBST([HAVE_EXPLICIT_BZERO]) HAVE_FFSL=1; AC_SUBST([HAVE_FFSL]) HAVE_FFSLL=1; AC_SUBST([HAVE_FFSLL]) HAVE_DECL_MEMMEM=1; AC_SUBST([HAVE_DECL_MEMMEM]) HAVE_MEMPCPY=1; AC_SUBST([HAVE_MEMPCPY]) HAVE_DECL_MEMRCHR=1; AC_SUBST([HAVE_DECL_MEMRCHR]) HAVE_RAWMEMCHR=1; AC_SUBST([HAVE_RAWMEMCHR]) HAVE_STPCPY=1; AC_SUBST([HAVE_STPCPY]) HAVE_STPNCPY=1; AC_SUBST([HAVE_STPNCPY]) HAVE_STRCHRNUL=1; AC_SUBST([HAVE_STRCHRNUL]) HAVE_DECL_STRDUP=1; AC_SUBST([HAVE_DECL_STRDUP]) HAVE_DECL_STRNDUP=1; AC_SUBST([HAVE_DECL_STRNDUP]) HAVE_DECL_STRNLEN=1; AC_SUBST([HAVE_DECL_STRNLEN]) HAVE_STRPBRK=1; AC_SUBST([HAVE_STRPBRK]) HAVE_STRSEP=1; AC_SUBST([HAVE_STRSEP]) HAVE_STRCASESTR=1; AC_SUBST([HAVE_STRCASESTR]) HAVE_DECL_STRTOK_R=1; AC_SUBST([HAVE_DECL_STRTOK_R]) HAVE_DECL_STRERROR_R=1; AC_SUBST([HAVE_DECL_STRERROR_R]) HAVE_DECL_STRSIGNAL=1; AC_SUBST([HAVE_DECL_STRSIGNAL]) HAVE_STRVERSCMP=1; AC_SUBST([HAVE_STRVERSCMP]) REPLACE_MEMCHR=0; AC_SUBST([REPLACE_MEMCHR]) REPLACE_MEMMEM=0; AC_SUBST([REPLACE_MEMMEM]) REPLACE_STPNCPY=0; AC_SUBST([REPLACE_STPNCPY]) REPLACE_STRCHRNUL=0; AC_SUBST([REPLACE_STRCHRNUL]) REPLACE_STRDUP=0; AC_SUBST([REPLACE_STRDUP]) REPLACE_STRNCAT=0; AC_SUBST([REPLACE_STRNCAT]) REPLACE_STRNDUP=0; AC_SUBST([REPLACE_STRNDUP]) REPLACE_STRNLEN=0; AC_SUBST([REPLACE_STRNLEN]) REPLACE_STRSTR=0; AC_SUBST([REPLACE_STRSTR]) REPLACE_STRCASESTR=0; AC_SUBST([REPLACE_STRCASESTR]) REPLACE_STRTOK_R=0; AC_SUBST([REPLACE_STRTOK_R]) REPLACE_STRERROR=0; AC_SUBST([REPLACE_STRERROR]) REPLACE_STRERROR_R=0; AC_SUBST([REPLACE_STRERROR_R]) REPLACE_STRSIGNAL=0; AC_SUBST([REPLACE_STRSIGNAL]) UNDEFINE_STRTOK_R=0; AC_SUBST([UNDEFINE_STRTOK_R]) ]) pspp-1.4.1/gl/m4/absolute-header.m40000644000175000017500000001034713723215637016361 0ustar00blpblp00000000000000# absolute-header.m4 serial 16 dnl Copyright (C) 2006-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl From Derek Price. # gl_ABSOLUTE_HEADER(HEADER1 HEADER2 ...) # --------------------------------------- # Find the absolute name of a header file, testing first if the header exists. # If the header were sys/inttypes.h, this macro would define # ABSOLUTE_SYS_INTTYPES_H to the '""' quoted absolute name of sys/inttypes.h # in config.h # (e.g. '#define ABSOLUTE_SYS_INTTYPES_H "///usr/include/sys/inttypes.h"'). # The three "///" are to pacify Sun C 5.8, which otherwise would say # "warning: #include of /usr/include/... may be non-portable". # Use '""', not '<>', so that the /// cannot be confused with a C99 comment. # Note: This macro assumes that the header file is not empty after # preprocessing, i.e. it does not only define preprocessor macros but also # provides some type/enum definitions or function/variable declarations. AC_DEFUN([gl_ABSOLUTE_HEADER], [AC_REQUIRE([AC_CANONICAL_HOST]) AC_LANG_PREPROC_REQUIRE()dnl dnl FIXME: gl_absolute_header and ac_header_exists must be used unquoted dnl until we can assume autoconf 2.64 or newer. m4_foreach_w([gl_HEADER_NAME], [$1], [AS_VAR_PUSHDEF([gl_absolute_header], [gl_cv_absolute_]m4_defn([gl_HEADER_NAME]))dnl AC_CACHE_CHECK([absolute name of <]m4_defn([gl_HEADER_NAME])[>], m4_defn([gl_absolute_header]), [AS_VAR_PUSHDEF([ac_header_exists], [ac_cv_header_]m4_defn([gl_HEADER_NAME]))dnl AC_CHECK_HEADERS_ONCE(m4_defn([gl_HEADER_NAME]))dnl if test AS_VAR_GET(ac_header_exists) = yes; then gl_ABSOLUTE_HEADER_ONE(m4_defn([gl_HEADER_NAME])) fi AS_VAR_POPDEF([ac_header_exists])dnl ])dnl AC_DEFINE_UNQUOTED(AS_TR_CPP([ABSOLUTE_]m4_defn([gl_HEADER_NAME])), ["AS_VAR_GET(gl_absolute_header)"], [Define this to an absolute name of <]m4_defn([gl_HEADER_NAME])[>.]) AS_VAR_POPDEF([gl_absolute_header])dnl ])dnl ])# gl_ABSOLUTE_HEADER # gl_ABSOLUTE_HEADER_ONE(HEADER) # ------------------------------ # Like gl_ABSOLUTE_HEADER, except that: # - it assumes that the header exists, # - it uses the current CPPFLAGS, # - it does not cache the result, # - it is silent. AC_DEFUN([gl_ABSOLUTE_HEADER_ONE], [ AC_REQUIRE([AC_CANONICAL_HOST]) AC_LANG_CONFTEST([AC_LANG_SOURCE([[#include <]]m4_dquote([$1])[[>]])]) dnl AIX "xlc -E" and "cc -E" omit #line directives for header files dnl that contain only a #include of other header files and no dnl non-comment tokens of their own. This leads to a failure to dnl detect the absolute name of , , dnl and others. The workaround is to force preservation of comments dnl through option -C. This ensures all necessary #line directives dnl are present. GCC supports option -C as well. case "$host_os" in aix*) gl_absname_cpp="$ac_cpp -C" ;; *) gl_absname_cpp="$ac_cpp" ;; esac changequote(,) case "$host_os" in mingw*) dnl For the sake of native Windows compilers (excluding gcc), dnl treat backslash as a directory separator, like /. dnl Actually, these compilers use a double-backslash as dnl directory separator, inside the dnl # line "filename" dnl directives. gl_dirsep_regex='[/\\]' ;; *) gl_dirsep_regex='\/' ;; esac dnl A sed expression that turns a string into a basic regular dnl expression, for use within "/.../". gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g' gl_header_literal_regex=`echo '$1' \ | sed -e "$gl_make_literal_regex_sed"` gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{ s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/ s|^/[^/]|//&| p q }' changequote([,]) dnl eval is necessary to expand gl_absname_cpp. dnl Ultrix and Pyramid sh refuse to redirect output of eval, dnl so use subshell. AS_VAR_SET([gl_cv_absolute_]AS_TR_SH([[$1]]), [`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&AS_MESSAGE_LOG_FD | sed -n "$gl_absolute_header_sed"`]) ]) pspp-1.4.1/gl/m4/xstrndup.m40000644000175000017500000000063113723215637015177 0ustar00blpblp00000000000000# xstrndup.m4 serial 2 dnl Copyright (C) 2003, 2009-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_XSTRNDUP], [ gl_PREREQ_XSTRNDUP ]) # Prerequisites of lib/xstrndup.c. AC_DEFUN([gl_PREREQ_XSTRNDUP], [ : ]) pspp-1.4.1/gl/m4/sprintf-posix.m40000644000175000017500000001023313723215637016134 0ustar00blpblp00000000000000# sprintf-posix.m4 serial 12 dnl Copyright (C) 2007-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_FUNC_SPRINTF_POSIX], [ AC_REQUIRE([gl_PRINTF_SIZES_C99]) AC_REQUIRE([gl_PRINTF_LONG_DOUBLE]) AC_REQUIRE([gl_PRINTF_INFINITE]) AC_REQUIRE([gl_PRINTF_INFINITE_LONG_DOUBLE]) AC_REQUIRE([gl_PRINTF_DIRECTIVE_A]) AC_REQUIRE([gl_PRINTF_DIRECTIVE_F]) AC_REQUIRE([gl_PRINTF_DIRECTIVE_N]) AC_REQUIRE([gl_PRINTF_DIRECTIVE_LS]) AC_REQUIRE([gl_PRINTF_POSITIONS]) AC_REQUIRE([gl_PRINTF_FLAG_GROUPING]) AC_REQUIRE([gl_PRINTF_FLAG_LEFTADJUST]) AC_REQUIRE([gl_PRINTF_FLAG_ZERO]) AC_REQUIRE([gl_PRINTF_PRECISION]) AC_REQUIRE([gl_PRINTF_ENOMEM]) gl_cv_func_sprintf_posix=no case "$gl_cv_func_printf_sizes_c99" in *yes) case "$gl_cv_func_printf_long_double" in *yes) case "$gl_cv_func_printf_infinite" in *yes) case "$gl_cv_func_printf_infinite_long_double" in *yes) case "$gl_cv_func_printf_directive_a" in *yes) case "$gl_cv_func_printf_directive_f" in *yes) case "$gl_cv_func_printf_directive_n" in *yes) case "$gl_cv_func_printf_directive_ls" in *yes) case "$gl_cv_func_printf_positions" in *yes) case "$gl_cv_func_printf_flag_grouping" in *yes) case "$gl_cv_func_printf_flag_leftadjust" in *yes) case "$gl_cv_func_printf_flag_zero" in *yes) case "$gl_cv_func_printf_precision" in *yes) case "$gl_cv_func_printf_enomem" in *yes) # sprintf exists and is # already POSIX compliant. gl_cv_func_sprintf_posix=yes ;; esac ;; esac ;; esac ;; esac ;; esac ;; esac ;; esac ;; esac ;; esac ;; esac ;; esac ;; esac ;; esac ;; esac if test $gl_cv_func_sprintf_posix = no; then gl_PREREQ_VASNPRINTF_LONG_DOUBLE gl_PREREQ_VASNPRINTF_INFINITE_DOUBLE gl_PREREQ_VASNPRINTF_INFINITE_LONG_DOUBLE gl_PREREQ_VASNPRINTF_DIRECTIVE_A gl_PREREQ_VASNPRINTF_DIRECTIVE_F gl_PREREQ_VASNPRINTF_DIRECTIVE_LS gl_PREREQ_VASNPRINTF_FLAG_GROUPING gl_PREREQ_VASNPRINTF_FLAG_LEFTADJUST gl_PREREQ_VASNPRINTF_FLAG_ZERO gl_PREREQ_VASNPRINTF_PRECISION gl_PREREQ_VASNPRINTF_ENOMEM gl_REPLACE_VASNPRINTF gl_REPLACE_SPRINTF fi ]) AC_DEFUN([gl_REPLACE_SPRINTF], [ AC_REQUIRE([gl_STDIO_H_DEFAULTS]) AC_LIBOBJ([sprintf]) REPLACE_SPRINTF=1 gl_PREREQ_SPRINTF ]) AC_DEFUN([gl_PREREQ_SPRINTF], [:]) pspp-1.4.1/gl/m4/wcrtomb.m40000644000175000017500000001236513723215637014774 0ustar00blpblp00000000000000# wcrtomb.m4 serial 16 dnl Copyright (C) 2008-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_FUNC_WCRTOMB], [ AC_REQUIRE([gl_WCHAR_H_DEFAULTS]) AC_REQUIRE([AC_TYPE_MBSTATE_T]) gl_MBSTATE_T_BROKEN AC_CHECK_FUNCS_ONCE([wcrtomb]) if test $ac_cv_func_wcrtomb = no; then HAVE_WCRTOMB=0 AC_CHECK_DECLS([wcrtomb],,, [[ /* Tru64 with Desktop Toolkit C has a bug: must be included before . BSD/OS 4.0.1 has a bug: , and must be included before . */ #include #include #include #include ]]) if test $ac_cv_have_decl_wcrtomb = yes; then dnl On Minix 3.1.8, the system's declares wcrtomb() although dnl it does not have the function. Avoid a collision with gnulib's dnl replacement. REPLACE_WCRTOMB=1 fi else dnl We don't actually need to override wcrtomb when redefining the semantics dnl of the mbstate_t type. Tested on 32-bit AIX. dnl if test $REPLACE_MBSTATE_T = 1; then dnl REPLACE_WCRTOMB=1 dnl fi if test $REPLACE_WCRTOMB = 0; then dnl On Android 4.3, wcrtomb produces wrong characters in the C locale. dnl On AIX 4.3, OSF/1 5.1 and Solaris <= 11.3, wcrtomb (NULL, 0, NULL) dnl sometimes returns 0 instead of 1. AC_REQUIRE([AC_PROG_CC]) AC_REQUIRE([gt_LOCALE_FR]) AC_REQUIRE([gt_LOCALE_FR_UTF8]) AC_REQUIRE([gt_LOCALE_JA]) AC_REQUIRE([gt_LOCALE_ZH_CN]) AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles AC_CACHE_CHECK([whether wcrtomb works in the C locale], [gl_cv_func_wcrtomb_works], [AC_RUN_IFELSE( [AC_LANG_SOURCE([[ #include #include /* Tru64 with Desktop Toolkit C has a bug: must be included before . BSD/OS 4.0.1 has a bug: , and must be included before . */ #include #include #include int main () { mbstate_t state; char out[64]; int count; memset (&state, 0, sizeof (state)); out[0] = 'x'; count = wcrtomb (out, L'a', &state); return !(count == 1 && out[0] == 'a'); }]])], [gl_cv_func_wcrtomb_works=yes], [gl_cv_func_wcrtomb_works=no], [case "$host_os" in # Guess no on Android. linux*-android*) gl_cv_func_wcrtomb_works="guessing no";; # Guess yes otherwise. *) gl_cv_func_wcrtomb_works="guessing yes";; esac ]) ]) case "$gl_cv_func_wcrtomb_works" in *yes) ;; *) AC_DEFINE([WCRTOMB_C_LOCALE_BUG], [1], [Define if the wcrtomb function does not work in the C locale.]) REPLACE_WCRTOMB=1 ;; esac fi if test $REPLACE_WCRTOMB = 0; then AC_CACHE_CHECK([whether wcrtomb return value is correct], [gl_cv_func_wcrtomb_retval], [ dnl Initial guess, used when cross-compiling or when no suitable locale dnl is present. changequote(,)dnl case "$host_os" in # Guess no on AIX 4, OSF/1, Solaris, native Windows. aix4* | osf* | solaris* | mingw*) gl_cv_func_wcrtomb_retval="guessing no" ;; # Guess yes otherwise. *) gl_cv_func_wcrtomb_retval="guessing yes" ;; esac changequote([,])dnl if test $LOCALE_FR != none || test $LOCALE_FR_UTF8 != none || test $LOCALE_JA != none || test $LOCALE_ZH_CN != none; then AC_RUN_IFELSE( [AC_LANG_SOURCE([[ #include #include /* Tru64 with Desktop Toolkit C has a bug: must be included before . BSD/OS 4.0.1 has a bug: , and must be included before . */ #include #include #include #include #include int main () { int result = 0; if (setlocale (LC_ALL, "$LOCALE_FR") != NULL) { if (wcrtomb (NULL, 0, NULL) != 1) result |= 1; } if (setlocale (LC_ALL, "$LOCALE_FR_UTF8") != NULL) { if (wcrtomb (NULL, 0, NULL) != 1) result |= 2; { wchar_t wc = (wchar_t) 0xBADFACE; if (mbtowc (&wc, "\303\274", 2) == 2) if (wcrtomb (NULL, wc, NULL) != 1) result |= 2; } } if (setlocale (LC_ALL, "$LOCALE_JA") != NULL) { if (wcrtomb (NULL, 0, NULL) != 1) result |= 4; } if (setlocale (LC_ALL, "$LOCALE_ZH_CN") != NULL) { if (wcrtomb (NULL, 0, NULL) != 1) result |= 8; } return result; }]])], [gl_cv_func_wcrtomb_retval=yes], [gl_cv_func_wcrtomb_retval=no], [:]) fi ]) case "$gl_cv_func_wcrtomb_retval" in *yes) ;; *) AC_DEFINE([WCRTOMB_RETVAL_BUG], [1], [Define if the wcrtomb function has an incorrect return value.]) REPLACE_WCRTOMB=1 ;; esac fi fi ]) # Prerequisites of lib/wcrtomb.c. AC_DEFUN([gl_PREREQ_WCRTOMB], [ : ]) pspp-1.4.1/gl/m4/threadlib.m40000644000175000017500000005373413723215637015262 0ustar00blpblp00000000000000# threadlib.m4 serial 27 dnl Copyright (C) 2005-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl From Bruno Haible. AC_PREREQ([2.60]) dnl The general structure of the multithreading modules in gnulib is that we dnl have three set of modules: dnl dnl * POSIX API: dnl pthread, which combines dnl pthread-h dnl pthread-thread dnl pthread-once dnl pthread-mutex dnl pthread-rwlock dnl pthread-cond dnl pthread-tss dnl pthread-spin dnl sched_yield dnl dnl * ISO C API: dnl threads, which combines dnl threads-h dnl thrd dnl mtx dnl cnd dnl tss dnl dnl * Gnulib API, with an implementation that can be chosen at configure dnl time through the option --enable-threads=... dnl thread dnl lock dnl cond dnl tls dnl yield dnl dnl They are independent, except for the fact that dnl - the implementation of the ISO C API may use the POSIX (or some other dnl platform dependent) API, dnl - the implementation of the Gnulib API may use the POSIX or ISO C or dnl some other platform dependent API, depending on the --enable-threads dnl option. dnl dnl This file contains macros for all of these APIs! dnl ============================================================================ dnl Macros for all thread APIs AC_DEFUN([gl_ANYTHREADLIB_EARLY], [ AC_REQUIRE([AC_CANONICAL_HOST]) if test -z "$gl_anythreadlib_early_done"; then case "$host_os" in osf*) # On OSF/1, the compiler needs the flag -D_REENTRANT so that it # groks . cc also understands the flag -pthread, but # we don't use it because 1. gcc-2.95 doesn't understand -pthread, # 2. putting a flag into CPPFLAGS that has an effect on the linker # causes the AC_LINK_IFELSE test below to succeed unexpectedly, # leading to wrong values of LIBTHREAD and LTLIBTHREAD. CPPFLAGS="$CPPFLAGS -D_REENTRANT" ;; esac # Some systems optimize for single-threaded programs by default, and # need special flags to disable these optimizations. For example, the # definition of 'errno' in . case "$host_os" in aix* | freebsd*) CPPFLAGS="$CPPFLAGS -D_THREAD_SAFE" ;; solaris*) CPPFLAGS="$CPPFLAGS -D_REENTRANT" ;; esac gl_anythreadlib_early_done=done fi ]) dnl Checks whether the compiler and linker support weak declarations of symbols. AC_DEFUN([gl_WEAK_SYMBOLS], [ AC_REQUIRE([AC_CANONICAL_HOST]) AC_CACHE_CHECK([whether imported symbols can be declared weak], [gl_cv_have_weak], [gl_cv_have_weak=no dnl First, test whether the compiler accepts it syntactically. AC_LINK_IFELSE( [AC_LANG_PROGRAM( [[extern void xyzzy (); #pragma weak xyzzy]], [[xyzzy();]])], [gl_cv_have_weak=maybe]) if test $gl_cv_have_weak = maybe; then dnl Second, test whether it actually works. On Cygwin 1.7.2, with dnl gcc 4.3, symbols declared weak always evaluate to the address 0. AC_RUN_IFELSE( [AC_LANG_SOURCE([[ #include #pragma weak fputs int main () { return (fputs == NULL); }]])], [gl_cv_have_weak=yes], [gl_cv_have_weak=no], [dnl When cross-compiling, assume that only ELF platforms support dnl weak symbols. AC_EGREP_CPP([Extensible Linking Format], [#ifdef __ELF__ Extensible Linking Format #endif ], [gl_cv_have_weak="guessing yes"], [gl_cv_have_weak="guessing no"]) ]) fi dnl But when linking statically, weak symbols don't work. case " $LDFLAGS " in *" -static "*) gl_cv_have_weak=no ;; esac dnl Test for a bug in FreeBSD 11: A link error occurs when using a weak dnl symbol and linking against a shared library that has a dependency on dnl the shared library that defines the symbol. case "$gl_cv_have_weak" in *yes) case "$host_os" in freebsd* | dragonfly*) : > conftest1.c $CC $CPPFLAGS $CFLAGS $LDFLAGS -fPIC -shared -o libempty.so conftest1.c -lpthread >&AS_MESSAGE_LOG_FD 2>&1 cat < conftest2.c #include #pragma weak pthread_mutexattr_gettype int main () { return (pthread_mutexattr_gettype != NULL); } EOF $CC $CPPFLAGS $CFLAGS $LDFLAGS -o conftest conftest2.c libempty.so >&AS_MESSAGE_LOG_FD 2>&1 \ || gl_cv_have_weak=no rm -f conftest1.c libempty.so conftest2.c conftest ;; esac ;; esac ]) case "$gl_cv_have_weak" in *yes) AC_DEFINE([HAVE_WEAK_SYMBOLS], [1], [Define to 1 if the compiler and linker support weak declarations of symbols.]) ;; esac ]) dnl ============================================================================ dnl Macros for the POSIX API dnl gl_PTHREADLIB dnl ------------- dnl Tests for the libraries needs for using the POSIX threads API. dnl Sets the variable LIBPTHREAD to the linker options for use in a Makefile. dnl Sets the variable LIBPMULTITHREAD, for programs that really need dnl multithread functionality. The difference between LIBPTHREAD and dnl LIBPMULTITHREAD is that on platforms supporting weak symbols, typically dnl LIBPTHREAD is empty whereas LIBPMULTITHREAD is not. dnl Sets the variable LIB_SCHED_YIELD to the linker options needed to use the dnl sched_yield() function. dnl Adds to CPPFLAGS the flag -D_REENTRANT or -D_THREAD_SAFE if needed for dnl multithread-safe programs. dnl Defines the C macro HAVE_PTHREAD_API if (at least parts of) the POSIX dnl threads API is available. dnl The guts of gl_PTHREADLIB. Needs to be expanded only once. AC_DEFUN([gl_PTHREADLIB_BODY], [ AC_REQUIRE([gl_ANYTHREADLIB_EARLY]) if test -z "$gl_pthreadlib_body_done"; then gl_pthread_api=no LIBPTHREAD= LIBPMULTITHREAD= # On OSF/1, the compiler needs the flag -pthread or -D_REENTRANT so that # it groks . It's added above, in gl_ANYTHREADLIB_EARLY. AC_CHECK_HEADER([pthread.h], [gl_have_pthread_h=yes], [gl_have_pthread_h=no]) if test "$gl_have_pthread_h" = yes; then # Other possible tests: # -lpthreads (FSU threads, PCthreads) # -lgthreads # Test whether both pthread_mutex_lock and pthread_mutexattr_init exist # in libc. IRIX 6.5 has the first one in both libc and libpthread, but # the second one only in libpthread, and lock.c needs it. # # If -pthread works, prefer it to -lpthread, since Ubuntu 14.04 # needs -pthread for some reason. See: # https://lists.gnu.org/r/bug-gnulib/2014-09/msg00023.html save_LIBS=$LIBS for gl_pthread in '' '-pthread'; do LIBS="$LIBS $gl_pthread" AC_LINK_IFELSE( [AC_LANG_PROGRAM( [[#include pthread_mutex_t m; pthread_mutexattr_t ma; ]], [[pthread_mutex_lock (&m); pthread_mutexattr_init (&ma);]])], [gl_pthread_api=yes LIBPTHREAD=$gl_pthread LIBPMULTITHREAD=$gl_pthread]) LIBS=$save_LIBS test $gl_pthread_api = yes && break done # Test for libpthread by looking for pthread_kill. (Not pthread_self, # since it is defined as a macro on OSF/1.) if test $gl_pthread_api = yes && test -z "$LIBPTHREAD"; then # The program links fine without libpthread. But it may actually # need to link with libpthread in order to create multiple threads. AC_CHECK_LIB([pthread], [pthread_kill], [LIBPMULTITHREAD=-lpthread # On Solaris and HP-UX, most pthread functions exist also in libc. # Therefore pthread_in_use() needs to actually try to create a # thread: pthread_create from libc will fail, whereas # pthread_create will actually create a thread. # On Solaris 10 or newer, this test is no longer needed, because # libc contains the fully functional pthread functions. case "$host_os" in solaris | solaris2.[1-9] | solaris2.[1-9].* | hpux*) AC_DEFINE([PTHREAD_IN_USE_DETECTION_HARD], [1], [Define if the pthread_in_use() detection is hard.]) esac ]) elif test $gl_pthread_api != yes; then # Some library is needed. Try libpthread and libc_r. AC_CHECK_LIB([pthread], [pthread_kill], [gl_pthread_api=yes LIBPTHREAD=-lpthread LIBPMULTITHREAD=-lpthread]) if test $gl_pthread_api != yes; then # For FreeBSD 4. AC_CHECK_LIB([c_r], [pthread_kill], [gl_pthread_api=yes LIBPTHREAD=-lc_r LIBPMULTITHREAD=-lc_r]) fi fi fi AC_MSG_CHECKING([whether POSIX threads API is available]) AC_MSG_RESULT([$gl_pthread_api]) AC_SUBST([LIBPTHREAD]) AC_SUBST([LIBPMULTITHREAD]) if test $gl_pthread_api = yes; then AC_DEFINE([HAVE_PTHREAD_API], [1], [Define if you have the header and the POSIX threads API.]) fi dnl On some systems, sched_yield is in librt, rather than in libpthread. AC_LINK_IFELSE( [AC_LANG_PROGRAM( [[#include ]], [[sched_yield ();]])], [LIB_SCHED_YIELD= ], [dnl Solaris 7...10 has sched_yield in librt, not in libpthread or libc. AC_CHECK_LIB([rt], [sched_yield], [LIB_SCHED_YIELD=-lrt], [dnl Solaris 2.5.1, 2.6 has sched_yield in libposix4, not librt. AC_CHECK_LIB([posix4], [sched_yield], [LIB_SCHED_YIELD=-lposix4])]) ]) AC_SUBST([LIB_SCHED_YIELD]) gl_pthreadlib_body_done=done fi ]) AC_DEFUN([gl_PTHREADLIB], [ AC_REQUIRE([gl_ANYTHREADLIB_EARLY]) gl_PTHREADLIB_BODY ]) dnl ============================================================================ dnl Macros for the ISO C API dnl gl_STDTHREADLIB dnl --------------- dnl Tests for the libraries needs for using the ISO C threads API. dnl Sets the variable LIBSTDTHREAD to the linker options for use in a Makefile. dnl Adds to CPPFLAGS the flag -D_REENTRANT or -D_THREAD_SAFE if needed for dnl multithread-safe programs. dnl Defines the C macro HAVE_THREADS_H if (at least parts of) the ISO C threads dnl API is available. dnl The guts of gl_STDTHREADLIB. Needs to be expanded only once. AC_DEFUN([gl_STDTHREADLIB_BODY], [ AC_REQUIRE([gl_ANYTHREADLIB_EARLY]) AC_REQUIRE([AC_CANONICAL_HOST]) if test -z "$gl_stdthreadlib_body_done"; then AC_CHECK_HEADERS_ONCE([threads.h]) case "$host_os" in mingw*) LIBSTDTHREAD= ;; *) gl_PTHREADLIB_BODY if test $ac_cv_header_threads_h = yes; then dnl glibc >= 2.29 has thrd_create in libpthread. dnl FreeBSD >= 10 has thrd_create in libstdthreads; this library depends dnl on libpthread (for the symbol 'pthread_mutexattr_gettype'). dnl AIX >= 7.1 and Solaris >= 11.4 have thrd_create in libc. AC_CHECK_FUNCS([thrd_create]) if test $ac_cv_func_thrd_create = yes; then LIBSTDTHREAD= else AC_CHECK_LIB([stdthreads], [thrd_create], [ LIBSTDTHREAD='-lstdthreads -lpthread' ], [ dnl Guess that thrd_create is in libpthread. LIBSTDTHREAD="$LIBPMULTITHREAD" ]) fi else dnl Libraries needed by thrd.c, mtx.c, cnd.c, tss.c. LIBSTDTHREAD="$LIBPMULTITHREAD $LIB_SCHED_YIELD" fi ;; esac AC_SUBST([LIBSTDTHREAD]) AC_MSG_CHECKING([whether ISO C threads API is available]) AC_MSG_RESULT([$ac_cv_header_threads_h]) gl_stdthreadlib_body_done=done fi ]) AC_DEFUN([gl_STDTHREADLIB], [ AC_REQUIRE([gl_ANYTHREADLIB_EARLY]) gl_STDTHREADLIB_BODY ]) dnl ============================================================================ dnl Macros for the Gnulib API dnl gl_THREADLIB dnl ------------ dnl Tests for a multithreading library to be used. dnl If the configure.ac contains a definition of the gl_THREADLIB_DEFAULT_NO dnl (it must be placed before the invocation of gl_THREADLIB_EARLY!), then the dnl default is 'no', otherwise it is system dependent. In both cases, the user dnl can change the choice through the options --enable-threads=choice or dnl --disable-threads. dnl Defines at most one of the macros USE_ISOC_THREADS, USE_POSIX_THREADS, dnl USE_ISOC_AND_POSIX_THREADS, USE_WINDOWS_THREADS. dnl The choice --enable-threads=isoc+posix is available only on platforms that dnl have both the ISO C and the POSIX threads APIs. It has the effect of using dnl the ISO C API for most things and the POSIX API only for creating and dnl controlling threads (because there is no equivalent to pthread_atfork in dnl the ISO C API). dnl Sets the variables LIBTHREAD and LTLIBTHREAD to the linker options for use dnl in a Makefile (LIBTHREAD for use without libtool, LTLIBTHREAD for use with dnl libtool). dnl Sets the variables LIBMULTITHREAD and LTLIBMULTITHREAD similarly, for dnl programs that really need multithread functionality. The difference dnl between LIBTHREAD and LIBMULTITHREAD is that on platforms supporting weak dnl symbols, typically LIBTHREAD is empty whereas LIBMULTITHREAD is not. dnl Adds to CPPFLAGS the flag -D_REENTRANT or -D_THREAD_SAFE if needed for dnl multithread-safe programs. dnl Since support for GNU pth was removed, $LTLIBTHREAD and $LIBTHREAD have the dnl same value, and similarly $LTLIBMULTITHREAD and $LIBMULTITHREAD have the dnl same value. Only system libraries are needed. AC_DEFUN([gl_THREADLIB_EARLY], [ AC_REQUIRE([gl_THREADLIB_EARLY_BODY]) ]) dnl The guts of gl_THREADLIB_EARLY. Needs to be expanded only once. AC_DEFUN([gl_THREADLIB_EARLY_BODY], [ dnl Ordering constraints: This macro modifies CPPFLAGS in a way that dnl influences the result of the autoconf tests that test for *_unlocked dnl declarations, on AIX 5 at least. Therefore it must come early. AC_BEFORE([$0], [gl_FUNC_GLIBC_UNLOCKED_IO])dnl AC_BEFORE([$0], [gl_ARGP])dnl AC_REQUIRE([AC_CANONICAL_HOST]) dnl _GNU_SOURCE is needed for pthread_rwlock_t on glibc systems. AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS]) dnl Check for multithreading. m4_ifdef([gl_THREADLIB_DEFAULT_NO], [m4_divert_text([DEFAULTS], [gl_use_threads_default=no])], [m4_divert_text([DEFAULTS], [gl_use_threads_default=])]) m4_divert_text([DEFAULTS], [gl_use_winpthreads_default=]) AC_ARG_ENABLE([threads], AC_HELP_STRING([--enable-threads={isoc|posix|isoc+posix|windows}], [specify multithreading API])m4_ifdef([gl_THREADLIB_DEFAULT_NO], [], [ AC_HELP_STRING([--disable-threads], [build without multithread safety])]), [gl_use_threads=$enableval], [if test -n "$gl_use_threads_default"; then gl_use_threads="$gl_use_threads_default" else changequote(,)dnl case "$host_os" in dnl Disable multithreading by default on OSF/1, because it interferes dnl with fork()/exec(): When msgexec is linked with -lpthread, its dnl child process gets an endless segmentation fault inside execvp(). osf*) gl_use_threads=no ;; dnl Disable multithreading by default on Cygwin 1.5.x, because it has dnl bugs that lead to endless loops or crashes. See dnl . cygwin*) case `uname -r` in 1.[0-5].*) gl_use_threads=no ;; *) gl_use_threads=yes ;; esac ;; dnl Obey gl_AVOID_WINPTHREAD on mingw. mingw*) case "$gl_use_winpthreads_default" in yes) gl_use_threads=posix ;; no) gl_use_threads=windows ;; *) gl_use_threads=yes ;; esac ;; *) gl_use_threads=yes ;; esac changequote([,])dnl fi ]) if test "$gl_use_threads" = yes \ || test "$gl_use_threads" = isoc \ || test "$gl_use_threads" = posix \ || test "$gl_use_threads" = isoc+posix; then # For using or : gl_ANYTHREADLIB_EARLY fi ]) dnl The guts of gl_THREADLIB. Needs to be expanded only once. AC_DEFUN([gl_THREADLIB_BODY], [ AC_REQUIRE([gl_THREADLIB_EARLY_BODY]) gl_threads_api=none LIBTHREAD= LTLIBTHREAD= LIBMULTITHREAD= LTLIBMULTITHREAD= if test "$gl_use_threads" != no; then dnl Check whether the compiler and linker support weak declarations. gl_WEAK_SYMBOLS if case "$gl_cv_have_weak" in *yes) true;; *) false;; esac; then dnl If we use weak symbols to implement pthread_in_use / pth_in_use / dnl thread_in_use, we also need to test whether the ISO C 11 thrd_create dnl facility is in use. AC_CHECK_HEADERS_ONCE([threads.h]) : fi if test "$gl_use_threads" = isoc || test "$gl_use_threads" = isoc+posix; then AC_CHECK_HEADERS_ONCE([threads.h]) gl_have_isoc_threads="$ac_cv_header_threads_h" fi if test "$gl_use_threads" = yes \ || test "$gl_use_threads" = posix \ || test "$gl_use_threads" = isoc+posix; then gl_PTHREADLIB_BODY LIBTHREAD=$LIBPTHREAD LTLIBTHREAD=$LIBPTHREAD LIBMULTITHREAD=$LIBPMULTITHREAD LTLIBMULTITHREAD=$LIBPMULTITHREAD if test $gl_pthread_api = yes; then if test "$gl_use_threads" = isoc+posix && test "$gl_have_isoc_threads" = yes; then gl_threads_api='isoc+posix' AC_DEFINE([USE_ISOC_AND_POSIX_THREADS], [1], [Define if the combination of the ISO C and POSIX multithreading APIs can be used.]) LIBTHREAD= LTLIBTHREAD= else gl_threads_api=posix AC_DEFINE([USE_POSIX_THREADS], [1], [Define if the POSIX multithreading library can be used.]) if test -n "$LIBMULTITHREAD" || test -n "$LTLIBMULTITHREAD"; then if case "$gl_cv_have_weak" in *yes) true;; *) false;; esac; then AC_DEFINE([USE_POSIX_THREADS_WEAK], [1], [Define if references to the POSIX multithreading library should be made weak.]) LIBTHREAD= LTLIBTHREAD= fi fi fi fi fi if test $gl_threads_api = none; then if test "$gl_use_threads" = isoc && test "$gl_have_isoc_threads" = yes; then gl_STDTHREADLIB_BODY LIBTHREAD=$LIBSTDTHREAD LTLIBTHREAD=$LIBSTDTHREAD LIBMULTITHREAD=$LIBSTDTHREAD LTLIBMULTITHREAD=$LIBSTDTHREAD gl_threads_api=isoc AC_DEFINE([USE_ISOC_THREADS], [1], [Define if the ISO C multithreading library can be used.]) fi fi if test $gl_threads_api = none; then case "$gl_use_threads" in yes | windows | win32) # The 'win32' is for backward compatibility. if { case "$host_os" in mingw*) true;; *) false;; esac }; then gl_threads_api=windows AC_DEFINE([USE_WINDOWS_THREADS], [1], [Define if the native Windows multithreading API can be used.]) fi ;; esac fi fi AC_MSG_CHECKING([for multithread API to use]) AC_MSG_RESULT([$gl_threads_api]) AC_SUBST([LIBTHREAD]) AC_SUBST([LTLIBTHREAD]) AC_SUBST([LIBMULTITHREAD]) AC_SUBST([LTLIBMULTITHREAD]) ]) AC_DEFUN([gl_THREADLIB], [ AC_REQUIRE([gl_THREADLIB_EARLY]) AC_REQUIRE([gl_THREADLIB_BODY]) ]) dnl gl_DISABLE_THREADS dnl ------------------ dnl Sets the gl_THREADLIB default so that threads are not used by default. dnl The user can still override it at installation time, by using the dnl configure option '--enable-threads'. AC_DEFUN([gl_DISABLE_THREADS], [ m4_divert_text([INIT_PREPARE], [gl_use_threads_default=no]) ]) dnl gl_AVOID_WINPTHREAD dnl ------------------- dnl Sets the gl_THREADLIB default so that on mingw, a dependency to the dnl libwinpthread DLL (mingw-w64 winpthreads library) is avoided. dnl The user can still override it at installation time, by using the dnl configure option '--enable-threads'. AC_DEFUN([gl_AVOID_WINPTHREAD], [ m4_divert_text([INIT_PREPARE], [gl_use_winpthreads_default=no]) ]) dnl ============================================================================ dnl Survey of platforms: dnl dnl Platform Available Compiler Supports test-lock dnl flavours option weak result dnl --------------- --------- --------- -------- --------- dnl Linux 2.4/glibc posix -lpthread Y OK dnl dnl GNU Hurd/glibc posix dnl dnl Ubuntu 14.04 posix -pthread Y OK dnl dnl FreeBSD 5.3 posix -lc_r Y dnl posix -lkse ? Y dnl posix -lpthread ? Y dnl posix -lthr Y dnl dnl FreeBSD 5.2 posix -lc_r Y dnl posix -lkse Y dnl posix -lthr Y dnl dnl FreeBSD 4.0,4.10 posix -lc_r Y OK dnl dnl NetBSD 1.6 -- dnl dnl OpenBSD 3.4 posix -lpthread Y OK dnl dnl Mac OS X 10.[123] posix -lpthread Y OK dnl dnl Solaris 7,8,9 posix -lpthread Y Sol 7,8: 0.0; Sol 9: OK dnl dnl HP-UX 11 posix -lpthread N (cc) OK dnl Y (gcc) dnl dnl IRIX 6.5 posix -lpthread Y 0.5 dnl dnl AIX 4.3,5.1 posix -lpthread N AIX 4: 0.5; AIX 5: OK dnl dnl OSF/1 4.0,5.1 posix -pthread (cc) N OK dnl -lpthread (gcc) Y dnl dnl Cygwin posix -lpthread Y OK dnl dnl Mingw windows N OK dnl dnl BeOS 5 -- dnl dnl The test-lock result shows what happens if in test-lock.c EXPLICIT_YIELD is dnl turned off: dnl OK if all three tests terminate OK, dnl 0.5 if the first test terminates OK but the second one loops endlessly, dnl 0.0 if the first test already loops endlessly. pspp-1.4.1/gl/m4/localeconv.m40000644000175000017500000000114713723215637015440 0ustar00blpblp00000000000000# localeconv.m4 serial 1 dnl Copyright (C) 2012-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_FUNC_LOCALECONV], [ AC_REQUIRE([gl_LOCALE_H_DEFAULTS]) AC_REQUIRE([gl_LOCALE_H]) if test $REPLACE_STRUCT_LCONV = 1; then REPLACE_LOCALECONV=1 fi ]) # Prerequisites of lib/localeconv.c. AC_DEFUN([gl_PREREQ_LOCALECONV], [ AC_CHECK_MEMBERS([struct lconv.decimal_point], [], [], [[#include ]]) ]) pspp-1.4.1/gl/m4/tm_gmtoff.m40000644000175000017500000000103513723215637015271 0ustar00blpblp00000000000000# tm_gmtoff.m4 serial 3 dnl Copyright (C) 2002, 2009-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_TM_GMTOFF], [ AC_CHECK_MEMBER([struct tm.tm_gmtoff], [AC_DEFINE([HAVE_TM_GMTOFF], [1], [Define if struct tm has the tm_gmtoff member.])], , [#include ]) ]) pspp-1.4.1/gl/m4/sockets.m40000644000175000017500000000070713723215637014767 0ustar00blpblp00000000000000# sockets.m4 serial 7 dnl Copyright (C) 2008-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_SOCKETS], [ AC_REQUIRE([AC_C_INLINE]) AC_REQUIRE([gl_SOCKETLIB]) gl_PREREQ_SOCKETS ]) # Prerequisites of lib/sockets.c. AC_DEFUN([gl_PREREQ_SOCKETS], [ : ]) pspp-1.4.1/gl/m4/time_h.m40000644000175000017500000001376413723215637014570 0ustar00blpblp00000000000000# Configure a more-standard replacement for . # Copyright (C) 2000-2001, 2003-2007, 2009-2020 Free Software Foundation, Inc. # serial 12 # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # Written by Paul Eggert and Jim Meyering. AC_DEFUN([gl_HEADER_TIME_H], [ dnl Use AC_REQUIRE here, so that the default behavior below is expanded dnl once only, before all statements that occur in other macros. AC_REQUIRE([gl_HEADER_TIME_H_BODY]) ]) AC_DEFUN([gl_HEADER_TIME_H_BODY], [ AC_REQUIRE([gl_HEADER_TIME_H_DEFAULTS]) gl_NEXT_HEADERS([time.h]) AC_REQUIRE([gl_CHECK_TYPE_STRUCT_TIMESPEC]) AC_REQUIRE([AC_C_RESTRICT]) ]) dnl Check whether 'struct timespec' is declared dnl in time.h, sys/time.h, pthread.h, or unistd.h. AC_DEFUN([gl_CHECK_TYPE_STRUCT_TIMESPEC], [ AC_CHECK_HEADERS_ONCE([sys/time.h]) AC_CACHE_CHECK([for struct timespec in ], [gl_cv_sys_struct_timespec_in_time_h], [AC_COMPILE_IFELSE( [AC_LANG_PROGRAM( [[#include ]], [[static struct timespec x; x.tv_sec = x.tv_nsec;]])], [gl_cv_sys_struct_timespec_in_time_h=yes], [gl_cv_sys_struct_timespec_in_time_h=no])]) TIME_H_DEFINES_STRUCT_TIMESPEC=0 SYS_TIME_H_DEFINES_STRUCT_TIMESPEC=0 PTHREAD_H_DEFINES_STRUCT_TIMESPEC=0 UNISTD_H_DEFINES_STRUCT_TIMESPEC=0 if test $gl_cv_sys_struct_timespec_in_time_h = yes; then TIME_H_DEFINES_STRUCT_TIMESPEC=1 else AC_CACHE_CHECK([for struct timespec in ], [gl_cv_sys_struct_timespec_in_sys_time_h], [AC_COMPILE_IFELSE( [AC_LANG_PROGRAM( [[#include ]], [[static struct timespec x; x.tv_sec = x.tv_nsec;]])], [gl_cv_sys_struct_timespec_in_sys_time_h=yes], [gl_cv_sys_struct_timespec_in_sys_time_h=no])]) if test $gl_cv_sys_struct_timespec_in_sys_time_h = yes; then SYS_TIME_H_DEFINES_STRUCT_TIMESPEC=1 else AC_CACHE_CHECK([for struct timespec in ], [gl_cv_sys_struct_timespec_in_pthread_h], [AC_COMPILE_IFELSE( [AC_LANG_PROGRAM( [[#include ]], [[static struct timespec x; x.tv_sec = x.tv_nsec;]])], [gl_cv_sys_struct_timespec_in_pthread_h=yes], [gl_cv_sys_struct_timespec_in_pthread_h=no])]) if test $gl_cv_sys_struct_timespec_in_pthread_h = yes; then PTHREAD_H_DEFINES_STRUCT_TIMESPEC=1 else AC_CACHE_CHECK([for struct timespec in ], [gl_cv_sys_struct_timespec_in_unistd_h], [AC_COMPILE_IFELSE( [AC_LANG_PROGRAM( [[#include ]], [[static struct timespec x; x.tv_sec = x.tv_nsec;]])], [gl_cv_sys_struct_timespec_in_unistd_h=yes], [gl_cv_sys_struct_timespec_in_unistd_h=no])]) if test $gl_cv_sys_struct_timespec_in_unistd_h = yes; then UNISTD_H_DEFINES_STRUCT_TIMESPEC=1 fi fi fi fi AC_SUBST([TIME_H_DEFINES_STRUCT_TIMESPEC]) AC_SUBST([SYS_TIME_H_DEFINES_STRUCT_TIMESPEC]) AC_SUBST([PTHREAD_H_DEFINES_STRUCT_TIMESPEC]) AC_SUBST([UNISTD_H_DEFINES_STRUCT_TIMESPEC]) ]) AC_DEFUN([gl_TIME_MODULE_INDICATOR], [ dnl Use AC_REQUIRE here, so that the default settings are expanded once only. AC_REQUIRE([gl_HEADER_TIME_H_DEFAULTS]) gl_MODULE_INDICATOR_SET_VARIABLE([$1]) dnl Define it also as a C macro, for the benefit of the unit tests. gl_MODULE_INDICATOR_FOR_TESTS([$1]) ]) AC_DEFUN([gl_HEADER_TIME_H_DEFAULTS], [ GNULIB_CTIME=0; AC_SUBST([GNULIB_CTIME]) GNULIB_MKTIME=0; AC_SUBST([GNULIB_MKTIME]) GNULIB_LOCALTIME=0; AC_SUBST([GNULIB_LOCALTIME]) GNULIB_NANOSLEEP=0; AC_SUBST([GNULIB_NANOSLEEP]) GNULIB_STRFTIME=0; AC_SUBST([GNULIB_STRFTIME]) GNULIB_STRPTIME=0; AC_SUBST([GNULIB_STRPTIME]) GNULIB_TIMEGM=0; AC_SUBST([GNULIB_TIMEGM]) GNULIB_TIME_R=0; AC_SUBST([GNULIB_TIME_R]) GNULIB_TIME_RZ=0; AC_SUBST([GNULIB_TIME_RZ]) GNULIB_TZSET=0; AC_SUBST([GNULIB_TZSET]) dnl Assume proper GNU behavior unless another module says otherwise. HAVE_DECL_LOCALTIME_R=1; AC_SUBST([HAVE_DECL_LOCALTIME_R]) HAVE_NANOSLEEP=1; AC_SUBST([HAVE_NANOSLEEP]) HAVE_STRPTIME=1; AC_SUBST([HAVE_STRPTIME]) HAVE_TIMEGM=1; AC_SUBST([HAVE_TIMEGM]) HAVE_TZSET=1; AC_SUBST([HAVE_TZSET]) dnl Even GNU libc does not have timezone_t yet. HAVE_TIMEZONE_T=0; AC_SUBST([HAVE_TIMEZONE_T]) dnl If another module says to replace or to not replace, do that. dnl Otherwise, replace only if someone compiles with -DGNULIB_PORTCHECK; dnl this lets maintainers check for portability. REPLACE_CTIME=GNULIB_PORTCHECK; AC_SUBST([REPLACE_CTIME]) REPLACE_LOCALTIME_R=GNULIB_PORTCHECK; AC_SUBST([REPLACE_LOCALTIME_R]) REPLACE_MKTIME=GNULIB_PORTCHECK; AC_SUBST([REPLACE_MKTIME]) REPLACE_NANOSLEEP=GNULIB_PORTCHECK; AC_SUBST([REPLACE_NANOSLEEP]) REPLACE_STRFTIME=GNULIB_PORTCHECK; AC_SUBST([REPLACE_STRFTIME]) REPLACE_TIMEGM=GNULIB_PORTCHECK; AC_SUBST([REPLACE_TIMEGM]) REPLACE_TZSET=GNULIB_PORTCHECK; AC_SUBST([REPLACE_TZSET]) dnl Hack so that the time module doesn't depend on the sys_time module. dnl First, default GNULIB_GETTIMEOFDAY to 0 if sys_time is absent. : ${GNULIB_GETTIMEOFDAY=0}; AC_SUBST([GNULIB_GETTIMEOFDAY]) dnl Second, it's OK to not use GNULIB_PORTCHECK for REPLACE_GMTIME dnl and REPLACE_LOCALTIME, as portability to Solaris 2.6 and earlier dnl is no longer a big deal. REPLACE_GMTIME=0; AC_SUBST([REPLACE_GMTIME]) REPLACE_LOCALTIME=0; AC_SUBST([REPLACE_LOCALTIME]) ]) pspp-1.4.1/gl/m4/isinf.m40000644000175000017500000001303513723215637014422 0ustar00blpblp00000000000000# isinf.m4 serial 13 dnl Copyright (C) 2007-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_ISINF], [ AC_REQUIRE([gl_MATH_H_DEFAULTS]) AC_REQUIRE([AC_CANONICAL_HOST]) dnl Persuade glibc to declare isinf. AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS]) AC_CHECK_DECLS([isinf], , , [[#include #ifndef isinf #error "isinf must be a macro, not a function" #endif ]]) if test "$ac_cv_have_decl_isinf" = yes; then gl_CHECK_MATH_LIB([ISINF_LIBM], [x = isinf (x) + isinf ((float) x);]) if test "$ISINF_LIBM" != missing; then dnl Test whether isinf() on 'long double' works. gl_ISINFL_WORKS case "$gl_cv_func_isinfl_works" in *yes) ;; *) ISINF_LIBM=missing;; esac fi fi dnl On Solaris 10, with CC in C++ mode, isinf is not available although dnl is with cc in C mode. This cannot be worked around by defining dnl _XOPEN_SOURCE=600, because the latter does not work in C++ mode on dnl Solaris 11.0. Therefore use the replacement functions on Solaris. if test "$ac_cv_have_decl_isinf" != yes \ || test "$ISINF_LIBM" = missing \ || { case "$host_os" in solaris*) true;; *) false;; esac; }; then REPLACE_ISINF=1 dnl No libraries are needed to link lib/isinf.c. ISINF_LIBM= fi AC_SUBST([ISINF_LIBM]) ]) dnl Test whether isinf() works: dnl 1) Whether it correctly returns false for LDBL_MAX. dnl 2) Whether on 'long double' recognizes all canonical values which are dnl infinite. AC_DEFUN([gl_ISINFL_WORKS], [ AC_REQUIRE([AC_PROG_CC]) AC_REQUIRE([gl_BIGENDIAN]) AC_REQUIRE([gl_LONG_DOUBLE_VS_DOUBLE]) AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles AC_CACHE_CHECK([whether isinf(long double) works], [gl_cv_func_isinfl_works], [ AC_RUN_IFELSE( [AC_LANG_SOURCE([[ #include #include #include #define NWORDS \ ((sizeof (long double) + sizeof (unsigned int) - 1) / sizeof (unsigned int)) typedef union { unsigned int word[NWORDS]; long double value; } memory_long_double; /* On Irix 6.5, gcc 3.4.3 can't compute compile-time NaN, and needs the runtime type conversion. */ #ifdef __sgi static long double NaNl () { double zero = 0.0; return zero / zero; } #else # define NaNl() (0.0L / 0.0L) #endif int main () { int result = 0; if (isinf (LDBL_MAX)) result |= 1; { memory_long_double m; unsigned int i; /* The isinf macro should be immune against changes in the sign bit and in the mantissa bits. The xor operation twiddles a bit that can only be a sign bit or a mantissa bit (since the exponent never extends to bit 31). */ m.value = NaNl (); m.word[NWORDS / 2] ^= (unsigned int) 1 << (sizeof (unsigned int) * CHAR_BIT - 1); for (i = 0; i < NWORDS; i++) m.word[i] |= 1; if (isinf (m.value)) result |= 2; } #if ((defined __ia64 && LDBL_MANT_DIG == 64) || (defined __x86_64__ || defined __amd64__) || (defined __i386 || defined __i386__ || defined _I386 || defined _M_IX86 || defined _X86_)) && !HAVE_SAME_LONG_DOUBLE_AS_DOUBLE /* Representation of an 80-bit 'long double' as an initializer for a sequence of 'unsigned int' words. */ # ifdef WORDS_BIGENDIAN # define LDBL80_WORDS(exponent,manthi,mantlo) \ { ((unsigned int) (exponent) << 16) | ((unsigned int) (manthi) >> 16), \ ((unsigned int) (manthi) << 16) | ((unsigned int) (mantlo) >> 16), \ (unsigned int) (mantlo) << 16 \ } # else # define LDBL80_WORDS(exponent,manthi,mantlo) \ { mantlo, manthi, exponent } # endif { /* Quiet NaN. */ static memory_long_double x = { LDBL80_WORDS (0xFFFF, 0xC3333333, 0x00000000) }; if (isinf (x.value)) result |= 2; } { /* Signalling NaN. */ static memory_long_double x = { LDBL80_WORDS (0xFFFF, 0x83333333, 0x00000000) }; if (isinf (x.value)) result |= 2; } /* isinf should return something even for noncanonical values. */ { /* Pseudo-NaN. */ static memory_long_double x = { LDBL80_WORDS (0xFFFF, 0x40000001, 0x00000000) }; if (isinf (x.value) && !isinf (x.value)) result |= 4; } { /* Pseudo-Infinity. */ static memory_long_double x = { LDBL80_WORDS (0xFFFF, 0x00000000, 0x00000000) }; if (isinf (x.value) && !isinf (x.value)) result |= 8; } { /* Pseudo-Zero. */ static memory_long_double x = { LDBL80_WORDS (0x4004, 0x00000000, 0x00000000) }; if (isinf (x.value) && !isinf (x.value)) result |= 16; } { /* Unnormalized number. */ static memory_long_double x = { LDBL80_WORDS (0x4000, 0x63333333, 0x00000000) }; if (isinf (x.value) && !isinf (x.value)) result |= 32; } { /* Pseudo-Denormal. */ static memory_long_double x = { LDBL80_WORDS (0x0000, 0x83333333, 0x00000000) }; if (isinf (x.value) && !isinf (x.value)) result |= 64; } #endif return result; }]])], [gl_cv_func_isinfl_works=yes], [gl_cv_func_isinfl_works=no], [case "$host_os" in mingw*) # Guess yes on mingw, no on MSVC. AC_EGREP_CPP([Known], [ #ifdef __MINGW32__ Known #endif ], [gl_cv_func_isinfl_works="guessing yes"], [gl_cv_func_isinfl_works="guessing no"]) ;; *) gl_cv_func_isinfl_works="guessing yes" ;; esac ]) ]) ]) pspp-1.4.1/gl/m4/isfinite.m40000644000175000017500000001300513723215637015121 0ustar00blpblp00000000000000# isfinite.m4 serial 17 dnl Copyright (C) 2007-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_ISFINITE], [ AC_REQUIRE([gl_MATH_H_DEFAULTS]) AC_REQUIRE([AC_CANONICAL_HOST]) dnl Persuade glibc to declare isfinite. AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS]) AC_CHECK_DECLS([isfinite], , , [[#include ]]) if test "$ac_cv_have_decl_isfinite" = yes; then gl_CHECK_MATH_LIB([ISFINITE_LIBM], [x = isfinite (x) + isfinite ((float) x);]) if test "$ISFINITE_LIBM" != missing; then dnl Test whether isfinite() on 'long double' works. gl_ISFINITEL_WORKS case "$gl_cv_func_isfinitel_works" in *yes) ;; *) ISFINITE_LIBM=missing;; esac dnl Also, isfinite() on 'double' does not work on Linux/ia64 (because of dnl signalling NaNs). But this does not have to be tested, since dnl isfinite(long double) also does not work in this situation. fi fi dnl On Solaris 10, with CC in C++ mode, isfinite is not available although dnl is with cc in C mode. This cannot be worked around by defining dnl _XOPEN_SOURCE=600, because the latter does not work in C++ mode on dnl Solaris 11.0. Therefore use the replacement functions on Solaris. if test "$ac_cv_have_decl_isfinite" != yes \ || test "$ISFINITE_LIBM" = missing \ || { case "$host_os" in solaris*) true;; *) false;; esac; }; then REPLACE_ISFINITE=1 dnl No libraries are needed to link lib/isfinite.c. ISFINITE_LIBM= fi AC_SUBST([ISFINITE_LIBM]) ]) dnl Test whether isfinite() on 'long double' recognizes all canonical values dnl which are neither finite nor infinite. AC_DEFUN([gl_ISFINITEL_WORKS], [ AC_REQUIRE([AC_PROG_CC]) AC_REQUIRE([gl_BIGENDIAN]) AC_REQUIRE([gl_LONG_DOUBLE_VS_DOUBLE]) AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles AC_CACHE_CHECK([whether isfinite(long double) works], [gl_cv_func_isfinitel_works], [ AC_RUN_IFELSE([AC_LANG_SOURCE([[ #include #include #include #define NWORDS \ ((sizeof (long double) + sizeof (unsigned int) - 1) / sizeof (unsigned int)) typedef union { unsigned int word[NWORDS]; long double value; } memory_long_double; /* On Irix 6.5, gcc 3.4.3 can't compute compile-time NaN, and needs the runtime type conversion. */ #ifdef __sgi static long double NaNl () { double zero = 0.0; return zero / zero; } #else # define NaNl() (0.0L / 0.0L) #endif int main () { int result = 0; { memory_long_double m; unsigned int i; /* The isfinite macro should be immune against changes in the sign bit and in the mantissa bits. The xor operation twiddles a bit that can only be a sign bit or a mantissa bit (since the exponent never extends to bit 31). */ m.value = NaNl (); m.word[NWORDS / 2] ^= (unsigned int) 1 << (sizeof (unsigned int) * CHAR_BIT - 1); for (i = 0; i < NWORDS; i++) m.word[i] |= 1; if (isfinite (m.value)) result |= 1; } #if ((defined __ia64 && LDBL_MANT_DIG == 64) || (defined __x86_64__ || defined __amd64__) || (defined __i386 || defined __i386__ || defined _I386 || defined _M_IX86 || defined _X86_)) && !HAVE_SAME_LONG_DOUBLE_AS_DOUBLE /* Representation of an 80-bit 'long double' as an initializer for a sequence of 'unsigned int' words. */ # ifdef WORDS_BIGENDIAN # define LDBL80_WORDS(exponent,manthi,mantlo) \ { ((unsigned int) (exponent) << 16) | ((unsigned int) (manthi) >> 16), \ ((unsigned int) (manthi) << 16) | ((unsigned int) (mantlo) >> 16), \ (unsigned int) (mantlo) << 16 \ } # else # define LDBL80_WORDS(exponent,manthi,mantlo) \ { mantlo, manthi, exponent } # endif { /* Quiet NaN. */ static memory_long_double x = { LDBL80_WORDS (0xFFFF, 0xC3333333, 0x00000000) }; if (isfinite (x.value)) result |= 2; } { /* Signalling NaN. */ static memory_long_double x = { LDBL80_WORDS (0xFFFF, 0x83333333, 0x00000000) }; if (isfinite (x.value)) result |= 2; } /* isfinite should return something even for noncanonical values. */ { /* Pseudo-NaN. */ static memory_long_double x = { LDBL80_WORDS (0xFFFF, 0x40000001, 0x00000000) }; if (isfinite (x.value) && !isfinite (x.value)) result |= 4; } { /* Pseudo-Infinity. */ static memory_long_double x = { LDBL80_WORDS (0xFFFF, 0x00000000, 0x00000000) }; if (isfinite (x.value) && !isfinite (x.value)) result |= 8; } { /* Pseudo-Zero. */ static memory_long_double x = { LDBL80_WORDS (0x4004, 0x00000000, 0x00000000) }; if (isfinite (x.value) && !isfinite (x.value)) result |= 16; } { /* Unnormalized number. */ static memory_long_double x = { LDBL80_WORDS (0x4000, 0x63333333, 0x00000000) }; if (isfinite (x.value) && !isfinite (x.value)) result |= 32; } { /* Pseudo-Denormal. */ static memory_long_double x = { LDBL80_WORDS (0x0000, 0x83333333, 0x00000000) }; if (isfinite (x.value) && !isfinite (x.value)) result |= 64; } #endif return result; }]])], [gl_cv_func_isfinitel_works=yes], [gl_cv_func_isfinitel_works=no], [case "$host_os" in # Guess no on native Windows. mingw*) gl_cv_func_isfinitel_works="guessing no" ;; *) gl_cv_func_isfinitel_works="guessing yes" ;; esac ]) ]) ]) pspp-1.4.1/gl/m4/exponentl.m40000644000175000017500000000713013723215637015325 0ustar00blpblp00000000000000# exponentl.m4 serial 5 dnl Copyright (C) 2007-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_LONG_DOUBLE_EXPONENT_LOCATION], [ AC_REQUIRE([gl_BIGENDIAN]) AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles AC_CACHE_CHECK([where to find the exponent in a 'long double'], [gl_cv_cc_long_double_expbit0], [ AC_RUN_IFELSE( [AC_LANG_SOURCE([[ #include #include #include #include #define NWORDS \ ((sizeof (long double) + sizeof (unsigned int) - 1) / sizeof (unsigned int)) typedef union { long double value; unsigned int word[NWORDS]; } memory_long_double; static unsigned int ored_words[NWORDS]; static unsigned int anded_words[NWORDS]; static void add_to_ored_words (long double *x) { memory_long_double m; size_t i; /* Clear it first, in case sizeof (long double) < sizeof (memory_long_double). */ memset (&m, 0, sizeof (memory_long_double)); m.value = *x; for (i = 0; i < NWORDS; i++) { ored_words[i] |= m.word[i]; anded_words[i] &= m.word[i]; } } int main () { static long double samples[5] = { 0.25L, 0.5L, 1.0L, 2.0L, 4.0L }; size_t j; FILE *fp = fopen ("conftest.out", "w"); if (fp == NULL) return 1; for (j = 0; j < NWORDS; j++) anded_words[j] = ~ (unsigned int) 0; for (j = 0; j < 5; j++) add_to_ored_words (&samples[j]); /* Remove bits that are common (e.g. if representation of the first mantissa bit is explicit). */ for (j = 0; j < NWORDS; j++) ored_words[j] &= ~anded_words[j]; /* Now find the nonzero word. */ for (j = 0; j < NWORDS; j++) if (ored_words[j] != 0) break; if (j < NWORDS) { size_t i; for (i = j + 1; i < NWORDS; i++) if (ored_words[i] != 0) { fprintf (fp, "unknown"); return (fclose (fp) != 0); } for (i = 0; ; i++) if ((ored_words[j] >> i) & 1) { fprintf (fp, "word %d bit %d", (int) j, (int) i); return (fclose (fp) != 0); } } fprintf (fp, "unknown"); return (fclose (fp) != 0); } ]])], [gl_cv_cc_long_double_expbit0=`cat conftest.out`], [gl_cv_cc_long_double_expbit0="unknown"], [ dnl When cross-compiling, in general we don't know. It depends on the dnl ABI and compiler version. There are too many cases. gl_cv_cc_long_double_expbit0="unknown" case "$host_os" in mingw*) # On native Windows (little-endian), we know the result # in two cases: mingw, MSVC. AC_EGREP_CPP([Known], [ #ifdef __MINGW32__ Known #endif ], [gl_cv_cc_long_double_expbit0="word 2 bit 0"]) AC_EGREP_CPP([Known], [ #ifdef _MSC_VER Known #endif ], [gl_cv_cc_long_double_expbit0="word 1 bit 20"]) ;; esac ]) rm -f conftest.out ]) case "$gl_cv_cc_long_double_expbit0" in word*bit*) word=`echo "$gl_cv_cc_long_double_expbit0" | sed -e 's/word //' -e 's/ bit.*//'` bit=`echo "$gl_cv_cc_long_double_expbit0" | sed -e 's/word.*bit //'` AC_DEFINE_UNQUOTED([LDBL_EXPBIT0_WORD], [$word], [Define as the word index where to find the exponent of 'long double'.]) AC_DEFINE_UNQUOTED([LDBL_EXPBIT0_BIT], [$bit], [Define as the bit index in the word where to find bit 0 of the exponent of 'long double'.]) ;; esac ]) pspp-1.4.1/gl/m4/isnan.m40000644000175000017500000000274713723215637014432 0ustar00blpblp00000000000000# isnan.m4 serial 5 dnl Copyright (C) 2007-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_ISNAN], [ AC_REQUIRE([gl_MATH_H_DEFAULTS]) AC_REQUIRE([gl_FUNC_ISNANF]) AC_REQUIRE([gl_FUNC_ISNAND]) AC_REQUIRE([gl_FUNC_ISNANL]) # If we replaced any of the underlying isnan* functions, replace # the isnan macro; it undoubtedly suffers from the same flaws. AC_MSG_CHECKING([whether isnan macro works]) if test $gl_func_isnanf = yes \ && test $gl_func_isnand = yes \ && test $gl_func_isnanl = yes; then AC_MSG_RESULT([yes]) ISNAN_LIBM= dnl Append $ISNANF_LIBM to ISNAN_LIBM, avoiding gratuitous duplicates. case " $ISNAN_LIBM " in *" $ISNANF_LIBM "*) ;; *) ISNAN_LIBM="$ISNAN_LIBM $ISNANF_LIBM" ;; esac dnl Append $ISNAND_LIBM to ISNAN_LIBM, avoiding gratuitous duplicates. case " $ISNAN_LIBM " in *" $ISNAND_LIBM "*) ;; *) ISNAN_LIBM="$ISNAN_LIBM $ISNAND_LIBM" ;; esac dnl Append $ISNANL_LIBM to ISNAN_LIBM, avoiding gratuitous duplicates. case " $ISNAN_LIBM " in *" $ISNANL_LIBM "*) ;; *) ISNAN_LIBM="$ISNAN_LIBM $ISNANL_LIBM" ;; esac else AC_MSG_RESULT([no]) dnl REPLACE_ISNAN=1 also makes sure the rpl_isnan[fdl] functions get built. REPLACE_ISNAN=1 ISNAN_LIBM= fi AC_SUBST([ISNAN_LIBM]) ]) pspp-1.4.1/gl/m4/iswblank.m40000644000175000017500000000234113723215637015122 0ustar00blpblp00000000000000# iswblank.m4 serial 4 dnl Copyright (C) 2011-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_FUNC_ISWBLANK], [ AC_REQUIRE([gl_WCTYPE_H_DEFAULTS]) AC_REQUIRE([gl_WCTYPE_H]) dnl Persuade glibc to declare iswblank(). AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS]) AC_CHECK_FUNCS_ONCE([iswblank]) AC_CHECK_DECLS([iswblank], , , [[ /* Tru64 with Desktop Toolkit C has a bug: must be included before . BSD/OS 4.0.1 has a bug: , and must be included before . */ #include #include #include #include #include ]]) if test $ac_cv_func_iswblank = no; then HAVE_ISWBLANK=0 if test $ac_cv_have_decl_iswblank = yes; then REPLACE_ISWBLANK=1 fi fi if test $HAVE_ISWCNTRL = 0 || test $REPLACE_ISWCNTRL = 1; then dnl Redefine all of iswcntrl, ..., towupper in . : else if test $HAVE_ISWBLANK = 0 || test $REPLACE_ISWBLANK = 1; then dnl Redefine only iswblank. : fi fi ]) pspp-1.4.1/gl/c-strncasecmp.c0000644000175000017500000000306713723215636015441 0ustar00blpblp00000000000000/* c-strncasecmp.c -- case insensitive string comparator in C locale Copyright (C) 1998-1999, 2005-2006, 2009-2020 Free Software Foundation, Inc. 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 3, 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, see . */ #include /* Specification. */ #include "c-strcase.h" #include #include "c-ctype.h" int c_strncasecmp (const char *s1, const char *s2, size_t n) { register const unsigned char *p1 = (const unsigned char *) s1; register const unsigned char *p2 = (const unsigned char *) s2; unsigned char c1, c2; if (p1 == p2 || n == 0) return 0; do { c1 = c_tolower (*p1); c2 = c_tolower (*p2); if (--n == 0 || c1 == '\0') break; ++p1; ++p2; } while (c1 == c2); if (UCHAR_MAX <= INT_MAX) return c1 - c2; else /* On machines where 'char' and 'int' are types of the same size, the difference of two 'unsigned char' values - including the sign bit - doesn't fit in an 'int'. */ return _GL_CMP (c1, c2); } pspp-1.4.1/gl/float.c0000644000175000017500000000250513723215636014000 0ustar00blpblp00000000000000/* Auxiliary definitions for . Copyright (C) 2011-2020 Free Software Foundation, Inc. Written by Bruno Haible , 2011. 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 3 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, see . */ #include /* Specification. */ #include #if (defined _ARCH_PPC || defined _POWER) && (defined _AIX || defined __linux__) && (LDBL_MANT_DIG == 106) && defined __GNUC__ const union gl_long_double_union gl_LDBL_MAX = { { DBL_MAX, DBL_MAX / (double)134217728UL / (double)134217728UL } }; #elif defined __i386__ const union gl_long_double_union gl_LDBL_MAX = { { 0xFFFFFFFF, 0xFFFFFFFF, 32766 } }; #else /* This declaration is solely to ensure that after preprocessing this file is never empty. */ typedef int dummy; #endif pspp-1.4.1/gl/strtok_r.c0000644000175000017500000000411513723215640014534 0ustar00blpblp00000000000000/* Reentrant string tokenizer. Generic version. Copyright (C) 1991, 1996-1999, 2001, 2004, 2007, 2009-2020 Free Software Foundation, Inc. This file is part of the GNU C Library. 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 3 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, see . */ #ifdef HAVE_CONFIG_H # include #endif #include #ifdef _LIBC # undef strtok_r # undef __strtok_r #else # define __strtok_r strtok_r # define __rawmemchr strchr #endif /* Parse S into tokens separated by characters in DELIM. If S is NULL, the saved pointer in SAVE_PTR is used as the next starting point. For example: char s[] = "-abc-=-def"; char *sp; x = strtok_r(s, "-", &sp); // x = "abc", sp = "=-def" x = strtok_r(NULL, "-=", &sp); // x = "def", sp = NULL x = strtok_r(NULL, "=", &sp); // x = NULL // s = "abc\0-def\0" */ char * __strtok_r (char *s, const char *delim, char **save_ptr) { char *token; if (s == NULL) s = *save_ptr; /* Scan leading delimiters. */ s += strspn (s, delim); if (*s == '\0') { *save_ptr = s; return NULL; } /* Find the end of the token. */ token = s; s = strpbrk (token, delim); if (s == NULL) /* This token finishes the string. */ *save_ptr = __rawmemchr (token, '\0'); else { /* Terminate the token and make *SAVE_PTR point past it. */ *s = '\0'; *save_ptr = s + 1; } return token; } #ifdef weak_alias libc_hidden_def (__strtok_r) weak_alias (__strtok_r, strtok_r) #endif pspp-1.4.1/gl/unigbrk/0000755000175000017500000000000013725012650014157 5ustar00blpblp00000000000000pspp-1.4.1/gl/unigbrk/gbrkprop.h0000644000175000017500000057615413723215640016202 0ustar00blpblp00000000000000/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ /* Grapheme break property of Unicode characters. */ /* Generated automatically by gen-uni-tables.c for Unicode 9.0.0. */ #define gbrkprop_header_0 16 #define gbrkprop_header_1 15 #define gbrkprop_header_2 7 #define gbrkprop_header_3 511 #define gbrkprop_header_4 127 static const struct { int level1[15]; short level2[3 << 9]; unsigned char level3[119 << 7]; } unigbrkprop = { { 0, 512, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1024 }, { 0, 128, -1, -1, -1, -1, 256, -1, -1, 384, -1, 512, 640, 768, 896, 1024, 1152, 1280, 1408, 1536, 1664, 1792, 1920, 2048, 2176, 2304, 2432, 2560, 2688, 2816, 2944, 3072, 3200, 3328, 3456, 3584, -1, -1, 3712, -1, -1, -1, -1, -1, -1, -1, 3840, 3968, 4096, 4224, 4352, -1, 4480, 4608, 4736, 4864, 4992, 5120, -1, 5248, -1, -1, -1, -1, 5376, 5504, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5632, 5760, 5888, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 6016, 6144, 6272, -1, -1, -1, -1, 6400, 6528, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 6656, 6784, -1, -1, 6912, 7040, 7168, 7296, 7424, 7552, -1, 7680, 7808, 7936, 8064, 8192, 8320, 8448, 8576, 7808, 7936, 8064, 8192, 8320, 8448, 8576, 7808, 7936, 8064, 8192, 8320, 8448, 8576, 7808, 7936, 8064, 8192, 8320, 8448, 8576, 7808, 7936, 8064, 8192, 8320, 8448, 8576, 7808, 7936, 8064, 8192, 8320, 8448, 8576, 7808, 7936, 8064, 8192, 8320, 8448, 8576, 7808, 7936, 8064, 8192, 8320, 8448, 8576, 7808, 7936, 8064, 8192, 8320, 8448, 8576, 7808, 7936, 8064, 8192, 8320, 8448, 8576, 7808, 7936, 8064, 8192, 8320, 8448, 8576, 7808, 7936, 8064, 8192, 8320, 8448, 8576, 7808, 7936, 8064, 8704, 8832, 8832, 8832, 8832, 8832, 8832, 8832, 8832, 8832, 8832, 8832, 8832, 8832, 8832, 8832, 8832, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8960, -1, -1, -1, -1, -1, 9088, 9216, -1, 9344, -1, -1, -1, 9472, -1, 9600, 9728, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 9856, 9984, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 10112, 10240, 10368, 10496, 10624, 10752, 10880, -1, 11008, 11136, -1, 11264, 11392, 11520, 11648, -1, -1, -1, -1, -1, -1, -1, -1, -1, 11776, 11904, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 12032, 12160, -1, -1, -1, -1, -1, -1, -1, 12288, 12416, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 12544, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 12672, 12800, 12928, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 13056, 13184, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 13312, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 13440, 13568, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 13696, -1, -1, -1, 13824, 13952, 14080, 14208, 14336, 14464, 14592, -1, -1, -1, -1, 14720, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 14848, 8832, 14976, 15104, 8832, 8832, 8832, 8832, 8832, 8832, 8832, 8832, 8832, 8832, 8832, 8832, 8832, 8832, 8832, 8832, 8832, 8832, 8832, 8832, 8832, 8832, 8832, 8832, 8832, 8832, 8832, 8832, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 }, { GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_LF, GBP_CONTROL, GBP_CONTROL, GBP_CR, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_CONTROL, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_OTHER, GBP_EXTEND, GBP_OTHER, GBP_EXTEND, GBP_EXTEND, GBP_OTHER, GBP_EXTEND, GBP_EXTEND, GBP_OTHER, GBP_EXTEND, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_PREPEND, GBP_PREPEND, GBP_PREPEND, GBP_PREPEND, GBP_PREPEND, GBP_PREPEND, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_OTHER, GBP_CONTROL, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_EXTEND, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_PREPEND, GBP_OTHER, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_OTHER, GBP_OTHER, GBP_EXTEND, GBP_EXTEND, GBP_OTHER, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_PREPEND, GBP_OTHER, GBP_EXTEND, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_OTHER, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_OTHER, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_OTHER, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_PREPEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_SPACINGMARK, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_EXTEND, GBP_SPACINGMARK, GBP_EXTEND, GBP_OTHER, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_EXTEND, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_OTHER, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_EXTEND, GBP_EXTEND, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_EXTEND, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_EXTEND, GBP_OTHER, GBP_EXTEND, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_OTHER, GBP_OTHER, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_OTHER, GBP_OTHER, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_EXTEND, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_EXTEND, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_EXTEND, GBP_EXTEND, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_EXTEND, GBP_EXTEND, GBP_SPACINGMARK, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_EXTEND, GBP_OTHER, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_EXTEND, GBP_EXTEND, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_EXTEND, GBP_EXTEND, GBP_OTHER, GBP_OTHER, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_EXTEND, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_EXTEND, GBP_EXTEND, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_EXTEND, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_EXTEND, GBP_EXTEND, GBP_SPACINGMARK, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_EXTEND, GBP_OTHER, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_OTHER, GBP_EXTEND, GBP_EXTEND, GBP_SPACINGMARK, GBP_OTHER, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_EXTEND, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_EXTEND, GBP_EXTEND, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_EXTEND, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_EXTEND, GBP_OTHER, GBP_EXTEND, GBP_EXTEND, GBP_SPACINGMARK, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_OTHER, GBP_OTHER, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_OTHER, GBP_OTHER, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_EXTEND, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_EXTEND, GBP_EXTEND, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_EXTEND, GBP_EXTEND, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_EXTEND, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_EXTEND, GBP_SPACINGMARK, GBP_EXTEND, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_OTHER, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_EXTEND, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_EXTEND, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_EXTEND, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_OTHER, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_OTHER, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_EXTEND, GBP_EXTEND, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_EXTEND, GBP_EXTEND, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_EXTEND, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_EXTEND, GBP_OTHER, GBP_SPACINGMARK, GBP_EXTEND, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_EXTEND, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_OTHER, GBP_EXTEND, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_OTHER, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_EXTEND, GBP_EXTEND, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_EXTEND, GBP_EXTEND, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_EXTEND, GBP_EXTEND, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_EXTEND, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_EXTEND, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_OTHER, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_OTHER, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_EXTEND, GBP_PREPEND, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_EXTEND, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_EXTEND, GBP_EXTEND, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_EXTEND, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_EXTEND, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_OTHER, GBP_EXTEND, GBP_OTHER, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_EXTEND, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_EXTEND, GBP_OTHER, GBP_SPACINGMARK, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_EXTEND, GBP_OTHER, GBP_SPACINGMARK, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_OTHER, GBP_EXTEND, GBP_EXTEND, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_EXTEND, GBP_EXTEND, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_EXTEND, GBP_OTHER, GBP_EXTEND, GBP_OTHER, GBP_EXTEND, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_SPACINGMARK, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_OTHER, GBP_EXTEND, GBP_EXTEND, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_OTHER, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_EXTEND, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_SPACINGMARK, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_OTHER, GBP_EXTEND, GBP_EXTEND, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_EXTEND, GBP_EXTEND, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_EXTEND, GBP_EXTEND, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_EXTEND, GBP_OTHER, GBP_SPACINGMARK, GBP_EXTEND, GBP_EXTEND, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_EXTEND, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_EXTEND, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_L, GBP_L, GBP_L, GBP_L, GBP_L, GBP_L, GBP_L, GBP_L, GBP_L, GBP_L, GBP_L, GBP_L, GBP_L, GBP_L, GBP_L, GBP_L, GBP_L, GBP_L, GBP_L, GBP_L, GBP_L, GBP_L, GBP_L, GBP_L, GBP_L, GBP_L, GBP_L, GBP_L, GBP_L, GBP_L, GBP_L, GBP_L, GBP_L, GBP_L, GBP_L, GBP_L, GBP_L, GBP_L, GBP_L, GBP_L, GBP_L, GBP_L, GBP_L, GBP_L, GBP_L, GBP_L, GBP_L, GBP_L, GBP_L, GBP_L, GBP_L, GBP_L, GBP_L, GBP_L, GBP_L, GBP_L, GBP_L, GBP_L, GBP_L, GBP_L, GBP_L, GBP_L, GBP_L, GBP_L, GBP_L, GBP_L, GBP_L, GBP_L, GBP_L, GBP_L, GBP_L, GBP_L, GBP_L, GBP_L, GBP_L, GBP_L, GBP_L, GBP_L, GBP_L, GBP_L, GBP_L, GBP_L, GBP_L, GBP_L, GBP_L, GBP_L, GBP_L, GBP_L, GBP_L, GBP_L, GBP_L, GBP_L, GBP_L, GBP_L, GBP_L, GBP_L, GBP_V, GBP_V, GBP_V, GBP_V, GBP_V, GBP_V, GBP_V, GBP_V, GBP_V, GBP_V, GBP_V, GBP_V, GBP_V, GBP_V, GBP_V, GBP_V, GBP_V, GBP_V, GBP_V, GBP_V, GBP_V, GBP_V, GBP_V, GBP_V, GBP_V, GBP_V, GBP_V, GBP_V, GBP_V, GBP_V, GBP_V, GBP_V, GBP_V, GBP_V, GBP_V, GBP_V, GBP_V, GBP_V, GBP_V, GBP_V, GBP_V, GBP_V, GBP_V, GBP_V, GBP_V, GBP_V, GBP_V, GBP_V, GBP_V, GBP_V, GBP_V, GBP_V, GBP_V, GBP_V, GBP_V, GBP_V, GBP_V, GBP_V, GBP_V, GBP_V, GBP_V, GBP_V, GBP_V, GBP_V, GBP_V, GBP_V, GBP_V, GBP_V, GBP_V, GBP_V, GBP_V, GBP_V, GBP_T, GBP_T, GBP_T, GBP_T, GBP_T, GBP_T, GBP_T, GBP_T, GBP_T, GBP_T, GBP_T, GBP_T, GBP_T, GBP_T, GBP_T, GBP_T, GBP_T, GBP_T, GBP_T, GBP_T, GBP_T, GBP_T, GBP_T, GBP_T, GBP_T, GBP_T, GBP_T, GBP_T, GBP_T, GBP_T, GBP_T, GBP_T, GBP_T, GBP_T, GBP_T, GBP_T, GBP_T, GBP_T, GBP_T, GBP_T, GBP_T, GBP_T, GBP_T, GBP_T, GBP_T, GBP_T, GBP_T, GBP_T, GBP_T, GBP_T, GBP_T, GBP_T, GBP_T, GBP_T, GBP_T, GBP_T, GBP_T, GBP_T, GBP_T, GBP_T, GBP_T, GBP_T, GBP_T, GBP_T, GBP_T, GBP_T, GBP_T, GBP_T, GBP_T, GBP_T, GBP_T, GBP_T, GBP_T, GBP_T, GBP_T, GBP_T, GBP_T, GBP_T, GBP_T, GBP_T, GBP_T, GBP_T, GBP_T, GBP_T, GBP_T, GBP_T, GBP_T, GBP_T, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_EXTEND, GBP_EXTEND, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_EXTEND, GBP_EXTEND, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_EXTEND, GBP_EXTEND, GBP_SPACINGMARK, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_EXTEND, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_EXTEND, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_CONTROL, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_EXTEND, GBP_EXTEND, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_EXTEND, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_EXTEND, GBP_EXTEND, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_EXTEND, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_EXTEND, GBP_EXTEND, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_EXTEND, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_SPACINGMARK, GBP_EXTEND, GBP_SPACINGMARK, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_OTHER, GBP_EXTEND, GBP_OTHER, GBP_EXTEND, GBP_OTHER, GBP_OTHER, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_OTHER, GBP_OTHER, GBP_EXTEND, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_SPACINGMARK, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_EXTEND, GBP_SPACINGMARK, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_SPACINGMARK, GBP_EXTEND, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_EXTEND, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_EXTEND, GBP_EXTEND, GBP_SPACINGMARK, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_SPACINGMARK, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_EXTEND, GBP_EXTEND, GBP_SPACINGMARK, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_EXTEND, GBP_SPACINGMARK, GBP_EXTEND, GBP_EXTEND, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_EXTEND, GBP_SPACINGMARK, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_EXTEND, GBP_EXTEND, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_OTHER, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_SPACINGMARK, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_EXTEND, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_EXTEND, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_EXTEND, GBP_EXTEND, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_CONTROL, GBP_EXTEND, GBP_ZWJ, GBP_CONTROL, GBP_CONTROL, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_EB, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_EB, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_EB, GBP_EB, GBP_EB, GBP_EB, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_GAZ, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_EXTEND, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_EXTEND, GBP_EXTEND, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_OTHER, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_EXTEND, GBP_EXTEND, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_EXTEND, GBP_EXTEND, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_EXTEND, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_EXTEND, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_EXTEND, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_EXTEND, GBP_EXTEND, GBP_SPACINGMARK, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_EXTEND, GBP_EXTEND, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_L, GBP_L, GBP_L, GBP_L, GBP_L, GBP_L, GBP_L, GBP_L, GBP_L, GBP_L, GBP_L, GBP_L, GBP_L, GBP_L, GBP_L, GBP_L, GBP_L, GBP_L, GBP_L, GBP_L, GBP_L, GBP_L, GBP_L, GBP_L, GBP_L, GBP_L, GBP_L, GBP_L, GBP_L, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_SPACINGMARK, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_EXTEND, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_EXTEND, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_EXTEND, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_EXTEND, GBP_EXTEND, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_EXTEND, GBP_EXTEND, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_EXTEND, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_EXTEND, GBP_SPACINGMARK, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_EXTEND, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_EXTEND, GBP_OTHER, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_OTHER, GBP_OTHER, GBP_EXTEND, GBP_EXTEND, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_EXTEND, GBP_EXTEND, GBP_OTHER, GBP_EXTEND, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_SPACINGMARK, GBP_EXTEND, GBP_EXTEND, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_SPACINGMARK, GBP_EXTEND, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_EXTEND, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_EXTEND, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_OTHER, GBP_SPACINGMARK, GBP_EXTEND, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_LV, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LV, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LV, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LV, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LV, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LV, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LV, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LV, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LV, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LV, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LV, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LV, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LV, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LV, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LV, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LV, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LV, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LV, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LV, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LV, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LV, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LV, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LV, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LV, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LV, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LV, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LV, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LV, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LV, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LV, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LV, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LV, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LV, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_LVT, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_V, GBP_V, GBP_V, GBP_V, GBP_V, GBP_V, GBP_V, GBP_V, GBP_V, GBP_V, GBP_V, GBP_V, GBP_V, GBP_V, GBP_V, GBP_V, GBP_V, GBP_V, GBP_V, GBP_V, GBP_V, GBP_V, GBP_V, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_T, GBP_T, GBP_T, GBP_T, GBP_T, GBP_T, GBP_T, GBP_T, GBP_T, GBP_T, GBP_T, GBP_T, GBP_T, GBP_T, GBP_T, GBP_T, GBP_T, GBP_T, GBP_T, GBP_T, GBP_T, GBP_T, GBP_T, GBP_T, GBP_T, GBP_T, GBP_T, GBP_T, GBP_T, GBP_T, GBP_T, GBP_T, GBP_T, GBP_T, GBP_T, GBP_T, GBP_T, GBP_T, GBP_T, GBP_T, GBP_T, GBP_T, GBP_T, GBP_T, GBP_T, GBP_T, GBP_T, GBP_T, GBP_T, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_EXTEND, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_CONTROL, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_EXTEND, GBP_EXTEND, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_EXTEND, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_EXTEND, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_OTHER, GBP_EXTEND, GBP_EXTEND, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_EXTEND, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_EXTEND, GBP_EXTEND, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_SPACINGMARK, GBP_EXTEND, GBP_SPACINGMARK, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_SPACINGMARK, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_EXTEND, GBP_EXTEND, GBP_OTHER, GBP_OTHER, GBP_PREPEND, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_SPACINGMARK, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_EXTEND, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_EXTEND, GBP_EXTEND, GBP_SPACINGMARK, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_OTHER, GBP_PREPEND, GBP_PREPEND, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_EXTEND, GBP_SPACINGMARK, GBP_EXTEND, GBP_EXTEND, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_EXTEND, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_EXTEND, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_EXTEND, GBP_EXTEND, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_EXTEND, GBP_OTHER, GBP_EXTEND, GBP_SPACINGMARK, GBP_EXTEND, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_OTHER, GBP_OTHER, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_OTHER, GBP_OTHER, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_EXTEND, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_OTHER, GBP_OTHER, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_SPACINGMARK, GBP_EXTEND, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_EXTEND, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_SPACINGMARK, GBP_EXTEND, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_EXTEND, GBP_SPACINGMARK, GBP_EXTEND, GBP_EXTEND, GBP_SPACINGMARK, GBP_EXTEND, GBP_EXTEND, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_EXTEND, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_OTHER, GBP_OTHER, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_EXTEND, GBP_EXTEND, GBP_SPACINGMARK, GBP_EXTEND, GBP_EXTEND, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_EXTEND, GBP_EXTEND, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_EXTEND, GBP_SPACINGMARK, GBP_EXTEND, GBP_EXTEND, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_EXTEND, GBP_SPACINGMARK, GBP_EXTEND, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_SPACINGMARK, GBP_EXTEND, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_SPACINGMARK, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_SPACINGMARK, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_OTHER, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_SPACINGMARK, GBP_EXTEND, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_OTHER, GBP_SPACINGMARK, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_SPACINGMARK, GBP_EXTEND, GBP_EXTEND, GBP_SPACINGMARK, GBP_EXTEND, GBP_EXTEND, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_SPACINGMARK, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_EXTEND, GBP_EXTEND, GBP_OTHER, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_EXTEND, GBP_SPACINGMARK, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_SPACINGMARK, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_OTHER, GBP_OTHER, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_EXTEND, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_EXTEND, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_OTHER, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_OTHER, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_OTHER, GBP_OTHER, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_OTHER, GBP_EXTEND, GBP_EXTEND, GBP_OTHER, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_RI, GBP_RI, GBP_RI, GBP_RI, GBP_RI, GBP_RI, GBP_RI, GBP_RI, GBP_RI, GBP_RI, GBP_RI, GBP_RI, GBP_RI, GBP_RI, GBP_RI, GBP_RI, GBP_RI, GBP_RI, GBP_RI, GBP_RI, GBP_RI, GBP_RI, GBP_RI, GBP_RI, GBP_RI, GBP_RI, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_EB, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_EB, GBP_EB, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_EB, GBP_EB, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_EM, GBP_EM, GBP_EM, GBP_EM, GBP_EM, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_EB, GBP_EB, GBP_OTHER, GBP_OTHER, GBP_EB, GBP_EB, GBP_EB, GBP_EB, GBP_EB, GBP_EB, GBP_EB, GBP_EB, GBP_EB, GBP_EB, GBP_EB, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_EBG, GBP_EBG, GBP_EBG, GBP_EBG, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_EB, GBP_OTHER, GBP_EB, GBP_EB, GBP_EB, GBP_EB, GBP_EB, GBP_EB, GBP_EB, GBP_EB, GBP_EB, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_EB, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_EB, GBP_EB, GBP_EB, GBP_OTHER, GBP_EB, GBP_EB, GBP_EB, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_GAZ, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_EB, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_EB, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_EB, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_EB, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_EB, GBP_EB, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_GAZ, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_EB, GBP_EB, GBP_EB, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_EB, GBP_EB, GBP_EB, GBP_EB, GBP_EB, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_EB, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_EB, GBP_EB, GBP_EB, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_EB, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_EB, GBP_EB, GBP_EB, GBP_EB, GBP_EB, GBP_EB, GBP_EB, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_EB, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_EB, GBP_OTHER, GBP_OTHER, GBP_EB, GBP_EB, GBP_EB, GBP_EB, GBP_EB, GBP_EB, GBP_EB, GBP_OTHER, GBP_OTHER, GBP_EB, GBP_EB, GBP_EB, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_OTHER, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_EXTEND, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL, GBP_CONTROL } }; pspp-1.4.1/gl/unigbrk/uc-gbrk-prop.c0000644000175000017500000000267513723215640016647 0ustar00blpblp00000000000000/* Grapheme cluster break property function. Copyright (C) 2010-2020 Free Software Foundation, Inc. Written by Ben Pfaff , 2010. 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 3 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, see . */ #include /* Specification. */ #include "unigbrk.h" #include "gbrkprop.h" int uc_graphemeclusterbreak_property (ucs4_t uc) { unsigned int index1 = uc >> gbrkprop_header_0; if (index1 < gbrkprop_header_1) { int lookup1 = unigbrkprop.level1[index1]; if (lookup1 >= 0) { unsigned int index2 = (uc >> gbrkprop_header_2) & gbrkprop_header_3; int lookup2 = unigbrkprop.level2[lookup1 + index2]; if (lookup2 >= 0) { unsigned int index3 = uc & gbrkprop_header_4; return unigbrkprop.level3[lookup2 + index3]; } } } return GBP_OTHER; } pspp-1.4.1/gl/unigbrk/uc-is-grapheme-break.c0000644000175000017500000001502413723215640020217 0ustar00blpblp00000000000000/* Grapheme cluster break function. Copyright (C) 2010-2020 Free Software Foundation, Inc. Written by Ben Pfaff , 2010. 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 3 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, see . */ #include /* Specification. */ #include "unigbrk.h" /* Evaluates to true if there is an extended grapheme cluster break between code points with GBP_* values A and B, false if there is not. The comments are the grapheme cluster boundary rules from in UAX #29. */ #define UC_IS_GRAPHEME_BREAK(A, B) \ (/* GB1 and GB2 are covered--just use a GBP_CONTROL character, such \ as 0, for sot and eot. */ \ \ /* GB3 */ \ (A) == GBP_CR && (B) == GBP_LF ? false : \ \ /* GB4 */ \ (A) == GBP_CONTROL || (A) == GBP_CR || (A) == GBP_LF ? true : \ \ /* GB5 */ \ (B) == GBP_CONTROL || (B) == GBP_CR || (B) == GBP_LF ? true : \ \ /* GB6 */ \ (A) == GBP_L && ((B) == GBP_L || (B) == GBP_V \ || (B) == GBP_LV || (B) == GBP_LVT) ? false : \ \ /* GB7 */ \ ((A) == GBP_LV || (A) == GBP_V) \ && ((B) == GBP_V || (B) == GBP_T) ? false : \ \ /* GB8 */ \ ((A) == GBP_LVT || (A) == GBP_T) && (B) == GBP_T ? false : \ \ /* GB9 */ \ (B) == GBP_EXTEND || (B) == GBP_ZWJ ? false : \ \ /* GB9a */ \ (B) == GBP_SPACINGMARK ? false : \ \ /* GB9b */ \ (A) == GBP_PREPEND ? false : \ \ /* GB10 -- incomplete */ \ ((A) == GBP_EB || (A) == GBP_EBG) && (B) == GBP_EM ? false : \ \ /* GB11 */ \ (A) == GBP_ZWJ && ((B) == GBP_GAZ || (B) == GBP_EBG) ? false \ \ /* GB999 */ \ : true) #define UC_GRAPHEME_BREAKS_FOR(A) \ ( (UC_IS_GRAPHEME_BREAK(A, GBP_OTHER) << GBP_OTHER) \ | (UC_IS_GRAPHEME_BREAK(A, GBP_CR) << GBP_CR) \ | (UC_IS_GRAPHEME_BREAK(A, GBP_LF) << GBP_LF) \ | (UC_IS_GRAPHEME_BREAK(A, GBP_CONTROL) << GBP_CONTROL) \ | (UC_IS_GRAPHEME_BREAK(A, GBP_EXTEND) << GBP_EXTEND) \ | (UC_IS_GRAPHEME_BREAK(A, GBP_PREPEND) << GBP_PREPEND) \ | (UC_IS_GRAPHEME_BREAK(A, GBP_SPACINGMARK) << GBP_SPACINGMARK) \ | (UC_IS_GRAPHEME_BREAK(A, GBP_L) << GBP_L) \ | (UC_IS_GRAPHEME_BREAK(A, GBP_V) << GBP_V) \ | (UC_IS_GRAPHEME_BREAK(A, GBP_T) << GBP_T) \ | (UC_IS_GRAPHEME_BREAK(A, GBP_LV) << GBP_LV) \ | (UC_IS_GRAPHEME_BREAK(A, GBP_LVT) << GBP_LVT) \ | (UC_IS_GRAPHEME_BREAK(A, GBP_RI) << GBP_RI) \ | (UC_IS_GRAPHEME_BREAK(A, GBP_ZWJ) << GBP_ZWJ) \ | (UC_IS_GRAPHEME_BREAK(A, GBP_EB) << GBP_EB) \ | (UC_IS_GRAPHEME_BREAK(A, GBP_EM) << GBP_EM) \ | (UC_IS_GRAPHEME_BREAK(A, GBP_GAZ) << GBP_GAZ) \ | (UC_IS_GRAPHEME_BREAK(A, GBP_EBG) << GBP_EBG)) static const unsigned long int gb_table[18] = { UC_GRAPHEME_BREAKS_FOR(0), /* GBP_OTHER */ UC_GRAPHEME_BREAKS_FOR(1), /* GBP_CR */ UC_GRAPHEME_BREAKS_FOR(2), /* GBP_LF */ UC_GRAPHEME_BREAKS_FOR(3), /* GBP_CONTROL */ UC_GRAPHEME_BREAKS_FOR(4), /* GBP_EXTEND */ UC_GRAPHEME_BREAKS_FOR(5), /* GBP_PREPEND */ UC_GRAPHEME_BREAKS_FOR(6), /* GBP_SPACINGMARK */ UC_GRAPHEME_BREAKS_FOR(7), /* GBP_L */ UC_GRAPHEME_BREAKS_FOR(8), /* GBP_V */ UC_GRAPHEME_BREAKS_FOR(9), /* GBP_T */ UC_GRAPHEME_BREAKS_FOR(10), /* GBP_LV */ UC_GRAPHEME_BREAKS_FOR(11), /* GBP_LVT */ UC_GRAPHEME_BREAKS_FOR(12), /* GBP_RI */ UC_GRAPHEME_BREAKS_FOR(13), /* GBP_ZWJ */ UC_GRAPHEME_BREAKS_FOR(14), /* GBP_EB */ UC_GRAPHEME_BREAKS_FOR(15), /* GBP_EM */ UC_GRAPHEME_BREAKS_FOR(16), /* GBP_GAZ */ UC_GRAPHEME_BREAKS_FOR(17), /* GBP_EBG */ }; bool uc_is_grapheme_break (ucs4_t a, ucs4_t b) { int a_gcp, b_gcp; if ((a | b) < 0x300) { /* GB3 is the only relevant rule for this case. */ return a != '\r' || b != '\n'; } a_gcp = uc_graphemeclusterbreak_property (a); b_gcp = uc_graphemeclusterbreak_property (b); return (gb_table[a_gcp] >> b_gcp) & 1; } pspp-1.4.1/gl/unictype.in.h0000644000175000017500000012072713723215640015147 0ustar00blpblp00000000000000/* Unicode character classification and properties. Copyright (C) 2002, 2005-2020 Free Software Foundation, Inc. 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 3 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, see . */ #ifndef _UNICTYPE_H #define _UNICTYPE_H #include "unitypes.h" /* Get bool. */ #include /* Get size_t. */ #include #ifdef __cplusplus extern "C" { #endif /* ========================================================================= */ /* Field 1 of Unicode Character Database: Character name. See "uniname.h". */ /* ========================================================================= */ /* Field 2 of Unicode Character Database: General category. */ /* Data type denoting a General category value. This is not just a bitmask, but rather a bitmask and a pointer to the lookup table, so that programs that use only the predefined bitmasks (i.e. don't combine bitmasks with & and |) don't have a link-time dependency towards the big general table. */ typedef struct { uint32_t bitmask : 31; /*bool*/ unsigned int generic : 1; union { const void *table; /* when generic is 0 */ bool (*lookup_fn) (ucs4_t uc, uint32_t bitmask); /* when generic is 1 */ } lookup; } uc_general_category_t; /* Bits and bit masks denoting General category values. UnicodeData-3.2.0.html says a 32-bit integer will always suffice to represent them. These bit masks can only be used with the uc_is_general_category_withtable function. */ enum { UC_CATEGORY_MASK_L = 0x0000001f, UC_CATEGORY_MASK_LC = 0x00000007, UC_CATEGORY_MASK_Lu = 0x00000001, UC_CATEGORY_MASK_Ll = 0x00000002, UC_CATEGORY_MASK_Lt = 0x00000004, UC_CATEGORY_MASK_Lm = 0x00000008, UC_CATEGORY_MASK_Lo = 0x00000010, UC_CATEGORY_MASK_M = 0x000000e0, UC_CATEGORY_MASK_Mn = 0x00000020, UC_CATEGORY_MASK_Mc = 0x00000040, UC_CATEGORY_MASK_Me = 0x00000080, UC_CATEGORY_MASK_N = 0x00000700, UC_CATEGORY_MASK_Nd = 0x00000100, UC_CATEGORY_MASK_Nl = 0x00000200, UC_CATEGORY_MASK_No = 0x00000400, UC_CATEGORY_MASK_P = 0x0003f800, UC_CATEGORY_MASK_Pc = 0x00000800, UC_CATEGORY_MASK_Pd = 0x00001000, UC_CATEGORY_MASK_Ps = 0x00002000, UC_CATEGORY_MASK_Pe = 0x00004000, UC_CATEGORY_MASK_Pi = 0x00008000, UC_CATEGORY_MASK_Pf = 0x00010000, UC_CATEGORY_MASK_Po = 0x00020000, UC_CATEGORY_MASK_S = 0x003c0000, UC_CATEGORY_MASK_Sm = 0x00040000, UC_CATEGORY_MASK_Sc = 0x00080000, UC_CATEGORY_MASK_Sk = 0x00100000, UC_CATEGORY_MASK_So = 0x00200000, UC_CATEGORY_MASK_Z = 0x01c00000, UC_CATEGORY_MASK_Zs = 0x00400000, UC_CATEGORY_MASK_Zl = 0x00800000, UC_CATEGORY_MASK_Zp = 0x01000000, UC_CATEGORY_MASK_C = 0x3e000000, UC_CATEGORY_MASK_Cc = 0x02000000, UC_CATEGORY_MASK_Cf = 0x04000000, UC_CATEGORY_MASK_Cs = 0x08000000, UC_CATEGORY_MASK_Co = 0x10000000, UC_CATEGORY_MASK_Cn = 0x20000000 }; /* Predefined General category values. */ extern const uc_general_category_t UC_CATEGORY_L; extern const uc_general_category_t UC_CATEGORY_LC; extern const uc_general_category_t UC_CATEGORY_Lu; extern const uc_general_category_t UC_CATEGORY_Ll; extern const uc_general_category_t UC_CATEGORY_Lt; extern const uc_general_category_t UC_CATEGORY_Lm; extern const uc_general_category_t UC_CATEGORY_Lo; extern const uc_general_category_t UC_CATEGORY_M; extern const uc_general_category_t UC_CATEGORY_Mn; extern const uc_general_category_t UC_CATEGORY_Mc; extern const uc_general_category_t UC_CATEGORY_Me; extern const uc_general_category_t UC_CATEGORY_N; extern const uc_general_category_t UC_CATEGORY_Nd; extern const uc_general_category_t UC_CATEGORY_Nl; extern const uc_general_category_t UC_CATEGORY_No; extern const uc_general_category_t UC_CATEGORY_P; extern const uc_general_category_t UC_CATEGORY_Pc; extern const uc_general_category_t UC_CATEGORY_Pd; extern const uc_general_category_t UC_CATEGORY_Ps; extern const uc_general_category_t UC_CATEGORY_Pe; extern const uc_general_category_t UC_CATEGORY_Pi; extern const uc_general_category_t UC_CATEGORY_Pf; extern const uc_general_category_t UC_CATEGORY_Po; extern const uc_general_category_t UC_CATEGORY_S; extern const uc_general_category_t UC_CATEGORY_Sm; extern const uc_general_category_t UC_CATEGORY_Sc; extern const uc_general_category_t UC_CATEGORY_Sk; extern const uc_general_category_t UC_CATEGORY_So; extern const uc_general_category_t UC_CATEGORY_Z; extern const uc_general_category_t UC_CATEGORY_Zs; extern const uc_general_category_t UC_CATEGORY_Zl; extern const uc_general_category_t UC_CATEGORY_Zp; extern const uc_general_category_t UC_CATEGORY_C; extern const uc_general_category_t UC_CATEGORY_Cc; extern const uc_general_category_t UC_CATEGORY_Cf; extern const uc_general_category_t UC_CATEGORY_Cs; extern const uc_general_category_t UC_CATEGORY_Co; extern const uc_general_category_t UC_CATEGORY_Cn; /* Non-public. */ extern const uc_general_category_t _UC_CATEGORY_NONE; /* Alias names for predefined General category values. */ #define UC_LETTER UC_CATEGORY_L #define UC_CASED_LETTER UC_CATEGORY_LC #define UC_UPPERCASE_LETTER UC_CATEGORY_Lu #define UC_LOWERCASE_LETTER UC_CATEGORY_Ll #define UC_TITLECASE_LETTER UC_CATEGORY_Lt #define UC_MODIFIER_LETTER UC_CATEGORY_Lm #define UC_OTHER_LETTER UC_CATEGORY_Lo #define UC_MARK UC_CATEGORY_M #define UC_NON_SPACING_MARK UC_CATEGORY_Mn #define UC_COMBINING_SPACING_MARK UC_CATEGORY_Mc #define UC_ENCLOSING_MARK UC_CATEGORY_Me #define UC_NUMBER UC_CATEGORY_N #define UC_DECIMAL_DIGIT_NUMBER UC_CATEGORY_Nd #define UC_LETTER_NUMBER UC_CATEGORY_Nl #define UC_OTHER_NUMBER UC_CATEGORY_No #define UC_PUNCTUATION UC_CATEGORY_P #define UC_CONNECTOR_PUNCTUATION UC_CATEGORY_Pc #define UC_DASH_PUNCTUATION UC_CATEGORY_Pd #define UC_OPEN_PUNCTUATION UC_CATEGORY_Ps /* a.k.a. UC_START_PUNCTUATION */ #define UC_CLOSE_PUNCTUATION UC_CATEGORY_Pe /* a.k.a. UC_END_PUNCTUATION */ #define UC_INITIAL_QUOTE_PUNCTUATION UC_CATEGORY_Pi #define UC_FINAL_QUOTE_PUNCTUATION UC_CATEGORY_Pf #define UC_OTHER_PUNCTUATION UC_CATEGORY_Po #define UC_SYMBOL UC_CATEGORY_S #define UC_MATH_SYMBOL UC_CATEGORY_Sm #define UC_CURRENCY_SYMBOL UC_CATEGORY_Sc #define UC_MODIFIER_SYMBOL UC_CATEGORY_Sk #define UC_OTHER_SYMBOL UC_CATEGORY_So #define UC_SEPARATOR UC_CATEGORY_Z #define UC_SPACE_SEPARATOR UC_CATEGORY_Zs #define UC_LINE_SEPARATOR UC_CATEGORY_Zl #define UC_PARAGRAPH_SEPARATOR UC_CATEGORY_Zp #define UC_OTHER UC_CATEGORY_C #define UC_CONTROL UC_CATEGORY_Cc #define UC_FORMAT UC_CATEGORY_Cf #define UC_SURROGATE UC_CATEGORY_Cs /* all of them are invalid characters */ #define UC_PRIVATE_USE UC_CATEGORY_Co #define UC_UNASSIGNED UC_CATEGORY_Cn /* some of them are invalid characters */ /* Return the union of two general categories. This corresponds to the unions of the two sets of characters. */ extern uc_general_category_t uc_general_category_or (uc_general_category_t category1, uc_general_category_t category2); /* Return the intersection of two general categories as bit masks. This *does*not* correspond to the intersection of the two sets of characters. */ extern uc_general_category_t uc_general_category_and (uc_general_category_t category1, uc_general_category_t category2); /* Return the intersection of a general category with the complement of a second general category, as bit masks. This *does*not* correspond to the intersection with complement, when viewing the categories as sets of characters. */ extern uc_general_category_t uc_general_category_and_not (uc_general_category_t category1, uc_general_category_t category2); /* Return the name of a general category. */ extern const char * uc_general_category_name (uc_general_category_t category) _UC_ATTRIBUTE_PURE; /* Return the long name of a general category. */ extern const char * uc_general_category_long_name (uc_general_category_t category) _UC_ATTRIBUTE_PURE; /* Return the general category given by name, e.g. "Lu", or by long name, e.g. "Uppercase Letter". */ extern uc_general_category_t uc_general_category_byname (const char *category_name) _UC_ATTRIBUTE_PURE; /* Return the general category of a Unicode character. */ extern uc_general_category_t uc_general_category (ucs4_t uc) _UC_ATTRIBUTE_PURE; /* Test whether a Unicode character belongs to a given category. The CATEGORY argument can be the combination of several predefined general categories. */ extern bool uc_is_general_category (ucs4_t uc, uc_general_category_t category) _UC_ATTRIBUTE_PURE; /* Likewise. This function uses a big table comprising all categories. */ extern bool uc_is_general_category_withtable (ucs4_t uc, uint32_t bitmask) _UC_ATTRIBUTE_CONST; /* ========================================================================= */ /* Field 3 of Unicode Character Database: Canonical combining class. */ /* The possible results of uc_combining_class (0..255) are described in UCD.html. The list here is not definitive; more values can be added in future versions. */ enum { UC_CCC_NR = 0, /* Not Reordered */ UC_CCC_OV = 1, /* Overlay */ UC_CCC_NK = 7, /* Nukta */ UC_CCC_KV = 8, /* Kana Voicing */ UC_CCC_VR = 9, /* Virama */ UC_CCC_ATBL = 200, /* Attached Below Left */ UC_CCC_ATB = 202, /* Attached Below */ UC_CCC_ATA = 214, /* Attached Above */ UC_CCC_ATAR = 216, /* Attached Above Right */ UC_CCC_BL = 218, /* Below Left */ UC_CCC_B = 220, /* Below */ UC_CCC_BR = 222, /* Below Right */ UC_CCC_L = 224, /* Left */ UC_CCC_R = 226, /* Right */ UC_CCC_AL = 228, /* Above Left */ UC_CCC_A = 230, /* Above */ UC_CCC_AR = 232, /* Above Right */ UC_CCC_DB = 233, /* Double Below */ UC_CCC_DA = 234, /* Double Above */ UC_CCC_IS = 240 /* Iota Subscript */ }; /* Return the canonical combining class of a Unicode character. */ extern int uc_combining_class (ucs4_t uc) _UC_ATTRIBUTE_CONST; /* Return the name of a canonical combining class. */ extern const char * uc_combining_class_name (int ccc) _UC_ATTRIBUTE_CONST; /* Return the long name of a canonical combining class. */ extern const char * uc_combining_class_long_name (int ccc) _UC_ATTRIBUTE_CONST; /* Return the canonical combining class given by name, e.g. "BL", or by long name, e.g. "Below Left". */ extern int uc_combining_class_byname (const char *ccc_name) _UC_ATTRIBUTE_PURE; /* ========================================================================= */ /* Field 4 of Unicode Character Database: Bidi class. Before Unicode 4.0, this field was called "Bidirectional category". */ enum { UC_BIDI_L, /* Left-to-Right */ UC_BIDI_LRE, /* Left-to-Right Embedding */ UC_BIDI_LRO, /* Left-to-Right Override */ UC_BIDI_R, /* Right-to-Left */ UC_BIDI_AL, /* Right-to-Left Arabic */ UC_BIDI_RLE, /* Right-to-Left Embedding */ UC_BIDI_RLO, /* Right-to-Left Override */ UC_BIDI_PDF, /* Pop Directional Format */ UC_BIDI_EN, /* European Number */ UC_BIDI_ES, /* European Number Separator */ UC_BIDI_ET, /* European Number Terminator */ UC_BIDI_AN, /* Arabic Number */ UC_BIDI_CS, /* Common Number Separator */ UC_BIDI_NSM, /* Non-Spacing Mark */ UC_BIDI_BN, /* Boundary Neutral */ UC_BIDI_B, /* Paragraph Separator */ UC_BIDI_S, /* Segment Separator */ UC_BIDI_WS, /* Whitespace */ UC_BIDI_ON, /* Other Neutral */ UC_BIDI_LRI, /* Left-to-Right Isolate */ UC_BIDI_RLI, /* Right-to-Left Isolate */ UC_BIDI_FSI, /* First Strong Isolate */ UC_BIDI_PDI /* Pop Directional Isolate */ }; /* Return the name of a bidi class. */ extern const char * uc_bidi_class_name (int bidi_class) _UC_ATTRIBUTE_CONST; /* Same; obsolete function name. */ extern const char * uc_bidi_category_name (int category) _UC_ATTRIBUTE_CONST; /* Return the long name of a bidi class. */ extern const char * uc_bidi_class_long_name (int bidi_class) _UC_ATTRIBUTE_CONST; /* Return the bidi class given by name, e.g. "LRE", or by long name, e.g. "Left-to-Right Embedding". */ extern int uc_bidi_class_byname (const char *bidi_class_name) _UC_ATTRIBUTE_PURE; /* Same; obsolete function name. */ extern int uc_bidi_category_byname (const char *category_name) _UC_ATTRIBUTE_PURE; /* Return the bidi class of a Unicode character. */ extern int uc_bidi_class (ucs4_t uc) _UC_ATTRIBUTE_CONST; /* Same; obsolete function name. */ extern int uc_bidi_category (ucs4_t uc) _UC_ATTRIBUTE_CONST; /* Test whether a Unicode character belongs to a given bidi class. */ extern bool uc_is_bidi_class (ucs4_t uc, int bidi_class) _UC_ATTRIBUTE_CONST; /* Same; obsolete function name. */ extern bool uc_is_bidi_category (ucs4_t uc, int category) _UC_ATTRIBUTE_CONST; /* ========================================================================= */ /* Field 5 of Unicode Character Database: Character decomposition mapping. See "uninorm.h". */ /* ========================================================================= */ /* Field 6 of Unicode Character Database: Decimal digit value. */ /* Return the decimal digit value of a Unicode character. */ extern int uc_decimal_value (ucs4_t uc) _UC_ATTRIBUTE_CONST; /* ========================================================================= */ /* Field 7 of Unicode Character Database: Digit value. */ /* Return the digit value of a Unicode character. */ extern int uc_digit_value (ucs4_t uc) _UC_ATTRIBUTE_CONST; /* ========================================================================= */ /* Field 8 of Unicode Character Database: Numeric value. */ /* Return the numeric value of a Unicode character. */ typedef struct { int numerator; int denominator; } uc_fraction_t; extern uc_fraction_t uc_numeric_value (ucs4_t uc) _UC_ATTRIBUTE_CONST; /* ========================================================================= */ /* Field 9 of Unicode Character Database: Mirrored. */ /* Return the mirrored character of a Unicode character UC in *PUC. */ extern bool uc_mirror_char (ucs4_t uc, ucs4_t *puc); /* ========================================================================= */ /* Field 10 of Unicode Character Database: Unicode 1.0 Name. Not available in this library. */ /* ========================================================================= */ /* Field 11 of Unicode Character Database: ISO 10646 comment. Not available in this library. */ /* ========================================================================= */ /* Field 12, 13, 14 of Unicode Character Database: Uppercase mapping, lowercase mapping, titlecase mapping. See "unicase.h". */ /* ========================================================================= */ /* Field 2 of the file ArabicShaping.txt in the Unicode Character Database. */ /* Possible joining types. */ enum { UC_JOINING_TYPE_U, /* Non_Joining */ UC_JOINING_TYPE_T, /* Transparent */ UC_JOINING_TYPE_C, /* Join_Causing */ UC_JOINING_TYPE_L, /* Left_Joining */ UC_JOINING_TYPE_R, /* Right_Joining */ UC_JOINING_TYPE_D /* Dual_Joining */ }; /* Return the name of a joining type. */ extern const char * uc_joining_type_name (int joining_type) _UC_ATTRIBUTE_CONST; /* Return the long name of a joining type. */ extern const char * uc_joining_type_long_name (int joining_type) _UC_ATTRIBUTE_CONST; /* Return the joining type given by name, e.g. "D", or by long name, e.g. "Dual Joining". */ extern int uc_joining_type_byname (const char *joining_type_name) _UC_ATTRIBUTE_PURE; /* Return the joining type of a Unicode character. */ extern int uc_joining_type (ucs4_t uc) _UC_ATTRIBUTE_CONST; /* ========================================================================= */ /* Field 3 of the file ArabicShaping.txt in the Unicode Character Database. */ /* Possible joining groups. This enumeration may be extended in the future. */ enum { UC_JOINING_GROUP_NONE, /* No_Joining_Group */ UC_JOINING_GROUP_AIN, /* Ain */ UC_JOINING_GROUP_ALAPH, /* Alaph */ UC_JOINING_GROUP_ALEF, /* Alef */ UC_JOINING_GROUP_BEH, /* Beh */ UC_JOINING_GROUP_BETH, /* Beth */ UC_JOINING_GROUP_BURUSHASKI_YEH_BARREE, /* Burushaski_Yeh_Barree */ UC_JOINING_GROUP_DAL, /* Dal */ UC_JOINING_GROUP_DALATH_RISH, /* Dalath_Rish */ UC_JOINING_GROUP_E, /* E */ UC_JOINING_GROUP_FARSI_YEH, /* Farsi_Yeh */ UC_JOINING_GROUP_FE, /* Fe */ UC_JOINING_GROUP_FEH, /* Feh */ UC_JOINING_GROUP_FINAL_SEMKATH, /* Final_Semkath */ UC_JOINING_GROUP_GAF, /* Gaf */ UC_JOINING_GROUP_GAMAL, /* Gamal */ UC_JOINING_GROUP_HAH, /* Hah */ UC_JOINING_GROUP_HE, /* He */ UC_JOINING_GROUP_HEH, /* Heh */ UC_JOINING_GROUP_HEH_GOAL, /* Heh_Goal */ UC_JOINING_GROUP_HETH, /* Heth */ UC_JOINING_GROUP_KAF, /* Kaf */ UC_JOINING_GROUP_KAPH, /* Kaph */ UC_JOINING_GROUP_KHAPH, /* Khaph */ UC_JOINING_GROUP_KNOTTED_HEH, /* Knotted_Heh */ UC_JOINING_GROUP_LAM, /* Lam */ UC_JOINING_GROUP_LAMADH, /* Lamadh */ UC_JOINING_GROUP_MEEM, /* Meem */ UC_JOINING_GROUP_MIM, /* Mim */ UC_JOINING_GROUP_NOON, /* Noon */ UC_JOINING_GROUP_NUN, /* Nun */ UC_JOINING_GROUP_NYA, /* Nya */ UC_JOINING_GROUP_PE, /* Pe */ UC_JOINING_GROUP_QAF, /* Qaf */ UC_JOINING_GROUP_QAPH, /* Qaph */ UC_JOINING_GROUP_REH, /* Reh */ UC_JOINING_GROUP_REVERSED_PE, /* Reversed_Pe */ UC_JOINING_GROUP_SAD, /* Sad */ UC_JOINING_GROUP_SADHE, /* Sadhe */ UC_JOINING_GROUP_SEEN, /* Seen */ UC_JOINING_GROUP_SEMKATH, /* Semkath */ UC_JOINING_GROUP_SHIN, /* Shin */ UC_JOINING_GROUP_SWASH_KAF, /* Swash_Kaf */ UC_JOINING_GROUP_SYRIAC_WAW, /* Syriac_Waw */ UC_JOINING_GROUP_TAH, /* Tah */ UC_JOINING_GROUP_TAW, /* Taw */ UC_JOINING_GROUP_TEH_MARBUTA, /* Teh_Marbuta */ UC_JOINING_GROUP_TEH_MARBUTA_GOAL, /* Teh_Marbuta_Goal */ UC_JOINING_GROUP_TETH, /* Teth */ UC_JOINING_GROUP_WAW, /* Waw */ UC_JOINING_GROUP_YEH, /* Yeh */ UC_JOINING_GROUP_YEH_BARREE, /* Yeh_Barree */ UC_JOINING_GROUP_YEH_WITH_TAIL, /* Yeh_With_Tail */ UC_JOINING_GROUP_YUDH, /* Yudh */ UC_JOINING_GROUP_YUDH_HE, /* Yudh_He */ UC_JOINING_GROUP_ZAIN, /* Zain */ UC_JOINING_GROUP_ZHAIN, /* Zhain */ UC_JOINING_GROUP_ROHINGYA_YEH, /* Rohingya_Yeh */ UC_JOINING_GROUP_STRAIGHT_WAW, /* Straight_Waw */ UC_JOINING_GROUP_MANICHAEAN_ALEPH, /* Manichaean_Aleph */ UC_JOINING_GROUP_MANICHAEAN_BETH, /* Manichaean_Beth */ UC_JOINING_GROUP_MANICHAEAN_GIMEL, /* Manichaean_Gimel */ UC_JOINING_GROUP_MANICHAEAN_DALETH, /* Manichaean_Daleth */ UC_JOINING_GROUP_MANICHAEAN_WAW, /* Manichaean_Waw */ UC_JOINING_GROUP_MANICHAEAN_ZAYIN, /* Manichaean_Zayin */ UC_JOINING_GROUP_MANICHAEAN_HETH, /* Manichaean_Heth */ UC_JOINING_GROUP_MANICHAEAN_TETH, /* Manichaean_Teth */ UC_JOINING_GROUP_MANICHAEAN_YODH, /* Manichaean_Yodh */ UC_JOINING_GROUP_MANICHAEAN_KAPH, /* Manichaean_Kaph */ UC_JOINING_GROUP_MANICHAEAN_LAMEDH, /* Manichaean_Lamedh */ UC_JOINING_GROUP_MANICHAEAN_DHAMEDH, /* Manichaean_Dhamedh */ UC_JOINING_GROUP_MANICHAEAN_THAMEDH, /* Manichaean_Thamedh */ UC_JOINING_GROUP_MANICHAEAN_MEM, /* Manichaean_Mem */ UC_JOINING_GROUP_MANICHAEAN_NUN, /* Manichaean_Nun */ UC_JOINING_GROUP_MANICHAEAN_SAMEKH, /* Manichaean_Aleph */ UC_JOINING_GROUP_MANICHAEAN_AYIN, /* Manichaean_Ayin */ UC_JOINING_GROUP_MANICHAEAN_PE, /* Manichaean_Pe */ UC_JOINING_GROUP_MANICHAEAN_SADHE, /* Manichaean_Sadhe */ UC_JOINING_GROUP_MANICHAEAN_QOPH, /* Manichaean_Qoph */ UC_JOINING_GROUP_MANICHAEAN_RESH, /* Manichaean_Resh */ UC_JOINING_GROUP_MANICHAEAN_TAW, /* Manichaean_Taw */ UC_JOINING_GROUP_MANICHAEAN_ONE, /* Manichaean_One */ UC_JOINING_GROUP_MANICHAEAN_FIVE, /* Manichaean_Five */ UC_JOINING_GROUP_MANICHAEAN_TEN, /* Manichaean_Ten */ UC_JOINING_GROUP_MANICHAEAN_TWENTY, /* Manichaean_Twenty */ UC_JOINING_GROUP_MANICHAEAN_HUNDRED, /* Manichaean_Hundred */ UC_JOINING_GROUP_AFRICAN_FEH, /* African_Feh */ UC_JOINING_GROUP_AFRICAN_QAF, /* African_Qaf */ UC_JOINING_GROUP_AFRICAN_NOON /* African_Noon */ }; /* Return the name of a joining group. */ extern const char * uc_joining_group_name (int joining_group) _UC_ATTRIBUTE_CONST; /* Return the joining group given by name, e.g. "Teh_Marbuta". */ extern int uc_joining_group_byname (const char *joining_group_name) _UC_ATTRIBUTE_PURE; /* Return the joining group of a Unicode character. */ extern int uc_joining_group (ucs4_t uc) _UC_ATTRIBUTE_CONST; /* ========================================================================= */ /* Common API for properties. */ /* Data type denoting a property. This is not just a number, but rather a pointer to the test functions, so that programs that use only few of the properties don't have a link-time dependency towards all the tables. */ typedef struct { bool (*test_fn) (ucs4_t uc); } uc_property_t; /* Predefined properties. */ /* General. */ extern const uc_property_t UC_PROPERTY_WHITE_SPACE; extern const uc_property_t UC_PROPERTY_ALPHABETIC; extern const uc_property_t UC_PROPERTY_OTHER_ALPHABETIC; extern const uc_property_t UC_PROPERTY_NOT_A_CHARACTER; extern const uc_property_t UC_PROPERTY_DEFAULT_IGNORABLE_CODE_POINT; extern const uc_property_t UC_PROPERTY_OTHER_DEFAULT_IGNORABLE_CODE_POINT; extern const uc_property_t UC_PROPERTY_DEPRECATED; extern const uc_property_t UC_PROPERTY_LOGICAL_ORDER_EXCEPTION; extern const uc_property_t UC_PROPERTY_VARIATION_SELECTOR; extern const uc_property_t UC_PROPERTY_PRIVATE_USE; extern const uc_property_t UC_PROPERTY_UNASSIGNED_CODE_VALUE; /* Case. */ extern const uc_property_t UC_PROPERTY_UPPERCASE; extern const uc_property_t UC_PROPERTY_OTHER_UPPERCASE; extern const uc_property_t UC_PROPERTY_LOWERCASE; extern const uc_property_t UC_PROPERTY_OTHER_LOWERCASE; extern const uc_property_t UC_PROPERTY_TITLECASE; extern const uc_property_t UC_PROPERTY_CASED; extern const uc_property_t UC_PROPERTY_CASE_IGNORABLE; extern const uc_property_t UC_PROPERTY_CHANGES_WHEN_LOWERCASED; extern const uc_property_t UC_PROPERTY_CHANGES_WHEN_UPPERCASED; extern const uc_property_t UC_PROPERTY_CHANGES_WHEN_TITLECASED; extern const uc_property_t UC_PROPERTY_CHANGES_WHEN_CASEFOLDED; extern const uc_property_t UC_PROPERTY_CHANGES_WHEN_CASEMAPPED; extern const uc_property_t UC_PROPERTY_SOFT_DOTTED; /* Identifiers. */ extern const uc_property_t UC_PROPERTY_ID_START; extern const uc_property_t UC_PROPERTY_OTHER_ID_START; extern const uc_property_t UC_PROPERTY_ID_CONTINUE; extern const uc_property_t UC_PROPERTY_OTHER_ID_CONTINUE; extern const uc_property_t UC_PROPERTY_XID_START; extern const uc_property_t UC_PROPERTY_XID_CONTINUE; extern const uc_property_t UC_PROPERTY_PATTERN_WHITE_SPACE; extern const uc_property_t UC_PROPERTY_PATTERN_SYNTAX; /* Shaping and rendering. */ extern const uc_property_t UC_PROPERTY_JOIN_CONTROL; extern const uc_property_t UC_PROPERTY_GRAPHEME_BASE; extern const uc_property_t UC_PROPERTY_GRAPHEME_EXTEND; extern const uc_property_t UC_PROPERTY_OTHER_GRAPHEME_EXTEND; extern const uc_property_t UC_PROPERTY_GRAPHEME_LINK; /* Bidi. */ extern const uc_property_t UC_PROPERTY_BIDI_CONTROL; extern const uc_property_t UC_PROPERTY_BIDI_LEFT_TO_RIGHT; extern const uc_property_t UC_PROPERTY_BIDI_HEBREW_RIGHT_TO_LEFT; extern const uc_property_t UC_PROPERTY_BIDI_ARABIC_RIGHT_TO_LEFT; extern const uc_property_t UC_PROPERTY_BIDI_EUROPEAN_DIGIT; extern const uc_property_t UC_PROPERTY_BIDI_EUR_NUM_SEPARATOR; extern const uc_property_t UC_PROPERTY_BIDI_EUR_NUM_TERMINATOR; extern const uc_property_t UC_PROPERTY_BIDI_ARABIC_DIGIT; extern const uc_property_t UC_PROPERTY_BIDI_COMMON_SEPARATOR; extern const uc_property_t UC_PROPERTY_BIDI_BLOCK_SEPARATOR; extern const uc_property_t UC_PROPERTY_BIDI_SEGMENT_SEPARATOR; extern const uc_property_t UC_PROPERTY_BIDI_WHITESPACE; extern const uc_property_t UC_PROPERTY_BIDI_NON_SPACING_MARK; extern const uc_property_t UC_PROPERTY_BIDI_BOUNDARY_NEUTRAL; extern const uc_property_t UC_PROPERTY_BIDI_PDF; extern const uc_property_t UC_PROPERTY_BIDI_EMBEDDING_OR_OVERRIDE; extern const uc_property_t UC_PROPERTY_BIDI_OTHER_NEUTRAL; /* Numeric. */ extern const uc_property_t UC_PROPERTY_HEX_DIGIT; extern const uc_property_t UC_PROPERTY_ASCII_HEX_DIGIT; /* CJK. */ extern const uc_property_t UC_PROPERTY_IDEOGRAPHIC; extern const uc_property_t UC_PROPERTY_UNIFIED_IDEOGRAPH; extern const uc_property_t UC_PROPERTY_RADICAL; extern const uc_property_t UC_PROPERTY_IDS_BINARY_OPERATOR; extern const uc_property_t UC_PROPERTY_IDS_TRINARY_OPERATOR; /* Misc. */ extern const uc_property_t UC_PROPERTY_ZERO_WIDTH; extern const uc_property_t UC_PROPERTY_SPACE; extern const uc_property_t UC_PROPERTY_NON_BREAK; extern const uc_property_t UC_PROPERTY_ISO_CONTROL; extern const uc_property_t UC_PROPERTY_FORMAT_CONTROL; extern const uc_property_t UC_PROPERTY_DASH; extern const uc_property_t UC_PROPERTY_HYPHEN; extern const uc_property_t UC_PROPERTY_PUNCTUATION; extern const uc_property_t UC_PROPERTY_LINE_SEPARATOR; extern const uc_property_t UC_PROPERTY_PARAGRAPH_SEPARATOR; extern const uc_property_t UC_PROPERTY_QUOTATION_MARK; extern const uc_property_t UC_PROPERTY_SENTENCE_TERMINAL; extern const uc_property_t UC_PROPERTY_TERMINAL_PUNCTUATION; extern const uc_property_t UC_PROPERTY_CURRENCY_SYMBOL; extern const uc_property_t UC_PROPERTY_MATH; extern const uc_property_t UC_PROPERTY_OTHER_MATH; extern const uc_property_t UC_PROPERTY_PAIRED_PUNCTUATION; extern const uc_property_t UC_PROPERTY_LEFT_OF_PAIR; extern const uc_property_t UC_PROPERTY_COMBINING; extern const uc_property_t UC_PROPERTY_COMPOSITE; extern const uc_property_t UC_PROPERTY_DECIMAL_DIGIT; extern const uc_property_t UC_PROPERTY_NUMERIC; extern const uc_property_t UC_PROPERTY_DIACRITIC; extern const uc_property_t UC_PROPERTY_EXTENDER; extern const uc_property_t UC_PROPERTY_IGNORABLE_CONTROL; /* Return the property given by name, e.g. "White space". */ extern uc_property_t uc_property_byname (const char *property_name); /* Test whether a property is valid. */ #define uc_property_is_valid(property) ((property).test_fn != NULL) /* Test whether a Unicode character has a given property. */ extern bool uc_is_property (ucs4_t uc, uc_property_t property); extern bool uc_is_property_white_space (ucs4_t uc) _UC_ATTRIBUTE_CONST; extern bool uc_is_property_alphabetic (ucs4_t uc) _UC_ATTRIBUTE_CONST; extern bool uc_is_property_other_alphabetic (ucs4_t uc) _UC_ATTRIBUTE_CONST; extern bool uc_is_property_not_a_character (ucs4_t uc) _UC_ATTRIBUTE_CONST; extern bool uc_is_property_default_ignorable_code_point (ucs4_t uc) _UC_ATTRIBUTE_CONST; extern bool uc_is_property_other_default_ignorable_code_point (ucs4_t uc) _UC_ATTRIBUTE_CONST; extern bool uc_is_property_deprecated (ucs4_t uc) _UC_ATTRIBUTE_CONST; extern bool uc_is_property_logical_order_exception (ucs4_t uc) _UC_ATTRIBUTE_CONST; extern bool uc_is_property_variation_selector (ucs4_t uc) _UC_ATTRIBUTE_CONST; extern bool uc_is_property_private_use (ucs4_t uc) _UC_ATTRIBUTE_CONST; extern bool uc_is_property_unassigned_code_value (ucs4_t uc) _UC_ATTRIBUTE_CONST; extern bool uc_is_property_uppercase (ucs4_t uc) _UC_ATTRIBUTE_CONST; extern bool uc_is_property_other_uppercase (ucs4_t uc) _UC_ATTRIBUTE_CONST; extern bool uc_is_property_lowercase (ucs4_t uc) _UC_ATTRIBUTE_CONST; extern bool uc_is_property_other_lowercase (ucs4_t uc) _UC_ATTRIBUTE_CONST; extern bool uc_is_property_titlecase (ucs4_t uc) _UC_ATTRIBUTE_CONST; extern bool uc_is_property_cased (ucs4_t uc) _UC_ATTRIBUTE_CONST; extern bool uc_is_property_case_ignorable (ucs4_t uc) _UC_ATTRIBUTE_CONST; extern bool uc_is_property_changes_when_lowercased (ucs4_t uc) _UC_ATTRIBUTE_CONST; extern bool uc_is_property_changes_when_uppercased (ucs4_t uc) _UC_ATTRIBUTE_CONST; extern bool uc_is_property_changes_when_titlecased (ucs4_t uc) _UC_ATTRIBUTE_CONST; extern bool uc_is_property_changes_when_casefolded (ucs4_t uc) _UC_ATTRIBUTE_CONST; extern bool uc_is_property_changes_when_casemapped (ucs4_t uc) _UC_ATTRIBUTE_CONST; extern bool uc_is_property_soft_dotted (ucs4_t uc) _UC_ATTRIBUTE_CONST; extern bool uc_is_property_id_start (ucs4_t uc) _UC_ATTRIBUTE_CONST; extern bool uc_is_property_other_id_start (ucs4_t uc) _UC_ATTRIBUTE_CONST; extern bool uc_is_property_id_continue (ucs4_t uc) _UC_ATTRIBUTE_CONST; extern bool uc_is_property_other_id_continue (ucs4_t uc) _UC_ATTRIBUTE_CONST; extern bool uc_is_property_xid_start (ucs4_t uc) _UC_ATTRIBUTE_CONST; extern bool uc_is_property_xid_continue (ucs4_t uc) _UC_ATTRIBUTE_CONST; extern bool uc_is_property_pattern_white_space (ucs4_t uc) _UC_ATTRIBUTE_CONST; extern bool uc_is_property_pattern_syntax (ucs4_t uc) _UC_ATTRIBUTE_CONST; extern bool uc_is_property_join_control (ucs4_t uc) _UC_ATTRIBUTE_CONST; extern bool uc_is_property_grapheme_base (ucs4_t uc) _UC_ATTRIBUTE_CONST; extern bool uc_is_property_grapheme_extend (ucs4_t uc) _UC_ATTRIBUTE_CONST; extern bool uc_is_property_other_grapheme_extend (ucs4_t uc) _UC_ATTRIBUTE_CONST; extern bool uc_is_property_grapheme_link (ucs4_t uc) _UC_ATTRIBUTE_CONST; extern bool uc_is_property_bidi_control (ucs4_t uc) _UC_ATTRIBUTE_CONST; extern bool uc_is_property_bidi_left_to_right (ucs4_t uc) _UC_ATTRIBUTE_CONST; extern bool uc_is_property_bidi_hebrew_right_to_left (ucs4_t uc) _UC_ATTRIBUTE_CONST; extern bool uc_is_property_bidi_arabic_right_to_left (ucs4_t uc) _UC_ATTRIBUTE_CONST; extern bool uc_is_property_bidi_european_digit (ucs4_t uc) _UC_ATTRIBUTE_CONST; extern bool uc_is_property_bidi_eur_num_separator (ucs4_t uc) _UC_ATTRIBUTE_CONST; extern bool uc_is_property_bidi_eur_num_terminator (ucs4_t uc) _UC_ATTRIBUTE_CONST; extern bool uc_is_property_bidi_arabic_digit (ucs4_t uc) _UC_ATTRIBUTE_CONST; extern bool uc_is_property_bidi_common_separator (ucs4_t uc) _UC_ATTRIBUTE_CONST; extern bool uc_is_property_bidi_block_separator (ucs4_t uc) _UC_ATTRIBUTE_CONST; extern bool uc_is_property_bidi_segment_separator (ucs4_t uc) _UC_ATTRIBUTE_CONST; extern bool uc_is_property_bidi_whitespace (ucs4_t uc) _UC_ATTRIBUTE_CONST; extern bool uc_is_property_bidi_non_spacing_mark (ucs4_t uc) _UC_ATTRIBUTE_CONST; extern bool uc_is_property_bidi_boundary_neutral (ucs4_t uc) _UC_ATTRIBUTE_CONST; extern bool uc_is_property_bidi_pdf (ucs4_t uc) _UC_ATTRIBUTE_CONST; extern bool uc_is_property_bidi_embedding_or_override (ucs4_t uc) _UC_ATTRIBUTE_CONST; extern bool uc_is_property_bidi_other_neutral (ucs4_t uc) _UC_ATTRIBUTE_CONST; extern bool uc_is_property_hex_digit (ucs4_t uc) _UC_ATTRIBUTE_CONST; extern bool uc_is_property_ascii_hex_digit (ucs4_t uc) _UC_ATTRIBUTE_CONST; extern bool uc_is_property_ideographic (ucs4_t uc) _UC_ATTRIBUTE_CONST; extern bool uc_is_property_unified_ideograph (ucs4_t uc) _UC_ATTRIBUTE_CONST; extern bool uc_is_property_radical (ucs4_t uc) _UC_ATTRIBUTE_CONST; extern bool uc_is_property_ids_binary_operator (ucs4_t uc) _UC_ATTRIBUTE_CONST; extern bool uc_is_property_ids_trinary_operator (ucs4_t uc) _UC_ATTRIBUTE_CONST; extern bool uc_is_property_zero_width (ucs4_t uc) _UC_ATTRIBUTE_CONST; extern bool uc_is_property_space (ucs4_t uc) _UC_ATTRIBUTE_CONST; extern bool uc_is_property_non_break (ucs4_t uc) _UC_ATTRIBUTE_CONST; extern bool uc_is_property_iso_control (ucs4_t uc) _UC_ATTRIBUTE_CONST; extern bool uc_is_property_format_control (ucs4_t uc) _UC_ATTRIBUTE_CONST; extern bool uc_is_property_dash (ucs4_t uc) _UC_ATTRIBUTE_CONST; extern bool uc_is_property_hyphen (ucs4_t uc) _UC_ATTRIBUTE_CONST; extern bool uc_is_property_punctuation (ucs4_t uc) _UC_ATTRIBUTE_CONST; extern bool uc_is_property_line_separator (ucs4_t uc) _UC_ATTRIBUTE_CONST; extern bool uc_is_property_paragraph_separator (ucs4_t uc) _UC_ATTRIBUTE_CONST; extern bool uc_is_property_quotation_mark (ucs4_t uc) _UC_ATTRIBUTE_CONST; extern bool uc_is_property_sentence_terminal (ucs4_t uc) _UC_ATTRIBUTE_CONST; extern bool uc_is_property_terminal_punctuation (ucs4_t uc) _UC_ATTRIBUTE_CONST; extern bool uc_is_property_currency_symbol (ucs4_t uc) _UC_ATTRIBUTE_CONST; extern bool uc_is_property_math (ucs4_t uc) _UC_ATTRIBUTE_CONST; extern bool uc_is_property_other_math (ucs4_t uc) _UC_ATTRIBUTE_CONST; extern bool uc_is_property_paired_punctuation (ucs4_t uc) _UC_ATTRIBUTE_CONST; extern bool uc_is_property_left_of_pair (ucs4_t uc) _UC_ATTRIBUTE_CONST; extern bool uc_is_property_combining (ucs4_t uc) _UC_ATTRIBUTE_CONST; extern bool uc_is_property_composite (ucs4_t uc) _UC_ATTRIBUTE_CONST; extern bool uc_is_property_decimal_digit (ucs4_t uc) _UC_ATTRIBUTE_CONST; extern bool uc_is_property_numeric (ucs4_t uc) _UC_ATTRIBUTE_CONST; extern bool uc_is_property_diacritic (ucs4_t uc) _UC_ATTRIBUTE_CONST; extern bool uc_is_property_extender (ucs4_t uc) _UC_ATTRIBUTE_CONST; extern bool uc_is_property_ignorable_control (ucs4_t uc) _UC_ATTRIBUTE_CONST; /* ========================================================================= */ /* Subdivision of the Unicode characters into scripts. */ typedef struct { unsigned int code : 21; unsigned int start : 1; unsigned int end : 1; } uc_interval_t; typedef struct { unsigned int nintervals; const uc_interval_t *intervals; const char *name; } uc_script_t; /* Return the script of a Unicode character. */ extern const uc_script_t * uc_script (ucs4_t uc) _UC_ATTRIBUTE_CONST; /* Return the script given by name, e.g. "HAN". */ extern const uc_script_t * uc_script_byname (const char *script_name) _UC_ATTRIBUTE_PURE; /* Test whether a Unicode character belongs to a given script. */ extern bool uc_is_script (ucs4_t uc, const uc_script_t *script) _UC_ATTRIBUTE_PURE; /* Get the list of all scripts. */ extern void uc_all_scripts (const uc_script_t **scripts, size_t *count); /* ========================================================================= */ /* Subdivision of the Unicode character range into blocks. */ typedef struct { ucs4_t start; ucs4_t end; const char *name; } uc_block_t; /* Return the block a character belongs to. */ extern const uc_block_t * uc_block (ucs4_t uc) _UC_ATTRIBUTE_CONST; /* Test whether a Unicode character belongs to a given block. */ extern bool uc_is_block (ucs4_t uc, const uc_block_t *block) _UC_ATTRIBUTE_PURE; /* Get the list of all blocks. */ extern void uc_all_blocks (const uc_block_t **blocks, size_t *count); /* ========================================================================= */ /* Properties taken from language standards. */ /* Test whether a Unicode character is considered whitespace in ISO C 99. */ extern bool uc_is_c_whitespace (ucs4_t uc) _UC_ATTRIBUTE_CONST; /* Test whether a Unicode character is considered whitespace in Java. */ extern bool uc_is_java_whitespace (ucs4_t uc) _UC_ATTRIBUTE_CONST; enum { UC_IDENTIFIER_START, /* valid as first or subsequent character */ UC_IDENTIFIER_VALID, /* valid as subsequent character only */ UC_IDENTIFIER_INVALID, /* not valid */ UC_IDENTIFIER_IGNORABLE /* ignorable (Java only) */ }; /* Return the categorization of a Unicode character w.r.t. the ISO C 99 identifier syntax. */ extern int uc_c_ident_category (ucs4_t uc) _UC_ATTRIBUTE_CONST; /* Return the categorization of a Unicode character w.r.t. the Java identifier syntax. */ extern int uc_java_ident_category (ucs4_t uc) _UC_ATTRIBUTE_CONST; /* ========================================================================= */ /* Like ISO C and . These functions are deprecated, because this set of functions was designed with ASCII in mind and cannot reflect the more diverse reality of the Unicode character set. But they can be a quick-and-dirty porting aid when migrating from wchar_t APIs to Unicode strings. */ /* Test for any character for which 'uc_is_alpha' or 'uc_is_digit' is true. */ extern bool uc_is_alnum (ucs4_t uc) _UC_ATTRIBUTE_CONST; /* Test for any character for which 'uc_is_upper' or 'uc_is_lower' is true, or any character that is one of a locale-specific set of characters for which none of 'uc_is_cntrl', 'uc_is_digit', 'uc_is_punct', or 'uc_is_space' is true. */ extern bool uc_is_alpha (ucs4_t uc) _UC_ATTRIBUTE_CONST; /* Test for any control character. */ extern bool uc_is_cntrl (ucs4_t uc) _UC_ATTRIBUTE_CONST; /* Test for any character that corresponds to a decimal-digit character. */ extern bool uc_is_digit (ucs4_t uc) _UC_ATTRIBUTE_CONST; /* Test for any character for which 'uc_is_print' is true and 'uc_is_space' is false. */ extern bool uc_is_graph (ucs4_t uc) _UC_ATTRIBUTE_CONST; /* Test for any character that corresponds to a lowercase letter or is one of a locale-specific set of characters for which none of 'uc_is_cntrl', 'uc_is_digit', 'uc_is_punct', or 'uc_is_space' is true. */ extern bool uc_is_lower (ucs4_t uc) _UC_ATTRIBUTE_CONST; /* Test for any printing character. */ extern bool uc_is_print (ucs4_t uc) _UC_ATTRIBUTE_CONST; /* Test for any printing character that is one of a locale-specific set of characters for which neither 'uc_is_space' nor 'uc_is_alnum' is true. */ extern bool uc_is_punct (ucs4_t uc) _UC_ATTRIBUTE_CONST; /* Test for any character that corresponds to a locale-specific set of characters for which none of 'uc_is_alnum', 'uc_is_graph', or 'uc_is_punct' is true. */ extern bool uc_is_space (ucs4_t uc) _UC_ATTRIBUTE_CONST; /* Test for any character that corresponds to an uppercase letter or is one of a locale-specific set of character for which none of 'uc_is_cntrl', 'uc_is_digit', 'uc_is_punct', or 'uc_is_space' is true. */ extern bool uc_is_upper (ucs4_t uc) _UC_ATTRIBUTE_CONST; /* Test for any character that corresponds to a hexadecimal-digit character. */ extern bool uc_is_xdigit (ucs4_t uc) _UC_ATTRIBUTE_CONST; /* GNU extension. */ /* Test for any character that corresponds to a standard blank character or a locale-specific set of characters for which 'uc_is_alnum' is false. */ extern bool uc_is_blank (ucs4_t uc) _UC_ATTRIBUTE_CONST; /* ========================================================================= */ #ifdef __cplusplus } #endif #endif /* _UNICTYPE_H */ pspp-1.4.1/gl/unilbrk.in.h0000644000175000017500000001004413723215640014743 0ustar00blpblp00000000000000/* Line breaking of Unicode strings. Copyright (C) 2001-2003, 2005-2020 Free Software Foundation, Inc. Written by Bruno Haible , 2001. 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 3 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, see . */ #ifndef _UNILBRK_H #define _UNILBRK_H /* Get size_t. */ #include #include "unitypes.h" /* Get locale_charset() declaration. */ #include "localcharset.h" #ifdef __cplusplus extern "C" { #endif /* These functions are locale dependent. The encoding argument identifies the encoding (e.g. "ISO-8859-2" for Polish). */ /* Line breaking. */ enum { UC_BREAK_UNDEFINED, UC_BREAK_PROHIBITED, UC_BREAK_POSSIBLE, UC_BREAK_MANDATORY, UC_BREAK_HYPHENATION }; /* Determine the line break points in S, and store the result at p[0..n-1]. p[i] = UC_BREAK_MANDATORY means that s[i] is a line break character. p[i] = UC_BREAK_POSSIBLE means that a line break may be inserted between s[i-1] and s[i]. p[i] = UC_BREAK_HYPHENATION means that a hyphen and a line break may be inserted between s[i-1] and s[i]. But beware of language dependent hyphenation rules. p[i] = UC_BREAK_PROHIBITED means that s[i-1] and s[i] must not be separated. */ extern void u8_possible_linebreaks (const uint8_t *s, size_t n, const char *encoding, char *_UC_RESTRICT p); extern void u16_possible_linebreaks (const uint16_t *s, size_t n, const char *encoding, char *_UC_RESTRICT p); extern void u32_possible_linebreaks (const uint32_t *s, size_t n, const char *encoding, char *_UC_RESTRICT p); extern void ulc_possible_linebreaks (const char *s, size_t n, const char *encoding, char *_UC_RESTRICT p); /* Choose the best line breaks, assuming the uc_width function. The string is s[0..n-1]. The maximum number of columns per line is given as WIDTH. The starting column of the string is given as START_COLUMN. If the algorithm shall keep room after the last piece, they can be given as AT_END_COLUMNS. o is an optional override; if o[i] != UC_BREAK_UNDEFINED, o[i] takes precedence over p[i] as returned by the *_possible_linebreaks function. The given ENCODING is used for disambiguating widths in uc_width. Return the column after the end of the string, and store the result at p[0..n-1]. */ extern int u8_width_linebreaks (const uint8_t *s, size_t n, int width, int start_column, int at_end_columns, const char *o, const char *encoding, char *_UC_RESTRICT p); extern int u16_width_linebreaks (const uint16_t *s, size_t n, int width, int start_column, int at_end_columns, const char *o, const char *encoding, char *_UC_RESTRICT p); extern int u32_width_linebreaks (const uint32_t *s, size_t n, int width, int start_column, int at_end_columns, const char *o, const char *encoding, char *_UC_RESTRICT p); extern int ulc_width_linebreaks (const char *s, size_t n, int width, int start_column, int at_end_columns, const char *o, const char *encoding, char *_UC_RESTRICT p); #ifdef __cplusplus } #endif #endif /* _UNILBRK_H */ pspp-1.4.1/gl/windows-once.c0000644000175000017500000000435513723215640015307 0ustar00blpblp00000000000000/* Once-only control (native Windows implementation). Copyright (C) 2005-2020 Free Software Foundation, Inc. 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 3, 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, see . */ /* Written by Bruno Haible , 2005. Based on GCC's gthr-win32.h. */ #include /* Specification. */ #include "windows-once.h" #include void glwthread_once (glwthread_once_t *once_control, void (*initfunction) (void)) { if (once_control->inited <= 0) { if (InterlockedIncrement (&once_control->started) == 0) { /* This thread is the first one to come to this once_control. */ InitializeCriticalSection (&once_control->lock); EnterCriticalSection (&once_control->lock); once_control->inited = 0; initfunction (); once_control->inited = 1; LeaveCriticalSection (&once_control->lock); } else { /* Don't let once_control->started grow and wrap around. */ InterlockedDecrement (&once_control->started); /* Some other thread has already started the initialization. Yield the CPU while waiting for the other thread to finish initializing and taking the lock. */ while (once_control->inited < 0) Sleep (0); if (once_control->inited <= 0) { /* Take the lock. This blocks until the other thread has finished calling the initfunction. */ EnterCriticalSection (&once_control->lock); LeaveCriticalSection (&once_control->lock); if (!(once_control->inited > 0)) abort (); } } } } pspp-1.4.1/gl/fseterr.h0000644000175000017500000000235313723215636014353 0ustar00blpblp00000000000000/* Set the error indicator of a stream. Copyright (C) 2007, 2009-2020 Free Software Foundation, Inc. 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 3 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, see . */ #ifndef _FSETERR_H #define _FSETERR_H #include /* Set the error indicator of the stream FP. The "error indicator" is set when an I/O operation on the stream fails, and is cleared (together with the "end-of-file" indicator) by clearerr (FP). */ #if HAVE___FSETERR /* musl libc */ # include # define fseterr(fp) __fseterr (fp) #else # ifdef __cplusplus extern "C" { # endif extern void fseterr (FILE *fp); # ifdef __cplusplus } # endif #endif #endif /* _FSETERR_H */ pspp-1.4.1/gl/realloc.c0000644000175000017500000000407113723215640014307 0ustar00blpblp00000000000000/* realloc() function that is glibc compatible. Copyright (C) 1997, 2003-2004, 2006-2007, 2009-2020 Free Software Foundation, Inc. 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 3 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, see . */ /* written by Jim Meyering and Bruno Haible */ #define _GL_USE_STDLIB_ALLOC 1 #include /* Only the AC_FUNC_REALLOC macro defines 'realloc' already in config.h. */ #ifdef realloc # define NEED_REALLOC_GNU 1 /* Whereas the gnulib module 'realloc-gnu' defines HAVE_REALLOC_GNU. */ #elif GNULIB_REALLOC_GNU && !HAVE_REALLOC_GNU # define NEED_REALLOC_GNU 1 #endif /* Infer the properties of the system's malloc function. The gnulib module 'malloc-gnu' defines HAVE_MALLOC_GNU. */ #if GNULIB_MALLOC_GNU && HAVE_MALLOC_GNU # define SYSTEM_MALLOC_GLIBC_COMPATIBLE 1 #endif #include #include /* Change the size of an allocated block of memory P to N bytes, with error checking. If N is zero, change it to 1. If P is NULL, use malloc. */ void * rpl_realloc (void *p, size_t n) { void *result; #if NEED_REALLOC_GNU if (n == 0) { n = 1; /* In theory realloc might fail, so don't rely on it to free. */ free (p); p = NULL; } #endif if (p == NULL) { #if GNULIB_REALLOC_GNU && !NEED_REALLOC_GNU && !SYSTEM_MALLOC_GLIBC_COMPATIBLE if (n == 0) n = 1; #endif result = malloc (n); } else result = realloc (p, n); #if !HAVE_REALLOC_POSIX if (result == NULL) errno = ENOMEM; #endif return result; } pspp-1.4.1/gl/mbchar.c0000644000175000017500000000234113723215637014126 0ustar00blpblp00000000000000/* Copyright (C) 2001, 2006, 2009-2020 Free Software Foundation, Inc. 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 3 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, see . */ #include #define MBCHAR_INLINE _GL_EXTERN_INLINE #include #include "mbchar.h" #if IS_BASIC_ASCII /* Bit table of characters in the ISO C "basic character set". */ const unsigned int is_basic_table [UCHAR_MAX / 32 + 1] = { 0x00001a00, /* '\t' '\v' '\f' */ 0xffffffef, /* ' '...'#' '%'...'?' */ 0xfffffffe, /* 'A'...'Z' '[' '\\' ']' '^' '_' */ 0x7ffffffe /* 'a'...'z' '{' '|' '}' '~' */ /* The remaining bits are 0. */ }; #endif /* IS_BASIC_ASCII */ pspp-1.4.1/gl/float.in.h0000644000175000017500000001677713723215636014432 0ustar00blpblp00000000000000/* A correct . Copyright (C) 2007-2020 Free Software Foundation, Inc. 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 3 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, see . */ #ifndef _@GUARD_PREFIX@_FLOAT_H #if __GNUC__ >= 3 @PRAGMA_SYSTEM_HEADER@ #endif @PRAGMA_COLUMNS@ /* The include_next requires a split double-inclusion guard. */ #@INCLUDE_NEXT@ @NEXT_FLOAT_H@ #ifndef _@GUARD_PREFIX@_FLOAT_H #define _@GUARD_PREFIX@_FLOAT_H /* 'long double' properties. */ #if defined __i386__ && (defined __BEOS__ || defined __OpenBSD__) /* Number of mantissa units, in base FLT_RADIX. */ # undef LDBL_MANT_DIG # define LDBL_MANT_DIG 64 /* Number of decimal digits that is sufficient for representing a number. */ # undef LDBL_DIG # define LDBL_DIG 18 /* x-1 where x is the smallest representable number > 1. */ # undef LDBL_EPSILON # define LDBL_EPSILON 1.0842021724855044340E-19L /* Minimum e such that FLT_RADIX^(e-1) is a normalized number. */ # undef LDBL_MIN_EXP # define LDBL_MIN_EXP (-16381) /* Maximum e such that FLT_RADIX^(e-1) is a representable finite number. */ # undef LDBL_MAX_EXP # define LDBL_MAX_EXP 16384 /* Minimum positive normalized number. */ # undef LDBL_MIN # define LDBL_MIN 3.3621031431120935063E-4932L /* Maximum representable finite number. */ # undef LDBL_MAX # define LDBL_MAX 1.1897314953572317650E+4932L /* Minimum e such that 10^e is in the range of normalized numbers. */ # undef LDBL_MIN_10_EXP # define LDBL_MIN_10_EXP (-4931) /* Maximum e such that 10^e is in the range of representable finite numbers. */ # undef LDBL_MAX_10_EXP # define LDBL_MAX_10_EXP 4932 #endif /* On FreeBSD/x86 6.4, the 'long double' type really has only 53 bits of precision in the compiler but 64 bits of precision at runtime. See . */ #if defined __i386__ && (defined __FreeBSD__ || defined __DragonFly__) /* Number of mantissa units, in base FLT_RADIX. */ # undef LDBL_MANT_DIG # define LDBL_MANT_DIG 64 /* Number of decimal digits that is sufficient for representing a number. */ # undef LDBL_DIG # define LDBL_DIG 18 /* x-1 where x is the smallest representable number > 1. */ # undef LDBL_EPSILON # define LDBL_EPSILON 1.084202172485504434007452800869941711426e-19L /* 2^-63 */ /* Minimum e such that FLT_RADIX^(e-1) is a normalized number. */ # undef LDBL_MIN_EXP # define LDBL_MIN_EXP (-16381) /* Maximum e such that FLT_RADIX^(e-1) is a representable finite number. */ # undef LDBL_MAX_EXP # define LDBL_MAX_EXP 16384 /* Minimum positive normalized number. */ # undef LDBL_MIN # define LDBL_MIN 3.362103143112093506262677817321752E-4932L /* = 0x1p-16382L */ /* Maximum representable finite number. */ # undef LDBL_MAX /* LDBL_MAX is represented as { 0xFFFFFFFF, 0xFFFFFFFF, 32766 }. But the largest literal that GCC allows us to write is 0x0.fffffffffffff8p16384L = { 0xFFFFF800, 0xFFFFFFFF, 32766 }. So, define it like this through a reference to an external variable const unsigned int LDBL_MAX[3] = { 0xFFFFFFFF, 0xFFFFFFFF, 32766 }; extern const long double LDBL_MAX; Unfortunately, this is not a constant expression. */ union gl_long_double_union { struct { unsigned int lo; unsigned int hi; unsigned int exponent; } xd; long double ld; }; extern const union gl_long_double_union gl_LDBL_MAX; # define LDBL_MAX (gl_LDBL_MAX.ld) /* Minimum e such that 10^e is in the range of normalized numbers. */ # undef LDBL_MIN_10_EXP # define LDBL_MIN_10_EXP (-4931) /* Maximum e such that 10^e is in the range of representable finite numbers. */ # undef LDBL_MAX_10_EXP # define LDBL_MAX_10_EXP 4932 #endif /* On AIX 7.1 with gcc 4.2, the values of LDBL_MIN_EXP, LDBL_MIN, LDBL_MAX are wrong. On Linux/PowerPC with gcc 4.4, the value of LDBL_MAX is wrong. */ #if (defined _ARCH_PPC || defined _POWER) && defined _AIX && (LDBL_MANT_DIG == 106) && defined __GNUC__ # undef LDBL_MIN_EXP # define LDBL_MIN_EXP DBL_MIN_EXP # undef LDBL_MIN_10_EXP # define LDBL_MIN_10_EXP DBL_MIN_10_EXP # undef LDBL_MIN # define LDBL_MIN 2.22507385850720138309023271733240406422e-308L /* DBL_MIN = 2^-1022 */ #endif #if (defined _ARCH_PPC || defined _POWER) && (defined _AIX || defined __linux__) && (LDBL_MANT_DIG == 106) && defined __GNUC__ # undef LDBL_MAX /* LDBL_MAX is represented as { 0x7FEFFFFF, 0xFFFFFFFF, 0x7C8FFFFF, 0xFFFFFFFF }. It is not easy to define: #define LDBL_MAX 1.79769313486231580793728971405302307166e308L is too small, whereas #define LDBL_MAX 1.79769313486231580793728971405302307167e308L is too large. Apparently a bug in GCC decimal-to-binary conversion. Also, I can't get values larger than #define LDBL63 ((long double) (1ULL << 63)) #define LDBL882 (LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63) #define LDBL945 (LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63) #define LDBL1008 (LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63) #define LDBL_MAX (LDBL1008 * 65535.0L + LDBL945 * (long double) 9223372036821221375ULL + LDBL882 * (long double) 4611686018427387904ULL) which is represented as { 0x7FEFFFFF, 0xFFFFFFFF, 0x7C8FFFFF, 0xF8000000 }. So, define it like this through a reference to an external variable const double LDBL_MAX[2] = { DBL_MAX, DBL_MAX / (double)134217728UL / (double)134217728UL }; extern const long double LDBL_MAX; or through a pointer cast #define LDBL_MAX \ (*(const long double *) (double[]) { DBL_MAX, DBL_MAX / (double)134217728UL / (double)134217728UL }) Unfortunately, this is not a constant expression, and the latter expression does not work well when GCC is optimizing.. */ union gl_long_double_union { struct { double hi; double lo; } dd; long double ld; }; extern const union gl_long_double_union gl_LDBL_MAX; # define LDBL_MAX (gl_LDBL_MAX.ld) #endif /* On IRIX 6.5, with cc, the value of LDBL_MANT_DIG is wrong. On IRIX 6.5, with gcc 4.2, the values of LDBL_MIN_EXP, LDBL_MIN, LDBL_EPSILON are wrong. */ #if defined __sgi && (LDBL_MANT_DIG >= 106) # undef LDBL_MANT_DIG # define LDBL_MANT_DIG 106 # if defined __GNUC__ # undef LDBL_MIN_EXP # define LDBL_MIN_EXP DBL_MIN_EXP # undef LDBL_MIN_10_EXP # define LDBL_MIN_10_EXP DBL_MIN_10_EXP # undef LDBL_MIN # define LDBL_MIN 2.22507385850720138309023271733240406422e-308L /* DBL_MIN = 2^-1022 */ # undef LDBL_EPSILON # define LDBL_EPSILON 2.46519032881566189191165176650870696773e-32L /* 2^-105 */ # endif #endif #if @REPLACE_ITOLD@ /* Pull in a function that fixes the 'int' to 'long double' conversion of glibc 2.7. */ extern # ifdef __cplusplus "C" # endif void _Qp_itoq (long double *, int); static void (*_gl_float_fix_itold) (long double *, int) = _Qp_itoq; #endif #endif /* _@GUARD_PREFIX@_FLOAT_H */ #endif /* _@GUARD_PREFIX@_FLOAT_H */ pspp-1.4.1/gl/xmalloca.c0000644000175000017500000000205113723215640014462 0ustar00blpblp00000000000000/* Safe automatic memory allocation with out of memory checking. Copyright (C) 2003, 2006-2007, 2009-2020 Free Software Foundation, Inc. Written by Bruno Haible , 2003. 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 3 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, see . */ #include /* Specification. */ #include "xmalloca.h" #include "xalloc.h" #if HAVE_ALLOCA void * xmmalloca (size_t n) { void *p; p = mmalloca (n); if (p == NULL) xalloc_die (); return p; } #endif pspp-1.4.1/gl/mktime.c0000644000175000017500000004423113723215637014164 0ustar00blpblp00000000000000/* Convert a 'struct tm' to a time_t value. Copyright (C) 1993-2020 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Paul Eggert . The GNU C Library 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 3 of the License, or (at your option) any later version. The GNU C Library 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 the GNU C Library; if not, see . */ /* The following macros influence what gets defined when this file is compiled: Macro/expression Which gnulib module This compilation unit should define _LIBC (glibc proper) mktime NEED_MKTIME_WORKING mktime rpl_mktime || NEED_MKTIME_WINDOWS NEED_MKTIME_INTERNAL mktime-internal mktime_internal */ #ifndef _LIBC # include #endif /* Assume that leap seconds are possible, unless told otherwise. If the host has a 'zic' command with a '-L leapsecondfilename' option, then it supports leap seconds; otherwise it probably doesn't. */ #ifndef LEAP_SECONDS_POSSIBLE # define LEAP_SECONDS_POSSIBLE 1 #endif #include #include #include #include #include #include #include #include #ifndef NEED_MKTIME_INTERNAL # define NEED_MKTIME_INTERNAL 0 #endif #ifndef NEED_MKTIME_WINDOWS # define NEED_MKTIME_WINDOWS 0 #endif #ifndef NEED_MKTIME_WORKING # define NEED_MKTIME_WORKING 0 #endif #include "mktime-internal.h" #if !defined _LIBC && (NEED_MKTIME_WORKING || NEED_MKTIME_WINDOWS) static void my_tzset (void) { # if NEED_MKTIME_WINDOWS /* Rectify the value of the environment variable TZ. There are four possible kinds of such values: - Traditional US time zone names, e.g. "PST8PDT". Syntax: see - Time zone names based on geography, that contain one or more slashes, e.g. "Europe/Moscow". - Time zone names based on geography, without slashes, e.g. "Singapore". - Time zone names that contain explicit DST rules. Syntax: see The Microsoft CRT understands only the first kind. It produces incorrect results if the value of TZ is of the other kinds. But in a Cygwin environment, /etc/profile.d/tzset.sh sets TZ to a value of the second kind for most geographies, or of the first kind in a few other geographies. If it is of the second kind, neutralize it. For the Microsoft CRT, an absent or empty TZ means the time zone that the user has set in the Windows Control Panel. If the value of TZ is of the third or fourth kind -- Cygwin programs understand these syntaxes as well --, it does not matter whether we neutralize it or not, since these values occur only when a Cygwin user has set TZ explicitly; this case is 1. rare and 2. under the user's responsibility. */ const char *tz = getenv ("TZ"); if (tz != NULL && strchr (tz, '/') != NULL) _putenv ("TZ="); # elif HAVE_TZSET tzset (); # endif } # undef __tzset # define __tzset() my_tzset () #endif #if defined _LIBC || NEED_MKTIME_WORKING || NEED_MKTIME_INTERNAL /* A signed type that can represent an integer number of years multiplied by four times the number of seconds in a year. It is needed when converting a tm_year value times the number of seconds in a year. The factor of four comes because these products need to be subtracted from each other, and sometimes with an offset added to them, and then with another timestamp added, without worrying about overflow. Much of the code uses long_int to represent __time64_t values, to lessen the hassle of dealing with platforms where __time64_t is unsigned, and because long_int should suffice to represent all __time64_t values that mktime can generate even on platforms where __time64_t is wider than the int components of struct tm. */ #if INT_MAX <= LONG_MAX / 4 / 366 / 24 / 60 / 60 typedef long int long_int; #else typedef long long int long_int; #endif verify (INT_MAX <= TYPE_MAXIMUM (long_int) / 4 / 366 / 24 / 60 / 60); /* Shift A right by B bits portably, by dividing A by 2**B and truncating towards minus infinity. B should be in the range 0 <= B <= LONG_INT_BITS - 2, where LONG_INT_BITS is the number of useful bits in a long_int. LONG_INT_BITS is at least 32. ISO C99 says that A >> B is implementation-defined if A < 0. Some implementations (e.g., UNICOS 9.0 on a Cray Y-MP EL) don't shift right in the usual way when A < 0, so SHR falls back on division if ordinary A >> B doesn't seem to be the usual signed shift. */ static long_int shr (long_int a, int b) { long_int one = 1; return (-one >> 1 == -1 ? a >> b : (a + (a < 0)) / (one << b) - (a < 0)); } /* Bounds for the intersection of __time64_t and long_int. */ static long_int const mktime_min = ((TYPE_SIGNED (__time64_t) && TYPE_MINIMUM (__time64_t) < TYPE_MINIMUM (long_int)) ? TYPE_MINIMUM (long_int) : TYPE_MINIMUM (__time64_t)); static long_int const mktime_max = (TYPE_MAXIMUM (long_int) < TYPE_MAXIMUM (__time64_t) ? TYPE_MAXIMUM (long_int) : TYPE_MAXIMUM (__time64_t)); #define EPOCH_YEAR 1970 #define TM_YEAR_BASE 1900 verify (TM_YEAR_BASE % 100 == 0); /* Is YEAR + TM_YEAR_BASE a leap year? */ static bool leapyear (long_int year) { /* Don't add YEAR to TM_YEAR_BASE, as that might overflow. Also, work even if YEAR is negative. */ return ((year & 3) == 0 && (year % 100 != 0 || ((year / 100) & 3) == (- (TM_YEAR_BASE / 100) & 3))); } /* How many days come before each month (0-12). */ #ifndef _LIBC static #endif const unsigned short int __mon_yday[2][13] = { /* Normal years. */ { 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365 }, /* Leap years. */ { 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, 366 } }; /* Do the values A and B differ according to the rules for tm_isdst? A and B differ if one is zero and the other positive. */ static bool isdst_differ (int a, int b) { return (!a != !b) && (0 <= a) && (0 <= b); } /* Return an integer value measuring (YEAR1-YDAY1 HOUR1:MIN1:SEC1) - (YEAR0-YDAY0 HOUR0:MIN0:SEC0) in seconds, assuming that the clocks were not adjusted between the timestamps. The YEAR values uses the same numbering as TP->tm_year. Values need not be in the usual range. However, YEAR1 - YEAR0 must not overflow even when multiplied by three times the number of seconds in a year, and likewise for YDAY1 - YDAY0 and three times the number of seconds in a day. */ static long_int ydhms_diff (long_int year1, long_int yday1, int hour1, int min1, int sec1, int year0, int yday0, int hour0, int min0, int sec0) { verify (-1 / 2 == 0); /* Compute intervening leap days correctly even if year is negative. Take care to avoid integer overflow here. */ int a4 = shr (year1, 2) + shr (TM_YEAR_BASE, 2) - ! (year1 & 3); int b4 = shr (year0, 2) + shr (TM_YEAR_BASE, 2) - ! (year0 & 3); int a100 = (a4 + (a4 < 0)) / 25 - (a4 < 0); int b100 = (b4 + (b4 < 0)) / 25 - (b4 < 0); int a400 = shr (a100, 2); int b400 = shr (b100, 2); int intervening_leap_days = (a4 - b4) - (a100 - b100) + (a400 - b400); /* Compute the desired time without overflowing. */ long_int years = year1 - year0; long_int days = 365 * years + yday1 - yday0 + intervening_leap_days; long_int hours = 24 * days + hour1 - hour0; long_int minutes = 60 * hours + min1 - min0; long_int seconds = 60 * minutes + sec1 - sec0; return seconds; } /* Return the average of A and B, even if A + B would overflow. Round toward positive infinity. */ static long_int long_int_avg (long_int a, long_int b) { return shr (a, 1) + shr (b, 1) + ((a | b) & 1); } /* Return a long_int value corresponding to (YEAR-YDAY HOUR:MIN:SEC) minus *TP seconds, assuming no clock adjustments occurred between the two timestamps. YEAR and YDAY must not be so large that multiplying them by three times the number of seconds in a year (or day, respectively) would overflow long_int. *TP should be in the usual range. */ static long_int tm_diff (long_int year, long_int yday, int hour, int min, int sec, struct tm const *tp) { return ydhms_diff (year, yday, hour, min, sec, tp->tm_year, tp->tm_yday, tp->tm_hour, tp->tm_min, tp->tm_sec); } /* Use CONVERT to convert T to a struct tm value in *TM. T must be in range for __time64_t. Return TM if successful, NULL (setting errno) on failure. */ static struct tm * convert_time (struct tm *(*convert) (const __time64_t *, struct tm *), long_int t, struct tm *tm) { __time64_t x = t; return convert (&x, tm); } /* Use CONVERT to convert *T to a broken down time in *TP. If *T is out of range for conversion, adjust it so that it is the nearest in-range value and then convert that. A value is in range if it fits in both __time64_t and long_int. Return TP on success, NULL (setting errno) on failure. */ static struct tm * ranged_convert (struct tm *(*convert) (const __time64_t *, struct tm *), long_int *t, struct tm *tp) { long_int t1 = (*t < mktime_min ? mktime_min : *t <= mktime_max ? *t : mktime_max); struct tm *r = convert_time (convert, t1, tp); if (r) { *t = t1; return r; } if (errno != EOVERFLOW) return NULL; long_int bad = t1; long_int ok = 0; struct tm oktm; oktm.tm_sec = -1; /* BAD is a known out-of-range value, and OK is a known in-range one. Use binary search to narrow the range between BAD and OK until they differ by 1. */ while (true) { long_int mid = long_int_avg (ok, bad); if (mid == ok || mid == bad) break; if (convert_time (convert, mid, tp)) ok = mid, oktm = *tp; else if (errno != EOVERFLOW) return NULL; else bad = mid; } if (oktm.tm_sec < 0) return NULL; *t = ok; *tp = oktm; return tp; } /* Convert *TP to a __time64_t value, inverting the monotonic and mostly-unit-linear conversion function CONVERT. Use *OFFSET to keep track of a guess at the offset of the result, compared to what the result would be for UTC without leap seconds. If *OFFSET's guess is correct, only one CONVERT call is needed. If successful, set *TP to the canonicalized struct tm; otherwise leave *TP alone, return ((time_t) -1) and set errno. This function is external because it is used also by timegm.c. */ __time64_t __mktime_internal (struct tm *tp, struct tm *(*convert) (const __time64_t *, struct tm *), mktime_offset_t *offset) { struct tm tm; /* The maximum number of probes (calls to CONVERT) should be enough to handle any combinations of time zone rule changes, solar time, leap seconds, and oscillations around a spring-forward gap. POSIX.1 prohibits leap seconds, but some hosts have them anyway. */ int remaining_probes = 6; /* Time requested. Copy it in case CONVERT modifies *TP; this can occur if TP is localtime's returned value and CONVERT is localtime. */ int sec = tp->tm_sec; int min = tp->tm_min; int hour = tp->tm_hour; int mday = tp->tm_mday; int mon = tp->tm_mon; int year_requested = tp->tm_year; int isdst = tp->tm_isdst; /* 1 if the previous probe was DST. */ int dst2 = 0; /* Ensure that mon is in range, and set year accordingly. */ int mon_remainder = mon % 12; int negative_mon_remainder = mon_remainder < 0; int mon_years = mon / 12 - negative_mon_remainder; long_int lyear_requested = year_requested; long_int year = lyear_requested + mon_years; /* The other values need not be in range: the remaining code handles overflows correctly. */ /* Calculate day of year from year, month, and day of month. The result need not be in range. */ int mon_yday = ((__mon_yday[leapyear (year)] [mon_remainder + 12 * negative_mon_remainder]) - 1); long_int lmday = mday; long_int yday = mon_yday + lmday; mktime_offset_t off = *offset; int negative_offset_guess; int sec_requested = sec; if (LEAP_SECONDS_POSSIBLE) { /* Handle out-of-range seconds specially, since ydhms_diff assumes every minute has 60 seconds. */ if (sec < 0) sec = 0; if (59 < sec) sec = 59; } /* Invert CONVERT by probing. First assume the same offset as last time. */ INT_SUBTRACT_WRAPV (0, off, &negative_offset_guess); long_int t0 = ydhms_diff (year, yday, hour, min, sec, EPOCH_YEAR - TM_YEAR_BASE, 0, 0, 0, negative_offset_guess); long_int t = t0, t1 = t0, t2 = t0; /* Repeatedly use the error to improve the guess. */ while (true) { if (! ranged_convert (convert, &t, &tm)) return -1; long_int dt = tm_diff (year, yday, hour, min, sec, &tm); if (dt == 0) break; if (t == t1 && t != t2 && (tm.tm_isdst < 0 || (isdst < 0 ? dst2 <= (tm.tm_isdst != 0) : (isdst != 0) != (tm.tm_isdst != 0)))) /* We can't possibly find a match, as we are oscillating between two values. The requested time probably falls within a spring-forward gap of size DT. Follow the common practice in this case, which is to return a time that is DT away from the requested time, preferring a time whose tm_isdst differs from the requested value. (If no tm_isdst was requested and only one of the two values has a nonzero tm_isdst, prefer that value.) In practice, this is more useful than returning -1. */ goto offset_found; remaining_probes--; if (remaining_probes == 0) { __set_errno (EOVERFLOW); return -1; } t1 = t2, t2 = t, t += dt, dst2 = tm.tm_isdst != 0; } /* We have a match. Check whether tm.tm_isdst has the requested value, if any. */ if (isdst_differ (isdst, tm.tm_isdst)) { /* tm.tm_isdst has the wrong value. Look for a neighboring time with the right value, and use its UTC offset. Heuristic: probe the adjacent timestamps in both directions, looking for the desired isdst. This should work for all real time zone histories in the tz database. */ /* Distance between probes when looking for a DST boundary. In tzdata2003a, the shortest period of DST is 601200 seconds (e.g., America/Recife starting 2000-10-08 01:00), and the shortest period of non-DST surrounded by DST is 694800 seconds (Africa/Tunis starting 1943-04-17 01:00). Use the minimum of these two values, so we don't miss these short periods when probing. */ int stride = 601200; /* The longest period of DST in tzdata2003a is 536454000 seconds (e.g., America/Jujuy starting 1946-10-01 01:00). The longest period of non-DST is much longer, but it makes no real sense to search for more than a year of non-DST, so use the DST max. */ int duration_max = 536454000; /* Search in both directions, so the maximum distance is half the duration; add the stride to avoid off-by-1 problems. */ int delta_bound = duration_max / 2 + stride; int delta, direction; for (delta = stride; delta < delta_bound; delta += stride) for (direction = -1; direction <= 1; direction += 2) { long_int ot; if (! INT_ADD_WRAPV (t, delta * direction, &ot)) { struct tm otm; if (! ranged_convert (convert, &ot, &otm)) return -1; if (! isdst_differ (isdst, otm.tm_isdst)) { /* We found the desired tm_isdst. Extrapolate back to the desired time. */ long_int gt = ot + tm_diff (year, yday, hour, min, sec, &otm); if (mktime_min <= gt && gt <= mktime_max) { if (convert_time (convert, gt, &tm)) { t = gt; goto offset_found; } if (errno != EOVERFLOW) return -1; } } } } __set_errno (EOVERFLOW); return -1; } offset_found: /* Set *OFFSET to the low-order bits of T - T0 - NEGATIVE_OFFSET_GUESS. This is just a heuristic to speed up the next mktime call, and correctness is unaffected if integer overflow occurs here. */ INT_SUBTRACT_WRAPV (t, t0, offset); INT_SUBTRACT_WRAPV (*offset, negative_offset_guess, offset); if (LEAP_SECONDS_POSSIBLE && sec_requested != tm.tm_sec) { /* Adjust time to reflect the tm_sec requested, not the normalized value. Also, repair any damage from a false match due to a leap second. */ long_int sec_adjustment = sec == 0 && tm.tm_sec == 60; sec_adjustment -= sec; sec_adjustment += sec_requested; if (INT_ADD_WRAPV (t, sec_adjustment, &t) || ! (mktime_min <= t && t <= mktime_max)) { __set_errno (EOVERFLOW); return -1; } if (! convert_time (convert, t, &tm)) return -1; } *tp = tm; return t; } #endif /* _LIBC || NEED_MKTIME_WORKING || NEED_MKTIME_INTERNAL */ #if defined _LIBC || NEED_MKTIME_WORKING || NEED_MKTIME_WINDOWS /* Convert *TP to a __time64_t value. */ __time64_t __mktime64 (struct tm *tp) { /* POSIX.1 8.1.1 requires that whenever mktime() is called, the time zone names contained in the external variable 'tzname' shall be set as if the tzset() function had been called. */ __tzset (); # if defined _LIBC || NEED_MKTIME_WORKING static mktime_offset_t localtime_offset; return __mktime_internal (tp, __localtime64_r, &localtime_offset); # else # undef mktime return mktime (tp); # endif } #endif /* _LIBC || NEED_MKTIME_WORKING || NEED_MKTIME_WINDOWS */ #if defined _LIBC && __TIMESIZE != 64 libc_hidden_def (__mktime64) time_t mktime (struct tm *tp) { struct tm tm = *tp; __time64_t t = __mktime64 (&tm); if (in_time_t_range (t)) { *tp = tm; return t; } else { __set_errno (EOVERFLOW); return -1; } } #endif weak_alias (mktime, timelocal) libc_hidden_def (mktime) libc_hidden_weak (timelocal) pspp-1.4.1/gl/regex.c0000644000175000017500000000612613723215640014003 0ustar00blpblp00000000000000/* Extended regular expression matching and search library. Copyright (C) 2002-2020 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Isamu Hasegawa . The GNU C Library 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 3 of the License, or (at your option) any later version. The GNU C Library 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 the GNU C Library; if not, see . */ #define __STDC_WANT_IEC_60559_BFP_EXT__ #ifndef _LIBC # include # if __GNUC_PREREQ (4, 6) # pragma GCC diagnostic ignored "-Wsuggest-attribute=pure" # endif # if __GNUC_PREREQ (4, 3) # pragma GCC diagnostic ignored "-Wold-style-definition" # pragma GCC diagnostic ignored "-Wtype-limits" # endif #endif /* Make sure no one compiles this code with a C++ compiler. */ #if defined __cplusplus && defined _LIBC # error "This is C code, use a C compiler" #endif #ifdef _LIBC /* We have to keep the namespace clean. */ # define regfree(preg) __regfree (preg) # define regexec(pr, st, nm, pm, ef) __regexec (pr, st, nm, pm, ef) # define regcomp(preg, pattern, cflags) __regcomp (preg, pattern, cflags) # define regerror(errcode, preg, errbuf, errbuf_size) \ __regerror(errcode, preg, errbuf, errbuf_size) # define re_set_registers(bu, re, nu, st, en) \ __re_set_registers (bu, re, nu, st, en) # define re_match_2(bufp, string1, size1, string2, size2, pos, regs, stop) \ __re_match_2 (bufp, string1, size1, string2, size2, pos, regs, stop) # define re_match(bufp, string, size, pos, regs) \ __re_match (bufp, string, size, pos, regs) # define re_search(bufp, string, size, startpos, range, regs) \ __re_search (bufp, string, size, startpos, range, regs) # define re_compile_pattern(pattern, length, bufp) \ __re_compile_pattern (pattern, length, bufp) # define re_set_syntax(syntax) __re_set_syntax (syntax) # define re_search_2(bufp, st1, s1, st2, s2, startpos, range, regs, stop) \ __re_search_2 (bufp, st1, s1, st2, s2, startpos, range, regs, stop) # define re_compile_fastmap(bufp) __re_compile_fastmap (bufp) # include "../locale/localeinfo.h" #endif /* On some systems, limits.h sets RE_DUP_MAX to a lower value than GNU regex allows. Include it before , which correctly #undefs RE_DUP_MAX and sets it to the right value. */ #include #include #include "regex_internal.h" #include "regex_internal.c" #include "regcomp.c" #include "regexec.c" /* Binary backward compatibility. */ #if _LIBC # include # if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_3) link_warning (re_max_failures, "the 're_max_failures' variable is obsolete and will go away.") int re_max_failures = 2000; # endif #endif pspp-1.4.1/gl/malloca.c0000644000175000017500000000640213723215637014304 0ustar00blpblp00000000000000/* Safe automatic memory allocation. Copyright (C) 2003, 2006-2007, 2009-2020 Free Software Foundation, Inc. Written by Bruno Haible , 2003, 2018. 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 3, 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, see . */ #define _GL_USE_STDLIB_ALLOC 1 #include /* Specification. */ #include "malloca.h" #include "verify.h" /* The speed critical point in this file is freea() applied to an alloca() result: it must be fast, to match the speed of alloca(). The speed of mmalloca() and freea() in the other case are not critical, because they are only invoked for big memory sizes. Here we use a bit in the address as an indicator, an idea by Ondřej Bílka. malloca() can return three types of pointers: - Pointers ≡ 0 mod 2*sa_alignment_max come from stack allocation. - Pointers ≡ sa_alignment_max mod 2*sa_alignment_max come from heap allocation. - NULL comes from a failed heap allocation. */ /* Type for holding very small pointer differences. */ typedef unsigned char small_t; /* Verify that it is wide enough. */ verify (2 * sa_alignment_max - 1 <= (small_t) -1); void * mmalloca (size_t n) { #if HAVE_ALLOCA /* Allocate one more word, used to determine the address to pass to freea(), and room for the alignment ≡ sa_alignment_max mod 2*sa_alignment_max. */ size_t nplus = n + sizeof (small_t) + 2 * sa_alignment_max - 1; if (nplus >= n) { char *mem = (char *) malloc (nplus); if (mem != NULL) { char *p = (char *)((((uintptr_t)mem + sizeof (small_t) + sa_alignment_max - 1) & ~(uintptr_t)(2 * sa_alignment_max - 1)) + sa_alignment_max); /* Here p >= mem + sizeof (small_t), and p <= mem + sizeof (small_t) + 2 * sa_alignment_max - 1 hence p + n <= mem + nplus. So, the memory range [p, p+n) lies in the allocated memory range [mem, mem + nplus). */ ((small_t *) p)[-1] = p - mem; /* p ≡ sa_alignment_max mod 2*sa_alignment_max. */ return p; } } /* Out of memory. */ return NULL; #else # if !MALLOC_0_IS_NONNULL if (n == 0) n = 1; # endif return malloc (n); #endif } #if HAVE_ALLOCA void freea (void *p) { /* Check argument. */ if ((uintptr_t) p & (sa_alignment_max - 1)) { /* p was not the result of a malloca() call. Invalid argument. */ abort (); } /* Determine whether p was a non-NULL pointer returned by mmalloca(). */ if ((uintptr_t) p & sa_alignment_max) { void *mem = (char *) p - ((small_t *) p)[-1]; free (mem); } } #endif /* * Hey Emacs! * Local Variables: * coding: utf-8 * End: */ pspp-1.4.1/gl/xmemdup0.h0000644000175000017500000000172713723215640014437 0ustar00blpblp00000000000000/* xmemdup0.h -- copy a block of arbitrary bytes, plus a trailing NUL Copyright (C) 2008-2020 Free Software Foundation, Inc. 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 3 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, see . */ #ifndef XMEMDUP_H_ # define XMEMDUP_H_ # include # ifdef __cplusplus extern "C" { # endif char *xmemdup0 (void const *p, size_t s); # ifdef __cplusplus } # endif #endif /* !XMEMDUP0_H_ */ pspp-1.4.1/gl/sys_socket.in.h0000644000175000017500000005750613723215640015501 0ustar00blpblp00000000000000/* Provide a sys/socket header file for systems lacking it (read: MinGW) and for systems where it is incomplete. Copyright (C) 2005-2020 Free Software Foundation, Inc. Written by Simon Josefsson. 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 3, 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, see . */ /* This file is supposed to be used on platforms that lack , on platforms where cannot be included standalone, and on platforms where does not provide all necessary definitions. It is intended to provide definitions and prototypes needed by an application. */ #if __GNUC__ >= 3 @PRAGMA_SYSTEM_HEADER@ #endif @PRAGMA_COLUMNS@ #if defined _GL_ALREADY_INCLUDING_SYS_SOCKET_H /* Special invocation convention: - On Cygwin 1.5.x we have a sequence of nested includes -> -> -> , and the latter includes . In this situation, the functions are not yet declared, therefore we cannot provide the C++ aliases. */ #@INCLUDE_NEXT@ @NEXT_SYS_SOCKET_H@ #else /* Normal invocation convention. */ #ifndef _@GUARD_PREFIX@_SYS_SOCKET_H #if @HAVE_SYS_SOCKET_H@ # define _GL_ALREADY_INCLUDING_SYS_SOCKET_H /* On many platforms, assumes prior inclusion of . */ # include /* On FreeBSD 6.4, defines some macros that assume that NULL is defined. */ # include /* The include_next requires a split double-inclusion guard. */ # @INCLUDE_NEXT@ @NEXT_SYS_SOCKET_H@ # undef _GL_ALREADY_INCLUDING_SYS_SOCKET_H #endif #ifndef _@GUARD_PREFIX@_SYS_SOCKET_H #define _@GUARD_PREFIX@_SYS_SOCKET_H #ifndef _GL_INLINE_HEADER_BEGIN #error "Please include config.h first." #endif _GL_INLINE_HEADER_BEGIN #ifndef _GL_SYS_SOCKET_INLINE # define _GL_SYS_SOCKET_INLINE _GL_INLINE #endif /* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */ /* The definition of _GL_ARG_NONNULL is copied here. */ /* The definition of _GL_WARN_ON_USE is copied here. */ #if !@HAVE_SA_FAMILY_T@ # if !GNULIB_defined_sa_family_t /* On OS/2 kLIBC, sa_family_t is unsigned char unless TCPV40HDRS is defined. */ # if !defined __KLIBC__ || defined TCPV40HDRS typedef unsigned short sa_family_t; # else typedef unsigned char sa_family_t; # endif # define GNULIB_defined_sa_family_t 1 # endif #endif #if @HAVE_STRUCT_SOCKADDR_STORAGE@ /* Make the 'struct sockaddr_storage' field 'ss_family' visible on AIX 7.1. */ # if !@HAVE_STRUCT_SOCKADDR_STORAGE_SS_FAMILY@ # ifndef ss_family # define ss_family __ss_family # endif # endif #else # include /* Code taken from glibc sysdeps/unix/sysv/linux/bits/socket.h on 2009-05-08, licensed under LGPLv2.1+, plus portability fixes. */ # define __ss_aligntype unsigned long int # define _SS_SIZE 256 # define _SS_PADSIZE \ (_SS_SIZE - ((sizeof (sa_family_t) >= alignof (__ss_aligntype) \ ? sizeof (sa_family_t) \ : alignof (__ss_aligntype)) \ + sizeof (__ss_aligntype))) # if !GNULIB_defined_struct_sockaddr_storage struct sockaddr_storage { sa_family_t ss_family; /* Address family, etc. */ __ss_aligntype __ss_align; /* Force desired alignment. */ char __ss_padding[_SS_PADSIZE]; }; # define GNULIB_defined_struct_sockaddr_storage 1 # endif #endif /* Get struct iovec. */ /* But avoid namespace pollution on glibc systems. */ #if ! defined __GLIBC__ # include #endif #if @HAVE_SYS_SOCKET_H@ /* A platform that has . */ /* For shutdown(). */ # if !defined SHUT_RD # define SHUT_RD 0 # endif # if !defined SHUT_WR # define SHUT_WR 1 # endif # if !defined SHUT_RDWR # define SHUT_RDWR 2 # endif # ifdef __VMS /* OpenVMS */ # ifndef CMSG_SPACE # define CMSG_SPACE(length) _CMSG_SPACE(length) # endif # ifndef CMSG_LEN # define CMSG_LEN(length) _CMSG_LEN(length) # endif # endif #else # ifdef __CYGWIN__ # error "Cygwin does have a sys/socket.h, doesn't it?!?" # endif /* A platform that lacks . Currently only MinGW is supported. See the gnulib manual regarding Windows sockets. MinGW has the header files winsock2.h and ws2tcpip.h that declare the sys/socket.h definitions we need. Note that you can influence which definitions you get by setting the WINVER symbol before including these two files. For example, getaddrinfo is only available if _WIN32_WINNT >= 0x0501 (that symbol is set indirectly through WINVER). You can set this by adding AC_DEFINE(WINVER, 0x0501) to configure.ac. Note that your code may not run on older Windows releases then. My Windows 2000 box was not able to run the code, for example. The situation is slightly confusing because suggests that getaddrinfo should be available on all Windows releases. */ # if @HAVE_WINSOCK2_H@ # include # endif # if @HAVE_WS2TCPIP_H@ # include # endif /* For shutdown(). */ # if !defined SHUT_RD && defined SD_RECEIVE # define SHUT_RD SD_RECEIVE # endif # if !defined SHUT_WR && defined SD_SEND # define SHUT_WR SD_SEND # endif # if !defined SHUT_RDWR && defined SD_BOTH # define SHUT_RDWR SD_BOTH # endif # if @HAVE_WINSOCK2_H@ /* Include headers needed by the emulation code. */ # include # include /* If these headers don't define socklen_t, does. */ # endif /* Rudimentary 'struct msghdr'; this works as long as you don't try to access msg_control or msg_controllen. */ struct msghdr { void *msg_name; socklen_t msg_namelen; struct iovec *msg_iov; int msg_iovlen; int msg_flags; }; #endif /* Ensure SO_REUSEPORT is defined. */ /* For the subtle differences between SO_REUSEPORT and SO_REUSEADDR, see https://stackoverflow.com/questions/14388706/socket-options-so-reuseaddr-and-so-reuseport-how-do-they-differ-do-they-mean-t and https://lwn.net/Articles/542629/ */ #ifndef SO_REUSEPORT # define SO_REUSEPORT SO_REUSEADDR #endif /* Fix some definitions from . */ #if @HAVE_WINSOCK2_H@ # if !GNULIB_defined_rpl_fd_isset /* Re-define FD_ISSET to avoid a WSA call while we are not using network sockets. */ _GL_SYS_SOCKET_INLINE int rpl_fd_isset (SOCKET fd, fd_set * set) { u_int i; if (set == NULL) return 0; for (i = 0; i < set->fd_count; i++) if (set->fd_array[i] == fd) return 1; return 0; } # define GNULIB_defined_rpl_fd_isset 1 # endif # undef FD_ISSET # define FD_ISSET(fd, set) rpl_fd_isset(fd, set) #endif /* Hide some function declarations from . */ #if @HAVE_WINSOCK2_H@ # if !defined _@GUARD_PREFIX@_UNISTD_H # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef close # define close close_used_without_including_unistd_h # else _GL_WARN_ON_USE (close, "close() used without including "); # endif # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef gethostname # define gethostname gethostname_used_without_including_unistd_h # else _GL_WARN_ON_USE (gethostname, "gethostname() used without including "); # endif # endif # if !defined _@GUARD_PREFIX@_SYS_SELECT_H # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef select # define select select_used_without_including_sys_select_h # else _GL_WARN_ON_USE (select, "select() used without including "); # endif # endif #endif /* Wrap everything else to use libc file descriptors for sockets. */ #if @GNULIB_SOCKET@ # if @HAVE_WINSOCK2_H@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef socket # define socket rpl_socket # endif _GL_FUNCDECL_RPL (socket, int, (int domain, int type, int protocol)); _GL_CXXALIAS_RPL (socket, int, (int domain, int type, int protocol)); # else _GL_CXXALIAS_SYS (socket, int, (int domain, int type, int protocol)); # endif _GL_CXXALIASWARN (socket); #elif @HAVE_WINSOCK2_H@ # undef socket # define socket socket_used_without_requesting_gnulib_module_socket #elif defined GNULIB_POSIXCHECK # undef socket # if HAVE_RAW_DECL_SOCKET _GL_WARN_ON_USE (socket, "socket is not always POSIX compliant - " "use gnulib module socket for portability"); # endif #endif #if @GNULIB_CONNECT@ # if @HAVE_WINSOCK2_H@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef connect # define connect rpl_connect # endif _GL_FUNCDECL_RPL (connect, int, (int fd, const struct sockaddr *addr, socklen_t addrlen) _GL_ARG_NONNULL ((2))); _GL_CXXALIAS_RPL (connect, int, (int fd, const struct sockaddr *addr, socklen_t addrlen)); # else /* Need to cast, because on NonStop Kernel, the third parameter is size_t addrlen. */ _GL_CXXALIAS_SYS_CAST (connect, int, (int fd, const struct sockaddr *addr, socklen_t addrlen)); # endif _GL_CXXALIASWARN (connect); #elif @HAVE_WINSOCK2_H@ # undef connect # define connect socket_used_without_requesting_gnulib_module_connect #elif defined GNULIB_POSIXCHECK # undef connect # if HAVE_RAW_DECL_CONNECT _GL_WARN_ON_USE (connect, "connect is not always POSIX compliant - " "use gnulib module connect for portability"); # endif #endif #if @GNULIB_ACCEPT@ # if @HAVE_WINSOCK2_H@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef accept # define accept rpl_accept # endif _GL_FUNCDECL_RPL (accept, int, (int fd, struct sockaddr *restrict addr, socklen_t *restrict addrlen)); _GL_CXXALIAS_RPL (accept, int, (int fd, struct sockaddr *restrict addr, socklen_t *restrict addrlen)); # else /* Need to cast, because on Solaris 10 systems, the third parameter is void *addrlen. */ _GL_CXXALIAS_SYS_CAST (accept, int, (int fd, struct sockaddr *restrict addr, socklen_t *restrict addrlen)); # endif _GL_CXXALIASWARN (accept); #elif @HAVE_WINSOCK2_H@ # undef accept # define accept accept_used_without_requesting_gnulib_module_accept #elif defined GNULIB_POSIXCHECK # undef accept # if HAVE_RAW_DECL_ACCEPT _GL_WARN_ON_USE (accept, "accept is not always POSIX compliant - " "use gnulib module accept for portability"); # endif #endif #if @GNULIB_BIND@ # if @HAVE_WINSOCK2_H@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef bind # define bind rpl_bind # endif _GL_FUNCDECL_RPL (bind, int, (int fd, const struct sockaddr *addr, socklen_t addrlen) _GL_ARG_NONNULL ((2))); _GL_CXXALIAS_RPL (bind, int, (int fd, const struct sockaddr *addr, socklen_t addrlen)); # else /* Need to cast, because on NonStop Kernel, the third parameter is size_t addrlen. */ _GL_CXXALIAS_SYS_CAST (bind, int, (int fd, const struct sockaddr *addr, socklen_t addrlen)); # endif _GL_CXXALIASWARN (bind); #elif @HAVE_WINSOCK2_H@ # undef bind # define bind bind_used_without_requesting_gnulib_module_bind #elif defined GNULIB_POSIXCHECK # undef bind # if HAVE_RAW_DECL_BIND _GL_WARN_ON_USE (bind, "bind is not always POSIX compliant - " "use gnulib module bind for portability"); # endif #endif #if @GNULIB_GETPEERNAME@ # if @HAVE_WINSOCK2_H@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef getpeername # define getpeername rpl_getpeername # endif _GL_FUNCDECL_RPL (getpeername, int, (int fd, struct sockaddr *restrict addr, socklen_t *restrict addrlen) _GL_ARG_NONNULL ((2, 3))); _GL_CXXALIAS_RPL (getpeername, int, (int fd, struct sockaddr *restrict addr, socklen_t *restrict addrlen)); # else /* Need to cast, because on Solaris 10 systems, the third parameter is void *addrlen. */ _GL_CXXALIAS_SYS_CAST (getpeername, int, (int fd, struct sockaddr *restrict addr, socklen_t *restrict addrlen)); # endif _GL_CXXALIASWARN (getpeername); #elif @HAVE_WINSOCK2_H@ # undef getpeername # define getpeername getpeername_used_without_requesting_gnulib_module_getpeername #elif defined GNULIB_POSIXCHECK # undef getpeername # if HAVE_RAW_DECL_GETPEERNAME _GL_WARN_ON_USE (getpeername, "getpeername is not always POSIX compliant - " "use gnulib module getpeername for portability"); # endif #endif #if @GNULIB_GETSOCKNAME@ # if @HAVE_WINSOCK2_H@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef getsockname # define getsockname rpl_getsockname # endif _GL_FUNCDECL_RPL (getsockname, int, (int fd, struct sockaddr *restrict addr, socklen_t *restrict addrlen) _GL_ARG_NONNULL ((2, 3))); _GL_CXXALIAS_RPL (getsockname, int, (int fd, struct sockaddr *restrict addr, socklen_t *restrict addrlen)); # else /* Need to cast, because on Solaris 10 systems, the third parameter is void *addrlen. */ _GL_CXXALIAS_SYS_CAST (getsockname, int, (int fd, struct sockaddr *restrict addr, socklen_t *restrict addrlen)); # endif _GL_CXXALIASWARN (getsockname); #elif @HAVE_WINSOCK2_H@ # undef getsockname # define getsockname getsockname_used_without_requesting_gnulib_module_getsockname #elif defined GNULIB_POSIXCHECK # undef getsockname # if HAVE_RAW_DECL_GETSOCKNAME _GL_WARN_ON_USE (getsockname, "getsockname is not always POSIX compliant - " "use gnulib module getsockname for portability"); # endif #endif #if @GNULIB_GETSOCKOPT@ # if @HAVE_WINSOCK2_H@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef getsockopt # define getsockopt rpl_getsockopt # endif _GL_FUNCDECL_RPL (getsockopt, int, (int fd, int level, int optname, void *restrict optval, socklen_t *restrict optlen) _GL_ARG_NONNULL ((4, 5))); _GL_CXXALIAS_RPL (getsockopt, int, (int fd, int level, int optname, void *restrict optval, socklen_t *restrict optlen)); # else /* Need to cast, because on Solaris 10 systems, the fifth parameter is void *optlen. */ _GL_CXXALIAS_SYS_CAST (getsockopt, int, (int fd, int level, int optname, void *restrict optval, socklen_t *restrict optlen)); # endif _GL_CXXALIASWARN (getsockopt); #elif @HAVE_WINSOCK2_H@ # undef getsockopt # define getsockopt getsockopt_used_without_requesting_gnulib_module_getsockopt #elif defined GNULIB_POSIXCHECK # undef getsockopt # if HAVE_RAW_DECL_GETSOCKOPT _GL_WARN_ON_USE (getsockopt, "getsockopt is not always POSIX compliant - " "use gnulib module getsockopt for portability"); # endif #endif #if @GNULIB_LISTEN@ # if @HAVE_WINSOCK2_H@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef listen # define listen rpl_listen # endif _GL_FUNCDECL_RPL (listen, int, (int fd, int backlog)); _GL_CXXALIAS_RPL (listen, int, (int fd, int backlog)); # else _GL_CXXALIAS_SYS (listen, int, (int fd, int backlog)); # endif _GL_CXXALIASWARN (listen); #elif @HAVE_WINSOCK2_H@ # undef listen # define listen listen_used_without_requesting_gnulib_module_listen #elif defined GNULIB_POSIXCHECK # undef listen # if HAVE_RAW_DECL_LISTEN _GL_WARN_ON_USE (listen, "listen is not always POSIX compliant - " "use gnulib module listen for portability"); # endif #endif #if @GNULIB_RECV@ # if @HAVE_WINSOCK2_H@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef recv # define recv rpl_recv # endif _GL_FUNCDECL_RPL (recv, ssize_t, (int fd, void *buf, size_t len, int flags) _GL_ARG_NONNULL ((2))); _GL_CXXALIAS_RPL (recv, ssize_t, (int fd, void *buf, size_t len, int flags)); # else /* Need to cast, because on HP-UX 11.31 the return type may be int, depending on compiler options. */ _GL_CXXALIAS_SYS_CAST (recv, ssize_t, (int fd, void *buf, size_t len, int flags)); # endif _GL_CXXALIASWARN (recv); #elif @HAVE_WINSOCK2_H@ # undef recv # define recv recv_used_without_requesting_gnulib_module_recv #elif defined GNULIB_POSIXCHECK # undef recv # if HAVE_RAW_DECL_RECV _GL_WARN_ON_USE (recv, "recv is not always POSIX compliant - " "use gnulib module recv for portability"); # endif #endif #if @GNULIB_SEND@ # if @HAVE_WINSOCK2_H@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef send # define send rpl_send # endif _GL_FUNCDECL_RPL (send, ssize_t, (int fd, const void *buf, size_t len, int flags) _GL_ARG_NONNULL ((2))); _GL_CXXALIAS_RPL (send, ssize_t, (int fd, const void *buf, size_t len, int flags)); # else /* Need to cast, because on HP-UX 11.31 the return type may be int, depending on compiler options. */ _GL_CXXALIAS_SYS_CAST (send, ssize_t, (int fd, const void *buf, size_t len, int flags)); # endif _GL_CXXALIASWARN (send); #elif @HAVE_WINSOCK2_H@ # undef send # define send send_used_without_requesting_gnulib_module_send #elif defined GNULIB_POSIXCHECK # undef send # if HAVE_RAW_DECL_SEND _GL_WARN_ON_USE (send, "send is not always POSIX compliant - " "use gnulib module send for portability"); # endif #endif #if @GNULIB_RECVFROM@ # if @HAVE_WINSOCK2_H@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef recvfrom # define recvfrom rpl_recvfrom # endif _GL_FUNCDECL_RPL (recvfrom, ssize_t, (int fd, void *restrict buf, size_t len, int flags, struct sockaddr *restrict from, socklen_t *restrict fromlen) _GL_ARG_NONNULL ((2))); _GL_CXXALIAS_RPL (recvfrom, ssize_t, (int fd, void *restrict buf, size_t len, int flags, struct sockaddr *restrict from, socklen_t *restrict fromlen)); # else /* Need to cast, because on Solaris 10 systems, the sixth parameter is void *fromlen. */ _GL_CXXALIAS_SYS_CAST (recvfrom, ssize_t, (int fd, void *restrict buf, size_t len, int flags, struct sockaddr *restrict from, socklen_t *restrict fromlen)); # endif _GL_CXXALIASWARN (recvfrom); #elif @HAVE_WINSOCK2_H@ # undef recvfrom # define recvfrom recvfrom_used_without_requesting_gnulib_module_recvfrom #elif defined GNULIB_POSIXCHECK # undef recvfrom # if HAVE_RAW_DECL_RECVFROM _GL_WARN_ON_USE (recvfrom, "recvfrom is not always POSIX compliant - " "use gnulib module recvfrom for portability"); # endif #endif #if @GNULIB_SENDTO@ # if @HAVE_WINSOCK2_H@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef sendto # define sendto rpl_sendto # endif _GL_FUNCDECL_RPL (sendto, ssize_t, (int fd, const void *buf, size_t len, int flags, const struct sockaddr *to, socklen_t tolen) _GL_ARG_NONNULL ((2))); _GL_CXXALIAS_RPL (sendto, ssize_t, (int fd, const void *buf, size_t len, int flags, const struct sockaddr *to, socklen_t tolen)); # else /* Need to cast, because on NonStop Kernel, the sixth parameter is size_t tolen. */ _GL_CXXALIAS_SYS_CAST (sendto, ssize_t, (int fd, const void *buf, size_t len, int flags, const struct sockaddr *to, socklen_t tolen)); # endif _GL_CXXALIASWARN (sendto); #elif @HAVE_WINSOCK2_H@ # undef sendto # define sendto sendto_used_without_requesting_gnulib_module_sendto #elif defined GNULIB_POSIXCHECK # undef sendto # if HAVE_RAW_DECL_SENDTO _GL_WARN_ON_USE (sendto, "sendto is not always POSIX compliant - " "use gnulib module sendto for portability"); # endif #endif #if @GNULIB_SETSOCKOPT@ # if @HAVE_WINSOCK2_H@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef setsockopt # define setsockopt rpl_setsockopt # endif _GL_FUNCDECL_RPL (setsockopt, int, (int fd, int level, int optname, const void * optval, socklen_t optlen) _GL_ARG_NONNULL ((4))); _GL_CXXALIAS_RPL (setsockopt, int, (int fd, int level, int optname, const void * optval, socklen_t optlen)); # else /* Need to cast, because on NonStop Kernel, the fifth parameter is size_t optlen. */ _GL_CXXALIAS_SYS_CAST (setsockopt, int, (int fd, int level, int optname, const void * optval, socklen_t optlen)); # endif _GL_CXXALIASWARN (setsockopt); #elif @HAVE_WINSOCK2_H@ # undef setsockopt # define setsockopt setsockopt_used_without_requesting_gnulib_module_setsockopt #elif defined GNULIB_POSIXCHECK # undef setsockopt # if HAVE_RAW_DECL_SETSOCKOPT _GL_WARN_ON_USE (setsockopt, "setsockopt is not always POSIX compliant - " "use gnulib module setsockopt for portability"); # endif #endif #if @GNULIB_SHUTDOWN@ # if @HAVE_WINSOCK2_H@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef shutdown # define shutdown rpl_shutdown # endif _GL_FUNCDECL_RPL (shutdown, int, (int fd, int how)); _GL_CXXALIAS_RPL (shutdown, int, (int fd, int how)); # else _GL_CXXALIAS_SYS (shutdown, int, (int fd, int how)); # endif _GL_CXXALIASWARN (shutdown); #elif @HAVE_WINSOCK2_H@ # undef shutdown # define shutdown shutdown_used_without_requesting_gnulib_module_shutdown #elif defined GNULIB_POSIXCHECK # undef shutdown # if HAVE_RAW_DECL_SHUTDOWN _GL_WARN_ON_USE (shutdown, "shutdown is not always POSIX compliant - " "use gnulib module shutdown for portability"); # endif #endif #if @GNULIB_ACCEPT4@ /* Accept a connection on a socket, with specific opening flags. The flags are a bitmask, possibly including O_CLOEXEC (defined in ) and O_TEXT, O_BINARY (defined in "binary-io.h"). See also the Linux man page at . */ # if @HAVE_ACCEPT4@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # define accept4 rpl_accept4 # endif _GL_FUNCDECL_RPL (accept4, int, (int sockfd, struct sockaddr *addr, socklen_t *addrlen, int flags)); _GL_CXXALIAS_RPL (accept4, int, (int sockfd, struct sockaddr *addr, socklen_t *addrlen, int flags)); # else _GL_FUNCDECL_SYS (accept4, int, (int sockfd, struct sockaddr *addr, socklen_t *addrlen, int flags)); _GL_CXXALIAS_SYS (accept4, int, (int sockfd, struct sockaddr *addr, socklen_t *addrlen, int flags)); # endif _GL_CXXALIASWARN (accept4); #elif defined GNULIB_POSIXCHECK # undef accept4 # if HAVE_RAW_DECL_ACCEPT4 _GL_WARN_ON_USE (accept4, "accept4 is unportable - " "use gnulib module accept4 for portability"); # endif #endif _GL_INLINE_HEADER_END #endif /* _@GUARD_PREFIX@_SYS_SOCKET_H */ #endif /* _@GUARD_PREFIX@_SYS_SOCKET_H */ #endif pspp-1.4.1/gl/mbtowc.c0000644000175000017500000000164713723215637014175 0ustar00blpblp00000000000000/* Convert multibyte character to wide character. Copyright (C) 2011-2020 Free Software Foundation, Inc. Written by Bruno Haible , 2011. 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 3 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, see . */ #include #include #include #include #include #include "mbtowc-impl.h" pspp-1.4.1/gl/sprintf.c0000644000175000017500000000414513723215640014355 0ustar00blpblp00000000000000/* Formatted output to strings. Copyright (C) 2004, 2006-2020 Free Software Foundation, Inc. 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 3 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, see . */ #ifdef HAVE_CONFIG_H # include #endif /* Specification. */ #include #include #include #include #include #include #include "vasnprintf.h" #ifndef SIZE_MAX # define SIZE_MAX ((size_t) -1) #endif /* Print formatted output to string STR. Return string length of formatted string. On error, return a negative value. */ int sprintf (char *str, const char *format, ...) { char *output; size_t len; size_t lenbuf; va_list args; /* vasnprintf fails with EOVERFLOW when the buffer size argument is larger than INT_MAX (if that fits into a 'size_t' at all). Also note that glibc's iconv fails with E2BIG when we pass a length that is so large that str + lenbuf wraps around, i.e. (uintptr_t) (str + lenbuf) < (uintptr_t) str. Therefore set lenbuf = min (SIZE_MAX, INT_MAX, - (uintptr_t) str - 1). */ lenbuf = (SIZE_MAX < INT_MAX ? SIZE_MAX : INT_MAX); if (lenbuf > ~ (uintptr_t) str) lenbuf = ~ (uintptr_t) str; va_start (args, format); output = vasnprintf (str, &lenbuf, format, args); len = lenbuf; va_end (args); if (!output) return -1; if (output != str) { /* len is near SIZE_MAX. */ free (output); errno = EOVERFLOW; return -1; } if (len > INT_MAX) { errno = EOVERFLOW; return -1; } return len; } pspp-1.4.1/gl/binary-io.h0000644000175000017500000000457313723215636014600 0ustar00blpblp00000000000000/* Binary mode I/O. Copyright (C) 2001, 2003, 2005, 2008-2020 Free Software Foundation, Inc. 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 3 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, see . */ #ifndef _BINARY_H #define _BINARY_H /* For systems that distinguish between text and binary I/O. O_BINARY is guaranteed by the gnulib . */ #include /* The MSVC7 doesn't like to be included after '#define fileno ...', so we include it here first. */ #include #ifndef _GL_INLINE_HEADER_BEGIN #error "Please include config.h first." #endif _GL_INLINE_HEADER_BEGIN #ifndef BINARY_IO_INLINE # define BINARY_IO_INLINE _GL_INLINE #endif #if O_BINARY # if defined __EMX__ || defined __DJGPP__ || defined __CYGWIN__ # include /* declares setmode() */ # define __gl_setmode setmode # else # define __gl_setmode _setmode # undef fileno # define fileno _fileno # endif #else /* On reasonable systems, binary I/O is the only choice. */ /* Use a function rather than a macro, to avoid gcc warnings "warning: statement with no effect". */ BINARY_IO_INLINE int __gl_setmode (int fd _GL_UNUSED, int mode _GL_UNUSED) { return O_BINARY; } #endif /* Set FD's mode to MODE, which should be either O_TEXT or O_BINARY. Return the old mode if successful, -1 (setting errno) on failure. Ordinarily this function would be called 'setmode', since that is its name on MS-Windows, but it is called 'set_binary_mode' here to avoid colliding with a BSD function of another name. */ #if defined __DJGPP__ || defined __EMX__ extern int set_binary_mode (int fd, int mode); #else BINARY_IO_INLINE int set_binary_mode (int fd, int mode) { return __gl_setmode (fd, mode); } #endif /* This macro is obsolescent. */ #define SET_BINARY(fd) ((void) set_binary_mode (fd, O_BINARY)) _GL_INLINE_HEADER_END #endif /* _BINARY_H */ pspp-1.4.1/gl/mbsinit.c0000644000175000017500000000452613723215637014346 0ustar00blpblp00000000000000/* Test for initial conversion state. Copyright (C) 2008-2020 Free Software Foundation, Inc. Written by Bruno Haible , 2008. 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 3 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, see . */ #include /* Specification. */ #include #include "verify.h" #if GNULIB_defined_mbstate_t /* Platforms that lack mbsinit() also lack mbrlen(), mbrtowc(), mbsrtowcs() and wcrtomb(), wcsrtombs(). We assume that - sizeof (mbstate_t) >= 4, - only stateless encodings are supported (such as UTF-8 and EUC-JP, but not ISO-2022 variants), - for each encoding, the number of bytes for a wide character is <= 4. (This maximum is attained for UTF-8, GB18030, EUC-TW.) We define the meaning of mbstate_t as follows: - In mb -> wc direction, mbstate_t's first byte contains the number of buffered bytes (in the range 0..3), followed by up to 3 buffered bytes. See mbrtowc.c. - In wc -> mb direction, mbstate_t contains no information. In other words, it is always in the initial state. */ verify (sizeof (mbstate_t) >= 4); int mbsinit (const mbstate_t *ps) { const char *pstate = (const char *)ps; return pstate == NULL || pstate[0] == 0; } #else int mbsinit (const mbstate_t *ps) { # if defined _WIN32 && !defined __CYGWIN__ /* Native Windows. */ /* MSVC defines 'mbstate_t' as an 8-byte struct; the first 4 bytes matter. On mingw, 'mbstate_t' is sometimes defined as 'int', sometimes defined as an 8-byte struct, of which the first 4 bytes matter. */ return ps == NULL || *(const unsigned int *)ps == 0; # else /* Minix, HP-UX 11.00, Solaris 2.6, Interix, ... */ /* Maybe this definition works, maybe not... */ return ps == NULL || *(const char *)ps == 0; # endif } #endif pspp-1.4.1/gl/xstrndup.c0000644000175000017500000000224613723215640014557 0ustar00blpblp00000000000000/* Duplicate a bounded initial segment of a string, with out-of-memory checking. Copyright (C) 2003, 2006-2007, 2009-2020 Free Software Foundation, Inc. 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 3 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, see . */ #include /* Specification. */ #include "xstrndup.h" #include #include "xalloc.h" /* Return a newly allocated copy of at most N bytes of STRING. In other words, return a copy of the initial segment of length N of STRING. */ char * xstrndup (const char *string, size_t n) { char *s = strndup (string, n); if (! s) xalloc_die (); return s; } pspp-1.4.1/gl/progname.c0000644000175000017500000000615113723215640014477 0ustar00blpblp00000000000000/* Program name management. Copyright (C) 2001-2003, 2005-2020 Free Software Foundation, Inc. Written by Bruno Haible , 2001. 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 3 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, see . */ #include /* Specification. */ #undef ENABLE_RELOCATABLE /* avoid defining set_program_name as a macro */ #include "progname.h" #include /* get program_invocation_name declaration */ #include #include #include /* String containing name the program is called with. To be initialized by main(). */ const char *program_name = NULL; /* Set program_name, based on argv[0]. argv0 must be a string allocated with indefinite extent, and must not be modified after this call. */ void set_program_name (const char *argv0) { /* libtool creates a temporary executable whose name is sometimes prefixed with "lt-" (depends on the platform). It also makes argv[0] absolute. But the name of the temporary executable is a detail that should not be visible to the end user and to the test suite. Remove this "/.libs/" or "/.libs/lt-" prefix here. */ const char *slash; const char *base; /* Sanity check. POSIX requires the invoking process to pass a non-NULL argv[0]. */ if (argv0 == NULL) { /* It's a bug in the invoking program. Help diagnosing it. */ fputs ("A NULL argv[0] was passed through an exec system call.\n", stderr); abort (); } slash = strrchr (argv0, '/'); base = (slash != NULL ? slash + 1 : argv0); if (base - argv0 >= 7 && strncmp (base - 7, "/.libs/", 7) == 0) { argv0 = base; if (strncmp (base, "lt-", 3) == 0) { argv0 = base + 3; /* On glibc systems, remove the "lt-" prefix from the variable program_invocation_short_name. */ #if HAVE_DECL_PROGRAM_INVOCATION_SHORT_NAME program_invocation_short_name = (char *) argv0; #endif } } /* But don't strip off a leading / in general, because when the user runs /some/hidden/place/bin/cp foo foo he should get the error message /some/hidden/place/bin/cp: `foo' and `foo' are the same file not cp: `foo' and `foo' are the same file */ program_name = argv0; /* On glibc systems, the error() function comes from libc and uses the variable program_invocation_name, not program_name. So set this variable as well. */ #if HAVE_DECL_PROGRAM_INVOCATION_NAME program_invocation_name = (char *) argv0; #endif } pspp-1.4.1/gl/close.c0000644000175000017500000000277013723215636014004 0ustar00blpblp00000000000000/* close replacement. Copyright (C) 2008-2020 Free Software Foundation, Inc. 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 3 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, see . */ #include /* Specification. */ #include #include #include "fd-hook.h" #if HAVE_MSVC_INVALID_PARAMETER_HANDLER # include "msvc-inval.h" #endif #undef close #if HAVE_MSVC_INVALID_PARAMETER_HANDLER static int close_nothrow (int fd) { int result; TRY_MSVC_INVAL { result = close (fd); } CATCH_MSVC_INVAL { result = -1; errno = EBADF; } DONE_MSVC_INVAL; return result; } #else # define close_nothrow close #endif /* Override close() to call into other gnulib modules. */ int rpl_close (int fd) { #if WINDOWS_SOCKETS int retval = execute_all_close_hooks (close_nothrow, fd); #else int retval = close_nothrow (fd); #endif #if REPLACE_FCHDIR if (retval >= 0) _gl_unregister_fd (fd); #endif return retval; } pspp-1.4.1/gl/full-write.c0000644000175000017500000000436213723215637014771 0ustar00blpblp00000000000000/* An interface to read and write that retries (if necessary) until complete. Copyright (C) 1993-1994, 1997-2006, 2009-2020 Free Software Foundation, Inc. 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 3 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, see . */ #include /* Specification. */ #ifdef FULL_READ # include "full-read.h" #else # include "full-write.h" #endif #include #ifdef FULL_READ # include "safe-read.h" # define safe_rw safe_read # define full_rw full_read # undef const # define const /* empty */ #else # include "safe-write.h" # define safe_rw safe_write # define full_rw full_write #endif #ifdef FULL_READ /* Set errno to zero upon EOF. */ # define ZERO_BYTE_TRANSFER_ERRNO 0 #else /* Some buggy drivers return 0 when one tries to write beyond a device's end. (Example: Linux 1.2.13 on /dev/fd0.) Set errno to ENOSPC so they get a sensible diagnostic. */ # define ZERO_BYTE_TRANSFER_ERRNO ENOSPC #endif /* Write(read) COUNT bytes at BUF to(from) descriptor FD, retrying if interrupted or if a partial write(read) occurs. Return the number of bytes transferred. When writing, set errno if fewer than COUNT bytes are written. When reading, if fewer than COUNT bytes are read, you must examine errno to distinguish failure from EOF (errno == 0). */ size_t full_rw (int fd, const void *buf, size_t count) { size_t total = 0; const char *ptr = (const char *) buf; while (count > 0) { size_t n_rw = safe_rw (fd, ptr, count); if (n_rw == (size_t) -1) break; if (n_rw == 0) { errno = ZERO_BYTE_TRANSFER_ERRNO; break; } total += n_rw; ptr += n_rw; count -= n_rw; } return total; } pspp-1.4.1/gl/mkdir.c0000644000175000017500000000517013723215637014003 0ustar00blpblp00000000000000/* On some systems, mkdir ("foo/", 0700) fails because of the trailing slash. On those systems, this wrapper removes the trailing slash. Copyright (C) 2001, 2003, 2006, 2008-2020 Free Software Foundation, Inc. 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 3 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, see . */ /* written by Jim Meyering */ #include /* Specification. */ #include #include #include #include #include #include "dirname.h" /* Disable the definition of mkdir to rpl_mkdir (from the substitute) in this file. Otherwise, we'd get an endless recursion. */ #undef mkdir /* mingw's _mkdir() function has 1 argument, but we pass 2 arguments. Additionally, it declares _mkdir (and depending on compile flags, an alias mkdir), only in the nonstandard includes and , which are included in the override. */ #if defined _WIN32 && ! defined __CYGWIN__ # define mkdir(name,mode) _mkdir (name) # define maybe_unused _GL_UNUSED #else # define maybe_unused /* empty */ #endif /* This function is required at least for NetBSD 1.5.2. */ int rpl_mkdir (char const *dir, mode_t mode maybe_unused) { int ret_val; char *tmp_dir; size_t len = strlen (dir); if (len && dir[len - 1] == '/') { tmp_dir = strdup (dir); if (!tmp_dir) { /* Rather than rely on strdup-posix, we set errno ourselves. */ errno = ENOMEM; return -1; } strip_trailing_slashes (tmp_dir); } else { tmp_dir = (char *) dir; } #if FUNC_MKDIR_DOT_BUG /* Additionally, cygwin 1.5 mistakenly creates a directory "d/./". */ { char *last = last_component (tmp_dir); if (*last == '.' && (last[1] == '\0' || (last[1] == '.' && last[2] == '\0'))) { struct stat st; if (stat (tmp_dir, &st) == 0) errno = EEXIST; return -1; } } #endif /* FUNC_MKDIR_DOT_BUG */ ret_val = mkdir (tmp_dir, mode); if (tmp_dir != dir) free (tmp_dir); return ret_val; } pspp-1.4.1/gl/sigaction.c0000644000175000017500000001611513723215640014650 0ustar00blpblp00000000000000/* POSIX compatible signal blocking. Copyright (C) 2008-2020 Free Software Foundation, Inc. Written by Eric Blake , 2008. 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 3 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, see . */ #include /* Specification. */ #include #include #include #include /* This implementation of sigaction is tailored to native Windows behavior: signal() has SysV semantics (ie. the handler is uninstalled before it is invoked). This is an inherent data race if an asynchronous signal is sent twice in a row before we can reinstall our handler, but there's nothing we can do about it. Meanwhile, sigprocmask() is not present, and while we can use the gnulib replacement to provide critical sections, it too suffers from potential data races in the face of an ill-timed asynchronous signal. And we compound the situation by reading static storage in a signal handler, which POSIX warns is not generically async-signal-safe. Oh well. Additionally: - We don't implement SA_NOCLDSTOP or SA_NOCLDWAIT, because SIGCHLD is not defined. - We don't implement SA_ONSTACK, because sigaltstack() is not present. - We ignore SA_RESTART, because blocking native Windows API calls are not interrupted anyway when an asynchronous signal occurs, and the MSVCRT runtime never sets errno to EINTR. - We don't implement SA_SIGINFO because it is impossible to do so portably. POSIX states that an application should not mix signal() and sigaction(). We support the use of signal() within the gnulib sigprocmask() substitute, but all other application code linked with this module should stick with only sigaction(). */ /* Check some of our assumptions. */ #if defined SIGCHLD || defined HAVE_SIGALTSTACK || defined HAVE_SIGINTERRUPT # error "Revisit the assumptions made in the sigaction module" #endif /* Out-of-range substitutes make a good fallback for uncatchable signals. */ #ifndef SIGKILL # define SIGKILL (-1) #endif #ifndef SIGSTOP # define SIGSTOP (-1) #endif /* On native Windows, as of 2008, the signal SIGABRT_COMPAT is an alias for the signal SIGABRT. Only one signal handler is stored for both SIGABRT and SIGABRT_COMPAT. SIGABRT_COMPAT is not a signal of its own. */ #if defined _WIN32 && ! defined __CYGWIN__ # undef SIGABRT_COMPAT # define SIGABRT_COMPAT 6 #endif /* A signal handler. */ typedef void (*handler_t) (int signal); /* Set of current actions. If sa_handler for an entry is NULL, then that signal is not currently handled by the sigaction handler. */ static struct sigaction volatile action_array[NSIG] /* = 0 */; /* Signal handler that is installed for signals. */ static void sigaction_handler (int sig) { handler_t handler; sigset_t mask; sigset_t oldmask; int saved_errno = errno; if (sig < 0 || NSIG <= sig || !action_array[sig].sa_handler) { /* Unexpected situation; be careful to avoid recursive abort. */ if (sig == SIGABRT) signal (SIGABRT, SIG_DFL); abort (); } /* Reinstall the signal handler when required; otherwise update the bookkeeping so that the user's handler may call sigaction and get accurate results. We know the signal isn't currently blocked, or we wouldn't be in its handler, therefore we know that we are not interrupting a sigaction() call. There is a race where any asynchronous instance of the same signal occurring before we reinstall the handler will trigger the default handler; oh well. */ handler = action_array[sig].sa_handler; if ((action_array[sig].sa_flags & SA_RESETHAND) == 0) signal (sig, sigaction_handler); else action_array[sig].sa_handler = NULL; /* Block appropriate signals. */ mask = action_array[sig].sa_mask; if ((action_array[sig].sa_flags & SA_NODEFER) == 0) sigaddset (&mask, sig); sigprocmask (SIG_BLOCK, &mask, &oldmask); /* Invoke the user's handler, then restore prior mask. */ errno = saved_errno; handler (sig); saved_errno = errno; sigprocmask (SIG_SETMASK, &oldmask, NULL); errno = saved_errno; } /* Change and/or query the action that will be taken on delivery of signal SIG. If not NULL, ACT describes the new behavior. If not NULL, OACT is set to the prior behavior. Return 0 on success, or set errno and return -1 on failure. */ int sigaction (int sig, const struct sigaction *restrict act, struct sigaction *restrict oact) { sigset_t mask; sigset_t oldmask; int saved_errno; if (sig < 0 || NSIG <= sig || sig == SIGKILL || sig == SIGSTOP || (act && act->sa_handler == SIG_ERR)) { errno = EINVAL; return -1; } #ifdef SIGABRT_COMPAT if (sig == SIGABRT_COMPAT) sig = SIGABRT; #endif /* POSIX requires sigaction() to be async-signal-safe. In other words, if an asynchronous signal can occur while we are anywhere inside this function, the user's handler could then call sigaction() recursively and expect consistent results. We meet this rule by using sigprocmask to block all signals before modifying any data structure that could be read from a signal handler; this works since we know that the gnulib sigprocmask replacement does not try to use sigaction() from its handler. */ if (!act && !oact) return 0; sigfillset (&mask); sigprocmask (SIG_BLOCK, &mask, &oldmask); if (oact) { if (action_array[sig].sa_handler) *oact = action_array[sig]; else { /* Safe to change the handler at will here, since all signals are currently blocked. */ oact->sa_handler = signal (sig, SIG_DFL); if (oact->sa_handler == SIG_ERR) goto failure; signal (sig, oact->sa_handler); oact->sa_flags = SA_RESETHAND | SA_NODEFER; sigemptyset (&oact->sa_mask); } } if (act) { /* Safe to install the handler before updating action_array, since all signals are currently blocked. */ if (act->sa_handler == SIG_DFL || act->sa_handler == SIG_IGN) { if (signal (sig, act->sa_handler) == SIG_ERR) goto failure; action_array[sig].sa_handler = NULL; } else { if (signal (sig, sigaction_handler) == SIG_ERR) goto failure; action_array[sig] = *act; } } sigprocmask (SIG_SETMASK, &oldmask, NULL); return 0; failure: saved_errno = errno; sigprocmask (SIG_SETMASK, &oldmask, NULL); errno = saved_errno; return -1; } pspp-1.4.1/gl/basename.c0000644000175000017500000000334613723215636014452 0ustar00blpblp00000000000000/* basename.c -- return the last element in a file name Copyright (C) 1990, 1998-2001, 2003-2006, 2009-2020 Free Software Foundation, Inc. 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 3 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, see . */ #include #include "dirname.h" #include #include "xalloc.h" #include "xstrndup.h" char * base_name (char const *name) { char const *base = last_component (name); size_t length; /* If there is no last component, then name is a file system root or the empty string. */ if (! *base) return xstrndup (name, base_len (name)); /* Collapse a sequence of trailing slashes into one. */ length = base_len (base); if (ISSLASH (base[length])) length++; /* On systems with drive letters, "a/b:c" must return "./b:c" rather than "b:c" to avoid confusion with a drive letter. On systems with pure POSIX semantics, this is not an issue. */ if (FILE_SYSTEM_PREFIX_LEN (base)) { char *p = xmalloc (length + 3); p[0] = '.'; p[1] = '/'; memcpy (p + 2, base, length); p[length + 2] = '\0'; return p; } /* Finally, copy the basename. */ return xstrndup (base, length); } pspp-1.4.1/gl/offtostr.c0000644000175000017500000000010613723215637014535 0ustar00blpblp00000000000000#define anytostr offtostr #define inttype off_t #include "anytostr.c" pspp-1.4.1/gl/tmpdir.h0000644000175000017500000000236013723215640014171 0ustar00blpblp00000000000000/* Determine a temporary directory. Copyright (C) 2001-2002, 2009-2020 Free Software Foundation, Inc. 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 3 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, see . */ #include #include /* Path search algorithm, for tmpnam, tmpfile, etc. If DIR is non-null and exists, uses it; otherwise uses the first of $TMPDIR, P_tmpdir, /tmp that exists. Copies into TMPL a template suitable for use with mk[s]temp. Will fail (-1) if DIR is non-null and doesn't exist, none of the searched dirs exists, or there's not enough space in TMPL. */ extern int path_search (char *tmpl, size_t tmpl_len, const char *dir, const char *pfx, bool try_tmpdir); pspp-1.4.1/gl/relocatable.c0000644000175000017500000004370613723215640015153 0ustar00blpblp00000000000000/* Provide relocatable packages. Copyright (C) 2003-2006, 2008-2020 Free Software Foundation, Inc. Written by Bruno Haible , 2003. 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 3 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, see . */ /* Tell glibc's to provide a prototype for getline(). This must come before because may include , and once has been included, it's too late. */ #ifndef _GNU_SOURCE # define _GNU_SOURCE 1 #endif #define _GL_USE_STDLIB_ALLOC 1 #include /* Specification. */ #include "relocatable.h" #if ENABLE_RELOCATABLE #include #include #include #include #ifdef NO_XMALLOC # define xmalloc malloc #else # include "xalloc.h" #endif #if defined _WIN32 && !defined __CYGWIN__ # define WIN32_LEAN_AND_MEAN # include #endif #ifdef __EMX__ # define INCL_DOS # include # define strcmp stricmp # define strncmp strnicmp #endif #if DEPENDS_ON_LIBCHARSET # include #endif #if DEPENDS_ON_LIBICONV && HAVE_ICONV # include #endif #if DEPENDS_ON_LIBINTL && ENABLE_NLS # include #endif #if defined _WIN32 && !defined __CYGWIN__ /* Don't assume that UNICODE is not defined. */ # undef GetModuleFileName # define GetModuleFileName GetModuleFileNameA #endif /* Faked cheap 'bool'. */ #undef bool #undef false #undef true #define bool int #define false 0 #define true 1 /* Pathname support. ISSLASH(C) tests whether C is a directory separator character. IS_FILE_NAME_WITH_DIR(P) tests whether P contains a directory specification. */ #if (defined _WIN32 && !defined __CYGWIN__) || defined __EMX__ || defined __DJGPP__ /* Native Windows, OS/2, DOS */ # define ISSLASH(C) ((C) == '/' || (C) == '\\') # define HAS_DEVICE(P) \ ((((P)[0] >= 'A' && (P)[0] <= 'Z') || ((P)[0] >= 'a' && (P)[0] <= 'z')) \ && (P)[1] == ':') # define IS_FILE_NAME_WITH_DIR(P) \ (strchr (P, '/') != NULL || strchr (P, '\\') != NULL || HAS_DEVICE (P)) # define FILE_SYSTEM_PREFIX_LEN(P) (HAS_DEVICE (P) ? 2 : 0) #else /* Unix */ # define ISSLASH(C) ((C) == '/') # define IS_FILE_NAME_WITH_DIR(P) (strchr (P, '/') != NULL) # define FILE_SYSTEM_PREFIX_LEN(P) 0 #endif /* Whether to enable the more costly support for relocatable libraries. It allows libraries to be have been installed with a different original prefix than the program. But it is quite costly, especially on Cygwin platforms, see below. Therefore we enable it by default only on native Windows platforms. */ #ifndef ENABLE_COSTLY_RELOCATABLE # if defined _WIN32 && !defined __CYGWIN__ # define ENABLE_COSTLY_RELOCATABLE 1 # else # define ENABLE_COSTLY_RELOCATABLE 0 # endif #endif /* Original installation prefix. */ static char *orig_prefix; static size_t orig_prefix_len; /* Current installation prefix. */ static char *curr_prefix; static size_t curr_prefix_len; /* These prefixes do not end in a slash. Anything that will be concatenated to them must start with a slash. */ /* Sets the original and the current installation prefix of this module. Relocation simply replaces a pathname starting with the original prefix by the corresponding pathname with the current prefix instead. Both prefixes should be directory names without trailing slash (i.e. use "" instead of "/"). */ static void set_this_relocation_prefix (const char *orig_prefix_arg, const char *curr_prefix_arg) { if (orig_prefix_arg != NULL && curr_prefix_arg != NULL /* Optimization: if orig_prefix and curr_prefix are equal, the relocation is a nop. */ && strcmp (orig_prefix_arg, curr_prefix_arg) != 0) { /* Duplicate the argument strings. */ char *memory; orig_prefix_len = strlen (orig_prefix_arg); curr_prefix_len = strlen (curr_prefix_arg); memory = (char *) xmalloc (orig_prefix_len + 1 + curr_prefix_len + 1); #ifdef NO_XMALLOC if (memory != NULL) #endif { memcpy (memory, orig_prefix_arg, orig_prefix_len + 1); orig_prefix = memory; memory += orig_prefix_len + 1; memcpy (memory, curr_prefix_arg, curr_prefix_len + 1); curr_prefix = memory; return; } } orig_prefix = NULL; curr_prefix = NULL; /* Don't worry about wasted memory here - this function is usually only called once. */ } /* Sets the original and the current installation prefix of the package. Relocation simply replaces a pathname starting with the original prefix by the corresponding pathname with the current prefix instead. Both prefixes should be directory names without trailing slash (i.e. use "" instead of "/"). */ void set_relocation_prefix (const char *orig_prefix_arg, const char *curr_prefix_arg) { set_this_relocation_prefix (orig_prefix_arg, curr_prefix_arg); /* Now notify all dependent libraries. */ #if DEPENDS_ON_LIBCHARSET libcharset_set_relocation_prefix (orig_prefix_arg, curr_prefix_arg); #endif #if DEPENDS_ON_LIBICONV && HAVE_ICONV && _LIBICONV_VERSION >= 0x0109 libiconv_set_relocation_prefix (orig_prefix_arg, curr_prefix_arg); #endif #if DEPENDS_ON_LIBINTL && ENABLE_NLS && defined libintl_set_relocation_prefix libintl_set_relocation_prefix (orig_prefix_arg, curr_prefix_arg); #endif } #if !defined IN_LIBRARY || (defined PIC && defined INSTALLDIR && ENABLE_COSTLY_RELOCATABLE) /* Convenience function: Computes the current installation prefix, based on the original installation prefix, the original installation directory of a particular file, and the current pathname of this file. Returns it, freshly allocated. Returns NULL upon failure. */ #ifdef IN_LIBRARY #define compute_curr_prefix local_compute_curr_prefix static #endif char * compute_curr_prefix (const char *orig_installprefix, const char *orig_installdir, const char *curr_pathname) { char *curr_installdir; const char *rel_installdir; if (curr_pathname == NULL) return NULL; /* Determine the relative installation directory, relative to the prefix. This is simply the difference between orig_installprefix and orig_installdir. */ if (strncmp (orig_installprefix, orig_installdir, strlen (orig_installprefix)) != 0) /* Shouldn't happen - nothing should be installed outside $(prefix). */ return NULL; rel_installdir = orig_installdir + strlen (orig_installprefix); /* Determine the current installation directory. */ { const char *p_base = curr_pathname + FILE_SYSTEM_PREFIX_LEN (curr_pathname); const char *p = curr_pathname + strlen (curr_pathname); char *q; while (p > p_base) { p--; if (ISSLASH (*p)) break; } q = (char *) xmalloc (p - curr_pathname + 1); #ifdef NO_XMALLOC if (q == NULL) return NULL; #endif memcpy (q, curr_pathname, p - curr_pathname); q[p - curr_pathname] = '\0'; curr_installdir = q; } /* Compute the current installation prefix by removing the trailing rel_installdir from it. */ { const char *rp = rel_installdir + strlen (rel_installdir); const char *cp = curr_installdir + strlen (curr_installdir); const char *cp_base = curr_installdir + FILE_SYSTEM_PREFIX_LEN (curr_installdir); while (rp > rel_installdir && cp > cp_base) { bool same = false; const char *rpi = rp; const char *cpi = cp; while (rpi > rel_installdir && cpi > cp_base) { rpi--; cpi--; if (ISSLASH (*rpi) || ISSLASH (*cpi)) { if (ISSLASH (*rpi) && ISSLASH (*cpi)) same = true; break; } /* Do case-insensitive comparison if the file system is always or often case-insensitive. It's better to accept the comparison if the difference is only in case, rather than to fail. */ #if defined _WIN32 || defined __CYGWIN__ || defined __EMX__ || defined __DJGPP__ /* Native Windows, Cygwin, OS/2, DOS - case insignificant file system */ if ((*rpi >= 'a' && *rpi <= 'z' ? *rpi - 'a' + 'A' : *rpi) != (*cpi >= 'a' && *cpi <= 'z' ? *cpi - 'a' + 'A' : *cpi)) break; #else if (*rpi != *cpi) break; #endif } if (!same) break; /* The last pathname component was the same. rpi and cpi now point to the slash before it. */ rp = rpi; cp = cpi; } if (rp > rel_installdir) { /* Unexpected: The curr_installdir does not end with rel_installdir. */ free (curr_installdir); return NULL; } { size_t computed_curr_prefix_len = cp - curr_installdir; char *computed_curr_prefix; computed_curr_prefix = (char *) xmalloc (computed_curr_prefix_len + 1); #ifdef NO_XMALLOC if (computed_curr_prefix == NULL) { free (curr_installdir); return NULL; } #endif memcpy (computed_curr_prefix, curr_installdir, computed_curr_prefix_len); computed_curr_prefix[computed_curr_prefix_len] = '\0'; free (curr_installdir); return computed_curr_prefix; } } } #endif /* !IN_LIBRARY || PIC */ #if defined PIC && defined INSTALLDIR && ENABLE_COSTLY_RELOCATABLE /* Full pathname of shared library, or NULL. */ static char *shared_library_fullname; #if defined _WIN32 && !defined __CYGWIN__ /* Native Windows only. On Cygwin, it is better to use the Cygwin provided /proc interface, than to use native Windows API and cygwin_conv_to_posix_path, because it supports longer file names (see ). */ /* Determine the full pathname of the shared library when it is loaded. */ BOOL WINAPI DllMain (HINSTANCE module_handle, DWORD event, LPVOID reserved) { (void) reserved; if (event == DLL_PROCESS_ATTACH) { /* The DLL is being loaded into an application's address range. */ static char location[MAX_PATH]; if (!GetModuleFileName (module_handle, location, sizeof (location))) /* Shouldn't happen. */ return FALSE; if (!IS_FILE_NAME_WITH_DIR (location)) /* Shouldn't happen. */ return FALSE; shared_library_fullname = strdup (location); } return TRUE; } #elif defined __EMX__ extern int _CRT_init (void); extern void _CRT_term (void); extern void __ctordtorInit (void); extern void __ctordtorTerm (void); unsigned long _System _DLL_InitTerm (unsigned long hModule, unsigned long ulFlag) { static char location[CCHMAXPATH]; switch (ulFlag) { case 0: if (_CRT_init () == -1) return 0; __ctordtorInit(); /* See http://cyberkinetica.homeunix.net/os2tk45/cp1/1247_L2H_DosQueryModuleNameSy.html for specification of DosQueryModuleName(). */ if (DosQueryModuleName (hModule, sizeof (location), location)) return 0; _fnslashify (location); shared_library_fullname = strdup (location); break; case 1: __ctordtorTerm(); _CRT_term (); break; } return 1; } #else /* Unix */ static void find_shared_library_fullname () { #if (defined __linux__ && (__GLIBC__ >= 2 || defined __UCLIBC__)) || defined __CYGWIN__ /* Linux has /proc/self/maps. glibc 2 and uClibc have the getline() function. Cygwin >= 1.5 has /proc/self/maps and the getline() function too. But it is costly: ca. 0.3 ms on Linux, 3 ms on Cygwin 1.5, and 5 ms on Cygwin 1.7. */ FILE *fp; /* Open the current process' maps file. It describes one VMA per line. */ fp = fopen ("/proc/self/maps", "r"); if (fp) { unsigned long address = (unsigned long) &find_shared_library_fullname; for (;;) { unsigned long start, end; int c; if (fscanf (fp, "%lx-%lx", &start, &end) != 2) break; if (address >= start && address <= end - 1) { /* Found it. Now see if this line contains a filename. */ while (c = getc (fp), c != EOF && c != '\n' && c != '/') continue; if (c == '/') { size_t size; int len; ungetc (c, fp); shared_library_fullname = NULL; size = 0; len = getline (&shared_library_fullname, &size, fp); if (len >= 0) { /* Success: filled shared_library_fullname. */ if (len > 0 && shared_library_fullname[len - 1] == '\n') shared_library_fullname[len - 1] = '\0'; } } break; } while (c = getc (fp), c != EOF && c != '\n') continue; } fclose (fp); } #endif } #endif /* Native Windows / EMX / Unix */ /* Return the full pathname of the current shared library. Return NULL if unknown. Guaranteed to work only on Linux, EMX, Cygwin, and native Windows. */ static char * get_shared_library_fullname () { #if !(defined _WIN32 && !defined __CYGWIN__) && !defined __EMX__ static bool tried_find_shared_library_fullname; if (!tried_find_shared_library_fullname) { find_shared_library_fullname (); tried_find_shared_library_fullname = true; } #endif return shared_library_fullname; } #endif /* PIC */ /* Returns the pathname, relocated according to the current installation directory. The returned string is either PATHNAME unmodified or a freshly allocated string that you can free with free() after casting it to 'char *'. */ const char * relocate (const char *pathname) { #if defined PIC && defined INSTALLDIR && ENABLE_COSTLY_RELOCATABLE static int initialized; /* Initialization code for a shared library. */ if (!initialized) { /* At this point, orig_prefix and curr_prefix likely have already been set through the main program's set_program_name_and_installdir function. This is sufficient in the case that the library has initially been installed in the same orig_prefix. But we can do better, to also cover the cases that 1. it has been installed in a different prefix before being moved to orig_prefix and (later) to curr_prefix, 2. unlike the program, it has not moved away from orig_prefix. */ const char *orig_installprefix = INSTALLPREFIX; const char *orig_installdir = INSTALLDIR; char *curr_prefix_better; curr_prefix_better = compute_curr_prefix (orig_installprefix, orig_installdir, get_shared_library_fullname ()); set_relocation_prefix (orig_installprefix, curr_prefix_better != NULL ? curr_prefix_better : curr_prefix); if (curr_prefix_better != NULL) free (curr_prefix_better); initialized = 1; } #endif /* Note: It is not necessary to perform case insensitive comparison here, even for DOS-like file systems, because the pathname argument was typically created from the same Makefile variable as orig_prefix came from. */ if (orig_prefix != NULL && curr_prefix != NULL && strncmp (pathname, orig_prefix, orig_prefix_len) == 0) { if (pathname[orig_prefix_len] == '\0') { /* pathname equals orig_prefix. */ char *result = (char *) xmalloc (strlen (curr_prefix) + 1); #ifdef NO_XMALLOC if (result != NULL) #endif { strcpy (result, curr_prefix); return result; } } else if (ISSLASH (pathname[orig_prefix_len])) { /* pathname starts with orig_prefix. */ const char *pathname_tail = &pathname[orig_prefix_len]; char *result = (char *) xmalloc (curr_prefix_len + strlen (pathname_tail) + 1); #ifdef NO_XMALLOC if (result != NULL) #endif { memcpy (result, curr_prefix, curr_prefix_len); strcpy (result + curr_prefix_len, pathname_tail); return result; } } } #ifdef __EMX__ # ifdef __KLIBC__ # undef strncmp if (strncmp (pathname, "/@unixroot", 10) == 0 && (pathname[10] == '\0' || ISSLASH (pathname[10]))) { /* kLIBC itself processes /@unixroot prefix */ return pathname; } else # endif if (ISSLASH (pathname[0])) { const char *unixroot = getenv ("UNIXROOT"); if (unixroot && HAS_DEVICE (unixroot) && unixroot[2] == '\0') { char *result = (char *) xmalloc (2 + strlen (pathname) + 1); #ifdef NO_XMALLOC if (result != NULL) #endif { memcpy (result, unixroot, 2); strcpy (result + 2, pathname); return result; } } } #endif /* Nothing to relocate. */ return pathname; } /* Returns the pathname, relocated according to the current installation directory. This function sets *ALLOCATEDP to the allocated memory, or to NULL if no memory allocation occurs. So that, after you're done with the return value, to reclaim allocated memory, you can do: free (*ALLOCATEDP). */ const char * relocate2 (const char *pathname, char **allocatedp) { const char *result = relocate (pathname); *allocatedp = (result != pathname ? (char *) result : NULL); return result; } #endif pspp-1.4.1/gl/inttostr.h0000644000175000017500000000221613723215637014566 0ustar00blpblp00000000000000/* inttostr.h -- convert integers to printable strings Copyright (C) 2001-2006, 2009-2020 Free Software Foundation, Inc. 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 3 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, see . */ /* Written by Paul Eggert */ #include #include #include "intprops.h" char *imaxtostr (intmax_t, char *) _GL_ATTRIBUTE_NODISCARD; char *inttostr (int, char *) _GL_ATTRIBUTE_NODISCARD; char *offtostr (off_t, char *) _GL_ATTRIBUTE_NODISCARD; char *uinttostr (unsigned int, char *) _GL_ATTRIBUTE_NODISCARD; char *umaxtostr (uintmax_t, char *) _GL_ATTRIBUTE_NODISCARD; pspp-1.4.1/gl/asnprintf.c0000644000175000017500000000204713723215636014700 0ustar00blpblp00000000000000/* Formatted output to strings. Copyright (C) 1999, 2002, 2006, 2009-2020 Free Software Foundation, Inc. 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 3, 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, see . */ #include /* Specification. */ #include "vasnprintf.h" #include char * asnprintf (char *resultbuf, size_t *lengthp, const char *format, ...) { va_list args; char *result; va_start (args, format); result = vasnprintf (resultbuf, lengthp, format, args); va_end (args); return result; } pspp-1.4.1/gl/same-inode.h0000644000175000017500000000321613723215640014714 0ustar00blpblp00000000000000/* Determine whether two stat buffers are known to refer to the same file. Copyright (C) 2006, 2009-2020 Free Software Foundation, Inc. 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 3 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, see . */ #ifndef SAME_INODE_H # define SAME_INODE_H 1 # include # if defined __VMS && __CRTL_VER < 80200000 # define SAME_INODE(a, b) \ ((a).st_ino[0] == (b).st_ino[0] \ && (a).st_ino[1] == (b).st_ino[1] \ && (a).st_ino[2] == (b).st_ino[2] \ && (a).st_dev == (b).st_dev) # elif defined _WIN32 && ! defined __CYGWIN__ /* Native Windows. */ # if _GL_WINDOWS_STAT_INODES /* stat() and fstat() set st_dev and st_ino to 0 if information about the inode is not available. */ # define SAME_INODE(a, b) \ (!((a).st_ino == 0 && (a).st_dev == 0) \ && (a).st_ino == (b).st_ino && (a).st_dev == (b).st_dev) # else /* stat() and fstat() set st_ino to 0 always. */ # define SAME_INODE(a, b) 0 # endif # else # define SAME_INODE(a, b) \ ((a).st_ino == (b).st_ino \ && (a).st_dev == (b).st_dev) # endif #endif pspp-1.4.1/gl/windows-recmutex.c0000644000175000017500000000650113723215640016212 0ustar00blpblp00000000000000/* Plain recursive mutexes (native Windows implementation). Copyright (C) 2005-2020 Free Software Foundation, Inc. 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 3, 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, see . */ /* Written by Bruno Haible , 2005. Based on GCC's gthr-win32.h. */ #include /* Specification. */ #include "windows-recmutex.h" #include void glwthread_recmutex_init (glwthread_recmutex_t *mutex) { mutex->owner = 0; mutex->depth = 0; InitializeCriticalSection (&mutex->lock); mutex->guard.done = 1; } int glwthread_recmutex_lock (glwthread_recmutex_t *mutex) { if (!mutex->guard.done) { if (InterlockedIncrement (&mutex->guard.started) == 0) /* This thread is the first one to need this mutex. Initialize it. */ glwthread_recmutex_init (mutex); else { /* Don't let mutex->guard.started grow and wrap around. */ InterlockedDecrement (&mutex->guard.started); /* Yield the CPU while waiting for another thread to finish initializing this mutex. */ while (!mutex->guard.done) Sleep (0); } } { DWORD self = GetCurrentThreadId (); if (mutex->owner != self) { EnterCriticalSection (&mutex->lock); mutex->owner = self; } if (++(mutex->depth) == 0) /* wraparound? */ { mutex->depth--; return EAGAIN; } } return 0; } int glwthread_recmutex_trylock (glwthread_recmutex_t *mutex) { if (!mutex->guard.done) { if (InterlockedIncrement (&mutex->guard.started) == 0) /* This thread is the first one to need this mutex. Initialize it. */ glwthread_recmutex_init (mutex); else { /* Don't let mutex->guard.started grow and wrap around. */ InterlockedDecrement (&mutex->guard.started); /* Let another thread finish initializing this mutex, and let it also lock this mutex. */ return EBUSY; } } { DWORD self = GetCurrentThreadId (); if (mutex->owner != self) { if (!TryEnterCriticalSection (&mutex->lock)) return EBUSY; mutex->owner = self; } if (++(mutex->depth) == 0) /* wraparound? */ { mutex->depth--; return EAGAIN; } } return 0; } int glwthread_recmutex_unlock (glwthread_recmutex_t *mutex) { if (mutex->owner != GetCurrentThreadId ()) return EPERM; if (mutex->depth == 0) return EINVAL; if (--(mutex->depth) == 0) { mutex->owner = 0; LeaveCriticalSection (&mutex->lock); } return 0; } int glwthread_recmutex_destroy (glwthread_recmutex_t *mutex) { if (mutex->owner != 0) return EBUSY; DeleteCriticalSection (&mutex->lock); mutex->guard.done = 0; return 0; } pspp-1.4.1/gl/getopt-ext.h0000644000175000017500000000572413723215637015007 0ustar00blpblp00000000000000/* Declarations for getopt (GNU extensions). Copyright (C) 1989-2020 Free Software Foundation, Inc. This file is part of the GNU C Library and is also part of gnulib. Patches to this file should be submitted to both projects. The GNU C Library 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 3 of the License, or (at your option) any later version. The GNU C Library 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 the GNU C Library; if not, see . */ #ifndef _GETOPT_EXT_H #define _GETOPT_EXT_H 1 /* This header should not be used directly; include getopt.h instead. Unlike most bits headers, it does not have a protective #error, because the guard macro for getopt.h in gnulib is not fixed. */ __BEGIN_DECLS /* Describe the long-named options requested by the application. The LONG_OPTIONS argument to getopt_long or getopt_long_only is a vector of 'struct option' terminated by an element containing a name which is zero. The field 'has_arg' is: no_argument (or 0) if the option does not take an argument, required_argument (or 1) if the option requires an argument, optional_argument (or 2) if the option takes an optional argument. If the field 'flag' is not NULL, it points to a variable that is set to the value given in the field 'val' when the option is found, but left unchanged if the option is not found. To have a long-named option do something other than set an 'int' to a compiled-in constant, such as set a value from 'optarg', set the option's 'flag' field to zero and its 'val' field to a nonzero value (the equivalent single-letter option character, if there is one). For long options that have a zero 'flag' field, 'getopt' returns the contents of the 'val' field. */ struct option { const char *name; /* has_arg can't be an enum because some compilers complain about type mismatches in all the code that assumes it is an int. */ int has_arg; int *flag; int val; }; /* Names for the values of the 'has_arg' field of 'struct option'. */ #define no_argument 0 #define required_argument 1 #define optional_argument 2 extern int getopt_long (int ___argc, char *__getopt_argv_const *___argv, const char *__shortopts, const struct option *__longopts, int *__longind) __THROW _GL_ARG_NONNULL ((2, 3)); extern int getopt_long_only (int ___argc, char *__getopt_argv_const *___argv, const char *__shortopts, const struct option *__longopts, int *__longind) __THROW _GL_ARG_NONNULL ((2, 3)); __END_DECLS #endif /* _GETOPT_EXT_H */ pspp-1.4.1/gl/memcasecmp.h0000644000175000017500000000160313723215637015011 0ustar00blpblp00000000000000/* Case-insensitive buffer comparator. Copyright (C) 1996, 1998, 2003, 2009-2020 Free Software Foundation, Inc. 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 3 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, see . */ /* Written by Jim Meyering. */ #include int memcasecmp (const void *vs1, const void *vs2, size_t n) _GL_ATTRIBUTE_PURE; pspp-1.4.1/gl/vprintf.c0000644000175000017500000000207613723215640014361 0ustar00blpblp00000000000000/* Formatted output to a stream. Copyright (C) 2007, 2009-2020 Free Software Foundation, Inc. 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 3 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, see . */ #ifdef HAVE_CONFIG_H # include #endif /* Specification. */ #include #include /* Print formatted output to standard output. Return string length of formatted string. On error, return a negative value. */ int vprintf (const char *format, va_list args) { return vfprintf (stdout, format, args); } pspp-1.4.1/gl/setenv.c0000644000175000017500000002502713723215640014176 0ustar00blpblp00000000000000/* Copyright (C) 1992, 1995-2003, 2005-2020 Free Software Foundation, Inc. This file is part of the GNU C Library. 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 3 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, see . */ #if !_LIBC /* Don't use __attribute__ __nonnull__ in this compilation unit. Otherwise gcc optimizes away the name == NULL test below. */ # define _GL_ARG_NONNULL(params) # define _GL_USE_STDLIB_ALLOC 1 # include #endif #include /* Specification. */ #include #include #ifndef __set_errno # define __set_errno(ev) ((errno) = (ev)) #endif #include #if _LIBC || HAVE_UNISTD_H # include #endif #if !_LIBC # include "malloca.h" #endif #if _LIBC || !HAVE_SETENV #if !_LIBC # define __environ environ #endif #if _LIBC /* This lock protects against simultaneous modifications of 'environ'. */ # include __libc_lock_define_initialized (static, envlock) # define LOCK __libc_lock_lock (envlock) # define UNLOCK __libc_lock_unlock (envlock) #else # define LOCK # define UNLOCK #endif /* In the GNU C library we must keep the namespace clean. */ #ifdef _LIBC # define setenv __setenv # define clearenv __clearenv # define tfind __tfind # define tsearch __tsearch #endif /* In the GNU C library implementation we try to be more clever and allow arbitrarily many changes of the environment given that the used values are from a small set. Outside glibc this will eat up all memory after a while. */ #if defined _LIBC || (defined HAVE_SEARCH_H && defined HAVE_TSEARCH \ && defined __GNUC__) # define USE_TSEARCH 1 # include typedef int (*compar_fn_t) (const void *, const void *); /* This is a pointer to the root of the search tree with the known values. */ static void *known_values; # define KNOWN_VALUE(Str) \ ({ \ void *value = tfind (Str, &known_values, (compar_fn_t) strcmp); \ value != NULL ? *(char **) value : NULL; \ }) # define STORE_VALUE(Str) \ tsearch (Str, &known_values, (compar_fn_t) strcmp) #else # undef USE_TSEARCH # define KNOWN_VALUE(Str) NULL # define STORE_VALUE(Str) do { } while (0) #endif /* If this variable is not a null pointer we allocated the current environment. */ static char **last_environ; /* This function is used by 'setenv' and 'putenv'. The difference between the two functions is that for the former must create a new string which is then placed in the environment, while the argument of 'putenv' must be used directly. This is all complicated by the fact that we try to reuse values once generated for a 'setenv' call since we can never free the strings. */ int __add_to_environ (const char *name, const char *value, const char *combined, int replace) { char **ep; size_t size; const size_t namelen = strlen (name); const size_t vallen = value != NULL ? strlen (value) + 1 : 0; LOCK; /* We have to get the pointer now that we have the lock and not earlier since another thread might have created a new environment. */ ep = __environ; size = 0; if (ep != NULL) { for (; *ep != NULL; ++ep) if (!strncmp (*ep, name, namelen) && (*ep)[namelen] == '=') break; else ++size; } if (ep == NULL || *ep == NULL) { char **new_environ; #ifdef USE_TSEARCH char *new_value; #endif /* We allocated this space; we can extend it. */ new_environ = (char **) (last_environ == NULL ? malloc ((size + 2) * sizeof (char *)) : realloc (last_environ, (size + 2) * sizeof (char *))); if (new_environ == NULL) { /* It's easier to set errno to ENOMEM than to rely on the 'malloc-posix' and 'realloc-posix' gnulib modules. */ __set_errno (ENOMEM); UNLOCK; return -1; } /* If the whole entry is given add it. */ if (combined != NULL) /* We must not add the string to the search tree since it belongs to the user. */ new_environ[size] = (char *) combined; else { /* See whether the value is already known. */ #ifdef USE_TSEARCH # ifdef _LIBC new_value = (char *) alloca (namelen + 1 + vallen); __mempcpy (__mempcpy (__mempcpy (new_value, name, namelen), "=", 1), value, vallen); # else new_value = (char *) malloca (namelen + 1 + vallen); if (new_value == NULL) { __set_errno (ENOMEM); UNLOCK; return -1; } memcpy (new_value, name, namelen); new_value[namelen] = '='; memcpy (&new_value[namelen + 1], value, vallen); # endif new_environ[size] = KNOWN_VALUE (new_value); if (new_environ[size] == NULL) #endif { new_environ[size] = (char *) malloc (namelen + 1 + vallen); if (new_environ[size] == NULL) { #if defined USE_TSEARCH && !defined _LIBC freea (new_value); #endif __set_errno (ENOMEM); UNLOCK; return -1; } #ifdef USE_TSEARCH memcpy (new_environ[size], new_value, namelen + 1 + vallen); #else memcpy (new_environ[size], name, namelen); new_environ[size][namelen] = '='; memcpy (&new_environ[size][namelen + 1], value, vallen); #endif /* And save the value now. We cannot do this when we remove the string since then we cannot decide whether it is a user string or not. */ STORE_VALUE (new_environ[size]); } #if defined USE_TSEARCH && !defined _LIBC freea (new_value); #endif } if (__environ != last_environ) memcpy ((char *) new_environ, (char *) __environ, size * sizeof (char *)); new_environ[size + 1] = NULL; last_environ = __environ = new_environ; } else if (replace) { char *np; /* Use the user string if given. */ if (combined != NULL) np = (char *) combined; else { #ifdef USE_TSEARCH char *new_value; # ifdef _LIBC new_value = alloca (namelen + 1 + vallen); __mempcpy (__mempcpy (__mempcpy (new_value, name, namelen), "=", 1), value, vallen); # else new_value = malloca (namelen + 1 + vallen); if (new_value == NULL) { __set_errno (ENOMEM); UNLOCK; return -1; } memcpy (new_value, name, namelen); new_value[namelen] = '='; memcpy (&new_value[namelen + 1], value, vallen); # endif np = KNOWN_VALUE (new_value); if (np == NULL) #endif { np = (char *) malloc (namelen + 1 + vallen); if (np == NULL) { #if defined USE_TSEARCH && !defined _LIBC freea (new_value); #endif __set_errno (ENOMEM); UNLOCK; return -1; } #ifdef USE_TSEARCH memcpy (np, new_value, namelen + 1 + vallen); #else memcpy (np, name, namelen); np[namelen] = '='; memcpy (&np[namelen + 1], value, vallen); #endif /* And remember the value. */ STORE_VALUE (np); } #if defined USE_TSEARCH && !defined _LIBC freea (new_value); #endif } *ep = np; } UNLOCK; return 0; } int setenv (const char *name, const char *value, int replace) { if (name == NULL || *name == '\0' || strchr (name, '=') != NULL) { __set_errno (EINVAL); return -1; } return __add_to_environ (name, value, NULL, replace); } /* The 'clearenv' was planned to be added to POSIX.1 but probably never made it. Nevertheless the POSIX.9 standard (POSIX bindings for Fortran 77) requires this function. */ int clearenv (void) { LOCK; if (__environ == last_environ && __environ != NULL) { /* We allocated this environment so we can free it. */ free (__environ); last_environ = NULL; } /* Clear the environment pointer removes the whole environment. */ __environ = NULL; UNLOCK; return 0; } #ifdef _LIBC static void free_mem (void) { /* Remove all traces. */ clearenv (); /* Now remove the search tree. */ __tdestroy (known_values, free); known_values = NULL; } text_set_element (__libc_subfreeres, free_mem); # undef setenv # undef clearenv weak_alias (__setenv, setenv) weak_alias (__clearenv, clearenv) #endif #endif /* _LIBC || !HAVE_SETENV */ /* The rest of this file is called into use when replacing an existing but buggy setenv. Known bugs include failure to diagnose invalid name, and consuming a leading '=' from value. */ #if HAVE_SETENV # undef setenv # if !HAVE_DECL_SETENV extern int setenv (const char *, const char *, int); # endif # define STREQ(a, b) (strcmp (a, b) == 0) int rpl_setenv (const char *name, const char *value, int replace) { int result; if (!name || !*name || strchr (name, '=')) { errno = EINVAL; return -1; } /* Call the real setenv even if replace is 0, in case implementation has underlying data to update, such as when environ changes. */ result = setenv (name, value, replace); if (result == 0 && replace && *value == '=') { char *tmp = getenv (name); if (!STREQ (tmp, value)) { int saved_errno; size_t len = strlen (value); tmp = malloca (len + 2); /* Since leading '=' is eaten, double it up. */ *tmp = '='; memcpy (tmp + 1, value, len + 1); result = setenv (name, tmp, replace); saved_errno = errno; freea (tmp); errno = saved_errno; } } return result; } #endif /* HAVE_SETENV */ pspp-1.4.1/gl/printf-parse.c0000644000175000017500000005273113723215640015306 0ustar00blpblp00000000000000/* Formatted output to strings. Copyright (C) 1999-2000, 2002-2003, 2006-2020 Free Software Foundation, Inc. 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 3, 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, see . */ /* This file can be parametrized with the following macros: CHAR_T The element type of the format string. CHAR_T_ONLY_ASCII Set to 1 to enable verification that all characters in the format string are ASCII. DIRECTIVE Structure denoting a format directive. Depends on CHAR_T. DIRECTIVES Structure denoting the set of format directives of a format string. Depends on CHAR_T. PRINTF_PARSE Function that parses a format string. Depends on CHAR_T. STATIC Set to 'static' to declare the function static. ENABLE_UNISTDIO Set to 1 to enable the unistdio extensions. */ #ifndef PRINTF_PARSE # include #endif /* Specification. */ #ifndef PRINTF_PARSE # include "printf-parse.h" #endif /* Default parameters. */ #ifndef PRINTF_PARSE # define PRINTF_PARSE printf_parse # define CHAR_T char # define DIRECTIVE char_directive # define DIRECTIVES char_directives #endif /* Get size_t, NULL. */ #include /* Get intmax_t. */ #if defined IN_LIBINTL || defined IN_LIBASPRINTF # if HAVE_STDINT_H_WITH_UINTMAX # include # endif # if HAVE_INTTYPES_H_WITH_UINTMAX # include # endif #else # include #endif /* malloc(), realloc(), free(). */ #include /* memcpy(). */ #include /* errno. */ #include /* Checked size_t computations. */ #include "xsize.h" #if CHAR_T_ONLY_ASCII /* c_isascii(). */ # include "c-ctype.h" #endif #ifdef STATIC STATIC #endif int PRINTF_PARSE (const CHAR_T *format, DIRECTIVES *d, arguments *a) { const CHAR_T *cp = format; /* pointer into format */ size_t arg_posn = 0; /* number of regular arguments consumed */ size_t d_allocated; /* allocated elements of d->dir */ size_t a_allocated; /* allocated elements of a->arg */ size_t max_width_length = 0; size_t max_precision_length = 0; d->count = 0; d_allocated = N_DIRECT_ALLOC_DIRECTIVES; d->dir = d->direct_alloc_dir; a->count = 0; a_allocated = N_DIRECT_ALLOC_ARGUMENTS; a->arg = a->direct_alloc_arg; #define REGISTER_ARG(_index_,_type_) \ { \ size_t n = (_index_); \ if (n >= a_allocated) \ { \ size_t memory_size; \ argument *memory; \ \ a_allocated = xtimes (a_allocated, 2); \ if (a_allocated <= n) \ a_allocated = xsum (n, 1); \ memory_size = xtimes (a_allocated, sizeof (argument)); \ if (size_overflow_p (memory_size)) \ /* Overflow, would lead to out of memory. */ \ goto out_of_memory; \ memory = (argument *) (a->arg != a->direct_alloc_arg \ ? realloc (a->arg, memory_size) \ : malloc (memory_size)); \ if (memory == NULL) \ /* Out of memory. */ \ goto out_of_memory; \ if (a->arg == a->direct_alloc_arg) \ memcpy (memory, a->arg, a->count * sizeof (argument)); \ a->arg = memory; \ } \ while (a->count <= n) \ a->arg[a->count++].type = TYPE_NONE; \ if (a->arg[n].type == TYPE_NONE) \ a->arg[n].type = (_type_); \ else if (a->arg[n].type != (_type_)) \ /* Ambiguous type for positional argument. */ \ goto error; \ } while (*cp != '\0') { CHAR_T c = *cp++; if (c == '%') { size_t arg_index = ARG_NONE; DIRECTIVE *dp = &d->dir[d->count]; /* pointer to next directive */ /* Initialize the next directive. */ dp->dir_start = cp - 1; dp->flags = 0; dp->width_start = NULL; dp->width_end = NULL; dp->width_arg_index = ARG_NONE; dp->precision_start = NULL; dp->precision_end = NULL; dp->precision_arg_index = ARG_NONE; dp->arg_index = ARG_NONE; /* Test for positional argument. */ if (*cp >= '0' && *cp <= '9') { const CHAR_T *np; for (np = cp; *np >= '0' && *np <= '9'; np++) ; if (*np == '$') { size_t n = 0; for (np = cp; *np >= '0' && *np <= '9'; np++) n = xsum (xtimes (n, 10), *np - '0'); if (n == 0) /* Positional argument 0. */ goto error; if (size_overflow_p (n)) /* n too large, would lead to out of memory later. */ goto error; arg_index = n - 1; cp = np + 1; } } /* Read the flags. */ for (;;) { if (*cp == '\'') { dp->flags |= FLAG_GROUP; cp++; } else if (*cp == '-') { dp->flags |= FLAG_LEFT; cp++; } else if (*cp == '+') { dp->flags |= FLAG_SHOWSIGN; cp++; } else if (*cp == ' ') { dp->flags |= FLAG_SPACE; cp++; } else if (*cp == '#') { dp->flags |= FLAG_ALT; cp++; } else if (*cp == '0') { dp->flags |= FLAG_ZERO; cp++; } #if __GLIBC__ >= 2 && !defined __UCLIBC__ else if (*cp == 'I') { dp->flags |= FLAG_LOCALIZED; cp++; } #endif else break; } /* Parse the field width. */ if (*cp == '*') { dp->width_start = cp; cp++; dp->width_end = cp; if (max_width_length < 1) max_width_length = 1; /* Test for positional argument. */ if (*cp >= '0' && *cp <= '9') { const CHAR_T *np; for (np = cp; *np >= '0' && *np <= '9'; np++) ; if (*np == '$') { size_t n = 0; for (np = cp; *np >= '0' && *np <= '9'; np++) n = xsum (xtimes (n, 10), *np - '0'); if (n == 0) /* Positional argument 0. */ goto error; if (size_overflow_p (n)) /* n too large, would lead to out of memory later. */ goto error; dp->width_arg_index = n - 1; cp = np + 1; } } if (dp->width_arg_index == ARG_NONE) { dp->width_arg_index = arg_posn++; if (dp->width_arg_index == ARG_NONE) /* arg_posn wrapped around. */ goto error; } REGISTER_ARG (dp->width_arg_index, TYPE_INT); } else if (*cp >= '0' && *cp <= '9') { size_t width_length; dp->width_start = cp; for (; *cp >= '0' && *cp <= '9'; cp++) ; dp->width_end = cp; width_length = dp->width_end - dp->width_start; if (max_width_length < width_length) max_width_length = width_length; } /* Parse the precision. */ if (*cp == '.') { cp++; if (*cp == '*') { dp->precision_start = cp - 1; cp++; dp->precision_end = cp; if (max_precision_length < 2) max_precision_length = 2; /* Test for positional argument. */ if (*cp >= '0' && *cp <= '9') { const CHAR_T *np; for (np = cp; *np >= '0' && *np <= '9'; np++) ; if (*np == '$') { size_t n = 0; for (np = cp; *np >= '0' && *np <= '9'; np++) n = xsum (xtimes (n, 10), *np - '0'); if (n == 0) /* Positional argument 0. */ goto error; if (size_overflow_p (n)) /* n too large, would lead to out of memory later. */ goto error; dp->precision_arg_index = n - 1; cp = np + 1; } } if (dp->precision_arg_index == ARG_NONE) { dp->precision_arg_index = arg_posn++; if (dp->precision_arg_index == ARG_NONE) /* arg_posn wrapped around. */ goto error; } REGISTER_ARG (dp->precision_arg_index, TYPE_INT); } else { size_t precision_length; dp->precision_start = cp - 1; for (; *cp >= '0' && *cp <= '9'; cp++) ; dp->precision_end = cp; precision_length = dp->precision_end - dp->precision_start; if (max_precision_length < precision_length) max_precision_length = precision_length; } } { arg_type type; /* Parse argument type/size specifiers. */ { int flags = 0; for (;;) { if (*cp == 'h') { flags |= (1 << (flags & 1)); cp++; } else if (*cp == 'L') { flags |= 4; cp++; } else if (*cp == 'l') { flags += 8; cp++; } else if (*cp == 'j') { if (sizeof (intmax_t) > sizeof (long)) { /* intmax_t = long long */ flags += 16; } else if (sizeof (intmax_t) > sizeof (int)) { /* intmax_t = long */ flags += 8; } cp++; } else if (*cp == 'z' || *cp == 'Z') { /* 'z' is standardized in ISO C 99, but glibc uses 'Z' because the warning facility in gcc-2.95.2 understands only 'Z' (see gcc-2.95.2/gcc/c-common.c:1784). */ if (sizeof (size_t) > sizeof (long)) { /* size_t = long long */ flags += 16; } else if (sizeof (size_t) > sizeof (int)) { /* size_t = long */ flags += 8; } cp++; } else if (*cp == 't') { if (sizeof (ptrdiff_t) > sizeof (long)) { /* ptrdiff_t = long long */ flags += 16; } else if (sizeof (ptrdiff_t) > sizeof (int)) { /* ptrdiff_t = long */ flags += 8; } cp++; } #if defined __APPLE__ && defined __MACH__ /* On Mac OS X 10.3, PRIdMAX is defined as "qd". We cannot change it to "lld" because PRIdMAX must also be understood by the system's printf routines. */ else if (*cp == 'q') { if (64 / 8 > sizeof (long)) { /* int64_t = long long */ flags += 16; } else { /* int64_t = long */ flags += 8; } cp++; } #endif #if defined _WIN32 && ! defined __CYGWIN__ /* On native Windows, PRIdMAX is defined as "I64d". We cannot change it to "lld" because PRIdMAX must also be understood by the system's printf routines. */ else if (*cp == 'I' && cp[1] == '6' && cp[2] == '4') { if (64 / 8 > sizeof (long)) { /* __int64 = long long */ flags += 16; } else { /* __int64 = long */ flags += 8; } cp += 3; } #endif else break; } /* Read the conversion character. */ c = *cp++; switch (c) { case 'd': case 'i': /* If 'long long' is larger than 'long': */ if (flags >= 16 || (flags & 4)) type = TYPE_LONGLONGINT; else /* If 'long long' is the same as 'long', we parse "lld" into TYPE_LONGINT. */ if (flags >= 8) type = TYPE_LONGINT; else if (flags & 2) type = TYPE_SCHAR; else if (flags & 1) type = TYPE_SHORT; else type = TYPE_INT; break; case 'o': case 'u': case 'x': case 'X': /* If 'unsigned long long' is larger than 'unsigned long': */ if (flags >= 16 || (flags & 4)) type = TYPE_ULONGLONGINT; else /* If 'unsigned long long' is the same as 'unsigned long', we parse "llu" into TYPE_ULONGINT. */ if (flags >= 8) type = TYPE_ULONGINT; else if (flags & 2) type = TYPE_UCHAR; else if (flags & 1) type = TYPE_USHORT; else type = TYPE_UINT; break; case 'f': case 'F': case 'e': case 'E': case 'g': case 'G': case 'a': case 'A': if (flags >= 16 || (flags & 4)) type = TYPE_LONGDOUBLE; else type = TYPE_DOUBLE; break; case 'c': if (flags >= 8) #if HAVE_WINT_T type = TYPE_WIDE_CHAR; #else goto error; #endif else type = TYPE_CHAR; break; #if HAVE_WINT_T case 'C': type = TYPE_WIDE_CHAR; c = 'c'; break; #endif case 's': if (flags >= 8) #if HAVE_WCHAR_T type = TYPE_WIDE_STRING; #else goto error; #endif else type = TYPE_STRING; break; #if HAVE_WCHAR_T case 'S': type = TYPE_WIDE_STRING; c = 's'; break; #endif case 'p': type = TYPE_POINTER; break; case 'n': /* If 'long long' is larger than 'long': */ if (flags >= 16 || (flags & 4)) type = TYPE_COUNT_LONGLONGINT_POINTER; else /* If 'long long' is the same as 'long', we parse "lln" into TYPE_COUNT_LONGINT_POINTER. */ if (flags >= 8) type = TYPE_COUNT_LONGINT_POINTER; else if (flags & 2) type = TYPE_COUNT_SCHAR_POINTER; else if (flags & 1) type = TYPE_COUNT_SHORT_POINTER; else type = TYPE_COUNT_INT_POINTER; break; #if ENABLE_UNISTDIO /* The unistdio extensions. */ case 'U': if (flags >= 16) type = TYPE_U32_STRING; else if (flags >= 8) type = TYPE_U16_STRING; else type = TYPE_U8_STRING; break; #endif case '%': type = TYPE_NONE; break; default: /* Unknown conversion character. */ goto error; } } if (type != TYPE_NONE) { dp->arg_index = arg_index; if (dp->arg_index == ARG_NONE) { dp->arg_index = arg_posn++; if (dp->arg_index == ARG_NONE) /* arg_posn wrapped around. */ goto error; } REGISTER_ARG (dp->arg_index, type); } dp->conversion = c; dp->dir_end = cp; } d->count++; if (d->count >= d_allocated) { size_t memory_size; DIRECTIVE *memory; d_allocated = xtimes (d_allocated, 2); memory_size = xtimes (d_allocated, sizeof (DIRECTIVE)); if (size_overflow_p (memory_size)) /* Overflow, would lead to out of memory. */ goto out_of_memory; memory = (DIRECTIVE *) (d->dir != d->direct_alloc_dir ? realloc (d->dir, memory_size) : malloc (memory_size)); if (memory == NULL) /* Out of memory. */ goto out_of_memory; if (d->dir == d->direct_alloc_dir) memcpy (memory, d->dir, d->count * sizeof (DIRECTIVE)); d->dir = memory; } } #if CHAR_T_ONLY_ASCII else if (!c_isascii (c)) { /* Non-ASCII character. Not supported. */ goto error; } #endif } d->dir[d->count].dir_start = cp; d->max_width_length = max_width_length; d->max_precision_length = max_precision_length; return 0; error: if (a->arg != a->direct_alloc_arg) free (a->arg); if (d->dir != d->direct_alloc_dir) free (d->dir); errno = EINVAL; return -1; out_of_memory: if (a->arg != a->direct_alloc_arg) free (a->arg); if (d->dir != d->direct_alloc_dir) free (d->dir); errno = ENOMEM; return -1; } #undef PRINTF_PARSE #undef DIRECTIVES #undef DIRECTIVE #undef CHAR_T_ONLY_ASCII #undef CHAR_T pspp-1.4.1/gl/localename.h0000644000175000017500000001073713723215637015007 0ustar00blpblp00000000000000/* Determine name of the currently selected locale. Copyright (C) 2007, 2009-2020 Free Software Foundation, Inc. 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 3 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, see . */ #ifndef _GL_LOCALENAME_H #define _GL_LOCALENAME_H #ifdef __cplusplus extern "C" { #endif /* Determine the current locale's name. It considers both the POSIX notion of locale name (see functions gl_locale_name_thread and gl_locale_name_posix) and the system notion of locale name (see function gl_locale_name_default). CATEGORY is a locale category abbreviation, as defined in , but not LC_ALL. E.g. LC_MESSAGES. CATEGORYNAME is the name of CATEGORY as a string, e.g. "LC_MESSAGES". Return the locale category's name, canonicalized into XPG syntax language[_territory][.codeset][@modifier] The codeset part in the result is not reliable; the locale_charset() should be used for codeset information instead. The result must not be freed; it is statically allocated. */ extern const char * gl_locale_name (int category, const char *categoryname); /* Determine the current per-thread locale's name, as specified by uselocale() calls. CATEGORY is a locale category abbreviation, as defined in , but not LC_ALL. E.g. LC_MESSAGES. CATEGORYNAME is the name of CATEGORY as a string, e.g. "LC_MESSAGES". Return the locale category's name, canonicalized into XPG syntax language[_territory][.codeset][@modifier] or NULL if no locale has been specified for the current thread. The codeset part in the result is not reliable; the locale_charset() should be used for codeset information instead. The result must not be freed; it is statically allocated. */ extern const char * gl_locale_name_thread (int category, const char *categoryname); /* Determine the thread-independent current locale's name, as specified by setlocale() calls or by environment variables. CATEGORY is a locale category abbreviation, as defined in , but not LC_ALL. E.g. LC_MESSAGES. CATEGORYNAME is the name of CATEGORY as a string, e.g. "LC_MESSAGES". Return the locale category's name, canonicalized into XPG syntax language[_territory][.codeset][@modifier] or NULL if no locale has been specified to setlocale() or by environment variables. The codeset part in the result is not reliable; the locale_charset() should be used for codeset information instead. The result must not be freed; it is statically allocated. */ extern const char * gl_locale_name_posix (int category, const char *categoryname); /* Determine the default locale's name, as specified by environment variables. Return the locale category's name, or NULL if no locale has been specified by environment variables. The result must not be freed; it is statically allocated. */ extern const char * gl_locale_name_environ (int category, const char *categoryname); /* Determine the default locale's name. This is the current locale's name, if not specified by uselocale() calls, by setlocale() calls, or by environment variables. This locale name is usually determined by systems settings that the user can manipulate through a GUI. Quoting POSIX:2001: "All implementations shall define a locale as the default locale, to be invoked when no environment variables are set, or set to the empty string. This default locale can be the C locale or any other implementation-defined locale. Some implementations may provide facilities for local installation administrators to set the default locale, customizing it for each location. IEEE Std 1003.1-2001 does not require such a facility." The result must not be freed; it is statically allocated. */ extern const char * gl_locale_name_default (void) #if !(HAVE_CFPREFERENCESCOPYAPPVALUE || defined _WIN32 || defined __CYGWIN__) _GL_ATTRIBUTE_CONST #endif ; #ifdef __cplusplus } #endif #endif /* _GL_LOCALENAME_H */ pspp-1.4.1/gl/fopen.c0000644000175000017500000001452313723215636014005 0ustar00blpblp00000000000000/* Open a stream to a file. Copyright (C) 2007-2020 Free Software Foundation, Inc. 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 3 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, see . */ /* Written by Bruno Haible , 2007. */ /* If the user's config.h happens to include , let it include only the system's here, so that orig_fopen doesn't recurse to rpl_fopen. */ #define _GL_ALREADY_INCLUDING_STDIO_H #include /* Get the original definition of fopen. It might be defined as a macro. */ #include #undef _GL_ALREADY_INCLUDING_STDIO_H static FILE * orig_fopen (const char *filename, const char *mode) { return fopen (filename, mode); } /* Specification. */ /* Write "stdio.h" here, not , otherwise OSF/1 5.1 DTK cc eliminates this include because of the preliminary #include above. */ #include "stdio.h" #include #include #include #include #include #include #include FILE * rpl_fopen (const char *filename, const char *mode) { int open_direction; int open_flags; #if GNULIB_FOPEN_GNU bool open_flags_gnu; # define BUF_SIZE 80 char fdopen_mode_buf[BUF_SIZE + 1]; #endif #if defined _WIN32 && ! defined __CYGWIN__ if (strcmp (filename, "/dev/null") == 0) filename = "NUL"; #endif /* Parse the mode. */ open_direction = 0; open_flags = 0; #if GNULIB_FOPEN_GNU open_flags_gnu = false; #endif { const char *p = mode; #if GNULIB_FOPEN_GNU char *q = fdopen_mode_buf; #endif for (; *p != '\0'; p++) { switch (*p) { case 'r': open_direction = O_RDONLY; #if GNULIB_FOPEN_GNU if (q < fdopen_mode_buf + BUF_SIZE) *q++ = *p; #endif continue; case 'w': open_direction = O_WRONLY; open_flags |= O_CREAT | O_TRUNC; #if GNULIB_FOPEN_GNU if (q < fdopen_mode_buf + BUF_SIZE) *q++ = *p; #endif continue; case 'a': open_direction = O_WRONLY; open_flags |= O_CREAT | O_APPEND; #if GNULIB_FOPEN_GNU if (q < fdopen_mode_buf + BUF_SIZE) *q++ = *p; #endif continue; case 'b': /* While it is non-standard, O_BINARY is guaranteed by gnulib . We can also assume that orig_fopen supports the 'b' flag. */ open_flags |= O_BINARY; #if GNULIB_FOPEN_GNU if (q < fdopen_mode_buf + BUF_SIZE) *q++ = *p; #endif continue; case '+': open_direction = O_RDWR; #if GNULIB_FOPEN_GNU if (q < fdopen_mode_buf + BUF_SIZE) *q++ = *p; #endif continue; #if GNULIB_FOPEN_GNU case 'x': open_flags |= O_EXCL; open_flags_gnu = true; continue; case 'e': open_flags |= O_CLOEXEC; open_flags_gnu = true; continue; #endif default: break; } #if GNULIB_FOPEN_GNU /* The rest of the mode string can be a platform-dependent extension. Copy it unmodified. */ { size_t len = strlen (p); if (len > fdopen_mode_buf + BUF_SIZE - q) len = fdopen_mode_buf + BUF_SIZE - q; memcpy (q, p, len); q += len; } #endif break; } #if GNULIB_FOPEN_GNU *q = '\0'; #endif } #if FOPEN_TRAILING_SLASH_BUG /* Fail if the mode requires write access and the filename ends in a slash, as POSIX says such a filename must name a directory : "A pathname that contains at least one non- character and that ends with one or more trailing characters shall not be resolved successfully unless the last pathname component before the trailing characters names an existing directory" If the named file already exists as a directory, then if a mode that requires write access is specified, fopen() must fail because POSIX says that it fails with errno = EISDIR in this case. If the named file does not exist or does not name a directory, then fopen() must fail since the file does not contain a '.' directory. */ { size_t len = strlen (filename); if (len > 0 && filename[len - 1] == '/') { int fd; struct stat statbuf; FILE *fp; if (open_direction != O_RDONLY) { errno = EISDIR; return NULL; } fd = open (filename, open_direction | open_flags, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH); if (fd < 0) return NULL; if (fstat (fd, &statbuf) >= 0 && !S_ISDIR (statbuf.st_mode)) { close (fd); errno = ENOTDIR; return NULL; } # if GNULIB_FOPEN_GNU fp = fdopen (fd, fdopen_mode_buf); # else fp = fdopen (fd, mode); # endif if (fp == NULL) { int saved_errno = errno; close (fd); errno = saved_errno; } return fp; } } #endif #if GNULIB_FOPEN_GNU if (open_flags_gnu) { int fd; FILE *fp; fd = open (filename, open_direction | open_flags, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH); if (fd < 0) return NULL; fp = fdopen (fd, fdopen_mode_buf); if (fp == NULL) { int saved_errno = errno; close (fd); errno = saved_errno; } return fp; } #endif return orig_fopen (filename, mode); } pspp-1.4.1/gl/gl_xlist.h0000644000175000017500000001502713723215637014531 0ustar00blpblp00000000000000/* Abstract sequential list data type, with out-of-memory checking. Copyright (C) 2009-2020 Free Software Foundation, Inc. Written by Bruno Haible , 2009. 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 3 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, see . */ #ifndef _GL_XLIST_H #define _GL_XLIST_H #include "gl_list.h" #include "xalloc.h" #ifndef _GL_INLINE_HEADER_BEGIN #error "Please include config.h first." #endif _GL_INLINE_HEADER_BEGIN #ifndef GL_XLIST_INLINE # define GL_XLIST_INLINE _GL_INLINE #endif #ifdef __cplusplus extern "C" { #endif /* These functions are thin wrappers around the corresponding functions with _nx_ infix from gl_list.h. Upon out-of-memory, they invoke xalloc_die (), instead of returning an error indicator. */ #if 0 /* These are defined inline below. */ extern gl_list_t gl_list_create_empty (gl_list_implementation_t implementation, gl_listelement_equals_fn equals_fn, gl_listelement_hashcode_fn hashcode_fn, gl_listelement_dispose_fn dispose_fn, bool allow_duplicates); extern gl_list_t gl_list_create (gl_list_implementation_t implementation, gl_listelement_equals_fn equals_fn, gl_listelement_hashcode_fn hashcode_fn, gl_listelement_dispose_fn dispose_fn, bool allow_duplicates, size_t count, const void **contents); extern void gl_list_node_set_value (gl_list_t list, gl_list_node_t node, const void *elt); extern gl_list_node_t gl_list_set_at (gl_list_t list, size_t position, const void *elt); extern gl_list_node_t gl_list_set_first (gl_list_t list, const void *elt); extern gl_list_node_t gl_list_set_last (gl_list_t list, const void *elt); extern gl_list_node_t gl_list_add_first (gl_list_t list, const void *elt); extern gl_list_node_t gl_list_add_last (gl_list_t list, const void *elt); extern gl_list_node_t gl_list_add_before (gl_list_t list, gl_list_node_t node, const void *elt); extern gl_list_node_t gl_list_add_after (gl_list_t list, gl_list_node_t node, const void *elt); extern gl_list_node_t gl_list_add_at (gl_list_t list, size_t position, const void *elt); extern gl_list_node_t gl_sortedlist_add (gl_list_t list, gl_listelement_compar_fn compar, const void *elt); #endif GL_XLIST_INLINE gl_list_t gl_list_create_empty (gl_list_implementation_t implementation, gl_listelement_equals_fn equals_fn, gl_listelement_hashcode_fn hashcode_fn, gl_listelement_dispose_fn dispose_fn, bool allow_duplicates) { gl_list_t result = gl_list_nx_create_empty (implementation, equals_fn, hashcode_fn, dispose_fn, allow_duplicates); if (result == NULL) xalloc_die (); return result; } GL_XLIST_INLINE gl_list_t gl_list_create (gl_list_implementation_t implementation, gl_listelement_equals_fn equals_fn, gl_listelement_hashcode_fn hashcode_fn, gl_listelement_dispose_fn dispose_fn, bool allow_duplicates, size_t count, const void **contents) { gl_list_t result = gl_list_nx_create (implementation, equals_fn, hashcode_fn, dispose_fn, allow_duplicates, count, contents); if (result == NULL) xalloc_die (); return result; } GL_XLIST_INLINE void gl_list_node_set_value (gl_list_t list, gl_list_node_t node, const void *elt) { int result = gl_list_node_nx_set_value (list, node, elt); if (result < 0) xalloc_die (); } GL_XLIST_INLINE gl_list_node_t gl_list_set_at (gl_list_t list, size_t position, const void *elt) { gl_list_node_t result = gl_list_nx_set_at (list, position, elt); if (result == NULL) xalloc_die (); return result; } GL_XLIST_INLINE gl_list_node_t gl_list_set_first (gl_list_t list, const void *elt) { gl_list_node_t result = gl_list_nx_set_first (list, elt); if (result == NULL) xalloc_die (); return result; } GL_XLIST_INLINE gl_list_node_t gl_list_set_last (gl_list_t list, const void *elt) { gl_list_node_t result = gl_list_nx_set_last (list, elt); if (result == NULL) xalloc_die (); return result; } GL_XLIST_INLINE gl_list_node_t gl_list_add_first (gl_list_t list, const void *elt) { gl_list_node_t result = gl_list_nx_add_first (list, elt); if (result == NULL) xalloc_die (); return result; } GL_XLIST_INLINE gl_list_node_t gl_list_add_last (gl_list_t list, const void *elt) { gl_list_node_t result = gl_list_nx_add_last (list, elt); if (result == NULL) xalloc_die (); return result; } GL_XLIST_INLINE gl_list_node_t gl_list_add_before (gl_list_t list, gl_list_node_t node, const void *elt) { gl_list_node_t result = gl_list_nx_add_before (list, node, elt); if (result == NULL) xalloc_die (); return result; } GL_XLIST_INLINE gl_list_node_t gl_list_add_after (gl_list_t list, gl_list_node_t node, const void *elt) { gl_list_node_t result = gl_list_nx_add_after (list, node, elt); if (result == NULL) xalloc_die (); return result; } GL_XLIST_INLINE gl_list_node_t gl_list_add_at (gl_list_t list, size_t position, const void *elt) { gl_list_node_t result = gl_list_nx_add_at (list, position, elt); if (result == NULL) xalloc_die (); return result; } GL_XLIST_INLINE gl_list_node_t gl_sortedlist_add (gl_list_t list, gl_listelement_compar_fn compar, const void *elt) { gl_list_node_t result = gl_sortedlist_nx_add (list, compar, elt); if (result == NULL) xalloc_die (); return result; } #ifdef __cplusplus } #endif _GL_INLINE_HEADER_END #endif /* _GL_XLIST_H */ pspp-1.4.1/gl/fpucw.h0000644000175000017500000001130313723215636014020 0ustar00blpblp00000000000000/* Manipulating the FPU control word. -*- coding: utf-8 -*- Copyright (C) 2007-2020 Free Software Foundation, Inc. Written by Bruno Haible , 2007. 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 3 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, see . */ #ifndef _FPUCW_H #define _FPUCW_H /* The i386 floating point hardware (the 387 compatible FPU, not the modern SSE/SSE2 hardware) has a controllable rounding precision. It is specified through the 'PC' bits in the FPU control word ('fctrl' register). (See the GNU libc i386 header for details.) On some platforms, such as Linux or Solaris, the default precision setting is set to "extended precision". This means that 'long double' instructions operate correctly, but 'double' computations often produce slightly different results as on strictly IEEE 754 conforming systems. On some platforms, such as NetBSD, the default precision is set to "double precision". This means that 'long double' instructions will operate only as 'double', i.e. lead to wrong results. Similarly on FreeBSD 6.4, at least for the division of 'long double' numbers. The FPU control word is under control of the application, i.e. it is not required to be set either way by the ABI. (In fact, the i386 ABI https://www.linux-mips.org/pub/linux/mips/doc/ABI/abi386-4.pdf page 3-12 = page 38 is not clear about it. But in any case, gcc treats the control word like a "preserved" register: it emits code that assumes that the control word is preserved across calls, and it restores the control word at the end of functions that modify it.) See Vincent Lefèvre's page https://www.vinc17.net/research/extended.en.html for a good explanation. See https://web.archive.org/web/20060905133417/http://www.uwsg.iu.edu/hypermail/linux/kernel/0103.0/0453.html some argumentation which setting should be the default. */ /* This header file provides the following facilities: fpucw_t integral type holding the value of 'fctrl' FPU_PC_MASK bit mask denoting the precision control FPU_PC_DOUBLE precision control for 53 bits mantissa FPU_PC_EXTENDED precision control for 64 bits mantissa GET_FPUCW () yields the current FPU control word SET_FPUCW (word) sets the FPU control word DECL_LONG_DOUBLE_ROUNDING variable declaration for BEGIN/END_LONG_DOUBLE_ROUNDING BEGIN_LONG_DOUBLE_ROUNDING () starts a sequence of instructions with 'long double' safe operation precision END_LONG_DOUBLE_ROUNDING () ends a sequence of instructions with 'long double' safe operation precision */ /* Inline assembler like this works only with GNU C. */ #if (defined __i386__ || defined __x86_64__) && defined __GNUC__ typedef unsigned short fpucw_t; /* glibc calls this fpu_control_t */ # define FPU_PC_MASK 0x0300 # define FPU_PC_DOUBLE 0x200 /* glibc calls this _FPU_DOUBLE */ # define FPU_PC_EXTENDED 0x300 /* glibc calls this _FPU_EXTENDED */ # define GET_FPUCW() __extension__ \ ({ fpucw_t _cw; \ __asm__ __volatile__ ("fnstcw %0" : "=m" (*&_cw)); \ _cw; \ }) # define SET_FPUCW(word) __extension__ \ (void)({ fpucw_t _ncw = (word); \ __asm__ __volatile__ ("fldcw %0" : : "m" (*&_ncw)); \ }) # define DECL_LONG_DOUBLE_ROUNDING \ fpucw_t oldcw; # define BEGIN_LONG_DOUBLE_ROUNDING() \ (void)(oldcw = GET_FPUCW (), \ SET_FPUCW ((oldcw & ~FPU_PC_MASK) | FPU_PC_EXTENDED)) # define END_LONG_DOUBLE_ROUNDING() \ SET_FPUCW (oldcw) #else typedef unsigned int fpucw_t; # define FPU_PC_MASK 0 # define FPU_PC_DOUBLE 0 # define FPU_PC_EXTENDED 0 # define GET_FPUCW() 0 # define SET_FPUCW(word) (void)(word) # define DECL_LONG_DOUBLE_ROUNDING # define BEGIN_LONG_DOUBLE_ROUNDING() # define END_LONG_DOUBLE_ROUNDING() #endif #endif /* _FPUCW_H */ pspp-1.4.1/gl/full-write.h0000644000175000017500000000216713723215637014777 0ustar00blpblp00000000000000/* An interface to write() that writes all it is asked to write. Copyright (C) 2002-2003, 2009-2020 Free Software Foundation, Inc. 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 3 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, see . */ #include #ifdef __cplusplus extern "C" { #endif /* Write COUNT bytes at BUF to descriptor FD, retrying if interrupted or if partial writes occur. Return the number of bytes successfully written, setting errno if that is less than COUNT. */ extern size_t full_write (int fd, const void *buf, size_t count); #ifdef __cplusplus } #endif pspp-1.4.1/gl/localcharset.c0000644000175000017500000011566113723215637015350 0ustar00blpblp00000000000000/* Determine a canonical name for the current locale's character encoding. Copyright (C) 2000-2006, 2008-2020 Free Software Foundation, Inc. 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 3, 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, see . */ /* Written by Bruno Haible . */ #include /* Specification. */ #include "localcharset.h" #include #include #include #include #if defined __APPLE__ && defined __MACH__ && HAVE_LANGINFO_CODESET # define DARWIN7 /* Darwin 7 or newer, i.e. Mac OS X 10.3 or newer */ #endif #if defined _WIN32 && !defined __CYGWIN__ # define WINDOWS_NATIVE # include #endif #if defined __EMX__ /* Assume EMX program runs on OS/2, even if compiled under DOS. */ # ifndef OS2 # define OS2 # endif #endif #if !defined WINDOWS_NATIVE # if HAVE_LANGINFO_CODESET # include # else # if 0 /* see comment regarding use of setlocale(), below */ # include # endif # endif # ifdef __CYGWIN__ # define WIN32_LEAN_AND_MEAN # include # endif #elif defined WINDOWS_NATIVE # define WIN32_LEAN_AND_MEAN # include /* For the use of setlocale() below, the Gnulib override in setlocale.c is not needed; see the platform lists in setlocale_null.m4. */ # undef setlocale #endif #if defined OS2 # define INCL_DOS # include #endif /* For MB_CUR_MAX_L */ #if defined DARWIN7 # include #endif #if HAVE_LANGINFO_CODESET || defined WINDOWS_NATIVE || defined OS2 /* On these platforms, we use a mapping from non-canonical encoding name to GNU canonical encoding name. */ /* With glibc-2.1 or newer, we don't need any canonicalization, because glibc has iconv and both glibc and libiconv support all GNU canonical names directly. */ # if !((defined __GNU_LIBRARY__ && __GLIBC__ >= 2) || defined __UCLIBC__) struct table_entry { const char alias[11+1]; const char canonical[11+1]; }; /* Table of platform-dependent mappings, sorted in ascending order. */ static const struct table_entry alias_table[] = { # if defined __FreeBSD__ /* FreeBSD */ /*{ "ARMSCII-8", "ARMSCII-8" },*/ { "Big5", "BIG5" }, { "C", "ASCII" }, /*{ "CP1131", "CP1131" },*/ /*{ "CP1251", "CP1251" },*/ /*{ "CP866", "CP866" },*/ /*{ "GB18030", "GB18030" },*/ /*{ "GB2312", "GB2312" },*/ /*{ "GBK", "GBK" },*/ /*{ "ISCII-DEV", "?" },*/ { "ISO8859-1", "ISO-8859-1" }, { "ISO8859-13", "ISO-8859-13" }, { "ISO8859-15", "ISO-8859-15" }, { "ISO8859-2", "ISO-8859-2" }, { "ISO8859-5", "ISO-8859-5" }, { "ISO8859-7", "ISO-8859-7" }, { "ISO8859-9", "ISO-8859-9" }, /*{ "KOI8-R", "KOI8-R" },*/ /*{ "KOI8-U", "KOI8-U" },*/ { "SJIS", "SHIFT_JIS" }, { "US-ASCII", "ASCII" }, { "eucCN", "GB2312" }, { "eucJP", "EUC-JP" }, { "eucKR", "EUC-KR" } # define alias_table_defined # endif # if defined __NetBSD__ /* NetBSD */ { "646", "ASCII" }, /*{ "ARMSCII-8", "ARMSCII-8" },*/ /*{ "BIG5", "BIG5" },*/ { "Big5-HKSCS", "BIG5-HKSCS" }, /*{ "CP1251", "CP1251" },*/ /*{ "CP866", "CP866" },*/ /*{ "GB18030", "GB18030" },*/ /*{ "GB2312", "GB2312" },*/ { "ISO8859-1", "ISO-8859-1" }, { "ISO8859-13", "ISO-8859-13" }, { "ISO8859-15", "ISO-8859-15" }, { "ISO8859-2", "ISO-8859-2" }, { "ISO8859-4", "ISO-8859-4" }, { "ISO8859-5", "ISO-8859-5" }, { "ISO8859-7", "ISO-8859-7" }, /*{ "KOI8-R", "KOI8-R" },*/ /*{ "KOI8-U", "KOI8-U" },*/ /*{ "PT154", "PT154" },*/ { "SJIS", "SHIFT_JIS" }, { "eucCN", "GB2312" }, { "eucJP", "EUC-JP" }, { "eucKR", "EUC-KR" }, { "eucTW", "EUC-TW" } # define alias_table_defined # endif # if defined __OpenBSD__ /* OpenBSD */ { "646", "ASCII" }, { "ISO8859-1", "ISO-8859-1" }, { "ISO8859-13", "ISO-8859-13" }, { "ISO8859-15", "ISO-8859-15" }, { "ISO8859-2", "ISO-8859-2" }, { "ISO8859-4", "ISO-8859-4" }, { "ISO8859-5", "ISO-8859-5" }, { "ISO8859-7", "ISO-8859-7" }, { "US-ASCII", "ASCII" } # define alias_table_defined # endif # if defined __APPLE__ && defined __MACH__ /* Mac OS X */ /* Darwin 7.5 has nl_langinfo(CODESET), but sometimes its value is useless: - It returns the empty string when LANG is set to a locale of the form ll_CC, although ll_CC/LC_CTYPE is a symlink to an UTF-8 LC_CTYPE file. - The environment variables LANG, LC_CTYPE, LC_ALL are not set by the system; nl_langinfo(CODESET) returns "US-ASCII" in this case. - The documentation says: "... all code that calls BSD system routines should ensure that the const *char parameters of these routines are in UTF-8 encoding. All BSD system functions expect their string parameters to be in UTF-8 encoding and nothing else." It also says "An additional caveat is that string parameters for files, paths, and other file-system entities must be in canonical UTF-8. In a canonical UTF-8 Unicode string, all decomposable characters are decomposed ..." but this is not true: You can pass non-decomposed UTF-8 strings to file system functions, and it is the OS which will convert them to decomposed UTF-8 before accessing the file system. - The Apple Terminal application displays UTF-8 by default. - However, other applications are free to use different encodings: - xterm uses ISO-8859-1 by default. - TextEdit uses MacRoman by default. We prefer UTF-8 over decomposed UTF-8-MAC because one should minimize the use of decomposed Unicode. Unfortunately, through the Darwin file system, decomposed UTF-8 strings are leaked into user space nevertheless. Then there are also the locales with encodings other than US-ASCII and UTF-8. These locales can be occasionally useful to users (e.g. when grepping through ISO-8859-1 encoded text files), when all their file names are in US-ASCII. */ { "ARMSCII-8", "ARMSCII-8" }, { "Big5", "BIG5" }, { "Big5HKSCS", "BIG5-HKSCS" }, { "CP1131", "CP1131" }, { "CP1251", "CP1251" }, { "CP866", "CP866" }, { "CP949", "CP949" }, { "GB18030", "GB18030" }, { "GB2312", "GB2312" }, { "GBK", "GBK" }, /*{ "ISCII-DEV", "?" },*/ { "ISO8859-1", "ISO-8859-1" }, { "ISO8859-13", "ISO-8859-13" }, { "ISO8859-15", "ISO-8859-15" }, { "ISO8859-2", "ISO-8859-2" }, { "ISO8859-4", "ISO-8859-4" }, { "ISO8859-5", "ISO-8859-5" }, { "ISO8859-7", "ISO-8859-7" }, { "ISO8859-9", "ISO-8859-9" }, { "KOI8-R", "KOI8-R" }, { "KOI8-U", "KOI8-U" }, { "PT154", "PT154" }, { "SJIS", "SHIFT_JIS" }, { "eucCN", "GB2312" }, { "eucJP", "EUC-JP" }, { "eucKR", "EUC-KR" } # define alias_table_defined # endif # if defined _AIX /* AIX */ /*{ "GBK", "GBK" },*/ { "IBM-1046", "CP1046" }, { "IBM-1124", "CP1124" }, { "IBM-1129", "CP1129" }, { "IBM-1252", "CP1252" }, { "IBM-850", "CP850" }, { "IBM-856", "CP856" }, { "IBM-921", "ISO-8859-13" }, { "IBM-922", "CP922" }, { "IBM-932", "CP932" }, { "IBM-943", "CP943" }, { "IBM-eucCN", "GB2312" }, { "IBM-eucJP", "EUC-JP" }, { "IBM-eucKR", "EUC-KR" }, { "IBM-eucTW", "EUC-TW" }, { "ISO8859-1", "ISO-8859-1" }, { "ISO8859-15", "ISO-8859-15" }, { "ISO8859-2", "ISO-8859-2" }, { "ISO8859-5", "ISO-8859-5" }, { "ISO8859-6", "ISO-8859-6" }, { "ISO8859-7", "ISO-8859-7" }, { "ISO8859-8", "ISO-8859-8" }, { "ISO8859-9", "ISO-8859-9" }, { "TIS-620", "TIS-620" }, /*{ "UTF-8", "UTF-8" },*/ { "big5", "BIG5" } # define alias_table_defined # endif # if defined __hpux /* HP-UX */ { "SJIS", "SHIFT_JIS" }, { "arabic8", "HP-ARABIC8" }, { "big5", "BIG5" }, { "cp1251", "CP1251" }, { "eucJP", "EUC-JP" }, { "eucKR", "EUC-KR" }, { "eucTW", "EUC-TW" }, { "gb18030", "GB18030" }, { "greek8", "HP-GREEK8" }, { "hebrew8", "HP-HEBREW8" }, { "hkbig5", "BIG5-HKSCS" }, { "hp15CN", "GB2312" }, { "iso88591", "ISO-8859-1" }, { "iso885913", "ISO-8859-13" }, { "iso885915", "ISO-8859-15" }, { "iso88592", "ISO-8859-2" }, { "iso88594", "ISO-8859-4" }, { "iso88595", "ISO-8859-5" }, { "iso88596", "ISO-8859-6" }, { "iso88597", "ISO-8859-7" }, { "iso88598", "ISO-8859-8" }, { "iso88599", "ISO-8859-9" }, { "kana8", "HP-KANA8" }, { "koi8r", "KOI8-R" }, { "roman8", "HP-ROMAN8" }, { "tis620", "TIS-620" }, { "turkish8", "HP-TURKISH8" }, { "utf8", "UTF-8" } # define alias_table_defined # endif # if defined __sgi /* IRIX */ { "ISO8859-1", "ISO-8859-1" }, { "ISO8859-15", "ISO-8859-15" }, { "ISO8859-2", "ISO-8859-2" }, { "ISO8859-5", "ISO-8859-5" }, { "ISO8859-7", "ISO-8859-7" }, { "ISO8859-9", "ISO-8859-9" }, { "eucCN", "GB2312" }, { "eucJP", "EUC-JP" }, { "eucKR", "EUC-KR" }, { "eucTW", "EUC-TW" } # define alias_table_defined # endif # if defined __osf__ /* OSF/1 */ /*{ "GBK", "GBK" },*/ { "ISO8859-1", "ISO-8859-1" }, { "ISO8859-15", "ISO-8859-15" }, { "ISO8859-2", "ISO-8859-2" }, { "ISO8859-4", "ISO-8859-4" }, { "ISO8859-5", "ISO-8859-5" }, { "ISO8859-7", "ISO-8859-7" }, { "ISO8859-8", "ISO-8859-8" }, { "ISO8859-9", "ISO-8859-9" }, { "KSC5601", "CP949" }, { "SJIS", "SHIFT_JIS" }, { "TACTIS", "TIS-620" }, /*{ "UTF-8", "UTF-8" },*/ { "big5", "BIG5" }, { "cp850", "CP850" }, { "dechanyu", "DEC-HANYU" }, { "dechanzi", "GB2312" }, { "deckanji", "DEC-KANJI" }, { "deckorean", "EUC-KR" }, { "eucJP", "EUC-JP" }, { "eucKR", "EUC-KR" }, { "eucTW", "EUC-TW" }, { "sdeckanji", "EUC-JP" } # define alias_table_defined # endif # if defined __sun /* Solaris */ { "5601", "EUC-KR" }, { "646", "ASCII" }, /*{ "BIG5", "BIG5" },*/ { "Big5-HKSCS", "BIG5-HKSCS" }, { "GB18030", "GB18030" }, /*{ "GBK", "GBK" },*/ { "ISO8859-1", "ISO-8859-1" }, { "ISO8859-11", "TIS-620" }, { "ISO8859-13", "ISO-8859-13" }, { "ISO8859-15", "ISO-8859-15" }, { "ISO8859-2", "ISO-8859-2" }, { "ISO8859-3", "ISO-8859-3" }, { "ISO8859-4", "ISO-8859-4" }, { "ISO8859-5", "ISO-8859-5" }, { "ISO8859-6", "ISO-8859-6" }, { "ISO8859-7", "ISO-8859-7" }, { "ISO8859-8", "ISO-8859-8" }, { "ISO8859-9", "ISO-8859-9" }, { "PCK", "SHIFT_JIS" }, { "TIS620.2533", "TIS-620" }, /*{ "UTF-8", "UTF-8" },*/ { "ansi-1251", "CP1251" }, { "cns11643", "EUC-TW" }, { "eucJP", "EUC-JP" }, { "gb2312", "GB2312" }, { "koi8-r", "KOI8-R" } # define alias_table_defined # endif # if defined __minix /* Minix */ { "646", "ASCII" } # define alias_table_defined # endif # if defined WINDOWS_NATIVE || defined __CYGWIN__ /* Windows */ { "CP1361", "JOHAB" }, { "CP20127", "ASCII" }, { "CP20866", "KOI8-R" }, { "CP20936", "GB2312" }, { "CP21866", "KOI8-RU" }, { "CP28591", "ISO-8859-1" }, { "CP28592", "ISO-8859-2" }, { "CP28593", "ISO-8859-3" }, { "CP28594", "ISO-8859-4" }, { "CP28595", "ISO-8859-5" }, { "CP28596", "ISO-8859-6" }, { "CP28597", "ISO-8859-7" }, { "CP28598", "ISO-8859-8" }, { "CP28599", "ISO-8859-9" }, { "CP28605", "ISO-8859-15" }, { "CP38598", "ISO-8859-8" }, { "CP51932", "EUC-JP" }, { "CP51936", "GB2312" }, { "CP51949", "EUC-KR" }, { "CP51950", "EUC-TW" }, { "CP54936", "GB18030" }, { "CP65001", "UTF-8" }, { "CP936", "GBK" } # define alias_table_defined # endif # if defined OS2 /* OS/2 */ /* The list of encodings is taken from "List of OS/2 Codepages" by Alex Taylor: . See also "__convcp() of kLIBC": . */ { "CP1004", "CP1252" }, /*{ "CP1041", "CP943" },*/ /*{ "CP1088", "CP949" },*/ { "CP1089", "ISO-8859-6" }, /*{ "CP1114", "CP950" },*/ /*{ "CP1115", "GB2312" },*/ { "CP1208", "UTF-8" }, /*{ "CP1380", "GB2312" },*/ { "CP1381", "GB2312" }, { "CP1383", "GB2312" }, { "CP1386", "GBK" }, /*{ "CP301", "CP943" },*/ { "CP3372", "EUC-JP" }, { "CP4946", "CP850" }, /*{ "CP5048", "JIS_X0208-1990" },*/ /*{ "CP5049", "JIS_X0212-1990" },*/ /*{ "CP5067", "KS_C_5601-1987" },*/ { "CP813", "ISO-8859-7" }, { "CP819", "ISO-8859-1" }, { "CP878", "KOI8-R" }, /*{ "CP897", "CP943" },*/ { "CP912", "ISO-8859-2" }, { "CP913", "ISO-8859-3" }, { "CP914", "ISO-8859-4" }, { "CP915", "ISO-8859-5" }, { "CP916", "ISO-8859-8" }, { "CP920", "ISO-8859-9" }, { "CP921", "ISO-8859-13" }, { "CP923", "ISO-8859-15" }, /*{ "CP941", "CP943" },*/ /*{ "CP947", "CP950" },*/ /*{ "CP951", "CP949" },*/ /*{ "CP952", "JIS_X0208-1990" },*/ /*{ "CP953", "JIS_X0212-1990" },*/ { "CP954", "EUC-JP" }, { "CP964", "EUC-TW" }, { "CP970", "EUC-KR" }, /*{ "CP971", "KS_C_5601-1987" },*/ { "IBM-1004", "CP1252" }, /*{ "IBM-1006", "?" },*/ /*{ "IBM-1008", "?" },*/ /*{ "IBM-1041", "CP943" },*/ /*{ "IBM-1051", "?" },*/ /*{ "IBM-1088", "CP949" },*/ { "IBM-1089", "ISO-8859-6" }, /*{ "IBM-1098", "?" },*/ /*{ "IBM-1114", "CP950" },*/ /*{ "IBM-1115", "GB2312" },*/ /*{ "IBM-1116", "?" },*/ /*{ "IBM-1117", "?" },*/ /*{ "IBM-1118", "?" },*/ /*{ "IBM-1119", "?" },*/ { "IBM-1124", "CP1124" }, { "IBM-1125", "CP1125" }, { "IBM-1131", "CP1131" }, { "IBM-1208", "UTF-8" }, { "IBM-1250", "CP1250" }, { "IBM-1251", "CP1251" }, { "IBM-1252", "CP1252" }, { "IBM-1253", "CP1253" }, { "IBM-1254", "CP1254" }, { "IBM-1255", "CP1255" }, { "IBM-1256", "CP1256" }, { "IBM-1257", "CP1257" }, /*{ "IBM-1275", "?" },*/ /*{ "IBM-1276", "?" },*/ /*{ "IBM-1277", "?" },*/ /*{ "IBM-1280", "?" },*/ /*{ "IBM-1281", "?" },*/ /*{ "IBM-1282", "?" },*/ /*{ "IBM-1283", "?" },*/ /*{ "IBM-1380", "GB2312" },*/ { "IBM-1381", "GB2312" }, { "IBM-1383", "GB2312" }, { "IBM-1386", "GBK" }, /*{ "IBM-301", "CP943" },*/ { "IBM-3372", "EUC-JP" }, { "IBM-367", "ASCII" }, { "IBM-437", "CP437" }, { "IBM-4946", "CP850" }, /*{ "IBM-5048", "JIS_X0208-1990" },*/ /*{ "IBM-5049", "JIS_X0212-1990" },*/ /*{ "IBM-5067", "KS_C_5601-1987" },*/ { "IBM-813", "ISO-8859-7" }, { "IBM-819", "ISO-8859-1" }, { "IBM-850", "CP850" }, /*{ "IBM-851", "?" },*/ { "IBM-852", "CP852" }, { "IBM-855", "CP855" }, { "IBM-856", "CP856" }, { "IBM-857", "CP857" }, /*{ "IBM-859", "?" },*/ { "IBM-860", "CP860" }, { "IBM-861", "CP861" }, { "IBM-862", "CP862" }, { "IBM-863", "CP863" }, { "IBM-864", "CP864" }, { "IBM-865", "CP865" }, { "IBM-866", "CP866" }, /*{ "IBM-868", "?" },*/ { "IBM-869", "CP869" }, { "IBM-874", "CP874" }, { "IBM-878", "KOI8-R" }, /*{ "IBM-895", "?" },*/ /*{ "IBM-897", "CP943" },*/ /*{ "IBM-907", "?" },*/ /*{ "IBM-909", "?" },*/ { "IBM-912", "ISO-8859-2" }, { "IBM-913", "ISO-8859-3" }, { "IBM-914", "ISO-8859-4" }, { "IBM-915", "ISO-8859-5" }, { "IBM-916", "ISO-8859-8" }, { "IBM-920", "ISO-8859-9" }, { "IBM-921", "ISO-8859-13" }, { "IBM-922", "CP922" }, { "IBM-923", "ISO-8859-15" }, { "IBM-932", "CP932" }, /*{ "IBM-941", "CP943" },*/ /*{ "IBM-942", "?" },*/ { "IBM-943", "CP943" }, /*{ "IBM-947", "CP950" },*/ { "IBM-949", "CP949" }, { "IBM-950", "CP950" }, /*{ "IBM-951", "CP949" },*/ /*{ "IBM-952", "JIS_X0208-1990" },*/ /*{ "IBM-953", "JIS_X0212-1990" },*/ { "IBM-954", "EUC-JP" }, /*{ "IBM-955", "?" },*/ { "IBM-964", "EUC-TW" }, { "IBM-970", "EUC-KR" }, /*{ "IBM-971", "KS_C_5601-1987" },*/ { "IBM-eucCN", "GB2312" }, { "IBM-eucJP", "EUC-JP" }, { "IBM-eucKR", "EUC-KR" }, { "IBM-eucTW", "EUC-TW" }, { "IBM33722", "EUC-JP" }, { "ISO8859-1", "ISO-8859-1" }, { "ISO8859-2", "ISO-8859-2" }, { "ISO8859-3", "ISO-8859-3" }, { "ISO8859-4", "ISO-8859-4" }, { "ISO8859-5", "ISO-8859-5" }, { "ISO8859-6", "ISO-8859-6" }, { "ISO8859-7", "ISO-8859-7" }, { "ISO8859-8", "ISO-8859-8" }, { "ISO8859-9", "ISO-8859-9" }, /*{ "JISX0201-1976", "JISX0201-1976" },*/ /*{ "JISX0208-1978", "?" },*/ /*{ "JISX0208-1983", "JIS_X0208-1983" },*/ /*{ "JISX0208-1990", "JIS_X0208-1990" },*/ /*{ "JISX0212-1990", "JIS_X0212-1990" },*/ /*{ "KSC5601-1987", "KS_C_5601-1987" },*/ { "SJIS-1", "CP943" }, { "SJIS-2", "CP943" }, { "eucJP", "EUC-JP" }, { "eucKR", "EUC-KR" }, { "eucTW-1993", "EUC-TW" } # define alias_table_defined # endif # if defined VMS /* OpenVMS */ /* The list of encodings is taken from the OpenVMS 7.3-1 documentation "Compaq C Run-Time Library Reference Manual for OpenVMS systems" section 10.7 "Handling Different Character Sets". */ { "DECHANYU", "DEC-HANYU" }, { "DECHANZI", "GB2312" }, { "DECKANJI", "DEC-KANJI" }, { "DECKOREAN", "EUC-KR" }, { "ISO8859-1", "ISO-8859-1" }, { "ISO8859-2", "ISO-8859-2" }, { "ISO8859-5", "ISO-8859-5" }, { "ISO8859-7", "ISO-8859-7" }, { "ISO8859-8", "ISO-8859-8" }, { "ISO8859-9", "ISO-8859-9" }, { "SDECKANJI", "EUC-JP" }, { "SJIS", "SHIFT_JIS" }, { "eucJP", "EUC-JP" }, { "eucTW", "EUC-TW" } # define alias_table_defined # endif # ifndef alias_table_defined /* Just a dummy entry, to avoid a C syntax error. */ { "", "" } # endif }; # endif #else /* On these platforms, we use a mapping from locale name to GNU canonical encoding name. */ struct table_entry { const char locale[17+1]; const char canonical[11+1]; }; /* Table of platform-dependent mappings, sorted in ascending order. */ static const struct table_entry locale_table[] = { # if defined __FreeBSD__ /* FreeBSD 4.2 */ { "cs_CZ.ISO_8859-2", "ISO-8859-2" }, { "da_DK.DIS_8859-15", "ISO-8859-15" }, { "da_DK.ISO_8859-1", "ISO-8859-1" }, { "de_AT.DIS_8859-15", "ISO-8859-15" }, { "de_AT.ISO_8859-1", "ISO-8859-1" }, { "de_CH.DIS_8859-15", "ISO-8859-15" }, { "de_CH.ISO_8859-1", "ISO-8859-1" }, { "de_DE.DIS_8859-15", "ISO-8859-15" }, { "de_DE.ISO_8859-1", "ISO-8859-1" }, { "en_AU.DIS_8859-15", "ISO-8859-15" }, { "en_AU.ISO_8859-1", "ISO-8859-1" }, { "en_CA.DIS_8859-15", "ISO-8859-15" }, { "en_CA.ISO_8859-1", "ISO-8859-1" }, { "en_GB.DIS_8859-15", "ISO-8859-15" }, { "en_GB.ISO_8859-1", "ISO-8859-1" }, { "en_US.DIS_8859-15", "ISO-8859-15" }, { "en_US.ISO_8859-1", "ISO-8859-1" }, { "es_ES.DIS_8859-15", "ISO-8859-15" }, { "es_ES.ISO_8859-1", "ISO-8859-1" }, { "fi_FI.DIS_8859-15", "ISO-8859-15" }, { "fi_FI.ISO_8859-1", "ISO-8859-1" }, { "fr_BE.DIS_8859-15", "ISO-8859-15" }, { "fr_BE.ISO_8859-1", "ISO-8859-1" }, { "fr_CA.DIS_8859-15", "ISO-8859-15" }, { "fr_CA.ISO_8859-1", "ISO-8859-1" }, { "fr_CH.DIS_8859-15", "ISO-8859-15" }, { "fr_CH.ISO_8859-1", "ISO-8859-1" }, { "fr_FR.DIS_8859-15", "ISO-8859-15" }, { "fr_FR.ISO_8859-1", "ISO-8859-1" }, { "hr_HR.ISO_8859-2", "ISO-8859-2" }, { "hu_HU.ISO_8859-2", "ISO-8859-2" }, { "is_IS.DIS_8859-15", "ISO-8859-15" }, { "is_IS.ISO_8859-1", "ISO-8859-1" }, { "it_CH.DIS_8859-15", "ISO-8859-15" }, { "it_CH.ISO_8859-1", "ISO-8859-1" }, { "it_IT.DIS_8859-15", "ISO-8859-15" }, { "it_IT.ISO_8859-1", "ISO-8859-1" }, { "ja_JP.EUC", "EUC-JP" }, { "ja_JP.SJIS", "SHIFT_JIS" }, { "ja_JP.Shift_JIS", "SHIFT_JIS" }, { "ko_KR.EUC", "EUC-KR" }, { "la_LN.ASCII", "ASCII" }, { "la_LN.DIS_8859-15", "ISO-8859-15" }, { "la_LN.ISO_8859-1", "ISO-8859-1" }, { "la_LN.ISO_8859-2", "ISO-8859-2" }, { "la_LN.ISO_8859-4", "ISO-8859-4" }, { "lt_LN.ASCII", "ASCII" }, { "lt_LN.DIS_8859-15", "ISO-8859-15" }, { "lt_LN.ISO_8859-1", "ISO-8859-1" }, { "lt_LN.ISO_8859-2", "ISO-8859-2" }, { "lt_LT.ISO_8859-4", "ISO-8859-4" }, { "nl_BE.DIS_8859-15", "ISO-8859-15" }, { "nl_BE.ISO_8859-1", "ISO-8859-1" }, { "nl_NL.DIS_8859-15", "ISO-8859-15" }, { "nl_NL.ISO_8859-1", "ISO-8859-1" }, { "no_NO.DIS_8859-15", "ISO-8859-15" }, { "no_NO.ISO_8859-1", "ISO-8859-1" }, { "pl_PL.ISO_8859-2", "ISO-8859-2" }, { "pt_PT.DIS_8859-15", "ISO-8859-15" }, { "pt_PT.ISO_8859-1", "ISO-8859-1" }, { "ru_RU.CP866", "CP866" }, { "ru_RU.ISO_8859-5", "ISO-8859-5" }, { "ru_RU.KOI8-R", "KOI8-R" }, { "ru_SU.CP866", "CP866" }, { "ru_SU.ISO_8859-5", "ISO-8859-5" }, { "ru_SU.KOI8-R", "KOI8-R" }, { "sl_SI.ISO_8859-2", "ISO-8859-2" }, { "sv_SE.DIS_8859-15", "ISO-8859-15" }, { "sv_SE.ISO_8859-1", "ISO-8859-1" }, { "uk_UA.KOI8-U", "KOI8-U" }, { "zh_CN.EUC", "GB2312" }, { "zh_TW.BIG5", "BIG5" }, { "zh_TW.Big5", "BIG5" } # define locale_table_defined # endif # if defined __DJGPP__ /* DOS / DJGPP 2.03 */ /* The encodings given here may not all be correct. If you find that the encoding given for your language and country is not the one your DOS machine actually uses, just correct it in this file, and send a mail to Juan Manuel Guerrero and . */ { "C", "ASCII" }, { "ar", "CP864" }, { "ar_AE", "CP864" }, { "ar_DZ", "CP864" }, { "ar_EG", "CP864" }, { "ar_IQ", "CP864" }, { "ar_IR", "CP864" }, { "ar_JO", "CP864" }, { "ar_KW", "CP864" }, { "ar_MA", "CP864" }, { "ar_OM", "CP864" }, { "ar_QA", "CP864" }, { "ar_SA", "CP864" }, { "ar_SY", "CP864" }, { "be", "CP866" }, { "be_BE", "CP866" }, { "bg", "CP866" }, /* not CP855 ?? */ { "bg_BG", "CP866" }, /* not CP855 ?? */ { "ca", "CP850" }, { "ca_ES", "CP850" }, { "cs", "CP852" }, { "cs_CZ", "CP852" }, { "da", "CP865" }, /* not CP850 ?? */ { "da_DK", "CP865" }, /* not CP850 ?? */ { "de", "CP850" }, { "de_AT", "CP850" }, { "de_CH", "CP850" }, { "de_DE", "CP850" }, { "el", "CP869" }, { "el_GR", "CP869" }, { "en", "CP850" }, { "en_AU", "CP850" }, /* not CP437 ?? */ { "en_CA", "CP850" }, { "en_GB", "CP850" }, { "en_NZ", "CP437" }, { "en_US", "CP437" }, { "en_ZA", "CP850" }, /* not CP437 ?? */ { "eo", "CP850" }, { "eo_EO", "CP850" }, { "es", "CP850" }, { "es_AR", "CP850" }, { "es_BO", "CP850" }, { "es_CL", "CP850" }, { "es_CO", "CP850" }, { "es_CR", "CP850" }, { "es_CU", "CP850" }, { "es_DO", "CP850" }, { "es_EC", "CP850" }, { "es_ES", "CP850" }, { "es_GT", "CP850" }, { "es_HN", "CP850" }, { "es_MX", "CP850" }, { "es_NI", "CP850" }, { "es_PA", "CP850" }, { "es_PE", "CP850" }, { "es_PY", "CP850" }, { "es_SV", "CP850" }, { "es_UY", "CP850" }, { "es_VE", "CP850" }, { "et", "CP850" }, { "et_EE", "CP850" }, { "eu", "CP850" }, { "eu_ES", "CP850" }, { "fi", "CP850" }, { "fi_FI", "CP850" }, { "fr", "CP850" }, { "fr_BE", "CP850" }, { "fr_CA", "CP850" }, { "fr_CH", "CP850" }, { "fr_FR", "CP850" }, { "ga", "CP850" }, { "ga_IE", "CP850" }, { "gd", "CP850" }, { "gd_GB", "CP850" }, { "gl", "CP850" }, { "gl_ES", "CP850" }, { "he", "CP862" }, { "he_IL", "CP862" }, { "hr", "CP852" }, { "hr_HR", "CP852" }, { "hu", "CP852" }, { "hu_HU", "CP852" }, { "id", "CP850" }, /* not CP437 ?? */ { "id_ID", "CP850" }, /* not CP437 ?? */ { "is", "CP861" }, /* not CP850 ?? */ { "is_IS", "CP861" }, /* not CP850 ?? */ { "it", "CP850" }, { "it_CH", "CP850" }, { "it_IT", "CP850" }, { "ja", "CP932" }, { "ja_JP", "CP932" }, { "kr", "CP949" }, /* not CP934 ?? */ { "kr_KR", "CP949" }, /* not CP934 ?? */ { "lt", "CP775" }, { "lt_LT", "CP775" }, { "lv", "CP775" }, { "lv_LV", "CP775" }, { "mk", "CP866" }, /* not CP855 ?? */ { "mk_MK", "CP866" }, /* not CP855 ?? */ { "mt", "CP850" }, { "mt_MT", "CP850" }, { "nb", "CP865" }, /* not CP850 ?? */ { "nb_NO", "CP865" }, /* not CP850 ?? */ { "nl", "CP850" }, { "nl_BE", "CP850" }, { "nl_NL", "CP850" }, { "nn", "CP865" }, /* not CP850 ?? */ { "nn_NO", "CP865" }, /* not CP850 ?? */ { "no", "CP865" }, /* not CP850 ?? */ { "no_NO", "CP865" }, /* not CP850 ?? */ { "pl", "CP852" }, { "pl_PL", "CP852" }, { "pt", "CP850" }, { "pt_BR", "CP850" }, { "pt_PT", "CP850" }, { "ro", "CP852" }, { "ro_RO", "CP852" }, { "ru", "CP866" }, { "ru_RU", "CP866" }, { "sk", "CP852" }, { "sk_SK", "CP852" }, { "sl", "CP852" }, { "sl_SI", "CP852" }, { "sq", "CP852" }, { "sq_AL", "CP852" }, { "sr", "CP852" }, /* CP852 or CP866 or CP855 ?? */ { "sr_CS", "CP852" }, /* CP852 or CP866 or CP855 ?? */ { "sr_YU", "CP852" }, /* CP852 or CP866 or CP855 ?? */ { "sv", "CP850" }, { "sv_SE", "CP850" }, { "th", "CP874" }, { "th_TH", "CP874" }, { "tr", "CP857" }, { "tr_TR", "CP857" }, { "uk", "CP1125" }, { "uk_UA", "CP1125" }, { "zh_CN", "GBK" }, { "zh_TW", "CP950" } /* not CP938 ?? */ # define locale_table_defined # endif # ifndef locale_table_defined /* Just a dummy entry, to avoid a C syntax error. */ { "", "" } # endif }; #endif /* Determine the current locale's character encoding, and canonicalize it into one of the canonical names listed below. The result must not be freed; it is statically allocated. The result becomes invalid when setlocale() is used to change the global locale, or when the value of one of the environment variables LC_ALL, LC_CTYPE, LANG is changed; threads in multithreaded programs should not do this. If the canonical name cannot be determined, the result is a non-canonical name. */ #ifdef STATIC STATIC #endif const char * locale_charset (void) { const char *codeset; /* This function must be multithread-safe. To achieve this without using thread-local storage, we use a simple strcpy or memcpy to fill this static buffer. Filling it through, for example, strcpy + strcat would not be guaranteed to leave the buffer's contents intact if another thread is currently accessing it. If necessary, the contents is first assembled in a stack-allocated buffer. */ #if HAVE_LANGINFO_CODESET || defined WINDOWS_NATIVE || defined OS2 # if HAVE_LANGINFO_CODESET /* Most systems support nl_langinfo (CODESET) nowadays. */ codeset = nl_langinfo (CODESET); # ifdef __CYGWIN__ /* Cygwin < 1.7 does not have locales. nl_langinfo (CODESET) always returns "US-ASCII". Return the suffix of the locale name from the environment variables (if present) or the codepage as a number. */ if (codeset != NULL && strcmp (codeset, "US-ASCII") == 0) { const char *locale; static char resultbuf[2 + 10 + 1]; locale = getenv ("LC_ALL"); if (locale == NULL || locale[0] == '\0') { locale = getenv ("LC_CTYPE"); if (locale == NULL || locale[0] == '\0') locale = getenv ("LANG"); } if (locale != NULL && locale[0] != '\0') { /* If the locale name contains an encoding after the dot, return it. */ const char *dot = strchr (locale, '.'); if (dot != NULL) { const char *modifier; dot++; /* Look for the possible @... trailer and remove it, if any. */ modifier = strchr (dot, '@'); if (modifier == NULL) return dot; if (modifier - dot < sizeof (resultbuf)) { /* This way of filling resultbuf is multithread-safe. */ memcpy (resultbuf, dot, modifier - dot); resultbuf [modifier - dot] = '\0'; return resultbuf; } } } /* The Windows API has a function returning the locale's codepage as a number: GetACP(). This encoding is used by Cygwin, unless the user has set the environment variable CYGWIN=codepage:oem (which very few people do). Output directed to console windows needs to be converted (to GetOEMCP() if the console is using a raster font, or to GetConsoleOutputCP() if it is using a TrueType font). Cygwin does this conversion transparently (see winsup/cygwin/fhandler_console.cc), converting to GetConsoleOutputCP(). This leads to correct results, except when SetConsoleOutputCP has been called and a raster font is in use. */ { char buf[2 + 10 + 1]; sprintf (buf, "CP%u", GetACP ()); strcpy (resultbuf, buf); codeset = resultbuf; } } # endif if (codeset == NULL) /* The canonical name cannot be determined. */ codeset = ""; # elif defined WINDOWS_NATIVE char buf[2 + 10 + 1]; static char resultbuf[2 + 10 + 1]; /* The Windows API has a function returning the locale's codepage as a number, but the value doesn't change according to what the 'setlocale' call specified. So we use it as a last resort, in case the string returned by 'setlocale' doesn't specify the codepage. */ char *current_locale = setlocale (LC_CTYPE, NULL); char *pdot = strrchr (current_locale, '.'); if (pdot && 2 + strlen (pdot + 1) + 1 <= sizeof (buf)) sprintf (buf, "CP%s", pdot + 1); else { /* The Windows API has a function returning the locale's codepage as a number: GetACP(). When the output goes to a console window, it needs to be provided in GetOEMCP() encoding if the console is using a raster font, or in GetConsoleOutputCP() encoding if it is using a TrueType font. But in GUI programs and for output sent to files and pipes, GetACP() encoding is the best bet. */ sprintf (buf, "CP%u", GetACP ()); } /* For a locale name such as "French_France.65001", in Windows 10, setlocale now returns "French_France.utf8" instead. */ if (strcmp (buf + 2, "65001") == 0 || strcmp (buf + 2, "utf8") == 0) codeset = "UTF-8"; else { strcpy (resultbuf, buf); codeset = resultbuf; } # elif defined OS2 const char *locale; static char resultbuf[2 + 10 + 1]; ULONG cp[3]; ULONG cplen; codeset = NULL; /* Allow user to override the codeset, as set in the operating system, with standard language environment variables. */ locale = getenv ("LC_ALL"); if (locale == NULL || locale[0] == '\0') { locale = getenv ("LC_CTYPE"); if (locale == NULL || locale[0] == '\0') locale = getenv ("LANG"); } if (locale != NULL && locale[0] != '\0') { /* If the locale name contains an encoding after the dot, return it. */ const char *dot = strchr (locale, '.'); if (dot != NULL) { const char *modifier; dot++; /* Look for the possible @... trailer and remove it, if any. */ modifier = strchr (dot, '@'); if (modifier == NULL) return dot; if (modifier - dot < sizeof (resultbuf)) { /* This way of filling resultbuf is multithread-safe. */ memcpy (resultbuf, dot, modifier - dot); resultbuf [modifier - dot] = '\0'; return resultbuf; } } /* For the POSIX locale, don't use the system's codepage. */ if (strcmp (locale, "C") == 0 || strcmp (locale, "POSIX") == 0) codeset = ""; } if (codeset == NULL) { /* OS/2 has a function returning the locale's codepage as a number. */ if (DosQueryCp (sizeof (cp), cp, &cplen)) codeset = ""; else { char buf[2 + 10 + 1]; sprintf (buf, "CP%u", cp[0]); strcpy (resultbuf, buf); codeset = resultbuf; } } # else # error "Add code for other platforms here." # endif /* Resolve alias. */ { # ifdef alias_table_defined /* On some platforms, UTF-8 locales are the most frequently used ones. Speed up the common case and slow down the less common cases by testing for this case first. */ # if defined __OpenBSD__ || (defined __APPLE__ && defined __MACH__) || defined __sun || defined __CYGWIN__ if (strcmp (codeset, "UTF-8") == 0) goto done_table_lookup; else # endif { const struct table_entry * const table = alias_table; size_t const table_size = sizeof (alias_table) / sizeof (struct table_entry); /* The table is sorted. Perform a binary search. */ size_t hi = table_size; size_t lo = 0; while (lo < hi) { /* Invariant: for i < lo, strcmp (table[i].alias, codeset) < 0, for i >= hi, strcmp (table[i].alias, codeset) > 0. */ size_t mid = (hi + lo) >> 1; /* >= lo, < hi */ int cmp = strcmp (table[mid].alias, codeset); if (cmp < 0) lo = mid + 1; else if (cmp > 0) hi = mid; else { /* Found an i with strcmp (table[i].alias, codeset) == 0. */ codeset = table[mid].canonical; goto done_table_lookup; } } } if (0) done_table_lookup: ; else # endif { /* Did not find it in the table. */ /* On Mac OS X, all modern locales use the UTF-8 encoding. BeOS and Haiku have a single locale, and it has UTF-8 encoding. */ # if (defined __APPLE__ && defined __MACH__) || defined __BEOS__ || defined __HAIKU__ codeset = "UTF-8"; # else /* Don't return an empty string. GNU libc and GNU libiconv interpret the empty string as denoting "the locale's character encoding", thus GNU libiconv would call this function a second time. */ if (codeset[0] == '\0') codeset = "ASCII"; # endif } } #else /* On old systems which lack it, use setlocale or getenv. */ const char *locale = NULL; /* But most old systems don't have a complete set of locales. Some (like DJGPP) have only the C locale. Therefore we don't use setlocale here; it would return "C" when it doesn't support the locale name the user has set. */ # if 0 locale = setlocale (LC_CTYPE, NULL); # endif if (locale == NULL || locale[0] == '\0') { locale = getenv ("LC_ALL"); if (locale == NULL || locale[0] == '\0') { locale = getenv ("LC_CTYPE"); if (locale == NULL || locale[0] == '\0') locale = getenv ("LANG"); if (locale == NULL) locale = ""; } } /* Map locale name to canonical encoding name. */ { # ifdef locale_table_defined const struct table_entry * const table = locale_table; size_t const table_size = sizeof (locale_table) / sizeof (struct table_entry); /* The table is sorted. Perform a binary search. */ size_t hi = table_size; size_t lo = 0; while (lo < hi) { /* Invariant: for i < lo, strcmp (table[i].locale, locale) < 0, for i >= hi, strcmp (table[i].locale, locale) > 0. */ size_t mid = (hi + lo) >> 1; /* >= lo, < hi */ int cmp = strcmp (table[mid].locale, locale); if (cmp < 0) lo = mid + 1; else if (cmp > 0) hi = mid; else { /* Found an i with strcmp (table[i].locale, locale) == 0. */ codeset = table[mid].canonical; goto done_table_lookup; } } if (0) done_table_lookup: ; else # endif { /* Did not find it in the table. */ /* On Mac OS X, all modern locales use the UTF-8 encoding. BeOS and Haiku have a single locale, and it has UTF-8 encoding. */ # if (defined __APPLE__ && defined __MACH__) || defined __BEOS__ || defined __HAIKU__ codeset = "UTF-8"; # else /* The canonical name cannot be determined. */ /* Don't return an empty string. GNU libc and GNU libiconv interpret the empty string as denoting "the locale's character encoding", thus GNU libiconv would call this function a second time. */ codeset = "ASCII"; # endif } } #endif #ifdef DARWIN7 /* Mac OS X sets MB_CUR_MAX to 1 when LC_ALL=C, and "UTF-8" (the default codeset) does not work when MB_CUR_MAX is 1. */ if (strcmp (codeset, "UTF-8") == 0 && MB_CUR_MAX_L (uselocale (NULL)) <= 1) codeset = "ASCII"; #endif return codeset; } pspp-1.4.1/gl/strings.in.h0000644000175000017500000000765713723215640015006 0ustar00blpblp00000000000000/* A substitute . Copyright (C) 2007-2020 Free Software Foundation, Inc. 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 3, 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, see . */ #ifndef _@GUARD_PREFIX@_STRINGS_H #if __GNUC__ >= 3 @PRAGMA_SYSTEM_HEADER@ #endif @PRAGMA_COLUMNS@ /* Minix 3.1.8 has a bug: must be included before . But avoid namespace pollution on glibc systems. */ #if defined __minix && !defined __GLIBC__ # include #endif /* The include_next requires a split double-inclusion guard. */ #if @HAVE_STRINGS_H@ # @INCLUDE_NEXT@ @NEXT_STRINGS_H@ #endif #ifndef _@GUARD_PREFIX@_STRINGS_H #define _@GUARD_PREFIX@_STRINGS_H #if ! @HAVE_DECL_STRNCASECMP@ /* Get size_t. */ # include #endif /* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */ /* The definition of _GL_ARG_NONNULL is copied here. */ /* The definition of _GL_WARN_ON_USE is copied here. */ #ifdef __cplusplus extern "C" { #endif /* Find the index of the least-significant set bit. */ #if @GNULIB_FFS@ # if !@HAVE_FFS@ _GL_FUNCDECL_SYS (ffs, int, (int i)); # endif _GL_CXXALIAS_SYS (ffs, int, (int i)); _GL_CXXALIASWARN (ffs); #elif defined GNULIB_POSIXCHECK # undef ffs # if HAVE_RAW_DECL_FFS _GL_WARN_ON_USE (ffs, "ffs is not portable - use the ffs module"); # endif #endif /* Compare strings S1 and S2, ignoring case, returning less than, equal to or greater than zero if S1 is lexicographically less than, equal to or greater than S2. Note: This function does not work in multibyte locales. */ #if ! @HAVE_STRCASECMP@ extern int strcasecmp (char const *s1, char const *s2) _GL_ARG_NONNULL ((1, 2)); #endif #if defined GNULIB_POSIXCHECK /* strcasecmp() does not work with multibyte strings: POSIX says that it operates on "strings", and "string" in POSIX is defined as a sequence of bytes, not of characters. */ # undef strcasecmp # if HAVE_RAW_DECL_STRCASECMP _GL_WARN_ON_USE (strcasecmp, "strcasecmp cannot work correctly on character " "strings in multibyte locales - " "use mbscasecmp if you care about " "internationalization, or use c_strcasecmp , " "gnulib module c-strcase) if you want a locale " "independent function"); # endif #endif /* Compare no more than N bytes of strings S1 and S2, ignoring case, returning less than, equal to or greater than zero if S1 is lexicographically less than, equal to or greater than S2. Note: This function cannot work correctly in multibyte locales. */ #if ! @HAVE_DECL_STRNCASECMP@ extern int strncasecmp (char const *s1, char const *s2, size_t n) _GL_ARG_NONNULL ((1, 2)); #endif #if defined GNULIB_POSIXCHECK /* strncasecmp() does not work with multibyte strings: POSIX says that it operates on "strings", and "string" in POSIX is defined as a sequence of bytes, not of characters. */ # undef strncasecmp # if HAVE_RAW_DECL_STRNCASECMP _GL_WARN_ON_USE (strncasecmp, "strncasecmp cannot work correctly on character " "strings in multibyte locales - " "use mbsncasecmp or mbspcasecmp if you care about " "internationalization, or use c_strncasecmp , " "gnulib module c-strcase) if you want a locale " "independent function"); # endif #endif #ifdef __cplusplus } #endif #endif /* _@GUARD_PREFIX@_STRING_H */ #endif /* _@GUARD_PREFIX@_STRING_H */ pspp-1.4.1/gl/lc-charset-dispatch.h0000644000175000017500000000255113723215637016524 0ustar00blpblp00000000000000/* Dispatching based on the current locale's character encoding. Copyright (C) 2018-2020 Free Software Foundation, Inc. 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 3 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, see . */ /* Written by Bruno Haible , 2018. */ #include #if GNULIB_defined_mbstate_t /* A classification of special values of the encoding of the current locale. */ typedef enum { enc_other, /* other */ enc_utf8, /* UTF-8 */ enc_eucjp, /* EUC-JP */ enc_94, /* EUC-KR, GB2312, BIG5 */ enc_euctw, /* EUC-TW */ enc_gb18030, /* GB18030 */ enc_sjis /* SJIS */ } enc_t; /* Returns a classification of special values of the encoding of the current locale. */ extern enc_t locale_encoding_classification (void); #endif pspp-1.4.1/gl/floor.c0000644000175000017500000000645013723215636014017 0ustar00blpblp00000000000000/* Round towards negative infinity. Copyright (C) 2007, 2010-2020 Free Software Foundation, Inc. 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 3 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, see . */ /* Written by Bruno Haible , 2007. */ #if ! defined USE_LONG_DOUBLE # include #endif /* Specification. */ #include #include #ifdef USE_LONG_DOUBLE # define FUNC floorl # define DOUBLE long double # define MANT_DIG LDBL_MANT_DIG # define L_(literal) literal##L #elif ! defined USE_FLOAT # define FUNC floor # define DOUBLE double # define MANT_DIG DBL_MANT_DIG # define L_(literal) literal #else /* defined USE_FLOAT */ # define FUNC floorf # define DOUBLE float # define MANT_DIG FLT_MANT_DIG # define L_(literal) literal##f #endif /* MSVC with option -fp:strict refuses to compile constant initializers that contain floating-point operations. Pacify this compiler. */ #ifdef _MSC_VER # pragma fenv_access (off) #endif /* 2^(MANT_DIG-1). */ static const DOUBLE TWO_MANT_DIG = /* Assume MANT_DIG <= 5 * 31. Use the identity n = floor(n/5) + floor((n+1)/5) + ... + floor((n+4)/5). */ (DOUBLE) (1U << ((MANT_DIG - 1) / 5)) * (DOUBLE) (1U << ((MANT_DIG - 1 + 1) / 5)) * (DOUBLE) (1U << ((MANT_DIG - 1 + 2) / 5)) * (DOUBLE) (1U << ((MANT_DIG - 1 + 3) / 5)) * (DOUBLE) (1U << ((MANT_DIG - 1 + 4) / 5)); DOUBLE FUNC (DOUBLE x) { /* The use of 'volatile' guarantees that excess precision bits are dropped at each addition step and before the following comparison at the caller's site. It is necessary on x86 systems where double-floats are not IEEE compliant by default, to avoid that the results become platform and compiler option dependent. 'volatile' is a portable alternative to gcc's -ffloat-store option. */ volatile DOUBLE y = x; volatile DOUBLE z = y; if (z > L_(0.0)) { /* For 0 < x < 1, return +0.0 even if the current rounding mode is FE_DOWNWARD. */ if (z < L_(1.0)) z = L_(0.0); /* Avoid rounding errors for values near 2^k, where k >= MANT_DIG-1. */ else if (z < TWO_MANT_DIG) { /* Round to the next integer (nearest or up or down, doesn't matter). */ z += TWO_MANT_DIG; z -= TWO_MANT_DIG; /* Enforce rounding down. */ if (z > y) z -= L_(1.0); } } else if (z < L_(0.0)) { /* Avoid rounding errors for values near -2^k, where k >= MANT_DIG-1. */ if (z > - TWO_MANT_DIG) { /* Round to the next integer (nearest or up or down, doesn't matter). */ z -= TWO_MANT_DIG; z += TWO_MANT_DIG; /* Enforce rounding down. */ if (z > y) z -= L_(1.0); } } return z; } pspp-1.4.1/gl/attribute.h0000644000175000017500000002012313723215636014677 0ustar00blpblp00000000000000/* ATTRIBUTE_* macros for using attributes in GCC and similar compilers Copyright 2020 Free Software Foundation, Inc. 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 3 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, see . */ /* Written by Paul Eggert. */ /* Provide public ATTRIBUTE_* names for the private _GL_ATTRIBUTE_* macros used within Gnulib. */ /* These attributes can be placed in two ways: - At the start of a declaration (i.e. even before storage-class specifiers!); then they apply to all entities that are declared by the declaration. - Immediately after the name of an entity being declared by the declaration; then they apply to that entity only. */ #ifndef _GL_ATTRIBUTE_H #define _GL_ATTRIBUTE_H /* This file defines two types of attributes: * C2X standard attributes. These have macro names that do not begin with 'ATTRIBUTE_'. * Selected GCC attributes; see: https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html https://gcc.gnu.org/onlinedocs/gcc/Common-Variable-Attributes.html https://gcc.gnu.org/onlinedocs/gcc/Common-Type-Attributes.html These names begin with 'ATTRIBUTE_' to avoid name clashes. */ /* =============== Attributes for specific kinds of functions =============== */ /* Attributes for functions that should not be used. */ /* Warn if the entity is used. */ /* Applies to: - function, variable, - struct, union, struct/union member, - enumeration, enumeration item, - typedef, in C++ also: namespace, class, template specialization. */ #define DEPRECATED _GL_ATTRIBUTE_DEPRECATED /* If a function call is not optimized way, warn with MSG. */ /* Applies to: functions. */ #define ATTRIBUTE_WARNING(msg) _GL_ATTRIBUTE_WARNING (msg) /* If a function call is not optimized way, report an error with MSG. */ /* Applies to: functions. */ #define ATTRIBUTE_ERROR(msg) _GL_ATTRIBUTE_ERROR (msg) /* Attributes for memory-allocating functions. */ /* The function returns a pointer to freshly allocated memory. */ /* Applies to: functions. */ #define ATTRIBUTE_MALLOC _GL_ATTRIBUTE_MALLOC /* ATTRIBUTE_ALLOC_SIZE ((N)) - The Nth argument of the function is the size of the returned memory block. ATTRIBUTE_ALLOC_SIZE ((M, N)) - Multiply the Mth and Nth arguments to determine the size of the returned memory block. */ /* Applies to: function, pointer to function, function types. */ #define ATTRIBUTE_ALLOC_SIZE(args) _GL_ATTRIBUTE_ALLOC_SIZE (args) /* Attributes for variadic functions. */ /* The variadic function expects a trailing NULL argument. ATTRIBUTE_SENTINEL () - The last argument is NULL. ATTRIBUTE_SENTINEL ((N)) - The (N+1)st argument from the end is NULL. */ /* Applies to: functions. */ #define ATTRIBUTE_SENTINEL(pos) _GL_ATTRIBUTE_SENTINEL (pos) /* ================== Attributes for compiler diagnostics ================== */ /* Attributes that help the compiler diagnose programmer mistakes. Some of them may also help for some compiler optimizations. */ /* ATTRIBUTE_FORMAT ((ARCHETYPE, STRING-INDEX, FIRST-TO-CHECK)) - The STRING-INDEXth function argument is a format string of style ARCHETYPE, which is one of: printf, gnu_printf scanf, gnu_scanf, strftime, gnu_strftime, strfmon, or the same thing prefixed and suffixed with '__'. If FIRST-TO-CHECK is not 0, arguments starting at FIRST-TO_CHECK are suitable for the format string. */ /* Applies to: functions. */ #define ATTRIBUTE_FORMAT(spec) _GL_ATTRIBUTE_FORMAT (spec) /* ATTRIBUTE_NONNULL ((N1, N2,...)) - Arguments N1, N2,... must not be NULL. ATTRIBUTE_NONNULL () - All pointer arguments must not be null. */ /* Applies to: functions. */ #define ATTRIBUTE_NONNULL(args) _GL_ATTRIBUTE_NONNULL (args) /* The function's return value is a non-NULL pointer. */ /* Applies to: functions. */ #define ATTRIBUTE_RETURNS_NONNULL _GL_ATTRIBUTE_RETURNS_NONNULL /* Warn if the caller does not use the return value, unless the caller uses something like ignore_value. */ /* Applies to: function, enumeration, class. */ #define NODISCARD _GL_ATTRIBUTE_NODISCARD /* Attributes that disable false alarms when the compiler diagnoses programmer "mistakes". */ /* Do not warn if the entity is not used. */ /* Applies to: - function, variable, - struct, union, struct/union member, - enumeration, enumeration item, - typedef, in C++ also: class. */ #define MAYBE_UNUSED _GL_ATTRIBUTE_MAYBE_UNUSED /* The contents of a character array is not meant to be NUL-terminated. */ /* Applies to: struct/union members and variables that are arrays of element type '[[un]signed] char'. */ #define ATTRIBUTE_NONSTRING _GL_ATTRIBUTE_NONSTRING /* Do not warn if control flow falls through to the immediately following 'case' or 'default' label. */ /* Applies to: Empty statement (;), inside a 'switch' statement. */ #define FALLTHROUGH _GL_ATTRIBUTE_FALLTHROUGH /* ================== Attributes for debugging information ================== */ /* Attributes regarding debugging information emitted by the compiler. */ /* Omit the function from stack traces when debugging. */ /* Applies to: function. */ #define ATTRIBUTE_ARTIFICIAL _GL_ATTRIBUTE_ARTIFICIAL /* Make the entity visible to debuggers etc., even with '-fwhole-program'. */ /* Applies to: functions, variables. */ #define ATTRIBUTE_EXTERNALLY_VISIBLE _GL_ATTRIBUTE_EXTERNALLY_VISIBLE /* ========== Attributes that mainly direct compiler optimizations ========== */ /* The function does not throw exceptions. */ /* Applies to: functions. */ #define ATTRIBUTE_NOTHROW _GL_ATTRIBUTE_NOTHROW /* Do not inline the function. */ /* Applies to: functions. */ #define ATTRIBUTE_NOINLINE _GL_ATTRIBUTE_NOINLINE /* Always inline the function, and report an error if the compiler cannot inline. */ /* Applies to: function. */ #define ATTRIBUTE_ALWAYS_INLINE _GL_ATTRIBUTE_ALWAYS_INLINE /* The function does not affect observable state, and always returns a value. Compilers can omit duplicate calls with the same arguments if observable state is not changed between calls. (This attribute is looser than ATTRIBUTE_CONST.) */ /* Applies to: functions. */ #define ATTRIBUTE_PURE _GL_ATTRIBUTE_PURE /* The function neither depends on nor affects observable state, and always returns a value. Compilers can omit duplicate calls with the same arguments. (This attribute is stricter than ATTRIBUTE_PURE.) */ /* Applies to: functions. */ #define ATTRIBUTE_CONST _GL_ATTRIBUTE_CONST /* The function is rarely executed. */ /* Applies to: functions. */ #define ATTRIBUTE_COLD _GL_ATTRIBUTE_COLD /* If called from some other compilation unit, the function executes code from that unit only by return or by exception handling, letting the compiler optimize that unit more aggressively. */ /* Applies to: functions. */ #define ATTRIBUTE_LEAF _GL_ATTRIBUTE_LEAF /* For struct members: The member has the smallest possible alignment. For struct, union, class: All members have the smallest possible alignment, minimizing the memory required. */ /* Applies to: struct members, struct, union, in C++ also: class. */ #define ATTRIBUTE_PACKED _GL_ATTRIBUTE_PACKED /* ================ Attributes that make invalid code valid ================ */ /* Attributes that prevent fatal compiler optimizations for code that is not fully ISO C compliant. */ /* Pointers to the type may point to the same storage as pointers to other types, thus disabling strict aliasing optimization. */ /* Applies to: types. */ #define ATTRIBUTE_MAY_ALIAS _GL_ATTRIBUTE_MAY_ALIAS #endif /* _GL_ATTRIBUTE_H */ pspp-1.4.1/gl/stdio-impl.h0000644000175000017500000001743213723215640014761 0ustar00blpblp00000000000000/* Implementation details of FILE streams. Copyright (C) 2007-2008, 2010-2020 Free Software Foundation, Inc. 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 3 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, see . */ /* Many stdio implementations have the same logic and therefore can share the same implementation of stdio extension API, except that some fields have different naming conventions, or their access requires some casts. */ /* Glibc 2.28 made _IO_UNBUFFERED and _IO_IN_BACKUP private. For now, work around this problem by defining them ourselves. FIXME: Do not rely on glibc internals. */ #if defined _IO_EOF_SEEN # if !defined _IO_UNBUFFERED # define _IO_UNBUFFERED 0x2 # endif # if !defined _IO_IN_BACKUP # define _IO_IN_BACKUP 0x100 # endif #endif /* BSD stdio derived implementations. */ #if defined __NetBSD__ /* NetBSD */ /* Get __NetBSD_Version__. */ # include #endif #include /* For detecting Plan9. */ #if defined __sferror || defined __DragonFly__ || defined __ANDROID__ /* FreeBSD, NetBSD, OpenBSD, DragonFly, Mac OS X, Cygwin, Minix 3, Android */ # if defined __DragonFly__ /* DragonFly */ /* See . */ # define fp_ ((struct { struct __FILE_public pub; \ struct { unsigned char *_base; int _size; } _bf; \ void *cookie; \ void *_close; \ void *_read; \ void *_seek; \ void *_write; \ struct { unsigned char *_base; int _size; } _ub; \ int _ur; \ unsigned char _ubuf[3]; \ unsigned char _nbuf[1]; \ struct { unsigned char *_base; int _size; } _lb; \ int _blksize; \ fpos_t _offset; \ /* More fields, not relevant here. */ \ } *) fp) /* See . */ # define _p pub._p # define _flags pub._flags # define _r pub._r # define _w pub._w # elif defined __ANDROID__ /* Android */ # ifdef __LP64__ # define _gl_flags_file_t int # else # define _gl_flags_file_t short # endif /* Up to this commit from 2015-10-12 the innards of FILE were public, and fp_ub could be defined like for OpenBSD, see and . After this commit, the innards of FILE are hidden. */ # define fp_ ((struct { unsigned char *_p; \ int _r; \ int _w; \ _gl_flags_file_t _flags; \ _gl_flags_file_t _file; \ struct { unsigned char *_base; size_t _size; } _bf; \ int _lbfsize; \ void *_cookie; \ void *_close; \ void *_read; \ void *_seek; \ void *_write; \ struct { unsigned char *_base; size_t _size; } _ext; \ unsigned char *_up; \ int _ur; \ unsigned char _ubuf[3]; \ unsigned char _nbuf[1]; \ struct { unsigned char *_base; size_t _size; } _lb; \ int _blksize; \ fpos_t _offset; \ /* More fields, not relevant here. */ \ } *) fp) # else # define fp_ fp # endif # if (defined __NetBSD__ && __NetBSD_Version__ >= 105270000) || defined __OpenBSD__ || defined __minix /* NetBSD >= 1.5ZA, OpenBSD, Minix 3 */ /* See and and */ struct __sfileext { struct __sbuf _ub; /* ungetc buffer */ /* More fields, not relevant here. */ }; # define fp_ub ((struct __sfileext *) fp->_ext._base)->_ub # elif defined __ANDROID__ /* Android */ struct __sfileext { struct { unsigned char *_base; size_t _size; } _ub; /* ungetc buffer */ /* More fields, not relevant here. */ }; # define fp_ub ((struct __sfileext *) fp_->_ext._base)->_ub # else /* FreeBSD, NetBSD <= 1.5Z, DragonFly, Mac OS X, Cygwin */ # define fp_ub fp_->_ub # endif # define HASUB(fp) (fp_ub._base != NULL) # if defined __ANDROID__ /* Android */ /* Needed after this commit from 2016-01-25 */ # ifndef __SEOF # define __SLBF 1 # define __SNBF 2 # define __SRD 4 # define __SWR 8 # define __SRW 0x10 # define __SEOF 0x20 # define __SERR 0x40 # endif # ifndef __SOFF # define __SOFF 0x1000 # endif # endif #endif /* SystemV derived implementations. */ #ifdef __TANDEM /* NonStop Kernel */ # ifndef _IOERR /* These values were determined by the program 'stdioext-flags' at . */ # define _IOERR 0x40 # define _IOREAD 0x80 # define _IOWRT 0x4 # define _IORW 0x100 # endif #endif #if defined _IOERR # if defined __sun && defined _LP64 /* Solaris/{SPARC,AMD64} 64-bit */ # define fp_ ((struct { unsigned char *_ptr; \ unsigned char *_base; \ unsigned char *_end; \ long _cnt; \ int _file; \ unsigned int _flag; \ } *) fp) # elif defined __VMS /* OpenVMS */ # define fp_ ((struct _iobuf *) fp) # else # define fp_ fp # endif # if defined _SCO_DS /* OpenServer */ # define _cnt __cnt # define _ptr __ptr # define _base __base # define _flag __flag # endif #elif defined _WIN32 && ! defined __CYGWIN__ /* newer Windows with MSVC */ /* does not define the innards of FILE any more. */ # define WINDOWS_OPAQUE_FILE struct _gl_real_FILE { /* Note: Compared to older Windows and to mingw, it has the fields _base and _cnt swapped. */ unsigned char *_ptr; unsigned char *_base; int _cnt; int _flag; int _file; int _charbuf; int _bufsiz; }; # define fp_ ((struct _gl_real_FILE *) fp) /* These values were determined by a program similar to the one at . */ # define _IOREAD 0x1 # define _IOWRT 0x2 # define _IORW 0x4 # define _IOEOF 0x8 # define _IOERR 0x10 #endif pspp-1.4.1/gl/unitypes.in.h0000644000175000017500000000406113723215640015157 0ustar00blpblp00000000000000/* Elementary types and macros for the GNU UniString library. Copyright (C) 2002, 2005-2006, 2009-2020 Free Software Foundation, Inc. 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 3 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, see . */ #ifndef _UNITYPES_H #define _UNITYPES_H /* Get uint8_t, uint16_t, uint32_t. */ #include /* Type representing a Unicode character. */ typedef uint32_t ucs4_t; /* Attribute of a function whose result depends only on the arguments (not pointers!) and which has no side effects. */ #ifndef _UC_ATTRIBUTE_CONST # if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 95) # define _UC_ATTRIBUTE_CONST __attribute__ ((__const__)) # else # define _UC_ATTRIBUTE_CONST # endif #endif /* Attribute of a function whose result depends only on the arguments (possibly pointers) and global memory, and which has no side effects. */ #ifndef _UC_ATTRIBUTE_PURE # if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 96) # define _UC_ATTRIBUTE_PURE __attribute__ ((__pure__)) # else # define _UC_ATTRIBUTE_PURE # endif #endif /* Qualifier in a function declaration, that asserts that the caller must pass a pointer to a different object in the specified pointer argument than in the other pointer arguments. */ #ifndef _UC_RESTRICT # if defined __restrict || 2 < __GNUC__ + (95 <= __GNUC_MINOR__) # define _UC_RESTRICT __restrict # elif 199901L <= __STDC_VERSION__ || defined restrict # define _UC_RESTRICT restrict # else # define _UC_RESTRICT # endif #endif #endif /* _UNITYPES_H */ pspp-1.4.1/gl/mbtowc-lock.h0000644000175000017500000000572213723215637015126 0ustar00blpblp00000000000000/* Use the internal lock used by mbrtowc and mbrtoc32. Copyright (C) 2019-2020 Free Software Foundation, Inc. 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 3 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, see . */ /* Written by Bruno Haible , 2019-2020. */ /* Use a lock, so that no two threads can invoke mbtowc at the same time. */ static inline int mbtowc_unlocked (wchar_t *pwc, const char *p, size_t m) { /* Put the hidden internal state of mbtowc into its initial state. This is needed at least with glibc, uClibc, and MSVC CRT. See . */ mbtowc (NULL, NULL, 0); return mbtowc (pwc, p, m); } /* Prohibit renaming this symbol. */ #undef gl_get_mbtowc_lock #if defined _WIN32 && !defined __CYGWIN__ extern __declspec(dllimport) CRITICAL_SECTION *gl_get_mbtowc_lock (void); static int mbtowc_with_lock (wchar_t *pwc, const char *p, size_t m) { CRITICAL_SECTION *lock = gl_get_mbtowc_lock (); int ret; EnterCriticalSection (lock); ret = mbtowc_unlocked (pwc, p, m); LeaveCriticalSection (lock); return ret; } #elif HAVE_PTHREAD_API /* AIX, IRIX, Cygwin */ extern # if defined _WIN32 || defined __CYGWIN__ __declspec(dllimport) # endif pthread_mutex_t *gl_get_mbtowc_lock (void); # if HAVE_WEAK_SYMBOLS /* IRIX */ /* Avoid the need to link with '-lpthread'. */ # pragma weak pthread_mutex_lock # pragma weak pthread_mutex_unlock /* Determine whether libpthread is in use. */ # pragma weak pthread_mutexattr_gettype /* See the comments in lock.h. */ # define pthread_in_use() \ (pthread_mutexattr_gettype != NULL || c11_threads_in_use ()) # else # define pthread_in_use() 1 # endif static int mbtowc_with_lock (wchar_t *pwc, const char *p, size_t m) { if (pthread_in_use()) { pthread_mutex_t *lock = gl_get_mbtowc_lock (); int ret; if (pthread_mutex_lock (lock)) abort (); ret = mbtowc_unlocked (pwc, p, m); if (pthread_mutex_unlock (lock)) abort (); return ret; } else return mbtowc_unlocked (pwc, p, m); } #elif HAVE_THREADS_H extern mtx_t *gl_get_mbtowc_lock (void); static int mbtowc_with_lock (wchar_t *pwc, const char *p, size_t m) { mtx_t *lock = gl_get_mbtowc_lock (); int ret; if (mtx_lock (lock) != thrd_success) abort (); ret = mbtowc_unlocked (pwc, p, m); if (mtx_unlock (lock) != thrd_success) abort (); return ret; } #endif pspp-1.4.1/gl/strsep.c0000644000175000017500000000261313723215640014206 0ustar00blpblp00000000000000/* Copyright (C) 2004, 2007, 2009-2020 Free Software Foundation, Inc. Written by Yoann Vandoorselaere . 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 3, 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, see . */ #ifdef HAVE_CONFIG_H # include #endif /* Specification. */ #include char * strsep (char **stringp, const char *delim) { char *start = *stringp; char *ptr; if (start == NULL) return NULL; /* Optimize the case of no delimiters. */ if (delim[0] == '\0') { *stringp = NULL; return start; } /* Optimize the case of one delimiter. */ if (delim[1] == '\0') ptr = strchr (start, delim[0]); else /* The general case. */ ptr = strpbrk (start, delim); if (ptr == NULL) { *stringp = NULL; return start; } *ptr = '\0'; *stringp = ptr + 1; return start; } pspp-1.4.1/gl/safe-read.h0000644000175000017500000000343513723215640014525 0ustar00blpblp00000000000000/* An interface to read() that retries after interrupts. Copyright (C) 2002, 2006, 2009-2020 Free Software Foundation, Inc. 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 3 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, see . */ /* Some system calls may be interrupted and fail with errno = EINTR in the following situations: - The process is stopped and restarted (signal SIGSTOP and SIGCONT, user types Ctrl-Z) on some platforms: Mac OS X. - The process receives a signal for which a signal handler was installed with sigaction() with an sa_flags field that does not contain SA_RESTART. - The process receives a signal for which a signal handler was installed with signal() and for which no call to siginterrupt(sig,0) was done, on some platforms: AIX, HP-UX, IRIX, OSF/1, Solaris. This module provides a wrapper around read() that handles EINTR. */ #include #ifdef __cplusplus extern "C" { #endif #define SAFE_READ_ERROR ((size_t) -1) /* Read up to COUNT bytes at BUF from descriptor FD, retrying if interrupted. Return the actual number of bytes read, zero for EOF, or SAFE_READ_ERROR upon error. */ extern size_t safe_read (int fd, void *buf, size_t count); #ifdef __cplusplus } #endif pspp-1.4.1/gl/getopt1.c0000644000175000017500000000733113723215637014261 0ustar00blpblp00000000000000/* getopt_long and getopt_long_only entry points for GNU getopt. Copyright (C) 1987-2020 Free Software Foundation, Inc. This file is part of the GNU C Library and is also part of gnulib. Patches to this file should be submitted to both projects. The GNU C Library 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 3 of the License, or (at your option) any later version. The GNU C Library 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 the GNU C Library; if not, see . */ #ifndef _LIBC # include #endif #include "getopt.h" #include "getopt_int.h" int getopt_long (int argc, char *__getopt_argv_const *argv, const char *options, const struct option *long_options, int *opt_index) { return _getopt_internal (argc, (char **) argv, options, long_options, opt_index, 0, 0); } int _getopt_long_r (int argc, char **argv, const char *options, const struct option *long_options, int *opt_index, struct _getopt_data *d) { return _getopt_internal_r (argc, argv, options, long_options, opt_index, 0, d, 0); } /* Like getopt_long, but '-' as well as '--' can indicate a long option. If an option that starts with '-' (not '--') doesn't match a long option, but does match a short option, it is parsed as a short option instead. */ int getopt_long_only (int argc, char *__getopt_argv_const *argv, const char *options, const struct option *long_options, int *opt_index) { return _getopt_internal (argc, (char **) argv, options, long_options, opt_index, 1, 0); } int _getopt_long_only_r (int argc, char **argv, const char *options, const struct option *long_options, int *opt_index, struct _getopt_data *d) { return _getopt_internal_r (argc, argv, options, long_options, opt_index, 1, d, 0); } #ifdef TEST #include #include int main (int argc, char **argv) { int c; int digit_optind = 0; while (1) { int this_option_optind = optind ? optind : 1; int option_index = 0; static const struct option long_options[] = { {"add", 1, 0, 0}, {"append", 0, 0, 0}, {"delete", 1, 0, 0}, {"verbose", 0, 0, 0}, {"create", 0, 0, 0}, {"file", 1, 0, 0}, {0, 0, 0, 0} }; c = getopt_long (argc, argv, "abc:d:0123456789", long_options, &option_index); if (c == -1) break; switch (c) { case 0: printf ("option %s", long_options[option_index].name); if (optarg) printf (" with arg %s", optarg); printf ("\n"); break; case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': if (digit_optind != 0 && digit_optind != this_option_optind) printf ("digits occur in two different argv-elements.\n"); digit_optind = this_option_optind; printf ("option %c\n", c); break; case 'a': printf ("option a\n"); break; case 'b': printf ("option b\n"); break; case 'c': printf ("option c with value '%s'\n", optarg); break; case 'd': printf ("option d with value '%s'\n", optarg); break; case '?': break; default: printf ("?? getopt returned character code 0%o ??\n", c); } } if (optind < argc) { printf ("non-option ARGV-elements: "); while (optind < argc) printf ("%s ", argv[optind++]); printf ("\n"); } exit (0); } #endif /* TEST */ pspp-1.4.1/gl/c-ctype.c0000644000175000017500000000012213723215636014230 0ustar00blpblp00000000000000#include #define C_CTYPE_INLINE _GL_EXTERN_INLINE #include "c-ctype.h" pspp-1.4.1/gl/signbitd.c0000644000175000017500000000406713723215640014476 0ustar00blpblp00000000000000/* signbit() macro: Determine the sign bit of a floating-point number. Copyright (C) 2007-2020 Free Software Foundation, Inc. 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 3 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, see . */ #include /* Specification. */ #include #include #include "isnand-nolibm.h" #include "float+.h" #ifdef gl_signbitd_OPTIMIZED_MACRO # undef gl_signbitd #endif int gl_signbitd (double arg) { #if defined DBL_SIGNBIT_WORD && defined DBL_SIGNBIT_BIT /* The use of a union to extract the bits of the representation of a 'long double' is safe in practice, despite of the "aliasing rules" of C99, because the GCC docs say "Even with '-fstrict-aliasing', type-punning is allowed, provided the memory is accessed through the union type." and similarly for other compilers. */ # define NWORDS \ ((sizeof (double) + sizeof (unsigned int) - 1) / sizeof (unsigned int)) union { double value; unsigned int word[NWORDS]; } m; m.value = arg; return (m.word[DBL_SIGNBIT_WORD] >> DBL_SIGNBIT_BIT) & 1; #elif HAVE_COPYSIGN_IN_LIBC return copysign (1.0, arg) < 0; #else /* This does not do the right thing for NaN, but this is irrelevant for most use cases. */ if (isnand (arg)) return 0; if (arg < 0.0) return 1; else if (arg == 0.0) { /* Distinguish 0.0 and -0.0. */ static double plus_zero = 0.0; double arg_mem = arg; return (memcmp (&plus_zero, &arg_mem, SIZEOF_DBL) != 0); } else return 0; #endif } pspp-1.4.1/gl/xsize.c0000644000175000017500000000011613723215640014024 0ustar00blpblp00000000000000#include #define XSIZE_INLINE _GL_EXTERN_INLINE #include "xsize.h" pspp-1.4.1/gl/memchr2.valgrind0000644000175000017500000000212313723215637015611 0ustar00blpblp00000000000000# Suppress a valgrind message about use of uninitialized memory in memchr2(). # Copyright (C) 2009-2020 Free Software Foundation, Inc. # # 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 3 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, see . # Like memchr, it is safe to overestimate the length when the terminator # is guaranteed to be found. In this case, we may end up reading a word # that is partially uninitialized, but this use is OK for a speedup. { memchr2-value4 Memcheck:Value4 fun:memchr2 } { memchr2-value8 Memcheck:Value8 fun:memchr2 } pspp-1.4.1/gl/getpass.c0000644000175000017500000001214713723215637014345 0ustar00blpblp00000000000000/* Copyright (C) 1992-2001, 2003-2007, 2009-2020 Free Software Foundation, Inc. This file is part of the GNU C Library. 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 3, 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, see . */ #ifndef _LIBC # include #endif #include "getpass.h" #include #if !(defined _WIN32 && !defined __CYGWIN__) # include # if HAVE_DECL___FSETLOCKING && HAVE___FSETLOCKING # if HAVE_STDIO_EXT_H # include # endif # else # define __fsetlocking(stream, type) /* empty */ # endif # if HAVE_TERMIOS_H # include # endif # if USE_UNLOCKED_IO # include "unlocked-io.h" # else # if !HAVE_DECL_FFLUSH_UNLOCKED # undef fflush_unlocked # define fflush_unlocked(x) fflush (x) # endif # if !HAVE_DECL_FLOCKFILE # undef flockfile # define flockfile(x) ((void) 0) # endif # if !HAVE_DECL_FUNLOCKFILE # undef funlockfile # define funlockfile(x) ((void) 0) # endif # if !HAVE_DECL_FPUTS_UNLOCKED # undef fputs_unlocked # define fputs_unlocked(str,stream) fputs (str, stream) # endif # if !HAVE_DECL_PUTC_UNLOCKED # undef putc_unlocked # define putc_unlocked(c,stream) putc (c, stream) # endif # endif /* It is desirable to use this bit on systems that have it. The only bit of terminal state we want to twiddle is echoing, which is done in software; there is no need to change the state of the terminal hardware. */ # ifndef TCSASOFT # define TCSASOFT 0 # endif static void call_fclose (void *arg) { if (arg != NULL) fclose (arg); } char * getpass (const char *prompt) { FILE *tty; FILE *in, *out; # if HAVE_TCGETATTR struct termios s, t; # endif bool tty_changed = false; static char *buf; static size_t bufsize; ssize_t nread; /* Try to write to and read from the terminal if we can. If we can't open the terminal, use stderr and stdin. */ tty = fopen ("/dev/tty", "w+e"); if (tty == NULL) { in = stdin; out = stderr; } else { /* We do the locking ourselves. */ __fsetlocking (tty, FSETLOCKING_BYCALLER); out = in = tty; } flockfile (out); /* Turn echoing off if it is on now. */ # if HAVE_TCGETATTR if (tcgetattr (fileno (in), &t) == 0) { /* Save the old one. */ s = t; /* Tricky, tricky. */ t.c_lflag &= ~(ECHO | ISIG); tty_changed = (tcsetattr (fileno (in), TCSAFLUSH | TCSASOFT, &t) == 0); } # endif /* Write the prompt. */ fputs_unlocked (prompt, out); fflush_unlocked (out); /* Read the password. */ nread = getline (&buf, &bufsize, in); /* According to the C standard, input may not be followed by output on the same stream without an intervening call to a file positioning function. Suppose in == out; then without this fseek call, on Solaris, HP-UX, AIX, OSF/1, the previous input gets echoed, whereas on IRIX, the following newline is not output as it should be. POSIX imposes similar restrictions if fileno (in) == fileno (out). The POSIX restrictions are tricky and change from POSIX version to POSIX version, so play it safe and invoke fseek even if in != out. */ fseeko (out, 0, SEEK_CUR); if (buf != NULL) { if (nread < 0) buf[0] = '\0'; else if (buf[nread - 1] == '\n') { /* Remove the newline. */ buf[nread - 1] = '\0'; if (tty_changed) { /* Write the newline that was not echoed. */ putc_unlocked ('\n', out); } } } /* Restore the original setting. */ # if HAVE_TCSETATTR if (tty_changed) tcsetattr (fileno (in), TCSAFLUSH | TCSASOFT, &s); # endif funlockfile (out); call_fclose (tty); return buf; } #else /* W32 native */ /* Windows implementation by Martin Lambers , improved by Simon Josefsson. */ /* For PASS_MAX. */ # include /* For _getch(). */ # include /* For strdup(). */ # include # ifndef PASS_MAX # define PASS_MAX 512 # endif char * getpass (const char *prompt) { char getpassbuf[PASS_MAX + 1]; size_t i = 0; int c; if (prompt) { fputs (prompt, stderr); fflush (stderr); } for (;;) { c = _getch (); if (c == '\r') { getpassbuf[i] = '\0'; break; } else if (i < PASS_MAX) { getpassbuf[i++] = c; } if (i >= PASS_MAX) { getpassbuf[i] = '\0'; break; } } if (prompt) { fputs ("\r\n", stderr); fflush (stderr); } return strdup (getpassbuf); } #endif pspp-1.4.1/gl/gl_xlist.c0000644000175000017500000000012413723215637014514 0ustar00blpblp00000000000000#include #define GL_XLIST_INLINE _GL_EXTERN_INLINE #include "gl_xlist.h" pspp-1.4.1/gl/timespec.h0000644000175000017500000000536113723555203014511 0ustar00blpblp00000000000000/* timespec -- System time interface Copyright (C) 2000, 2002, 2004-2005, 2007, 2009-2020 Free Software Foundation, Inc. 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 3 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, see . */ #if ! defined TIMESPEC_H #define TIMESPEC_H #include #ifndef _GL_INLINE_HEADER_BEGIN #error "Please include config.h first." #endif _GL_INLINE_HEADER_BEGIN #ifndef _GL_TIMESPEC_INLINE # define _GL_TIMESPEC_INLINE _GL_INLINE #endif #ifdef __cplusplus extern "C" { #endif #include "arg-nonnull.h" /* Inverse resolution of timespec timestamps (in units per second), and log base 10 of the inverse resolution. */ enum { TIMESPEC_HZ = 1000000000 }; enum { LOG10_TIMESPEC_HZ = 9 }; /* Obsolescent names for backward compatibility. They are misnomers, because TIMESPEC_RESOLUTION is not a resolution. */ enum { TIMESPEC_RESOLUTION = TIMESPEC_HZ }; enum { LOG10_TIMESPEC_RESOLUTION = LOG10_TIMESPEC_HZ }; /* Return a timespec with seconds S and nanoseconds NS. */ _GL_TIMESPEC_INLINE struct timespec make_timespec (time_t s, long int ns) { struct timespec r; r.tv_sec = s; r.tv_nsec = ns; return r; } /* Return negative, zero, positive if A < B, A == B, A > B, respectively. */ _GL_TIMESPEC_INLINE int _GL_ATTRIBUTE_PURE timespec_cmp (struct timespec a, struct timespec b) { return 2 * _GL_CMP (a.tv_sec, b.tv_sec) + _GL_CMP (a.tv_nsec, b.tv_nsec); } /* Return -1, 0, 1, depending on the sign of A. A.tv_nsec must be nonnegative. */ _GL_TIMESPEC_INLINE int _GL_ATTRIBUTE_PURE timespec_sign (struct timespec a) { return _GL_CMP (a.tv_sec, 0) + (!a.tv_sec & !!a.tv_nsec); } struct timespec timespec_add (struct timespec, struct timespec) _GL_ATTRIBUTE_CONST; struct timespec timespec_sub (struct timespec, struct timespec) _GL_ATTRIBUTE_CONST; struct timespec dtotimespec (double) _GL_ATTRIBUTE_CONST; /* Return an approximation to A, of type 'double'. */ _GL_TIMESPEC_INLINE double timespectod (struct timespec a) { return a.tv_sec + a.tv_nsec / 1e9; } struct timespec current_timespec (void); void gettime (struct timespec *) _GL_ARG_NONNULL ((1)); int settime (struct timespec const *) _GL_ARG_NONNULL ((1)); #ifdef __cplusplus } #endif _GL_INLINE_HEADER_END #endif pspp-1.4.1/gl/localename-table.h0000644000175000017500000000553613723215637016075 0ustar00blpblp00000000000000/* Table that maps a locale object to the names of the locale categories. Copyright (C) 2018-2020 Free Software Foundation, Inc. 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 3 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, see . */ /* Written by Bruno Haible , 2018. */ #if HAVE_WORKING_USELOCALE && HAVE_NAMELESS_LOCALES # include # include # ifdef IN_LIBINTL # include "lock.h" # else # include "glthread/lock.h" # endif struct locale_categories_names { /* Locale category -> name (allocated with indefinite extent). */ const char *category_name[6]; }; /* A hash table of fixed size. Multiple threads can access it read-only simultaneously, but only one thread can insert into it or remove from it at the same time. This hash table has global scope, so that when an application uses both GNU libintl and gnulib, the application sees only one hash table. (When linking statically with libintl, the fact that localename-table.c is a separate compilation unit resolves the duplicate symbol conflict. When linking with libintl as a shared library, we rely on ELF and the symbol conflict resolution implemented in the ELF dynamic loader here.) Both the libintl overrides and the gnulib overrides of the functions newlocale, duplocale, freelocale see the same hash table (and the same lock). For this reason, the internal layout of the hash table and the hash function MUST NEVER CHANGE. If you need to change the internal layout or the hash function, introduce versioning by appending a version suffix to the symbols at the linker level. */ # define locale_hash_function libintl_locale_hash_function # define locale_hash_table libintl_locale_hash_table # define locale_lock libintl_locale_lock extern size_t _GL_ATTRIBUTE_CONST locale_hash_function (locale_t x); /* A node in a hash bucket collision list. */ struct locale_hash_node { struct locale_hash_node *next; locale_t locale; struct locale_categories_names names; }; # define LOCALE_HASH_TABLE_SIZE 101 extern struct locale_hash_node * locale_hash_table[LOCALE_HASH_TABLE_SIZE]; /* This lock protects the locale_hash_table against multiple simultaneous accesses (except that multiple simultaneous read accesses are allowed). */ gl_rwlock_define(extern, locale_lock) #endif pspp-1.4.1/gl/gl_anyhash1.h0000644000175000017500000000255213723215637015101 0ustar00blpblp00000000000000/* Hash table for sequential list, set, and map data type. Copyright (C) 2006, 2009-2020 Free Software Foundation, Inc. Written by Bruno Haible , 2006. 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 3 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, see . */ /* Common code of gl_linkedhash_list.c, gl_avltreehash_list.c, gl_rbtreehash_list.c, gl_linkedhash_set.c, gl_hash_set.c, gl_linkedhash_map.c, gl_hash_map.c. */ /* Hash table entry. */ struct gl_hash_entry { struct gl_hash_entry *hash_next; /* chain of entries in same bucket */ size_t hashcode; /* cache of the hash code of - the key (for map data type) or - the value (for list, set data types) */ }; typedef struct gl_hash_entry * gl_hash_entry_t; pspp-1.4.1/gl/windows-spin.c0000644000175000017500000000400713723215640015326 0ustar00blpblp00000000000000/* Spin locks (native Windows implementation). Copyright (C) 2019-2020 Free Software Foundation, Inc. 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 3, 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, see . */ /* Written by Bruno Haible , 2019. */ #include /* Specification. */ #include "windows-spin.h" #include void glwthread_spin_init (glwthread_spinlock_t *lock) { lock->word = 0; MemoryBarrier (); } int glwthread_spin_lock (glwthread_spinlock_t *lock) { /* Wait until lock->word becomes 0, then replace it with 1. */ /* InterlockedCompareExchange */ while (InterlockedCompareExchange (&lock->word, 1, 0)) ; return 0; } int glwthread_spin_trylock (glwthread_spinlock_t *lock) { /* If lock->word is 0, then replace it with 1. */ /* InterlockedCompareExchange */ if (InterlockedCompareExchange (&lock->word, 1, 0)) return EBUSY; return 0; } int glwthread_spin_unlock (glwthread_spinlock_t *lock) { /* If lock->word is 1, then replace it with 0. */ /* InterlockedCompareExchange */ if (!InterlockedCompareExchange (&lock->word, 0, 1)) return EINVAL; return 0; } int glwthread_spin_destroy (glwthread_spinlock_t *lock) { return 0; } pspp-1.4.1/gl/wctype.in.h0000644000175000017500000004357013723215640014622 0ustar00blpblp00000000000000/* A substitute for ISO C99 , for platforms that lack it. Copyright (C) 2006-2020 Free Software Foundation, Inc. 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 3, 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, see . */ /* Written by Bruno Haible and Paul Eggert. */ /* * ISO C 99 for platforms that lack it. * * * iswctype, towctrans, towlower, towupper, wctrans, wctype, * wctrans_t, and wctype_t are not yet implemented. */ #if __GNUC__ >= 3 @PRAGMA_SYSTEM_HEADER@ #endif @PRAGMA_COLUMNS@ #if (defined __MINGW32__ && defined __CTYPE_H_SOURCED__) /* Special invocation convention: - With MinGW 3.22, when includes , only some part of is being processed, which doesn't include the idempotency guard. */ #@INCLUDE_NEXT@ @NEXT_WCTYPE_H@ #else /* Normal invocation convention. */ #ifndef _@GUARD_PREFIX@_WCTYPE_H #if @HAVE_WINT_T@ /* Solaris 2.5 has a bug: must be included before . Tru64 with Desktop Toolkit C has a bug: must be included before . BSD/OS 4.0.1 has a bug: , and must be included before . */ # include # include # include # include #endif /* Native Windows (mingw, MSVC) have declarations of towupper, towlower, and isw* functions in , as well as in . Include , in advance to avoid rpl_ prefix being added to the declarations. */ #if defined _WIN32 && ! defined __CYGWIN__ # include # include #endif /* Include the original if it exists. BeOS 5 has the functions but no . */ /* The include_next requires a split double-inclusion guard. */ #if @HAVE_WCTYPE_H@ # @INCLUDE_NEXT@ @NEXT_WCTYPE_H@ #endif #ifndef _@GUARD_PREFIX@_WCTYPE_H #define _@GUARD_PREFIX@_WCTYPE_H #ifndef _GL_INLINE_HEADER_BEGIN #error "Please include config.h first." #endif _GL_INLINE_HEADER_BEGIN #ifndef _GL_WCTYPE_INLINE # define _GL_WCTYPE_INLINE _GL_INLINE #endif /* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */ /* The definition of _GL_WARN_ON_USE is copied here. */ /* Solaris 2.6 includes which includes which #defines a number of identifiers in the application namespace. Revert these #defines. */ #ifdef __sun # undef multibyte # undef eucw1 # undef eucw2 # undef eucw3 # undef scrw1 # undef scrw2 # undef scrw3 #endif /* Define wint_t and WEOF. (Also done in wchar.in.h.) */ #if !@HAVE_WINT_T@ && !defined wint_t # define wint_t int # ifndef WEOF # define WEOF -1 # endif #else /* mingw and MSVC define wint_t as 'unsigned short' in or . This is too small: ISO C 99 section 7.24.1.(2) says that wint_t must be "unchanged by default argument promotions". Override it. */ # if @GNULIB_OVERRIDES_WINT_T@ # if !GNULIB_defined_wint_t # if @HAVE_CRTDEFS_H@ # include # else # include # endif typedef unsigned int rpl_wint_t; # undef wint_t # define wint_t rpl_wint_t # define GNULIB_defined_wint_t 1 # endif # endif # ifndef WEOF # define WEOF ((wint_t) -1) # endif #endif #if !GNULIB_defined_wctype_functions /* FreeBSD 4.4 to 4.11 has but lacks the functions. Linux libc5 has and the functions but they are broken. mingw and MSVC have and the functions but they take a wchar_t as argument, not an rpl_wint_t. Assume all 11 functions (all isw* except iswblank) are implemented the same way, or not at all. */ # if ! @HAVE_ISWCNTRL@ || @REPLACE_ISWCNTRL@ # if @GNULIB_OVERRIDES_WINT_T@ /* implies @REPLACE_ISWCNTRL@ */ _GL_WCTYPE_INLINE int rpl_iswalnum (wint_t wc) { return ((wchar_t) wc == wc ? iswalnum ((wchar_t) wc) : 0); } _GL_WCTYPE_INLINE int rpl_iswalpha (wint_t wc) { return ((wchar_t) wc == wc ? iswalpha ((wchar_t) wc) : 0); } _GL_WCTYPE_INLINE int rpl_iswblank (wint_t wc) { return ((wchar_t) wc == wc ? iswblank ((wchar_t) wc) : 0); } _GL_WCTYPE_INLINE int rpl_iswcntrl (wint_t wc) { return ((wchar_t) wc == wc ? iswcntrl ((wchar_t) wc) : 0); } _GL_WCTYPE_INLINE int rpl_iswdigit (wint_t wc) { return ((wchar_t) wc == wc ? wc >= '0' && wc <= '9' : 0); } _GL_WCTYPE_INLINE int rpl_iswgraph (wint_t wc) { return ((wchar_t) wc == wc ? iswgraph ((wchar_t) wc) : 0); } _GL_WCTYPE_INLINE int rpl_iswlower (wint_t wc) { return ((wchar_t) wc == wc ? iswlower ((wchar_t) wc) : 0); } _GL_WCTYPE_INLINE int rpl_iswprint (wint_t wc) { return ((wchar_t) wc == wc ? iswprint ((wchar_t) wc) : 0); } _GL_WCTYPE_INLINE int rpl_iswpunct (wint_t wc) { return ((wchar_t) wc == wc ? iswpunct ((wchar_t) wc) : 0); } _GL_WCTYPE_INLINE int rpl_iswspace (wint_t wc) { return ((wchar_t) wc == wc ? iswspace ((wchar_t) wc) : 0); } _GL_WCTYPE_INLINE int rpl_iswupper (wint_t wc) { return ((wchar_t) wc == wc ? iswupper ((wchar_t) wc) : 0); } _GL_WCTYPE_INLINE int rpl_iswxdigit (wint_t wc) { return ((wchar_t) wc == wc ? (wc >= '0' && wc <= '9') || ((wc & ~0x20) >= 'A' && (wc & ~0x20) <= 'F') : 0); } _GL_WCTYPE_INLINE wint_t rpl_towlower (wint_t wc) { return ((wchar_t) wc == wc ? (wchar_t) towlower ((wchar_t) wc) : wc); } _GL_WCTYPE_INLINE wint_t rpl_towupper (wint_t wc) { return ((wchar_t) wc == wc ? (wchar_t) towupper ((wchar_t) wc) : wc); } # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef iswalnum # undef iswalpha # undef iswblank # undef iswcntrl # undef iswdigit # undef iswgraph # undef iswlower # undef iswprint # undef iswpunct # undef iswspace # undef iswupper # undef iswxdigit # undef towlower # undef towupper # define iswalnum rpl_iswalnum # define iswalpha rpl_iswalpha # define iswblank rpl_iswblank # define iswcntrl rpl_iswcntrl # define iswdigit rpl_iswdigit # define iswgraph rpl_iswgraph # define iswlower rpl_iswlower # define iswprint rpl_iswprint # define iswpunct rpl_iswpunct # define iswspace rpl_iswspace # define iswupper rpl_iswupper # define iswxdigit rpl_iswxdigit # define towlower rpl_towlower # define towupper rpl_towupper # endif # else /* IRIX 5.3 has macros but no functions, its isw* macros refer to an undefined variable _ctmp_ and to macros like _P, and they refer to system functions like _iswctype that are not in the standard C library. Rather than try to get ancient buggy implementations like this to work, just disable them. */ # undef iswalnum # undef iswalpha # undef iswblank # undef iswcntrl # undef iswdigit # undef iswgraph # undef iswlower # undef iswprint # undef iswpunct # undef iswspace # undef iswupper # undef iswxdigit # undef towlower # undef towupper /* Linux libc5 has and the functions but they are broken. */ # if @REPLACE_ISWCNTRL@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # define iswalnum rpl_iswalnum # define iswalpha rpl_iswalpha # define iswblank rpl_iswblank # define iswcntrl rpl_iswcntrl # define iswdigit rpl_iswdigit # define iswgraph rpl_iswgraph # define iswlower rpl_iswlower # define iswprint rpl_iswprint # define iswpunct rpl_iswpunct # define iswspace rpl_iswspace # define iswupper rpl_iswupper # define iswxdigit rpl_iswxdigit # endif # endif # if @REPLACE_TOWLOWER@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # define towlower rpl_towlower # define towupper rpl_towupper # endif # endif _GL_WCTYPE_INLINE int # if @REPLACE_ISWCNTRL@ rpl_iswalnum # else iswalnum # endif (wint_t wc) { return ((wc >= '0' && wc <= '9') || ((wc & ~0x20) >= 'A' && (wc & ~0x20) <= 'Z')); } _GL_WCTYPE_INLINE int # if @REPLACE_ISWCNTRL@ rpl_iswalpha # else iswalpha # endif (wint_t wc) { return (wc & ~0x20) >= 'A' && (wc & ~0x20) <= 'Z'; } _GL_WCTYPE_INLINE int # if @REPLACE_ISWCNTRL@ rpl_iswblank # else iswblank # endif (wint_t wc) { return wc == ' ' || wc == '\t'; } _GL_WCTYPE_INLINE int # if @REPLACE_ISWCNTRL@ rpl_iswcntrl # else iswcntrl # endif (wint_t wc) { return (wc & ~0x1f) == 0 || wc == 0x7f; } _GL_WCTYPE_INLINE int # if @REPLACE_ISWDIGIT@ rpl_iswdigit # else iswdigit # endif (wint_t wc) { return wc >= '0' && wc <= '9'; } _GL_WCTYPE_INLINE int # if @REPLACE_ISWCNTRL@ rpl_iswgraph # else iswgraph # endif (wint_t wc) { return wc >= '!' && wc <= '~'; } _GL_WCTYPE_INLINE int # if @REPLACE_ISWCNTRL@ rpl_iswlower # else iswlower # endif (wint_t wc) { return wc >= 'a' && wc <= 'z'; } _GL_WCTYPE_INLINE int # if @REPLACE_ISWCNTRL@ rpl_iswprint # else iswprint # endif (wint_t wc) { return wc >= ' ' && wc <= '~'; } _GL_WCTYPE_INLINE int # if @REPLACE_ISWCNTRL@ rpl_iswpunct # else iswpunct # endif (wint_t wc) { return (wc >= '!' && wc <= '~' && !((wc >= '0' && wc <= '9') || ((wc & ~0x20) >= 'A' && (wc & ~0x20) <= 'Z'))); } _GL_WCTYPE_INLINE int # if @REPLACE_ISWCNTRL@ rpl_iswspace # else iswspace # endif (wint_t wc) { return (wc == ' ' || wc == '\t' || wc == '\n' || wc == '\v' || wc == '\f' || wc == '\r'); } _GL_WCTYPE_INLINE int # if @REPLACE_ISWCNTRL@ rpl_iswupper # else iswupper # endif (wint_t wc) { return wc >= 'A' && wc <= 'Z'; } _GL_WCTYPE_INLINE int # if @REPLACE_ISWXDIGIT@ rpl_iswxdigit # else iswxdigit # endif (wint_t wc) { return ((wc >= '0' && wc <= '9') || ((wc & ~0x20) >= 'A' && (wc & ~0x20) <= 'F')); } _GL_WCTYPE_INLINE wint_t # if @REPLACE_TOWLOWER@ rpl_towlower # else towlower # endif (wint_t wc) { return (wc >= 'A' && wc <= 'Z' ? wc - 'A' + 'a' : wc); } _GL_WCTYPE_INLINE wint_t # if @REPLACE_TOWLOWER@ rpl_towupper # else towupper # endif (wint_t wc) { return (wc >= 'a' && wc <= 'z' ? wc - 'a' + 'A' : wc); } # endif # else /* Only some of the functions are missing or broken. */ # if @GNULIB_ISWBLANK@ && (! @HAVE_ISWBLANK@ || @REPLACE_ISWBLANK@) /* Only the iswblank function is missing. */ # if @REPLACE_ISWBLANK@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # define iswblank rpl_iswblank # endif _GL_FUNCDECL_RPL (iswblank, int, (wint_t wc)); # else _GL_FUNCDECL_SYS (iswblank, int, (wint_t wc)); # endif # endif # if @GNULIB_ISWDIGIT@ # if @REPLACE_ISWDIGIT@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef iswdigit # define iswdigit rpl_iswdigit # endif _GL_FUNCDECL_RPL (iswdigit, int, (wint_t wc)); # endif # endif # if @GNULIB_ISWXDIGIT@ # if @REPLACE_ISWXDIGIT@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef iswxdigit # define iswxdigit rpl_iswxdigit # endif _GL_FUNCDECL_RPL (iswxdigit, int, (wint_t wc)); # endif # endif # endif # if defined __MINGW32__ && !@GNULIB_OVERRIDES_WINT_T@ /* On native Windows, wchar_t is uint16_t, and wint_t is uint32_t. The functions towlower and towupper are implemented in the MSVCRT library to take a wchar_t argument and return a wchar_t result. mingw declares these functions to take a wint_t argument and return a wint_t result. This means that: 1. When the user passes an argument outside the range 0x0000..0xFFFF, the function will look only at the lower 16 bits. This is allowed according to POSIX. 2. The return value is returned in the lower 16 bits of the result register. The upper 16 bits are random: whatever happened to be in that part of the result register. We need to fix this by adding a zero-extend from wchar_t to wint_t after the call. */ _GL_WCTYPE_INLINE wint_t rpl_towlower (wint_t wc) { return (wint_t) (wchar_t) towlower (wc); } # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # define towlower rpl_towlower # endif _GL_WCTYPE_INLINE wint_t rpl_towupper (wint_t wc) { return (wint_t) (wchar_t) towupper (wc); } # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # define towupper rpl_towupper # endif # endif /* __MINGW32__ && !@GNULIB_OVERRIDES_WINT_T@ */ # define GNULIB_defined_wctype_functions 1 #endif #if @REPLACE_ISWCNTRL@ _GL_CXXALIAS_RPL (iswalnum, int, (wint_t wc)); #else _GL_CXXALIAS_SYS (iswalnum, int, (wint_t wc)); #endif #if @REPLACE_ISWCNTRL@ _GL_CXXALIAS_RPL (iswalpha, int, (wint_t wc)); #else _GL_CXXALIAS_SYS (iswalpha, int, (wint_t wc)); #endif #if @REPLACE_ISWCNTRL@ _GL_CXXALIAS_RPL (iswcntrl, int, (wint_t wc)); #else _GL_CXXALIAS_SYS (iswcntrl, int, (wint_t wc)); #endif #if @GNULIB_ISWDIGIT@ # if @REPLACE_ISWDIGIT@ _GL_CXXALIAS_RPL (iswdigit, int, (wint_t wc)); # else _GL_CXXALIAS_SYS (iswdigit, int, (wint_t wc)); # endif #endif #if @REPLACE_ISWCNTRL@ _GL_CXXALIAS_RPL (iswgraph, int, (wint_t wc)); #else _GL_CXXALIAS_SYS (iswgraph, int, (wint_t wc)); #endif #if @REPLACE_ISWCNTRL@ _GL_CXXALIAS_RPL (iswlower, int, (wint_t wc)); #else _GL_CXXALIAS_SYS (iswlower, int, (wint_t wc)); #endif #if @REPLACE_ISWCNTRL@ _GL_CXXALIAS_RPL (iswprint, int, (wint_t wc)); #else _GL_CXXALIAS_SYS (iswprint, int, (wint_t wc)); #endif #if @REPLACE_ISWCNTRL@ _GL_CXXALIAS_RPL (iswpunct, int, (wint_t wc)); #else _GL_CXXALIAS_SYS (iswpunct, int, (wint_t wc)); #endif #if @REPLACE_ISWCNTRL@ _GL_CXXALIAS_RPL (iswspace, int, (wint_t wc)); #else _GL_CXXALIAS_SYS (iswspace, int, (wint_t wc)); #endif #if @REPLACE_ISWCNTRL@ _GL_CXXALIAS_RPL (iswupper, int, (wint_t wc)); #else _GL_CXXALIAS_SYS (iswupper, int, (wint_t wc)); #endif #if @GNULIB_ISWXDIGIT@ # if @REPLACE_ISWXDIGIT@ _GL_CXXALIAS_RPL (iswxdigit, int, (wint_t wc)); # else _GL_CXXALIAS_SYS (iswxdigit, int, (wint_t wc)); # endif #endif #if __GLIBC__ >= 2 _GL_CXXALIASWARN (iswalnum); _GL_CXXALIASWARN (iswalpha); _GL_CXXALIASWARN (iswcntrl); _GL_CXXALIASWARN (iswdigit); _GL_CXXALIASWARN (iswgraph); _GL_CXXALIASWARN (iswlower); _GL_CXXALIASWARN (iswprint); _GL_CXXALIASWARN (iswpunct); _GL_CXXALIASWARN (iswspace); _GL_CXXALIASWARN (iswupper); _GL_CXXALIASWARN (iswxdigit); #endif #if @GNULIB_ISWBLANK@ # if @REPLACE_ISWCNTRL@ || @REPLACE_ISWBLANK@ _GL_CXXALIAS_RPL (iswblank, int, (wint_t wc)); # else _GL_CXXALIAS_SYS (iswblank, int, (wint_t wc)); # endif # if __GLIBC__ >= 2 _GL_CXXALIASWARN (iswblank); # endif #endif #if !@HAVE_WCTYPE_T@ # if !GNULIB_defined_wctype_t typedef void * wctype_t; # define GNULIB_defined_wctype_t 1 # endif #endif /* Get a descriptor for a wide character property. */ #if @GNULIB_WCTYPE@ # if !@HAVE_WCTYPE_T@ _GL_FUNCDECL_SYS (wctype, wctype_t, (const char *name)); # endif _GL_CXXALIAS_SYS (wctype, wctype_t, (const char *name)); # if __GLIBC__ >= 2 _GL_CXXALIASWARN (wctype); # endif #elif defined GNULIB_POSIXCHECK # undef wctype # if HAVE_RAW_DECL_WCTYPE _GL_WARN_ON_USE (wctype, "wctype is unportable - " "use gnulib module wctype for portability"); # endif #endif /* Test whether a wide character has a given property. The argument WC must be either a wchar_t value or WEOF. The argument DESC must have been returned by the wctype() function. */ #if @GNULIB_ISWCTYPE@ # if @GNULIB_OVERRIDES_WINT_T@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef iswctype # define iswctype rpl_iswctype # endif _GL_FUNCDECL_RPL (iswctype, int, (wint_t wc, wctype_t desc)); _GL_CXXALIAS_RPL (iswctype, int, (wint_t wc, wctype_t desc)); # else # if !@HAVE_WCTYPE_T@ _GL_FUNCDECL_SYS (iswctype, int, (wint_t wc, wctype_t desc)); # endif _GL_CXXALIAS_SYS (iswctype, int, (wint_t wc, wctype_t desc)); # endif # if __GLIBC__ >= 2 _GL_CXXALIASWARN (iswctype); # endif #elif defined GNULIB_POSIXCHECK # undef iswctype # if HAVE_RAW_DECL_ISWCTYPE _GL_WARN_ON_USE (iswctype, "iswctype is unportable - " "use gnulib module iswctype for portability"); # endif #endif #if @REPLACE_TOWLOWER@ || defined __MINGW32__ _GL_CXXALIAS_RPL (towlower, wint_t, (wint_t wc)); _GL_CXXALIAS_RPL (towupper, wint_t, (wint_t wc)); #else _GL_CXXALIAS_SYS (towlower, wint_t, (wint_t wc)); _GL_CXXALIAS_SYS (towupper, wint_t, (wint_t wc)); #endif #if __GLIBC__ >= 2 _GL_CXXALIASWARN (towlower); _GL_CXXALIASWARN (towupper); #endif #if !@HAVE_WCTRANS_T@ # if !GNULIB_defined_wctrans_t typedef void * wctrans_t; # define GNULIB_defined_wctrans_t 1 # endif #endif /* Get a descriptor for a wide character case conversion. */ #if @GNULIB_WCTRANS@ # if !@HAVE_WCTRANS_T@ _GL_FUNCDECL_SYS (wctrans, wctrans_t, (const char *name)); # endif _GL_CXXALIAS_SYS (wctrans, wctrans_t, (const char *name)); # if __GLIBC__ >= 2 _GL_CXXALIASWARN (wctrans); # endif #elif defined GNULIB_POSIXCHECK # undef wctrans # if HAVE_RAW_DECL_WCTRANS _GL_WARN_ON_USE (wctrans, "wctrans is unportable - " "use gnulib module wctrans for portability"); # endif #endif /* Perform a given case conversion on a wide character. The argument WC must be either a wchar_t value or WEOF. The argument DESC must have been returned by the wctrans() function. */ #if @GNULIB_TOWCTRANS@ # if !@HAVE_WCTRANS_T@ _GL_FUNCDECL_SYS (towctrans, wint_t, (wint_t wc, wctrans_t desc)); # endif _GL_CXXALIAS_SYS (towctrans, wint_t, (wint_t wc, wctrans_t desc)); # if __GLIBC__ >= 2 _GL_CXXALIASWARN (towctrans); # endif #elif defined GNULIB_POSIXCHECK # undef towctrans # if HAVE_RAW_DECL_TOWCTRANS _GL_WARN_ON_USE (towctrans, "towctrans is unportable - " "use gnulib module towctrans for portability"); # endif #endif _GL_INLINE_HEADER_END #endif /* _@GUARD_PREFIX@_WCTYPE_H */ #endif /* _@GUARD_PREFIX@_WCTYPE_H */ #endif pspp-1.4.1/gl/tzset.c0000644000175000017500000000617613723215640014047 0ustar00blpblp00000000000000/* Provide tzset for systems that don't have it or for which it's broken. Copyright (C) 2001-2003, 2005-2007, 2009-2020 Free Software Foundation, Inc. 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 3, 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, see . */ /* written by Jim Meyering */ #include /* Specification. */ #include #include #include /* This is a wrapper for tzset, for systems on which tzset may clobber the static buffer used for localtime's result. Work around the bug in some systems whereby tzset clobbers the static buffer that localtime uses for its return value. The tzset function from Solaris 2.5, 2.5.1, and 2.6 has this problem. */ void tzset (void) #undef tzset { #if defined _WIN32 && ! defined __CYGWIN__ /* Rectify the value of the environment variable TZ. There are four possible kinds of such values: - Traditional US time zone names, e.g. "PST8PDT". Syntax: see - Time zone names based on geography, that contain one or more slashes, e.g. "Europe/Moscow". - Time zone names based on geography, without slashes, e.g. "Singapore". - Time zone names that contain explicit DST rules. Syntax: see The Microsoft CRT understands only the first kind. It produces incorrect results if the value of TZ is of the other kinds. But in a Cygwin environment, /etc/profile.d/tzset.sh sets TZ to a value of the second kind for most geographies, or of the first kind in a few other geographies. If it is of the second kind, neutralize it. For the Microsoft CRT, an absent or empty TZ means the time zone that the user has set in the Windows Control Panel. If the value of TZ is of the third or fourth kind -- Cygwin programs understand these syntaxes as well --, it does not matter whether we neutralize it or not, since these values occur only when a Cygwin user has set TZ explicitly; this case is 1. rare and 2. under the user's responsibility. */ const char *tz = getenv ("TZ"); if (tz != NULL && strchr (tz, '/') != NULL) _putenv ("TZ="); /* On native Windows, tzset() is deprecated. Use _tzset() instead. See */ _tzset (); #elif HAVE_TZSET tzset (); #else /* Do nothing. Avoid infinite recursion. */ #endif } pspp-1.4.1/gl/lseek.c0000644000175000017500000000357413723215637014006 0ustar00blpblp00000000000000/* An lseek() function that detects pipes. Copyright (C) 2007, 2009-2020 Free Software Foundation, Inc. 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 3, 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, see . */ #include /* Specification. */ #include #if defined _WIN32 && ! defined __CYGWIN__ /* Windows platforms. */ /* Get GetFileType. */ # include /* Get _get_osfhandle. */ # if GNULIB_MSVC_NOTHROW # include "msvc-nothrow.h" # else # include # endif #else # include #endif #include #undef lseek off_t rpl_lseek (int fd, off_t offset, int whence) { #if defined _WIN32 && ! defined __CYGWIN__ /* mingw lseek mistakenly succeeds on pipes, sockets, and terminals. */ HANDLE h = (HANDLE) _get_osfhandle (fd); if (h == INVALID_HANDLE_VALUE) { errno = EBADF; return -1; } if (GetFileType (h) != FILE_TYPE_DISK) { errno = ESPIPE; return -1; } #else /* BeOS lseek mistakenly succeeds on pipes... */ struct stat statbuf; if (fstat (fd, &statbuf) < 0) return -1; if (!S_ISREG (statbuf.st_mode)) { errno = ESPIPE; return -1; } #endif #if _GL_WINDOWS_64_BIT_OFF_T || (defined __MINGW32__ && defined _FILE_OFFSET_BITS && (_FILE_OFFSET_BITS == 64)) return _lseeki64 (fd, offset, whence); #else return lseek (fd, offset, whence); #endif } pspp-1.4.1/gl/md4.h0000644000175000017500000000611513723215637013366 0ustar00blpblp00000000000000/* Declarations of functions and data types used for MD4 sum library functions. Copyright (C) 2000-2001, 2003, 2005, 2008-2020 Free Software Foundation, Inc. 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 3, 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, see . */ #ifndef MD4_H # define MD4_H 1 # include # include # ifdef __cplusplus extern "C" { # endif # define MD4_DIGEST_SIZE 16 /* Structure to save state of computation between the single steps. */ struct md4_ctx { uint32_t A; uint32_t B; uint32_t C; uint32_t D; uint32_t total[2]; uint32_t buflen; uint32_t buffer[32]; }; /* Initialize structure containing state of computation. */ extern void md4_init_ctx (struct md4_ctx *ctx); /* Starting with the result of former calls of this function (or the initialization function update the context for the next LEN bytes starting at BUFFER. It is necessary that LEN is a multiple of 64!!! */ extern void md4_process_block (const void *buffer, size_t len, struct md4_ctx *ctx); /* Starting with the result of former calls of this function (or the initialization function update the context for the next LEN bytes starting at BUFFER. It is NOT required that LEN is a multiple of 64. */ extern void md4_process_bytes (const void *buffer, size_t len, struct md4_ctx *ctx); /* Process the remaining bytes in the buffer and put result from CTX in first 16 bytes following RESBUF. The result is always in little endian byte order, so that a byte-wise output yields to the wanted ASCII representation of the message digest. */ extern void *md4_finish_ctx (struct md4_ctx *ctx, void *restrict resbuf); /* Put result from CTX in first 16 bytes following RESBUF. The result is always in little endian byte order, so that a byte-wise output yields to the wanted ASCII representation of the message digest. */ extern void *md4_read_ctx (const struct md4_ctx *ctx, void *restrict resbuf); /* Compute MD4 message digest for bytes read from STREAM. The resulting message digest number will be written into the 16 bytes beginning at RESBLOCK. */ extern int md4_stream (FILE * stream, void *resblock); /* Compute MD4 message digest for LEN bytes beginning at BUFFER. The result is always in little endian byte order, so that a byte-wise output yields to the wanted ASCII representation of the message digest. */ extern void *md4_buffer (const char *buffer, size_t len, void *restrict resblock); # ifdef __cplusplus } # endif #endif pspp-1.4.1/gl/pathmax.h0000644000175000017500000000556713723215637014356 0ustar00blpblp00000000000000/* Define PATH_MAX somehow. Requires sys/types.h. Copyright (C) 1992, 1999, 2001, 2003, 2005, 2009-2020 Free Software Foundation, Inc. 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 3, 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, see . */ #ifndef _PATHMAX_H # define _PATHMAX_H /* POSIX:2008 defines PATH_MAX to be the maximum number of bytes in a filename, including the terminating NUL byte. PATH_MAX is not defined on systems which have no limit on filename length, such as GNU/Hurd. This file does *not* define PATH_MAX always. Programs that use this file can handle the GNU/Hurd case in several ways: - Either with a package-wide handling, or with a per-file handling, - Either through a #ifdef PATH_MAX or through a fallback like #ifndef PATH_MAX # define PATH_MAX 8192 #endif or through a fallback like #ifndef PATH_MAX # define PATH_MAX pathconf ("/", _PC_PATH_MAX) #endif */ # include # include # ifndef _POSIX_PATH_MAX # define _POSIX_PATH_MAX 256 # endif /* Don't include sys/param.h if it already has been. */ # if defined HAVE_SYS_PARAM_H && !defined PATH_MAX && !defined MAXPATHLEN # include # endif # if !defined PATH_MAX && defined MAXPATHLEN # define PATH_MAX MAXPATHLEN # endif # ifdef __hpux /* On HP-UX, PATH_MAX designates the maximum number of bytes in a filename, *not* including the terminating NUL byte, and is set to 1023. Additionally, when _XOPEN_SOURCE is defined to 500 or more, PATH_MAX is not defined at all any more. */ # undef PATH_MAX # define PATH_MAX 1024 # endif # if defined _WIN32 && ! defined __CYGWIN__ /* The page "Naming Files, Paths, and Namespaces" on msdn.microsoft.com, section "Maximum Path Length Limitation", explains that the maximum size of a filename, including the terminating NUL byte, is 260 = 3 + 256 + 1. This is the same value as - FILENAME_MAX in , - _MAX_PATH in , - MAX_PATH in . Undefine the original value, because mingw's gets it wrong. */ # undef PATH_MAX # define PATH_MAX 260 # endif #endif /* _PATHMAX_H */ pspp-1.4.1/gl/mktime-internal.h0000644000175000017500000000603213723215637016000 0ustar00blpblp00000000000000/* Internals of mktime and related functions Copyright 2016-2020 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Paul Eggert . The GNU C Library 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 3 of the License, or (at your option) any later version. The GNU C Library 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 the GNU C Library; if not, see . */ #ifndef _LIBC # include #endif /* mktime_offset_t is a signed type wide enough to hold a UTC offset in seconds, and used as part of the type of the offset-guess argument to mktime_internal. In Glibc, it is always long int. When in Gnulib, use time_t on platforms where time_t is signed, to be compatible with platforms like BeOS that export this implementation detail of mktime. On platforms where time_t is unsigned, GNU and POSIX code can assume 'int' is at least 32 bits which is wide enough for a UTC offset. */ #ifdef _LIBC typedef long int mktime_offset_t; #elif defined TIME_T_IS_SIGNED typedef time_t mktime_offset_t; #else typedef int mktime_offset_t; #endif /* The source code uses identifiers like __time64_t for glibc timestamps that can contain 64-bit values even when time_t is only 32 bits. These are just macros for the ordinary identifiers unless compiling within glibc when time_t is 32 bits. */ #if ! (defined _LIBC && __TIMESIZE != 64) # undef __time64_t # define __time64_t time_t # define __gmtime64_r __gmtime_r # define __localtime64_r __localtime_r # define __mktime64 mktime # define __timegm64 timegm #endif #ifndef _LIBC /* Although glibc source code uses leading underscores, Gnulib wants ordinary names. Portable standalone applications should supply a that declares a POSIX-compliant localtime_r, for the benefit of older implementations that lack localtime_r or have a nonstandard one. Similarly for gmtime_r. See the gnulib time_r module for one way to implement this. */ # undef __gmtime_r # undef __localtime_r # define __gmtime_r gmtime_r # define __localtime_r localtime_r # define __mktime_internal mktime_internal #endif /* Subroutine of mktime. Return the time_t representation of TP and normalize TP, given that a struct tm * maps to a time_t as performed by FUNC. Record next guess for localtime-gmtime offset in *OFFSET. */ extern __time64_t __mktime_internal (struct tm *tp, struct tm *(*func) (__time64_t const *, struct tm *), mktime_offset_t *offset) attribute_hidden; pspp-1.4.1/gl/uniwidth.in.h0000644000175000017500000000411213723215640015127 0ustar00blpblp00000000000000/* Display width functions. Copyright (C) 2001-2002, 2005, 2007, 2009-2020 Free Software Foundation, Inc. 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 3 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, see . */ #ifndef _UNIWIDTH_H #define _UNIWIDTH_H #include "unitypes.h" /* Get size_t. */ #include /* Get locale_charset() declaration. */ #include "localcharset.h" #ifdef __cplusplus extern "C" { #endif /* Display width. */ /* These functions are locale dependent. The encoding argument identifies the encoding (e.g. "ISO-8859-2" for Polish). */ /* Determine number of column positions required for UC. */ extern int uc_width (ucs4_t uc, const char *encoding) _UC_ATTRIBUTE_PURE; /* Determine number of column positions required for first N units (or fewer if S ends before this) in S. */ extern int u8_width (const uint8_t *s, size_t n, const char *encoding) _UC_ATTRIBUTE_PURE; extern int u16_width (const uint16_t *s, size_t n, const char *encoding) _UC_ATTRIBUTE_PURE; extern int u32_width (const uint32_t *s, size_t n, const char *encoding) _UC_ATTRIBUTE_PURE; /* Determine number of column positions required for S. */ extern int u8_strwidth (const uint8_t *s, const char *encoding) _UC_ATTRIBUTE_PURE; extern int u16_strwidth (const uint16_t *s, const char *encoding) _UC_ATTRIBUTE_PURE; extern int u32_strwidth (const uint32_t *s, const char *encoding) _UC_ATTRIBUTE_PURE; #ifdef __cplusplus } #endif #endif /* _UNIWIDTH_H */ pspp-1.4.1/gl/umaxtostr.c0000644000175000017500000000011313723215640014725 0ustar00blpblp00000000000000#define anytostr umaxtostr #define inttype uintmax_t #include "anytostr.c" pspp-1.4.1/gl/float+.h0000644000175000017500000001274613723215636014070 0ustar00blpblp00000000000000/* Supplemental information about the floating-point formats. Copyright (C) 2007, 2009-2020 Free Software Foundation, Inc. Written by Bruno Haible , 2007. 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 3, 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, see . */ #ifndef _FLOATPLUS_H #define _FLOATPLUS_H #include #include /* Number of bits in the mantissa of a floating-point number, including the "hidden bit". */ #if FLT_RADIX == 2 # define FLT_MANT_BIT FLT_MANT_DIG # define DBL_MANT_BIT DBL_MANT_DIG # define LDBL_MANT_BIT LDBL_MANT_DIG #elif FLT_RADIX == 4 # define FLT_MANT_BIT (FLT_MANT_DIG * 2) # define DBL_MANT_BIT (DBL_MANT_DIG * 2) # define LDBL_MANT_BIT (LDBL_MANT_DIG * 2) #elif FLT_RADIX == 16 # define FLT_MANT_BIT (FLT_MANT_DIG * 4) # define DBL_MANT_BIT (DBL_MANT_DIG * 4) # define LDBL_MANT_BIT (LDBL_MANT_DIG * 4) #endif /* Bit mask that can be used to mask the exponent, as an unsigned number. */ #define FLT_EXP_MASK ((FLT_MAX_EXP - FLT_MIN_EXP) | 7) #define DBL_EXP_MASK ((DBL_MAX_EXP - DBL_MIN_EXP) | 7) #define LDBL_EXP_MASK ((LDBL_MAX_EXP - LDBL_MIN_EXP) | 7) /* Number of bits used for the exponent of a floating-point number, including the exponent's sign. */ #define FLT_EXP_BIT \ (FLT_EXP_MASK < 0x100 ? 8 : \ FLT_EXP_MASK < 0x200 ? 9 : \ FLT_EXP_MASK < 0x400 ? 10 : \ FLT_EXP_MASK < 0x800 ? 11 : \ FLT_EXP_MASK < 0x1000 ? 12 : \ FLT_EXP_MASK < 0x2000 ? 13 : \ FLT_EXP_MASK < 0x4000 ? 14 : \ FLT_EXP_MASK < 0x8000 ? 15 : \ FLT_EXP_MASK < 0x10000 ? 16 : \ FLT_EXP_MASK < 0x20000 ? 17 : \ FLT_EXP_MASK < 0x40000 ? 18 : \ FLT_EXP_MASK < 0x80000 ? 19 : \ FLT_EXP_MASK < 0x100000 ? 20 : \ FLT_EXP_MASK < 0x200000 ? 21 : \ FLT_EXP_MASK < 0x400000 ? 22 : \ FLT_EXP_MASK < 0x800000 ? 23 : \ FLT_EXP_MASK < 0x1000000 ? 24 : \ FLT_EXP_MASK < 0x2000000 ? 25 : \ FLT_EXP_MASK < 0x4000000 ? 26 : \ FLT_EXP_MASK < 0x8000000 ? 27 : \ FLT_EXP_MASK < 0x10000000 ? 28 : \ FLT_EXP_MASK < 0x20000000 ? 29 : \ FLT_EXP_MASK < 0x40000000 ? 30 : \ FLT_EXP_MASK <= 0x7fffffff ? 31 : \ 32) #define DBL_EXP_BIT \ (DBL_EXP_MASK < 0x100 ? 8 : \ DBL_EXP_MASK < 0x200 ? 9 : \ DBL_EXP_MASK < 0x400 ? 10 : \ DBL_EXP_MASK < 0x800 ? 11 : \ DBL_EXP_MASK < 0x1000 ? 12 : \ DBL_EXP_MASK < 0x2000 ? 13 : \ DBL_EXP_MASK < 0x4000 ? 14 : \ DBL_EXP_MASK < 0x8000 ? 15 : \ DBL_EXP_MASK < 0x10000 ? 16 : \ DBL_EXP_MASK < 0x20000 ? 17 : \ DBL_EXP_MASK < 0x40000 ? 18 : \ DBL_EXP_MASK < 0x80000 ? 19 : \ DBL_EXP_MASK < 0x100000 ? 20 : \ DBL_EXP_MASK < 0x200000 ? 21 : \ DBL_EXP_MASK < 0x400000 ? 22 : \ DBL_EXP_MASK < 0x800000 ? 23 : \ DBL_EXP_MASK < 0x1000000 ? 24 : \ DBL_EXP_MASK < 0x2000000 ? 25 : \ DBL_EXP_MASK < 0x4000000 ? 26 : \ DBL_EXP_MASK < 0x8000000 ? 27 : \ DBL_EXP_MASK < 0x10000000 ? 28 : \ DBL_EXP_MASK < 0x20000000 ? 29 : \ DBL_EXP_MASK < 0x40000000 ? 30 : \ DBL_EXP_MASK <= 0x7fffffff ? 31 : \ 32) #define LDBL_EXP_BIT \ (LDBL_EXP_MASK < 0x100 ? 8 : \ LDBL_EXP_MASK < 0x200 ? 9 : \ LDBL_EXP_MASK < 0x400 ? 10 : \ LDBL_EXP_MASK < 0x800 ? 11 : \ LDBL_EXP_MASK < 0x1000 ? 12 : \ LDBL_EXP_MASK < 0x2000 ? 13 : \ LDBL_EXP_MASK < 0x4000 ? 14 : \ LDBL_EXP_MASK < 0x8000 ? 15 : \ LDBL_EXP_MASK < 0x10000 ? 16 : \ LDBL_EXP_MASK < 0x20000 ? 17 : \ LDBL_EXP_MASK < 0x40000 ? 18 : \ LDBL_EXP_MASK < 0x80000 ? 19 : \ LDBL_EXP_MASK < 0x100000 ? 20 : \ LDBL_EXP_MASK < 0x200000 ? 21 : \ LDBL_EXP_MASK < 0x400000 ? 22 : \ LDBL_EXP_MASK < 0x800000 ? 23 : \ LDBL_EXP_MASK < 0x1000000 ? 24 : \ LDBL_EXP_MASK < 0x2000000 ? 25 : \ LDBL_EXP_MASK < 0x4000000 ? 26 : \ LDBL_EXP_MASK < 0x8000000 ? 27 : \ LDBL_EXP_MASK < 0x10000000 ? 28 : \ LDBL_EXP_MASK < 0x20000000 ? 29 : \ LDBL_EXP_MASK < 0x40000000 ? 30 : \ LDBL_EXP_MASK <= 0x7fffffff ? 31 : \ 32) /* Number of bits used for a floating-point number: the mantissa (not counting the "hidden bit", since it may or may not be explicit), the exponent, and the sign. */ #define FLT_TOTAL_BIT ((FLT_MANT_BIT - 1) + FLT_EXP_BIT + 1) #define DBL_TOTAL_BIT ((DBL_MANT_BIT - 1) + DBL_EXP_BIT + 1) #define LDBL_TOTAL_BIT ((LDBL_MANT_BIT - 1) + LDBL_EXP_BIT + 1) /* Number of bytes used for a floating-point number. This can be smaller than the 'sizeof'. For example, on i386 systems, 'long double' most often have LDBL_MANT_BIT = 64, LDBL_EXP_BIT = 16, hence LDBL_TOTAL_BIT = 80 bits, i.e. 10 bytes of consecutive memory, but sizeof (long double) = 12 or = 16. */ #define SIZEOF_FLT ((FLT_TOTAL_BIT + CHAR_BIT - 1) / CHAR_BIT) #define SIZEOF_DBL ((DBL_TOTAL_BIT + CHAR_BIT - 1) / CHAR_BIT) #define SIZEOF_LDBL ((LDBL_TOTAL_BIT + CHAR_BIT - 1) / CHAR_BIT) /* Verify that SIZEOF_FLT <= sizeof (float) etc. */ typedef int verify_sizeof_flt[SIZEOF_FLT <= sizeof (float) ? 1 : -1]; typedef int verify_sizeof_dbl[SIZEOF_DBL <= sizeof (double) ? 1 : - 1]; typedef int verify_sizeof_ldbl[SIZEOF_LDBL <= sizeof (long double) ? 1 : - 1]; #endif /* _FLOATPLUS_H */ pspp-1.4.1/gl/careadlinkat.c0000644000175000017500000001244013723215636015314 0ustar00blpblp00000000000000/* Read symbolic links into a buffer without size limitation, relative to fd. Copyright (C) 2001, 2003-2004, 2007, 2009-2020 Free Software Foundation, Inc. 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 3 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, see . */ /* Written by Paul Eggert, Bruno Haible, and Jim Meyering. */ #include #include "careadlinkat.h" #include #include #include #include /* Define this independently so that stdint.h is not a prerequisite. */ #ifndef SIZE_MAX # define SIZE_MAX ((size_t) -1) #endif #ifndef SSIZE_MAX # define SSIZE_MAX ((ssize_t) (SIZE_MAX / 2)) #endif #include "allocator.h" /* Assuming the current directory is FD, get the symbolic link value of FILENAME as a null-terminated string and put it into a buffer. If FD is AT_FDCWD, FILENAME is interpreted relative to the current working directory, as in openat. If the link is small enough to fit into BUFFER put it there. BUFFER's size is BUFFER_SIZE, and BUFFER can be null if BUFFER_SIZE is zero. If the link is not small, put it into a dynamically allocated buffer managed by ALLOC. It is the caller's responsibility to free the returned value if it is nonnull and is not BUFFER. A null ALLOC stands for the standard allocator. The PREADLINKAT function specifies how to read links. It operates like POSIX readlinkat() but can assume that its first argument is the same as FD. If successful, return the buffer address; otherwise return NULL and set errno. */ char * careadlinkat (int fd, char const *filename, char *buffer, size_t buffer_size, struct allocator const *alloc, ssize_t (*preadlinkat) (int, char const *, char *, size_t)) { char *buf; size_t buf_size; size_t buf_size_max = SSIZE_MAX < SIZE_MAX ? (size_t) SSIZE_MAX + 1 : SIZE_MAX; char stack_buf[1024]; #if (defined GCC_LINT || defined lint) && _GL_GNUC_PREREQ (10, 1) /* Pacify preadlinkat without creating a pointer to the stack that a broken gcc -Wreturn-local-addr would cry wolf about. See: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=95044 This workaround differs from the mainline code, but no other way to pacify GCC 10.1.0 is known; even an explicit #pragma does not pacify GCC. When the GCC bug is fixed this workaround should be limited to the broken GCC versions. */ # define WORK_AROUND_GCC_BUG_95044 #endif if (! alloc) alloc = &stdlib_allocator; if (!buffer) { #ifdef WORK_AROUND_GCC_BUG_95044 buffer = alloc->allocate (sizeof stack_buf); #else /* Allocate the initial buffer on the stack. This way, in the common case of a symlink of small size, we get away with a single small malloc() instead of a big malloc() followed by a shrinking realloc(). */ buffer = stack_buf; #endif buffer_size = sizeof stack_buf; } buf = buffer; buf_size = buffer_size; while (buf) { /* Attempt to read the link into the current buffer. */ ssize_t link_length = preadlinkat (fd, filename, buf, buf_size); size_t link_size; if (link_length < 0) { /* On AIX 5L v5.3 and HP-UX 11i v2 04/09, readlink returns -1 with errno == ERANGE if the buffer is too small. */ int readlinkat_errno = errno; if (readlinkat_errno != ERANGE) { if (buf != buffer) { alloc->free (buf); errno = readlinkat_errno; } return NULL; } } link_size = link_length; if (link_size < buf_size) { buf[link_size++] = '\0'; if (buf == stack_buf) { char *b = alloc->allocate (link_size); buf_size = link_size; if (! b) break; return memcpy (b, buf, link_size); } if (link_size < buf_size && buf != buffer && alloc->reallocate) { /* Shrink BUF before returning it. */ char *b = alloc->reallocate (buf, link_size); if (b) return b; } return buf; } if (buf != buffer) alloc->free (buf); if (buf_size < buf_size_max / 2) buf_size = 2 * buf_size + 1; else if (buf_size < buf_size_max) buf_size = buf_size_max; else if (buf_size_max < SIZE_MAX) { errno = ENAMETOOLONG; return NULL; } else break; buf = alloc->allocate (buf_size); } if (alloc->die) alloc->die (buf_size); errno = ENOMEM; return NULL; } pspp-1.4.1/gl/gl_anylinked_list2.h0000644000175000017500000007601413723215637016464 0ustar00blpblp00000000000000/* Sequential list data type implemented by a linked list. Copyright (C) 2006-2020 Free Software Foundation, Inc. Written by Bruno Haible , 2006. 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 3 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, see . */ /* Common code of gl_linked_list.c and gl_linkedhash_list.c. */ /* If the symbol SIGNAL_SAFE_LIST is defined, the code is compiled in such a way that a gl_list_t data structure may be used from within a signal handler. The operations allowed in the signal handler are: gl_list_iterator, gl_list_iterator_next, gl_list_iterator_free. The list and node fields that are therefore accessed from the signal handler are: list->root, node->next, node->value. We are careful to make modifications to these fields only in an order that maintains the consistency of the list data structure at any moment, and we use 'volatile' assignments to prevent the compiler from reordering such assignments. */ #ifdef SIGNAL_SAFE_LIST # define ASYNCSAFE(type) *(type volatile *)& #else # define ASYNCSAFE(type) #endif /* -------------------------- gl_list_t Data Type -------------------------- */ static gl_list_t gl_linked_nx_create_empty (gl_list_implementation_t implementation, gl_listelement_equals_fn equals_fn, gl_listelement_hashcode_fn hashcode_fn, gl_listelement_dispose_fn dispose_fn, bool allow_duplicates) { struct gl_list_impl *list = (struct gl_list_impl *) malloc (sizeof (struct gl_list_impl)); if (list == NULL) return NULL; list->base.vtable = implementation; list->base.equals_fn = equals_fn; list->base.hashcode_fn = hashcode_fn; list->base.dispose_fn = dispose_fn; list->base.allow_duplicates = allow_duplicates; #if WITH_HASHTABLE list->table_size = 11; list->table = (gl_hash_entry_t *) calloc (list->table_size, sizeof (gl_hash_entry_t)); if (list->table == NULL) goto fail; #endif list->root.next = &list->root; list->root.prev = &list->root; list->count = 0; return list; #if WITH_HASHTABLE fail: free (list); return NULL; #endif } static gl_list_t gl_linked_nx_create (gl_list_implementation_t implementation, gl_listelement_equals_fn equals_fn, gl_listelement_hashcode_fn hashcode_fn, gl_listelement_dispose_fn dispose_fn, bool allow_duplicates, size_t count, const void **contents) { struct gl_list_impl *list = (struct gl_list_impl *) malloc (sizeof (struct gl_list_impl)); gl_list_node_t tail; if (list == NULL) return NULL; list->base.vtable = implementation; list->base.equals_fn = equals_fn; list->base.hashcode_fn = hashcode_fn; list->base.dispose_fn = dispose_fn; list->base.allow_duplicates = allow_duplicates; #if WITH_HASHTABLE { size_t estimate = xsum (count, count / 2); /* 1.5 * count */ if (estimate < 10) estimate = 10; list->table_size = next_prime (estimate); if (size_overflow_p (xtimes (list->table_size, sizeof (gl_hash_entry_t)))) goto fail1; list->table = (gl_hash_entry_t *) calloc (list->table_size, sizeof (gl_hash_entry_t)); if (list->table == NULL) goto fail1; } #endif list->count = count; tail = &list->root; for (; count > 0; contents++, count--) { gl_list_node_t node = (struct gl_list_node_impl *) malloc (sizeof (struct gl_list_node_impl)); if (node == NULL) goto fail2; node->value = *contents; #if WITH_HASHTABLE node->h.hashcode = (list->base.hashcode_fn != NULL ? list->base.hashcode_fn (node->value) : (size_t)(uintptr_t) node->value); /* Add node to the hash table. */ if (add_to_bucket (list, node) < 0) { free (node); goto fail2; } #endif /* Add node to the list. */ node->prev = tail; tail->next = node; tail = node; } tail->next = &list->root; list->root.prev = tail; return list; fail2: { gl_list_node_t node; for (node = tail; node != &list->root; ) { gl_list_node_t prev = node->prev; free (node); node = prev; } } #if WITH_HASHTABLE free (list->table); fail1: #endif free (list); return NULL; } static size_t _GL_ATTRIBUTE_PURE gl_linked_size (gl_list_t list) { return list->count; } static const void * _GL_ATTRIBUTE_PURE gl_linked_node_value (gl_list_t list _GL_ATTRIBUTE_MAYBE_UNUSED, gl_list_node_t node) { return node->value; } static int gl_linked_node_nx_set_value (gl_list_t list _GL_ATTRIBUTE_MAYBE_UNUSED, gl_list_node_t node, const void *elt) { #if WITH_HASHTABLE if (elt != node->value) { size_t new_hashcode = (list->base.hashcode_fn != NULL ? list->base.hashcode_fn (elt) : (size_t)(uintptr_t) elt); if (new_hashcode != node->h.hashcode) { remove_from_bucket (list, node); node->value = elt; node->h.hashcode = new_hashcode; if (add_to_bucket (list, node) < 0) { /* Out of memory. We removed node from a bucket but cannot add it to another bucket. In order to avoid inconsistencies, we must remove node entirely from the list. */ gl_list_node_t before_removed = node->prev; gl_list_node_t after_removed = node->next; ASYNCSAFE(gl_list_node_t) before_removed->next = after_removed; after_removed->prev = before_removed; list->count--; free (node); return -1; } } else node->value = elt; } #else node->value = elt; #endif return 0; } static gl_list_node_t _GL_ATTRIBUTE_PURE gl_linked_next_node (gl_list_t list, gl_list_node_t node) { return (node->next != &list->root ? node->next : NULL); } static gl_list_node_t _GL_ATTRIBUTE_PURE gl_linked_previous_node (gl_list_t list, gl_list_node_t node) { return (node->prev != &list->root ? node->prev : NULL); } static const void * _GL_ATTRIBUTE_PURE gl_linked_get_at (gl_list_t list, size_t position) { size_t count = list->count; gl_list_node_t node; if (!(position < count)) /* Invalid argument. */ abort (); /* Here we know count > 0. */ if (position <= ((count - 1) / 2)) { node = list->root.next; for (; position > 0; position--) node = node->next; } else { position = count - 1 - position; node = list->root.prev; for (; position > 0; position--) node = node->prev; } return node->value; } static gl_list_node_t gl_linked_nx_set_at (gl_list_t list, size_t position, const void *elt) { size_t count = list->count; gl_list_node_t node; if (!(position < count)) /* Invalid argument. */ abort (); /* Here we know count > 0. */ if (position <= ((count - 1) / 2)) { node = list->root.next; for (; position > 0; position--) node = node->next; } else { position = count - 1 - position; node = list->root.prev; for (; position > 0; position--) node = node->prev; } #if WITH_HASHTABLE if (elt != node->value) { size_t new_hashcode = (list->base.hashcode_fn != NULL ? list->base.hashcode_fn (elt) : (size_t)(uintptr_t) elt); if (new_hashcode != node->h.hashcode) { remove_from_bucket (list, node); node->value = elt; node->h.hashcode = new_hashcode; if (add_to_bucket (list, node) < 0) { /* Out of memory. We removed node from a bucket but cannot add it to another bucket. In order to avoid inconsistencies, we must remove node entirely from the list. */ gl_list_node_t before_removed = node->prev; gl_list_node_t after_removed = node->next; ASYNCSAFE(gl_list_node_t) before_removed->next = after_removed; after_removed->prev = before_removed; list->count--; free (node); return NULL; } } else node->value = elt; } #else node->value = elt; #endif return node; } static gl_list_node_t _GL_ATTRIBUTE_PURE gl_linked_search_from_to (gl_list_t list, size_t start_index, size_t end_index, const void *elt) { size_t count = list->count; if (!(start_index <= end_index && end_index <= count)) /* Invalid arguments. */ abort (); { #if WITH_HASHTABLE size_t hashcode = (list->base.hashcode_fn != NULL ? list->base.hashcode_fn (elt) : (size_t)(uintptr_t) elt); size_t bucket = hashcode % list->table_size; gl_listelement_equals_fn equals = list->base.equals_fn; if (!list->base.allow_duplicates) { /* Look for the first match in the hash bucket. */ gl_list_node_t found = NULL; gl_list_node_t node; for (node = (gl_list_node_t) list->table[bucket]; node != NULL; node = (gl_list_node_t) node->h.hash_next) if (node->h.hashcode == hashcode && (equals != NULL ? equals (elt, node->value) : elt == node->value)) { found = node; break; } if (start_index > 0) /* Look whether found's index is < start_index. */ for (node = list->root.next; ; node = node->next) { if (node == found) return NULL; if (--start_index == 0) break; } if (end_index < count) /* Look whether found's index is >= end_index. */ { end_index = count - end_index; for (node = list->root.prev; ; node = node->prev) { if (node == found) return NULL; if (--end_index == 0) break; } } return found; } else { /* Look whether there is more than one match in the hash bucket. */ bool multiple_matches = false; gl_list_node_t first_match = NULL; gl_list_node_t node; for (node = (gl_list_node_t) list->table[bucket]; node != NULL; node = (gl_list_node_t) node->h.hash_next) if (node->h.hashcode == hashcode && (equals != NULL ? equals (elt, node->value) : elt == node->value)) { if (first_match == NULL) first_match = node; else { multiple_matches = true; break; } } if (multiple_matches) { /* We need the match with the smallest index. But we don't have a fast mapping node -> index. So we have to walk the list. */ end_index -= start_index; node = list->root.next; for (; start_index > 0; start_index--) node = node->next; for (; end_index > 0; node = node->next, end_index--) if (node->h.hashcode == hashcode && (equals != NULL ? equals (elt, node->value) : elt == node->value)) return node; /* The matches must have all been at indices < start_index or >= end_index. */ return NULL; } else { if (start_index > 0) /* Look whether first_match's index is < start_index. */ for (node = list->root.next; node != &list->root; node = node->next) { if (node == first_match) return NULL; if (--start_index == 0) break; } if (end_index < list->count) /* Look whether first_match's index is >= end_index. */ { end_index = list->count - end_index; for (node = list->root.prev; ; node = node->prev) { if (node == first_match) return NULL; if (--end_index == 0) break; } } return first_match; } } #else gl_listelement_equals_fn equals = list->base.equals_fn; gl_list_node_t node = list->root.next; end_index -= start_index; for (; start_index > 0; start_index--) node = node->next; if (equals != NULL) { for (; end_index > 0; node = node->next, end_index--) if (equals (elt, node->value)) return node; } else { for (; end_index > 0; node = node->next, end_index--) if (elt == node->value) return node; } return NULL; #endif } } static size_t _GL_ATTRIBUTE_PURE gl_linked_indexof_from_to (gl_list_t list, size_t start_index, size_t end_index, const void *elt) { size_t count = list->count; if (!(start_index <= end_index && end_index <= count)) /* Invalid arguments. */ abort (); { #if WITH_HASHTABLE /* Here the hash table doesn't help much. It only allows us to minimize the number of equals() calls, by looking up first the node and then its index. */ size_t hashcode = (list->base.hashcode_fn != NULL ? list->base.hashcode_fn (elt) : (size_t)(uintptr_t) elt); size_t bucket = hashcode % list->table_size; gl_listelement_equals_fn equals = list->base.equals_fn; gl_list_node_t node; /* First step: Look up the node. */ if (!list->base.allow_duplicates) { /* Look for the first match in the hash bucket. */ for (node = (gl_list_node_t) list->table[bucket]; node != NULL; node = (gl_list_node_t) node->h.hash_next) if (node->h.hashcode == hashcode && (equals != NULL ? equals (elt, node->value) : elt == node->value)) break; } else { /* Look whether there is more than one match in the hash bucket. */ bool multiple_matches = false; gl_list_node_t first_match = NULL; for (node = (gl_list_node_t) list->table[bucket]; node != NULL; node = (gl_list_node_t) node->h.hash_next) if (node->h.hashcode == hashcode && (equals != NULL ? equals (elt, node->value) : elt == node->value)) { if (first_match == NULL) first_match = node; else { multiple_matches = true; break; } } if (multiple_matches) { /* We need the match with the smallest index. But we don't have a fast mapping node -> index. So we have to walk the list. */ size_t index; index = start_index; node = list->root.next; for (; start_index > 0; start_index--) node = node->next; for (; index < end_index; node = node->next, index++) if (node->h.hashcode == hashcode && (equals != NULL ? equals (elt, node->value) : elt == node->value)) return index; /* The matches must have all been at indices < start_index or >= end_index. */ return (size_t)(-1); } node = first_match; } /* Second step: Look up the index of the node. */ if (node == NULL) return (size_t)(-1); else { size_t index = 0; for (; node->prev != &list->root; node = node->prev) index++; if (index >= start_index && index < end_index) return index; else return (size_t)(-1); } #else gl_listelement_equals_fn equals = list->base.equals_fn; size_t index = start_index; gl_list_node_t node = list->root.next; for (; start_index > 0; start_index--) node = node->next; if (equals != NULL) { for (; index < end_index; node = node->next, index++) if (equals (elt, node->value)) return index; } else { for (; index < end_index; node = node->next, index++) if (elt == node->value) return index; } return (size_t)(-1); #endif } } static gl_list_node_t gl_linked_nx_add_first (gl_list_t list, const void *elt) { gl_list_node_t node = (struct gl_list_node_impl *) malloc (sizeof (struct gl_list_node_impl)); if (node == NULL) return NULL; ASYNCSAFE(const void *) node->value = elt; #if WITH_HASHTABLE node->h.hashcode = (list->base.hashcode_fn != NULL ? list->base.hashcode_fn (node->value) : (size_t)(uintptr_t) node->value); /* Add node to the hash table. */ if (add_to_bucket (list, node) < 0) { free (node); return NULL; } #endif /* Add node to the list. */ node->prev = &list->root; ASYNCSAFE(gl_list_node_t) node->next = list->root.next; node->next->prev = node; ASYNCSAFE(gl_list_node_t) list->root.next = node; list->count++; #if WITH_HASHTABLE hash_resize_after_add (list); #endif return node; } static gl_list_node_t gl_linked_nx_add_last (gl_list_t list, const void *elt) { gl_list_node_t node = (struct gl_list_node_impl *) malloc (sizeof (struct gl_list_node_impl)); if (node == NULL) return NULL; ASYNCSAFE(const void *) node->value = elt; #if WITH_HASHTABLE node->h.hashcode = (list->base.hashcode_fn != NULL ? list->base.hashcode_fn (node->value) : (size_t)(uintptr_t) node->value); /* Add node to the hash table. */ if (add_to_bucket (list, node) < 0) { free (node); return NULL; } #endif /* Add node to the list. */ ASYNCSAFE(gl_list_node_t) node->next = &list->root; node->prev = list->root.prev; ASYNCSAFE(gl_list_node_t) node->prev->next = node; list->root.prev = node; list->count++; #if WITH_HASHTABLE hash_resize_after_add (list); #endif return node; } static gl_list_node_t gl_linked_nx_add_before (gl_list_t list, gl_list_node_t node, const void *elt) { gl_list_node_t new_node = (struct gl_list_node_impl *) malloc (sizeof (struct gl_list_node_impl)); if (new_node == NULL) return NULL; ASYNCSAFE(const void *) new_node->value = elt; #if WITH_HASHTABLE new_node->h.hashcode = (list->base.hashcode_fn != NULL ? list->base.hashcode_fn (new_node->value) : (size_t)(uintptr_t) new_node->value); /* Add new_node to the hash table. */ if (add_to_bucket (list, new_node) < 0) { free (new_node); return NULL; } #endif /* Add new_node to the list. */ ASYNCSAFE(gl_list_node_t) new_node->next = node; new_node->prev = node->prev; ASYNCSAFE(gl_list_node_t) new_node->prev->next = new_node; node->prev = new_node; list->count++; #if WITH_HASHTABLE hash_resize_after_add (list); #endif return new_node; } static gl_list_node_t gl_linked_nx_add_after (gl_list_t list, gl_list_node_t node, const void *elt) { gl_list_node_t new_node = (struct gl_list_node_impl *) malloc (sizeof (struct gl_list_node_impl)); if (new_node == NULL) return NULL; ASYNCSAFE(const void *) new_node->value = elt; #if WITH_HASHTABLE new_node->h.hashcode = (list->base.hashcode_fn != NULL ? list->base.hashcode_fn (new_node->value) : (size_t)(uintptr_t) new_node->value); /* Add new_node to the hash table. */ if (add_to_bucket (list, new_node) < 0) { free (new_node); return NULL; } #endif /* Add new_node to the list. */ new_node->prev = node; ASYNCSAFE(gl_list_node_t) new_node->next = node->next; new_node->next->prev = new_node; ASYNCSAFE(gl_list_node_t) node->next = new_node; list->count++; #if WITH_HASHTABLE hash_resize_after_add (list); #endif return new_node; } static gl_list_node_t gl_linked_nx_add_at (gl_list_t list, size_t position, const void *elt) { size_t count = list->count; gl_list_node_t new_node; if (!(position <= count)) /* Invalid argument. */ abort (); new_node = (struct gl_list_node_impl *) malloc (sizeof (struct gl_list_node_impl)); if (new_node == NULL) return NULL; ASYNCSAFE(const void *) new_node->value = elt; #if WITH_HASHTABLE new_node->h.hashcode = (list->base.hashcode_fn != NULL ? list->base.hashcode_fn (new_node->value) : (size_t)(uintptr_t) new_node->value); /* Add new_node to the hash table. */ if (add_to_bucket (list, new_node) < 0) { free (new_node); return NULL; } #endif /* Add new_node to the list. */ if (position <= (count / 2)) { gl_list_node_t node; node = &list->root; for (; position > 0; position--) node = node->next; new_node->prev = node; ASYNCSAFE(gl_list_node_t) new_node->next = node->next; new_node->next->prev = new_node; ASYNCSAFE(gl_list_node_t) node->next = new_node; } else { gl_list_node_t node; position = count - position; node = &list->root; for (; position > 0; position--) node = node->prev; ASYNCSAFE(gl_list_node_t) new_node->next = node; new_node->prev = node->prev; ASYNCSAFE(gl_list_node_t) new_node->prev->next = new_node; node->prev = new_node; } list->count++; #if WITH_HASHTABLE hash_resize_after_add (list); #endif return new_node; } static bool gl_linked_remove_node (gl_list_t list, gl_list_node_t node) { gl_list_node_t prev; gl_list_node_t next; #if WITH_HASHTABLE /* Remove node from the hash table. */ remove_from_bucket (list, node); #endif /* Remove node from the list. */ prev = node->prev; next = node->next; ASYNCSAFE(gl_list_node_t) prev->next = next; next->prev = prev; list->count--; if (list->base.dispose_fn != NULL) list->base.dispose_fn (node->value); free (node); return true; } static bool gl_linked_remove_at (gl_list_t list, size_t position) { size_t count = list->count; gl_list_node_t removed_node; if (!(position < count)) /* Invalid argument. */ abort (); /* Here we know count > 0. */ if (position <= ((count - 1) / 2)) { gl_list_node_t node; gl_list_node_t after_removed; node = &list->root; for (; position > 0; position--) node = node->next; removed_node = node->next; after_removed = node->next->next; ASYNCSAFE(gl_list_node_t) node->next = after_removed; after_removed->prev = node; } else { gl_list_node_t node; gl_list_node_t before_removed; position = count - 1 - position; node = &list->root; for (; position > 0; position--) node = node->prev; removed_node = node->prev; before_removed = node->prev->prev; node->prev = before_removed; ASYNCSAFE(gl_list_node_t) before_removed->next = node; } #if WITH_HASHTABLE remove_from_bucket (list, removed_node); #endif list->count--; if (list->base.dispose_fn != NULL) list->base.dispose_fn (removed_node->value); free (removed_node); return true; } static bool gl_linked_remove (gl_list_t list, const void *elt) { gl_list_node_t node = gl_linked_search_from_to (list, 0, list->count, elt); if (node != NULL) return gl_linked_remove_node (list, node); else return false; } static void gl_linked_list_free (gl_list_t list) { gl_listelement_dispose_fn dispose = list->base.dispose_fn; gl_list_node_t node; for (node = list->root.next; node != &list->root; ) { gl_list_node_t next = node->next; if (dispose != NULL) dispose (node->value); free (node); node = next; } #if WITH_HASHTABLE free (list->table); #endif free (list); } /* --------------------- gl_list_iterator_t Data Type --------------------- */ static gl_list_iterator_t gl_linked_iterator (gl_list_t list) { gl_list_iterator_t result; result.vtable = list->base.vtable; result.list = list; result.p = list->root.next; result.q = &list->root; #if defined GCC_LINT || defined lint result.i = 0; result.j = 0; result.count = 0; #endif return result; } static gl_list_iterator_t gl_linked_iterator_from_to (gl_list_t list, size_t start_index, size_t end_index) { gl_list_iterator_t result; size_t n1, n2, n3; if (!(start_index <= end_index && end_index <= list->count)) /* Invalid arguments. */ abort (); result.vtable = list->base.vtable; result.list = list; n1 = start_index; n2 = end_index - start_index; n3 = list->count - end_index; /* Find the maximum among n1, n2, n3, so as to reduce the number of loop iterations to n1 + n2 + n3 - max(n1,n2,n3). */ if (n1 > n2 && n1 > n3) { /* n1 is the maximum, use n2 and n3. */ gl_list_node_t node; size_t i; node = &list->root; for (i = n3; i > 0; i--) node = node->prev; result.q = node; for (i = n2; i > 0; i--) node = node->prev; result.p = node; } else if (n2 > n3) { /* n2 is the maximum, use n1 and n3. */ gl_list_node_t node; size_t i; node = list->root.next; for (i = n1; i > 0; i--) node = node->next; result.p = node; node = &list->root; for (i = n3; i > 0; i--) node = node->prev; result.q = node; } else { /* n3 is the maximum, use n1 and n2. */ gl_list_node_t node; size_t i; node = list->root.next; for (i = n1; i > 0; i--) node = node->next; result.p = node; for (i = n2; i > 0; i--) node = node->next; result.q = node; } #if defined GCC_LINT || defined lint result.i = 0; result.j = 0; result.count = 0; #endif return result; } static bool gl_linked_iterator_next (gl_list_iterator_t *iterator, const void **eltp, gl_list_node_t *nodep) { if (iterator->p != iterator->q) { gl_list_node_t node = (gl_list_node_t) iterator->p; *eltp = node->value; if (nodep != NULL) *nodep = node; iterator->p = node->next; return true; } else return false; } static void gl_linked_iterator_free (gl_list_iterator_t *iterator _GL_ATTRIBUTE_MAYBE_UNUSED) { } /* ---------------------- Sorted gl_list_t Data Type ---------------------- */ static gl_list_node_t _GL_ATTRIBUTE_PURE gl_linked_sortedlist_search (gl_list_t list, gl_listelement_compar_fn compar, const void *elt) { gl_list_node_t node; for (node = list->root.next; node != &list->root; node = node->next) { int cmp = compar (node->value, elt); if (cmp > 0) break; if (cmp == 0) return node; } return NULL; } static gl_list_node_t _GL_ATTRIBUTE_PURE gl_linked_sortedlist_search_from_to (gl_list_t list, gl_listelement_compar_fn compar, size_t low, size_t high, const void *elt) { size_t count = list->count; if (!(low <= high && high <= list->count)) /* Invalid arguments. */ abort (); high -= low; if (high > 0) { /* Here we know low < count. */ size_t position = low; gl_list_node_t node; if (position <= ((count - 1) / 2)) { node = list->root.next; for (; position > 0; position--) node = node->next; } else { position = count - 1 - position; node = list->root.prev; for (; position > 0; position--) node = node->prev; } do { int cmp = compar (node->value, elt); if (cmp > 0) break; if (cmp == 0) return node; node = node->next; } while (--high > 0); } return NULL; } static size_t _GL_ATTRIBUTE_PURE gl_linked_sortedlist_indexof (gl_list_t list, gl_listelement_compar_fn compar, const void *elt) { gl_list_node_t node; size_t index; for (node = list->root.next, index = 0; node != &list->root; node = node->next, index++) { int cmp = compar (node->value, elt); if (cmp > 0) break; if (cmp == 0) return index; } return (size_t)(-1); } static size_t _GL_ATTRIBUTE_PURE gl_linked_sortedlist_indexof_from_to (gl_list_t list, gl_listelement_compar_fn compar, size_t low, size_t high, const void *elt) { size_t count = list->count; if (!(low <= high && high <= list->count)) /* Invalid arguments. */ abort (); high -= low; if (high > 0) { /* Here we know low < count. */ size_t index = low; size_t position = low; gl_list_node_t node; if (position <= ((count - 1) / 2)) { node = list->root.next; for (; position > 0; position--) node = node->next; } else { position = count - 1 - position; node = list->root.prev; for (; position > 0; position--) node = node->prev; } do { int cmp = compar (node->value, elt); if (cmp > 0) break; if (cmp == 0) return index; node = node->next; index++; } while (--high > 0); } return (size_t)(-1); } static gl_list_node_t gl_linked_sortedlist_nx_add (gl_list_t list, gl_listelement_compar_fn compar, const void *elt) { gl_list_node_t node; for (node = list->root.next; node != &list->root; node = node->next) if (compar (node->value, elt) >= 0) return gl_linked_nx_add_before (list, node, elt); return gl_linked_nx_add_last (list, elt); } static bool gl_linked_sortedlist_remove (gl_list_t list, gl_listelement_compar_fn compar, const void *elt) { gl_list_node_t node; for (node = list->root.next; node != &list->root; node = node->next) { int cmp = compar (node->value, elt); if (cmp > 0) break; if (cmp == 0) return gl_linked_remove_node (list, node); } return false; } pspp-1.4.1/gl/stat.c0000644000175000017500000003274413723215640013651 0ustar00blpblp00000000000000/* Work around platform bugs in stat. Copyright (C) 2009-2020 Free Software Foundation, Inc. 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 3 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, see . */ /* Written by Eric Blake and Bruno Haible. */ /* If the user's config.h happens to include , let it include only the system's here, so that orig_stat doesn't recurse to rpl_stat. */ #define __need_system_sys_stat_h #include /* Get the original definition of stat. It might be defined as a macro. */ #include #include #undef __need_system_sys_stat_h #if defined _WIN32 && ! defined __CYGWIN__ # define WINDOWS_NATIVE #endif #if !defined WINDOWS_NATIVE static int orig_stat (const char *filename, struct stat *buf) { return stat (filename, buf); } #endif /* Specification. */ #ifdef __osf__ /* Write "sys/stat.h" here, not , otherwise OSF/1 5.1 DTK cc eliminates this include because of the preliminary #include above. */ # include "sys/stat.h" #else # include #endif #include "stat-time.h" #include #include #include #include #include "filename.h" #include "malloca.h" #include "verify.h" #ifdef WINDOWS_NATIVE # define WIN32_LEAN_AND_MEAN # include # include "stat-w32.h" /* Don't assume that UNICODE is not defined. */ # undef WIN32_FIND_DATA # define WIN32_FIND_DATA WIN32_FIND_DATAA # undef CreateFile # define CreateFile CreateFileA # undef FindFirstFile # define FindFirstFile FindFirstFileA #endif #ifdef WINDOWS_NATIVE /* Return TRUE if the given file name denotes an UNC root. */ static BOOL is_unc_root (const char *rname) { /* Test whether it has the syntax '\\server\share'. */ if (ISSLASH (rname[0]) && ISSLASH (rname[1])) { /* It starts with two slashes. Find the next slash. */ const char *p = rname + 2; const char *q = p; while (*q != '\0' && !ISSLASH (*q)) q++; if (q > p && *q != '\0') { /* Found the next slash at q. */ q++; const char *r = q; while (*r != '\0' && !ISSLASH (*r)) r++; if (r > q && *r == '\0') return TRUE; } } return FALSE; } #endif /* Store information about NAME into ST. Work around bugs with trailing slashes. Mingw has other bugs (such as st_ino always being 0 on success) which this wrapper does not work around. But at least this implementation provides the ability to emulate fchdir correctly. */ int rpl_stat (char const *name, struct stat *buf) { #ifdef WINDOWS_NATIVE /* Fill the fields ourselves, because the original stat function returns values for st_atime, st_mtime, st_ctime that depend on the current time zone. See */ /* XXX Should we convert to wchar_t* and prepend '\\?\', in order to work around length limitations ? */ /* POSIX specifies: "More than two leading characters shall be treated as a single character." */ if (ISSLASH (name[0]) && ISSLASH (name[1]) && ISSLASH (name[2])) { name += 2; while (ISSLASH (name[1])) name++; } size_t len = strlen (name); size_t drive_prefix_len = (HAS_DEVICE (name) ? 2 : 0); /* Remove trailing slashes (except the very first one, at position drive_prefix_len), but remember their presence. */ size_t rlen; bool check_dir = false; rlen = len; while (rlen > drive_prefix_len && ISSLASH (name[rlen-1])) { check_dir = true; if (rlen == drive_prefix_len + 1) break; rlen--; } /* Handle '' and 'C:'. */ if (!check_dir && rlen == drive_prefix_len) { errno = ENOENT; return -1; } /* Handle '\\'. */ if (rlen == 1 && ISSLASH (name[0]) && len >= 2) { errno = ENOENT; return -1; } const char *rname; char *malloca_rname; if (rlen == len) { rname = name; malloca_rname = NULL; } else { malloca_rname = malloca (rlen + 1); if (malloca_rname == NULL) { errno = ENOMEM; return -1; } memcpy (malloca_rname, name, rlen); malloca_rname[rlen] = '\0'; rname = malloca_rname; } /* There are two ways to get at the requested information: - by scanning the parent directory and examining the relevant directory entry, - by opening the file directly. The first approach fails for root directories (e.g. 'C:\') and UNC root directories (e.g. '\\server\share'). The second approach fails for some system files (e.g. 'C:\pagefile.sys' and 'C:\hiberfil.sys'): ERROR_SHARING_VIOLATION. The second approach gives more information (in particular, correct st_dev, st_ino, st_nlink fields). So we use the second approach and, as a fallback except for root and UNC root directories, also the first approach. */ { int ret; { /* Approach based on the file. */ /* Open a handle to the file. CreateFile */ HANDLE h = CreateFile (rname, FILE_READ_ATTRIBUTES, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, NULL, OPEN_EXISTING, /* FILE_FLAG_POSIX_SEMANTICS (treat file names that differ only in case as different) makes sense only when applied to *all* filesystem operations. */ FILE_FLAG_BACKUP_SEMANTICS /* | FILE_FLAG_POSIX_SEMANTICS */, NULL); if (h != INVALID_HANDLE_VALUE) { ret = _gl_fstat_by_handle (h, rname, buf); CloseHandle (h); goto done; } } /* Test for root and UNC root directories. */ if ((rlen == drive_prefix_len + 1 && ISSLASH (rname[drive_prefix_len])) || is_unc_root (rname)) goto failed; /* Fallback. */ { /* Approach based on the directory entry. */ if (strchr (rname, '?') != NULL || strchr (rname, '*') != NULL) { /* Other Windows API functions would fail with error ERROR_INVALID_NAME. */ if (malloca_rname != NULL) freea (malloca_rname); errno = ENOENT; return -1; } /* Get the details about the directory entry. This can be done through FindFirstFile or through FindFirstFileEx with argument FindExInfoBasic */ WIN32_FIND_DATA info; HANDLE h = FindFirstFile (rname, &info); if (h == INVALID_HANDLE_VALUE) goto failed; /* Test for error conditions before starting to fill *buf. */ if (sizeof (buf->st_size) <= 4 && info.nFileSizeHigh > 0) { FindClose (h); if (malloca_rname != NULL) freea (malloca_rname); errno = EOVERFLOW; return -1; } # if _GL_WINDOWS_STAT_INODES buf->st_dev = 0; # if _GL_WINDOWS_STAT_INODES == 2 buf->st_ino._gl_ino[0] = buf->st_ino._gl_ino[1] = 0; # else /* _GL_WINDOWS_STAT_INODES == 1 */ buf->st_ino = 0; # endif # else /* st_ino is not wide enough for identifying a file on a device. Without st_ino, st_dev is pointless. */ buf->st_dev = 0; buf->st_ino = 0; # endif /* st_mode. */ unsigned int mode = /* XXX How to handle FILE_ATTRIBUTE_REPARSE_POINT ? */ ((info.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) ? _S_IFDIR | S_IEXEC_UGO : _S_IFREG) | S_IREAD_UGO | ((info.dwFileAttributes & FILE_ATTRIBUTE_READONLY) ? 0 : S_IWRITE_UGO); if (!(info.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) { /* Determine whether the file is executable by looking at the file name suffix. */ if (info.nFileSizeHigh > 0 || info.nFileSizeLow > 0) { const char *last_dot = NULL; const char *p; for (p = info.cFileName; *p != '\0'; p++) if (*p == '.') last_dot = p; if (last_dot != NULL) { const char *suffix = last_dot + 1; if (_stricmp (suffix, "exe") == 0 || _stricmp (suffix, "bat") == 0 || _stricmp (suffix, "cmd") == 0 || _stricmp (suffix, "com") == 0) mode |= S_IEXEC_UGO; } } } buf->st_mode = mode; /* st_nlink. Ignore hard links here. */ buf->st_nlink = 1; /* There's no easy way to map the Windows SID concept to an integer. */ buf->st_uid = 0; buf->st_gid = 0; /* st_rdev is irrelevant for normal files and directories. */ buf->st_rdev = 0; /* st_size. */ if (sizeof (buf->st_size) <= 4) /* Range check already done above. */ buf->st_size = info.nFileSizeLow; else buf->st_size = ((long long) info.nFileSizeHigh << 32) | (long long) info.nFileSizeLow; /* st_atime, st_mtime, st_ctime. */ # if _GL_WINDOWS_STAT_TIMESPEC buf->st_atim = _gl_convert_FILETIME_to_timespec (&info.ftLastAccessTime); buf->st_mtim = _gl_convert_FILETIME_to_timespec (&info.ftLastWriteTime); buf->st_ctim = _gl_convert_FILETIME_to_timespec (&info.ftCreationTime); # else buf->st_atime = _gl_convert_FILETIME_to_POSIX (&info.ftLastAccessTime); buf->st_mtime = _gl_convert_FILETIME_to_POSIX (&info.ftLastWriteTime); buf->st_ctime = _gl_convert_FILETIME_to_POSIX (&info.ftCreationTime); # endif FindClose (h); ret = 0; } done: if (ret >= 0 && check_dir && !S_ISDIR (buf->st_mode)) { errno = ENOTDIR; ret = -1; } if (malloca_rname != NULL) { int saved_errno = errno; freea (malloca_rname); errno = saved_errno; } return ret; } failed: { DWORD error = GetLastError (); #if 0 fprintf (stderr, "rpl_stat error 0x%x\n", (unsigned int) error); #endif if (malloca_rname != NULL) freea (malloca_rname); switch (error) { /* Some of these errors probably cannot happen with the specific flags that we pass to CreateFile. But who knows... */ case ERROR_FILE_NOT_FOUND: /* The last component of rname does not exist. */ case ERROR_PATH_NOT_FOUND: /* Some directory component in rname does not exist. */ case ERROR_BAD_PATHNAME: /* rname is such as '\\server'. */ case ERROR_BAD_NET_NAME: /* rname is such as '\\server\nonexistentshare'. */ case ERROR_INVALID_NAME: /* rname contains wildcards, misplaced colon, etc. */ case ERROR_DIRECTORY: errno = ENOENT; break; case ERROR_ACCESS_DENIED: /* rname is such as 'C:\System Volume Information\foo'. */ case ERROR_SHARING_VIOLATION: /* rname is such as 'C:\pagefile.sys' (second approach only). */ /* XXX map to EACCES or EPERM? */ errno = EACCES; break; case ERROR_OUTOFMEMORY: errno = ENOMEM; break; case ERROR_WRITE_PROTECT: errno = EROFS; break; case ERROR_WRITE_FAULT: case ERROR_READ_FAULT: case ERROR_GEN_FAILURE: errno = EIO; break; case ERROR_BUFFER_OVERFLOW: case ERROR_FILENAME_EXCED_RANGE: errno = ENAMETOOLONG; break; case ERROR_DELETE_PENDING: /* XXX map to EACCES or EPERM? */ errno = EPERM; break; default: errno = EINVAL; break; } return -1; } #else int result = orig_stat (name, buf); if (result == 0) { # if REPLACE_FUNC_STAT_FILE /* Solaris 9 mistakenly succeeds when given a non-directory with a trailing slash. */ if (!S_ISDIR (buf->st_mode)) { size_t len = strlen (name); if (ISSLASH (name[len - 1])) { errno = ENOTDIR; return -1; } } # endif /* REPLACE_FUNC_STAT_FILE */ result = stat_time_normalize (result, buf); } return result; #endif } pspp-1.4.1/gl/stdio.in.h0000644000175000017500000015276213723215640014435 0ustar00blpblp00000000000000/* A GNU-like . Copyright (C) 2004, 2007-2020 Free Software Foundation, Inc. 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 3, 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, see . */ #if __GNUC__ >= 3 @PRAGMA_SYSTEM_HEADER@ #endif @PRAGMA_COLUMNS@ #if defined __need_FILE || defined __need___FILE || defined _GL_ALREADY_INCLUDING_STDIO_H /* Special invocation convention: - Inside glibc header files. - On OSF/1 5.1 we have a sequence of nested includes -> -> -> -> -> -> -> . In this situation, the functions are not yet declared, therefore we cannot provide the C++ aliases. */ #@INCLUDE_NEXT@ @NEXT_STDIO_H@ #else /* Normal invocation convention. */ #ifndef _@GUARD_PREFIX@_STDIO_H #define _GL_ALREADY_INCLUDING_STDIO_H /* The include_next requires a split double-inclusion guard. */ #@INCLUDE_NEXT@ @NEXT_STDIO_H@ #undef _GL_ALREADY_INCLUDING_STDIO_H #ifndef _@GUARD_PREFIX@_STDIO_H #define _@GUARD_PREFIX@_STDIO_H /* Get va_list. Needed on many systems, including glibc 2.8. */ #include #include /* Get off_t and ssize_t. Needed on many systems, including glibc 2.8 and eglibc 2.11.2. May also define off_t to a 64-bit type on native Windows. */ #include /* The __attribute__ feature is available in gcc versions 2.5 and later. The __-protected variants of the attributes 'format' and 'printf' are accepted by gcc versions 2.6.4 (effectively 2.7) and later. We enable _GL_ATTRIBUTE_FORMAT only if these are supported too, because gnulib and libintl do '#define printf __printf__' when they override the 'printf' function. */ #ifndef _GL_ATTRIBUTE_FORMAT # if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 7) # define _GL_ATTRIBUTE_FORMAT(spec) __attribute__ ((__format__ spec)) # else # define _GL_ATTRIBUTE_FORMAT(spec) /* empty */ # endif #endif /* _GL_ATTRIBUTE_FORMAT_PRINTF indicates to GCC that the function takes a format string and arguments, where the format string directives are the ones standardized by ISO C99 and POSIX. */ #if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4) # define _GL_ATTRIBUTE_FORMAT_PRINTF(formatstring_parameter, first_argument) \ _GL_ATTRIBUTE_FORMAT ((__gnu_printf__, formatstring_parameter, first_argument)) #else # define _GL_ATTRIBUTE_FORMAT_PRINTF(formatstring_parameter, first_argument) \ _GL_ATTRIBUTE_FORMAT ((__printf__, formatstring_parameter, first_argument)) #endif /* _GL_ATTRIBUTE_FORMAT_PRINTF_SYSTEM is like _GL_ATTRIBUTE_FORMAT_PRINTF, except that it indicates to GCC that the supported format string directives are the ones of the system printf(), rather than the ones standardized by ISO C99 and POSIX. */ #if GNULIB_PRINTF_ATTRIBUTE_FLAVOR_GNU # define _GL_ATTRIBUTE_FORMAT_PRINTF_SYSTEM(formatstring_parameter, first_argument) \ _GL_ATTRIBUTE_FORMAT_PRINTF (formatstring_parameter, first_argument) #else # define _GL_ATTRIBUTE_FORMAT_PRINTF_SYSTEM(formatstring_parameter, first_argument) \ _GL_ATTRIBUTE_FORMAT ((__printf__, formatstring_parameter, first_argument)) #endif /* _GL_ATTRIBUTE_FORMAT_SCANF indicates to GCC that the function takes a format string and arguments, where the format string directives are the ones standardized by ISO C99 and POSIX. */ #if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4) # define _GL_ATTRIBUTE_FORMAT_SCANF(formatstring_parameter, first_argument) \ _GL_ATTRIBUTE_FORMAT ((__gnu_scanf__, formatstring_parameter, first_argument)) #else # define _GL_ATTRIBUTE_FORMAT_SCANF(formatstring_parameter, first_argument) \ _GL_ATTRIBUTE_FORMAT ((__scanf__, formatstring_parameter, first_argument)) #endif /* _GL_ATTRIBUTE_FORMAT_SCANF_SYSTEM is like _GL_ATTRIBUTE_FORMAT_SCANF, except that it indicates to GCC that the supported format string directives are the ones of the system scanf(), rather than the ones standardized by ISO C99 and POSIX. */ #define _GL_ATTRIBUTE_FORMAT_SCANF_SYSTEM(formatstring_parameter, first_argument) \ _GL_ATTRIBUTE_FORMAT ((__scanf__, formatstring_parameter, first_argument)) /* Solaris 10 and NetBSD 7.0 declare renameat in , not in . */ /* But in any case avoid namespace pollution on glibc systems. */ #if (@GNULIB_RENAMEAT@ || defined GNULIB_POSIXCHECK) && (defined __sun || defined __NetBSD__) \ && ! defined __GLIBC__ # include #endif /* Android 4.3 declares renameat in , not in . */ /* But in any case avoid namespace pollution on glibc systems. */ #if (@GNULIB_RENAMEAT@ || defined GNULIB_POSIXCHECK) && defined __ANDROID__ \ && ! defined __GLIBC__ # include #endif /* MSVC declares 'perror' in , not in . We must include it before we #define perror rpl_perror. */ /* But in any case avoid namespace pollution on glibc systems. */ #if (@GNULIB_PERROR@ || defined GNULIB_POSIXCHECK) \ && (defined _WIN32 && ! defined __CYGWIN__) \ && ! defined __GLIBC__ # include #endif /* MSVC declares 'remove' in , not in . We must include it before we #define remove rpl_remove. */ /* MSVC declares 'rename' in , not in . We must include it before we #define rename rpl_rename. */ /* But in any case avoid namespace pollution on glibc systems. */ #if (@GNULIB_REMOVE@ || @GNULIB_RENAME@ || defined GNULIB_POSIXCHECK) \ && (defined _WIN32 && ! defined __CYGWIN__) \ && ! defined __GLIBC__ # include #endif /* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */ /* The definition of _GL_ARG_NONNULL is copied here. */ /* The definition of _GL_WARN_ON_USE is copied here. */ /* Macros for stringification. */ #define _GL_STDIO_STRINGIZE(token) #token #define _GL_STDIO_MACROEXPAND_AND_STRINGIZE(token) _GL_STDIO_STRINGIZE(token) /* When also using extern inline, suppress the use of static inline in standard headers of problematic Apple configurations, as Libc at least through Libc-825.26 (2013-04-09) mishandles it; see, e.g., . Perhaps Apple will fix this some day. */ #if (defined _GL_EXTERN_INLINE_IN_USE && defined __APPLE__ \ && defined __GNUC__ && defined __STDC__) # undef putc_unlocked #endif #if @GNULIB_DPRINTF@ # if @REPLACE_DPRINTF@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # define dprintf rpl_dprintf # endif _GL_FUNCDECL_RPL (dprintf, int, (int fd, const char *restrict format, ...) _GL_ATTRIBUTE_FORMAT_PRINTF (2, 3) _GL_ARG_NONNULL ((2))); _GL_CXXALIAS_RPL (dprintf, int, (int fd, const char *restrict format, ...)); # else # if !@HAVE_DPRINTF@ _GL_FUNCDECL_SYS (dprintf, int, (int fd, const char *restrict format, ...) _GL_ATTRIBUTE_FORMAT_PRINTF (2, 3) _GL_ARG_NONNULL ((2))); # endif _GL_CXXALIAS_SYS (dprintf, int, (int fd, const char *restrict format, ...)); # endif _GL_CXXALIASWARN (dprintf); #elif defined GNULIB_POSIXCHECK # undef dprintf # if HAVE_RAW_DECL_DPRINTF _GL_WARN_ON_USE (dprintf, "dprintf is unportable - " "use gnulib module dprintf for portability"); # endif #endif #if @GNULIB_FCLOSE@ /* Close STREAM and its underlying file descriptor. */ # if @REPLACE_FCLOSE@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # define fclose rpl_fclose # endif _GL_FUNCDECL_RPL (fclose, int, (FILE *stream) _GL_ARG_NONNULL ((1))); _GL_CXXALIAS_RPL (fclose, int, (FILE *stream)); # else _GL_CXXALIAS_SYS (fclose, int, (FILE *stream)); # endif # if __GLIBC__ >= 2 _GL_CXXALIASWARN (fclose); # endif #elif defined GNULIB_POSIXCHECK # undef fclose /* Assume fclose is always declared. */ _GL_WARN_ON_USE (fclose, "fclose is not always POSIX compliant - " "use gnulib module fclose for portable POSIX compliance"); #endif #if @GNULIB_FDOPEN@ # if @REPLACE_FDOPEN@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef fdopen # define fdopen rpl_fdopen # endif _GL_FUNCDECL_RPL (fdopen, FILE *, (int fd, const char *mode) _GL_ARG_NONNULL ((2))); _GL_CXXALIAS_RPL (fdopen, FILE *, (int fd, const char *mode)); # else _GL_CXXALIAS_SYS (fdopen, FILE *, (int fd, const char *mode)); # endif _GL_CXXALIASWARN (fdopen); #elif defined GNULIB_POSIXCHECK # undef fdopen /* Assume fdopen is always declared. */ _GL_WARN_ON_USE (fdopen, "fdopen on native Windows platforms is not POSIX compliant - " "use gnulib module fdopen for portability"); #endif #if @GNULIB_FFLUSH@ /* Flush all pending data on STREAM according to POSIX rules. Both output and seekable input streams are supported. Note! LOSS OF DATA can occur if fflush is applied on an input stream that is _not_seekable_ or on an update stream that is _not_seekable_ and in which the most recent operation was input. Seekability can be tested with lseek(fileno(fp),0,SEEK_CUR). */ # if @REPLACE_FFLUSH@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # define fflush rpl_fflush # endif _GL_FUNCDECL_RPL (fflush, int, (FILE *gl_stream)); _GL_CXXALIAS_RPL (fflush, int, (FILE *gl_stream)); # else _GL_CXXALIAS_SYS (fflush, int, (FILE *gl_stream)); # endif # if __GLIBC__ >= 2 _GL_CXXALIASWARN (fflush); # endif #elif defined GNULIB_POSIXCHECK # undef fflush /* Assume fflush is always declared. */ _GL_WARN_ON_USE (fflush, "fflush is not always POSIX compliant - " "use gnulib module fflush for portable POSIX compliance"); #endif #if @GNULIB_FGETC@ # if @REPLACE_STDIO_READ_FUNCS@ && @GNULIB_STDIO_H_NONBLOCKING@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef fgetc # define fgetc rpl_fgetc # endif _GL_FUNCDECL_RPL (fgetc, int, (FILE *stream) _GL_ARG_NONNULL ((1))); _GL_CXXALIAS_RPL (fgetc, int, (FILE *stream)); # else _GL_CXXALIAS_SYS (fgetc, int, (FILE *stream)); # endif # if __GLIBC__ >= 2 _GL_CXXALIASWARN (fgetc); # endif #endif #if @GNULIB_FGETS@ # if @REPLACE_STDIO_READ_FUNCS@ && @GNULIB_STDIO_H_NONBLOCKING@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef fgets # define fgets rpl_fgets # endif _GL_FUNCDECL_RPL (fgets, char *, (char *restrict s, int n, FILE *restrict stream) _GL_ARG_NONNULL ((1, 3))); _GL_CXXALIAS_RPL (fgets, char *, (char *restrict s, int n, FILE *restrict stream)); # else _GL_CXXALIAS_SYS (fgets, char *, (char *restrict s, int n, FILE *restrict stream)); # endif # if __GLIBC__ >= 2 _GL_CXXALIASWARN (fgets); # endif #endif #if @GNULIB_FOPEN@ # if @REPLACE_FOPEN@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef fopen # define fopen rpl_fopen # endif _GL_FUNCDECL_RPL (fopen, FILE *, (const char *restrict filename, const char *restrict mode) _GL_ARG_NONNULL ((1, 2))); _GL_CXXALIAS_RPL (fopen, FILE *, (const char *restrict filename, const char *restrict mode)); # else _GL_CXXALIAS_SYS (fopen, FILE *, (const char *restrict filename, const char *restrict mode)); # endif # if __GLIBC__ >= 2 _GL_CXXALIASWARN (fopen); # endif #elif defined GNULIB_POSIXCHECK # undef fopen /* Assume fopen is always declared. */ _GL_WARN_ON_USE (fopen, "fopen on native Windows platforms is not POSIX compliant - " "use gnulib module fopen for portability"); #endif #if @GNULIB_FPRINTF_POSIX@ || @GNULIB_FPRINTF@ # if (@GNULIB_FPRINTF_POSIX@ && @REPLACE_FPRINTF@) \ || (@GNULIB_FPRINTF@ && @REPLACE_STDIO_WRITE_FUNCS@ && (@GNULIB_STDIO_H_NONBLOCKING@ || @GNULIB_STDIO_H_SIGPIPE@)) # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # define fprintf rpl_fprintf # endif # define GNULIB_overrides_fprintf 1 # if @GNULIB_FPRINTF_POSIX@ || @GNULIB_VFPRINTF_POSIX@ _GL_FUNCDECL_RPL (fprintf, int, (FILE *restrict fp, const char *restrict format, ...) _GL_ATTRIBUTE_FORMAT_PRINTF (2, 3) _GL_ARG_NONNULL ((1, 2))); # else _GL_FUNCDECL_RPL (fprintf, int, (FILE *restrict fp, const char *restrict format, ...) _GL_ATTRIBUTE_FORMAT_PRINTF_SYSTEM (2, 3) _GL_ARG_NONNULL ((1, 2))); # endif _GL_CXXALIAS_RPL (fprintf, int, (FILE *restrict fp, const char *restrict format, ...)); # else _GL_CXXALIAS_SYS (fprintf, int, (FILE *restrict fp, const char *restrict format, ...)); # endif # if __GLIBC__ >= 2 _GL_CXXALIASWARN (fprintf); # endif #endif #if !@GNULIB_FPRINTF_POSIX@ && defined GNULIB_POSIXCHECK # if !GNULIB_overrides_fprintf # undef fprintf # endif /* Assume fprintf is always declared. */ _GL_WARN_ON_USE (fprintf, "fprintf is not always POSIX compliant - " "use gnulib module fprintf-posix for portable " "POSIX compliance"); #endif #if @GNULIB_FPURGE@ /* Discard all pending buffered I/O data on STREAM. STREAM must not be wide-character oriented. When discarding pending output, the file position is set back to where it was before the write calls. When discarding pending input, the file position is advanced to match the end of the previously read input. Return 0 if successful. Upon error, return -1 and set errno. */ # if @REPLACE_FPURGE@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # define fpurge rpl_fpurge # endif _GL_FUNCDECL_RPL (fpurge, int, (FILE *gl_stream) _GL_ARG_NONNULL ((1))); _GL_CXXALIAS_RPL (fpurge, int, (FILE *gl_stream)); # else # if !@HAVE_DECL_FPURGE@ _GL_FUNCDECL_SYS (fpurge, int, (FILE *gl_stream) _GL_ARG_NONNULL ((1))); # endif _GL_CXXALIAS_SYS (fpurge, int, (FILE *gl_stream)); # endif _GL_CXXALIASWARN (fpurge); #elif defined GNULIB_POSIXCHECK # undef fpurge # if HAVE_RAW_DECL_FPURGE _GL_WARN_ON_USE (fpurge, "fpurge is not always present - " "use gnulib module fpurge for portability"); # endif #endif #if @GNULIB_FPUTC@ # if @REPLACE_STDIO_WRITE_FUNCS@ && (@GNULIB_STDIO_H_NONBLOCKING@ || @GNULIB_STDIO_H_SIGPIPE@) # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef fputc # define fputc rpl_fputc # endif _GL_FUNCDECL_RPL (fputc, int, (int c, FILE *stream) _GL_ARG_NONNULL ((2))); _GL_CXXALIAS_RPL (fputc, int, (int c, FILE *stream)); # else _GL_CXXALIAS_SYS (fputc, int, (int c, FILE *stream)); # endif # if __GLIBC__ >= 2 _GL_CXXALIASWARN (fputc); # endif #endif #if @GNULIB_FPUTS@ # if @REPLACE_STDIO_WRITE_FUNCS@ && (@GNULIB_STDIO_H_NONBLOCKING@ || @GNULIB_STDIO_H_SIGPIPE@) # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef fputs # define fputs rpl_fputs # endif _GL_FUNCDECL_RPL (fputs, int, (const char *restrict string, FILE *restrict stream) _GL_ARG_NONNULL ((1, 2))); _GL_CXXALIAS_RPL (fputs, int, (const char *restrict string, FILE *restrict stream)); # else _GL_CXXALIAS_SYS (fputs, int, (const char *restrict string, FILE *restrict stream)); # endif # if __GLIBC__ >= 2 _GL_CXXALIASWARN (fputs); # endif #endif #if @GNULIB_FREAD@ # if @REPLACE_STDIO_READ_FUNCS@ && @GNULIB_STDIO_H_NONBLOCKING@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef fread # define fread rpl_fread # endif _GL_FUNCDECL_RPL (fread, size_t, (void *restrict ptr, size_t s, size_t n, FILE *restrict stream) _GL_ARG_NONNULL ((4))); _GL_CXXALIAS_RPL (fread, size_t, (void *restrict ptr, size_t s, size_t n, FILE *restrict stream)); # else _GL_CXXALIAS_SYS (fread, size_t, (void *restrict ptr, size_t s, size_t n, FILE *restrict stream)); # endif # if __GLIBC__ >= 2 _GL_CXXALIASWARN (fread); # endif #endif #if @GNULIB_FREOPEN@ # if @REPLACE_FREOPEN@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef freopen # define freopen rpl_freopen # endif _GL_FUNCDECL_RPL (freopen, FILE *, (const char *restrict filename, const char *restrict mode, FILE *restrict stream) _GL_ARG_NONNULL ((2, 3))); _GL_CXXALIAS_RPL (freopen, FILE *, (const char *restrict filename, const char *restrict mode, FILE *restrict stream)); # else _GL_CXXALIAS_SYS (freopen, FILE *, (const char *restrict filename, const char *restrict mode, FILE *restrict stream)); # endif # if __GLIBC__ >= 2 _GL_CXXALIASWARN (freopen); # endif #elif defined GNULIB_POSIXCHECK # undef freopen /* Assume freopen is always declared. */ _GL_WARN_ON_USE (freopen, "freopen on native Windows platforms is not POSIX compliant - " "use gnulib module freopen for portability"); #endif #if @GNULIB_FSCANF@ # if @REPLACE_STDIO_READ_FUNCS@ && @GNULIB_STDIO_H_NONBLOCKING@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef fscanf # define fscanf rpl_fscanf # endif _GL_FUNCDECL_RPL (fscanf, int, (FILE *restrict stream, const char *restrict format, ...) _GL_ATTRIBUTE_FORMAT_SCANF_SYSTEM (2, 3) _GL_ARG_NONNULL ((1, 2))); _GL_CXXALIAS_RPL (fscanf, int, (FILE *restrict stream, const char *restrict format, ...)); # else _GL_CXXALIAS_SYS (fscanf, int, (FILE *restrict stream, const char *restrict format, ...)); # endif # if __GLIBC__ >= 2 _GL_CXXALIASWARN (fscanf); # endif #endif /* Set up the following warnings, based on which modules are in use. GNU Coding Standards discourage the use of fseek, since it imposes an arbitrary limitation on some 32-bit hosts. Remember that the fseek module depends on the fseeko module, so we only have three cases to consider: 1. The developer is not using either module. Issue a warning under GNULIB_POSIXCHECK for both functions, to remind them that both functions have bugs on some systems. _GL_NO_LARGE_FILES has no impact on this warning. 2. The developer is using both modules. They may be unaware of the arbitrary limitations of fseek, so issue a warning under GNULIB_POSIXCHECK. On the other hand, they may be using both modules intentionally, so the developer can define _GL_NO_LARGE_FILES in the compilation units where the use of fseek is safe, to silence the warning. 3. The developer is using the fseeko module, but not fseek. Gnulib guarantees that fseek will still work around platform bugs in that case, but we presume that the developer is aware of the pitfalls of fseek and was trying to avoid it, so issue a warning even when GNULIB_POSIXCHECK is undefined. Again, _GL_NO_LARGE_FILES can be defined to silence the warning in particular compilation units. In C++ compilations with GNULIB_NAMESPACE, in order to avoid that fseek gets defined as a macro, it is recommended that the developer uses the fseek module, even if he is not calling the fseek function. Most gnulib clients that perform stream operations should fall into category 3. */ #if @GNULIB_FSEEK@ # if defined GNULIB_POSIXCHECK && !defined _GL_NO_LARGE_FILES # define _GL_FSEEK_WARN /* Category 2, above. */ # undef fseek # endif # if @REPLACE_FSEEK@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef fseek # define fseek rpl_fseek # endif _GL_FUNCDECL_RPL (fseek, int, (FILE *fp, long offset, int whence) _GL_ARG_NONNULL ((1))); _GL_CXXALIAS_RPL (fseek, int, (FILE *fp, long offset, int whence)); # else _GL_CXXALIAS_SYS (fseek, int, (FILE *fp, long offset, int whence)); # endif # if __GLIBC__ >= 2 _GL_CXXALIASWARN (fseek); # endif #endif #if @GNULIB_FSEEKO@ # if !@GNULIB_FSEEK@ && !defined _GL_NO_LARGE_FILES # define _GL_FSEEK_WARN /* Category 3, above. */ # undef fseek # endif # if @REPLACE_FSEEKO@ /* Provide an fseeko function that is aware of a preceding fflush(), and which detects pipes. */ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef fseeko # define fseeko rpl_fseeko # endif _GL_FUNCDECL_RPL (fseeko, int, (FILE *fp, off_t offset, int whence) _GL_ARG_NONNULL ((1))); _GL_CXXALIAS_RPL (fseeko, int, (FILE *fp, off_t offset, int whence)); # else # if ! @HAVE_DECL_FSEEKO@ _GL_FUNCDECL_SYS (fseeko, int, (FILE *fp, off_t offset, int whence) _GL_ARG_NONNULL ((1))); # endif _GL_CXXALIAS_SYS (fseeko, int, (FILE *fp, off_t offset, int whence)); # endif _GL_CXXALIASWARN (fseeko); #elif defined GNULIB_POSIXCHECK # define _GL_FSEEK_WARN /* Category 1, above. */ # undef fseek # undef fseeko # if HAVE_RAW_DECL_FSEEKO _GL_WARN_ON_USE (fseeko, "fseeko is unportable - " "use gnulib module fseeko for portability"); # endif #endif #ifdef _GL_FSEEK_WARN # undef _GL_FSEEK_WARN /* Here, either fseek is undefined (but C89 guarantees that it is declared), or it is defined as rpl_fseek (declared above). */ _GL_WARN_ON_USE (fseek, "fseek cannot handle files larger than 4 GB " "on 32-bit platforms - " "use fseeko function for handling of large files"); #endif /* ftell, ftello. See the comments on fseek/fseeko. */ #if @GNULIB_FTELL@ # if defined GNULIB_POSIXCHECK && !defined _GL_NO_LARGE_FILES # define _GL_FTELL_WARN /* Category 2, above. */ # undef ftell # endif # if @REPLACE_FTELL@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef ftell # define ftell rpl_ftell # endif _GL_FUNCDECL_RPL (ftell, long, (FILE *fp) _GL_ARG_NONNULL ((1))); _GL_CXXALIAS_RPL (ftell, long, (FILE *fp)); # else _GL_CXXALIAS_SYS (ftell, long, (FILE *fp)); # endif # if __GLIBC__ >= 2 _GL_CXXALIASWARN (ftell); # endif #endif #if @GNULIB_FTELLO@ # if !@GNULIB_FTELL@ && !defined _GL_NO_LARGE_FILES # define _GL_FTELL_WARN /* Category 3, above. */ # undef ftell # endif # if @REPLACE_FTELLO@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef ftello # define ftello rpl_ftello # endif _GL_FUNCDECL_RPL (ftello, off_t, (FILE *fp) _GL_ARG_NONNULL ((1))); _GL_CXXALIAS_RPL (ftello, off_t, (FILE *fp)); # else # if ! @HAVE_DECL_FTELLO@ _GL_FUNCDECL_SYS (ftello, off_t, (FILE *fp) _GL_ARG_NONNULL ((1))); # endif _GL_CXXALIAS_SYS (ftello, off_t, (FILE *fp)); # endif _GL_CXXALIASWARN (ftello); #elif defined GNULIB_POSIXCHECK # define _GL_FTELL_WARN /* Category 1, above. */ # undef ftell # undef ftello # if HAVE_RAW_DECL_FTELLO _GL_WARN_ON_USE (ftello, "ftello is unportable - " "use gnulib module ftello for portability"); # endif #endif #ifdef _GL_FTELL_WARN # undef _GL_FTELL_WARN /* Here, either ftell is undefined (but C89 guarantees that it is declared), or it is defined as rpl_ftell (declared above). */ _GL_WARN_ON_USE (ftell, "ftell cannot handle files larger than 4 GB " "on 32-bit platforms - " "use ftello function for handling of large files"); #endif #if @GNULIB_FWRITE@ # if @REPLACE_STDIO_WRITE_FUNCS@ && (@GNULIB_STDIO_H_NONBLOCKING@ || @GNULIB_STDIO_H_SIGPIPE@) # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef fwrite # define fwrite rpl_fwrite # endif _GL_FUNCDECL_RPL (fwrite, size_t, (const void *restrict ptr, size_t s, size_t n, FILE *restrict stream) _GL_ARG_NONNULL ((1, 4))); _GL_CXXALIAS_RPL (fwrite, size_t, (const void *restrict ptr, size_t s, size_t n, FILE *restrict stream)); # else _GL_CXXALIAS_SYS (fwrite, size_t, (const void *restrict ptr, size_t s, size_t n, FILE *restrict stream)); /* Work around bug 11959 when fortifying glibc 2.4 through 2.15 , which sometimes causes an unwanted diagnostic for fwrite calls. This affects only function declaration attributes under certain versions of gcc and clang, and is not needed for C++. */ # if (0 < __USE_FORTIFY_LEVEL \ && __GLIBC__ == 2 && 4 <= __GLIBC_MINOR__ && __GLIBC_MINOR__ <= 15 \ && 3 < __GNUC__ + (4 <= __GNUC_MINOR__) \ && !defined __cplusplus) # undef fwrite # undef fwrite_unlocked extern size_t __REDIRECT (rpl_fwrite, (const void *__restrict, size_t, size_t, FILE *__restrict), fwrite); extern size_t __REDIRECT (rpl_fwrite_unlocked, (const void *__restrict, size_t, size_t, FILE *__restrict), fwrite_unlocked); # define fwrite rpl_fwrite # define fwrite_unlocked rpl_fwrite_unlocked # endif # endif # if __GLIBC__ >= 2 _GL_CXXALIASWARN (fwrite); # endif #endif #if @GNULIB_GETC@ # if @REPLACE_STDIO_READ_FUNCS@ && @GNULIB_STDIO_H_NONBLOCKING@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef getc # define getc rpl_fgetc # endif _GL_FUNCDECL_RPL (fgetc, int, (FILE *stream) _GL_ARG_NONNULL ((1))); _GL_CXXALIAS_RPL_1 (getc, rpl_fgetc, int, (FILE *stream)); # else _GL_CXXALIAS_SYS (getc, int, (FILE *stream)); # endif # if __GLIBC__ >= 2 _GL_CXXALIASWARN (getc); # endif #endif #if @GNULIB_GETCHAR@ # if @REPLACE_STDIO_READ_FUNCS@ && @GNULIB_STDIO_H_NONBLOCKING@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef getchar # define getchar rpl_getchar # endif _GL_FUNCDECL_RPL (getchar, int, (void)); _GL_CXXALIAS_RPL (getchar, int, (void)); # else _GL_CXXALIAS_SYS (getchar, int, (void)); # endif # if __GLIBC__ >= 2 _GL_CXXALIASWARN (getchar); # endif #endif #if @GNULIB_GETDELIM@ /* Read input, up to (and including) the next occurrence of DELIMITER, from STREAM, store it in *LINEPTR (and NUL-terminate it). *LINEPTR is a pointer returned from malloc (or NULL), pointing to *LINESIZE bytes of space. It is realloc'd as necessary. Return the number of bytes read and stored at *LINEPTR (not including the NUL terminator), or -1 on error or EOF. */ # if @REPLACE_GETDELIM@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef getdelim # define getdelim rpl_getdelim # endif _GL_FUNCDECL_RPL (getdelim, ssize_t, (char **restrict lineptr, size_t *restrict linesize, int delimiter, FILE *restrict stream) _GL_ARG_NONNULL ((1, 2, 4))); _GL_CXXALIAS_RPL (getdelim, ssize_t, (char **restrict lineptr, size_t *restrict linesize, int delimiter, FILE *restrict stream)); # else # if !@HAVE_DECL_GETDELIM@ _GL_FUNCDECL_SYS (getdelim, ssize_t, (char **restrict lineptr, size_t *restrict linesize, int delimiter, FILE *restrict stream) _GL_ARG_NONNULL ((1, 2, 4))); # endif _GL_CXXALIAS_SYS (getdelim, ssize_t, (char **restrict lineptr, size_t *restrict linesize, int delimiter, FILE *restrict stream)); # endif _GL_CXXALIASWARN (getdelim); #elif defined GNULIB_POSIXCHECK # undef getdelim # if HAVE_RAW_DECL_GETDELIM _GL_WARN_ON_USE (getdelim, "getdelim is unportable - " "use gnulib module getdelim for portability"); # endif #endif #if @GNULIB_GETLINE@ /* Read a line, up to (and including) the next newline, from STREAM, store it in *LINEPTR (and NUL-terminate it). *LINEPTR is a pointer returned from malloc (or NULL), pointing to *LINESIZE bytes of space. It is realloc'd as necessary. Return the number of bytes read and stored at *LINEPTR (not including the NUL terminator), or -1 on error or EOF. */ # if @REPLACE_GETLINE@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef getline # define getline rpl_getline # endif _GL_FUNCDECL_RPL (getline, ssize_t, (char **restrict lineptr, size_t *restrict linesize, FILE *restrict stream) _GL_ARG_NONNULL ((1, 2, 3))); _GL_CXXALIAS_RPL (getline, ssize_t, (char **restrict lineptr, size_t *restrict linesize, FILE *restrict stream)); # else # if !@HAVE_DECL_GETLINE@ _GL_FUNCDECL_SYS (getline, ssize_t, (char **restrict lineptr, size_t *restrict linesize, FILE *restrict stream) _GL_ARG_NONNULL ((1, 2, 3))); # endif _GL_CXXALIAS_SYS (getline, ssize_t, (char **restrict lineptr, size_t *restrict linesize, FILE *restrict stream)); # endif # if @HAVE_DECL_GETLINE@ _GL_CXXALIASWARN (getline); # endif #elif defined GNULIB_POSIXCHECK # undef getline # if HAVE_RAW_DECL_GETLINE _GL_WARN_ON_USE (getline, "getline is unportable - " "use gnulib module getline for portability"); # endif #endif /* It is very rare that the developer ever has full control of stdin, so any use of gets warrants an unconditional warning; besides, C11 removed it. */ #undef gets #if HAVE_RAW_DECL_GETS && !defined __cplusplus _GL_WARN_ON_USE (gets, "gets is a security hole - use fgets instead"); #endif #if @GNULIB_OBSTACK_PRINTF@ || @GNULIB_OBSTACK_PRINTF_POSIX@ struct obstack; /* Grow an obstack with formatted output. Return the number of bytes added to OBS. No trailing nul byte is added, and the object should be closed with obstack_finish before use. Upon memory allocation error, call obstack_alloc_failed_handler. Upon other error, return -1. */ # if @REPLACE_OBSTACK_PRINTF@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # define obstack_printf rpl_obstack_printf # endif _GL_FUNCDECL_RPL (obstack_printf, int, (struct obstack *obs, const char *format, ...) _GL_ATTRIBUTE_FORMAT_PRINTF (2, 3) _GL_ARG_NONNULL ((1, 2))); _GL_CXXALIAS_RPL (obstack_printf, int, (struct obstack *obs, const char *format, ...)); # else # if !@HAVE_DECL_OBSTACK_PRINTF@ _GL_FUNCDECL_SYS (obstack_printf, int, (struct obstack *obs, const char *format, ...) _GL_ATTRIBUTE_FORMAT_PRINTF (2, 3) _GL_ARG_NONNULL ((1, 2))); # endif _GL_CXXALIAS_SYS (obstack_printf, int, (struct obstack *obs, const char *format, ...)); # endif _GL_CXXALIASWARN (obstack_printf); # if @REPLACE_OBSTACK_PRINTF@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # define obstack_vprintf rpl_obstack_vprintf # endif _GL_FUNCDECL_RPL (obstack_vprintf, int, (struct obstack *obs, const char *format, va_list args) _GL_ATTRIBUTE_FORMAT_PRINTF (2, 0) _GL_ARG_NONNULL ((1, 2))); _GL_CXXALIAS_RPL (obstack_vprintf, int, (struct obstack *obs, const char *format, va_list args)); # else # if !@HAVE_DECL_OBSTACK_PRINTF@ _GL_FUNCDECL_SYS (obstack_vprintf, int, (struct obstack *obs, const char *format, va_list args) _GL_ATTRIBUTE_FORMAT_PRINTF (2, 0) _GL_ARG_NONNULL ((1, 2))); # endif _GL_CXXALIAS_SYS (obstack_vprintf, int, (struct obstack *obs, const char *format, va_list args)); # endif _GL_CXXALIASWARN (obstack_vprintf); #endif #if @GNULIB_PCLOSE@ # if !@HAVE_PCLOSE@ _GL_FUNCDECL_SYS (pclose, int, (FILE *stream) _GL_ARG_NONNULL ((1))); # endif _GL_CXXALIAS_SYS (pclose, int, (FILE *stream)); _GL_CXXALIASWARN (pclose); #elif defined GNULIB_POSIXCHECK # undef pclose # if HAVE_RAW_DECL_PCLOSE _GL_WARN_ON_USE (pclose, "pclose is unportable - " "use gnulib module pclose for more portability"); # endif #endif #if @GNULIB_PERROR@ /* Print a message to standard error, describing the value of ERRNO, (if STRING is not NULL and not empty) prefixed with STRING and ": ", and terminated with a newline. */ # if @REPLACE_PERROR@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # define perror rpl_perror # endif _GL_FUNCDECL_RPL (perror, void, (const char *string)); _GL_CXXALIAS_RPL (perror, void, (const char *string)); # else _GL_CXXALIAS_SYS (perror, void, (const char *string)); # endif # if __GLIBC__ >= 2 _GL_CXXALIASWARN (perror); # endif #elif defined GNULIB_POSIXCHECK # undef perror /* Assume perror is always declared. */ _GL_WARN_ON_USE (perror, "perror is not always POSIX compliant - " "use gnulib module perror for portability"); #endif #if @GNULIB_POPEN@ # if @REPLACE_POPEN@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef popen # define popen rpl_popen # endif _GL_FUNCDECL_RPL (popen, FILE *, (const char *cmd, const char *mode) _GL_ARG_NONNULL ((1, 2))); _GL_CXXALIAS_RPL (popen, FILE *, (const char *cmd, const char *mode)); # else # if !@HAVE_POPEN@ _GL_FUNCDECL_SYS (popen, FILE *, (const char *cmd, const char *mode) _GL_ARG_NONNULL ((1, 2))); # endif _GL_CXXALIAS_SYS (popen, FILE *, (const char *cmd, const char *mode)); # endif _GL_CXXALIASWARN (popen); #elif defined GNULIB_POSIXCHECK # undef popen # if HAVE_RAW_DECL_POPEN _GL_WARN_ON_USE (popen, "popen is buggy on some platforms - " "use gnulib module popen or pipe for more portability"); # endif #endif #if @GNULIB_PRINTF_POSIX@ || @GNULIB_PRINTF@ # if (@GNULIB_PRINTF_POSIX@ && @REPLACE_PRINTF@) \ || (@GNULIB_PRINTF@ && @REPLACE_STDIO_WRITE_FUNCS@ && (@GNULIB_STDIO_H_NONBLOCKING@ || @GNULIB_STDIO_H_SIGPIPE@)) # if defined __GNUC__ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) /* Don't break __attribute__((format(printf,M,N))). */ # define printf __printf__ # endif # if @GNULIB_PRINTF_POSIX@ || @GNULIB_VFPRINTF_POSIX@ _GL_FUNCDECL_RPL_1 (__printf__, int, (const char *restrict format, ...) __asm__ (@ASM_SYMBOL_PREFIX@ _GL_STDIO_MACROEXPAND_AND_STRINGIZE(rpl_printf)) _GL_ATTRIBUTE_FORMAT_PRINTF (1, 2) _GL_ARG_NONNULL ((1))); # else _GL_FUNCDECL_RPL_1 (__printf__, int, (const char *restrict format, ...) __asm__ (@ASM_SYMBOL_PREFIX@ _GL_STDIO_MACROEXPAND_AND_STRINGIZE(rpl_printf)) _GL_ATTRIBUTE_FORMAT_PRINTF_SYSTEM (1, 2) _GL_ARG_NONNULL ((1))); # endif _GL_CXXALIAS_RPL_1 (printf, __printf__, int, (const char *format, ...)); # else # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # define printf rpl_printf # endif _GL_FUNCDECL_RPL (printf, int, (const char *restrict format, ...) _GL_ATTRIBUTE_FORMAT_PRINTF (1, 2) _GL_ARG_NONNULL ((1))); _GL_CXXALIAS_RPL (printf, int, (const char *restrict format, ...)); # endif # define GNULIB_overrides_printf 1 # else _GL_CXXALIAS_SYS (printf, int, (const char *restrict format, ...)); # endif # if __GLIBC__ >= 2 _GL_CXXALIASWARN (printf); # endif #endif #if !@GNULIB_PRINTF_POSIX@ && defined GNULIB_POSIXCHECK # if !GNULIB_overrides_printf # undef printf # endif /* Assume printf is always declared. */ _GL_WARN_ON_USE (printf, "printf is not always POSIX compliant - " "use gnulib module printf-posix for portable " "POSIX compliance"); #endif #if @GNULIB_PUTC@ # if @REPLACE_STDIO_WRITE_FUNCS@ && (@GNULIB_STDIO_H_NONBLOCKING@ || @GNULIB_STDIO_H_SIGPIPE@) # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef putc # define putc rpl_fputc # endif _GL_FUNCDECL_RPL (fputc, int, (int c, FILE *stream) _GL_ARG_NONNULL ((2))); _GL_CXXALIAS_RPL_1 (putc, rpl_fputc, int, (int c, FILE *stream)); # else _GL_CXXALIAS_SYS (putc, int, (int c, FILE *stream)); # endif # if __GLIBC__ >= 2 _GL_CXXALIASWARN (putc); # endif #endif #if @GNULIB_PUTCHAR@ # if @REPLACE_STDIO_WRITE_FUNCS@ && (@GNULIB_STDIO_H_NONBLOCKING@ || @GNULIB_STDIO_H_SIGPIPE@) # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef putchar # define putchar rpl_putchar # endif _GL_FUNCDECL_RPL (putchar, int, (int c)); _GL_CXXALIAS_RPL (putchar, int, (int c)); # else _GL_CXXALIAS_SYS (putchar, int, (int c)); # endif # if __GLIBC__ >= 2 _GL_CXXALIASWARN (putchar); # endif #endif #if @GNULIB_PUTS@ # if @REPLACE_STDIO_WRITE_FUNCS@ && (@GNULIB_STDIO_H_NONBLOCKING@ || @GNULIB_STDIO_H_SIGPIPE@) # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef puts # define puts rpl_puts # endif _GL_FUNCDECL_RPL (puts, int, (const char *string) _GL_ARG_NONNULL ((1))); _GL_CXXALIAS_RPL (puts, int, (const char *string)); # else _GL_CXXALIAS_SYS (puts, int, (const char *string)); # endif # if __GLIBC__ >= 2 _GL_CXXALIASWARN (puts); # endif #endif #if @GNULIB_REMOVE@ # if @REPLACE_REMOVE@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef remove # define remove rpl_remove # endif _GL_FUNCDECL_RPL (remove, int, (const char *name) _GL_ARG_NONNULL ((1))); _GL_CXXALIAS_RPL (remove, int, (const char *name)); # else _GL_CXXALIAS_SYS (remove, int, (const char *name)); # endif # if __GLIBC__ >= 2 _GL_CXXALIASWARN (remove); # endif #elif defined GNULIB_POSIXCHECK # undef remove /* Assume remove is always declared. */ _GL_WARN_ON_USE (remove, "remove cannot handle directories on some platforms - " "use gnulib module remove for more portability"); #endif #if @GNULIB_RENAME@ # if @REPLACE_RENAME@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef rename # define rename rpl_rename # endif _GL_FUNCDECL_RPL (rename, int, (const char *old_filename, const char *new_filename) _GL_ARG_NONNULL ((1, 2))); _GL_CXXALIAS_RPL (rename, int, (const char *old_filename, const char *new_filename)); # else _GL_CXXALIAS_SYS (rename, int, (const char *old_filename, const char *new_filename)); # endif # if __GLIBC__ >= 2 _GL_CXXALIASWARN (rename); # endif #elif defined GNULIB_POSIXCHECK # undef rename /* Assume rename is always declared. */ _GL_WARN_ON_USE (rename, "rename is buggy on some platforms - " "use gnulib module rename for more portability"); #endif #if @GNULIB_RENAMEAT@ # if @REPLACE_RENAMEAT@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef renameat # define renameat rpl_renameat # endif _GL_FUNCDECL_RPL (renameat, int, (int fd1, char const *file1, int fd2, char const *file2) _GL_ARG_NONNULL ((2, 4))); _GL_CXXALIAS_RPL (renameat, int, (int fd1, char const *file1, int fd2, char const *file2)); # else # if !@HAVE_RENAMEAT@ _GL_FUNCDECL_SYS (renameat, int, (int fd1, char const *file1, int fd2, char const *file2) _GL_ARG_NONNULL ((2, 4))); # endif _GL_CXXALIAS_SYS (renameat, int, (int fd1, char const *file1, int fd2, char const *file2)); # endif _GL_CXXALIASWARN (renameat); #elif defined GNULIB_POSIXCHECK # undef renameat # if HAVE_RAW_DECL_RENAMEAT _GL_WARN_ON_USE (renameat, "renameat is not portable - " "use gnulib module renameat for portability"); # endif #endif #if @GNULIB_SCANF@ # if @REPLACE_STDIO_READ_FUNCS@ && @GNULIB_STDIO_H_NONBLOCKING@ # if defined __GNUC__ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef scanf /* Don't break __attribute__((format(scanf,M,N))). */ # define scanf __scanf__ # endif _GL_FUNCDECL_RPL_1 (__scanf__, int, (const char *restrict format, ...) __asm__ (@ASM_SYMBOL_PREFIX@ _GL_STDIO_MACROEXPAND_AND_STRINGIZE(rpl_scanf)) _GL_ATTRIBUTE_FORMAT_SCANF_SYSTEM (1, 2) _GL_ARG_NONNULL ((1))); _GL_CXXALIAS_RPL_1 (scanf, __scanf__, int, (const char *restrict format, ...)); # else # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef scanf # define scanf rpl_scanf # endif _GL_FUNCDECL_RPL (scanf, int, (const char *restrict format, ...) _GL_ATTRIBUTE_FORMAT_SCANF_SYSTEM (1, 2) _GL_ARG_NONNULL ((1))); _GL_CXXALIAS_RPL (scanf, int, (const char *restrict format, ...)); # endif # else _GL_CXXALIAS_SYS (scanf, int, (const char *restrict format, ...)); # endif # if __GLIBC__ >= 2 _GL_CXXALIASWARN (scanf); # endif #endif #if @GNULIB_SNPRINTF@ # if @REPLACE_SNPRINTF@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # define snprintf rpl_snprintf # endif _GL_FUNCDECL_RPL (snprintf, int, (char *restrict str, size_t size, const char *restrict format, ...) _GL_ATTRIBUTE_FORMAT_PRINTF (3, 4) _GL_ARG_NONNULL ((3))); _GL_CXXALIAS_RPL (snprintf, int, (char *restrict str, size_t size, const char *restrict format, ...)); # else # if !@HAVE_DECL_SNPRINTF@ _GL_FUNCDECL_SYS (snprintf, int, (char *restrict str, size_t size, const char *restrict format, ...) _GL_ATTRIBUTE_FORMAT_PRINTF (3, 4) _GL_ARG_NONNULL ((3))); # endif _GL_CXXALIAS_SYS (snprintf, int, (char *restrict str, size_t size, const char *restrict format, ...)); # endif _GL_CXXALIASWARN (snprintf); #elif defined GNULIB_POSIXCHECK # undef snprintf # if HAVE_RAW_DECL_SNPRINTF _GL_WARN_ON_USE (snprintf, "snprintf is unportable - " "use gnulib module snprintf for portability"); # endif #endif /* Some people would argue that all sprintf uses should be warned about (for example, OpenBSD issues a link warning for it), since it can cause security holes due to buffer overruns. However, we believe that sprintf can be used safely, and is more efficient than snprintf in those safe cases; and as proof of our belief, we use sprintf in several gnulib modules. So this header intentionally avoids adding a warning to sprintf except when GNULIB_POSIXCHECK is defined. */ #if @GNULIB_SPRINTF_POSIX@ # if @REPLACE_SPRINTF@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # define sprintf rpl_sprintf # endif _GL_FUNCDECL_RPL (sprintf, int, (char *restrict str, const char *restrict format, ...) _GL_ATTRIBUTE_FORMAT_PRINTF (2, 3) _GL_ARG_NONNULL ((1, 2))); _GL_CXXALIAS_RPL (sprintf, int, (char *restrict str, const char *restrict format, ...)); # else _GL_CXXALIAS_SYS (sprintf, int, (char *restrict str, const char *restrict format, ...)); # endif # if __GLIBC__ >= 2 _GL_CXXALIASWARN (sprintf); # endif #elif defined GNULIB_POSIXCHECK # undef sprintf /* Assume sprintf is always declared. */ _GL_WARN_ON_USE (sprintf, "sprintf is not always POSIX compliant - " "use gnulib module sprintf-posix for portable " "POSIX compliance"); #endif #if @GNULIB_TMPFILE@ # if @REPLACE_TMPFILE@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # define tmpfile rpl_tmpfile # endif _GL_FUNCDECL_RPL (tmpfile, FILE *, (void)); _GL_CXXALIAS_RPL (tmpfile, FILE *, (void)); # else _GL_CXXALIAS_SYS (tmpfile, FILE *, (void)); # endif # if __GLIBC__ >= 2 _GL_CXXALIASWARN (tmpfile); # endif #elif defined GNULIB_POSIXCHECK # undef tmpfile # if HAVE_RAW_DECL_TMPFILE _GL_WARN_ON_USE (tmpfile, "tmpfile is not usable on mingw - " "use gnulib module tmpfile for portability"); # endif #endif #if @GNULIB_VASPRINTF@ /* Write formatted output to a string dynamically allocated with malloc(). If the memory allocation succeeds, store the address of the string in *RESULT and return the number of resulting bytes, excluding the trailing NUL. Upon memory allocation error, or some other error, return -1. */ # if @REPLACE_VASPRINTF@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # define asprintf rpl_asprintf # endif _GL_FUNCDECL_RPL (asprintf, int, (char **result, const char *format, ...) _GL_ATTRIBUTE_FORMAT_PRINTF (2, 3) _GL_ARG_NONNULL ((1, 2))); _GL_CXXALIAS_RPL (asprintf, int, (char **result, const char *format, ...)); # else # if !@HAVE_VASPRINTF@ _GL_FUNCDECL_SYS (asprintf, int, (char **result, const char *format, ...) _GL_ATTRIBUTE_FORMAT_PRINTF (2, 3) _GL_ARG_NONNULL ((1, 2))); # endif _GL_CXXALIAS_SYS (asprintf, int, (char **result, const char *format, ...)); # endif _GL_CXXALIASWARN (asprintf); # if @REPLACE_VASPRINTF@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # define vasprintf rpl_vasprintf # endif _GL_FUNCDECL_RPL (vasprintf, int, (char **result, const char *format, va_list args) _GL_ATTRIBUTE_FORMAT_PRINTF (2, 0) _GL_ARG_NONNULL ((1, 2))); _GL_CXXALIAS_RPL (vasprintf, int, (char **result, const char *format, va_list args)); # else # if !@HAVE_VASPRINTF@ _GL_FUNCDECL_SYS (vasprintf, int, (char **result, const char *format, va_list args) _GL_ATTRIBUTE_FORMAT_PRINTF (2, 0) _GL_ARG_NONNULL ((1, 2))); # endif _GL_CXXALIAS_SYS (vasprintf, int, (char **result, const char *format, va_list args)); # endif _GL_CXXALIASWARN (vasprintf); #endif #if @GNULIB_VDPRINTF@ # if @REPLACE_VDPRINTF@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # define vdprintf rpl_vdprintf # endif _GL_FUNCDECL_RPL (vdprintf, int, (int fd, const char *restrict format, va_list args) _GL_ATTRIBUTE_FORMAT_PRINTF (2, 0) _GL_ARG_NONNULL ((2))); _GL_CXXALIAS_RPL (vdprintf, int, (int fd, const char *restrict format, va_list args)); # else # if !@HAVE_VDPRINTF@ _GL_FUNCDECL_SYS (vdprintf, int, (int fd, const char *restrict format, va_list args) _GL_ATTRIBUTE_FORMAT_PRINTF (2, 0) _GL_ARG_NONNULL ((2))); # endif /* Need to cast, because on Solaris, the third parameter will likely be __va_list args. */ _GL_CXXALIAS_SYS_CAST (vdprintf, int, (int fd, const char *restrict format, va_list args)); # endif # if __GLIBC__ >= 2 _GL_CXXALIASWARN (vdprintf); # endif #elif defined GNULIB_POSIXCHECK # undef vdprintf # if HAVE_RAW_DECL_VDPRINTF _GL_WARN_ON_USE (vdprintf, "vdprintf is unportable - " "use gnulib module vdprintf for portability"); # endif #endif #if @GNULIB_VFPRINTF_POSIX@ || @GNULIB_VFPRINTF@ # if (@GNULIB_VFPRINTF_POSIX@ && @REPLACE_VFPRINTF@) \ || (@GNULIB_VFPRINTF@ && @REPLACE_STDIO_WRITE_FUNCS@ && (@GNULIB_STDIO_H_NONBLOCKING@ || @GNULIB_STDIO_H_SIGPIPE@)) # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # define vfprintf rpl_vfprintf # endif # define GNULIB_overrides_vfprintf 1 # if @GNULIB_VFPRINTF_POSIX@ _GL_FUNCDECL_RPL (vfprintf, int, (FILE *restrict fp, const char *restrict format, va_list args) _GL_ATTRIBUTE_FORMAT_PRINTF (2, 0) _GL_ARG_NONNULL ((1, 2))); # else _GL_FUNCDECL_RPL (vfprintf, int, (FILE *restrict fp, const char *restrict format, va_list args) _GL_ATTRIBUTE_FORMAT_PRINTF_SYSTEM (2, 0) _GL_ARG_NONNULL ((1, 2))); # endif _GL_CXXALIAS_RPL (vfprintf, int, (FILE *restrict fp, const char *restrict format, va_list args)); # else /* Need to cast, because on Solaris, the third parameter is __va_list args and GCC's fixincludes did not change this to __gnuc_va_list. */ _GL_CXXALIAS_SYS_CAST (vfprintf, int, (FILE *restrict fp, const char *restrict format, va_list args)); # endif # if __GLIBC__ >= 2 _GL_CXXALIASWARN (vfprintf); # endif #endif #if !@GNULIB_VFPRINTF_POSIX@ && defined GNULIB_POSIXCHECK # if !GNULIB_overrides_vfprintf # undef vfprintf # endif /* Assume vfprintf is always declared. */ _GL_WARN_ON_USE (vfprintf, "vfprintf is not always POSIX compliant - " "use gnulib module vfprintf-posix for portable " "POSIX compliance"); #endif #if @GNULIB_VFSCANF@ # if @REPLACE_STDIO_READ_FUNCS@ && @GNULIB_STDIO_H_NONBLOCKING@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef vfscanf # define vfscanf rpl_vfscanf # endif _GL_FUNCDECL_RPL (vfscanf, int, (FILE *restrict stream, const char *restrict format, va_list args) _GL_ATTRIBUTE_FORMAT_SCANF_SYSTEM (2, 0) _GL_ARG_NONNULL ((1, 2))); _GL_CXXALIAS_RPL (vfscanf, int, (FILE *restrict stream, const char *restrict format, va_list args)); # else _GL_CXXALIAS_SYS (vfscanf, int, (FILE *restrict stream, const char *restrict format, va_list args)); # endif _GL_CXXALIASWARN (vfscanf); #endif #if @GNULIB_VPRINTF_POSIX@ || @GNULIB_VPRINTF@ # if (@GNULIB_VPRINTF_POSIX@ && @REPLACE_VPRINTF@) \ || (@GNULIB_VPRINTF@ && @REPLACE_STDIO_WRITE_FUNCS@ && (@GNULIB_STDIO_H_NONBLOCKING@ || @GNULIB_STDIO_H_SIGPIPE@)) # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # define vprintf rpl_vprintf # endif # define GNULIB_overrides_vprintf 1 # if @GNULIB_VPRINTF_POSIX@ || @GNULIB_VFPRINTF_POSIX@ _GL_FUNCDECL_RPL (vprintf, int, (const char *restrict format, va_list args) _GL_ATTRIBUTE_FORMAT_PRINTF (1, 0) _GL_ARG_NONNULL ((1))); # else _GL_FUNCDECL_RPL (vprintf, int, (const char *restrict format, va_list args) _GL_ATTRIBUTE_FORMAT_PRINTF_SYSTEM (1, 0) _GL_ARG_NONNULL ((1))); # endif _GL_CXXALIAS_RPL (vprintf, int, (const char *restrict format, va_list args)); # else /* Need to cast, because on Solaris, the second parameter is __va_list args and GCC's fixincludes did not change this to __gnuc_va_list. */ _GL_CXXALIAS_SYS_CAST (vprintf, int, (const char *restrict format, va_list args)); # endif # if __GLIBC__ >= 2 _GL_CXXALIASWARN (vprintf); # endif #endif #if !@GNULIB_VPRINTF_POSIX@ && defined GNULIB_POSIXCHECK # if !GNULIB_overrides_vprintf # undef vprintf # endif /* Assume vprintf is always declared. */ _GL_WARN_ON_USE (vprintf, "vprintf is not always POSIX compliant - " "use gnulib module vprintf-posix for portable " "POSIX compliance"); #endif #if @GNULIB_VSCANF@ # if @REPLACE_STDIO_READ_FUNCS@ && @GNULIB_STDIO_H_NONBLOCKING@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef vscanf # define vscanf rpl_vscanf # endif _GL_FUNCDECL_RPL (vscanf, int, (const char *restrict format, va_list args) _GL_ATTRIBUTE_FORMAT_SCANF_SYSTEM (1, 0) _GL_ARG_NONNULL ((1))); _GL_CXXALIAS_RPL (vscanf, int, (const char *restrict format, va_list args)); # else _GL_CXXALIAS_SYS (vscanf, int, (const char *restrict format, va_list args)); # endif _GL_CXXALIASWARN (vscanf); #endif #if @GNULIB_VSNPRINTF@ # if @REPLACE_VSNPRINTF@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # define vsnprintf rpl_vsnprintf # endif _GL_FUNCDECL_RPL (vsnprintf, int, (char *restrict str, size_t size, const char *restrict format, va_list args) _GL_ATTRIBUTE_FORMAT_PRINTF (3, 0) _GL_ARG_NONNULL ((3))); _GL_CXXALIAS_RPL (vsnprintf, int, (char *restrict str, size_t size, const char *restrict format, va_list args)); # else # if !@HAVE_DECL_VSNPRINTF@ _GL_FUNCDECL_SYS (vsnprintf, int, (char *restrict str, size_t size, const char *restrict format, va_list args) _GL_ATTRIBUTE_FORMAT_PRINTF (3, 0) _GL_ARG_NONNULL ((3))); # endif _GL_CXXALIAS_SYS (vsnprintf, int, (char *restrict str, size_t size, const char *restrict format, va_list args)); # endif _GL_CXXALIASWARN (vsnprintf); #elif defined GNULIB_POSIXCHECK # undef vsnprintf # if HAVE_RAW_DECL_VSNPRINTF _GL_WARN_ON_USE (vsnprintf, "vsnprintf is unportable - " "use gnulib module vsnprintf for portability"); # endif #endif #if @GNULIB_VSPRINTF_POSIX@ # if @REPLACE_VSPRINTF@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # define vsprintf rpl_vsprintf # endif _GL_FUNCDECL_RPL (vsprintf, int, (char *restrict str, const char *restrict format, va_list args) _GL_ATTRIBUTE_FORMAT_PRINTF (2, 0) _GL_ARG_NONNULL ((1, 2))); _GL_CXXALIAS_RPL (vsprintf, int, (char *restrict str, const char *restrict format, va_list args)); # else /* Need to cast, because on Solaris, the third parameter is __va_list args and GCC's fixincludes did not change this to __gnuc_va_list. */ _GL_CXXALIAS_SYS_CAST (vsprintf, int, (char *restrict str, const char *restrict format, va_list args)); # endif # if __GLIBC__ >= 2 _GL_CXXALIASWARN (vsprintf); # endif #elif defined GNULIB_POSIXCHECK # undef vsprintf /* Assume vsprintf is always declared. */ _GL_WARN_ON_USE (vsprintf, "vsprintf is not always POSIX compliant - " "use gnulib module vsprintf-posix for portable " "POSIX compliance"); #endif #endif /* _@GUARD_PREFIX@_STDIO_H */ #endif /* _@GUARD_PREFIX@_STDIO_H */ #endif pspp-1.4.1/gl/xreadlink.h0000644000175000017500000000171313723215640014654 0ustar00blpblp00000000000000/* Reading symbolic links without size limitation. Copyright (C) 2001, 2003-2004, 2007, 2009-2020 Free Software Foundation, Inc. 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 3 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, see . */ /* Written by Jim Meyering */ extern char *xreadlink (char const *filename); #if GNULIB_XREADLINKAT extern char *xreadlinkat (int fd, char const *filename); #endif pspp-1.4.1/gl/unistd.in.h0000644000175000017500000016531613723215640014620 0ustar00blpblp00000000000000/* Substitute for and wrapper around . Copyright (C) 2003-2020 Free Software Foundation, Inc. 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 3, 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, see . */ #ifndef _@GUARD_PREFIX@_UNISTD_H #if __GNUC__ >= 3 @PRAGMA_SYSTEM_HEADER@ #endif @PRAGMA_COLUMNS@ #if @HAVE_UNISTD_H@ && defined _GL_INCLUDING_UNISTD_H /* Special invocation convention: - On Mac OS X 10.3.9 we have a sequence of nested includes -> -> -> In this situation, the functions are not yet declared, therefore we cannot provide the C++ aliases. */ #@INCLUDE_NEXT@ @NEXT_UNISTD_H@ #else /* Normal invocation convention. */ /* The include_next requires a split double-inclusion guard. */ #if @HAVE_UNISTD_H@ # define _GL_INCLUDING_UNISTD_H # @INCLUDE_NEXT@ @NEXT_UNISTD_H@ # undef _GL_INCLUDING_UNISTD_H #endif /* Get all possible declarations of gethostname(). */ #if @GNULIB_GETHOSTNAME@ && @UNISTD_H_HAVE_WINSOCK2_H@ \ && !defined _GL_INCLUDING_WINSOCK2_H # define _GL_INCLUDING_WINSOCK2_H # include # undef _GL_INCLUDING_WINSOCK2_H #endif #if !defined _@GUARD_PREFIX@_UNISTD_H && !defined _GL_INCLUDING_WINSOCK2_H #define _@GUARD_PREFIX@_UNISTD_H /* NetBSD 5.0 mis-defines NULL. Also get size_t. */ /* But avoid namespace pollution on glibc systems. */ #ifndef __GLIBC__ # include #endif /* mingw doesn't define the SEEK_* or *_FILENO macros in . */ /* MSVC declares 'unlink' in , not in . We must include it before we #define unlink rpl_unlink. */ /* Cygwin 1.7.1 declares symlinkat in , not in . */ /* But avoid namespace pollution on glibc systems. */ #if (!(defined SEEK_CUR && defined SEEK_END && defined SEEK_SET) \ || ((@GNULIB_UNLINK@ || defined GNULIB_POSIXCHECK) \ && (defined _WIN32 && ! defined __CYGWIN__)) \ || ((@GNULIB_SYMLINKAT@ || defined GNULIB_POSIXCHECK) \ && defined __CYGWIN__)) \ && ! defined __GLIBC__ # include #endif /* Cygwin 1.7.1 and Android 4.3 declare unlinkat in , not in . */ /* But avoid namespace pollution on glibc systems. */ #if (@GNULIB_UNLINKAT@ || defined GNULIB_POSIXCHECK) \ && (defined __CYGWIN__ || defined __ANDROID__) \ && ! defined __GLIBC__ # include #endif /* mingw fails to declare _exit in . */ /* mingw, MSVC, BeOS, Haiku declare environ in , not in . */ /* Solaris declares getcwd not only in but also in . */ /* OSF Tru64 Unix cannot see gnulib rpl_strtod when system is included here. */ /* But avoid namespace pollution on glibc systems. */ #if !defined __GLIBC__ && !defined __osf__ # define __need_system_stdlib_h # include # undef __need_system_stdlib_h #endif /* Native Windows platforms declare chdir, getcwd, rmdir in and/or , not in . They also declare access(), chmod(), close(), dup(), dup2(), isatty(), lseek(), read(), unlink(), write() in . */ #if ((@GNULIB_CHDIR@ || @GNULIB_GETCWD@ || @GNULIB_RMDIR@ \ || defined GNULIB_POSIXCHECK) \ && (defined _WIN32 && ! defined __CYGWIN__)) # include /* mingw32, mingw64 */ # include /* mingw64, MSVC 9 */ #elif (@GNULIB_CLOSE@ || @GNULIB_DUP@ || @GNULIB_DUP2@ || @GNULIB_ISATTY@ \ || @GNULIB_LSEEK@ || @GNULIB_READ@ || @GNULIB_UNLINK@ || @GNULIB_WRITE@ \ || defined GNULIB_POSIXCHECK) \ && (defined _WIN32 && ! defined __CYGWIN__) # include #endif /* AIX and OSF/1 5.1 declare getdomainname in , not in . NonStop Kernel declares gethostname in , not in . */ /* But avoid namespace pollution on glibc systems. */ #if ((@GNULIB_GETDOMAINNAME@ && (defined _AIX || defined __osf__)) \ || (@GNULIB_GETHOSTNAME@ && defined __TANDEM)) \ && !defined __GLIBC__ # include #endif /* Mac OS X 10.13, Solaris 11.4, and Android 9.0 declare getentropy in , not in . */ /* But avoid namespace pollution on glibc systems. */ #if (@GNULIB_GETENTROPY@ || defined GNULIB_POSIXCHECK) \ && ((defined __APPLE__ && defined __MACH__) || defined __sun \ || defined __ANDROID__) \ && @UNISTD_H_HAVE_SYS_RANDOM_H@ \ && !defined __GLIBC__ # include #endif /* Android 4.3 declares fchownat in , not in . */ /* But avoid namespace pollution on glibc systems. */ #if (@GNULIB_FCHOWNAT@ || defined GNULIB_POSIXCHECK) && defined __ANDROID__ \ && !defined __GLIBC__ # include #endif /* MSVC defines off_t in . May also define off_t to a 64-bit type on native Windows. */ /* But avoid namespace pollution on glibc systems. */ #ifndef __GLIBC__ /* Get off_t, ssize_t. */ # include #endif /* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */ /* The definition of _GL_ARG_NONNULL is copied here. */ /* The definition of _GL_WARN_ON_USE is copied here. */ /* Get getopt(), optarg, optind, opterr, optopt. */ #if @GNULIB_GETOPT_POSIX@ && @GNULIB_UNISTD_H_GETOPT@ && !defined _GL_SYSTEM_GETOPT # include # include #endif #ifndef _GL_INLINE_HEADER_BEGIN #error "Please include config.h first." #endif _GL_INLINE_HEADER_BEGIN #ifndef _GL_UNISTD_INLINE # define _GL_UNISTD_INLINE _GL_INLINE #endif /* Hide some function declarations from . */ #if @GNULIB_GETHOSTNAME@ && @UNISTD_H_HAVE_WINSOCK2_H@ # if !defined _@GUARD_PREFIX@_SYS_SOCKET_H # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef socket # define socket socket_used_without_including_sys_socket_h # undef connect # define connect connect_used_without_including_sys_socket_h # undef accept # define accept accept_used_without_including_sys_socket_h # undef bind # define bind bind_used_without_including_sys_socket_h # undef getpeername # define getpeername getpeername_used_without_including_sys_socket_h # undef getsockname # define getsockname getsockname_used_without_including_sys_socket_h # undef getsockopt # define getsockopt getsockopt_used_without_including_sys_socket_h # undef listen # define listen listen_used_without_including_sys_socket_h # undef recv # define recv recv_used_without_including_sys_socket_h # undef send # define send send_used_without_including_sys_socket_h # undef recvfrom # define recvfrom recvfrom_used_without_including_sys_socket_h # undef sendto # define sendto sendto_used_without_including_sys_socket_h # undef setsockopt # define setsockopt setsockopt_used_without_including_sys_socket_h # undef shutdown # define shutdown shutdown_used_without_including_sys_socket_h # else _GL_WARN_ON_USE (socket, "socket() used without including "); _GL_WARN_ON_USE (connect, "connect() used without including "); _GL_WARN_ON_USE (accept, "accept() used without including "); _GL_WARN_ON_USE (bind, "bind() used without including "); _GL_WARN_ON_USE (getpeername, "getpeername() used without including "); _GL_WARN_ON_USE (getsockname, "getsockname() used without including "); _GL_WARN_ON_USE (getsockopt, "getsockopt() used without including "); _GL_WARN_ON_USE (listen, "listen() used without including "); _GL_WARN_ON_USE (recv, "recv() used without including "); _GL_WARN_ON_USE (send, "send() used without including "); _GL_WARN_ON_USE (recvfrom, "recvfrom() used without including "); _GL_WARN_ON_USE (sendto, "sendto() used without including "); _GL_WARN_ON_USE (setsockopt, "setsockopt() used without including "); _GL_WARN_ON_USE (shutdown, "shutdown() used without including "); # endif # endif # if !defined _@GUARD_PREFIX@_SYS_SELECT_H # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef select # define select select_used_without_including_sys_select_h # else _GL_WARN_ON_USE (select, "select() used without including "); # endif # endif #endif /* OS/2 EMX lacks these macros. */ #ifndef STDIN_FILENO # define STDIN_FILENO 0 #endif #ifndef STDOUT_FILENO # define STDOUT_FILENO 1 #endif #ifndef STDERR_FILENO # define STDERR_FILENO 2 #endif /* Ensure *_OK macros exist. */ #ifndef F_OK # define F_OK 0 # define X_OK 1 # define W_OK 2 # define R_OK 4 #endif /* Declare overridden functions. */ #if @GNULIB_ACCESS@ # if @REPLACE_ACCESS@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef access # define access rpl_access # endif _GL_FUNCDECL_RPL (access, int, (const char *file, int mode) _GL_ARG_NONNULL ((1))); _GL_CXXALIAS_RPL (access, int, (const char *file, int mode)); # else _GL_CXXALIAS_SYS (access, int, (const char *file, int mode)); # endif _GL_CXXALIASWARN (access); #elif defined GNULIB_POSIXCHECK # undef access # if HAVE_RAW_DECL_ACCESS /* The access() function is a security risk. */ _GL_WARN_ON_USE (access, "access does not always support X_OK - " "use gnulib module access for portability; " "also, this function is a security risk - " "use the gnulib module faccessat instead"); # endif #endif #if @GNULIB_CHDIR@ _GL_CXXALIAS_SYS (chdir, int, (const char *file) _GL_ARG_NONNULL ((1))); _GL_CXXALIASWARN (chdir); #elif defined GNULIB_POSIXCHECK # undef chdir # if HAVE_RAW_DECL_CHDIR _GL_WARN_ON_USE (chown, "chdir is not always in - " "use gnulib module chdir for portability"); # endif #endif #if @GNULIB_CHOWN@ /* Change the owner of FILE to UID (if UID is not -1) and the group of FILE to GID (if GID is not -1). Follow symbolic links. Return 0 if successful, otherwise -1 and errno set. See the POSIX:2008 specification . */ # if @REPLACE_DUP2@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # define dup2 rpl_dup2 # endif _GL_FUNCDECL_RPL (dup2, int, (int oldfd, int newfd)); _GL_CXXALIAS_RPL (dup2, int, (int oldfd, int newfd)); # else _GL_CXXALIAS_SYS (dup2, int, (int oldfd, int newfd)); # endif _GL_CXXALIASWARN (dup2); #elif defined GNULIB_POSIXCHECK # undef dup2 # if HAVE_RAW_DECL_DUP2 _GL_WARN_ON_USE (dup2, "dup2 is unportable - " "use gnulib module dup2 for portability"); # endif #endif #if @GNULIB_DUP3@ /* Copy the file descriptor OLDFD into file descriptor NEWFD, with the specified flags. The flags are a bitmask, possibly including O_CLOEXEC (defined in ) and O_TEXT, O_BINARY (defined in "binary-io.h"). Close NEWFD first if it is open. Return newfd if successful, otherwise -1 and errno set. See the Linux man page at . */ # if @HAVE_DUP3@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # define dup3 rpl_dup3 # endif _GL_FUNCDECL_RPL (dup3, int, (int oldfd, int newfd, int flags)); _GL_CXXALIAS_RPL (dup3, int, (int oldfd, int newfd, int flags)); # else _GL_FUNCDECL_SYS (dup3, int, (int oldfd, int newfd, int flags)); _GL_CXXALIAS_SYS (dup3, int, (int oldfd, int newfd, int flags)); # endif _GL_CXXALIASWARN (dup3); #elif defined GNULIB_POSIXCHECK # undef dup3 # if HAVE_RAW_DECL_DUP3 _GL_WARN_ON_USE (dup3, "dup3 is unportable - " "use gnulib module dup3 for portability"); # endif #endif #if @GNULIB_ENVIRON@ # if defined __CYGWIN__ && !defined __i386__ /* The 'environ' variable is defined in a DLL. Therefore its declaration needs the '__declspec(dllimport)' attribute, but the system's lacks it. This leads to a link error on 64-bit Cygwin when the option -Wl,--disable-auto-import is in use. */ _GL_EXTERN_C __declspec(dllimport) char **environ; # endif # if !@HAVE_DECL_ENVIRON@ /* Set of environment variables and values. An array of strings of the form "VARIABLE=VALUE", terminated with a NULL. */ # if defined __APPLE__ && defined __MACH__ # include # if !TARGET_OS_IPHONE && !TARGET_IPHONE_SIMULATOR # define _GL_USE_CRT_EXTERNS # endif # endif # ifdef _GL_USE_CRT_EXTERNS # include # define environ (*_NSGetEnviron ()) # else # ifdef __cplusplus extern "C" { # endif extern char **environ; # ifdef __cplusplus } # endif # endif # endif #elif defined GNULIB_POSIXCHECK # if HAVE_RAW_DECL_ENVIRON _GL_UNISTD_INLINE char *** _GL_WARN_ON_USE_ATTRIBUTE ("environ is unportable - " "use gnulib module environ for portability") rpl_environ (void) { return &environ; } # undef environ # define environ (*rpl_environ ()) # endif #endif #if @GNULIB_EUIDACCESS@ /* Like access(), except that it uses the effective user id and group id of the current process. */ # if !@HAVE_EUIDACCESS@ _GL_FUNCDECL_SYS (euidaccess, int, (const char *filename, int mode) _GL_ARG_NONNULL ((1))); # endif _GL_CXXALIAS_SYS (euidaccess, int, (const char *filename, int mode)); _GL_CXXALIASWARN (euidaccess); # if defined GNULIB_POSIXCHECK /* Like access(), this function is a security risk. */ _GL_WARN_ON_USE (euidaccess, "the euidaccess function is a security risk - " "use the gnulib module faccessat instead"); # endif #elif defined GNULIB_POSIXCHECK # undef euidaccess # if HAVE_RAW_DECL_EUIDACCESS _GL_WARN_ON_USE (euidaccess, "euidaccess is unportable - " "use gnulib module euidaccess for portability"); # endif #endif #if @GNULIB_FACCESSAT@ # if @REPLACE_FACCESSAT@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef faccessat # define faccessat rpl_faccessat # endif _GL_FUNCDECL_RPL (faccessat, int, (int fd, char const *name, int mode, int flag) _GL_ARG_NONNULL ((2))); _GL_CXXALIAS_RPL (faccessat, int, (int fd, char const *name, int mode, int flag)); # else # if !@HAVE_FACCESSAT@ _GL_FUNCDECL_SYS (faccessat, int, (int fd, char const *file, int mode, int flag) _GL_ARG_NONNULL ((2))); # endif _GL_CXXALIAS_SYS (faccessat, int, (int fd, char const *file, int mode, int flag)); # endif _GL_CXXALIASWARN (faccessat); #elif defined GNULIB_POSIXCHECK # undef faccessat # if HAVE_RAW_DECL_FACCESSAT _GL_WARN_ON_USE (faccessat, "faccessat is not portable - " "use gnulib module faccessat for portability"); # endif #endif #if @GNULIB_FCHDIR@ /* Change the process' current working directory to the directory on which the given file descriptor is open. Return 0 if successful, otherwise -1 and errno set. See the POSIX:2008 specification . */ # if ! @HAVE_FCHDIR@ _GL_FUNCDECL_SYS (fchdir, int, (int /*fd*/)); /* Gnulib internal hooks needed to maintain the fchdir metadata. */ _GL_EXTERN_C int _gl_register_fd (int fd, const char *filename) _GL_ARG_NONNULL ((2)); _GL_EXTERN_C void _gl_unregister_fd (int fd); _GL_EXTERN_C int _gl_register_dup (int oldfd, int newfd); _GL_EXTERN_C const char *_gl_directory_name (int fd); # else # if !@HAVE_DECL_FCHDIR@ _GL_FUNCDECL_SYS (fchdir, int, (int /*fd*/)); # endif # endif _GL_CXXALIAS_SYS (fchdir, int, (int /*fd*/)); _GL_CXXALIASWARN (fchdir); #elif defined GNULIB_POSIXCHECK # undef fchdir # if HAVE_RAW_DECL_FCHDIR _GL_WARN_ON_USE (fchdir, "fchdir is unportable - " "use gnulib module fchdir for portability"); # endif #endif #if @GNULIB_FCHOWNAT@ # if @REPLACE_FCHOWNAT@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef fchownat # define fchownat rpl_fchownat # endif _GL_FUNCDECL_RPL (fchownat, int, (int fd, char const *file, uid_t owner, gid_t group, int flag) _GL_ARG_NONNULL ((2))); _GL_CXXALIAS_RPL (fchownat, int, (int fd, char const *file, uid_t owner, gid_t group, int flag)); # else # if !@HAVE_FCHOWNAT@ _GL_FUNCDECL_SYS (fchownat, int, (int fd, char const *file, uid_t owner, gid_t group, int flag) _GL_ARG_NONNULL ((2))); # endif _GL_CXXALIAS_SYS (fchownat, int, (int fd, char const *file, uid_t owner, gid_t group, int flag)); # endif _GL_CXXALIASWARN (fchownat); #elif defined GNULIB_POSIXCHECK # undef fchownat # if HAVE_RAW_DECL_FCHOWNAT _GL_WARN_ON_USE (fchownat, "fchownat is not portable - " "use gnulib module openat for portability"); # endif #endif #if @GNULIB_FDATASYNC@ /* Synchronize changes to a file. Return 0 if successful, otherwise -1 and errno set. See POSIX:2008 specification . */ # if !@HAVE_FDATASYNC@ || !@HAVE_DECL_FDATASYNC@ _GL_FUNCDECL_SYS (fdatasync, int, (int fd)); # endif _GL_CXXALIAS_SYS (fdatasync, int, (int fd)); _GL_CXXALIASWARN (fdatasync); #elif defined GNULIB_POSIXCHECK # undef fdatasync # if HAVE_RAW_DECL_FDATASYNC _GL_WARN_ON_USE (fdatasync, "fdatasync is unportable - " "use gnulib module fdatasync for portability"); # endif #endif #if @GNULIB_FSYNC@ /* Synchronize changes, including metadata, to a file. Return 0 if successful, otherwise -1 and errno set. See POSIX:2008 specification . */ # if !@HAVE_FSYNC@ _GL_FUNCDECL_SYS (fsync, int, (int fd)); # endif _GL_CXXALIAS_SYS (fsync, int, (int fd)); _GL_CXXALIASWARN (fsync); #elif defined GNULIB_POSIXCHECK # undef fsync # if HAVE_RAW_DECL_FSYNC _GL_WARN_ON_USE (fsync, "fsync is unportable - " "use gnulib module fsync for portability"); # endif #endif #if @GNULIB_FTRUNCATE@ /* Change the size of the file to which FD is opened to become equal to LENGTH. Return 0 if successful, otherwise -1 and errno set. See the POSIX:2008 specification . */ # if @REPLACE_FTRUNCATE@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef ftruncate # define ftruncate rpl_ftruncate # endif _GL_FUNCDECL_RPL (ftruncate, int, (int fd, off_t length)); _GL_CXXALIAS_RPL (ftruncate, int, (int fd, off_t length)); # else # if !@HAVE_FTRUNCATE@ _GL_FUNCDECL_SYS (ftruncate, int, (int fd, off_t length)); # endif _GL_CXXALIAS_SYS (ftruncate, int, (int fd, off_t length)); # endif _GL_CXXALIASWARN (ftruncate); #elif defined GNULIB_POSIXCHECK # undef ftruncate # if HAVE_RAW_DECL_FTRUNCATE _GL_WARN_ON_USE (ftruncate, "ftruncate is unportable - " "use gnulib module ftruncate for portability"); # endif #endif #if @GNULIB_GETCWD@ /* Get the name of the current working directory, and put it in SIZE bytes of BUF. Return BUF if successful, or NULL if the directory couldn't be determined or SIZE was too small. See the POSIX:2008 specification . Additionally, the gnulib module 'getcwd' guarantees the following GNU extension: If BUF is NULL, an array is allocated with 'malloc'; the array is SIZE bytes long, unless SIZE == 0, in which case it is as big as necessary. */ # if @REPLACE_GETCWD@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # define getcwd rpl_getcwd # endif _GL_FUNCDECL_RPL (getcwd, char *, (char *buf, size_t size)); _GL_CXXALIAS_RPL (getcwd, char *, (char *buf, size_t size)); # else /* Need to cast, because on mingw, the second parameter is int size. */ _GL_CXXALIAS_SYS_CAST (getcwd, char *, (char *buf, size_t size)); # endif _GL_CXXALIASWARN (getcwd); #elif defined GNULIB_POSIXCHECK # undef getcwd # if HAVE_RAW_DECL_GETCWD _GL_WARN_ON_USE (getcwd, "getcwd is unportable - " "use gnulib module getcwd for portability"); # endif #endif #if @GNULIB_GETDOMAINNAME@ /* Return the NIS domain name of the machine. WARNING! The NIS domain name is unrelated to the fully qualified host name of the machine. It is also unrelated to email addresses. WARNING! The NIS domain name is usually the empty string or "(none)" when not using NIS. Put up to LEN bytes of the NIS domain name into NAME. Null terminate it if the name is shorter than LEN. If the NIS domain name is longer than LEN, set errno = EINVAL and return -1. Return 0 if successful, otherwise set errno and return -1. */ # if @REPLACE_GETDOMAINNAME@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef getdomainname # define getdomainname rpl_getdomainname # endif _GL_FUNCDECL_RPL (getdomainname, int, (char *name, size_t len) _GL_ARG_NONNULL ((1))); _GL_CXXALIAS_RPL (getdomainname, int, (char *name, size_t len)); # else # if !@HAVE_DECL_GETDOMAINNAME@ _GL_FUNCDECL_SYS (getdomainname, int, (char *name, size_t len) _GL_ARG_NONNULL ((1))); # endif _GL_CXXALIAS_SYS (getdomainname, int, (char *name, size_t len)); # endif _GL_CXXALIASWARN (getdomainname); #elif defined GNULIB_POSIXCHECK # undef getdomainname # if HAVE_RAW_DECL_GETDOMAINNAME _GL_WARN_ON_USE (getdomainname, "getdomainname is unportable - " "use gnulib module getdomainname for portability"); # endif #endif #if @GNULIB_GETDTABLESIZE@ /* Return the maximum number of file descriptors in the current process. In POSIX, this is same as sysconf (_SC_OPEN_MAX). */ # if @REPLACE_GETDTABLESIZE@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef getdtablesize # define getdtablesize rpl_getdtablesize # endif _GL_FUNCDECL_RPL (getdtablesize, int, (void)); _GL_CXXALIAS_RPL (getdtablesize, int, (void)); # else # if !@HAVE_GETDTABLESIZE@ _GL_FUNCDECL_SYS (getdtablesize, int, (void)); # endif /* Need to cast, because on AIX, the parameter list is (...). */ _GL_CXXALIAS_SYS_CAST (getdtablesize, int, (void)); # endif _GL_CXXALIASWARN (getdtablesize); #elif defined GNULIB_POSIXCHECK # undef getdtablesize # if HAVE_RAW_DECL_GETDTABLESIZE _GL_WARN_ON_USE (getdtablesize, "getdtablesize is unportable - " "use gnulib module getdtablesize for portability"); # endif #endif #if @GNULIB_GETENTROPY@ /* Fill a buffer with random bytes. */ # if !@HAVE_GETENTROPY@ _GL_FUNCDECL_SYS (getentropy, int, (void *buffer, size_t length)); # endif _GL_CXXALIAS_SYS (getentropy, int, (void *buffer, size_t length)); _GL_CXXALIASWARN (getentropy); #elif defined GNULIB_POSIXCHECK # undef getentropy # if HAVE_RAW_DECL_GETENTROPY _GL_WARN_ON_USE (getentropy, "getentropy is unportable - " "use gnulib module getentropy for portability"); # endif #endif #if @GNULIB_GETGROUPS@ /* Return the supplemental groups that the current process belongs to. It is unspecified whether the effective group id is in the list. If N is 0, return the group count; otherwise, N describes how many entries are available in GROUPS. Return -1 and set errno if N is not 0 and not large enough. Fails with ENOSYS on some systems. */ # if @REPLACE_GETGROUPS@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef getgroups # define getgroups rpl_getgroups # endif _GL_FUNCDECL_RPL (getgroups, int, (int n, gid_t *groups)); _GL_CXXALIAS_RPL (getgroups, int, (int n, gid_t *groups)); # else # if !@HAVE_GETGROUPS@ _GL_FUNCDECL_SYS (getgroups, int, (int n, gid_t *groups)); # endif _GL_CXXALIAS_SYS (getgroups, int, (int n, gid_t *groups)); # endif _GL_CXXALIASWARN (getgroups); #elif defined GNULIB_POSIXCHECK # undef getgroups # if HAVE_RAW_DECL_GETGROUPS _GL_WARN_ON_USE (getgroups, "getgroups is unportable - " "use gnulib module getgroups for portability"); # endif #endif #if @GNULIB_GETHOSTNAME@ /* Return the standard host name of the machine. WARNING! The host name may or may not be fully qualified. Put up to LEN bytes of the host name into NAME. Null terminate it if the name is shorter than LEN. If the host name is longer than LEN, set errno = EINVAL and return -1. Return 0 if successful, otherwise set errno and return -1. */ # if @UNISTD_H_HAVE_WINSOCK2_H@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef gethostname # define gethostname rpl_gethostname # endif _GL_FUNCDECL_RPL (gethostname, int, (char *name, size_t len) _GL_ARG_NONNULL ((1))); _GL_CXXALIAS_RPL (gethostname, int, (char *name, size_t len)); # else # if !@HAVE_GETHOSTNAME@ _GL_FUNCDECL_SYS (gethostname, int, (char *name, size_t len) _GL_ARG_NONNULL ((1))); # endif /* Need to cast, because on Solaris 10 and OSF/1 5.1 systems, the second parameter is int len. */ _GL_CXXALIAS_SYS_CAST (gethostname, int, (char *name, size_t len)); # endif _GL_CXXALIASWARN (gethostname); #elif @UNISTD_H_HAVE_WINSOCK2_H@ # undef gethostname # define gethostname gethostname_used_without_requesting_gnulib_module_gethostname #elif defined GNULIB_POSIXCHECK # undef gethostname # if HAVE_RAW_DECL_GETHOSTNAME _GL_WARN_ON_USE (gethostname, "gethostname is unportable - " "use gnulib module gethostname for portability"); # endif #endif #if @GNULIB_GETLOGIN@ /* Returns the user's login name, or NULL if it cannot be found. Upon error, returns NULL with errno set. See . Most programs don't need to use this function, because the information is available through environment variables: ${LOGNAME-$USER} on Unix platforms, $USERNAME on native Windows platforms. */ # if !@HAVE_DECL_GETLOGIN@ _GL_FUNCDECL_SYS (getlogin, char *, (void)); # endif _GL_CXXALIAS_SYS (getlogin, char *, (void)); _GL_CXXALIASWARN (getlogin); #elif defined GNULIB_POSIXCHECK # undef getlogin # if HAVE_RAW_DECL_GETLOGIN _GL_WARN_ON_USE (getlogin, "getlogin is unportable - " "use gnulib module getlogin for portability"); # endif #endif #if @GNULIB_GETLOGIN_R@ /* Copies the user's login name to NAME. The array pointed to by NAME has room for SIZE bytes. Returns 0 if successful. Upon error, an error number is returned, or -1 in the case that the login name cannot be found but no specific error is provided (this case is hopefully rare but is left open by the POSIX spec). See . Most programs don't need to use this function, because the information is available through environment variables: ${LOGNAME-$USER} on Unix platforms, $USERNAME on native Windows platforms. */ # if @REPLACE_GETLOGIN_R@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # define getlogin_r rpl_getlogin_r # endif _GL_FUNCDECL_RPL (getlogin_r, int, (char *name, size_t size) _GL_ARG_NONNULL ((1))); _GL_CXXALIAS_RPL (getlogin_r, int, (char *name, size_t size)); # else # if !@HAVE_DECL_GETLOGIN_R@ _GL_FUNCDECL_SYS (getlogin_r, int, (char *name, size_t size) _GL_ARG_NONNULL ((1))); # endif /* Need to cast, because on Solaris 10 systems, the second argument is int size. */ _GL_CXXALIAS_SYS_CAST (getlogin_r, int, (char *name, size_t size)); # endif _GL_CXXALIASWARN (getlogin_r); #elif defined GNULIB_POSIXCHECK # undef getlogin_r # if HAVE_RAW_DECL_GETLOGIN_R _GL_WARN_ON_USE (getlogin_r, "getlogin_r is unportable - " "use gnulib module getlogin_r for portability"); # endif #endif #if @GNULIB_GETPAGESIZE@ # if @REPLACE_GETPAGESIZE@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # define getpagesize rpl_getpagesize # endif _GL_FUNCDECL_RPL (getpagesize, int, (void)); _GL_CXXALIAS_RPL (getpagesize, int, (void)); # else /* On HP-UX, getpagesize exists, but it is not declared in even if the compiler options -D_HPUX_SOURCE -D_XOPEN_SOURCE=600 are used. */ # if defined __hpux _GL_FUNCDECL_SYS (getpagesize, int, (void)); # endif # if !@HAVE_GETPAGESIZE@ # if !defined getpagesize /* This is for POSIX systems. */ # if !defined _gl_getpagesize && defined _SC_PAGESIZE # if ! (defined __VMS && __VMS_VER < 70000000) # define _gl_getpagesize() sysconf (_SC_PAGESIZE) # endif # endif /* This is for older VMS. */ # if !defined _gl_getpagesize && defined __VMS # ifdef __ALPHA # define _gl_getpagesize() 8192 # else # define _gl_getpagesize() 512 # endif # endif /* This is for BeOS. */ # if !defined _gl_getpagesize && @HAVE_OS_H@ # include # if defined B_PAGE_SIZE # define _gl_getpagesize() B_PAGE_SIZE # endif # endif /* This is for AmigaOS4.0. */ # if !defined _gl_getpagesize && defined __amigaos4__ # define _gl_getpagesize() 2048 # endif /* This is for older Unix systems. */ # if !defined _gl_getpagesize && @HAVE_SYS_PARAM_H@ # include # ifdef EXEC_PAGESIZE # define _gl_getpagesize() EXEC_PAGESIZE # else # ifdef NBPG # ifndef CLSIZE # define CLSIZE 1 # endif # define _gl_getpagesize() (NBPG * CLSIZE) # else # ifdef NBPC # define _gl_getpagesize() NBPC # endif # endif # endif # endif # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # define getpagesize() _gl_getpagesize () # else # if !GNULIB_defined_getpagesize_function _GL_UNISTD_INLINE int getpagesize () { return _gl_getpagesize (); } # define GNULIB_defined_getpagesize_function 1 # endif # endif # endif # endif /* Need to cast, because on Cygwin 1.5.x systems, the return type is size_t. */ _GL_CXXALIAS_SYS_CAST (getpagesize, int, (void)); # endif # if @HAVE_DECL_GETPAGESIZE@ _GL_CXXALIASWARN (getpagesize); # endif #elif defined GNULIB_POSIXCHECK # undef getpagesize # if HAVE_RAW_DECL_GETPAGESIZE _GL_WARN_ON_USE (getpagesize, "getpagesize is unportable - " "use gnulib module getpagesize for portability"); # endif #endif #if @GNULIB_GETPASS@ /* Function getpass() from module 'getpass': Read a password from /dev/tty or stdin. Function getpass() from module 'getpass-gnu': Read a password of arbitrary length from /dev/tty or stdin. */ # if @REPLACE_GETPASS@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef getpass # define getpass rpl_getpass # endif _GL_FUNCDECL_RPL (getpass, char *, (const char *prompt) _GL_ARG_NONNULL ((1))); _GL_CXXALIAS_RPL (getpass, char *, (const char *prompt)); # else # if !@HAVE_GETPASS@ _GL_FUNCDECL_SYS (getpass, char *, (const char *prompt) _GL_ARG_NONNULL ((1))); # endif _GL_CXXALIAS_SYS (getpass, char *, (const char *prompt)); # endif _GL_CXXALIASWARN (getpass); #elif defined GNULIB_POSIXCHECK # undef getpass # if HAVE_RAW_DECL_GETPASS _GL_WARN_ON_USE (getpass, "getpass is unportable - " "use gnulib module getpass or getpass-gnu for portability"); # endif #endif #if @GNULIB_GETUSERSHELL@ /* Return the next valid login shell on the system, or NULL when the end of the list has been reached. */ # if !@HAVE_DECL_GETUSERSHELL@ _GL_FUNCDECL_SYS (getusershell, char *, (void)); # endif _GL_CXXALIAS_SYS (getusershell, char *, (void)); _GL_CXXALIASWARN (getusershell); #elif defined GNULIB_POSIXCHECK # undef getusershell # if HAVE_RAW_DECL_GETUSERSHELL _GL_WARN_ON_USE (getusershell, "getusershell is unportable - " "use gnulib module getusershell for portability"); # endif #endif #if @GNULIB_GETUSERSHELL@ /* Rewind to pointer that is advanced at each getusershell() call. */ # if !@HAVE_DECL_GETUSERSHELL@ _GL_FUNCDECL_SYS (setusershell, void, (void)); # endif _GL_CXXALIAS_SYS (setusershell, void, (void)); _GL_CXXALIASWARN (setusershell); #elif defined GNULIB_POSIXCHECK # undef setusershell # if HAVE_RAW_DECL_SETUSERSHELL _GL_WARN_ON_USE (setusershell, "setusershell is unportable - " "use gnulib module getusershell for portability"); # endif #endif #if @GNULIB_GETUSERSHELL@ /* Free the pointer that is advanced at each getusershell() call and associated resources. */ # if !@HAVE_DECL_GETUSERSHELL@ _GL_FUNCDECL_SYS (endusershell, void, (void)); # endif _GL_CXXALIAS_SYS (endusershell, void, (void)); _GL_CXXALIASWARN (endusershell); #elif defined GNULIB_POSIXCHECK # undef endusershell # if HAVE_RAW_DECL_ENDUSERSHELL _GL_WARN_ON_USE (endusershell, "endusershell is unportable - " "use gnulib module getusershell for portability"); # endif #endif #if @GNULIB_GROUP_MEMBER@ /* Determine whether group id is in calling user's group list. */ # if !@HAVE_GROUP_MEMBER@ _GL_FUNCDECL_SYS (group_member, int, (gid_t gid)); # endif _GL_CXXALIAS_SYS (group_member, int, (gid_t gid)); _GL_CXXALIASWARN (group_member); #elif defined GNULIB_POSIXCHECK # undef group_member # if HAVE_RAW_DECL_GROUP_MEMBER _GL_WARN_ON_USE (group_member, "group_member is unportable - " "use gnulib module group-member for portability"); # endif #endif #if @GNULIB_ISATTY@ # if @REPLACE_ISATTY@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef isatty # define isatty rpl_isatty # endif _GL_FUNCDECL_RPL (isatty, int, (int fd)); _GL_CXXALIAS_RPL (isatty, int, (int fd)); # else _GL_CXXALIAS_SYS (isatty, int, (int fd)); # endif _GL_CXXALIASWARN (isatty); #elif defined GNULIB_POSIXCHECK # undef isatty # if HAVE_RAW_DECL_ISATTY _GL_WARN_ON_USE (isatty, "isatty has portability problems on native Windows - " "use gnulib module isatty for portability"); # endif #endif #if @GNULIB_LCHOWN@ /* Change the owner of FILE to UID (if UID is not -1) and the group of FILE to GID (if GID is not -1). Do not follow symbolic links. Return 0 if successful, otherwise -1 and errno set. See the POSIX:2008 specification . */ # if @REPLACE_LCHOWN@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef lchown # define lchown rpl_lchown # endif _GL_FUNCDECL_RPL (lchown, int, (char const *file, uid_t owner, gid_t group) _GL_ARG_NONNULL ((1))); _GL_CXXALIAS_RPL (lchown, int, (char const *file, uid_t owner, gid_t group)); # else # if !@HAVE_LCHOWN@ _GL_FUNCDECL_SYS (lchown, int, (char const *file, uid_t owner, gid_t group) _GL_ARG_NONNULL ((1))); # endif _GL_CXXALIAS_SYS (lchown, int, (char const *file, uid_t owner, gid_t group)); # endif _GL_CXXALIASWARN (lchown); #elif defined GNULIB_POSIXCHECK # undef lchown # if HAVE_RAW_DECL_LCHOWN _GL_WARN_ON_USE (lchown, "lchown is unportable to pre-POSIX.1-2001 systems - " "use gnulib module lchown for portability"); # endif #endif #if @GNULIB_LINK@ /* Create a new hard link for an existing file. Return 0 if successful, otherwise -1 and errno set. See POSIX:2008 specification . */ # if @REPLACE_LINK@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # define link rpl_link # endif _GL_FUNCDECL_RPL (link, int, (const char *path1, const char *path2) _GL_ARG_NONNULL ((1, 2))); _GL_CXXALIAS_RPL (link, int, (const char *path1, const char *path2)); # else # if !@HAVE_LINK@ _GL_FUNCDECL_SYS (link, int, (const char *path1, const char *path2) _GL_ARG_NONNULL ((1, 2))); # endif _GL_CXXALIAS_SYS (link, int, (const char *path1, const char *path2)); # endif _GL_CXXALIASWARN (link); #elif defined GNULIB_POSIXCHECK # undef link # if HAVE_RAW_DECL_LINK _GL_WARN_ON_USE (link, "link is unportable - " "use gnulib module link for portability"); # endif #endif #if @GNULIB_LINKAT@ /* Create a new hard link for an existing file, relative to two directories. FLAG controls whether symlinks are followed. Return 0 if successful, otherwise -1 and errno set. */ # if @REPLACE_LINKAT@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef linkat # define linkat rpl_linkat # endif _GL_FUNCDECL_RPL (linkat, int, (int fd1, const char *path1, int fd2, const char *path2, int flag) _GL_ARG_NONNULL ((2, 4))); _GL_CXXALIAS_RPL (linkat, int, (int fd1, const char *path1, int fd2, const char *path2, int flag)); # else # if !@HAVE_LINKAT@ _GL_FUNCDECL_SYS (linkat, int, (int fd1, const char *path1, int fd2, const char *path2, int flag) _GL_ARG_NONNULL ((2, 4))); # endif _GL_CXXALIAS_SYS (linkat, int, (int fd1, const char *path1, int fd2, const char *path2, int flag)); # endif _GL_CXXALIASWARN (linkat); #elif defined GNULIB_POSIXCHECK # undef linkat # if HAVE_RAW_DECL_LINKAT _GL_WARN_ON_USE (linkat, "linkat is unportable - " "use gnulib module linkat for portability"); # endif #endif #if @GNULIB_LSEEK@ /* Set the offset of FD relative to SEEK_SET, SEEK_CUR, or SEEK_END. Return the new offset if successful, otherwise -1 and errno set. See the POSIX:2008 specification . */ # if @REPLACE_LSEEK@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # define lseek rpl_lseek # endif _GL_FUNCDECL_RPL (lseek, off_t, (int fd, off_t offset, int whence)); _GL_CXXALIAS_RPL (lseek, off_t, (int fd, off_t offset, int whence)); # else _GL_CXXALIAS_SYS (lseek, off_t, (int fd, off_t offset, int whence)); # endif _GL_CXXALIASWARN (lseek); #elif defined GNULIB_POSIXCHECK # undef lseek # if HAVE_RAW_DECL_LSEEK _GL_WARN_ON_USE (lseek, "lseek does not fail with ESPIPE on pipes on some " "systems - use gnulib module lseek for portability"); # endif #endif #if @GNULIB_PIPE@ /* Create a pipe, defaulting to O_BINARY mode. Store the read-end as fd[0] and the write-end as fd[1]. Return 0 upon success, or -1 with errno set upon failure. */ # if !@HAVE_PIPE@ _GL_FUNCDECL_SYS (pipe, int, (int fd[2]) _GL_ARG_NONNULL ((1))); # endif _GL_CXXALIAS_SYS (pipe, int, (int fd[2])); _GL_CXXALIASWARN (pipe); #elif defined GNULIB_POSIXCHECK # undef pipe # if HAVE_RAW_DECL_PIPE _GL_WARN_ON_USE (pipe, "pipe is unportable - " "use gnulib module pipe-posix for portability"); # endif #endif #if @GNULIB_PIPE2@ /* Create a pipe, applying the given flags when opening the read-end of the pipe and the write-end of the pipe. The flags are a bitmask, possibly including O_CLOEXEC (defined in ) and O_TEXT, O_BINARY (defined in "binary-io.h"). Store the read-end as fd[0] and the write-end as fd[1]. Return 0 upon success, or -1 with errno set upon failure. See also the Linux man page at . */ # if @HAVE_PIPE2@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # define pipe2 rpl_pipe2 # endif _GL_FUNCDECL_RPL (pipe2, int, (int fd[2], int flags) _GL_ARG_NONNULL ((1))); _GL_CXXALIAS_RPL (pipe2, int, (int fd[2], int flags)); # else _GL_FUNCDECL_SYS (pipe2, int, (int fd[2], int flags) _GL_ARG_NONNULL ((1))); _GL_CXXALIAS_SYS (pipe2, int, (int fd[2], int flags)); # endif _GL_CXXALIASWARN (pipe2); #elif defined GNULIB_POSIXCHECK # undef pipe2 # if HAVE_RAW_DECL_PIPE2 _GL_WARN_ON_USE (pipe2, "pipe2 is unportable - " "use gnulib module pipe2 for portability"); # endif #endif #if @GNULIB_PREAD@ /* Read at most BUFSIZE bytes from FD into BUF, starting at OFFSET. Return the number of bytes placed into BUF if successful, otherwise set errno and return -1. 0 indicates EOF. See the POSIX:2008 specification . */ # if @REPLACE_PREAD@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef pread # define pread rpl_pread # endif _GL_FUNCDECL_RPL (pread, ssize_t, (int fd, void *buf, size_t bufsize, off_t offset) _GL_ARG_NONNULL ((2))); _GL_CXXALIAS_RPL (pread, ssize_t, (int fd, void *buf, size_t bufsize, off_t offset)); # else # if !@HAVE_PREAD@ _GL_FUNCDECL_SYS (pread, ssize_t, (int fd, void *buf, size_t bufsize, off_t offset) _GL_ARG_NONNULL ((2))); # endif _GL_CXXALIAS_SYS (pread, ssize_t, (int fd, void *buf, size_t bufsize, off_t offset)); # endif _GL_CXXALIASWARN (pread); #elif defined GNULIB_POSIXCHECK # undef pread # if HAVE_RAW_DECL_PREAD _GL_WARN_ON_USE (pread, "pread is unportable - " "use gnulib module pread for portability"); # endif #endif #if @GNULIB_PWRITE@ /* Write at most BUFSIZE bytes from BUF into FD, starting at OFFSET. Return the number of bytes written if successful, otherwise set errno and return -1. 0 indicates nothing written. See the POSIX:2008 specification . */ # if @REPLACE_PWRITE@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef pwrite # define pwrite rpl_pwrite # endif _GL_FUNCDECL_RPL (pwrite, ssize_t, (int fd, const void *buf, size_t bufsize, off_t offset) _GL_ARG_NONNULL ((2))); _GL_CXXALIAS_RPL (pwrite, ssize_t, (int fd, const void *buf, size_t bufsize, off_t offset)); # else # if !@HAVE_PWRITE@ _GL_FUNCDECL_SYS (pwrite, ssize_t, (int fd, const void *buf, size_t bufsize, off_t offset) _GL_ARG_NONNULL ((2))); # endif _GL_CXXALIAS_SYS (pwrite, ssize_t, (int fd, const void *buf, size_t bufsize, off_t offset)); # endif _GL_CXXALIASWARN (pwrite); #elif defined GNULIB_POSIXCHECK # undef pwrite # if HAVE_RAW_DECL_PWRITE _GL_WARN_ON_USE (pwrite, "pwrite is unportable - " "use gnulib module pwrite for portability"); # endif #endif #if @GNULIB_READ@ /* Read up to COUNT bytes from file descriptor FD into the buffer starting at BUF. See the POSIX:2008 specification . */ # if @REPLACE_READ@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef read # define read rpl_read # endif _GL_FUNCDECL_RPL (read, ssize_t, (int fd, void *buf, size_t count) _GL_ARG_NONNULL ((2))); _GL_CXXALIAS_RPL (read, ssize_t, (int fd, void *buf, size_t count)); # else /* Need to cast, because on mingw, the third parameter is unsigned int count and the return type is 'int'. */ _GL_CXXALIAS_SYS_CAST (read, ssize_t, (int fd, void *buf, size_t count)); # endif _GL_CXXALIASWARN (read); #endif #if @GNULIB_READLINK@ /* Read the contents of the symbolic link FILE and place the first BUFSIZE bytes of it into BUF. Return the number of bytes placed into BUF if successful, otherwise -1 and errno set. See the POSIX:2008 specification . */ # if @REPLACE_READLINK@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # define readlink rpl_readlink # endif _GL_FUNCDECL_RPL (readlink, ssize_t, (const char *restrict file, char *restrict buf, size_t bufsize) _GL_ARG_NONNULL ((1, 2))); _GL_CXXALIAS_RPL (readlink, ssize_t, (const char *restrict file, char *restrict buf, size_t bufsize)); # else # if !@HAVE_READLINK@ _GL_FUNCDECL_SYS (readlink, ssize_t, (const char *restrict file, char *restrict buf, size_t bufsize) _GL_ARG_NONNULL ((1, 2))); # endif _GL_CXXALIAS_SYS (readlink, ssize_t, (const char *restrict file, char *restrict buf, size_t bufsize)); # endif _GL_CXXALIASWARN (readlink); #elif defined GNULIB_POSIXCHECK # undef readlink # if HAVE_RAW_DECL_READLINK _GL_WARN_ON_USE (readlink, "readlink is unportable - " "use gnulib module readlink for portability"); # endif #endif #if @GNULIB_READLINKAT@ # if @REPLACE_READLINKAT@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # define readlinkat rpl_readlinkat # endif _GL_FUNCDECL_RPL (readlinkat, ssize_t, (int fd, char const *restrict file, char *restrict buf, size_t len) _GL_ARG_NONNULL ((2, 3))); _GL_CXXALIAS_RPL (readlinkat, ssize_t, (int fd, char const *restrict file, char *restrict buf, size_t len)); # else # if !@HAVE_READLINKAT@ _GL_FUNCDECL_SYS (readlinkat, ssize_t, (int fd, char const *restrict file, char *restrict buf, size_t len) _GL_ARG_NONNULL ((2, 3))); # endif _GL_CXXALIAS_SYS (readlinkat, ssize_t, (int fd, char const *restrict file, char *restrict buf, size_t len)); # endif _GL_CXXALIASWARN (readlinkat); #elif defined GNULIB_POSIXCHECK # undef readlinkat # if HAVE_RAW_DECL_READLINKAT _GL_WARN_ON_USE (readlinkat, "readlinkat is not portable - " "use gnulib module readlinkat for portability"); # endif #endif #if @GNULIB_RMDIR@ /* Remove the directory DIR. */ # if @REPLACE_RMDIR@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # define rmdir rpl_rmdir # endif _GL_FUNCDECL_RPL (rmdir, int, (char const *name) _GL_ARG_NONNULL ((1))); _GL_CXXALIAS_RPL (rmdir, int, (char const *name)); # else _GL_CXXALIAS_SYS (rmdir, int, (char const *name)); # endif _GL_CXXALIASWARN (rmdir); #elif defined GNULIB_POSIXCHECK # undef rmdir # if HAVE_RAW_DECL_RMDIR _GL_WARN_ON_USE (rmdir, "rmdir is unportable - " "use gnulib module rmdir for portability"); # endif #endif #if @GNULIB_SETHOSTNAME@ /* Set the host name of the machine. The host name may or may not be fully qualified. Put LEN bytes of NAME into the host name. Return 0 if successful, otherwise, set errno and return -1. Platforms with no ability to set the hostname return -1 and set errno = ENOSYS. */ # if !@HAVE_SETHOSTNAME@ || !@HAVE_DECL_SETHOSTNAME@ _GL_FUNCDECL_SYS (sethostname, int, (const char *name, size_t len) _GL_ARG_NONNULL ((1))); # endif /* Need to cast, because on Solaris 11 2011-10, Mac OS X 10.5, IRIX 6.5 and FreeBSD 6.4 the second parameter is int. On Solaris 11 2011-10, the first parameter is not const. */ _GL_CXXALIAS_SYS_CAST (sethostname, int, (const char *name, size_t len)); _GL_CXXALIASWARN (sethostname); #elif defined GNULIB_POSIXCHECK # undef sethostname # if HAVE_RAW_DECL_SETHOSTNAME _GL_WARN_ON_USE (sethostname, "sethostname is unportable - " "use gnulib module sethostname for portability"); # endif #endif #if @GNULIB_SLEEP@ /* Pause the execution of the current thread for N seconds. Returns the number of seconds left to sleep. See the POSIX:2008 specification . */ # if @REPLACE_SLEEP@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef sleep # define sleep rpl_sleep # endif _GL_FUNCDECL_RPL (sleep, unsigned int, (unsigned int n)); _GL_CXXALIAS_RPL (sleep, unsigned int, (unsigned int n)); # else # if !@HAVE_SLEEP@ _GL_FUNCDECL_SYS (sleep, unsigned int, (unsigned int n)); # endif _GL_CXXALIAS_SYS (sleep, unsigned int, (unsigned int n)); # endif _GL_CXXALIASWARN (sleep); #elif defined GNULIB_POSIXCHECK # undef sleep # if HAVE_RAW_DECL_SLEEP _GL_WARN_ON_USE (sleep, "sleep is unportable - " "use gnulib module sleep for portability"); # endif #endif #if @GNULIB_SYMLINK@ # if @REPLACE_SYMLINK@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef symlink # define symlink rpl_symlink # endif _GL_FUNCDECL_RPL (symlink, int, (char const *contents, char const *file) _GL_ARG_NONNULL ((1, 2))); _GL_CXXALIAS_RPL (symlink, int, (char const *contents, char const *file)); # else # if !@HAVE_SYMLINK@ _GL_FUNCDECL_SYS (symlink, int, (char const *contents, char const *file) _GL_ARG_NONNULL ((1, 2))); # endif _GL_CXXALIAS_SYS (symlink, int, (char const *contents, char const *file)); # endif _GL_CXXALIASWARN (symlink); #elif defined GNULIB_POSIXCHECK # undef symlink # if HAVE_RAW_DECL_SYMLINK _GL_WARN_ON_USE (symlink, "symlink is not portable - " "use gnulib module symlink for portability"); # endif #endif #if @GNULIB_SYMLINKAT@ # if @REPLACE_SYMLINKAT@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef symlinkat # define symlinkat rpl_symlinkat # endif _GL_FUNCDECL_RPL (symlinkat, int, (char const *contents, int fd, char const *file) _GL_ARG_NONNULL ((1, 3))); _GL_CXXALIAS_RPL (symlinkat, int, (char const *contents, int fd, char const *file)); # else # if !@HAVE_SYMLINKAT@ _GL_FUNCDECL_SYS (symlinkat, int, (char const *contents, int fd, char const *file) _GL_ARG_NONNULL ((1, 3))); # endif _GL_CXXALIAS_SYS (symlinkat, int, (char const *contents, int fd, char const *file)); # endif _GL_CXXALIASWARN (symlinkat); #elif defined GNULIB_POSIXCHECK # undef symlinkat # if HAVE_RAW_DECL_SYMLINKAT _GL_WARN_ON_USE (symlinkat, "symlinkat is not portable - " "use gnulib module symlinkat for portability"); # endif #endif #if @GNULIB_TRUNCATE@ /* Change the size of the file designated by FILENAME to become equal to LENGTH. Return 0 if successful, otherwise -1 and errno set. See the POSIX:2008 specification . */ # if @REPLACE_TRUNCATE@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef truncate # define truncate rpl_truncate # endif _GL_FUNCDECL_RPL (truncate, int, (const char *filename, off_t length) _GL_ARG_NONNULL ((1))); _GL_CXXALIAS_RPL (truncate, int, (const char *filename, off_t length)); # else # if !@HAVE_DECL_TRUNCATE@ _GL_FUNCDECL_SYS (truncate, int, (const char *filename, off_t length) _GL_ARG_NONNULL ((1))); # endif _GL_CXXALIAS_SYS (truncate, int, (const char *filename, off_t length)); # endif _GL_CXXALIASWARN (truncate); #elif defined GNULIB_POSIXCHECK # undef truncate # if HAVE_RAW_DECL_TRUNCATE _GL_WARN_ON_USE (truncate, "truncate is unportable - " "use gnulib module truncate for portability"); # endif #endif #if @GNULIB_TTYNAME_R@ /* Store at most BUFLEN characters of the pathname of the terminal FD is open on in BUF. Return 0 on success, otherwise an error number. */ # if @REPLACE_TTYNAME_R@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef ttyname_r # define ttyname_r rpl_ttyname_r # endif _GL_FUNCDECL_RPL (ttyname_r, int, (int fd, char *buf, size_t buflen) _GL_ARG_NONNULL ((2))); _GL_CXXALIAS_RPL (ttyname_r, int, (int fd, char *buf, size_t buflen)); # else # if !@HAVE_DECL_TTYNAME_R@ _GL_FUNCDECL_SYS (ttyname_r, int, (int fd, char *buf, size_t buflen) _GL_ARG_NONNULL ((2))); # endif _GL_CXXALIAS_SYS (ttyname_r, int, (int fd, char *buf, size_t buflen)); # endif _GL_CXXALIASWARN (ttyname_r); #elif defined GNULIB_POSIXCHECK # undef ttyname_r # if HAVE_RAW_DECL_TTYNAME_R _GL_WARN_ON_USE (ttyname_r, "ttyname_r is not portable - " "use gnulib module ttyname_r for portability"); # endif #endif #if @GNULIB_UNLINK@ # if @REPLACE_UNLINK@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef unlink # define unlink rpl_unlink # endif _GL_FUNCDECL_RPL (unlink, int, (char const *file) _GL_ARG_NONNULL ((1))); _GL_CXXALIAS_RPL (unlink, int, (char const *file)); # else _GL_CXXALIAS_SYS (unlink, int, (char const *file)); # endif _GL_CXXALIASWARN (unlink); #elif defined GNULIB_POSIXCHECK # undef unlink # if HAVE_RAW_DECL_UNLINK _GL_WARN_ON_USE (unlink, "unlink is not portable - " "use gnulib module unlink for portability"); # endif #endif #if @GNULIB_UNLINKAT@ # if @REPLACE_UNLINKAT@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef unlinkat # define unlinkat rpl_unlinkat # endif _GL_FUNCDECL_RPL (unlinkat, int, (int fd, char const *file, int flag) _GL_ARG_NONNULL ((2))); _GL_CXXALIAS_RPL (unlinkat, int, (int fd, char const *file, int flag)); # else # if !@HAVE_UNLINKAT@ _GL_FUNCDECL_SYS (unlinkat, int, (int fd, char const *file, int flag) _GL_ARG_NONNULL ((2))); # endif _GL_CXXALIAS_SYS (unlinkat, int, (int fd, char const *file, int flag)); # endif _GL_CXXALIASWARN (unlinkat); #elif defined GNULIB_POSIXCHECK # undef unlinkat # if HAVE_RAW_DECL_UNLINKAT _GL_WARN_ON_USE (unlinkat, "unlinkat is not portable - " "use gnulib module openat for portability"); # endif #endif #if @GNULIB_USLEEP@ /* Pause the execution of the current thread for N microseconds. Returns 0 on completion, or -1 on range error. See the POSIX:2001 specification . */ # if @REPLACE_USLEEP@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef usleep # define usleep rpl_usleep # endif _GL_FUNCDECL_RPL (usleep, int, (useconds_t n)); _GL_CXXALIAS_RPL (usleep, int, (useconds_t n)); # else # if !@HAVE_USLEEP@ _GL_FUNCDECL_SYS (usleep, int, (useconds_t n)); # endif /* Need to cast, because on Haiku, the first parameter is unsigned int n. */ _GL_CXXALIAS_SYS_CAST (usleep, int, (useconds_t n)); # endif _GL_CXXALIASWARN (usleep); #elif defined GNULIB_POSIXCHECK # undef usleep # if HAVE_RAW_DECL_USLEEP _GL_WARN_ON_USE (usleep, "usleep is unportable - " "use gnulib module usleep for portability"); # endif #endif #if @GNULIB_WRITE@ /* Write up to COUNT bytes starting at BUF to file descriptor FD. See the POSIX:2008 specification . */ # if @REPLACE_WRITE@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef write # define write rpl_write # endif _GL_FUNCDECL_RPL (write, ssize_t, (int fd, const void *buf, size_t count) _GL_ARG_NONNULL ((2))); _GL_CXXALIAS_RPL (write, ssize_t, (int fd, const void *buf, size_t count)); # else /* Need to cast, because on mingw, the third parameter is unsigned int count and the return type is 'int'. */ _GL_CXXALIAS_SYS_CAST (write, ssize_t, (int fd, const void *buf, size_t count)); # endif _GL_CXXALIASWARN (write); #endif _GL_INLINE_HEADER_END #endif /* _@GUARD_PREFIX@_UNISTD_H */ #endif /* _GL_INCLUDING_UNISTD_H */ #endif /* _@GUARD_PREFIX@_UNISTD_H */ pspp-1.4.1/gl/unsetenv.c0000644000175000017500000000547313723215640014544 0ustar00blpblp00000000000000/* Copyright (C) 1992, 1995-2002, 2005-2020 Free Software Foundation, Inc. This file is part of the GNU C Library. 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 3 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, see . */ /* Don't use __attribute__ __nonnull__ in this compilation unit. Otherwise gcc optimizes away the name == NULL test below. */ #define _GL_ARG_NONNULL(params) #include /* Specification. */ #include #include #if !_LIBC # define __set_errno(ev) ((errno) = (ev)) #endif #include #include #if !_LIBC # define __environ environ #endif #if _LIBC /* This lock protects against simultaneous modifications of 'environ'. */ # include __libc_lock_define_initialized (static, envlock) # define LOCK __libc_lock_lock (envlock) # define UNLOCK __libc_lock_unlock (envlock) #else # define LOCK # define UNLOCK #endif /* In the GNU C library we must keep the namespace clean. */ #ifdef _LIBC # define unsetenv __unsetenv #endif #if _LIBC || !HAVE_UNSETENV int unsetenv (const char *name) { size_t len; char **ep; if (name == NULL || *name == '\0' || strchr (name, '=') != NULL) { __set_errno (EINVAL); return -1; } len = strlen (name); LOCK; ep = __environ; while (*ep != NULL) if (!strncmp (*ep, name, len) && (*ep)[len] == '=') { /* Found it. Remove this pointer by moving later ones back. */ char **dp = ep; do dp[0] = dp[1]; while (*dp++); /* Continue the loop in case NAME appears again. */ } else ++ep; UNLOCK; return 0; } #ifdef _LIBC # undef unsetenv weak_alias (__unsetenv, unsetenv) #endif #else /* HAVE_UNSETENV */ # undef unsetenv # if !HAVE_DECL_UNSETENV # if VOID_UNSETENV extern void unsetenv (const char *); # else extern int unsetenv (const char *); # endif # endif /* Call the underlying unsetenv, in case there is hidden bookkeeping that needs updating beyond just modifying environ. */ int rpl_unsetenv (const char *name) { int result = 0; if (!name || !*name || strchr (name, '=')) { errno = EINVAL; return -1; } while (getenv (name)) # if !VOID_UNSETENV result = # endif unsetenv (name); return result; } #endif /* HAVE_UNSETENV */ pspp-1.4.1/gl/ftoastr.h0000644000175000017500000001457413723215636014373 0ustar00blpblp00000000000000/* floating point to accurate string Copyright (C) 2010-2020 Free Software Foundation, Inc. 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 3 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, see . */ /* Written by Paul Eggert. */ #ifndef _GL_FTOASTR_H #define _GL_FTOASTR_H #include "intprops.h" #include #include /* Store into BUF (of size BUFSIZE) an accurate minimal-precision string representation of a floating point number. FLAGS affect the formatting of the number. Pad the output string with spaces as necessary to width WIDTH bytes, in the style of printf. WIDTH must be nonnegative. X is the floating-point number to be converted. Return the number of bytes stored into BUF, not counting the terminating null. However, do not overrun BUF: if BUF is too small, return a fairly tight (but not necessarily exact) upper bound on the value that would have been returned if BUF had been big enough. If SIZE is zero, BUF may be a null pointer. On error (e.g., returned value would exceed INT_MAX), return -1 and set errno. Example: char buf[DBL_BUFSIZE_BOUND]; int r = dtoastr (buf, sizeof buf, 0, 0, 0.1); In the C locale, this sets R to 3 and stores "0.1" into BUF. */ int ftoastr (char *buf, size_t bufsize, int flags, int width, float x); int dtoastr (char *buf, size_t bufsize, int flags, int width, double x); int ldtoastr (char *buf, size_t bufsize, int flags, int width, long double x); /* The last two functions except that the formatting takes place in the C locale. */ int c_dtoastr (char *buf, size_t bufsize, int flags, int width, double x); int c_ldtoastr (char *buf, size_t bufsize, int flags, int width, long double x); /* Flag values for ftoastr etc. These can be ORed together. */ enum { /* Left justify within the width; the default is right justification. */ FTOASTR_LEFT_JUSTIFY = 1, /* Output "+" before positive numbers; the default outputs nothing. */ FTOASTR_ALWAYS_SIGNED = 2, /* Output " " before positive numbers; ignored if FTOASTR_ALWAYS_SIGNED is also given. */ FTOASTR_SPACE_POSITIVE = 4, /* Pad with zeros instead of spaces; ignored if FTOASTR_LEFT_JUSTIFY is also given. */ FTOASTR_ZERO_PAD = 8, /* Use 'E' instead of 'e' before the exponent. */ FTOASTR_UPPER_E = 16 }; /* _GL_FLT_PREC_BOUND is an upper bound on the precision needed to represent a float value without losing information. Likewise for _GL_DBL_PREC_BOUND and double, and _GL_LDBL_PREC_BOUND and long double. These are macros, not enums, to work around a bug in IBM xlc 12.1. */ #if FLT_RADIX == 10 /* decimal floating point */ # define _GL_FLT_PREC_BOUND FLT_MANT_DIG # define _GL_DBL_PREC_BOUND DBL_MANT_DIG # define _GL_LDBL_PREC_BOUND LDBL_MANT_DIG #else /* An upper bound on the number of bits needed to represent a single digit in a floating-point fraction. */ # if FLT_RADIX == 2 /* IEEE 754 floating point, VAX floating point, etc. */ # define _GL_FLOAT_DIG_BITS_BOUND 1 # elif FLT_RADIX <= 16 /* IBM hex floating point has FLT_RADIX == 16. */ # define _GL_FLOAT_DIG_BITS_BOUND 4 # else /* no machine is this bad, but let's be complete */ # define _GL_FLOAT_DIG_BITS_BOUND ((int) TYPE_WIDTH (int) - 1) # endif /* An upper bound on the number of decimal digits needed to represent a floating point number accurately, assuming a fraction contains DIG digits. For why the "+ 1" is needed, see "Binary to Decimal Conversion" in David Goldberg's paper "What Every Computer Scientist Should Know About Floating-Point Arithmetic" . */ # define _GL_FLOAT_PREC_BOUND(dig) \ (INT_BITS_STRLEN_BOUND ((dig) * _GL_FLOAT_DIG_BITS_BOUND) + 1) # define _GL_FLT_PREC_BOUND _GL_FLOAT_PREC_BOUND ( FLT_MANT_DIG) # define _GL_DBL_PREC_BOUND _GL_FLOAT_PREC_BOUND ( DBL_MANT_DIG) # define _GL_LDBL_PREC_BOUND _GL_FLOAT_PREC_BOUND (LDBL_MANT_DIG) #endif /* Bound on the number of bytes printed for an exponent in the range MIN..MAX, where MIN < 0 < MAX; printf always prints a sign and at least 2 digits. Although the maximum known exponent is 4932 for IEEE 754 binary128, support tight bounds for exponents up to a million, just in case. */ #define _GL_FLOAT_EXPONENT_STRLEN_BOUND(min, max) \ ( -100 < (min) && (max) < 100 ? 3 \ : -1000 < (min) && (max) < 1000 ? 4 \ : -10000 < (min) && (max) < 10000 ? 5 \ : -100000 < (min) && (max) < 100000 ? 6 \ : -1000000 < (min) && (max) < 1000000 ? 7 \ : INT_STRLEN_BOUND (int) /* not a tight bound */) /* A reasonably tight bound on the length of a type-T floating value formatted with ftoastr etc. Room is needed for sign, fraction digits, decimal point, "e", and exponent. POINTLEN should be a reasonably tight bound on the string length of the decimal point. */ #define _GL_FLOAT_STRLEN_BOUND_L(t, pointlen) \ (1 + _GL_##t##_PREC_BOUND + pointlen + 1 \ + _GL_FLOAT_EXPONENT_STRLEN_BOUND (t##_MIN_10_EXP, t##_MAX_10_EXP)) #define FLT_STRLEN_BOUND_L(pointlen) _GL_FLOAT_STRLEN_BOUND_L ( FLT, pointlen) #define DBL_STRLEN_BOUND_L(pointlen) _GL_FLOAT_STRLEN_BOUND_L ( DBL, pointlen) #define LDBL_STRLEN_BOUND_L(pointlen) _GL_FLOAT_STRLEN_BOUND_L (LDBL, pointlen) /* Looser bounds that are locale-independent and are integral constant expressions. */ #define FLT_STRLEN_BOUND FLT_STRLEN_BOUND_L (MB_LEN_MAX) #define DBL_STRLEN_BOUND DBL_STRLEN_BOUND_L (MB_LEN_MAX) #define LDBL_STRLEN_BOUND LDBL_STRLEN_BOUND_L (MB_LEN_MAX) /* Looser, locale-independent bounds that include the trailing null byte. */ #define FLT_BUFSIZE_BOUND ( FLT_STRLEN_BOUND + 1) #define DBL_BUFSIZE_BOUND ( DBL_STRLEN_BOUND + 1) #define LDBL_BUFSIZE_BOUND (LDBL_STRLEN_BOUND + 1) #endif /* _GL_FTOASTR_H */ pspp-1.4.1/gl/strerror-override.c0000644000175000017500000002146613723215640016374 0ustar00blpblp00000000000000/* strerror-override.c --- POSIX compatible system error routine Copyright (C) 2010-2020 Free Software Foundation, Inc. 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 3 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, see . */ /* Written by Bruno Haible , 2010. */ #include #include "strerror-override.h" #include #if GNULIB_defined_EWINSOCK /* native Windows platforms */ # if HAVE_WINSOCK2_H # include # endif #endif /* If ERRNUM maps to an errno value defined by gnulib, return a string describing the error. Otherwise return NULL. */ const char * strerror_override (int errnum) { /* These error messages are taken from glibc/sysdeps/gnu/errlist.c. */ switch (errnum) { #if REPLACE_STRERROR_0 case 0: return "Success"; #endif #if GNULIB_defined_ESOCK /* native Windows platforms with older */ case EINPROGRESS: return "Operation now in progress"; case EALREADY: return "Operation already in progress"; case ENOTSOCK: return "Socket operation on non-socket"; case EDESTADDRREQ: return "Destination address required"; case EMSGSIZE: return "Message too long"; case EPROTOTYPE: return "Protocol wrong type for socket"; case ENOPROTOOPT: return "Protocol not available"; case EPROTONOSUPPORT: return "Protocol not supported"; case EOPNOTSUPP: return "Operation not supported"; case EAFNOSUPPORT: return "Address family not supported by protocol"; case EADDRINUSE: return "Address already in use"; case EADDRNOTAVAIL: return "Cannot assign requested address"; case ENETDOWN: return "Network is down"; case ENETUNREACH: return "Network is unreachable"; case ECONNRESET: return "Connection reset by peer"; case ENOBUFS: return "No buffer space available"; case EISCONN: return "Transport endpoint is already connected"; case ENOTCONN: return "Transport endpoint is not connected"; case ETIMEDOUT: return "Connection timed out"; case ECONNREFUSED: return "Connection refused"; case ELOOP: return "Too many levels of symbolic links"; case EHOSTUNREACH: return "No route to host"; case EWOULDBLOCK: return "Operation would block"; #endif #if GNULIB_defined_ESTREAMS /* native Windows platforms with older */ case ETXTBSY: return "Text file busy"; case ENODATA: return "No data available"; case ENOSR: return "Out of streams resources"; case ENOSTR: return "Device not a stream"; case ETIME: return "Timer expired"; case EOTHER: return "Other error"; #endif #if GNULIB_defined_EWINSOCK /* native Windows platforms */ case ESOCKTNOSUPPORT: return "Socket type not supported"; case EPFNOSUPPORT: return "Protocol family not supported"; case ESHUTDOWN: return "Cannot send after transport endpoint shutdown"; case ETOOMANYREFS: return "Too many references: cannot splice"; case EHOSTDOWN: return "Host is down"; case EPROCLIM: return "Too many processes"; case EUSERS: return "Too many users"; case EDQUOT: return "Disk quota exceeded"; case ESTALE: return "Stale NFS file handle"; case EREMOTE: return "Object is remote"; # if HAVE_WINSOCK2_H /* WSA_INVALID_HANDLE maps to EBADF */ /* WSA_NOT_ENOUGH_MEMORY maps to ENOMEM */ /* WSA_INVALID_PARAMETER maps to EINVAL */ case WSA_OPERATION_ABORTED: return "Overlapped operation aborted"; case WSA_IO_INCOMPLETE: return "Overlapped I/O event object not in signaled state"; case WSA_IO_PENDING: return "Overlapped operations will complete later"; /* WSAEINTR maps to EINTR */ /* WSAEBADF maps to EBADF */ /* WSAEACCES maps to EACCES */ /* WSAEFAULT maps to EFAULT */ /* WSAEINVAL maps to EINVAL */ /* WSAEMFILE maps to EMFILE */ /* WSAEWOULDBLOCK maps to EWOULDBLOCK */ /* WSAEINPROGRESS maps to EINPROGRESS */ /* WSAEALREADY maps to EALREADY */ /* WSAENOTSOCK maps to ENOTSOCK */ /* WSAEDESTADDRREQ maps to EDESTADDRREQ */ /* WSAEMSGSIZE maps to EMSGSIZE */ /* WSAEPROTOTYPE maps to EPROTOTYPE */ /* WSAENOPROTOOPT maps to ENOPROTOOPT */ /* WSAEPROTONOSUPPORT maps to EPROTONOSUPPORT */ /* WSAESOCKTNOSUPPORT is ESOCKTNOSUPPORT */ /* WSAEOPNOTSUPP maps to EOPNOTSUPP */ /* WSAEPFNOSUPPORT is EPFNOSUPPORT */ /* WSAEAFNOSUPPORT maps to EAFNOSUPPORT */ /* WSAEADDRINUSE maps to EADDRINUSE */ /* WSAEADDRNOTAVAIL maps to EADDRNOTAVAIL */ /* WSAENETDOWN maps to ENETDOWN */ /* WSAENETUNREACH maps to ENETUNREACH */ /* WSAENETRESET maps to ENETRESET */ /* WSAECONNABORTED maps to ECONNABORTED */ /* WSAECONNRESET maps to ECONNRESET */ /* WSAENOBUFS maps to ENOBUFS */ /* WSAEISCONN maps to EISCONN */ /* WSAENOTCONN maps to ENOTCONN */ /* WSAESHUTDOWN is ESHUTDOWN */ /* WSAETOOMANYREFS is ETOOMANYREFS */ /* WSAETIMEDOUT maps to ETIMEDOUT */ /* WSAECONNREFUSED maps to ECONNREFUSED */ /* WSAELOOP maps to ELOOP */ /* WSAENAMETOOLONG maps to ENAMETOOLONG */ /* WSAEHOSTDOWN is EHOSTDOWN */ /* WSAEHOSTUNREACH maps to EHOSTUNREACH */ /* WSAENOTEMPTY maps to ENOTEMPTY */ /* WSAEPROCLIM is EPROCLIM */ /* WSAEUSERS is EUSERS */ /* WSAEDQUOT is EDQUOT */ /* WSAESTALE is ESTALE */ /* WSAEREMOTE is EREMOTE */ case WSASYSNOTREADY: return "Network subsystem is unavailable"; case WSAVERNOTSUPPORTED: return "Winsock.dll version out of range"; case WSANOTINITIALISED: return "Successful WSAStartup not yet performed"; case WSAEDISCON: return "Graceful shutdown in progress"; case WSAENOMORE: case WSA_E_NO_MORE: return "No more results"; case WSAECANCELLED: case WSA_E_CANCELLED: return "Call was canceled"; case WSAEINVALIDPROCTABLE: return "Procedure call table is invalid"; case WSAEINVALIDPROVIDER: return "Service provider is invalid"; case WSAEPROVIDERFAILEDINIT: return "Service provider failed to initialize"; case WSASYSCALLFAILURE: return "System call failure"; case WSASERVICE_NOT_FOUND: return "Service not found"; case WSATYPE_NOT_FOUND: return "Class type not found"; case WSAEREFUSED: return "Database query was refused"; case WSAHOST_NOT_FOUND: return "Host not found"; case WSATRY_AGAIN: return "Nonauthoritative host not found"; case WSANO_RECOVERY: return "Nonrecoverable error"; case WSANO_DATA: return "Valid name, no data record of requested type"; /* WSA_QOS_* omitted */ # endif #endif #if GNULIB_defined_ENOMSG case ENOMSG: return "No message of desired type"; #endif #if GNULIB_defined_EIDRM case EIDRM: return "Identifier removed"; #endif #if GNULIB_defined_ENOLINK case ENOLINK: return "Link has been severed"; #endif #if GNULIB_defined_EPROTO case EPROTO: return "Protocol error"; #endif #if GNULIB_defined_EMULTIHOP case EMULTIHOP: return "Multihop attempted"; #endif #if GNULIB_defined_EBADMSG case EBADMSG: return "Bad message"; #endif #if GNULIB_defined_EOVERFLOW case EOVERFLOW: return "Value too large for defined data type"; #endif #if GNULIB_defined_ENOTSUP case ENOTSUP: return "Not supported"; #endif #if GNULIB_defined_ENETRESET case ENETRESET: return "Network dropped connection on reset"; #endif #if GNULIB_defined_ECONNABORTED case ECONNABORTED: return "Software caused connection abort"; #endif #if GNULIB_defined_ESTALE case ESTALE: return "Stale NFS file handle"; #endif #if GNULIB_defined_EDQUOT case EDQUOT: return "Disk quota exceeded"; #endif #if GNULIB_defined_ECANCELED case ECANCELED: return "Operation canceled"; #endif #if GNULIB_defined_EOWNERDEAD case EOWNERDEAD: return "Owner died"; #endif #if GNULIB_defined_ENOTRECOVERABLE case ENOTRECOVERABLE: return "State not recoverable"; #endif #if GNULIB_defined_EILSEQ case EILSEQ: return "Invalid or incomplete multibyte or wide character"; #endif default: return NULL; } } pspp-1.4.1/gl/printf.c0000644000175000017500000000222313723215640014165 0ustar00blpblp00000000000000/* Formatted output to a stream. Copyright (C) 2007, 2010-2020 Free Software Foundation, Inc. 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 3 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, see . */ #ifdef HAVE_CONFIG_H # include #endif /* Specification. */ #include #include /* Print formatted output to standard output. Return string length of formatted string. On error, return a negative value. */ int printf (const char *format, ...) { int retval; va_list args; va_start (args, format); retval = vfprintf (stdout, format, args); va_end (args); return retval; } pspp-1.4.1/gl/frexpl.c0000644000175000017500000000175713723215636014203 0ustar00blpblp00000000000000/* Split a 'long double' into fraction and mantissa. Copyright (C) 2007, 2009-2020 Free Software Foundation, Inc. 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 3 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, see . */ #include #if HAVE_SAME_LONG_DOUBLE_AS_DOUBLE /* Specification. */ # include long double frexpl (long double x, int *expptr) { return frexp (x, expptr); } #else # define USE_LONG_DOUBLE # include "frexp.c" #endif pspp-1.4.1/gl/getline.c0000644000175000017500000000166713723215637014333 0ustar00blpblp00000000000000/* getline.c --- Implementation of replacement getline function. Copyright (C) 2005-2007, 2009-2020 Free Software Foundation, Inc. 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 3, 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, see . */ /* Written by Simon Josefsson. */ #include #include ssize_t getline (char **lineptr, size_t *n, FILE *stream) { return getdelim (lineptr, n, '\n', stream); } pspp-1.4.1/gl/vasprintf.c0000644000175000017500000000247313723215640014706 0ustar00blpblp00000000000000/* Formatted output to strings. Copyright (C) 1999, 2002, 2006-2020 Free Software Foundation, Inc. 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 3, 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, see . */ #include /* Specification. */ #ifdef IN_LIBASPRINTF # include "vasprintf.h" #else # include #endif #include #include #include #include "vasnprintf.h" int vasprintf (char **resultp, const char *format, va_list args) { size_t length; char *result = vasnprintf (NULL, &length, format, args); if (result == NULL) return -1; if (length > INT_MAX) { free (result); errno = EOVERFLOW; return -1; } *resultp = result; /* Return the number of resulting bytes, excluding the trailing NUL. */ return length; } pspp-1.4.1/gl/tempname.c0000644000175000017500000002131713723215640014476 0ustar00blpblp00000000000000/* Copyright (C) 1991-2020 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library 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 3 of the License, or (at your option) any later version. The GNU C Library 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 the GNU C Library; if not, see . */ #if !_LIBC # include # include "tempname.h" #endif #include #include #include #include #ifndef P_tmpdir # define P_tmpdir "/tmp" #endif #ifndef TMP_MAX # define TMP_MAX 238328 #endif #ifndef __GT_FILE # define __GT_FILE 0 # define __GT_DIR 1 # define __GT_NOCREATE 2 #endif #if !_LIBC && (GT_FILE != __GT_FILE || GT_DIR != __GT_DIR \ || GT_NOCREATE != __GT_NOCREATE) # error report this to bug-gnulib@gnu.org #endif #include #include #include #include #include #include #include #if _LIBC # define struct_stat64 struct stat64 # define __secure_getenv __libc_secure_getenv #else # define struct_stat64 struct stat # define __gen_tempname gen_tempname # define __mkdir mkdir # define __open open # define __lxstat64(version, file, buf) lstat (file, buf) #endif #ifdef _LIBC # include # define RANDOM_BITS(Var) ((Var) = random_bits ()) typedef uint32_t random_value; # define RANDOM_VALUE_MAX UINT32_MAX # define BASE_62_DIGITS 5 /* 62**5 < UINT32_MAX */ # define BASE_62_POWER (62 * 62 * 62 * 62 * 62) /* 2**BASE_62_DIGITS */ #else /* Use getrandom if it works, falling back on a 64-bit linear congruential generator that starts with whatever Var's value happens to be. */ # define RANDOM_BITS(Var) \ ((void) (getrandom (&(Var), sizeof (Var), 0) == sizeof (Var) \ || ((Var) = 2862933555777941757 * (Var) + 3037000493))) typedef uint_fast64_t random_value; # define RANDOM_VALUE_MAX UINT_FAST64_MAX # define BASE_62_DIGITS 10 /* 62**10 < UINT_FAST64_MAX */ # define BASE_62_POWER (62LL * 62 * 62 * 62 * 62 * 62 * 62 * 62 * 62 * 62) #endif #if _LIBC /* Return nonzero if DIR is an existent directory. */ static int direxists (const char *dir) { struct_stat64 buf; return __xstat64 (_STAT_VER, dir, &buf) == 0 && S_ISDIR (buf.st_mode); } /* Path search algorithm, for tmpnam, tmpfile, etc. If DIR is non-null and exists, uses it; otherwise uses the first of $TMPDIR, P_tmpdir, /tmp that exists. Copies into TMPL a template suitable for use with mk[s]temp. Will fail (-1) if DIR is non-null and doesn't exist, none of the searched dirs exists, or there's not enough space in TMPL. */ int __path_search (char *tmpl, size_t tmpl_len, const char *dir, const char *pfx, int try_tmpdir) { const char *d; size_t dlen, plen; if (!pfx || !pfx[0]) { pfx = "file"; plen = 4; } else { plen = strlen (pfx); if (plen > 5) plen = 5; } if (try_tmpdir) { d = __secure_getenv ("TMPDIR"); if (d != NULL && direxists (d)) dir = d; else if (dir != NULL && direxists (dir)) /* nothing */ ; else dir = NULL; } if (dir == NULL) { if (direxists (P_tmpdir)) dir = P_tmpdir; else if (strcmp (P_tmpdir, "/tmp") != 0 && direxists ("/tmp")) dir = "/tmp"; else { __set_errno (ENOENT); return -1; } } dlen = strlen (dir); while (dlen > 1 && dir[dlen - 1] == '/') dlen--; /* remove trailing slashes */ /* check we have room for "${dir}/${pfx}XXXXXX\0" */ if (tmpl_len < dlen + 1 + plen + 6 + 1) { __set_errno (EINVAL); return -1; } sprintf (tmpl, "%.*s/%.*sXXXXXX", (int) dlen, dir, (int) plen, pfx); return 0; } #endif /* _LIBC */ #if _LIBC static int try_tempname_len (char *, int, void *, int (*) (char *, void *), size_t); #endif static int try_file (char *tmpl, void *flags) { int *openflags = flags; return __open (tmpl, (*openflags & ~O_ACCMODE) | O_RDWR | O_CREAT | O_EXCL, S_IRUSR | S_IWUSR); } static int try_dir (char *tmpl, void *flags _GL_UNUSED) { return __mkdir (tmpl, S_IRUSR | S_IWUSR | S_IXUSR); } static int try_nocreate (char *tmpl, void *flags _GL_UNUSED) { struct_stat64 st; if (__lxstat64 (_STAT_VER, tmpl, &st) == 0 || errno == EOVERFLOW) __set_errno (EEXIST); return errno == ENOENT ? 0 : -1; } /* These are the characters used in temporary file names. */ static const char letters[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; /* Generate a temporary file name based on TMPL. TMPL must match the rules for mk[s]temp (i.e., end in at least X_SUFFIX_LEN "X"s, possibly with a suffix). The name constructed does not exist at the time of the call to this function. TMPL is overwritten with the result. KIND may be one of: __GT_NOCREATE: simply verify that the name does not exist at the time of the call. __GT_FILE: create the file using open(O_CREAT|O_EXCL) and return a read-write fd. The file is mode 0600. __GT_DIR: create a directory, which will be mode 0700. We use a clever algorithm to get hard-to-predict names. */ #ifdef _LIBC static #endif int gen_tempname_len (char *tmpl, int suffixlen, int flags, int kind, size_t x_suffix_len) { static int (*const tryfunc[]) (char *, void *) = { [__GT_FILE] = try_file, [__GT_DIR] = try_dir, [__GT_NOCREATE] = try_nocreate }; return try_tempname_len (tmpl, suffixlen, &flags, tryfunc[kind], x_suffix_len); } #ifdef _LIBC static #endif int try_tempname_len (char *tmpl, int suffixlen, void *args, int (*tryfunc) (char *, void *), size_t x_suffix_len) { size_t len; char *XXXXXX; unsigned int count; int fd = -1; int save_errno = errno; /* A lower bound on the number of temporary files to attempt to generate. The maximum total number of temporary file names that can exist for a given template is 62**6. It should never be necessary to try all of these combinations. Instead if a reasonable number of names is tried (we define reasonable as 62**3) fail to give the system administrator the chance to remove the problems. This value requires that X_SUFFIX_LEN be at least 3. */ #define ATTEMPTS_MIN (62 * 62 * 62) /* The number of times to attempt to generate a temporary file. To conform to POSIX, this must be no smaller than TMP_MAX. */ #if ATTEMPTS_MIN < TMP_MAX unsigned int attempts = TMP_MAX; #else unsigned int attempts = ATTEMPTS_MIN; #endif /* A random variable. */ random_value v; /* How many random base-62 digits can currently be extracted from V. */ int vdigits = 0; /* Least unfair value for V. If V is less than this, V can generate BASE_62_DIGITS digits fairly. Otherwise it might be biased. */ random_value const unfair_min = RANDOM_VALUE_MAX - RANDOM_VALUE_MAX % BASE_62_POWER; len = strlen (tmpl); if (len < x_suffix_len + suffixlen || strspn (&tmpl[len - x_suffix_len - suffixlen], "X") < x_suffix_len) { __set_errno (EINVAL); return -1; } /* This is where the Xs start. */ XXXXXX = &tmpl[len - x_suffix_len - suffixlen]; for (count = 0; count < attempts; ++count) { for (size_t i = 0; i < x_suffix_len; i++) { if (vdigits == 0) { do RANDOM_BITS (v); while (unfair_min <= v); vdigits = BASE_62_DIGITS; } XXXXXX[i] = letters[v % 62]; v /= 62; vdigits--; } fd = tryfunc (tmpl, args); if (fd >= 0) { __set_errno (save_errno); return fd; } else if (errno != EEXIST) return -1; } /* We got out of the loop because we ran out of combinations to try. */ __set_errno (EEXIST); return -1; } int __gen_tempname (char *tmpl, int suffixlen, int flags, int kind) { return gen_tempname_len (tmpl, suffixlen, flags, kind, 6); } #if !_LIBC int try_tempname (char *tmpl, int suffixlen, void *args, int (*tryfunc) (char *, void *)) { return try_tempname_len (tmpl, suffixlen, args, tryfunc, 6); } #endif pspp-1.4.1/gl/safe-write.h0000644000175000017500000000333513723215640014743 0ustar00blpblp00000000000000/* An interface to write() that retries after interrupts. Copyright (C) 2002, 2009-2020 Free Software Foundation, Inc. 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 3 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, see . */ /* Some system calls may be interrupted and fail with errno = EINTR in the following situations: - The process is stopped and restarted (signal SIGSTOP and SIGCONT, user types Ctrl-Z) on some platforms: Mac OS X. - The process receives a signal for which a signal handler was installed with sigaction() with an sa_flags field that does not contain SA_RESTART. - The process receives a signal for which a signal handler was installed with signal() and for which no call to siginterrupt(sig,0) was done, on some platforms: AIX, HP-UX, IRIX, OSF/1, Solaris. This module provides a wrapper around write() that handles EINTR. */ #include #define SAFE_WRITE_ERROR ((size_t) -1) /* Write up to COUNT bytes at BUF to descriptor FD, retrying if interrupted. Return the actual number of bytes written, zero for EOF, or SAFE_WRITE_ERROR upon error. */ extern size_t safe_write (int fd, const void *buf, size_t count); pspp-1.4.1/gl/sys_time.in.h0000644000175000017500000001736413723215640015145 0ustar00blpblp00000000000000/* Provide a more complete sys/time.h. Copyright (C) 2007-2020 Free Software Foundation, Inc. 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 3, 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, see . */ /* Written by Paul Eggert. */ #ifndef _@GUARD_PREFIX@_SYS_TIME_H #if __GNUC__ >= 3 @PRAGMA_SYSTEM_HEADER@ #endif @PRAGMA_COLUMNS@ /* On Cygwin and on many BSDish systems, includes itself recursively via . Simply delegate to the system's header in this case; it is a no-op. Without this extra ifdef, the C++ gettimeofday declaration below would be a forward declaration in gnulib's nested . */ #if defined _CYGWIN_SYS_TIME_H || defined _SYS_TIME_H || defined _SYS_TIME_H_ # @INCLUDE_NEXT@ @NEXT_SYS_TIME_H@ #else /* The include_next requires a split double-inclusion guard. */ #if @HAVE_SYS_TIME_H@ # @INCLUDE_NEXT@ @NEXT_SYS_TIME_H@ #endif #ifndef _@GUARD_PREFIX@_SYS_TIME_H #define _@GUARD_PREFIX@_SYS_TIME_H #if ! @HAVE_SYS_TIME_H@ # include #endif /* On native Windows with MSVC, get the 'struct timeval' type. Also, on native Windows with a 64-bit time_t, where we are overriding the 'struct timeval' type, get all declarations of system functions whose signature contains 'struct timeval'. */ #if (defined _MSC_VER || @REPLACE_STRUCT_TIMEVAL@) && @HAVE_WINSOCK2_H@ && !defined _GL_INCLUDING_WINSOCK2_H # define _GL_INCLUDING_WINSOCK2_H # include # undef _GL_INCLUDING_WINSOCK2_H #endif /* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */ /* The definition of _GL_ARG_NONNULL is copied here. */ /* The definition of _GL_WARN_ON_USE is copied here. */ #ifdef __cplusplus extern "C" { #endif #if !@HAVE_STRUCT_TIMEVAL@ || @REPLACE_STRUCT_TIMEVAL@ # if @REPLACE_STRUCT_TIMEVAL@ # define timeval rpl_timeval # endif # if !GNULIB_defined_struct_timeval struct timeval { time_t tv_sec; long int tv_usec; }; # define GNULIB_defined_struct_timeval 1 # endif #endif #ifdef __cplusplus } #endif #if @GNULIB_GETTIMEOFDAY@ # if @REPLACE_GETTIMEOFDAY@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef gettimeofday # define gettimeofday rpl_gettimeofday # endif _GL_FUNCDECL_RPL (gettimeofday, int, (struct timeval *restrict, void *restrict) _GL_ARG_NONNULL ((1))); _GL_CXXALIAS_RPL (gettimeofday, int, (struct timeval *restrict, void *restrict)); # else # if !@HAVE_GETTIMEOFDAY@ _GL_FUNCDECL_SYS (gettimeofday, int, (struct timeval *restrict, void *restrict) _GL_ARG_NONNULL ((1))); # endif /* Need to cast, because on glibc systems, by default, the second argument is struct timezone *. */ _GL_CXXALIAS_SYS_CAST (gettimeofday, int, (struct timeval *restrict, void *restrict)); # endif _GL_CXXALIASWARN (gettimeofday); # if defined __cplusplus && defined GNULIB_NAMESPACE namespace GNULIB_NAMESPACE { typedef ::timeval # undef timeval timeval; # if @REPLACE_STRUCT_TIMEVAL@ # define timeval rpl_timeval typedef ::timeval timeval; # endif } # endif #elif defined GNULIB_POSIXCHECK # undef gettimeofday # if HAVE_RAW_DECL_GETTIMEOFDAY _GL_WARN_ON_USE (gettimeofday, "gettimeofday is unportable - " "use gnulib module gettimeofday for portability"); # endif #endif /* Hide some function declarations from . */ #if defined _MSC_VER && @HAVE_WINSOCK2_H@ # if !defined _@GUARD_PREFIX@_UNISTD_H # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef close # define close close_used_without_including_unistd_h # else _GL_WARN_ON_USE (close, "close() used without including "); # endif # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef gethostname # define gethostname gethostname_used_without_including_unistd_h # else _GL_WARN_ON_USE (gethostname, "gethostname() used without including "); # endif # endif # if !defined _@GUARD_PREFIX@_SYS_SOCKET_H # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef socket # define socket socket_used_without_including_sys_socket_h # undef connect # define connect connect_used_without_including_sys_socket_h # undef accept # define accept accept_used_without_including_sys_socket_h # undef bind # define bind bind_used_without_including_sys_socket_h # undef getpeername # define getpeername getpeername_used_without_including_sys_socket_h # undef getsockname # define getsockname getsockname_used_without_including_sys_socket_h # undef getsockopt # define getsockopt getsockopt_used_without_including_sys_socket_h # undef listen # define listen listen_used_without_including_sys_socket_h # undef recv # define recv recv_used_without_including_sys_socket_h # undef send # define send send_used_without_including_sys_socket_h # undef recvfrom # define recvfrom recvfrom_used_without_including_sys_socket_h # undef sendto # define sendto sendto_used_without_including_sys_socket_h # undef setsockopt # define setsockopt setsockopt_used_without_including_sys_socket_h # undef shutdown # define shutdown shutdown_used_without_including_sys_socket_h # else _GL_WARN_ON_USE (socket, "socket() used without including "); _GL_WARN_ON_USE (connect, "connect() used without including "); _GL_WARN_ON_USE (accept, "accept() used without including "); _GL_WARN_ON_USE (bind, "bind() used without including "); _GL_WARN_ON_USE (getpeername, "getpeername() used without including "); _GL_WARN_ON_USE (getsockname, "getsockname() used without including "); _GL_WARN_ON_USE (getsockopt, "getsockopt() used without including "); _GL_WARN_ON_USE (listen, "listen() used without including "); _GL_WARN_ON_USE (recv, "recv() used without including "); _GL_WARN_ON_USE (send, "send() used without including "); _GL_WARN_ON_USE (recvfrom, "recvfrom() used without including "); _GL_WARN_ON_USE (sendto, "sendto() used without including "); _GL_WARN_ON_USE (setsockopt, "setsockopt() used without including "); _GL_WARN_ON_USE (shutdown, "shutdown() used without including "); # endif # endif # if !defined _@GUARD_PREFIX@_SYS_SELECT_H # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef select # define select select_used_without_including_sys_select_h # else _GL_WARN_ON_USE (select, "select() used without including "); # endif # endif #endif #endif /* _@GUARD_PREFIX@_SYS_TIME_H */ #endif /* _CYGWIN_SYS_TIME_H */ #endif /* _@GUARD_PREFIX@_SYS_TIME_H */ pspp-1.4.1/gl/stat-w32.c0000644000175000017500000004324313723215640014256 0ustar00blpblp00000000000000/* Core of implementation of fstat and stat for native Windows. Copyright (C) 2017-2020 Free Software Foundation, Inc. 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 3 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, see . */ /* Written by Bruno Haible. */ #include #if defined _WIN32 && ! defined __CYGWIN__ /* Ensure that defines FILE_ID_INFO. */ #if !defined _WIN32_WINNT || (_WIN32_WINNT < _WIN32_WINNT_WIN8) # undef _WIN32_WINNT # define _WIN32_WINNT _WIN32_WINNT_WIN8 #endif #include #include #include #include #include #include #include /* Specification. */ #include "stat-w32.h" #include "pathmax.h" #include "verify.h" /* Don't assume that UNICODE is not defined. */ #undef LoadLibrary #define LoadLibrary LoadLibraryA #undef GetFinalPathNameByHandle #define GetFinalPathNameByHandle GetFinalPathNameByHandleA #if !(_WIN32_WINNT >= _WIN32_WINNT_VISTA) /* Avoid warnings from gcc -Wcast-function-type. */ # define GetProcAddress \ (void *) GetProcAddress # if _GL_WINDOWS_STAT_INODES == 2 /* GetFileInformationByHandleEx was introduced only in Windows Vista. */ typedef DWORD (WINAPI * GetFileInformationByHandleExFuncType) (HANDLE hFile, FILE_INFO_BY_HANDLE_CLASS fiClass, LPVOID lpBuffer, DWORD dwBufferSize); static GetFileInformationByHandleExFuncType GetFileInformationByHandleExFunc = NULL; # endif /* GetFinalPathNameByHandle was introduced only in Windows Vista. */ typedef DWORD (WINAPI * GetFinalPathNameByHandleFuncType) (HANDLE hFile, LPSTR lpFilePath, DWORD lenFilePath, DWORD dwFlags); static GetFinalPathNameByHandleFuncType GetFinalPathNameByHandleFunc = NULL; static BOOL initialized = FALSE; static void initialize (void) { HMODULE kernel32 = LoadLibrary ("kernel32.dll"); if (kernel32 != NULL) { # if _GL_WINDOWS_STAT_INODES == 2 GetFileInformationByHandleExFunc = (GetFileInformationByHandleExFuncType) GetProcAddress (kernel32, "GetFileInformationByHandleEx"); # endif GetFinalPathNameByHandleFunc = (GetFinalPathNameByHandleFuncType) GetProcAddress (kernel32, "GetFinalPathNameByHandleA"); } initialized = TRUE; } #else # define GetFileInformationByHandleExFunc GetFileInformationByHandleEx # define GetFinalPathNameByHandleFunc GetFinalPathNameByHandle #endif /* Converts a FILETIME to GMT time since 1970-01-01 00:00:00. */ #if _GL_WINDOWS_STAT_TIMESPEC struct timespec _gl_convert_FILETIME_to_timespec (const FILETIME *ft) { struct timespec result; /* FILETIME: */ unsigned long long since_1601 = ((unsigned long long) ft->dwHighDateTime << 32) | (unsigned long long) ft->dwLowDateTime; if (since_1601 == 0) { result.tv_sec = 0; result.tv_nsec = 0; } else { /* Between 1601-01-01 and 1970-01-01 there were 280 normal years and 89 leap years, in total 134774 days. */ unsigned long long since_1970 = since_1601 - (unsigned long long) 134774 * (unsigned long long) 86400 * (unsigned long long) 10000000; result.tv_sec = since_1970 / (unsigned long long) 10000000; result.tv_nsec = (unsigned long) (since_1970 % (unsigned long long) 10000000) * 100; } return result; } #else time_t _gl_convert_FILETIME_to_POSIX (const FILETIME *ft) { /* FILETIME: */ unsigned long long since_1601 = ((unsigned long long) ft->dwHighDateTime << 32) | (unsigned long long) ft->dwLowDateTime; if (since_1601 == 0) return 0; else { /* Between 1601-01-01 and 1970-01-01 there were 280 normal years and 89 leap years, in total 134774 days. */ unsigned long long since_1970 = since_1601 - (unsigned long long) 134774 * (unsigned long long) 86400 * (unsigned long long) 10000000; return since_1970 / (unsigned long long) 10000000; } } #endif /* Fill *BUF with information about the file designated by H. PATH is the file name, if known, otherwise NULL. Return 0 if successful, or -1 with errno set upon failure. */ int _gl_fstat_by_handle (HANDLE h, const char *path, struct stat *buf) { /* GetFileType */ DWORD type = GetFileType (h); if (type == FILE_TYPE_DISK) { #if !(_WIN32_WINNT >= _WIN32_WINNT_VISTA) if (!initialized) initialize (); #endif /* st_mode can be determined through GetFileAttributesEx or through GetFileInformationByHandle or through GetFileInformationByHandleEx with argument FileBasicInfo The latter requires -D_WIN32_WINNT=_WIN32_WINNT_VISTA or higher. */ BY_HANDLE_FILE_INFORMATION info; if (! GetFileInformationByHandle (h, &info)) goto failed; /* Test for error conditions before starting to fill *buf. */ if (sizeof (buf->st_size) <= 4 && info.nFileSizeHigh > 0) { errno = EOVERFLOW; return -1; } #if _GL_WINDOWS_STAT_INODES /* st_ino can be determined through GetFileInformationByHandle as 64 bits, or through GetFileInformationByHandleEx with argument FileIdInfo as 128 bits. The latter requires -D_WIN32_WINNT=_WIN32_WINNT_WIN8 or higher. */ /* Experiments show that GetFileInformationByHandleEx does not provide much more information than GetFileInformationByHandle: * The dwVolumeSerialNumber from GetFileInformationByHandle is equal to the low 32 bits of the 64-bit VolumeSerialNumber from GetFileInformationByHandleEx, and is apparently sufficient for identifying the device. * The nFileIndex from GetFileInformationByHandle is equal to the low 64 bits of the 128-bit FileId from GetFileInformationByHandleEx, and the high 64 bits of this 128-bit FileId are zero. * On a FAT file system, GetFileInformationByHandleEx fails with error ERROR_INVALID_PARAMETER, whereas GetFileInformationByHandle succeeds. * On a CIFS/SMB file system, GetFileInformationByHandleEx fails with error ERROR_INVALID_LEVEL, whereas GetFileInformationByHandle succeeds. */ # if _GL_WINDOWS_STAT_INODES == 2 if (GetFileInformationByHandleExFunc != NULL) { FILE_ID_INFO id; if (GetFileInformationByHandleExFunc (h, FileIdInfo, &id, sizeof (id))) { buf->st_dev = id.VolumeSerialNumber; verify (sizeof (ino_t) == sizeof (id.FileId)); memcpy (&buf->st_ino, &id.FileId, sizeof (ino_t)); goto ino_done; } else { switch (GetLastError ()) { case ERROR_INVALID_PARAMETER: /* older Windows version, or FAT */ case ERROR_INVALID_LEVEL: /* CIFS/SMB file system */ goto fallback; default: goto failed; } } } fallback: ; /* Fallback for older Windows versions. */ buf->st_dev = info.dwVolumeSerialNumber; buf->st_ino._gl_ino[0] = ((ULONGLONG) info.nFileIndexHigh << 32) | (ULONGLONG) info.nFileIndexLow; buf->st_ino._gl_ino[1] = 0; ino_done: ; # else /* _GL_WINDOWS_STAT_INODES == 1 */ buf->st_dev = info.dwVolumeSerialNumber; buf->st_ino = ((ULONGLONG) info.nFileIndexHigh << 32) | (ULONGLONG) info.nFileIndexLow; # endif #else /* st_ino is not wide enough for identifying a file on a device. Without st_ino, st_dev is pointless. */ buf->st_dev = 0; buf->st_ino = 0; #endif /* st_mode. */ unsigned int mode = /* XXX How to handle FILE_ATTRIBUTE_REPARSE_POINT ? */ ((info.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) ? _S_IFDIR | S_IEXEC_UGO : _S_IFREG) | S_IREAD_UGO | ((info.dwFileAttributes & FILE_ATTRIBUTE_READONLY) ? 0 : S_IWRITE_UGO); if (!(info.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) { /* Determine whether the file is executable by looking at the file name suffix. If the file name is already known, use it. Otherwise, for non-empty files, it can be determined through GetFinalPathNameByHandle or through GetFileInformationByHandleEx with argument FileNameInfo Both require -D_WIN32_WINNT=_WIN32_WINNT_VISTA or higher. */ if (info.nFileSizeHigh > 0 || info.nFileSizeLow > 0) { char fpath[PATH_MAX]; if (path != NULL || (GetFinalPathNameByHandleFunc != NULL && GetFinalPathNameByHandleFunc (h, fpath, sizeof (fpath), VOLUME_NAME_NONE) < sizeof (fpath) && (path = fpath, 1))) { const char *last_dot = NULL; const char *p; for (p = path; *p != '\0'; p++) if (*p == '.') last_dot = p; if (last_dot != NULL) { const char *suffix = last_dot + 1; if (_stricmp (suffix, "exe") == 0 || _stricmp (suffix, "bat") == 0 || _stricmp (suffix, "cmd") == 0 || _stricmp (suffix, "com") == 0) mode |= S_IEXEC_UGO; } } else /* Cannot determine file name. Pretend that it is executable. */ mode |= S_IEXEC_UGO; } } buf->st_mode = mode; /* st_nlink can be determined through GetFileInformationByHandle or through GetFileInformationByHandleEx with argument FileStandardInfo The latter requires -D_WIN32_WINNT=_WIN32_WINNT_VISTA or higher. */ buf->st_nlink = (info.nNumberOfLinks > SHRT_MAX ? SHRT_MAX : info.nNumberOfLinks); /* There's no easy way to map the Windows SID concept to an integer. */ buf->st_uid = 0; buf->st_gid = 0; /* st_rdev is irrelevant for normal files and directories. */ buf->st_rdev = 0; /* st_size can be determined through GetFileSizeEx or through GetFileAttributesEx or through GetFileInformationByHandle or through GetFileInformationByHandleEx with argument FileStandardInfo The latter requires -D_WIN32_WINNT=_WIN32_WINNT_VISTA or higher. */ if (sizeof (buf->st_size) <= 4) /* Range check already done above. */ buf->st_size = info.nFileSizeLow; else buf->st_size = ((long long) info.nFileSizeHigh << 32) | (long long) info.nFileSizeLow; /* st_atime, st_mtime, st_ctime can be determined through GetFileTime or through GetFileAttributesEx or through GetFileInformationByHandle or through GetFileInformationByHandleEx with argument FileBasicInfo The latter requires -D_WIN32_WINNT=_WIN32_WINNT_VISTA or higher. */ #if _GL_WINDOWS_STAT_TIMESPEC buf->st_atim = _gl_convert_FILETIME_to_timespec (&info.ftLastAccessTime); buf->st_mtim = _gl_convert_FILETIME_to_timespec (&info.ftLastWriteTime); buf->st_ctim = _gl_convert_FILETIME_to_timespec (&info.ftCreationTime); #else buf->st_atime = _gl_convert_FILETIME_to_POSIX (&info.ftLastAccessTime); buf->st_mtime = _gl_convert_FILETIME_to_POSIX (&info.ftLastWriteTime); buf->st_ctime = _gl_convert_FILETIME_to_POSIX (&info.ftCreationTime); #endif return 0; } else if (type == FILE_TYPE_CHAR || type == FILE_TYPE_PIPE) { buf->st_dev = 0; #if _GL_WINDOWS_STAT_INODES == 2 buf->st_ino._gl_ino[0] = buf->st_ino._gl_ino[1] = 0; #else buf->st_ino = 0; #endif buf->st_mode = (type == FILE_TYPE_PIPE ? _S_IFIFO : _S_IFCHR); buf->st_nlink = 1; buf->st_uid = 0; buf->st_gid = 0; buf->st_rdev = 0; if (type == FILE_TYPE_PIPE) { /* PeekNamedPipe */ DWORD bytes_available; if (PeekNamedPipe (h, NULL, 0, NULL, &bytes_available, NULL)) buf->st_size = bytes_available; else buf->st_size = 0; } else buf->st_size = 0; #if _GL_WINDOWS_STAT_TIMESPEC buf->st_atim.tv_sec = 0; buf->st_atim.tv_nsec = 0; buf->st_mtim.tv_sec = 0; buf->st_mtim.tv_nsec = 0; buf->st_ctim.tv_sec = 0; buf->st_ctim.tv_nsec = 0; #else buf->st_atime = 0; buf->st_mtime = 0; buf->st_ctime = 0; #endif return 0; } else { errno = ENOENT; return -1; } failed: { DWORD error = GetLastError (); #if 0 fprintf (stderr, "_gl_fstat_by_handle error 0x%x\n", (unsigned int) error); #endif switch (error) { case ERROR_ACCESS_DENIED: case ERROR_SHARING_VIOLATION: errno = EACCES; break; case ERROR_OUTOFMEMORY: errno = ENOMEM; break; case ERROR_WRITE_FAULT: case ERROR_READ_FAULT: case ERROR_GEN_FAILURE: errno = EIO; break; default: errno = EINVAL; break; } return -1; } } #else /* This declaration is solely to ensure that after preprocessing this file is never empty. */ typedef int dummy; #endif pspp-1.4.1/gl/unilbrk/0000755000175000017500000000000013725012650014164 5ustar00blpblp00000000000000pspp-1.4.1/gl/unilbrk/lbrktables.h0000644000175000017500000000754013723215640016472 0ustar00blpblp00000000000000/* Line breaking auxiliary tables. Copyright (C) 2001-2003, 2006-2020 Free Software Foundation, Inc. Written by Bruno Haible , 2001. 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 3 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, see . */ #include "unitypes.h" /* Line breaking classification. */ enum { /* Values >= 30 are resolved at run time. */ LBP_BK = 30, /* mandatory break */ /*LBP_CR, carriage return - not used here because it's a DOSism */ /*LBP_LF, line feed - not used here because it's a DOSism */ LBP_CM = 31, /* attached characters and combining marks */ /*LBP_NL, next line - not used here because it's equivalent to LBP_BK */ /*LBP_SG, surrogates - not used here because they are not characters */ LBP_WJ = 0, /* word joiner */ LBP_ZW = 32, /* zero width space */ LBP_GL = 1, /* non-breaking (glue) */ LBP_SP = 33, /* space */ LBP_B2 = 2, /* break opportunity before and after */ LBP_BA = 3, /* break opportunity after */ LBP_BB = 4, /* break opportunity before */ LBP_HY = 5, /* hyphen */ LBP_CB = 34, /* contingent break opportunity */ LBP_CL = 6, /* closing punctuation */ LBP_CP = 7, /* closing parenthesis */ LBP_EX = 8, /* exclamation/interrogation */ LBP_IN = 9, /* inseparable */ LBP_NS = 10, /* non starter */ LBP_OP = 11, /* opening punctuation */ LBP_QU = 12, /* ambiguous quotation */ LBP_IS = 13, /* infix separator (numeric) */ LBP_NU = 14, /* numeric */ LBP_PO = 15, /* postfix (numeric) */ LBP_PR = 16, /* prefix (numeric) */ LBP_SY = 17, /* symbols allowing breaks */ LBP_AI = 35, /* ambiguous (alphabetic or ideograph) */ LBP_AL = 18, /* ordinary alphabetic and symbol characters */ /*LBP_CJ, conditional Japanese starters, resolved to NS */ LBP_H2 = 19, /* Hangul LV syllable */ LBP_H3 = 20, /* Hangul LVT syllable */ LBP_HL = 25, /* Hebrew letter */ LBP_ID = 21, /* ideographic */ LBP_JL = 22, /* Hangul L Jamo */ LBP_JV = 23, /* Hangul V Jamo */ LBP_JT = 24, /* Hangul T Jamo */ LBP_RI = 26, /* regional indicator */ LBP_SA = 36, /* complex context (South East Asian) */ LBP_ZWJ = 27, /* zero width joiner */ LBP_EB = 28, /* emoji base */ LBP_EM = 29, /* emoji modifier */ LBP_XX = 37 /* unknown */ }; #include "lbrkprop1.h" static inline unsigned char unilbrkprop_lookup (ucs4_t uc) { unsigned int index1 = uc >> lbrkprop_header_0; if (index1 < lbrkprop_header_1) { int lookup1 = unilbrkprop.level1[index1]; if (lookup1 >= 0) { unsigned int index2 = (uc >> lbrkprop_header_2) & lbrkprop_header_3; int lookup2 = unilbrkprop.level2[lookup1 + index2]; if (lookup2 >= 0) { unsigned int index3 = uc & lbrkprop_header_4; return unilbrkprop.level3[lookup2 + index3]; } } } return LBP_XX; } /* Table indexed by two line breaking classifications. */ #define D 1 /* direct break opportunity, empty in table 7.3 of UTR #14 */ #define I 2 /* indirect break opportunity, '%' in table 7.3 of UTR #14 */ #define P 3 /* prohibited break, '^' in table 7.3 of UTR #14 */ extern const unsigned char unilbrk_table[30][30]; /* We don't support line breaking of complex-context dependent characters (Thai, Lao, Myanmar, Khmer) yet, because it requires dictionary lookup. */ pspp-1.4.1/gl/unilbrk/lbrkprop2.h0000644000175000017500000073624613723215640016276 0ustar00blpblp00000000000000/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ /* Line breaking properties of Unicode characters. */ /* Generated automatically by gen-uni-tables.c for Unicode 9.0.0. */ /* Copyright (C) 2000-2002, 2004, 2008 Free Software Foundation, Inc. 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 3 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, see . */ const lbrkprop_t unilbrkprop = { { 0, 512, 1024, 1024, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1536 }, { 0, 128, 256, 256, 256, 384, 512, 640, 256, 768, 896, 1024, 1152, 1280, 1408, 1536, 1664, 1792, 1920, 2048, 2176, 2304, 2432, 2560, 2688, 2816, 2944, 3072, 3200, 3328, 3456, 3584, 3712, 3840, 3968, 4096, 4224, 4352, 4480, 4608, 4736, 256, 256, 256, 256, 4864, 4992, 5120, 5248, 5376, 5504, 5632, 5760, 5888, 6016, 6144, 6272, 6400, 256, 6528, 256, 256, 6656, 6784, 6912, 7040, 7168, 7296, 7424, 7552, 7680, 7808, 7936, 8064, 8192, 8320, 8448, 8576, 8704, 8832, 256, 256, 256, 8960, 256, 256, 9088, 9216, 9344, 9472, 9600, 9728, 9856, 9984, 10112, 10240, 10368, 10496, 10624, 10752, 10880, 11008, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 11136, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 11264, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 11392, 256, 256, 11520, 11648, 256, 11776, 11904, 12032, 12160, 12288, 12416, 12544, 12672, 12800, 12928, 13056, 13184, 13312, 13440, 13568, 13696, 12928, 13056, 13184, 13312, 13440, 13568, 13696, 12928, 13056, 13184, 13312, 13440, 13568, 13696, 12928, 13056, 13184, 13312, 13440, 13568, 13696, 12928, 13056, 13184, 13312, 13440, 13568, 13696, 12928, 13056, 13184, 13312, 13440, 13568, 13696, 12928, 13056, 13184, 13312, 13440, 13568, 13696, 12928, 13056, 13184, 13312, 13440, 13568, 13696, 12928, 13056, 13184, 13312, 13440, 13568, 13696, 12928, 13056, 13184, 13312, 13440, 13568, 13696, 12928, 13056, 13184, 13312, 13440, 13568, 13696, 12928, 13056, 13184, 13312, 13440, 13568, 13696, 12928, 13056, 13184, 13824, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 10112, 10112, 10112, 10112, 13952, 14080, 256, 256, 14208, 14336, 14464, 14592, 14720, 14848, 14976, 15104, 15232, 15360, -1, 15488, 15616, 15744, 256, 15872, 16000, -1, 256, 256, 16128, -1, 16256, 16384, 16512, 16640, 16768, 16896, 17024, 17152, 17280, 17408, -1, -1, 17536, -1, -1, -1, 17664, 17792, 17920, 18048, 18176, 18304, 18432, -1, 18560, 18688, -1, 18816, 18944, 19072, 19200, -1, -1, 19328, -1, -1, -1, 19456, -1, -1, 19584, 19712, -1, -1, -1, -1, -1, -1, 256, 256, 256, 256, 256, 256, 256, 19840, 19968, 256, 20096, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 256, 256, 256, 256, 20224, 20352, 20480, 256, 20608, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 256, 256, 256, 20736, 20864, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 256, 256, 256, 256, 20992, 21120, 21248, 21376, -1, -1, -1, -1, -1, -1, 21504, 21632, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 21760, 10112, 10112, 10112, 10112, 10112, 21888, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 22016, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 22144, 22272, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 256, 22400, 22528, 22656, 22784, -1, 22912, -1, 23040, 23168, 23296, 256, 256, 23424, 256, 23552, 256, 256, 256, 256, 23680, 23808, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 23936, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 256, 24064, 24192, -1, -1, -1, -1, -1, -1, -1, -1, -1, 24320, 24448, -1, -1, 10112, 10112, 24576, 24704, 10112, 10112, 10112, 24832, 24960, 25088, 25216, 25344, 25472, 25600, 25728, 25856, 25984, 26112, 26240, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 26368, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 10112, 26368, 26496, -1, 26624, 26752, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 }, { LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_BA, LBP_BK, LBP_BK, LBP_BK, LBP_BK, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_SP, LBP_EX, LBP_QU, LBP_AL, LBP_PR, LBP_PO, LBP_AL, LBP_QU, LBP_OP, LBP_CP, LBP_AL, LBP_PR, LBP_IS, LBP_HY, LBP_IS, LBP_SY, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_IS, LBP_IS, LBP_AL, LBP_AL, LBP_AL, LBP_EX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_OP, LBP_PR, LBP_CP, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_OP, LBP_BA, LBP_CL, LBP_AL, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_BK, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_GL, LBP_OP, LBP_PO, LBP_PR, LBP_PR, LBP_PR, LBP_AL, LBP_AI, LBP_AI, LBP_AL, LBP_AI, LBP_QU, LBP_AL, LBP_BA, LBP_AL, LBP_AL, LBP_PO, LBP_PR, LBP_AI, LBP_AI, LBP_BB, LBP_AL, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_QU, LBP_AI, LBP_AI, LBP_AI, LBP_OP, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AI, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AI, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AI, LBP_BB, LBP_AI, LBP_AI, LBP_AI, LBP_BB, LBP_AI, LBP_AL, LBP_AL, LBP_AI, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AL, LBP_AI, LBP_AL, LBP_BB, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_GL, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_GL, LBP_GL, LBP_GL, LBP_GL, LBP_GL, LBP_GL, LBP_GL, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_IS, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_IS, LBP_BA, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_PR, LBP_XX, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_BA, LBP_CM, LBP_AL, LBP_CM, LBP_CM, LBP_AL, LBP_CM, LBP_CM, LBP_EX, LBP_CM, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_HL, LBP_HL, LBP_HL, LBP_HL, LBP_HL, LBP_HL, LBP_HL, LBP_HL, LBP_HL, LBP_HL, LBP_HL, LBP_HL, LBP_HL, LBP_HL, LBP_HL, LBP_HL, LBP_HL, LBP_HL, LBP_HL, LBP_HL, LBP_HL, LBP_HL, LBP_HL, LBP_HL, LBP_HL, LBP_HL, LBP_HL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_HL, LBP_HL, LBP_HL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_PO, LBP_PO, LBP_PO, LBP_IS, LBP_IS, LBP_AL, LBP_AL, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_EX, LBP_CM, LBP_XX, LBP_EX, LBP_EX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_PO, LBP_NU, LBP_NU, LBP_AL, LBP_AL, LBP_AL, LBP_CM, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_EX, LBP_AL, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_AL, LBP_AL, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_AL, LBP_AL, LBP_CM, LBP_CM, LBP_AL, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_AL, LBP_AL, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_CM, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_IS, LBP_EX, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_AL, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_AL, LBP_CM, LBP_CM, LBP_CM, LBP_AL, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_CM, LBP_CM, LBP_CM, LBP_XX, LBP_XX, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_AL, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_CM, LBP_CM, LBP_CM, LBP_AL, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_AL, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_CM, LBP_CM, LBP_BA, LBP_BA, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_CM, LBP_CM, LBP_CM, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_CM, LBP_AL, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_XX, LBP_XX, LBP_CM, LBP_CM, LBP_XX, LBP_XX, LBP_CM, LBP_CM, LBP_CM, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_CM, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_CM, LBP_CM, LBP_XX, LBP_XX, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_AL, LBP_AL, LBP_PO, LBP_PO, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_PO, LBP_AL, LBP_PR, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_CM, LBP_CM, LBP_CM, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_CM, LBP_XX, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_CM, LBP_CM, LBP_XX, LBP_XX, LBP_CM, LBP_CM, LBP_CM, LBP_XX, LBP_XX, LBP_XX, LBP_CM, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_CM, LBP_CM, LBP_AL, LBP_AL, LBP_AL, LBP_CM, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_CM, LBP_CM, LBP_CM, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_CM, LBP_AL, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_XX, LBP_CM, LBP_CM, LBP_CM, LBP_XX, LBP_CM, LBP_CM, LBP_CM, LBP_XX, LBP_XX, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_CM, LBP_CM, LBP_XX, LBP_XX, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_AL, LBP_PR, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_CM, LBP_CM, LBP_CM, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_CM, LBP_AL, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_XX, LBP_XX, LBP_CM, LBP_CM, LBP_XX, LBP_XX, LBP_CM, LBP_CM, LBP_CM, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_CM, LBP_CM, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_CM, LBP_CM, LBP_XX, LBP_XX, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_CM, LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_XX, LBP_XX, LBP_XX, LBP_CM, LBP_CM, LBP_CM, LBP_XX, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_XX, LBP_XX, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_CM, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_PR, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_XX, LBP_CM, LBP_CM, LBP_CM, LBP_XX, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_CM, LBP_CM, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_CM, LBP_CM, LBP_XX, LBP_XX, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_CM, LBP_CM, LBP_CM, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_CM, LBP_AL, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_XX, LBP_CM, LBP_CM, LBP_CM, LBP_XX, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_CM, LBP_CM, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_CM, LBP_CM, LBP_XX, LBP_XX, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_XX, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_CM, LBP_CM, LBP_CM, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_AL, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_XX, LBP_CM, LBP_CM, LBP_CM, LBP_XX, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_CM, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_CM, LBP_CM, LBP_XX, LBP_XX, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_PO, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_CM, LBP_CM, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_CM, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_XX, LBP_CM, LBP_XX, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_XX, LBP_XX, LBP_CM, LBP_CM, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_PR, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_AL, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_BA, LBP_BA, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_SA, LBP_SA, LBP_XX, LBP_SA, LBP_XX, LBP_XX, LBP_SA, LBP_SA, LBP_XX, LBP_SA, LBP_XX, LBP_XX, LBP_SA, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_XX, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_XX, LBP_SA, LBP_SA, LBP_SA, LBP_XX, LBP_SA, LBP_XX, LBP_SA, LBP_XX, LBP_XX, LBP_SA, LBP_SA, LBP_XX, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_XX, LBP_SA, LBP_SA, LBP_SA, LBP_XX, LBP_XX, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_XX, LBP_SA, LBP_XX, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_XX, LBP_XX, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_XX, LBP_XX, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_BB, LBP_BB, LBP_BB, LBP_BB, LBP_AL, LBP_BB, LBP_BB, LBP_GL, LBP_BB, LBP_BB, LBP_BA, LBP_GL, LBP_EX, LBP_EX, LBP_EX, LBP_EX, LBP_EX, LBP_GL, LBP_AL, LBP_EX, LBP_AL, LBP_AL, LBP_AL, LBP_CM, LBP_CM, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_BA, LBP_CM, LBP_AL, LBP_CM, LBP_AL, LBP_CM, LBP_OP, LBP_CL, LBP_OP, LBP_CL, LBP_CM, LBP_CM, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_BA, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_BA, LBP_CM, LBP_CM, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_XX, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_XX, LBP_BA, LBP_BA, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_CM, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_BB, LBP_BB, LBP_BA, LBP_BB, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_GL, LBP_GL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_BA, LBP_BA, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JV, LBP_JV, LBP_JV, LBP_JV, LBP_JV, LBP_JV, LBP_JV, LBP_JV, LBP_JV, LBP_JV, LBP_JV, LBP_JV, LBP_JV, LBP_JV, LBP_JV, LBP_JV, LBP_JV, LBP_JV, LBP_JV, LBP_JV, LBP_JV, LBP_JV, LBP_JV, LBP_JV, LBP_JV, LBP_JV, LBP_JV, LBP_JV, LBP_JV, LBP_JV, LBP_JV, LBP_JV, LBP_JV, LBP_JV, LBP_JV, LBP_JV, LBP_JV, LBP_JV, LBP_JV, LBP_JV, LBP_JV, LBP_JV, LBP_JV, LBP_JV, LBP_JV, LBP_JV, LBP_JV, LBP_JV, LBP_JV, LBP_JV, LBP_JV, LBP_JV, LBP_JV, LBP_JV, LBP_JV, LBP_JV, LBP_JV, LBP_JV, LBP_JV, LBP_JV, LBP_JV, LBP_JV, LBP_JV, LBP_JV, LBP_JV, LBP_JV, LBP_JV, LBP_JV, LBP_JV, LBP_JV, LBP_JV, LBP_JV, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_CM, LBP_CM, LBP_CM, LBP_AL, LBP_BA, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_BA, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_BA, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_OP, LBP_CL, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_BA, LBP_BA, LBP_BA, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_CM, LBP_CM, LBP_CM, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_CM, LBP_CM, LBP_CM, LBP_BA, LBP_BA, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_CM, LBP_CM, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_CM, LBP_CM, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_BA, LBP_BA, LBP_NS, LBP_SA, LBP_BA, LBP_AL, LBP_BA, LBP_PR, LBP_SA, LBP_SA, LBP_XX, LBP_XX, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_EX, LBP_EX, LBP_BA, LBP_BA, LBP_BB, LBP_AL, LBP_EX, LBP_EX, LBP_AL, LBP_CM, LBP_CM, LBP_CM, LBP_GL, LBP_XX, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_CM, LBP_CM, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_CM, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_EX, LBP_EX, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_XX, LBP_XX, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_SA, LBP_XX, LBP_XX, LBP_XX, LBP_SA, LBP_SA, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_XX, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_XX, LBP_XX, LBP_CM, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_XX, LBP_XX, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_BA, LBP_BA, LBP_AL, LBP_BA, LBP_BA, LBP_BA, LBP_BA, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_CM, LBP_CM, LBP_CM, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_AL, LBP_AL, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_XX, LBP_XX, LBP_XX, LBP_BA, LBP_BA, LBP_BA, LBP_BA, LBP_BA, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_BA, LBP_BA, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_CM, LBP_CM, LBP_CM, LBP_AL, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_CM, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_CM, LBP_CM, LBP_CM, LBP_AL, LBP_AL, LBP_XX, LBP_CM, LBP_CM, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_XX, LBP_AL, LBP_XX, LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_BB, LBP_AL, LBP_XX, LBP_BA, LBP_BA, LBP_BA, LBP_BA, LBP_BA, LBP_BA, LBP_BA, LBP_GL, LBP_BA, LBP_BA, LBP_BA, LBP_ZW, LBP_CM, LBP_ZWJ, LBP_CM, LBP_CM, LBP_BA, LBP_GL, LBP_BA, LBP_BA, LBP_B2, LBP_AI, LBP_AI, LBP_AL, LBP_QU, LBP_QU, LBP_OP, LBP_QU, LBP_QU, LBP_QU, LBP_OP, LBP_QU, LBP_AI, LBP_AI, LBP_AL, LBP_AL, LBP_IN, LBP_IN, LBP_IN, LBP_BA, LBP_BK, LBP_BK, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_GL, LBP_PO, LBP_PO, LBP_PO, LBP_PO, LBP_PO, LBP_PO, LBP_PO, LBP_PO, LBP_AL, LBP_QU, LBP_QU, LBP_AI, LBP_NS, LBP_NS, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_IS, LBP_OP, LBP_CL, LBP_NS, LBP_NS, LBP_NS, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_BA, LBP_AL, LBP_BA, LBP_BA, LBP_BA, LBP_BA, LBP_AL, LBP_BA, LBP_BA, LBP_BA, LBP_WJ, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_AI, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_OP, LBP_CL, LBP_AI, LBP_AL, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_OP, LBP_CL, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_PR, LBP_PR, LBP_PR, LBP_PR, LBP_PR, LBP_PR, LBP_PR, LBP_PO, LBP_PR, LBP_PR, LBP_PR, LBP_PR, LBP_PR, LBP_PR, LBP_PR, LBP_PR, LBP_PR, LBP_PR, LBP_PR, LBP_PR, LBP_PR, LBP_PR, LBP_PO, LBP_PR, LBP_PR, LBP_PR, LBP_PR, LBP_PO, LBP_PR, LBP_PR, LBP_PO, LBP_PR, LBP_PR, LBP_PR, LBP_PR, LBP_PR, LBP_PR, LBP_PR, LBP_PR, LBP_PR, LBP_PR, LBP_PR, LBP_PR, LBP_PR, LBP_PR, LBP_PR, LBP_PR, LBP_PR, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_PO, LBP_AL, LBP_AI, LBP_AL, LBP_AL, LBP_AL, LBP_PO, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AI, LBP_AL, LBP_AL, LBP_PR, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AI, LBP_AI, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AI, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AI, LBP_AI, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AI, LBP_AL, LBP_AL, LBP_AI, LBP_AL, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AI, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AI, LBP_AL, LBP_AI, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AI, LBP_AL, LBP_AI, LBP_AI, LBP_AL, LBP_AL, LBP_AL, LBP_AI, LBP_AI, LBP_AL, LBP_AL, LBP_AI, LBP_AL, LBP_AL, LBP_AL, LBP_AI, LBP_AL, LBP_AI, LBP_PR, LBP_PR, LBP_AL, LBP_AI, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AI, LBP_AL, LBP_AL, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AL, LBP_AL, LBP_AI, LBP_AL, LBP_AI, LBP_AL, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AL, LBP_AI, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AI, LBP_AI, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AI, LBP_AL, LBP_AL, LBP_AL, LBP_AI, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AI, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AI, LBP_AI, LBP_AL, LBP_AL, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AL, LBP_AL, LBP_AI, LBP_AI, LBP_AL, LBP_AL, LBP_AI, LBP_AI, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AI, LBP_AI, LBP_AL, LBP_AL, LBP_AI, LBP_AI, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AI, LBP_AL, LBP_AL, LBP_AL, LBP_AI, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AI, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AI, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_IN, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_OP, LBP_CL, LBP_OP, LBP_CL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AI, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_ID, LBP_ID, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_OP, LBP_CL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AL, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AL, LBP_AL, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AI, LBP_AI, LBP_AL, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AI, LBP_AI, LBP_AL, LBP_AL, LBP_AI, LBP_AI, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AI, LBP_AI, LBP_AL, LBP_AL, LBP_AI, LBP_AI, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AI, LBP_AI, LBP_AI, LBP_AL, LBP_AL, LBP_AI, LBP_AL, LBP_AL, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AI, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_AL, LBP_AI, LBP_AI, LBP_AL, LBP_AL, LBP_AI, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AI, LBP_AI, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_ID, LBP_ID, LBP_AI, LBP_AI, LBP_ID, LBP_AL, LBP_ID, LBP_ID, LBP_ID, LBP_EB, LBP_ID, LBP_ID, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_ID, LBP_ID, LBP_ID, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AI, LBP_AL, LBP_AI, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AI, LBP_AI, LBP_AL, LBP_AI, LBP_AI, LBP_AI, LBP_AL, LBP_AI, LBP_ID, LBP_AI, LBP_AI, LBP_AL, LBP_AI, LBP_AI, LBP_AL, LBP_AI, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_ID, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AI, LBP_AI, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_ID, LBP_AL, LBP_ID, LBP_ID, LBP_ID, LBP_AI, LBP_ID, LBP_ID, LBP_AI, LBP_AI, LBP_AI, LBP_ID, LBP_ID, LBP_AI, LBP_AI, LBP_ID, LBP_AI, LBP_AI, LBP_ID, LBP_ID, LBP_ID, LBP_AL, LBP_AI, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AI, LBP_AI, LBP_ID, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_AI, LBP_ID, LBP_ID, LBP_EB, LBP_ID, LBP_AI, LBP_AI, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_AL, LBP_AL, LBP_AL, LBP_ID, LBP_ID, LBP_EB, LBP_EB, LBP_EB, LBP_EB, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AI, LBP_AL, LBP_AL, LBP_AL, LBP_QU, LBP_QU, LBP_QU, LBP_QU, LBP_QU, LBP_QU, LBP_AL, LBP_EX, LBP_EX, LBP_ID, LBP_AL, LBP_AL, LBP_AL, LBP_OP, LBP_CL, LBP_OP, LBP_CL, LBP_OP, LBP_CL, LBP_OP, LBP_CL, LBP_OP, LBP_CL, LBP_OP, LBP_CL, LBP_OP, LBP_CL, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_OP, LBP_CL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_OP, LBP_CL, LBP_OP, LBP_CL, LBP_OP, LBP_CL, LBP_OP, LBP_CL, LBP_OP, LBP_CL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_OP, LBP_CL, LBP_OP, LBP_CL, LBP_OP, LBP_CL, LBP_OP, LBP_CL, LBP_OP, LBP_CL, LBP_OP, LBP_CL, LBP_OP, LBP_CL, LBP_OP, LBP_CL, LBP_OP, LBP_CL, LBP_OP, LBP_CL, LBP_OP, LBP_CL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_OP, LBP_CL, LBP_OP, LBP_CL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_OP, LBP_CL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_CM, LBP_CM, LBP_CM, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_EX, LBP_BA, LBP_BA, LBP_BA, LBP_AL, LBP_EX, LBP_BA, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_BA, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_CM, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_QU, LBP_QU, LBP_QU, LBP_QU, LBP_QU, LBP_QU, LBP_QU, LBP_QU, LBP_QU, LBP_QU, LBP_QU, LBP_QU, LBP_QU, LBP_QU, LBP_BA, LBP_BA, LBP_BA, LBP_BA, LBP_BA, LBP_BA, LBP_BA, LBP_BA, LBP_AL, LBP_BA, LBP_OP, LBP_BA, LBP_AL, LBP_AL, LBP_QU, LBP_QU, LBP_AL, LBP_AL, LBP_QU, LBP_QU, LBP_OP, LBP_CL, LBP_OP, LBP_CL, LBP_OP, LBP_CL, LBP_OP, LBP_CL, LBP_BA, LBP_BA, LBP_BA, LBP_BA, LBP_EX, LBP_AL, LBP_BA, LBP_BA, LBP_AL, LBP_BA, LBP_BA, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_B2, LBP_B2, LBP_BA, LBP_BA, LBP_BA, LBP_AL, LBP_BA, LBP_BA, LBP_OP, LBP_BA, LBP_BA, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_XX, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_BA, LBP_CL, LBP_CL, LBP_ID, LBP_ID, LBP_NS, LBP_ID, LBP_ID, LBP_OP, LBP_CL, LBP_OP, LBP_CL, LBP_OP, LBP_CL, LBP_OP, LBP_CL, LBP_OP, LBP_CL, LBP_ID, LBP_ID, LBP_OP, LBP_CL, LBP_OP, LBP_CL, LBP_OP, LBP_CL, LBP_OP, LBP_CL, LBP_NS, LBP_OP, LBP_CL, LBP_CL, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_CM, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_NS, LBP_NS, LBP_ID, LBP_ID, LBP_ID, LBP_XX, LBP_NS, LBP_ID, LBP_NS, LBP_ID, LBP_NS, LBP_ID, LBP_NS, LBP_ID, LBP_NS, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_NS, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_NS, LBP_ID, LBP_NS, LBP_ID, LBP_NS, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_NS, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_NS, LBP_NS, LBP_XX, LBP_XX, LBP_CM, LBP_CM, LBP_NS, LBP_NS, LBP_NS, LBP_NS, LBP_ID, LBP_NS, LBP_NS, LBP_ID, LBP_NS, LBP_ID, LBP_NS, LBP_ID, LBP_NS, LBP_ID, LBP_NS, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_NS, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_NS, LBP_ID, LBP_NS, LBP_ID, LBP_NS, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_NS, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_NS, LBP_NS, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_NS, LBP_NS, LBP_NS, LBP_NS, LBP_ID, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_XX, LBP_XX, LBP_XX, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_XX, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_NS, LBP_NS, LBP_NS, LBP_NS, LBP_NS, LBP_NS, LBP_NS, LBP_NS, LBP_NS, LBP_NS, LBP_NS, LBP_NS, LBP_NS, LBP_NS, LBP_NS, LBP_NS, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_XX, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_XX, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_NS, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_XX, LBP_XX, LBP_XX, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_BA, LBP_BA, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_BA, LBP_EX, LBP_BA, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_AL, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_CM, LBP_CM, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_CM, LBP_CM, LBP_AL, LBP_BA, LBP_BA, LBP_BA, LBP_BA, LBP_BA, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_CM, LBP_AL, LBP_AL, LBP_AL, LBP_CM, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_CM, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_PO, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_BB, LBP_BB, LBP_EX, LBP_EX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_CM, LBP_CM, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_BA, LBP_BA, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_BB, LBP_AL, LBP_XX, LBP_XX, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_BA, LBP_BA, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_XX, LBP_XX, LBP_XX, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_BA, LBP_BA, LBP_BA, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_CM, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_CM, LBP_CM, LBP_XX, LBP_XX, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_XX, LBP_XX, LBP_AL, LBP_BA, LBP_BA, LBP_BA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_BA, LBP_BA, LBP_AL, LBP_AL, LBP_AL, LBP_CM, LBP_CM, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_BA, LBP_CM, LBP_CM, LBP_XX, LBP_XX, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_H2, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H2, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H2, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H2, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H2, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H2, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H2, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H2, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H2, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H2, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H2, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H2, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H2, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H2, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H2, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H2, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H2, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H2, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H2, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H2, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H2, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H2, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H2, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H2, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H2, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H2, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H2, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H2, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H2, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H2, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H2, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H2, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H2, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_JV, LBP_JV, LBP_JV, LBP_JV, LBP_JV, LBP_JV, LBP_JV, LBP_JV, LBP_JV, LBP_JV, LBP_JV, LBP_JV, LBP_JV, LBP_JV, LBP_JV, LBP_JV, LBP_JV, LBP_JV, LBP_JV, LBP_JV, LBP_JV, LBP_JV, LBP_JV, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_HL, LBP_CM, LBP_HL, LBP_HL, LBP_HL, LBP_HL, LBP_HL, LBP_HL, LBP_HL, LBP_HL, LBP_HL, LBP_HL, LBP_AL, LBP_HL, LBP_HL, LBP_HL, LBP_HL, LBP_HL, LBP_HL, LBP_HL, LBP_HL, LBP_HL, LBP_HL, LBP_HL, LBP_HL, LBP_HL, LBP_XX, LBP_HL, LBP_HL, LBP_HL, LBP_HL, LBP_HL, LBP_XX, LBP_HL, LBP_XX, LBP_HL, LBP_HL, LBP_XX, LBP_HL, LBP_HL, LBP_XX, LBP_HL, LBP_HL, LBP_HL, LBP_HL, LBP_HL, LBP_HL, LBP_HL, LBP_HL, LBP_HL, LBP_HL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_CL, LBP_OP, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_PO, LBP_AL, LBP_XX, LBP_XX, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_IS, LBP_CL, LBP_CL, LBP_IS, LBP_IS, LBP_EX, LBP_EX, LBP_OP, LBP_CL, LBP_IN, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_OP, LBP_CL, LBP_OP, LBP_CL, LBP_OP, LBP_CL, LBP_OP, LBP_CL, LBP_OP, LBP_CL, LBP_OP, LBP_CL, LBP_OP, LBP_CL, LBP_OP, LBP_CL, LBP_ID, LBP_ID, LBP_OP, LBP_CL, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_CL, LBP_ID, LBP_CL, LBP_XX, LBP_NS, LBP_NS, LBP_EX, LBP_EX, LBP_ID, LBP_OP, LBP_CL, LBP_OP, LBP_CL, LBP_OP, LBP_CL, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_XX, LBP_ID, LBP_PR, LBP_PO, LBP_ID, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_WJ, LBP_XX, LBP_EX, LBP_ID, LBP_ID, LBP_PR, LBP_PO, LBP_ID, LBP_ID, LBP_OP, LBP_CL, LBP_ID, LBP_ID, LBP_CL, LBP_ID, LBP_CL, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_NS, LBP_NS, LBP_ID, LBP_ID, LBP_ID, LBP_EX, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_OP, LBP_ID, LBP_CL, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_OP, LBP_ID, LBP_CL, LBP_ID, LBP_OP, LBP_CL, LBP_CL, LBP_OP, LBP_CL, LBP_CL, LBP_NS, LBP_ID, LBP_NS, LBP_NS, LBP_NS, LBP_NS, LBP_NS, LBP_NS, LBP_NS, LBP_NS, LBP_NS, LBP_NS, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_NS, LBP_NS, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_XX, LBP_XX, LBP_XX, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_XX, LBP_XX, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_XX, LBP_XX, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_XX, LBP_XX, LBP_ID, LBP_ID, LBP_ID, LBP_XX, LBP_XX, LBP_XX, LBP_PO, LBP_PR, LBP_ID, LBP_ID, LBP_ID, LBP_PR, LBP_PR, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_CM, LBP_CM, LBP_CM, LBP_CB, LBP_AI, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_BA, LBP_BA, LBP_BA, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_CM, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_CM, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_BA, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_BA, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_BA, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_BA, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_CM, LBP_CM, LBP_CM, LBP_XX, LBP_CM, LBP_CM, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_CM, LBP_CM, LBP_CM, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_CM, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_BA, LBP_BA, LBP_BA, LBP_BA, LBP_BA, LBP_BA, LBP_BA, LBP_BA, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_CM, LBP_CM, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_BA, LBP_BA, LBP_BA, LBP_BA, LBP_BA, LBP_BA, LBP_IN, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_BA, LBP_BA, LBP_BA, LBP_BA, LBP_BA, LBP_BA, LBP_BA, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_CM, LBP_CM, LBP_CM, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_BA, LBP_BA, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_AL, LBP_AL, LBP_AL, LBP_BA, LBP_BA, LBP_BA, LBP_BA, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_CM, LBP_CM, LBP_CM, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_XX, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_BA, LBP_BA, LBP_BA, LBP_BA, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_CM, LBP_AL, LBP_BB, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_CM, LBP_CM, LBP_CM, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_BA, LBP_BA, LBP_AL, LBP_BA, LBP_AL, LBP_CM, LBP_CM, LBP_CM, LBP_AL, LBP_XX, LBP_XX, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_AL, LBP_BB, LBP_AL, LBP_BA, LBP_BA, LBP_BA, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_BA, LBP_BA, LBP_AL, LBP_BA, LBP_BA, LBP_AL, LBP_CM, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_BA, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_CM, LBP_AL, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_XX, LBP_XX, LBP_CM, LBP_CM, LBP_XX, LBP_XX, LBP_CM, LBP_CM, LBP_CM, LBP_XX, LBP_XX, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_CM, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_CM, LBP_CM, LBP_XX, LBP_XX, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_XX, LBP_XX, LBP_XX, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_BA, LBP_BA, LBP_BA, LBP_BA, LBP_AL, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_XX, LBP_BA, LBP_XX, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_XX, LBP_XX, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_BB, LBP_BA, LBP_BA, LBP_EX, LBP_EX, LBP_AL, LBP_AL, LBP_AL, LBP_BA, LBP_BA, LBP_BA, LBP_BA, LBP_BA, LBP_BA, LBP_BA, LBP_BA, LBP_BA, LBP_BA, LBP_BA, LBP_BA, LBP_BA, LBP_BA, LBP_BA, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_CM, LBP_CM, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_BA, LBP_BA, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_BB, LBP_BB, LBP_BB, LBP_BB, LBP_BB, LBP_BB, LBP_BB, LBP_BB, LBP_BB, LBP_BB, LBP_BB, LBP_BB, LBP_BB, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_XX, LBP_XX, LBP_XX, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_SA, LBP_SA, LBP_BA, LBP_BA, LBP_BA, LBP_SA, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_XX, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_AL, LBP_BA, LBP_BA, LBP_BA, LBP_BA, LBP_BA, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_BB, LBP_EX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_XX, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_BA, LBP_BA, LBP_BA, LBP_BA, LBP_BA, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_OP, LBP_OP, LBP_OP, LBP_CL, LBP_CL, LBP_CL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_CL, LBP_AL, LBP_AL, LBP_AL, LBP_OP, LBP_CL, LBP_OP, LBP_CL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_OP, LBP_CL, LBP_CL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_OP, LBP_CL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_BA, LBP_BA, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_BA, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_BA, LBP_BA, LBP_BA, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_BA, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_NS, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_ID, LBP_ID, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_AL, LBP_CM, LBP_CM, LBP_BA, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_AL, LBP_AL, LBP_AL, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_AL, LBP_AL, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_CM, LBP_CM, LBP_CM, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_AL, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_CM, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_CM, LBP_AL, LBP_AL, LBP_BA, LBP_BA, LBP_BA, LBP_BA, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_XX, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_XX, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_XX, LBP_XX, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_XX, LBP_CM, LBP_CM, LBP_XX, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_OP, LBP_OP, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_XX, LBP_XX, LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_XX, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_XX, LBP_AL, LBP_XX, LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_XX, LBP_XX, LBP_AL, LBP_XX, LBP_AL, LBP_XX, LBP_AL, LBP_XX, LBP_AL, LBP_XX, LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_ID, LBP_ID, LBP_ID, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AL, LBP_ID, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AL, LBP_AL, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_RI, LBP_RI, LBP_RI, LBP_RI, LBP_RI, LBP_RI, LBP_RI, LBP_RI, LBP_RI, LBP_RI, LBP_RI, LBP_RI, LBP_RI, LBP_RI, LBP_RI, LBP_RI, LBP_RI, LBP_RI, LBP_RI, LBP_RI, LBP_RI, LBP_RI, LBP_RI, LBP_RI, LBP_RI, LBP_RI, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_EB, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_AL, LBP_AL, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_AL, LBP_AL, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_AL, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_EB, LBP_EB, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_EB, LBP_EB, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_EM, LBP_EM, LBP_EM, LBP_EM, LBP_EM, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_EB, LBP_EB, LBP_ID, LBP_ID, LBP_EB, LBP_EB, LBP_EB, LBP_EB, LBP_EB, LBP_EB, LBP_EB, LBP_EB, LBP_EB, LBP_EB, LBP_EB, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_EB, LBP_EB, LBP_EB, LBP_EB, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_EB, LBP_ID, LBP_EB, LBP_EB, LBP_EB, LBP_EB, LBP_EB, LBP_EB, LBP_EB, LBP_EB, LBP_EB, LBP_ID, LBP_ID, LBP_ID, LBP_EB, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_EB, LBP_EB, LBP_EB, LBP_ID, LBP_EB, LBP_EB, LBP_EB, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_AL, LBP_ID, LBP_AL, LBP_ID, LBP_AL, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_EB, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_AL, LBP_ID, LBP_AL, LBP_AL, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_EB, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_EB, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_EB, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_EB, LBP_EB, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_EB, LBP_EB, LBP_EB, LBP_ID, LBP_ID, LBP_ID, LBP_EB, LBP_EB, LBP_EB, LBP_EB, LBP_EB, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_QU, LBP_QU, LBP_QU, LBP_NS, LBP_NS, LBP_NS, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_EB, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_EB, LBP_EB, LBP_EB, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_EB, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_EB, LBP_EB, LBP_EB, LBP_EB, LBP_EB, LBP_EB, LBP_EB, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_EB, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_EB, LBP_ID, LBP_ID, LBP_EB, LBP_EB, LBP_EB, LBP_EB, LBP_EB, LBP_EB, LBP_EB, LBP_ID, LBP_ID, LBP_EB, LBP_EB, LBP_EB, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_XX, LBP_XX, LBP_XX, LBP_CM, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX } }; pspp-1.4.1/gl/unilbrk/u8-possible-linebreaks.c0000644000175000017500000001750313723215640020627 0ustar00blpblp00000000000000/* Line breaking of UTF-8 strings. Copyright (C) 2001-2003, 2006-2020 Free Software Foundation, Inc. Written by Bruno Haible , 2001. 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 3 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, see . */ #include /* Specification. */ #include "unilbrk.h" #include #include #include "unilbrk/lbrktables.h" #include "uniwidth/cjk.h" #include "unistr.h" void u8_possible_linebreaks (const uint8_t *s, size_t n, const char *encoding, char *p) { if (n > 0) { int LBP_AI_REPLACEMENT = (is_cjk_encoding (encoding) ? LBP_ID : LBP_AL); const uint8_t *s_end = s + n; int last_prop = LBP_BK; /* line break property of last non-space character */ char *seen_space = NULL; /* Was a space seen after the last non-space character? */ char *seen_space2 = NULL; /* At least two spaces after the last non-space? */ /* Don't break inside multibyte characters. */ memset (p, UC_BREAK_PROHIBITED, n); do { ucs4_t uc; int count = u8_mbtouc_unsafe (&uc, s, s_end - s); int prop = unilbrkprop_lookup (uc); if (prop == LBP_BK) { /* Mandatory break. */ *p = UC_BREAK_MANDATORY; last_prop = LBP_BK; seen_space = NULL; seen_space2 = NULL; } else { char *q; /* Resolve property values whose behaviour is not fixed. */ switch (prop) { case LBP_AI: /* Resolve ambiguous. */ prop = LBP_AI_REPLACEMENT; break; case LBP_CB: /* This is arbitrary. */ prop = LBP_ID; break; case LBP_SA: /* We don't handle complex scripts yet. Treat LBP_SA like LBP_XX. */ case LBP_XX: /* This is arbitrary. */ prop = LBP_AL; break; } /* Deal with spaces and combining characters. */ q = p; if (prop == LBP_SP) { /* Don't break just before a space. */ *p = UC_BREAK_PROHIBITED; seen_space2 = seen_space; seen_space = p; } else if (prop == LBP_ZW) { /* Don't break just before a zero-width space. */ *p = UC_BREAK_PROHIBITED; last_prop = LBP_ZW; seen_space = NULL; seen_space2 = NULL; } else if (prop == LBP_CM) { /* Don't break just before a combining character, except immediately after a zero-width space. */ if (last_prop == LBP_ZW) { /* Break after zero-width space. */ *p = UC_BREAK_POSSIBLE; /* A combining character turns a preceding space into LBP_ID. */ last_prop = LBP_ID; } else { *p = UC_BREAK_PROHIBITED; /* A combining character turns a preceding space into LBP_ID. */ if (seen_space != NULL) { q = seen_space; seen_space = seen_space2; prop = LBP_ID; goto lookup_via_table; } } } else { lookup_via_table: /* prop must be usable as an index for table 7.3 of UTR #14. */ if (!(prop >= 0 && prop < sizeof (unilbrk_table) / sizeof (unilbrk_table[0]))) abort (); if (last_prop == LBP_BK) { /* Don't break at the beginning of a line. */ *q = UC_BREAK_PROHIBITED; } else if (last_prop == LBP_ZW) { /* Break after zero-width space. */ *q = UC_BREAK_POSSIBLE; } else { switch (unilbrk_table [last_prop] [prop]) { case D: *q = UC_BREAK_POSSIBLE; break; case I: *q = (seen_space != NULL ? UC_BREAK_POSSIBLE : UC_BREAK_PROHIBITED); break; case P: *q = UC_BREAK_PROHIBITED; break; default: abort (); } } last_prop = prop; seen_space = NULL; seen_space2 = NULL; } } s += count; p += count; } while (s < s_end); } } #ifdef TEST #include #include /* Read the contents of an input stream, and return it, terminated with a NUL byte. */ char * read_file (FILE *stream) { #define BUFSIZE 4096 char *buf = NULL; int alloc = 0; int size = 0; int count; while (! feof (stream)) { if (size + BUFSIZE > alloc) { alloc = alloc + alloc / 2; if (alloc < size + BUFSIZE) alloc = size + BUFSIZE; buf = realloc (buf, alloc); if (buf == NULL) { fprintf (stderr, "out of memory\n"); exit (1); } } count = fread (buf + size, 1, BUFSIZE, stream); if (count == 0) { if (ferror (stream)) { perror ("fread"); exit (1); } } else size += count; } buf = realloc (buf, size + 1); if (buf == NULL) { fprintf (stderr, "out of memory\n"); exit (1); } buf[size] = '\0'; return buf; #undef BUFSIZE } int main (int argc, char * argv[]) { if (argc == 1) { /* Display all the break opportunities in the input string. */ char *input = read_file (stdin); int length = strlen (input); char *breaks = malloc (length); int i; u8_possible_linebreaks ((uint8_t *) input, length, "UTF-8", breaks); for (i = 0; i < length; i++) { switch (breaks[i]) { case UC_BREAK_POSSIBLE: /* U+2027 in UTF-8 encoding */ putc (0xe2, stdout); putc (0x80, stdout); putc (0xa7, stdout); break; case UC_BREAK_MANDATORY: /* U+21B2 (or U+21B5) in UTF-8 encoding */ putc (0xe2, stdout); putc (0x86, stdout); putc (0xb2, stdout); break; case UC_BREAK_PROHIBITED: break; default: abort (); } putc (input[i], stdout); } free (breaks); return 0; } else return 1; } #endif /* TEST */ pspp-1.4.1/gl/unilbrk/lbrktables.c0000644000175000017500000001315513723215640016464 0ustar00blpblp00000000000000/* Line breaking auxiliary tables. Copyright (C) 2001-2003, 2006-2020 Free Software Foundation, Inc. Written by Bruno Haible , 2001. 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 3 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, see . */ #include /* Specification. */ #include "unilbrk/lbrktables.h" /* Define unilbrkprop, table of line breaking properties. */ #include "unilbrk/lbrkprop2.h" const unsigned char unilbrk_table[30][30] = { /* after */ /* WJ GL B2 BA BB HY CL CP EX IN NS OP QU IS NU PO PR SY AL H2 H3 ID JL JV JT HL RI ZWJ EB EM */ /* WJ */ { P, I, I, I, I, I, P, P, P, I, I, I, I, P, I, I, I, P, I, I, I, I, I, I, I, I, I, I, I, I, }, /* GL */ { P, I, I, I, I, I, P, P, P, I, I, I, I, P, I, I, I, P, I, I, I, I, I, I, I, I, I, I, I, I, }, /* B2 */ { P, I, P, I, D, I, P, P, P, D, I, D, I, P, D, D, D, P, D, D, D, D, D, D, D, D, D, I, D, D, }, /* BA */ { P, D, D, I, D, I, P, P, P, D, I, D, I, P, D, D, D, P, D, D, D, D, D, D, D, D, D, I, D, D, }, /* BB */ { P, I, I, I, I, I, P, P, P, I, I, I, I, P, I, I, I, P, I, I, I, I, I, I, I, I, I, I, I, I, }, /* HY */ { P, D, D, I, D, I, P, P, P, D, I, D, I, P, I, D, D, P, D, D, D, D, D, D, D, D, D, I, D, D, }, /* CL */ { P, I, D, I, D, I, P, P, P, D, P, D, I, P, D, I, I, P, D, D, D, D, D, D, D, D, D, I, D, D, }, /* CP */ { P, I, D, I, D, I, P, P, P, D, P, D, I, P, I, I, I, P, I, D, D, D, D, D, D, I, D, I, D, D, }, /* EX */ { P, I, D, I, D, I, P, P, P, I, I, D, I, P, D, D, D, P, D, D, D, D, D, D, D, D, D, I, D, D, }, /* IN */ { P, I, D, I, D, I, P, P, P, I, I, D, I, P, D, D, D, P, D, D, D, D, D, D, D, D, D, I, D, D, }, /* NS */ { P, I, D, I, D, I, P, P, P, D, I, D, I, P, D, D, D, P, D, D, D, D, D, D, D, D, D, I, D, D, }, /* OP */ { P, P, P, P, P, P, P, P, P, P, P, P, P, P, P, P, P, P, P, P, P, P, P, P, P, P, P, P, P, P, }, /* QU */ { P, I, I, I, I, I, P, P, P, I, I, P, I, P, I, I, I, P, I, I, I, I, I, I, I, I, I, I, I, I, }, /* IS */ { P, I, D, I, D, I, P, P, P, D, I, D, I, P, I, D, D, P, D, D, D, D, D, D, D, D, D, I, D, D, }, /* NU */ { P, I, D, I, D, I, P, P, P, I, I, I, I, P, I, I, I, P, I, D, D, D, D, D, D, I, D, I, D, D, }, /* PO */ { P, I, D, I, D, I, P, P, P, D, I, I, I, P, I, D, D, P, I, D, D, D, D, D, D, I, D, I, D, D, }, /* PR */ { P, I, D, I, D, I, P, P, P, D, I, I, I, P, I, D, D, P, I, I, I, I, I, I, I, I, D, I, I, I, }, /* SY */ { P, I, D, I, D, I, P, P, P, D, I, D, I, P, I, D, D, P, D, D, D, D, D, D, D, I, D, I, D, D, }, /* AL */ { P, I, D, I, D, I, P, P, P, I, I, I, I, P, I, D, D, P, I, D, D, D, D, D, D, I, D, I, D, D, }, /* H2 */ { P, I, D, I, D, I, P, P, P, I, I, D, I, P, D, I, D, P, D, D, D, D, D, I, I, D, D, I, D, D, }, /* H3 */ { P, I, D, I, D, I, P, P, P, I, I, D, I, P, D, I, D, P, D, D, D, D, D, D, I, D, D, I, D, D, }, /* ID */ { P, I, D, I, D, I, P, P, P, I, I, D, I, P, D, I, D, P, D, D, D, D, D, D, D, D, D, I, D, D, }, /* JL */ { P, I, D, I, D, I, P, P, P, I, I, D, I, P, D, I, D, P, D, I, I, D, I, I, D, D, D, I, D, D, }, /* JV */ { P, I, D, I, D, I, P, P, P, I, I, D, I, P, D, I, D, P, D, D, D, D, D, I, I, D, D, I, D, D, }, /* JT */ { P, I, D, I, D, I, P, P, P, I, I, D, I, P, D, I, D, P, D, D, D, D, D, D, I, D, D, I, D, D, }, /* HL */ { P, I, D, I, D, I, P, P, P, I, I, I, I, P, I, D, D, P, I, D, D, D, D, D, D, I, D, I, D, D, }, /* RI */ { P, I, D, I, D, I, P, P, P, D, I, D, I, P, D, D, D, P, D, D, D, D, D, D, I, D, I, I, D, D, }, /* ZWJ */ { P, I, D, I, D, I, P, P, P, D, I, D, I, P, D, D, D, P, D, D, D, I, D, D, I, D, I, I, I, I, }, /* EB */ { P, I, D, I, D, I, P, P, P, I, I, D, I, P, D, I, D, P, D, D, D, D, D, D, I, D, I, I, D, I, }, /* EM */ { P, I, D, I, D, I, P, P, P, I, I, D, I, P, D, I, D, P, D, D, D, D, D, D, I, D, I, I, D, D, }, /* "" */ /* before */ }; /* Note: The (IS,AL) entry has been changed from I to D. In other words, the rule "Do not break between numeric punctuation and alphabetics" is not implemented here. We want to break before the HTML tag in strings like "

Some sentence.

" */ /* Note: The (B2,B2) entry should probably be D instead of P. */ /* Note: The (PR,ID) entry should probably be D instead of I. */ /* Note: The (WJ,*) and (GL,*) entries should probably be P instead of I. */ pspp-1.4.1/gl/unilbrk/lbrkprop1.h0000644000175000017500000000224413723215640016255 0ustar00blpblp00000000000000/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ /* Line breaking properties of Unicode characters. */ /* Generated automatically by gen-uni-tables.c for Unicode 9.0.0. */ /* Copyright (C) 2000-2002, 2004, 2008 Free Software Foundation, Inc. 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 3 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, see . */ #define lbrkprop_header_0 16 #define lbrkprop_header_1 15 #define lbrkprop_header_2 7 #define lbrkprop_header_3 511 #define lbrkprop_header_4 127 typedef struct { int level1[15]; int level2[4 << 9]; unsigned char level3[210 << 7]; } lbrkprop_t; extern const lbrkprop_t unilbrkprop; pspp-1.4.1/gl/unused-parameter.h0000644000175000017500000000266513723215640016163 0ustar00blpblp00000000000000/* A C macro for declaring that specific function parameters are not used. Copyright (C) 2008-2020 Free Software Foundation, Inc. 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 3 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, see . */ /* _GL_UNUSED_PARAMETER is a marker that can be appended to function parameter declarations for parameters that are not used. This helps to reduce warnings, such as from GCC -Wunused-parameter. The syntax is as follows: type param _GL_UNUSED_PARAMETER or more generally param_decl _GL_UNUSED_PARAMETER For example: int param _GL_UNUSED_PARAMETER int *(*param)(void) _GL_UNUSED_PARAMETER Other possible, but obscure and discouraged syntaxes: int _GL_UNUSED_PARAMETER *(*param)(void) _GL_UNUSED_PARAMETER int *(*param)(void) */ #ifndef _GL_UNUSED_PARAMETER # define _GL_UNUSED_PARAMETER _GL_ATTRIBUTE_MAYBE_UNUSED #endif pspp-1.4.1/gl/getopt-pfx-core.h0000644000175000017500000000477113723215637015733 0ustar00blpblp00000000000000/* getopt (basic, portable features) gnulib wrapper header. Copyright (C) 1989-2020 Free Software Foundation, Inc. This file is part of gnulib. Unlike most of the getopt implementation, it is NOT shared with the GNU C Library. This file 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 3 of the License, or (at your option) any later version. This file 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 gnulib; if not, see . */ #ifndef _GETOPT_PFX_CORE_H #define _GETOPT_PFX_CORE_H 1 /* This header should not be used directly; include getopt.h or unistd.h instead. It does not have a protective #error, because the guard macro for getopt.h in gnulib is not fixed. */ /* Standalone applications should #define __GETOPT_PREFIX to an identifier that prefixes the external functions and variables defined in getopt-core.h and getopt-ext.h. Systematically rename identifiers so that they do not collide with the system functions and variables. Renaming avoids problems with some compilers and linkers. */ #ifdef __GETOPT_PREFIX # ifndef __GETOPT_ID # define __GETOPT_CONCAT(x, y) x ## y # define __GETOPT_XCONCAT(x, y) __GETOPT_CONCAT (x, y) # define __GETOPT_ID(y) __GETOPT_XCONCAT (__GETOPT_PREFIX, y) # endif # undef getopt # undef optarg # undef opterr # undef optind # undef optopt # define getopt __GETOPT_ID (getopt) # define optarg __GETOPT_ID (optarg) # define opterr __GETOPT_ID (opterr) # define optind __GETOPT_ID (optind) # define optopt __GETOPT_ID (optopt) /* Work around a a problem on macOS, which declares getopt with a trailing __DARWIN_ALIAS(getopt) that would expand to something like __asm("_" "rpl_getopt" "$UNIX2003") were it not for the following hack to suppress the macOS declaration . */ # ifdef __APPLE__ # define _GETOPT # endif /* The system's getopt.h may have already included getopt-core.h to declare the unprefixed identifiers. Undef _GETOPT_CORE_H so that getopt-core.h declares them with prefixes. */ # undef _GETOPT_CORE_H #endif #include #endif /* _GETOPT_PFX_CORE_H */ pspp-1.4.1/gl/strtod.c0000644000175000017500000003410113723215640014202 0ustar00blpblp00000000000000/* Copyright (C) 1991-1992, 1997, 1999, 2003, 2006, 2008-2020 Free Software Foundation, Inc. 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 3 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, see . */ #if ! defined USE_LONG_DOUBLE # include #endif /* Specification. */ #include #include /* isspace() */ #include #include /* {DBL,LDBL}_{MIN,MAX} */ #include /* LONG_{MIN,MAX} */ #include /* localeconv() */ #include /* NAN */ #include #include /* sprintf() */ #include /* strdup() */ #if HAVE_NL_LANGINFO # include #endif #include "c-ctype.h" #undef MIN #undef MAX #ifdef USE_LONG_DOUBLE # define STRTOD strtold # define LDEXP ldexpl # if defined __hpux && defined __hppa /* We cannot call strtold on HP-UX/hppa, because its return type is a struct, not a 'long double'. */ # define HAVE_UNDERLYING_STRTOD 0 # elif STRTOLD_HAS_UNDERFLOW_BUG /* strtold would not set errno=ERANGE upon underflow. */ # define HAVE_UNDERLYING_STRTOD 0 # else # define HAVE_UNDERLYING_STRTOD HAVE_STRTOLD # endif # define DOUBLE long double # define MIN LDBL_MIN # define MAX LDBL_MAX # define L_(literal) literal##L #else # define STRTOD strtod # define LDEXP ldexp # define HAVE_UNDERLYING_STRTOD 1 # define DOUBLE double # define MIN DBL_MIN # define MAX DBL_MAX # define L_(literal) literal #endif #if (defined USE_LONG_DOUBLE ? HAVE_LDEXPM_IN_LIBC : HAVE_LDEXP_IN_LIBC) # define USE_LDEXP 1 #else # define USE_LDEXP 0 #endif /* Return true if C is a space in the current locale, avoiding problems with signed char and isspace. */ static bool locale_isspace (char c) { unsigned char uc = c; return isspace (uc) != 0; } /* Determine the decimal-point character according to the current locale. */ static char decimal_point_char (void) { const char *point; /* Determine it in a multithread-safe way. We know nl_langinfo is multithread-safe on glibc systems and Mac OS X systems, but is not required to be multithread-safe by POSIX. sprintf(), however, is multithread-safe. localeconv() is rarely multithread-safe. */ #if HAVE_NL_LANGINFO && (__GLIBC__ || defined __UCLIBC__ || (defined __APPLE__ && defined __MACH__)) point = nl_langinfo (RADIXCHAR); #elif 1 char pointbuf[5]; sprintf (pointbuf, "%#.0f", 1.0); point = &pointbuf[1]; #else point = localeconv () -> decimal_point; #endif /* The decimal point is always a single byte: either '.' or ','. */ return (point[0] != '\0' ? point[0] : '.'); } #if !USE_LDEXP #undef LDEXP #define LDEXP dummy_ldexp /* A dummy definition that will never be invoked. */ static DOUBLE LDEXP (DOUBLE x _GL_UNUSED, int exponent _GL_UNUSED) { abort (); return L_(0.0); } #endif /* Return X * BASE**EXPONENT. Return an extreme value and set errno to ERANGE if underflow or overflow occurs. */ static DOUBLE scale_radix_exp (DOUBLE x, int radix, long int exponent) { /* If RADIX == 10, this code is neither precise nor fast; it is merely a straightforward and relatively portable approximation. If N == 2, this code is precise on a radix-2 implementation, albeit perhaps not fast if ldexp is not in libc. */ long int e = exponent; if (USE_LDEXP && radix == 2) return LDEXP (x, e < INT_MIN ? INT_MIN : INT_MAX < e ? INT_MAX : e); else { DOUBLE r = x; if (r != 0) { if (e < 0) { while (e++ != 0) { r /= radix; if (r == 0 && x != 0) { errno = ERANGE; break; } } } else { while (e-- != 0) { if (r < -MAX / radix) { errno = ERANGE; return -HUGE_VAL; } else if (MAX / radix < r) { errno = ERANGE; return HUGE_VAL; } else r *= radix; } } } return r; } } /* Parse a number at NPTR; this is a bit like strtol (NPTR, ENDPTR) except there are no leading spaces or signs or "0x", and ENDPTR is nonnull. The number uses a base BASE (either 10 or 16) fraction, a radix RADIX (either 10 or 2) exponent, and exponent character EXPCHAR. BASE is RADIX**RADIX_MULTIPLIER. */ static DOUBLE parse_number (const char *nptr, int base, int radix, int radix_multiplier, char radixchar, char expchar, char **endptr) { const char *s = nptr; const char *digits_start; const char *digits_end; const char *radixchar_ptr; long int exponent; DOUBLE num; /* First, determine the start and end of the digit sequence. */ digits_start = s; radixchar_ptr = NULL; for (;; ++s) { if (base == 16 ? c_isxdigit (*s) : c_isdigit (*s)) ; else if (radixchar_ptr == NULL && *s == radixchar) { /* Record that we have found the decimal point. */ radixchar_ptr = s; } else /* Any other character terminates the digit sequence. */ break; } digits_end = s; /* Now radixchar_ptr == NULL or digits_start <= radixchar_ptr < digits_end. */ if (false) { /* Unoptimized. */ exponent = (radixchar_ptr != NULL ? - (long int) (digits_end - radixchar_ptr - 1) : 0); } else { /* Remove trailing zero digits. This reduces rounding errors for inputs such as 1.0000000000 or 10000000000e-10. */ while (digits_end > digits_start) { if (digits_end - 1 == radixchar_ptr || *(digits_end - 1) == '0') digits_end--; else break; } exponent = (radixchar_ptr != NULL ? (digits_end > radixchar_ptr ? - (long int) (digits_end - radixchar_ptr - 1) : (long int) (radixchar_ptr - digits_end)) : (long int) (s - digits_end)); } /* Then, convert the digit sequence to a number. */ { const char *dp; num = 0; for (dp = digits_start; dp < digits_end; dp++) if (dp != radixchar_ptr) { int digit; /* Make sure that multiplication by BASE will not overflow. */ if (!(num <= MAX / base)) { /* The value of the digit and all subsequent digits don't matter, since we have already gotten as many digits as can be represented in a 'DOUBLE'. This doesn't necessarily mean that the result will overflow: The exponent may reduce it to within range. */ exponent += (digits_end - dp) - (radixchar_ptr >= dp && radixchar_ptr < digits_end ? 1 : 0); break; } /* Eat the next digit. */ if (c_isdigit (*dp)) digit = *dp - '0'; else if (base == 16 && c_isxdigit (*dp)) digit = c_tolower (*dp) - ('a' - 10); else abort (); num = num * base + digit; } } exponent = exponent * radix_multiplier; /* Finally, parse the exponent. */ if (c_tolower (*s) == expchar && ! locale_isspace (s[1])) { /* Add any given exponent to the implicit one. */ int saved_errno = errno; char *end; long int value = strtol (s + 1, &end, 10); errno = saved_errno; if (s + 1 != end) { /* Skip past the exponent, and add in the implicit exponent, resulting in an extreme value on overflow. */ s = end; exponent = (exponent < 0 ? (value < LONG_MIN - exponent ? LONG_MIN : exponent + value) : (LONG_MAX - exponent < value ? LONG_MAX : exponent + value)); } } *endptr = (char *) s; return scale_radix_exp (num, radix, exponent); } /* HP cc on HP-UX 10.20 has a bug with the constant expression -0.0. ICC 10.0 has a bug when optimizing the expression -zero. The expression -MIN * MIN does not work when cross-compiling to PowerPC on Mac OS X 10.5. */ static DOUBLE minus_zero (void) { #if defined __hpux || defined __sgi || defined __ICC return -MIN * MIN; #else return -0.0; #endif } /* Convert NPTR to a DOUBLE. If ENDPTR is not NULL, a pointer to the character after the last one used in the number is put in *ENDPTR. */ DOUBLE STRTOD (const char *nptr, char **endptr) #if HAVE_UNDERLYING_STRTOD # ifdef USE_LONG_DOUBLE # undef strtold # else # undef strtod # endif #else # undef STRTOD # define STRTOD(NPTR,ENDPTR) \ parse_number (NPTR, 10, 10, 1, radixchar, 'e', ENDPTR) #endif /* From here on, STRTOD refers to the underlying implementation. It needs to handle only finite unsigned decimal numbers with non-null ENDPTR. */ { char radixchar; bool negative = false; /* The number so far. */ DOUBLE num; const char *s = nptr; const char *end; char *endbuf; int saved_errno = errno; radixchar = decimal_point_char (); /* Eat whitespace. */ while (locale_isspace (*s)) ++s; /* Get the sign. */ negative = *s == '-'; if (*s == '-' || *s == '+') ++s; num = STRTOD (s, &endbuf); end = endbuf; if (c_isdigit (s[*s == radixchar])) { /* If a hex float was converted incorrectly, do it ourselves. If the string starts with "0x" but does not contain digits, consume the "0" ourselves. If a hex float is followed by a 'p' but no exponent, then adjust the end pointer. */ if (*s == '0' && c_tolower (s[1]) == 'x') { if (! c_isxdigit (s[2 + (s[2] == radixchar)])) { end = s + 1; /* strtod() on z/OS returns ERANGE for "0x". */ errno = saved_errno; } else if (end <= s + 2) { num = parse_number (s + 2, 16, 2, 4, radixchar, 'p', &endbuf); end = endbuf; } else { const char *p = s + 2; while (p < end && c_tolower (*p) != 'p') p++; if (p < end && ! c_isdigit (p[1 + (p[1] == '-' || p[1] == '+')])) { char *dup = strdup (s); errno = saved_errno; if (!dup) { /* Not really our day, is it. Rounding errors are better than outright failure. */ num = parse_number (s + 2, 16, 2, 4, radixchar, 'p', &endbuf); } else { dup[p - s] = '\0'; num = STRTOD (dup, &endbuf); saved_errno = errno; free (dup); errno = saved_errno; } end = p; } } } else { /* If "1e 1" was misparsed as 10.0 instead of 1.0, re-do the underlying STRTOD on a copy of the original string truncated to avoid the bug. */ const char *e = s + 1; while (e < end && c_tolower (*e) != 'e') e++; if (e < end && ! c_isdigit (e[1 + (e[1] == '-' || e[1] == '+')])) { char *dup = strdup (s); errno = saved_errno; if (!dup) { /* Not really our day, is it. Rounding errors are better than outright failure. */ num = parse_number (s, 10, 10, 1, radixchar, 'e', &endbuf); } else { dup[e - s] = '\0'; num = STRTOD (dup, &endbuf); saved_errno = errno; free (dup); errno = saved_errno; } end = e; } } s = end; } /* Check for infinities and NaNs. */ else if (c_tolower (*s) == 'i' && c_tolower (s[1]) == 'n' && c_tolower (s[2]) == 'f') { s += 3; if (c_tolower (*s) == 'i' && c_tolower (s[1]) == 'n' && c_tolower (s[2]) == 'i' && c_tolower (s[3]) == 't' && c_tolower (s[4]) == 'y') s += 5; num = HUGE_VAL; errno = saved_errno; } else if (c_tolower (*s) == 'n' && c_tolower (s[1]) == 'a' && c_tolower (s[2]) == 'n') { s += 3; if (*s == '(') { const char *p = s + 1; while (c_isalnum (*p)) p++; if (*p == ')') s = p + 1; } /* If the underlying implementation misparsed the NaN, assume its result is incorrect, and return a NaN. Normally it's better to use the underlying implementation's result, since a nice implementation populates the bits of the NaN according to interpreting n-char-sequence as a hexadecimal number. */ if (s != end || num == num) num = NAN; errno = saved_errno; } else { /* No conversion could be performed. */ errno = EINVAL; s = nptr; } if (endptr != NULL) *endptr = (char *) s; /* Special case -0.0, since at least ICC miscompiles negation. We can't use copysign(), as that drags in -lm on some platforms. */ if (!num && negative) return minus_zero (); return negative ? -num : num; } pspp-1.4.1/gl/strndup.c0000644000175000017500000000202513723215640014362 0ustar00blpblp00000000000000/* A replacement function, for systems that lack strndup. Copyright (C) 1996-1998, 2001-2003, 2005-2007, 2009-2020 Free Software Foundation, Inc. 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 3, 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, see . */ #include #include #include char * strndup (char const *s, size_t n) { size_t len = strnlen (s, n); char *new = malloc (len + 1); if (new == NULL) return NULL; new[len] = '\0'; return memcpy (new, s, len); } pspp-1.4.1/gl/signbitf.c0000644000175000017500000000410013723215640014464 0ustar00blpblp00000000000000/* signbit() macro: Determine the sign bit of a floating-point number. Copyright (C) 2007, 2009-2020 Free Software Foundation, Inc. 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 3 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, see . */ #include /* Specification. */ #include #include #include "isnanf-nolibm.h" #include "float+.h" #ifdef gl_signbitf_OPTIMIZED_MACRO # undef gl_signbitf #endif int gl_signbitf (float arg) { #if defined FLT_SIGNBIT_WORD && defined FLT_SIGNBIT_BIT /* The use of a union to extract the bits of the representation of a 'long double' is safe in practice, despite of the "aliasing rules" of C99, because the GCC docs say "Even with '-fstrict-aliasing', type-punning is allowed, provided the memory is accessed through the union type." and similarly for other compilers. */ # define NWORDS \ ((sizeof (float) + sizeof (unsigned int) - 1) / sizeof (unsigned int)) union { float value; unsigned int word[NWORDS]; } m; m.value = arg; return (m.word[FLT_SIGNBIT_WORD] >> FLT_SIGNBIT_BIT) & 1; #elif HAVE_COPYSIGNF_IN_LIBC return copysignf (1.0f, arg) < 0; #else /* This does not do the right thing for NaN, but this is irrelevant for most use cases. */ if (isnanf (arg)) return 0; if (arg < 0.0f) return 1; else if (arg == 0.0f) { /* Distinguish 0.0f and -0.0f. */ static float plus_zero = 0.0f; float arg_mem = arg; return (memcmp (&plus_zero, &arg_mem, SIZEOF_FLT) != 0); } else return 0; #endif } pspp-1.4.1/gl/localcharset.h0000644000175000017500000001425513723215637015352 0ustar00blpblp00000000000000/* Determine a canonical name for the current locale's character encoding. Copyright (C) 2000-2003, 2009-2020 Free Software Foundation, Inc. This file is part of the GNU CHARSET Library. 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 3, 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, see . */ #ifndef _LOCALCHARSET_H #define _LOCALCHARSET_H #ifdef __cplusplus extern "C" { #endif /* Determine the current locale's character encoding, and canonicalize it into one of the canonical names listed below. The result must not be freed; it is statically allocated. The result becomes invalid when setlocale() is used to change the global locale, or when the value of one of the environment variables LC_ALL, LC_CTYPE, LANG is changed; threads in multithreaded programs should not do this. If the canonical name cannot be determined, the result is a non-canonical name. */ extern const char * locale_charset (void); /* About GNU canonical names for character encodings: Every canonical name must be supported by GNU libiconv. Support by GNU libc is also desirable. The name is case insensitive. Usually an upper case MIME charset name is preferred. The current list of these GNU canonical names is: name MIME? used by which systems (darwin = Mac OS X, windows = native Windows) ASCII, ANSI_X3.4-1968 glibc solaris freebsd netbsd darwin minix cygwin ISO-8859-1 Y glibc aix hpux irix osf solaris freebsd netbsd openbsd darwin cygwin zos ISO-8859-2 Y glibc aix hpux irix osf solaris freebsd netbsd openbsd darwin cygwin zos ISO-8859-3 Y glibc solaris cygwin ISO-8859-4 Y hpux osf solaris freebsd netbsd openbsd darwin ISO-8859-5 Y glibc aix hpux irix osf solaris freebsd netbsd openbsd darwin cygwin zos ISO-8859-6 Y glibc aix hpux solaris cygwin ISO-8859-7 Y glibc aix hpux irix osf solaris freebsd netbsd openbsd darwin cygwin zos ISO-8859-8 Y glibc aix hpux osf solaris cygwin zos ISO-8859-9 Y glibc aix hpux irix osf solaris freebsd darwin cygwin zos ISO-8859-13 glibc hpux solaris freebsd netbsd openbsd darwin cygwin ISO-8859-14 glibc cygwin ISO-8859-15 glibc aix irix osf solaris freebsd netbsd openbsd darwin cygwin KOI8-R Y glibc hpux solaris freebsd netbsd openbsd darwin KOI8-U Y glibc freebsd netbsd openbsd darwin cygwin KOI8-T glibc CP437 dos CP775 dos CP850 aix osf dos CP852 dos CP855 dos CP856 aix CP857 dos CP861 dos CP862 dos CP864 dos CP865 dos CP866 freebsd netbsd openbsd darwin dos CP869 dos CP874 windows dos CP922 aix CP932 aix cygwin windows dos CP943 aix zos CP949 osf darwin windows dos CP950 windows dos CP1046 aix CP1124 aix CP1125 dos CP1129 aix CP1131 freebsd darwin CP1250 windows CP1251 glibc hpux solaris freebsd netbsd openbsd darwin cygwin windows CP1252 aix windows CP1253 windows CP1254 windows CP1255 glibc windows CP1256 windows CP1257 windows GB2312 Y glibc aix hpux irix solaris freebsd netbsd darwin cygwin zos EUC-JP Y glibc aix hpux irix osf solaris freebsd netbsd darwin cygwin EUC-KR Y glibc aix hpux irix osf solaris freebsd netbsd darwin cygwin zos EUC-TW glibc aix hpux irix osf solaris netbsd BIG5 Y glibc aix hpux osf solaris freebsd netbsd darwin cygwin zos BIG5-HKSCS glibc hpux solaris netbsd darwin GBK glibc aix osf solaris freebsd darwin cygwin windows dos GB18030 glibc hpux solaris freebsd netbsd darwin SHIFT_JIS Y hpux osf solaris freebsd netbsd darwin JOHAB glibc solaris windows TIS-620 glibc aix hpux osf solaris cygwin zos VISCII Y glibc TCVN5712-1 glibc ARMSCII-8 glibc freebsd netbsd darwin GEORGIAN-PS glibc cygwin PT154 glibc netbsd cygwin HP-ROMAN8 hpux HP-ARABIC8 hpux HP-GREEK8 hpux HP-HEBREW8 hpux HP-TURKISH8 hpux HP-KANA8 hpux DEC-KANJI osf DEC-HANYU osf UTF-8 Y glibc aix hpux osf solaris netbsd darwin cygwin zos Note: Names which are not marked as being a MIME name should not be used in Internet protocols for information interchange (mail, news, etc.). Note: ASCII and ANSI_X3.4-1968 are synonymous canonical names. Applications must understand both names and treat them as equivalent. */ #ifdef __cplusplus } #endif #endif /* _LOCALCHARSET_H */ pspp-1.4.1/gl/limits.in.h0000644000175000017500000001032713723215637014610 0ustar00blpblp00000000000000/* A GNU-like . Copyright 2016-2020 Free Software Foundation, Inc. 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 3, 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, see . */ #if __GNUC__ >= 3 @PRAGMA_SYSTEM_HEADER@ #endif @PRAGMA_COLUMNS@ #if defined _GL_ALREADY_INCLUDING_LIMITS_H /* Special invocation convention: On Haiku/x86_64, we have a sequence of nested includes -> -> . In this situation, LONG_MAX and INT_MAX are not yet defined, therefore we should not attempt to define LONG_BIT. */ #@INCLUDE_NEXT@ @NEXT_LIMITS_H@ #else /* Normal invocation convention. */ #ifndef _@GUARD_PREFIX@_LIMITS_H # define _GL_ALREADY_INCLUDING_LIMITS_H /* The include_next requires a split double-inclusion guard. */ # @INCLUDE_NEXT@ @NEXT_LIMITS_H@ # undef _GL_ALREADY_INCLUDING_LIMITS_H #ifndef _@GUARD_PREFIX@_LIMITS_H #define _@GUARD_PREFIX@_LIMITS_H #ifndef LLONG_MIN # if defined LONG_LONG_MIN /* HP-UX 11.31 */ # define LLONG_MIN LONG_LONG_MIN # elif defined LONGLONG_MIN /* IRIX 6.5 */ # define LLONG_MIN LONGLONG_MIN # elif defined __GNUC__ # define LLONG_MIN (- __LONG_LONG_MAX__ - 1LL) # endif #endif #ifndef LLONG_MAX # if defined LONG_LONG_MAX /* HP-UX 11.31 */ # define LLONG_MAX LONG_LONG_MAX # elif defined LONGLONG_MAX /* IRIX 6.5 */ # define LLONG_MAX LONGLONG_MAX # elif defined __GNUC__ # define LLONG_MAX __LONG_LONG_MAX__ # endif #endif #ifndef ULLONG_MAX # if defined ULONG_LONG_MAX /* HP-UX 11.31 */ # define ULLONG_MAX ULONG_LONG_MAX # elif defined ULONGLONG_MAX /* IRIX 6.5 */ # define ULLONG_MAX ULONGLONG_MAX # elif defined __GNUC__ # define ULLONG_MAX (__LONG_LONG_MAX__ * 2ULL + 1ULL) # endif #endif /* The number of usable bits in an unsigned or signed integer type with minimum value MIN and maximum value MAX, as an int expression suitable in #if. Cover all known practical hosts. This implementation exploits the fact that MAX is 1 less than a power of 2, and merely counts the number of 1 bits in MAX; "COBn" means "count the number of 1 bits in the low-order n bits"). */ #define _GL_INTEGER_WIDTH(min, max) (((min) < 0) + _GL_COB128 (max)) #define _GL_COB128(n) (_GL_COB64 ((n) >> 31 >> 31 >> 2) + _GL_COB64 (n)) #define _GL_COB64(n) (_GL_COB32 ((n) >> 31 >> 1) + _GL_COB32 (n)) #define _GL_COB32(n) (_GL_COB16 ((n) >> 16) + _GL_COB16 (n)) #define _GL_COB16(n) (_GL_COB8 ((n) >> 8) + _GL_COB8 (n)) #define _GL_COB8(n) (_GL_COB4 ((n) >> 4) + _GL_COB4 (n)) #define _GL_COB4(n) (!!((n) & 8) + !!((n) & 4) + !!((n) & 2) + !!((n) & 1)) #ifndef WORD_BIT /* Assume 'int' is 32 bits wide. */ # define WORD_BIT 32 #endif #ifndef LONG_BIT /* Assume 'long' is 32 or 64 bits wide. */ # if LONG_MAX == INT_MAX # define LONG_BIT 32 # else # define LONG_BIT 64 # endif #endif /* Macros specified by ISO/IEC TS 18661-1:2014. */ #if (! defined ULLONG_WIDTH \ && (defined _GNU_SOURCE || defined __STDC_WANT_IEC_60559_BFP_EXT__)) # define CHAR_WIDTH _GL_INTEGER_WIDTH (CHAR_MIN, CHAR_MAX) # define SCHAR_WIDTH _GL_INTEGER_WIDTH (SCHAR_MIN, SCHAR_MAX) # define UCHAR_WIDTH _GL_INTEGER_WIDTH (0, UCHAR_MAX) # define SHRT_WIDTH _GL_INTEGER_WIDTH (SHRT_MIN, SHRT_MAX) # define USHRT_WIDTH _GL_INTEGER_WIDTH (0, USHRT_MAX) # define INT_WIDTH _GL_INTEGER_WIDTH (INT_MIN, INT_MAX) # define UINT_WIDTH _GL_INTEGER_WIDTH (0, UINT_MAX) # define LONG_WIDTH _GL_INTEGER_WIDTH (LONG_MIN, LONG_MAX) # define ULONG_WIDTH _GL_INTEGER_WIDTH (0, ULONG_MAX) # define LLONG_WIDTH _GL_INTEGER_WIDTH (LLONG_MIN, LLONG_MAX) # define ULLONG_WIDTH _GL_INTEGER_WIDTH (0, ULLONG_MAX) #endif /* !ULLONG_WIDTH && (_GNU_SOURCE || __STDC_WANT_IEC_60559_BFP_EXT__) */ #endif /* _@GUARD_PREFIX@_LIMITS_H */ #endif /* _@GUARD_PREFIX@_LIMITS_H */ #endif pspp-1.4.1/gl/signbitl.c0000644000175000017500000000414313723215640014501 0ustar00blpblp00000000000000/* signbit() macro: Determine the sign bit of a floating-point number. Copyright (C) 2007, 2009-2020 Free Software Foundation, Inc. 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 3 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, see . */ #include /* Specification. */ #include #include #include "isnanl-nolibm.h" #include "float+.h" #ifdef gl_signbitl_OPTIMIZED_MACRO # undef gl_signbitl #endif int gl_signbitl (long double arg) { #if defined LDBL_SIGNBIT_WORD && defined LDBL_SIGNBIT_BIT /* The use of a union to extract the bits of the representation of a 'long double' is safe in practice, despite of the "aliasing rules" of C99, because the GCC docs say "Even with '-fstrict-aliasing', type-punning is allowed, provided the memory is accessed through the union type." and similarly for other compilers. */ # define NWORDS \ ((sizeof (long double) + sizeof (unsigned int) - 1) / sizeof (unsigned int)) union { long double value; unsigned int word[NWORDS]; } m; m.value = arg; return (m.word[LDBL_SIGNBIT_WORD] >> LDBL_SIGNBIT_BIT) & 1; #elif HAVE_COPYSIGNL_IN_LIBC return copysignl (1.0L, arg) < 0; #else /* This does not do the right thing for NaN, but this is irrelevant for most use cases. */ if (isnanl (arg)) return 0; if (arg < 0.0L) return 1; else if (arg == 0.0L) { /* Distinguish 0.0L and -0.0L. */ static long double plus_zero = 0.0L; long double arg_mem = arg; return (memcmp (&plus_zero, &arg_mem, SIZEOF_LDBL) != 0); } else return 0; #endif } pspp-1.4.1/gl/xbinary-io.h0000644000175000017500000000261613723215640014757 0ustar00blpblp00000000000000/* Binary mode I/O with checking Copyright 2017-2020 Free Software Foundation, Inc. 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 3 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, see . */ #ifndef _XBINARY_IO_H #define _XBINARY_IO_H #include "binary-io.h" #ifndef _GL_INLINE_HEADER_BEGIN #error "Please include config.h first." #endif _GL_INLINE_HEADER_BEGIN #ifndef XBINARY_IO_INLINE # define XBINARY_IO_INLINE _GL_INLINE #endif #if O_BINARY extern _Noreturn void xset_binary_mode_error (void); #else XBINARY_IO_INLINE void xset_binary_mode_error (void) {} #endif /* Set the mode of FD to MODE, which should be either O_TEXT or O_BINARY. Report an error and exit if this fails. */ XBINARY_IO_INLINE void xset_binary_mode (int fd, int mode) { if (set_binary_mode (fd, mode) < 0) xset_binary_mode_error (); } _GL_INLINE_HEADER_END #endif /* _XBINARY_IO_H */ pspp-1.4.1/gl/basename-lgpl.c0000644000175000017500000000344413723215636015405 0ustar00blpblp00000000000000/* basename.c -- return the last element in a file name Copyright (C) 1990, 1998-2001, 2003-2006, 2009-2020 Free Software Foundation, Inc. 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 3 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, see . */ #include /* Specification. */ #include "basename-lgpl.h" #include #include #include "filename.h" char * last_component (char const *name) { char const *base = name + FILE_SYSTEM_PREFIX_LEN (name); char const *p; bool last_was_slash = false; while (ISSLASH (*base)) base++; for (p = base; *p; p++) { if (ISSLASH (*p)) last_was_slash = true; else if (last_was_slash) { base = p; last_was_slash = false; } } return (char *) base; } size_t base_len (char const *name) { size_t len; size_t prefix_len = FILE_SYSTEM_PREFIX_LEN (name); for (len = strlen (name); 1 < len && ISSLASH (name[len - 1]); len--) continue; if (DOUBLE_SLASH_IS_DISTINCT_ROOT && len == 1 && ISSLASH (name[0]) && ISSLASH (name[1]) && ! name[2]) return 2; if (FILE_SYSTEM_DRIVE_PREFIX_CAN_BE_RELATIVE && prefix_len && len == prefix_len && ISSLASH (name[prefix_len])) return prefix_len + 1; return len; } pspp-1.4.1/gl/gl_linkedhash_list.c0000644000175000017500000000630013723215637016520 0ustar00blpblp00000000000000/* Sequential list data type implemented by a hash table with a linked list. Copyright (C) 2006, 2008-2020 Free Software Foundation, Inc. Written by Bruno Haible , 2006. 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 3 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, see . */ #include /* Specification. */ #include "gl_linkedhash_list.h" #include /* for uintptr_t, SIZE_MAX */ #include #include "xsize.h" #define WITH_HASHTABLE 1 /* -------------------------- gl_list_t Data Type -------------------------- */ /* Generic hash-table code. */ #include "gl_anyhash1.h" /* Generic linked list code. */ #include "gl_anylinked_list1.h" /* Generic hash-table code. */ #define CONTAINER_T gl_list_t #define CONTAINER_COUNT(list) (list)->count #include "gl_anyhash2.h" /* Add a node to the hash table structure. */ static void add_to_bucket (gl_list_t list, gl_list_node_t node) { size_t bucket = node->h.hashcode % list->table_size; node->h.hash_next = list->table[bucket]; list->table[bucket] = &node->h; } /* Tell all compilers that the return value is 0. */ #define add_to_bucket(list,node) ((add_to_bucket) (list, node), 0) /* Remove a node from the hash table structure. */ static void remove_from_bucket (gl_list_t list, gl_list_node_t node) { size_t bucket = node->h.hashcode % list->table_size; gl_hash_entry_t *p; for (p = &list->table[bucket]; ; p = &(*p)->hash_next) { if (*p == &node->h) { *p = node->h.hash_next; break; } if (*p == NULL) /* node is not in the right bucket. Did the hash codes change inadvertently? */ abort (); } } /* Generic linked list code. */ #include "gl_anylinked_list2.h" const struct gl_list_implementation gl_linkedhash_list_implementation = { gl_linked_nx_create_empty, gl_linked_nx_create, gl_linked_size, gl_linked_node_value, gl_linked_node_nx_set_value, gl_linked_next_node, gl_linked_previous_node, gl_linked_get_at, gl_linked_nx_set_at, gl_linked_search_from_to, gl_linked_indexof_from_to, gl_linked_nx_add_first, gl_linked_nx_add_last, gl_linked_nx_add_before, gl_linked_nx_add_after, gl_linked_nx_add_at, gl_linked_remove_node, gl_linked_remove_at, gl_linked_remove, gl_linked_list_free, gl_linked_iterator, gl_linked_iterator_from_to, gl_linked_iterator_next, gl_linked_iterator_free, gl_linked_sortedlist_search, gl_linked_sortedlist_search_from_to, gl_linked_sortedlist_indexof, gl_linked_sortedlist_indexof_from_to, gl_linked_sortedlist_nx_add, gl_linked_sortedlist_remove }; pspp-1.4.1/gl/setlocale_null.c0000644000175000017500000002520213723215640015672 0ustar00blpblp00000000000000/* Query the name of the current global locale. Copyright (C) 2019-2020 Free Software Foundation, Inc. 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 3 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, see . */ /* Written by Bruno Haible , 2019. */ #include /* Specification. */ #include "setlocale_null.h" #include #include #include #include #if defined _WIN32 && !defined __CYGWIN__ # include #endif #if !(SETLOCALE_NULL_ALL_MTSAFE && SETLOCALE_NULL_ONE_MTSAFE) # if defined _WIN32 && !defined __CYGWIN__ # define WIN32_LEAN_AND_MEAN /* avoid including junk */ # include # elif HAVE_PTHREAD_API # include # if HAVE_THREADS_H && HAVE_WEAK_SYMBOLS # include # pragma weak thrd_exit # define c11_threads_in_use() (thrd_exit != NULL) # else # define c11_threads_in_use() 0 # endif # elif HAVE_THREADS_H # include # endif #endif /* Use the system's setlocale() function, not the gnulib override, here. */ #undef setlocale static const char * setlocale_null_androidfix (int category) { const char *result = setlocale (category, NULL); #ifdef __ANDROID__ if (result == NULL) switch (category) { case LC_CTYPE: case LC_NUMERIC: case LC_TIME: case LC_COLLATE: case LC_MONETARY: case LC_MESSAGES: case LC_ALL: case LC_PAPER: case LC_NAME: case LC_ADDRESS: case LC_TELEPHONE: case LC_MEASUREMENT: result = "C"; break; default: break; } #endif return result; } static int setlocale_null_unlocked (int category, char *buf, size_t bufsize) { #if defined _WIN32 && !defined __CYGWIN__ && defined _MSC_VER /* On native Windows, nowadays, the setlocale() implementation is based on _wsetlocale() and uses malloc() for the result. We are better off using _wsetlocale() directly. */ const wchar_t *result = _wsetlocale (category, NULL); if (result == NULL) { /* CATEGORY is invalid. */ if (bufsize > 0) /* Return an empty string in BUF. This is a convenience for callers that don't want to write explicit code for handling EINVAL. */ buf[0] = '\0'; return EINVAL; } else { size_t length = wcslen (result); if (length < bufsize) { size_t i; /* Convert wchar_t[] -> char[], assuming plain ASCII. */ for (i = 0; i <= length; i++) buf[i] = result[i]; return 0; } else { if (bufsize > 0) { /* Return a truncated result in BUF. This is a convenience for callers that don't want to write explicit code for handling ERANGE. */ size_t i; /* Convert wchar_t[] -> char[], assuming plain ASCII. */ for (i = 0; i < bufsize; i++) buf[i] = result[i]; buf[bufsize - 1] = '\0'; } return ERANGE; } } #else const char *result = setlocale_null_androidfix (category); if (result == NULL) { /* CATEGORY is invalid. */ if (bufsize > 0) /* Return an empty string in BUF. This is a convenience for callers that don't want to write explicit code for handling EINVAL. */ buf[0] = '\0'; return EINVAL; } else { size_t length = strlen (result); if (length < bufsize) { memcpy (buf, result, length + 1); return 0; } else { if (bufsize > 0) { /* Return a truncated result in BUF. This is a convenience for callers that don't want to write explicit code for handling ERANGE. */ memcpy (buf, result, bufsize - 1); buf[bufsize - 1] = '\0'; } return ERANGE; } } #endif } #if !(SETLOCALE_NULL_ALL_MTSAFE && SETLOCALE_NULL_ONE_MTSAFE) /* musl libc, macOS, FreeBSD, NetBSD, OpenBSD, AIX, Haiku, Cygwin */ /* Use a lock, so that no two threads can invoke setlocale_null_unlocked at the same time. */ /* Prohibit renaming this symbol. */ # undef gl_get_setlocale_null_lock # if defined _WIN32 && !defined __CYGWIN__ extern __declspec(dllimport) CRITICAL_SECTION *gl_get_setlocale_null_lock (void); static int setlocale_null_with_lock (int category, char *buf, size_t bufsize) { CRITICAL_SECTION *lock = gl_get_setlocale_null_lock (); int ret; EnterCriticalSection (lock); ret = setlocale_null_unlocked (category, buf, bufsize); LeaveCriticalSection (lock); return ret; } # elif HAVE_PTHREAD_API /* musl libc, macOS, FreeBSD, NetBSD, OpenBSD, AIX, Haiku, Cygwin */ extern # if defined _WIN32 || defined __CYGWIN__ __declspec(dllimport) # endif pthread_mutex_t *gl_get_setlocale_null_lock (void); # if HAVE_WEAK_SYMBOLS /* musl libc, FreeBSD, NetBSD, OpenBSD, Haiku */ /* Avoid the need to link with '-lpthread'. */ # pragma weak pthread_mutex_lock # pragma weak pthread_mutex_unlock /* Determine whether libpthread is in use. */ # pragma weak pthread_mutexattr_gettype /* See the comments in lock.h. */ # define pthread_in_use() \ (pthread_mutexattr_gettype != NULL || c11_threads_in_use ()) # else # define pthread_in_use() 1 # endif static int setlocale_null_with_lock (int category, char *buf, size_t bufsize) { if (pthread_in_use()) { pthread_mutex_t *lock = gl_get_setlocale_null_lock (); int ret; if (pthread_mutex_lock (lock)) abort (); ret = setlocale_null_unlocked (category, buf, bufsize); if (pthread_mutex_unlock (lock)) abort (); return ret; } else return setlocale_null_unlocked (category, buf, bufsize); } # elif HAVE_THREADS_H extern mtx_t *gl_get_setlocale_null_lock (void); static int setlocale_null_with_lock (int category, char *buf, size_t bufsize) { mtx_t *lock = gl_get_setlocale_null_lock (); int ret; if (mtx_lock (lock) != thrd_success) abort (); ret = setlocale_null_unlocked (category, buf, bufsize); if (mtx_unlock (lock) != thrd_success) abort (); return ret; } # endif #endif int setlocale_null_r (int category, char *buf, size_t bufsize) { #if SETLOCALE_NULL_ALL_MTSAFE # if SETLOCALE_NULL_ONE_MTSAFE return setlocale_null_unlocked (category, buf, bufsize); # else if (category == LC_ALL) return setlocale_null_unlocked (category, buf, bufsize); else return setlocale_null_with_lock (category, buf, bufsize); # endif #else # if SETLOCALE_NULL_ONE_MTSAFE if (category == LC_ALL) return setlocale_null_with_lock (category, buf, bufsize); else return setlocale_null_unlocked (category, buf, bufsize); # else return setlocale_null_with_lock (category, buf, bufsize); # endif #endif } const char * setlocale_null (int category) { #if SETLOCALE_NULL_ALL_MTSAFE && SETLOCALE_NULL_ONE_MTSAFE return setlocale_null_androidfix (category); #else /* This call must be multithread-safe. To achieve this without using thread-local storage: 1. We use a specific static buffer for each possible CATEGORY argument. So that different threads can call setlocale_mtsafe with different CATEGORY arguments, without interfering. 2. We use a simple strcpy or memcpy to fill this static buffer. Filling it through, for example, strcpy + strcat would not be guaranteed to leave the buffer's contents intact if another thread is currently accessing it. If necessary, the contents is first assembled in a stack-allocated buffer. */ if (category == LC_ALL) { # if SETLOCALE_NULL_ALL_MTSAFE return setlocale_null_androidfix (LC_ALL); # else char buf[SETLOCALE_NULL_ALL_MAX]; static char resultbuf[SETLOCALE_NULL_ALL_MAX]; if (setlocale_null_r (LC_ALL, buf, sizeof (buf))) return "C"; strcpy (resultbuf, buf); return resultbuf; # endif } else { # if SETLOCALE_NULL_ONE_MTSAFE return setlocale_null_androidfix (category); # else enum { LC_CTYPE_INDEX, LC_NUMERIC_INDEX, LC_TIME_INDEX, LC_COLLATE_INDEX, LC_MONETARY_INDEX, LC_MESSAGES_INDEX, # ifdef LC_PAPER LC_PAPER_INDEX, # endif # ifdef LC_NAME LC_NAME_INDEX, # endif # ifdef LC_ADDRESS LC_ADDRESS_INDEX, # endif # ifdef LC_TELEPHONE LC_TELEPHONE_INDEX, # endif # ifdef LC_MEASUREMENT LC_MEASUREMENT_INDEX, # endif # ifdef LC_IDENTIFICATION LC_IDENTIFICATION_INDEX, # endif LC_INDICES_COUNT } i; char buf[SETLOCALE_NULL_MAX]; static char resultbuf[LC_INDICES_COUNT][SETLOCALE_NULL_MAX]; int err; err = setlocale_null_r (category, buf, sizeof (buf)); if (err == EINVAL) return NULL; if (err) return "C"; switch (category) { case LC_CTYPE: i = LC_CTYPE_INDEX; break; case LC_NUMERIC: i = LC_NUMERIC_INDEX; break; case LC_TIME: i = LC_TIME_INDEX; break; case LC_COLLATE: i = LC_COLLATE_INDEX; break; case LC_MONETARY: i = LC_MONETARY_INDEX; break; case LC_MESSAGES: i = LC_MESSAGES_INDEX; break; # ifdef LC_PAPER case LC_PAPER: i = LC_PAPER_INDEX; break; # endif # ifdef LC_NAME case LC_NAME: i = LC_NAME_INDEX; break; # endif # ifdef LC_ADDRESS case LC_ADDRESS: i = LC_ADDRESS_INDEX; break; # endif # ifdef LC_TELEPHONE case LC_TELEPHONE: i = LC_TELEPHONE_INDEX; break; # endif # ifdef LC_MEASUREMENT case LC_MEASUREMENT: i = LC_MEASUREMENT_INDEX; break; # endif # ifdef LC_IDENTIFICATION case LC_IDENTIFICATION: i = LC_IDENTIFICATION_INDEX; break; # endif default: /* If you get here, a #ifdef LC_xxx is missing. */ abort (); } strcpy (resultbuf[i], buf); return resultbuf[i]; # endif } #endif } pspp-1.4.1/gl/gl_list.h0000644000175000017500000011144413723215637014341 0ustar00blpblp00000000000000/* Abstract sequential list data type. -*- coding: utf-8 -*- Copyright (C) 2006-2020 Free Software Foundation, Inc. Written by Bruno Haible , 2006. 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 3 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, see . */ #ifndef _GL_LIST_H #define _GL_LIST_H #include #include #ifndef _GL_INLINE_HEADER_BEGIN #error "Please include config.h first." #endif _GL_INLINE_HEADER_BEGIN #ifndef GL_LIST_INLINE # define GL_LIST_INLINE _GL_INLINE #endif #ifdef __cplusplus extern "C" { #endif /* gl_list is an abstract list data type. It can contain any number of objects ('void *' or 'const void *' pointers) in any given order. Duplicates are allowed, but can optionally be forbidden. There are several implementations of this list datatype, optimized for different operations or for memory. You can start using the simplest list implementation, GL_ARRAY_LIST, and switch to a different implementation later, when you realize which operations are performed the most frequently. The API of the different implementations is exactly the same; when switching to a different implementation, you only have to change the gl_list_create call. The implementations are: GL_ARRAY_LIST a growable array GL_CARRAY_LIST a growable circular array GL_LINKED_LIST a linked list GL_AVLTREE_LIST a binary tree (AVL tree) GL_RBTREE_LIST a binary tree (red-black tree) GL_LINKEDHASH_LIST a hash table with a linked list GL_AVLTREEHASH_LIST a hash table with a binary tree (AVL tree) GL_RBTREEHASH_LIST a hash table with a binary tree (red-black tree) The memory consumption is asymptotically the same: O(1) for every object in the list. When looking more closely at the average memory consumed for an object, GL_ARRAY_LIST is the most compact representation, and GL_LINKEDHASH_LIST and GL_TREEHASH_LIST need more memory. The guaranteed average performance of the operations is, for a list of n elements: Operation ARRAY LINKED TREE LINKEDHASH TREEHASH CARRAY with|without with|without duplicates duplicates gl_list_size O(1) O(1) O(1) O(1) O(1) gl_list_node_value O(1) O(1) O(1) O(1) O(1) gl_list_node_set_value O(1) O(1) O(1) O(1) O((log n)²)/O(1) gl_list_next_node O(1) O(1) O(log n) O(1) O(log n) gl_list_previous_node O(1) O(1) O(log n) O(1) O(log n) gl_list_get_at O(1) O(n) O(log n) O(n) O(log n) gl_list_get_first O(1) O(1) O(log n) O(1) O(log n) gl_list_get_last O(1) O(1) O(log n) O(1) O(log n) gl_list_set_at O(1) O(n) O(log n) O(n) O((log n)²)/O(log n) gl_list_set_first O(1) O(1) O(log n) O(n)/O(1) O((log n)²)/O(log n) gl_list_set_last O(1) O(1) O(log n) O(n)/O(1) O((log n)²)/O(log n) gl_list_search O(n) O(n) O(n) O(n)/O(1) O(log n)/O(1) gl_list_search_from O(n) O(n) O(n) O(n)/O(1) O((log n)²)/O(log n) gl_list_search_from_to O(n) O(n) O(n) O(n)/O(1) O((log n)²)/O(log n) gl_list_indexof O(n) O(n) O(n) O(n) O(log n) gl_list_indexof_from O(n) O(n) O(n) O(n) O((log n)²)/O(log n) gl_list_indexof_from_to O(n) O(n) O(n) O(n) O((log n)²)/O(log n) gl_list_add_first O(n)/O(1) O(1) O(log n) O(1) O((log n)²)/O(log n) gl_list_add_last O(1) O(1) O(log n) O(1) O((log n)²)/O(log n) gl_list_add_before O(n) O(1) O(log n) O(1) O((log n)²)/O(log n) gl_list_add_after O(n) O(1) O(log n) O(1) O((log n)²)/O(log n) gl_list_add_at O(n) O(n) O(log n) O(n) O((log n)²)/O(log n) gl_list_remove_node O(n) O(1) O(log n) O(n)/O(1) O((log n)²)/O(log n) gl_list_remove_at O(n) O(n) O(log n) O(n) O((log n)²)/O(log n) gl_list_remove_first O(n)/O(1) O(1) O(log n) O(n)/O(1) O((log n)²)/O(log n) gl_list_remove_last O(1) O(1) O(log n) O(n)/O(1) O((log n)²)/O(log n) gl_list_remove O(n) O(n) O(n) O(n)/O(1) O((log n)²)/O(log n) gl_list_iterator O(1) O(1) O(log n) O(1) O(log n) gl_list_iterator_from_to O(1) O(n) O(log n) O(n) O(log n) gl_list_iterator_next O(1) O(1) O(log n) O(1) O(log n) gl_sortedlist_search O(log n) O(n) O(log n) O(n) O(log n) gl_sortedlist_search_from O(log n) O(n) O(log n) O(n) O(log n) gl_sortedlist_indexof O(log n) O(n) O(log n) O(n) O(log n) gl_sortedlist_indexof_fro O(log n) O(n) O(log n) O(n) O(log n) gl_sortedlist_add O(n) O(n) O(log n) O(n) O((log n)²)/O(log n) gl_sortedlist_remove O(n) O(n) O(log n) O(n) O((log n)²)/O(log n) */ /* -------------------------- gl_list_t Data Type -------------------------- */ /* Type of function used to compare two elements. NULL denotes pointer comparison. */ typedef bool (*gl_listelement_equals_fn) (const void *elt1, const void *elt2); /* Type of function used to compute a hash code. NULL denotes a function that depends only on the pointer itself. */ typedef size_t (*gl_listelement_hashcode_fn) (const void *elt); /* Type of function used to dispose an element once it's removed from a list. NULL denotes a no-op. */ typedef void (*gl_listelement_dispose_fn) (const void *elt); struct gl_list_impl; /* Type representing an entire list. */ typedef struct gl_list_impl * gl_list_t; struct gl_list_node_impl; /* Type representing the position of an element in the list, in a way that is more adapted to the list implementation than a plain index. Note: It is invalidated by insertions and removals! */ typedef struct gl_list_node_impl * gl_list_node_t; struct gl_list_implementation; /* Type representing a list datatype implementation. */ typedef const struct gl_list_implementation * gl_list_implementation_t; #if 0 /* Unless otherwise specified, these are defined inline below. */ /* Creates an empty list. IMPLEMENTATION is one of GL_ARRAY_LIST, GL_CARRAY_LIST, GL_LINKED_LIST, GL_AVLTREE_LIST, GL_RBTREE_LIST, GL_LINKEDHASH_LIST, GL_AVLTREEHASH_LIST, GL_RBTREEHASH_LIST. EQUALS_FN is an element comparison function or NULL. HASHCODE_FN is an element hash code function or NULL. DISPOSE_FN is an element disposal function or NULL. ALLOW_DUPLICATES is false if duplicate elements shall not be allowed in the list. The implementation may verify this at runtime. */ /* declared in gl_xlist.h */ extern gl_list_t gl_list_create_empty (gl_list_implementation_t implementation, gl_listelement_equals_fn equals_fn, gl_listelement_hashcode_fn hashcode_fn, gl_listelement_dispose_fn dispose_fn, bool allow_duplicates); /* Likewise. Returns NULL upon out-of-memory. */ extern gl_list_t gl_list_nx_create_empty (gl_list_implementation_t implementation, gl_listelement_equals_fn equals_fn, gl_listelement_hashcode_fn hashcode_fn, gl_listelement_dispose_fn dispose_fn, bool allow_duplicates); /* Creates a list with given contents. IMPLEMENTATION is one of GL_ARRAY_LIST, GL_CARRAY_LIST, GL_LINKED_LIST, GL_AVLTREE_LIST, GL_RBTREE_LIST, GL_LINKEDHASH_LIST, GL_AVLTREEHASH_LIST, GL_RBTREEHASH_LIST. EQUALS_FN is an element comparison function or NULL. HASHCODE_FN is an element hash code function or NULL. DISPOSE_FN is an element disposal function or NULL. ALLOW_DUPLICATES is false if duplicate elements shall not be allowed in the list. The implementation may verify this at runtime. COUNT is the number of initial elements. CONTENTS[0..COUNT-1] is the initial contents. */ /* declared in gl_xlist.h */ extern gl_list_t gl_list_create (gl_list_implementation_t implementation, gl_listelement_equals_fn equals_fn, gl_listelement_hashcode_fn hashcode_fn, gl_listelement_dispose_fn dispose_fn, bool allow_duplicates, size_t count, const void **contents); /* Likewise. Returns NULL upon out-of-memory. */ extern gl_list_t gl_list_nx_create (gl_list_implementation_t implementation, gl_listelement_equals_fn equals_fn, gl_listelement_hashcode_fn hashcode_fn, gl_listelement_dispose_fn dispose_fn, bool allow_duplicates, size_t count, const void **contents); /* Returns the current number of elements in a list. */ extern size_t gl_list_size (gl_list_t list); /* Returns the element value represented by a list node. */ extern const void * gl_list_node_value (gl_list_t list, gl_list_node_t node); /* Replaces the element value represented by a list node. */ /* declared in gl_xlist.h */ extern void gl_list_node_set_value (gl_list_t list, gl_list_node_t node, const void *elt); /* Likewise. Returns 0 upon success, -1 upon out-of-memory. */ extern int gl_list_node_nx_set_value (gl_list_t list, gl_list_node_t node, const void *elt) _GL_ATTRIBUTE_NODISCARD; /* Returns the node immediately after the given node in the list, or NULL if the given node is the last (rightmost) one in the list. */ extern gl_list_node_t gl_list_next_node (gl_list_t list, gl_list_node_t node); /* Returns the node immediately before the given node in the list, or NULL if the given node is the first (leftmost) one in the list. */ extern gl_list_node_t gl_list_previous_node (gl_list_t list, gl_list_node_t node); /* Returns the element at a given position in the list. POSITION must be >= 0 and < gl_list_size (list). */ extern const void * gl_list_get_at (gl_list_t list, size_t position); /* Returns the element at the first position in the list. The list must be non-empty. */ extern const void * gl_list_get_first (gl_list_t list); /* Returns the element at the last position in the list. The list must be non-empty. */ extern const void * gl_list_get_last (gl_list_t list); /* Replaces the element at a given position in the list. POSITION must be >= 0 and < gl_list_size (list). Returns its node. */ /* declared in gl_xlist.h */ extern gl_list_node_t gl_list_set_at (gl_list_t list, size_t position, const void *elt); /* Likewise. Returns NULL upon out-of-memory. */ extern gl_list_node_t gl_list_nx_set_at (gl_list_t list, size_t position, const void *elt) _GL_ATTRIBUTE_NODISCARD; /* Replaces the element at the first position in the list. Returns its node. The list must be non-empty. */ /* declared in gl_xlist.h */ extern gl_list_node_t gl_list_set_first (gl_list_t list, const void *elt); /* Likewise. Returns NULL upon out-of-memory. */ extern gl_list_node_t gl_list_nx_set_first (gl_list_t list, const void *elt) _GL_ATTRIBUTE_NODISCARD; /* Replaces the element at the last position in the list. Returns its node. The list must be non-empty. */ /* declared in gl_xlist.h */ extern gl_list_node_t gl_list_set_last (gl_list_t list, const void *elt); /* Likewise. Returns NULL upon out-of-memory. */ extern gl_list_node_t gl_list_nx_set_last (gl_list_t list, const void *elt) _GL_ATTRIBUTE_NODISCARD; /* Searches whether an element is already in the list. Returns its node if found, or NULL if not present in the list. */ extern gl_list_node_t gl_list_search (gl_list_t list, const void *elt); /* Searches whether an element is already in the list, at a position >= START_INDEX. Returns its node if found, or NULL if not present in the list. */ extern gl_list_node_t gl_list_search_from (gl_list_t list, size_t start_index, const void *elt); /* Searches whether an element is already in the list, at a position >= START_INDEX and < END_INDEX. Returns its node if found, or NULL if not present in the list. */ extern gl_list_node_t gl_list_search_from_to (gl_list_t list, size_t start_index, size_t end_index, const void *elt); /* Searches whether an element is already in the list. Returns its position if found, or (size_t)(-1) if not present in the list. */ extern size_t gl_list_indexof (gl_list_t list, const void *elt); /* Searches whether an element is already in the list, at a position >= START_INDEX. Returns its position if found, or (size_t)(-1) if not present in the list. */ extern size_t gl_list_indexof_from (gl_list_t list, size_t start_index, const void *elt); /* Searches whether an element is already in the list, at a position >= START_INDEX and < END_INDEX. Returns its position if found, or (size_t)(-1) if not present in the list. */ extern size_t gl_list_indexof_from_to (gl_list_t list, size_t start_index, size_t end_index, const void *elt); /* Adds an element as the first element of the list. Returns its node. */ /* declared in gl_xlist.h */ extern gl_list_node_t gl_list_add_first (gl_list_t list, const void *elt); /* Likewise. Returns NULL upon out-of-memory. */ extern gl_list_node_t gl_list_nx_add_first (gl_list_t list, const void *elt) _GL_ATTRIBUTE_NODISCARD; /* Adds an element as the last element of the list. Returns its node. */ /* declared in gl_xlist.h */ extern gl_list_node_t gl_list_add_last (gl_list_t list, const void *elt); /* Likewise. Returns NULL upon out-of-memory. */ extern gl_list_node_t gl_list_nx_add_last (gl_list_t list, const void *elt) _GL_ATTRIBUTE_NODISCARD; /* Adds an element before a given element node of the list. Returns its node. */ /* declared in gl_xlist.h */ extern gl_list_node_t gl_list_add_before (gl_list_t list, gl_list_node_t node, const void *elt); /* Likewise. Returns NULL upon out-of-memory. */ extern gl_list_node_t gl_list_nx_add_before (gl_list_t list, gl_list_node_t node, const void *elt) _GL_ATTRIBUTE_NODISCARD; /* Adds an element after a given element node of the list. Returns its node. */ /* declared in gl_xlist.h */ extern gl_list_node_t gl_list_add_after (gl_list_t list, gl_list_node_t node, const void *elt); /* Likewise. Returns NULL upon out-of-memory. */ extern gl_list_node_t gl_list_nx_add_after (gl_list_t list, gl_list_node_t node, const void *elt) _GL_ATTRIBUTE_NODISCARD; /* Adds an element at a given position in the list. POSITION must be >= 0 and <= gl_list_size (list). */ /* declared in gl_xlist.h */ extern gl_list_node_t gl_list_add_at (gl_list_t list, size_t position, const void *elt); /* Likewise. Returns NULL upon out-of-memory. */ extern gl_list_node_t gl_list_nx_add_at (gl_list_t list, size_t position, const void *elt) _GL_ATTRIBUTE_NODISCARD; /* Removes an element from the list. Returns true. */ extern bool gl_list_remove_node (gl_list_t list, gl_list_node_t node); /* Removes an element at a given position from the list. POSITION must be >= 0 and < gl_list_size (list). Returns true. */ extern bool gl_list_remove_at (gl_list_t list, size_t position); /* Removes the element at the first position from the list. Returns true if it was found and removed, or false if the list was empty. */ extern bool gl_list_remove_first (gl_list_t list); /* Removes the element at the last position from the list. Returns true if it was found and removed, or false if the list was empty. */ extern bool gl_list_remove_last (gl_list_t list); /* Searches and removes an element from the list. Returns true if it was found and removed. */ extern bool gl_list_remove (gl_list_t list, const void *elt); /* Frees an entire list. (But this call does not free the elements of the list. It only invokes the DISPOSE_FN on each of the elements of the list, and only if the list is not a sublist.) */ extern void gl_list_free (gl_list_t list); #endif /* End of inline and gl_xlist.h-defined functions. */ /* --------------------- gl_list_iterator_t Data Type --------------------- */ /* Functions for iterating through a list. */ /* Type of an iterator that traverses a list. This is a fixed-size struct, so that creation of an iterator doesn't need memory allocation on the heap. */ typedef struct { /* For fast dispatch of gl_list_iterator_next. */ const struct gl_list_implementation *vtable; /* For detecting whether the last returned element was removed. */ gl_list_t list; size_t count; /* Other, implementation-private fields. */ void *p; void *q; size_t i; size_t j; } gl_list_iterator_t; #if 0 /* These are defined inline below. */ /* Creates an iterator traversing a list. The list contents must not be modified while the iterator is in use, except for replacing or removing the last returned element. */ extern gl_list_iterator_t gl_list_iterator (gl_list_t list); /* Creates an iterator traversing the element with indices i, start_index <= i < end_index, of a list. The list contents must not be modified while the iterator is in use, except for replacing or removing the last returned element. */ extern gl_list_iterator_t gl_list_iterator_from_to (gl_list_t list, size_t start_index, size_t end_index); /* If there is a next element, stores the next element in *ELTP, stores its node in *NODEP if NODEP is non-NULL, advances the iterator and returns true. Otherwise, returns false. */ extern bool gl_list_iterator_next (gl_list_iterator_t *iterator, const void **eltp, gl_list_node_t *nodep); /* Frees an iterator. */ extern void gl_list_iterator_free (gl_list_iterator_t *iterator); #endif /* End of inline functions. */ /* ---------------------- Sorted gl_list_t Data Type ---------------------- */ /* The following functions are for lists without duplicates where the order is given by a sort criterion. */ /* Type of function used to compare two elements. Same as for qsort(). NULL denotes pointer comparison. */ typedef int (*gl_listelement_compar_fn) (const void *elt1, const void *elt2); #if 0 /* Unless otherwise specified, these are defined inline below. */ /* Searches whether an element is already in the list. The list is assumed to be sorted with COMPAR. Returns its node if found, or NULL if not present in the list. If the list contains several copies of ELT, the node of the leftmost one is returned. */ extern gl_list_node_t gl_sortedlist_search (gl_list_t list, gl_listelement_compar_fn compar, const void *elt); /* Searches whether an element is already in the list. The list is assumed to be sorted with COMPAR. Only list elements with indices >= START_INDEX and < END_INDEX are considered; the implementation uses these bounds to minimize the number of COMPAR invocations. Returns its node if found, or NULL if not present in the list. If the list contains several copies of ELT, the node of the leftmost one is returned. */ extern gl_list_node_t gl_sortedlist_search_from_to (gl_list_t list, gl_listelement_compar_fn compar, size_t start_index, size_t end_index, const void *elt); /* Searches whether an element is already in the list. The list is assumed to be sorted with COMPAR. Returns its position if found, or (size_t)(-1) if not present in the list. If the list contains several copies of ELT, the position of the leftmost one is returned. */ extern size_t gl_sortedlist_indexof (gl_list_t list, gl_listelement_compar_fn compar, const void *elt); /* Searches whether an element is already in the list. The list is assumed to be sorted with COMPAR. Only list elements with indices >= START_INDEX and < END_INDEX are considered; the implementation uses these bounds to minimize the number of COMPAR invocations. Returns its position if found, or (size_t)(-1) if not present in the list. If the list contains several copies of ELT, the position of the leftmost one is returned. */ extern size_t gl_sortedlist_indexof_from_to (gl_list_t list, gl_listelement_compar_fn compar, size_t start_index, size_t end_index, const void *elt); /* Adds an element at the appropriate position in the list. The list is assumed to be sorted with COMPAR. Returns its node. */ /* declared in gl_xlist.h */ extern gl_list_node_t gl_sortedlist_add (gl_list_t list, gl_listelement_compar_fn compar, const void *elt); /* Likewise. Returns NULL upon out-of-memory. */ extern gl_list_node_t gl_sortedlist_nx_add (gl_list_t list, gl_listelement_compar_fn compar, const void *elt) _GL_ATTRIBUTE_NODISCARD; /* Searches and removes an element from the list. The list is assumed to be sorted with COMPAR. Returns true if it was found and removed. If the list contains several copies of ELT, only the leftmost one is removed. */ extern bool gl_sortedlist_remove (gl_list_t list, gl_listelement_compar_fn compar, const void *elt); #endif /* End of inline and gl_xlist.h-defined functions. */ /* ------------------------ Implementation Details ------------------------ */ struct gl_list_implementation { /* gl_list_t functions. */ gl_list_t (*nx_create_empty) (gl_list_implementation_t implementation, gl_listelement_equals_fn equals_fn, gl_listelement_hashcode_fn hashcode_fn, gl_listelement_dispose_fn dispose_fn, bool allow_duplicates); gl_list_t (*nx_create) (gl_list_implementation_t implementation, gl_listelement_equals_fn equals_fn, gl_listelement_hashcode_fn hashcode_fn, gl_listelement_dispose_fn dispose_fn, bool allow_duplicates, size_t count, const void **contents); size_t (*size) (gl_list_t list); const void * (*node_value) (gl_list_t list, gl_list_node_t node); int (*node_nx_set_value) (gl_list_t list, gl_list_node_t node, const void *elt); gl_list_node_t (*next_node) (gl_list_t list, gl_list_node_t node); gl_list_node_t (*previous_node) (gl_list_t list, gl_list_node_t node); const void * (*get_at) (gl_list_t list, size_t position); gl_list_node_t (*nx_set_at) (gl_list_t list, size_t position, const void *elt); gl_list_node_t (*search_from_to) (gl_list_t list, size_t start_index, size_t end_index, const void *elt); size_t (*indexof_from_to) (gl_list_t list, size_t start_index, size_t end_index, const void *elt); gl_list_node_t (*nx_add_first) (gl_list_t list, const void *elt); gl_list_node_t (*nx_add_last) (gl_list_t list, const void *elt); gl_list_node_t (*nx_add_before) (gl_list_t list, gl_list_node_t node, const void *elt); gl_list_node_t (*nx_add_after) (gl_list_t list, gl_list_node_t node, const void *elt); gl_list_node_t (*nx_add_at) (gl_list_t list, size_t position, const void *elt); bool (*remove_node) (gl_list_t list, gl_list_node_t node); bool (*remove_at) (gl_list_t list, size_t position); bool (*remove_elt) (gl_list_t list, const void *elt); void (*list_free) (gl_list_t list); /* gl_list_iterator_t functions. */ gl_list_iterator_t (*iterator) (gl_list_t list); gl_list_iterator_t (*iterator_from_to) (gl_list_t list, size_t start_index, size_t end_index); bool (*iterator_next) (gl_list_iterator_t *iterator, const void **eltp, gl_list_node_t *nodep); void (*iterator_free) (gl_list_iterator_t *iterator); /* Sorted gl_list_t functions. */ gl_list_node_t (*sortedlist_search) (gl_list_t list, gl_listelement_compar_fn compar, const void *elt); gl_list_node_t (*sortedlist_search_from_to) (gl_list_t list, gl_listelement_compar_fn compar, size_t start_index, size_t end_index, const void *elt); size_t (*sortedlist_indexof) (gl_list_t list, gl_listelement_compar_fn compar, const void *elt); size_t (*sortedlist_indexof_from_to) (gl_list_t list, gl_listelement_compar_fn compar, size_t start_index, size_t end_index, const void *elt); gl_list_node_t (*sortedlist_nx_add) (gl_list_t list, gl_listelement_compar_fn compar, const void *elt); bool (*sortedlist_remove) (gl_list_t list, gl_listelement_compar_fn compar, const void *elt); }; struct gl_list_impl_base { const struct gl_list_implementation *vtable; gl_listelement_equals_fn equals_fn; gl_listelement_hashcode_fn hashcode_fn; gl_listelement_dispose_fn dispose_fn; bool allow_duplicates; }; /* Define all functions of this file as accesses to the struct gl_list_implementation. */ GL_LIST_INLINE gl_list_t gl_list_nx_create_empty (gl_list_implementation_t implementation, gl_listelement_equals_fn equals_fn, gl_listelement_hashcode_fn hashcode_fn, gl_listelement_dispose_fn dispose_fn, bool allow_duplicates) { return implementation->nx_create_empty (implementation, equals_fn, hashcode_fn, dispose_fn, allow_duplicates); } GL_LIST_INLINE gl_list_t gl_list_nx_create (gl_list_implementation_t implementation, gl_listelement_equals_fn equals_fn, gl_listelement_hashcode_fn hashcode_fn, gl_listelement_dispose_fn dispose_fn, bool allow_duplicates, size_t count, const void **contents) { return implementation->nx_create (implementation, equals_fn, hashcode_fn, dispose_fn, allow_duplicates, count, contents); } GL_LIST_INLINE size_t gl_list_size (gl_list_t list) { return ((const struct gl_list_impl_base *) list)->vtable ->size (list); } GL_LIST_INLINE const void * gl_list_node_value (gl_list_t list, gl_list_node_t node) { return ((const struct gl_list_impl_base *) list)->vtable ->node_value (list, node); } GL_LIST_INLINE _GL_ATTRIBUTE_NODISCARD int gl_list_node_nx_set_value (gl_list_t list, gl_list_node_t node, const void *elt) { return ((const struct gl_list_impl_base *) list)->vtable ->node_nx_set_value (list, node, elt); } GL_LIST_INLINE gl_list_node_t gl_list_next_node (gl_list_t list, gl_list_node_t node) { return ((const struct gl_list_impl_base *) list)->vtable ->next_node (list, node); } GL_LIST_INLINE gl_list_node_t gl_list_previous_node (gl_list_t list, gl_list_node_t node) { return ((const struct gl_list_impl_base *) list)->vtable ->previous_node (list, node); } GL_LIST_INLINE const void * gl_list_get_at (gl_list_t list, size_t position) { return ((const struct gl_list_impl_base *) list)->vtable ->get_at (list, position); } GL_LIST_INLINE const void * gl_list_get_first (gl_list_t list) { return gl_list_get_at (list, 0); } GL_LIST_INLINE const void * gl_list_get_last (gl_list_t list) { return gl_list_get_at (list, gl_list_size (list) - 1); } GL_LIST_INLINE _GL_ATTRIBUTE_NODISCARD gl_list_node_t gl_list_nx_set_at (gl_list_t list, size_t position, const void *elt) { return ((const struct gl_list_impl_base *) list)->vtable ->nx_set_at (list, position, elt); } GL_LIST_INLINE _GL_ATTRIBUTE_NODISCARD gl_list_node_t gl_list_nx_set_first (gl_list_t list, const void *elt) { return gl_list_nx_set_at (list, 0, elt); } GL_LIST_INLINE _GL_ATTRIBUTE_NODISCARD gl_list_node_t gl_list_nx_set_last (gl_list_t list, const void *elt) { return gl_list_nx_set_at (list, gl_list_size (list) - 1, elt); } GL_LIST_INLINE gl_list_node_t gl_list_search (gl_list_t list, const void *elt) { size_t size = ((const struct gl_list_impl_base *) list)->vtable->size (list); return ((const struct gl_list_impl_base *) list)->vtable ->search_from_to (list, 0, size, elt); } GL_LIST_INLINE gl_list_node_t gl_list_search_from (gl_list_t list, size_t start_index, const void *elt) { size_t size = ((const struct gl_list_impl_base *) list)->vtable->size (list); return ((const struct gl_list_impl_base *) list)->vtable ->search_from_to (list, start_index, size, elt); } GL_LIST_INLINE gl_list_node_t gl_list_search_from_to (gl_list_t list, size_t start_index, size_t end_index, const void *elt) { return ((const struct gl_list_impl_base *) list)->vtable ->search_from_to (list, start_index, end_index, elt); } GL_LIST_INLINE size_t gl_list_indexof (gl_list_t list, const void *elt) { size_t size = ((const struct gl_list_impl_base *) list)->vtable->size (list); return ((const struct gl_list_impl_base *) list)->vtable ->indexof_from_to (list, 0, size, elt); } GL_LIST_INLINE size_t gl_list_indexof_from (gl_list_t list, size_t start_index, const void *elt) { size_t size = ((const struct gl_list_impl_base *) list)->vtable->size (list); return ((const struct gl_list_impl_base *) list)->vtable ->indexof_from_to (list, start_index, size, elt); } GL_LIST_INLINE size_t gl_list_indexof_from_to (gl_list_t list, size_t start_index, size_t end_index, const void *elt) { return ((const struct gl_list_impl_base *) list)->vtable ->indexof_from_to (list, start_index, end_index, elt); } GL_LIST_INLINE _GL_ATTRIBUTE_NODISCARD gl_list_node_t gl_list_nx_add_first (gl_list_t list, const void *elt) { return ((const struct gl_list_impl_base *) list)->vtable ->nx_add_first (list, elt); } GL_LIST_INLINE _GL_ATTRIBUTE_NODISCARD gl_list_node_t gl_list_nx_add_last (gl_list_t list, const void *elt) { return ((const struct gl_list_impl_base *) list)->vtable ->nx_add_last (list, elt); } GL_LIST_INLINE _GL_ATTRIBUTE_NODISCARD gl_list_node_t gl_list_nx_add_before (gl_list_t list, gl_list_node_t node, const void *elt) { return ((const struct gl_list_impl_base *) list)->vtable ->nx_add_before (list, node, elt); } GL_LIST_INLINE _GL_ATTRIBUTE_NODISCARD gl_list_node_t gl_list_nx_add_after (gl_list_t list, gl_list_node_t node, const void *elt) { return ((const struct gl_list_impl_base *) list)->vtable ->nx_add_after (list, node, elt); } GL_LIST_INLINE _GL_ATTRIBUTE_NODISCARD gl_list_node_t gl_list_nx_add_at (gl_list_t list, size_t position, const void *elt) { return ((const struct gl_list_impl_base *) list)->vtable ->nx_add_at (list, position, elt); } GL_LIST_INLINE bool gl_list_remove_node (gl_list_t list, gl_list_node_t node) { return ((const struct gl_list_impl_base *) list)->vtable ->remove_node (list, node); } GL_LIST_INLINE bool gl_list_remove_at (gl_list_t list, size_t position) { return ((const struct gl_list_impl_base *) list)->vtable ->remove_at (list, position); } GL_LIST_INLINE bool gl_list_remove_first (gl_list_t list) { size_t size = gl_list_size (list); if (size > 0) return gl_list_remove_at (list, 0); else return false; } GL_LIST_INLINE bool gl_list_remove_last (gl_list_t list) { size_t size = gl_list_size (list); if (size > 0) return gl_list_remove_at (list, size - 1); else return false; } GL_LIST_INLINE bool gl_list_remove (gl_list_t list, const void *elt) { return ((const struct gl_list_impl_base *) list)->vtable ->remove_elt (list, elt); } GL_LIST_INLINE void gl_list_free (gl_list_t list) { ((const struct gl_list_impl_base *) list)->vtable->list_free (list); } GL_LIST_INLINE gl_list_iterator_t gl_list_iterator (gl_list_t list) { return ((const struct gl_list_impl_base *) list)->vtable ->iterator (list); } GL_LIST_INLINE gl_list_iterator_t gl_list_iterator_from_to (gl_list_t list, size_t start_index, size_t end_index) { return ((const struct gl_list_impl_base *) list)->vtable ->iterator_from_to (list, start_index, end_index); } GL_LIST_INLINE bool gl_list_iterator_next (gl_list_iterator_t *iterator, const void **eltp, gl_list_node_t *nodep) { return iterator->vtable->iterator_next (iterator, eltp, nodep); } GL_LIST_INLINE void gl_list_iterator_free (gl_list_iterator_t *iterator) { iterator->vtable->iterator_free (iterator); } GL_LIST_INLINE gl_list_node_t gl_sortedlist_search (gl_list_t list, gl_listelement_compar_fn compar, const void *elt) { return ((const struct gl_list_impl_base *) list)->vtable ->sortedlist_search (list, compar, elt); } GL_LIST_INLINE gl_list_node_t gl_sortedlist_search_from_to (gl_list_t list, gl_listelement_compar_fn compar, size_t start_index, size_t end_index, const void *elt) { return ((const struct gl_list_impl_base *) list)->vtable ->sortedlist_search_from_to (list, compar, start_index, end_index, elt); } GL_LIST_INLINE size_t gl_sortedlist_indexof (gl_list_t list, gl_listelement_compar_fn compar, const void *elt) { return ((const struct gl_list_impl_base *) list)->vtable ->sortedlist_indexof (list, compar, elt); } GL_LIST_INLINE size_t gl_sortedlist_indexof_from_to (gl_list_t list, gl_listelement_compar_fn compar, size_t start_index, size_t end_index, const void *elt) { return ((const struct gl_list_impl_base *) list)->vtable ->sortedlist_indexof_from_to (list, compar, start_index, end_index, elt); } GL_LIST_INLINE _GL_ATTRIBUTE_NODISCARD gl_list_node_t gl_sortedlist_nx_add (gl_list_t list, gl_listelement_compar_fn compar, const void *elt) { return ((const struct gl_list_impl_base *) list)->vtable ->sortedlist_nx_add (list, compar, elt); } GL_LIST_INLINE bool gl_sortedlist_remove (gl_list_t list, gl_listelement_compar_fn compar, const void *elt) { return ((const struct gl_list_impl_base *) list)->vtable ->sortedlist_remove (list, compar, elt); } #ifdef __cplusplus } #endif _GL_INLINE_HEADER_END #endif /* _GL_LIST_H */ pspp-1.4.1/gl/relocwrapper.c0000644000175000017500000001443513723215640015400 0ustar00blpblp00000000000000/* Relocating wrapper program. Copyright (C) 2003, 2005-2007, 2009-2020 Free Software Foundation, Inc. Written by Bruno Haible , 2003. 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 3 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, see . */ /* Dependencies: relocwrapper -> progname -> progreloc -> stat -> filename -> pathmax -> verify -> areadlink -> careadlinkat -> allocator -> readlink -> stat -> canonicalize-lgpl -> filename -> malloca -> lstat -> readlink -> relocatable -> setenv -> malloca -> fprintf-posix [ignore, cut dependency tree here] -> strerror [ignore, cut dependency tree here] -> c-ctype Macros that need to be set while compiling this file: - ENABLE_RELOCATABLE 1 - INSTALLPREFIX the base installation directory - INSTALLDIR the directory into which this program is installed - LIBPATHVAR the platform dependent runtime library path variable - LIBDIRS a comma-terminated list of strings representing the list of directories that contain the libraries at installation time We don't want to internationalize this wrapper because then it would depend on libintl and therefore need relocation itself. So use only libc functions, no gettext(), no error(), no xmalloc(), no xsetenv(). */ #define _GL_USE_STDLIB_ALLOC 1 #include #include #include #include #include #include #include "progname.h" #include "relocatable.h" #include "c-ctype.h" #include "verify.h" /* Use the system functions, not the gnulib overrides in this file. */ #undef fprintf #undef strerror /* Return a copy of the filename, with an extra ".bin" at the end. More generally, it replaces "${EXEEXT}" at the end with ".bin${EXEEXT}". */ static char * add_dotbin (const char *filename) { size_t filename_len = strlen (filename); char *result = (char *) malloc (filename_len + 4 + 1); if (result != NULL) { if (sizeof (EXEEXT) > sizeof ("")) { /* EXEEXT handling. */ const size_t exeext_len = sizeof (EXEEXT) - sizeof (""); static const char exeext[] = EXEEXT; if (filename_len > exeext_len) { /* Compare using an inlined copy of c_strncasecmp(), because the filenames may have undergone a case conversion since they were packaged. In other words, EXEEXT may be ".exe" on one system and ".EXE" on another. */ const char *s1 = filename + filename_len - exeext_len; const char *s2 = exeext; for (; *s1 != '\0'; s1++, s2++) { unsigned char c1 = *s1; unsigned char c2 = *s2; if (c_tolower (c1) != c_tolower (c2)) goto simple_append; } /* Insert ".bin" before EXEEXT or its equivalent. */ memcpy (result, filename, filename_len - exeext_len); memcpy (result + filename_len - exeext_len, ".bin", 4); memcpy (result + filename_len - exeext_len + 4, filename + filename_len - exeext_len, exeext_len + 1); return result; } } simple_append: /* Simply append ".bin". */ memcpy (result, filename, filename_len); memcpy (result + filename_len, ".bin", 4 + 1); return result; } else { fprintf (stderr, "%s: %s\n", program_name, "memory exhausted"); exit (1); } } /* List of directories that contain the libraries. */ static const char *libdirs[] = { LIBDIRS NULL }; /* Verify that at least one directory is given. */ verify (sizeof (libdirs) / sizeof (libdirs[0]) > 1); /* Relocate the list of directories that contain the libraries. */ static void relocate_libdirs () { size_t i; for (i = 0; i < sizeof (libdirs) / sizeof (libdirs[0]) - 1; i++) libdirs[i] = relocate (libdirs[i]); } /* Activate the list of directories in the LIBPATHVAR. */ static void activate_libdirs () { const char *old_value; size_t total; size_t i; char *value; char *p; old_value = getenv (LIBPATHVAR); if (old_value == NULL) old_value = ""; total = 0; for (i = 0; i < sizeof (libdirs) / sizeof (libdirs[0]) - 1; i++) total += strlen (libdirs[i]) + 1; total += strlen (old_value) + 1; value = (char *) malloc (total); if (value == NULL) { fprintf (stderr, "%s: %s\n", program_name, "memory exhausted"); exit (1); } p = value; for (i = 0; i < sizeof (libdirs) / sizeof (libdirs[0]) - 1; i++) { size_t len = strlen (libdirs[i]); memcpy (p, libdirs[i], len); p += len; *p++ = ':'; } if (old_value[0] != '\0') strcpy (p, old_value); else p[-1] = '\0'; if (setenv (LIBPATHVAR, value, 1) < 0) { fprintf (stderr, "%s: %s\n", program_name, "memory exhausted"); exit (1); } } int main (int argc, char *argv[]) { char *full_program_name; /* Set the program name and perform preparations for get_full_program_name() and relocate(). */ set_program_name_and_installdir (argv[0], INSTALLPREFIX, INSTALLDIR); /* Get the full program path. (Important if accessed through a symlink.) */ full_program_name = get_full_program_name (); if (full_program_name == NULL) full_program_name = argv[0]; /* Invoke the real program, with suffix ".bin". */ argv[0] = add_dotbin (full_program_name); relocate_libdirs (); activate_libdirs (); execv (argv[0], argv); fprintf (stderr, "%s: could not execute %s: %s\n", program_name, argv[0], strerror (errno)); exit (127); } pspp-1.4.1/gl/mbtowc-impl.h0000644000175000017500000000262713723215637015140 0ustar00blpblp00000000000000/* Convert multibyte character to wide character. Copyright (C) 2011-2020 Free Software Foundation, Inc. Written by Bruno Haible , 2011. 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 3 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, see . */ /* We don't need a static internal state, because the encoding is not state dependent, and when mbrtowc returns (size_t)(-2). we throw the result away. */ int mbtowc (wchar_t *pwc, const char *s, size_t n) { if (s == NULL) return 0; else { mbstate_t state; wchar_t wc; size_t result; memset (&state, 0, sizeof (mbstate_t)); result = mbrtowc (&wc, s, n, &state); if (result == (size_t)-1 || result == (size_t)-2) { errno = EILSEQ; return -1; } if (pwc != NULL) *pwc = wc; return (wc == 0 ? 0 : result); } } pspp-1.4.1/gl/memchr.valgrind0000644000175000017500000000214213723215637015530 0ustar00blpblp00000000000000# Suppress a valgrind message about use of uninitialized memory in memchr(). # Copyright (C) 2009-2020 Free Software Foundation, Inc. # # 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 3 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, see . # POSIX states that when the character is found, memchr must not read extra # bytes in an overestimated length (for example, where memchr is used to # implement strnlen). However, we use a safe word read to provide a speedup. { memchr-value4 Memcheck:Value4 fun:rpl_memchr } { memchr-value8 Memcheck:Value8 fun:rpl_memchr } pspp-1.4.1/gl/count-leading-zeros.h0000644000175000017500000001104013723215636016563 0ustar00blpblp00000000000000/* count-leading-zeros.h -- counts the number of leading 0 bits in a word. Copyright (C) 2012-2020 Free Software Foundation, Inc. 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 3 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, see . */ /* Written by Eric Blake. */ #ifndef COUNT_LEADING_ZEROS_H #define COUNT_LEADING_ZEROS_H 1 #include #include #ifndef _GL_INLINE_HEADER_BEGIN #error "Please include config.h first." #endif _GL_INLINE_HEADER_BEGIN #ifndef COUNT_LEADING_ZEROS_INLINE # define COUNT_LEADING_ZEROS_INLINE _GL_INLINE #endif #ifdef __cplusplus extern "C" { #endif /* Assuming the GCC builtin is BUILTIN and the MSC builtin is MSC_BUILTIN, expand to code that computes the number of leading zeros of the local variable 'x' of type TYPE (an unsigned integer type) and return it from the current function. */ #if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4) \ || (__clang_major__ >= 4) # define COUNT_LEADING_ZEROS(BUILTIN, MSC_BUILTIN, TYPE) \ return x ? BUILTIN (x) : CHAR_BIT * sizeof x; #elif _MSC_VER # pragma intrinsic _BitScanReverse # pragma intrinsic _BitScanReverse64 # define COUNT_LEADING_ZEROS(BUILTIN, MSC_BUILTIN, TYPE) \ do \ { \ unsigned long result; \ return MSC_BUILTIN (&result, x) ? result : CHAR_BIT * sizeof x; \ } \ while (0) #else # define COUNT_LEADING_ZEROS(BUILTIN, MSC_BUILTIN, TYPE) \ do \ { \ int count; \ unsigned int leading_32; \ if (! x) \ return CHAR_BIT * sizeof x; \ for (count = 0; \ (leading_32 = ((x >> (sizeof (TYPE) * CHAR_BIT - 32)) \ & 0xffffffffU), \ count < CHAR_BIT * sizeof x - 32 && !leading_32); \ count += 32) \ x = x << 31 << 1; \ return count + count_leading_zeros_32 (leading_32); \ } \ while (0) /* Compute and return the number of leading zeros in X, where 0 < X < 2**32. */ COUNT_LEADING_ZEROS_INLINE int count_leading_zeros_32 (unsigned int x) { /* */ static const char de_Bruijn_lookup[32] = { 31, 22, 30, 21, 18, 10, 29, 2, 20, 17, 15, 13, 9, 6, 28, 1, 23, 19, 11, 3, 16, 14, 7, 24, 12, 4, 8, 25, 5, 26, 27, 0 }; x |= x >> 1; x |= x >> 2; x |= x >> 4; x |= x >> 8; x |= x >> 16; return de_Bruijn_lookup[((x * 0x07c4acddU) & 0xffffffffU) >> 27]; } #endif /* Compute and return the number of leading zeros in X. */ COUNT_LEADING_ZEROS_INLINE int count_leading_zeros (unsigned int x) { COUNT_LEADING_ZEROS (__builtin_clz, _BitScanReverse, unsigned int); } /* Compute and return the number of leading zeros in X. */ COUNT_LEADING_ZEROS_INLINE int count_leading_zeros_l (unsigned long int x) { COUNT_LEADING_ZEROS (__builtin_clzl, _BitScanReverse, unsigned long int); } /* Compute and return the number of leading zeros in X. */ COUNT_LEADING_ZEROS_INLINE int count_leading_zeros_ll (unsigned long long int x) { COUNT_LEADING_ZEROS (__builtin_clzll, _BitScanReverse64, unsigned long long int); } #ifdef __cplusplus } #endif _GL_INLINE_HEADER_END #endif /* COUNT_LEADING_ZEROS_H */ pspp-1.4.1/gl/lc-charset-dispatch.c0000644000175000017500000000515213723215637016517 0ustar00blpblp00000000000000/* Dispatching based on the current locale's character encoding. Copyright (C) 2018-2020 Free Software Foundation, Inc. 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 3 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, see . */ /* Written by Bruno Haible , 2018. */ #include /* Specification. */ #include "lc-charset-dispatch.h" #if GNULIB_defined_mbstate_t # include "localcharset.h" # include "streq.h" # if GNULIB_WCHAR_SINGLE /* When we know that the locale does not change, provide a speedup by caching the value of locale_encoding_classification. */ # define locale_encoding_classification_cached locale_encoding_classification # else /* By default, don't make assumptions, hence no caching. */ # define locale_encoding_classification_uncached locale_encoding_classification # endif # if GNULIB_WCHAR_SINGLE static inline # endif enc_t locale_encoding_classification_uncached (void) { const char *encoding = locale_charset (); if (STREQ_OPT (encoding, "UTF-8", 'U', 'T', 'F', '-', '8', 0, 0, 0, 0)) return enc_utf8; if (STREQ_OPT (encoding, "EUC-JP", 'E', 'U', 'C', '-', 'J', 'P', 0, 0, 0)) return enc_eucjp; if (STREQ_OPT (encoding, "EUC-KR", 'E', 'U', 'C', '-', 'K', 'R', 0, 0, 0) || STREQ_OPT (encoding, "GB2312", 'G', 'B', '2', '3', '1', '2', 0, 0, 0) || STREQ_OPT (encoding, "BIG5", 'B', 'I', 'G', '5', 0, 0, 0, 0, 0)) return enc_94; if (STREQ_OPT (encoding, "EUC-TW", 'E', 'U', 'C', '-', 'T', 'W', 0, 0, 0)) return enc_euctw; if (STREQ_OPT (encoding, "GB18030", 'G', 'B', '1', '8', '0', '3', '0', 0, 0)) return enc_gb18030; if (STREQ_OPT (encoding, "SJIS", 'S', 'J', 'I', 'S', 0, 0, 0, 0, 0)) return enc_sjis; return enc_other; } # if GNULIB_WCHAR_SINGLE static int cached_locale_enc = -1; enc_t locale_encoding_classification_cached (void) { if (cached_locale_enc < 0) cached_locale_enc = locale_encoding_classification_uncached (); return cached_locale_enc; } # endif #else /* This declaration is solely to ensure that after preprocessing this file is never empty. */ typedef int dummy; #endif pspp-1.4.1/gl/c-asprintf.c0000644000175000017500000000203413723215636014736 0ustar00blpblp00000000000000/* Formatted output to strings in C locale. Copyright (C) 1999, 2002, 2006-2007, 2009-2020 Free Software Foundation, Inc. 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 3, 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, see . */ #include /* Specification. */ #include "c-vasprintf.h" #include int c_asprintf (char **resultp, const char *format, ...) { va_list args; int result; va_start (args, format); result = c_vasprintf (resultp, format, args); va_end (args); return result; } pspp-1.4.1/gl/xmemdup0.c0000644000175000017500000000322213723215640014422 0ustar00blpblp00000000000000/* xmemdup0.c -- copy a block of arbitrary bytes, plus a trailing NUL Copyright (C) 2008-2020 Free Software Foundation, Inc. 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 3 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, see . */ #include #include "xmemdup0.h" #include "xalloc.h" #include /* Clone an arbitrary block of bytes P of size S, with error checking, and include a terminating NUL byte. P is of type 'void const *', to make it easier to use this with other mem* functions that return 'void *', but since appending a NUL byte only makes sense on bytes, the return type is 'char *'. The terminating NUL makes it safe to use strlen or rawmemchr to check for embedded NUL; it also speeds up algorithms such as escape sequence processing on arbitrary memory, by making it always safe to read the byte after the escape character rather than having to check if each escape character is the last byte in the object. */ char * xmemdup0 (void const *p, size_t s) { char *result = xcharalloc (s + 1); if (s > 0) memcpy (result, p, s); result[s] = 0; return result; } pspp-1.4.1/gl/fwriteerror.c0000644000175000017500000001216513723215637015251 0ustar00blpblp00000000000000/* Detect write error on a stream. Copyright (C) 2003-2006, 2008-2020 Free Software Foundation, Inc. Written by Bruno Haible , 2003. 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 3 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, see . */ #include /* Specification. */ #include "fwriteerror.h" #include #include static int do_fwriteerror (FILE *fp, bool ignore_ebadf) { /* State to allow multiple calls to fwriteerror (stdout). */ static bool stdout_closed = false; if (fp == stdout) { if (stdout_closed) return 0; /* If we are closing stdout, don't attempt to do it later again. */ stdout_closed = true; } /* This function returns an error indication if there was a previous failure or if fclose failed, with two exceptions: - Ignore an fclose failure if there was no previous error, no data remains to be flushed, and fclose failed with EBADF. That can happen when a program like cp is invoked like this 'cp a b >&-' (i.e., with standard output closed) and doesn't generate any output (hence no previous error and nothing to be flushed). - Ignore an fclose failure due to EPIPE. That can happen when a program blocks or ignores SIGPIPE, and the output pipe or socket has no readers now. The EPIPE tells us that we should stop writing to this output. That's what we are doing anyway here. Need to 1. test the error indicator of the stream, 2. flush the buffers both in userland and in the kernel, through fclose, testing for error again. */ /* Clear errno, so that on non-POSIX systems the caller doesn't see a wrong value of errno when we return -1. */ errno = 0; if (ferror (fp)) { if (fflush (fp)) goto close_preserving_errno; /* errno is set here */ /* The stream had an error earlier, but its errno was lost. If the error was not temporary, we can get the same errno by writing and flushing one more byte. We can do so because at this point the stream's contents is garbage anyway. */ if (fputc ('\0', fp) == EOF) goto close_preserving_errno; /* errno is set here */ if (fflush (fp)) goto close_preserving_errno; /* errno is set here */ /* Give up on errno. */ errno = 0; goto close_preserving_errno; } if (ignore_ebadf) { /* We need an explicit fflush to tell whether some output was already done on FP. */ if (fflush (fp)) goto close_preserving_errno; /* errno is set here */ if (fclose (fp) && errno != EBADF) goto got_errno; /* errno is set here */ } else { if (fclose (fp)) goto got_errno; /* errno is set here */ } return 0; close_preserving_errno: /* There's an error. Nevertheless call fclose(fp), for consistency with the other cases. */ { int saved_errno = errno; fclose (fp); errno = saved_errno; } got_errno: /* There's an error. Ignore EPIPE. */ if (errno == EPIPE) return 0; else return -1; } int fwriteerror (FILE *fp) { return do_fwriteerror (fp, false); } int fwriteerror_no_ebadf (FILE *fp) { return do_fwriteerror (fp, true); } #if TEST /* Name of a file on which writing fails. On systems without /dev/full, you can choose a filename on a full file system. */ #define UNWRITABLE_FILE "/dev/full" int main () { static int sizes[] = { 511, 512, 513, 1023, 1024, 1025, 2047, 2048, 2049, 4095, 4096, 4097, 8191, 8192, 8193 }; static char dummy[8193]; unsigned int i, j; for (i = 0; i < sizeof (sizes) / sizeof (sizes[0]); i++) { size_t size = sizes[i]; for (j = 0; j < 2; j++) { /* Run a test depending on i and j: Write size bytes and then calls fflush if j==1. */ FILE *stream = fopen (UNWRITABLE_FILE, "w"); if (stream == NULL) { fprintf (stderr, "Test %u:%u: could not open file\n", i, j); continue; } fwrite (dummy, 347, 1, stream); fwrite (dummy, size - 347, 1, stream); if (j) fflush (stream); if (fwriteerror (stream) == -1) { if (errno != ENOSPC) fprintf (stderr, "Test %u:%u: fwriteerror ok, errno = %d\n", i, j, errno); } else fprintf (stderr, "Test %u:%u: fwriteerror found no error!\n", i, j); } } return 0; } #endif pspp-1.4.1/gl/cdefs.h0000644000175000017500000004364513723215636013776 0ustar00blpblp00000000000000/* Copyright (C) 1992-2020 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library 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 3 of the License, or (at your option) any later version. The GNU C Library 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 the GNU C Library; if not, see . */ #ifndef _SYS_CDEFS_H #define _SYS_CDEFS_H 1 /* We are almost always included from features.h. */ #ifndef _FEATURES_H # include #endif /* The GNU libc does not support any K&R compilers or the traditional mode of ISO C compilers anymore. Check for some of the combinations not anymore supported. */ #if defined __GNUC__ && !defined __STDC__ # error "You need a ISO C conforming compiler to use the glibc headers" #endif /* Some user header file might have defined this before. */ #undef __P #undef __PMT #ifdef __GNUC__ /* All functions, except those with callbacks or those that synchronize memory, are leaf functions. */ # if __GNUC_PREREQ (4, 6) && !defined _LIBC # define __LEAF , __leaf__ # define __LEAF_ATTR __attribute__ ((__leaf__)) # else # define __LEAF # define __LEAF_ATTR # endif /* GCC can always grok prototypes. For C++ programs we add throw() to help it optimize the function calls. But this works only with gcc 2.8.x and egcs. For gcc 3.2 and up we even mark C functions as non-throwing using a function attribute since programs can use the -fexceptions options for C code as well. */ # if !defined __cplusplus && __GNUC_PREREQ (3, 3) # define __THROW __attribute__ ((__nothrow__ __LEAF)) # define __THROWNL __attribute__ ((__nothrow__)) # define __NTH(fct) __attribute__ ((__nothrow__ __LEAF)) fct # define __NTHNL(fct) __attribute__ ((__nothrow__)) fct # else # if defined __cplusplus && __GNUC_PREREQ (2,8) # define __THROW throw () # define __THROWNL throw () # define __NTH(fct) __LEAF_ATTR fct throw () # define __NTHNL(fct) fct throw () # else # define __THROW # define __THROWNL # define __NTH(fct) fct # define __NTHNL(fct) fct # endif # endif #else /* Not GCC. */ # if (defined __cplusplus \ || (defined __STDC_VERSION__ && __STDC_VERSION__ >= 199901L)) # define __inline inline # else # define __inline /* No inline functions. */ # endif # define __THROW # define __THROWNL # define __NTH(fct) fct #endif /* GCC. */ /* Compilers that are not clang may object to #if defined __clang__ && __has_extension(...) even though they do not need to evaluate the right-hand side of the &&. */ #if defined __clang__ && defined __has_extension # define __glibc_clang_has_extension(ext) __has_extension (ext) #else # define __glibc_clang_has_extension(ext) 0 #endif /* These two macros are not used in glibc anymore. They are kept here only because some other projects expect the macros to be defined. */ #define __P(args) args #define __PMT(args) args /* For these things, GCC behaves the ANSI way normally, and the non-ANSI way under -traditional. */ #define __CONCAT(x,y) x ## y #define __STRING(x) #x /* This is not a typedef so `const __ptr_t' does the right thing. */ #define __ptr_t void * /* C++ needs to know that types and declarations are C, not C++. */ #ifdef __cplusplus # define __BEGIN_DECLS extern "C" { # define __END_DECLS } #else # define __BEGIN_DECLS # define __END_DECLS #endif /* Fortify support. */ #define __bos(ptr) __builtin_object_size (ptr, __USE_FORTIFY_LEVEL > 1) #define __bos0(ptr) __builtin_object_size (ptr, 0) #if __GNUC_PREREQ (4,3) # define __warndecl(name, msg) \ extern void name (void) __attribute__((__warning__ (msg))) # define __warnattr(msg) __attribute__((__warning__ (msg))) # define __errordecl(name, msg) \ extern void name (void) __attribute__((__error__ (msg))) #else # define __warndecl(name, msg) extern void name (void) # define __warnattr(msg) # define __errordecl(name, msg) extern void name (void) #endif /* Support for flexible arrays. Headers that should use flexible arrays only if they're "real" (e.g. only if they won't affect sizeof()) should test #if __glibc_c99_flexarr_available. */ #if defined __STDC_VERSION__ && __STDC_VERSION__ >= 199901L && !defined __HP_cc # define __flexarr [] # define __glibc_c99_flexarr_available 1 #elif __GNUC_PREREQ (2,97) /* GCC 2.97 supports C99 flexible array members as an extension, even when in C89 mode or compiling C++ (any version). */ # define __flexarr [] # define __glibc_c99_flexarr_available 1 #elif defined __GNUC__ /* Pre-2.97 GCC did not support C99 flexible arrays but did have an equivalent extension with slightly different notation. */ # define __flexarr [0] # define __glibc_c99_flexarr_available 1 #else /* Some other non-C99 compiler. Approximate with [1]. */ # define __flexarr [1] # define __glibc_c99_flexarr_available 0 #endif /* __asm__ ("xyz") is used throughout the headers to rename functions at the assembly language level. This is wrapped by the __REDIRECT macro, in order to support compilers that can do this some other way. When compilers don't support asm-names at all, we have to do preprocessor tricks instead (which don't have exactly the right semantics, but it's the best we can do). Example: int __REDIRECT(setpgrp, (__pid_t pid, __pid_t pgrp), setpgid); */ #if defined __GNUC__ && __GNUC__ >= 2 # define __REDIRECT(name, proto, alias) name proto __asm__ (__ASMNAME (#alias)) # ifdef __cplusplus # define __REDIRECT_NTH(name, proto, alias) \ name proto __THROW __asm__ (__ASMNAME (#alias)) # define __REDIRECT_NTHNL(name, proto, alias) \ name proto __THROWNL __asm__ (__ASMNAME (#alias)) # else # define __REDIRECT_NTH(name, proto, alias) \ name proto __asm__ (__ASMNAME (#alias)) __THROW # define __REDIRECT_NTHNL(name, proto, alias) \ name proto __asm__ (__ASMNAME (#alias)) __THROWNL # endif # define __ASMNAME(cname) __ASMNAME2 (__USER_LABEL_PREFIX__, cname) # define __ASMNAME2(prefix, cname) __STRING (prefix) cname /* #elif __SOME_OTHER_COMPILER__ # define __REDIRECT(name, proto, alias) name proto; \ _Pragma("let " #name " = " #alias) */ #endif /* GCC has various useful declarations that can be made with the `__attribute__' syntax. All of the ways we use this do fine if they are omitted for compilers that don't understand it. */ #if !defined __GNUC__ || __GNUC__ < 2 # define __attribute__(xyz) /* Ignore */ #endif /* At some point during the gcc 2.96 development the `malloc' attribute for functions was introduced. We don't want to use it unconditionally (although this would be possible) since it generates warnings. */ #if __GNUC_PREREQ (2,96) # define __attribute_malloc__ __attribute__ ((__malloc__)) #else # define __attribute_malloc__ /* Ignore */ #endif /* Tell the compiler which arguments to an allocation function indicate the size of the allocation. */ #if __GNUC_PREREQ (4, 3) # define __attribute_alloc_size__(params) \ __attribute__ ((__alloc_size__ params)) #else # define __attribute_alloc_size__(params) /* Ignore. */ #endif /* At some point during the gcc 2.96 development the `pure' attribute for functions was introduced. We don't want to use it unconditionally (although this would be possible) since it generates warnings. */ #if __GNUC_PREREQ (2,96) # define __attribute_pure__ __attribute__ ((__pure__)) #else # define __attribute_pure__ /* Ignore */ #endif /* This declaration tells the compiler that the value is constant. */ #if __GNUC_PREREQ (2,5) # define __attribute_const__ __attribute__ ((__const__)) #else # define __attribute_const__ /* Ignore */ #endif /* At some point during the gcc 3.1 development the `used' attribute for functions was introduced. We don't want to use it unconditionally (although this would be possible) since it generates warnings. */ #if __GNUC_PREREQ (3,1) # define __attribute_used__ __attribute__ ((__used__)) # define __attribute_noinline__ __attribute__ ((__noinline__)) #else # define __attribute_used__ __attribute__ ((__unused__)) # define __attribute_noinline__ /* Ignore */ #endif /* Since version 3.2, gcc allows marking deprecated functions. */ #if __GNUC_PREREQ (3,2) # define __attribute_deprecated__ __attribute__ ((__deprecated__)) #else # define __attribute_deprecated__ /* Ignore */ #endif /* Since version 4.5, gcc also allows one to specify the message printed when a deprecated function is used. clang claims to be gcc 4.2, but may also support this feature. */ #if __GNUC_PREREQ (4,5) || \ __glibc_clang_has_extension (__attribute_deprecated_with_message__) # define __attribute_deprecated_msg__(msg) \ __attribute__ ((__deprecated__ (msg))) #else # define __attribute_deprecated_msg__(msg) __attribute_deprecated__ #endif /* At some point during the gcc 2.8 development the `format_arg' attribute for functions was introduced. We don't want to use it unconditionally (although this would be possible) since it generates warnings. If several `format_arg' attributes are given for the same function, in gcc-3.0 and older, all but the last one are ignored. In newer gccs, all designated arguments are considered. */ #if __GNUC_PREREQ (2,8) # define __attribute_format_arg__(x) __attribute__ ((__format_arg__ (x))) #else # define __attribute_format_arg__(x) /* Ignore */ #endif /* At some point during the gcc 2.97 development the `strfmon' format attribute for functions was introduced. We don't want to use it unconditionally (although this would be possible) since it generates warnings. */ #if __GNUC_PREREQ (2,97) # define __attribute_format_strfmon__(a,b) \ __attribute__ ((__format__ (__strfmon__, a, b))) #else # define __attribute_format_strfmon__(a,b) /* Ignore */ #endif /* The nonnull function attribute marks pointer parameters that must not be NULL. Do not define __nonnull if it is already defined, for portability when this file is used in Gnulib. */ #ifndef __nonnull # if __GNUC_PREREQ (3,3) # define __nonnull(params) __attribute__ ((__nonnull__ params)) # else # define __nonnull(params) # endif #endif /* If fortification mode, we warn about unused results of certain function calls which can lead to problems. */ #if __GNUC_PREREQ (3,4) # define __attribute_warn_unused_result__ \ __attribute__ ((__warn_unused_result__)) # if defined __USE_FORTIFY_LEVEL && __USE_FORTIFY_LEVEL > 0 # define __wur __attribute_warn_unused_result__ # endif #else # define __attribute_warn_unused_result__ /* empty */ #endif #ifndef __wur # define __wur /* Ignore */ #endif /* Forces a function to be always inlined. */ #if __GNUC_PREREQ (3,2) /* The Linux kernel defines __always_inline in stddef.h (283d7573), and it conflicts with this definition. Therefore undefine it first to allow either header to be included first. */ # undef __always_inline # define __always_inline __inline __attribute__ ((__always_inline__)) #else # undef __always_inline # define __always_inline __inline #endif /* Associate error messages with the source location of the call site rather than with the source location inside the function. */ #if __GNUC_PREREQ (4,3) # define __attribute_artificial__ __attribute__ ((__artificial__)) #else # define __attribute_artificial__ /* Ignore */ #endif /* GCC 4.3 and above with -std=c99 or -std=gnu99 implements ISO C99 inline semantics, unless -fgnu89-inline is used. Using __GNUC_STDC_INLINE__ or __GNUC_GNU_INLINE is not a good enough check for gcc because gcc versions older than 4.3 may define these macros and still not guarantee GNU inlining semantics. clang++ identifies itself as gcc-4.2, but has support for GNU inlining semantics, that can be checked for by using the __GNUC_STDC_INLINE_ and __GNUC_GNU_INLINE__ macro definitions. */ #if (!defined __cplusplus || __GNUC_PREREQ (4,3) \ || (defined __clang__ && (defined __GNUC_STDC_INLINE__ \ || defined __GNUC_GNU_INLINE__))) # if defined __GNUC_STDC_INLINE__ || defined __cplusplus # define __extern_inline extern __inline __attribute__ ((__gnu_inline__)) # define __extern_always_inline \ extern __always_inline __attribute__ ((__gnu_inline__)) # else # define __extern_inline extern __inline # define __extern_always_inline extern __always_inline # endif #endif #ifdef __extern_always_inline # define __fortify_function __extern_always_inline __attribute_artificial__ #endif /* GCC 4.3 and above allow passing all anonymous arguments of an __extern_always_inline function to some other vararg function. */ #if __GNUC_PREREQ (4,3) # define __va_arg_pack() __builtin_va_arg_pack () # define __va_arg_pack_len() __builtin_va_arg_pack_len () #endif /* It is possible to compile containing GCC extensions even if GCC is run in pedantic mode if the uses are carefully marked using the `__extension__' keyword. But this is not generally available before version 2.8. */ #if !__GNUC_PREREQ (2,8) # define __extension__ /* Ignore */ #endif /* __restrict is known in EGCS 1.2 and above. */ #if !__GNUC_PREREQ (2,92) # if defined __STDC_VERSION__ && __STDC_VERSION__ >= 199901L # define __restrict restrict # else # define __restrict /* Ignore */ # endif #endif /* ISO C99 also allows to declare arrays as non-overlapping. The syntax is array_name[restrict] GCC 3.1 supports this. */ #if __GNUC_PREREQ (3,1) && !defined __GNUG__ # define __restrict_arr __restrict #else # ifdef __GNUC__ # define __restrict_arr /* Not supported in old GCC. */ # else # if defined __STDC_VERSION__ && __STDC_VERSION__ >= 199901L # define __restrict_arr restrict # else /* Some other non-C99 compiler. */ # define __restrict_arr /* Not supported. */ # endif # endif #endif #if (__GNUC__ >= 3) || (__clang_major__ >= 4) # define __glibc_unlikely(cond) __builtin_expect ((cond), 0) # define __glibc_likely(cond) __builtin_expect ((cond), 1) #else # define __glibc_unlikely(cond) (cond) # define __glibc_likely(cond) (cond) #endif #ifdef __has_attribute # define __glibc_has_attribute(attr) __has_attribute (attr) #else # define __glibc_has_attribute(attr) 0 #endif #if (!defined _Noreturn \ && (defined __STDC_VERSION__ ? __STDC_VERSION__ : 0) < 201112 \ && !__GNUC_PREREQ (4,7)) # if __GNUC_PREREQ (2,8) # define _Noreturn __attribute__ ((__noreturn__)) # else # define _Noreturn # endif #endif #if __GNUC_PREREQ (8, 0) /* Describes a char array whose address can safely be passed as the first argument to strncpy and strncat, as the char array is not necessarily a NUL-terminated string. */ # define __attribute_nonstring__ __attribute__ ((__nonstring__)) #else # define __attribute_nonstring__ #endif #if (!defined _Static_assert && !defined __cplusplus \ && (defined __STDC_VERSION__ ? __STDC_VERSION__ : 0) < 201112 \ && (!__GNUC_PREREQ (4, 6) || defined __STRICT_ANSI__)) # define _Static_assert(expr, diagnostic) \ extern int (*__Static_assert_function (void)) \ [!!sizeof (struct { int __error_if_negative: (expr) ? 2 : -1; })] #endif /* The #ifndef lets Gnulib avoid including these on non-glibc platforms, where the includes typically do not exist. */ #ifndef __WORDSIZE # include # include #endif #if defined __LONG_DOUBLE_MATH_OPTIONAL && defined __NO_LONG_DOUBLE_MATH # define __LDBL_COMPAT 1 # ifdef __REDIRECT # define __LDBL_REDIR1(name, proto, alias) __REDIRECT (name, proto, alias) # define __LDBL_REDIR(name, proto) \ __LDBL_REDIR1 (name, proto, __nldbl_##name) # define __LDBL_REDIR1_NTH(name, proto, alias) __REDIRECT_NTH (name, proto, alias) # define __LDBL_REDIR_NTH(name, proto) \ __LDBL_REDIR1_NTH (name, proto, __nldbl_##name) # define __LDBL_REDIR1_DECL(name, alias) \ extern __typeof (name) name __asm (__ASMNAME (#alias)); # define __LDBL_REDIR_DECL(name) \ extern __typeof (name) name __asm (__ASMNAME ("__nldbl_" #name)); # define __REDIRECT_LDBL(name, proto, alias) \ __LDBL_REDIR1 (name, proto, __nldbl_##alias) # define __REDIRECT_NTH_LDBL(name, proto, alias) \ __LDBL_REDIR1_NTH (name, proto, __nldbl_##alias) # endif #endif #if !defined __LDBL_COMPAT || !defined __REDIRECT # define __LDBL_REDIR1(name, proto, alias) name proto # define __LDBL_REDIR(name, proto) name proto # define __LDBL_REDIR1_NTH(name, proto, alias) name proto __THROW # define __LDBL_REDIR_NTH(name, proto) name proto __THROW # define __LDBL_REDIR_DECL(name) # ifdef __REDIRECT # define __REDIRECT_LDBL(name, proto, alias) __REDIRECT (name, proto, alias) # define __REDIRECT_NTH_LDBL(name, proto, alias) \ __REDIRECT_NTH (name, proto, alias) # endif #endif /* __glibc_macro_warning (MESSAGE) issues warning MESSAGE. This is intended for use in preprocessor macros. Note: MESSAGE must be a _single_ string; concatenation of string literals is not supported. */ #if __GNUC_PREREQ (4,8) || __glibc_clang_prereq (3,5) # define __glibc_macro_warning1(message) _Pragma (#message) # define __glibc_macro_warning(message) \ __glibc_macro_warning1 (GCC warning message) #else # define __glibc_macro_warning(msg) #endif /* Generic selection (ISO C11) is a C-only feature, available in GCC since version 4.9. Previous versions do not provide generic selection, even though they might set __STDC_VERSION__ to 201112L, when in -std=c11 mode. Thus, we must check for !defined __GNUC__ when testing __STDC_VERSION__ for generic selection support. On the other hand, Clang also defines __GNUC__, so a clang-specific check is required to enable the use of generic selection. */ #if !defined __cplusplus \ && (__GNUC_PREREQ (4, 9) \ || __glibc_clang_has_extension (c_generic_selections) \ || (!defined __GNUC__ && defined __STDC_VERSION__ \ && __STDC_VERSION__ >= 201112L)) # define __HAVE_GENERIC_SELECTION 1 #else # define __HAVE_GENERIC_SELECTION 0 #endif #endif /* sys/cdefs.h */ pspp-1.4.1/gl/msvc-nothrow.h0000644000175000017500000000276213723215637015354 0ustar00blpblp00000000000000/* Wrappers that don't throw invalid parameter notifications with MSVC runtime libraries. Copyright (C) 2011-2020 Free Software Foundation, Inc. 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 3, 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, see . */ #ifndef _MSVC_NOTHROW_H #define _MSVC_NOTHROW_H /* With MSVC runtime libraries with the "invalid parameter handler" concept, functions like fprintf(), dup2(), or close() crash when the caller passes an invalid argument. But POSIX wants error codes (such as EINVAL or EBADF) instead. This file defines wrappers that turn such an invalid parameter notification into an error code. */ #if defined _WIN32 && ! defined __CYGWIN__ /* Get original declaration of _get_osfhandle. */ # include # if HAVE_MSVC_INVALID_PARAMETER_HANDLER /* Override _get_osfhandle. */ extern intptr_t _gl_nothrow_get_osfhandle (int fd); # define _get_osfhandle _gl_nothrow_get_osfhandle # endif #endif #endif /* _MSVC_NOTHROW_H */ pspp-1.4.1/gl/wcrtomb.c0000644000175000017500000000437313723215640014350 0ustar00blpblp00000000000000/* Convert wide character to multibyte character. Copyright (C) 2008-2020 Free Software Foundation, Inc. Written by Bruno Haible , 2008. 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 3 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, see . */ #include /* Specification. */ #include #include #include size_t wcrtomb (char *s, wchar_t wc, mbstate_t *ps) #undef wcrtomb { /* This implementation of wcrtomb supports only stateless encodings. ps must be in the initial state. */ if (ps != NULL && !mbsinit (ps)) { errno = EINVAL; return (size_t)(-1); } #if !HAVE_WCRTOMB /* IRIX 6.5 */ \ || WCRTOMB_RETVAL_BUG /* Solaris 11.3, MSVC */ \ || WCRTOMB_C_LOCALE_BUG /* Android */ if (s == NULL) /* We know the NUL wide character corresponds to the NUL character. */ return 1; else #endif { #if HAVE_WCRTOMB # if WCRTOMB_C_LOCALE_BUG /* Android */ /* Implement consistently with mbrtowc(): through a 1:1 correspondence, as in ISO-8859-1. */ if (wc >= 0 && wc <= 0xff) { *s = (unsigned char) wc; return 1; } else { errno = EILSEQ; return (size_t)(-1); } # else return wcrtomb (s, wc, ps); # endif #else /* IRIX 6.5 */ /* Fallback for platforms that don't have wcrtomb(). Implement on top of wctomb(). This code is not multithread-safe. */ int ret = wctomb (s, wc); if (ret >= 0) return ret; else { errno = EILSEQ; return (size_t)(-1); } #endif } } pspp-1.4.1/gl/windows-mutex.h0000644000175000017500000000313413723215640015524 0ustar00blpblp00000000000000/* Plain mutexes (native Windows implementation). Copyright (C) 2005-2020 Free Software Foundation, Inc. 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 3, 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, see . */ /* Written by Bruno Haible , 2005. Based on GCC's gthr-win32.h. */ #ifndef _WINDOWS_MUTEX_H #define _WINDOWS_MUTEX_H #define WIN32_LEAN_AND_MEAN /* avoid including junk */ #include #include "windows-initguard.h" typedef struct { glwthread_initguard_t guard; /* protects the initialization */ CRITICAL_SECTION lock; } glwthread_mutex_t; #define GLWTHREAD_MUTEX_INIT { GLWTHREAD_INITGUARD_INIT } #ifdef __cplusplus extern "C" { #endif extern void glwthread_mutex_init (glwthread_mutex_t *mutex); extern int glwthread_mutex_lock (glwthread_mutex_t *mutex); extern int glwthread_mutex_trylock (glwthread_mutex_t *mutex); extern int glwthread_mutex_unlock (glwthread_mutex_t *mutex); extern int glwthread_mutex_destroy (glwthread_mutex_t *mutex); #ifdef __cplusplus } #endif #endif /* _WINDOWS_MUTEX_H */ pspp-1.4.1/gl/uniwbrk/0000755000175000017500000000000013725012650014177 5ustar00blpblp00000000000000pspp-1.4.1/gl/uniwbrk/wbrktable.h0000644000175000017500000000156113723215640016332 0ustar00blpblp00000000000000/* Word break auxiliary table. Copyright (C) 2009-2020 Free Software Foundation, Inc. Written by Bruno Haible , 2009. 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 3 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, see . */ extern const int uniwbrk_prop_index[22]; extern const unsigned char uniwbrk_table[14][14]; pspp-1.4.1/gl/uniwbrk/wbrktable.c0000644000175000017500000000776113723215640016335 0ustar00blpblp00000000000000/* Word break auxiliary table. -*- coding: utf-8 -*- Copyright (C) 2009-2020 Free Software Foundation, Inc. Written by Bruno Haible , 2009. 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 3 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, see . */ #include /* Specification. */ #include "wbrktable.h" const int uniwbrk_prop_index[22] = { 0, /* WBP_OTHER */ 1, /* WBP_KATAKANA */ 2, /* WBP_ALETTER */ 3, /* WBP_MIDNUMLET */ 4, /* WBP_MIDLETTER */ 5, /* WBP_MIDNUM */ 6, /* WBP_NUMERIC */ 7, /* WBP_EXTENDNUMLET */ -1, /* WBP_EXTEND */ -1, /* WBP_FORMAT */ -1, /* WBP_NEWLINE */ -1, /* WBP_CR */ -1, /* WBP_LF */ -1, /* WBP_RI */ 8, /* WBP_DQ */ 9, /* WBP_SQ */ 10, /* WBP_HL */ -1, /* WBP_ZWJ */ 11, /* WBP_EB */ 12, /* WBP_EM */ -1, /* WBP_GAZ */ 13 /* WBP_EBG */ }; /* This table contains the following rules (see UAX #29): last current (ALetter | HL) × (ALetter | HL) (WB5) (ALetter | HL) × Numeric (WB9) HL × SQ (WB7a) Numeric × (ALetter | HL) (WB10) Numeric × Numeric (WB8) Katakana × Katakana (WB13) (ALetter | HL | Numeric | Katakana) × ExtendNumLet (WB13a) ExtendNumLet × ExtendNumLet (WB13a) ExtendNumLet × (ALetter | HL | Numeric | Katakana) (WB13b) (E_Base | EBG) × E_Modifier (WB14) Note that the following rules are not handled here but in the loop in u-wordbreaks.h: - The rules need to look back or look ahead the second character (WB6, WB7, WB7b, WB7c, WB11, WB12) - The rules with a higher precedence over the "ignore" rule (WB4), such as WB3c */ const unsigned char uniwbrk_table[14][14] = { /* current: OTHER MIDNUMLET NUMERIC SQ EM */ /* KATAKANA MIDLETTER EXNUMLET HL EBG */ /* ALETTER MIDNUM DQ EB */ /* last */ /* WBP_OTHER */ { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, /* WBP_KATAKANA */ { 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1 }, /* WBP_ALETTER */ { 1, 1, 0, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1 }, /* WBP_MIDNUMLET */ { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, /* WBP_MIDLETTER */ { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, /* WBP_MIDNUM */ { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, /* WBP_NUMERIC */ { 1, 1, 0, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1 }, /* WBP_EXTENDNUMLET */ { 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1 }, /* WBP_DQ */ { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, /* WBP_SQ */ { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, /* WBP_HL */ { 1, 1, 0, 1, 1, 1, 0, 0, 1, 0, 0, 1, 1, 1 }, /* WBP_EB */ { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1 }, /* WBP_EM */ { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, /* WBP_EBG */ { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1 } }; pspp-1.4.1/gl/uniwbrk/wbrkprop.h0000644000175000017500000112145113723215640016225 0ustar00blpblp00000000000000/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ /* Line breaking properties of Unicode characters. */ /* Generated automatically by gen-uni-tables.c for Unicode 9.0.0. */ /* Copyright (C) 2000-2002, 2004, 2007-2009 Free Software Foundation, Inc. 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 3 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, see . */ #define wbrkprop_header_0 16 #define wbrkprop_header_1 15 #define wbrkprop_header_2 7 #define wbrkprop_header_3 511 #define wbrkprop_header_4 127 typedef struct { int level1[15]; int level2[3 << 9]; unsigned char level3[174 << 7]; } wbrkprop_t; static const wbrkprop_t uniwbrkprop = { { 0, 512, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1024 }, { 0, 128, 256, 256, 256, 384, 512, 640, 256, 768, 896, 1024, 1152, 1280, 1408, 1536, 1664, 1792, 1920, 2048, 2176, 2304, 2432, 2560, 2688, 2816, 2944, 3072, 3200, 3328, 3456, 3584, 3712, 3840, 256, 256, 3968, 4096, 4224, 4352, 4480, 256, 256, 256, 4608, 4736, 4864, 4992, 5120, 5248, 5376, 5504, 5632, 5760, 5888, 6016, 6144, 6272, 256, 6400, 256, 256, 6528, 6656, 6784, 6912, 7040, 7168, -1, -1, -1, -1, -1, 7296, -1, -1, 7424, 7552, 7680, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7808, 7936, 8064, 8192, 8320, -1, -1, -1, 8448, 8576, 8704, 8832, -1, 8960, 9088, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 256, 256, 256, 256, 256, 256, 256, 256, 256, 9216, 256, 256, 9344, 9472, 9600, 9728, 9856, 9984, 10112, 10240, 10368, 10496, 10624, 10752, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 10880, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 11008, 11136, 256, 256, 11264, 11392, 11520, 11648, 11776, 11904, 12032, 12160, 12288, 12416, -1, 12544, 12672, 12800, 256, 12928, 13056, -1, 256, 256, 13184, -1, 13312, 13440, 13568, 13696, 13824, 13952, 14080, 14208, 14336, 14464, -1, -1, -1, -1, -1, -1, 14592, 14720, 14848, 14976, 15104, 15232, 15360, -1, 15488, 15616, -1, 15744, 15872, 16000, 16128, -1, -1, 16256, -1, -1, -1, 16384, -1, -1, 16512, 16640, -1, -1, -1, -1, -1, -1, 256, 256, 256, 256, 256, 256, 256, 16768, 16896, 256, 17024, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 256, 256, 256, 256, 256, 256, 256, 256, 17152, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 256, 256, 256, 256, 17280, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 256, 256, 256, 256, 17408, 17536, 17664, 17792, -1, -1, -1, -1, -1, -1, 17920, 18048, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 18176, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 18304, 18432, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 18560, 18688, 18816, -1, -1, -1, 18944, 19072, 19200, 256, 256, 19328, 19456, 19584, -1, -1, -1, -1, 19712, 19840, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 19968, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 256, 20096, 20224, -1, -1, -1, -1, -1, -1, -1, -1, -1, 20352, 20480, -1, -1, -1, -1, 20608, 20736, -1, -1, -1, 20864, 20992, 21120, 21248, 21376, 21504, 21632, -1, -1, -1, -1, 21760, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 21888, -1, 22016, 22144, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 }, { WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_LF, WBP_NEWLINE, WBP_NEWLINE, WBP_CR, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_DQ, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_SQ, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_MIDNUM, WBP_OTHER, WBP_MIDNUMLET, WBP_OTHER, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_MIDLETTER, WBP_MIDNUM, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_EXTENDNUMLET, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_NEWLINE, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_FORMAT, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_OTHER, WBP_MIDLETTER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_MIDLETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_MIDNUM, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_MIDLETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_MIDNUM, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_EXTEND, WBP_OTHER, WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_EXTEND, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_HL, WBP_HL, WBP_HL, WBP_HL, WBP_HL, WBP_HL, WBP_HL, WBP_HL, WBP_HL, WBP_HL, WBP_HL, WBP_HL, WBP_HL, WBP_HL, WBP_HL, WBP_HL, WBP_HL, WBP_HL, WBP_HL, WBP_HL, WBP_HL, WBP_HL, WBP_HL, WBP_HL, WBP_HL, WBP_HL, WBP_HL, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_HL, WBP_HL, WBP_HL, WBP_ALETTER, WBP_MIDLETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_FORMAT, WBP_FORMAT, WBP_FORMAT, WBP_FORMAT, WBP_FORMAT, WBP_FORMAT, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_MIDNUM, WBP_MIDNUM, WBP_OTHER, WBP_OTHER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_FORMAT, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_OTHER, WBP_NUMERIC, WBP_MIDNUM, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_EXTEND, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_FORMAT, WBP_OTHER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_ALETTER, WBP_ALETTER, WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_ALETTER, WBP_ALETTER, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_FORMAT, WBP_ALETTER, WBP_EXTEND, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_MIDNUM, WBP_OTHER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_ALETTER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_ALETTER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_ALETTER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_FORMAT, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_ALETTER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_ALETTER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_OTHER, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_EXTEND, WBP_ALETTER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_OTHER, WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_OTHER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_EXTEND, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_OTHER, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_EXTEND, WBP_OTHER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_OTHER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_EXTEND, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_EXTEND, WBP_EXTEND, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_EXTEND, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_EXTEND, WBP_ALETTER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_OTHER, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_EXTEND, WBP_ALETTER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_OTHER, WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_OTHER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_OTHER, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_OTHER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_EXTEND, WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_EXTEND, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_OTHER, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_EXTEND, WBP_ALETTER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_OTHER, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_EXTEND, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_OTHER, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_EXTEND, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_EXTEND, WBP_OTHER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_OTHER, WBP_OTHER, WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_EXTEND, WBP_OTHER, WBP_OTHER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_EXTEND, WBP_OTHER, WBP_OTHER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_OTHER, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_EXTEND, WBP_OTHER, WBP_EXTEND, WBP_OTHER, WBP_EXTEND, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_EXTEND, WBP_EXTEND, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_EXTEND, WBP_EXTEND, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_EXTEND, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_OTHER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_EXTEND, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_EXTEND, WBP_OTHER, WBP_OTHER, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_FORMAT, WBP_OTHER, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_EXTEND, WBP_EXTEND, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_EXTEND, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_OTHER, WBP_EXTEND, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_ALETTER, WBP_ALETTER, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_EXTEND, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_EXTEND, WBP_ZWJ, WBP_FORMAT, WBP_FORMAT, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_MIDNUMLET, WBP_MIDNUMLET, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_MIDNUMLET, WBP_OTHER, WBP_OTHER, WBP_MIDLETTER, WBP_NEWLINE, WBP_NEWLINE, WBP_FORMAT, WBP_FORMAT, WBP_FORMAT, WBP_FORMAT, WBP_FORMAT, WBP_EXTENDNUMLET, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_EXTENDNUMLET, WBP_EXTENDNUMLET, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_MIDNUM, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_EXTENDNUMLET, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_FORMAT, WBP_FORMAT, WBP_FORMAT, WBP_FORMAT, WBP_FORMAT, WBP_OTHER, WBP_FORMAT, WBP_FORMAT, WBP_FORMAT, WBP_FORMAT, WBP_FORMAT, WBP_FORMAT, WBP_FORMAT, WBP_FORMAT, WBP_FORMAT, WBP_FORMAT, WBP_OTHER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_EB, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_EB, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_EB, WBP_EB, WBP_EB, WBP_EB, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_GAZ, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_EXTEND, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_EXTEND, WBP_EXTEND, WBP_KATAKANA, WBP_KATAKANA, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_OTHER, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_OTHER, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_EXTEND, WBP_EXTEND, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_EXTEND, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_EXTEND, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_EXTEND, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_EXTEND, WBP_EXTEND, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_EXTEND, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_EXTEND, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_OTHER, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_EXTEND, WBP_OTHER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_OTHER, WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_EXTEND, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_OTHER, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_HL, WBP_EXTEND, WBP_HL, WBP_HL, WBP_HL, WBP_HL, WBP_HL, WBP_HL, WBP_HL, WBP_HL, WBP_HL, WBP_HL, WBP_OTHER, WBP_HL, WBP_HL, WBP_HL, WBP_HL, WBP_HL, WBP_HL, WBP_HL, WBP_HL, WBP_HL, WBP_HL, WBP_HL, WBP_HL, WBP_HL, WBP_OTHER, WBP_HL, WBP_HL, WBP_HL, WBP_HL, WBP_HL, WBP_OTHER, WBP_HL, WBP_OTHER, WBP_HL, WBP_HL, WBP_OTHER, WBP_HL, WBP_HL, WBP_OTHER, WBP_HL, WBP_HL, WBP_HL, WBP_HL, WBP_HL, WBP_HL, WBP_HL, WBP_HL, WBP_HL, WBP_HL, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_MIDNUM, WBP_OTHER, WBP_OTHER, WBP_MIDLETTER, WBP_MIDNUM, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_EXTENDNUMLET, WBP_EXTENDNUMLET, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_EXTENDNUMLET, WBP_EXTENDNUMLET, WBP_EXTENDNUMLET, WBP_MIDNUM, WBP_OTHER, WBP_MIDNUMLET, WBP_OTHER, WBP_MIDNUM, WBP_MIDLETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_FORMAT, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_MIDNUMLET, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_MIDNUM, WBP_OTHER, WBP_MIDNUMLET, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_MIDLETTER, WBP_MIDNUM, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_EXTENDNUMLET, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_EXTEND, WBP_EXTEND, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_FORMAT, WBP_FORMAT, WBP_FORMAT, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_EXTEND, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_EXTEND, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_EXTEND, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_OTHER, WBP_FORMAT, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_EXTEND, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_EXTEND, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_EXTEND, WBP_ALETTER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_OTHER, WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_OTHER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_EXTEND, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_OTHER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_OTHER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_KATAKANA, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_FORMAT, WBP_FORMAT, WBP_FORMAT, WBP_FORMAT, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_FORMAT, WBP_FORMAT, WBP_FORMAT, WBP_FORMAT, WBP_FORMAT, WBP_FORMAT, WBP_FORMAT, WBP_FORMAT, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_OTHER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_EXTEND, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_EXTEND, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_OTHER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_RI, WBP_RI, WBP_RI, WBP_RI, WBP_RI, WBP_RI, WBP_RI, WBP_RI, WBP_RI, WBP_RI, WBP_RI, WBP_RI, WBP_RI, WBP_RI, WBP_RI, WBP_RI, WBP_RI, WBP_RI, WBP_RI, WBP_RI, WBP_RI, WBP_RI, WBP_RI, WBP_RI, WBP_RI, WBP_RI, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_EB, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_EB, WBP_EB, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_EB, WBP_EB, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_EM, WBP_EM, WBP_EM, WBP_EM, WBP_EM, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_EB, WBP_EB, WBP_OTHER, WBP_OTHER, WBP_EB, WBP_EB, WBP_EB, WBP_EB, WBP_EB, WBP_EB, WBP_EB, WBP_EB, WBP_EB, WBP_EB, WBP_EB, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_EBG, WBP_EBG, WBP_EBG, WBP_EBG, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_EB, WBP_OTHER, WBP_EB, WBP_EB, WBP_EB, WBP_EB, WBP_EB, WBP_EB, WBP_EB, WBP_EB, WBP_EB, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_EB, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_EB, WBP_EB, WBP_EB, WBP_OTHER, WBP_EB, WBP_EB, WBP_EB, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_GAZ, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_EB, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_EB, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_EB, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_EB, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_EB, WBP_EB, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_GAZ, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_EB, WBP_EB, WBP_EB, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_EB, WBP_EB, WBP_EB, WBP_EB, WBP_EB, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_EB, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_EB, WBP_EB, WBP_EB, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_EB, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_EB, WBP_EB, WBP_EB, WBP_EB, WBP_EB, WBP_EB, WBP_EB, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_EB, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_EB, WBP_OTHER, WBP_OTHER, WBP_EB, WBP_EB, WBP_EB, WBP_EB, WBP_EB, WBP_EB, WBP_EB, WBP_OTHER, WBP_OTHER, WBP_EB, WBP_EB, WBP_EB, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_FORMAT, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER } }; pspp-1.4.1/gl/uniwbrk/wordbreak-property.c0000644000175000017500000000264713723215640020220 0ustar00blpblp00000000000000/* Word break property. Copyright (C) 2001-2003, 2006-2020 Free Software Foundation, Inc. Written by Bruno Haible , 2009. 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 3 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, see . */ #include /* Specification. */ #include "uniwbrk.h" #include "wbrkprop.h" int uc_wordbreak_property (ucs4_t uc) { unsigned int index1 = uc >> wbrkprop_header_0; if (index1 < wbrkprop_header_1) { int lookup1 = uniwbrkprop.level1[index1]; if (lookup1 >= 0) { unsigned int index2 = (uc >> wbrkprop_header_2) & wbrkprop_header_3; int lookup2 = uniwbrkprop.level2[lookup1 + index2]; if (lookup2 >= 0) { unsigned int index3 = uc & wbrkprop_header_4; return uniwbrkprop.level3[lookup2 + index3]; } } } return WBP_OTHER; } pspp-1.4.1/gl/uniwbrk/u-wordbreaks.h0000644000175000017500000001536313723215640016767 0ustar00blpblp00000000000000/* Word breaks in UTF-8/UTF-16/UTF-32 strings. -*- coding: utf-8 -*- Copyright (C) 2009-2020 Free Software Foundation, Inc. Written by Bruno Haible , 2009. 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 3 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, see . */ void FUNC (const UNIT *s, size_t n, char *p) { if (n > 0) { const UNIT *s_end = s + n; /* Word break property of the last character. -1 at the very beginning of the string. */ int last_char_prop = -1; /* Format and Extend characters are ignored; this means, the mostly used unit is the complex character (= character with subsequent ignored characters). Word break property of the last complex character. -1 at the very beginning of the string. */ int last_compchar_prop = -1; char *last_compchar_ptr = NULL; /* For recognizing rules involving 3 complex characters: Word break property of the second-to-last complex character. -1 at the very beginning of the string. */ int secondlast_compchar_prop = -1; size_t ri_count = 0; /* Don't break inside multibyte characters. */ memset (p, 0, n); while (s < s_end) { ucs4_t uc; int count = U_MBTOUC_UNSAFE (&uc, s, s_end - s); int prop = uc_wordbreak_property (uc); /* No break at the start of the string. */ if (last_char_prop >= 0) { /* No break between CR and LF (WB3). */ if (last_char_prop == WBP_CR && prop == WBP_LF) /* *p = 0 */; /* Break before and after newlines (WB3a, WB3b). */ else if ((last_char_prop == WBP_CR || last_char_prop == WBP_LF || last_char_prop == WBP_NEWLINE) || (prop == WBP_CR || prop == WBP_LF || prop == WBP_NEWLINE)) *p = 1; /* No break within emoji zwj sequence (WB3c). */ else if (last_char_prop == WBP_ZWJ && (prop == WBP_GAZ || prop == WBP_EBG)) /* *p = 0 */; /* Ignore Format and Extend characters. */ else if (!(prop == WBP_EXTEND || prop == WBP_FORMAT || prop == WBP_ZWJ)) { /* No break in these situations (see UAX #29): secondlast last current (ALetter | HL) (MidLetter | MidNumLet | SQ) × (ALetter | HL) (WB7) (ALetter | HL) × (MidLetter | MidNumLet | SQ) (ALetter | HL) (WB6) Numeric (MidNum | MidNumLet | SQ) × Numeric (WB11) Numeric × (MidNum | MidNumLet | SQ) Numeric (WB12) HL × DQ HL (WB7b) HL DQ × HL (WB7c) ^ (RI RI)* RI × RI (WB15) [^RI] (RI RI)* RI × RI (WB16) */ /* No break across certain punctuation. Also, disable word breaks that were recognized earlier (due to lookahead of only one complex character). */ if (((prop == WBP_ALETTER || prop == WBP_HL) && (last_compchar_prop == WBP_MIDLETTER || last_compchar_prop == WBP_MIDNUMLET || last_compchar_prop == WBP_SQ) && (secondlast_compchar_prop == WBP_ALETTER || secondlast_compchar_prop == WBP_HL)) || (prop == WBP_NUMERIC && (last_compchar_prop == WBP_MIDNUM || last_compchar_prop == WBP_MIDNUMLET || last_compchar_prop == WBP_SQ) && secondlast_compchar_prop == WBP_NUMERIC) || (prop == WBP_HL && last_compchar_prop == WBP_DQ && secondlast_compchar_prop == WBP_HL)) { *last_compchar_ptr = 0; /* *p = 0; */ } /* Break before RI, if odd number of RI's are preceding (WB15, WB16). */ else if (last_compchar_prop == WBP_RI && prop == WBP_RI) { if (ri_count % 2 == 0) *p = 1; /* else *p = 0 */ } /* Break after Format and Extend character. */ else if (last_compchar_prop == WBP_EXTEND || last_compchar_prop == WBP_FORMAT) *p = 1; else { int last_compchar_index = uniwbrk_prop_index[last_compchar_prop]; int index = uniwbrk_prop_index[prop]; /* Break between unknown pair (WB999). */ if (last_compchar_index < 0 || index < 0) *p = 1; /* Perform a single table lookup. */ else if (uniwbrk_table[last_compchar_index][index]) *p = 1; /* else *p = 0; */ } } } last_char_prop = prop; /* Ignore Format and Extend characters, except at the start of the line. */ if (last_compchar_prop < 0 || last_compchar_prop == WBP_CR || last_compchar_prop == WBP_LF || last_compchar_prop == WBP_NEWLINE || !(prop == WBP_EXTEND || prop == WBP_FORMAT || prop == WBP_ZWJ)) { secondlast_compchar_prop = last_compchar_prop; last_compchar_prop = prop; last_compchar_ptr = p; if (prop == WBP_RI) ri_count++; else ri_count = 0; } s += count; p += count; } } } pspp-1.4.1/gl/uniwbrk/u8-wordbreaks.c0000644000175000017500000000551413723215640017047 0ustar00blpblp00000000000000/* Word breaks in UTF-8 strings. Copyright (C) 2009-2020 Free Software Foundation, Inc. Written by Bruno Haible , 2009. 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 3 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, see . */ #include /* Specification. */ #include "uniwbrk.h" #include #include "unistr.h" #include "uniwbrk/wbrktable.h" #define FUNC u8_wordbreaks #define UNIT uint8_t #define U_MBTOUC_UNSAFE u8_mbtouc_unsafe #include "u-wordbreaks.h" #ifdef TEST #include #include /* Read the contents of an input stream, and return it, terminated with a NUL byte. */ char * read_file (FILE *stream) { #define BUFSIZE 4096 char *buf = NULL; int alloc = 0; int size = 0; int count; while (! feof (stream)) { if (size + BUFSIZE > alloc) { alloc = alloc + alloc / 2; if (alloc < size + BUFSIZE) alloc = size + BUFSIZE; buf = realloc (buf, alloc); if (buf == NULL) { fprintf (stderr, "out of memory\n"); exit (1); } } count = fread (buf + size, 1, BUFSIZE, stream); if (count == 0) { if (ferror (stream)) { perror ("fread"); exit (1); } } else size += count; } buf = realloc (buf, size + 1); if (buf == NULL) { fprintf (stderr, "out of memory\n"); exit (1); } buf[size] = '\0'; return buf; #undef BUFSIZE } int main (int argc, char * argv[]) { if (argc == 1) { /* Display all the word breaks in the input string. */ char *input = read_file (stdin); int length = strlen (input); char *breaks = malloc (length); int i; u8_wordbreaks ((uint8_t *) input, length, breaks); for (i = 0; i < length; i++) { switch (breaks[i]) { case 1: /* U+2027 in UTF-8 encoding */ putc (0xe2, stdout); putc (0x80, stdout); putc (0xa7, stdout); break; case 0: break; default: abort (); } putc (input[i], stdout); } free (breaks); return 0; } else return 1; } #endif /* TEST */ pspp-1.4.1/gl/anytostr.c0000644000175000017500000000314113723215636014553 0ustar00blpblp00000000000000/* anytostr.c -- convert integers to printable strings Copyright (C) 2001, 2006, 2008-2020 Free Software Foundation, Inc. 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 3 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, see . */ /* Written by Paul Eggert */ /* Tell gcc not to warn about the (i < 0) test, below. */ #if (__GNUC__ == 4 && 3 <= __GNUC_MINOR__) || 4 < __GNUC__ # pragma GCC diagnostic ignored "-Wtype-limits" #elif defined __clang__ # pragma clang diagnostic ignored "-Wtautological-compare" #endif #include #include "inttostr.h" /* Convert I to a printable string in BUF, which must be at least INT_BUFSIZE_BOUND (INTTYPE) bytes long. Return the address of the printable string, which need not start at BUF. */ char * _GL_ATTRIBUTE_NODISCARD anytostr (inttype i, char *buf) { char *p = buf + INT_STRLEN_BOUND (inttype); *p = 0; if (i < 0) { do *--p = '0' - i % 10; while ((i /= 10) != 0); *--p = '-'; } else { do *--p = '0' + i % 10; while ((i /= 10) != 0); } return p; } pspp-1.4.1/gl/sig-handler.h0000644000175000017500000000354213723215640015072 0ustar00blpblp00000000000000/* Convenience declarations when working with . Copyright (C) 2008-2020 Free Software Foundation, Inc. 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 3 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, see . */ #ifndef _GL_SIG_HANDLER_H #define _GL_SIG_HANDLER_H #include #ifndef _GL_INLINE_HEADER_BEGIN #error "Please include config.h first." #endif _GL_INLINE_HEADER_BEGIN #ifndef SIG_HANDLER_INLINE # define SIG_HANDLER_INLINE _GL_INLINE #endif /* Convenience type when working with signal handlers. */ typedef void (*sa_handler_t) (int); /* Return the handler of a signal, as a sa_handler_t value regardless of its true type. The resulting function can be compared to special values like SIG_IGN but it is not portable to call it. */ SIG_HANDLER_INLINE sa_handler_t _GL_ATTRIBUTE_PURE get_handler (struct sigaction const *a) { /* POSIX says that special values like SIG_IGN can only occur when action.sa_flags does not contain SA_SIGINFO. But in Linux 2.4, for example, sa_sigaction and sa_handler are aliases and a signal is ignored if sa_sigaction (after casting) equals SIG_IGN. In this case, this implementation relies on the fact that the two are aliases, and simply returns sa_handler. */ return a->sa_handler; } _GL_INLINE_HEADER_END #endif /* _GL_SIG_HANDLER_H */ pspp-1.4.1/gl/localeconv.c0000644000175000017500000000656313723215637015031 0ustar00blpblp00000000000000/* Query locale dependent information for formatting numbers. Copyright (C) 2012-2020 Free Software Foundation, Inc. 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 3 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, see . */ #include /* Specification. */ #include #if HAVE_STRUCT_LCONV_DECIMAL_POINT /* Override for platforms where 'struct lconv' lacks the int_p_*, int_n_* members. */ struct lconv * localeconv (void) { static struct lconv result; # undef lconv # undef localeconv struct lconv *sys_result = localeconv (); result.decimal_point = sys_result->decimal_point; result.thousands_sep = sys_result->thousands_sep; result.grouping = sys_result->grouping; result.mon_decimal_point = sys_result->mon_decimal_point; result.mon_thousands_sep = sys_result->mon_thousands_sep; result.mon_grouping = sys_result->mon_grouping; result.positive_sign = sys_result->positive_sign; result.negative_sign = sys_result->negative_sign; result.currency_symbol = sys_result->currency_symbol; result.frac_digits = sys_result->frac_digits; result.p_cs_precedes = sys_result->p_cs_precedes; result.p_sign_posn = sys_result->p_sign_posn; result.p_sep_by_space = sys_result->p_sep_by_space; result.n_cs_precedes = sys_result->n_cs_precedes; result.n_sign_posn = sys_result->n_sign_posn; result.n_sep_by_space = sys_result->n_sep_by_space; result.int_curr_symbol = sys_result->int_curr_symbol; result.int_frac_digits = sys_result->int_frac_digits; result.int_p_cs_precedes = sys_result->p_cs_precedes; result.int_p_sign_posn = sys_result->p_sign_posn; result.int_p_sep_by_space = sys_result->p_sep_by_space; result.int_n_cs_precedes = sys_result->n_cs_precedes; result.int_n_sign_posn = sys_result->n_sign_posn; result.int_n_sep_by_space = sys_result->n_sep_by_space; return &result; } #else /* Override for platforms where 'struct lconv' is a dummy. */ # include struct lconv * localeconv (void) { static /*const*/ struct lconv result = { /* decimal_point */ ".", /* thousands_sep */ "", /* grouping */ "", /* mon_decimal_point */ "", /* mon_thousands_sep */ "", /* mon_grouping */ "", /* positive_sign */ "", /* negative_sign */ "", /* currency_symbol */ "", /* frac_digits */ CHAR_MAX, /* p_cs_precedes */ CHAR_MAX, /* p_sign_posn */ CHAR_MAX, /* p_sep_by_space */ CHAR_MAX, /* n_cs_precedes */ CHAR_MAX, /* n_sign_posn */ CHAR_MAX, /* n_sep_by_space */ CHAR_MAX, /* int_curr_symbol */ "", /* int_frac_digits */ CHAR_MAX, /* int_p_cs_precedes */ CHAR_MAX, /* int_p_sign_posn */ CHAR_MAX, /* int_p_sep_by_space */ CHAR_MAX, /* int_n_cs_precedes */ CHAR_MAX, /* int_n_sign_posn */ CHAR_MAX, /* int_n_sep_by_space */ CHAR_MAX }; return &result; } #endif pspp-1.4.1/gl/stdlib.in.h0000644000175000017500000011576713723215640014600 0ustar00blpblp00000000000000/* A GNU-like . Copyright (C) 1995, 2001-2004, 2006-2020 Free Software Foundation, Inc. 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 3 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, see . */ #if __GNUC__ >= 3 @PRAGMA_SYSTEM_HEADER@ #endif @PRAGMA_COLUMNS@ #if defined __need_system_stdlib_h || defined __need_malloc_and_calloc /* Special invocation conventions inside some gnulib header files, and inside some glibc header files, respectively. */ #@INCLUDE_NEXT@ @NEXT_STDLIB_H@ #else /* Normal invocation convention. */ #ifndef _@GUARD_PREFIX@_STDLIB_H /* The include_next requires a split double-inclusion guard. */ #@INCLUDE_NEXT@ @NEXT_STDLIB_H@ #ifndef _@GUARD_PREFIX@_STDLIB_H #define _@GUARD_PREFIX@_STDLIB_H /* NetBSD 5.0 mis-defines NULL. */ #include /* MirBSD 10 defines WEXITSTATUS in , not in . */ #if @GNULIB_SYSTEM_POSIX@ && !defined WEXITSTATUS # include #endif /* Solaris declares getloadavg() in . */ #if (@GNULIB_GETLOADAVG@ || defined GNULIB_POSIXCHECK) && @HAVE_SYS_LOADAVG_H@ /* OpenIndiana has a bug: must be included before . */ # include # include #endif /* Native Windows platforms declare mktemp() in . */ #if 0 && (defined _WIN32 && ! defined __CYGWIN__) # include #endif #if @GNULIB_RANDOM_R@ /* OSF/1 5.1 declares 'struct random_data' in , which is included from if _REENTRANT is defined. Include it whenever we need 'struct random_data'. */ # if @HAVE_RANDOM_H@ # include # endif # if !@HAVE_STRUCT_RANDOM_DATA@ || @REPLACE_RANDOM_R@ || !@HAVE_RANDOM_R@ # include # endif # if !@HAVE_STRUCT_RANDOM_DATA@ /* Define 'struct random_data'. But allow multiple gnulib generated replacements to coexist. */ # if !GNULIB_defined_struct_random_data struct random_data { int32_t *fptr; /* Front pointer. */ int32_t *rptr; /* Rear pointer. */ int32_t *state; /* Array of state values. */ int rand_type; /* Type of random number generator. */ int rand_deg; /* Degree of random number generator. */ int rand_sep; /* Distance between front and rear. */ int32_t *end_ptr; /* Pointer behind state table. */ }; # define GNULIB_defined_struct_random_data 1 # endif # endif #endif #if (@GNULIB_MKSTEMP@ || @GNULIB_MKSTEMPS@ || @GNULIB_MKOSTEMP@ || @GNULIB_MKOSTEMPS@ || @GNULIB_GETSUBOPT@ || defined GNULIB_POSIXCHECK) && ! defined __GLIBC__ && !(defined _WIN32 && ! defined __CYGWIN__) /* On Mac OS X 10.3, only declares mkstemp. */ /* On Mac OS X 10.5, only declares mkstemps. */ /* On Mac OS X 10.13, only declares mkostemp and mkostemps. */ /* On Cygwin 1.7.1, only declares getsubopt. */ /* But avoid namespace pollution on glibc systems and native Windows. */ # include #endif /* The __attribute__ feature is available in gcc versions 2.5 and later. The attribute __pure__ was added in gcc 2.96. */ #ifndef _GL_ATTRIBUTE_PURE # if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 96) # define _GL_ATTRIBUTE_PURE __attribute__ ((__pure__)) # else # define _GL_ATTRIBUTE_PURE /* empty */ # endif #endif /* The definition of _Noreturn is copied here. */ /* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */ /* The definition of _GL_ARG_NONNULL is copied here. */ /* The definition of _GL_WARN_ON_USE is copied here. */ /* Some systems do not define EXIT_*, despite otherwise supporting C89. */ #ifndef EXIT_SUCCESS # define EXIT_SUCCESS 0 #endif /* Tandem/NSK and other platforms that define EXIT_FAILURE as -1 interfere with proper operation of xargs. */ #ifndef EXIT_FAILURE # define EXIT_FAILURE 1 #elif EXIT_FAILURE != 1 # undef EXIT_FAILURE # define EXIT_FAILURE 1 #endif #if @GNULIB__EXIT@ /* Terminate the current process with the given return code, without running the 'atexit' handlers. */ # if !@HAVE__EXIT@ _GL_FUNCDECL_SYS (_Exit, _Noreturn void, (int status)); # endif _GL_CXXALIAS_SYS (_Exit, void, (int status)); _GL_CXXALIASWARN (_Exit); #elif defined GNULIB_POSIXCHECK # undef _Exit # if HAVE_RAW_DECL__EXIT _GL_WARN_ON_USE (_Exit, "_Exit is unportable - " "use gnulib module _Exit for portability"); # endif #endif #if @GNULIB_ATOLL@ /* Parse a signed decimal integer. Returns the value of the integer. Errors are not detected. */ # if !@HAVE_ATOLL@ _GL_FUNCDECL_SYS (atoll, long long, (const char *string) _GL_ATTRIBUTE_PURE _GL_ARG_NONNULL ((1))); # endif _GL_CXXALIAS_SYS (atoll, long long, (const char *string)); _GL_CXXALIASWARN (atoll); #elif defined GNULIB_POSIXCHECK # undef atoll # if HAVE_RAW_DECL_ATOLL _GL_WARN_ON_USE (atoll, "atoll is unportable - " "use gnulib module atoll for portability"); # endif #endif #if @GNULIB_CALLOC_POSIX@ # if @REPLACE_CALLOC@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef calloc # define calloc rpl_calloc # endif _GL_FUNCDECL_RPL (calloc, void *, (size_t nmemb, size_t size)); _GL_CXXALIAS_RPL (calloc, void *, (size_t nmemb, size_t size)); # else _GL_CXXALIAS_SYS (calloc, void *, (size_t nmemb, size_t size)); # endif # if __GLIBC__ >= 2 _GL_CXXALIASWARN (calloc); # endif #elif defined GNULIB_POSIXCHECK # undef calloc /* Assume calloc is always declared. */ _GL_WARN_ON_USE (calloc, "calloc is not POSIX compliant everywhere - " "use gnulib module calloc-posix for portability"); #endif #if @GNULIB_CANONICALIZE_FILE_NAME@ # if @REPLACE_CANONICALIZE_FILE_NAME@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # define canonicalize_file_name rpl_canonicalize_file_name # endif _GL_FUNCDECL_RPL (canonicalize_file_name, char *, (const char *name) _GL_ARG_NONNULL ((1))); _GL_CXXALIAS_RPL (canonicalize_file_name, char *, (const char *name)); # else # if !@HAVE_CANONICALIZE_FILE_NAME@ _GL_FUNCDECL_SYS (canonicalize_file_name, char *, (const char *name) _GL_ARG_NONNULL ((1))); # endif _GL_CXXALIAS_SYS (canonicalize_file_name, char *, (const char *name)); # endif # ifndef GNULIB_defined_canonicalize_file_name # define GNULIB_defined_canonicalize_file_name \ (!@HAVE_CANONICALIZE_FILE_NAME@ || @REPLACE_CANONICALIZE_FILE_NAME@) # endif _GL_CXXALIASWARN (canonicalize_file_name); #elif defined GNULIB_POSIXCHECK # undef canonicalize_file_name # if HAVE_RAW_DECL_CANONICALIZE_FILE_NAME _GL_WARN_ON_USE (canonicalize_file_name, "canonicalize_file_name is unportable - " "use gnulib module canonicalize-lgpl for portability"); # endif #endif #if @GNULIB_GETLOADAVG@ /* Store max(NELEM,3) load average numbers in LOADAVG[]. The three numbers are the load average of the last 1 minute, the last 5 minutes, and the last 15 minutes, respectively. LOADAVG is an array of NELEM numbers. */ # if !@HAVE_DECL_GETLOADAVG@ _GL_FUNCDECL_SYS (getloadavg, int, (double loadavg[], int nelem) _GL_ARG_NONNULL ((1))); # endif _GL_CXXALIAS_SYS (getloadavg, int, (double loadavg[], int nelem)); _GL_CXXALIASWARN (getloadavg); #elif defined GNULIB_POSIXCHECK # undef getloadavg # if HAVE_RAW_DECL_GETLOADAVG _GL_WARN_ON_USE (getloadavg, "getloadavg is not portable - " "use gnulib module getloadavg for portability"); # endif #endif #if @GNULIB_GETSUBOPT@ /* Assuming *OPTIONP is a comma separated list of elements of the form "token" or "token=value", getsubopt parses the first of these elements. If the first element refers to a "token" that is member of the given NULL-terminated array of tokens: - It replaces the comma with a NUL byte, updates *OPTIONP to point past the first option and the comma, sets *VALUEP to the value of the element (or NULL if it doesn't contain an "=" sign), - It returns the index of the "token" in the given array of tokens. Otherwise it returns -1, and *OPTIONP and *VALUEP are undefined. For more details see the POSIX specification. https://pubs.opengroup.org/onlinepubs/9699919799/functions/getsubopt.html */ # if !@HAVE_GETSUBOPT@ _GL_FUNCDECL_SYS (getsubopt, int, (char **optionp, char *const *tokens, char **valuep) _GL_ARG_NONNULL ((1, 2, 3))); # endif _GL_CXXALIAS_SYS (getsubopt, int, (char **optionp, char *const *tokens, char **valuep)); _GL_CXXALIASWARN (getsubopt); #elif defined GNULIB_POSIXCHECK # undef getsubopt # if HAVE_RAW_DECL_GETSUBOPT _GL_WARN_ON_USE (getsubopt, "getsubopt is unportable - " "use gnulib module getsubopt for portability"); # endif #endif #if @GNULIB_GRANTPT@ /* Change the ownership and access permission of the slave side of the pseudo-terminal whose master side is specified by FD. */ # if !@HAVE_GRANTPT@ _GL_FUNCDECL_SYS (grantpt, int, (int fd)); # endif _GL_CXXALIAS_SYS (grantpt, int, (int fd)); _GL_CXXALIASWARN (grantpt); #elif defined GNULIB_POSIXCHECK # undef grantpt # if HAVE_RAW_DECL_GRANTPT _GL_WARN_ON_USE (grantpt, "grantpt is not portable - " "use gnulib module grantpt for portability"); # endif #endif /* If _GL_USE_STDLIB_ALLOC is nonzero, the including module does not rely on GNU or POSIX semantics for malloc and realloc (for example, by never specifying a zero size), so it does not need malloc or realloc to be redefined. */ #if @GNULIB_MALLOC_POSIX@ # if @REPLACE_MALLOC@ # if !((defined __cplusplus && defined GNULIB_NAMESPACE) \ || _GL_USE_STDLIB_ALLOC) # undef malloc # define malloc rpl_malloc # endif _GL_FUNCDECL_RPL (malloc, void *, (size_t size)); _GL_CXXALIAS_RPL (malloc, void *, (size_t size)); # else _GL_CXXALIAS_SYS (malloc, void *, (size_t size)); # endif # if __GLIBC__ >= 2 _GL_CXXALIASWARN (malloc); # endif #elif defined GNULIB_POSIXCHECK && !_GL_USE_STDLIB_ALLOC # undef malloc /* Assume malloc is always declared. */ _GL_WARN_ON_USE (malloc, "malloc is not POSIX compliant everywhere - " "use gnulib module malloc-posix for portability"); #endif /* Convert a multibyte character to a wide character. */ #if @GNULIB_MBTOWC@ # if @REPLACE_MBTOWC@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef mbtowc # define mbtowc rpl_mbtowc # endif _GL_FUNCDECL_RPL (mbtowc, int, (wchar_t *restrict pwc, const char *restrict s, size_t n)); _GL_CXXALIAS_RPL (mbtowc, int, (wchar_t *restrict pwc, const char *restrict s, size_t n)); # else # if !@HAVE_MBTOWC@ _GL_FUNCDECL_SYS (mbtowc, int, (wchar_t *restrict pwc, const char *restrict s, size_t n)); # endif _GL_CXXALIAS_SYS (mbtowc, int, (wchar_t *restrict pwc, const char *restrict s, size_t n)); # endif # if __GLIBC__ >= 2 _GL_CXXALIASWARN (mbtowc); # endif #elif defined GNULIB_POSIXCHECK # undef mbtowc # if HAVE_RAW_DECL_MBTOWC _GL_WARN_ON_USE (mbtowc, "mbtowc is not portable - " "use gnulib module mbtowc for portability"); # endif #endif #if @GNULIB_MKDTEMP@ /* Create a unique temporary directory from TEMPLATE. The last six characters of TEMPLATE must be "XXXXXX"; they are replaced with a string that makes the directory name unique. Returns TEMPLATE, or a null pointer if it cannot get a unique name. The directory is created mode 700. */ # if !@HAVE_MKDTEMP@ _GL_FUNCDECL_SYS (mkdtemp, char *, (char * /*template*/) _GL_ARG_NONNULL ((1))); # endif _GL_CXXALIAS_SYS (mkdtemp, char *, (char * /*template*/)); _GL_CXXALIASWARN (mkdtemp); #elif defined GNULIB_POSIXCHECK # undef mkdtemp # if HAVE_RAW_DECL_MKDTEMP _GL_WARN_ON_USE (mkdtemp, "mkdtemp is unportable - " "use gnulib module mkdtemp for portability"); # endif #endif #if @GNULIB_MKOSTEMP@ /* Create a unique temporary file from TEMPLATE. The last six characters of TEMPLATE must be "XXXXXX"; they are replaced with a string that makes the file name unique. The flags are a bitmask, possibly including O_CLOEXEC (defined in ) and O_TEXT, O_BINARY (defined in "binary-io.h"). The file is then created, with the specified flags, ensuring it didn't exist before. The file is created read-write (mask at least 0600 & ~umask), but it may be world-readable and world-writable (mask 0666 & ~umask), depending on the implementation. Returns the open file descriptor if successful, otherwise -1 and errno set. */ # if !@HAVE_MKOSTEMP@ _GL_FUNCDECL_SYS (mkostemp, int, (char * /*template*/, int /*flags*/) _GL_ARG_NONNULL ((1))); # endif _GL_CXXALIAS_SYS (mkostemp, int, (char * /*template*/, int /*flags*/)); _GL_CXXALIASWARN (mkostemp); #elif defined GNULIB_POSIXCHECK # undef mkostemp # if HAVE_RAW_DECL_MKOSTEMP _GL_WARN_ON_USE (mkostemp, "mkostemp is unportable - " "use gnulib module mkostemp for portability"); # endif #endif #if @GNULIB_MKOSTEMPS@ /* Create a unique temporary file from TEMPLATE. The last six characters of TEMPLATE before a suffix of length SUFFIXLEN must be "XXXXXX"; they are replaced with a string that makes the file name unique. The flags are a bitmask, possibly including O_CLOEXEC (defined in ) and O_TEXT, O_BINARY (defined in "binary-io.h"). The file is then created, with the specified flags, ensuring it didn't exist before. The file is created read-write (mask at least 0600 & ~umask), but it may be world-readable and world-writable (mask 0666 & ~umask), depending on the implementation. Returns the open file descriptor if successful, otherwise -1 and errno set. */ # if !@HAVE_MKOSTEMPS@ _GL_FUNCDECL_SYS (mkostemps, int, (char * /*template*/, int /*suffixlen*/, int /*flags*/) _GL_ARG_NONNULL ((1))); # endif _GL_CXXALIAS_SYS (mkostemps, int, (char * /*template*/, int /*suffixlen*/, int /*flags*/)); _GL_CXXALIASWARN (mkostemps); #elif defined GNULIB_POSIXCHECK # undef mkostemps # if HAVE_RAW_DECL_MKOSTEMPS _GL_WARN_ON_USE (mkostemps, "mkostemps is unportable - " "use gnulib module mkostemps for portability"); # endif #endif #if @GNULIB_MKSTEMP@ /* Create a unique temporary file from TEMPLATE. The last six characters of TEMPLATE must be "XXXXXX"; they are replaced with a string that makes the file name unique. The file is then created, ensuring it didn't exist before. The file is created read-write (mask at least 0600 & ~umask), but it may be world-readable and world-writable (mask 0666 & ~umask), depending on the implementation. Returns the open file descriptor if successful, otherwise -1 and errno set. */ # if @REPLACE_MKSTEMP@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # define mkstemp rpl_mkstemp # endif _GL_FUNCDECL_RPL (mkstemp, int, (char * /*template*/) _GL_ARG_NONNULL ((1))); _GL_CXXALIAS_RPL (mkstemp, int, (char * /*template*/)); # else # if ! @HAVE_MKSTEMP@ _GL_FUNCDECL_SYS (mkstemp, int, (char * /*template*/) _GL_ARG_NONNULL ((1))); # endif _GL_CXXALIAS_SYS (mkstemp, int, (char * /*template*/)); # endif _GL_CXXALIASWARN (mkstemp); #elif defined GNULIB_POSIXCHECK # undef mkstemp # if HAVE_RAW_DECL_MKSTEMP _GL_WARN_ON_USE (mkstemp, "mkstemp is unportable - " "use gnulib module mkstemp for portability"); # endif #endif #if @GNULIB_MKSTEMPS@ /* Create a unique temporary file from TEMPLATE. The last six characters of TEMPLATE prior to a suffix of length SUFFIXLEN must be "XXXXXX"; they are replaced with a string that makes the file name unique. The file is then created, ensuring it didn't exist before. The file is created read-write (mask at least 0600 & ~umask), but it may be world-readable and world-writable (mask 0666 & ~umask), depending on the implementation. Returns the open file descriptor if successful, otherwise -1 and errno set. */ # if !@HAVE_MKSTEMPS@ _GL_FUNCDECL_SYS (mkstemps, int, (char * /*template*/, int /*suffixlen*/) _GL_ARG_NONNULL ((1))); # endif _GL_CXXALIAS_SYS (mkstemps, int, (char * /*template*/, int /*suffixlen*/)); _GL_CXXALIASWARN (mkstemps); #elif defined GNULIB_POSIXCHECK # undef mkstemps # if HAVE_RAW_DECL_MKSTEMPS _GL_WARN_ON_USE (mkstemps, "mkstemps is unportable - " "use gnulib module mkstemps for portability"); # endif #endif #if @GNULIB_POSIX_OPENPT@ /* Return an FD open to the master side of a pseudo-terminal. Flags should include O_RDWR, and may also include O_NOCTTY. */ # if !@HAVE_POSIX_OPENPT@ _GL_FUNCDECL_SYS (posix_openpt, int, (int flags)); # endif _GL_CXXALIAS_SYS (posix_openpt, int, (int flags)); _GL_CXXALIASWARN (posix_openpt); #elif defined GNULIB_POSIXCHECK # undef posix_openpt # if HAVE_RAW_DECL_POSIX_OPENPT _GL_WARN_ON_USE (posix_openpt, "posix_openpt is not portable - " "use gnulib module posix_openpt for portability"); # endif #endif #if @GNULIB_PTSNAME@ /* Return the pathname of the pseudo-terminal slave associated with the master FD is open on, or NULL on errors. */ # if @REPLACE_PTSNAME@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef ptsname # define ptsname rpl_ptsname # endif _GL_FUNCDECL_RPL (ptsname, char *, (int fd)); _GL_CXXALIAS_RPL (ptsname, char *, (int fd)); # else # if !@HAVE_PTSNAME@ _GL_FUNCDECL_SYS (ptsname, char *, (int fd)); # endif _GL_CXXALIAS_SYS (ptsname, char *, (int fd)); # endif _GL_CXXALIASWARN (ptsname); #elif defined GNULIB_POSIXCHECK # undef ptsname # if HAVE_RAW_DECL_PTSNAME _GL_WARN_ON_USE (ptsname, "ptsname is not portable - " "use gnulib module ptsname for portability"); # endif #endif #if @GNULIB_PTSNAME_R@ /* Set the pathname of the pseudo-terminal slave associated with the master FD is open on and return 0, or set errno and return non-zero on errors. */ # if @REPLACE_PTSNAME_R@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef ptsname_r # define ptsname_r rpl_ptsname_r # endif _GL_FUNCDECL_RPL (ptsname_r, int, (int fd, char *buf, size_t len)); _GL_CXXALIAS_RPL (ptsname_r, int, (int fd, char *buf, size_t len)); # else # if !@HAVE_PTSNAME_R@ _GL_FUNCDECL_SYS (ptsname_r, int, (int fd, char *buf, size_t len)); # endif _GL_CXXALIAS_SYS (ptsname_r, int, (int fd, char *buf, size_t len)); # endif # ifndef GNULIB_defined_ptsname_r # define GNULIB_defined_ptsname_r (!@HAVE_PTSNAME_R@ || @REPLACE_PTSNAME_R@) # endif _GL_CXXALIASWARN (ptsname_r); #elif defined GNULIB_POSIXCHECK # undef ptsname_r # if HAVE_RAW_DECL_PTSNAME_R _GL_WARN_ON_USE (ptsname_r, "ptsname_r is not portable - " "use gnulib module ptsname_r for portability"); # endif #endif #if @GNULIB_PUTENV@ # if @REPLACE_PUTENV@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef putenv # define putenv rpl_putenv # endif _GL_FUNCDECL_RPL (putenv, int, (char *string) _GL_ARG_NONNULL ((1))); _GL_CXXALIAS_RPL (putenv, int, (char *string)); # else _GL_CXXALIAS_SYS (putenv, int, (char *string)); # endif _GL_CXXALIASWARN (putenv); #endif #if @GNULIB_QSORT_R@ /* Sort an array of NMEMB elements, starting at address BASE, each element occupying SIZE bytes, in ascending order according to the comparison function COMPARE. */ # if @REPLACE_QSORT_R@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef qsort_r # define qsort_r rpl_qsort_r # endif _GL_FUNCDECL_RPL (qsort_r, void, (void *base, size_t nmemb, size_t size, int (*compare) (void const *, void const *, void *), void *arg) _GL_ARG_NONNULL ((1, 4))); _GL_CXXALIAS_RPL (qsort_r, void, (void *base, size_t nmemb, size_t size, int (*compare) (void const *, void const *, void *), void *arg)); # else # if !@HAVE_QSORT_R@ _GL_FUNCDECL_SYS (qsort_r, void, (void *base, size_t nmemb, size_t size, int (*compare) (void const *, void const *, void *), void *arg) _GL_ARG_NONNULL ((1, 4))); # endif _GL_CXXALIAS_SYS (qsort_r, void, (void *base, size_t nmemb, size_t size, int (*compare) (void const *, void const *, void *), void *arg)); # endif _GL_CXXALIASWARN (qsort_r); #elif defined GNULIB_POSIXCHECK # undef qsort_r # if HAVE_RAW_DECL_QSORT_R _GL_WARN_ON_USE (qsort_r, "qsort_r is not portable - " "use gnulib module qsort_r for portability"); # endif #endif #if @GNULIB_RANDOM_R@ # if !@HAVE_RANDOM_R@ # ifndef RAND_MAX # define RAND_MAX 2147483647 # endif # endif #endif #if @GNULIB_RANDOM@ # if @REPLACE_RANDOM@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef random # define random rpl_random # endif _GL_FUNCDECL_RPL (random, long, (void)); _GL_CXXALIAS_RPL (random, long, (void)); # else # if !@HAVE_RANDOM@ _GL_FUNCDECL_SYS (random, long, (void)); # endif /* Need to cast, because on Haiku, the return type is int. */ _GL_CXXALIAS_SYS_CAST (random, long, (void)); # endif _GL_CXXALIASWARN (random); #elif defined GNULIB_POSIXCHECK # undef random # if HAVE_RAW_DECL_RANDOM _GL_WARN_ON_USE (random, "random is unportable - " "use gnulib module random for portability"); # endif #endif #if @GNULIB_RANDOM@ # if @REPLACE_RANDOM@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef srandom # define srandom rpl_srandom # endif _GL_FUNCDECL_RPL (srandom, void, (unsigned int seed)); _GL_CXXALIAS_RPL (srandom, void, (unsigned int seed)); # else # if !@HAVE_RANDOM@ _GL_FUNCDECL_SYS (srandom, void, (unsigned int seed)); # endif /* Need to cast, because on FreeBSD, the first parameter is unsigned long seed. */ _GL_CXXALIAS_SYS_CAST (srandom, void, (unsigned int seed)); # endif _GL_CXXALIASWARN (srandom); #elif defined GNULIB_POSIXCHECK # undef srandom # if HAVE_RAW_DECL_SRANDOM _GL_WARN_ON_USE (srandom, "srandom is unportable - " "use gnulib module random for portability"); # endif #endif #if @GNULIB_RANDOM@ # if @REPLACE_INITSTATE@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef initstate # define initstate rpl_initstate # endif _GL_FUNCDECL_RPL (initstate, char *, (unsigned int seed, char *buf, size_t buf_size) _GL_ARG_NONNULL ((2))); _GL_CXXALIAS_RPL (initstate, char *, (unsigned int seed, char *buf, size_t buf_size)); # else # if !@HAVE_INITSTATE@ || !@HAVE_DECL_INITSTATE@ _GL_FUNCDECL_SYS (initstate, char *, (unsigned int seed, char *buf, size_t buf_size) _GL_ARG_NONNULL ((2))); # endif /* Need to cast, because on FreeBSD, the first parameter is unsigned long seed. */ _GL_CXXALIAS_SYS_CAST (initstate, char *, (unsigned int seed, char *buf, size_t buf_size)); # endif _GL_CXXALIASWARN (initstate); #elif defined GNULIB_POSIXCHECK # undef initstate # if HAVE_RAW_DECL_INITSTATE _GL_WARN_ON_USE (initstate, "initstate is unportable - " "use gnulib module random for portability"); # endif #endif #if @GNULIB_RANDOM@ # if @REPLACE_SETSTATE@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef setstate # define setstate rpl_setstate # endif _GL_FUNCDECL_RPL (setstate, char *, (char *arg_state) _GL_ARG_NONNULL ((1))); _GL_CXXALIAS_RPL (setstate, char *, (char *arg_state)); # else # if !@HAVE_SETSTATE@ || !@HAVE_DECL_SETSTATE@ _GL_FUNCDECL_SYS (setstate, char *, (char *arg_state) _GL_ARG_NONNULL ((1))); # endif /* Need to cast, because on Mac OS X 10.13, HP-UX, Solaris the first parameter is const char *arg_state. */ _GL_CXXALIAS_SYS_CAST (setstate, char *, (char *arg_state)); # endif _GL_CXXALIASWARN (setstate); #elif defined GNULIB_POSIXCHECK # undef setstate # if HAVE_RAW_DECL_SETSTATE _GL_WARN_ON_USE (setstate, "setstate is unportable - " "use gnulib module random for portability"); # endif #endif #if @GNULIB_RANDOM_R@ # if @REPLACE_RANDOM_R@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef random_r # define random_r rpl_random_r # endif _GL_FUNCDECL_RPL (random_r, int, (struct random_data *buf, int32_t *result) _GL_ARG_NONNULL ((1, 2))); _GL_CXXALIAS_RPL (random_r, int, (struct random_data *buf, int32_t *result)); # else # if !@HAVE_RANDOM_R@ _GL_FUNCDECL_SYS (random_r, int, (struct random_data *buf, int32_t *result) _GL_ARG_NONNULL ((1, 2))); # endif _GL_CXXALIAS_SYS (random_r, int, (struct random_data *buf, int32_t *result)); # endif _GL_CXXALIASWARN (random_r); #elif defined GNULIB_POSIXCHECK # undef random_r # if HAVE_RAW_DECL_RANDOM_R _GL_WARN_ON_USE (random_r, "random_r is unportable - " "use gnulib module random_r for portability"); # endif #endif #if @GNULIB_RANDOM_R@ # if @REPLACE_RANDOM_R@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef srandom_r # define srandom_r rpl_srandom_r # endif _GL_FUNCDECL_RPL (srandom_r, int, (unsigned int seed, struct random_data *rand_state) _GL_ARG_NONNULL ((2))); _GL_CXXALIAS_RPL (srandom_r, int, (unsigned int seed, struct random_data *rand_state)); # else # if !@HAVE_RANDOM_R@ _GL_FUNCDECL_SYS (srandom_r, int, (unsigned int seed, struct random_data *rand_state) _GL_ARG_NONNULL ((2))); # endif _GL_CXXALIAS_SYS (srandom_r, int, (unsigned int seed, struct random_data *rand_state)); # endif _GL_CXXALIASWARN (srandom_r); #elif defined GNULIB_POSIXCHECK # undef srandom_r # if HAVE_RAW_DECL_SRANDOM_R _GL_WARN_ON_USE (srandom_r, "srandom_r is unportable - " "use gnulib module random_r for portability"); # endif #endif #if @GNULIB_RANDOM_R@ # if @REPLACE_RANDOM_R@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef initstate_r # define initstate_r rpl_initstate_r # endif _GL_FUNCDECL_RPL (initstate_r, int, (unsigned int seed, char *buf, size_t buf_size, struct random_data *rand_state) _GL_ARG_NONNULL ((2, 4))); _GL_CXXALIAS_RPL (initstate_r, int, (unsigned int seed, char *buf, size_t buf_size, struct random_data *rand_state)); # else # if !@HAVE_RANDOM_R@ _GL_FUNCDECL_SYS (initstate_r, int, (unsigned int seed, char *buf, size_t buf_size, struct random_data *rand_state) _GL_ARG_NONNULL ((2, 4))); # endif /* Need to cast, because on Haiku, the third parameter is unsigned long buf_size. */ _GL_CXXALIAS_SYS_CAST (initstate_r, int, (unsigned int seed, char *buf, size_t buf_size, struct random_data *rand_state)); # endif _GL_CXXALIASWARN (initstate_r); #elif defined GNULIB_POSIXCHECK # undef initstate_r # if HAVE_RAW_DECL_INITSTATE_R _GL_WARN_ON_USE (initstate_r, "initstate_r is unportable - " "use gnulib module random_r for portability"); # endif #endif #if @GNULIB_RANDOM_R@ # if @REPLACE_RANDOM_R@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef setstate_r # define setstate_r rpl_setstate_r # endif _GL_FUNCDECL_RPL (setstate_r, int, (char *arg_state, struct random_data *rand_state) _GL_ARG_NONNULL ((1, 2))); _GL_CXXALIAS_RPL (setstate_r, int, (char *arg_state, struct random_data *rand_state)); # else # if !@HAVE_RANDOM_R@ _GL_FUNCDECL_SYS (setstate_r, int, (char *arg_state, struct random_data *rand_state) _GL_ARG_NONNULL ((1, 2))); # endif /* Need to cast, because on Haiku, the first parameter is void *arg_state. */ _GL_CXXALIAS_SYS_CAST (setstate_r, int, (char *arg_state, struct random_data *rand_state)); # endif _GL_CXXALIASWARN (setstate_r); #elif defined GNULIB_POSIXCHECK # undef setstate_r # if HAVE_RAW_DECL_SETSTATE_R _GL_WARN_ON_USE (setstate_r, "setstate_r is unportable - " "use gnulib module random_r for portability"); # endif #endif #if @GNULIB_REALLOC_POSIX@ # if @REPLACE_REALLOC@ # if !((defined __cplusplus && defined GNULIB_NAMESPACE) \ || _GL_USE_STDLIB_ALLOC) # undef realloc # define realloc rpl_realloc # endif _GL_FUNCDECL_RPL (realloc, void *, (void *ptr, size_t size)); _GL_CXXALIAS_RPL (realloc, void *, (void *ptr, size_t size)); # else _GL_CXXALIAS_SYS (realloc, void *, (void *ptr, size_t size)); # endif # if __GLIBC__ >= 2 _GL_CXXALIASWARN (realloc); # endif #elif defined GNULIB_POSIXCHECK && !_GL_USE_STDLIB_ALLOC # undef realloc /* Assume realloc is always declared. */ _GL_WARN_ON_USE (realloc, "realloc is not POSIX compliant everywhere - " "use gnulib module realloc-posix for portability"); #endif #if @GNULIB_REALLOCARRAY@ # if ! @HAVE_REALLOCARRAY@ _GL_FUNCDECL_SYS (reallocarray, void *, (void *ptr, size_t nmemb, size_t size)); # endif _GL_CXXALIAS_SYS (reallocarray, void *, (void *ptr, size_t nmemb, size_t size)); _GL_CXXALIASWARN (reallocarray); #elif defined GNULIB_POSIXCHECK # undef reallocarray # if HAVE_RAW_DECL_REALLOCARRAY _GL_WARN_ON_USE (reallocarray, "reallocarray is not portable - " "use gnulib module reallocarray for portability"); # endif #endif #if @GNULIB_REALPATH@ # if @REPLACE_REALPATH@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # define realpath rpl_realpath # endif _GL_FUNCDECL_RPL (realpath, char *, (const char *restrict name, char *restrict resolved) _GL_ARG_NONNULL ((1))); _GL_CXXALIAS_RPL (realpath, char *, (const char *restrict name, char *restrict resolved)); # else # if !@HAVE_REALPATH@ _GL_FUNCDECL_SYS (realpath, char *, (const char *restrict name, char *restrict resolved) _GL_ARG_NONNULL ((1))); # endif _GL_CXXALIAS_SYS (realpath, char *, (const char *restrict name, char *restrict resolved)); # endif _GL_CXXALIASWARN (realpath); #elif defined GNULIB_POSIXCHECK # undef realpath # if HAVE_RAW_DECL_REALPATH _GL_WARN_ON_USE (realpath, "realpath is unportable - use gnulib module " "canonicalize or canonicalize-lgpl for portability"); # endif #endif #if @GNULIB_RPMATCH@ /* Test a user response to a question. Return 1 if it is affirmative, 0 if it is negative, or -1 if not clear. */ # if !@HAVE_RPMATCH@ _GL_FUNCDECL_SYS (rpmatch, int, (const char *response) _GL_ARG_NONNULL ((1))); # endif _GL_CXXALIAS_SYS (rpmatch, int, (const char *response)); _GL_CXXALIASWARN (rpmatch); #elif defined GNULIB_POSIXCHECK # undef rpmatch # if HAVE_RAW_DECL_RPMATCH _GL_WARN_ON_USE (rpmatch, "rpmatch is unportable - " "use gnulib module rpmatch for portability"); # endif #endif #if @GNULIB_SECURE_GETENV@ /* Look up NAME in the environment, returning 0 in insecure situations. */ # if !@HAVE_SECURE_GETENV@ _GL_FUNCDECL_SYS (secure_getenv, char *, (char const *name) _GL_ARG_NONNULL ((1))); # endif _GL_CXXALIAS_SYS (secure_getenv, char *, (char const *name)); _GL_CXXALIASWARN (secure_getenv); #elif defined GNULIB_POSIXCHECK # undef secure_getenv # if HAVE_RAW_DECL_SECURE_GETENV _GL_WARN_ON_USE (secure_getenv, "secure_getenv is unportable - " "use gnulib module secure_getenv for portability"); # endif #endif #if @GNULIB_SETENV@ /* Set NAME to VALUE in the environment. If REPLACE is nonzero, overwrite an existing value. */ # if @REPLACE_SETENV@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef setenv # define setenv rpl_setenv # endif _GL_FUNCDECL_RPL (setenv, int, (const char *name, const char *value, int replace) _GL_ARG_NONNULL ((1))); _GL_CXXALIAS_RPL (setenv, int, (const char *name, const char *value, int replace)); # else # if !@HAVE_DECL_SETENV@ _GL_FUNCDECL_SYS (setenv, int, (const char *name, const char *value, int replace) _GL_ARG_NONNULL ((1))); # endif _GL_CXXALIAS_SYS (setenv, int, (const char *name, const char *value, int replace)); # endif # if !(@REPLACE_SETENV@ && !@HAVE_DECL_SETENV@) _GL_CXXALIASWARN (setenv); # endif #elif defined GNULIB_POSIXCHECK # undef setenv # if HAVE_RAW_DECL_SETENV _GL_WARN_ON_USE (setenv, "setenv is unportable - " "use gnulib module setenv for portability"); # endif #endif #if @GNULIB_STRTOD@ /* Parse a double from STRING, updating ENDP if appropriate. */ # if @REPLACE_STRTOD@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # define strtod rpl_strtod # endif # define GNULIB_defined_strtod_function 1 _GL_FUNCDECL_RPL (strtod, double, (const char *restrict str, char **restrict endp) _GL_ARG_NONNULL ((1))); _GL_CXXALIAS_RPL (strtod, double, (const char *restrict str, char **restrict endp)); # else # if !@HAVE_STRTOD@ _GL_FUNCDECL_SYS (strtod, double, (const char *restrict str, char **restrict endp) _GL_ARG_NONNULL ((1))); # endif _GL_CXXALIAS_SYS (strtod, double, (const char *restrict str, char **restrict endp)); # endif # if __GLIBC__ >= 2 _GL_CXXALIASWARN (strtod); # endif #elif defined GNULIB_POSIXCHECK # undef strtod # if HAVE_RAW_DECL_STRTOD _GL_WARN_ON_USE (strtod, "strtod is unportable - " "use gnulib module strtod for portability"); # endif #endif #if @GNULIB_STRTOLD@ /* Parse a 'long double' from STRING, updating ENDP if appropriate. */ # if @REPLACE_STRTOLD@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # define strtold rpl_strtold # endif # define GNULIB_defined_strtold_function 1 _GL_FUNCDECL_RPL (strtold, long double, (const char *restrict str, char **restrict endp) _GL_ARG_NONNULL ((1))); _GL_CXXALIAS_RPL (strtold, long double, (const char *restrict str, char **restrict endp)); # else # if !@HAVE_STRTOLD@ _GL_FUNCDECL_SYS (strtold, long double, (const char *restrict str, char **restrict endp) _GL_ARG_NONNULL ((1))); # endif _GL_CXXALIAS_SYS (strtold, long double, (const char *restrict str, char **restrict endp)); # endif _GL_CXXALIASWARN (strtold); #elif defined GNULIB_POSIXCHECK # undef strtold # if HAVE_RAW_DECL_STRTOLD _GL_WARN_ON_USE (strtold, "strtold is unportable - " "use gnulib module strtold for portability"); # endif #endif #if @GNULIB_STRTOLL@ /* Parse a signed integer whose textual representation starts at STRING. The integer is expected to be in base BASE (2 <= BASE <= 36); if BASE == 0, it may be decimal or octal (with prefix "0") or hexadecimal (with prefix "0x"). If ENDPTR is not NULL, the address of the first byte after the integer is stored in *ENDPTR. Upon overflow, the return value is LLONG_MAX or LLONG_MIN, and errno is set to ERANGE. */ # if !@HAVE_STRTOLL@ _GL_FUNCDECL_SYS (strtoll, long long, (const char *restrict string, char **restrict endptr, int base) _GL_ARG_NONNULL ((1))); # endif _GL_CXXALIAS_SYS (strtoll, long long, (const char *restrict string, char **restrict endptr, int base)); _GL_CXXALIASWARN (strtoll); #elif defined GNULIB_POSIXCHECK # undef strtoll # if HAVE_RAW_DECL_STRTOLL _GL_WARN_ON_USE (strtoll, "strtoll is unportable - " "use gnulib module strtoll for portability"); # endif #endif #if @GNULIB_STRTOULL@ /* Parse an unsigned integer whose textual representation starts at STRING. The integer is expected to be in base BASE (2 <= BASE <= 36); if BASE == 0, it may be decimal or octal (with prefix "0") or hexadecimal (with prefix "0x"). If ENDPTR is not NULL, the address of the first byte after the integer is stored in *ENDPTR. Upon overflow, the return value is ULLONG_MAX, and errno is set to ERANGE. */ # if !@HAVE_STRTOULL@ _GL_FUNCDECL_SYS (strtoull, unsigned long long, (const char *restrict string, char **restrict endptr, int base) _GL_ARG_NONNULL ((1))); # endif _GL_CXXALIAS_SYS (strtoull, unsigned long long, (const char *restrict string, char **restrict endptr, int base)); _GL_CXXALIASWARN (strtoull); #elif defined GNULIB_POSIXCHECK # undef strtoull # if HAVE_RAW_DECL_STRTOULL _GL_WARN_ON_USE (strtoull, "strtoull is unportable - " "use gnulib module strtoull for portability"); # endif #endif #if @GNULIB_UNLOCKPT@ /* Unlock the slave side of the pseudo-terminal whose master side is specified by FD, so that it can be opened. */ # if !@HAVE_UNLOCKPT@ _GL_FUNCDECL_SYS (unlockpt, int, (int fd)); # endif _GL_CXXALIAS_SYS (unlockpt, int, (int fd)); _GL_CXXALIASWARN (unlockpt); #elif defined GNULIB_POSIXCHECK # undef unlockpt # if HAVE_RAW_DECL_UNLOCKPT _GL_WARN_ON_USE (unlockpt, "unlockpt is not portable - " "use gnulib module unlockpt for portability"); # endif #endif #if @GNULIB_UNSETENV@ /* Remove the variable NAME from the environment. */ # if @REPLACE_UNSETENV@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef unsetenv # define unsetenv rpl_unsetenv # endif _GL_FUNCDECL_RPL (unsetenv, int, (const char *name) _GL_ARG_NONNULL ((1))); _GL_CXXALIAS_RPL (unsetenv, int, (const char *name)); # else # if !@HAVE_DECL_UNSETENV@ _GL_FUNCDECL_SYS (unsetenv, int, (const char *name) _GL_ARG_NONNULL ((1))); # endif _GL_CXXALIAS_SYS (unsetenv, int, (const char *name)); # endif # if !(@REPLACE_UNSETENV@ && !@HAVE_DECL_UNSETENV@) _GL_CXXALIASWARN (unsetenv); # endif #elif defined GNULIB_POSIXCHECK # undef unsetenv # if HAVE_RAW_DECL_UNSETENV _GL_WARN_ON_USE (unsetenv, "unsetenv is unportable - " "use gnulib module unsetenv for portability"); # endif #endif /* Convert a wide character to a multibyte character. */ #if @GNULIB_WCTOMB@ # if @REPLACE_WCTOMB@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef wctomb # define wctomb rpl_wctomb # endif _GL_FUNCDECL_RPL (wctomb, int, (char *s, wchar_t wc)); _GL_CXXALIAS_RPL (wctomb, int, (char *s, wchar_t wc)); # else _GL_CXXALIAS_SYS (wctomb, int, (char *s, wchar_t wc)); # endif # if __GLIBC__ >= 2 _GL_CXXALIASWARN (wctomb); # endif #endif #endif /* _@GUARD_PREFIX@_STDLIB_H */ #endif /* _@GUARD_PREFIX@_STDLIB_H */ #endif pspp-1.4.1/gl/memmem.c0000644000175000017500000000524113723215637014151 0ustar00blpblp00000000000000/* Copyright (C) 1991-1994, 1996-1998, 2000, 2004, 2007-2020 Free Software Foundation, Inc. This file is part of the GNU C Library. 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 3, 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, see . */ /* This particular implementation was written by Eric Blake, 2008. */ #ifndef _LIBC # include #endif /* Specification of memmem. */ #include #define RETURN_TYPE void * #define AVAILABLE(h, h_l, j, n_l) ((j) <= (h_l) - (n_l)) #include "str-two-way.h" /* Return the first occurrence of NEEDLE in HAYSTACK. Return HAYSTACK if NEEDLE_LEN is 0, otherwise NULL if NEEDLE is not found in HAYSTACK. */ void * memmem (const void *haystack_start, size_t haystack_len, const void *needle_start, size_t needle_len) { /* Abstract memory is considered to be an array of 'unsigned char' values, not an array of 'char' values. See ISO C 99 section 6.2.6.1. */ const unsigned char *haystack = (const unsigned char *) haystack_start; const unsigned char *needle = (const unsigned char *) needle_start; if (needle_len == 0) /* The first occurrence of the empty string is deemed to occur at the beginning of the string. */ return (void *) haystack; /* Sanity check, otherwise the loop might search through the whole memory. */ if (__builtin_expect (haystack_len < needle_len, 0)) return NULL; /* Use optimizations in memchr when possible, to reduce the search size of haystack using a linear algorithm with a smaller coefficient. However, avoid memchr for long needles, since we can often achieve sublinear performance. */ if (needle_len < LONG_NEEDLE_THRESHOLD) { haystack = memchr (haystack, *needle, haystack_len); if (!haystack || __builtin_expect (needle_len == 1, 0)) return (void *) haystack; haystack_len -= haystack - (const unsigned char *) haystack_start; if (haystack_len < needle_len) return NULL; return two_way_short_needle (haystack, haystack_len, needle, needle_len); } else return two_way_long_needle (haystack, haystack_len, needle, needle_len); } #undef LONG_NEEDLE_THRESHOLD pspp-1.4.1/gl/gl_linkedhash_list.h0000644000175000017500000000222213723215637016524 0ustar00blpblp00000000000000/* Sequential list data type implemented by a hash table with a linked list. Copyright (C) 2006, 2009-2020 Free Software Foundation, Inc. Written by Bruno Haible , 2006. 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 3 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, see . */ #ifndef _GL_LINKEDHASH_LIST_H #define _GL_LINKEDHASH_LIST_H #include "gl_list.h" #ifdef __cplusplus extern "C" { #endif extern const struct gl_list_implementation gl_linkedhash_list_implementation; #define GL_LINKEDHASH_LIST &gl_linkedhash_list_implementation #ifdef __cplusplus } #endif #endif /* _GL_LINKEDHASH_LIST_H */ pspp-1.4.1/gl/sockets.c0000644000175000017500000001017113723215640014337 0ustar00blpblp00000000000000/* sockets.c --- wrappers for Windows socket functions Copyright (C) 2008-2020 Free Software Foundation, Inc. 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 3 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, see . */ /* Written by Simon Josefsson */ #include /* Specification. */ #include "sockets.h" #if WINDOWS_SOCKETS /* This includes winsock2.h on MinGW. */ # include # include "fd-hook.h" # if GNULIB_MSVC_NOTHROW # include "msvc-nothrow.h" # else # include # endif /* Get set_winsock_errno, FD_TO_SOCKET etc. */ # include "w32sock.h" static int close_fd_maybe_socket (const struct fd_hook *remaining_list, gl_close_fn primary, int fd) { /* Note about multithread-safety: There is a race condition where, between our calls to closesocket() and the primary close(), some other thread could make system calls that allocate precisely the same HANDLE value as sock; then the primary close() would call CloseHandle() on it. */ SOCKET sock; WSANETWORKEVENTS ev; /* Test whether fd refers to a socket. */ sock = FD_TO_SOCKET (fd); ev.lNetworkEvents = 0xDEADBEEF; WSAEnumNetworkEvents (sock, NULL, &ev); if (ev.lNetworkEvents != 0xDEADBEEF) { /* fd refers to a socket. */ /* FIXME: other applications, like squid, use an undocumented _free_osfhnd free function. But this is not enough: The 'osfile' flags for fd also needs to be cleared, but it is hard to access it. Instead, here we just close twice the file descriptor. */ if (closesocket (sock)) { set_winsock_errno (); return -1; } else { /* This call frees the file descriptor and does a CloseHandle ((HANDLE) _get_osfhandle (fd)), which fails. */ _close (fd); return 0; } } else /* Some other type of file descriptor. */ return execute_close_hooks (remaining_list, primary, fd); } static int ioctl_fd_maybe_socket (const struct fd_hook *remaining_list, gl_ioctl_fn primary, int fd, int request, void *arg) { SOCKET sock; WSANETWORKEVENTS ev; /* Test whether fd refers to a socket. */ sock = FD_TO_SOCKET (fd); ev.lNetworkEvents = 0xDEADBEEF; WSAEnumNetworkEvents (sock, NULL, &ev); if (ev.lNetworkEvents != 0xDEADBEEF) { /* fd refers to a socket. */ if (ioctlsocket (sock, request, arg) < 0) { set_winsock_errno (); return -1; } else return 0; } else /* Some other type of file descriptor. */ return execute_ioctl_hooks (remaining_list, primary, fd, request, arg); } static struct fd_hook fd_sockets_hook; static int initialized_sockets_version /* = 0 */; #endif /* WINDOWS_SOCKETS */ int gl_sockets_startup (int version _GL_UNUSED) { #if WINDOWS_SOCKETS if (version > initialized_sockets_version) { WSADATA data; int err; err = WSAStartup (version, &data); if (err != 0) return 1; if (data.wVersion != version) { WSACleanup (); return 2; } if (initialized_sockets_version == 0) register_fd_hook (close_fd_maybe_socket, ioctl_fd_maybe_socket, &fd_sockets_hook); initialized_sockets_version = version; } #endif return 0; } int gl_sockets_cleanup (void) { #if WINDOWS_SOCKETS int err; initialized_sockets_version = 0; unregister_fd_hook (&fd_sockets_hook); err = WSACleanup (); if (err != 0) return 1; #endif return 0; } pspp-1.4.1/gl/full-read.h0000644000175000017500000000206113723215636014550 0ustar00blpblp00000000000000/* An interface to read() that reads all it is asked to read. Copyright (C) 2002, 2009-2020 Free Software Foundation, Inc. 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 3 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, see . */ #include /* Read COUNT bytes at BUF to descriptor FD, retrying if interrupted or if partial reads occur. Return the number of bytes successfully read, setting errno if that is less than COUNT. errno = 0 means EOF. */ extern size_t full_read (int fd, void *buf, size_t count); pspp-1.4.1/gl/printf-frexp.h0000644000175000017500000000206113723215640015314 0ustar00blpblp00000000000000/* Split a double into fraction and mantissa, for hexadecimal printf. Copyright (C) 2007, 2009-2020 Free Software Foundation, Inc. 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 3 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, see . */ /* Write a finite, positive number x as x = mantissa * 2^exp where exp >= DBL_MIN_EXP - 1, mantissa < 2.0, if x is not a denormalized number then mantissa >= 1.0. Store exp in *EXPPTR and return mantissa. */ extern double printf_frexp (double x, int *expptr); pspp-1.4.1/gl/xreadlink.c0000644000175000017500000000270113723215640014645 0ustar00blpblp00000000000000/* xreadlink.c -- readlink wrapper to return the link name in malloc'd storage Copyright (C) 2001, 2003-2007, 2009-2020 Free Software Foundation, Inc. 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 3 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, see . */ /* Written by Jim Meyering and Bruno Haible . */ #include /* Specification. */ #include "xreadlink.h" #include #include "areadlink.h" #include "xalloc.h" /* Call readlink to get the symbolic link value of FILENAME. Return a pointer to that NUL-terminated string in malloc'd storage. If readlink fails, return NULL and set errno. If realloc fails, or if the link value is longer than SIZE_MAX :-), give a diagnostic and exit. */ char * xreadlink (char const *filename) { char *result = areadlink (filename); if (result == NULL && errno == ENOMEM) xalloc_die (); return result; } pspp-1.4.1/gl/dup2.c0000644000175000017500000000771713723215636013557 0ustar00blpblp00000000000000/* Duplicate an open file descriptor to a specified file descriptor. Copyright (C) 1999, 2004-2007, 2009-2020 Free Software Foundation, Inc. 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 3 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, see . */ /* written by Paul Eggert */ #include /* Specification. */ #include #include #include #undef dup2 #if defined _WIN32 && ! defined __CYGWIN__ /* Get declarations of the native Windows API functions. */ # define WIN32_LEAN_AND_MEAN # include # if HAVE_MSVC_INVALID_PARAMETER_HANDLER # include "msvc-inval.h" # endif /* Get _get_osfhandle. */ # if GNULIB_MSVC_NOTHROW # include "msvc-nothrow.h" # else # include # endif # if HAVE_MSVC_INVALID_PARAMETER_HANDLER static int dup2_nothrow (int fd, int desired_fd) { int result; TRY_MSVC_INVAL { result = dup2 (fd, desired_fd); } CATCH_MSVC_INVAL { errno = EBADF; result = -1; } DONE_MSVC_INVAL; return result; } # else # define dup2_nothrow dup2 # endif static int ms_windows_dup2 (int fd, int desired_fd) { int result; /* If fd is closed, mingw hangs on dup2 (fd, fd). If fd is open, dup2 (fd, fd) returns 0, but all further attempts to use fd in future dup2 calls will hang. */ if (fd == desired_fd) { if ((HANDLE) _get_osfhandle (fd) == INVALID_HANDLE_VALUE) { errno = EBADF; return -1; } return fd; } /* Wine 1.0.1 return 0 when desired_fd is negative but not -1: https://bugs.winehq.org/show_bug.cgi?id=21289 */ if (desired_fd < 0) { errno = EBADF; return -1; } result = dup2_nothrow (fd, desired_fd); if (result == 0) result = desired_fd; return result; } # define dup2 ms_windows_dup2 #elif defined __KLIBC__ # include static int klibc_dup2dirfd (int fd, int desired_fd) { int tempfd; int dupfd; tempfd = open ("NUL", O_RDONLY); if (tempfd == -1) return -1; if (tempfd == desired_fd) { close (tempfd); char path[_MAX_PATH]; if (__libc_Back_ioFHToPath (fd, path, sizeof (path))) return -1; return open(path, O_RDONLY); } dupfd = klibc_dup2dirfd (fd, desired_fd); close (tempfd); return dupfd; } static int klibc_dup2 (int fd, int desired_fd) { int dupfd; struct stat sbuf; dupfd = dup2 (fd, desired_fd); if (dupfd == -1 && errno == ENOTSUP \ && !fstat (fd, &sbuf) && S_ISDIR (sbuf.st_mode)) { close (desired_fd); return klibc_dup2dirfd (fd, desired_fd); } return dupfd; } # define dup2 klibc_dup2 #endif int rpl_dup2 (int fd, int desired_fd) { int result; #ifdef F_GETFL /* On Linux kernels 2.6.26-2.6.29, dup2 (fd, fd) returns -EBADF. On Cygwin 1.5.x, dup2 (1, 1) returns 0. On Cygwin 1.7.17, dup2 (1, -1) dumps core. On Cygwin 1.7.25, dup2 (1, 256) can dump core. On Haiku, dup2 (fd, fd) mistakenly clears FD_CLOEXEC. */ # if HAVE_SETDTABLESIZE setdtablesize (desired_fd + 1); # endif if (desired_fd < 0) fd = desired_fd; if (fd == desired_fd) return fcntl (fd, F_GETFL) == -1 ? -1 : fd; #endif result = dup2 (fd, desired_fd); /* Correct an errno value on FreeBSD 6.1 and Cygwin 1.5.x. */ if (result == -1 && errno == EMFILE) errno = EBADF; #if REPLACE_FCHDIR if (fd != desired_fd && result != -1) result = _gl_register_dup (fd, result); #endif return result; } pspp-1.4.1/gl/xsize.h0000644000175000017500000000671613723215640014045 0ustar00blpblp00000000000000/* xsize.h -- Checked size_t computations. Copyright (C) 2003, 2008-2020 Free Software Foundation, Inc. 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 3, 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, see . */ #ifndef _XSIZE_H #define _XSIZE_H /* Get size_t. */ #include /* Get SIZE_MAX. */ #include #if HAVE_STDINT_H # include #endif /* Get ATTRIBUTE_PURE. */ #include "attribute.h" #ifndef _GL_INLINE_HEADER_BEGIN #error "Please include config.h first." #endif _GL_INLINE_HEADER_BEGIN #ifndef XSIZE_INLINE # define XSIZE_INLINE _GL_INLINE #endif /* The size of memory objects is often computed through expressions of type size_t. Example: void* p = malloc (header_size + n * element_size). These computations can lead to overflow. When this happens, malloc() returns a piece of memory that is way too small, and the program then crashes while attempting to fill the memory. To avoid this, the functions and macros in this file check for overflow. The convention is that SIZE_MAX represents overflow. malloc (SIZE_MAX) is not guaranteed to fail -- think of a malloc implementation that uses mmap --, it's recommended to use size_overflow_p() or size_in_bounds_p() before invoking malloc(). The example thus becomes: size_t size = xsum (header_size, xtimes (n, element_size)); void *p = (size_in_bounds_p (size) ? malloc (size) : NULL); */ /* Convert an arbitrary value >= 0 to type size_t. */ #define xcast_size_t(N) \ ((N) <= SIZE_MAX ? (size_t) (N) : SIZE_MAX) /* Sum of two sizes, with overflow check. */ XSIZE_INLINE size_t ATTRIBUTE_PURE xsum (size_t size1, size_t size2) { size_t sum = size1 + size2; return (sum >= size1 ? sum : SIZE_MAX); } /* Sum of three sizes, with overflow check. */ XSIZE_INLINE size_t ATTRIBUTE_PURE xsum3 (size_t size1, size_t size2, size_t size3) { return xsum (xsum (size1, size2), size3); } /* Sum of four sizes, with overflow check. */ XSIZE_INLINE size_t ATTRIBUTE_PURE xsum4 (size_t size1, size_t size2, size_t size3, size_t size4) { return xsum (xsum (xsum (size1, size2), size3), size4); } /* Maximum of two sizes, with overflow check. */ XSIZE_INLINE size_t ATTRIBUTE_PURE xmax (size_t size1, size_t size2) { /* No explicit check is needed here, because for any n: max (SIZE_MAX, n) == SIZE_MAX and max (n, SIZE_MAX) == SIZE_MAX. */ return (size1 >= size2 ? size1 : size2); } /* Multiplication of a count with an element size, with overflow check. The count must be >= 0 and the element size must be > 0. This is a macro, not a function, so that it works correctly even when N is of a wider type and N > SIZE_MAX. */ #define xtimes(N, ELSIZE) \ ((N) <= SIZE_MAX / (ELSIZE) ? (size_t) (N) * (ELSIZE) : SIZE_MAX) /* Check for overflow. */ #define size_overflow_p(SIZE) \ ((SIZE) == SIZE_MAX) /* Check against overflow. */ #define size_in_bounds_p(SIZE) \ ((SIZE) != SIZE_MAX) _GL_INLINE_HEADER_END #endif /* _XSIZE_H */ pspp-1.4.1/gl/fprintf.c0000644000175000017500000000336513723215636014350 0ustar00blpblp00000000000000/* Formatted output to a stream. Copyright (C) 2004, 2006-2020 Free Software Foundation, Inc. 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 3 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, see . */ #ifdef HAVE_CONFIG_H # include #endif /* Specification. */ #include #include #include #include #include #include "fseterr.h" #include "vasnprintf.h" /* Print formatted output to the stream FP. Return string length of formatted string. On error, return a negative value. */ int fprintf (FILE *fp, const char *format, ...) { char buf[2000]; char *output; size_t len; size_t lenbuf = sizeof (buf); va_list args; va_start (args, format); output = vasnprintf (buf, &lenbuf, format, args); len = lenbuf; va_end (args); if (!output) { fseterr (fp); return -1; } if (fwrite (output, 1, len, fp) < len) { if (output != buf) { int saved_errno = errno; free (output); errno = saved_errno; } return -1; } if (output != buf) free (output); if (len > INT_MAX) { errno = EOVERFLOW; fseterr (fp); return -1; } return len; } pspp-1.4.1/gl/c-strtod.h0000644000175000017500000000364313723215636014443 0ustar00blpblp00000000000000/* Convert string to double, using the C locale. -*- coding: utf-8 -*- Copyright (C) 2003-2004, 2009-2020 Free Software Foundation, Inc. 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 3 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, see . */ #ifdef __cplusplus extern "C" { #endif /* Parse the initial portion of the string pointed to by NPTR as a floating- point number (in decimal or hexadecimal notation), like in the C locale: accepting only the ASCII digits '0'..'9', and only '.' as decimal point character. If ENDPTR is not NULL, set *ENDPTR to point to the first byte beyond the parsed number or to NPTR if the string does not start with a parsable number. Return value: - If successful, return the value as a double or 'long double', respectively, and don't modify errno. - In case of overflow, return ±HUGE_VAL or ±HUGE_VALL, respectively, and set errno to ERANGE. - In case of underflow, return a value very near to 0 and set errno to ERANGE. - If the string does not start with a number at all, return 0 (and recall that if ENDPTR != NULL, *ENDPTR is set to NPTR), and maybe set errno to EINVAL. - In case of other error, return 0 and set errno, for example to ENOMEM. */ extern double c_strtod (char const *nptr, char **endptr); extern long double c_strtold (char const *nptr, char **endptr); #ifdef __cplusplus } #endif pspp-1.4.1/gl/tmpdir.c0000644000175000017500000001032513723215640014164 0ustar00blpblp00000000000000/* Copyright (C) 1999, 2001-2002, 2006, 2009-2020 Free Software Foundation, Inc. This file is part of the GNU C Library. 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 3 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, see . */ /* Extracted from sysdeps/posix/tempname.c. */ #include /* Specification. */ #include "tmpdir.h" #include #include #include #include #ifndef __set_errno # define __set_errno(Val) errno = (Val) #endif #include #ifndef P_tmpdir # ifdef _P_tmpdir /* native Windows */ # define P_tmpdir _P_tmpdir # else # define P_tmpdir "/tmp" # endif #endif #include #if defined _WIN32 && ! defined __CYGWIN__ # define WIN32_LEAN_AND_MEAN /* avoid including junk */ # include #endif #include "pathmax.h" #if defined _WIN32 && ! defined __CYGWIN__ /* Don't assume that UNICODE is not defined. */ # undef GetTempPath # define GetTempPath GetTempPathA #endif #if _LIBC # define struct_stat64 struct stat64 #else # define struct_stat64 struct stat # define __libc_secure_getenv secure_getenv # define __xstat64(version, path, buf) stat (path, buf) #endif /* Pathname support. ISSLASH(C) tests whether C is a directory separator character. */ #if defined _WIN32 || defined __CYGWIN__ || defined __EMX__ || defined __DJGPP__ /* Native Windows, Cygwin, OS/2, DOS */ # define ISSLASH(C) ((C) == '/' || (C) == '\\') #else /* Unix */ # define ISSLASH(C) ((C) == '/') #endif /* Return nonzero if DIR is an existent directory. */ static bool direxists (const char *dir) { struct_stat64 buf; return __xstat64 (_STAT_VER, dir, &buf) == 0 && S_ISDIR (buf.st_mode); } /* Path search algorithm, for tmpnam, tmpfile, etc. If DIR is non-null and exists, uses it; otherwise uses the first of $TMPDIR, P_tmpdir, /tmp that exists. Copies into TMPL a template suitable for use with mk[s]temp. Will fail (-1) if DIR is non-null and doesn't exist, none of the searched dirs exists, or there's not enough space in TMPL. */ int path_search (char *tmpl, size_t tmpl_len, const char *dir, const char *pfx, bool try_tmpdir) { const char *d; size_t dlen, plen; bool add_slash; if (!pfx || !pfx[0]) { pfx = "file"; plen = 4; } else { plen = strlen (pfx); if (plen > 5) plen = 5; } if (try_tmpdir) { d = __libc_secure_getenv ("TMPDIR"); if (d != NULL && direxists (d)) dir = d; else if (dir != NULL && direxists (dir)) /* nothing */ ; else dir = NULL; } if (dir == NULL) { #if defined _WIN32 && ! defined __CYGWIN__ char dirbuf[PATH_MAX]; DWORD retval; /* Find Windows temporary file directory. We try this before P_tmpdir because Windows defines P_tmpdir to "\\" and will therefore try to put all temporary files in the root directory (unless $TMPDIR is set). */ retval = GetTempPath (PATH_MAX, dirbuf); if (retval > 0 && retval < PATH_MAX && direxists (dirbuf)) dir = dirbuf; else #endif if (direxists (P_tmpdir)) dir = P_tmpdir; else if (strcmp (P_tmpdir, "/tmp") != 0 && direxists ("/tmp")) dir = "/tmp"; else { __set_errno (ENOENT); return -1; } } dlen = strlen (dir); #ifdef __VMS add_slash = 0; #else add_slash = dlen != 0 && !ISSLASH (dir[dlen - 1]); #endif /* check we have room for "${dir}/${pfx}XXXXXX\0" */ if (tmpl_len < dlen + add_slash + plen + 6 + 1) { __set_errno (EINVAL); return -1; } memcpy (tmpl, dir, dlen); sprintf (tmpl + dlen, &"/%.*sXXXXXX"[!add_slash], (int) plen, pfx); return 0; } pspp-1.4.1/gl/rmdir.c0000644000175000017500000000303613723215640014003 0ustar00blpblp00000000000000/* Work around rmdir bugs. Copyright (C) 1988, 1990, 1999, 2003-2006, 2009-2020 Free Software Foundation, Inc. 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 3 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, see . */ #include #include #include #include #include "filename.h" #undef rmdir /* Remove directory DIR. Return 0 if successful, -1 if not. */ int rpl_rmdir (char const *dir) { /* Work around cygwin 1.5.x bug where rmdir("dir/./") succeeds. */ size_t len = strlen (dir); int result; while (len && ISSLASH (dir[len - 1])) len--; if (len && dir[len - 1] == '.' && (1 == len || ISSLASH (dir[len - 2]))) { errno = EINVAL; return -1; } result = rmdir (dir); /* Work around mingw bug, where rmdir("file/") fails with EINVAL instead of ENOTDIR. We've already filtered out trailing ., the only reason allowed by POSIX for EINVAL. */ if (result == -1 && errno == EINVAL) errno = ENOTDIR; return result; } pspp-1.4.1/gl/dirname.c0000644000175000017500000000226413723215636014314 0ustar00blpblp00000000000000/* dirname.c -- return all but the last element in a file name Copyright (C) 1990, 1998, 2000-2001, 2003-2006, 2009-2020 Free Software Foundation, Inc. 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 3 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, see . */ #include #include "dirname.h" #include #include #include "xalloc.h" /* Just like mdir_name (dirname-lgpl.c), except, rather than returning NULL upon malloc failure, here, we report the "memory exhausted" condition and exit. */ char * dir_name (char const *file) { char *result = mdir_name (file); if (!result) xalloc_die (); return result; } pspp-1.4.1/gl/windows-rwlock.c0000644000175000017500000002723213723215640015663 0ustar00blpblp00000000000000/* Read-write locks (native Windows implementation). Copyright (C) 2005-2020 Free Software Foundation, Inc. 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 3, 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, see . */ /* Written by Bruno Haible , 2005. Based on GCC's gthr-win32.h. */ #include /* Specification. */ #include "windows-rwlock.h" #include #include /* Don't assume that UNICODE is not defined. */ #undef CreateEvent #define CreateEvent CreateEventA /* In this file, the waitqueues are implemented as circular arrays. */ #define glwthread_waitqueue_t glwthread_carray_waitqueue_t static void glwthread_waitqueue_init (glwthread_waitqueue_t *wq) { wq->array = NULL; wq->count = 0; wq->alloc = 0; wq->offset = 0; } /* Enqueues the current thread, represented by an event, in a wait queue. Returns INVALID_HANDLE_VALUE if an allocation failure occurs. */ static HANDLE glwthread_waitqueue_add (glwthread_waitqueue_t *wq) { HANDLE event; unsigned int index; if (wq->count == wq->alloc) { unsigned int new_alloc = 2 * wq->alloc + 1; HANDLE *new_array = (HANDLE *) realloc (wq->array, new_alloc * sizeof (HANDLE)); if (new_array == NULL) /* No more memory. */ return INVALID_HANDLE_VALUE; /* Now is a good opportunity to rotate the array so that its contents starts at offset 0. */ if (wq->offset > 0) { unsigned int old_count = wq->count; unsigned int old_alloc = wq->alloc; unsigned int old_offset = wq->offset; unsigned int i; if (old_offset + old_count > old_alloc) { unsigned int limit = old_offset + old_count - old_alloc; for (i = 0; i < limit; i++) new_array[old_alloc + i] = new_array[i]; } for (i = 0; i < old_count; i++) new_array[i] = new_array[old_offset + i]; wq->offset = 0; } wq->array = new_array; wq->alloc = new_alloc; } /* Whether the created event is a manual-reset one or an auto-reset one, does not matter, since we will wait on it only once. */ event = CreateEvent (NULL, TRUE, FALSE, NULL); if (event == INVALID_HANDLE_VALUE) /* No way to allocate an event. */ return INVALID_HANDLE_VALUE; index = wq->offset + wq->count; if (index >= wq->alloc) index -= wq->alloc; wq->array[index] = event; wq->count++; return event; } /* Notifies the first thread from a wait queue and dequeues it. */ static void glwthread_waitqueue_notify_first (glwthread_waitqueue_t *wq) { SetEvent (wq->array[wq->offset + 0]); wq->offset++; wq->count--; if (wq->count == 0 || wq->offset == wq->alloc) wq->offset = 0; } /* Notifies all threads from a wait queue and dequeues them all. */ static void glwthread_waitqueue_notify_all (glwthread_waitqueue_t *wq) { unsigned int i; for (i = 0; i < wq->count; i++) { unsigned int index = wq->offset + i; if (index >= wq->alloc) index -= wq->alloc; SetEvent (wq->array[index]); } wq->count = 0; wq->offset = 0; } void glwthread_rwlock_init (glwthread_rwlock_t *lock) { InitializeCriticalSection (&lock->lock); glwthread_waitqueue_init (&lock->waiting_readers); glwthread_waitqueue_init (&lock->waiting_writers); lock->runcount = 0; lock->guard.done = 1; } int glwthread_rwlock_rdlock (glwthread_rwlock_t *lock) { if (!lock->guard.done) { if (InterlockedIncrement (&lock->guard.started) == 0) /* This thread is the first one to need this lock. Initialize it. */ glwthread_rwlock_init (lock); else { /* Don't let lock->guard.started grow and wrap around. */ InterlockedDecrement (&lock->guard.started); /* Yield the CPU while waiting for another thread to finish initializing this lock. */ while (!lock->guard.done) Sleep (0); } } EnterCriticalSection (&lock->lock); /* Test whether only readers are currently running, and whether the runcount field will not overflow, and whether no writer is waiting. The latter condition is because POSIX recommends that "write locks shall take precedence over read locks", to avoid "writer starvation". */ if (!(lock->runcount + 1 > 0 && lock->waiting_writers.count == 0)) { /* This thread has to wait for a while. Enqueue it among the waiting_readers. */ HANDLE event = glwthread_waitqueue_add (&lock->waiting_readers); if (event != INVALID_HANDLE_VALUE) { DWORD result; LeaveCriticalSection (&lock->lock); /* Wait until another thread signals this event. */ result = WaitForSingleObject (event, INFINITE); if (result == WAIT_FAILED || result == WAIT_TIMEOUT) abort (); CloseHandle (event); /* The thread which signalled the event already did the bookkeeping: removed us from the waiting_readers, incremented lock->runcount. */ if (!(lock->runcount > 0)) abort (); return 0; } else { /* Allocation failure. Weird. */ do { LeaveCriticalSection (&lock->lock); Sleep (1); EnterCriticalSection (&lock->lock); } while (!(lock->runcount + 1 > 0)); } } lock->runcount++; LeaveCriticalSection (&lock->lock); return 0; } int glwthread_rwlock_wrlock (glwthread_rwlock_t *lock) { if (!lock->guard.done) { if (InterlockedIncrement (&lock->guard.started) == 0) /* This thread is the first one to need this lock. Initialize it. */ glwthread_rwlock_init (lock); else { /* Don't let lock->guard.started grow and wrap around. */ InterlockedDecrement (&lock->guard.started); /* Yield the CPU while waiting for another thread to finish initializing this lock. */ while (!lock->guard.done) Sleep (0); } } EnterCriticalSection (&lock->lock); /* Test whether no readers or writers are currently running. */ if (!(lock->runcount == 0)) { /* This thread has to wait for a while. Enqueue it among the waiting_writers. */ HANDLE event = glwthread_waitqueue_add (&lock->waiting_writers); if (event != INVALID_HANDLE_VALUE) { DWORD result; LeaveCriticalSection (&lock->lock); /* Wait until another thread signals this event. */ result = WaitForSingleObject (event, INFINITE); if (result == WAIT_FAILED || result == WAIT_TIMEOUT) abort (); CloseHandle (event); /* The thread which signalled the event already did the bookkeeping: removed us from the waiting_writers, set lock->runcount = -1. */ if (!(lock->runcount == -1)) abort (); return 0; } else { /* Allocation failure. Weird. */ do { LeaveCriticalSection (&lock->lock); Sleep (1); EnterCriticalSection (&lock->lock); } while (!(lock->runcount == 0)); } } lock->runcount--; /* runcount becomes -1 */ LeaveCriticalSection (&lock->lock); return 0; } int glwthread_rwlock_tryrdlock (glwthread_rwlock_t *lock) { if (!lock->guard.done) { if (InterlockedIncrement (&lock->guard.started) == 0) /* This thread is the first one to need this lock. Initialize it. */ glwthread_rwlock_init (lock); else { /* Don't let lock->guard.started grow and wrap around. */ InterlockedDecrement (&lock->guard.started); /* Yield the CPU while waiting for another thread to finish initializing this lock. */ while (!lock->guard.done) Sleep (0); } } /* It's OK to wait for this critical section, because it is never taken for a long time. */ EnterCriticalSection (&lock->lock); /* Test whether only readers are currently running, and whether the runcount field will not overflow, and whether no writer is waiting. The latter condition is because POSIX recommends that "write locks shall take precedence over read locks", to avoid "writer starvation". */ if (!(lock->runcount + 1 > 0 && lock->waiting_writers.count == 0)) { /* This thread would have to wait for a while. Return instead. */ LeaveCriticalSection (&lock->lock); return EBUSY; } lock->runcount++; LeaveCriticalSection (&lock->lock); return 0; } int glwthread_rwlock_trywrlock (glwthread_rwlock_t *lock) { if (!lock->guard.done) { if (InterlockedIncrement (&lock->guard.started) == 0) /* This thread is the first one to need this lock. Initialize it. */ glwthread_rwlock_init (lock); else { /* Don't let lock->guard.started grow and wrap around. */ InterlockedDecrement (&lock->guard.started); /* Yield the CPU while waiting for another thread to finish initializing this lock. */ while (!lock->guard.done) Sleep (0); } } /* It's OK to wait for this critical section, because it is never taken for a long time. */ EnterCriticalSection (&lock->lock); /* Test whether no readers or writers are currently running. */ if (!(lock->runcount == 0)) { /* This thread would have to wait for a while. Return instead. */ LeaveCriticalSection (&lock->lock); return EBUSY; } lock->runcount--; /* runcount becomes -1 */ LeaveCriticalSection (&lock->lock); return 0; } int glwthread_rwlock_unlock (glwthread_rwlock_t *lock) { if (!lock->guard.done) return EINVAL; EnterCriticalSection (&lock->lock); if (lock->runcount < 0) { /* Drop a writer lock. */ if (!(lock->runcount == -1)) abort (); lock->runcount = 0; } else { /* Drop a reader lock. */ if (!(lock->runcount > 0)) { LeaveCriticalSection (&lock->lock); return EPERM; } lock->runcount--; } if (lock->runcount == 0) { /* POSIX recommends that "write locks shall take precedence over read locks", to avoid "writer starvation". */ if (lock->waiting_writers.count > 0) { /* Wake up one of the waiting writers. */ lock->runcount--; glwthread_waitqueue_notify_first (&lock->waiting_writers); } else { /* Wake up all waiting readers. */ lock->runcount += lock->waiting_readers.count; glwthread_waitqueue_notify_all (&lock->waiting_readers); } } LeaveCriticalSection (&lock->lock); return 0; } int glwthread_rwlock_destroy (glwthread_rwlock_t *lock) { if (!lock->guard.done) return EINVAL; if (lock->runcount != 0) return EBUSY; DeleteCriticalSection (&lock->lock); if (lock->waiting_readers.array != NULL) free (lock->waiting_readers.array); if (lock->waiting_writers.array != NULL) free (lock->waiting_writers.array); lock->guard.done = 0; return 0; } pspp-1.4.1/gl/uninorm.in.h0000644000175000017500000002444113723215640014772 0ustar00blpblp00000000000000/* Normalization forms (composition and decomposition) of Unicode strings. Copyright (C) 2001-2002, 2009-2020 Free Software Foundation, Inc. Written by Bruno Haible , 2009. 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 3 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, see . */ #ifndef _UNINORM_H #define _UNINORM_H /* Get size_t. */ #include #include "unitypes.h" #ifdef __cplusplus extern "C" { #endif /* Conventions: All functions prefixed with u8_ operate on UTF-8 encoded strings. Their unit is an uint8_t (1 byte). All functions prefixed with u16_ operate on UTF-16 encoded strings. Their unit is an uint16_t (a 2-byte word). All functions prefixed with u32_ operate on UCS-4 encoded strings. Their unit is an uint32_t (a 4-byte word). All argument pairs (s, n) denote a Unicode string s[0..n-1] with exactly n units. Functions returning a string result take a (resultbuf, lengthp) argument pair. If resultbuf is not NULL and the result fits into *lengthp units, it is put in resultbuf, and resultbuf is returned. Otherwise, a freshly allocated string is returned. In both cases, *lengthp is set to the length (number of units) of the returned string. In case of error, NULL is returned and errno is set. */ enum { UC_DECOMP_CANONICAL,/* Canonical decomposition. */ UC_DECOMP_FONT, /* A font variant (e.g. a blackletter form). */ UC_DECOMP_NOBREAK, /* A no-break version of a space or hyphen. */ UC_DECOMP_INITIAL, /* An initial presentation form (Arabic). */ UC_DECOMP_MEDIAL, /* A medial presentation form (Arabic). */ UC_DECOMP_FINAL, /* A final presentation form (Arabic). */ UC_DECOMP_ISOLATED,/* An isolated presentation form (Arabic). */ UC_DECOMP_CIRCLE, /* An encircled form. */ UC_DECOMP_SUPER, /* A superscript form. */ UC_DECOMP_SUB, /* A subscript form. */ UC_DECOMP_VERTICAL,/* A vertical layout presentation form. */ UC_DECOMP_WIDE, /* A wide (or zenkaku) compatibility character. */ UC_DECOMP_NARROW, /* A narrow (or hankaku) compatibility character. */ UC_DECOMP_SMALL, /* A small variant form (CNS compatibility). */ UC_DECOMP_SQUARE, /* A CJK squared font variant. */ UC_DECOMP_FRACTION,/* A vulgar fraction form. */ UC_DECOMP_COMPAT /* Otherwise unspecified compatibility character. */ }; /* Maximum size of decomposition of a single Unicode character. */ #define UC_DECOMPOSITION_MAX_LENGTH 32 /* Return the character decomposition mapping of a Unicode character. DECOMPOSITION must point to an array of at least UC_DECOMPOSITION_MAX_LENGTH ucs_t elements. When a decomposition exists, DECOMPOSITION[0..N-1] and *DECOMP_TAG are filled and N is returned. Otherwise -1 is returned. */ extern int uc_decomposition (ucs4_t uc, int *decomp_tag, ucs4_t *decomposition); /* Return the canonical character decomposition mapping of a Unicode character. DECOMPOSITION must point to an array of at least UC_DECOMPOSITION_MAX_LENGTH ucs_t elements. When a decomposition exists, DECOMPOSITION[0..N-1] is filled and N is returned. Otherwise -1 is returned. */ extern int uc_canonical_decomposition (ucs4_t uc, ucs4_t *decomposition); /* Attempt to combine the Unicode characters uc1, uc2. uc1 is known to have canonical combining class 0. Return the combination of uc1 and uc2, if it exists. Return 0 otherwise. Not all decompositions can be recombined using this function. See the Unicode file CompositionExclusions.txt for details. */ extern ucs4_t uc_composition (ucs4_t uc1, ucs4_t uc2) _UC_ATTRIBUTE_CONST; /* An object of type uninorm_t denotes a Unicode normalization form. */ struct unicode_normalization_form; typedef const struct unicode_normalization_form *uninorm_t; /* UNINORM_NFD: Normalization form D: canonical decomposition. */ extern const struct unicode_normalization_form uninorm_nfd; #define UNINORM_NFD (&uninorm_nfd) /* UNINORM_NFC: Normalization form C: canonical decomposition, then canonical composition. */ extern const struct unicode_normalization_form uninorm_nfc; #define UNINORM_NFC (&uninorm_nfc) /* UNINORM_NFKD: Normalization form KD: compatibility decomposition. */ extern const struct unicode_normalization_form uninorm_nfkd; #define UNINORM_NFKD (&uninorm_nfkd) /* UNINORM_NFKC: Normalization form KC: compatibility decomposition, then canonical composition. */ extern const struct unicode_normalization_form uninorm_nfkc; #define UNINORM_NFKC (&uninorm_nfkc) /* Test whether a normalization form does compatibility decomposition. */ #define uninorm_is_compat_decomposing(nf) \ ((* (const unsigned int *) (nf) >> 0) & 1) /* Test whether a normalization form includes canonical composition. */ #define uninorm_is_composing(nf) \ ((* (const unsigned int *) (nf) >> 1) & 1) /* Return the decomposing variant of a normalization form. This maps NFC,NFD -> NFD and NFKC,NFKD -> NFKD. */ extern uninorm_t uninorm_decomposing_form (uninorm_t nf) _UC_ATTRIBUTE_PURE; /* Return the specified normalization form of a string. */ extern uint8_t * u8_normalize (uninorm_t nf, const uint8_t *s, size_t n, uint8_t *_UC_RESTRICT resultbuf, size_t *lengthp); extern uint16_t * u16_normalize (uninorm_t nf, const uint16_t *s, size_t n, uint16_t *_UC_RESTRICT resultbuf, size_t *lengthp); extern uint32_t * u32_normalize (uninorm_t nf, const uint32_t *s, size_t n, uint32_t *_UC_RESTRICT resultbuf, size_t *lengthp); /* Compare S1 and S2, ignoring differences in normalization. NF must be either UNINORM_NFD or UNINORM_NFKD. If successful, set *RESULTP to -1 if S1 < S2, 0 if S1 = S2, 1 if S1 > S2, and return 0. Upon failure, return -1 with errno set. */ extern int u8_normcmp (const uint8_t *s1, size_t n1, const uint8_t *s2, size_t n2, uninorm_t nf, int *resultp); extern int u16_normcmp (const uint16_t *s1, size_t n1, const uint16_t *s2, size_t n2, uninorm_t nf, int *resultp); extern int u32_normcmp (const uint32_t *s1, size_t n1, const uint32_t *s2, size_t n2, uninorm_t nf, int *resultp); /* Converts the string S of length N to a NUL-terminated byte sequence, in such a way that comparing uN_normxfrm (S1) and uN_normxfrm (S2) with uN_cmp2() is equivalent to comparing S1 and S2 with uN_normcoll(). NF must be either UNINORM_NFC or UNINORM_NFKC. */ extern char * u8_normxfrm (const uint8_t *s, size_t n, uninorm_t nf, char *resultbuf, size_t *lengthp); extern char * u16_normxfrm (const uint16_t *s, size_t n, uninorm_t nf, char *resultbuf, size_t *lengthp); extern char * u32_normxfrm (const uint32_t *s, size_t n, uninorm_t nf, char *resultbuf, size_t *lengthp); /* Compare S1 and S2, ignoring differences in normalization, using the collation rules of the current locale. NF must be either UNINORM_NFC or UNINORM_NFKC. If successful, set *RESULTP to -1 if S1 < S2, 0 if S1 = S2, 1 if S1 > S2, and return 0. Upon failure, return -1 with errno set. */ extern int u8_normcoll (const uint8_t *s1, size_t n1, const uint8_t *s2, size_t n2, uninorm_t nf, int *resultp); extern int u16_normcoll (const uint16_t *s1, size_t n1, const uint16_t *s2, size_t n2, uninorm_t nf, int *resultp); extern int u32_normcoll (const uint32_t *s1, size_t n1, const uint32_t *s2, size_t n2, uninorm_t nf, int *resultp); /* Normalization of a stream of Unicode characters. A "stream of Unicode characters" is essentially a function that accepts an ucs4_t argument repeatedly, optionally combined with a function that "flushes" the stream. */ /* Data type of a stream of Unicode characters that normalizes its input according to a given normalization form and passes the normalized character sequence to the encapsulated stream of Unicode characters. */ struct uninorm_filter; /* Create and return a normalization filter for Unicode characters. The pair (stream_func, stream_data) is the encapsulated stream. stream_func (stream_data, uc) receives the Unicode character uc and returns 0 if successful, or -1 with errno set upon failure. Return the new filter, or NULL with errno set upon failure. */ extern struct uninorm_filter * uninorm_filter_create (uninorm_t nf, int (*stream_func) (void *stream_data, ucs4_t uc), void *stream_data); /* Stuff a Unicode character into a normalizing filter. Return 0 if successful, or -1 with errno set upon failure. */ extern int uninorm_filter_write (struct uninorm_filter *filter, ucs4_t uc); /* Bring data buffered in the filter to its destination, the encapsulated stream. Return 0 if successful, or -1 with errno set upon failure. Note! If after calling this function, additional characters are written into the filter, the resulting character sequence in the encapsulated stream will not necessarily be normalized. */ extern int uninorm_filter_flush (struct uninorm_filter *filter); /* Bring data buffered in the filter to its destination, the encapsulated stream, then close and free the filter. Return 0 if successful, or -1 with errno set upon failure. */ extern int uninorm_filter_free (struct uninorm_filter *filter); #ifdef __cplusplus } #endif #endif /* _UNINORM_H */ pspp-1.4.1/gl/crc.h0000644000175000017500000000365013723215636013451 0ustar00blpblp00000000000000/* crc.h -- cyclic redundancy checks Copyright (C) 2005, 2009-2020 Free Software Foundation, Inc. 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 3 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, see . */ /* Written by Simon Josefsson. */ #ifndef CRC_H # define CRC_H 1 #include #include /* Compute CRC-32 value of LEN bytes long BUF, and return it. */ extern uint32_t crc32 (const char *buf, size_t len); /* Incrementally update CRC-32 value CRC using LEN bytes long BUF. In the first call, use 0 as the value for CRC. Return the updated CRC-32 value. */ extern uint32_t crc32_update (uint32_t crc, const char *buf, size_t len); /* Compute modified-CRC-32 value of LEN bytes long BUF, and return it. The "modification" is to avoid the initial and final XOR operation. Due to historic implementation errors, this variant is sometimes used (i.e., in RFC 3961). */ extern uint32_t crc32_no_xor (const char *buf, size_t len); /* Incrementally update modified-CRC-32 value CRC using LEN bytes long BUF. In the first call, use 0 as the value for CRC. Return the updated modified-CRC-32 value. The "modification" is to avoid the initial and final XOR operation. Due to historic implementation errors, this variant is sometimes used (i.e., in RFC 3961). */ extern uint32_t crc32_update_no_xor (uint32_t crc, const char *buf, size_t len); #endif /* CRC_H */ pspp-1.4.1/gl/gl_linked_list.h0000644000175000017500000000215013723215637015660 0ustar00blpblp00000000000000/* Sequential list data type implemented by a linked list. Copyright (C) 2006, 2009-2020 Free Software Foundation, Inc. Written by Bruno Haible , 2006. 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 3 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, see . */ #ifndef _GL_LINKED_LIST_H #define _GL_LINKED_LIST_H #include "gl_list.h" #ifdef __cplusplus extern "C" { #endif extern const struct gl_list_implementation gl_linked_list_implementation; #define GL_LINKED_LIST &gl_linked_list_implementation #ifdef __cplusplus } #endif #endif /* _GL_LINKED_LIST_H */ pspp-1.4.1/gl/c-vasnprintf.c0000644000175000017500000000237213723215636015307 0ustar00blpblp00000000000000/* Formatted output to strings in C locale. Copyright (C) 2009-2020 Free Software Foundation, Inc. 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 3 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, see . */ #include #include #include "printf-parse.h" #define VASNPRINTF c_vasnprintf #define FCHAR_T char #define DCHAR_T char #define DIRECTIVE char_directive #define DIRECTIVES char_directives #define PRINTF_PARSE printf_parse #define DCHAR_CPY memcpy #define DCHAR_SET memset #define DCHAR_IS_TCHAR 1 #define TCHAR_T char #define NEED_PRINTF_DOUBLE 1 #define NEED_PRINTF_LONG_DOUBLE 1 #define decimal_point_char_defined 1 static char decimal_point_char (void) { return '.'; } #include "vasnprintf.c" pspp-1.4.1/gl/snprintf.c0000644000175000017500000000352413723215640014533 0ustar00blpblp00000000000000/* Formatted output to strings. Copyright (C) 2004, 2006-2020 Free Software Foundation, Inc. Written by Simon Josefsson and Paul Eggert. 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 3, 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, see . */ #include /* Specification. */ #include #include #include #include #include #include #include "vasnprintf.h" /* Print formatted output to string STR. Similar to sprintf, but additional length SIZE limit how much is written into STR. Returns string length of formatted string (which may be larger than SIZE). STR may be NULL, in which case nothing will be written. On error, return a negative value. */ int snprintf (char *str, size_t size, const char *format, ...) { char *output; size_t len; size_t lenbuf = size; va_list args; va_start (args, format); output = vasnprintf (str, &lenbuf, format, args); len = lenbuf; va_end (args); if (!output) return -1; if (output != str) { if (size) { size_t pruned_len = (len < size ? len : size - 1); memcpy (str, output, pruned_len); str[pruned_len] = '\0'; } free (output); } if (INT_MAX < len) { errno = EOVERFLOW; return -1; } return len; } pspp-1.4.1/gl/c-vasnprintf.h0000644000175000017500000000442513723215636015315 0ustar00blpblp00000000000000/* vsprintf with automatic memory allocation in C locale. Copyright (C) 2002-2004, 2007-2020 Free Software Foundation, Inc. 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 3, 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, see . */ #ifndef _C_VASNPRINTF_H #define _C_VASNPRINTF_H /* Get va_list. */ #include /* Get size_t. */ #include #ifdef __cplusplus extern "C" { #endif /* Write formatted output to a string dynamically allocated with malloc(). You can pass a preallocated buffer for the result in RESULTBUF and its size in *LENGTHP; otherwise you pass RESULTBUF = NULL. If successful, return the address of the string (this may be = RESULTBUF if no dynamic memory allocation was necessary) and set *LENGTHP to the number of resulting bytes, excluding the trailing NUL. Upon error, set errno and return NULL. When dynamic memory allocation occurs, the preallocated buffer is left alone (with possibly modified contents). This makes it possible to use a statically allocated or stack-allocated buffer, like this: char buf[100]; size_t len = sizeof (buf); char *output = vasnprintf (buf, &len, format, args); if (output == NULL) ... error handling ...; else { ... use the output string ...; if (output != buf) free (output); } Formatting takes place in the C locale, that is, the decimal point used in floating-point formatting directives is always '.'. */ extern char *c_vasnprintf (char *restrict resultbuf, size_t *lengthp, const char *format, va_list args) _GL_ATTRIBUTE_FORMAT ((__printf__, 3, 0)); #ifdef __cplusplus } #endif #endif /* _C_VASNPRINTF_H */ pspp-1.4.1/gl/sockets.h0000644000175000017500000000315313723215640014346 0ustar00blpblp00000000000000/* sockets.h - wrappers for Windows socket functions Copyright (C) 2008-2020 Free Software Foundation, Inc. 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 3 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, see . */ /* Written by Simon Josefsson */ #ifndef SOCKETS_H #define SOCKETS_H 1 #define SOCKETS_1_0 0x0001 #define SOCKETS_1_1 0x0101 #define SOCKETS_2_0 0x0002 #define SOCKETS_2_1 0x0102 #define SOCKETS_2_2 0x0202 int gl_sockets_startup (int version) #ifndef WINDOWS_SOCKETS _GL_ATTRIBUTE_CONST #endif ; int gl_sockets_cleanup (void) #ifndef WINDOWS_SOCKETS _GL_ATTRIBUTE_CONST #endif ; /* This function is useful it you create a socket using gnulib's Winsock wrappers but needs to pass on the socket handle to some other library that only accepts sockets. */ #ifdef WINDOWS_SOCKETS # include # if GNULIB_MSVC_NOTHROW # include "msvc-nothrow.h" # else # include # endif static inline SOCKET gl_fd_to_handle (int fd) { return _get_osfhandle (fd); } #else # define gl_fd_to_handle(x) (x) #endif /* WINDOWS_SOCKETS */ #endif /* SOCKETS_H */ pspp-1.4.1/gl/imaxtostr.c0000644000175000017500000000011213723215637014716 0ustar00blpblp00000000000000#define anytostr imaxtostr #define inttype intmax_t #include "anytostr.c" pspp-1.4.1/gl/Makefile.in0000644000175000017500000077371513725007421014607 0ustar00blpblp00000000000000# Makefile.in generated by automake 1.16.2 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2020 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # Copyright (C) 2002-2020 Free Software Foundation, Inc. # # This file 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 3 of the License, or # (at your option) any later version. # # This file 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 file. If not, see . # # As a special exception to the GNU General Public License, # this file may be distributed as part of a program that # contains a configuration script generated by Autoconf, under # the same distribution terms as the rest of that program. # # Generated by gnulib-tool. # Reproduce by: # gnulib-tool --import \ # --lib=libgl \ # --source-base=gl \ # --m4-base=gl/m4 \ # --doc-base=gl/doc \ # --tests-base=tests \ # --aux-dir=build-aux \ # --no-conditional-dependencies \ # --libtool \ # --macro-prefix=gl \ # assert \ # byteswap \ # c-ctype \ # c-snprintf \ # c-strcase \ # c-strcasestr \ # c-strtod \ # c-xvasprintf \ # clean-temp \ # close \ # configmake \ # count-leading-zeros \ # count-one-bits \ # crc \ # crypto/md4 \ # crypto/rijndael \ # dirname \ # dtoastr \ # dtotimespec \ # environ \ # fatal-signal \ # fcntl \ # fpieee \ # fprintf-posix \ # fseeko \ # ftello \ # full-read \ # full-write \ # fwriteerror \ # getline \ # getopt-gnu \ # getpass \ # gettext-h \ # gettime \ # gettimeofday \ # gitlog-to-changelog \ # include_next \ # intprops \ # inttostr \ # isfinite \ # isinf \ # isnan \ # localcharset \ # localename \ # mbchar \ # mbiter \ # memcasecmp \ # memchr \ # memchr2 \ # memmem \ # mempcpy \ # memrchr \ # minmax \ # mkdtemp \ # mkstemp \ # nstrftime \ # pipe2 \ # printf-posix \ # printf-safe \ # progname \ # rawmemchr \ # read-file \ # regex \ # relocatable-prog \ # rename \ # round \ # select \ # snprintf \ # snprintf-posix \ # sprintf-posix \ # stdarg \ # stdbool \ # stdint \ # stpcpy \ # strcasestr \ # strerror \ # strsep \ # strtod \ # strtok_r \ # sys_stat \ # tempname \ # termios \ # timespec \ # timespec-add \ # timespec-sub \ # trunc \ # unicase/u8-casecmp \ # unicase/u8-casefold \ # unicase/u8-tolower \ # unicase/u8-totitle \ # unicase/u8-toupper \ # unictype/category-of \ # unictype/ctype-print \ # unigbrk/uc-is-grapheme-break \ # unilbrk/u8-possible-linebreaks \ # uninorm/nfkd \ # unistd \ # unistr/u8-check \ # unistr/u8-cpy \ # unistr/u8-mblen \ # unistr/u8-mbtouc \ # unistr/u8-mbtoucr \ # unistr/u8-strlen \ # unistr/u8-strmbtouc \ # unistr/u8-strncat \ # unistr/u8-uctomb \ # unitypes \ # uniwidth/u8-strwidth \ # unlocked-io \ # vasprintf-posix \ # version-etc \ # version-etc-fsf \ # vfprintf-posix \ # vprintf-posix \ # vsnprintf \ # vsnprintf-posix \ # vsprintf-posix \ # xalloc \ # xalloc-die \ # xbinary-io \ # xmalloca \ # xmemdup0 \ # xsize \ # xstrndup \ # xvasprintf VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ @LIBUNISTRING_COMPILE_UNICASE_EMPTY_PREFIX_CONTEXT_TRUE@am__append_1 = unicase/empty-prefix-context.c @LIBUNISTRING_COMPILE_UNICASE_EMPTY_SUFFIX_CONTEXT_TRUE@am__append_2 = unicase/empty-suffix-context.c @LIBUNISTRING_COMPILE_UNICASE_TOLOWER_TRUE@am__append_3 = unicase/tolower.c @LIBUNISTRING_COMPILE_UNICASE_TOTITLE_TRUE@am__append_4 = unicase/totitle.c @LIBUNISTRING_COMPILE_UNICASE_TOUPPER_TRUE@am__append_5 = unicase/toupper.c @LIBUNISTRING_COMPILE_UNICASE_U8_CASECMP_TRUE@am__append_6 = unicase/u8-casecmp.c @LIBUNISTRING_COMPILE_UNICASE_U8_CASEFOLD_TRUE@am__append_7 = unicase/u8-casefold.c @LIBUNISTRING_COMPILE_UNICASE_U8_CT_CASEFOLD_TRUE@am__append_8 = unicase/u8-ct-casefold.c @LIBUNISTRING_COMPILE_UNICASE_U8_CT_TOTITLE_TRUE@am__append_9 = unicase/u8-ct-totitle.c @LIBUNISTRING_COMPILE_UNICASE_U8_TOLOWER_TRUE@am__append_10 = unicase/u8-tolower.c @LIBUNISTRING_COMPILE_UNICASE_U8_TOTITLE_TRUE@am__append_11 = unicase/u8-totitle.c @LIBUNISTRING_COMPILE_UNICASE_U8_TOUPPER_TRUE@am__append_12 = unicase/u8-toupper.c @LIBUNISTRING_COMPILE_UNICTYPE_CATEGORY_NONE_TRUE@am__append_13 = unictype/categ_none.c @LIBUNISTRING_COMPILE_UNICTYPE_CATEGORY_OF_TRUE@am__append_14 = unictype/categ_of.c @LIBUNISTRING_COMPILE_UNICTYPE_COMBINING_CLASS_TRUE@am__append_15 = unictype/combiningclass.c @LIBUNISTRING_COMPILE_UNICTYPE_CTYPE_PRINT_TRUE@am__append_16 = unictype/ctype_print.c @LIBUNISTRING_COMPILE_UNICTYPE_PROPERTY_SOFT_DOTTED_TRUE@am__append_17 = unictype/pr_soft_dotted.c @LIBUNISTRING_COMPILE_UNIGBRK_UC_GBRK_PROP_TRUE@am__append_18 = unigbrk/uc-gbrk-prop.c @LIBUNISTRING_COMPILE_UNIGBRK_UC_IS_GRAPHEME_BREAK_TRUE@am__append_19 = unigbrk/uc-is-grapheme-break.c @LIBUNISTRING_COMPILE_UNILBRK_U8_POSSIBLE_LINEBREAKS_TRUE@am__append_20 = unilbrk/u8-possible-linebreaks.c @LIBUNISTRING_COMPILE_UNINORM_CANONICAL_DECOMPOSITION_TRUE@am__append_21 = uninorm/canonical-decomposition.c @LIBUNISTRING_COMPILE_UNINORM_DECOMPOSING_FORM_TRUE@am__append_22 = uninorm/decomposing-form.c @LIBUNISTRING_COMPILE_UNINORM_DECOMPOSITION_TRUE@am__append_23 = uninorm/decomposition.c @LIBUNISTRING_COMPILE_UNINORM_NFD_TRUE@am__append_24 = uninorm/nfd.c @LIBUNISTRING_COMPILE_UNINORM_NFKD_TRUE@am__append_25 = uninorm/nfkd.c @LIBUNISTRING_COMPILE_UNINORM_U8_NORMALIZE_TRUE@am__append_26 = uninorm/u8-normalize.c @LIBUNISTRING_COMPILE_UNISTR_U8_CHECK_TRUE@am__append_27 = unistr/u8-check.c @LIBUNISTRING_COMPILE_UNISTR_U8_CMP_TRUE@am__append_28 = unistr/u8-cmp.c @LIBUNISTRING_COMPILE_UNISTR_U8_CMP2_TRUE@am__append_29 = unistr/u8-cmp2.c @LIBUNISTRING_COMPILE_UNISTR_U8_CPY_TRUE@am__append_30 = unistr/u8-cpy.c @LIBUNISTRING_COMPILE_UNISTR_U8_MBLEN_TRUE@am__append_31 = unistr/u8-mblen.c @LIBUNISTRING_COMPILE_UNISTR_U8_MBTOUC_TRUE@am__append_32 = unistr/u8-mbtouc.c unistr/u8-mbtouc-aux.c @LIBUNISTRING_COMPILE_UNISTR_U8_MBTOUC_UNSAFE_TRUE@am__append_33 = unistr/u8-mbtouc-unsafe.c unistr/u8-mbtouc-unsafe-aux.c @LIBUNISTRING_COMPILE_UNISTR_U8_MBTOUCR_TRUE@am__append_34 = unistr/u8-mbtoucr.c @LIBUNISTRING_COMPILE_UNISTR_U8_STRLEN_TRUE@am__append_35 = unistr/u8-strlen.c @LIBUNISTRING_COMPILE_UNISTR_U8_STRMBTOUC_TRUE@am__append_36 = unistr/u8-strmbtouc.c @LIBUNISTRING_COMPILE_UNISTR_U8_STRNCAT_TRUE@am__append_37 = unistr/u8-strncat.c @LIBUNISTRING_COMPILE_UNISTR_U8_UCTOMB_TRUE@am__append_38 = unistr/u8-uctomb.c unistr/u8-uctomb-aux.c @LIBUNISTRING_COMPILE_UNIWBRK_U8_WORDBREAKS_TRUE@am__append_39 = uniwbrk/u8-wordbreaks.c @LIBUNISTRING_COMPILE_UNIWBRK_WORDBREAK_PROPERTY_TRUE@am__append_40 = uniwbrk/wordbreak-property.c @LIBUNISTRING_COMPILE_UNIWIDTH_U8_STRWIDTH_TRUE@am__append_41 = uniwidth/u8-strwidth.c @LIBUNISTRING_COMPILE_UNIWIDTH_U8_WIDTH_TRUE@am__append_42 = uniwidth/u8-width.c @LIBUNISTRING_COMPILE_UNIWIDTH_WIDTH_TRUE@am__append_43 = uniwidth/width.c subdir = gl ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/gl/m4/00gnulib.m4 \ $(top_srcdir)/gl/m4/__inline.m4 \ $(top_srcdir)/gl/m4/absolute-header.m4 \ $(top_srcdir)/gl/m4/alloca.m4 \ $(top_srcdir)/gl/m4/asm-underscore.m4 \ $(top_srcdir)/gl/m4/assert.m4 $(top_srcdir)/gl/m4/btowc.m4 \ $(top_srcdir)/gl/m4/builtin-expect.m4 \ $(top_srcdir)/gl/m4/byteswap.m4 \ $(top_srcdir)/gl/m4/c-strtod.m4 \ $(top_srcdir)/gl/m4/canonicalize.m4 \ $(top_srcdir)/gl/m4/ceil.m4 \ $(top_srcdir)/gl/m4/check-math-lib.m4 \ $(top_srcdir)/gl/m4/clock_time.m4 $(top_srcdir)/gl/m4/close.m4 \ $(top_srcdir)/gl/m4/codeset.m4 \ $(top_srcdir)/gl/m4/configmake.m4 \ $(top_srcdir)/gl/m4/double-slash-root.m4 \ $(top_srcdir)/gl/m4/dup2.m4 $(top_srcdir)/gl/m4/eealloc.m4 \ $(top_srcdir)/gl/m4/environ.m4 $(top_srcdir)/gl/m4/errno_h.m4 \ $(top_srcdir)/gl/m4/error.m4 \ $(top_srcdir)/gl/m4/explicit_bzero.m4 \ $(top_srcdir)/gl/m4/exponentd.m4 \ $(top_srcdir)/gl/m4/exponentf.m4 \ $(top_srcdir)/gl/m4/exponentl.m4 \ $(top_srcdir)/gl/m4/extensions.m4 \ $(top_srcdir)/gl/m4/extern-inline.m4 \ $(top_srcdir)/gl/m4/fatal-signal.m4 \ $(top_srcdir)/gl/m4/fcntl-o.m4 $(top_srcdir)/gl/m4/fcntl.m4 \ $(top_srcdir)/gl/m4/fcntl_h.m4 \ $(top_srcdir)/gl/m4/flexmember.m4 \ $(top_srcdir)/gl/m4/float_h.m4 $(top_srcdir)/gl/m4/floor.m4 \ $(top_srcdir)/gl/m4/fopen.m4 $(top_srcdir)/gl/m4/fpieee.m4 \ $(top_srcdir)/gl/m4/fprintf-posix.m4 \ $(top_srcdir)/gl/m4/frexp.m4 $(top_srcdir)/gl/m4/frexpl.m4 \ $(top_srcdir)/gl/m4/fseek.m4 $(top_srcdir)/gl/m4/fseeko.m4 \ $(top_srcdir)/gl/m4/fseterr.m4 $(top_srcdir)/gl/m4/fstat.m4 \ $(top_srcdir)/gl/m4/ftell.m4 $(top_srcdir)/gl/m4/ftello.m4 \ $(top_srcdir)/gl/m4/getdelim.m4 \ $(top_srcdir)/gl/m4/getdtablesize.m4 \ $(top_srcdir)/gl/m4/getline.m4 $(top_srcdir)/gl/m4/getopt.m4 \ $(top_srcdir)/gl/m4/getpass.m4 \ $(top_srcdir)/gl/m4/getprogname.m4 \ $(top_srcdir)/gl/m4/getrandom.m4 \ $(top_srcdir)/gl/m4/gettime.m4 \ $(top_srcdir)/gl/m4/gettimeofday.m4 \ $(top_srcdir)/gl/m4/glibc21.m4 \ $(top_srcdir)/gl/m4/gnulib-common.m4 \ $(top_srcdir)/gl/m4/gnulib-comp.m4 \ $(top_srcdir)/gl/m4/include_next.m4 \ $(top_srcdir)/gl/m4/inline.m4 \ $(top_srcdir)/gl/m4/intl-thread-locale.m4 \ $(top_srcdir)/gl/m4/intlmacosx.m4 \ $(top_srcdir)/gl/m4/intmax_t.m4 \ $(top_srcdir)/gl/m4/inttostr.m4 \ $(top_srcdir)/gl/m4/inttypes.m4 \ $(top_srcdir)/gl/m4/inttypes_h.m4 \ $(top_srcdir)/gl/m4/isfinite.m4 $(top_srcdir)/gl/m4/isinf.m4 \ $(top_srcdir)/gl/m4/isnan.m4 $(top_srcdir)/gl/m4/isnand.m4 \ $(top_srcdir)/gl/m4/isnanf.m4 $(top_srcdir)/gl/m4/isnanl.m4 \ $(top_srcdir)/gl/m4/iswblank.m4 \ $(top_srcdir)/gl/m4/iswdigit.m4 \ $(top_srcdir)/gl/m4/iswxdigit.m4 \ $(top_srcdir)/gl/m4/langinfo_h.m4 \ $(top_srcdir)/gl/m4/largefile.m4 \ $(top_srcdir)/gl/m4/lcmessage.m4 $(top_srcdir)/gl/m4/ldexp.m4 \ $(top_srcdir)/gl/m4/ldexpl.m4 $(top_srcdir)/gl/m4/lib-ld.m4 \ $(top_srcdir)/gl/m4/libunistring-base.m4 \ $(top_srcdir)/gl/m4/limits-h.m4 \ $(top_srcdir)/gl/m4/localcharset.m4 \ $(top_srcdir)/gl/m4/locale-fr.m4 \ $(top_srcdir)/gl/m4/locale-ja.m4 \ $(top_srcdir)/gl/m4/locale-zh.m4 \ $(top_srcdir)/gl/m4/locale_h.m4 \ $(top_srcdir)/gl/m4/localeconv.m4 \ $(top_srcdir)/gl/m4/localename.m4 $(top_srcdir)/gl/m4/lock.m4 \ $(top_srcdir)/gl/m4/lseek.m4 $(top_srcdir)/gl/m4/lstat.m4 \ $(top_srcdir)/gl/m4/malloc.m4 $(top_srcdir)/gl/m4/malloca.m4 \ $(top_srcdir)/gl/m4/math_h.m4 $(top_srcdir)/gl/m4/mbchar.m4 \ $(top_srcdir)/gl/m4/mbiter.m4 $(top_srcdir)/gl/m4/mbrtowc.m4 \ $(top_srcdir)/gl/m4/mbsinit.m4 \ $(top_srcdir)/gl/m4/mbstate_t.m4 $(top_srcdir)/gl/m4/mbtowc.m4 \ $(top_srcdir)/gl/m4/md4.m4 $(top_srcdir)/gl/m4/memcasecmp.m4 \ $(top_srcdir)/gl/m4/memchr.m4 $(top_srcdir)/gl/m4/memmem.m4 \ $(top_srcdir)/gl/m4/mempcpy.m4 $(top_srcdir)/gl/m4/memrchr.m4 \ $(top_srcdir)/gl/m4/minmax.m4 $(top_srcdir)/gl/m4/mkdir.m4 \ $(top_srcdir)/gl/m4/mkdtemp.m4 $(top_srcdir)/gl/m4/mkstemp.m4 \ $(top_srcdir)/gl/m4/mktime.m4 $(top_srcdir)/gl/m4/mmap-anon.m4 \ $(top_srcdir)/gl/m4/mode_t.m4 \ $(top_srcdir)/gl/m4/msvc-inval.m4 \ $(top_srcdir)/gl/m4/msvc-nothrow.m4 \ $(top_srcdir)/gl/m4/multiarch.m4 \ $(top_srcdir)/gl/m4/nl_langinfo.m4 \ $(top_srcdir)/gl/m4/nocrash.m4 \ $(top_srcdir)/gl/m4/nstrftime.m4 $(top_srcdir)/gl/m4/off_t.m4 \ $(top_srcdir)/gl/m4/open-cloexec.m4 \ $(top_srcdir)/gl/m4/open-slash.m4 $(top_srcdir)/gl/m4/open.m4 \ $(top_srcdir)/gl/m4/pathmax.m4 $(top_srcdir)/gl/m4/pipe2.m4 \ $(top_srcdir)/gl/m4/printf-frexp.m4 \ $(top_srcdir)/gl/m4/printf-frexpl.m4 \ $(top_srcdir)/gl/m4/printf-posix-rpl.m4 \ $(top_srcdir)/gl/m4/printf.m4 \ $(top_srcdir)/gl/m4/pthread_rwlock_rdlock.m4 \ $(top_srcdir)/gl/m4/raise.m4 $(top_srcdir)/gl/m4/rawmemchr.m4 \ $(top_srcdir)/gl/m4/read-file.m4 $(top_srcdir)/gl/m4/read.m4 \ $(top_srcdir)/gl/m4/readlink.m4 $(top_srcdir)/gl/m4/realloc.m4 \ $(top_srcdir)/gl/m4/regex.m4 \ $(top_srcdir)/gl/m4/relocatable-lib.m4 \ $(top_srcdir)/gl/m4/relocatable.m4 \ $(top_srcdir)/gl/m4/rename.m4 $(top_srcdir)/gl/m4/rmdir.m4 \ $(top_srcdir)/gl/m4/round.m4 $(top_srcdir)/gl/m4/safe-read.m4 \ $(top_srcdir)/gl/m4/safe-write.m4 \ $(top_srcdir)/gl/m4/secure_getenv.m4 \ $(top_srcdir)/gl/m4/select.m4 $(top_srcdir)/gl/m4/setenv.m4 \ $(top_srcdir)/gl/m4/setlocale_null.m4 \ $(top_srcdir)/gl/m4/sig_atomic_t.m4 \ $(top_srcdir)/gl/m4/sigaction.m4 \ $(top_srcdir)/gl/m4/signal_h.m4 \ $(top_srcdir)/gl/m4/signalblocking.m4 \ $(top_srcdir)/gl/m4/signbit.m4 $(top_srcdir)/gl/m4/size_max.m4 \ $(top_srcdir)/gl/m4/snprintf-posix.m4 \ $(top_srcdir)/gl/m4/snprintf.m4 \ $(top_srcdir)/gl/m4/socketlib.m4 \ $(top_srcdir)/gl/m4/sockets.m4 $(top_srcdir)/gl/m4/socklen.m4 \ $(top_srcdir)/gl/m4/sprintf-posix.m4 \ $(top_srcdir)/gl/m4/ssize_t.m4 \ $(top_srcdir)/gl/m4/stat-time.m4 $(top_srcdir)/gl/m4/stat.m4 \ $(top_srcdir)/gl/m4/std-gnu11.m4 \ $(top_srcdir)/gl/m4/stdalign.m4 $(top_srcdir)/gl/m4/stdarg.m4 \ $(top_srcdir)/gl/m4/stdbool.m4 $(top_srcdir)/gl/m4/stddef_h.m4 \ $(top_srcdir)/gl/m4/stdint.m4 $(top_srcdir)/gl/m4/stdint_h.m4 \ $(top_srcdir)/gl/m4/stdio_h.m4 $(top_srcdir)/gl/m4/stdlib_h.m4 \ $(top_srcdir)/gl/m4/stpcpy.m4 $(top_srcdir)/gl/m4/strcase.m4 \ $(top_srcdir)/gl/m4/strcasestr.m4 \ $(top_srcdir)/gl/m4/strdup.m4 $(top_srcdir)/gl/m4/strerror.m4 \ $(top_srcdir)/gl/m4/string_h.m4 \ $(top_srcdir)/gl/m4/strings_h.m4 \ $(top_srcdir)/gl/m4/strncat.m4 $(top_srcdir)/gl/m4/strndup.m4 \ $(top_srcdir)/gl/m4/strnlen.m4 $(top_srcdir)/gl/m4/strsep.m4 \ $(top_srcdir)/gl/m4/strtod.m4 $(top_srcdir)/gl/m4/strtok_r.m4 \ $(top_srcdir)/gl/m4/sys_random_h.m4 \ $(top_srcdir)/gl/m4/sys_select_h.m4 \ $(top_srcdir)/gl/m4/sys_socket_h.m4 \ $(top_srcdir)/gl/m4/sys_stat_h.m4 \ $(top_srcdir)/gl/m4/sys_time_h.m4 \ $(top_srcdir)/gl/m4/sys_types_h.m4 \ $(top_srcdir)/gl/m4/sys_uio_h.m4 \ $(top_srcdir)/gl/m4/tempname.m4 \ $(top_srcdir)/gl/m4/termios_h.m4 \ $(top_srcdir)/gl/m4/threadlib.m4 $(top_srcdir)/gl/m4/time_h.m4 \ $(top_srcdir)/gl/m4/time_r.m4 $(top_srcdir)/gl/m4/time_rz.m4 \ $(top_srcdir)/gl/m4/timegm.m4 $(top_srcdir)/gl/m4/timespec.m4 \ $(top_srcdir)/gl/m4/tm_gmtoff.m4 $(top_srcdir)/gl/m4/tmpdir.m4 \ $(top_srcdir)/gl/m4/trunc.m4 $(top_srcdir)/gl/m4/tzset.m4 \ $(top_srcdir)/gl/m4/unistd_h.m4 \ $(top_srcdir)/gl/m4/unlocked-io.m4 \ $(top_srcdir)/gl/m4/vasnprintf.m4 \ $(top_srcdir)/gl/m4/vasprintf-posix.m4 \ $(top_srcdir)/gl/m4/vasprintf.m4 \ $(top_srcdir)/gl/m4/version-etc.m4 \ $(top_srcdir)/gl/m4/vfprintf-posix.m4 \ $(top_srcdir)/gl/m4/visibility.m4 \ $(top_srcdir)/gl/m4/vprintf-posix.m4 \ $(top_srcdir)/gl/m4/vsnprintf-posix.m4 \ $(top_srcdir)/gl/m4/vsnprintf.m4 \ $(top_srcdir)/gl/m4/vsprintf-posix.m4 \ $(top_srcdir)/gl/m4/warn-on-use.m4 \ $(top_srcdir)/gl/m4/wchar_h.m4 $(top_srcdir)/gl/m4/wchar_t.m4 \ $(top_srcdir)/gl/m4/wcrtomb.m4 $(top_srcdir)/gl/m4/wctype_h.m4 \ $(top_srcdir)/gl/m4/wcwidth.m4 $(top_srcdir)/gl/m4/wint_t.m4 \ $(top_srcdir)/gl/m4/write.m4 $(top_srcdir)/gl/m4/xalloc.m4 \ $(top_srcdir)/gl/m4/xsize.m4 $(top_srcdir)/gl/m4/xstrndup.m4 \ $(top_srcdir)/gl/m4/xvasprintf.m4 \ $(top_srcdir)/gl/m4/zzgnulib.m4 $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(noinst_HEADERS) \ $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LIBRARIES = $(noinst_LIBRARIES) LTLIBRARIES = $(noinst_LTLIBRARIES) am__DEPENDENCIES_1 = am__libgl_la_SOURCES_DIST = allocator.c areadlink.c asyncsafe-spin.c \ basename-lgpl.c binary-io.h binary-io.c c-ctype.h c-ctype.c \ c-snprintf.c c-strcase.h c-strcasecmp.c c-strncasecmp.c \ c-strcasestr.h c-strcasestr.c c-strtod.c c-vasnprintf.c \ c-asprintf.c c-vasprintf.c c-xasprintf.c c-xvasprintf.c \ careadlinkat.c clean-temp.h clean-temp.c cloexec.c \ count-leading-zeros.c count-one-bits.c crc.c md4.c \ rijndael-alg-fst.c rijndael-api-fst.c dirname.c basename.c \ dirname-lgpl.c stripslash.c dtoastr.c dtotimespec.c exitfail.c \ fatal-signal.h fatal-signal.c fd-hook.c full-read.h \ full-read.c full-write.h full-write.c fwriteerror.h \ fwriteerror.c getprogname.h getprogname.c gettext.h gettime.c \ hard-locale.c imaxtostr.c inttostr.c offtostr.c uinttostr.c \ umaxtostr.c gl_linked_list.h gl_linked_list.c \ gl_anylinked_list1.h gl_anylinked_list2.h gl_linkedhash_list.h \ gl_linkedhash_list.c gl_anyhash1.h gl_anyhash2.h \ gl_anyhash_primes.h gl_list.h gl_list.c localcharset.c \ localename.c localename-table.c glthread/lock.h \ glthread/lock.c malloca.c math.c mbchar.c mbiter.h mbiter.c \ memcasecmp.c memchr2.h memchr2.c minmax.h nstrftime.c pipe2.c \ printf-frexp.c printf-frexpl.c progname.h progname.c \ read-file.c safe-read.c safe-write.c setlocale_null.c \ sig-handler.c size_max.h sockets.h sockets.c stat-time.c \ sys_socket.c tempname.c glthread/threadlib.c timespec.c \ timespec-add.c timespec-sub.c tmpdir.h tmpdir.c \ unicase/cased.c unicase/empty-prefix-context.c \ unicase/empty-suffix-context.c unicase/ignorable.c \ unicase/special-casing.c unicase/tocasefold.c \ unicase/tolower.c unicase/totitle.c unicase/toupper.c \ unicase/u8-casecmp.c unicase/u8-casefold.c \ unicase/u8-casemap.c unicase/u8-ct-casefold.c \ unicase/u8-ct-totitle.c unicase/u8-tolower.c \ unicase/u8-totitle.c unicase/u8-toupper.c \ unictype/categ_none.c unictype/categ_of.c \ unictype/combiningclass.c unictype/ctype_print.c \ unictype/pr_soft_dotted.c unigbrk/uc-gbrk-prop.c \ unigbrk/uc-is-grapheme-break.c unilbrk/lbrktables.c \ unilbrk/u8-possible-linebreaks.c \ uninorm/canonical-decomposition.c \ uninorm/compat-decomposition.c uninorm/decompose-internal.c \ uninorm/decomposing-form.c uninorm/decomposition.c \ uninorm/decomposition-table.c uninorm/nfd.c uninorm/nfkd.c \ uninorm/u8-normalize.c unistd.c unistr/u8-check.c \ unistr/u8-cmp.c unistr/u8-cmp2.c unistr/u8-cpy.c \ unistr/u8-mblen.c unistr/u8-mbtouc.c unistr/u8-mbtouc-aux.c \ unistr/u8-mbtouc-unsafe.c unistr/u8-mbtouc-unsafe-aux.c \ unistr/u8-mbtoucr.c unistr/u8-strlen.c unistr/u8-strmbtouc.c \ unistr/u8-strncat.c unistr/u8-uctomb.c unistr/u8-uctomb-aux.c \ uniwbrk/wbrktable.c uniwbrk/u8-wordbreaks.c \ uniwbrk/wordbreak-property.c uniwidth/u8-strwidth.c \ uniwidth/u8-width.c uniwidth/width.c version-etc.h \ version-etc.c version-etc-fsf.c wctype-h.c xmalloc.c \ xalloc-die.c xbinary-io.h xbinary-io.c gl_xlist.h gl_xlist.c \ xmalloca.c xmemdup0.h xmemdup0.c xreadlink.c xsize.h xsize.c \ xstrndup.h xstrndup.c xvasprintf.h xvasprintf.c xasprintf.c am__dirstamp = $(am__leading_dot)dirstamp @LIBUNISTRING_COMPILE_UNICASE_EMPTY_PREFIX_CONTEXT_TRUE@am__objects_1 = unicase/empty-prefix-context.lo @LIBUNISTRING_COMPILE_UNICASE_EMPTY_SUFFIX_CONTEXT_TRUE@am__objects_2 = unicase/empty-suffix-context.lo @LIBUNISTRING_COMPILE_UNICASE_TOLOWER_TRUE@am__objects_3 = \ @LIBUNISTRING_COMPILE_UNICASE_TOLOWER_TRUE@ unicase/tolower.lo @LIBUNISTRING_COMPILE_UNICASE_TOTITLE_TRUE@am__objects_4 = \ @LIBUNISTRING_COMPILE_UNICASE_TOTITLE_TRUE@ unicase/totitle.lo @LIBUNISTRING_COMPILE_UNICASE_TOUPPER_TRUE@am__objects_5 = \ @LIBUNISTRING_COMPILE_UNICASE_TOUPPER_TRUE@ unicase/toupper.lo @LIBUNISTRING_COMPILE_UNICASE_U8_CASECMP_TRUE@am__objects_6 = unicase/u8-casecmp.lo @LIBUNISTRING_COMPILE_UNICASE_U8_CASEFOLD_TRUE@am__objects_7 = unicase/u8-casefold.lo @LIBUNISTRING_COMPILE_UNICASE_U8_CT_CASEFOLD_TRUE@am__objects_8 = unicase/u8-ct-casefold.lo @LIBUNISTRING_COMPILE_UNICASE_U8_CT_TOTITLE_TRUE@am__objects_9 = unicase/u8-ct-totitle.lo @LIBUNISTRING_COMPILE_UNICASE_U8_TOLOWER_TRUE@am__objects_10 = unicase/u8-tolower.lo @LIBUNISTRING_COMPILE_UNICASE_U8_TOTITLE_TRUE@am__objects_11 = unicase/u8-totitle.lo @LIBUNISTRING_COMPILE_UNICASE_U8_TOUPPER_TRUE@am__objects_12 = unicase/u8-toupper.lo @LIBUNISTRING_COMPILE_UNICTYPE_CATEGORY_NONE_TRUE@am__objects_13 = unictype/categ_none.lo @LIBUNISTRING_COMPILE_UNICTYPE_CATEGORY_OF_TRUE@am__objects_14 = unictype/categ_of.lo @LIBUNISTRING_COMPILE_UNICTYPE_COMBINING_CLASS_TRUE@am__objects_15 = unictype/combiningclass.lo @LIBUNISTRING_COMPILE_UNICTYPE_CTYPE_PRINT_TRUE@am__objects_16 = unictype/ctype_print.lo @LIBUNISTRING_COMPILE_UNICTYPE_PROPERTY_SOFT_DOTTED_TRUE@am__objects_17 = unictype/pr_soft_dotted.lo @LIBUNISTRING_COMPILE_UNIGBRK_UC_GBRK_PROP_TRUE@am__objects_18 = unigbrk/uc-gbrk-prop.lo @LIBUNISTRING_COMPILE_UNIGBRK_UC_IS_GRAPHEME_BREAK_TRUE@am__objects_19 = unigbrk/uc-is-grapheme-break.lo @LIBUNISTRING_COMPILE_UNILBRK_U8_POSSIBLE_LINEBREAKS_TRUE@am__objects_20 = unilbrk/u8-possible-linebreaks.lo @LIBUNISTRING_COMPILE_UNINORM_CANONICAL_DECOMPOSITION_TRUE@am__objects_21 = uninorm/canonical-decomposition.lo @LIBUNISTRING_COMPILE_UNINORM_DECOMPOSING_FORM_TRUE@am__objects_22 = uninorm/decomposing-form.lo @LIBUNISTRING_COMPILE_UNINORM_DECOMPOSITION_TRUE@am__objects_23 = uninorm/decomposition.lo @LIBUNISTRING_COMPILE_UNINORM_NFD_TRUE@am__objects_24 = \ @LIBUNISTRING_COMPILE_UNINORM_NFD_TRUE@ uninorm/nfd.lo @LIBUNISTRING_COMPILE_UNINORM_NFKD_TRUE@am__objects_25 = \ @LIBUNISTRING_COMPILE_UNINORM_NFKD_TRUE@ uninorm/nfkd.lo @LIBUNISTRING_COMPILE_UNINORM_U8_NORMALIZE_TRUE@am__objects_26 = uninorm/u8-normalize.lo @LIBUNISTRING_COMPILE_UNISTR_U8_CHECK_TRUE@am__objects_27 = \ @LIBUNISTRING_COMPILE_UNISTR_U8_CHECK_TRUE@ unistr/u8-check.lo @LIBUNISTRING_COMPILE_UNISTR_U8_CMP_TRUE@am__objects_28 = \ @LIBUNISTRING_COMPILE_UNISTR_U8_CMP_TRUE@ unistr/u8-cmp.lo @LIBUNISTRING_COMPILE_UNISTR_U8_CMP2_TRUE@am__objects_29 = \ @LIBUNISTRING_COMPILE_UNISTR_U8_CMP2_TRUE@ unistr/u8-cmp2.lo @LIBUNISTRING_COMPILE_UNISTR_U8_CPY_TRUE@am__objects_30 = \ @LIBUNISTRING_COMPILE_UNISTR_U8_CPY_TRUE@ unistr/u8-cpy.lo @LIBUNISTRING_COMPILE_UNISTR_U8_MBLEN_TRUE@am__objects_31 = \ @LIBUNISTRING_COMPILE_UNISTR_U8_MBLEN_TRUE@ unistr/u8-mblen.lo @LIBUNISTRING_COMPILE_UNISTR_U8_MBTOUC_TRUE@am__objects_32 = unistr/u8-mbtouc.lo \ @LIBUNISTRING_COMPILE_UNISTR_U8_MBTOUC_TRUE@ unistr/u8-mbtouc-aux.lo @LIBUNISTRING_COMPILE_UNISTR_U8_MBTOUC_UNSAFE_TRUE@am__objects_33 = unistr/u8-mbtouc-unsafe.lo \ @LIBUNISTRING_COMPILE_UNISTR_U8_MBTOUC_UNSAFE_TRUE@ unistr/u8-mbtouc-unsafe-aux.lo @LIBUNISTRING_COMPILE_UNISTR_U8_MBTOUCR_TRUE@am__objects_34 = unistr/u8-mbtoucr.lo @LIBUNISTRING_COMPILE_UNISTR_U8_STRLEN_TRUE@am__objects_35 = unistr/u8-strlen.lo @LIBUNISTRING_COMPILE_UNISTR_U8_STRMBTOUC_TRUE@am__objects_36 = unistr/u8-strmbtouc.lo @LIBUNISTRING_COMPILE_UNISTR_U8_STRNCAT_TRUE@am__objects_37 = unistr/u8-strncat.lo @LIBUNISTRING_COMPILE_UNISTR_U8_UCTOMB_TRUE@am__objects_38 = unistr/u8-uctomb.lo \ @LIBUNISTRING_COMPILE_UNISTR_U8_UCTOMB_TRUE@ unistr/u8-uctomb-aux.lo @LIBUNISTRING_COMPILE_UNIWBRK_U8_WORDBREAKS_TRUE@am__objects_39 = uniwbrk/u8-wordbreaks.lo @LIBUNISTRING_COMPILE_UNIWBRK_WORDBREAK_PROPERTY_TRUE@am__objects_40 = uniwbrk/wordbreak-property.lo @LIBUNISTRING_COMPILE_UNIWIDTH_U8_STRWIDTH_TRUE@am__objects_41 = uniwidth/u8-strwidth.lo @LIBUNISTRING_COMPILE_UNIWIDTH_U8_WIDTH_TRUE@am__objects_42 = uniwidth/u8-width.lo @LIBUNISTRING_COMPILE_UNIWIDTH_WIDTH_TRUE@am__objects_43 = \ @LIBUNISTRING_COMPILE_UNIWIDTH_WIDTH_TRUE@ uniwidth/width.lo am_libgl_la_OBJECTS = allocator.lo areadlink.lo asyncsafe-spin.lo \ basename-lgpl.lo binary-io.lo c-ctype.lo c-snprintf.lo \ c-strcasecmp.lo c-strncasecmp.lo c-strcasestr.lo c-strtod.lo \ c-vasnprintf.lo c-asprintf.lo c-vasprintf.lo c-xasprintf.lo \ c-xvasprintf.lo careadlinkat.lo clean-temp.lo cloexec.lo \ count-leading-zeros.lo count-one-bits.lo crc.lo md4.lo \ rijndael-alg-fst.lo rijndael-api-fst.lo dirname.lo basename.lo \ dirname-lgpl.lo stripslash.lo dtoastr.lo dtotimespec.lo \ exitfail.lo fatal-signal.lo fd-hook.lo full-read.lo \ full-write.lo fwriteerror.lo getprogname.lo gettime.lo \ hard-locale.lo imaxtostr.lo inttostr.lo offtostr.lo \ uinttostr.lo umaxtostr.lo gl_linked_list.lo \ gl_linkedhash_list.lo gl_list.lo localcharset.lo localename.lo \ localename-table.lo glthread/lock.lo malloca.lo math.lo \ mbchar.lo mbiter.lo memcasecmp.lo memchr2.lo nstrftime.lo \ pipe2.lo printf-frexp.lo printf-frexpl.lo progname.lo \ read-file.lo safe-read.lo safe-write.lo setlocale_null.lo \ sig-handler.lo sockets.lo stat-time.lo sys_socket.lo \ tempname.lo glthread/threadlib.lo timespec.lo timespec-add.lo \ timespec-sub.lo tmpdir.lo unicase/cased.lo $(am__objects_1) \ $(am__objects_2) unicase/ignorable.lo \ unicase/special-casing.lo unicase/tocasefold.lo \ $(am__objects_3) $(am__objects_4) $(am__objects_5) \ $(am__objects_6) $(am__objects_7) unicase/u8-casemap.lo \ $(am__objects_8) $(am__objects_9) $(am__objects_10) \ $(am__objects_11) $(am__objects_12) $(am__objects_13) \ $(am__objects_14) $(am__objects_15) $(am__objects_16) \ $(am__objects_17) $(am__objects_18) $(am__objects_19) \ unilbrk/lbrktables.lo $(am__objects_20) $(am__objects_21) \ uninorm/compat-decomposition.lo uninorm/decompose-internal.lo \ $(am__objects_22) $(am__objects_23) \ uninorm/decomposition-table.lo $(am__objects_24) \ $(am__objects_25) $(am__objects_26) unistd.lo \ $(am__objects_27) $(am__objects_28) $(am__objects_29) \ $(am__objects_30) $(am__objects_31) $(am__objects_32) \ $(am__objects_33) $(am__objects_34) $(am__objects_35) \ $(am__objects_36) $(am__objects_37) $(am__objects_38) \ uniwbrk/wbrktable.lo $(am__objects_39) $(am__objects_40) \ $(am__objects_41) $(am__objects_42) $(am__objects_43) \ version-etc.lo version-etc-fsf.lo wctype-h.lo xmalloc.lo \ xalloc-die.lo xbinary-io.lo gl_xlist.lo xmalloca.lo \ xmemdup0.lo xreadlink.lo xsize.lo xstrndup.lo xvasprintf.lo \ xasprintf.lo libgl_la_OBJECTS = $(am_libgl_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = libgl_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(libgl_la_LDFLAGS) $(LDFLAGS) -o $@ AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/build-aux/depcomp am__maybe_remake_depfiles = depfiles am__depfiles_remade = ./$(DEPDIR)/alloca.Plo ./$(DEPDIR)/allocator.Plo \ ./$(DEPDIR)/anytostr.Plo ./$(DEPDIR)/areadlink.Plo \ ./$(DEPDIR)/asnprintf.Plo ./$(DEPDIR)/asprintf.Plo \ ./$(DEPDIR)/asyncsafe-spin.Plo ./$(DEPDIR)/basename-lgpl.Plo \ ./$(DEPDIR)/basename.Plo ./$(DEPDIR)/binary-io.Plo \ ./$(DEPDIR)/btowc.Plo ./$(DEPDIR)/c-asprintf.Plo \ ./$(DEPDIR)/c-ctype.Plo ./$(DEPDIR)/c-snprintf.Plo \ ./$(DEPDIR)/c-strcasecmp.Plo ./$(DEPDIR)/c-strcasestr.Plo \ ./$(DEPDIR)/c-strncasecmp.Plo ./$(DEPDIR)/c-strtod.Plo \ ./$(DEPDIR)/c-vasnprintf.Plo ./$(DEPDIR)/c-vasprintf.Plo \ ./$(DEPDIR)/c-xasprintf.Plo ./$(DEPDIR)/c-xvasprintf.Plo \ ./$(DEPDIR)/canonicalize-lgpl.Plo ./$(DEPDIR)/careadlinkat.Plo \ ./$(DEPDIR)/clean-temp.Plo ./$(DEPDIR)/cloexec.Plo \ ./$(DEPDIR)/close.Plo ./$(DEPDIR)/count-leading-zeros.Plo \ ./$(DEPDIR)/count-one-bits.Plo ./$(DEPDIR)/crc.Plo \ ./$(DEPDIR)/dirname-lgpl.Plo ./$(DEPDIR)/dirname.Plo \ ./$(DEPDIR)/dtoastr.Plo ./$(DEPDIR)/dtotimespec.Plo \ ./$(DEPDIR)/dup2.Plo ./$(DEPDIR)/error.Plo \ ./$(DEPDIR)/exitfail.Plo ./$(DEPDIR)/explicit_bzero.Plo \ ./$(DEPDIR)/fatal-signal.Plo ./$(DEPDIR)/fcntl.Plo \ ./$(DEPDIR)/fd-hook.Plo ./$(DEPDIR)/float.Plo \ ./$(DEPDIR)/floor.Plo ./$(DEPDIR)/fopen.Plo \ ./$(DEPDIR)/fprintf.Plo ./$(DEPDIR)/frexp.Plo \ ./$(DEPDIR)/frexpl.Plo ./$(DEPDIR)/fseek.Plo \ ./$(DEPDIR)/fseeko.Plo ./$(DEPDIR)/fseterr.Plo \ ./$(DEPDIR)/fstat.Plo ./$(DEPDIR)/ftell.Plo \ ./$(DEPDIR)/ftello.Plo ./$(DEPDIR)/ftoastr.Plo \ ./$(DEPDIR)/full-read.Plo ./$(DEPDIR)/full-write.Plo \ ./$(DEPDIR)/fwriteerror.Plo ./$(DEPDIR)/getdelim.Plo \ ./$(DEPDIR)/getdtablesize.Plo ./$(DEPDIR)/getline.Plo \ ./$(DEPDIR)/getopt.Plo ./$(DEPDIR)/getopt1.Plo \ ./$(DEPDIR)/getpass.Plo ./$(DEPDIR)/getprogname.Plo \ ./$(DEPDIR)/getrandom.Plo ./$(DEPDIR)/gettime.Plo \ ./$(DEPDIR)/gettimeofday.Plo ./$(DEPDIR)/gl_linked_list.Plo \ ./$(DEPDIR)/gl_linkedhash_list.Plo ./$(DEPDIR)/gl_list.Plo \ ./$(DEPDIR)/gl_xlist.Plo ./$(DEPDIR)/hard-locale.Plo \ ./$(DEPDIR)/imaxtostr.Plo ./$(DEPDIR)/inttostr.Plo \ ./$(DEPDIR)/isfinite.Plo ./$(DEPDIR)/isinf.Plo \ ./$(DEPDIR)/isnan.Plo ./$(DEPDIR)/isnand.Plo \ ./$(DEPDIR)/isnanf.Plo ./$(DEPDIR)/isnanl.Plo \ ./$(DEPDIR)/iswblank.Plo ./$(DEPDIR)/iswdigit.Plo \ ./$(DEPDIR)/iswxdigit.Plo ./$(DEPDIR)/itold.Plo \ ./$(DEPDIR)/lc-charset-dispatch.Plo \ ./$(DEPDIR)/localcharset.Plo ./$(DEPDIR)/localeconv.Plo \ ./$(DEPDIR)/localename-table.Plo ./$(DEPDIR)/localename.Plo \ ./$(DEPDIR)/lseek.Plo ./$(DEPDIR)/lstat.Plo \ ./$(DEPDIR)/malloc.Plo ./$(DEPDIR)/malloca.Plo \ ./$(DEPDIR)/math.Plo ./$(DEPDIR)/mbchar.Plo \ ./$(DEPDIR)/mbiter.Plo ./$(DEPDIR)/mbrtowc.Plo \ ./$(DEPDIR)/mbsinit.Plo ./$(DEPDIR)/mbtowc-lock.Plo \ ./$(DEPDIR)/mbtowc.Plo ./$(DEPDIR)/md4.Plo \ ./$(DEPDIR)/memcasecmp.Plo ./$(DEPDIR)/memchr.Plo \ ./$(DEPDIR)/memchr2.Plo ./$(DEPDIR)/memmem.Plo \ ./$(DEPDIR)/mempcpy.Plo ./$(DEPDIR)/memrchr.Plo \ ./$(DEPDIR)/mkdir.Plo ./$(DEPDIR)/mkdtemp.Plo \ ./$(DEPDIR)/mkstemp.Plo ./$(DEPDIR)/mktime.Plo \ ./$(DEPDIR)/msvc-inval.Plo ./$(DEPDIR)/msvc-nothrow.Plo \ ./$(DEPDIR)/nl_langinfo.Plo ./$(DEPDIR)/nstrftime.Plo \ ./$(DEPDIR)/offtostr.Plo ./$(DEPDIR)/open.Plo \ ./$(DEPDIR)/pipe2.Plo ./$(DEPDIR)/printf-args.Plo \ ./$(DEPDIR)/printf-frexp.Plo ./$(DEPDIR)/printf-frexpl.Plo \ ./$(DEPDIR)/printf-parse.Plo ./$(DEPDIR)/printf.Plo \ ./$(DEPDIR)/progname.Plo ./$(DEPDIR)/progreloc.Plo \ ./$(DEPDIR)/raise.Plo ./$(DEPDIR)/rawmemchr.Plo \ ./$(DEPDIR)/read-file.Plo ./$(DEPDIR)/read.Plo \ ./$(DEPDIR)/readlink.Plo ./$(DEPDIR)/realloc.Plo \ ./$(DEPDIR)/regcomp.Plo ./$(DEPDIR)/regex.Plo \ ./$(DEPDIR)/regex_internal.Plo ./$(DEPDIR)/regexec.Plo \ ./$(DEPDIR)/relocatable.Plo ./$(DEPDIR)/rename.Plo \ ./$(DEPDIR)/rijndael-alg-fst.Plo \ ./$(DEPDIR)/rijndael-api-fst.Plo ./$(DEPDIR)/rmdir.Plo \ ./$(DEPDIR)/round.Plo ./$(DEPDIR)/safe-read.Plo \ ./$(DEPDIR)/safe-write.Plo ./$(DEPDIR)/secure_getenv.Plo \ ./$(DEPDIR)/select.Plo ./$(DEPDIR)/setenv.Plo \ ./$(DEPDIR)/setlocale-lock.Plo ./$(DEPDIR)/setlocale_null.Plo \ ./$(DEPDIR)/sig-handler.Plo ./$(DEPDIR)/sigaction.Plo \ ./$(DEPDIR)/signbitd.Plo ./$(DEPDIR)/signbitf.Plo \ ./$(DEPDIR)/signbitl.Plo ./$(DEPDIR)/sigprocmask.Plo \ ./$(DEPDIR)/snprintf.Plo ./$(DEPDIR)/sockets.Plo \ ./$(DEPDIR)/sprintf.Plo ./$(DEPDIR)/stat-time.Plo \ ./$(DEPDIR)/stat-w32.Plo ./$(DEPDIR)/stat.Plo \ ./$(DEPDIR)/stpcpy.Plo ./$(DEPDIR)/strcasecmp.Plo \ ./$(DEPDIR)/strcasestr.Plo ./$(DEPDIR)/strdup.Plo \ ./$(DEPDIR)/strerror-override.Plo ./$(DEPDIR)/strerror.Plo \ ./$(DEPDIR)/stripslash.Plo ./$(DEPDIR)/strncasecmp.Plo \ ./$(DEPDIR)/strncat.Plo ./$(DEPDIR)/strndup.Plo \ ./$(DEPDIR)/strnlen.Plo ./$(DEPDIR)/strsep.Plo \ ./$(DEPDIR)/strtod.Plo ./$(DEPDIR)/strtok_r.Plo \ ./$(DEPDIR)/sys_socket.Plo ./$(DEPDIR)/tempname.Plo \ ./$(DEPDIR)/time_r.Plo ./$(DEPDIR)/time_rz.Plo \ ./$(DEPDIR)/timegm.Plo ./$(DEPDIR)/timespec-add.Plo \ ./$(DEPDIR)/timespec-sub.Plo ./$(DEPDIR)/timespec.Plo \ ./$(DEPDIR)/tmpdir.Plo ./$(DEPDIR)/trunc.Plo \ ./$(DEPDIR)/tzset.Plo ./$(DEPDIR)/uinttostr.Plo \ ./$(DEPDIR)/umaxtostr.Plo ./$(DEPDIR)/unistd.Plo \ ./$(DEPDIR)/unsetenv.Plo ./$(DEPDIR)/vasnprintf.Plo \ ./$(DEPDIR)/vasprintf.Plo ./$(DEPDIR)/version-etc-fsf.Plo \ ./$(DEPDIR)/version-etc.Plo ./$(DEPDIR)/vfprintf.Plo \ ./$(DEPDIR)/vprintf.Plo ./$(DEPDIR)/vsnprintf.Plo \ ./$(DEPDIR)/vsprintf.Plo ./$(DEPDIR)/wcrtomb.Plo \ ./$(DEPDIR)/wctype-h.Plo ./$(DEPDIR)/wcwidth.Plo \ ./$(DEPDIR)/windows-mutex.Plo ./$(DEPDIR)/windows-once.Plo \ ./$(DEPDIR)/windows-recmutex.Plo \ ./$(DEPDIR)/windows-rwlock.Plo ./$(DEPDIR)/windows-spin.Plo \ ./$(DEPDIR)/write.Plo ./$(DEPDIR)/xalloc-die.Plo \ ./$(DEPDIR)/xasprintf.Plo ./$(DEPDIR)/xbinary-io.Plo \ ./$(DEPDIR)/xmalloc.Plo ./$(DEPDIR)/xmalloca.Plo \ ./$(DEPDIR)/xmemdup0.Plo ./$(DEPDIR)/xreadlink.Plo \ ./$(DEPDIR)/xsize.Plo ./$(DEPDIR)/xstrndup.Plo \ ./$(DEPDIR)/xvasprintf.Plo glthread/$(DEPDIR)/lock.Plo \ glthread/$(DEPDIR)/threadlib.Plo unicase/$(DEPDIR)/cased.Plo \ unicase/$(DEPDIR)/empty-prefix-context.Plo \ unicase/$(DEPDIR)/empty-suffix-context.Plo \ unicase/$(DEPDIR)/ignorable.Plo \ unicase/$(DEPDIR)/special-casing.Plo \ unicase/$(DEPDIR)/tocasefold.Plo unicase/$(DEPDIR)/tolower.Plo \ unicase/$(DEPDIR)/totitle.Plo unicase/$(DEPDIR)/toupper.Plo \ unicase/$(DEPDIR)/u8-casecmp.Plo \ unicase/$(DEPDIR)/u8-casefold.Plo \ unicase/$(DEPDIR)/u8-casemap.Plo \ unicase/$(DEPDIR)/u8-ct-casefold.Plo \ unicase/$(DEPDIR)/u8-ct-totitle.Plo \ unicase/$(DEPDIR)/u8-tolower.Plo \ unicase/$(DEPDIR)/u8-totitle.Plo \ unicase/$(DEPDIR)/u8-toupper.Plo \ unictype/$(DEPDIR)/categ_none.Plo \ unictype/$(DEPDIR)/categ_of.Plo \ unictype/$(DEPDIR)/combiningclass.Plo \ unictype/$(DEPDIR)/ctype_print.Plo \ unictype/$(DEPDIR)/pr_soft_dotted.Plo \ unigbrk/$(DEPDIR)/uc-gbrk-prop.Plo \ unigbrk/$(DEPDIR)/uc-is-grapheme-break.Plo \ unilbrk/$(DEPDIR)/lbrktables.Plo \ unilbrk/$(DEPDIR)/u8-possible-linebreaks.Plo \ uninorm/$(DEPDIR)/canonical-decomposition.Plo \ uninorm/$(DEPDIR)/compat-decomposition.Plo \ uninorm/$(DEPDIR)/decompose-internal.Plo \ uninorm/$(DEPDIR)/decomposing-form.Plo \ uninorm/$(DEPDIR)/decomposition-table.Plo \ uninorm/$(DEPDIR)/decomposition.Plo uninorm/$(DEPDIR)/nfd.Plo \ uninorm/$(DEPDIR)/nfkd.Plo uninorm/$(DEPDIR)/u8-normalize.Plo \ unistr/$(DEPDIR)/u8-check.Plo unistr/$(DEPDIR)/u8-cmp.Plo \ unistr/$(DEPDIR)/u8-cmp2.Plo unistr/$(DEPDIR)/u8-cpy.Plo \ unistr/$(DEPDIR)/u8-mblen.Plo \ unistr/$(DEPDIR)/u8-mbtouc-aux.Plo \ unistr/$(DEPDIR)/u8-mbtouc-unsafe-aux.Plo \ unistr/$(DEPDIR)/u8-mbtouc-unsafe.Plo \ unistr/$(DEPDIR)/u8-mbtouc.Plo unistr/$(DEPDIR)/u8-mbtoucr.Plo \ unistr/$(DEPDIR)/u8-strlen.Plo \ unistr/$(DEPDIR)/u8-strmbtouc.Plo \ unistr/$(DEPDIR)/u8-strncat.Plo \ unistr/$(DEPDIR)/u8-uctomb-aux.Plo \ unistr/$(DEPDIR)/u8-uctomb.Plo \ uniwbrk/$(DEPDIR)/u8-wordbreaks.Plo \ uniwbrk/$(DEPDIR)/wbrktable.Plo \ uniwbrk/$(DEPDIR)/wordbreak-property.Plo \ uniwidth/$(DEPDIR)/u8-strwidth.Plo \ uniwidth/$(DEPDIR)/u8-width.Plo uniwidth/$(DEPDIR)/width.Plo am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libgl_la_SOURCES) $(EXTRA_libgl_la_SOURCES) DIST_SOURCES = $(am__libgl_la_SOURCES_DIST) $(EXTRA_libgl_la_SOURCES) RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-recursive dvi-recursive html-recursive info-recursive \ install-data-recursive install-dvi-recursive \ install-exec-recursive install-html-recursive \ install-info-recursive install-pdf-recursive \ install-ps-recursive install-recursive installcheck-recursive \ installdirs-recursive pdf-recursive ps-recursive \ tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac HEADERS = $(noinst_HEADERS) RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive am__recursive_targets = \ $(RECURSIVE_TARGETS) \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ distdir distdir-am am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) am__DIST_COMMON = $(srcdir)/Makefile.in \ $(top_srcdir)/build-aux/depcomp alloca.c DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" pkglibexecdir = @pkglibexecdir@ ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ ALLOCA_H = @ALLOCA_H@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AM_MAKEINFOFLAGS = @AM_MAKEINFOFLAGS@ APPLE_UNIVERSAL_BUILD = @APPLE_UNIVERSAL_BUILD@ AR = @AR@ ARFLAGS = @ARFLAGS@ AS = @AS@ ASM_SYMBOL_PREFIX = @ASM_SYMBOL_PREFIX@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BITSIZEOF_PTRDIFF_T = @BITSIZEOF_PTRDIFF_T@ BITSIZEOF_SIG_ATOMIC_T = @BITSIZEOF_SIG_ATOMIC_T@ BITSIZEOF_SIZE_T = @BITSIZEOF_SIZE_T@ BITSIZEOF_WCHAR_T = @BITSIZEOF_WCHAR_T@ BITSIZEOF_WINT_T = @BITSIZEOF_WINT_T@ BYTESWAP_H = @BYTESWAP_H@ CAIRO_CFLAGS = @CAIRO_CFLAGS@ CAIRO_LIBS = @CAIRO_LIBS@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CC_FOR_BUILD = @CC_FOR_BUILD@ CFLAGS = @CFLAGS@ CFLAG_VISIBILITY = @CFLAG_VISIBILITY@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ -DEXEEXT=\"@EXEEXT@\" DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EMULTIHOP_HIDDEN = @EMULTIHOP_HIDDEN@ EMULTIHOP_VALUE = @EMULTIHOP_VALUE@ ENOLINK_HIDDEN = @ENOLINK_HIDDEN@ ENOLINK_VALUE = @ENOLINK_VALUE@ EOVERFLOW_HIDDEN = @EOVERFLOW_HIDDEN@ EOVERFLOW_VALUE = @EOVERFLOW_VALUE@ ERRNO_H = @ERRNO_H@ EXEEXT = @EXEEXT@ EXEEXT_FOR_BUILD = @EXEEXT_FOR_BUILD@ FGREP = @FGREP@ FLOAT_H = @FLOAT_H@ FLOOR_LIBM = @FLOOR_LIBM@ GETOPT_CDEFS_H = @GETOPT_CDEFS_H@ GETOPT_H = @GETOPT_H@ GLIBC21 = @GLIBC21@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_COMPILE_RESOURCES = @GLIB_COMPILE_RESOURCES@ GLIB_GENMARSHAL = @GLIB_GENMARSHAL@ GLIB_LIBS = @GLIB_LIBS@ GNULIB_ACCEPT = @GNULIB_ACCEPT@ GNULIB_ACCEPT4 = @GNULIB_ACCEPT4@ GNULIB_ACCESS = @GNULIB_ACCESS@ GNULIB_ACOSF = @GNULIB_ACOSF@ GNULIB_ACOSL = @GNULIB_ACOSL@ GNULIB_ASINF = @GNULIB_ASINF@ GNULIB_ASINL = @GNULIB_ASINL@ GNULIB_ATAN2F = @GNULIB_ATAN2F@ GNULIB_ATANF = @GNULIB_ATANF@ GNULIB_ATANL = @GNULIB_ATANL@ GNULIB_ATOLL = @GNULIB_ATOLL@ GNULIB_BIND = @GNULIB_BIND@ GNULIB_BTOWC = @GNULIB_BTOWC@ GNULIB_CALLOC_POSIX = @GNULIB_CALLOC_POSIX@ GNULIB_CANONICALIZE_FILE_NAME = @GNULIB_CANONICALIZE_FILE_NAME@ GNULIB_CBRT = @GNULIB_CBRT@ GNULIB_CBRTF = @GNULIB_CBRTF@ GNULIB_CBRTL = @GNULIB_CBRTL@ GNULIB_CEIL = @GNULIB_CEIL@ GNULIB_CEILF = @GNULIB_CEILF@ GNULIB_CEILL = @GNULIB_CEILL@ GNULIB_CHDIR = @GNULIB_CHDIR@ GNULIB_CHOWN = @GNULIB_CHOWN@ GNULIB_CLOSE = @GNULIB_CLOSE@ GNULIB_CONNECT = @GNULIB_CONNECT@ GNULIB_COPYSIGN = @GNULIB_COPYSIGN@ GNULIB_COPYSIGNF = @GNULIB_COPYSIGNF@ GNULIB_COPYSIGNL = @GNULIB_COPYSIGNL@ GNULIB_COPY_FILE_RANGE = @GNULIB_COPY_FILE_RANGE@ GNULIB_COSF = @GNULIB_COSF@ GNULIB_COSHF = @GNULIB_COSHF@ GNULIB_COSL = @GNULIB_COSL@ GNULIB_CREAT = @GNULIB_CREAT@ GNULIB_CTIME = @GNULIB_CTIME@ GNULIB_DPRINTF = @GNULIB_DPRINTF@ GNULIB_DUP = @GNULIB_DUP@ GNULIB_DUP2 = @GNULIB_DUP2@ GNULIB_DUP3 = @GNULIB_DUP3@ GNULIB_DUPLOCALE = @GNULIB_DUPLOCALE@ GNULIB_ENVIRON = @GNULIB_ENVIRON@ GNULIB_EUIDACCESS = @GNULIB_EUIDACCESS@ GNULIB_EXP2 = @GNULIB_EXP2@ GNULIB_EXP2F = @GNULIB_EXP2F@ GNULIB_EXP2L = @GNULIB_EXP2L@ GNULIB_EXPF = @GNULIB_EXPF@ GNULIB_EXPL = @GNULIB_EXPL@ GNULIB_EXPLICIT_BZERO = @GNULIB_EXPLICIT_BZERO@ GNULIB_EXPM1 = @GNULIB_EXPM1@ GNULIB_EXPM1F = @GNULIB_EXPM1F@ GNULIB_EXPM1L = @GNULIB_EXPM1L@ GNULIB_FABSF = @GNULIB_FABSF@ GNULIB_FABSL = @GNULIB_FABSL@ GNULIB_FACCESSAT = @GNULIB_FACCESSAT@ GNULIB_FCHDIR = @GNULIB_FCHDIR@ GNULIB_FCHMODAT = @GNULIB_FCHMODAT@ GNULIB_FCHOWNAT = @GNULIB_FCHOWNAT@ GNULIB_FCLOSE = @GNULIB_FCLOSE@ GNULIB_FCNTL = @GNULIB_FCNTL@ GNULIB_FDATASYNC = @GNULIB_FDATASYNC@ GNULIB_FDOPEN = @GNULIB_FDOPEN@ GNULIB_FFLUSH = @GNULIB_FFLUSH@ GNULIB_FFS = @GNULIB_FFS@ GNULIB_FFSL = @GNULIB_FFSL@ GNULIB_FFSLL = @GNULIB_FFSLL@ GNULIB_FGETC = @GNULIB_FGETC@ GNULIB_FGETS = @GNULIB_FGETS@ GNULIB_FLOOR = @GNULIB_FLOOR@ GNULIB_FLOORF = @GNULIB_FLOORF@ GNULIB_FLOORL = @GNULIB_FLOORL@ GNULIB_FMA = @GNULIB_FMA@ GNULIB_FMAF = @GNULIB_FMAF@ GNULIB_FMAL = @GNULIB_FMAL@ GNULIB_FMOD = @GNULIB_FMOD@ GNULIB_FMODF = @GNULIB_FMODF@ GNULIB_FMODL = @GNULIB_FMODL@ GNULIB_FOPEN = @GNULIB_FOPEN@ GNULIB_FPRINTF = @GNULIB_FPRINTF@ GNULIB_FPRINTF_POSIX = @GNULIB_FPRINTF_POSIX@ GNULIB_FPURGE = @GNULIB_FPURGE@ GNULIB_FPUTC = @GNULIB_FPUTC@ GNULIB_FPUTS = @GNULIB_FPUTS@ GNULIB_FREAD = @GNULIB_FREAD@ GNULIB_FREOPEN = @GNULIB_FREOPEN@ GNULIB_FREXP = @GNULIB_FREXP@ GNULIB_FREXPF = @GNULIB_FREXPF@ GNULIB_FREXPL = @GNULIB_FREXPL@ GNULIB_FSCANF = @GNULIB_FSCANF@ GNULIB_FSEEK = @GNULIB_FSEEK@ GNULIB_FSEEKO = @GNULIB_FSEEKO@ GNULIB_FSTAT = @GNULIB_FSTAT@ GNULIB_FSTATAT = @GNULIB_FSTATAT@ GNULIB_FSYNC = @GNULIB_FSYNC@ GNULIB_FTELL = @GNULIB_FTELL@ GNULIB_FTELLO = @GNULIB_FTELLO@ GNULIB_FTRUNCATE = @GNULIB_FTRUNCATE@ GNULIB_FUTIMENS = @GNULIB_FUTIMENS@ GNULIB_FWRITE = @GNULIB_FWRITE@ GNULIB_GETC = @GNULIB_GETC@ GNULIB_GETCHAR = @GNULIB_GETCHAR@ GNULIB_GETCWD = @GNULIB_GETCWD@ GNULIB_GETDELIM = @GNULIB_GETDELIM@ GNULIB_GETDOMAINNAME = @GNULIB_GETDOMAINNAME@ GNULIB_GETDTABLESIZE = @GNULIB_GETDTABLESIZE@ GNULIB_GETENTROPY = @GNULIB_GETENTROPY@ GNULIB_GETGROUPS = @GNULIB_GETGROUPS@ GNULIB_GETHOSTNAME = @GNULIB_GETHOSTNAME@ GNULIB_GETLINE = @GNULIB_GETLINE@ GNULIB_GETLOADAVG = @GNULIB_GETLOADAVG@ GNULIB_GETLOGIN = @GNULIB_GETLOGIN@ GNULIB_GETLOGIN_R = @GNULIB_GETLOGIN_R@ GNULIB_GETOPT_POSIX = @GNULIB_GETOPT_POSIX@ GNULIB_GETPAGESIZE = @GNULIB_GETPAGESIZE@ GNULIB_GETPASS = @GNULIB_GETPASS@ GNULIB_GETPEERNAME = @GNULIB_GETPEERNAME@ GNULIB_GETRANDOM = @GNULIB_GETRANDOM@ GNULIB_GETSOCKNAME = @GNULIB_GETSOCKNAME@ GNULIB_GETSOCKOPT = @GNULIB_GETSOCKOPT@ GNULIB_GETSUBOPT = @GNULIB_GETSUBOPT@ GNULIB_GETTIMEOFDAY = @GNULIB_GETTIMEOFDAY@ GNULIB_GETUMASK = @GNULIB_GETUMASK@ GNULIB_GETUSERSHELL = @GNULIB_GETUSERSHELL@ GNULIB_GL_UNISTD_H_GETOPT = @GNULIB_GL_UNISTD_H_GETOPT@ GNULIB_GRANTPT = @GNULIB_GRANTPT@ GNULIB_GROUP_MEMBER = @GNULIB_GROUP_MEMBER@ GNULIB_HYPOT = @GNULIB_HYPOT@ GNULIB_HYPOTF = @GNULIB_HYPOTF@ GNULIB_HYPOTL = @GNULIB_HYPOTL@ GNULIB_ILOGB = @GNULIB_ILOGB@ GNULIB_ILOGBF = @GNULIB_ILOGBF@ GNULIB_ILOGBL = @GNULIB_ILOGBL@ GNULIB_IMAXABS = @GNULIB_IMAXABS@ GNULIB_IMAXDIV = @GNULIB_IMAXDIV@ GNULIB_ISATTY = @GNULIB_ISATTY@ GNULIB_ISFINITE = @GNULIB_ISFINITE@ GNULIB_ISINF = @GNULIB_ISINF@ GNULIB_ISNAN = @GNULIB_ISNAN@ GNULIB_ISNAND = @GNULIB_ISNAND@ GNULIB_ISNANF = @GNULIB_ISNANF@ GNULIB_ISNANL = @GNULIB_ISNANL@ GNULIB_ISWBLANK = @GNULIB_ISWBLANK@ GNULIB_ISWCTYPE = @GNULIB_ISWCTYPE@ GNULIB_ISWDIGIT = @GNULIB_ISWDIGIT@ GNULIB_ISWXDIGIT = @GNULIB_ISWXDIGIT@ GNULIB_LCHMOD = @GNULIB_LCHMOD@ GNULIB_LCHOWN = @GNULIB_LCHOWN@ GNULIB_LDEXPF = @GNULIB_LDEXPF@ GNULIB_LDEXPL = @GNULIB_LDEXPL@ GNULIB_LINK = @GNULIB_LINK@ GNULIB_LINKAT = @GNULIB_LINKAT@ GNULIB_LISTEN = @GNULIB_LISTEN@ GNULIB_LOCALECONV = @GNULIB_LOCALECONV@ GNULIB_LOCALENAME = @GNULIB_LOCALENAME@ GNULIB_LOCALTIME = @GNULIB_LOCALTIME@ GNULIB_LOG = @GNULIB_LOG@ GNULIB_LOG10 = @GNULIB_LOG10@ GNULIB_LOG10F = @GNULIB_LOG10F@ GNULIB_LOG10L = @GNULIB_LOG10L@ GNULIB_LOG1P = @GNULIB_LOG1P@ GNULIB_LOG1PF = @GNULIB_LOG1PF@ GNULIB_LOG1PL = @GNULIB_LOG1PL@ GNULIB_LOG2 = @GNULIB_LOG2@ GNULIB_LOG2F = @GNULIB_LOG2F@ GNULIB_LOG2L = @GNULIB_LOG2L@ GNULIB_LOGB = @GNULIB_LOGB@ GNULIB_LOGBF = @GNULIB_LOGBF@ GNULIB_LOGBL = @GNULIB_LOGBL@ GNULIB_LOGF = @GNULIB_LOGF@ GNULIB_LOGL = @GNULIB_LOGL@ GNULIB_LSEEK = @GNULIB_LSEEK@ GNULIB_LSTAT = @GNULIB_LSTAT@ GNULIB_MALLOC_POSIX = @GNULIB_MALLOC_POSIX@ GNULIB_MBRLEN = @GNULIB_MBRLEN@ GNULIB_MBRTOWC = @GNULIB_MBRTOWC@ GNULIB_MBSCASECMP = @GNULIB_MBSCASECMP@ GNULIB_MBSCASESTR = @GNULIB_MBSCASESTR@ GNULIB_MBSCHR = @GNULIB_MBSCHR@ GNULIB_MBSCSPN = @GNULIB_MBSCSPN@ GNULIB_MBSINIT = @GNULIB_MBSINIT@ GNULIB_MBSLEN = @GNULIB_MBSLEN@ GNULIB_MBSNCASECMP = @GNULIB_MBSNCASECMP@ GNULIB_MBSNLEN = @GNULIB_MBSNLEN@ GNULIB_MBSNRTOWCS = @GNULIB_MBSNRTOWCS@ GNULIB_MBSPBRK = @GNULIB_MBSPBRK@ GNULIB_MBSPCASECMP = @GNULIB_MBSPCASECMP@ GNULIB_MBSRCHR = @GNULIB_MBSRCHR@ GNULIB_MBSRTOWCS = @GNULIB_MBSRTOWCS@ GNULIB_MBSSEP = @GNULIB_MBSSEP@ GNULIB_MBSSPN = @GNULIB_MBSSPN@ GNULIB_MBSSTR = @GNULIB_MBSSTR@ GNULIB_MBSTOK_R = @GNULIB_MBSTOK_R@ GNULIB_MBTOWC = @GNULIB_MBTOWC@ GNULIB_MEMCHR = @GNULIB_MEMCHR@ GNULIB_MEMMEM = @GNULIB_MEMMEM@ GNULIB_MEMPCPY = @GNULIB_MEMPCPY@ GNULIB_MEMRCHR = @GNULIB_MEMRCHR@ GNULIB_MKDIRAT = @GNULIB_MKDIRAT@ GNULIB_MKDTEMP = @GNULIB_MKDTEMP@ GNULIB_MKFIFO = @GNULIB_MKFIFO@ GNULIB_MKFIFOAT = @GNULIB_MKFIFOAT@ GNULIB_MKNOD = @GNULIB_MKNOD@ GNULIB_MKNODAT = @GNULIB_MKNODAT@ GNULIB_MKOSTEMP = @GNULIB_MKOSTEMP@ GNULIB_MKOSTEMPS = @GNULIB_MKOSTEMPS@ GNULIB_MKSTEMP = @GNULIB_MKSTEMP@ GNULIB_MKSTEMPS = @GNULIB_MKSTEMPS@ GNULIB_MKTIME = @GNULIB_MKTIME@ GNULIB_MODF = @GNULIB_MODF@ GNULIB_MODFF = @GNULIB_MODFF@ GNULIB_MODFL = @GNULIB_MODFL@ GNULIB_NANOSLEEP = @GNULIB_NANOSLEEP@ GNULIB_NL_LANGINFO = @GNULIB_NL_LANGINFO@ GNULIB_NONBLOCKING = @GNULIB_NONBLOCKING@ GNULIB_OBSTACK_PRINTF = @GNULIB_OBSTACK_PRINTF@ GNULIB_OBSTACK_PRINTF_POSIX = @GNULIB_OBSTACK_PRINTF_POSIX@ GNULIB_OPEN = @GNULIB_OPEN@ GNULIB_OPENAT = @GNULIB_OPENAT@ GNULIB_OVERRIDES_STRUCT_STAT = @GNULIB_OVERRIDES_STRUCT_STAT@ GNULIB_OVERRIDES_WINT_T = @GNULIB_OVERRIDES_WINT_T@ GNULIB_PCLOSE = @GNULIB_PCLOSE@ GNULIB_PERROR = @GNULIB_PERROR@ GNULIB_PIPE = @GNULIB_PIPE@ GNULIB_PIPE2 = @GNULIB_PIPE2@ GNULIB_POPEN = @GNULIB_POPEN@ GNULIB_POSIX_OPENPT = @GNULIB_POSIX_OPENPT@ GNULIB_POWF = @GNULIB_POWF@ GNULIB_PREAD = @GNULIB_PREAD@ GNULIB_PRINTF = @GNULIB_PRINTF@ GNULIB_PRINTF_POSIX = @GNULIB_PRINTF_POSIX@ GNULIB_PSELECT = @GNULIB_PSELECT@ GNULIB_PTHREAD_SIGMASK = @GNULIB_PTHREAD_SIGMASK@ GNULIB_PTSNAME = @GNULIB_PTSNAME@ GNULIB_PTSNAME_R = @GNULIB_PTSNAME_R@ GNULIB_PUTC = @GNULIB_PUTC@ GNULIB_PUTCHAR = @GNULIB_PUTCHAR@ GNULIB_PUTENV = @GNULIB_PUTENV@ GNULIB_PUTS = @GNULIB_PUTS@ GNULIB_PWRITE = @GNULIB_PWRITE@ GNULIB_QSORT_R = @GNULIB_QSORT_R@ GNULIB_RAISE = @GNULIB_RAISE@ GNULIB_RANDOM = @GNULIB_RANDOM@ GNULIB_RANDOM_R = @GNULIB_RANDOM_R@ GNULIB_RAWMEMCHR = @GNULIB_RAWMEMCHR@ GNULIB_READ = @GNULIB_READ@ GNULIB_READLINK = @GNULIB_READLINK@ GNULIB_READLINKAT = @GNULIB_READLINKAT@ GNULIB_REALLOCARRAY = @GNULIB_REALLOCARRAY@ GNULIB_REALLOC_POSIX = @GNULIB_REALLOC_POSIX@ GNULIB_REALPATH = @GNULIB_REALPATH@ GNULIB_RECV = @GNULIB_RECV@ GNULIB_RECVFROM = @GNULIB_RECVFROM@ GNULIB_REMAINDER = @GNULIB_REMAINDER@ GNULIB_REMAINDERF = @GNULIB_REMAINDERF@ GNULIB_REMAINDERL = @GNULIB_REMAINDERL@ GNULIB_REMOVE = @GNULIB_REMOVE@ GNULIB_RENAME = @GNULIB_RENAME@ GNULIB_RENAMEAT = @GNULIB_RENAMEAT@ GNULIB_RINT = @GNULIB_RINT@ GNULIB_RINTF = @GNULIB_RINTF@ GNULIB_RINTL = @GNULIB_RINTL@ GNULIB_RMDIR = @GNULIB_RMDIR@ GNULIB_ROUND = @GNULIB_ROUND@ GNULIB_ROUNDF = @GNULIB_ROUNDF@ GNULIB_ROUNDL = @GNULIB_ROUNDL@ GNULIB_RPMATCH = @GNULIB_RPMATCH@ GNULIB_SCANF = @GNULIB_SCANF@ GNULIB_SECURE_GETENV = @GNULIB_SECURE_GETENV@ GNULIB_SELECT = @GNULIB_SELECT@ GNULIB_SEND = @GNULIB_SEND@ GNULIB_SENDTO = @GNULIB_SENDTO@ GNULIB_SETENV = @GNULIB_SETENV@ GNULIB_SETHOSTNAME = @GNULIB_SETHOSTNAME@ GNULIB_SETLOCALE = @GNULIB_SETLOCALE@ GNULIB_SETLOCALE_NULL = @GNULIB_SETLOCALE_NULL@ GNULIB_SETSOCKOPT = @GNULIB_SETSOCKOPT@ GNULIB_SHUTDOWN = @GNULIB_SHUTDOWN@ GNULIB_SIGACTION = @GNULIB_SIGACTION@ GNULIB_SIGNAL_H_SIGPIPE = @GNULIB_SIGNAL_H_SIGPIPE@ GNULIB_SIGNBIT = @GNULIB_SIGNBIT@ GNULIB_SIGPROCMASK = @GNULIB_SIGPROCMASK@ GNULIB_SINF = @GNULIB_SINF@ GNULIB_SINHF = @GNULIB_SINHF@ GNULIB_SINL = @GNULIB_SINL@ GNULIB_SLEEP = @GNULIB_SLEEP@ GNULIB_SNPRINTF = @GNULIB_SNPRINTF@ GNULIB_SOCKET = @GNULIB_SOCKET@ GNULIB_SPRINTF_POSIX = @GNULIB_SPRINTF_POSIX@ GNULIB_SQRTF = @GNULIB_SQRTF@ GNULIB_SQRTL = @GNULIB_SQRTL@ GNULIB_STAT = @GNULIB_STAT@ GNULIB_STDIO_H_NONBLOCKING = @GNULIB_STDIO_H_NONBLOCKING@ GNULIB_STDIO_H_SIGPIPE = @GNULIB_STDIO_H_SIGPIPE@ GNULIB_STPCPY = @GNULIB_STPCPY@ GNULIB_STPNCPY = @GNULIB_STPNCPY@ GNULIB_STRCASESTR = @GNULIB_STRCASESTR@ GNULIB_STRCHRNUL = @GNULIB_STRCHRNUL@ GNULIB_STRDUP = @GNULIB_STRDUP@ GNULIB_STRERROR = @GNULIB_STRERROR@ GNULIB_STRERROR_R = @GNULIB_STRERROR_R@ GNULIB_STRFTIME = @GNULIB_STRFTIME@ GNULIB_STRNCAT = @GNULIB_STRNCAT@ GNULIB_STRNDUP = @GNULIB_STRNDUP@ GNULIB_STRNLEN = @GNULIB_STRNLEN@ GNULIB_STRPBRK = @GNULIB_STRPBRK@ GNULIB_STRPTIME = @GNULIB_STRPTIME@ GNULIB_STRSEP = @GNULIB_STRSEP@ GNULIB_STRSIGNAL = @GNULIB_STRSIGNAL@ GNULIB_STRSTR = @GNULIB_STRSTR@ GNULIB_STRTOD = @GNULIB_STRTOD@ GNULIB_STRTOIMAX = @GNULIB_STRTOIMAX@ GNULIB_STRTOK_R = @GNULIB_STRTOK_R@ GNULIB_STRTOLD = @GNULIB_STRTOLD@ GNULIB_STRTOLL = @GNULIB_STRTOLL@ GNULIB_STRTOULL = @GNULIB_STRTOULL@ GNULIB_STRTOUMAX = @GNULIB_STRTOUMAX@ GNULIB_STRVERSCMP = @GNULIB_STRVERSCMP@ GNULIB_SYMLINK = @GNULIB_SYMLINK@ GNULIB_SYMLINKAT = @GNULIB_SYMLINKAT@ GNULIB_SYSTEM_POSIX = @GNULIB_SYSTEM_POSIX@ GNULIB_TANF = @GNULIB_TANF@ GNULIB_TANHF = @GNULIB_TANHF@ GNULIB_TANL = @GNULIB_TANL@ GNULIB_TCGETSID = @GNULIB_TCGETSID@ GNULIB_TIMEGM = @GNULIB_TIMEGM@ GNULIB_TIME_R = @GNULIB_TIME_R@ GNULIB_TIME_RZ = @GNULIB_TIME_RZ@ GNULIB_TMPFILE = @GNULIB_TMPFILE@ GNULIB_TOWCTRANS = @GNULIB_TOWCTRANS@ GNULIB_TRUNC = @GNULIB_TRUNC@ GNULIB_TRUNCATE = @GNULIB_TRUNCATE@ GNULIB_TRUNCF = @GNULIB_TRUNCF@ GNULIB_TRUNCL = @GNULIB_TRUNCL@ GNULIB_TTYNAME_R = @GNULIB_TTYNAME_R@ GNULIB_TZSET = @GNULIB_TZSET@ GNULIB_UNISTD_H_NONBLOCKING = @GNULIB_UNISTD_H_NONBLOCKING@ GNULIB_UNISTD_H_SIGPIPE = @GNULIB_UNISTD_H_SIGPIPE@ GNULIB_UNLINK = @GNULIB_UNLINK@ GNULIB_UNLINKAT = @GNULIB_UNLINKAT@ GNULIB_UNLOCKPT = @GNULIB_UNLOCKPT@ GNULIB_UNSETENV = @GNULIB_UNSETENV@ GNULIB_USLEEP = @GNULIB_USLEEP@ GNULIB_UTIMENSAT = @GNULIB_UTIMENSAT@ GNULIB_VASPRINTF = @GNULIB_VASPRINTF@ GNULIB_VDPRINTF = @GNULIB_VDPRINTF@ GNULIB_VFPRINTF = @GNULIB_VFPRINTF@ GNULIB_VFPRINTF_POSIX = @GNULIB_VFPRINTF_POSIX@ GNULIB_VFSCANF = @GNULIB_VFSCANF@ GNULIB_VPRINTF = @GNULIB_VPRINTF@ GNULIB_VPRINTF_POSIX = @GNULIB_VPRINTF_POSIX@ GNULIB_VSCANF = @GNULIB_VSCANF@ GNULIB_VSNPRINTF = @GNULIB_VSNPRINTF@ GNULIB_VSPRINTF_POSIX = @GNULIB_VSPRINTF_POSIX@ GNULIB_WCPCPY = @GNULIB_WCPCPY@ GNULIB_WCPNCPY = @GNULIB_WCPNCPY@ GNULIB_WCRTOMB = @GNULIB_WCRTOMB@ GNULIB_WCSCASECMP = @GNULIB_WCSCASECMP@ GNULIB_WCSCAT = @GNULIB_WCSCAT@ GNULIB_WCSCHR = @GNULIB_WCSCHR@ GNULIB_WCSCMP = @GNULIB_WCSCMP@ GNULIB_WCSCOLL = @GNULIB_WCSCOLL@ GNULIB_WCSCPY = @GNULIB_WCSCPY@ GNULIB_WCSCSPN = @GNULIB_WCSCSPN@ GNULIB_WCSDUP = @GNULIB_WCSDUP@ GNULIB_WCSFTIME = @GNULIB_WCSFTIME@ GNULIB_WCSLEN = @GNULIB_WCSLEN@ GNULIB_WCSNCASECMP = @GNULIB_WCSNCASECMP@ GNULIB_WCSNCAT = @GNULIB_WCSNCAT@ GNULIB_WCSNCMP = @GNULIB_WCSNCMP@ GNULIB_WCSNCPY = @GNULIB_WCSNCPY@ GNULIB_WCSNLEN = @GNULIB_WCSNLEN@ GNULIB_WCSNRTOMBS = @GNULIB_WCSNRTOMBS@ GNULIB_WCSPBRK = @GNULIB_WCSPBRK@ GNULIB_WCSRCHR = @GNULIB_WCSRCHR@ GNULIB_WCSRTOMBS = @GNULIB_WCSRTOMBS@ GNULIB_WCSSPN = @GNULIB_WCSSPN@ GNULIB_WCSSTR = @GNULIB_WCSSTR@ GNULIB_WCSTOK = @GNULIB_WCSTOK@ GNULIB_WCSWIDTH = @GNULIB_WCSWIDTH@ GNULIB_WCSXFRM = @GNULIB_WCSXFRM@ GNULIB_WCTOB = @GNULIB_WCTOB@ GNULIB_WCTOMB = @GNULIB_WCTOMB@ GNULIB_WCTRANS = @GNULIB_WCTRANS@ GNULIB_WCTYPE = @GNULIB_WCTYPE@ GNULIB_WCWIDTH = @GNULIB_WCWIDTH@ GNULIB_WMEMCHR = @GNULIB_WMEMCHR@ GNULIB_WMEMCMP = @GNULIB_WMEMCMP@ GNULIB_WMEMCPY = @GNULIB_WMEMCPY@ GNULIB_WMEMMOVE = @GNULIB_WMEMMOVE@ GNULIB_WMEMPCPY = @GNULIB_WMEMPCPY@ GNULIB_WMEMSET = @GNULIB_WMEMSET@ GNULIB_WRITE = @GNULIB_WRITE@ GNULIB__EXIT = @GNULIB__EXIT@ GREP = @GREP@ GSL_CFLAGS = @GSL_CFLAGS@ GSL_LIBS = @GSL_LIBS@ GTHREAD_CFLAGS = @GTHREAD_CFLAGS@ GTHREAD_LIBS = @GTHREAD_LIBS@ GTKSOURCEVIEW_CFLAGS = @GTKSOURCEVIEW_CFLAGS@ GTKSOURCEVIEW_LIBS = @GTKSOURCEVIEW_LIBS@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ HAVE_ACCEPT4 = @HAVE_ACCEPT4@ HAVE_ACOSF = @HAVE_ACOSF@ HAVE_ACOSL = @HAVE_ACOSL@ HAVE_ALLOCA_H = @HAVE_ALLOCA_H@ HAVE_ASINF = @HAVE_ASINF@ HAVE_ASINL = @HAVE_ASINL@ HAVE_ATAN2F = @HAVE_ATAN2F@ HAVE_ATANF = @HAVE_ATANF@ HAVE_ATANL = @HAVE_ATANL@ HAVE_ATOLL = @HAVE_ATOLL@ HAVE_BTOWC = @HAVE_BTOWC@ HAVE_C99_STDINT_H = @HAVE_C99_STDINT_H@ HAVE_CANONICALIZE_FILE_NAME = @HAVE_CANONICALIZE_FILE_NAME@ HAVE_CBRT = @HAVE_CBRT@ HAVE_CBRTF = @HAVE_CBRTF@ HAVE_CBRTL = @HAVE_CBRTL@ HAVE_CHOWN = @HAVE_CHOWN@ HAVE_COPYSIGN = @HAVE_COPYSIGN@ HAVE_COPYSIGNL = @HAVE_COPYSIGNL@ HAVE_COPY_FILE_RANGE = @HAVE_COPY_FILE_RANGE@ HAVE_COSF = @HAVE_COSF@ HAVE_COSHF = @HAVE_COSHF@ HAVE_COSL = @HAVE_COSL@ HAVE_CRTDEFS_H = @HAVE_CRTDEFS_H@ HAVE_DECL_ACOSL = @HAVE_DECL_ACOSL@ HAVE_DECL_ASINL = @HAVE_DECL_ASINL@ HAVE_DECL_ATANL = @HAVE_DECL_ATANL@ HAVE_DECL_CBRTF = @HAVE_DECL_CBRTF@ HAVE_DECL_CBRTL = @HAVE_DECL_CBRTL@ HAVE_DECL_CEILF = @HAVE_DECL_CEILF@ HAVE_DECL_CEILL = @HAVE_DECL_CEILL@ HAVE_DECL_COPYSIGNF = @HAVE_DECL_COPYSIGNF@ HAVE_DECL_COSL = @HAVE_DECL_COSL@ HAVE_DECL_ENVIRON = @HAVE_DECL_ENVIRON@ HAVE_DECL_EXP2 = @HAVE_DECL_EXP2@ HAVE_DECL_EXP2F = @HAVE_DECL_EXP2F@ HAVE_DECL_EXP2L = @HAVE_DECL_EXP2L@ HAVE_DECL_EXPL = @HAVE_DECL_EXPL@ HAVE_DECL_EXPM1L = @HAVE_DECL_EXPM1L@ HAVE_DECL_FCHDIR = @HAVE_DECL_FCHDIR@ HAVE_DECL_FDATASYNC = @HAVE_DECL_FDATASYNC@ HAVE_DECL_FLOORF = @HAVE_DECL_FLOORF@ HAVE_DECL_FLOORL = @HAVE_DECL_FLOORL@ HAVE_DECL_FPURGE = @HAVE_DECL_FPURGE@ HAVE_DECL_FREXPL = @HAVE_DECL_FREXPL@ HAVE_DECL_FSEEKO = @HAVE_DECL_FSEEKO@ HAVE_DECL_FTELLO = @HAVE_DECL_FTELLO@ HAVE_DECL_GETDELIM = @HAVE_DECL_GETDELIM@ HAVE_DECL_GETDOMAINNAME = @HAVE_DECL_GETDOMAINNAME@ HAVE_DECL_GETLINE = @HAVE_DECL_GETLINE@ HAVE_DECL_GETLOADAVG = @HAVE_DECL_GETLOADAVG@ HAVE_DECL_GETLOGIN = @HAVE_DECL_GETLOGIN@ HAVE_DECL_GETLOGIN_R = @HAVE_DECL_GETLOGIN_R@ HAVE_DECL_GETPAGESIZE = @HAVE_DECL_GETPAGESIZE@ HAVE_DECL_GETUSERSHELL = @HAVE_DECL_GETUSERSHELL@ HAVE_DECL_IMAXABS = @HAVE_DECL_IMAXABS@ HAVE_DECL_IMAXDIV = @HAVE_DECL_IMAXDIV@ HAVE_DECL_INITSTATE = @HAVE_DECL_INITSTATE@ HAVE_DECL_LDEXPL = @HAVE_DECL_LDEXPL@ HAVE_DECL_LOCALTIME_R = @HAVE_DECL_LOCALTIME_R@ HAVE_DECL_LOG10L = @HAVE_DECL_LOG10L@ HAVE_DECL_LOG2 = @HAVE_DECL_LOG2@ HAVE_DECL_LOG2F = @HAVE_DECL_LOG2F@ HAVE_DECL_LOG2L = @HAVE_DECL_LOG2L@ HAVE_DECL_LOGB = @HAVE_DECL_LOGB@ HAVE_DECL_LOGL = @HAVE_DECL_LOGL@ HAVE_DECL_MEMMEM = @HAVE_DECL_MEMMEM@ HAVE_DECL_MEMRCHR = @HAVE_DECL_MEMRCHR@ HAVE_DECL_OBSTACK_PRINTF = @HAVE_DECL_OBSTACK_PRINTF@ HAVE_DECL_REMAINDER = @HAVE_DECL_REMAINDER@ HAVE_DECL_REMAINDERL = @HAVE_DECL_REMAINDERL@ HAVE_DECL_RINTF = @HAVE_DECL_RINTF@ HAVE_DECL_ROUND = @HAVE_DECL_ROUND@ HAVE_DECL_ROUNDF = @HAVE_DECL_ROUNDF@ HAVE_DECL_ROUNDL = @HAVE_DECL_ROUNDL@ HAVE_DECL_SETENV = @HAVE_DECL_SETENV@ HAVE_DECL_SETHOSTNAME = @HAVE_DECL_SETHOSTNAME@ HAVE_DECL_SETSTATE = @HAVE_DECL_SETSTATE@ HAVE_DECL_SINL = @HAVE_DECL_SINL@ HAVE_DECL_SNPRINTF = @HAVE_DECL_SNPRINTF@ HAVE_DECL_SQRTL = @HAVE_DECL_SQRTL@ HAVE_DECL_STRDUP = @HAVE_DECL_STRDUP@ HAVE_DECL_STRERROR_R = @HAVE_DECL_STRERROR_R@ HAVE_DECL_STRNCASECMP = @HAVE_DECL_STRNCASECMP@ HAVE_DECL_STRNDUP = @HAVE_DECL_STRNDUP@ HAVE_DECL_STRNLEN = @HAVE_DECL_STRNLEN@ HAVE_DECL_STRSIGNAL = @HAVE_DECL_STRSIGNAL@ HAVE_DECL_STRTOIMAX = @HAVE_DECL_STRTOIMAX@ HAVE_DECL_STRTOK_R = @HAVE_DECL_STRTOK_R@ HAVE_DECL_STRTOUMAX = @HAVE_DECL_STRTOUMAX@ HAVE_DECL_TANL = @HAVE_DECL_TANL@ HAVE_DECL_TCGETSID = @HAVE_DECL_TCGETSID@ HAVE_DECL_TRUNC = @HAVE_DECL_TRUNC@ HAVE_DECL_TRUNCATE = @HAVE_DECL_TRUNCATE@ HAVE_DECL_TRUNCF = @HAVE_DECL_TRUNCF@ HAVE_DECL_TRUNCL = @HAVE_DECL_TRUNCL@ HAVE_DECL_TTYNAME_R = @HAVE_DECL_TTYNAME_R@ HAVE_DECL_UNSETENV = @HAVE_DECL_UNSETENV@ HAVE_DECL_VSNPRINTF = @HAVE_DECL_VSNPRINTF@ HAVE_DECL_WCTOB = @HAVE_DECL_WCTOB@ HAVE_DECL_WCWIDTH = @HAVE_DECL_WCWIDTH@ HAVE_DPRINTF = @HAVE_DPRINTF@ HAVE_DUP3 = @HAVE_DUP3@ HAVE_DUPLOCALE = @HAVE_DUPLOCALE@ HAVE_EUIDACCESS = @HAVE_EUIDACCESS@ HAVE_EXPF = @HAVE_EXPF@ HAVE_EXPL = @HAVE_EXPL@ HAVE_EXPLICIT_BZERO = @HAVE_EXPLICIT_BZERO@ HAVE_EXPM1 = @HAVE_EXPM1@ HAVE_EXPM1F = @HAVE_EXPM1F@ HAVE_FABSF = @HAVE_FABSF@ HAVE_FABSL = @HAVE_FABSL@ HAVE_FACCESSAT = @HAVE_FACCESSAT@ HAVE_FCHDIR = @HAVE_FCHDIR@ HAVE_FCHMODAT = @HAVE_FCHMODAT@ HAVE_FCHOWNAT = @HAVE_FCHOWNAT@ HAVE_FCNTL = @HAVE_FCNTL@ HAVE_FDATASYNC = @HAVE_FDATASYNC@ HAVE_FEATURES_H = @HAVE_FEATURES_H@ HAVE_FFS = @HAVE_FFS@ HAVE_FFSL = @HAVE_FFSL@ HAVE_FFSLL = @HAVE_FFSLL@ HAVE_FMA = @HAVE_FMA@ HAVE_FMAF = @HAVE_FMAF@ HAVE_FMAL = @HAVE_FMAL@ HAVE_FMODF = @HAVE_FMODF@ HAVE_FMODL = @HAVE_FMODL@ HAVE_FREELOCALE = @HAVE_FREELOCALE@ HAVE_FREXPF = @HAVE_FREXPF@ HAVE_FSEEKO = @HAVE_FSEEKO@ HAVE_FSTATAT = @HAVE_FSTATAT@ HAVE_FSYNC = @HAVE_FSYNC@ HAVE_FTELLO = @HAVE_FTELLO@ HAVE_FTRUNCATE = @HAVE_FTRUNCATE@ HAVE_FUTIMENS = @HAVE_FUTIMENS@ HAVE_GETDTABLESIZE = @HAVE_GETDTABLESIZE@ HAVE_GETENTROPY = @HAVE_GETENTROPY@ HAVE_GETGROUPS = @HAVE_GETGROUPS@ HAVE_GETHOSTNAME = @HAVE_GETHOSTNAME@ HAVE_GETLOGIN = @HAVE_GETLOGIN@ HAVE_GETOPT_H = @HAVE_GETOPT_H@ HAVE_GETPAGESIZE = @HAVE_GETPAGESIZE@ HAVE_GETPASS = @HAVE_GETPASS@ HAVE_GETRANDOM = @HAVE_GETRANDOM@ HAVE_GETSUBOPT = @HAVE_GETSUBOPT@ HAVE_GETTIMEOFDAY = @HAVE_GETTIMEOFDAY@ HAVE_GETUMASK = @HAVE_GETUMASK@ HAVE_GRANTPT = @HAVE_GRANTPT@ HAVE_GROUP_MEMBER = @HAVE_GROUP_MEMBER@ HAVE_HYPOTF = @HAVE_HYPOTF@ HAVE_HYPOTL = @HAVE_HYPOTL@ HAVE_ILOGB = @HAVE_ILOGB@ HAVE_ILOGBF = @HAVE_ILOGBF@ HAVE_ILOGBL = @HAVE_ILOGBL@ HAVE_IMAXDIV_T = @HAVE_IMAXDIV_T@ HAVE_INITSTATE = @HAVE_INITSTATE@ HAVE_INTTYPES_H = @HAVE_INTTYPES_H@ HAVE_ISNAND = @HAVE_ISNAND@ HAVE_ISNANF = @HAVE_ISNANF@ HAVE_ISNANL = @HAVE_ISNANL@ HAVE_ISWBLANK = @HAVE_ISWBLANK@ HAVE_ISWCNTRL = @HAVE_ISWCNTRL@ HAVE_LANGINFO_ALTMON = @HAVE_LANGINFO_ALTMON@ HAVE_LANGINFO_CODESET = @HAVE_LANGINFO_CODESET@ HAVE_LANGINFO_ERA = @HAVE_LANGINFO_ERA@ HAVE_LANGINFO_H = @HAVE_LANGINFO_H@ HAVE_LANGINFO_T_FMT_AMPM = @HAVE_LANGINFO_T_FMT_AMPM@ HAVE_LANGINFO_YESEXPR = @HAVE_LANGINFO_YESEXPR@ HAVE_LCHMOD = @HAVE_LCHMOD@ HAVE_LCHOWN = @HAVE_LCHOWN@ HAVE_LDEXPF = @HAVE_LDEXPF@ HAVE_LINK = @HAVE_LINK@ HAVE_LINKAT = @HAVE_LINKAT@ HAVE_LOG10F = @HAVE_LOG10F@ HAVE_LOG10L = @HAVE_LOG10L@ HAVE_LOG1P = @HAVE_LOG1P@ HAVE_LOG1PF = @HAVE_LOG1PF@ HAVE_LOG1PL = @HAVE_LOG1PL@ HAVE_LOGBF = @HAVE_LOGBF@ HAVE_LOGBL = @HAVE_LOGBL@ HAVE_LOGF = @HAVE_LOGF@ HAVE_LOGL = @HAVE_LOGL@ HAVE_LSTAT = @HAVE_LSTAT@ HAVE_MAX_ALIGN_T = @HAVE_MAX_ALIGN_T@ HAVE_MBRLEN = @HAVE_MBRLEN@ HAVE_MBRTOWC = @HAVE_MBRTOWC@ HAVE_MBSINIT = @HAVE_MBSINIT@ HAVE_MBSLEN = @HAVE_MBSLEN@ HAVE_MBSNRTOWCS = @HAVE_MBSNRTOWCS@ HAVE_MBSRTOWCS = @HAVE_MBSRTOWCS@ HAVE_MBTOWC = @HAVE_MBTOWC@ HAVE_MEMPCPY = @HAVE_MEMPCPY@ HAVE_MKDIRAT = @HAVE_MKDIRAT@ HAVE_MKDTEMP = @HAVE_MKDTEMP@ HAVE_MKFIFO = @HAVE_MKFIFO@ HAVE_MKFIFOAT = @HAVE_MKFIFOAT@ HAVE_MKNOD = @HAVE_MKNOD@ HAVE_MKNODAT = @HAVE_MKNODAT@ HAVE_MKOSTEMP = @HAVE_MKOSTEMP@ HAVE_MKOSTEMPS = @HAVE_MKOSTEMPS@ HAVE_MKSTEMP = @HAVE_MKSTEMP@ HAVE_MKSTEMPS = @HAVE_MKSTEMPS@ HAVE_MODFF = @HAVE_MODFF@ HAVE_MODFL = @HAVE_MODFL@ HAVE_MSVC_INVALID_PARAMETER_HANDLER = @HAVE_MSVC_INVALID_PARAMETER_HANDLER@ HAVE_NANOSLEEP = @HAVE_NANOSLEEP@ HAVE_NEWLOCALE = @HAVE_NEWLOCALE@ HAVE_NL_LANGINFO = @HAVE_NL_LANGINFO@ HAVE_OPENAT = @HAVE_OPENAT@ HAVE_OS_H = @HAVE_OS_H@ HAVE_PCLOSE = @HAVE_PCLOSE@ HAVE_PIPE = @HAVE_PIPE@ HAVE_PIPE2 = @HAVE_PIPE2@ HAVE_POPEN = @HAVE_POPEN@ HAVE_POSIX_OPENPT = @HAVE_POSIX_OPENPT@ HAVE_POSIX_SIGNALBLOCKING = @HAVE_POSIX_SIGNALBLOCKING@ HAVE_POWF = @HAVE_POWF@ HAVE_PREAD = @HAVE_PREAD@ HAVE_PSELECT = @HAVE_PSELECT@ HAVE_PTHREAD_SIGMASK = @HAVE_PTHREAD_SIGMASK@ HAVE_PTSNAME = @HAVE_PTSNAME@ HAVE_PTSNAME_R = @HAVE_PTSNAME_R@ HAVE_PWRITE = @HAVE_PWRITE@ HAVE_QSORT_R = @HAVE_QSORT_R@ HAVE_RAISE = @HAVE_RAISE@ HAVE_RANDOM = @HAVE_RANDOM@ HAVE_RANDOM_H = @HAVE_RANDOM_H@ HAVE_RANDOM_R = @HAVE_RANDOM_R@ HAVE_RAWMEMCHR = @HAVE_RAWMEMCHR@ HAVE_READLINK = @HAVE_READLINK@ HAVE_READLINKAT = @HAVE_READLINKAT@ HAVE_REALLOCARRAY = @HAVE_REALLOCARRAY@ HAVE_REALPATH = @HAVE_REALPATH@ HAVE_REMAINDER = @HAVE_REMAINDER@ HAVE_REMAINDERF = @HAVE_REMAINDERF@ HAVE_RENAMEAT = @HAVE_RENAMEAT@ HAVE_RINT = @HAVE_RINT@ HAVE_RINTL = @HAVE_RINTL@ HAVE_RPMATCH = @HAVE_RPMATCH@ HAVE_SAME_LONG_DOUBLE_AS_DOUBLE = @HAVE_SAME_LONG_DOUBLE_AS_DOUBLE@ HAVE_SA_FAMILY_T = @HAVE_SA_FAMILY_T@ HAVE_SECURE_GETENV = @HAVE_SECURE_GETENV@ HAVE_SETENV = @HAVE_SETENV@ HAVE_SETHOSTNAME = @HAVE_SETHOSTNAME@ HAVE_SETSTATE = @HAVE_SETSTATE@ HAVE_SIGACTION = @HAVE_SIGACTION@ HAVE_SIGHANDLER_T = @HAVE_SIGHANDLER_T@ HAVE_SIGINFO_T = @HAVE_SIGINFO_T@ HAVE_SIGNED_SIG_ATOMIC_T = @HAVE_SIGNED_SIG_ATOMIC_T@ HAVE_SIGNED_WCHAR_T = @HAVE_SIGNED_WCHAR_T@ HAVE_SIGNED_WINT_T = @HAVE_SIGNED_WINT_T@ HAVE_SIGSET_T = @HAVE_SIGSET_T@ HAVE_SINF = @HAVE_SINF@ HAVE_SINHF = @HAVE_SINHF@ HAVE_SINL = @HAVE_SINL@ HAVE_SLEEP = @HAVE_SLEEP@ HAVE_SQRTF = @HAVE_SQRTF@ HAVE_SQRTL = @HAVE_SQRTL@ HAVE_STDINT_H = @HAVE_STDINT_H@ HAVE_STPCPY = @HAVE_STPCPY@ HAVE_STPNCPY = @HAVE_STPNCPY@ HAVE_STRCASECMP = @HAVE_STRCASECMP@ HAVE_STRCASESTR = @HAVE_STRCASESTR@ HAVE_STRCHRNUL = @HAVE_STRCHRNUL@ HAVE_STRINGS_H = @HAVE_STRINGS_H@ HAVE_STRPBRK = @HAVE_STRPBRK@ HAVE_STRPTIME = @HAVE_STRPTIME@ HAVE_STRSEP = @HAVE_STRSEP@ HAVE_STRTOD = @HAVE_STRTOD@ HAVE_STRTOLD = @HAVE_STRTOLD@ HAVE_STRTOLL = @HAVE_STRTOLL@ HAVE_STRTOULL = @HAVE_STRTOULL@ HAVE_STRUCT_RANDOM_DATA = @HAVE_STRUCT_RANDOM_DATA@ HAVE_STRUCT_SIGACTION_SA_SIGACTION = @HAVE_STRUCT_SIGACTION_SA_SIGACTION@ HAVE_STRUCT_SOCKADDR_STORAGE = @HAVE_STRUCT_SOCKADDR_STORAGE@ HAVE_STRUCT_SOCKADDR_STORAGE_SS_FAMILY = @HAVE_STRUCT_SOCKADDR_STORAGE_SS_FAMILY@ HAVE_STRUCT_TIMEVAL = @HAVE_STRUCT_TIMEVAL@ HAVE_STRVERSCMP = @HAVE_STRVERSCMP@ HAVE_SYMLINK = @HAVE_SYMLINK@ HAVE_SYMLINKAT = @HAVE_SYMLINKAT@ HAVE_SYS_BITYPES_H = @HAVE_SYS_BITYPES_H@ HAVE_SYS_CDEFS_H = @HAVE_SYS_CDEFS_H@ HAVE_SYS_INTTYPES_H = @HAVE_SYS_INTTYPES_H@ HAVE_SYS_LOADAVG_H = @HAVE_SYS_LOADAVG_H@ HAVE_SYS_PARAM_H = @HAVE_SYS_PARAM_H@ HAVE_SYS_RANDOM_H = @HAVE_SYS_RANDOM_H@ HAVE_SYS_SELECT_H = @HAVE_SYS_SELECT_H@ HAVE_SYS_SOCKET_H = @HAVE_SYS_SOCKET_H@ HAVE_SYS_TIME_H = @HAVE_SYS_TIME_H@ HAVE_SYS_TYPES_H = @HAVE_SYS_TYPES_H@ HAVE_SYS_UIO_H = @HAVE_SYS_UIO_H@ HAVE_TANF = @HAVE_TANF@ HAVE_TANHF = @HAVE_TANHF@ HAVE_TANL = @HAVE_TANL@ HAVE_TERMIOS_H = @HAVE_TERMIOS_H@ HAVE_TIMEGM = @HAVE_TIMEGM@ HAVE_TIMEZONE_T = @HAVE_TIMEZONE_T@ HAVE_TYPE_VOLATILE_SIG_ATOMIC_T = @HAVE_TYPE_VOLATILE_SIG_ATOMIC_T@ HAVE_TZSET = @HAVE_TZSET@ HAVE_UNISTD_H = @HAVE_UNISTD_H@ HAVE_UNLINKAT = @HAVE_UNLINKAT@ HAVE_UNLOCKPT = @HAVE_UNLOCKPT@ HAVE_USLEEP = @HAVE_USLEEP@ HAVE_UTIMENSAT = @HAVE_UTIMENSAT@ HAVE_VASPRINTF = @HAVE_VASPRINTF@ HAVE_VDPRINTF = @HAVE_VDPRINTF@ HAVE_VISIBILITY = @HAVE_VISIBILITY@ HAVE_WCHAR_H = @HAVE_WCHAR_H@ HAVE_WCHAR_T = @HAVE_WCHAR_T@ HAVE_WCPCPY = @HAVE_WCPCPY@ HAVE_WCPNCPY = @HAVE_WCPNCPY@ HAVE_WCRTOMB = @HAVE_WCRTOMB@ HAVE_WCSCASECMP = @HAVE_WCSCASECMP@ HAVE_WCSCAT = @HAVE_WCSCAT@ HAVE_WCSCHR = @HAVE_WCSCHR@ HAVE_WCSCMP = @HAVE_WCSCMP@ HAVE_WCSCOLL = @HAVE_WCSCOLL@ HAVE_WCSCPY = @HAVE_WCSCPY@ HAVE_WCSCSPN = @HAVE_WCSCSPN@ HAVE_WCSDUP = @HAVE_WCSDUP@ HAVE_WCSFTIME = @HAVE_WCSFTIME@ HAVE_WCSLEN = @HAVE_WCSLEN@ HAVE_WCSNCASECMP = @HAVE_WCSNCASECMP@ HAVE_WCSNCAT = @HAVE_WCSNCAT@ HAVE_WCSNCMP = @HAVE_WCSNCMP@ HAVE_WCSNCPY = @HAVE_WCSNCPY@ HAVE_WCSNLEN = @HAVE_WCSNLEN@ HAVE_WCSNRTOMBS = @HAVE_WCSNRTOMBS@ HAVE_WCSPBRK = @HAVE_WCSPBRK@ HAVE_WCSRCHR = @HAVE_WCSRCHR@ HAVE_WCSRTOMBS = @HAVE_WCSRTOMBS@ HAVE_WCSSPN = @HAVE_WCSSPN@ HAVE_WCSSTR = @HAVE_WCSSTR@ HAVE_WCSTOK = @HAVE_WCSTOK@ HAVE_WCSWIDTH = @HAVE_WCSWIDTH@ HAVE_WCSXFRM = @HAVE_WCSXFRM@ HAVE_WCTRANS_T = @HAVE_WCTRANS_T@ HAVE_WCTYPE_H = @HAVE_WCTYPE_H@ HAVE_WCTYPE_T = @HAVE_WCTYPE_T@ HAVE_WINSOCK2_H = @HAVE_WINSOCK2_H@ HAVE_WINT_T = @HAVE_WINT_T@ HAVE_WMEMCHR = @HAVE_WMEMCHR@ HAVE_WMEMCMP = @HAVE_WMEMCMP@ HAVE_WMEMCPY = @HAVE_WMEMCPY@ HAVE_WMEMMOVE = @HAVE_WMEMMOVE@ HAVE_WMEMPCPY = @HAVE_WMEMPCPY@ HAVE_WMEMSET = @HAVE_WMEMSET@ HAVE_WS2TCPIP_H = @HAVE_WS2TCPIP_H@ HAVE_XLOCALE_H = @HAVE_XLOCALE_H@ HAVE__BOOL = @HAVE__BOOL@ HAVE__EXIT = @HAVE__EXIT@ INCLUDE_NEXT = @INCLUDE_NEXT@ INCLUDE_NEXT_AS_FIRST_DIRECTIVE = @INCLUDE_NEXT_AS_FIRST_DIRECTIVE@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_PROGRAM_ENV = @INSTALL_PROGRAM_ENV@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INT32_MAX_LT_INTMAX_MAX = @INT32_MAX_LT_INTMAX_MAX@ INT64_MAX_EQ_LONG_MAX = @INT64_MAX_EQ_LONG_MAX@ INTLLIBS = @INTLLIBS@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ ISFINITE_LIBM = @ISFINITE_LIBM@ ISINF_LIBM = @ISINF_LIBM@ ISNAND_LIBM = @ISNAND_LIBM@ ISNANF_LIBM = @ISNANF_LIBM@ ISNANL_LIBM = @ISNANL_LIBM@ ISNAN_LIBM = @ISNAN_LIBM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBICONV = @LIBICONV@ LIBINTL = @LIBINTL@ LIBMULTITHREAD = @LIBMULTITHREAD@ LIBOBJS = @LIBOBJS@ LIBPMULTITHREAD = @LIBPMULTITHREAD@ LIBPTHREAD = @LIBPTHREAD@ LIBREADLINE = @LIBREADLINE@ LIBS = @LIBS@ LIBSOCKET = @LIBSOCKET@ LIBSTDTHREAD = @LIBSTDTHREAD@ LIBTHREAD = @LIBTHREAD@ LIBTOOL = @LIBTOOL@ LIBUNISTRING_UNICASE_H = @LIBUNISTRING_UNICASE_H@ LIBUNISTRING_UNICTYPE_H = @LIBUNISTRING_UNICTYPE_H@ LIBUNISTRING_UNIGBRK_H = @LIBUNISTRING_UNIGBRK_H@ LIBUNISTRING_UNILBRK_H = @LIBUNISTRING_UNILBRK_H@ LIBUNISTRING_UNINORM_H = @LIBUNISTRING_UNINORM_H@ LIBUNISTRING_UNISTR_H = @LIBUNISTRING_UNISTR_H@ LIBUNISTRING_UNITYPES_H = @LIBUNISTRING_UNITYPES_H@ LIBUNISTRING_UNIWBRK_H = @LIBUNISTRING_UNIWBRK_H@ LIBUNISTRING_UNIWIDTH_H = @LIBUNISTRING_UNIWIDTH_H@ LIBXML2_CFLAGS = @LIBXML2_CFLAGS@ LIBXML2_LIBS = @LIBXML2_LIBS@ LIB_CLOCK_GETTIME = @LIB_CLOCK_GETTIME@ LIB_GETRANDOM = @LIB_GETRANDOM@ LIB_HARD_LOCALE = @LIB_HARD_LOCALE@ LIB_MBRTOWC = @LIB_MBRTOWC@ LIB_NL_LANGINFO = @LIB_NL_LANGINFO@ LIB_SCHED_YIELD = @LIB_SCHED_YIELD@ LIB_SELECT = @LIB_SELECT@ LIB_SETLOCALE_NULL = @LIB_SETLOCALE_NULL@ LIMITS_H = @LIMITS_H@ LIPO = @LIPO@ LN_S = @LN_S@ LOCALCHARSET_TESTS_ENVIRONMENT = @LOCALCHARSET_TESTS_ENVIRONMENT@ LOCALE_FR = @LOCALE_FR@ LOCALE_FR_UTF8 = @LOCALE_FR_UTF8@ LOCALE_JA = @LOCALE_JA@ LOCALE_ZH_CN = @LOCALE_ZH_CN@ LTALLOCA = @LTALLOCA@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBMULTITHREAD = @LTLIBMULTITHREAD@ LTLIBOBJS = @LTLIBOBJS@ LTLIBREADLINE = @LTLIBREADLINE@ LTLIBTHREAD = @LTLIBTHREAD@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ NEXT_AS_FIRST_DIRECTIVE_ERRNO_H = @NEXT_AS_FIRST_DIRECTIVE_ERRNO_H@ NEXT_AS_FIRST_DIRECTIVE_FCNTL_H = @NEXT_AS_FIRST_DIRECTIVE_FCNTL_H@ NEXT_AS_FIRST_DIRECTIVE_FLOAT_H = @NEXT_AS_FIRST_DIRECTIVE_FLOAT_H@ NEXT_AS_FIRST_DIRECTIVE_GETOPT_H = @NEXT_AS_FIRST_DIRECTIVE_GETOPT_H@ NEXT_AS_FIRST_DIRECTIVE_GTK_GTK_H = @NEXT_AS_FIRST_DIRECTIVE_GTK_GTK_H@ NEXT_AS_FIRST_DIRECTIVE_INTTYPES_H = @NEXT_AS_FIRST_DIRECTIVE_INTTYPES_H@ NEXT_AS_FIRST_DIRECTIVE_LANGINFO_H = @NEXT_AS_FIRST_DIRECTIVE_LANGINFO_H@ NEXT_AS_FIRST_DIRECTIVE_LIMITS_H = @NEXT_AS_FIRST_DIRECTIVE_LIMITS_H@ NEXT_AS_FIRST_DIRECTIVE_LOCALE_H = @NEXT_AS_FIRST_DIRECTIVE_LOCALE_H@ NEXT_AS_FIRST_DIRECTIVE_MATH_H = @NEXT_AS_FIRST_DIRECTIVE_MATH_H@ NEXT_AS_FIRST_DIRECTIVE_SIGNAL_H = @NEXT_AS_FIRST_DIRECTIVE_SIGNAL_H@ NEXT_AS_FIRST_DIRECTIVE_STDARG_H = @NEXT_AS_FIRST_DIRECTIVE_STDARG_H@ NEXT_AS_FIRST_DIRECTIVE_STDDEF_H = @NEXT_AS_FIRST_DIRECTIVE_STDDEF_H@ NEXT_AS_FIRST_DIRECTIVE_STDINT_H = @NEXT_AS_FIRST_DIRECTIVE_STDINT_H@ NEXT_AS_FIRST_DIRECTIVE_STDIO_H = @NEXT_AS_FIRST_DIRECTIVE_STDIO_H@ NEXT_AS_FIRST_DIRECTIVE_STDLIB_H = @NEXT_AS_FIRST_DIRECTIVE_STDLIB_H@ NEXT_AS_FIRST_DIRECTIVE_STRINGS_H = @NEXT_AS_FIRST_DIRECTIVE_STRINGS_H@ NEXT_AS_FIRST_DIRECTIVE_STRING_H = @NEXT_AS_FIRST_DIRECTIVE_STRING_H@ NEXT_AS_FIRST_DIRECTIVE_SYS_RANDOM_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_RANDOM_H@ NEXT_AS_FIRST_DIRECTIVE_SYS_SELECT_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_SELECT_H@ NEXT_AS_FIRST_DIRECTIVE_SYS_SOCKET_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_SOCKET_H@ NEXT_AS_FIRST_DIRECTIVE_SYS_STAT_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_STAT_H@ NEXT_AS_FIRST_DIRECTIVE_SYS_TIME_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_TIME_H@ NEXT_AS_FIRST_DIRECTIVE_SYS_TYPES_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_TYPES_H@ NEXT_AS_FIRST_DIRECTIVE_SYS_UIO_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_UIO_H@ NEXT_AS_FIRST_DIRECTIVE_TERMIOS_H = @NEXT_AS_FIRST_DIRECTIVE_TERMIOS_H@ NEXT_AS_FIRST_DIRECTIVE_TIME_H = @NEXT_AS_FIRST_DIRECTIVE_TIME_H@ NEXT_AS_FIRST_DIRECTIVE_UNISTD_H = @NEXT_AS_FIRST_DIRECTIVE_UNISTD_H@ NEXT_AS_FIRST_DIRECTIVE_WCHAR_H = @NEXT_AS_FIRST_DIRECTIVE_WCHAR_H@ NEXT_AS_FIRST_DIRECTIVE_WCTYPE_H = @NEXT_AS_FIRST_DIRECTIVE_WCTYPE_H@ NEXT_ERRNO_H = @NEXT_ERRNO_H@ NEXT_FCNTL_H = @NEXT_FCNTL_H@ NEXT_FLOAT_H = @NEXT_FLOAT_H@ NEXT_GETOPT_H = @NEXT_GETOPT_H@ NEXT_GTK_GTK_H = @NEXT_GTK_GTK_H@ NEXT_INTTYPES_H = @NEXT_INTTYPES_H@ NEXT_LANGINFO_H = @NEXT_LANGINFO_H@ NEXT_LIMITS_H = @NEXT_LIMITS_H@ NEXT_LOCALE_H = @NEXT_LOCALE_H@ NEXT_MATH_H = @NEXT_MATH_H@ NEXT_SIGNAL_H = @NEXT_SIGNAL_H@ NEXT_STDARG_H = @NEXT_STDARG_H@ NEXT_STDDEF_H = @NEXT_STDDEF_H@ NEXT_STDINT_H = @NEXT_STDINT_H@ NEXT_STDIO_H = @NEXT_STDIO_H@ NEXT_STDLIB_H = @NEXT_STDLIB_H@ NEXT_STRINGS_H = @NEXT_STRINGS_H@ NEXT_STRING_H = @NEXT_STRING_H@ NEXT_SYS_RANDOM_H = @NEXT_SYS_RANDOM_H@ NEXT_SYS_SELECT_H = @NEXT_SYS_SELECT_H@ NEXT_SYS_SOCKET_H = @NEXT_SYS_SOCKET_H@ NEXT_SYS_STAT_H = @NEXT_SYS_STAT_H@ NEXT_SYS_TIME_H = @NEXT_SYS_TIME_H@ NEXT_SYS_TYPES_H = @NEXT_SYS_TYPES_H@ NEXT_SYS_UIO_H = @NEXT_SYS_UIO_H@ NEXT_TERMIOS_H = @NEXT_TERMIOS_H@ NEXT_TIME_H = @NEXT_TIME_H@ NEXT_UNISTD_H = @NEXT_UNISTD_H@ NEXT_WCHAR_H = @NEXT_WCHAR_H@ NEXT_WCTYPE_H = @NEXT_WCTYPE_H@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PERL = @PERL@ PG_CFLAGS = @PG_CFLAGS@ PG_CONFIG = @PG_CONFIG@ PG_LDFLAGS = @PG_LDFLAGS@ PG_LIBS = @PG_LIBS@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ POSUB = @POSUB@ PRAGMA_COLUMNS = @PRAGMA_COLUMNS@ PRAGMA_SYSTEM_HEADER = @PRAGMA_SYSTEM_HEADER@ PRIPTR_PREFIX = @PRIPTR_PREFIX@ PSPPIRE_LDFLAGS = @PSPPIRE_LDFLAGS@ PSPP_LDFLAGS = @PSPP_LDFLAGS@ PSQL_SUPPORT = @PSQL_SUPPORT@ PTHREAD_H_DEFINES_STRUCT_TIMESPEC = @PTHREAD_H_DEFINES_STRUCT_TIMESPEC@ PTRDIFF_T_SUFFIX = @PTRDIFF_T_SUFFIX@ PYTHON = @PYTHON@ RANLIB = @RANLIB@ RELOCATABLE = @RELOCATABLE@ RELOCATABLE_BUILD_DIR = @RELOCATABLE_BUILD_DIR@ RELOCATABLE_CONFIG_H_DIR = @RELOCATABLE_CONFIG_H_DIR@ RELOCATABLE_LDFLAGS = @RELOCATABLE_LDFLAGS@ RELOCATABLE_LIBRARY_PATH = @RELOCATABLE_LIBRARY_PATH@ RELOCATABLE_SRC_DIR = @RELOCATABLE_SRC_DIR@ RELOCATABLE_STRIP = @RELOCATABLE_STRIP@ REPLACE_ACCESS = @REPLACE_ACCESS@ REPLACE_ACOSF = @REPLACE_ACOSF@ REPLACE_ASINF = @REPLACE_ASINF@ REPLACE_ATAN2F = @REPLACE_ATAN2F@ REPLACE_ATANF = @REPLACE_ATANF@ REPLACE_BTOWC = @REPLACE_BTOWC@ REPLACE_CALLOC = @REPLACE_CALLOC@ REPLACE_CANONICALIZE_FILE_NAME = @REPLACE_CANONICALIZE_FILE_NAME@ REPLACE_CBRTF = @REPLACE_CBRTF@ REPLACE_CBRTL = @REPLACE_CBRTL@ REPLACE_CEIL = @REPLACE_CEIL@ REPLACE_CEILF = @REPLACE_CEILF@ REPLACE_CEILL = @REPLACE_CEILL@ REPLACE_CHOWN = @REPLACE_CHOWN@ REPLACE_CLOSE = @REPLACE_CLOSE@ REPLACE_COSF = @REPLACE_COSF@ REPLACE_COSHF = @REPLACE_COSHF@ REPLACE_CREAT = @REPLACE_CREAT@ REPLACE_CTIME = @REPLACE_CTIME@ REPLACE_DPRINTF = @REPLACE_DPRINTF@ REPLACE_DUP = @REPLACE_DUP@ REPLACE_DUP2 = @REPLACE_DUP2@ REPLACE_DUPLOCALE = @REPLACE_DUPLOCALE@ REPLACE_EXP2 = @REPLACE_EXP2@ REPLACE_EXP2L = @REPLACE_EXP2L@ REPLACE_EXPF = @REPLACE_EXPF@ REPLACE_EXPL = @REPLACE_EXPL@ REPLACE_EXPM1 = @REPLACE_EXPM1@ REPLACE_EXPM1F = @REPLACE_EXPM1F@ REPLACE_EXPM1L = @REPLACE_EXPM1L@ REPLACE_FABSL = @REPLACE_FABSL@ REPLACE_FACCESSAT = @REPLACE_FACCESSAT@ REPLACE_FCHMODAT = @REPLACE_FCHMODAT@ REPLACE_FCHOWNAT = @REPLACE_FCHOWNAT@ REPLACE_FCLOSE = @REPLACE_FCLOSE@ REPLACE_FCNTL = @REPLACE_FCNTL@ REPLACE_FDOPEN = @REPLACE_FDOPEN@ REPLACE_FFLUSH = @REPLACE_FFLUSH@ REPLACE_FLOOR = @REPLACE_FLOOR@ REPLACE_FLOORF = @REPLACE_FLOORF@ REPLACE_FLOORL = @REPLACE_FLOORL@ REPLACE_FMA = @REPLACE_FMA@ REPLACE_FMAF = @REPLACE_FMAF@ REPLACE_FMAL = @REPLACE_FMAL@ REPLACE_FMOD = @REPLACE_FMOD@ REPLACE_FMODF = @REPLACE_FMODF@ REPLACE_FMODL = @REPLACE_FMODL@ REPLACE_FOPEN = @REPLACE_FOPEN@ REPLACE_FPRINTF = @REPLACE_FPRINTF@ REPLACE_FPURGE = @REPLACE_FPURGE@ REPLACE_FREELOCALE = @REPLACE_FREELOCALE@ REPLACE_FREOPEN = @REPLACE_FREOPEN@ REPLACE_FREXP = @REPLACE_FREXP@ REPLACE_FREXPF = @REPLACE_FREXPF@ REPLACE_FREXPL = @REPLACE_FREXPL@ REPLACE_FSEEK = @REPLACE_FSEEK@ REPLACE_FSEEKO = @REPLACE_FSEEKO@ REPLACE_FSTAT = @REPLACE_FSTAT@ REPLACE_FSTATAT = @REPLACE_FSTATAT@ REPLACE_FTELL = @REPLACE_FTELL@ REPLACE_FTELLO = @REPLACE_FTELLO@ REPLACE_FTRUNCATE = @REPLACE_FTRUNCATE@ REPLACE_FUTIMENS = @REPLACE_FUTIMENS@ REPLACE_GETCWD = @REPLACE_GETCWD@ REPLACE_GETDELIM = @REPLACE_GETDELIM@ REPLACE_GETDOMAINNAME = @REPLACE_GETDOMAINNAME@ REPLACE_GETDTABLESIZE = @REPLACE_GETDTABLESIZE@ REPLACE_GETGROUPS = @REPLACE_GETGROUPS@ REPLACE_GETLINE = @REPLACE_GETLINE@ REPLACE_GETLOGIN_R = @REPLACE_GETLOGIN_R@ REPLACE_GETPAGESIZE = @REPLACE_GETPAGESIZE@ REPLACE_GETPASS = @REPLACE_GETPASS@ REPLACE_GETRANDOM = @REPLACE_GETRANDOM@ REPLACE_GETTIMEOFDAY = @REPLACE_GETTIMEOFDAY@ REPLACE_GMTIME = @REPLACE_GMTIME@ REPLACE_HUGE_VAL = @REPLACE_HUGE_VAL@ REPLACE_HYPOT = @REPLACE_HYPOT@ REPLACE_HYPOTF = @REPLACE_HYPOTF@ REPLACE_HYPOTL = @REPLACE_HYPOTL@ REPLACE_ILOGB = @REPLACE_ILOGB@ REPLACE_ILOGBF = @REPLACE_ILOGBF@ REPLACE_ILOGBL = @REPLACE_ILOGBL@ REPLACE_INITSTATE = @REPLACE_INITSTATE@ REPLACE_ISATTY = @REPLACE_ISATTY@ REPLACE_ISFINITE = @REPLACE_ISFINITE@ REPLACE_ISINF = @REPLACE_ISINF@ REPLACE_ISNAN = @REPLACE_ISNAN@ REPLACE_ISWBLANK = @REPLACE_ISWBLANK@ REPLACE_ISWCNTRL = @REPLACE_ISWCNTRL@ REPLACE_ISWDIGIT = @REPLACE_ISWDIGIT@ REPLACE_ISWXDIGIT = @REPLACE_ISWXDIGIT@ REPLACE_ITOLD = @REPLACE_ITOLD@ REPLACE_LCHOWN = @REPLACE_LCHOWN@ REPLACE_LDEXPL = @REPLACE_LDEXPL@ REPLACE_LINK = @REPLACE_LINK@ REPLACE_LINKAT = @REPLACE_LINKAT@ REPLACE_LOCALECONV = @REPLACE_LOCALECONV@ REPLACE_LOCALTIME = @REPLACE_LOCALTIME@ REPLACE_LOCALTIME_R = @REPLACE_LOCALTIME_R@ REPLACE_LOG = @REPLACE_LOG@ REPLACE_LOG10 = @REPLACE_LOG10@ REPLACE_LOG10F = @REPLACE_LOG10F@ REPLACE_LOG10L = @REPLACE_LOG10L@ REPLACE_LOG1P = @REPLACE_LOG1P@ REPLACE_LOG1PF = @REPLACE_LOG1PF@ REPLACE_LOG1PL = @REPLACE_LOG1PL@ REPLACE_LOG2 = @REPLACE_LOG2@ REPLACE_LOG2F = @REPLACE_LOG2F@ REPLACE_LOG2L = @REPLACE_LOG2L@ REPLACE_LOGB = @REPLACE_LOGB@ REPLACE_LOGBF = @REPLACE_LOGBF@ REPLACE_LOGBL = @REPLACE_LOGBL@ REPLACE_LOGF = @REPLACE_LOGF@ REPLACE_LOGL = @REPLACE_LOGL@ REPLACE_LSEEK = @REPLACE_LSEEK@ REPLACE_LSTAT = @REPLACE_LSTAT@ REPLACE_MALLOC = @REPLACE_MALLOC@ REPLACE_MBRLEN = @REPLACE_MBRLEN@ REPLACE_MBRTOWC = @REPLACE_MBRTOWC@ REPLACE_MBSINIT = @REPLACE_MBSINIT@ REPLACE_MBSNRTOWCS = @REPLACE_MBSNRTOWCS@ REPLACE_MBSRTOWCS = @REPLACE_MBSRTOWCS@ REPLACE_MBSTATE_T = @REPLACE_MBSTATE_T@ REPLACE_MBTOWC = @REPLACE_MBTOWC@ REPLACE_MEMCHR = @REPLACE_MEMCHR@ REPLACE_MEMMEM = @REPLACE_MEMMEM@ REPLACE_MKDIR = @REPLACE_MKDIR@ REPLACE_MKFIFO = @REPLACE_MKFIFO@ REPLACE_MKNOD = @REPLACE_MKNOD@ REPLACE_MKSTEMP = @REPLACE_MKSTEMP@ REPLACE_MKTIME = @REPLACE_MKTIME@ REPLACE_MODF = @REPLACE_MODF@ REPLACE_MODFF = @REPLACE_MODFF@ REPLACE_MODFL = @REPLACE_MODFL@ REPLACE_NAN = @REPLACE_NAN@ REPLACE_NANOSLEEP = @REPLACE_NANOSLEEP@ REPLACE_NEWLOCALE = @REPLACE_NEWLOCALE@ REPLACE_NL_LANGINFO = @REPLACE_NL_LANGINFO@ REPLACE_NULL = @REPLACE_NULL@ REPLACE_OBSTACK_PRINTF = @REPLACE_OBSTACK_PRINTF@ REPLACE_OPEN = @REPLACE_OPEN@ REPLACE_OPENAT = @REPLACE_OPENAT@ REPLACE_PERROR = @REPLACE_PERROR@ REPLACE_POPEN = @REPLACE_POPEN@ REPLACE_PREAD = @REPLACE_PREAD@ REPLACE_PRINTF = @REPLACE_PRINTF@ REPLACE_PSELECT = @REPLACE_PSELECT@ REPLACE_PTHREAD_SIGMASK = @REPLACE_PTHREAD_SIGMASK@ REPLACE_PTSNAME = @REPLACE_PTSNAME@ REPLACE_PTSNAME_R = @REPLACE_PTSNAME_R@ REPLACE_PUTENV = @REPLACE_PUTENV@ REPLACE_PWRITE = @REPLACE_PWRITE@ REPLACE_QSORT_R = @REPLACE_QSORT_R@ REPLACE_RAISE = @REPLACE_RAISE@ REPLACE_RANDOM = @REPLACE_RANDOM@ REPLACE_RANDOM_R = @REPLACE_RANDOM_R@ REPLACE_READ = @REPLACE_READ@ REPLACE_READLINK = @REPLACE_READLINK@ REPLACE_READLINKAT = @REPLACE_READLINKAT@ REPLACE_REALLOC = @REPLACE_REALLOC@ REPLACE_REALPATH = @REPLACE_REALPATH@ REPLACE_REMAINDER = @REPLACE_REMAINDER@ REPLACE_REMAINDERF = @REPLACE_REMAINDERF@ REPLACE_REMAINDERL = @REPLACE_REMAINDERL@ REPLACE_REMOVE = @REPLACE_REMOVE@ REPLACE_RENAME = @REPLACE_RENAME@ REPLACE_RENAMEAT = @REPLACE_RENAMEAT@ REPLACE_RINTL = @REPLACE_RINTL@ REPLACE_RMDIR = @REPLACE_RMDIR@ REPLACE_ROUND = @REPLACE_ROUND@ REPLACE_ROUNDF = @REPLACE_ROUNDF@ REPLACE_ROUNDL = @REPLACE_ROUNDL@ REPLACE_SELECT = @REPLACE_SELECT@ REPLACE_SETENV = @REPLACE_SETENV@ REPLACE_SETLOCALE = @REPLACE_SETLOCALE@ REPLACE_SETSTATE = @REPLACE_SETSTATE@ REPLACE_SIGNBIT = @REPLACE_SIGNBIT@ REPLACE_SIGNBIT_USING_BUILTINS = @REPLACE_SIGNBIT_USING_BUILTINS@ REPLACE_SINF = @REPLACE_SINF@ REPLACE_SINHF = @REPLACE_SINHF@ REPLACE_SLEEP = @REPLACE_SLEEP@ REPLACE_SNPRINTF = @REPLACE_SNPRINTF@ REPLACE_SPRINTF = @REPLACE_SPRINTF@ REPLACE_SQRTF = @REPLACE_SQRTF@ REPLACE_SQRTL = @REPLACE_SQRTL@ REPLACE_STAT = @REPLACE_STAT@ REPLACE_STDIO_READ_FUNCS = @REPLACE_STDIO_READ_FUNCS@ REPLACE_STDIO_WRITE_FUNCS = @REPLACE_STDIO_WRITE_FUNCS@ REPLACE_STPNCPY = @REPLACE_STPNCPY@ REPLACE_STRCASESTR = @REPLACE_STRCASESTR@ REPLACE_STRCHRNUL = @REPLACE_STRCHRNUL@ REPLACE_STRDUP = @REPLACE_STRDUP@ REPLACE_STRERROR = @REPLACE_STRERROR@ REPLACE_STRERROR_R = @REPLACE_STRERROR_R@ REPLACE_STRFTIME = @REPLACE_STRFTIME@ REPLACE_STRNCAT = @REPLACE_STRNCAT@ REPLACE_STRNDUP = @REPLACE_STRNDUP@ REPLACE_STRNLEN = @REPLACE_STRNLEN@ REPLACE_STRSIGNAL = @REPLACE_STRSIGNAL@ REPLACE_STRSTR = @REPLACE_STRSTR@ REPLACE_STRTOD = @REPLACE_STRTOD@ REPLACE_STRTOIMAX = @REPLACE_STRTOIMAX@ REPLACE_STRTOK_R = @REPLACE_STRTOK_R@ REPLACE_STRTOLD = @REPLACE_STRTOLD@ REPLACE_STRTOUMAX = @REPLACE_STRTOUMAX@ REPLACE_STRUCT_LCONV = @REPLACE_STRUCT_LCONV@ REPLACE_STRUCT_TIMEVAL = @REPLACE_STRUCT_TIMEVAL@ REPLACE_SYMLINK = @REPLACE_SYMLINK@ REPLACE_SYMLINKAT = @REPLACE_SYMLINKAT@ REPLACE_TANF = @REPLACE_TANF@ REPLACE_TANHF = @REPLACE_TANHF@ REPLACE_TIMEGM = @REPLACE_TIMEGM@ REPLACE_TMPFILE = @REPLACE_TMPFILE@ REPLACE_TOWLOWER = @REPLACE_TOWLOWER@ REPLACE_TRUNC = @REPLACE_TRUNC@ REPLACE_TRUNCATE = @REPLACE_TRUNCATE@ REPLACE_TRUNCF = @REPLACE_TRUNCF@ REPLACE_TRUNCL = @REPLACE_TRUNCL@ REPLACE_TTYNAME_R = @REPLACE_TTYNAME_R@ REPLACE_TZSET = @REPLACE_TZSET@ REPLACE_UNLINK = @REPLACE_UNLINK@ REPLACE_UNLINKAT = @REPLACE_UNLINKAT@ REPLACE_UNSETENV = @REPLACE_UNSETENV@ REPLACE_USLEEP = @REPLACE_USLEEP@ REPLACE_UTIMENSAT = @REPLACE_UTIMENSAT@ REPLACE_VASPRINTF = @REPLACE_VASPRINTF@ REPLACE_VDPRINTF = @REPLACE_VDPRINTF@ REPLACE_VFPRINTF = @REPLACE_VFPRINTF@ REPLACE_VPRINTF = @REPLACE_VPRINTF@ REPLACE_VSNPRINTF = @REPLACE_VSNPRINTF@ REPLACE_VSPRINTF = @REPLACE_VSPRINTF@ REPLACE_WCRTOMB = @REPLACE_WCRTOMB@ REPLACE_WCSFTIME = @REPLACE_WCSFTIME@ REPLACE_WCSNRTOMBS = @REPLACE_WCSNRTOMBS@ REPLACE_WCSRTOMBS = @REPLACE_WCSRTOMBS@ REPLACE_WCSTOK = @REPLACE_WCSTOK@ REPLACE_WCSWIDTH = @REPLACE_WCSWIDTH@ REPLACE_WCTOB = @REPLACE_WCTOB@ REPLACE_WCTOMB = @REPLACE_WCTOMB@ REPLACE_WCWIDTH = @REPLACE_WCWIDTH@ REPLACE_WRITE = @REPLACE_WRITE@ ROUND_LIBM = @ROUND_LIBM@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SIG_ATOMIC_T_SUFFIX = @SIG_ATOMIC_T_SUFFIX@ SIZE_T_SUFFIX = @SIZE_T_SUFFIX@ SPREAD_SHEET_WIDGET_CFLAGS = @SPREAD_SHEET_WIDGET_CFLAGS@ SPREAD_SHEET_WIDGET_LIBS = @SPREAD_SHEET_WIDGET_LIBS@ STDALIGN_H = @STDALIGN_H@ STDARG_H = @STDARG_H@ STDBOOL_H = @STDBOOL_H@ STDDEF_H = @STDDEF_H@ STDINT_H = @STDINT_H@ STRIP = @STRIP@ SYS_TIME_H_DEFINES_STRUCT_TIMESPEC = @SYS_TIME_H_DEFINES_STRUCT_TIMESPEC@ TIME_H_DEFINES_STRUCT_TIMESPEC = @TIME_H_DEFINES_STRUCT_TIMESPEC@ TRUNC_LIBM = @TRUNC_LIBM@ UINT32_MAX_LT_UINTMAX_MAX = @UINT32_MAX_LT_UINTMAX_MAX@ UINT64_MAX_EQ_ULONG_MAX = @UINT64_MAX_EQ_ULONG_MAX@ UNDEFINE_STRTOK_R = @UNDEFINE_STRTOK_R@ UNISTD_H_DEFINES_STRUCT_TIMESPEC = @UNISTD_H_DEFINES_STRUCT_TIMESPEC@ UNISTD_H_HAVE_SYS_RANDOM_H = @UNISTD_H_HAVE_SYS_RANDOM_H@ UNISTD_H_HAVE_WINSOCK2_H = @UNISTD_H_HAVE_WINSOCK2_H@ UNISTD_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS = @UNISTD_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ VERSION_FOR_PERL = @VERSION_FOR_PERL@ WCHAR_T_SUFFIX = @WCHAR_T_SUFFIX@ WINDOWS_64_BIT_OFF_T = @WINDOWS_64_BIT_OFF_T@ WINDOWS_64_BIT_ST_SIZE = @WINDOWS_64_BIT_ST_SIZE@ WINDOWS_STAT_INODES = @WINDOWS_STAT_INODES@ WINDOWS_STAT_TIMESPEC = @WINDOWS_STAT_TIMESPEC@ WINT_T_SUFFIX = @WINT_T_SUFFIX@ WITH_PERL_MODULE = @WITH_PERL_MODULE@ XGETTEXT = @XGETTEXT@ XMLLINT = @XMLLINT@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ gl_LIBOBJS = @gl_LIBOBJS@ gl_LTLIBOBJS = @gl_LTLIBOBJS@ gltests_LIBOBJS = @gltests_LIBOBJS@ gltests_LTLIBOBJS = @gltests_LTLIBOBJS@ gltests_WITNESS = @gltests_WITNESS@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ lispdir = @lispdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ AUTOMAKE_OPTIONS = 1.11 gnits subdir-objects SUBDIRS = noinst_HEADERS = noinst_LIBRARIES = noinst_LTLIBRARIES = libgl.la # No GNU Make output. EXTRA_DIST = m4/gnulib-cache.m4 alloca.c alloca.in.h allocator.h \ areadlink.h array-mergesort.h asyncsafe-spin.h attribute.h \ basename-lgpl.h btowc.c byteswap.in.h c-snprintf.h \ str-two-way.h c-strtod.h c-vasnprintf.h float+.h printf-args.c \ printf-args.h printf-parse.c printf-parse.h vasnprintf.c \ vasnprintf.h c-vasprintf.h c-xvasprintf.h canonicalize-lgpl.c \ careadlinkat.h cloexec.h close.c count-leading-zeros.h \ count-one-bits.h crc.h md4.h rijndael-alg-fst.h \ rijndael-api-fst.h stripslash.c dirname.h ftoastr.c ftoastr.h \ dup2.c errno.in.h error.c error.h exitfail.h explicit_bzero.c \ fcntl.c fcntl.in.h fd-hook.h filename.h flexmember.h float.c \ float.in.h itold.c floor.c fopen.c fprintf.c fpucw.h frexp.c \ frexp.c frexpl.c fseek.c fseeko.c stdio-impl.h fseterr.c \ fseterr.h stdio-impl.h fstat.c stat-w32.c stat-w32.h ftell.c \ ftello.c stdio-impl.h full-write.c getdelim.c getdtablesize.c \ getline.c getopt-cdefs.in.h getopt-core.h getopt-ext.h \ getopt-pfx-core.h getopt-pfx-ext.h getopt.c getopt.in.h \ getopt1.c getopt_int.h getpass.c getpass.h getrandom.c \ gettimeofday.c $(top_srcdir)/build-aux/gitlog-to-changelog \ hard-locale.h intprops.h anytostr.c inttostr.h inttypes.in.h \ isfinite.c isinf.c float+.h isnan.c isnand.c float+.h isnan.c \ isnand-nolibm.h isnand.c float+.h isnan.c isnanf.c float+.h \ isnan.c isnanf-nolibm.h isnanf.c float+.h isnan.c isnanl.c \ float+.h isnan.c isnanl-nolibm.h isnanl.c iswblank.c \ iswdigit.c iswxdigit.c langinfo.in.h cdefs.h libc-config.h \ limits.in.h localcharset.h locale.in.h localeconv.c \ localename-table.h localename.h lseek.c lstat.c malloc.c \ malloca.h math.in.h mbchar.h lc-charset-dispatch.c \ lc-charset-dispatch.h mbrtowc-impl-utf8.h mbrtowc-impl.h \ mbrtowc.c mbtowc-lock.c mbtowc-lock.h windows-initguard.h \ mbsinit.c mbtowc-impl.h mbtowc.c memcasecmp.h memchr.c \ memchr.valgrind memchr2.valgrind memmem.c str-two-way.h \ mempcpy.c memrchr.c mkdir.c mkdtemp.c mkstemp.c \ mktime-internal.h mktime.c mktime-internal.h mktime.c \ msvc-inval.c msvc-inval.h msvc-nothrow.c msvc-nothrow.h \ nl_langinfo.c strftime.h open.c pathmax.h printf-frexp.h \ printf-frexp.c printf-frexpl.h printf.c raise.c rawmemchr.c \ rawmemchr.valgrind read.c read-file.h readlink.c realloc.c \ regcomp.c regex.c regex.h regex_internal.c regex_internal.h \ regexec.c progreloc.c relocatable.c relocatable.h \ $(top_srcdir)/build-aux/config.libpath \ $(top_srcdir)/build-aux/reloc-ldflags \ $(top_srcdir)/build-aux/libtool-reloc allocator.c allocator.h \ areadlink.c areadlink.h c-ctype.c c-ctype.h \ canonicalize-lgpl.c careadlinkat.c careadlinkat.h lstat.c \ malloca.c malloca.h progname.c progname.h progreloc.c \ readlink.c relocatable.c relocatable.h relocwrapper.c setenv.c \ stat.c $(top_srcdir)/build-aux/install-reloc rename.c rmdir.c \ round.c safe-read.h sys-limits.h safe-read.c safe-write.h \ sys-limits.h same-inode.h secure_getenv.c select.c setenv.c \ setlocale-lock.c setlocale_null.h windows-initguard.h \ sig-handler.h sigaction.c signal.in.h float+.h signbitd.c \ signbitf.c signbitl.c sigprocmask.c _Noreturn.h arg-nonnull.h \ c++defs.h unused-parameter.h warn-on-use.h snprintf.c \ w32sock.h sprintf.c stat-w32.c stat-w32.h stat.c stat-time.h \ stdalign.in.h stdarg.in.h stdbool.in.h stddef.in.h stdint.in.h \ stdio.in.h stdlib.in.h stpcpy.c strcasecmp.c strncasecmp.c \ str-two-way.h strcasestr.c strdup.c streq.h strerror.c \ strerror-override.c strerror-override.h string.in.h \ strings.in.h strncat.c strndup.c strnlen.c strsep.c strtod.c \ strtok_r.c sys_random.in.h sys_select.in.h sys_socket.in.h \ sys_stat.in.h sys_time.in.h sys_types.in.h sys_uio.in.h \ tempname.h termios.in.h thread-optim.h time.in.h time_r.c \ time-internal.h time_rz.c mktime-internal.h timegm.c \ timespec.h trunc.c tzset.c unicase.in.h unicase/cased.h \ unicase/caseprop.h unictype/bitmap.h unicase/caseprop.h \ unicase/ignorable.h unictype/bitmap.h \ unicase/special-casing-table.h \ unicase/special-casing-table.gperf unicase/special-casing.in.h \ unicase/casefold.h unicase/simple-mapping.h \ unicase/tocasefold.h unicase/simple-mapping.h \ unicase/tolower.h unicase/simple-mapping.h unicase/totitle.h \ unicase/simple-mapping.h unicase/toupper.h unicase/u-casecmp.h \ unicase/u-casefold.h unicase/context.h unicase/u-casemap.h \ unicase/unicasemap.h unicase/u-ct-casefold.h unicase/context.h \ unicase/u-ct-totitle.h unicase/u-totitle.h unictype.in.h \ unictype/categ_of.h unictype/combiningclass.h \ unictype/bitmap.h unictype/ctype_print.h unictype/bitmap.h \ unictype/pr_soft_dotted.h unigbrk.in.h unigbrk/gbrkprop.h \ unilbrk.in.h unilbrk/lbrkprop1.h unilbrk/lbrkprop2.h \ unilbrk/lbrktables.h uniwidth/cjk.h uninorm.in.h \ uninorm/decompose-internal.h uninorm/decompose-internal.h \ uninorm/normalize-internal.h uninorm/decomposition-table.h \ uninorm/decomposition-table1.h uninorm/decomposition-table2.h \ uninorm/normalize-internal.h uninorm/normalize-internal.h \ uninorm/normalize-internal.h uninorm/u-normalize-internal.h \ unistd.in.h unistr.in.h unistr/u-cmp2.h unistr/u-cpy.h \ unitypes.in.h uniwbrk.in.h uniwbrk/wbrktable.h \ uniwbrk/u-wordbreaks.h uniwbrk/wbrkprop.h localcharset.h \ uniwidth.in.h uniwidth/cjk.h unlocked-io.h unsetenv.c \ asnprintf.c float+.h printf-args.c printf-args.h \ printf-parse.c printf-parse.h vasnprintf.c vasnprintf.h \ asprintf.c vasprintf.c verify.h vfprintf.c vprintf.c \ vsnprintf.c vsprintf.c wchar.in.h wcrtomb.c wctype.in.h \ wcwidth.c windows-initguard.h windows-mutex.c windows-mutex.h \ windows-once.c windows-once.h windows-initguard.h \ windows-recmutex.c windows-recmutex.h windows-initguard.h \ windows-rwlock.c windows-rwlock.h windows-spin.c \ windows-spin.h write.c xalloc.h xalloc.h xalloc-oversized.h \ xmalloca.h xreadlink.h xalloc.h BUILT_SOURCES = $(ALLOCA_H) $(BYTESWAP_H) configmake.h $(ERRNO_H) \ fcntl.h $(FLOAT_H) $(GETOPT_H) $(GETOPT_CDEFS_H) inttypes.h \ langinfo.h $(LIMITS_H) locale.h math.h signal.h $(STDALIGN_H) \ $(STDARG_H) $(STDBOOL_H) $(STDDEF_H) $(STDINT_H) stdio.h \ stdlib.h string.h strings.h sys/random.h sys/select.h \ sys/socket.h sys/stat.h sys/time.h sys/types.h sys/uio.h \ termios.h time.h $(LIBUNISTRING_UNICASE_H) \ unicase/special-casing-table.h unicase/special-casing.h \ $(LIBUNISTRING_UNICTYPE_H) $(LIBUNISTRING_UNIGBRK_H) \ $(LIBUNISTRING_UNILBRK_H) $(LIBUNISTRING_UNINORM_H) unistd.h \ $(LIBUNISTRING_UNISTR_H) $(LIBUNISTRING_UNITYPES_H) \ $(LIBUNISTRING_UNIWBRK_H) $(LIBUNISTRING_UNIWIDTH_H) wchar.h \ wctype.h SUFFIXES = MOSTLYCLEANFILES = core *.stackdump alloca.h alloca.h-t byteswap.h \ byteswap.h-t errno.h errno.h-t fcntl.h fcntl.h-t float.h \ float.h-t getopt.h getopt.h-t getopt-cdefs.h getopt-cdefs.h-t \ inttypes.h inttypes.h-t langinfo.h langinfo.h-t limits.h \ limits.h-t locale.h locale.h-t math.h math.h-t signal.h \ signal.h-t stdalign.h stdalign.h-t stdarg.h stdarg.h-t \ stdbool.h stdbool.h-t stddef.h stddef.h-t stdint.h stdint.h-t \ stdio.h stdio.h-t stdlib.h stdlib.h-t string.h string.h-t \ strings.h strings.h-t sys/random.h sys/random.h-t sys/select.h \ sys/select.h-t sys/socket.h sys/socket.h-t sys/stat.h \ sys/stat.h-t sys/time.h sys/time.h-t sys/types.h sys/types.h-t \ sys/uio.h sys/uio.h-t termios.h termios.h-t time.h time.h-t \ unicase.h unicase.h-t unicase/special-casing-table.h-t \ unicase/special-casing.h unicase/special-casing.h-t unictype.h \ unictype.h-t unigbrk.h unigbrk.h-t unilbrk.h unilbrk.h-t \ uninorm.h uninorm.h-t unistd.h unistd.h-t unistr.h unistr.h-t \ unitypes.h unitypes.h-t uniwbrk.h uniwbrk.h-t uniwidth.h \ uniwidth.h-t wchar.h wchar.h-t wctype.h wctype.h-t MOSTLYCLEANDIRS = sys sys sys sys sys CLEANFILES = configmake.h configmake.h-t DISTCLEANFILES = MAINTAINERCLEANFILES = unicase/special-casing-table.h AM_CPPFLAGS = AM_CFLAGS = libgl_la_SOURCES = allocator.c areadlink.c asyncsafe-spin.c \ basename-lgpl.c binary-io.h binary-io.c c-ctype.h c-ctype.c \ c-snprintf.c c-strcase.h c-strcasecmp.c c-strncasecmp.c \ c-strcasestr.h c-strcasestr.c c-strtod.c c-vasnprintf.c \ c-asprintf.c c-vasprintf.c c-xasprintf.c c-xvasprintf.c \ careadlinkat.c clean-temp.h clean-temp.c cloexec.c \ count-leading-zeros.c count-one-bits.c crc.c md4.c \ rijndael-alg-fst.c rijndael-api-fst.c dirname.c basename.c \ dirname-lgpl.c stripslash.c dtoastr.c dtotimespec.c exitfail.c \ fatal-signal.h fatal-signal.c fd-hook.c full-read.h \ full-read.c full-write.h full-write.c fwriteerror.h \ fwriteerror.c getprogname.h getprogname.c gettext.h gettime.c \ hard-locale.c imaxtostr.c inttostr.c offtostr.c uinttostr.c \ umaxtostr.c gl_linked_list.h gl_linked_list.c \ gl_anylinked_list1.h gl_anylinked_list2.h gl_linkedhash_list.h \ gl_linkedhash_list.c gl_anyhash1.h gl_anyhash2.h \ gl_anyhash_primes.h gl_anylinked_list1.h gl_anylinked_list2.h \ gl_list.h gl_list.c localcharset.c localename.c \ localename-table.c glthread/lock.h glthread/lock.c malloca.c \ math.c mbchar.c mbiter.h mbiter.c memcasecmp.c memchr2.h \ memchr2.c minmax.h nstrftime.c pipe2.c printf-frexp.c \ printf-frexpl.c progname.h progname.c read-file.c safe-read.c \ safe-write.c setlocale_null.c sig-handler.c size_max.h \ sockets.h sockets.c stat-time.c sys_socket.c tempname.c \ glthread/threadlib.c timespec.c timespec-add.c timespec-sub.c \ tmpdir.h tmpdir.c unicase/cased.c $(am__append_1) \ $(am__append_2) unicase/ignorable.c unicase/special-casing.c \ unicase/tocasefold.c $(am__append_3) $(am__append_4) \ $(am__append_5) $(am__append_6) $(am__append_7) \ unicase/u8-casemap.c $(am__append_8) $(am__append_9) \ $(am__append_10) $(am__append_11) $(am__append_12) \ $(am__append_13) $(am__append_14) $(am__append_15) \ $(am__append_16) $(am__append_17) $(am__append_18) \ $(am__append_19) unilbrk/lbrktables.c $(am__append_20) \ $(am__append_21) uninorm/compat-decomposition.c \ uninorm/decompose-internal.c $(am__append_22) $(am__append_23) \ uninorm/decomposition-table.c $(am__append_24) \ $(am__append_25) $(am__append_26) unistd.c $(am__append_27) \ $(am__append_28) $(am__append_29) $(am__append_30) \ $(am__append_31) $(am__append_32) $(am__append_33) \ $(am__append_34) $(am__append_35) $(am__append_36) \ $(am__append_37) $(am__append_38) uniwbrk/wbrktable.c \ $(am__append_39) $(am__append_40) $(am__append_41) \ $(am__append_42) $(am__append_43) version-etc.h version-etc.c \ version-etc-fsf.c wctype-h.c xmalloc.c xalloc-die.c \ xbinary-io.h xbinary-io.c gl_xlist.h gl_xlist.c xmalloca.c \ xmemdup0.h xmemdup0.c xreadlink.c xsize.h xsize.c xstrndup.h \ xstrndup.c xvasprintf.h xvasprintf.c xasprintf.c libgl_la_LIBADD = $(gl_LTLIBOBJS) @LTALLOCA@ libgl_la_DEPENDENCIES = $(gl_LTLIBOBJS) @LTALLOCA@ EXTRA_libgl_la_SOURCES = alloca.c btowc.c printf-args.c printf-parse.c \ vasnprintf.c canonicalize-lgpl.c close.c stripslash.c \ ftoastr.c dup2.c error.c explicit_bzero.c fcntl.c float.c \ itold.c floor.c fopen.c fprintf.c frexp.c frexp.c frexpl.c \ fseek.c fseeko.c fseterr.c fstat.c stat-w32.c ftell.c ftello.c \ full-write.c getdelim.c getdtablesize.c getline.c getopt.c \ getopt1.c getpass.c getrandom.c gettimeofday.c anytostr.c \ isfinite.c isinf.c isnan.c isnand.c isnan.c isnand.c isnan.c \ isnanf.c isnan.c isnanf.c isnan.c isnanl.c isnan.c isnanl.c \ iswblank.c iswdigit.c iswxdigit.c localeconv.c lseek.c lstat.c \ malloc.c lc-charset-dispatch.c mbrtowc.c mbtowc-lock.c \ mbsinit.c mbtowc.c memchr.c memmem.c mempcpy.c memrchr.c \ mkdir.c mkdtemp.c mkstemp.c mktime.c mktime.c msvc-inval.c \ msvc-nothrow.c nl_langinfo.c open.c printf-frexp.c printf.c \ raise.c rawmemchr.c read.c readlink.c realloc.c regcomp.c \ regex.c regex_internal.c regexec.c progreloc.c relocatable.c \ rename.c rmdir.c round.c safe-read.c secure_getenv.c select.c \ setenv.c setlocale-lock.c sigaction.c signbitd.c signbitf.c \ signbitl.c sigprocmask.c snprintf.c sprintf.c stat-w32.c \ stat.c stpcpy.c strcasecmp.c strncasecmp.c strcasestr.c \ strdup.c strerror.c strerror-override.c strncat.c strndup.c \ strnlen.c strsep.c strtod.c strtok_r.c time_r.c time_rz.c \ timegm.c trunc.c tzset.c unsetenv.c asnprintf.c printf-args.c \ printf-parse.c vasnprintf.c asprintf.c vasprintf.c vfprintf.c \ vprintf.c vsnprintf.c vsprintf.c wcrtomb.c wcwidth.c \ windows-mutex.c windows-once.c windows-recmutex.c \ windows-rwlock.c windows-spin.c write.c libgl_la_LDFLAGS = $(AM_LDFLAGS) -no-undefined $(FLOOR_LIBM) \ $(ISNAND_LIBM) $(ISNANF_LIBM) $(ISNANL_LIBM) $(LIBSOCKET) \ $(LIBTHREAD) $(LIB_CLOCK_GETTIME) $(LIB_GETRANDOM) \ $(LIB_HARD_LOCALE) $(LIB_MBRTOWC) $(LIB_SELECT) \ $(LIB_SETLOCALE_NULL) $(LTLIBINTL) $(ROUND_LIBM) $(TRUNC_LIBM) \ @INTL_MACOSX_LIBS@ $(am__empty) # Use this preprocessor expression to decide whether #include_next works. # Do not rely on a 'configure'-time test for this, since the expression # might appear in an installed header, which is used by some other compiler. HAVE_INCLUDE_NEXT = (__GNUC__ || 60000000 <= __DECC_VER) GPERF = gperf V_GPERF = $(V_GPERF_@AM_V@) V_GPERF_ = $(V_GPERF_@AM_DEFAULT_V@) V_GPERF_0 = @echo " GPERF " $@; # Because this Makefile snippet defines a variable used by other # gnulib Makefile snippets, it must be present in all makefiles that # need it. This is ensured by the applicability 'all' defined above. _NORETURN_H = $(srcdir)/_Noreturn.h # Because this Makefile snippet defines a variable used by other # gnulib Makefile snippets, it must be present in all makefiles that # need it. This is ensured by the applicability 'all' defined above. ARG_NONNULL_H = $(srcdir)/arg-nonnull.h # Because this Makefile snippet defines a variable used by other # gnulib Makefile snippets, it must be present in all makefiles that # need it. This is ensured by the applicability 'all' defined above. CXXDEFS_H = $(srcdir)/c++defs.h # Because this Makefile snippet defines a variable used by other # gnulib Makefile snippets, it must be present in all makefiles that # need it. This is ensured by the applicability 'all' defined above. UNUSED_PARAMETER_H = $(srcdir)/unused-parameter.h # Because this Makefile snippet defines a variable used by other # gnulib Makefile snippets, it must be present in all makefiles that # need it. This is ensured by the applicability 'all' defined above. WARN_ON_USE_H = $(srcdir)/warn-on-use.h all: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) all-recursive .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnits gl/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnits gl/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLIBRARIES: -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } glthread/$(am__dirstamp): @$(MKDIR_P) glthread @: > glthread/$(am__dirstamp) glthread/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) glthread/$(DEPDIR) @: > glthread/$(DEPDIR)/$(am__dirstamp) glthread/lock.lo: glthread/$(am__dirstamp) \ glthread/$(DEPDIR)/$(am__dirstamp) glthread/threadlib.lo: glthread/$(am__dirstamp) \ glthread/$(DEPDIR)/$(am__dirstamp) unicase/$(am__dirstamp): @$(MKDIR_P) unicase @: > unicase/$(am__dirstamp) unicase/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) unicase/$(DEPDIR) @: > unicase/$(DEPDIR)/$(am__dirstamp) unicase/cased.lo: unicase/$(am__dirstamp) \ unicase/$(DEPDIR)/$(am__dirstamp) unicase/empty-prefix-context.lo: unicase/$(am__dirstamp) \ unicase/$(DEPDIR)/$(am__dirstamp) unicase/empty-suffix-context.lo: unicase/$(am__dirstamp) \ unicase/$(DEPDIR)/$(am__dirstamp) unicase/ignorable.lo: unicase/$(am__dirstamp) \ unicase/$(DEPDIR)/$(am__dirstamp) unicase/special-casing.lo: unicase/$(am__dirstamp) \ unicase/$(DEPDIR)/$(am__dirstamp) unicase/tocasefold.lo: unicase/$(am__dirstamp) \ unicase/$(DEPDIR)/$(am__dirstamp) unicase/tolower.lo: unicase/$(am__dirstamp) \ unicase/$(DEPDIR)/$(am__dirstamp) unicase/totitle.lo: unicase/$(am__dirstamp) \ unicase/$(DEPDIR)/$(am__dirstamp) unicase/toupper.lo: unicase/$(am__dirstamp) \ unicase/$(DEPDIR)/$(am__dirstamp) unicase/u8-casecmp.lo: unicase/$(am__dirstamp) \ unicase/$(DEPDIR)/$(am__dirstamp) unicase/u8-casefold.lo: unicase/$(am__dirstamp) \ unicase/$(DEPDIR)/$(am__dirstamp) unicase/u8-casemap.lo: unicase/$(am__dirstamp) \ unicase/$(DEPDIR)/$(am__dirstamp) unicase/u8-ct-casefold.lo: unicase/$(am__dirstamp) \ unicase/$(DEPDIR)/$(am__dirstamp) unicase/u8-ct-totitle.lo: unicase/$(am__dirstamp) \ unicase/$(DEPDIR)/$(am__dirstamp) unicase/u8-tolower.lo: unicase/$(am__dirstamp) \ unicase/$(DEPDIR)/$(am__dirstamp) unicase/u8-totitle.lo: unicase/$(am__dirstamp) \ unicase/$(DEPDIR)/$(am__dirstamp) unicase/u8-toupper.lo: unicase/$(am__dirstamp) \ unicase/$(DEPDIR)/$(am__dirstamp) unictype/$(am__dirstamp): @$(MKDIR_P) unictype @: > unictype/$(am__dirstamp) unictype/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) unictype/$(DEPDIR) @: > unictype/$(DEPDIR)/$(am__dirstamp) unictype/categ_none.lo: unictype/$(am__dirstamp) \ unictype/$(DEPDIR)/$(am__dirstamp) unictype/categ_of.lo: unictype/$(am__dirstamp) \ unictype/$(DEPDIR)/$(am__dirstamp) unictype/combiningclass.lo: unictype/$(am__dirstamp) \ unictype/$(DEPDIR)/$(am__dirstamp) unictype/ctype_print.lo: unictype/$(am__dirstamp) \ unictype/$(DEPDIR)/$(am__dirstamp) unictype/pr_soft_dotted.lo: unictype/$(am__dirstamp) \ unictype/$(DEPDIR)/$(am__dirstamp) unigbrk/$(am__dirstamp): @$(MKDIR_P) unigbrk @: > unigbrk/$(am__dirstamp) unigbrk/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) unigbrk/$(DEPDIR) @: > unigbrk/$(DEPDIR)/$(am__dirstamp) unigbrk/uc-gbrk-prop.lo: unigbrk/$(am__dirstamp) \ unigbrk/$(DEPDIR)/$(am__dirstamp) unigbrk/uc-is-grapheme-break.lo: unigbrk/$(am__dirstamp) \ unigbrk/$(DEPDIR)/$(am__dirstamp) unilbrk/$(am__dirstamp): @$(MKDIR_P) unilbrk @: > unilbrk/$(am__dirstamp) unilbrk/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) unilbrk/$(DEPDIR) @: > unilbrk/$(DEPDIR)/$(am__dirstamp) unilbrk/lbrktables.lo: unilbrk/$(am__dirstamp) \ unilbrk/$(DEPDIR)/$(am__dirstamp) unilbrk/u8-possible-linebreaks.lo: unilbrk/$(am__dirstamp) \ unilbrk/$(DEPDIR)/$(am__dirstamp) uninorm/$(am__dirstamp): @$(MKDIR_P) uninorm @: > uninorm/$(am__dirstamp) uninorm/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) uninorm/$(DEPDIR) @: > uninorm/$(DEPDIR)/$(am__dirstamp) uninorm/canonical-decomposition.lo: uninorm/$(am__dirstamp) \ uninorm/$(DEPDIR)/$(am__dirstamp) uninorm/compat-decomposition.lo: uninorm/$(am__dirstamp) \ uninorm/$(DEPDIR)/$(am__dirstamp) uninorm/decompose-internal.lo: uninorm/$(am__dirstamp) \ uninorm/$(DEPDIR)/$(am__dirstamp) uninorm/decomposing-form.lo: uninorm/$(am__dirstamp) \ uninorm/$(DEPDIR)/$(am__dirstamp) uninorm/decomposition.lo: uninorm/$(am__dirstamp) \ uninorm/$(DEPDIR)/$(am__dirstamp) uninorm/decomposition-table.lo: uninorm/$(am__dirstamp) \ uninorm/$(DEPDIR)/$(am__dirstamp) uninorm/nfd.lo: uninorm/$(am__dirstamp) \ uninorm/$(DEPDIR)/$(am__dirstamp) uninorm/nfkd.lo: uninorm/$(am__dirstamp) \ uninorm/$(DEPDIR)/$(am__dirstamp) uninorm/u8-normalize.lo: uninorm/$(am__dirstamp) \ uninorm/$(DEPDIR)/$(am__dirstamp) unistr/$(am__dirstamp): @$(MKDIR_P) unistr @: > unistr/$(am__dirstamp) unistr/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) unistr/$(DEPDIR) @: > unistr/$(DEPDIR)/$(am__dirstamp) unistr/u8-check.lo: unistr/$(am__dirstamp) \ unistr/$(DEPDIR)/$(am__dirstamp) unistr/u8-cmp.lo: unistr/$(am__dirstamp) \ unistr/$(DEPDIR)/$(am__dirstamp) unistr/u8-cmp2.lo: unistr/$(am__dirstamp) \ unistr/$(DEPDIR)/$(am__dirstamp) unistr/u8-cpy.lo: unistr/$(am__dirstamp) \ unistr/$(DEPDIR)/$(am__dirstamp) unistr/u8-mblen.lo: unistr/$(am__dirstamp) \ unistr/$(DEPDIR)/$(am__dirstamp) unistr/u8-mbtouc.lo: unistr/$(am__dirstamp) \ unistr/$(DEPDIR)/$(am__dirstamp) unistr/u8-mbtouc-aux.lo: unistr/$(am__dirstamp) \ unistr/$(DEPDIR)/$(am__dirstamp) unistr/u8-mbtouc-unsafe.lo: unistr/$(am__dirstamp) \ unistr/$(DEPDIR)/$(am__dirstamp) unistr/u8-mbtouc-unsafe-aux.lo: unistr/$(am__dirstamp) \ unistr/$(DEPDIR)/$(am__dirstamp) unistr/u8-mbtoucr.lo: unistr/$(am__dirstamp) \ unistr/$(DEPDIR)/$(am__dirstamp) unistr/u8-strlen.lo: unistr/$(am__dirstamp) \ unistr/$(DEPDIR)/$(am__dirstamp) unistr/u8-strmbtouc.lo: unistr/$(am__dirstamp) \ unistr/$(DEPDIR)/$(am__dirstamp) unistr/u8-strncat.lo: unistr/$(am__dirstamp) \ unistr/$(DEPDIR)/$(am__dirstamp) unistr/u8-uctomb.lo: unistr/$(am__dirstamp) \ unistr/$(DEPDIR)/$(am__dirstamp) unistr/u8-uctomb-aux.lo: unistr/$(am__dirstamp) \ unistr/$(DEPDIR)/$(am__dirstamp) uniwbrk/$(am__dirstamp): @$(MKDIR_P) uniwbrk @: > uniwbrk/$(am__dirstamp) uniwbrk/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) uniwbrk/$(DEPDIR) @: > uniwbrk/$(DEPDIR)/$(am__dirstamp) uniwbrk/wbrktable.lo: uniwbrk/$(am__dirstamp) \ uniwbrk/$(DEPDIR)/$(am__dirstamp) uniwbrk/u8-wordbreaks.lo: uniwbrk/$(am__dirstamp) \ uniwbrk/$(DEPDIR)/$(am__dirstamp) uniwbrk/wordbreak-property.lo: uniwbrk/$(am__dirstamp) \ uniwbrk/$(DEPDIR)/$(am__dirstamp) uniwidth/$(am__dirstamp): @$(MKDIR_P) uniwidth @: > uniwidth/$(am__dirstamp) uniwidth/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) uniwidth/$(DEPDIR) @: > uniwidth/$(DEPDIR)/$(am__dirstamp) uniwidth/u8-strwidth.lo: uniwidth/$(am__dirstamp) \ uniwidth/$(DEPDIR)/$(am__dirstamp) uniwidth/u8-width.lo: uniwidth/$(am__dirstamp) \ uniwidth/$(DEPDIR)/$(am__dirstamp) uniwidth/width.lo: uniwidth/$(am__dirstamp) \ uniwidth/$(DEPDIR)/$(am__dirstamp) libgl.la: $(libgl_la_OBJECTS) $(libgl_la_DEPENDENCIES) $(EXTRA_libgl_la_DEPENDENCIES) $(AM_V_CCLD)$(libgl_la_LINK) $(libgl_la_OBJECTS) $(libgl_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) -rm -f glthread/*.$(OBJEXT) -rm -f glthread/*.lo -rm -f unicase/*.$(OBJEXT) -rm -f unicase/*.lo -rm -f unictype/*.$(OBJEXT) -rm -f unictype/*.lo -rm -f unigbrk/*.$(OBJEXT) -rm -f unigbrk/*.lo -rm -f unilbrk/*.$(OBJEXT) -rm -f unilbrk/*.lo -rm -f uninorm/*.$(OBJEXT) -rm -f uninorm/*.lo -rm -f unistr/*.$(OBJEXT) -rm -f unistr/*.lo -rm -f uniwbrk/*.$(OBJEXT) -rm -f uniwbrk/*.lo -rm -f uniwidth/*.$(OBJEXT) -rm -f uniwidth/*.lo distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/alloca.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/allocator.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/anytostr.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/areadlink.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asnprintf.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asprintf.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asyncsafe-spin.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/basename-lgpl.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/basename.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/binary-io.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/btowc.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/c-asprintf.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/c-ctype.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/c-snprintf.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/c-strcasecmp.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/c-strcasestr.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/c-strncasecmp.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/c-strtod.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/c-vasnprintf.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/c-vasprintf.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/c-xasprintf.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/c-xvasprintf.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/canonicalize-lgpl.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/careadlinkat.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/clean-temp.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cloexec.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/close.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/count-leading-zeros.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/count-one-bits.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/crc.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dirname-lgpl.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dirname.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dtoastr.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dtotimespec.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dup2.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/error.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/exitfail.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/explicit_bzero.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fatal-signal.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fcntl.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fd-hook.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/float.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/floor.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fopen.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fprintf.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/frexp.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/frexpl.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fseek.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fseeko.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fseterr.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fstat.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ftell.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ftello.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ftoastr.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/full-read.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/full-write.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fwriteerror.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/getdelim.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/getdtablesize.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/getline.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/getopt.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/getopt1.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/getpass.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/getprogname.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/getrandom.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gettime.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gettimeofday.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gl_linked_list.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gl_linkedhash_list.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gl_list.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gl_xlist.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hard-locale.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/imaxtostr.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/inttostr.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/isfinite.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/isinf.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/isnan.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/isnand.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/isnanf.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/isnanl.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/iswblank.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/iswdigit.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/iswxdigit.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/itold.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lc-charset-dispatch.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/localcharset.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/localeconv.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/localename-table.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/localename.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lseek.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lstat.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/malloc.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/malloca.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/math.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mbchar.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mbiter.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mbrtowc.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mbsinit.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mbtowc-lock.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mbtowc.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/md4.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/memcasecmp.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/memchr.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/memchr2.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/memmem.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mempcpy.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/memrchr.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mkdir.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mkdtemp.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mkstemp.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mktime.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/msvc-inval.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/msvc-nothrow.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nl_langinfo.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nstrftime.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/offtostr.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/open.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pipe2.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/printf-args.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/printf-frexp.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/printf-frexpl.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/printf-parse.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/printf.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/progname.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/progreloc.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/raise.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rawmemchr.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/read-file.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/read.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/readlink.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/realloc.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/regcomp.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/regex.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/regex_internal.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/regexec.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/relocatable.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rename.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rijndael-alg-fst.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rijndael-api-fst.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rmdir.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/round.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/safe-read.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/safe-write.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/secure_getenv.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/select.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/setenv.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/setlocale-lock.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/setlocale_null.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sig-handler.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sigaction.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/signbitd.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/signbitf.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/signbitl.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sigprocmask.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/snprintf.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sockets.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sprintf.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/stat-time.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/stat-w32.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/stat.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/stpcpy.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/strcasecmp.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/strcasestr.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/strdup.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/strerror-override.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/strerror.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/stripslash.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/strncasecmp.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/strncat.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/strndup.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/strnlen.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/strsep.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/strtod.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/strtok_r.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sys_socket.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tempname.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/time_r.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/time_rz.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/timegm.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/timespec-add.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/timespec-sub.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/timespec.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tmpdir.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/trunc.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tzset.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/uinttostr.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/umaxtostr.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/unistd.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/unsetenv.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vasnprintf.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vasprintf.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/version-etc-fsf.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/version-etc.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vfprintf.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vprintf.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vsnprintf.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vsprintf.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wcrtomb.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wctype-h.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wcwidth.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/windows-mutex.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/windows-once.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/windows-recmutex.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/windows-rwlock.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/windows-spin.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/write.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xalloc-die.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xasprintf.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xbinary-io.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xmalloc.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xmalloca.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xmemdup0.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xreadlink.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xsize.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xstrndup.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xvasprintf.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@glthread/$(DEPDIR)/lock.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@glthread/$(DEPDIR)/threadlib.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@unicase/$(DEPDIR)/cased.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@unicase/$(DEPDIR)/empty-prefix-context.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@unicase/$(DEPDIR)/empty-suffix-context.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@unicase/$(DEPDIR)/ignorable.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@unicase/$(DEPDIR)/special-casing.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@unicase/$(DEPDIR)/tocasefold.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@unicase/$(DEPDIR)/tolower.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@unicase/$(DEPDIR)/totitle.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@unicase/$(DEPDIR)/toupper.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@unicase/$(DEPDIR)/u8-casecmp.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@unicase/$(DEPDIR)/u8-casefold.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@unicase/$(DEPDIR)/u8-casemap.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@unicase/$(DEPDIR)/u8-ct-casefold.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@unicase/$(DEPDIR)/u8-ct-totitle.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@unicase/$(DEPDIR)/u8-tolower.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@unicase/$(DEPDIR)/u8-totitle.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@unicase/$(DEPDIR)/u8-toupper.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@unictype/$(DEPDIR)/categ_none.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@unictype/$(DEPDIR)/categ_of.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@unictype/$(DEPDIR)/combiningclass.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@unictype/$(DEPDIR)/ctype_print.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@unictype/$(DEPDIR)/pr_soft_dotted.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@unigbrk/$(DEPDIR)/uc-gbrk-prop.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@unigbrk/$(DEPDIR)/uc-is-grapheme-break.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@unilbrk/$(DEPDIR)/lbrktables.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@unilbrk/$(DEPDIR)/u8-possible-linebreaks.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@uninorm/$(DEPDIR)/canonical-decomposition.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@uninorm/$(DEPDIR)/compat-decomposition.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@uninorm/$(DEPDIR)/decompose-internal.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@uninorm/$(DEPDIR)/decomposing-form.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@uninorm/$(DEPDIR)/decomposition-table.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@uninorm/$(DEPDIR)/decomposition.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@uninorm/$(DEPDIR)/nfd.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@uninorm/$(DEPDIR)/nfkd.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@uninorm/$(DEPDIR)/u8-normalize.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@unistr/$(DEPDIR)/u8-check.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@unistr/$(DEPDIR)/u8-cmp.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@unistr/$(DEPDIR)/u8-cmp2.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@unistr/$(DEPDIR)/u8-cpy.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@unistr/$(DEPDIR)/u8-mblen.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@unistr/$(DEPDIR)/u8-mbtouc-aux.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@unistr/$(DEPDIR)/u8-mbtouc-unsafe-aux.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@unistr/$(DEPDIR)/u8-mbtouc-unsafe.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@unistr/$(DEPDIR)/u8-mbtouc.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@unistr/$(DEPDIR)/u8-mbtoucr.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@unistr/$(DEPDIR)/u8-strlen.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@unistr/$(DEPDIR)/u8-strmbtouc.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@unistr/$(DEPDIR)/u8-strncat.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@unistr/$(DEPDIR)/u8-uctomb-aux.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@unistr/$(DEPDIR)/u8-uctomb.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@uniwbrk/$(DEPDIR)/u8-wordbreaks.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@uniwbrk/$(DEPDIR)/wbrktable.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@uniwbrk/$(DEPDIR)/wordbreak-property.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@uniwidth/$(DEPDIR)/u8-strwidth.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@uniwidth/$(DEPDIR)/u8-width.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@uniwidth/$(DEPDIR)/width.Plo@am__quote@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @echo '# dummy' >$@-t && $(am__mv) $@-t $@ am--depfiles: $(am__depfiles_remade) .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ @am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs -rm -rf glthread/.libs glthread/_libs -rm -rf unicase/.libs unicase/_libs -rm -rf unictype/.libs unictype/_libs -rm -rf unigbrk/.libs unigbrk/_libs -rm -rf unilbrk/.libs unilbrk/_libs -rm -rf uninorm/.libs uninorm/_libs -rm -rf unistr/.libs unistr/_libs -rm -rf uniwbrk/.libs uniwbrk/_libs -rm -rf uniwidth/.libs uniwidth/_libs # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-recursive CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-recursive cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) check-recursive all-am: Makefile $(LIBRARIES) $(LTLIBRARIES) $(HEADERS) installdirs: installdirs-recursive installdirs-am: install: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: -test -z "$(MOSTLYCLEANFILES)" || rm -f $(MOSTLYCLEANFILES) clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) -rm -f glthread/$(DEPDIR)/$(am__dirstamp) -rm -f glthread/$(am__dirstamp) -rm -f unicase/$(DEPDIR)/$(am__dirstamp) -rm -f unicase/$(am__dirstamp) -rm -f unictype/$(DEPDIR)/$(am__dirstamp) -rm -f unictype/$(am__dirstamp) -rm -f unigbrk/$(DEPDIR)/$(am__dirstamp) -rm -f unigbrk/$(am__dirstamp) -rm -f unilbrk/$(DEPDIR)/$(am__dirstamp) -rm -f unilbrk/$(am__dirstamp) -rm -f uninorm/$(DEPDIR)/$(am__dirstamp) -rm -f uninorm/$(am__dirstamp) -rm -f unistr/$(DEPDIR)/$(am__dirstamp) -rm -f unistr/$(am__dirstamp) -rm -f uniwbrk/$(DEPDIR)/$(am__dirstamp) -rm -f uniwbrk/$(am__dirstamp) -rm -f uniwidth/$(DEPDIR)/$(am__dirstamp) -rm -f uniwidth/$(am__dirstamp) -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) @RELOCATABLE_VIA_WRAPPER_FALSE@uninstall-hook: clean: clean-recursive clean-am: clean-generic clean-libtool clean-noinstLIBRARIES \ clean-noinstLTLIBRARIES mostlyclean-am distclean: distclean-recursive -rm -f ./$(DEPDIR)/alloca.Plo -rm -f ./$(DEPDIR)/allocator.Plo -rm -f ./$(DEPDIR)/anytostr.Plo -rm -f ./$(DEPDIR)/areadlink.Plo -rm -f ./$(DEPDIR)/asnprintf.Plo -rm -f ./$(DEPDIR)/asprintf.Plo -rm -f ./$(DEPDIR)/asyncsafe-spin.Plo -rm -f ./$(DEPDIR)/basename-lgpl.Plo -rm -f ./$(DEPDIR)/basename.Plo -rm -f ./$(DEPDIR)/binary-io.Plo -rm -f ./$(DEPDIR)/btowc.Plo -rm -f ./$(DEPDIR)/c-asprintf.Plo -rm -f ./$(DEPDIR)/c-ctype.Plo -rm -f ./$(DEPDIR)/c-snprintf.Plo -rm -f ./$(DEPDIR)/c-strcasecmp.Plo -rm -f ./$(DEPDIR)/c-strcasestr.Plo -rm -f ./$(DEPDIR)/c-strncasecmp.Plo -rm -f ./$(DEPDIR)/c-strtod.Plo -rm -f ./$(DEPDIR)/c-vasnprintf.Plo -rm -f ./$(DEPDIR)/c-vasprintf.Plo -rm -f ./$(DEPDIR)/c-xasprintf.Plo -rm -f ./$(DEPDIR)/c-xvasprintf.Plo -rm -f ./$(DEPDIR)/canonicalize-lgpl.Plo -rm -f ./$(DEPDIR)/careadlinkat.Plo -rm -f ./$(DEPDIR)/clean-temp.Plo -rm -f ./$(DEPDIR)/cloexec.Plo -rm -f ./$(DEPDIR)/close.Plo -rm -f ./$(DEPDIR)/count-leading-zeros.Plo -rm -f ./$(DEPDIR)/count-one-bits.Plo -rm -f ./$(DEPDIR)/crc.Plo -rm -f ./$(DEPDIR)/dirname-lgpl.Plo -rm -f ./$(DEPDIR)/dirname.Plo -rm -f ./$(DEPDIR)/dtoastr.Plo -rm -f ./$(DEPDIR)/dtotimespec.Plo -rm -f ./$(DEPDIR)/dup2.Plo -rm -f ./$(DEPDIR)/error.Plo -rm -f ./$(DEPDIR)/exitfail.Plo -rm -f ./$(DEPDIR)/explicit_bzero.Plo -rm -f ./$(DEPDIR)/fatal-signal.Plo -rm -f ./$(DEPDIR)/fcntl.Plo -rm -f ./$(DEPDIR)/fd-hook.Plo -rm -f ./$(DEPDIR)/float.Plo -rm -f ./$(DEPDIR)/floor.Plo -rm -f ./$(DEPDIR)/fopen.Plo -rm -f ./$(DEPDIR)/fprintf.Plo -rm -f ./$(DEPDIR)/frexp.Plo -rm -f ./$(DEPDIR)/frexpl.Plo -rm -f ./$(DEPDIR)/fseek.Plo -rm -f ./$(DEPDIR)/fseeko.Plo -rm -f ./$(DEPDIR)/fseterr.Plo -rm -f ./$(DEPDIR)/fstat.Plo -rm -f ./$(DEPDIR)/ftell.Plo -rm -f ./$(DEPDIR)/ftello.Plo -rm -f ./$(DEPDIR)/ftoastr.Plo -rm -f ./$(DEPDIR)/full-read.Plo -rm -f ./$(DEPDIR)/full-write.Plo -rm -f ./$(DEPDIR)/fwriteerror.Plo -rm -f ./$(DEPDIR)/getdelim.Plo -rm -f ./$(DEPDIR)/getdtablesize.Plo -rm -f ./$(DEPDIR)/getline.Plo -rm -f ./$(DEPDIR)/getopt.Plo -rm -f ./$(DEPDIR)/getopt1.Plo -rm -f ./$(DEPDIR)/getpass.Plo -rm -f ./$(DEPDIR)/getprogname.Plo -rm -f ./$(DEPDIR)/getrandom.Plo -rm -f ./$(DEPDIR)/gettime.Plo -rm -f ./$(DEPDIR)/gettimeofday.Plo -rm -f ./$(DEPDIR)/gl_linked_list.Plo -rm -f ./$(DEPDIR)/gl_linkedhash_list.Plo -rm -f ./$(DEPDIR)/gl_list.Plo -rm -f ./$(DEPDIR)/gl_xlist.Plo -rm -f ./$(DEPDIR)/hard-locale.Plo -rm -f ./$(DEPDIR)/imaxtostr.Plo -rm -f ./$(DEPDIR)/inttostr.Plo -rm -f ./$(DEPDIR)/isfinite.Plo -rm -f ./$(DEPDIR)/isinf.Plo -rm -f ./$(DEPDIR)/isnan.Plo -rm -f ./$(DEPDIR)/isnand.Plo -rm -f ./$(DEPDIR)/isnanf.Plo -rm -f ./$(DEPDIR)/isnanl.Plo -rm -f ./$(DEPDIR)/iswblank.Plo -rm -f ./$(DEPDIR)/iswdigit.Plo -rm -f ./$(DEPDIR)/iswxdigit.Plo -rm -f ./$(DEPDIR)/itold.Plo -rm -f ./$(DEPDIR)/lc-charset-dispatch.Plo -rm -f ./$(DEPDIR)/localcharset.Plo -rm -f ./$(DEPDIR)/localeconv.Plo -rm -f ./$(DEPDIR)/localename-table.Plo -rm -f ./$(DEPDIR)/localename.Plo -rm -f ./$(DEPDIR)/lseek.Plo -rm -f ./$(DEPDIR)/lstat.Plo -rm -f ./$(DEPDIR)/malloc.Plo -rm -f ./$(DEPDIR)/malloca.Plo -rm -f ./$(DEPDIR)/math.Plo -rm -f ./$(DEPDIR)/mbchar.Plo -rm -f ./$(DEPDIR)/mbiter.Plo -rm -f ./$(DEPDIR)/mbrtowc.Plo -rm -f ./$(DEPDIR)/mbsinit.Plo -rm -f ./$(DEPDIR)/mbtowc-lock.Plo -rm -f ./$(DEPDIR)/mbtowc.Plo -rm -f ./$(DEPDIR)/md4.Plo -rm -f ./$(DEPDIR)/memcasecmp.Plo -rm -f ./$(DEPDIR)/memchr.Plo -rm -f ./$(DEPDIR)/memchr2.Plo -rm -f ./$(DEPDIR)/memmem.Plo -rm -f ./$(DEPDIR)/mempcpy.Plo -rm -f ./$(DEPDIR)/memrchr.Plo -rm -f ./$(DEPDIR)/mkdir.Plo -rm -f ./$(DEPDIR)/mkdtemp.Plo -rm -f ./$(DEPDIR)/mkstemp.Plo -rm -f ./$(DEPDIR)/mktime.Plo -rm -f ./$(DEPDIR)/msvc-inval.Plo -rm -f ./$(DEPDIR)/msvc-nothrow.Plo -rm -f ./$(DEPDIR)/nl_langinfo.Plo -rm -f ./$(DEPDIR)/nstrftime.Plo -rm -f ./$(DEPDIR)/offtostr.Plo -rm -f ./$(DEPDIR)/open.Plo -rm -f ./$(DEPDIR)/pipe2.Plo -rm -f ./$(DEPDIR)/printf-args.Plo -rm -f ./$(DEPDIR)/printf-frexp.Plo -rm -f ./$(DEPDIR)/printf-frexpl.Plo -rm -f ./$(DEPDIR)/printf-parse.Plo -rm -f ./$(DEPDIR)/printf.Plo -rm -f ./$(DEPDIR)/progname.Plo -rm -f ./$(DEPDIR)/progreloc.Plo -rm -f ./$(DEPDIR)/raise.Plo -rm -f ./$(DEPDIR)/rawmemchr.Plo -rm -f ./$(DEPDIR)/read-file.Plo -rm -f ./$(DEPDIR)/read.Plo -rm -f ./$(DEPDIR)/readlink.Plo -rm -f ./$(DEPDIR)/realloc.Plo -rm -f ./$(DEPDIR)/regcomp.Plo -rm -f ./$(DEPDIR)/regex.Plo -rm -f ./$(DEPDIR)/regex_internal.Plo -rm -f ./$(DEPDIR)/regexec.Plo -rm -f ./$(DEPDIR)/relocatable.Plo -rm -f ./$(DEPDIR)/rename.Plo -rm -f ./$(DEPDIR)/rijndael-alg-fst.Plo -rm -f ./$(DEPDIR)/rijndael-api-fst.Plo -rm -f ./$(DEPDIR)/rmdir.Plo -rm -f ./$(DEPDIR)/round.Plo -rm -f ./$(DEPDIR)/safe-read.Plo -rm -f ./$(DEPDIR)/safe-write.Plo -rm -f ./$(DEPDIR)/secure_getenv.Plo -rm -f ./$(DEPDIR)/select.Plo -rm -f ./$(DEPDIR)/setenv.Plo -rm -f ./$(DEPDIR)/setlocale-lock.Plo -rm -f ./$(DEPDIR)/setlocale_null.Plo -rm -f ./$(DEPDIR)/sig-handler.Plo -rm -f ./$(DEPDIR)/sigaction.Plo -rm -f ./$(DEPDIR)/signbitd.Plo -rm -f ./$(DEPDIR)/signbitf.Plo -rm -f ./$(DEPDIR)/signbitl.Plo -rm -f ./$(DEPDIR)/sigprocmask.Plo -rm -f ./$(DEPDIR)/snprintf.Plo -rm -f ./$(DEPDIR)/sockets.Plo -rm -f ./$(DEPDIR)/sprintf.Plo -rm -f ./$(DEPDIR)/stat-time.Plo -rm -f ./$(DEPDIR)/stat-w32.Plo -rm -f ./$(DEPDIR)/stat.Plo -rm -f ./$(DEPDIR)/stpcpy.Plo -rm -f ./$(DEPDIR)/strcasecmp.Plo -rm -f ./$(DEPDIR)/strcasestr.Plo -rm -f ./$(DEPDIR)/strdup.Plo -rm -f ./$(DEPDIR)/strerror-override.Plo -rm -f ./$(DEPDIR)/strerror.Plo -rm -f ./$(DEPDIR)/stripslash.Plo -rm -f ./$(DEPDIR)/strncasecmp.Plo -rm -f ./$(DEPDIR)/strncat.Plo -rm -f ./$(DEPDIR)/strndup.Plo -rm -f ./$(DEPDIR)/strnlen.Plo -rm -f ./$(DEPDIR)/strsep.Plo -rm -f ./$(DEPDIR)/strtod.Plo -rm -f ./$(DEPDIR)/strtok_r.Plo -rm -f ./$(DEPDIR)/sys_socket.Plo -rm -f ./$(DEPDIR)/tempname.Plo -rm -f ./$(DEPDIR)/time_r.Plo -rm -f ./$(DEPDIR)/time_rz.Plo -rm -f ./$(DEPDIR)/timegm.Plo -rm -f ./$(DEPDIR)/timespec-add.Plo -rm -f ./$(DEPDIR)/timespec-sub.Plo -rm -f ./$(DEPDIR)/timespec.Plo -rm -f ./$(DEPDIR)/tmpdir.Plo -rm -f ./$(DEPDIR)/trunc.Plo -rm -f ./$(DEPDIR)/tzset.Plo -rm -f ./$(DEPDIR)/uinttostr.Plo -rm -f ./$(DEPDIR)/umaxtostr.Plo -rm -f ./$(DEPDIR)/unistd.Plo -rm -f ./$(DEPDIR)/unsetenv.Plo -rm -f ./$(DEPDIR)/vasnprintf.Plo -rm -f ./$(DEPDIR)/vasprintf.Plo -rm -f ./$(DEPDIR)/version-etc-fsf.Plo -rm -f ./$(DEPDIR)/version-etc.Plo -rm -f ./$(DEPDIR)/vfprintf.Plo -rm -f ./$(DEPDIR)/vprintf.Plo -rm -f ./$(DEPDIR)/vsnprintf.Plo -rm -f ./$(DEPDIR)/vsprintf.Plo -rm -f ./$(DEPDIR)/wcrtomb.Plo -rm -f ./$(DEPDIR)/wctype-h.Plo -rm -f ./$(DEPDIR)/wcwidth.Plo -rm -f ./$(DEPDIR)/windows-mutex.Plo -rm -f ./$(DEPDIR)/windows-once.Plo -rm -f ./$(DEPDIR)/windows-recmutex.Plo -rm -f ./$(DEPDIR)/windows-rwlock.Plo -rm -f ./$(DEPDIR)/windows-spin.Plo -rm -f ./$(DEPDIR)/write.Plo -rm -f ./$(DEPDIR)/xalloc-die.Plo -rm -f ./$(DEPDIR)/xasprintf.Plo -rm -f ./$(DEPDIR)/xbinary-io.Plo -rm -f ./$(DEPDIR)/xmalloc.Plo -rm -f ./$(DEPDIR)/xmalloca.Plo -rm -f ./$(DEPDIR)/xmemdup0.Plo -rm -f ./$(DEPDIR)/xreadlink.Plo -rm -f ./$(DEPDIR)/xsize.Plo -rm -f ./$(DEPDIR)/xstrndup.Plo -rm -f ./$(DEPDIR)/xvasprintf.Plo -rm -f glthread/$(DEPDIR)/lock.Plo -rm -f glthread/$(DEPDIR)/threadlib.Plo -rm -f unicase/$(DEPDIR)/cased.Plo -rm -f unicase/$(DEPDIR)/empty-prefix-context.Plo -rm -f unicase/$(DEPDIR)/empty-suffix-context.Plo -rm -f unicase/$(DEPDIR)/ignorable.Plo -rm -f unicase/$(DEPDIR)/special-casing.Plo -rm -f unicase/$(DEPDIR)/tocasefold.Plo -rm -f unicase/$(DEPDIR)/tolower.Plo -rm -f unicase/$(DEPDIR)/totitle.Plo -rm -f unicase/$(DEPDIR)/toupper.Plo -rm -f unicase/$(DEPDIR)/u8-casecmp.Plo -rm -f unicase/$(DEPDIR)/u8-casefold.Plo -rm -f unicase/$(DEPDIR)/u8-casemap.Plo -rm -f unicase/$(DEPDIR)/u8-ct-casefold.Plo -rm -f unicase/$(DEPDIR)/u8-ct-totitle.Plo -rm -f unicase/$(DEPDIR)/u8-tolower.Plo -rm -f unicase/$(DEPDIR)/u8-totitle.Plo -rm -f unicase/$(DEPDIR)/u8-toupper.Plo -rm -f unictype/$(DEPDIR)/categ_none.Plo -rm -f unictype/$(DEPDIR)/categ_of.Plo -rm -f unictype/$(DEPDIR)/combiningclass.Plo -rm -f unictype/$(DEPDIR)/ctype_print.Plo -rm -f unictype/$(DEPDIR)/pr_soft_dotted.Plo -rm -f unigbrk/$(DEPDIR)/uc-gbrk-prop.Plo -rm -f unigbrk/$(DEPDIR)/uc-is-grapheme-break.Plo -rm -f unilbrk/$(DEPDIR)/lbrktables.Plo -rm -f unilbrk/$(DEPDIR)/u8-possible-linebreaks.Plo -rm -f uninorm/$(DEPDIR)/canonical-decomposition.Plo -rm -f uninorm/$(DEPDIR)/compat-decomposition.Plo -rm -f uninorm/$(DEPDIR)/decompose-internal.Plo -rm -f uninorm/$(DEPDIR)/decomposing-form.Plo -rm -f uninorm/$(DEPDIR)/decomposition-table.Plo -rm -f uninorm/$(DEPDIR)/decomposition.Plo -rm -f uninorm/$(DEPDIR)/nfd.Plo -rm -f uninorm/$(DEPDIR)/nfkd.Plo -rm -f uninorm/$(DEPDIR)/u8-normalize.Plo -rm -f unistr/$(DEPDIR)/u8-check.Plo -rm -f unistr/$(DEPDIR)/u8-cmp.Plo -rm -f unistr/$(DEPDIR)/u8-cmp2.Plo -rm -f unistr/$(DEPDIR)/u8-cpy.Plo -rm -f unistr/$(DEPDIR)/u8-mblen.Plo -rm -f unistr/$(DEPDIR)/u8-mbtouc-aux.Plo -rm -f unistr/$(DEPDIR)/u8-mbtouc-unsafe-aux.Plo -rm -f unistr/$(DEPDIR)/u8-mbtouc-unsafe.Plo -rm -f unistr/$(DEPDIR)/u8-mbtouc.Plo -rm -f unistr/$(DEPDIR)/u8-mbtoucr.Plo -rm -f unistr/$(DEPDIR)/u8-strlen.Plo -rm -f unistr/$(DEPDIR)/u8-strmbtouc.Plo -rm -f unistr/$(DEPDIR)/u8-strncat.Plo -rm -f unistr/$(DEPDIR)/u8-uctomb-aux.Plo -rm -f unistr/$(DEPDIR)/u8-uctomb.Plo -rm -f uniwbrk/$(DEPDIR)/u8-wordbreaks.Plo -rm -f uniwbrk/$(DEPDIR)/wbrktable.Plo -rm -f uniwbrk/$(DEPDIR)/wordbreak-property.Plo -rm -f uniwidth/$(DEPDIR)/u8-strwidth.Plo -rm -f uniwidth/$(DEPDIR)/u8-width.Plo -rm -f uniwidth/$(DEPDIR)/width.Plo -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f ./$(DEPDIR)/alloca.Plo -rm -f ./$(DEPDIR)/allocator.Plo -rm -f ./$(DEPDIR)/anytostr.Plo -rm -f ./$(DEPDIR)/areadlink.Plo -rm -f ./$(DEPDIR)/asnprintf.Plo -rm -f ./$(DEPDIR)/asprintf.Plo -rm -f ./$(DEPDIR)/asyncsafe-spin.Plo -rm -f ./$(DEPDIR)/basename-lgpl.Plo -rm -f ./$(DEPDIR)/basename.Plo -rm -f ./$(DEPDIR)/binary-io.Plo -rm -f ./$(DEPDIR)/btowc.Plo -rm -f ./$(DEPDIR)/c-asprintf.Plo -rm -f ./$(DEPDIR)/c-ctype.Plo -rm -f ./$(DEPDIR)/c-snprintf.Plo -rm -f ./$(DEPDIR)/c-strcasecmp.Plo -rm -f ./$(DEPDIR)/c-strcasestr.Plo -rm -f ./$(DEPDIR)/c-strncasecmp.Plo -rm -f ./$(DEPDIR)/c-strtod.Plo -rm -f ./$(DEPDIR)/c-vasnprintf.Plo -rm -f ./$(DEPDIR)/c-vasprintf.Plo -rm -f ./$(DEPDIR)/c-xasprintf.Plo -rm -f ./$(DEPDIR)/c-xvasprintf.Plo -rm -f ./$(DEPDIR)/canonicalize-lgpl.Plo -rm -f ./$(DEPDIR)/careadlinkat.Plo -rm -f ./$(DEPDIR)/clean-temp.Plo -rm -f ./$(DEPDIR)/cloexec.Plo -rm -f ./$(DEPDIR)/close.Plo -rm -f ./$(DEPDIR)/count-leading-zeros.Plo -rm -f ./$(DEPDIR)/count-one-bits.Plo -rm -f ./$(DEPDIR)/crc.Plo -rm -f ./$(DEPDIR)/dirname-lgpl.Plo -rm -f ./$(DEPDIR)/dirname.Plo -rm -f ./$(DEPDIR)/dtoastr.Plo -rm -f ./$(DEPDIR)/dtotimespec.Plo -rm -f ./$(DEPDIR)/dup2.Plo -rm -f ./$(DEPDIR)/error.Plo -rm -f ./$(DEPDIR)/exitfail.Plo -rm -f ./$(DEPDIR)/explicit_bzero.Plo -rm -f ./$(DEPDIR)/fatal-signal.Plo -rm -f ./$(DEPDIR)/fcntl.Plo -rm -f ./$(DEPDIR)/fd-hook.Plo -rm -f ./$(DEPDIR)/float.Plo -rm -f ./$(DEPDIR)/floor.Plo -rm -f ./$(DEPDIR)/fopen.Plo -rm -f ./$(DEPDIR)/fprintf.Plo -rm -f ./$(DEPDIR)/frexp.Plo -rm -f ./$(DEPDIR)/frexpl.Plo -rm -f ./$(DEPDIR)/fseek.Plo -rm -f ./$(DEPDIR)/fseeko.Plo -rm -f ./$(DEPDIR)/fseterr.Plo -rm -f ./$(DEPDIR)/fstat.Plo -rm -f ./$(DEPDIR)/ftell.Plo -rm -f ./$(DEPDIR)/ftello.Plo -rm -f ./$(DEPDIR)/ftoastr.Plo -rm -f ./$(DEPDIR)/full-read.Plo -rm -f ./$(DEPDIR)/full-write.Plo -rm -f ./$(DEPDIR)/fwriteerror.Plo -rm -f ./$(DEPDIR)/getdelim.Plo -rm -f ./$(DEPDIR)/getdtablesize.Plo -rm -f ./$(DEPDIR)/getline.Plo -rm -f ./$(DEPDIR)/getopt.Plo -rm -f ./$(DEPDIR)/getopt1.Plo -rm -f ./$(DEPDIR)/getpass.Plo -rm -f ./$(DEPDIR)/getprogname.Plo -rm -f ./$(DEPDIR)/getrandom.Plo -rm -f ./$(DEPDIR)/gettime.Plo -rm -f ./$(DEPDIR)/gettimeofday.Plo -rm -f ./$(DEPDIR)/gl_linked_list.Plo -rm -f ./$(DEPDIR)/gl_linkedhash_list.Plo -rm -f ./$(DEPDIR)/gl_list.Plo -rm -f ./$(DEPDIR)/gl_xlist.Plo -rm -f ./$(DEPDIR)/hard-locale.Plo -rm -f ./$(DEPDIR)/imaxtostr.Plo -rm -f ./$(DEPDIR)/inttostr.Plo -rm -f ./$(DEPDIR)/isfinite.Plo -rm -f ./$(DEPDIR)/isinf.Plo -rm -f ./$(DEPDIR)/isnan.Plo -rm -f ./$(DEPDIR)/isnand.Plo -rm -f ./$(DEPDIR)/isnanf.Plo -rm -f ./$(DEPDIR)/isnanl.Plo -rm -f ./$(DEPDIR)/iswblank.Plo -rm -f ./$(DEPDIR)/iswdigit.Plo -rm -f ./$(DEPDIR)/iswxdigit.Plo -rm -f ./$(DEPDIR)/itold.Plo -rm -f ./$(DEPDIR)/lc-charset-dispatch.Plo -rm -f ./$(DEPDIR)/localcharset.Plo -rm -f ./$(DEPDIR)/localeconv.Plo -rm -f ./$(DEPDIR)/localename-table.Plo -rm -f ./$(DEPDIR)/localename.Plo -rm -f ./$(DEPDIR)/lseek.Plo -rm -f ./$(DEPDIR)/lstat.Plo -rm -f ./$(DEPDIR)/malloc.Plo -rm -f ./$(DEPDIR)/malloca.Plo -rm -f ./$(DEPDIR)/math.Plo -rm -f ./$(DEPDIR)/mbchar.Plo -rm -f ./$(DEPDIR)/mbiter.Plo -rm -f ./$(DEPDIR)/mbrtowc.Plo -rm -f ./$(DEPDIR)/mbsinit.Plo -rm -f ./$(DEPDIR)/mbtowc-lock.Plo -rm -f ./$(DEPDIR)/mbtowc.Plo -rm -f ./$(DEPDIR)/md4.Plo -rm -f ./$(DEPDIR)/memcasecmp.Plo -rm -f ./$(DEPDIR)/memchr.Plo -rm -f ./$(DEPDIR)/memchr2.Plo -rm -f ./$(DEPDIR)/memmem.Plo -rm -f ./$(DEPDIR)/mempcpy.Plo -rm -f ./$(DEPDIR)/memrchr.Plo -rm -f ./$(DEPDIR)/mkdir.Plo -rm -f ./$(DEPDIR)/mkdtemp.Plo -rm -f ./$(DEPDIR)/mkstemp.Plo -rm -f ./$(DEPDIR)/mktime.Plo -rm -f ./$(DEPDIR)/msvc-inval.Plo -rm -f ./$(DEPDIR)/msvc-nothrow.Plo -rm -f ./$(DEPDIR)/nl_langinfo.Plo -rm -f ./$(DEPDIR)/nstrftime.Plo -rm -f ./$(DEPDIR)/offtostr.Plo -rm -f ./$(DEPDIR)/open.Plo -rm -f ./$(DEPDIR)/pipe2.Plo -rm -f ./$(DEPDIR)/printf-args.Plo -rm -f ./$(DEPDIR)/printf-frexp.Plo -rm -f ./$(DEPDIR)/printf-frexpl.Plo -rm -f ./$(DEPDIR)/printf-parse.Plo -rm -f ./$(DEPDIR)/printf.Plo -rm -f ./$(DEPDIR)/progname.Plo -rm -f ./$(DEPDIR)/progreloc.Plo -rm -f ./$(DEPDIR)/raise.Plo -rm -f ./$(DEPDIR)/rawmemchr.Plo -rm -f ./$(DEPDIR)/read-file.Plo -rm -f ./$(DEPDIR)/read.Plo -rm -f ./$(DEPDIR)/readlink.Plo -rm -f ./$(DEPDIR)/realloc.Plo -rm -f ./$(DEPDIR)/regcomp.Plo -rm -f ./$(DEPDIR)/regex.Plo -rm -f ./$(DEPDIR)/regex_internal.Plo -rm -f ./$(DEPDIR)/regexec.Plo -rm -f ./$(DEPDIR)/relocatable.Plo -rm -f ./$(DEPDIR)/rename.Plo -rm -f ./$(DEPDIR)/rijndael-alg-fst.Plo -rm -f ./$(DEPDIR)/rijndael-api-fst.Plo -rm -f ./$(DEPDIR)/rmdir.Plo -rm -f ./$(DEPDIR)/round.Plo -rm -f ./$(DEPDIR)/safe-read.Plo -rm -f ./$(DEPDIR)/safe-write.Plo -rm -f ./$(DEPDIR)/secure_getenv.Plo -rm -f ./$(DEPDIR)/select.Plo -rm -f ./$(DEPDIR)/setenv.Plo -rm -f ./$(DEPDIR)/setlocale-lock.Plo -rm -f ./$(DEPDIR)/setlocale_null.Plo -rm -f ./$(DEPDIR)/sig-handler.Plo -rm -f ./$(DEPDIR)/sigaction.Plo -rm -f ./$(DEPDIR)/signbitd.Plo -rm -f ./$(DEPDIR)/signbitf.Plo -rm -f ./$(DEPDIR)/signbitl.Plo -rm -f ./$(DEPDIR)/sigprocmask.Plo -rm -f ./$(DEPDIR)/snprintf.Plo -rm -f ./$(DEPDIR)/sockets.Plo -rm -f ./$(DEPDIR)/sprintf.Plo -rm -f ./$(DEPDIR)/stat-time.Plo -rm -f ./$(DEPDIR)/stat-w32.Plo -rm -f ./$(DEPDIR)/stat.Plo -rm -f ./$(DEPDIR)/stpcpy.Plo -rm -f ./$(DEPDIR)/strcasecmp.Plo -rm -f ./$(DEPDIR)/strcasestr.Plo -rm -f ./$(DEPDIR)/strdup.Plo -rm -f ./$(DEPDIR)/strerror-override.Plo -rm -f ./$(DEPDIR)/strerror.Plo -rm -f ./$(DEPDIR)/stripslash.Plo -rm -f ./$(DEPDIR)/strncasecmp.Plo -rm -f ./$(DEPDIR)/strncat.Plo -rm -f ./$(DEPDIR)/strndup.Plo -rm -f ./$(DEPDIR)/strnlen.Plo -rm -f ./$(DEPDIR)/strsep.Plo -rm -f ./$(DEPDIR)/strtod.Plo -rm -f ./$(DEPDIR)/strtok_r.Plo -rm -f ./$(DEPDIR)/sys_socket.Plo -rm -f ./$(DEPDIR)/tempname.Plo -rm -f ./$(DEPDIR)/time_r.Plo -rm -f ./$(DEPDIR)/time_rz.Plo -rm -f ./$(DEPDIR)/timegm.Plo -rm -f ./$(DEPDIR)/timespec-add.Plo -rm -f ./$(DEPDIR)/timespec-sub.Plo -rm -f ./$(DEPDIR)/timespec.Plo -rm -f ./$(DEPDIR)/tmpdir.Plo -rm -f ./$(DEPDIR)/trunc.Plo -rm -f ./$(DEPDIR)/tzset.Plo -rm -f ./$(DEPDIR)/uinttostr.Plo -rm -f ./$(DEPDIR)/umaxtostr.Plo -rm -f ./$(DEPDIR)/unistd.Plo -rm -f ./$(DEPDIR)/unsetenv.Plo -rm -f ./$(DEPDIR)/vasnprintf.Plo -rm -f ./$(DEPDIR)/vasprintf.Plo -rm -f ./$(DEPDIR)/version-etc-fsf.Plo -rm -f ./$(DEPDIR)/version-etc.Plo -rm -f ./$(DEPDIR)/vfprintf.Plo -rm -f ./$(DEPDIR)/vprintf.Plo -rm -f ./$(DEPDIR)/vsnprintf.Plo -rm -f ./$(DEPDIR)/vsprintf.Plo -rm -f ./$(DEPDIR)/wcrtomb.Plo -rm -f ./$(DEPDIR)/wctype-h.Plo -rm -f ./$(DEPDIR)/wcwidth.Plo -rm -f ./$(DEPDIR)/windows-mutex.Plo -rm -f ./$(DEPDIR)/windows-once.Plo -rm -f ./$(DEPDIR)/windows-recmutex.Plo -rm -f ./$(DEPDIR)/windows-rwlock.Plo -rm -f ./$(DEPDIR)/windows-spin.Plo -rm -f ./$(DEPDIR)/write.Plo -rm -f ./$(DEPDIR)/xalloc-die.Plo -rm -f ./$(DEPDIR)/xasprintf.Plo -rm -f ./$(DEPDIR)/xbinary-io.Plo -rm -f ./$(DEPDIR)/xmalloc.Plo -rm -f ./$(DEPDIR)/xmalloca.Plo -rm -f ./$(DEPDIR)/xmemdup0.Plo -rm -f ./$(DEPDIR)/xreadlink.Plo -rm -f ./$(DEPDIR)/xsize.Plo -rm -f ./$(DEPDIR)/xstrndup.Plo -rm -f ./$(DEPDIR)/xvasprintf.Plo -rm -f glthread/$(DEPDIR)/lock.Plo -rm -f glthread/$(DEPDIR)/threadlib.Plo -rm -f unicase/$(DEPDIR)/cased.Plo -rm -f unicase/$(DEPDIR)/empty-prefix-context.Plo -rm -f unicase/$(DEPDIR)/empty-suffix-context.Plo -rm -f unicase/$(DEPDIR)/ignorable.Plo -rm -f unicase/$(DEPDIR)/special-casing.Plo -rm -f unicase/$(DEPDIR)/tocasefold.Plo -rm -f unicase/$(DEPDIR)/tolower.Plo -rm -f unicase/$(DEPDIR)/totitle.Plo -rm -f unicase/$(DEPDIR)/toupper.Plo -rm -f unicase/$(DEPDIR)/u8-casecmp.Plo -rm -f unicase/$(DEPDIR)/u8-casefold.Plo -rm -f unicase/$(DEPDIR)/u8-casemap.Plo -rm -f unicase/$(DEPDIR)/u8-ct-casefold.Plo -rm -f unicase/$(DEPDIR)/u8-ct-totitle.Plo -rm -f unicase/$(DEPDIR)/u8-tolower.Plo -rm -f unicase/$(DEPDIR)/u8-totitle.Plo -rm -f unicase/$(DEPDIR)/u8-toupper.Plo -rm -f unictype/$(DEPDIR)/categ_none.Plo -rm -f unictype/$(DEPDIR)/categ_of.Plo -rm -f unictype/$(DEPDIR)/combiningclass.Plo -rm -f unictype/$(DEPDIR)/ctype_print.Plo -rm -f unictype/$(DEPDIR)/pr_soft_dotted.Plo -rm -f unigbrk/$(DEPDIR)/uc-gbrk-prop.Plo -rm -f unigbrk/$(DEPDIR)/uc-is-grapheme-break.Plo -rm -f unilbrk/$(DEPDIR)/lbrktables.Plo -rm -f unilbrk/$(DEPDIR)/u8-possible-linebreaks.Plo -rm -f uninorm/$(DEPDIR)/canonical-decomposition.Plo -rm -f uninorm/$(DEPDIR)/compat-decomposition.Plo -rm -f uninorm/$(DEPDIR)/decompose-internal.Plo -rm -f uninorm/$(DEPDIR)/decomposing-form.Plo -rm -f uninorm/$(DEPDIR)/decomposition-table.Plo -rm -f uninorm/$(DEPDIR)/decomposition.Plo -rm -f uninorm/$(DEPDIR)/nfd.Plo -rm -f uninorm/$(DEPDIR)/nfkd.Plo -rm -f uninorm/$(DEPDIR)/u8-normalize.Plo -rm -f unistr/$(DEPDIR)/u8-check.Plo -rm -f unistr/$(DEPDIR)/u8-cmp.Plo -rm -f unistr/$(DEPDIR)/u8-cmp2.Plo -rm -f unistr/$(DEPDIR)/u8-cpy.Plo -rm -f unistr/$(DEPDIR)/u8-mblen.Plo -rm -f unistr/$(DEPDIR)/u8-mbtouc-aux.Plo -rm -f unistr/$(DEPDIR)/u8-mbtouc-unsafe-aux.Plo -rm -f unistr/$(DEPDIR)/u8-mbtouc-unsafe.Plo -rm -f unistr/$(DEPDIR)/u8-mbtouc.Plo -rm -f unistr/$(DEPDIR)/u8-mbtoucr.Plo -rm -f unistr/$(DEPDIR)/u8-strlen.Plo -rm -f unistr/$(DEPDIR)/u8-strmbtouc.Plo -rm -f unistr/$(DEPDIR)/u8-strncat.Plo -rm -f unistr/$(DEPDIR)/u8-uctomb-aux.Plo -rm -f unistr/$(DEPDIR)/u8-uctomb.Plo -rm -f uniwbrk/$(DEPDIR)/u8-wordbreaks.Plo -rm -f uniwbrk/$(DEPDIR)/wbrktable.Plo -rm -f uniwbrk/$(DEPDIR)/wordbreak-property.Plo -rm -f uniwidth/$(DEPDIR)/u8-strwidth.Plo -rm -f uniwidth/$(DEPDIR)/u8-width.Plo -rm -f uniwidth/$(DEPDIR)/width.Plo -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool mostlyclean-local pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: @$(NORMAL_INSTALL) $(MAKE) $(AM_MAKEFLAGS) uninstall-hook .MAKE: $(am__recursive_targets) all check install install-am \ install-strip uninstall-am .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am \ am--depfiles check check-am clean clean-generic clean-libtool \ clean-noinstLIBRARIES clean-noinstLTLIBRARIES cscopelist-am \ ctags ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs installdirs-am maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool mostlyclean-local pdf \ pdf-am ps ps-am tags tags-am uninstall uninstall-am \ uninstall-hook .PRECIOUS: Makefile # We need the following in order to create when the system # doesn't have one that works with the given compiler. @GL_GENERATE_ALLOCA_H_TRUE@alloca.h: alloca.in.h $(top_builddir)/config.status @GL_GENERATE_ALLOCA_H_TRUE@ $(AM_V_GEN)rm -f $@-t $@ && \ @GL_GENERATE_ALLOCA_H_TRUE@ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \ @GL_GENERATE_ALLOCA_H_TRUE@ sed -e 's|@''HAVE_ALLOCA_H''@|$(HAVE_ALLOCA_H)|g' < $(srcdir)/alloca.in.h; \ @GL_GENERATE_ALLOCA_H_TRUE@ } > $@-t && \ @GL_GENERATE_ALLOCA_H_TRUE@ mv -f $@-t $@ @GL_GENERATE_ALLOCA_H_FALSE@alloca.h: $(top_builddir)/config.status @GL_GENERATE_ALLOCA_H_FALSE@ rm -f $@ # We need the following in order to create when the system # doesn't have one. @GL_GENERATE_BYTESWAP_H_TRUE@byteswap.h: byteswap.in.h $(top_builddir)/config.status @GL_GENERATE_BYTESWAP_H_TRUE@ $(AM_V_GEN)rm -f $@-t $@ && \ @GL_GENERATE_BYTESWAP_H_TRUE@ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \ @GL_GENERATE_BYTESWAP_H_TRUE@ cat $(srcdir)/byteswap.in.h; \ @GL_GENERATE_BYTESWAP_H_TRUE@ } > $@-t && \ @GL_GENERATE_BYTESWAP_H_TRUE@ mv -f $@-t $@ @GL_GENERATE_BYTESWAP_H_FALSE@byteswap.h: $(top_builddir)/config.status @GL_GENERATE_BYTESWAP_H_FALSE@ rm -f $@ # Listed in the same order as the GNU makefile conventions, and # provided by autoconf 2.59c+ or 2.70. # The Automake-defined pkg* macros are appended, in the order # listed in the Automake 1.10a+ documentation. configmake.h: Makefile $(AM_V_GEN)rm -f $@-t && \ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \ echo '#if HAVE_WINSOCK2_H'; \ echo '# include /* avoid mingw pollution on DATADIR */'; \ echo '#endif'; \ echo '#define PREFIX "$(prefix)"'; \ echo '#define EXEC_PREFIX "$(exec_prefix)"'; \ echo '#define BINDIR "$(bindir)"'; \ echo '#define SBINDIR "$(sbindir)"'; \ echo '#define LIBEXECDIR "$(libexecdir)"'; \ echo '#define DATAROOTDIR "$(datarootdir)"'; \ echo '#define DATADIR "$(datadir)"'; \ echo '#define SYSCONFDIR "$(sysconfdir)"'; \ echo '#define SHAREDSTATEDIR "$(sharedstatedir)"'; \ echo '#define LOCALSTATEDIR "$(localstatedir)"'; \ echo '#define RUNSTATEDIR "$(runstatedir)"'; \ echo '#define INCLUDEDIR "$(includedir)"'; \ echo '#define OLDINCLUDEDIR "$(oldincludedir)"'; \ echo '#define DOCDIR "$(docdir)"'; \ echo '#define INFODIR "$(infodir)"'; \ echo '#define HTMLDIR "$(htmldir)"'; \ echo '#define DVIDIR "$(dvidir)"'; \ echo '#define PDFDIR "$(pdfdir)"'; \ echo '#define PSDIR "$(psdir)"'; \ echo '#define LIBDIR "$(libdir)"'; \ echo '#define LISPDIR "$(lispdir)"'; \ echo '#define LOCALEDIR "$(localedir)"'; \ echo '#define MANDIR "$(mandir)"'; \ echo '#define MANEXT "$(manext)"'; \ echo '#define PKGDATADIR "$(pkgdatadir)"'; \ echo '#define PKGINCLUDEDIR "$(pkgincludedir)"'; \ echo '#define PKGLIBDIR "$(pkglibdir)"'; \ echo '#define PKGLIBEXECDIR "$(pkglibexecdir)"'; \ } | sed '/""/d' > $@-t && \ mv -f $@-t $@ # We need the following in order to create when the system # doesn't have one that is POSIX compliant. @GL_GENERATE_ERRNO_H_TRUE@errno.h: errno.in.h $(top_builddir)/config.status @GL_GENERATE_ERRNO_H_TRUE@ $(AM_V_GEN)rm -f $@-t $@ && \ @GL_GENERATE_ERRNO_H_TRUE@ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */' && \ @GL_GENERATE_ERRNO_H_TRUE@ sed -e 's|@''GUARD_PREFIX''@|GL|g' \ @GL_GENERATE_ERRNO_H_TRUE@ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \ @GL_GENERATE_ERRNO_H_TRUE@ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \ @GL_GENERATE_ERRNO_H_TRUE@ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \ @GL_GENERATE_ERRNO_H_TRUE@ -e 's|@''NEXT_ERRNO_H''@|$(NEXT_ERRNO_H)|g' \ @GL_GENERATE_ERRNO_H_TRUE@ -e 's|@''EMULTIHOP_HIDDEN''@|$(EMULTIHOP_HIDDEN)|g' \ @GL_GENERATE_ERRNO_H_TRUE@ -e 's|@''EMULTIHOP_VALUE''@|$(EMULTIHOP_VALUE)|g' \ @GL_GENERATE_ERRNO_H_TRUE@ -e 's|@''ENOLINK_HIDDEN''@|$(ENOLINK_HIDDEN)|g' \ @GL_GENERATE_ERRNO_H_TRUE@ -e 's|@''ENOLINK_VALUE''@|$(ENOLINK_VALUE)|g' \ @GL_GENERATE_ERRNO_H_TRUE@ -e 's|@''EOVERFLOW_HIDDEN''@|$(EOVERFLOW_HIDDEN)|g' \ @GL_GENERATE_ERRNO_H_TRUE@ -e 's|@''EOVERFLOW_VALUE''@|$(EOVERFLOW_VALUE)|g' \ @GL_GENERATE_ERRNO_H_TRUE@ < $(srcdir)/errno.in.h; \ @GL_GENERATE_ERRNO_H_TRUE@ } > $@-t && \ @GL_GENERATE_ERRNO_H_TRUE@ mv $@-t $@ @GL_GENERATE_ERRNO_H_FALSE@errno.h: $(top_builddir)/config.status @GL_GENERATE_ERRNO_H_FALSE@ rm -f $@ # We need the following in order to create when the system # doesn't have one that works with the given compiler. fcntl.h: fcntl.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(ARG_NONNULL_H) $(WARN_ON_USE_H) $(AM_V_GEN)rm -f $@-t $@ && \ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \ sed -e 's|@''GUARD_PREFIX''@|GL|g' \ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \ -e 's|@''NEXT_FCNTL_H''@|$(NEXT_FCNTL_H)|g' \ -e 's/@''GNULIB_CREAT''@/$(GNULIB_CREAT)/g' \ -e 's/@''GNULIB_FCNTL''@/$(GNULIB_FCNTL)/g' \ -e 's/@''GNULIB_NONBLOCKING''@/$(GNULIB_NONBLOCKING)/g' \ -e 's/@''GNULIB_OPEN''@/$(GNULIB_OPEN)/g' \ -e 's/@''GNULIB_OPENAT''@/$(GNULIB_OPENAT)/g' \ -e 's|@''HAVE_FCNTL''@|$(HAVE_FCNTL)|g' \ -e 's|@''HAVE_OPENAT''@|$(HAVE_OPENAT)|g' \ -e 's|@''REPLACE_CREAT''@|$(REPLACE_CREAT)|g' \ -e 's|@''REPLACE_FCNTL''@|$(REPLACE_FCNTL)|g' \ -e 's|@''REPLACE_OPEN''@|$(REPLACE_OPEN)|g' \ -e 's|@''REPLACE_OPENAT''@|$(REPLACE_OPENAT)|g' \ -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \ -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \ -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \ < $(srcdir)/fcntl.in.h; \ } > $@-t && \ mv $@-t $@ # We need the following in order to create when the system # doesn't have one that works with the given compiler. @GL_GENERATE_FLOAT_H_TRUE@float.h: float.in.h $(top_builddir)/config.status @GL_GENERATE_FLOAT_H_TRUE@ $(AM_V_GEN)rm -f $@-t $@ && \ @GL_GENERATE_FLOAT_H_TRUE@ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */' && \ @GL_GENERATE_FLOAT_H_TRUE@ sed -e 's|@''GUARD_PREFIX''@|GL|g' \ @GL_GENERATE_FLOAT_H_TRUE@ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \ @GL_GENERATE_FLOAT_H_TRUE@ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \ @GL_GENERATE_FLOAT_H_TRUE@ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \ @GL_GENERATE_FLOAT_H_TRUE@ -e 's|@''NEXT_FLOAT_H''@|$(NEXT_FLOAT_H)|g' \ @GL_GENERATE_FLOAT_H_TRUE@ -e 's|@''REPLACE_ITOLD''@|$(REPLACE_ITOLD)|g' \ @GL_GENERATE_FLOAT_H_TRUE@ < $(srcdir)/float.in.h; \ @GL_GENERATE_FLOAT_H_TRUE@ } > $@-t && \ @GL_GENERATE_FLOAT_H_TRUE@ mv $@-t $@ @GL_GENERATE_FLOAT_H_FALSE@float.h: $(top_builddir)/config.status @GL_GENERATE_FLOAT_H_FALSE@ rm -f $@ # We need the following in order to create when the system # doesn't have one that works with the given compiler. getopt.h: getopt.in.h $(top_builddir)/config.status $(ARG_NONNULL_H) $(AM_V_GEN)rm -f $@-t $@ && \ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \ sed -e 's|@''GUARD_PREFIX''@|GL|g' \ -e 's|@''HAVE_GETOPT_H''@|$(HAVE_GETOPT_H)|g' \ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \ -e 's|@''NEXT_GETOPT_H''@|$(NEXT_GETOPT_H)|g' \ -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \ < $(srcdir)/getopt.in.h; \ } > $@-t && \ mv -f $@-t $@ getopt-cdefs.h: getopt-cdefs.in.h $(top_builddir)/config.status $(AM_V_GEN)rm -f $@-t $@ && \ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \ sed -e 's|@''HAVE_SYS_CDEFS_H''@|$(HAVE_SYS_CDEFS_H)|g' \ < $(srcdir)/getopt-cdefs.in.h; \ } > $@-t && \ mv -f $@-t $@ # We need the following in order to create when the system # doesn't have one that works with the given compiler. inttypes.h: inttypes.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(WARN_ON_USE_H) $(ARG_NONNULL_H) $(AM_V_GEN)rm -f $@-t $@ && \ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \ sed -e 's/@''HAVE_INTTYPES_H''@/$(HAVE_INTTYPES_H)/g' \ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \ -e 's|@''NEXT_INTTYPES_H''@|$(NEXT_INTTYPES_H)|g' \ -e 's/@''APPLE_UNIVERSAL_BUILD''@/$(APPLE_UNIVERSAL_BUILD)/g' \ -e 's/@''PRIPTR_PREFIX''@/$(PRIPTR_PREFIX)/g' \ -e 's/@''GNULIB_IMAXABS''@/$(GNULIB_IMAXABS)/g' \ -e 's/@''GNULIB_IMAXDIV''@/$(GNULIB_IMAXDIV)/g' \ -e 's/@''GNULIB_STRTOIMAX''@/$(GNULIB_STRTOIMAX)/g' \ -e 's/@''GNULIB_STRTOUMAX''@/$(GNULIB_STRTOUMAX)/g' \ -e 's/@''HAVE_DECL_IMAXABS''@/$(HAVE_DECL_IMAXABS)/g' \ -e 's/@''HAVE_DECL_IMAXDIV''@/$(HAVE_DECL_IMAXDIV)/g' \ -e 's/@''HAVE_DECL_STRTOIMAX''@/$(HAVE_DECL_STRTOIMAX)/g' \ -e 's/@''HAVE_DECL_STRTOUMAX''@/$(HAVE_DECL_STRTOUMAX)/g' \ -e 's/@''HAVE_IMAXDIV_T''@/$(HAVE_IMAXDIV_T)/g' \ -e 's/@''REPLACE_STRTOIMAX''@/$(REPLACE_STRTOIMAX)/g' \ -e 's/@''REPLACE_STRTOUMAX''@/$(REPLACE_STRTOUMAX)/g' \ -e 's/@''INT32_MAX_LT_INTMAX_MAX''@/$(INT32_MAX_LT_INTMAX_MAX)/g' \ -e 's/@''INT64_MAX_EQ_LONG_MAX''@/$(INT64_MAX_EQ_LONG_MAX)/g' \ -e 's/@''UINT32_MAX_LT_UINTMAX_MAX''@/$(UINT32_MAX_LT_UINTMAX_MAX)/g' \ -e 's/@''UINT64_MAX_EQ_ULONG_MAX''@/$(UINT64_MAX_EQ_ULONG_MAX)/g' \ -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \ -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \ -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \ < $(srcdir)/inttypes.in.h; \ } > $@-t && \ mv $@-t $@ # We need the following in order to create an empty placeholder for # when the system doesn't have one. langinfo.h: langinfo.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(WARN_ON_USE_H) $(AM_V_GEN)rm -f $@-t $@ && \ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \ sed -e 's|@''GUARD_PREFIX''@|GL|g' \ -e 's|@''HAVE_LANGINFO_H''@|$(HAVE_LANGINFO_H)|g' \ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \ -e 's|@''NEXT_LANGINFO_H''@|$(NEXT_LANGINFO_H)|g' \ -e 's/@''GNULIB_NL_LANGINFO''@/$(GNULIB_NL_LANGINFO)/g' \ -e 's|@''HAVE_LANGINFO_CODESET''@|$(HAVE_LANGINFO_CODESET)|g' \ -e 's|@''HAVE_LANGINFO_T_FMT_AMPM''@|$(HAVE_LANGINFO_T_FMT_AMPM)|g' \ -e 's|@''HAVE_LANGINFO_ALTMON''@|$(HAVE_LANGINFO_ALTMON)|g' \ -e 's|@''HAVE_LANGINFO_ERA''@|$(HAVE_LANGINFO_ERA)|g' \ -e 's|@''HAVE_LANGINFO_YESEXPR''@|$(HAVE_LANGINFO_YESEXPR)|g' \ -e 's|@''HAVE_NL_LANGINFO''@|$(HAVE_NL_LANGINFO)|g' \ -e 's|@''REPLACE_NL_LANGINFO''@|$(REPLACE_NL_LANGINFO)|g' \ -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \ -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \ < $(srcdir)/langinfo.in.h; \ } > $@-t && \ mv $@-t $@ # We need the following in order to create when the system # doesn't have one that is compatible with GNU. @GL_GENERATE_LIMITS_H_TRUE@limits.h: limits.in.h $(top_builddir)/config.status @GL_GENERATE_LIMITS_H_TRUE@ $(AM_V_GEN)rm -f $@-t $@ && \ @GL_GENERATE_LIMITS_H_TRUE@ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */' && \ @GL_GENERATE_LIMITS_H_TRUE@ sed -e 's|@''GUARD_PREFIX''@|GL|g' \ @GL_GENERATE_LIMITS_H_TRUE@ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \ @GL_GENERATE_LIMITS_H_TRUE@ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \ @GL_GENERATE_LIMITS_H_TRUE@ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \ @GL_GENERATE_LIMITS_H_TRUE@ -e 's|@''NEXT_LIMITS_H''@|$(NEXT_LIMITS_H)|g' \ @GL_GENERATE_LIMITS_H_TRUE@ < $(srcdir)/limits.in.h; \ @GL_GENERATE_LIMITS_H_TRUE@ } > $@-t && \ @GL_GENERATE_LIMITS_H_TRUE@ mv $@-t $@ @GL_GENERATE_LIMITS_H_FALSE@limits.h: $(top_builddir)/config.status @GL_GENERATE_LIMITS_H_FALSE@ rm -f $@ # We need the following in order to create when the system # doesn't have one that provides all definitions. locale.h: locale.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(ARG_NONNULL_H) $(WARN_ON_USE_H) $(AM_V_GEN)rm -f $@-t $@ && \ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */' && \ sed -e 's|@''GUARD_PREFIX''@|GL|g' \ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \ -e 's|@''NEXT_LOCALE_H''@|$(NEXT_LOCALE_H)|g' \ -e 's/@''GNULIB_LOCALECONV''@/$(GNULIB_LOCALECONV)/g' \ -e 's/@''GNULIB_SETLOCALE''@/$(GNULIB_SETLOCALE)/g' \ -e 's/@''GNULIB_SETLOCALE_NULL''@/$(GNULIB_SETLOCALE_NULL)/g' \ -e 's/@''GNULIB_DUPLOCALE''@/$(GNULIB_DUPLOCALE)/g' \ -e 's/@''GNULIB_LOCALENAME''@/$(GNULIB_LOCALENAME)/g' \ -e 's|@''HAVE_NEWLOCALE''@|$(HAVE_NEWLOCALE)|g' \ -e 's|@''HAVE_DUPLOCALE''@|$(HAVE_DUPLOCALE)|g' \ -e 's|@''HAVE_FREELOCALE''@|$(HAVE_FREELOCALE)|g' \ -e 's|@''HAVE_XLOCALE_H''@|$(HAVE_XLOCALE_H)|g' \ -e 's|@''REPLACE_LOCALECONV''@|$(REPLACE_LOCALECONV)|g' \ -e 's|@''REPLACE_SETLOCALE''@|$(REPLACE_SETLOCALE)|g' \ -e 's|@''REPLACE_NEWLOCALE''@|$(REPLACE_NEWLOCALE)|g' \ -e 's|@''REPLACE_DUPLOCALE''@|$(REPLACE_DUPLOCALE)|g' \ -e 's|@''REPLACE_FREELOCALE''@|$(REPLACE_FREELOCALE)|g' \ -e 's|@''REPLACE_STRUCT_LCONV''@|$(REPLACE_STRUCT_LCONV)|g' \ -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \ -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \ -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \ < $(srcdir)/locale.in.h; \ } > $@-t && \ mv $@-t $@ # We need the following in order to create when the system # doesn't have one that works with the given compiler. math.h: math.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(ARG_NONNULL_H) $(WARN_ON_USE_H) $(AM_V_GEN)rm -f $@-t $@ && \ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */' && \ sed -e 's|@''GUARD_PREFIX''@|GL|g' \ -e 's|@''INCLUDE_NEXT_AS_FIRST_DIRECTIVE''@|$(INCLUDE_NEXT_AS_FIRST_DIRECTIVE)|g' \ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \ -e 's|@''NEXT_AS_FIRST_DIRECTIVE_MATH_H''@|$(NEXT_AS_FIRST_DIRECTIVE_MATH_H)|g' \ -e 's/@''GNULIB_ACOSF''@/$(GNULIB_ACOSF)/g' \ -e 's/@''GNULIB_ACOSL''@/$(GNULIB_ACOSL)/g' \ -e 's/@''GNULIB_ASINF''@/$(GNULIB_ASINF)/g' \ -e 's/@''GNULIB_ASINL''@/$(GNULIB_ASINL)/g' \ -e 's/@''GNULIB_ATANF''@/$(GNULIB_ATANF)/g' \ -e 's/@''GNULIB_ATANL''@/$(GNULIB_ATANL)/g' \ -e 's/@''GNULIB_ATAN2F''@/$(GNULIB_ATAN2F)/g' \ -e 's/@''GNULIB_CBRT''@/$(GNULIB_CBRT)/g' \ -e 's/@''GNULIB_CBRTF''@/$(GNULIB_CBRTF)/g' \ -e 's/@''GNULIB_CBRTL''@/$(GNULIB_CBRTL)/g' \ -e 's/@''GNULIB_CEIL''@/$(GNULIB_CEIL)/g' \ -e 's/@''GNULIB_CEILF''@/$(GNULIB_CEILF)/g' \ -e 's/@''GNULIB_CEILL''@/$(GNULIB_CEILL)/g' \ -e 's/@''GNULIB_COPYSIGN''@/$(GNULIB_COPYSIGN)/g' \ -e 's/@''GNULIB_COPYSIGNF''@/$(GNULIB_COPYSIGNF)/g' \ -e 's/@''GNULIB_COPYSIGNL''@/$(GNULIB_COPYSIGNL)/g' \ -e 's/@''GNULIB_COSF''@/$(GNULIB_COSF)/g' \ -e 's/@''GNULIB_COSL''@/$(GNULIB_COSL)/g' \ -e 's/@''GNULIB_COSHF''@/$(GNULIB_COSHF)/g' \ -e 's/@''GNULIB_EXPF''@/$(GNULIB_EXPF)/g' \ -e 's/@''GNULIB_EXPL''@/$(GNULIB_EXPL)/g' \ -e 's/@''GNULIB_EXP2''@/$(GNULIB_EXP2)/g' \ -e 's/@''GNULIB_EXP2F''@/$(GNULIB_EXP2F)/g' \ -e 's/@''GNULIB_EXP2L''@/$(GNULIB_EXP2L)/g' \ -e 's/@''GNULIB_EXPM1''@/$(GNULIB_EXPM1)/g' \ -e 's/@''GNULIB_EXPM1F''@/$(GNULIB_EXPM1F)/g' \ -e 's/@''GNULIB_EXPM1L''@/$(GNULIB_EXPM1L)/g' \ -e 's/@''GNULIB_FABSF''@/$(GNULIB_FABSF)/g' \ -e 's/@''GNULIB_FABSL''@/$(GNULIB_FABSL)/g' \ -e 's/@''GNULIB_FLOOR''@/$(GNULIB_FLOOR)/g' \ -e 's/@''GNULIB_FLOORF''@/$(GNULIB_FLOORF)/g' \ -e 's/@''GNULIB_FLOORL''@/$(GNULIB_FLOORL)/g' \ -e 's/@''GNULIB_FMA''@/$(GNULIB_FMA)/g' \ -e 's/@''GNULIB_FMAF''@/$(GNULIB_FMAF)/g' \ -e 's/@''GNULIB_FMAL''@/$(GNULIB_FMAL)/g' \ -e 's/@''GNULIB_FMOD''@/$(GNULIB_FMOD)/g' \ -e 's/@''GNULIB_FMODF''@/$(GNULIB_FMODF)/g' \ -e 's/@''GNULIB_FMODL''@/$(GNULIB_FMODL)/g' \ -e 's/@''GNULIB_FREXPF''@/$(GNULIB_FREXPF)/g' \ -e 's/@''GNULIB_FREXP''@/$(GNULIB_FREXP)/g' \ -e 's/@''GNULIB_FREXPL''@/$(GNULIB_FREXPL)/g' \ -e 's/@''GNULIB_HYPOT''@/$(GNULIB_HYPOT)/g' \ -e 's/@''GNULIB_HYPOTF''@/$(GNULIB_HYPOTF)/g' \ -e 's/@''GNULIB_HYPOTL''@/$(GNULIB_HYPOTL)/g' \ < $(srcdir)/math.in.h | \ sed -e 's/@''GNULIB_ILOGB''@/$(GNULIB_ILOGB)/g' \ -e 's/@''GNULIB_ILOGBF''@/$(GNULIB_ILOGBF)/g' \ -e 's/@''GNULIB_ILOGBL''@/$(GNULIB_ILOGBL)/g' \ -e 's/@''GNULIB_ISFINITE''@/$(GNULIB_ISFINITE)/g' \ -e 's/@''GNULIB_ISINF''@/$(GNULIB_ISINF)/g' \ -e 's/@''GNULIB_ISNAN''@/$(GNULIB_ISNAN)/g' \ -e 's/@''GNULIB_ISNANF''@/$(GNULIB_ISNANF)/g' \ -e 's/@''GNULIB_ISNAND''@/$(GNULIB_ISNAND)/g' \ -e 's/@''GNULIB_ISNANL''@/$(GNULIB_ISNANL)/g' \ -e 's/@''GNULIB_LDEXPF''@/$(GNULIB_LDEXPF)/g' \ -e 's/@''GNULIB_LDEXPL''@/$(GNULIB_LDEXPL)/g' \ -e 's/@''GNULIB_LOG''@/$(GNULIB_LOG)/g' \ -e 's/@''GNULIB_LOGF''@/$(GNULIB_LOGF)/g' \ -e 's/@''GNULIB_LOGL''@/$(GNULIB_LOGL)/g' \ -e 's/@''GNULIB_LOG10''@/$(GNULIB_LOG10)/g' \ -e 's/@''GNULIB_LOG10F''@/$(GNULIB_LOG10F)/g' \ -e 's/@''GNULIB_LOG10L''@/$(GNULIB_LOG10L)/g' \ -e 's/@''GNULIB_LOG1P''@/$(GNULIB_LOG1P)/g' \ -e 's/@''GNULIB_LOG1PF''@/$(GNULIB_LOG1PF)/g' \ -e 's/@''GNULIB_LOG1PL''@/$(GNULIB_LOG1PL)/g' \ -e 's/@''GNULIB_LOG2''@/$(GNULIB_LOG2)/g' \ -e 's/@''GNULIB_LOG2F''@/$(GNULIB_LOG2F)/g' \ -e 's/@''GNULIB_LOG2L''@/$(GNULIB_LOG2L)/g' \ -e 's/@''GNULIB_LOGB''@/$(GNULIB_LOGB)/g' \ -e 's/@''GNULIB_LOGBF''@/$(GNULIB_LOGBF)/g' \ -e 's/@''GNULIB_LOGBL''@/$(GNULIB_LOGBL)/g' \ -e 's/@''GNULIB_MODF''@/$(GNULIB_MODF)/g' \ -e 's/@''GNULIB_MODFF''@/$(GNULIB_MODFF)/g' \ -e 's/@''GNULIB_MODFL''@/$(GNULIB_MODFL)/g' \ -e 's/@''GNULIB_POWF''@/$(GNULIB_POWF)/g' \ -e 's/@''GNULIB_REMAINDER''@/$(GNULIB_REMAINDER)/g' \ -e 's/@''GNULIB_REMAINDERF''@/$(GNULIB_REMAINDERF)/g' \ -e 's/@''GNULIB_REMAINDERL''@/$(GNULIB_REMAINDERL)/g' \ -e 's/@''GNULIB_RINT''@/$(GNULIB_RINT)/g' \ -e 's/@''GNULIB_RINTF''@/$(GNULIB_RINTF)/g' \ -e 's/@''GNULIB_RINTL''@/$(GNULIB_RINTL)/g' \ -e 's/@''GNULIB_ROUND''@/$(GNULIB_ROUND)/g' \ -e 's/@''GNULIB_ROUNDF''@/$(GNULIB_ROUNDF)/g' \ -e 's/@''GNULIB_ROUNDL''@/$(GNULIB_ROUNDL)/g' \ -e 's/@''GNULIB_SIGNBIT''@/$(GNULIB_SIGNBIT)/g' \ -e 's/@''GNULIB_SINF''@/$(GNULIB_SINF)/g' \ -e 's/@''GNULIB_SINL''@/$(GNULIB_SINL)/g' \ -e 's/@''GNULIB_SINHF''@/$(GNULIB_SINHF)/g' \ -e 's/@''GNULIB_SQRTF''@/$(GNULIB_SQRTF)/g' \ -e 's/@''GNULIB_SQRTL''@/$(GNULIB_SQRTL)/g' \ -e 's/@''GNULIB_TANF''@/$(GNULIB_TANF)/g' \ -e 's/@''GNULIB_TANL''@/$(GNULIB_TANL)/g' \ -e 's/@''GNULIB_TANHF''@/$(GNULIB_TANHF)/g' \ -e 's/@''GNULIB_TRUNC''@/$(GNULIB_TRUNC)/g' \ -e 's/@''GNULIB_TRUNCF''@/$(GNULIB_TRUNCF)/g' \ -e 's/@''GNULIB_TRUNCL''@/$(GNULIB_TRUNCL)/g' \ | \ sed -e 's|@''HAVE_ACOSF''@|$(HAVE_ACOSF)|g' \ -e 's|@''HAVE_ACOSL''@|$(HAVE_ACOSL)|g' \ -e 's|@''HAVE_ASINF''@|$(HAVE_ASINF)|g' \ -e 's|@''HAVE_ASINL''@|$(HAVE_ASINL)|g' \ -e 's|@''HAVE_ATANF''@|$(HAVE_ATANF)|g' \ -e 's|@''HAVE_ATANL''@|$(HAVE_ATANL)|g' \ -e 's|@''HAVE_ATAN2F''@|$(HAVE_ATAN2F)|g' \ -e 's|@''HAVE_CBRT''@|$(HAVE_CBRT)|g' \ -e 's|@''HAVE_CBRTF''@|$(HAVE_CBRTF)|g' \ -e 's|@''HAVE_CBRTL''@|$(HAVE_CBRTL)|g' \ -e 's|@''HAVE_COPYSIGN''@|$(HAVE_COPYSIGN)|g' \ -e 's|@''HAVE_COPYSIGNL''@|$(HAVE_COPYSIGNL)|g' \ -e 's|@''HAVE_COSF''@|$(HAVE_COSF)|g' \ -e 's|@''HAVE_COSL''@|$(HAVE_COSL)|g' \ -e 's|@''HAVE_COSHF''@|$(HAVE_COSHF)|g' \ -e 's|@''HAVE_EXPF''@|$(HAVE_EXPF)|g' \ -e 's|@''HAVE_EXPL''@|$(HAVE_EXPL)|g' \ -e 's|@''HAVE_EXPM1''@|$(HAVE_EXPM1)|g' \ -e 's|@''HAVE_EXPM1F''@|$(HAVE_EXPM1F)|g' \ -e 's|@''HAVE_FABSF''@|$(HAVE_FABSF)|g' \ -e 's|@''HAVE_FABSL''@|$(HAVE_FABSL)|g' \ -e 's|@''HAVE_FMA''@|$(HAVE_FMA)|g' \ -e 's|@''HAVE_FMAF''@|$(HAVE_FMAF)|g' \ -e 's|@''HAVE_FMAL''@|$(HAVE_FMAL)|g' \ -e 's|@''HAVE_FMODF''@|$(HAVE_FMODF)|g' \ -e 's|@''HAVE_FMODL''@|$(HAVE_FMODL)|g' \ -e 's|@''HAVE_FREXPF''@|$(HAVE_FREXPF)|g' \ -e 's|@''HAVE_HYPOTF''@|$(HAVE_HYPOTF)|g' \ -e 's|@''HAVE_HYPOTL''@|$(HAVE_HYPOTL)|g' \ -e 's|@''HAVE_ILOGB''@|$(HAVE_ILOGB)|g' \ -e 's|@''HAVE_ILOGBF''@|$(HAVE_ILOGBF)|g' \ -e 's|@''HAVE_ILOGBL''@|$(HAVE_ILOGBL)|g' \ -e 's|@''HAVE_ISNANF''@|$(HAVE_ISNANF)|g' \ -e 's|@''HAVE_ISNAND''@|$(HAVE_ISNAND)|g' \ -e 's|@''HAVE_ISNANL''@|$(HAVE_ISNANL)|g' \ -e 's|@''HAVE_LDEXPF''@|$(HAVE_LDEXPF)|g' \ -e 's|@''HAVE_LOGF''@|$(HAVE_LOGF)|g' \ -e 's|@''HAVE_LOGL''@|$(HAVE_LOGL)|g' \ -e 's|@''HAVE_LOG10F''@|$(HAVE_LOG10F)|g' \ -e 's|@''HAVE_LOG10L''@|$(HAVE_LOG10L)|g' \ -e 's|@''HAVE_LOG1P''@|$(HAVE_LOG1P)|g' \ -e 's|@''HAVE_LOG1PF''@|$(HAVE_LOG1PF)|g' \ -e 's|@''HAVE_LOG1PL''@|$(HAVE_LOG1PL)|g' \ -e 's|@''HAVE_LOGBF''@|$(HAVE_LOGBF)|g' \ -e 's|@''HAVE_LOGBL''@|$(HAVE_LOGBL)|g' \ -e 's|@''HAVE_MODFF''@|$(HAVE_MODFF)|g' \ -e 's|@''HAVE_MODFL''@|$(HAVE_MODFL)|g' \ -e 's|@''HAVE_POWF''@|$(HAVE_POWF)|g' \ -e 's|@''HAVE_REMAINDER''@|$(HAVE_REMAINDER)|g' \ -e 's|@''HAVE_REMAINDERF''@|$(HAVE_REMAINDERF)|g' \ -e 's|@''HAVE_RINT''@|$(HAVE_RINT)|g' \ -e 's|@''HAVE_RINTL''@|$(HAVE_RINTL)|g' \ -e 's|@''HAVE_SINF''@|$(HAVE_SINF)|g' \ -e 's|@''HAVE_SINL''@|$(HAVE_SINL)|g' \ -e 's|@''HAVE_SINHF''@|$(HAVE_SINHF)|g' \ -e 's|@''HAVE_SQRTF''@|$(HAVE_SQRTF)|g' \ -e 's|@''HAVE_SQRTL''@|$(HAVE_SQRTL)|g' \ -e 's|@''HAVE_TANF''@|$(HAVE_TANF)|g' \ -e 's|@''HAVE_TANL''@|$(HAVE_TANL)|g' \ -e 's|@''HAVE_TANHF''@|$(HAVE_TANHF)|g' \ -e 's|@''HAVE_DECL_ACOSL''@|$(HAVE_DECL_ACOSL)|g' \ -e 's|@''HAVE_DECL_ASINL''@|$(HAVE_DECL_ASINL)|g' \ -e 's|@''HAVE_DECL_ATANL''@|$(HAVE_DECL_ATANL)|g' \ -e 's|@''HAVE_DECL_CBRTF''@|$(HAVE_DECL_CBRTF)|g' \ -e 's|@''HAVE_DECL_CBRTL''@|$(HAVE_DECL_CBRTL)|g' \ -e 's|@''HAVE_DECL_CEILF''@|$(HAVE_DECL_CEILF)|g' \ -e 's|@''HAVE_DECL_CEILL''@|$(HAVE_DECL_CEILL)|g' \ -e 's|@''HAVE_DECL_COPYSIGNF''@|$(HAVE_DECL_COPYSIGNF)|g' \ -e 's|@''HAVE_DECL_COSL''@|$(HAVE_DECL_COSL)|g' \ -e 's|@''HAVE_DECL_EXPL''@|$(HAVE_DECL_EXPL)|g' \ -e 's|@''HAVE_DECL_EXP2''@|$(HAVE_DECL_EXP2)|g' \ -e 's|@''HAVE_DECL_EXP2F''@|$(HAVE_DECL_EXP2F)|g' \ -e 's|@''HAVE_DECL_EXP2L''@|$(HAVE_DECL_EXP2L)|g' \ -e 's|@''HAVE_DECL_EXPM1L''@|$(HAVE_DECL_EXPM1L)|g' \ -e 's|@''HAVE_DECL_FLOORF''@|$(HAVE_DECL_FLOORF)|g' \ -e 's|@''HAVE_DECL_FLOORL''@|$(HAVE_DECL_FLOORL)|g' \ -e 's|@''HAVE_DECL_FREXPL''@|$(HAVE_DECL_FREXPL)|g' \ -e 's|@''HAVE_DECL_LDEXPL''@|$(HAVE_DECL_LDEXPL)|g' \ -e 's|@''HAVE_DECL_LOGL''@|$(HAVE_DECL_LOGL)|g' \ -e 's|@''HAVE_DECL_LOG10L''@|$(HAVE_DECL_LOG10L)|g' \ -e 's|@''HAVE_DECL_LOG2''@|$(HAVE_DECL_LOG2)|g' \ -e 's|@''HAVE_DECL_LOG2F''@|$(HAVE_DECL_LOG2F)|g' \ -e 's|@''HAVE_DECL_LOG2L''@|$(HAVE_DECL_LOG2L)|g' \ -e 's|@''HAVE_DECL_LOGB''@|$(HAVE_DECL_LOGB)|g' \ -e 's|@''HAVE_DECL_REMAINDER''@|$(HAVE_DECL_REMAINDER)|g' \ -e 's|@''HAVE_DECL_REMAINDERL''@|$(HAVE_DECL_REMAINDERL)|g' \ -e 's|@''HAVE_DECL_RINTF''@|$(HAVE_DECL_RINTF)|g' \ -e 's|@''HAVE_DECL_ROUND''@|$(HAVE_DECL_ROUND)|g' \ -e 's|@''HAVE_DECL_ROUNDF''@|$(HAVE_DECL_ROUNDF)|g' \ -e 's|@''HAVE_DECL_ROUNDL''@|$(HAVE_DECL_ROUNDL)|g' \ -e 's|@''HAVE_DECL_SINL''@|$(HAVE_DECL_SINL)|g' \ -e 's|@''HAVE_DECL_SQRTL''@|$(HAVE_DECL_SQRTL)|g' \ -e 's|@''HAVE_DECL_TANL''@|$(HAVE_DECL_TANL)|g' \ -e 's|@''HAVE_DECL_TRUNC''@|$(HAVE_DECL_TRUNC)|g' \ -e 's|@''HAVE_DECL_TRUNCF''@|$(HAVE_DECL_TRUNCF)|g' \ -e 's|@''HAVE_DECL_TRUNCL''@|$(HAVE_DECL_TRUNCL)|g' \ | \ sed -e 's|@''REPLACE_ACOSF''@|$(REPLACE_ACOSF)|g' \ -e 's|@''REPLACE_ASINF''@|$(REPLACE_ASINF)|g' \ -e 's|@''REPLACE_ATANF''@|$(REPLACE_ATANF)|g' \ -e 's|@''REPLACE_ATAN2F''@|$(REPLACE_ATAN2F)|g' \ -e 's|@''REPLACE_CBRTF''@|$(REPLACE_CBRTF)|g' \ -e 's|@''REPLACE_CBRTL''@|$(REPLACE_CBRTL)|g' \ -e 's|@''REPLACE_CEIL''@|$(REPLACE_CEIL)|g' \ -e 's|@''REPLACE_CEILF''@|$(REPLACE_CEILF)|g' \ -e 's|@''REPLACE_CEILL''@|$(REPLACE_CEILL)|g' \ -e 's|@''REPLACE_COSF''@|$(REPLACE_COSF)|g' \ -e 's|@''REPLACE_COSHF''@|$(REPLACE_COSHF)|g' \ -e 's|@''REPLACE_EXPF''@|$(REPLACE_EXPF)|g' \ -e 's|@''REPLACE_EXPL''@|$(REPLACE_EXPL)|g' \ -e 's|@''REPLACE_EXPM1''@|$(REPLACE_EXPM1)|g' \ -e 's|@''REPLACE_EXPM1F''@|$(REPLACE_EXPM1F)|g' \ -e 's|@''REPLACE_EXPM1L''@|$(REPLACE_EXPM1L)|g' \ -e 's|@''REPLACE_EXP2''@|$(REPLACE_EXP2)|g' \ -e 's|@''REPLACE_EXP2L''@|$(REPLACE_EXP2L)|g' \ -e 's|@''REPLACE_FABSL''@|$(REPLACE_FABSL)|g' \ -e 's|@''REPLACE_FLOOR''@|$(REPLACE_FLOOR)|g' \ -e 's|@''REPLACE_FLOORF''@|$(REPLACE_FLOORF)|g' \ -e 's|@''REPLACE_FLOORL''@|$(REPLACE_FLOORL)|g' \ -e 's|@''REPLACE_FMA''@|$(REPLACE_FMA)|g' \ -e 's|@''REPLACE_FMAF''@|$(REPLACE_FMAF)|g' \ -e 's|@''REPLACE_FMAL''@|$(REPLACE_FMAL)|g' \ -e 's|@''REPLACE_FMOD''@|$(REPLACE_FMOD)|g' \ -e 's|@''REPLACE_FMODF''@|$(REPLACE_FMODF)|g' \ -e 's|@''REPLACE_FMODL''@|$(REPLACE_FMODL)|g' \ -e 's|@''REPLACE_FREXPF''@|$(REPLACE_FREXPF)|g' \ -e 's|@''REPLACE_FREXP''@|$(REPLACE_FREXP)|g' \ -e 's|@''REPLACE_FREXPL''@|$(REPLACE_FREXPL)|g' \ -e 's|@''REPLACE_HUGE_VAL''@|$(REPLACE_HUGE_VAL)|g' \ -e 's|@''REPLACE_HYPOT''@|$(REPLACE_HYPOT)|g' \ -e 's|@''REPLACE_HYPOTF''@|$(REPLACE_HYPOTF)|g' \ -e 's|@''REPLACE_HYPOTL''@|$(REPLACE_HYPOTL)|g' \ -e 's|@''REPLACE_ILOGB''@|$(REPLACE_ILOGB)|g' \ -e 's|@''REPLACE_ILOGBF''@|$(REPLACE_ILOGBF)|g' \ -e 's|@''REPLACE_ILOGBL''@|$(REPLACE_ILOGBL)|g' \ -e 's|@''REPLACE_ISFINITE''@|$(REPLACE_ISFINITE)|g' \ -e 's|@''REPLACE_ISINF''@|$(REPLACE_ISINF)|g' \ -e 's|@''REPLACE_ISNAN''@|$(REPLACE_ISNAN)|g' \ -e 's|@''REPLACE_ITOLD''@|$(REPLACE_ITOLD)|g' \ -e 's|@''REPLACE_LDEXPL''@|$(REPLACE_LDEXPL)|g' \ -e 's|@''REPLACE_LOG''@|$(REPLACE_LOG)|g' \ -e 's|@''REPLACE_LOGF''@|$(REPLACE_LOGF)|g' \ -e 's|@''REPLACE_LOGL''@|$(REPLACE_LOGL)|g' \ -e 's|@''REPLACE_LOG10''@|$(REPLACE_LOG10)|g' \ -e 's|@''REPLACE_LOG10F''@|$(REPLACE_LOG10F)|g' \ -e 's|@''REPLACE_LOG10L''@|$(REPLACE_LOG10L)|g' \ -e 's|@''REPLACE_LOG1P''@|$(REPLACE_LOG1P)|g' \ -e 's|@''REPLACE_LOG1PF''@|$(REPLACE_LOG1PF)|g' \ -e 's|@''REPLACE_LOG1PL''@|$(REPLACE_LOG1PL)|g' \ -e 's|@''REPLACE_LOG2''@|$(REPLACE_LOG2)|g' \ -e 's|@''REPLACE_LOG2F''@|$(REPLACE_LOG2F)|g' \ -e 's|@''REPLACE_LOG2L''@|$(REPLACE_LOG2L)|g' \ -e 's|@''REPLACE_LOGB''@|$(REPLACE_LOGB)|g' \ -e 's|@''REPLACE_LOGBF''@|$(REPLACE_LOGBF)|g' \ -e 's|@''REPLACE_LOGBL''@|$(REPLACE_LOGBL)|g' \ -e 's|@''REPLACE_MODF''@|$(REPLACE_MODF)|g' \ -e 's|@''REPLACE_MODFF''@|$(REPLACE_MODFF)|g' \ -e 's|@''REPLACE_MODFL''@|$(REPLACE_MODFL)|g' \ -e 's|@''REPLACE_NAN''@|$(REPLACE_NAN)|g' \ -e 's|@''REPLACE_REMAINDER''@|$(REPLACE_REMAINDER)|g' \ -e 's|@''REPLACE_REMAINDERF''@|$(REPLACE_REMAINDERF)|g' \ -e 's|@''REPLACE_REMAINDERL''@|$(REPLACE_REMAINDERL)|g' \ -e 's|@''REPLACE_RINTL''@|$(REPLACE_RINTL)|g' \ -e 's|@''REPLACE_ROUND''@|$(REPLACE_ROUND)|g' \ -e 's|@''REPLACE_ROUNDF''@|$(REPLACE_ROUNDF)|g' \ -e 's|@''REPLACE_ROUNDL''@|$(REPLACE_ROUNDL)|g' \ -e 's|@''REPLACE_SIGNBIT''@|$(REPLACE_SIGNBIT)|g' \ -e 's|@''REPLACE_SIGNBIT_USING_BUILTINS''@|$(REPLACE_SIGNBIT_USING_BUILTINS)|g' \ -e 's|@''REPLACE_SINF''@|$(REPLACE_SINF)|g' \ -e 's|@''REPLACE_SINHF''@|$(REPLACE_SINHF)|g' \ -e 's|@''REPLACE_SQRTF''@|$(REPLACE_SQRTF)|g' \ -e 's|@''REPLACE_SQRTL''@|$(REPLACE_SQRTL)|g' \ -e 's|@''REPLACE_TANF''@|$(REPLACE_TANF)|g' \ -e 's|@''REPLACE_TANHF''@|$(REPLACE_TANHF)|g' \ -e 's|@''REPLACE_TRUNC''@|$(REPLACE_TRUNC)|g' \ -e 's|@''REPLACE_TRUNCF''@|$(REPLACE_TRUNCF)|g' \ -e 's|@''REPLACE_TRUNCL''@|$(REPLACE_TRUNCL)|g' \ -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \ -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \ -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)'; \ } > $@-t && \ mv $@-t $@ @RELOCATABLE_VIA_WRAPPER_TRUE@uninstall-hook: uninstall-relocwrapper @RELOCATABLE_VIA_WRAPPER_TRUE@uninstall-relocwrapper: @RELOCATABLE_VIA_WRAPPER_TRUE@ if test $(RELOCATABLE) = yes; then \ @RELOCATABLE_VIA_WRAPPER_TRUE@ case '$(EXEEXT)' in \ @RELOCATABLE_VIA_WRAPPER_TRUE@ .bin*) ;; \ @RELOCATABLE_VIA_WRAPPER_TRUE@ *) cd $(top_builddir) && \ @RELOCATABLE_VIA_WRAPPER_TRUE@ $(MAKE) $(AM_MAKEFLAGS) EXEEXT=.bin$(EXEEXT) \ @RELOCATABLE_VIA_WRAPPER_TRUE@ AM_MAKEFLAGS='$(AM_MAKEFLAGS) EXEEXT=.bin$(EXEEXT)' \ @RELOCATABLE_VIA_WRAPPER_TRUE@ uninstall ;; \ @RELOCATABLE_VIA_WRAPPER_TRUE@ esac; \ @RELOCATABLE_VIA_WRAPPER_TRUE@ fi .PHONY: uninstall-relocwrapper # We need the following in order to create when the system # doesn't have a complete one. signal.h: signal.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(ARG_NONNULL_H) $(WARN_ON_USE_H) $(AM_V_GEN)rm -f $@-t $@ && \ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */' && \ sed -e 's|@''GUARD_PREFIX''@|GL|g' \ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \ -e 's|@''NEXT_SIGNAL_H''@|$(NEXT_SIGNAL_H)|g' \ -e 's/@''GNULIB_PTHREAD_SIGMASK''@/$(GNULIB_PTHREAD_SIGMASK)/g' \ -e 's/@''GNULIB_RAISE''@/$(GNULIB_RAISE)/g' \ -e 's/@''GNULIB_SIGNAL_H_SIGPIPE''@/$(GNULIB_SIGNAL_H_SIGPIPE)/g' \ -e 's/@''GNULIB_SIGPROCMASK''@/$(GNULIB_SIGPROCMASK)/g' \ -e 's/@''GNULIB_SIGACTION''@/$(GNULIB_SIGACTION)/g' \ -e 's|@''HAVE_POSIX_SIGNALBLOCKING''@|$(HAVE_POSIX_SIGNALBLOCKING)|g' \ -e 's|@''HAVE_PTHREAD_SIGMASK''@|$(HAVE_PTHREAD_SIGMASK)|g' \ -e 's|@''HAVE_RAISE''@|$(HAVE_RAISE)|g' \ -e 's|@''HAVE_SIGSET_T''@|$(HAVE_SIGSET_T)|g' \ -e 's|@''HAVE_SIGINFO_T''@|$(HAVE_SIGINFO_T)|g' \ -e 's|@''HAVE_SIGACTION''@|$(HAVE_SIGACTION)|g' \ -e 's|@''HAVE_STRUCT_SIGACTION_SA_SIGACTION''@|$(HAVE_STRUCT_SIGACTION_SA_SIGACTION)|g' \ -e 's|@''HAVE_TYPE_VOLATILE_SIG_ATOMIC_T''@|$(HAVE_TYPE_VOLATILE_SIG_ATOMIC_T)|g' \ -e 's|@''HAVE_SIGHANDLER_T''@|$(HAVE_SIGHANDLER_T)|g' \ -e 's|@''REPLACE_PTHREAD_SIGMASK''@|$(REPLACE_PTHREAD_SIGMASK)|g' \ -e 's|@''REPLACE_RAISE''@|$(REPLACE_RAISE)|g' \ -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \ -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \ -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \ < $(srcdir)/signal.in.h; \ } > $@-t && \ mv $@-t $@ # We need the following in order to create when the system # doesn't have one that works. @GL_GENERATE_STDALIGN_H_TRUE@stdalign.h: stdalign.in.h $(top_builddir)/config.status @GL_GENERATE_STDALIGN_H_TRUE@ $(AM_V_GEN)rm -f $@-t $@ && \ @GL_GENERATE_STDALIGN_H_TRUE@ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \ @GL_GENERATE_STDALIGN_H_TRUE@ cat $(srcdir)/stdalign.in.h; \ @GL_GENERATE_STDALIGN_H_TRUE@ } > $@-t && \ @GL_GENERATE_STDALIGN_H_TRUE@ mv $@-t $@ @GL_GENERATE_STDALIGN_H_FALSE@stdalign.h: $(top_builddir)/config.status @GL_GENERATE_STDALIGN_H_FALSE@ rm -f $@ # We need the following in order to create when the system # doesn't have one that works with the given compiler. @GL_GENERATE_STDARG_H_TRUE@stdarg.h: stdarg.in.h $(top_builddir)/config.status @GL_GENERATE_STDARG_H_TRUE@ $(AM_V_GEN)rm -f $@-t $@ && \ @GL_GENERATE_STDARG_H_TRUE@ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */' && \ @GL_GENERATE_STDARG_H_TRUE@ sed -e 's|@''GUARD_PREFIX''@|GL|g' \ @GL_GENERATE_STDARG_H_TRUE@ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \ @GL_GENERATE_STDARG_H_TRUE@ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \ @GL_GENERATE_STDARG_H_TRUE@ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \ @GL_GENERATE_STDARG_H_TRUE@ -e 's|@''NEXT_STDARG_H''@|$(NEXT_STDARG_H)|g' \ @GL_GENERATE_STDARG_H_TRUE@ < $(srcdir)/stdarg.in.h; \ @GL_GENERATE_STDARG_H_TRUE@ } > $@-t && \ @GL_GENERATE_STDARG_H_TRUE@ mv $@-t $@ @GL_GENERATE_STDARG_H_FALSE@stdarg.h: $(top_builddir)/config.status @GL_GENERATE_STDARG_H_FALSE@ rm -f $@ # We need the following in order to create when the system # doesn't have one that works. @GL_GENERATE_STDBOOL_H_TRUE@stdbool.h: stdbool.in.h $(top_builddir)/config.status @GL_GENERATE_STDBOOL_H_TRUE@ $(AM_V_GEN)rm -f $@-t $@ && \ @GL_GENERATE_STDBOOL_H_TRUE@ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \ @GL_GENERATE_STDBOOL_H_TRUE@ sed -e 's/@''HAVE__BOOL''@/$(HAVE__BOOL)/g' < $(srcdir)/stdbool.in.h; \ @GL_GENERATE_STDBOOL_H_TRUE@ } > $@-t && \ @GL_GENERATE_STDBOOL_H_TRUE@ mv $@-t $@ @GL_GENERATE_STDBOOL_H_FALSE@stdbool.h: $(top_builddir)/config.status @GL_GENERATE_STDBOOL_H_FALSE@ rm -f $@ # We need the following in order to create when the system # doesn't have one that works with the given compiler. @GL_GENERATE_STDDEF_H_TRUE@stddef.h: stddef.in.h $(top_builddir)/config.status @GL_GENERATE_STDDEF_H_TRUE@ $(AM_V_GEN)rm -f $@-t $@ && \ @GL_GENERATE_STDDEF_H_TRUE@ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */' && \ @GL_GENERATE_STDDEF_H_TRUE@ sed -e 's|@''GUARD_PREFIX''@|GL|g' \ @GL_GENERATE_STDDEF_H_TRUE@ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \ @GL_GENERATE_STDDEF_H_TRUE@ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \ @GL_GENERATE_STDDEF_H_TRUE@ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \ @GL_GENERATE_STDDEF_H_TRUE@ -e 's|@''NEXT_STDDEF_H''@|$(NEXT_STDDEF_H)|g' \ @GL_GENERATE_STDDEF_H_TRUE@ -e 's|@''HAVE_MAX_ALIGN_T''@|$(HAVE_MAX_ALIGN_T)|g' \ @GL_GENERATE_STDDEF_H_TRUE@ -e 's|@''HAVE_WCHAR_T''@|$(HAVE_WCHAR_T)|g' \ @GL_GENERATE_STDDEF_H_TRUE@ -e 's|@''REPLACE_NULL''@|$(REPLACE_NULL)|g' \ @GL_GENERATE_STDDEF_H_TRUE@ < $(srcdir)/stddef.in.h; \ @GL_GENERATE_STDDEF_H_TRUE@ } > $@-t && \ @GL_GENERATE_STDDEF_H_TRUE@ mv $@-t $@ @GL_GENERATE_STDDEF_H_FALSE@stddef.h: $(top_builddir)/config.status @GL_GENERATE_STDDEF_H_FALSE@ rm -f $@ # We need the following in order to create when the system # doesn't have one that works with the given compiler. @GL_GENERATE_STDINT_H_TRUE@stdint.h: stdint.in.h $(top_builddir)/config.status @GL_GENERATE_STDINT_H_TRUE@ $(AM_V_GEN)rm -f $@-t $@ && \ @GL_GENERATE_STDINT_H_TRUE@ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \ @GL_GENERATE_STDINT_H_TRUE@ sed -e 's|@''GUARD_PREFIX''@|GL|g' \ @GL_GENERATE_STDINT_H_TRUE@ -e 's/@''HAVE_STDINT_H''@/$(HAVE_STDINT_H)/g' \ @GL_GENERATE_STDINT_H_TRUE@ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \ @GL_GENERATE_STDINT_H_TRUE@ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \ @GL_GENERATE_STDINT_H_TRUE@ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \ @GL_GENERATE_STDINT_H_TRUE@ -e 's|@''NEXT_STDINT_H''@|$(NEXT_STDINT_H)|g' \ @GL_GENERATE_STDINT_H_TRUE@ -e 's/@''HAVE_C99_STDINT_H''@/$(HAVE_C99_STDINT_H)/g' \ @GL_GENERATE_STDINT_H_TRUE@ -e 's/@''HAVE_SYS_TYPES_H''@/$(HAVE_SYS_TYPES_H)/g' \ @GL_GENERATE_STDINT_H_TRUE@ -e 's/@''HAVE_INTTYPES_H''@/$(HAVE_INTTYPES_H)/g' \ @GL_GENERATE_STDINT_H_TRUE@ -e 's/@''HAVE_SYS_INTTYPES_H''@/$(HAVE_SYS_INTTYPES_H)/g' \ @GL_GENERATE_STDINT_H_TRUE@ -e 's/@''HAVE_SYS_BITYPES_H''@/$(HAVE_SYS_BITYPES_H)/g' \ @GL_GENERATE_STDINT_H_TRUE@ -e 's/@''HAVE_WCHAR_H''@/$(HAVE_WCHAR_H)/g' \ @GL_GENERATE_STDINT_H_TRUE@ -e 's/@''APPLE_UNIVERSAL_BUILD''@/$(APPLE_UNIVERSAL_BUILD)/g' \ @GL_GENERATE_STDINT_H_TRUE@ -e 's/@''BITSIZEOF_PTRDIFF_T''@/$(BITSIZEOF_PTRDIFF_T)/g' \ @GL_GENERATE_STDINT_H_TRUE@ -e 's/@''PTRDIFF_T_SUFFIX''@/$(PTRDIFF_T_SUFFIX)/g' \ @GL_GENERATE_STDINT_H_TRUE@ -e 's/@''BITSIZEOF_SIG_ATOMIC_T''@/$(BITSIZEOF_SIG_ATOMIC_T)/g' \ @GL_GENERATE_STDINT_H_TRUE@ -e 's/@''HAVE_SIGNED_SIG_ATOMIC_T''@/$(HAVE_SIGNED_SIG_ATOMIC_T)/g' \ @GL_GENERATE_STDINT_H_TRUE@ -e 's/@''SIG_ATOMIC_T_SUFFIX''@/$(SIG_ATOMIC_T_SUFFIX)/g' \ @GL_GENERATE_STDINT_H_TRUE@ -e 's/@''BITSIZEOF_SIZE_T''@/$(BITSIZEOF_SIZE_T)/g' \ @GL_GENERATE_STDINT_H_TRUE@ -e 's/@''SIZE_T_SUFFIX''@/$(SIZE_T_SUFFIX)/g' \ @GL_GENERATE_STDINT_H_TRUE@ -e 's/@''BITSIZEOF_WCHAR_T''@/$(BITSIZEOF_WCHAR_T)/g' \ @GL_GENERATE_STDINT_H_TRUE@ -e 's/@''HAVE_SIGNED_WCHAR_T''@/$(HAVE_SIGNED_WCHAR_T)/g' \ @GL_GENERATE_STDINT_H_TRUE@ -e 's/@''WCHAR_T_SUFFIX''@/$(WCHAR_T_SUFFIX)/g' \ @GL_GENERATE_STDINT_H_TRUE@ -e 's/@''BITSIZEOF_WINT_T''@/$(BITSIZEOF_WINT_T)/g' \ @GL_GENERATE_STDINT_H_TRUE@ -e 's/@''HAVE_SIGNED_WINT_T''@/$(HAVE_SIGNED_WINT_T)/g' \ @GL_GENERATE_STDINT_H_TRUE@ -e 's/@''WINT_T_SUFFIX''@/$(WINT_T_SUFFIX)/g' \ @GL_GENERATE_STDINT_H_TRUE@ -e 's/@''GNULIB_OVERRIDES_WINT_T''@/$(GNULIB_OVERRIDES_WINT_T)/g' \ @GL_GENERATE_STDINT_H_TRUE@ < $(srcdir)/stdint.in.h; \ @GL_GENERATE_STDINT_H_TRUE@ } > $@-t && \ @GL_GENERATE_STDINT_H_TRUE@ mv $@-t $@ @GL_GENERATE_STDINT_H_FALSE@stdint.h: $(top_builddir)/config.status @GL_GENERATE_STDINT_H_FALSE@ rm -f $@ # We need the following in order to create when the system # doesn't have one that works with the given compiler. stdio.h: stdio.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(ARG_NONNULL_H) $(WARN_ON_USE_H) $(AM_V_GEN)rm -f $@-t $@ && \ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */' && \ sed -e 's|@''GUARD_PREFIX''@|GL|g' \ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \ -e 's|@''NEXT_STDIO_H''@|$(NEXT_STDIO_H)|g' \ -e 's/@''GNULIB_DPRINTF''@/$(GNULIB_DPRINTF)/g' \ -e 's/@''GNULIB_FCLOSE''@/$(GNULIB_FCLOSE)/g' \ -e 's/@''GNULIB_FDOPEN''@/$(GNULIB_FDOPEN)/g' \ -e 's/@''GNULIB_FFLUSH''@/$(GNULIB_FFLUSH)/g' \ -e 's/@''GNULIB_FGETC''@/$(GNULIB_FGETC)/g' \ -e 's/@''GNULIB_FGETS''@/$(GNULIB_FGETS)/g' \ -e 's/@''GNULIB_FOPEN''@/$(GNULIB_FOPEN)/g' \ -e 's/@''GNULIB_FPRINTF''@/$(GNULIB_FPRINTF)/g' \ -e 's/@''GNULIB_FPRINTF_POSIX''@/$(GNULIB_FPRINTF_POSIX)/g' \ -e 's/@''GNULIB_FPURGE''@/$(GNULIB_FPURGE)/g' \ -e 's/@''GNULIB_FPUTC''@/$(GNULIB_FPUTC)/g' \ -e 's/@''GNULIB_FPUTS''@/$(GNULIB_FPUTS)/g' \ -e 's/@''GNULIB_FREAD''@/$(GNULIB_FREAD)/g' \ -e 's/@''GNULIB_FREOPEN''@/$(GNULIB_FREOPEN)/g' \ -e 's/@''GNULIB_FSCANF''@/$(GNULIB_FSCANF)/g' \ -e 's/@''GNULIB_FSEEK''@/$(GNULIB_FSEEK)/g' \ -e 's/@''GNULIB_FSEEKO''@/$(GNULIB_FSEEKO)/g' \ -e 's/@''GNULIB_FTELL''@/$(GNULIB_FTELL)/g' \ -e 's/@''GNULIB_FTELLO''@/$(GNULIB_FTELLO)/g' \ -e 's/@''GNULIB_FWRITE''@/$(GNULIB_FWRITE)/g' \ -e 's/@''GNULIB_GETC''@/$(GNULIB_GETC)/g' \ -e 's/@''GNULIB_GETCHAR''@/$(GNULIB_GETCHAR)/g' \ -e 's/@''GNULIB_GETDELIM''@/$(GNULIB_GETDELIM)/g' \ -e 's/@''GNULIB_GETLINE''@/$(GNULIB_GETLINE)/g' \ -e 's/@''GNULIB_OBSTACK_PRINTF''@/$(GNULIB_OBSTACK_PRINTF)/g' \ -e 's/@''GNULIB_OBSTACK_PRINTF_POSIX''@/$(GNULIB_OBSTACK_PRINTF_POSIX)/g' \ -e 's/@''GNULIB_PCLOSE''@/$(GNULIB_PCLOSE)/g' \ -e 's/@''GNULIB_PERROR''@/$(GNULIB_PERROR)/g' \ -e 's/@''GNULIB_POPEN''@/$(GNULIB_POPEN)/g' \ -e 's/@''GNULIB_PRINTF''@/$(GNULIB_PRINTF)/g' \ -e 's/@''GNULIB_PRINTF_POSIX''@/$(GNULIB_PRINTF_POSIX)/g' \ -e 's/@''GNULIB_PUTC''@/$(GNULIB_PUTC)/g' \ -e 's/@''GNULIB_PUTCHAR''@/$(GNULIB_PUTCHAR)/g' \ -e 's/@''GNULIB_PUTS''@/$(GNULIB_PUTS)/g' \ -e 's/@''GNULIB_REMOVE''@/$(GNULIB_REMOVE)/g' \ -e 's/@''GNULIB_RENAME''@/$(GNULIB_RENAME)/g' \ -e 's/@''GNULIB_RENAMEAT''@/$(GNULIB_RENAMEAT)/g' \ -e 's/@''GNULIB_SCANF''@/$(GNULIB_SCANF)/g' \ -e 's/@''GNULIB_SNPRINTF''@/$(GNULIB_SNPRINTF)/g' \ -e 's/@''GNULIB_SPRINTF_POSIX''@/$(GNULIB_SPRINTF_POSIX)/g' \ -e 's/@''GNULIB_STDIO_H_NONBLOCKING''@/$(GNULIB_STDIO_H_NONBLOCKING)/g' \ -e 's/@''GNULIB_STDIO_H_SIGPIPE''@/$(GNULIB_STDIO_H_SIGPIPE)/g' \ -e 's/@''GNULIB_TMPFILE''@/$(GNULIB_TMPFILE)/g' \ -e 's/@''GNULIB_VASPRINTF''@/$(GNULIB_VASPRINTF)/g' \ -e 's/@''GNULIB_VDPRINTF''@/$(GNULIB_VDPRINTF)/g' \ -e 's/@''GNULIB_VFPRINTF''@/$(GNULIB_VFPRINTF)/g' \ -e 's/@''GNULIB_VFPRINTF_POSIX''@/$(GNULIB_VFPRINTF_POSIX)/g' \ -e 's/@''GNULIB_VFSCANF''@/$(GNULIB_VFSCANF)/g' \ -e 's/@''GNULIB_VSCANF''@/$(GNULIB_VSCANF)/g' \ -e 's/@''GNULIB_VPRINTF''@/$(GNULIB_VPRINTF)/g' \ -e 's/@''GNULIB_VPRINTF_POSIX''@/$(GNULIB_VPRINTF_POSIX)/g' \ -e 's/@''GNULIB_VSNPRINTF''@/$(GNULIB_VSNPRINTF)/g' \ -e 's/@''GNULIB_VSPRINTF_POSIX''@/$(GNULIB_VSPRINTF_POSIX)/g' \ < $(srcdir)/stdio.in.h | \ sed -e 's|@''HAVE_DECL_FPURGE''@|$(HAVE_DECL_FPURGE)|g' \ -e 's|@''HAVE_DECL_FSEEKO''@|$(HAVE_DECL_FSEEKO)|g' \ -e 's|@''HAVE_DECL_FTELLO''@|$(HAVE_DECL_FTELLO)|g' \ -e 's|@''HAVE_DECL_GETDELIM''@|$(HAVE_DECL_GETDELIM)|g' \ -e 's|@''HAVE_DECL_GETLINE''@|$(HAVE_DECL_GETLINE)|g' \ -e 's|@''HAVE_DECL_OBSTACK_PRINTF''@|$(HAVE_DECL_OBSTACK_PRINTF)|g' \ -e 's|@''HAVE_DECL_SNPRINTF''@|$(HAVE_DECL_SNPRINTF)|g' \ -e 's|@''HAVE_DECL_VSNPRINTF''@|$(HAVE_DECL_VSNPRINTF)|g' \ -e 's|@''HAVE_DPRINTF''@|$(HAVE_DPRINTF)|g' \ -e 's|@''HAVE_FSEEKO''@|$(HAVE_FSEEKO)|g' \ -e 's|@''HAVE_FTELLO''@|$(HAVE_FTELLO)|g' \ -e 's|@''HAVE_PCLOSE''@|$(HAVE_PCLOSE)|g' \ -e 's|@''HAVE_POPEN''@|$(HAVE_POPEN)|g' \ -e 's|@''HAVE_RENAMEAT''@|$(HAVE_RENAMEAT)|g' \ -e 's|@''HAVE_VASPRINTF''@|$(HAVE_VASPRINTF)|g' \ -e 's|@''HAVE_VDPRINTF''@|$(HAVE_VDPRINTF)|g' \ -e 's|@''REPLACE_DPRINTF''@|$(REPLACE_DPRINTF)|g' \ -e 's|@''REPLACE_FCLOSE''@|$(REPLACE_FCLOSE)|g' \ -e 's|@''REPLACE_FDOPEN''@|$(REPLACE_FDOPEN)|g' \ -e 's|@''REPLACE_FFLUSH''@|$(REPLACE_FFLUSH)|g' \ -e 's|@''REPLACE_FOPEN''@|$(REPLACE_FOPEN)|g' \ -e 's|@''REPLACE_FPRINTF''@|$(REPLACE_FPRINTF)|g' \ -e 's|@''REPLACE_FPURGE''@|$(REPLACE_FPURGE)|g' \ -e 's|@''REPLACE_FREOPEN''@|$(REPLACE_FREOPEN)|g' \ -e 's|@''REPLACE_FSEEK''@|$(REPLACE_FSEEK)|g' \ -e 's|@''REPLACE_FSEEKO''@|$(REPLACE_FSEEKO)|g' \ -e 's|@''REPLACE_FTELL''@|$(REPLACE_FTELL)|g' \ -e 's|@''REPLACE_FTELLO''@|$(REPLACE_FTELLO)|g' \ -e 's|@''REPLACE_GETDELIM''@|$(REPLACE_GETDELIM)|g' \ -e 's|@''REPLACE_GETLINE''@|$(REPLACE_GETLINE)|g' \ -e 's|@''REPLACE_OBSTACK_PRINTF''@|$(REPLACE_OBSTACK_PRINTF)|g' \ -e 's|@''REPLACE_PERROR''@|$(REPLACE_PERROR)|g' \ -e 's|@''REPLACE_POPEN''@|$(REPLACE_POPEN)|g' \ -e 's|@''REPLACE_PRINTF''@|$(REPLACE_PRINTF)|g' \ -e 's|@''REPLACE_REMOVE''@|$(REPLACE_REMOVE)|g' \ -e 's|@''REPLACE_RENAME''@|$(REPLACE_RENAME)|g' \ -e 's|@''REPLACE_RENAMEAT''@|$(REPLACE_RENAMEAT)|g' \ -e 's|@''REPLACE_SNPRINTF''@|$(REPLACE_SNPRINTF)|g' \ -e 's|@''REPLACE_SPRINTF''@|$(REPLACE_SPRINTF)|g' \ -e 's|@''REPLACE_STDIO_READ_FUNCS''@|$(REPLACE_STDIO_READ_FUNCS)|g' \ -e 's|@''REPLACE_STDIO_WRITE_FUNCS''@|$(REPLACE_STDIO_WRITE_FUNCS)|g' \ -e 's|@''REPLACE_TMPFILE''@|$(REPLACE_TMPFILE)|g' \ -e 's|@''REPLACE_VASPRINTF''@|$(REPLACE_VASPRINTF)|g' \ -e 's|@''REPLACE_VDPRINTF''@|$(REPLACE_VDPRINTF)|g' \ -e 's|@''REPLACE_VFPRINTF''@|$(REPLACE_VFPRINTF)|g' \ -e 's|@''REPLACE_VPRINTF''@|$(REPLACE_VPRINTF)|g' \ -e 's|@''REPLACE_VSNPRINTF''@|$(REPLACE_VSNPRINTF)|g' \ -e 's|@''REPLACE_VSPRINTF''@|$(REPLACE_VSPRINTF)|g' \ -e 's|@''ASM_SYMBOL_PREFIX''@|$(ASM_SYMBOL_PREFIX)|g' \ -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \ -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \ -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)'; \ } > $@-t && \ mv $@-t $@ # We need the following in order to create when the system # doesn't have one that works with the given compiler. stdlib.h: stdlib.in.h $(top_builddir)/config.status $(CXXDEFS_H) \ $(_NORETURN_H) $(ARG_NONNULL_H) $(WARN_ON_USE_H) $(AM_V_GEN)rm -f $@-t $@ && \ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */' && \ sed -e 's|@''GUARD_PREFIX''@|GL|g' \ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \ -e 's|@''NEXT_STDLIB_H''@|$(NEXT_STDLIB_H)|g' \ -e 's/@''GNULIB__EXIT''@/$(GNULIB__EXIT)/g' \ -e 's/@''GNULIB_ATOLL''@/$(GNULIB_ATOLL)/g' \ -e 's/@''GNULIB_CALLOC_POSIX''@/$(GNULIB_CALLOC_POSIX)/g' \ -e 's/@''GNULIB_CANONICALIZE_FILE_NAME''@/$(GNULIB_CANONICALIZE_FILE_NAME)/g' \ -e 's/@''GNULIB_GETLOADAVG''@/$(GNULIB_GETLOADAVG)/g' \ -e 's/@''GNULIB_GETSUBOPT''@/$(GNULIB_GETSUBOPT)/g' \ -e 's/@''GNULIB_GRANTPT''@/$(GNULIB_GRANTPT)/g' \ -e 's/@''GNULIB_MALLOC_POSIX''@/$(GNULIB_MALLOC_POSIX)/g' \ -e 's/@''GNULIB_MBTOWC''@/$(GNULIB_MBTOWC)/g' \ -e 's/@''GNULIB_MKDTEMP''@/$(GNULIB_MKDTEMP)/g' \ -e 's/@''GNULIB_MKOSTEMP''@/$(GNULIB_MKOSTEMP)/g' \ -e 's/@''GNULIB_MKOSTEMPS''@/$(GNULIB_MKOSTEMPS)/g' \ -e 's/@''GNULIB_MKSTEMP''@/$(GNULIB_MKSTEMP)/g' \ -e 's/@''GNULIB_MKSTEMPS''@/$(GNULIB_MKSTEMPS)/g' \ -e 's/@''GNULIB_POSIX_OPENPT''@/$(GNULIB_POSIX_OPENPT)/g' \ -e 's/@''GNULIB_PTSNAME''@/$(GNULIB_PTSNAME)/g' \ -e 's/@''GNULIB_PTSNAME_R''@/$(GNULIB_PTSNAME_R)/g' \ -e 's/@''GNULIB_PUTENV''@/$(GNULIB_PUTENV)/g' \ -e 's/@''GNULIB_QSORT_R''@/$(GNULIB_QSORT_R)/g' \ -e 's/@''GNULIB_RANDOM''@/$(GNULIB_RANDOM)/g' \ -e 's/@''GNULIB_RANDOM_R''@/$(GNULIB_RANDOM_R)/g' \ -e 's/@''GNULIB_REALLOC_POSIX''@/$(GNULIB_REALLOC_POSIX)/g' \ -e 's/@''GNULIB_REALLOCARRAY''@/$(GNULIB_REALLOCARRAY)/g' \ -e 's/@''GNULIB_REALPATH''@/$(GNULIB_REALPATH)/g' \ -e 's/@''GNULIB_RPMATCH''@/$(GNULIB_RPMATCH)/g' \ -e 's/@''GNULIB_SECURE_GETENV''@/$(GNULIB_SECURE_GETENV)/g' \ -e 's/@''GNULIB_SETENV''@/$(GNULIB_SETENV)/g' \ -e 's/@''GNULIB_STRTOD''@/$(GNULIB_STRTOD)/g' \ -e 's/@''GNULIB_STRTOLD''@/$(GNULIB_STRTOLD)/g' \ -e 's/@''GNULIB_STRTOLL''@/$(GNULIB_STRTOLL)/g' \ -e 's/@''GNULIB_STRTOULL''@/$(GNULIB_STRTOULL)/g' \ -e 's/@''GNULIB_SYSTEM_POSIX''@/$(GNULIB_SYSTEM_POSIX)/g' \ -e 's/@''GNULIB_UNLOCKPT''@/$(GNULIB_UNLOCKPT)/g' \ -e 's/@''GNULIB_UNSETENV''@/$(GNULIB_UNSETENV)/g' \ -e 's/@''GNULIB_WCTOMB''@/$(GNULIB_WCTOMB)/g' \ < $(srcdir)/stdlib.in.h | \ sed -e 's|@''HAVE__EXIT''@|$(HAVE__EXIT)|g' \ -e 's|@''HAVE_ATOLL''@|$(HAVE_ATOLL)|g' \ -e 's|@''HAVE_CANONICALIZE_FILE_NAME''@|$(HAVE_CANONICALIZE_FILE_NAME)|g' \ -e 's|@''HAVE_DECL_GETLOADAVG''@|$(HAVE_DECL_GETLOADAVG)|g' \ -e 's|@''HAVE_GETSUBOPT''@|$(HAVE_GETSUBOPT)|g' \ -e 's|@''HAVE_GRANTPT''@|$(HAVE_GRANTPT)|g' \ -e 's|@''HAVE_INITSTATE''@|$(HAVE_INITSTATE)|g' \ -e 's|@''HAVE_DECL_INITSTATE''@|$(HAVE_DECL_INITSTATE)|g' \ -e 's|@''HAVE_MBTOWC''@|$(HAVE_MBTOWC)|g' \ -e 's|@''HAVE_MKDTEMP''@|$(HAVE_MKDTEMP)|g' \ -e 's|@''HAVE_MKOSTEMP''@|$(HAVE_MKOSTEMP)|g' \ -e 's|@''HAVE_MKOSTEMPS''@|$(HAVE_MKOSTEMPS)|g' \ -e 's|@''HAVE_MKSTEMP''@|$(HAVE_MKSTEMP)|g' \ -e 's|@''HAVE_MKSTEMPS''@|$(HAVE_MKSTEMPS)|g' \ -e 's|@''HAVE_POSIX_OPENPT''@|$(HAVE_POSIX_OPENPT)|g' \ -e 's|@''HAVE_PTSNAME''@|$(HAVE_PTSNAME)|g' \ -e 's|@''HAVE_PTSNAME_R''@|$(HAVE_PTSNAME_R)|g' \ -e 's|@''HAVE_QSORT_R''@|$(HAVE_QSORT_R)|g' \ -e 's|@''HAVE_RANDOM''@|$(HAVE_RANDOM)|g' \ -e 's|@''HAVE_RANDOM_H''@|$(HAVE_RANDOM_H)|g' \ -e 's|@''HAVE_RANDOM_R''@|$(HAVE_RANDOM_R)|g' \ -e 's|@''HAVE_REALLOCARRAY''@|$(HAVE_REALLOCARRAY)|g' \ -e 's|@''HAVE_REALPATH''@|$(HAVE_REALPATH)|g' \ -e 's|@''HAVE_RPMATCH''@|$(HAVE_RPMATCH)|g' \ -e 's|@''HAVE_SECURE_GETENV''@|$(HAVE_SECURE_GETENV)|g' \ -e 's|@''HAVE_DECL_SETENV''@|$(HAVE_DECL_SETENV)|g' \ -e 's|@''HAVE_SETSTATE''@|$(HAVE_SETSTATE)|g' \ -e 's|@''HAVE_DECL_SETSTATE''@|$(HAVE_DECL_SETSTATE)|g' \ -e 's|@''HAVE_STRTOD''@|$(HAVE_STRTOD)|g' \ -e 's|@''HAVE_STRTOLD''@|$(HAVE_STRTOLD)|g' \ -e 's|@''HAVE_STRTOLL''@|$(HAVE_STRTOLL)|g' \ -e 's|@''HAVE_STRTOULL''@|$(HAVE_STRTOULL)|g' \ -e 's|@''HAVE_STRUCT_RANDOM_DATA''@|$(HAVE_STRUCT_RANDOM_DATA)|g' \ -e 's|@''HAVE_SYS_LOADAVG_H''@|$(HAVE_SYS_LOADAVG_H)|g' \ -e 's|@''HAVE_UNLOCKPT''@|$(HAVE_UNLOCKPT)|g' \ -e 's|@''HAVE_DECL_UNSETENV''@|$(HAVE_DECL_UNSETENV)|g' \ -e 's|@''REPLACE_CALLOC''@|$(REPLACE_CALLOC)|g' \ -e 's|@''REPLACE_CANONICALIZE_FILE_NAME''@|$(REPLACE_CANONICALIZE_FILE_NAME)|g' \ -e 's|@''REPLACE_INITSTATE''@|$(REPLACE_INITSTATE)|g' \ -e 's|@''REPLACE_MALLOC''@|$(REPLACE_MALLOC)|g' \ -e 's|@''REPLACE_MBTOWC''@|$(REPLACE_MBTOWC)|g' \ -e 's|@''REPLACE_MKSTEMP''@|$(REPLACE_MKSTEMP)|g' \ -e 's|@''REPLACE_PTSNAME''@|$(REPLACE_PTSNAME)|g' \ -e 's|@''REPLACE_PTSNAME_R''@|$(REPLACE_PTSNAME_R)|g' \ -e 's|@''REPLACE_PUTENV''@|$(REPLACE_PUTENV)|g' \ -e 's|@''REPLACE_QSORT_R''@|$(REPLACE_QSORT_R)|g' \ -e 's|@''REPLACE_RANDOM''@|$(REPLACE_RANDOM)|g' \ -e 's|@''REPLACE_RANDOM_R''@|$(REPLACE_RANDOM_R)|g' \ -e 's|@''REPLACE_REALLOC''@|$(REPLACE_REALLOC)|g' \ -e 's|@''REPLACE_REALPATH''@|$(REPLACE_REALPATH)|g' \ -e 's|@''REPLACE_SETENV''@|$(REPLACE_SETENV)|g' \ -e 's|@''REPLACE_SETSTATE''@|$(REPLACE_SETSTATE)|g' \ -e 's|@''REPLACE_STRTOD''@|$(REPLACE_STRTOD)|g' \ -e 's|@''REPLACE_STRTOLD''@|$(REPLACE_STRTOLD)|g' \ -e 's|@''REPLACE_UNSETENV''@|$(REPLACE_UNSETENV)|g' \ -e 's|@''REPLACE_WCTOMB''@|$(REPLACE_WCTOMB)|g' \ -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \ -e '/definition of _Noreturn/r $(_NORETURN_H)' \ -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \ -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)'; \ } > $@-t && \ mv $@-t $@ # We need the following in order to create when the system # doesn't have one that works with the given compiler. string.h: string.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(ARG_NONNULL_H) $(WARN_ON_USE_H) $(AM_V_GEN)rm -f $@-t $@ && \ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */' && \ sed -e 's|@''GUARD_PREFIX''@|GL|g' \ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \ -e 's|@''NEXT_STRING_H''@|$(NEXT_STRING_H)|g' \ -e 's/@''GNULIB_EXPLICIT_BZERO''@/$(GNULIB_EXPLICIT_BZERO)/g' \ -e 's/@''GNULIB_FFSL''@/$(GNULIB_FFSL)/g' \ -e 's/@''GNULIB_FFSLL''@/$(GNULIB_FFSLL)/g' \ -e 's/@''GNULIB_MBSLEN''@/$(GNULIB_MBSLEN)/g' \ -e 's/@''GNULIB_MBSNLEN''@/$(GNULIB_MBSNLEN)/g' \ -e 's/@''GNULIB_MBSCHR''@/$(GNULIB_MBSCHR)/g' \ -e 's/@''GNULIB_MBSRCHR''@/$(GNULIB_MBSRCHR)/g' \ -e 's/@''GNULIB_MBSSTR''@/$(GNULIB_MBSSTR)/g' \ -e 's/@''GNULIB_MBSCASECMP''@/$(GNULIB_MBSCASECMP)/g' \ -e 's/@''GNULIB_MBSNCASECMP''@/$(GNULIB_MBSNCASECMP)/g' \ -e 's/@''GNULIB_MBSPCASECMP''@/$(GNULIB_MBSPCASECMP)/g' \ -e 's/@''GNULIB_MBSCASESTR''@/$(GNULIB_MBSCASESTR)/g' \ -e 's/@''GNULIB_MBSCSPN''@/$(GNULIB_MBSCSPN)/g' \ -e 's/@''GNULIB_MBSPBRK''@/$(GNULIB_MBSPBRK)/g' \ -e 's/@''GNULIB_MBSSPN''@/$(GNULIB_MBSSPN)/g' \ -e 's/@''GNULIB_MBSSEP''@/$(GNULIB_MBSSEP)/g' \ -e 's/@''GNULIB_MBSTOK_R''@/$(GNULIB_MBSTOK_R)/g' \ -e 's/@''GNULIB_MEMCHR''@/$(GNULIB_MEMCHR)/g' \ -e 's/@''GNULIB_MEMMEM''@/$(GNULIB_MEMMEM)/g' \ -e 's/@''GNULIB_MEMPCPY''@/$(GNULIB_MEMPCPY)/g' \ -e 's/@''GNULIB_MEMRCHR''@/$(GNULIB_MEMRCHR)/g' \ -e 's/@''GNULIB_RAWMEMCHR''@/$(GNULIB_RAWMEMCHR)/g' \ -e 's/@''GNULIB_STPCPY''@/$(GNULIB_STPCPY)/g' \ -e 's/@''GNULIB_STPNCPY''@/$(GNULIB_STPNCPY)/g' \ -e 's/@''GNULIB_STRCHRNUL''@/$(GNULIB_STRCHRNUL)/g' \ -e 's/@''GNULIB_STRDUP''@/$(GNULIB_STRDUP)/g' \ -e 's/@''GNULIB_STRNCAT''@/$(GNULIB_STRNCAT)/g' \ -e 's/@''GNULIB_STRNDUP''@/$(GNULIB_STRNDUP)/g' \ -e 's/@''GNULIB_STRNLEN''@/$(GNULIB_STRNLEN)/g' \ -e 's/@''GNULIB_STRPBRK''@/$(GNULIB_STRPBRK)/g' \ -e 's/@''GNULIB_STRSEP''@/$(GNULIB_STRSEP)/g' \ -e 's/@''GNULIB_STRSTR''@/$(GNULIB_STRSTR)/g' \ -e 's/@''GNULIB_STRCASESTR''@/$(GNULIB_STRCASESTR)/g' \ -e 's/@''GNULIB_STRTOK_R''@/$(GNULIB_STRTOK_R)/g' \ -e 's/@''GNULIB_STRERROR''@/$(GNULIB_STRERROR)/g' \ -e 's/@''GNULIB_STRERROR_R''@/$(GNULIB_STRERROR_R)/g' \ -e 's/@''GNULIB_STRSIGNAL''@/$(GNULIB_STRSIGNAL)/g' \ -e 's/@''GNULIB_STRVERSCMP''@/$(GNULIB_STRVERSCMP)/g' \ < $(srcdir)/string.in.h | \ sed -e 's|@''HAVE_EXPLICIT_BZERO''@|$(HAVE_EXPLICIT_BZERO)|g' \ -e 's|@''HAVE_FFSL''@|$(HAVE_FFSL)|g' \ -e 's|@''HAVE_FFSLL''@|$(HAVE_FFSLL)|g' \ -e 's|@''HAVE_MBSLEN''@|$(HAVE_MBSLEN)|g' \ -e 's|@''HAVE_DECL_MEMMEM''@|$(HAVE_DECL_MEMMEM)|g' \ -e 's|@''HAVE_MEMPCPY''@|$(HAVE_MEMPCPY)|g' \ -e 's|@''HAVE_DECL_MEMRCHR''@|$(HAVE_DECL_MEMRCHR)|g' \ -e 's|@''HAVE_RAWMEMCHR''@|$(HAVE_RAWMEMCHR)|g' \ -e 's|@''HAVE_STPCPY''@|$(HAVE_STPCPY)|g' \ -e 's|@''HAVE_STPNCPY''@|$(HAVE_STPNCPY)|g' \ -e 's|@''HAVE_STRCHRNUL''@|$(HAVE_STRCHRNUL)|g' \ -e 's|@''HAVE_DECL_STRDUP''@|$(HAVE_DECL_STRDUP)|g' \ -e 's|@''HAVE_DECL_STRNDUP''@|$(HAVE_DECL_STRNDUP)|g' \ -e 's|@''HAVE_DECL_STRNLEN''@|$(HAVE_DECL_STRNLEN)|g' \ -e 's|@''HAVE_STRPBRK''@|$(HAVE_STRPBRK)|g' \ -e 's|@''HAVE_STRSEP''@|$(HAVE_STRSEP)|g' \ -e 's|@''HAVE_STRCASESTR''@|$(HAVE_STRCASESTR)|g' \ -e 's|@''HAVE_DECL_STRTOK_R''@|$(HAVE_DECL_STRTOK_R)|g' \ -e 's|@''HAVE_DECL_STRERROR_R''@|$(HAVE_DECL_STRERROR_R)|g' \ -e 's|@''HAVE_DECL_STRSIGNAL''@|$(HAVE_DECL_STRSIGNAL)|g' \ -e 's|@''HAVE_STRVERSCMP''@|$(HAVE_STRVERSCMP)|g' \ -e 's|@''REPLACE_MEMCHR''@|$(REPLACE_MEMCHR)|g' \ -e 's|@''REPLACE_MEMMEM''@|$(REPLACE_MEMMEM)|g' \ -e 's|@''REPLACE_STPNCPY''@|$(REPLACE_STPNCPY)|g' \ -e 's|@''REPLACE_STRCHRNUL''@|$(REPLACE_STRCHRNUL)|g' \ -e 's|@''REPLACE_STRDUP''@|$(REPLACE_STRDUP)|g' \ -e 's|@''REPLACE_STRNCAT''@|$(REPLACE_STRNCAT)|g' \ -e 's|@''REPLACE_STRNDUP''@|$(REPLACE_STRNDUP)|g' \ -e 's|@''REPLACE_STRNLEN''@|$(REPLACE_STRNLEN)|g' \ -e 's|@''REPLACE_STRSTR''@|$(REPLACE_STRSTR)|g' \ -e 's|@''REPLACE_STRCASESTR''@|$(REPLACE_STRCASESTR)|g' \ -e 's|@''REPLACE_STRTOK_R''@|$(REPLACE_STRTOK_R)|g' \ -e 's|@''REPLACE_STRERROR''@|$(REPLACE_STRERROR)|g' \ -e 's|@''REPLACE_STRERROR_R''@|$(REPLACE_STRERROR_R)|g' \ -e 's|@''REPLACE_STRSIGNAL''@|$(REPLACE_STRSIGNAL)|g' \ -e 's|@''UNDEFINE_STRTOK_R''@|$(UNDEFINE_STRTOK_R)|g' \ -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \ -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \ -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)'; \ < $(srcdir)/string.in.h; \ } > $@-t && \ mv $@-t $@ # We need the following in order to create when the system # doesn't have one that works with the given compiler. strings.h: strings.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(WARN_ON_USE_H) $(ARG_NONNULL_H) $(AM_V_GEN)rm -f $@-t $@ && \ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */' && \ sed -e 's|@''GUARD_PREFIX''@|GL|g' \ -e 's|@''HAVE_STRINGS_H''@|$(HAVE_STRINGS_H)|g' \ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \ -e 's|@''NEXT_STRINGS_H''@|$(NEXT_STRINGS_H)|g' \ -e 's/@''GNULIB_FFS''@/$(GNULIB_FFS)/g' \ -e 's|@''HAVE_FFS''@|$(HAVE_FFS)|g' \ -e 's|@''HAVE_STRCASECMP''@|$(HAVE_STRCASECMP)|g' \ -e 's|@''HAVE_DECL_STRNCASECMP''@|$(HAVE_DECL_STRNCASECMP)|g' \ -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \ -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \ -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \ < $(srcdir)/strings.in.h; \ } > $@-t && \ mv $@-t $@ # We need the following in order to create when the system # doesn't have one. sys/random.h: sys_random.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(ARG_NONNULL_H) $(WARN_ON_USE_H) $(AM_V_at)$(MKDIR_P) sys $(AM_V_GEN)rm -f $@-t $@ && \ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \ sed -e 's|@''GUARD_PREFIX''@|GL|g' \ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \ -e 's|@''NEXT_SYS_RANDOM_H''@|$(NEXT_SYS_RANDOM_H)|g' \ -e 's|@''HAVE_SYS_RANDOM_H''@|$(HAVE_SYS_RANDOM_H)|g' \ -e 's/@''GNULIB_GETRANDOM''@/$(GNULIB_GETRANDOM)/g' \ -e 's/@''HAVE_GETRANDOM''@/$(HAVE_GETRANDOM)/g' \ -e 's/@''REPLACE_GETRANDOM''@/$(REPLACE_GETRANDOM)/g' \ -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \ -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \ -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \ < $(srcdir)/sys_random.in.h; \ } > $@-t && \ mv -f $@-t $@ # We need the following in order to create when the system # doesn't have one that works with the given compiler. sys/select.h: sys_select.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(WARN_ON_USE_H) $(AM_V_at)$(MKDIR_P) sys $(AM_V_GEN)rm -f $@-t $@ && \ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \ sed -e 's|@''GUARD_PREFIX''@|GL|g' \ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \ -e 's|@''NEXT_SYS_SELECT_H''@|$(NEXT_SYS_SELECT_H)|g' \ -e 's|@''HAVE_SYS_SELECT_H''@|$(HAVE_SYS_SELECT_H)|g' \ -e 's/@''GNULIB_PSELECT''@/$(GNULIB_PSELECT)/g' \ -e 's/@''GNULIB_SELECT''@/$(GNULIB_SELECT)/g' \ -e 's|@''HAVE_WINSOCK2_H''@|$(HAVE_WINSOCK2_H)|g' \ -e 's|@''HAVE_PSELECT''@|$(HAVE_PSELECT)|g' \ -e 's|@''REPLACE_PSELECT''@|$(REPLACE_PSELECT)|g' \ -e 's|@''REPLACE_SELECT''@|$(REPLACE_SELECT)|g' \ -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \ -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \ < $(srcdir)/sys_select.in.h; \ } > $@-t && \ mv $@-t $@ # We need the following in order to create when the system # doesn't have one that works with the given compiler. sys/socket.h: sys_socket.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(WARN_ON_USE_H) $(ARG_NONNULL_H) $(AM_V_at)$(MKDIR_P) sys $(AM_V_GEN)rm -f $@-t $@ && \ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \ sed -e 's|@''GUARD_PREFIX''@|GL|g' \ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \ -e 's|@''NEXT_SYS_SOCKET_H''@|$(NEXT_SYS_SOCKET_H)|g' \ -e 's|@''HAVE_SYS_SOCKET_H''@|$(HAVE_SYS_SOCKET_H)|g' \ -e 's/@''GNULIB_CLOSE''@/$(GNULIB_CLOSE)/g' \ -e 's/@''GNULIB_SOCKET''@/$(GNULIB_SOCKET)/g' \ -e 's/@''GNULIB_CONNECT''@/$(GNULIB_CONNECT)/g' \ -e 's/@''GNULIB_ACCEPT''@/$(GNULIB_ACCEPT)/g' \ -e 's/@''GNULIB_BIND''@/$(GNULIB_BIND)/g' \ -e 's/@''GNULIB_GETPEERNAME''@/$(GNULIB_GETPEERNAME)/g' \ -e 's/@''GNULIB_GETSOCKNAME''@/$(GNULIB_GETSOCKNAME)/g' \ -e 's/@''GNULIB_GETSOCKOPT''@/$(GNULIB_GETSOCKOPT)/g' \ -e 's/@''GNULIB_LISTEN''@/$(GNULIB_LISTEN)/g' \ -e 's/@''GNULIB_RECV''@/$(GNULIB_RECV)/g' \ -e 's/@''GNULIB_SEND''@/$(GNULIB_SEND)/g' \ -e 's/@''GNULIB_RECVFROM''@/$(GNULIB_RECVFROM)/g' \ -e 's/@''GNULIB_SENDTO''@/$(GNULIB_SENDTO)/g' \ -e 's/@''GNULIB_SETSOCKOPT''@/$(GNULIB_SETSOCKOPT)/g' \ -e 's/@''GNULIB_SHUTDOWN''@/$(GNULIB_SHUTDOWN)/g' \ -e 's/@''GNULIB_ACCEPT4''@/$(GNULIB_ACCEPT4)/g' \ -e 's|@''HAVE_WINSOCK2_H''@|$(HAVE_WINSOCK2_H)|g' \ -e 's|@''HAVE_WS2TCPIP_H''@|$(HAVE_WS2TCPIP_H)|g' \ -e 's|@''HAVE_STRUCT_SOCKADDR_STORAGE''@|$(HAVE_STRUCT_SOCKADDR_STORAGE)|g' \ -e 's|@''HAVE_STRUCT_SOCKADDR_STORAGE_SS_FAMILY''@|$(HAVE_STRUCT_SOCKADDR_STORAGE_SS_FAMILY)|g' \ -e 's|@''HAVE_SA_FAMILY_T''@|$(HAVE_SA_FAMILY_T)|g' \ -e 's|@''HAVE_ACCEPT4''@|$(HAVE_ACCEPT4)|g' \ -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \ -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \ -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \ < $(srcdir)/sys_socket.in.h; \ } > $@-t && \ mv -f $@-t $@ # We need the following in order to create when the system # has one that is incomplete. sys/stat.h: sys_stat.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(ARG_NONNULL_H) $(WARN_ON_USE_H) $(AM_V_at)$(MKDIR_P) sys $(AM_V_GEN)rm -f $@-t $@ && \ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \ sed -e 's|@''GUARD_PREFIX''@|GL|g' \ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \ -e 's|@''NEXT_SYS_STAT_H''@|$(NEXT_SYS_STAT_H)|g' \ -e 's|@''WINDOWS_64_BIT_ST_SIZE''@|$(WINDOWS_64_BIT_ST_SIZE)|g' \ -e 's|@''WINDOWS_STAT_TIMESPEC''@|$(WINDOWS_STAT_TIMESPEC)|g' \ -e 's/@''GNULIB_FCHMODAT''@/$(GNULIB_FCHMODAT)/g' \ -e 's/@''GNULIB_FSTAT''@/$(GNULIB_FSTAT)/g' \ -e 's/@''GNULIB_FSTATAT''@/$(GNULIB_FSTATAT)/g' \ -e 's/@''GNULIB_FUTIMENS''@/$(GNULIB_FUTIMENS)/g' \ -e 's/@''GNULIB_GETUMASK''@/$(GNULIB_GETUMASK)/g' \ -e 's/@''GNULIB_LCHMOD''@/$(GNULIB_LCHMOD)/g' \ -e 's/@''GNULIB_LSTAT''@/$(GNULIB_LSTAT)/g' \ -e 's/@''GNULIB_MKDIRAT''@/$(GNULIB_MKDIRAT)/g' \ -e 's/@''GNULIB_MKFIFO''@/$(GNULIB_MKFIFO)/g' \ -e 's/@''GNULIB_MKFIFOAT''@/$(GNULIB_MKFIFOAT)/g' \ -e 's/@''GNULIB_MKNOD''@/$(GNULIB_MKNOD)/g' \ -e 's/@''GNULIB_MKNODAT''@/$(GNULIB_MKNODAT)/g' \ -e 's/@''GNULIB_STAT''@/$(GNULIB_STAT)/g' \ -e 's/@''GNULIB_UTIMENSAT''@/$(GNULIB_UTIMENSAT)/g' \ -e 's/@''GNULIB_OVERRIDES_STRUCT_STAT''@/$(GNULIB_OVERRIDES_STRUCT_STAT)/g' \ -e 's|@''HAVE_FCHMODAT''@|$(HAVE_FCHMODAT)|g' \ -e 's|@''HAVE_FSTATAT''@|$(HAVE_FSTATAT)|g' \ -e 's|@''HAVE_FUTIMENS''@|$(HAVE_FUTIMENS)|g' \ -e 's|@''HAVE_GETUMASK''@|$(HAVE_GETUMASK)|g' \ -e 's|@''HAVE_LCHMOD''@|$(HAVE_LCHMOD)|g' \ -e 's|@''HAVE_LSTAT''@|$(HAVE_LSTAT)|g' \ -e 's|@''HAVE_MKDIRAT''@|$(HAVE_MKDIRAT)|g' \ -e 's|@''HAVE_MKFIFO''@|$(HAVE_MKFIFO)|g' \ -e 's|@''HAVE_MKFIFOAT''@|$(HAVE_MKFIFOAT)|g' \ -e 's|@''HAVE_MKNOD''@|$(HAVE_MKNOD)|g' \ -e 's|@''HAVE_MKNODAT''@|$(HAVE_MKNODAT)|g' \ -e 's|@''HAVE_UTIMENSAT''@|$(HAVE_UTIMENSAT)|g' \ -e 's|@''REPLACE_FCHMODAT''@|$(REPLACE_FCHMODAT)|g' \ -e 's|@''REPLACE_FSTAT''@|$(REPLACE_FSTAT)|g' \ -e 's|@''REPLACE_FSTATAT''@|$(REPLACE_FSTATAT)|g' \ -e 's|@''REPLACE_FUTIMENS''@|$(REPLACE_FUTIMENS)|g' \ -e 's|@''REPLACE_LSTAT''@|$(REPLACE_LSTAT)|g' \ -e 's|@''REPLACE_MKDIR''@|$(REPLACE_MKDIR)|g' \ -e 's|@''REPLACE_MKFIFO''@|$(REPLACE_MKFIFO)|g' \ -e 's|@''REPLACE_MKNOD''@|$(REPLACE_MKNOD)|g' \ -e 's|@''REPLACE_STAT''@|$(REPLACE_STAT)|g' \ -e 's|@''REPLACE_UTIMENSAT''@|$(REPLACE_UTIMENSAT)|g' \ -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \ -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \ -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \ < $(srcdir)/sys_stat.in.h; \ } > $@-t && \ mv $@-t $@ # We need the following in order to create when the system # doesn't have one that works with the given compiler. sys/time.h: sys_time.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(ARG_NONNULL_H) $(WARN_ON_USE_H) $(AM_V_at)$(MKDIR_P) sys $(AM_V_GEN)rm -f $@-t $@ && \ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \ sed -e 's|@''GUARD_PREFIX''@|GL|g' \ -e 's/@''HAVE_SYS_TIME_H''@/$(HAVE_SYS_TIME_H)/g' \ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \ -e 's|@''NEXT_SYS_TIME_H''@|$(NEXT_SYS_TIME_H)|g' \ -e 's/@''GNULIB_GETTIMEOFDAY''@/$(GNULIB_GETTIMEOFDAY)/g' \ -e 's|@''HAVE_WINSOCK2_H''@|$(HAVE_WINSOCK2_H)|g' \ -e 's/@''HAVE_GETTIMEOFDAY''@/$(HAVE_GETTIMEOFDAY)/g' \ -e 's/@''HAVE_STRUCT_TIMEVAL''@/$(HAVE_STRUCT_TIMEVAL)/g' \ -e 's/@''REPLACE_GETTIMEOFDAY''@/$(REPLACE_GETTIMEOFDAY)/g' \ -e 's/@''REPLACE_STRUCT_TIMEVAL''@/$(REPLACE_STRUCT_TIMEVAL)/g' \ -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \ -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \ -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \ < $(srcdir)/sys_time.in.h; \ } > $@-t && \ mv $@-t $@ # We need the following in order to create when the system # doesn't have one that works with the given compiler. sys/types.h: sys_types.in.h $(top_builddir)/config.status $(AM_V_at)$(MKDIR_P) sys $(AM_V_GEN)rm -f $@-t $@ && \ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \ sed -e 's|@''GUARD_PREFIX''@|GL|g' \ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \ -e 's|@''NEXT_SYS_TYPES_H''@|$(NEXT_SYS_TYPES_H)|g' \ -e 's|@''WINDOWS_64_BIT_OFF_T''@|$(WINDOWS_64_BIT_OFF_T)|g' \ -e 's|@''WINDOWS_STAT_INODES''@|$(WINDOWS_STAT_INODES)|g' \ < $(srcdir)/sys_types.in.h; \ } > $@-t && \ mv $@-t $@ # We need the following in order to create when the system # doesn't have one that works with the given compiler. sys/uio.h: sys_uio.in.h $(top_builddir)/config.status $(AM_V_at)$(MKDIR_P) sys $(AM_V_GEN)rm -f $@-t $@ && \ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \ sed -e 's|@''GUARD_PREFIX''@|GL|g' \ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \ -e 's|@''NEXT_SYS_UIO_H''@|$(NEXT_SYS_UIO_H)|g' \ -e 's|@''HAVE_SYS_UIO_H''@|$(HAVE_SYS_UIO_H)|g' \ < $(srcdir)/sys_uio.in.h; \ } > $@-t && \ mv -f $@-t $@ # We need the following in order to create when the system # version does not have all declarations. termios.h: termios.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(WARN_ON_USE_H) $(AM_V_GEN)rm -f $@-t $@ && \ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \ sed -e 's|@''GUARD_PREFIX''@|GL|g' \ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \ -e 's|@''NEXT_TERMIOS_H''@|$(NEXT_TERMIOS_H)|g' \ -e 's/@''GNULIB_TCGETSID''@/$(GNULIB_TCGETSID)/g' \ -e 's|@''HAVE_DECL_TCGETSID''@|$(HAVE_DECL_TCGETSID)|g' \ -e 's|@''HAVE_TERMIOS_H''@|$(HAVE_TERMIOS_H)|g' \ -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \ -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \ < $(srcdir)/termios.in.h; \ } > $@-t && \ mv $@-t $@ # We need the following in order to create when the system # doesn't have one that works with the given compiler. time.h: time.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(ARG_NONNULL_H) $(WARN_ON_USE_H) $(AM_V_GEN)rm -f $@-t $@ && \ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */' && \ sed -e 's|@''GUARD_PREFIX''@|GL|g' \ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \ -e 's|@''NEXT_TIME_H''@|$(NEXT_TIME_H)|g' \ -e 's/@''GNULIB_CTIME''@/$(GNULIB_CTIME)/g' \ -e 's/@''GNULIB_LOCALTIME''@/$(GNULIB_LOCALTIME)/g' \ -e 's/@''GNULIB_MKTIME''@/$(GNULIB_MKTIME)/g' \ -e 's/@''GNULIB_NANOSLEEP''@/$(GNULIB_NANOSLEEP)/g' \ -e 's/@''GNULIB_STRFTIME''@/$(GNULIB_STRFTIME)/g' \ -e 's/@''GNULIB_STRPTIME''@/$(GNULIB_STRPTIME)/g' \ -e 's/@''GNULIB_TIMEGM''@/$(GNULIB_TIMEGM)/g' \ -e 's/@''GNULIB_TIME_R''@/$(GNULIB_TIME_R)/g' \ -e 's/@''GNULIB_TIME_RZ''@/$(GNULIB_TIME_RZ)/g' \ -e 's/@''GNULIB_TZSET''@/$(GNULIB_TZSET)/g' \ -e 's|@''HAVE_DECL_LOCALTIME_R''@|$(HAVE_DECL_LOCALTIME_R)|g' \ -e 's|@''HAVE_NANOSLEEP''@|$(HAVE_NANOSLEEP)|g' \ -e 's|@''HAVE_STRPTIME''@|$(HAVE_STRPTIME)|g' \ -e 's|@''HAVE_TIMEGM''@|$(HAVE_TIMEGM)|g' \ -e 's|@''HAVE_TIMEZONE_T''@|$(HAVE_TIMEZONE_T)|g' \ -e 's|@''HAVE_TZSET''@|$(HAVE_TZSET)|g' \ -e 's|@''REPLACE_CTIME''@|$(REPLACE_CTIME)|g' \ -e 's|@''REPLACE_GMTIME''@|$(REPLACE_GMTIME)|g' \ -e 's|@''REPLACE_LOCALTIME''@|$(REPLACE_LOCALTIME)|g' \ -e 's|@''REPLACE_LOCALTIME_R''@|$(REPLACE_LOCALTIME_R)|g' \ -e 's|@''REPLACE_MKTIME''@|$(REPLACE_MKTIME)|g' \ -e 's|@''REPLACE_NANOSLEEP''@|$(REPLACE_NANOSLEEP)|g' \ -e 's|@''REPLACE_STRFTIME''@|$(REPLACE_STRFTIME)|g' \ -e 's|@''REPLACE_TIMEGM''@|$(REPLACE_TIMEGM)|g' \ -e 's|@''REPLACE_TZSET''@|$(REPLACE_TZSET)|g' \ -e 's|@''PTHREAD_H_DEFINES_STRUCT_TIMESPEC''@|$(PTHREAD_H_DEFINES_STRUCT_TIMESPEC)|g' \ -e 's|@''SYS_TIME_H_DEFINES_STRUCT_TIMESPEC''@|$(SYS_TIME_H_DEFINES_STRUCT_TIMESPEC)|g' \ -e 's|@''TIME_H_DEFINES_STRUCT_TIMESPEC''@|$(TIME_H_DEFINES_STRUCT_TIMESPEC)|g' \ -e 's|@''UNISTD_H_DEFINES_STRUCT_TIMESPEC''@|$(UNISTD_H_DEFINES_STRUCT_TIMESPEC)|g' \ -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \ -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \ -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \ < $(srcdir)/time.in.h; \ } > $@-t && \ mv $@-t $@ unicase.h: unicase.in.h $(AM_V_GEN)rm -f $@-t $@ && \ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \ cat $(srcdir)/unicase.in.h; \ } > $@-t && \ mv -f $@-t $@ $(srcdir)/unicase/special-casing-table.h: $(srcdir)/unicase/special-casing-table.gperf $(V_GPERF)$(GPERF) -m 10 $(srcdir)/unicase/special-casing-table.gperf > $(srcdir)/unicase/special-casing-table.h-t && \ mv $(srcdir)/unicase/special-casing-table.h-t $(srcdir)/unicase/special-casing-table.h # Generate special-casing.h with a declaration that depends on the gperf version. unicase/special-casing.h: unicase/special-casing.in.h unicase/special-casing-table.h $(AM_V_at)$(MKDIR_P) unicase $(AM_V_GEN)rm -f $@-t $@ && \ declaration=`grep '^gl_unicase_special_lookup' $(srcdir)/unicase/special-casing-table.h | sed -e 's/register //g'` && \ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \ sed -e "/gl_unicase_special_lookup/s/gl_unicase_special_lookup.*/$${declaration};/" $(srcdir)/unicase/special-casing.in.h; \ } > $@-t && \ mv -f $@-t $@ unictype.h: unictype.in.h $(AM_V_GEN)rm -f $@-t $@ && \ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \ cat $(srcdir)/unictype.in.h; \ } > $@-t && \ mv -f $@-t $@ unigbrk.h: unigbrk.in.h $(AM_V_GEN)rm -f $@-t $@ && \ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \ cat $(srcdir)/unigbrk.in.h; \ } > $@-t && \ mv -f $@-t $@ unilbrk.h: unilbrk.in.h $(AM_V_GEN)rm -f $@-t $@ && \ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \ cat $(srcdir)/unilbrk.in.h; \ } > $@-t && \ mv -f $@-t $@ uninorm.h: uninorm.in.h $(AM_V_GEN)rm -f $@-t $@ && \ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \ cat $(srcdir)/uninorm.in.h; \ } > $@-t && \ mv -f $@-t $@ # We need the following in order to create an empty placeholder for # when the system doesn't have one. unistd.h: unistd.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(ARG_NONNULL_H) $(WARN_ON_USE_H) $(AM_V_GEN)rm -f $@-t $@ && \ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \ sed -e 's|@''GUARD_PREFIX''@|GL|g' \ -e 's|@''HAVE_UNISTD_H''@|$(HAVE_UNISTD_H)|g' \ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \ -e 's|@''NEXT_UNISTD_H''@|$(NEXT_UNISTD_H)|g' \ -e 's|@''WINDOWS_64_BIT_OFF_T''@|$(WINDOWS_64_BIT_OFF_T)|g' \ -e 's/@''GNULIB_ACCESS''@/$(GNULIB_ACCESS)/g' \ -e 's/@''GNULIB_CHDIR''@/$(GNULIB_CHDIR)/g' \ -e 's/@''GNULIB_CHOWN''@/$(GNULIB_CHOWN)/g' \ -e 's/@''GNULIB_CLOSE''@/$(GNULIB_CLOSE)/g' \ -e 's/@''GNULIB_COPY_FILE_RANGE''@/$(GNULIB_COPY_FILE_RANGE)/g' \ -e 's/@''GNULIB_DUP''@/$(GNULIB_DUP)/g' \ -e 's/@''GNULIB_DUP2''@/$(GNULIB_DUP2)/g' \ -e 's/@''GNULIB_DUP3''@/$(GNULIB_DUP3)/g' \ -e 's/@''GNULIB_ENVIRON''@/$(GNULIB_ENVIRON)/g' \ -e 's/@''GNULIB_EUIDACCESS''@/$(GNULIB_EUIDACCESS)/g' \ -e 's/@''GNULIB_FACCESSAT''@/$(GNULIB_FACCESSAT)/g' \ -e 's/@''GNULIB_FCHDIR''@/$(GNULIB_FCHDIR)/g' \ -e 's/@''GNULIB_FCHOWNAT''@/$(GNULIB_FCHOWNAT)/g' \ -e 's/@''GNULIB_FDATASYNC''@/$(GNULIB_FDATASYNC)/g' \ -e 's/@''GNULIB_FSYNC''@/$(GNULIB_FSYNC)/g' \ -e 's/@''GNULIB_FTRUNCATE''@/$(GNULIB_FTRUNCATE)/g' \ -e 's/@''GNULIB_GETCWD''@/$(GNULIB_GETCWD)/g' \ -e 's/@''GNULIB_GETDOMAINNAME''@/$(GNULIB_GETDOMAINNAME)/g' \ -e 's/@''GNULIB_GETDTABLESIZE''@/$(GNULIB_GETDTABLESIZE)/g' \ -e 's/@''GNULIB_GETENTROPY''@/$(GNULIB_GETENTROPY)/g' \ -e 's/@''GNULIB_GETGROUPS''@/$(GNULIB_GETGROUPS)/g' \ -e 's/@''GNULIB_GETHOSTNAME''@/$(GNULIB_GETHOSTNAME)/g' \ -e 's/@''GNULIB_GETLOGIN''@/$(GNULIB_GETLOGIN)/g' \ -e 's/@''GNULIB_GETLOGIN_R''@/$(GNULIB_GETLOGIN_R)/g' \ -e 's/@''GNULIB_GETOPT_POSIX''@/$(GNULIB_GETOPT_POSIX)/g' \ -e 's/@''GNULIB_GETPAGESIZE''@/$(GNULIB_GETPAGESIZE)/g' \ -e 's/@''GNULIB_GETPASS''@/$(GNULIB_GETPASS)/g' \ -e 's/@''GNULIB_GETUSERSHELL''@/$(GNULIB_GETUSERSHELL)/g' \ -e 's/@''GNULIB_GROUP_MEMBER''@/$(GNULIB_GROUP_MEMBER)/g' \ -e 's/@''GNULIB_ISATTY''@/$(GNULIB_ISATTY)/g' \ -e 's/@''GNULIB_LCHOWN''@/$(GNULIB_LCHOWN)/g' \ -e 's/@''GNULIB_LINK''@/$(GNULIB_LINK)/g' \ -e 's/@''GNULIB_LINKAT''@/$(GNULIB_LINKAT)/g' \ -e 's/@''GNULIB_LSEEK''@/$(GNULIB_LSEEK)/g' \ -e 's/@''GNULIB_PIPE''@/$(GNULIB_PIPE)/g' \ -e 's/@''GNULIB_PIPE2''@/$(GNULIB_PIPE2)/g' \ -e 's/@''GNULIB_PREAD''@/$(GNULIB_PREAD)/g' \ -e 's/@''GNULIB_PWRITE''@/$(GNULIB_PWRITE)/g' \ -e 's/@''GNULIB_READ''@/$(GNULIB_READ)/g' \ -e 's/@''GNULIB_READLINK''@/$(GNULIB_READLINK)/g' \ -e 's/@''GNULIB_READLINKAT''@/$(GNULIB_READLINKAT)/g' \ -e 's/@''GNULIB_RMDIR''@/$(GNULIB_RMDIR)/g' \ -e 's/@''GNULIB_SETHOSTNAME''@/$(GNULIB_SETHOSTNAME)/g' \ -e 's/@''GNULIB_SLEEP''@/$(GNULIB_SLEEP)/g' \ -e 's/@''GNULIB_SYMLINK''@/$(GNULIB_SYMLINK)/g' \ -e 's/@''GNULIB_SYMLINKAT''@/$(GNULIB_SYMLINKAT)/g' \ -e 's/@''GNULIB_TRUNCATE''@/$(GNULIB_TRUNCATE)/g' \ -e 's/@''GNULIB_TTYNAME_R''@/$(GNULIB_TTYNAME_R)/g' \ -e 's/@''GNULIB_UNISTD_H_GETOPT''@/0$(GNULIB_GL_UNISTD_H_GETOPT)/g' \ -e 's/@''GNULIB_UNISTD_H_NONBLOCKING''@/$(GNULIB_UNISTD_H_NONBLOCKING)/g' \ -e 's/@''GNULIB_UNISTD_H_SIGPIPE''@/$(GNULIB_UNISTD_H_SIGPIPE)/g' \ -e 's/@''GNULIB_UNLINK''@/$(GNULIB_UNLINK)/g' \ -e 's/@''GNULIB_UNLINKAT''@/$(GNULIB_UNLINKAT)/g' \ -e 's/@''GNULIB_USLEEP''@/$(GNULIB_USLEEP)/g' \ -e 's/@''GNULIB_WRITE''@/$(GNULIB_WRITE)/g' \ < $(srcdir)/unistd.in.h | \ sed -e 's|@''HAVE_CHOWN''@|$(HAVE_CHOWN)|g' \ -e 's|@''HAVE_COPY_FILE_RANGE''@|$(HAVE_COPY_FILE_RANGE)|g' \ -e 's|@''HAVE_DUP3''@|$(HAVE_DUP3)|g' \ -e 's|@''HAVE_EUIDACCESS''@|$(HAVE_EUIDACCESS)|g' \ -e 's|@''HAVE_FACCESSAT''@|$(HAVE_FACCESSAT)|g' \ -e 's|@''HAVE_FCHDIR''@|$(HAVE_FCHDIR)|g' \ -e 's|@''HAVE_FCHOWNAT''@|$(HAVE_FCHOWNAT)|g' \ -e 's|@''HAVE_FDATASYNC''@|$(HAVE_FDATASYNC)|g' \ -e 's|@''HAVE_FSYNC''@|$(HAVE_FSYNC)|g' \ -e 's|@''HAVE_FTRUNCATE''@|$(HAVE_FTRUNCATE)|g' \ -e 's|@''HAVE_GETDTABLESIZE''@|$(HAVE_GETDTABLESIZE)|g' \ -e 's|@''HAVE_GETENTROPY''@|$(HAVE_GETENTROPY)|g' \ -e 's|@''HAVE_GETGROUPS''@|$(HAVE_GETGROUPS)|g' \ -e 's|@''HAVE_GETHOSTNAME''@|$(HAVE_GETHOSTNAME)|g' \ -e 's|@''HAVE_GETPAGESIZE''@|$(HAVE_GETPAGESIZE)|g' \ -e 's|@''HAVE_GETPASS''@|$(HAVE_GETPASS)|g' \ -e 's|@''HAVE_GROUP_MEMBER''@|$(HAVE_GROUP_MEMBER)|g' \ -e 's|@''HAVE_LCHOWN''@|$(HAVE_LCHOWN)|g' \ -e 's|@''HAVE_LINK''@|$(HAVE_LINK)|g' \ -e 's|@''HAVE_LINKAT''@|$(HAVE_LINKAT)|g' \ -e 's|@''HAVE_PIPE''@|$(HAVE_PIPE)|g' \ -e 's|@''HAVE_PIPE2''@|$(HAVE_PIPE2)|g' \ -e 's|@''HAVE_PREAD''@|$(HAVE_PREAD)|g' \ -e 's|@''HAVE_PWRITE''@|$(HAVE_PWRITE)|g' \ -e 's|@''HAVE_READLINK''@|$(HAVE_READLINK)|g' \ -e 's|@''HAVE_READLINKAT''@|$(HAVE_READLINKAT)|g' \ -e 's|@''HAVE_SETHOSTNAME''@|$(HAVE_SETHOSTNAME)|g' \ -e 's|@''HAVE_SLEEP''@|$(HAVE_SLEEP)|g' \ -e 's|@''HAVE_SYMLINK''@|$(HAVE_SYMLINK)|g' \ -e 's|@''HAVE_SYMLINKAT''@|$(HAVE_SYMLINKAT)|g' \ -e 's|@''HAVE_UNLINKAT''@|$(HAVE_UNLINKAT)|g' \ -e 's|@''HAVE_USLEEP''@|$(HAVE_USLEEP)|g' \ -e 's|@''HAVE_DECL_ENVIRON''@|$(HAVE_DECL_ENVIRON)|g' \ -e 's|@''HAVE_DECL_FCHDIR''@|$(HAVE_DECL_FCHDIR)|g' \ -e 's|@''HAVE_DECL_FDATASYNC''@|$(HAVE_DECL_FDATASYNC)|g' \ -e 's|@''HAVE_DECL_GETDOMAINNAME''@|$(HAVE_DECL_GETDOMAINNAME)|g' \ -e 's|@''HAVE_DECL_GETLOGIN''@|$(HAVE_DECL_GETLOGIN)|g' \ -e 's|@''HAVE_DECL_GETLOGIN_R''@|$(HAVE_DECL_GETLOGIN_R)|g' \ -e 's|@''HAVE_DECL_GETPAGESIZE''@|$(HAVE_DECL_GETPAGESIZE)|g' \ -e 's|@''HAVE_DECL_GETUSERSHELL''@|$(HAVE_DECL_GETUSERSHELL)|g' \ -e 's|@''HAVE_DECL_SETHOSTNAME''@|$(HAVE_DECL_SETHOSTNAME)|g' \ -e 's|@''HAVE_DECL_TRUNCATE''@|$(HAVE_DECL_TRUNCATE)|g' \ -e 's|@''HAVE_DECL_TTYNAME_R''@|$(HAVE_DECL_TTYNAME_R)|g' \ -e 's|@''HAVE_OS_H''@|$(HAVE_OS_H)|g' \ -e 's|@''HAVE_SYS_PARAM_H''@|$(HAVE_SYS_PARAM_H)|g' \ | \ sed -e 's|@''REPLACE_ACCESS''@|$(REPLACE_ACCESS)|g' \ -e 's|@''REPLACE_CHOWN''@|$(REPLACE_CHOWN)|g' \ -e 's|@''REPLACE_CLOSE''@|$(REPLACE_CLOSE)|g' \ -e 's|@''REPLACE_DUP''@|$(REPLACE_DUP)|g' \ -e 's|@''REPLACE_DUP2''@|$(REPLACE_DUP2)|g' \ -e 's|@''REPLACE_FACCESSAT''@|$(REPLACE_FACCESSAT)|g' \ -e 's|@''REPLACE_FCHOWNAT''@|$(REPLACE_FCHOWNAT)|g' \ -e 's|@''REPLACE_FTRUNCATE''@|$(REPLACE_FTRUNCATE)|g' \ -e 's|@''REPLACE_GETCWD''@|$(REPLACE_GETCWD)|g' \ -e 's|@''REPLACE_GETDOMAINNAME''@|$(REPLACE_GETDOMAINNAME)|g' \ -e 's|@''REPLACE_GETDTABLESIZE''@|$(REPLACE_GETDTABLESIZE)|g' \ -e 's|@''REPLACE_GETLOGIN_R''@|$(REPLACE_GETLOGIN_R)|g' \ -e 's|@''REPLACE_GETGROUPS''@|$(REPLACE_GETGROUPS)|g' \ -e 's|@''REPLACE_GETPAGESIZE''@|$(REPLACE_GETPAGESIZE)|g' \ -e 's|@''REPLACE_GETPASS''@|$(REPLACE_GETPASS)|g' \ -e 's|@''REPLACE_ISATTY''@|$(REPLACE_ISATTY)|g' \ -e 's|@''REPLACE_LCHOWN''@|$(REPLACE_LCHOWN)|g' \ -e 's|@''REPLACE_LINK''@|$(REPLACE_LINK)|g' \ -e 's|@''REPLACE_LINKAT''@|$(REPLACE_LINKAT)|g' \ -e 's|@''REPLACE_LSEEK''@|$(REPLACE_LSEEK)|g' \ -e 's|@''REPLACE_PREAD''@|$(REPLACE_PREAD)|g' \ -e 's|@''REPLACE_PWRITE''@|$(REPLACE_PWRITE)|g' \ -e 's|@''REPLACE_READ''@|$(REPLACE_READ)|g' \ -e 's|@''REPLACE_READLINK''@|$(REPLACE_READLINK)|g' \ -e 's|@''REPLACE_READLINKAT''@|$(REPLACE_READLINKAT)|g' \ -e 's|@''REPLACE_RMDIR''@|$(REPLACE_RMDIR)|g' \ -e 's|@''REPLACE_SLEEP''@|$(REPLACE_SLEEP)|g' \ -e 's|@''REPLACE_SYMLINK''@|$(REPLACE_SYMLINK)|g' \ -e 's|@''REPLACE_SYMLINKAT''@|$(REPLACE_SYMLINKAT)|g' \ -e 's|@''REPLACE_TRUNCATE''@|$(REPLACE_TRUNCATE)|g' \ -e 's|@''REPLACE_TTYNAME_R''@|$(REPLACE_TTYNAME_R)|g' \ -e 's|@''REPLACE_UNLINK''@|$(REPLACE_UNLINK)|g' \ -e 's|@''REPLACE_UNLINKAT''@|$(REPLACE_UNLINKAT)|g' \ -e 's|@''REPLACE_USLEEP''@|$(REPLACE_USLEEP)|g' \ -e 's|@''REPLACE_WRITE''@|$(REPLACE_WRITE)|g' \ -e 's|@''UNISTD_H_HAVE_SYS_RANDOM_H''@|$(UNISTD_H_HAVE_SYS_RANDOM_H)|g' \ -e 's|@''UNISTD_H_HAVE_WINSOCK2_H''@|$(UNISTD_H_HAVE_WINSOCK2_H)|g' \ -e 's|@''UNISTD_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS''@|$(UNISTD_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS)|g' \ -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \ -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \ -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)'; \ } > $@-t && \ mv $@-t $@ unistr.h: unistr.in.h $(AM_V_GEN)rm -f $@-t $@ && \ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \ cat $(srcdir)/unistr.in.h; \ } > $@-t && \ mv -f $@-t $@ unitypes.h: unitypes.in.h $(AM_V_GEN)rm -f $@-t $@ && \ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \ cat $(srcdir)/unitypes.in.h; \ } > $@-t && \ mv -f $@-t $@ uniwbrk.h: uniwbrk.in.h $(AM_V_GEN)rm -f $@-t $@ && \ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \ cat $(srcdir)/uniwbrk.in.h; \ } > $@-t && \ mv -f $@-t $@ uniwidth.h: uniwidth.in.h $(AM_V_GEN)rm -f $@-t $@ && \ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \ cat $(srcdir)/uniwidth.in.h; \ } > $@-t && \ mv -f $@-t $@ # We need the following in order to create when the system # version does not work standalone. wchar.h: wchar.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(ARG_NONNULL_H) $(WARN_ON_USE_H) $(AM_V_GEN)rm -f $@-t $@ && \ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \ sed -e 's|@''GUARD_PREFIX''@|GL|g' \ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \ -e 's|@''HAVE_FEATURES_H''@|$(HAVE_FEATURES_H)|g' \ -e 's|@''NEXT_WCHAR_H''@|$(NEXT_WCHAR_H)|g' \ -e 's|@''HAVE_WCHAR_H''@|$(HAVE_WCHAR_H)|g' \ -e 's/@''HAVE_CRTDEFS_H''@/$(HAVE_CRTDEFS_H)/g' \ -e 's/@''GNULIB_OVERRIDES_WINT_T''@/$(GNULIB_OVERRIDES_WINT_T)/g' \ -e 's/@''GNULIB_BTOWC''@/$(GNULIB_BTOWC)/g' \ -e 's/@''GNULIB_WCTOB''@/$(GNULIB_WCTOB)/g' \ -e 's/@''GNULIB_MBSINIT''@/$(GNULIB_MBSINIT)/g' \ -e 's/@''GNULIB_MBRTOWC''@/$(GNULIB_MBRTOWC)/g' \ -e 's/@''GNULIB_MBRLEN''@/$(GNULIB_MBRLEN)/g' \ -e 's/@''GNULIB_MBSRTOWCS''@/$(GNULIB_MBSRTOWCS)/g' \ -e 's/@''GNULIB_MBSNRTOWCS''@/$(GNULIB_MBSNRTOWCS)/g' \ -e 's/@''GNULIB_WCRTOMB''@/$(GNULIB_WCRTOMB)/g' \ -e 's/@''GNULIB_WCSRTOMBS''@/$(GNULIB_WCSRTOMBS)/g' \ -e 's/@''GNULIB_WCSNRTOMBS''@/$(GNULIB_WCSNRTOMBS)/g' \ -e 's/@''GNULIB_WCWIDTH''@/$(GNULIB_WCWIDTH)/g' \ -e 's/@''GNULIB_WMEMCHR''@/$(GNULIB_WMEMCHR)/g' \ -e 's/@''GNULIB_WMEMCMP''@/$(GNULIB_WMEMCMP)/g' \ -e 's/@''GNULIB_WMEMCPY''@/$(GNULIB_WMEMCPY)/g' \ -e 's/@''GNULIB_WMEMMOVE''@/$(GNULIB_WMEMMOVE)/g' \ -e 's/@''GNULIB_WMEMPCPY''@/$(GNULIB_WMEMPCPY)/g' \ -e 's/@''GNULIB_WMEMSET''@/$(GNULIB_WMEMSET)/g' \ -e 's/@''GNULIB_WCSLEN''@/$(GNULIB_WCSLEN)/g' \ -e 's/@''GNULIB_WCSNLEN''@/$(GNULIB_WCSNLEN)/g' \ -e 's/@''GNULIB_WCSCPY''@/$(GNULIB_WCSCPY)/g' \ -e 's/@''GNULIB_WCPCPY''@/$(GNULIB_WCPCPY)/g' \ -e 's/@''GNULIB_WCSNCPY''@/$(GNULIB_WCSNCPY)/g' \ -e 's/@''GNULIB_WCPNCPY''@/$(GNULIB_WCPNCPY)/g' \ -e 's/@''GNULIB_WCSCAT''@/$(GNULIB_WCSCAT)/g' \ -e 's/@''GNULIB_WCSNCAT''@/$(GNULIB_WCSNCAT)/g' \ -e 's/@''GNULIB_WCSCMP''@/$(GNULIB_WCSCMP)/g' \ -e 's/@''GNULIB_WCSNCMP''@/$(GNULIB_WCSNCMP)/g' \ -e 's/@''GNULIB_WCSCASECMP''@/$(GNULIB_WCSCASECMP)/g' \ -e 's/@''GNULIB_WCSNCASECMP''@/$(GNULIB_WCSNCASECMP)/g' \ -e 's/@''GNULIB_WCSCOLL''@/$(GNULIB_WCSCOLL)/g' \ -e 's/@''GNULIB_WCSXFRM''@/$(GNULIB_WCSXFRM)/g' \ -e 's/@''GNULIB_WCSDUP''@/$(GNULIB_WCSDUP)/g' \ -e 's/@''GNULIB_WCSCHR''@/$(GNULIB_WCSCHR)/g' \ -e 's/@''GNULIB_WCSRCHR''@/$(GNULIB_WCSRCHR)/g' \ -e 's/@''GNULIB_WCSCSPN''@/$(GNULIB_WCSCSPN)/g' \ -e 's/@''GNULIB_WCSSPN''@/$(GNULIB_WCSSPN)/g' \ -e 's/@''GNULIB_WCSPBRK''@/$(GNULIB_WCSPBRK)/g' \ -e 's/@''GNULIB_WCSSTR''@/$(GNULIB_WCSSTR)/g' \ -e 's/@''GNULIB_WCSTOK''@/$(GNULIB_WCSTOK)/g' \ -e 's/@''GNULIB_WCSWIDTH''@/$(GNULIB_WCSWIDTH)/g' \ -e 's/@''GNULIB_WCSFTIME''@/$(GNULIB_WCSFTIME)/g' \ < $(srcdir)/wchar.in.h | \ sed -e 's|@''HAVE_WINT_T''@|$(HAVE_WINT_T)|g' \ -e 's|@''HAVE_BTOWC''@|$(HAVE_BTOWC)|g' \ -e 's|@''HAVE_MBSINIT''@|$(HAVE_MBSINIT)|g' \ -e 's|@''HAVE_MBRTOWC''@|$(HAVE_MBRTOWC)|g' \ -e 's|@''HAVE_MBRLEN''@|$(HAVE_MBRLEN)|g' \ -e 's|@''HAVE_MBSRTOWCS''@|$(HAVE_MBSRTOWCS)|g' \ -e 's|@''HAVE_MBSNRTOWCS''@|$(HAVE_MBSNRTOWCS)|g' \ -e 's|@''HAVE_WCRTOMB''@|$(HAVE_WCRTOMB)|g' \ -e 's|@''HAVE_WCSRTOMBS''@|$(HAVE_WCSRTOMBS)|g' \ -e 's|@''HAVE_WCSNRTOMBS''@|$(HAVE_WCSNRTOMBS)|g' \ -e 's|@''HAVE_WMEMCHR''@|$(HAVE_WMEMCHR)|g' \ -e 's|@''HAVE_WMEMCMP''@|$(HAVE_WMEMCMP)|g' \ -e 's|@''HAVE_WMEMCPY''@|$(HAVE_WMEMCPY)|g' \ -e 's|@''HAVE_WMEMMOVE''@|$(HAVE_WMEMMOVE)|g' \ -e 's|@''HAVE_WMEMPCPY''@|$(HAVE_WMEMPCPY)|g' \ -e 's|@''HAVE_WMEMSET''@|$(HAVE_WMEMSET)|g' \ -e 's|@''HAVE_WCSLEN''@|$(HAVE_WCSLEN)|g' \ -e 's|@''HAVE_WCSNLEN''@|$(HAVE_WCSNLEN)|g' \ -e 's|@''HAVE_WCSCPY''@|$(HAVE_WCSCPY)|g' \ -e 's|@''HAVE_WCPCPY''@|$(HAVE_WCPCPY)|g' \ -e 's|@''HAVE_WCSNCPY''@|$(HAVE_WCSNCPY)|g' \ -e 's|@''HAVE_WCPNCPY''@|$(HAVE_WCPNCPY)|g' \ -e 's|@''HAVE_WCSCAT''@|$(HAVE_WCSCAT)|g' \ -e 's|@''HAVE_WCSNCAT''@|$(HAVE_WCSNCAT)|g' \ -e 's|@''HAVE_WCSCMP''@|$(HAVE_WCSCMP)|g' \ -e 's|@''HAVE_WCSNCMP''@|$(HAVE_WCSNCMP)|g' \ -e 's|@''HAVE_WCSCASECMP''@|$(HAVE_WCSCASECMP)|g' \ -e 's|@''HAVE_WCSNCASECMP''@|$(HAVE_WCSNCASECMP)|g' \ -e 's|@''HAVE_WCSCOLL''@|$(HAVE_WCSCOLL)|g' \ -e 's|@''HAVE_WCSXFRM''@|$(HAVE_WCSXFRM)|g' \ -e 's|@''HAVE_WCSDUP''@|$(HAVE_WCSDUP)|g' \ -e 's|@''HAVE_WCSCHR''@|$(HAVE_WCSCHR)|g' \ -e 's|@''HAVE_WCSRCHR''@|$(HAVE_WCSRCHR)|g' \ -e 's|@''HAVE_WCSCSPN''@|$(HAVE_WCSCSPN)|g' \ -e 's|@''HAVE_WCSSPN''@|$(HAVE_WCSSPN)|g' \ -e 's|@''HAVE_WCSPBRK''@|$(HAVE_WCSPBRK)|g' \ -e 's|@''HAVE_WCSSTR''@|$(HAVE_WCSSTR)|g' \ -e 's|@''HAVE_WCSTOK''@|$(HAVE_WCSTOK)|g' \ -e 's|@''HAVE_WCSWIDTH''@|$(HAVE_WCSWIDTH)|g' \ -e 's|@''HAVE_WCSFTIME''@|$(HAVE_WCSFTIME)|g' \ -e 's|@''HAVE_DECL_WCTOB''@|$(HAVE_DECL_WCTOB)|g' \ -e 's|@''HAVE_DECL_WCWIDTH''@|$(HAVE_DECL_WCWIDTH)|g' \ | \ sed -e 's|@''REPLACE_MBSTATE_T''@|$(REPLACE_MBSTATE_T)|g' \ -e 's|@''REPLACE_BTOWC''@|$(REPLACE_BTOWC)|g' \ -e 's|@''REPLACE_WCTOB''@|$(REPLACE_WCTOB)|g' \ -e 's|@''REPLACE_MBSINIT''@|$(REPLACE_MBSINIT)|g' \ -e 's|@''REPLACE_MBRTOWC''@|$(REPLACE_MBRTOWC)|g' \ -e 's|@''REPLACE_MBRLEN''@|$(REPLACE_MBRLEN)|g' \ -e 's|@''REPLACE_MBSRTOWCS''@|$(REPLACE_MBSRTOWCS)|g' \ -e 's|@''REPLACE_MBSNRTOWCS''@|$(REPLACE_MBSNRTOWCS)|g' \ -e 's|@''REPLACE_WCRTOMB''@|$(REPLACE_WCRTOMB)|g' \ -e 's|@''REPLACE_WCSRTOMBS''@|$(REPLACE_WCSRTOMBS)|g' \ -e 's|@''REPLACE_WCSNRTOMBS''@|$(REPLACE_WCSNRTOMBS)|g' \ -e 's|@''REPLACE_WCWIDTH''@|$(REPLACE_WCWIDTH)|g' \ -e 's|@''REPLACE_WCSWIDTH''@|$(REPLACE_WCSWIDTH)|g' \ -e 's|@''REPLACE_WCSFTIME''@|$(REPLACE_WCSFTIME)|g' \ -e 's|@''REPLACE_WCSTOK''@|$(REPLACE_WCSTOK)|g' \ -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \ -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \ -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)'; \ } > $@-t && \ mv $@-t $@ # We need the following in order to create when the system # doesn't have one that works with the given compiler. wctype.h: wctype.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(WARN_ON_USE_H) $(AM_V_GEN)rm -f $@-t $@ && \ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \ sed -e 's|@''GUARD_PREFIX''@|GL|g' \ -e 's/@''HAVE_WCTYPE_H''@/$(HAVE_WCTYPE_H)/g' \ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \ -e 's|@''NEXT_WCTYPE_H''@|$(NEXT_WCTYPE_H)|g' \ -e 's/@''HAVE_CRTDEFS_H''@/$(HAVE_CRTDEFS_H)/g' \ -e 's/@''GNULIB_OVERRIDES_WINT_T''@/$(GNULIB_OVERRIDES_WINT_T)/g' \ -e 's/@''GNULIB_ISWBLANK''@/$(GNULIB_ISWBLANK)/g' \ -e 's/@''GNULIB_ISWDIGIT''@/$(GNULIB_ISWDIGIT)/g' \ -e 's/@''GNULIB_ISWXDIGIT''@/$(GNULIB_ISWXDIGIT)/g' \ -e 's/@''GNULIB_WCTYPE''@/$(GNULIB_WCTYPE)/g' \ -e 's/@''GNULIB_ISWCTYPE''@/$(GNULIB_ISWCTYPE)/g' \ -e 's/@''GNULIB_WCTRANS''@/$(GNULIB_WCTRANS)/g' \ -e 's/@''GNULIB_TOWCTRANS''@/$(GNULIB_TOWCTRANS)/g' \ -e 's/@''HAVE_ISWBLANK''@/$(HAVE_ISWBLANK)/g' \ -e 's/@''HAVE_ISWCNTRL''@/$(HAVE_ISWCNTRL)/g' \ -e 's/@''HAVE_WCTYPE_T''@/$(HAVE_WCTYPE_T)/g' \ -e 's/@''HAVE_WCTRANS_T''@/$(HAVE_WCTRANS_T)/g' \ -e 's/@''HAVE_WINT_T''@/$(HAVE_WINT_T)/g' \ -e 's/@''REPLACE_ISWBLANK''@/$(REPLACE_ISWBLANK)/g' \ -e 's/@''REPLACE_ISWDIGIT''@/$(REPLACE_ISWDIGIT)/g' \ -e 's/@''REPLACE_ISWXDIGIT''@/$(REPLACE_ISWXDIGIT)/g' \ -e 's/@''REPLACE_ISWCNTRL''@/$(REPLACE_ISWCNTRL)/g' \ -e 's/@''REPLACE_TOWLOWER''@/$(REPLACE_TOWLOWER)/g' \ -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \ -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \ < $(srcdir)/wctype.in.h; \ } > $@-t && \ mv $@-t $@ mostlyclean-local: mostlyclean-generic @for dir in '' $(MOSTLYCLEANDIRS); do \ if test -n "$$dir" && test -d $$dir; then \ echo "rmdir $$dir"; rmdir $$dir; \ fi; \ done; \ : # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: pspp-1.4.1/gl/exitfail.c0000644000175000017500000000153413723215636014501 0ustar00blpblp00000000000000/* Failure exit status Copyright (C) 2002-2003, 2005-2007, 2009-2020 Free Software Foundation, Inc. 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 3 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, see . */ #include #include "exitfail.h" #include int volatile exit_failure = EXIT_FAILURE; pspp-1.4.1/gl/fseterr.c0000644000175000017500000000577313723215636014357 0ustar00blpblp00000000000000/* Set the error indicator of a stream. Copyright (C) 2007-2020 Free Software Foundation, Inc. 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 3 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, see . */ #include /* Specification. */ #include "fseterr.h" #include #include "stdio-impl.h" /* This file is not used on systems that have the __fseterr function, namely musl libc. */ void fseterr (FILE *fp) { /* Most systems provide FILE as a struct and the necessary bitmask in , because they need it for implementing getc() and putc() as fast macros. */ #if defined _IO_EOF_SEEN || defined _IO_ftrylockfile || __GNU_LIBRARY__ == 1 /* GNU libc, BeOS, Haiku, Linux libc5 */ fp->_flags |= _IO_ERR_SEEN; #elif defined __sferror || defined __DragonFly__ || defined __ANDROID__ /* FreeBSD, NetBSD, OpenBSD, DragonFly, Mac OS X, Cygwin, Minix 3, Android */ fp_->_flags |= __SERR; #elif defined __EMX__ /* emx+gcc */ fp->_flags |= _IOERR; #elif defined __minix /* Minix */ fp->_flags |= _IOERR; #elif defined _IOERR /* AIX, HP-UX, IRIX, OSF/1, Solaris, OpenServer, mingw, MSVC, NonStop Kernel, OpenVMS */ fp_->_flag |= _IOERR; #elif defined __UCLIBC__ /* uClibc */ fp->__modeflags |= __FLAG_ERROR; #elif defined __QNX__ /* QNX */ fp->_Mode |= 0x200 /* _MERR */; #elif defined __MINT__ /* Atari FreeMiNT */ fp->__error = 1; #elif defined EPLAN9 /* Plan9 */ if (fp->state != 0 /* CLOSED */) fp->state = 5 /* ERR */; #elif 0 /* unknown */ /* Portable fallback, based on an idea by Rich Felker. Wow! 6 system calls for something that is just a bit operation! Not activated on any system, because there is no way to repair FP when the sequence of system calls fails, and library code should not call abort(). */ int saved_errno; int fd; int fd2; saved_errno = errno; fflush (fp); fd = fileno (fp); fd2 = dup (fd); if (fd2 >= 0) { close (fd); fputc ('\0', fp); /* This should set the error indicator. */ fflush (fp); /* Or this. */ if (dup2 (fd2, fd) < 0) /* Whee... we botched the stream and now cannot restore it! */ abort (); close (fd2); } errno = saved_errno; #else #error "Please port gnulib fseterr.c to your platform! Look at the definitions of ferror and clearerr on your system, then report this to bug-gnulib." #endif } pspp-1.4.1/gl/alloca.c0000644000175000017500000001300013723215636014116 0ustar00blpblp00000000000000/* alloca.c -- allocate automatically reclaimed memory (Mostly) portable public-domain implementation -- D A Gwyn This implementation of the PWB library alloca function, which is used to allocate space off the run-time stack so that it is automatically reclaimed upon procedure exit, was inspired by discussions with J. Q. Johnson of Cornell. J.Otto Tennant contributed the Cray support. There are some preprocessor constants that can be defined when compiling for your specific system, for improved efficiency; however, the defaults should be okay. The general concept of this implementation is to keep track of all alloca-allocated blocks, and reclaim any that are found to be deeper in the stack than the current invocation. This heuristic does not reclaim storage as soon as it becomes invalid, but it will do so eventually. As a special case, alloca(0) reclaims storage without allocating any. It is a good idea to use alloca(0) in your main control loop, etc. to force garbage collection. */ #include #include #include #include #ifdef emacs # include "lisp.h" # include "blockinput.h" # ifdef EMACS_FREE # undef free # define free EMACS_FREE # endif #else # define memory_full() abort () #endif /* If compiling with GCC or clang, this file is not needed. */ #if !(defined __GNUC__ || defined __clang__) /* If someone has defined alloca as a macro, there must be some other way alloca is supposed to work. */ # ifndef alloca # ifdef emacs # ifdef static /* actually, only want this if static is defined as "" -- this is for usg, in which emacs must undefine static in order to make unexec workable */ # ifndef STACK_DIRECTION you lose -- must know STACK_DIRECTION at compile-time /* Using #error here is not wise since this file should work for old and obscure compilers. */ # endif /* STACK_DIRECTION undefined */ # endif /* static */ # endif /* emacs */ /* Define STACK_DIRECTION if you know the direction of stack growth for your system; otherwise it will be automatically deduced at run-time. STACK_DIRECTION > 0 => grows toward higher addresses STACK_DIRECTION < 0 => grows toward lower addresses STACK_DIRECTION = 0 => direction of growth unknown */ # ifndef STACK_DIRECTION # define STACK_DIRECTION 0 /* Direction unknown. */ # endif # if STACK_DIRECTION != 0 # define STACK_DIR STACK_DIRECTION /* Known at compile-time. */ # else /* STACK_DIRECTION == 0; need run-time code. */ static int stack_dir; /* 1 or -1 once known. */ # define STACK_DIR stack_dir static int find_stack_direction (int *addr, int depth) { int dir, dummy = 0; if (! addr) addr = &dummy; *addr = addr < &dummy ? 1 : addr == &dummy ? 0 : -1; dir = depth ? find_stack_direction (addr, depth - 1) : 0; return dir + dummy; } # endif /* STACK_DIRECTION == 0 */ /* An "alloca header" is used to: (a) chain together all alloca'ed blocks; (b) keep track of stack depth. It is very important that sizeof(header) agree with malloc alignment chunk size. The following default should work okay. */ # ifndef ALIGN_SIZE # define ALIGN_SIZE sizeof(double) # endif typedef union hdr { char align[ALIGN_SIZE]; /* To force sizeof(header). */ struct { union hdr *next; /* For chaining headers. */ char *deep; /* For stack depth measure. */ } h; } header; static header *last_alloca_header = NULL; /* -> last alloca header. */ /* Return a pointer to at least SIZE bytes of storage, which will be automatically reclaimed upon exit from the procedure that called alloca. Originally, this space was supposed to be taken from the current stack frame of the caller, but that method cannot be made to work for some implementations of C, for example under Gould's UTX/32. */ void * alloca (size_t size) { auto char probe; /* Probes stack depth: */ register char *depth = &probe; # if STACK_DIRECTION == 0 if (STACK_DIR == 0) /* Unknown growth direction. */ STACK_DIR = find_stack_direction (NULL, (size & 1) + 20); # endif /* Reclaim garbage, defined as all alloca'd storage that was allocated from deeper in the stack than currently. */ { register header *hp; /* Traverses linked list. */ # ifdef emacs BLOCK_INPUT; # endif for (hp = last_alloca_header; hp != NULL;) if ((STACK_DIR > 0 && hp->h.deep > depth) || (STACK_DIR < 0 && hp->h.deep < depth)) { register header *np = hp->h.next; free (hp); /* Collect garbage. */ hp = np; /* -> next header. */ } else break; /* Rest are not deeper. */ last_alloca_header = hp; /* -> last valid storage. */ # ifdef emacs UNBLOCK_INPUT; # endif } if (size == 0) return NULL; /* No allocation required. */ /* Allocate combined header + user data storage. */ { /* Address of header. */ register header *new; size_t combined_size = sizeof (header) + size; if (combined_size < sizeof (header)) memory_full (); new = malloc (combined_size); if (! new) memory_full (); new->h.next = last_alloca_header; new->h.deep = depth; last_alloca_header = new; /* User storage begins just after header. */ return (void *) (new + 1); } } # endif /* no alloca */ #endif /* not GCC || clang */ pspp-1.4.1/gl/uinttostr.c0000644000175000017500000000011613723215640014735 0ustar00blpblp00000000000000#define anytostr uinttostr #define inttype unsigned int #include "anytostr.c" pspp-1.4.1/gl/select.c0000644000175000017500000004057013723215640014151 0ustar00blpblp00000000000000/* Emulation for select(2) Contributed by Paolo Bonzini. Copyright 2008-2020 Free Software Foundation, Inc. This file is part of gnulib. 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 3, 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, see . */ #include #include #include #if defined _WIN32 && ! defined __CYGWIN__ /* Native Windows. */ #include #include #include #include #include #include #include #include #include /* Get the overridden 'struct timeval'. */ #include #if GNULIB_MSVC_NOTHROW # include "msvc-nothrow.h" #else # include #endif #undef select /* Don't assume that UNICODE is not defined. */ #undef GetModuleHandle #define GetModuleHandle GetModuleHandleA #undef PeekConsoleInput #define PeekConsoleInput PeekConsoleInputA #undef CreateEvent #define CreateEvent CreateEventA #undef PeekMessage #define PeekMessage PeekMessageA #undef DispatchMessage #define DispatchMessage DispatchMessageA /* Avoid warnings from gcc -Wcast-function-type. */ #define GetProcAddress \ (void *) GetProcAddress struct bitset { unsigned char in[FD_SETSIZE / CHAR_BIT]; unsigned char out[FD_SETSIZE / CHAR_BIT]; }; /* Declare data structures for ntdll functions. */ typedef struct _FILE_PIPE_LOCAL_INFORMATION { ULONG NamedPipeType; ULONG NamedPipeConfiguration; ULONG MaximumInstances; ULONG CurrentInstances; ULONG InboundQuota; ULONG ReadDataAvailable; ULONG OutboundQuota; ULONG WriteQuotaAvailable; ULONG NamedPipeState; ULONG NamedPipeEnd; } FILE_PIPE_LOCAL_INFORMATION, *PFILE_PIPE_LOCAL_INFORMATION; typedef struct _IO_STATUS_BLOCK { union { DWORD Status; PVOID Pointer; } u; ULONG_PTR Information; } IO_STATUS_BLOCK, *PIO_STATUS_BLOCK; typedef enum _FILE_INFORMATION_CLASS { FilePipeLocalInformation = 24 } FILE_INFORMATION_CLASS, *PFILE_INFORMATION_CLASS; typedef DWORD (WINAPI *PNtQueryInformationFile) (HANDLE, IO_STATUS_BLOCK *, VOID *, ULONG, FILE_INFORMATION_CLASS); #ifndef PIPE_BUF #define PIPE_BUF 512 #endif static BOOL IsConsoleHandle (HANDLE h) { DWORD mode; return GetConsoleMode (h, &mode) != 0; } static BOOL IsSocketHandle (HANDLE h) { WSANETWORKEVENTS ev; if (IsConsoleHandle (h)) return FALSE; /* Under Wine, it seems that getsockopt returns 0 for pipes too. WSAEnumNetworkEvents instead distinguishes the two correctly. */ ev.lNetworkEvents = 0xDEADBEEF; WSAEnumNetworkEvents ((SOCKET) h, NULL, &ev); return ev.lNetworkEvents != 0xDEADBEEF; } /* Compute output fd_sets for libc descriptor FD (whose Windows handle is H). */ static int windows_poll_handle (HANDLE h, int fd, struct bitset *rbits, struct bitset *wbits, struct bitset *xbits) { BOOL read, write, except; int i, ret; INPUT_RECORD *irbuffer; DWORD avail, nbuffer; BOOL bRet; IO_STATUS_BLOCK iosb; FILE_PIPE_LOCAL_INFORMATION fpli; static PNtQueryInformationFile NtQueryInformationFile; static BOOL once_only; read = write = except = FALSE; switch (GetFileType (h)) { case FILE_TYPE_DISK: read = TRUE; write = TRUE; break; case FILE_TYPE_PIPE: if (!once_only) { NtQueryInformationFile = (PNtQueryInformationFile) GetProcAddress (GetModuleHandle ("ntdll.dll"), "NtQueryInformationFile"); once_only = TRUE; } if (PeekNamedPipe (h, NULL, 0, NULL, &avail, NULL) != 0) { if (avail) read = TRUE; } else if (GetLastError () == ERROR_BROKEN_PIPE) ; else { /* It was the write-end of the pipe. Check if it is writable. If NtQueryInformationFile fails, optimistically assume the pipe is writable. This could happen on Windows 9x, where NtQueryInformationFile is not available, or if we inherit a pipe that doesn't permit FILE_READ_ATTRIBUTES access on the write end (I think this should not happen since Windows XP SP2; WINE seems fine too). Otherwise, ensure that enough space is available for atomic writes. */ memset (&iosb, 0, sizeof (iosb)); memset (&fpli, 0, sizeof (fpli)); if (!NtQueryInformationFile || NtQueryInformationFile (h, &iosb, &fpli, sizeof (fpli), FilePipeLocalInformation) || fpli.WriteQuotaAvailable >= PIPE_BUF || (fpli.OutboundQuota < PIPE_BUF && fpli.WriteQuotaAvailable == fpli.OutboundQuota)) write = TRUE; } break; case FILE_TYPE_CHAR: write = TRUE; if (!(rbits->in[fd / CHAR_BIT] & (1 << (fd & (CHAR_BIT - 1))))) break; ret = WaitForSingleObject (h, 0); if (ret == WAIT_OBJECT_0) { if (!IsConsoleHandle (h)) { read = TRUE; break; } nbuffer = avail = 0; bRet = GetNumberOfConsoleInputEvents (h, &nbuffer); /* Screen buffers handles are filtered earlier. */ assert (bRet); if (nbuffer == 0) { except = TRUE; break; } irbuffer = (INPUT_RECORD *) alloca (nbuffer * sizeof (INPUT_RECORD)); bRet = PeekConsoleInput (h, irbuffer, nbuffer, &avail); if (!bRet || avail == 0) { except = TRUE; break; } for (i = 0; i < avail; i++) if (irbuffer[i].EventType == KEY_EVENT) read = TRUE; } break; default: ret = WaitForSingleObject (h, 0); write = TRUE; if (ret == WAIT_OBJECT_0) read = TRUE; break; } ret = 0; if (read && (rbits->in[fd / CHAR_BIT] & (1 << (fd & (CHAR_BIT - 1))))) { rbits->out[fd / CHAR_BIT] |= (1 << (fd & (CHAR_BIT - 1))); ret++; } if (write && (wbits->in[fd / CHAR_BIT] & (1 << (fd & (CHAR_BIT - 1))))) { wbits->out[fd / CHAR_BIT] |= (1 << (fd & (CHAR_BIT - 1))); ret++; } if (except && (xbits->in[fd / CHAR_BIT] & (1 << (fd & (CHAR_BIT - 1))))) { xbits->out[fd / CHAR_BIT] |= (1 << (fd & (CHAR_BIT - 1))); ret++; } return ret; } int rpl_select (int nfds, fd_set *rfds, fd_set *wfds, fd_set *xfds, struct timeval *timeout) #undef timeval { static struct timeval tv0; static HANDLE hEvent; HANDLE h, handle_array[FD_SETSIZE + 2]; fd_set handle_rfds, handle_wfds, handle_xfds; struct bitset rbits, wbits, xbits; unsigned char anyfds_in[FD_SETSIZE / CHAR_BIT]; DWORD ret, wait_timeout, nhandles, nsock, nbuffer; MSG msg; int i, fd, rc; clock_t tend; if (nfds > FD_SETSIZE) nfds = FD_SETSIZE; if (!timeout) wait_timeout = INFINITE; else { wait_timeout = timeout->tv_sec * 1000 + timeout->tv_usec / 1000; /* select is also used as a portable usleep. */ if (!rfds && !wfds && !xfds) { Sleep (wait_timeout); return 0; } } if (!hEvent) hEvent = CreateEvent (NULL, FALSE, FALSE, NULL); handle_array[0] = hEvent; nhandles = 1; nsock = 0; /* Copy descriptors to bitsets. At the same time, eliminate bits in the "wrong" direction for console input buffers and screen buffers, because screen buffers are waitable and they will block until a character is available. */ memset (&rbits, 0, sizeof (rbits)); memset (&wbits, 0, sizeof (wbits)); memset (&xbits, 0, sizeof (xbits)); memset (anyfds_in, 0, sizeof (anyfds_in)); if (rfds) for (i = 0; i < rfds->fd_count; i++) { fd = rfds->fd_array[i]; h = (HANDLE) _get_osfhandle (fd); if (IsConsoleHandle (h) && !GetNumberOfConsoleInputEvents (h, &nbuffer)) continue; rbits.in[fd / CHAR_BIT] |= 1 << (fd & (CHAR_BIT - 1)); anyfds_in[fd / CHAR_BIT] |= 1 << (fd & (CHAR_BIT - 1)); } else rfds = (fd_set *) alloca (sizeof (fd_set)); if (wfds) for (i = 0; i < wfds->fd_count; i++) { fd = wfds->fd_array[i]; h = (HANDLE) _get_osfhandle (fd); if (IsConsoleHandle (h) && GetNumberOfConsoleInputEvents (h, &nbuffer)) continue; wbits.in[fd / CHAR_BIT] |= 1 << (fd & (CHAR_BIT - 1)); anyfds_in[fd / CHAR_BIT] |= 1 << (fd & (CHAR_BIT - 1)); } else wfds = (fd_set *) alloca (sizeof (fd_set)); if (xfds) for (i = 0; i < xfds->fd_count; i++) { fd = xfds->fd_array[i]; xbits.in[fd / CHAR_BIT] |= 1 << (fd & (CHAR_BIT - 1)); anyfds_in[fd / CHAR_BIT] |= 1 << (fd & (CHAR_BIT - 1)); } else xfds = (fd_set *) alloca (sizeof (fd_set)); /* Zero all the fd_sets, including the application's. */ FD_ZERO (rfds); FD_ZERO (wfds); FD_ZERO (xfds); FD_ZERO (&handle_rfds); FD_ZERO (&handle_wfds); FD_ZERO (&handle_xfds); /* Classify handles. Create fd sets for sockets, poll the others. */ for (i = 0; i < nfds; i++) { if ((anyfds_in[i / CHAR_BIT] & (1 << (i & (CHAR_BIT - 1)))) == 0) continue; h = (HANDLE) _get_osfhandle (i); if (!h) { errno = EBADF; return -1; } if (IsSocketHandle (h)) { int requested = FD_CLOSE; /* See above; socket handles are mapped onto select, but we need to map descriptors to handles. */ if (rbits.in[i / CHAR_BIT] & (1 << (i & (CHAR_BIT - 1)))) { requested |= FD_READ | FD_ACCEPT; FD_SET ((SOCKET) h, rfds); FD_SET ((SOCKET) h, &handle_rfds); } if (wbits.in[i / CHAR_BIT] & (1 << (i & (CHAR_BIT - 1)))) { requested |= FD_WRITE | FD_CONNECT; FD_SET ((SOCKET) h, wfds); FD_SET ((SOCKET) h, &handle_wfds); } if (xbits.in[i / CHAR_BIT] & (1 << (i & (CHAR_BIT - 1)))) { requested |= FD_OOB; FD_SET ((SOCKET) h, xfds); FD_SET ((SOCKET) h, &handle_xfds); } WSAEventSelect ((SOCKET) h, hEvent, requested); nsock++; } else { handle_array[nhandles++] = h; /* Poll now. If we get an event, do not wait below. */ if (wait_timeout != 0 && windows_poll_handle (h, i, &rbits, &wbits, &xbits)) wait_timeout = 0; } } /* Place a sentinel at the end of the array. */ handle_array[nhandles] = NULL; /* When will the waiting period expire? */ if (wait_timeout != INFINITE) tend = clock () + wait_timeout; restart: if (wait_timeout == 0 || nsock == 0) rc = 0; else { /* See if we need to wait in the loop below. If any select is ready, do MsgWaitForMultipleObjects anyway to dispatch messages, but no need to call select again. */ rc = select (0, &handle_rfds, &handle_wfds, &handle_xfds, &tv0); if (rc == 0) { /* Restore the fd_sets for the other select we do below. */ memcpy (&handle_rfds, rfds, sizeof (fd_set)); memcpy (&handle_wfds, wfds, sizeof (fd_set)); memcpy (&handle_xfds, xfds, sizeof (fd_set)); } else wait_timeout = 0; } /* How much is left to wait? */ if (wait_timeout != INFINITE) { clock_t tnow = clock (); if (tend >= tnow) wait_timeout = tend - tnow; else wait_timeout = 0; } for (;;) { ret = MsgWaitForMultipleObjects (nhandles, handle_array, FALSE, wait_timeout, QS_ALLINPUT); if (ret == WAIT_OBJECT_0 + nhandles) { /* new input of some other kind */ BOOL bRet; while ((bRet = PeekMessage (&msg, NULL, 0, 0, PM_REMOVE)) != 0) { TranslateMessage (&msg); DispatchMessage (&msg); } } else break; } /* If we haven't done it yet, check the status of the sockets. */ if (rc == 0 && nsock > 0) rc = select (0, &handle_rfds, &handle_wfds, &handle_xfds, &tv0); if (nhandles > 1) { /* Count results that are not counted in the return value of select. */ nhandles = 1; for (i = 0; i < nfds; i++) { if ((anyfds_in[i / CHAR_BIT] & (1 << (i & (CHAR_BIT - 1)))) == 0) continue; h = (HANDLE) _get_osfhandle (i); if (h == handle_array[nhandles]) { /* Not a socket. */ nhandles++; windows_poll_handle (h, i, &rbits, &wbits, &xbits); if (rbits.out[i / CHAR_BIT] & (1 << (i & (CHAR_BIT - 1))) || wbits.out[i / CHAR_BIT] & (1 << (i & (CHAR_BIT - 1))) || xbits.out[i / CHAR_BIT] & (1 << (i & (CHAR_BIT - 1)))) rc++; } } if (rc == 0 && (wait_timeout == INFINITE /* If NHANDLES > 1, but no bits are set, it means we've been told incorrectly that some handle was signaled. This happens with anonymous pipes, which always cause MsgWaitForMultipleObjects to exit immediately, but no data is found ready to be read by windows_poll_handle. To avoid a total failure (whereby we return zero and don't wait at all), let's poll in a more busy loop. */ || (wait_timeout != 0 && nhandles > 1))) { /* Sleep 1 millisecond to avoid busy wait and retry with the original fd_sets. */ memcpy (&handle_rfds, rfds, sizeof (fd_set)); memcpy (&handle_wfds, wfds, sizeof (fd_set)); memcpy (&handle_xfds, xfds, sizeof (fd_set)); SleepEx (1, TRUE); goto restart; } if (timeout && wait_timeout == 0 && rc == 0) timeout->tv_sec = timeout->tv_usec = 0; } /* Now fill in the results. */ FD_ZERO (rfds); FD_ZERO (wfds); FD_ZERO (xfds); nhandles = 1; for (i = 0; i < nfds; i++) { if ((anyfds_in[i / CHAR_BIT] & (1 << (i & (CHAR_BIT - 1)))) == 0) continue; h = (HANDLE) _get_osfhandle (i); if (h != handle_array[nhandles]) { /* Perform handle->descriptor mapping. */ WSAEventSelect ((SOCKET) h, NULL, 0); if (FD_ISSET (h, &handle_rfds)) FD_SET (i, rfds); if (FD_ISSET (h, &handle_wfds)) FD_SET (i, wfds); if (FD_ISSET (h, &handle_xfds)) FD_SET (i, xfds); } else { /* Not a socket. */ nhandles++; if (rbits.out[i / CHAR_BIT] & (1 << (i & (CHAR_BIT - 1)))) FD_SET (i, rfds); if (wbits.out[i / CHAR_BIT] & (1 << (i & (CHAR_BIT - 1)))) FD_SET (i, wfds); if (xbits.out[i / CHAR_BIT] & (1 << (i & (CHAR_BIT - 1)))) FD_SET (i, xfds); } } return rc; } #else /* ! Native Windows. */ #include #include /* NULL */ #include #include #undef select int rpl_select (int nfds, fd_set *rfds, fd_set *wfds, fd_set *xfds, struct timeval *timeout) { int i; /* FreeBSD 8.2 has a bug: it does not always detect invalid fds. */ if (nfds < 0 || nfds > FD_SETSIZE) { errno = EINVAL; return -1; } for (i = 0; i < nfds; i++) { if (((rfds && FD_ISSET (i, rfds)) || (wfds && FD_ISSET (i, wfds)) || (xfds && FD_ISSET (i, xfds))) && dup2 (i, i) != i) return -1; } /* Interix 3.5 has a bug: it does not support nfds == 0. */ if (nfds == 0) { nfds = 1; rfds = NULL; wfds = NULL; xfds = NULL; } return select (nfds, rfds, wfds, xfds, timeout); } #endif pspp-1.4.1/gl/mkstemp.c0000644000175000017500000000300613723215637014351 0ustar00blpblp00000000000000/* Copyright (C) 1998-1999, 2001, 2005-2007, 2009-2020 Free Software Foundation, Inc. This file is derived from the one in the GNU C Library. 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 3 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, see . */ #if !_LIBC # include #endif #include #if !_LIBC # include "tempname.h" # define __gen_tempname gen_tempname # ifndef __GT_FILE # define __GT_FILE GT_FILE # endif #endif #include #ifndef __GT_FILE # define __GT_FILE 0 #endif /* Generate a unique temporary file name from XTEMPLATE. The last six characters of XTEMPLATE must be "XXXXXX"; they are replaced with a string that makes the file name unique. Then open the file and return a fd. If you are creating temporary files which will later be removed, consider using the clean-temp module, which avoids several pitfalls of using mkstemp directly. */ int mkstemp (char *xtemplate) { return __gen_tempname (xtemplate, 0, 0, __GT_FILE); } pspp-1.4.1/gl/mbchar.h0000644000175000017500000003342513723215637014142 0ustar00blpblp00000000000000/* Multibyte character data type. Copyright (C) 2001, 2005-2007, 2009-2020 Free Software Foundation, Inc. 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 3 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, see . */ /* Written by Bruno Haible . */ /* A multibyte character is a short subsequence of a char* string, representing a single wide character. We use multibyte characters instead of wide characters because of the following goals: 1) correct multibyte handling, i.e. operate according to the LC_CTYPE locale, 2) ease of maintenance, i.e. the maintainer needs not know all details of the ISO C 99 standard, 3) don't fail grossly if the input is not in the encoding set by the locale, because often different encodings are in use in the same countries (ISO-8859-1/UTF-8, EUC-JP/Shift_JIS, ...), 4) fast in the case of ASCII characters, 5) portability, i.e. don't make unportable assumptions about wchar_t. Multibyte characters are only accessed through the mb* macros. mb_ptr (mbc) return a pointer to the beginning of the multibyte sequence. mb_len (mbc) returns the number of bytes occupied by the multibyte sequence. Always > 0. mb_iseq (mbc, sc) returns true if mbc is the standard ASCII character sc. mb_isnul (mbc) returns true if mbc is the nul character. mb_cmp (mbc1, mbc2) returns a positive, zero, or negative value depending on whether mbc1 sorts after, same or before mbc2. mb_casecmp (mbc1, mbc2) returns a positive, zero, or negative value depending on whether mbc1 sorts after, same or before mbc2, modulo upper/lowercase conversion. mb_equal (mbc1, mbc2) returns true if mbc1 and mbc2 are equal. mb_caseequal (mbc1, mbc2) returns true if mbc1 and mbc2 are equal modulo upper/lowercase conversion. mb_isalnum (mbc) returns true if mbc is alphanumeric. mb_isalpha (mbc) returns true if mbc is alphabetic. mb_isascii(mbc) returns true if mbc is plain ASCII. mb_isblank (mbc) returns true if mbc is a blank. mb_iscntrl (mbc) returns true if mbc is a control character. mb_isdigit (mbc) returns true if mbc is a decimal digit. mb_isgraph (mbc) returns true if mbc is a graphic character. mb_islower (mbc) returns true if mbc is lowercase. mb_isprint (mbc) returns true if mbc is a printable character. mb_ispunct (mbc) returns true if mbc is a punctuation character. mb_isspace (mbc) returns true if mbc is a space character. mb_isupper (mbc) returns true if mbc is uppercase. mb_isxdigit (mbc) returns true if mbc is a hexadecimal digit. mb_width (mbc) returns the number of columns on the output device occupied by mbc. Always >= 0. mb_putc (mbc, stream) outputs mbc on stream, a byte oriented FILE stream opened for output. mb_setascii (&mbc, sc) assigns the standard ASCII character sc to mbc. mb_copy (&destmbc, &srcmbc) copies srcmbc to destmbc. Here are the function prototypes of the macros. extern const char * mb_ptr (const mbchar_t mbc); extern size_t mb_len (const mbchar_t mbc); extern bool mb_iseq (const mbchar_t mbc, char sc); extern bool mb_isnul (const mbchar_t mbc); extern int mb_cmp (const mbchar_t mbc1, const mbchar_t mbc2); extern int mb_casecmp (const mbchar_t mbc1, const mbchar_t mbc2); extern bool mb_equal (const mbchar_t mbc1, const mbchar_t mbc2); extern bool mb_caseequal (const mbchar_t mbc1, const mbchar_t mbc2); extern bool mb_isalnum (const mbchar_t mbc); extern bool mb_isalpha (const mbchar_t mbc); extern bool mb_isascii (const mbchar_t mbc); extern bool mb_isblank (const mbchar_t mbc); extern bool mb_iscntrl (const mbchar_t mbc); extern bool mb_isdigit (const mbchar_t mbc); extern bool mb_isgraph (const mbchar_t mbc); extern bool mb_islower (const mbchar_t mbc); extern bool mb_isprint (const mbchar_t mbc); extern bool mb_ispunct (const mbchar_t mbc); extern bool mb_isspace (const mbchar_t mbc); extern bool mb_isupper (const mbchar_t mbc); extern bool mb_isxdigit (const mbchar_t mbc); extern int mb_width (const mbchar_t mbc); extern void mb_putc (const mbchar_t mbc, FILE *stream); extern void mb_setascii (mbchar_t *new, char sc); extern void mb_copy (mbchar_t *new, const mbchar_t *old); */ #ifndef _MBCHAR_H #define _MBCHAR_H 1 #include #include /* Tru64 with Desktop Toolkit C has a bug: must be included before . BSD/OS 4.1 has a bug: and must be included before . */ #include #include #include #include #ifndef _GL_INLINE_HEADER_BEGIN #error "Please include config.h first." #endif _GL_INLINE_HEADER_BEGIN #ifndef MBCHAR_INLINE # define MBCHAR_INLINE _GL_INLINE #endif #define MBCHAR_BUF_SIZE 24 struct mbchar { const char *ptr; /* pointer to current character */ size_t bytes; /* number of bytes of current character, > 0 */ bool wc_valid; /* true if wc is a valid wide character */ wchar_t wc; /* if wc_valid: the current character */ char buf[MBCHAR_BUF_SIZE]; /* room for the bytes, used for file input only */ }; /* EOF (not a real character) is represented with bytes = 0 and wc_valid = false. */ typedef struct mbchar mbchar_t; /* Access the current character. */ #define mb_ptr(mbc) ((mbc).ptr) #define mb_len(mbc) ((mbc).bytes) /* Comparison of characters. */ #define mb_iseq(mbc, sc) ((mbc).wc_valid && (mbc).wc == (sc)) #define mb_isnul(mbc) ((mbc).wc_valid && (mbc).wc == 0) #define mb_cmp(mbc1, mbc2) \ ((mbc1).wc_valid \ ? ((mbc2).wc_valid \ ? (int) (mbc1).wc - (int) (mbc2).wc \ : -1) \ : ((mbc2).wc_valid \ ? 1 \ : (mbc1).bytes == (mbc2).bytes \ ? memcmp ((mbc1).ptr, (mbc2).ptr, (mbc1).bytes) \ : (mbc1).bytes < (mbc2).bytes \ ? (memcmp ((mbc1).ptr, (mbc2).ptr, (mbc1).bytes) > 0 ? 1 : -1) \ : (memcmp ((mbc1).ptr, (mbc2).ptr, (mbc2).bytes) >= 0 ? 1 : -1))) #define mb_casecmp(mbc1, mbc2) \ ((mbc1).wc_valid \ ? ((mbc2).wc_valid \ ? (int) towlower ((mbc1).wc) - (int) towlower ((mbc2).wc) \ : -1) \ : ((mbc2).wc_valid \ ? 1 \ : (mbc1).bytes == (mbc2).bytes \ ? memcmp ((mbc1).ptr, (mbc2).ptr, (mbc1).bytes) \ : (mbc1).bytes < (mbc2).bytes \ ? (memcmp ((mbc1).ptr, (mbc2).ptr, (mbc1).bytes) > 0 ? 1 : -1) \ : (memcmp ((mbc1).ptr, (mbc2).ptr, (mbc2).bytes) >= 0 ? 1 : -1))) #define mb_equal(mbc1, mbc2) \ ((mbc1).wc_valid && (mbc2).wc_valid \ ? (mbc1).wc == (mbc2).wc \ : (mbc1).bytes == (mbc2).bytes \ && memcmp ((mbc1).ptr, (mbc2).ptr, (mbc1).bytes) == 0) #define mb_caseequal(mbc1, mbc2) \ ((mbc1).wc_valid && (mbc2).wc_valid \ ? towlower ((mbc1).wc) == towlower ((mbc2).wc) \ : (mbc1).bytes == (mbc2).bytes \ && memcmp ((mbc1).ptr, (mbc2).ptr, (mbc1).bytes) == 0) /* , classification. */ #define mb_isascii(mbc) \ ((mbc).wc_valid && (mbc).wc >= 0 && (mbc).wc <= 127) #define mb_isalnum(mbc) ((mbc).wc_valid && iswalnum ((mbc).wc)) #define mb_isalpha(mbc) ((mbc).wc_valid && iswalpha ((mbc).wc)) #define mb_isblank(mbc) ((mbc).wc_valid && iswblank ((mbc).wc)) #define mb_iscntrl(mbc) ((mbc).wc_valid && iswcntrl ((mbc).wc)) #define mb_isdigit(mbc) ((mbc).wc_valid && iswdigit ((mbc).wc)) #define mb_isgraph(mbc) ((mbc).wc_valid && iswgraph ((mbc).wc)) #define mb_islower(mbc) ((mbc).wc_valid && iswlower ((mbc).wc)) #define mb_isprint(mbc) ((mbc).wc_valid && iswprint ((mbc).wc)) #define mb_ispunct(mbc) ((mbc).wc_valid && iswpunct ((mbc).wc)) #define mb_isspace(mbc) ((mbc).wc_valid && iswspace ((mbc).wc)) #define mb_isupper(mbc) ((mbc).wc_valid && iswupper ((mbc).wc)) #define mb_isxdigit(mbc) ((mbc).wc_valid && iswxdigit ((mbc).wc)) /* Extra function. */ /* Unprintable characters appear as a small box of width 1. */ #define MB_UNPRINTABLE_WIDTH 1 MBCHAR_INLINE int mb_width_aux (wint_t wc) { int w = wcwidth (wc); /* For unprintable characters, arbitrarily return 0 for control characters and MB_UNPRINTABLE_WIDTH otherwise. */ return (w >= 0 ? w : iswcntrl (wc) ? 0 : MB_UNPRINTABLE_WIDTH); } #define mb_width(mbc) \ ((mbc).wc_valid ? mb_width_aux ((mbc).wc) : MB_UNPRINTABLE_WIDTH) /* Output. */ #define mb_putc(mbc, stream) fwrite ((mbc).ptr, 1, (mbc).bytes, (stream)) /* Assignment. */ #define mb_setascii(mbc, sc) \ ((mbc)->ptr = (mbc)->buf, (mbc)->bytes = 1, (mbc)->wc_valid = 1, \ (mbc)->wc = (mbc)->buf[0] = (sc)) /* Copying a character. */ MBCHAR_INLINE void mb_copy (mbchar_t *new_mbc, const mbchar_t *old_mbc) { if (old_mbc->ptr == &old_mbc->buf[0]) { memcpy (&new_mbc->buf[0], &old_mbc->buf[0], old_mbc->bytes); new_mbc->ptr = &new_mbc->buf[0]; } else new_mbc->ptr = old_mbc->ptr; new_mbc->bytes = old_mbc->bytes; if ((new_mbc->wc_valid = old_mbc->wc_valid)) new_mbc->wc = old_mbc->wc; } /* is_basic(c) tests whether the single-byte character c is in the ISO C "basic character set". This is a convenience function, and is in this file only to share code between mbiter_multi.h and mbfile_multi.h. */ #if (' ' == 32) && ('!' == 33) && ('"' == 34) && ('#' == 35) \ && ('%' == 37) && ('&' == 38) && ('\'' == 39) && ('(' == 40) \ && (')' == 41) && ('*' == 42) && ('+' == 43) && (',' == 44) \ && ('-' == 45) && ('.' == 46) && ('/' == 47) && ('0' == 48) \ && ('1' == 49) && ('2' == 50) && ('3' == 51) && ('4' == 52) \ && ('5' == 53) && ('6' == 54) && ('7' == 55) && ('8' == 56) \ && ('9' == 57) && (':' == 58) && (';' == 59) && ('<' == 60) \ && ('=' == 61) && ('>' == 62) && ('?' == 63) && ('A' == 65) \ && ('B' == 66) && ('C' == 67) && ('D' == 68) && ('E' == 69) \ && ('F' == 70) && ('G' == 71) && ('H' == 72) && ('I' == 73) \ && ('J' == 74) && ('K' == 75) && ('L' == 76) && ('M' == 77) \ && ('N' == 78) && ('O' == 79) && ('P' == 80) && ('Q' == 81) \ && ('R' == 82) && ('S' == 83) && ('T' == 84) && ('U' == 85) \ && ('V' == 86) && ('W' == 87) && ('X' == 88) && ('Y' == 89) \ && ('Z' == 90) && ('[' == 91) && ('\\' == 92) && (']' == 93) \ && ('^' == 94) && ('_' == 95) && ('a' == 97) && ('b' == 98) \ && ('c' == 99) && ('d' == 100) && ('e' == 101) && ('f' == 102) \ && ('g' == 103) && ('h' == 104) && ('i' == 105) && ('j' == 106) \ && ('k' == 107) && ('l' == 108) && ('m' == 109) && ('n' == 110) \ && ('o' == 111) && ('p' == 112) && ('q' == 113) && ('r' == 114) \ && ('s' == 115) && ('t' == 116) && ('u' == 117) && ('v' == 118) \ && ('w' == 119) && ('x' == 120) && ('y' == 121) && ('z' == 122) \ && ('{' == 123) && ('|' == 124) && ('}' == 125) && ('~' == 126) /* The character set is ISO-646, not EBCDIC. */ # define IS_BASIC_ASCII 1 extern const unsigned int is_basic_table[]; MBCHAR_INLINE bool is_basic (char c) { return (is_basic_table [(unsigned char) c >> 5] >> ((unsigned char) c & 31)) & 1; } #else MBCHAR_INLINE bool is_basic (char c) { switch (c) { case '\t': case '\v': case '\f': case ' ': case '!': case '"': case '#': case '%': case '&': case '\'': case '(': case ')': case '*': case '+': case ',': case '-': case '.': case '/': case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': case ':': case ';': case '<': case '=': case '>': case '?': case 'A': case 'B': case 'C': case 'D': case 'E': case 'F': case 'G': case 'H': case 'I': case 'J': case 'K': case 'L': case 'M': case 'N': case 'O': case 'P': case 'Q': case 'R': case 'S': case 'T': case 'U': case 'V': case 'W': case 'X': case 'Y': case 'Z': case '[': case '\\': case ']': case '^': case '_': case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': case 'g': case 'h': case 'i': case 'j': case 'k': case 'l': case 'm': case 'n': case 'o': case 'p': case 'q': case 'r': case 's': case 't': case 'u': case 'v': case 'w': case 'x': case 'y': case 'z': case '{': case '|': case '}': case '~': return 1; default: return 0; } } #endif _GL_INLINE_HEADER_END #endif /* _MBCHAR_H */ pspp-1.4.1/gl/mbrtowc-impl-utf8.h0000644000175000017500000001222613723215637016202 0ustar00blpblp00000000000000/* Convert multibyte character to wide character. Copyright (C) 1999-2002, 2005-2020 Free Software Foundation, Inc. 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 3 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, see . */ /* Written by Bruno Haible , 2008. */ /* This file contains the part of the body of the mbrtowc and mbrtoc32 functions that handles the special case of the UTF-8 encoding. */ /* Cf. unistr/u8-mbtouc.c. */ unsigned char c = (unsigned char) p[0]; if (c < 0x80) { if (pwc != NULL) *pwc = c; res = (c == 0 ? 0 : 1); goto success; } if (c >= 0xc2) { if (c < 0xe0) { if (m == 1) goto incomplete; else /* m >= 2 */ { unsigned char c2 = (unsigned char) p[1]; if ((c2 ^ 0x80) < 0x40) { if (pwc != NULL) *pwc = ((unsigned int) (c & 0x1f) << 6) | (unsigned int) (c2 ^ 0x80); res = 2; goto success; } } } else if (c < 0xf0) { if (m == 1) goto incomplete; else { unsigned char c2 = (unsigned char) p[1]; if ((c2 ^ 0x80) < 0x40 && (c >= 0xe1 || c2 >= 0xa0) && (c != 0xed || c2 < 0xa0)) { if (m == 2) goto incomplete; else /* m >= 3 */ { unsigned char c3 = (unsigned char) p[2]; if ((c3 ^ 0x80) < 0x40) { unsigned int wc = (((unsigned int) (c & 0x0f) << 12) | ((unsigned int) (c2 ^ 0x80) << 6) | (unsigned int) (c3 ^ 0x80)); if (FITS_IN_CHAR_TYPE (wc)) { if (pwc != NULL) *pwc = wc; res = 3; goto success; } } } } } } else if (c <= 0xf4) { if (m == 1) goto incomplete; else { unsigned char c2 = (unsigned char) p[1]; if ((c2 ^ 0x80) < 0x40 && (c >= 0xf1 || c2 >= 0x90) && (c < 0xf4 || (c == 0xf4 && c2 < 0x90))) { if (m == 2) goto incomplete; else { unsigned char c3 = (unsigned char) p[2]; if ((c3 ^ 0x80) < 0x40) { if (m == 3) goto incomplete; else /* m >= 4 */ { unsigned char c4 = (unsigned char) p[3]; if ((c4 ^ 0x80) < 0x40) { unsigned int wc = (((unsigned int) (c & 0x07) << 18) | ((unsigned int) (c2 ^ 0x80) << 12) | ((unsigned int) (c3 ^ 0x80) << 6) | (unsigned int) (c4 ^ 0x80)); if (FITS_IN_CHAR_TYPE (wc)) { if (pwc != NULL) *pwc = wc; res = 4; goto success; } } } } } } } } } goto invalid; pspp-1.4.1/gl/explicit_bzero.c0000644000175000017500000000363513723215636015722 0ustar00blpblp00000000000000/* Erasure of sensitive data, generic implementation. Copyright (C) 2016-2020 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library 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 3 of the License, or (at your option) any later version. The GNU C Library 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 the GNU C Library; if not, see . */ /* An assembler implementation of explicit_bzero can be created as an assembler alias of an optimized bzero implementation. Architecture-specific implementations also need to define __explicit_bzero_chk. */ #if !_LIBC # include #endif /* memset_s need this define */ #if HAVE_MEMSET_S # define __STDC_WANT_LIB_EXT1__ 1 #endif #include #if defined _WIN32 && !defined __CYGWIN__ # define WIN32_LEAN_AND_MEAN # include #endif #if _LIBC /* glibc-internal users use __explicit_bzero_chk, and explicit_bzero redirects to that. */ # undef explicit_bzero #endif /* Set LEN bytes of S to 0. The compiler will not delete a call to this function, even if S is dead after the call. */ void explicit_bzero (void *s, size_t len) { #if defined _WIN32 && !defined __CYGWIN__ (void) SecureZeroMemory (s, len); #elif HAVE_EXPLICIT_MEMSET explicit_memset (s, '\0', len); #elif HAVE_MEMSET_S (void) memset_s (s, len, '\0', len); #else memset (s, '\0', len); # if defined __GNUC__ && !defined __clang__ /* Compiler barrier. */ asm volatile ("" ::: "memory"); # endif #endif } pspp-1.4.1/gl/version-etc.c0000644000175000017500000002226613723215640015132 0ustar00blpblp00000000000000/* Print --version and bug-reporting information in a consistent format. Copyright (C) 1999-2020 Free Software Foundation, Inc. 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 3 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, see . */ /* Written by Jim Meyering. */ #include /* Specification. */ #include "version-etc.h" #include #include #if USE_UNLOCKED_IO # include "unlocked-io.h" #endif #include "gettext.h" #define _(msgid) gettext (msgid) /* If you use AM_INIT_AUTOMAKE's no-define option, PACKAGE is not defined. Use PACKAGE_TARNAME instead. */ #if ! defined PACKAGE && defined PACKAGE_TARNAME # define PACKAGE PACKAGE_TARNAME #endif enum { COPYRIGHT_YEAR = 2020 }; /* The three functions below display the --version information the standard way. If COMMAND_NAME is NULL, the PACKAGE is assumed to be the name of the program. The formats are therefore: PACKAGE VERSION or COMMAND_NAME (PACKAGE) VERSION. The functions differ in the way they are passed author names. */ /* Display the --version information the standard way. Author names are given in the array AUTHORS. N_AUTHORS is the number of elements in the array. */ void version_etc_arn (FILE *stream, const char *command_name, const char *package, const char *version, const char * const * authors, size_t n_authors) { if (command_name) fprintf (stream, "%s (%s) %s\n", command_name, package, version); else fprintf (stream, "%s %s\n", package, version); #ifdef PACKAGE_PACKAGER # ifdef PACKAGE_PACKAGER_VERSION fprintf (stream, _("Packaged by %s (%s)\n"), PACKAGE_PACKAGER, PACKAGE_PACKAGER_VERSION); # else fprintf (stream, _("Packaged by %s\n"), PACKAGE_PACKAGER); # endif #endif /* TRANSLATORS: Translate "(C)" to the copyright symbol (C-in-a-circle), if this symbol is available in the user's locale. Otherwise, do not translate "(C)"; leave it as-is. */ fprintf (stream, version_etc_copyright, _("(C)"), COPYRIGHT_YEAR); fputs ("\n", stream); /* TRANSLATORS: The %s placeholder is the web address of the GPL license. */ fprintf (stream, _("\ License GPLv3+: GNU GPL version 3 or later <%s>.\n\ This is free software: you are free to change and redistribute it.\n\ There is NO WARRANTY, to the extent permitted by law.\n\ "), "https://gnu.org/licenses/gpl.html"); fputs ("\n", stream); switch (n_authors) { case 0: /* No authors are given. The caller should output authorship info after calling this function. */ break; case 1: /* TRANSLATORS: %s denotes an author name. */ fprintf (stream, _("Written by %s.\n"), authors[0]); break; case 2: /* TRANSLATORS: Each %s denotes an author name. */ fprintf (stream, _("Written by %s and %s.\n"), authors[0], authors[1]); break; case 3: /* TRANSLATORS: Each %s denotes an author name. */ fprintf (stream, _("Written by %s, %s, and %s.\n"), authors[0], authors[1], authors[2]); break; case 4: /* TRANSLATORS: Each %s denotes an author name. You can use line breaks, estimating that each author name occupies ca. 16 screen columns and that a screen line has ca. 80 columns. */ fprintf (stream, _("Written by %s, %s, %s,\nand %s.\n"), authors[0], authors[1], authors[2], authors[3]); break; case 5: /* TRANSLATORS: Each %s denotes an author name. You can use line breaks, estimating that each author name occupies ca. 16 screen columns and that a screen line has ca. 80 columns. */ fprintf (stream, _("Written by %s, %s, %s,\n%s, and %s.\n"), authors[0], authors[1], authors[2], authors[3], authors[4]); break; case 6: /* TRANSLATORS: Each %s denotes an author name. You can use line breaks, estimating that each author name occupies ca. 16 screen columns and that a screen line has ca. 80 columns. */ fprintf (stream, _("Written by %s, %s, %s,\n%s, %s, and %s.\n"), authors[0], authors[1], authors[2], authors[3], authors[4], authors[5]); break; case 7: /* TRANSLATORS: Each %s denotes an author name. You can use line breaks, estimating that each author name occupies ca. 16 screen columns and that a screen line has ca. 80 columns. */ fprintf (stream, _("Written by %s, %s, %s,\n%s, %s, %s, and %s.\n"), authors[0], authors[1], authors[2], authors[3], authors[4], authors[5], authors[6]); break; case 8: /* TRANSLATORS: Each %s denotes an author name. You can use line breaks, estimating that each author name occupies ca. 16 screen columns and that a screen line has ca. 80 columns. */ fprintf (stream, _("\ Written by %s, %s, %s,\n%s, %s, %s, %s,\nand %s.\n"), authors[0], authors[1], authors[2], authors[3], authors[4], authors[5], authors[6], authors[7]); break; case 9: /* TRANSLATORS: Each %s denotes an author name. You can use line breaks, estimating that each author name occupies ca. 16 screen columns and that a screen line has ca. 80 columns. */ fprintf (stream, _("\ Written by %s, %s, %s,\n%s, %s, %s, %s,\n%s, and %s.\n"), authors[0], authors[1], authors[2], authors[3], authors[4], authors[5], authors[6], authors[7], authors[8]); break; default: /* 10 or more authors. Use an abbreviation, since the human reader will probably not want to read the entire list anyway. */ /* TRANSLATORS: Each %s denotes an author name. You can use line breaks, estimating that each author name occupies ca. 16 screen columns and that a screen line has ca. 80 columns. */ fprintf (stream, _("\ Written by %s, %s, %s,\n%s, %s, %s, %s,\n%s, %s, and others.\n"), authors[0], authors[1], authors[2], authors[3], authors[4], authors[5], authors[6], authors[7], authors[8]); break; } } /* Display the --version information the standard way. See the initial comment to this module, for more information. Author names are given in the NULL-terminated array AUTHORS. */ void version_etc_ar (FILE *stream, const char *command_name, const char *package, const char *version, const char * const * authors) { size_t n_authors; for (n_authors = 0; authors[n_authors]; n_authors++) ; version_etc_arn (stream, command_name, package, version, authors, n_authors); } /* Display the --version information the standard way. See the initial comment to this module, for more information. Author names are given in the NULL-terminated va_list AUTHORS. */ void version_etc_va (FILE *stream, const char *command_name, const char *package, const char *version, va_list authors) { size_t n_authors; const char *authtab[10]; for (n_authors = 0; n_authors < 10 && (authtab[n_authors] = va_arg (authors, const char *)) != NULL; n_authors++) ; version_etc_arn (stream, command_name, package, version, authtab, n_authors); } /* Display the --version information the standard way. If COMMAND_NAME is NULL, the PACKAGE is assumed to be the name of the program. The formats are therefore: PACKAGE VERSION or COMMAND_NAME (PACKAGE) VERSION. The authors names are passed as separate arguments, with an additional NULL argument at the end. */ void version_etc (FILE *stream, const char *command_name, const char *package, const char *version, /* const char *author1, ...*/ ...) { va_list authors; va_start (authors, version); version_etc_va (stream, command_name, package, version, authors); va_end (authors); } void emit_bug_reporting_address (void) { fputs ("\n", stdout); /* TRANSLATORS: The placeholder indicates the bug-reporting address for this package. Please add _another line_ saying "Report translation bugs to <...>\n" with the address for translation bugs (typically your translation team's web or email address). */ printf (_("Report bugs to: %s\n"), PACKAGE_BUGREPORT); #ifdef PACKAGE_PACKAGER_BUG_REPORTS printf (_("Report %s bugs to: %s\n"), PACKAGE_PACKAGER, PACKAGE_PACKAGER_BUG_REPORTS); #endif #ifdef PACKAGE_URL printf (_("%s home page: <%s>\n"), PACKAGE_NAME, PACKAGE_URL); #else printf (_("%s home page: <%s>\n"), PACKAGE_NAME, "https://www.gnu.org/software/" PACKAGE "/"); #endif printf (_("General help using GNU software: <%s>\n"), "https://www.gnu.org/gethelp/"); } pspp-1.4.1/gl/relocatable.h0000644000175000017500000000755113723215640015156 0ustar00blpblp00000000000000/* Provide relocatable packages. Copyright (C) 2003, 2005, 2008-2020 Free Software Foundation, Inc. Written by Bruno Haible , 2003. 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 3 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, see . */ #ifndef _RELOCATABLE_H #define _RELOCATABLE_H #ifdef __cplusplus extern "C" { #endif /* This can be enabled through the configure --enable-relocatable option. */ #if ENABLE_RELOCATABLE /* When building a DLL, we must export some functions. Note that because this is a private .h file, we don't need to use __declspec(dllimport) in any case. */ #if HAVE_VISIBILITY && BUILDING_DLL # define RELOCATABLE_DLL_EXPORTED __attribute__((__visibility__("default"))) #elif defined _MSC_VER && BUILDING_DLL # define RELOCATABLE_DLL_EXPORTED __declspec(dllexport) #else # define RELOCATABLE_DLL_EXPORTED #endif /* Sets the original and the current installation prefix of the package. Relocation simply replaces a pathname starting with the original prefix by the corresponding pathname with the current prefix instead. Both prefixes should be directory names without trailing slash (i.e. use "" instead of "/"). */ extern RELOCATABLE_DLL_EXPORTED void set_relocation_prefix (const char *orig_prefix, const char *curr_prefix); /* Returns the pathname, relocated according to the current installation directory. The returned string is either PATHNAME unmodified or a freshly allocated string that you can free with free() after casting it to 'char *'. */ extern const char * relocate (const char *pathname); /* Returns the pathname, relocated according to the current installation directory. This function sets *ALLOCATEDP to the allocated memory, or to NULL if no memory allocation occurs. So that, after you're done with the return value, to reclaim allocated memory, you can do: free (*ALLOCATEDP). */ extern const char * relocate2 (const char *pathname, char **allocatedp); /* Memory management: relocate() potentially allocates memory, because it has to construct a fresh pathname. If this is a problem because your program calls relocate() frequently or because you want to fix all potential memory leaks anyway, you have three options: 1) Use this idiom: const char *pathname = ...; const char *rel_pathname = relocate (pathname); ... if (rel_pathname != pathname) free ((char *) rel_pathname); 2) Use this idiom: char *allocated; const char *rel_pathname = relocate2 (..., &allocated); ... free (allocated); 3) Think about caching the result. */ /* Convenience function: Computes the current installation prefix, based on the original installation prefix, the original installation directory of a particular file, and the current pathname of this file. Returns it, freshly allocated. Returns NULL upon failure. */ extern char * compute_curr_prefix (const char *orig_installprefix, const char *orig_installdir, const char *curr_pathname); #else /* By default, we use the hardwired pathnames. */ #define relocate(pathname) (pathname) #define relocate2(pathname,allocatedp) (*(allocatedp) = NULL, (pathname)) #endif #ifdef __cplusplus } #endif #endif /* _RELOCATABLE_H */ pspp-1.4.1/gl/strnlen.c0000644000175000017500000000216513723215640014355 0ustar00blpblp00000000000000/* Find the length of STRING, but scan at most MAXLEN characters. Copyright (C) 2005-2007, 2009-2020 Free Software Foundation, Inc. Written by Simon Josefsson. 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 3, 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, see . */ #include #include /* Find the length of STRING, but scan at most MAXLEN characters. If no '\0' terminator is found in that many characters, return MAXLEN. */ size_t strnlen (const char *string, size_t maxlen) { const char *end = memchr (string, '\0', maxlen); return end ? (size_t) (end - string) : maxlen; } pspp-1.4.1/gl/locale.in.h0000644000175000017500000002350313723215637014546 0ustar00blpblp00000000000000/* A POSIX . Copyright (C) 2007-2020 Free Software Foundation, Inc. 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 3 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, see . */ #if __GNUC__ >= 3 @PRAGMA_SYSTEM_HEADER@ #endif @PRAGMA_COLUMNS@ #if (defined _WIN32 && !defined __CYGWIN__ && defined __need_locale_t) \ || defined _GL_ALREADY_INCLUDING_LOCALE_H /* Special invocation convention: - Inside mingw header files, - To handle Solaris header files (through Solaris 10) when combined with gettext's libintl.h. */ #@INCLUDE_NEXT@ @NEXT_LOCALE_H@ #else /* Normal invocation convention. */ #ifndef _@GUARD_PREFIX@_LOCALE_H #define _GL_ALREADY_INCLUDING_LOCALE_H /* The include_next requires a split double-inclusion guard. */ #@INCLUDE_NEXT@ @NEXT_LOCALE_H@ #undef _GL_ALREADY_INCLUDING_LOCALE_H #ifndef _@GUARD_PREFIX@_LOCALE_H #define _@GUARD_PREFIX@_LOCALE_H /* NetBSD 5.0 mis-defines NULL. */ #include /* Mac OS X 10.5 defines the locale_t type in . */ #if @HAVE_XLOCALE_H@ # include #endif /* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */ /* The definition of _GL_ARG_NONNULL is copied here. */ /* The definition of _GL_WARN_ON_USE is copied here. */ /* The LC_MESSAGES locale category is specified in POSIX, but not in ISO C. On systems that don't define it, use the same value as GNU libintl. */ #if !defined LC_MESSAGES # define LC_MESSAGES 1729 #endif /* On native Windows with MSVC, 'struct lconv' lacks the members int_p_* and int_n_*. Instead of overriding 'struct lconv', merely define these member names as macros. This avoids trouble in C++ mode. */ #if defined _MSC_VER # define int_p_cs_precedes p_cs_precedes # define int_p_sign_posn p_sign_posn # define int_p_sep_by_space p_sep_by_space # define int_n_cs_precedes n_cs_precedes # define int_n_sign_posn n_sign_posn # define int_n_sep_by_space n_sep_by_space #endif /* Bionic libc's 'struct lconv' is just a dummy. */ #if @REPLACE_STRUCT_LCONV@ # define lconv rpl_lconv struct lconv { /* All 'char *' are actually 'const char *'. */ /* Members that depend on the LC_NUMERIC category of the locale. See */ /* Symbol used as decimal point. */ char *decimal_point; /* Symbol used to separate groups of digits to the left of the decimal point. */ char *thousands_sep; /* Definition of the size of groups of digits to the left of the decimal point. */ char *grouping; /* Members that depend on the LC_MONETARY category of the locale. See */ /* Symbol used as decimal point. */ char *mon_decimal_point; /* Symbol used to separate groups of digits to the left of the decimal point. */ char *mon_thousands_sep; /* Definition of the size of groups of digits to the left of the decimal point. */ char *mon_grouping; /* Sign used to indicate a value >= 0. */ char *positive_sign; /* Sign used to indicate a value < 0. */ char *negative_sign; /* For formatting local currency. */ /* Currency symbol (3 characters) followed by separator (1 character). */ char *currency_symbol; /* Number of digits after the decimal point. */ char frac_digits; /* For values >= 0: 1 if the currency symbol precedes the number, 0 if it comes after the number. */ char p_cs_precedes; /* For values >= 0: Position of the sign. */ char p_sign_posn; /* For values >= 0: Placement of spaces between currency symbol, sign, and number. */ char p_sep_by_space; /* For values < 0: 1 if the currency symbol precedes the number, 0 if it comes after the number. */ char n_cs_precedes; /* For values < 0: Position of the sign. */ char n_sign_posn; /* For values < 0: Placement of spaces between currency symbol, sign, and number. */ char n_sep_by_space; /* For formatting international currency. */ /* Currency symbol (3 characters) followed by separator (1 character). */ char *int_curr_symbol; /* Number of digits after the decimal point. */ char int_frac_digits; /* For values >= 0: 1 if the currency symbol precedes the number, 0 if it comes after the number. */ char int_p_cs_precedes; /* For values >= 0: Position of the sign. */ char int_p_sign_posn; /* For values >= 0: Placement of spaces between currency symbol, sign, and number. */ char int_p_sep_by_space; /* For values < 0: 1 if the currency symbol precedes the number, 0 if it comes after the number. */ char int_n_cs_precedes; /* For values < 0: Position of the sign. */ char int_n_sign_posn; /* For values < 0: Placement of spaces between currency symbol, sign, and number. */ char int_n_sep_by_space; }; #endif #if @GNULIB_LOCALECONV@ # if @REPLACE_LOCALECONV@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef localeconv # define localeconv rpl_localeconv # endif _GL_FUNCDECL_RPL (localeconv, struct lconv *, (void)); _GL_CXXALIAS_RPL (localeconv, struct lconv *, (void)); # else _GL_CXXALIAS_SYS (localeconv, struct lconv *, (void)); # endif # if __GLIBC__ >= 2 _GL_CXXALIASWARN (localeconv); # endif #elif @REPLACE_STRUCT_LCONV@ # undef localeconv # define localeconv localeconv_used_without_requesting_gnulib_module_localeconv #elif defined GNULIB_POSIXCHECK # undef localeconv # if HAVE_RAW_DECL_LOCALECONV _GL_WARN_ON_USE (localeconv, "localeconv returns too few information on some platforms - " "use gnulib module localeconv for portability"); # endif #endif #if @GNULIB_SETLOCALE@ # if @REPLACE_SETLOCALE@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef setlocale # define setlocale rpl_setlocale # define GNULIB_defined_setlocale 1 # endif _GL_FUNCDECL_RPL (setlocale, char *, (int category, const char *locale)); _GL_CXXALIAS_RPL (setlocale, char *, (int category, const char *locale)); # else _GL_CXXALIAS_SYS (setlocale, char *, (int category, const char *locale)); # endif # if __GLIBC__ >= 2 _GL_CXXALIASWARN (setlocale); # endif #elif defined GNULIB_POSIXCHECK # undef setlocale # if HAVE_RAW_DECL_SETLOCALE _GL_WARN_ON_USE (setlocale, "setlocale works differently on native Windows - " "use gnulib module setlocale for portability"); # endif #endif #if @GNULIB_SETLOCALE_NULL@ /* Included here for convenience. */ # include "setlocale_null.h" #endif #if /*@GNULIB_NEWLOCALE@ ||*/ (@GNULIB_LOCALENAME@ && @HAVE_NEWLOCALE@) # if @REPLACE_NEWLOCALE@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef newlocale # define newlocale rpl_newlocale # define GNULIB_defined_newlocale 1 # endif _GL_FUNCDECL_RPL (newlocale, locale_t, (int category_mask, const char *name, locale_t base) _GL_ARG_NONNULL ((2))); _GL_CXXALIAS_RPL (newlocale, locale_t, (int category_mask, const char *name, locale_t base)); # else # if @HAVE_NEWLOCALE@ _GL_CXXALIAS_SYS (newlocale, locale_t, (int category_mask, const char *name, locale_t base)); # endif # endif # if @HAVE_NEWLOCALE@ _GL_CXXALIASWARN (newlocale); # endif # if @HAVE_NEWLOCALE@ || @REPLACE_NEWLOCALE@ # ifndef HAVE_WORKING_NEWLOCALE # define HAVE_WORKING_NEWLOCALE 1 # endif # endif #elif defined GNULIB_POSIXCHECK # undef newlocale # if HAVE_RAW_DECL_NEWLOCALE _GL_WARN_ON_USE (newlocale, "newlocale is not portable"); # endif #endif #if @GNULIB_DUPLOCALE@ || (@GNULIB_LOCALENAME@ && @HAVE_DUPLOCALE@) # if @REPLACE_DUPLOCALE@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef duplocale # define duplocale rpl_duplocale # define GNULIB_defined_duplocale 1 # endif _GL_FUNCDECL_RPL (duplocale, locale_t, (locale_t locale) _GL_ARG_NONNULL ((1))); _GL_CXXALIAS_RPL (duplocale, locale_t, (locale_t locale)); # else # if @HAVE_DUPLOCALE@ _GL_CXXALIAS_SYS (duplocale, locale_t, (locale_t locale)); # endif # endif # if @HAVE_DUPLOCALE@ _GL_CXXALIASWARN (duplocale); # endif # if @HAVE_DUPLOCALE@ || @REPLACE_DUPLOCALE@ # ifndef HAVE_WORKING_DUPLOCALE # define HAVE_WORKING_DUPLOCALE 1 # endif # endif #elif defined GNULIB_POSIXCHECK # undef duplocale # if HAVE_RAW_DECL_DUPLOCALE _GL_WARN_ON_USE (duplocale, "duplocale is buggy on some glibc systems - " "use gnulib module duplocale for portability"); # endif #endif #if /*@GNULIB_FREELOCALE@ ||*/ (@GNULIB_LOCALENAME@ && @HAVE_FREELOCALE@) # if @REPLACE_FREELOCALE@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef freelocale # define freelocale rpl_freelocale # define GNULIB_defined_freelocale 1 # endif _GL_FUNCDECL_RPL (freelocale, void, (locale_t locale) _GL_ARG_NONNULL ((1))); _GL_CXXALIAS_RPL (freelocale, void, (locale_t locale)); # else # if @HAVE_FREELOCALE@ /* Need to cast, because on FreeBSD and Mac OS X 10.13, the return type is int. */ _GL_CXXALIAS_SYS_CAST (freelocale, void, (locale_t locale)); # endif # endif # if @HAVE_FREELOCALE@ _GL_CXXALIASWARN (freelocale); # endif #elif defined GNULIB_POSIXCHECK # undef freelocale # if HAVE_RAW_DECL_FREELOCALE _GL_WARN_ON_USE (freelocale, "freelocale is not portable"); # endif #endif #endif /* _@GUARD_PREFIX@_LOCALE_H */ #endif /* _@GUARD_PREFIX@_LOCALE_H */ #endif /* !(__need_locale_t || _GL_ALREADY_INCLUDING_LOCALE_H) */ pspp-1.4.1/gl/allocator.c0000644000175000017500000000025113723215636014647 0ustar00blpblp00000000000000#define _GL_USE_STDLIB_ALLOC 1 #include #include "allocator.h" #include struct allocator const stdlib_allocator = { malloc, realloc, free, NULL }; pspp-1.4.1/gl/mbiter.c0000644000175000017500000000012013723215637014145 0ustar00blpblp00000000000000#include #define MBITER_INLINE _GL_EXTERN_INLINE #include "mbiter.h" pspp-1.4.1/gl/error.h0000644000175000017500000000443213723215636014032 0ustar00blpblp00000000000000/* Declaration for error-reporting function Copyright (C) 1995-1997, 2003, 2006, 2008-2020 Free Software Foundation, Inc. This file is part of the GNU C Library. 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 3 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, see . */ #ifndef _ERROR_H #define _ERROR_H 1 /* On mingw, the flavor of printf depends on whether the extensions module * is in use; the check for determines the witness macro. */ #ifndef _GL_ATTRIBUTE_SPEC_PRINTF # if GNULIB_PRINTF_ATTRIBUTE_FLAVOR_GNU # define _GL_ATTRIBUTE_SPEC_PRINTF __gnu_printf__ # else # define _GL_ATTRIBUTE_SPEC_PRINTF __printf__ # endif #endif #ifdef __cplusplus extern "C" { #endif /* Print a message with 'fprintf (stderr, FORMAT, ...)'; if ERRNUM is nonzero, follow it with ": " and strerror (ERRNUM). If STATUS is nonzero, terminate the program with 'exit (STATUS)'. */ extern void error (int __status, int __errnum, const char *__format, ...) _GL_ATTRIBUTE_FORMAT ((_GL_ATTRIBUTE_SPEC_PRINTF, 3, 4)); extern void error_at_line (int __status, int __errnum, const char *__fname, unsigned int __lineno, const char *__format, ...) _GL_ATTRIBUTE_FORMAT ((_GL_ATTRIBUTE_SPEC_PRINTF, 5, 6)); /* If NULL, error will flush stdout, then print on stderr the program name, a colon and a space. Otherwise, error will call this function without parameters instead. */ extern void (*error_print_progname) (void); /* This variable is incremented each time 'error' is called. */ extern unsigned int error_message_count; /* Sometimes we want to have at most one error per line. This variable controls whether this mode is selected or not. */ extern int error_one_per_line; #ifdef __cplusplus } #endif #endif /* error.h */ pspp-1.4.1/gl/progreloc.c0000644000175000017500000003534713723215640014674 0ustar00blpblp00000000000000/* Provide relocatable programs. Copyright (C) 2003-2020 Free Software Foundation, Inc. Written by Bruno Haible , 2003. 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 3 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, see . */ #define _GL_USE_STDLIB_ALLOC 1 #include /* Specification. */ #include "progname.h" #include #include #include #include #include #include #include #include /* Get declaration of _NSGetExecutablePath on Mac OS X 10.2 or newer. */ #if HAVE_MACH_O_DYLD_H # include #endif #if defined _WIN32 && !defined __CYGWIN__ # define WINDOWS_NATIVE #endif #ifdef WINDOWS_NATIVE # define WIN32_LEAN_AND_MEAN # include #endif #ifdef __EMX__ # define INCL_DOS # include #endif #include "relocatable.h" #ifdef NO_XMALLOC # include "areadlink.h" # define xreadlink areadlink #else # include "xreadlink.h" #endif #ifdef NO_XMALLOC # define xmalloc malloc # define xstrdup strdup #else # include "xalloc.h" #endif #ifndef O_EXEC # define O_EXEC O_RDONLY /* This is often close enough in older systems. */ #endif #if defined IN_RELOCWRAPPER && (!defined O_CLOEXEC || GNULIB_defined_O_CLOEXEC) # undef O_CLOEXEC # define O_CLOEXEC 0 #endif /* Declare canonicalize_file_name. The included above may be the system's one, not the gnulib one. */ extern char * canonicalize_file_name (const char *name); #if defined WINDOWS_NATIVE /* Don't assume that UNICODE is not defined. */ # undef GetModuleFileName # define GetModuleFileName GetModuleFileNameA #endif /* Pathname support. ISSLASH(C) tests whether C is a directory separator character. IS_FILE_NAME_WITH_DIR(P) tests whether P contains a directory specification. */ #if (defined _WIN32 && !defined __CYGWIN__) || defined __EMX__ || defined __DJGPP__ /* Native Windows, OS/2, DOS */ # define ISSLASH(C) ((C) == '/' || (C) == '\\') # define HAS_DEVICE(P) \ ((((P)[0] >= 'A' && (P)[0] <= 'Z') || ((P)[0] >= 'a' && (P)[0] <= 'z')) \ && (P)[1] == ':') # define IS_FILE_NAME_WITH_DIR(P) \ (strchr (P, '/') != NULL || strchr (P, '\\') != NULL || HAS_DEVICE (P)) # define FILE_SYSTEM_PREFIX_LEN(P) (HAS_DEVICE (P) ? 2 : 0) #else /* Unix */ # define ISSLASH(C) ((C) == '/') # define IS_FILE_NAME_WITH_DIR(P) (strchr (P, '/') != NULL) # define FILE_SYSTEM_PREFIX_LEN(P) 0 #endif /* Use the system functions, not the gnulib overrides in this file. */ #undef sprintf #undef set_program_name #if ENABLE_RELOCATABLE #ifdef __sun /* Helper function, from gnulib module 'safe-read'. */ static size_t safe_read (int fd, void *buf, size_t count) { for (;;) { ssize_t result = read (fd, buf, count); if (0 <= result || errno != EINTR) return result; } } /* Helper function, from gnulib module 'full-read'. */ static size_t full_read (int fd, void *buf, size_t count) { size_t total = 0; const char *ptr = (const char *) buf; while (count > 0) { size_t n = safe_read (fd, ptr, count); if (n == (size_t) -1) break; if (n == 0) { errno = 0; break; } total += n; ptr += n; count -= n; } return total; } #endif #if defined __linux__ || defined __CYGWIN__ /* File descriptor of the executable. (Only used to verify that we find the correct executable.) */ static int executable_fd = -1; #endif /* Define this function only when it's needed. */ #if !(defined WINDOWS_NATIVE || defined __EMX__) /* Tests whether a given filename may belong to the executable. */ static bool maybe_executable (const char *filename) { /* The native Windows API lacks the access() function. */ # if !defined WINDOWS_NATIVE if (access (filename, X_OK) < 0) return false; # endif # if defined __linux__ || defined __CYGWIN__ if (executable_fd >= 0) { /* If we already have an executable_fd, check that filename points to the same inode. */ struct stat statexe; struct stat statfile; if (fstat (executable_fd, &statexe) >= 0) return (stat (filename, &statfile) >= 0 && statfile.st_dev && statfile.st_dev == statexe.st_dev && statfile.st_ino == statexe.st_ino); } # endif /* Check that the filename does not point to a directory. */ { struct stat statfile; return (stat (filename, &statfile) >= 0 && ! S_ISDIR (statfile.st_mode)); } } #endif /* Determine the full pathname of the current executable, freshly allocated. Return NULL if unknown. Guaranteed to work on Linux and native Windows. Likely to work on the other Unixes (maybe except BeOS), under most conditions. */ static char * find_executable (const char *argv0) { #if defined WINDOWS_NATIVE /* Native Windows only. On Cygwin, it is better to use the Cygwin provided /proc interface, than to use native Windows API and cygwin_conv_to_posix_path, because it supports longer file names (see ). */ char location[MAX_PATH]; int length = GetModuleFileName (NULL, location, sizeof (location)); if (length < 0) return NULL; if (!IS_FILE_NAME_WITH_DIR (location)) /* Shouldn't happen. */ return NULL; return xstrdup (location); #elif defined __EMX__ PPIB ppib; char location[CCHMAXPATH]; /* See http://cyberkinetica.homeunix.net/os2tk45/cp1/619_L2H_DosGetInfoBlocksSynt.html for specification of DosGetInfoBlocks(). */ if (DosGetInfoBlocks (NULL, &ppib)) return NULL; /* See http://cyberkinetica.homeunix.net/os2tk45/cp1/1247_L2H_DosQueryModuleNameSy.html for specification of DosQueryModuleName(). */ if (DosQueryModuleName (ppib->pib_hmte, sizeof (location), location)) return NULL; _fnslashify (location); return xstrdup (location); #else /* Unix */ # if defined __linux__ /* The executable is accessible as /proc//exe. In newer Linux versions, also as /proc/self/exe. Linux >= 2.1 provides a symlink to the true pathname; older Linux versions give only device and ino, enclosed in brackets, which we cannot use here. */ { char *link; link = xreadlink ("/proc/self/exe"); if (link != NULL && link[0] != '[') return link; if (executable_fd < 0) executable_fd = open ("/proc/self/exe", O_EXEC | O_CLOEXEC, 0); { char buf[6+10+5]; sprintf (buf, "/proc/%d/exe", getpid ()); link = xreadlink (buf); if (link != NULL && link[0] != '[') return link; if (executable_fd < 0) executable_fd = open (buf, O_EXEC | O_CLOEXEC, 0); } } # endif # if defined __ANDROID__ || defined __FreeBSD_kernel__ /* On Android and GNU/kFreeBSD, the executable is accessible as /proc//exe and /proc/self/exe. */ { char *link; link = xreadlink ("/proc/self/exe"); if (link != NULL) return link; } # endif # if defined __FreeBSD__ || defined __DragonFly__ /* In FreeBSD >= 5.0, the executable is accessible as /proc//file and /proc/curproc/file. */ { char *link; link = xreadlink ("/proc/curproc/file"); if (link != NULL) { if (strcmp (link, "unknown") != 0) return link; free (link); } } # endif # if defined __NetBSD__ /* In NetBSD >= 4.0, the executable is accessible as /proc//exe and /proc/curproc/exe. */ { char *link; link = xreadlink ("/proc/curproc/exe"); if (link != NULL) return link; } # endif # if defined __sun /* On Solaris >= 11.4, /proc//execname and /proc/self/execname contains the name of the executable, either as an absolute file name or relative to the current directory. */ { char namebuf[4096]; int fd = open ("/proc/self/execname", O_RDONLY | O_CLOEXEC, 0); if (fd >= 0) { size_t len = full_read (fd, namebuf, sizeof (namebuf)); close (fd); if (len > 0 && len < sizeof (namebuf)) { namebuf[len] = '\0'; return canonicalize_file_name (namebuf); } } } # endif # if defined __CYGWIN__ /* The executable is accessible as /proc//exe, at least in Cygwin >= 1.5. */ { char *link; link = xreadlink ("/proc/self/exe"); if (link != NULL) return link; if (executable_fd < 0) executable_fd = open ("/proc/self/exe", O_EXEC | O_CLOEXEC, 0); } # endif # if HAVE_MACH_O_DYLD_H && HAVE__NSGETEXECUTABLEPATH /* On Mac OS X 10.2 or newer, the function int _NSGetExecutablePath (char *buf, uint32_t *bufsize); can be used to retrieve the executable's full path. */ char location[4096]; unsigned int length = sizeof (location); if (_NSGetExecutablePath (location, &length) == 0 && location[0] == '/') return canonicalize_file_name (location); # endif /* Guess the executable's full path. We assume the executable has been called via execlp() or execvp() with properly set up argv[0]. The login(1) convention to add a '-' prefix to argv[0] is not supported. */ { bool has_slash = false; { const char *p; for (p = argv0; *p; p++) if (*p == '/') { has_slash = true; break; } } if (!has_slash) { /* exec searches paths without slashes in the directory list given by $PATH. */ const char *path = getenv ("PATH"); if (path != NULL) { const char *p; const char *p_next; for (p = path; *p; p = p_next) { const char *q; size_t p_len; char *concat_name; for (q = p; *q; q++) if (*q == ':') break; p_len = q - p; p_next = (*q == '\0' ? q : q + 1); /* We have a path item at p, of length p_len. Now concatenate the path item and argv0. */ concat_name = (char *) xmalloc (p_len + strlen (argv0) + 2); # ifdef NO_XMALLOC if (concat_name == NULL) return NULL; # endif if (p_len == 0) /* An empty PATH element designates the current directory. */ strcpy (concat_name, argv0); else { memcpy (concat_name, p, p_len); concat_name[p_len] = '/'; strcpy (concat_name + p_len + 1, argv0); } if (maybe_executable (concat_name)) return canonicalize_file_name (concat_name); free (concat_name); } } /* Not found in the PATH, assume the current directory. */ } /* exec treats paths containing slashes as relative to the current directory. */ if (maybe_executable (argv0)) return canonicalize_file_name (argv0); } /* No way to find the executable. */ return NULL; #endif } /* Full pathname of executable, or NULL. */ static char *executable_fullname; static void prepare_relocate (const char *orig_installprefix, const char *orig_installdir, const char *argv0) { char *curr_prefix; /* Determine the full pathname of the current executable. */ executable_fullname = find_executable (argv0); /* Determine the current installation prefix from it. */ curr_prefix = compute_curr_prefix (orig_installprefix, orig_installdir, executable_fullname); if (curr_prefix != NULL) { /* Now pass this prefix to all copies of the relocate.c source file. */ set_relocation_prefix (orig_installprefix, curr_prefix); free (curr_prefix); } } /* Set program_name, based on argv[0], and original installation prefix and directory, for relocatability. */ void set_program_name_and_installdir (const char *argv0, const char *orig_installprefix, const char *orig_installdir) { const char *argv0_stripped = argv0; /* Relocatable programs are renamed to .bin by install-reloc. Or, more generally, their suffix is changed from $exeext to .bin$exeext. Remove the ".bin" here. */ { size_t argv0_len = strlen (argv0); const size_t exeext_len = sizeof (EXEEXT) - sizeof (""); if (argv0_len > 4 + exeext_len) if (memcmp (argv0 + argv0_len - exeext_len - 4, ".bin", 4) == 0) { if (sizeof (EXEEXT) > sizeof ("")) { /* Compare using an inlined copy of c_strncasecmp(), because the filenames may have undergone a case conversion since they were packaged. In other words, EXEEXT may be ".exe" on one system and ".EXE" on another. */ static const char exeext[] = EXEEXT; const char *s1 = argv0 + argv0_len - exeext_len; const char *s2 = exeext; for (; *s1 != '\0'; s1++, s2++) { unsigned char c1 = *s1; unsigned char c2 = *s2; if ((c1 >= 'A' && c1 <= 'Z' ? c1 - 'A' + 'a' : c1) != (c2 >= 'A' && c2 <= 'Z' ? c2 - 'A' + 'a' : c2)) goto done_stripping; } } /* Remove ".bin" before EXEEXT or its equivalent. */ { char *shorter = (char *) xmalloc (argv0_len - 4 + 1); #ifdef NO_XMALLOC if (shorter != NULL) #endif { memcpy (shorter, argv0, argv0_len - exeext_len - 4); if (sizeof (EXEEXT) > sizeof ("")) memcpy (shorter + argv0_len - exeext_len - 4, argv0 + argv0_len - exeext_len - 4, exeext_len); shorter[argv0_len - 4] = '\0'; argv0_stripped = shorter; } } done_stripping: ; } } set_program_name (argv0_stripped); prepare_relocate (orig_installprefix, orig_installdir, argv0); } /* Return the full pathname of the current executable, based on the earlier call to set_program_name_and_installdir. Return NULL if unknown. */ char * get_full_program_name (void) { return executable_fullname; } #endif pspp-1.4.1/gl/c-strcasecmp.c0000644000175000017500000000302513723215636015255 0ustar00blpblp00000000000000/* c-strcasecmp.c -- case insensitive string comparator in C locale Copyright (C) 1998-1999, 2005-2006, 2009-2020 Free Software Foundation, Inc. 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 3, 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, see . */ #include /* Specification. */ #include "c-strcase.h" #include #include "c-ctype.h" int c_strcasecmp (const char *s1, const char *s2) { register const unsigned char *p1 = (const unsigned char *) s1; register const unsigned char *p2 = (const unsigned char *) s2; unsigned char c1, c2; if (p1 == p2) return 0; do { c1 = c_tolower (*p1); c2 = c_tolower (*p2); if (c1 == '\0') break; ++p1; ++p2; } while (c1 == c2); if (UCHAR_MAX <= INT_MAX) return c1 - c2; else /* On machines where 'char' and 'int' are types of the same size, the difference of two 'unsigned char' values - including the sign bit - doesn't fit in an 'int'. */ return _GL_CMP (c1, c2); } pspp-1.4.1/gl/hard-locale.c0000644000175000017500000000212713723215637015047 0ustar00blpblp00000000000000/* hard-locale.c -- Determine whether a locale is hard. Copyright (C) 1997-1999, 2002-2004, 2006-2007, 2009-2020 Free Software Foundation, Inc. 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 3 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, see . */ #include #include "hard-locale.h" #include #include bool hard_locale (int category) { char locale[SETLOCALE_NULL_MAX]; if (setlocale_null_r (category, locale, sizeof (locale))) return false; return !(strcmp (locale, "C") == 0 || strcmp (locale, "POSIX") == 0); } pspp-1.4.1/gl/gl_anylinked_list1.h0000644000175000017500000000335113723215637016455 0ustar00blpblp00000000000000/* Sequential list data type implemented by a linked list. Copyright (C) 2006, 2009-2020 Free Software Foundation, Inc. Written by Bruno Haible , 2006. 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 3 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, see . */ /* Common code of gl_linked_list.c and gl_linkedhash_list.c. */ /* -------------------------- gl_list_t Data Type -------------------------- */ /* Concrete list node implementation, valid for this file only. */ struct gl_list_node_impl { #if WITH_HASHTABLE struct gl_hash_entry h; /* hash table entry fields; must be first */ #endif struct gl_list_node_impl *next; struct gl_list_node_impl *prev; const void *value; }; /* Concrete gl_list_impl type, valid for this file only. */ struct gl_list_impl { struct gl_list_impl_base base; #if WITH_HASHTABLE /* A hash table: managed as an array of collision lists. */ struct gl_hash_entry **table; size_t table_size; #endif /* A circular list anchored at root. The first node is = root.next, the last node is = root.prev. The root's value is unused. */ struct gl_list_node_impl root; /* Number of list nodes, excluding the root. */ size_t count; }; pspp-1.4.1/gl/stat-time.c0000644000175000017500000000013213723215640014567 0ustar00blpblp00000000000000#include #define _GL_STAT_TIME_INLINE _GL_EXTERN_INLINE #include "stat-time.h" pspp-1.4.1/gl/libc-config.h0000644000175000017500000001266213723215637015062 0ustar00blpblp00000000000000/* System definitions for code taken from the GNU C Library Copyright 2017-2020 Free Software Foundation, Inc. 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 3 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, see . */ /* Written by Paul Eggert. */ /* This is intended to be a good-enough substitute for glibc system macros like those defined in , so that Gnulib code shared with glibc can do this as the first #include: #ifndef _LIBC # include #endif When compiled as part of glibc this is a no-op; when compiled as part of Gnulib this includes Gnulib's and defines macros that glibc library code would normally assume. */ #include /* On glibc this includes and and #defines _FEATURES_H, __WORDSIZE, and __set_errno. On FreeBSD 11 it includes which defines __nonnull. Elsewhere it is harmless. */ #include /* From glibc . */ #ifndef __set_errno # define __set_errno(val) (errno = (val)) #endif /* From glibc . */ #ifndef __GNUC_PREREQ # if defined __GNUC__ && defined __GNUC_MINOR__ # define __GNUC_PREREQ(maj, min) ((maj) < __GNUC__ + ((min) <= __GNUC_MINOR__)) # else # define __GNUC_PREREQ(maj, min) 0 # endif #endif #ifndef __glibc_clang_prereq # if defined __clang_major__ && defined __clang_minor__ # ifdef __apple_build_version__ /* Apple for some reason renumbers __clang_major__ and __clang_minor__. Gnulib code uses only __glibc_clang_prereq (3, 5); map it to 6000000 <= __apple_build_version__. Support for other calls to __glibc_clang_prereq can be added here as needed. */ # define __glibc_clang_prereq(maj, min) \ ((maj) == 3 && (min) == 5 ? 6000000 <= __apple_build_version__ : 0) # else # define __glibc_clang_prereq(maj, min) \ ((maj) < __clang_major__ + ((min) <= __clang_minor__)) # endif # else # define __glibc_clang_prereq(maj, min) 0 # endif #endif /* Prepare to include , which is our copy of glibc . */ /* Define _FEATURES_H so that does not include . */ #ifndef _FEATURES_H # define _FEATURES_H 1 #endif /* Define __WORDSIZE so that does not attempt to include nonexistent files. Make it a syntax error, since Gnulib does not use __WORDSIZE now, and if Gnulib uses it later the syntax error will let us know that __WORDSIZE needs configuring. */ #ifndef __WORDSIZE # define __WORDSIZE %%% #endif /* Undef the macros unconditionally defined by our copy of glibc , so that they do not clash with any system-defined versions. */ #undef _SYS_CDEFS_H #undef __ASMNAME #undef __ASMNAME2 #undef __BEGIN_DECLS #undef __CONCAT #undef __END_DECLS #undef __HAVE_GENERIC_SELECTION #undef __LDBL_COMPAT #undef __LDBL_REDIR #undef __LDBL_REDIR1 #undef __LDBL_REDIR1_DECL #undef __LDBL_REDIR1_NTH #undef __LDBL_REDIR_DECL #undef __LDBL_REDIR_NTH #undef __LEAF #undef __LEAF_ATTR #undef __NTH #undef __NTHNL #undef __P #undef __PMT #undef __REDIRECT #undef __REDIRECT_LDBL #undef __REDIRECT_NTH #undef __REDIRECT_NTHNL #undef __REDIRECT_NTH_LDBL #undef __STRING #undef __THROW #undef __THROWNL #undef __always_inline #undef __attribute__ #undef __attribute_alloc_size__ #undef __attribute_artificial__ #undef __attribute_const__ #undef __attribute_deprecated__ #undef __attribute_deprecated_msg__ #undef __attribute_format_arg__ #undef __attribute_format_strfmon__ #undef __attribute_malloc__ #undef __attribute_noinline__ #undef __attribute_nonstring__ #undef __attribute_pure__ #undef __attribute_used__ #undef __attribute_warn_unused_result__ #undef __bos #undef __bos0 #undef __errordecl #undef __extension__ #undef __extern_always_inline #undef __extern_inline #undef __flexarr #undef __fortify_function #undef __glibc_c99_flexarr_available #undef __glibc_clang_has_extension #undef __glibc_likely #undef __glibc_macro_warning #undef __glibc_macro_warning1 #undef __glibc_unlikely #undef __inline #undef __ptr_t #undef __restrict #undef __restrict_arr #undef __va_arg_pack #undef __va_arg_pack_len #undef __warnattr #undef __warndecl /* Include our copy of glibc . */ #include /* __inline is too pessimistic for non-GCC. */ #undef __inline #ifndef HAVE___INLINE # if 199901 <= __STDC_VERSION__ || defined inline # define __inline inline # else # define __inline # endif #endif /* A substitute for glibc , good enough for Gnulib. */ #define attribute_hidden #define libc_hidden_proto(name, ...) #define libc_hidden_def(name) #define libc_hidden_weak(name) #define libc_hidden_ver(local, name) #define strong_alias(name, aliasname) #define weak_alias(name, aliasname) /* A substitute for glibc , good enough for Gnulib. */ #define SHLIB_COMPAT(lib, introduced, obsoleted) 0 #define compat_symbol(lib, local, symbol, version) extern int dummy #define versioned_symbol(lib, local, symbol, version) extern int dummy pspp-1.4.1/gl/getopt-pfx-ext.h0000644000175000017500000000533213723215637015575 0ustar00blpblp00000000000000/* getopt (GNU extensions) gnulib wrapper header. Copyright (C) 1989-2020 Free Software Foundation, Inc. This file is part of gnulib. Unlike most of the getopt implementation, it is NOT shared with the GNU C Library. This file 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 3 of the License, or (at your option) any later version. This file 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 gnulib; if not, see . */ #ifndef _GETOPT_PFX_EXT_H #define _GETOPT_PFX_EXT_H 1 /* This header should not be used directly; include getopt.h instead. It does not have a protective #error, because the guard macro for getopt.h in gnulib is not fixed. */ /* Standalone applications should #define __GETOPT_PREFIX to an identifier that prefixes the external functions and variables defined in getopt-core.h and getopt-ext.h. Systematically rename identifiers so that they do not collide with the system functions and variables. Renaming avoids problems with some compilers and linkers. */ #ifdef __GETOPT_PREFIX # ifndef __GETOPT_ID # define __GETOPT_CONCAT(x, y) x ## y # define __GETOPT_XCONCAT(x, y) __GETOPT_CONCAT (x, y) # define __GETOPT_ID(y) __GETOPT_XCONCAT (__GETOPT_PREFIX, y) # endif # undef getopt_long # undef getopt_long_only # undef option # undef _getopt_internal # define getopt_long __GETOPT_ID (getopt_long) # define getopt_long_only __GETOPT_ID (getopt_long_only) # define option __GETOPT_ID (option) # define _getopt_internal __GETOPT_ID (getopt_internal) /* The system's getopt.h may have already included getopt-ext.h to declare the unprefixed identifiers. Undef _GETOPT_EXT_H so that getopt-ext.h declares them with prefixes. */ # undef _GETOPT_EXT_H #endif /* Standalone applications get correct prototypes for getopt_long and getopt_long_only; they declare "char **argv". For backward compatibility with old applications, if __GETOPT_PREFIX is not defined, we supply GNU-libc-compatible, but incorrect, prototypes using "char *const *argv". (GNU libc is stuck with the incorrect prototypes, as they are baked into older versions of LSB.) */ #ifndef __getopt_argv_const # if defined __GETOPT_PREFIX # define __getopt_argv_const /* empty */ # else # define __getopt_argv_const const # endif #endif #include #endif /* _GETOPT_PFX_EXT_H */ pspp-1.4.1/gl/fwriteerror.h0000644000175000017500000000506313723215637015255 0ustar00blpblp00000000000000/* Detect write error on a stream. Copyright (C) 2003, 2005-2006, 2009-2020 Free Software Foundation, Inc. Written by Bruno Haible , 2003. 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 3 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, see . */ /* There are two approaches for detecting a write error on a stream opened for writing: (a) Test the return value of every fwrite() or fprintf() call, and react immediately. (b) Just before fclose(), test the error indicator in the stream and the return value of the final fclose() call. The benefit of (a) is that non file related errors (such that ENOMEM during fprintf) and temporary error conditions can be diagnosed accurately. A theoretical benefit of (a) is also that, on POSIX systems, in the case of an ENOSPC error, errno is set and can be used by error() to provide a more accurate error message. But in practice, this benefit is not big because users can easily figure out by themselves why a file cannot be written to, and furthermore the function fwriteerror() can provide errno as well. The big drawback of (a) is extensive error checking code: Every function which does stream output must return an error indicator. This file provides support for (b). */ #include #ifdef __cplusplus extern "C" { #endif /* Write out the not yet written buffered contents of the stream FP, close the stream FP, and test whether some error occurred on the stream FP. FP must be a stream opened for writing. Return 0 if no error occurred and fclose (fp) succeeded. Return -1 and set errno if there was an error. The errno value will be 0 if the cause of the error cannot be determined. For any given stream FP other than stdout, fwriteerror (FP) may only be called once. */ extern int fwriteerror (FILE *fp); /* Likewise, but don't consider it an error if FP has an invalid file descriptor and no output was done to FP. */ extern int fwriteerror_no_ebadf (FILE *fp); #ifdef __cplusplus } #endif pspp-1.4.1/gl/windows-initguard.h0000644000175000017500000000225513723215640016353 0ustar00blpblp00000000000000/* Init guards, somewhat like spinlocks (native Windows implementation). Copyright (C) 2005-2020 Free Software Foundation, Inc. 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 3, 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, see . */ /* Written by Bruno Haible , 2005. Based on GCC's gthr-win32.h. */ #ifndef _WINDOWS_INITGUARD_H #define _WINDOWS_INITGUARD_H #define WIN32_LEAN_AND_MEAN /* avoid including junk */ #include typedef struct { volatile int done; volatile LONG started; } glwthread_initguard_t; #define GLWTHREAD_INITGUARD_INIT { 0, -1 } #endif /* _WINDOWS_INITGUARD_H */ pspp-1.4.1/gl/minmax.h0000644000175000017500000000447113723215637014176 0ustar00blpblp00000000000000/* MIN, MAX macros. Copyright (C) 1995, 1998, 2001, 2003, 2005, 2009-2020 Free Software Foundation, Inc. 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 3, 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, see . */ #ifndef _MINMAX_H #define _MINMAX_H /* Note: MIN, MAX are also defined in on some systems (glibc, IRIX, HP-UX, OSF/1). Therefore you might get warnings about MIN, MAX macro redefinitions on some systems; the workaround is to #include this file as the last one among the #include list. */ /* Before we define the following symbols we get the file since otherwise we get redefinitions on some systems if is included after this file. Likewise for . If more than one of these system headers define MIN and MAX, pick just one of the headers (because the definitions most likely are the same). */ #if HAVE_MINMAX_IN_LIMITS_H # include #elif HAVE_MINMAX_IN_SYS_PARAM_H # include #endif /* Note: MIN and MAX should be used with two arguments of the same type. They might not return the minimum and maximum of their two arguments, if the arguments have different types or have unusual floating-point values. For example, on a typical host with 32-bit 'int', 64-bit 'long long', and 64-bit IEEE 754 'double' types: MAX (-1, 2147483648) returns 4294967295. MAX (9007199254740992.0, 9007199254740993) returns 9007199254740992.0. MAX (NaN, 0.0) returns 0.0. MAX (+0.0, -0.0) returns -0.0. and in each case the answer is in some sense bogus. */ /* MAX(a,b) returns the maximum of A and B. */ #ifndef MAX # define MAX(a,b) ((a) > (b) ? (a) : (b)) #endif /* MIN(a,b) returns the minimum of A and B. */ #ifndef MIN # define MIN(a,b) ((a) < (b) ? (a) : (b)) #endif #endif /* _MINMAX_H */ pspp-1.4.1/gl/memchr2.h0000644000175000017500000000211413723215637014232 0ustar00blpblp00000000000000/* Scan memory for the first of two bytes. Copyright (C) 2008-2020 Free Software Foundation, Inc. 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 3 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, see . */ #include #ifdef __cplusplus extern "C" { #endif /* Return the first address of either C1 or C2 (treated as unsigned char) that occurs within N bytes of the memory region S. If neither byte appears, return NULL. */ extern void *memchr2 (void const *s, int c1, int c2, size_t n) _GL_ATTRIBUTE_PURE; #ifdef __cplusplus } #endif pspp-1.4.1/gl/rijndael-alg-fst.c0000644000175000017500000012752313723215640016021 0ustar00blpblp00000000000000/* rijndael-alg-fst.c --- Rijndael cipher implementation. * Copyright (C) 2005-2006, 2009-2020 Free Software Foundation, Inc. * * This file 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 3, or (at your * option) any later version. * * This file 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 file; if not, see . * */ /* Adapted for gnulib by Simon Josefsson. * * Based on public domain "Optimised C code" retrieved from (SHA1 * 7c8e4b00d06685d1dbc6724a9e0d502353de339e): * https://web.archive.org/web/20060618010435/http://www.iaik.tu-graz.ac.at/research/krypto/AES/old/~rijmen/rijndael/rijndael-fst-3.0.zip */ #include /** * rijndael-alg-fst.c * * @version 3.0 (December 2000) * * Optimised ANSI C code for the Rijndael cipher (now AES) * * @author Vincent Rijmen * @author Antoon Bosselaers * @author Paulo Barreto * * This code is hereby placed in the public domain. * * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ''AS IS'' AND ANY EXPRESS * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "rijndael-alg-fst.h" /* Te0[x] = S [x].[02, 01, 01, 03]; Te1[x] = S [x].[03, 02, 01, 01]; Te2[x] = S [x].[01, 03, 02, 01]; Te3[x] = S [x].[01, 01, 03, 02]; Te4[x] = S [x].[01, 01, 01, 01]; Td0[x] = Si[x].[0e, 09, 0d, 0b]; Td1[x] = Si[x].[0b, 0e, 09, 0d]; Td2[x] = Si[x].[0d, 0b, 0e, 09]; Td3[x] = Si[x].[09, 0d, 0b, 0e]; Td4[x] = Si[x].[01, 01, 01, 01]; */ static const uint32_t Te0[256] = { 0xc66363a5, 0xf87c7c84, 0xee777799, 0xf67b7b8d, 0xfff2f20d, 0xd66b6bbd, 0xde6f6fb1, 0x91c5c554, 0x60303050, 0x02010103, 0xce6767a9, 0x562b2b7d, 0xe7fefe19, 0xb5d7d762, 0x4dababe6, 0xec76769a, 0x8fcaca45, 0x1f82829d, 0x89c9c940, 0xfa7d7d87, 0xeffafa15, 0xb25959eb, 0x8e4747c9, 0xfbf0f00b, 0x41adadec, 0xb3d4d467, 0x5fa2a2fd, 0x45afafea, 0x239c9cbf, 0x53a4a4f7, 0xe4727296, 0x9bc0c05b, 0x75b7b7c2, 0xe1fdfd1c, 0x3d9393ae, 0x4c26266a, 0x6c36365a, 0x7e3f3f41, 0xf5f7f702, 0x83cccc4f, 0x6834345c, 0x51a5a5f4, 0xd1e5e534, 0xf9f1f108, 0xe2717193, 0xabd8d873, 0x62313153, 0x2a15153f, 0x0804040c, 0x95c7c752, 0x46232365, 0x9dc3c35e, 0x30181828, 0x379696a1, 0x0a05050f, 0x2f9a9ab5, 0x0e070709, 0x24121236, 0x1b80809b, 0xdfe2e23d, 0xcdebeb26, 0x4e272769, 0x7fb2b2cd, 0xea75759f, 0x1209091b, 0x1d83839e, 0x582c2c74, 0x341a1a2e, 0x361b1b2d, 0xdc6e6eb2, 0xb45a5aee, 0x5ba0a0fb, 0xa45252f6, 0x763b3b4d, 0xb7d6d661, 0x7db3b3ce, 0x5229297b, 0xdde3e33e, 0x5e2f2f71, 0x13848497, 0xa65353f5, 0xb9d1d168, 0x00000000, 0xc1eded2c, 0x40202060, 0xe3fcfc1f, 0x79b1b1c8, 0xb65b5bed, 0xd46a6abe, 0x8dcbcb46, 0x67bebed9, 0x7239394b, 0x944a4ade, 0x984c4cd4, 0xb05858e8, 0x85cfcf4a, 0xbbd0d06b, 0xc5efef2a, 0x4faaaae5, 0xedfbfb16, 0x864343c5, 0x9a4d4dd7, 0x66333355, 0x11858594, 0x8a4545cf, 0xe9f9f910, 0x04020206, 0xfe7f7f81, 0xa05050f0, 0x783c3c44, 0x259f9fba, 0x4ba8a8e3, 0xa25151f3, 0x5da3a3fe, 0x804040c0, 0x058f8f8a, 0x3f9292ad, 0x219d9dbc, 0x70383848, 0xf1f5f504, 0x63bcbcdf, 0x77b6b6c1, 0xafdada75, 0x42212163, 0x20101030, 0xe5ffff1a, 0xfdf3f30e, 0xbfd2d26d, 0x81cdcd4c, 0x180c0c14, 0x26131335, 0xc3ecec2f, 0xbe5f5fe1, 0x359797a2, 0x884444cc, 0x2e171739, 0x93c4c457, 0x55a7a7f2, 0xfc7e7e82, 0x7a3d3d47, 0xc86464ac, 0xba5d5de7, 0x3219192b, 0xe6737395, 0xc06060a0, 0x19818198, 0x9e4f4fd1, 0xa3dcdc7f, 0x44222266, 0x542a2a7e, 0x3b9090ab, 0x0b888883, 0x8c4646ca, 0xc7eeee29, 0x6bb8b8d3, 0x2814143c, 0xa7dede79, 0xbc5e5ee2, 0x160b0b1d, 0xaddbdb76, 0xdbe0e03b, 0x64323256, 0x743a3a4e, 0x140a0a1e, 0x924949db, 0x0c06060a, 0x4824246c, 0xb85c5ce4, 0x9fc2c25d, 0xbdd3d36e, 0x43acacef, 0xc46262a6, 0x399191a8, 0x319595a4, 0xd3e4e437, 0xf279798b, 0xd5e7e732, 0x8bc8c843, 0x6e373759, 0xda6d6db7, 0x018d8d8c, 0xb1d5d564, 0x9c4e4ed2, 0x49a9a9e0, 0xd86c6cb4, 0xac5656fa, 0xf3f4f407, 0xcfeaea25, 0xca6565af, 0xf47a7a8e, 0x47aeaee9, 0x10080818, 0x6fbabad5, 0xf0787888, 0x4a25256f, 0x5c2e2e72, 0x381c1c24, 0x57a6a6f1, 0x73b4b4c7, 0x97c6c651, 0xcbe8e823, 0xa1dddd7c, 0xe874749c, 0x3e1f1f21, 0x964b4bdd, 0x61bdbddc, 0x0d8b8b86, 0x0f8a8a85, 0xe0707090, 0x7c3e3e42, 0x71b5b5c4, 0xcc6666aa, 0x904848d8, 0x06030305, 0xf7f6f601, 0x1c0e0e12, 0xc26161a3, 0x6a35355f, 0xae5757f9, 0x69b9b9d0, 0x17868691, 0x99c1c158, 0x3a1d1d27, 0x279e9eb9, 0xd9e1e138, 0xebf8f813, 0x2b9898b3, 0x22111133, 0xd26969bb, 0xa9d9d970, 0x078e8e89, 0x339494a7, 0x2d9b9bb6, 0x3c1e1e22, 0x15878792, 0xc9e9e920, 0x87cece49, 0xaa5555ff, 0x50282878, 0xa5dfdf7a, 0x038c8c8f, 0x59a1a1f8, 0x09898980, 0x1a0d0d17, 0x65bfbfda, 0xd7e6e631, 0x844242c6, 0xd06868b8, 0x824141c3, 0x299999b0, 0x5a2d2d77, 0x1e0f0f11, 0x7bb0b0cb, 0xa85454fc, 0x6dbbbbd6, 0x2c16163a, }; static const uint32_t Te1[256] = { 0xa5c66363, 0x84f87c7c, 0x99ee7777, 0x8df67b7b, 0x0dfff2f2, 0xbdd66b6b, 0xb1de6f6f, 0x5491c5c5, 0x50603030, 0x03020101, 0xa9ce6767, 0x7d562b2b, 0x19e7fefe, 0x62b5d7d7, 0xe64dabab, 0x9aec7676, 0x458fcaca, 0x9d1f8282, 0x4089c9c9, 0x87fa7d7d, 0x15effafa, 0xebb25959, 0xc98e4747, 0x0bfbf0f0, 0xec41adad, 0x67b3d4d4, 0xfd5fa2a2, 0xea45afaf, 0xbf239c9c, 0xf753a4a4, 0x96e47272, 0x5b9bc0c0, 0xc275b7b7, 0x1ce1fdfd, 0xae3d9393, 0x6a4c2626, 0x5a6c3636, 0x417e3f3f, 0x02f5f7f7, 0x4f83cccc, 0x5c683434, 0xf451a5a5, 0x34d1e5e5, 0x08f9f1f1, 0x93e27171, 0x73abd8d8, 0x53623131, 0x3f2a1515, 0x0c080404, 0x5295c7c7, 0x65462323, 0x5e9dc3c3, 0x28301818, 0xa1379696, 0x0f0a0505, 0xb52f9a9a, 0x090e0707, 0x36241212, 0x9b1b8080, 0x3ddfe2e2, 0x26cdebeb, 0x694e2727, 0xcd7fb2b2, 0x9fea7575, 0x1b120909, 0x9e1d8383, 0x74582c2c, 0x2e341a1a, 0x2d361b1b, 0xb2dc6e6e, 0xeeb45a5a, 0xfb5ba0a0, 0xf6a45252, 0x4d763b3b, 0x61b7d6d6, 0xce7db3b3, 0x7b522929, 0x3edde3e3, 0x715e2f2f, 0x97138484, 0xf5a65353, 0x68b9d1d1, 0x00000000, 0x2cc1eded, 0x60402020, 0x1fe3fcfc, 0xc879b1b1, 0xedb65b5b, 0xbed46a6a, 0x468dcbcb, 0xd967bebe, 0x4b723939, 0xde944a4a, 0xd4984c4c, 0xe8b05858, 0x4a85cfcf, 0x6bbbd0d0, 0x2ac5efef, 0xe54faaaa, 0x16edfbfb, 0xc5864343, 0xd79a4d4d, 0x55663333, 0x94118585, 0xcf8a4545, 0x10e9f9f9, 0x06040202, 0x81fe7f7f, 0xf0a05050, 0x44783c3c, 0xba259f9f, 0xe34ba8a8, 0xf3a25151, 0xfe5da3a3, 0xc0804040, 0x8a058f8f, 0xad3f9292, 0xbc219d9d, 0x48703838, 0x04f1f5f5, 0xdf63bcbc, 0xc177b6b6, 0x75afdada, 0x63422121, 0x30201010, 0x1ae5ffff, 0x0efdf3f3, 0x6dbfd2d2, 0x4c81cdcd, 0x14180c0c, 0x35261313, 0x2fc3ecec, 0xe1be5f5f, 0xa2359797, 0xcc884444, 0x392e1717, 0x5793c4c4, 0xf255a7a7, 0x82fc7e7e, 0x477a3d3d, 0xacc86464, 0xe7ba5d5d, 0x2b321919, 0x95e67373, 0xa0c06060, 0x98198181, 0xd19e4f4f, 0x7fa3dcdc, 0x66442222, 0x7e542a2a, 0xab3b9090, 0x830b8888, 0xca8c4646, 0x29c7eeee, 0xd36bb8b8, 0x3c281414, 0x79a7dede, 0xe2bc5e5e, 0x1d160b0b, 0x76addbdb, 0x3bdbe0e0, 0x56643232, 0x4e743a3a, 0x1e140a0a, 0xdb924949, 0x0a0c0606, 0x6c482424, 0xe4b85c5c, 0x5d9fc2c2, 0x6ebdd3d3, 0xef43acac, 0xa6c46262, 0xa8399191, 0xa4319595, 0x37d3e4e4, 0x8bf27979, 0x32d5e7e7, 0x438bc8c8, 0x596e3737, 0xb7da6d6d, 0x8c018d8d, 0x64b1d5d5, 0xd29c4e4e, 0xe049a9a9, 0xb4d86c6c, 0xfaac5656, 0x07f3f4f4, 0x25cfeaea, 0xafca6565, 0x8ef47a7a, 0xe947aeae, 0x18100808, 0xd56fbaba, 0x88f07878, 0x6f4a2525, 0x725c2e2e, 0x24381c1c, 0xf157a6a6, 0xc773b4b4, 0x5197c6c6, 0x23cbe8e8, 0x7ca1dddd, 0x9ce87474, 0x213e1f1f, 0xdd964b4b, 0xdc61bdbd, 0x860d8b8b, 0x850f8a8a, 0x90e07070, 0x427c3e3e, 0xc471b5b5, 0xaacc6666, 0xd8904848, 0x05060303, 0x01f7f6f6, 0x121c0e0e, 0xa3c26161, 0x5f6a3535, 0xf9ae5757, 0xd069b9b9, 0x91178686, 0x5899c1c1, 0x273a1d1d, 0xb9279e9e, 0x38d9e1e1, 0x13ebf8f8, 0xb32b9898, 0x33221111, 0xbbd26969, 0x70a9d9d9, 0x89078e8e, 0xa7339494, 0xb62d9b9b, 0x223c1e1e, 0x92158787, 0x20c9e9e9, 0x4987cece, 0xffaa5555, 0x78502828, 0x7aa5dfdf, 0x8f038c8c, 0xf859a1a1, 0x80098989, 0x171a0d0d, 0xda65bfbf, 0x31d7e6e6, 0xc6844242, 0xb8d06868, 0xc3824141, 0xb0299999, 0x775a2d2d, 0x111e0f0f, 0xcb7bb0b0, 0xfca85454, 0xd66dbbbb, 0x3a2c1616, }; static const uint32_t Te2[256] = { 0x63a5c663, 0x7c84f87c, 0x7799ee77, 0x7b8df67b, 0xf20dfff2, 0x6bbdd66b, 0x6fb1de6f, 0xc55491c5, 0x30506030, 0x01030201, 0x67a9ce67, 0x2b7d562b, 0xfe19e7fe, 0xd762b5d7, 0xabe64dab, 0x769aec76, 0xca458fca, 0x829d1f82, 0xc94089c9, 0x7d87fa7d, 0xfa15effa, 0x59ebb259, 0x47c98e47, 0xf00bfbf0, 0xadec41ad, 0xd467b3d4, 0xa2fd5fa2, 0xafea45af, 0x9cbf239c, 0xa4f753a4, 0x7296e472, 0xc05b9bc0, 0xb7c275b7, 0xfd1ce1fd, 0x93ae3d93, 0x266a4c26, 0x365a6c36, 0x3f417e3f, 0xf702f5f7, 0xcc4f83cc, 0x345c6834, 0xa5f451a5, 0xe534d1e5, 0xf108f9f1, 0x7193e271, 0xd873abd8, 0x31536231, 0x153f2a15, 0x040c0804, 0xc75295c7, 0x23654623, 0xc35e9dc3, 0x18283018, 0x96a13796, 0x050f0a05, 0x9ab52f9a, 0x07090e07, 0x12362412, 0x809b1b80, 0xe23ddfe2, 0xeb26cdeb, 0x27694e27, 0xb2cd7fb2, 0x759fea75, 0x091b1209, 0x839e1d83, 0x2c74582c, 0x1a2e341a, 0x1b2d361b, 0x6eb2dc6e, 0x5aeeb45a, 0xa0fb5ba0, 0x52f6a452, 0x3b4d763b, 0xd661b7d6, 0xb3ce7db3, 0x297b5229, 0xe33edde3, 0x2f715e2f, 0x84971384, 0x53f5a653, 0xd168b9d1, 0x00000000, 0xed2cc1ed, 0x20604020, 0xfc1fe3fc, 0xb1c879b1, 0x5bedb65b, 0x6abed46a, 0xcb468dcb, 0xbed967be, 0x394b7239, 0x4ade944a, 0x4cd4984c, 0x58e8b058, 0xcf4a85cf, 0xd06bbbd0, 0xef2ac5ef, 0xaae54faa, 0xfb16edfb, 0x43c58643, 0x4dd79a4d, 0x33556633, 0x85941185, 0x45cf8a45, 0xf910e9f9, 0x02060402, 0x7f81fe7f, 0x50f0a050, 0x3c44783c, 0x9fba259f, 0xa8e34ba8, 0x51f3a251, 0xa3fe5da3, 0x40c08040, 0x8f8a058f, 0x92ad3f92, 0x9dbc219d, 0x38487038, 0xf504f1f5, 0xbcdf63bc, 0xb6c177b6, 0xda75afda, 0x21634221, 0x10302010, 0xff1ae5ff, 0xf30efdf3, 0xd26dbfd2, 0xcd4c81cd, 0x0c14180c, 0x13352613, 0xec2fc3ec, 0x5fe1be5f, 0x97a23597, 0x44cc8844, 0x17392e17, 0xc45793c4, 0xa7f255a7, 0x7e82fc7e, 0x3d477a3d, 0x64acc864, 0x5de7ba5d, 0x192b3219, 0x7395e673, 0x60a0c060, 0x81981981, 0x4fd19e4f, 0xdc7fa3dc, 0x22664422, 0x2a7e542a, 0x90ab3b90, 0x88830b88, 0x46ca8c46, 0xee29c7ee, 0xb8d36bb8, 0x143c2814, 0xde79a7de, 0x5ee2bc5e, 0x0b1d160b, 0xdb76addb, 0xe03bdbe0, 0x32566432, 0x3a4e743a, 0x0a1e140a, 0x49db9249, 0x060a0c06, 0x246c4824, 0x5ce4b85c, 0xc25d9fc2, 0xd36ebdd3, 0xacef43ac, 0x62a6c462, 0x91a83991, 0x95a43195, 0xe437d3e4, 0x798bf279, 0xe732d5e7, 0xc8438bc8, 0x37596e37, 0x6db7da6d, 0x8d8c018d, 0xd564b1d5, 0x4ed29c4e, 0xa9e049a9, 0x6cb4d86c, 0x56faac56, 0xf407f3f4, 0xea25cfea, 0x65afca65, 0x7a8ef47a, 0xaee947ae, 0x08181008, 0xbad56fba, 0x7888f078, 0x256f4a25, 0x2e725c2e, 0x1c24381c, 0xa6f157a6, 0xb4c773b4, 0xc65197c6, 0xe823cbe8, 0xdd7ca1dd, 0x749ce874, 0x1f213e1f, 0x4bdd964b, 0xbddc61bd, 0x8b860d8b, 0x8a850f8a, 0x7090e070, 0x3e427c3e, 0xb5c471b5, 0x66aacc66, 0x48d89048, 0x03050603, 0xf601f7f6, 0x0e121c0e, 0x61a3c261, 0x355f6a35, 0x57f9ae57, 0xb9d069b9, 0x86911786, 0xc15899c1, 0x1d273a1d, 0x9eb9279e, 0xe138d9e1, 0xf813ebf8, 0x98b32b98, 0x11332211, 0x69bbd269, 0xd970a9d9, 0x8e89078e, 0x94a73394, 0x9bb62d9b, 0x1e223c1e, 0x87921587, 0xe920c9e9, 0xce4987ce, 0x55ffaa55, 0x28785028, 0xdf7aa5df, 0x8c8f038c, 0xa1f859a1, 0x89800989, 0x0d171a0d, 0xbfda65bf, 0xe631d7e6, 0x42c68442, 0x68b8d068, 0x41c38241, 0x99b02999, 0x2d775a2d, 0x0f111e0f, 0xb0cb7bb0, 0x54fca854, 0xbbd66dbb, 0x163a2c16, }; static const uint32_t Te3[256] = { 0x6363a5c6, 0x7c7c84f8, 0x777799ee, 0x7b7b8df6, 0xf2f20dff, 0x6b6bbdd6, 0x6f6fb1de, 0xc5c55491, 0x30305060, 0x01010302, 0x6767a9ce, 0x2b2b7d56, 0xfefe19e7, 0xd7d762b5, 0xababe64d, 0x76769aec, 0xcaca458f, 0x82829d1f, 0xc9c94089, 0x7d7d87fa, 0xfafa15ef, 0x5959ebb2, 0x4747c98e, 0xf0f00bfb, 0xadadec41, 0xd4d467b3, 0xa2a2fd5f, 0xafafea45, 0x9c9cbf23, 0xa4a4f753, 0x727296e4, 0xc0c05b9b, 0xb7b7c275, 0xfdfd1ce1, 0x9393ae3d, 0x26266a4c, 0x36365a6c, 0x3f3f417e, 0xf7f702f5, 0xcccc4f83, 0x34345c68, 0xa5a5f451, 0xe5e534d1, 0xf1f108f9, 0x717193e2, 0xd8d873ab, 0x31315362, 0x15153f2a, 0x04040c08, 0xc7c75295, 0x23236546, 0xc3c35e9d, 0x18182830, 0x9696a137, 0x05050f0a, 0x9a9ab52f, 0x0707090e, 0x12123624, 0x80809b1b, 0xe2e23ddf, 0xebeb26cd, 0x2727694e, 0xb2b2cd7f, 0x75759fea, 0x09091b12, 0x83839e1d, 0x2c2c7458, 0x1a1a2e34, 0x1b1b2d36, 0x6e6eb2dc, 0x5a5aeeb4, 0xa0a0fb5b, 0x5252f6a4, 0x3b3b4d76, 0xd6d661b7, 0xb3b3ce7d, 0x29297b52, 0xe3e33edd, 0x2f2f715e, 0x84849713, 0x5353f5a6, 0xd1d168b9, 0x00000000, 0xeded2cc1, 0x20206040, 0xfcfc1fe3, 0xb1b1c879, 0x5b5bedb6, 0x6a6abed4, 0xcbcb468d, 0xbebed967, 0x39394b72, 0x4a4ade94, 0x4c4cd498, 0x5858e8b0, 0xcfcf4a85, 0xd0d06bbb, 0xefef2ac5, 0xaaaae54f, 0xfbfb16ed, 0x4343c586, 0x4d4dd79a, 0x33335566, 0x85859411, 0x4545cf8a, 0xf9f910e9, 0x02020604, 0x7f7f81fe, 0x5050f0a0, 0x3c3c4478, 0x9f9fba25, 0xa8a8e34b, 0x5151f3a2, 0xa3a3fe5d, 0x4040c080, 0x8f8f8a05, 0x9292ad3f, 0x9d9dbc21, 0x38384870, 0xf5f504f1, 0xbcbcdf63, 0xb6b6c177, 0xdada75af, 0x21216342, 0x10103020, 0xffff1ae5, 0xf3f30efd, 0xd2d26dbf, 0xcdcd4c81, 0x0c0c1418, 0x13133526, 0xecec2fc3, 0x5f5fe1be, 0x9797a235, 0x4444cc88, 0x1717392e, 0xc4c45793, 0xa7a7f255, 0x7e7e82fc, 0x3d3d477a, 0x6464acc8, 0x5d5de7ba, 0x19192b32, 0x737395e6, 0x6060a0c0, 0x81819819, 0x4f4fd19e, 0xdcdc7fa3, 0x22226644, 0x2a2a7e54, 0x9090ab3b, 0x8888830b, 0x4646ca8c, 0xeeee29c7, 0xb8b8d36b, 0x14143c28, 0xdede79a7, 0x5e5ee2bc, 0x0b0b1d16, 0xdbdb76ad, 0xe0e03bdb, 0x32325664, 0x3a3a4e74, 0x0a0a1e14, 0x4949db92, 0x06060a0c, 0x24246c48, 0x5c5ce4b8, 0xc2c25d9f, 0xd3d36ebd, 0xacacef43, 0x6262a6c4, 0x9191a839, 0x9595a431, 0xe4e437d3, 0x79798bf2, 0xe7e732d5, 0xc8c8438b, 0x3737596e, 0x6d6db7da, 0x8d8d8c01, 0xd5d564b1, 0x4e4ed29c, 0xa9a9e049, 0x6c6cb4d8, 0x5656faac, 0xf4f407f3, 0xeaea25cf, 0x6565afca, 0x7a7a8ef4, 0xaeaee947, 0x08081810, 0xbabad56f, 0x787888f0, 0x25256f4a, 0x2e2e725c, 0x1c1c2438, 0xa6a6f157, 0xb4b4c773, 0xc6c65197, 0xe8e823cb, 0xdddd7ca1, 0x74749ce8, 0x1f1f213e, 0x4b4bdd96, 0xbdbddc61, 0x8b8b860d, 0x8a8a850f, 0x707090e0, 0x3e3e427c, 0xb5b5c471, 0x6666aacc, 0x4848d890, 0x03030506, 0xf6f601f7, 0x0e0e121c, 0x6161a3c2, 0x35355f6a, 0x5757f9ae, 0xb9b9d069, 0x86869117, 0xc1c15899, 0x1d1d273a, 0x9e9eb927, 0xe1e138d9, 0xf8f813eb, 0x9898b32b, 0x11113322, 0x6969bbd2, 0xd9d970a9, 0x8e8e8907, 0x9494a733, 0x9b9bb62d, 0x1e1e223c, 0x87879215, 0xe9e920c9, 0xcece4987, 0x5555ffaa, 0x28287850, 0xdfdf7aa5, 0x8c8c8f03, 0xa1a1f859, 0x89898009, 0x0d0d171a, 0xbfbfda65, 0xe6e631d7, 0x4242c684, 0x6868b8d0, 0x4141c382, 0x9999b029, 0x2d2d775a, 0x0f0f111e, 0xb0b0cb7b, 0x5454fca8, 0xbbbbd66d, 0x16163a2c, }; static const uint32_t Te4[256] = { 0x63636363, 0x7c7c7c7c, 0x77777777, 0x7b7b7b7b, 0xf2f2f2f2, 0x6b6b6b6b, 0x6f6f6f6f, 0xc5c5c5c5, 0x30303030, 0x01010101, 0x67676767, 0x2b2b2b2b, 0xfefefefe, 0xd7d7d7d7, 0xabababab, 0x76767676, 0xcacacaca, 0x82828282, 0xc9c9c9c9, 0x7d7d7d7d, 0xfafafafa, 0x59595959, 0x47474747, 0xf0f0f0f0, 0xadadadad, 0xd4d4d4d4, 0xa2a2a2a2, 0xafafafaf, 0x9c9c9c9c, 0xa4a4a4a4, 0x72727272, 0xc0c0c0c0, 0xb7b7b7b7, 0xfdfdfdfd, 0x93939393, 0x26262626, 0x36363636, 0x3f3f3f3f, 0xf7f7f7f7, 0xcccccccc, 0x34343434, 0xa5a5a5a5, 0xe5e5e5e5, 0xf1f1f1f1, 0x71717171, 0xd8d8d8d8, 0x31313131, 0x15151515, 0x04040404, 0xc7c7c7c7, 0x23232323, 0xc3c3c3c3, 0x18181818, 0x96969696, 0x05050505, 0x9a9a9a9a, 0x07070707, 0x12121212, 0x80808080, 0xe2e2e2e2, 0xebebebeb, 0x27272727, 0xb2b2b2b2, 0x75757575, 0x09090909, 0x83838383, 0x2c2c2c2c, 0x1a1a1a1a, 0x1b1b1b1b, 0x6e6e6e6e, 0x5a5a5a5a, 0xa0a0a0a0, 0x52525252, 0x3b3b3b3b, 0xd6d6d6d6, 0xb3b3b3b3, 0x29292929, 0xe3e3e3e3, 0x2f2f2f2f, 0x84848484, 0x53535353, 0xd1d1d1d1, 0x00000000, 0xedededed, 0x20202020, 0xfcfcfcfc, 0xb1b1b1b1, 0x5b5b5b5b, 0x6a6a6a6a, 0xcbcbcbcb, 0xbebebebe, 0x39393939, 0x4a4a4a4a, 0x4c4c4c4c, 0x58585858, 0xcfcfcfcf, 0xd0d0d0d0, 0xefefefef, 0xaaaaaaaa, 0xfbfbfbfb, 0x43434343, 0x4d4d4d4d, 0x33333333, 0x85858585, 0x45454545, 0xf9f9f9f9, 0x02020202, 0x7f7f7f7f, 0x50505050, 0x3c3c3c3c, 0x9f9f9f9f, 0xa8a8a8a8, 0x51515151, 0xa3a3a3a3, 0x40404040, 0x8f8f8f8f, 0x92929292, 0x9d9d9d9d, 0x38383838, 0xf5f5f5f5, 0xbcbcbcbc, 0xb6b6b6b6, 0xdadadada, 0x21212121, 0x10101010, 0xffffffff, 0xf3f3f3f3, 0xd2d2d2d2, 0xcdcdcdcd, 0x0c0c0c0c, 0x13131313, 0xecececec, 0x5f5f5f5f, 0x97979797, 0x44444444, 0x17171717, 0xc4c4c4c4, 0xa7a7a7a7, 0x7e7e7e7e, 0x3d3d3d3d, 0x64646464, 0x5d5d5d5d, 0x19191919, 0x73737373, 0x60606060, 0x81818181, 0x4f4f4f4f, 0xdcdcdcdc, 0x22222222, 0x2a2a2a2a, 0x90909090, 0x88888888, 0x46464646, 0xeeeeeeee, 0xb8b8b8b8, 0x14141414, 0xdededede, 0x5e5e5e5e, 0x0b0b0b0b, 0xdbdbdbdb, 0xe0e0e0e0, 0x32323232, 0x3a3a3a3a, 0x0a0a0a0a, 0x49494949, 0x06060606, 0x24242424, 0x5c5c5c5c, 0xc2c2c2c2, 0xd3d3d3d3, 0xacacacac, 0x62626262, 0x91919191, 0x95959595, 0xe4e4e4e4, 0x79797979, 0xe7e7e7e7, 0xc8c8c8c8, 0x37373737, 0x6d6d6d6d, 0x8d8d8d8d, 0xd5d5d5d5, 0x4e4e4e4e, 0xa9a9a9a9, 0x6c6c6c6c, 0x56565656, 0xf4f4f4f4, 0xeaeaeaea, 0x65656565, 0x7a7a7a7a, 0xaeaeaeae, 0x08080808, 0xbabababa, 0x78787878, 0x25252525, 0x2e2e2e2e, 0x1c1c1c1c, 0xa6a6a6a6, 0xb4b4b4b4, 0xc6c6c6c6, 0xe8e8e8e8, 0xdddddddd, 0x74747474, 0x1f1f1f1f, 0x4b4b4b4b, 0xbdbdbdbd, 0x8b8b8b8b, 0x8a8a8a8a, 0x70707070, 0x3e3e3e3e, 0xb5b5b5b5, 0x66666666, 0x48484848, 0x03030303, 0xf6f6f6f6, 0x0e0e0e0e, 0x61616161, 0x35353535, 0x57575757, 0xb9b9b9b9, 0x86868686, 0xc1c1c1c1, 0x1d1d1d1d, 0x9e9e9e9e, 0xe1e1e1e1, 0xf8f8f8f8, 0x98989898, 0x11111111, 0x69696969, 0xd9d9d9d9, 0x8e8e8e8e, 0x94949494, 0x9b9b9b9b, 0x1e1e1e1e, 0x87878787, 0xe9e9e9e9, 0xcececece, 0x55555555, 0x28282828, 0xdfdfdfdf, 0x8c8c8c8c, 0xa1a1a1a1, 0x89898989, 0x0d0d0d0d, 0xbfbfbfbf, 0xe6e6e6e6, 0x42424242, 0x68686868, 0x41414141, 0x99999999, 0x2d2d2d2d, 0x0f0f0f0f, 0xb0b0b0b0, 0x54545454, 0xbbbbbbbb, 0x16161616, }; static const uint32_t Td0[256] = { 0x51f4a750, 0x7e416553, 0x1a17a4c3, 0x3a275e96, 0x3bab6bcb, 0x1f9d45f1, 0xacfa58ab, 0x4be30393, 0x2030fa55, 0xad766df6, 0x88cc7691, 0xf5024c25, 0x4fe5d7fc, 0xc52acbd7, 0x26354480, 0xb562a38f, 0xdeb15a49, 0x25ba1b67, 0x45ea0e98, 0x5dfec0e1, 0xc32f7502, 0x814cf012, 0x8d4697a3, 0x6bd3f9c6, 0x038f5fe7, 0x15929c95, 0xbf6d7aeb, 0x955259da, 0xd4be832d, 0x587421d3, 0x49e06929, 0x8ec9c844, 0x75c2896a, 0xf48e7978, 0x99583e6b, 0x27b971dd, 0xbee14fb6, 0xf088ad17, 0xc920ac66, 0x7dce3ab4, 0x63df4a18, 0xe51a3182, 0x97513360, 0x62537f45, 0xb16477e0, 0xbb6bae84, 0xfe81a01c, 0xf9082b94, 0x70486858, 0x8f45fd19, 0x94de6c87, 0x527bf8b7, 0xab73d323, 0x724b02e2, 0xe31f8f57, 0x6655ab2a, 0xb2eb2807, 0x2fb5c203, 0x86c57b9a, 0xd33708a5, 0x302887f2, 0x23bfa5b2, 0x02036aba, 0xed16825c, 0x8acf1c2b, 0xa779b492, 0xf307f2f0, 0x4e69e2a1, 0x65daf4cd, 0x0605bed5, 0xd134621f, 0xc4a6fe8a, 0x342e539d, 0xa2f355a0, 0x058ae132, 0xa4f6eb75, 0x0b83ec39, 0x4060efaa, 0x5e719f06, 0xbd6e1051, 0x3e218af9, 0x96dd063d, 0xdd3e05ae, 0x4de6bd46, 0x91548db5, 0x71c45d05, 0x0406d46f, 0x605015ff, 0x1998fb24, 0xd6bde997, 0x894043cc, 0x67d99e77, 0xb0e842bd, 0x07898b88, 0xe7195b38, 0x79c8eedb, 0xa17c0a47, 0x7c420fe9, 0xf8841ec9, 0x00000000, 0x09808683, 0x322bed48, 0x1e1170ac, 0x6c5a724e, 0xfd0efffb, 0x0f853856, 0x3daed51e, 0x362d3927, 0x0a0fd964, 0x685ca621, 0x9b5b54d1, 0x24362e3a, 0x0c0a67b1, 0x9357e70f, 0xb4ee96d2, 0x1b9b919e, 0x80c0c54f, 0x61dc20a2, 0x5a774b69, 0x1c121a16, 0xe293ba0a, 0xc0a02ae5, 0x3c22e043, 0x121b171d, 0x0e090d0b, 0xf28bc7ad, 0x2db6a8b9, 0x141ea9c8, 0x57f11985, 0xaf75074c, 0xee99ddbb, 0xa37f60fd, 0xf701269f, 0x5c72f5bc, 0x44663bc5, 0x5bfb7e34, 0x8b432976, 0xcb23c6dc, 0xb6edfc68, 0xb8e4f163, 0xd731dcca, 0x42638510, 0x13972240, 0x84c61120, 0x854a247d, 0xd2bb3df8, 0xaef93211, 0xc729a16d, 0x1d9e2f4b, 0xdcb230f3, 0x0d8652ec, 0x77c1e3d0, 0x2bb3166c, 0xa970b999, 0x119448fa, 0x47e96422, 0xa8fc8cc4, 0xa0f03f1a, 0x567d2cd8, 0x223390ef, 0x87494ec7, 0xd938d1c1, 0x8ccaa2fe, 0x98d40b36, 0xa6f581cf, 0xa57ade28, 0xdab78e26, 0x3fadbfa4, 0x2c3a9de4, 0x5078920d, 0x6a5fcc9b, 0x547e4662, 0xf68d13c2, 0x90d8b8e8, 0x2e39f75e, 0x82c3aff5, 0x9f5d80be, 0x69d0937c, 0x6fd52da9, 0xcf2512b3, 0xc8ac993b, 0x10187da7, 0xe89c636e, 0xdb3bbb7b, 0xcd267809, 0x6e5918f4, 0xec9ab701, 0x834f9aa8, 0xe6956e65, 0xaaffe67e, 0x21bccf08, 0xef15e8e6, 0xbae79bd9, 0x4a6f36ce, 0xea9f09d4, 0x29b07cd6, 0x31a4b2af, 0x2a3f2331, 0xc6a59430, 0x35a266c0, 0x744ebc37, 0xfc82caa6, 0xe090d0b0, 0x33a7d815, 0xf104984a, 0x41ecdaf7, 0x7fcd500e, 0x1791f62f, 0x764dd68d, 0x43efb04d, 0xccaa4d54, 0xe49604df, 0x9ed1b5e3, 0x4c6a881b, 0xc12c1fb8, 0x4665517f, 0x9d5eea04, 0x018c355d, 0xfa877473, 0xfb0b412e, 0xb3671d5a, 0x92dbd252, 0xe9105633, 0x6dd64713, 0x9ad7618c, 0x37a10c7a, 0x59f8148e, 0xeb133c89, 0xcea927ee, 0xb761c935, 0xe11ce5ed, 0x7a47b13c, 0x9cd2df59, 0x55f2733f, 0x1814ce79, 0x73c737bf, 0x53f7cdea, 0x5ffdaa5b, 0xdf3d6f14, 0x7844db86, 0xcaaff381, 0xb968c43e, 0x3824342c, 0xc2a3405f, 0x161dc372, 0xbce2250c, 0x283c498b, 0xff0d9541, 0x39a80171, 0x080cb3de, 0xd8b4e49c, 0x6456c190, 0x7bcb8461, 0xd532b670, 0x486c5c74, 0xd0b85742, }; static const uint32_t Td1[256] = { 0x5051f4a7, 0x537e4165, 0xc31a17a4, 0x963a275e, 0xcb3bab6b, 0xf11f9d45, 0xabacfa58, 0x934be303, 0x552030fa, 0xf6ad766d, 0x9188cc76, 0x25f5024c, 0xfc4fe5d7, 0xd7c52acb, 0x80263544, 0x8fb562a3, 0x49deb15a, 0x6725ba1b, 0x9845ea0e, 0xe15dfec0, 0x02c32f75, 0x12814cf0, 0xa38d4697, 0xc66bd3f9, 0xe7038f5f, 0x9515929c, 0xebbf6d7a, 0xda955259, 0x2dd4be83, 0xd3587421, 0x2949e069, 0x448ec9c8, 0x6a75c289, 0x78f48e79, 0x6b99583e, 0xdd27b971, 0xb6bee14f, 0x17f088ad, 0x66c920ac, 0xb47dce3a, 0x1863df4a, 0x82e51a31, 0x60975133, 0x4562537f, 0xe0b16477, 0x84bb6bae, 0x1cfe81a0, 0x94f9082b, 0x58704868, 0x198f45fd, 0x8794de6c, 0xb7527bf8, 0x23ab73d3, 0xe2724b02, 0x57e31f8f, 0x2a6655ab, 0x07b2eb28, 0x032fb5c2, 0x9a86c57b, 0xa5d33708, 0xf2302887, 0xb223bfa5, 0xba02036a, 0x5ced1682, 0x2b8acf1c, 0x92a779b4, 0xf0f307f2, 0xa14e69e2, 0xcd65daf4, 0xd50605be, 0x1fd13462, 0x8ac4a6fe, 0x9d342e53, 0xa0a2f355, 0x32058ae1, 0x75a4f6eb, 0x390b83ec, 0xaa4060ef, 0x065e719f, 0x51bd6e10, 0xf93e218a, 0x3d96dd06, 0xaedd3e05, 0x464de6bd, 0xb591548d, 0x0571c45d, 0x6f0406d4, 0xff605015, 0x241998fb, 0x97d6bde9, 0xcc894043, 0x7767d99e, 0xbdb0e842, 0x8807898b, 0x38e7195b, 0xdb79c8ee, 0x47a17c0a, 0xe97c420f, 0xc9f8841e, 0x00000000, 0x83098086, 0x48322bed, 0xac1e1170, 0x4e6c5a72, 0xfbfd0eff, 0x560f8538, 0x1e3daed5, 0x27362d39, 0x640a0fd9, 0x21685ca6, 0xd19b5b54, 0x3a24362e, 0xb10c0a67, 0x0f9357e7, 0xd2b4ee96, 0x9e1b9b91, 0x4f80c0c5, 0xa261dc20, 0x695a774b, 0x161c121a, 0x0ae293ba, 0xe5c0a02a, 0x433c22e0, 0x1d121b17, 0x0b0e090d, 0xadf28bc7, 0xb92db6a8, 0xc8141ea9, 0x8557f119, 0x4caf7507, 0xbbee99dd, 0xfda37f60, 0x9ff70126, 0xbc5c72f5, 0xc544663b, 0x345bfb7e, 0x768b4329, 0xdccb23c6, 0x68b6edfc, 0x63b8e4f1, 0xcad731dc, 0x10426385, 0x40139722, 0x2084c611, 0x7d854a24, 0xf8d2bb3d, 0x11aef932, 0x6dc729a1, 0x4b1d9e2f, 0xf3dcb230, 0xec0d8652, 0xd077c1e3, 0x6c2bb316, 0x99a970b9, 0xfa119448, 0x2247e964, 0xc4a8fc8c, 0x1aa0f03f, 0xd8567d2c, 0xef223390, 0xc787494e, 0xc1d938d1, 0xfe8ccaa2, 0x3698d40b, 0xcfa6f581, 0x28a57ade, 0x26dab78e, 0xa43fadbf, 0xe42c3a9d, 0x0d507892, 0x9b6a5fcc, 0x62547e46, 0xc2f68d13, 0xe890d8b8, 0x5e2e39f7, 0xf582c3af, 0xbe9f5d80, 0x7c69d093, 0xa96fd52d, 0xb3cf2512, 0x3bc8ac99, 0xa710187d, 0x6ee89c63, 0x7bdb3bbb, 0x09cd2678, 0xf46e5918, 0x01ec9ab7, 0xa8834f9a, 0x65e6956e, 0x7eaaffe6, 0x0821bccf, 0xe6ef15e8, 0xd9bae79b, 0xce4a6f36, 0xd4ea9f09, 0xd629b07c, 0xaf31a4b2, 0x312a3f23, 0x30c6a594, 0xc035a266, 0x37744ebc, 0xa6fc82ca, 0xb0e090d0, 0x1533a7d8, 0x4af10498, 0xf741ecda, 0x0e7fcd50, 0x2f1791f6, 0x8d764dd6, 0x4d43efb0, 0x54ccaa4d, 0xdfe49604, 0xe39ed1b5, 0x1b4c6a88, 0xb8c12c1f, 0x7f466551, 0x049d5eea, 0x5d018c35, 0x73fa8774, 0x2efb0b41, 0x5ab3671d, 0x5292dbd2, 0x33e91056, 0x136dd647, 0x8c9ad761, 0x7a37a10c, 0x8e59f814, 0x89eb133c, 0xeecea927, 0x35b761c9, 0xede11ce5, 0x3c7a47b1, 0x599cd2df, 0x3f55f273, 0x791814ce, 0xbf73c737, 0xea53f7cd, 0x5b5ffdaa, 0x14df3d6f, 0x867844db, 0x81caaff3, 0x3eb968c4, 0x2c382434, 0x5fc2a340, 0x72161dc3, 0x0cbce225, 0x8b283c49, 0x41ff0d95, 0x7139a801, 0xde080cb3, 0x9cd8b4e4, 0x906456c1, 0x617bcb84, 0x70d532b6, 0x74486c5c, 0x42d0b857, }; static const uint32_t Td2[256] = { 0xa75051f4, 0x65537e41, 0xa4c31a17, 0x5e963a27, 0x6bcb3bab, 0x45f11f9d, 0x58abacfa, 0x03934be3, 0xfa552030, 0x6df6ad76, 0x769188cc, 0x4c25f502, 0xd7fc4fe5, 0xcbd7c52a, 0x44802635, 0xa38fb562, 0x5a49deb1, 0x1b6725ba, 0x0e9845ea, 0xc0e15dfe, 0x7502c32f, 0xf012814c, 0x97a38d46, 0xf9c66bd3, 0x5fe7038f, 0x9c951592, 0x7aebbf6d, 0x59da9552, 0x832dd4be, 0x21d35874, 0x692949e0, 0xc8448ec9, 0x896a75c2, 0x7978f48e, 0x3e6b9958, 0x71dd27b9, 0x4fb6bee1, 0xad17f088, 0xac66c920, 0x3ab47dce, 0x4a1863df, 0x3182e51a, 0x33609751, 0x7f456253, 0x77e0b164, 0xae84bb6b, 0xa01cfe81, 0x2b94f908, 0x68587048, 0xfd198f45, 0x6c8794de, 0xf8b7527b, 0xd323ab73, 0x02e2724b, 0x8f57e31f, 0xab2a6655, 0x2807b2eb, 0xc2032fb5, 0x7b9a86c5, 0x08a5d337, 0x87f23028, 0xa5b223bf, 0x6aba0203, 0x825ced16, 0x1c2b8acf, 0xb492a779, 0xf2f0f307, 0xe2a14e69, 0xf4cd65da, 0xbed50605, 0x621fd134, 0xfe8ac4a6, 0x539d342e, 0x55a0a2f3, 0xe132058a, 0xeb75a4f6, 0xec390b83, 0xefaa4060, 0x9f065e71, 0x1051bd6e, 0x8af93e21, 0x063d96dd, 0x05aedd3e, 0xbd464de6, 0x8db59154, 0x5d0571c4, 0xd46f0406, 0x15ff6050, 0xfb241998, 0xe997d6bd, 0x43cc8940, 0x9e7767d9, 0x42bdb0e8, 0x8b880789, 0x5b38e719, 0xeedb79c8, 0x0a47a17c, 0x0fe97c42, 0x1ec9f884, 0x00000000, 0x86830980, 0xed48322b, 0x70ac1e11, 0x724e6c5a, 0xfffbfd0e, 0x38560f85, 0xd51e3dae, 0x3927362d, 0xd9640a0f, 0xa621685c, 0x54d19b5b, 0x2e3a2436, 0x67b10c0a, 0xe70f9357, 0x96d2b4ee, 0x919e1b9b, 0xc54f80c0, 0x20a261dc, 0x4b695a77, 0x1a161c12, 0xba0ae293, 0x2ae5c0a0, 0xe0433c22, 0x171d121b, 0x0d0b0e09, 0xc7adf28b, 0xa8b92db6, 0xa9c8141e, 0x198557f1, 0x074caf75, 0xddbbee99, 0x60fda37f, 0x269ff701, 0xf5bc5c72, 0x3bc54466, 0x7e345bfb, 0x29768b43, 0xc6dccb23, 0xfc68b6ed, 0xf163b8e4, 0xdccad731, 0x85104263, 0x22401397, 0x112084c6, 0x247d854a, 0x3df8d2bb, 0x3211aef9, 0xa16dc729, 0x2f4b1d9e, 0x30f3dcb2, 0x52ec0d86, 0xe3d077c1, 0x166c2bb3, 0xb999a970, 0x48fa1194, 0x642247e9, 0x8cc4a8fc, 0x3f1aa0f0, 0x2cd8567d, 0x90ef2233, 0x4ec78749, 0xd1c1d938, 0xa2fe8cca, 0x0b3698d4, 0x81cfa6f5, 0xde28a57a, 0x8e26dab7, 0xbfa43fad, 0x9de42c3a, 0x920d5078, 0xcc9b6a5f, 0x4662547e, 0x13c2f68d, 0xb8e890d8, 0xf75e2e39, 0xaff582c3, 0x80be9f5d, 0x937c69d0, 0x2da96fd5, 0x12b3cf25, 0x993bc8ac, 0x7da71018, 0x636ee89c, 0xbb7bdb3b, 0x7809cd26, 0x18f46e59, 0xb701ec9a, 0x9aa8834f, 0x6e65e695, 0xe67eaaff, 0xcf0821bc, 0xe8e6ef15, 0x9bd9bae7, 0x36ce4a6f, 0x09d4ea9f, 0x7cd629b0, 0xb2af31a4, 0x23312a3f, 0x9430c6a5, 0x66c035a2, 0xbc37744e, 0xcaa6fc82, 0xd0b0e090, 0xd81533a7, 0x984af104, 0xdaf741ec, 0x500e7fcd, 0xf62f1791, 0xd68d764d, 0xb04d43ef, 0x4d54ccaa, 0x04dfe496, 0xb5e39ed1, 0x881b4c6a, 0x1fb8c12c, 0x517f4665, 0xea049d5e, 0x355d018c, 0x7473fa87, 0x412efb0b, 0x1d5ab367, 0xd25292db, 0x5633e910, 0x47136dd6, 0x618c9ad7, 0x0c7a37a1, 0x148e59f8, 0x3c89eb13, 0x27eecea9, 0xc935b761, 0xe5ede11c, 0xb13c7a47, 0xdf599cd2, 0x733f55f2, 0xce791814, 0x37bf73c7, 0xcdea53f7, 0xaa5b5ffd, 0x6f14df3d, 0xdb867844, 0xf381caaf, 0xc43eb968, 0x342c3824, 0x405fc2a3, 0xc372161d, 0x250cbce2, 0x498b283c, 0x9541ff0d, 0x017139a8, 0xb3de080c, 0xe49cd8b4, 0xc1906456, 0x84617bcb, 0xb670d532, 0x5c74486c, 0x5742d0b8, }; static const uint32_t Td3[256] = { 0xf4a75051, 0x4165537e, 0x17a4c31a, 0x275e963a, 0xab6bcb3b, 0x9d45f11f, 0xfa58abac, 0xe303934b, 0x30fa5520, 0x766df6ad, 0xcc769188, 0x024c25f5, 0xe5d7fc4f, 0x2acbd7c5, 0x35448026, 0x62a38fb5, 0xb15a49de, 0xba1b6725, 0xea0e9845, 0xfec0e15d, 0x2f7502c3, 0x4cf01281, 0x4697a38d, 0xd3f9c66b, 0x8f5fe703, 0x929c9515, 0x6d7aebbf, 0x5259da95, 0xbe832dd4, 0x7421d358, 0xe0692949, 0xc9c8448e, 0xc2896a75, 0x8e7978f4, 0x583e6b99, 0xb971dd27, 0xe14fb6be, 0x88ad17f0, 0x20ac66c9, 0xce3ab47d, 0xdf4a1863, 0x1a3182e5, 0x51336097, 0x537f4562, 0x6477e0b1, 0x6bae84bb, 0x81a01cfe, 0x082b94f9, 0x48685870, 0x45fd198f, 0xde6c8794, 0x7bf8b752, 0x73d323ab, 0x4b02e272, 0x1f8f57e3, 0x55ab2a66, 0xeb2807b2, 0xb5c2032f, 0xc57b9a86, 0x3708a5d3, 0x2887f230, 0xbfa5b223, 0x036aba02, 0x16825ced, 0xcf1c2b8a, 0x79b492a7, 0x07f2f0f3, 0x69e2a14e, 0xdaf4cd65, 0x05bed506, 0x34621fd1, 0xa6fe8ac4, 0x2e539d34, 0xf355a0a2, 0x8ae13205, 0xf6eb75a4, 0x83ec390b, 0x60efaa40, 0x719f065e, 0x6e1051bd, 0x218af93e, 0xdd063d96, 0x3e05aedd, 0xe6bd464d, 0x548db591, 0xc45d0571, 0x06d46f04, 0x5015ff60, 0x98fb2419, 0xbde997d6, 0x4043cc89, 0xd99e7767, 0xe842bdb0, 0x898b8807, 0x195b38e7, 0xc8eedb79, 0x7c0a47a1, 0x420fe97c, 0x841ec9f8, 0x00000000, 0x80868309, 0x2bed4832, 0x1170ac1e, 0x5a724e6c, 0x0efffbfd, 0x8538560f, 0xaed51e3d, 0x2d392736, 0x0fd9640a, 0x5ca62168, 0x5b54d19b, 0x362e3a24, 0x0a67b10c, 0x57e70f93, 0xee96d2b4, 0x9b919e1b, 0xc0c54f80, 0xdc20a261, 0x774b695a, 0x121a161c, 0x93ba0ae2, 0xa02ae5c0, 0x22e0433c, 0x1b171d12, 0x090d0b0e, 0x8bc7adf2, 0xb6a8b92d, 0x1ea9c814, 0xf1198557, 0x75074caf, 0x99ddbbee, 0x7f60fda3, 0x01269ff7, 0x72f5bc5c, 0x663bc544, 0xfb7e345b, 0x4329768b, 0x23c6dccb, 0xedfc68b6, 0xe4f163b8, 0x31dccad7, 0x63851042, 0x97224013, 0xc6112084, 0x4a247d85, 0xbb3df8d2, 0xf93211ae, 0x29a16dc7, 0x9e2f4b1d, 0xb230f3dc, 0x8652ec0d, 0xc1e3d077, 0xb3166c2b, 0x70b999a9, 0x9448fa11, 0xe9642247, 0xfc8cc4a8, 0xf03f1aa0, 0x7d2cd856, 0x3390ef22, 0x494ec787, 0x38d1c1d9, 0xcaa2fe8c, 0xd40b3698, 0xf581cfa6, 0x7ade28a5, 0xb78e26da, 0xadbfa43f, 0x3a9de42c, 0x78920d50, 0x5fcc9b6a, 0x7e466254, 0x8d13c2f6, 0xd8b8e890, 0x39f75e2e, 0xc3aff582, 0x5d80be9f, 0xd0937c69, 0xd52da96f, 0x2512b3cf, 0xac993bc8, 0x187da710, 0x9c636ee8, 0x3bbb7bdb, 0x267809cd, 0x5918f46e, 0x9ab701ec, 0x4f9aa883, 0x956e65e6, 0xffe67eaa, 0xbccf0821, 0x15e8e6ef, 0xe79bd9ba, 0x6f36ce4a, 0x9f09d4ea, 0xb07cd629, 0xa4b2af31, 0x3f23312a, 0xa59430c6, 0xa266c035, 0x4ebc3774, 0x82caa6fc, 0x90d0b0e0, 0xa7d81533, 0x04984af1, 0xecdaf741, 0xcd500e7f, 0x91f62f17, 0x4dd68d76, 0xefb04d43, 0xaa4d54cc, 0x9604dfe4, 0xd1b5e39e, 0x6a881b4c, 0x2c1fb8c1, 0x65517f46, 0x5eea049d, 0x8c355d01, 0x877473fa, 0x0b412efb, 0x671d5ab3, 0xdbd25292, 0x105633e9, 0xd647136d, 0xd7618c9a, 0xa10c7a37, 0xf8148e59, 0x133c89eb, 0xa927eece, 0x61c935b7, 0x1ce5ede1, 0x47b13c7a, 0xd2df599c, 0xf2733f55, 0x14ce7918, 0xc737bf73, 0xf7cdea53, 0xfdaa5b5f, 0x3d6f14df, 0x44db8678, 0xaff381ca, 0x68c43eb9, 0x24342c38, 0xa3405fc2, 0x1dc37216, 0xe2250cbc, 0x3c498b28, 0x0d9541ff, 0xa8017139, 0x0cb3de08, 0xb4e49cd8, 0x56c19064, 0xcb84617b, 0x32b670d5, 0x6c5c7448, 0xb85742d0, }; static const uint32_t Td4[256] = { 0x52525252, 0x09090909, 0x6a6a6a6a, 0xd5d5d5d5, 0x30303030, 0x36363636, 0xa5a5a5a5, 0x38383838, 0xbfbfbfbf, 0x40404040, 0xa3a3a3a3, 0x9e9e9e9e, 0x81818181, 0xf3f3f3f3, 0xd7d7d7d7, 0xfbfbfbfb, 0x7c7c7c7c, 0xe3e3e3e3, 0x39393939, 0x82828282, 0x9b9b9b9b, 0x2f2f2f2f, 0xffffffff, 0x87878787, 0x34343434, 0x8e8e8e8e, 0x43434343, 0x44444444, 0xc4c4c4c4, 0xdededede, 0xe9e9e9e9, 0xcbcbcbcb, 0x54545454, 0x7b7b7b7b, 0x94949494, 0x32323232, 0xa6a6a6a6, 0xc2c2c2c2, 0x23232323, 0x3d3d3d3d, 0xeeeeeeee, 0x4c4c4c4c, 0x95959595, 0x0b0b0b0b, 0x42424242, 0xfafafafa, 0xc3c3c3c3, 0x4e4e4e4e, 0x08080808, 0x2e2e2e2e, 0xa1a1a1a1, 0x66666666, 0x28282828, 0xd9d9d9d9, 0x24242424, 0xb2b2b2b2, 0x76767676, 0x5b5b5b5b, 0xa2a2a2a2, 0x49494949, 0x6d6d6d6d, 0x8b8b8b8b, 0xd1d1d1d1, 0x25252525, 0x72727272, 0xf8f8f8f8, 0xf6f6f6f6, 0x64646464, 0x86868686, 0x68686868, 0x98989898, 0x16161616, 0xd4d4d4d4, 0xa4a4a4a4, 0x5c5c5c5c, 0xcccccccc, 0x5d5d5d5d, 0x65656565, 0xb6b6b6b6, 0x92929292, 0x6c6c6c6c, 0x70707070, 0x48484848, 0x50505050, 0xfdfdfdfd, 0xedededed, 0xb9b9b9b9, 0xdadadada, 0x5e5e5e5e, 0x15151515, 0x46464646, 0x57575757, 0xa7a7a7a7, 0x8d8d8d8d, 0x9d9d9d9d, 0x84848484, 0x90909090, 0xd8d8d8d8, 0xabababab, 0x00000000, 0x8c8c8c8c, 0xbcbcbcbc, 0xd3d3d3d3, 0x0a0a0a0a, 0xf7f7f7f7, 0xe4e4e4e4, 0x58585858, 0x05050505, 0xb8b8b8b8, 0xb3b3b3b3, 0x45454545, 0x06060606, 0xd0d0d0d0, 0x2c2c2c2c, 0x1e1e1e1e, 0x8f8f8f8f, 0xcacacaca, 0x3f3f3f3f, 0x0f0f0f0f, 0x02020202, 0xc1c1c1c1, 0xafafafaf, 0xbdbdbdbd, 0x03030303, 0x01010101, 0x13131313, 0x8a8a8a8a, 0x6b6b6b6b, 0x3a3a3a3a, 0x91919191, 0x11111111, 0x41414141, 0x4f4f4f4f, 0x67676767, 0xdcdcdcdc, 0xeaeaeaea, 0x97979797, 0xf2f2f2f2, 0xcfcfcfcf, 0xcececece, 0xf0f0f0f0, 0xb4b4b4b4, 0xe6e6e6e6, 0x73737373, 0x96969696, 0xacacacac, 0x74747474, 0x22222222, 0xe7e7e7e7, 0xadadadad, 0x35353535, 0x85858585, 0xe2e2e2e2, 0xf9f9f9f9, 0x37373737, 0xe8e8e8e8, 0x1c1c1c1c, 0x75757575, 0xdfdfdfdf, 0x6e6e6e6e, 0x47474747, 0xf1f1f1f1, 0x1a1a1a1a, 0x71717171, 0x1d1d1d1d, 0x29292929, 0xc5c5c5c5, 0x89898989, 0x6f6f6f6f, 0xb7b7b7b7, 0x62626262, 0x0e0e0e0e, 0xaaaaaaaa, 0x18181818, 0xbebebebe, 0x1b1b1b1b, 0xfcfcfcfc, 0x56565656, 0x3e3e3e3e, 0x4b4b4b4b, 0xc6c6c6c6, 0xd2d2d2d2, 0x79797979, 0x20202020, 0x9a9a9a9a, 0xdbdbdbdb, 0xc0c0c0c0, 0xfefefefe, 0x78787878, 0xcdcdcdcd, 0x5a5a5a5a, 0xf4f4f4f4, 0x1f1f1f1f, 0xdddddddd, 0xa8a8a8a8, 0x33333333, 0x88888888, 0x07070707, 0xc7c7c7c7, 0x31313131, 0xb1b1b1b1, 0x12121212, 0x10101010, 0x59595959, 0x27272727, 0x80808080, 0xecececec, 0x5f5f5f5f, 0x60606060, 0x51515151, 0x7f7f7f7f, 0xa9a9a9a9, 0x19191919, 0xb5b5b5b5, 0x4a4a4a4a, 0x0d0d0d0d, 0x2d2d2d2d, 0xe5e5e5e5, 0x7a7a7a7a, 0x9f9f9f9f, 0x93939393, 0xc9c9c9c9, 0x9c9c9c9c, 0xefefefef, 0xa0a0a0a0, 0xe0e0e0e0, 0x3b3b3b3b, 0x4d4d4d4d, 0xaeaeaeae, 0x2a2a2a2a, 0xf5f5f5f5, 0xb0b0b0b0, 0xc8c8c8c8, 0xebebebeb, 0xbbbbbbbb, 0x3c3c3c3c, 0x83838383, 0x53535353, 0x99999999, 0x61616161, 0x17171717, 0x2b2b2b2b, 0x04040404, 0x7e7e7e7e, 0xbabababa, 0x77777777, 0xd6d6d6d6, 0x26262626, 0xe1e1e1e1, 0x69696969, 0x14141414, 0x63636363, 0x55555555, 0x21212121, 0x0c0c0c0c, 0x7d7d7d7d, }; static const uint32_t rcon[] = { 0x01000000, 0x02000000, 0x04000000, 0x08000000, 0x10000000, 0x20000000, 0x40000000, 0x80000000, 0x1B000000, 0x36000000 /* for 128-bit blocks, Rijndael never uses more than 10 rcon values */ }; #define GETU32(pt) (((uint32_t)((pt)[0] & 0xFF) << 24) ^ \ ((uint32_t)((pt)[1] & 0xFF) << 16) ^ \ ((uint32_t)((pt)[2] & 0xFF) << 8) ^ \ ((uint32_t)((pt)[3] & 0xFF))) #define PUTU32(ct, st) { \ (ct)[0] = (char)((st) >> 24); \ (ct)[1] = (char)((st) >> 16); \ (ct)[2] = (char)((st) >> 8); \ (ct)[3] = (char)(st); } /** * Expand the cipher key into the encryption key schedule. * * @return the number of rounds for the given cipher key size. */ int rijndaelKeySetupEnc (uint32_t rk[ /*4*(Nr + 1) */ ], const char cipherKey[], size_t keyBits) { size_t i = 0; uint32_t temp; rk[0] = GETU32 (cipherKey); rk[1] = GETU32 (cipherKey + 4); rk[2] = GETU32 (cipherKey + 8); rk[3] = GETU32 (cipherKey + 12); if (keyBits == 128) { for (;;) { temp = rk[3]; rk[4] = rk[0] ^ (Te4[(temp >> 16) & 0xff] & 0xff000000) ^ (Te4[(temp >> 8) & 0xff] & 0x00ff0000) ^ (Te4[(temp) & 0xff] & 0x0000ff00) ^ (Te4[(temp >> 24)] & 0x000000ff) ^ rcon[i]; rk[5] = rk[1] ^ rk[4]; rk[6] = rk[2] ^ rk[5]; rk[7] = rk[3] ^ rk[6]; if (++i == 10) { return 10; } rk += 4; } } rk[4] = GETU32 (cipherKey + 16); rk[5] = GETU32 (cipherKey + 20); if (keyBits == 192) { for (;;) { temp = rk[5]; rk[6] = rk[0] ^ (Te4[(temp >> 16) & 0xff] & 0xff000000) ^ (Te4[(temp >> 8) & 0xff] & 0x00ff0000) ^ (Te4[(temp) & 0xff] & 0x0000ff00) ^ (Te4[(temp >> 24)] & 0x000000ff) ^ rcon[i]; rk[7] = rk[1] ^ rk[6]; rk[8] = rk[2] ^ rk[7]; rk[9] = rk[3] ^ rk[8]; if (++i == 8) { return 12; } rk[10] = rk[4] ^ rk[9]; rk[11] = rk[5] ^ rk[10]; rk += 6; } } rk[6] = GETU32 (cipherKey + 24); rk[7] = GETU32 (cipherKey + 28); if (keyBits == 256) { for (;;) { temp = rk[7]; rk[8] = rk[0] ^ (Te4[(temp >> 16) & 0xff] & 0xff000000) ^ (Te4[(temp >> 8) & 0xff] & 0x00ff0000) ^ (Te4[(temp) & 0xff] & 0x0000ff00) ^ (Te4[(temp >> 24)] & 0x000000ff) ^ rcon[i]; rk[9] = rk[1] ^ rk[8]; rk[10] = rk[2] ^ rk[9]; rk[11] = rk[3] ^ rk[10]; if (++i == 7) { return 14; } temp = rk[11]; rk[12] = rk[4] ^ (Te4[(temp >> 24)] & 0xff000000) ^ (Te4[(temp >> 16) & 0xff] & 0x00ff0000) ^ (Te4[(temp >> 8) & 0xff] & 0x0000ff00) ^ (Te4[(temp) & 0xff] & 0x000000ff); rk[13] = rk[5] ^ rk[12]; rk[14] = rk[6] ^ rk[13]; rk[15] = rk[7] ^ rk[14]; rk += 8; } } return 0; } /** * Expand the cipher key into the decryption key schedule. * * @return the number of rounds for the given cipher key size. */ int rijndaelKeySetupDec (uint32_t rk[ /*4*(Nr + 1) */ ], const char cipherKey[], size_t keyBits) { size_t Nr, i, j; uint32_t temp; /* expand the cipher key: */ Nr = rijndaelKeySetupEnc (rk, cipherKey, keyBits); /* invert the order of the round keys: */ for (i = 0, j = 4 * Nr; i < j; i += 4, j -= 4) { temp = rk[i]; rk[i] = rk[j]; rk[j] = temp; temp = rk[i + 1]; rk[i + 1] = rk[j + 1]; rk[j + 1] = temp; temp = rk[i + 2]; rk[i + 2] = rk[j + 2]; rk[j + 2] = temp; temp = rk[i + 3]; rk[i + 3] = rk[j + 3]; rk[j + 3] = temp; } /* apply the inverse MixColumn transform to all round keys but the first and the last: */ for (i = 1; i < Nr; i++) { rk += 4; rk[0] = Td0[Te4[(rk[0] >> 24)] & 0xff] ^ Td1[Te4[(rk[0] >> 16) & 0xff] & 0xff] ^ Td2[Te4[(rk[0] >> 8) & 0xff] & 0xff] ^ Td3[Te4[(rk[0]) & 0xff] & 0xff]; rk[1] = Td0[Te4[(rk[1] >> 24)] & 0xff] ^ Td1[Te4[(rk[1] >> 16) & 0xff] & 0xff] ^ Td2[Te4[(rk[1] >> 8) & 0xff] & 0xff] ^ Td3[Te4[(rk[1]) & 0xff] & 0xff]; rk[2] = Td0[Te4[(rk[2] >> 24)] & 0xff] ^ Td1[Te4[(rk[2] >> 16) & 0xff] & 0xff] ^ Td2[Te4[(rk[2] >> 8) & 0xff] & 0xff] ^ Td3[Te4[(rk[2]) & 0xff] & 0xff]; rk[3] = Td0[Te4[(rk[3] >> 24)] & 0xff] ^ Td1[Te4[(rk[3] >> 16) & 0xff] & 0xff] ^ Td2[Te4[(rk[3] >> 8) & 0xff] & 0xff] ^ Td3[Te4[(rk[3]) & 0xff] & 0xff]; } return Nr; } void rijndaelEncrypt (const uint32_t rk[ /*4*(Nr + 1) */ ], size_t Nr, const char pt[16], char ct[16]) { uint32_t s0, s1, s2, s3, t0, t1, t2, t3; size_t r; /* * map byte array block to cipher state * and add initial round key: */ s0 = GETU32 (pt) ^ rk[0]; s1 = GETU32 (pt + 4) ^ rk[1]; s2 = GETU32 (pt + 8) ^ rk[2]; s3 = GETU32 (pt + 12) ^ rk[3]; /* * Nr - 1 full rounds: */ r = Nr >> 1; for (;;) { t0 = Te0[(s0 >> 24)] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^ Te3[(s3) & 0xff] ^ rk[4]; t1 = Te0[(s1 >> 24)] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^ Te3[(s0) & 0xff] ^ rk[5]; t2 = Te0[(s2 >> 24)] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^ Te3[(s1) & 0xff] ^ rk[6]; t3 = Te0[(s3 >> 24)] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^ Te3[(s2) & 0xff] ^ rk[7]; rk += 8; if (--r == 0) { break; } s0 = Te0[(t0 >> 24)] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >> 8) & 0xff] ^ Te3[(t3) & 0xff] ^ rk[0]; s1 = Te0[(t1 >> 24)] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >> 8) & 0xff] ^ Te3[(t0) & 0xff] ^ rk[1]; s2 = Te0[(t2 >> 24)] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >> 8) & 0xff] ^ Te3[(t1) & 0xff] ^ rk[2]; s3 = Te0[(t3 >> 24)] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >> 8) & 0xff] ^ Te3[(t2) & 0xff] ^ rk[3]; } /* * apply last round and * map cipher state to byte array block: */ s0 = (Te4[(t0 >> 24)] & 0xff000000) ^ (Te4[(t1 >> 16) & 0xff] & 0x00ff0000) ^ (Te4[(t2 >> 8) & 0xff] & 0x0000ff00) ^ (Te4[(t3) & 0xff] & 0x000000ff) ^ rk[0]; PUTU32 (ct, s0); s1 = (Te4[(t1 >> 24)] & 0xff000000) ^ (Te4[(t2 >> 16) & 0xff] & 0x00ff0000) ^ (Te4[(t3 >> 8) & 0xff] & 0x0000ff00) ^ (Te4[(t0) & 0xff] & 0x000000ff) ^ rk[1]; PUTU32 (ct + 4, s1); s2 = (Te4[(t2 >> 24)] & 0xff000000) ^ (Te4[(t3 >> 16) & 0xff] & 0x00ff0000) ^ (Te4[(t0 >> 8) & 0xff] & 0x0000ff00) ^ (Te4[(t1) & 0xff] & 0x000000ff) ^ rk[2]; PUTU32 (ct + 8, s2); s3 = (Te4[(t3 >> 24)] & 0xff000000) ^ (Te4[(t0 >> 16) & 0xff] & 0x00ff0000) ^ (Te4[(t1 >> 8) & 0xff] & 0x0000ff00) ^ (Te4[(t2) & 0xff] & 0x000000ff) ^ rk[3]; PUTU32 (ct + 12, s3); } void rijndaelDecrypt (const uint32_t rk[ /*4*(Nr + 1) */ ], size_t Nr, const char ct[16], char pt[16]) { uint32_t s0, s1, s2, s3, t0, t1, t2, t3; size_t r; /* * map byte array block to cipher state * and add initial round key: */ s0 = GETU32 (ct) ^ rk[0]; s1 = GETU32 (ct + 4) ^ rk[1]; s2 = GETU32 (ct + 8) ^ rk[2]; s3 = GETU32 (ct + 12) ^ rk[3]; /* * Nr - 1 full rounds: */ r = Nr >> 1; for (;;) { t0 = Td0[(s0 >> 24)] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] ^ Td3[(s1) & 0xff] ^ rk[4]; t1 = Td0[(s1 >> 24)] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] ^ Td3[(s2) & 0xff] ^ rk[5]; t2 = Td0[(s2 >> 24)] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] ^ Td3[(s3) & 0xff] ^ rk[6]; t3 = Td0[(s3 >> 24)] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] ^ Td3[(s0) & 0xff] ^ rk[7]; rk += 8; if (--r == 0) { break; } s0 = Td0[(t0 >> 24)] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >> 8) & 0xff] ^ Td3[(t1) & 0xff] ^ rk[0]; s1 = Td0[(t1 >> 24)] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >> 8) & 0xff] ^ Td3[(t2) & 0xff] ^ rk[1]; s2 = Td0[(t2 >> 24)] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >> 8) & 0xff] ^ Td3[(t3) & 0xff] ^ rk[2]; s3 = Td0[(t3 >> 24)] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >> 8) & 0xff] ^ Td3[(t0) & 0xff] ^ rk[3]; } /* * apply last round and * map cipher state to byte array block: */ s0 = (Td4[(t0 >> 24)] & 0xff000000) ^ (Td4[(t3 >> 16) & 0xff] & 0x00ff0000) ^ (Td4[(t2 >> 8) & 0xff] & 0x0000ff00) ^ (Td4[(t1) & 0xff] & 0x000000ff) ^ rk[0]; PUTU32 (pt, s0); s1 = (Td4[(t1 >> 24)] & 0xff000000) ^ (Td4[(t0 >> 16) & 0xff] & 0x00ff0000) ^ (Td4[(t3 >> 8) & 0xff] & 0x0000ff00) ^ (Td4[(t2) & 0xff] & 0x000000ff) ^ rk[1]; PUTU32 (pt + 4, s1); s2 = (Td4[(t2 >> 24)] & 0xff000000) ^ (Td4[(t1 >> 16) & 0xff] & 0x00ff0000) ^ (Td4[(t0 >> 8) & 0xff] & 0x0000ff00) ^ (Td4[(t3) & 0xff] & 0x000000ff) ^ rk[2]; PUTU32 (pt + 8, s2); s3 = (Td4[(t3 >> 24)] & 0xff000000) ^ (Td4[(t2 >> 16) & 0xff] & 0x00ff0000) ^ (Td4[(t1 >> 8) & 0xff] & 0x0000ff00) ^ (Td4[(t0) & 0xff] & 0x000000ff) ^ rk[3]; PUTU32 (pt + 12, s3); } pspp-1.4.1/gl/malloc.c0000644000175000017500000000273313723215637014146 0ustar00blpblp00000000000000/* malloc() function that is glibc compatible. Copyright (C) 1997-1998, 2006-2007, 2009-2020 Free Software Foundation, Inc. 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 3, 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, see . */ /* written by Jim Meyering and Bruno Haible */ #define _GL_USE_STDLIB_ALLOC 1 #include /* Only the AC_FUNC_MALLOC macro defines 'malloc' already in config.h. */ #ifdef malloc # define NEED_MALLOC_GNU 1 # undef malloc /* Whereas the gnulib module 'malloc-gnu' defines HAVE_MALLOC_GNU. */ #elif GNULIB_MALLOC_GNU && !HAVE_MALLOC_GNU # define NEED_MALLOC_GNU 1 #endif #include #include /* Allocate an N-byte block of memory from the heap. If N is zero, allocate a 1-byte block. */ void * rpl_malloc (size_t n) { void *result; #if NEED_MALLOC_GNU if (n == 0) n = 1; #endif result = malloc (n); #if !HAVE_MALLOC_POSIX if (result == NULL) errno = ENOMEM; #endif return result; } pspp-1.4.1/gl/dirname.h0000644000175000017500000000254513723215636014323 0ustar00blpblp00000000000000/* Take file names apart into directory and base names. Copyright (C) 1998, 2001, 2003-2006, 2009-2020 Free Software Foundation, Inc. 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 3 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, see . */ #ifndef DIRNAME_H_ # define DIRNAME_H_ 1 # include # include # include "filename.h" # include "basename-lgpl.h" # ifndef DIRECTORY_SEPARATOR # define DIRECTORY_SEPARATOR '/' # endif #ifdef __cplusplus extern "C" { #endif # if GNULIB_DIRNAME char *base_name (char const *file) _GL_ATTRIBUTE_MALLOC; char *dir_name (char const *file); # endif char *mdir_name (char const *file); size_t dir_len (char const *file) _GL_ATTRIBUTE_PURE; bool strip_trailing_slashes (char *file); #ifdef __cplusplus } /* extern "C" */ #endif #endif /* not DIRNAME_H_ */ pspp-1.4.1/gl/gl_anyhash_primes.h0000644000175000017500000001134513723215637016377 0ustar00blpblp00000000000000/* Table of primes, for use by hash tables. Copyright (C) 2006, 2009-2020 Free Software Foundation, Inc. Written by Bruno Haible , 2006. 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 3 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, see . */ /* Array of primes, approximately in steps of factor 1.2. This table was computed by executing the Common Lisp expression (dotimes (i 244) (format t "nextprime(~D)~%" (ceiling (expt 1.2d0 i)))) and feeding the result to PARI/gp. */ static const size_t primes[] = { 11, 13, 17, 19, 23, 29, 37, 41, 47, 59, 67, 83, 97, 127, 139, 167, 199, 239, 293, 347, 419, 499, 593, 709, 853, 1021, 1229, 1471, 1777, 2129, 2543, 3049, 3659, 4391, 5273, 6323, 7589, 9103, 10937, 13109, 15727, 18899, 22651, 27179, 32609, 39133, 46957, 56359, 67619, 81157, 97369, 116849, 140221, 168253, 201907, 242309, 290761, 348889, 418667, 502409, 602887, 723467, 868151, 1041779, 1250141, 1500181, 1800191, 2160233, 2592277, 3110741, 3732887, 4479463, 5375371, 6450413, 7740517, 9288589, 11146307, 13375573, 16050689, 19260817, 23112977, 27735583, 33282701, 39939233, 47927081, 57512503, 69014987, 82818011, 99381577, 119257891, 143109469, 171731387, 206077643, 247293161, 296751781, 356102141, 427322587, 512787097, 615344489, 738413383, 886096061, 1063315271, 1275978331, 1531174013, 1837408799, 2204890543UL, 2645868653UL, 3175042391UL, 3810050851UL, #if SIZE_MAX > 4294967295UL 4572061027UL, 5486473229UL, 6583767889UL, 7900521449UL, 9480625733UL, 11376750877UL, 13652101063UL, 16382521261UL, 19659025513UL, 23590830631UL, 28308996763UL, 33970796089UL, 40764955463UL, 48917946377UL, 58701535657UL, 70441842749UL, 84530211301UL, 101436253561UL, 121723504277UL, 146068205131UL, 175281846149UL, 210338215379UL, 252405858521UL, 302887030151UL, 363464436191UL, 436157323417UL, 523388788231UL, 628066545713UL, 753679854847UL, 904415825857UL, 1085298991109UL, 1302358789181UL, 1562830547009UL, 1875396656429UL, 2250475987709UL, 2700571185239UL, 3240685422287UL, 3888822506759UL, 4666587008147UL, 5599904409713UL, 6719885291641UL, 8063862349969UL, 9676634819959UL, 11611961783951UL, 13934354140769UL, 16721224968907UL, 20065469962669UL, 24078563955191UL, 28894276746229UL, 34673132095507UL, 41607758514593UL, 49929310217531UL, 59915172260971UL, 71898206713183UL, 86277848055823UL, 103533417666967UL, 124240101200359UL, 149088121440451UL, 178905745728529UL, 214686894874223UL, 257624273849081UL, 309149128618903UL, 370978954342639UL, 445174745211143UL, 534209694253381UL, 641051633104063UL, 769261959724877UL, 923114351670013UL, 1107737222003791UL, 1329284666404567UL, 1595141599685509UL, 1914169919622551UL, 2297003903547091UL, 2756404684256459UL, 3307685621107757UL, 3969222745329323UL, 4763067294395177UL, 5715680753274209UL, 6858816903929113UL, 8230580284714831UL, 9876696341657791UL, 11852035609989371UL, 14222442731987227UL, 17066931278384657UL, 20480317534061597UL, 24576381040873903UL, 29491657249048679UL, 35389988698858471UL, 42467986438630267UL, 50961583726356109UL, 61153900471627387UL, 73384680565952851UL, 88061616679143347UL, 105673940014972061UL, 126808728017966413UL, 152170473621559703UL, 182604568345871671UL, 219125482015045997UL, 262950578418055169UL, 315540694101666193UL, 378648832921999397UL, 454378599506399233UL, 545254319407679131UL, 654305183289214771UL, 785166219947057701UL, 942199463936469157UL, 1130639356723763129UL, 1356767228068515623UL, 1628120673682218619UL, 1953744808418662409UL, 2344493770102394881UL, 2813392524122873857UL, 3376071028947448339UL, 4051285234736937517UL, 4861542281684325481UL, 5833850738021191727UL, 7000620885625427969UL, 8400745062750513217UL, 10080894075300616261UL, 12097072890360739951UL, 14516487468432885797UL, 17419784962119465179UL, #endif SIZE_MAX /* sentinel, to ensure the search terminates */ }; /* Returns a suitable prime >= ESTIMATE. */ static size_t next_prime (size_t estimate) { size_t i; for (i = 0; i < sizeof (primes) / sizeof (primes[0]); i++) if (primes[i] >= estimate) return primes[i]; return SIZE_MAX; /* not a prime, but better than nothing */ } pspp-1.4.1/gl/nl_langinfo.c0000644000175000017500000002761013723215637015166 0ustar00blpblp00000000000000/* nl_langinfo() replacement: query locale dependent information. Copyright (C) 2007-2020 Free Software Foundation, Inc. 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 3 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, see . */ #include /* Specification. */ #include #include #include #if defined _WIN32 && ! defined __CYGWIN__ # define WIN32_LEAN_AND_MEAN /* avoid including junk */ # include # include #endif /* nl_langinfo() must be multithread-safe. To achieve this without using thread-local storage: 1. We use a specific static buffer for each possible argument. So that different threads can call nl_langinfo with different arguments, without interfering. 2. We use a simple strcpy or memcpy to fill this static buffer. Filling it through, for example, strcpy + strcat would not be guaranteed to leave the buffer's contents intact if another thread is currently accessing it. If necessary, the contents is first assembled in a stack-allocated buffer. */ #if !REPLACE_NL_LANGINFO || GNULIB_defined_CODESET /* Return the codeset of the current locale, if this is easily deducible. Otherwise, return "". */ static char * ctype_codeset (void) { static char result[2 + 10 + 1]; char buf[2 + 10 + 1]; char locale[SETLOCALE_NULL_MAX]; char *codeset; size_t codesetlen; if (setlocale_null_r (LC_CTYPE, locale, sizeof (locale))) locale[0] = '\0'; codeset = buf; codeset[0] = '\0'; if (locale && locale[0]) { /* If the locale name contains an encoding after the dot, return it. */ char *dot = strchr (locale, '.'); if (dot) { /* Look for the possible @... trailer and remove it, if any. */ char *codeset_start = dot + 1; char const *modifier = strchr (codeset_start, '@'); if (! modifier) codeset = codeset_start; else { codesetlen = modifier - codeset_start; if (codesetlen < sizeof buf) { codeset = memcpy (buf, codeset_start, codesetlen); codeset[codesetlen] = '\0'; } } } } # if defined _WIN32 && ! defined __CYGWIN__ /* If setlocale is successful, it returns the number of the codepage, as a string. Otherwise, fall back on Windows API GetACP, which returns the locale's codepage as a number (although this doesn't change according to what the 'setlocale' call specified). Either way, prepend "CP" to make it a valid codeset name. */ codesetlen = strlen (codeset); if (0 < codesetlen && codesetlen < sizeof buf - 2) memmove (buf + 2, codeset, codesetlen + 1); else sprintf (buf + 2, "%u", GetACP ()); /* For a locale name such as "French_France.65001", in Windows 10, setlocale now returns "French_France.utf8" instead. */ if (strcmp (buf + 2, "65001") == 0 || strcmp (buf + 2, "utf8") == 0) return (char *) "UTF-8"; else { memcpy (buf, "CP", 2); strcpy (result, buf); return result; } # else strcpy (result, codeset); return result; #endif } #endif #if REPLACE_NL_LANGINFO /* Override nl_langinfo with support for added nl_item values. */ # undef nl_langinfo char * rpl_nl_langinfo (nl_item item) { switch (item) { # if GNULIB_defined_CODESET case CODESET: return ctype_codeset (); # endif # if GNULIB_defined_T_FMT_AMPM case T_FMT_AMPM: return (char *) "%I:%M:%S %p"; # endif # if GNULIB_defined_ALTMON case ALTMON_1: case ALTMON_2: case ALTMON_3: case ALTMON_4: case ALTMON_5: case ALTMON_6: case ALTMON_7: case ALTMON_8: case ALTMON_9: case ALTMON_10: case ALTMON_11: case ALTMON_12: /* We don't ship the appropriate localizations with gnulib. Therefore, treat ALTMON_i like MON_i. */ item = item - ALTMON_1 + MON_1; break; # endif # if GNULIB_defined_ERA case ERA: /* The format is not standardized. In glibc it is a sequence of strings of the form "direction:offset:start_date:end_date:era_name:era_format" with an empty string at the end. */ return (char *) ""; case ERA_D_FMT: /* The %Ex conversion in strftime behaves like %x if the locale does not have an alternative time format. */ item = D_FMT; break; case ERA_D_T_FMT: /* The %Ec conversion in strftime behaves like %c if the locale does not have an alternative time format. */ item = D_T_FMT; break; case ERA_T_FMT: /* The %EX conversion in strftime behaves like %X if the locale does not have an alternative time format. */ item = T_FMT; break; case ALT_DIGITS: /* The format is not standardized. In glibc it is a sequence of 10 strings, appended in memory. */ return (char *) "\0\0\0\0\0\0\0\0\0\0"; # endif # if GNULIB_defined_YESEXPR || !FUNC_NL_LANGINFO_YESEXPR_WORKS case YESEXPR: return (char *) "^[yY]"; case NOEXPR: return (char *) "^[nN]"; # endif default: break; } return nl_langinfo (item); } #else /* Provide nl_langinfo from scratch, either for native MS-Windows, or for old Unix platforms without locales, such as Linux libc5 or BeOS. */ # include char * nl_langinfo (nl_item item) { char buf[100]; struct tm tmm = { 0 }; switch (item) { /* nl_langinfo items of the LC_CTYPE category */ case CODESET: { char *codeset = ctype_codeset (); if (*codeset) return codeset; } # ifdef __BEOS__ return (char *) "UTF-8"; # else return (char *) "ISO-8859-1"; # endif /* nl_langinfo items of the LC_NUMERIC category */ case RADIXCHAR: return localeconv () ->decimal_point; case THOUSEP: return localeconv () ->thousands_sep; # ifdef GROUPING case GROUPING: return localeconv () ->grouping; # endif /* nl_langinfo items of the LC_TIME category. TODO: Really use the locale. */ case D_T_FMT: case ERA_D_T_FMT: return (char *) "%a %b %e %H:%M:%S %Y"; case D_FMT: case ERA_D_FMT: return (char *) "%m/%d/%y"; case T_FMT: case ERA_T_FMT: return (char *) "%H:%M:%S"; case T_FMT_AMPM: return (char *) "%I:%M:%S %p"; case AM_STR: { static char result[80]; if (!strftime (buf, sizeof result, "%p", &tmm)) return (char *) "AM"; strcpy (result, buf); return result; } case PM_STR: { static char result[80]; tmm.tm_hour = 12; if (!strftime (buf, sizeof result, "%p", &tmm)) return (char *) "PM"; strcpy (result, buf); return result; } case DAY_1: case DAY_2: case DAY_3: case DAY_4: case DAY_5: case DAY_6: case DAY_7: { static char result[7][50]; static char const days[][sizeof "Wednesday"] = { "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" }; tmm.tm_wday = item - DAY_1; if (!strftime (buf, sizeof result[0], "%A", &tmm)) return (char *) days[item - DAY_1]; strcpy (result[item - DAY_1], buf); return result[item - DAY_1]; } case ABDAY_1: case ABDAY_2: case ABDAY_3: case ABDAY_4: case ABDAY_5: case ABDAY_6: case ABDAY_7: { static char result[7][30]; static char const abdays[][sizeof "Sun"] = { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" }; tmm.tm_wday = item - ABDAY_1; if (!strftime (buf, sizeof result[0], "%a", &tmm)) return (char *) abdays[item - ABDAY_1]; strcpy (result[item - ABDAY_1], buf); return result[item - ABDAY_1]; } { static char const months[][sizeof "September"] = { "January", "February", "March", "April", "May", "June", "July", "September", "October", "November", "December" }; case MON_1: case MON_2: case MON_3: case MON_4: case MON_5: case MON_6: case MON_7: case MON_8: case MON_9: case MON_10: case MON_11: case MON_12: { static char result[12][50]; tmm.tm_mon = item - MON_1; if (!strftime (buf, sizeof result[0], "%B", &tmm)) return (char *) months[item - MON_1]; strcpy (result[item - MON_1], buf); return result[item - MON_1]; } case ALTMON_1: case ALTMON_2: case ALTMON_3: case ALTMON_4: case ALTMON_5: case ALTMON_6: case ALTMON_7: case ALTMON_8: case ALTMON_9: case ALTMON_10: case ALTMON_11: case ALTMON_12: { static char result[12][50]; tmm.tm_mon = item - ALTMON_1; /* The platforms without nl_langinfo() don't support strftime with %OB. We don't even need to try. */ #if 0 if (!strftime (buf, sizeof result[0], "%OB", &tmm)) #endif if (!strftime (buf, sizeof result[0], "%B", &tmm)) return (char *) months[item - ALTMON_1]; strcpy (result[item - ALTMON_1], buf); return result[item - ALTMON_1]; } } case ABMON_1: case ABMON_2: case ABMON_3: case ABMON_4: case ABMON_5: case ABMON_6: case ABMON_7: case ABMON_8: case ABMON_9: case ABMON_10: case ABMON_11: case ABMON_12: { static char result[12][30]; static char const abmonths[][sizeof "Jan"] = { "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Sep", "Oct", "Nov", "Dec" }; tmm.tm_mon = item - ABMON_1; if (!strftime (buf, sizeof result[0], "%b", &tmm)) return (char *) abmonths[item - ABMON_1]; strcpy (result[item - ABMON_1], buf); return result[item - ABMON_1]; } case ERA: return (char *) ""; case ALT_DIGITS: return (char *) "\0\0\0\0\0\0\0\0\0\0"; /* nl_langinfo items of the LC_MONETARY category. */ case CRNCYSTR: return localeconv () ->currency_symbol; # ifdef INT_CURR_SYMBOL case INT_CURR_SYMBOL: return localeconv () ->int_curr_symbol; case MON_DECIMAL_POINT: return localeconv () ->mon_decimal_point; case MON_THOUSANDS_SEP: return localeconv () ->mon_thousands_sep; case MON_GROUPING: return localeconv () ->mon_grouping; case POSITIVE_SIGN: return localeconv () ->positive_sign; case NEGATIVE_SIGN: return localeconv () ->negative_sign; case FRAC_DIGITS: return & localeconv () ->frac_digits; case INT_FRAC_DIGITS: return & localeconv () ->int_frac_digits; case P_CS_PRECEDES: return & localeconv () ->p_cs_precedes; case N_CS_PRECEDES: return & localeconv () ->n_cs_precedes; case P_SEP_BY_SPACE: return & localeconv () ->p_sep_by_space; case N_SEP_BY_SPACE: return & localeconv () ->n_sep_by_space; case P_SIGN_POSN: return & localeconv () ->p_sign_posn; case N_SIGN_POSN: return & localeconv () ->n_sign_posn; # endif /* nl_langinfo items of the LC_MESSAGES category TODO: Really use the locale. */ case YESEXPR: return (char *) "^[yY]"; case NOEXPR: return (char *) "^[nN]"; default: return (char *) ""; } } #endif pspp-1.4.1/gl/stripslash.c0000644000175000017500000000304213723215640015057 0ustar00blpblp00000000000000/* stripslash.c -- remove redundant trailing slashes from a file name Copyright (C) 1990, 2001, 2003-2006, 2009-2020 Free Software Foundation, Inc. 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 3 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, see . */ #include #include "dirname.h" /* Remove trailing slashes from FILE. Return true if a trailing slash was removed. This is useful when using file name completion from a shell that adds a "/" after directory names (such as tcsh and bash), because on symlinks to directories, several system calls have different semantics according to whether a trailing slash is present. */ bool strip_trailing_slashes (char *file) { char *base = last_component (file); char *base_lim; bool had_slash; /* last_component returns "" for file system roots, but we need to turn "///" into "/". */ if (! *base) base = file; base_lim = base + base_len (base); had_slash = (*base_lim != '\0'); *base_lim = '\0'; return had_slash; } pspp-1.4.1/gl/fatal-signal.c0000644000175000017500000002333013723215636015234 0ustar00blpblp00000000000000/* Emergency actions in case of a fatal signal. Copyright (C) 2003-2004, 2006-2020 Free Software Foundation, Inc. Written by Bruno Haible , 2003. 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 3 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, see . */ #include /* Specification. */ #include "fatal-signal.h" #include #include #include #include #include "glthread/lock.h" #include "thread-optim.h" #include "sig-handler.h" #include "xalloc.h" #define SIZEOF(a) (sizeof(a) / sizeof(a[0])) /* ========================================================================= */ /* The list of fatal signals. These are those signals whose default action is to terminate the process without a core dump, except SIGKILL - because it cannot be caught, SIGALRM SIGUSR1 SIGUSR2 SIGPOLL SIGIO SIGLOST - because applications often use them for their own purpose, SIGPROF SIGVTALRM - because they are used for profiling, SIGSTKFLT - because it is more similar to SIGFPE, SIGSEGV, SIGBUS, SIGSYS - because it is more similar to SIGABRT, SIGSEGV, SIGPWR - because it of too special use, SIGRTMIN...SIGRTMAX - because they are reserved for application use. plus SIGXCPU, SIGXFSZ - because they are quite similar to SIGTERM. */ static int fatal_signals[] = { /* ISO C 99 signals. */ #ifdef SIGINT SIGINT, #endif #ifdef SIGTERM SIGTERM, #endif /* POSIX:2001 signals. */ #ifdef SIGHUP SIGHUP, #endif #ifdef SIGPIPE SIGPIPE, #endif /* BSD signals. */ #ifdef SIGXCPU SIGXCPU, #endif #ifdef SIGXFSZ SIGXFSZ, #endif /* Native Windows signals. */ #ifdef SIGBREAK SIGBREAK, #endif 0 }; #define num_fatal_signals (SIZEOF (fatal_signals) - 1) /* Eliminate signals whose signal handler is SIG_IGN. */ static void init_fatal_signals (void) { /* This function is multithread-safe even without synchronization, because if two threads execute it simultaneously, the fatal_signals[] array will not change any more after the first of the threads has completed this function. */ static bool fatal_signals_initialized = false; if (!fatal_signals_initialized) { size_t i; for (i = 0; i < num_fatal_signals; i++) { struct sigaction action; if (sigaction (fatal_signals[i], NULL, &action) >= 0 && get_handler (&action) == SIG_IGN) fatal_signals[i] = -1; } fatal_signals_initialized = true; } } /* ========================================================================= */ typedef _GL_ASYNC_SAFE void (*action_t) (int sig); /* Type of an entry in the actions array. The 'action' field is accessed from within the fatal_signal_handler(), therefore we mark it as 'volatile'. */ typedef struct { volatile action_t action; } actions_entry_t; /* The registered cleanup actions. */ static actions_entry_t static_actions[32]; static actions_entry_t * volatile actions = static_actions; static sig_atomic_t volatile actions_count = 0; static size_t actions_allocated = SIZEOF (static_actions); /* The saved signal handlers. Size 32 would not be sufficient: On HP-UX, SIGXCPU = 33, SIGXFSZ = 34. */ static struct sigaction saved_sigactions[64]; /* Uninstall the handlers. */ static _GL_ASYNC_SAFE void uninstall_handlers (void) { size_t i; for (i = 0; i < num_fatal_signals; i++) if (fatal_signals[i] >= 0) { int sig = fatal_signals[i]; if (saved_sigactions[sig].sa_handler == SIG_IGN) saved_sigactions[sig].sa_handler = SIG_DFL; sigaction (sig, &saved_sigactions[sig], NULL); } } /* The signal handler. It gets called asynchronously. */ static _GL_ASYNC_SAFE void fatal_signal_handler (int sig) { for (;;) { /* Get the last registered cleanup action, in a reentrant way. */ action_t action; size_t n = actions_count; if (n == 0) break; n--; actions_count = n; action = actions[n].action; /* Execute the action. */ action (sig); } /* Now execute the signal's default action. If the signal being delivered was blocked, the re-raised signal would be delivered when this handler returns. But the way we install this handler, no signal is blocked, and the re-raised signal is delivered already during raise(). */ uninstall_handlers (); raise (sig); } /* Install the handlers. */ static void install_handlers (void) { size_t i; struct sigaction action; action.sa_handler = &fatal_signal_handler; /* If we get a fatal signal while executing fatal_signal_handler, enter fatal_signal_handler recursively, since it is reentrant. Hence no SA_RESETHAND. */ action.sa_flags = SA_NODEFER; sigemptyset (&action.sa_mask); for (i = 0; i < num_fatal_signals; i++) if (fatal_signals[i] >= 0) { int sig = fatal_signals[i]; if (!(sig < sizeof (saved_sigactions) / sizeof (saved_sigactions[0]))) abort (); sigaction (sig, &action, &saved_sigactions[sig]); } } /* Lock that makes at_fatal_signal multi-thread safe. */ gl_lock_define_initialized (static, at_fatal_signal_lock) /* Register a cleanup function to be executed when a catchable fatal signal occurs. */ void at_fatal_signal (action_t action) { IF_MT_DECL; IF_MT gl_lock_lock (at_fatal_signal_lock); static bool cleanup_initialized = false; if (!cleanup_initialized) { init_fatal_signals (); install_handlers (); cleanup_initialized = true; } if (actions_count == actions_allocated) { /* Extend the actions array. Note that we cannot use xrealloc(), because then the cleanup() function could access an already deallocated array. */ actions_entry_t *old_actions = actions; size_t old_actions_allocated = actions_allocated; size_t new_actions_allocated = 2 * actions_allocated; actions_entry_t *new_actions = XNMALLOC (new_actions_allocated, actions_entry_t); size_t k; /* Don't use memcpy() here, because memcpy takes non-volatile arguments and is therefore not guaranteed to complete all memory stores before the next statement. */ for (k = 0; k < old_actions_allocated; k++) new_actions[k] = old_actions[k]; actions = new_actions; actions_allocated = new_actions_allocated; /* Now we can free the old actions array. */ /* No, we can't do that. If fatal_signal_handler is running in a different thread and has already fetched the actions pointer (getting old_actions) but not yet accessed its n-th element, that thread may crash when accessing an element of the already freed old_actions array. */ #if 0 if (old_actions != static_actions) free (old_actions); #endif } /* The two uses of 'volatile' in the types above (and ISO C 99 section 5.1.2.3.(5)) ensure that we increment the actions_count only after the new action has been written to the memory location actions[actions_count]. */ actions[actions_count].action = action; actions_count++; IF_MT gl_lock_unlock (at_fatal_signal_lock); } /* ========================================================================= */ static sigset_t fatal_signal_set; static void do_init_fatal_signal_set (void) { size_t i; init_fatal_signals (); sigemptyset (&fatal_signal_set); for (i = 0; i < num_fatal_signals; i++) if (fatal_signals[i] >= 0) sigaddset (&fatal_signal_set, fatal_signals[i]); } /* Ensure that do_init_fatal_signal_set is called once only. */ gl_once_define(static, fatal_signal_set_once) static void init_fatal_signal_set (void) { gl_once (fatal_signal_set_once, do_init_fatal_signal_set); } /* Lock and counter that allow block_fatal_signals/unblock_fatal_signals pairs to occur in different threads and even overlap in time. */ gl_lock_define_initialized (static, fatal_signals_block_lock) static unsigned int fatal_signals_block_counter = 0; /* Temporarily delay the catchable fatal signals. */ void block_fatal_signals (void) { IF_MT_DECL; IF_MT gl_lock_lock (fatal_signals_block_lock); if (fatal_signals_block_counter++ == 0) { init_fatal_signal_set (); sigprocmask (SIG_BLOCK, &fatal_signal_set, NULL); } IF_MT gl_lock_unlock (fatal_signals_block_lock); } /* Stop delaying the catchable fatal signals. */ void unblock_fatal_signals (void) { IF_MT_DECL; IF_MT gl_lock_lock (fatal_signals_block_lock); if (fatal_signals_block_counter == 0) /* There are more calls to unblock_fatal_signals() than to block_fatal_signals(). */ abort (); if (--fatal_signals_block_counter == 0) { init_fatal_signal_set (); sigprocmask (SIG_UNBLOCK, &fatal_signal_set, NULL); } IF_MT gl_lock_unlock (fatal_signals_block_lock); } unsigned int get_fatal_signals (int signals[64]) { init_fatal_signal_set (); { int *p = signals; size_t i; for (i = 0; i < num_fatal_signals; i++) if (fatal_signals[i] >= 0) *p++ = fatal_signals[i]; return p - signals; } } const sigset_t * get_fatal_signal_set (void) { init_fatal_signal_set (); return &fatal_signal_set; } pspp-1.4.1/gl/time_r.c0000644000175000017500000000227413723215640014150 0ustar00blpblp00000000000000/* Reentrant time functions like localtime_r. Copyright (C) 2003, 2006-2007, 2010-2020 Free Software Foundation, Inc. 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 3, 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, see . */ /* Written by Paul Eggert. */ #include #include static struct tm * copy_tm_result (struct tm *dest, struct tm const *src) { if (! src) return 0; *dest = *src; return dest; } struct tm * gmtime_r (time_t const * restrict t, struct tm * restrict tp) { return copy_tm_result (tp, gmtime (t)); } struct tm * localtime_r (time_t const * restrict t, struct tm * restrict tp) { return copy_tm_result (tp, localtime (t)); } pspp-1.4.1/gl/xalloc.h0000644000175000017500000001652113723215640014160 0ustar00blpblp00000000000000/* xalloc.h -- malloc with out-of-memory checking Copyright (C) 1990-2000, 2003-2004, 2006-2020 Free Software Foundation, Inc. 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 3 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, see . */ #ifndef XALLOC_H_ #define XALLOC_H_ #include #include #include "xalloc-oversized.h" #ifndef _GL_INLINE_HEADER_BEGIN #error "Please include config.h first." #endif _GL_INLINE_HEADER_BEGIN #ifndef XALLOC_INLINE # define XALLOC_INLINE _GL_INLINE #endif #ifdef __cplusplus extern "C" { #endif /* This function is always triggered when memory is exhausted. It must be defined by the application, either explicitly or by using gnulib's xalloc-die module. This is the function to call when one wants the program to die because of a memory allocation failure. */ /*extern*/ _Noreturn void xalloc_die (void); void *xmalloc (size_t s) _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_ALLOC_SIZE ((1)); void *xzalloc (size_t s) _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_ALLOC_SIZE ((1)); void *xcalloc (size_t n, size_t s) _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_ALLOC_SIZE ((1, 2)); void *xrealloc (void *p, size_t s) _GL_ATTRIBUTE_ALLOC_SIZE ((2)); void *x2realloc (void *p, size_t *pn); void *xmemdup (void const *p, size_t s) _GL_ATTRIBUTE_ALLOC_SIZE ((2)); char *xstrdup (char const *str) _GL_ATTRIBUTE_MALLOC; /* In the following macros, T must be an elementary or structure/union or typedef'ed type, or a pointer to such a type. To apply one of the following macros to a function pointer or array type, you need to typedef it first and use the typedef name. */ /* Allocate an object of type T dynamically, with error checking. */ /* extern t *XMALLOC (typename t); */ #define XMALLOC(t) ((t *) xmalloc (sizeof (t))) /* Allocate memory for N elements of type T, with error checking. */ /* extern t *XNMALLOC (size_t n, typename t); */ #define XNMALLOC(n, t) \ ((t *) (sizeof (t) == 1 ? xmalloc (n) : xnmalloc (n, sizeof (t)))) /* Allocate an object of type T dynamically, with error checking, and zero it. */ /* extern t *XZALLOC (typename t); */ #define XZALLOC(t) ((t *) xzalloc (sizeof (t))) /* Allocate memory for N elements of type T, with error checking, and zero it. */ /* extern t *XCALLOC (size_t n, typename t); */ #define XCALLOC(n, t) \ ((t *) (sizeof (t) == 1 ? xzalloc (n) : xcalloc (n, sizeof (t)))) /* Allocate an array of N objects, each with S bytes of memory, dynamically, with error checking. S must be nonzero. */ XALLOC_INLINE void *xnmalloc (size_t n, size_t s) _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_ALLOC_SIZE ((1, 2)); XALLOC_INLINE void * xnmalloc (size_t n, size_t s) { if (xalloc_oversized (n, s)) xalloc_die (); return xmalloc (n * s); } /* Change the size of an allocated block of memory P to an array of N objects each of S bytes, with error checking. S must be nonzero. */ XALLOC_INLINE void *xnrealloc (void *p, size_t n, size_t s) _GL_ATTRIBUTE_ALLOC_SIZE ((2, 3)); XALLOC_INLINE void * xnrealloc (void *p, size_t n, size_t s) { if (xalloc_oversized (n, s)) xalloc_die (); return xrealloc (p, n * s); } /* If P is null, allocate a block of at least *PN such objects; otherwise, reallocate P so that it contains more than *PN objects each of S bytes. S must be nonzero. Set *PN to the new number of objects, and return the pointer to the new block. *PN is never set to zero, and the returned pointer is never null. Repeated reallocations are guaranteed to make progress, either by allocating an initial block with a nonzero size, or by allocating a larger block. In the following implementation, nonzero sizes are increased by a factor of approximately 1.5 so that repeated reallocations have O(N) overall cost rather than O(N**2) cost, but the specification for this function does not guarantee that rate. Here is an example of use: int *p = NULL; size_t used = 0; size_t allocated = 0; void append_int (int value) { if (used == allocated) p = x2nrealloc (p, &allocated, sizeof *p); p[used++] = value; } This causes x2nrealloc to allocate a block of some nonzero size the first time it is called. To have finer-grained control over the initial size, set *PN to a nonzero value before calling this function with P == NULL. For example: int *p = NULL; size_t used = 0; size_t allocated = 0; size_t allocated1 = 1000; void append_int (int value) { if (used == allocated) { p = x2nrealloc (p, &allocated1, sizeof *p); allocated = allocated1; } p[used++] = value; } */ XALLOC_INLINE void * x2nrealloc (void *p, size_t *pn, size_t s) { size_t n = *pn; if (! p) { if (! n) { /* The approximate size to use for initial small allocation requests, when the invoking code specifies an old size of zero. This is the largest "small" request for the GNU C library malloc. */ enum { DEFAULT_MXFAST = 64 * sizeof (size_t) / 4 }; n = DEFAULT_MXFAST / s; n += !n; } if (xalloc_oversized (n, s)) xalloc_die (); } else { /* Set N = floor (1.5 * N) + 1 so that progress is made even if N == 0. Check for overflow, so that N * S stays in both ptrdiff_t and size_t range. The check may be slightly conservative, but an exact check isn't worth the trouble. */ if ((PTRDIFF_MAX < SIZE_MAX ? PTRDIFF_MAX : SIZE_MAX) / 3 * 2 / s <= n) xalloc_die (); n += n / 2 + 1; } *pn = n; return xrealloc (p, n * s); } /* Return a pointer to a new buffer of N bytes. This is like xmalloc, except it returns char *. */ XALLOC_INLINE char *xcharalloc (size_t n) _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_ALLOC_SIZE ((1)); XALLOC_INLINE char * xcharalloc (size_t n) { return XNMALLOC (n, char); } #ifdef __cplusplus } /* C++ does not allow conversions from void * to other pointer types without a cast. Use templates to work around the problem when possible. */ template inline T * xrealloc (T *p, size_t s) { return (T *) xrealloc ((void *) p, s); } template inline T * xnrealloc (T *p, size_t n, size_t s) { return (T *) xnrealloc ((void *) p, n, s); } template inline T * x2realloc (T *p, size_t *pn) { return (T *) x2realloc ((void *) p, pn); } template inline T * x2nrealloc (T *p, size_t *pn, size_t s) { return (T *) x2nrealloc ((void *) p, pn, s); } template inline T * xmemdup (T const *p, size_t s) { return (T *) xmemdup ((void const *) p, s); } #endif _GL_INLINE_HEADER_END #endif /* !XALLOC_H_ */ pspp-1.4.1/gl/printf-args.c0000644000175000017500000001453713723215640015132 0ustar00blpblp00000000000000/* Decomposed printf argument list. Copyright (C) 1999, 2002-2003, 2005-2007, 2009-2020 Free Software Foundation, Inc. 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 3, 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, see . */ /* This file can be parametrized with the following macros: ENABLE_UNISTDIO Set to 1 to enable the unistdio extensions. PRINTF_FETCHARGS Name of the function to be defined. STATIC Set to 'static' to declare the function static. */ #ifndef PRINTF_FETCHARGS # include #endif /* Specification. */ #ifndef PRINTF_FETCHARGS # include "printf-args.h" #endif #ifdef STATIC STATIC #endif int PRINTF_FETCHARGS (va_list args, arguments *a) { size_t i; argument *ap; for (i = 0, ap = &a->arg[0]; i < a->count; i++, ap++) switch (ap->type) { case TYPE_SCHAR: ap->a.a_schar = va_arg (args, /*signed char*/ int); break; case TYPE_UCHAR: ap->a.a_uchar = va_arg (args, /*unsigned char*/ int); break; case TYPE_SHORT: ap->a.a_short = va_arg (args, /*short*/ int); break; case TYPE_USHORT: ap->a.a_ushort = va_arg (args, /*unsigned short*/ int); break; case TYPE_INT: ap->a.a_int = va_arg (args, int); break; case TYPE_UINT: ap->a.a_uint = va_arg (args, unsigned int); break; case TYPE_LONGINT: ap->a.a_longint = va_arg (args, long int); break; case TYPE_ULONGINT: ap->a.a_ulongint = va_arg (args, unsigned long int); break; case TYPE_LONGLONGINT: ap->a.a_longlongint = va_arg (args, long long int); break; case TYPE_ULONGLONGINT: ap->a.a_ulonglongint = va_arg (args, unsigned long long int); break; case TYPE_DOUBLE: ap->a.a_double = va_arg (args, double); break; case TYPE_LONGDOUBLE: ap->a.a_longdouble = va_arg (args, long double); break; case TYPE_CHAR: ap->a.a_char = va_arg (args, int); break; #if HAVE_WINT_T case TYPE_WIDE_CHAR: /* Although ISO C 99 7.24.1.(2) says that wint_t is "unchanged by default argument promotions", this is not the case in mingw32, where wint_t is 'unsigned short'. */ ap->a.a_wide_char = (sizeof (wint_t) < sizeof (int) ? (wint_t) va_arg (args, int) : va_arg (args, wint_t)); break; #endif case TYPE_STRING: ap->a.a_string = va_arg (args, const char *); /* A null pointer is an invalid argument for "%s", but in practice it occurs quite frequently in printf statements that produce debug output. Use a fallback in this case. */ if (ap->a.a_string == NULL) ap->a.a_string = "(NULL)"; break; #if HAVE_WCHAR_T case TYPE_WIDE_STRING: ap->a.a_wide_string = va_arg (args, const wchar_t *); /* A null pointer is an invalid argument for "%ls", but in practice it occurs quite frequently in printf statements that produce debug output. Use a fallback in this case. */ if (ap->a.a_wide_string == NULL) { static const wchar_t wide_null_string[] = { (wchar_t)'(', (wchar_t)'N', (wchar_t)'U', (wchar_t)'L', (wchar_t)'L', (wchar_t)')', (wchar_t)0 }; ap->a.a_wide_string = wide_null_string; } break; #endif case TYPE_POINTER: ap->a.a_pointer = va_arg (args, void *); break; case TYPE_COUNT_SCHAR_POINTER: ap->a.a_count_schar_pointer = va_arg (args, signed char *); break; case TYPE_COUNT_SHORT_POINTER: ap->a.a_count_short_pointer = va_arg (args, short *); break; case TYPE_COUNT_INT_POINTER: ap->a.a_count_int_pointer = va_arg (args, int *); break; case TYPE_COUNT_LONGINT_POINTER: ap->a.a_count_longint_pointer = va_arg (args, long int *); break; case TYPE_COUNT_LONGLONGINT_POINTER: ap->a.a_count_longlongint_pointer = va_arg (args, long long int *); break; #if ENABLE_UNISTDIO /* The unistdio extensions. */ case TYPE_U8_STRING: ap->a.a_u8_string = va_arg (args, const uint8_t *); /* A null pointer is an invalid argument for "%U", but in practice it occurs quite frequently in printf statements that produce debug output. Use a fallback in this case. */ if (ap->a.a_u8_string == NULL) { static const uint8_t u8_null_string[] = { '(', 'N', 'U', 'L', 'L', ')', 0 }; ap->a.a_u8_string = u8_null_string; } break; case TYPE_U16_STRING: ap->a.a_u16_string = va_arg (args, const uint16_t *); /* A null pointer is an invalid argument for "%lU", but in practice it occurs quite frequently in printf statements that produce debug output. Use a fallback in this case. */ if (ap->a.a_u16_string == NULL) { static const uint16_t u16_null_string[] = { '(', 'N', 'U', 'L', 'L', ')', 0 }; ap->a.a_u16_string = u16_null_string; } break; case TYPE_U32_STRING: ap->a.a_u32_string = va_arg (args, const uint32_t *); /* A null pointer is an invalid argument for "%llU", but in practice it occurs quite frequently in printf statements that produce debug output. Use a fallback in this case. */ if (ap->a.a_u32_string == NULL) { static const uint32_t u32_null_string[] = { '(', 'N', 'U', 'L', 'L', ')', 0 }; ap->a.a_u32_string = u32_null_string; } break; #endif default: /* Unknown type. */ return -1; } return 0; } pspp-1.4.1/gl/gettext.h0000644000175000017500000002476413723215637014400 0ustar00blpblp00000000000000/* Convenience header for conditional use of GNU . Copyright (C) 1995-1998, 2000-2002, 2004-2006, 2009-2020 Free Software Foundation, Inc. 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 3, 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, see . */ #ifndef _LIBGETTEXT_H #define _LIBGETTEXT_H 1 /* NLS can be disabled through the configure --disable-nls option or through "#define ENABLE NLS 0" before including this file. */ #if defined ENABLE_NLS && ENABLE_NLS /* Get declarations of GNU message catalog functions. */ # include /* You can set the DEFAULT_TEXT_DOMAIN macro to specify the domain used by the gettext() and ngettext() macros. This is an alternative to calling textdomain(), and is useful for libraries. */ # ifdef DEFAULT_TEXT_DOMAIN # undef gettext # define gettext(Msgid) \ dgettext (DEFAULT_TEXT_DOMAIN, Msgid) # undef ngettext # define ngettext(Msgid1, Msgid2, N) \ dngettext (DEFAULT_TEXT_DOMAIN, Msgid1, Msgid2, N) # endif #else /* Solaris /usr/include/locale.h includes /usr/include/libintl.h, which chokes if dcgettext is defined as a macro. So include it now, to make later inclusions of a NOP. We don't include as well because people using "gettext.h" will not include , and also including would fail on SunOS 4, whereas is OK. */ #if defined(__sun) # include #endif /* Many header files from the libstdc++ coming with g++ 3.3 or newer include , which chokes if dcgettext is defined as a macro. So include it now, to make later inclusions of a NOP. */ #if defined(__cplusplus) && defined(__GNUG__) && (__GNUC__ >= 3) # include # if (__GLIBC__ >= 2 && !defined __UCLIBC__) || _GLIBCXX_HAVE_LIBINTL_H # include # endif #endif /* Disabled NLS. The casts to 'const char *' serve the purpose of producing warnings for invalid uses of the value returned from these functions. On pre-ANSI systems without 'const', the config.h file is supposed to contain "#define const". */ # undef gettext # define gettext(Msgid) ((const char *) (Msgid)) # undef dgettext # define dgettext(Domainname, Msgid) ((void) (Domainname), gettext (Msgid)) # undef dcgettext # define dcgettext(Domainname, Msgid, Category) \ ((void) (Category), dgettext (Domainname, Msgid)) # undef ngettext # define ngettext(Msgid1, Msgid2, N) \ ((N) == 1 \ ? ((void) (Msgid2), (const char *) (Msgid1)) \ : ((void) (Msgid1), (const char *) (Msgid2))) # undef dngettext # define dngettext(Domainname, Msgid1, Msgid2, N) \ ((void) (Domainname), ngettext (Msgid1, Msgid2, N)) # undef dcngettext # define dcngettext(Domainname, Msgid1, Msgid2, N, Category) \ ((void) (Category), dngettext (Domainname, Msgid1, Msgid2, N)) # undef textdomain # define textdomain(Domainname) ((const char *) (Domainname)) # undef bindtextdomain # define bindtextdomain(Domainname, Dirname) \ ((void) (Domainname), (const char *) (Dirname)) # undef bind_textdomain_codeset # define bind_textdomain_codeset(Domainname, Codeset) \ ((void) (Domainname), (const char *) (Codeset)) #endif /* Prefer gnulib's setlocale override over libintl's setlocale override. */ #ifdef GNULIB_defined_setlocale # undef setlocale # define setlocale rpl_setlocale #endif /* A pseudo function call that serves as a marker for the automated extraction of messages, but does not call gettext(). The run-time translation is done at a different place in the code. The argument, String, should be a literal string. Concatenated strings and other string expressions won't work. The macro's expansion is not parenthesized, so that it is suitable as initializer for static 'char[]' or 'const char[]' variables. */ #define gettext_noop(String) String /* The separator between msgctxt and msgid in a .mo file. */ #define GETTEXT_CONTEXT_GLUE "\004" /* Pseudo function calls, taking a MSGCTXT and a MSGID instead of just a MSGID. MSGCTXT and MSGID must be string literals. MSGCTXT should be short and rarely need to change. The letter 'p' stands for 'particular' or 'special'. */ #ifdef DEFAULT_TEXT_DOMAIN # define pgettext(Msgctxt, Msgid) \ pgettext_aux (DEFAULT_TEXT_DOMAIN, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, LC_MESSAGES) #else # define pgettext(Msgctxt, Msgid) \ pgettext_aux (NULL, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, LC_MESSAGES) #endif #define dpgettext(Domainname, Msgctxt, Msgid) \ pgettext_aux (Domainname, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, LC_MESSAGES) #define dcpgettext(Domainname, Msgctxt, Msgid, Category) \ pgettext_aux (Domainname, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, Category) #ifdef DEFAULT_TEXT_DOMAIN # define npgettext(Msgctxt, Msgid, MsgidPlural, N) \ npgettext_aux (DEFAULT_TEXT_DOMAIN, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, MsgidPlural, N, LC_MESSAGES) #else # define npgettext(Msgctxt, Msgid, MsgidPlural, N) \ npgettext_aux (NULL, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, MsgidPlural, N, LC_MESSAGES) #endif #define dnpgettext(Domainname, Msgctxt, Msgid, MsgidPlural, N) \ npgettext_aux (Domainname, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, MsgidPlural, N, LC_MESSAGES) #define dcnpgettext(Domainname, Msgctxt, Msgid, MsgidPlural, N, Category) \ npgettext_aux (Domainname, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, MsgidPlural, N, Category) #ifdef __GNUC__ __inline #else #ifdef __cplusplus inline #endif #endif static const char * pgettext_aux (const char *domain, const char *msg_ctxt_id, const char *msgid, int category) { const char *translation = dcgettext (domain, msg_ctxt_id, category); if (translation == msg_ctxt_id) return msgid; else return translation; } #ifdef __GNUC__ __inline #else #ifdef __cplusplus inline #endif #endif static const char * npgettext_aux (const char *domain, const char *msg_ctxt_id, const char *msgid, const char *msgid_plural, unsigned long int n, int category) { const char *translation = dcngettext (domain, msg_ctxt_id, msgid_plural, n, category); if (translation == msg_ctxt_id || translation == msgid_plural) return (n == 1 ? msgid : msgid_plural); else return translation; } /* The same thing extended for non-constant arguments. Here MSGCTXT and MSGID can be arbitrary expressions. But for string literals these macros are less efficient than those above. */ #include /* GNULIB_NO_VLA can be defined to disable use of VLAs even if supported. This relates to the -Wvla and -Wvla-larger-than warnings, enabled in the default GCC many warnings set. This allows programs to disable use of VLAs, which may be unintended, or may be awkward to support portably, or may have security implications due to non-deterministic stack usage. */ #if (!defined GNULIB_NO_VLA \ && (((__GNUC__ >= 3 || __GNUG__ >= 2) && !defined __STRICT_ANSI__) \ /* || (__STDC_VERSION__ == 199901L && !defined __HP_cc) || (__STDC_VERSION__ >= 201112L && !defined __STDC_NO_VLA__) */ )) # define _LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS 1 #else # define _LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS 0 #endif #if !_LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS #include #endif #define pgettext_expr(Msgctxt, Msgid) \ dcpgettext_expr (NULL, Msgctxt, Msgid, LC_MESSAGES) #define dpgettext_expr(Domainname, Msgctxt, Msgid) \ dcpgettext_expr (Domainname, Msgctxt, Msgid, LC_MESSAGES) #ifdef __GNUC__ __inline #else #ifdef __cplusplus inline #endif #endif static const char * dcpgettext_expr (const char *domain, const char *msgctxt, const char *msgid, int category) { size_t msgctxt_len = strlen (msgctxt) + 1; size_t msgid_len = strlen (msgid) + 1; const char *translation; #if _LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS char msg_ctxt_id[msgctxt_len + msgid_len]; #else char buf[1024]; char *msg_ctxt_id = (msgctxt_len + msgid_len <= sizeof (buf) ? buf : (char *) malloc (msgctxt_len + msgid_len)); if (msg_ctxt_id != NULL) #endif { int found_translation; memcpy (msg_ctxt_id, msgctxt, msgctxt_len - 1); msg_ctxt_id[msgctxt_len - 1] = '\004'; memcpy (msg_ctxt_id + msgctxt_len, msgid, msgid_len); translation = dcgettext (domain, msg_ctxt_id, category); found_translation = (translation != msg_ctxt_id); #if !_LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS if (msg_ctxt_id != buf) free (msg_ctxt_id); #endif if (found_translation) return translation; } return msgid; } #define npgettext_expr(Msgctxt, Msgid, MsgidPlural, N) \ dcnpgettext_expr (NULL, Msgctxt, Msgid, MsgidPlural, N, LC_MESSAGES) #define dnpgettext_expr(Domainname, Msgctxt, Msgid, MsgidPlural, N) \ dcnpgettext_expr (Domainname, Msgctxt, Msgid, MsgidPlural, N, LC_MESSAGES) #ifdef __GNUC__ __inline #else #ifdef __cplusplus inline #endif #endif static const char * dcnpgettext_expr (const char *domain, const char *msgctxt, const char *msgid, const char *msgid_plural, unsigned long int n, int category) { size_t msgctxt_len = strlen (msgctxt) + 1; size_t msgid_len = strlen (msgid) + 1; const char *translation; #if _LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS char msg_ctxt_id[msgctxt_len + msgid_len]; #else char buf[1024]; char *msg_ctxt_id = (msgctxt_len + msgid_len <= sizeof (buf) ? buf : (char *) malloc (msgctxt_len + msgid_len)); if (msg_ctxt_id != NULL) #endif { int found_translation; memcpy (msg_ctxt_id, msgctxt, msgctxt_len - 1); msg_ctxt_id[msgctxt_len - 1] = '\004'; memcpy (msg_ctxt_id + msgctxt_len, msgid, msgid_len); translation = dcngettext (domain, msg_ctxt_id, msgid_plural, n, category); found_translation = !(translation == msg_ctxt_id || translation == msgid_plural); #if !_LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS if (msg_ctxt_id != buf) free (msg_ctxt_id); #endif if (found_translation) return translation; } return (n == 1 ? msgid : msgid_plural); } #endif /* _LIBGETTEXT_H */ pspp-1.4.1/gl/gettime.c0000644000175000017500000000243013723556150014325 0ustar00blpblp00000000000000/* gettime -- get the system clock Copyright (C) 2002, 2004-2007, 2009-2020 Free Software Foundation, Inc. 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 3 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, see . */ /* Written by Paul Eggert. */ #include #include "timespec.h" #include /* Get the system time into *TS. */ void gettime (struct timespec *ts) { #if defined CLOCK_REALTIME && HAVE_CLOCK_GETTIME clock_gettime (CLOCK_REALTIME, ts); #else struct timeval tv; gettimeofday (&tv, NULL); ts->tv_sec = tv.tv_sec; ts->tv_nsec = tv.tv_usec * 1000; #endif } /* Return the current system time as a struct timespec. */ struct timespec current_timespec (void) { struct timespec ts; gettime (&ts); return ts; } pspp-1.4.1/gl/msvc-nothrow.c0000644000175000017500000000251513723215637015343 0ustar00blpblp00000000000000/* Wrappers that don't throw invalid parameter notifications with MSVC runtime libraries. Copyright (C) 2011-2020 Free Software Foundation, Inc. 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 3, 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, see . */ #include /* Specification. */ #include "msvc-nothrow.h" /* Get declarations of the native Windows API functions. */ #define WIN32_LEAN_AND_MEAN #include #if HAVE_MSVC_INVALID_PARAMETER_HANDLER # include "msvc-inval.h" #endif #undef _get_osfhandle #if HAVE_MSVC_INVALID_PARAMETER_HANDLER intptr_t _gl_nothrow_get_osfhandle (int fd) { intptr_t result; TRY_MSVC_INVAL { result = _get_osfhandle (fd); } CATCH_MSVC_INVAL { result = (intptr_t) INVALID_HANDLE_VALUE; } DONE_MSVC_INVAL; return result; } #endif pspp-1.4.1/gl/read-file.h0000644000175000017500000000232713723215640014525 0ustar00blpblp00000000000000/* read-file.h -- read file contents into a string Copyright (C) 2006, 2009-2020 Free Software Foundation, Inc. Written by Simon Josefsson. 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 3, 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, see . */ #ifndef READ_FILE_H #define READ_FILE_H /* Get size_t. */ #include /* Get FILE. */ #include /* Indicate that the file is treated as binary. */ #define RF_BINARY 0x1 /* Indicate that the file content contains sensitive information. */ #define RF_SENSITIVE 0x2 extern char *fread_file (FILE * stream, int flags, size_t * length); extern char *read_file (const char *filename, int flags, size_t * length); #endif /* READ_FILE_H */ pspp-1.4.1/gl/gl_linked_list.c0000644000175000017500000000376413723215637015667 0ustar00blpblp00000000000000/* Sequential list data type implemented by a linked list. Copyright (C) 2006, 2008-2020 Free Software Foundation, Inc. Written by Bruno Haible , 2006. 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 3 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, see . */ #include /* Specification. */ #include "gl_linked_list.h" #include /* -------------------------- gl_list_t Data Type -------------------------- */ /* Generic linked list code. */ #include "gl_anylinked_list1.h" #include "gl_anylinked_list2.h" const struct gl_list_implementation gl_linked_list_implementation = { gl_linked_nx_create_empty, gl_linked_nx_create, gl_linked_size, gl_linked_node_value, gl_linked_node_nx_set_value, gl_linked_next_node, gl_linked_previous_node, gl_linked_get_at, gl_linked_nx_set_at, gl_linked_search_from_to, gl_linked_indexof_from_to, gl_linked_nx_add_first, gl_linked_nx_add_last, gl_linked_nx_add_before, gl_linked_nx_add_after, gl_linked_nx_add_at, gl_linked_remove_node, gl_linked_remove_at, gl_linked_remove, gl_linked_list_free, gl_linked_iterator, gl_linked_iterator_from_to, gl_linked_iterator_next, gl_linked_iterator_free, gl_linked_sortedlist_search, gl_linked_sortedlist_search_from_to, gl_linked_sortedlist_indexof, gl_linked_sortedlist_indexof_from_to, gl_linked_sortedlist_nx_add, gl_linked_sortedlist_remove }; pspp-1.4.1/gl/uniwbrk.in.h0000644000175000017500000000524113723215640014761 0ustar00blpblp00000000000000/* Word breaks in Unicode strings. Copyright (C) 2001-2003, 2005-2020 Free Software Foundation, Inc. Written by Bruno Haible , 2009. 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 3 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, see . */ #ifndef _UNIWBRK_H #define _UNIWBRK_H /* Get size_t. */ #include #include "unitypes.h" #ifdef __cplusplus extern "C" { #endif /* ========================================================================= */ /* Property defined in Unicode Standard Annex #29, section "Word Boundaries" */ /* Possible values of the Word_Break property. This enumeration may be extended in the future. */ enum { WBP_OTHER = 0, WBP_CR = 11, WBP_LF = 12, WBP_NEWLINE = 10, WBP_EXTEND = 8, WBP_FORMAT = 9, WBP_KATAKANA = 1, WBP_ALETTER = 2, WBP_MIDNUMLET = 3, WBP_MIDLETTER = 4, WBP_MIDNUM = 5, WBP_NUMERIC = 6, WBP_EXTENDNUMLET = 7, WBP_RI = 13, WBP_DQ = 14, WBP_SQ = 15, WBP_HL = 16, WBP_ZWJ = 17, WBP_EB = 18, WBP_EM = 19, WBP_GAZ = 20, WBP_EBG = 21 }; /* Return the Word_Break property of a Unicode character. */ extern int uc_wordbreak_property (ucs4_t uc) _UC_ATTRIBUTE_CONST; /* ========================================================================= */ /* Word breaks. */ /* Determine the word break points in S, and store the result at p[0..n-1]. p[i] = 1 means that there is a word boundary between s[i-1] and s[i]. p[i] = 0 means that s[i-1] and s[i] must not be separated. */ extern void u8_wordbreaks (const uint8_t *s, size_t n, char *p); extern void u16_wordbreaks (const uint16_t *s, size_t n, char *p); extern void u32_wordbreaks (const uint32_t *s, size_t n, char *p); extern void ulc_wordbreaks (const char *s, size_t n, char *_UC_RESTRICT p); /* ========================================================================= */ #ifdef __cplusplus } #endif #endif /* _UNIWBRK_H */ pspp-1.4.1/gl/c-snprintf.h0000644000175000017500000000203413723215636014760 0ustar00blpblp00000000000000/* snprintf in C locale. Copyright (C) 2012-2020 Free Software Foundation, Inc. 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 3, 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, see . */ #ifndef _C_SNPRINTF_H #define _C_SNPRINTF_H /* Get size_t. */ #include #ifdef __cplusplus extern "C" { #endif extern int c_snprintf (char *restrict str, size_t size, const char *format, ...) _GL_ATTRIBUTE_FORMAT ((__printf__, 3, 4)); #ifdef __cplusplus } #endif #endif /* _C_SNPRINTF_H */ pspp-1.4.1/gl/thread-optim.h0000644000175000017500000000420113723215640015263 0ustar00blpblp00000000000000/* Optimization of multithreaded code. Copyright (C) 2020 Free Software Foundation, Inc. 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 3 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, see . */ /* Written by Bruno Haible , 2020. */ #ifndef _THREAD_OPTIM_H #define _THREAD_OPTIM_H /* This file defines a way to optimize multithreaded code for the single-thread case, based on the variable '__libc_single_threaded', defined in glibc >= 2.32. */ /* Typical use: In a block or function, use IF_MT_DECL; ... IF_MT if (pthread_mutex_lock (&lock)) abort (); ... IF_MT if (pthread_mutex_unlock (&lock)) abort (); The macro IF_MT_DECL establishes local variables for use by IF_MT. IF_MT STATEMENT executes STATEMENT in the multithreaded cases, and skips it in the single-threaded case. The code between IF_MT_DECL and IF_MT must not create threads or invoke functions that may indirectly create threads (e.g. 'dlopen' may, indirectly through C++ initializers of global variables in the shared library being opened, create threads). The lock here is meant to synchronize threads in the same process. The same optimization cannot be applied to locks that synchronize different processes (e.g. through shared memory mappings). */ #if HAVE_SYS_SINGLE_THREADED_H /* glibc >= 2.32 */ # include # define IF_MT_DECL char optimize_for_single_thread = __libc_single_threaded # define IF_MT if (!optimize_for_single_thread) #else # define IF_MT_DECL (void *)0 # define IF_MT #endif #endif /* _THREAD_OPTIM_H */ pspp-1.4.1/gl/getopt-core.h0000644000175000017500000000710313723215637015130 0ustar00blpblp00000000000000/* Declarations for getopt (basic, portable features only). Copyright (C) 1989-2020 Free Software Foundation, Inc. This file is part of the GNU C Library and is also part of gnulib. Patches to this file should be submitted to both projects. The GNU C Library 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 3 of the License, or (at your option) any later version. The GNU C Library 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 the GNU C Library; if not, see . */ #ifndef _GETOPT_CORE_H #define _GETOPT_CORE_H 1 /* This header should not be used directly; include getopt.h or unistd.h instead. Unlike most bits headers, it does not have a protective #error, because the guard macro for getopt.h in gnulib is not fixed. */ __BEGIN_DECLS /* For communication from 'getopt' to the caller. When 'getopt' finds an option that takes an argument, the argument value is returned here. Also, when 'ordering' is RETURN_IN_ORDER, each non-option ARGV-element is returned here. */ extern char *optarg; /* Index in ARGV of the next element to be scanned. This is used for communication to and from the caller and for communication between successive calls to 'getopt'. On entry to 'getopt', zero means this is the first call; initialize. When 'getopt' returns -1, this is the index of the first of the non-option elements that the caller should itself scan. Otherwise, 'optind' communicates from one call to the next how much of ARGV has been scanned so far. */ extern int optind; /* Callers store zero here to inhibit the error message 'getopt' prints for unrecognized options. */ extern int opterr; /* Set to an option character which was unrecognized. */ extern int optopt; /* Get definitions and prototypes for functions to process the arguments in ARGV (ARGC of them, minus the program name) for options given in OPTS. Return the option character from OPTS just read. Return -1 when there are no more options. For unrecognized options, or options missing arguments, 'optopt' is set to the option letter, and '?' is returned. The OPTS string is a list of characters which are recognized option letters, optionally followed by colons, specifying that that letter takes an argument, to be placed in 'optarg'. If a letter in OPTS is followed by two colons, its argument is optional. This behavior is specific to the GNU 'getopt'. The argument '--' causes premature termination of argument scanning, explicitly telling 'getopt' that there are no more options. If OPTS begins with '-', then non-option arguments are treated as arguments to the option '\1'. This behavior is specific to the GNU 'getopt'. If OPTS begins with '+', or POSIXLY_CORRECT is set in the environment, then do not permute arguments. For standards compliance, the 'argv' argument has the type char *const *, but this is inaccurate; if argument permutation is enabled, the argv array (not the strings it points to) must be writable. */ extern int getopt (int ___argc, char *const *___argv, const char *__shortopts) __THROW _GL_ARG_NONNULL ((2, 3)); __END_DECLS #endif /* _GETOPT_CORE_H */ pspp-1.4.1/gl/dtotimespec.c0000644000175000017500000000277213723556147015226 0ustar00blpblp00000000000000/* Convert double to timespec. Copyright (C) 2011-2020 Free Software Foundation, Inc. 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 3 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, see . */ /* written by Paul Eggert */ /* Convert the double value SEC to a struct timespec. Round toward positive infinity. On overflow, return an extremal value. */ #include #include "timespec.h" #include "intprops.h" struct timespec dtotimespec (double sec) { if (! (TYPE_MINIMUM (time_t) < sec)) return make_timespec (TYPE_MINIMUM (time_t), 0); else if (! (sec < 1.0 + TYPE_MAXIMUM (time_t))) return make_timespec (TYPE_MAXIMUM (time_t), TIMESPEC_HZ - 1); else { time_t s = sec; double frac = TIMESPEC_HZ * (sec - s); long ns = frac; ns += ns < frac; s += ns / TIMESPEC_HZ; ns %= TIMESPEC_HZ; if (ns < 0) { s--; ns += TIMESPEC_HZ; } return make_timespec (s, ns); } } pspp-1.4.1/gl/printf-parse.h0000644000175000017500000001216413723215640015307 0ustar00blpblp00000000000000/* Parse printf format string. Copyright (C) 1999, 2002-2003, 2005, 2007, 2010-2020 Free Software Foundation, Inc. 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 3, 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, see . */ #ifndef _PRINTF_PARSE_H #define _PRINTF_PARSE_H /* This file can be parametrized with the following macros: ENABLE_UNISTDIO Set to 1 to enable the unistdio extensions. STATIC Set to 'static' to declare the function static. */ #if HAVE_FEATURES_H # include /* for __GLIBC__, __UCLIBC__ */ #endif #include "printf-args.h" /* Flags */ #define FLAG_GROUP 1 /* ' flag */ #define FLAG_LEFT 2 /* - flag */ #define FLAG_SHOWSIGN 4 /* + flag */ #define FLAG_SPACE 8 /* space flag */ #define FLAG_ALT 16 /* # flag */ #define FLAG_ZERO 32 #if __GLIBC__ >= 2 && !defined __UCLIBC__ # define FLAG_LOCALIZED 64 /* I flag, uses localized digits */ #endif /* arg_index value indicating that no argument is consumed. */ #define ARG_NONE (~(size_t)0) /* xxx_directive: A parsed directive. xxx_directives: A parsed format string. */ /* Number of directly allocated directives (no malloc() needed). */ #define N_DIRECT_ALLOC_DIRECTIVES 7 /* A parsed directive. */ typedef struct { const char* dir_start; const char* dir_end; int flags; const char* width_start; const char* width_end; size_t width_arg_index; const char* precision_start; const char* precision_end; size_t precision_arg_index; char conversion; /* d i o u x X f F e E g G a A c s p n U % but not C S */ size_t arg_index; } char_directive; /* A parsed format string. */ typedef struct { size_t count; char_directive *dir; size_t max_width_length; size_t max_precision_length; char_directive direct_alloc_dir[N_DIRECT_ALLOC_DIRECTIVES]; } char_directives; #if ENABLE_UNISTDIO /* A parsed directive. */ typedef struct { const uint8_t* dir_start; const uint8_t* dir_end; int flags; const uint8_t* width_start; const uint8_t* width_end; size_t width_arg_index; const uint8_t* precision_start; const uint8_t* precision_end; size_t precision_arg_index; uint8_t conversion; /* d i o u x X f F e E g G a A c s p n U % but not C S */ size_t arg_index; } u8_directive; /* A parsed format string. */ typedef struct { size_t count; u8_directive *dir; size_t max_width_length; size_t max_precision_length; u8_directive direct_alloc_dir[N_DIRECT_ALLOC_DIRECTIVES]; } u8_directives; /* A parsed directive. */ typedef struct { const uint16_t* dir_start; const uint16_t* dir_end; int flags; const uint16_t* width_start; const uint16_t* width_end; size_t width_arg_index; const uint16_t* precision_start; const uint16_t* precision_end; size_t precision_arg_index; uint16_t conversion; /* d i o u x X f F e E g G a A c s p n U % but not C S */ size_t arg_index; } u16_directive; /* A parsed format string. */ typedef struct { size_t count; u16_directive *dir; size_t max_width_length; size_t max_precision_length; u16_directive direct_alloc_dir[N_DIRECT_ALLOC_DIRECTIVES]; } u16_directives; /* A parsed directive. */ typedef struct { const uint32_t* dir_start; const uint32_t* dir_end; int flags; const uint32_t* width_start; const uint32_t* width_end; size_t width_arg_index; const uint32_t* precision_start; const uint32_t* precision_end; size_t precision_arg_index; uint32_t conversion; /* d i o u x X f F e E g G a A c s p n U % but not C S */ size_t arg_index; } u32_directive; /* A parsed format string. */ typedef struct { size_t count; u32_directive *dir; size_t max_width_length; size_t max_precision_length; u32_directive direct_alloc_dir[N_DIRECT_ALLOC_DIRECTIVES]; } u32_directives; #endif /* Parses the format string. Fills in the number N of directives, and fills in directives[0], ..., directives[N-1], and sets directives[N].dir_start to the end of the format string. Also fills in the arg_type fields of the arguments and the needed count of arguments. */ #if ENABLE_UNISTDIO extern int ulc_printf_parse (const char *format, char_directives *d, arguments *a); extern int u8_printf_parse (const uint8_t *format, u8_directives *d, arguments *a); extern int u16_printf_parse (const uint16_t *format, u16_directives *d, arguments *a); extern int u32_printf_parse (const uint32_t *format, u32_directives *d, arguments *a); #else # ifdef STATIC STATIC # else extern # endif int printf_parse (const char *format, char_directives *d, arguments *a); #endif #endif /* _PRINTF_PARSE_H */ pspp-1.4.1/gl/secure_getenv.c0000644000175000017500000000375013723215640015527 0ustar00blpblp00000000000000/* Look up an environment variable, returning NULL in insecure situations. Copyright 2013-2020 Free Software Foundation, Inc. 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 3 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, see . */ #include #include #if !HAVE___SECURE_GETENV # if HAVE_ISSETUGID || (HAVE_GETUID && HAVE_GETEUID && HAVE_GETGID && HAVE_GETEGID) # include # endif #endif char * secure_getenv (char const *name) { #if HAVE___SECURE_GETENV /* glibc */ return __secure_getenv (name); #elif HAVE_ISSETUGID /* OS X, FreeBSD, NetBSD, OpenBSD */ if (issetugid ()) return NULL; return getenv (name); #elif HAVE_GETUID && HAVE_GETEUID && HAVE_GETGID && HAVE_GETEGID /* other Unix */ if (geteuid () != getuid () || getegid () != getgid ()) return NULL; return getenv (name); #elif defined _WIN32 && ! defined __CYGWIN__ /* native Windows */ /* On native Windows, there is no such concept as setuid or setgid binaries. - Programs launched as system services have high privileges, but they don't inherit environment variables from a user. - Programs launched by a user with "Run as Administrator" have high privileges and use the environment variables, but the user has been asked whether he agrees. - Programs launched by a user without "Run as Administrator" cannot gain high privileges, therefore there is no risk. */ return getenv (name); #else return NULL; #endif } pspp-1.4.1/gl/timespec-sub.c0000644000175000017500000000325313723555203015271 0ustar00blpblp00000000000000/* Subtract two struct timespec values. Copyright (C) 2011-2020 Free Software Foundation, Inc. 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 3 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, see . */ /* Written by Paul Eggert. */ /* Return the difference between two timespec values A and B. On overflow, return an extremal value. This assumes 0 <= tv_nsec < TIMESPEC_HZ. */ #include #include "timespec.h" #include "intprops.h" struct timespec timespec_sub (struct timespec a, struct timespec b) { time_t rs = a.tv_sec; time_t bs = b.tv_sec; int ns = a.tv_nsec - b.tv_nsec; int rns = ns; if (ns < 0) { rns = ns + TIMESPEC_HZ; time_t bs1; if (!INT_ADD_WRAPV (bs, 1, &bs1)) bs = bs1; else if (- TYPE_SIGNED (time_t) < rs) rs--; else goto low_overflow; } if (INT_SUBTRACT_WRAPV (rs, bs, &rs)) { if (0 < bs) { low_overflow: rs = TYPE_MINIMUM (time_t); rns = 0; } else { rs = TYPE_MAXIMUM (time_t); rns = TIMESPEC_HZ - 1; } } return make_timespec (rs, rns); } pspp-1.4.1/gl/c-vasprintf.h0000644000175000017500000000247313723215636015140 0ustar00blpblp00000000000000/* vasprintf and asprintf, in C locale. Copyright (C) 2002-2004, 2006-2020 Free Software Foundation, Inc. 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 3 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, see . */ #ifndef _C_VASPRINTF_H #define _C_VASPRINTF_H /* Get va_list. */ #include #ifdef __cplusplus extern "C" { #endif /* asprintf() and vasprintf(), but formatting takes place in the C locale, that is, the decimal point used in floating-point formatting directives is always '.'. */ int c_asprintf (char **resultp, const char *format, ...) _GL_ATTRIBUTE_FORMAT ((__printf__, 2, 3)); int c_vasprintf (char **resultp, const char *format, va_list args) _GL_ATTRIBUTE_FORMAT ((__printf__, 2, 0)); #ifdef __cplusplus } #endif #endif /* _C_VASPRINTF_H */ pspp-1.4.1/gl/c-strtod.c0000644000175000017500000000631613723215636014436 0ustar00blpblp00000000000000/* Convert string to double, using the C locale. Copyright (C) 2003-2004, 2006, 2009-2020 Free Software Foundation, Inc. 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 3 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, see . */ /* Written by Paul Eggert. */ #include #include "c-strtod.h" #include #include #include #include #if LONG # define C_STRTOD c_strtold # define DOUBLE long double # define STRTOD_L strtold_l # define HAVE_GOOD_STRTOD_L (HAVE_STRTOLD_L && !GNULIB_defined_strtold_function) # define STRTOD strtold #else # define C_STRTOD c_strtod # define DOUBLE double # define STRTOD_L strtod_l # define HAVE_GOOD_STRTOD_L (HAVE_STRTOD_L && !GNULIB_defined_strtod_function) # define STRTOD strtod #endif #if defined LC_ALL_MASK \ && ((LONG ? HAVE_GOOD_STRTOLD_L : HAVE_GOOD_STRTOD_L) \ || HAVE_WORKING_USELOCALE) /* Cache for the C locale object. Marked volatile so that different threads see the same value (avoids locking). */ static volatile locale_t c_locale_cache; /* Return the C locale object, or (locale_t) 0 with errno set if it cannot be created. */ static locale_t c_locale (void) { if (!c_locale_cache) c_locale_cache = newlocale (LC_ALL_MASK, "C", (locale_t) 0); return c_locale_cache; } #endif DOUBLE C_STRTOD (char const *nptr, char **endptr) { DOUBLE r; #if defined LC_ALL_MASK \ && ((LONG ? HAVE_GOOD_STRTOLD_L : HAVE_GOOD_STRTOD_L) \ || HAVE_WORKING_USELOCALE) locale_t locale = c_locale (); if (!locale) { if (endptr) *endptr = (char *) nptr; return 0; /* errno is set here */ } # if (LONG ? HAVE_GOOD_STRTOLD_L : HAVE_GOOD_STRTOD_L) r = STRTOD_L (nptr, endptr, locale); # else /* HAVE_WORKING_USELOCALE */ locale_t old_locale = uselocale (locale); if (old_locale == (locale_t)0) { if (endptr) *endptr = (char *) nptr; return 0; /* errno is set here */ } r = STRTOD (nptr, endptr); int saved_errno = errno; if (uselocale (old_locale) == (locale_t)0) /* We can't switch back to the old locale. The thread is hosed. */ abort (); errno = saved_errno; # endif #else char *saved_locale = setlocale (LC_NUMERIC, NULL); if (saved_locale) { saved_locale = strdup (saved_locale); if (saved_locale == NULL) { if (endptr) *endptr = (char *) nptr; return 0; /* errno is set here */ } setlocale (LC_NUMERIC, "C"); } r = STRTOD (nptr, endptr); if (saved_locale) { int saved_errno = errno; setlocale (LC_NUMERIC, saved_locale); free (saved_locale); errno = saved_errno; } #endif return r; } pspp-1.4.1/gl/alloca.in.h0000644000175000017500000000463713723215636014550 0ustar00blpblp00000000000000/* Memory allocation on the stack. Copyright (C) 1995, 1999, 2001-2004, 2006-2020 Free Software Foundation, Inc. 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 3, 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, see . */ /* Avoid using the symbol _ALLOCA_H here, as Bison assumes _ALLOCA_H means there is a real alloca function. */ #ifndef _GL_ALLOCA_H #define _GL_ALLOCA_H /* alloca (N) returns a pointer to N bytes of memory allocated on the stack, which will last until the function returns. Use of alloca should be avoided: - inside arguments of function calls - undefined behaviour, - in inline functions - the allocation may actually last until the calling function returns, - for huge N (say, N >= 65536) - you never know how large (or small) the stack is, and when the stack cannot fulfill the memory allocation request, the program just crashes. */ #ifndef alloca /* Some version of mingw have an that causes trouble when included after 'alloca' gets defined as a macro. As a workaround, include this first and define 'alloca' as a macro afterwards if needed. */ # if defined __GNUC__ && (defined _WIN32 && ! defined __CYGWIN__) && @HAVE_ALLOCA_H@ # include_next # endif #endif #ifndef alloca # if defined __GNUC__ || (__clang_major__ >= 4) # define alloca __builtin_alloca # elif defined _AIX # define alloca __alloca # elif defined _MSC_VER # include # define alloca _alloca # elif defined __DECC && defined __VMS # define alloca __ALLOCA # elif defined __TANDEM && defined _TNS_E_TARGET # ifdef __cplusplus extern "C" # endif void *_alloca (unsigned short); # pragma intrinsic (_alloca) # define alloca _alloca # elif defined __MVS__ # include # else # include # ifdef __cplusplus extern "C" # endif void *alloca (size_t); # endif #endif #endif /* _GL_ALLOCA_H */ pspp-1.4.1/gl/wcwidth.c0000644000175000017500000000414413723215640014340 0ustar00blpblp00000000000000/* Determine the number of screen columns needed for a character. Copyright (C) 2006-2007, 2010-2020 Free Software Foundation, Inc. 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 3 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, see . */ #include /* Specification. */ #include /* Get iswprint. */ #include #include "localcharset.h" #include "streq.h" #include "uniwidth.h" /* Returns 1 if the current locale is an UTF-8 locale, 0 otherwise. */ static inline int is_locale_utf8 (void) { const char *encoding = locale_charset (); return STREQ_OPT (encoding, "UTF-8", 'U', 'T', 'F', '-', '8', 0, 0, 0, 0); } #if GNULIB_WCHAR_SINGLE /* When we know that the locale does not change, provide a speedup by caching the value of is_locale_utf8. */ static int cached_is_locale_utf8 = -1; static inline int is_locale_utf8_cached (void) { if (cached_is_locale_utf8 < 0) cached_is_locale_utf8 = is_locale_utf8 (); return cached_is_locale_utf8; } #else /* By default, don't make assumptions, hence no caching. */ # define is_locale_utf8_cached is_locale_utf8 #endif int wcwidth (wchar_t wc) #undef wcwidth { /* In UTF-8 locales, use a Unicode aware width function. */ if (is_locale_utf8_cached ()) { /* We assume that in a UTF-8 locale, a wide character is the same as a Unicode character. */ return uc_width (wc, "UTF-8"); } else { /* Otherwise, fall back to the system's wcwidth function. */ #if HAVE_WCWIDTH return wcwidth (wc); #else return wc == 0 ? 0 : iswprint (wc) ? 1 : -1; #endif } } pspp-1.4.1/gl/getdelim.c0000644000175000017500000000751213723215637014471 0ustar00blpblp00000000000000/* getdelim.c --- Implementation of replacement getdelim function. Copyright (C) 1994, 1996-1998, 2001, 2003, 2005-2020 Free Software Foundation, Inc. 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 3, 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, see . */ /* Ported from glibc by Simon Josefsson. */ /* Don't use __attribute__ __nonnull__ in this compilation unit. Otherwise gcc optimizes away the lineptr == NULL || n == NULL || fp == NULL tests below. */ #define _GL_ARG_NONNULL(params) #include #include #include #include #include #include #ifndef SSIZE_MAX # define SSIZE_MAX ((ssize_t) (SIZE_MAX / 2)) #endif #if USE_UNLOCKED_IO # include "unlocked-io.h" # define getc_maybe_unlocked(fp) getc(fp) #elif !HAVE_FLOCKFILE || !HAVE_FUNLOCKFILE || !HAVE_DECL_GETC_UNLOCKED # undef flockfile # undef funlockfile # define flockfile(x) ((void) 0) # define funlockfile(x) ((void) 0) # define getc_maybe_unlocked(fp) getc(fp) #else # define getc_maybe_unlocked(fp) getc_unlocked(fp) #endif static void alloc_failed (void) { #if defined _WIN32 && ! defined __CYGWIN__ /* Avoid errno problem without using the realloc module; see: https://lists.gnu.org/r/bug-gnulib/2016-08/msg00025.html */ errno = ENOMEM; #endif } /* Read up to (and including) a DELIMITER from FP into *LINEPTR (and NUL-terminate it). *LINEPTR is a pointer returned from malloc (or NULL), pointing to *N characters of space. It is realloc'ed as necessary. Returns the number of characters read (not including the null terminator), or -1 on error or EOF. */ ssize_t getdelim (char **lineptr, size_t *n, int delimiter, FILE *fp) { ssize_t result; size_t cur_len = 0; if (lineptr == NULL || n == NULL || fp == NULL) { errno = EINVAL; return -1; } flockfile (fp); if (*lineptr == NULL || *n == 0) { char *new_lineptr; *n = 120; new_lineptr = (char *) realloc (*lineptr, *n); if (new_lineptr == NULL) { alloc_failed (); result = -1; goto unlock_return; } *lineptr = new_lineptr; } for (;;) { int i; i = getc_maybe_unlocked (fp); if (i == EOF) { result = -1; break; } /* Make enough space for len+1 (for final NUL) bytes. */ if (cur_len + 1 >= *n) { size_t needed_max = SSIZE_MAX < SIZE_MAX ? (size_t) SSIZE_MAX + 1 : SIZE_MAX; size_t needed = 2 * *n + 1; /* Be generous. */ char *new_lineptr; if (needed_max < needed) needed = needed_max; if (cur_len + 1 >= needed) { result = -1; errno = EOVERFLOW; goto unlock_return; } new_lineptr = (char *) realloc (*lineptr, needed); if (new_lineptr == NULL) { alloc_failed (); result = -1; goto unlock_return; } *lineptr = new_lineptr; *n = needed; } (*lineptr)[cur_len] = i; cur_len++; if (i == delimiter) break; } (*lineptr)[cur_len] = '\0'; result = cur_len ? cur_len : result; unlock_return: funlockfile (fp); /* doesn't set errno */ return result; } pspp-1.4.1/gl/Makefile.am0000644000175000017500000042702213723556166014576 0ustar00blpblp00000000000000## DO NOT EDIT! GENERATED AUTOMATICALLY! ## Process this file with automake to produce Makefile.in. # Copyright (C) 2002-2020 Free Software Foundation, Inc. # # This file 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 3 of the License, or # (at your option) any later version. # # This file 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 file. If not, see . # # As a special exception to the GNU General Public License, # this file may be distributed as part of a program that # contains a configuration script generated by Autoconf, under # the same distribution terms as the rest of that program. # # Generated by gnulib-tool. # Reproduce by: # gnulib-tool --import \ # --lib=libgl \ # --source-base=gl \ # --m4-base=gl/m4 \ # --doc-base=gl/doc \ # --tests-base=tests \ # --aux-dir=build-aux \ # --no-conditional-dependencies \ # --libtool \ # --macro-prefix=gl \ # assert \ # byteswap \ # c-ctype \ # c-snprintf \ # c-strcase \ # c-strcasestr \ # c-strtod \ # c-xvasprintf \ # clean-temp \ # close \ # configmake \ # count-leading-zeros \ # count-one-bits \ # crc \ # crypto/md4 \ # crypto/rijndael \ # dirname \ # dtoastr \ # dtotimespec \ # environ \ # fatal-signal \ # fcntl \ # fpieee \ # fprintf-posix \ # fseeko \ # ftello \ # full-read \ # full-write \ # fwriteerror \ # getline \ # getopt-gnu \ # getpass \ # gettext-h \ # gettime \ # gettimeofday \ # gitlog-to-changelog \ # include_next \ # intprops \ # inttostr \ # isfinite \ # isinf \ # isnan \ # localcharset \ # localename \ # mbchar \ # mbiter \ # memcasecmp \ # memchr \ # memchr2 \ # memmem \ # mempcpy \ # memrchr \ # minmax \ # mkdtemp \ # mkstemp \ # nstrftime \ # pipe2 \ # printf-posix \ # printf-safe \ # progname \ # rawmemchr \ # read-file \ # regex \ # relocatable-prog \ # rename \ # round \ # select \ # snprintf \ # snprintf-posix \ # sprintf-posix \ # stdarg \ # stdbool \ # stdint \ # stpcpy \ # strcasestr \ # strerror \ # strsep \ # strtod \ # strtok_r \ # sys_stat \ # tempname \ # termios \ # timespec \ # timespec-add \ # timespec-sub \ # trunc \ # unicase/u8-casecmp \ # unicase/u8-casefold \ # unicase/u8-tolower \ # unicase/u8-totitle \ # unicase/u8-toupper \ # unictype/category-of \ # unictype/ctype-print \ # unigbrk/uc-is-grapheme-break \ # unilbrk/u8-possible-linebreaks \ # uninorm/nfkd \ # unistd \ # unistr/u8-check \ # unistr/u8-cpy \ # unistr/u8-mblen \ # unistr/u8-mbtouc \ # unistr/u8-mbtoucr \ # unistr/u8-strlen \ # unistr/u8-strmbtouc \ # unistr/u8-strncat \ # unistr/u8-uctomb \ # unitypes \ # uniwidth/u8-strwidth \ # unlocked-io \ # vasprintf-posix \ # version-etc \ # version-etc-fsf \ # vfprintf-posix \ # vprintf-posix \ # vsnprintf \ # vsnprintf-posix \ # vsprintf-posix \ # xalloc \ # xalloc-die \ # xbinary-io \ # xmalloca \ # xmemdup0 \ # xsize \ # xstrndup \ # xvasprintf AUTOMAKE_OPTIONS = 1.11 gnits subdir-objects SUBDIRS = noinst_HEADERS = noinst_LIBRARIES = noinst_LTLIBRARIES = EXTRA_DIST = BUILT_SOURCES = SUFFIXES = MOSTLYCLEANFILES = core *.stackdump MOSTLYCLEANDIRS = CLEANFILES = DISTCLEANFILES = MAINTAINERCLEANFILES = # No GNU Make output. EXTRA_DIST += m4/gnulib-cache.m4 AM_CPPFLAGS = AM_CFLAGS = noinst_LTLIBRARIES += libgl.la libgl_la_SOURCES = libgl_la_LIBADD = $(gl_LTLIBOBJS) libgl_la_DEPENDENCIES = $(gl_LTLIBOBJS) EXTRA_libgl_la_SOURCES = libgl_la_LDFLAGS = $(AM_LDFLAGS) libgl_la_LDFLAGS += -no-undefined libgl_la_LDFLAGS += $(FLOOR_LIBM) libgl_la_LDFLAGS += $(ISNAND_LIBM) libgl_la_LDFLAGS += $(ISNANF_LIBM) libgl_la_LDFLAGS += $(ISNANL_LIBM) libgl_la_LDFLAGS += $(LIBSOCKET) libgl_la_LDFLAGS += $(LIBTHREAD) libgl_la_LDFLAGS += $(LIB_CLOCK_GETTIME) libgl_la_LDFLAGS += $(LIB_GETRANDOM) libgl_la_LDFLAGS += $(LIB_HARD_LOCALE) libgl_la_LDFLAGS += $(LIB_MBRTOWC) libgl_la_LDFLAGS += $(LIB_SELECT) libgl_la_LDFLAGS += $(LIB_SETLOCALE_NULL) libgl_la_LDFLAGS += $(LTLIBINTL) libgl_la_LDFLAGS += $(ROUND_LIBM) libgl_la_LDFLAGS += $(TRUNC_LIBM) libgl_la_LDFLAGS += @INTL_MACOSX_LIBS@ ## begin gnulib module absolute-header # Use this preprocessor expression to decide whether #include_next works. # Do not rely on a 'configure'-time test for this, since the expression # might appear in an installed header, which is used by some other compiler. HAVE_INCLUDE_NEXT = (__GNUC__ || 60000000 <= __DECC_VER) ## end gnulib module absolute-header ## begin gnulib module alloca libgl_la_LIBADD += @LTALLOCA@ libgl_la_DEPENDENCIES += @LTALLOCA@ EXTRA_DIST += alloca.c EXTRA_libgl_la_SOURCES += alloca.c ## end gnulib module alloca ## begin gnulib module alloca-opt BUILT_SOURCES += $(ALLOCA_H) # We need the following in order to create when the system # doesn't have one that works with the given compiler. if GL_GENERATE_ALLOCA_H alloca.h: alloca.in.h $(top_builddir)/config.status $(AM_V_GEN)rm -f $@-t $@ && \ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \ sed -e 's|@''HAVE_ALLOCA_H''@|$(HAVE_ALLOCA_H)|g' < $(srcdir)/alloca.in.h; \ } > $@-t && \ mv -f $@-t $@ else alloca.h: $(top_builddir)/config.status rm -f $@ endif MOSTLYCLEANFILES += alloca.h alloca.h-t EXTRA_DIST += alloca.in.h ## end gnulib module alloca-opt ## begin gnulib module allocator libgl_la_SOURCES += allocator.c EXTRA_DIST += allocator.h ## end gnulib module allocator ## begin gnulib module areadlink libgl_la_SOURCES += areadlink.c EXTRA_DIST += areadlink.h ## end gnulib module areadlink ## begin gnulib module array-mergesort EXTRA_DIST += array-mergesort.h ## end gnulib module array-mergesort ## begin gnulib module asyncsafe-spin libgl_la_SOURCES += asyncsafe-spin.c EXTRA_DIST += asyncsafe-spin.h ## end gnulib module asyncsafe-spin ## begin gnulib module attribute EXTRA_DIST += attribute.h ## end gnulib module attribute ## begin gnulib module basename-lgpl libgl_la_SOURCES += basename-lgpl.c EXTRA_DIST += basename-lgpl.h ## end gnulib module basename-lgpl ## begin gnulib module binary-io libgl_la_SOURCES += binary-io.h binary-io.c ## end gnulib module binary-io ## begin gnulib module btowc EXTRA_DIST += btowc.c EXTRA_libgl_la_SOURCES += btowc.c ## end gnulib module btowc ## begin gnulib module byteswap BUILT_SOURCES += $(BYTESWAP_H) # We need the following in order to create when the system # doesn't have one. if GL_GENERATE_BYTESWAP_H byteswap.h: byteswap.in.h $(top_builddir)/config.status $(AM_V_GEN)rm -f $@-t $@ && \ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \ cat $(srcdir)/byteswap.in.h; \ } > $@-t && \ mv -f $@-t $@ else byteswap.h: $(top_builddir)/config.status rm -f $@ endif MOSTLYCLEANFILES += byteswap.h byteswap.h-t EXTRA_DIST += byteswap.in.h ## end gnulib module byteswap ## begin gnulib module c-ctype libgl_la_SOURCES += c-ctype.h c-ctype.c ## end gnulib module c-ctype ## begin gnulib module c-snprintf libgl_la_SOURCES += c-snprintf.c EXTRA_DIST += c-snprintf.h ## end gnulib module c-snprintf ## begin gnulib module c-strcase libgl_la_SOURCES += c-strcase.h c-strcasecmp.c c-strncasecmp.c ## end gnulib module c-strcase ## begin gnulib module c-strcasestr libgl_la_SOURCES += c-strcasestr.h c-strcasestr.c EXTRA_DIST += str-two-way.h ## end gnulib module c-strcasestr ## begin gnulib module c-strtod libgl_la_SOURCES += c-strtod.c EXTRA_DIST += c-strtod.h ## end gnulib module c-strtod ## begin gnulib module c-vasnprintf libgl_la_SOURCES += c-vasnprintf.c EXTRA_DIST += c-vasnprintf.h float+.h printf-args.c printf-args.h printf-parse.c printf-parse.h vasnprintf.c vasnprintf.h EXTRA_libgl_la_SOURCES += printf-args.c printf-parse.c vasnprintf.c ## end gnulib module c-vasnprintf ## begin gnulib module c-vasprintf libgl_la_SOURCES += c-asprintf.c c-vasprintf.c EXTRA_DIST += c-vasprintf.h ## end gnulib module c-vasprintf ## begin gnulib module c-xvasprintf libgl_la_SOURCES += c-xasprintf.c c-xvasprintf.c EXTRA_DIST += c-xvasprintf.h ## end gnulib module c-xvasprintf ## begin gnulib module canonicalize-lgpl EXTRA_DIST += canonicalize-lgpl.c EXTRA_libgl_la_SOURCES += canonicalize-lgpl.c ## end gnulib module canonicalize-lgpl ## begin gnulib module careadlinkat libgl_la_SOURCES += careadlinkat.c EXTRA_DIST += careadlinkat.h ## end gnulib module careadlinkat ## begin gnulib module clean-temp libgl_la_SOURCES += clean-temp.h clean-temp.c ## end gnulib module clean-temp ## begin gnulib module cloexec libgl_la_SOURCES += cloexec.c EXTRA_DIST += cloexec.h ## end gnulib module cloexec ## begin gnulib module close EXTRA_DIST += close.c EXTRA_libgl_la_SOURCES += close.c ## end gnulib module close ## begin gnulib module configmake # Listed in the same order as the GNU makefile conventions, and # provided by autoconf 2.59c+ or 2.70. # The Automake-defined pkg* macros are appended, in the order # listed in the Automake 1.10a+ documentation. configmake.h: Makefile $(AM_V_GEN)rm -f $@-t && \ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \ echo '#if HAVE_WINSOCK2_H'; \ echo '# include /* avoid mingw pollution on DATADIR */'; \ echo '#endif'; \ echo '#define PREFIX "$(prefix)"'; \ echo '#define EXEC_PREFIX "$(exec_prefix)"'; \ echo '#define BINDIR "$(bindir)"'; \ echo '#define SBINDIR "$(sbindir)"'; \ echo '#define LIBEXECDIR "$(libexecdir)"'; \ echo '#define DATAROOTDIR "$(datarootdir)"'; \ echo '#define DATADIR "$(datadir)"'; \ echo '#define SYSCONFDIR "$(sysconfdir)"'; \ echo '#define SHAREDSTATEDIR "$(sharedstatedir)"'; \ echo '#define LOCALSTATEDIR "$(localstatedir)"'; \ echo '#define RUNSTATEDIR "$(runstatedir)"'; \ echo '#define INCLUDEDIR "$(includedir)"'; \ echo '#define OLDINCLUDEDIR "$(oldincludedir)"'; \ echo '#define DOCDIR "$(docdir)"'; \ echo '#define INFODIR "$(infodir)"'; \ echo '#define HTMLDIR "$(htmldir)"'; \ echo '#define DVIDIR "$(dvidir)"'; \ echo '#define PDFDIR "$(pdfdir)"'; \ echo '#define PSDIR "$(psdir)"'; \ echo '#define LIBDIR "$(libdir)"'; \ echo '#define LISPDIR "$(lispdir)"'; \ echo '#define LOCALEDIR "$(localedir)"'; \ echo '#define MANDIR "$(mandir)"'; \ echo '#define MANEXT "$(manext)"'; \ echo '#define PKGDATADIR "$(pkgdatadir)"'; \ echo '#define PKGINCLUDEDIR "$(pkgincludedir)"'; \ echo '#define PKGLIBDIR "$(pkglibdir)"'; \ echo '#define PKGLIBEXECDIR "$(pkglibexecdir)"'; \ } | sed '/""/d' > $@-t && \ mv -f $@-t $@ BUILT_SOURCES += configmake.h CLEANFILES += configmake.h configmake.h-t ## end gnulib module configmake ## begin gnulib module count-leading-zeros libgl_la_SOURCES += count-leading-zeros.c EXTRA_DIST += count-leading-zeros.h ## end gnulib module count-leading-zeros ## begin gnulib module count-one-bits libgl_la_SOURCES += count-one-bits.c EXTRA_DIST += count-one-bits.h ## end gnulib module count-one-bits ## begin gnulib module crc libgl_la_SOURCES += crc.c EXTRA_DIST += crc.h ## end gnulib module crc ## begin gnulib module crypto/md4 libgl_la_SOURCES += md4.c EXTRA_DIST += md4.h ## end gnulib module crypto/md4 ## begin gnulib module crypto/rijndael libgl_la_SOURCES += rijndael-alg-fst.c rijndael-api-fst.c EXTRA_DIST += rijndael-alg-fst.h rijndael-api-fst.h ## end gnulib module crypto/rijndael ## begin gnulib module dirname libgl_la_SOURCES += dirname.c basename.c EXTRA_DIST += stripslash.c EXTRA_libgl_la_SOURCES += stripslash.c ## end gnulib module dirname ## begin gnulib module dirname-lgpl libgl_la_SOURCES += dirname-lgpl.c stripslash.c EXTRA_DIST += dirname.h ## end gnulib module dirname-lgpl ## begin gnulib module dtoastr libgl_la_SOURCES += dtoastr.c EXTRA_DIST += ftoastr.c ftoastr.h EXTRA_libgl_la_SOURCES += ftoastr.c ## end gnulib module dtoastr ## begin gnulib module dtotimespec libgl_la_SOURCES += dtotimespec.c ## end gnulib module dtotimespec ## begin gnulib module dup2 EXTRA_DIST += dup2.c EXTRA_libgl_la_SOURCES += dup2.c ## end gnulib module dup2 ## begin gnulib module errno BUILT_SOURCES += $(ERRNO_H) # We need the following in order to create when the system # doesn't have one that is POSIX compliant. if GL_GENERATE_ERRNO_H errno.h: errno.in.h $(top_builddir)/config.status $(AM_V_GEN)rm -f $@-t $@ && \ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */' && \ sed -e 's|@''GUARD_PREFIX''@|GL|g' \ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \ -e 's|@''NEXT_ERRNO_H''@|$(NEXT_ERRNO_H)|g' \ -e 's|@''EMULTIHOP_HIDDEN''@|$(EMULTIHOP_HIDDEN)|g' \ -e 's|@''EMULTIHOP_VALUE''@|$(EMULTIHOP_VALUE)|g' \ -e 's|@''ENOLINK_HIDDEN''@|$(ENOLINK_HIDDEN)|g' \ -e 's|@''ENOLINK_VALUE''@|$(ENOLINK_VALUE)|g' \ -e 's|@''EOVERFLOW_HIDDEN''@|$(EOVERFLOW_HIDDEN)|g' \ -e 's|@''EOVERFLOW_VALUE''@|$(EOVERFLOW_VALUE)|g' \ < $(srcdir)/errno.in.h; \ } > $@-t && \ mv $@-t $@ else errno.h: $(top_builddir)/config.status rm -f $@ endif MOSTLYCLEANFILES += errno.h errno.h-t EXTRA_DIST += errno.in.h ## end gnulib module errno ## begin gnulib module error EXTRA_DIST += error.c error.h EXTRA_libgl_la_SOURCES += error.c ## end gnulib module error ## begin gnulib module exitfail libgl_la_SOURCES += exitfail.c EXTRA_DIST += exitfail.h ## end gnulib module exitfail ## begin gnulib module explicit_bzero EXTRA_DIST += explicit_bzero.c EXTRA_libgl_la_SOURCES += explicit_bzero.c ## end gnulib module explicit_bzero ## begin gnulib module fatal-signal libgl_la_SOURCES += fatal-signal.h fatal-signal.c ## end gnulib module fatal-signal ## begin gnulib module fcntl EXTRA_DIST += fcntl.c EXTRA_libgl_la_SOURCES += fcntl.c ## end gnulib module fcntl ## begin gnulib module fcntl-h BUILT_SOURCES += fcntl.h # We need the following in order to create when the system # doesn't have one that works with the given compiler. fcntl.h: fcntl.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(ARG_NONNULL_H) $(WARN_ON_USE_H) $(AM_V_GEN)rm -f $@-t $@ && \ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \ sed -e 's|@''GUARD_PREFIX''@|GL|g' \ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \ -e 's|@''NEXT_FCNTL_H''@|$(NEXT_FCNTL_H)|g' \ -e 's/@''GNULIB_CREAT''@/$(GNULIB_CREAT)/g' \ -e 's/@''GNULIB_FCNTL''@/$(GNULIB_FCNTL)/g' \ -e 's/@''GNULIB_NONBLOCKING''@/$(GNULIB_NONBLOCKING)/g' \ -e 's/@''GNULIB_OPEN''@/$(GNULIB_OPEN)/g' \ -e 's/@''GNULIB_OPENAT''@/$(GNULIB_OPENAT)/g' \ -e 's|@''HAVE_FCNTL''@|$(HAVE_FCNTL)|g' \ -e 's|@''HAVE_OPENAT''@|$(HAVE_OPENAT)|g' \ -e 's|@''REPLACE_CREAT''@|$(REPLACE_CREAT)|g' \ -e 's|@''REPLACE_FCNTL''@|$(REPLACE_FCNTL)|g' \ -e 's|@''REPLACE_OPEN''@|$(REPLACE_OPEN)|g' \ -e 's|@''REPLACE_OPENAT''@|$(REPLACE_OPENAT)|g' \ -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \ -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \ -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \ < $(srcdir)/fcntl.in.h; \ } > $@-t && \ mv $@-t $@ MOSTLYCLEANFILES += fcntl.h fcntl.h-t EXTRA_DIST += fcntl.in.h ## end gnulib module fcntl-h ## begin gnulib module fd-hook libgl_la_SOURCES += fd-hook.c EXTRA_DIST += fd-hook.h ## end gnulib module fd-hook ## begin gnulib module filename EXTRA_DIST += filename.h ## end gnulib module filename ## begin gnulib module flexmember EXTRA_DIST += flexmember.h ## end gnulib module flexmember ## begin gnulib module float BUILT_SOURCES += $(FLOAT_H) # We need the following in order to create when the system # doesn't have one that works with the given compiler. if GL_GENERATE_FLOAT_H float.h: float.in.h $(top_builddir)/config.status $(AM_V_GEN)rm -f $@-t $@ && \ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */' && \ sed -e 's|@''GUARD_PREFIX''@|GL|g' \ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \ -e 's|@''NEXT_FLOAT_H''@|$(NEXT_FLOAT_H)|g' \ -e 's|@''REPLACE_ITOLD''@|$(REPLACE_ITOLD)|g' \ < $(srcdir)/float.in.h; \ } > $@-t && \ mv $@-t $@ else float.h: $(top_builddir)/config.status rm -f $@ endif MOSTLYCLEANFILES += float.h float.h-t EXTRA_DIST += float.c float.in.h itold.c EXTRA_libgl_la_SOURCES += float.c itold.c ## end gnulib module float ## begin gnulib module floor EXTRA_DIST += floor.c EXTRA_libgl_la_SOURCES += floor.c ## end gnulib module floor ## begin gnulib module fopen EXTRA_DIST += fopen.c EXTRA_libgl_la_SOURCES += fopen.c ## end gnulib module fopen ## begin gnulib module fprintf-posix EXTRA_DIST += fprintf.c EXTRA_libgl_la_SOURCES += fprintf.c ## end gnulib module fprintf-posix ## begin gnulib module fpucw EXTRA_DIST += fpucw.h ## end gnulib module fpucw ## begin gnulib module frexp-nolibm EXTRA_DIST += frexp.c EXTRA_libgl_la_SOURCES += frexp.c ## end gnulib module frexp-nolibm ## begin gnulib module frexpl-nolibm EXTRA_DIST += frexp.c frexpl.c EXTRA_libgl_la_SOURCES += frexp.c frexpl.c ## end gnulib module frexpl-nolibm ## begin gnulib module fseek EXTRA_DIST += fseek.c EXTRA_libgl_la_SOURCES += fseek.c ## end gnulib module fseek ## begin gnulib module fseeko EXTRA_DIST += fseeko.c stdio-impl.h EXTRA_libgl_la_SOURCES += fseeko.c ## end gnulib module fseeko ## begin gnulib module fseterr EXTRA_DIST += fseterr.c fseterr.h stdio-impl.h EXTRA_libgl_la_SOURCES += fseterr.c ## end gnulib module fseterr ## begin gnulib module fstat EXTRA_DIST += fstat.c stat-w32.c stat-w32.h EXTRA_libgl_la_SOURCES += fstat.c stat-w32.c ## end gnulib module fstat ## begin gnulib module ftell EXTRA_DIST += ftell.c EXTRA_libgl_la_SOURCES += ftell.c ## end gnulib module ftell ## begin gnulib module ftello EXTRA_DIST += ftello.c stdio-impl.h EXTRA_libgl_la_SOURCES += ftello.c ## end gnulib module ftello ## begin gnulib module full-read libgl_la_SOURCES += full-read.h full-read.c EXTRA_DIST += full-write.c EXTRA_libgl_la_SOURCES += full-write.c ## end gnulib module full-read ## begin gnulib module full-write libgl_la_SOURCES += full-write.h full-write.c ## end gnulib module full-write ## begin gnulib module fwriteerror libgl_la_SOURCES += fwriteerror.h fwriteerror.c ## end gnulib module fwriteerror ## begin gnulib module getdelim EXTRA_DIST += getdelim.c EXTRA_libgl_la_SOURCES += getdelim.c ## end gnulib module getdelim ## begin gnulib module getdtablesize EXTRA_DIST += getdtablesize.c EXTRA_libgl_la_SOURCES += getdtablesize.c ## end gnulib module getdtablesize ## begin gnulib module getline EXTRA_DIST += getline.c EXTRA_libgl_la_SOURCES += getline.c ## end gnulib module getline ## begin gnulib module getopt-posix BUILT_SOURCES += $(GETOPT_H) $(GETOPT_CDEFS_H) # We need the following in order to create when the system # doesn't have one that works with the given compiler. getopt.h: getopt.in.h $(top_builddir)/config.status $(ARG_NONNULL_H) $(AM_V_GEN)rm -f $@-t $@ && \ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \ sed -e 's|@''GUARD_PREFIX''@|GL|g' \ -e 's|@''HAVE_GETOPT_H''@|$(HAVE_GETOPT_H)|g' \ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \ -e 's|@''NEXT_GETOPT_H''@|$(NEXT_GETOPT_H)|g' \ -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \ < $(srcdir)/getopt.in.h; \ } > $@-t && \ mv -f $@-t $@ getopt-cdefs.h: getopt-cdefs.in.h $(top_builddir)/config.status $(AM_V_GEN)rm -f $@-t $@ && \ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \ sed -e 's|@''HAVE_SYS_CDEFS_H''@|$(HAVE_SYS_CDEFS_H)|g' \ < $(srcdir)/getopt-cdefs.in.h; \ } > $@-t && \ mv -f $@-t $@ MOSTLYCLEANFILES += getopt.h getopt.h-t getopt-cdefs.h getopt-cdefs.h-t EXTRA_DIST += getopt-cdefs.in.h getopt-core.h getopt-ext.h getopt-pfx-core.h getopt-pfx-ext.h getopt.c getopt.in.h getopt1.c getopt_int.h EXTRA_libgl_la_SOURCES += getopt.c getopt1.c ## end gnulib module getopt-posix ## begin gnulib module getpass EXTRA_DIST += getpass.c getpass.h EXTRA_libgl_la_SOURCES += getpass.c ## end gnulib module getpass ## begin gnulib module getprogname libgl_la_SOURCES += getprogname.h getprogname.c ## end gnulib module getprogname ## begin gnulib module getrandom EXTRA_DIST += getrandom.c EXTRA_libgl_la_SOURCES += getrandom.c ## end gnulib module getrandom ## begin gnulib module gettext-h libgl_la_SOURCES += gettext.h ## end gnulib module gettext-h ## begin gnulib module gettime libgl_la_SOURCES += gettime.c ## end gnulib module gettime ## begin gnulib module gettimeofday EXTRA_DIST += gettimeofday.c EXTRA_libgl_la_SOURCES += gettimeofday.c ## end gnulib module gettimeofday ## begin gnulib module gitlog-to-changelog EXTRA_DIST += $(top_srcdir)/build-aux/gitlog-to-changelog ## end gnulib module gitlog-to-changelog ## begin gnulib module gperf GPERF = gperf V_GPERF = $(V_GPERF_@AM_V@) V_GPERF_ = $(V_GPERF_@AM_DEFAULT_V@) V_GPERF_0 = @echo " GPERF " $@; ## end gnulib module gperf ## begin gnulib module hard-locale libgl_la_SOURCES += hard-locale.c EXTRA_DIST += hard-locale.h ## end gnulib module hard-locale ## begin gnulib module intprops EXTRA_DIST += intprops.h ## end gnulib module intprops ## begin gnulib module inttostr libgl_la_SOURCES += imaxtostr.c inttostr.c offtostr.c uinttostr.c umaxtostr.c EXTRA_DIST += anytostr.c inttostr.h EXTRA_libgl_la_SOURCES += anytostr.c ## end gnulib module inttostr ## begin gnulib module inttypes-incomplete BUILT_SOURCES += inttypes.h # We need the following in order to create when the system # doesn't have one that works with the given compiler. inttypes.h: inttypes.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(WARN_ON_USE_H) $(ARG_NONNULL_H) $(AM_V_GEN)rm -f $@-t $@ && \ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \ sed -e 's/@''HAVE_INTTYPES_H''@/$(HAVE_INTTYPES_H)/g' \ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \ -e 's|@''NEXT_INTTYPES_H''@|$(NEXT_INTTYPES_H)|g' \ -e 's/@''APPLE_UNIVERSAL_BUILD''@/$(APPLE_UNIVERSAL_BUILD)/g' \ -e 's/@''PRIPTR_PREFIX''@/$(PRIPTR_PREFIX)/g' \ -e 's/@''GNULIB_IMAXABS''@/$(GNULIB_IMAXABS)/g' \ -e 's/@''GNULIB_IMAXDIV''@/$(GNULIB_IMAXDIV)/g' \ -e 's/@''GNULIB_STRTOIMAX''@/$(GNULIB_STRTOIMAX)/g' \ -e 's/@''GNULIB_STRTOUMAX''@/$(GNULIB_STRTOUMAX)/g' \ -e 's/@''HAVE_DECL_IMAXABS''@/$(HAVE_DECL_IMAXABS)/g' \ -e 's/@''HAVE_DECL_IMAXDIV''@/$(HAVE_DECL_IMAXDIV)/g' \ -e 's/@''HAVE_DECL_STRTOIMAX''@/$(HAVE_DECL_STRTOIMAX)/g' \ -e 's/@''HAVE_DECL_STRTOUMAX''@/$(HAVE_DECL_STRTOUMAX)/g' \ -e 's/@''HAVE_IMAXDIV_T''@/$(HAVE_IMAXDIV_T)/g' \ -e 's/@''REPLACE_STRTOIMAX''@/$(REPLACE_STRTOIMAX)/g' \ -e 's/@''REPLACE_STRTOUMAX''@/$(REPLACE_STRTOUMAX)/g' \ -e 's/@''INT32_MAX_LT_INTMAX_MAX''@/$(INT32_MAX_LT_INTMAX_MAX)/g' \ -e 's/@''INT64_MAX_EQ_LONG_MAX''@/$(INT64_MAX_EQ_LONG_MAX)/g' \ -e 's/@''UINT32_MAX_LT_UINTMAX_MAX''@/$(UINT32_MAX_LT_UINTMAX_MAX)/g' \ -e 's/@''UINT64_MAX_EQ_ULONG_MAX''@/$(UINT64_MAX_EQ_ULONG_MAX)/g' \ -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \ -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \ -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \ < $(srcdir)/inttypes.in.h; \ } > $@-t && \ mv $@-t $@ MOSTLYCLEANFILES += inttypes.h inttypes.h-t EXTRA_DIST += inttypes.in.h ## end gnulib module inttypes-incomplete ## begin gnulib module isfinite EXTRA_DIST += isfinite.c EXTRA_libgl_la_SOURCES += isfinite.c ## end gnulib module isfinite ## begin gnulib module isinf EXTRA_DIST += isinf.c EXTRA_libgl_la_SOURCES += isinf.c ## end gnulib module isinf ## begin gnulib module isnand EXTRA_DIST += float+.h isnan.c isnand.c EXTRA_libgl_la_SOURCES += isnan.c isnand.c ## end gnulib module isnand ## begin gnulib module isnand-nolibm EXTRA_DIST += float+.h isnan.c isnand-nolibm.h isnand.c EXTRA_libgl_la_SOURCES += isnan.c isnand.c ## end gnulib module isnand-nolibm ## begin gnulib module isnanf EXTRA_DIST += float+.h isnan.c isnanf.c EXTRA_libgl_la_SOURCES += isnan.c isnanf.c ## end gnulib module isnanf ## begin gnulib module isnanf-nolibm EXTRA_DIST += float+.h isnan.c isnanf-nolibm.h isnanf.c EXTRA_libgl_la_SOURCES += isnan.c isnanf.c ## end gnulib module isnanf-nolibm ## begin gnulib module isnanl EXTRA_DIST += float+.h isnan.c isnanl.c EXTRA_libgl_la_SOURCES += isnan.c isnanl.c ## end gnulib module isnanl ## begin gnulib module isnanl-nolibm EXTRA_DIST += float+.h isnan.c isnanl-nolibm.h isnanl.c EXTRA_libgl_la_SOURCES += isnan.c isnanl.c ## end gnulib module isnanl-nolibm ## begin gnulib module iswblank EXTRA_DIST += iswblank.c EXTRA_libgl_la_SOURCES += iswblank.c ## end gnulib module iswblank ## begin gnulib module iswdigit EXTRA_DIST += iswdigit.c EXTRA_libgl_la_SOURCES += iswdigit.c ## end gnulib module iswdigit ## begin gnulib module iswxdigit EXTRA_DIST += iswxdigit.c EXTRA_libgl_la_SOURCES += iswxdigit.c ## end gnulib module iswxdigit ## begin gnulib module langinfo BUILT_SOURCES += langinfo.h # We need the following in order to create an empty placeholder for # when the system doesn't have one. langinfo.h: langinfo.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(WARN_ON_USE_H) $(AM_V_GEN)rm -f $@-t $@ && \ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \ sed -e 's|@''GUARD_PREFIX''@|GL|g' \ -e 's|@''HAVE_LANGINFO_H''@|$(HAVE_LANGINFO_H)|g' \ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \ -e 's|@''NEXT_LANGINFO_H''@|$(NEXT_LANGINFO_H)|g' \ -e 's/@''GNULIB_NL_LANGINFO''@/$(GNULIB_NL_LANGINFO)/g' \ -e 's|@''HAVE_LANGINFO_CODESET''@|$(HAVE_LANGINFO_CODESET)|g' \ -e 's|@''HAVE_LANGINFO_T_FMT_AMPM''@|$(HAVE_LANGINFO_T_FMT_AMPM)|g' \ -e 's|@''HAVE_LANGINFO_ALTMON''@|$(HAVE_LANGINFO_ALTMON)|g' \ -e 's|@''HAVE_LANGINFO_ERA''@|$(HAVE_LANGINFO_ERA)|g' \ -e 's|@''HAVE_LANGINFO_YESEXPR''@|$(HAVE_LANGINFO_YESEXPR)|g' \ -e 's|@''HAVE_NL_LANGINFO''@|$(HAVE_NL_LANGINFO)|g' \ -e 's|@''REPLACE_NL_LANGINFO''@|$(REPLACE_NL_LANGINFO)|g' \ -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \ -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \ < $(srcdir)/langinfo.in.h; \ } > $@-t && \ mv $@-t $@ MOSTLYCLEANFILES += langinfo.h langinfo.h-t EXTRA_DIST += langinfo.in.h ## end gnulib module langinfo ## begin gnulib module libc-config EXTRA_DIST += cdefs.h libc-config.h ## end gnulib module libc-config ## begin gnulib module limits-h BUILT_SOURCES += $(LIMITS_H) # We need the following in order to create when the system # doesn't have one that is compatible with GNU. if GL_GENERATE_LIMITS_H limits.h: limits.in.h $(top_builddir)/config.status $(AM_V_GEN)rm -f $@-t $@ && \ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */' && \ sed -e 's|@''GUARD_PREFIX''@|GL|g' \ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \ -e 's|@''NEXT_LIMITS_H''@|$(NEXT_LIMITS_H)|g' \ < $(srcdir)/limits.in.h; \ } > $@-t && \ mv $@-t $@ else limits.h: $(top_builddir)/config.status rm -f $@ endif MOSTLYCLEANFILES += limits.h limits.h-t EXTRA_DIST += limits.in.h ## end gnulib module limits-h ## begin gnulib module linked-list libgl_la_SOURCES += gl_linked_list.h gl_linked_list.c gl_anylinked_list1.h gl_anylinked_list2.h ## end gnulib module linked-list ## begin gnulib module linkedhash-list libgl_la_SOURCES += gl_linkedhash_list.h gl_linkedhash_list.c gl_anyhash1.h gl_anyhash2.h gl_anyhash_primes.h gl_anylinked_list1.h gl_anylinked_list2.h ## end gnulib module linkedhash-list ## begin gnulib module list libgl_la_SOURCES += gl_list.h gl_list.c ## end gnulib module list ## begin gnulib module localcharset libgl_la_SOURCES += localcharset.c EXTRA_DIST += localcharset.h ## end gnulib module localcharset ## begin gnulib module locale BUILT_SOURCES += locale.h # We need the following in order to create when the system # doesn't have one that provides all definitions. locale.h: locale.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(ARG_NONNULL_H) $(WARN_ON_USE_H) $(AM_V_GEN)rm -f $@-t $@ && \ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */' && \ sed -e 's|@''GUARD_PREFIX''@|GL|g' \ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \ -e 's|@''NEXT_LOCALE_H''@|$(NEXT_LOCALE_H)|g' \ -e 's/@''GNULIB_LOCALECONV''@/$(GNULIB_LOCALECONV)/g' \ -e 's/@''GNULIB_SETLOCALE''@/$(GNULIB_SETLOCALE)/g' \ -e 's/@''GNULIB_SETLOCALE_NULL''@/$(GNULIB_SETLOCALE_NULL)/g' \ -e 's/@''GNULIB_DUPLOCALE''@/$(GNULIB_DUPLOCALE)/g' \ -e 's/@''GNULIB_LOCALENAME''@/$(GNULIB_LOCALENAME)/g' \ -e 's|@''HAVE_NEWLOCALE''@|$(HAVE_NEWLOCALE)|g' \ -e 's|@''HAVE_DUPLOCALE''@|$(HAVE_DUPLOCALE)|g' \ -e 's|@''HAVE_FREELOCALE''@|$(HAVE_FREELOCALE)|g' \ -e 's|@''HAVE_XLOCALE_H''@|$(HAVE_XLOCALE_H)|g' \ -e 's|@''REPLACE_LOCALECONV''@|$(REPLACE_LOCALECONV)|g' \ -e 's|@''REPLACE_SETLOCALE''@|$(REPLACE_SETLOCALE)|g' \ -e 's|@''REPLACE_NEWLOCALE''@|$(REPLACE_NEWLOCALE)|g' \ -e 's|@''REPLACE_DUPLOCALE''@|$(REPLACE_DUPLOCALE)|g' \ -e 's|@''REPLACE_FREELOCALE''@|$(REPLACE_FREELOCALE)|g' \ -e 's|@''REPLACE_STRUCT_LCONV''@|$(REPLACE_STRUCT_LCONV)|g' \ -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \ -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \ -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \ < $(srcdir)/locale.in.h; \ } > $@-t && \ mv $@-t $@ MOSTLYCLEANFILES += locale.h locale.h-t EXTRA_DIST += locale.in.h ## end gnulib module locale ## begin gnulib module localeconv EXTRA_DIST += localeconv.c EXTRA_libgl_la_SOURCES += localeconv.c ## end gnulib module localeconv ## begin gnulib module localename libgl_la_SOURCES += localename.c localename-table.c EXTRA_DIST += localename-table.h localename.h ## end gnulib module localename ## begin gnulib module lock libgl_la_SOURCES += glthread/lock.h glthread/lock.c ## end gnulib module lock ## begin gnulib module lseek EXTRA_DIST += lseek.c EXTRA_libgl_la_SOURCES += lseek.c ## end gnulib module lseek ## begin gnulib module lstat EXTRA_DIST += lstat.c EXTRA_libgl_la_SOURCES += lstat.c ## end gnulib module lstat ## begin gnulib module malloc-posix EXTRA_DIST += malloc.c EXTRA_libgl_la_SOURCES += malloc.c ## end gnulib module malloc-posix ## begin gnulib module malloca libgl_la_SOURCES += malloca.c EXTRA_DIST += malloca.h ## end gnulib module malloca ## begin gnulib module math BUILT_SOURCES += math.h libgl_la_SOURCES += math.c # We need the following in order to create when the system # doesn't have one that works with the given compiler. math.h: math.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(ARG_NONNULL_H) $(WARN_ON_USE_H) $(AM_V_GEN)rm -f $@-t $@ && \ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */' && \ sed -e 's|@''GUARD_PREFIX''@|GL|g' \ -e 's|@''INCLUDE_NEXT_AS_FIRST_DIRECTIVE''@|$(INCLUDE_NEXT_AS_FIRST_DIRECTIVE)|g' \ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \ -e 's|@''NEXT_AS_FIRST_DIRECTIVE_MATH_H''@|$(NEXT_AS_FIRST_DIRECTIVE_MATH_H)|g' \ -e 's/@''GNULIB_ACOSF''@/$(GNULIB_ACOSF)/g' \ -e 's/@''GNULIB_ACOSL''@/$(GNULIB_ACOSL)/g' \ -e 's/@''GNULIB_ASINF''@/$(GNULIB_ASINF)/g' \ -e 's/@''GNULIB_ASINL''@/$(GNULIB_ASINL)/g' \ -e 's/@''GNULIB_ATANF''@/$(GNULIB_ATANF)/g' \ -e 's/@''GNULIB_ATANL''@/$(GNULIB_ATANL)/g' \ -e 's/@''GNULIB_ATAN2F''@/$(GNULIB_ATAN2F)/g' \ -e 's/@''GNULIB_CBRT''@/$(GNULIB_CBRT)/g' \ -e 's/@''GNULIB_CBRTF''@/$(GNULIB_CBRTF)/g' \ -e 's/@''GNULIB_CBRTL''@/$(GNULIB_CBRTL)/g' \ -e 's/@''GNULIB_CEIL''@/$(GNULIB_CEIL)/g' \ -e 's/@''GNULIB_CEILF''@/$(GNULIB_CEILF)/g' \ -e 's/@''GNULIB_CEILL''@/$(GNULIB_CEILL)/g' \ -e 's/@''GNULIB_COPYSIGN''@/$(GNULIB_COPYSIGN)/g' \ -e 's/@''GNULIB_COPYSIGNF''@/$(GNULIB_COPYSIGNF)/g' \ -e 's/@''GNULIB_COPYSIGNL''@/$(GNULIB_COPYSIGNL)/g' \ -e 's/@''GNULIB_COSF''@/$(GNULIB_COSF)/g' \ -e 's/@''GNULIB_COSL''@/$(GNULIB_COSL)/g' \ -e 's/@''GNULIB_COSHF''@/$(GNULIB_COSHF)/g' \ -e 's/@''GNULIB_EXPF''@/$(GNULIB_EXPF)/g' \ -e 's/@''GNULIB_EXPL''@/$(GNULIB_EXPL)/g' \ -e 's/@''GNULIB_EXP2''@/$(GNULIB_EXP2)/g' \ -e 's/@''GNULIB_EXP2F''@/$(GNULIB_EXP2F)/g' \ -e 's/@''GNULIB_EXP2L''@/$(GNULIB_EXP2L)/g' \ -e 's/@''GNULIB_EXPM1''@/$(GNULIB_EXPM1)/g' \ -e 's/@''GNULIB_EXPM1F''@/$(GNULIB_EXPM1F)/g' \ -e 's/@''GNULIB_EXPM1L''@/$(GNULIB_EXPM1L)/g' \ -e 's/@''GNULIB_FABSF''@/$(GNULIB_FABSF)/g' \ -e 's/@''GNULIB_FABSL''@/$(GNULIB_FABSL)/g' \ -e 's/@''GNULIB_FLOOR''@/$(GNULIB_FLOOR)/g' \ -e 's/@''GNULIB_FLOORF''@/$(GNULIB_FLOORF)/g' \ -e 's/@''GNULIB_FLOORL''@/$(GNULIB_FLOORL)/g' \ -e 's/@''GNULIB_FMA''@/$(GNULIB_FMA)/g' \ -e 's/@''GNULIB_FMAF''@/$(GNULIB_FMAF)/g' \ -e 's/@''GNULIB_FMAL''@/$(GNULIB_FMAL)/g' \ -e 's/@''GNULIB_FMOD''@/$(GNULIB_FMOD)/g' \ -e 's/@''GNULIB_FMODF''@/$(GNULIB_FMODF)/g' \ -e 's/@''GNULIB_FMODL''@/$(GNULIB_FMODL)/g' \ -e 's/@''GNULIB_FREXPF''@/$(GNULIB_FREXPF)/g' \ -e 's/@''GNULIB_FREXP''@/$(GNULIB_FREXP)/g' \ -e 's/@''GNULIB_FREXPL''@/$(GNULIB_FREXPL)/g' \ -e 's/@''GNULIB_HYPOT''@/$(GNULIB_HYPOT)/g' \ -e 's/@''GNULIB_HYPOTF''@/$(GNULIB_HYPOTF)/g' \ -e 's/@''GNULIB_HYPOTL''@/$(GNULIB_HYPOTL)/g' \ < $(srcdir)/math.in.h | \ sed -e 's/@''GNULIB_ILOGB''@/$(GNULIB_ILOGB)/g' \ -e 's/@''GNULIB_ILOGBF''@/$(GNULIB_ILOGBF)/g' \ -e 's/@''GNULIB_ILOGBL''@/$(GNULIB_ILOGBL)/g' \ -e 's/@''GNULIB_ISFINITE''@/$(GNULIB_ISFINITE)/g' \ -e 's/@''GNULIB_ISINF''@/$(GNULIB_ISINF)/g' \ -e 's/@''GNULIB_ISNAN''@/$(GNULIB_ISNAN)/g' \ -e 's/@''GNULIB_ISNANF''@/$(GNULIB_ISNANF)/g' \ -e 's/@''GNULIB_ISNAND''@/$(GNULIB_ISNAND)/g' \ -e 's/@''GNULIB_ISNANL''@/$(GNULIB_ISNANL)/g' \ -e 's/@''GNULIB_LDEXPF''@/$(GNULIB_LDEXPF)/g' \ -e 's/@''GNULIB_LDEXPL''@/$(GNULIB_LDEXPL)/g' \ -e 's/@''GNULIB_LOG''@/$(GNULIB_LOG)/g' \ -e 's/@''GNULIB_LOGF''@/$(GNULIB_LOGF)/g' \ -e 's/@''GNULIB_LOGL''@/$(GNULIB_LOGL)/g' \ -e 's/@''GNULIB_LOG10''@/$(GNULIB_LOG10)/g' \ -e 's/@''GNULIB_LOG10F''@/$(GNULIB_LOG10F)/g' \ -e 's/@''GNULIB_LOG10L''@/$(GNULIB_LOG10L)/g' \ -e 's/@''GNULIB_LOG1P''@/$(GNULIB_LOG1P)/g' \ -e 's/@''GNULIB_LOG1PF''@/$(GNULIB_LOG1PF)/g' \ -e 's/@''GNULIB_LOG1PL''@/$(GNULIB_LOG1PL)/g' \ -e 's/@''GNULIB_LOG2''@/$(GNULIB_LOG2)/g' \ -e 's/@''GNULIB_LOG2F''@/$(GNULIB_LOG2F)/g' \ -e 's/@''GNULIB_LOG2L''@/$(GNULIB_LOG2L)/g' \ -e 's/@''GNULIB_LOGB''@/$(GNULIB_LOGB)/g' \ -e 's/@''GNULIB_LOGBF''@/$(GNULIB_LOGBF)/g' \ -e 's/@''GNULIB_LOGBL''@/$(GNULIB_LOGBL)/g' \ -e 's/@''GNULIB_MODF''@/$(GNULIB_MODF)/g' \ -e 's/@''GNULIB_MODFF''@/$(GNULIB_MODFF)/g' \ -e 's/@''GNULIB_MODFL''@/$(GNULIB_MODFL)/g' \ -e 's/@''GNULIB_POWF''@/$(GNULIB_POWF)/g' \ -e 's/@''GNULIB_REMAINDER''@/$(GNULIB_REMAINDER)/g' \ -e 's/@''GNULIB_REMAINDERF''@/$(GNULIB_REMAINDERF)/g' \ -e 's/@''GNULIB_REMAINDERL''@/$(GNULIB_REMAINDERL)/g' \ -e 's/@''GNULIB_RINT''@/$(GNULIB_RINT)/g' \ -e 's/@''GNULIB_RINTF''@/$(GNULIB_RINTF)/g' \ -e 's/@''GNULIB_RINTL''@/$(GNULIB_RINTL)/g' \ -e 's/@''GNULIB_ROUND''@/$(GNULIB_ROUND)/g' \ -e 's/@''GNULIB_ROUNDF''@/$(GNULIB_ROUNDF)/g' \ -e 's/@''GNULIB_ROUNDL''@/$(GNULIB_ROUNDL)/g' \ -e 's/@''GNULIB_SIGNBIT''@/$(GNULIB_SIGNBIT)/g' \ -e 's/@''GNULIB_SINF''@/$(GNULIB_SINF)/g' \ -e 's/@''GNULIB_SINL''@/$(GNULIB_SINL)/g' \ -e 's/@''GNULIB_SINHF''@/$(GNULIB_SINHF)/g' \ -e 's/@''GNULIB_SQRTF''@/$(GNULIB_SQRTF)/g' \ -e 's/@''GNULIB_SQRTL''@/$(GNULIB_SQRTL)/g' \ -e 's/@''GNULIB_TANF''@/$(GNULIB_TANF)/g' \ -e 's/@''GNULIB_TANL''@/$(GNULIB_TANL)/g' \ -e 's/@''GNULIB_TANHF''@/$(GNULIB_TANHF)/g' \ -e 's/@''GNULIB_TRUNC''@/$(GNULIB_TRUNC)/g' \ -e 's/@''GNULIB_TRUNCF''@/$(GNULIB_TRUNCF)/g' \ -e 's/@''GNULIB_TRUNCL''@/$(GNULIB_TRUNCL)/g' \ | \ sed -e 's|@''HAVE_ACOSF''@|$(HAVE_ACOSF)|g' \ -e 's|@''HAVE_ACOSL''@|$(HAVE_ACOSL)|g' \ -e 's|@''HAVE_ASINF''@|$(HAVE_ASINF)|g' \ -e 's|@''HAVE_ASINL''@|$(HAVE_ASINL)|g' \ -e 's|@''HAVE_ATANF''@|$(HAVE_ATANF)|g' \ -e 's|@''HAVE_ATANL''@|$(HAVE_ATANL)|g' \ -e 's|@''HAVE_ATAN2F''@|$(HAVE_ATAN2F)|g' \ -e 's|@''HAVE_CBRT''@|$(HAVE_CBRT)|g' \ -e 's|@''HAVE_CBRTF''@|$(HAVE_CBRTF)|g' \ -e 's|@''HAVE_CBRTL''@|$(HAVE_CBRTL)|g' \ -e 's|@''HAVE_COPYSIGN''@|$(HAVE_COPYSIGN)|g' \ -e 's|@''HAVE_COPYSIGNL''@|$(HAVE_COPYSIGNL)|g' \ -e 's|@''HAVE_COSF''@|$(HAVE_COSF)|g' \ -e 's|@''HAVE_COSL''@|$(HAVE_COSL)|g' \ -e 's|@''HAVE_COSHF''@|$(HAVE_COSHF)|g' \ -e 's|@''HAVE_EXPF''@|$(HAVE_EXPF)|g' \ -e 's|@''HAVE_EXPL''@|$(HAVE_EXPL)|g' \ -e 's|@''HAVE_EXPM1''@|$(HAVE_EXPM1)|g' \ -e 's|@''HAVE_EXPM1F''@|$(HAVE_EXPM1F)|g' \ -e 's|@''HAVE_FABSF''@|$(HAVE_FABSF)|g' \ -e 's|@''HAVE_FABSL''@|$(HAVE_FABSL)|g' \ -e 's|@''HAVE_FMA''@|$(HAVE_FMA)|g' \ -e 's|@''HAVE_FMAF''@|$(HAVE_FMAF)|g' \ -e 's|@''HAVE_FMAL''@|$(HAVE_FMAL)|g' \ -e 's|@''HAVE_FMODF''@|$(HAVE_FMODF)|g' \ -e 's|@''HAVE_FMODL''@|$(HAVE_FMODL)|g' \ -e 's|@''HAVE_FREXPF''@|$(HAVE_FREXPF)|g' \ -e 's|@''HAVE_HYPOTF''@|$(HAVE_HYPOTF)|g' \ -e 's|@''HAVE_HYPOTL''@|$(HAVE_HYPOTL)|g' \ -e 's|@''HAVE_ILOGB''@|$(HAVE_ILOGB)|g' \ -e 's|@''HAVE_ILOGBF''@|$(HAVE_ILOGBF)|g' \ -e 's|@''HAVE_ILOGBL''@|$(HAVE_ILOGBL)|g' \ -e 's|@''HAVE_ISNANF''@|$(HAVE_ISNANF)|g' \ -e 's|@''HAVE_ISNAND''@|$(HAVE_ISNAND)|g' \ -e 's|@''HAVE_ISNANL''@|$(HAVE_ISNANL)|g' \ -e 's|@''HAVE_LDEXPF''@|$(HAVE_LDEXPF)|g' \ -e 's|@''HAVE_LOGF''@|$(HAVE_LOGF)|g' \ -e 's|@''HAVE_LOGL''@|$(HAVE_LOGL)|g' \ -e 's|@''HAVE_LOG10F''@|$(HAVE_LOG10F)|g' \ -e 's|@''HAVE_LOG10L''@|$(HAVE_LOG10L)|g' \ -e 's|@''HAVE_LOG1P''@|$(HAVE_LOG1P)|g' \ -e 's|@''HAVE_LOG1PF''@|$(HAVE_LOG1PF)|g' \ -e 's|@''HAVE_LOG1PL''@|$(HAVE_LOG1PL)|g' \ -e 's|@''HAVE_LOGBF''@|$(HAVE_LOGBF)|g' \ -e 's|@''HAVE_LOGBL''@|$(HAVE_LOGBL)|g' \ -e 's|@''HAVE_MODFF''@|$(HAVE_MODFF)|g' \ -e 's|@''HAVE_MODFL''@|$(HAVE_MODFL)|g' \ -e 's|@''HAVE_POWF''@|$(HAVE_POWF)|g' \ -e 's|@''HAVE_REMAINDER''@|$(HAVE_REMAINDER)|g' \ -e 's|@''HAVE_REMAINDERF''@|$(HAVE_REMAINDERF)|g' \ -e 's|@''HAVE_RINT''@|$(HAVE_RINT)|g' \ -e 's|@''HAVE_RINTL''@|$(HAVE_RINTL)|g' \ -e 's|@''HAVE_SINF''@|$(HAVE_SINF)|g' \ -e 's|@''HAVE_SINL''@|$(HAVE_SINL)|g' \ -e 's|@''HAVE_SINHF''@|$(HAVE_SINHF)|g' \ -e 's|@''HAVE_SQRTF''@|$(HAVE_SQRTF)|g' \ -e 's|@''HAVE_SQRTL''@|$(HAVE_SQRTL)|g' \ -e 's|@''HAVE_TANF''@|$(HAVE_TANF)|g' \ -e 's|@''HAVE_TANL''@|$(HAVE_TANL)|g' \ -e 's|@''HAVE_TANHF''@|$(HAVE_TANHF)|g' \ -e 's|@''HAVE_DECL_ACOSL''@|$(HAVE_DECL_ACOSL)|g' \ -e 's|@''HAVE_DECL_ASINL''@|$(HAVE_DECL_ASINL)|g' \ -e 's|@''HAVE_DECL_ATANL''@|$(HAVE_DECL_ATANL)|g' \ -e 's|@''HAVE_DECL_CBRTF''@|$(HAVE_DECL_CBRTF)|g' \ -e 's|@''HAVE_DECL_CBRTL''@|$(HAVE_DECL_CBRTL)|g' \ -e 's|@''HAVE_DECL_CEILF''@|$(HAVE_DECL_CEILF)|g' \ -e 's|@''HAVE_DECL_CEILL''@|$(HAVE_DECL_CEILL)|g' \ -e 's|@''HAVE_DECL_COPYSIGNF''@|$(HAVE_DECL_COPYSIGNF)|g' \ -e 's|@''HAVE_DECL_COSL''@|$(HAVE_DECL_COSL)|g' \ -e 's|@''HAVE_DECL_EXPL''@|$(HAVE_DECL_EXPL)|g' \ -e 's|@''HAVE_DECL_EXP2''@|$(HAVE_DECL_EXP2)|g' \ -e 's|@''HAVE_DECL_EXP2F''@|$(HAVE_DECL_EXP2F)|g' \ -e 's|@''HAVE_DECL_EXP2L''@|$(HAVE_DECL_EXP2L)|g' \ -e 's|@''HAVE_DECL_EXPM1L''@|$(HAVE_DECL_EXPM1L)|g' \ -e 's|@''HAVE_DECL_FLOORF''@|$(HAVE_DECL_FLOORF)|g' \ -e 's|@''HAVE_DECL_FLOORL''@|$(HAVE_DECL_FLOORL)|g' \ -e 's|@''HAVE_DECL_FREXPL''@|$(HAVE_DECL_FREXPL)|g' \ -e 's|@''HAVE_DECL_LDEXPL''@|$(HAVE_DECL_LDEXPL)|g' \ -e 's|@''HAVE_DECL_LOGL''@|$(HAVE_DECL_LOGL)|g' \ -e 's|@''HAVE_DECL_LOG10L''@|$(HAVE_DECL_LOG10L)|g' \ -e 's|@''HAVE_DECL_LOG2''@|$(HAVE_DECL_LOG2)|g' \ -e 's|@''HAVE_DECL_LOG2F''@|$(HAVE_DECL_LOG2F)|g' \ -e 's|@''HAVE_DECL_LOG2L''@|$(HAVE_DECL_LOG2L)|g' \ -e 's|@''HAVE_DECL_LOGB''@|$(HAVE_DECL_LOGB)|g' \ -e 's|@''HAVE_DECL_REMAINDER''@|$(HAVE_DECL_REMAINDER)|g' \ -e 's|@''HAVE_DECL_REMAINDERL''@|$(HAVE_DECL_REMAINDERL)|g' \ -e 's|@''HAVE_DECL_RINTF''@|$(HAVE_DECL_RINTF)|g' \ -e 's|@''HAVE_DECL_ROUND''@|$(HAVE_DECL_ROUND)|g' \ -e 's|@''HAVE_DECL_ROUNDF''@|$(HAVE_DECL_ROUNDF)|g' \ -e 's|@''HAVE_DECL_ROUNDL''@|$(HAVE_DECL_ROUNDL)|g' \ -e 's|@''HAVE_DECL_SINL''@|$(HAVE_DECL_SINL)|g' \ -e 's|@''HAVE_DECL_SQRTL''@|$(HAVE_DECL_SQRTL)|g' \ -e 's|@''HAVE_DECL_TANL''@|$(HAVE_DECL_TANL)|g' \ -e 's|@''HAVE_DECL_TRUNC''@|$(HAVE_DECL_TRUNC)|g' \ -e 's|@''HAVE_DECL_TRUNCF''@|$(HAVE_DECL_TRUNCF)|g' \ -e 's|@''HAVE_DECL_TRUNCL''@|$(HAVE_DECL_TRUNCL)|g' \ | \ sed -e 's|@''REPLACE_ACOSF''@|$(REPLACE_ACOSF)|g' \ -e 's|@''REPLACE_ASINF''@|$(REPLACE_ASINF)|g' \ -e 's|@''REPLACE_ATANF''@|$(REPLACE_ATANF)|g' \ -e 's|@''REPLACE_ATAN2F''@|$(REPLACE_ATAN2F)|g' \ -e 's|@''REPLACE_CBRTF''@|$(REPLACE_CBRTF)|g' \ -e 's|@''REPLACE_CBRTL''@|$(REPLACE_CBRTL)|g' \ -e 's|@''REPLACE_CEIL''@|$(REPLACE_CEIL)|g' \ -e 's|@''REPLACE_CEILF''@|$(REPLACE_CEILF)|g' \ -e 's|@''REPLACE_CEILL''@|$(REPLACE_CEILL)|g' \ -e 's|@''REPLACE_COSF''@|$(REPLACE_COSF)|g' \ -e 's|@''REPLACE_COSHF''@|$(REPLACE_COSHF)|g' \ -e 's|@''REPLACE_EXPF''@|$(REPLACE_EXPF)|g' \ -e 's|@''REPLACE_EXPL''@|$(REPLACE_EXPL)|g' \ -e 's|@''REPLACE_EXPM1''@|$(REPLACE_EXPM1)|g' \ -e 's|@''REPLACE_EXPM1F''@|$(REPLACE_EXPM1F)|g' \ -e 's|@''REPLACE_EXPM1L''@|$(REPLACE_EXPM1L)|g' \ -e 's|@''REPLACE_EXP2''@|$(REPLACE_EXP2)|g' \ -e 's|@''REPLACE_EXP2L''@|$(REPLACE_EXP2L)|g' \ -e 's|@''REPLACE_FABSL''@|$(REPLACE_FABSL)|g' \ -e 's|@''REPLACE_FLOOR''@|$(REPLACE_FLOOR)|g' \ -e 's|@''REPLACE_FLOORF''@|$(REPLACE_FLOORF)|g' \ -e 's|@''REPLACE_FLOORL''@|$(REPLACE_FLOORL)|g' \ -e 's|@''REPLACE_FMA''@|$(REPLACE_FMA)|g' \ -e 's|@''REPLACE_FMAF''@|$(REPLACE_FMAF)|g' \ -e 's|@''REPLACE_FMAL''@|$(REPLACE_FMAL)|g' \ -e 's|@''REPLACE_FMOD''@|$(REPLACE_FMOD)|g' \ -e 's|@''REPLACE_FMODF''@|$(REPLACE_FMODF)|g' \ -e 's|@''REPLACE_FMODL''@|$(REPLACE_FMODL)|g' \ -e 's|@''REPLACE_FREXPF''@|$(REPLACE_FREXPF)|g' \ -e 's|@''REPLACE_FREXP''@|$(REPLACE_FREXP)|g' \ -e 's|@''REPLACE_FREXPL''@|$(REPLACE_FREXPL)|g' \ -e 's|@''REPLACE_HUGE_VAL''@|$(REPLACE_HUGE_VAL)|g' \ -e 's|@''REPLACE_HYPOT''@|$(REPLACE_HYPOT)|g' \ -e 's|@''REPLACE_HYPOTF''@|$(REPLACE_HYPOTF)|g' \ -e 's|@''REPLACE_HYPOTL''@|$(REPLACE_HYPOTL)|g' \ -e 's|@''REPLACE_ILOGB''@|$(REPLACE_ILOGB)|g' \ -e 's|@''REPLACE_ILOGBF''@|$(REPLACE_ILOGBF)|g' \ -e 's|@''REPLACE_ILOGBL''@|$(REPLACE_ILOGBL)|g' \ -e 's|@''REPLACE_ISFINITE''@|$(REPLACE_ISFINITE)|g' \ -e 's|@''REPLACE_ISINF''@|$(REPLACE_ISINF)|g' \ -e 's|@''REPLACE_ISNAN''@|$(REPLACE_ISNAN)|g' \ -e 's|@''REPLACE_ITOLD''@|$(REPLACE_ITOLD)|g' \ -e 's|@''REPLACE_LDEXPL''@|$(REPLACE_LDEXPL)|g' \ -e 's|@''REPLACE_LOG''@|$(REPLACE_LOG)|g' \ -e 's|@''REPLACE_LOGF''@|$(REPLACE_LOGF)|g' \ -e 's|@''REPLACE_LOGL''@|$(REPLACE_LOGL)|g' \ -e 's|@''REPLACE_LOG10''@|$(REPLACE_LOG10)|g' \ -e 's|@''REPLACE_LOG10F''@|$(REPLACE_LOG10F)|g' \ -e 's|@''REPLACE_LOG10L''@|$(REPLACE_LOG10L)|g' \ -e 's|@''REPLACE_LOG1P''@|$(REPLACE_LOG1P)|g' \ -e 's|@''REPLACE_LOG1PF''@|$(REPLACE_LOG1PF)|g' \ -e 's|@''REPLACE_LOG1PL''@|$(REPLACE_LOG1PL)|g' \ -e 's|@''REPLACE_LOG2''@|$(REPLACE_LOG2)|g' \ -e 's|@''REPLACE_LOG2F''@|$(REPLACE_LOG2F)|g' \ -e 's|@''REPLACE_LOG2L''@|$(REPLACE_LOG2L)|g' \ -e 's|@''REPLACE_LOGB''@|$(REPLACE_LOGB)|g' \ -e 's|@''REPLACE_LOGBF''@|$(REPLACE_LOGBF)|g' \ -e 's|@''REPLACE_LOGBL''@|$(REPLACE_LOGBL)|g' \ -e 's|@''REPLACE_MODF''@|$(REPLACE_MODF)|g' \ -e 's|@''REPLACE_MODFF''@|$(REPLACE_MODFF)|g' \ -e 's|@''REPLACE_MODFL''@|$(REPLACE_MODFL)|g' \ -e 's|@''REPLACE_NAN''@|$(REPLACE_NAN)|g' \ -e 's|@''REPLACE_REMAINDER''@|$(REPLACE_REMAINDER)|g' \ -e 's|@''REPLACE_REMAINDERF''@|$(REPLACE_REMAINDERF)|g' \ -e 's|@''REPLACE_REMAINDERL''@|$(REPLACE_REMAINDERL)|g' \ -e 's|@''REPLACE_RINTL''@|$(REPLACE_RINTL)|g' \ -e 's|@''REPLACE_ROUND''@|$(REPLACE_ROUND)|g' \ -e 's|@''REPLACE_ROUNDF''@|$(REPLACE_ROUNDF)|g' \ -e 's|@''REPLACE_ROUNDL''@|$(REPLACE_ROUNDL)|g' \ -e 's|@''REPLACE_SIGNBIT''@|$(REPLACE_SIGNBIT)|g' \ -e 's|@''REPLACE_SIGNBIT_USING_BUILTINS''@|$(REPLACE_SIGNBIT_USING_BUILTINS)|g' \ -e 's|@''REPLACE_SINF''@|$(REPLACE_SINF)|g' \ -e 's|@''REPLACE_SINHF''@|$(REPLACE_SINHF)|g' \ -e 's|@''REPLACE_SQRTF''@|$(REPLACE_SQRTF)|g' \ -e 's|@''REPLACE_SQRTL''@|$(REPLACE_SQRTL)|g' \ -e 's|@''REPLACE_TANF''@|$(REPLACE_TANF)|g' \ -e 's|@''REPLACE_TANHF''@|$(REPLACE_TANHF)|g' \ -e 's|@''REPLACE_TRUNC''@|$(REPLACE_TRUNC)|g' \ -e 's|@''REPLACE_TRUNCF''@|$(REPLACE_TRUNCF)|g' \ -e 's|@''REPLACE_TRUNCL''@|$(REPLACE_TRUNCL)|g' \ -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \ -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \ -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)'; \ } > $@-t && \ mv $@-t $@ MOSTLYCLEANFILES += math.h math.h-t EXTRA_DIST += math.in.h ## end gnulib module math ## begin gnulib module mbchar libgl_la_SOURCES += mbchar.c EXTRA_DIST += mbchar.h ## end gnulib module mbchar ## begin gnulib module mbiter libgl_la_SOURCES += mbiter.h mbiter.c ## end gnulib module mbiter ## begin gnulib module mbrtowc EXTRA_DIST += lc-charset-dispatch.c lc-charset-dispatch.h mbrtowc-impl-utf8.h mbrtowc-impl.h mbrtowc.c mbtowc-lock.c mbtowc-lock.h windows-initguard.h EXTRA_libgl_la_SOURCES += lc-charset-dispatch.c mbrtowc.c mbtowc-lock.c ## end gnulib module mbrtowc ## begin gnulib module mbsinit EXTRA_DIST += mbsinit.c EXTRA_libgl_la_SOURCES += mbsinit.c ## end gnulib module mbsinit ## begin gnulib module mbtowc EXTRA_DIST += mbtowc-impl.h mbtowc.c EXTRA_libgl_la_SOURCES += mbtowc.c ## end gnulib module mbtowc ## begin gnulib module memcasecmp libgl_la_SOURCES += memcasecmp.c EXTRA_DIST += memcasecmp.h ## end gnulib module memcasecmp ## begin gnulib module memchr EXTRA_DIST += memchr.c memchr.valgrind EXTRA_libgl_la_SOURCES += memchr.c ## end gnulib module memchr ## begin gnulib module memchr2 libgl_la_SOURCES += memchr2.h memchr2.c EXTRA_DIST += memchr2.valgrind ## end gnulib module memchr2 ## begin gnulib module memmem-simple EXTRA_DIST += memmem.c str-two-way.h EXTRA_libgl_la_SOURCES += memmem.c ## end gnulib module memmem-simple ## begin gnulib module mempcpy EXTRA_DIST += mempcpy.c EXTRA_libgl_la_SOURCES += mempcpy.c ## end gnulib module mempcpy ## begin gnulib module memrchr EXTRA_DIST += memrchr.c EXTRA_libgl_la_SOURCES += memrchr.c ## end gnulib module memrchr ## begin gnulib module minmax libgl_la_SOURCES += minmax.h ## end gnulib module minmax ## begin gnulib module mkdir EXTRA_DIST += mkdir.c EXTRA_libgl_la_SOURCES += mkdir.c ## end gnulib module mkdir ## begin gnulib module mkdtemp EXTRA_DIST += mkdtemp.c EXTRA_libgl_la_SOURCES += mkdtemp.c ## end gnulib module mkdtemp ## begin gnulib module mkstemp EXTRA_DIST += mkstemp.c EXTRA_libgl_la_SOURCES += mkstemp.c ## end gnulib module mkstemp ## begin gnulib module mktime EXTRA_DIST += mktime-internal.h mktime.c EXTRA_libgl_la_SOURCES += mktime.c ## end gnulib module mktime ## begin gnulib module mktime-internal EXTRA_DIST += mktime-internal.h mktime.c EXTRA_libgl_la_SOURCES += mktime.c ## end gnulib module mktime-internal ## begin gnulib module msvc-inval EXTRA_DIST += msvc-inval.c msvc-inval.h EXTRA_libgl_la_SOURCES += msvc-inval.c ## end gnulib module msvc-inval ## begin gnulib module msvc-nothrow EXTRA_DIST += msvc-nothrow.c msvc-nothrow.h EXTRA_libgl_la_SOURCES += msvc-nothrow.c ## end gnulib module msvc-nothrow ## begin gnulib module nl_langinfo EXTRA_DIST += nl_langinfo.c EXTRA_libgl_la_SOURCES += nl_langinfo.c ## end gnulib module nl_langinfo ## begin gnulib module nstrftime libgl_la_SOURCES += nstrftime.c EXTRA_DIST += strftime.h ## end gnulib module nstrftime ## begin gnulib module open EXTRA_DIST += open.c EXTRA_libgl_la_SOURCES += open.c ## end gnulib module open ## begin gnulib module pathmax EXTRA_DIST += pathmax.h ## end gnulib module pathmax ## begin gnulib module pipe2 libgl_la_SOURCES += pipe2.c ## end gnulib module pipe2 ## begin gnulib module printf-frexp libgl_la_SOURCES += printf-frexp.c EXTRA_DIST += printf-frexp.h ## end gnulib module printf-frexp ## begin gnulib module printf-frexpl libgl_la_SOURCES += printf-frexpl.c EXTRA_DIST += printf-frexp.c printf-frexpl.h EXTRA_libgl_la_SOURCES += printf-frexp.c ## end gnulib module printf-frexpl ## begin gnulib module printf-posix EXTRA_DIST += printf.c EXTRA_libgl_la_SOURCES += printf.c ## end gnulib module printf-posix ## begin gnulib module progname libgl_la_SOURCES += progname.h progname.c ## end gnulib module progname ## begin gnulib module raise EXTRA_DIST += raise.c EXTRA_libgl_la_SOURCES += raise.c ## end gnulib module raise ## begin gnulib module rawmemchr EXTRA_DIST += rawmemchr.c rawmemchr.valgrind EXTRA_libgl_la_SOURCES += rawmemchr.c ## end gnulib module rawmemchr ## begin gnulib module read EXTRA_DIST += read.c EXTRA_libgl_la_SOURCES += read.c ## end gnulib module read ## begin gnulib module read-file libgl_la_SOURCES += read-file.c EXTRA_DIST += read-file.h ## end gnulib module read-file ## begin gnulib module readlink EXTRA_DIST += readlink.c EXTRA_libgl_la_SOURCES += readlink.c ## end gnulib module readlink ## begin gnulib module realloc-posix EXTRA_DIST += realloc.c EXTRA_libgl_la_SOURCES += realloc.c ## end gnulib module realloc-posix ## begin gnulib module regex EXTRA_DIST += regcomp.c regex.c regex.h regex_internal.c regex_internal.h regexec.c EXTRA_libgl_la_SOURCES += regcomp.c regex.c regex_internal.c regexec.c ## end gnulib module regex ## begin gnulib module relocatable-prog DEFS += -DEXEEXT=\"@EXEEXT@\" if RELOCATABLE_VIA_WRAPPER uninstall-hook: uninstall-relocwrapper uninstall-relocwrapper: if test $(RELOCATABLE) = yes; then \ case '$(EXEEXT)' in \ .bin*) ;; \ *) cd $(top_builddir) && \ $(MAKE) $(AM_MAKEFLAGS) EXEEXT=.bin$(EXEEXT) \ AM_MAKEFLAGS='$(AM_MAKEFLAGS) EXEEXT=.bin$(EXEEXT)' \ uninstall ;; \ esac; \ fi endif ## Automake warns about conditionally added dependencies to unconditionally defined targets. .PHONY: uninstall-relocwrapper EXTRA_DIST += progreloc.c relocatable.c relocatable.h EXTRA_libgl_la_SOURCES += progreloc.c relocatable.c EXTRA_DIST += $(top_srcdir)/build-aux/config.libpath $(top_srcdir)/build-aux/reloc-ldflags $(top_srcdir)/build-aux/libtool-reloc ## end gnulib module relocatable-prog ## begin gnulib module relocatable-prog-wrapper EXTRA_DIST += allocator.c allocator.h areadlink.c areadlink.h c-ctype.c c-ctype.h canonicalize-lgpl.c careadlinkat.c careadlinkat.h lstat.c malloca.c malloca.h progname.c progname.h progreloc.c readlink.c relocatable.c relocatable.h relocwrapper.c setenv.c stat.c EXTRA_DIST += $(top_srcdir)/build-aux/install-reloc ## end gnulib module relocatable-prog-wrapper ## begin gnulib module rename EXTRA_DIST += rename.c EXTRA_libgl_la_SOURCES += rename.c ## end gnulib module rename ## begin gnulib module rmdir EXTRA_DIST += rmdir.c EXTRA_libgl_la_SOURCES += rmdir.c ## end gnulib module rmdir ## begin gnulib module round EXTRA_DIST += round.c EXTRA_libgl_la_SOURCES += round.c ## end gnulib module round ## begin gnulib module safe-read libgl_la_SOURCES += safe-read.c EXTRA_DIST += safe-read.h sys-limits.h ## end gnulib module safe-read ## begin gnulib module safe-write libgl_la_SOURCES += safe-write.c EXTRA_DIST += safe-read.c safe-write.h sys-limits.h EXTRA_libgl_la_SOURCES += safe-read.c ## end gnulib module safe-write ## begin gnulib module same-inode EXTRA_DIST += same-inode.h ## end gnulib module same-inode ## begin gnulib module secure_getenv EXTRA_DIST += secure_getenv.c EXTRA_libgl_la_SOURCES += secure_getenv.c ## end gnulib module secure_getenv ## begin gnulib module select EXTRA_DIST += select.c EXTRA_libgl_la_SOURCES += select.c ## end gnulib module select ## begin gnulib module setenv EXTRA_DIST += setenv.c EXTRA_libgl_la_SOURCES += setenv.c ## end gnulib module setenv ## begin gnulib module setlocale-null libgl_la_SOURCES += setlocale_null.c EXTRA_DIST += setlocale-lock.c setlocale_null.h windows-initguard.h EXTRA_libgl_la_SOURCES += setlocale-lock.c ## end gnulib module setlocale-null ## begin gnulib module sigaction libgl_la_SOURCES += sig-handler.c EXTRA_DIST += sig-handler.h sigaction.c EXTRA_libgl_la_SOURCES += sigaction.c ## end gnulib module sigaction ## begin gnulib module signal-h BUILT_SOURCES += signal.h # We need the following in order to create when the system # doesn't have a complete one. signal.h: signal.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(ARG_NONNULL_H) $(WARN_ON_USE_H) $(AM_V_GEN)rm -f $@-t $@ && \ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */' && \ sed -e 's|@''GUARD_PREFIX''@|GL|g' \ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \ -e 's|@''NEXT_SIGNAL_H''@|$(NEXT_SIGNAL_H)|g' \ -e 's/@''GNULIB_PTHREAD_SIGMASK''@/$(GNULIB_PTHREAD_SIGMASK)/g' \ -e 's/@''GNULIB_RAISE''@/$(GNULIB_RAISE)/g' \ -e 's/@''GNULIB_SIGNAL_H_SIGPIPE''@/$(GNULIB_SIGNAL_H_SIGPIPE)/g' \ -e 's/@''GNULIB_SIGPROCMASK''@/$(GNULIB_SIGPROCMASK)/g' \ -e 's/@''GNULIB_SIGACTION''@/$(GNULIB_SIGACTION)/g' \ -e 's|@''HAVE_POSIX_SIGNALBLOCKING''@|$(HAVE_POSIX_SIGNALBLOCKING)|g' \ -e 's|@''HAVE_PTHREAD_SIGMASK''@|$(HAVE_PTHREAD_SIGMASK)|g' \ -e 's|@''HAVE_RAISE''@|$(HAVE_RAISE)|g' \ -e 's|@''HAVE_SIGSET_T''@|$(HAVE_SIGSET_T)|g' \ -e 's|@''HAVE_SIGINFO_T''@|$(HAVE_SIGINFO_T)|g' \ -e 's|@''HAVE_SIGACTION''@|$(HAVE_SIGACTION)|g' \ -e 's|@''HAVE_STRUCT_SIGACTION_SA_SIGACTION''@|$(HAVE_STRUCT_SIGACTION_SA_SIGACTION)|g' \ -e 's|@''HAVE_TYPE_VOLATILE_SIG_ATOMIC_T''@|$(HAVE_TYPE_VOLATILE_SIG_ATOMIC_T)|g' \ -e 's|@''HAVE_SIGHANDLER_T''@|$(HAVE_SIGHANDLER_T)|g' \ -e 's|@''REPLACE_PTHREAD_SIGMASK''@|$(REPLACE_PTHREAD_SIGMASK)|g' \ -e 's|@''REPLACE_RAISE''@|$(REPLACE_RAISE)|g' \ -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \ -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \ -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \ < $(srcdir)/signal.in.h; \ } > $@-t && \ mv $@-t $@ MOSTLYCLEANFILES += signal.h signal.h-t EXTRA_DIST += signal.in.h ## end gnulib module signal-h ## begin gnulib module signbit EXTRA_DIST += float+.h signbitd.c signbitf.c signbitl.c EXTRA_libgl_la_SOURCES += signbitd.c signbitf.c signbitl.c ## end gnulib module signbit ## begin gnulib module sigprocmask EXTRA_DIST += sigprocmask.c EXTRA_libgl_la_SOURCES += sigprocmask.c ## end gnulib module sigprocmask ## begin gnulib module size_max libgl_la_SOURCES += size_max.h ## end gnulib module size_max ## begin gnulib module snippet/_Noreturn # Because this Makefile snippet defines a variable used by other # gnulib Makefile snippets, it must be present in all makefiles that # need it. This is ensured by the applicability 'all' defined above. _NORETURN_H=$(srcdir)/_Noreturn.h EXTRA_DIST += _Noreturn.h ## end gnulib module snippet/_Noreturn ## begin gnulib module snippet/arg-nonnull # Because this Makefile snippet defines a variable used by other # gnulib Makefile snippets, it must be present in all makefiles that # need it. This is ensured by the applicability 'all' defined above. ARG_NONNULL_H=$(srcdir)/arg-nonnull.h EXTRA_DIST += arg-nonnull.h ## end gnulib module snippet/arg-nonnull ## begin gnulib module snippet/c++defs # Because this Makefile snippet defines a variable used by other # gnulib Makefile snippets, it must be present in all makefiles that # need it. This is ensured by the applicability 'all' defined above. CXXDEFS_H=$(srcdir)/c++defs.h EXTRA_DIST += c++defs.h ## end gnulib module snippet/c++defs ## begin gnulib module snippet/unused-parameter # Because this Makefile snippet defines a variable used by other # gnulib Makefile snippets, it must be present in all makefiles that # need it. This is ensured by the applicability 'all' defined above. UNUSED_PARAMETER_H=$(srcdir)/unused-parameter.h EXTRA_DIST += unused-parameter.h ## end gnulib module snippet/unused-parameter ## begin gnulib module snippet/warn-on-use # Because this Makefile snippet defines a variable used by other # gnulib Makefile snippets, it must be present in all makefiles that # need it. This is ensured by the applicability 'all' defined above. WARN_ON_USE_H=$(srcdir)/warn-on-use.h EXTRA_DIST += warn-on-use.h ## end gnulib module snippet/warn-on-use ## begin gnulib module snprintf EXTRA_DIST += snprintf.c EXTRA_libgl_la_SOURCES += snprintf.c ## end gnulib module snprintf ## begin gnulib module sockets libgl_la_SOURCES += sockets.h sockets.c EXTRA_DIST += w32sock.h ## end gnulib module sockets ## begin gnulib module sprintf-posix EXTRA_DIST += sprintf.c EXTRA_libgl_la_SOURCES += sprintf.c ## end gnulib module sprintf-posix ## begin gnulib module stat EXTRA_DIST += stat-w32.c stat-w32.h stat.c EXTRA_libgl_la_SOURCES += stat-w32.c stat.c ## end gnulib module stat ## begin gnulib module stat-time libgl_la_SOURCES += stat-time.c EXTRA_DIST += stat-time.h ## end gnulib module stat-time ## begin gnulib module stdalign BUILT_SOURCES += $(STDALIGN_H) # We need the following in order to create when the system # doesn't have one that works. if GL_GENERATE_STDALIGN_H stdalign.h: stdalign.in.h $(top_builddir)/config.status $(AM_V_GEN)rm -f $@-t $@ && \ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \ cat $(srcdir)/stdalign.in.h; \ } > $@-t && \ mv $@-t $@ else stdalign.h: $(top_builddir)/config.status rm -f $@ endif MOSTLYCLEANFILES += stdalign.h stdalign.h-t EXTRA_DIST += stdalign.in.h ## end gnulib module stdalign ## begin gnulib module stdarg BUILT_SOURCES += $(STDARG_H) # We need the following in order to create when the system # doesn't have one that works with the given compiler. if GL_GENERATE_STDARG_H stdarg.h: stdarg.in.h $(top_builddir)/config.status $(AM_V_GEN)rm -f $@-t $@ && \ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */' && \ sed -e 's|@''GUARD_PREFIX''@|GL|g' \ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \ -e 's|@''NEXT_STDARG_H''@|$(NEXT_STDARG_H)|g' \ < $(srcdir)/stdarg.in.h; \ } > $@-t && \ mv $@-t $@ else stdarg.h: $(top_builddir)/config.status rm -f $@ endif MOSTLYCLEANFILES += stdarg.h stdarg.h-t EXTRA_DIST += stdarg.in.h ## end gnulib module stdarg ## begin gnulib module stdbool BUILT_SOURCES += $(STDBOOL_H) # We need the following in order to create when the system # doesn't have one that works. if GL_GENERATE_STDBOOL_H stdbool.h: stdbool.in.h $(top_builddir)/config.status $(AM_V_GEN)rm -f $@-t $@ && \ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \ sed -e 's/@''HAVE__BOOL''@/$(HAVE__BOOL)/g' < $(srcdir)/stdbool.in.h; \ } > $@-t && \ mv $@-t $@ else stdbool.h: $(top_builddir)/config.status rm -f $@ endif MOSTLYCLEANFILES += stdbool.h stdbool.h-t EXTRA_DIST += stdbool.in.h ## end gnulib module stdbool ## begin gnulib module stddef BUILT_SOURCES += $(STDDEF_H) # We need the following in order to create when the system # doesn't have one that works with the given compiler. if GL_GENERATE_STDDEF_H stddef.h: stddef.in.h $(top_builddir)/config.status $(AM_V_GEN)rm -f $@-t $@ && \ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */' && \ sed -e 's|@''GUARD_PREFIX''@|GL|g' \ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \ -e 's|@''NEXT_STDDEF_H''@|$(NEXT_STDDEF_H)|g' \ -e 's|@''HAVE_MAX_ALIGN_T''@|$(HAVE_MAX_ALIGN_T)|g' \ -e 's|@''HAVE_WCHAR_T''@|$(HAVE_WCHAR_T)|g' \ -e 's|@''REPLACE_NULL''@|$(REPLACE_NULL)|g' \ < $(srcdir)/stddef.in.h; \ } > $@-t && \ mv $@-t $@ else stddef.h: $(top_builddir)/config.status rm -f $@ endif MOSTLYCLEANFILES += stddef.h stddef.h-t EXTRA_DIST += stddef.in.h ## end gnulib module stddef ## begin gnulib module stdint BUILT_SOURCES += $(STDINT_H) # We need the following in order to create when the system # doesn't have one that works with the given compiler. if GL_GENERATE_STDINT_H stdint.h: stdint.in.h $(top_builddir)/config.status $(AM_V_GEN)rm -f $@-t $@ && \ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \ sed -e 's|@''GUARD_PREFIX''@|GL|g' \ -e 's/@''HAVE_STDINT_H''@/$(HAVE_STDINT_H)/g' \ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \ -e 's|@''NEXT_STDINT_H''@|$(NEXT_STDINT_H)|g' \ -e 's/@''HAVE_C99_STDINT_H''@/$(HAVE_C99_STDINT_H)/g' \ -e 's/@''HAVE_SYS_TYPES_H''@/$(HAVE_SYS_TYPES_H)/g' \ -e 's/@''HAVE_INTTYPES_H''@/$(HAVE_INTTYPES_H)/g' \ -e 's/@''HAVE_SYS_INTTYPES_H''@/$(HAVE_SYS_INTTYPES_H)/g' \ -e 's/@''HAVE_SYS_BITYPES_H''@/$(HAVE_SYS_BITYPES_H)/g' \ -e 's/@''HAVE_WCHAR_H''@/$(HAVE_WCHAR_H)/g' \ -e 's/@''APPLE_UNIVERSAL_BUILD''@/$(APPLE_UNIVERSAL_BUILD)/g' \ -e 's/@''BITSIZEOF_PTRDIFF_T''@/$(BITSIZEOF_PTRDIFF_T)/g' \ -e 's/@''PTRDIFF_T_SUFFIX''@/$(PTRDIFF_T_SUFFIX)/g' \ -e 's/@''BITSIZEOF_SIG_ATOMIC_T''@/$(BITSIZEOF_SIG_ATOMIC_T)/g' \ -e 's/@''HAVE_SIGNED_SIG_ATOMIC_T''@/$(HAVE_SIGNED_SIG_ATOMIC_T)/g' \ -e 's/@''SIG_ATOMIC_T_SUFFIX''@/$(SIG_ATOMIC_T_SUFFIX)/g' \ -e 's/@''BITSIZEOF_SIZE_T''@/$(BITSIZEOF_SIZE_T)/g' \ -e 's/@''SIZE_T_SUFFIX''@/$(SIZE_T_SUFFIX)/g' \ -e 's/@''BITSIZEOF_WCHAR_T''@/$(BITSIZEOF_WCHAR_T)/g' \ -e 's/@''HAVE_SIGNED_WCHAR_T''@/$(HAVE_SIGNED_WCHAR_T)/g' \ -e 's/@''WCHAR_T_SUFFIX''@/$(WCHAR_T_SUFFIX)/g' \ -e 's/@''BITSIZEOF_WINT_T''@/$(BITSIZEOF_WINT_T)/g' \ -e 's/@''HAVE_SIGNED_WINT_T''@/$(HAVE_SIGNED_WINT_T)/g' \ -e 's/@''WINT_T_SUFFIX''@/$(WINT_T_SUFFIX)/g' \ -e 's/@''GNULIB_OVERRIDES_WINT_T''@/$(GNULIB_OVERRIDES_WINT_T)/g' \ < $(srcdir)/stdint.in.h; \ } > $@-t && \ mv $@-t $@ else stdint.h: $(top_builddir)/config.status rm -f $@ endif MOSTLYCLEANFILES += stdint.h stdint.h-t EXTRA_DIST += stdint.in.h ## end gnulib module stdint ## begin gnulib module stdio BUILT_SOURCES += stdio.h # We need the following in order to create when the system # doesn't have one that works with the given compiler. stdio.h: stdio.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(ARG_NONNULL_H) $(WARN_ON_USE_H) $(AM_V_GEN)rm -f $@-t $@ && \ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */' && \ sed -e 's|@''GUARD_PREFIX''@|GL|g' \ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \ -e 's|@''NEXT_STDIO_H''@|$(NEXT_STDIO_H)|g' \ -e 's/@''GNULIB_DPRINTF''@/$(GNULIB_DPRINTF)/g' \ -e 's/@''GNULIB_FCLOSE''@/$(GNULIB_FCLOSE)/g' \ -e 's/@''GNULIB_FDOPEN''@/$(GNULIB_FDOPEN)/g' \ -e 's/@''GNULIB_FFLUSH''@/$(GNULIB_FFLUSH)/g' \ -e 's/@''GNULIB_FGETC''@/$(GNULIB_FGETC)/g' \ -e 's/@''GNULIB_FGETS''@/$(GNULIB_FGETS)/g' \ -e 's/@''GNULIB_FOPEN''@/$(GNULIB_FOPEN)/g' \ -e 's/@''GNULIB_FPRINTF''@/$(GNULIB_FPRINTF)/g' \ -e 's/@''GNULIB_FPRINTF_POSIX''@/$(GNULIB_FPRINTF_POSIX)/g' \ -e 's/@''GNULIB_FPURGE''@/$(GNULIB_FPURGE)/g' \ -e 's/@''GNULIB_FPUTC''@/$(GNULIB_FPUTC)/g' \ -e 's/@''GNULIB_FPUTS''@/$(GNULIB_FPUTS)/g' \ -e 's/@''GNULIB_FREAD''@/$(GNULIB_FREAD)/g' \ -e 's/@''GNULIB_FREOPEN''@/$(GNULIB_FREOPEN)/g' \ -e 's/@''GNULIB_FSCANF''@/$(GNULIB_FSCANF)/g' \ -e 's/@''GNULIB_FSEEK''@/$(GNULIB_FSEEK)/g' \ -e 's/@''GNULIB_FSEEKO''@/$(GNULIB_FSEEKO)/g' \ -e 's/@''GNULIB_FTELL''@/$(GNULIB_FTELL)/g' \ -e 's/@''GNULIB_FTELLO''@/$(GNULIB_FTELLO)/g' \ -e 's/@''GNULIB_FWRITE''@/$(GNULIB_FWRITE)/g' \ -e 's/@''GNULIB_GETC''@/$(GNULIB_GETC)/g' \ -e 's/@''GNULIB_GETCHAR''@/$(GNULIB_GETCHAR)/g' \ -e 's/@''GNULIB_GETDELIM''@/$(GNULIB_GETDELIM)/g' \ -e 's/@''GNULIB_GETLINE''@/$(GNULIB_GETLINE)/g' \ -e 's/@''GNULIB_OBSTACK_PRINTF''@/$(GNULIB_OBSTACK_PRINTF)/g' \ -e 's/@''GNULIB_OBSTACK_PRINTF_POSIX''@/$(GNULIB_OBSTACK_PRINTF_POSIX)/g' \ -e 's/@''GNULIB_PCLOSE''@/$(GNULIB_PCLOSE)/g' \ -e 's/@''GNULIB_PERROR''@/$(GNULIB_PERROR)/g' \ -e 's/@''GNULIB_POPEN''@/$(GNULIB_POPEN)/g' \ -e 's/@''GNULIB_PRINTF''@/$(GNULIB_PRINTF)/g' \ -e 's/@''GNULIB_PRINTF_POSIX''@/$(GNULIB_PRINTF_POSIX)/g' \ -e 's/@''GNULIB_PUTC''@/$(GNULIB_PUTC)/g' \ -e 's/@''GNULIB_PUTCHAR''@/$(GNULIB_PUTCHAR)/g' \ -e 's/@''GNULIB_PUTS''@/$(GNULIB_PUTS)/g' \ -e 's/@''GNULIB_REMOVE''@/$(GNULIB_REMOVE)/g' \ -e 's/@''GNULIB_RENAME''@/$(GNULIB_RENAME)/g' \ -e 's/@''GNULIB_RENAMEAT''@/$(GNULIB_RENAMEAT)/g' \ -e 's/@''GNULIB_SCANF''@/$(GNULIB_SCANF)/g' \ -e 's/@''GNULIB_SNPRINTF''@/$(GNULIB_SNPRINTF)/g' \ -e 's/@''GNULIB_SPRINTF_POSIX''@/$(GNULIB_SPRINTF_POSIX)/g' \ -e 's/@''GNULIB_STDIO_H_NONBLOCKING''@/$(GNULIB_STDIO_H_NONBLOCKING)/g' \ -e 's/@''GNULIB_STDIO_H_SIGPIPE''@/$(GNULIB_STDIO_H_SIGPIPE)/g' \ -e 's/@''GNULIB_TMPFILE''@/$(GNULIB_TMPFILE)/g' \ -e 's/@''GNULIB_VASPRINTF''@/$(GNULIB_VASPRINTF)/g' \ -e 's/@''GNULIB_VDPRINTF''@/$(GNULIB_VDPRINTF)/g' \ -e 's/@''GNULIB_VFPRINTF''@/$(GNULIB_VFPRINTF)/g' \ -e 's/@''GNULIB_VFPRINTF_POSIX''@/$(GNULIB_VFPRINTF_POSIX)/g' \ -e 's/@''GNULIB_VFSCANF''@/$(GNULIB_VFSCANF)/g' \ -e 's/@''GNULIB_VSCANF''@/$(GNULIB_VSCANF)/g' \ -e 's/@''GNULIB_VPRINTF''@/$(GNULIB_VPRINTF)/g' \ -e 's/@''GNULIB_VPRINTF_POSIX''@/$(GNULIB_VPRINTF_POSIX)/g' \ -e 's/@''GNULIB_VSNPRINTF''@/$(GNULIB_VSNPRINTF)/g' \ -e 's/@''GNULIB_VSPRINTF_POSIX''@/$(GNULIB_VSPRINTF_POSIX)/g' \ < $(srcdir)/stdio.in.h | \ sed -e 's|@''HAVE_DECL_FPURGE''@|$(HAVE_DECL_FPURGE)|g' \ -e 's|@''HAVE_DECL_FSEEKO''@|$(HAVE_DECL_FSEEKO)|g' \ -e 's|@''HAVE_DECL_FTELLO''@|$(HAVE_DECL_FTELLO)|g' \ -e 's|@''HAVE_DECL_GETDELIM''@|$(HAVE_DECL_GETDELIM)|g' \ -e 's|@''HAVE_DECL_GETLINE''@|$(HAVE_DECL_GETLINE)|g' \ -e 's|@''HAVE_DECL_OBSTACK_PRINTF''@|$(HAVE_DECL_OBSTACK_PRINTF)|g' \ -e 's|@''HAVE_DECL_SNPRINTF''@|$(HAVE_DECL_SNPRINTF)|g' \ -e 's|@''HAVE_DECL_VSNPRINTF''@|$(HAVE_DECL_VSNPRINTF)|g' \ -e 's|@''HAVE_DPRINTF''@|$(HAVE_DPRINTF)|g' \ -e 's|@''HAVE_FSEEKO''@|$(HAVE_FSEEKO)|g' \ -e 's|@''HAVE_FTELLO''@|$(HAVE_FTELLO)|g' \ -e 's|@''HAVE_PCLOSE''@|$(HAVE_PCLOSE)|g' \ -e 's|@''HAVE_POPEN''@|$(HAVE_POPEN)|g' \ -e 's|@''HAVE_RENAMEAT''@|$(HAVE_RENAMEAT)|g' \ -e 's|@''HAVE_VASPRINTF''@|$(HAVE_VASPRINTF)|g' \ -e 's|@''HAVE_VDPRINTF''@|$(HAVE_VDPRINTF)|g' \ -e 's|@''REPLACE_DPRINTF''@|$(REPLACE_DPRINTF)|g' \ -e 's|@''REPLACE_FCLOSE''@|$(REPLACE_FCLOSE)|g' \ -e 's|@''REPLACE_FDOPEN''@|$(REPLACE_FDOPEN)|g' \ -e 's|@''REPLACE_FFLUSH''@|$(REPLACE_FFLUSH)|g' \ -e 's|@''REPLACE_FOPEN''@|$(REPLACE_FOPEN)|g' \ -e 's|@''REPLACE_FPRINTF''@|$(REPLACE_FPRINTF)|g' \ -e 's|@''REPLACE_FPURGE''@|$(REPLACE_FPURGE)|g' \ -e 's|@''REPLACE_FREOPEN''@|$(REPLACE_FREOPEN)|g' \ -e 's|@''REPLACE_FSEEK''@|$(REPLACE_FSEEK)|g' \ -e 's|@''REPLACE_FSEEKO''@|$(REPLACE_FSEEKO)|g' \ -e 's|@''REPLACE_FTELL''@|$(REPLACE_FTELL)|g' \ -e 's|@''REPLACE_FTELLO''@|$(REPLACE_FTELLO)|g' \ -e 's|@''REPLACE_GETDELIM''@|$(REPLACE_GETDELIM)|g' \ -e 's|@''REPLACE_GETLINE''@|$(REPLACE_GETLINE)|g' \ -e 's|@''REPLACE_OBSTACK_PRINTF''@|$(REPLACE_OBSTACK_PRINTF)|g' \ -e 's|@''REPLACE_PERROR''@|$(REPLACE_PERROR)|g' \ -e 's|@''REPLACE_POPEN''@|$(REPLACE_POPEN)|g' \ -e 's|@''REPLACE_PRINTF''@|$(REPLACE_PRINTF)|g' \ -e 's|@''REPLACE_REMOVE''@|$(REPLACE_REMOVE)|g' \ -e 's|@''REPLACE_RENAME''@|$(REPLACE_RENAME)|g' \ -e 's|@''REPLACE_RENAMEAT''@|$(REPLACE_RENAMEAT)|g' \ -e 's|@''REPLACE_SNPRINTF''@|$(REPLACE_SNPRINTF)|g' \ -e 's|@''REPLACE_SPRINTF''@|$(REPLACE_SPRINTF)|g' \ -e 's|@''REPLACE_STDIO_READ_FUNCS''@|$(REPLACE_STDIO_READ_FUNCS)|g' \ -e 's|@''REPLACE_STDIO_WRITE_FUNCS''@|$(REPLACE_STDIO_WRITE_FUNCS)|g' \ -e 's|@''REPLACE_TMPFILE''@|$(REPLACE_TMPFILE)|g' \ -e 's|@''REPLACE_VASPRINTF''@|$(REPLACE_VASPRINTF)|g' \ -e 's|@''REPLACE_VDPRINTF''@|$(REPLACE_VDPRINTF)|g' \ -e 's|@''REPLACE_VFPRINTF''@|$(REPLACE_VFPRINTF)|g' \ -e 's|@''REPLACE_VPRINTF''@|$(REPLACE_VPRINTF)|g' \ -e 's|@''REPLACE_VSNPRINTF''@|$(REPLACE_VSNPRINTF)|g' \ -e 's|@''REPLACE_VSPRINTF''@|$(REPLACE_VSPRINTF)|g' \ -e 's|@''ASM_SYMBOL_PREFIX''@|$(ASM_SYMBOL_PREFIX)|g' \ -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \ -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \ -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)'; \ } > $@-t && \ mv $@-t $@ MOSTLYCLEANFILES += stdio.h stdio.h-t EXTRA_DIST += stdio.in.h ## end gnulib module stdio ## begin gnulib module stdlib BUILT_SOURCES += stdlib.h # We need the following in order to create when the system # doesn't have one that works with the given compiler. stdlib.h: stdlib.in.h $(top_builddir)/config.status $(CXXDEFS_H) \ $(_NORETURN_H) $(ARG_NONNULL_H) $(WARN_ON_USE_H) $(AM_V_GEN)rm -f $@-t $@ && \ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */' && \ sed -e 's|@''GUARD_PREFIX''@|GL|g' \ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \ -e 's|@''NEXT_STDLIB_H''@|$(NEXT_STDLIB_H)|g' \ -e 's/@''GNULIB__EXIT''@/$(GNULIB__EXIT)/g' \ -e 's/@''GNULIB_ATOLL''@/$(GNULIB_ATOLL)/g' \ -e 's/@''GNULIB_CALLOC_POSIX''@/$(GNULIB_CALLOC_POSIX)/g' \ -e 's/@''GNULIB_CANONICALIZE_FILE_NAME''@/$(GNULIB_CANONICALIZE_FILE_NAME)/g' \ -e 's/@''GNULIB_GETLOADAVG''@/$(GNULIB_GETLOADAVG)/g' \ -e 's/@''GNULIB_GETSUBOPT''@/$(GNULIB_GETSUBOPT)/g' \ -e 's/@''GNULIB_GRANTPT''@/$(GNULIB_GRANTPT)/g' \ -e 's/@''GNULIB_MALLOC_POSIX''@/$(GNULIB_MALLOC_POSIX)/g' \ -e 's/@''GNULIB_MBTOWC''@/$(GNULIB_MBTOWC)/g' \ -e 's/@''GNULIB_MKDTEMP''@/$(GNULIB_MKDTEMP)/g' \ -e 's/@''GNULIB_MKOSTEMP''@/$(GNULIB_MKOSTEMP)/g' \ -e 's/@''GNULIB_MKOSTEMPS''@/$(GNULIB_MKOSTEMPS)/g' \ -e 's/@''GNULIB_MKSTEMP''@/$(GNULIB_MKSTEMP)/g' \ -e 's/@''GNULIB_MKSTEMPS''@/$(GNULIB_MKSTEMPS)/g' \ -e 's/@''GNULIB_POSIX_OPENPT''@/$(GNULIB_POSIX_OPENPT)/g' \ -e 's/@''GNULIB_PTSNAME''@/$(GNULIB_PTSNAME)/g' \ -e 's/@''GNULIB_PTSNAME_R''@/$(GNULIB_PTSNAME_R)/g' \ -e 's/@''GNULIB_PUTENV''@/$(GNULIB_PUTENV)/g' \ -e 's/@''GNULIB_QSORT_R''@/$(GNULIB_QSORT_R)/g' \ -e 's/@''GNULIB_RANDOM''@/$(GNULIB_RANDOM)/g' \ -e 's/@''GNULIB_RANDOM_R''@/$(GNULIB_RANDOM_R)/g' \ -e 's/@''GNULIB_REALLOC_POSIX''@/$(GNULIB_REALLOC_POSIX)/g' \ -e 's/@''GNULIB_REALLOCARRAY''@/$(GNULIB_REALLOCARRAY)/g' \ -e 's/@''GNULIB_REALPATH''@/$(GNULIB_REALPATH)/g' \ -e 's/@''GNULIB_RPMATCH''@/$(GNULIB_RPMATCH)/g' \ -e 's/@''GNULIB_SECURE_GETENV''@/$(GNULIB_SECURE_GETENV)/g' \ -e 's/@''GNULIB_SETENV''@/$(GNULIB_SETENV)/g' \ -e 's/@''GNULIB_STRTOD''@/$(GNULIB_STRTOD)/g' \ -e 's/@''GNULIB_STRTOLD''@/$(GNULIB_STRTOLD)/g' \ -e 's/@''GNULIB_STRTOLL''@/$(GNULIB_STRTOLL)/g' \ -e 's/@''GNULIB_STRTOULL''@/$(GNULIB_STRTOULL)/g' \ -e 's/@''GNULIB_SYSTEM_POSIX''@/$(GNULIB_SYSTEM_POSIX)/g' \ -e 's/@''GNULIB_UNLOCKPT''@/$(GNULIB_UNLOCKPT)/g' \ -e 's/@''GNULIB_UNSETENV''@/$(GNULIB_UNSETENV)/g' \ -e 's/@''GNULIB_WCTOMB''@/$(GNULIB_WCTOMB)/g' \ < $(srcdir)/stdlib.in.h | \ sed -e 's|@''HAVE__EXIT''@|$(HAVE__EXIT)|g' \ -e 's|@''HAVE_ATOLL''@|$(HAVE_ATOLL)|g' \ -e 's|@''HAVE_CANONICALIZE_FILE_NAME''@|$(HAVE_CANONICALIZE_FILE_NAME)|g' \ -e 's|@''HAVE_DECL_GETLOADAVG''@|$(HAVE_DECL_GETLOADAVG)|g' \ -e 's|@''HAVE_GETSUBOPT''@|$(HAVE_GETSUBOPT)|g' \ -e 's|@''HAVE_GRANTPT''@|$(HAVE_GRANTPT)|g' \ -e 's|@''HAVE_INITSTATE''@|$(HAVE_INITSTATE)|g' \ -e 's|@''HAVE_DECL_INITSTATE''@|$(HAVE_DECL_INITSTATE)|g' \ -e 's|@''HAVE_MBTOWC''@|$(HAVE_MBTOWC)|g' \ -e 's|@''HAVE_MKDTEMP''@|$(HAVE_MKDTEMP)|g' \ -e 's|@''HAVE_MKOSTEMP''@|$(HAVE_MKOSTEMP)|g' \ -e 's|@''HAVE_MKOSTEMPS''@|$(HAVE_MKOSTEMPS)|g' \ -e 's|@''HAVE_MKSTEMP''@|$(HAVE_MKSTEMP)|g' \ -e 's|@''HAVE_MKSTEMPS''@|$(HAVE_MKSTEMPS)|g' \ -e 's|@''HAVE_POSIX_OPENPT''@|$(HAVE_POSIX_OPENPT)|g' \ -e 's|@''HAVE_PTSNAME''@|$(HAVE_PTSNAME)|g' \ -e 's|@''HAVE_PTSNAME_R''@|$(HAVE_PTSNAME_R)|g' \ -e 's|@''HAVE_QSORT_R''@|$(HAVE_QSORT_R)|g' \ -e 's|@''HAVE_RANDOM''@|$(HAVE_RANDOM)|g' \ -e 's|@''HAVE_RANDOM_H''@|$(HAVE_RANDOM_H)|g' \ -e 's|@''HAVE_RANDOM_R''@|$(HAVE_RANDOM_R)|g' \ -e 's|@''HAVE_REALLOCARRAY''@|$(HAVE_REALLOCARRAY)|g' \ -e 's|@''HAVE_REALPATH''@|$(HAVE_REALPATH)|g' \ -e 's|@''HAVE_RPMATCH''@|$(HAVE_RPMATCH)|g' \ -e 's|@''HAVE_SECURE_GETENV''@|$(HAVE_SECURE_GETENV)|g' \ -e 's|@''HAVE_DECL_SETENV''@|$(HAVE_DECL_SETENV)|g' \ -e 's|@''HAVE_SETSTATE''@|$(HAVE_SETSTATE)|g' \ -e 's|@''HAVE_DECL_SETSTATE''@|$(HAVE_DECL_SETSTATE)|g' \ -e 's|@''HAVE_STRTOD''@|$(HAVE_STRTOD)|g' \ -e 's|@''HAVE_STRTOLD''@|$(HAVE_STRTOLD)|g' \ -e 's|@''HAVE_STRTOLL''@|$(HAVE_STRTOLL)|g' \ -e 's|@''HAVE_STRTOULL''@|$(HAVE_STRTOULL)|g' \ -e 's|@''HAVE_STRUCT_RANDOM_DATA''@|$(HAVE_STRUCT_RANDOM_DATA)|g' \ -e 's|@''HAVE_SYS_LOADAVG_H''@|$(HAVE_SYS_LOADAVG_H)|g' \ -e 's|@''HAVE_UNLOCKPT''@|$(HAVE_UNLOCKPT)|g' \ -e 's|@''HAVE_DECL_UNSETENV''@|$(HAVE_DECL_UNSETENV)|g' \ -e 's|@''REPLACE_CALLOC''@|$(REPLACE_CALLOC)|g' \ -e 's|@''REPLACE_CANONICALIZE_FILE_NAME''@|$(REPLACE_CANONICALIZE_FILE_NAME)|g' \ -e 's|@''REPLACE_INITSTATE''@|$(REPLACE_INITSTATE)|g' \ -e 's|@''REPLACE_MALLOC''@|$(REPLACE_MALLOC)|g' \ -e 's|@''REPLACE_MBTOWC''@|$(REPLACE_MBTOWC)|g' \ -e 's|@''REPLACE_MKSTEMP''@|$(REPLACE_MKSTEMP)|g' \ -e 's|@''REPLACE_PTSNAME''@|$(REPLACE_PTSNAME)|g' \ -e 's|@''REPLACE_PTSNAME_R''@|$(REPLACE_PTSNAME_R)|g' \ -e 's|@''REPLACE_PUTENV''@|$(REPLACE_PUTENV)|g' \ -e 's|@''REPLACE_QSORT_R''@|$(REPLACE_QSORT_R)|g' \ -e 's|@''REPLACE_RANDOM''@|$(REPLACE_RANDOM)|g' \ -e 's|@''REPLACE_RANDOM_R''@|$(REPLACE_RANDOM_R)|g' \ -e 's|@''REPLACE_REALLOC''@|$(REPLACE_REALLOC)|g' \ -e 's|@''REPLACE_REALPATH''@|$(REPLACE_REALPATH)|g' \ -e 's|@''REPLACE_SETENV''@|$(REPLACE_SETENV)|g' \ -e 's|@''REPLACE_SETSTATE''@|$(REPLACE_SETSTATE)|g' \ -e 's|@''REPLACE_STRTOD''@|$(REPLACE_STRTOD)|g' \ -e 's|@''REPLACE_STRTOLD''@|$(REPLACE_STRTOLD)|g' \ -e 's|@''REPLACE_UNSETENV''@|$(REPLACE_UNSETENV)|g' \ -e 's|@''REPLACE_WCTOMB''@|$(REPLACE_WCTOMB)|g' \ -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \ -e '/definition of _Noreturn/r $(_NORETURN_H)' \ -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \ -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)'; \ } > $@-t && \ mv $@-t $@ MOSTLYCLEANFILES += stdlib.h stdlib.h-t EXTRA_DIST += stdlib.in.h ## end gnulib module stdlib ## begin gnulib module stpcpy EXTRA_DIST += stpcpy.c EXTRA_libgl_la_SOURCES += stpcpy.c ## end gnulib module stpcpy ## begin gnulib module strcase EXTRA_DIST += strcasecmp.c strncasecmp.c EXTRA_libgl_la_SOURCES += strcasecmp.c strncasecmp.c ## end gnulib module strcase ## begin gnulib module strcasestr-simple EXTRA_DIST += str-two-way.h strcasestr.c EXTRA_libgl_la_SOURCES += strcasestr.c ## end gnulib module strcasestr-simple ## begin gnulib module strdup-posix EXTRA_DIST += strdup.c EXTRA_libgl_la_SOURCES += strdup.c ## end gnulib module strdup-posix ## begin gnulib module streq EXTRA_DIST += streq.h ## end gnulib module streq ## begin gnulib module strerror EXTRA_DIST += strerror.c EXTRA_libgl_la_SOURCES += strerror.c ## end gnulib module strerror ## begin gnulib module strerror-override EXTRA_DIST += strerror-override.c strerror-override.h EXTRA_libgl_la_SOURCES += strerror-override.c ## end gnulib module strerror-override ## begin gnulib module string BUILT_SOURCES += string.h # We need the following in order to create when the system # doesn't have one that works with the given compiler. string.h: string.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(ARG_NONNULL_H) $(WARN_ON_USE_H) $(AM_V_GEN)rm -f $@-t $@ && \ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */' && \ sed -e 's|@''GUARD_PREFIX''@|GL|g' \ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \ -e 's|@''NEXT_STRING_H''@|$(NEXT_STRING_H)|g' \ -e 's/@''GNULIB_EXPLICIT_BZERO''@/$(GNULIB_EXPLICIT_BZERO)/g' \ -e 's/@''GNULIB_FFSL''@/$(GNULIB_FFSL)/g' \ -e 's/@''GNULIB_FFSLL''@/$(GNULIB_FFSLL)/g' \ -e 's/@''GNULIB_MBSLEN''@/$(GNULIB_MBSLEN)/g' \ -e 's/@''GNULIB_MBSNLEN''@/$(GNULIB_MBSNLEN)/g' \ -e 's/@''GNULIB_MBSCHR''@/$(GNULIB_MBSCHR)/g' \ -e 's/@''GNULIB_MBSRCHR''@/$(GNULIB_MBSRCHR)/g' \ -e 's/@''GNULIB_MBSSTR''@/$(GNULIB_MBSSTR)/g' \ -e 's/@''GNULIB_MBSCASECMP''@/$(GNULIB_MBSCASECMP)/g' \ -e 's/@''GNULIB_MBSNCASECMP''@/$(GNULIB_MBSNCASECMP)/g' \ -e 's/@''GNULIB_MBSPCASECMP''@/$(GNULIB_MBSPCASECMP)/g' \ -e 's/@''GNULIB_MBSCASESTR''@/$(GNULIB_MBSCASESTR)/g' \ -e 's/@''GNULIB_MBSCSPN''@/$(GNULIB_MBSCSPN)/g' \ -e 's/@''GNULIB_MBSPBRK''@/$(GNULIB_MBSPBRK)/g' \ -e 's/@''GNULIB_MBSSPN''@/$(GNULIB_MBSSPN)/g' \ -e 's/@''GNULIB_MBSSEP''@/$(GNULIB_MBSSEP)/g' \ -e 's/@''GNULIB_MBSTOK_R''@/$(GNULIB_MBSTOK_R)/g' \ -e 's/@''GNULIB_MEMCHR''@/$(GNULIB_MEMCHR)/g' \ -e 's/@''GNULIB_MEMMEM''@/$(GNULIB_MEMMEM)/g' \ -e 's/@''GNULIB_MEMPCPY''@/$(GNULIB_MEMPCPY)/g' \ -e 's/@''GNULIB_MEMRCHR''@/$(GNULIB_MEMRCHR)/g' \ -e 's/@''GNULIB_RAWMEMCHR''@/$(GNULIB_RAWMEMCHR)/g' \ -e 's/@''GNULIB_STPCPY''@/$(GNULIB_STPCPY)/g' \ -e 's/@''GNULIB_STPNCPY''@/$(GNULIB_STPNCPY)/g' \ -e 's/@''GNULIB_STRCHRNUL''@/$(GNULIB_STRCHRNUL)/g' \ -e 's/@''GNULIB_STRDUP''@/$(GNULIB_STRDUP)/g' \ -e 's/@''GNULIB_STRNCAT''@/$(GNULIB_STRNCAT)/g' \ -e 's/@''GNULIB_STRNDUP''@/$(GNULIB_STRNDUP)/g' \ -e 's/@''GNULIB_STRNLEN''@/$(GNULIB_STRNLEN)/g' \ -e 's/@''GNULIB_STRPBRK''@/$(GNULIB_STRPBRK)/g' \ -e 's/@''GNULIB_STRSEP''@/$(GNULIB_STRSEP)/g' \ -e 's/@''GNULIB_STRSTR''@/$(GNULIB_STRSTR)/g' \ -e 's/@''GNULIB_STRCASESTR''@/$(GNULIB_STRCASESTR)/g' \ -e 's/@''GNULIB_STRTOK_R''@/$(GNULIB_STRTOK_R)/g' \ -e 's/@''GNULIB_STRERROR''@/$(GNULIB_STRERROR)/g' \ -e 's/@''GNULIB_STRERROR_R''@/$(GNULIB_STRERROR_R)/g' \ -e 's/@''GNULIB_STRSIGNAL''@/$(GNULIB_STRSIGNAL)/g' \ -e 's/@''GNULIB_STRVERSCMP''@/$(GNULIB_STRVERSCMP)/g' \ < $(srcdir)/string.in.h | \ sed -e 's|@''HAVE_EXPLICIT_BZERO''@|$(HAVE_EXPLICIT_BZERO)|g' \ -e 's|@''HAVE_FFSL''@|$(HAVE_FFSL)|g' \ -e 's|@''HAVE_FFSLL''@|$(HAVE_FFSLL)|g' \ -e 's|@''HAVE_MBSLEN''@|$(HAVE_MBSLEN)|g' \ -e 's|@''HAVE_DECL_MEMMEM''@|$(HAVE_DECL_MEMMEM)|g' \ -e 's|@''HAVE_MEMPCPY''@|$(HAVE_MEMPCPY)|g' \ -e 's|@''HAVE_DECL_MEMRCHR''@|$(HAVE_DECL_MEMRCHR)|g' \ -e 's|@''HAVE_RAWMEMCHR''@|$(HAVE_RAWMEMCHR)|g' \ -e 's|@''HAVE_STPCPY''@|$(HAVE_STPCPY)|g' \ -e 's|@''HAVE_STPNCPY''@|$(HAVE_STPNCPY)|g' \ -e 's|@''HAVE_STRCHRNUL''@|$(HAVE_STRCHRNUL)|g' \ -e 's|@''HAVE_DECL_STRDUP''@|$(HAVE_DECL_STRDUP)|g' \ -e 's|@''HAVE_DECL_STRNDUP''@|$(HAVE_DECL_STRNDUP)|g' \ -e 's|@''HAVE_DECL_STRNLEN''@|$(HAVE_DECL_STRNLEN)|g' \ -e 's|@''HAVE_STRPBRK''@|$(HAVE_STRPBRK)|g' \ -e 's|@''HAVE_STRSEP''@|$(HAVE_STRSEP)|g' \ -e 's|@''HAVE_STRCASESTR''@|$(HAVE_STRCASESTR)|g' \ -e 's|@''HAVE_DECL_STRTOK_R''@|$(HAVE_DECL_STRTOK_R)|g' \ -e 's|@''HAVE_DECL_STRERROR_R''@|$(HAVE_DECL_STRERROR_R)|g' \ -e 's|@''HAVE_DECL_STRSIGNAL''@|$(HAVE_DECL_STRSIGNAL)|g' \ -e 's|@''HAVE_STRVERSCMP''@|$(HAVE_STRVERSCMP)|g' \ -e 's|@''REPLACE_MEMCHR''@|$(REPLACE_MEMCHR)|g' \ -e 's|@''REPLACE_MEMMEM''@|$(REPLACE_MEMMEM)|g' \ -e 's|@''REPLACE_STPNCPY''@|$(REPLACE_STPNCPY)|g' \ -e 's|@''REPLACE_STRCHRNUL''@|$(REPLACE_STRCHRNUL)|g' \ -e 's|@''REPLACE_STRDUP''@|$(REPLACE_STRDUP)|g' \ -e 's|@''REPLACE_STRNCAT''@|$(REPLACE_STRNCAT)|g' \ -e 's|@''REPLACE_STRNDUP''@|$(REPLACE_STRNDUP)|g' \ -e 's|@''REPLACE_STRNLEN''@|$(REPLACE_STRNLEN)|g' \ -e 's|@''REPLACE_STRSTR''@|$(REPLACE_STRSTR)|g' \ -e 's|@''REPLACE_STRCASESTR''@|$(REPLACE_STRCASESTR)|g' \ -e 's|@''REPLACE_STRTOK_R''@|$(REPLACE_STRTOK_R)|g' \ -e 's|@''REPLACE_STRERROR''@|$(REPLACE_STRERROR)|g' \ -e 's|@''REPLACE_STRERROR_R''@|$(REPLACE_STRERROR_R)|g' \ -e 's|@''REPLACE_STRSIGNAL''@|$(REPLACE_STRSIGNAL)|g' \ -e 's|@''UNDEFINE_STRTOK_R''@|$(UNDEFINE_STRTOK_R)|g' \ -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \ -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \ -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)'; \ < $(srcdir)/string.in.h; \ } > $@-t && \ mv $@-t $@ MOSTLYCLEANFILES += string.h string.h-t EXTRA_DIST += string.in.h ## end gnulib module string ## begin gnulib module strings BUILT_SOURCES += strings.h # We need the following in order to create when the system # doesn't have one that works with the given compiler. strings.h: strings.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(WARN_ON_USE_H) $(ARG_NONNULL_H) $(AM_V_GEN)rm -f $@-t $@ && \ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */' && \ sed -e 's|@''GUARD_PREFIX''@|GL|g' \ -e 's|@''HAVE_STRINGS_H''@|$(HAVE_STRINGS_H)|g' \ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \ -e 's|@''NEXT_STRINGS_H''@|$(NEXT_STRINGS_H)|g' \ -e 's/@''GNULIB_FFS''@/$(GNULIB_FFS)/g' \ -e 's|@''HAVE_FFS''@|$(HAVE_FFS)|g' \ -e 's|@''HAVE_STRCASECMP''@|$(HAVE_STRCASECMP)|g' \ -e 's|@''HAVE_DECL_STRNCASECMP''@|$(HAVE_DECL_STRNCASECMP)|g' \ -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \ -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \ -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \ < $(srcdir)/strings.in.h; \ } > $@-t && \ mv $@-t $@ MOSTLYCLEANFILES += strings.h strings.h-t EXTRA_DIST += strings.in.h ## end gnulib module strings ## begin gnulib module strncat EXTRA_DIST += strncat.c EXTRA_libgl_la_SOURCES += strncat.c ## end gnulib module strncat ## begin gnulib module strndup EXTRA_DIST += strndup.c EXTRA_libgl_la_SOURCES += strndup.c ## end gnulib module strndup ## begin gnulib module strnlen EXTRA_DIST += strnlen.c EXTRA_libgl_la_SOURCES += strnlen.c ## end gnulib module strnlen ## begin gnulib module strsep EXTRA_DIST += strsep.c EXTRA_libgl_la_SOURCES += strsep.c ## end gnulib module strsep ## begin gnulib module strtod EXTRA_DIST += strtod.c EXTRA_libgl_la_SOURCES += strtod.c ## end gnulib module strtod ## begin gnulib module strtok_r EXTRA_DIST += strtok_r.c EXTRA_libgl_la_SOURCES += strtok_r.c ## end gnulib module strtok_r ## begin gnulib module sys_random BUILT_SOURCES += sys/random.h # We need the following in order to create when the system # doesn't have one. sys/random.h: sys_random.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(ARG_NONNULL_H) $(WARN_ON_USE_H) $(AM_V_at)$(MKDIR_P) sys $(AM_V_GEN)rm -f $@-t $@ && \ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \ sed -e 's|@''GUARD_PREFIX''@|GL|g' \ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \ -e 's|@''NEXT_SYS_RANDOM_H''@|$(NEXT_SYS_RANDOM_H)|g' \ -e 's|@''HAVE_SYS_RANDOM_H''@|$(HAVE_SYS_RANDOM_H)|g' \ -e 's/@''GNULIB_GETRANDOM''@/$(GNULIB_GETRANDOM)/g' \ -e 's/@''HAVE_GETRANDOM''@/$(HAVE_GETRANDOM)/g' \ -e 's/@''REPLACE_GETRANDOM''@/$(REPLACE_GETRANDOM)/g' \ -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \ -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \ -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \ < $(srcdir)/sys_random.in.h; \ } > $@-t && \ mv -f $@-t $@ MOSTLYCLEANFILES += sys/random.h sys/random.h-t MOSTLYCLEANDIRS += sys EXTRA_DIST += sys_random.in.h ## end gnulib module sys_random ## begin gnulib module sys_select BUILT_SOURCES += sys/select.h # We need the following in order to create when the system # doesn't have one that works with the given compiler. sys/select.h: sys_select.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(WARN_ON_USE_H) $(AM_V_at)$(MKDIR_P) sys $(AM_V_GEN)rm -f $@-t $@ && \ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \ sed -e 's|@''GUARD_PREFIX''@|GL|g' \ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \ -e 's|@''NEXT_SYS_SELECT_H''@|$(NEXT_SYS_SELECT_H)|g' \ -e 's|@''HAVE_SYS_SELECT_H''@|$(HAVE_SYS_SELECT_H)|g' \ -e 's/@''GNULIB_PSELECT''@/$(GNULIB_PSELECT)/g' \ -e 's/@''GNULIB_SELECT''@/$(GNULIB_SELECT)/g' \ -e 's|@''HAVE_WINSOCK2_H''@|$(HAVE_WINSOCK2_H)|g' \ -e 's|@''HAVE_PSELECT''@|$(HAVE_PSELECT)|g' \ -e 's|@''REPLACE_PSELECT''@|$(REPLACE_PSELECT)|g' \ -e 's|@''REPLACE_SELECT''@|$(REPLACE_SELECT)|g' \ -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \ -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \ < $(srcdir)/sys_select.in.h; \ } > $@-t && \ mv $@-t $@ MOSTLYCLEANFILES += sys/select.h sys/select.h-t MOSTLYCLEANDIRS += sys EXTRA_DIST += sys_select.in.h ## end gnulib module sys_select ## begin gnulib module sys_socket BUILT_SOURCES += sys/socket.h libgl_la_SOURCES += sys_socket.c # We need the following in order to create when the system # doesn't have one that works with the given compiler. sys/socket.h: sys_socket.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(WARN_ON_USE_H) $(ARG_NONNULL_H) $(AM_V_at)$(MKDIR_P) sys $(AM_V_GEN)rm -f $@-t $@ && \ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \ sed -e 's|@''GUARD_PREFIX''@|GL|g' \ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \ -e 's|@''NEXT_SYS_SOCKET_H''@|$(NEXT_SYS_SOCKET_H)|g' \ -e 's|@''HAVE_SYS_SOCKET_H''@|$(HAVE_SYS_SOCKET_H)|g' \ -e 's/@''GNULIB_CLOSE''@/$(GNULIB_CLOSE)/g' \ -e 's/@''GNULIB_SOCKET''@/$(GNULIB_SOCKET)/g' \ -e 's/@''GNULIB_CONNECT''@/$(GNULIB_CONNECT)/g' \ -e 's/@''GNULIB_ACCEPT''@/$(GNULIB_ACCEPT)/g' \ -e 's/@''GNULIB_BIND''@/$(GNULIB_BIND)/g' \ -e 's/@''GNULIB_GETPEERNAME''@/$(GNULIB_GETPEERNAME)/g' \ -e 's/@''GNULIB_GETSOCKNAME''@/$(GNULIB_GETSOCKNAME)/g' \ -e 's/@''GNULIB_GETSOCKOPT''@/$(GNULIB_GETSOCKOPT)/g' \ -e 's/@''GNULIB_LISTEN''@/$(GNULIB_LISTEN)/g' \ -e 's/@''GNULIB_RECV''@/$(GNULIB_RECV)/g' \ -e 's/@''GNULIB_SEND''@/$(GNULIB_SEND)/g' \ -e 's/@''GNULIB_RECVFROM''@/$(GNULIB_RECVFROM)/g' \ -e 's/@''GNULIB_SENDTO''@/$(GNULIB_SENDTO)/g' \ -e 's/@''GNULIB_SETSOCKOPT''@/$(GNULIB_SETSOCKOPT)/g' \ -e 's/@''GNULIB_SHUTDOWN''@/$(GNULIB_SHUTDOWN)/g' \ -e 's/@''GNULIB_ACCEPT4''@/$(GNULIB_ACCEPT4)/g' \ -e 's|@''HAVE_WINSOCK2_H''@|$(HAVE_WINSOCK2_H)|g' \ -e 's|@''HAVE_WS2TCPIP_H''@|$(HAVE_WS2TCPIP_H)|g' \ -e 's|@''HAVE_STRUCT_SOCKADDR_STORAGE''@|$(HAVE_STRUCT_SOCKADDR_STORAGE)|g' \ -e 's|@''HAVE_STRUCT_SOCKADDR_STORAGE_SS_FAMILY''@|$(HAVE_STRUCT_SOCKADDR_STORAGE_SS_FAMILY)|g' \ -e 's|@''HAVE_SA_FAMILY_T''@|$(HAVE_SA_FAMILY_T)|g' \ -e 's|@''HAVE_ACCEPT4''@|$(HAVE_ACCEPT4)|g' \ -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \ -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \ -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \ < $(srcdir)/sys_socket.in.h; \ } > $@-t && \ mv -f $@-t $@ MOSTLYCLEANFILES += sys/socket.h sys/socket.h-t MOSTLYCLEANDIRS += sys EXTRA_DIST += sys_socket.in.h ## end gnulib module sys_socket ## begin gnulib module sys_stat BUILT_SOURCES += sys/stat.h # We need the following in order to create when the system # has one that is incomplete. sys/stat.h: sys_stat.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(ARG_NONNULL_H) $(WARN_ON_USE_H) $(AM_V_at)$(MKDIR_P) sys $(AM_V_GEN)rm -f $@-t $@ && \ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \ sed -e 's|@''GUARD_PREFIX''@|GL|g' \ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \ -e 's|@''NEXT_SYS_STAT_H''@|$(NEXT_SYS_STAT_H)|g' \ -e 's|@''WINDOWS_64_BIT_ST_SIZE''@|$(WINDOWS_64_BIT_ST_SIZE)|g' \ -e 's|@''WINDOWS_STAT_TIMESPEC''@|$(WINDOWS_STAT_TIMESPEC)|g' \ -e 's/@''GNULIB_FCHMODAT''@/$(GNULIB_FCHMODAT)/g' \ -e 's/@''GNULIB_FSTAT''@/$(GNULIB_FSTAT)/g' \ -e 's/@''GNULIB_FSTATAT''@/$(GNULIB_FSTATAT)/g' \ -e 's/@''GNULIB_FUTIMENS''@/$(GNULIB_FUTIMENS)/g' \ -e 's/@''GNULIB_GETUMASK''@/$(GNULIB_GETUMASK)/g' \ -e 's/@''GNULIB_LCHMOD''@/$(GNULIB_LCHMOD)/g' \ -e 's/@''GNULIB_LSTAT''@/$(GNULIB_LSTAT)/g' \ -e 's/@''GNULIB_MKDIRAT''@/$(GNULIB_MKDIRAT)/g' \ -e 's/@''GNULIB_MKFIFO''@/$(GNULIB_MKFIFO)/g' \ -e 's/@''GNULIB_MKFIFOAT''@/$(GNULIB_MKFIFOAT)/g' \ -e 's/@''GNULIB_MKNOD''@/$(GNULIB_MKNOD)/g' \ -e 's/@''GNULIB_MKNODAT''@/$(GNULIB_MKNODAT)/g' \ -e 's/@''GNULIB_STAT''@/$(GNULIB_STAT)/g' \ -e 's/@''GNULIB_UTIMENSAT''@/$(GNULIB_UTIMENSAT)/g' \ -e 's/@''GNULIB_OVERRIDES_STRUCT_STAT''@/$(GNULIB_OVERRIDES_STRUCT_STAT)/g' \ -e 's|@''HAVE_FCHMODAT''@|$(HAVE_FCHMODAT)|g' \ -e 's|@''HAVE_FSTATAT''@|$(HAVE_FSTATAT)|g' \ -e 's|@''HAVE_FUTIMENS''@|$(HAVE_FUTIMENS)|g' \ -e 's|@''HAVE_GETUMASK''@|$(HAVE_GETUMASK)|g' \ -e 's|@''HAVE_LCHMOD''@|$(HAVE_LCHMOD)|g' \ -e 's|@''HAVE_LSTAT''@|$(HAVE_LSTAT)|g' \ -e 's|@''HAVE_MKDIRAT''@|$(HAVE_MKDIRAT)|g' \ -e 's|@''HAVE_MKFIFO''@|$(HAVE_MKFIFO)|g' \ -e 's|@''HAVE_MKFIFOAT''@|$(HAVE_MKFIFOAT)|g' \ -e 's|@''HAVE_MKNOD''@|$(HAVE_MKNOD)|g' \ -e 's|@''HAVE_MKNODAT''@|$(HAVE_MKNODAT)|g' \ -e 's|@''HAVE_UTIMENSAT''@|$(HAVE_UTIMENSAT)|g' \ -e 's|@''REPLACE_FCHMODAT''@|$(REPLACE_FCHMODAT)|g' \ -e 's|@''REPLACE_FSTAT''@|$(REPLACE_FSTAT)|g' \ -e 's|@''REPLACE_FSTATAT''@|$(REPLACE_FSTATAT)|g' \ -e 's|@''REPLACE_FUTIMENS''@|$(REPLACE_FUTIMENS)|g' \ -e 's|@''REPLACE_LSTAT''@|$(REPLACE_LSTAT)|g' \ -e 's|@''REPLACE_MKDIR''@|$(REPLACE_MKDIR)|g' \ -e 's|@''REPLACE_MKFIFO''@|$(REPLACE_MKFIFO)|g' \ -e 's|@''REPLACE_MKNOD''@|$(REPLACE_MKNOD)|g' \ -e 's|@''REPLACE_STAT''@|$(REPLACE_STAT)|g' \ -e 's|@''REPLACE_UTIMENSAT''@|$(REPLACE_UTIMENSAT)|g' \ -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \ -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \ -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \ < $(srcdir)/sys_stat.in.h; \ } > $@-t && \ mv $@-t $@ MOSTLYCLEANFILES += sys/stat.h sys/stat.h-t MOSTLYCLEANDIRS += sys EXTRA_DIST += sys_stat.in.h ## end gnulib module sys_stat ## begin gnulib module sys_time BUILT_SOURCES += sys/time.h # We need the following in order to create when the system # doesn't have one that works with the given compiler. sys/time.h: sys_time.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(ARG_NONNULL_H) $(WARN_ON_USE_H) $(AM_V_at)$(MKDIR_P) sys $(AM_V_GEN)rm -f $@-t $@ && \ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \ sed -e 's|@''GUARD_PREFIX''@|GL|g' \ -e 's/@''HAVE_SYS_TIME_H''@/$(HAVE_SYS_TIME_H)/g' \ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \ -e 's|@''NEXT_SYS_TIME_H''@|$(NEXT_SYS_TIME_H)|g' \ -e 's/@''GNULIB_GETTIMEOFDAY''@/$(GNULIB_GETTIMEOFDAY)/g' \ -e 's|@''HAVE_WINSOCK2_H''@|$(HAVE_WINSOCK2_H)|g' \ -e 's/@''HAVE_GETTIMEOFDAY''@/$(HAVE_GETTIMEOFDAY)/g' \ -e 's/@''HAVE_STRUCT_TIMEVAL''@/$(HAVE_STRUCT_TIMEVAL)/g' \ -e 's/@''REPLACE_GETTIMEOFDAY''@/$(REPLACE_GETTIMEOFDAY)/g' \ -e 's/@''REPLACE_STRUCT_TIMEVAL''@/$(REPLACE_STRUCT_TIMEVAL)/g' \ -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \ -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \ -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \ < $(srcdir)/sys_time.in.h; \ } > $@-t && \ mv $@-t $@ MOSTLYCLEANFILES += sys/time.h sys/time.h-t EXTRA_DIST += sys_time.in.h ## end gnulib module sys_time ## begin gnulib module sys_types BUILT_SOURCES += sys/types.h # We need the following in order to create when the system # doesn't have one that works with the given compiler. sys/types.h: sys_types.in.h $(top_builddir)/config.status $(AM_V_at)$(MKDIR_P) sys $(AM_V_GEN)rm -f $@-t $@ && \ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \ sed -e 's|@''GUARD_PREFIX''@|GL|g' \ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \ -e 's|@''NEXT_SYS_TYPES_H''@|$(NEXT_SYS_TYPES_H)|g' \ -e 's|@''WINDOWS_64_BIT_OFF_T''@|$(WINDOWS_64_BIT_OFF_T)|g' \ -e 's|@''WINDOWS_STAT_INODES''@|$(WINDOWS_STAT_INODES)|g' \ < $(srcdir)/sys_types.in.h; \ } > $@-t && \ mv $@-t $@ MOSTLYCLEANFILES += sys/types.h sys/types.h-t EXTRA_DIST += sys_types.in.h ## end gnulib module sys_types ## begin gnulib module sys_uio BUILT_SOURCES += sys/uio.h # We need the following in order to create when the system # doesn't have one that works with the given compiler. sys/uio.h: sys_uio.in.h $(top_builddir)/config.status $(AM_V_at)$(MKDIR_P) sys $(AM_V_GEN)rm -f $@-t $@ && \ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \ sed -e 's|@''GUARD_PREFIX''@|GL|g' \ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \ -e 's|@''NEXT_SYS_UIO_H''@|$(NEXT_SYS_UIO_H)|g' \ -e 's|@''HAVE_SYS_UIO_H''@|$(HAVE_SYS_UIO_H)|g' \ < $(srcdir)/sys_uio.in.h; \ } > $@-t && \ mv -f $@-t $@ MOSTLYCLEANFILES += sys/uio.h sys/uio.h-t MOSTLYCLEANDIRS += sys EXTRA_DIST += sys_uio.in.h ## end gnulib module sys_uio ## begin gnulib module tempname libgl_la_SOURCES += tempname.c EXTRA_DIST += tempname.h ## end gnulib module tempname ## begin gnulib module termios BUILT_SOURCES += termios.h # We need the following in order to create when the system # version does not have all declarations. termios.h: termios.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(WARN_ON_USE_H) $(AM_V_GEN)rm -f $@-t $@ && \ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \ sed -e 's|@''GUARD_PREFIX''@|GL|g' \ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \ -e 's|@''NEXT_TERMIOS_H''@|$(NEXT_TERMIOS_H)|g' \ -e 's/@''GNULIB_TCGETSID''@/$(GNULIB_TCGETSID)/g' \ -e 's|@''HAVE_DECL_TCGETSID''@|$(HAVE_DECL_TCGETSID)|g' \ -e 's|@''HAVE_TERMIOS_H''@|$(HAVE_TERMIOS_H)|g' \ -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \ -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \ < $(srcdir)/termios.in.h; \ } > $@-t && \ mv $@-t $@ MOSTLYCLEANFILES += termios.h termios.h-t EXTRA_DIST += termios.in.h ## end gnulib module termios ## begin gnulib module thread-optim EXTRA_DIST += thread-optim.h ## end gnulib module thread-optim ## begin gnulib module threadlib libgl_la_SOURCES += glthread/threadlib.c ## end gnulib module threadlib ## begin gnulib module time BUILT_SOURCES += time.h # We need the following in order to create when the system # doesn't have one that works with the given compiler. time.h: time.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(ARG_NONNULL_H) $(WARN_ON_USE_H) $(AM_V_GEN)rm -f $@-t $@ && \ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */' && \ sed -e 's|@''GUARD_PREFIX''@|GL|g' \ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \ -e 's|@''NEXT_TIME_H''@|$(NEXT_TIME_H)|g' \ -e 's/@''GNULIB_CTIME''@/$(GNULIB_CTIME)/g' \ -e 's/@''GNULIB_LOCALTIME''@/$(GNULIB_LOCALTIME)/g' \ -e 's/@''GNULIB_MKTIME''@/$(GNULIB_MKTIME)/g' \ -e 's/@''GNULIB_NANOSLEEP''@/$(GNULIB_NANOSLEEP)/g' \ -e 's/@''GNULIB_STRFTIME''@/$(GNULIB_STRFTIME)/g' \ -e 's/@''GNULIB_STRPTIME''@/$(GNULIB_STRPTIME)/g' \ -e 's/@''GNULIB_TIMEGM''@/$(GNULIB_TIMEGM)/g' \ -e 's/@''GNULIB_TIME_R''@/$(GNULIB_TIME_R)/g' \ -e 's/@''GNULIB_TIME_RZ''@/$(GNULIB_TIME_RZ)/g' \ -e 's/@''GNULIB_TZSET''@/$(GNULIB_TZSET)/g' \ -e 's|@''HAVE_DECL_LOCALTIME_R''@|$(HAVE_DECL_LOCALTIME_R)|g' \ -e 's|@''HAVE_NANOSLEEP''@|$(HAVE_NANOSLEEP)|g' \ -e 's|@''HAVE_STRPTIME''@|$(HAVE_STRPTIME)|g' \ -e 's|@''HAVE_TIMEGM''@|$(HAVE_TIMEGM)|g' \ -e 's|@''HAVE_TIMEZONE_T''@|$(HAVE_TIMEZONE_T)|g' \ -e 's|@''HAVE_TZSET''@|$(HAVE_TZSET)|g' \ -e 's|@''REPLACE_CTIME''@|$(REPLACE_CTIME)|g' \ -e 's|@''REPLACE_GMTIME''@|$(REPLACE_GMTIME)|g' \ -e 's|@''REPLACE_LOCALTIME''@|$(REPLACE_LOCALTIME)|g' \ -e 's|@''REPLACE_LOCALTIME_R''@|$(REPLACE_LOCALTIME_R)|g' \ -e 's|@''REPLACE_MKTIME''@|$(REPLACE_MKTIME)|g' \ -e 's|@''REPLACE_NANOSLEEP''@|$(REPLACE_NANOSLEEP)|g' \ -e 's|@''REPLACE_STRFTIME''@|$(REPLACE_STRFTIME)|g' \ -e 's|@''REPLACE_TIMEGM''@|$(REPLACE_TIMEGM)|g' \ -e 's|@''REPLACE_TZSET''@|$(REPLACE_TZSET)|g' \ -e 's|@''PTHREAD_H_DEFINES_STRUCT_TIMESPEC''@|$(PTHREAD_H_DEFINES_STRUCT_TIMESPEC)|g' \ -e 's|@''SYS_TIME_H_DEFINES_STRUCT_TIMESPEC''@|$(SYS_TIME_H_DEFINES_STRUCT_TIMESPEC)|g' \ -e 's|@''TIME_H_DEFINES_STRUCT_TIMESPEC''@|$(TIME_H_DEFINES_STRUCT_TIMESPEC)|g' \ -e 's|@''UNISTD_H_DEFINES_STRUCT_TIMESPEC''@|$(UNISTD_H_DEFINES_STRUCT_TIMESPEC)|g' \ -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \ -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \ -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \ < $(srcdir)/time.in.h; \ } > $@-t && \ mv $@-t $@ MOSTLYCLEANFILES += time.h time.h-t EXTRA_DIST += time.in.h ## end gnulib module time ## begin gnulib module time_r EXTRA_DIST += time_r.c EXTRA_libgl_la_SOURCES += time_r.c ## end gnulib module time_r ## begin gnulib module time_rz EXTRA_DIST += time-internal.h time_rz.c EXTRA_libgl_la_SOURCES += time_rz.c ## end gnulib module time_rz ## begin gnulib module timegm EXTRA_DIST += mktime-internal.h timegm.c EXTRA_libgl_la_SOURCES += timegm.c ## end gnulib module timegm ## begin gnulib module timespec libgl_la_SOURCES += timespec.c EXTRA_DIST += timespec.h ## end gnulib module timespec ## begin gnulib module timespec-add libgl_la_SOURCES += timespec-add.c ## end gnulib module timespec-add ## begin gnulib module timespec-sub libgl_la_SOURCES += timespec-sub.c ## end gnulib module timespec-sub ## begin gnulib module tmpdir libgl_la_SOURCES += tmpdir.h tmpdir.c ## end gnulib module tmpdir ## begin gnulib module trunc EXTRA_DIST += trunc.c EXTRA_libgl_la_SOURCES += trunc.c ## end gnulib module trunc ## begin gnulib module tzset EXTRA_DIST += tzset.c EXTRA_libgl_la_SOURCES += tzset.c ## end gnulib module tzset ## begin gnulib module unicase/base BUILT_SOURCES += $(LIBUNISTRING_UNICASE_H) unicase.h: unicase.in.h $(AM_V_GEN)rm -f $@-t $@ && \ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \ cat $(srcdir)/unicase.in.h; \ } > $@-t && \ mv -f $@-t $@ MOSTLYCLEANFILES += unicase.h unicase.h-t EXTRA_DIST += unicase.in.h ## end gnulib module unicase/base ## begin gnulib module unicase/cased libgl_la_SOURCES += unicase/cased.c EXTRA_DIST += unicase/cased.h unicase/caseprop.h unictype/bitmap.h ## end gnulib module unicase/cased ## begin gnulib module unicase/empty-prefix-context if LIBUNISTRING_COMPILE_UNICASE_EMPTY_PREFIX_CONTEXT libgl_la_SOURCES += unicase/empty-prefix-context.c endif ## end gnulib module unicase/empty-prefix-context ## begin gnulib module unicase/empty-suffix-context if LIBUNISTRING_COMPILE_UNICASE_EMPTY_SUFFIX_CONTEXT libgl_la_SOURCES += unicase/empty-suffix-context.c endif ## end gnulib module unicase/empty-suffix-context ## begin gnulib module unicase/ignorable libgl_la_SOURCES += unicase/ignorable.c EXTRA_DIST += unicase/caseprop.h unicase/ignorable.h unictype/bitmap.h ## end gnulib module unicase/ignorable ## begin gnulib module unicase/special-casing libgl_la_SOURCES += unicase/special-casing.c $(srcdir)/unicase/special-casing-table.h: $(srcdir)/unicase/special-casing-table.gperf $(V_GPERF)$(GPERF) -m 10 $(srcdir)/unicase/special-casing-table.gperf > $(srcdir)/unicase/special-casing-table.h-t && \ mv $(srcdir)/unicase/special-casing-table.h-t $(srcdir)/unicase/special-casing-table.h BUILT_SOURCES += unicase/special-casing-table.h MOSTLYCLEANFILES += unicase/special-casing-table.h-t MAINTAINERCLEANFILES += unicase/special-casing-table.h EXTRA_DIST += unicase/special-casing-table.h # Generate special-casing.h with a declaration that depends on the gperf version. unicase/special-casing.h: unicase/special-casing.in.h unicase/special-casing-table.h $(AM_V_at)$(MKDIR_P) unicase $(AM_V_GEN)rm -f $@-t $@ && \ declaration=`grep '^gl_unicase_special_lookup' $(srcdir)/unicase/special-casing-table.h | sed -e 's/register //g'` && \ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \ sed -e "/gl_unicase_special_lookup/s/gl_unicase_special_lookup.*/$${declaration};/" $(srcdir)/unicase/special-casing.in.h; \ } > $@-t && \ mv -f $@-t $@ BUILT_SOURCES += unicase/special-casing.h MOSTLYCLEANFILES += unicase/special-casing.h unicase/special-casing.h-t EXTRA_DIST += unicase/special-casing-table.gperf unicase/special-casing.in.h ## end gnulib module unicase/special-casing ## begin gnulib module unicase/tocasefold libgl_la_SOURCES += unicase/tocasefold.c EXTRA_DIST += unicase/casefold.h unicase/simple-mapping.h unicase/tocasefold.h ## end gnulib module unicase/tocasefold ## begin gnulib module unicase/tolower if LIBUNISTRING_COMPILE_UNICASE_TOLOWER libgl_la_SOURCES += unicase/tolower.c endif EXTRA_DIST += unicase/simple-mapping.h unicase/tolower.h ## end gnulib module unicase/tolower ## begin gnulib module unicase/totitle if LIBUNISTRING_COMPILE_UNICASE_TOTITLE libgl_la_SOURCES += unicase/totitle.c endif EXTRA_DIST += unicase/simple-mapping.h unicase/totitle.h ## end gnulib module unicase/totitle ## begin gnulib module unicase/toupper if LIBUNISTRING_COMPILE_UNICASE_TOUPPER libgl_la_SOURCES += unicase/toupper.c endif EXTRA_DIST += unicase/simple-mapping.h unicase/toupper.h ## end gnulib module unicase/toupper ## begin gnulib module unicase/u8-casecmp if LIBUNISTRING_COMPILE_UNICASE_U8_CASECMP libgl_la_SOURCES += unicase/u8-casecmp.c endif EXTRA_DIST += unicase/u-casecmp.h ## end gnulib module unicase/u8-casecmp ## begin gnulib module unicase/u8-casefold if LIBUNISTRING_COMPILE_UNICASE_U8_CASEFOLD libgl_la_SOURCES += unicase/u8-casefold.c endif EXTRA_DIST += unicase/u-casefold.h ## end gnulib module unicase/u8-casefold ## begin gnulib module unicase/u8-casemap libgl_la_SOURCES += unicase/u8-casemap.c EXTRA_DIST += unicase/context.h unicase/u-casemap.h unicase/unicasemap.h ## end gnulib module unicase/u8-casemap ## begin gnulib module unicase/u8-ct-casefold if LIBUNISTRING_COMPILE_UNICASE_U8_CT_CASEFOLD libgl_la_SOURCES += unicase/u8-ct-casefold.c endif EXTRA_DIST += unicase/u-ct-casefold.h ## end gnulib module unicase/u8-ct-casefold ## begin gnulib module unicase/u8-ct-totitle if LIBUNISTRING_COMPILE_UNICASE_U8_CT_TOTITLE libgl_la_SOURCES += unicase/u8-ct-totitle.c endif EXTRA_DIST += unicase/context.h unicase/u-ct-totitle.h ## end gnulib module unicase/u8-ct-totitle ## begin gnulib module unicase/u8-tolower if LIBUNISTRING_COMPILE_UNICASE_U8_TOLOWER libgl_la_SOURCES += unicase/u8-tolower.c endif ## end gnulib module unicase/u8-tolower ## begin gnulib module unicase/u8-totitle if LIBUNISTRING_COMPILE_UNICASE_U8_TOTITLE libgl_la_SOURCES += unicase/u8-totitle.c endif EXTRA_DIST += unicase/u-totitle.h ## end gnulib module unicase/u8-totitle ## begin gnulib module unicase/u8-toupper if LIBUNISTRING_COMPILE_UNICASE_U8_TOUPPER libgl_la_SOURCES += unicase/u8-toupper.c endif ## end gnulib module unicase/u8-toupper ## begin gnulib module unictype/base BUILT_SOURCES += $(LIBUNISTRING_UNICTYPE_H) unictype.h: unictype.in.h $(AM_V_GEN)rm -f $@-t $@ && \ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \ cat $(srcdir)/unictype.in.h; \ } > $@-t && \ mv -f $@-t $@ MOSTLYCLEANFILES += unictype.h unictype.h-t EXTRA_DIST += unictype.in.h ## end gnulib module unictype/base ## begin gnulib module unictype/category-none if LIBUNISTRING_COMPILE_UNICTYPE_CATEGORY_NONE libgl_la_SOURCES += unictype/categ_none.c endif ## end gnulib module unictype/category-none ## begin gnulib module unictype/category-of if LIBUNISTRING_COMPILE_UNICTYPE_CATEGORY_OF libgl_la_SOURCES += unictype/categ_of.c endif EXTRA_DIST += unictype/categ_of.h ## end gnulib module unictype/category-of ## begin gnulib module unictype/combining-class if LIBUNISTRING_COMPILE_UNICTYPE_COMBINING_CLASS libgl_la_SOURCES += unictype/combiningclass.c endif EXTRA_DIST += unictype/combiningclass.h ## end gnulib module unictype/combining-class ## begin gnulib module unictype/ctype-print if LIBUNISTRING_COMPILE_UNICTYPE_CTYPE_PRINT libgl_la_SOURCES += unictype/ctype_print.c endif EXTRA_DIST += unictype/bitmap.h unictype/ctype_print.h ## end gnulib module unictype/ctype-print ## begin gnulib module unictype/property-soft-dotted if LIBUNISTRING_COMPILE_UNICTYPE_PROPERTY_SOFT_DOTTED libgl_la_SOURCES += unictype/pr_soft_dotted.c endif EXTRA_DIST += unictype/bitmap.h unictype/pr_soft_dotted.h ## end gnulib module unictype/property-soft-dotted ## begin gnulib module unigbrk/base BUILT_SOURCES += $(LIBUNISTRING_UNIGBRK_H) unigbrk.h: unigbrk.in.h $(AM_V_GEN)rm -f $@-t $@ && \ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \ cat $(srcdir)/unigbrk.in.h; \ } > $@-t && \ mv -f $@-t $@ MOSTLYCLEANFILES += unigbrk.h unigbrk.h-t EXTRA_DIST += unigbrk.in.h ## end gnulib module unigbrk/base ## begin gnulib module unigbrk/uc-gbrk-prop if LIBUNISTRING_COMPILE_UNIGBRK_UC_GBRK_PROP libgl_la_SOURCES += unigbrk/uc-gbrk-prop.c endif EXTRA_DIST += unigbrk/gbrkprop.h ## end gnulib module unigbrk/uc-gbrk-prop ## begin gnulib module unigbrk/uc-is-grapheme-break if LIBUNISTRING_COMPILE_UNIGBRK_UC_IS_GRAPHEME_BREAK libgl_la_SOURCES += unigbrk/uc-is-grapheme-break.c endif ## end gnulib module unigbrk/uc-is-grapheme-break ## begin gnulib module unilbrk/base BUILT_SOURCES += $(LIBUNISTRING_UNILBRK_H) unilbrk.h: unilbrk.in.h $(AM_V_GEN)rm -f $@-t $@ && \ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \ cat $(srcdir)/unilbrk.in.h; \ } > $@-t && \ mv -f $@-t $@ MOSTLYCLEANFILES += unilbrk.h unilbrk.h-t EXTRA_DIST += unilbrk.in.h ## end gnulib module unilbrk/base ## begin gnulib module unilbrk/tables libgl_la_SOURCES += unilbrk/lbrktables.c EXTRA_DIST += unilbrk/lbrkprop1.h unilbrk/lbrkprop2.h unilbrk/lbrktables.h ## end gnulib module unilbrk/tables ## begin gnulib module unilbrk/u8-possible-linebreaks if LIBUNISTRING_COMPILE_UNILBRK_U8_POSSIBLE_LINEBREAKS libgl_la_SOURCES += unilbrk/u8-possible-linebreaks.c endif EXTRA_DIST += uniwidth/cjk.h ## end gnulib module unilbrk/u8-possible-linebreaks ## begin gnulib module uninorm/base BUILT_SOURCES += $(LIBUNISTRING_UNINORM_H) uninorm.h: uninorm.in.h $(AM_V_GEN)rm -f $@-t $@ && \ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \ cat $(srcdir)/uninorm.in.h; \ } > $@-t && \ mv -f $@-t $@ MOSTLYCLEANFILES += uninorm.h uninorm.h-t EXTRA_DIST += uninorm.in.h ## end gnulib module uninorm/base ## begin gnulib module uninorm/canonical-decomposition if LIBUNISTRING_COMPILE_UNINORM_CANONICAL_DECOMPOSITION libgl_la_SOURCES += uninorm/canonical-decomposition.c endif ## end gnulib module uninorm/canonical-decomposition ## begin gnulib module uninorm/compat-decomposition libgl_la_SOURCES += uninorm/compat-decomposition.c EXTRA_DIST += uninorm/decompose-internal.h ## end gnulib module uninorm/compat-decomposition ## begin gnulib module uninorm/decompose-internal libgl_la_SOURCES += uninorm/decompose-internal.c EXTRA_DIST += uninorm/decompose-internal.h ## end gnulib module uninorm/decompose-internal ## begin gnulib module uninorm/decomposing-form if LIBUNISTRING_COMPILE_UNINORM_DECOMPOSING_FORM libgl_la_SOURCES += uninorm/decomposing-form.c endif EXTRA_DIST += uninorm/normalize-internal.h ## end gnulib module uninorm/decomposing-form ## begin gnulib module uninorm/decomposition if LIBUNISTRING_COMPILE_UNINORM_DECOMPOSITION libgl_la_SOURCES += uninorm/decomposition.c endif ## end gnulib module uninorm/decomposition ## begin gnulib module uninorm/decomposition-table libgl_la_SOURCES += uninorm/decomposition-table.c EXTRA_DIST += uninorm/decomposition-table.h uninorm/decomposition-table1.h uninorm/decomposition-table2.h ## end gnulib module uninorm/decomposition-table ## begin gnulib module uninorm/nfd if LIBUNISTRING_COMPILE_UNINORM_NFD libgl_la_SOURCES += uninorm/nfd.c endif EXTRA_DIST += uninorm/normalize-internal.h ## end gnulib module uninorm/nfd ## begin gnulib module uninorm/nfkd if LIBUNISTRING_COMPILE_UNINORM_NFKD libgl_la_SOURCES += uninorm/nfkd.c endif EXTRA_DIST += uninorm/normalize-internal.h ## end gnulib module uninorm/nfkd ## begin gnulib module uninorm/u8-normalize if LIBUNISTRING_COMPILE_UNINORM_U8_NORMALIZE libgl_la_SOURCES += uninorm/u8-normalize.c endif EXTRA_DIST += uninorm/normalize-internal.h uninorm/u-normalize-internal.h ## end gnulib module uninorm/u8-normalize ## begin gnulib module unistd BUILT_SOURCES += unistd.h libgl_la_SOURCES += unistd.c # We need the following in order to create an empty placeholder for # when the system doesn't have one. unistd.h: unistd.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(ARG_NONNULL_H) $(WARN_ON_USE_H) $(AM_V_GEN)rm -f $@-t $@ && \ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \ sed -e 's|@''GUARD_PREFIX''@|GL|g' \ -e 's|@''HAVE_UNISTD_H''@|$(HAVE_UNISTD_H)|g' \ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \ -e 's|@''NEXT_UNISTD_H''@|$(NEXT_UNISTD_H)|g' \ -e 's|@''WINDOWS_64_BIT_OFF_T''@|$(WINDOWS_64_BIT_OFF_T)|g' \ -e 's/@''GNULIB_ACCESS''@/$(GNULIB_ACCESS)/g' \ -e 's/@''GNULIB_CHDIR''@/$(GNULIB_CHDIR)/g' \ -e 's/@''GNULIB_CHOWN''@/$(GNULIB_CHOWN)/g' \ -e 's/@''GNULIB_CLOSE''@/$(GNULIB_CLOSE)/g' \ -e 's/@''GNULIB_COPY_FILE_RANGE''@/$(GNULIB_COPY_FILE_RANGE)/g' \ -e 's/@''GNULIB_DUP''@/$(GNULIB_DUP)/g' \ -e 's/@''GNULIB_DUP2''@/$(GNULIB_DUP2)/g' \ -e 's/@''GNULIB_DUP3''@/$(GNULIB_DUP3)/g' \ -e 's/@''GNULIB_ENVIRON''@/$(GNULIB_ENVIRON)/g' \ -e 's/@''GNULIB_EUIDACCESS''@/$(GNULIB_EUIDACCESS)/g' \ -e 's/@''GNULIB_FACCESSAT''@/$(GNULIB_FACCESSAT)/g' \ -e 's/@''GNULIB_FCHDIR''@/$(GNULIB_FCHDIR)/g' \ -e 's/@''GNULIB_FCHOWNAT''@/$(GNULIB_FCHOWNAT)/g' \ -e 's/@''GNULIB_FDATASYNC''@/$(GNULIB_FDATASYNC)/g' \ -e 's/@''GNULIB_FSYNC''@/$(GNULIB_FSYNC)/g' \ -e 's/@''GNULIB_FTRUNCATE''@/$(GNULIB_FTRUNCATE)/g' \ -e 's/@''GNULIB_GETCWD''@/$(GNULIB_GETCWD)/g' \ -e 's/@''GNULIB_GETDOMAINNAME''@/$(GNULIB_GETDOMAINNAME)/g' \ -e 's/@''GNULIB_GETDTABLESIZE''@/$(GNULIB_GETDTABLESIZE)/g' \ -e 's/@''GNULIB_GETENTROPY''@/$(GNULIB_GETENTROPY)/g' \ -e 's/@''GNULIB_GETGROUPS''@/$(GNULIB_GETGROUPS)/g' \ -e 's/@''GNULIB_GETHOSTNAME''@/$(GNULIB_GETHOSTNAME)/g' \ -e 's/@''GNULIB_GETLOGIN''@/$(GNULIB_GETLOGIN)/g' \ -e 's/@''GNULIB_GETLOGIN_R''@/$(GNULIB_GETLOGIN_R)/g' \ -e 's/@''GNULIB_GETOPT_POSIX''@/$(GNULIB_GETOPT_POSIX)/g' \ -e 's/@''GNULIB_GETPAGESIZE''@/$(GNULIB_GETPAGESIZE)/g' \ -e 's/@''GNULIB_GETPASS''@/$(GNULIB_GETPASS)/g' \ -e 's/@''GNULIB_GETUSERSHELL''@/$(GNULIB_GETUSERSHELL)/g' \ -e 's/@''GNULIB_GROUP_MEMBER''@/$(GNULIB_GROUP_MEMBER)/g' \ -e 's/@''GNULIB_ISATTY''@/$(GNULIB_ISATTY)/g' \ -e 's/@''GNULIB_LCHOWN''@/$(GNULIB_LCHOWN)/g' \ -e 's/@''GNULIB_LINK''@/$(GNULIB_LINK)/g' \ -e 's/@''GNULIB_LINKAT''@/$(GNULIB_LINKAT)/g' \ -e 's/@''GNULIB_LSEEK''@/$(GNULIB_LSEEK)/g' \ -e 's/@''GNULIB_PIPE''@/$(GNULIB_PIPE)/g' \ -e 's/@''GNULIB_PIPE2''@/$(GNULIB_PIPE2)/g' \ -e 's/@''GNULIB_PREAD''@/$(GNULIB_PREAD)/g' \ -e 's/@''GNULIB_PWRITE''@/$(GNULIB_PWRITE)/g' \ -e 's/@''GNULIB_READ''@/$(GNULIB_READ)/g' \ -e 's/@''GNULIB_READLINK''@/$(GNULIB_READLINK)/g' \ -e 's/@''GNULIB_READLINKAT''@/$(GNULIB_READLINKAT)/g' \ -e 's/@''GNULIB_RMDIR''@/$(GNULIB_RMDIR)/g' \ -e 's/@''GNULIB_SETHOSTNAME''@/$(GNULIB_SETHOSTNAME)/g' \ -e 's/@''GNULIB_SLEEP''@/$(GNULIB_SLEEP)/g' \ -e 's/@''GNULIB_SYMLINK''@/$(GNULIB_SYMLINK)/g' \ -e 's/@''GNULIB_SYMLINKAT''@/$(GNULIB_SYMLINKAT)/g' \ -e 's/@''GNULIB_TRUNCATE''@/$(GNULIB_TRUNCATE)/g' \ -e 's/@''GNULIB_TTYNAME_R''@/$(GNULIB_TTYNAME_R)/g' \ -e 's/@''GNULIB_UNISTD_H_GETOPT''@/0$(GNULIB_GL_UNISTD_H_GETOPT)/g' \ -e 's/@''GNULIB_UNISTD_H_NONBLOCKING''@/$(GNULIB_UNISTD_H_NONBLOCKING)/g' \ -e 's/@''GNULIB_UNISTD_H_SIGPIPE''@/$(GNULIB_UNISTD_H_SIGPIPE)/g' \ -e 's/@''GNULIB_UNLINK''@/$(GNULIB_UNLINK)/g' \ -e 's/@''GNULIB_UNLINKAT''@/$(GNULIB_UNLINKAT)/g' \ -e 's/@''GNULIB_USLEEP''@/$(GNULIB_USLEEP)/g' \ -e 's/@''GNULIB_WRITE''@/$(GNULIB_WRITE)/g' \ < $(srcdir)/unistd.in.h | \ sed -e 's|@''HAVE_CHOWN''@|$(HAVE_CHOWN)|g' \ -e 's|@''HAVE_COPY_FILE_RANGE''@|$(HAVE_COPY_FILE_RANGE)|g' \ -e 's|@''HAVE_DUP3''@|$(HAVE_DUP3)|g' \ -e 's|@''HAVE_EUIDACCESS''@|$(HAVE_EUIDACCESS)|g' \ -e 's|@''HAVE_FACCESSAT''@|$(HAVE_FACCESSAT)|g' \ -e 's|@''HAVE_FCHDIR''@|$(HAVE_FCHDIR)|g' \ -e 's|@''HAVE_FCHOWNAT''@|$(HAVE_FCHOWNAT)|g' \ -e 's|@''HAVE_FDATASYNC''@|$(HAVE_FDATASYNC)|g' \ -e 's|@''HAVE_FSYNC''@|$(HAVE_FSYNC)|g' \ -e 's|@''HAVE_FTRUNCATE''@|$(HAVE_FTRUNCATE)|g' \ -e 's|@''HAVE_GETDTABLESIZE''@|$(HAVE_GETDTABLESIZE)|g' \ -e 's|@''HAVE_GETENTROPY''@|$(HAVE_GETENTROPY)|g' \ -e 's|@''HAVE_GETGROUPS''@|$(HAVE_GETGROUPS)|g' \ -e 's|@''HAVE_GETHOSTNAME''@|$(HAVE_GETHOSTNAME)|g' \ -e 's|@''HAVE_GETPAGESIZE''@|$(HAVE_GETPAGESIZE)|g' \ -e 's|@''HAVE_GETPASS''@|$(HAVE_GETPASS)|g' \ -e 's|@''HAVE_GROUP_MEMBER''@|$(HAVE_GROUP_MEMBER)|g' \ -e 's|@''HAVE_LCHOWN''@|$(HAVE_LCHOWN)|g' \ -e 's|@''HAVE_LINK''@|$(HAVE_LINK)|g' \ -e 's|@''HAVE_LINKAT''@|$(HAVE_LINKAT)|g' \ -e 's|@''HAVE_PIPE''@|$(HAVE_PIPE)|g' \ -e 's|@''HAVE_PIPE2''@|$(HAVE_PIPE2)|g' \ -e 's|@''HAVE_PREAD''@|$(HAVE_PREAD)|g' \ -e 's|@''HAVE_PWRITE''@|$(HAVE_PWRITE)|g' \ -e 's|@''HAVE_READLINK''@|$(HAVE_READLINK)|g' \ -e 's|@''HAVE_READLINKAT''@|$(HAVE_READLINKAT)|g' \ -e 's|@''HAVE_SETHOSTNAME''@|$(HAVE_SETHOSTNAME)|g' \ -e 's|@''HAVE_SLEEP''@|$(HAVE_SLEEP)|g' \ -e 's|@''HAVE_SYMLINK''@|$(HAVE_SYMLINK)|g' \ -e 's|@''HAVE_SYMLINKAT''@|$(HAVE_SYMLINKAT)|g' \ -e 's|@''HAVE_UNLINKAT''@|$(HAVE_UNLINKAT)|g' \ -e 's|@''HAVE_USLEEP''@|$(HAVE_USLEEP)|g' \ -e 's|@''HAVE_DECL_ENVIRON''@|$(HAVE_DECL_ENVIRON)|g' \ -e 's|@''HAVE_DECL_FCHDIR''@|$(HAVE_DECL_FCHDIR)|g' \ -e 's|@''HAVE_DECL_FDATASYNC''@|$(HAVE_DECL_FDATASYNC)|g' \ -e 's|@''HAVE_DECL_GETDOMAINNAME''@|$(HAVE_DECL_GETDOMAINNAME)|g' \ -e 's|@''HAVE_DECL_GETLOGIN''@|$(HAVE_DECL_GETLOGIN)|g' \ -e 's|@''HAVE_DECL_GETLOGIN_R''@|$(HAVE_DECL_GETLOGIN_R)|g' \ -e 's|@''HAVE_DECL_GETPAGESIZE''@|$(HAVE_DECL_GETPAGESIZE)|g' \ -e 's|@''HAVE_DECL_GETUSERSHELL''@|$(HAVE_DECL_GETUSERSHELL)|g' \ -e 's|@''HAVE_DECL_SETHOSTNAME''@|$(HAVE_DECL_SETHOSTNAME)|g' \ -e 's|@''HAVE_DECL_TRUNCATE''@|$(HAVE_DECL_TRUNCATE)|g' \ -e 's|@''HAVE_DECL_TTYNAME_R''@|$(HAVE_DECL_TTYNAME_R)|g' \ -e 's|@''HAVE_OS_H''@|$(HAVE_OS_H)|g' \ -e 's|@''HAVE_SYS_PARAM_H''@|$(HAVE_SYS_PARAM_H)|g' \ | \ sed -e 's|@''REPLACE_ACCESS''@|$(REPLACE_ACCESS)|g' \ -e 's|@''REPLACE_CHOWN''@|$(REPLACE_CHOWN)|g' \ -e 's|@''REPLACE_CLOSE''@|$(REPLACE_CLOSE)|g' \ -e 's|@''REPLACE_DUP''@|$(REPLACE_DUP)|g' \ -e 's|@''REPLACE_DUP2''@|$(REPLACE_DUP2)|g' \ -e 's|@''REPLACE_FACCESSAT''@|$(REPLACE_FACCESSAT)|g' \ -e 's|@''REPLACE_FCHOWNAT''@|$(REPLACE_FCHOWNAT)|g' \ -e 's|@''REPLACE_FTRUNCATE''@|$(REPLACE_FTRUNCATE)|g' \ -e 's|@''REPLACE_GETCWD''@|$(REPLACE_GETCWD)|g' \ -e 's|@''REPLACE_GETDOMAINNAME''@|$(REPLACE_GETDOMAINNAME)|g' \ -e 's|@''REPLACE_GETDTABLESIZE''@|$(REPLACE_GETDTABLESIZE)|g' \ -e 's|@''REPLACE_GETLOGIN_R''@|$(REPLACE_GETLOGIN_R)|g' \ -e 's|@''REPLACE_GETGROUPS''@|$(REPLACE_GETGROUPS)|g' \ -e 's|@''REPLACE_GETPAGESIZE''@|$(REPLACE_GETPAGESIZE)|g' \ -e 's|@''REPLACE_GETPASS''@|$(REPLACE_GETPASS)|g' \ -e 's|@''REPLACE_ISATTY''@|$(REPLACE_ISATTY)|g' \ -e 's|@''REPLACE_LCHOWN''@|$(REPLACE_LCHOWN)|g' \ -e 's|@''REPLACE_LINK''@|$(REPLACE_LINK)|g' \ -e 's|@''REPLACE_LINKAT''@|$(REPLACE_LINKAT)|g' \ -e 's|@''REPLACE_LSEEK''@|$(REPLACE_LSEEK)|g' \ -e 's|@''REPLACE_PREAD''@|$(REPLACE_PREAD)|g' \ -e 's|@''REPLACE_PWRITE''@|$(REPLACE_PWRITE)|g' \ -e 's|@''REPLACE_READ''@|$(REPLACE_READ)|g' \ -e 's|@''REPLACE_READLINK''@|$(REPLACE_READLINK)|g' \ -e 's|@''REPLACE_READLINKAT''@|$(REPLACE_READLINKAT)|g' \ -e 's|@''REPLACE_RMDIR''@|$(REPLACE_RMDIR)|g' \ -e 's|@''REPLACE_SLEEP''@|$(REPLACE_SLEEP)|g' \ -e 's|@''REPLACE_SYMLINK''@|$(REPLACE_SYMLINK)|g' \ -e 's|@''REPLACE_SYMLINKAT''@|$(REPLACE_SYMLINKAT)|g' \ -e 's|@''REPLACE_TRUNCATE''@|$(REPLACE_TRUNCATE)|g' \ -e 's|@''REPLACE_TTYNAME_R''@|$(REPLACE_TTYNAME_R)|g' \ -e 's|@''REPLACE_UNLINK''@|$(REPLACE_UNLINK)|g' \ -e 's|@''REPLACE_UNLINKAT''@|$(REPLACE_UNLINKAT)|g' \ -e 's|@''REPLACE_USLEEP''@|$(REPLACE_USLEEP)|g' \ -e 's|@''REPLACE_WRITE''@|$(REPLACE_WRITE)|g' \ -e 's|@''UNISTD_H_HAVE_SYS_RANDOM_H''@|$(UNISTD_H_HAVE_SYS_RANDOM_H)|g' \ -e 's|@''UNISTD_H_HAVE_WINSOCK2_H''@|$(UNISTD_H_HAVE_WINSOCK2_H)|g' \ -e 's|@''UNISTD_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS''@|$(UNISTD_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS)|g' \ -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \ -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \ -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)'; \ } > $@-t && \ mv $@-t $@ MOSTLYCLEANFILES += unistd.h unistd.h-t EXTRA_DIST += unistd.in.h ## end gnulib module unistd ## begin gnulib module unistr/base BUILT_SOURCES += $(LIBUNISTRING_UNISTR_H) unistr.h: unistr.in.h $(AM_V_GEN)rm -f $@-t $@ && \ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \ cat $(srcdir)/unistr.in.h; \ } > $@-t && \ mv -f $@-t $@ MOSTLYCLEANFILES += unistr.h unistr.h-t EXTRA_DIST += unistr.in.h ## end gnulib module unistr/base ## begin gnulib module unistr/u8-check if LIBUNISTRING_COMPILE_UNISTR_U8_CHECK libgl_la_SOURCES += unistr/u8-check.c endif ## end gnulib module unistr/u8-check ## begin gnulib module unistr/u8-cmp if LIBUNISTRING_COMPILE_UNISTR_U8_CMP libgl_la_SOURCES += unistr/u8-cmp.c endif ## end gnulib module unistr/u8-cmp ## begin gnulib module unistr/u8-cmp2 if LIBUNISTRING_COMPILE_UNISTR_U8_CMP2 libgl_la_SOURCES += unistr/u8-cmp2.c endif EXTRA_DIST += unistr/u-cmp2.h ## end gnulib module unistr/u8-cmp2 ## begin gnulib module unistr/u8-cpy if LIBUNISTRING_COMPILE_UNISTR_U8_CPY libgl_la_SOURCES += unistr/u8-cpy.c endif EXTRA_DIST += unistr/u-cpy.h ## end gnulib module unistr/u8-cpy ## begin gnulib module unistr/u8-mblen if LIBUNISTRING_COMPILE_UNISTR_U8_MBLEN libgl_la_SOURCES += unistr/u8-mblen.c endif ## end gnulib module unistr/u8-mblen ## begin gnulib module unistr/u8-mbtouc if LIBUNISTRING_COMPILE_UNISTR_U8_MBTOUC libgl_la_SOURCES += unistr/u8-mbtouc.c unistr/u8-mbtouc-aux.c endif ## end gnulib module unistr/u8-mbtouc ## begin gnulib module unistr/u8-mbtouc-unsafe if LIBUNISTRING_COMPILE_UNISTR_U8_MBTOUC_UNSAFE libgl_la_SOURCES += unistr/u8-mbtouc-unsafe.c unistr/u8-mbtouc-unsafe-aux.c endif ## end gnulib module unistr/u8-mbtouc-unsafe ## begin gnulib module unistr/u8-mbtoucr if LIBUNISTRING_COMPILE_UNISTR_U8_MBTOUCR libgl_la_SOURCES += unistr/u8-mbtoucr.c endif ## end gnulib module unistr/u8-mbtoucr ## begin gnulib module unistr/u8-strlen if LIBUNISTRING_COMPILE_UNISTR_U8_STRLEN libgl_la_SOURCES += unistr/u8-strlen.c endif ## end gnulib module unistr/u8-strlen ## begin gnulib module unistr/u8-strmbtouc if LIBUNISTRING_COMPILE_UNISTR_U8_STRMBTOUC libgl_la_SOURCES += unistr/u8-strmbtouc.c endif ## end gnulib module unistr/u8-strmbtouc ## begin gnulib module unistr/u8-strncat if LIBUNISTRING_COMPILE_UNISTR_U8_STRNCAT libgl_la_SOURCES += unistr/u8-strncat.c endif ## end gnulib module unistr/u8-strncat ## begin gnulib module unistr/u8-uctomb if LIBUNISTRING_COMPILE_UNISTR_U8_UCTOMB libgl_la_SOURCES += unistr/u8-uctomb.c unistr/u8-uctomb-aux.c endif ## end gnulib module unistr/u8-uctomb ## begin gnulib module unitypes BUILT_SOURCES += $(LIBUNISTRING_UNITYPES_H) unitypes.h: unitypes.in.h $(AM_V_GEN)rm -f $@-t $@ && \ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \ cat $(srcdir)/unitypes.in.h; \ } > $@-t && \ mv -f $@-t $@ MOSTLYCLEANFILES += unitypes.h unitypes.h-t EXTRA_DIST += unitypes.in.h ## end gnulib module unitypes ## begin gnulib module uniwbrk/base BUILT_SOURCES += $(LIBUNISTRING_UNIWBRK_H) uniwbrk.h: uniwbrk.in.h $(AM_V_GEN)rm -f $@-t $@ && \ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \ cat $(srcdir)/uniwbrk.in.h; \ } > $@-t && \ mv -f $@-t $@ MOSTLYCLEANFILES += uniwbrk.h uniwbrk.h-t EXTRA_DIST += uniwbrk.in.h ## end gnulib module uniwbrk/base ## begin gnulib module uniwbrk/table libgl_la_SOURCES += uniwbrk/wbrktable.c EXTRA_DIST += uniwbrk/wbrktable.h ## end gnulib module uniwbrk/table ## begin gnulib module uniwbrk/u8-wordbreaks if LIBUNISTRING_COMPILE_UNIWBRK_U8_WORDBREAKS libgl_la_SOURCES += uniwbrk/u8-wordbreaks.c endif EXTRA_DIST += uniwbrk/u-wordbreaks.h ## end gnulib module uniwbrk/u8-wordbreaks ## begin gnulib module uniwbrk/wordbreak-property if LIBUNISTRING_COMPILE_UNIWBRK_WORDBREAK_PROPERTY libgl_la_SOURCES += uniwbrk/wordbreak-property.c endif EXTRA_DIST += uniwbrk/wbrkprop.h ## end gnulib module uniwbrk/wordbreak-property ## begin gnulib module uniwidth/base BUILT_SOURCES += $(LIBUNISTRING_UNIWIDTH_H) uniwidth.h: uniwidth.in.h $(AM_V_GEN)rm -f $@-t $@ && \ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \ cat $(srcdir)/uniwidth.in.h; \ } > $@-t && \ mv -f $@-t $@ MOSTLYCLEANFILES += uniwidth.h uniwidth.h-t EXTRA_DIST += localcharset.h uniwidth.in.h ## end gnulib module uniwidth/base ## begin gnulib module uniwidth/u8-strwidth if LIBUNISTRING_COMPILE_UNIWIDTH_U8_STRWIDTH libgl_la_SOURCES += uniwidth/u8-strwidth.c endif ## end gnulib module uniwidth/u8-strwidth ## begin gnulib module uniwidth/u8-width if LIBUNISTRING_COMPILE_UNIWIDTH_U8_WIDTH libgl_la_SOURCES += uniwidth/u8-width.c endif ## end gnulib module uniwidth/u8-width ## begin gnulib module uniwidth/width if LIBUNISTRING_COMPILE_UNIWIDTH_WIDTH libgl_la_SOURCES += uniwidth/width.c endif EXTRA_DIST += uniwidth/cjk.h ## end gnulib module uniwidth/width ## begin gnulib module unlocked-io EXTRA_DIST += unlocked-io.h ## end gnulib module unlocked-io ## begin gnulib module unsetenv EXTRA_DIST += unsetenv.c EXTRA_libgl_la_SOURCES += unsetenv.c ## end gnulib module unsetenv ## begin gnulib module vasnprintf EXTRA_DIST += asnprintf.c float+.h printf-args.c printf-args.h printf-parse.c printf-parse.h vasnprintf.c vasnprintf.h EXTRA_libgl_la_SOURCES += asnprintf.c printf-args.c printf-parse.c vasnprintf.c ## end gnulib module vasnprintf ## begin gnulib module vasprintf EXTRA_DIST += asprintf.c vasprintf.c EXTRA_libgl_la_SOURCES += asprintf.c vasprintf.c ## end gnulib module vasprintf ## begin gnulib module verify EXTRA_DIST += verify.h ## end gnulib module verify ## begin gnulib module version-etc libgl_la_SOURCES += version-etc.h version-etc.c ## end gnulib module version-etc ## begin gnulib module version-etc-fsf libgl_la_SOURCES += version-etc-fsf.c ## end gnulib module version-etc-fsf ## begin gnulib module vfprintf-posix EXTRA_DIST += vfprintf.c EXTRA_libgl_la_SOURCES += vfprintf.c ## end gnulib module vfprintf-posix ## begin gnulib module vprintf-posix EXTRA_DIST += vprintf.c EXTRA_libgl_la_SOURCES += vprintf.c ## end gnulib module vprintf-posix ## begin gnulib module vsnprintf EXTRA_DIST += vsnprintf.c EXTRA_libgl_la_SOURCES += vsnprintf.c ## end gnulib module vsnprintf ## begin gnulib module vsprintf-posix EXTRA_DIST += vsprintf.c EXTRA_libgl_la_SOURCES += vsprintf.c ## end gnulib module vsprintf-posix ## begin gnulib module wchar BUILT_SOURCES += wchar.h # We need the following in order to create when the system # version does not work standalone. wchar.h: wchar.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(ARG_NONNULL_H) $(WARN_ON_USE_H) $(AM_V_GEN)rm -f $@-t $@ && \ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \ sed -e 's|@''GUARD_PREFIX''@|GL|g' \ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \ -e 's|@''HAVE_FEATURES_H''@|$(HAVE_FEATURES_H)|g' \ -e 's|@''NEXT_WCHAR_H''@|$(NEXT_WCHAR_H)|g' \ -e 's|@''HAVE_WCHAR_H''@|$(HAVE_WCHAR_H)|g' \ -e 's/@''HAVE_CRTDEFS_H''@/$(HAVE_CRTDEFS_H)/g' \ -e 's/@''GNULIB_OVERRIDES_WINT_T''@/$(GNULIB_OVERRIDES_WINT_T)/g' \ -e 's/@''GNULIB_BTOWC''@/$(GNULIB_BTOWC)/g' \ -e 's/@''GNULIB_WCTOB''@/$(GNULIB_WCTOB)/g' \ -e 's/@''GNULIB_MBSINIT''@/$(GNULIB_MBSINIT)/g' \ -e 's/@''GNULIB_MBRTOWC''@/$(GNULIB_MBRTOWC)/g' \ -e 's/@''GNULIB_MBRLEN''@/$(GNULIB_MBRLEN)/g' \ -e 's/@''GNULIB_MBSRTOWCS''@/$(GNULIB_MBSRTOWCS)/g' \ -e 's/@''GNULIB_MBSNRTOWCS''@/$(GNULIB_MBSNRTOWCS)/g' \ -e 's/@''GNULIB_WCRTOMB''@/$(GNULIB_WCRTOMB)/g' \ -e 's/@''GNULIB_WCSRTOMBS''@/$(GNULIB_WCSRTOMBS)/g' \ -e 's/@''GNULIB_WCSNRTOMBS''@/$(GNULIB_WCSNRTOMBS)/g' \ -e 's/@''GNULIB_WCWIDTH''@/$(GNULIB_WCWIDTH)/g' \ -e 's/@''GNULIB_WMEMCHR''@/$(GNULIB_WMEMCHR)/g' \ -e 's/@''GNULIB_WMEMCMP''@/$(GNULIB_WMEMCMP)/g' \ -e 's/@''GNULIB_WMEMCPY''@/$(GNULIB_WMEMCPY)/g' \ -e 's/@''GNULIB_WMEMMOVE''@/$(GNULIB_WMEMMOVE)/g' \ -e 's/@''GNULIB_WMEMPCPY''@/$(GNULIB_WMEMPCPY)/g' \ -e 's/@''GNULIB_WMEMSET''@/$(GNULIB_WMEMSET)/g' \ -e 's/@''GNULIB_WCSLEN''@/$(GNULIB_WCSLEN)/g' \ -e 's/@''GNULIB_WCSNLEN''@/$(GNULIB_WCSNLEN)/g' \ -e 's/@''GNULIB_WCSCPY''@/$(GNULIB_WCSCPY)/g' \ -e 's/@''GNULIB_WCPCPY''@/$(GNULIB_WCPCPY)/g' \ -e 's/@''GNULIB_WCSNCPY''@/$(GNULIB_WCSNCPY)/g' \ -e 's/@''GNULIB_WCPNCPY''@/$(GNULIB_WCPNCPY)/g' \ -e 's/@''GNULIB_WCSCAT''@/$(GNULIB_WCSCAT)/g' \ -e 's/@''GNULIB_WCSNCAT''@/$(GNULIB_WCSNCAT)/g' \ -e 's/@''GNULIB_WCSCMP''@/$(GNULIB_WCSCMP)/g' \ -e 's/@''GNULIB_WCSNCMP''@/$(GNULIB_WCSNCMP)/g' \ -e 's/@''GNULIB_WCSCASECMP''@/$(GNULIB_WCSCASECMP)/g' \ -e 's/@''GNULIB_WCSNCASECMP''@/$(GNULIB_WCSNCASECMP)/g' \ -e 's/@''GNULIB_WCSCOLL''@/$(GNULIB_WCSCOLL)/g' \ -e 's/@''GNULIB_WCSXFRM''@/$(GNULIB_WCSXFRM)/g' \ -e 's/@''GNULIB_WCSDUP''@/$(GNULIB_WCSDUP)/g' \ -e 's/@''GNULIB_WCSCHR''@/$(GNULIB_WCSCHR)/g' \ -e 's/@''GNULIB_WCSRCHR''@/$(GNULIB_WCSRCHR)/g' \ -e 's/@''GNULIB_WCSCSPN''@/$(GNULIB_WCSCSPN)/g' \ -e 's/@''GNULIB_WCSSPN''@/$(GNULIB_WCSSPN)/g' \ -e 's/@''GNULIB_WCSPBRK''@/$(GNULIB_WCSPBRK)/g' \ -e 's/@''GNULIB_WCSSTR''@/$(GNULIB_WCSSTR)/g' \ -e 's/@''GNULIB_WCSTOK''@/$(GNULIB_WCSTOK)/g' \ -e 's/@''GNULIB_WCSWIDTH''@/$(GNULIB_WCSWIDTH)/g' \ -e 's/@''GNULIB_WCSFTIME''@/$(GNULIB_WCSFTIME)/g' \ < $(srcdir)/wchar.in.h | \ sed -e 's|@''HAVE_WINT_T''@|$(HAVE_WINT_T)|g' \ -e 's|@''HAVE_BTOWC''@|$(HAVE_BTOWC)|g' \ -e 's|@''HAVE_MBSINIT''@|$(HAVE_MBSINIT)|g' \ -e 's|@''HAVE_MBRTOWC''@|$(HAVE_MBRTOWC)|g' \ -e 's|@''HAVE_MBRLEN''@|$(HAVE_MBRLEN)|g' \ -e 's|@''HAVE_MBSRTOWCS''@|$(HAVE_MBSRTOWCS)|g' \ -e 's|@''HAVE_MBSNRTOWCS''@|$(HAVE_MBSNRTOWCS)|g' \ -e 's|@''HAVE_WCRTOMB''@|$(HAVE_WCRTOMB)|g' \ -e 's|@''HAVE_WCSRTOMBS''@|$(HAVE_WCSRTOMBS)|g' \ -e 's|@''HAVE_WCSNRTOMBS''@|$(HAVE_WCSNRTOMBS)|g' \ -e 's|@''HAVE_WMEMCHR''@|$(HAVE_WMEMCHR)|g' \ -e 's|@''HAVE_WMEMCMP''@|$(HAVE_WMEMCMP)|g' \ -e 's|@''HAVE_WMEMCPY''@|$(HAVE_WMEMCPY)|g' \ -e 's|@''HAVE_WMEMMOVE''@|$(HAVE_WMEMMOVE)|g' \ -e 's|@''HAVE_WMEMPCPY''@|$(HAVE_WMEMPCPY)|g' \ -e 's|@''HAVE_WMEMSET''@|$(HAVE_WMEMSET)|g' \ -e 's|@''HAVE_WCSLEN''@|$(HAVE_WCSLEN)|g' \ -e 's|@''HAVE_WCSNLEN''@|$(HAVE_WCSNLEN)|g' \ -e 's|@''HAVE_WCSCPY''@|$(HAVE_WCSCPY)|g' \ -e 's|@''HAVE_WCPCPY''@|$(HAVE_WCPCPY)|g' \ -e 's|@''HAVE_WCSNCPY''@|$(HAVE_WCSNCPY)|g' \ -e 's|@''HAVE_WCPNCPY''@|$(HAVE_WCPNCPY)|g' \ -e 's|@''HAVE_WCSCAT''@|$(HAVE_WCSCAT)|g' \ -e 's|@''HAVE_WCSNCAT''@|$(HAVE_WCSNCAT)|g' \ -e 's|@''HAVE_WCSCMP''@|$(HAVE_WCSCMP)|g' \ -e 's|@''HAVE_WCSNCMP''@|$(HAVE_WCSNCMP)|g' \ -e 's|@''HAVE_WCSCASECMP''@|$(HAVE_WCSCASECMP)|g' \ -e 's|@''HAVE_WCSNCASECMP''@|$(HAVE_WCSNCASECMP)|g' \ -e 's|@''HAVE_WCSCOLL''@|$(HAVE_WCSCOLL)|g' \ -e 's|@''HAVE_WCSXFRM''@|$(HAVE_WCSXFRM)|g' \ -e 's|@''HAVE_WCSDUP''@|$(HAVE_WCSDUP)|g' \ -e 's|@''HAVE_WCSCHR''@|$(HAVE_WCSCHR)|g' \ -e 's|@''HAVE_WCSRCHR''@|$(HAVE_WCSRCHR)|g' \ -e 's|@''HAVE_WCSCSPN''@|$(HAVE_WCSCSPN)|g' \ -e 's|@''HAVE_WCSSPN''@|$(HAVE_WCSSPN)|g' \ -e 's|@''HAVE_WCSPBRK''@|$(HAVE_WCSPBRK)|g' \ -e 's|@''HAVE_WCSSTR''@|$(HAVE_WCSSTR)|g' \ -e 's|@''HAVE_WCSTOK''@|$(HAVE_WCSTOK)|g' \ -e 's|@''HAVE_WCSWIDTH''@|$(HAVE_WCSWIDTH)|g' \ -e 's|@''HAVE_WCSFTIME''@|$(HAVE_WCSFTIME)|g' \ -e 's|@''HAVE_DECL_WCTOB''@|$(HAVE_DECL_WCTOB)|g' \ -e 's|@''HAVE_DECL_WCWIDTH''@|$(HAVE_DECL_WCWIDTH)|g' \ | \ sed -e 's|@''REPLACE_MBSTATE_T''@|$(REPLACE_MBSTATE_T)|g' \ -e 's|@''REPLACE_BTOWC''@|$(REPLACE_BTOWC)|g' \ -e 's|@''REPLACE_WCTOB''@|$(REPLACE_WCTOB)|g' \ -e 's|@''REPLACE_MBSINIT''@|$(REPLACE_MBSINIT)|g' \ -e 's|@''REPLACE_MBRTOWC''@|$(REPLACE_MBRTOWC)|g' \ -e 's|@''REPLACE_MBRLEN''@|$(REPLACE_MBRLEN)|g' \ -e 's|@''REPLACE_MBSRTOWCS''@|$(REPLACE_MBSRTOWCS)|g' \ -e 's|@''REPLACE_MBSNRTOWCS''@|$(REPLACE_MBSNRTOWCS)|g' \ -e 's|@''REPLACE_WCRTOMB''@|$(REPLACE_WCRTOMB)|g' \ -e 's|@''REPLACE_WCSRTOMBS''@|$(REPLACE_WCSRTOMBS)|g' \ -e 's|@''REPLACE_WCSNRTOMBS''@|$(REPLACE_WCSNRTOMBS)|g' \ -e 's|@''REPLACE_WCWIDTH''@|$(REPLACE_WCWIDTH)|g' \ -e 's|@''REPLACE_WCSWIDTH''@|$(REPLACE_WCSWIDTH)|g' \ -e 's|@''REPLACE_WCSFTIME''@|$(REPLACE_WCSFTIME)|g' \ -e 's|@''REPLACE_WCSTOK''@|$(REPLACE_WCSTOK)|g' \ -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \ -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \ -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)'; \ } > $@-t && \ mv $@-t $@ MOSTLYCLEANFILES += wchar.h wchar.h-t EXTRA_DIST += wchar.in.h ## end gnulib module wchar ## begin gnulib module wcrtomb EXTRA_DIST += wcrtomb.c EXTRA_libgl_la_SOURCES += wcrtomb.c ## end gnulib module wcrtomb ## begin gnulib module wctype-h BUILT_SOURCES += wctype.h libgl_la_SOURCES += wctype-h.c # We need the following in order to create when the system # doesn't have one that works with the given compiler. wctype.h: wctype.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(WARN_ON_USE_H) $(AM_V_GEN)rm -f $@-t $@ && \ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \ sed -e 's|@''GUARD_PREFIX''@|GL|g' \ -e 's/@''HAVE_WCTYPE_H''@/$(HAVE_WCTYPE_H)/g' \ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \ -e 's|@''NEXT_WCTYPE_H''@|$(NEXT_WCTYPE_H)|g' \ -e 's/@''HAVE_CRTDEFS_H''@/$(HAVE_CRTDEFS_H)/g' \ -e 's/@''GNULIB_OVERRIDES_WINT_T''@/$(GNULIB_OVERRIDES_WINT_T)/g' \ -e 's/@''GNULIB_ISWBLANK''@/$(GNULIB_ISWBLANK)/g' \ -e 's/@''GNULIB_ISWDIGIT''@/$(GNULIB_ISWDIGIT)/g' \ -e 's/@''GNULIB_ISWXDIGIT''@/$(GNULIB_ISWXDIGIT)/g' \ -e 's/@''GNULIB_WCTYPE''@/$(GNULIB_WCTYPE)/g' \ -e 's/@''GNULIB_ISWCTYPE''@/$(GNULIB_ISWCTYPE)/g' \ -e 's/@''GNULIB_WCTRANS''@/$(GNULIB_WCTRANS)/g' \ -e 's/@''GNULIB_TOWCTRANS''@/$(GNULIB_TOWCTRANS)/g' \ -e 's/@''HAVE_ISWBLANK''@/$(HAVE_ISWBLANK)/g' \ -e 's/@''HAVE_ISWCNTRL''@/$(HAVE_ISWCNTRL)/g' \ -e 's/@''HAVE_WCTYPE_T''@/$(HAVE_WCTYPE_T)/g' \ -e 's/@''HAVE_WCTRANS_T''@/$(HAVE_WCTRANS_T)/g' \ -e 's/@''HAVE_WINT_T''@/$(HAVE_WINT_T)/g' \ -e 's/@''REPLACE_ISWBLANK''@/$(REPLACE_ISWBLANK)/g' \ -e 's/@''REPLACE_ISWDIGIT''@/$(REPLACE_ISWDIGIT)/g' \ -e 's/@''REPLACE_ISWXDIGIT''@/$(REPLACE_ISWXDIGIT)/g' \ -e 's/@''REPLACE_ISWCNTRL''@/$(REPLACE_ISWCNTRL)/g' \ -e 's/@''REPLACE_TOWLOWER''@/$(REPLACE_TOWLOWER)/g' \ -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \ -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \ < $(srcdir)/wctype.in.h; \ } > $@-t && \ mv $@-t $@ MOSTLYCLEANFILES += wctype.h wctype.h-t EXTRA_DIST += wctype.in.h ## end gnulib module wctype-h ## begin gnulib module wcwidth EXTRA_DIST += wcwidth.c EXTRA_libgl_la_SOURCES += wcwidth.c ## end gnulib module wcwidth ## begin gnulib module windows-mutex EXTRA_DIST += windows-initguard.h windows-mutex.c windows-mutex.h EXTRA_libgl_la_SOURCES += windows-mutex.c ## end gnulib module windows-mutex ## begin gnulib module windows-once EXTRA_DIST += windows-once.c windows-once.h EXTRA_libgl_la_SOURCES += windows-once.c ## end gnulib module windows-once ## begin gnulib module windows-recmutex EXTRA_DIST += windows-initguard.h windows-recmutex.c windows-recmutex.h EXTRA_libgl_la_SOURCES += windows-recmutex.c ## end gnulib module windows-recmutex ## begin gnulib module windows-rwlock EXTRA_DIST += windows-initguard.h windows-rwlock.c windows-rwlock.h EXTRA_libgl_la_SOURCES += windows-rwlock.c ## end gnulib module windows-rwlock ## begin gnulib module windows-spin EXTRA_DIST += windows-spin.c windows-spin.h EXTRA_libgl_la_SOURCES += windows-spin.c ## end gnulib module windows-spin ## begin gnulib module write EXTRA_DIST += write.c EXTRA_libgl_la_SOURCES += write.c ## end gnulib module write ## begin gnulib module xalloc libgl_la_SOURCES += xmalloc.c EXTRA_DIST += xalloc.h ## end gnulib module xalloc ## begin gnulib module xalloc-die libgl_la_SOURCES += xalloc-die.c EXTRA_DIST += xalloc.h ## end gnulib module xalloc-die ## begin gnulib module xalloc-oversized EXTRA_DIST += xalloc-oversized.h ## end gnulib module xalloc-oversized ## begin gnulib module xbinary-io libgl_la_SOURCES += xbinary-io.h xbinary-io.c ## end gnulib module xbinary-io ## begin gnulib module xlist libgl_la_SOURCES += gl_xlist.h gl_xlist.c ## end gnulib module xlist ## begin gnulib module xmalloca libgl_la_SOURCES += xmalloca.c EXTRA_DIST += xmalloca.h ## end gnulib module xmalloca ## begin gnulib module xmemdup0 libgl_la_SOURCES += xmemdup0.h xmemdup0.c ## end gnulib module xmemdup0 ## begin gnulib module xreadlink libgl_la_SOURCES += xreadlink.c EXTRA_DIST += xreadlink.h ## end gnulib module xreadlink ## begin gnulib module xsize libgl_la_SOURCES += xsize.h xsize.c ## end gnulib module xsize ## begin gnulib module xstrndup libgl_la_SOURCES += xstrndup.h xstrndup.c ## end gnulib module xstrndup ## begin gnulib module xvasprintf libgl_la_SOURCES += xvasprintf.h xvasprintf.c xasprintf.c EXTRA_DIST += xalloc.h ## end gnulib module xvasprintf mostlyclean-local: mostlyclean-generic @for dir in '' $(MOSTLYCLEANDIRS); do \ if test -n "$$dir" && test -d $$dir; then \ echo "rmdir $$dir"; rmdir $$dir; \ fi; \ done; \ : pspp-1.4.1/gl/dtoastr.c0000644000175000017500000000004613723215636014351 0ustar00blpblp00000000000000#define LENGTH 2 #include "ftoastr.c" pspp-1.4.1/gl/memchr2.c0000644000175000017500000001447113723215637014236 0ustar00blpblp00000000000000/* Copyright (C) 1991, 1993, 1996-1997, 1999-2000, 2003-2004, 2006, 2008-2020 Free Software Foundation, Inc. Based on strlen implementation by Torbjorn Granlund (tege@sics.se), with help from Dan Sahlin (dan@sics.se) and commentary by Jim Blandy (jimb@ai.mit.edu); adaptation to memchr suggested by Dick Karpinski (dick@cca.ucsf.edu), and implemented in glibc by Roland McGrath (roland@ai.mit.edu). Extension to memchr2 implemented by Eric Blake (ebb9@byu.net). 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 3 of the License, or 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, see . */ #include #include "memchr2.h" #include #include #include /* Return the first address of either C1 or C2 (treated as unsigned char) that occurs within N bytes of the memory region S. If neither byte appears, return NULL. */ void * memchr2 (void const *s, int c1_in, int c2_in, size_t n) { /* On 32-bit hardware, choosing longword to be a 32-bit unsigned long instead of a 64-bit uintmax_t tends to give better performance. On 64-bit hardware, unsigned long is generally 64 bits already. Change this typedef to experiment with performance. */ typedef unsigned long int longword; const unsigned char *char_ptr; void const *void_ptr; const longword *longword_ptr; longword repeated_one; longword repeated_c1; longword repeated_c2; unsigned char c1; unsigned char c2; c1 = (unsigned char) c1_in; c2 = (unsigned char) c2_in; if (c1 == c2) return memchr (s, c1, n); /* Handle the first few bytes by reading one byte at a time. Do this until VOID_PTR is aligned on a longword boundary. */ for (void_ptr = s; n > 0 && (uintptr_t) void_ptr % sizeof (longword) != 0; --n) { char_ptr = void_ptr; if (*char_ptr == c1 || *char_ptr == c2) return (void *) void_ptr; void_ptr = char_ptr + 1; } longword_ptr = void_ptr; /* All these elucidatory comments refer to 4-byte longwords, but the theory applies equally well to any size longwords. */ /* Compute auxiliary longword values: repeated_one is a value which has a 1 in every byte. repeated_c1 has c1 in every byte. repeated_c2 has c2 in every byte. */ repeated_one = 0x01010101; repeated_c1 = c1 | (c1 << 8); repeated_c2 = c2 | (c2 << 8); repeated_c1 |= repeated_c1 << 16; repeated_c2 |= repeated_c2 << 16; if (0xffffffffU < (longword) -1) { repeated_one |= repeated_one << 31 << 1; repeated_c1 |= repeated_c1 << 31 << 1; repeated_c2 |= repeated_c2 << 31 << 1; if (8 < sizeof (longword)) { size_t i; for (i = 64; i < sizeof (longword) * 8; i *= 2) { repeated_one |= repeated_one << i; repeated_c1 |= repeated_c1 << i; repeated_c2 |= repeated_c2 << i; } } } /* Instead of the traditional loop which tests each byte, we will test a longword at a time. The tricky part is testing if *any of the four* bytes in the longword in question are equal to c1 or c2. We first use an xor with repeated_c1 and repeated_c2, respectively. This reduces the task to testing whether *any of the four* bytes in longword1 or longword2 is zero. Let's consider longword1. We compute tmp1 = ((longword1 - repeated_one) & ~longword1) & (repeated_one << 7). That is, we perform the following operations: 1. Subtract repeated_one. 2. & ~longword1. 3. & a mask consisting of 0x80 in every byte. Consider what happens in each byte: - If a byte of longword1 is zero, step 1 and 2 transform it into 0xff, and step 3 transforms it into 0x80. A carry can also be propagated to more significant bytes. - If a byte of longword1 is nonzero, let its lowest 1 bit be at position k (0 <= k <= 7); so the lowest k bits are 0. After step 1, the byte ends in a single bit of value 0 and k bits of value 1. After step 2, the result is just k bits of value 1: 2^k - 1. After step 3, the result is 0. And no carry is produced. So, if longword1 has only non-zero bytes, tmp1 is zero. Whereas if longword1 has a zero byte, call j the position of the least significant zero byte. Then the result has a zero at positions 0, ..., j-1 and a 0x80 at position j. We cannot predict the result at the more significant bytes (positions j+1..3), but it does not matter since we already have a non-zero bit at position 8*j+7. Similarly, we compute tmp2 = ((longword2 - repeated_one) & ~longword2) & (repeated_one << 7). The test whether any byte in longword1 or longword2 is zero is equivalent to testing whether tmp1 is nonzero or tmp2 is nonzero. We can combine this into a single test, whether (tmp1 | tmp2) is nonzero. */ while (n >= sizeof (longword)) { longword longword1 = *longword_ptr ^ repeated_c1; longword longword2 = *longword_ptr ^ repeated_c2; if (((((longword1 - repeated_one) & ~longword1) | ((longword2 - repeated_one) & ~longword2)) & (repeated_one << 7)) != 0) break; longword_ptr++; n -= sizeof (longword); } char_ptr = (const unsigned char *) longword_ptr; /* At this point, we know that either n < sizeof (longword), or one of the sizeof (longword) bytes starting at char_ptr is == c1 or == c2. On little-endian machines, we could determine the first such byte without any further memory accesses, just by looking at the (tmp1 | tmp2) result from the last loop iteration. But this does not work on big-endian machines. Choose code that works in both cases. */ for (; n > 0; --n, ++char_ptr) { if (*char_ptr == c1 || *char_ptr == c2) return (void *) char_ptr; } return NULL; } pspp-1.4.1/gl/sig-handler.c0000644000175000017500000000013213723215640015055 0ustar00blpblp00000000000000#include #define SIG_HANDLER_INLINE _GL_EXTERN_INLINE #include "sig-handler.h" pspp-1.4.1/gl/stddef.in.h0000644000175000017500000001011113723215640014541 0ustar00blpblp00000000000000/* A substitute for POSIX 2008 , for platforms that have issues. Copyright (C) 2009-2020 Free Software Foundation, Inc. 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 3, 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, see . */ /* Written by Eric Blake. */ /* * POSIX 2008 for platforms that have issues. * */ #if __GNUC__ >= 3 @PRAGMA_SYSTEM_HEADER@ #endif @PRAGMA_COLUMNS@ #if defined __need_wchar_t || defined __need_size_t \ || defined __need_ptrdiff_t || defined __need_NULL \ || defined __need_wint_t /* Special invocation convention inside gcc header files. In particular, gcc provides a version of that blindly redefines NULL even when __need_wint_t was defined, even though wint_t is not normally provided by . Hence, we must remember if special invocation has ever been used to obtain wint_t, in which case we need to clean up NULL yet again. */ # if !(defined _@GUARD_PREFIX@_STDDEF_H && defined _GL_STDDEF_WINT_T) # ifdef __need_wint_t # define _GL_STDDEF_WINT_T # endif # @INCLUDE_NEXT@ @NEXT_STDDEF_H@ # endif #else /* Normal invocation convention. */ # ifndef _@GUARD_PREFIX@_STDDEF_H /* The include_next requires a split double-inclusion guard. */ # @INCLUDE_NEXT@ @NEXT_STDDEF_H@ /* On NetBSD 5.0, the definition of NULL lacks proper parentheses. */ # if (@REPLACE_NULL@ \ && (!defined _@GUARD_PREFIX@_STDDEF_H || defined _GL_STDDEF_WINT_T)) # undef NULL # ifdef __cplusplus /* ISO C++ says that the macro NULL must expand to an integer constant expression, hence '((void *) 0)' is not allowed in C++. */ # if __GNUG__ >= 3 /* GNU C++ has a __null macro that behaves like an integer ('int' or 'long') but has the same size as a pointer. Use that, to avoid warnings. */ # define NULL __null # else # define NULL 0L # endif # else # define NULL ((void *) 0) # endif # endif # ifndef _@GUARD_PREFIX@_STDDEF_H # define _@GUARD_PREFIX@_STDDEF_H /* Some platforms lack wchar_t. */ #if !@HAVE_WCHAR_T@ # define wchar_t int #endif /* Some platforms lack max_align_t. The check for _GCC_MAX_ALIGN_T is a hack in case the configure-time test was done with g++ even though we are currently compiling with gcc. On MSVC, max_align_t is defined only in C++ mode, after was included. Its definition is good since it has an alignment of 8 (on x86 and x86_64). */ #if defined _MSC_VER && defined __cplusplus # include #else # if ! (@HAVE_MAX_ALIGN_T@ || defined _GCC_MAX_ALIGN_T) # if !GNULIB_defined_max_align_t /* On the x86, the maximum storage alignment of double, long, etc. is 4, but GCC's C11 ABI for x86 says that max_align_t has an alignment of 8, and the C11 standard allows this. Work around this problem by using __alignof__ (which returns 8 for double) rather than _Alignof (which returns 4), and align each union member accordingly. */ # ifdef __GNUC__ # define _GL_STDDEF_ALIGNAS(type) \ __attribute__ ((__aligned__ (__alignof__ (type)))) # else # define _GL_STDDEF_ALIGNAS(type) /* */ # endif typedef union { char *__p _GL_STDDEF_ALIGNAS (char *); double __d _GL_STDDEF_ALIGNAS (double); long double __ld _GL_STDDEF_ALIGNAS (long double); long int __i _GL_STDDEF_ALIGNAS (long int); } rpl_max_align_t; # define max_align_t rpl_max_align_t # define GNULIB_defined_max_align_t 1 # endif # endif #endif # endif /* _@GUARD_PREFIX@_STDDEF_H */ # endif /* _@GUARD_PREFIX@_STDDEF_H */ #endif /* __need_XXX */ pspp-1.4.1/gl/isnanl.c0000644000175000017500000000152613723215637014162 0ustar00blpblp00000000000000/* Test for NaN that does not need libm. Copyright (C) 2007, 2009-2020 Free Software Foundation, Inc. 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 3 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, see . */ /* Written by Bruno Haible , 2007. */ #define USE_LONG_DOUBLE #include "isnan.c" pspp-1.4.1/gl/full-read.c0000644000175000017500000000150113723215636014541 0ustar00blpblp00000000000000/* An interface to read that retries after partial reads and interrupts. Copyright (C) 2002-2003, 2009-2020 Free Software Foundation, Inc. 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 3 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, see . */ #define FULL_READ #include "full-write.c" pspp-1.4.1/gl/unicase.in.h0000644000175000017500000005025113723215640014730 0ustar00blpblp00000000000000/* Unicode character case mappings. Copyright (C) 2002, 2009-2020 Free Software Foundation, Inc. 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 3 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, see . */ #ifndef _UNICASE_H #define _UNICASE_H #include "unitypes.h" /* Get bool. */ #include /* Get size_t. */ #include /* Get uninorm_t. */ #include "uninorm.h" #ifdef __cplusplus extern "C" { #endif /* ========================================================================= */ /* Character case mappings. These mappings are locale and context independent. WARNING! These functions are not sufficient for languages such as German. Better use the functions below that treat an entire string at once and are language aware. */ /* Return the uppercase mapping of a Unicode character. */ extern ucs4_t uc_toupper (ucs4_t uc) _UC_ATTRIBUTE_CONST; /* Return the lowercase mapping of a Unicode character. */ extern ucs4_t uc_tolower (ucs4_t uc) _UC_ATTRIBUTE_CONST; /* Return the titlecase mapping of a Unicode character. */ extern ucs4_t uc_totitle (ucs4_t uc) _UC_ATTRIBUTE_CONST; /* ========================================================================= */ /* String case mappings. */ /* These functions are locale dependent. The iso639_language argument identifies the language (e.g. "tr" for Turkish). NULL means to use locale independent case mappings. */ /* Return the ISO 639 language code of the current locale. Return "" if it is unknown, or in the "C" locale. */ extern const char * uc_locale_language (void) _UC_ATTRIBUTE_PURE; /* Conventions: All functions prefixed with u8_ operate on UTF-8 encoded strings. Their unit is an uint8_t (1 byte). All functions prefixed with u16_ operate on UTF-16 encoded strings. Their unit is an uint16_t (a 2-byte word). All functions prefixed with u32_ operate on UCS-4 encoded strings. Their unit is an uint32_t (a 4-byte word). All argument pairs (s, n) denote a Unicode string s[0..n-1] with exactly n units. Functions returning a string result take a (resultbuf, lengthp) argument pair. If resultbuf is not NULL and the result fits into *lengthp units, it is put in resultbuf, and resultbuf is returned. Otherwise, a freshly allocated string is returned. In both cases, *lengthp is set to the length (number of units) of the returned string. In case of error, NULL is returned and errno is set. */ /* Return the uppercase mapping of a string. The nf argument identifies the normalization form to apply after the case-mapping. It can also be NULL, for no normalization. */ extern uint8_t * u8_toupper (const uint8_t *s, size_t n, const char *iso639_language, uninorm_t nf, uint8_t *_UC_RESTRICT resultbuf, size_t *lengthp); extern uint16_t * u16_toupper (const uint16_t *s, size_t n, const char *iso639_language, uninorm_t nf, uint16_t *_UC_RESTRICT resultbuf, size_t *lengthp); extern uint32_t * u32_toupper (const uint32_t *s, size_t n, const char *iso639_language, uninorm_t nf, uint32_t *_UC_RESTRICT resultbuf, size_t *lengthp); /* Return the lowercase mapping of a string. The nf argument identifies the normalization form to apply after the case-mapping. It can also be NULL, for no normalization. */ extern uint8_t * u8_tolower (const uint8_t *s, size_t n, const char *iso639_language, uninorm_t nf, uint8_t *_UC_RESTRICT resultbuf, size_t *lengthp); extern uint16_t * u16_tolower (const uint16_t *s, size_t n, const char *iso639_language, uninorm_t nf, uint16_t *_UC_RESTRICT resultbuf, size_t *lengthp); extern uint32_t * u32_tolower (const uint32_t *s, size_t n, const char *iso639_language, uninorm_t nf, uint32_t *_UC_RESTRICT resultbuf, size_t *lengthp); /* Return the titlecase mapping of a string. The nf argument identifies the normalization form to apply after the case-mapping. It can also be NULL, for no normalization. */ extern uint8_t * u8_totitle (const uint8_t *s, size_t n, const char *iso639_language, uninorm_t nf, uint8_t *_UC_RESTRICT resultbuf, size_t *lengthp); extern uint16_t * u16_totitle (const uint16_t *s, size_t n, const char *iso639_language, uninorm_t nf, uint16_t *_UC_RESTRICT resultbuf, size_t *lengthp); extern uint32_t * u32_totitle (const uint32_t *s, size_t n, const char *iso639_language, uninorm_t nf, uint32_t *_UC_RESTRICT resultbuf, size_t *lengthp); /* The case-mapping context given by a prefix string. */ typedef struct casing_prefix_context { /* These fields are private, undocumented. */ uint32_t last_char_except_ignorable; uint32_t last_char_normal_or_above; } casing_prefix_context_t; /* The case-mapping context of the empty prefix string. */ extern const casing_prefix_context_t unicase_empty_prefix_context; /* Return the case-mapping context of a given prefix string. */ extern casing_prefix_context_t u8_casing_prefix_context (const uint8_t *s, size_t n); extern casing_prefix_context_t u16_casing_prefix_context (const uint16_t *s, size_t n); extern casing_prefix_context_t u32_casing_prefix_context (const uint32_t *s, size_t n); /* Return the case-mapping context of the prefix concat(A, S), given the case-mapping context of the prefix A. */ extern casing_prefix_context_t u8_casing_prefixes_context (const uint8_t *s, size_t n, casing_prefix_context_t a_context); extern casing_prefix_context_t u16_casing_prefixes_context (const uint16_t *s, size_t n, casing_prefix_context_t a_context); extern casing_prefix_context_t u32_casing_prefixes_context (const uint32_t *s, size_t n, casing_prefix_context_t a_context); /* The case-mapping context given by a suffix string. */ typedef struct casing_suffix_context { /* These fields are private, undocumented. */ uint32_t first_char_except_ignorable; uint32_t bits; } casing_suffix_context_t; /* The case-mapping context of the empty suffix string. */ extern const casing_suffix_context_t unicase_empty_suffix_context; /* Return the case-mapping context of a given suffix string. */ extern casing_suffix_context_t u8_casing_suffix_context (const uint8_t *s, size_t n); extern casing_suffix_context_t u16_casing_suffix_context (const uint16_t *s, size_t n); extern casing_suffix_context_t u32_casing_suffix_context (const uint32_t *s, size_t n); /* Return the case-mapping context of the suffix concat(S, A), given the case-mapping context of the suffix A. */ extern casing_suffix_context_t u8_casing_suffixes_context (const uint8_t *s, size_t n, casing_suffix_context_t a_context); extern casing_suffix_context_t u16_casing_suffixes_context (const uint16_t *s, size_t n, casing_suffix_context_t a_context); extern casing_suffix_context_t u32_casing_suffixes_context (const uint32_t *s, size_t n, casing_suffix_context_t a_context); /* Return the uppercase mapping of a string that is surrounded by a prefix and a suffix. */ extern uint8_t * u8_ct_toupper (const uint8_t *s, size_t n, casing_prefix_context_t prefix_context, casing_suffix_context_t suffix_context, const char *iso639_language, uninorm_t nf, uint8_t *_UC_RESTRICT resultbuf, size_t *lengthp); extern uint16_t * u16_ct_toupper (const uint16_t *s, size_t n, casing_prefix_context_t prefix_context, casing_suffix_context_t suffix_context, const char *iso639_language, uninorm_t nf, uint16_t *_UC_RESTRICT resultbuf, size_t *lengthp); extern uint32_t * u32_ct_toupper (const uint32_t *s, size_t n, casing_prefix_context_t prefix_context, casing_suffix_context_t suffix_context, const char *iso639_language, uninorm_t nf, uint32_t *_UC_RESTRICT resultbuf, size_t *lengthp); /* Return the lowercase mapping of a string that is surrounded by a prefix and a suffix. */ extern uint8_t * u8_ct_tolower (const uint8_t *s, size_t n, casing_prefix_context_t prefix_context, casing_suffix_context_t suffix_context, const char *iso639_language, uninorm_t nf, uint8_t *_UC_RESTRICT resultbuf, size_t *lengthp); extern uint16_t * u16_ct_tolower (const uint16_t *s, size_t n, casing_prefix_context_t prefix_context, casing_suffix_context_t suffix_context, const char *iso639_language, uninorm_t nf, uint16_t *_UC_RESTRICT resultbuf, size_t *lengthp); extern uint32_t * u32_ct_tolower (const uint32_t *s, size_t n, casing_prefix_context_t prefix_context, casing_suffix_context_t suffix_context, const char *iso639_language, uninorm_t nf, uint32_t *_UC_RESTRICT resultbuf, size_t *lengthp); /* Return the titlecase mapping of a string that is surrounded by a prefix and a suffix. */ extern uint8_t * u8_ct_totitle (const uint8_t *s, size_t n, casing_prefix_context_t prefix_context, casing_suffix_context_t suffix_context, const char *iso639_language, uninorm_t nf, uint8_t *_UC_RESTRICT resultbuf, size_t *lengthp); extern uint16_t * u16_ct_totitle (const uint16_t *s, size_t n, casing_prefix_context_t prefix_context, casing_suffix_context_t suffix_context, const char *iso639_language, uninorm_t nf, uint16_t *_UC_RESTRICT resultbuf, size_t *lengthp); extern uint32_t * u32_ct_totitle (const uint32_t *s, size_t n, casing_prefix_context_t prefix_context, casing_suffix_context_t suffix_context, const char *iso639_language, uninorm_t nf, uint32_t *_UC_RESTRICT resultbuf, size_t *lengthp); /* Return the case folded string. Comparing uN_casefold (S1) and uN_casefold (S2) with uN_cmp2() is equivalent to comparing S1 and S2 with uN_casecmp(). The nf argument identifies the normalization form to apply after the case-mapping. It can also be NULL, for no normalization. */ extern uint8_t * u8_casefold (const uint8_t *s, size_t n, const char *iso639_language, uninorm_t nf, uint8_t *_UC_RESTRICT resultbuf, size_t *lengthp); extern uint16_t * u16_casefold (const uint16_t *s, size_t n, const char *iso639_language, uninorm_t nf, uint16_t *_UC_RESTRICT resultbuf, size_t *lengthp); extern uint32_t * u32_casefold (const uint32_t *s, size_t n, const char *iso639_language, uninorm_t nf, uint32_t *_UC_RESTRICT resultbuf, size_t *lengthp); /* Likewise, for a string that is surrounded by a prefix and a suffix. */ extern uint8_t * u8_ct_casefold (const uint8_t *s, size_t n, casing_prefix_context_t prefix_context, casing_suffix_context_t suffix_context, const char *iso639_language, uninorm_t nf, uint8_t *_UC_RESTRICT resultbuf, size_t *lengthp); extern uint16_t * u16_ct_casefold (const uint16_t *s, size_t n, casing_prefix_context_t prefix_context, casing_suffix_context_t suffix_context, const char *iso639_language, uninorm_t nf, uint16_t *_UC_RESTRICT resultbuf, size_t *lengthp); extern uint32_t * u32_ct_casefold (const uint32_t *s, size_t n, casing_prefix_context_t prefix_context, casing_suffix_context_t suffix_context, const char *iso639_language, uninorm_t nf, uint32_t *_UC_RESTRICT resultbuf, size_t *lengthp); /* Compare S1 and S2, ignoring differences in case and normalization. The nf argument identifies the normalization form to apply after the case-mapping. It can also be NULL, for no normalization. If successful, set *RESULTP to -1 if S1 < S2, 0 if S1 = S2, 1 if S1 > S2, and return 0. Upon failure, return -1 with errno set. */ extern int u8_casecmp (const uint8_t *s1, size_t n1, const uint8_t *s2, size_t n2, const char *iso639_language, uninorm_t nf, int *resultp); extern int u16_casecmp (const uint16_t *s1, size_t n1, const uint16_t *s2, size_t n2, const char *iso639_language, uninorm_t nf, int *resultp); extern int u32_casecmp (const uint32_t *s1, size_t n1, const uint32_t *s2, size_t n2, const char *iso639_language, uninorm_t nf, int *resultp); extern int ulc_casecmp (const char *s1, size_t n1, const char *s2, size_t n2, const char *iso639_language, uninorm_t nf, int *resultp); /* Convert the string S of length N to a NUL-terminated byte sequence, in such a way that comparing uN_casexfrm (S1) and uN_casexfrm (S2) with the gnulib function memcmp2() is equivalent to comparing S1 and S2 with uN_casecoll(). NF must be either UNINORM_NFC, UNINORM_NFKC, or NULL for no normalization. */ extern char * u8_casexfrm (const uint8_t *s, size_t n, const char *iso639_language, uninorm_t nf, char *_UC_RESTRICT resultbuf, size_t *lengthp); extern char * u16_casexfrm (const uint16_t *s, size_t n, const char *iso639_language, uninorm_t nf, char *_UC_RESTRICT resultbuf, size_t *lengthp); extern char * u32_casexfrm (const uint32_t *s, size_t n, const char *iso639_language, uninorm_t nf, char *_UC_RESTRICT resultbuf, size_t *lengthp); extern char * ulc_casexfrm (const char *s, size_t n, const char *iso639_language, uninorm_t nf, char *_UC_RESTRICT resultbuf, size_t *lengthp); /* Compare S1 and S2, ignoring differences in case and normalization, using the collation rules of the current locale. The nf argument identifies the normalization form to apply after the case-mapping. It must be either UNINORM_NFC or UNINORM_NFKC. It can also be NULL, for no normalization. If successful, set *RESULTP to -1 if S1 < S2, 0 if S1 = S2, 1 if S1 > S2, and return 0. Upon failure, return -1 with errno set. */ extern int u8_casecoll (const uint8_t *s1, size_t n1, const uint8_t *s2, size_t n2, const char *iso639_language, uninorm_t nf, int *resultp); extern int u16_casecoll (const uint16_t *s1, size_t n1, const uint16_t *s2, size_t n2, const char *iso639_language, uninorm_t nf, int *resultp); extern int u32_casecoll (const uint32_t *s1, size_t n1, const uint32_t *s2, size_t n2, const char *iso639_language, uninorm_t nf, int *resultp); extern int ulc_casecoll (const char *s1, size_t n1, const char *s2, size_t n2, const char *iso639_language, uninorm_t nf, int *resultp); /* Set *RESULTP to true if mapping NFD(S) to upper case is a no-op, or to false otherwise, and return 0. Upon failure, return -1 with errno set. */ extern int u8_is_uppercase (const uint8_t *s, size_t n, const char *iso639_language, bool *resultp); extern int u16_is_uppercase (const uint16_t *s, size_t n, const char *iso639_language, bool *resultp); extern int u32_is_uppercase (const uint32_t *s, size_t n, const char *iso639_language, bool *resultp); /* Set *RESULTP to true if mapping NFD(S) to lower case is a no-op, or to false otherwise, and return 0. Upon failure, return -1 with errno set. */ extern int u8_is_lowercase (const uint8_t *s, size_t n, const char *iso639_language, bool *resultp); extern int u16_is_lowercase (const uint16_t *s, size_t n, const char *iso639_language, bool *resultp); extern int u32_is_lowercase (const uint32_t *s, size_t n, const char *iso639_language, bool *resultp); /* Set *RESULTP to true if mapping NFD(S) to title case is a no-op, or to false otherwise, and return 0. Upon failure, return -1 with errno set. */ extern int u8_is_titlecase (const uint8_t *s, size_t n, const char *iso639_language, bool *resultp); extern int u16_is_titlecase (const uint16_t *s, size_t n, const char *iso639_language, bool *resultp); extern int u32_is_titlecase (const uint32_t *s, size_t n, const char *iso639_language, bool *resultp); /* Set *RESULTP to true if applying case folding to NFD(S) is a no-op, or to false otherwise, and return 0. Upon failure, return -1 with errno set. */ extern int u8_is_casefolded (const uint8_t *s, size_t n, const char *iso639_language, bool *resultp); extern int u16_is_casefolded (const uint16_t *s, size_t n, const char *iso639_language, bool *resultp); extern int u32_is_casefolded (const uint32_t *s, size_t n, const char *iso639_language, bool *resultp); /* Set *RESULTP to true if case matters for S, that is, if mapping NFD(S) to either upper case or lower case or title case is not a no-op. Set *RESULTP to false if NFD(S) maps to itself under the upper case mapping, under the lower case mapping, and under the title case mapping; in other words, when NFD(S) consists entirely of caseless characters. Upon failure, return -1 with errno set. */ extern int u8_is_cased (const uint8_t *s, size_t n, const char *iso639_language, bool *resultp); extern int u16_is_cased (const uint16_t *s, size_t n, const char *iso639_language, bool *resultp); extern int u32_is_cased (const uint32_t *s, size_t n, const char *iso639_language, bool *resultp); /* ========================================================================= */ #ifdef __cplusplus } #endif #endif /* _UNICASE_H */ pspp-1.4.1/gl/nstrftime.c0000644000175000017500000013771513723215637014723 0ustar00blpblp00000000000000/* Copyright (C) 1991-2020 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library 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 3 of the License, or (at your option) any later version. The GNU C Library 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 the GNU C Library; if not, see . */ #ifdef _LIBC # define USE_IN_EXTENDED_LOCALE_MODEL 1 # define HAVE_STRUCT_ERA_ENTRY 1 # define HAVE_TM_GMTOFF 1 # define HAVE_TM_ZONE 1 # define HAVE_TZNAME 1 # define HAVE_TZSET 1 # include "../locale/localeinfo.h" #else # include # if FPRINTFTIME # include "fprintftime.h" # else # include "strftime.h" # endif # include "time-internal.h" #endif #include #include #if HAVE_TZNAME && !HAVE_DECL_TZNAME extern char *tzname[]; #endif /* Do multibyte processing if multibyte encodings are supported, unless multibyte sequences are safe in formats. Multibyte sequences are safe if they cannot contain byte sequences that look like format conversion specifications. The multibyte encodings used by the C library on the various platforms (UTF-8, GB2312, GBK, CP936, GB18030, EUC-TW, BIG5, BIG5-HKSCS, CP950, EUC-JP, EUC-KR, CP949, SHIFT_JIS, CP932, JOHAB) are safe for formats, because the byte '%' cannot occur in a multibyte character except in the first byte. The DEC-HANYU encoding used on OSF/1 is not safe for formats, but this encoding has never been seen in real-life use, so we ignore it. */ #if !(defined __osf__ && 0) # define MULTIBYTE_IS_FORMAT_SAFE 1 #endif #define DO_MULTIBYTE (! MULTIBYTE_IS_FORMAT_SAFE) #if DO_MULTIBYTE # include static const mbstate_t mbstate_zero; #endif #include #include #include #include #include #include "attribute.h" #include #ifdef COMPILE_WIDE # include # define CHAR_T wchar_t # define UCHAR_T unsigned int # define L_(Str) L##Str # define NLW(Sym) _NL_W##Sym # define MEMCPY(d, s, n) __wmemcpy (d, s, n) # define STRLEN(s) __wcslen (s) #else # define CHAR_T char # define UCHAR_T unsigned char # define L_(Str) Str # define NLW(Sym) Sym # define ABALTMON_1 _NL_ABALTMON_1 # define MEMCPY(d, s, n) memcpy (d, s, n) # define STRLEN(s) strlen (s) #endif /* Shift A right by B bits portably, by dividing A by 2**B and truncating towards minus infinity. A and B should be free of side effects, and B should be in the range 0 <= B <= INT_BITS - 2, where INT_BITS is the number of useful bits in an int. GNU code can assume that INT_BITS is at least 32. ISO C99 says that A >> B is implementation-defined if A < 0. Some implementations (e.g., UNICOS 9.0 on a Cray Y-MP EL) don't shift right in the usual way when A < 0, so SHR falls back on division if ordinary A >> B doesn't seem to be the usual signed shift. */ #define SHR(a, b) \ (-1 >> 1 == -1 \ ? (a) >> (b) \ : ((a) + ((a) < 0)) / (1 << (b)) - ((a) < 0)) #define TM_YEAR_BASE 1900 #ifndef __isleap /* Nonzero if YEAR is a leap year (every 4 years, except every 100th isn't, and every 400th is). */ # define __isleap(year) \ ((year) % 4 == 0 && ((year) % 100 != 0 || (year) % 400 == 0)) #endif #ifdef _LIBC # define mktime_z(tz, tm) mktime (tm) # define tzname __tzname # define tzset __tzset #endif #ifndef FPRINTFTIME # define FPRINTFTIME 0 #endif #if FPRINTFTIME # define STREAM_OR_CHAR_T FILE # define STRFTIME_ARG(x) /* empty */ #else # define STREAM_OR_CHAR_T CHAR_T # define STRFTIME_ARG(x) x, #endif #if FPRINTFTIME # define memset_byte(P, Len, Byte) \ do { size_t _i; for (_i = 0; _i < Len; _i++) fputc (Byte, P); } while (0) # define memset_space(P, Len) memset_byte (P, Len, ' ') # define memset_zero(P, Len) memset_byte (P, Len, '0') #elif defined COMPILE_WIDE # define memset_space(P, Len) (wmemset (P, L' ', Len), (P) += (Len)) # define memset_zero(P, Len) (wmemset (P, L'0', Len), (P) += (Len)) #else # define memset_space(P, Len) (memset (P, ' ', Len), (P) += (Len)) # define memset_zero(P, Len) (memset (P, '0', Len), (P) += (Len)) #endif #if FPRINTFTIME # define advance(P, N) #else # define advance(P, N) ((P) += (N)) #endif #define add(n, f) width_add (width, n, f) #define width_add(width, n, f) \ do \ { \ size_t _n = (n); \ size_t _w = pad == L_('-') || width < 0 ? 0 : width; \ size_t _incr = _n < _w ? _w : _n; \ if (_incr >= maxsize - i) \ return 0; \ if (p) \ { \ if (_n < _w) \ { \ size_t _delta = _w - _n; \ if (pad == L_('0') || pad == L_('+')) \ memset_zero (p, _delta); \ else \ memset_space (p, _delta); \ } \ f; \ advance (p, _n); \ } \ i += _incr; \ } while (0) #define add1(c) width_add1 (width, c) #if FPRINTFTIME # define width_add1(width, c) width_add (width, 1, fputc (c, p)) #else # define width_add1(width, c) width_add (width, 1, *p = c) #endif #define cpy(n, s) width_cpy (width, n, s) #if FPRINTFTIME # define width_cpy(width, n, s) \ width_add (width, n, \ do \ { \ if (to_lowcase) \ fwrite_lowcase (p, (s), _n); \ else if (to_uppcase) \ fwrite_uppcase (p, (s), _n); \ else \ { \ /* Ignore the value of fwrite. The caller can determine whether \ an error occurred by inspecting ferror (P). All known fwrite \ implementations set the stream's error indicator when they \ fail due to ENOMEM etc., even though C11 and POSIX.1-2008 do \ not require this. */ \ fwrite (s, _n, 1, p); \ } \ } \ while (0) \ ) #else # define width_cpy(width, n, s) \ width_add (width, n, \ if (to_lowcase) \ memcpy_lowcase (p, (s), _n LOCALE_ARG); \ else if (to_uppcase) \ memcpy_uppcase (p, (s), _n LOCALE_ARG); \ else \ MEMCPY ((void *) p, (void const *) (s), _n)) #endif #ifdef COMPILE_WIDE # ifndef USE_IN_EXTENDED_LOCALE_MODEL # undef __mbsrtowcs_l # define __mbsrtowcs_l(d, s, l, st, loc) __mbsrtowcs (d, s, l, st) # endif # define widen(os, ws, l) \ { \ mbstate_t __st; \ const char *__s = os; \ memset (&__st, '\0', sizeof (__st)); \ l = __mbsrtowcs_l (NULL, &__s, 0, &__st, loc); \ ws = (wchar_t *) alloca ((l + 1) * sizeof (wchar_t)); \ (void) __mbsrtowcs_l (ws, &__s, l, &__st, loc); \ } #endif #if defined _LIBC && defined USE_IN_EXTENDED_LOCALE_MODEL /* We use this code also for the extended locale handling where the function gets as an additional argument the locale which has to be used. To access the values we have to redefine the _NL_CURRENT macro. */ # define strftime __strftime_l # define wcsftime __wcsftime_l # undef _NL_CURRENT # define _NL_CURRENT(category, item) \ (current->values[_NL_ITEM_INDEX (item)].string) # define LOCALE_PARAM , locale_t loc # define LOCALE_ARG , loc # define HELPER_LOCALE_ARG , current #else # define LOCALE_PARAM # define LOCALE_ARG # ifdef _LIBC # define HELPER_LOCALE_ARG , _NL_CURRENT_DATA (LC_TIME) # else # define HELPER_LOCALE_ARG # endif #endif #ifdef COMPILE_WIDE # ifdef USE_IN_EXTENDED_LOCALE_MODEL # define TOUPPER(Ch, L) __towupper_l (Ch, L) # define TOLOWER(Ch, L) __towlower_l (Ch, L) # else # define TOUPPER(Ch, L) towupper (Ch) # define TOLOWER(Ch, L) towlower (Ch) # endif #else # ifdef USE_IN_EXTENDED_LOCALE_MODEL # define TOUPPER(Ch, L) __toupper_l (Ch, L) # define TOLOWER(Ch, L) __tolower_l (Ch, L) # else # define TOUPPER(Ch, L) toupper (Ch) # define TOLOWER(Ch, L) tolower (Ch) # endif #endif /* We don't use 'isdigit' here since the locale dependent interpretation is not what we want here. We only need to accept the arabic digits in the ASCII range. One day there is perhaps a more reliable way to accept other sets of digits. */ #define ISDIGIT(Ch) ((unsigned int) (Ch) - L_('0') <= 9) #if FPRINTFTIME static void fwrite_lowcase (FILE *fp, const CHAR_T *src, size_t len) { while (len-- > 0) { fputc (TOLOWER ((UCHAR_T) *src, loc), fp); ++src; } } static void fwrite_uppcase (FILE *fp, const CHAR_T *src, size_t len) { while (len-- > 0) { fputc (TOUPPER ((UCHAR_T) *src, loc), fp); ++src; } } #else static CHAR_T *memcpy_lowcase (CHAR_T *dest, const CHAR_T *src, size_t len LOCALE_PARAM); static CHAR_T * memcpy_lowcase (CHAR_T *dest, const CHAR_T *src, size_t len LOCALE_PARAM) { while (len-- > 0) dest[len] = TOLOWER ((UCHAR_T) src[len], loc); return dest; } static CHAR_T *memcpy_uppcase (CHAR_T *dest, const CHAR_T *src, size_t len LOCALE_PARAM); static CHAR_T * memcpy_uppcase (CHAR_T *dest, const CHAR_T *src, size_t len LOCALE_PARAM) { while (len-- > 0) dest[len] = TOUPPER ((UCHAR_T) src[len], loc); return dest; } #endif #if ! HAVE_TM_GMTOFF /* Yield the difference between *A and *B, measured in seconds, ignoring leap seconds. */ # define tm_diff ftime_tm_diff static int tm_diff (const struct tm *, const struct tm *); static int tm_diff (const struct tm *a, const struct tm *b) { /* Compute intervening leap days correctly even if year is negative. Take care to avoid int overflow in leap day calculations, but it's OK to assume that A and B are close to each other. */ int a4 = SHR (a->tm_year, 2) + SHR (TM_YEAR_BASE, 2) - ! (a->tm_year & 3); int b4 = SHR (b->tm_year, 2) + SHR (TM_YEAR_BASE, 2) - ! (b->tm_year & 3); int a100 = (a4 + (a4 < 0)) / 25 - (a4 < 0); int b100 = (b4 + (b4 < 0)) / 25 - (b4 < 0); int a400 = SHR (a100, 2); int b400 = SHR (b100, 2); int intervening_leap_days = (a4 - b4) - (a100 - b100) + (a400 - b400); int years = a->tm_year - b->tm_year; int days = (365 * years + intervening_leap_days + (a->tm_yday - b->tm_yday)); return (60 * (60 * (24 * days + (a->tm_hour - b->tm_hour)) + (a->tm_min - b->tm_min)) + (a->tm_sec - b->tm_sec)); } #endif /* ! HAVE_TM_GMTOFF */ /* The number of days from the first day of the first ISO week of this year to the year day YDAY with week day WDAY. ISO weeks start on Monday; the first ISO week has the year's first Thursday. YDAY may be as small as YDAY_MINIMUM. */ #define ISO_WEEK_START_WDAY 1 /* Monday */ #define ISO_WEEK1_WDAY 4 /* Thursday */ #define YDAY_MINIMUM (-366) static int iso_week_days (int, int); #ifdef __GNUC__ __inline__ #endif static int iso_week_days (int yday, int wday) { /* Add enough to the first operand of % to make it nonnegative. */ int big_enough_multiple_of_7 = (-YDAY_MINIMUM / 7 + 2) * 7; return (yday - (yday - wday + ISO_WEEK1_WDAY + big_enough_multiple_of_7) % 7 + ISO_WEEK1_WDAY - ISO_WEEK_START_WDAY); } /* When compiling this file, GNU applications can #define my_strftime to a symbol (typically nstrftime) to get an extended strftime with extra arguments TZ and NS. */ #if FPRINTFTIME # undef my_strftime # define my_strftime fprintftime #endif #ifdef my_strftime # undef HAVE_TZSET # define extra_args , tz, ns # define extra_args_spec , timezone_t tz, int ns #else # if defined COMPILE_WIDE # define my_strftime wcsftime # define nl_get_alt_digit _nl_get_walt_digit # else # define my_strftime strftime # define nl_get_alt_digit _nl_get_alt_digit # endif # define extra_args # define extra_args_spec /* We don't have this information in general. */ # define tz 1 # define ns 0 #endif static size_t __strftime_internal (STREAM_OR_CHAR_T *, STRFTIME_ARG (size_t) const CHAR_T *, const struct tm *, bool, int, int, bool * extra_args_spec LOCALE_PARAM); /* Write information from TP into S according to the format string FORMAT, writing no more that MAXSIZE characters (including the terminating '\0') and returning number of characters written. If S is NULL, nothing will be written anywhere, so to determine how many characters would be written, use NULL for S and (size_t) -1 for MAXSIZE. */ size_t my_strftime (STREAM_OR_CHAR_T *s, STRFTIME_ARG (size_t maxsize) const CHAR_T *format, const struct tm *tp extra_args_spec LOCALE_PARAM) { bool tzset_called = false; return __strftime_internal (s, STRFTIME_ARG (maxsize) format, tp, false, 0, -1, &tzset_called extra_args LOCALE_ARG); } #if defined _LIBC && ! FPRINTFTIME libc_hidden_def (my_strftime) #endif /* Just like my_strftime, above, but with more parameters. UPCASE indicates that the result should be converted to upper case. YR_SPEC and WIDTH specify the padding and width for the year. *TZSET_CALLED indicates whether tzset has been called here. */ static size_t __strftime_internal (STREAM_OR_CHAR_T *s, STRFTIME_ARG (size_t maxsize) const CHAR_T *format, const struct tm *tp, bool upcase, int yr_spec, int width, bool *tzset_called extra_args_spec LOCALE_PARAM) { #if defined _LIBC && defined USE_IN_EXTENDED_LOCALE_MODEL struct __locale_data *const current = loc->__locales[LC_TIME]; #endif #if FPRINTFTIME size_t maxsize = (size_t) -1; #endif int hour12 = tp->tm_hour; #ifdef _NL_CURRENT /* We cannot make the following values variables since we must delay the evaluation of these values until really needed since some expressions might not be valid in every situation. The 'struct tm' might be generated by a strptime() call that initialized only a few elements. Dereference the pointers only if the format requires this. Then it is ok to fail if the pointers are invalid. */ # define a_wkday \ ((const CHAR_T *) (tp->tm_wday < 0 || tp->tm_wday > 6 \ ? "?" : _NL_CURRENT (LC_TIME, NLW(ABDAY_1) + tp->tm_wday))) # define f_wkday \ ((const CHAR_T *) (tp->tm_wday < 0 || tp->tm_wday > 6 \ ? "?" : _NL_CURRENT (LC_TIME, NLW(DAY_1) + tp->tm_wday))) # define a_month \ ((const CHAR_T *) (tp->tm_mon < 0 || tp->tm_mon > 11 \ ? "?" : _NL_CURRENT (LC_TIME, NLW(ABMON_1) + tp->tm_mon))) # define f_month \ ((const CHAR_T *) (tp->tm_mon < 0 || tp->tm_mon > 11 \ ? "?" : _NL_CURRENT (LC_TIME, NLW(MON_1) + tp->tm_mon))) # define a_altmonth \ ((const CHAR_T *) (tp->tm_mon < 0 || tp->tm_mon > 11 \ ? "?" : _NL_CURRENT (LC_TIME, NLW(ABALTMON_1) + tp->tm_mon))) # define f_altmonth \ ((const CHAR_T *) (tp->tm_mon < 0 || tp->tm_mon > 11 \ ? "?" : _NL_CURRENT (LC_TIME, NLW(ALTMON_1) + tp->tm_mon))) # define ampm \ ((const CHAR_T *) _NL_CURRENT (LC_TIME, tp->tm_hour > 11 \ ? NLW(PM_STR) : NLW(AM_STR))) # define aw_len STRLEN (a_wkday) # define am_len STRLEN (a_month) # define aam_len STRLEN (a_altmonth) # define ap_len STRLEN (ampm) #endif #if HAVE_TZNAME char **tzname_vec = tzname; #endif const char *zone; size_t i = 0; STREAM_OR_CHAR_T *p = s; const CHAR_T *f; #if DO_MULTIBYTE && !defined COMPILE_WIDE const char *format_end = NULL; #endif zone = NULL; #if HAVE_TM_ZONE /* The POSIX test suite assumes that setting the environment variable TZ to a new value before calling strftime() will influence the result (the %Z format) even if the information in TP is computed with a totally different time zone. This is bogus: though POSIX allows bad behavior like this, POSIX does not require it. Do the right thing instead. */ zone = (const char *) tp->tm_zone; #endif #if HAVE_TZNAME if (!tz) { if (! (zone && *zone)) zone = "GMT"; } else { # if !HAVE_TM_ZONE /* Infer the zone name from *TZ instead of from TZNAME. */ tzname_vec = tz->tzname_copy; # endif } /* The tzset() call might have changed the value. */ if (!(zone && *zone) && tp->tm_isdst >= 0) { /* POSIX.1 requires that local time zone information be used as though strftime called tzset. */ # if HAVE_TZSET if (!*tzset_called) { tzset (); *tzset_called = true; } # endif zone = tzname_vec[tp->tm_isdst != 0]; } #endif if (! zone) zone = ""; if (hour12 > 12) hour12 -= 12; else if (hour12 == 0) hour12 = 12; for (f = format; *f != '\0'; width = -1, f++) { int pad = 0; /* Padding for number ('_', '-', '+', '0', or 0). */ int modifier; /* Field modifier ('E', 'O', or 0). */ int digits = 0; /* Max digits for numeric format. */ int number_value; /* Numeric value to be printed. */ unsigned int u_number_value; /* (unsigned int) number_value. */ bool negative_number; /* The number is negative. */ bool always_output_a_sign; /* +/- should always be output. */ int tz_colon_mask; /* Bitmask of where ':' should appear. */ const CHAR_T *subfmt; CHAR_T *bufp; CHAR_T buf[1 + 2 /* for the two colons in a %::z or %:::z time zone */ + (sizeof (int) < sizeof (time_t) ? INT_STRLEN_BOUND (time_t) : INT_STRLEN_BOUND (int))]; bool to_lowcase = false; bool to_uppcase = upcase; size_t colons; bool change_case = false; int format_char; int subwidth; #if DO_MULTIBYTE && !defined COMPILE_WIDE switch (*f) { case L_('%'): break; case L_('\b'): case L_('\t'): case L_('\n'): case L_('\v'): case L_('\f'): case L_('\r'): case L_(' '): case L_('!'): case L_('"'): case L_('#'): case L_('&'): case L_('\''): case L_('('): case L_(')'): case L_('*'): case L_('+'): case L_(','): case L_('-'): case L_('.'): case L_('/'): case L_('0'): case L_('1'): case L_('2'): case L_('3'): case L_('4'): case L_('5'): case L_('6'): case L_('7'): case L_('8'): case L_('9'): case L_(':'): case L_(';'): case L_('<'): case L_('='): case L_('>'): case L_('?'): case L_('A'): case L_('B'): case L_('C'): case L_('D'): case L_('E'): case L_('F'): case L_('G'): case L_('H'): case L_('I'): case L_('J'): case L_('K'): case L_('L'): case L_('M'): case L_('N'): case L_('O'): case L_('P'): case L_('Q'): case L_('R'): case L_('S'): case L_('T'): case L_('U'): case L_('V'): case L_('W'): case L_('X'): case L_('Y'): case L_('Z'): case L_('['): case L_('\\'): case L_(']'): case L_('^'): case L_('_'): case L_('a'): case L_('b'): case L_('c'): case L_('d'): case L_('e'): case L_('f'): case L_('g'): case L_('h'): case L_('i'): case L_('j'): case L_('k'): case L_('l'): case L_('m'): case L_('n'): case L_('o'): case L_('p'): case L_('q'): case L_('r'): case L_('s'): case L_('t'): case L_('u'): case L_('v'): case L_('w'): case L_('x'): case L_('y'): case L_('z'): case L_('{'): case L_('|'): case L_('}'): case L_('~'): /* The C Standard requires these 98 characters (plus '%') to be in the basic execution character set. None of these characters can start a multibyte sequence, so they need not be analyzed further. */ add1 (*f); continue; default: /* Copy this multibyte sequence until we reach its end, find an error, or come back to the initial shift state. */ { mbstate_t mbstate = mbstate_zero; size_t len = 0; size_t fsize; if (! format_end) format_end = f + strlen (f) + 1; fsize = format_end - f; do { size_t bytes = mbrlen (f + len, fsize - len, &mbstate); if (bytes == 0) break; if (bytes == (size_t) -2) { len += strlen (f + len); break; } if (bytes == (size_t) -1) { len++; break; } len += bytes; } while (! mbsinit (&mbstate)); cpy (len, f); f += len - 1; continue; } } #else /* ! DO_MULTIBYTE */ /* Either multibyte encodings are not supported, they are safe for formats, so any non-'%' byte can be copied through, or this is the wide character version. */ if (*f != L_('%')) { add1 (*f); continue; } #endif /* ! DO_MULTIBYTE */ /* Check for flags that can modify a format. */ while (1) { switch (*++f) { /* This influences the number formats. */ case L_('_'): case L_('-'): case L_('+'): case L_('0'): pad = *f; continue; /* This changes textual output. */ case L_('^'): to_uppcase = true; continue; case L_('#'): change_case = true; continue; default: break; } break; } if (ISDIGIT (*f)) { width = 0; do { if (INT_MULTIPLY_WRAPV (width, 10, &width) || INT_ADD_WRAPV (width, *f - L_('0'), &width)) width = INT_MAX; ++f; } while (ISDIGIT (*f)); } /* Check for modifiers. */ switch (*f) { case L_('E'): case L_('O'): modifier = *f++; break; default: modifier = 0; break; } /* Now do the specified format. */ format_char = *f; switch (format_char) { #define DO_NUMBER(d, v) \ do \ { \ digits = d; \ number_value = v; \ goto do_number; \ } \ while (0) #define DO_SIGNED_NUMBER(d, negative, v) \ DO_MAYBE_SIGNED_NUMBER (d, negative, v, do_signed_number) #define DO_YEARISH(d, negative, v) \ DO_MAYBE_SIGNED_NUMBER (d, negative, v, do_yearish) #define DO_MAYBE_SIGNED_NUMBER(d, negative, v, label) \ do \ { \ digits = d; \ negative_number = negative; \ u_number_value = v; \ goto label; \ } \ while (0) /* The mask is not what you might think. When the ordinal i'th bit is set, insert a colon before the i'th digit of the time zone representation. */ #define DO_TZ_OFFSET(d, mask, v) \ do \ { \ digits = d; \ tz_colon_mask = mask; \ u_number_value = v; \ goto do_tz_offset; \ } \ while (0) #define DO_NUMBER_SPACEPAD(d, v) \ do \ { \ digits = d; \ number_value = v; \ goto do_number_spacepad; \ } \ while (0) case L_('%'): if (modifier != 0) goto bad_format; add1 (*f); break; case L_('a'): if (modifier != 0) goto bad_format; if (change_case) { to_uppcase = true; to_lowcase = false; } #ifdef _NL_CURRENT cpy (aw_len, a_wkday); break; #else goto underlying_strftime; #endif case 'A': if (modifier != 0) goto bad_format; if (change_case) { to_uppcase = true; to_lowcase = false; } #ifdef _NL_CURRENT cpy (STRLEN (f_wkday), f_wkday); break; #else goto underlying_strftime; #endif case L_('b'): case L_('h'): if (change_case) { to_uppcase = true; to_lowcase = false; } if (modifier == L_('E')) goto bad_format; #ifdef _NL_CURRENT if (modifier == L_('O')) cpy (aam_len, a_altmonth); else cpy (am_len, a_month); break; #else goto underlying_strftime; #endif case L_('B'): if (modifier == L_('E')) goto bad_format; if (change_case) { to_uppcase = true; to_lowcase = false; } #ifdef _NL_CURRENT if (modifier == L_('O')) cpy (STRLEN (f_altmonth), f_altmonth); else cpy (STRLEN (f_month), f_month); break; #else goto underlying_strftime; #endif case L_('c'): if (modifier == L_('O')) goto bad_format; #ifdef _NL_CURRENT if (! (modifier == L_('E') && (*(subfmt = (const CHAR_T *) _NL_CURRENT (LC_TIME, NLW(ERA_D_T_FMT))) != '\0'))) subfmt = (const CHAR_T *) _NL_CURRENT (LC_TIME, NLW(D_T_FMT)); #else goto underlying_strftime; #endif subformat: subwidth = -1; subformat_width: { size_t len = __strftime_internal (NULL, STRFTIME_ARG ((size_t) -1) subfmt, tp, to_uppcase, pad, subwidth, tzset_called extra_args LOCALE_ARG); add (len, __strftime_internal (p, STRFTIME_ARG (maxsize - i) subfmt, tp, to_uppcase, pad, subwidth, tzset_called extra_args LOCALE_ARG)); } break; #if !(defined _NL_CURRENT && HAVE_STRUCT_ERA_ENTRY) underlying_strftime: { /* The relevant information is available only via the underlying strftime implementation, so use that. */ char ufmt[5]; char *u = ufmt; char ubuf[1024]; /* enough for any single format in practice */ size_t len; /* Make sure we're calling the actual underlying strftime. In some cases, config.h contains something like "#define strftime rpl_strftime". */ # ifdef strftime # undef strftime size_t strftime (); # endif /* The space helps distinguish strftime failure from empty output. */ *u++ = ' '; *u++ = '%'; if (modifier != 0) *u++ = modifier; *u++ = format_char; *u = '\0'; len = strftime (ubuf, sizeof ubuf, ufmt, tp); if (len != 0) cpy (len - 1, ubuf + 1); } break; #endif case L_('C'): if (modifier == L_('E')) { #if HAVE_STRUCT_ERA_ENTRY struct era_entry *era = _nl_get_era_entry (tp HELPER_LOCALE_ARG); if (era) { # ifdef COMPILE_WIDE size_t len = __wcslen (era->era_wname); cpy (len, era->era_wname); # else size_t len = strlen (era->era_name); cpy (len, era->era_name); # endif break; } #else goto underlying_strftime; #endif } { bool negative_year = tp->tm_year < - TM_YEAR_BASE; bool zero_thru_1899 = !negative_year & (tp->tm_year < 0); int century = ((tp->tm_year - 99 * zero_thru_1899) / 100 + TM_YEAR_BASE / 100); DO_YEARISH (2, negative_year, century); } case L_('x'): if (modifier == L_('O')) goto bad_format; #ifdef _NL_CURRENT if (! (modifier == L_('E') && (*(subfmt = (const CHAR_T *) _NL_CURRENT (LC_TIME, NLW(ERA_D_FMT))) != L_('\0')))) subfmt = (const CHAR_T *) _NL_CURRENT (LC_TIME, NLW(D_FMT)); goto subformat; #else goto underlying_strftime; #endif case L_('D'): if (modifier != 0) goto bad_format; subfmt = L_("%m/%d/%y"); goto subformat; case L_('d'): if (modifier == L_('E')) goto bad_format; DO_NUMBER (2, tp->tm_mday); case L_('e'): if (modifier == L_('E')) goto bad_format; DO_NUMBER_SPACEPAD (2, tp->tm_mday); /* All numeric formats set DIGITS and NUMBER_VALUE (or U_NUMBER_VALUE) and then jump to one of these labels. */ do_tz_offset: always_output_a_sign = true; goto do_number_body; do_yearish: if (pad == 0) pad = yr_spec; always_output_a_sign = (pad == L_('+') && ((digits == 2 ? 99 : 9999) < u_number_value || digits < width)); goto do_maybe_signed_number; do_number_spacepad: if (pad == 0) pad = L_('_'); do_number: /* Format NUMBER_VALUE according to the MODIFIER flag. */ negative_number = number_value < 0; u_number_value = number_value; do_signed_number: always_output_a_sign = false; do_maybe_signed_number: tz_colon_mask = 0; do_number_body: /* Format U_NUMBER_VALUE according to the MODIFIER flag. NEGATIVE_NUMBER is nonzero if the original number was negative; in this case it was converted directly to unsigned int (i.e., modulo (UINT_MAX + 1)) without negating it. */ if (modifier == L_('O') && !negative_number) { #ifdef _NL_CURRENT /* Get the locale specific alternate representation of the number. If none exist NULL is returned. */ const CHAR_T *cp = nl_get_alt_digit (u_number_value HELPER_LOCALE_ARG); if (cp != NULL) { size_t digitlen = STRLEN (cp); if (digitlen != 0) { cpy (digitlen, cp); break; } } #else goto underlying_strftime; #endif } bufp = buf + sizeof (buf) / sizeof (buf[0]); if (negative_number) u_number_value = - u_number_value; do { if (tz_colon_mask & 1) *--bufp = ':'; tz_colon_mask >>= 1; *--bufp = u_number_value % 10 + L_('0'); u_number_value /= 10; } while (u_number_value != 0 || tz_colon_mask != 0); do_number_sign_and_padding: if (pad == 0) pad = L_('0'); if (width < 0) width = digits; { CHAR_T sign_char = (negative_number ? L_('-') : always_output_a_sign ? L_('+') : 0); int numlen = buf + sizeof buf / sizeof buf[0] - bufp; int shortage = width - !!sign_char - numlen; int padding = pad == L_('-') || shortage <= 0 ? 0 : shortage; if (sign_char) { if (pad == L_('_')) { if (p) memset_space (p, padding); i += padding; width -= padding; } width_add1 (0, sign_char); width--; } cpy (numlen, bufp); } break; case L_('F'): if (modifier != 0) goto bad_format; if (pad == 0 && width < 0) { pad = L_('+'); subwidth = 4; } else { subwidth = width - 6; if (subwidth < 0) subwidth = 0; } subfmt = L_("%Y-%m-%d"); goto subformat_width; case L_('H'): if (modifier == L_('E')) goto bad_format; DO_NUMBER (2, tp->tm_hour); case L_('I'): if (modifier == L_('E')) goto bad_format; DO_NUMBER (2, hour12); case L_('k'): /* GNU extension. */ if (modifier == L_('E')) goto bad_format; DO_NUMBER_SPACEPAD (2, tp->tm_hour); case L_('l'): /* GNU extension. */ if (modifier == L_('E')) goto bad_format; DO_NUMBER_SPACEPAD (2, hour12); case L_('j'): if (modifier == L_('E')) goto bad_format; DO_SIGNED_NUMBER (3, tp->tm_yday < -1, tp->tm_yday + 1U); case L_('M'): if (modifier == L_('E')) goto bad_format; DO_NUMBER (2, tp->tm_min); case L_('m'): if (modifier == L_('E')) goto bad_format; DO_SIGNED_NUMBER (2, tp->tm_mon < -1, tp->tm_mon + 1U); #ifndef _LIBC case L_('N'): /* GNU extension. */ if (modifier == L_('E')) goto bad_format; { int n = ns, ns_digits = 9; if (width <= 0) width = ns_digits; int ndigs = ns_digits; while (width < ndigs || (1 < ndigs && n % 10 == 0)) ndigs--, n /= 10; for (int j = ndigs; 0 < j; j--) buf[j - 1] = n % 10 + L_('0'), n /= 10; if (!pad) pad = L_('0'); width_cpy (0, ndigs, buf); width_add (width - ndigs, 0, (void) 0); } break; #endif case L_('n'): add1 (L_('\n')); break; case L_('P'): to_lowcase = true; #ifndef _NL_CURRENT format_char = L_('p'); #endif FALLTHROUGH; case L_('p'): if (change_case) { to_uppcase = false; to_lowcase = true; } #ifdef _NL_CURRENT cpy (ap_len, ampm); break; #else goto underlying_strftime; #endif case L_('q'): /* GNU extension. */ DO_SIGNED_NUMBER (1, false, ((tp->tm_mon * 11) >> 5) + 1); break; case L_('R'): subfmt = L_("%H:%M"); goto subformat; case L_('r'): #ifdef _NL_CURRENT if (*(subfmt = (const CHAR_T *) _NL_CURRENT (LC_TIME, NLW(T_FMT_AMPM))) == L_('\0')) subfmt = L_("%I:%M:%S %p"); goto subformat; #else goto underlying_strftime; #endif case L_('S'): if (modifier == L_('E')) goto bad_format; DO_NUMBER (2, tp->tm_sec); case L_('s'): /* GNU extension. */ { struct tm ltm; time_t t; ltm = *tp; t = mktime_z (tz, <m); /* Generate string value for T using time_t arithmetic; this works even if sizeof (long) < sizeof (time_t). */ bufp = buf + sizeof (buf) / sizeof (buf[0]); negative_number = t < 0; do { int d = t % 10; t /= 10; *--bufp = (negative_number ? -d : d) + L_('0'); } while (t != 0); digits = 1; always_output_a_sign = false; goto do_number_sign_and_padding; } case L_('X'): if (modifier == L_('O')) goto bad_format; #ifdef _NL_CURRENT if (! (modifier == L_('E') && (*(subfmt = (const CHAR_T *) _NL_CURRENT (LC_TIME, NLW(ERA_T_FMT))) != L_('\0')))) subfmt = (const CHAR_T *) _NL_CURRENT (LC_TIME, NLW(T_FMT)); goto subformat; #else goto underlying_strftime; #endif case L_('T'): subfmt = L_("%H:%M:%S"); goto subformat; case L_('t'): add1 (L_('\t')); break; case L_('u'): DO_NUMBER (1, (tp->tm_wday - 1 + 7) % 7 + 1); case L_('U'): if (modifier == L_('E')) goto bad_format; DO_NUMBER (2, (tp->tm_yday - tp->tm_wday + 7) / 7); case L_('V'): case L_('g'): case L_('G'): if (modifier == L_('E')) goto bad_format; { /* YEAR is a leap year if and only if (tp->tm_year + TM_YEAR_BASE) is a leap year, except that YEAR and YEAR - 1 both work correctly even when (tp->tm_year + TM_YEAR_BASE) would overflow. */ int year = (tp->tm_year + (tp->tm_year < 0 ? TM_YEAR_BASE % 400 : TM_YEAR_BASE % 400 - 400)); int year_adjust = 0; int days = iso_week_days (tp->tm_yday, tp->tm_wday); if (days < 0) { /* This ISO week belongs to the previous year. */ year_adjust = -1; days = iso_week_days (tp->tm_yday + (365 + __isleap (year - 1)), tp->tm_wday); } else { int d = iso_week_days (tp->tm_yday - (365 + __isleap (year)), tp->tm_wday); if (0 <= d) { /* This ISO week belongs to the next year. */ year_adjust = 1; days = d; } } switch (*f) { case L_('g'): { int yy = (tp->tm_year % 100 + year_adjust) % 100; DO_YEARISH (2, false, (0 <= yy ? yy : tp->tm_year < -TM_YEAR_BASE - year_adjust ? -yy : yy + 100)); } case L_('G'): DO_YEARISH (4, tp->tm_year < -TM_YEAR_BASE - year_adjust, (tp->tm_year + (unsigned int) TM_YEAR_BASE + year_adjust)); default: DO_NUMBER (2, days / 7 + 1); } } case L_('W'): if (modifier == L_('E')) goto bad_format; DO_NUMBER (2, (tp->tm_yday - (tp->tm_wday - 1 + 7) % 7 + 7) / 7); case L_('w'): if (modifier == L_('E')) goto bad_format; DO_NUMBER (1, tp->tm_wday); case L_('Y'): if (modifier == L_('E')) { #if HAVE_STRUCT_ERA_ENTRY struct era_entry *era = _nl_get_era_entry (tp HELPER_LOCALE_ARG); if (era) { # ifdef COMPILE_WIDE subfmt = era->era_wformat; # else subfmt = era->era_format; # endif if (pad == 0) pad = yr_spec; goto subformat; } #else goto underlying_strftime; #endif } if (modifier == L_('O')) goto bad_format; DO_YEARISH (4, tp->tm_year < -TM_YEAR_BASE, tp->tm_year + (unsigned int) TM_YEAR_BASE); case L_('y'): if (modifier == L_('E')) { #if HAVE_STRUCT_ERA_ENTRY struct era_entry *era = _nl_get_era_entry (tp HELPER_LOCALE_ARG); if (era) { int delta = tp->tm_year - era->start_date[0]; if (pad == 0) pad = yr_spec; DO_NUMBER (2, (era->offset + delta * era->absolute_direction)); } #else goto underlying_strftime; #endif } { int yy = tp->tm_year % 100; if (yy < 0) yy = tp->tm_year < - TM_YEAR_BASE ? -yy : yy + 100; DO_YEARISH (2, false, yy); } case L_('Z'): if (change_case) { to_uppcase = false; to_lowcase = true; } #ifdef COMPILE_WIDE { /* The zone string is always given in multibyte form. We have to transform it first. */ wchar_t *wczone; size_t len; widen (zone, wczone, len); cpy (len, wczone); } #else cpy (strlen (zone), zone); #endif break; case L_(':'): /* :, ::, and ::: are valid only just before 'z'. :::: etc. are rejected later. */ for (colons = 1; f[colons] == L_(':'); colons++) continue; if (f[colons] != L_('z')) goto bad_format; f += colons; goto do_z_conversion; case L_('z'): colons = 0; do_z_conversion: if (tp->tm_isdst < 0) break; { int diff; int hour_diff; int min_diff; int sec_diff; #if HAVE_TM_GMTOFF diff = tp->tm_gmtoff; #else if (!tz) diff = 0; else { struct tm gtm; struct tm ltm; time_t lt; /* POSIX.1 requires that local time zone information be used as though strftime called tzset. */ # if HAVE_TZSET if (!*tzset_called) { tzset (); *tzset_called = true; } # endif ltm = *tp; ltm.tm_wday = -1; lt = mktime_z (tz, <m); if (ltm.tm_wday < 0 || ! localtime_rz (0, <, >m)) break; diff = tm_diff (<m, >m); } #endif negative_number = diff < 0 || (diff == 0 && *zone == '-'); hour_diff = diff / 60 / 60; min_diff = diff / 60 % 60; sec_diff = diff % 60; switch (colons) { case 0: /* +hhmm */ DO_TZ_OFFSET (5, 0, hour_diff * 100 + min_diff); case 1: tz_hh_mm: /* +hh:mm */ DO_TZ_OFFSET (6, 04, hour_diff * 100 + min_diff); case 2: tz_hh_mm_ss: /* +hh:mm:ss */ DO_TZ_OFFSET (9, 024, hour_diff * 10000 + min_diff * 100 + sec_diff); case 3: /* +hh if possible, else +hh:mm, else +hh:mm:ss */ if (sec_diff != 0) goto tz_hh_mm_ss; if (min_diff != 0) goto tz_hh_mm; DO_TZ_OFFSET (3, 0, hour_diff); default: goto bad_format; } } case L_('\0'): /* GNU extension: % at end of format. */ --f; FALLTHROUGH; default: /* Unknown format; output the format, including the '%', since this is most likely the right thing to do if a multibyte string has been misparsed. */ bad_format: { int flen; for (flen = 1; f[1 - flen] != L_('%'); flen++) continue; cpy (flen, &f[1 - flen]); } break; } } #if ! FPRINTFTIME if (p && maxsize != 0) *p = L_('\0'); #endif return i; } pspp-1.4.1/gl/errno.in.h0000644000175000017500000001640613723215636014437 0ustar00blpblp00000000000000/* A POSIX-like . Copyright (C) 2008-2020 Free Software Foundation, Inc. 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 3, 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, see . */ #ifndef _@GUARD_PREFIX@_ERRNO_H #if __GNUC__ >= 3 @PRAGMA_SYSTEM_HEADER@ #endif @PRAGMA_COLUMNS@ /* The include_next requires a split double-inclusion guard. */ #@INCLUDE_NEXT@ @NEXT_ERRNO_H@ #ifndef _@GUARD_PREFIX@_ERRNO_H #define _@GUARD_PREFIX@_ERRNO_H /* On native Windows platforms, many macros are not defined. */ # if defined _WIN32 && ! defined __CYGWIN__ /* These are the same values as defined by MSVC 10, for interoperability. */ # ifndef ENOMSG # define ENOMSG 122 # define GNULIB_defined_ENOMSG 1 # endif # ifndef EIDRM # define EIDRM 111 # define GNULIB_defined_EIDRM 1 # endif # ifndef ENOLINK # define ENOLINK 121 # define GNULIB_defined_ENOLINK 1 # endif # ifndef EPROTO # define EPROTO 134 # define GNULIB_defined_EPROTO 1 # endif # ifndef EBADMSG # define EBADMSG 104 # define GNULIB_defined_EBADMSG 1 # endif # ifndef EOVERFLOW # define EOVERFLOW 132 # define GNULIB_defined_EOVERFLOW 1 # endif # ifndef ENOTSUP # define ENOTSUP 129 # define GNULIB_defined_ENOTSUP 1 # endif # ifndef ENETRESET # define ENETRESET 117 # define GNULIB_defined_ENETRESET 1 # endif # ifndef ECONNABORTED # define ECONNABORTED 106 # define GNULIB_defined_ECONNABORTED 1 # endif # ifndef ECANCELED # define ECANCELED 105 # define GNULIB_defined_ECANCELED 1 # endif # ifndef EOWNERDEAD # define EOWNERDEAD 133 # define GNULIB_defined_EOWNERDEAD 1 # endif # ifndef ENOTRECOVERABLE # define ENOTRECOVERABLE 127 # define GNULIB_defined_ENOTRECOVERABLE 1 # endif # ifndef EINPROGRESS # define EINPROGRESS 112 # define EALREADY 103 # define ENOTSOCK 128 # define EDESTADDRREQ 109 # define EMSGSIZE 115 # define EPROTOTYPE 136 # define ENOPROTOOPT 123 # define EPROTONOSUPPORT 135 # define EOPNOTSUPP 130 # define EAFNOSUPPORT 102 # define EADDRINUSE 100 # define EADDRNOTAVAIL 101 # define ENETDOWN 116 # define ENETUNREACH 118 # define ECONNRESET 108 # define ENOBUFS 119 # define EISCONN 113 # define ENOTCONN 126 # define ETIMEDOUT 138 # define ECONNREFUSED 107 # define ELOOP 114 # define EHOSTUNREACH 110 # define EWOULDBLOCK 140 # define GNULIB_defined_ESOCK 1 # endif # ifndef ETXTBSY # define ETXTBSY 139 # define ENODATA 120 /* not required by POSIX */ # define ENOSR 124 /* not required by POSIX */ # define ENOSTR 125 /* not required by POSIX */ # define ETIME 137 /* not required by POSIX */ # define EOTHER 131 /* not required by POSIX */ # define GNULIB_defined_ESTREAMS 1 # endif /* These are intentionally the same values as the WSA* error numbers, defined in . */ # define ESOCKTNOSUPPORT 10044 /* not required by POSIX */ # define EPFNOSUPPORT 10046 /* not required by POSIX */ # define ESHUTDOWN 10058 /* not required by POSIX */ # define ETOOMANYREFS 10059 /* not required by POSIX */ # define EHOSTDOWN 10064 /* not required by POSIX */ # define EPROCLIM 10067 /* not required by POSIX */ # define EUSERS 10068 /* not required by POSIX */ # define EDQUOT 10069 # define ESTALE 10070 # define EREMOTE 10071 /* not required by POSIX */ # define GNULIB_defined_EWINSOCK 1 # endif /* On OSF/1 5.1, when _XOPEN_SOURCE_EXTENDED is not defined, the macros EMULTIHOP, ENOLINK, EOVERFLOW are not defined. */ # if @EMULTIHOP_HIDDEN@ # define EMULTIHOP @EMULTIHOP_VALUE@ # define GNULIB_defined_EMULTIHOP 1 # endif # if @ENOLINK_HIDDEN@ # define ENOLINK @ENOLINK_VALUE@ # define GNULIB_defined_ENOLINK 1 # endif # if @EOVERFLOW_HIDDEN@ # define EOVERFLOW @EOVERFLOW_VALUE@ # define GNULIB_defined_EOVERFLOW 1 # endif /* On OpenBSD 4.0 and on native Windows, the macros ENOMSG, EIDRM, ENOLINK, EPROTO, EMULTIHOP, EBADMSG, EOVERFLOW, ENOTSUP, ECANCELED are not defined. Likewise, on NonStop Kernel, EDQUOT is not defined. Define them here. Values >= 2000 seem safe to use: Solaris ESTALE = 151, HP-UX EWOULDBLOCK = 246, IRIX EDQUOT = 1133. Note: When one of these systems defines some of these macros some day, binaries will have to be recompiled so that they recognizes the new errno values from the system. */ # ifndef ENOMSG # define ENOMSG 2000 # define GNULIB_defined_ENOMSG 1 # endif # ifndef EIDRM # define EIDRM 2001 # define GNULIB_defined_EIDRM 1 # endif # ifndef ENOLINK # define ENOLINK 2002 # define GNULIB_defined_ENOLINK 1 # endif # ifndef EPROTO # define EPROTO 2003 # define GNULIB_defined_EPROTO 1 # endif # ifndef EMULTIHOP # define EMULTIHOP 2004 # define GNULIB_defined_EMULTIHOP 1 # endif # ifndef EBADMSG # define EBADMSG 2005 # define GNULIB_defined_EBADMSG 1 # endif # ifndef EOVERFLOW # define EOVERFLOW 2006 # define GNULIB_defined_EOVERFLOW 1 # endif # ifndef ENOTSUP # define ENOTSUP 2007 # define GNULIB_defined_ENOTSUP 1 # endif # ifndef ENETRESET # define ENETRESET 2011 # define GNULIB_defined_ENETRESET 1 # endif # ifndef ECONNABORTED # define ECONNABORTED 2012 # define GNULIB_defined_ECONNABORTED 1 # endif # ifndef ESTALE # define ESTALE 2009 # define GNULIB_defined_ESTALE 1 # endif # ifndef EDQUOT # define EDQUOT 2010 # define GNULIB_defined_EDQUOT 1 # endif # ifndef ECANCELED # define ECANCELED 2008 # define GNULIB_defined_ECANCELED 1 # endif /* On many platforms, the macros EOWNERDEAD and ENOTRECOVERABLE are not defined. */ # ifndef EOWNERDEAD # if defined __sun /* Use the same values as defined for Solaris >= 8, for interoperability. */ # define EOWNERDEAD 58 # define ENOTRECOVERABLE 59 # elif defined _WIN32 && ! defined __CYGWIN__ /* We have a conflict here: pthreads-win32 defines these values differently than MSVC 10. It's hairy to decide which one to use. */ # if defined __MINGW32__ && !defined USE_WINDOWS_THREADS /* Use the same values as defined by pthreads-win32, for interoperability. */ # define EOWNERDEAD 43 # define ENOTRECOVERABLE 44 # else /* Use the same values as defined by MSVC 10, for interoperability. */ # define EOWNERDEAD 133 # define ENOTRECOVERABLE 127 # endif # else # define EOWNERDEAD 2013 # define ENOTRECOVERABLE 2014 # endif # define GNULIB_defined_EOWNERDEAD 1 # define GNULIB_defined_ENOTRECOVERABLE 1 # endif # ifndef EILSEQ # define EILSEQ 2015 # define GNULIB_defined_EILSEQ 1 # endif #endif /* _@GUARD_PREFIX@_ERRNO_H */ #endif /* _@GUARD_PREFIX@_ERRNO_H */ pspp-1.4.1/gl/c-vasprintf.c0000644000175000017500000000242713723215636015132 0ustar00blpblp00000000000000/* Formatted output to strings in C locale. Copyright (C) 1999, 2002, 2006-2020 Free Software Foundation, Inc. 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 3, 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, see . */ #include /* Specification. */ #include "c-vasprintf.h" #include #include #include #include "c-vasnprintf.h" int c_vasprintf (char **resultp, const char *format, va_list args) { size_t length; char *result = c_vasnprintf (NULL, &length, format, args); if (result == NULL) return -1; if (length > INT_MAX) { free (result); errno = EOVERFLOW; return -1; } *resultp = result; /* Return the number of resulting bytes, excluding the trailing NUL. */ return length; } pspp-1.4.1/gl/asprintf.c0000644000175000017500000000210213723215636014512 0ustar00blpblp00000000000000/* Formatted output to strings. Copyright (C) 1999, 2002, 2006-2007, 2009-2020 Free Software Foundation, Inc. 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 3, 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, see . */ #include /* Specification. */ #ifdef IN_LIBASPRINTF # include "vasprintf.h" #else # include #endif #include int asprintf (char **resultp, const char *format, ...) { va_list args; int result; va_start (args, format); result = vasprintf (resultp, format, args); va_end (args); return result; } pspp-1.4.1/gl/strerror.c0000644000175000017500000000405313723215640014550 0ustar00blpblp00000000000000/* strerror.c --- POSIX compatible system error routine Copyright (C) 2007-2020 Free Software Foundation, Inc. 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 3 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, see . */ #include /* Specification. */ #include #include #include #include #include #include "intprops.h" #include "strerror-override.h" #include "verify.h" /* Use the system functions, not the gnulib overrides in this file. */ #undef sprintf char * strerror (int n) #undef strerror { static char buf[STACKBUF_LEN]; size_t len; /* Cast away const, due to the historical signature of strerror; callers should not be modifying the string. */ const char *msg = strerror_override (n); if (msg) return (char *) msg; msg = strerror (n); /* Our strerror_r implementation might use the system's strerror buffer, so all other clients of strerror have to see the error copied into a buffer that we manage. This is not thread-safe, even if the system strerror is, but portable programs shouldn't be using strerror if they care about thread-safety. */ if (!msg || !*msg) { static char const fmt[] = "Unknown error %d"; verify (sizeof buf >= sizeof (fmt) + INT_STRLEN_BOUND (n)); sprintf (buf, fmt, n); errno = EINVAL; return buf; } /* Fix STACKBUF_LEN if this ever aborts. */ len = strlen (msg); if (sizeof buf <= len) abort (); memcpy (buf, msg, len + 1); return buf; } pspp-1.4.1/gl/dirname-lgpl.c0000644000175000017500000000612113723215636015244 0ustar00blpblp00000000000000/* dirname.c -- return all but the last element in a file name Copyright (C) 1990, 1998, 2000-2001, 2003-2006, 2009-2020 Free Software Foundation, Inc. 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 3 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, see . */ #include #include "dirname.h" #include #include /* Return the length of the prefix of FILE that will be used by dir_name. If FILE is in the working directory, this returns zero even though 'dir_name (FILE)' will return ".". Works properly even if there are trailing slashes (by effectively ignoring them). */ size_t dir_len (char const *file) { size_t prefix_length = FILE_SYSTEM_PREFIX_LEN (file); size_t length; /* Advance prefix_length beyond important leading slashes. */ prefix_length += (prefix_length != 0 ? (FILE_SYSTEM_DRIVE_PREFIX_CAN_BE_RELATIVE && ISSLASH (file[prefix_length])) : (ISSLASH (file[0]) ? ((DOUBLE_SLASH_IS_DISTINCT_ROOT && ISSLASH (file[1]) && ! ISSLASH (file[2]) ? 2 : 1)) : 0)); /* Strip the basename and any redundant slashes before it. */ for (length = last_component (file) - file; prefix_length < length; length--) if (! ISSLASH (file[length - 1])) break; return length; } /* In general, we can't use the builtin 'dirname' function if available, since it has different meanings in different environments. In some environments the builtin 'dirname' modifies its argument. Return the leading directories part of FILE, allocated with malloc. Works properly even if there are trailing slashes (by effectively ignoring them). Return NULL on failure. If lstat (FILE) would succeed, then { chdir (dir_name (FILE)); lstat (base_name (FILE)); } will access the same file. Likewise, if the sequence { chdir (dir_name (FILE)); rename (base_name (FILE), "foo"); } succeeds, you have renamed FILE to "foo" in the same directory FILE was in. */ char * mdir_name (char const *file) { size_t length = dir_len (file); bool append_dot = (length == 0 || (FILE_SYSTEM_DRIVE_PREFIX_CAN_BE_RELATIVE && length == FILE_SYSTEM_PREFIX_LEN (file) && file[2] != '\0' && ! ISSLASH (file[2]))); char *dir = malloc (length + append_dot + 1); if (!dir) return NULL; memcpy (dir, file, length); if (append_dot) dir[length++] = '.'; dir[length] = '\0'; return dir; } pspp-1.4.1/gl/binary-io.c0000644000175000017500000000245713723215636014572 0ustar00blpblp00000000000000/* Binary mode I/O. Copyright 2017-2020 Free Software Foundation, Inc. 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 3 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, see . */ #include #define BINARY_IO_INLINE _GL_EXTERN_INLINE #include "binary-io.h" #if defined __DJGPP__ || defined __EMX__ # include int set_binary_mode (int fd, int mode) { if (isatty (fd)) /* If FD refers to a console (not a pipe, not a regular file), O_TEXT is the only reasonable mode, both on input and on output. Silently ignore the request. If we were to return -1 here, all programs that use xset_binary_mode would fail when run with console input or console output. */ return O_TEXT; else return __gl_setmode (fd, mode); } #endif pspp-1.4.1/gl/mbrtowc.c0000644000175000017500000000714413723215637014355 0ustar00blpblp00000000000000/* Convert multibyte character to wide character. Copyright (C) 1999-2002, 2005-2020 Free Software Foundation, Inc. Written by Bruno Haible , 2008. 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 3 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, see . */ #include /* Specification. */ #include #if GNULIB_defined_mbstate_t /* Implement mbrtowc() on top of mbtowc() for the non-UTF-8 locales and directly for the UTF-8 locales. */ # include # include # include # if defined _WIN32 && !defined __CYGWIN__ # define WIN32_LEAN_AND_MEAN /* avoid including junk */ # include # elif HAVE_PTHREAD_API # include # if HAVE_THREADS_H && HAVE_WEAK_SYMBOLS # include # pragma weak thrd_exit # define c11_threads_in_use() (thrd_exit != NULL) # else # define c11_threads_in_use() 0 # endif # elif HAVE_THREADS_H # include # endif # include "attribute.h" # include "verify.h" # include "lc-charset-dispatch.h" # include "mbtowc-lock.h" verify (sizeof (mbstate_t) >= 4); static char internal_state[4]; size_t mbrtowc (wchar_t *pwc, const char *s, size_t n, mbstate_t *ps) { # define FITS_IN_CHAR_TYPE(wc) ((wc) <= WCHAR_MAX) # include "mbrtowc-impl.h" } #else /* Override the system's mbrtowc() function. */ # if MBRTOWC_IN_C_LOCALE_MAYBE_EILSEQ # include "hard-locale.h" # include # endif # undef mbrtowc size_t rpl_mbrtowc (wchar_t *pwc, const char *s, size_t n, mbstate_t *ps) { size_t ret; wchar_t wc; # if MBRTOWC_NULL_ARG2_BUG || MBRTOWC_RETVAL_BUG || MBRTOWC_EMPTY_INPUT_BUG if (s == NULL) { pwc = NULL; s = ""; n = 1; } # endif # if MBRTOWC_EMPTY_INPUT_BUG if (n == 0) return (size_t) -2; # endif if (! pwc) pwc = &wc; # if MBRTOWC_RETVAL_BUG { static mbstate_t internal_state; /* Override mbrtowc's internal state. We cannot call mbsinit() on the hidden internal state, but we can call it on our variable. */ if (ps == NULL) ps = &internal_state; if (!mbsinit (ps)) { /* Parse the rest of the multibyte character byte for byte. */ size_t count = 0; for (; n > 0; s++, n--) { ret = mbrtowc (&wc, s, 1, ps); if (ret == (size_t)(-1)) return (size_t)(-1); count++; if (ret != (size_t)(-2)) { /* The multibyte character has been completed. */ *pwc = wc; return (wc == 0 ? 0 : count); } } return (size_t)(-2); } } # endif # if MBRTOWC_STORES_INCOMPLETE_BUG ret = mbrtowc (&wc, s, n, ps); if (ret < (size_t) -2 && pwc != NULL) *pwc = wc; # else ret = mbrtowc (pwc, s, n, ps); # endif # if MBRTOWC_NUL_RETVAL_BUG if (ret < (size_t) -2 && !*pwc) return 0; # endif # if MBRTOWC_IN_C_LOCALE_MAYBE_EILSEQ if ((size_t) -2 <= ret && n != 0 && ! hard_locale (LC_CTYPE)) { unsigned char uc = *s; *pwc = uc; return 1; } # endif return ret; } #endif pspp-1.4.1/gl/signal.in.h0000644000175000017500000003622113723215640014557 0ustar00blpblp00000000000000/* A GNU-like . Copyright (C) 2006-2020 Free Software Foundation, Inc. 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 3 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, see . */ #if __GNUC__ >= 3 @PRAGMA_SYSTEM_HEADER@ #endif @PRAGMA_COLUMNS@ #if defined __need_sig_atomic_t || defined __need_sigset_t || defined _GL_ALREADY_INCLUDING_SIGNAL_H || (defined _SIGNAL_H && !defined __SIZEOF_PTHREAD_MUTEX_T) /* Special invocation convention: - Inside glibc header files. - On glibc systems we have a sequence of nested includes -> -> . In this situation, the functions are not yet declared, therefore we cannot provide the C++ aliases. - On glibc systems with GCC 4.3 we have a sequence of nested includes -> -> -> . In this situation, some of the functions are not yet declared, therefore we cannot provide the C++ aliases. */ # @INCLUDE_NEXT@ @NEXT_SIGNAL_H@ #else /* Normal invocation convention. */ #ifndef _@GUARD_PREFIX@_SIGNAL_H #define _GL_ALREADY_INCLUDING_SIGNAL_H /* Define pid_t, uid_t. Also, mingw defines sigset_t not in , but in . On Solaris 10, includes , which eventually includes us; so include now, before the second inclusion guard. */ #include /* The include_next requires a split double-inclusion guard. */ #@INCLUDE_NEXT@ @NEXT_SIGNAL_H@ #undef _GL_ALREADY_INCLUDING_SIGNAL_H #ifndef _@GUARD_PREFIX@_SIGNAL_H #define _@GUARD_PREFIX@_SIGNAL_H /* Mac OS X 10.3, FreeBSD 6.4, OpenBSD 3.8, OSF/1 4.0, Solaris 2.6, Android declare pthread_sigmask in , not in . But avoid namespace pollution on glibc systems.*/ #if (@GNULIB_PTHREAD_SIGMASK@ || defined GNULIB_POSIXCHECK) \ && ((defined __APPLE__ && defined __MACH__) \ || defined __FreeBSD__ || defined __OpenBSD__ || defined __osf__ \ || defined __sun || defined __ANDROID__) \ && ! defined __GLIBC__ # include #endif /* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */ /* The definition of _GL_ARG_NONNULL is copied here. */ /* The definition of _GL_WARN_ON_USE is copied here. */ /* On AIX, sig_atomic_t already includes volatile. C99 requires that 'volatile sig_atomic_t' ignore the extra modifier, but C89 did not. Hence, redefine this to a non-volatile type as needed. */ #if ! @HAVE_TYPE_VOLATILE_SIG_ATOMIC_T@ # if !GNULIB_defined_sig_atomic_t typedef int rpl_sig_atomic_t; # undef sig_atomic_t # define sig_atomic_t rpl_sig_atomic_t # define GNULIB_defined_sig_atomic_t 1 # endif #endif /* A set or mask of signals. */ #if !@HAVE_SIGSET_T@ # if !GNULIB_defined_sigset_t typedef unsigned int sigset_t; # define GNULIB_defined_sigset_t 1 # endif #endif /* Define sighandler_t, the type of signal handlers. A GNU extension. */ #if !@HAVE_SIGHANDLER_T@ # ifdef __cplusplus extern "C" { # endif # if !GNULIB_defined_sighandler_t typedef void (*sighandler_t) (int); # define GNULIB_defined_sighandler_t 1 # endif # ifdef __cplusplus } # endif #endif #if @GNULIB_SIGNAL_H_SIGPIPE@ # ifndef SIGPIPE /* Define SIGPIPE to a value that does not overlap with other signals. */ # define SIGPIPE 13 # define GNULIB_defined_SIGPIPE 1 /* To actually use SIGPIPE, you also need the gnulib modules 'sigprocmask', 'write', 'stdio'. */ # endif #endif /* Maximum signal number + 1. */ #ifndef NSIG # if defined __TANDEM # define NSIG 32 # endif #endif #if @GNULIB_PTHREAD_SIGMASK@ # if @REPLACE_PTHREAD_SIGMASK@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef pthread_sigmask # define pthread_sigmask rpl_pthread_sigmask # endif _GL_FUNCDECL_RPL (pthread_sigmask, int, (int how, const sigset_t *restrict new_mask, sigset_t *restrict old_mask)); _GL_CXXALIAS_RPL (pthread_sigmask, int, (int how, const sigset_t *restrict new_mask, sigset_t *restrict old_mask)); # else # if !(@HAVE_PTHREAD_SIGMASK@ || defined pthread_sigmask) _GL_FUNCDECL_SYS (pthread_sigmask, int, (int how, const sigset_t *restrict new_mask, sigset_t *restrict old_mask)); # endif _GL_CXXALIAS_SYS (pthread_sigmask, int, (int how, const sigset_t *restrict new_mask, sigset_t *restrict old_mask)); # endif # if __GLIBC__ >= 2 _GL_CXXALIASWARN (pthread_sigmask); # endif #elif defined GNULIB_POSIXCHECK # undef pthread_sigmask # if HAVE_RAW_DECL_PTHREAD_SIGMASK _GL_WARN_ON_USE (pthread_sigmask, "pthread_sigmask is not portable - " "use gnulib module pthread_sigmask for portability"); # endif #endif #if @GNULIB_RAISE@ # if @REPLACE_RAISE@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef raise # define raise rpl_raise # endif _GL_FUNCDECL_RPL (raise, int, (int sig)); _GL_CXXALIAS_RPL (raise, int, (int sig)); # else # if !@HAVE_RAISE@ _GL_FUNCDECL_SYS (raise, int, (int sig)); # endif _GL_CXXALIAS_SYS (raise, int, (int sig)); # endif # if __GLIBC__ >= 2 _GL_CXXALIASWARN (raise); # endif #elif defined GNULIB_POSIXCHECK # undef raise /* Assume raise is always declared. */ _GL_WARN_ON_USE (raise, "raise can crash on native Windows - " "use gnulib module raise for portability"); #endif #if @GNULIB_SIGPROCMASK@ # if !@HAVE_POSIX_SIGNALBLOCKING@ # ifndef GNULIB_defined_signal_blocking # define GNULIB_defined_signal_blocking 1 # endif /* Maximum signal number + 1. */ # ifndef NSIG # define NSIG 32 # endif /* This code supports only 32 signals. */ # if !GNULIB_defined_verify_NSIG_constraint typedef int verify_NSIG_constraint[NSIG <= 32 ? 1 : -1]; # define GNULIB_defined_verify_NSIG_constraint 1 # endif # endif /* When also using extern inline, suppress the use of static inline in standard headers of problematic Apple configurations, as Libc at least through Libc-825.26 (2013-04-09) mishandles it; see, e.g., . Perhaps Apple will fix this some day. */ #if (defined _GL_EXTERN_INLINE_IN_USE && defined __APPLE__ \ && (defined __i386__ || defined __x86_64__)) # undef sigaddset # undef sigdelset # undef sigemptyset # undef sigfillset # undef sigismember #endif /* Test whether a given signal is contained in a signal set. */ # if @HAVE_POSIX_SIGNALBLOCKING@ /* This function is defined as a macro on Mac OS X. */ # if defined __cplusplus && defined GNULIB_NAMESPACE # undef sigismember # endif # else _GL_FUNCDECL_SYS (sigismember, int, (const sigset_t *set, int sig) _GL_ARG_NONNULL ((1))); # endif _GL_CXXALIAS_SYS (sigismember, int, (const sigset_t *set, int sig)); _GL_CXXALIASWARN (sigismember); /* Initialize a signal set to the empty set. */ # if @HAVE_POSIX_SIGNALBLOCKING@ /* This function is defined as a macro on Mac OS X. */ # if defined __cplusplus && defined GNULIB_NAMESPACE # undef sigemptyset # endif # else _GL_FUNCDECL_SYS (sigemptyset, int, (sigset_t *set) _GL_ARG_NONNULL ((1))); # endif _GL_CXXALIAS_SYS (sigemptyset, int, (sigset_t *set)); _GL_CXXALIASWARN (sigemptyset); /* Add a signal to a signal set. */ # if @HAVE_POSIX_SIGNALBLOCKING@ /* This function is defined as a macro on Mac OS X. */ # if defined __cplusplus && defined GNULIB_NAMESPACE # undef sigaddset # endif # else _GL_FUNCDECL_SYS (sigaddset, int, (sigset_t *set, int sig) _GL_ARG_NONNULL ((1))); # endif _GL_CXXALIAS_SYS (sigaddset, int, (sigset_t *set, int sig)); _GL_CXXALIASWARN (sigaddset); /* Remove a signal from a signal set. */ # if @HAVE_POSIX_SIGNALBLOCKING@ /* This function is defined as a macro on Mac OS X. */ # if defined __cplusplus && defined GNULIB_NAMESPACE # undef sigdelset # endif # else _GL_FUNCDECL_SYS (sigdelset, int, (sigset_t *set, int sig) _GL_ARG_NONNULL ((1))); # endif _GL_CXXALIAS_SYS (sigdelset, int, (sigset_t *set, int sig)); _GL_CXXALIASWARN (sigdelset); /* Fill a signal set with all possible signals. */ # if @HAVE_POSIX_SIGNALBLOCKING@ /* This function is defined as a macro on Mac OS X. */ # if defined __cplusplus && defined GNULIB_NAMESPACE # undef sigfillset # endif # else _GL_FUNCDECL_SYS (sigfillset, int, (sigset_t *set) _GL_ARG_NONNULL ((1))); # endif _GL_CXXALIAS_SYS (sigfillset, int, (sigset_t *set)); _GL_CXXALIASWARN (sigfillset); /* Return the set of those blocked signals that are pending. */ # if !@HAVE_POSIX_SIGNALBLOCKING@ _GL_FUNCDECL_SYS (sigpending, int, (sigset_t *set) _GL_ARG_NONNULL ((1))); # endif _GL_CXXALIAS_SYS (sigpending, int, (sigset_t *set)); _GL_CXXALIASWARN (sigpending); /* If OLD_SET is not NULL, put the current set of blocked signals in *OLD_SET. Then, if SET is not NULL, affect the current set of blocked signals by combining it with *SET as indicated in OPERATION. In this implementation, you are not allowed to change a signal handler while the signal is blocked. */ # if !@HAVE_POSIX_SIGNALBLOCKING@ # define SIG_BLOCK 0 /* blocked_set = blocked_set | *set; */ # define SIG_SETMASK 1 /* blocked_set = *set; */ # define SIG_UNBLOCK 2 /* blocked_set = blocked_set & ~*set; */ _GL_FUNCDECL_SYS (sigprocmask, int, (int operation, const sigset_t *restrict set, sigset_t *restrict old_set)); # endif _GL_CXXALIAS_SYS (sigprocmask, int, (int operation, const sigset_t *restrict set, sigset_t *restrict old_set)); _GL_CXXALIASWARN (sigprocmask); /* Install the handler FUNC for signal SIG, and return the previous handler. */ # ifdef __cplusplus extern "C" { # endif # if !GNULIB_defined_function_taking_int_returning_void_t typedef void (*_gl_function_taking_int_returning_void_t) (int); # define GNULIB_defined_function_taking_int_returning_void_t 1 # endif # ifdef __cplusplus } # endif # if !@HAVE_POSIX_SIGNALBLOCKING@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # define signal rpl_signal # endif _GL_FUNCDECL_RPL (signal, _gl_function_taking_int_returning_void_t, (int sig, _gl_function_taking_int_returning_void_t func)); _GL_CXXALIAS_RPL (signal, _gl_function_taking_int_returning_void_t, (int sig, _gl_function_taking_int_returning_void_t func)); # else /* On OpenBSD, the declaration of 'signal' may not be present at this point, because it occurs in , not directly. */ # if defined __OpenBSD__ _GL_FUNCDECL_SYS (signal, _gl_function_taking_int_returning_void_t, (int sig, _gl_function_taking_int_returning_void_t func)); # endif _GL_CXXALIAS_SYS (signal, _gl_function_taking_int_returning_void_t, (int sig, _gl_function_taking_int_returning_void_t func)); # endif # if __GLIBC__ >= 2 _GL_CXXALIASWARN (signal); # endif # if !@HAVE_POSIX_SIGNALBLOCKING@ && GNULIB_defined_SIGPIPE /* Raise signal SIGPIPE. */ _GL_EXTERN_C int _gl_raise_SIGPIPE (void); # endif #elif defined GNULIB_POSIXCHECK # undef sigaddset # if HAVE_RAW_DECL_SIGADDSET _GL_WARN_ON_USE (sigaddset, "sigaddset is unportable - " "use the gnulib module sigprocmask for portability"); # endif # undef sigdelset # if HAVE_RAW_DECL_SIGDELSET _GL_WARN_ON_USE (sigdelset, "sigdelset is unportable - " "use the gnulib module sigprocmask for portability"); # endif # undef sigemptyset # if HAVE_RAW_DECL_SIGEMPTYSET _GL_WARN_ON_USE (sigemptyset, "sigemptyset is unportable - " "use the gnulib module sigprocmask for portability"); # endif # undef sigfillset # if HAVE_RAW_DECL_SIGFILLSET _GL_WARN_ON_USE (sigfillset, "sigfillset is unportable - " "use the gnulib module sigprocmask for portability"); # endif # undef sigismember # if HAVE_RAW_DECL_SIGISMEMBER _GL_WARN_ON_USE (sigismember, "sigismember is unportable - " "use the gnulib module sigprocmask for portability"); # endif # undef sigpending # if HAVE_RAW_DECL_SIGPENDING _GL_WARN_ON_USE (sigpending, "sigpending is unportable - " "use the gnulib module sigprocmask for portability"); # endif # undef sigprocmask # if HAVE_RAW_DECL_SIGPROCMASK _GL_WARN_ON_USE (sigprocmask, "sigprocmask is unportable - " "use the gnulib module sigprocmask for portability"); # endif #endif /* @GNULIB_SIGPROCMASK@ */ #if @GNULIB_SIGACTION@ # if !@HAVE_SIGACTION@ # if !@HAVE_SIGINFO_T@ # if !GNULIB_defined_siginfo_types /* Present to allow compilation, but unsupported by gnulib. */ union sigval { int sival_int; void *sival_ptr; }; /* Present to allow compilation, but unsupported by gnulib. */ struct siginfo_t { int si_signo; int si_code; int si_errno; pid_t si_pid; uid_t si_uid; void *si_addr; int si_status; long si_band; union sigval si_value; }; typedef struct siginfo_t siginfo_t; # define GNULIB_defined_siginfo_types 1 # endif # endif /* !@HAVE_SIGINFO_T@ */ /* We assume that platforms which lack the sigaction() function also lack the 'struct sigaction' type, and vice versa. */ # if !GNULIB_defined_struct_sigaction struct sigaction { union { void (*_sa_handler) (int); /* Present to allow compilation, but unsupported by gnulib. POSIX says that implementations may, but not must, make sa_sigaction overlap with sa_handler, but we know of no implementation where they do not overlap. */ void (*_sa_sigaction) (int, siginfo_t *, void *); } _sa_func; sigset_t sa_mask; /* Not all POSIX flags are supported. */ int sa_flags; }; # define sa_handler _sa_func._sa_handler # define sa_sigaction _sa_func._sa_sigaction /* Unsupported flags are not present. */ # define SA_RESETHAND 1 # define SA_NODEFER 2 # define SA_RESTART 4 # define GNULIB_defined_struct_sigaction 1 # endif _GL_FUNCDECL_SYS (sigaction, int, (int, const struct sigaction *restrict, struct sigaction *restrict)); # elif !@HAVE_STRUCT_SIGACTION_SA_SIGACTION@ # define sa_sigaction sa_handler # endif /* !@HAVE_SIGACTION@, !@HAVE_STRUCT_SIGACTION_SA_SIGACTION@ */ _GL_CXXALIAS_SYS (sigaction, int, (int, const struct sigaction *restrict, struct sigaction *restrict)); _GL_CXXALIASWARN (sigaction); #elif defined GNULIB_POSIXCHECK # undef sigaction # if HAVE_RAW_DECL_SIGACTION _GL_WARN_ON_USE (sigaction, "sigaction is unportable - " "use the gnulib module sigaction for portability"); # endif #endif /* Some systems don't have SA_NODEFER. */ #ifndef SA_NODEFER # define SA_NODEFER 0 #endif #endif /* _@GUARD_PREFIX@_SIGNAL_H */ #endif /* _@GUARD_PREFIX@_SIGNAL_H */ #endif pspp-1.4.1/gl/_Noreturn.h0000644000175000017500000000377313723215636014663 0ustar00blpblp00000000000000/* A C macro for declaring that a function does not return. Copyright (C) 2011-2020 Free Software Foundation, Inc. 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 3 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, see . */ #ifndef _Noreturn # if (defined __cplusplus \ && ((201103 <= __cplusplus && !(__GNUC__ == 4 && __GNUC_MINOR__ == 7)) \ || (defined _MSC_VER && 1900 <= _MSC_VER)) \ && 0) /* [[noreturn]] is not practically usable, because with it the syntax extern _Noreturn void func (...); would not be valid; such a declaration would only be valid with 'extern' and '_Noreturn' swapped, or without the 'extern' keyword. However, some AIX system header files and several gnulib header files use precisely this syntax with 'extern'. */ # define _Noreturn [[noreturn]] # elif ((!defined __cplusplus || defined __clang__) \ && (201112 <= (defined __STDC_VERSION__ ? __STDC_VERSION__ : 0) \ || 4 < __GNUC__ + (7 <= __GNUC_MINOR__) \ || (defined __apple_build_version__ \ ? 6000000 <= __apple_build_version__ \ : 3 < __clang_major__ + (5 <= __clang_minor__)))) /* _Noreturn works as-is. */ # elif 2 < __GNUC__ + (8 <= __GNUC_MINOR__) || 0x5110 <= __SUNPRO_C # define _Noreturn __attribute__ ((__noreturn__)) # elif 1200 <= (defined _MSC_VER ? _MSC_VER : 0) # define _Noreturn __declspec (noreturn) # else # define _Noreturn # endif #endif pspp-1.4.1/gl/regex_internal.h0000644000175000017500000005640613723215640015712 0ustar00blpblp00000000000000/* Extended regular expression matching and search library. Copyright (C) 2002-2020 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Isamu Hasegawa . The GNU C Library 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 3 of the License, or (at your option) any later version. The GNU C Library 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 the GNU C Library; if not, see . */ #ifndef _REGEX_INTERNAL_H #define _REGEX_INTERNAL_H 1 #include #include #include #include #include #include #include #include #include #include #include #include #if defined DEBUG && DEBUG != 0 # include # define DEBUG_ASSERT(x) assert (x) #else # define DEBUG_ASSERT(x) assume (x) #endif #ifdef _LIBC # include # define lock_define(name) __libc_lock_define (, name) # define lock_init(lock) (__libc_lock_init (lock), 0) # define lock_fini(lock) ((void) 0) # define lock_lock(lock) __libc_lock_lock (lock) # define lock_unlock(lock) __libc_lock_unlock (lock) #elif defined GNULIB_LOCK && !defined USE_UNLOCKED_IO # include "glthread/lock.h" # define lock_define(name) gl_lock_define (, name) # define lock_init(lock) glthread_lock_init (&(lock)) # define lock_fini(lock) glthread_lock_destroy (&(lock)) # define lock_lock(lock) glthread_lock_lock (&(lock)) # define lock_unlock(lock) glthread_lock_unlock (&(lock)) #elif defined GNULIB_PTHREAD && !defined USE_UNLOCKED_IO # include # define lock_define(name) pthread_mutex_t name; # define lock_init(lock) pthread_mutex_init (&(lock), 0) # define lock_fini(lock) pthread_mutex_destroy (&(lock)) # define lock_lock(lock) pthread_mutex_lock (&(lock)) # define lock_unlock(lock) pthread_mutex_unlock (&(lock)) #else # define lock_define(name) # define lock_init(lock) 0 # define lock_fini(lock) ((void) 0) /* The 'dfa' avoids an "unused variable 'dfa'" warning from GCC. */ # define lock_lock(lock) ((void) dfa) # define lock_unlock(lock) ((void) 0) #endif /* In case that the system doesn't have isblank(). */ #if !defined _LIBC && ! (defined isblank || (HAVE_ISBLANK && HAVE_DECL_ISBLANK)) # define isblank(ch) ((ch) == ' ' || (ch) == '\t') #endif #ifdef _LIBC # ifndef _RE_DEFINE_LOCALE_FUNCTIONS # define _RE_DEFINE_LOCALE_FUNCTIONS 1 # include # include # endif #endif /* This is for other GNU distributions with internationalized messages. */ #if (HAVE_LIBINTL_H && ENABLE_NLS) || defined _LIBC # include # ifdef _LIBC # undef gettext # define gettext(msgid) \ __dcgettext (_libc_intl_domainname, msgid, LC_MESSAGES) # endif #else # undef gettext # define gettext(msgid) (msgid) #endif #ifndef gettext_noop /* This define is so xgettext can find the internationalizable strings. */ # define gettext_noop(String) String #endif #if (defined MB_CUR_MAX && HAVE_WCTYPE_H && HAVE_ISWCTYPE) || _LIBC # define RE_ENABLE_I18N #endif /* Number of ASCII characters. */ #define ASCII_CHARS 0x80 /* Number of single byte characters. */ #define SBC_MAX (UCHAR_MAX + 1) #define COLL_ELEM_LEN_MAX 8 /* The character which represents newline. */ #define NEWLINE_CHAR '\n' #define WIDE_NEWLINE_CHAR L'\n' /* Rename to standard API for using out of glibc. */ #ifndef _LIBC # undef __wctype # undef __iswalnum # undef __iswctype # undef __towlower # undef __towupper # define __wctype wctype # define __iswalnum iswalnum # define __iswctype iswctype # define __towlower towlower # define __towupper towupper # define __btowc btowc # define __mbrtowc mbrtowc # define __wcrtomb wcrtomb # define __regfree regfree #endif /* not _LIBC */ #ifndef SSIZE_MAX # define SSIZE_MAX ((ssize_t) (SIZE_MAX / 2)) #endif #ifndef ULONG_WIDTH # define ULONG_WIDTH REGEX_UINTEGER_WIDTH (ULONG_MAX) /* The number of usable bits in an unsigned integer type with maximum value MAX, as an int expression suitable in #if. Cover all known practical hosts. This implementation exploits the fact that MAX is 1 less than a power of 2, and merely counts the number of 1 bits in MAX; "COBn" means "count the number of 1 bits in the low-order n bits". */ # define REGEX_UINTEGER_WIDTH(max) REGEX_COB128 (max) # define REGEX_COB128(n) (REGEX_COB64 ((n) >> 31 >> 31 >> 2) + REGEX_COB64 (n)) # define REGEX_COB64(n) (REGEX_COB32 ((n) >> 31 >> 1) + REGEX_COB32 (n)) # define REGEX_COB32(n) (REGEX_COB16 ((n) >> 16) + REGEX_COB16 (n)) # define REGEX_COB16(n) (REGEX_COB8 ((n) >> 8) + REGEX_COB8 (n)) # define REGEX_COB8(n) (REGEX_COB4 ((n) >> 4) + REGEX_COB4 (n)) # define REGEX_COB4(n) (!!((n) & 8) + !!((n) & 4) + !!((n) & 2) + ((n) & 1)) # if ULONG_MAX / 2 + 1 != 1ul << (ULONG_WIDTH - 1) # error "ULONG_MAX out of range" # endif #endif /* The type of indexes into strings. This is signed, not size_t, since the API requires indexes to fit in regoff_t anyway, and using signed integers makes the code a bit smaller and presumably faster. The traditional GNU regex implementation uses int for indexes. The POSIX-compatible implementation uses a possibly-wider type. The name 'Idx' is three letters to minimize the hassle of reindenting a lot of regex code that formerly used 'int'. */ typedef regoff_t Idx; #ifdef _REGEX_LARGE_OFFSETS # define IDX_MAX SSIZE_MAX #else # define IDX_MAX INT_MAX #endif /* A hash value, suitable for computing hash tables. */ typedef __re_size_t re_hashval_t; /* An integer used to represent a set of bits. It must be unsigned, and must be at least as wide as unsigned int. */ typedef unsigned long int bitset_word_t; /* All bits set in a bitset_word_t. */ #define BITSET_WORD_MAX ULONG_MAX /* Number of bits in a bitset_word_t. */ #define BITSET_WORD_BITS ULONG_WIDTH /* Number of bitset_word_t values in a bitset_t. */ #define BITSET_WORDS ((SBC_MAX + BITSET_WORD_BITS - 1) / BITSET_WORD_BITS) typedef bitset_word_t bitset_t[BITSET_WORDS]; typedef bitset_word_t *re_bitset_ptr_t; typedef const bitset_word_t *re_const_bitset_ptr_t; #define PREV_WORD_CONSTRAINT 0x0001 #define PREV_NOTWORD_CONSTRAINT 0x0002 #define NEXT_WORD_CONSTRAINT 0x0004 #define NEXT_NOTWORD_CONSTRAINT 0x0008 #define PREV_NEWLINE_CONSTRAINT 0x0010 #define NEXT_NEWLINE_CONSTRAINT 0x0020 #define PREV_BEGBUF_CONSTRAINT 0x0040 #define NEXT_ENDBUF_CONSTRAINT 0x0080 #define WORD_DELIM_CONSTRAINT 0x0100 #define NOT_WORD_DELIM_CONSTRAINT 0x0200 typedef enum { INSIDE_WORD = PREV_WORD_CONSTRAINT | NEXT_WORD_CONSTRAINT, WORD_FIRST = PREV_NOTWORD_CONSTRAINT | NEXT_WORD_CONSTRAINT, WORD_LAST = PREV_WORD_CONSTRAINT | NEXT_NOTWORD_CONSTRAINT, INSIDE_NOTWORD = PREV_NOTWORD_CONSTRAINT | NEXT_NOTWORD_CONSTRAINT, LINE_FIRST = PREV_NEWLINE_CONSTRAINT, LINE_LAST = NEXT_NEWLINE_CONSTRAINT, BUF_FIRST = PREV_BEGBUF_CONSTRAINT, BUF_LAST = NEXT_ENDBUF_CONSTRAINT, WORD_DELIM = WORD_DELIM_CONSTRAINT, NOT_WORD_DELIM = NOT_WORD_DELIM_CONSTRAINT } re_context_type; typedef struct { Idx alloc; Idx nelem; Idx *elems; } re_node_set; typedef enum { NON_TYPE = 0, /* Node type, These are used by token, node, tree. */ CHARACTER = 1, END_OF_RE = 2, SIMPLE_BRACKET = 3, OP_BACK_REF = 4, OP_PERIOD = 5, #ifdef RE_ENABLE_I18N COMPLEX_BRACKET = 6, OP_UTF8_PERIOD = 7, #endif /* RE_ENABLE_I18N */ /* We define EPSILON_BIT as a macro so that OP_OPEN_SUBEXP is used when the debugger shows values of this enum type. */ #define EPSILON_BIT 8 OP_OPEN_SUBEXP = EPSILON_BIT | 0, OP_CLOSE_SUBEXP = EPSILON_BIT | 1, OP_ALT = EPSILON_BIT | 2, OP_DUP_ASTERISK = EPSILON_BIT | 3, ANCHOR = EPSILON_BIT | 4, /* Tree type, these are used only by tree. */ CONCAT = 16, SUBEXP = 17, /* Token type, these are used only by token. */ OP_DUP_PLUS = 18, OP_DUP_QUESTION, OP_OPEN_BRACKET, OP_CLOSE_BRACKET, OP_CHARSET_RANGE, OP_OPEN_DUP_NUM, OP_CLOSE_DUP_NUM, OP_NON_MATCH_LIST, OP_OPEN_COLL_ELEM, OP_CLOSE_COLL_ELEM, OP_OPEN_EQUIV_CLASS, OP_CLOSE_EQUIV_CLASS, OP_OPEN_CHAR_CLASS, OP_CLOSE_CHAR_CLASS, OP_WORD, OP_NOTWORD, OP_SPACE, OP_NOTSPACE, BACK_SLASH } re_token_type_t; #ifdef RE_ENABLE_I18N typedef struct { /* Multibyte characters. */ wchar_t *mbchars; /* Collating symbols. */ # ifdef _LIBC int32_t *coll_syms; # endif /* Equivalence classes. */ # ifdef _LIBC int32_t *equiv_classes; # endif /* Range expressions. */ # ifdef _LIBC uint32_t *range_starts; uint32_t *range_ends; # else /* not _LIBC */ wchar_t *range_starts; wchar_t *range_ends; # endif /* not _LIBC */ /* Character classes. */ wctype_t *char_classes; /* If this character set is the non-matching list. */ unsigned int non_match : 1; /* # of multibyte characters. */ Idx nmbchars; /* # of collating symbols. */ Idx ncoll_syms; /* # of equivalence classes. */ Idx nequiv_classes; /* # of range expressions. */ Idx nranges; /* # of character classes. */ Idx nchar_classes; } re_charset_t; #endif /* RE_ENABLE_I18N */ typedef struct { union { unsigned char c; /* for CHARACTER */ re_bitset_ptr_t sbcset; /* for SIMPLE_BRACKET */ #ifdef RE_ENABLE_I18N re_charset_t *mbcset; /* for COMPLEX_BRACKET */ #endif /* RE_ENABLE_I18N */ Idx idx; /* for BACK_REF */ re_context_type ctx_type; /* for ANCHOR */ } opr; #if __GNUC__ >= 2 && !defined __STRICT_ANSI__ re_token_type_t type : 8; #else re_token_type_t type; #endif unsigned int constraint : 10; /* context constraint */ unsigned int duplicated : 1; unsigned int opt_subexp : 1; #ifdef RE_ENABLE_I18N unsigned int accept_mb : 1; /* These 2 bits can be moved into the union if needed (e.g. if running out of bits; move opr.c to opr.c.c and move the flags to opr.c.flags). */ unsigned int mb_partial : 1; #endif unsigned int word_char : 1; } re_token_t; #define IS_EPSILON_NODE(type) ((type) & EPSILON_BIT) struct re_string_t { /* Indicate the raw buffer which is the original string passed as an argument of regexec(), re_search(), etc.. */ const unsigned char *raw_mbs; /* Store the multibyte string. In case of "case insensitive mode" like REG_ICASE, upper cases of the string are stored, otherwise MBS points the same address that RAW_MBS points. */ unsigned char *mbs; #ifdef RE_ENABLE_I18N /* Store the wide character string which is corresponding to MBS. */ wint_t *wcs; Idx *offsets; mbstate_t cur_state; #endif /* Index in RAW_MBS. Each character mbs[i] corresponds to raw_mbs[raw_mbs_idx + i]. */ Idx raw_mbs_idx; /* The length of the valid characters in the buffers. */ Idx valid_len; /* The corresponding number of bytes in raw_mbs array. */ Idx valid_raw_len; /* The length of the buffers MBS and WCS. */ Idx bufs_len; /* The index in MBS, which is updated by re_string_fetch_byte. */ Idx cur_idx; /* length of RAW_MBS array. */ Idx raw_len; /* This is RAW_LEN - RAW_MBS_IDX + VALID_LEN - VALID_RAW_LEN. */ Idx len; /* End of the buffer may be shorter than its length in the cases such as re_match_2, re_search_2. Then, we use STOP for end of the buffer instead of LEN. */ Idx raw_stop; /* This is RAW_STOP - RAW_MBS_IDX adjusted through OFFSETS. */ Idx stop; /* The context of mbs[0]. We store the context independently, since the context of mbs[0] may be different from raw_mbs[0], which is the beginning of the input string. */ unsigned int tip_context; /* The translation passed as a part of an argument of re_compile_pattern. */ RE_TRANSLATE_TYPE trans; /* Copy of re_dfa_t's word_char. */ re_const_bitset_ptr_t word_char; /* true if REG_ICASE. */ unsigned char icase; unsigned char is_utf8; unsigned char map_notascii; unsigned char mbs_allocated; unsigned char offsets_needed; unsigned char newline_anchor; unsigned char word_ops_used; int mb_cur_max; }; typedef struct re_string_t re_string_t; struct re_dfa_t; typedef struct re_dfa_t re_dfa_t; #ifndef _LIBC # define IS_IN(libc) false #endif #define re_string_peek_byte(pstr, offset) \ ((pstr)->mbs[(pstr)->cur_idx + offset]) #define re_string_fetch_byte(pstr) \ ((pstr)->mbs[(pstr)->cur_idx++]) #define re_string_first_byte(pstr, idx) \ ((idx) == (pstr)->valid_len || (pstr)->wcs[idx] != WEOF) #define re_string_is_single_byte_char(pstr, idx) \ ((pstr)->wcs[idx] != WEOF && ((pstr)->valid_len == (idx) + 1 \ || (pstr)->wcs[(idx) + 1] != WEOF)) #define re_string_eoi(pstr) ((pstr)->stop <= (pstr)->cur_idx) #define re_string_cur_idx(pstr) ((pstr)->cur_idx) #define re_string_get_buffer(pstr) ((pstr)->mbs) #define re_string_length(pstr) ((pstr)->len) #define re_string_byte_at(pstr,idx) ((pstr)->mbs[idx]) #define re_string_skip_bytes(pstr,idx) ((pstr)->cur_idx += (idx)) #define re_string_set_index(pstr,idx) ((pstr)->cur_idx = (idx)) #if defined _LIBC || HAVE_ALLOCA # include #endif #ifndef _LIBC # if HAVE_ALLOCA /* The OS usually guarantees only one guard page at the bottom of the stack, and a page size can be as small as 4096 bytes. So we cannot safely allocate anything larger than 4096 bytes. Also care for the possibility of a few compiler-allocated temporary stack slots. */ # define __libc_use_alloca(n) ((n) < 4032) # else /* alloca is implemented with malloc, so just use malloc. */ # define __libc_use_alloca(n) 0 # undef alloca # define alloca(n) malloc (n) # endif #endif #ifdef _LIBC # define MALLOC_0_IS_NONNULL 1 #elif !defined MALLOC_0_IS_NONNULL # define MALLOC_0_IS_NONNULL 0 #endif #ifndef MAX # define MAX(a,b) ((a) < (b) ? (b) : (a)) #endif #ifndef MIN # define MIN(a,b) ((a) < (b) ? (a) : (b)) #endif #define re_malloc(t,n) ((t *) malloc ((n) * sizeof (t))) #define re_realloc(p,t,n) ((t *) realloc (p, (n) * sizeof (t))) #define re_free(p) free (p) struct bin_tree_t { struct bin_tree_t *parent; struct bin_tree_t *left; struct bin_tree_t *right; struct bin_tree_t *first; struct bin_tree_t *next; re_token_t token; /* 'node_idx' is the index in dfa->nodes, if 'type' == 0. Otherwise 'type' indicate the type of this node. */ Idx node_idx; }; typedef struct bin_tree_t bin_tree_t; #define BIN_TREE_STORAGE_SIZE \ ((1024 - sizeof (void *)) / sizeof (bin_tree_t)) struct bin_tree_storage_t { struct bin_tree_storage_t *next; bin_tree_t data[BIN_TREE_STORAGE_SIZE]; }; typedef struct bin_tree_storage_t bin_tree_storage_t; #define CONTEXT_WORD 1 #define CONTEXT_NEWLINE (CONTEXT_WORD << 1) #define CONTEXT_BEGBUF (CONTEXT_NEWLINE << 1) #define CONTEXT_ENDBUF (CONTEXT_BEGBUF << 1) #define IS_WORD_CONTEXT(c) ((c) & CONTEXT_WORD) #define IS_NEWLINE_CONTEXT(c) ((c) & CONTEXT_NEWLINE) #define IS_BEGBUF_CONTEXT(c) ((c) & CONTEXT_BEGBUF) #define IS_ENDBUF_CONTEXT(c) ((c) & CONTEXT_ENDBUF) #define IS_ORDINARY_CONTEXT(c) ((c) == 0) #define IS_WORD_CHAR(ch) (isalnum (ch) || (ch) == '_') #define IS_NEWLINE(ch) ((ch) == NEWLINE_CHAR) #define IS_WIDE_WORD_CHAR(ch) (__iswalnum (ch) || (ch) == L'_') #define IS_WIDE_NEWLINE(ch) ((ch) == WIDE_NEWLINE_CHAR) #define NOT_SATISFY_PREV_CONSTRAINT(constraint,context) \ ((((constraint) & PREV_WORD_CONSTRAINT) && !IS_WORD_CONTEXT (context)) \ || ((constraint & PREV_NOTWORD_CONSTRAINT) && IS_WORD_CONTEXT (context)) \ || ((constraint & PREV_NEWLINE_CONSTRAINT) && !IS_NEWLINE_CONTEXT (context))\ || ((constraint & PREV_BEGBUF_CONSTRAINT) && !IS_BEGBUF_CONTEXT (context))) #define NOT_SATISFY_NEXT_CONSTRAINT(constraint,context) \ ((((constraint) & NEXT_WORD_CONSTRAINT) && !IS_WORD_CONTEXT (context)) \ || (((constraint) & NEXT_NOTWORD_CONSTRAINT) && IS_WORD_CONTEXT (context)) \ || (((constraint) & NEXT_NEWLINE_CONSTRAINT) && !IS_NEWLINE_CONTEXT (context)) \ || (((constraint) & NEXT_ENDBUF_CONSTRAINT) && !IS_ENDBUF_CONTEXT (context))) struct re_dfastate_t { re_hashval_t hash; re_node_set nodes; re_node_set non_eps_nodes; re_node_set inveclosure; re_node_set *entrance_nodes; struct re_dfastate_t **trtable, **word_trtable; unsigned int context : 4; unsigned int halt : 1; /* If this state can accept "multi byte". Note that we refer to multibyte characters, and multi character collating elements as "multi byte". */ unsigned int accept_mb : 1; /* If this state has backreference node(s). */ unsigned int has_backref : 1; unsigned int has_constraint : 1; }; typedef struct re_dfastate_t re_dfastate_t; struct re_state_table_entry { Idx num; Idx alloc; re_dfastate_t **array; }; /* Array type used in re_sub_match_last_t and re_sub_match_top_t. */ typedef struct { Idx next_idx; Idx alloc; re_dfastate_t **array; } state_array_t; /* Store information about the node NODE whose type is OP_CLOSE_SUBEXP. */ typedef struct { Idx node; Idx str_idx; /* The position NODE match at. */ state_array_t path; } re_sub_match_last_t; /* Store information about the node NODE whose type is OP_OPEN_SUBEXP. And information about the node, whose type is OP_CLOSE_SUBEXP, corresponding to NODE is stored in LASTS. */ typedef struct { Idx str_idx; Idx node; state_array_t *path; Idx alasts; /* Allocation size of LASTS. */ Idx nlasts; /* The number of LASTS. */ re_sub_match_last_t **lasts; } re_sub_match_top_t; struct re_backref_cache_entry { Idx node; Idx str_idx; Idx subexp_from; Idx subexp_to; bitset_word_t eps_reachable_subexps_map; char more; }; typedef struct { /* The string object corresponding to the input string. */ re_string_t input; const re_dfa_t *const dfa; /* EFLAGS of the argument of regexec. */ int eflags; /* Where the matching ends. */ Idx match_last; Idx last_node; /* The state log used by the matcher. */ re_dfastate_t **state_log; Idx state_log_top; /* Back reference cache. */ Idx nbkref_ents; Idx abkref_ents; struct re_backref_cache_entry *bkref_ents; int max_mb_elem_len; Idx nsub_tops; Idx asub_tops; re_sub_match_top_t **sub_tops; } re_match_context_t; typedef struct { re_dfastate_t **sifted_states; re_dfastate_t **limited_states; Idx last_node; Idx last_str_idx; re_node_set limits; } re_sift_context_t; struct re_fail_stack_ent_t { Idx idx; Idx node; regmatch_t *regs; re_node_set eps_via_nodes; }; struct re_fail_stack_t { Idx num; Idx alloc; struct re_fail_stack_ent_t *stack; }; struct re_dfa_t { re_token_t *nodes; size_t nodes_alloc; size_t nodes_len; Idx *nexts; Idx *org_indices; re_node_set *edests; re_node_set *eclosures; re_node_set *inveclosures; struct re_state_table_entry *state_table; re_dfastate_t *init_state; re_dfastate_t *init_state_word; re_dfastate_t *init_state_nl; re_dfastate_t *init_state_begbuf; bin_tree_t *str_tree; bin_tree_storage_t *str_tree_storage; re_bitset_ptr_t sb_char; int str_tree_storage_idx; /* number of subexpressions 're_nsub' is in regex_t. */ re_hashval_t state_hash_mask; Idx init_node; Idx nbackref; /* The number of backreference in this dfa. */ /* Bitmap expressing which backreference is used. */ bitset_word_t used_bkref_map; bitset_word_t completed_bkref_map; unsigned int has_plural_match : 1; /* If this dfa has "multibyte node", which is a backreference or a node which can accept multibyte character or multi character collating element. */ unsigned int has_mb_node : 1; unsigned int is_utf8 : 1; unsigned int map_notascii : 1; unsigned int word_ops_used : 1; int mb_cur_max; bitset_t word_char; reg_syntax_t syntax; Idx *subexp_map; #ifdef DEBUG char* re_str; #endif lock_define (lock) }; #define re_node_set_init_empty(set) memset (set, '\0', sizeof (re_node_set)) #define re_node_set_remove(set,id) \ (re_node_set_remove_at (set, re_node_set_contains (set, id) - 1)) #define re_node_set_empty(p) ((p)->nelem = 0) #define re_node_set_free(set) re_free ((set)->elems) typedef enum { SB_CHAR, MB_CHAR, EQUIV_CLASS, COLL_SYM, CHAR_CLASS } bracket_elem_type; typedef struct { bracket_elem_type type; union { unsigned char ch; unsigned char *name; wchar_t wch; } opr; } bracket_elem_t; /* Functions for bitset_t operation. */ static inline void bitset_set (bitset_t set, Idx i) { set[i / BITSET_WORD_BITS] |= (bitset_word_t) 1 << i % BITSET_WORD_BITS; } static inline void bitset_clear (bitset_t set, Idx i) { set[i / BITSET_WORD_BITS] &= ~ ((bitset_word_t) 1 << i % BITSET_WORD_BITS); } static inline bool bitset_contain (const bitset_t set, Idx i) { return (set[i / BITSET_WORD_BITS] >> i % BITSET_WORD_BITS) & 1; } static inline void bitset_empty (bitset_t set) { memset (set, '\0', sizeof (bitset_t)); } static inline void bitset_set_all (bitset_t set) { memset (set, -1, sizeof (bitset_word_t) * (SBC_MAX / BITSET_WORD_BITS)); if (SBC_MAX % BITSET_WORD_BITS != 0) set[BITSET_WORDS - 1] = ((bitset_word_t) 1 << SBC_MAX % BITSET_WORD_BITS) - 1; } static inline void bitset_copy (bitset_t dest, const bitset_t src) { memcpy (dest, src, sizeof (bitset_t)); } static inline void bitset_not (bitset_t set) { int bitset_i; for (bitset_i = 0; bitset_i < SBC_MAX / BITSET_WORD_BITS; ++bitset_i) set[bitset_i] = ~set[bitset_i]; if (SBC_MAX % BITSET_WORD_BITS != 0) set[BITSET_WORDS - 1] = ((((bitset_word_t) 1 << SBC_MAX % BITSET_WORD_BITS) - 1) & ~set[BITSET_WORDS - 1]); } static inline void bitset_merge (bitset_t dest, const bitset_t src) { int bitset_i; for (bitset_i = 0; bitset_i < BITSET_WORDS; ++bitset_i) dest[bitset_i] |= src[bitset_i]; } static inline void bitset_mask (bitset_t dest, const bitset_t src) { int bitset_i; for (bitset_i = 0; bitset_i < BITSET_WORDS; ++bitset_i) dest[bitset_i] &= src[bitset_i]; } #ifdef RE_ENABLE_I18N /* Functions for re_string. */ static int __attribute__ ((pure, unused)) re_string_char_size_at (const re_string_t *pstr, Idx idx) { int byte_idx; if (pstr->mb_cur_max == 1) return 1; for (byte_idx = 1; idx + byte_idx < pstr->valid_len; ++byte_idx) if (pstr->wcs[idx + byte_idx] != WEOF) break; return byte_idx; } static wint_t __attribute__ ((pure, unused)) re_string_wchar_at (const re_string_t *pstr, Idx idx) { if (pstr->mb_cur_max == 1) return (wint_t) pstr->mbs[idx]; return (wint_t) pstr->wcs[idx]; } # ifdef _LIBC # include # endif static int __attribute__ ((pure, unused)) re_string_elem_size_at (const re_string_t *pstr, Idx idx) { # ifdef _LIBC const unsigned char *p, *extra; const int32_t *table, *indirect; uint_fast32_t nrules = _NL_CURRENT_WORD (LC_COLLATE, _NL_COLLATE_NRULES); if (nrules != 0) { table = (const int32_t *) _NL_CURRENT (LC_COLLATE, _NL_COLLATE_TABLEMB); extra = (const unsigned char *) _NL_CURRENT (LC_COLLATE, _NL_COLLATE_EXTRAMB); indirect = (const int32_t *) _NL_CURRENT (LC_COLLATE, _NL_COLLATE_INDIRECTMB); p = pstr->mbs + idx; findidx (table, indirect, extra, &p, pstr->len - idx); return p - pstr->mbs - idx; } else # endif /* _LIBC */ return 1; } #endif /* RE_ENABLE_I18N */ #ifndef FALLTHROUGH # if __GNUC__ < 7 # define FALLTHROUGH ((void) 0) # else # define FALLTHROUGH __attribute__ ((__fallthrough__)) # endif #endif #endif /* _REGEX_INTERNAL_H */ pspp-1.4.1/gl/getopt.in.h0000644000175000017500000000406313723215637014611 0ustar00blpblp00000000000000/* Declarations for getopt. Copyright (C) 1989-2020 Free Software Foundation, Inc. This file is part of gnulib. Unlike most of the getopt implementation, it is NOT shared with the GNU C Library, which supplies a different version of this file. This file 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 3 of the License, or (at your option) any later version. This file 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 gnulib; if not, see . */ #ifndef _@GUARD_PREFIX@_GETOPT_H #if __GNUC__ >= 3 @PRAGMA_SYSTEM_HEADER@ #endif @PRAGMA_COLUMNS@ /* The include_next requires a split double-inclusion guard. We must also inform the replacement unistd.h to not recursively use ; our definitions will be present soon enough. */ #if @HAVE_GETOPT_H@ # define _GL_SYSTEM_GETOPT # @INCLUDE_NEXT@ @NEXT_GETOPT_H@ # undef _GL_SYSTEM_GETOPT #endif #define _@GUARD_PREFIX@_GETOPT_H 1 /* Standalone applications should #define __GETOPT_PREFIX to an identifier that prefixes the external functions and variables defined in getopt-core.h and getopt-ext.h. When this happens, include the headers that might declare getopt so that they will not cause confusion if included after this file (if the system had , we have already included it). */ #if defined __GETOPT_PREFIX # if !@HAVE_GETOPT_H@ # define __need_system_stdlib_h # include # undef __need_system_stdlib_h # include # include # endif #endif /* The definition of _GL_ARG_NONNULL is copied here. */ #include #include #include #endif /* _@GUARD_PREFIX@_GETOPT_H */ pspp-1.4.1/gl/fseeko.c0000644000175000017500000001377313723215636014160 0ustar00blpblp00000000000000/* An fseeko() function that, together with fflush(), is POSIX compliant. Copyright (C) 2007-2020 Free Software Foundation, Inc. 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 3, 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, see . */ #include /* Specification. */ #include /* Get off_t, lseek, _POSIX_VERSION. */ #include #include "stdio-impl.h" int fseeko (FILE *fp, off_t offset, int whence) #undef fseeko #if !HAVE_FSEEKO # undef fseek # define fseeko fseek #endif #if _GL_WINDOWS_64_BIT_OFF_T # undef fseeko # if HAVE__FSEEKI64 && HAVE_DECL__FSEEKI64 /* msvc, mingw since msvcrt8.0, mingw64 */ # define fseeko _fseeki64 # else /* mingw before msvcrt8.0 */ # define fseeko fseeko64 # endif #endif { #if LSEEK_PIPE_BROKEN /* mingw gives bogus answers rather than failure on non-seekable files. */ if (lseek (fileno (fp), 0, SEEK_CUR) == -1) return EOF; #endif /* These tests are based on fpurge.c. */ #if defined _IO_EOF_SEEN || defined _IO_ftrylockfile || __GNU_LIBRARY__ == 1 /* GNU libc, BeOS, Haiku, Linux libc5 */ if (fp->_IO_read_end == fp->_IO_read_ptr && fp->_IO_write_ptr == fp->_IO_write_base && fp->_IO_save_base == NULL) #elif defined __sferror || defined __DragonFly__ || defined __ANDROID__ /* FreeBSD, NetBSD, OpenBSD, DragonFly, Mac OS X, Cygwin, Minix 3, Android */ # if defined __SL64 && defined __SCLE /* Cygwin */ if ((fp->_flags & __SL64) == 0) { /* Cygwin 1.5.0 through 1.5.24 failed to open stdin in 64-bit mode; but has an fseeko that requires 64-bit mode. */ FILE *tmp = fopen ("/dev/null", "r"); if (!tmp) return -1; fp->_flags |= __SL64; fp->_seek64 = tmp->_seek64; fclose (tmp); } # endif if (fp_->_p == fp_->_bf._base && fp_->_r == 0 && fp_->_w == ((fp_->_flags & (__SLBF | __SNBF | __SRD)) == 0 /* fully buffered and not currently reading? */ ? fp_->_bf._size : 0) && fp_ub._base == NULL) #elif defined __EMX__ /* emx+gcc */ if (fp->_ptr == fp->_buffer && fp->_rcount == 0 && fp->_wcount == 0 && fp->_ungetc_count == 0) #elif defined __minix /* Minix */ if (fp_->_ptr == fp_->_buf && (fp_->_ptr == NULL || fp_->_count == 0)) #elif defined _IOERR /* AIX, HP-UX, IRIX, OSF/1, Solaris, OpenServer, mingw, MSVC, NonStop Kernel, OpenVMS */ if (fp_->_ptr == fp_->_base && (fp_->_ptr == NULL || fp_->_cnt == 0)) #elif defined __UCLIBC__ /* uClibc */ if (((fp->__modeflags & __FLAG_WRITING) == 0 || fp->__bufpos == fp->__bufstart) && ((fp->__modeflags & (__FLAG_READONLY | __FLAG_READING)) == 0 || fp->__bufpos == fp->__bufread)) #elif defined __QNX__ /* QNX */ if ((fp->_Mode & 0x2000 /* _MWRITE */ ? fp->_Next == fp->_Buf : fp->_Next == fp->_Rend) && fp->_Rback == fp->_Back + sizeof (fp->_Back) && fp->_Rsave == NULL) #elif defined __MINT__ /* Atari FreeMiNT */ if (fp->__bufp == fp->__buffer && fp->__get_limit == fp->__bufp && fp->__put_limit == fp->__bufp && !fp->__pushed_back) #elif defined EPLAN9 /* Plan9 */ if (fp->rp == fp->buf && fp->wp == fp->buf) #elif FUNC_FFLUSH_STDIN < 0 && 200809 <= _POSIX_VERSION /* Cross-compiling to some other system advertising conformance to POSIX.1-2008 or later. Assume fseeko and fflush work as advertised. If this assumption is incorrect, please report the bug to bug-gnulib. */ if (0) #else #error "Please port gnulib fseeko.c to your platform! Look at the code in fseeko.c, then report this to bug-gnulib." #endif { /* We get here when an fflush() call immediately preceded this one (or if ftell() has created buffers but no I/O has occurred on a newly-opened stream). We know there are no buffers. */ off_t pos = lseek (fileno (fp), offset, whence); if (pos == -1) { #if defined __sferror || defined __DragonFly__ || defined __ANDROID__ /* FreeBSD, NetBSD, OpenBSD, DragonFly, Mac OS X, Cygwin, Minix 3, Android */ fp_->_flags &= ~__SOFF; #endif return -1; } #if defined _IO_EOF_SEEN || defined _IO_ftrylockfile || __GNU_LIBRARY__ == 1 /* GNU libc, BeOS, Haiku, Linux libc5 */ fp->_flags &= ~_IO_EOF_SEEN; fp->_offset = pos; #elif defined __sferror || defined __DragonFly__ || defined __ANDROID__ /* FreeBSD, NetBSD, OpenBSD, DragonFly, Mac OS X, Cygwin, Minix 3, Android */ # if defined __CYGWIN__ || (defined __NetBSD__ && __NetBSD_Version__ >= 600000000) || defined __minix /* fp_->_offset is typed as an integer. */ fp_->_offset = pos; # else /* fp_->_offset is an fpos_t. */ { /* Use a union, since on NetBSD, the compilation flags determine whether fpos_t is typedef'd to off_t or a struct containing a single off_t member. */ union { fpos_t f; off_t o; } u; u.o = pos; fp_->_offset = u.f; } # endif fp_->_flags |= __SOFF; fp_->_flags &= ~__SEOF; #elif defined __EMX__ /* emx+gcc */ fp->_flags &= ~_IOEOF; #elif defined _IOERR /* AIX, HP-UX, IRIX, OSF/1, Solaris, OpenServer, mingw, MSVC, NonStop Kernel, OpenVMS */ fp_->_flag &= ~_IOEOF; #elif defined __MINT__ /* Atari FreeMiNT */ fp->__offset = pos; fp->__eof = 0; #endif return 0; } return fseeko (fp, offset, whence); } pspp-1.4.1/gl/w32sock.h0000644000175000017500000000643113723215640014170 0ustar00blpblp00000000000000/* w32sock.h --- internal auxiliary functions for Windows socket functions Copyright (C) 2008-2020 Free Software Foundation, Inc. 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 3 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, see . */ /* Written by Paolo Bonzini */ #include /* Get O_RDWR and O_BINARY. */ #include /* Get _open_osfhandle(). */ #include /* Get _get_osfhandle(). */ #if GNULIB_MSVC_NOTHROW # include "msvc-nothrow.h" #else # include #endif #define FD_TO_SOCKET(fd) ((SOCKET) _get_osfhandle ((fd))) #define SOCKET_TO_FD(fh) (_open_osfhandle ((intptr_t) (fh), O_RDWR | O_BINARY)) static inline void set_winsock_errno (void) { int err = WSAGetLastError (); /* Map some WSAE* errors to the runtime library's error codes. */ switch (err) { case WSA_INVALID_HANDLE: errno = EBADF; break; case WSA_NOT_ENOUGH_MEMORY: errno = ENOMEM; break; case WSA_INVALID_PARAMETER: errno = EINVAL; break; case WSAENAMETOOLONG: errno = ENAMETOOLONG; break; case WSAENOTEMPTY: errno = ENOTEMPTY; break; case WSAEWOULDBLOCK: errno = EWOULDBLOCK; break; case WSAEINPROGRESS: errno = EINPROGRESS; break; case WSAEALREADY: errno = EALREADY; break; case WSAENOTSOCK: errno = ENOTSOCK; break; case WSAEDESTADDRREQ: errno = EDESTADDRREQ; break; case WSAEMSGSIZE: errno = EMSGSIZE; break; case WSAEPROTOTYPE: errno = EPROTOTYPE; break; case WSAENOPROTOOPT: errno = ENOPROTOOPT; break; case WSAEPROTONOSUPPORT: errno = EPROTONOSUPPORT; break; case WSAEOPNOTSUPP: errno = EOPNOTSUPP; break; case WSAEAFNOSUPPORT: errno = EAFNOSUPPORT; break; case WSAEADDRINUSE: errno = EADDRINUSE; break; case WSAEADDRNOTAVAIL: errno = EADDRNOTAVAIL; break; case WSAENETDOWN: errno = ENETDOWN; break; case WSAENETUNREACH: errno = ENETUNREACH; break; case WSAENETRESET: errno = ENETRESET; break; case WSAECONNABORTED: errno = ECONNABORTED; break; case WSAECONNRESET: errno = ECONNRESET; break; case WSAENOBUFS: errno = ENOBUFS; break; case WSAEISCONN: errno = EISCONN; break; case WSAENOTCONN: errno = ENOTCONN; break; case WSAETIMEDOUT: errno = ETIMEDOUT; break; case WSAECONNREFUSED: errno = ECONNREFUSED; break; case WSAELOOP: errno = ELOOP; break; case WSAEHOSTUNREACH: errno = EHOSTUNREACH; break; default: errno = (err > 10000 && err < 10025) ? err - 10000 : err; break; } } pspp-1.4.1/gl/unicase/0000755000175000017500000000000013725012650014145 5ustar00blpblp00000000000000pspp-1.4.1/gl/unicase/u-ct-totitle.h0000644000175000017500000004354313723215640016663 0ustar00blpblp00000000000000/* Titlecase mapping for UTF-8/UTF-16/UTF-32 substrings (locale dependent). Copyright (C) 2009-2020 Free Software Foundation, Inc. Written by Bruno Haible , 2009. 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 3 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, see . */ /* Quoting the Unicode standard, section "Default Case Algorithms": Find the word boundaries in X according to Unicode Standard Annex #29, “Text Boundaries.” For each word boundary, find the first cased character F following the word boundary. If F exists, map F to Titlecase_Mapping(F); then map all characters C between F and the following word boundary to Lowercase_Mapping(C). */ UNIT * FUNC (const UNIT *s, size_t n, casing_prefix_context_t prefix_context, casing_suffix_context_t suffix_context, const char *iso639_language, uninorm_t nf, UNIT *resultbuf, size_t *lengthp) { /* The result being accumulated. */ UNIT *result; size_t length; size_t allocated; /* An array containing the word break positions. */ char *wordbreaks; /* Initialize the accumulator. */ if (nf != NULL || resultbuf == NULL) { result = NULL; allocated = 0; } else { result = resultbuf; allocated = *lengthp; } length = 0; /* Initialize the word breaks array. */ if (n > 0) { wordbreaks = (char *) malloc (n); if (wordbreaks == NULL) { errno = ENOMEM; goto fail2; } U_WORDBREAKS (s, n, wordbreaks); } else wordbreaks = NULL; { const UNIT *s_end = s + n; const char *wp = wordbreaks; /* When considering the string as segmented by word boundaries: For each such segment: - In the first part, we are searching for the first cased character. In this state, in_word_first_part = true, and no conversion takes place. - In the second part, we are converting every character: the first among these characters to title case, the other ones to lower case. In this state, in_word_first_part = false. */ bool in_word_first_part = true; /* Helper for evaluating the FINAL_SIGMA condition: Last character that was not case-ignorable. */ ucs4_t last_char_except_ignorable = prefix_context.last_char_except_ignorable; /* Helper for evaluating the AFTER_SOFT_DOTTED and AFTER_I conditions: Last character that was of combining class 230 ("Above") or 0. */ ucs4_t last_char_normal_or_above = prefix_context.last_char_normal_or_above; while (s < s_end) { /* Fetch the next character. */ ucs4_t uc; int count = U_MBTOUC_UNSAFE (&uc, s, s_end - s); ucs4_t (*single_character_map) (ucs4_t); size_t offset_in_rule; /* offset in 'struct special_casing_rule' */ ucs4_t mapped_uc[3]; unsigned int mapped_count; if (*wp) /* Crossing a word boundary. */ in_word_first_part = true; /* Determine single_character_map, offset_in_rule. There are three possibilities: - uc should not be converted. - uc should be titlecased. - uc should be lowercased. */ if (in_word_first_part) { if (uc_is_cased (uc)) { /* uc is to be titlecased. */ single_character_map = uc_totitle; offset_in_rule = offsetof (struct special_casing_rule, title[0]); in_word_first_part = false; } else { /* uc is not converted. */ single_character_map = NULL; offset_in_rule = 0; } } else { /* uc is to be lowercased. */ single_character_map = uc_tolower; offset_in_rule = offsetof (struct special_casing_rule, lower[0]); } /* Actually map uc. */ if (single_character_map == NULL) { mapped_uc[0] = uc; mapped_count = 1; goto found_mapping; } if (uc < 0x10000) { /* Look first in the special-casing table. */ char code[3]; code[0] = (uc >> 8) & 0xff; code[1] = uc & 0xff; for (code[2] = 0; ; code[2]++) { const struct special_casing_rule *rule = gl_unicase_special_lookup (code, 3); if (rule == NULL) break; /* Test if the condition applies. */ /* Does the language apply? */ if (rule->language[0] == '\0' || (iso639_language != NULL && iso639_language[0] == rule->language[0] && iso639_language[1] == rule->language[1])) { /* Does the context apply? */ int context = rule->context; bool applies; if (context < 0) context = - context; switch (context) { case SCC_ALWAYS: applies = true; break; case SCC_FINAL_SIGMA: /* "Before" condition: preceded by a sequence consisting of a cased letter and a case-ignorable sequence. "After" condition: not followed by a sequence consisting of a case-ignorable sequence and then a cased letter. */ /* Test the "before" condition. */ applies = uc_is_cased (last_char_except_ignorable); /* Test the "after" condition. */ if (applies) { const UNIT *s2 = s + count; for (;;) { if (s2 < s_end) { ucs4_t uc2; int count2 = U_MBTOUC_UNSAFE (&uc2, s2, s_end - s2); /* Our uc_is_case_ignorable function is known to return false for all cased characters. So we can call uc_is_case_ignorable first. */ if (!uc_is_case_ignorable (uc2)) { applies = ! uc_is_cased (uc2); break; } s2 += count2; } else { applies = ! uc_is_cased (suffix_context.first_char_except_ignorable); break; } } } break; case SCC_AFTER_SOFT_DOTTED: /* "Before" condition: There is a Soft_Dotted character before it, with no intervening character of combining class 0 or 230 (Above). */ /* Test the "before" condition. */ applies = uc_is_property_soft_dotted (last_char_normal_or_above); break; case SCC_MORE_ABOVE: /* "After" condition: followed by a character of combining class 230 (Above) with no intervening character of combining class 0 or 230 (Above). */ /* Test the "after" condition. */ { const UNIT *s2 = s + count; applies = false; for (;;) { if (s2 < s_end) { ucs4_t uc2; int count2 = U_MBTOUC_UNSAFE (&uc2, s2, s_end - s2); int ccc = uc_combining_class (uc2); if (ccc == UC_CCC_A) { applies = true; break; } if (ccc == UC_CCC_NR) break; s2 += count2; } else { applies = ((suffix_context.bits & SCC_MORE_ABOVE_MASK) != 0); break; } } } break; case SCC_BEFORE_DOT: /* "After" condition: followed by COMBINING DOT ABOVE (U+0307). Any sequence of characters with a combining class that is neither 0 nor 230 may intervene between the current character and the combining dot above. */ /* Test the "after" condition. */ { const UNIT *s2 = s + count; applies = false; for (;;) { if (s2 < s_end) { ucs4_t uc2; int count2 = U_MBTOUC_UNSAFE (&uc2, s2, s_end - s2); if (uc2 == 0x0307) /* COMBINING DOT ABOVE */ { applies = true; break; } { int ccc = uc_combining_class (uc2); if (ccc == UC_CCC_A || ccc == UC_CCC_NR) break; } s2 += count2; } else { applies = ((suffix_context.bits & SCC_BEFORE_DOT_MASK) != 0); break; } } } break; case SCC_AFTER_I: /* "Before" condition: There is an uppercase I before it, and there is no intervening character of combining class 0 or 230 (Above). */ /* Test the "before" condition. */ applies = (last_char_normal_or_above == 'I'); break; default: abort (); } if (rule->context < 0) applies = !applies; if (applies) { /* The rule applies. Look up the mapping (0 to 3 characters). */ const unsigned short *mapped_in_rule = (const unsigned short *)((const char *)rule + offset_in_rule); if (mapped_in_rule[0] == 0) mapped_count = 0; else { mapped_uc[0] = mapped_in_rule[0]; if (mapped_in_rule[1] == 0) mapped_count = 1; else { mapped_uc[1] = mapped_in_rule[1]; if (mapped_in_rule[2] == 0) mapped_count = 2; else { mapped_uc[2] = mapped_in_rule[2]; mapped_count = 3; } } } goto found_mapping; } } /* Optimization: Save a hash table lookup in the next round. */ if (!rule->has_next) break; } } /* No special-cased mapping. So use the locale and context independent mapping. */ mapped_uc[0] = single_character_map (uc); mapped_count = 1; found_mapping: /* Found the mapping: uc maps to mapped_uc[0..mapped_count-1]. */ { unsigned int i; for (i = 0; i < mapped_count; i++) { ucs4_t muc = mapped_uc[i]; /* Append muc to the result accumulator. */ if (length < allocated) { int ret = U_UCTOMB (result + length, muc, allocated - length); if (ret == -1) { errno = EINVAL; goto fail1; } if (ret >= 0) { length += ret; goto done_appending; } } { size_t old_allocated = allocated; size_t new_allocated = 2 * old_allocated; if (new_allocated < 64) new_allocated = 64; if (new_allocated < old_allocated) /* integer overflow? */ abort (); { UNIT *larger_result; if (result == NULL) { larger_result = (UNIT *) malloc (new_allocated * sizeof (UNIT)); if (larger_result == NULL) { errno = ENOMEM; goto fail1; } } else if (result == resultbuf) { larger_result = (UNIT *) malloc (new_allocated * sizeof (UNIT)); if (larger_result == NULL) { errno = ENOMEM; goto fail1; } U_CPY (larger_result, resultbuf, length); } else { larger_result = (UNIT *) realloc (result, new_allocated * sizeof (UNIT)); if (larger_result == NULL) { errno = ENOMEM; goto fail1; } } result = larger_result; allocated = new_allocated; { int ret = U_UCTOMB (result + length, muc, allocated - length); if (ret == -1) { errno = EINVAL; goto fail1; } if (ret < 0) abort (); length += ret; goto done_appending; } } } done_appending: ; } } if (!uc_is_case_ignorable (uc)) last_char_except_ignorable = uc; { int ccc = uc_combining_class (uc); if (ccc == UC_CCC_A || ccc == UC_CCC_NR) last_char_normal_or_above = uc; } s += count; wp += count; } } free (wordbreaks); if (nf != NULL) { /* Finally, normalize the result. */ UNIT *normalized_result; normalized_result = U_NORMALIZE (nf, result, length, resultbuf, lengthp); if (normalized_result == NULL) goto fail2; free (result); return normalized_result; } if (length == 0) { if (result == NULL) { /* Return a non-NULL value. NULL means error. */ result = (UNIT *) malloc (1); if (result == NULL) { errno = ENOMEM; goto fail2; } } } else if (result != resultbuf && length < allocated) { /* Shrink the allocated memory if possible. */ UNIT *memory; memory = (UNIT *) realloc (result, length * sizeof (UNIT)); if (memory != NULL) result = memory; } *lengthp = length; return result; fail1: { int saved_errno = errno; free (wordbreaks); errno = saved_errno; } fail2: if (result != resultbuf) { int saved_errno = errno; free (result); errno = saved_errno; } return NULL; } /* * Local Variables: * coding: utf-8 * End: */ pspp-1.4.1/gl/unicase/tocasefold.h0000644000175000017500000011765513723215640016462 0ustar00blpblp00000000000000/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ /* Simple character mapping of Unicode characters. */ /* Generated automatically by gen-uni-tables.c for Unicode 9.0.0. */ #define mapping_header_0 16 #define mapping_header_1 2 #define mapping_header_2 7 #define mapping_header_3 511 #define mapping_header_4 127 static const struct { int level1[2]; short level2[2 << 9]; int level3[34 << 7]; } u_mapping = { { 0, 512 }, { 0, 128, 256, 384, 512, -1, 640, 768, 896, 1024, 1152, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1280, -1, -1, -1, -1, -1, 1408, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1536, -1, -1, 1664, 1792, 1920, 2048, -1, -1, 2176, 2304, -1, -1, -1, -1, -1, 2432, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2560, 2688, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2816, 2944, 3072, 3200, -1, -1, -1, -1, -1, -1, 3328, 3456, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 3584, -1, -1, -1, -1, -1, -1, -1, -1, -1, 3712, 3840, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 3968, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 4096, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 4224, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 775, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 0, 32, 32, 32, 32, 32, 32, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, -121, 1, 0, 1, 0, 1, 0, -268, 0, 210, 1, 0, 1, 0, 206, 1, 0, 205, 205, 1, 0, 0, 79, 202, 203, 1, 0, 205, 207, 0, 211, 209, 1, 0, 0, 0, 211, 213, 0, 214, 1, 0, 1, 0, 1, 0, 218, 1, 0, 218, 0, 0, 1, 0, 218, 1, 0, 217, 217, 1, 0, 1, 0, 219, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 1, 0, 2, 1, 0, 2, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 2, 1, 0, 1, 0, -97, -56, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, -130, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 10795, 1, 0, -163, 10792, 0, 0, 1, 0, -195, 69, 71, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 116, 0, 0, 0, 0, 0, 0, 38, 0, 37, 37, 37, 0, 64, 0, 63, 63, 0, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 0, 32, 32, 32, 32, 32, 32, 32, 32, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, -30, -25, 0, 0, 0, -15, -22, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, -54, -48, 0, 0, -60, -64, 0, 1, 0, -7, 1, 0, 0, -130, -130, -130, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 15, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7264, 7264, 7264, 7264, 7264, 7264, 7264, 7264, 7264, 7264, 7264, 7264, 7264, 7264, 7264, 7264, 7264, 7264, 7264, 7264, 7264, 7264, 7264, 7264, 7264, 7264, 7264, 7264, 7264, 7264, 7264, 7264, 7264, 7264, 7264, 7264, 7264, 7264, 0, 7264, 0, 0, 0, 0, 0, 7264, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -8, -8, -8, -8, -8, -8, 0, 0, -6222, -6221, -6212, -6210, -6210, -6211, -6204, -6180, 35267, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, -58, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, -8, -8, -8, -8, -8, -8, -8, -8, 0, 0, 0, 0, 0, 0, 0, 0, -8, -8, -8, -8, -8, -8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -8, -8, -8, -8, -8, -8, -8, -8, 0, 0, 0, 0, 0, 0, 0, 0, -8, -8, -8, -8, -8, -8, -8, -8, 0, 0, 0, 0, 0, 0, 0, 0, -8, -8, -8, -8, -8, -8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -8, 0, -8, 0, -8, 0, -8, 0, 0, 0, 0, 0, 0, 0, 0, -8, -8, -8, -8, -8, -8, -8, -8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -8, -8, -74, -74, 0, 0, -7173, 0, 0, 0, 0, 0, 0, 0, 0, 0, -86, -86, -86, -86, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -8, -8, -100, -100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -8, -8, -112, -112, -7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -128, -128, -126, -126, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -7517, 0, 0, 0, -8383, -8262, 0, 0, 0, 0, 0, 0, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, -10743, -3814, -10727, 0, 0, 1, 0, 1, 0, 1, 0, -10780, -10749, -10783, -10782, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, -10815, -10815, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, -35332, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, -42280, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, -42308, -42319, -42315, -42305, -42308, 0, -42258, -42282, -42261, 928, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }; pspp-1.4.1/gl/unicase/cased.c0000644000175000017500000000273213723215640015376 0ustar00blpblp00000000000000/* Test whether a Unicode character is cased. Copyright (C) 2002, 2006-2007, 2009-2020 Free Software Foundation, Inc. Written by Bruno Haible , 2009. 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 3 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, see . */ #include /* Specification. */ #include "caseprop.h" /* Quoting the Unicode standard: Definition: A character is defined to be "cased" if it has the Lowercase or Uppercase property or has a General_Category value of Titlecase_Letter. */ #if 0 #include "unictype.h" bool uc_is_cased (ucs4_t uc) { return (uc_is_property_lowercase (uc) || uc_is_property_uppercase (uc) || uc_is_general_category (uc, UC_TITLECASE_LETTER)); } #else #include "unictype/bitmap.h" /* Define u_casing_property_cased table. */ #include "cased.h" bool uc_is_cased (ucs4_t uc) { return bitmap_lookup (&u_casing_property_cased, uc); } #endif pspp-1.4.1/gl/unicase/u8-tolower.c0000644000175000017500000000574713723215640016355 0ustar00blpblp00000000000000/* Lowercase mapping for UTF-8 strings (locale dependent). Copyright (C) 2009-2020 Free Software Foundation, Inc. Written by Bruno Haible , 2009. 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 3 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, see . */ #include /* Specification. */ #include "unicase.h" #include #include "unicase/unicasemap.h" #include "unicase/special-casing.h" uint8_t * u8_tolower (const uint8_t *s, size_t n, const char *iso639_language, uninorm_t nf, uint8_t *resultbuf, size_t *lengthp) { return u8_casemap (s, n, unicase_empty_prefix_context, unicase_empty_suffix_context, iso639_language, uc_tolower, offsetof (struct special_casing_rule, lower[0]), nf, resultbuf, lengthp); } #ifdef TEST #include #include #include #include /* Read the contents of an input stream, and return it, terminated with a NUL byte. */ char * read_file (FILE *stream) { #define BUFSIZE 4096 char *buf = NULL; int alloc = 0; int size = 0; int count; while (! feof (stream)) { if (size + BUFSIZE > alloc) { alloc = alloc + alloc / 2; if (alloc < size + BUFSIZE) alloc = size + BUFSIZE; buf = realloc (buf, alloc); if (buf == NULL) { fprintf (stderr, "out of memory\n"); exit (1); } } count = fread (buf + size, 1, BUFSIZE, stream); if (count == 0) { if (ferror (stream)) { perror ("fread"); exit (1); } } else size += count; } buf = realloc (buf, size + 1); if (buf == NULL) { fprintf (stderr, "out of memory\n"); exit (1); } buf[size] = '\0'; return buf; #undef BUFSIZE } int main (int argc, char * argv[]) { setlocale (LC_ALL, ""); if (argc == 1) { /* Display the lower case of the input string. */ char *input = read_file (stdin); int length = strlen (input); size_t output_length; uint8_t *output = u8_tolower ((uint8_t *) input, length, uc_locale_language (), NULL, NULL, &output_length); fwrite (output, 1, output_length, stdout); return 0; } else return 1; } #endif /* TEST */ pspp-1.4.1/gl/unicase/tolower.h0000644000175000017500000011203513723215640016015 0ustar00blpblp00000000000000/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ /* Simple character mapping of Unicode characters. */ /* Generated automatically by gen-uni-tables.c for Unicode 9.0.0. */ #define mapping_header_0 16 #define mapping_header_1 2 #define mapping_header_2 7 #define mapping_header_3 511 #define mapping_header_4 127 static const struct { int level1[2]; short level2[2 << 9]; int level3[31 << 7]; } u_mapping = { { 0, 512 }, { 0, 128, 256, 384, 512, -1, 640, 768, 896, 1024, 1152, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1280, -1, -1, -1, -1, -1, 1408, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1536, 1664, 1792, 1920, -1, -1, 2048, 2176, -1, -1, -1, -1, -1, 2304, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2432, 2560, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2688, 2816, 2944, 3072, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 3200, -1, -1, -1, -1, -1, -1, -1, -1, -1, 3328, 3456, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 3584, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 3712, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 3840, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 0, 32, 32, 32, 32, 32, 32, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, -199, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, -121, 1, 0, 1, 0, 1, 0, 0, 0, 210, 1, 0, 1, 0, 206, 1, 0, 205, 205, 1, 0, 0, 79, 202, 203, 1, 0, 205, 207, 0, 211, 209, 1, 0, 0, 0, 211, 213, 0, 214, 1, 0, 1, 0, 1, 0, 218, 1, 0, 218, 0, 0, 1, 0, 218, 1, 0, 217, 217, 1, 0, 1, 0, 219, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 1, 0, 2, 1, 0, 2, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 2, 1, 0, 1, 0, -97, -56, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, -130, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 10795, 1, 0, -163, 10792, 0, 0, 1, 0, -195, 69, 71, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 116, 0, 0, 0, 0, 0, 0, 38, 0, 37, 37, 37, 0, 64, 0, 63, 63, 0, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 0, 32, 32, 32, 32, 32, 32, 32, 32, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, -60, 0, 0, 1, 0, -7, 1, 0, 0, -130, -130, -130, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 15, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7264, 7264, 7264, 7264, 7264, 7264, 7264, 7264, 7264, 7264, 7264, 7264, 7264, 7264, 7264, 7264, 7264, 7264, 7264, 7264, 7264, 7264, 7264, 7264, 7264, 7264, 7264, 7264, 7264, 7264, 7264, 7264, 7264, 7264, 7264, 7264, 7264, 7264, 0, 7264, 0, 0, 0, 0, 0, 7264, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 38864, 38864, 38864, 38864, 38864, 38864, 38864, 38864, 38864, 38864, 38864, 38864, 38864, 38864, 38864, 38864, 38864, 38864, 38864, 38864, 38864, 38864, 38864, 38864, 38864, 38864, 38864, 38864, 38864, 38864, 38864, 38864, 38864, 38864, 38864, 38864, 38864, 38864, 38864, 38864, 38864, 38864, 38864, 38864, 38864, 38864, 38864, 38864, 38864, 38864, 38864, 38864, 38864, 38864, 38864, 38864, 38864, 38864, 38864, 38864, 38864, 38864, 38864, 38864, 38864, 38864, 38864, 38864, 38864, 38864, 38864, 38864, 38864, 38864, 38864, 38864, 38864, 38864, 38864, 38864, 8, 8, 8, 8, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, -7615, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, -8, -8, -8, -8, -8, -8, -8, -8, 0, 0, 0, 0, 0, 0, 0, 0, -8, -8, -8, -8, -8, -8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -8, -8, -8, -8, -8, -8, -8, -8, 0, 0, 0, 0, 0, 0, 0, 0, -8, -8, -8, -8, -8, -8, -8, -8, 0, 0, 0, 0, 0, 0, 0, 0, -8, -8, -8, -8, -8, -8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -8, 0, -8, 0, -8, 0, -8, 0, 0, 0, 0, 0, 0, 0, 0, -8, -8, -8, -8, -8, -8, -8, -8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -8, -8, -8, -8, -8, -8, -8, -8, 0, 0, 0, 0, 0, 0, 0, 0, -8, -8, -8, -8, -8, -8, -8, -8, 0, 0, 0, 0, 0, 0, 0, 0, -8, -8, -8, -8, -8, -8, -8, -8, 0, 0, 0, 0, 0, 0, 0, 0, -8, -8, -74, -74, -9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -86, -86, -86, -86, -9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -8, -8, -100, -100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -8, -8, -112, -112, -7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -128, -128, -126, -126, -9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -7517, 0, 0, 0, -8383, -8262, 0, 0, 0, 0, 0, 0, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, -10743, -3814, -10727, 0, 0, 1, 0, 1, 0, 1, 0, -10780, -10749, -10783, -10782, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, -10815, -10815, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, -35332, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, -42280, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, -42308, -42319, -42315, -42305, -42308, 0, -42258, -42282, -42261, 928, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }; pspp-1.4.1/gl/unicase/ignorable.h0000644000175000017500000003753313723215640016275 0ustar00blpblp00000000000000/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ /* Casing Properties of Unicode characters. */ /* Generated automatically by gen-uni-tables.c for Unicode 9.0.0. */ #define header_0 16 #define header_2 9 #define header_3 127 #define header_4 15 static const struct { int header[1]; int level1[15]; short level2[3 << 7]; /*unsigned*/ int level3[44 << 4]; } u_casing_property_case_ignorable = { { 15 }, { 16 * sizeof (int) / sizeof (short) + 0, 16 * sizeof (int) / sizeof (short) + 128, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 16 * sizeof (int) / sizeof (short) + 256 }, { 16 + 384 * sizeof (short) / sizeof (int) + 0, 16 + 384 * sizeof (short) / sizeof (int) + 16, 16 + 384 * sizeof (short) / sizeof (int) + 32, 16 + 384 * sizeof (short) / sizeof (int) + 48, 16 + 384 * sizeof (short) / sizeof (int) + 64, 16 + 384 * sizeof (short) / sizeof (int) + 80, 16 + 384 * sizeof (short) / sizeof (int) + 96, 16 + 384 * sizeof (short) / sizeof (int) + 112, 16 + 384 * sizeof (short) / sizeof (int) + 128, 16 + 384 * sizeof (short) / sizeof (int) + 144, -1, 16 + 384 * sizeof (short) / sizeof (int) + 160, 16 + 384 * sizeof (short) / sizeof (int) + 176, 16 + 384 * sizeof (short) / sizeof (int) + 192, 16 + 384 * sizeof (short) / sizeof (int) + 208, 16 + 384 * sizeof (short) / sizeof (int) + 224, 16 + 384 * sizeof (short) / sizeof (int) + 240, -1, -1, -1, -1, -1, 16 + 384 * sizeof (short) / sizeof (int) + 256, 16 + 384 * sizeof (short) / sizeof (int) + 272, 16 + 384 * sizeof (short) / sizeof (int) + 288, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 16 + 384 * sizeof (short) / sizeof (int) + 304, -1, 16 + 384 * sizeof (short) / sizeof (int) + 320, 16 + 384 * sizeof (short) / sizeof (int) + 336, 16 + 384 * sizeof (short) / sizeof (int) + 352, 16 + 384 * sizeof (short) / sizeof (int) + 368, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 16 + 384 * sizeof (short) / sizeof (int) + 384, -1, 16 + 384 * sizeof (short) / sizeof (int) + 400, 16 + 384 * sizeof (short) / sizeof (int) + 416, 16 + 384 * sizeof (short) / sizeof (int) + 432, -1, -1, -1, 16 + 384 * sizeof (short) / sizeof (int) + 448, -1, -1, 16 + 384 * sizeof (short) / sizeof (int) + 464, 16 + 384 * sizeof (short) / sizeof (int) + 480, 16 + 384 * sizeof (short) / sizeof (int) + 496, 16 + 384 * sizeof (short) / sizeof (int) + 512, -1, -1, 16 + 384 * sizeof (short) / sizeof (int) + 528, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 16 + 384 * sizeof (short) / sizeof (int) + 544, -1, 16 + 384 * sizeof (short) / sizeof (int) + 560, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 16 + 384 * sizeof (short) / sizeof (int) + 576, -1, -1, -1, -1, -1, -1, -1, -1, -1, 16 + 384 * sizeof (short) / sizeof (int) + 592, 16 + 384 * sizeof (short) / sizeof (int) + 608, -1, -1, -1, 16 + 384 * sizeof (short) / sizeof (int) + 624, -1, -1, 16 + 384 * sizeof (short) / sizeof (int) + 640, -1, -1, -1, 16 + 384 * sizeof (short) / sizeof (int) + 656, -1, -1, -1, -1, 16 + 384 * sizeof (short) / sizeof (int) + 672, -1, -1, -1, -1, -1, -1, 16 + 384 * sizeof (short) / sizeof (int) + 688, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 }, { 0x00000000, 0x04004000, 0x40000000, 0x00000001, 0x00000000, 0x0190A100, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFE000000, 0xFFFFFFFC, 0xFFFFFFE0, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFDF, 0x0030FFFF, 0x000000B0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x000003F8, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x02000000, 0x00000000, 0xFFFE0000, 0xBFFFFFFF, 0x000000B6, 0x00100000, 0x17FF003F, 0x00000000, 0xFFFFF801, 0x00010000, 0x00000000, 0x00000000, 0xBFC00000, 0x00003DFF, 0x00028000, 0xFFFF0000, 0x000007FF, 0x00000000, 0x00000000, 0x0001FFC0, 0x00000000, 0x043FF800, 0xFFC00000, 0x00003FFF, 0x0E000000, 0x00000000, 0x00000000, 0x00000000, 0xFFF00000, 0xFFFFFFFF, 0x00000007, 0x14000000, 0x00FE21FE, 0x0002000C, 0x00000002, 0x10000000, 0x0000201E, 0x0000000C, 0x00000006, 0x10000000, 0x00023986, 0x00230000, 0x00000006, 0x10000000, 0x000021BE, 0x0000000C, 0x00000002, 0x90000000, 0x0040201E, 0x0000000C, 0x00000004, 0x00000000, 0x00002001, 0x00000000, 0x00000001, 0xC0000000, 0x00603DC1, 0x0000000C, 0x00000002, 0x90000000, 0x00003040, 0x0000000C, 0x00000002, 0x00000000, 0x0000201E, 0x0000000C, 0x00000000, 0x00000000, 0x005C0400, 0x00000000, 0x00000000, 0x07F20000, 0x00007FC0, 0x00000000, 0x00000000, 0x1BF20000, 0x00003F40, 0x00000000, 0x03000000, 0x02A00000, 0x00000000, 0x7FFE0000, 0xFEFFE0DF, 0x1FFFFFFF, 0x00000040, 0x00000000, 0x00000000, 0x66FDE000, 0xC3000000, 0x001E0001, 0x20002064, 0x00000000, 0x00000000, 0x10000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xE0000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x001C0000, 0x001C0000, 0x000C0000, 0x000C0000, 0x00000000, 0x3FB00000, 0x208FFE40, 0x00000000, 0x00007800, 0x00000000, 0x00000008, 0x00000000, 0x00000060, 0x00000200, 0x00000000, 0x00000000, 0x00000000, 0x0E040187, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x09800000, 0x00000000, 0x7F400000, 0x9FF81FE5, 0x00000000, 0x7FFF0080, 0x00000000, 0x00000000, 0x0000000F, 0x17D00000, 0x00000004, 0x000FF800, 0x00000003, 0x00003B3C, 0x00000000, 0x0003A340, 0x00000000, 0x00CFF000, 0x00000000, 0x3F000000, 0x00000000, 0x00000000, 0xFFF70000, 0x031021FD, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xF83FFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xA0000000, 0xE000E003, 0x6000E000, 0x0300F800, 0x00007C90, 0x00000000, 0x0000FFDF, 0x00000000, 0x00000000, 0xFFFF0000, 0x0001FFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00038000, 0x00000000, 0x00000000, 0x00000000, 0x80008000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0x00000000, 0x00008000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000020, 0x083E3C00, 0x00000000, 0x00000000, 0x7E000000, 0x00000000, 0x00000000, 0x70000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00200000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x3F000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00001000, 0x00000000, 0x00000000, 0xBFF78000, 0xC0000000, 0x00000000, 0x00000000, 0x00030000, 0xFFFFFFFF, 0x00000003, 0x00000000, 0x00000000, 0x00000700, 0x00000000, 0x00000000, 0x00000000, 0x00000844, 0x00000060, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000030, 0x0003FFFF, 0x00000000, 0x00003FC0, 0x0003FF80, 0x00000000, 0x00000007, 0x13C80000, 0x00008000, 0x00000060, 0x00000000, 0x00667E00, 0x00001008, 0x10010000, 0x00000000, 0xC19D0000, 0x20000002, 0x00583000, 0x00000000, 0x00000000, 0x08000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00002120, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x40000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFC0000, 0x00000003, 0x00000000, 0x0008FFFF, 0x0000FFFF, 0x00240000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x80000000, 0x04004080, 0x40000000, 0x00000001, 0x00010000, 0xC0000000, 0x00000000, 0x00000000, 0x0E000008, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x20000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x07C00000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x0000F06E, 0x87000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000060, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0xFF000000, 0x0000007F, 0x80000000, 0x00000003, 0x26780000, 0x00000000, 0x00000000, 0x00000007, 0x001FEF80, 0x00000000, 0x00080000, 0x00000003, 0x7FC00000, 0x00001C00, 0x00000000, 0x00000000, 0x40D38000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x80000000, 0x000007F8, 0x00000003, 0x10000000, 0x00000001, 0x001F1FC0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFF000000, 0x0000005C, 0x00000000, 0x00000000, 0x85F80000, 0x0000000D, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xB03C0000, 0x30000001, 0x00000000, 0x00000000, 0xA7F80000, 0x00000001, 0x00000000, 0x00000000, 0x00BF2800, 0x00000000, 0x00000000, 0xE0000000, 0x00000FBC, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xBF7F0000, 0x00000000, 0x00000000, 0xFFFC0000, 0x006DFCFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x001F0000, 0x00000000, 0x007F0000, 0x0000000F, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFF8000, 0x00000000, 0x00000000, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x60000000, 0x0000000F, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFF80380, 0x00000FE7, 0x00003C00, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x0000001C, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xF87FFFFF, 0xFFFFFFFF, 0x00201FFF, 0xF8000010, 0x0000FFFE, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xF9FFFF7F, 0x000007DB, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x007F0000, 0x00000000, 0x00000000, 0x00000000, 0x000007F0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xF8000000, 0x00000002, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x0000FFFF } }; pspp-1.4.1/gl/unicase/ignorable.c0000644000175000017500000000471113723215640016260 0ustar00blpblp00000000000000/* Test whether a Unicode character is case-ignorable. Copyright (C) 2002, 2006-2007, 2009-2020 Free Software Foundation, Inc. Written by Bruno Haible , 2009. 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 3 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, see . */ #include /* Specification. */ #include "caseprop.h" /* Quoting the Unicode standard: Definition: A character is defined to be "case-ignorable" if it has the value MidLetter {or the value MidNumLet} for the Word_Break property or its General_Category is one of Nonspacing_Mark (Mn), Enclosing_Mark (Me), Format (Cf), Modifier_Letter (Lm), or Modifier_Symbol (Sk). The text marked in braces was added in Unicode 5.1.0, see section "Update of Definition of case-ignorable". */ /* Since this predicate is only used for the "Before C" and "After C" conditions of FINAL_SIGMA, we exclude the "cased" characters here. This simplifies the evaluation of the regular expressions \p{cased} (\p{case-ignorable})* C and C (\p{case-ignorable})* \p{cased} */ #if 0 #include "unictype.h" #include "uniwbrk.h" bool uc_is_case_ignorable (ucs4_t uc) { int wbp = uc_wordbreak_property (uc); return (wbp == WBP_MIDLETTER || wbp == WBP_MIDNUMLET || uc_is_general_category_withtable (uc, UC_CATEGORY_MASK_Mn | UC_CATEGORY_MASK_Me | UC_CATEGORY_MASK_Cf | UC_CATEGORY_MASK_Lm | UC_CATEGORY_MASK_Sk)) && !uc_is_cased (uc); } #else #include "unictype/bitmap.h" /* Define u_casing_property_case_ignorable table. */ #include "ignorable.h" bool uc_is_case_ignorable (ucs4_t uc) { return bitmap_lookup (&u_casing_property_case_ignorable, uc); } #endif pspp-1.4.1/gl/unicase/special-casing-table.gperf0000644000175000017500000005127613723215640021156 0ustar00blpblp00000000000000/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ /* Special casing rules of Unicode characters. */ /* Generated automatically by gen-uni-tables.c for Unicode 9.0.0. */ struct special_casing_rule { char code[3]; }; %struct-type %language=ANSI-C %define slot-name code %define hash-function-name gl_unicase_special_hash %define lookup-function-name gl_unicase_special_lookup %compare-lengths %compare-strncmp %readonly-tables %omit-struct-type %% "\x00\x49\x00", 1, SCC_MORE_ABOVE , { 'l', 't' }, { 0x0049, 0, 0 }, { 0x0069, 0x0307, 0 }, { 0x0049, 0, 0 }, { 0x0069, 0, 0 } "\x00\x49\x01", 1, -SCC_BEFORE_DOT , { 't', 'r' }, { 0x0049, 0, 0 }, { 0x0131, 0, 0 }, { 0x0049, 0, 0 }, { 0x0131, 0, 0 } "\x00\x49\x02", 1, -SCC_BEFORE_DOT , { 'a', 'z' }, { 0x0049, 0, 0 }, { 0x0131, 0, 0 }, { 0x0049, 0, 0 }, { 0x0131, 0, 0 } "\x00\x49\x03", 1, SCC_ALWAYS , { 't', 'r' }, { 0x0049, 0, 0 }, { 0x0069, 0, 0 }, { 0x0049, 0, 0 }, { 0x0131, 0, 0 } "\x00\x49\x04", 0, SCC_ALWAYS , { 'a', 'z' }, { 0x0049, 0, 0 }, { 0x0069, 0, 0 }, { 0x0049, 0, 0 }, { 0x0131, 0, 0 } "\x00\x4a\x00", 0, SCC_MORE_ABOVE , { 'l', 't' }, { 0x004A, 0, 0 }, { 0x006A, 0x0307, 0 }, { 0x004A, 0, 0 }, { 0x006A, 0, 0 } "\x00\x69\x00", 1, SCC_ALWAYS , { 't', 'r' }, { 0x0130, 0, 0 }, { 0x0069, 0, 0 }, { 0x0130, 0, 0 }, { 0x0069, 0, 0 } "\x00\x69\x01", 0, SCC_ALWAYS , { 'a', 'z' }, { 0x0130, 0, 0 }, { 0x0069, 0, 0 }, { 0x0130, 0, 0 }, { 0x0069, 0, 0 } "\x00\xcc\x00", 0, SCC_ALWAYS , { 'l', 't' }, { 0x00CC, 0, 0 }, { 0x0069, 0x0307, 0x0300 }, { 0x00CC, 0, 0 }, { 0x00EC, 0, 0 } "\x00\xcd\x00", 0, SCC_ALWAYS , { 'l', 't' }, { 0x00CD, 0, 0 }, { 0x0069, 0x0307, 0x0301 }, { 0x00CD, 0, 0 }, { 0x00ED, 0, 0 } "\x00\xdf\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0053, 0x0053, 0 }, { 0x00DF, 0, 0 }, { 0x0053, 0x0073, 0 }, { 0x0073, 0x0073, 0 } "\x01\x28\x00", 0, SCC_ALWAYS , { 'l', 't' }, { 0x0128, 0, 0 }, { 0x0069, 0x0307, 0x0303 }, { 0x0128, 0, 0 }, { 0x0129, 0, 0 } "\x01\x2e\x00", 0, SCC_MORE_ABOVE , { 'l', 't' }, { 0x012E, 0, 0 }, { 0x012F, 0x0307, 0 }, { 0x012E, 0, 0 }, { 0x012F, 0, 0 } "\x01\x30\x00", 1, SCC_ALWAYS , { 't', 'r' }, { 0x0130, 0, 0 }, { 0x0069, 0, 0 }, { 0x0130, 0, 0 }, { 0x0069, 0, 0 } "\x01\x30\x01", 1, SCC_ALWAYS , { 'a', 'z' }, { 0x0130, 0, 0 }, { 0x0069, 0, 0 }, { 0x0130, 0, 0 }, { 0x0069, 0, 0 } "\x01\x30\x02", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0130, 0, 0 }, { 0x0069, 0x0307, 0 }, { 0x0130, 0, 0 }, { 0x0069, 0x0307, 0 } "\x01\x49\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x02BC, 0x004E, 0 }, { 0x0149, 0, 0 }, { 0x02BC, 0x004E, 0 }, { 0x02BC, 0x006E, 0 } "\x01\xf0\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x004A, 0x030C, 0 }, { 0x01F0, 0, 0 }, { 0x004A, 0x030C, 0 }, { 0x006A, 0x030C, 0 } "\x03\x07\x00", 1, SCC_AFTER_SOFT_DOTTED, { 'l', 't' }, { 0, 0, 0 }, { 0x0307, 0, 0 }, { 0, 0, 0 }, { 0x0307, 0, 0 } "\x03\x07\x01", 1, SCC_AFTER_I , { 't', 'r' }, { 0x0307, 0, 0 }, { 0, 0, 0 }, { 0x0307, 0, 0 }, { 0x0307, 0, 0 } "\x03\x07\x02", 0, SCC_AFTER_I , { 'a', 'z' }, { 0x0307, 0, 0 }, { 0, 0, 0 }, { 0x0307, 0, 0 }, { 0x0307, 0, 0 } "\x03\x90\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0399, 0x0308, 0x0301 }, { 0x0390, 0, 0 }, { 0x0399, 0x0308, 0x0301 }, { 0x03B9, 0x0308, 0x0301 } "\x03\xa3\x00", 0, SCC_FINAL_SIGMA , { '\0', '\0' }, { 0x03A3, 0, 0 }, { 0x03C2, 0, 0 }, { 0x03A3, 0, 0 }, { 0x03C3, 0, 0 } "\x03\xb0\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x03A5, 0x0308, 0x0301 }, { 0x03B0, 0, 0 }, { 0x03A5, 0x0308, 0x0301 }, { 0x03C5, 0x0308, 0x0301 } "\x05\x87\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0535, 0x0552, 0 }, { 0x0587, 0, 0 }, { 0x0535, 0x0582, 0 }, { 0x0565, 0x0582, 0 } "\x1e\x96\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0048, 0x0331, 0 }, { 0x1E96, 0, 0 }, { 0x0048, 0x0331, 0 }, { 0x0068, 0x0331, 0 } "\x1e\x97\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0054, 0x0308, 0 }, { 0x1E97, 0, 0 }, { 0x0054, 0x0308, 0 }, { 0x0074, 0x0308, 0 } "\x1e\x98\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0057, 0x030A, 0 }, { 0x1E98, 0, 0 }, { 0x0057, 0x030A, 0 }, { 0x0077, 0x030A, 0 } "\x1e\x99\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0059, 0x030A, 0 }, { 0x1E99, 0, 0 }, { 0x0059, 0x030A, 0 }, { 0x0079, 0x030A, 0 } "\x1e\x9a\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0041, 0x02BE, 0 }, { 0x1E9A, 0, 0 }, { 0x0041, 0x02BE, 0 }, { 0x0061, 0x02BE, 0 } "\x1e\x9e\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1E9E, 0, 0 }, { 0x00DF, 0, 0 }, { 0x1E9E, 0, 0 }, { 0x0073, 0x0073, 0 } "\x1f\x50\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x03A5, 0x0313, 0 }, { 0x1F50, 0, 0 }, { 0x03A5, 0x0313, 0 }, { 0x03C5, 0x0313, 0 } "\x1f\x52\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x03A5, 0x0313, 0x0300 }, { 0x1F52, 0, 0 }, { 0x03A5, 0x0313, 0x0300 }, { 0x03C5, 0x0313, 0x0300 } "\x1f\x54\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x03A5, 0x0313, 0x0301 }, { 0x1F54, 0, 0 }, { 0x03A5, 0x0313, 0x0301 }, { 0x03C5, 0x0313, 0x0301 } "\x1f\x56\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x03A5, 0x0313, 0x0342 }, { 0x1F56, 0, 0 }, { 0x03A5, 0x0313, 0x0342 }, { 0x03C5, 0x0313, 0x0342 } "\x1f\x80\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F08, 0x0399, 0 }, { 0x1F80, 0, 0 }, { 0x1F88, 0, 0 }, { 0x1F00, 0x03B9, 0 } "\x1f\x81\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F09, 0x0399, 0 }, { 0x1F81, 0, 0 }, { 0x1F89, 0, 0 }, { 0x1F01, 0x03B9, 0 } "\x1f\x82\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F0A, 0x0399, 0 }, { 0x1F82, 0, 0 }, { 0x1F8A, 0, 0 }, { 0x1F02, 0x03B9, 0 } "\x1f\x83\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F0B, 0x0399, 0 }, { 0x1F83, 0, 0 }, { 0x1F8B, 0, 0 }, { 0x1F03, 0x03B9, 0 } "\x1f\x84\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F0C, 0x0399, 0 }, { 0x1F84, 0, 0 }, { 0x1F8C, 0, 0 }, { 0x1F04, 0x03B9, 0 } "\x1f\x85\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F0D, 0x0399, 0 }, { 0x1F85, 0, 0 }, { 0x1F8D, 0, 0 }, { 0x1F05, 0x03B9, 0 } "\x1f\x86\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F0E, 0x0399, 0 }, { 0x1F86, 0, 0 }, { 0x1F8E, 0, 0 }, { 0x1F06, 0x03B9, 0 } "\x1f\x87\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F0F, 0x0399, 0 }, { 0x1F87, 0, 0 }, { 0x1F8F, 0, 0 }, { 0x1F07, 0x03B9, 0 } "\x1f\x88\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F08, 0x0399, 0 }, { 0x1F80, 0, 0 }, { 0x1F88, 0, 0 }, { 0x1F00, 0x03B9, 0 } "\x1f\x89\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F09, 0x0399, 0 }, { 0x1F81, 0, 0 }, { 0x1F89, 0, 0 }, { 0x1F01, 0x03B9, 0 } "\x1f\x8a\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F0A, 0x0399, 0 }, { 0x1F82, 0, 0 }, { 0x1F8A, 0, 0 }, { 0x1F02, 0x03B9, 0 } "\x1f\x8b\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F0B, 0x0399, 0 }, { 0x1F83, 0, 0 }, { 0x1F8B, 0, 0 }, { 0x1F03, 0x03B9, 0 } "\x1f\x8c\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F0C, 0x0399, 0 }, { 0x1F84, 0, 0 }, { 0x1F8C, 0, 0 }, { 0x1F04, 0x03B9, 0 } "\x1f\x8d\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F0D, 0x0399, 0 }, { 0x1F85, 0, 0 }, { 0x1F8D, 0, 0 }, { 0x1F05, 0x03B9, 0 } "\x1f\x8e\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F0E, 0x0399, 0 }, { 0x1F86, 0, 0 }, { 0x1F8E, 0, 0 }, { 0x1F06, 0x03B9, 0 } "\x1f\x8f\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F0F, 0x0399, 0 }, { 0x1F87, 0, 0 }, { 0x1F8F, 0, 0 }, { 0x1F07, 0x03B9, 0 } "\x1f\x90\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F28, 0x0399, 0 }, { 0x1F90, 0, 0 }, { 0x1F98, 0, 0 }, { 0x1F20, 0x03B9, 0 } "\x1f\x91\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F29, 0x0399, 0 }, { 0x1F91, 0, 0 }, { 0x1F99, 0, 0 }, { 0x1F21, 0x03B9, 0 } "\x1f\x92\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F2A, 0x0399, 0 }, { 0x1F92, 0, 0 }, { 0x1F9A, 0, 0 }, { 0x1F22, 0x03B9, 0 } "\x1f\x93\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F2B, 0x0399, 0 }, { 0x1F93, 0, 0 }, { 0x1F9B, 0, 0 }, { 0x1F23, 0x03B9, 0 } "\x1f\x94\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F2C, 0x0399, 0 }, { 0x1F94, 0, 0 }, { 0x1F9C, 0, 0 }, { 0x1F24, 0x03B9, 0 } "\x1f\x95\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F2D, 0x0399, 0 }, { 0x1F95, 0, 0 }, { 0x1F9D, 0, 0 }, { 0x1F25, 0x03B9, 0 } "\x1f\x96\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F2E, 0x0399, 0 }, { 0x1F96, 0, 0 }, { 0x1F9E, 0, 0 }, { 0x1F26, 0x03B9, 0 } "\x1f\x97\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F2F, 0x0399, 0 }, { 0x1F97, 0, 0 }, { 0x1F9F, 0, 0 }, { 0x1F27, 0x03B9, 0 } "\x1f\x98\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F28, 0x0399, 0 }, { 0x1F90, 0, 0 }, { 0x1F98, 0, 0 }, { 0x1F20, 0x03B9, 0 } "\x1f\x99\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F29, 0x0399, 0 }, { 0x1F91, 0, 0 }, { 0x1F99, 0, 0 }, { 0x1F21, 0x03B9, 0 } "\x1f\x9a\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F2A, 0x0399, 0 }, { 0x1F92, 0, 0 }, { 0x1F9A, 0, 0 }, { 0x1F22, 0x03B9, 0 } "\x1f\x9b\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F2B, 0x0399, 0 }, { 0x1F93, 0, 0 }, { 0x1F9B, 0, 0 }, { 0x1F23, 0x03B9, 0 } "\x1f\x9c\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F2C, 0x0399, 0 }, { 0x1F94, 0, 0 }, { 0x1F9C, 0, 0 }, { 0x1F24, 0x03B9, 0 } "\x1f\x9d\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F2D, 0x0399, 0 }, { 0x1F95, 0, 0 }, { 0x1F9D, 0, 0 }, { 0x1F25, 0x03B9, 0 } "\x1f\x9e\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F2E, 0x0399, 0 }, { 0x1F96, 0, 0 }, { 0x1F9E, 0, 0 }, { 0x1F26, 0x03B9, 0 } "\x1f\x9f\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F2F, 0x0399, 0 }, { 0x1F97, 0, 0 }, { 0x1F9F, 0, 0 }, { 0x1F27, 0x03B9, 0 } "\x1f\xa0\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F68, 0x0399, 0 }, { 0x1FA0, 0, 0 }, { 0x1FA8, 0, 0 }, { 0x1F60, 0x03B9, 0 } "\x1f\xa1\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F69, 0x0399, 0 }, { 0x1FA1, 0, 0 }, { 0x1FA9, 0, 0 }, { 0x1F61, 0x03B9, 0 } "\x1f\xa2\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F6A, 0x0399, 0 }, { 0x1FA2, 0, 0 }, { 0x1FAA, 0, 0 }, { 0x1F62, 0x03B9, 0 } "\x1f\xa3\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F6B, 0x0399, 0 }, { 0x1FA3, 0, 0 }, { 0x1FAB, 0, 0 }, { 0x1F63, 0x03B9, 0 } "\x1f\xa4\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F6C, 0x0399, 0 }, { 0x1FA4, 0, 0 }, { 0x1FAC, 0, 0 }, { 0x1F64, 0x03B9, 0 } "\x1f\xa5\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F6D, 0x0399, 0 }, { 0x1FA5, 0, 0 }, { 0x1FAD, 0, 0 }, { 0x1F65, 0x03B9, 0 } "\x1f\xa6\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F6E, 0x0399, 0 }, { 0x1FA6, 0, 0 }, { 0x1FAE, 0, 0 }, { 0x1F66, 0x03B9, 0 } "\x1f\xa7\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F6F, 0x0399, 0 }, { 0x1FA7, 0, 0 }, { 0x1FAF, 0, 0 }, { 0x1F67, 0x03B9, 0 } "\x1f\xa8\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F68, 0x0399, 0 }, { 0x1FA0, 0, 0 }, { 0x1FA8, 0, 0 }, { 0x1F60, 0x03B9, 0 } "\x1f\xa9\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F69, 0x0399, 0 }, { 0x1FA1, 0, 0 }, { 0x1FA9, 0, 0 }, { 0x1F61, 0x03B9, 0 } "\x1f\xaa\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F6A, 0x0399, 0 }, { 0x1FA2, 0, 0 }, { 0x1FAA, 0, 0 }, { 0x1F62, 0x03B9, 0 } "\x1f\xab\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F6B, 0x0399, 0 }, { 0x1FA3, 0, 0 }, { 0x1FAB, 0, 0 }, { 0x1F63, 0x03B9, 0 } "\x1f\xac\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F6C, 0x0399, 0 }, { 0x1FA4, 0, 0 }, { 0x1FAC, 0, 0 }, { 0x1F64, 0x03B9, 0 } "\x1f\xad\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F6D, 0x0399, 0 }, { 0x1FA5, 0, 0 }, { 0x1FAD, 0, 0 }, { 0x1F65, 0x03B9, 0 } "\x1f\xae\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F6E, 0x0399, 0 }, { 0x1FA6, 0, 0 }, { 0x1FAE, 0, 0 }, { 0x1F66, 0x03B9, 0 } "\x1f\xaf\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F6F, 0x0399, 0 }, { 0x1FA7, 0, 0 }, { 0x1FAF, 0, 0 }, { 0x1F67, 0x03B9, 0 } "\x1f\xb2\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1FBA, 0x0399, 0 }, { 0x1FB2, 0, 0 }, { 0x1FBA, 0x0345, 0 }, { 0x1F70, 0x03B9, 0 } "\x1f\xb3\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0391, 0x0399, 0 }, { 0x1FB3, 0, 0 }, { 0x1FBC, 0, 0 }, { 0x03B1, 0x03B9, 0 } "\x1f\xb4\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0386, 0x0399, 0 }, { 0x1FB4, 0, 0 }, { 0x0386, 0x0345, 0 }, { 0x03AC, 0x03B9, 0 } "\x1f\xb6\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0391, 0x0342, 0 }, { 0x1FB6, 0, 0 }, { 0x0391, 0x0342, 0 }, { 0x03B1, 0x0342, 0 } "\x1f\xb7\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0391, 0x0342, 0x0399 }, { 0x1FB7, 0, 0 }, { 0x0391, 0x0342, 0x0345 }, { 0x03B1, 0x0342, 0x03B9 } "\x1f\xbc\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0391, 0x0399, 0 }, { 0x1FB3, 0, 0 }, { 0x1FBC, 0, 0 }, { 0x03B1, 0x03B9, 0 } "\x1f\xc2\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1FCA, 0x0399, 0 }, { 0x1FC2, 0, 0 }, { 0x1FCA, 0x0345, 0 }, { 0x1F74, 0x03B9, 0 } "\x1f\xc3\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0397, 0x0399, 0 }, { 0x1FC3, 0, 0 }, { 0x1FCC, 0, 0 }, { 0x03B7, 0x03B9, 0 } "\x1f\xc4\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0389, 0x0399, 0 }, { 0x1FC4, 0, 0 }, { 0x0389, 0x0345, 0 }, { 0x03AE, 0x03B9, 0 } "\x1f\xc6\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0397, 0x0342, 0 }, { 0x1FC6, 0, 0 }, { 0x0397, 0x0342, 0 }, { 0x03B7, 0x0342, 0 } "\x1f\xc7\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0397, 0x0342, 0x0399 }, { 0x1FC7, 0, 0 }, { 0x0397, 0x0342, 0x0345 }, { 0x03B7, 0x0342, 0x03B9 } "\x1f\xcc\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0397, 0x0399, 0 }, { 0x1FC3, 0, 0 }, { 0x1FCC, 0, 0 }, { 0x03B7, 0x03B9, 0 } "\x1f\xd2\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0399, 0x0308, 0x0300 }, { 0x1FD2, 0, 0 }, { 0x0399, 0x0308, 0x0300 }, { 0x03B9, 0x0308, 0x0300 } "\x1f\xd3\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0399, 0x0308, 0x0301 }, { 0x1FD3, 0, 0 }, { 0x0399, 0x0308, 0x0301 }, { 0x03B9, 0x0308, 0x0301 } "\x1f\xd6\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0399, 0x0342, 0 }, { 0x1FD6, 0, 0 }, { 0x0399, 0x0342, 0 }, { 0x03B9, 0x0342, 0 } "\x1f\xd7\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0399, 0x0308, 0x0342 }, { 0x1FD7, 0, 0 }, { 0x0399, 0x0308, 0x0342 }, { 0x03B9, 0x0308, 0x0342 } "\x1f\xe2\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x03A5, 0x0308, 0x0300 }, { 0x1FE2, 0, 0 }, { 0x03A5, 0x0308, 0x0300 }, { 0x03C5, 0x0308, 0x0300 } "\x1f\xe3\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x03A5, 0x0308, 0x0301 }, { 0x1FE3, 0, 0 }, { 0x03A5, 0x0308, 0x0301 }, { 0x03C5, 0x0308, 0x0301 } "\x1f\xe4\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x03A1, 0x0313, 0 }, { 0x1FE4, 0, 0 }, { 0x03A1, 0x0313, 0 }, { 0x03C1, 0x0313, 0 } "\x1f\xe6\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x03A5, 0x0342, 0 }, { 0x1FE6, 0, 0 }, { 0x03A5, 0x0342, 0 }, { 0x03C5, 0x0342, 0 } "\x1f\xe7\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x03A5, 0x0308, 0x0342 }, { 0x1FE7, 0, 0 }, { 0x03A5, 0x0308, 0x0342 }, { 0x03C5, 0x0308, 0x0342 } "\x1f\xf2\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1FFA, 0x0399, 0 }, { 0x1FF2, 0, 0 }, { 0x1FFA, 0x0345, 0 }, { 0x1F7C, 0x03B9, 0 } "\x1f\xf3\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x03A9, 0x0399, 0 }, { 0x1FF3, 0, 0 }, { 0x1FFC, 0, 0 }, { 0x03C9, 0x03B9, 0 } "\x1f\xf4\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x038F, 0x0399, 0 }, { 0x1FF4, 0, 0 }, { 0x038F, 0x0345, 0 }, { 0x03CE, 0x03B9, 0 } "\x1f\xf6\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x03A9, 0x0342, 0 }, { 0x1FF6, 0, 0 }, { 0x03A9, 0x0342, 0 }, { 0x03C9, 0x0342, 0 } "\x1f\xf7\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x03A9, 0x0342, 0x0399 }, { 0x1FF7, 0, 0 }, { 0x03A9, 0x0342, 0x0345 }, { 0x03C9, 0x0342, 0x03B9 } "\x1f\xfc\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x03A9, 0x0399, 0 }, { 0x1FF3, 0, 0 }, { 0x1FFC, 0, 0 }, { 0x03C9, 0x03B9, 0 } "\xfb\x00\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0046, 0x0046, 0 }, { 0xFB00, 0, 0 }, { 0x0046, 0x0066, 0 }, { 0x0066, 0x0066, 0 } "\xfb\x01\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0046, 0x0049, 0 }, { 0xFB01, 0, 0 }, { 0x0046, 0x0069, 0 }, { 0x0066, 0x0069, 0 } "\xfb\x02\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0046, 0x004C, 0 }, { 0xFB02, 0, 0 }, { 0x0046, 0x006C, 0 }, { 0x0066, 0x006C, 0 } "\xfb\x03\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0046, 0x0046, 0x0049 }, { 0xFB03, 0, 0 }, { 0x0046, 0x0066, 0x0069 }, { 0x0066, 0x0066, 0x0069 } "\xfb\x04\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0046, 0x0046, 0x004C }, { 0xFB04, 0, 0 }, { 0x0046, 0x0066, 0x006C }, { 0x0066, 0x0066, 0x006C } "\xfb\x05\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0053, 0x0054, 0 }, { 0xFB05, 0, 0 }, { 0x0053, 0x0074, 0 }, { 0x0073, 0x0074, 0 } "\xfb\x06\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0053, 0x0054, 0 }, { 0xFB06, 0, 0 }, { 0x0053, 0x0074, 0 }, { 0x0073, 0x0074, 0 } "\xfb\x13\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0544, 0x0546, 0 }, { 0xFB13, 0, 0 }, { 0x0544, 0x0576, 0 }, { 0x0574, 0x0576, 0 } "\xfb\x14\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0544, 0x0535, 0 }, { 0xFB14, 0, 0 }, { 0x0544, 0x0565, 0 }, { 0x0574, 0x0565, 0 } "\xfb\x15\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0544, 0x053B, 0 }, { 0xFB15, 0, 0 }, { 0x0544, 0x056B, 0 }, { 0x0574, 0x056B, 0 } "\xfb\x16\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x054E, 0x0546, 0 }, { 0xFB16, 0, 0 }, { 0x054E, 0x0576, 0 }, { 0x057E, 0x0576, 0 } "\xfb\x17\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0544, 0x053D, 0 }, { 0xFB17, 0, 0 }, { 0x0544, 0x056D, 0 }, { 0x0574, 0x056D, 0 } pspp-1.4.1/gl/unicase/cased.h0000644000175000017500000002103113723215640015374 0ustar00blpblp00000000000000/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ /* Casing Properties of Unicode characters. */ /* Generated automatically by gen-uni-tables.c for Unicode 9.0.0. */ #define header_0 16 #define header_2 9 #define header_3 127 #define header_4 15 static const struct { int header[1]; int level1[2]; short level2[2 << 7]; /*unsigned*/ int level3[21 << 4]; } u_casing_property_cased = { { 2 }, { 3 * sizeof (int) / sizeof (short) + 0, 3 * sizeof (int) / sizeof (short) + 128 }, { 3 + 256 * sizeof (short) / sizeof (int) + 0, 3 + 256 * sizeof (short) / sizeof (int) + 16, 3 + 256 * sizeof (short) / sizeof (int) + 32, -1, -1, -1, -1, -1, 3 + 256 * sizeof (short) / sizeof (int) + 48, 3 + 256 * sizeof (short) / sizeof (int) + 64, -1, -1, -1, -1, 3 + 256 * sizeof (short) / sizeof (int) + 80, 3 + 256 * sizeof (short) / sizeof (int) + 96, 3 + 256 * sizeof (short) / sizeof (int) + 112, -1, 3 + 256 * sizeof (short) / sizeof (int) + 128, -1, -1, -1, 3 + 256 * sizeof (short) / sizeof (int) + 144, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 3 + 256 * sizeof (short) / sizeof (int) + 160, -1, 3 + 256 * sizeof (short) / sizeof (int) + 176, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 3 + 256 * sizeof (short) / sizeof (int) + 192, -1, 3 + 256 * sizeof (short) / sizeof (int) + 208, -1, -1, 3 + 256 * sizeof (short) / sizeof (int) + 224, -1, -1, -1, 3 + 256 * sizeof (short) / sizeof (int) + 240, -1, -1, -1, -1, -1, 3 + 256 * sizeof (short) / sizeof (int) + 256, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 3 + 256 * sizeof (short) / sizeof (int) + 272, 3 + 256 * sizeof (short) / sizeof (int) + 288, -1, -1, -1, -1, -1, -1, -1, -1, 3 + 256 * sizeof (short) / sizeof (int) + 304, -1, -1, -1, 3 + 256 * sizeof (short) / sizeof (int) + 320, -1, -1, -1, -1, -1, -1, -1 }, { 0x00000000, 0x00000000, 0x07FFFFFE, 0x07FFFFFE, 0x00000000, 0x04200400, 0xFF7FFFFF, 0xFF7FFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xF7FFFFFF, 0xFFFFFFF0, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFEFFFFF, 0x01FFFFFF, 0x00000003, 0x0000001F, 0x00000000, 0x00000000, 0x00000020, 0xBCCF0000, 0xFFFFD740, 0xFFFFFFFB, 0xFFFFFFFF, 0xFFBFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFC03, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFEFFFF, 0x007FFFFF, 0xFFFFFFFE, 0x000000FF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0x000020BF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0x3F3FFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x000001FF, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x3F3FFFFF, 0xFFFFFFFF, 0xAAFF3F3F, 0x3FFFFFFF, 0xFFFFFFFF, 0x5FDFFFFF, 0x0FCF1FDC, 0x1FDC1FFF, 0x00000000, 0x00000000, 0x00000000, 0x80020000, 0x1FFF0000, 0x00000000, 0x00000000, 0x00000000, 0x3E2FFC84, 0xF21FBD50, 0x000043E0, 0xFFFFFFFF, 0x00000018, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFC00000, 0xFFFFFFFF, 0x000003FF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFF7FFF, 0x7FFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x000C781F, 0xFFFFFFFF, 0x000020BF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0x00003FFF, 0x3FFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFC, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFF78FF, 0x00FF7FFF, 0x00000000, 0x07000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFF0000, 0xF7FFFFFF, 0xFFFF003F, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00F8007F, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x07FFFFFE, 0x07FFFFFE, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0x0000FFFF, 0x00000000, 0x00000000, 0xFFFF0000, 0xFF0FFFFF, 0x0FFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0x0007FFFF, 0xFFFFFFFF, 0x0007FFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFDFFFFF, 0xFFFFFFFF, 0xDFFFFFFF, 0xEBFFDE64, 0xFFFFFFEF, 0xFFFFFFFF, 0xDFDFE7BF, 0x7BFFFFFF, 0xFFFDFC5F, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFF3F, 0xF7FFFFFD, 0xF7FFFFFF, 0xFFDFFFFF, 0xFFDFFFFF, 0xFFFF7FFF, 0xFFFF7FFF, 0xFFFFFDFF, 0xFFFFFDFF, 0x00000FF7, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0x0000000F, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFF0000, 0xFFFF03FF, 0xFFFF03FF, 0x000003FF, 0x00000000, 0x00000000, 0x00000000 } }; pspp-1.4.1/gl/unicase/unicasemap.h0000644000175000017500000000444213723215640016451 0ustar00blpblp00000000000000/* Case mapping for UTF-8/UTF-16/UTF-32 strings (locale dependent). Copyright (C) 2009-2020 Free Software Foundation, Inc. Written by Bruno Haible , 2009. 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 3 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, see . */ #include #include "unitypes.h" #include "unicase.h" #include "uninorm.h" extern uint8_t * u8_casemap (const uint8_t *s, size_t n, casing_prefix_context_t prefix_context, casing_suffix_context_t suffix_context, const char *iso639_language, ucs4_t (*single_character_map) (ucs4_t), size_t offset_in_rule, /* offset in 'struct special_casing_rule' */ uninorm_t nf, uint8_t *resultbuf, size_t *lengthp); extern uint16_t * u16_casemap (const uint16_t *s, size_t n, casing_prefix_context_t prefix_context, casing_suffix_context_t suffix_context, const char *iso639_language, ucs4_t (*single_character_map) (ucs4_t), size_t offset_in_rule, /* offset in 'struct special_casing_rule' */ uninorm_t nf, uint16_t *resultbuf, size_t *lengthp); extern uint32_t * u32_casemap (const uint32_t *s, size_t n, casing_prefix_context_t prefix_context, casing_suffix_context_t suffix_context, const char *iso639_language, ucs4_t (*single_character_map) (ucs4_t), size_t offset_in_rule, /* offset in 'struct special_casing_rule' */ uninorm_t nf, uint32_t *resultbuf, size_t *lengthp); pspp-1.4.1/gl/unicase/special-casing-table.h0000644000175000017500000007615713723215757020320 0ustar00blpblp00000000000000/* ANSI-C code produced by gperf version 3.1 */ /* Command-line: gperf -m 10 ../../gl/unicase/special-casing-table.gperf */ /* Computed positions: -k'1-3' */ #define TOTAL_KEYWORDS 122 #define MIN_WORD_LENGTH 3 #define MAX_WORD_LENGTH 3 #define MIN_HASH_VALUE 0 #define MAX_HASH_VALUE 121 /* maximum key range = 122, duplicates = 0 */ #ifdef __GNUC__ __inline #else #ifdef __cplusplus inline #endif #endif /*ARGSUSED*/ static unsigned int gl_unicase_special_hash (register const char *str, register size_t len) { static const unsigned char asso_values[] = { 2, 0, 4, 5, 37, 12, 121, 4, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 120, 119, 118, 117, 116, 122, 122, 122, 122, 122, 122, 5, 3, 122, 122, 122, 122, 122, 122, 122, 122, 115, 122, 122, 122, 122, 122, 114, 122, 6, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 1, 111, 122, 122, 122, 122, 122, 109, 122, 108, 122, 107, 122, 106, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 33, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 105, 104, 103, 102, 101, 100, 99, 31, 98, 97, 96, 95, 94, 93, 92, 91, 28, 90, 89, 88, 87, 86, 27, 24, 23, 20, 19, 85, 84, 83, 16, 82, 81, 80, 79, 15, 78, 77, 76, 75, 74, 73, 72, 71, 70, 69, 68, 67, 64, 122, 65, 64, 63, 122, 62, 61, 122, 122, 122, 122, 60, 122, 122, 122, 122, 122, 59, 58, 57, 122, 56, 55, 122, 122, 122, 122, 14, 55, 122, 122, 122, 122, 53, 52, 122, 122, 51, 50, 122, 122, 122, 122, 122, 122, 122, 50, 122, 122, 48, 47, 46, 122, 45, 44, 122, 122, 122, 122, 122, 122, 122, 122, 46, 122, 42, 41, 39, 122, 38, 35, 122, 122, 122, 0, 33, 122, 122, 122, 122 }; return asso_values[(unsigned char)str[2]+1] + asso_values[(unsigned char)str[1]] + asso_values[(unsigned char)str[0]]; } const struct special_casing_rule * gl_unicase_special_lookup (register const char *str, register size_t len) { static const unsigned char lengthtable[] = { 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3 }; static const struct special_casing_rule wordlist[] = { #line 126 "../../gl/unicase/special-casing-table.gperf" {"\373\001\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0046, 0x0049, 0 }, { 0xFB01, 0, 0 }, { 0x0046, 0x0069, 0 }, { 0x0066, 0x0069, 0 }}, #line 31 "../../gl/unicase/special-casing-table.gperf" {"\001I\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x02BC, 0x004E, 0 }, { 0x0149, 0, 0 }, { 0x02BC, 0x004E, 0 }, { 0x02BC, 0x006E, 0 }}, #line 125 "../../gl/unicase/special-casing-table.gperf" {"\373\000\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0046, 0x0046, 0 }, { 0xFB00, 0, 0 }, { 0x0046, 0x0066, 0 }, { 0x0066, 0x0066, 0 }}, #line 15 "../../gl/unicase/special-casing-table.gperf" {"\000I\000", 1, SCC_MORE_ABOVE , { 'l', 't' }, { 0x0049, 0, 0 }, { 0x0069, 0x0307, 0 }, { 0x0049, 0, 0 }, { 0x0069, 0, 0 }}, #line 127 "../../gl/unicase/special-casing-table.gperf" {"\373\002\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0046, 0x004C, 0 }, { 0xFB02, 0, 0 }, { 0x0046, 0x006C, 0 }, { 0x0066, 0x006C, 0 }}, #line 128 "../../gl/unicase/special-casing-table.gperf" {"\373\003\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0046, 0x0046, 0x0049 }, { 0xFB03, 0, 0 }, { 0x0046, 0x0066, 0x0069 }, { 0x0066, 0x0066, 0x0069 }}, #line 28 "../../gl/unicase/special-casing-table.gperf" {"\0010\000", 1, SCC_ALWAYS , { 't', 'r' }, { 0x0130, 0, 0 }, { 0x0069, 0, 0 }, { 0x0130, 0, 0 }, { 0x0069, 0, 0 }}, #line 16 "../../gl/unicase/special-casing-table.gperf" {"\000I\001", 1, -SCC_BEFORE_DOT , { 't', 'r' }, { 0x0049, 0, 0 }, { 0x0131, 0, 0 }, { 0x0049, 0, 0 }, { 0x0131, 0, 0 }}, #line 17 "../../gl/unicase/special-casing-table.gperf" {"\000I\002", 1, -SCC_BEFORE_DOT , { 'a', 'z' }, { 0x0049, 0, 0 }, { 0x0131, 0, 0 }, { 0x0049, 0, 0 }, { 0x0131, 0, 0 }}, #line 33 "../../gl/unicase/special-casing-table.gperf" {"\003\007\000", 1, SCC_AFTER_SOFT_DOTTED, { 'l', 't' }, { 0, 0, 0 }, { 0x0307, 0, 0 }, { 0, 0, 0 }, { 0x0307, 0, 0 }}, #line 29 "../../gl/unicase/special-casing-table.gperf" {"\0010\001", 1, SCC_ALWAYS , { 'a', 'z' }, { 0x0130, 0, 0 }, { 0x0069, 0, 0 }, { 0x0130, 0, 0 }, { 0x0069, 0, 0 }}, #line 30 "../../gl/unicase/special-casing-table.gperf" {"\0010\002", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0130, 0, 0 }, { 0x0069, 0x0307, 0 }, { 0x0130, 0, 0 }, { 0x0069, 0x0307, 0 }}, #line 130 "../../gl/unicase/special-casing-table.gperf" {"\373\005\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0053, 0x0054, 0 }, { 0xFB05, 0, 0 }, { 0x0053, 0x0074, 0 }, { 0x0073, 0x0074, 0 }}, #line 34 "../../gl/unicase/special-casing-table.gperf" {"\003\007\001", 1, SCC_AFTER_I , { 't', 'r' }, { 0x0307, 0, 0 }, { 0, 0, 0 }, { 0x0307, 0, 0 }, { 0x0307, 0, 0 }}, #line 35 "../../gl/unicase/special-casing-table.gperf" {"\003\007\002", 0, SCC_AFTER_I , { 'a', 'z' }, { 0x0307, 0, 0 }, { 0, 0, 0 }, { 0x0307, 0, 0 }, { 0x0307, 0, 0 }}, #line 19 "../../gl/unicase/special-casing-table.gperf" {"\000I\004", 0, SCC_ALWAYS , { 'a', 'z' }, { 0x0049, 0, 0 }, { 0x0069, 0, 0 }, { 0x0049, 0, 0 }, { 0x0131, 0, 0 }}, #line 23 "../../gl/unicase/special-casing-table.gperf" {"\000\314\000", 0, SCC_ALWAYS , { 'l', 't' }, { 0x00CC, 0, 0 }, { 0x0069, 0x0307, 0x0300 }, { 0x00CC, 0, 0 }, { 0x00EC, 0, 0 }}, #line 109 "../../gl/unicase/special-casing-table.gperf" {"\037\314\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0397, 0x0399, 0 }, { 0x1FC3, 0, 0 }, { 0x1FCC, 0, 0 }, { 0x03B7, 0x03B9, 0 }}, #line 85 "../../gl/unicase/special-casing-table.gperf" {"\037\243\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F6B, 0x0399, 0 }, { 0x1FA3, 0, 0 }, { 0x1FAB, 0, 0 }, { 0x1F63, 0x03B9, 0 }}, #line 80 "../../gl/unicase/special-casing-table.gperf" {"\037\236\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F2E, 0x0399, 0 }, { 0x1F96, 0, 0 }, { 0x1F9E, 0, 0 }, { 0x1F26, 0x03B9, 0 }}, #line 37 "../../gl/unicase/special-casing-table.gperf" {"\003\243\000", 0, SCC_FINAL_SIGMA , { '\0', '\0' }, { 0x03A3, 0, 0 }, { 0x03C2, 0, 0 }, { 0x03A3, 0, 0 }, { 0x03C3, 0, 0 }}, #line 45 "../../gl/unicase/special-casing-table.gperf" {"\036\236\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1E9E, 0, 0 }, { 0x00DF, 0, 0 }, { 0x1E9E, 0, 0 }, { 0x0073, 0x0073, 0 }}, #line 76 "../../gl/unicase/special-casing-table.gperf" {"\037\232\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F2A, 0x0399, 0 }, { 0x1F92, 0, 0 }, { 0x1F9A, 0, 0 }, { 0x1F22, 0x03B9, 0 }}, #line 75 "../../gl/unicase/special-casing-table.gperf" {"\037\231\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F29, 0x0399, 0 }, { 0x1F91, 0, 0 }, { 0x1F99, 0, 0 }, { 0x1F21, 0x03B9, 0 }}, #line 44 "../../gl/unicase/special-casing-table.gperf" {"\036\232\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0041, 0x02BE, 0 }, { 0x1E9A, 0, 0 }, { 0x0041, 0x02BE, 0 }, { 0x0061, 0x02BE, 0 }}, #line 43 "../../gl/unicase/special-casing-table.gperf" {"\036\231\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0059, 0x030A, 0 }, { 0x1E99, 0, 0 }, { 0x0059, 0x030A, 0 }, { 0x0079, 0x030A, 0 }}, #line 74 "../../gl/unicase/special-casing-table.gperf" {"\037\230\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F28, 0x0399, 0 }, { 0x1F90, 0, 0 }, { 0x1F98, 0, 0 }, { 0x1F20, 0x03B9, 0 }}, #line 73 "../../gl/unicase/special-casing-table.gperf" {"\037\227\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F2F, 0x0399, 0 }, { 0x1F97, 0, 0 }, { 0x1F9F, 0, 0 }, { 0x1F27, 0x03B9, 0 }}, #line 42 "../../gl/unicase/special-casing-table.gperf" {"\036\230\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0057, 0x030A, 0 }, { 0x1E98, 0, 0 }, { 0x0057, 0x030A, 0 }, { 0x0077, 0x030A, 0 }}, #line 41 "../../gl/unicase/special-casing-table.gperf" {"\036\227\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0054, 0x0308, 0 }, { 0x1E97, 0, 0 }, { 0x0054, 0x0308, 0 }, { 0x0074, 0x0308, 0 }}, #line 72 "../../gl/unicase/special-casing-table.gperf" {"\037\226\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F2E, 0x0399, 0 }, { 0x1F96, 0, 0 }, { 0x1F9E, 0, 0 }, { 0x1F26, 0x03B9, 0 }}, #line 66 "../../gl/unicase/special-casing-table.gperf" {"\037\220\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F28, 0x0399, 0 }, { 0x1F90, 0, 0 }, { 0x1F98, 0, 0 }, { 0x1F20, 0x03B9, 0 }}, #line 40 "../../gl/unicase/special-casing-table.gperf" {"\036\226\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0048, 0x0331, 0 }, { 0x1E96, 0, 0 }, { 0x0048, 0x0331, 0 }, { 0x0068, 0x0331, 0 }}, #line 36 "../../gl/unicase/special-casing-table.gperf" {"\003\220\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0399, 0x0308, 0x0301 }, { 0x0390, 0, 0 }, { 0x0399, 0x0308, 0x0301 }, { 0x03B9, 0x0308, 0x0301 }}, #line 57 "../../gl/unicase/special-casing-table.gperf" {"\037\207\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F0F, 0x0399, 0 }, { 0x1F87, 0, 0 }, { 0x1F8F, 0, 0 }, { 0x1F07, 0x03B9, 0 }}, #line 21 "../../gl/unicase/special-casing-table.gperf" {"\000i\000", 1, SCC_ALWAYS , { 't', 'r' }, { 0x0130, 0, 0 }, { 0x0069, 0, 0 }, { 0x0130, 0, 0 }, { 0x0069, 0, 0 }}, #line 124 "../../gl/unicase/special-casing-table.gperf" {"\037\374\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x03A9, 0x0399, 0 }, { 0x1FF3, 0, 0 }, { 0x1FFC, 0, 0 }, { 0x03C9, 0x03B9, 0 }}, #line 129 "../../gl/unicase/special-casing-table.gperf" {"\373\004\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0046, 0x0046, 0x004C }, { 0xFB04, 0, 0 }, { 0x0046, 0x0066, 0x006C }, { 0x0066, 0x0066, 0x006C }}, #line 123 "../../gl/unicase/special-casing-table.gperf" {"\037\367\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x03A9, 0x0342, 0x0399 }, { 0x1FF7, 0, 0 }, { 0x03A9, 0x0342, 0x0345 }, { 0x03C9, 0x0342, 0x03B9 }}, #line 22 "../../gl/unicase/special-casing-table.gperf" {"\000i\001", 0, SCC_ALWAYS , { 'a', 'z' }, { 0x0130, 0, 0 }, { 0x0069, 0, 0 }, { 0x0130, 0, 0 }, { 0x0069, 0, 0 }}, #line 18 "../../gl/unicase/special-casing-table.gperf" {"\000I\003", 1, SCC_ALWAYS , { 't', 'r' }, { 0x0049, 0, 0 }, { 0x0069, 0, 0 }, { 0x0049, 0, 0 }, { 0x0131, 0, 0 }}, #line 122 "../../gl/unicase/special-casing-table.gperf" {"\037\366\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x03A9, 0x0342, 0 }, { 0x1FF6, 0, 0 }, { 0x03A9, 0x0342, 0 }, { 0x03C9, 0x0342, 0 }}, #line 121 "../../gl/unicase/special-casing-table.gperf" {"\037\364\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x038F, 0x0399, 0 }, { 0x1FF4, 0, 0 }, { 0x038F, 0x0345, 0 }, { 0x03CE, 0x03B9, 0 }}, #line 39 "../../gl/unicase/special-casing-table.gperf" {"\005\207\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0535, 0x0552, 0 }, { 0x0587, 0, 0 }, { 0x0535, 0x0582, 0 }, { 0x0565, 0x0582, 0 }}, #line 120 "../../gl/unicase/special-casing-table.gperf" {"\037\363\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x03A9, 0x0399, 0 }, { 0x1FF3, 0, 0 }, { 0x1FFC, 0, 0 }, { 0x03C9, 0x03B9, 0 }}, #line 119 "../../gl/unicase/special-casing-table.gperf" {"\037\362\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1FFA, 0x0399, 0 }, { 0x1FF2, 0, 0 }, { 0x1FFA, 0x0345, 0 }, { 0x1F7C, 0x03B9, 0 }}, #line 32 "../../gl/unicase/special-casing-table.gperf" {"\001\360\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x004A, 0x030C, 0 }, { 0x01F0, 0, 0 }, { 0x004A, 0x030C, 0 }, { 0x006A, 0x030C, 0 }}, #line 118 "../../gl/unicase/special-casing-table.gperf" {"\037\347\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x03A5, 0x0308, 0x0342 }, { 0x1FE7, 0, 0 }, { 0x03A5, 0x0308, 0x0342 }, { 0x03C5, 0x0308, 0x0342 }}, #line 117 "../../gl/unicase/special-casing-table.gperf" {"\037\346\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x03A5, 0x0342, 0 }, { 0x1FE6, 0, 0 }, { 0x03A5, 0x0342, 0 }, { 0x03C5, 0x0342, 0 }}, #line 116 "../../gl/unicase/special-casing-table.gperf" {"\037\344\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x03A1, 0x0313, 0 }, { 0x1FE4, 0, 0 }, { 0x03A1, 0x0313, 0 }, { 0x03C1, 0x0313, 0 }}, #line 115 "../../gl/unicase/special-casing-table.gperf" {"\037\343\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x03A5, 0x0308, 0x0301 }, { 0x1FE3, 0, 0 }, { 0x03A5, 0x0308, 0x0301 }, { 0x03C5, 0x0308, 0x0301 }}, #line 114 "../../gl/unicase/special-casing-table.gperf" {"\037\342\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x03A5, 0x0308, 0x0300 }, { 0x1FE2, 0, 0 }, { 0x03A5, 0x0308, 0x0300 }, { 0x03C5, 0x0308, 0x0300 }}, #line 25 "../../gl/unicase/special-casing-table.gperf" {"\000\337\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0053, 0x0053, 0 }, { 0x00DF, 0, 0 }, { 0x0053, 0x0073, 0 }, { 0x0073, 0x0073, 0 }}, #line 113 "../../gl/unicase/special-casing-table.gperf" {"\037\327\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0399, 0x0308, 0x0342 }, { 0x1FD7, 0, 0 }, { 0x0399, 0x0308, 0x0342 }, { 0x03B9, 0x0308, 0x0342 }}, #line 112 "../../gl/unicase/special-casing-table.gperf" {"\037\326\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0399, 0x0342, 0 }, { 0x1FD6, 0, 0 }, { 0x0399, 0x0342, 0 }, { 0x03B9, 0x0342, 0 }}, #line 111 "../../gl/unicase/special-casing-table.gperf" {"\037\323\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0399, 0x0308, 0x0301 }, { 0x1FD3, 0, 0 }, { 0x0399, 0x0308, 0x0301 }, { 0x03B9, 0x0308, 0x0301 }}, #line 110 "../../gl/unicase/special-casing-table.gperf" {"\037\322\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0399, 0x0308, 0x0300 }, { 0x1FD2, 0, 0 }, { 0x0399, 0x0308, 0x0300 }, { 0x03B9, 0x0308, 0x0300 }}, #line 24 "../../gl/unicase/special-casing-table.gperf" {"\000\315\000", 0, SCC_ALWAYS , { 'l', 't' }, { 0x00CD, 0, 0 }, { 0x0069, 0x0307, 0x0301 }, { 0x00CD, 0, 0 }, { 0x00ED, 0, 0 }}, #line 108 "../../gl/unicase/special-casing-table.gperf" {"\037\307\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0397, 0x0342, 0x0399 }, { 0x1FC7, 0, 0 }, { 0x0397, 0x0342, 0x0345 }, { 0x03B7, 0x0342, 0x03B9 }}, #line 107 "../../gl/unicase/special-casing-table.gperf" {"\037\306\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0397, 0x0342, 0 }, { 0x1FC6, 0, 0 }, { 0x0397, 0x0342, 0 }, { 0x03B7, 0x0342, 0 }}, #line 106 "../../gl/unicase/special-casing-table.gperf" {"\037\304\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0389, 0x0399, 0 }, { 0x1FC4, 0, 0 }, { 0x0389, 0x0345, 0 }, { 0x03AE, 0x03B9, 0 }}, #line 105 "../../gl/unicase/special-casing-table.gperf" {"\037\303\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0397, 0x0399, 0 }, { 0x1FC3, 0, 0 }, { 0x1FCC, 0, 0 }, { 0x03B7, 0x03B9, 0 }}, #line 104 "../../gl/unicase/special-casing-table.gperf" {"\037\302\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1FCA, 0x0399, 0 }, { 0x1FC2, 0, 0 }, { 0x1FCA, 0x0345, 0 }, { 0x1F74, 0x03B9, 0 }}, #line 103 "../../gl/unicase/special-casing-table.gperf" {"\037\274\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0391, 0x0399, 0 }, { 0x1FB3, 0, 0 }, { 0x1FBC, 0, 0 }, { 0x03B1, 0x03B9, 0 }}, #line 102 "../../gl/unicase/special-casing-table.gperf" {"\037\267\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0391, 0x0342, 0x0399 }, { 0x1FB7, 0, 0 }, { 0x0391, 0x0342, 0x0345 }, { 0x03B1, 0x0342, 0x03B9 }}, #line 101 "../../gl/unicase/special-casing-table.gperf" {"\037\266\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0391, 0x0342, 0 }, { 0x1FB6, 0, 0 }, { 0x0391, 0x0342, 0 }, { 0x03B1, 0x0342, 0 }}, #line 100 "../../gl/unicase/special-casing-table.gperf" {"\037\264\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0386, 0x0399, 0 }, { 0x1FB4, 0, 0 }, { 0x0386, 0x0345, 0 }, { 0x03AC, 0x03B9, 0 }}, #line 99 "../../gl/unicase/special-casing-table.gperf" {"\037\263\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0391, 0x0399, 0 }, { 0x1FB3, 0, 0 }, { 0x1FBC, 0, 0 }, { 0x03B1, 0x03B9, 0 }}, #line 98 "../../gl/unicase/special-casing-table.gperf" {"\037\262\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1FBA, 0x0399, 0 }, { 0x1FB2, 0, 0 }, { 0x1FBA, 0x0345, 0 }, { 0x1F70, 0x03B9, 0 }}, #line 38 "../../gl/unicase/special-casing-table.gperf" {"\003\260\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x03A5, 0x0308, 0x0301 }, { 0x03B0, 0, 0 }, { 0x03A5, 0x0308, 0x0301 }, { 0x03C5, 0x0308, 0x0301 }}, #line 97 "../../gl/unicase/special-casing-table.gperf" {"\037\257\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F6F, 0x0399, 0 }, { 0x1FA7, 0, 0 }, { 0x1FAF, 0, 0 }, { 0x1F67, 0x03B9, 0 }}, #line 96 "../../gl/unicase/special-casing-table.gperf" {"\037\256\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F6E, 0x0399, 0 }, { 0x1FA6, 0, 0 }, { 0x1FAE, 0, 0 }, { 0x1F66, 0x03B9, 0 }}, #line 95 "../../gl/unicase/special-casing-table.gperf" {"\037\255\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F6D, 0x0399, 0 }, { 0x1FA5, 0, 0 }, { 0x1FAD, 0, 0 }, { 0x1F65, 0x03B9, 0 }}, #line 94 "../../gl/unicase/special-casing-table.gperf" {"\037\254\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F6C, 0x0399, 0 }, { 0x1FA4, 0, 0 }, { 0x1FAC, 0, 0 }, { 0x1F64, 0x03B9, 0 }}, #line 93 "../../gl/unicase/special-casing-table.gperf" {"\037\253\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F6B, 0x0399, 0 }, { 0x1FA3, 0, 0 }, { 0x1FAB, 0, 0 }, { 0x1F63, 0x03B9, 0 }}, #line 92 "../../gl/unicase/special-casing-table.gperf" {"\037\252\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F6A, 0x0399, 0 }, { 0x1FA2, 0, 0 }, { 0x1FAA, 0, 0 }, { 0x1F62, 0x03B9, 0 }}, #line 91 "../../gl/unicase/special-casing-table.gperf" {"\037\251\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F69, 0x0399, 0 }, { 0x1FA1, 0, 0 }, { 0x1FA9, 0, 0 }, { 0x1F61, 0x03B9, 0 }}, #line 90 "../../gl/unicase/special-casing-table.gperf" {"\037\250\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F68, 0x0399, 0 }, { 0x1FA0, 0, 0 }, { 0x1FA8, 0, 0 }, { 0x1F60, 0x03B9, 0 }}, #line 89 "../../gl/unicase/special-casing-table.gperf" {"\037\247\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F6F, 0x0399, 0 }, { 0x1FA7, 0, 0 }, { 0x1FAF, 0, 0 }, { 0x1F67, 0x03B9, 0 }}, #line 88 "../../gl/unicase/special-casing-table.gperf" {"\037\246\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F6E, 0x0399, 0 }, { 0x1FA6, 0, 0 }, { 0x1FAE, 0, 0 }, { 0x1F66, 0x03B9, 0 }}, #line 87 "../../gl/unicase/special-casing-table.gperf" {"\037\245\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F6D, 0x0399, 0 }, { 0x1FA5, 0, 0 }, { 0x1FAD, 0, 0 }, { 0x1F65, 0x03B9, 0 }}, #line 86 "../../gl/unicase/special-casing-table.gperf" {"\037\244\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F6C, 0x0399, 0 }, { 0x1FA4, 0, 0 }, { 0x1FAC, 0, 0 }, { 0x1F64, 0x03B9, 0 }}, #line 84 "../../gl/unicase/special-casing-table.gperf" {"\037\242\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F6A, 0x0399, 0 }, { 0x1FA2, 0, 0 }, { 0x1FAA, 0, 0 }, { 0x1F62, 0x03B9, 0 }}, #line 83 "../../gl/unicase/special-casing-table.gperf" {"\037\241\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F69, 0x0399, 0 }, { 0x1FA1, 0, 0 }, { 0x1FA9, 0, 0 }, { 0x1F61, 0x03B9, 0 }}, #line 82 "../../gl/unicase/special-casing-table.gperf" {"\037\240\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F68, 0x0399, 0 }, { 0x1FA0, 0, 0 }, { 0x1FA8, 0, 0 }, { 0x1F60, 0x03B9, 0 }}, #line 81 "../../gl/unicase/special-casing-table.gperf" {"\037\237\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F2F, 0x0399, 0 }, { 0x1F97, 0, 0 }, { 0x1F9F, 0, 0 }, { 0x1F27, 0x03B9, 0 }}, #line 79 "../../gl/unicase/special-casing-table.gperf" {"\037\235\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F2D, 0x0399, 0 }, { 0x1F95, 0, 0 }, { 0x1F9D, 0, 0 }, { 0x1F25, 0x03B9, 0 }}, #line 78 "../../gl/unicase/special-casing-table.gperf" {"\037\234\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F2C, 0x0399, 0 }, { 0x1F94, 0, 0 }, { 0x1F9C, 0, 0 }, { 0x1F24, 0x03B9, 0 }}, #line 77 "../../gl/unicase/special-casing-table.gperf" {"\037\233\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F2B, 0x0399, 0 }, { 0x1F93, 0, 0 }, { 0x1F9B, 0, 0 }, { 0x1F23, 0x03B9, 0 }}, #line 71 "../../gl/unicase/special-casing-table.gperf" {"\037\225\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F2D, 0x0399, 0 }, { 0x1F95, 0, 0 }, { 0x1F9D, 0, 0 }, { 0x1F25, 0x03B9, 0 }}, #line 70 "../../gl/unicase/special-casing-table.gperf" {"\037\224\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F2C, 0x0399, 0 }, { 0x1F94, 0, 0 }, { 0x1F9C, 0, 0 }, { 0x1F24, 0x03B9, 0 }}, #line 69 "../../gl/unicase/special-casing-table.gperf" {"\037\223\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F2B, 0x0399, 0 }, { 0x1F93, 0, 0 }, { 0x1F9B, 0, 0 }, { 0x1F23, 0x03B9, 0 }}, #line 68 "../../gl/unicase/special-casing-table.gperf" {"\037\222\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F2A, 0x0399, 0 }, { 0x1F92, 0, 0 }, { 0x1F9A, 0, 0 }, { 0x1F22, 0x03B9, 0 }}, #line 67 "../../gl/unicase/special-casing-table.gperf" {"\037\221\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F29, 0x0399, 0 }, { 0x1F91, 0, 0 }, { 0x1F99, 0, 0 }, { 0x1F21, 0x03B9, 0 }}, #line 65 "../../gl/unicase/special-casing-table.gperf" {"\037\217\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F0F, 0x0399, 0 }, { 0x1F87, 0, 0 }, { 0x1F8F, 0, 0 }, { 0x1F07, 0x03B9, 0 }}, #line 64 "../../gl/unicase/special-casing-table.gperf" {"\037\216\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F0E, 0x0399, 0 }, { 0x1F86, 0, 0 }, { 0x1F8E, 0, 0 }, { 0x1F06, 0x03B9, 0 }}, #line 63 "../../gl/unicase/special-casing-table.gperf" {"\037\215\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F0D, 0x0399, 0 }, { 0x1F85, 0, 0 }, { 0x1F8D, 0, 0 }, { 0x1F05, 0x03B9, 0 }}, #line 62 "../../gl/unicase/special-casing-table.gperf" {"\037\214\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F0C, 0x0399, 0 }, { 0x1F84, 0, 0 }, { 0x1F8C, 0, 0 }, { 0x1F04, 0x03B9, 0 }}, #line 61 "../../gl/unicase/special-casing-table.gperf" {"\037\213\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F0B, 0x0399, 0 }, { 0x1F83, 0, 0 }, { 0x1F8B, 0, 0 }, { 0x1F03, 0x03B9, 0 }}, #line 60 "../../gl/unicase/special-casing-table.gperf" {"\037\212\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F0A, 0x0399, 0 }, { 0x1F82, 0, 0 }, { 0x1F8A, 0, 0 }, { 0x1F02, 0x03B9, 0 }}, #line 59 "../../gl/unicase/special-casing-table.gperf" {"\037\211\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F09, 0x0399, 0 }, { 0x1F81, 0, 0 }, { 0x1F89, 0, 0 }, { 0x1F01, 0x03B9, 0 }}, #line 58 "../../gl/unicase/special-casing-table.gperf" {"\037\210\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F08, 0x0399, 0 }, { 0x1F80, 0, 0 }, { 0x1F88, 0, 0 }, { 0x1F00, 0x03B9, 0 }}, #line 56 "../../gl/unicase/special-casing-table.gperf" {"\037\206\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F0E, 0x0399, 0 }, { 0x1F86, 0, 0 }, { 0x1F8E, 0, 0 }, { 0x1F06, 0x03B9, 0 }}, #line 55 "../../gl/unicase/special-casing-table.gperf" {"\037\205\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F0D, 0x0399, 0 }, { 0x1F85, 0, 0 }, { 0x1F8D, 0, 0 }, { 0x1F05, 0x03B9, 0 }}, #line 54 "../../gl/unicase/special-casing-table.gperf" {"\037\204\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F0C, 0x0399, 0 }, { 0x1F84, 0, 0 }, { 0x1F8C, 0, 0 }, { 0x1F04, 0x03B9, 0 }}, #line 53 "../../gl/unicase/special-casing-table.gperf" {"\037\203\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F0B, 0x0399, 0 }, { 0x1F83, 0, 0 }, { 0x1F8B, 0, 0 }, { 0x1F03, 0x03B9, 0 }}, #line 52 "../../gl/unicase/special-casing-table.gperf" {"\037\202\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F0A, 0x0399, 0 }, { 0x1F82, 0, 0 }, { 0x1F8A, 0, 0 }, { 0x1F02, 0x03B9, 0 }}, #line 51 "../../gl/unicase/special-casing-table.gperf" {"\037\201\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F09, 0x0399, 0 }, { 0x1F81, 0, 0 }, { 0x1F89, 0, 0 }, { 0x1F01, 0x03B9, 0 }}, #line 50 "../../gl/unicase/special-casing-table.gperf" {"\037\200\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F08, 0x0399, 0 }, { 0x1F80, 0, 0 }, { 0x1F88, 0, 0 }, { 0x1F00, 0x03B9, 0 }}, #line 49 "../../gl/unicase/special-casing-table.gperf" {"\037V\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x03A5, 0x0313, 0x0342 }, { 0x1F56, 0, 0 }, { 0x03A5, 0x0313, 0x0342 }, { 0x03C5, 0x0313, 0x0342 }}, #line 48 "../../gl/unicase/special-casing-table.gperf" {"\037T\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x03A5, 0x0313, 0x0301 }, { 0x1F54, 0, 0 }, { 0x03A5, 0x0313, 0x0301 }, { 0x03C5, 0x0313, 0x0301 }}, #line 47 "../../gl/unicase/special-casing-table.gperf" {"\037R\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x03A5, 0x0313, 0x0300 }, { 0x1F52, 0, 0 }, { 0x03A5, 0x0313, 0x0300 }, { 0x03C5, 0x0313, 0x0300 }}, #line 46 "../../gl/unicase/special-casing-table.gperf" {"\037P\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x03A5, 0x0313, 0 }, { 0x1F50, 0, 0 }, { 0x03A5, 0x0313, 0 }, { 0x03C5, 0x0313, 0 }}, #line 20 "../../gl/unicase/special-casing-table.gperf" {"\000J\000", 0, SCC_MORE_ABOVE , { 'l', 't' }, { 0x004A, 0, 0 }, { 0x006A, 0x0307, 0 }, { 0x004A, 0, 0 }, { 0x006A, 0, 0 }}, #line 27 "../../gl/unicase/special-casing-table.gperf" {"\001.\000", 0, SCC_MORE_ABOVE , { 'l', 't' }, { 0x012E, 0, 0 }, { 0x012F, 0x0307, 0 }, { 0x012E, 0, 0 }, { 0x012F, 0, 0 }}, #line 26 "../../gl/unicase/special-casing-table.gperf" {"\001(\000", 0, SCC_ALWAYS , { 'l', 't' }, { 0x0128, 0, 0 }, { 0x0069, 0x0307, 0x0303 }, { 0x0128, 0, 0 }, { 0x0129, 0, 0 }}, #line 136 "../../gl/unicase/special-casing-table.gperf" {"\373\027\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0544, 0x053D, 0 }, { 0xFB17, 0, 0 }, { 0x0544, 0x056D, 0 }, { 0x0574, 0x056D, 0 }}, #line 135 "../../gl/unicase/special-casing-table.gperf" {"\373\026\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x054E, 0x0546, 0 }, { 0xFB16, 0, 0 }, { 0x054E, 0x0576, 0 }, { 0x057E, 0x0576, 0 }}, #line 134 "../../gl/unicase/special-casing-table.gperf" {"\373\025\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0544, 0x053B, 0 }, { 0xFB15, 0, 0 }, { 0x0544, 0x056B, 0 }, { 0x0574, 0x056B, 0 }}, #line 133 "../../gl/unicase/special-casing-table.gperf" {"\373\024\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0544, 0x0535, 0 }, { 0xFB14, 0, 0 }, { 0x0544, 0x0565, 0 }, { 0x0574, 0x0565, 0 }}, #line 132 "../../gl/unicase/special-casing-table.gperf" {"\373\023\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0544, 0x0546, 0 }, { 0xFB13, 0, 0 }, { 0x0544, 0x0576, 0 }, { 0x0574, 0x0576, 0 }}, #line 131 "../../gl/unicase/special-casing-table.gperf" {"\373\006\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0053, 0x0054, 0 }, { 0xFB06, 0, 0 }, { 0x0053, 0x0074, 0 }, { 0x0073, 0x0074, 0 }} }; if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH) { register unsigned int key = gl_unicase_special_hash (str, len); if (key <= MAX_HASH_VALUE) if (len == lengthtable[key]) { register const char *s = wordlist[key].code; if (*str == *s && !memcmp (str + 1, s + 1, len - 1)) return &wordlist[key]; } } return 0; } pspp-1.4.1/gl/unicase/totitle.h0000644000175000017500000012533513723215640016015 0ustar00blpblp00000000000000/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ /* Simple character mapping of Unicode characters. */ /* Generated automatically by gen-uni-tables.c for Unicode 9.0.0. */ #define mapping_header_0 16 #define mapping_header_1 2 #define mapping_header_2 7 #define mapping_header_3 511 #define mapping_header_4 127 static const struct { int level1[2]; short level2[2 << 9]; int level3[37 << 7]; } u_mapping = { { 0, 512 }, { 0, 128, 256, 384, 512, 640, 768, 896, 1024, 1152, 1280, 1408, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1536, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1664, 1792, -1, 1920, 2048, 2176, 2304, -1, -1, 2432, 2560, -1, -1, -1, -1, -1, 2688, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2816, 2944, 3072, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 3200, 3328, 3456, 3584, -1, -1, -1, -1, -1, -1, 3712, 3840, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 3968, -1, -1, -1, -1, -1, -1, -1, -1, -1, 4096, 4224, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 4352, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 4480, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 4608, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 743, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, 0, -32, -32, -32, -32, -32, -32, -32, 121, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -232, 0, -1, 0, -1, 0, -1, 0, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, 0, -1, 0, -1, 0, -1, -300, 195, 0, 0, -1, 0, -1, 0, 0, -1, 0, 0, 0, -1, 0, 0, 0, 0, 0, -1, 0, 0, 97, 0, 0, 0, -1, 163, 0, 0, 0, 130, 0, 0, -1, 0, -1, 0, -1, 0, 0, -1, 0, 0, 0, 0, -1, 0, 0, -1, 0, 0, 0, -1, 0, -1, 0, 0, -1, 0, 0, 0, -1, 0, 56, 0, 0, 0, 0, 1, 0, -1, 1, 0, -1, 1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, -79, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, 1, 0, -1, 0, -1, 0, 0, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, 0, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 10815, 10815, 0, -1, 0, 0, 0, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 10783, 10780, 10782, -210, -206, 0, -205, -205, 0, -202, 0, -203, 42319, 0, 0, 0, -205, 42315, 0, -207, 0, 42280, 42308, 0, -209, -211, 42308, 10743, 42305, 0, 0, -211, 0, 10749, -213, 0, 0, -214, 0, 0, 0, 0, 0, 0, 0, 10727, 0, 0, -218, 0, 0, -218, 0, 0, 0, 42282, -218, -69, -217, -217, -71, 0, 0, 0, 0, 0, -219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 42261, 42258, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, -1, 0, 0, 0, -1, 0, 0, 0, 130, 130, 130, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -38, -37, -37, -37, 0, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -31, -32, -32, -32, -32, -32, -32, -32, -32, -32, -64, -63, -63, 0, -62, -57, 0, 0, 0, -47, -54, -8, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, -86, -80, 7, -116, 0, -96, 0, 0, -1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -80, -80, -80, -80, -80, -80, -80, -80, -80, -80, -80, -80, -80, -80, -80, -80, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, -15, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -48, -48, -48, -48, -48, -48, -48, -48, -48, -48, -48, -48, -48, -48, -48, -48, -48, -48, -48, -48, -48, -48, -48, -48, -48, -48, -48, -48, -48, -48, -48, -48, -48, -48, -48, -48, -48, -48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -8, -8, -8, -8, -8, -8, 0, 0, -6254, -6253, -6244, -6242, -6242, -6243, -6236, -6181, 35266, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35332, 0, 0, 0, 3814, 0, 0, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, 0, 0, 0, 0, -59, 0, 0, 0, 0, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 8, 8, 8, 8, 8, 8, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, 8, 8, 8, 8, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 8, 8, 8, 8, 8, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, 8, 8, 8, 8, 8, 8, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, 8, 8, 8, 8, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 8, 0, 8, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 8, 8, 8, 8, 8, 8, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, 74, 74, 86, 86, 86, 86, 100, 100, 128, 128, 112, 112, 126, 126, 0, 0, 8, 8, 8, 8, 8, 8, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, 8, 8, 8, 8, 8, 8, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, 8, 8, 8, 8, 8, 8, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, 8, 8, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -7205, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 8, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -16, -16, -16, -16, -16, -16, -16, -16, -16, -16, -16, -16, -16, -16, -16, -16, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -26, -26, -26, -26, -26, -26, -26, -26, -26, -26, -26, -26, -26, -26, -26, -26, -26, -26, -26, -26, -26, -26, -26, -26, -26, -26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -48, -48, -48, -48, -48, -48, -48, -48, -48, -48, -48, -48, -48, -48, -48, -48, -48, -48, -48, -48, -48, -48, -48, -48, -48, -48, -48, -48, -48, -48, -48, -48, -48, -48, -48, -48, -48, -48, -48, -48, -48, -48, -48, -48, -48, -48, -48, 0, 0, -1, 0, 0, 0, -10795, -10792, 0, -1, 0, -1, 0, -1, 0, 0, 0, 0, 0, 0, -1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, -1, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -7264, -7264, -7264, -7264, -7264, -7264, -7264, -7264, -7264, -7264, -7264, -7264, -7264, -7264, -7264, -7264, -7264, -7264, -7264, -7264, -7264, -7264, -7264, -7264, -7264, -7264, -7264, -7264, -7264, -7264, -7264, -7264, -7264, -7264, -7264, -7264, -7264, -7264, 0, -7264, 0, 0, 0, 0, 0, -7264, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, 0, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, -1, 0, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, 0, 0, 0, -1, 0, 0, 0, 0, -1, 0, -1, 0, 0, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -928, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -40, -40, -40, -40, -40, -40, -40, -40, -40, -40, -40, -40, -40, -40, -40, -40, -40, -40, -40, -40, -40, -40, -40, -40, -40, -40, -40, -40, -40, -40, -40, -40, -40, -40, -40, -40, -40, -40, -40, -40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -40, -40, -40, -40, -40, -40, -40, -40, -40, -40, -40, -40, -40, -40, -40, -40, -40, -40, -40, -40, -40, -40, -40, -40, -40, -40, -40, -40, -40, -40, -40, -40, -40, -40, -40, -40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -64, -64, -64, -64, -64, -64, -64, -64, -64, -64, -64, -64, -64, -64, -64, -64, -64, -64, -64, -64, -64, -64, -64, -64, -64, -64, -64, -64, -64, -64, -64, -64, -64, -64, -64, -64, -64, -64, -64, -64, -64, -64, -64, -64, -64, -64, -64, -64, -64, -64, -64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -34, -34, -34, -34, -34, -34, -34, -34, -34, -34, -34, -34, -34, -34, -34, -34, -34, -34, -34, -34, -34, -34, -34, -34, -34, -34, -34, -34, -34, -34, -34, -34, -34, -34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }; pspp-1.4.1/gl/unicase/u8-toupper.c0000644000175000017500000000574713723215640016360 0ustar00blpblp00000000000000/* Uppercase mapping for UTF-8 strings (locale dependent). Copyright (C) 2009-2020 Free Software Foundation, Inc. Written by Bruno Haible , 2009. 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 3 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, see . */ #include /* Specification. */ #include "unicase.h" #include #include "unicase/unicasemap.h" #include "unicase/special-casing.h" uint8_t * u8_toupper (const uint8_t *s, size_t n, const char *iso639_language, uninorm_t nf, uint8_t *resultbuf, size_t *lengthp) { return u8_casemap (s, n, unicase_empty_prefix_context, unicase_empty_suffix_context, iso639_language, uc_toupper, offsetof (struct special_casing_rule, upper[0]), nf, resultbuf, lengthp); } #ifdef TEST #include #include #include #include /* Read the contents of an input stream, and return it, terminated with a NUL byte. */ char * read_file (FILE *stream) { #define BUFSIZE 4096 char *buf = NULL; int alloc = 0; int size = 0; int count; while (! feof (stream)) { if (size + BUFSIZE > alloc) { alloc = alloc + alloc / 2; if (alloc < size + BUFSIZE) alloc = size + BUFSIZE; buf = realloc (buf, alloc); if (buf == NULL) { fprintf (stderr, "out of memory\n"); exit (1); } } count = fread (buf + size, 1, BUFSIZE, stream); if (count == 0) { if (ferror (stream)) { perror ("fread"); exit (1); } } else size += count; } buf = realloc (buf, size + 1); if (buf == NULL) { fprintf (stderr, "out of memory\n"); exit (1); } buf[size] = '\0'; return buf; #undef BUFSIZE } int main (int argc, char * argv[]) { setlocale (LC_ALL, ""); if (argc == 1) { /* Display the upper case of the input string. */ char *input = read_file (stdin); int length = strlen (input); size_t output_length; uint8_t *output = u8_toupper ((uint8_t *) input, length, uc_locale_language (), NULL, NULL, &output_length); fwrite (output, 1, output_length, stdout); return 0; } else return 1; } #endif /* TEST */ pspp-1.4.1/gl/unicase/u-casefold.h0000644000175000017500000000223513723215640016344 0ustar00blpblp00000000000000/* Casefolding mapping for Unicode strings (locale dependent). Copyright (C) 2009-2020 Free Software Foundation, Inc. Written by Bruno Haible , 2009. 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 3 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, see . */ UNIT * FUNC (const UNIT *s, size_t n, const char *iso639_language, uninorm_t nf, UNIT *resultbuf, size_t *lengthp) { return U_CT_CASEFOLD (s, n, unicase_empty_prefix_context, unicase_empty_suffix_context, iso639_language, nf, resultbuf, lengthp); } pspp-1.4.1/gl/unicase/caseprop.h0000644000175000017500000000253513723215640016141 0ustar00blpblp00000000000000/* Case related properties of Unicode characters. Copyright (C) 2009-2020 Free Software Foundation, Inc. Written by Bruno Haible , 2009. 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 3 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, see . */ #include #include "unitypes.h" /* Determine whether a character is "cased" according to the Unicode Standard, , section 3.13, definition D120. */ extern bool uc_is_cased (ucs4_t uc) _UC_ATTRIBUTE_CONST; /* Determine whether a character is "case-ignorable" according to the Unicode Standard, , section 3.13, definition D121. */ extern bool uc_is_case_ignorable (ucs4_t uc) _UC_ATTRIBUTE_CONST; pspp-1.4.1/gl/unicase/casefold.h0000644000175000017500000000163713723215640016107 0ustar00blpblp00000000000000/* Casefolding of Unicode characters. Copyright (C) 2009-2020 Free Software Foundation, Inc. Written by Bruno Haible , 2009. 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 3 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, see . */ #include "unitypes.h" /* Return the casefold mapping of a Unicode character. */ extern ucs4_t uc_tocasefold (ucs4_t uc); pspp-1.4.1/gl/unicase/toupper.h0000644000175000017500000012533513723215640016027 0ustar00blpblp00000000000000/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ /* Simple character mapping of Unicode characters. */ /* Generated automatically by gen-uni-tables.c for Unicode 9.0.0. */ #define mapping_header_0 16 #define mapping_header_1 2 #define mapping_header_2 7 #define mapping_header_3 511 #define mapping_header_4 127 static const struct { int level1[2]; short level2[2 << 9]; int level3[37 << 7]; } u_mapping = { { 0, 512 }, { 0, 128, 256, 384, 512, 640, 768, 896, 1024, 1152, 1280, 1408, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1536, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1664, 1792, -1, 1920, 2048, 2176, 2304, -1, -1, 2432, 2560, -1, -1, -1, -1, -1, 2688, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2816, 2944, 3072, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 3200, 3328, 3456, 3584, -1, -1, -1, -1, -1, -1, 3712, 3840, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 3968, -1, -1, -1, -1, -1, -1, -1, -1, -1, 4096, 4224, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 4352, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 4480, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 4608, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 743, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, 0, -32, -32, -32, -32, -32, -32, -32, 121, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -232, 0, -1, 0, -1, 0, -1, 0, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, 0, -1, 0, -1, 0, -1, -300, 195, 0, 0, -1, 0, -1, 0, 0, -1, 0, 0, 0, -1, 0, 0, 0, 0, 0, -1, 0, 0, 97, 0, 0, 0, -1, 163, 0, 0, 0, 130, 0, 0, -1, 0, -1, 0, -1, 0, 0, -1, 0, 0, 0, 0, -1, 0, 0, -1, 0, 0, 0, -1, 0, -1, 0, 0, -1, 0, 0, 0, -1, 0, 56, 0, 0, 0, 0, 0, -1, -2, 0, -1, -2, 0, -1, -2, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, -79, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, 0, -1, -2, 0, -1, 0, 0, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, 0, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 10815, 10815, 0, -1, 0, 0, 0, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 10783, 10780, 10782, -210, -206, 0, -205, -205, 0, -202, 0, -203, 42319, 0, 0, 0, -205, 42315, 0, -207, 0, 42280, 42308, 0, -209, -211, 42308, 10743, 42305, 0, 0, -211, 0, 10749, -213, 0, 0, -214, 0, 0, 0, 0, 0, 0, 0, 10727, 0, 0, -218, 0, 0, -218, 0, 0, 0, 42282, -218, -69, -217, -217, -71, 0, 0, 0, 0, 0, -219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 42261, 42258, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, -1, 0, 0, 0, -1, 0, 0, 0, 130, 130, 130, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -38, -37, -37, -37, 0, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -31, -32, -32, -32, -32, -32, -32, -32, -32, -32, -64, -63, -63, 0, -62, -57, 0, 0, 0, -47, -54, -8, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, -86, -80, 7, -116, 0, -96, 0, 0, -1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -80, -80, -80, -80, -80, -80, -80, -80, -80, -80, -80, -80, -80, -80, -80, -80, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, -15, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -48, -48, -48, -48, -48, -48, -48, -48, -48, -48, -48, -48, -48, -48, -48, -48, -48, -48, -48, -48, -48, -48, -48, -48, -48, -48, -48, -48, -48, -48, -48, -48, -48, -48, -48, -48, -48, -48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -8, -8, -8, -8, -8, -8, 0, 0, -6254, -6253, -6244, -6242, -6242, -6243, -6236, -6181, 35266, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35332, 0, 0, 0, 3814, 0, 0, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, 0, 0, 0, 0, -59, 0, 0, 0, 0, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 8, 8, 8, 8, 8, 8, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, 8, 8, 8, 8, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 8, 8, 8, 8, 8, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, 8, 8, 8, 8, 8, 8, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, 8, 8, 8, 8, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 8, 0, 8, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 8, 8, 8, 8, 8, 8, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, 74, 74, 86, 86, 86, 86, 100, 100, 128, 128, 112, 112, 126, 126, 0, 0, 8, 8, 8, 8, 8, 8, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, 8, 8, 8, 8, 8, 8, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, 8, 8, 8, 8, 8, 8, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, 8, 8, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -7205, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 8, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -16, -16, -16, -16, -16, -16, -16, -16, -16, -16, -16, -16, -16, -16, -16, -16, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -26, -26, -26, -26, -26, -26, -26, -26, -26, -26, -26, -26, -26, -26, -26, -26, -26, -26, -26, -26, -26, -26, -26, -26, -26, -26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -48, -48, -48, -48, -48, -48, -48, -48, -48, -48, -48, -48, -48, -48, -48, -48, -48, -48, -48, -48, -48, -48, -48, -48, -48, -48, -48, -48, -48, -48, -48, -48, -48, -48, -48, -48, -48, -48, -48, -48, -48, -48, -48, -48, -48, -48, -48, 0, 0, -1, 0, 0, 0, -10795, -10792, 0, -1, 0, -1, 0, -1, 0, 0, 0, 0, 0, 0, -1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, -1, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -7264, -7264, -7264, -7264, -7264, -7264, -7264, -7264, -7264, -7264, -7264, -7264, -7264, -7264, -7264, -7264, -7264, -7264, -7264, -7264, -7264, -7264, -7264, -7264, -7264, -7264, -7264, -7264, -7264, -7264, -7264, -7264, -7264, -7264, -7264, -7264, -7264, -7264, 0, -7264, 0, 0, 0, 0, 0, -7264, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, 0, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, -1, 0, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, 0, 0, 0, -1, 0, 0, 0, 0, -1, 0, -1, 0, 0, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -928, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, -38864, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -40, -40, -40, -40, -40, -40, -40, -40, -40, -40, -40, -40, -40, -40, -40, -40, -40, -40, -40, -40, -40, -40, -40, -40, -40, -40, -40, -40, -40, -40, -40, -40, -40, -40, -40, -40, -40, -40, -40, -40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -40, -40, -40, -40, -40, -40, -40, -40, -40, -40, -40, -40, -40, -40, -40, -40, -40, -40, -40, -40, -40, -40, -40, -40, -40, -40, -40, -40, -40, -40, -40, -40, -40, -40, -40, -40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -64, -64, -64, -64, -64, -64, -64, -64, -64, -64, -64, -64, -64, -64, -64, -64, -64, -64, -64, -64, -64, -64, -64, -64, -64, -64, -64, -64, -64, -64, -64, -64, -64, -64, -64, -64, -64, -64, -64, -64, -64, -64, -64, -64, -64, -64, -64, -64, -64, -64, -64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -34, -34, -34, -34, -34, -34, -34, -34, -34, -34, -34, -34, -34, -34, -34, -34, -34, -34, -34, -34, -34, -34, -34, -34, -34, -34, -34, -34, -34, -34, -34, -34, -34, -34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }; pspp-1.4.1/gl/unicase/tolower.c0000644000175000017500000000177313723215640016016 0ustar00blpblp00000000000000/* Lowercase mapping for Unicode characters (locale and context independent). Copyright (C) 2002, 2006, 2009-2020 Free Software Foundation, Inc. Written by Bruno Haible , 2009. 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 3 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, see . */ #include /* Specification. */ #include "unicase.h" /* Define u_mapping table. */ #include "tolower.h" #define FUNC uc_tolower #include "simple-mapping.h" pspp-1.4.1/gl/unicase/special-casing.c0000644000175000017500000000163713723215640017204 0ustar00blpblp00000000000000/* Special casing table. Copyright (C) 2009-2020 Free Software Foundation, Inc. Written by Bruno Haible , 2009. 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 3 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, see . */ #include /* Specification. */ #include "unicase/special-casing.h" #include #include "unicase/special-casing-table.h" pspp-1.4.1/gl/unicase/simple-mapping.h0000644000175000017500000000256413723215640017251 0ustar00blpblp00000000000000/* Simple case mapping for Unicode characters. Copyright (C) 2002, 2006, 2009-2020 Free Software Foundation, Inc. Written by Bruno Haible , 2009. 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 3 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, see . */ ucs4_t FUNC (ucs4_t uc) { unsigned int index1 = uc >> mapping_header_0; if (index1 < mapping_header_1) { int lookup1 = u_mapping.level1[index1]; if (lookup1 >= 0) { unsigned int index2 = (uc >> mapping_header_2) & mapping_header_3; int lookup2 = u_mapping.level2[lookup1 + index2]; if (lookup2 >= 0) { unsigned int index3 = (uc & mapping_header_4); int lookup3 = u_mapping.level3[lookup2 + index3]; return uc + lookup3; } } } return uc; } pspp-1.4.1/gl/unicase/u-ct-casefold.h0000644000175000017500000000752113723215640016753 0ustar00blpblp00000000000000/* Casefolding mapping for Unicode substrings (locale dependent). Copyright (C) 2009-2020 Free Software Foundation, Inc. Written by Bruno Haible , 2009. 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 3 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, see . */ UNIT * FUNC (const UNIT *s, size_t n, casing_prefix_context_t prefix_context, casing_suffix_context_t suffix_context, const char *iso639_language, uninorm_t nf, UNIT *resultbuf, size_t *lengthp) { /* Implement the three definitions of caseless matching, as described in Unicode 5.0, section "Default caseless matching": - If no normalization is requested, simply apply the casefolding. X -> toCasefold(X). - If canonical normalization is requested, apply it, and apply an NFD before. X -> NFD(toCasefold(NFD(X))). - If compatibility normalization is requested, apply it twice, apply the normalization after each, and apply an NFD before: X -> NFKD(toCasefold(NFKD(toCasefold(NFD(X))))). */ if (nf == NULL) /* X -> toCasefold(X) */ return U_CASEMAP (s, n, prefix_context, suffix_context, iso639_language, uc_tocasefold, offsetof (struct special_casing_rule, casefold[0]), NULL, resultbuf, lengthp); else { uninorm_t nfd = uninorm_decomposing_form (nf); /* X -> nf(toCasefold(NFD(X))) or X -> nf(toCasefold(nfd(toCasefold(NFD(X))))) */ int repeat = (uninorm_is_compat_decomposing (nf) ? 2 : 1); UNIT tmpbuf1[2048 / sizeof (UNIT)]; UNIT tmpbuf2[2048 / sizeof (UNIT)]; UNIT *tmp1; size_t tmp1_length; UNIT *tmp2; size_t tmp2_length; tmp1_length = sizeof (tmpbuf1) / sizeof (UNIT); tmp1 = U_NORMALIZE (UNINORM_NFD, s, n, tmpbuf1, &tmp1_length); if (tmp1 == NULL) /* errno is set here. */ return NULL; do { tmp2_length = sizeof (tmpbuf2) / sizeof (UNIT); tmp2 = U_CASEMAP (tmp1, tmp1_length, prefix_context, suffix_context, iso639_language, uc_tocasefold, offsetof (struct special_casing_rule, casefold[0]), NULL, tmpbuf2, &tmp2_length); if (tmp2 == NULL) { int saved_errno = errno; if (tmp1 != tmpbuf1) free (tmp1); errno = saved_errno; return NULL; } if (tmp1 != tmpbuf1) free (tmp1); if (repeat > 1) { tmp1_length = sizeof (tmpbuf1) / sizeof (UNIT); tmp1 = U_NORMALIZE (nfd, tmp2, tmp2_length, tmpbuf1, &tmp1_length); } else /* Last run through this loop. */ tmp1 = U_NORMALIZE (nf, tmp2, tmp2_length, resultbuf, lengthp); if (tmp1 == NULL) { int saved_errno = errno; if (tmp2 != tmpbuf2) free (tmp2); errno = saved_errno; return NULL; } if (tmp2 != tmpbuf2) free (tmp2); } while (--repeat > 0); return tmp1; } } pspp-1.4.1/gl/unicase/empty-suffix-context.c0000644000175000017500000000175513723215640020445 0ustar00blpblp00000000000000/* Case-mapping context of empty suffix string. Copyright (C) 2009-2020 Free Software Foundation, Inc. Written by Bruno Haible , 2009. 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 3 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, see . */ #include /* Specification. */ #include "unicase.h" const casing_suffix_context_t unicase_empty_suffix_context = { 0xFFFD /* first_char_except_ignorable */, 0 /* bits */ }; pspp-1.4.1/gl/unicase/u8-casemap.c0000644000175000017500000000240313723215640016255 0ustar00blpblp00000000000000/* Case mapping for UTF-8 strings (locale dependent). Copyright (C) 2009-2020 Free Software Foundation, Inc. Written by Bruno Haible , 2009. 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 3 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, see . */ #include /* Specification. */ #include "unicasemap.h" #include #include #include #include "unistr.h" #include "unictype.h" #include "uninorm.h" #include "unicase/caseprop.h" #include "context.h" #include "unicase/special-casing.h" #define FUNC u8_casemap #define UNIT uint8_t #define U_MBTOUC_UNSAFE u8_mbtouc_unsafe #define U_UCTOMB u8_uctomb #define U_CPY u8_cpy #define U_NORMALIZE u8_normalize #include "u-casemap.h" pspp-1.4.1/gl/unicase/empty-prefix-context.c0000644000175000017500000000200613723215640020424 0ustar00blpblp00000000000000/* Case-mapping context of empty prefix string. Copyright (C) 2009-2020 Free Software Foundation, Inc. Written by Bruno Haible , 2009. 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 3 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, see . */ #include /* Specification. */ #include "unicase.h" const casing_prefix_context_t unicase_empty_prefix_context = { 0xFFFD /* last_char_except_ignorable */, 0xFFFD /* last_char_normal_or_above */ }; pspp-1.4.1/gl/unicase/special-casing.in.h0000644000175000017500000000375013723215640017614 0ustar00blpblp00000000000000/* Special casing table. Copyright (C) 2009-2020 Free Software Foundation, Inc. Written by Bruno Haible , 2009. 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 3 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, see . */ #include /* A special casing context. A context is negated through x -> -x. */ enum { SCC_ALWAYS = 0, SCC_FINAL_SIGMA = 1, SCC_AFTER_SOFT_DOTTED = 2, SCC_MORE_ABOVE = 3, SCC_BEFORE_DOT = 4, SCC_AFTER_I = 5 }; struct special_casing_rule { /* The first two bytes are the code, in big-endian order. The third byte only distinguishes different rules pertaining to the same code. */ /*unsigned*/ char code[3]; /* True when this rule is not the last one for the given code. */ /*bool*/ unsigned int has_next : 1; /* Context. */ signed int context : 7; /* Language, or an empty string. */ char language[2]; /* Mapping to upper case. Between 0 and 3 characters. Filled with 0s. */ unsigned short upper[3]; /* Mapping to lower case. Between 0 and 3 characters. Filled with 0s. */ unsigned short lower[3]; /* Mapping to title case. Between 0 and 3 characters. Filled with 0s. */ unsigned short title[3]; /* Casefolding mapping. Between 0 and 3 characters. Filled with 0s. */ unsigned short casefold[3]; }; extern const struct special_casing_rule * gl_unicase_special_lookup (const char *str, size_t len); pspp-1.4.1/gl/unicase/u8-ct-casefold.c0000644000175000017500000000224113723215640017030 0ustar00blpblp00000000000000/* Casefolding mapping for UTF-8 substrings (locale dependent). Copyright (C) 2009-2020 Free Software Foundation, Inc. Written by Bruno Haible , 2009. 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 3 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, see . */ #include /* Specification. */ #include "unicase.h" #include #include #include #include "unicase/unicasemap.h" #include "unicase/special-casing.h" #include "unicase/casefold.h" #define FUNC u8_ct_casefold #define UNIT uint8_t #define U_CASEMAP u8_casemap #define U_NORMALIZE u8_normalize #include "u-ct-casefold.h" pspp-1.4.1/gl/unicase/context.h0000644000175000017500000000535013723215640016007 0ustar00blpblp00000000000000/* Case-mapping contexts of UTF-8/UTF-16/UTF-32 substring. Copyright (C) 2009-2020 Free Software Foundation, Inc. Written by Bruno Haible , 2009. 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 3 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, see . */ /* The context of a prefix string combines the information of the "Before C" conditions of the Unicode Standard, , section 3.13, table 3-14 "Context Specification for Casing". casing_prefix_context_t contains the following fields: // Helper for evaluating the FINAL_SIGMA condition: // Last character that was not case-ignorable. ucs4_t last_char_except_ignorable; // Helper for evaluating the AFTER_SOFT_DOTTED and AFTER_I conditions: // Last character that was of combining class 230 ("Above") or 0. ucs4_t last_char_normal_or_above; Three bits would be sufficient to carry the context information, but that would require to invoke uc_is_cased and uc_is_property_soft_dotted ahead of time, more often than actually needed. */ /* The context of a suffix string combines the information of the "After C" conditions of the Unicode Standard, , section 3.13, table 3-14 "Context Specification for Casing". casing_suffix_context_t contains the following fields: // For evaluating the FINAL_SIGMA condition: // First character that was not case-ignorable. ucs4_t first_char_except_ignorable; // For evaluating the MORE_ABOVE condition: // Bit 0 is set if the suffix contains a character of combining class // 230 (Above) with no character of combining class 0 or 230 (Above) // before it. // // For evaluating the BEFORE_DOT condition: // Bit 1 is set if the suffix contains a COMBINING DOT ABOVE (U+0307) // with no character of combining class 0 or 230 (Above) before it. // uint32_t bits; Three bits would be sufficient to carry the context information, but that would require to invoke uc_is_cased ahead of time, more often than actually needed. */ #define SCC_MORE_ABOVE_MASK 1 #define SCC_BEFORE_DOT_MASK 2 pspp-1.4.1/gl/unicase/totitle.c0000644000175000017500000000177313723215640016007 0ustar00blpblp00000000000000/* Titlecase mapping for Unicode characters (locale and context independent). Copyright (C) 2002, 2006, 2009-2020 Free Software Foundation, Inc. Written by Bruno Haible , 2009. 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 3 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, see . */ #include /* Specification. */ #include "unicase.h" /* Define u_mapping table. */ #include "totitle.h" #define FUNC uc_totitle #include "simple-mapping.h" pspp-1.4.1/gl/unicase/u-totitle.h0000644000175000017500000000224213723215640016246 0ustar00blpblp00000000000000/* Titlecase mapping for UTF-8/UTF-16/UTF-32 strings (locale dependent). Copyright (C) 2009-2020 Free Software Foundation, Inc. Written by Bruno Haible , 2009. 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 3 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, see . */ UNIT * FUNC (const UNIT *s, size_t n, const char *iso639_language, uninorm_t nf, UNIT *resultbuf, size_t *lengthp) { return U_CT_TOTITLE (s, n, unicase_empty_prefix_context, unicase_empty_suffix_context, iso639_language, nf, resultbuf, lengthp); } pspp-1.4.1/gl/unicase/tocasefold.c0000644000175000017500000000200113723215640016427 0ustar00blpblp00000000000000/* Casefold mapping for Unicode characters (locale and context independent). Copyright (C) 2002, 2006, 2009-2020 Free Software Foundation, Inc. Written by Bruno Haible , 2009. 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 3 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, see . */ #include /* Specification. */ #include "casefold.h" /* Define u_mapping table. */ #include "tocasefold.h" #define FUNC uc_tocasefold #include "simple-mapping.h" pspp-1.4.1/gl/unicase/u8-casefold.c0000644000175000017500000000506013723215640016426 0ustar00blpblp00000000000000/* Casefolding mapping for UTF-8 strings (locale dependent). Copyright (C) 2009-2020 Free Software Foundation, Inc. Written by Bruno Haible , 2009. 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 3 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, see . */ #include /* Specification. */ #include "unicase.h" #define FUNC u8_casefold #define UNIT uint8_t #define U_CT_CASEFOLD u8_ct_casefold #include "u-casefold.h" #ifdef TEST #include #include #include #include /* Read the contents of an input stream, and return it, terminated with a NUL byte. */ char * read_file (FILE *stream) { #define BUFSIZE 4096 char *buf = NULL; int alloc = 0; int size = 0; int count; while (! feof (stream)) { if (size + BUFSIZE > alloc) { alloc = alloc + alloc / 2; if (alloc < size + BUFSIZE) alloc = size + BUFSIZE; buf = realloc (buf, alloc); if (buf == NULL) { fprintf (stderr, "out of memory\n"); exit (1); } } count = fread (buf + size, 1, BUFSIZE, stream); if (count == 0) { if (ferror (stream)) { perror ("fread"); exit (1); } } else size += count; } buf = realloc (buf, size + 1); if (buf == NULL) { fprintf (stderr, "out of memory\n"); exit (1); } buf[size] = '\0'; return buf; #undef BUFSIZE } int main (int argc, char * argv[]) { setlocale (LC_ALL, ""); if (argc == 1) { /* Display the case folded input string. */ char *input = read_file (stdin); int length = strlen (input); size_t output_length; uint8_t *output = u8_casefold ((uint8_t *) input, length, uc_locale_language (), NULL, NULL, &output_length); fwrite (output, 1, output_length, stdout); return 0; } else return 1; } #endif /* TEST */ pspp-1.4.1/gl/unicase/toupper.c0000644000175000017500000000177313723215640016021 0ustar00blpblp00000000000000/* Uppercase mapping for Unicode characters (locale and context independent). Copyright (C) 2002, 2006, 2009-2020 Free Software Foundation, Inc. Written by Bruno Haible , 2009. 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 3 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, see . */ #include /* Specification. */ #include "unicase.h" /* Define u_mapping table. */ #include "toupper.h" #define FUNC uc_toupper #include "simple-mapping.h" pspp-1.4.1/gl/unicase/u8-casecmp.c0000644000175000017500000000216413723215640016263 0ustar00blpblp00000000000000/* Case and normalization insensitive comparison of UTF-8 strings. Copyright (C) 2009-2020 Free Software Foundation, Inc. Written by Bruno Haible , 2009. 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 3 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, see . */ #include /* Specification. */ #include "unicase.h" #include #include #include "minmax.h" #include "uninorm.h" #include "unistr.h" #define FUNC u8_casecmp #define UNIT uint8_t #define SRC_UNIT uint8_t #define U_CASEFOLD u8_casefold #define U_CMP2 u8_cmp2 #include "u-casecmp.h" pspp-1.4.1/gl/unicase/u-casemap.h0000644000175000017500000003615213723215640016202 0ustar00blpblp00000000000000/* Case mapping for UTF-8/UTF-16/UTF-32 strings (locale dependent). Copyright (C) 2009-2020 Free Software Foundation, Inc. Written by Bruno Haible , 2009. 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 3 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, see . */ UNIT * FUNC (const UNIT *s, size_t n, casing_prefix_context_t prefix_context, casing_suffix_context_t suffix_context, const char *iso639_language, ucs4_t (*single_character_map) (ucs4_t), size_t offset_in_rule, /* offset in 'struct special_casing_rule' */ uninorm_t nf, UNIT *resultbuf, size_t *lengthp) { /* The result being accumulated. */ UNIT *result; size_t length; size_t allocated; /* Initialize the accumulator. */ if (nf != NULL || resultbuf == NULL) { result = NULL; allocated = 0; } else { result = resultbuf; allocated = *lengthp; } length = 0; { const UNIT *s_end = s + n; /* Helper for evaluating the FINAL_SIGMA condition: Last character that was not case-ignorable. */ ucs4_t last_char_except_ignorable = prefix_context.last_char_except_ignorable; /* Helper for evaluating the AFTER_SOFT_DOTTED and AFTER_I conditions: Last character that was of combining class 230 ("Above") or 0. */ ucs4_t last_char_normal_or_above = prefix_context.last_char_normal_or_above; while (s < s_end) { ucs4_t uc; int count = U_MBTOUC_UNSAFE (&uc, s, s_end - s); ucs4_t mapped_uc[3]; unsigned int mapped_count; if (uc < 0x10000) { /* Look first in the special-casing table. */ char code[3]; code[0] = (uc >> 8) & 0xff; code[1] = uc & 0xff; for (code[2] = 0; ; code[2]++) { const struct special_casing_rule *rule = gl_unicase_special_lookup (code, 3); if (rule == NULL) break; /* Test if the condition applies. */ /* Does the language apply? */ if (rule->language[0] == '\0' || (iso639_language != NULL && iso639_language[0] == rule->language[0] && iso639_language[1] == rule->language[1])) { /* Does the context apply? */ int context = rule->context; bool applies; if (context < 0) context = - context; switch (context) { case SCC_ALWAYS: applies = true; break; case SCC_FINAL_SIGMA: /* "Before" condition: preceded by a sequence consisting of a cased letter and a case-ignorable sequence. "After" condition: not followed by a sequence consisting of a case-ignorable sequence and then a cased letter. */ /* Test the "before" condition. */ applies = uc_is_cased (last_char_except_ignorable); /* Test the "after" condition. */ if (applies) { const UNIT *s2 = s + count; for (;;) { if (s2 < s_end) { ucs4_t uc2; int count2 = U_MBTOUC_UNSAFE (&uc2, s2, s_end - s2); /* Our uc_is_case_ignorable function is known to return false for all cased characters. So we can call uc_is_case_ignorable first. */ if (!uc_is_case_ignorable (uc2)) { applies = ! uc_is_cased (uc2); break; } s2 += count2; } else { applies = ! uc_is_cased (suffix_context.first_char_except_ignorable); break; } } } break; case SCC_AFTER_SOFT_DOTTED: /* "Before" condition: There is a Soft_Dotted character before it, with no intervening character of combining class 0 or 230 (Above). */ /* Test the "before" condition. */ applies = uc_is_property_soft_dotted (last_char_normal_or_above); break; case SCC_MORE_ABOVE: /* "After" condition: followed by a character of combining class 230 (Above) with no intervening character of combining class 0 or 230 (Above). */ /* Test the "after" condition. */ { const UNIT *s2 = s + count; applies = false; for (;;) { if (s2 < s_end) { ucs4_t uc2; int count2 = U_MBTOUC_UNSAFE (&uc2, s2, s_end - s2); int ccc = uc_combining_class (uc2); if (ccc == UC_CCC_A) { applies = true; break; } if (ccc == UC_CCC_NR) break; s2 += count2; } else { applies = ((suffix_context.bits & SCC_MORE_ABOVE_MASK) != 0); break; } } } break; case SCC_BEFORE_DOT: /* "After" condition: followed by COMBINING DOT ABOVE (U+0307). Any sequence of characters with a combining class that is neither 0 nor 230 may intervene between the current character and the combining dot above. */ /* Test the "after" condition. */ { const UNIT *s2 = s + count; applies = false; for (;;) { if (s2 < s_end) { ucs4_t uc2; int count2 = U_MBTOUC_UNSAFE (&uc2, s2, s_end - s2); if (uc2 == 0x0307) /* COMBINING DOT ABOVE */ { applies = true; break; } { int ccc = uc_combining_class (uc2); if (ccc == UC_CCC_A || ccc == UC_CCC_NR) break; } s2 += count2; } else { applies = ((suffix_context.bits & SCC_BEFORE_DOT_MASK) != 0); break; } } } break; case SCC_AFTER_I: /* "Before" condition: There is an uppercase I before it, and there is no intervening character of combining class 0 or 230 (Above). */ /* Test the "before" condition. */ applies = (last_char_normal_or_above == 'I'); break; default: abort (); } if (rule->context < 0) applies = !applies; if (applies) { /* The rule applies. Look up the mapping (0 to 3 characters). */ const unsigned short *mapped_in_rule = (const unsigned short *)((const char *)rule + offset_in_rule); if (mapped_in_rule[0] == 0) mapped_count = 0; else { mapped_uc[0] = mapped_in_rule[0]; if (mapped_in_rule[1] == 0) mapped_count = 1; else { mapped_uc[1] = mapped_in_rule[1]; if (mapped_in_rule[2] == 0) mapped_count = 2; else { mapped_uc[2] = mapped_in_rule[2]; mapped_count = 3; } } } goto found_mapping; } } /* Optimization: Save a hash table lookup in the next round. */ if (!rule->has_next) break; } } /* No special-cased mapping. So use the locale and context independent mapping. */ mapped_uc[0] = single_character_map (uc); mapped_count = 1; found_mapping: /* Found the mapping: uc maps to mapped_uc[0..mapped_count-1]. */ { unsigned int i; for (i = 0; i < mapped_count; i++) { ucs4_t muc = mapped_uc[i]; /* Append muc to the result accumulator. */ if (length < allocated) { int ret = U_UCTOMB (result + length, muc, allocated - length); if (ret == -1) { errno = EINVAL; goto fail; } if (ret >= 0) { length += ret; goto done_appending; } } { size_t old_allocated = allocated; size_t new_allocated = 2 * old_allocated; if (new_allocated < 64) new_allocated = 64; if (new_allocated < old_allocated) /* integer overflow? */ abort (); { UNIT *larger_result; if (result == NULL) { larger_result = (UNIT *) malloc (new_allocated * sizeof (UNIT)); if (larger_result == NULL) { errno = ENOMEM; goto fail; } } else if (result == resultbuf) { larger_result = (UNIT *) malloc (new_allocated * sizeof (UNIT)); if (larger_result == NULL) { errno = ENOMEM; goto fail; } U_CPY (larger_result, resultbuf, length); } else { larger_result = (UNIT *) realloc (result, new_allocated * sizeof (UNIT)); if (larger_result == NULL) { errno = ENOMEM; goto fail; } } result = larger_result; allocated = new_allocated; { int ret = U_UCTOMB (result + length, muc, allocated - length); if (ret == -1) { errno = EINVAL; goto fail; } if (ret < 0) abort (); length += ret; goto done_appending; } } } done_appending: ; } } if (!uc_is_case_ignorable (uc)) last_char_except_ignorable = uc; { int ccc = uc_combining_class (uc); if (ccc == UC_CCC_A || ccc == UC_CCC_NR) last_char_normal_or_above = uc; } s += count; } } if (nf != NULL) { /* Finally, normalize the result. */ UNIT *normalized_result; normalized_result = U_NORMALIZE (nf, result, length, resultbuf, lengthp); if (normalized_result == NULL) goto fail; free (result); return normalized_result; } if (length == 0) { if (result == NULL) { /* Return a non-NULL value. NULL means error. */ result = (UNIT *) malloc (1); if (result == NULL) { errno = ENOMEM; goto fail; } } } else if (result != resultbuf && length < allocated) { /* Shrink the allocated memory if possible. */ UNIT *memory; memory = (UNIT *) realloc (result, length * sizeof (UNIT)); if (memory != NULL) result = memory; } *lengthp = length; return result; fail: if (result != resultbuf) { int saved_errno = errno; free (result); errno = saved_errno; } return NULL; } pspp-1.4.1/gl/unicase/u8-ct-totitle.c0000644000175000017500000000253213723215640016737 0ustar00blpblp00000000000000/* Titlecase mapping for UTF-8 substrings (locale dependent). Copyright (C) 2009-2020 Free Software Foundation, Inc. Written by Bruno Haible , 2009. 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 3 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, see . */ #include /* Specification. */ #include "unicase.h" #include #include #include #include #include "unistr.h" #include "unictype.h" #include "uniwbrk.h" #include "uninorm.h" #include "unicase/caseprop.h" #include "context.h" #include "unicase/special-casing.h" #define FUNC u8_ct_totitle #define UNIT uint8_t #define U_WORDBREAKS u8_wordbreaks #define U_MBTOUC_UNSAFE u8_mbtouc_unsafe #define U_UCTOMB u8_uctomb #define U_CPY u8_cpy #define U_NORMALIZE u8_normalize #include "u-ct-totitle.h" pspp-1.4.1/gl/unicase/u8-totitle.c0000644000175000017500000000505713723215640016340 0ustar00blpblp00000000000000/* Titlecase mapping for UTF-8 strings (locale dependent). Copyright (C) 2009-2020 Free Software Foundation, Inc. Written by Bruno Haible , 2009. 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 3 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, see . */ #include /* Specification. */ #include "unicase.h" #define FUNC u8_totitle #define UNIT uint8_t #define U_CT_TOTITLE u8_ct_totitle #include "u-totitle.h" #ifdef TEST #include #include #include #include /* Read the contents of an input stream, and return it, terminated with a NUL byte. */ char * read_file (FILE *stream) { #define BUFSIZE 4096 char *buf = NULL; int alloc = 0; int size = 0; int count; while (! feof (stream)) { if (size + BUFSIZE > alloc) { alloc = alloc + alloc / 2; if (alloc < size + BUFSIZE) alloc = size + BUFSIZE; buf = realloc (buf, alloc); if (buf == NULL) { fprintf (stderr, "out of memory\n"); exit (1); } } count = fread (buf + size, 1, BUFSIZE, stream); if (count == 0) { if (ferror (stream)) { perror ("fread"); exit (1); } } else size += count; } buf = realloc (buf, size + 1); if (buf == NULL) { fprintf (stderr, "out of memory\n"); exit (1); } buf[size] = '\0'; return buf; #undef BUFSIZE } int main (int argc, char * argv[]) { setlocale (LC_ALL, ""); if (argc == 1) { /* Display the upper case of the input string. */ char *input = read_file (stdin); int length = strlen (input); size_t output_length; uint8_t *output = u8_toupper ((uint8_t *) input, length, uc_locale_language (), NULL, NULL, &output_length); fwrite (output, 1, output_length, stdout); return 0; } else return 1; } #endif /* TEST */ pspp-1.4.1/gl/unicase/u-casecmp.h0000644000175000017500000000416013723215640016176 0ustar00blpblp00000000000000/* Case and normalization insensitive comparison of Unicode strings. Copyright (C) 2009-2020 Free Software Foundation, Inc. Written by Bruno Haible , 2009. 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 3 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, see . */ int FUNC (const SRC_UNIT *s1, size_t n1, const SRC_UNIT *s2, size_t n2, const char *iso639_language, uninorm_t nf, int *resultp) { UNIT buf1[2048 / sizeof (UNIT)]; UNIT buf2[2048 / sizeof (UNIT)]; UNIT *norms1; size_t norms1_length; UNIT *norms2; size_t norms2_length; int cmp; /* Optimization: There is no need to do canonical composition of each string. Decomposition is enough. */ if (nf != NULL) nf = uninorm_decomposing_form (nf); /* Case-fold and normalize S1. */ norms1_length = sizeof (buf1) / sizeof (UNIT); norms1 = U_CASEFOLD (s1, n1, iso639_language, nf, buf1, &norms1_length); if (norms1 == NULL) /* errno is set here. */ return -1; /* Case-fold and normalize S2. */ norms2_length = sizeof (buf2) / sizeof (UNIT); norms2 = U_CASEFOLD (s2, n2, iso639_language, nf, buf2, &norms2_length); if (norms2 == NULL) { if (norms1 != buf1) { int saved_errno = errno; free (norms1); errno = saved_errno; } return -1; } /* Compare the normalized strings. */ cmp = U_CMP2 (norms1, norms1_length, norms2, norms2_length); if (cmp > 0) cmp = 1; else if (cmp < 0) cmp = -1; if (norms2 != buf2) free (norms2); if (norms1 != buf1) free (norms1); *resultp = cmp; return 0; } pspp-1.4.1/gl/xmalloca.h0000644000175000017500000000434313723215640014475 0ustar00blpblp00000000000000/* Safe automatic memory allocation with out of memory checking. Copyright (C) 2003, 2005, 2007, 2009-2020 Free Software Foundation, Inc. Written by Bruno Haible , 2003. 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 3 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, see . */ #ifndef _XMALLOCA_H #define _XMALLOCA_H #include "malloca.h" #include "xalloc.h" #ifdef __cplusplus extern "C" { #endif /* xmalloca(N) is a checking safe variant of alloca(N). It allocates N bytes of memory allocated on the stack, that must be freed using freea() before the function returns. Upon failure, it exits with an error message. */ #if HAVE_ALLOCA # define xmalloca(N) \ ((N) < 4032 - (2 * sa_alignment_max - 1) \ ? (void *) (((uintptr_t) (char *) alloca ((N) + 2 * sa_alignment_max - 1) \ + (2 * sa_alignment_max - 1)) \ & ~(uintptr_t)(2 * sa_alignment_max - 1)) \ : xmmalloca (N)) extern void * xmmalloca (size_t n); #else # define xmalloca(N) \ xmalloc (N) #endif /* xnmalloca(N,S) is an overflow-safe variant of xmalloca (N * S). It allocates an array of N objects, each with S bytes of memory, on the stack. S must be positive and N must be nonnegative. The array must be freed using freea() before the function returns. Upon failure, it exits with an error message. */ #if HAVE_ALLOCA /* Rely on xmalloca (SIZE_MAX) calling xalloc_die (). */ # define xnmalloca(n, s) \ xmalloca (xalloc_oversized ((n), (s)) ? (size_t) (-1) : (n) * (s)) #else # define xnmalloca(n, s) \ xnmalloc ((n), (s)) #endif #ifdef __cplusplus } #endif #endif /* _XMALLOCA_H */ pspp-1.4.1/gl/fcntl.in.h0000644000175000017500000002576413723215636014427 0ustar00blpblp00000000000000/* Like , but with non-working flags defined to 0. Copyright (C) 2006-2020 Free Software Foundation, Inc. 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 3 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, see . */ /* written by Paul Eggert */ #if __GNUC__ >= 3 @PRAGMA_SYSTEM_HEADER@ #endif @PRAGMA_COLUMNS@ #if defined __need_system_fcntl_h /* Special invocation convention. */ /* Needed before . May also define off_t to a 64-bit type on native Windows. */ #include /* On some systems other than glibc, is a prerequisite of . On glibc systems, we would like to avoid namespace pollution. But on glibc systems, includes inside an extern "C" { ... } block, which leads to errors in C++ mode with the overridden from gnulib. These errors are known to be gone with g++ version >= 4.3. */ #if !(defined __GLIBC__ || defined __UCLIBC__) || (defined __cplusplus && defined GNULIB_NAMESPACE && (defined __ICC || !(__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3)))) # include #endif #@INCLUDE_NEXT@ @NEXT_FCNTL_H@ /* Native Windows platforms declare open(), creat() in . */ #if (@GNULIB_CREAT@ || @GNULIB_OPEN@ || defined GNULIB_POSIXCHECK) \ && (defined _WIN32 && ! defined __CYGWIN__) # include #endif #else /* Normal invocation convention. */ #ifndef _@GUARD_PREFIX@_FCNTL_H /* Needed before . May also define off_t to a 64-bit type on native Windows. */ #include /* On some systems other than glibc, is a prerequisite of . On glibc systems, we would like to avoid namespace pollution. But on glibc systems, includes inside an extern "C" { ... } block, which leads to errors in C++ mode with the overridden from gnulib. These errors are known to be gone with g++ version >= 4.3. */ #if !(defined __GLIBC__ || defined __UCLIBC__) || (defined __cplusplus && defined GNULIB_NAMESPACE && (defined __ICC || !(__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3)))) # include #endif /* The include_next requires a split double-inclusion guard. */ #@INCLUDE_NEXT@ @NEXT_FCNTL_H@ /* Native Windows platforms declare open(), creat() in . */ #if (@GNULIB_CREAT@ || @GNULIB_OPEN@ || defined GNULIB_POSIXCHECK) \ && (defined _WIN32 && ! defined __CYGWIN__) # include #endif #ifndef _@GUARD_PREFIX@_FCNTL_H #define _@GUARD_PREFIX@_FCNTL_H #ifndef __GLIBC__ /* Avoid namespace pollution on glibc systems. */ # include #endif /* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */ /* The definition of _GL_ARG_NONNULL is copied here. */ /* The definition of _GL_WARN_ON_USE is copied here. */ /* Declare overridden functions. */ #if @GNULIB_CREAT@ # if @REPLACE_CREAT@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef creat # define creat rpl_creat # endif _GL_FUNCDECL_RPL (creat, int, (const char *filename, mode_t mode) _GL_ARG_NONNULL ((1))); _GL_CXXALIAS_RPL (creat, int, (const char *filename, mode_t mode)); # else _GL_CXXALIAS_SYS (creat, int, (const char *filename, mode_t mode)); # endif _GL_CXXALIASWARN (creat); #elif defined GNULIB_POSIXCHECK # undef creat /* Assume creat is always declared. */ _GL_WARN_ON_USE (creat, "creat is not always POSIX compliant - " "use gnulib module creat for portability"); #endif #if @GNULIB_FCNTL@ # if @REPLACE_FCNTL@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef fcntl # define fcntl rpl_fcntl # endif _GL_FUNCDECL_RPL (fcntl, int, (int fd, int action, ...)); _GL_CXXALIAS_RPL (fcntl, int, (int fd, int action, ...)); # if !GNULIB_defined_rpl_fcntl # define GNULIB_defined_rpl_fcntl 1 # endif # else # if !@HAVE_FCNTL@ _GL_FUNCDECL_SYS (fcntl, int, (int fd, int action, ...)); # if !GNULIB_defined_fcntl # define GNULIB_defined_fcntl 1 # endif # endif _GL_CXXALIAS_SYS (fcntl, int, (int fd, int action, ...)); # endif _GL_CXXALIASWARN (fcntl); #elif defined GNULIB_POSIXCHECK # undef fcntl # if HAVE_RAW_DECL_FCNTL _GL_WARN_ON_USE (fcntl, "fcntl is not always POSIX compliant - " "use gnulib module fcntl for portability"); # endif #endif #if @GNULIB_OPEN@ # if @REPLACE_OPEN@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef open # define open rpl_open # endif _GL_FUNCDECL_RPL (open, int, (const char *filename, int flags, ...) _GL_ARG_NONNULL ((1))); _GL_CXXALIAS_RPL (open, int, (const char *filename, int flags, ...)); # else _GL_CXXALIAS_SYS (open, int, (const char *filename, int flags, ...)); # endif /* On HP-UX 11, in C++ mode, open() is defined as an inline function with a default argument. _GL_CXXALIASWARN does not work in this case. */ # if !defined __hpux _GL_CXXALIASWARN (open); # endif #elif defined GNULIB_POSIXCHECK # undef open /* Assume open is always declared. */ _GL_WARN_ON_USE (open, "open is not always POSIX compliant - " "use gnulib module open for portability"); #endif #if @GNULIB_OPENAT@ # if @REPLACE_OPENAT@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef openat # define openat rpl_openat # endif _GL_FUNCDECL_RPL (openat, int, (int fd, char const *file, int flags, /* mode_t mode */ ...) _GL_ARG_NONNULL ((2))); _GL_CXXALIAS_RPL (openat, int, (int fd, char const *file, int flags, /* mode_t mode */ ...)); # else # if !@HAVE_OPENAT@ _GL_FUNCDECL_SYS (openat, int, (int fd, char const *file, int flags, /* mode_t mode */ ...) _GL_ARG_NONNULL ((2))); # endif _GL_CXXALIAS_SYS (openat, int, (int fd, char const *file, int flags, /* mode_t mode */ ...)); # endif _GL_CXXALIASWARN (openat); #elif defined GNULIB_POSIXCHECK # undef openat # if HAVE_RAW_DECL_OPENAT _GL_WARN_ON_USE (openat, "openat is not portable - " "use gnulib module openat for portability"); # endif #endif /* Fix up the FD_* macros, only known to be missing on mingw. */ #ifndef FD_CLOEXEC # define FD_CLOEXEC 1 #endif /* Fix up the supported F_* macros. Intentionally leave other F_* macros undefined. Only known to be missing on mingw. */ #ifndef F_DUPFD_CLOEXEC # define F_DUPFD_CLOEXEC 0x40000000 /* Witness variable: 1 if gnulib defined F_DUPFD_CLOEXEC, 0 otherwise. */ # define GNULIB_defined_F_DUPFD_CLOEXEC 1 #else # define GNULIB_defined_F_DUPFD_CLOEXEC 0 #endif #ifndef F_DUPFD # define F_DUPFD 1 #endif #ifndef F_GETFD # define F_GETFD 2 #endif /* Fix up the O_* macros. */ /* AIX 7.1 with XL C 12.1 defines O_CLOEXEC, O_NOFOLLOW, and O_TTY_INIT to values outside 'int' range, so omit these misdefinitions. But avoid namespace pollution on non-AIX systems. */ #ifdef _AIX # include # if defined O_CLOEXEC && ! (INT_MIN <= O_CLOEXEC && O_CLOEXEC <= INT_MAX) # undef O_CLOEXEC # endif # if defined O_NOFOLLOW && ! (INT_MIN <= O_NOFOLLOW && O_NOFOLLOW <= INT_MAX) # undef O_NOFOLLOW # endif # if defined O_TTY_INIT && ! (INT_MIN <= O_TTY_INIT && O_TTY_INIT <= INT_MAX) # undef O_TTY_INIT # endif #endif #if !defined O_DIRECT && defined O_DIRECTIO /* Tru64 spells it 'O_DIRECTIO'. */ # define O_DIRECT O_DIRECTIO #endif #if !defined O_CLOEXEC && defined O_NOINHERIT /* Mingw spells it 'O_NOINHERIT'. */ # define O_CLOEXEC O_NOINHERIT #endif #ifndef O_CLOEXEC # define O_CLOEXEC 0x40000000 /* Try to not collide with system O_* flags. */ # define GNULIB_defined_O_CLOEXEC 1 #else # define GNULIB_defined_O_CLOEXEC 0 #endif #ifndef O_DIRECT # define O_DIRECT 0 #endif #ifndef O_DIRECTORY # define O_DIRECTORY 0 #endif #ifndef O_DSYNC # define O_DSYNC 0 #endif #ifndef O_EXEC # define O_EXEC O_RDONLY /* This is often close enough in older systems. */ #endif #ifndef O_IGNORE_CTTY # define O_IGNORE_CTTY 0 #endif #ifndef O_NDELAY # define O_NDELAY 0 #endif #ifndef O_NOATIME # define O_NOATIME 0 #endif #ifndef O_NONBLOCK # define O_NONBLOCK O_NDELAY #endif /* If the gnulib module 'nonblocking' is in use, guarantee a working non-zero value of O_NONBLOCK. Otherwise, O_NONBLOCK is defined (above) to O_NDELAY or to 0 as fallback. */ #if @GNULIB_NONBLOCKING@ # if O_NONBLOCK # define GNULIB_defined_O_NONBLOCK 0 # else # define GNULIB_defined_O_NONBLOCK 1 # undef O_NONBLOCK # define O_NONBLOCK 0x40000000 # endif #endif #ifndef O_NOCTTY # define O_NOCTTY 0 #endif #ifndef O_NOFOLLOW # define O_NOFOLLOW 0 #endif #ifndef O_NOLINK # define O_NOLINK 0 #endif #ifndef O_NOLINKS # define O_NOLINKS 0 #endif #ifndef O_NOTRANS # define O_NOTRANS 0 #endif #ifndef O_RSYNC # define O_RSYNC 0 #endif #ifndef O_SEARCH # define O_SEARCH O_RDONLY /* This is often close enough in older systems. */ #endif #ifndef O_SYNC # define O_SYNC 0 #endif #ifndef O_TTY_INIT # define O_TTY_INIT 0 #endif #if ~O_ACCMODE & (O_RDONLY | O_WRONLY | O_RDWR | O_EXEC | O_SEARCH) # undef O_ACCMODE # define O_ACCMODE (O_RDONLY | O_WRONLY | O_RDWR | O_EXEC | O_SEARCH) #endif /* For systems that distinguish between text and binary I/O. O_BINARY is usually declared in fcntl.h */ #if !defined O_BINARY && defined _O_BINARY /* For MSC-compatible compilers. */ # define O_BINARY _O_BINARY # define O_TEXT _O_TEXT #endif #if defined __BEOS__ || defined __HAIKU__ /* BeOS 5 and Haiku have O_BINARY and O_TEXT, but they have no effect. */ # undef O_BINARY # undef O_TEXT #endif #ifndef O_BINARY # define O_BINARY 0 # define O_TEXT 0 #endif /* Fix up the AT_* macros. */ /* Work around a bug in Solaris 9 and 10: AT_FDCWD is positive. Its value exceeds INT_MAX, so its use as an int doesn't conform to the C standard, and GCC and Sun C complain in some cases. If the bug is present, undef AT_FDCWD here, so it can be redefined below. */ #if 0 < AT_FDCWD && AT_FDCWD == 0xffd19553 # undef AT_FDCWD #endif /* Use the same bit pattern as Solaris 9, but with the proper signedness. The bit pattern is important, in case this actually is Solaris with the above workaround. */ #ifndef AT_FDCWD # define AT_FDCWD (-3041965) #endif /* Use the same values as Solaris 9. This shouldn't matter, but there's no real reason to differ. */ #ifndef AT_SYMLINK_NOFOLLOW # define AT_SYMLINK_NOFOLLOW 4096 #endif #ifndef AT_REMOVEDIR # define AT_REMOVEDIR 1 #endif /* Solaris 9 lacks these two, so just pick unique values. */ #ifndef AT_SYMLINK_FOLLOW # define AT_SYMLINK_FOLLOW 2 #endif #ifndef AT_EACCESS # define AT_EACCESS 4 #endif #endif /* _@GUARD_PREFIX@_FCNTL_H */ #endif /* _@GUARD_PREFIX@_FCNTL_H */ #endif pspp-1.4.1/gl/sys_socket.c0000644000175000017500000000015713723215640015055 0ustar00blpblp00000000000000#include #define _GL_SYS_SOCKET_INLINE _GL_EXTERN_INLINE #include "sys/socket.h" typedef int dummy; pspp-1.4.1/gl/areadlink.h0000644000175000017500000000231213723215636014626 0ustar00blpblp00000000000000/* Read symbolic links without size limitation. Copyright (C) 2001, 2003-2004, 2007, 2009-2020 Free Software Foundation, Inc. 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 3 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, see . */ /* Written by Jim Meyering */ #include extern char *areadlink (char const *filename); extern char *areadlink_with_size (char const *filename, size_t size_hint); #if GNULIB_AREADLINKAT extern char *areadlinkat (int fd, char const *filename); #endif #if GNULIB_AREADLINKAT_WITH_SIZE extern char *areadlinkat_with_size (int fd, char const *filename, size_t size_hint); #endif pspp-1.4.1/gl/rijndael-api-fst.c0000644000175000017500000003462413723215640016026 0ustar00blpblp00000000000000/* rijndael-api-fst.c --- Rijndael cipher implementation. * Copyright (C) 2005-2006, 2009-2020 Free Software Foundation, Inc. * * This file 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 3, or (at your * option) any later version. * * This file 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 file; if not, see . * */ /* Adapted for gnulib by Simon Josefsson. * * Based on public domain "Optimised C code" retrieved from (SHA1 * 7c8e4b00d06685d1dbc6724a9e0d502353de339e): * https://web.archive.org/web/20060618010435/http://www.iaik.tu-graz.ac.at/research/krypto/AES/old/~rijmen/rijndael/rijndael-fst-3.0.zip */ #include /** * rijndael-api-fst.c * * @version 2.9 (December 2000) * * Optimised ANSI C code for the Rijndael cipher (now AES) * * @author Vincent Rijmen * @author Antoon Bosselaers * @author Paulo Barreto * * This code is hereby placed in the public domain. * * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ''AS IS'' AND ANY EXPRESS * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Acknowledgements: * * We are deeply indebted to the following people for their bug reports, * fixes, and improvement suggestions to this implementation. Though we * tried to list all contributions, we apologise in advance for any * missing reference. * * Andrew Bales * Markus Friedl * John Skodon */ #include "rijndael-alg-fst.h" #include "rijndael-api-fst.h" #include #include #include rijndael_rc rijndaelMakeKey (rijndaelKeyInstance *key, rijndael_direction direction, size_t keyLen, const char *keyMaterial) { size_t i; char *keyMat; char cipherKey[RIJNDAEL_MAXKB]; if (key == NULL) { return RIJNDAEL_BAD_KEY_INSTANCE; } if ((direction == RIJNDAEL_DIR_ENCRYPT) || (direction == RIJNDAEL_DIR_DECRYPT)) { key->direction = direction; } else { return RIJNDAEL_BAD_KEY_DIR; } if ((keyLen == 128) || (keyLen == 192) || (keyLen == 256)) { key->keyLen = keyLen; } else { return RIJNDAEL_BAD_KEY_MAT; } if (keyMaterial != NULL) { strncpy (key->keyMaterial, keyMaterial, keyLen / 4); } /* initialize key schedule: */ keyMat = key->keyMaterial; for (i = 0; i < key->keyLen / 8; i++) { char t, v; t = *keyMat++; if ((t >= '0') && (t <= '9')) v = (t - '0') << 4; else if ((t >= 'a') && (t <= 'f')) v = (t - 'a' + 10) << 4; else if ((t >= 'A') && (t <= 'F')) v = (t - 'A' + 10) << 4; else return RIJNDAEL_BAD_KEY_MAT; t = *keyMat++; if ((t >= '0') && (t <= '9')) v ^= (t - '0'); else if ((t >= 'a') && (t <= 'f')) v ^= (t - 'a' + 10); else if ((t >= 'A') && (t <= 'F')) v ^= (t - 'A' + 10); else return RIJNDAEL_BAD_KEY_MAT; cipherKey[i] = v; } if (direction == RIJNDAEL_DIR_ENCRYPT) { key->Nr = rijndaelKeySetupEnc (key->rk, cipherKey, keyLen); } else { key->Nr = rijndaelKeySetupDec (key->rk, cipherKey, keyLen); } rijndaelKeySetupEnc (key->ek, cipherKey, keyLen); return 0; } rijndael_rc rijndaelCipherInit (rijndaelCipherInstance *cipher, rijndael_mode mode, const char *IV) { if ((mode == RIJNDAEL_MODE_ECB) || (mode == RIJNDAEL_MODE_CBC) || (mode == RIJNDAEL_MODE_CFB1)) { cipher->mode = mode; } else { return RIJNDAEL_BAD_CIPHER_MODE; } if (IV != NULL) { int i; for (i = 0; i < RIJNDAEL_MAX_IV_SIZE; i++) { int t, j; t = IV[2 * i]; if ((t >= '0') && (t <= '9')) j = (t - '0') << 4; else if ((t >= 'a') && (t <= 'f')) j = (t - 'a' + 10) << 4; else if ((t >= 'A') && (t <= 'F')) j = (t - 'A' + 10) << 4; else return RIJNDAEL_BAD_CIPHER_INSTANCE; t = IV[2 * i + 1]; if ((t >= '0') && (t <= '9')) j ^= (t - '0'); else if ((t >= 'a') && (t <= 'f')) j ^= (t - 'a' + 10); else if ((t >= 'A') && (t <= 'F')) j ^= (t - 'A' + 10); else return RIJNDAEL_BAD_CIPHER_INSTANCE; cipher->IV[i] = (uint8_t) j; } } else { memset (cipher->IV, 0, RIJNDAEL_MAX_IV_SIZE); } return 0; } int rijndaelBlockEncrypt (rijndaelCipherInstance *cipher, const rijndaelKeyInstance *key, const char *input, size_t inputLen, char *outBuffer) { size_t i, k, t, numBlocks; union { char bytes[16]; uint32_t words[4]; } block; char *iv; if (cipher == NULL || key == NULL || key->direction == RIJNDAEL_DIR_DECRYPT) { return RIJNDAEL_BAD_CIPHER_STATE; } if (input == NULL || inputLen <= 0) { return 0; /* nothing to do */ } numBlocks = inputLen / 128; switch (cipher->mode) { case RIJNDAEL_MODE_ECB: for (i = numBlocks; i > 0; i--) { rijndaelEncrypt (key->rk, key->Nr, input, outBuffer); input += 16; outBuffer += 16; } break; case RIJNDAEL_MODE_CBC: iv = cipher->IV; for (i = numBlocks; i > 0; i--) { block.words[0] = ((uint32_t *) input)[0] ^ ((uint32_t *) iv)[0]; block.words[1] = ((uint32_t *) input)[1] ^ ((uint32_t *) iv)[1]; block.words[2] = ((uint32_t *) input)[2] ^ ((uint32_t *) iv)[2]; block.words[3] = ((uint32_t *) input)[3] ^ ((uint32_t *) iv)[3]; rijndaelEncrypt (key->rk, key->Nr, block.bytes, outBuffer); memcpy (cipher->IV, outBuffer, 16); input += 16; outBuffer += 16; } break; case RIJNDAEL_MODE_CFB1: iv = cipher->IV; for (i = numBlocks; i > 0; i--) { memcpy (outBuffer, input, 16); for (k = 0; k < 128; k++) { rijndaelEncrypt (key->ek, key->Nr, iv, block.bytes); outBuffer[k >> 3] ^= (block.bytes[0] & 0x80U) >> (k & 7); for (t = 0; t < 15; t++) { iv[t] = (iv[t] << 1) | (iv[t + 1] >> 7); } iv[15] = (iv[15] << 1) | ((outBuffer[k >> 3] >> (7 - (k & 7))) & 1); } outBuffer += 16; input += 16; } break; default: return RIJNDAEL_BAD_CIPHER_STATE; } return 128 * numBlocks; } int rijndaelPadEncrypt (rijndaelCipherInstance *cipher, const rijndaelKeyInstance *key, const char *input, size_t inputOctets, char *outBuffer) { size_t i, numBlocks, padLen; union { char bytes[16]; uint32_t words[4]; } block; char *iv; if (cipher == NULL || key == NULL || key->direction == RIJNDAEL_DIR_DECRYPT) { return RIJNDAEL_BAD_CIPHER_STATE; } if (input == NULL || inputOctets <= 0) { return 0; /* nothing to do */ } numBlocks = inputOctets / 16; switch (cipher->mode) { case RIJNDAEL_MODE_ECB: for (i = numBlocks; i > 0; i--) { rijndaelEncrypt (key->rk, key->Nr, input, outBuffer); input += 16; outBuffer += 16; } padLen = 16 - (inputOctets - 16 * numBlocks); assert (padLen > 0 && padLen <= 16); memcpy (block.bytes, input, 16 - padLen); memset (block.bytes + 16 - padLen, padLen, padLen); rijndaelEncrypt (key->rk, key->Nr, block.bytes, outBuffer); break; case RIJNDAEL_MODE_CBC: iv = cipher->IV; for (i = numBlocks; i > 0; i--) { block.words[0] = ((uint32_t *) input)[0] ^ ((uint32_t *) iv)[0]; block.words[1] = ((uint32_t *) input)[1] ^ ((uint32_t *) iv)[1]; block.words[2] = ((uint32_t *) input)[2] ^ ((uint32_t *) iv)[2]; block.words[3] = ((uint32_t *) input)[3] ^ ((uint32_t *) iv)[3]; rijndaelEncrypt (key->rk, key->Nr, block.bytes, outBuffer); memcpy (cipher->IV, outBuffer, 16); input += 16; outBuffer += 16; } padLen = 16 - (inputOctets - 16 * numBlocks); assert (padLen > 0 && padLen <= 16); for (i = 0; i < 16 - padLen; i++) { block.bytes[i] = input[i] ^ iv[i]; } for (i = 16 - padLen; i < 16; i++) { block.bytes[i] = (char) padLen ^ iv[i]; } rijndaelEncrypt (key->rk, key->Nr, block.bytes, outBuffer); memcpy (cipher->IV, outBuffer, 16); break; default: return RIJNDAEL_BAD_CIPHER_STATE; } return 16 * (numBlocks + 1); } int rijndaelBlockDecrypt (rijndaelCipherInstance *cipher, const rijndaelKeyInstance *key, const char *input, size_t inputLen, char *outBuffer) { size_t i, k, t, numBlocks; union { char bytes[16]; uint32_t words[4]; } block; char *iv; if (cipher == NULL || key == NULL || (cipher->mode != RIJNDAEL_MODE_CFB1 && key->direction == RIJNDAEL_DIR_ENCRYPT)) { return RIJNDAEL_BAD_CIPHER_STATE; } if (input == NULL || inputLen <= 0) { return 0; /* nothing to do */ } numBlocks = inputLen / 128; switch (cipher->mode) { case RIJNDAEL_MODE_ECB: for (i = numBlocks; i > 0; i--) { rijndaelDecrypt (key->rk, key->Nr, input, outBuffer); input += 16; outBuffer += 16; } break; case RIJNDAEL_MODE_CBC: iv = cipher->IV; for (i = numBlocks; i > 0; i--) { rijndaelDecrypt (key->rk, key->Nr, input, block.bytes); block.words[0] ^= ((uint32_t *) iv)[0]; block.words[1] ^= ((uint32_t *) iv)[1]; block.words[2] ^= ((uint32_t *) iv)[2]; block.words[3] ^= ((uint32_t *) iv)[3]; memcpy (cipher->IV, input, 16); memcpy (outBuffer, block.bytes, 16); input += 16; outBuffer += 16; } break; case RIJNDAEL_MODE_CFB1: iv = cipher->IV; for (i = numBlocks; i > 0; i--) { memcpy (outBuffer, input, 16); for (k = 0; k < 128; k++) { rijndaelEncrypt (key->ek, key->Nr, iv, block.bytes); for (t = 0; t < 15; t++) { iv[t] = (iv[t] << 1) | (iv[t + 1] >> 7); } iv[15] = (iv[15] << 1) | ((input[k >> 3] >> (7 - (k & 7))) & 1); outBuffer[k >> 3] ^= (block.bytes[0] & 0x80U) >> (k & 7); } outBuffer += 16; input += 16; } break; default: return RIJNDAEL_BAD_CIPHER_STATE; } return 128 * numBlocks; } int rijndaelPadDecrypt (rijndaelCipherInstance *cipher, const rijndaelKeyInstance *key, const char *input, size_t inputOctets, char *outBuffer) { size_t i, numBlocks, padLen; union { char bytes[16]; uint32_t words[4]; } block; char *iv; if (cipher == NULL || key == NULL || key->direction == RIJNDAEL_DIR_ENCRYPT) { return RIJNDAEL_BAD_CIPHER_STATE; } if (input == NULL || inputOctets <= 0) { return 0; /* nothing to do */ } if (inputOctets % 16 != 0) { return RIJNDAEL_BAD_DATA; } numBlocks = inputOctets / 16; switch (cipher->mode) { case RIJNDAEL_MODE_ECB: /* all blocks but last */ for (i = numBlocks - 1; i > 0; i--) { rijndaelDecrypt (key->rk, key->Nr, input, outBuffer); input += 16; outBuffer += 16; } /* last block */ rijndaelDecrypt (key->rk, key->Nr, input, block.bytes); padLen = block.bytes[15]; if (padLen >= 16) { return RIJNDAEL_BAD_DATA; } for (i = 16 - padLen; i < 16; i++) { if (block.bytes[i] != padLen) { return RIJNDAEL_BAD_DATA; } } memcpy (outBuffer, block.bytes, 16 - padLen); break; case RIJNDAEL_MODE_CBC: iv = cipher->IV; /* all blocks but last */ for (i = numBlocks - 1; i > 0; i--) { rijndaelDecrypt (key->rk, key->Nr, input, block.bytes); block.words[0] ^= ((uint32_t *) iv)[0]; block.words[1] ^= ((uint32_t *) iv)[1]; block.words[2] ^= ((uint32_t *) iv)[2]; block.words[3] ^= ((uint32_t *) iv)[3]; memcpy (iv, input, 16); memcpy (outBuffer, block.bytes, 16); input += 16; outBuffer += 16; } /* last block */ rijndaelDecrypt (key->rk, key->Nr, input, block.bytes); block.words[0] ^= ((uint32_t *) iv)[0]; block.words[1] ^= ((uint32_t *) iv)[1]; block.words[2] ^= ((uint32_t *) iv)[2]; block.words[3] ^= ((uint32_t *) iv)[3]; padLen = block.bytes[15]; if (padLen <= 0 || padLen > 16) { return RIJNDAEL_BAD_DATA; } for (i = 16 - padLen; i < 16; i++) { if (block.bytes[i] != padLen) { return RIJNDAEL_BAD_DATA; } } memcpy (outBuffer, block.bytes, 16 - padLen); break; default: return RIJNDAEL_BAD_CIPHER_STATE; } return 16 * numBlocks - padLen; } pspp-1.4.1/gl/safe-read.c0000644000175000017500000000347013723215640014517 0ustar00blpblp00000000000000/* An interface to read and write that retries after interrupts. Copyright (C) 1993-1994, 1998, 2002-2006, 2009-2020 Free Software Foundation, Inc. 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 3 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, see . */ #include /* Specification. */ #ifdef SAFE_WRITE # include "safe-write.h" #else # include "safe-read.h" #endif /* Get ssize_t. */ #include #include #include #ifdef EINTR # define IS_EINTR(x) ((x) == EINTR) #else # define IS_EINTR(x) 0 #endif #include "sys-limits.h" #ifdef SAFE_WRITE # define safe_rw safe_write # define rw write #else # define safe_rw safe_read # define rw read # undef const # define const /* empty */ #endif /* Read(write) up to COUNT bytes at BUF from(to) descriptor FD, retrying if interrupted. Return the actual number of bytes read(written), zero for EOF, or SAFE_READ_ERROR(SAFE_WRITE_ERROR) upon error. */ size_t safe_rw (int fd, void const *buf, size_t count) { for (;;) { ssize_t result = rw (fd, buf, count); if (0 <= result) return result; else if (IS_EINTR (errno)) continue; else if (errno == EINVAL && SYS_BUFSIZE_MAX < count) count = SYS_BUFSIZE_MAX; else return result; } } pspp-1.4.1/gl/xalloc-oversized.h0000644000175000017500000000442513723215640016170 0ustar00blpblp00000000000000/* xalloc-oversized.h -- memory allocation size checking Copyright (C) 1990-2000, 2003-2004, 2006-2020 Free Software Foundation, Inc. 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 3 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, see . */ #ifndef XALLOC_OVERSIZED_H_ #define XALLOC_OVERSIZED_H_ #include #include /* True if N * S would overflow in a size_t calculation, or would generate a value larger than PTRDIFF_MAX. This expands to a constant expression if N and S are both constants. By gnulib convention, SIZE_MAX represents overflow in size calculations, so the conservative size_t-based dividend to use here is SIZE_MAX - 1. */ #define __xalloc_oversized(n, s) \ ((size_t) (PTRDIFF_MAX < SIZE_MAX ? PTRDIFF_MAX : SIZE_MAX - 1) / (s) < (n)) #if PTRDIFF_MAX < SIZE_MAX typedef ptrdiff_t __xalloc_count_type; #else typedef size_t __xalloc_count_type; #endif /* Return 1 if an array of N objects, each of size S, cannot exist reliably due to size or ptrdiff_t arithmetic overflow. S must be positive and N must be nonnegative. This is a macro, not a function, so that it works correctly even when SIZE_MAX < N. */ #if 7 <= __GNUC__ # define xalloc_oversized(n, s) \ __builtin_mul_overflow_p (n, s, (__xalloc_count_type) 1) #elif 5 <= __GNUC__ && !defined __ICC && !__STRICT_ANSI__ # define xalloc_oversized(n, s) \ (__builtin_constant_p (n) && __builtin_constant_p (s) \ ? __xalloc_oversized (n, s) \ : ({ __xalloc_count_type __xalloc_count; \ __builtin_mul_overflow (n, s, &__xalloc_count); })) /* Other compilers use integer division; this may be slower but is more portable. */ #else # define xalloc_oversized(n, s) __xalloc_oversized (n, s) #endif #endif /* !XALLOC_OVERSIZED_H_ */ pspp-1.4.1/gl/warn-on-use.h0000644000175000017500000001377213723215640015056 0ustar00blpblp00000000000000/* A C macro for emitting warnings if a function is used. Copyright (C) 2010-2020 Free Software Foundation, Inc. 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 3 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, see . */ /* _GL_WARN_ON_USE (function, "literal string") issues a declaration for FUNCTION which will then trigger a compiler warning containing the text of "literal string" anywhere that function is called, if supported by the compiler. If the compiler does not support this feature, the macro expands to an unused extern declaration. _GL_WARN_ON_USE_ATTRIBUTE ("literal string") expands to the attribute used in _GL_WARN_ON_USE. If the compiler does not support this feature, it expands to empty. These macros are useful for marking a function as a potential portability trap, with the intent that "literal string" include instructions on the replacement function that should be used instead. _GL_WARN_ON_USE is for functions with 'extern' linkage. _GL_WARN_ON_USE_ATTRIBUTE is for functions with 'static' or 'inline' linkage. However, one of the reasons that a function is a portability trap is if it has the wrong signature. Declaring FUNCTION with a different signature in C is a compilation error, so this macro must use the same type as any existing declaration so that programs that avoid the problematic FUNCTION do not fail to compile merely because they included a header that poisoned the function. But this implies that _GL_WARN_ON_USE is only safe to use if FUNCTION is known to already have a declaration. Use of this macro implies that there must not be any other macro hiding the declaration of FUNCTION; but undefining FUNCTION first is part of the poisoning process anyway (although for symbols that are provided only via a macro, the result is a compilation error rather than a warning containing "literal string"). Also note that in C++, it is only safe to use if FUNCTION has no overloads. For an example, it is possible to poison 'getline' by: - adding a call to gl_WARN_ON_USE_PREPARE([[#include ]], [getline]) in configure.ac, which potentially defines HAVE_RAW_DECL_GETLINE - adding this code to a header that wraps the system : #undef getline #if HAVE_RAW_DECL_GETLINE _GL_WARN_ON_USE (getline, "getline is required by POSIX 2008, but" "not universally present; use the gnulib module getline"); #endif It is not possible to directly poison global variables. But it is possible to write a wrapper accessor function, and poison that (less common usage, like &environ, will cause a compilation error rather than issue the nice warning, but the end result of informing the developer about their portability problem is still achieved): #if HAVE_RAW_DECL_ENVIRON static char *** rpl_environ (void) { return &environ; } _GL_WARN_ON_USE (rpl_environ, "environ is not always properly declared"); # undef environ # define environ (*rpl_environ ()) #endif or better (avoiding contradictory use of 'static' and 'extern'): #if HAVE_RAW_DECL_ENVIRON static char *** _GL_WARN_ON_USE_ATTRIBUTE ("environ is not always properly declared") rpl_environ (void) { return &environ; } # undef environ # define environ (*rpl_environ ()) #endif */ #ifndef _GL_WARN_ON_USE # if 4 < __GNUC__ || (__GNUC__ == 4 && 3 <= __GNUC_MINOR__) /* A compiler attribute is available in gcc versions 4.3.0 and later. */ # define _GL_WARN_ON_USE(function, message) \ extern __typeof__ (function) function __attribute__ ((__warning__ (message))) # define _GL_WARN_ON_USE_ATTRIBUTE(message) \ __attribute__ ((__warning__ (message))) # elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING /* Verify the existence of the function. */ # define _GL_WARN_ON_USE(function, message) \ extern __typeof__ (function) function # define _GL_WARN_ON_USE_ATTRIBUTE(message) # else /* Unsupported. */ # define _GL_WARN_ON_USE(function, message) \ _GL_WARN_EXTERN_C int _gl_warn_on_use # define _GL_WARN_ON_USE_ATTRIBUTE(message) # endif #endif /* _GL_WARN_ON_USE_CXX (function, rettype, parameters_and_attributes, "string") is like _GL_WARN_ON_USE (function, "string"), except that in C++ mode the function is declared with the given prototype, consisting of return type, parameters, and attributes. This variant is useful for overloaded functions in C++. _GL_WARN_ON_USE does not work in this case. */ #ifndef _GL_WARN_ON_USE_CXX # if !defined __cplusplus # define _GL_WARN_ON_USE_CXX(function,rettype,parameters_and_attributes,msg) \ _GL_WARN_ON_USE (function, msg) # else # if 4 < __GNUC__ || (__GNUC__ == 4 && 3 <= __GNUC_MINOR__) # define _GL_WARN_ON_USE_CXX(function,rettype,parameters_and_attributes,msg) \ extern rettype function parameters_and_attributes \ __attribute__ ((__warning__ (msg))) # elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING /* Verify the existence of the function. */ # define _GL_WARN_ON_USE_CXX(function,rettype,parameters_and_attributes,msg) \ extern rettype function parameters_and_attributes # else /* Unsupported. */ # define _GL_WARN_ON_USE_CXX(function,rettype,parameters_and_attributes,msg) \ _GL_WARN_EXTERN_C int _gl_warn_on_use # endif # endif #endif /* _GL_WARN_EXTERN_C declaration; performs the declaration with C linkage. */ #ifndef _GL_WARN_EXTERN_C # if defined __cplusplus # define _GL_WARN_EXTERN_C extern "C" # else # define _GL_WARN_EXTERN_C extern # endif #endif pspp-1.4.1/gl/gettimeofday.c0000644000175000017500000001124313723215637015354 0ustar00blpblp00000000000000/* Provide gettimeofday for systems that don't have it or for which it's broken. Copyright (C) 2001-2003, 2005-2007, 2009-2020 Free Software Foundation, Inc. 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 3, 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, see . */ /* written by Jim Meyering */ #include /* Specification. */ #include #include #if defined _WIN32 && ! defined __CYGWIN__ # define WINDOWS_NATIVE # include #endif #ifdef WINDOWS_NATIVE /* Don't assume that UNICODE is not defined. */ # undef LoadLibrary # define LoadLibrary LoadLibraryA # if !(_WIN32_WINNT >= _WIN32_WINNT_WIN8) /* Avoid warnings from gcc -Wcast-function-type. */ # define GetProcAddress \ (void *) GetProcAddress /* GetSystemTimePreciseAsFileTime was introduced only in Windows 8. */ typedef void (WINAPI * GetSystemTimePreciseAsFileTimeFuncType) (FILETIME *lpTime); static GetSystemTimePreciseAsFileTimeFuncType GetSystemTimePreciseAsFileTimeFunc = NULL; static BOOL initialized = FALSE; static void initialize (void) { HMODULE kernel32 = LoadLibrary ("kernel32.dll"); if (kernel32 != NULL) { GetSystemTimePreciseAsFileTimeFunc = (GetSystemTimePreciseAsFileTimeFuncType) GetProcAddress (kernel32, "GetSystemTimePreciseAsFileTime"); } initialized = TRUE; } # else # define GetSystemTimePreciseAsFileTimeFunc GetSystemTimePreciseAsFileTime # endif #endif /* This is a wrapper for gettimeofday. It is used only on systems that lack this function, or whose implementation of this function causes problems. Work around the bug in some systems whereby gettimeofday clobbers the static buffer that localtime uses for its return value. The gettimeofday function from Mac OS X 10.0.4 (i.e., Darwin 1.3.7) has this problem. */ int gettimeofday (struct timeval *restrict tv, void *restrict tz) { #undef gettimeofday #ifdef WINDOWS_NATIVE /* On native Windows, there are two ways to get the current time: GetSystemTimeAsFileTime or GetSystemTimePreciseAsFileTime . GetSystemTimeAsFileTime produces values that jump by increments of 15.627 milliseconds (!) on average. Whereas GetSystemTimePreciseAsFileTime values usually jump by 1 or 2 microseconds. More discussion on this topic: . */ FILETIME current_time; # if !(_WIN32_WINNT >= _WIN32_WINNT_WIN8) if (!initialized) initialize (); # endif if (GetSystemTimePreciseAsFileTimeFunc != NULL) GetSystemTimePreciseAsFileTimeFunc (¤t_time); else GetSystemTimeAsFileTime (¤t_time); /* Convert from FILETIME to 'struct timeval'. */ /* FILETIME: */ ULONGLONG since_1601 = ((ULONGLONG) current_time.dwHighDateTime << 32) | (ULONGLONG) current_time.dwLowDateTime; /* Between 1601-01-01 and 1970-01-01 there were 280 normal years and 89 leap years, in total 134774 days. */ ULONGLONG since_1970 = since_1601 - (ULONGLONG) 134774 * (ULONGLONG) 86400 * (ULONGLONG) 10000000; ULONGLONG microseconds_since_1970 = since_1970 / (ULONGLONG) 10; tv->tv_sec = microseconds_since_1970 / (ULONGLONG) 1000000; tv->tv_usec = microseconds_since_1970 % (ULONGLONG) 1000000; return 0; #else # if HAVE_GETTIMEOFDAY # if defined timeval /* 'struct timeval' overridden by gnulib? */ # undef timeval struct timeval otv; int result = gettimeofday (&otv, (struct timezone *) tz); if (result == 0) { tv->tv_sec = otv.tv_sec; tv->tv_usec = otv.tv_usec; } # else int result = gettimeofday (tv, (struct timezone *) tz); # endif return result; # else # if !defined OK_TO_USE_1S_CLOCK # error "Only 1-second nominal clock resolution found. Is that intended?" \ "If so, compile with the -DOK_TO_USE_1S_CLOCK option." # endif tv->tv_sec = time (NULL); tv->tv_usec = 0; return 0; # endif #endif } pspp-1.4.1/gl/sys_stat.in.h0000644000175000017500000005457413723215640015166 0ustar00blpblp00000000000000/* Provide a more complete sys/stat.h header file. Copyright (C) 2005-2020 Free Software Foundation, Inc. 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 3, 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, see . */ /* Written by Eric Blake, Paul Eggert, and Jim Meyering. */ /* This file is supposed to be used on platforms where is incomplete. It is intended to provide definitions and prototypes needed by an application. Start with what the system provides. */ #if __GNUC__ >= 3 @PRAGMA_SYSTEM_HEADER@ #endif @PRAGMA_COLUMNS@ #if defined __need_system_sys_stat_h /* Special invocation convention. */ #@INCLUDE_NEXT@ @NEXT_SYS_STAT_H@ #else /* Normal invocation convention. */ #ifndef _@GUARD_PREFIX@_SYS_STAT_H /* Get nlink_t. May also define off_t to a 64-bit type on native Windows. */ #include /* Get struct timespec. */ #include /* The include_next requires a split double-inclusion guard. */ #@INCLUDE_NEXT@ @NEXT_SYS_STAT_H@ #ifndef _@GUARD_PREFIX@_SYS_STAT_H #define _@GUARD_PREFIX@_SYS_STAT_H /* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */ /* The definition of _GL_ARG_NONNULL is copied here. */ /* The definition of _GL_WARN_ON_USE is copied here. */ /* Before doing "#define mknod rpl_mknod" below, we need to include all headers that may declare mknod(). OS/2 kLIBC declares mknod() in , not in . */ #ifdef __KLIBC__ # include #endif /* Before doing "#define mkdir rpl_mkdir" below, we need to include all headers that may declare mkdir(). Native Windows platforms declare mkdir in and/or , not in . */ #if defined _WIN32 && ! defined __CYGWIN__ # include /* mingw32, mingw64 */ # include /* mingw64, MSVC 9 */ #endif /* Native Windows platforms declare umask() in . */ #if 0 && (defined _WIN32 && ! defined __CYGWIN__) # include #endif /* Large File Support on native Windows. */ #if @WINDOWS_64_BIT_ST_SIZE@ # define stat _stati64 #endif /* Optionally, override 'struct stat' on native Windows. */ #if @GNULIB_OVERRIDES_STRUCT_STAT@ # undef stat # if @GNULIB_STAT@ # define stat rpl_stat # else /* Provoke a clear link error if stat() is used as a function and module 'stat' is not in use. */ # define stat stat_used_without_requesting_gnulib_module_stat # endif # if !GNULIB_defined_struct_stat struct stat { dev_t st_dev; ino_t st_ino; mode_t st_mode; nlink_t st_nlink; # if 0 uid_t st_uid; # else /* uid_t is not defined by default on native Windows. */ short st_uid; # endif # if 0 gid_t st_gid; # else /* gid_t is not defined by default on native Windows. */ short st_gid; # endif dev_t st_rdev; off_t st_size; # if 0 blksize_t st_blksize; blkcnt_t st_blocks; # endif # if @WINDOWS_STAT_TIMESPEC@ struct timespec st_atim; struct timespec st_mtim; struct timespec st_ctim; # else time_t st_atime; time_t st_mtime; time_t st_ctime; # endif }; # if @WINDOWS_STAT_TIMESPEC@ # define st_atime st_atim.tv_sec # define st_mtime st_mtim.tv_sec # define st_ctime st_ctim.tv_sec /* Indicator, for gnulib internal purposes. */ # define _GL_WINDOWS_STAT_TIMESPEC 1 # endif # define GNULIB_defined_struct_stat 1 # endif /* Other possible values of st_mode. */ # if 0 # define _S_IFBLK 0x6000 # endif # if 0 # define _S_IFLNK 0xA000 # endif # if 0 # define _S_IFSOCK 0xC000 # endif #endif #ifndef S_IFIFO # ifdef _S_IFIFO # define S_IFIFO _S_IFIFO # endif #endif #ifndef S_IFMT # define S_IFMT 0170000 #endif #if STAT_MACROS_BROKEN # undef S_ISBLK # undef S_ISCHR # undef S_ISDIR # undef S_ISFIFO # undef S_ISLNK # undef S_ISNAM # undef S_ISMPB # undef S_ISMPC # undef S_ISNWK # undef S_ISREG # undef S_ISSOCK #endif #ifndef S_ISBLK # ifdef S_IFBLK # define S_ISBLK(m) (((m) & S_IFMT) == S_IFBLK) # else # define S_ISBLK(m) 0 # endif #endif #ifndef S_ISCHR # ifdef S_IFCHR # define S_ISCHR(m) (((m) & S_IFMT) == S_IFCHR) # else # define S_ISCHR(m) 0 # endif #endif #ifndef S_ISDIR # ifdef S_IFDIR # define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR) # else # define S_ISDIR(m) 0 # endif #endif #ifndef S_ISDOOR /* Solaris 2.5 and up */ # define S_ISDOOR(m) 0 #endif #ifndef S_ISFIFO # ifdef S_IFIFO # define S_ISFIFO(m) (((m) & S_IFMT) == S_IFIFO) # else # define S_ISFIFO(m) 0 # endif #endif #ifndef S_ISLNK # ifdef S_IFLNK # define S_ISLNK(m) (((m) & S_IFMT) == S_IFLNK) # else # define S_ISLNK(m) 0 # endif #endif #ifndef S_ISMPB /* V7 */ # ifdef S_IFMPB # define S_ISMPB(m) (((m) & S_IFMT) == S_IFMPB) # define S_ISMPC(m) (((m) & S_IFMT) == S_IFMPC) # else # define S_ISMPB(m) 0 # define S_ISMPC(m) 0 # endif #endif #ifndef S_ISMPX /* AIX */ # define S_ISMPX(m) 0 #endif #ifndef S_ISNAM /* Xenix */ # ifdef S_IFNAM # define S_ISNAM(m) (((m) & S_IFMT) == S_IFNAM) # else # define S_ISNAM(m) 0 # endif #endif #ifndef S_ISNWK /* HP/UX */ # ifdef S_IFNWK # define S_ISNWK(m) (((m) & S_IFMT) == S_IFNWK) # else # define S_ISNWK(m) 0 # endif #endif #ifndef S_ISPORT /* Solaris 10 and up */ # define S_ISPORT(m) 0 #endif #ifndef S_ISREG # ifdef S_IFREG # define S_ISREG(m) (((m) & S_IFMT) == S_IFREG) # else # define S_ISREG(m) 0 # endif #endif #ifndef S_ISSOCK # ifdef S_IFSOCK # define S_ISSOCK(m) (((m) & S_IFMT) == S_IFSOCK) # else # define S_ISSOCK(m) 0 # endif #endif #ifndef S_TYPEISMQ # define S_TYPEISMQ(p) 0 #endif #ifndef S_TYPEISTMO # define S_TYPEISTMO(p) 0 #endif #ifndef S_TYPEISSEM # ifdef S_INSEM # define S_TYPEISSEM(p) (S_ISNAM ((p)->st_mode) && (p)->st_rdev == S_INSEM) # else # define S_TYPEISSEM(p) 0 # endif #endif #ifndef S_TYPEISSHM # ifdef S_INSHD # define S_TYPEISSHM(p) (S_ISNAM ((p)->st_mode) && (p)->st_rdev == S_INSHD) # else # define S_TYPEISSHM(p) 0 # endif #endif /* high performance ("contiguous data") */ #ifndef S_ISCTG # define S_ISCTG(p) 0 #endif /* Cray DMF (data migration facility): off line, with data */ #ifndef S_ISOFD # define S_ISOFD(p) 0 #endif /* Cray DMF (data migration facility): off line, with no data */ #ifndef S_ISOFL # define S_ISOFL(p) 0 #endif /* 4.4BSD whiteout */ #ifndef S_ISWHT # define S_ISWHT(m) 0 #endif /* If any of the following are undefined, define them to their de facto standard values. */ #if !S_ISUID # define S_ISUID 04000 #endif #if !S_ISGID # define S_ISGID 02000 #endif /* S_ISVTX is a common extension to POSIX. */ #ifndef S_ISVTX # define S_ISVTX 01000 #endif #if !S_IRUSR && S_IREAD # define S_IRUSR S_IREAD #endif #if !S_IRUSR # define S_IRUSR 00400 #endif #if !S_IRGRP # define S_IRGRP (S_IRUSR >> 3) #endif #if !S_IROTH # define S_IROTH (S_IRUSR >> 6) #endif #if !S_IWUSR && S_IWRITE # define S_IWUSR S_IWRITE #endif #if !S_IWUSR # define S_IWUSR 00200 #endif #if !S_IWGRP # define S_IWGRP (S_IWUSR >> 3) #endif #if !S_IWOTH # define S_IWOTH (S_IWUSR >> 6) #endif #if !S_IXUSR && S_IEXEC # define S_IXUSR S_IEXEC #endif #if !S_IXUSR # define S_IXUSR 00100 #endif #if !S_IXGRP # define S_IXGRP (S_IXUSR >> 3) #endif #if !S_IXOTH # define S_IXOTH (S_IXUSR >> 6) #endif #if !S_IRWXU # define S_IRWXU (S_IRUSR | S_IWUSR | S_IXUSR) #endif #if !S_IRWXG # define S_IRWXG (S_IRGRP | S_IWGRP | S_IXGRP) #endif #if !S_IRWXO # define S_IRWXO (S_IROTH | S_IWOTH | S_IXOTH) #endif /* S_IXUGO is a common extension to POSIX. */ #if !S_IXUGO # define S_IXUGO (S_IXUSR | S_IXGRP | S_IXOTH) #endif #ifndef S_IRWXUGO # define S_IRWXUGO (S_IRWXU | S_IRWXG | S_IRWXO) #endif /* Macros for futimens and utimensat. */ #ifndef UTIME_NOW # define UTIME_NOW (-1) # define UTIME_OMIT (-2) #endif #if @GNULIB_FCHMODAT@ # if @REPLACE_FCHMODAT@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef fchmodat # define fchmodat rpl_fchmodat # endif _GL_FUNCDECL_RPL (fchmodat, int, (int fd, char const *file, mode_t mode, int flag) _GL_ARG_NONNULL ((2))); _GL_CXXALIAS_RPL (fchmodat, int, (int fd, char const *file, mode_t mode, int flag)); # else # if !@HAVE_FCHMODAT@ _GL_FUNCDECL_SYS (fchmodat, int, (int fd, char const *file, mode_t mode, int flag) _GL_ARG_NONNULL ((2))); # endif _GL_CXXALIAS_SYS (fchmodat, int, (int fd, char const *file, mode_t mode, int flag)); # endif _GL_CXXALIASWARN (fchmodat); #elif defined GNULIB_POSIXCHECK # undef fchmodat # if HAVE_RAW_DECL_FCHMODAT _GL_WARN_ON_USE (fchmodat, "fchmodat is not portable - " "use gnulib module openat for portability"); # endif #endif #if @GNULIB_FSTAT@ # if @REPLACE_FSTAT@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef fstat # define fstat rpl_fstat # endif _GL_FUNCDECL_RPL (fstat, int, (int fd, struct stat *buf) _GL_ARG_NONNULL ((2))); _GL_CXXALIAS_RPL (fstat, int, (int fd, struct stat *buf)); # else _GL_CXXALIAS_SYS (fstat, int, (int fd, struct stat *buf)); # endif _GL_CXXALIASWARN (fstat); #elif @GNULIB_OVERRIDES_STRUCT_STAT@ # undef fstat # define fstat fstat_used_without_requesting_gnulib_module_fstat #elif @WINDOWS_64_BIT_ST_SIZE@ /* Above, we define stat to _stati64. */ # define fstat _fstati64 #elif defined GNULIB_POSIXCHECK # undef fstat # if HAVE_RAW_DECL_FSTAT _GL_WARN_ON_USE (fstat, "fstat has portability problems - " "use gnulib module fstat for portability"); # endif #endif #if @GNULIB_FSTATAT@ # if @REPLACE_FSTATAT@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef fstatat # define fstatat rpl_fstatat # endif _GL_FUNCDECL_RPL (fstatat, int, (int fd, char const *restrict name, struct stat *restrict st, int flags) _GL_ARG_NONNULL ((2, 3))); _GL_CXXALIAS_RPL (fstatat, int, (int fd, char const *restrict name, struct stat *restrict st, int flags)); # else # if !@HAVE_FSTATAT@ _GL_FUNCDECL_SYS (fstatat, int, (int fd, char const *restrict name, struct stat *restrict st, int flags) _GL_ARG_NONNULL ((2, 3))); # endif _GL_CXXALIAS_SYS (fstatat, int, (int fd, char const *restrict name, struct stat *restrict st, int flags)); # endif _GL_CXXALIASWARN (fstatat); #elif @GNULIB_OVERRIDES_STRUCT_STAT@ # undef fstatat # define fstatat fstatat_used_without_requesting_gnulib_module_fstatat #elif defined GNULIB_POSIXCHECK # undef fstatat # if HAVE_RAW_DECL_FSTATAT _GL_WARN_ON_USE (fstatat, "fstatat is not portable - " "use gnulib module openat for portability"); # endif #endif #if @GNULIB_FUTIMENS@ /* Use the rpl_ prefix also on Solaris <= 9, because on Solaris 9 our futimens implementation relies on futimesat, which on Solaris 10 makes an invocation to futimens that is meant to invoke the libc's futimens(), not gnulib's futimens(). */ # if @REPLACE_FUTIMENS@ || (!@HAVE_FUTIMENS@ && defined __sun) # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef futimens # define futimens rpl_futimens # endif _GL_FUNCDECL_RPL (futimens, int, (int fd, struct timespec const times[2])); _GL_CXXALIAS_RPL (futimens, int, (int fd, struct timespec const times[2])); # else # if !@HAVE_FUTIMENS@ _GL_FUNCDECL_SYS (futimens, int, (int fd, struct timespec const times[2])); # endif _GL_CXXALIAS_SYS (futimens, int, (int fd, struct timespec const times[2])); # endif # if @HAVE_FUTIMENS@ _GL_CXXALIASWARN (futimens); # endif #elif defined GNULIB_POSIXCHECK # undef futimens # if HAVE_RAW_DECL_FUTIMENS _GL_WARN_ON_USE (futimens, "futimens is not portable - " "use gnulib module futimens for portability"); # endif #endif #if @GNULIB_GETUMASK@ # if !@HAVE_GETUMASK@ _GL_FUNCDECL_SYS (getumask, mode_t, (void)); # endif _GL_CXXALIAS_SYS (getumask, mode_t, (void)); # if @HAVE_GETUMASK@ _GL_CXXALIASWARN (getumask); # endif #elif defined GNULIB_POSIXCHECK # undef getumask # if HAVE_RAW_DECL_GETUMASK _GL_WARN_ON_USE (getumask, "getumask is not portable - " "use gnulib module getumask for portability"); # endif #endif #if @GNULIB_LCHMOD@ /* Change the mode of FILENAME to MODE, without dereferencing it if FILENAME denotes a symbolic link. */ # if !@HAVE_LCHMOD@ || defined __hpux _GL_FUNCDECL_SYS (lchmod, int, (const char *filename, mode_t mode) _GL_ARG_NONNULL ((1))); # endif _GL_CXXALIAS_SYS (lchmod, int, (const char *filename, mode_t mode)); _GL_CXXALIASWARN (lchmod); #elif defined GNULIB_POSIXCHECK # undef lchmod # if HAVE_RAW_DECL_LCHMOD _GL_WARN_ON_USE (lchmod, "lchmod is unportable - " "use gnulib module lchmod for portability"); # endif #endif #if @GNULIB_LSTAT@ # if ! @HAVE_LSTAT@ /* mingw does not support symlinks, therefore it does not have lstat. But without links, stat does just fine. */ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # define lstat stat # endif _GL_CXXALIAS_RPL_1 (lstat, stat, int, (const char *restrict name, struct stat *restrict buf)); # elif @REPLACE_LSTAT@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef lstat # define lstat rpl_lstat # endif _GL_FUNCDECL_RPL (lstat, int, (const char *restrict name, struct stat *restrict buf) _GL_ARG_NONNULL ((1, 2))); _GL_CXXALIAS_RPL (lstat, int, (const char *restrict name, struct stat *restrict buf)); # else _GL_CXXALIAS_SYS (lstat, int, (const char *restrict name, struct stat *restrict buf)); # endif # if @HAVE_LSTAT@ _GL_CXXALIASWARN (lstat); # endif #elif @GNULIB_OVERRIDES_STRUCT_STAT@ # undef lstat # define lstat lstat_used_without_requesting_gnulib_module_lstat #elif defined GNULIB_POSIXCHECK # undef lstat # if HAVE_RAW_DECL_LSTAT _GL_WARN_ON_USE (lstat, "lstat is unportable - " "use gnulib module lstat for portability"); # endif #endif #if @REPLACE_MKDIR@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef mkdir # define mkdir rpl_mkdir # endif _GL_FUNCDECL_RPL (mkdir, int, (char const *name, mode_t mode) _GL_ARG_NONNULL ((1))); _GL_CXXALIAS_RPL (mkdir, int, (char const *name, mode_t mode)); #else /* mingw's _mkdir() function has 1 argument, but we pass 2 arguments. Additionally, it declares _mkdir (and depending on compile flags, an alias mkdir), only in the nonstandard includes and , which are included above. */ # if defined _WIN32 && ! defined __CYGWIN__ # if !GNULIB_defined_rpl_mkdir static int rpl_mkdir (char const *name, mode_t mode) { return _mkdir (name); } # define GNULIB_defined_rpl_mkdir 1 # endif # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # define mkdir rpl_mkdir # endif _GL_CXXALIAS_RPL (mkdir, int, (char const *name, mode_t mode)); # else _GL_CXXALIAS_SYS (mkdir, int, (char const *name, mode_t mode)); # endif #endif _GL_CXXALIASWARN (mkdir); #if @GNULIB_MKDIRAT@ # if !@HAVE_MKDIRAT@ _GL_FUNCDECL_SYS (mkdirat, int, (int fd, char const *file, mode_t mode) _GL_ARG_NONNULL ((2))); # endif _GL_CXXALIAS_SYS (mkdirat, int, (int fd, char const *file, mode_t mode)); _GL_CXXALIASWARN (mkdirat); #elif defined GNULIB_POSIXCHECK # undef mkdirat # if HAVE_RAW_DECL_MKDIRAT _GL_WARN_ON_USE (mkdirat, "mkdirat is not portable - " "use gnulib module openat for portability"); # endif #endif #if @GNULIB_MKFIFO@ # if @REPLACE_MKFIFO@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef mkfifo # define mkfifo rpl_mkfifo # endif _GL_FUNCDECL_RPL (mkfifo, int, (char const *file, mode_t mode) _GL_ARG_NONNULL ((1))); _GL_CXXALIAS_RPL (mkfifo, int, (char const *file, mode_t mode)); # else # if !@HAVE_MKFIFO@ _GL_FUNCDECL_SYS (mkfifo, int, (char const *file, mode_t mode) _GL_ARG_NONNULL ((1))); # endif _GL_CXXALIAS_SYS (mkfifo, int, (char const *file, mode_t mode)); # endif _GL_CXXALIASWARN (mkfifo); #elif defined GNULIB_POSIXCHECK # undef mkfifo # if HAVE_RAW_DECL_MKFIFO _GL_WARN_ON_USE (mkfifo, "mkfifo is not portable - " "use gnulib module mkfifo for portability"); # endif #endif #if @GNULIB_MKFIFOAT@ # if !@HAVE_MKFIFOAT@ _GL_FUNCDECL_SYS (mkfifoat, int, (int fd, char const *file, mode_t mode) _GL_ARG_NONNULL ((2))); # endif _GL_CXXALIAS_SYS (mkfifoat, int, (int fd, char const *file, mode_t mode)); _GL_CXXALIASWARN (mkfifoat); #elif defined GNULIB_POSIXCHECK # undef mkfifoat # if HAVE_RAW_DECL_MKFIFOAT _GL_WARN_ON_USE (mkfifoat, "mkfifoat is not portable - " "use gnulib module mkfifoat for portability"); # endif #endif #if @GNULIB_MKNOD@ # if @REPLACE_MKNOD@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef mknod # define mknod rpl_mknod # endif _GL_FUNCDECL_RPL (mknod, int, (char const *file, mode_t mode, dev_t dev) _GL_ARG_NONNULL ((1))); _GL_CXXALIAS_RPL (mknod, int, (char const *file, mode_t mode, dev_t dev)); # else # if !@HAVE_MKNOD@ _GL_FUNCDECL_SYS (mknod, int, (char const *file, mode_t mode, dev_t dev) _GL_ARG_NONNULL ((1))); # endif /* Need to cast, because on OSF/1 5.1, the third parameter is '...'. */ _GL_CXXALIAS_SYS_CAST (mknod, int, (char const *file, mode_t mode, dev_t dev)); # endif _GL_CXXALIASWARN (mknod); #elif defined GNULIB_POSIXCHECK # undef mknod # if HAVE_RAW_DECL_MKNOD _GL_WARN_ON_USE (mknod, "mknod is not portable - " "use gnulib module mknod for portability"); # endif #endif #if @GNULIB_MKNODAT@ # if !@HAVE_MKNODAT@ _GL_FUNCDECL_SYS (mknodat, int, (int fd, char const *file, mode_t mode, dev_t dev) _GL_ARG_NONNULL ((2))); # endif _GL_CXXALIAS_SYS (mknodat, int, (int fd, char const *file, mode_t mode, dev_t dev)); _GL_CXXALIASWARN (mknodat); #elif defined GNULIB_POSIXCHECK # undef mknodat # if HAVE_RAW_DECL_MKNODAT _GL_WARN_ON_USE (mknodat, "mknodat is not portable - " "use gnulib module mkfifoat for portability"); # endif #endif #if @GNULIB_STAT@ # if @REPLACE_STAT@ # if !@GNULIB_OVERRIDES_STRUCT_STAT@ /* We can't use the object-like #define stat rpl_stat, because of struct stat. This means that rpl_stat will not be used if the user does (stat)(a,b). Oh well. */ # if defined _AIX && defined stat && defined _LARGE_FILES /* With _LARGE_FILES defined, AIX (only) defines stat to stat64, so we have to replace stat64() instead of stat(). */ # undef stat64 # define stat64(name, st) rpl_stat (name, st) # elif @WINDOWS_64_BIT_ST_SIZE@ /* Above, we define stat to _stati64. */ # if defined __MINGW32__ && defined _stati64 # ifndef _USE_32BIT_TIME_T /* The system headers define _stati64 to _stat64. */ # undef _stat64 # define _stat64(name, st) rpl_stat (name, st) # endif # elif defined _MSC_VER && defined _stati64 # ifdef _USE_32BIT_TIME_T /* The system headers define _stati64 to _stat32i64. */ # undef _stat32i64 # define _stat32i64(name, st) rpl_stat (name, st) # else /* The system headers define _stati64 to _stat64. */ # undef _stat64 # define _stat64(name, st) rpl_stat (name, st) # endif # else # undef _stati64 # define _stati64(name, st) rpl_stat (name, st) # endif # elif defined __MINGW32__ && defined stat # ifdef _USE_32BIT_TIME_T /* The system headers define stat to _stat32i64. */ # undef _stat32i64 # define _stat32i64(name, st) rpl_stat (name, st) # else /* The system headers define stat to _stat64. */ # undef _stat64 # define _stat64(name, st) rpl_stat (name, st) # endif # elif defined _MSC_VER && defined stat # ifdef _USE_32BIT_TIME_T /* The system headers define stat to _stat32. */ # undef _stat32 # define _stat32(name, st) rpl_stat (name, st) # else /* The system headers define stat to _stat64i32. */ # undef _stat64i32 # define _stat64i32(name, st) rpl_stat (name, st) # endif # else /* !(_AIX || __MINGW32__ || _MSC_VER) */ # undef stat # define stat(name, st) rpl_stat (name, st) # endif /* !_LARGE_FILES */ # endif /* !@GNULIB_OVERRIDES_STRUCT_STAT@ */ _GL_EXTERN_C int stat (const char *restrict name, struct stat *restrict buf) _GL_ARG_NONNULL ((1, 2)); # endif #elif @GNULIB_OVERRIDES_STRUCT_STAT@ /* see above: #define stat stat_used_without_requesting_gnulib_module_stat */ #elif defined GNULIB_POSIXCHECK # undef stat # if HAVE_RAW_DECL_STAT _GL_WARN_ON_USE (stat, "stat is unportable - " "use gnulib module stat for portability"); # endif #endif #if @GNULIB_UTIMENSAT@ /* Use the rpl_ prefix also on Solaris <= 9, because on Solaris 9 our utimensat implementation relies on futimesat, which on Solaris 10 makes an invocation to utimensat that is meant to invoke the libc's utimensat(), not gnulib's utimensat(). */ # if @REPLACE_UTIMENSAT@ || (!@HAVE_UTIMENSAT@ && defined __sun) # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef utimensat # define utimensat rpl_utimensat # endif _GL_FUNCDECL_RPL (utimensat, int, (int fd, char const *name, struct timespec const times[2], int flag) _GL_ARG_NONNULL ((2))); _GL_CXXALIAS_RPL (utimensat, int, (int fd, char const *name, struct timespec const times[2], int flag)); # else # if !@HAVE_UTIMENSAT@ _GL_FUNCDECL_SYS (utimensat, int, (int fd, char const *name, struct timespec const times[2], int flag) _GL_ARG_NONNULL ((2))); # endif _GL_CXXALIAS_SYS (utimensat, int, (int fd, char const *name, struct timespec const times[2], int flag)); # endif # if @HAVE_UTIMENSAT@ _GL_CXXALIASWARN (utimensat); # endif #elif defined GNULIB_POSIXCHECK # undef utimensat # if HAVE_RAW_DECL_UTIMENSAT _GL_WARN_ON_USE (utimensat, "utimensat is not portable - " "use gnulib module utimensat for portability"); # endif #endif #endif /* _@GUARD_PREFIX@_SYS_STAT_H */ #endif /* _@GUARD_PREFIX@_SYS_STAT_H */ #endif pspp-1.4.1/gl/strcasestr.c0000644000175000017500000000574013723215640015067 0ustar00blpblp00000000000000/* Case-insensitive searching in a string. Copyright (C) 2005-2020 Free Software Foundation, Inc. Written by Bruno Haible , 2005. 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 3, 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, see . */ #include /* Specification. */ #include #include #include #include #define TOLOWER(Ch) (isupper (Ch) ? tolower (Ch) : (Ch)) /* Two-Way algorithm. */ #define RETURN_TYPE char * #define AVAILABLE(h, h_l, j, n_l) \ (!memchr ((h) + (h_l), '\0', (j) + (n_l) - (h_l)) \ && ((h_l) = (j) + (n_l))) #define CANON_ELEMENT(c) TOLOWER (c) #define CMP_FUNC(p1, p2, l) \ strncasecmp ((const char *) (p1), (const char *) (p2), l) #include "str-two-way.h" /* Find the first occurrence of NEEDLE in HAYSTACK, using case-insensitive comparison. This function gives unspecified results in multibyte locales. */ char * strcasestr (const char *haystack_start, const char *needle_start) { const char *haystack = haystack_start; const char *needle = needle_start; size_t needle_len; /* Length of NEEDLE. */ size_t haystack_len; /* Known minimum length of HAYSTACK. */ bool ok = true; /* True if NEEDLE is prefix of HAYSTACK. */ /* Determine length of NEEDLE, and in the process, make sure HAYSTACK is at least as long (no point processing all of a long NEEDLE if HAYSTACK is too short). */ while (*haystack && *needle) { ok &= (TOLOWER ((unsigned char) *haystack) == TOLOWER ((unsigned char) *needle)); haystack++; needle++; } if (*needle) return NULL; if (ok) return (char *) haystack_start; needle_len = needle - needle_start; haystack = haystack_start + 1; haystack_len = needle_len - 1; /* Perform the search. Abstract memory is considered to be an array of 'unsigned char' values, not an array of 'char' values. See ISO C 99 section 6.2.6.1. */ if (needle_len < LONG_NEEDLE_THRESHOLD) return two_way_short_needle ((const unsigned char *) haystack, haystack_len, (const unsigned char *) needle_start, needle_len); return two_way_long_needle ((const unsigned char *) haystack, haystack_len, (const unsigned char *) needle_start, needle_len); } #undef LONG_NEEDLE_THRESHOLD pspp-1.4.1/gl/error.c0000644000175000017500000002470613723215636014033 0ustar00blpblp00000000000000/* Error handler for noninteractive utilities Copyright (C) 1990-1998, 2000-2007, 2009-2020 Free Software Foundation, Inc. This file is part of the GNU C Library. 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 3 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, see . */ /* Written by David MacKenzie . */ #if !_LIBC # include #endif #include "error.h" #include #include #include #include #if !_LIBC && ENABLE_NLS # include "gettext.h" # define _(msgid) gettext (msgid) #endif #ifdef _LIBC # include # include # include # include # define mbsrtowcs __mbsrtowcs # define USE_UNLOCKED_IO 0 # define _GL_ATTRIBUTE_FORMAT_PRINTF(a, b) # define _GL_ARG_NONNULL(a) #else # include "getprogname.h" #endif #if USE_UNLOCKED_IO # include "unlocked-io.h" #endif #ifndef _ # define _(String) String #endif /* If NULL, error will flush stdout, then print on stderr the program name, a colon and a space. Otherwise, error will call this function without parameters instead. */ void (*error_print_progname) (void); /* This variable is incremented each time 'error' is called. */ unsigned int error_message_count; #ifdef _LIBC /* In the GNU C library, there is a predefined variable for this. */ # define program_name program_invocation_name # include # include # include /* In GNU libc we want do not want to use the common name 'error' directly. Instead make it a weak alias. */ extern void __error (int status, int errnum, const char *message, ...) __attribute__ ((__format__ (__printf__, 3, 4))); extern void __error_at_line (int status, int errnum, const char *file_name, unsigned int line_number, const char *message, ...) __attribute__ ((__format__ (__printf__, 5, 6))); # define error __error # define error_at_line __error_at_line # include # define fflush(s) _IO_fflush (s) # undef putc # define putc(c, fp) _IO_putc (c, fp) # include #else /* not _LIBC */ # include # include # if defined _WIN32 && ! defined __CYGWIN__ /* Get declarations of the native Windows API functions. */ # define WIN32_LEAN_AND_MEAN # include /* Get _get_osfhandle. */ # if GNULIB_MSVC_NOTHROW # include "msvc-nothrow.h" # else # include # endif # endif /* The gnulib override of fcntl is not needed in this file. */ # undef fcntl # if !(GNULIB_STRERROR_R_POSIX || HAVE_DECL_STRERROR_R) # ifndef HAVE_DECL_STRERROR_R "this configure-time declaration test was not run" # endif # if STRERROR_R_CHAR_P char *strerror_r (int errnum, char *buf, size_t buflen); # else int strerror_r (int errnum, char *buf, size_t buflen); # endif # endif # define program_name getprogname () # if GNULIB_STRERROR_R_POSIX || HAVE_STRERROR_R || defined strerror_r # define __strerror_r strerror_r # endif /* GNULIB_STRERROR_R_POSIX || HAVE_STRERROR_R || defined strerror_r */ #endif /* not _LIBC */ #if !_LIBC /* Return non-zero if FD is open. */ static int is_open (int fd) { # if defined _WIN32 && ! defined __CYGWIN__ /* On native Windows: The initial state of unassigned standard file descriptors is that they are open but point to an INVALID_HANDLE_VALUE. There is no fcntl, and the gnulib replacement fcntl does not support F_GETFL. */ return (HANDLE) _get_osfhandle (fd) != INVALID_HANDLE_VALUE; # else # ifndef F_GETFL # error Please port fcntl to your platform # endif return 0 <= fcntl (fd, F_GETFL); # endif } #endif static void flush_stdout (void) { #if !_LIBC int stdout_fd; # if GNULIB_FREOPEN_SAFER /* Use of gnulib's freopen-safer module normally ensures that fileno (stdout) == 1 whenever stdout is open. */ stdout_fd = STDOUT_FILENO; # else /* POSIX states that fileno (stdout) after fclose is unspecified. But in practice it is not a problem, because stdout is statically allocated and the fd of a FILE stream is stored as a field in its allocated memory. */ stdout_fd = fileno (stdout); # endif /* POSIX states that fflush (stdout) after fclose is unspecified; it is safe in glibc, but not on all other platforms. fflush (NULL) is always defined, but too draconian. */ if (0 <= stdout_fd && is_open (stdout_fd)) #endif fflush (stdout); } static void print_errno_message (int errnum) { char const *s; #if _LIBC || GNULIB_STRERROR_R_POSIX || defined HAVE_STRERROR_R char errbuf[1024]; # if _LIBC || (!GNULIB_STRERROR_R_POSIX && STRERROR_R_CHAR_P) s = __strerror_r (errnum, errbuf, sizeof errbuf); # else if (__strerror_r (errnum, errbuf, sizeof errbuf) == 0) s = errbuf; else s = 0; # endif #else s = strerror (errnum); #endif #if !_LIBC if (! s) s = _("Unknown system error"); #endif #if _LIBC __fxprintf (NULL, ": %s", s); #else fprintf (stderr, ": %s", s); #endif } static void _GL_ATTRIBUTE_FORMAT_PRINTF (3, 0) _GL_ARG_NONNULL ((3)) error_tail (int status, int errnum, const char *message, va_list args) { #if _LIBC if (_IO_fwide (stderr, 0) > 0) { size_t len = strlen (message) + 1; wchar_t *wmessage = NULL; mbstate_t st; size_t res; const char *tmp; bool use_malloc = false; while (1) { if (__libc_use_alloca (len * sizeof (wchar_t))) wmessage = (wchar_t *) alloca (len * sizeof (wchar_t)); else { if (!use_malloc) wmessage = NULL; wchar_t *p = (wchar_t *) realloc (wmessage, len * sizeof (wchar_t)); if (p == NULL) { free (wmessage); fputws_unlocked (L"out of memory\n", stderr); return; } wmessage = p; use_malloc = true; } memset (&st, '\0', sizeof (st)); tmp = message; res = mbsrtowcs (wmessage, &tmp, len, &st); if (res != len) break; if (__builtin_expect (len >= SIZE_MAX / sizeof (wchar_t) / 2, 0)) { /* This really should not happen if everything is fine. */ res = (size_t) -1; break; } len *= 2; } if (res == (size_t) -1) { /* The string cannot be converted. */ if (use_malloc) { free (wmessage); use_malloc = false; } wmessage = (wchar_t *) L"???"; } __vfwprintf (stderr, wmessage, args); if (use_malloc) free (wmessage); } else #endif vfprintf (stderr, message, args); ++error_message_count; if (errnum) print_errno_message (errnum); #if _LIBC __fxprintf (NULL, "\n"); #else putc ('\n', stderr); #endif fflush (stderr); if (status) exit (status); } /* Print the program name and error message MESSAGE, which is a printf-style format string with optional args. If ERRNUM is nonzero, print its corresponding system error message. Exit with status STATUS if it is nonzero. */ void error (int status, int errnum, const char *message, ...) { va_list args; #if defined _LIBC && defined __libc_ptf_call /* We do not want this call to be cut short by a thread cancellation. Therefore disable cancellation for now. */ int state = PTHREAD_CANCEL_ENABLE; __libc_ptf_call (pthread_setcancelstate, (PTHREAD_CANCEL_DISABLE, &state), 0); #endif flush_stdout (); #ifdef _LIBC _IO_flockfile (stderr); #endif if (error_print_progname) (*error_print_progname) (); else { #if _LIBC __fxprintf (NULL, "%s: ", program_name); #else fprintf (stderr, "%s: ", program_name); #endif } va_start (args, message); error_tail (status, errnum, message, args); va_end (args); #ifdef _LIBC _IO_funlockfile (stderr); # ifdef __libc_ptf_call __libc_ptf_call (pthread_setcancelstate, (state, NULL), 0); # endif #endif } /* Sometimes we want to have at most one error per line. This variable controls whether this mode is selected or not. */ int error_one_per_line; void error_at_line (int status, int errnum, const char *file_name, unsigned int line_number, const char *message, ...) { va_list args; if (error_one_per_line) { static const char *old_file_name; static unsigned int old_line_number; if (old_line_number == line_number && (file_name == old_file_name || (old_file_name != NULL && file_name != NULL && strcmp (old_file_name, file_name) == 0))) /* Simply return and print nothing. */ return; old_file_name = file_name; old_line_number = line_number; } #if defined _LIBC && defined __libc_ptf_call /* We do not want this call to be cut short by a thread cancellation. Therefore disable cancellation for now. */ int state = PTHREAD_CANCEL_ENABLE; __libc_ptf_call (pthread_setcancelstate, (PTHREAD_CANCEL_DISABLE, &state), 0); #endif flush_stdout (); #ifdef _LIBC _IO_flockfile (stderr); #endif if (error_print_progname) (*error_print_progname) (); else { #if _LIBC __fxprintf (NULL, "%s:", program_name); #else fprintf (stderr, "%s:", program_name); #endif } #if _LIBC __fxprintf (NULL, file_name != NULL ? "%s:%u: " : " ", file_name, line_number); #else fprintf (stderr, file_name != NULL ? "%s:%u: " : " ", file_name, line_number); #endif va_start (args, message); error_tail (status, errnum, message, args); va_end (args); #ifdef _LIBC _IO_funlockfile (stderr); # ifdef __libc_ptf_call __libc_ptf_call (pthread_setcancelstate, (state, NULL), 0); # endif #endif } #ifdef _LIBC /* Make the weak alias. */ # undef error # undef error_at_line weak_alias (__error, error) weak_alias (__error_at_line, error_at_line) #endif pspp-1.4.1/gl/strncasecmp.c0000644000175000017500000000354013723215640015210 0ustar00blpblp00000000000000/* strncasecmp.c -- case insensitive string comparator Copyright (C) 1998-1999, 2005-2007, 2009-2020 Free Software Foundation, Inc. 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 3, 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, see . */ #include /* Specification. */ #include #include #include #define TOLOWER(Ch) (isupper (Ch) ? tolower (Ch) : (Ch)) /* Compare no more than N bytes of strings S1 and S2, ignoring case, returning less than, equal to or greater than zero if S1 is lexicographically less than, equal to or greater than S2. Note: This function cannot work correctly in multibyte locales. */ int strncasecmp (const char *s1, const char *s2, size_t n) { register const unsigned char *p1 = (const unsigned char *) s1; register const unsigned char *p2 = (const unsigned char *) s2; unsigned char c1, c2; if (p1 == p2 || n == 0) return 0; do { c1 = TOLOWER (*p1); c2 = TOLOWER (*p2); if (--n == 0 || c1 == '\0') break; ++p1; ++p2; } while (c1 == c2); if (UCHAR_MAX <= INT_MAX) return c1 - c2; else /* On machines where 'char' and 'int' are types of the same size, the difference of two 'unsigned char' values - including the sign bit - doesn't fit in an 'int'. */ return _GL_CMP (c1, c2); } pspp-1.4.1/gl/read-file.c0000644000175000017500000001423413723215640014520 0ustar00blpblp00000000000000/* read-file.c -- read file contents into a string Copyright (C) 2006, 2009-2020 Free Software Foundation, Inc. Written by Simon Josefsson and Bruno Haible. 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 3, 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, see . */ #include #include "read-file.h" /* Get fstat. */ #include /* Get ftello. */ #include /* Get PTRDIFF_MAX. */ #include /* Get malloc, realloc, free. */ #include /* Get explicit_bzero, memcpy. */ #include /* Get errno. */ #include /* Read a STREAM and return a newly allocated string with the content, and set *LENGTH to the length of the string. The string is zero-terminated, but the terminating zero byte is not counted in *LENGTH. On errors, *LENGTH is undefined, errno preserves the values set by system functions (if any), and NULL is returned. If the RF_SENSITIVE flag is set in FLAGS: - You should control the buffering of STREAM using 'setvbuf'. Either clear the buffer of STREAM after closing it, or disable buffering of STREAM before calling this function. - The memory buffer internally allocated will be cleared upon failure. */ char * fread_file (FILE *stream, int flags, size_t *length) { char *buf = NULL; size_t alloc = BUFSIZ; /* For a regular file, allocate a buffer that has exactly the right size. This avoids the need to do dynamic reallocations later. */ { struct stat st; if (fstat (fileno (stream), &st) >= 0 && S_ISREG (st.st_mode)) { off_t pos = ftello (stream); if (pos >= 0 && pos < st.st_size) { off_t alloc_off = st.st_size - pos; /* '1' below, accounts for the trailing NUL. */ if (PTRDIFF_MAX - 1 < alloc_off) { errno = ENOMEM; return NULL; } alloc = alloc_off + 1; } } } if (!(buf = malloc (alloc))) return NULL; /* errno is ENOMEM. */ { size_t size = 0; /* number of bytes read so far */ int save_errno; for (;;) { /* This reads 1 more than the size of a regular file so that we get eof immediately. */ size_t requested = alloc - size; size_t count = fread (buf + size, 1, requested, stream); size += count; if (count != requested) { save_errno = errno; if (ferror (stream)) break; /* Shrink the allocated memory if possible. */ if (size < alloc - 1) { if (flags & RF_SENSITIVE) { char *smaller_buf = malloc (size + 1); if (smaller_buf == NULL) explicit_bzero (buf + size, alloc - size); else { memcpy (smaller_buf, buf, size); explicit_bzero (buf, alloc); free (buf); buf = smaller_buf; } } else { char *smaller_buf = realloc (buf, size + 1); if (smaller_buf != NULL) buf = smaller_buf; } } buf[size] = '\0'; *length = size; return buf; } { char *new_buf; size_t save_alloc = alloc; if (alloc == PTRDIFF_MAX) { save_errno = ENOMEM; break; } if (alloc < PTRDIFF_MAX - alloc / 2) alloc = alloc + alloc / 2; else alloc = PTRDIFF_MAX; if (flags & RF_SENSITIVE) { new_buf = malloc (alloc); if (!new_buf) { /* BUF should be cleared below after the loop. */ save_errno = errno; break; } memcpy (new_buf, buf, save_alloc); explicit_bzero (buf, save_alloc); free (buf); buf = new_buf; } else if (!(new_buf = realloc (buf, alloc))) { save_errno = errno; break; } buf = new_buf; } } if (flags & RF_SENSITIVE) explicit_bzero (buf, alloc); free (buf); errno = save_errno; return NULL; } } /* Open and read the contents of FILENAME, and return a newly allocated string with the content, and set *LENGTH to the length of the string. The string is zero-terminated, but the terminating zero byte is not counted in *LENGTH. On errors, *LENGTH is undefined, errno preserves the values set by system functions (if any), and NULL is returned. If the RF_BINARY flag is set in FLAGS, the file is opened in binary mode. If the RF_SENSITIVE flag is set in FLAGS, the memory buffer internally allocated will be cleared upon failure. */ char * read_file (const char *filename, int flags, size_t *length) { const char *mode = (flags & RF_BINARY) ? "rbe" : "re"; FILE *stream = fopen (filename, mode); char *out; int save_errno; if (!stream) return NULL; if (flags & RF_SENSITIVE) setvbuf (stream, NULL, _IONBF, 0); out = fread_file (stream, flags, length); save_errno = errno; if (fclose (stream) != 0) { if (out) { save_errno = errno; if (flags & RF_SENSITIVE) explicit_bzero (out, *length); free (out); } errno = save_errno; return NULL; } return out; } pspp-1.4.1/gl/strcasecmp.c0000644000175000017500000000341013723215640015026 0ustar00blpblp00000000000000/* Case-insensitive string comparison function. Copyright (C) 1998-1999, 2005-2007, 2009-2020 Free Software Foundation, Inc. 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 3, 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, see . */ #include /* Specification. */ #include #include #include #define TOLOWER(Ch) (isupper (Ch) ? tolower (Ch) : (Ch)) /* Compare strings S1 and S2, ignoring case, returning less than, equal to or greater than zero if S1 is lexicographically less than, equal to or greater than S2. Note: This function does not work with multibyte strings! */ int strcasecmp (const char *s1, const char *s2) { const unsigned char *p1 = (const unsigned char *) s1; const unsigned char *p2 = (const unsigned char *) s2; unsigned char c1, c2; if (p1 == p2) return 0; do { c1 = TOLOWER (*p1); c2 = TOLOWER (*p2); if (c1 == '\0') break; ++p1; ++p2; } while (c1 == c2); if (UCHAR_MAX <= INT_MAX) return c1 - c2; else /* On machines where 'char' and 'int' are types of the same size, the difference of two 'unsigned char' values - including the sign bit - doesn't fit in an 'int'. */ return _GL_CMP (c1, c2); } pspp-1.4.1/gl/unistd.c0000644000175000017500000000014713723215640014174 0ustar00blpblp00000000000000#include #define _GL_UNISTD_INLINE _GL_EXTERN_INLINE #include "unistd.h" typedef int dummy; pspp-1.4.1/gl/mempcpy.c0000644000175000017500000000200313723215637014337 0ustar00blpblp00000000000000/* Copy memory area and return pointer after last written byte. Copyright (C) 2003, 2007, 2009-2020 Free Software Foundation, Inc. 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 3, 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, see . */ #include /* Specification. */ #include /* Copy N bytes of SRC to DEST, return pointer to bytes after the last written byte. */ void * mempcpy (void *dest, const void *src, size_t n) { return (char *) memcpy (dest, src, n) + n; } pspp-1.4.1/gl/str-two-way.h0000644000175000017500000004217113723215640015113 0ustar00blpblp00000000000000/* Byte-wise substring search, using the Two-Way algorithm. Copyright (C) 2008-2020 Free Software Foundation, Inc. This file is part of the GNU C Library. Written by Eric Blake , 2008. 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 3, 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, see . */ /* Before including this file, you need to include and , and define: RETURN_TYPE A macro that expands to the return type. AVAILABLE(h, h_l, j, n_l) A macro that returns nonzero if there are at least N_L bytes left starting at H[J]. H is 'unsigned char *', H_L, J, and N_L are 'size_t'; H_L is an lvalue. For NUL-terminated searches, H_L can be modified each iteration to avoid having to compute the end of H up front. For case-insensitivity, you may optionally define: CMP_FUNC(p1, p2, l) A macro that returns 0 iff the first L characters of P1 and P2 are equal. CANON_ELEMENT(c) A macro that canonicalizes an element right after it has been fetched from one of the two strings. The argument is an 'unsigned char'; the result must be an 'unsigned char' as well. This file undefines the macros documented above, and defines LONG_NEEDLE_THRESHOLD. */ #include #include /* We use the Two-Way string matching algorithm (also known as Chrochemore-Perrin), which guarantees linear complexity with constant space. Additionally, for long needles, we also use a bad character shift table similar to the Boyer-Moore algorithm to achieve improved (potentially sub-linear) performance. See https://www-igm.univ-mlv.fr/~lecroq/string/node26.html#SECTION00260, https://en.wikipedia.org/wiki/Boyer-Moore_string_search_algorithm, https://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.34.6641&rep=rep1&type=pdf */ /* Point at which computing a bad-byte shift table is likely to be worthwhile. Small needles should not compute a table, since it adds (1 << CHAR_BIT) + NEEDLE_LEN computations of preparation for a speedup no greater than a factor of NEEDLE_LEN. The larger the needle, the better the potential performance gain. On the other hand, on non-POSIX systems with CHAR_BIT larger than eight, the memory required for the table is prohibitive. */ #if CHAR_BIT < 10 # define LONG_NEEDLE_THRESHOLD 32U #else # define LONG_NEEDLE_THRESHOLD SIZE_MAX #endif #ifndef MAX # define MAX(a, b) ((a < b) ? (b) : (a)) #endif #ifndef CANON_ELEMENT # define CANON_ELEMENT(c) c #endif #ifndef CMP_FUNC # define CMP_FUNC memcmp #endif /* Perform a critical factorization of NEEDLE, of length NEEDLE_LEN. Return the index of the first byte in the right half, and set *PERIOD to the global period of the right half. The global period of a string is the smallest index (possibly its length) at which all remaining bytes in the string are repetitions of the prefix (the last repetition may be a subset of the prefix). When NEEDLE is factored into two halves, a local period is the length of the smallest word that shares a suffix with the left half and shares a prefix with the right half. All factorizations of a non-empty NEEDLE have a local period of at least 1 and no greater than NEEDLE_LEN. A critical factorization has the property that the local period equals the global period. All strings have at least one critical factorization with the left half smaller than the global period. And while some strings have more than one critical factorization, it is provable that with an ordered alphabet, at least one of the critical factorizations corresponds to a maximal suffix. Given an ordered alphabet, a critical factorization can be computed in linear time, with 2 * NEEDLE_LEN comparisons, by computing the shorter of two ordered maximal suffixes. The ordered maximal suffixes are determined by lexicographic comparison while tracking periodicity. */ static size_t critical_factorization (const unsigned char *needle, size_t needle_len, size_t *period) { /* Index of last byte of left half, or SIZE_MAX. */ size_t max_suffix, max_suffix_rev; size_t j; /* Index into NEEDLE for current candidate suffix. */ size_t k; /* Offset into current period. */ size_t p; /* Intermediate period. */ unsigned char a, b; /* Current comparison bytes. */ /* Special case NEEDLE_LEN of 1 or 2 (all callers already filtered out 0-length needles. */ if (needle_len < 3) { *period = 1; return needle_len - 1; } /* Invariants: 0 <= j < NEEDLE_LEN - 1 -1 <= max_suffix{,_rev} < j (treating SIZE_MAX as if it were signed) min(max_suffix, max_suffix_rev) < global period of NEEDLE 1 <= p <= global period of NEEDLE p == global period of the substring NEEDLE[max_suffix{,_rev}+1...j] 1 <= k <= p */ /* Perform lexicographic search. */ max_suffix = SIZE_MAX; j = 0; k = p = 1; while (j + k < needle_len) { a = CANON_ELEMENT (needle[j + k]); b = CANON_ELEMENT (needle[max_suffix + k]); if (a < b) { /* Suffix is smaller, period is entire prefix so far. */ j += k; k = 1; p = j - max_suffix; } else if (a == b) { /* Advance through repetition of the current period. */ if (k != p) ++k; else { j += p; k = 1; } } else /* b < a */ { /* Suffix is larger, start over from current location. */ max_suffix = j++; k = p = 1; } } *period = p; /* Perform reverse lexicographic search. */ max_suffix_rev = SIZE_MAX; j = 0; k = p = 1; while (j + k < needle_len) { a = CANON_ELEMENT (needle[j + k]); b = CANON_ELEMENT (needle[max_suffix_rev + k]); if (b < a) { /* Suffix is smaller, period is entire prefix so far. */ j += k; k = 1; p = j - max_suffix_rev; } else if (a == b) { /* Advance through repetition of the current period. */ if (k != p) ++k; else { j += p; k = 1; } } else /* a < b */ { /* Suffix is larger, start over from current location. */ max_suffix_rev = j++; k = p = 1; } } /* Choose the shorter suffix. Return the index of the first byte of the right half, rather than the last byte of the left half. For some examples, 'banana' has two critical factorizations, both exposed by the two lexicographic extreme suffixes of 'anana' and 'nana', where both suffixes have a period of 2. On the other hand, with 'aab' and 'bba', both strings have a single critical factorization of the last byte, with the suffix having a period of 1. While the maximal lexicographic suffix of 'aab' is 'b', the maximal lexicographic suffix of 'bba' is 'ba', which is not a critical factorization. Conversely, the maximal reverse lexicographic suffix of 'a' works for 'bba', but not 'ab' for 'aab'. The shorter suffix of the two will always be a critical factorization. */ if (max_suffix_rev + 1 < max_suffix + 1) return max_suffix + 1; *period = p; return max_suffix_rev + 1; } /* Return the first location of non-empty NEEDLE within HAYSTACK, or NULL. HAYSTACK_LEN is the minimum known length of HAYSTACK. This method is optimized for NEEDLE_LEN < LONG_NEEDLE_THRESHOLD. Performance is guaranteed to be linear, with an initialization cost of 2 * NEEDLE_LEN comparisons. If AVAILABLE does not modify HAYSTACK_LEN (as in memmem), then at most 2 * HAYSTACK_LEN - NEEDLE_LEN comparisons occur in searching. If AVAILABLE modifies HAYSTACK_LEN (as in strstr), then at most 3 * HAYSTACK_LEN - NEEDLE_LEN comparisons occur in searching. */ static RETURN_TYPE two_way_short_needle (const unsigned char *haystack, size_t haystack_len, const unsigned char *needle, size_t needle_len) { size_t i; /* Index into current byte of NEEDLE. */ size_t j; /* Index into current window of HAYSTACK. */ size_t period; /* The period of the right half of needle. */ size_t suffix; /* The index of the right half of needle. */ /* Factor the needle into two halves, such that the left half is smaller than the global period, and the right half is periodic (with a period as large as NEEDLE_LEN - suffix). */ suffix = critical_factorization (needle, needle_len, &period); /* Perform the search. Each iteration compares the right half first. */ if (CMP_FUNC (needle, needle + period, suffix) == 0) { /* Entire needle is periodic; a mismatch in the left half can only advance by the period, so use memory to avoid rescanning known occurrences of the period in the right half. */ size_t memory = 0; j = 0; while (AVAILABLE (haystack, haystack_len, j, needle_len)) { /* Scan for matches in right half. */ i = MAX (suffix, memory); while (i < needle_len && (CANON_ELEMENT (needle[i]) == CANON_ELEMENT (haystack[i + j]))) ++i; if (needle_len <= i) { /* Scan for matches in left half. */ i = suffix - 1; while (memory < i + 1 && (CANON_ELEMENT (needle[i]) == CANON_ELEMENT (haystack[i + j]))) --i; if (i + 1 < memory + 1) return (RETURN_TYPE) (haystack + j); /* No match, so remember how many repetitions of period on the right half were scanned. */ j += period; memory = needle_len - period; } else { j += i - suffix + 1; memory = 0; } } } else { /* The two halves of needle are distinct; no extra memory is required, and any mismatch results in a maximal shift. */ period = MAX (suffix, needle_len - suffix) + 1; j = 0; while (AVAILABLE (haystack, haystack_len, j, needle_len)) { /* Scan for matches in right half. */ i = suffix; while (i < needle_len && (CANON_ELEMENT (needle[i]) == CANON_ELEMENT (haystack[i + j]))) ++i; if (needle_len <= i) { /* Scan for matches in left half. */ i = suffix - 1; while (i != SIZE_MAX && (CANON_ELEMENT (needle[i]) == CANON_ELEMENT (haystack[i + j]))) --i; if (i == SIZE_MAX) return (RETURN_TYPE) (haystack + j); j += period; } else j += i - suffix + 1; } } return NULL; } /* Return the first location of non-empty NEEDLE within HAYSTACK, or NULL. HAYSTACK_LEN is the minimum known length of HAYSTACK. This method is optimized for LONG_NEEDLE_THRESHOLD <= NEEDLE_LEN. Performance is guaranteed to be linear, with an initialization cost of 3 * NEEDLE_LEN + (1 << CHAR_BIT) operations. If AVAILABLE does not modify HAYSTACK_LEN (as in memmem), then at most 2 * HAYSTACK_LEN - NEEDLE_LEN comparisons occur in searching, and sublinear performance O(HAYSTACK_LEN / NEEDLE_LEN) is possible. If AVAILABLE modifies HAYSTACK_LEN (as in strstr), then at most 3 * HAYSTACK_LEN - NEEDLE_LEN comparisons occur in searching, and sublinear performance is not possible. */ static RETURN_TYPE two_way_long_needle (const unsigned char *haystack, size_t haystack_len, const unsigned char *needle, size_t needle_len) { size_t i; /* Index into current byte of NEEDLE. */ size_t j; /* Index into current window of HAYSTACK. */ size_t period; /* The period of the right half of needle. */ size_t suffix; /* The index of the right half of needle. */ size_t shift_table[1U << CHAR_BIT]; /* See below. */ /* Factor the needle into two halves, such that the left half is smaller than the global period, and the right half is periodic (with a period as large as NEEDLE_LEN - suffix). */ suffix = critical_factorization (needle, needle_len, &period); /* Populate shift_table. For each possible byte value c, shift_table[c] is the distance from the last occurrence of c to the end of NEEDLE, or NEEDLE_LEN if c is absent from the NEEDLE. shift_table[NEEDLE[NEEDLE_LEN - 1]] contains the only 0. */ for (i = 0; i < 1U << CHAR_BIT; i++) shift_table[i] = needle_len; for (i = 0; i < needle_len; i++) shift_table[CANON_ELEMENT (needle[i])] = needle_len - i - 1; /* Perform the search. Each iteration compares the right half first. */ if (CMP_FUNC (needle, needle + period, suffix) == 0) { /* Entire needle is periodic; a mismatch in the left half can only advance by the period, so use memory to avoid rescanning known occurrences of the period in the right half. */ size_t memory = 0; size_t shift; j = 0; while (AVAILABLE (haystack, haystack_len, j, needle_len)) { /* Check the last byte first; if it does not match, then shift to the next possible match location. */ shift = shift_table[CANON_ELEMENT (haystack[j + needle_len - 1])]; if (0 < shift) { if (memory && shift < period) { /* Since needle is periodic, but the last period has a byte out of place, there can be no match until after the mismatch. */ shift = needle_len - period; } memory = 0; j += shift; continue; } /* Scan for matches in right half. The last byte has already been matched, by virtue of the shift table. */ i = MAX (suffix, memory); while (i < needle_len - 1 && (CANON_ELEMENT (needle[i]) == CANON_ELEMENT (haystack[i + j]))) ++i; if (needle_len - 1 <= i) { /* Scan for matches in left half. */ i = suffix - 1; while (memory < i + 1 && (CANON_ELEMENT (needle[i]) == CANON_ELEMENT (haystack[i + j]))) --i; if (i + 1 < memory + 1) return (RETURN_TYPE) (haystack + j); /* No match, so remember how many repetitions of period on the right half were scanned. */ j += period; memory = needle_len - period; } else { j += i - suffix + 1; memory = 0; } } } else { /* The two halves of needle are distinct; no extra memory is required, and any mismatch results in a maximal shift. */ size_t shift; period = MAX (suffix, needle_len - suffix) + 1; j = 0; while (AVAILABLE (haystack, haystack_len, j, needle_len)) { /* Check the last byte first; if it does not match, then shift to the next possible match location. */ shift = shift_table[CANON_ELEMENT (haystack[j + needle_len - 1])]; if (0 < shift) { j += shift; continue; } /* Scan for matches in right half. The last byte has already been matched, by virtue of the shift table. */ i = suffix; while (i < needle_len - 1 && (CANON_ELEMENT (needle[i]) == CANON_ELEMENT (haystack[i + j]))) ++i; if (needle_len - 1 <= i) { /* Scan for matches in left half. */ i = suffix - 1; while (i != SIZE_MAX && (CANON_ELEMENT (needle[i]) == CANON_ELEMENT (haystack[i + j]))) --i; if (i == SIZE_MAX) return (RETURN_TYPE) (haystack + j); j += period; } else j += i - suffix + 1; } } return NULL; } #undef AVAILABLE #undef CANON_ELEMENT #undef CMP_FUNC #undef MAX #undef RETURN_TYPE pspp-1.4.1/gl/version-etc-fsf.c0000644000175000017500000000220313723215640015673 0ustar00blpblp00000000000000/* Variable with FSF copyright information, for version-etc. Copyright (C) 1999-2006, 2009-2020 Free Software Foundation, Inc. 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 3 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, see . */ /* Written by Jim Meyering. */ #include /* Specification. */ #include "version-etc.h" /* Default copyright goes to the FSF. */ const char version_etc_copyright[] = /* Do *not* mark this string for translation. %s is a copyright symbol suitable for this locale, and %d is the copyright year. */ "Copyright %s %d Free Software Foundation, Inc."; pspp-1.4.1/gl/fd-hook.h0000644000175000017500000001134313723215636014227 0ustar00blpblp00000000000000/* Hook for making file descriptor functions close(), ioctl() extensible. Copyright (C) 2009-2020 Free Software Foundation, Inc. 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 3 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, see . */ #ifndef FD_HOOK_H #define FD_HOOK_H #ifdef __cplusplus extern "C" { #endif /* Currently, this entire code is only needed for the handling of sockets on native Windows platforms. */ #if WINDOWS_SOCKETS /* Type of function that closes FD. */ typedef int (*gl_close_fn) (int fd); /* Type of function that applies a control request to FD. */ typedef int (*gl_ioctl_fn) (int fd, int request, void *arg); /* An element of the list of file descriptor hooks. In CLOS (Common Lisp Object System) speak, it consists of an "around" method for the close() function and an "around" method for the ioctl() function. The fields of this structure are considered private. */ struct fd_hook { /* Doubly linked list. */ struct fd_hook *private_next; struct fd_hook *private_prev; /* Function that treats the types of FD that it knows about and calls execute_close_hooks (REMAINING_LIST, PRIMARY, FD) as a fallback. */ int (*private_close_fn) (const struct fd_hook *remaining_list, gl_close_fn primary, int fd); /* Function that treats the types of FD that it knows about and calls execute_ioctl_hooks (REMAINING_LIST, PRIMARY, FD, REQUEST, ARG) as a fallback. */ int (*private_ioctl_fn) (const struct fd_hook *remaining_list, gl_ioctl_fn primary, int fd, int request, void *arg); }; /* This type of function closes FD, applying special knowledge for the FD types it knows about, and calls execute_close_hooks (REMAINING_LIST, PRIMARY, FD) for the other FD types. In CLOS speak, REMAINING_LIST is the remaining list of "around" methods, and PRIMARY is the "primary" method for close(). */ typedef int (*close_hook_fn) (const struct fd_hook *remaining_list, gl_close_fn primary, int fd); /* Execute the close hooks in REMAINING_LIST, with PRIMARY as "primary" method. Return 0 or -1, like close() would do. */ extern int execute_close_hooks (const struct fd_hook *remaining_list, gl_close_fn primary, int fd); /* Execute all close hooks, with PRIMARY as "primary" method. Return 0 or -1, like close() would do. */ extern int execute_all_close_hooks (gl_close_fn primary, int fd); /* This type of function applies a control request to FD, applying special knowledge for the FD types it knows about, and calls execute_ioctl_hooks (REMAINING_LIST, PRIMARY, FD, REQUEST, ARG) for the other FD types. In CLOS speak, REMAINING_LIST is the remaining list of "around" methods, and PRIMARY is the "primary" method for ioctl(). */ typedef int (*ioctl_hook_fn) (const struct fd_hook *remaining_list, gl_ioctl_fn primary, int fd, int request, void *arg); /* Execute the ioctl hooks in REMAINING_LIST, with PRIMARY as "primary" method. Return 0 or -1, like ioctl() would do. */ extern int execute_ioctl_hooks (const struct fd_hook *remaining_list, gl_ioctl_fn primary, int fd, int request, void *arg); /* Execute all ioctl hooks, with PRIMARY as "primary" method. Return 0 or -1, like ioctl() would do. */ extern int execute_all_ioctl_hooks (gl_ioctl_fn primary, int fd, int request, void *arg); /* Add a function pair to the list of file descriptor hooks. CLOSE_HOOK and IOCTL_HOOK may be NULL, indicating no change. The LINK variable points to a piece of memory which is guaranteed to be accessible until the corresponding call to unregister_fd_hook. */ extern void register_fd_hook (close_hook_fn close_hook, ioctl_hook_fn ioctl_hook, struct fd_hook *link); /* Removes a hook from the list of file descriptor hooks. */ extern void unregister_fd_hook (struct fd_hook *link); #endif #ifdef __cplusplus } #endif #endif /* FD_HOOK_H */ pspp-1.4.1/gl/stdarg.in.h0000644000175000017500000000216313723215640014564 0ustar00blpblp00000000000000/* Substitute for and wrapper around . Copyright (C) 2008-2020 Free Software Foundation, Inc. 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 3, 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, see . */ #ifndef _@GUARD_PREFIX@_STDARG_H #if __GNUC__ >= 3 @PRAGMA_SYSTEM_HEADER@ #endif @PRAGMA_COLUMNS@ /* The include_next requires a split double-inclusion guard. */ #@INCLUDE_NEXT@ @NEXT_STDARG_H@ #ifndef _@GUARD_PREFIX@_STDARG_H #define _@GUARD_PREFIX@_STDARG_H #ifndef va_copy # define va_copy(a,b) ((a) = (b)) #endif #endif /* _@GUARD_PREFIX@_STDARG_H */ #endif /* _@GUARD_PREFIX@_STDARG_H */ pspp-1.4.1/gl/areadlink.c0000644000175000017500000000372513723215636014632 0ustar00blpblp00000000000000/* areadlink.c -- readlink wrapper to return the link name in malloc'd storage Unlike xreadlink and xreadlink_with_size, don't ever call exit. Copyright (C) 2001, 2003-2007, 2009-2020 Free Software Foundation, Inc. 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 3 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, see . */ /* Written by Jim Meyering and Bruno Haible . */ #include /* Specification. */ #include "areadlink.h" #include "careadlinkat.h" #include #include /* Get the symbolic link value of FILENAME and put it into BUFFER, with size BUFFER_SIZE. This function acts like readlink but has readlinkat's signature. */ static ssize_t careadlinkatcwd (int fd, char const *filename, char *buffer, size_t buffer_size) { /* FD must be AT_FDCWD here, otherwise the caller is using this function in contexts it was not meant for. */ if (fd != AT_FDCWD) abort (); return readlink (filename, buffer, buffer_size); } /* Call readlink to get the symbolic link value of FILENAME. Return a pointer to that NUL-terminated string in malloc'd storage. If readlink fails, return NULL and set errno. If allocation fails, or if the link value is longer than SIZE_MAX :-), return NULL and set errno to ENOMEM. */ char * areadlink (char const *filename) { return careadlinkat (AT_FDCWD, filename, NULL, 0, NULL, careadlinkatcwd); } pspp-1.4.1/gl/math.c0000644000175000017500000000014313723215637013621 0ustar00blpblp00000000000000#include #define _GL_MATH_INLINE _GL_EXTERN_INLINE #include "math.h" typedef int dummy; pspp-1.4.1/gl/vsnprintf.c0000644000175000017500000000354113723215640014720 0ustar00blpblp00000000000000/* Formatted output to strings. Copyright (C) 2004, 2006-2020 Free Software Foundation, Inc. Written by Simon Josefsson and Yoann Vandoorselaere . 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 3, 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, see . */ #ifdef HAVE_CONFIG_H # include #endif /* Specification. */ #include #include #include #include #include #include #include "vasnprintf.h" /* Print formatted output to string STR. Similar to vsprintf, but additional length SIZE limit how much is written into STR. Returns string length of formatted string (which may be larger than SIZE). STR may be NULL, in which case nothing will be written. On error, return a negative value. */ int vsnprintf (char *str, size_t size, const char *format, va_list args) { char *output; size_t len; size_t lenbuf = size; output = vasnprintf (str, &lenbuf, format, args); len = lenbuf; if (!output) return -1; if (output != str) { if (size) { size_t pruned_len = (len < size ? len : size - 1); memcpy (str, output, pruned_len); str[pruned_len] = '\0'; } free (output); } if (len > INT_MAX) { errno = EOVERFLOW; return -1; } return len; } pspp-1.4.1/gl/strdup.c0000644000175000017500000000247113723215640014211 0ustar00blpblp00000000000000/* Copyright (C) 1991, 1996-1998, 2002-2004, 2006-2007, 2009-2020 Free Software Foundation, Inc. This file is part of the GNU C Library. 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 3, 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, see . */ #ifndef _LIBC # include #endif /* Get specification. */ #include #include #undef __strdup #ifdef _LIBC # undef strdup #endif #ifndef weak_alias # define __strdup strdup #endif /* Duplicate S, returning an identical malloc'd string. */ char * __strdup (const char *s) { size_t len = strlen (s) + 1; void *new = malloc (len); if (new == NULL) return NULL; return (char *) memcpy (new, s, len); } #ifdef libc_hidden_def libc_hidden_def (__strdup) #endif #ifdef weak_alias weak_alias (__strdup, strdup) #endif pspp-1.4.1/gl/unlocked-io.h0000644000175000017500000000672713723215640015116 0ustar00blpblp00000000000000/* Prefer faster, non-thread-safe stdio functions if available. Copyright (C) 2001-2004, 2009-2020 Free Software Foundation, Inc. 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 3 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, see . */ /* Written by Jim Meyering. */ #ifndef UNLOCKED_IO_H # define UNLOCKED_IO_H 1 /* These are wrappers for functions/macros from the GNU C library, and from other C libraries supporting POSIX's optional thread-safe functions. The standard I/O functions are thread-safe. These *_unlocked ones are more efficient but not thread-safe. That they're not thread-safe is fine since all of the applications in this package are single threaded. Also, some code that is shared with the GNU C library may invoke the *_unlocked functions directly. On hosts that lack those functions, invoke the non-thread-safe versions instead. */ # include # if HAVE_DECL_CLEARERR_UNLOCKED # undef clearerr # define clearerr(x) clearerr_unlocked (x) # else # define clearerr_unlocked(x) clearerr (x) # endif # if HAVE_DECL_FEOF_UNLOCKED # undef feof # define feof(x) feof_unlocked (x) # else # define feof_unlocked(x) feof (x) # endif # if HAVE_DECL_FERROR_UNLOCKED # undef ferror # define ferror(x) ferror_unlocked (x) # else # define ferror_unlocked(x) ferror (x) # endif # if HAVE_DECL_FFLUSH_UNLOCKED # undef fflush # define fflush(x) fflush_unlocked (x) # else # define fflush_unlocked(x) fflush (x) # endif # if HAVE_DECL_FGETS_UNLOCKED # undef fgets # define fgets(x,y,z) fgets_unlocked (x,y,z) # else # define fgets_unlocked(x,y,z) fgets (x,y,z) # endif # if HAVE_DECL_FPUTC_UNLOCKED # undef fputc # define fputc(x,y) fputc_unlocked (x,y) # else # define fputc_unlocked(x,y) fputc (x,y) # endif # if HAVE_DECL_FPUTS_UNLOCKED # undef fputs # define fputs(x,y) fputs_unlocked (x,y) # else # define fputs_unlocked(x,y) fputs (x,y) # endif # if HAVE_DECL_FREAD_UNLOCKED # undef fread # define fread(w,x,y,z) fread_unlocked (w,x,y,z) # else # define fread_unlocked(w,x,y,z) fread (w,x,y,z) # endif # if HAVE_DECL_FWRITE_UNLOCKED # undef fwrite # define fwrite(w,x,y,z) fwrite_unlocked (w,x,y,z) # else # define fwrite_unlocked(w,x,y,z) fwrite (w,x,y,z) # endif # if HAVE_DECL_GETC_UNLOCKED # undef getc # define getc(x) getc_unlocked (x) # else # define getc_unlocked(x) getc (x) # endif # if HAVE_DECL_GETCHAR_UNLOCKED # undef getchar # define getchar() getchar_unlocked () # else # define getchar_unlocked() getchar () # endif # if HAVE_DECL_PUTC_UNLOCKED # undef putc # define putc(x,y) putc_unlocked (x,y) # else # define putc_unlocked(x,y) putc (x,y) # endif # if HAVE_DECL_PUTCHAR_UNLOCKED # undef putchar # define putchar(x) putchar_unlocked (x) # else # define putchar_unlocked(x) putchar (x) # endif # undef flockfile # define flockfile(x) ((void) 0) # undef ftrylockfile # define ftrylockfile(x) 0 # undef funlockfile # define funlockfile(x) ((void) 0) #endif /* UNLOCKED_IO_H */ pspp-1.4.1/gl/round.c0000644000175000017500000001221513723215640014014 0ustar00blpblp00000000000000/* Round toward nearest, breaking ties away from zero. Copyright (C) 2007, 2010-2020 Free Software Foundation, Inc. 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 3, 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, see . */ /* Written by Ben Pfaff , 2007. Based heavily on code by Bruno Haible. */ #if ! defined USE_LONG_DOUBLE # include #endif /* Specification. */ #include #include #undef MIN #ifdef USE_LONG_DOUBLE # define ROUND roundl # define FLOOR floorl # define CEIL ceill # define DOUBLE long double # define MANT_DIG LDBL_MANT_DIG # define MIN LDBL_MIN # define L_(literal) literal##L # define HAVE_FLOOR_AND_CEIL HAVE_FLOORL_AND_CEILL #elif ! defined USE_FLOAT # define ROUND round # define FLOOR floor # define CEIL ceil # define DOUBLE double # define MANT_DIG DBL_MANT_DIG # define MIN DBL_MIN # define L_(literal) literal # define HAVE_FLOOR_AND_CEIL 1 #else /* defined USE_FLOAT */ # define ROUND roundf # define FLOOR floorf # define CEIL ceilf # define DOUBLE float # define MANT_DIG FLT_MANT_DIG # define MIN FLT_MIN # define L_(literal) literal##f # define HAVE_FLOOR_AND_CEIL HAVE_FLOORF_AND_CEILF #endif /* -0.0. See minus-zero.h. */ #if defined __hpux || defined __sgi || defined __ICC # define MINUS_ZERO (-MIN * MIN) #else # define MINUS_ZERO L_(-0.0) #endif /* MSVC with option -fp:strict refuses to compile constant initializers that contain floating-point operations. Pacify this compiler. */ #ifdef _MSC_VER # pragma fenv_access (off) #endif /* If we're being included from test-round2[f].c, it already defined names for our round implementations. Otherwise, pick the preferred implementation for this machine. */ #if !defined FLOOR_BASED_ROUND && !defined FLOOR_FREE_ROUND # if HAVE_FLOOR_AND_CEIL # define FLOOR_BASED_ROUND ROUND # else # define FLOOR_FREE_ROUND ROUND # endif #endif #ifdef FLOOR_BASED_ROUND /* An implementation of the C99 round function based on floor and ceil. We use this when floor and ceil are available, on the assumption that they are faster than the open-coded versions below. */ DOUBLE FLOOR_BASED_ROUND (DOUBLE x) { if (x >= L_(0.0)) { DOUBLE y = FLOOR (x); if (x - y >= L_(0.5)) y += L_(1.0); return y; } else { DOUBLE y = CEIL (x); if (y - x >= L_(0.5)) y -= L_(1.0); return y; } } #endif /* FLOOR_BASED_ROUND */ #ifdef FLOOR_FREE_ROUND /* An implementation of the C99 round function without floor or ceil. We use this when floor or ceil is missing. */ DOUBLE FLOOR_FREE_ROUND (DOUBLE x) { /* 2^(MANT_DIG-1). */ static const DOUBLE TWO_MANT_DIG = /* Assume MANT_DIG <= 5 * 31. Use the identity n = floor(n/5) + floor((n+1)/5) + ... + floor((n+4)/5). */ (DOUBLE) (1U << ((MANT_DIG - 1) / 5)) * (DOUBLE) (1U << ((MANT_DIG - 1 + 1) / 5)) * (DOUBLE) (1U << ((MANT_DIG - 1 + 2) / 5)) * (DOUBLE) (1U << ((MANT_DIG - 1 + 3) / 5)) * (DOUBLE) (1U << ((MANT_DIG - 1 + 4) / 5)); /* The use of 'volatile' guarantees that excess precision bits are dropped at each addition step and before the following comparison at the caller's site. It is necessary on x86 systems where double-floats are not IEEE compliant by default, to avoid that the results become platform and compiler option dependent. 'volatile' is a portable alternative to gcc's -ffloat-store option. */ volatile DOUBLE y = x; volatile DOUBLE z = y; if (z > L_(0.0)) { /* Avoid rounding error for x = 0.5 - 2^(-MANT_DIG-1). */ if (z < L_(0.5)) z = L_(0.0); /* Avoid rounding errors for values near 2^k, where k >= MANT_DIG-1. */ else if (z < TWO_MANT_DIG) { /* Add 0.5 to the absolute value. */ y = z += L_(0.5); /* Round to the next integer (nearest or up or down, doesn't matter). */ z += TWO_MANT_DIG; z -= TWO_MANT_DIG; /* Enforce rounding down. */ if (z > y) z -= L_(1.0); } } else if (z < L_(0.0)) { /* Avoid rounding error for x = -(0.5 - 2^(-MANT_DIG-1)). */ if (z > - L_(0.5)) z = MINUS_ZERO; /* Avoid rounding errors for values near -2^k, where k >= MANT_DIG-1. */ else if (z > -TWO_MANT_DIG) { /* Add 0.5 to the absolute value. */ y = z -= L_(0.5); /* Round to the next integer (nearest or up or down, doesn't matter). */ z -= TWO_MANT_DIG; z += TWO_MANT_DIG; /* Enforce rounding up. */ if (z < y) z += L_(1.0); } } return z; } #endif /* FLOOR_FREE_ROUND */ pspp-1.4.1/gl/inttostr.c0000644000175000017500000000010413723215637014553 0ustar00blpblp00000000000000#define anytostr inttostr #define inttype int #include "anytostr.c" pspp-1.4.1/gl/xmalloc.c0000644000175000017500000000723313723215640014330 0ustar00blpblp00000000000000/* xmalloc.c -- malloc with out of memory checking Copyright (C) 1990-2000, 2002-2006, 2008-2020 Free Software Foundation, Inc. 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 3 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, see . */ #include #define XALLOC_INLINE _GL_EXTERN_INLINE #include "xalloc.h" #include #include /* 1 if calloc, malloc and realloc are known to be compatible with GNU. This matters if we are not also using the calloc-gnu, malloc-gnu and realloc-gnu modules, which define HAVE_CALLOC_GNU, HAVE_MALLOC_GNU and HAVE_REALLOC_GNU and support the GNU API even on non-GNU platforms. */ #if defined HAVE_CALLOC_GNU || (defined __GLIBC__ && !defined __UCLIBC__) enum { HAVE_GNU_CALLOC = 1 }; #else enum { HAVE_GNU_CALLOC = 0 }; #endif #if defined HAVE_MALLOC_GNU || (defined __GLIBC__ && !defined __UCLIBC__) enum { HAVE_GNU_MALLOC = 1 }; #else enum { HAVE_GNU_MALLOC = 0 }; #endif #if defined HAVE_REALLOC_GNU || (defined __GLIBC__ && !defined __UCLIBC__) enum { HAVE_GNU_REALLOC = 1 }; #else enum { HAVE_GNU_REALLOC = 0 }; #endif /* Allocate N bytes of memory dynamically, with error checking. */ void * xmalloc (size_t n) { void *p = malloc (n); if (!p && (HAVE_GNU_MALLOC || n)) xalloc_die (); return p; } /* Change the size of an allocated block of memory P to N bytes, with error checking. */ void * xrealloc (void *p, size_t n) { if (!HAVE_GNU_REALLOC && !n && p) { /* The GNU and C99 realloc behaviors disagree here. Act like GNU. */ free (p); return NULL; } void *r = realloc (p, n); if (!r && (n || (HAVE_GNU_REALLOC && !p))) xalloc_die (); return r; } /* If P is null, allocate a block of at least *PN bytes; otherwise, reallocate P so that it contains more than *PN bytes. *PN must be nonzero unless P is null. Set *PN to the new block's size, and return the pointer to the new block. *PN is never set to zero, and the returned pointer is never null. */ void * x2realloc (void *p, size_t *pn) { return x2nrealloc (p, pn, 1); } /* Allocate N bytes of zeroed memory dynamically, with error checking. There's no need for xnzalloc (N, S), since it would be equivalent to xcalloc (N, S). */ void * xzalloc (size_t n) { return xcalloc (n, 1); } /* Allocate zeroed memory for N elements of S bytes, with error checking. S must be nonzero. */ void * xcalloc (size_t n, size_t s) { void *p; /* Test for overflow, since objects with size greater than PTRDIFF_MAX cause pointer subtraction to go awry. Omit size-zero tests if HAVE_GNU_CALLOC, since GNU calloc never returns NULL if successful. */ if (xalloc_oversized (n, s) || (! (p = calloc (n, s)) && (HAVE_GNU_CALLOC || n != 0))) xalloc_die (); return p; } /* Clone an object P of size S, with error checking. There's no need for xnmemdup (P, N, S), since xmemdup (P, N * S) works without any need for an arithmetic overflow check. */ void * xmemdup (void const *p, size_t s) { return memcpy (xmalloc (s), p, s); } /* Clone STRING. */ char * xstrdup (char const *string) { return xmemdup (string, strlen (string) + 1); } pspp-1.4.1/gl/math.in.h0000644000175000017500000021644713723215637014253 0ustar00blpblp00000000000000/* A GNU-like . Copyright (C) 2002-2003, 2007-2020 Free Software Foundation, Inc. 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 3 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, see . */ #ifndef _@GUARD_PREFIX@_MATH_H #if __GNUC__ >= 3 @PRAGMA_SYSTEM_HEADER@ #endif @PRAGMA_COLUMNS@ /* The include_next requires a split double-inclusion guard. */ #@INCLUDE_NEXT_AS_FIRST_DIRECTIVE@ @NEXT_AS_FIRST_DIRECTIVE_MATH_H@ #ifndef _@GUARD_PREFIX@_MATH_H #define _@GUARD_PREFIX@_MATH_H /* On OpenVMS, NAN, INFINITY, and HUGEVAL macros are defined in . */ #if defined __VMS && ! defined NAN # include #endif #ifndef _GL_INLINE_HEADER_BEGIN #error "Please include config.h first." #endif _GL_INLINE_HEADER_BEGIN #ifndef _GL_MATH_INLINE # define _GL_MATH_INLINE _GL_INLINE #endif /* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */ /* The definition of _GL_ARG_NONNULL is copied here. */ /* The definition of _GL_WARN_ON_USE is copied here. */ #ifdef __cplusplus /* Helper macros to define type-generic function FUNC as overloaded functions, rather than as macros like in C. POSIX declares these with an argument of real-floating (that is, one of float, double, or long double). */ # define _GL_MATH_CXX_REAL_FLOATING_DECL_1(func) \ static inline int \ _gl_cxx_ ## func ## f (float f) \ { \ return func (f); \ } \ static inline int \ _gl_cxx_ ## func ## d (double d) \ { \ return func (d); \ } \ static inline int \ _gl_cxx_ ## func ## l (long double l) \ { \ return func (l); \ } # define _GL_MATH_CXX_REAL_FLOATING_DECL_2(func,rpl_func,rettype) \ _GL_BEGIN_NAMESPACE \ inline rettype \ rpl_func (float f) \ { \ return _gl_cxx_ ## func ## f (f); \ } \ inline rettype \ rpl_func (double d) \ { \ return _gl_cxx_ ## func ## d (d); \ } \ inline rettype \ rpl_func (long double l) \ { \ return _gl_cxx_ ## func ## l (l); \ } \ _GL_END_NAMESPACE #endif /* Helper macros to define a portability warning for the classification macro FUNC called with VALUE. POSIX declares the classification macros with an argument of real-floating (that is, one of float, double, or long double). */ #define _GL_WARN_REAL_FLOATING_DECL(func) \ _GL_MATH_INLINE int \ _GL_WARN_ON_USE_ATTRIBUTE (#func " is unportable - " \ "use gnulib module " #func " for portability") \ rpl_ ## func ## f (float f) \ { \ return func (f); \ } \ _GL_MATH_INLINE int \ _GL_WARN_ON_USE_ATTRIBUTE (#func " is unportable - " \ "use gnulib module " #func " for portability") \ rpl_ ## func ## d (double d) \ { \ return func (d); \ } \ _GL_MATH_INLINE int \ _GL_WARN_ON_USE_ATTRIBUTE (#func " is unportable - " \ "use gnulib module " #func " for portability") \ rpl_ ## func ## l (long double l) \ { \ return func (l); \ } #define _GL_WARN_REAL_FLOATING_IMPL(func, value) \ (sizeof (value) == sizeof (float) ? rpl_ ## func ## f (value) \ : sizeof (value) == sizeof (double) ? rpl_ ## func ## d (value) \ : rpl_ ## func ## l (value)) #if @REPLACE_ITOLD@ /* Pull in a function that fixes the 'int' to 'long double' conversion of glibc 2.7. */ _GL_EXTERN_C void _Qp_itoq (long double *, int); static void (*_gl_math_fix_itold) (long double *, int) = _Qp_itoq; #endif /* POSIX allows platforms that don't support NAN. But all major machines in the past 15 years have supported something close to IEEE NaN, so we define this unconditionally. We also must define it on platforms like Solaris 10, where NAN is present but defined as a function pointer rather than a floating point constant. */ #if !defined NAN || @REPLACE_NAN@ # if !GNULIB_defined_NAN # undef NAN /* The Compaq (ex-DEC) C 6.4 compiler and the Microsoft MSVC 9 compiler choke on the expression 0.0 / 0.0. */ # if defined __DECC || defined _MSC_VER _GL_MATH_INLINE float _NaN () { static float zero = 0.0f; return zero / zero; } # define NAN (_NaN()) # else # define NAN (0.0f / 0.0f) # endif # define GNULIB_defined_NAN 1 # endif #endif /* Solaris 10 defines HUGE_VAL, but as a function pointer rather than a floating point constant. */ #if @REPLACE_HUGE_VAL@ # undef HUGE_VALF # define HUGE_VALF (1.0f / 0.0f) # undef HUGE_VAL # define HUGE_VAL (1.0 / 0.0) # undef HUGE_VALL # define HUGE_VALL (1.0L / 0.0L) #endif /* HUGE_VALF is a 'float' Infinity. */ #ifndef HUGE_VALF # if defined _MSC_VER /* The Microsoft MSVC 9 compiler chokes on the expression 1.0f / 0.0f. */ # define HUGE_VALF (1e25f * 1e25f) # else # define HUGE_VALF (1.0f / 0.0f) # endif #endif /* HUGE_VAL is a 'double' Infinity. */ #ifndef HUGE_VAL # if defined _MSC_VER /* The Microsoft MSVC 9 compiler chokes on the expression 1.0 / 0.0. */ # define HUGE_VAL (1e250 * 1e250) # else # define HUGE_VAL (1.0 / 0.0) # endif #endif /* HUGE_VALL is a 'long double' Infinity. */ #ifndef HUGE_VALL # if defined _MSC_VER /* The Microsoft MSVC 9 compiler chokes on the expression 1.0L / 0.0L. */ # define HUGE_VALL (1e250L * 1e250L) # else # define HUGE_VALL (1.0L / 0.0L) # endif #endif #if defined FP_ILOGB0 && defined FP_ILOGBNAN /* Ensure FP_ILOGB0 and FP_ILOGBNAN are correct. */ # if defined __HAIKU__ /* Haiku: match what ilogb() does */ # undef FP_ILOGB0 # undef FP_ILOGBNAN # define FP_ILOGB0 (- 2147483647 - 1) /* INT_MIN */ # define FP_ILOGBNAN (- 2147483647 - 1) /* INT_MIN */ # endif #else /* Ensure FP_ILOGB0 and FP_ILOGBNAN are defined. */ # if defined __NetBSD__ || defined __sgi /* NetBSD, IRIX 6.5: match what ilogb() does */ # define FP_ILOGB0 (- 2147483647 - 1) /* INT_MIN */ # define FP_ILOGBNAN (- 2147483647 - 1) /* INT_MIN */ # elif defined _AIX /* AIX 5.1: match what ilogb() does in AIX >= 5.2 */ # define FP_ILOGB0 (- 2147483647 - 1) /* INT_MIN */ # define FP_ILOGBNAN 2147483647 /* INT_MAX */ # elif defined __sun /* Solaris 9: match what ilogb() does */ # define FP_ILOGB0 (- 2147483647) /* - INT_MAX */ # define FP_ILOGBNAN 2147483647 /* INT_MAX */ # else /* Gnulib defined values. */ # define FP_ILOGB0 (- 2147483647) /* - INT_MAX */ # define FP_ILOGBNAN (- 2147483647 - 1) /* INT_MIN */ # endif #endif #if @GNULIB_ACOSF@ # if @REPLACE_ACOSF@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef acosf # define acosf rpl_acosf # endif _GL_FUNCDECL_RPL (acosf, float, (float x)); _GL_CXXALIAS_RPL (acosf, float, (float x)); # else # if !@HAVE_ACOSF@ # undef acosf _GL_FUNCDECL_SYS (acosf, float, (float x)); # endif _GL_CXXALIAS_SYS (acosf, float, (float x)); # endif _GL_CXXALIASWARN (acosf); #elif defined GNULIB_POSIXCHECK # undef acosf # if HAVE_RAW_DECL_ACOSF _GL_WARN_ON_USE (acosf, "acosf is unportable - " "use gnulib module acosf for portability"); # endif #endif #if @GNULIB_ACOSL@ # if !@HAVE_ACOSL@ || !@HAVE_DECL_ACOSL@ # undef acosl _GL_FUNCDECL_SYS (acosl, long double, (long double x)); # endif _GL_CXXALIAS_SYS (acosl, long double, (long double x)); _GL_CXXALIASWARN (acosl); #elif defined GNULIB_POSIXCHECK # undef acosl # if HAVE_RAW_DECL_ACOSL _GL_WARN_ON_USE (acosl, "acosl is unportable - " "use gnulib module acosl for portability"); # endif #endif #if @GNULIB_ASINF@ # if @REPLACE_ASINF@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef asinf # define asinf rpl_asinf # endif _GL_FUNCDECL_RPL (asinf, float, (float x)); _GL_CXXALIAS_RPL (asinf, float, (float x)); # else # if !@HAVE_ASINF@ # undef asinf _GL_FUNCDECL_SYS (asinf, float, (float x)); # endif _GL_CXXALIAS_SYS (asinf, float, (float x)); # endif _GL_CXXALIASWARN (asinf); #elif defined GNULIB_POSIXCHECK # undef asinf # if HAVE_RAW_DECL_ASINF _GL_WARN_ON_USE (asinf, "asinf is unportable - " "use gnulib module asinf for portability"); # endif #endif #if @GNULIB_ASINL@ # if !@HAVE_ASINL@ || !@HAVE_DECL_ASINL@ # undef asinl _GL_FUNCDECL_SYS (asinl, long double, (long double x)); # endif _GL_CXXALIAS_SYS (asinl, long double, (long double x)); _GL_CXXALIASWARN (asinl); #elif defined GNULIB_POSIXCHECK # undef asinl # if HAVE_RAW_DECL_ASINL _GL_WARN_ON_USE (asinl, "asinl is unportable - " "use gnulib module asinl for portability"); # endif #endif #if @GNULIB_ATANF@ # if @REPLACE_ATANF@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef atanf # define atanf rpl_atanf # endif _GL_FUNCDECL_RPL (atanf, float, (float x)); _GL_CXXALIAS_RPL (atanf, float, (float x)); # else # if !@HAVE_ATANF@ # undef atanf _GL_FUNCDECL_SYS (atanf, float, (float x)); # endif _GL_CXXALIAS_SYS (atanf, float, (float x)); # endif _GL_CXXALIASWARN (atanf); #elif defined GNULIB_POSIXCHECK # undef atanf # if HAVE_RAW_DECL_ATANF _GL_WARN_ON_USE (atanf, "atanf is unportable - " "use gnulib module atanf for portability"); # endif #endif #if @GNULIB_ATANL@ # if !@HAVE_ATANL@ || !@HAVE_DECL_ATANL@ # undef atanl _GL_FUNCDECL_SYS (atanl, long double, (long double x)); # endif _GL_CXXALIAS_SYS (atanl, long double, (long double x)); _GL_CXXALIASWARN (atanl); #elif defined GNULIB_POSIXCHECK # undef atanl # if HAVE_RAW_DECL_ATANL _GL_WARN_ON_USE (atanl, "atanl is unportable - " "use gnulib module atanl for portability"); # endif #endif #if @GNULIB_ATAN2F@ # if @REPLACE_ATAN2F@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef atan2f # define atan2f rpl_atan2f # endif _GL_FUNCDECL_RPL (atan2f, float, (float y, float x)); _GL_CXXALIAS_RPL (atan2f, float, (float y, float x)); # else # if !@HAVE_ATAN2F@ # undef atan2f _GL_FUNCDECL_SYS (atan2f, float, (float y, float x)); # endif _GL_CXXALIAS_SYS (atan2f, float, (float y, float x)); # endif _GL_CXXALIASWARN (atan2f); #elif defined GNULIB_POSIXCHECK # undef atan2f # if HAVE_RAW_DECL_ATAN2F _GL_WARN_ON_USE (atan2f, "atan2f is unportable - " "use gnulib module atan2f for portability"); # endif #endif #if @GNULIB_CBRTF@ # if @REPLACE_CBRTF@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef cbrtf # define cbrtf rpl_cbrtf # endif _GL_FUNCDECL_RPL (cbrtf, float, (float x)); _GL_CXXALIAS_RPL (cbrtf, float, (float x)); # else # if !@HAVE_DECL_CBRTF@ _GL_FUNCDECL_SYS (cbrtf, float, (float x)); # endif _GL_CXXALIAS_SYS (cbrtf, float, (float x)); # endif _GL_CXXALIASWARN (cbrtf); #elif defined GNULIB_POSIXCHECK # undef cbrtf # if HAVE_RAW_DECL_CBRTF _GL_WARN_ON_USE (cbrtf, "cbrtf is unportable - " "use gnulib module cbrtf for portability"); # endif #endif #if @GNULIB_CBRT@ # if !@HAVE_CBRT@ _GL_FUNCDECL_SYS (cbrt, double, (double x)); # endif _GL_CXXALIAS_SYS (cbrt, double, (double x)); # if __GLIBC__ >= 2 _GL_CXXALIASWARN (cbrt); # endif #elif defined GNULIB_POSIXCHECK # undef cbrt # if HAVE_RAW_DECL_CBRT _GL_WARN_ON_USE (cbrt, "cbrt is unportable - " "use gnulib module cbrt for portability"); # endif #endif #if @GNULIB_CBRTL@ # if @REPLACE_CBRTL@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef cbrtl # define cbrtl rpl_cbrtl # endif _GL_FUNCDECL_RPL (cbrtl, long double, (long double x)); _GL_CXXALIAS_RPL (cbrtl, long double, (long double x)); # else # if !@HAVE_DECL_CBRTL@ _GL_FUNCDECL_SYS (cbrtl, long double, (long double x)); # endif _GL_CXXALIAS_SYS (cbrtl, long double, (long double x)); # endif _GL_CXXALIASWARN (cbrtl); #elif defined GNULIB_POSIXCHECK # undef cbrtl # if HAVE_RAW_DECL_CBRTL _GL_WARN_ON_USE (cbrtl, "cbrtl is unportable - " "use gnulib module cbrtl for portability"); # endif #endif #if @GNULIB_CEILF@ # if @REPLACE_CEILF@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef ceilf # define ceilf rpl_ceilf # endif _GL_FUNCDECL_RPL (ceilf, float, (float x)); _GL_CXXALIAS_RPL (ceilf, float, (float x)); # else # if !@HAVE_DECL_CEILF@ # undef ceilf _GL_FUNCDECL_SYS (ceilf, float, (float x)); # endif _GL_CXXALIAS_SYS (ceilf, float, (float x)); # endif _GL_CXXALIASWARN (ceilf); #elif defined GNULIB_POSIXCHECK # undef ceilf # if HAVE_RAW_DECL_CEILF _GL_WARN_ON_USE (ceilf, "ceilf is unportable - " "use gnulib module ceilf for portability"); # endif #endif #if @GNULIB_CEIL@ # if @REPLACE_CEIL@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef ceil # define ceil rpl_ceil # endif _GL_FUNCDECL_RPL (ceil, double, (double x)); _GL_CXXALIAS_RPL (ceil, double, (double x)); # else _GL_CXXALIAS_SYS (ceil, double, (double x)); # endif # if __GLIBC__ >= 2 _GL_CXXALIASWARN (ceil); # endif #endif #if @GNULIB_CEILL@ # if @REPLACE_CEILL@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef ceill # define ceill rpl_ceill # endif _GL_FUNCDECL_RPL (ceill, long double, (long double x)); _GL_CXXALIAS_RPL (ceill, long double, (long double x)); # else # if !@HAVE_DECL_CEILL@ # undef ceill _GL_FUNCDECL_SYS (ceill, long double, (long double x)); # endif _GL_CXXALIAS_SYS (ceill, long double, (long double x)); # endif _GL_CXXALIASWARN (ceill); #elif defined GNULIB_POSIXCHECK # undef ceill # if HAVE_RAW_DECL_CEILL _GL_WARN_ON_USE (ceill, "ceill is unportable - " "use gnulib module ceill for portability"); # endif #endif #if @GNULIB_COPYSIGNF@ # if !@HAVE_DECL_COPYSIGNF@ # undef copysignf _GL_FUNCDECL_SYS (copysignf, float, (float x, float y)); # endif _GL_CXXALIAS_SYS (copysignf, float, (float x, float y)); _GL_CXXALIASWARN (copysignf); #elif defined GNULIB_POSIXCHECK # undef copysignf # if HAVE_RAW_DECL_COPYSIGNF _GL_WARN_ON_USE (copysignf, "copysignf is unportable - " "use gnulib module copysignf for portability"); # endif #endif #if @GNULIB_COPYSIGN@ # if !@HAVE_COPYSIGN@ _GL_FUNCDECL_SYS (copysign, double, (double x, double y)); # endif _GL_CXXALIAS_SYS (copysign, double, (double x, double y)); # if __GLIBC__ >= 2 _GL_CXXALIASWARN (copysign); # endif #elif defined GNULIB_POSIXCHECK # undef copysign # if HAVE_RAW_DECL_COPYSIGN _GL_WARN_ON_USE (copysign, "copysign is unportable - " "use gnulib module copysign for portability"); # endif #endif #if @GNULIB_COPYSIGNL@ # if !@HAVE_COPYSIGNL@ _GL_FUNCDECL_SYS (copysignl, long double, (long double x, long double y)); # endif _GL_CXXALIAS_SYS (copysignl, long double, (long double x, long double y)); _GL_CXXALIASWARN (copysignl); #elif defined GNULIB_POSIXCHECK # undef copysignl # if HAVE_RAW_DECL_COPYSIGNL _GL_WARN_ON_USE (copysign, "copysignl is unportable - " "use gnulib module copysignl for portability"); # endif #endif #if @GNULIB_COSF@ # if @REPLACE_COSF@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef cosf # define cosf rpl_cosf # endif _GL_FUNCDECL_RPL (cosf, float, (float x)); _GL_CXXALIAS_RPL (cosf, float, (float x)); # else # if !@HAVE_COSF@ # undef cosf _GL_FUNCDECL_SYS (cosf, float, (float x)); # endif _GL_CXXALIAS_SYS (cosf, float, (float x)); # endif _GL_CXXALIASWARN (cosf); #elif defined GNULIB_POSIXCHECK # undef cosf # if HAVE_RAW_DECL_COSF _GL_WARN_ON_USE (cosf, "cosf is unportable - " "use gnulib module cosf for portability"); # endif #endif #if @GNULIB_COSL@ # if !@HAVE_COSL@ || !@HAVE_DECL_COSL@ # undef cosl _GL_FUNCDECL_SYS (cosl, long double, (long double x)); # endif _GL_CXXALIAS_SYS (cosl, long double, (long double x)); _GL_CXXALIASWARN (cosl); #elif defined GNULIB_POSIXCHECK # undef cosl # if HAVE_RAW_DECL_COSL _GL_WARN_ON_USE (cosl, "cosl is unportable - " "use gnulib module cosl for portability"); # endif #endif #if @GNULIB_COSHF@ # if @REPLACE_COSHF@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef coshf # define coshf rpl_coshf # endif _GL_FUNCDECL_RPL (coshf, float, (float x)); _GL_CXXALIAS_RPL (coshf, float, (float x)); # else # if !@HAVE_COSHF@ # undef coshf _GL_FUNCDECL_SYS (coshf, float, (float x)); # endif _GL_CXXALIAS_SYS (coshf, float, (float x)); # endif _GL_CXXALIASWARN (coshf); #elif defined GNULIB_POSIXCHECK # undef coshf # if HAVE_RAW_DECL_COSHF _GL_WARN_ON_USE (coshf, "coshf is unportable - " "use gnulib module coshf for portability"); # endif #endif #if @GNULIB_EXPF@ # if @REPLACE_EXPF@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef expf # define expf rpl_expf # endif _GL_FUNCDECL_RPL (expf, float, (float x)); _GL_CXXALIAS_RPL (expf, float, (float x)); # else # if !@HAVE_EXPF@ # undef expf _GL_FUNCDECL_SYS (expf, float, (float x)); # endif _GL_CXXALIAS_SYS (expf, float, (float x)); # endif _GL_CXXALIASWARN (expf); #elif defined GNULIB_POSIXCHECK # undef expf # if HAVE_RAW_DECL_EXPF _GL_WARN_ON_USE (expf, "expf is unportable - " "use gnulib module expf for portability"); # endif #endif #if @GNULIB_EXPL@ # if @REPLACE_EXPL@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef expl # define expl rpl_expl # endif _GL_FUNCDECL_RPL (expl, long double, (long double x)); _GL_CXXALIAS_RPL (expl, long double, (long double x)); # else # if !@HAVE_EXPL@ || !@HAVE_DECL_EXPL@ # undef expl _GL_FUNCDECL_SYS (expl, long double, (long double x)); # endif _GL_CXXALIAS_SYS (expl, long double, (long double x)); # endif _GL_CXXALIASWARN (expl); #elif defined GNULIB_POSIXCHECK # undef expl # if HAVE_RAW_DECL_EXPL _GL_WARN_ON_USE (expl, "expl is unportable - " "use gnulib module expl for portability"); # endif #endif #if @GNULIB_EXP2F@ # if !@HAVE_DECL_EXP2F@ _GL_FUNCDECL_SYS (exp2f, float, (float x)); # endif _GL_CXXALIAS_SYS (exp2f, float, (float x)); _GL_CXXALIASWARN (exp2f); #elif defined GNULIB_POSIXCHECK # undef exp2f # if HAVE_RAW_DECL_EXP2F _GL_WARN_ON_USE (exp2f, "exp2f is unportable - " "use gnulib module exp2f for portability"); # endif #endif #if @GNULIB_EXP2@ # if @REPLACE_EXP2@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef exp2 # define exp2 rpl_exp2 # endif _GL_FUNCDECL_RPL (exp2, double, (double x)); _GL_CXXALIAS_RPL (exp2, double, (double x)); # else # if !@HAVE_DECL_EXP2@ _GL_FUNCDECL_SYS (exp2, double, (double x)); # endif _GL_CXXALIAS_SYS (exp2, double, (double x)); # endif # if __GLIBC__ >= 2 _GL_CXXALIASWARN (exp2); # endif #elif defined GNULIB_POSIXCHECK # undef exp2 # if HAVE_RAW_DECL_EXP2 _GL_WARN_ON_USE (exp2, "exp2 is unportable - " "use gnulib module exp2 for portability"); # endif #endif #if @GNULIB_EXP2L@ # if @REPLACE_EXP2L@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef exp2l # define exp2l rpl_exp2l # endif _GL_FUNCDECL_RPL (exp2l, long double, (long double x)); _GL_CXXALIAS_RPL (exp2l, long double, (long double x)); # else # if !@HAVE_DECL_EXP2L@ # undef exp2l _GL_FUNCDECL_SYS (exp2l, long double, (long double x)); # endif _GL_CXXALIAS_SYS (exp2l, long double, (long double x)); # endif _GL_CXXALIASWARN (exp2l); #elif defined GNULIB_POSIXCHECK # undef exp2l # if HAVE_RAW_DECL_EXP2L _GL_WARN_ON_USE (exp2l, "exp2l is unportable - " "use gnulib module exp2l for portability"); # endif #endif #if @GNULIB_EXPM1F@ # if @REPLACE_EXPM1F@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef expm1f # define expm1f rpl_expm1f # endif _GL_FUNCDECL_RPL (expm1f, float, (float x)); _GL_CXXALIAS_RPL (expm1f, float, (float x)); # else # if !@HAVE_EXPM1F@ _GL_FUNCDECL_SYS (expm1f, float, (float x)); # endif _GL_CXXALIAS_SYS (expm1f, float, (float x)); # endif _GL_CXXALIASWARN (expm1f); #elif defined GNULIB_POSIXCHECK # undef expm1f # if HAVE_RAW_DECL_EXPM1F _GL_WARN_ON_USE (expm1f, "expm1f is unportable - " "use gnulib module expm1f for portability"); # endif #endif #if @GNULIB_EXPM1@ # if @REPLACE_EXPM1@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef expm1 # define expm1 rpl_expm1 # endif _GL_FUNCDECL_RPL (expm1, double, (double x)); _GL_CXXALIAS_RPL (expm1, double, (double x)); # else # if !@HAVE_EXPM1@ _GL_FUNCDECL_SYS (expm1, double, (double x)); # endif _GL_CXXALIAS_SYS (expm1, double, (double x)); # endif # if __GLIBC__ >= 2 _GL_CXXALIASWARN (expm1); # endif #elif defined GNULIB_POSIXCHECK # undef expm1 # if HAVE_RAW_DECL_EXPM1 _GL_WARN_ON_USE (expm1, "expm1 is unportable - " "use gnulib module expm1 for portability"); # endif #endif #if @GNULIB_EXPM1L@ # if @REPLACE_EXPM1L@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef expm1l # define expm1l rpl_expm1l # endif _GL_FUNCDECL_RPL (expm1l, long double, (long double x)); _GL_CXXALIAS_RPL (expm1l, long double, (long double x)); # else # if !@HAVE_DECL_EXPM1L@ # undef expm1l # if !(defined __cplusplus && defined _AIX) _GL_FUNCDECL_SYS (expm1l, long double, (long double x)); # endif # endif _GL_CXXALIAS_SYS (expm1l, long double, (long double x)); # endif _GL_CXXALIASWARN (expm1l); #elif defined GNULIB_POSIXCHECK # undef expm1l # if HAVE_RAW_DECL_EXPM1L _GL_WARN_ON_USE (expm1l, "expm1l is unportable - " "use gnulib module expm1l for portability"); # endif #endif #if @GNULIB_FABSF@ # if !@HAVE_FABSF@ # undef fabsf _GL_FUNCDECL_SYS (fabsf, float, (float x)); # endif _GL_CXXALIAS_SYS (fabsf, float, (float x)); _GL_CXXALIASWARN (fabsf); #elif defined GNULIB_POSIXCHECK # undef fabsf # if HAVE_RAW_DECL_FABSF _GL_WARN_ON_USE (fabsf, "fabsf is unportable - " "use gnulib module fabsf for portability"); # endif #endif #if @GNULIB_FABSL@ # if @REPLACE_FABSL@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef fabsl # define fabsl rpl_fabsl # endif _GL_FUNCDECL_RPL (fabsl, long double, (long double x)); _GL_CXXALIAS_RPL (fabsl, long double, (long double x)); # else # if !@HAVE_FABSL@ # undef fabsl _GL_FUNCDECL_SYS (fabsl, long double, (long double x)); # endif _GL_CXXALIAS_SYS (fabsl, long double, (long double x)); # endif _GL_CXXALIASWARN (fabsl); #elif defined GNULIB_POSIXCHECK # undef fabsl # if HAVE_RAW_DECL_FABSL _GL_WARN_ON_USE (fabsl, "fabsl is unportable - " "use gnulib module fabsl for portability"); # endif #endif #if @GNULIB_FLOORF@ # if @REPLACE_FLOORF@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef floorf # define floorf rpl_floorf # endif _GL_FUNCDECL_RPL (floorf, float, (float x)); _GL_CXXALIAS_RPL (floorf, float, (float x)); # else # if !@HAVE_DECL_FLOORF@ # undef floorf _GL_FUNCDECL_SYS (floorf, float, (float x)); # endif _GL_CXXALIAS_SYS (floorf, float, (float x)); # endif _GL_CXXALIASWARN (floorf); #elif defined GNULIB_POSIXCHECK # undef floorf # if HAVE_RAW_DECL_FLOORF _GL_WARN_ON_USE (floorf, "floorf is unportable - " "use gnulib module floorf for portability"); # endif #endif #if @GNULIB_FLOOR@ # if @REPLACE_FLOOR@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef floor # define floor rpl_floor # endif _GL_FUNCDECL_RPL (floor, double, (double x)); _GL_CXXALIAS_RPL (floor, double, (double x)); # else _GL_CXXALIAS_SYS (floor, double, (double x)); # endif # if __GLIBC__ >= 2 _GL_CXXALIASWARN (floor); # endif #endif #if @GNULIB_FLOORL@ # if @REPLACE_FLOORL@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef floorl # define floorl rpl_floorl # endif _GL_FUNCDECL_RPL (floorl, long double, (long double x)); _GL_CXXALIAS_RPL (floorl, long double, (long double x)); # else # if !@HAVE_DECL_FLOORL@ # undef floorl _GL_FUNCDECL_SYS (floorl, long double, (long double x)); # endif _GL_CXXALIAS_SYS (floorl, long double, (long double x)); # endif _GL_CXXALIASWARN (floorl); #elif defined GNULIB_POSIXCHECK # undef floorl # if HAVE_RAW_DECL_FLOORL _GL_WARN_ON_USE (floorl, "floorl is unportable - " "use gnulib module floorl for portability"); # endif #endif #if @GNULIB_FMAF@ # if @REPLACE_FMAF@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef fmaf # define fmaf rpl_fmaf # endif _GL_FUNCDECL_RPL (fmaf, float, (float x, float y, float z)); _GL_CXXALIAS_RPL (fmaf, float, (float x, float y, float z)); # else # if !@HAVE_FMAF@ # undef fmaf _GL_FUNCDECL_SYS (fmaf, float, (float x, float y, float z)); # endif _GL_CXXALIAS_SYS (fmaf, float, (float x, float y, float z)); # endif _GL_CXXALIASWARN (fmaf); #elif defined GNULIB_POSIXCHECK # undef fmaf # if HAVE_RAW_DECL_FMAF _GL_WARN_ON_USE (fmaf, "fmaf is unportable - " "use gnulib module fmaf for portability"); # endif #endif #if @GNULIB_FMA@ # if @REPLACE_FMA@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef fma # define fma rpl_fma # endif _GL_FUNCDECL_RPL (fma, double, (double x, double y, double z)); _GL_CXXALIAS_RPL (fma, double, (double x, double y, double z)); # else # if !@HAVE_FMA@ # undef fma _GL_FUNCDECL_SYS (fma, double, (double x, double y, double z)); # endif _GL_CXXALIAS_SYS (fma, double, (double x, double y, double z)); # endif # if __GLIBC__ >= 2 _GL_CXXALIASWARN (fma); # endif #elif defined GNULIB_POSIXCHECK # undef fma # if HAVE_RAW_DECL_FMA _GL_WARN_ON_USE (fma, "fma is unportable - " "use gnulib module fma for portability"); # endif #endif #if @GNULIB_FMAL@ # if @REPLACE_FMAL@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef fmal # define fmal rpl_fmal # endif _GL_FUNCDECL_RPL (fmal, long double, (long double x, long double y, long double z)); _GL_CXXALIAS_RPL (fmal, long double, (long double x, long double y, long double z)); # else # if !@HAVE_FMAL@ # undef fmal # if !(defined __cplusplus && defined _AIX) _GL_FUNCDECL_SYS (fmal, long double, (long double x, long double y, long double z)); # endif # endif _GL_CXXALIAS_SYS (fmal, long double, (long double x, long double y, long double z)); # endif _GL_CXXALIASWARN (fmal); #elif defined GNULIB_POSIXCHECK # undef fmal # if HAVE_RAW_DECL_FMAL _GL_WARN_ON_USE (fmal, "fmal is unportable - " "use gnulib module fmal for portability"); # endif #endif #if @GNULIB_FMODF@ # if @REPLACE_FMODF@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef fmodf # define fmodf rpl_fmodf # endif _GL_FUNCDECL_RPL (fmodf, float, (float x, float y)); _GL_CXXALIAS_RPL (fmodf, float, (float x, float y)); # else # if !@HAVE_FMODF@ # undef fmodf _GL_FUNCDECL_SYS (fmodf, float, (float x, float y)); # endif _GL_CXXALIAS_SYS (fmodf, float, (float x, float y)); # endif _GL_CXXALIASWARN (fmodf); #elif defined GNULIB_POSIXCHECK # undef fmodf # if HAVE_RAW_DECL_FMODF _GL_WARN_ON_USE (fmodf, "fmodf is unportable - " "use gnulib module fmodf for portability"); # endif #endif #if @GNULIB_FMOD@ # if @REPLACE_FMOD@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef fmod # define fmod rpl_fmod # endif _GL_FUNCDECL_RPL (fmod, double, (double x, double y)); _GL_CXXALIAS_RPL (fmod, double, (double x, double y)); # else _GL_CXXALIAS_SYS (fmod, double, (double x, double y)); # endif # if __GLIBC__ >= 2 _GL_CXXALIASWARN (fmod); # endif #elif defined GNULIB_POSIXCHECK # undef fmod # if HAVE_RAW_DECL_FMOD _GL_WARN_ON_USE (fmod, "fmod has portability problems - " "use gnulib module fmod for portability"); # endif #endif #if @GNULIB_FMODL@ # if @REPLACE_FMODL@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef fmodl # define fmodl rpl_fmodl # endif _GL_FUNCDECL_RPL (fmodl, long double, (long double x, long double y)); _GL_CXXALIAS_RPL (fmodl, long double, (long double x, long double y)); # else # if !@HAVE_FMODL@ # undef fmodl _GL_FUNCDECL_SYS (fmodl, long double, (long double x, long double y)); # endif _GL_CXXALIAS_SYS (fmodl, long double, (long double x, long double y)); # endif _GL_CXXALIASWARN (fmodl); #elif defined GNULIB_POSIXCHECK # undef fmodl # if HAVE_RAW_DECL_FMODL _GL_WARN_ON_USE (fmodl, "fmodl is unportable - " "use gnulib module fmodl for portability"); # endif #endif /* Write x as x = mantissa * 2^exp where If x finite and nonzero: 0.5 <= |mantissa| < 1.0. If x is zero: mantissa = x, exp = 0. If x is infinite or NaN: mantissa = x, exp unspecified. Store exp in *EXPPTR and return mantissa. */ #if @GNULIB_FREXPF@ # if @REPLACE_FREXPF@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef frexpf # define frexpf rpl_frexpf # endif _GL_FUNCDECL_RPL (frexpf, float, (float x, int *expptr) _GL_ARG_NONNULL ((2))); _GL_CXXALIAS_RPL (frexpf, float, (float x, int *expptr)); # else # if !@HAVE_FREXPF@ # undef frexpf _GL_FUNCDECL_SYS (frexpf, float, (float x, int *expptr) _GL_ARG_NONNULL ((2))); # endif _GL_CXXALIAS_SYS (frexpf, float, (float x, int *expptr)); # endif _GL_CXXALIASWARN (frexpf); #elif defined GNULIB_POSIXCHECK # undef frexpf # if HAVE_RAW_DECL_FREXPF _GL_WARN_ON_USE (frexpf, "frexpf is unportable - " "use gnulib module frexpf for portability"); # endif #endif /* Write x as x = mantissa * 2^exp where If x finite and nonzero: 0.5 <= |mantissa| < 1.0. If x is zero: mantissa = x, exp = 0. If x is infinite or NaN: mantissa = x, exp unspecified. Store exp in *EXPPTR and return mantissa. */ #if @GNULIB_FREXP@ # if @REPLACE_FREXP@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef frexp # define frexp rpl_frexp # endif _GL_FUNCDECL_RPL (frexp, double, (double x, int *expptr) _GL_ARG_NONNULL ((2))); _GL_CXXALIAS_RPL (frexp, double, (double x, int *expptr)); # else _GL_CXXALIAS_SYS (frexp, double, (double x, int *expptr)); # endif # if __GLIBC__ >= 2 _GL_CXXALIASWARN1 (frexp, double, (double x, int *expptr)); # endif #elif defined GNULIB_POSIXCHECK # undef frexp /* Assume frexp is always declared. */ _GL_WARN_ON_USE (frexp, "frexp is unportable - " "use gnulib module frexp for portability"); #endif /* Write x as x = mantissa * 2^exp where If x finite and nonzero: 0.5 <= |mantissa| < 1.0. If x is zero: mantissa = x, exp = 0. If x is infinite or NaN: mantissa = x, exp unspecified. Store exp in *EXPPTR and return mantissa. */ #if @GNULIB_FREXPL@ && @REPLACE_FREXPL@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef frexpl # define frexpl rpl_frexpl # endif _GL_FUNCDECL_RPL (frexpl, long double, (long double x, int *expptr) _GL_ARG_NONNULL ((2))); _GL_CXXALIAS_RPL (frexpl, long double, (long double x, int *expptr)); #else # if !@HAVE_DECL_FREXPL@ _GL_FUNCDECL_SYS (frexpl, long double, (long double x, int *expptr) _GL_ARG_NONNULL ((2))); # endif # if @GNULIB_FREXPL@ _GL_CXXALIAS_SYS (frexpl, long double, (long double x, int *expptr)); # endif #endif #if @GNULIB_FREXPL@ && !(@REPLACE_FREXPL@ && !@HAVE_DECL_FREXPL@) _GL_CXXALIASWARN (frexpl); #endif #if !@GNULIB_FREXPL@ && defined GNULIB_POSIXCHECK # undef frexpl # if HAVE_RAW_DECL_FREXPL _GL_WARN_ON_USE (frexpl, "frexpl is unportable - " "use gnulib module frexpl for portability"); # endif #endif /* Return sqrt(x^2+y^2). */ #if @GNULIB_HYPOTF@ # if @REPLACE_HYPOTF@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef hypotf # define hypotf rpl_hypotf # endif _GL_FUNCDECL_RPL (hypotf, float, (float x, float y)); _GL_CXXALIAS_RPL (hypotf, float, (float x, float y)); # else # if !@HAVE_HYPOTF@ _GL_FUNCDECL_SYS (hypotf, float, (float x, float y)); # endif _GL_CXXALIAS_SYS (hypotf, float, (float x, float y)); # endif _GL_CXXALIASWARN (hypotf); #elif defined GNULIB_POSIXCHECK # undef hypotf # if HAVE_RAW_DECL_HYPOTF _GL_WARN_ON_USE (hypotf, "hypotf is unportable - " "use gnulib module hypotf for portability"); # endif #endif /* Return sqrt(x^2+y^2). */ #if @GNULIB_HYPOT@ # if @REPLACE_HYPOT@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef hypot # define hypot rpl_hypot # endif _GL_FUNCDECL_RPL (hypot, double, (double x, double y)); _GL_CXXALIAS_RPL (hypot, double, (double x, double y)); # else _GL_CXXALIAS_SYS (hypot, double, (double x, double y)); # endif # if __GLIBC__ >= 2 _GL_CXXALIASWARN (hypot); # endif #elif defined GNULIB_POSIXCHECK # undef hypot # if HAVE_RAW_DECL_HYPOT _GL_WARN_ON_USE (hypotf, "hypot has portability problems - " "use gnulib module hypot for portability"); # endif #endif /* Return sqrt(x^2+y^2). */ #if @GNULIB_HYPOTL@ # if @REPLACE_HYPOTL@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef hypotl # define hypotl rpl_hypotl # endif _GL_FUNCDECL_RPL (hypotl, long double, (long double x, long double y)); _GL_CXXALIAS_RPL (hypotl, long double, (long double x, long double y)); # else # if !@HAVE_HYPOTL@ _GL_FUNCDECL_SYS (hypotl, long double, (long double x, long double y)); # endif _GL_CXXALIAS_SYS (hypotl, long double, (long double x, long double y)); # endif _GL_CXXALIASWARN (hypotl); #elif defined GNULIB_POSIXCHECK # undef hypotl # if HAVE_RAW_DECL_HYPOTL _GL_WARN_ON_USE (hypotl, "hypotl is unportable - " "use gnulib module hypotl for portability"); # endif #endif #if @GNULIB_ILOGBF@ # if @REPLACE_ILOGBF@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef ilogbf # define ilogbf rpl_ilogbf # endif _GL_FUNCDECL_RPL (ilogbf, int, (float x)); _GL_CXXALIAS_RPL (ilogbf, int, (float x)); # else # if !@HAVE_ILOGBF@ _GL_FUNCDECL_SYS (ilogbf, int, (float x)); # endif _GL_CXXALIAS_SYS (ilogbf, int, (float x)); # endif _GL_CXXALIASWARN (ilogbf); #elif defined GNULIB_POSIXCHECK # undef ilogbf # if HAVE_RAW_DECL_ILOGBF _GL_WARN_ON_USE (ilogbf, "ilogbf is unportable - " "use gnulib module ilogbf for portability"); # endif #endif #if @GNULIB_ILOGB@ # if @REPLACE_ILOGB@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef ilogb # define ilogb rpl_ilogb # endif _GL_FUNCDECL_RPL (ilogb, int, (double x)); _GL_CXXALIAS_RPL (ilogb, int, (double x)); # else # if !@HAVE_ILOGB@ _GL_FUNCDECL_SYS (ilogb, int, (double x)); # endif _GL_CXXALIAS_SYS (ilogb, int, (double x)); # endif # if __GLIBC__ >= 2 _GL_CXXALIASWARN (ilogb); # endif #elif defined GNULIB_POSIXCHECK # undef ilogb # if HAVE_RAW_DECL_ILOGB _GL_WARN_ON_USE (ilogb, "ilogb is unportable - " "use gnulib module ilogb for portability"); # endif #endif #if @GNULIB_ILOGBL@ # if @REPLACE_ILOGBL@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef ilogbl # define ilogbl rpl_ilogbl # endif _GL_FUNCDECL_RPL (ilogbl, int, (long double x)); _GL_CXXALIAS_RPL (ilogbl, int, (long double x)); # else # if !@HAVE_ILOGBL@ _GL_FUNCDECL_SYS (ilogbl, int, (long double x)); # endif _GL_CXXALIAS_SYS (ilogbl, int, (long double x)); # endif _GL_CXXALIASWARN (ilogbl); #elif defined GNULIB_POSIXCHECK # undef ilogbl # if HAVE_RAW_DECL_ILOGBL _GL_WARN_ON_USE (ilogbl, "ilogbl is unportable - " "use gnulib module ilogbl for portability"); # endif #endif /* Return x * 2^exp. */ #if @GNULIB_LDEXPF@ # if !@HAVE_LDEXPF@ # undef ldexpf _GL_FUNCDECL_SYS (ldexpf, float, (float x, int exp)); # endif _GL_CXXALIAS_SYS (ldexpf, float, (float x, int exp)); _GL_CXXALIASWARN (ldexpf); #elif defined GNULIB_POSIXCHECK # undef ldexpf # if HAVE_RAW_DECL_LDEXPF _GL_WARN_ON_USE (ldexpf, "ldexpf is unportable - " "use gnulib module ldexpf for portability"); # endif #endif /* Return x * 2^exp. */ #if @GNULIB_LDEXPL@ && @REPLACE_LDEXPL@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef ldexpl # define ldexpl rpl_ldexpl # endif _GL_FUNCDECL_RPL (ldexpl, long double, (long double x, int exp)); _GL_CXXALIAS_RPL (ldexpl, long double, (long double x, int exp)); #else # if !@HAVE_DECL_LDEXPL@ _GL_FUNCDECL_SYS (ldexpl, long double, (long double x, int exp)); # endif # if @GNULIB_LDEXPL@ _GL_CXXALIAS_SYS (ldexpl, long double, (long double x, int exp)); # endif #endif #if @GNULIB_LDEXPL@ _GL_CXXALIASWARN (ldexpl); #endif #if !@GNULIB_LDEXPL@ && defined GNULIB_POSIXCHECK # undef ldexpl # if HAVE_RAW_DECL_LDEXPL _GL_WARN_ON_USE (ldexpl, "ldexpl is unportable - " "use gnulib module ldexpl for portability"); # endif #endif #if @GNULIB_LOGF@ # if @REPLACE_LOGF@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef logf # define logf rpl_logf # endif _GL_FUNCDECL_RPL (logf, float, (float x)); _GL_CXXALIAS_RPL (logf, float, (float x)); # else # if !@HAVE_LOGF@ # undef logf _GL_FUNCDECL_SYS (logf, float, (float x)); # endif _GL_CXXALIAS_SYS (logf, float, (float x)); # endif _GL_CXXALIASWARN (logf); #elif defined GNULIB_POSIXCHECK # undef logf # if HAVE_RAW_DECL_LOGF _GL_WARN_ON_USE (logf, "logf is unportable - " "use gnulib module logf for portability"); # endif #endif #if @GNULIB_LOG@ # if @REPLACE_LOG@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef log # define log rpl_log # endif _GL_FUNCDECL_RPL (log, double, (double x)); _GL_CXXALIAS_RPL (log, double, (double x)); # else _GL_CXXALIAS_SYS (log, double, (double x)); # endif # if __GLIBC__ >= 2 _GL_CXXALIASWARN (log); # endif #elif defined GNULIB_POSIXCHECK # undef log # if HAVE_RAW_DECL_LOG _GL_WARN_ON_USE (log, "log has portability problems - " "use gnulib module log for portability"); # endif #endif #if @GNULIB_LOGL@ # if @REPLACE_LOGL@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef logl # define logl rpl_logl # endif _GL_FUNCDECL_RPL (logl, long double, (long double x)); _GL_CXXALIAS_RPL (logl, long double, (long double x)); # else # if !@HAVE_LOGL@ || !@HAVE_DECL_LOGL@ # undef logl _GL_FUNCDECL_SYS (logl, long double, (long double x)); # endif _GL_CXXALIAS_SYS (logl, long double, (long double x)); # endif _GL_CXXALIASWARN (logl); #elif defined GNULIB_POSIXCHECK # undef logl # if HAVE_RAW_DECL_LOGL _GL_WARN_ON_USE (logl, "logl is unportable - " "use gnulib module logl for portability"); # endif #endif #if @GNULIB_LOG10F@ # if @REPLACE_LOG10F@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef log10f # define log10f rpl_log10f # endif _GL_FUNCDECL_RPL (log10f, float, (float x)); _GL_CXXALIAS_RPL (log10f, float, (float x)); # else # if !@HAVE_LOG10F@ # undef log10f _GL_FUNCDECL_SYS (log10f, float, (float x)); # endif _GL_CXXALIAS_SYS (log10f, float, (float x)); # endif _GL_CXXALIASWARN (log10f); #elif defined GNULIB_POSIXCHECK # undef log10f # if HAVE_RAW_DECL_LOG10F _GL_WARN_ON_USE (log10f, "log10f is unportable - " "use gnulib module log10f for portability"); # endif #endif #if @GNULIB_LOG10@ # if @REPLACE_LOG10@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef log10 # define log10 rpl_log10 # endif _GL_FUNCDECL_RPL (log10, double, (double x)); _GL_CXXALIAS_RPL (log10, double, (double x)); # else _GL_CXXALIAS_SYS (log10, double, (double x)); # endif # if __GLIBC__ >= 2 _GL_CXXALIASWARN (log10); # endif #elif defined GNULIB_POSIXCHECK # undef log10 # if HAVE_RAW_DECL_LOG10 _GL_WARN_ON_USE (log10, "log10 has portability problems - " "use gnulib module log10 for portability"); # endif #endif #if @GNULIB_LOG10L@ # if @REPLACE_LOG10L@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef log10l # define log10l rpl_log10l # endif _GL_FUNCDECL_RPL (log10l, long double, (long double x)); _GL_CXXALIAS_RPL (log10l, long double, (long double x)); # else # if !@HAVE_LOG10L@ || !@HAVE_DECL_LOG10L@ # undef log10l _GL_FUNCDECL_SYS (log10l, long double, (long double x)); # endif _GL_CXXALIAS_SYS (log10l, long double, (long double x)); # endif _GL_CXXALIASWARN (log10l); #elif defined GNULIB_POSIXCHECK # undef log10l # if HAVE_RAW_DECL_LOG10L _GL_WARN_ON_USE (log10l, "log10l is unportable - " "use gnulib module log10l for portability"); # endif #endif #if @GNULIB_LOG1PF@ # if @REPLACE_LOG1PF@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef log1pf # define log1pf rpl_log1pf # endif _GL_FUNCDECL_RPL (log1pf, float, (float x)); _GL_CXXALIAS_RPL (log1pf, float, (float x)); # else # if !@HAVE_LOG1PF@ _GL_FUNCDECL_SYS (log1pf, float, (float x)); # endif _GL_CXXALIAS_SYS (log1pf, float, (float x)); # endif _GL_CXXALIASWARN (log1pf); #elif defined GNULIB_POSIXCHECK # undef log1pf # if HAVE_RAW_DECL_LOG1PF _GL_WARN_ON_USE (log1pf, "log1pf is unportable - " "use gnulib module log1pf for portability"); # endif #endif #if @GNULIB_LOG1P@ # if @REPLACE_LOG1P@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef log1p # define log1p rpl_log1p # endif _GL_FUNCDECL_RPL (log1p, double, (double x)); _GL_CXXALIAS_RPL (log1p, double, (double x)); # else # if !@HAVE_LOG1P@ _GL_FUNCDECL_SYS (log1p, double, (double x)); # endif _GL_CXXALIAS_SYS (log1p, double, (double x)); # endif # if __GLIBC__ >= 2 _GL_CXXALIASWARN (log1p); # endif #elif defined GNULIB_POSIXCHECK # undef log1p # if HAVE_RAW_DECL_LOG1P _GL_WARN_ON_USE (log1p, "log1p has portability problems - " "use gnulib module log1p for portability"); # endif #endif #if @GNULIB_LOG1PL@ # if @REPLACE_LOG1PL@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef log1pl # define log1pl rpl_log1pl # endif _GL_FUNCDECL_RPL (log1pl, long double, (long double x)); _GL_CXXALIAS_RPL (log1pl, long double, (long double x)); # else # if !@HAVE_LOG1PL@ _GL_FUNCDECL_SYS (log1pl, long double, (long double x)); # endif _GL_CXXALIAS_SYS (log1pl, long double, (long double x)); # endif _GL_CXXALIASWARN (log1pl); #elif defined GNULIB_POSIXCHECK # undef log1pl # if HAVE_RAW_DECL_LOG1PL _GL_WARN_ON_USE (log1pl, "log1pl has portability problems - " "use gnulib module log1pl for portability"); # endif #endif #if @GNULIB_LOG2F@ # if @REPLACE_LOG2F@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef log2f # define log2f rpl_log2f # endif _GL_FUNCDECL_RPL (log2f, float, (float x)); _GL_CXXALIAS_RPL (log2f, float, (float x)); # else # if !@HAVE_DECL_LOG2F@ # undef log2f _GL_FUNCDECL_SYS (log2f, float, (float x)); # endif _GL_CXXALIAS_SYS (log2f, float, (float x)); # endif _GL_CXXALIASWARN (log2f); #elif defined GNULIB_POSIXCHECK # undef log2f # if HAVE_RAW_DECL_LOG2F _GL_WARN_ON_USE (log2f, "log2f is unportable - " "use gnulib module log2f for portability"); # endif #endif #if @GNULIB_LOG2@ # if @REPLACE_LOG2@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef log2 # define log2 rpl_log2 # endif _GL_FUNCDECL_RPL (log2, double, (double x)); _GL_CXXALIAS_RPL (log2, double, (double x)); # else # if !@HAVE_DECL_LOG2@ # undef log2 _GL_FUNCDECL_SYS (log2, double, (double x)); # endif _GL_CXXALIAS_SYS (log2, double, (double x)); # endif # if __GLIBC__ >= 2 _GL_CXXALIASWARN (log2); # endif #elif defined GNULIB_POSIXCHECK # undef log2 # if HAVE_RAW_DECL_LOG2 _GL_WARN_ON_USE (log2, "log2 is unportable - " "use gnulib module log2 for portability"); # endif #endif #if @GNULIB_LOG2L@ # if @REPLACE_LOG2L@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef log2l # define log2l rpl_log2l # endif _GL_FUNCDECL_RPL (log2l, long double, (long double x)); _GL_CXXALIAS_RPL (log2l, long double, (long double x)); # else # if !@HAVE_DECL_LOG2L@ _GL_FUNCDECL_SYS (log2l, long double, (long double x)); # endif _GL_CXXALIAS_SYS (log2l, long double, (long double x)); # endif _GL_CXXALIASWARN (log2l); #elif defined GNULIB_POSIXCHECK # undef log2l # if HAVE_RAW_DECL_LOG2L _GL_WARN_ON_USE (log2l, "log2l is unportable - " "use gnulib module log2l for portability"); # endif #endif #if @GNULIB_LOGBF@ # if @REPLACE_LOGBF@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef logbf # define logbf rpl_logbf # endif _GL_FUNCDECL_RPL (logbf, float, (float x)); _GL_CXXALIAS_RPL (logbf, float, (float x)); # else # if !@HAVE_LOGBF@ _GL_FUNCDECL_SYS (logbf, float, (float x)); # endif _GL_CXXALIAS_SYS (logbf, float, (float x)); # endif _GL_CXXALIASWARN (logbf); #elif defined GNULIB_POSIXCHECK # undef logbf # if HAVE_RAW_DECL_LOGBF _GL_WARN_ON_USE (logbf, "logbf is unportable - " "use gnulib module logbf for portability"); # endif #endif #if @GNULIB_LOGB@ # if @REPLACE_LOGB@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef logb # define logb rpl_logb # endif _GL_FUNCDECL_RPL (logb, double, (double x)); _GL_CXXALIAS_RPL (logb, double, (double x)); # else # if !@HAVE_DECL_LOGB@ _GL_FUNCDECL_SYS (logb, double, (double x)); # endif _GL_CXXALIAS_SYS (logb, double, (double x)); # endif # if __GLIBC__ >= 2 _GL_CXXALIASWARN (logb); # endif #elif defined GNULIB_POSIXCHECK # undef logb # if HAVE_RAW_DECL_LOGB _GL_WARN_ON_USE (logb, "logb is unportable - " "use gnulib module logb for portability"); # endif #endif #if @GNULIB_LOGBL@ # if @REPLACE_LOGBL@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef logbl # define logbl rpl_logbl # endif _GL_FUNCDECL_RPL (logbl, long double, (long double x)); _GL_CXXALIAS_RPL (logbl, long double, (long double x)); # else # if !@HAVE_LOGBL@ _GL_FUNCDECL_SYS (logbl, long double, (long double x)); # endif _GL_CXXALIAS_SYS (logbl, long double, (long double x)); # endif _GL_CXXALIASWARN (logbl); #elif defined GNULIB_POSIXCHECK # undef logbl # if HAVE_RAW_DECL_LOGBL _GL_WARN_ON_USE (logbl, "logbl is unportable - " "use gnulib module logbl for portability"); # endif #endif #if @GNULIB_MODFF@ # if @REPLACE_MODFF@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef modff # define modff rpl_modff # endif _GL_FUNCDECL_RPL (modff, float, (float x, float *iptr) _GL_ARG_NONNULL ((2))); _GL_CXXALIAS_RPL (modff, float, (float x, float *iptr)); # else # if !@HAVE_MODFF@ # undef modff _GL_FUNCDECL_SYS (modff, float, (float x, float *iptr) _GL_ARG_NONNULL ((2))); # endif _GL_CXXALIAS_SYS (modff, float, (float x, float *iptr)); # endif _GL_CXXALIASWARN (modff); #elif defined GNULIB_POSIXCHECK # undef modff # if HAVE_RAW_DECL_MODFF _GL_WARN_ON_USE (modff, "modff is unportable - " "use gnulib module modff for portability"); # endif #endif #if @GNULIB_MODF@ # if @REPLACE_MODF@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef modf # define modf rpl_modf # endif _GL_FUNCDECL_RPL (modf, double, (double x, double *iptr) _GL_ARG_NONNULL ((2))); _GL_CXXALIAS_RPL (modf, double, (double x, double *iptr)); # else _GL_CXXALIAS_SYS (modf, double, (double x, double *iptr)); # endif # if __GLIBC__ >= 2 _GL_CXXALIASWARN (modf); # endif #elif defined GNULIB_POSIXCHECK # undef modf # if HAVE_RAW_DECL_MODF _GL_WARN_ON_USE (modf, "modf has portability problems - " "use gnulib module modf for portability"); # endif #endif #if @GNULIB_MODFL@ # if @REPLACE_MODFL@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef modfl # define modfl rpl_modfl # endif _GL_FUNCDECL_RPL (modfl, long double, (long double x, long double *iptr) _GL_ARG_NONNULL ((2))); _GL_CXXALIAS_RPL (modfl, long double, (long double x, long double *iptr)); # else # if !@HAVE_MODFL@ # undef modfl _GL_FUNCDECL_SYS (modfl, long double, (long double x, long double *iptr) _GL_ARG_NONNULL ((2))); # endif _GL_CXXALIAS_SYS (modfl, long double, (long double x, long double *iptr)); # endif _GL_CXXALIASWARN (modfl); #elif defined GNULIB_POSIXCHECK # undef modfl # if HAVE_RAW_DECL_MODFL _GL_WARN_ON_USE (modfl, "modfl is unportable - " "use gnulib module modfl for portability"); # endif #endif #if @GNULIB_POWF@ # if !@HAVE_POWF@ # undef powf _GL_FUNCDECL_SYS (powf, float, (float x, float y)); # endif _GL_CXXALIAS_SYS (powf, float, (float x, float y)); _GL_CXXALIASWARN (powf); #elif defined GNULIB_POSIXCHECK # undef powf # if HAVE_RAW_DECL_POWF _GL_WARN_ON_USE (powf, "powf is unportable - " "use gnulib module powf for portability"); # endif #endif #if @GNULIB_REMAINDERF@ # if @REPLACE_REMAINDERF@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef remainderf # define remainderf rpl_remainderf # endif _GL_FUNCDECL_RPL (remainderf, float, (float x, float y)); _GL_CXXALIAS_RPL (remainderf, float, (float x, float y)); # else # if !@HAVE_REMAINDERF@ _GL_FUNCDECL_SYS (remainderf, float, (float x, float y)); # endif _GL_CXXALIAS_SYS (remainderf, float, (float x, float y)); # endif _GL_CXXALIASWARN (remainderf); #elif defined GNULIB_POSIXCHECK # undef remainderf # if HAVE_RAW_DECL_REMAINDERF _GL_WARN_ON_USE (remainderf, "remainderf is unportable - " "use gnulib module remainderf for portability"); # endif #endif #if @GNULIB_REMAINDER@ # if @REPLACE_REMAINDER@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef remainder # define remainder rpl_remainder # endif _GL_FUNCDECL_RPL (remainder, double, (double x, double y)); _GL_CXXALIAS_RPL (remainder, double, (double x, double y)); # else # if !@HAVE_REMAINDER@ || !@HAVE_DECL_REMAINDER@ _GL_FUNCDECL_SYS (remainder, double, (double x, double y)); # endif _GL_CXXALIAS_SYS (remainder, double, (double x, double y)); # endif # if __GLIBC__ >= 2 _GL_CXXALIASWARN (remainder); # endif #elif defined GNULIB_POSIXCHECK # undef remainder # if HAVE_RAW_DECL_REMAINDER _GL_WARN_ON_USE (remainder, "remainder is unportable - " "use gnulib module remainder for portability"); # endif #endif #if @GNULIB_REMAINDERL@ # if @REPLACE_REMAINDERL@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef remainderl # define remainderl rpl_remainderl # endif _GL_FUNCDECL_RPL (remainderl, long double, (long double x, long double y)); _GL_CXXALIAS_RPL (remainderl, long double, (long double x, long double y)); # else # if !@HAVE_DECL_REMAINDERL@ # undef remainderl # if !(defined __cplusplus && defined _AIX) _GL_FUNCDECL_SYS (remainderl, long double, (long double x, long double y)); # endif # endif _GL_CXXALIAS_SYS (remainderl, long double, (long double x, long double y)); # endif _GL_CXXALIASWARN (remainderl); #elif defined GNULIB_POSIXCHECK # undef remainderl # if HAVE_RAW_DECL_REMAINDERL _GL_WARN_ON_USE (remainderl, "remainderl is unportable - " "use gnulib module remainderl for portability"); # endif #endif #if @GNULIB_RINTF@ # if !@HAVE_DECL_RINTF@ _GL_FUNCDECL_SYS (rintf, float, (float x)); # endif _GL_CXXALIAS_SYS (rintf, float, (float x)); _GL_CXXALIASWARN (rintf); #elif defined GNULIB_POSIXCHECK # undef rintf # if HAVE_RAW_DECL_RINTF _GL_WARN_ON_USE (rintf, "rintf is unportable - " "use gnulib module rintf for portability"); # endif #endif #if @GNULIB_RINT@ # if !@HAVE_RINT@ _GL_FUNCDECL_SYS (rint, double, (double x)); # endif _GL_CXXALIAS_SYS (rint, double, (double x)); # if __GLIBC__ >= 2 _GL_CXXALIASWARN (rint); # endif #elif defined GNULIB_POSIXCHECK # undef rint # if HAVE_RAW_DECL_RINT _GL_WARN_ON_USE (rint, "rint is unportable - " "use gnulib module rint for portability"); # endif #endif #if @GNULIB_RINTL@ # if @REPLACE_RINTL@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef rintl # define rintl rpl_rintl # endif _GL_FUNCDECL_RPL (rintl, long double, (long double x)); _GL_CXXALIAS_RPL (rintl, long double, (long double x)); # else # if !@HAVE_RINTL@ _GL_FUNCDECL_SYS (rintl, long double, (long double x)); # endif _GL_CXXALIAS_SYS (rintl, long double, (long double x)); # endif _GL_CXXALIASWARN (rintl); #elif defined GNULIB_POSIXCHECK # undef rintl # if HAVE_RAW_DECL_RINTL _GL_WARN_ON_USE (rintl, "rintl is unportable - " "use gnulib module rintl for portability"); # endif #endif #if @GNULIB_ROUNDF@ # if @REPLACE_ROUNDF@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef roundf # define roundf rpl_roundf # endif _GL_FUNCDECL_RPL (roundf, float, (float x)); _GL_CXXALIAS_RPL (roundf, float, (float x)); # else # if !@HAVE_DECL_ROUNDF@ _GL_FUNCDECL_SYS (roundf, float, (float x)); # endif _GL_CXXALIAS_SYS (roundf, float, (float x)); # endif _GL_CXXALIASWARN (roundf); #elif defined GNULIB_POSIXCHECK # undef roundf # if HAVE_RAW_DECL_ROUNDF _GL_WARN_ON_USE (roundf, "roundf is unportable - " "use gnulib module roundf for portability"); # endif #endif #if @GNULIB_ROUND@ # if @REPLACE_ROUND@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef round # define round rpl_round # endif _GL_FUNCDECL_RPL (round, double, (double x)); _GL_CXXALIAS_RPL (round, double, (double x)); # else # if !@HAVE_DECL_ROUND@ _GL_FUNCDECL_SYS (round, double, (double x)); # endif _GL_CXXALIAS_SYS (round, double, (double x)); # endif # if __GLIBC__ >= 2 _GL_CXXALIASWARN (round); # endif #elif defined GNULIB_POSIXCHECK # undef round # if HAVE_RAW_DECL_ROUND _GL_WARN_ON_USE (round, "round is unportable - " "use gnulib module round for portability"); # endif #endif #if @GNULIB_ROUNDL@ # if @REPLACE_ROUNDL@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef roundl # define roundl rpl_roundl # endif _GL_FUNCDECL_RPL (roundl, long double, (long double x)); _GL_CXXALIAS_RPL (roundl, long double, (long double x)); # else # if !@HAVE_DECL_ROUNDL@ # undef roundl # if !(defined __cplusplus && defined _AIX) _GL_FUNCDECL_SYS (roundl, long double, (long double x)); # endif # endif _GL_CXXALIAS_SYS (roundl, long double, (long double x)); # endif _GL_CXXALIASWARN (roundl); #elif defined GNULIB_POSIXCHECK # undef roundl # if HAVE_RAW_DECL_ROUNDL _GL_WARN_ON_USE (roundl, "roundl is unportable - " "use gnulib module roundl for portability"); # endif #endif #if @GNULIB_SINF@ # if @REPLACE_SINF@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef sinf # define sinf rpl_sinf # endif _GL_FUNCDECL_RPL (sinf, float, (float x)); _GL_CXXALIAS_RPL (sinf, float, (float x)); # else # if !@HAVE_SINF@ # undef sinf _GL_FUNCDECL_SYS (sinf, float, (float x)); # endif _GL_CXXALIAS_SYS (sinf, float, (float x)); # endif _GL_CXXALIASWARN (sinf); #elif defined GNULIB_POSIXCHECK # undef sinf # if HAVE_RAW_DECL_SINF _GL_WARN_ON_USE (sinf, "sinf is unportable - " "use gnulib module sinf for portability"); # endif #endif #if @GNULIB_SINL@ # if !@HAVE_SINL@ || !@HAVE_DECL_SINL@ # undef sinl _GL_FUNCDECL_SYS (sinl, long double, (long double x)); # endif _GL_CXXALIAS_SYS (sinl, long double, (long double x)); _GL_CXXALIASWARN (sinl); #elif defined GNULIB_POSIXCHECK # undef sinl # if HAVE_RAW_DECL_SINL _GL_WARN_ON_USE (sinl, "sinl is unportable - " "use gnulib module sinl for portability"); # endif #endif #if @GNULIB_SINHF@ # if @REPLACE_SINHF@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef sinhf # define sinhf rpl_sinhf # endif _GL_FUNCDECL_RPL (sinhf, float, (float x)); _GL_CXXALIAS_RPL (sinhf, float, (float x)); # else # if !@HAVE_SINHF@ # undef sinhf _GL_FUNCDECL_SYS (sinhf, float, (float x)); # endif _GL_CXXALIAS_SYS (sinhf, float, (float x)); # endif _GL_CXXALIASWARN (sinhf); #elif defined GNULIB_POSIXCHECK # undef sinhf # if HAVE_RAW_DECL_SINHF _GL_WARN_ON_USE (sinhf, "sinhf is unportable - " "use gnulib module sinhf for portability"); # endif #endif #if @GNULIB_SQRTF@ # if @REPLACE_SQRTF@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef sqrtf # define sqrtf rpl_sqrtf # endif _GL_FUNCDECL_RPL (sqrtf, float, (float x)); _GL_CXXALIAS_RPL (sqrtf, float, (float x)); # else # if !@HAVE_SQRTF@ # undef sqrtf _GL_FUNCDECL_SYS (sqrtf, float, (float x)); # endif _GL_CXXALIAS_SYS (sqrtf, float, (float x)); # endif _GL_CXXALIASWARN (sqrtf); #elif defined GNULIB_POSIXCHECK # undef sqrtf # if HAVE_RAW_DECL_SQRTF _GL_WARN_ON_USE (sqrtf, "sqrtf is unportable - " "use gnulib module sqrtf for portability"); # endif #endif #if @GNULIB_SQRTL@ # if @REPLACE_SQRTL@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef sqrtl # define sqrtl rpl_sqrtl # endif _GL_FUNCDECL_RPL (sqrtl, long double, (long double x)); _GL_CXXALIAS_RPL (sqrtl, long double, (long double x)); # else # if !@HAVE_SQRTL@ || !@HAVE_DECL_SQRTL@ # undef sqrtl _GL_FUNCDECL_SYS (sqrtl, long double, (long double x)); # endif _GL_CXXALIAS_SYS (sqrtl, long double, (long double x)); # endif _GL_CXXALIASWARN (sqrtl); #elif defined GNULIB_POSIXCHECK # undef sqrtl # if HAVE_RAW_DECL_SQRTL _GL_WARN_ON_USE (sqrtl, "sqrtl is unportable - " "use gnulib module sqrtl for portability"); # endif #endif #if @GNULIB_TANF@ # if @REPLACE_TANF@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef tanf # define tanf rpl_tanf # endif _GL_FUNCDECL_RPL (tanf, float, (float x)); _GL_CXXALIAS_RPL (tanf, float, (float x)); # else # if !@HAVE_TANF@ # undef tanf _GL_FUNCDECL_SYS (tanf, float, (float x)); # endif _GL_CXXALIAS_SYS (tanf, float, (float x)); # endif _GL_CXXALIASWARN (tanf); #elif defined GNULIB_POSIXCHECK # undef tanf # if HAVE_RAW_DECL_TANF _GL_WARN_ON_USE (tanf, "tanf is unportable - " "use gnulib module tanf for portability"); # endif #endif #if @GNULIB_TANL@ # if !@HAVE_TANL@ || !@HAVE_DECL_TANL@ # undef tanl _GL_FUNCDECL_SYS (tanl, long double, (long double x)); # endif _GL_CXXALIAS_SYS (tanl, long double, (long double x)); _GL_CXXALIASWARN (tanl); #elif defined GNULIB_POSIXCHECK # undef tanl # if HAVE_RAW_DECL_TANL _GL_WARN_ON_USE (tanl, "tanl is unportable - " "use gnulib module tanl for portability"); # endif #endif #if @GNULIB_TANHF@ # if @REPLACE_TANHF@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef tanhf # define tanhf rpl_tanhf # endif _GL_FUNCDECL_RPL (tanhf, float, (float x)); _GL_CXXALIAS_RPL (tanhf, float, (float x)); # else # if !@HAVE_TANHF@ # undef tanhf _GL_FUNCDECL_SYS (tanhf, float, (float x)); # endif _GL_CXXALIAS_SYS (tanhf, float, (float x)); # endif _GL_CXXALIASWARN (tanhf); #elif defined GNULIB_POSIXCHECK # undef tanhf # if HAVE_RAW_DECL_TANHF _GL_WARN_ON_USE (tanhf, "tanhf is unportable - " "use gnulib module tanhf for portability"); # endif #endif #if @GNULIB_TRUNCF@ # if @REPLACE_TRUNCF@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef truncf # define truncf rpl_truncf # endif _GL_FUNCDECL_RPL (truncf, float, (float x)); _GL_CXXALIAS_RPL (truncf, float, (float x)); # else # if !@HAVE_DECL_TRUNCF@ _GL_FUNCDECL_SYS (truncf, float, (float x)); # endif _GL_CXXALIAS_SYS (truncf, float, (float x)); # endif _GL_CXXALIASWARN (truncf); #elif defined GNULIB_POSIXCHECK # undef truncf # if HAVE_RAW_DECL_TRUNCF _GL_WARN_ON_USE (truncf, "truncf is unportable - " "use gnulib module truncf for portability"); # endif #endif #if @GNULIB_TRUNC@ # if @REPLACE_TRUNC@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef trunc # define trunc rpl_trunc # endif _GL_FUNCDECL_RPL (trunc, double, (double x)); _GL_CXXALIAS_RPL (trunc, double, (double x)); # else # if !@HAVE_DECL_TRUNC@ _GL_FUNCDECL_SYS (trunc, double, (double x)); # endif _GL_CXXALIAS_SYS (trunc, double, (double x)); # endif # if __GLIBC__ >= 2 _GL_CXXALIASWARN (trunc); # endif #elif defined GNULIB_POSIXCHECK # undef trunc # if HAVE_RAW_DECL_TRUNC _GL_WARN_ON_USE (trunc, "trunc is unportable - " "use gnulib module trunc for portability"); # endif #endif #if @GNULIB_TRUNCL@ # if @REPLACE_TRUNCL@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef truncl # define truncl rpl_truncl # endif _GL_FUNCDECL_RPL (truncl, long double, (long double x)); _GL_CXXALIAS_RPL (truncl, long double, (long double x)); # else # if !@HAVE_DECL_TRUNCL@ _GL_FUNCDECL_SYS (truncl, long double, (long double x)); # endif _GL_CXXALIAS_SYS (truncl, long double, (long double x)); # endif _GL_CXXALIASWARN (truncl); #elif defined GNULIB_POSIXCHECK # undef truncl # if HAVE_RAW_DECL_TRUNCL _GL_WARN_ON_USE (truncl, "truncl is unportable - " "use gnulib module truncl for portability"); # endif #endif /* Definitions of function-like macros come here, after the function declarations. */ #if @GNULIB_ISFINITE@ # if @REPLACE_ISFINITE@ _GL_EXTERN_C int gl_isfinitef (float x); _GL_EXTERN_C int gl_isfinited (double x); _GL_EXTERN_C int gl_isfinitel (long double x); # undef isfinite # define isfinite(x) \ (sizeof (x) == sizeof (long double) ? gl_isfinitel (x) : \ sizeof (x) == sizeof (double) ? gl_isfinited (x) : \ gl_isfinitef (x)) # endif # ifdef __cplusplus # if defined isfinite || defined GNULIB_NAMESPACE _GL_MATH_CXX_REAL_FLOATING_DECL_1 (isfinite) # undef isfinite # if __GNUC__ >= 6 || (defined __clang__ && !((defined __APPLE__ && defined __MACH__) || defined __FreeBSD__ || defined _AIX)) /* This platform's possibly defines isfinite through a set of inline functions. */ _GL_MATH_CXX_REAL_FLOATING_DECL_2 (isfinite, rpl_isfinite, bool) # define isfinite rpl_isfinite # else _GL_MATH_CXX_REAL_FLOATING_DECL_2 (isfinite, isfinite, bool) # endif # endif # endif #elif defined GNULIB_POSIXCHECK # if defined isfinite _GL_WARN_REAL_FLOATING_DECL (isfinite); # undef isfinite # define isfinite(x) _GL_WARN_REAL_FLOATING_IMPL (isfinite, x) # endif #endif #if @GNULIB_ISINF@ # if @REPLACE_ISINF@ _GL_EXTERN_C int gl_isinff (float x); _GL_EXTERN_C int gl_isinfd (double x); _GL_EXTERN_C int gl_isinfl (long double x); # undef isinf # define isinf(x) \ (sizeof (x) == sizeof (long double) ? gl_isinfl (x) : \ sizeof (x) == sizeof (double) ? gl_isinfd (x) : \ gl_isinff (x)) # endif # ifdef __cplusplus # if defined isinf || defined GNULIB_NAMESPACE _GL_MATH_CXX_REAL_FLOATING_DECL_1 (isinf) # undef isinf # if __GNUC__ >= 6 || (defined __clang__ && !((defined __APPLE__ && defined __MACH__) || defined __FreeBSD__)) /* This platform's possibly defines isinf through a set of inline functions. */ _GL_MATH_CXX_REAL_FLOATING_DECL_2 (isinf, rpl_isinf, bool) # define isinf rpl_isinf # else _GL_MATH_CXX_REAL_FLOATING_DECL_2 (isinf, isinf, bool) # endif # endif # endif #elif defined GNULIB_POSIXCHECK # if defined isinf _GL_WARN_REAL_FLOATING_DECL (isinf); # undef isinf # define isinf(x) _GL_WARN_REAL_FLOATING_IMPL (isinf, x) # endif #endif #if @GNULIB_ISNANF@ /* Test for NaN for 'float' numbers. */ # if @HAVE_ISNANF@ /* The original included above provides a declaration of isnan macro or (older) isnanf function. */ # if (__GNUC__ >= 4) || (__clang_major__ >= 4) /* GCC >= 4.0 and clang provide a type-generic built-in for isnan. GCC >= 4.0 also provides __builtin_isnanf, but clang doesn't. */ # undef isnanf # define isnanf(x) __builtin_isnan ((float)(x)) # elif defined isnan # undef isnanf # define isnanf(x) isnan ((float)(x)) # endif # else /* Test whether X is a NaN. */ # undef isnanf # define isnanf rpl_isnanf _GL_EXTERN_C int isnanf (float x); # endif #endif #if @GNULIB_ISNAND@ /* Test for NaN for 'double' numbers. This function is a gnulib extension, unlike isnan() which applied only to 'double' numbers earlier but now is a type-generic macro. */ # if @HAVE_ISNAND@ /* The original included above provides a declaration of isnan macro. */ # if (__GNUC__ >= 4) || (__clang_major__ >= 4) /* GCC >= 4.0 and clang provide a type-generic built-in for isnan. */ # undef isnand # define isnand(x) __builtin_isnan ((double)(x)) # else # undef isnand # define isnand(x) isnan ((double)(x)) # endif # else /* Test whether X is a NaN. */ # undef isnand # define isnand rpl_isnand _GL_EXTERN_C int isnand (double x); # endif #endif #if @GNULIB_ISNANL@ /* Test for NaN for 'long double' numbers. */ # if @HAVE_ISNANL@ /* The original included above provides a declaration of isnan macro or (older) isnanl function. */ # if (__GNUC__ >= 4) || (__clang_major__ >= 4) /* GCC >= 4.0 and clang provide a type-generic built-in for isnan. GCC >= 4.0 also provides __builtin_isnanl, but clang doesn't. */ # undef isnanl # define isnanl(x) __builtin_isnan ((long double)(x)) # elif defined isnan # undef isnanl # define isnanl(x) isnan ((long double)(x)) # endif # else /* Test whether X is a NaN. */ # undef isnanl # define isnanl rpl_isnanl _GL_EXTERN_C int isnanl (long double x) _GL_ATTRIBUTE_CONST; # endif #endif /* This must come *after* the snippets for GNULIB_ISNANF and GNULIB_ISNANL! */ #if @GNULIB_ISNAN@ # if @REPLACE_ISNAN@ /* We can't just use the isnanf macro (e.g.) as exposed by isnanf.h (e.g.) here, because those may end up being macros that recursively expand back to isnan. So use the gnulib replacements for them directly. */ # if @HAVE_ISNANF@ && (__GNUC__ >= 4) || (__clang_major__ >= 4) # define gl_isnan_f(x) __builtin_isnan ((float)(x)) # else _GL_EXTERN_C int rpl_isnanf (float x); # define gl_isnan_f(x) rpl_isnanf (x) # endif # if @HAVE_ISNAND@ && (__GNUC__ >= 4) || (__clang_major__ >= 4) # define gl_isnan_d(x) __builtin_isnan ((double)(x)) # else _GL_EXTERN_C int rpl_isnand (double x); # define gl_isnan_d(x) rpl_isnand (x) # endif # if @HAVE_ISNANL@ && (__GNUC__ >= 4) || (__clang_major__ >= 4) # define gl_isnan_l(x) __builtin_isnan ((long double)(x)) # else _GL_EXTERN_C int rpl_isnanl (long double x) _GL_ATTRIBUTE_CONST; # define gl_isnan_l(x) rpl_isnanl (x) # endif # undef isnan # define isnan(x) \ (sizeof (x) == sizeof (long double) ? gl_isnan_l (x) : \ sizeof (x) == sizeof (double) ? gl_isnan_d (x) : \ gl_isnan_f (x)) # elif (__GNUC__ >= 4) || (__clang_major__ >= 4) # undef isnan # define isnan(x) \ (sizeof (x) == sizeof (long double) ? __builtin_isnan ((long double)(x)) : \ sizeof (x) == sizeof (double) ? __builtin_isnan ((double)(x)) : \ __builtin_isnan ((float)(x))) # endif # ifdef __cplusplus # if defined isnan || defined GNULIB_NAMESPACE _GL_MATH_CXX_REAL_FLOATING_DECL_1 (isnan) # undef isnan # if __GNUC__ >= 6 || (defined __clang__ && !((defined __APPLE__ && defined __MACH__) || defined __FreeBSD__)) /* This platform's possibly defines isnan through a set of inline functions. */ _GL_MATH_CXX_REAL_FLOATING_DECL_2 (isnan, rpl_isnan, bool) # define isnan rpl_isnan # else _GL_MATH_CXX_REAL_FLOATING_DECL_2 (isnan, isnan, bool) # endif # endif # else /* Ensure isnan is a macro. */ # ifndef isnan # define isnan isnan # endif # endif #elif defined GNULIB_POSIXCHECK # if defined isnan _GL_WARN_REAL_FLOATING_DECL (isnan); # undef isnan # define isnan(x) _GL_WARN_REAL_FLOATING_IMPL (isnan, x) # endif #endif #if @GNULIB_SIGNBIT@ # if (@REPLACE_SIGNBIT_USING_BUILTINS@ \ && (!defined __cplusplus || __cplusplus < 201103)) # undef signbit /* GCC >= 4.0 and clang provide three built-ins for signbit. */ # define signbit(x) \ (sizeof (x) == sizeof (long double) ? __builtin_signbitl (x) : \ sizeof (x) == sizeof (double) ? __builtin_signbit (x) : \ __builtin_signbitf (x)) # endif # if @REPLACE_SIGNBIT@ && !GNULIB_defined_signbit # undef signbit _GL_EXTERN_C int gl_signbitf (float arg); _GL_EXTERN_C int gl_signbitd (double arg); _GL_EXTERN_C int gl_signbitl (long double arg); # if __GNUC__ >= 2 && !defined __STRICT_ANSI__ # define _GL_NUM_UINT_WORDS(type) \ ((sizeof (type) + sizeof (unsigned int) - 1) / sizeof (unsigned int)) # if defined FLT_SIGNBIT_WORD && defined FLT_SIGNBIT_BIT && !defined gl_signbitf # define gl_signbitf_OPTIMIZED_MACRO # define gl_signbitf(arg) \ ({ union { float _value; \ unsigned int _word[_GL_NUM_UINT_WORDS (float)]; \ } _m; \ _m._value = (arg); \ (_m._word[FLT_SIGNBIT_WORD] >> FLT_SIGNBIT_BIT) & 1; \ }) # endif # if defined DBL_SIGNBIT_WORD && defined DBL_SIGNBIT_BIT && !defined gl_signbitd # define gl_signbitd_OPTIMIZED_MACRO # define gl_signbitd(arg) \ ({ union { double _value; \ unsigned int _word[_GL_NUM_UINT_WORDS (double)]; \ } _m; \ _m._value = (arg); \ (_m._word[DBL_SIGNBIT_WORD] >> DBL_SIGNBIT_BIT) & 1; \ }) # endif # if defined LDBL_SIGNBIT_WORD && defined LDBL_SIGNBIT_BIT && !defined gl_signbitl # define gl_signbitl_OPTIMIZED_MACRO # define gl_signbitl(arg) \ ({ union { long double _value; \ unsigned int _word[_GL_NUM_UINT_WORDS (long double)]; \ } _m; \ _m._value = (arg); \ (_m._word[LDBL_SIGNBIT_WORD] >> LDBL_SIGNBIT_BIT) & 1; \ }) # endif # endif # define signbit(x) \ (sizeof (x) == sizeof (long double) ? gl_signbitl (x) : \ sizeof (x) == sizeof (double) ? gl_signbitd (x) : \ gl_signbitf (x)) # define GNULIB_defined_signbit 1 # endif # ifdef __cplusplus # if defined signbit || defined GNULIB_NAMESPACE _GL_MATH_CXX_REAL_FLOATING_DECL_1 (signbit) # undef signbit # if __GNUC__ >= 6 || (defined __clang__ && !((defined __APPLE__ && defined __MACH__) || defined __FreeBSD__ || defined _AIX)) /* This platform's possibly defines signbit through a set of inline functions. */ _GL_MATH_CXX_REAL_FLOATING_DECL_2 (signbit, rpl_signbit, bool) # define signbit rpl_signbit # else _GL_MATH_CXX_REAL_FLOATING_DECL_2 (signbit, signbit, bool) # endif # endif # endif #elif defined GNULIB_POSIXCHECK # if defined signbit _GL_WARN_REAL_FLOATING_DECL (signbit); # undef signbit # define signbit(x) _GL_WARN_REAL_FLOATING_IMPL (signbit, x) # endif #endif _GL_INLINE_HEADER_END #endif /* _@GUARD_PREFIX@_MATH_H */ #endif /* _@GUARD_PREFIX@_MATH_H */ pspp-1.4.1/gl/c-xasprintf.c0000644000175000017500000000203613723215636015130 0ustar00blpblp00000000000000/* vasprintf and asprintf with out-of-memory checking in C locale. Copyright (C) 1999, 2002-2004, 2006, 2009-2020 Free Software Foundation, Inc. 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 3 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, see . */ #include /* Specification. */ #include "c-xvasprintf.h" char * c_xasprintf (const char *format, ...) { va_list args; char *result; va_start (args, format); result = c_xvasprintf (format, args); va_end (args); return result; } pspp-1.4.1/gl/setlocale-lock.c0000644000175000017500000001050713723215640015570 0ustar00blpblp00000000000000/* Return the internal lock used by setlocale_null_r. Copyright (C) 2019-2020 Free Software Foundation, Inc. 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 3 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, see . */ /* Written by Bruno Haible , 2019. */ #include /* When it is known that the gl_get_setlocale_null_lock function is defined by a dependency library, it should not be defined here. */ #if OMIT_SETLOCALE_LOCK /* This declaration is solely to ensure that after preprocessing this file is never empty. */ typedef int dummy; #else /* This file defines the internal lock used by setlocale_null_r. It is a separate compilation unit, so that only one copy of it is present when linking statically. */ /* Prohibit renaming this symbol. */ # undef gl_get_setlocale_null_lock /* Macro for exporting a symbol (function, not variable) defined in this file, when compiled into a shared library. */ # ifndef DLL_EXPORTED # if HAVE_VISIBILITY /* Override the effect of the compiler option '-fvisibility=hidden'. */ # define DLL_EXPORTED __attribute__((__visibility__("default"))) # elif defined _WIN32 || defined __CYGWIN__ # define DLL_EXPORTED __declspec(dllexport) # else # define DLL_EXPORTED # endif # endif # if defined _WIN32 && !defined __CYGWIN__ # define WIN32_LEAN_AND_MEAN /* avoid including junk */ # include # include "windows-initguard.h" /* The return type is a 'CRITICAL_SECTION *', not a 'glwthread_mutex_t *', because the latter is not guaranteed to be a stable ABI in the future. */ /* Make sure the function gets exported from DLLs. */ DLL_EXPORTED CRITICAL_SECTION *gl_get_setlocale_null_lock (void); static glwthread_initguard_t guard = GLWTHREAD_INITGUARD_INIT; static CRITICAL_SECTION lock; /* Returns the internal lock used by setlocale_null_r. */ CRITICAL_SECTION * gl_get_setlocale_null_lock (void) { if (!guard.done) { if (InterlockedIncrement (&guard.started) == 0) { /* This thread is the first one to need the lock. Initialize it. */ InitializeCriticalSection (&lock); guard.done = 1; } else { /* Don't let guard.started grow and wrap around. */ InterlockedDecrement (&guard.started); /* Yield the CPU while waiting for another thread to finish initializing this mutex. */ while (!guard.done) Sleep (0); } } return &lock; } # elif HAVE_PTHREAD_API # include static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; /* Make sure the function gets exported from shared libraries. */ DLL_EXPORTED pthread_mutex_t *gl_get_setlocale_null_lock (void); /* Returns the internal lock used by setlocale_null_r. */ pthread_mutex_t * gl_get_setlocale_null_lock (void) { return &mutex; } # elif HAVE_THREADS_H # include # include static int volatile init_needed = 1; static once_flag init_once = ONCE_FLAG_INIT; static mtx_t mutex; static void atomic_init (void) { if (mtx_init (&mutex, mtx_plain) != thrd_success) abort (); init_needed = 0; } /* Make sure the function gets exported from shared libraries. */ DLL_EXPORTED mtx_t *gl_get_setlocale_null_lock (void); /* Returns the internal lock used by setlocale_null_r. */ mtx_t * gl_get_setlocale_null_lock (void) { if (init_needed) call_once (&init_once, atomic_init); return &mutex; } # endif # if (defined _WIN32 || defined __CYGWIN__) && !defined _MSC_VER /* Make sure the '__declspec(dllimport)' in setlocale_null.c does not cause a link failure when no DLLs are involved. */ # if defined _WIN64 || defined _LP64 # define IMP(x) __imp_##x # else # define IMP(x) _imp__##x # endif void * IMP(gl_get_setlocale_null_lock) = &gl_get_setlocale_null_lock; # endif #endif pspp-1.4.1/gl/fatal-signal.h0000644000175000017500000000743713723215636015253 0ustar00blpblp00000000000000/* Emergency actions in case of a fatal signal. Copyright (C) 2003-2004, 2009-2020 Free Software Foundation, Inc. Written by Bruno Haible , 2003. 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 3 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, see . */ #ifndef _FATAL_SIGNAL_H #define _FATAL_SIGNAL_H #include #ifdef __cplusplus extern "C" { #endif /* It is often useful to do some cleanup action when a usually fatal signal terminates the process, like removing a temporary file or killing a subprocess that may be stuck waiting for a device, pipe or network input. Such signals are SIGHUP, SIGINT, SIGPIPE, SIGTERM, and possibly others. The limitation of this facility is that it cannot work for SIGKILL. Signals with a SIG_IGN handler are considered to be non-fatal. The functions in this file assume that when a SIG_IGN handler is installed for a signal, it was installed before any functions in this file were called and it stays so for the whole lifetime of the process. */ /* Register a cleanup function to be executed when a catchable fatal signal occurs. Restrictions for the cleanup function: - The cleanup function can do all kinds of system calls. It may also modify (clobber) errno. - It can also access application dependent memory locations and data structures provided they are in a consistent state. One way to ensure this is through block_fatal_signals()/unblock_fatal_signals(), see below. Another - more tricky - way to ensure this is the careful use of 'volatile'. However, - malloc() and similarly complex facilities are not safe to be called because they are not guaranteed to be in a consistent state. - Also, the cleanup function must not block the catchable fatal signals and leave them blocked upon return. The cleanup function is executed asynchronously. It is unspecified whether during its execution the catchable fatal signals are blocked or not. */ extern void at_fatal_signal (_GL_ASYNC_SAFE void (*function) (int sig)); /* Sometimes it is necessary to block the usually fatal signals while the data structures being accessed by the cleanup action are being built or reorganized. This is the case, for example, when a temporary file or directory is created through mkstemp() or mkdtemp(), because these functions create the temporary file or directory _before_ returning its name to the application. */ /* Temporarily delay the catchable fatal signals. The signals will be blocked (= delayed) until the next call to unblock_fatal_signals(). If the signals are already blocked, a further call to block_fatal_signals() has no effect. */ extern void block_fatal_signals (void); /* Stop delaying the catchable fatal signals. */ extern void unblock_fatal_signals (void); /* Return the list of signals that block_fatal_signals/unblock_fatal_signals would block or unblock. Fills signals[0..count-1] and returns count. */ extern unsigned int get_fatal_signals (int signals[64]); /* Return the list of signals that block_fatal_signals/unblock_fatal_signals would block or unblock. */ extern const sigset_t * get_fatal_signal_set (void); #ifdef __cplusplus } #endif #endif /* _FATAL_SIGNAL_H */ pspp-1.4.1/gl/langinfo.in.h0000644000175000017500000001506313723215637015106 0ustar00blpblp00000000000000/* Substitute for and wrapper around . Copyright (C) 2009-2020 Free Software Foundation, Inc. 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 3, 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, see . */ /* * POSIX for platforms that lack it or have an incomplete one. * */ #ifndef _@GUARD_PREFIX@_LANGINFO_H #if __GNUC__ >= 3 @PRAGMA_SYSTEM_HEADER@ #endif @PRAGMA_COLUMNS@ /* The include_next requires a split double-inclusion guard. */ #if @HAVE_LANGINFO_H@ # @INCLUDE_NEXT@ @NEXT_LANGINFO_H@ #endif #ifndef _@GUARD_PREFIX@_LANGINFO_H #define _@GUARD_PREFIX@_LANGINFO_H #if !@HAVE_LANGINFO_H@ /* A platform that lacks . */ /* Assume that it also lacks and the nl_item type. */ # if !GNULIB_defined_nl_item typedef int nl_item; # define GNULIB_defined_nl_item 1 # endif /* nl_langinfo items of the LC_CTYPE category */ # define CODESET 10000 /* nl_langinfo items of the LC_NUMERIC category */ # define RADIXCHAR 10001 # define DECIMAL_POINT RADIXCHAR # define THOUSEP 10002 # define THOUSANDS_SEP THOUSEP # define GROUPING 10114 /* nl_langinfo items of the LC_TIME category */ # define D_T_FMT 10003 # define D_FMT 10004 # define T_FMT 10005 # define T_FMT_AMPM 10006 # define AM_STR 10007 # define PM_STR 10008 # define DAY_1 10009 # define DAY_2 (DAY_1 + 1) # define DAY_3 (DAY_1 + 2) # define DAY_4 (DAY_1 + 3) # define DAY_5 (DAY_1 + 4) # define DAY_6 (DAY_1 + 5) # define DAY_7 (DAY_1 + 6) # define ABDAY_1 10016 # define ABDAY_2 (ABDAY_1 + 1) # define ABDAY_3 (ABDAY_1 + 2) # define ABDAY_4 (ABDAY_1 + 3) # define ABDAY_5 (ABDAY_1 + 4) # define ABDAY_6 (ABDAY_1 + 5) # define ABDAY_7 (ABDAY_1 + 6) # define MON_1 10023 # define MON_2 (MON_1 + 1) # define MON_3 (MON_1 + 2) # define MON_4 (MON_1 + 3) # define MON_5 (MON_1 + 4) # define MON_6 (MON_1 + 5) # define MON_7 (MON_1 + 6) # define MON_8 (MON_1 + 7) # define MON_9 (MON_1 + 8) # define MON_10 (MON_1 + 9) # define MON_11 (MON_1 + 10) # define MON_12 (MON_1 + 11) # define ALTMON_1 10200 # define ALTMON_2 (ALTMON_1 + 1) # define ALTMON_3 (ALTMON_1 + 2) # define ALTMON_4 (ALTMON_1 + 3) # define ALTMON_5 (ALTMON_1 + 4) # define ALTMON_6 (ALTMON_1 + 5) # define ALTMON_7 (ALTMON_1 + 6) # define ALTMON_8 (ALTMON_1 + 7) # define ALTMON_9 (ALTMON_1 + 8) # define ALTMON_10 (ALTMON_1 + 9) # define ALTMON_11 (ALTMON_1 + 10) # define ALTMON_12 (ALTMON_1 + 11) # define ABMON_1 10035 # define ABMON_2 (ABMON_1 + 1) # define ABMON_3 (ABMON_1 + 2) # define ABMON_4 (ABMON_1 + 3) # define ABMON_5 (ABMON_1 + 4) # define ABMON_6 (ABMON_1 + 5) # define ABMON_7 (ABMON_1 + 6) # define ABMON_8 (ABMON_1 + 7) # define ABMON_9 (ABMON_1 + 8) # define ABMON_10 (ABMON_1 + 9) # define ABMON_11 (ABMON_1 + 10) # define ABMON_12 (ABMON_1 + 11) # define ERA 10047 # define ERA_D_FMT 10048 # define ERA_D_T_FMT 10049 # define ERA_T_FMT 10050 # define ALT_DIGITS 10051 /* nl_langinfo items of the LC_MONETARY category */ # define CRNCYSTR 10052 # define CURRENCY_SYMBOL CRNCYSTR # define INT_CURR_SYMBOL 10100 # define MON_DECIMAL_POINT 10101 # define MON_THOUSANDS_SEP 10102 # define MON_GROUPING 10103 # define POSITIVE_SIGN 10104 # define NEGATIVE_SIGN 10105 # define FRAC_DIGITS 10106 # define INT_FRAC_DIGITS 10107 # define P_CS_PRECEDES 10108 # define N_CS_PRECEDES 10109 # define P_SEP_BY_SPACE 10110 # define N_SEP_BY_SPACE 10111 # define P_SIGN_POSN 10112 # define N_SIGN_POSN 10113 /* nl_langinfo items of the LC_MESSAGES category */ # define YESEXPR 10053 # define NOEXPR 10054 #else /* A platform that has . */ # if !@HAVE_LANGINFO_CODESET@ # define CODESET 10000 # define GNULIB_defined_CODESET 1 # endif # if !@HAVE_LANGINFO_T_FMT_AMPM@ # define T_FMT_AMPM 10006 # define GNULIB_defined_T_FMT_AMPM 1 # endif # if !@HAVE_LANGINFO_ALTMON@ # define ALTMON_1 10200 # define ALTMON_2 (ALTMON_1 + 1) # define ALTMON_3 (ALTMON_1 + 2) # define ALTMON_4 (ALTMON_1 + 3) # define ALTMON_5 (ALTMON_1 + 4) # define ALTMON_6 (ALTMON_1 + 5) # define ALTMON_7 (ALTMON_1 + 6) # define ALTMON_8 (ALTMON_1 + 7) # define ALTMON_9 (ALTMON_1 + 8) # define ALTMON_10 (ALTMON_1 + 9) # define ALTMON_11 (ALTMON_1 + 10) # define ALTMON_12 (ALTMON_1 + 11) # define GNULIB_defined_ALTMON 1 # endif # if !@HAVE_LANGINFO_ERA@ # define ERA 10047 # define ERA_D_FMT 10048 # define ERA_D_T_FMT 10049 # define ERA_T_FMT 10050 # define ALT_DIGITS 10051 # define GNULIB_defined_ERA 1 # endif # if !@HAVE_LANGINFO_YESEXPR@ # define YESEXPR 10053 # define NOEXPR 10054 # define GNULIB_defined_YESEXPR 1 # endif #endif /* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */ /* The definition of _GL_WARN_ON_USE is copied here. */ /* Declare overridden functions. */ /* Return a piece of locale dependent information. Note: The difference between nl_langinfo (CODESET) and locale_charset () is that the latter normalizes the encoding names to GNU conventions. */ #if @GNULIB_NL_LANGINFO@ # if @REPLACE_NL_LANGINFO@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef nl_langinfo # define nl_langinfo rpl_nl_langinfo # endif _GL_FUNCDECL_RPL (nl_langinfo, char *, (nl_item item)); _GL_CXXALIAS_RPL (nl_langinfo, char *, (nl_item item)); # else # if !@HAVE_NL_LANGINFO@ _GL_FUNCDECL_SYS (nl_langinfo, char *, (nl_item item)); # endif _GL_CXXALIAS_SYS (nl_langinfo, char *, (nl_item item)); # endif _GL_CXXALIASWARN (nl_langinfo); #elif defined GNULIB_POSIXCHECK # undef nl_langinfo # if HAVE_RAW_DECL_NL_LANGINFO _GL_WARN_ON_USE (nl_langinfo, "nl_langinfo is not portable - " "use gnulib module nl_langinfo for portability"); # endif #endif #endif /* _@GUARD_PREFIX@_LANGINFO_H */ #endif /* _@GUARD_PREFIX@_LANGINFO_H */ pspp-1.4.1/gl/sys_select.in.h0000644000175000017500000002755113723215640015465 0ustar00blpblp00000000000000/* Substitute for . Copyright (C) 2007-2020 Free Software Foundation, Inc. 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 3, 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, see . */ # if __GNUC__ >= 3 @PRAGMA_SYSTEM_HEADER@ # endif @PRAGMA_COLUMNS@ /* On OSF/1 and Solaris 2.6, and both include . On Cygwin, includes . Simply delegate to the system's header in this case. */ #if (@HAVE_SYS_SELECT_H@ \ && !defined _GL_SYS_SELECT_H_REDIRECT_FROM_SYS_TYPES_H \ && ((defined __osf__ && defined _SYS_TYPES_H_ \ && defined _OSF_SOURCE) \ || (defined __sun && defined _SYS_TYPES_H \ && (! (defined _XOPEN_SOURCE || defined _POSIX_C_SOURCE) \ || defined __EXTENSIONS__)))) # define _GL_SYS_SELECT_H_REDIRECT_FROM_SYS_TYPES_H # @INCLUDE_NEXT@ @NEXT_SYS_SELECT_H@ #elif (@HAVE_SYS_SELECT_H@ \ && (defined _CYGWIN_SYS_TIME_H \ || (!defined _GL_SYS_SELECT_H_REDIRECT_FROM_SYS_TIME_H \ && ((defined __osf__ && defined _SYS_TIME_H_ \ && defined _OSF_SOURCE) \ || (defined __sun && defined _SYS_TIME_H \ && (! (defined _XOPEN_SOURCE \ || defined _POSIX_C_SOURCE) \ || defined __EXTENSIONS__)))))) # define _GL_SYS_SELECT_H_REDIRECT_FROM_SYS_TIME_H # @INCLUDE_NEXT@ @NEXT_SYS_SELECT_H@ /* On IRIX 6.5, includes , which includes , which includes . At this point we cannot include , because that includes , which gives a syntax error because has not been completely processed. Simply delegate to the system's header in this case. */ #elif @HAVE_SYS_SELECT_H@ && defined __sgi && (defined _SYS_BSD_TYPES_H && !defined _GL_SYS_SELECT_H_REDIRECT_FROM_SYS_BSD_TYPES_H) # define _GL_SYS_SELECT_H_REDIRECT_FROM_SYS_BSD_TYPES_H # @INCLUDE_NEXT@ @NEXT_SYS_SELECT_H@ /* On OpenBSD 5.0, includes , which includes . At this point we cannot include , because that includes gnulib's pthread.h override, which gives a syntax error because /usr/include/pthread.h has not been completely processed. Simply delegate to the system's header in this case. */ #elif @HAVE_SYS_SELECT_H@ && defined __OpenBSD__ && (defined _PTHREAD_H_ && !defined PTHREAD_MUTEX_INITIALIZER) # @INCLUDE_NEXT@ @NEXT_SYS_SELECT_H@ #else #ifndef _@GUARD_PREFIX@_SYS_SELECT_H /* On many platforms, assumes prior inclusion of . Also, mingw defines sigset_t there, instead of in where it belongs. */ #include #if @HAVE_SYS_SELECT_H@ /* On OSF/1 4.0, provides only a forward declaration of 'struct timeval', and no definition of this type. Also, Mac OS X, AIX, HP-UX, IRIX, Solaris, Interix declare select() in . But avoid namespace pollution on glibc systems and "unknown type name" problems on Cygwin. */ # if !(defined __GLIBC__ || defined __CYGWIN__) # include # endif /* On AIX 7 and Solaris 10, provides an FD_ZERO implementation that relies on memset(), but without including . But in any case avoid namespace pollution on glibc systems. */ # if (defined __OpenBSD__ || defined _AIX || defined __sun || defined __osf__ || defined __BEOS__) \ && ! defined __GLIBC__ # include # endif /* The include_next requires a split double-inclusion guard. */ # @INCLUDE_NEXT@ @NEXT_SYS_SELECT_H@ #endif /* Get definition of 'sigset_t'. But avoid namespace pollution on glibc systems and "unknown type name" problems on Cygwin. Do this after the include_next (for the sake of OpenBSD 5.0) but before the split double-inclusion guard (for the sake of Solaris). */ #if !((defined __GLIBC__ || defined __CYGWIN__) && !defined __UCLIBC__) # include #endif #ifndef _@GUARD_PREFIX@_SYS_SELECT_H #define _@GUARD_PREFIX@_SYS_SELECT_H #if !@HAVE_SYS_SELECT_H@ /* A platform that lacks . */ /* Get the 'struct timeval' and 'fd_set' types and the FD_* macros on most platforms. */ # include /* On HP-UX 11, provides an FD_ZERO implementation that relies on memset(), but without including . */ # if defined __hpux # include # endif /* On native Windows platforms: Get the 'fd_set' type. Get the close() declaration before we override it. */ # if @HAVE_WINSOCK2_H@ # if !defined _GL_INCLUDING_WINSOCK2_H # define _GL_INCLUDING_WINSOCK2_H # include # undef _GL_INCLUDING_WINSOCK2_H # endif # include # endif #endif /* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */ /* The definition of _GL_WARN_ON_USE is copied here. */ /* Fix some definitions from . */ #if @HAVE_WINSOCK2_H@ # if !GNULIB_defined_rpl_fd_isset /* Re-define FD_ISSET to avoid a WSA call while we are not using network sockets. */ static int rpl_fd_isset (SOCKET fd, fd_set * set) { u_int i; if (set == NULL) return 0; for (i = 0; i < set->fd_count; i++) if (set->fd_array[i] == fd) return 1; return 0; } # define GNULIB_defined_rpl_fd_isset 1 # endif # undef FD_ISSET # define FD_ISSET(fd, set) rpl_fd_isset(fd, set) #endif /* Hide some function declarations from . */ #if @HAVE_WINSOCK2_H@ # if !defined _@GUARD_PREFIX@_UNISTD_H # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef close # define close close_used_without_including_unistd_h # else _GL_WARN_ON_USE (close, "close() used without including "); # endif # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef gethostname # define gethostname gethostname_used_without_including_unistd_h # else _GL_WARN_ON_USE (gethostname, "gethostname() used without including "); # endif # endif # if !defined _@GUARD_PREFIX@_SYS_SOCKET_H # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef socket # define socket socket_used_without_including_sys_socket_h # undef connect # define connect connect_used_without_including_sys_socket_h # undef accept # define accept accept_used_without_including_sys_socket_h # undef bind # define bind bind_used_without_including_sys_socket_h # undef getpeername # define getpeername getpeername_used_without_including_sys_socket_h # undef getsockname # define getsockname getsockname_used_without_including_sys_socket_h # undef getsockopt # define getsockopt getsockopt_used_without_including_sys_socket_h # undef listen # define listen listen_used_without_including_sys_socket_h # undef recv # define recv recv_used_without_including_sys_socket_h # undef send # define send send_used_without_including_sys_socket_h # undef recvfrom # define recvfrom recvfrom_used_without_including_sys_socket_h # undef sendto # define sendto sendto_used_without_including_sys_socket_h # undef setsockopt # define setsockopt setsockopt_used_without_including_sys_socket_h # undef shutdown # define shutdown shutdown_used_without_including_sys_socket_h # else _GL_WARN_ON_USE (socket, "socket() used without including "); _GL_WARN_ON_USE (connect, "connect() used without including "); _GL_WARN_ON_USE (accept, "accept() used without including "); _GL_WARN_ON_USE (bind, "bind() used without including "); _GL_WARN_ON_USE (getpeername, "getpeername() used without including "); _GL_WARN_ON_USE (getsockname, "getsockname() used without including "); _GL_WARN_ON_USE (getsockopt, "getsockopt() used without including "); _GL_WARN_ON_USE (listen, "listen() used without including "); _GL_WARN_ON_USE (recv, "recv() used without including "); _GL_WARN_ON_USE (send, "send() used without including "); _GL_WARN_ON_USE (recvfrom, "recvfrom() used without including "); _GL_WARN_ON_USE (sendto, "sendto() used without including "); _GL_WARN_ON_USE (setsockopt, "setsockopt() used without including "); _GL_WARN_ON_USE (shutdown, "shutdown() used without including "); # endif # endif #endif #if @GNULIB_PSELECT@ # if @REPLACE_PSELECT@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef pselect # define pselect rpl_pselect # endif _GL_FUNCDECL_RPL (pselect, int, (int, fd_set *restrict, fd_set *restrict, fd_set *restrict, struct timespec const *restrict, const sigset_t *restrict)); _GL_CXXALIAS_RPL (pselect, int, (int, fd_set *restrict, fd_set *restrict, fd_set *restrict, struct timespec const *restrict, const sigset_t *restrict)); # else # if !@HAVE_PSELECT@ _GL_FUNCDECL_SYS (pselect, int, (int, fd_set *restrict, fd_set *restrict, fd_set *restrict, struct timespec const *restrict, const sigset_t *restrict)); # endif _GL_CXXALIAS_SYS (pselect, int, (int, fd_set *restrict, fd_set *restrict, fd_set *restrict, struct timespec const *restrict, const sigset_t *restrict)); # endif _GL_CXXALIASWARN (pselect); #elif defined GNULIB_POSIXCHECK # undef pselect # if HAVE_RAW_DECL_PSELECT _GL_WARN_ON_USE (pselect, "pselect is not portable - " "use gnulib module pselect for portability"); # endif #endif #if @GNULIB_SELECT@ # if @REPLACE_SELECT@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef select # define select rpl_select # endif _GL_FUNCDECL_RPL (select, int, (int, fd_set *restrict, fd_set *restrict, fd_set *restrict, struct timeval *restrict)); _GL_CXXALIAS_RPL (select, int, (int, fd_set *restrict, fd_set *restrict, fd_set *restrict, timeval *restrict)); # else _GL_CXXALIAS_SYS (select, int, (int, fd_set *restrict, fd_set *restrict, fd_set *restrict, timeval *restrict)); # endif _GL_CXXALIASWARN (select); #elif @HAVE_WINSOCK2_H@ # undef select # define select select_used_without_requesting_gnulib_module_select #elif defined GNULIB_POSIXCHECK # undef select # if HAVE_RAW_DECL_SELECT _GL_WARN_ON_USE (select, "select is not always POSIX compliant - " "use gnulib module select for portability"); # endif #endif #endif /* _@GUARD_PREFIX@_SYS_SELECT_H */ #endif /* _@GUARD_PREFIX@_SYS_SELECT_H */ #endif /* OSF/1 */ pspp-1.4.1/gl/asyncsafe-spin.c0000644000175000017500000001733013723215636015620 0ustar00blpblp00000000000000/* Spin locks for communication between threads and signal handlers. Copyright (C) 2020 Free Software Foundation, Inc. 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 3, 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, see . */ /* Written by Bruno Haible , 2020. */ #include /* Specification. */ #include "asyncsafe-spin.h" #include #include #if defined _AIX # include #endif #if defined _WIN32 && ! defined __CYGWIN__ /* Use Windows threads. */ void asyncsafe_spin_init (asyncsafe_spinlock_t *lock) { glwthread_spin_init (lock); } static inline void do_lock (asyncsafe_spinlock_t *lock) { glwthread_spin_lock (lock); } static inline void do_unlock (asyncsafe_spinlock_t *lock) { if (glwthread_spin_unlock (lock)) abort (); } void asyncsafe_spin_destroy (asyncsafe_spinlock_t *lock) { glwthread_spin_destroy (lock); } #else # if HAVE_PTHREAD_H /* Use POSIX threads. */ /* We don't use semaphores (although sem_post() is allowed in signal handlers), because it would require to link with -lrt on HP-UX 11, OSF/1, Solaris 10, and also because on macOS only named semaphores work. We don't use the C11 (available in GCC >= 4.9) because it would require to link with -latomic. */ # if (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 7)) && !defined __ibmxl__ /* Use GCC built-ins (available in GCC >= 4.7) that operate on the first byte of the lock. Documentation: */ # if 1 /* An implementation that verifies the unlocks. */ void asyncsafe_spin_init (asyncsafe_spinlock_t *lock) { __atomic_store_n (lock, 0, __ATOMIC_SEQ_CST); } static inline void do_lock (asyncsafe_spinlock_t *lock) { /* Wait until *lock becomes 0, then replace it with 1. */ asyncsafe_spinlock_t zero; while (!(zero = 0, __atomic_compare_exchange_n (lock, &zero, 1, false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST))) ; } static inline void do_unlock (asyncsafe_spinlock_t *lock) { /* If *lock is 1, then replace it with 0. */ asyncsafe_spinlock_t one = 1; if (!__atomic_compare_exchange_n (lock, &one, 0, false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST)) abort (); } # else /* An implementation that is a little bit more optimized, but does not verify the unlocks. */ void asyncsafe_spin_init (asyncsafe_spinlock_t *lock) { __atomic_clear (lock, __ATOMIC_SEQ_CST); } static inline void do_lock (asyncsafe_spinlock_t *lock) { while (__atomic_test_and_set (lock, __ATOMIC_SEQ_CST)) ; } static inline void do_unlock (asyncsafe_spinlock_t *lock) { __atomic_clear (lock, __ATOMIC_SEQ_CST); } # endif # elif (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 1)) && !defined __ibmxl__ /* Use GCC built-ins (available in GCC >= 4.1). Documentation: */ void asyncsafe_spin_init (asyncsafe_spinlock_t *lock) { volatile unsigned int *vp = lock; *vp = 0; __sync_synchronize (); } static inline void do_lock (asyncsafe_spinlock_t *lock) { /* Wait until *lock becomes 0, then replace it with 1. */ while (__sync_val_compare_and_swap (lock, 0, 1) != 0) ; } static inline void do_unlock (asyncsafe_spinlock_t *lock) { /* If *lock is 1, then replace it with 0. */ if (__sync_val_compare_and_swap (lock, 1, 0) != 1) abort (); } # elif defined _AIX /* AIX */ void asyncsafe_spin_init (asyncsafe_spinlock_t *lock) { atomic_p vp = (int *) lock; _clear_lock (vp, 0); } static inline void do_lock (asyncsafe_spinlock_t *lock) { atomic_p vp = (int *) lock; while (_check_lock (vp, 0, 1)) ; } static inline void do_unlock (asyncsafe_spinlock_t *lock) { atomic_p vp = (int *) lock; if (_check_lock (vp, 1, 0)) abort (); } # elif (defined __GNUC__ || defined __SUNPRO_C) && (defined __sparc || defined __i386 || defined __x86_64__) /* For older versions of GCC, use inline assembly. GCC and the Oracle Studio C 12 compiler understand GCC's extended asm syntax, but the plain Oracle Studio C 11 compiler understands only simple asm. */ /* An implementation that verifies the unlocks. */ static void memory_barrier (void) { # if defined __GNUC__ || __SUNPRO_C >= 0x590 # if defined __i386 || defined __x86_64__ asm volatile ("mfence"); # endif # if defined __sparc asm volatile ("membar 2"); # endif # else # if defined __i386 || defined __x86_64__ asm ("mfence"); # endif # if defined __sparc asm ("membar 2"); # endif # endif } /* Store NEWVAL in *VP if the old value *VP is == CMP. Return the old value. */ static unsigned int atomic_compare_and_swap (volatile unsigned int *vp, unsigned int cmp, unsigned int newval) { # if defined __GNUC__ || __SUNPRO_C >= 0x590 unsigned int oldval; # if defined __i386 || defined __x86_64__ asm volatile (" lock\n cmpxchgl %3,(%1)" : "=a" (oldval) : "r" (vp), "a" (cmp), "r" (newval) : "memory"); # endif # if defined __sparc asm volatile (" cas [%1],%2,%3\n" " mov %3,%0" : "=r" (oldval) : "r" (vp), "r" (cmp), "r" (newval) : "memory"); # endif return oldval; # else /* __SUNPRO_C */ # if defined __x86_64__ asm (" movl %esi,%eax\n" " lock\n cmpxchgl %edx,(%rdi)"); # elif defined __i386 asm (" movl 16(%ebp),%ecx\n" " movl 12(%ebp),%eax\n" " movl 8(%ebp),%edx\n" " lock\n cmpxchgl %ecx,(%edx)"); # endif # if defined __sparc asm (" cas [%i0],%i1,%i2\n" " mov %i2,%i0"); # endif # endif } void asyncsafe_spin_init (asyncsafe_spinlock_t *lock) { volatile unsigned int *vp = lock; *vp = 0; memory_barrier (); } static inline void do_lock (asyncsafe_spinlock_t *lock) { volatile unsigned int *vp = lock; while (atomic_compare_and_swap (vp, 0, 1) != 0) ; } static inline void do_unlock (asyncsafe_spinlock_t *lock) { volatile unsigned int *vp = lock; if (atomic_compare_and_swap (vp, 1, 0) != 1) abort (); } # else /* Fallback code. It has some race conditions. */ void asyncsafe_spin_init (asyncsafe_spinlock_t *lock) { volatile unsigned int *vp = lock; *vp = 0; } static inline void do_lock (asyncsafe_spinlock_t *lock) { volatile unsigned int *vp = lock; while (*vp) ; *vp = 1; } static inline void do_unlock (asyncsafe_spinlock_t *lock) { volatile unsigned int *vp = lock; *vp = 0; } # endif # else /* Provide a dummy implementation for single-threaded applications. */ void asyncsafe_spin_init (asyncsafe_spinlock_t *lock) { } static inline void do_lock (asyncsafe_spinlock_t *lock) { } static inline void do_unlock (asyncsafe_spinlock_t *lock) { } # endif void asyncsafe_spin_destroy (asyncsafe_spinlock_t *lock) { } #endif void asyncsafe_spin_lock (asyncsafe_spinlock_t *lock, const sigset_t *mask, sigset_t *saved_mask) { sigprocmask (SIG_BLOCK, mask, saved_mask); /* equivalent to pthread_sigmask */ do_lock (lock); } void asyncsafe_spin_unlock (asyncsafe_spinlock_t *lock, const sigset_t *saved_mask) { do_unlock (lock); sigprocmask (SIG_SETMASK, saved_mask, NULL); /* equivalent to pthread_sigmask */ } pspp-1.4.1/gl/setlocale_null.h0000644000175000017500000000664313723215640015707 0ustar00blpblp00000000000000/* Query the name of the current global locale. Copyright (C) 2019-2020 Free Software Foundation, Inc. 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 3 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, see . */ /* Written by Bruno Haible , 2019. */ #ifndef _SETLOCALE_NULL_H #define _SETLOCALE_NULL_H #include #include "arg-nonnull.h" #ifdef __cplusplus extern "C" { #endif /* Recommended size of a buffer for a locale name for a single category. On glibc systems, you can have locale names that are relative file names; assume a maximum length 256. In native Windows, in 2018 the longest locale name was of length 58 ("FYRO Macedonian_Former Yugoslav Republic of Macedonia.1251"). */ #define SETLOCALE_NULL_MAX (256+1) /* Recommended size of a buffer for a locale name with all categories. On glibc systems, you can have locale names that are relative file names; assume maximum length 256 for each. There are 12 categories; so, the maximum total length is 148+12*256. In native Windows, there are 5 categories, and the maximum total length is 55+5*58. */ #define SETLOCALE_NULL_ALL_MAX (148+12*256+1) /* setlocale_null_r (CATEGORY, BUF, BUFSIZE) is like setlocale (CATEGORY, NULL), except that - it is guaranteed to be multithread-safe, - it returns the resulting locale category name or locale name in the user-supplied buffer BUF, which must be BUFSIZE bytes long. The recommended minimum buffer size is - SETLOCALE_NULL_MAX for CATEGORY != LC_ALL, and - SETLOCALE_NULL_ALL_MAX for CATEGORY == LC_ALL. The return value is an error code: 0 if the call is successful, EINVAL if CATEGORY is invalid, or ERANGE if BUFSIZE is smaller than the length needed size (including the trailing NUL byte). In the latter case, a truncated result is returned in BUF, but still NUL-terminated if BUFSIZE > 0. For this call to be multithread-safe, *all* calls to setlocale (CATEGORY, NULL) in all other threads must have been converted to use setlocale_null_r or setlocale_null as well, and the other threads must not make other setlocale invocations (since changing the global locale has side effects on all threads). */ extern int setlocale_null_r (int category, char *buf, size_t bufsize) _GL_ARG_NONNULL ((2)); /* setlocale_null (CATEGORY) is like setlocale (CATEGORY, NULL), except that it is guaranteed to be multithread-safe. The return value is NULL if CATEGORY is invalid. For this call to be multithread-safe, *all* calls to setlocale (CATEGORY, NULL) in all other threads must have been converted to use setlocale_null_r or setlocale_null as well, and the other threads must not make other setlocale invocations (since changing the global locale has side effects on all threads). */ extern const char *setlocale_null (int category); #ifdef __cplusplus } #endif #endif /* _SETLOCALE_NULL_H */ pspp-1.4.1/gl/vasnprintf.c0000644000175000017500000071227413723215640015073 0ustar00blpblp00000000000000/* vsprintf with automatic memory allocation. Copyright (C) 1999, 2002-2020 Free Software Foundation, Inc. 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 3, 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, see . */ /* This file can be parametrized with the following macros: VASNPRINTF The name of the function being defined. FCHAR_T The element type of the format string. DCHAR_T The element type of the destination (result) string. FCHAR_T_ONLY_ASCII Set to 1 to enable verification that all characters in the format string are ASCII. MUST be set if FCHAR_T and DCHAR_T are not the same type. DIRECTIVE Structure denoting a format directive. Depends on FCHAR_T. DIRECTIVES Structure denoting the set of format directives of a format string. Depends on FCHAR_T. PRINTF_PARSE Function that parses a format string. Depends on FCHAR_T. DCHAR_CPY memcpy like function for DCHAR_T[] arrays. DCHAR_SET memset like function for DCHAR_T[] arrays. DCHAR_MBSNLEN mbsnlen like function for DCHAR_T[] arrays. SNPRINTF The system's snprintf (or similar) function. This may be either snprintf or swprintf. TCHAR_T The element type of the argument and result string of the said SNPRINTF function. This may be either char or wchar_t. The code exploits that sizeof (TCHAR_T) | sizeof (DCHAR_T) and alignof (TCHAR_T) <= alignof (DCHAR_T). DCHAR_IS_TCHAR Set to 1 if DCHAR_T and TCHAR_T are the same type. DCHAR_CONV_FROM_ENCODING A function to convert from char[] to DCHAR[]. DCHAR_IS_UINT8_T Set to 1 if DCHAR_T is uint8_t. DCHAR_IS_UINT16_T Set to 1 if DCHAR_T is uint16_t. DCHAR_IS_UINT32_T Set to 1 if DCHAR_T is uint32_t. ENABLE_UNISTDIO Set to 1 to enable the unistdio extensions. ENABLE_WCHAR_FALLBACK Set to 1 to avoid EILSEQ during conversion of wide characters (wchar_t) and wide character strings (wchar_t[]) to multibyte sequences. The fallback is the hexadecimal escape syntax (\unnnn or \Unnnnnnnn) or, if wchar_t is not Unicode encoded, \wnnnn or \Wnnnnnnnn. */ /* Tell glibc's to provide a prototype for snprintf(). This must come before because may include , and once has been included, it's too late. */ #ifndef _GNU_SOURCE # define _GNU_SOURCE 1 #endif #ifndef VASNPRINTF # include #endif #ifndef IN_LIBINTL # include #endif /* Specification. */ #ifndef VASNPRINTF # if WIDE_CHAR_VERSION # include "vasnwprintf.h" # else # include "vasnprintf.h" # endif #endif #include /* localeconv() */ #include /* snprintf(), sprintf() */ #include /* abort(), malloc(), realloc(), free() */ #include /* memcpy(), strlen() */ #include /* errno */ #include /* CHAR_BIT */ #include /* DBL_MAX_EXP, LDBL_MAX_EXP */ #if HAVE_NL_LANGINFO # include #endif #ifndef VASNPRINTF # if WIDE_CHAR_VERSION # include "wprintf-parse.h" # else # include "printf-parse.h" # endif #endif /* Checked size_t computations. */ #include "xsize.h" #include "attribute.h" #include "verify.h" #if (NEED_PRINTF_DOUBLE || NEED_PRINTF_LONG_DOUBLE) && !defined IN_LIBINTL # include # include "float+.h" #endif #if (NEED_PRINTF_DOUBLE || NEED_PRINTF_INFINITE_DOUBLE) && !defined IN_LIBINTL # include # include "isnand-nolibm.h" #endif #if (NEED_PRINTF_LONG_DOUBLE || NEED_PRINTF_INFINITE_LONG_DOUBLE) && !defined IN_LIBINTL # include # include "isnanl-nolibm.h" # include "fpucw.h" #endif #if (NEED_PRINTF_DIRECTIVE_A || NEED_PRINTF_DOUBLE) && !defined IN_LIBINTL # include # include "isnand-nolibm.h" # include "printf-frexp.h" #endif #if (NEED_PRINTF_DIRECTIVE_A || NEED_PRINTF_LONG_DOUBLE) && !defined IN_LIBINTL # include # include "isnanl-nolibm.h" # include "printf-frexpl.h" # include "fpucw.h" #endif /* Default parameters. */ #ifndef VASNPRINTF # if WIDE_CHAR_VERSION # define VASNPRINTF vasnwprintf # define FCHAR_T wchar_t # define DCHAR_T wchar_t # define TCHAR_T wchar_t # define DCHAR_IS_TCHAR 1 # define DIRECTIVE wchar_t_directive # define DIRECTIVES wchar_t_directives # define PRINTF_PARSE wprintf_parse # define DCHAR_CPY wmemcpy # define DCHAR_SET wmemset # else # define VASNPRINTF vasnprintf # define FCHAR_T char # define DCHAR_T char # define TCHAR_T char # define DCHAR_IS_TCHAR 1 # define DIRECTIVE char_directive # define DIRECTIVES char_directives # define PRINTF_PARSE printf_parse # define DCHAR_CPY memcpy # define DCHAR_SET memset # endif #endif #if WIDE_CHAR_VERSION /* TCHAR_T is wchar_t. */ # define USE_SNPRINTF 1 # if HAVE_DECL__SNWPRINTF /* On Windows, the function swprintf() has a different signature than on Unix; we use the function _snwprintf() or - on mingw - snwprintf() instead. The mingw function snwprintf() has fewer bugs than the MSVCRT function _snwprintf(), so prefer that. */ # if defined __MINGW32__ # define SNPRINTF snwprintf # else # define SNPRINTF _snwprintf # define USE_MSVC__SNPRINTF 1 # endif # else /* Unix. */ # define SNPRINTF swprintf # endif #else /* TCHAR_T is char. */ /* Use snprintf if it exists under the name 'snprintf' or '_snprintf'. But don't use it on BeOS, since BeOS snprintf produces no output if the size argument is >= 0x3000000. Also don't use it on Linux libc5, since there snprintf with size = 1 writes any output without bounds, like sprintf. */ # if (HAVE_DECL__SNPRINTF || HAVE_SNPRINTF) && !defined __BEOS__ && !(__GNU_LIBRARY__ == 1) # define USE_SNPRINTF 1 # else # define USE_SNPRINTF 0 # endif # if HAVE_DECL__SNPRINTF /* Windows. The mingw function snprintf() has fewer bugs than the MSVCRT function _snprintf(), so prefer that. */ # if defined __MINGW32__ # define SNPRINTF snprintf /* Here we need to call the native snprintf, not rpl_snprintf. */ # undef snprintf # else /* MSVC versions < 14 did not have snprintf, only _snprintf. */ # define SNPRINTF _snprintf # define USE_MSVC__SNPRINTF 1 # endif # else /* Unix. */ # define SNPRINTF snprintf /* Here we need to call the native snprintf, not rpl_snprintf. */ # undef snprintf # endif #endif /* Here we need to call the native sprintf, not rpl_sprintf. */ #undef sprintf /* GCC >= 4.0 with -Wall emits unjustified "... may be used uninitialized" warnings in this file. Use -Dlint to suppress them. */ #if defined GCC_LINT || defined lint # define IF_LINT(Code) Code #else # define IF_LINT(Code) /* empty */ #endif /* Avoid some warnings from "gcc -Wshadow". This file doesn't use the exp() and remainder() functions. */ #undef exp #define exp expo #undef remainder #define remainder rem #if (!USE_SNPRINTF || !HAVE_SNPRINTF_RETVAL_C99 || USE_MSVC__SNPRINTF) && !WIDE_CHAR_VERSION # if (HAVE_STRNLEN && !defined _AIX) # define local_strnlen strnlen # else # ifndef local_strnlen_defined # define local_strnlen_defined 1 static size_t local_strnlen (const char *string, size_t maxlen) { const char *end = memchr (string, '\0', maxlen); return end ? (size_t) (end - string) : maxlen; } # endif # endif #endif #if (((!USE_SNPRINTF || !HAVE_SNPRINTF_RETVAL_C99 || USE_MSVC__SNPRINTF) && WIDE_CHAR_VERSION) || ((!USE_SNPRINTF || !HAVE_SNPRINTF_RETVAL_C99 || USE_MSVC__SNPRINTF || (NEED_PRINTF_DIRECTIVE_LS && !defined IN_LIBINTL)) && !WIDE_CHAR_VERSION && DCHAR_IS_TCHAR)) && HAVE_WCHAR_T # if HAVE_WCSLEN # define local_wcslen wcslen # else /* Solaris 2.5.1 has wcslen() in a separate library libw.so. To avoid a dependency towards this library, here is a local substitute. Define this substitute only once, even if this file is included twice in the same compilation unit. */ # ifndef local_wcslen_defined # define local_wcslen_defined 1 static size_t local_wcslen (const wchar_t *s) { const wchar_t *ptr; for (ptr = s; *ptr != (wchar_t) 0; ptr++) ; return ptr - s; } # endif # endif #endif #if (!USE_SNPRINTF || !HAVE_SNPRINTF_RETVAL_C99 || USE_MSVC__SNPRINTF) && HAVE_WCHAR_T && WIDE_CHAR_VERSION # if HAVE_WCSNLEN # define local_wcsnlen wcsnlen # else # ifndef local_wcsnlen_defined # define local_wcsnlen_defined 1 static size_t local_wcsnlen (const wchar_t *s, size_t maxlen) { const wchar_t *ptr; for (ptr = s; maxlen > 0 && *ptr != (wchar_t) 0; ptr++, maxlen--) ; return ptr - s; } # endif # endif #endif #if (((!USE_SNPRINTF || !HAVE_SNPRINTF_RETVAL_C99 || USE_MSVC__SNPRINTF || (NEED_PRINTF_DIRECTIVE_LS && !defined IN_LIBINTL) || ENABLE_WCHAR_FALLBACK) && HAVE_WCHAR_T) || (ENABLE_WCHAR_FALLBACK && HAVE_WINT_T)) && !WIDE_CHAR_VERSION # if ENABLE_WCHAR_FALLBACK static size_t wctomb_fallback (char *s, wchar_t wc) { static char hex[16] = "0123456789ABCDEF"; s[0] = '\\'; if (sizeof (wchar_t) > 2 && wc > 0xffff) { # if __STDC_ISO_10646__ || (__GLIBC__ >= 2) || (defined _WIN32 || defined __CYGWIN__) s[1] = 'U'; # else s[1] = 'W'; # endif s[2] = hex[(wc & 0xf0000000U) >> 28]; s[3] = hex[(wc & 0xf000000U) >> 24]; s[4] = hex[(wc & 0xf00000U) >> 20]; s[5] = hex[(wc & 0xf0000U) >> 16]; s[6] = hex[(wc & 0xf000U) >> 12]; s[7] = hex[(wc & 0xf00U) >> 8]; s[8] = hex[(wc & 0xf0U) >> 4]; s[9] = hex[wc & 0xfU]; return 10; } else { # if __STDC_ISO_10646__ || (__GLIBC__ >= 2) || (defined _WIN32 || defined __CYGWIN__) s[1] = 'u'; # else s[1] = 'w'; # endif s[2] = hex[(wc & 0xf000U) >> 12]; s[3] = hex[(wc & 0xf00U) >> 8]; s[4] = hex[(wc & 0xf0U) >> 4]; s[5] = hex[wc & 0xfU]; return 6; } } # if HAVE_WCRTOMB && !defined GNULIB_defined_mbstate_t static size_t local_wcrtomb (char *s, wchar_t wc, mbstate_t *ps) { size_t count = wcrtomb (s, wc, ps); if (count == (size_t)(-1)) count = wctomb_fallback (s, wc); return count; } # else static int local_wctomb (char *s, wchar_t wc) { int count = wctomb (s, wc); if (count < 0) count = wctomb_fallback (s, wc); return count; } # define local_wcrtomb(S, WC, PS) local_wctomb ((S), (WC)) # endif # else # if HAVE_WCRTOMB && !defined GNULIB_defined_mbstate_t # define local_wcrtomb(S, WC, PS) wcrtomb ((S), (WC), (PS)) # else # define local_wcrtomb(S, WC, PS) wctomb ((S), (WC)) # endif # endif #endif #if (NEED_PRINTF_DIRECTIVE_A || NEED_PRINTF_LONG_DOUBLE || NEED_PRINTF_INFINITE_LONG_DOUBLE || NEED_PRINTF_DOUBLE || NEED_PRINTF_INFINITE_DOUBLE) && !defined IN_LIBINTL /* Determine the decimal-point character according to the current locale. */ # ifndef decimal_point_char_defined # define decimal_point_char_defined 1 static char decimal_point_char (void) { const char *point; /* Determine it in a multithread-safe way. We know nl_langinfo is multithread-safe on glibc systems and Mac OS X systems, but is not required to be multithread-safe by POSIX. sprintf(), however, is multithread-safe. localeconv() is rarely multithread-safe. */ # if HAVE_NL_LANGINFO && (__GLIBC__ || defined __UCLIBC__ || (defined __APPLE__ && defined __MACH__)) point = nl_langinfo (RADIXCHAR); # elif 1 char pointbuf[5]; sprintf (pointbuf, "%#.0f", 1.0); point = &pointbuf[1]; # else point = localeconv () -> decimal_point; # endif /* The decimal point is always a single byte: either '.' or ','. */ return (point[0] != '\0' ? point[0] : '.'); } # endif #endif #if NEED_PRINTF_INFINITE_DOUBLE && !NEED_PRINTF_DOUBLE && !defined IN_LIBINTL /* Equivalent to !isfinite(x) || x == 0, but does not require libm. */ static int is_infinite_or_zero (double x) { return isnand (x) || x + x == x; } #endif #if NEED_PRINTF_INFINITE_LONG_DOUBLE && !NEED_PRINTF_LONG_DOUBLE && !defined IN_LIBINTL /* Equivalent to !isfinite(x) || x == 0, but does not require libm. */ static int is_infinite_or_zerol (long double x) { return isnanl (x) || x + x == x; } #endif #if (NEED_PRINTF_LONG_DOUBLE || NEED_PRINTF_DOUBLE) && !defined IN_LIBINTL /* Converting 'long double' to decimal without rare rounding bugs requires real bignums. We use the naming conventions of GNU gmp, but vastly simpler (and slower) algorithms. */ typedef unsigned int mp_limb_t; # define GMP_LIMB_BITS 32 verify (sizeof (mp_limb_t) * CHAR_BIT == GMP_LIMB_BITS); typedef unsigned long long mp_twolimb_t; # define GMP_TWOLIMB_BITS 64 verify (sizeof (mp_twolimb_t) * CHAR_BIT == GMP_TWOLIMB_BITS); /* Representation of a bignum >= 0. */ typedef struct { size_t nlimbs; mp_limb_t *limbs; /* Bits in little-endian order, allocated with malloc(). */ } mpn_t; /* Compute the product of two bignums >= 0. Return the allocated memory in case of success, NULL in case of memory allocation failure. */ static void * multiply (mpn_t src1, mpn_t src2, mpn_t *dest) { const mp_limb_t *p1; const mp_limb_t *p2; size_t len1; size_t len2; if (src1.nlimbs <= src2.nlimbs) { len1 = src1.nlimbs; p1 = src1.limbs; len2 = src2.nlimbs; p2 = src2.limbs; } else { len1 = src2.nlimbs; p1 = src2.limbs; len2 = src1.nlimbs; p2 = src1.limbs; } /* Now 0 <= len1 <= len2. */ if (len1 == 0) { /* src1 or src2 is zero. */ dest->nlimbs = 0; dest->limbs = (mp_limb_t *) malloc (1); } else { /* Here 1 <= len1 <= len2. */ size_t dlen; mp_limb_t *dp; size_t k, i, j; dlen = len1 + len2; dp = (mp_limb_t *) malloc (dlen * sizeof (mp_limb_t)); if (dp == NULL) return NULL; for (k = len2; k > 0; ) dp[--k] = 0; for (i = 0; i < len1; i++) { mp_limb_t digit1 = p1[i]; mp_twolimb_t carry = 0; for (j = 0; j < len2; j++) { mp_limb_t digit2 = p2[j]; carry += (mp_twolimb_t) digit1 * (mp_twolimb_t) digit2; carry += dp[i + j]; dp[i + j] = (mp_limb_t) carry; carry = carry >> GMP_LIMB_BITS; } dp[i + len2] = (mp_limb_t) carry; } /* Normalise. */ while (dlen > 0 && dp[dlen - 1] == 0) dlen--; dest->nlimbs = dlen; dest->limbs = dp; } return dest->limbs; } /* Compute the quotient of a bignum a >= 0 and a bignum b > 0. a is written as a = q * b + r with 0 <= r < b. q is the quotient, r the remainder. Finally, round-to-even is performed: If r > b/2 or if r = b/2 and q is odd, q is incremented. Return the allocated memory in case of success, NULL in case of memory allocation failure. */ static void * divide (mpn_t a, mpn_t b, mpn_t *q) { /* Algorithm: First normalise a and b: a=[a[m-1],...,a[0]], b=[b[n-1],...,b[0]] with m>=0 and n>0 (in base beta = 2^GMP_LIMB_BITS). If m=n=1, perform a single-precision division: r:=0, j:=m, while j>0 do {Here (q[m-1]*beta^(m-1)+...+q[j]*beta^j) * b[0] + r*beta^j = = a[m-1]*beta^(m-1)+...+a[j]*beta^j und 0<=r=n>1, perform a multiple-precision division: We have a/b < beta^(m-n+1). s:=intDsize-1-(highest bit in b[n-1]), 0<=s=beta/2. For j=m-n,...,0: {Here 0 <= r < b*beta^(j+1).} Compute q* : q* := floor((r[j+n]*beta+r[j+n-1])/b[n-1]). In case of overflow (q* >= beta) set q* := beta-1. Compute c2 := ((r[j+n]*beta+r[j+n-1]) - q* * b[n-1])*beta + r[j+n-2] and c3 := b[n-2] * q*. {We have 0 <= c2 < 2*beta^2, even 0 <= c2 < beta^2 if no overflow occurred. Furthermore 0 <= c3 < beta^2. If there was overflow and r[j+n]*beta+r[j+n-1] - q* * b[n-1] >= beta, i.e. c2 >= beta^2, the next test can be skipped.} While c3 > c2, {Here 0 <= c2 < c3 < beta^2} Put q* := q* - 1, c2 := c2 + b[n-1]*beta, c3 := c3 - b[n-2]. If q* > 0: Put r := r - b * q* * beta^j. In detail: [r[n+j],...,r[j]] := [r[n+j],...,r[j]] - q* * [b[n-1],...,b[0]]. hence: u:=0, for i:=0 to n-1 do u := u + q* * b[i], r[j+i]:=r[j+i]-(u mod beta) (+ beta, if carry), u:=u div beta (+ 1, if carry in subtraction) r[n+j]:=r[n+j]-u. {Since always u = (q* * [b[i-1],...,b[0]] div beta^i) + 1 < q* + 1 <= beta, the carry u does not overflow.} If a negative carry occurs, put q* := q* - 1 and [r[n+j],...,r[j]] := [r[n+j],...,r[j]] + [0,b[n-1],...,b[0]]. Set q[j] := q*. Normalise [q[m-n],..,q[0]]; this yields the quotient q. Shift [r[n-1],...,r[0]] right by s bits and normalise; this yields the rest r. The room for q[j] can be allocated at the memory location of r[n+j]. Finally, round-to-even: Shift r left by 1 bit. If r > b or if r = b and q[0] is odd, q := q+1. */ const mp_limb_t *a_ptr = a.limbs; size_t a_len = a.nlimbs; const mp_limb_t *b_ptr = b.limbs; size_t b_len = b.nlimbs; mp_limb_t *roomptr; mp_limb_t *tmp_roomptr = NULL; mp_limb_t *q_ptr; size_t q_len; mp_limb_t *r_ptr; size_t r_len; /* Allocate room for a_len+2 digits. (Need a_len+1 digits for the real division and 1 more digit for the final rounding of q.) */ roomptr = (mp_limb_t *) malloc ((a_len + 2) * sizeof (mp_limb_t)); if (roomptr == NULL) return NULL; /* Normalise a. */ while (a_len > 0 && a_ptr[a_len - 1] == 0) a_len--; /* Normalise b. */ for (;;) { if (b_len == 0) /* Division by zero. */ abort (); if (b_ptr[b_len - 1] == 0) b_len--; else break; } /* Here m = a_len >= 0 and n = b_len > 0. */ if (a_len < b_len) { /* m beta^(m-2) <= a/b < beta^m */ r_ptr = roomptr; q_ptr = roomptr + 1; { mp_limb_t den = b_ptr[0]; mp_limb_t remainder = 0; const mp_limb_t *sourceptr = a_ptr + a_len; mp_limb_t *destptr = q_ptr + a_len; size_t count; for (count = a_len; count > 0; count--) { mp_twolimb_t num = ((mp_twolimb_t) remainder << GMP_LIMB_BITS) | *--sourceptr; *--destptr = num / den; remainder = num % den; } /* Normalise and store r. */ if (remainder > 0) { r_ptr[0] = remainder; r_len = 1; } else r_len = 0; /* Normalise q. */ q_len = a_len; if (q_ptr[q_len - 1] == 0) q_len--; } } else { /* n>1: multiple precision division. beta^(m-1) <= a < beta^m, beta^(n-1) <= b < beta^n ==> beta^(m-n-1) <= a/b < beta^(m-n+1). */ /* Determine s. */ size_t s; { mp_limb_t msd = b_ptr[b_len - 1]; /* = b[n-1], > 0 */ /* Determine s = GMP_LIMB_BITS - integer_length (msd). Code copied from gnulib's integer_length.c. */ # if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4) \ || (__clang_major__ >= 4) s = __builtin_clz (msd); # else # if defined DBL_EXPBIT0_WORD && defined DBL_EXPBIT0_BIT if (GMP_LIMB_BITS <= DBL_MANT_BIT) { /* Use 'double' operations. Assumes an IEEE 754 'double' implementation. */ # define DBL_EXP_MASK ((DBL_MAX_EXP - DBL_MIN_EXP) | 7) # define DBL_EXP_BIAS (DBL_EXP_MASK / 2 - 1) # define NWORDS \ ((sizeof (double) + sizeof (unsigned int) - 1) / sizeof (unsigned int)) union { double value; unsigned int word[NWORDS]; } m; /* Use a single integer to floating-point conversion. */ m.value = msd; s = GMP_LIMB_BITS - (((m.word[DBL_EXPBIT0_WORD] >> DBL_EXPBIT0_BIT) & DBL_EXP_MASK) - DBL_EXP_BIAS); } else # undef NWORDS # endif { s = 31; if (msd >= 0x10000) { msd = msd >> 16; s -= 16; } if (msd >= 0x100) { msd = msd >> 8; s -= 8; } if (msd >= 0x10) { msd = msd >> 4; s -= 4; } if (msd >= 0x4) { msd = msd >> 2; s -= 2; } if (msd >= 0x2) { msd = msd >> 1; s -= 1; } } # endif } /* 0 <= s < GMP_LIMB_BITS. Copy b, shifting it left by s bits. */ if (s > 0) { tmp_roomptr = (mp_limb_t *) malloc (b_len * sizeof (mp_limb_t)); if (tmp_roomptr == NULL) { free (roomptr); return NULL; } { const mp_limb_t *sourceptr = b_ptr; mp_limb_t *destptr = tmp_roomptr; mp_twolimb_t accu = 0; size_t count; for (count = b_len; count > 0; count--) { accu += (mp_twolimb_t) *sourceptr++ << s; *destptr++ = (mp_limb_t) accu; accu = accu >> GMP_LIMB_BITS; } /* accu must be zero, since that was how s was determined. */ if (accu != 0) abort (); } b_ptr = tmp_roomptr; } /* Copy a, shifting it left by s bits, yields r. Memory layout: At the beginning: r = roomptr[0..a_len], at the end: r = roomptr[0..b_len-1], q = roomptr[b_len..a_len] */ r_ptr = roomptr; if (s == 0) { memcpy (r_ptr, a_ptr, a_len * sizeof (mp_limb_t)); r_ptr[a_len] = 0; } else { const mp_limb_t *sourceptr = a_ptr; mp_limb_t *destptr = r_ptr; mp_twolimb_t accu = 0; size_t count; for (count = a_len; count > 0; count--) { accu += (mp_twolimb_t) *sourceptr++ << s; *destptr++ = (mp_limb_t) accu; accu = accu >> GMP_LIMB_BITS; } *destptr++ = (mp_limb_t) accu; } q_ptr = roomptr + b_len; q_len = a_len - b_len + 1; /* q will have m-n+1 limbs */ { size_t j = a_len - b_len; /* m-n */ mp_limb_t b_msd = b_ptr[b_len - 1]; /* b[n-1] */ mp_limb_t b_2msd = b_ptr[b_len - 2]; /* b[n-2] */ mp_twolimb_t b_msdd = /* b[n-1]*beta+b[n-2] */ ((mp_twolimb_t) b_msd << GMP_LIMB_BITS) | b_2msd; /* Division loop, traversed m-n+1 times. j counts down, b is unchanged, beta/2 <= b[n-1] < beta. */ for (;;) { mp_limb_t q_star; mp_limb_t c1; if (r_ptr[j + b_len] < b_msd) /* r[j+n] < b[n-1] ? */ { /* Divide r[j+n]*beta+r[j+n-1] by b[n-1], no overflow. */ mp_twolimb_t num = ((mp_twolimb_t) r_ptr[j + b_len] << GMP_LIMB_BITS) | r_ptr[j + b_len - 1]; q_star = num / b_msd; c1 = num % b_msd; } else { /* Overflow, hence r[j+n]*beta+r[j+n-1] >= beta*b[n-1]. */ q_star = (mp_limb_t)~(mp_limb_t)0; /* q* = beta-1 */ /* Test whether r[j+n]*beta+r[j+n-1] - (beta-1)*b[n-1] >= beta <==> r[j+n]*beta+r[j+n-1] + b[n-1] >= beta*b[n-1]+beta <==> b[n-1] < floor((r[j+n]*beta+r[j+n-1]+b[n-1])/beta) {<= beta !}. If yes, jump directly to the subtraction loop. (Otherwise, r[j+n]*beta+r[j+n-1] - (beta-1)*b[n-1] < beta <==> floor((r[j+n]*beta+r[j+n-1]+b[n-1])/beta) = b[n-1] ) */ if (r_ptr[j + b_len] > b_msd || (c1 = r_ptr[j + b_len - 1] + b_msd) < b_msd) /* r[j+n] >= b[n-1]+1 or r[j+n] = b[n-1] and the addition r[j+n-1]+b[n-1] gives a carry. */ goto subtract; } /* q_star = q*, c1 = (r[j+n]*beta+r[j+n-1]) - q* * b[n-1] (>=0, 0, decrease it by b[n-1]*beta+b[n-2]. Because of b[n-1]*beta+b[n-2] >= beta^2/2 this can happen only twice. */ if (c3 > c2) { q_star = q_star - 1; /* q* := q* - 1 */ if (c3 - c2 > b_msdd) q_star = q_star - 1; /* q* := q* - 1 */ } } if (q_star > 0) subtract: { /* Subtract r := r - b * q* * beta^j. */ mp_limb_t cr; { const mp_limb_t *sourceptr = b_ptr; mp_limb_t *destptr = r_ptr + j; mp_twolimb_t carry = 0; size_t count; for (count = b_len; count > 0; count--) { /* Here 0 <= carry <= q*. */ carry = carry + (mp_twolimb_t) q_star * (mp_twolimb_t) *sourceptr++ + (mp_limb_t) ~(*destptr); /* Here 0 <= carry <= beta*q* + beta-1. */ *destptr++ = ~(mp_limb_t) carry; carry = carry >> GMP_LIMB_BITS; /* <= q* */ } cr = (mp_limb_t) carry; } /* Subtract cr from r_ptr[j + b_len], then forget about r_ptr[j + b_len]. */ if (cr > r_ptr[j + b_len]) { /* Subtraction gave a carry. */ q_star = q_star - 1; /* q* := q* - 1 */ /* Add b back. */ { const mp_limb_t *sourceptr = b_ptr; mp_limb_t *destptr = r_ptr + j; mp_limb_t carry = 0; size_t count; for (count = b_len; count > 0; count--) { mp_limb_t source1 = *sourceptr++; mp_limb_t source2 = *destptr; *destptr++ = source1 + source2 + carry; carry = (carry ? source1 >= (mp_limb_t) ~source2 : source1 > (mp_limb_t) ~source2); } } /* Forget about the carry and about r[j+n]. */ } } /* q* is determined. Store it as q[j]. */ q_ptr[j] = q_star; if (j == 0) break; j--; } } r_len = b_len; /* Normalise q. */ if (q_ptr[q_len - 1] == 0) q_len--; # if 0 /* Not needed here, since we need r only to compare it with b/2, and b is shifted left by s bits. */ /* Shift r right by s bits. */ if (s > 0) { mp_limb_t ptr = r_ptr + r_len; mp_twolimb_t accu = 0; size_t count; for (count = r_len; count > 0; count--) { accu = (mp_twolimb_t) (mp_limb_t) accu << GMP_LIMB_BITS; accu += (mp_twolimb_t) *--ptr << (GMP_LIMB_BITS - s); *ptr = (mp_limb_t) (accu >> GMP_LIMB_BITS); } } # endif /* Normalise r. */ while (r_len > 0 && r_ptr[r_len - 1] == 0) r_len--; } /* Compare r << 1 with b. */ if (r_len > b_len) goto increment_q; { size_t i; for (i = b_len;;) { mp_limb_t r_i = (i <= r_len && i > 0 ? r_ptr[i - 1] >> (GMP_LIMB_BITS - 1) : 0) | (i < r_len ? r_ptr[i] << 1 : 0); mp_limb_t b_i = (i < b_len ? b_ptr[i] : 0); if (r_i > b_i) goto increment_q; if (r_i < b_i) goto keep_q; if (i == 0) break; i--; } } if (q_len > 0 && ((q_ptr[0] & 1) != 0)) /* q is odd. */ increment_q: { size_t i; for (i = 0; i < q_len; i++) if (++(q_ptr[i]) != 0) goto keep_q; q_ptr[q_len++] = 1; } keep_q: if (tmp_roomptr != NULL) free (tmp_roomptr); q->limbs = q_ptr; q->nlimbs = q_len; return roomptr; } /* Convert a bignum a >= 0, multiplied with 10^extra_zeroes, to decimal representation. Destroys the contents of a. Return the allocated memory - containing the decimal digits in low-to-high order, terminated with a NUL character - in case of success, NULL in case of memory allocation failure. */ static char * convert_to_decimal (mpn_t a, size_t extra_zeroes) { mp_limb_t *a_ptr = a.limbs; size_t a_len = a.nlimbs; /* 0.03345 is slightly larger than log(2)/(9*log(10)). */ size_t c_len = 9 * ((size_t)(a_len * (GMP_LIMB_BITS * 0.03345f)) + 1); /* We need extra_zeroes bytes for zeroes, followed by c_len bytes for the digits of a, followed by 1 byte for the terminating NUL. */ char *c_ptr = (char *) malloc (xsum (xsum (extra_zeroes, c_len), 1)); if (c_ptr != NULL) { char *d_ptr = c_ptr; for (; extra_zeroes > 0; extra_zeroes--) *d_ptr++ = '0'; while (a_len > 0) { /* Divide a by 10^9, in-place. */ mp_limb_t remainder = 0; mp_limb_t *ptr = a_ptr + a_len; size_t count; for (count = a_len; count > 0; count--) { mp_twolimb_t num = ((mp_twolimb_t) remainder << GMP_LIMB_BITS) | *--ptr; *ptr = num / 1000000000; remainder = num % 1000000000; } /* Store the remainder as 9 decimal digits. */ for (count = 9; count > 0; count--) { *d_ptr++ = '0' + (remainder % 10); remainder = remainder / 10; } /* Normalize a. */ if (a_ptr[a_len - 1] == 0) a_len--; } /* Remove leading zeroes. */ while (d_ptr > c_ptr && d_ptr[-1] == '0') d_ptr--; /* But keep at least one zero. */ if (d_ptr == c_ptr) *d_ptr++ = '0'; /* Terminate the string. */ *d_ptr = '\0'; } return c_ptr; } # if NEED_PRINTF_LONG_DOUBLE /* Assuming x is finite and >= 0: write x as x = 2^e * m, where m is a bignum. Return the allocated memory in case of success, NULL in case of memory allocation failure. */ static void * decode_long_double (long double x, int *ep, mpn_t *mp) { mpn_t m; int exp; long double y; size_t i; /* Allocate memory for result. */ m.nlimbs = (LDBL_MANT_BIT + GMP_LIMB_BITS - 1) / GMP_LIMB_BITS; m.limbs = (mp_limb_t *) malloc (m.nlimbs * sizeof (mp_limb_t)); if (m.limbs == NULL) return NULL; /* Split into exponential part and mantissa. */ y = frexpl (x, &exp); if (!(y >= 0.0L && y < 1.0L)) abort (); /* x = 2^exp * y = 2^(exp - LDBL_MANT_BIT) * (y * 2^LDBL_MANT_BIT), and the latter is an integer. */ /* Convert the mantissa (y * 2^LDBL_MANT_BIT) to a sequence of limbs. I'm not sure whether it's safe to cast a 'long double' value between 2^31 and 2^32 to 'unsigned int', therefore play safe and cast only 'long double' values between 0 and 2^16 (to 'unsigned int' or 'int', doesn't matter). */ # if (LDBL_MANT_BIT % GMP_LIMB_BITS) != 0 # if (LDBL_MANT_BIT % GMP_LIMB_BITS) > GMP_LIMB_BITS / 2 { mp_limb_t hi, lo; y *= (mp_limb_t) 1 << (LDBL_MANT_BIT % (GMP_LIMB_BITS / 2)); hi = (int) y; y -= hi; if (!(y >= 0.0L && y < 1.0L)) abort (); y *= (mp_limb_t) 1 << (GMP_LIMB_BITS / 2); lo = (int) y; y -= lo; if (!(y >= 0.0L && y < 1.0L)) abort (); m.limbs[LDBL_MANT_BIT / GMP_LIMB_BITS] = (hi << (GMP_LIMB_BITS / 2)) | lo; } # else { mp_limb_t d; y *= (mp_limb_t) 1 << (LDBL_MANT_BIT % GMP_LIMB_BITS); d = (int) y; y -= d; if (!(y >= 0.0L && y < 1.0L)) abort (); m.limbs[LDBL_MANT_BIT / GMP_LIMB_BITS] = d; } # endif # endif for (i = LDBL_MANT_BIT / GMP_LIMB_BITS; i > 0; ) { mp_limb_t hi, lo; y *= (mp_limb_t) 1 << (GMP_LIMB_BITS / 2); hi = (int) y; y -= hi; if (!(y >= 0.0L && y < 1.0L)) abort (); y *= (mp_limb_t) 1 << (GMP_LIMB_BITS / 2); lo = (int) y; y -= lo; if (!(y >= 0.0L && y < 1.0L)) abort (); m.limbs[--i] = (hi << (GMP_LIMB_BITS / 2)) | lo; } # if 0 /* On FreeBSD 6.1/x86, 'long double' numbers sometimes have excess precision. */ if (!(y == 0.0L)) abort (); # endif /* Normalise. */ while (m.nlimbs > 0 && m.limbs[m.nlimbs - 1] == 0) m.nlimbs--; *mp = m; *ep = exp - LDBL_MANT_BIT; return m.limbs; } # endif # if NEED_PRINTF_DOUBLE /* Assuming x is finite and >= 0: write x as x = 2^e * m, where m is a bignum. Return the allocated memory in case of success, NULL in case of memory allocation failure. */ static void * decode_double (double x, int *ep, mpn_t *mp) { mpn_t m; int exp; double y; size_t i; /* Allocate memory for result. */ m.nlimbs = (DBL_MANT_BIT + GMP_LIMB_BITS - 1) / GMP_LIMB_BITS; m.limbs = (mp_limb_t *) malloc (m.nlimbs * sizeof (mp_limb_t)); if (m.limbs == NULL) return NULL; /* Split into exponential part and mantissa. */ y = frexp (x, &exp); if (!(y >= 0.0 && y < 1.0)) abort (); /* x = 2^exp * y = 2^(exp - DBL_MANT_BIT) * (y * 2^DBL_MANT_BIT), and the latter is an integer. */ /* Convert the mantissa (y * 2^DBL_MANT_BIT) to a sequence of limbs. I'm not sure whether it's safe to cast a 'double' value between 2^31 and 2^32 to 'unsigned int', therefore play safe and cast only 'double' values between 0 and 2^16 (to 'unsigned int' or 'int', doesn't matter). */ # if (DBL_MANT_BIT % GMP_LIMB_BITS) != 0 # if (DBL_MANT_BIT % GMP_LIMB_BITS) > GMP_LIMB_BITS / 2 { mp_limb_t hi, lo; y *= (mp_limb_t) 1 << (DBL_MANT_BIT % (GMP_LIMB_BITS / 2)); hi = (int) y; y -= hi; if (!(y >= 0.0 && y < 1.0)) abort (); y *= (mp_limb_t) 1 << (GMP_LIMB_BITS / 2); lo = (int) y; y -= lo; if (!(y >= 0.0 && y < 1.0)) abort (); m.limbs[DBL_MANT_BIT / GMP_LIMB_BITS] = (hi << (GMP_LIMB_BITS / 2)) | lo; } # else { mp_limb_t d; y *= (mp_limb_t) 1 << (DBL_MANT_BIT % GMP_LIMB_BITS); d = (int) y; y -= d; if (!(y >= 0.0 && y < 1.0)) abort (); m.limbs[DBL_MANT_BIT / GMP_LIMB_BITS] = d; } # endif # endif for (i = DBL_MANT_BIT / GMP_LIMB_BITS; i > 0; ) { mp_limb_t hi, lo; y *= (mp_limb_t) 1 << (GMP_LIMB_BITS / 2); hi = (int) y; y -= hi; if (!(y >= 0.0 && y < 1.0)) abort (); y *= (mp_limb_t) 1 << (GMP_LIMB_BITS / 2); lo = (int) y; y -= lo; if (!(y >= 0.0 && y < 1.0)) abort (); m.limbs[--i] = (hi << (GMP_LIMB_BITS / 2)) | lo; } if (!(y == 0.0)) abort (); /* Normalise. */ while (m.nlimbs > 0 && m.limbs[m.nlimbs - 1] == 0) m.nlimbs--; *mp = m; *ep = exp - DBL_MANT_BIT; return m.limbs; } # endif /* Assuming x = 2^e * m is finite and >= 0, and n is an integer: Returns the decimal representation of round (x * 10^n). Return the allocated memory - containing the decimal digits in low-to-high order, terminated with a NUL character - in case of success, NULL in case of memory allocation failure. */ static char * scale10_round_decimal_decoded (int e, mpn_t m, void *memory, int n) { int s; size_t extra_zeroes; unsigned int abs_n; unsigned int abs_s; mp_limb_t *pow5_ptr; size_t pow5_len; unsigned int s_limbs; unsigned int s_bits; mpn_t pow5; mpn_t z; void *z_memory; char *digits; if (memory == NULL) return NULL; /* x = 2^e * m, hence y = round (2^e * 10^n * m) = round (2^(e+n) * 5^n * m) = round (2^s * 5^n * m). */ s = e + n; extra_zeroes = 0; /* Factor out a common power of 10 if possible. */ if (s > 0 && n > 0) { extra_zeroes = (s < n ? s : n); s -= extra_zeroes; n -= extra_zeroes; } /* Here y = round (2^s * 5^n * m) * 10^extra_zeroes. Before converting to decimal, we need to compute z = round (2^s * 5^n * m). */ /* Compute 5^|n|, possibly shifted by |s| bits if n and s have the same sign. 2.322 is slightly larger than log(5)/log(2). */ abs_n = (n >= 0 ? n : -n); abs_s = (s >= 0 ? s : -s); pow5_ptr = (mp_limb_t *) malloc (((int)(abs_n * (2.322f / GMP_LIMB_BITS)) + 1 + abs_s / GMP_LIMB_BITS + 1) * sizeof (mp_limb_t)); if (pow5_ptr == NULL) { free (memory); return NULL; } /* Initialize with 1. */ pow5_ptr[0] = 1; pow5_len = 1; /* Multiply with 5^|n|. */ if (abs_n > 0) { static mp_limb_t const small_pow5[13 + 1] = { 1, 5, 25, 125, 625, 3125, 15625, 78125, 390625, 1953125, 9765625, 48828125, 244140625, 1220703125 }; unsigned int n13; for (n13 = 0; n13 <= abs_n; n13 += 13) { mp_limb_t digit1 = small_pow5[n13 + 13 <= abs_n ? 13 : abs_n - n13]; size_t j; mp_twolimb_t carry = 0; for (j = 0; j < pow5_len; j++) { mp_limb_t digit2 = pow5_ptr[j]; carry += (mp_twolimb_t) digit1 * (mp_twolimb_t) digit2; pow5_ptr[j] = (mp_limb_t) carry; carry = carry >> GMP_LIMB_BITS; } if (carry > 0) pow5_ptr[pow5_len++] = (mp_limb_t) carry; } } s_limbs = abs_s / GMP_LIMB_BITS; s_bits = abs_s % GMP_LIMB_BITS; if (n >= 0 ? s >= 0 : s <= 0) { /* Multiply with 2^|s|. */ if (s_bits > 0) { mp_limb_t *ptr = pow5_ptr; mp_twolimb_t accu = 0; size_t count; for (count = pow5_len; count > 0; count--) { accu += (mp_twolimb_t) *ptr << s_bits; *ptr++ = (mp_limb_t) accu; accu = accu >> GMP_LIMB_BITS; } if (accu > 0) { *ptr = (mp_limb_t) accu; pow5_len++; } } if (s_limbs > 0) { size_t count; for (count = pow5_len; count > 0;) { count--; pow5_ptr[s_limbs + count] = pow5_ptr[count]; } for (count = s_limbs; count > 0;) { count--; pow5_ptr[count] = 0; } pow5_len += s_limbs; } pow5.limbs = pow5_ptr; pow5.nlimbs = pow5_len; if (n >= 0) { /* Multiply m with pow5. No division needed. */ z_memory = multiply (m, pow5, &z); } else { /* Divide m by pow5 and round. */ z_memory = divide (m, pow5, &z); } } else { pow5.limbs = pow5_ptr; pow5.nlimbs = pow5_len; if (n >= 0) { /* n >= 0, s < 0. Multiply m with pow5, then divide by 2^|s|. */ mpn_t numerator; mpn_t denominator; void *tmp_memory; tmp_memory = multiply (m, pow5, &numerator); if (tmp_memory == NULL) { free (pow5_ptr); free (memory); return NULL; } /* Construct 2^|s|. */ { mp_limb_t *ptr = pow5_ptr + pow5_len; size_t i; for (i = 0; i < s_limbs; i++) ptr[i] = 0; ptr[s_limbs] = (mp_limb_t) 1 << s_bits; denominator.limbs = ptr; denominator.nlimbs = s_limbs + 1; } z_memory = divide (numerator, denominator, &z); free (tmp_memory); } else { /* n < 0, s > 0. Multiply m with 2^s, then divide by pow5. */ mpn_t numerator; mp_limb_t *num_ptr; num_ptr = (mp_limb_t *) malloc ((m.nlimbs + s_limbs + 1) * sizeof (mp_limb_t)); if (num_ptr == NULL) { free (pow5_ptr); free (memory); return NULL; } { mp_limb_t *destptr = num_ptr; { size_t i; for (i = 0; i < s_limbs; i++) *destptr++ = 0; } if (s_bits > 0) { const mp_limb_t *sourceptr = m.limbs; mp_twolimb_t accu = 0; size_t count; for (count = m.nlimbs; count > 0; count--) { accu += (mp_twolimb_t) *sourceptr++ << s_bits; *destptr++ = (mp_limb_t) accu; accu = accu >> GMP_LIMB_BITS; } if (accu > 0) *destptr++ = (mp_limb_t) accu; } else { const mp_limb_t *sourceptr = m.limbs; size_t count; for (count = m.nlimbs; count > 0; count--) *destptr++ = *sourceptr++; } numerator.limbs = num_ptr; numerator.nlimbs = destptr - num_ptr; } z_memory = divide (numerator, pow5, &z); free (num_ptr); } } free (pow5_ptr); free (memory); /* Here y = round (x * 10^n) = z * 10^extra_zeroes. */ if (z_memory == NULL) return NULL; digits = convert_to_decimal (z, extra_zeroes); free (z_memory); return digits; } # if NEED_PRINTF_LONG_DOUBLE /* Assuming x is finite and >= 0, and n is an integer: Returns the decimal representation of round (x * 10^n). Return the allocated memory - containing the decimal digits in low-to-high order, terminated with a NUL character - in case of success, NULL in case of memory allocation failure. */ static char * scale10_round_decimal_long_double (long double x, int n) { int e IF_LINT(= 0); mpn_t m; void *memory = decode_long_double (x, &e, &m); return scale10_round_decimal_decoded (e, m, memory, n); } # endif # if NEED_PRINTF_DOUBLE /* Assuming x is finite and >= 0, and n is an integer: Returns the decimal representation of round (x * 10^n). Return the allocated memory - containing the decimal digits in low-to-high order, terminated with a NUL character - in case of success, NULL in case of memory allocation failure. */ static char * scale10_round_decimal_double (double x, int n) { int e IF_LINT(= 0); mpn_t m; void *memory = decode_double (x, &e, &m); return scale10_round_decimal_decoded (e, m, memory, n); } # endif # if NEED_PRINTF_LONG_DOUBLE /* Assuming x is finite and > 0: Return an approximation for n with 10^n <= x < 10^(n+1). The approximation is usually the right n, but may be off by 1 sometimes. */ static int floorlog10l (long double x) { int exp; long double y; double z; double l; /* Split into exponential part and mantissa. */ y = frexpl (x, &exp); if (!(y >= 0.0L && y < 1.0L)) abort (); if (y == 0.0L) return INT_MIN; if (y < 0.5L) { while (y < (1.0L / (1 << (GMP_LIMB_BITS / 2)) / (1 << (GMP_LIMB_BITS / 2)))) { y *= 1.0L * (1 << (GMP_LIMB_BITS / 2)) * (1 << (GMP_LIMB_BITS / 2)); exp -= GMP_LIMB_BITS; } if (y < (1.0L / (1 << 16))) { y *= 1.0L * (1 << 16); exp -= 16; } if (y < (1.0L / (1 << 8))) { y *= 1.0L * (1 << 8); exp -= 8; } if (y < (1.0L / (1 << 4))) { y *= 1.0L * (1 << 4); exp -= 4; } if (y < (1.0L / (1 << 2))) { y *= 1.0L * (1 << 2); exp -= 2; } if (y < (1.0L / (1 << 1))) { y *= 1.0L * (1 << 1); exp -= 1; } } if (!(y >= 0.5L && y < 1.0L)) abort (); /* Compute an approximation for l = log2(x) = exp + log2(y). */ l = exp; z = y; if (z < 0.70710678118654752444) { z *= 1.4142135623730950488; l -= 0.5; } if (z < 0.8408964152537145431) { z *= 1.1892071150027210667; l -= 0.25; } if (z < 0.91700404320467123175) { z *= 1.0905077326652576592; l -= 0.125; } if (z < 0.9576032806985736469) { z *= 1.0442737824274138403; l -= 0.0625; } /* Now 0.95 <= z <= 1.01. */ z = 1 - z; /* log2(1-z) = 1/log(2) * (- z - z^2/2 - z^3/3 - z^4/4 - ...) Four terms are enough to get an approximation with error < 10^-7. */ l -= 1.4426950408889634074 * z * (1.0 + z * (0.5 + z * ((1.0 / 3) + z * 0.25))); /* Finally multiply with log(2)/log(10), yields an approximation for log10(x). */ l *= 0.30102999566398119523; /* Round down to the next integer. */ return (int) l + (l < 0 ? -1 : 0); } # endif # if NEED_PRINTF_DOUBLE /* Assuming x is finite and > 0: Return an approximation for n with 10^n <= x < 10^(n+1). The approximation is usually the right n, but may be off by 1 sometimes. */ static int floorlog10 (double x) { int exp; double y; double z; double l; /* Split into exponential part and mantissa. */ y = frexp (x, &exp); if (!(y >= 0.0 && y < 1.0)) abort (); if (y == 0.0) return INT_MIN; if (y < 0.5) { while (y < (1.0 / (1 << (GMP_LIMB_BITS / 2)) / (1 << (GMP_LIMB_BITS / 2)))) { y *= 1.0 * (1 << (GMP_LIMB_BITS / 2)) * (1 << (GMP_LIMB_BITS / 2)); exp -= GMP_LIMB_BITS; } if (y < (1.0 / (1 << 16))) { y *= 1.0 * (1 << 16); exp -= 16; } if (y < (1.0 / (1 << 8))) { y *= 1.0 * (1 << 8); exp -= 8; } if (y < (1.0 / (1 << 4))) { y *= 1.0 * (1 << 4); exp -= 4; } if (y < (1.0 / (1 << 2))) { y *= 1.0 * (1 << 2); exp -= 2; } if (y < (1.0 / (1 << 1))) { y *= 1.0 * (1 << 1); exp -= 1; } } if (!(y >= 0.5 && y < 1.0)) abort (); /* Compute an approximation for l = log2(x) = exp + log2(y). */ l = exp; z = y; if (z < 0.70710678118654752444) { z *= 1.4142135623730950488; l -= 0.5; } if (z < 0.8408964152537145431) { z *= 1.1892071150027210667; l -= 0.25; } if (z < 0.91700404320467123175) { z *= 1.0905077326652576592; l -= 0.125; } if (z < 0.9576032806985736469) { z *= 1.0442737824274138403; l -= 0.0625; } /* Now 0.95 <= z <= 1.01. */ z = 1 - z; /* log2(1-z) = 1/log(2) * (- z - z^2/2 - z^3/3 - z^4/4 - ...) Four terms are enough to get an approximation with error < 10^-7. */ l -= 1.4426950408889634074 * z * (1.0 + z * (0.5 + z * ((1.0 / 3) + z * 0.25))); /* Finally multiply with log(2)/log(10), yields an approximation for log10(x). */ l *= 0.30102999566398119523; /* Round down to the next integer. */ return (int) l + (l < 0 ? -1 : 0); } # endif /* Tests whether a string of digits consists of exactly PRECISION zeroes and a single '1' digit. */ static int is_borderline (const char *digits, size_t precision) { for (; precision > 0; precision--, digits++) if (*digits != '0') return 0; if (*digits != '1') return 0; digits++; return *digits == '\0'; } #endif #if !USE_SNPRINTF || !HAVE_SNPRINTF_RETVAL_C99 || USE_MSVC__SNPRINTF /* Use a different function name, to make it possible that the 'wchar_t' parametrization and the 'char' parametrization get compiled in the same translation unit. */ # if WIDE_CHAR_VERSION # define MAX_ROOM_NEEDED wmax_room_needed # else # define MAX_ROOM_NEEDED max_room_needed # endif /* Returns the number of TCHAR_T units needed as temporary space for the result of sprintf or SNPRINTF of a single conversion directive. */ static size_t MAX_ROOM_NEEDED (const arguments *ap, size_t arg_index, FCHAR_T conversion, arg_type type, int flags, size_t width, int has_precision, size_t precision, int pad_ourselves) { size_t tmp_length; switch (conversion) { case 'd': case 'i': case 'u': if (type == TYPE_LONGLONGINT || type == TYPE_ULONGLONGINT) tmp_length = (unsigned int) (sizeof (unsigned long long) * CHAR_BIT * 0.30103 /* binary -> decimal */ ) + 1; /* turn floor into ceil */ else if (type == TYPE_LONGINT || type == TYPE_ULONGINT) tmp_length = (unsigned int) (sizeof (unsigned long) * CHAR_BIT * 0.30103 /* binary -> decimal */ ) + 1; /* turn floor into ceil */ else tmp_length = (unsigned int) (sizeof (unsigned int) * CHAR_BIT * 0.30103 /* binary -> decimal */ ) + 1; /* turn floor into ceil */ if (tmp_length < precision) tmp_length = precision; /* Multiply by 2, as an estimate for FLAG_GROUP. */ tmp_length = xsum (tmp_length, tmp_length); /* Add 1, to account for a leading sign. */ tmp_length = xsum (tmp_length, 1); break; case 'o': if (type == TYPE_LONGLONGINT || type == TYPE_ULONGLONGINT) tmp_length = (unsigned int) (sizeof (unsigned long long) * CHAR_BIT * 0.333334 /* binary -> octal */ ) + 1; /* turn floor into ceil */ else if (type == TYPE_LONGINT || type == TYPE_ULONGINT) tmp_length = (unsigned int) (sizeof (unsigned long) * CHAR_BIT * 0.333334 /* binary -> octal */ ) + 1; /* turn floor into ceil */ else tmp_length = (unsigned int) (sizeof (unsigned int) * CHAR_BIT * 0.333334 /* binary -> octal */ ) + 1; /* turn floor into ceil */ if (tmp_length < precision) tmp_length = precision; /* Add 1, to account for a leading sign. */ tmp_length = xsum (tmp_length, 1); break; case 'x': case 'X': if (type == TYPE_LONGLONGINT || type == TYPE_ULONGLONGINT) tmp_length = (unsigned int) (sizeof (unsigned long long) * CHAR_BIT * 0.25 /* binary -> hexadecimal */ ) + 1; /* turn floor into ceil */ else if (type == TYPE_LONGINT || type == TYPE_ULONGINT) tmp_length = (unsigned int) (sizeof (unsigned long) * CHAR_BIT * 0.25 /* binary -> hexadecimal */ ) + 1; /* turn floor into ceil */ else tmp_length = (unsigned int) (sizeof (unsigned int) * CHAR_BIT * 0.25 /* binary -> hexadecimal */ ) + 1; /* turn floor into ceil */ if (tmp_length < precision) tmp_length = precision; /* Add 2, to account for a leading sign or alternate form. */ tmp_length = xsum (tmp_length, 2); break; case 'f': case 'F': if (type == TYPE_LONGDOUBLE) tmp_length = (unsigned int) (LDBL_MAX_EXP * 0.30103 /* binary -> decimal */ * 2 /* estimate for FLAG_GROUP */ ) + 1 /* turn floor into ceil */ + 10; /* sign, decimal point etc. */ else tmp_length = (unsigned int) (DBL_MAX_EXP * 0.30103 /* binary -> decimal */ * 2 /* estimate for FLAG_GROUP */ ) + 1 /* turn floor into ceil */ + 10; /* sign, decimal point etc. */ tmp_length = xsum (tmp_length, precision); break; case 'e': case 'E': case 'g': case 'G': tmp_length = 12; /* sign, decimal point, exponent etc. */ tmp_length = xsum (tmp_length, precision); break; case 'a': case 'A': if (type == TYPE_LONGDOUBLE) tmp_length = (unsigned int) (LDBL_DIG * 0.831 /* decimal -> hexadecimal */ ) + 1; /* turn floor into ceil */ else tmp_length = (unsigned int) (DBL_DIG * 0.831 /* decimal -> hexadecimal */ ) + 1; /* turn floor into ceil */ if (tmp_length < precision) tmp_length = precision; /* Account for sign, decimal point etc. */ tmp_length = xsum (tmp_length, 12); break; case 'c': # if HAVE_WINT_T && !WIDE_CHAR_VERSION if (type == TYPE_WIDE_CHAR) { tmp_length = MB_CUR_MAX; # if ENABLE_WCHAR_FALLBACK if (tmp_length < (sizeof (wchar_t) > 2 ? 10 : 6)) tmp_length = (sizeof (wchar_t) > 2 ? 10 : 6); # endif } else # endif tmp_length = 1; break; case 's': # if HAVE_WCHAR_T if (type == TYPE_WIDE_STRING) { # if WIDE_CHAR_VERSION /* ISO C says about %ls in fwprintf: "If the precision is not specified or is greater than the size of the array, the array shall contain a null wide character." So if there is a precision, we must not use wcslen. */ const wchar_t *arg = ap->arg[arg_index].a.a_wide_string; if (has_precision) tmp_length = local_wcsnlen (arg, precision); else tmp_length = local_wcslen (arg); # else /* ISO C says about %ls in fprintf: "If a precision is specified, no more than that many bytes are written (including shift sequences, if any), and the array shall contain a null wide character if, to equal the multibyte character sequence length given by the precision, the function would need to access a wide character one past the end of the array." So if there is a precision, we must not use wcslen. */ /* This case has already been handled separately in VASNPRINTF. */ abort (); # endif } else # endif { # if WIDE_CHAR_VERSION /* ISO C says about %s in fwprintf: "If the precision is not specified or is greater than the size of the converted array, the converted array shall contain a null wide character." So if there is a precision, we must not use strlen. */ /* This case has already been handled separately in VASNPRINTF. */ abort (); # else /* ISO C says about %s in fprintf: "If the precision is not specified or greater than the size of the array, the array shall contain a null character." So if there is a precision, we must not use strlen. */ const char *arg = ap->arg[arg_index].a.a_string; if (has_precision) tmp_length = local_strnlen (arg, precision); else tmp_length = strlen (arg); # endif } break; case 'p': tmp_length = (unsigned int) (sizeof (void *) * CHAR_BIT * 0.25 /* binary -> hexadecimal */ ) + 1 /* turn floor into ceil */ + 2; /* account for leading 0x */ break; default: abort (); } if (!pad_ourselves) { # if ENABLE_UNISTDIO /* Padding considers the number of characters, therefore the number of elements after padding may be > max (tmp_length, width) but is certainly <= tmp_length + width. */ tmp_length = xsum (tmp_length, width); # else /* Padding considers the number of elements, says POSIX. */ if (tmp_length < width) tmp_length = width; # endif } tmp_length = xsum (tmp_length, 1); /* account for trailing NUL */ return tmp_length; } #endif DCHAR_T * VASNPRINTF (DCHAR_T *resultbuf, size_t *lengthp, const FCHAR_T *format, va_list args) { DIRECTIVES d; arguments a; if (PRINTF_PARSE (format, &d, &a) < 0) /* errno is already set. */ return NULL; #define CLEANUP() \ if (d.dir != d.direct_alloc_dir) \ free (d.dir); \ if (a.arg != a.direct_alloc_arg) \ free (a.arg); if (PRINTF_FETCHARGS (args, &a) < 0) { CLEANUP (); errno = EINVAL; return NULL; } { size_t buf_neededlength; TCHAR_T *buf; TCHAR_T *buf_malloced; const FCHAR_T *cp; size_t i; DIRECTIVE *dp; /* Output string accumulator. */ DCHAR_T *result; size_t allocated; size_t length; /* Allocate a small buffer that will hold a directive passed to sprintf or snprintf. */ buf_neededlength = xsum4 (7, d.max_width_length, d.max_precision_length, 6); #if HAVE_ALLOCA if (buf_neededlength < 4000 / sizeof (TCHAR_T)) { buf = (TCHAR_T *) alloca (buf_neededlength * sizeof (TCHAR_T)); buf_malloced = NULL; } else #endif { size_t buf_memsize = xtimes (buf_neededlength, sizeof (TCHAR_T)); if (size_overflow_p (buf_memsize)) goto out_of_memory_1; buf = (TCHAR_T *) malloc (buf_memsize); if (buf == NULL) goto out_of_memory_1; buf_malloced = buf; } if (resultbuf != NULL) { result = resultbuf; allocated = *lengthp; } else { result = NULL; allocated = 0; } length = 0; /* Invariants: result is either == resultbuf or == NULL or malloc-allocated. If length > 0, then result != NULL. */ /* Ensures that allocated >= needed. Aborts through a jump to out_of_memory if needed is SIZE_MAX or otherwise too big. */ #define ENSURE_ALLOCATION(needed) \ if ((needed) > allocated) \ { \ size_t memory_size; \ DCHAR_T *memory; \ \ allocated = (allocated > 0 ? xtimes (allocated, 2) : 12); \ if ((needed) > allocated) \ allocated = (needed); \ memory_size = xtimes (allocated, sizeof (DCHAR_T)); \ if (size_overflow_p (memory_size)) \ goto out_of_memory; \ if (result == resultbuf || result == NULL) \ memory = (DCHAR_T *) malloc (memory_size); \ else \ memory = (DCHAR_T *) realloc (result, memory_size); \ if (memory == NULL) \ goto out_of_memory; \ if (result == resultbuf && length > 0) \ DCHAR_CPY (memory, result, length); \ result = memory; \ } for (cp = format, i = 0, dp = &d.dir[0]; ; cp = dp->dir_end, i++, dp++) { if (cp != dp->dir_start) { size_t n = dp->dir_start - cp; size_t augmented_length = xsum (length, n); ENSURE_ALLOCATION (augmented_length); /* This copies a piece of FCHAR_T[] into a DCHAR_T[]. Here we need that the format string contains only ASCII characters if FCHAR_T and DCHAR_T are not the same type. */ if (sizeof (FCHAR_T) == sizeof (DCHAR_T)) { DCHAR_CPY (result + length, (const DCHAR_T *) cp, n); length = augmented_length; } else { do result[length++] = *cp++; while (--n > 0); } } if (i == d.count) break; /* Execute a single directive. */ if (dp->conversion == '%') { size_t augmented_length; if (!(dp->arg_index == ARG_NONE)) abort (); augmented_length = xsum (length, 1); ENSURE_ALLOCATION (augmented_length); result[length] = '%'; length = augmented_length; } else { if (!(dp->arg_index != ARG_NONE)) abort (); if (dp->conversion == 'n') { switch (a.arg[dp->arg_index].type) { case TYPE_COUNT_SCHAR_POINTER: *a.arg[dp->arg_index].a.a_count_schar_pointer = length; break; case TYPE_COUNT_SHORT_POINTER: *a.arg[dp->arg_index].a.a_count_short_pointer = length; break; case TYPE_COUNT_INT_POINTER: *a.arg[dp->arg_index].a.a_count_int_pointer = length; break; case TYPE_COUNT_LONGINT_POINTER: *a.arg[dp->arg_index].a.a_count_longint_pointer = length; break; case TYPE_COUNT_LONGLONGINT_POINTER: *a.arg[dp->arg_index].a.a_count_longlongint_pointer = length; break; default: abort (); } } #if ENABLE_UNISTDIO /* The unistdio extensions. */ else if (dp->conversion == 'U') { arg_type type = a.arg[dp->arg_index].type; int flags = dp->flags; int has_width; size_t width; int has_precision; size_t precision; has_width = 0; width = 0; if (dp->width_start != dp->width_end) { if (dp->width_arg_index != ARG_NONE) { int arg; if (!(a.arg[dp->width_arg_index].type == TYPE_INT)) abort (); arg = a.arg[dp->width_arg_index].a.a_int; width = arg; if (arg < 0) { /* "A negative field width is taken as a '-' flag followed by a positive field width." */ flags |= FLAG_LEFT; width = -width; } } else { const FCHAR_T *digitp = dp->width_start; do width = xsum (xtimes (width, 10), *digitp++ - '0'); while (digitp != dp->width_end); } has_width = 1; } has_precision = 0; precision = 0; if (dp->precision_start != dp->precision_end) { if (dp->precision_arg_index != ARG_NONE) { int arg; if (!(a.arg[dp->precision_arg_index].type == TYPE_INT)) abort (); arg = a.arg[dp->precision_arg_index].a.a_int; /* "A negative precision is taken as if the precision were omitted." */ if (arg >= 0) { precision = arg; has_precision = 1; } } else { const FCHAR_T *digitp = dp->precision_start + 1; precision = 0; while (digitp != dp->precision_end) precision = xsum (xtimes (precision, 10), *digitp++ - '0'); has_precision = 1; } } switch (type) { case TYPE_U8_STRING: { const uint8_t *arg = a.arg[dp->arg_index].a.a_u8_string; const uint8_t *arg_end; size_t characters; if (has_precision) { /* Use only PRECISION characters, from the left. */ arg_end = arg; characters = 0; for (; precision > 0; precision--) { int count = u8_strmblen (arg_end); if (count == 0) break; if (count < 0) { if (!(result == resultbuf || result == NULL)) free (result); if (buf_malloced != NULL) free (buf_malloced); CLEANUP (); errno = EILSEQ; return NULL; } arg_end += count; characters++; } } else if (has_width) { /* Use the entire string, and count the number of characters. */ arg_end = arg; characters = 0; for (;;) { int count = u8_strmblen (arg_end); if (count == 0) break; if (count < 0) { if (!(result == resultbuf || result == NULL)) free (result); if (buf_malloced != NULL) free (buf_malloced); CLEANUP (); errno = EILSEQ; return NULL; } arg_end += count; characters++; } } else { /* Use the entire string. */ arg_end = arg + u8_strlen (arg); /* The number of characters doesn't matter. */ characters = 0; } if (characters < width && !(dp->flags & FLAG_LEFT)) { size_t n = width - characters; ENSURE_ALLOCATION (xsum (length, n)); DCHAR_SET (result + length, ' ', n); length += n; } # if DCHAR_IS_UINT8_T { size_t n = arg_end - arg; ENSURE_ALLOCATION (xsum (length, n)); DCHAR_CPY (result + length, arg, n); length += n; } # else { /* Convert. */ DCHAR_T *converted = result + length; size_t converted_len = allocated - length; # if DCHAR_IS_TCHAR /* Convert from UTF-8 to locale encoding. */ converted = u8_conv_to_encoding (locale_charset (), iconveh_question_mark, arg, arg_end - arg, NULL, converted, &converted_len); # else /* Convert from UTF-8 to UTF-16/UTF-32. */ converted = U8_TO_DCHAR (arg, arg_end - arg, converted, &converted_len); # endif if (converted == NULL) { int saved_errno = errno; if (!(result == resultbuf || result == NULL)) free (result); if (buf_malloced != NULL) free (buf_malloced); CLEANUP (); errno = saved_errno; return NULL; } if (converted != result + length) { ENSURE_ALLOCATION (xsum (length, converted_len)); DCHAR_CPY (result + length, converted, converted_len); free (converted); } length += converted_len; } # endif if (characters < width && (dp->flags & FLAG_LEFT)) { size_t n = width - characters; ENSURE_ALLOCATION (xsum (length, n)); DCHAR_SET (result + length, ' ', n); length += n; } } break; case TYPE_U16_STRING: { const uint16_t *arg = a.arg[dp->arg_index].a.a_u16_string; const uint16_t *arg_end; size_t characters; if (has_precision) { /* Use only PRECISION characters, from the left. */ arg_end = arg; characters = 0; for (; precision > 0; precision--) { int count = u16_strmblen (arg_end); if (count == 0) break; if (count < 0) { if (!(result == resultbuf || result == NULL)) free (result); if (buf_malloced != NULL) free (buf_malloced); CLEANUP (); errno = EILSEQ; return NULL; } arg_end += count; characters++; } } else if (has_width) { /* Use the entire string, and count the number of characters. */ arg_end = arg; characters = 0; for (;;) { int count = u16_strmblen (arg_end); if (count == 0) break; if (count < 0) { if (!(result == resultbuf || result == NULL)) free (result); if (buf_malloced != NULL) free (buf_malloced); CLEANUP (); errno = EILSEQ; return NULL; } arg_end += count; characters++; } } else { /* Use the entire string. */ arg_end = arg + u16_strlen (arg); /* The number of characters doesn't matter. */ characters = 0; } if (characters < width && !(dp->flags & FLAG_LEFT)) { size_t n = width - characters; ENSURE_ALLOCATION (xsum (length, n)); DCHAR_SET (result + length, ' ', n); length += n; } # if DCHAR_IS_UINT16_T { size_t n = arg_end - arg; ENSURE_ALLOCATION (xsum (length, n)); DCHAR_CPY (result + length, arg, n); length += n; } # else { /* Convert. */ DCHAR_T *converted = result + length; size_t converted_len = allocated - length; # if DCHAR_IS_TCHAR /* Convert from UTF-16 to locale encoding. */ converted = u16_conv_to_encoding (locale_charset (), iconveh_question_mark, arg, arg_end - arg, NULL, converted, &converted_len); # else /* Convert from UTF-16 to UTF-8/UTF-32. */ converted = U16_TO_DCHAR (arg, arg_end - arg, converted, &converted_len); # endif if (converted == NULL) { int saved_errno = errno; if (!(result == resultbuf || result == NULL)) free (result); if (buf_malloced != NULL) free (buf_malloced); CLEANUP (); errno = saved_errno; return NULL; } if (converted != result + length) { ENSURE_ALLOCATION (xsum (length, converted_len)); DCHAR_CPY (result + length, converted, converted_len); free (converted); } length += converted_len; } # endif if (characters < width && (dp->flags & FLAG_LEFT)) { size_t n = width - characters; ENSURE_ALLOCATION (xsum (length, n)); DCHAR_SET (result + length, ' ', n); length += n; } } break; case TYPE_U32_STRING: { const uint32_t *arg = a.arg[dp->arg_index].a.a_u32_string; const uint32_t *arg_end; size_t characters; if (has_precision) { /* Use only PRECISION characters, from the left. */ arg_end = arg; characters = 0; for (; precision > 0; precision--) { int count = u32_strmblen (arg_end); if (count == 0) break; if (count < 0) { if (!(result == resultbuf || result == NULL)) free (result); if (buf_malloced != NULL) free (buf_malloced); CLEANUP (); errno = EILSEQ; return NULL; } arg_end += count; characters++; } } else if (has_width) { /* Use the entire string, and count the number of characters. */ arg_end = arg; characters = 0; for (;;) { int count = u32_strmblen (arg_end); if (count == 0) break; if (count < 0) { if (!(result == resultbuf || result == NULL)) free (result); if (buf_malloced != NULL) free (buf_malloced); CLEANUP (); errno = EILSEQ; return NULL; } arg_end += count; characters++; } } else { /* Use the entire string. */ arg_end = arg + u32_strlen (arg); /* The number of characters doesn't matter. */ characters = 0; } if (characters < width && !(dp->flags & FLAG_LEFT)) { size_t n = width - characters; ENSURE_ALLOCATION (xsum (length, n)); DCHAR_SET (result + length, ' ', n); length += n; } # if DCHAR_IS_UINT32_T { size_t n = arg_end - arg; ENSURE_ALLOCATION (xsum (length, n)); DCHAR_CPY (result + length, arg, n); length += n; } # else { /* Convert. */ DCHAR_T *converted = result + length; size_t converted_len = allocated - length; # if DCHAR_IS_TCHAR /* Convert from UTF-32 to locale encoding. */ converted = u32_conv_to_encoding (locale_charset (), iconveh_question_mark, arg, arg_end - arg, NULL, converted, &converted_len); # else /* Convert from UTF-32 to UTF-8/UTF-16. */ converted = U32_TO_DCHAR (arg, arg_end - arg, converted, &converted_len); # endif if (converted == NULL) { int saved_errno = errno; if (!(result == resultbuf || result == NULL)) free (result); if (buf_malloced != NULL) free (buf_malloced); CLEANUP (); errno = saved_errno; return NULL; } if (converted != result + length) { ENSURE_ALLOCATION (xsum (length, converted_len)); DCHAR_CPY (result + length, converted, converted_len); free (converted); } length += converted_len; } # endif if (characters < width && (dp->flags & FLAG_LEFT)) { size_t n = width - characters; ENSURE_ALLOCATION (xsum (length, n)); DCHAR_SET (result + length, ' ', n); length += n; } } break; default: abort (); } } #endif #if (!USE_SNPRINTF || !HAVE_SNPRINTF_RETVAL_C99 || USE_MSVC__SNPRINTF || (NEED_PRINTF_DIRECTIVE_LS && !defined IN_LIBINTL) || ENABLE_WCHAR_FALLBACK) && HAVE_WCHAR_T else if (dp->conversion == 's' # if WIDE_CHAR_VERSION && a.arg[dp->arg_index].type != TYPE_WIDE_STRING # else && a.arg[dp->arg_index].type == TYPE_WIDE_STRING # endif ) { /* The normal handling of the 's' directive below requires allocating a temporary buffer. The determination of its length (tmp_length), in the case when a precision is specified, below requires a conversion between a char[] string and a wchar_t[] wide string. It could be done, but we have no guarantee that the implementation of sprintf will use the exactly same algorithm. Without this guarantee, it is possible to have buffer overrun bugs. In order to avoid such bugs, we implement the entire processing of the 's' directive ourselves. */ int flags = dp->flags; int has_width; size_t width; int has_precision; size_t precision; has_width = 0; width = 0; if (dp->width_start != dp->width_end) { if (dp->width_arg_index != ARG_NONE) { int arg; if (!(a.arg[dp->width_arg_index].type == TYPE_INT)) abort (); arg = a.arg[dp->width_arg_index].a.a_int; width = arg; if (arg < 0) { /* "A negative field width is taken as a '-' flag followed by a positive field width." */ flags |= FLAG_LEFT; width = -width; } } else { const FCHAR_T *digitp = dp->width_start; do width = xsum (xtimes (width, 10), *digitp++ - '0'); while (digitp != dp->width_end); } has_width = 1; } has_precision = 0; precision = 6; if (dp->precision_start != dp->precision_end) { if (dp->precision_arg_index != ARG_NONE) { int arg; if (!(a.arg[dp->precision_arg_index].type == TYPE_INT)) abort (); arg = a.arg[dp->precision_arg_index].a.a_int; /* "A negative precision is taken as if the precision were omitted." */ if (arg >= 0) { precision = arg; has_precision = 1; } } else { const FCHAR_T *digitp = dp->precision_start + 1; precision = 0; while (digitp != dp->precision_end) precision = xsum (xtimes (precision, 10), *digitp++ - '0'); has_precision = 1; } } # if WIDE_CHAR_VERSION /* %s in vasnwprintf. See the specification of fwprintf. */ { const char *arg = a.arg[dp->arg_index].a.a_string; const char *arg_end; size_t characters; if (has_precision) { /* Use only as many bytes as needed to produce PRECISION wide characters, from the left. */ # if HAVE_MBRTOWC mbstate_t state; memset (&state, '\0', sizeof (mbstate_t)); # endif arg_end = arg; characters = 0; for (; precision > 0; precision--) { int count; # if HAVE_MBRTOWC count = mbrlen (arg_end, MB_CUR_MAX, &state); # else count = mblen (arg_end, MB_CUR_MAX); # endif if (count == 0) /* Found the terminating NUL. */ break; if (count < 0) { /* Invalid or incomplete multibyte character. */ if (!(result == resultbuf || result == NULL)) free (result); if (buf_malloced != NULL) free (buf_malloced); CLEANUP (); errno = EILSEQ; return NULL; } arg_end += count; characters++; } } else if (has_width) { /* Use the entire string, and count the number of wide characters. */ # if HAVE_MBRTOWC mbstate_t state; memset (&state, '\0', sizeof (mbstate_t)); # endif arg_end = arg; characters = 0; for (;;) { int count; # if HAVE_MBRTOWC count = mbrlen (arg_end, MB_CUR_MAX, &state); # else count = mblen (arg_end, MB_CUR_MAX); # endif if (count == 0) /* Found the terminating NUL. */ break; if (count < 0) { /* Invalid or incomplete multibyte character. */ if (!(result == resultbuf || result == NULL)) free (result); if (buf_malloced != NULL) free (buf_malloced); CLEANUP (); errno = EILSEQ; return NULL; } arg_end += count; characters++; } } else { /* Use the entire string. */ arg_end = arg + strlen (arg); /* The number of characters doesn't matter. */ characters = 0; } if (characters < width && !(dp->flags & FLAG_LEFT)) { size_t n = width - characters; ENSURE_ALLOCATION (xsum (length, n)); DCHAR_SET (result + length, ' ', n); length += n; } if (has_precision || has_width) { /* We know the number of wide characters in advance. */ size_t remaining; # if HAVE_MBRTOWC mbstate_t state; memset (&state, '\0', sizeof (mbstate_t)); # endif ENSURE_ALLOCATION (xsum (length, characters)); for (remaining = characters; remaining > 0; remaining--) { wchar_t wc; int count; # if HAVE_MBRTOWC count = mbrtowc (&wc, arg, arg_end - arg, &state); # else count = mbtowc (&wc, arg, arg_end - arg); # endif if (count <= 0) /* mbrtowc not consistent with mbrlen, or mbtowc not consistent with mblen. */ abort (); result[length++] = wc; arg += count; } if (!(arg == arg_end)) abort (); } else { # if HAVE_MBRTOWC mbstate_t state; memset (&state, '\0', sizeof (mbstate_t)); # endif while (arg < arg_end) { wchar_t wc; int count; # if HAVE_MBRTOWC count = mbrtowc (&wc, arg, arg_end - arg, &state); # else count = mbtowc (&wc, arg, arg_end - arg); # endif if (count <= 0) /* mbrtowc not consistent with mbrlen, or mbtowc not consistent with mblen. */ abort (); ENSURE_ALLOCATION (xsum (length, 1)); result[length++] = wc; arg += count; } } if (characters < width && (dp->flags & FLAG_LEFT)) { size_t n = width - characters; ENSURE_ALLOCATION (xsum (length, n)); DCHAR_SET (result + length, ' ', n); length += n; } } # else /* %ls in vasnprintf. See the specification of fprintf. */ { const wchar_t *arg = a.arg[dp->arg_index].a.a_wide_string; const wchar_t *arg_end; size_t characters; # if !DCHAR_IS_TCHAR /* This code assumes that TCHAR_T is 'char'. */ verify (sizeof (TCHAR_T) == 1); TCHAR_T *tmpsrc; DCHAR_T *tmpdst; size_t tmpdst_len; # endif size_t w; if (has_precision) { /* Use only as many wide characters as needed to produce at most PRECISION bytes, from the left. */ # if HAVE_WCRTOMB && !defined GNULIB_defined_mbstate_t mbstate_t state; memset (&state, '\0', sizeof (mbstate_t)); # endif arg_end = arg; characters = 0; while (precision > 0) { char cbuf[64]; /* Assume MB_CUR_MAX <= 64. */ int count; if (*arg_end == 0) /* Found the terminating null wide character. */ break; count = local_wcrtomb (cbuf, *arg_end, &state); if (count < 0) { /* Cannot convert. */ if (!(result == resultbuf || result == NULL)) free (result); if (buf_malloced != NULL) free (buf_malloced); CLEANUP (); errno = EILSEQ; return NULL; } if (precision < (unsigned int) count) break; arg_end++; characters += count; precision -= count; } } # if DCHAR_IS_TCHAR else if (has_width) # else else # endif { /* Use the entire string, and count the number of bytes. */ # if HAVE_WCRTOMB && !defined GNULIB_defined_mbstate_t mbstate_t state; memset (&state, '\0', sizeof (mbstate_t)); # endif arg_end = arg; characters = 0; for (;;) { char cbuf[64]; /* Assume MB_CUR_MAX <= 64. */ int count; if (*arg_end == 0) /* Found the terminating null wide character. */ break; count = local_wcrtomb (cbuf, *arg_end, &state); if (count < 0) { /* Cannot convert. */ if (!(result == resultbuf || result == NULL)) free (result); if (buf_malloced != NULL) free (buf_malloced); CLEANUP (); errno = EILSEQ; return NULL; } arg_end++; characters += count; } } # if DCHAR_IS_TCHAR else { /* Use the entire string. */ arg_end = arg + local_wcslen (arg); /* The number of bytes doesn't matter. */ characters = 0; } # endif # if !DCHAR_IS_TCHAR /* Convert the string into a piece of temporary memory. */ tmpsrc = (TCHAR_T *) malloc (characters * sizeof (TCHAR_T)); if (tmpsrc == NULL) goto out_of_memory; { TCHAR_T *tmpptr = tmpsrc; size_t remaining; # if HAVE_WCRTOMB && !defined GNULIB_defined_mbstate_t mbstate_t state; memset (&state, '\0', sizeof (mbstate_t)); # endif for (remaining = characters; remaining > 0; ) { char cbuf[64]; /* Assume MB_CUR_MAX <= 64. */ int count; if (*arg == 0) abort (); count = local_wcrtomb (cbuf, *arg, &state); if (count <= 0) /* Inconsistency. */ abort (); memcpy (tmpptr, cbuf, count); tmpptr += count; arg++; remaining -= count; } if (!(arg == arg_end)) abort (); } /* Convert from TCHAR_T[] to DCHAR_T[]. */ tmpdst = DCHAR_CONV_FROM_ENCODING (locale_charset (), iconveh_question_mark, tmpsrc, characters, NULL, NULL, &tmpdst_len); if (tmpdst == NULL) { int saved_errno = errno; free (tmpsrc); if (!(result == resultbuf || result == NULL)) free (result); if (buf_malloced != NULL) free (buf_malloced); CLEANUP (); errno = saved_errno; return NULL; } free (tmpsrc); # endif if (has_width) { # if ENABLE_UNISTDIO /* Outside POSIX, it's preferable to compare the width against the number of _characters_ of the converted value. */ w = DCHAR_MBSNLEN (result + length, characters); # else /* The width is compared against the number of _bytes_ of the converted value, says POSIX. */ w = characters; # endif } else /* w doesn't matter. */ w = 0; if (w < width && !(dp->flags & FLAG_LEFT)) { size_t n = width - w; ENSURE_ALLOCATION (xsum (length, n)); DCHAR_SET (result + length, ' ', n); length += n; } # if DCHAR_IS_TCHAR if (has_precision || has_width) { /* We know the number of bytes in advance. */ size_t remaining; # if HAVE_WCRTOMB && !defined GNULIB_defined_mbstate_t mbstate_t state; memset (&state, '\0', sizeof (mbstate_t)); # endif ENSURE_ALLOCATION (xsum (length, characters)); for (remaining = characters; remaining > 0; ) { char cbuf[64]; /* Assume MB_CUR_MAX <= 64. */ int count; if (*arg == 0) abort (); count = local_wcrtomb (cbuf, *arg, &state); if (count <= 0) /* Inconsistency. */ abort (); memcpy (result + length, cbuf, count); length += count; arg++; remaining -= count; } if (!(arg == arg_end)) abort (); } else { # if HAVE_WCRTOMB && !defined GNULIB_defined_mbstate_t mbstate_t state; memset (&state, '\0', sizeof (mbstate_t)); # endif while (arg < arg_end) { char cbuf[64]; /* Assume MB_CUR_MAX <= 64. */ int count; if (*arg == 0) abort (); count = local_wcrtomb (cbuf, *arg, &state); if (count <= 0) { /* Cannot convert. */ if (!(result == resultbuf || result == NULL)) free (result); if (buf_malloced != NULL) free (buf_malloced); CLEANUP (); errno = EILSEQ; return NULL; } ENSURE_ALLOCATION (xsum (length, count)); memcpy (result + length, cbuf, count); length += count; arg++; } } # else ENSURE_ALLOCATION (xsum (length, tmpdst_len)); DCHAR_CPY (result + length, tmpdst, tmpdst_len); free (tmpdst); length += tmpdst_len; # endif if (w < width && (dp->flags & FLAG_LEFT)) { size_t n = width - w; ENSURE_ALLOCATION (xsum (length, n)); DCHAR_SET (result + length, ' ', n); length += n; } } # endif } #endif #if ENABLE_WCHAR_FALLBACK && HAVE_WINT_T && !WIDE_CHAR_VERSION else if (dp->conversion == 'c' && a.arg[dp->arg_index].type == TYPE_WIDE_CHAR) { /* Implement the 'lc' directive ourselves, in order to provide the fallback that avoids EILSEQ. */ int flags = dp->flags; int has_width; size_t width; has_width = 0; width = 0; if (dp->width_start != dp->width_end) { if (dp->width_arg_index != ARG_NONE) { int arg; if (!(a.arg[dp->width_arg_index].type == TYPE_INT)) abort (); arg = a.arg[dp->width_arg_index].a.a_int; width = arg; if (arg < 0) { /* "A negative field width is taken as a '-' flag followed by a positive field width." */ flags |= FLAG_LEFT; width = -width; } } else { const FCHAR_T *digitp = dp->width_start; do width = xsum (xtimes (width, 10), *digitp++ - '0'); while (digitp != dp->width_end); } has_width = 1; } /* %lc in vasnprintf. See the specification of fprintf. */ { wchar_t arg = (wchar_t) a.arg[dp->arg_index].a.a_wide_char; size_t characters; # if !DCHAR_IS_TCHAR /* This code assumes that TCHAR_T is 'char'. */ verify (sizeof (TCHAR_T) == 1); TCHAR_T tmpsrc[64]; /* Assume MB_CUR_MAX <= 64. */ DCHAR_T *tmpdst; size_t tmpdst_len; # endif size_t w; # if DCHAR_IS_TCHAR if (has_width) # endif { /* Count the number of bytes. */ characters = 0; if (arg != 0) { char cbuf[64]; /* Assume MB_CUR_MAX <= 64. */ int count; # if HAVE_WCRTOMB && !defined GNULIB_defined_mbstate_t mbstate_t state; memset (&state, '\0', sizeof (mbstate_t)); # endif count = local_wcrtomb (cbuf, arg, &state); if (count < 0) /* Inconsistency. */ abort (); characters = count; } } # if DCHAR_IS_TCHAR else { /* The number of bytes doesn't matter. */ characters = 0; } # endif # if !DCHAR_IS_TCHAR /* Convert the string into a piece of temporary memory. */ if (characters > 0) /* implies arg != 0 */ { char cbuf[64]; /* Assume MB_CUR_MAX <= 64. */ int count; # if HAVE_WCRTOMB && !defined GNULIB_defined_mbstate_t mbstate_t state; memset (&state, '\0', sizeof (mbstate_t)); # endif count = local_wcrtomb (cbuf, arg, &state); if (count <= 0) /* Inconsistency. */ abort (); memcpy (tmpsrc, cbuf, count); } /* Convert from TCHAR_T[] to DCHAR_T[]. */ tmpdst = DCHAR_CONV_FROM_ENCODING (locale_charset (), iconveh_question_mark, tmpsrc, characters, NULL, NULL, &tmpdst_len); if (tmpdst == NULL) { int saved_errno = errno; if (!(result == resultbuf || result == NULL)) free (result); if (buf_malloced != NULL) free (buf_malloced); CLEANUP (); errno = saved_errno; return NULL; } # endif if (has_width) { # if ENABLE_UNISTDIO /* Outside POSIX, it's preferable to compare the width against the number of _characters_ of the converted value. */ w = DCHAR_MBSNLEN (result + length, characters); # else /* The width is compared against the number of _bytes_ of the converted value, says POSIX. */ w = characters; # endif } else /* w doesn't matter. */ w = 0; if (w < width && !(dp->flags & FLAG_LEFT)) { size_t n = width - w; ENSURE_ALLOCATION (xsum (length, n)); DCHAR_SET (result + length, ' ', n); length += n; } # if DCHAR_IS_TCHAR if (has_width) { /* We know the number of bytes in advance. */ ENSURE_ALLOCATION (xsum (length, characters)); if (characters > 0) /* implies arg != 0 */ { int count; # if HAVE_WCRTOMB && !defined GNULIB_defined_mbstate_t mbstate_t state; memset (&state, '\0', sizeof (mbstate_t)); # endif count = local_wcrtomb (result + length, arg, &state); if (count <= 0) /* Inconsistency. */ abort (); length += count; } } else { if (arg != 0) { char cbuf[64]; /* Assume MB_CUR_MAX <= 64. */ int count; # if HAVE_WCRTOMB && !defined GNULIB_defined_mbstate_t mbstate_t state; memset (&state, '\0', sizeof (mbstate_t)); # endif count = local_wcrtomb (cbuf, arg, &state); if (count <= 0) /* Inconsistency. */ abort (); ENSURE_ALLOCATION (xsum (length, count)); memcpy (result + length, cbuf, count); length += count; } } # else ENSURE_ALLOCATION (xsum (length, tmpdst_len)); DCHAR_CPY (result + length, tmpdst, tmpdst_len); free (tmpdst); length += tmpdst_len; # endif if (w < width && (dp->flags & FLAG_LEFT)) { size_t n = width - w; ENSURE_ALLOCATION (xsum (length, n)); DCHAR_SET (result + length, ' ', n); length += n; } } } #endif #if (NEED_PRINTF_DIRECTIVE_A || NEED_PRINTF_LONG_DOUBLE || NEED_PRINTF_DOUBLE) && !defined IN_LIBINTL else if ((dp->conversion == 'a' || dp->conversion == 'A') # if !(NEED_PRINTF_DIRECTIVE_A || (NEED_PRINTF_LONG_DOUBLE && NEED_PRINTF_DOUBLE)) && (0 # if NEED_PRINTF_DOUBLE || a.arg[dp->arg_index].type == TYPE_DOUBLE # endif # if NEED_PRINTF_LONG_DOUBLE || a.arg[dp->arg_index].type == TYPE_LONGDOUBLE # endif ) # endif ) { arg_type type = a.arg[dp->arg_index].type; int flags = dp->flags; size_t width; int has_precision; size_t precision; size_t tmp_length; size_t count; DCHAR_T tmpbuf[700]; DCHAR_T *tmp; DCHAR_T *pad_ptr; DCHAR_T *p; width = 0; if (dp->width_start != dp->width_end) { if (dp->width_arg_index != ARG_NONE) { int arg; if (!(a.arg[dp->width_arg_index].type == TYPE_INT)) abort (); arg = a.arg[dp->width_arg_index].a.a_int; width = arg; if (arg < 0) { /* "A negative field width is taken as a '-' flag followed by a positive field width." */ flags |= FLAG_LEFT; width = -width; } } else { const FCHAR_T *digitp = dp->width_start; do width = xsum (xtimes (width, 10), *digitp++ - '0'); while (digitp != dp->width_end); } } has_precision = 0; precision = 0; if (dp->precision_start != dp->precision_end) { if (dp->precision_arg_index != ARG_NONE) { int arg; if (!(a.arg[dp->precision_arg_index].type == TYPE_INT)) abort (); arg = a.arg[dp->precision_arg_index].a.a_int; /* "A negative precision is taken as if the precision were omitted." */ if (arg >= 0) { precision = arg; has_precision = 1; } } else { const FCHAR_T *digitp = dp->precision_start + 1; precision = 0; while (digitp != dp->precision_end) precision = xsum (xtimes (precision, 10), *digitp++ - '0'); has_precision = 1; } } /* Allocate a temporary buffer of sufficient size. */ if (type == TYPE_LONGDOUBLE) tmp_length = (unsigned int) ((LDBL_DIG + 1) * 0.831 /* decimal -> hexadecimal */ ) + 1; /* turn floor into ceil */ else tmp_length = (unsigned int) ((DBL_DIG + 1) * 0.831 /* decimal -> hexadecimal */ ) + 1; /* turn floor into ceil */ if (tmp_length < precision) tmp_length = precision; /* Account for sign, decimal point etc. */ tmp_length = xsum (tmp_length, 12); if (tmp_length < width) tmp_length = width; tmp_length = xsum (tmp_length, 1); /* account for trailing NUL */ if (tmp_length <= sizeof (tmpbuf) / sizeof (DCHAR_T)) tmp = tmpbuf; else { size_t tmp_memsize = xtimes (tmp_length, sizeof (DCHAR_T)); if (size_overflow_p (tmp_memsize)) /* Overflow, would lead to out of memory. */ goto out_of_memory; tmp = (DCHAR_T *) malloc (tmp_memsize); if (tmp == NULL) /* Out of memory. */ goto out_of_memory; } pad_ptr = NULL; p = tmp; if (type == TYPE_LONGDOUBLE) { # if NEED_PRINTF_DIRECTIVE_A || NEED_PRINTF_LONG_DOUBLE long double arg = a.arg[dp->arg_index].a.a_longdouble; if (isnanl (arg)) { if (dp->conversion == 'A') { *p++ = 'N'; *p++ = 'A'; *p++ = 'N'; } else { *p++ = 'n'; *p++ = 'a'; *p++ = 'n'; } } else { int sign = 0; DECL_LONG_DOUBLE_ROUNDING BEGIN_LONG_DOUBLE_ROUNDING (); if (signbit (arg)) /* arg < 0.0L or negative zero */ { sign = -1; arg = -arg; } if (sign < 0) *p++ = '-'; else if (flags & FLAG_SHOWSIGN) *p++ = '+'; else if (flags & FLAG_SPACE) *p++ = ' '; if (arg > 0.0L && arg + arg == arg) { if (dp->conversion == 'A') { *p++ = 'I'; *p++ = 'N'; *p++ = 'F'; } else { *p++ = 'i'; *p++ = 'n'; *p++ = 'f'; } } else { int exponent; long double mantissa; if (arg > 0.0L) mantissa = printf_frexpl (arg, &exponent); else { exponent = 0; mantissa = 0.0L; } if (has_precision && precision < (unsigned int) ((LDBL_DIG + 1) * 0.831) + 1) { /* Round the mantissa. */ long double tail = mantissa; size_t q; for (q = precision; ; q--) { int digit = (int) tail; tail -= digit; if (q == 0) { if (digit & 1 ? tail >= 0.5L : tail > 0.5L) tail = 1 - tail; else tail = - tail; break; } tail *= 16.0L; } if (tail != 0.0L) for (q = precision; q > 0; q--) tail *= 0.0625L; mantissa += tail; } *p++ = '0'; *p++ = dp->conversion - 'A' + 'X'; pad_ptr = p; { int digit; digit = (int) mantissa; mantissa -= digit; *p++ = '0' + digit; if ((flags & FLAG_ALT) || mantissa > 0.0L || precision > 0) { *p++ = decimal_point_char (); /* This loop terminates because we assume that FLT_RADIX is a power of 2. */ while (mantissa > 0.0L) { mantissa *= 16.0L; digit = (int) mantissa; mantissa -= digit; *p++ = digit + (digit < 10 ? '0' : dp->conversion - 10); if (precision > 0) precision--; } while (precision > 0) { *p++ = '0'; precision--; } } } *p++ = dp->conversion - 'A' + 'P'; # if WIDE_CHAR_VERSION { static const wchar_t decimal_format[] = { '%', '+', 'd', '\0' }; SNPRINTF (p, 6 + 1, decimal_format, exponent); } while (*p != '\0') p++; # else if (sizeof (DCHAR_T) == 1) { sprintf ((char *) p, "%+d", exponent); while (*p != '\0') p++; } else { char expbuf[6 + 1]; const char *ep; sprintf (expbuf, "%+d", exponent); for (ep = expbuf; (*p = *ep) != '\0'; ep++) p++; } # endif } END_LONG_DOUBLE_ROUNDING (); } # else abort (); # endif } else { # if NEED_PRINTF_DIRECTIVE_A || NEED_PRINTF_DOUBLE double arg = a.arg[dp->arg_index].a.a_double; if (isnand (arg)) { if (dp->conversion == 'A') { *p++ = 'N'; *p++ = 'A'; *p++ = 'N'; } else { *p++ = 'n'; *p++ = 'a'; *p++ = 'n'; } } else { int sign = 0; if (signbit (arg)) /* arg < 0.0 or negative zero */ { sign = -1; arg = -arg; } if (sign < 0) *p++ = '-'; else if (flags & FLAG_SHOWSIGN) *p++ = '+'; else if (flags & FLAG_SPACE) *p++ = ' '; if (arg > 0.0 && arg + arg == arg) { if (dp->conversion == 'A') { *p++ = 'I'; *p++ = 'N'; *p++ = 'F'; } else { *p++ = 'i'; *p++ = 'n'; *p++ = 'f'; } } else { int exponent; double mantissa; if (arg > 0.0) mantissa = printf_frexp (arg, &exponent); else { exponent = 0; mantissa = 0.0; } if (has_precision && precision < (unsigned int) ((DBL_DIG + 1) * 0.831) + 1) { /* Round the mantissa. */ double tail = mantissa; size_t q; for (q = precision; ; q--) { int digit = (int) tail; tail -= digit; if (q == 0) { if (digit & 1 ? tail >= 0.5 : tail > 0.5) tail = 1 - tail; else tail = - tail; break; } tail *= 16.0; } if (tail != 0.0) for (q = precision; q > 0; q--) tail *= 0.0625; mantissa += tail; } *p++ = '0'; *p++ = dp->conversion - 'A' + 'X'; pad_ptr = p; { int digit; digit = (int) mantissa; mantissa -= digit; *p++ = '0' + digit; if ((flags & FLAG_ALT) || mantissa > 0.0 || precision > 0) { *p++ = decimal_point_char (); /* This loop terminates because we assume that FLT_RADIX is a power of 2. */ while (mantissa > 0.0) { mantissa *= 16.0; digit = (int) mantissa; mantissa -= digit; *p++ = digit + (digit < 10 ? '0' : dp->conversion - 10); if (precision > 0) precision--; } while (precision > 0) { *p++ = '0'; precision--; } } } *p++ = dp->conversion - 'A' + 'P'; # if WIDE_CHAR_VERSION { static const wchar_t decimal_format[] = { '%', '+', 'd', '\0' }; SNPRINTF (p, 6 + 1, decimal_format, exponent); } while (*p != '\0') p++; # else if (sizeof (DCHAR_T) == 1) { sprintf ((char *) p, "%+d", exponent); while (*p != '\0') p++; } else { char expbuf[6 + 1]; const char *ep; sprintf (expbuf, "%+d", exponent); for (ep = expbuf; (*p = *ep) != '\0'; ep++) p++; } # endif } } # else abort (); # endif } /* The generated string now extends from tmp to p, with the zero padding insertion point being at pad_ptr. */ count = p - tmp; if (count < width) { size_t pad = width - count; DCHAR_T *end = p + pad; if (flags & FLAG_LEFT) { /* Pad with spaces on the right. */ for (; pad > 0; pad--) *p++ = ' '; } else if ((flags & FLAG_ZERO) && pad_ptr != NULL) { /* Pad with zeroes. */ DCHAR_T *q = end; while (p > pad_ptr) *--q = *--p; for (; pad > 0; pad--) *p++ = '0'; } else { /* Pad with spaces on the left. */ DCHAR_T *q = end; while (p > tmp) *--q = *--p; for (; pad > 0; pad--) *p++ = ' '; } p = end; } count = p - tmp; if (count >= tmp_length) /* tmp_length was incorrectly calculated - fix the code above! */ abort (); /* Make room for the result. */ if (count >= allocated - length) { size_t n = xsum (length, count); ENSURE_ALLOCATION (n); } /* Append the result. */ memcpy (result + length, tmp, count * sizeof (DCHAR_T)); if (tmp != tmpbuf) free (tmp); length += count; } #endif #if (NEED_PRINTF_INFINITE_DOUBLE || NEED_PRINTF_DOUBLE || NEED_PRINTF_INFINITE_LONG_DOUBLE || NEED_PRINTF_LONG_DOUBLE) && !defined IN_LIBINTL else if ((dp->conversion == 'f' || dp->conversion == 'F' || dp->conversion == 'e' || dp->conversion == 'E' || dp->conversion == 'g' || dp->conversion == 'G' || dp->conversion == 'a' || dp->conversion == 'A') && (0 # if NEED_PRINTF_DOUBLE || a.arg[dp->arg_index].type == TYPE_DOUBLE # elif NEED_PRINTF_INFINITE_DOUBLE || (a.arg[dp->arg_index].type == TYPE_DOUBLE /* The systems (mingw) which produce wrong output for Inf, -Inf, and NaN also do so for -0.0. Therefore we treat this case here as well. */ && is_infinite_or_zero (a.arg[dp->arg_index].a.a_double)) # endif # if NEED_PRINTF_LONG_DOUBLE || a.arg[dp->arg_index].type == TYPE_LONGDOUBLE # elif NEED_PRINTF_INFINITE_LONG_DOUBLE || (a.arg[dp->arg_index].type == TYPE_LONGDOUBLE /* Some systems produce wrong output for Inf, -Inf, and NaN. Some systems in this category (IRIX 5.3) also do so for -0.0. Therefore we treat this case here as well. */ && is_infinite_or_zerol (a.arg[dp->arg_index].a.a_longdouble)) # endif )) { # if (NEED_PRINTF_DOUBLE || NEED_PRINTF_INFINITE_DOUBLE) && (NEED_PRINTF_LONG_DOUBLE || NEED_PRINTF_INFINITE_LONG_DOUBLE) arg_type type = a.arg[dp->arg_index].type; # endif int flags = dp->flags; size_t width; size_t count; int has_precision; size_t precision; size_t tmp_length; DCHAR_T tmpbuf[700]; DCHAR_T *tmp; DCHAR_T *pad_ptr; DCHAR_T *p; width = 0; if (dp->width_start != dp->width_end) { if (dp->width_arg_index != ARG_NONE) { int arg; if (!(a.arg[dp->width_arg_index].type == TYPE_INT)) abort (); arg = a.arg[dp->width_arg_index].a.a_int; width = arg; if (arg < 0) { /* "A negative field width is taken as a '-' flag followed by a positive field width." */ flags |= FLAG_LEFT; width = -width; } } else { const FCHAR_T *digitp = dp->width_start; do width = xsum (xtimes (width, 10), *digitp++ - '0'); while (digitp != dp->width_end); } } has_precision = 0; precision = 0; if (dp->precision_start != dp->precision_end) { if (dp->precision_arg_index != ARG_NONE) { int arg; if (!(a.arg[dp->precision_arg_index].type == TYPE_INT)) abort (); arg = a.arg[dp->precision_arg_index].a.a_int; /* "A negative precision is taken as if the precision were omitted." */ if (arg >= 0) { precision = arg; has_precision = 1; } } else { const FCHAR_T *digitp = dp->precision_start + 1; precision = 0; while (digitp != dp->precision_end) precision = xsum (xtimes (precision, 10), *digitp++ - '0'); has_precision = 1; } } /* POSIX specifies the default precision to be 6 for %f, %F, %e, %E, but not for %g, %G. Implementations appear to use the same default precision also for %g, %G. But for %a, %A, the default precision is 0. */ if (!has_precision) if (!(dp->conversion == 'a' || dp->conversion == 'A')) precision = 6; /* Allocate a temporary buffer of sufficient size. */ # if NEED_PRINTF_DOUBLE && NEED_PRINTF_LONG_DOUBLE tmp_length = (type == TYPE_LONGDOUBLE ? LDBL_DIG + 1 : DBL_DIG + 1); # elif NEED_PRINTF_INFINITE_DOUBLE && NEED_PRINTF_LONG_DOUBLE tmp_length = (type == TYPE_LONGDOUBLE ? LDBL_DIG + 1 : 0); # elif NEED_PRINTF_LONG_DOUBLE tmp_length = LDBL_DIG + 1; # elif NEED_PRINTF_DOUBLE tmp_length = DBL_DIG + 1; # else tmp_length = 0; # endif if (tmp_length < precision) tmp_length = precision; # if NEED_PRINTF_LONG_DOUBLE # if NEED_PRINTF_DOUBLE || NEED_PRINTF_INFINITE_DOUBLE if (type == TYPE_LONGDOUBLE) # endif if (dp->conversion == 'f' || dp->conversion == 'F') { long double arg = a.arg[dp->arg_index].a.a_longdouble; if (!(isnanl (arg) || arg + arg == arg)) { /* arg is finite and nonzero. */ int exponent = floorlog10l (arg < 0 ? -arg : arg); if (exponent >= 0 && tmp_length < exponent + precision) tmp_length = exponent + precision; } } # endif # if NEED_PRINTF_DOUBLE # if NEED_PRINTF_LONG_DOUBLE || NEED_PRINTF_INFINITE_LONG_DOUBLE if (type == TYPE_DOUBLE) # endif if (dp->conversion == 'f' || dp->conversion == 'F') { double arg = a.arg[dp->arg_index].a.a_double; if (!(isnand (arg) || arg + arg == arg)) { /* arg is finite and nonzero. */ int exponent = floorlog10 (arg < 0 ? -arg : arg); if (exponent >= 0 && tmp_length < exponent + precision) tmp_length = exponent + precision; } } # endif /* Account for sign, decimal point etc. */ tmp_length = xsum (tmp_length, 12); if (tmp_length < width) tmp_length = width; tmp_length = xsum (tmp_length, 1); /* account for trailing NUL */ if (tmp_length <= sizeof (tmpbuf) / sizeof (DCHAR_T)) tmp = tmpbuf; else { size_t tmp_memsize = xtimes (tmp_length, sizeof (DCHAR_T)); if (size_overflow_p (tmp_memsize)) /* Overflow, would lead to out of memory. */ goto out_of_memory; tmp = (DCHAR_T *) malloc (tmp_memsize); if (tmp == NULL) /* Out of memory. */ goto out_of_memory; } pad_ptr = NULL; p = tmp; # if NEED_PRINTF_LONG_DOUBLE || NEED_PRINTF_INFINITE_LONG_DOUBLE # if NEED_PRINTF_DOUBLE || NEED_PRINTF_INFINITE_DOUBLE if (type == TYPE_LONGDOUBLE) # endif { long double arg = a.arg[dp->arg_index].a.a_longdouble; if (isnanl (arg)) { if (dp->conversion >= 'A' && dp->conversion <= 'Z') { *p++ = 'N'; *p++ = 'A'; *p++ = 'N'; } else { *p++ = 'n'; *p++ = 'a'; *p++ = 'n'; } } else { int sign = 0; DECL_LONG_DOUBLE_ROUNDING BEGIN_LONG_DOUBLE_ROUNDING (); if (signbit (arg)) /* arg < 0.0L or negative zero */ { sign = -1; arg = -arg; } if (sign < 0) *p++ = '-'; else if (flags & FLAG_SHOWSIGN) *p++ = '+'; else if (flags & FLAG_SPACE) *p++ = ' '; if (arg > 0.0L && arg + arg == arg) { if (dp->conversion >= 'A' && dp->conversion <= 'Z') { *p++ = 'I'; *p++ = 'N'; *p++ = 'F'; } else { *p++ = 'i'; *p++ = 'n'; *p++ = 'f'; } } else { # if NEED_PRINTF_LONG_DOUBLE pad_ptr = p; if (dp->conversion == 'f' || dp->conversion == 'F') { char *digits; size_t ndigits; digits = scale10_round_decimal_long_double (arg, precision); if (digits == NULL) { END_LONG_DOUBLE_ROUNDING (); goto out_of_memory; } ndigits = strlen (digits); if (ndigits > precision) do { --ndigits; *p++ = digits[ndigits]; } while (ndigits > precision); else *p++ = '0'; /* Here ndigits <= precision. */ if ((flags & FLAG_ALT) || precision > 0) { *p++ = decimal_point_char (); for (; precision > ndigits; precision--) *p++ = '0'; while (ndigits > 0) { --ndigits; *p++ = digits[ndigits]; } } free (digits); } else if (dp->conversion == 'e' || dp->conversion == 'E') { int exponent; if (arg == 0.0L) { exponent = 0; *p++ = '0'; if ((flags & FLAG_ALT) || precision > 0) { *p++ = decimal_point_char (); for (; precision > 0; precision--) *p++ = '0'; } } else { /* arg > 0.0L. */ int adjusted; char *digits; size_t ndigits; exponent = floorlog10l (arg); adjusted = 0; for (;;) { digits = scale10_round_decimal_long_double (arg, (int)precision - exponent); if (digits == NULL) { END_LONG_DOUBLE_ROUNDING (); goto out_of_memory; } ndigits = strlen (digits); if (ndigits == precision + 1) break; if (ndigits < precision || ndigits > precision + 2) /* The exponent was not guessed precisely enough. */ abort (); if (adjusted) /* None of two values of exponent is the right one. Prevent an endless loop. */ abort (); free (digits); if (ndigits == precision) exponent -= 1; else exponent += 1; adjusted = 1; } /* Here ndigits = precision+1. */ if (is_borderline (digits, precision)) { /* Maybe the exponent guess was too high and a smaller exponent can be reached by turning a 10...0 into 9...9x. */ char *digits2 = scale10_round_decimal_long_double (arg, (int)precision - exponent + 1); if (digits2 == NULL) { free (digits); END_LONG_DOUBLE_ROUNDING (); goto out_of_memory; } if (strlen (digits2) == precision + 1) { free (digits); digits = digits2; exponent -= 1; } else free (digits2); } /* Here ndigits = precision+1. */ *p++ = digits[--ndigits]; if ((flags & FLAG_ALT) || precision > 0) { *p++ = decimal_point_char (); while (ndigits > 0) { --ndigits; *p++ = digits[ndigits]; } } free (digits); } *p++ = dp->conversion; /* 'e' or 'E' */ # if WIDE_CHAR_VERSION { static const wchar_t decimal_format[] = { '%', '+', '.', '2', 'd', '\0' }; SNPRINTF (p, 6 + 1, decimal_format, exponent); } while (*p != '\0') p++; # else if (sizeof (DCHAR_T) == 1) { sprintf ((char *) p, "%+.2d", exponent); while (*p != '\0') p++; } else { char expbuf[6 + 1]; const char *ep; sprintf (expbuf, "%+.2d", exponent); for (ep = expbuf; (*p = *ep) != '\0'; ep++) p++; } # endif } else if (dp->conversion == 'g' || dp->conversion == 'G') { if (precision == 0) precision = 1; /* precision >= 1. */ if (arg == 0.0L) /* The exponent is 0, >= -4, < precision. Use fixed-point notation. */ { size_t ndigits = precision; /* Number of trailing zeroes that have to be dropped. */ size_t nzeroes = (flags & FLAG_ALT ? 0 : precision - 1); --ndigits; *p++ = '0'; if ((flags & FLAG_ALT) || ndigits > nzeroes) { *p++ = decimal_point_char (); while (ndigits > nzeroes) { --ndigits; *p++ = '0'; } } } else { /* arg > 0.0L. */ int exponent; int adjusted; char *digits; size_t ndigits; size_t nzeroes; exponent = floorlog10l (arg); adjusted = 0; for (;;) { digits = scale10_round_decimal_long_double (arg, (int)(precision - 1) - exponent); if (digits == NULL) { END_LONG_DOUBLE_ROUNDING (); goto out_of_memory; } ndigits = strlen (digits); if (ndigits == precision) break; if (ndigits < precision - 1 || ndigits > precision + 1) /* The exponent was not guessed precisely enough. */ abort (); if (adjusted) /* None of two values of exponent is the right one. Prevent an endless loop. */ abort (); free (digits); if (ndigits < precision) exponent -= 1; else exponent += 1; adjusted = 1; } /* Here ndigits = precision. */ if (is_borderline (digits, precision - 1)) { /* Maybe the exponent guess was too high and a smaller exponent can be reached by turning a 10...0 into 9...9x. */ char *digits2 = scale10_round_decimal_long_double (arg, (int)(precision - 1) - exponent + 1); if (digits2 == NULL) { free (digits); END_LONG_DOUBLE_ROUNDING (); goto out_of_memory; } if (strlen (digits2) == precision) { free (digits); digits = digits2; exponent -= 1; } else free (digits2); } /* Here ndigits = precision. */ /* Determine the number of trailing zeroes that have to be dropped. */ nzeroes = 0; if ((flags & FLAG_ALT) == 0) while (nzeroes < ndigits && digits[nzeroes] == '0') nzeroes++; /* The exponent is now determined. */ if (exponent >= -4 && exponent < (long)precision) { /* Fixed-point notation: max(exponent,0)+1 digits, then the decimal point, then the remaining digits without trailing zeroes. */ if (exponent >= 0) { size_t ecount = exponent + 1; /* Note: count <= precision = ndigits. */ for (; ecount > 0; ecount--) *p++ = digits[--ndigits]; if ((flags & FLAG_ALT) || ndigits > nzeroes) { *p++ = decimal_point_char (); while (ndigits > nzeroes) { --ndigits; *p++ = digits[ndigits]; } } } else { size_t ecount = -exponent - 1; *p++ = '0'; *p++ = decimal_point_char (); for (; ecount > 0; ecount--) *p++ = '0'; while (ndigits > nzeroes) { --ndigits; *p++ = digits[ndigits]; } } } else { /* Exponential notation. */ *p++ = digits[--ndigits]; if ((flags & FLAG_ALT) || ndigits > nzeroes) { *p++ = decimal_point_char (); while (ndigits > nzeroes) { --ndigits; *p++ = digits[ndigits]; } } *p++ = dp->conversion - 'G' + 'E'; /* 'e' or 'E' */ # if WIDE_CHAR_VERSION { static const wchar_t decimal_format[] = { '%', '+', '.', '2', 'd', '\0' }; SNPRINTF (p, 6 + 1, decimal_format, exponent); } while (*p != '\0') p++; # else if (sizeof (DCHAR_T) == 1) { sprintf ((char *) p, "%+.2d", exponent); while (*p != '\0') p++; } else { char expbuf[6 + 1]; const char *ep; sprintf (expbuf, "%+.2d", exponent); for (ep = expbuf; (*p = *ep) != '\0'; ep++) p++; } # endif } free (digits); } } else abort (); # else /* arg is finite. */ if (!(arg == 0.0L)) abort (); pad_ptr = p; if (dp->conversion == 'f' || dp->conversion == 'F') { *p++ = '0'; if ((flags & FLAG_ALT) || precision > 0) { *p++ = decimal_point_char (); for (; precision > 0; precision--) *p++ = '0'; } } else if (dp->conversion == 'e' || dp->conversion == 'E') { *p++ = '0'; if ((flags & FLAG_ALT) || precision > 0) { *p++ = decimal_point_char (); for (; precision > 0; precision--) *p++ = '0'; } *p++ = dp->conversion; /* 'e' or 'E' */ *p++ = '+'; *p++ = '0'; *p++ = '0'; } else if (dp->conversion == 'g' || dp->conversion == 'G') { *p++ = '0'; if (flags & FLAG_ALT) { size_t ndigits = (precision > 0 ? precision - 1 : 0); *p++ = decimal_point_char (); for (; ndigits > 0; --ndigits) *p++ = '0'; } } else if (dp->conversion == 'a' || dp->conversion == 'A') { *p++ = '0'; *p++ = dp->conversion - 'A' + 'X'; pad_ptr = p; *p++ = '0'; if ((flags & FLAG_ALT) || precision > 0) { *p++ = decimal_point_char (); for (; precision > 0; precision--) *p++ = '0'; } *p++ = dp->conversion - 'A' + 'P'; *p++ = '+'; *p++ = '0'; } else abort (); # endif } END_LONG_DOUBLE_ROUNDING (); } } # if NEED_PRINTF_DOUBLE || NEED_PRINTF_INFINITE_DOUBLE else # endif # endif # if NEED_PRINTF_DOUBLE || NEED_PRINTF_INFINITE_DOUBLE { double arg = a.arg[dp->arg_index].a.a_double; if (isnand (arg)) { if (dp->conversion >= 'A' && dp->conversion <= 'Z') { *p++ = 'N'; *p++ = 'A'; *p++ = 'N'; } else { *p++ = 'n'; *p++ = 'a'; *p++ = 'n'; } } else { int sign = 0; if (signbit (arg)) /* arg < 0.0 or negative zero */ { sign = -1; arg = -arg; } if (sign < 0) *p++ = '-'; else if (flags & FLAG_SHOWSIGN) *p++ = '+'; else if (flags & FLAG_SPACE) *p++ = ' '; if (arg > 0.0 && arg + arg == arg) { if (dp->conversion >= 'A' && dp->conversion <= 'Z') { *p++ = 'I'; *p++ = 'N'; *p++ = 'F'; } else { *p++ = 'i'; *p++ = 'n'; *p++ = 'f'; } } else { # if NEED_PRINTF_DOUBLE pad_ptr = p; if (dp->conversion == 'f' || dp->conversion == 'F') { char *digits; size_t ndigits; digits = scale10_round_decimal_double (arg, precision); if (digits == NULL) goto out_of_memory; ndigits = strlen (digits); if (ndigits > precision) do { --ndigits; *p++ = digits[ndigits]; } while (ndigits > precision); else *p++ = '0'; /* Here ndigits <= precision. */ if ((flags & FLAG_ALT) || precision > 0) { *p++ = decimal_point_char (); for (; precision > ndigits; precision--) *p++ = '0'; while (ndigits > 0) { --ndigits; *p++ = digits[ndigits]; } } free (digits); } else if (dp->conversion == 'e' || dp->conversion == 'E') { int exponent; if (arg == 0.0) { exponent = 0; *p++ = '0'; if ((flags & FLAG_ALT) || precision > 0) { *p++ = decimal_point_char (); for (; precision > 0; precision--) *p++ = '0'; } } else { /* arg > 0.0. */ int adjusted; char *digits; size_t ndigits; exponent = floorlog10 (arg); adjusted = 0; for (;;) { digits = scale10_round_decimal_double (arg, (int)precision - exponent); if (digits == NULL) goto out_of_memory; ndigits = strlen (digits); if (ndigits == precision + 1) break; if (ndigits < precision || ndigits > precision + 2) /* The exponent was not guessed precisely enough. */ abort (); if (adjusted) /* None of two values of exponent is the right one. Prevent an endless loop. */ abort (); free (digits); if (ndigits == precision) exponent -= 1; else exponent += 1; adjusted = 1; } /* Here ndigits = precision+1. */ if (is_borderline (digits, precision)) { /* Maybe the exponent guess was too high and a smaller exponent can be reached by turning a 10...0 into 9...9x. */ char *digits2 = scale10_round_decimal_double (arg, (int)precision - exponent + 1); if (digits2 == NULL) { free (digits); goto out_of_memory; } if (strlen (digits2) == precision + 1) { free (digits); digits = digits2; exponent -= 1; } else free (digits2); } /* Here ndigits = precision+1. */ *p++ = digits[--ndigits]; if ((flags & FLAG_ALT) || precision > 0) { *p++ = decimal_point_char (); while (ndigits > 0) { --ndigits; *p++ = digits[ndigits]; } } free (digits); } *p++ = dp->conversion; /* 'e' or 'E' */ # if WIDE_CHAR_VERSION { static const wchar_t decimal_format[] = /* Produce the same number of exponent digits as the native printf implementation. */ # if defined _WIN32 && ! defined __CYGWIN__ { '%', '+', '.', '3', 'd', '\0' }; # else { '%', '+', '.', '2', 'd', '\0' }; # endif SNPRINTF (p, 6 + 1, decimal_format, exponent); } while (*p != '\0') p++; # else { static const char decimal_format[] = /* Produce the same number of exponent digits as the native printf implementation. */ # if defined _WIN32 && ! defined __CYGWIN__ "%+.3d"; # else "%+.2d"; # endif if (sizeof (DCHAR_T) == 1) { sprintf ((char *) p, decimal_format, exponent); while (*p != '\0') p++; } else { char expbuf[6 + 1]; const char *ep; sprintf (expbuf, decimal_format, exponent); for (ep = expbuf; (*p = *ep) != '\0'; ep++) p++; } } # endif } else if (dp->conversion == 'g' || dp->conversion == 'G') { if (precision == 0) precision = 1; /* precision >= 1. */ if (arg == 0.0) /* The exponent is 0, >= -4, < precision. Use fixed-point notation. */ { size_t ndigits = precision; /* Number of trailing zeroes that have to be dropped. */ size_t nzeroes = (flags & FLAG_ALT ? 0 : precision - 1); --ndigits; *p++ = '0'; if ((flags & FLAG_ALT) || ndigits > nzeroes) { *p++ = decimal_point_char (); while (ndigits > nzeroes) { --ndigits; *p++ = '0'; } } } else { /* arg > 0.0. */ int exponent; int adjusted; char *digits; size_t ndigits; size_t nzeroes; exponent = floorlog10 (arg); adjusted = 0; for (;;) { digits = scale10_round_decimal_double (arg, (int)(precision - 1) - exponent); if (digits == NULL) goto out_of_memory; ndigits = strlen (digits); if (ndigits == precision) break; if (ndigits < precision - 1 || ndigits > precision + 1) /* The exponent was not guessed precisely enough. */ abort (); if (adjusted) /* None of two values of exponent is the right one. Prevent an endless loop. */ abort (); free (digits); if (ndigits < precision) exponent -= 1; else exponent += 1; adjusted = 1; } /* Here ndigits = precision. */ if (is_borderline (digits, precision - 1)) { /* Maybe the exponent guess was too high and a smaller exponent can be reached by turning a 10...0 into 9...9x. */ char *digits2 = scale10_round_decimal_double (arg, (int)(precision - 1) - exponent + 1); if (digits2 == NULL) { free (digits); goto out_of_memory; } if (strlen (digits2) == precision) { free (digits); digits = digits2; exponent -= 1; } else free (digits2); } /* Here ndigits = precision. */ /* Determine the number of trailing zeroes that have to be dropped. */ nzeroes = 0; if ((flags & FLAG_ALT) == 0) while (nzeroes < ndigits && digits[nzeroes] == '0') nzeroes++; /* The exponent is now determined. */ if (exponent >= -4 && exponent < (long)precision) { /* Fixed-point notation: max(exponent,0)+1 digits, then the decimal point, then the remaining digits without trailing zeroes. */ if (exponent >= 0) { size_t ecount = exponent + 1; /* Note: ecount <= precision = ndigits. */ for (; ecount > 0; ecount--) *p++ = digits[--ndigits]; if ((flags & FLAG_ALT) || ndigits > nzeroes) { *p++ = decimal_point_char (); while (ndigits > nzeroes) { --ndigits; *p++ = digits[ndigits]; } } } else { size_t ecount = -exponent - 1; *p++ = '0'; *p++ = decimal_point_char (); for (; ecount > 0; ecount--) *p++ = '0'; while (ndigits > nzeroes) { --ndigits; *p++ = digits[ndigits]; } } } else { /* Exponential notation. */ *p++ = digits[--ndigits]; if ((flags & FLAG_ALT) || ndigits > nzeroes) { *p++ = decimal_point_char (); while (ndigits > nzeroes) { --ndigits; *p++ = digits[ndigits]; } } *p++ = dp->conversion - 'G' + 'E'; /* 'e' or 'E' */ # if WIDE_CHAR_VERSION { static const wchar_t decimal_format[] = /* Produce the same number of exponent digits as the native printf implementation. */ # if defined _WIN32 && ! defined __CYGWIN__ { '%', '+', '.', '3', 'd', '\0' }; # else { '%', '+', '.', '2', 'd', '\0' }; # endif SNPRINTF (p, 6 + 1, decimal_format, exponent); } while (*p != '\0') p++; # else { static const char decimal_format[] = /* Produce the same number of exponent digits as the native printf implementation. */ # if defined _WIN32 && ! defined __CYGWIN__ "%+.3d"; # else "%+.2d"; # endif if (sizeof (DCHAR_T) == 1) { sprintf ((char *) p, decimal_format, exponent); while (*p != '\0') p++; } else { char expbuf[6 + 1]; const char *ep; sprintf (expbuf, decimal_format, exponent); for (ep = expbuf; (*p = *ep) != '\0'; ep++) p++; } } # endif } free (digits); } } else abort (); # else /* arg is finite. */ if (!(arg == 0.0)) abort (); pad_ptr = p; if (dp->conversion == 'f' || dp->conversion == 'F') { *p++ = '0'; if ((flags & FLAG_ALT) || precision > 0) { *p++ = decimal_point_char (); for (; precision > 0; precision--) *p++ = '0'; } } else if (dp->conversion == 'e' || dp->conversion == 'E') { *p++ = '0'; if ((flags & FLAG_ALT) || precision > 0) { *p++ = decimal_point_char (); for (; precision > 0; precision--) *p++ = '0'; } *p++ = dp->conversion; /* 'e' or 'E' */ *p++ = '+'; /* Produce the same number of exponent digits as the native printf implementation. */ # if defined _WIN32 && ! defined __CYGWIN__ *p++ = '0'; # endif *p++ = '0'; *p++ = '0'; } else if (dp->conversion == 'g' || dp->conversion == 'G') { *p++ = '0'; if (flags & FLAG_ALT) { size_t ndigits = (precision > 0 ? precision - 1 : 0); *p++ = decimal_point_char (); for (; ndigits > 0; --ndigits) *p++ = '0'; } } else abort (); # endif } } } # endif /* The generated string now extends from tmp to p, with the zero padding insertion point being at pad_ptr. */ count = p - tmp; if (count < width) { size_t pad = width - count; DCHAR_T *end = p + pad; if (flags & FLAG_LEFT) { /* Pad with spaces on the right. */ for (; pad > 0; pad--) *p++ = ' '; } else if ((flags & FLAG_ZERO) && pad_ptr != NULL) { /* Pad with zeroes. */ DCHAR_T *q = end; while (p > pad_ptr) *--q = *--p; for (; pad > 0; pad--) *p++ = '0'; } else { /* Pad with spaces on the left. */ DCHAR_T *q = end; while (p > tmp) *--q = *--p; for (; pad > 0; pad--) *p++ = ' '; } p = end; } count = p - tmp; if (count >= tmp_length) /* tmp_length was incorrectly calculated - fix the code above! */ abort (); /* Make room for the result. */ if (count >= allocated - length) { size_t n = xsum (length, count); ENSURE_ALLOCATION (n); } /* Append the result. */ memcpy (result + length, tmp, count * sizeof (DCHAR_T)); if (tmp != tmpbuf) free (tmp); length += count; } #endif else { arg_type type = a.arg[dp->arg_index].type; int flags = dp->flags; #if !DCHAR_IS_TCHAR || ENABLE_UNISTDIO || NEED_PRINTF_FLAG_LEFTADJUST || NEED_PRINTF_FLAG_ZERO || NEED_PRINTF_UNBOUNDED_PRECISION int has_width; #endif #if !USE_SNPRINTF || !HAVE_SNPRINTF_RETVAL_C99 || USE_MSVC__SNPRINTF || !DCHAR_IS_TCHAR || ENABLE_UNISTDIO || NEED_PRINTF_FLAG_LEFTADJUST || NEED_PRINTF_FLAG_ZERO || NEED_PRINTF_UNBOUNDED_PRECISION size_t width; #endif #if !USE_SNPRINTF || !HAVE_SNPRINTF_RETVAL_C99 || USE_MSVC__SNPRINTF || NEED_PRINTF_UNBOUNDED_PRECISION int has_precision; size_t precision; #endif #if NEED_PRINTF_UNBOUNDED_PRECISION int prec_ourselves; #else # define prec_ourselves 0 #endif #if NEED_PRINTF_FLAG_LEFTADJUST # define pad_ourselves 1 #elif !DCHAR_IS_TCHAR || ENABLE_UNISTDIO || NEED_PRINTF_FLAG_ZERO || NEED_PRINTF_UNBOUNDED_PRECISION int pad_ourselves; #else # define pad_ourselves 0 #endif TCHAR_T *fbp; unsigned int prefix_count; int prefixes[2] IF_LINT (= { 0 }); int orig_errno; #if !USE_SNPRINTF size_t tmp_length; TCHAR_T tmpbuf[700]; TCHAR_T *tmp; #endif #if !DCHAR_IS_TCHAR || ENABLE_UNISTDIO || NEED_PRINTF_FLAG_LEFTADJUST || NEED_PRINTF_FLAG_ZERO || NEED_PRINTF_UNBOUNDED_PRECISION has_width = 0; #endif #if !USE_SNPRINTF || !HAVE_SNPRINTF_RETVAL_C99 || USE_MSVC__SNPRINTF || !DCHAR_IS_TCHAR || ENABLE_UNISTDIO || NEED_PRINTF_FLAG_LEFTADJUST || NEED_PRINTF_FLAG_ZERO || NEED_PRINTF_UNBOUNDED_PRECISION width = 0; if (dp->width_start != dp->width_end) { if (dp->width_arg_index != ARG_NONE) { int arg; if (!(a.arg[dp->width_arg_index].type == TYPE_INT)) abort (); arg = a.arg[dp->width_arg_index].a.a_int; width = arg; if (arg < 0) { /* "A negative field width is taken as a '-' flag followed by a positive field width." */ flags |= FLAG_LEFT; width = -width; } } else { const FCHAR_T *digitp = dp->width_start; do width = xsum (xtimes (width, 10), *digitp++ - '0'); while (digitp != dp->width_end); } #if !DCHAR_IS_TCHAR || ENABLE_UNISTDIO || NEED_PRINTF_FLAG_LEFTADJUST || NEED_PRINTF_FLAG_ZERO || NEED_PRINTF_UNBOUNDED_PRECISION has_width = 1; #endif } #endif #if !USE_SNPRINTF || !HAVE_SNPRINTF_RETVAL_C99 || USE_MSVC__SNPRINTF || NEED_PRINTF_UNBOUNDED_PRECISION has_precision = 0; precision = 6; if (dp->precision_start != dp->precision_end) { if (dp->precision_arg_index != ARG_NONE) { int arg; if (!(a.arg[dp->precision_arg_index].type == TYPE_INT)) abort (); arg = a.arg[dp->precision_arg_index].a.a_int; /* "A negative precision is taken as if the precision were omitted." */ if (arg >= 0) { precision = arg; has_precision = 1; } } else { const FCHAR_T *digitp = dp->precision_start + 1; precision = 0; while (digitp != dp->precision_end) precision = xsum (xtimes (precision, 10), *digitp++ - '0'); has_precision = 1; } } #endif /* Decide whether to handle the precision ourselves. */ #if NEED_PRINTF_UNBOUNDED_PRECISION switch (dp->conversion) { case 'd': case 'i': case 'u': case 'o': case 'x': case 'X': case 'p': prec_ourselves = has_precision && (precision > 0); break; default: prec_ourselves = 0; break; } #endif /* Decide whether to perform the padding ourselves. */ #if !NEED_PRINTF_FLAG_LEFTADJUST && (!DCHAR_IS_TCHAR || ENABLE_UNISTDIO || NEED_PRINTF_FLAG_ZERO || NEED_PRINTF_UNBOUNDED_PRECISION) switch (dp->conversion) { # if !DCHAR_IS_TCHAR || ENABLE_UNISTDIO /* If we need conversion from TCHAR_T[] to DCHAR_T[], we need to perform the padding after this conversion. Functions with unistdio extensions perform the padding based on character count rather than element count. */ case 'c': case 's': # endif # if NEED_PRINTF_FLAG_ZERO case 'f': case 'F': case 'e': case 'E': case 'g': case 'G': case 'a': case 'A': # endif pad_ourselves = 1; break; default: pad_ourselves = prec_ourselves; break; } #endif #if !USE_SNPRINTF /* Allocate a temporary buffer of sufficient size for calling sprintf. */ tmp_length = MAX_ROOM_NEEDED (&a, dp->arg_index, dp->conversion, type, flags, width, has_precision, precision, pad_ourselves); if (tmp_length <= sizeof (tmpbuf) / sizeof (TCHAR_T)) tmp = tmpbuf; else { size_t tmp_memsize = xtimes (tmp_length, sizeof (TCHAR_T)); if (size_overflow_p (tmp_memsize)) /* Overflow, would lead to out of memory. */ goto out_of_memory; tmp = (TCHAR_T *) malloc (tmp_memsize); if (tmp == NULL) /* Out of memory. */ goto out_of_memory; } #endif /* Construct the format string for calling snprintf or sprintf. */ fbp = buf; *fbp++ = '%'; #if NEED_PRINTF_FLAG_GROUPING /* The underlying implementation doesn't support the ' flag. Produce no grouping characters in this case; this is acceptable because the grouping is locale dependent. */ #else if (flags & FLAG_GROUP) *fbp++ = '\''; #endif if (flags & FLAG_LEFT) *fbp++ = '-'; if (flags & FLAG_SHOWSIGN) *fbp++ = '+'; if (flags & FLAG_SPACE) *fbp++ = ' '; if (flags & FLAG_ALT) *fbp++ = '#'; #if __GLIBC__ >= 2 && !defined __UCLIBC__ if (flags & FLAG_LOCALIZED) *fbp++ = 'I'; #endif if (!pad_ourselves) { if (flags & FLAG_ZERO) *fbp++ = '0'; if (dp->width_start != dp->width_end) { size_t n = dp->width_end - dp->width_start; /* The width specification is known to consist only of standard ASCII characters. */ if (sizeof (FCHAR_T) == sizeof (TCHAR_T)) { memcpy (fbp, dp->width_start, n * sizeof (TCHAR_T)); fbp += n; } else { const FCHAR_T *mp = dp->width_start; do *fbp++ = *mp++; while (--n > 0); } } } if (!prec_ourselves) { if (dp->precision_start != dp->precision_end) { size_t n = dp->precision_end - dp->precision_start; /* The precision specification is known to consist only of standard ASCII characters. */ if (sizeof (FCHAR_T) == sizeof (TCHAR_T)) { memcpy (fbp, dp->precision_start, n * sizeof (TCHAR_T)); fbp += n; } else { const FCHAR_T *mp = dp->precision_start; do *fbp++ = *mp++; while (--n > 0); } } } switch (type) { case TYPE_LONGLONGINT: case TYPE_ULONGLONGINT: #if defined _WIN32 && ! defined __CYGWIN__ *fbp++ = 'I'; *fbp++ = '6'; *fbp++ = '4'; break; #else *fbp++ = 'l'; #endif FALLTHROUGH; case TYPE_LONGINT: case TYPE_ULONGINT: #if HAVE_WINT_T case TYPE_WIDE_CHAR: #endif #if HAVE_WCHAR_T case TYPE_WIDE_STRING: #endif *fbp++ = 'l'; break; case TYPE_LONGDOUBLE: *fbp++ = 'L'; break; default: break; } #if NEED_PRINTF_DIRECTIVE_F if (dp->conversion == 'F') *fbp = 'f'; else #endif *fbp = dp->conversion; #if USE_SNPRINTF # if ! (((__GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 3)) \ && !defined __UCLIBC__) \ || (defined __APPLE__ && defined __MACH__) \ || defined __ANDROID__ \ || (defined _WIN32 && ! defined __CYGWIN__)) fbp[1] = '%'; fbp[2] = 'n'; fbp[3] = '\0'; # else /* On glibc2 systems from glibc >= 2.3 - probably also older ones - we know that snprintf's return value conforms to ISO C 99: the tests gl_SNPRINTF_RETVAL_C99 and gl_SNPRINTF_TRUNCATION_C99 pass. Therefore we can avoid using %n in this situation. On glibc2 systems from 2004-10-18 or newer, the use of %n in format strings in writable memory may crash the program (if compiled with _FORTIFY_SOURCE=2), so we should avoid it in this situation. */ /* On Mac OS X 10.3 or newer, we know that snprintf's return value conforms to ISO C 99: the tests gl_SNPRINTF_RETVAL_C99 and gl_SNPRINTF_TRUNCATION_C99 pass. Therefore we can avoid using %n in this situation. On Mac OS X 10.13 or newer, the use of %n in format strings in writable memory by default crashes the program, so we should avoid it in this situation. */ /* On Android, we know that snprintf's return value conforms to ISO C 99: the tests gl_SNPRINTF_RETVAL_C99 and gl_SNPRINTF_TRUNCATION_C99 pass. Therefore we can avoid using %n in this situation. Starting on 2018-03-07, the use of %n in format strings produces a fatal error (see ), so we should avoid it. */ /* On native Windows systems (such as mingw), we can avoid using %n because: - Although the gl_SNPRINTF_TRUNCATION_C99 test fails, snprintf does not write more than the specified number of bytes. (snprintf (buf, 3, "%d %d", 4567, 89) writes '4', '5', '6' into buf, not '4', '5', '\0'.) - Although the gl_SNPRINTF_RETVAL_C99 test fails, snprintf allows us to recognize the case of an insufficient buffer size: it returns -1 in this case. On native Windows systems (such as mingw) where the OS is Windows Vista, the use of %n in format strings by default crashes the program. See and So we should avoid %n in this situation. */ fbp[1] = '\0'; # endif #else fbp[1] = '\0'; #endif /* Construct the arguments for calling snprintf or sprintf. */ prefix_count = 0; if (!pad_ourselves && dp->width_arg_index != ARG_NONE) { if (!(a.arg[dp->width_arg_index].type == TYPE_INT)) abort (); prefixes[prefix_count++] = a.arg[dp->width_arg_index].a.a_int; } if (!prec_ourselves && dp->precision_arg_index != ARG_NONE) { if (!(a.arg[dp->precision_arg_index].type == TYPE_INT)) abort (); prefixes[prefix_count++] = a.arg[dp->precision_arg_index].a.a_int; } #if USE_SNPRINTF /* The SNPRINTF result is appended after result[0..length]. The latter is an array of DCHAR_T; SNPRINTF appends an array of TCHAR_T to it. This is possible because sizeof (TCHAR_T) divides sizeof (DCHAR_T) and alignof (TCHAR_T) <= alignof (DCHAR_T). */ # define TCHARS_PER_DCHAR (sizeof (DCHAR_T) / sizeof (TCHAR_T)) /* Ensure that maxlen below will be >= 2. Needed on BeOS, where an snprintf() with maxlen==1 acts like sprintf(). */ ENSURE_ALLOCATION (xsum (length, (2 + TCHARS_PER_DCHAR - 1) / TCHARS_PER_DCHAR)); /* Prepare checking whether snprintf returns the count via %n. */ *(TCHAR_T *) (result + length) = '\0'; #endif orig_errno = errno; for (;;) { int count = -1; #if USE_SNPRINTF int retcount = 0; size_t maxlen = allocated - length; /* SNPRINTF can fail if its second argument is > INT_MAX. */ if (maxlen > INT_MAX / TCHARS_PER_DCHAR) maxlen = INT_MAX / TCHARS_PER_DCHAR; maxlen = maxlen * TCHARS_PER_DCHAR; # define SNPRINTF_BUF(arg) \ switch (prefix_count) \ { \ case 0: \ retcount = SNPRINTF ((TCHAR_T *) (result + length), \ maxlen, buf, \ arg, &count); \ break; \ case 1: \ retcount = SNPRINTF ((TCHAR_T *) (result + length), \ maxlen, buf, \ prefixes[0], arg, &count); \ break; \ case 2: \ retcount = SNPRINTF ((TCHAR_T *) (result + length), \ maxlen, buf, \ prefixes[0], prefixes[1], arg, \ &count); \ break; \ default: \ abort (); \ } #else # define SNPRINTF_BUF(arg) \ switch (prefix_count) \ { \ case 0: \ count = sprintf (tmp, buf, arg); \ break; \ case 1: \ count = sprintf (tmp, buf, prefixes[0], arg); \ break; \ case 2: \ count = sprintf (tmp, buf, prefixes[0], prefixes[1],\ arg); \ break; \ default: \ abort (); \ } #endif errno = 0; switch (type) { case TYPE_SCHAR: { int arg = a.arg[dp->arg_index].a.a_schar; SNPRINTF_BUF (arg); } break; case TYPE_UCHAR: { unsigned int arg = a.arg[dp->arg_index].a.a_uchar; SNPRINTF_BUF (arg); } break; case TYPE_SHORT: { int arg = a.arg[dp->arg_index].a.a_short; SNPRINTF_BUF (arg); } break; case TYPE_USHORT: { unsigned int arg = a.arg[dp->arg_index].a.a_ushort; SNPRINTF_BUF (arg); } break; case TYPE_INT: { int arg = a.arg[dp->arg_index].a.a_int; SNPRINTF_BUF (arg); } break; case TYPE_UINT: { unsigned int arg = a.arg[dp->arg_index].a.a_uint; SNPRINTF_BUF (arg); } break; case TYPE_LONGINT: { long int arg = a.arg[dp->arg_index].a.a_longint; SNPRINTF_BUF (arg); } break; case TYPE_ULONGINT: { unsigned long int arg = a.arg[dp->arg_index].a.a_ulongint; SNPRINTF_BUF (arg); } break; case TYPE_LONGLONGINT: { long long int arg = a.arg[dp->arg_index].a.a_longlongint; SNPRINTF_BUF (arg); } break; case TYPE_ULONGLONGINT: { unsigned long long int arg = a.arg[dp->arg_index].a.a_ulonglongint; SNPRINTF_BUF (arg); } break; case TYPE_DOUBLE: { double arg = a.arg[dp->arg_index].a.a_double; SNPRINTF_BUF (arg); } break; case TYPE_LONGDOUBLE: { long double arg = a.arg[dp->arg_index].a.a_longdouble; SNPRINTF_BUF (arg); } break; case TYPE_CHAR: { int arg = a.arg[dp->arg_index].a.a_char; SNPRINTF_BUF (arg); } break; #if HAVE_WINT_T case TYPE_WIDE_CHAR: { wint_t arg = a.arg[dp->arg_index].a.a_wide_char; SNPRINTF_BUF (arg); } break; #endif case TYPE_STRING: { const char *arg = a.arg[dp->arg_index].a.a_string; SNPRINTF_BUF (arg); } break; #if HAVE_WCHAR_T case TYPE_WIDE_STRING: { const wchar_t *arg = a.arg[dp->arg_index].a.a_wide_string; SNPRINTF_BUF (arg); } break; #endif case TYPE_POINTER: { void *arg = a.arg[dp->arg_index].a.a_pointer; SNPRINTF_BUF (arg); } break; default: abort (); } #if USE_SNPRINTF /* Portability: Not all implementations of snprintf() are ISO C 99 compliant. Determine the number of bytes that snprintf() has produced or would have produced. */ if (count >= 0) { /* Verify that snprintf() has NUL-terminated its result. */ if ((unsigned int) count < maxlen && ((TCHAR_T *) (result + length)) [count] != '\0') abort (); /* Portability hack. */ if (retcount > count) count = retcount; } else { /* snprintf() doesn't understand the '%n' directive. */ if (fbp[1] != '\0') { /* Don't use the '%n' directive; instead, look at the snprintf() return value. */ fbp[1] = '\0'; continue; } else { /* Look at the snprintf() return value. */ if (retcount < 0) { # if !HAVE_SNPRINTF_RETVAL_C99 || USE_MSVC__SNPRINTF /* HP-UX 10.20 snprintf() is doubly deficient: It doesn't understand the '%n' directive, *and* it returns -1 (rather than the length that would have been required) when the buffer is too small. But a failure at this point can also come from other reasons than a too small buffer, such as an invalid wide string argument to the %ls directive, or possibly an invalid floating-point argument. */ size_t tmp_length = MAX_ROOM_NEEDED (&a, dp->arg_index, dp->conversion, type, flags, width, has_precision, precision, pad_ourselves); if (maxlen < tmp_length) { /* Make more room. But try to do through this reallocation only once. */ size_t bigger_need = xsum (length, xsum (tmp_length, TCHARS_PER_DCHAR - 1) / TCHARS_PER_DCHAR); /* And always grow proportionally. (There may be several arguments, each needing a little more room than the previous one.) */ size_t bigger_need2 = xsum (xtimes (allocated, 2), 12); if (bigger_need < bigger_need2) bigger_need = bigger_need2; ENSURE_ALLOCATION (bigger_need); continue; } # endif } else count = retcount; } } #endif /* Attempt to handle failure. */ if (count < 0) { /* SNPRINTF or sprintf failed. Save and use the errno that it has set, if any. */ int saved_errno = errno; if (saved_errno == 0) { if (dp->conversion == 'c' || dp->conversion == 's') saved_errno = EILSEQ; else saved_errno = EINVAL; } if (!(result == resultbuf || result == NULL)) free (result); if (buf_malloced != NULL) free (buf_malloced); CLEANUP (); errno = saved_errno; return NULL; } #if USE_SNPRINTF /* Handle overflow of the allocated buffer. If such an overflow occurs, a C99 compliant snprintf() returns a count >= maxlen. However, a non-compliant snprintf() function returns only count = maxlen - 1. To cover both cases, test whether count >= maxlen - 1. */ if ((unsigned int) count + 1 >= maxlen) { /* If maxlen already has attained its allowed maximum, allocating more memory will not increase maxlen. Instead of looping, bail out. */ if (maxlen == INT_MAX / TCHARS_PER_DCHAR) goto overflow; else { /* Need at least (count + 1) * sizeof (TCHAR_T) bytes. (The +1 is for the trailing NUL.) But ask for (count + 2) * sizeof (TCHAR_T) bytes, so that in the next round, we likely get maxlen > (unsigned int) count + 1 and so we don't get here again. And allocate proportionally, to avoid looping eternally if snprintf() reports a too small count. */ size_t n = xmax (xsum (length, ((unsigned int) count + 2 + TCHARS_PER_DCHAR - 1) / TCHARS_PER_DCHAR), xtimes (allocated, 2)); ENSURE_ALLOCATION (n); continue; } } #endif #if NEED_PRINTF_UNBOUNDED_PRECISION if (prec_ourselves) { /* Handle the precision. */ TCHAR_T *prec_ptr = # if USE_SNPRINTF (TCHAR_T *) (result + length); # else tmp; # endif size_t prefix_count; size_t move; prefix_count = 0; /* Put the additional zeroes after the sign. */ if (count >= 1 && (*prec_ptr == '-' || *prec_ptr == '+' || *prec_ptr == ' ')) prefix_count = 1; /* Put the additional zeroes after the 0x prefix if (flags & FLAG_ALT) || (dp->conversion == 'p'). */ else if (count >= 2 && prec_ptr[0] == '0' && (prec_ptr[1] == 'x' || prec_ptr[1] == 'X')) prefix_count = 2; move = count - prefix_count; if (precision > move) { /* Insert zeroes. */ size_t insert = precision - move; TCHAR_T *prec_end; # if USE_SNPRINTF size_t n = xsum (length, (count + insert + TCHARS_PER_DCHAR - 1) / TCHARS_PER_DCHAR); length += (count + TCHARS_PER_DCHAR - 1) / TCHARS_PER_DCHAR; ENSURE_ALLOCATION (n); length -= (count + TCHARS_PER_DCHAR - 1) / TCHARS_PER_DCHAR; prec_ptr = (TCHAR_T *) (result + length); # endif prec_end = prec_ptr + count; prec_ptr += prefix_count; while (prec_end > prec_ptr) { prec_end--; prec_end[insert] = prec_end[0]; } prec_end += insert; do *--prec_end = '0'; while (prec_end > prec_ptr); count += insert; } } #endif #if !USE_SNPRINTF if (count >= tmp_length) /* tmp_length was incorrectly calculated - fix the code above! */ abort (); #endif #if !DCHAR_IS_TCHAR /* Convert from TCHAR_T[] to DCHAR_T[]. */ if (dp->conversion == 'c' || dp->conversion == 's') { /* type = TYPE_CHAR or TYPE_WIDE_CHAR or TYPE_STRING TYPE_WIDE_STRING. The result string is not certainly ASCII. */ const TCHAR_T *tmpsrc; DCHAR_T *tmpdst; size_t tmpdst_len; /* This code assumes that TCHAR_T is 'char'. */ verify (sizeof (TCHAR_T) == 1); # if USE_SNPRINTF tmpsrc = (TCHAR_T *) (result + length); # else tmpsrc = tmp; # endif tmpdst = DCHAR_CONV_FROM_ENCODING (locale_charset (), iconveh_question_mark, tmpsrc, count, NULL, NULL, &tmpdst_len); if (tmpdst == NULL) { int saved_errno = errno; if (!(result == resultbuf || result == NULL)) free (result); if (buf_malloced != NULL) free (buf_malloced); CLEANUP (); errno = saved_errno; return NULL; } ENSURE_ALLOCATION (xsum (length, tmpdst_len)); DCHAR_CPY (result + length, tmpdst, tmpdst_len); free (tmpdst); count = tmpdst_len; } else { /* The result string is ASCII. Simple 1:1 conversion. */ # if USE_SNPRINTF /* If sizeof (DCHAR_T) == sizeof (TCHAR_T), it's a no-op conversion, in-place on the array starting at (result + length). */ if (sizeof (DCHAR_T) != sizeof (TCHAR_T)) # endif { const TCHAR_T *tmpsrc; DCHAR_T *tmpdst; size_t n; # if USE_SNPRINTF if (result == resultbuf) { tmpsrc = (TCHAR_T *) (result + length); /* ENSURE_ALLOCATION will not move tmpsrc (because it's part of resultbuf). */ ENSURE_ALLOCATION (xsum (length, count)); } else { /* ENSURE_ALLOCATION will move the array (because it uses realloc(). */ ENSURE_ALLOCATION (xsum (length, count)); tmpsrc = (TCHAR_T *) (result + length); } # else tmpsrc = tmp; ENSURE_ALLOCATION (xsum (length, count)); # endif tmpdst = result + length; /* Copy backwards, because of overlapping. */ tmpsrc += count; tmpdst += count; for (n = count; n > 0; n--) *--tmpdst = *--tmpsrc; } } #endif #if DCHAR_IS_TCHAR && !USE_SNPRINTF /* Make room for the result. */ if (count > allocated - length) { /* Need at least count elements. But allocate proportionally. */ size_t n = xmax (xsum (length, count), xtimes (allocated, 2)); ENSURE_ALLOCATION (n); } #endif /* Here count <= allocated - length. */ /* Perform padding. */ #if !DCHAR_IS_TCHAR || ENABLE_UNISTDIO || NEED_PRINTF_FLAG_LEFTADJUST || NEED_PRINTF_FLAG_ZERO || NEED_PRINTF_UNBOUNDED_PRECISION if (pad_ourselves && has_width) { size_t w; # if ENABLE_UNISTDIO /* Outside POSIX, it's preferable to compare the width against the number of _characters_ of the converted value. */ w = DCHAR_MBSNLEN (result + length, count); # else /* The width is compared against the number of _bytes_ of the converted value, says POSIX. */ w = count; # endif if (w < width) { size_t pad = width - w; /* Make room for the result. */ if (xsum (count, pad) > allocated - length) { /* Need at least count + pad elements. But allocate proportionally. */ size_t n = xmax (xsum3 (length, count, pad), xtimes (allocated, 2)); # if USE_SNPRINTF length += count; ENSURE_ALLOCATION (n); length -= count; # else ENSURE_ALLOCATION (n); # endif } /* Here count + pad <= allocated - length. */ { # if !DCHAR_IS_TCHAR || USE_SNPRINTF DCHAR_T * const rp = result + length; # else DCHAR_T * const rp = tmp; # endif DCHAR_T *p = rp + count; DCHAR_T *end = p + pad; DCHAR_T *pad_ptr; # if !DCHAR_IS_TCHAR || ENABLE_UNISTDIO if (dp->conversion == 'c' || dp->conversion == 's') /* No zero-padding for string directives. */ pad_ptr = NULL; else # endif { pad_ptr = (*rp == '-' ? rp + 1 : rp); /* No zero-padding of "inf" and "nan". */ if ((*pad_ptr >= 'A' && *pad_ptr <= 'Z') || (*pad_ptr >= 'a' && *pad_ptr <= 'z')) pad_ptr = NULL; } /* The generated string now extends from rp to p, with the zero padding insertion point being at pad_ptr. */ count = count + pad; /* = end - rp */ if (flags & FLAG_LEFT) { /* Pad with spaces on the right. */ for (; pad > 0; pad--) *p++ = ' '; } else if ((flags & FLAG_ZERO) && pad_ptr != NULL) { /* Pad with zeroes. */ DCHAR_T *q = end; while (p > pad_ptr) *--q = *--p; for (; pad > 0; pad--) *p++ = '0'; } else { /* Pad with spaces on the left. */ DCHAR_T *q = end; while (p > rp) *--q = *--p; for (; pad > 0; pad--) *p++ = ' '; } } } } #endif /* Here still count <= allocated - length. */ #if !DCHAR_IS_TCHAR || USE_SNPRINTF /* The snprintf() result did fit. */ #else /* Append the sprintf() result. */ memcpy (result + length, tmp, count * sizeof (DCHAR_T)); #endif #if !USE_SNPRINTF if (tmp != tmpbuf) free (tmp); #endif #if NEED_PRINTF_DIRECTIVE_F if (dp->conversion == 'F') { /* Convert the %f result to upper case for %F. */ DCHAR_T *rp = result + length; size_t rc; for (rc = count; rc > 0; rc--, rp++) if (*rp >= 'a' && *rp <= 'z') *rp = *rp - 'a' + 'A'; } #endif length += count; break; } errno = orig_errno; #undef pad_ourselves #undef prec_ourselves } } } /* Add the final NUL. */ ENSURE_ALLOCATION (xsum (length, 1)); result[length] = '\0'; if (result != resultbuf && length + 1 < allocated) { /* Shrink the allocated memory if possible. */ DCHAR_T *memory; memory = (DCHAR_T *) realloc (result, (length + 1) * sizeof (DCHAR_T)); if (memory != NULL) result = memory; } if (buf_malloced != NULL) free (buf_malloced); CLEANUP (); *lengthp = length; /* Note that we can produce a big string of a length > INT_MAX. POSIX says that snprintf() fails with errno = EOVERFLOW in this case, but that's only because snprintf() returns an 'int'. This function does not have this limitation. */ return result; #if USE_SNPRINTF overflow: if (!(result == resultbuf || result == NULL)) free (result); if (buf_malloced != NULL) free (buf_malloced); CLEANUP (); errno = EOVERFLOW; return NULL; #endif out_of_memory: if (!(result == resultbuf || result == NULL)) free (result); if (buf_malloced != NULL) free (buf_malloced); out_of_memory_1: CLEANUP (); errno = ENOMEM; return NULL; } } #undef MAX_ROOM_NEEDED #undef TCHARS_PER_DCHAR #undef SNPRINTF #undef USE_SNPRINTF #undef DCHAR_SET #undef DCHAR_CPY #undef PRINTF_PARSE #undef DIRECTIVES #undef DIRECTIVE #undef DCHAR_IS_TCHAR #undef TCHAR_T #undef DCHAR_T #undef FCHAR_T #undef VASNPRINTF pspp-1.4.1/gl/frexp.c0000644000175000017500000001036213723215636014017 0ustar00blpblp00000000000000/* Split a double into fraction and mantissa. Copyright (C) 2007-2020 Free Software Foundation, Inc. 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 3 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, see . */ /* Written by Paolo Bonzini , 2003, and Bruno Haible , 2007. */ #if ! defined USE_LONG_DOUBLE # include #endif /* Specification. */ #include #include #ifdef USE_LONG_DOUBLE # include "isnanl-nolibm.h" # include "fpucw.h" #else # include "isnand-nolibm.h" #endif /* This file assumes FLT_RADIX = 2. If FLT_RADIX is a power of 2 greater than 2, or not even a power of 2, some rounding errors can occur, so that then the returned mantissa is only guaranteed to be <= 1.0, not < 1.0. */ #ifdef USE_LONG_DOUBLE # define FUNC frexpl # define DOUBLE long double # define ISNAN isnanl # define DECL_ROUNDING DECL_LONG_DOUBLE_ROUNDING # define BEGIN_ROUNDING() BEGIN_LONG_DOUBLE_ROUNDING () # define END_ROUNDING() END_LONG_DOUBLE_ROUNDING () # define L_(literal) literal##L #else # define FUNC frexp # define DOUBLE double # define ISNAN isnand # define DECL_ROUNDING # define BEGIN_ROUNDING() # define END_ROUNDING() # define L_(literal) literal #endif DOUBLE FUNC (DOUBLE x, int *expptr) { int sign; int exponent; DECL_ROUNDING /* Test for NaN, infinity, and zero. */ if (ISNAN (x) || x + x == x) { *expptr = 0; return x; } sign = 0; if (x < 0) { x = - x; sign = -1; } BEGIN_ROUNDING (); { /* Since the exponent is an 'int', it fits in 64 bits. Therefore the loops are executed no more than 64 times. */ DOUBLE pow2[64]; /* pow2[i] = 2^2^i */ DOUBLE powh[64]; /* powh[i] = 2^-2^i */ int i; exponent = 0; if (x >= L_(1.0)) { /* A positive exponent. */ DOUBLE pow2_i; /* = pow2[i] */ DOUBLE powh_i; /* = powh[i] */ /* Invariants: pow2_i = 2^2^i, powh_i = 2^-2^i, x * 2^exponent = argument, x >= 1.0. */ for (i = 0, pow2_i = L_(2.0), powh_i = L_(0.5); ; i++, pow2_i = pow2_i * pow2_i, powh_i = powh_i * powh_i) { if (x >= pow2_i) { exponent += (1 << i); x *= powh_i; } else break; pow2[i] = pow2_i; powh[i] = powh_i; } /* Avoid making x too small, as it could become a denormalized number and thus lose precision. */ while (i > 0 && x < pow2[i - 1]) { i--; powh_i = powh[i]; } exponent += (1 << i); x *= powh_i; /* Here 2^-2^i <= x < 1.0. */ } else { /* A negative or zero exponent. */ DOUBLE pow2_i; /* = pow2[i] */ DOUBLE powh_i; /* = powh[i] */ /* Invariants: pow2_i = 2^2^i, powh_i = 2^-2^i, x * 2^exponent = argument, x < 1.0. */ for (i = 0, pow2_i = L_(2.0), powh_i = L_(0.5); ; i++, pow2_i = pow2_i * pow2_i, powh_i = powh_i * powh_i) { if (x < powh_i) { exponent -= (1 << i); x *= pow2_i; } else break; pow2[i] = pow2_i; powh[i] = powh_i; } /* Here 2^-2^i <= x < 1.0. */ } /* Invariants: x * 2^exponent = argument, and 2^-2^i <= x < 1.0. */ while (i > 0) { i--; if (x < powh[i]) { exponent -= (1 << i); x *= pow2[i]; } } /* Here 0.5 <= x < 1.0. */ } if (sign < 0) x = - x; END_ROUNDING (); *expptr = exponent; return x; } pspp-1.4.1/gl/clean-temp.c0000644000175000017500000010556213723215636014727 0ustar00blpblp00000000000000/* Temporary directories and temporary files with automatic cleanup. Copyright (C) 2001, 2003, 2006-2007, 2009-2020 Free Software Foundation, Inc. Written by Bruno Haible , 2006. 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 3 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, see . */ #include /* Specification. */ #include "clean-temp.h" #include #include #include #include #include #include #include #include #if defined _WIN32 && ! defined __CYGWIN__ # define WIN32_LEAN_AND_MEAN /* avoid including junk */ # include #endif #include "error.h" #include "fatal-signal.h" #include "asyncsafe-spin.h" #include "pathmax.h" #include "tmpdir.h" #include "xalloc.h" #include "xmalloca.h" #include "glthread/lock.h" #include "thread-optim.h" #include "gl_xlist.h" #include "gl_linkedhash_list.h" #include "gl_linked_list.h" #include "gettext.h" #if GNULIB_TEMPNAME # include "tempname.h" #endif #if GNULIB_FWRITEERROR # include "fwriteerror.h" #endif #if GNULIB_CLOSE_STREAM # include "close-stream.h" #endif #if GNULIB_FCNTL_SAFER # include "fcntl--.h" #endif #if GNULIB_FOPEN_SAFER # include "stdio--.h" #endif #define _(str) gettext (str) /* GNU Hurd doesn't have PATH_MAX. Use a fallback. Temporary directory names are usually not that long. */ #ifndef PATH_MAX # define PATH_MAX 1024 #endif #if defined _WIN32 && ! defined __CYGWIN__ /* Don't assume that UNICODE is not defined. */ # undef OSVERSIONINFO # define OSVERSIONINFO OSVERSIONINFOA # undef GetVersionEx # define GetVersionEx GetVersionExA #endif /* The use of 'volatile' in the types below (and ISO C 99 section 5.1.2.3.(5)) ensure that while constructing or modifying the data structures, the field values are written to memory in the order of the C statements. So the signal handler can rely on these field values to be up to date. */ /* Lock that protects the file_cleanup_list from concurrent modification in different threads. */ gl_lock_define_initialized (static, file_cleanup_list_lock) /* List of all temporary files without temporary directories. */ static gl_list_t /* */ volatile file_cleanup_list; /* Registry for a single temporary directory. 'struct temp_dir' from the public header file overlaps with this. */ struct tempdir { /* The absolute pathname of the directory. */ char * volatile dirname; /* Whether errors during explicit cleanup are reported to standard error. */ bool cleanup_verbose; /* Absolute pathnames of subdirectories. */ gl_list_t /* */ volatile subdirs; /* Absolute pathnames of files. */ gl_list_t /* */ volatile files; }; /* Lock that protects the dir_cleanup_list from concurrent modification in different threads. */ gl_lock_define_initialized (static, dir_cleanup_list_lock) /* List of all temporary directories. */ static struct { struct tempdir * volatile * volatile tempdir_list; size_t volatile tempdir_count; size_t tempdir_allocated; } dir_cleanup_list /* = { NULL, 0, 0 } */; /* A file descriptor to be closed. In multithreaded programs, it is forbidden to close the same fd twice, because you never know what unrelated open() calls are being executed in other threads. So, the 'close (fd)' must be guarded by a once-only guard. */ struct closeable_fd { /* The file descriptor to close. */ int volatile fd; /* Set to true when it has been closed. */ bool volatile closed; /* Lock that protects the fd from being closed twice. */ asyncsafe_spinlock_t lock; /* Tells whether this list element has been done and can be freed. */ bool volatile done; }; /* Lock that protects the descriptors list from concurrent modification in different threads. */ gl_lock_define_initialized (static, descriptors_lock) /* List of all open file descriptors to temporary files. */ static gl_list_t /* */ volatile descriptors; /* For the subdirs and for the files, we use a gl_list_t of type LINKEDHASH. Why? We need a data structure that 1) Can contain an arbitrary number of 'char *' values. The strings are compared via strcmp, not pointer comparison. 2) Has insertion and deletion operations that are fast: ideally O(1), or possibly O(log n). This is important for GNU sort, which may create a large number of temporary files. 3) Allows iteration through all elements from within a signal handler. 4) May or may not allow duplicates. It doesn't matter here, since any file or subdir can only be removed once. Criterion 1) would allow any gl_list_t or gl_oset_t implementation. Criterion 2) leaves only GL_LINKEDHASH_LIST, GL_TREEHASH_LIST, or GL_TREE_OSET. Criterion 3) puts at disadvantage GL_TREEHASH_LIST and GL_TREE_OSET. Namely, iteration through the elements of a binary tree requires access to many ->left, ->right, ->parent pointers. However, the rebalancing code for insertion and deletion in an AVL or red-black tree is so complicated that we cannot assume that >left, ->right, ->parent pointers are in a consistent state throughout these operations. Therefore, to avoid a crash in the signal handler, all destructive operations to the lists would have to be protected by a block_fatal_signals (); ... unblock_fatal_signals (); pair. Which causes extra system calls. Criterion 3) would also discourage GL_ARRAY_LIST and GL_CARRAY_LIST, if they were not already excluded. Namely, these implementations use xrealloc(), leaving a time window in which in the list->elements pointer points to already deallocated memory. To avoid a crash in the signal handler at such a moment, all destructive operations would have to protected by block/unblock_fatal_signals (), in this case too. A list of type GL_LINKEDHASH_LIST without duplicates fulfills all requirements: 2) Insertion and deletion are O(1) on average. 3) The gl_list_iterator, gl_list_iterator_next implementations do not trigger memory allocations, nor other system calls, and are therefore safe to be called from a signal handler. Furthermore, since SIGNAL_SAFE_LIST is defined, the implementation of the destructive functions ensures that the list structure is safe to be traversed at any moment, even when interrupted by an asynchronous signal. */ /* String equality and hash code functions used by the lists. */ static bool string_equals (const void *x1, const void *x2) { const char *s1 = (const char *) x1; const char *s2 = (const char *) x2; return strcmp (s1, s2) == 0; } #define SIZE_BITS (sizeof (size_t) * CHAR_BIT) /* A hash function for NUL-terminated char* strings using the method described by Bruno Haible. See https://www.haible.de/bruno/hashfunc.html. */ static size_t string_hash (const void *x) { const char *s = (const char *) x; size_t h = 0; for (; *s; s++) h = *s + ((h << 9) | (h >> (SIZE_BITS - 9))); return h; } /* The set of fatal signal handlers. Cached here because we are not allowed to call get_fatal_signal_set () from a signal handler. */ static const sigset_t *fatal_signal_set /* = NULL */; static void init_fatal_signal_set (void) { if (fatal_signal_set == NULL) fatal_signal_set = get_fatal_signal_set (); } /* Close a file descriptor. Avoids race conditions with normal thread code or signal-handler code that might want to close the same file descriptor. */ static _GL_ASYNC_SAFE int asyncsafe_close (struct closeable_fd *element) { sigset_t saved_mask; int ret; int saved_errno; asyncsafe_spin_lock (&element->lock, fatal_signal_set, &saved_mask); if (!element->closed) { ret = close (element->fd); saved_errno = errno; element->closed = true; } else { ret = 0; saved_errno = 0; } asyncsafe_spin_unlock (&element->lock, &saved_mask); element->done = true; errno = saved_errno; return ret; } /* Close a file descriptor and the stream that contains it. Avoids race conditions with signal-handler code that might want to close the same file descriptor. */ static int asyncsafe_fclose_variant (struct closeable_fd *element, FILE *fp, int (*fclose_variant) (FILE *)) { if (fileno (fp) != element->fd) abort (); /* Flush buffered data first, to minimize the duration of the spin lock. */ fflush (fp); sigset_t saved_mask; int ret; int saved_errno; asyncsafe_spin_lock (&element->lock, fatal_signal_set, &saved_mask); if (!element->closed) { ret = fclose_variant (fp); /* invokes close (element->fd) */ saved_errno = errno; element->closed = true; } else { ret = 0; saved_errno = 0; } asyncsafe_spin_unlock (&element->lock, &saved_mask); element->done = true; errno = saved_errno; return ret; } /* The signal handler. It gets called asynchronously. */ static _GL_ASYNC_SAFE void cleanup_action (int sig _GL_UNUSED) { size_t i; /* First close all file descriptors to temporary files. */ { gl_list_t fds = descriptors; if (fds != NULL) { gl_list_iterator_t iter; const void *element; iter = gl_list_iterator (fds); while (gl_list_iterator_next (&iter, &element, NULL)) { asyncsafe_close ((struct closeable_fd *) element); } gl_list_iterator_free (&iter); } } { gl_list_t files = file_cleanup_list; if (files != NULL) { gl_list_iterator_t iter; const void *element; iter = gl_list_iterator (files); while (gl_list_iterator_next (&iter, &element, NULL)) { const char *file = (const char *) element; unlink (file); } gl_list_iterator_free (&iter); } } for (i = 0; i < dir_cleanup_list.tempdir_count; i++) { struct tempdir *dir = dir_cleanup_list.tempdir_list[i]; if (dir != NULL) { gl_list_iterator_t iter; const void *element; /* First cleanup the files in the subdirectories. */ iter = gl_list_iterator (dir->files); while (gl_list_iterator_next (&iter, &element, NULL)) { const char *file = (const char *) element; unlink (file); } gl_list_iterator_free (&iter); /* Then cleanup the subdirectories. */ iter = gl_list_iterator (dir->subdirs); while (gl_list_iterator_next (&iter, &element, NULL)) { const char *subdir = (const char *) element; rmdir (subdir); } gl_list_iterator_free (&iter); /* Then cleanup the temporary directory itself. */ rmdir (dir->dirname); } } } /* Initializes this facility. */ static void do_init_clean_temp (void) { /* Initialize the data used by the cleanup handler. */ init_fatal_signal_set (); /* Register the cleanup handler. */ at_fatal_signal (&cleanup_action); } /* Ensure that do_init_clean_temp is called once only. */ gl_once_define(static, clean_temp_once) /* Initializes this facility upon first use. */ static void init_clean_temp (void) { gl_once (clean_temp_once, do_init_clean_temp); } /* ============= Temporary files without temporary directories ============= */ /* Register the given ABSOLUTE_FILE_NAME as being a file that needs to be removed. Should be called before the file ABSOLUTE_FILE_NAME is created. */ void register_temporary_file (const char *absolute_file_name) { IF_MT_DECL; IF_MT gl_lock_lock (file_cleanup_list_lock); /* Make sure that this facility and the file_cleanup_list are initialized. */ if (file_cleanup_list == NULL) { init_clean_temp (); file_cleanup_list = gl_list_create_empty (GL_LINKEDHASH_LIST, string_equals, string_hash, NULL, false); } /* Add absolute_file_name to file_cleanup_list, without duplicates. */ if (gl_list_search (file_cleanup_list, absolute_file_name) == NULL) gl_list_add_first (file_cleanup_list, xstrdup (absolute_file_name)); IF_MT gl_lock_unlock (file_cleanup_list_lock); } /* Unregister the given ABSOLUTE_FILE_NAME as being a file that needs to be removed. Should be called when the file ABSOLUTE_FILE_NAME could not be created. */ void unregister_temporary_file (const char *absolute_file_name) { IF_MT_DECL; IF_MT gl_lock_lock (file_cleanup_list_lock); gl_list_t list = file_cleanup_list; if (list != NULL) { gl_list_node_t node = gl_list_search (list, absolute_file_name); if (node != NULL) { char *old_string = (char *) gl_list_node_value (list, node); gl_list_remove_node (list, node); free (old_string); } } IF_MT gl_lock_unlock (file_cleanup_list_lock); } /* Remove a file, with optional error message. Return 0 upon success, or -1 if there was some problem. */ static int do_unlink (const char *absolute_file_name, bool cleanup_verbose) { if (unlink (absolute_file_name) < 0 && cleanup_verbose && errno != ENOENT) { error (0, errno, _("cannot remove temporary file %s"), absolute_file_name); return -1; } return 0; } /* Remove the given ABSOLUTE_FILE_NAME and unregister it. CLEANUP_VERBOSE determines whether errors are reported to standard error. Return 0 upon success, or -1 if there was some problem. */ int cleanup_temporary_file (const char *absolute_file_name, bool cleanup_verbose) { int err; err = do_unlink (absolute_file_name, cleanup_verbose); unregister_temporary_file (absolute_file_name); return err; } /* ========= Temporary directories and temporary files inside them ========= */ /* Create a temporary directory. PREFIX is used as a prefix for the name of the temporary directory. It should be short and still give an indication about the program. PARENTDIR can be used to specify the parent directory; if NULL, a default parent directory is used (either $TMPDIR or /tmp or similar). CLEANUP_VERBOSE determines whether errors during explicit cleanup are reported to standard error. Return a fresh 'struct temp_dir' on success. Upon error, an error message is shown and NULL is returned. */ struct temp_dir * create_temp_dir (const char *prefix, const char *parentdir, bool cleanup_verbose) { IF_MT_DECL; IF_MT gl_lock_lock (dir_cleanup_list_lock); struct tempdir * volatile *tmpdirp = NULL; struct tempdir *tmpdir; size_t i; char *xtemplate; char *tmpdirname; /* See whether it can take the slot of an earlier temporary directory already cleaned up. */ for (i = 0; i < dir_cleanup_list.tempdir_count; i++) if (dir_cleanup_list.tempdir_list[i] == NULL) { tmpdirp = &dir_cleanup_list.tempdir_list[i]; break; } if (tmpdirp == NULL) { /* See whether the array needs to be extended. */ if (dir_cleanup_list.tempdir_count == dir_cleanup_list.tempdir_allocated) { /* Note that we cannot use xrealloc(), because then the cleanup() function could access an already deallocated array. */ struct tempdir * volatile *old_array = dir_cleanup_list.tempdir_list; size_t old_allocated = dir_cleanup_list.tempdir_allocated; size_t new_allocated = 2 * dir_cleanup_list.tempdir_allocated + 1; struct tempdir * volatile *new_array = XNMALLOC (new_allocated, struct tempdir * volatile); if (old_allocated == 0) { /* First use of this facility. */ init_clean_temp (); } else { /* Don't use memcpy() here, because memcpy takes non-volatile arguments and is therefore not guaranteed to complete all memory stores before the next statement. */ size_t k; for (k = 0; k < old_allocated; k++) new_array[k] = old_array[k]; } dir_cleanup_list.tempdir_list = new_array; dir_cleanup_list.tempdir_allocated = new_allocated; /* Now we can free the old array. */ /* No, we can't do that. If cleanup_action is running in a different thread and has already fetched the tempdir_list pointer (getting old_array) but not yet accessed its i-th element, that thread may crash when accessing an element of the already freed old_array array. */ #if 0 if (old_array != NULL) free ((struct tempdir **) old_array); #endif } tmpdirp = &dir_cleanup_list.tempdir_list[dir_cleanup_list.tempdir_count]; /* Initialize *tmpdirp before incrementing tempdir_count, so that cleanup() will skip this entry before it is fully initialized. */ *tmpdirp = NULL; dir_cleanup_list.tempdir_count++; } /* Initialize a 'struct tempdir'. */ tmpdir = XMALLOC (struct tempdir); tmpdir->dirname = NULL; tmpdir->cleanup_verbose = cleanup_verbose; tmpdir->subdirs = gl_list_create_empty (GL_LINKEDHASH_LIST, string_equals, string_hash, NULL, false); tmpdir->files = gl_list_create_empty (GL_LINKEDHASH_LIST, string_equals, string_hash, NULL, false); /* Create the temporary directory. */ xtemplate = (char *) xmalloca (PATH_MAX); if (path_search (xtemplate, PATH_MAX, parentdir, prefix, parentdir == NULL)) { error (0, errno, _("cannot find a temporary directory, try setting $TMPDIR")); goto quit; } block_fatal_signals (); tmpdirname = mkdtemp (xtemplate); int saved_errno = errno; if (tmpdirname != NULL) { tmpdir->dirname = tmpdirname; *tmpdirp = tmpdir; } unblock_fatal_signals (); if (tmpdirname == NULL) { error (0, saved_errno, _("cannot create a temporary directory using template \"%s\""), xtemplate); goto quit; } /* Replace tmpdir->dirname with a copy that has indefinite extent. We cannot do this inside the block_fatal_signals/unblock_fatal_signals block because then the cleanup handler would not remove the directory if xstrdup fails. */ tmpdir->dirname = xstrdup (tmpdirname); IF_MT gl_lock_unlock (dir_cleanup_list_lock); freea (xtemplate); return (struct temp_dir *) tmpdir; quit: IF_MT gl_lock_unlock (dir_cleanup_list_lock); freea (xtemplate); return NULL; } /* Register the given ABSOLUTE_FILE_NAME as being a file inside DIR, that needs to be removed before DIR can be removed. Should be called before the file ABSOLUTE_FILE_NAME is created. */ void register_temp_file (struct temp_dir *dir, const char *absolute_file_name) { struct tempdir *tmpdir = (struct tempdir *)dir; IF_MT_DECL; IF_MT gl_lock_lock (dir_cleanup_list_lock); /* Add absolute_file_name to tmpdir->files, without duplicates. */ if (gl_list_search (tmpdir->files, absolute_file_name) == NULL) gl_list_add_first (tmpdir->files, xstrdup (absolute_file_name)); IF_MT gl_lock_unlock (dir_cleanup_list_lock); } /* Unregister the given ABSOLUTE_FILE_NAME as being a file inside DIR, that needs to be removed before DIR can be removed. Should be called when the file ABSOLUTE_FILE_NAME could not be created. */ void unregister_temp_file (struct temp_dir *dir, const char *absolute_file_name) { struct tempdir *tmpdir = (struct tempdir *)dir; IF_MT_DECL; IF_MT gl_lock_lock (dir_cleanup_list_lock); gl_list_t list = tmpdir->files; gl_list_node_t node; node = gl_list_search (list, absolute_file_name); if (node != NULL) { char *old_string = (char *) gl_list_node_value (list, node); gl_list_remove_node (list, node); free (old_string); } IF_MT gl_lock_unlock (dir_cleanup_list_lock); } /* Register the given ABSOLUTE_DIR_NAME as being a subdirectory inside DIR, that needs to be removed before DIR can be removed. Should be called before the subdirectory ABSOLUTE_DIR_NAME is created. */ void register_temp_subdir (struct temp_dir *dir, const char *absolute_dir_name) { struct tempdir *tmpdir = (struct tempdir *)dir; IF_MT_DECL; IF_MT gl_lock_lock (dir_cleanup_list_lock); /* Add absolute_dir_name to tmpdir->subdirs, without duplicates. */ if (gl_list_search (tmpdir->subdirs, absolute_dir_name) == NULL) gl_list_add_first (tmpdir->subdirs, xstrdup (absolute_dir_name)); IF_MT gl_lock_unlock (dir_cleanup_list_lock); } /* Unregister the given ABSOLUTE_DIR_NAME as being a subdirectory inside DIR, that needs to be removed before DIR can be removed. Should be called when the subdirectory ABSOLUTE_DIR_NAME could not be created. */ void unregister_temp_subdir (struct temp_dir *dir, const char *absolute_dir_name) { struct tempdir *tmpdir = (struct tempdir *)dir; IF_MT_DECL; IF_MT gl_lock_lock (dir_cleanup_list_lock); gl_list_t list = tmpdir->subdirs; gl_list_node_t node; node = gl_list_search (list, absolute_dir_name); if (node != NULL) { char *old_string = (char *) gl_list_node_value (list, node); gl_list_remove_node (list, node); free (old_string); } IF_MT gl_lock_unlock (dir_cleanup_list_lock); } /* Remove a directory, with optional error message. Return 0 upon success, or -1 if there was some problem. */ static int do_rmdir (const char *absolute_dir_name, bool cleanup_verbose) { if (rmdir (absolute_dir_name) < 0 && cleanup_verbose && errno != ENOENT) { error (0, errno, _("cannot remove temporary directory %s"), absolute_dir_name); return -1; } return 0; } /* Remove the given ABSOLUTE_FILE_NAME and unregister it. Return 0 upon success, or -1 if there was some problem. */ int cleanup_temp_file (struct temp_dir *dir, const char *absolute_file_name) { int err; err = do_unlink (absolute_file_name, dir->cleanup_verbose); unregister_temp_file (dir, absolute_file_name); return err; } /* Remove the given ABSOLUTE_DIR_NAME and unregister it. Return 0 upon success, or -1 if there was some problem. */ int cleanup_temp_subdir (struct temp_dir *dir, const char *absolute_dir_name) { int err; err = do_rmdir (absolute_dir_name, dir->cleanup_verbose); unregister_temp_subdir (dir, absolute_dir_name); return err; } /* Remove all registered files and subdirectories inside DIR. Only to be called with dir_cleanup_list_lock locked. Return 0 upon success, or -1 if there was some problem. */ int cleanup_temp_dir_contents (struct temp_dir *dir) { struct tempdir *tmpdir = (struct tempdir *)dir; int err = 0; gl_list_t list; gl_list_iterator_t iter; const void *element; gl_list_node_t node; /* First cleanup the files in the subdirectories. */ list = tmpdir->files; iter = gl_list_iterator (list); while (gl_list_iterator_next (&iter, &element, &node)) { char *file = (char *) element; err |= do_unlink (file, dir->cleanup_verbose); gl_list_remove_node (list, node); /* Now only we can free file. */ free (file); } gl_list_iterator_free (&iter); /* Then cleanup the subdirectories. */ list = tmpdir->subdirs; iter = gl_list_iterator (list); while (gl_list_iterator_next (&iter, &element, &node)) { char *subdir = (char *) element; err |= do_rmdir (subdir, dir->cleanup_verbose); gl_list_remove_node (list, node); /* Now only we can free subdir. */ free (subdir); } gl_list_iterator_free (&iter); return err; } /* Remove all registered files and subdirectories inside DIR and DIR itself. DIR cannot be used any more after this call. Return 0 upon success, or -1 if there was some problem. */ int cleanup_temp_dir (struct temp_dir *dir) { IF_MT_DECL; IF_MT gl_lock_lock (dir_cleanup_list_lock); struct tempdir *tmpdir = (struct tempdir *)dir; int err = 0; size_t i; err |= cleanup_temp_dir_contents (dir); err |= do_rmdir (tmpdir->dirname, dir->cleanup_verbose); for (i = 0; i < dir_cleanup_list.tempdir_count; i++) if (dir_cleanup_list.tempdir_list[i] == tmpdir) { /* Remove dir_cleanup_list.tempdir_list[i]. */ if (i + 1 == dir_cleanup_list.tempdir_count) { while (i > 0 && dir_cleanup_list.tempdir_list[i - 1] == NULL) i--; dir_cleanup_list.tempdir_count = i; } else dir_cleanup_list.tempdir_list[i] = NULL; /* Now only we can free the tmpdir->dirname, tmpdir->subdirs, tmpdir->files, and tmpdir itself. */ gl_list_free (tmpdir->files); gl_list_free (tmpdir->subdirs); free (tmpdir->dirname); free (tmpdir); IF_MT gl_lock_unlock (dir_cleanup_list_lock); return err; } /* The user passed an invalid DIR argument. */ abort (); } /* ================== Opening and closing temporary files ================== */ #if defined _WIN32 && ! defined __CYGWIN__ /* On Windows, opening a file with _O_TEMPORARY has the effect of passing the FILE_FLAG_DELETE_ON_CLOSE flag to CreateFile(), which has the effect of deleting the file when it is closed - even when the program crashes. But (according to the Cygwin sources) it works only on Windows NT or newer. So we cache the info whether we are running on Windows NT or newer. */ static bool supports_delete_on_close () { static int known; /* 1 = yes, -1 = no, 0 = unknown */ if (!known) { OSVERSIONINFO v; /* According to this structure must be initialized as follows: */ v.dwOSVersionInfoSize = sizeof (OSVERSIONINFO); if (GetVersionEx (&v)) known = (v.dwPlatformId == VER_PLATFORM_WIN32_NT ? 1 : -1); else known = -1; } return (known > 0); } #endif /* Register a file descriptor to be closed. */ static void register_fd (int fd) { IF_MT_DECL; IF_MT gl_lock_lock (descriptors_lock); if (descriptors == NULL) descriptors = gl_list_create_empty (GL_LINKED_LIST, NULL, NULL, NULL, false); struct closeable_fd *element = XMALLOC (struct closeable_fd); element->fd = fd; element->closed = false; asyncsafe_spin_init (&element->lock); element->done = false; gl_list_add_first (descriptors, element); IF_MT gl_lock_unlock (descriptors_lock); } /* Open a temporary file in a temporary directory. FILE_NAME must already have been passed to register_temp_file. Registers the resulting file descriptor to be closed. DELETE_ON_CLOSE indicates whether the file can be deleted when the resulting file descriptor or stream is closed. */ int open_temp (const char *file_name, int flags, mode_t mode, bool delete_on_close) { int fd; int saved_errno; block_fatal_signals (); /* Note: 'open' here is actually open() or open_safer(). */ #if defined _WIN32 && ! defined __CYGWIN__ /* Use _O_TEMPORARY when possible, to increase the chances that the temporary file is removed when the process crashes. */ if (delete_on_close && supports_delete_on_close ()) fd = open (file_name, flags | _O_TEMPORARY, mode); else #endif fd = open (file_name, flags, mode); saved_errno = errno; if (fd >= 0) register_fd (fd); unblock_fatal_signals (); errno = saved_errno; return fd; } /* Open a temporary file in a temporary directory. FILE_NAME must already have been passed to register_temp_file. Registers the resulting file descriptor to be closed. DELETE_ON_CLOSE indicates whether the file can be deleted when the resulting file descriptor or stream is closed. */ FILE * fopen_temp (const char *file_name, const char *mode, bool delete_on_close) { FILE *fp; int saved_errno; block_fatal_signals (); /* Note: 'fopen' here is actually fopen() or fopen_safer(). */ #if defined _WIN32 && ! defined __CYGWIN__ /* Use _O_TEMPORARY when possible, to increase the chances that the temporary file is removed when the process crashes. */ if (delete_on_close && supports_delete_on_close ()) { size_t mode_len = strlen (mode); char *augmented_mode = (char *) xmalloca (mode_len + 2); memcpy (augmented_mode, mode, mode_len); memcpy (augmented_mode + mode_len, "D", 2); fp = fopen (file_name, augmented_mode); saved_errno = errno; freea (augmented_mode); } else #endif { fp = fopen (file_name, mode); saved_errno = errno; } if (fp != NULL) { /* It is sufficient to register fileno (fp) instead of the entire fp, because at cleanup time there is no need to do an fflush (fp); a close (fileno (fp)) will be enough. */ int fd = fileno (fp); if (!(fd >= 0)) abort (); register_fd (fd); } unblock_fatal_signals (); errno = saved_errno; return fp; } #if GNULIB_TEMPNAME struct try_create_file_params { int flags; mode_t mode; }; static int try_create_file (char *file_name_tmpl, void *params_) { struct try_create_file_params *params = params_; return open (file_name_tmpl, (params->flags & ~O_ACCMODE) | O_RDWR | O_CREAT | O_EXCL, params->mode); } /* Open a temporary file, generating its name based on FILE_NAME_TMPL. FILE_NAME_TMPL must match the rules for mk[s]temp (i.e. end in "XXXXXX", possibly with a suffix). The name constructed does not exist at the time of the call. FILE_NAME_TMPL is overwritten with the result. A safe choice for MODE is S_IRUSR | S_IWUSR, a.k.a. 0600. Registers the file for deletion. Opens the file, with the given FLAGS and mode MODE. Registers the resulting file descriptor to be closed. */ int gen_register_open_temp (char *file_name_tmpl, int suffixlen, int flags, mode_t mode) { block_fatal_signals (); struct try_create_file_params params; params.flags = flags; params.mode = mode; int fd = try_tempname (file_name_tmpl, suffixlen, ¶ms, try_create_file); int saved_errno = errno; if (fd >= 0) { init_clean_temp (); register_fd (fd); register_temporary_file (file_name_tmpl); } unblock_fatal_signals (); errno = saved_errno; return fd; } #endif /* Close a temporary file. FD must have been returned by open_temp or gen_register_open_temp. Unregisters the previously registered file descriptor. */ int close_temp (int fd) { if (fd < 0) return close (fd); init_fatal_signal_set (); int result = 0; int saved_errno = 0; IF_MT_DECL; IF_MT gl_lock_lock (descriptors_lock); gl_list_t list = descriptors; if (list == NULL) /* descriptors should already contain fd. */ abort (); /* Search through the list, and clean it up on the fly. */ bool found = false; gl_list_iterator_t iter = gl_list_iterator (list); const void *elt; gl_list_node_t node; if (gl_list_iterator_next (&iter, &elt, &node)) for (;;) { struct closeable_fd *element = (struct closeable_fd *) elt; /* Close the file descriptor, avoiding races with the signal handler. */ if (element->fd == fd) { found = true; result = asyncsafe_close (element); saved_errno = errno; } bool free_this_node = element->done; struct closeable_fd *element_to_free = element; gl_list_node_t node_to_free = node; bool have_next = gl_list_iterator_next (&iter, &elt, &node); if (free_this_node) { free (element_to_free); gl_list_remove_node (list, node_to_free); } if (!have_next) break; } gl_list_iterator_free (&iter); if (!found) /* descriptors should already contain fd. */ abort (); IF_MT gl_lock_unlock (descriptors_lock); errno = saved_errno; return result; } static int fclose_variant_temp (FILE *fp, int (*fclose_variant) (FILE *)) { int fd = fileno (fp); init_fatal_signal_set (); int result = 0; int saved_errno = 0; IF_MT_DECL; IF_MT gl_lock_lock (descriptors_lock); gl_list_t list = descriptors; if (list == NULL) /* descriptors should already contain fd. */ abort (); /* Search through the list, and clean it up on the fly. */ bool found = false; gl_list_iterator_t iter = gl_list_iterator (list); const void *elt; gl_list_node_t node; if (gl_list_iterator_next (&iter, &elt, &node)) for (;;) { struct closeable_fd *element = (struct closeable_fd *) elt; /* Close the file descriptor and the stream, avoiding races with the signal handler. */ if (element->fd == fd) { found = true; result = asyncsafe_fclose_variant (element, fp, fclose_variant); saved_errno = errno; } bool free_this_node = element->done; struct closeable_fd *element_to_free = element; gl_list_node_t node_to_free = node; bool have_next = gl_list_iterator_next (&iter, &elt, &node); if (free_this_node) { free (element_to_free); gl_list_remove_node (list, node_to_free); } if (!have_next) break; } gl_list_iterator_free (&iter); if (!found) /* descriptors should have contained fd. */ abort (); IF_MT gl_lock_unlock (descriptors_lock); errno = saved_errno; return result; } /* Close a temporary file. FP must have been returned by fopen_temp, or by fdopen on a file descriptor returned by open_temp or gen_register_open_temp. Unregisters the previously registered file descriptor. */ int fclose_temp (FILE *fp) { return fclose_variant_temp (fp, fclose); } #if GNULIB_FWRITEERROR /* Like fwriteerror. FP must have been returned by fopen_temp, or by fdopen on a file descriptor returned by open_temp or gen_register_open_temp. Unregisters the previously registered file descriptor. */ int fwriteerror_temp (FILE *fp) { return fclose_variant_temp (fp, fwriteerror); } #endif #if GNULIB_CLOSE_STREAM /* Like close_stream. FP must have been returned by fopen_temp, or by fdopen on a file descriptor returned by open_temp or gen_register_open_temp. Unregisters the previously registered file descriptor. */ int close_stream_temp (FILE *fp) { return fclose_variant_temp (fp, close_stream); } #endif pspp-1.4.1/gl/array-mergesort.h0000644000175000017500000001736013723215636016030 0ustar00blpblp00000000000000/* Stable-sorting of an array using mergesort. Copyright (C) 2009-2020 Free Software Foundation, Inc. Written by Bruno Haible , 2009. 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 3 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, see . */ /* This file implements stable sorting of an array, using the mergesort algorithm. Worst-case running time for an array of length N is O(N log N). Unlike the mpsort module, the algorithm here attempts to minimize not only the number of comparisons, but also the number of copying operations. Before including this file, you need to define ELEMENT The type of every array element. COMPARE A two-argument macro that takes two 'const ELEMENT *' pointers and returns a negative, zero, or positive 'int' value if the element pointed to by the first argument is, respectively, less, equal, or greater than the element pointed to by the second argument. STATIC The storage class of the functions being defined. STATIC_FROMTO (Optional.) Overrides STATIC for the 'merge_sort_fromto' function. Before including this file, you also need to include: #include */ /* Merge the sorted arrays src1[0..n1-1] and src2[0..n2-1] into dst[0..n1+n2-1]. In case of ambiguity, put the elements of src1 before the elements of src2. n1 and n2 must be > 0. The arrays src1 and src2 must not overlap the dst array, except that src1 may be dst[n2..n1+n2-1], or src2 may be dst[n1..n1+n2-1]. */ static void merge (const ELEMENT *src1, size_t n1, const ELEMENT *src2, size_t n2, ELEMENT *dst) { for (;;) /* while (n1 > 0 && n2 > 0) */ { if (COMPARE (src1, src2) <= 0) { *dst++ = *src1++; n1--; if (n1 == 0) break; } else { *dst++ = *src2++; n2--; if (n2 == 0) break; } } /* Here n1 == 0 || n2 == 0 but also n1 > 0 || n2 > 0. */ if (n1 > 0) { if (dst != src1) do { *dst++ = *src1++; n1--; } while (n1 > 0); } else /* n2 > 0 */ { if (dst != src2) do { *dst++ = *src2++; n2--; } while (n2 > 0); } } /* Sort src[0..n-1] into dst[0..n-1], using tmp[0..n/2-1] as temporary (scratch) storage. The arrays src, dst, tmp must not overlap. */ #ifdef STATIC_FROMTO STATIC_FROMTO #else STATIC #endif void merge_sort_fromto (const ELEMENT *src, ELEMENT *dst, size_t n, ELEMENT *tmp) { switch (n) { case 0: return; case 1: /* Nothing to do. */ dst[0] = src[0]; return; case 2: /* Trivial case. */ if (COMPARE (&src[0], &src[1]) <= 0) { /* src[0] <= src[1] */ dst[0] = src[0]; dst[1] = src[1]; } else { dst[0] = src[1]; dst[1] = src[0]; } break; case 3: /* Simple case. */ if (COMPARE (&src[0], &src[1]) <= 0) { if (COMPARE (&src[1], &src[2]) <= 0) { /* src[0] <= src[1] <= src[2] */ dst[0] = src[0]; dst[1] = src[1]; dst[2] = src[2]; } else if (COMPARE (&src[0], &src[2]) <= 0) { /* src[0] <= src[2] < src[1] */ dst[0] = src[0]; dst[1] = src[2]; dst[2] = src[1]; } else { /* src[2] < src[0] <= src[1] */ dst[0] = src[2]; dst[1] = src[0]; dst[2] = src[1]; } } else { if (COMPARE (&src[0], &src[2]) <= 0) { /* src[1] < src[0] <= src[2] */ dst[0] = src[1]; dst[1] = src[0]; dst[2] = src[2]; } else if (COMPARE (&src[1], &src[2]) <= 0) { /* src[1] <= src[2] < src[0] */ dst[0] = src[1]; dst[1] = src[2]; dst[2] = src[0]; } else { /* src[2] < src[1] < src[0] */ dst[0] = src[2]; dst[1] = src[1]; dst[2] = src[0]; } } break; default: { size_t n1 = n / 2; size_t n2 = (n + 1) / 2; /* Note: n1 + n2 = n, n1 <= n2. */ /* Sort src[n1..n-1] into dst[n1..n-1], scratching tmp[0..n2/2-1]. */ merge_sort_fromto (src + n1, dst + n1, n2, tmp); /* Sort src[0..n1-1] into tmp[0..n1-1], scratching dst[0..n1-1]. */ merge_sort_fromto (src, tmp, n1, dst); /* Merge the two half results. */ merge (tmp, n1, dst + n1, n2, dst); } break; } } /* Sort src[0..n-1], using tmp[0..n-1] as temporary (scratch) storage. The arrays src, tmp must not overlap. */ STATIC void merge_sort_inplace (ELEMENT *src, size_t n, ELEMENT *tmp) { switch (n) { case 0: case 1: /* Nothing to do. */ return; case 2: /* Trivial case. */ if (COMPARE (&src[0], &src[1]) <= 0) { /* src[0] <= src[1] */ } else { ELEMENT t = src[0]; src[0] = src[1]; src[1] = t; } break; case 3: /* Simple case. */ if (COMPARE (&src[0], &src[1]) <= 0) { if (COMPARE (&src[1], &src[2]) <= 0) { /* src[0] <= src[1] <= src[2] */ } else if (COMPARE (&src[0], &src[2]) <= 0) { /* src[0] <= src[2] < src[1] */ ELEMENT t = src[1]; src[1] = src[2]; src[2] = t; } else { /* src[2] < src[0] <= src[1] */ ELEMENT t = src[0]; src[0] = src[2]; src[2] = src[1]; src[1] = t; } } else { if (COMPARE (&src[0], &src[2]) <= 0) { /* src[1] < src[0] <= src[2] */ ELEMENT t = src[0]; src[0] = src[1]; src[1] = t; } else if (COMPARE (&src[1], &src[2]) <= 0) { /* src[1] <= src[2] < src[0] */ ELEMENT t = src[0]; src[0] = src[1]; src[1] = src[2]; src[2] = t; } else { /* src[2] < src[1] < src[0] */ ELEMENT t = src[0]; src[0] = src[2]; src[2] = t; } } break; default: { size_t n1 = n / 2; size_t n2 = (n + 1) / 2; /* Note: n1 + n2 = n, n1 <= n2. */ /* Sort src[n1..n-1], scratching tmp[0..n2-1]. */ merge_sort_inplace (src + n1, n2, tmp); /* Sort src[0..n1-1] into tmp[0..n1-1], scratching tmp[n1..2*n1-1]. */ merge_sort_fromto (src, tmp, n1, tmp + n1); /* Merge the two half results. */ merge (tmp, n1, src + n1, n2, src); } break; } } #undef ELEMENT #undef COMPARE #undef STATIC pspp-1.4.1/gl/fseek.c0000644000175000017500000000203613723215636013767 0ustar00blpblp00000000000000/* An fseek() function that, together with fflush(), is POSIX compliant. Copyright (C) 2007, 2009-2020 Free Software Foundation, Inc. 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 3 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, see . */ #include /* Specification. */ #include /* Get off_t. */ #include int fseek (FILE *fp, long offset, int whence) { /* Use the replacement fseeko function with all its workarounds. */ return fseeko (fp, (off_t)offset, whence); } pspp-1.4.1/gl/windows-recmutex.h0000644000175000017500000000363413723215640016223 0ustar00blpblp00000000000000/* Plain recursive mutexes (native Windows implementation). Copyright (C) 2005-2020 Free Software Foundation, Inc. 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 3, 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, see . */ /* Written by Bruno Haible , 2005. Based on GCC's gthr-win32.h. */ #ifndef _WINDOWS_RECMUTEX_H #define _WINDOWS_RECMUTEX_H #define WIN32_LEAN_AND_MEAN /* avoid including junk */ #include #include "windows-initguard.h" /* The native Windows documentation says that CRITICAL_SECTION already implements a recursive lock. But we need not rely on it: It's easy to implement a recursive lock without this assumption. */ typedef struct { glwthread_initguard_t guard; /* protects the initialization */ DWORD owner; unsigned long depth; CRITICAL_SECTION lock; } glwthread_recmutex_t; #define GLWTHREAD_RECMUTEX_INIT { GLWTHREAD_INITGUARD_INIT, 0, 0 } #ifdef __cplusplus extern "C" { #endif extern void glwthread_recmutex_init (glwthread_recmutex_t *mutex); extern int glwthread_recmutex_lock (glwthread_recmutex_t *mutex); extern int glwthread_recmutex_trylock (glwthread_recmutex_t *mutex); extern int glwthread_recmutex_unlock (glwthread_recmutex_t *mutex); extern int glwthread_recmutex_destroy (glwthread_recmutex_t *mutex); #ifdef __cplusplus } #endif #endif /* _WINDOWS_RECMUTEX_H */ pspp-1.4.1/gl/stat-w32.h0000644000175000017500000000306613723215640014262 0ustar00blpblp00000000000000/* Core of implementation of fstat and stat for native Windows. Copyright (C) 2017-2020 Free Software Foundation, Inc. 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 3 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, see . */ #ifndef _STAT_W32_H #define _STAT_W32_H 1 /* Converts a FILETIME to GMT time since 1970-01-01 00:00:00. */ #if _GL_WINDOWS_STAT_TIMESPEC extern struct timespec _gl_convert_FILETIME_to_timespec (const FILETIME *ft); #else extern time_t _gl_convert_FILETIME_to_POSIX (const FILETIME *ft); #endif /* Fill *BUF with information about the file designated by H. PATH is the file name, if known, otherwise NULL. Return 0 if successful, or -1 with errno set upon failure. */ extern int _gl_fstat_by_handle (HANDLE h, const char *path, struct stat *buf); /* Bitmasks for st_mode. */ #define S_IREAD_UGO (_S_IREAD | (_S_IREAD >> 3) | (_S_IREAD >> 6)) #define S_IWRITE_UGO (_S_IWRITE | (_S_IWRITE >> 3) | (_S_IWRITE >> 6)) #define S_IEXEC_UGO (_S_IEXEC | (_S_IEXEC >> 3) | (_S_IEXEC >> 6)) #endif /* _STAT_W32_H */ pspp-1.4.1/gl/version-etc.h0000644000175000017500000000520513723215640015131 0ustar00blpblp00000000000000/* Print --version and bug-reporting information in a consistent format. Copyright (C) 1999, 2003, 2005, 2009-2020 Free Software Foundation, Inc. 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 3 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, see . */ /* Written by Jim Meyering. */ #ifndef VERSION_ETC_H # define VERSION_ETC_H 1 # include # include extern const char version_etc_copyright[]; /* The three functions below display the --version information in the standard way: command and package names, package version, followed by a short GPLv3+ notice and a list of up to 10 author names. If COMMAND_NAME is NULL, the PACKAGE is assumed to be the name of the program. The formats are therefore: PACKAGE VERSION or COMMAND_NAME (PACKAGE) VERSION. The functions differ in the way they are passed author names: */ /* N_AUTHORS names are supplied in array AUTHORS. */ extern void version_etc_arn (FILE *stream, const char *command_name, const char *package, const char *version, const char * const * authors, size_t n_authors); /* Names are passed in the NULL-terminated array AUTHORS. */ extern void version_etc_ar (FILE *stream, const char *command_name, const char *package, const char *version, const char * const * authors); /* Names are passed in the NULL-terminated va_list. */ extern void version_etc_va (FILE *stream, const char *command_name, const char *package, const char *version, va_list authors); /* Names are passed as separate arguments, with an additional NULL argument at the end. */ extern void version_etc (FILE *stream, const char *command_name, const char *package, const char *version, /* const char *author1, ..., NULL */ ...) _GL_ATTRIBUTE_SENTINEL (); /* Display the usual "Report bugs to" stanza. */ extern void emit_bug_reporting_address (void); #endif /* VERSION_ETC_H */ pspp-1.4.1/gl/unistr.in.h0000644000175000017500000005564613723215640014642 0ustar00blpblp00000000000000/* Elementary Unicode string functions. Copyright (C) 2001-2002, 2005-2020 Free Software Foundation, Inc. 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 3 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, see . */ #ifndef _UNISTR_H #define _UNISTR_H #include "unitypes.h" /* Get common macros for C. */ #include "unused-parameter.h" /* Get bool. */ #include /* Get size_t. */ #include #ifdef __cplusplus extern "C" { #endif /* Conventions: All functions prefixed with u8_ operate on UTF-8 encoded strings. Their unit is an uint8_t (1 byte). All functions prefixed with u16_ operate on UTF-16 encoded strings. Their unit is an uint16_t (a 2-byte word). All functions prefixed with u32_ operate on UCS-4 encoded strings. Their unit is an uint32_t (a 4-byte word). All argument pairs (s, n) denote a Unicode string s[0..n-1] with exactly n units. All arguments starting with "str" and the arguments of functions starting with u8_str/u16_str/u32_str denote a NUL terminated string, i.e. a string which terminates at the first NUL unit. This termination unit is considered part of the string for all memory allocation purposes, but is not considered part of the string for all other logical purposes. Functions returning a string result take a (resultbuf, lengthp) argument pair. If resultbuf is not NULL and the result fits into *lengthp units, it is put in resultbuf, and resultbuf is returned. Otherwise, a freshly allocated string is returned. In both cases, *lengthp is set to the length (number of units) of the returned string. In case of error, NULL is returned and errno is set. */ /* Elementary string checks. */ /* Check whether an UTF-8 string is well-formed. Return NULL if valid, or a pointer to the first invalid unit otherwise. */ extern const uint8_t * u8_check (const uint8_t *s, size_t n) _UC_ATTRIBUTE_PURE; /* Check whether an UTF-16 string is well-formed. Return NULL if valid, or a pointer to the first invalid unit otherwise. */ extern const uint16_t * u16_check (const uint16_t *s, size_t n) _UC_ATTRIBUTE_PURE; /* Check whether an UCS-4 string is well-formed. Return NULL if valid, or a pointer to the first invalid unit otherwise. */ extern const uint32_t * u32_check (const uint32_t *s, size_t n) _UC_ATTRIBUTE_PURE; /* Elementary string conversions. */ /* Convert an UTF-8 string to an UTF-16 string. */ extern uint16_t * u8_to_u16 (const uint8_t *s, size_t n, uint16_t *resultbuf, size_t *lengthp); /* Convert an UTF-8 string to an UCS-4 string. */ extern uint32_t * u8_to_u32 (const uint8_t *s, size_t n, uint32_t *resultbuf, size_t *lengthp); /* Convert an UTF-16 string to an UTF-8 string. */ extern uint8_t * u16_to_u8 (const uint16_t *s, size_t n, uint8_t *resultbuf, size_t *lengthp); /* Convert an UTF-16 string to an UCS-4 string. */ extern uint32_t * u16_to_u32 (const uint16_t *s, size_t n, uint32_t *resultbuf, size_t *lengthp); /* Convert an UCS-4 string to an UTF-8 string. */ extern uint8_t * u32_to_u8 (const uint32_t *s, size_t n, uint8_t *resultbuf, size_t *lengthp); /* Convert an UCS-4 string to an UTF-16 string. */ extern uint16_t * u32_to_u16 (const uint32_t *s, size_t n, uint16_t *resultbuf, size_t *lengthp); /* Elementary string functions. */ /* Return the length (number of units) of the first character in S, which is no longer than N. Return 0 if it is the NUL character. Return -1 upon failure. */ /* Similar to mblen(), except that s must not be NULL. */ extern int u8_mblen (const uint8_t *s, size_t n) _UC_ATTRIBUTE_PURE; extern int u16_mblen (const uint16_t *s, size_t n) _UC_ATTRIBUTE_PURE; extern int u32_mblen (const uint32_t *s, size_t n) _UC_ATTRIBUTE_PURE; /* Return the length (number of units) of the first character in S, putting its 'ucs4_t' representation in *PUC. Upon failure, *PUC is set to 0xfffd, and an appropriate number of units is returned. The number of available units, N, must be > 0. */ /* Similar to mbtowc(), except that puc and s must not be NULL, n must be > 0, and the NUL character is not treated specially. */ /* The variants with _unsafe suffix are for backward compatibility with libunistring versions < 0.9.7. */ #if GNULIB_UNISTR_U8_MBTOUC_UNSAFE || HAVE_LIBUNISTRING # if !HAVE_INLINE extern int u8_mbtouc_unsafe (ucs4_t *puc, const uint8_t *s, size_t n); # else extern int u8_mbtouc_unsafe_aux (ucs4_t *puc, const uint8_t *s, size_t n); static inline int u8_mbtouc_unsafe (ucs4_t *puc, const uint8_t *s, size_t n) { uint8_t c = *s; if (c < 0x80) { *puc = c; return 1; } else return u8_mbtouc_unsafe_aux (puc, s, n); } # endif #endif #if GNULIB_UNISTR_U16_MBTOUC_UNSAFE || HAVE_LIBUNISTRING # if !HAVE_INLINE extern int u16_mbtouc_unsafe (ucs4_t *puc, const uint16_t *s, size_t n); # else extern int u16_mbtouc_unsafe_aux (ucs4_t *puc, const uint16_t *s, size_t n); static inline int u16_mbtouc_unsafe (ucs4_t *puc, const uint16_t *s, size_t n) { uint16_t c = *s; if (c < 0xd800 || c >= 0xe000) { *puc = c; return 1; } else return u16_mbtouc_unsafe_aux (puc, s, n); } # endif #endif #if GNULIB_UNISTR_U32_MBTOUC_UNSAFE || HAVE_LIBUNISTRING # if !HAVE_INLINE extern int u32_mbtouc_unsafe (ucs4_t *puc, const uint32_t *s, size_t n); # else static inline int u32_mbtouc_unsafe (ucs4_t *puc, const uint32_t *s, size_t n _GL_UNUSED_PARAMETER) { uint32_t c = *s; if (c < 0xd800 || (c >= 0xe000 && c < 0x110000)) *puc = c; else /* invalid multibyte character */ *puc = 0xfffd; return 1; } # endif #endif #if GNULIB_UNISTR_U8_MBTOUC || HAVE_LIBUNISTRING # if !HAVE_INLINE extern int u8_mbtouc (ucs4_t *puc, const uint8_t *s, size_t n); # else extern int u8_mbtouc_aux (ucs4_t *puc, const uint8_t *s, size_t n); static inline int u8_mbtouc (ucs4_t *puc, const uint8_t *s, size_t n) { uint8_t c = *s; if (c < 0x80) { *puc = c; return 1; } else return u8_mbtouc_aux (puc, s, n); } # endif #endif #if GNULIB_UNISTR_U16_MBTOUC || HAVE_LIBUNISTRING # if !HAVE_INLINE extern int u16_mbtouc (ucs4_t *puc, const uint16_t *s, size_t n); # else extern int u16_mbtouc_aux (ucs4_t *puc, const uint16_t *s, size_t n); static inline int u16_mbtouc (ucs4_t *puc, const uint16_t *s, size_t n) { uint16_t c = *s; if (c < 0xd800 || c >= 0xe000) { *puc = c; return 1; } else return u16_mbtouc_aux (puc, s, n); } # endif #endif #if GNULIB_UNISTR_U32_MBTOUC || HAVE_LIBUNISTRING # if !HAVE_INLINE extern int u32_mbtouc (ucs4_t *puc, const uint32_t *s, size_t n); # else static inline int u32_mbtouc (ucs4_t *puc, const uint32_t *s, size_t n _GL_UNUSED_PARAMETER) { uint32_t c = *s; if (c < 0xd800 || (c >= 0xe000 && c < 0x110000)) *puc = c; else /* invalid multibyte character */ *puc = 0xfffd; return 1; } # endif #endif /* Return the length (number of units) of the first character in S, putting its 'ucs4_t' representation in *PUC. Upon failure, *PUC is set to 0xfffd, and -1 is returned for an invalid sequence of units, -2 is returned for an incomplete sequence of units. The number of available units, N, must be > 0. */ /* Similar to u*_mbtouc(), except that the return value gives more details about the failure, similar to mbrtowc(). */ #if GNULIB_UNISTR_U8_MBTOUCR || HAVE_LIBUNISTRING extern int u8_mbtoucr (ucs4_t *puc, const uint8_t *s, size_t n); #endif #if GNULIB_UNISTR_U16_MBTOUCR || HAVE_LIBUNISTRING extern int u16_mbtoucr (ucs4_t *puc, const uint16_t *s, size_t n); #endif #if GNULIB_UNISTR_U32_MBTOUCR || HAVE_LIBUNISTRING extern int u32_mbtoucr (ucs4_t *puc, const uint32_t *s, size_t n); #endif /* Put the multibyte character represented by UC in S, returning its length. Return -1 upon failure, -2 if the number of available units, N, is too small. The latter case cannot occur if N >= 6/2/1, respectively. */ /* Similar to wctomb(), except that s must not be NULL, and the argument n must be specified. */ #if GNULIB_UNISTR_U8_UCTOMB || HAVE_LIBUNISTRING /* Auxiliary function, also used by u8_chr, u8_strchr, u8_strrchr. */ extern int u8_uctomb_aux (uint8_t *s, ucs4_t uc, int n); # if !HAVE_INLINE extern int u8_uctomb (uint8_t *s, ucs4_t uc, int n); # else static inline int u8_uctomb (uint8_t *s, ucs4_t uc, int n) { if (uc < 0x80 && n > 0) { s[0] = uc; return 1; } else return u8_uctomb_aux (s, uc, n); } # endif #endif #if GNULIB_UNISTR_U16_UCTOMB || HAVE_LIBUNISTRING /* Auxiliary function, also used by u16_chr, u16_strchr, u16_strrchr. */ extern int u16_uctomb_aux (uint16_t *s, ucs4_t uc, int n); # if !HAVE_INLINE extern int u16_uctomb (uint16_t *s, ucs4_t uc, int n); # else static inline int u16_uctomb (uint16_t *s, ucs4_t uc, int n) { if (uc < 0xd800 && n > 0) { s[0] = uc; return 1; } else return u16_uctomb_aux (s, uc, n); } # endif #endif #if GNULIB_UNISTR_U32_UCTOMB || HAVE_LIBUNISTRING # if !HAVE_INLINE extern int u32_uctomb (uint32_t *s, ucs4_t uc, int n); # else static inline int u32_uctomb (uint32_t *s, ucs4_t uc, int n) { if (uc < 0xd800 || (uc >= 0xe000 && uc < 0x110000)) { if (n > 0) { *s = uc; return 1; } else return -2; } else return -1; } # endif #endif /* Copy N units from SRC to DEST. */ /* Similar to memcpy(). */ extern uint8_t * u8_cpy (uint8_t *_UC_RESTRICT dest, const uint8_t *src, size_t n); extern uint16_t * u16_cpy (uint16_t *_UC_RESTRICT dest, const uint16_t *src, size_t n); extern uint32_t * u32_cpy (uint32_t *_UC_RESTRICT dest, const uint32_t *src, size_t n); /* Copy N units from SRC to DEST, guaranteeing correct behavior for overlapping memory areas. */ /* Similar to memmove(). */ extern uint8_t * u8_move (uint8_t *dest, const uint8_t *src, size_t n); extern uint16_t * u16_move (uint16_t *dest, const uint16_t *src, size_t n); extern uint32_t * u32_move (uint32_t *dest, const uint32_t *src, size_t n); /* Set the first N characters of S to UC. UC should be a character that occupies only 1 unit. */ /* Similar to memset(). */ extern uint8_t * u8_set (uint8_t *s, ucs4_t uc, size_t n); extern uint16_t * u16_set (uint16_t *s, ucs4_t uc, size_t n); extern uint32_t * u32_set (uint32_t *s, ucs4_t uc, size_t n); /* Compare S1 and S2, each of length N. */ /* Similar to memcmp(). */ extern int u8_cmp (const uint8_t *s1, const uint8_t *s2, size_t n) _UC_ATTRIBUTE_PURE; extern int u16_cmp (const uint16_t *s1, const uint16_t *s2, size_t n) _UC_ATTRIBUTE_PURE; extern int u32_cmp (const uint32_t *s1, const uint32_t *s2, size_t n) _UC_ATTRIBUTE_PURE; /* Compare S1 and S2. */ /* Similar to the gnulib function memcmp2(). */ extern int u8_cmp2 (const uint8_t *s1, size_t n1, const uint8_t *s2, size_t n2) _UC_ATTRIBUTE_PURE; extern int u16_cmp2 (const uint16_t *s1, size_t n1, const uint16_t *s2, size_t n2) _UC_ATTRIBUTE_PURE; extern int u32_cmp2 (const uint32_t *s1, size_t n1, const uint32_t *s2, size_t n2) _UC_ATTRIBUTE_PURE; /* Search the string at S for UC. */ /* Similar to memchr(). */ extern uint8_t * u8_chr (const uint8_t *s, size_t n, ucs4_t uc) _UC_ATTRIBUTE_PURE; extern uint16_t * u16_chr (const uint16_t *s, size_t n, ucs4_t uc) _UC_ATTRIBUTE_PURE; extern uint32_t * u32_chr (const uint32_t *s, size_t n, ucs4_t uc) _UC_ATTRIBUTE_PURE; /* Count the number of Unicode characters in the N units from S. */ /* Similar to mbsnlen(). */ extern size_t u8_mbsnlen (const uint8_t *s, size_t n) _UC_ATTRIBUTE_PURE; extern size_t u16_mbsnlen (const uint16_t *s, size_t n) _UC_ATTRIBUTE_PURE; extern size_t u32_mbsnlen (const uint32_t *s, size_t n) _UC_ATTRIBUTE_PURE; /* Elementary string functions with memory allocation. */ /* Make a freshly allocated copy of S, of length N. */ extern uint8_t * u8_cpy_alloc (const uint8_t *s, size_t n); extern uint16_t * u16_cpy_alloc (const uint16_t *s, size_t n); extern uint32_t * u32_cpy_alloc (const uint32_t *s, size_t n); /* Elementary string functions on NUL terminated strings. */ /* Return the length (number of units) of the first character in S. Return 0 if it is the NUL character. Return -1 upon failure. */ extern int u8_strmblen (const uint8_t *s) _UC_ATTRIBUTE_PURE; extern int u16_strmblen (const uint16_t *s) _UC_ATTRIBUTE_PURE; extern int u32_strmblen (const uint32_t *s) _UC_ATTRIBUTE_PURE; /* Return the length (number of units) of the first character in S, putting its 'ucs4_t' representation in *PUC. Return 0 if it is the NUL character. Return -1 upon failure. */ extern int u8_strmbtouc (ucs4_t *puc, const uint8_t *s); extern int u16_strmbtouc (ucs4_t *puc, const uint16_t *s); extern int u32_strmbtouc (ucs4_t *puc, const uint32_t *s); /* Forward iteration step. Advances the pointer past the next character, or returns NULL if the end of the string has been reached. Puts the character's 'ucs4_t' representation in *PUC. */ extern const uint8_t * u8_next (ucs4_t *puc, const uint8_t *s); extern const uint16_t * u16_next (ucs4_t *puc, const uint16_t *s); extern const uint32_t * u32_next (ucs4_t *puc, const uint32_t *s); /* Backward iteration step. Advances the pointer to point to the previous character, or returns NULL if the beginning of the string had been reached. Puts the character's 'ucs4_t' representation in *PUC. */ extern const uint8_t * u8_prev (ucs4_t *puc, const uint8_t *s, const uint8_t *start); extern const uint16_t * u16_prev (ucs4_t *puc, const uint16_t *s, const uint16_t *start); extern const uint32_t * u32_prev (ucs4_t *puc, const uint32_t *s, const uint32_t *start); /* Return the number of units in S. */ /* Similar to strlen(), wcslen(). */ extern size_t u8_strlen (const uint8_t *s) _UC_ATTRIBUTE_PURE; extern size_t u16_strlen (const uint16_t *s) _UC_ATTRIBUTE_PURE; extern size_t u32_strlen (const uint32_t *s) _UC_ATTRIBUTE_PURE; /* Return the number of units in S, but at most MAXLEN. */ /* Similar to strnlen(), wcsnlen(). */ extern size_t u8_strnlen (const uint8_t *s, size_t maxlen) _UC_ATTRIBUTE_PURE; extern size_t u16_strnlen (const uint16_t *s, size_t maxlen) _UC_ATTRIBUTE_PURE; extern size_t u32_strnlen (const uint32_t *s, size_t maxlen) _UC_ATTRIBUTE_PURE; /* Copy SRC to DEST. */ /* Similar to strcpy(), wcscpy(). */ extern uint8_t * u8_strcpy (uint8_t *_UC_RESTRICT dest, const uint8_t *src); extern uint16_t * u16_strcpy (uint16_t *_UC_RESTRICT dest, const uint16_t *src); extern uint32_t * u32_strcpy (uint32_t *_UC_RESTRICT dest, const uint32_t *src); /* Copy SRC to DEST, returning the address of the terminating NUL in DEST. */ /* Similar to stpcpy(). */ extern uint8_t * u8_stpcpy (uint8_t *_UC_RESTRICT dest, const uint8_t *src); extern uint16_t * u16_stpcpy (uint16_t *_UC_RESTRICT dest, const uint16_t *src); extern uint32_t * u32_stpcpy (uint32_t *_UC_RESTRICT dest, const uint32_t *src); /* Copy no more than N units of SRC to DEST. */ /* Similar to strncpy(), wcsncpy(). */ extern uint8_t * u8_strncpy (uint8_t *_UC_RESTRICT dest, const uint8_t *src, size_t n); extern uint16_t * u16_strncpy (uint16_t *_UC_RESTRICT dest, const uint16_t *src, size_t n); extern uint32_t * u32_strncpy (uint32_t *_UC_RESTRICT dest, const uint32_t *src, size_t n); /* Copy no more than N units of SRC to DEST. Return a pointer past the last non-NUL unit written into DEST. */ /* Similar to stpncpy(). */ extern uint8_t * u8_stpncpy (uint8_t *_UC_RESTRICT dest, const uint8_t *src, size_t n); extern uint16_t * u16_stpncpy (uint16_t *_UC_RESTRICT dest, const uint16_t *src, size_t n); extern uint32_t * u32_stpncpy (uint32_t *_UC_RESTRICT dest, const uint32_t *src, size_t n); /* Append SRC onto DEST. */ /* Similar to strcat(), wcscat(). */ extern uint8_t * u8_strcat (uint8_t *_UC_RESTRICT dest, const uint8_t *src); extern uint16_t * u16_strcat (uint16_t *_UC_RESTRICT dest, const uint16_t *src); extern uint32_t * u32_strcat (uint32_t *_UC_RESTRICT dest, const uint32_t *src); /* Append no more than N units of SRC onto DEST. */ /* Similar to strncat(), wcsncat(). */ extern uint8_t * u8_strncat (uint8_t *_UC_RESTRICT dest, const uint8_t *src, size_t n); extern uint16_t * u16_strncat (uint16_t *_UC_RESTRICT dest, const uint16_t *src, size_t n); extern uint32_t * u32_strncat (uint32_t *_UC_RESTRICT dest, const uint32_t *src, size_t n); /* Compare S1 and S2. */ /* Similar to strcmp(), wcscmp(). */ #ifdef __sun /* Avoid a collision with the u8_strcmp() function in Solaris 11 libc. */ extern int u8_strcmp_gnu (const uint8_t *s1, const uint8_t *s2) _UC_ATTRIBUTE_PURE; # define u8_strcmp u8_strcmp_gnu #else extern int u8_strcmp (const uint8_t *s1, const uint8_t *s2) _UC_ATTRIBUTE_PURE; #endif extern int u16_strcmp (const uint16_t *s1, const uint16_t *s2) _UC_ATTRIBUTE_PURE; extern int u32_strcmp (const uint32_t *s1, const uint32_t *s2) _UC_ATTRIBUTE_PURE; /* Compare S1 and S2 using the collation rules of the current locale. Return -1 if S1 < S2, 0 if S1 = S2, 1 if S1 > S2. Upon failure, set errno and return any value. */ /* Similar to strcoll(), wcscoll(). */ extern int u8_strcoll (const uint8_t *s1, const uint8_t *s2); extern int u16_strcoll (const uint16_t *s1, const uint16_t *s2); extern int u32_strcoll (const uint32_t *s1, const uint32_t *s2); /* Compare no more than N units of S1 and S2. */ /* Similar to strncmp(), wcsncmp(). */ extern int u8_strncmp (const uint8_t *s1, const uint8_t *s2, size_t n) _UC_ATTRIBUTE_PURE; extern int u16_strncmp (const uint16_t *s1, const uint16_t *s2, size_t n) _UC_ATTRIBUTE_PURE; extern int u32_strncmp (const uint32_t *s1, const uint32_t *s2, size_t n) _UC_ATTRIBUTE_PURE; /* Duplicate S, returning an identical malloc'd string. */ /* Similar to strdup(), wcsdup(). */ extern uint8_t * u8_strdup (const uint8_t *s); extern uint16_t * u16_strdup (const uint16_t *s); extern uint32_t * u32_strdup (const uint32_t *s); /* Find the first occurrence of UC in STR. */ /* Similar to strchr(), wcschr(). */ extern uint8_t * u8_strchr (const uint8_t *str, ucs4_t uc) _UC_ATTRIBUTE_PURE; extern uint16_t * u16_strchr (const uint16_t *str, ucs4_t uc) _UC_ATTRIBUTE_PURE; extern uint32_t * u32_strchr (const uint32_t *str, ucs4_t uc) _UC_ATTRIBUTE_PURE; /* Find the last occurrence of UC in STR. */ /* Similar to strrchr(), wcsrchr(). */ extern uint8_t * u8_strrchr (const uint8_t *str, ucs4_t uc) _UC_ATTRIBUTE_PURE; extern uint16_t * u16_strrchr (const uint16_t *str, ucs4_t uc) _UC_ATTRIBUTE_PURE; extern uint32_t * u32_strrchr (const uint32_t *str, ucs4_t uc) _UC_ATTRIBUTE_PURE; /* Return the length of the initial segment of STR which consists entirely of Unicode characters not in REJECT. */ /* Similar to strcspn(), wcscspn(). */ extern size_t u8_strcspn (const uint8_t *str, const uint8_t *reject) _UC_ATTRIBUTE_PURE; extern size_t u16_strcspn (const uint16_t *str, const uint16_t *reject) _UC_ATTRIBUTE_PURE; extern size_t u32_strcspn (const uint32_t *str, const uint32_t *reject) _UC_ATTRIBUTE_PURE; /* Return the length of the initial segment of STR which consists entirely of Unicode characters in ACCEPT. */ /* Similar to strspn(), wcsspn(). */ extern size_t u8_strspn (const uint8_t *str, const uint8_t *accept) _UC_ATTRIBUTE_PURE; extern size_t u16_strspn (const uint16_t *str, const uint16_t *accept) _UC_ATTRIBUTE_PURE; extern size_t u32_strspn (const uint32_t *str, const uint32_t *accept) _UC_ATTRIBUTE_PURE; /* Find the first occurrence in STR of any character in ACCEPT. */ /* Similar to strpbrk(), wcspbrk(). */ extern uint8_t * u8_strpbrk (const uint8_t *str, const uint8_t *accept) _UC_ATTRIBUTE_PURE; extern uint16_t * u16_strpbrk (const uint16_t *str, const uint16_t *accept) _UC_ATTRIBUTE_PURE; extern uint32_t * u32_strpbrk (const uint32_t *str, const uint32_t *accept) _UC_ATTRIBUTE_PURE; /* Find the first occurrence of NEEDLE in HAYSTACK. */ /* Similar to strstr(), wcsstr(). */ extern uint8_t * u8_strstr (const uint8_t *haystack, const uint8_t *needle) _UC_ATTRIBUTE_PURE; extern uint16_t * u16_strstr (const uint16_t *haystack, const uint16_t *needle) _UC_ATTRIBUTE_PURE; extern uint32_t * u32_strstr (const uint32_t *haystack, const uint32_t *needle) _UC_ATTRIBUTE_PURE; /* Test whether STR starts with PREFIX. */ extern bool u8_startswith (const uint8_t *str, const uint8_t *prefix) _UC_ATTRIBUTE_PURE; extern bool u16_startswith (const uint16_t *str, const uint16_t *prefix) _UC_ATTRIBUTE_PURE; extern bool u32_startswith (const uint32_t *str, const uint32_t *prefix) _UC_ATTRIBUTE_PURE; /* Test whether STR ends with SUFFIX. */ extern bool u8_endswith (const uint8_t *str, const uint8_t *suffix) _UC_ATTRIBUTE_PURE; extern bool u16_endswith (const uint16_t *str, const uint16_t *suffix) _UC_ATTRIBUTE_PURE; extern bool u32_endswith (const uint32_t *str, const uint32_t *suffix) _UC_ATTRIBUTE_PURE; /* Divide STR into tokens separated by characters in DELIM. This interface is actually more similar to wcstok than to strtok. */ /* Similar to strtok_r(), wcstok(). */ extern uint8_t * u8_strtok (uint8_t *_UC_RESTRICT str, const uint8_t *delim, uint8_t **ptr); extern uint16_t * u16_strtok (uint16_t *_UC_RESTRICT str, const uint16_t *delim, uint16_t **ptr); extern uint32_t * u32_strtok (uint32_t *_UC_RESTRICT str, const uint32_t *delim, uint32_t **ptr); #ifdef __cplusplus } #endif #endif /* _UNISTR_H */ pspp-1.4.1/gl/time_rz.c0000644000175000017500000002174713723215640014350 0ustar00blpblp00000000000000/* Time zone functions such as tzalloc and localtime_rz Copyright 2015-2020 Free Software Foundation, Inc. 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 3, 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, see . */ /* Written by Paul Eggert. */ /* Although this module is not thread-safe, any races should be fairly rare and reasonably benign. For complete thread-safety, use a C library with a working timezone_t type, so that this module is not needed. */ #include #include #include #include #include #include #include #include #include "flexmember.h" #include "time-internal.h" #ifndef SIZE_MAX # define SIZE_MAX ((size_t) -1) #endif /* The approximate size to use for small allocation requests. This is the largest "small" request for the GNU C library malloc. */ enum { DEFAULT_MXFAST = 64 * sizeof (size_t) / 4 }; /* Minimum size of the ABBRS member of struct tm_zone. ABBRS is larger only in the unlikely case where an abbreviation longer than this is used. */ enum { ABBR_SIZE_MIN = DEFAULT_MXFAST - offsetof (struct tm_zone, abbrs) }; /* Magic cookie timezone_t value, for local time. It differs from NULL and from all other timezone_t values. Only the address matters; the pointer is never dereferenced. */ static timezone_t const local_tz = (timezone_t) 1; #if HAVE_TM_ZONE || HAVE_TZNAME /* Return true if the values A and B differ according to the rules for tm_isdst: A and B differ if one is zero and the other positive. */ static bool isdst_differ (int a, int b) { return !a != !b && 0 <= a && 0 <= b; } /* Return true if A and B are equal. */ static int equal_tm (const struct tm *a, const struct tm *b) { return ! ((a->tm_sec ^ b->tm_sec) | (a->tm_min ^ b->tm_min) | (a->tm_hour ^ b->tm_hour) | (a->tm_mday ^ b->tm_mday) | (a->tm_mon ^ b->tm_mon) | (a->tm_year ^ b->tm_year) | isdst_differ (a->tm_isdst, b->tm_isdst)); } #endif /* Copy to ABBRS the abbreviation at ABBR with size ABBR_SIZE (this includes its trailing null byte). Append an extra null byte to mark the end of ABBRS. */ static void extend_abbrs (char *abbrs, char const *abbr, size_t abbr_size) { memcpy (abbrs, abbr, abbr_size); abbrs[abbr_size] = '\0'; } /* Return a newly allocated time zone for NAME, or NULL on failure. A null NAME stands for wall clock time (which is like unset TZ). */ timezone_t tzalloc (char const *name) { size_t name_size = name ? strlen (name) + 1 : 0; size_t abbr_size = name_size < ABBR_SIZE_MIN ? ABBR_SIZE_MIN : name_size + 1; timezone_t tz = malloc (FLEXSIZEOF (struct tm_zone, abbrs, abbr_size)); if (tz) { tz->next = NULL; #if HAVE_TZNAME && !HAVE_TM_ZONE tz->tzname_copy[0] = tz->tzname_copy[1] = NULL; #endif tz->tz_is_set = !!name; tz->abbrs[0] = '\0'; if (name) extend_abbrs (tz->abbrs, name, name_size); } return tz; } /* Save into TZ any nontrivial time zone abbreviation used by TM, and update *TM (if HAVE_TM_ZONE) or *TZ (if !HAVE_TM_ZONE && HAVE_TZNAME) if they use the abbreviation. Return true if successful, false (setting errno) otherwise. */ static bool save_abbr (timezone_t tz, struct tm *tm) { #if HAVE_TM_ZONE || HAVE_TZNAME char const *zone = NULL; char *zone_copy = (char *) ""; # if HAVE_TZNAME int tzname_index = -1; # endif # if HAVE_TM_ZONE zone = tm->tm_zone; # endif # if HAVE_TZNAME if (! (zone && *zone) && 0 <= tm->tm_isdst) { tzname_index = tm->tm_isdst != 0; zone = tzname[tzname_index]; } # endif /* No need to replace null zones, or zones within the struct tm. */ if (!zone || ((char *) tm <= zone && zone < (char *) (tm + 1))) return true; if (*zone) { zone_copy = tz->abbrs; while (strcmp (zone_copy, zone) != 0) { if (! (*zone_copy || (zone_copy == tz->abbrs && tz->tz_is_set))) { size_t zone_size = strlen (zone) + 1; size_t zone_used = zone_copy - tz->abbrs; if (SIZE_MAX - zone_used < zone_size) { errno = ENOMEM; return false; } if (zone_used + zone_size < ABBR_SIZE_MIN) extend_abbrs (zone_copy, zone, zone_size); else { tz = tz->next = tzalloc (zone); if (!tz) return false; tz->tz_is_set = 0; zone_copy = tz->abbrs; } break; } zone_copy += strlen (zone_copy) + 1; if (!*zone_copy && tz->next) { tz = tz->next; zone_copy = tz->abbrs; } } } /* Replace the zone name so that its lifetime matches that of TZ. */ # if HAVE_TM_ZONE tm->tm_zone = zone_copy; # else if (0 <= tzname_index) tz->tzname_copy[tzname_index] = zone_copy; # endif #endif return true; } /* Free a time zone. */ void tzfree (timezone_t tz) { if (tz != local_tz) while (tz) { timezone_t next = tz->next; free (tz); tz = next; } } /* Get and set the TZ environment variable. These functions can be overridden by programs like Emacs that manage their own environment. */ #ifndef getenv_TZ static char * getenv_TZ (void) { return getenv ("TZ"); } #endif #ifndef setenv_TZ static int setenv_TZ (char const *tz) { return tz ? setenv ("TZ", tz, 1) : unsetenv ("TZ"); } #endif /* Change the environment to match the specified timezone_t value. Return true if successful, false (setting errno) otherwise. */ static bool change_env (timezone_t tz) { if (setenv_TZ (tz->tz_is_set ? tz->abbrs : NULL) != 0) return false; tzset (); return true; } /* Temporarily set the time zone to TZ, which must not be null. Return LOCAL_TZ if the time zone setting is already correct. Otherwise return a newly allocated time zone representing the old setting, or NULL (setting errno) on failure. */ static timezone_t set_tz (timezone_t tz) { char *env_tz = getenv_TZ (); if (env_tz ? tz->tz_is_set && strcmp (tz->abbrs, env_tz) == 0 : !tz->tz_is_set) return local_tz; else { timezone_t old_tz = tzalloc (env_tz); if (!old_tz) return old_tz; if (! change_env (tz)) { int saved_errno = errno; tzfree (old_tz); errno = saved_errno; return NULL; } return old_tz; } } /* Restore an old setting returned by set_tz. It must not be null. Return true (preserving errno) if successful, false (setting errno) otherwise. */ static bool revert_tz (timezone_t tz) { if (tz == local_tz) return true; else { int saved_errno = errno; bool ok = change_env (tz); if (!ok) saved_errno = errno; tzfree (tz); errno = saved_errno; return ok; } } /* Use time zone TZ to compute localtime_r (T, TM). */ struct tm * localtime_rz (timezone_t tz, time_t const *t, struct tm *tm) { #ifdef HAVE_LOCALTIME_INFLOOP_BUG /* The -67768038400665599 comes from: https://lists.gnu.org/r/bug-gnulib/2017-07/msg00142.html On affected platforms the greatest POSIX-compatible time_t value that could return nonnull is 67768036191766798 (when TZ="XXX24:59:59" it resolves to the year 2**31 - 1 + 1900, on 12-31 at 23:59:59), so test for that too while we're in the neighborhood. */ if (! (-67768038400665599 <= *t && *t <= 67768036191766798)) { errno = EOVERFLOW; return NULL; } #endif if (!tz) return gmtime_r (t, tm); else { timezone_t old_tz = set_tz (tz); if (old_tz) { bool abbr_saved = localtime_r (t, tm) && save_abbr (tz, tm); if (revert_tz (old_tz) && abbr_saved) return tm; } return NULL; } } /* Use time zone TZ to compute mktime (TM). */ time_t mktime_z (timezone_t tz, struct tm *tm) { if (!tz) return timegm (tm); else { timezone_t old_tz = set_tz (tz); if (old_tz) { time_t t = mktime (tm); #if HAVE_TM_ZONE || HAVE_TZNAME time_t badtime = -1; struct tm tm_1; if ((t != badtime || (localtime_r (&t, &tm_1) && equal_tm (tm, &tm_1))) && !save_abbr (tz, tm)) t = badtime; #endif if (revert_tz (old_tz)) return t; } return -1; } } pspp-1.4.1/gl/getopt_int.h0000644000175000017500000001006313723215637015053 0ustar00blpblp00000000000000/* Internal declarations for getopt. Copyright (C) 1989-2020 Free Software Foundation, Inc. This file is part of the GNU C Library and is also part of gnulib. Patches to this file should be submitted to both projects. The GNU C Library 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 3 of the License, or (at your option) any later version. The GNU C Library 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 the GNU C Library; if not, see . */ #ifndef _GETOPT_INT_H #define _GETOPT_INT_H 1 #include extern int _getopt_internal (int ___argc, char **___argv, const char *__shortopts, const struct option *__longopts, int *__longind, int __long_only, int __posixly_correct); /* Reentrant versions which can handle parsing multiple argument vectors at the same time. */ /* Describe how to deal with options that follow non-option ARGV-elements. REQUIRE_ORDER means don't recognize them as options; stop option processing when the first non-option is seen. This is what POSIX specifies should happen. PERMUTE means permute the contents of ARGV as we scan, so that eventually all the non-options are at the end. This allows options to be given in any order, even with programs that were not written to expect this. RETURN_IN_ORDER is an option available to programs that were written to expect options and other ARGV-elements in any order and that care about the ordering of the two. We describe each non-option ARGV-element as if it were the argument of an option with character code 1. The special argument '--' forces an end of option-scanning regardless of the value of 'ordering'. In the case of RETURN_IN_ORDER, only '--' can cause 'getopt' to return -1 with 'optind' != ARGC. */ enum __ord { REQUIRE_ORDER, PERMUTE, RETURN_IN_ORDER }; /* Data type for reentrant functions. */ struct _getopt_data { /* These have exactly the same meaning as the corresponding global variables, except that they are used for the reentrant versions of getopt. */ int optind; int opterr; int optopt; char *optarg; /* Internal members. */ /* True if the internal members have been initialized. */ int __initialized; /* The next char to be scanned in the option-element in which the last option character we returned was found. This allows us to pick up the scan where we left off. If this is zero, or a null string, it means resume the scan by advancing to the next ARGV-element. */ char *__nextchar; /* See __ord above. */ enum __ord __ordering; /* Handle permutation of arguments. */ /* Describe the part of ARGV that contains non-options that have been skipped. 'first_nonopt' is the index in ARGV of the first of them; 'last_nonopt' is the index after the last of them. */ int __first_nonopt; int __last_nonopt; }; /* The initializer is necessary to set OPTIND and OPTERR to their default values and to clear the initialization flag. */ #define _GETOPT_DATA_INITIALIZER { 1, 1 } extern int _getopt_internal_r (int ___argc, char **___argv, const char *__shortopts, const struct option *__longopts, int *__longind, int __long_only, struct _getopt_data *__data, int __posixly_correct); extern int _getopt_long_r (int ___argc, char **___argv, const char *__shortopts, const struct option *__longopts, int *__longind, struct _getopt_data *__data); extern int _getopt_long_only_r (int ___argc, char **___argv, const char *__shortopts, const struct option *__longopts, int *__longind, struct _getopt_data *__data); #endif /* getopt_int.h */ pspp-1.4.1/gl/pipe2.c0000644000175000017500000001023313723215637013710 0ustar00blpblp00000000000000/* Create a pipe, with specific opening flags. Copyright (C) 2009-2020 Free Software Foundation, Inc. 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 3, 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, see . */ #include /* Specification. */ #include #include #include #include "binary-io.h" #include "verify.h" #if GNULIB_defined_O_NONBLOCK # include "nonblocking.h" #endif #if defined _WIN32 && ! defined __CYGWIN__ /* Native Windows API. */ # include #endif int pipe2 (int fd[2], int flags) { /* Mingw _pipe() corrupts fd on failure; also, if we succeed at creating the pipe but later fail at changing fcntl, we want to leave fd unchanged: http://austingroupbugs.net/view.php?id=467 */ int tmp[2]; tmp[0] = fd[0]; tmp[1] = fd[1]; #if HAVE_PIPE2 # undef pipe2 /* Try the system call first, if it exists. (We may be running with a glibc that has the function but with an older kernel that lacks it.) */ { /* Cache the information whether the system call really exists. */ static int have_pipe2_really; /* 0 = unknown, 1 = yes, -1 = no */ if (have_pipe2_really >= 0) { int result = pipe2 (fd, flags); if (!(result < 0 && errno == ENOSYS)) { have_pipe2_really = 1; return result; } have_pipe2_really = -1; } } #endif /* Check the supported flags. */ if ((flags & ~(O_CLOEXEC | O_NONBLOCK | O_BINARY | O_TEXT)) != 0) { errno = EINVAL; return -1; } #if defined _WIN32 && ! defined __CYGWIN__ /* Native Windows API. */ if (_pipe (fd, 4096, flags & ~O_NONBLOCK) < 0) { fd[0] = tmp[0]; fd[1] = tmp[1]; return -1; } /* O_NONBLOCK handling. On native Windows platforms, O_NONBLOCK is defined by gnulib. Use the functions defined by the gnulib module 'nonblocking'. */ # if GNULIB_defined_O_NONBLOCK if (flags & O_NONBLOCK) { if (set_nonblocking_flag (fd[0], true) != 0 || set_nonblocking_flag (fd[1], true) != 0) goto fail; } # else { verify (O_NONBLOCK == 0); } # endif return 0; #else /* Unix API. */ if (pipe (fd) < 0) return -1; /* POSIX says that initially, the O_NONBLOCK and FD_CLOEXEC flags are cleared on both fd[0] and fd[1]. */ /* O_NONBLOCK handling. On Unix platforms, O_NONBLOCK is defined by the system. Use fcntl(). */ if (flags & O_NONBLOCK) { int fcntl_flags; if ((fcntl_flags = fcntl (fd[1], F_GETFL, 0)) < 0 || fcntl (fd[1], F_SETFL, fcntl_flags | O_NONBLOCK) == -1 || (fcntl_flags = fcntl (fd[0], F_GETFL, 0)) < 0 || fcntl (fd[0], F_SETFL, fcntl_flags | O_NONBLOCK) == -1) goto fail; } if (flags & O_CLOEXEC) { int fcntl_flags; if ((fcntl_flags = fcntl (fd[1], F_GETFD, 0)) < 0 || fcntl (fd[1], F_SETFD, fcntl_flags | FD_CLOEXEC) == -1 || (fcntl_flags = fcntl (fd[0], F_GETFD, 0)) < 0 || fcntl (fd[0], F_SETFD, fcntl_flags | FD_CLOEXEC) == -1) goto fail; } # if O_BINARY if (flags & O_BINARY) { set_binary_mode (fd[1], O_BINARY); set_binary_mode (fd[0], O_BINARY); } else if (flags & O_TEXT) { set_binary_mode (fd[1], O_TEXT); set_binary_mode (fd[0], O_TEXT); } # endif return 0; #endif #if GNULIB_defined_O_NONBLOCK || !(defined _WIN32 && ! defined __CYGWIN__) fail: { int saved_errno = errno; close (fd[0]); close (fd[1]); fd[0] = tmp[0]; fd[1] = tmp[1]; errno = saved_errno; return -1; } #endif } pspp-1.4.1/gl/printf-args.h0000644000175000017500000000734513723215640015136 0ustar00blpblp00000000000000/* Decomposed printf argument list. Copyright (C) 1999, 2002-2003, 2006-2007, 2011-2020 Free Software Foundation, Inc. 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 3, 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, see . */ #ifndef _PRINTF_ARGS_H #define _PRINTF_ARGS_H /* This file can be parametrized with the following macros: ENABLE_UNISTDIO Set to 1 to enable the unistdio extensions. PRINTF_FETCHARGS Name of the function to be declared. STATIC Set to 'static' to declare the function static. */ /* Default parameters. */ #ifndef PRINTF_FETCHARGS # define PRINTF_FETCHARGS printf_fetchargs #endif /* Get size_t. */ #include /* Get wchar_t. */ #if HAVE_WCHAR_T # include #endif /* Get wint_t. */ #if HAVE_WINT_T # include #endif /* Get va_list. */ #include /* Argument types */ typedef enum { TYPE_NONE, TYPE_SCHAR, TYPE_UCHAR, TYPE_SHORT, TYPE_USHORT, TYPE_INT, TYPE_UINT, TYPE_LONGINT, TYPE_ULONGINT, TYPE_LONGLONGINT, TYPE_ULONGLONGINT, TYPE_DOUBLE, TYPE_LONGDOUBLE, TYPE_CHAR, #if HAVE_WINT_T TYPE_WIDE_CHAR, #endif TYPE_STRING, #if HAVE_WCHAR_T TYPE_WIDE_STRING, #endif TYPE_POINTER, TYPE_COUNT_SCHAR_POINTER, TYPE_COUNT_SHORT_POINTER, TYPE_COUNT_INT_POINTER, TYPE_COUNT_LONGINT_POINTER, TYPE_COUNT_LONGLONGINT_POINTER #if ENABLE_UNISTDIO /* The unistdio extensions. */ , TYPE_U8_STRING , TYPE_U16_STRING , TYPE_U32_STRING #endif } arg_type; /* Polymorphic argument */ typedef struct { arg_type type; union { signed char a_schar; unsigned char a_uchar; short a_short; unsigned short a_ushort; int a_int; unsigned int a_uint; long int a_longint; unsigned long int a_ulongint; long long int a_longlongint; unsigned long long int a_ulonglongint; float a_float; double a_double; long double a_longdouble; int a_char; #if HAVE_WINT_T wint_t a_wide_char; #endif const char* a_string; #if HAVE_WCHAR_T const wchar_t* a_wide_string; #endif void* a_pointer; signed char * a_count_schar_pointer; short * a_count_short_pointer; int * a_count_int_pointer; long int * a_count_longint_pointer; long long int * a_count_longlongint_pointer; #if ENABLE_UNISTDIO /* The unistdio extensions. */ const uint8_t * a_u8_string; const uint16_t * a_u16_string; const uint32_t * a_u32_string; #endif } a; } argument; /* Number of directly allocated arguments (no malloc() needed). */ #define N_DIRECT_ALLOC_ARGUMENTS 7 typedef struct { size_t count; argument *arg; argument direct_alloc_arg[N_DIRECT_ALLOC_ARGUMENTS]; } arguments; /* Fetch the arguments, putting them into a. */ #ifdef STATIC STATIC #else extern #endif int PRINTF_FETCHARGS (va_list args, arguments *a); #endif /* _PRINTF_ARGS_H */ pspp-1.4.1/gl/read.c0000644000175000017500000000444313723215640013604 0ustar00blpblp00000000000000/* POSIX compatible read() function. Copyright (C) 2008-2020 Free Software Foundation, Inc. Written by Bruno Haible , 2011. 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 3 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, see . */ #include /* Specification. */ #include #if defined _WIN32 && ! defined __CYGWIN__ # include # include # define WIN32_LEAN_AND_MEAN /* avoid including junk */ # include # if HAVE_MSVC_INVALID_PARAMETER_HANDLER # include "msvc-inval.h" # endif # if GNULIB_MSVC_NOTHROW # include "msvc-nothrow.h" # else # include # endif /* Don't assume that UNICODE is not defined. */ # undef GetNamedPipeHandleState # define GetNamedPipeHandleState GetNamedPipeHandleStateA # undef read # if HAVE_MSVC_INVALID_PARAMETER_HANDLER static ssize_t read_nothrow (int fd, void *buf, size_t count) { ssize_t result; TRY_MSVC_INVAL { result = read (fd, buf, count); } CATCH_MSVC_INVAL { result = -1; errno = EBADF; } DONE_MSVC_INVAL; return result; } # else # define read_nothrow read # endif ssize_t rpl_read (int fd, void *buf, size_t count) { ssize_t ret = read_nothrow (fd, buf, count); # if GNULIB_NONBLOCKING if (ret < 0 && GetLastError () == ERROR_NO_DATA) { HANDLE h = (HANDLE) _get_osfhandle (fd); if (GetFileType (h) == FILE_TYPE_PIPE) { /* h is a pipe or socket. */ DWORD state; if (GetNamedPipeHandleState (h, &state, NULL, NULL, NULL, NULL, 0) && (state & PIPE_NOWAIT) != 0) /* h is a pipe in non-blocking mode. Change errno from EINVAL to EAGAIN. */ errno = EAGAIN; } } # endif return ret; } #endif pspp-1.4.1/gl/unictype/0000755000175000017500000000000013725012650014356 5ustar00blpblp00000000000000pspp-1.4.1/gl/unictype/pr_soft_dotted.c0000644000175000017500000000220513723215640017542 0ustar00blpblp00000000000000/* Properties of Unicode characters. Copyright (C) 2002, 2006-2007, 2009-2020 Free Software Foundation, Inc. Written by Bruno Haible , 2002. 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 3 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, see . */ #include /* Specification. */ #include "unictype.h" #include "bitmap.h" /* Define u_property_soft_dotted table. */ #include "pr_soft_dotted.h" bool uc_is_property_soft_dotted (ucs4_t uc) { return bitmap_lookup (&u_property_soft_dotted, uc); } const uc_property_t UC_PROPERTY_SOFT_DOTTED = { &uc_is_property_soft_dotted }; pspp-1.4.1/gl/unictype/categ_of.c0000644000175000017500000000451013723215640016273 0ustar00blpblp00000000000000/* Categories of Unicode characters. Copyright (C) 2002, 2006-2007, 2009-2020 Free Software Foundation, Inc. Written by Bruno Haible , 2002. 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 3 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, see . */ #include /* Specification. */ #include "unictype.h" /* Define u_category table. */ #include "categ_of.h" static inline int lookup_withtable (ucs4_t uc) { unsigned int index1 = uc >> category_header_0; if (index1 < category_header_1) { int lookup1 = u_category.level1[index1]; if (lookup1 >= 0) { unsigned int index2 = (uc >> category_header_2) & category_header_3; int lookup2 = u_category.level2[lookup1 + index2]; if (lookup2 >= 0) { unsigned int index3 = ((uc & category_header_4) + lookup2) * 5; /* level3 contains 5-bit values, packed into 16-bit words. */ unsigned int lookup3 = (((unsigned int) u_category.level3[index3>>4] | ((unsigned int) u_category.level3[(index3>>4)+1] << 16)) >> (index3 % 16)) & 0x1f; return lookup3; } } return 29; /* = log2(UC_CATEGORY_MASK_Cn) */ } return -1; } bool uc_is_general_category_withtable (ucs4_t uc, uint32_t bitmask) { int bit = lookup_withtable (uc); if (bit >= 0) return ((bitmask >> bit) & 1); else return false; } uc_general_category_t uc_general_category (ucs4_t uc) { int bit = lookup_withtable (uc); uc_general_category_t result; if (bit >= 0) { result.bitmask = 1 << bit; result.generic = 1; result.lookup.lookup_fn = &uc_is_general_category_withtable; return result; } else return _UC_CATEGORY_NONE; } pspp-1.4.1/gl/unictype/pr_soft_dotted.h0000644000175000017500000001302013723215640017544 0ustar00blpblp00000000000000/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ /* Properties of Unicode characters. */ /* Generated automatically by gen-uni-tables.c for Unicode 9.0.0. */ #define header_0 16 #define header_2 9 #define header_3 127 #define header_4 15 static const struct { int header[1]; int level1[2]; short level2[2 << 7]; /*unsigned*/ int level3[9 << 4]; } u_property_soft_dotted = { { 2 }, { 3 * sizeof (int) / sizeof (short) + 0, 3 * sizeof (int) / sizeof (short) + 128 }, { 3 + 256 * sizeof (short) / sizeof (int) + 0, 3 + 256 * sizeof (short) / sizeof (int) + 16, 3 + 256 * sizeof (short) / sizeof (int) + 32, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 3 + 256 * sizeof (short) / sizeof (int) + 48, 3 + 256 * sizeof (short) / sizeof (int) + 64, 3 + 256 * sizeof (short) / sizeof (int) + 80, -1, -1, -1, -1, -1, 3 + 256 * sizeof (short) / sizeof (int) + 96, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 3 + 256 * sizeof (short) / sizeof (int) + 112, 3 + 256 * sizeof (short) / sizeof (int) + 128, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 }, { 0x00000000, 0x00000000, 0x00000000, 0x00000600, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00008000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000200, 0x00000100, 0x20000000, 0x00040000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00080000, 0x00000000, 0x00000000, 0x01400000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000004, 0x00400000, 0x00000110, 0x00000000, 0x00000000, 0x00000000, 0x00002000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000800, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00020000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000300, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x10000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x0000000C, 0x00C00000, 0x00000000, 0x00000C00, 0xC0000000, 0x00000000, 0x000C0000, 0x00000000, 0x000000C0, 0x0C000000, 0x00000000, 0x0000C000, 0x00000000, 0x0000000C, 0x00C00000, 0x00000000, 0x00000C00, 0xC0000000, 0x00000000, 0x000C0000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 } }; pspp-1.4.1/gl/unictype/ctype_print.h0000644000175000017500000012602113723215640017073 0ustar00blpblp00000000000000/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ /* ISO C like properties of Unicode characters. */ /* Generated automatically by gen-uni-tables.c for Unicode 9.0.0. */ #define header_0 16 #define header_2 9 #define header_3 127 #define header_4 15 static const struct { int header[1]; int level1[17]; short level2[5 << 7]; /*unsigned*/ int level3[78 << 4]; } u_is_print = { { 17 }, { 18 * sizeof (int) / sizeof (short) + 0, 18 * sizeof (int) / sizeof (short) + 128, 18 * sizeof (int) / sizeof (short) + 256, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 18 * sizeof (int) / sizeof (short) + 384, 18 * sizeof (int) / sizeof (short) + 512, 18 * sizeof (int) / sizeof (short) + 512 }, { 18 + 640 * sizeof (short) / sizeof (int) + 0, 18 + 640 * sizeof (short) / sizeof (int) + 16, 18 + 640 * sizeof (short) / sizeof (int) + 32, 18 + 640 * sizeof (short) / sizeof (int) + 48, 18 + 640 * sizeof (short) / sizeof (int) + 64, 18 + 640 * sizeof (short) / sizeof (int) + 80, 18 + 640 * sizeof (short) / sizeof (int) + 96, 18 + 640 * sizeof (short) / sizeof (int) + 112, 18 + 640 * sizeof (short) / sizeof (int) + 128, 18 + 640 * sizeof (short) / sizeof (int) + 144, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 176, 18 + 640 * sizeof (short) / sizeof (int) + 192, 18 + 640 * sizeof (short) / sizeof (int) + 208, 18 + 640 * sizeof (short) / sizeof (int) + 224, 18 + 640 * sizeof (short) / sizeof (int) + 240, 18 + 640 * sizeof (short) / sizeof (int) + 256, 18 + 640 * sizeof (short) / sizeof (int) + 272, 18 + 640 * sizeof (short) / sizeof (int) + 288, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 304, 18 + 640 * sizeof (short) / sizeof (int) + 320, 18 + 640 * sizeof (short) / sizeof (int) + 336, 18 + 640 * sizeof (short) / sizeof (int) + 352, 18 + 640 * sizeof (short) / sizeof (int) + 368, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 384, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 400, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 416, 18 + 640 * sizeof (short) / sizeof (int) + 432, 18 + 640 * sizeof (short) / sizeof (int) + 448, 18 + 640 * sizeof (short) / sizeof (int) + 464, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 480, -1, -1, -1, -1, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 496, 18 + 640 * sizeof (short) / sizeof (int) + 512, 18 + 640 * sizeof (short) / sizeof (int) + 528, 18 + 640 * sizeof (short) / sizeof (int) + 544, 18 + 640 * sizeof (short) / sizeof (int) + 560, 18 + 640 * sizeof (short) / sizeof (int) + 576, 18 + 640 * sizeof (short) / sizeof (int) + 592, 18 + 640 * sizeof (short) / sizeof (int) + 608, 18 + 640 * sizeof (short) / sizeof (int) + 624, 18 + 640 * sizeof (short) / sizeof (int) + 640, 18 + 640 * sizeof (short) / sizeof (int) + 656, 18 + 640 * sizeof (short) / sizeof (int) + 672, 18 + 640 * sizeof (short) / sizeof (int) + 688, 18 + 640 * sizeof (short) / sizeof (int) + 704, 18 + 640 * sizeof (short) / sizeof (int) + 720, 18 + 640 * sizeof (short) / sizeof (int) + 736, 18 + 640 * sizeof (short) / sizeof (int) + 752, 18 + 640 * sizeof (short) / sizeof (int) + 768, -1, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 784, 18 + 640 * sizeof (short) / sizeof (int) + 800, -1, -1, -1, -1, -1, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 816, -1, -1, -1, -1, -1, -1, -1, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 832, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 848, -1, 18 + 640 * sizeof (short) / sizeof (int) + 864, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 880, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 896, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 18 + 640 * sizeof (short) / sizeof (int) + 912, -1, -1, -1, -1, -1, 18 + 640 * sizeof (short) / sizeof (int) + 928, -1, -1, -1, -1, -1, -1, -1, -1, -1, 18 + 640 * sizeof (short) / sizeof (int) + 944, 18 + 640 * sizeof (short) / sizeof (int) + 960, 18 + 640 * sizeof (short) / sizeof (int) + 976, 18 + 640 * sizeof (short) / sizeof (int) + 992, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 1008, -1, -1, 18 + 640 * sizeof (short) / sizeof (int) + 1024, -1, -1, -1, 18 + 640 * sizeof (short) / sizeof (int) + 1040, -1, -1, 18 + 640 * sizeof (short) / sizeof (int) + 1056, 18 + 640 * sizeof (short) / sizeof (int) + 1072, 18 + 640 * sizeof (short) / sizeof (int) + 1088, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 1104, 18 + 640 * sizeof (short) / sizeof (int) + 1120, -1, -1, -1, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 1136, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 1152, 18 + 640 * sizeof (short) / sizeof (int) + 1168, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 1184, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 1200, -1, -1, 18 + 640 * sizeof (short) / sizeof (int) + 1216, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 160, 18 + 640 * sizeof (short) / sizeof (int) + 1232 }, { 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0x7FFFFFFF, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFCFFFFFF, 0xFFFFD7F0, 0xFFFFFFFB, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFEFFFF, 0xFE7FFFFF, 0xFFFFFFFE, 0xFFFEE6FF, 0xFFFFFFFF, 0xFFFF00FF, 0x001F07FF, 0xDFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFBFFF, 0xFFFFFFFF, 0xFFFFE7FF, 0xFFFFFFFF, 0xFFFFFFFF, 0x0003FFFF, 0xFFFFFFFF, 0x07FFFFFF, 0xFFFFFFFF, 0x7FFF3FFF, 0x4FFFFFFF, 0x00000000, 0x00000000, 0x3FDFFFFF, 0xFFF00000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFF99FEF, 0xF3C5FDFF, 0xB080799F, 0x0FFFFFCF, 0xFFF987EE, 0xD36DFDFF, 0x5E023987, 0x003FFFC0, 0xFFFBBFEE, 0xF3EDFDFF, 0x00013BBF, 0x0203FFCF, 0xFFF99FEE, 0xF3EDFDFF, 0xB0C0399F, 0x00FFFFCF, 0xD63DC7EC, 0xC3FFC718, 0x00813DC7, 0x07FFFFC0, 0xFFFDDFEF, 0xE3FFFDFF, 0x07603DDF, 0xFF00FFCF, 0xFFFDDFEF, 0xF3EFFDFF, 0x40603DDF, 0x0006FFCF, 0xFFFDDFEE, 0xE7FFFFFF, 0xFFF0FDDF, 0xFFFFFFCF, 0xFC7FFFEC, 0x2FFBFFFF, 0xFF5F847F, 0x001CFFC0, 0xFFFFFFFE, 0x87FFFFFF, 0x0FFFFFFF, 0x00000000, 0xFEF02596, 0x3BFFECAE, 0xF3FF3F5F, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFEFF, 0xFFFE1FFF, 0xFEFFFFFF, 0xDFFFFFFF, 0x07FFDFFF, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFF20BF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x3D7F3DFF, 0xFFFFFFFF, 0xFFFF3DFF, 0x7F3DFFFF, 0xFF7FFF3D, 0xFFFFFFFF, 0xFF3DFFFF, 0xFFFFFFFF, 0xE7FFFFFF, 0x1FFFFFFF, 0x03FFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x3F3FFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x1FFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x01FFFFFF, 0x001FDFFF, 0x007FFFFF, 0x000FFFFF, 0x000DDFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x3FFFFFFF, 0x03FF03FF, 0x03FF7FFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00FFFFFF, 0xFFFFFFFF, 0xFFFF07FF, 0xFFFFFFFF, 0x003FFFFF, 0x7FFFFFFF, 0x0FFF0FFF, 0xFFFFFFF1, 0x001F3FFF, 0xFFFFFFFF, 0xFFFF0FFF, 0xC7FF03FF, 0xFFFFFFFF, 0xCFFFFFFF, 0xFFFFFFFF, 0x7FFFFFFF, 0x9FFFFFFF, 0x03FF03FF, 0x7FFF3FFF, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFF0FFF, 0x1FFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xF00FFFFF, 0xFFFFFFFF, 0xF8FFFFFF, 0xFFFFE3FF, 0xFFFFFFFF, 0x000001FF, 0x00000000, 0xFFFF00FF, 0x037FFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xF83FFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x3F3FFFFF, 0xFFFFFFFF, 0xAAFF3F3F, 0x3FFFFFFF, 0xFFFFFFFF, 0xFFDFFFFF, 0xEFCFFFDF, 0x7FDCFFFF, 0xFFFFFFFF, 0xFFFFFCFF, 0xFFFFFFFF, 0xFFF3FFDF, 0x1FFF7FFF, 0x7FFFFFFF, 0xFFFF0000, 0x0001FFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFF0FFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x7FFFFFFF, 0xFFFFFFFF, 0x0000007F, 0x000007FF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFCFFFFF, 0xFF3FFFFF, 0xE3FFFFFF, 0x0003FDFF, 0x0000F000, 0xFFFFFFFF, 0xFFFF7FFF, 0x7FFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFE0FFFFF, 0xFFFFFFFF, 0xFFFF20BF, 0xFFFFFFFF, 0x800180FF, 0x007FFFFF, 0x7F7F7F7F, 0x7F7F7F7F, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x0000001F, 0x00000000, 0xFBFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x000FFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x003FFFFF, 0x0FFF0000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFE, 0xFFFFFFFF, 0xFE7FFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFE0, 0xFFFE3FFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFF7FFF, 0x07FFFFFF, 0xFFFFFFFF, 0xFFFF000F, 0x7FFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x7FFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x003FFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x003FFFFF, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFF1FFF, 0xFFFFFFFF, 0xFFFF007F, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000FFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00FFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00FF7FFF, 0x00000000, 0xFF800000, 0xFFFFFFFF, 0x03FF0FFF, 0xFFFFFFFF, 0x00FFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x03FFC03F, 0x3FFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x800FFFFF, 0x1FFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xC3FFBFFF, 0x7FFFFFFF, 0xFFFFFFFF, 0x007FFFFF, 0xF3FF3FFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xF8000007, 0x007FFFFF, 0x007E7E7E, 0xFFFF7F7F, 0xFFFFFFFF, 0xFFFF003F, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x03FF3FFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFF000F, 0xFFFFF87F, 0x0FFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFF3FFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x03FFFFFF, 0x00000000, 0xE0F8007F, 0x5F7FFFFF, 0xFFFFFFDB, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFF80003, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFF0000, 0xFFFFFFFF, 0xFFFCFFFF, 0xFFFFFFFF, 0x000000FF, 0x3FFF0000, 0x03FFFFFF, 0xFFFFFFFF, 0xFFF7FFFF, 0xFFDF0F7F, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x9FFFFFFF, 0xFFFFFFFE, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x7FFFFFFF, 0x1CFCFCFC, 0x3E007F7F, 0xFFFFEFFF, 0xB7FFFF7F, 0x3FFF3FFF, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x07FFFFFF, 0xFFFFFF87, 0xFF8FFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x0FFF7FFF, 0x00000001, 0xFFFF0000, 0x3FFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x1FFFFFFF, 0xFFFFFFFF, 0x0001FFFF, 0x0FFFFFFF, 0xFFFFFFFF, 0xFFFF000F, 0xFFFF07FF, 0x07FFFFFF, 0xBFFFFFFF, 0xFFFFFFFF, 0x003FFF0F, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x3FFFFFFF, 0xFFFF03FF, 0xFF0FFFFF, 0x0FFFFFFF, 0xFFFFFFFF, 0xFFFF00FF, 0xFFFFFFFF, 0x0000800F, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x007FFFFF, 0x003FFFFF, 0x000000FF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFD3F, 0x91BFFFFF, 0xFFBFFFFF, 0xFFFFFFFF, 0x7FFFFFFF, 0x0000FF80, 0x00000000, 0xF837FFFF, 0x8FFFFFFF, 0x83FFFFFF, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xF0FFFFFF, 0xFFFCFFFF, 0xFFFFFFFF, 0xFEEFF06F, 0x870FFFFF, 0x01FF00FF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0xFFFFFFFF, 0x007FF87F, 0xFFFFFFFF, 0xFE3FFFFF, 0xFF3FFFFF, 0xFF07FFFF, 0x1E03FFFF, 0x0000FE00, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0x000001FF, 0x00000000, 0xFFFFFFFF, 0x0007FFFF, 0xFFFFFFFF, 0xFC07FFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x7FFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFC3FFF, 0x8000FFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFF0003, 0x03FF01FF, 0xFFFFFFFF, 0xFFDFFFFF, 0xFFFF000F, 0x007FFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFF3FFF, 0x001FFFFE, 0xFFFBFFFF, 0x7FFFFFFF, 0x00000000, 0x00000000, 0xBFFFBD7F, 0xFFFF03FF, 0xFFFFFFFF, 0x03FF07FF, 0xFFF99FEF, 0xF3EDFDFF, 0xE081399F, 0x001F1FCF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0x2BFFFFFF, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0x03FF00FF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFF3FFFFF, 0x3FFFFFFF, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0x03FF001F, 0x00001FFF, 0xFFFFFFFF, 0x00FFFFFF, 0x000003FF, 0x00000000, 0xE3FFFFFF, 0xFFFF0FFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0x8007FFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0x01FFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFDFF, 0xFF7FFFFF, 0xFFFF003F, 0xFFFF1FFF, 0xFFFCFFFF, 0x007FFEFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x03FFFFFF, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x001F7FFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x0000000F, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0x00007FFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0x0000007F, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0x01FFFFFF, 0x7FFFFFFF, 0x0000C3FF, 0x00000000, 0x00000000, 0xFFFF0000, 0x003F3FFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFBFF003F, 0xE0FFFFFB, 0x0000FFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFF001F, 0x7FFFFFFF, 0xFFFF8000, 0x00000000, 0x00000000, 0x00000001, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00001FFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x0007FFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000003, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x1FFF07FF, 0xF3FF01FF, 0x0000000F, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x003FFFFF, 0xFFFFFFFF, 0xFFFFFE7F, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x000001FF, 0xFFFFFFFF, 0xFFFFFFFF, 0x0000003F, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0x007FFFFF, 0x0003FFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFDFFFFF, 0xFFFFFFFF, 0xDFFFFFFF, 0xEBFFDE64, 0xFFFFFFEF, 0xFFFFFFFF, 0xDFDFE7BF, 0x7BFFFFFF, 0xFFFDFC5F, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFF3F, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFCFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xF8000FFF, 0x0000FFFE, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xF9FFFF7F, 0x000007DB, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x007FFF9F, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xC3FF07FF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFEF, 0x0AF7FE96, 0xAA96EA84, 0x5EF7F796, 0x0FFFFBFF, 0x0FFFFBEE, 0x00000000, 0x00030000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFF0FFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x000FFFFF, 0xFFFE7FFF, 0xFFFEFFFE, 0x003FFFFF, 0xFFFF1FFF, 0xFFFF7FFF, 0xFFFFFFFF, 0xFFFF0FFF, 0xFFFFFFFF, 0x00001FFF, 0x00000000, 0xFFFFFFC0, 0xFFFF0007, 0x0FFFFFFF, 0x000301FF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x0007FFFF, 0x007F1FFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x000FFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x001FFFFF, 0x00000000, 0xFFFF0FFF, 0xFFFFFFFF, 0x03FF00FF, 0xFFFFFFFF, 0xFFFF00FF, 0x00003FFF, 0x00000000, 0x00000000, 0x7FFF0000, 0x7FF900FF, 0x7FFF0FFF, 0x00000000, 0x0003FFFF, 0x00000000, 0x00000001, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x007FFFFF, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x001FFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x3FFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000003, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x3FFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x0000FFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x3FFFFFFF } }; pspp-1.4.1/gl/unictype/categ_none.c0000644000175000017500000000177713723215640016642 0ustar00blpblp00000000000000/* Categories of Unicode characters. Copyright (C) 2007, 2009-2020 Free Software Foundation, Inc. Written by Bruno Haible , 2007. 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 3 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, see . */ #include /* Specification. */ #include "unictype.h" static bool always_false (ucs4_t uc, uint32_t bitmask) { return false; } const uc_general_category_t _UC_CATEGORY_NONE = { 0, 1, { &always_false } }; pspp-1.4.1/gl/unictype/combiningclass.c0000644000175000017500000000301713723215640017520 0ustar00blpblp00000000000000/* Combining classes of Unicode characters. Copyright (C) 2002, 2006, 2009-2020 Free Software Foundation, Inc. Written by Bruno Haible , 2002. 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 3 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, see . */ #include /* Specification. */ #include "unictype.h" /* Define u_combclass table. */ #include "combiningclass.h" int uc_combining_class (ucs4_t uc) { unsigned int index1 = uc >> combclass_header_0; if (index1 < combclass_header_1) { int lookup1 = u_combclass.level1[index1]; if (lookup1 >= 0) { unsigned int index2 = (uc >> combclass_header_2) & combclass_header_3; int lookup2 = u_combclass.level2[lookup1 + index2]; if (lookup2 >= 0) { unsigned int index3 = (uc & combclass_header_4); unsigned int lookup3 = u_combclass.level3[lookup2 + index3]; return lookup3; } } } return 0; } pspp-1.4.1/gl/unictype/bitmap.h0000644000175000017500000000320313723215640016003 0ustar00blpblp00000000000000/* Three-level bitmap lookup. Copyright (C) 2000-2002, 2005-2007, 2009-2020 Free Software Foundation, Inc. Written by Bruno Haible , 2000-2002. 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 3 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, see . */ static inline int bitmap_lookup (const void *table, ucs4_t uc); /* These values are currently hardcoded into gen-ctype.c. */ #define header_0 16 #define header_2 9 #define header_3 127 #define header_4 15 static inline int bitmap_lookup (const void *table, ucs4_t uc) { unsigned int index1 = uc >> header_0; if (index1 < ((const int *) table)[0]) { int lookup1 = ((const int *) table)[1 + index1]; if (lookup1 >= 0) { unsigned int index2 = (uc >> header_2) & header_3; int lookup2 = ((const short *) table)[lookup1 + index2]; if (lookup2 >= 0) { unsigned int index3 = (uc >> 5) & header_4; unsigned int lookup3 = ((const int *) table)[lookup2 + index3]; return (lookup3 >> (uc & 0x1f)) & 1; } } } return 0; } pspp-1.4.1/gl/unictype/ctype_print.c0000644000175000017500000000203613723215640017065 0ustar00blpblp00000000000000/* ISO C like properties of Unicode characters. Copyright (C) 2002, 2006-2007, 2009-2020 Free Software Foundation, Inc. Written by Bruno Haible , 2002. 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 3 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, see . */ #include /* Specification. */ #include "unictype.h" #include "bitmap.h" /* Define u_is_print table. */ #include "ctype_print.h" bool uc_is_print (ucs4_t uc) { return bitmap_lookup (&u_is_print, uc); } pspp-1.4.1/gl/unictype/combiningclass.h0000644000175000017500000016703013723215640017533 0ustar00blpblp00000000000000/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ /* Combining class of Unicode characters. */ /* Generated automatically by gen-uni-tables.c for Unicode 9.0.0. */ #define combclass_header_0 16 #define combclass_header_1 2 #define combclass_header_2 7 #define combclass_header_3 511 #define combclass_header_4 127 static const struct { int level1[2]; short level2[2 << 9]; unsigned char level3[75 << 7]; } u_combclass = { { 0, 512 }, { -1, -1, -1, -1, -1, -1, 0, -1, -1, 128, -1, 256, 384, 512, 640, 768, 896, 1024, 1152, 1280, 1280, 1280, 1280, 1408, 1536, 1280, 1408, 1664, 1792, 1920, 2048, 2176, 2304, 2432, -1, -1, -1, -1, 2560, -1, -1, -1, -1, -1, -1, -1, 2688, 2816, -1, 2944, 3072, -1, 3200, 3328, 3456, 3584, 3712, 3840, -1, 3968, -1, -1, -1, -1, -1, 4096, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 4224, 4352, 4480, -1, -1, -1, -1, 4608, 4736, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 4864, 4992, -1, -1, 5120, 5248, 5376, 5504, -1, 5632, -1, 5760, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5888, -1, -1, -1, -1, -1, 6016, -1, -1, -1, -1, -1, -1, 6144, -1, 6272, 6400, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 6528, 6656, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 6784, 6912, 7040, 7168, 7296, 7424, 7552, -1, 7680, 7808, -1, 7936, 8064, 8192, 8320, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8064, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8448, 8576, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8704, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8832, 8960, 9088, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 9216, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 9344, 9472, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 }, { 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 232, 220, 220, 220, 220, 232, 216, 220, 220, 220, 220, 220, 202, 202, 220, 220, 220, 220, 202, 202, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 1, 1, 1, 1, 1, 220, 220, 220, 220, 230, 230, 230, 230, 230, 230, 230, 230, 240, 230, 220, 220, 220, 230, 230, 230, 220, 220, 0, 230, 230, 230, 220, 220, 220, 220, 230, 232, 220, 220, 230, 233, 234, 234, 233, 234, 234, 233, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 230, 230, 230, 230, 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 220, 230, 230, 230, 230, 220, 230, 230, 230, 222, 220, 230, 230, 230, 230, 230, 230, 220, 220, 220, 220, 220, 220, 230, 230, 220, 230, 230, 222, 228, 230, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 19, 20, 21, 22, 0, 23, 0, 24, 25, 0, 230, 220, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 230, 230, 230, 230, 230, 230, 230, 230, 30, 31, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27, 28, 29, 30, 31, 32, 33, 34, 230, 230, 220, 220, 230, 230, 230, 230, 230, 220, 230, 230, 220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 230, 230, 230, 230, 230, 230, 230, 0, 0, 230, 230, 230, 230, 220, 230, 0, 0, 230, 230, 0, 220, 230, 230, 220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 230, 220, 230, 230, 220, 230, 230, 220, 220, 220, 230, 220, 220, 230, 220, 230, 230, 230, 220, 230, 220, 230, 220, 230, 220, 230, 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 230, 230, 230, 230, 230, 230, 230, 220, 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 230, 230, 230, 230, 0, 230, 230, 230, 230, 230, 230, 230, 230, 230, 0, 230, 230, 230, 0, 230, 230, 230, 230, 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 220, 220, 220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 0, 220, 230, 230, 220, 230, 230, 220, 230, 230, 230, 220, 220, 220, 27, 28, 29, 230, 230, 230, 220, 230, 230, 220, 220, 230, 230, 230, 230, 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 230, 220, 230, 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 84, 91, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 103, 103, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 107, 107, 107, 107, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 118, 118, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 122, 122, 122, 122, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 220, 220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 220, 0, 220, 0, 216, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 129, 130, 0, 132, 0, 0, 0, 0, 0, 130, 130, 130, 130, 0, 0, 130, 0, 230, 230, 9, 0, 230, 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 230, 230, 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 228, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 222, 230, 220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 230, 220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 230, 230, 230, 230, 230, 230, 230, 230, 0, 0, 220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 230, 230, 230, 230, 230, 220, 220, 220, 220, 220, 220, 230, 230, 220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 230, 220, 230, 230, 230, 230, 230, 230, 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 230, 230, 230, 0, 1, 220, 220, 220, 220, 220, 230, 230, 220, 220, 220, 220, 230, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 220, 0, 0, 0, 0, 0, 0, 230, 0, 0, 0, 230, 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 230, 230, 220, 230, 230, 230, 230, 230, 230, 230, 220, 230, 230, 234, 214, 220, 202, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 0, 0, 0, 0, 0, 230, 233, 220, 230, 220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 230, 230, 1, 1, 230, 230, 230, 230, 1, 1, 1, 230, 230, 0, 0, 0, 0, 230, 0, 0, 0, 1, 1, 230, 220, 230, 1, 1, 220, 220, 220, 220, 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 230, 230, 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 218, 228, 232, 222, 224, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 230, 0, 0, 0, 0, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 230, 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 230, 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 220, 220, 220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 230, 0, 230, 230, 220, 0, 0, 230, 230, 0, 0, 0, 0, 0, 230, 230, 0, 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 230, 230, 230, 230, 230, 230, 230, 220, 220, 220, 220, 220, 220, 220, 230, 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 230, 230, 230, 230, 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 220, 0, 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 230, 1, 220, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 230, 220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 230, 230, 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 230, 230, 230, 230, 230, 230, 230, 0, 0, 0, 230, 230, 230, 230, 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 230, 230, 230, 230, 230, 230, 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 216, 216, 1, 1, 1, 0, 0, 0, 226, 216, 216, 216, 216, 216, 0, 0, 0, 0, 0, 0, 0, 0, 220, 220, 220, 220, 220, 220, 220, 220, 0, 0, 230, 230, 230, 230, 230, 220, 220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 230, 230, 230, 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 230, 230, 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 230, 230, 230, 230, 230, 230, 230, 0, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 0, 0, 230, 230, 230, 230, 230, 230, 230, 0, 230, 230, 0, 230, 230, 230, 230, 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 220, 220, 220, 220, 220, 220, 220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 230, 230, 230, 230, 230, 230, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }; pspp-1.4.1/gl/unictype/categ_of.h0000644000175000017500000026607013723215640016313 0ustar00blpblp00000000000000/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ /* Categories of Unicode characters. */ /* Generated automatically by gen-uni-tables.c for Unicode 9.0.0. */ #define category_header_0 16 #define category_header_1 17 #define category_header_2 7 #define category_header_3 511 #define category_header_4 127 static const struct { int level1[17]; short level2[5 << 9]; unsigned short level3[216 * 40 + 1]; } u_category = { { 0, 512, 1024, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1536, 2048, 2048 }, { 0, 128, 256, 384, 512, 640, 768, 896, 1024, 1152, 1280, 1408, 1536, 1664, 1792, 1920, 2048, 2176, 2304, 2432, 2560, 2688, 2816, 2944, 3072, 3200, 3328, 3456, 3584, 3712, 3840, 3968, 4096, 4224, 4352, 4352, 4480, 4608, 4736, 4864, 4992, 4352, 4352, 4352, 5120, 5248, 5376, 5504, 5632, 5760, 5888, 6016, 6144, 6272, 6400, 6528, 6656, 6784, 6912, 7040, 7168, 7296, 7424, 7552, 7680, 7808, 7936, 8064, 8192, 8192, 8320, 8448, 8576, 8704, 8832, 8960, 9088, 8832, 9216, 9344, 8832, 8832, 8192, 9472, 8192, 8192, 9600, 9728, 9856, 9984, 10112, 10240, 10368, 10496, 8832, 10624, 10752, 10880, 11008, 11136, 11264, 11392, 8832, 8832, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 11520, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 11648, 11776, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 11904, 4352, 4352, 12032, 12160, 12288, 12416, 12544, 12672, 12800, 12928, 13056, 13184, 13312, 13440, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 13568, 13696, 13696, 13696, 13696, 13696, 13696, 13696, 13696, 13696, 13696, 13696, 13696, 13696, 13696, 13696, 13696, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 4352, 4352, 13952, 14080, 14208, 14336, 4352, 4352, 14464, 14592, 14720, 14848, 14976, 15104, 15232, 15360, 15488, 15616, -1, 15744, 15872, 16000, 16128, 16256, 16384, -1, 4352, 4352, 16512, -1, 16640, 16768, 16896, 17024, 17152, 17280, 17408, 17536, 17664, 17792, -1, -1, 17920, -1, -1, -1, 18048, 18176, 18304, 18432, 18560, 18688, 18816, -1, 18944, 19072, -1, 19200, 19328, 19456, 19584, -1, -1, 19712, -1, -1, -1, 19840, -1, -1, 19968, 20096, -1, -1, -1, -1, -1, -1, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 20224, 20352, 4352, 20480, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 20608, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 4352, 4352, 4352, 4352, 20736, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 4352, 4352, 4352, 4352, 20864, 20992, 21120, 21248, -1, -1, -1, -1, -1, -1, 21376, 21504, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 21632, 4352, 4352, 4352, 4352, 4352, 21760, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 21888, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 22016, 22144, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8832, 22272, 22400, 22528, 22656, -1, 22784, -1, 22912, 23040, 23168, 23296, 23424, 23552, 23680, 23808, 8832, 8832, 8832, 8832, 23936, 24064, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 24192, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 4352, 24320, 24448, -1, -1, -1, -1, -1, -1, -1, -1, -1, 24576, 24704, -1, -1, 24832, 24960, 25088, 25216, 25344, -1, 8832, 25472, 8832, 8832, 8832, 8832, 8832, 25600, 25728, 25856, 25984, 26112, 26240, 26368, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 26496, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 26624, 4352, 26752, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 26880, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 4352, 4352, 4352, 4352, 27008, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 27136, -1, 27264, 27392, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 13824, 27520 }, { 0xe739, 0x739c, 0x39ce, 0x9ce7, 0xce73, 0xe739, 0x739c, 0x39ce, 0x9ce7, 0xce73, 0xc636, 0x6338, 0xcd8c, 0x1945, 0x8c59, 0x2108, 0x1084, 0x0842, 0x28c5, 0x8ca5, 0x0011, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1680, 0x5d1d, 0x8434, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x2684, 0xcc9d, 0xe739, 0x739c, 0x39ce, 0x9ce7, 0xce73, 0xe739, 0x739c, 0x39ce, 0x9ce7, 0xce73, 0xce36, 0x6739, 0xb48d, 0x2792, 0xa575, 0x2a55, 0x4345, 0x548c, 0xa811, 0x8a94, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0090, 0x0000, 0x0800, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2190, 0x1084, 0x0842, 0x8020, 0x0200, 0x2008, 0x0080, 0x0802, 0x8020, 0x0200, 0x2008, 0x0080, 0x0802, 0x8020, 0x0200, 0x2008, 0x0080, 0x0802, 0x8020, 0x0200, 0x0108, 0x1004, 0x0040, 0x0401, 0x4010, 0x2100, 0x0080, 0x0802, 0x8020, 0x0200, 0x2008, 0x0080, 0x0802, 0x8020, 0x0200, 0x2008, 0x0080, 0x0802, 0x8020, 0x0200, 0x0008, 0x1004, 0x0840, 0x8001, 0x0200, 0x0100, 0x1000, 0x0002, 0x0400, 0x0200, 0x2000, 0x0084, 0x0040, 0x8020, 0x0200, 0x0100, 0x0084, 0x0002, 0x0001, 0x4010, 0x2000, 0x0204, 0x0842, 0x1084, 0x4402, 0x2200, 0x1100, 0x0040, 0x0401, 0x4010, 0x0100, 0x1004, 0x0802, 0x8020, 0x0200, 0x2008, 0x0080, 0x0802, 0x8801, 0x0200, 0x2000, 0x0080, 0x0802, 0x8020, 0x0200, 0x2008, 0x0080, 0x0802, 0x8020, 0x0200, 0x2008, 0x0080, 0x0802, 0x8020, 0x0200, 0x2008, 0x0080, 0x0802, 0x8020, 0x4210, 0x2108, 0x1000, 0x0800, 0x0401, 0x0000, 0x2008, 0x0080, 0x0802, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4240, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8c63, 0xc631, 0x6318, 0x318c, 0x18c6, 0x5063, 0xe94a, 0x6318, 0x318c, 0x18c6, 0x5063, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x8c63, 0x2831, 0x94a5, 0x3a52, 0xa0e8, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x8020, 0x2830, 0xbd08, 0x108f, 0x0442, 0xf7bd, 0x294e, 0x0088, 0x0e80, 0x003a, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x7400, 0x0000, 0x0000, 0x1000, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0042, 0x0021, 0x4200, 0x2008, 0x0080, 0x0802, 0x8020, 0x0200, 0x2008, 0x0080, 0x0802, 0x8421, 0x8200, 0x0104, 0x1080, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8020, 0x0200, 0x2008, 0x0080, 0x0802, 0x8020, 0x0200, 0x2008, 0x0080, 0x0802, 0xd420, 0x4a52, 0xe729, 0x0080, 0x0802, 0x8020, 0x0200, 0x2008, 0x0080, 0x0802, 0x8020, 0x0200, 0x2008, 0x0080, 0x0802, 0x8020, 0x0200, 0x2008, 0x0080, 0x0802, 0x0400, 0x4010, 0x0100, 0x1004, 0x0840, 0x8020, 0x0200, 0x2008, 0x0080, 0x0802, 0x8020, 0x0200, 0x2008, 0x0080, 0x0802, 0x8020, 0x0200, 0x2008, 0x0080, 0x0802, 0x8020, 0x0200, 0x2008, 0x0080, 0x0802, 0x8020, 0x0200, 0x2008, 0x0080, 0x0802, 0x8020, 0x0200, 0x2008, 0x0080, 0x0802, 0x001d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7de8, 0x18c4, 0x8c63, 0x843d, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x3d08, 0xdeb2, 0x9d6b, 0x94bd, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x2b0a, 0x94b1, 0x4a58, 0xbd2c, 0xdef7, 0xef7b, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0xde90, 0xef7b, 0x9084, 0x7b18, 0xbdef, 0xdef7, 0xef7b, 0x6b5a, 0xb5ad, 0x3294, 0x19c6, 0xad63, 0x94a5, 0x4a52, 0xa529, 0xa894, 0x8c7b, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1083, 0x0842, 0x8421, 0x5290, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x2108, 0x1084, 0x0842, 0x18c5, 0x2123, 0x1085, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x4912, 0xa529, 0x5294, 0x2d74, 0x94a5, 0xc652, 0xa528, 0x5296, 0x210a, 0x2108, 0x1084, 0x0842, 0x4211, 0x256a, 0xc631, 0x6318, 0x318c, 0x18c6, 0xd763, 0x10a4, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0xde94, 0x2109, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x4842, 0xa529, 0x5294, 0x294a, 0xf485, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0x2108, 0x1084, 0x0842, 0x4211, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x5290, 0x294a, 0x94a5, 0x4632, 0x318d, 0xde8e, 0xef7b, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x4842, 0xa529, 0x528c, 0x294a, 0x94a5, 0x4a32, 0xa329, 0x5294, 0xef4a, 0xc631, 0x6318, 0x318c, 0x18c6, 0xec63, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0xa421, 0xd294, 0xec7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x3a42, 0x8421, 0x4210, 0xef48, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x4a5e, 0xa529, 0x5294, 0x294a, 0xe8a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x14a5, 0x0843, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x5314, 0x3188, 0x94a6, 0x4a52, 0xc529, 0x6318, 0x318a, 0x94a4, 0x4a52, 0x8429, 0x4210, 0x2108, 0x9484, 0x2312, 0x0842, 0x8421, 0x4210, 0x1071, 0x0842, 0x8421, 0x4210, 0x2108, 0x18a4, 0x09d3, 0x8421, 0x4210, 0x277a, 0x77a4, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0xa421, 0x4213, 0x2108, 0x93a4, 0x3bde, 0x8421, 0x5ef4, 0x3188, 0x94a6, 0x7a52, 0xa637, 0x6377, 0xe90a, 0xf7bd, 0x7bde, 0xbd37, 0x4ef7, 0x2748, 0x9484, 0x3bd2, 0x0842, 0x8421, 0x4210, 0xcc84, 0x94a9, 0x4a52, 0xd9d5, 0xef7b, 0x14bd, 0x09d3, 0x8421, 0xde90, 0x277b, 0x77a4, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0xa421, 0x4213, 0x2108, 0x13a4, 0x09d2, 0x84e9, 0x5ef4, 0x31ba, 0x94a6, 0x7bde, 0xa52f, 0x52f7, 0xef4a, 0xf4bd, 0x7bde, 0x9def, 0x4210, 0xe93a, 0xf7bd, 0x3bde, 0x0842, 0x8421, 0x4210, 0x10a5, 0x4a42, 0xbdef, 0xdef7, 0xef7b, 0x14bd, 0x09d3, 0x8421, 0x4210, 0x2748, 0x7484, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0xa421, 0x4213, 0x2108, 0x13a4, 0x09d2, 0x8421, 0x5ef4, 0x3188, 0x94a6, 0x4a52, 0xc52f, 0x6374, 0xef4a, 0xf7a4, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0x9484, 0x3bd2, 0x0842, 0x8421, 0x4210, 0xf671, 0x7bde, 0x9def, 0xdef4, 0xef7b, 0x18bd, 0x09d3, 0x8421, 0x4210, 0x277a, 0x77a4, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0xa421, 0x4213, 0x2108, 0x13a4, 0x09d2, 0x8421, 0x5ef4, 0x2988, 0x94a6, 0x7a52, 0xa637, 0x6377, 0xef4a, 0xf7bd, 0x7bde, 0xbd31, 0x4ef7, 0x2748, 0x9484, 0x3bd2, 0x0842, 0x8421, 0x4210, 0x2895, 0x94a5, 0xbd52, 0xdef7, 0xef7b, 0x17bd, 0x09d2, 0x8421, 0xde90, 0x213b, 0x13a4, 0x4842, 0x9def, 0x4e90, 0x213a, 0x77bd, 0x7a42, 0x84ef, 0xde90, 0x213b, 0x1084, 0x0842, 0x8421, 0xdef4, 0x31bb, 0x98c5, 0xbbde, 0xa631, 0x631b, 0xef4a, 0xf7a4, 0x7bde, 0xbd37, 0xdef7, 0xef7b, 0xf7bd, 0x3bde, 0x0842, 0x8421, 0x4210, 0xa94a, 0x6b5a, 0x75ad, 0xded6, 0xef7b, 0x18c5, 0x09d3, 0x8421, 0x4210, 0x213a, 0x13a4, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0xa421, 0x4213, 0x2108, 0x1084, 0x0842, 0x8421, 0xdef4, 0x2949, 0x18c5, 0x7a63, 0xa529, 0x5297, 0xef4a, 0xf7bd, 0x4bde, 0x84e9, 0xde90, 0xef7b, 0x9484, 0x3bd2, 0x0842, 0x8421, 0x4210, 0xf7bd, 0x7bde, 0x4aef, 0xa529, 0xaa94, 0x18a4, 0x09d3, 0x8421, 0x4210, 0x213a, 0x13a4, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0xa421, 0x4213, 0x2108, 0x1084, 0x09d2, 0x8421, 0x5ef4, 0x2988, 0x18c6, 0x7a63, 0xa631, 0x531b, 0xef4a, 0xf7bd, 0x8dde, 0xbde9, 0xdef7, 0xe93b, 0x9484, 0x3bd2, 0x0842, 0x8421, 0x4210, 0x909d, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0x18bd, 0x09d3, 0x8421, 0x4210, 0x213a, 0x13a4, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0xde90, 0x3189, 0x94a6, 0xba52, 0xa631, 0x631b, 0xa90a, 0xf7bd, 0x084e, 0x4a31, 0xa529, 0x2294, 0x9484, 0x3bd2, 0x0842, 0x8421, 0x4210, 0x294a, 0x94a5, 0xaa52, 0x4212, 0x2108, 0x1bbd, 0x09d3, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0xbde9, 0x4213, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x7484, 0x0842, 0x8421, 0xd210, 0xef49, 0x1084, 0x0842, 0xbde9, 0xde97, 0x377b, 0x94c6, 0x7a52, 0xc6e9, 0x6318, 0x318c, 0xf7bd, 0x3bde, 0x0842, 0x8421, 0x4210, 0x1bbd, 0x7b13, 0xbdef, 0xdef7, 0xef7b, 0x109d, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x10a4, 0x4a52, 0xa529, 0xde94, 0x9f7b, 0x1084, 0xc842, 0xa528, 0x5294, 0x894a, 0x2108, 0x1084, 0x0842, 0xd8c5, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0x909d, 0x7a4e, 0xa427, 0xde93, 0xef49, 0xf7bd, 0x084e, 0x9d21, 0x4210, 0x2108, 0x109d, 0x49d2, 0xbd27, 0xd213, 0x2109, 0x10a4, 0x4a52, 0xa529, 0x52f4, 0xef48, 0x1084, 0xfa42, 0xa5e8, 0x5294, 0xef4a, 0x2108, 0x1084, 0x0842, 0x4ef5, 0x2108, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xd6a4, 0x631a, 0x318c, 0x18c6, 0x8c63, 0xc631, 0x6b1a, 0xa5ad, 0x5ad4, 0xad6b, 0x2108, 0x1084, 0x0842, 0xa529, 0x5294, 0x294a, 0x4b55, 0xb52d, 0xd734, 0x319c, 0x1084, 0x0842, 0x9d21, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0xef7a, 0x94bd, 0x4a52, 0xa529, 0x5294, 0x314a, 0x94a5, 0x6252, 0x8429, 0x4210, 0x294a, 0x94a5, 0x4a52, 0xbd29, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0xad7a, 0xd6b5, 0x6b5a, 0xb5a9, 0x5ad6, 0xad7b, 0xc631, 0x6b18, 0x35ad, 0xdec6, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x6310, 0x294a, 0x94c5, 0x4a52, 0xa629, 0x6314, 0x214a, 0x2108, 0x1084, 0x0842, 0x18c5, 0x8c63, 0x1084, 0x8842, 0xa531, 0x4210, 0x2948, 0x1885, 0x0863, 0xc631, 0x6318, 0x210c, 0x94a4, 0x0852, 0x8421, 0x4210, 0x2108, 0x1484, 0x4a63, 0xc631, 0x6318, 0x310a, 0x2108, 0x1084, 0x0842, 0x6319, 0xad4a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4000, 0xbd07, 0xdef7, 0xef41, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x3890, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0xa421, 0x4213, 0xef48, 0x1084, 0x0842, 0xa4e9, 0x4213, 0xef48, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0xa421, 0x4213, 0xef48, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x13a4, 0x4842, 0x84ef, 0x4210, 0xe908, 0x13a4, 0x4842, 0x84ef, 0x4210, 0x2108, 0x1084, 0x0842, 0x84e9, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x13a4, 0x4842, 0x84ef, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0xde90, 0x294b, 0xc631, 0x6318, 0x518c, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0xef7a, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0xd6b5, 0x6b5a, 0xb5ad, 0xdef6, 0xef7b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4000, 0x21ef, 0x1084, 0xef42, 0x108c, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2462, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1096, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0xe690, 0xef7a, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x1890, 0x4a63, 0x1089, 0x0842, 0xa421, 0xdef7, 0xef7b, 0x1084, 0x0842, 0x8421, 0x4210, 0x213a, 0x9484, 0x7a52, 0xbdef, 0xdef7, 0xef7b, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x9484, 0x6252, 0xbdec, 0xdef7, 0xef7b, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x9484, 0x7bd2, 0xbdef, 0xdef7, 0xef7b, 0x1084, 0x0842, 0x8421, 0x4210, 0x213a, 0x97a4, 0x7bd2, 0xbdef, 0xdef7, 0xef7b, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x8a52, 0xa529, 0x5294, 0x318a, 0x18c6, 0x4c63, 0xa631, 0x5294, 0x294a, 0x94a5, 0x6312, 0x311c, 0x49c6, 0xef4a, 0x2108, 0x1084, 0x0842, 0xdef5, 0xef7b, 0x294a, 0x94a5, 0x4a52, 0xdef5, 0xef7b, 0xc631, 0x2318, 0x318b, 0x52c6, 0xee8a, 0x2108, 0x1084, 0x0842, 0xdef5, 0xef7b, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x9084, 0x0841, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0xbd21, 0xdef7, 0xef7b, 0x1084, 0x4a42, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0xa421, 0xde90, 0xef7b, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x4842, 0xbdef, 0xdef7, 0xef7b, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0xe908, 0x14a5, 0x8c63, 0xc529, 0xd318, 0xef7b, 0x14c6, 0x8c63, 0xa631, 0xd294, 0xef7b, 0xf7b5, 0x231e, 0x0842, 0x8421, 0x4210, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0xef48, 0x1084, 0x7a42, 0xbdef, 0xdef7, 0xef7b, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0xd210, 0xef7b, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0xdef4, 0xef7b, 0x2108, 0x1084, 0x0842, 0xdea9, 0xad7b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0xc529, 0xd298, 0x8c7b, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x4c42, 0xa531, 0x5294, 0xe94a, 0x14c5, 0x4a63, 0xa529, 0x5294, 0x318c, 0x98c6, 0x4a52, 0xa529, 0x5294, 0x2f7a, 0x2108, 0x1084, 0x0842, 0xdef5, 0xef7b, 0x2108, 0x1084, 0x0842, 0xdef5, 0xef7b, 0xc631, 0x6318, 0x311c, 0x18c6, 0xef63, 0x94a5, 0x4a52, 0xa529, 0x5294, 0xe9ca, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0x94a5, 0x0862, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x4c52, 0xa529, 0x5314, 0x318c, 0x14c6, 0x0863, 0x8421, 0xd210, 0xef7b, 0x2108, 0x1084, 0x0842, 0x18c5, 0x8c63, 0xd6b1, 0x6b5a, 0xb5ad, 0x52d6, 0x294a, 0x94a5, 0x6b52, 0xb5ad, 0x5ad6, 0xef7b, 0x18a5, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x94c4, 0x8a52, 0xa531, 0x5298, 0x210a, 0x2108, 0x1084, 0x0842, 0x4211, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x4842, 0xa531, 0x6318, 0x298a, 0x18a5, 0x7bd3, 0xbdef, 0x1ef7, 0x8c63, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x8c62, 0xc631, 0x5318, 0x294a, 0x94a5, 0x4c62, 0xbd29, 0x18f7, 0x8c63, 0x2108, 0x1084, 0x0842, 0xdef5, 0x2109, 0x2108, 0x1084, 0x0842, 0x4211, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x6321, 0x318c, 0x8c46, 0x8421, 0x4210, 0xa108, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xc631, 0x6318, 0xbd8c, 0xdef7, 0xef7b, 0x94a5, 0x4a58, 0xa529, 0x5294, 0x294a, 0x94c5, 0x4a52, 0x8529, 0x4210, 0x210a, 0x1884, 0x0853, 0xa5e9, 0xdef4, 0xef7b, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x3084, 0x18c6, 0x8c63, 0xc631, 0x6318, 0x318c, 0x18c6, 0x8c63, 0xc631, 0x6318, 0x318c, 0x18c6, 0x8c63, 0xc631, 0x6318, 0x318c, 0x18c6, 0x8c63, 0xc631, 0x6318, 0x108c, 0x0842, 0x8421, 0x4210, 0x2308, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x3184, 0x18c6, 0x8c63, 0xc631, 0x6318, 0x318c, 0x18c6, 0x8c63, 0xc631, 0x6318, 0x318c, 0x18c6, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xbdef, 0x52f7, 0x294a, 0x8020, 0x0200, 0x2008, 0x0080, 0x0802, 0x8020, 0x0200, 0x2008, 0x0080, 0x0802, 0x8020, 0x0200, 0x2008, 0x0080, 0x0802, 0x8020, 0x0200, 0x2008, 0x0080, 0x0802, 0x8020, 0x0200, 0x2008, 0x0080, 0x0802, 0x8020, 0x0200, 0x2008, 0x0080, 0x0802, 0x8020, 0x0200, 0x2008, 0x0080, 0x0802, 0x8020, 0x0200, 0x2008, 0x0080, 0x0802, 0x8020, 0x0200, 0x2008, 0x0080, 0x0802, 0x8020, 0x4200, 0x2108, 0x1084, 0x0802, 0x8020, 0x0200, 0x2008, 0x0080, 0x0802, 0x8020, 0x0200, 0x2008, 0x0080, 0x0802, 0x8020, 0x0200, 0x2008, 0x0080, 0x0802, 0x8020, 0x0200, 0x2008, 0x0080, 0x0802, 0x8020, 0x0200, 0x2008, 0x0080, 0x0802, 0x8020, 0x0200, 0x2008, 0x0080, 0x0802, 0x8421, 0x4210, 0x0008, 0x0000, 0x0000, 0x8421, 0x4210, 0x00ef, 0x0000, 0xef40, 0x8421, 0x4210, 0x0008, 0x0000, 0x0000, 0x8421, 0x4210, 0x0008, 0x0000, 0x0000, 0x8421, 0x4210, 0x00ef, 0x0000, 0xef40, 0x8421, 0x4210, 0x1d08, 0xd074, 0x0741, 0x8421, 0x4210, 0x0008, 0x0000, 0x0000, 0x8421, 0x4210, 0x2108, 0x1084, 0xef42, 0x8421, 0x4210, 0x4208, 0x2108, 0x1084, 0x8421, 0x4210, 0x4208, 0x2108, 0x1084, 0x8421, 0x4210, 0x4208, 0x2108, 0x1084, 0x8421, 0x7a10, 0x0008, 0x2000, 0xa068, 0x8694, 0x7a10, 0x0008, 0x2000, 0xa528, 0x8421, 0x7bd0, 0x0008, 0xd000, 0xa529, 0x8421, 0x4210, 0x0008, 0x0000, 0xa528, 0x87bd, 0x7a10, 0x0008, 0x2000, 0xed28, 0x5ad6, 0xad6b, 0xd6b5, 0xad5a, 0xd6b5, 0x318c, 0x58c6, 0x0f8c, 0xf7b6, 0x7b60, 0xc631, 0x6318, 0x178c, 0xad6b, 0xb6b5, 0xc631, 0x6318, 0xf18c, 0x18c1, 0x5c63, 0xc62b, 0x9b28, 0x318b, 0x18c6, 0x8c63, 0xca31, 0x62b8, 0x318c, 0x18c6, 0xb463, 0x6b5a, 0xbbad, 0x5ad6, 0xad6b, 0xd6b5, 0xf46a, 0x94ae, 0x4a52, 0x2949, 0x1b9b, 0x294a, 0x94a5, 0x4a52, 0x2949, 0xeb9b, 0x8c63, 0xc631, 0x6318, 0x318c, 0xef7a, 0xce73, 0xe739, 0x739c, 0x39ce, 0x9ce7, 0xce73, 0xe739, 0x739c, 0x39ce, 0xece7, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x39ce, 0x9ca7, 0x4a73, 0xa529, 0x5294, 0x294a, 0xf7a5, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0x82b5, 0x6b5a, 0xb505, 0x0006, 0x0840, 0x8000, 0x4150, 0x12ad, 0x0000, 0xad40, 0xd6b5, 0x2a0a, 0xa0a8, 0x0002, 0x0d40, 0x0000, 0x0810, 0x2421, 0x1ad4, 0x0002, 0x4a52, 0x4129, 0x2108, 0x5954, 0xa86b, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0x2529, 0x5210, 0x494a, 0xdad5, 0xef7b, 0x4a52, 0x6b29, 0xb5ad, 0x594a, 0xad6b, 0x56b2, 0xab59, 0xb5ac, 0x5ad6, 0xacab, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0x94ab, 0xcab5, 0x6b2a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0xa52a, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0xd6b5, 0x6b5a, 0xcdad, 0x5735, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd652, 0x6b5a, 0xb5ad, 0x5ab9, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x2ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x2956, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0x6b59, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x2ad6, 0x94a5, 0xd652, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xed6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xbded, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xd6b5, 0x6b5a, 0xb5ad, 0xded6, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0x5529, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0xa52a, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb595, 0x5ad6, 0xad6b, 0xd655, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0x52ad, 0x294a, 0x94a5, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0x956b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xcdad, 0xd735, 0x735c, 0x35cd, 0x9cd7, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x6b55, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0x4a52, 0x9b29, 0x5293, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0x6529, 0xcd73, 0xd735, 0x735c, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0xca52, 0x9ae6, 0xae6b, 0xe6b9, 0x6b9a, 0xb9ae, 0x9ae6, 0x4e6b, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0xcd94, 0x2735, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0xd94a, 0x949c, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0x6b29, 0x5295, 0x294a, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x7bda, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ef, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0xdef6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad7, 0xad6b, 0xf6b5, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0x5ef7, 0xad6b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe800, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0xe842, 0x0020, 0x4200, 0x0100, 0x1004, 0x0000, 0x8020, 0x4010, 0x2108, 0x3084, 0x0006, 0x8020, 0x0200, 0x2008, 0x0080, 0x0802, 0x8020, 0x0200, 0x2008, 0x0080, 0x0802, 0x8020, 0x0200, 0x2008, 0x0080, 0x0802, 0x8020, 0x0200, 0x2008, 0x0080, 0x0802, 0x8020, 0x0200, 0x2008, 0x0080, 0x0802, 0x8020, 0x0200, 0x2008, 0x0080, 0x0802, 0x8020, 0x6a10, 0xb5ad, 0x1056, 0x2840, 0x80a5, 0x7bd0, 0x3def, 0x18c6, 0x8c55, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0xbd0f, 0xdef7, 0xef43, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0xbd21, 0xdef7, 0x1f7b, 0xf7b1, 0x7bde, 0xbdef, 0xdef7, 0x2f7b, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0xbde9, 0xdef7, 0xef7b, 0x1084, 0x0842, 0x84e9, 0x4210, 0xe908, 0x1084, 0x0842, 0x84e9, 0x4210, 0xe908, 0x1084, 0x0842, 0x84e9, 0x4210, 0xe908, 0x1084, 0x0842, 0x84e9, 0x4210, 0xe908, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x3e31, 0x60f8, 0xf18c, 0xf8c1, 0x8c60, 0xc631, 0x6318, 0x3164, 0xf8b2, 0x8c60, 0x360f, 0x5cd7, 0xcd73, 0x18c5, 0x1c63, 0xc631, 0x6318, 0x318c, 0x1632, 0x8c63, 0xb62c, 0x7b18, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5af6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x7bda, 0xbdef, 0xdef7, 0xef7b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xd6b5, 0x6b5a, 0xb5ad, 0xdad6, 0xef7b, 0xc636, 0x0758, 0xcd49, 0xd735, 0x735c, 0xd5cd, 0x5cda, 0xcd73, 0xc735, 0x739a, 0xa535, 0x5294, 0x294a, 0x5295, 0x318a, 0x8c6c, 0x4631, 0x29ad, 0x41a5, 0xad62, 0x109d, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0xbde9, 0x4a14, 0x20c7, 0x108c, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x3890, 0x20c6, 0xf7bd, 0x09de, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0xef48, 0x109d, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0xe908, 0x2ab5, 0x54a5, 0xb5ad, 0x5ad6, 0xad6b, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0xde90, 0xef7b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x7bda, 0xbdef, 0xdef7, 0xef7b, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xed6b, 0x294a, 0x94a5, 0x4a52, 0x5ad5, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0x4aad, 0xa529, 0x5294, 0x2955, 0x94a5, 0x4a52, 0xa529, 0x5294, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0x294a, 0x94a5, 0x4a52, 0x5ad5, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0x2955, 0x94a5, 0x4a52, 0xa529, 0x5294, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xed6b, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x4842, 0xbdef, 0xdef7, 0xef7b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x4842, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0642, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0xef7a, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xbded, 0xdef7, 0xef7b, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x6321, 0x318c, 0x8c46, 0x1084, 0x0842, 0x8421, 0x3210, 0x8c62, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x2108, 0x1084, 0x0842, 0xd211, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0x8020, 0x0200, 0x2008, 0x0080, 0x0802, 0x8020, 0x0200, 0x2008, 0x0080, 0x0802, 0x8020, 0x0200, 0x2008, 0x0080, 0x2902, 0x9ce7, 0x4a58, 0xa529, 0x5294, 0x1c4a, 0x8020, 0x0200, 0x2008, 0x0080, 0x0802, 0x8020, 0x0200, 0x2008, 0x3080, 0x2946, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x4842, 0x294a, 0x94a5, 0x4a52, 0xc4a5, 0x6318, 0xbd8c, 0xdef7, 0xef7b, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x631d, 0x318c, 0x18c6, 0x8294, 0x0200, 0x2008, 0x0080, 0x0802, 0x8021, 0x0200, 0x2008, 0x0080, 0x0802, 0x8020, 0x0200, 0x2008, 0x0080, 0x0802, 0x8020, 0x0200, 0x2008, 0x0080, 0x0802, 0x8020, 0x0200, 0x2008, 0x0080, 0x0802, 0x8423, 0x4210, 0x0108, 0x1004, 0x0800, 0x8020, 0x0200, 0x8308, 0x1052, 0x2040, 0x8020, 0x0210, 0x2008, 0x0080, 0x0802, 0x8020, 0x0200, 0x2008, 0x0000, 0xe800, 0x0000, 0x0200, 0xbd08, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0x6327, 0x4204, 0x2108, 0x1484, 0x4842, 0x8421, 0x4290, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x4a63, 0xb531, 0xdad6, 0xef7b, 0x294a, 0x54a5, 0xb3ad, 0xdef6, 0xef7b, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x6312, 0xbd8c, 0xdef7, 0xef7b, 0x10c6, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x8c62, 0xc631, 0x6318, 0x318c, 0x18c6, 0x4a53, 0xbdef, 0xdef7, 0x8c7b, 0x2108, 0x1084, 0x0842, 0xdef5, 0xef7b, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x10a5, 0x0842, 0x3121, 0x1246, 0xef49, 0x2108, 0x1084, 0x0842, 0x4211, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x4842, 0xa529, 0x5294, 0x8c4a, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0xa529, 0x5294, 0x294a, 0x18a5, 0x7bd3, 0xbdef, 0xdef7, 0x8f7b, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0xef7a, 0x14a5, 0x0843, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x9084, 0x4c62, 0xa529, 0x5318, 0x318c, 0xc626, 0x6318, 0x318c, 0x18c6, 0x1f63, 0x2108, 0x1084, 0x0842, 0xdef5, 0x8c7b, 0x1084, 0xca42, 0x8420, 0x4210, 0x2108, 0x2108, 0x1084, 0x0842, 0x4211, 0xe908, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0xa421, 0x5294, 0x314a, 0x14a6, 0x4a63, 0xbde9, 0xdef7, 0xef7b, 0x9084, 0x0842, 0x8421, 0x5210, 0xef4c, 0x2108, 0x1084, 0x0842, 0x1ef5, 0x8c63, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1083, 0x0842, 0xb5a9, 0x5312, 0x210c, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x9485, 0x0852, 0x8529, 0x4210, 0x2948, 0x90a4, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0x4277, 0x8c46, 0x1084, 0x0842, 0x8421, 0x5310, 0x318a, 0x9231, 0x4c31, 0xbde9, 0xdef7, 0xef7b, 0x109d, 0x0842, 0x9de9, 0x4210, 0xe908, 0x109d, 0x0842, 0xbde9, 0xdef7, 0xef7b, 0x1084, 0x0842, 0x84e9, 0x4210, 0xe908, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x3a04, 0x18c6, 0x8421, 0x4210, 0xbdef, 0xdef7, 0xef7b, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x8a63, 0xc531, 0x6898, 0xef4a, 0x2108, 0x1084, 0x0842, 0xdef5, 0xef7b, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x7bd2, 0xbdef, 0xdef7, 0xef7b, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0xbde9, 0x4277, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0xd210, 0xef7b, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0x739c, 0x39ce, 0x9ce7, 0xce73, 0xe739, 0x739c, 0x39ce, 0x9ce7, 0xce73, 0xe739, 0x739c, 0x39ce, 0x9ce7, 0xce73, 0xe739, 0x739c, 0x39ce, 0x9ce7, 0xce73, 0xe739, 0x739c, 0x39ce, 0x9ce7, 0xce73, 0xe739, 0x739c, 0x39ce, 0x9ce7, 0xce73, 0xe739, 0x739c, 0x39ce, 0x9ce7, 0xce73, 0xe739, 0x739c, 0x39ce, 0x9ce7, 0xce73, 0xe739, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0xef48, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0xdef4, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0x8421, 0x4210, 0xbde8, 0xdef7, 0xef7b, 0xf7bd, 0x4210, 0xbd08, 0xdef7, 0x2149, 0x1084, 0x0842, 0x4421, 0x4212, 0x2108, 0x1084, 0x0842, 0x84e9, 0x4210, 0xe93a, 0x7484, 0x3a42, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x5084, 0x294a, 0x94a5, 0x4a52, 0xa529, 0xf694, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0x77bd, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x6b88, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x13bd, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0xbd21, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0x1084, 0x0842, 0x8421, 0x3210, 0xef6b, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0xc631, 0x6318, 0x2e6c, 0xdef6, 0xef7b, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0xb191, 0x9ab5, 0xae6b, 0xe6b9, 0x6b9a, 0xb9ae, 0x62e6, 0x2e6c, 0x18c6, 0x5ad7, 0xc631, 0x631e, 0xac8c, 0xe6b9, 0x8b9a, 0x4a31, 0xa526, 0x71ec, 0xd8c6, 0xef7b, 0x1084, 0x3a42, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0xd77a, 0xc63d, 0x6338, 0xcd8c, 0x1945, 0x8c59, 0x2108, 0x1084, 0x0842, 0x28c5, 0x8ca5, 0x0011, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1680, 0x5d1d, 0x8434, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x2684, 0x6c9d, 0x362e, 0x2317, 0x8421, 0x4210, 0x2108, 0x1083, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x18c8, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0xe908, 0x13bd, 0x0842, 0xbd21, 0x4213, 0x2108, 0x13bd, 0x0842, 0xbd21, 0x4213, 0xef7a, 0x4a73, 0xe75a, 0x55ec, 0x294a, 0xed6b, 0xf7bd, 0x7bde, 0x5def, 0x5d6b, 0xef6b, 0x1084, 0x0842, 0x8421, 0xd210, 0x2109, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x84e9, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4e90, 0x2748, 0x1084, 0x0842, 0x8421, 0x4210, 0xef48, 0x1084, 0x0842, 0x8421, 0x4210, 0xef48, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0xde90, 0xef7b, 0xc631, 0x7bde, 0x4a57, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x7bd5, 0xb5af, 0x5ad6, 0xad6b, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x9494, 0xaa52, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x552a, 0xed6b, 0xd6b5, 0x6b5a, 0xb5ad, 0xdad6, 0xef7b, 0xf7b5, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xef4b, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0xef7a, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0xf7a4, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0x2945, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xd529, 0xef7b, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x294a, 0x7bd5, 0xbdef, 0xdef7, 0xef7b, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1124, 0x0842, 0x8421, 0xdea4, 0xef7b, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x4842, 0xa529, 0xde94, 0xef7b, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x8f48, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x7bd2, 0x84ef, 0x4210, 0x2108, 0xa531, 0x5294, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2100, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0xef48, 0x2108, 0x1084, 0x0842, 0xdef5, 0xef7b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7bd0, 0x21ef, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0xd084, 0xef7b, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0xbd21, 0xdef7, 0xef7b, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x7bd2, 0xbdef, 0xdef7, 0x8f7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0xbde9, 0xdef7, 0xef7b, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x4842, 0xbdef, 0xdef7, 0xef7b, 0x1084, 0x0842, 0xbd21, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0x1084, 0x4842, 0xa4ef, 0x4213, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x4842, 0xa427, 0x4ef7, 0x277a, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x4842, 0x4a8f, 0xa529, 0x5294, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x55a9, 0xa529, 0x5294, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0xe908, 0xf7bd, 0x7bde, 0x4a57, 0xa529, 0x5294, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x9084, 0x484e, 0xbdef, 0xa577, 0x5294, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x8842, 0x4a52, 0xd529, 0x8f7b, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0xdef4, 0x8f7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0xbd21, 0xaef7, 0x2114, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x2bbd, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x94a4, 0x4bd2, 0xbde9, 0x5ef7, 0x294a, 0x1084, 0x09d2, 0x9d21, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x7bd2, 0xa5ef, 0xde94, 0x2f7b, 0x294a, 0x94a5, 0xbd52, 0xdef7, 0xef7b, 0xc631, 0x6318, 0xb18c, 0xdef7, 0xef7b, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x8a94, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x5294, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0x1084, 0x0842, 0x9521, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x4a42, 0xbde9, 0xa577, 0x5294, 0xc631, 0x6318, 0xbdec, 0xdef7, 0xef7b, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x4842, 0x3def, 0x18c6, 0x8c63, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x4842, 0x4aef, 0xa529, 0x5294, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x9084, 0x7bde, 0x4aef, 0xa529, 0x5294, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0xf484, 0x7bde, 0x3def, 0x18c6, 0xef7b, 0xf7bd, 0x7bde, 0x5def, 0xa529, 0x5294, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0xa421, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8000, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x7bde, 0xbdef, 0xa52b, 0x5294, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0xea94, 0x18a6, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0xa521, 0x5294, 0x294a, 0x94a5, 0x4a52, 0x3189, 0x18c6, 0xef63, 0x2bbd, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x14a5, 0x0842, 0x8421, 0x4210, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0x2f7b, 0x18a5, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x98c6, 0x4a52, 0xa631, 0x1894, 0x8c75, 0xf631, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0xa421, 0xdef7, 0xef7b, 0x2108, 0x1084, 0x0842, 0xdef5, 0xef7b, 0x14a5, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0xa529, 0x6294, 0x294a, 0x94a5, 0x3a52, 0x0842, 0x8421, 0x4210, 0xc631, 0x7bd8, 0xbdef, 0xdef7, 0xef7b, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x9084, 0x2312, 0xbde9, 0xdef7, 0xef7b, 0x18a5, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x4c63, 0xa529, 0x5294, 0x314a, 0x1086, 0x6242, 0x318c, 0x5296, 0xef62, 0x2108, 0x1084, 0x0842, 0x4891, 0x8c62, 0x295d, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x7aa5, 0xbdef, 0xdef7, 0xef7b, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x7484, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x6210, 0x298c, 0x18a5, 0x4c53, 0x3129, 0x18c6, 0xe963, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0x1084, 0x0842, 0xa4e9, 0x4213, 0x2748, 0x1084, 0x0842, 0x8421, 0x4210, 0x2748, 0x1084, 0x0842, 0x2421, 0xdef6, 0xef7b, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2908, 0x98c6, 0x4a52, 0xa529, 0xde94, 0xef7b, 0x2108, 0x1084, 0x0842, 0xdef5, 0xef7b, 0x18a5, 0x09d3, 0x8421, 0x4210, 0x277a, 0x77a4, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0xa421, 0x4213, 0x2108, 0x13a4, 0x09d2, 0x8421, 0x5ef4, 0x3188, 0x18c5, 0x7a63, 0xa637, 0x6377, 0xef4c, 0xf7a4, 0x7bde, 0xbd37, 0xdef7, 0x2109, 0x1884, 0x7bd3, 0xa529, 0x5294, 0xef7a, 0x94a5, 0x7a52, 0xbdef, 0xdef7, 0xef7b, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x8c42, 0xa531, 0x5294, 0x294a, 0x94c6, 0x4c52, 0x8421, 0x1890, 0x8c63, 0x2108, 0x1084, 0x0842, 0xd8f5, 0xef63, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x98c6, 0x4a52, 0xc529, 0x6314, 0x298c, 0x94c5, 0x4842, 0xbd24, 0xdef7, 0xef7b, 0x2108, 0x1084, 0x0842, 0xdef5, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x3108, 0x94c6, 0x4a52, 0xc6ef, 0x5318, 0x298a, 0xc625, 0x6318, 0x318c, 0x18c6, 0x8c63, 0xc631, 0x6318, 0x848c, 0x5210, 0xef4a, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x98c6, 0x4a52, 0xa529, 0x6314, 0x298a, 0xc625, 0x7a48, 0xbdef, 0xdef7, 0xef7b, 0x2108, 0x1084, 0x0842, 0xdef5, 0xef7b, 0xc631, 0x6318, 0x318c, 0x18c6, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x6290, 0x318a, 0x94a5, 0x8a52, 0xbd29, 0xdef7, 0xef7b, 0x2108, 0x1084, 0x0842, 0xdef5, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0xdef4, 0x294b, 0x94c6, 0x8a52, 0xa529, 0xd294, 0xef7b, 0x2108, 0x1084, 0x0842, 0x1529, 0xac63, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x2108, 0x1084, 0x0842, 0xa529, 0x5294, 0xa94a, 0x7bde, 0xbdef, 0xdef7, 0x277b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0xa421, 0xdef7, 0xef7b, 0x1084, 0x0842, 0xa421, 0x4213, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x3108, 0x94a5, 0x4a52, 0xa5e9, 0x5294, 0x298a, 0xc624, 0x6318, 0xbdef, 0xdef7, 0xef7b, 0x2108, 0x1084, 0x0842, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0xef7a, 0x1231, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x97bd, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xdd29, 0x5294, 0x294a, 0x94c5, 0x4a62, 0xbde9, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0xdef4, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0xea52, 0xc631, 0x7b18, 0xbdef, 0xdef7, 0xef7b, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x7bd2, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0xe908, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0xbde9, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0xa421, 0xdef7, 0xef7b, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0xe908, 0x2108, 0x1084, 0x0842, 0xdef5, 0x8c7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0xef48, 0x94a5, 0x6252, 0xbdef, 0xdef7, 0xef7b, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x94a5, 0x4a52, 0x3189, 0x58c6, 0xad6b, 0x8c63, 0x6b11, 0xbdef, 0xdef7, 0xef7b, 0x2108, 0x1084, 0x0842, 0xa575, 0x5294, 0x754a, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0xbd21, 0xdef7, 0x2109, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x7a42, 0xbdef, 0xdef7, 0xef7b, 0x18c4, 0x8c63, 0xc631, 0x6318, 0x318c, 0x18c6, 0x8c63, 0xc631, 0x6318, 0x318c, 0x18c6, 0x8c63, 0xc631, 0x6318, 0xe98c, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0x2f7b, 0x94a5, 0xc631, 0x6318, 0x318c, 0x18c6, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7a3, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0xef7a, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x9084, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf484, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0xde90, 0xef7b, 0x1084, 0x0842, 0x8421, 0x4210, 0xef7a, 0x1084, 0x0842, 0xa421, 0xdef7, 0xef7b, 0x1084, 0x0842, 0x8421, 0x5ef4, 0x894b, 0x6b5a, 0x7bdd, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xbdef, 0xdef7, 0xef7b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xbded, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x8d5a, 0xa529, 0x5ad4, 0x318d, 0x18c6, 0xb5ad, 0x5ad6, 0x52eb, 0x294a, 0x94a5, 0x4b5a, 0xa529, 0x5294, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5296, 0xad4a, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0x96b5, 0x6a52, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xbded, 0xdef7, 0xef7b, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0xf54a, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0840, 0x8421, 0x7a10, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x0008, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8400, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x0084, 0x003a, 0x83bd, 0x01de, 0x1de8, 0x0000, 0x003a, 0x0000, 0x4000, 0x2108, 0xd0f4, 0x0843, 0x8421, 0x43d0, 0x2108, 0x1084, 0x0842, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4000, 0x0007, 0xde80, 0x0001, 0x0000, 0x3a00, 0x0000, 0x0000, 0x087a, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x0008, 0x0074, 0xe800, 0x0000, 0x3a00, 0xbde8, 0x0003, 0x0000, 0x87a0, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x0084, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4000, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0840, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x0008, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8400, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x0084, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4000, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x00ef, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8640, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1904, 0x0842, 0x0021, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1900, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x6410, 0x2108, 0x0084, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6400, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x9042, 0x8421, 0x0210, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9000, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x4108, 0x1086, 0x0842, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4000, 0x1086, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x0421, 0x4219, 0x2108, 0xd080, 0x423b, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xb5a9, 0x52d6, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0xad6a, 0xd6b5, 0x4b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6a5a, 0x318d, 0xd8c6, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0x52f7, 0x294a, 0x94bd, 0x4a52, 0xa529, 0x5294, 0x294a, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0x94a5, 0x4a52, 0xa5e9, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x52f7, 0x294a, 0xf4a5, 0x7a52, 0xa529, 0xde94, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x7a42, 0x4a57, 0xa529, 0x5294, 0x94a5, 0x4a52, 0xbde9, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8400, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4a50, 0xa529, 0xde94, 0xef7b, 0x2108, 0x1084, 0x0842, 0xdef5, 0x8c7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0x1084, 0x09d2, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x909d, 0x7a4e, 0x9d27, 0x4210, 0x2108, 0x9084, 0x084e, 0x9d21, 0xd274, 0xef7b, 0x93bd, 0x7bde, 0x9d27, 0xd274, 0x2109, 0x909d, 0x7a4e, 0x9d27, 0xd274, 0x2749, 0x909d, 0x7a4e, 0x8427, 0x4e90, 0x2108, 0x9084, 0x084e, 0x9d21, 0x4210, 0xe93a, 0x1084, 0x0842, 0x8421, 0x4274, 0x2108, 0x1084, 0x0842, 0x8421, 0xd210, 0xef7b, 0x109d, 0x09d2, 0x8421, 0x4274, 0x2108, 0x1084, 0x0842, 0x8421, 0xd210, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf652, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0xdad6, 0xef7b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x7bda, 0xbdef, 0xdef7, 0xef7b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xed6b, 0xd6bd, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6bd, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6bd, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xbdef, 0xdef7, 0xef7b, 0x294a, 0x94a5, 0x4a52, 0xa529, 0xef7a, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xed6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0xdad6, 0xef7b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0xdad6, 0xef7b, 0xd6b5, 0x6b5a, 0xb5ad, 0xdef7, 0xef7b, 0xf6b5, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x4a56, 0xa529, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xef7b, 0xd6b5, 0x6b5a, 0xbded, 0xdef7, 0xef7b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x7bda, 0xbdef, 0xdef7, 0xef7b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x7b5a, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xd6b5, 0x6b5a, 0xb5ad, 0xdad6, 0xef7b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xbdad, 0xdef7, 0xef7b, 0xd6b5, 0x6b5a, 0xb5ad, 0xdef6, 0xef7b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xbdad, 0xdef7, 0xef7b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xef6b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xed6b, 0xd6b5, 0x6b5a, 0xbdad, 0xdef7, 0xef7b, 0xf7b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xed6b, 0xd6b5, 0x6b5a, 0xb5ad, 0xdad6, 0xef7b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xed6b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xf6b5, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7b5, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0xbde9, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x7a42, 0xbdef, 0xdef7, 0xef7b, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0xef48, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0xf484, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0xef48, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf75d, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0x739c, 0x39ce, 0x9ce7, 0xce73, 0xe739, 0x739c, 0x39ce, 0x9ce7, 0xce73, 0xe739, 0x739c, 0x39ce, 0x9ce7, 0xce73, 0xe739, 0x739c, 0x39ce, 0x9ce7, 0xce73, 0xe739, 0x739c, 0x39ce, 0x9ce7, 0xce73, 0xe739, 0x739c, 0x39ce, 0x9ce7, 0xce73, 0xe739, 0x739c, 0x39ce, 0x9ce7, 0xce73, 0xe739, 0x739c, 0x39ce, 0x9ce7, 0xce73, 0xef79, 0x0000 } }; pspp-1.4.1/gl/timegm.c0000644000175000017500000000263513723215640014154 0ustar00blpblp00000000000000/* Convert UTC calendar time to simple time. Like mktime but assumes UTC. Copyright (C) 1994-2020 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library 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 3 of the License, or (at your option) any later version. The GNU C Library 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 the GNU C Library; if not, see . */ #ifndef _LIBC # include #endif #include #include #include "mktime-internal.h" __time64_t __timegm64 (struct tm *tmp) { static mktime_offset_t gmtime_offset; tmp->tm_isdst = 0; return __mktime_internal (tmp, __gmtime64_r, &gmtime_offset); } #if defined _LIBC && __TIMESIZE != 64 libc_hidden_def (__timegm64) time_t timegm (struct tm *tmp) { struct tm tm = *tmp; __time64_t t = __timegm64 (&tm); if (in_time_t_range (t)) { *tmp = tm; return t; } else { __set_errno (EOVERFLOW); return -1; } } #endif pspp-1.4.1/gl/size_max.h0000644000175000017500000000221213723215640014505 0ustar00blpblp00000000000000/* size_max.h -- declare SIZE_MAX through system headers Copyright (C) 2005-2006, 2009-2020 Free Software Foundation, Inc. Written by Simon Josefsson. 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 3, 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, see . */ #ifndef GNULIB_SIZE_MAX_H #define GNULIB_SIZE_MAX_H /* Get SIZE_MAX declaration on systems like Solaris 7/8/9. */ # include /* Get SIZE_MAX declaration on systems like glibc 2. */ # if HAVE_STDINT_H # include # endif /* On systems where these include files don't define it, SIZE_MAX is defined in config.h. */ #endif /* GNULIB_SIZE_MAX_H */ pspp-1.4.1/gl/stpcpy.c0000644000175000017500000000254313723215640014212 0ustar00blpblp00000000000000/* stpcpy.c -- copy a string and return pointer to end of new string Copyright (C) 1992, 1995, 1997-1998, 2006, 2009-2020 Free Software Foundation, Inc. NOTE: The canonical source of this file is maintained with the GNU C Library. Bugs can be reported to bug-glibc@prep.ai.mit.edu. 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 3 of the License, or 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, see . */ #include #include #undef __stpcpy #ifdef _LIBC # undef stpcpy #endif #ifndef weak_alias # define __stpcpy stpcpy #endif /* Copy SRC to DEST, returning the address of the terminating '\0' in DEST. */ char * __stpcpy (char *dest, const char *src) { register char *d = dest; register const char *s = src; do *d++ = *s; while (*s++ != '\0'); return d - 1; } #ifdef weak_alias weak_alias (__stpcpy, stpcpy) #endif pspp-1.4.1/gl/regex.h0000644000175000017500000006013513723215640014010 0ustar00blpblp00000000000000/* Definitions for data structures and routines for the regular expression library. Copyright (C) 1985, 1989-2020 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library 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 3 of the License, or (at your option) any later version. The GNU C Library 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 the GNU C Library; if not, see . */ #ifndef _REGEX_H #define _REGEX_H 1 #include /* Allow the use in C++ code. */ #ifdef __cplusplus extern "C" { #endif /* Define __USE_GNU to declare GNU extensions that violate the POSIX name space rules. */ #ifdef _GNU_SOURCE # define __USE_GNU 1 #endif #ifdef _REGEX_LARGE_OFFSETS /* Use types and values that are wide enough to represent signed and unsigned byte offsets in memory. This currently works only when the regex code is used outside of the GNU C library; it is not yet supported within glibc itself, and glibc users should not define _REGEX_LARGE_OFFSETS. */ /* The type of object sizes. */ typedef size_t __re_size_t; /* The type of object sizes, in places where the traditional code uses unsigned long int. */ typedef size_t __re_long_size_t; #else /* The traditional GNU regex implementation mishandles strings longer than INT_MAX. */ typedef unsigned int __re_size_t; typedef unsigned long int __re_long_size_t; #endif /* The following two types have to be signed and unsigned integer type wide enough to hold a value of a pointer. For most ANSI compilers ptrdiff_t and size_t should be likely OK. Still size of these two types is 2 for Microsoft C. Ugh... */ typedef long int s_reg_t; typedef unsigned long int active_reg_t; /* The following bits are used to determine the regexp syntax we recognize. The set/not-set meanings are chosen so that Emacs syntax remains the value 0. The bits are given in alphabetical order, and the definitions shifted by one from the previous bit; thus, when we add or remove a bit, only one other definition need change. */ typedef unsigned long int reg_syntax_t; #ifdef __USE_GNU /* If this bit is not set, then \ inside a bracket expression is literal. If set, then such a \ quotes the following character. */ # define RE_BACKSLASH_ESCAPE_IN_LISTS ((unsigned long int) 1) /* If this bit is not set, then + and ? are operators, and \+ and \? are literals. If set, then \+ and \? are operators and + and ? are literals. */ # define RE_BK_PLUS_QM (RE_BACKSLASH_ESCAPE_IN_LISTS << 1) /* If this bit is set, then character classes are supported. They are: [:alpha:], [:upper:], [:lower:], [:digit:], [:alnum:], [:xdigit:], [:space:], [:print:], [:punct:], [:graph:], and [:cntrl:]. If not set, then character classes are not supported. */ # define RE_CHAR_CLASSES (RE_BK_PLUS_QM << 1) /* If this bit is set, then ^ and $ are always anchors (outside bracket expressions, of course). If this bit is not set, then it depends: ^ is an anchor if it is at the beginning of a regular expression or after an open-group or an alternation operator; $ is an anchor if it is at the end of a regular expression, or before a close-group or an alternation operator. This bit could be (re)combined with RE_CONTEXT_INDEP_OPS, because POSIX draft 11.2 says that * etc. in leading positions is undefined. We already implemented a previous draft which made those constructs invalid, though, so we haven't changed the code back. */ # define RE_CONTEXT_INDEP_ANCHORS (RE_CHAR_CLASSES << 1) /* If this bit is set, then special characters are always special regardless of where they are in the pattern. If this bit is not set, then special characters are special only in some contexts; otherwise they are ordinary. Specifically, * + ? and intervals are only special when not after the beginning, open-group, or alternation operator. */ # define RE_CONTEXT_INDEP_OPS (RE_CONTEXT_INDEP_ANCHORS << 1) /* If this bit is set, then *, +, ?, and { cannot be first in an re or immediately after an alternation or begin-group operator. */ # define RE_CONTEXT_INVALID_OPS (RE_CONTEXT_INDEP_OPS << 1) /* If this bit is set, then . matches newline. If not set, then it doesn't. */ # define RE_DOT_NEWLINE (RE_CONTEXT_INVALID_OPS << 1) /* If this bit is set, then . doesn't match NUL. If not set, then it does. */ # define RE_DOT_NOT_NULL (RE_DOT_NEWLINE << 1) /* If this bit is set, nonmatching lists [^...] do not match newline. If not set, they do. */ # define RE_HAT_LISTS_NOT_NEWLINE (RE_DOT_NOT_NULL << 1) /* If this bit is set, either \{...\} or {...} defines an interval, depending on RE_NO_BK_BRACES. If not set, \{, \}, {, and } are literals. */ # define RE_INTERVALS (RE_HAT_LISTS_NOT_NEWLINE << 1) /* If this bit is set, +, ? and | aren't recognized as operators. If not set, they are. */ # define RE_LIMITED_OPS (RE_INTERVALS << 1) /* If this bit is set, newline is an alternation operator. If not set, newline is literal. */ # define RE_NEWLINE_ALT (RE_LIMITED_OPS << 1) /* If this bit is set, then '{...}' defines an interval, and \{ and \} are literals. If not set, then '\{...\}' defines an interval. */ # define RE_NO_BK_BRACES (RE_NEWLINE_ALT << 1) /* If this bit is set, (...) defines a group, and \( and \) are literals. If not set, \(...\) defines a group, and ( and ) are literals. */ # define RE_NO_BK_PARENS (RE_NO_BK_BRACES << 1) /* If this bit is set, then \ matches . If not set, then \ is a back-reference. */ # define RE_NO_BK_REFS (RE_NO_BK_PARENS << 1) /* If this bit is set, then | is an alternation operator, and \| is literal. If not set, then \| is an alternation operator, and | is literal. */ # define RE_NO_BK_VBAR (RE_NO_BK_REFS << 1) /* If this bit is set, then an ending range point collating higher than the starting range point, as in [z-a], is invalid. If not set, then when ending range point collates higher than the starting range point, the range is ignored. */ # define RE_NO_EMPTY_RANGES (RE_NO_BK_VBAR << 1) /* If this bit is set, then an unmatched ) is ordinary. If not set, then an unmatched ) is invalid. */ # define RE_UNMATCHED_RIGHT_PAREN_ORD (RE_NO_EMPTY_RANGES << 1) /* If this bit is set, succeed as soon as we match the whole pattern, without further backtracking. */ # define RE_NO_POSIX_BACKTRACKING (RE_UNMATCHED_RIGHT_PAREN_ORD << 1) /* If this bit is set, do not process the GNU regex operators. If not set, then the GNU regex operators are recognized. */ # define RE_NO_GNU_OPS (RE_NO_POSIX_BACKTRACKING << 1) /* If this bit is set, turn on internal regex debugging. If not set, and debugging was on, turn it off. This only works if regex.c is compiled -DDEBUG. We define this bit always, so that all that's needed to turn on debugging is to recompile regex.c; the calling code can always have this bit set, and it won't affect anything in the normal case. */ # define RE_DEBUG (RE_NO_GNU_OPS << 1) /* If this bit is set, a syntactically invalid interval is treated as a string of ordinary characters. For example, the ERE 'a{1' is treated as 'a\{1'. */ # define RE_INVALID_INTERVAL_ORD (RE_DEBUG << 1) /* If this bit is set, then ignore case when matching. If not set, then case is significant. */ # define RE_ICASE (RE_INVALID_INTERVAL_ORD << 1) /* This bit is used internally like RE_CONTEXT_INDEP_ANCHORS but only for ^, because it is difficult to scan the regex backwards to find whether ^ should be special. */ # define RE_CARET_ANCHORS_HERE (RE_ICASE << 1) /* If this bit is set, then \{ cannot be first in a regex or immediately after an alternation, open-group or \} operator. */ # define RE_CONTEXT_INVALID_DUP (RE_CARET_ANCHORS_HERE << 1) /* If this bit is set, then no_sub will be set to 1 during re_compile_pattern. */ # define RE_NO_SUB (RE_CONTEXT_INVALID_DUP << 1) #endif /* This global variable defines the particular regexp syntax to use (for some interfaces). When a regexp is compiled, the syntax used is stored in the pattern buffer, so changing this does not affect already-compiled regexps. */ extern reg_syntax_t re_syntax_options; #ifdef __USE_GNU /* Define combinations of the above bits for the standard possibilities. (The [[[ comments delimit what gets put into the Texinfo file, so don't delete them!) */ /* [[[begin syntaxes]]] */ # define RE_SYNTAX_EMACS 0 # define RE_SYNTAX_AWK \ (RE_BACKSLASH_ESCAPE_IN_LISTS | RE_DOT_NOT_NULL \ | RE_NO_BK_PARENS | RE_NO_BK_REFS \ | RE_NO_BK_VBAR | RE_NO_EMPTY_RANGES \ | RE_DOT_NEWLINE | RE_CONTEXT_INDEP_ANCHORS \ | RE_CHAR_CLASSES \ | RE_UNMATCHED_RIGHT_PAREN_ORD | RE_NO_GNU_OPS) # define RE_SYNTAX_GNU_AWK \ ((RE_SYNTAX_POSIX_EXTENDED | RE_BACKSLASH_ESCAPE_IN_LISTS \ | RE_INVALID_INTERVAL_ORD) \ & ~(RE_DOT_NOT_NULL | RE_CONTEXT_INDEP_OPS \ | RE_CONTEXT_INVALID_OPS )) # define RE_SYNTAX_POSIX_AWK \ (RE_SYNTAX_POSIX_EXTENDED | RE_BACKSLASH_ESCAPE_IN_LISTS \ | RE_INTERVALS | RE_NO_GNU_OPS \ | RE_INVALID_INTERVAL_ORD) # define RE_SYNTAX_GREP \ ((RE_SYNTAX_POSIX_BASIC | RE_NEWLINE_ALT) \ & ~(RE_CONTEXT_INVALID_DUP | RE_DOT_NOT_NULL)) # define RE_SYNTAX_EGREP \ ((RE_SYNTAX_POSIX_EXTENDED | RE_INVALID_INTERVAL_ORD | RE_NEWLINE_ALT) \ & ~(RE_CONTEXT_INVALID_OPS | RE_DOT_NOT_NULL)) /* POSIX grep -E behavior is no longer incompatible with GNU. */ # define RE_SYNTAX_POSIX_EGREP \ RE_SYNTAX_EGREP /* P1003.2/D11.2, section 4.20.7.1, lines 5078ff. */ # define RE_SYNTAX_ED RE_SYNTAX_POSIX_BASIC # define RE_SYNTAX_SED RE_SYNTAX_POSIX_BASIC /* Syntax bits common to both basic and extended POSIX regex syntax. */ # define _RE_SYNTAX_POSIX_COMMON \ (RE_CHAR_CLASSES | RE_DOT_NEWLINE | RE_DOT_NOT_NULL \ | RE_INTERVALS | RE_NO_EMPTY_RANGES) # define RE_SYNTAX_POSIX_BASIC \ (_RE_SYNTAX_POSIX_COMMON | RE_BK_PLUS_QM | RE_CONTEXT_INVALID_DUP) /* Differs from ..._POSIX_BASIC only in that RE_BK_PLUS_QM becomes RE_LIMITED_OPS, i.e., \? \+ \| are not recognized. Actually, this isn't minimal, since other operators, such as \`, aren't disabled. */ # define RE_SYNTAX_POSIX_MINIMAL_BASIC \ (_RE_SYNTAX_POSIX_COMMON | RE_LIMITED_OPS) # define RE_SYNTAX_POSIX_EXTENDED \ (_RE_SYNTAX_POSIX_COMMON | RE_CONTEXT_INDEP_ANCHORS \ | RE_CONTEXT_INDEP_OPS | RE_NO_BK_BRACES \ | RE_NO_BK_PARENS | RE_NO_BK_VBAR \ | RE_CONTEXT_INVALID_OPS | RE_UNMATCHED_RIGHT_PAREN_ORD) /* Differs from ..._POSIX_EXTENDED in that RE_CONTEXT_INDEP_OPS is removed and RE_NO_BK_REFS is added. */ # define RE_SYNTAX_POSIX_MINIMAL_EXTENDED \ (_RE_SYNTAX_POSIX_COMMON | RE_CONTEXT_INDEP_ANCHORS \ | RE_CONTEXT_INVALID_OPS | RE_NO_BK_BRACES \ | RE_NO_BK_PARENS | RE_NO_BK_REFS \ | RE_NO_BK_VBAR | RE_UNMATCHED_RIGHT_PAREN_ORD) /* [[[end syntaxes]]] */ /* Maximum number of duplicates an interval can allow. POSIX-conforming systems might define this in , but we want our value, so remove any previous define. */ # ifdef _REGEX_INCLUDE_LIMITS_H # include # endif # ifdef RE_DUP_MAX # undef RE_DUP_MAX # endif /* RE_DUP_MAX is 2**15 - 1 because an earlier implementation stored the counter as a 2-byte signed integer. This is no longer true, so RE_DUP_MAX could be increased to (INT_MAX / 10 - 1), or to ((SIZE_MAX - 9) / 10) if _REGEX_LARGE_OFFSETS is defined. However, there would be a huge performance problem if someone actually used a pattern like a\{214748363\}, so RE_DUP_MAX retains its historical value. */ # define RE_DUP_MAX (0x7fff) #endif /* POSIX 'cflags' bits (i.e., information for 'regcomp'). */ /* If this bit is set, then use extended regular expression syntax. If not set, then use basic regular expression syntax. */ #define REG_EXTENDED 1 /* If this bit is set, then ignore case when matching. If not set, then case is significant. */ #define REG_ICASE (1 << 1) /* If this bit is set, then anchors do not match at newline characters in the string. If not set, then anchors do match at newlines. */ #define REG_NEWLINE (1 << 2) /* If this bit is set, then report only success or fail in regexec. If not set, then returns differ between not matching and errors. */ #define REG_NOSUB (1 << 3) /* POSIX 'eflags' bits (i.e., information for regexec). */ /* If this bit is set, then the beginning-of-line operator doesn't match the beginning of the string (presumably because it's not the beginning of a line). If not set, then the beginning-of-line operator does match the beginning of the string. */ #define REG_NOTBOL 1 /* Like REG_NOTBOL, except for the end-of-line. */ #define REG_NOTEOL (1 << 1) /* Use PMATCH[0] to delimit the start and end of the search in the buffer. */ #define REG_STARTEND (1 << 2) /* If any error codes are removed, changed, or added, update the '__re_error_msgid' table in regcomp.c. */ typedef enum { _REG_ENOSYS = -1, /* This will never happen for this implementation. */ _REG_NOERROR = 0, /* Success. */ _REG_NOMATCH, /* Didn't find a match (for regexec). */ /* POSIX regcomp return error codes. (In the order listed in the standard.) */ _REG_BADPAT, /* Invalid pattern. */ _REG_ECOLLATE, /* Invalid collating element. */ _REG_ECTYPE, /* Invalid character class name. */ _REG_EESCAPE, /* Trailing backslash. */ _REG_ESUBREG, /* Invalid back reference. */ _REG_EBRACK, /* Unmatched left bracket. */ _REG_EPAREN, /* Parenthesis imbalance. */ _REG_EBRACE, /* Unmatched \{. */ _REG_BADBR, /* Invalid contents of \{\}. */ _REG_ERANGE, /* Invalid range end. */ _REG_ESPACE, /* Ran out of memory. */ _REG_BADRPT, /* No preceding re for repetition op. */ /* Error codes we've added. */ _REG_EEND, /* Premature end. */ _REG_ESIZE, /* Too large (e.g., repeat count too large). */ _REG_ERPAREN /* Unmatched ) or \); not returned from regcomp. */ } reg_errcode_t; #if defined _XOPEN_SOURCE || defined __USE_XOPEN2K # define REG_ENOSYS _REG_ENOSYS #endif #define REG_NOERROR _REG_NOERROR #define REG_NOMATCH _REG_NOMATCH #define REG_BADPAT _REG_BADPAT #define REG_ECOLLATE _REG_ECOLLATE #define REG_ECTYPE _REG_ECTYPE #define REG_EESCAPE _REG_EESCAPE #define REG_ESUBREG _REG_ESUBREG #define REG_EBRACK _REG_EBRACK #define REG_EPAREN _REG_EPAREN #define REG_EBRACE _REG_EBRACE #define REG_BADBR _REG_BADBR #define REG_ERANGE _REG_ERANGE #define REG_ESPACE _REG_ESPACE #define REG_BADRPT _REG_BADRPT #define REG_EEND _REG_EEND #define REG_ESIZE _REG_ESIZE #define REG_ERPAREN _REG_ERPAREN /* This data structure represents a compiled pattern. Before calling the pattern compiler, the fields 'buffer', 'allocated', 'fastmap', and 'translate' can be set. After the pattern has been compiled, the fields 're_nsub', 'not_bol' and 'not_eol' are available. All other fields are private to the regex routines. */ #ifndef RE_TRANSLATE_TYPE # define __RE_TRANSLATE_TYPE unsigned char * # ifdef __USE_GNU # define RE_TRANSLATE_TYPE __RE_TRANSLATE_TYPE # endif #endif #ifdef __USE_GNU # define __REPB_PREFIX(name) name #else # define __REPB_PREFIX(name) __##name #endif struct re_pattern_buffer { /* Space that holds the compiled pattern. The type 'struct re_dfa_t' is private and is not declared here. */ struct re_dfa_t *__REPB_PREFIX(buffer); /* Number of bytes to which 'buffer' points. */ __re_long_size_t __REPB_PREFIX(allocated); /* Number of bytes actually used in 'buffer'. */ __re_long_size_t __REPB_PREFIX(used); /* Syntax setting with which the pattern was compiled. */ reg_syntax_t __REPB_PREFIX(syntax); /* Pointer to a fastmap, if any, otherwise zero. re_search uses the fastmap, if there is one, to skip over impossible starting points for matches. */ char *__REPB_PREFIX(fastmap); /* Either a translate table to apply to all characters before comparing them, or zero for no translation. The translation is applied to a pattern when it is compiled and to a string when it is matched. */ __RE_TRANSLATE_TYPE __REPB_PREFIX(translate); /* Number of subexpressions found by the compiler. */ size_t re_nsub; /* Zero if this pattern cannot match the empty string, one else. Well, in truth it's used only in 're_search_2', to see whether or not we should use the fastmap, so we don't set this absolutely perfectly; see 're_compile_fastmap' (the "duplicate" case). */ unsigned __REPB_PREFIX(can_be_null) : 1; /* If REGS_UNALLOCATED, allocate space in the 'regs' structure for 'max (RE_NREGS, re_nsub + 1)' groups. If REGS_REALLOCATE, reallocate space if necessary. If REGS_FIXED, use what's there. */ #ifdef __USE_GNU # define REGS_UNALLOCATED 0 # define REGS_REALLOCATE 1 # define REGS_FIXED 2 #endif unsigned __REPB_PREFIX(regs_allocated) : 2; /* Set to zero when 're_compile_pattern' compiles a pattern; set to one by 're_compile_fastmap' if it updates the fastmap. */ unsigned __REPB_PREFIX(fastmap_accurate) : 1; /* If set, 're_match_2' does not return information about subexpressions. */ unsigned __REPB_PREFIX(no_sub) : 1; /* If set, a beginning-of-line anchor doesn't match at the beginning of the string. */ unsigned __REPB_PREFIX(not_bol) : 1; /* Similarly for an end-of-line anchor. */ unsigned __REPB_PREFIX(not_eol) : 1; /* If true, an anchor at a newline matches. */ unsigned __REPB_PREFIX(newline_anchor) : 1; }; typedef struct re_pattern_buffer regex_t; /* Type for byte offsets within the string. POSIX mandates this. */ #ifdef _REGEX_LARGE_OFFSETS /* POSIX 1003.1-2008 requires that regoff_t be at least as wide as ptrdiff_t and ssize_t. We don't know of any hosts where ptrdiff_t is wider than ssize_t, so ssize_t is safe. ptrdiff_t is not visible here, so use ssize_t. */ typedef ssize_t regoff_t; #else /* The traditional GNU regex implementation mishandles strings longer than INT_MAX. */ typedef int regoff_t; #endif #ifdef __USE_GNU /* This is the structure we store register match data in. See regex.texinfo for a full description of what registers match. */ struct re_registers { __re_size_t num_regs; regoff_t *start; regoff_t *end; }; /* If 'regs_allocated' is REGS_UNALLOCATED in the pattern buffer, 're_match_2' returns information about at least this many registers the first time a 'regs' structure is passed. */ # ifndef RE_NREGS # define RE_NREGS 30 # endif #endif /* POSIX specification for registers. Aside from the different names than 're_registers', POSIX uses an array of structures, instead of a structure of arrays. */ typedef struct { regoff_t rm_so; /* Byte offset from string's start to substring's start. */ regoff_t rm_eo; /* Byte offset from string's start to substring's end. */ } regmatch_t; /* Declarations for routines. */ #ifdef __USE_GNU /* Sets the current default syntax to SYNTAX, and return the old syntax. You can also simply assign to the 're_syntax_options' variable. */ extern reg_syntax_t re_set_syntax (reg_syntax_t __syntax); /* Compile the regular expression PATTERN, with length LENGTH and syntax given by the global 're_syntax_options', into the buffer BUFFER. Return NULL if successful, and an error string if not. To free the allocated storage, you must call 'regfree' on BUFFER. Note that the translate table must either have been initialized by 'regcomp', with a malloc'ed value, or set to NULL before calling 'regfree'. */ extern const char *re_compile_pattern (const char *__pattern, size_t __length, struct re_pattern_buffer *__buffer); /* Compile a fastmap for the compiled pattern in BUFFER; used to accelerate searches. Return 0 if successful and -2 if was an internal error. */ extern int re_compile_fastmap (struct re_pattern_buffer *__buffer); /* Search in the string STRING (with length LENGTH) for the pattern compiled into BUFFER. Start searching at position START, for RANGE characters. Return the starting position of the match, -1 for no match, or -2 for an internal error. Also return register information in REGS (if REGS and BUFFER->no_sub are nonzero). */ extern regoff_t re_search (struct re_pattern_buffer *__buffer, const char *__String, regoff_t __length, regoff_t __start, regoff_t __range, struct re_registers *__regs); /* Like 're_search', but search in the concatenation of STRING1 and STRING2. Also, stop searching at index START + STOP. */ extern regoff_t re_search_2 (struct re_pattern_buffer *__buffer, const char *__string1, regoff_t __length1, const char *__string2, regoff_t __length2, regoff_t __start, regoff_t __range, struct re_registers *__regs, regoff_t __stop); /* Like 're_search', but return how many characters in STRING the regexp in BUFFER matched, starting at position START. */ extern regoff_t re_match (struct re_pattern_buffer *__buffer, const char *__String, regoff_t __length, regoff_t __start, struct re_registers *__regs); /* Relates to 're_match' as 're_search_2' relates to 're_search'. */ extern regoff_t re_match_2 (struct re_pattern_buffer *__buffer, const char *__string1, regoff_t __length1, const char *__string2, regoff_t __length2, regoff_t __start, struct re_registers *__regs, regoff_t __stop); /* Set REGS to hold NUM_REGS registers, storing them in STARTS and ENDS. Subsequent matches using BUFFER and REGS will use this memory for recording register information. STARTS and ENDS must be allocated with malloc, and must each be at least 'NUM_REGS * sizeof (regoff_t)' bytes long. If NUM_REGS == 0, then subsequent matches should allocate their own register data. Unless this function is called, the first search or match using BUFFER will allocate its own register data, without freeing the old data. */ extern void re_set_registers (struct re_pattern_buffer *__buffer, struct re_registers *__regs, __re_size_t __num_regs, regoff_t *__starts, regoff_t *__ends); #endif /* Use GNU */ #if defined _REGEX_RE_COMP || (defined _LIBC && defined __USE_MISC) /* 4.2 bsd compatibility. */ extern char *re_comp (const char *); extern int re_exec (const char *); #endif /* For plain 'restrict', use glibc's __restrict if defined. Otherwise, GCC 2.95 and later have "__restrict"; C99 compilers have "restrict", and "configure" may have defined "restrict". Other compilers use __restrict, __restrict__, and _Restrict, and 'configure' might #define 'restrict' to those words, so pick a different name. */ #ifndef _Restrict_ # if defined __restrict || 2 < __GNUC__ + (95 <= __GNUC_MINOR__) # define _Restrict_ __restrict # elif 199901L <= __STDC_VERSION__ || defined restrict # define _Restrict_ restrict # else # define _Restrict_ # endif #endif /* For [restrict], use glibc's __restrict_arr if available. Otherwise, GCC 3.1 (not in C++ mode) and C99 support [restrict]. */ #ifndef _Restrict_arr_ # ifdef __restrict_arr # define _Restrict_arr_ __restrict_arr # elif ((199901L <= __STDC_VERSION__ || 3 < __GNUC__ + (1 <= __GNUC_MINOR__)) \ && !defined __GNUG__) # define _Restrict_arr_ _Restrict_ # else # define _Restrict_arr_ # endif #endif /* POSIX compatibility. */ extern int regcomp (regex_t *_Restrict_ __preg, const char *_Restrict_ __pattern, int __cflags); extern int regexec (const regex_t *_Restrict_ __preg, const char *_Restrict_ __String, size_t __nmatch, regmatch_t __pmatch[_Restrict_arr_], int __eflags); extern size_t regerror (int __errcode, const regex_t *_Restrict_ __preg, char *_Restrict_ __errbuf, size_t __errbuf_size); extern void regfree (regex_t *__preg); #ifdef __cplusplus } #endif /* C++ */ #endif /* regex.h */ pspp-1.4.1/gl/malloca.h0000644000175000017500000001052613723215637014313 0ustar00blpblp00000000000000/* Safe automatic memory allocation. Copyright (C) 2003-2007, 2009-2020 Free Software Foundation, Inc. Written by Bruno Haible , 2003. 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 3, 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, see . */ #ifndef _MALLOCA_H #define _MALLOCA_H #include #include #include #include #include "xalloc-oversized.h" #ifdef __cplusplus extern "C" { #endif /* safe_alloca(N) is equivalent to alloca(N) when it is safe to call alloca(N); otherwise it returns NULL. It either returns N bytes of memory allocated on the stack, that lasts until the function returns, or NULL. Use of safe_alloca should be avoided: - inside arguments of function calls - undefined behaviour, - in inline functions - the allocation may actually last until the calling function returns. */ #if HAVE_ALLOCA /* The OS usually guarantees only one guard page at the bottom of the stack, and a page size can be as small as 4096 bytes. So we cannot safely allocate anything larger than 4096 bytes. Also care for the possibility of a few compiler-allocated temporary stack slots. This must be a macro, not a function. */ # define safe_alloca(N) ((N) < 4032 ? alloca (N) : NULL) #else # define safe_alloca(N) ((void) (N), NULL) #endif /* malloca(N) is a safe variant of alloca(N). It allocates N bytes of memory allocated on the stack, that must be freed using freea() before the function returns. Upon failure, it returns NULL. */ #if HAVE_ALLOCA # define malloca(N) \ ((N) < 4032 - (2 * sa_alignment_max - 1) \ ? (void *) (((uintptr_t) (char *) alloca ((N) + 2 * sa_alignment_max - 1) \ + (2 * sa_alignment_max - 1)) \ & ~(uintptr_t)(2 * sa_alignment_max - 1)) \ : mmalloca (N)) #else # define malloca(N) \ mmalloca (N) #endif extern void * mmalloca (size_t n); /* Free a block of memory allocated through malloca(). */ #if HAVE_ALLOCA extern void freea (void *p); #else # define freea free #endif /* nmalloca(N,S) is an overflow-safe variant of malloca (N * S). It allocates an array of N objects, each with S bytes of memory, on the stack. S must be positive and N must be nonnegative. The array must be freed using freea() before the function returns. */ #define nmalloca(n, s) (xalloc_oversized (n, s) ? NULL : malloca ((n) * (s))) #ifdef __cplusplus } #endif /* ------------------- Auxiliary, non-public definitions ------------------- */ /* Determine the alignment of a type at compile time. */ #if defined __GNUC__ || defined __IBM__ALIGNOF__ # define sa_alignof __alignof__ #elif defined __cplusplus template struct sa_alignof_helper { char __slot1; type __slot2; }; # define sa_alignof(type) offsetof (sa_alignof_helper, __slot2) #elif defined __hpux /* Work around a HP-UX 10.20 cc bug with enums constants defined as offsetof values. */ # define sa_alignof(type) (sizeof (type) <= 4 ? 4 : 8) #elif defined _AIX /* Work around an AIX 3.2.5 xlc bug with enums constants defined as offsetof values. */ # define sa_alignof(type) (sizeof (type) <= 4 ? 4 : 8) #else # define sa_alignof(type) offsetof (struct { char __slot1; type __slot2; }, __slot2) #endif enum { /* The desired alignment of memory allocations is the maximum alignment among all elementary types. */ sa_alignment_long = sa_alignof (long), sa_alignment_double = sa_alignof (double), sa_alignment_longlong = sa_alignof (long long), sa_alignment_longdouble = sa_alignof (long double), sa_alignment_max = ((sa_alignment_long - 1) | (sa_alignment_double - 1) | (sa_alignment_longlong - 1) | (sa_alignment_longdouble - 1) ) + 1 }; #endif /* _MALLOCA_H */ pspp-1.4.1/gl/strftime.h0000644000175000017500000000223513723215640014530 0ustar00blpblp00000000000000/* declarations for strftime.c Copyright (C) 2002, 2004, 2008-2020 Free Software Foundation, Inc. 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 3 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, see . */ #include #ifdef __cplusplus extern "C" { #endif /* Just like strftime, but with two more arguments: POSIX requires that strftime use the local timezone information. Use the timezone __TZ instead. Use __NS as the number of nanoseconds in the %N directive. */ size_t nstrftime (char *restrict, size_t, char const *, struct tm const *, timezone_t __tz, int __ns); #ifdef __cplusplus } #endif pspp-1.4.1/gl/string.in.h0000644000175000017500000012133713723215640014613 0ustar00blpblp00000000000000/* A GNU-like . Copyright (C) 1995-1996, 2001-2020 Free Software Foundation, Inc. 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 3, 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, see . */ #if __GNUC__ >= 3 @PRAGMA_SYSTEM_HEADER@ #endif @PRAGMA_COLUMNS@ #if defined _GL_ALREADY_INCLUDING_STRING_H /* Special invocation convention: - On OS X/NetBSD we have a sequence of nested includes -> -> "string.h" In this situation system _chk variants due to -D_FORTIFY_SOURCE might be used after any replacements defined here. */ #@INCLUDE_NEXT@ @NEXT_STRING_H@ #else /* Normal invocation convention. */ #ifndef _@GUARD_PREFIX@_STRING_H #define _GL_ALREADY_INCLUDING_STRING_H /* The include_next requires a split double-inclusion guard. */ #@INCLUDE_NEXT@ @NEXT_STRING_H@ #undef _GL_ALREADY_INCLUDING_STRING_H #ifndef _@GUARD_PREFIX@_STRING_H #define _@GUARD_PREFIX@_STRING_H /* NetBSD 5.0 mis-defines NULL. */ #include /* MirBSD defines mbslen as a macro. */ #if @GNULIB_MBSLEN@ && defined __MirBSD__ # include #endif /* The __attribute__ feature is available in gcc versions 2.5 and later. The attribute __pure__ was added in gcc 2.96. */ #ifndef _GL_ATTRIBUTE_PURE # if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 96) # define _GL_ATTRIBUTE_PURE __attribute__ ((__pure__)) # else # define _GL_ATTRIBUTE_PURE /* empty */ # endif #endif /* NetBSD 5.0 declares strsignal in , not in . */ /* But in any case avoid namespace pollution on glibc systems. */ #if (@GNULIB_STRSIGNAL@ || defined GNULIB_POSIXCHECK) && defined __NetBSD__ \ && ! defined __GLIBC__ # include #endif /* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */ /* The definition of _GL_ARG_NONNULL is copied here. */ /* The definition of _GL_WARN_ON_USE is copied here. */ /* Clear a block of memory. The compiler will not delete a call to this function, even if the block is dead after the call. */ #if @GNULIB_EXPLICIT_BZERO@ # if ! @HAVE_EXPLICIT_BZERO@ _GL_FUNCDECL_SYS (explicit_bzero, void, (void *__dest, size_t __n) _GL_ARG_NONNULL ((1))); # endif _GL_CXXALIAS_SYS (explicit_bzero, void, (void *__dest, size_t __n)); _GL_CXXALIASWARN (explicit_bzero); #elif defined GNULIB_POSIXCHECK # undef explicit_bzero # if HAVE_RAW_DECL_EXPLICIT_BZERO _GL_WARN_ON_USE (explicit_bzero, "explicit_bzero is unportable - " "use gnulib module explicit_bzero for portability"); # endif #endif /* Find the index of the least-significant set bit. */ #if @GNULIB_FFSL@ # if !@HAVE_FFSL@ _GL_FUNCDECL_SYS (ffsl, int, (long int i)); # endif _GL_CXXALIAS_SYS (ffsl, int, (long int i)); _GL_CXXALIASWARN (ffsl); #elif defined GNULIB_POSIXCHECK # undef ffsl # if HAVE_RAW_DECL_FFSL _GL_WARN_ON_USE (ffsl, "ffsl is not portable - use the ffsl module"); # endif #endif /* Find the index of the least-significant set bit. */ #if @GNULIB_FFSLL@ # if !@HAVE_FFSLL@ _GL_FUNCDECL_SYS (ffsll, int, (long long int i)); # endif _GL_CXXALIAS_SYS (ffsll, int, (long long int i)); _GL_CXXALIASWARN (ffsll); #elif defined GNULIB_POSIXCHECK # undef ffsll # if HAVE_RAW_DECL_FFSLL _GL_WARN_ON_USE (ffsll, "ffsll is not portable - use the ffsll module"); # endif #endif /* Return the first instance of C within N bytes of S, or NULL. */ #if @GNULIB_MEMCHR@ # if @REPLACE_MEMCHR@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # define memchr rpl_memchr # endif _GL_FUNCDECL_RPL (memchr, void *, (void const *__s, int __c, size_t __n) _GL_ATTRIBUTE_PURE _GL_ARG_NONNULL ((1))); _GL_CXXALIAS_RPL (memchr, void *, (void const *__s, int __c, size_t __n)); # else /* On some systems, this function is defined as an overloaded function: extern "C" { const void * std::memchr (const void *, int, size_t); } extern "C++" { void * std::memchr (void *, int, size_t); } */ _GL_CXXALIAS_SYS_CAST2 (memchr, void *, (void const *__s, int __c, size_t __n), void const *, (void const *__s, int __c, size_t __n)); # endif # if ((__GLIBC__ == 2 && __GLIBC_MINOR__ >= 10) && !defined __UCLIBC__) \ && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4)) _GL_CXXALIASWARN1 (memchr, void *, (void *__s, int __c, size_t __n)); _GL_CXXALIASWARN1 (memchr, void const *, (void const *__s, int __c, size_t __n)); # elif __GLIBC__ >= 2 _GL_CXXALIASWARN (memchr); # endif #elif defined GNULIB_POSIXCHECK # undef memchr /* Assume memchr is always declared. */ _GL_WARN_ON_USE (memchr, "memchr has platform-specific bugs - " "use gnulib module memchr for portability" ); #endif /* Return the first occurrence of NEEDLE in HAYSTACK. */ #if @GNULIB_MEMMEM@ # if @REPLACE_MEMMEM@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # define memmem rpl_memmem # endif _GL_FUNCDECL_RPL (memmem, void *, (void const *__haystack, size_t __haystack_len, void const *__needle, size_t __needle_len) _GL_ATTRIBUTE_PURE _GL_ARG_NONNULL ((1, 3))); _GL_CXXALIAS_RPL (memmem, void *, (void const *__haystack, size_t __haystack_len, void const *__needle, size_t __needle_len)); # else # if ! @HAVE_DECL_MEMMEM@ _GL_FUNCDECL_SYS (memmem, void *, (void const *__haystack, size_t __haystack_len, void const *__needle, size_t __needle_len) _GL_ATTRIBUTE_PURE _GL_ARG_NONNULL ((1, 3))); # endif _GL_CXXALIAS_SYS (memmem, void *, (void const *__haystack, size_t __haystack_len, void const *__needle, size_t __needle_len)); # endif _GL_CXXALIASWARN (memmem); #elif defined GNULIB_POSIXCHECK # undef memmem # if HAVE_RAW_DECL_MEMMEM _GL_WARN_ON_USE (memmem, "memmem is unportable and often quadratic - " "use gnulib module memmem-simple for portability, " "and module memmem for speed" ); # endif #endif /* Copy N bytes of SRC to DEST, return pointer to bytes after the last written byte. */ #if @GNULIB_MEMPCPY@ # if ! @HAVE_MEMPCPY@ _GL_FUNCDECL_SYS (mempcpy, void *, (void *restrict __dest, void const *restrict __src, size_t __n) _GL_ARG_NONNULL ((1, 2))); # endif _GL_CXXALIAS_SYS (mempcpy, void *, (void *restrict __dest, void const *restrict __src, size_t __n)); _GL_CXXALIASWARN (mempcpy); #elif defined GNULIB_POSIXCHECK # undef mempcpy # if HAVE_RAW_DECL_MEMPCPY _GL_WARN_ON_USE (mempcpy, "mempcpy is unportable - " "use gnulib module mempcpy for portability"); # endif #endif /* Search backwards through a block for a byte (specified as an int). */ #if @GNULIB_MEMRCHR@ # if ! @HAVE_DECL_MEMRCHR@ _GL_FUNCDECL_SYS (memrchr, void *, (void const *, int, size_t) _GL_ATTRIBUTE_PURE _GL_ARG_NONNULL ((1))); # endif /* On some systems, this function is defined as an overloaded function: extern "C++" { const void * std::memrchr (const void *, int, size_t); } extern "C++" { void * std::memrchr (void *, int, size_t); } */ _GL_CXXALIAS_SYS_CAST2 (memrchr, void *, (void const *, int, size_t), void const *, (void const *, int, size_t)); # if ((__GLIBC__ == 2 && __GLIBC_MINOR__ >= 10) && !defined __UCLIBC__) \ && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4)) _GL_CXXALIASWARN1 (memrchr, void *, (void *, int, size_t)); _GL_CXXALIASWARN1 (memrchr, void const *, (void const *, int, size_t)); # else _GL_CXXALIASWARN (memrchr); # endif #elif defined GNULIB_POSIXCHECK # undef memrchr # if HAVE_RAW_DECL_MEMRCHR _GL_WARN_ON_USE (memrchr, "memrchr is unportable - " "use gnulib module memrchr for portability"); # endif #endif /* Find the first occurrence of C in S. More efficient than memchr(S,C,N), at the expense of undefined behavior if C does not occur within N bytes. */ #if @GNULIB_RAWMEMCHR@ # if ! @HAVE_RAWMEMCHR@ _GL_FUNCDECL_SYS (rawmemchr, void *, (void const *__s, int __c_in) _GL_ATTRIBUTE_PURE _GL_ARG_NONNULL ((1))); # endif /* On some systems, this function is defined as an overloaded function: extern "C++" { const void * std::rawmemchr (const void *, int); } extern "C++" { void * std::rawmemchr (void *, int); } */ _GL_CXXALIAS_SYS_CAST2 (rawmemchr, void *, (void const *__s, int __c_in), void const *, (void const *__s, int __c_in)); # if ((__GLIBC__ == 2 && __GLIBC_MINOR__ >= 10) && !defined __UCLIBC__) \ && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4)) _GL_CXXALIASWARN1 (rawmemchr, void *, (void *__s, int __c_in)); _GL_CXXALIASWARN1 (rawmemchr, void const *, (void const *__s, int __c_in)); # else _GL_CXXALIASWARN (rawmemchr); # endif #elif defined GNULIB_POSIXCHECK # undef rawmemchr # if HAVE_RAW_DECL_RAWMEMCHR _GL_WARN_ON_USE (rawmemchr, "rawmemchr is unportable - " "use gnulib module rawmemchr for portability"); # endif #endif /* Copy SRC to DST, returning the address of the terminating '\0' in DST. */ #if @GNULIB_STPCPY@ # if ! @HAVE_STPCPY@ _GL_FUNCDECL_SYS (stpcpy, char *, (char *restrict __dst, char const *restrict __src) _GL_ARG_NONNULL ((1, 2))); # endif _GL_CXXALIAS_SYS (stpcpy, char *, (char *restrict __dst, char const *restrict __src)); _GL_CXXALIASWARN (stpcpy); #elif defined GNULIB_POSIXCHECK # undef stpcpy # if HAVE_RAW_DECL_STPCPY _GL_WARN_ON_USE (stpcpy, "stpcpy is unportable - " "use gnulib module stpcpy for portability"); # endif #endif /* Copy no more than N bytes of SRC to DST, returning a pointer past the last non-NUL byte written into DST. */ #if @GNULIB_STPNCPY@ # if @REPLACE_STPNCPY@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef stpncpy # define stpncpy rpl_stpncpy # endif _GL_FUNCDECL_RPL (stpncpy, char *, (char *restrict __dst, char const *restrict __src, size_t __n) _GL_ARG_NONNULL ((1, 2))); _GL_CXXALIAS_RPL (stpncpy, char *, (char *restrict __dst, char const *restrict __src, size_t __n)); # else # if ! @HAVE_STPNCPY@ _GL_FUNCDECL_SYS (stpncpy, char *, (char *restrict __dst, char const *restrict __src, size_t __n) _GL_ARG_NONNULL ((1, 2))); # endif _GL_CXXALIAS_SYS (stpncpy, char *, (char *restrict __dst, char const *restrict __src, size_t __n)); # endif _GL_CXXALIASWARN (stpncpy); #elif defined GNULIB_POSIXCHECK # undef stpncpy # if HAVE_RAW_DECL_STPNCPY _GL_WARN_ON_USE (stpncpy, "stpncpy is unportable - " "use gnulib module stpncpy for portability"); # endif #endif #if defined GNULIB_POSIXCHECK /* strchr() does not work with multibyte strings if the locale encoding is GB18030 and the character to be searched is a digit. */ # undef strchr /* Assume strchr is always declared. */ _GL_WARN_ON_USE_CXX (strchr, const char *, (const char *, int), "strchr cannot work correctly on character strings " "in some multibyte locales - " "use mbschr if you care about internationalization"); #endif /* Find the first occurrence of C in S or the final NUL byte. */ #if @GNULIB_STRCHRNUL@ # if @REPLACE_STRCHRNUL@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # define strchrnul rpl_strchrnul # endif _GL_FUNCDECL_RPL (strchrnul, char *, (const char *__s, int __c_in) _GL_ATTRIBUTE_PURE _GL_ARG_NONNULL ((1))); _GL_CXXALIAS_RPL (strchrnul, char *, (const char *str, int ch)); # else # if ! @HAVE_STRCHRNUL@ _GL_FUNCDECL_SYS (strchrnul, char *, (char const *__s, int __c_in) _GL_ATTRIBUTE_PURE _GL_ARG_NONNULL ((1))); # endif /* On some systems, this function is defined as an overloaded function: extern "C++" { const char * std::strchrnul (const char *, int); } extern "C++" { char * std::strchrnul (char *, int); } */ _GL_CXXALIAS_SYS_CAST2 (strchrnul, char *, (char const *__s, int __c_in), char const *, (char const *__s, int __c_in)); # endif # if ((__GLIBC__ == 2 && __GLIBC_MINOR__ >= 10) && !defined __UCLIBC__) \ && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4)) _GL_CXXALIASWARN1 (strchrnul, char *, (char *__s, int __c_in)); _GL_CXXALIASWARN1 (strchrnul, char const *, (char const *__s, int __c_in)); # else _GL_CXXALIASWARN (strchrnul); # endif #elif defined GNULIB_POSIXCHECK # undef strchrnul # if HAVE_RAW_DECL_STRCHRNUL _GL_WARN_ON_USE (strchrnul, "strchrnul is unportable - " "use gnulib module strchrnul for portability"); # endif #endif /* Duplicate S, returning an identical malloc'd string. */ #if @GNULIB_STRDUP@ # if @REPLACE_STRDUP@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef strdup # define strdup rpl_strdup # endif _GL_FUNCDECL_RPL (strdup, char *, (char const *__s) _GL_ARG_NONNULL ((1))); _GL_CXXALIAS_RPL (strdup, char *, (char const *__s)); # else # if defined __cplusplus && defined GNULIB_NAMESPACE && defined strdup /* strdup exists as a function and as a macro. Get rid of the macro. */ # undef strdup # endif # if !(@HAVE_DECL_STRDUP@ || defined strdup) _GL_FUNCDECL_SYS (strdup, char *, (char const *__s) _GL_ARG_NONNULL ((1))); # endif _GL_CXXALIAS_SYS (strdup, char *, (char const *__s)); # endif _GL_CXXALIASWARN (strdup); #elif defined GNULIB_POSIXCHECK # undef strdup # if HAVE_RAW_DECL_STRDUP _GL_WARN_ON_USE (strdup, "strdup is unportable - " "use gnulib module strdup for portability"); # endif #endif /* Append no more than N characters from SRC onto DEST. */ #if @GNULIB_STRNCAT@ # if @REPLACE_STRNCAT@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef strncat # define strncat rpl_strncat # endif _GL_FUNCDECL_RPL (strncat, char *, (char *restrict dest, const char *restrict src, size_t n) _GL_ARG_NONNULL ((1, 2))); _GL_CXXALIAS_RPL (strncat, char *, (char *restrict dest, const char *restrict src, size_t n)); # else _GL_CXXALIAS_SYS (strncat, char *, (char *restrict dest, const char *restrict src, size_t n)); # endif # if __GLIBC__ >= 2 _GL_CXXALIASWARN (strncat); # endif #elif defined GNULIB_POSIXCHECK # undef strncat # if HAVE_RAW_DECL_STRNCAT _GL_WARN_ON_USE (strncat, "strncat is unportable - " "use gnulib module strncat for portability"); # endif #endif /* Return a newly allocated copy of at most N bytes of STRING. */ #if @GNULIB_STRNDUP@ # if @REPLACE_STRNDUP@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef strndup # define strndup rpl_strndup # endif _GL_FUNCDECL_RPL (strndup, char *, (char const *__s, size_t __n) _GL_ARG_NONNULL ((1))); _GL_CXXALIAS_RPL (strndup, char *, (char const *__s, size_t __n)); # else # if ! @HAVE_DECL_STRNDUP@ _GL_FUNCDECL_SYS (strndup, char *, (char const *__s, size_t __n) _GL_ARG_NONNULL ((1))); # endif _GL_CXXALIAS_SYS (strndup, char *, (char const *__s, size_t __n)); # endif _GL_CXXALIASWARN (strndup); #elif defined GNULIB_POSIXCHECK # undef strndup # if HAVE_RAW_DECL_STRNDUP _GL_WARN_ON_USE (strndup, "strndup is unportable - " "use gnulib module strndup for portability"); # endif #endif /* Find the length (number of bytes) of STRING, but scan at most MAXLEN bytes. If no '\0' terminator is found in that many bytes, return MAXLEN. */ #if @GNULIB_STRNLEN@ # if @REPLACE_STRNLEN@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef strnlen # define strnlen rpl_strnlen # endif _GL_FUNCDECL_RPL (strnlen, size_t, (char const *__s, size_t __maxlen) _GL_ATTRIBUTE_PURE _GL_ARG_NONNULL ((1))); _GL_CXXALIAS_RPL (strnlen, size_t, (char const *__s, size_t __maxlen)); # else # if ! @HAVE_DECL_STRNLEN@ _GL_FUNCDECL_SYS (strnlen, size_t, (char const *__s, size_t __maxlen) _GL_ATTRIBUTE_PURE _GL_ARG_NONNULL ((1))); # endif _GL_CXXALIAS_SYS (strnlen, size_t, (char const *__s, size_t __maxlen)); # endif _GL_CXXALIASWARN (strnlen); #elif defined GNULIB_POSIXCHECK # undef strnlen # if HAVE_RAW_DECL_STRNLEN _GL_WARN_ON_USE (strnlen, "strnlen is unportable - " "use gnulib module strnlen for portability"); # endif #endif #if defined GNULIB_POSIXCHECK /* strcspn() assumes the second argument is a list of single-byte characters. Even in this simple case, it does not work with multibyte strings if the locale encoding is GB18030 and one of the characters to be searched is a digit. */ # undef strcspn /* Assume strcspn is always declared. */ _GL_WARN_ON_USE (strcspn, "strcspn cannot work correctly on character strings " "in multibyte locales - " "use mbscspn if you care about internationalization"); #endif /* Find the first occurrence in S of any character in ACCEPT. */ #if @GNULIB_STRPBRK@ # if ! @HAVE_STRPBRK@ _GL_FUNCDECL_SYS (strpbrk, char *, (char const *__s, char const *__accept) _GL_ATTRIBUTE_PURE _GL_ARG_NONNULL ((1, 2))); # endif /* On some systems, this function is defined as an overloaded function: extern "C" { const char * strpbrk (const char *, const char *); } extern "C++" { char * strpbrk (char *, const char *); } */ _GL_CXXALIAS_SYS_CAST2 (strpbrk, char *, (char const *__s, char const *__accept), const char *, (char const *__s, char const *__accept)); # if ((__GLIBC__ == 2 && __GLIBC_MINOR__ >= 10) && !defined __UCLIBC__) \ && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4)) _GL_CXXALIASWARN1 (strpbrk, char *, (char *__s, char const *__accept)); _GL_CXXALIASWARN1 (strpbrk, char const *, (char const *__s, char const *__accept)); # elif __GLIBC__ >= 2 _GL_CXXALIASWARN (strpbrk); # endif # if defined GNULIB_POSIXCHECK /* strpbrk() assumes the second argument is a list of single-byte characters. Even in this simple case, it does not work with multibyte strings if the locale encoding is GB18030 and one of the characters to be searched is a digit. */ # undef strpbrk _GL_WARN_ON_USE_CXX (strpbrk, const char *, (const char *, const char *), "strpbrk cannot work correctly on character strings " "in multibyte locales - " "use mbspbrk if you care about internationalization"); # endif #elif defined GNULIB_POSIXCHECK # undef strpbrk # if HAVE_RAW_DECL_STRPBRK _GL_WARN_ON_USE_CXX (strpbrk, const char *, (const char *, const char *), "strpbrk is unportable - " "use gnulib module strpbrk for portability"); # endif #endif #if defined GNULIB_POSIXCHECK /* strspn() assumes the second argument is a list of single-byte characters. Even in this simple case, it cannot work with multibyte strings. */ # undef strspn /* Assume strspn is always declared. */ _GL_WARN_ON_USE (strspn, "strspn cannot work correctly on character strings " "in multibyte locales - " "use mbsspn if you care about internationalization"); #endif #if defined GNULIB_POSIXCHECK /* strrchr() does not work with multibyte strings if the locale encoding is GB18030 and the character to be searched is a digit. */ # undef strrchr /* Assume strrchr is always declared. */ _GL_WARN_ON_USE_CXX (strrchr, const char *, (const char *, int), "strrchr cannot work correctly on character strings " "in some multibyte locales - " "use mbsrchr if you care about internationalization"); #endif /* Search the next delimiter (char listed in DELIM) starting at *STRINGP. If one is found, overwrite it with a NUL, and advance *STRINGP to point to the next char after it. Otherwise, set *STRINGP to NULL. If *STRINGP was already NULL, nothing happens. Return the old value of *STRINGP. This is a variant of strtok() that is multithread-safe and supports empty fields. Caveat: It modifies the original string. Caveat: These functions cannot be used on constant strings. Caveat: The identity of the delimiting character is lost. Caveat: It doesn't work with multibyte strings unless all of the delimiter characters are ASCII characters < 0x30. See also strtok_r(). */ #if @GNULIB_STRSEP@ # if ! @HAVE_STRSEP@ _GL_FUNCDECL_SYS (strsep, char *, (char **restrict __stringp, char const *restrict __delim) _GL_ARG_NONNULL ((1, 2))); # endif _GL_CXXALIAS_SYS (strsep, char *, (char **restrict __stringp, char const *restrict __delim)); _GL_CXXALIASWARN (strsep); # if defined GNULIB_POSIXCHECK # undef strsep _GL_WARN_ON_USE (strsep, "strsep cannot work correctly on character strings " "in multibyte locales - " "use mbssep if you care about internationalization"); # endif #elif defined GNULIB_POSIXCHECK # undef strsep # if HAVE_RAW_DECL_STRSEP _GL_WARN_ON_USE (strsep, "strsep is unportable - " "use gnulib module strsep for portability"); # endif #endif #if @GNULIB_STRSTR@ # if @REPLACE_STRSTR@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # define strstr rpl_strstr # endif _GL_FUNCDECL_RPL (strstr, char *, (const char *haystack, const char *needle) _GL_ATTRIBUTE_PURE _GL_ARG_NONNULL ((1, 2))); _GL_CXXALIAS_RPL (strstr, char *, (const char *haystack, const char *needle)); # else /* On some systems, this function is defined as an overloaded function: extern "C++" { const char * strstr (const char *, const char *); } extern "C++" { char * strstr (char *, const char *); } */ _GL_CXXALIAS_SYS_CAST2 (strstr, char *, (const char *haystack, const char *needle), const char *, (const char *haystack, const char *needle)); # endif # if ((__GLIBC__ == 2 && __GLIBC_MINOR__ >= 10) && !defined __UCLIBC__) \ && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4)) _GL_CXXALIASWARN1 (strstr, char *, (char *haystack, const char *needle)); _GL_CXXALIASWARN1 (strstr, const char *, (const char *haystack, const char *needle)); # elif __GLIBC__ >= 2 _GL_CXXALIASWARN (strstr); # endif #elif defined GNULIB_POSIXCHECK /* strstr() does not work with multibyte strings if the locale encoding is different from UTF-8: POSIX says that it operates on "strings", and "string" in POSIX is defined as a sequence of bytes, not of characters. */ # undef strstr /* Assume strstr is always declared. */ _GL_WARN_ON_USE (strstr, "strstr is quadratic on many systems, and cannot " "work correctly on character strings in most " "multibyte locales - " "use mbsstr if you care about internationalization, " "or use strstr if you care about speed"); #endif /* Find the first occurrence of NEEDLE in HAYSTACK, using case-insensitive comparison. */ #if @GNULIB_STRCASESTR@ # if @REPLACE_STRCASESTR@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # define strcasestr rpl_strcasestr # endif _GL_FUNCDECL_RPL (strcasestr, char *, (const char *haystack, const char *needle) _GL_ATTRIBUTE_PURE _GL_ARG_NONNULL ((1, 2))); _GL_CXXALIAS_RPL (strcasestr, char *, (const char *haystack, const char *needle)); # else # if ! @HAVE_STRCASESTR@ _GL_FUNCDECL_SYS (strcasestr, char *, (const char *haystack, const char *needle) _GL_ATTRIBUTE_PURE _GL_ARG_NONNULL ((1, 2))); # endif /* On some systems, this function is defined as an overloaded function: extern "C++" { const char * strcasestr (const char *, const char *); } extern "C++" { char * strcasestr (char *, const char *); } */ _GL_CXXALIAS_SYS_CAST2 (strcasestr, char *, (const char *haystack, const char *needle), const char *, (const char *haystack, const char *needle)); # endif # if ((__GLIBC__ == 2 && __GLIBC_MINOR__ >= 10) && !defined __UCLIBC__) \ && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4)) _GL_CXXALIASWARN1 (strcasestr, char *, (char *haystack, const char *needle)); _GL_CXXALIASWARN1 (strcasestr, const char *, (const char *haystack, const char *needle)); # else _GL_CXXALIASWARN (strcasestr); # endif #elif defined GNULIB_POSIXCHECK /* strcasestr() does not work with multibyte strings: It is a glibc extension, and glibc implements it only for unibyte locales. */ # undef strcasestr # if HAVE_RAW_DECL_STRCASESTR _GL_WARN_ON_USE (strcasestr, "strcasestr does work correctly on character " "strings in multibyte locales - " "use mbscasestr if you care about " "internationalization, or use c-strcasestr if you want " "a locale independent function"); # endif #endif /* Parse S into tokens separated by characters in DELIM. If S is NULL, the saved pointer in SAVE_PTR is used as the next starting point. For example: char s[] = "-abc-=-def"; char *sp; x = strtok_r(s, "-", &sp); // x = "abc", sp = "=-def" x = strtok_r(NULL, "-=", &sp); // x = "def", sp = NULL x = strtok_r(NULL, "=", &sp); // x = NULL // s = "abc\0-def\0" This is a variant of strtok() that is multithread-safe. For the POSIX documentation for this function, see: https://pubs.opengroup.org/onlinepubs/9699919799/functions/strtok.html Caveat: It modifies the original string. Caveat: These functions cannot be used on constant strings. Caveat: The identity of the delimiting character is lost. Caveat: It doesn't work with multibyte strings unless all of the delimiter characters are ASCII characters < 0x30. See also strsep(). */ #if @GNULIB_STRTOK_R@ # if @REPLACE_STRTOK_R@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef strtok_r # define strtok_r rpl_strtok_r # endif _GL_FUNCDECL_RPL (strtok_r, char *, (char *restrict s, char const *restrict delim, char **restrict save_ptr) _GL_ARG_NONNULL ((2, 3))); _GL_CXXALIAS_RPL (strtok_r, char *, (char *restrict s, char const *restrict delim, char **restrict save_ptr)); # else # if @UNDEFINE_STRTOK_R@ || defined GNULIB_POSIXCHECK # undef strtok_r # endif # if ! @HAVE_DECL_STRTOK_R@ _GL_FUNCDECL_SYS (strtok_r, char *, (char *restrict s, char const *restrict delim, char **restrict save_ptr) _GL_ARG_NONNULL ((2, 3))); # endif _GL_CXXALIAS_SYS (strtok_r, char *, (char *restrict s, char const *restrict delim, char **restrict save_ptr)); # endif _GL_CXXALIASWARN (strtok_r); # if defined GNULIB_POSIXCHECK _GL_WARN_ON_USE (strtok_r, "strtok_r cannot work correctly on character " "strings in multibyte locales - " "use mbstok_r if you care about internationalization"); # endif #elif defined GNULIB_POSIXCHECK # undef strtok_r # if HAVE_RAW_DECL_STRTOK_R _GL_WARN_ON_USE (strtok_r, "strtok_r is unportable - " "use gnulib module strtok_r for portability"); # endif #endif /* The following functions are not specified by POSIX. They are gnulib extensions. */ #if @GNULIB_MBSLEN@ /* Return the number of multibyte characters in the character string STRING. This considers multibyte characters, unlike strlen, which counts bytes. */ # ifdef __MirBSD__ /* MirBSD defines mbslen as a macro. Override it. */ # undef mbslen # endif # if @HAVE_MBSLEN@ /* AIX, OSF/1, MirBSD define mbslen already in libc. */ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # define mbslen rpl_mbslen # endif _GL_FUNCDECL_RPL (mbslen, size_t, (const char *string) _GL_ATTRIBUTE_PURE _GL_ARG_NONNULL ((1))); _GL_CXXALIAS_RPL (mbslen, size_t, (const char *string)); # else _GL_FUNCDECL_SYS (mbslen, size_t, (const char *string) _GL_ATTRIBUTE_PURE _GL_ARG_NONNULL ((1))); _GL_CXXALIAS_SYS (mbslen, size_t, (const char *string)); # endif _GL_CXXALIASWARN (mbslen); #endif #if @GNULIB_MBSNLEN@ /* Return the number of multibyte characters in the character string starting at STRING and ending at STRING + LEN. */ _GL_EXTERN_C size_t mbsnlen (const char *string, size_t len) _GL_ATTRIBUTE_PURE _GL_ARG_NONNULL ((1)); #endif #if @GNULIB_MBSCHR@ /* Locate the first single-byte character C in the character string STRING, and return a pointer to it. Return NULL if C is not found in STRING. Unlike strchr(), this function works correctly in multibyte locales with encodings such as GB18030. */ # if defined __hpux # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # define mbschr rpl_mbschr /* avoid collision with HP-UX function */ # endif _GL_FUNCDECL_RPL (mbschr, char *, (const char *string, int c) _GL_ATTRIBUTE_PURE _GL_ARG_NONNULL ((1))); _GL_CXXALIAS_RPL (mbschr, char *, (const char *string, int c)); # else _GL_FUNCDECL_SYS (mbschr, char *, (const char *string, int c) _GL_ATTRIBUTE_PURE _GL_ARG_NONNULL ((1))); _GL_CXXALIAS_SYS (mbschr, char *, (const char *string, int c)); # endif _GL_CXXALIASWARN (mbschr); #endif #if @GNULIB_MBSRCHR@ /* Locate the last single-byte character C in the character string STRING, and return a pointer to it. Return NULL if C is not found in STRING. Unlike strrchr(), this function works correctly in multibyte locales with encodings such as GB18030. */ # if defined __hpux || defined __INTERIX # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # define mbsrchr rpl_mbsrchr /* avoid collision with system function */ # endif _GL_FUNCDECL_RPL (mbsrchr, char *, (const char *string, int c) _GL_ATTRIBUTE_PURE _GL_ARG_NONNULL ((1))); _GL_CXXALIAS_RPL (mbsrchr, char *, (const char *string, int c)); # else _GL_FUNCDECL_SYS (mbsrchr, char *, (const char *string, int c) _GL_ATTRIBUTE_PURE _GL_ARG_NONNULL ((1))); _GL_CXXALIAS_SYS (mbsrchr, char *, (const char *string, int c)); # endif _GL_CXXALIASWARN (mbsrchr); #endif #if @GNULIB_MBSSTR@ /* Find the first occurrence of the character string NEEDLE in the character string HAYSTACK. Return NULL if NEEDLE is not found in HAYSTACK. Unlike strstr(), this function works correctly in multibyte locales with encodings different from UTF-8. */ _GL_EXTERN_C char * mbsstr (const char *haystack, const char *needle) _GL_ATTRIBUTE_PURE _GL_ARG_NONNULL ((1, 2)); #endif #if @GNULIB_MBSCASECMP@ /* Compare the character strings S1 and S2, ignoring case, returning less than, equal to or greater than zero if S1 is lexicographically less than, equal to or greater than S2. Note: This function may, in multibyte locales, return 0 for strings of different lengths! Unlike strcasecmp(), this function works correctly in multibyte locales. */ _GL_EXTERN_C int mbscasecmp (const char *s1, const char *s2) _GL_ATTRIBUTE_PURE _GL_ARG_NONNULL ((1, 2)); #endif #if @GNULIB_MBSNCASECMP@ /* Compare the initial segment of the character string S1 consisting of at most N characters with the initial segment of the character string S2 consisting of at most N characters, ignoring case, returning less than, equal to or greater than zero if the initial segment of S1 is lexicographically less than, equal to or greater than the initial segment of S2. Note: This function may, in multibyte locales, return 0 for initial segments of different lengths! Unlike strncasecmp(), this function works correctly in multibyte locales. But beware that N is not a byte count but a character count! */ _GL_EXTERN_C int mbsncasecmp (const char *s1, const char *s2, size_t n) _GL_ATTRIBUTE_PURE _GL_ARG_NONNULL ((1, 2)); #endif #if @GNULIB_MBSPCASECMP@ /* Compare the initial segment of the character string STRING consisting of at most mbslen (PREFIX) characters with the character string PREFIX, ignoring case. If the two match, return a pointer to the first byte after this prefix in STRING. Otherwise, return NULL. Note: This function may, in multibyte locales, return non-NULL if STRING is of smaller length than PREFIX! Unlike strncasecmp(), this function works correctly in multibyte locales. */ _GL_EXTERN_C char * mbspcasecmp (const char *string, const char *prefix) _GL_ATTRIBUTE_PURE _GL_ARG_NONNULL ((1, 2)); #endif #if @GNULIB_MBSCASESTR@ /* Find the first occurrence of the character string NEEDLE in the character string HAYSTACK, using case-insensitive comparison. Note: This function may, in multibyte locales, return success even if strlen (haystack) < strlen (needle) ! Unlike strcasestr(), this function works correctly in multibyte locales. */ _GL_EXTERN_C char * mbscasestr (const char *haystack, const char *needle) _GL_ATTRIBUTE_PURE _GL_ARG_NONNULL ((1, 2)); #endif #if @GNULIB_MBSCSPN@ /* Find the first occurrence in the character string STRING of any character in the character string ACCEPT. Return the number of bytes from the beginning of the string to this occurrence, or to the end of the string if none exists. Unlike strcspn(), this function works correctly in multibyte locales. */ _GL_EXTERN_C size_t mbscspn (const char *string, const char *accept) _GL_ATTRIBUTE_PURE _GL_ARG_NONNULL ((1, 2)); #endif #if @GNULIB_MBSPBRK@ /* Find the first occurrence in the character string STRING of any character in the character string ACCEPT. Return the pointer to it, or NULL if none exists. Unlike strpbrk(), this function works correctly in multibyte locales. */ # if defined __hpux # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # define mbspbrk rpl_mbspbrk /* avoid collision with HP-UX function */ # endif _GL_FUNCDECL_RPL (mbspbrk, char *, (const char *string, const char *accept) _GL_ATTRIBUTE_PURE _GL_ARG_NONNULL ((1, 2))); _GL_CXXALIAS_RPL (mbspbrk, char *, (const char *string, const char *accept)); # else _GL_FUNCDECL_SYS (mbspbrk, char *, (const char *string, const char *accept) _GL_ATTRIBUTE_PURE _GL_ARG_NONNULL ((1, 2))); _GL_CXXALIAS_SYS (mbspbrk, char *, (const char *string, const char *accept)); # endif _GL_CXXALIASWARN (mbspbrk); #endif #if @GNULIB_MBSSPN@ /* Find the first occurrence in the character string STRING of any character not in the character string REJECT. Return the number of bytes from the beginning of the string to this occurrence, or to the end of the string if none exists. Unlike strspn(), this function works correctly in multibyte locales. */ _GL_EXTERN_C size_t mbsspn (const char *string, const char *reject) _GL_ATTRIBUTE_PURE _GL_ARG_NONNULL ((1, 2)); #endif #if @GNULIB_MBSSEP@ /* Search the next delimiter (multibyte character listed in the character string DELIM) starting at the character string *STRINGP. If one is found, overwrite it with a NUL, and advance *STRINGP to point to the next multibyte character after it. Otherwise, set *STRINGP to NULL. If *STRINGP was already NULL, nothing happens. Return the old value of *STRINGP. This is a variant of mbstok_r() that supports empty fields. Caveat: It modifies the original string. Caveat: These functions cannot be used on constant strings. Caveat: The identity of the delimiting character is lost. See also mbstok_r(). */ _GL_EXTERN_C char * mbssep (char **stringp, const char *delim) _GL_ARG_NONNULL ((1, 2)); #endif #if @GNULIB_MBSTOK_R@ /* Parse the character string STRING into tokens separated by characters in the character string DELIM. If STRING is NULL, the saved pointer in SAVE_PTR is used as the next starting point. For example: char s[] = "-abc-=-def"; char *sp; x = mbstok_r(s, "-", &sp); // x = "abc", sp = "=-def" x = mbstok_r(NULL, "-=", &sp); // x = "def", sp = NULL x = mbstok_r(NULL, "=", &sp); // x = NULL // s = "abc\0-def\0" Caveat: It modifies the original string. Caveat: These functions cannot be used on constant strings. Caveat: The identity of the delimiting character is lost. See also mbssep(). */ _GL_EXTERN_C char * mbstok_r (char *restrict string, const char *delim, char **save_ptr) _GL_ARG_NONNULL ((2, 3)); #endif /* Map any int, typically from errno, into an error message. */ #if @GNULIB_STRERROR@ # if @REPLACE_STRERROR@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef strerror # define strerror rpl_strerror # endif _GL_FUNCDECL_RPL (strerror, char *, (int)); _GL_CXXALIAS_RPL (strerror, char *, (int)); # else _GL_CXXALIAS_SYS (strerror, char *, (int)); # endif # if __GLIBC__ >= 2 _GL_CXXALIASWARN (strerror); # endif #elif defined GNULIB_POSIXCHECK # undef strerror /* Assume strerror is always declared. */ _GL_WARN_ON_USE (strerror, "strerror is unportable - " "use gnulib module strerror to guarantee non-NULL result"); #endif /* Map any int, typically from errno, into an error message. Multithread-safe. Uses the POSIX declaration, not the glibc declaration. */ #if @GNULIB_STRERROR_R@ # if @REPLACE_STRERROR_R@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef strerror_r # define strerror_r rpl_strerror_r # endif _GL_FUNCDECL_RPL (strerror_r, int, (int errnum, char *buf, size_t buflen) _GL_ARG_NONNULL ((2))); _GL_CXXALIAS_RPL (strerror_r, int, (int errnum, char *buf, size_t buflen)); # else # if !@HAVE_DECL_STRERROR_R@ _GL_FUNCDECL_SYS (strerror_r, int, (int errnum, char *buf, size_t buflen) _GL_ARG_NONNULL ((2))); # endif _GL_CXXALIAS_SYS (strerror_r, int, (int errnum, char *buf, size_t buflen)); # endif # if @HAVE_DECL_STRERROR_R@ _GL_CXXALIASWARN (strerror_r); # endif #elif defined GNULIB_POSIXCHECK # undef strerror_r # if HAVE_RAW_DECL_STRERROR_R _GL_WARN_ON_USE (strerror_r, "strerror_r is unportable - " "use gnulib module strerror_r-posix for portability"); # endif #endif #if @GNULIB_STRSIGNAL@ # if @REPLACE_STRSIGNAL@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # define strsignal rpl_strsignal # endif _GL_FUNCDECL_RPL (strsignal, char *, (int __sig)); _GL_CXXALIAS_RPL (strsignal, char *, (int __sig)); # else # if ! @HAVE_DECL_STRSIGNAL@ _GL_FUNCDECL_SYS (strsignal, char *, (int __sig)); # endif /* Need to cast, because on Cygwin 1.5.x systems, the return type is 'const char *'. */ _GL_CXXALIAS_SYS_CAST (strsignal, char *, (int __sig)); # endif _GL_CXXALIASWARN (strsignal); #elif defined GNULIB_POSIXCHECK # undef strsignal # if HAVE_RAW_DECL_STRSIGNAL _GL_WARN_ON_USE (strsignal, "strsignal is unportable - " "use gnulib module strsignal for portability"); # endif #endif #if @GNULIB_STRVERSCMP@ # if !@HAVE_STRVERSCMP@ _GL_FUNCDECL_SYS (strverscmp, int, (const char *, const char *) _GL_ATTRIBUTE_PURE _GL_ARG_NONNULL ((1, 2))); # endif _GL_CXXALIAS_SYS (strverscmp, int, (const char *, const char *)); _GL_CXXALIASWARN (strverscmp); #elif defined GNULIB_POSIXCHECK # undef strverscmp # if HAVE_RAW_DECL_STRVERSCMP _GL_WARN_ON_USE (strverscmp, "strverscmp is unportable - " "use gnulib module strverscmp for portability"); # endif #endif #endif /* _@GUARD_PREFIX@_STRING_H */ #endif /* _@GUARD_PREFIX@_STRING_H */ #endif pspp-1.4.1/gl/getprogname.c0000644000175000017500000002022313723215637015201 0ustar00blpblp00000000000000/* Program name management. Copyright (C) 2016-2020 Free Software Foundation, Inc. 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 3 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, see . */ #include /* Specification. */ #include "getprogname.h" #include /* get program_invocation_name declaration */ #include /* get __argv declaration */ #ifdef _AIX # include # include # include #endif #ifdef __MVS__ # ifndef _OPEN_SYS # define _OPEN_SYS # endif # include # include #endif #ifdef __hpux # include # include # include # include #endif #ifdef __sgi # include # include # include # include # include #endif #include "basename-lgpl.h" #ifndef HAVE_GETPROGNAME /* not Mac OS X, FreeBSD, NetBSD, OpenBSD >= 5.4, Cygwin */ char const * getprogname (void) { # if HAVE_DECL_PROGRAM_INVOCATION_SHORT_NAME /* glibc, BeOS */ /* https://www.gnu.org/software/libc/manual/html_node/Error-Messages.html */ return program_invocation_short_name; # elif HAVE_DECL_PROGRAM_INVOCATION_NAME /* glibc, BeOS */ /* https://www.gnu.org/software/libc/manual/html_node/Error-Messages.html */ return last_component (program_invocation_name); # elif HAVE_GETEXECNAME /* Solaris */ /* https://docs.oracle.com/cd/E19253-01/816-5168/6mbb3hrb1/index.html */ const char *p = getexecname (); if (!p) p = "?"; return last_component (p); # elif HAVE_DECL___ARGV /* mingw, MSVC */ /* https://docs.microsoft.com/en-us/cpp/c-runtime-library/argc-argv-wargv */ const char *p = __argv && __argv[0] ? __argv[0] : "?"; return last_component (p); # elif HAVE_VAR___PROGNAME /* OpenBSD, Android, QNX */ /* https://man.openbsd.org/style.9 */ /* http://www.qnx.de/developers/docs/6.5.0/index.jsp?topic=%2Fcom.qnx.doc.neutrino_lib_ref%2Fp%2F__progname.html */ /* Be careful to declare this only when we absolutely need it (OpenBSD 5.1), rather than when it's available. Otherwise, its mere declaration makes program_invocation_short_name malfunction (have zero length) with Fedora 25's glibc. */ extern char *__progname; const char *p = __progname; # if defined __ANDROID__ return last_component (p); # else return p && p[0] ? p : "?"; # endif # elif _AIX /* AIX */ /* Idea by Bastien ROUCARIÈS, https://lists.gnu.org/r/bug-gnulib/2010-12/msg00095.html Reference: https://www.ibm.com/support/knowledgecenter/en/ssw_aix_61/com.ibm.aix.basetrf1/getprocs.htm */ static char *p; static int first = 1; if (first) { first = 0; pid_t pid = getpid (); struct procentry64 procs; p = (0 < getprocs64 (&procs, sizeof procs, NULL, 0, &pid, 1) ? strdup (procs.pi_comm) : NULL); if (!p) p = "?"; } return p; # elif defined __hpux static char *p; static int first = 1; if (first) { first = 0; pid_t pid = getpid (); struct pst_status status; if (pstat_getproc (&status, sizeof status, 0, pid) > 0) { char *ucomm = status.pst_ucomm; char *cmd = status.pst_cmd; if (strlen (ucomm) < PST_UCOMMLEN - 1) p = ucomm; else { /* ucomm is truncated to length PST_UCOMMLEN - 1. Look at cmd instead. */ char *space = strchr (cmd, ' '); if (space != NULL) *space = '\0'; p = strrchr (cmd, '/'); if (p != NULL) p++; else p = cmd; if (strlen (p) > PST_UCOMMLEN - 1 && memcmp (p, ucomm, PST_UCOMMLEN - 1) == 0) /* p is less truncated than ucomm. */ ; else p = ucomm; } p = strdup (p); } else { # if !defined __LP64__ /* Support for 32-bit programs running in 64-bit HP-UX. The documented way to do this is to use the same source code as above, but in a compilation unit where '#define _PSTAT64 1' is in effect. I prefer a single compilation unit; the struct size and the offsets are not going to change. */ char status64[1216]; if (__pstat_getproc64 (status64, sizeof status64, 0, pid) > 0) { char *ucomm = status64 + 288; char *cmd = status64 + 168; if (strlen (ucomm) < PST_UCOMMLEN - 1) p = ucomm; else { /* ucomm is truncated to length PST_UCOMMLEN - 1. Look at cmd instead. */ char *space = strchr (cmd, ' '); if (space != NULL) *space = '\0'; p = strrchr (cmd, '/'); if (p != NULL) p++; else p = cmd; if (strlen (p) > PST_UCOMMLEN - 1 && memcmp (p, ucomm, PST_UCOMMLEN - 1) == 0) /* p is less truncated than ucomm. */ ; else p = ucomm; } p = strdup (p); } else # endif p = NULL; } if (!p) p = "?"; } return p; # elif __MVS__ /* z/OS */ /* https://www.ibm.com/support/knowledgecenter/SSLTBW_2.1.0/com.ibm.zos.v2r1.bpxbd00/rtwgetp.htm */ static char *p = "?"; static int first = 1; if (first) { pid_t pid = getpid (); int token; W_PSPROC buf; first = 0; memset (&buf, 0, sizeof(buf)); buf.ps_cmdptr = (char *) malloc (buf.ps_cmdlen = PS_CMDBLEN_LONG); buf.ps_conttyptr = (char *) malloc (buf.ps_conttylen = PS_CONTTYBLEN); buf.ps_pathptr = (char *) malloc (buf.ps_pathlen = PS_PATHBLEN); if (buf.ps_cmdptr && buf.ps_conttyptr && buf.ps_pathptr) { for (token = 0; token >= 0; token = w_getpsent (token, &buf, sizeof(buf))) { if (token > 0 && buf.ps_pid == pid) { char *s = strdup (last_component (buf.ps_pathptr)); if (s) p = s; break; } } } free (buf.ps_cmdptr); free (buf.ps_conttyptr); free (buf.ps_pathptr); } return p; # elif defined __sgi /* IRIX */ char filename[50]; int fd; sprintf (filename, "/proc/pinfo/%d", (int) getpid ()); fd = open (filename, O_RDONLY | O_CLOEXEC); if (0 <= fd) { prpsinfo_t buf; int ioctl_ok = 0 <= ioctl (fd, PIOCPSINFO, &buf); close (fd); if (ioctl_ok) { char *name = buf.pr_fname; size_t namesize = sizeof buf.pr_fname; /* It may not be NUL-terminated. */ char *namenul = memchr (name, '\0', namesize); size_t namelen = namenul ? namenul - name : namesize; char *namecopy = malloc (namelen + 1); if (namecopy) { namecopy[namelen] = '\0'; return memcpy (namecopy, name, namelen); } } } return NULL; # else # error "getprogname module not ported to this OS" # endif } #endif /* * Hey Emacs! * Local Variables: * coding: utf-8 * End: */ pspp-1.4.1/gl/careadlinkat.h0000644000175000017500000000476713723215636015336 0ustar00blpblp00000000000000/* Read symbolic links into a buffer without size limitation, relative to fd. Copyright (C) 2011-2020 Free Software Foundation, Inc. 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 3 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, see . */ /* Written by Paul Eggert, Bruno Haible, and Jim Meyering. */ #ifndef _GL_CAREADLINKAT_H #define _GL_CAREADLINKAT_H #include #include struct allocator; /* Assuming the current directory is FD, get the symbolic link value of FILENAME as a null-terminated string and put it into a buffer. If FD is AT_FDCWD, FILENAME is interpreted relative to the current working directory, as in openat. If the link is small enough to fit into BUFFER put it there. BUFFER's size is BUFFER_SIZE, and BUFFER can be null if BUFFER_SIZE is zero. If the link is not small, put it into a dynamically allocated buffer managed by ALLOC. It is the caller's responsibility to free the returned value if it is nonnull and is not BUFFER. The PREADLINKAT function specifies how to read links. It operates like POSIX readlinkat() but can assume that its first argument is the same as FD. If successful, return the buffer address; otherwise return NULL and set errno. */ char *careadlinkat (int fd, char const *filename, char *restrict buffer, size_t buffer_size, struct allocator const *alloc, ssize_t (*preadlinkat) (int, char const *, char *, size_t)); /* Suitable value for careadlinkat's FD argument. */ #if HAVE_READLINKAT /* AT_FDCWD is declared in . */ #else /* Define AT_FDCWD independently, so that the careadlinkat module does not depend on the fcntl-h module. We might as well use the same value as fcntl-h. */ # ifndef AT_FDCWD # define AT_FDCWD (-3041965) # endif #endif #endif /* _GL_CAREADLINKAT_H */ pspp-1.4.1/gl/c-xvasprintf.c0000644000175000017500000000220313723215636015312 0ustar00blpblp00000000000000/* vasprintf with out-of-memory checking in C locale. Copyright (C) 1999, 2002-2004, 2006-2020 Free Software Foundation, Inc. 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 3 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, see . */ #include /* Specification. */ #include "c-xvasprintf.h" #include #include #include "c-vasprintf.h" #include "xalloc.h" char * c_xvasprintf (const char *format, va_list args) { char *result; if (c_vasprintf (&result, format, args) < 0) { if (errno == ENOMEM) xalloc_die (); return NULL; } return result; } pspp-1.4.1/gl/sys_random.in.h0000644000175000017500000000544313723215640015462 0ustar00blpblp00000000000000/* Substitute for . Copyright (C) 2020 Free Software Foundation, Inc. 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 3, 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, see . */ # if __GNUC__ >= 3 @PRAGMA_SYSTEM_HEADER@ # endif @PRAGMA_COLUMNS@ #ifndef _@GUARD_PREFIX@_SYS_RANDOM_H #if @HAVE_SYS_RANDOM_H@ /* On Mac OS X 10.5, assumes prior inclusion of . On Max OS X 10.13, assumes prior inclusion of a file that includes , such as or . */ # if defined __APPLE__ && defined __MACH__ /* Mac OS X */ # include # include # endif /* The include_next requires a split double-inclusion guard. */ # @INCLUDE_NEXT@ @NEXT_SYS_RANDOM_H@ #endif #ifndef _@GUARD_PREFIX@_SYS_RANDOM_H #define _@GUARD_PREFIX@_SYS_RANDOM_H #include /* Define the GRND_* constants. */ #ifndef GRND_NONBLOCK # define GRND_NONBLOCK 1 # define GRND_RANDOM 2 #endif /* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */ /* The definition of _GL_ARG_NONNULL is copied here. */ /* The definition of _GL_WARN_ON_USE is copied here. */ /* Declare overridden functions. */ #if @GNULIB_GETRANDOM@ /* Fill a buffer with random bytes. */ # if @REPLACE_GETRANDOM@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef getrandom # define getrandom rpl_getrandom # endif _GL_FUNCDECL_RPL (getrandom, ssize_t, (void *buffer, size_t length, unsigned int flags) _GL_ARG_NONNULL ((1))); _GL_CXXALIAS_RPL (getrandom, ssize_t, (void *buffer, size_t length, unsigned int flags)); # else # if !@HAVE_GETRANDOM@ _GL_FUNCDECL_SYS (getrandom, ssize_t, (void *buffer, size_t length, unsigned int flags) _GL_ARG_NONNULL ((1))); # endif _GL_CXXALIAS_SYS (getrandom, ssize_t, (void *buffer, size_t length, unsigned int flags)); # endif _GL_CXXALIASWARN (getrandom); #elif defined GNULIB_POSIXCHECK # undef getrandom # if HAVE_RAW_DECL_GETRANDOM _GL_WARN_ON_USE (getrandom, "getrandom is unportable - " "use gnulib module getrandom for portability"); # endif #endif #endif /* _@GUARD_PREFIX@_SYS_RANDOM_H */ #endif /* _@GUARD_PREFIX@_SYS_RANDOM_H */ pspp-1.4.1/gl/isfinite.c0000644000175000017500000000276113723215637014512 0ustar00blpblp00000000000000/* Test for finite value (zero, subnormal, or normal, and not infinite or NaN). Copyright (C) 2007-2020 Free Software Foundation, Inc. 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 3, 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, see . */ /* Written by Ben Pfaff , 2007. */ #include #include "isnanf-nolibm.h" #include "isnand-nolibm.h" #include "isnanl-nolibm.h" /* The "cc" compiler on HP-UX 11.11, when optimizing, simplifies the test x - y == 0.0 to x == y, a simplification which is invalid when x and y are Infinity. Disable this optimization. */ #if defined __hpux && !defined __GNUC__ static float zerof; static double zerod; static long double zerol; #else # define zerof 0.f # define zerod 0. # define zerol 0.L #endif int gl_isfinitef (float x) { return !isnanf (x) && x - x == zerof; } int gl_isfinited (double x) { return !isnand (x) && x - x == zerod; } int gl_isfinitel (long double x) { return !isnanl (x) && x - x == zerol; } pspp-1.4.1/gl/strncat.c0000644000175000017500000000210113723215640014334 0ustar00blpblp00000000000000/* Concatenate strings. Copyright (C) 1999, 2002, 2006, 2010-2020 Free Software Foundation, Inc. Written by Bruno Haible , 2002. 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 3 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, see . */ #include /* Specification. */ #include char * strncat (char *dest, const char *src, size_t n) { char *destptr = dest + strlen (dest); for (; n > 0 && (*destptr = *src) != '\0'; src++, destptr++, n--) ; if (n == 0) *destptr = '\0'; return dest; } pspp-1.4.1/perl-module/0000755000175000017500000000000013725012647014347 5ustar00blpblp00000000000000pspp-1.4.1/perl-module/COPYING0000644000175000017500000010437413320146056015404 0ustar00blpblp00000000000000 GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. 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 them 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. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. 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. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. "This License" refers to version 3 of the GNU General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey 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; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If 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 convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU 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. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. 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. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS 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. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs 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. 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 state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) 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 3 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, see . Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: Copyright (C) This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an "about box". You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . The GNU 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 Lesser General Public License instead of this License. But first, please read . pspp-1.4.1/perl-module/automake.mk0000644000175000017500000000627613571051220016506 0ustar00blpblp00000000000000# PSPP - a program for statistical analysis. # Copyright (C) 2017 Free Software Foundation, Inc. # # 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 3 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, see . # ## Process this file with automake to produce Makefile.in -*- makefile -*- # PSPP module_sources = \ perl-module/Changes \ perl-module/COPYING \ perl-module/Examples.pod \ perl-module/Makefile.PL \ perl-module/MANIFEST \ perl-module/ppport.h \ perl-module/PSPP.xs \ perl-module/README \ perl-module/typemap \ perl-module/lib/PSPP.pm \ perl-module/t/Pspp.t PERL_MAKEFLAGS = $(AM_MAKEFLAGS) LD_RUN_PATH=$(pkglibdir) perl-module/pspp-module-config: Makefile $(AM_V_GEN)(echo '%Locations = (';\ printf " SourceDir => '";\ (cd $(top_srcdir) && echo `pwd`\', ) ;\ printf " BuildDir => '";\ (cd $(top_builddir) && echo `pwd`\' );\ echo ');') > $(top_builddir)/perl-module/pspp-module-config perl-module/Makefile: perl-module/Makefile.PL perl-module/pspp-module-config $(module_sources) $(AM_V_GEN)cd perl-module && $(PERL) Makefile.PL PREFIX=$(prefix) \ OPTIMIZE="$(CFLAGS) $(CPPFLAGS)" \ LD="`$(PERL) -e 'use Config::Perl::V;print Config::Perl::V::myconfig()->{config}{ld};'` $(LDFLAGS)" perl-module/PSPP-Perl-$(VERSION_FOR_PERL).tar.gz: $(module_sources) perl-module/Makefile $(AM_V_at)rm -f $@ $(AM_V_GEN)cd perl-module && $(MAKE) $(PERL_MAKEFLAGS) tardist PHONY += module-make module-make: perl-module/Makefile $(AM_V_GEN)cd perl-module && $(MAKE) $(PERL_MAKEFLAGS) ALL_LOCAL += perl_module_tarball perl_module_tarball: $(module_sources) src/libpspp-core.la @if test x"$(top_builddir)" != x"$(top_srcdir)" ; then \ for f in $(module_sources); do \ destdir=`dirname $$f` ;\ mkdir -p $$destdir ;\ if test ! -e "$(top_builddir)/$$f" || \ test "$(top_srcdir)/$$f" -nt "$(top_builddir)/$$f" ; then \ if $(AM_V_P); then \ echo cp $(top_srcdir)/$$f $$destdir ; \ else \ echo " GEN $$destdir/$$f"; \ fi; \ cp $(top_srcdir)/$$f $$destdir ; \ chmod u+w $$destdir/`basename $$f`; \ fi ; \ done \ fi $(AM_V_GEN)$(MAKE) $(PERL_MAKEFLAGS) module-make perl-module/PSPP-Perl-$(VERSION_FOR_PERL).tar.gz CLEAN_LOCAL += perl_module_clean perl_module_clean: cd perl-module && $(MAKE) $(AM_MAKEFLAGS) clean || true if test x"$(top_builddir)" != x"$(top_srcdir)" ; then \ rm -f $(module_sources) ; \ fi rm -f perl-module/Makefile.old CLEANFILES += \ perl-module/PSPP-Perl-$(VERSION_FOR_PERL).tar.gz \ perl-module/pspp-module-config \ perl-module/const-c.inc \ perl-module/const-xs.inc EXTRA_DIST += $(module_sources) pspp-1.4.1/perl-module/README0000644000175000017500000000316713571051220015223 0ustar00blpblp00000000000000PSPP version 0.7 ================ This module provides an interface allowing perl programs to create pspp system files. INSTALLATION To install you must have first installed and built pspp 0.7.2 or later. The Perl module does not use the installed PSPP binaries, but it does require the libpspp-core-$VERSION.so library installed with PSPP (see below). To install this module type the following: perl Makefile.PL make make install make test For "make test" to succeed, Perl must be able to find libpspp-core-$VERSION.so. It can do so if "make install" has been run (as shown above), or if LD_LIBRARY_PATH points to it (e.g. in src/.libs). Running "make check" from the top-level build directory will automatically set LD_LIBRARY_PATH. DEPENDENCIES This module requires the POSIX module. The modules Test::More, Text::Diff, File::Temp and the pspp source are required during installation, but are not needed to run the module. COPYRIGHT AND LICENCE Copyright (C) 2007, 2009, 2010, 2019 by Free Software Foundation 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 3 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, see . pspp-1.4.1/perl-module/Examples.pod0000644000175000017500000001050413571051220016616 0ustar00blpblp00000000000000=pod =for comment PSPP - a program for statistical analysis. =for comment Copyright (C) 2019 Free Software Foundation, Inc. =for comment =for comment This program is free software: you can redistribute it and/or modify =for comment it under the terms of the GNU General Public License as published by =for comment the Free Software Foundation, either version 3 of the License, or =for comment (at your option) any later version. =for comment =for comment This program is distributed in the hope that it will be useful, =for comment but WITHOUT ANY WARRANTY; without even the implied warranty of =for comment MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the =for comment GNU General Public License for more details. =for comment =for comment You should have received a copy of the GNU General Public License =for comment along with this program. If not, see . =head1 PSPP::Examples This page shows some simple examples of using the PSPP module. See L for details on each of the subroutines. =head2 A Simple example This example creates a system file called F, containing one variable called "id". It contains no data. use PSPP; my $dict = PSPP::Dict->new (); my $var = PSPP::Var->new ($dict, "id"); my $sysfile = PSPP::Sysfile->new ("foo.sav", $dict); $sysfile->close(); =head2 A slightly more complex example In this example there are three variables, called "id", "name" and "dob". Their formats are F2.0, A80 and DATETIME17 respectively. use PSPP; my $dict = PSPP::Dict->new (); PSPP::Var->new ($dict, "id", (fmt=>PSPP::Fmt::F, width=>2, decimals=>0) ); PSPP::Var->new ($dict, "name", (fmt=>PSPP::Fmt::A, width=>80) ); PSPP::Var->new ($dict, "dob", (fmt=>PSPP::Fmt::DATETIME) ); my $sysfile = PSPP::Sysfile->new ("foo.sav", $dict); $sysfile->close(); =head2 Changing the properties of variables After a variable has been created, parameters may be set for it. use PSPP; my $dict = PSPP::Dict->new (); my $var1 = PSPP::Var->new ($dict, "id"); $var1->set_label ("A unique identifier"); $var1->add_value_label (0, "Zero"); $var1->add_value_label (1, "One"); =head2 Appending data to the file When a file is created, it contains no data. Data is added by appending cases to the file. This example creates a file with 3 cases. use PSPP; my $dict = PSPP::Dict->new (); PSPP::Var->new ($dict, "id", (fmt=>PSPP::Fmt::F, width=>2, decimals=>0) ); PSPP::Var->new ($dict, "name", (fmt=>PSPP::Fmt::A, width=>8) ); my $sysfile = PSPP::Sysfile->new ("foo.sav", $dict); $sysfile->append_case ( [1, "Alf"] ); $sysfile->append_case ( [2, "Bert"] ); $sysfile->append_case ( [3, "Charlie"] ); $sysfile->close(); =head2 Variables with differing input and output formats By default, a variable's output format corresponds to the input format. However, the output format may be changed after the variable has been created. This example shows how to create a DATETIME variable using the current time as its value. Since pspp uses a different epoch to perl, the constant PSPP::PERL_EPOCH needs to be added to the value returned from time(), in order that it be correctly represented by pspp. use PSPP; my $dict = PSPP::Dict->new (); my $var1 = PSPP::Var->new ($dict, "entrytime", (fmt=>PSPP::Fmt::F) ); $var1->set_output_format ( (fmt=>PSPP::Fmt::DATETIME, width=>20) ); my $sysfile = PSPP::Sysfile->new ("foo.sav", $dict); my $now = time (); $sysfile->append_case ( [ $now + PSPP::PERL_EPOCH] ) || die "Cant write case"; $sysfile->close(); =head2 Reading data Data can be read from a system file or other source: use PSPP; my $sf = PSPP::Reader->open ("foo.sav"); my $dict = $sf->get_dict (); Once opened, the dictionary can be used like any other. for ($v = 0 ; $v < $dict->get_var_cnt() ; $v++) { my $var = $dict->get_var ($v); # Print the variables my $name = $var->get_name (); my $label = $var->get_label (); print "Var: $name, Label: $label\n"; # Retrieve and print the value labels my $vl = $var->get_value_labels (); print "$_: $vl->{$_}\n" for keys %$vl; } Reading of data must be done sequentially using the C method. while (my $c = $sf->get_next_case () ) { my $v; for ($v = 0; $v < $dict->get_var_cnt(); $v++) { print "val$v: @$c[$v] "; } print "\n"; } =cut pspp-1.4.1/perl-module/typemap0000644000175000017500000000423113546443556015761 0ustar00blpblp00000000000000## PSPP - a program for statistical analysis. ## Copyright (C) 2019 Free Software Foundation, Inc. ## ## 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 3 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, see . TYPEMAP struct pspp_dict * T_PTRREF struct variable * T_PTRREF struct syswriter_info * T_PTRREF struct sysreader_info * T_PTRREF input_format INPUT_FMT_SPEC output_format OUTPUT_FMT_SPEC INPUT OUTPUT_FMT_SPEC { HV *hv = (HV *) SvRV ($arg); SV** the_format = hv_fetch (hv, \"fmt\", 3, 0); SV** decimals = hv_fetch (hv, \"decimals\", 8, 0); SV** width = hv_fetch (hv, \"width\", 5, 0); $var.type = the_format ? SvIV (*the_format) : FMT_F; $var.w = width ? SvIV (*width) : 8; $var.d = decimals ? SvIV (*decimals) : fmt_takes_decimals ($var.type) ? MIN (2, fmt_max_output_decimals ($var.type, $var.w)) : 0; if ( ! fmt_check_output (&$var)) { char buf[FMT_STRING_LEN_MAX + 1]; fmt_to_string (&$var, buf); croak (\"%s is an invalid output format\", buf); } } INPUT_FMT_SPEC { HV *hv = (HV *) SvRV ($arg); SV** the_format = hv_fetch (hv, \"fmt\", 3, 0); SV** decimals = hv_fetch (hv, \"decimals\", 8, 0); SV** width = hv_fetch (hv, \"width\", 5, 0); $var.type = the_format ? SvIV (*the_format) : FMT_F; $var.w = width ? SvIV (*width) : 8; $var.d = decimals ? SvIV (*decimals) : fmt_takes_decimals ($var.type) ? MIN (2, fmt_max_input_decimals ($var.type, $var.w)) : 0; if ( ! fmt_check_input (&$var)) { char buf[FMT_STRING_LEN_MAX + 1]; fmt_to_string (&$var, buf); croak (\"%s is an invalid input format\", buf); } } pspp-1.4.1/perl-module/lib/0000755000175000017500000000000013725012647015115 5ustar00blpblp00000000000000pspp-1.4.1/perl-module/lib/PSPP.pm.in0000644000175000017500000002744213571051220016640 0ustar00blpblp00000000000000## PSPP - a program for statistical analysis. ## Copyright (C) 2019 Free Software Foundation, Inc. ## ## 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 3 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, see . use 5.008008; use strict; use warnings; =head1 NAME PSPP-Perl - Perl extension to PSPP =head1 SYNOPSIS use PSPP; =head1 DESCRIPTION PSPP-Perl provides an interface to the libraries used by pspp to read and write system files. =head1 EXPORT None by default. =cut BEGIN { $PSPP::VERSION='@VERSION_FOR_PERL@'; require XSLoader; XSLoader::load('PSPP', $PSPP::VERSION); } PSPP::onBoot($PSPP::VERSION); =pod =head1 PROGRAMMER'S INTERFACE The subroutines in this package return zero or unref on error. When errors occur, a string describing the error is written to C<$PSPP::errstr>. =cut package PSPP; use POSIX ; use constant { SYSMIS => -(POSIX::DBL_MAX), PERL_EPOCH => 12219379200 # Number of seconds between # 14th October 1582 # and # 1st January 1970 }; package PSPP::Dict; =pod =head2 PSPP::Dict::new Creates a new dictionary. This returned dictionary will be empty. Returns undef on failure. =head3 set_documents ($string) Sets the documents (comments) to C. =head3 add_document ($string) Appends C to the documents. =head3 clear_documents () Removes all documents. =head3 set_weight ($var) Sets the weighting variable to C. =cut sub new { my $class = shift; my $self = pxs_dict_new (); bless ($self, $class); return $self; } =pod =head3 get_var_cnt () Returns the number of variables in the dictionary. =head3 get_var ($idx) Returns the Cth variable from the dictionary. Returns undef if C is greater than or equal to the number of variables in the dictionary. =cut sub get_var { my $dict = shift; my $idx = shift; my $var = pxs_get_variable ($dict, $idx); if ( ref $var ) { bless ($var, "PSPP::Var"); } return $var; } =pod =head3 get_var_by_name ($name) Returns the variable from the dictionary whose name is C. If there is no such variable, a null reference will be returned. =cut sub get_var_by_name { my $dict = shift; my $name = shift; my $var = pxs_get_var_by_name ($dict, $name); if ( ref $var ) { bless ($var, "PSPP::Var"); } return $var; } package PSPP::Fmt; =pod =head2 PSPP::Fmt Contains constants used to denote variable format types. The identifiers are the same as those used in pspp to denote formats. For example C defines floating point format, and C denotes string format. =cut # These must correspond to the values in src/data/format.h use constant { F => 0, COMMA => 1, DOT => 2, DOLLAR => 3, PCT => 4, E => 5, CCA => 6, CCB => 7, CCC => 8, CCD => 9, CCE => 10, N => 11, Z => 12, P => 13, PK => 14, IB => 15, PIB => 16, PIBHEX => 17, RB => 18, RBHEX => 19, DATE => 20, ADATE => 21, EDATE => 22, JDATE => 23, SDATE => 24, QYR => 25, MOYR => 26, WKYR => 27, DATETIME => 28, YMDHMS => 29, MTIME => 30, TIME => 31, DTIME => 32, WKDAY => 33, MONTH => 34, A => 35, AHEX => 36 }; =head2 PSPP::Var =cut package PSPP::Var; =head3 new ($dict, $name, %input_fmt) Creates and returns a new variable in the dictionary C. The new variable will have the name C. C must be a valid UTF8 string. The input format is set by the C parameter (See L). By default, the write and print formats are the same as the input format. The write and print formats may be changed (See L), L). The input format may not be changed after the variable has been created. If the variable cannot be created, undef is returned. =cut sub new { my $class = shift; my $dict = shift; my $name = shift; my %format = @_; my $self = pxs_dict_create_var ($dict, $name, \%format); if ( ref $self ) { bless ($self, $class); } return $self; } =pod =head3 set_label ($label) Sets the variable label to C